{"version":3,"file":"js/672-fff3303ba509e88d836a.js","mappings":"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,EAAI,GAAI,KAAKG,OAAOH,EAAI,IAAK,GAAGG,OAAOH,EAAI,GAAI,KAAKG,OAAOH,EAAI,IAAK,GAAGG,OAAOH,EAAI,GAAI,KAAKG,OAAOH,EAAI,IAAK,GAAGG,OAAOH,EAAI,GAAI,KAAKG,OAAOH,EAAI,IAAK,GAAGG,OAAOH,EAAI,GAAI,KAAKG,OAAOH,EAAI,IAAK,GAAGG,OAAOH,EAAI,GAAI,KAAKG,OAAOH,EAAI,IAAK,GAAGG,OAAOH,EAAI,GAAI,KAAKG,OAAOH,EAAI,IAAK,GAAGG,OAAOH,EAAI,GAAI,KAAKG,OAAOH,EAAI,IAAK,GAAGG,OAAOH,EAAI,GAAI,KAAKG,OAAOH,EAAI,IAAK,GAAGG,OAAOH,EAAI,GAAI,KAAKG,OAAOH,EAAI,IAAK,GAAGG,OAAOH,EAAI,GAAI,KAAKG,OAAOH,EAAI,GAAI,KAAKG,OAAOH,EAAI,IAAK,GAAGG,OAAOH,EAAI,GAAI,KAAKG,OAAOH,EAAI,GAAI,KAAKG,OAAOH,EAAI,IAAK,GAAGG,OAAOH,EAAI,GAAI,KAAKG,OAAOH,EAAI,GAAI,KAAKG,OAAOH,EAAI,IAAK,GAAGG,OAAOH,EAAI,GAAI,KAAKG,OAAOH,EAAI,GAAI,KAAKG,OAAOH,EAAI,IAAK,GAAGG,OAAOH,EAAI,GAAI,KAAKG,OAAOH,EAAI,GAAI,KAAKG,OAAOH,EAAI,IAAK,GAAGG,OAAOH,EAAI,GAAI,KAAKG,OAAOH,EAAI,GAAI,KAAKG,OAAOH,EAAI,IAAK,GAAGG,OAAOH,EAAI,GAAI,KAAKG,OAAOH,EAAI,GAAI,KAAKG,OAAOH,EAAI,IAAK,GAAGG,OAAOH,EAAI,GAAI,KAAKG,OAAOH,EAAI,GAAI,KAAKG,OAAOH,EAAI,IAAK,GAAGG,OAAOH,EAAI,GAAI,KAAKG,OAAOH,EAAI,GAAI,KAAKG,OAAOH,EAAI,IAAK,GAAGG,OAAOH,EAAI,GAAI,KAAKG,OAAOH,EAAI,GAAI,KAAKG,OAAOH,EAAI,IAAK,GAAGG,OAAOH,EAAI,GAAI,KAAKG,OAAOH,EAAI,GAAI,KAAKG,OAAOH,EAAI,IAAK,GAAGG,OAAOH,EAAI,GAAI,KAAKG,OAAOH,EAAI,GAAI,KAAKG,OAAOH,EAAI,IAAK,GAAGG,OAAOH,EAAI,GAAI,KAAKG,OAAOH,EAAI,GAAI,KAAKG,OAAOH,EAAI,IAAK,GAAGG,OAAOH,EAAI,GAAI,KAAKG,OAAOH,EAAI,GAAI,KAAKG,OAAOH,EAAI,IAAK,GAAGG,OAAOH,EAAI,GAAI,KAAKG,OAAOH,EAAI,GAAI,KAAKG,OAAOH,EAAI,IAAK,GAAGG,OAAOH,EAAI,GAAI,KAAKG,OAAOH,EAAI,GAAI,KAAKG,OAAOH,EAAI,IAAK,GAAGG,OAAOH,EAAI,GAAI,KAAKG,OAAOH,EAAI,GAAI,KAAKG,OAAOH,EAAI,IAAK,GAAGG,OAAOH,EAAI,GAAI,KAAKG,OAAOH,EAAI,GAAI,KAAKG,OAAOH,EAAI,IAAK,GAAGG,OAAOH,EAAI,GAAI,KAAKG,OAAOH,EAAI,GAAI,KAAKG,OAAOH,EAAI,IAAK,GAAGG,OAAOH,EAAI,GAAI,KAAKG,OAAOH,EAAI,GAAI,KAAKG,OAAOH,EAAI,IAAK,GAAGG,OAAOH,EAAI,GAAI,KAAKG,OAAOH,EAAI,GAAI,KAAKG,OAAOH,EAAI,IAAK,GAAGG,OAAOH,EAAI,GAAI,KAAKG,OAAOH,EAAI,GAAI,KAAKG,OAAOH,EAAI,IAAK,GAAGG,OAAOH,EAAI,GAAI,KAAKG,OAAOH,EAAI,GAAI,KAAKG,OAAOH,EAAI,IAAK,GAAGG,OAAOH,EAAI,GAAI,KAAKG,OAAOH,EAAI,GAAI,KAAKG,OAAOH,EAAI,IAAK,GAAGG,OAAOH,EAAI,GAAI,KAAKG,OAAOH,EAAI,GAAI,KAAKG,OAAOH,EAAI,GAAI,KAAKG,OAAOH,EAAI,IAAK,GAAGG,OAAOH,EAAI,GAAI,KAAKG,OAAOH,EAAI,GAAI,KAAKG,OAAOH,EAAI,GAAI,KAAKG,OAAOH,EAAI,IAAK,GAAGG,OAAOH,EAAI,GAAI,KAAKG,OAAOH,EAAI,GAAI,KAAKG,OAAOH,EAAI,GAAI,KAAKG,OAAOH,EAAI,IAAK,GAAGG,OAAOH,EAAI,GAAI,KAAKG,OAAOH,EAAI,GAAI,KAAKG,OAAOH,EAAI,GAAI,KAAKG,OAAOH,EAAI,IAAK,GAAGG,OAAOH,EAAI,GAAI,KAAKG,OAAOH,EAAI,GAAI,KAAKG,OAAOH,EAAI,GAAI,KAAKG,OAAOH,EAAI,IAAK,GAAGG,OAAOH,EAAI,GAAI,KAAKG,OAAOH,EAAI,GAAI,KAAKG,OAAOH,EAAI,GAAI,KAAKG,OAAOH,EAAI,IAAK,GAAGG,OAAOH,EAAI,GAAI,KAAKG,OAAOH,EAAI,GAAI,KAAKG,OAAOH,EAAI,GAAI,KAAKG,OAAOH,EAAI,IAAK,GAAGG,OAAOH,EAAI,GAAI,KAAKG,OAAOH,EAAI,GAAI,KAAKG,OAAOH,EAAI,GAAI,KAAKG,OAAOH,EAAI,IAAK,GAAGG,OAAOH,EAAI,GAAI,KAAKG,OAAOH,EAAI,GAAI,KAAKG,OAAOH,EAAI,GAAI,KAAKG,OAAOH,EAAI,IAAK,GAAGG,OAAOH,EAAI,GAAI,KAAKG,OAAOH,EAAI,GAAI,KAAKG,OAAOH,EAAI,GAAI,KAAKG,OAAOH,EAAI,IAAK,GAAGG,OAAOH,EAAI,GAAI,KAAKG,OAAOH,EAAI,GAAI,KAAKG,OAAOH,EAAI,GAAI,KAAKG,OAAOH,EAAI,IAAK,GAAGG,OAAOH,EAAI,GAAI,KAAKG,OAAOH,EAAI,GAAI,KAAKG,OAAOH,EAAI,GAAI,KAAKG,OAAOH,EAAI,IAAK,GAAGG,OAAOH,EAAI,GAAI,KAAKG,OAAOH,EAAI,GAAI,KAAKG,OAAOH,EAAI,GAAI,KAAKG,OAAOH,EAAI,IAAK,GAAGG,OAAOH,EAAI,GAAI,KAAKG,OAAOH,EAAI,GAAI,KAAKG,OAAOH,EAAI,GAAI,KAAKG,OAAOH,EAAI,IAAK,GAAGG,OAAOH,EAAI,GAAI,KAAKG,OAAOH,EAAI,GAAI,KAAKG,OAAOH,EAAI,GAAI,KAAKG,OAAOH,EAAI,IAAK,GAAGG,OAAOH,EAAI,GAAI,KAAKG,OAAOH,EAAI,GAAI,KAAKG,OAAOH,EAAI,GAAI,KAAKG,OAAOH,EAAI,IAAK,GAAGG,OAAOH,EAAI,GAAI,KAAKG,OAAOH,EAAI,GAAI,KAAKG,OAAOH,EAAI,GAAI,KAAKG,OAAOH,EAAI,IAAK,GAAGG,OAAOH,EAAI,GAAI,KAAKG,OAAOH,EAAI,GAAI,KAAKG,OAAOH,EAAI,GAAI,KAAKG,OAAOH,EAAI,IAAK,GAA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AAI,IAAK,GAAGG,OAAOH,EAAI,GAAI,KAAKG,OAAOH,EAAI,IAAK,GAAGG,OAAOH,EAAI,GAAI,KAAKG,OAAOH,EAAI,IAAK,GAAGG,OAAOH,EAAI,GAAI,KAAKG,OAAOH,EAAI,GAAI,KAAKG,OAAOH,EAAI,IAAK,GAAGG,OAAOH,EAAI,GAAI,KAAKG,OAAOH,EAAI,GAAI,KAAKG,OAAOH,EAAI,IAAK,GAAGG,OAAOH,EAAI,GAAI,KAAKG,OAAOH,EAAI,GAAI,KAAKG,OAAOH,EAAI,IAAK,GAAGG,OAAOH,EAAI,GAAI,KAAKG,OAAOH,EAAI,GAAI,KAAKG,OAAOH,EAAI,IAAK,GAAGG,OAAOH,EAAI,GAAI,KAAKG,OAAOH,EAAI,GAAI,KAAKG,OAAOH,EAAI,IAAK,GAAGG,OAAOH,EAAI,GAAI,KAAKG,OAAOH,EAAI,GAAI,KAAKG,OAAOH,EAAI,IAAK,GAAGG,OAAOH,EAAI,GAAI,KAAKG,OAAOH,EAAI,GAAI,KAAKG,OAAOH,EAAI,IAAK,GAAGG,OAAOH,EAAI,GAAI,KAAKG,OAAOH,EAAI,GAAI,KAAKG,OAAOH,EAAI,IAAK,GAAGG,OAAOH,EAAI,GAAI,KAAKG,OAAOH,EAAI,GAAI,KAAKG,OAAOH,EAAI,IAAK,GAAGG,OAAOH,EAAI,GAAI,KAAKG,OAAOH,EAAI,GAAI,KAAKG,OAAOH,EAAI,IAAK,GAAGG,OAAOH,EAAI,GAAI,KAAKG,OAAOH,EAAI,GAAI,KAAKG,OAAOH,EAAI,IAAK,GAAGG,OAAOH,EAAI,GAAI,KAAKG,OAAOH,EAAI,GAAI,KAAKG,OAAOH,EAAI,IAAK,GAAGG,OAAOH,EAAI,GAAI,KAAKG,OAAOH,EAAI,GAAI,KAAKG,OAAOH,EAAI,IAAK,GAAGG,OAAOH,EAAI,GAAI,KAAKG,OAAOH,EAAI,GAAI,KAAKG,OAAOH,EAAI,IAAK,GAAGG,OAAOH,EAAI,GAAI,KAAKG,OAAOH,EAAI,GAAI,KAAKG,OAAOH,EAAI,IAAK,GAAGG,OAAOH,EAAI,GAAI,KAAKG,OAAOH,EAAI,GAAI,KAAKG,OAAOH,EAAI,IAAK,GAAGG,OAAOH,EAAI,GAAI,KAAKG,OAAOH,EAAI,GAAI,KAAKG,OAAOH,EAAI,IAAK,GAAGG,OAAOH,EAAI,GAAI,KAAKG,OAAOH,EAAI,GAAI,KAAKG,OAAOH,EAAI,IAAK,GAAGG,OAAOH,EAAI,GAAI,KAAKG,OAAOH,EAAI,GAAI,KAAKG,OAAOH,EAAI,IAAK,GAAGG,OAAOH,EAAI,GAAI,KAAKG,OAAOH,EAAI,GAAI,KAAKG,OAAOH,EAAI,IAAK,GAAGG,OAAOH,EAAI,GAAI,KAAKG,OAAOH,EAAI,GAAI,KAAKG,OAAOH,EAAI,IAAK,GAAGG,OAAOH,EAAI,GAAI,KAAKG,OAAOH,EAAI,GAAI,KAAKG,OAAOH,EAAI,IAAK,GAAGG,OAAOH,EAAI,GAAI,KAAKG,OAAOH,EAAI,GAAI,KAAKG,OAAOH,EAAI,IAAK,GAAGG,OAAOH,EAAI,GAAI,KAAKG,OAAOH,EAAI,GAAI,KAAKG,OAAOH,EAAI,IAAK,GAAGG,OAAOH,EAAI,GAAI,KAAKG,OAAOH,EAAI,GAAI,KAAKG,OAAOH,EAAI,GAAI,KAAKG,OAAOH,EAAI,IAAK,GAAGG,OAAOH,EAAI,GAAI,KAAKG,OAAOH,EAAI,GAAI,KAAKG,OAAOH,EAAI,GAAI,KAAKG,OAAOH,EAAI,IAAK,GAAGG,OAAOH,EAAI,GAAI,KAAKG,OAAOH,EAAI,GAAI,KAAKG,OAAOH,EAAI,GAAI,KAAKG,OAAOH,EAAI,IAAK,GAAGG,OAAOH,EAAI,GAAI,KAAKG,OAAOH,EAAI,GAAI,KAAKG,OAAOH,EAAI,GAAI,KAAKG,OAAOH,EAAI,IAAK,GAAGG,OAAOH,EAAI,GAAI,KAAKG,OAAOH,EAAI,GAAI,KAAKG,OAAOH,EAAI,GAAI,KAAKG,OAAOH,EAAI,IAAK,GAAGG,OAAOH,EAAI,GAAI,KAAKG,OAAOH,EAAI,GAAI,KAAKG,OAAOH,EAAI,GAAI,KAAKG,OAAOH,EAAI,IAAK,GAAGG,OAAOH,EAAI,GAAI,KAAKG,OAAOH,EAAI,GAAI,KAAKG,OAAOH,EAAI,GAAI,KAAKG,OAAOH,EAAI,IAAK,GAAGG,OAAOH,EAAI,GAAI,KAAKG,OAAOH,EAAI,GAAI,KAAKG,OAAOH,EAAI,GAAI,KAAKG,OAAOH,EAAI,IAAK,GAAGG,OAAOH,EAAI,GAAI,KAAKG,OAAOH,EAAI,GAAI,KAAKG,OAAOH,EAAI,GAAI,KAAKG,OAAOH,EAAI,IAAK,GAAGG,OAAOH,EAAI,GAAI,KAAKG,OAAOH,EAAI,GAAI,KAAKG,OAAOH,EAAI,GAAI,KAAKG,OAAOH,EAAI,IAAK,GAAGG,OAAOH,EAAI,GAAI,KAAKG,OAAOH,EAAI,GAAI,KAAKG,OAAOH,EAAI,GAAI,KAAKG,OAAOH,EAAI,IAAK,GAAGG,OAAOH,EAAI,GAAI,KAAKG,OAAOH,EAAI,GAAI,KAAKG,OAAOH,EAAI,GAAI,KAAKG,OAAOH,EAAI,IAAK,GAAGG,OAAOH,EAAI,GAAI,KAAKG,OAAOH,EAAI,GAAI,KAAKG,OAAOH,EAAI,GAAI,KAAKG,OAAOH,EAAI,IAAK,GAAGG,OAAOH,EAAI,GAAI,KAAKG,OAAOH,EAAI,GAAI,KAAKG,OAAOH,EAAI,GAAI,KAAKG,OAAOH,EAAI,IAAK,GAAGG,OAAOH,EAAI,GAAI,KAAKG,OAAOH,EAAI,GAAI,KAAKG,OAAOH,EAAI,GAAI,KAAKG,OAAOH,EAAI,IAAK,GAAGG,OAAOH,EAAI,GAAI,KAAKG,OAAOH,EAAI,GAAI,KAAKG,OAAOH,EAAI,GAAI,KAAKG,OAAOH,EAAI,IAAK,GAAGG,OAAOH,EAAI,GAAI,KAAKG,OAAOH,EAAI,GAAI,KAAKG,OAAOH,EAAI,GAAI,KAAKG,OAAOH,EAAI,IAAK,GAAGG,OAAOH,EAAI,GAAI,KAAKG,OAAOH,EAAI,GAAI,KAAKG,OAAOH,EAAI,GAAI,KAAKG,OAAOH,EAAI,IAAK,GAAGG,OAAOH,EAAI,GAAI,KAAKG,OAAOH,EAAI,GAAI,KAAKG,OAAOH,EAAI,GAAI,KAAKG,OAAOH,EAAI,IAAK,GAAGG,OAAOH,EAAI,GAAI,KAAKG,OAAOH,EAAI,GAAI,KAAKG,OAAOH,EAAI,GAAI,KAAKG,OAAOH,EAAI,IAAK,GAAGG,OAAOH,EAAI,GAAI,KAAKG,OAAOH,EAAI,GAAI,KAAKG,OAAOH,EAAI,GAAI,KAAKG,OAAOH,EAAI,IAAK,GAAGG,OAAOH,EAAI,GAAI,KAAKG,OAAOH,EAAI,GAAI,KAAKG,OAAOH,EAAI,GAAI,KAAKG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AAG+lR,EAAY9lR,EAAGlP,GAAKynI,YAClDwtJ,EAAgB,GAAI,CAAE9iS,OAAQ,CAAE6N,EAAGszH,GAAOmU,UAASn+F,MAAO,CAAEx7B,KAAM,EAAGmtH,UAAU,KACrFxhF,EAAI3mE,KAAKmiT,GACT/4B,EAAcppR,KAAKosL,GACnBg9F,EAAcppR,KAAKqyM,GACnB+2E,EAAcppR,KAAKkiT,GACnB94B,EAAcppR,KAAKwgJ,GACnB4oI,EAAcppR,KAAKmiT,EACvB,CACA,MAAMp8S,EAASq+G,GAAK,CAAE/kG,OAAQsnD,EAAKguF,UAASn+F,MAAO,CAAEx7B,KAAM,KAE3D,OADAouP,EAAcxoR,SAAQmzD,GAAK4gG,EAAQytH,8BAA8BruN,KAC1DhuD,CACX,GCiIMq8S,GAAgB,CAClBn5B,GACAM,GACAC,GACAC,GACAvC,GACAwC,GACAO,GACAG,GACAE,GACAG,GACAE,GACAC,GACAC,GACAG,GACAC,GACAoD,GACAC,GACA,GACA,GACAtF,GACA6G,GACAsB,GACAU,GACAC,GACA1M,GACA8M,GACAE,GACAzN,GACA0N,GACAmB,GACAuB,GACAC,GACAQ,GACAU,GACAQ,GACAkB,GACAO,GACAC,GACAC,GACA8B,GACAO,GACAC,GACAC,GACAY,GACAC,GACAE,GACAC,GACAC,GACAU,GACAG,GACAQ,GACAta,GACA,GACA2a,GACAM,GACAE,GACAE,GACAE,GACAmE,GACAI,GACAC,GACAO,GACAE,GACAC,GACAI,GACAO,GACAQ,GACAO,GACAE,GACApiB,GACAqiB,GACApS,GACAqS,GACAC,GACAC,GACAtiB,GACAwiB,GACAE,GACAE,GACAE,GACAC,GACAE,GACAC,GACAE,GACAC,GACAO,GACAQ,GACAE,GACAC,GACAC,GACA,GACA,GACAG,GACAM,GACAG,GACAE,GACAC,GACAK,GACAQ,GACApM,GACA+M,GACAC,GACAC,GACAC,GACAM,GACAC,GACAI,GACAE,GACAC,GACAG,GACAhnB,GACAmnB,GACA+B,GACAsE,GACAG,GACAhtB,GACAwZ,GACAyT,GACA3tB,GACAC,G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oS,KAAKmwF,GAEXA,EAAOljB,MAAM,KAAOy/G,EACpB,OAAOv8F,EAEX,MAAM23P,EAAY,GAAM,CACpBnzL,UACAn+F,MAAO,CAAE5lC,MAAO,EAAGtb,KAAMo3K,EAAax+I,KAAM,EAAGooG,MAAO,aAEpDyxM,EAAW,GAAK,CAClB1oU,OAAQ,CAAE6N,EAAG46T,GACbnzL,UACAn+F,MAAO,CAAEmzF,KAAM,CAACu9B,EAAS2vF,MAE7BoxB,EAAUjoS,KAAK8nV,GACf7/C,EAAUjoS,KAAK+nV,GAEf,OADeF,EAAa13P,EAAQu3P,EAAWK,EAAUzxM,EAAOo2C,EACnD,EAGXlF,EAAW,GAAQ,CAAEnoK,OAAQ,CAAE6N,EADjB26T,EAAa/R,EAAK,qBAAsBvzH,EAAY4vB,EAAazlD,IAC9B/3B,UAASn+F,MAAO,CAAEyW,MAAOgvG,KAChF,IAAIl2K,EAASyhL,EACb,GAAmB,MAAfqzC,EAAqB,CACrBotE,EAAUjoS,KAAKwnL,GACf,MAAM0D,EAAO,6BAAoC2vC,GACjD90N,EAAS,GAAU,CAAEsZ,OAAQ,CAAE6N,EAAGnnB,GAAU4uJ,UAASn+F,MAAO,CAAE00H,SAClE,CAEA,OADA+8G,EAAUrnS,SAAQmzD,GAAK4gG,EAAQytH,8BAA8BruN,KACtDhuD,CACX,GC2GM,GAAgB,CAClB,GACA,GACA,GACA,GACA,GACA,GACA,GACA,GACA,GACA,GACA,GACA,GACA,GACA,GACA,GACA,GACA,GACA,GACA,GACA,GACA,GACA,GACA,GACA,GACA,GACA,GACA,GACA,GACA,GACA,GACA,GACA,GACA,GACA,GACA,GACAo3U,GACA,GACA,GACA,GACA,GACA,GACA,GACA,GACA,GACA,GACA,GACA,GACA,GACA,GACA,GACA,GACA,GACA,GACA,GACA,GACA,GACA,GACA,GACA,GACA,GACA,GACAyC,GACA,GACA,GACA,GACA,GACA,GACA,GACA,GACA,GACA,GACA,GACA,GACA,GACA,GACA,GACA,GACA,GACA,GACA,GACA,GACA,GACA,GACA,GACA,GACA,GACA,GACA,GACA,GACA,GACA,GACA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C,EAAe14e,EAEzD,EACAq3e,EAASrogB,UAAU4pZ,aAAe,WAAc,EAChDw+G,GAAc,CACVrwK,GAAU,gBACXswK,EAASrogB,UAAW,mBAAe,GACtCoogB,GAAc,CACVrwK,GAAU,aACXswK,EAASrogB,UAAW,gBAAY,GACnCoogB,GAAc,CACVrwK,GAAU,0BACXswK,EAASrogB,UAAW,6BAAyB,GAChDoogB,GAAc,CACVrwK,GAAU,gBACXswK,EAASrogB,UAAW,mBAAe,GACtCoogB,GAAc,CACVrwK,GAAU,kBACXswK,EAASrogB,UAAW,qBAAiB,GACxCoogB,GAAc,CACVrwK,GAAU,aACXswK,EAASrogB,UAAW,gBAAY,GACnCoogB,GAAc,CACVrwK,GAAU,WACXswK,EAASrogB,UAAW,cAAU,GACjCoogB,GAAc,CACVrwK,GAAU,uBACXswK,EAASrogB,UAAW,0BAAsB,GAC7CoogB,GAAc,CACVrwK,GAAU,iBACXswK,EAASrogB,UAAW,oBAAgB,GACvCoogB,GAAc,CACVrwK,GAAU,qBACXswK,EAASrogB,UAAW,wBAAoB,GAC3CoogB,GAAc,CACVrwK,GAAU,kBACXswK,EAASrogB,UAAW,qBAAiB,GACxCoogB,GAAc,CACVrwK,GAAU,cACXswK,EAASrogB,UAAW,iBAAa,GACpCoogB,GAAc,CACVrwK,GAAU,YACXswK,EAASrogB,UAAW,eAAW,GAClCoogB,GAAc,CACVlwK,GAAS,qBACVmwK,EAASrogB,UAAW,wBAAoB,GAC3CoogB,GAAc,CACVjmH,GAAY,cACbkmH,EAASrogB,UAAW,iBAAa,GACpCoogB,GAAc,CACVjmH,GAAY,YACbkmH,EAASrogB,UAAW,mBAAe,GACtCoogB,GAAc,CACVjmH,GAAY,oBACbkmH,EAASrogB,UAAW,wBAAoB,GACpCqogB,CACX,CAxR6B,CAwR3B7/G,IAQEmhH,GAAqD,WACrD,IAAI78J,EAAgB,SAAU7jS,EAAG/rC,GAI7B,OAHA4vU,EAAgBvlW,OAAOsa,gBAClB,CAAEE,UAAW,cAAgBze,OAAS,SAAU2lE,EAAG/rC,GAAK+rC,EAAElnD,UAAYmb,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AK,GAAI,EAAG,IAAK,IAAK,IAAK,IAAK,EAAG,IAAK,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,IAAK,EAAG,GAAI,EAAG,GAAI,EAAG,GAAI,EAAG,EAAG,IAAK,IAAK,IAAK,EAAG,EAAG,EAAG,IAAK,IAAK,IAAK,GAAI,IAAK,EAAG,EAAG,EAAG,IAAK,IAAK,IAAK,GAAI,IAAK,EAAG,EAAG,EAAG,IAAK,IAAK,IAAK,GAAI,IAAK,EAAG,EAAG,EAAG,IAAK,IAAK,IAAK,GAAI,IAAK,EAAG,EAAG,EAAG,IAAK,IAAK,IAAK,GAAI,IAAK,IAAK,IAAK,IAAK,EAAG,EAAG,GAAI,IAAK,EAAG,EAAG,EAAG,EAAG,GAAI,EAAG,GAAI,GAAI,EAAG,EAAG,IAAK,GAAI,EAAG,IAAK,GAAI,EAAG,IAAK,GAAI,GAAI,IAAK,IAAK,GAAI,EAAG,IAAK,GAAI,EAAG,IAAK,GAAI,GAAI,IAAK,IAAK,IAAK,GAAI,EAAG,GAAI,GAAI,IAAK,IAAK,GAAI,EAAG,GAAI,EAAG,IAAK,GAAI,GAAI,EAAG,EAAG,IAAK,GAAI,EAAG,IAAK,GAAI,EAAG,IAAK,GAAI,GAAI,IAAK,IAAK,GAAI,EAAG,IAAK,GAAI,EAAG,IAAK,GAAI,GAAI,IAAK,IAAK,IAAK,GAAI,EAAG,GAAI,GAAI,IAAK,IAAK,GAAI,EAAG,GAAI,EAAG,IAAK,GAAI,GAAI,EAAG,EAAG,IAAK,GAAI,EAAG,IAAK,GAAI,EAAG,IAAK,GAAI,GAAI,IAAK,IAAK,GAAI,EAAG,IAAK,GAAI,EAAG,IAAK,GAAI,GAAI,IAAK,IAAK,IAAK,GAAI,EAAG,GAAI,GAAI,IAAK,IAAK,GAAI,EAAG,GAAI,EAAG,IAAK,GAAI,GAAI,EAAG,EAAG,IAAK,GAAI,EAAG,IAAK,GAAI,EAAG,IAAK,GAAI,GAAI,IAAK,IAAK,GAAI,EAAG,IAAK,GAAI,EAAG,IAAK,GAAI,GAAI,IAAK,IAAK,IAAK,GAAI,EAAG,GAAI,GAAI,IAAK,IAAK,GAAI,EAAG,GAAI,EAAG,IAAK,GAAI,GAAI,EAAG,EAAG,IAAK,GAAI,EAAG,IAAK,GAAI,EAAG,IAAK,GAAI,GAAI,IAAK,IAAK,GAAI,EAAG,IAAK,GAAI,EAAG,IAAK,GAAI,GAAI,IAAK,IAAK,IAAK,GAAI,EAAG,GAAI,GAAI,IAAK,IAAK,GAAI,EAAG,GAAI,EAAG,IAAK,MACvnC,CAAC,GAAG+d,OACX,CAAE,MAAO1wD,GAET,CAYA,SAASsyN,EAAK3zC,EAAKC,EAAMi/Y,GAMrBhgkB,KAAK8gL,IAAY,EAANA,EAMX9gL,KAAK+gL,KAAc,EAAPA,EAMZ/gL,KAAKggkB,WAAaA,CACtB,CAmCA,SAASC,EAAOj5jB,GACZ,OAAsC,KAA9BA,GAAOA,EAAgB,WACnC,CAZAytN,EAAK9zN,UAAUu/jB,WAEfh4jB,OAAOyD,eAAe8oN,EAAK9zN,UAAW,aAAc,CAAEqF,OAAO,IAkB7DyuN,EAAKwrW,OAASA,EAOd,IAAIE,EAAY,CAAC,EAObC,EAAa,CAAC,EAQlB,SAASC,EAAQr6jB,EAAOg6jB,GACpB,IAAIh5jB,EAAKs5jB,EAAWz7jB,EACpB,OAAIm7jB,GAEIn7jB,EAAS,IADbmB,KAAW,IACgBA,EAAQ,OAC/Bs6jB,EAAYF,EAAWp6jB,IAEZs6jB,GAEft5jB,EAAMu5jB,EAASv6jB,GAAgB,EAARA,GAAa,GAAK,EAAI,GAAG,GAC5CnB,IACAu7jB,EAAWp6jB,GAASgB,GACjBA,IAGHnC,GAAU,MADdmB,GAAS,IACqBA,EAAQ,OAClCs6jB,EAAYH,EAAUn6jB,IAEXs6jB,GAEft5jB,EAAMu5jB,EAASv6jB,EAAOA,EAAQ,GAAK,EAAI,GAAG,GACtCnB,IACAs7jB,EAAUn6jB,GAASgB,GAChBA,EAEf,CAiBA,SAAS4uN,EAAW5vN,EAAOg6jB,GACvB,GAAIv9d,MAAMz8F,GACN,OAAOg6jB,EAAWhqW,EAAQwqW,EAC9B,GAAIR,EAAU,CACV,GAAIh6jB,EAAQ,EACR,OAAOgwN,EACX,GAAIhwN,GAASy6jB,EACT,OAAOC,CACf,KAAO,CACH,GAAI16jB,IAAU26jB,EACV,OAAOC,EACX,GAAI56jB,EAAQ,GAAK26jB,EACb,OAAO5hV,CACf,CACA,OAAI/4O,EAAQ,EACD4vN,GAAY5vN,EAAOg6jB,GAAU18a,MACjCi9a,EAAUv6jB,EAAQ66jB,EAAkB,EAAI76jB,EAAQ66jB,EAAkB,EAAGb,EAChF,CAkBA,SAASO,EAASO,EAASC,EAAUf,GACjC,OAAO,IAAIvrW,EAAKqsW,EAASC,EAAUf,EACvC,CA7CAvrW,EAAK4rW,QAAUA,EAkCf5rW,EAAKmB,WAAaA,EAsBlBnB,EAAK8rW,SAAWA,EAShB,IAAIS,EAAU73iB,KAAKqqE,IASnB,SAASmhI,EAAWrvN,EAAK06jB,EAAUiB,GAC/B,GAAmB,IAAf37jB,EAAIhE,OACJ,MAAMwV,MAAM,gBAChB,GAAY,QAARxR,GAAyB,aAARA,GAA8B,cAARA,GAA+B,cAARA,EAC9D,OAAOk7jB,EASX,GARwB,kBAAbR,GAEPiB,EAAQjB,EACRA,GAAW,GAEXA,IAAcA,GAElBiB,EAAQA,GAAS,IACL,GAAK,GAAKA,EAClB,MAAMzrT,WAAW,SAErB,IAAIvyP,EACJ,IAAKA,EAAI3d,EAAI4O,QAAQ,MAAQ,EACzB,MAAM4C,MAAM,mBACX,GAAU,IAANmM,EACL,OAAO0xM,EAAWrvN,EAAIkrC,UAAU,GAAIwvhB,EAAUiB,GAAO39a,MAQzD,IAHA,IAAI49a,EAAetrW,EAAWorW,EAAQC,EAAO,IAEzCz5jB,EAASg5jB,EACJ7+jB,EAAI,EAAGA,EAAI2D,EAAIhE,OAAQK,GAAK,EAAG,CACpC,IAAI62C,EAAOrvB,KAAKgE,IAAI,EAAG7nB,EAAIhE,OAASK,GAChCqE,EAAQszD,SAASh0D,EAAIkrC,UAAU7uC,EAAGA,EAAI62C,GAAOyohB,GACjD,GAAIzohB,EAAO,EAAG,CACV,IAAI2ohB,EAAQvrW,EAAWorW,EAAQC,EAAOzohB,IACtChxC,EAASA,EAAOy6I,IAAIk/a,GAAOluiB,IAAI2iM,EAAW5vN,GAC9C,MAEIwB,GADAA,EAASA,EAAOy6I,IAAIi/a,IACJjuiB,IAAI2iM,EAAW5vN,GAEvC,CAEA,OADAwB,EAAOw4jB,SAAWA,EACXx4jB,CACX,CAmBA,SAAS45jB,EAAU1gjB,EAAKs/iB,GACpB,MAAmB,kBAARt/iB,EACAk1M,EAAWl1M,EAAKs/iB,GACR,kBAARt/iB,EACAi0M,EAAWj0M,EAAKs/iB,GAEpBO,EAAS7/iB,EAAIogK,IAAKpgK,EAAIqgK,KAA0B,mBAAbi/Y,EAAyBA,EAAWt/iB,EAAIs/iB,SACtF,CAhBAvrW,EAAKE,WAAaA,EAyBlBF,EAAK2sW,UAAYA,EAUjB,IAcIP,EAAiBQ,WAOjBZ,EAAiBI,EAAiBA,EAOlCF,EAAiBF,EAAiB,EAOlCa,EAAajB,EA5BI,GAAK,IAkCtBG,EAAOH,EAAQ,GAMnB5rW,EAAK+rW,KAAOA,EAMZ,IAAIxqW,EAAQqqW,EAAQ,GAAG,GAMvB5rW,EAAKuB,MAAQA,EAMb,IAAIurW,EAAMlB,EAAQ,GAMlB5rW,EAAK8sW,IAAMA,EAMX,IAAIC,EAAOnB,EAAQ,GAAG,GAMtB5rW,EAAK+sW,KAAOA,EAMZ,IAAIC,EAAUpB,GAAS,GAMvB5rW,EAAKgtW,QAAUA,EAMf,IAAI1iV,EAAYwhV,GAAS,EAAc,YAAc,GAMrD9rW,EAAKsqB,UAAYA,EAMjB,IAAI2hV,EAAqBH,GAAS,GAAc,GAAc,GAM9D9rW,EAAKisW,mBAAqBA,EAM1B,IAAIE,EAAYL,EAAS,GAAG,YAAc,GAM1C9rW,EAAKmsW,UAAYA,EAMjB,IAAIc,EAAgBjtW,EAAK9zN,UAMzB+gkB,EAAcr6V,MAAQ,WAClB,OAAOrnO,KAAKggkB,SAAWhgkB,KAAK8gL,MAAQ,EAAI9gL,KAAK8gL,GACjD,EAMA4gZ,EAAc7ngB,SAAW,WACrB,OAAI75D,KAAKggkB,UACIhgkB,KAAK+gL,OAAS,GAAK8/Y,GAAmB7gkB,KAAK8gL,MAAQ,GACzD9gL,KAAK+gL,KAAO8/Y,GAAkB7gkB,KAAK8gL,MAAQ,EACtD,EASA4gZ,EAAch8jB,SAAW,SAAkBu7jB,GAEvC,IADAA,EAAQA,GAAS,IACL,GAAK,GAAKA,EAClB,MAAMzrT,WAAW,SACrB,GAAIx1Q,KAAK2hkB,SACL,MAAO,IACX,GAAI3hkB,KAAK4hkB,aAAc,CACnB,GAAI5hkB,KAAK6hkB,GAAGjB,GAAY,CAGpB,IAAIkB,EAAYlsW,EAAWqrW,GACvBxsf,EAAMz0E,KAAKy0E,IAAIqtf,GACfC,EAAOttf,EAAIwtE,IAAI6/a,GAAW1/a,IAAIpiJ,MAClC,OAAOy0E,EAAI/uE,SAASu7jB,GAASc,EAAK16V,QAAQ3hO,SAASu7jB,EACvD,CACI,MAAO,IAAMjhkB,KAAKsjJ,MAAM59I,SAASu7jB,EACzC,CAOA,IAHA,IAAIC,EAAetrW,EAAWorW,EAAQC,EAAO,GAAIjhkB,KAAKggkB,UAClD71R,EAAMnqS,KACNwH,EAAS,KACA,CACT,IAAIw6jB,EAAS73R,EAAI11N,IAAIysf,GAEjBe,GADS93R,EAAI/nJ,IAAI4/a,EAAO//a,IAAIi/a,IAAe75V,UAAY,GACvC3hO,SAASu7jB,GAE7B,IADA92R,EAAM63R,GACEL,SACJ,OAAOM,EAASz6jB,EAEhB,KAAOy6jB,EAAO3gkB,OAAS,GACnB2gkB,EAAS,IAAMA,EACnBz6jB,EAAS,GAAKy6jB,EAASz6jB,CAE/B,CACJ,EAMAk6jB,EAAcQ,YAAc,WACxB,OAAOlikB,KAAK+gL,IAChB,EAMA2gZ,EAAcS,oBAAsB,WAChC,OAAOnikB,KAAK+gL,OAAS,CACzB,EAMA2gZ,EAAcU,WAAa,WACvB,OAAOpikB,KAAK8gL,GAChB,EAMA4gZ,EAAchiR,mBAAqB,WAC/B,OAAO1/S,KAAK8gL,MAAQ,CACxB,EAMA4gZ,EAAcW,cAAgB,WAC1B,GAAIrikB,KAAK4hkB,aACL,OAAO5hkB,KAAK6hkB,GAAGjB,GAAa,GAAK5gkB,KAAKsjJ,MAAM++a,gBAEhD,IADA,IAAI3hjB,EAAmB,GAAb1gB,KAAK+gL,KAAY/gL,KAAK+gL,KAAO/gL,KAAK8gL,IACnCxoE,EAAM,GAAIA,EAAM,GACK,IAArB53F,EAAO,GAAK43F,GADOA,KAG5B,OAAoB,GAAbt4G,KAAK+gL,KAAYzoE,EAAM,GAAKA,EAAM,CAC7C,EAMAopd,EAAcC,OAAS,WACnB,OAAqB,IAAd3hkB,KAAK+gL,MAA2B,IAAb/gL,KAAK8gL,GACnC,EAMA4gZ,EAAcY,IAAMZ,EAAcC,OAMlCD,EAAcE,WAAa,WACvB,OAAQ5hkB,KAAKggkB,UAAYhgkB,KAAK+gL,KAAO,CACzC,EAMA2gZ,EAAc57V,WAAa,WACvB,OAAO9lO,KAAKggkB,UAAYhgkB,KAAK+gL,MAAQ,CACzC,EAMA2gZ,EAAca,MAAQ,WAClB,OAA0B,KAAP,EAAXvikB,KAAK8gL,IACjB,EAMA4gZ,EAAcp1Q,OAAS,WACnB,OAA0B,KAAP,EAAXtsT,KAAK8gL,IACjB,EAOA4gZ,EAAcr5K,OAAS,SAAgBr4T,GAGnC,OAFKiwe,EAAOjwe,KACRA,EAAQoxe,EAAUpxe,KAClBhwF,KAAKggkB,WAAahwe,EAAMgwe,UAAahgkB,KAAK+gL,OAAS,KAAQ,GAAM/wF,EAAM+wF,OAAS,KAAQ,KAErF/gL,KAAK+gL,OAAS/wF,EAAM+wF,MAAQ/gL,KAAK8gL,MAAQ9wF,EAAM8wF,IAC1D,EAQA4gZ,EAAcG,GAAKH,EAAcr5K,OAOjCq5K,EAAcc,UAAY,SAAmBxye,GACzC,OAAQhwF,KAAK6hkB,GAAmB7xe,EACpC,EAQA0xe,EAAce,IAAMf,EAAcc,UAQlCd,EAAcgB,GAAKhB,EAAcc,UAOjCd,EAAcp5K,SAAW,SAAkBt4T,GACvC,OAAOhwF,KAAKggZ,KAAqBhwT,GAAS,CAC9C,EAQA0xe,EAAciB,GAAKjB,EAAcp5K,SAOjCo5K,EAAc/4K,gBAAkB,SAAyB34T,GACrD,OAAOhwF,KAAKggZ,KAAqBhwT,IAAU,CAC/C,EAQA0xe,EAAckB,IAAMlB,EAAc/4K,gBAQlC+4K,EAAcmB,GAAKnB,EAAc/4K,gBAOjC+4K,EAAcn5K,YAAc,SAAqBv4T,GAC7C,OAAOhwF,KAAKggZ,KAAqBhwT,GAAS,CAC9C,EAQA0xe,EAAcoB,GAAKpB,EAAcn5K,YAOjCm5K,EAAc94K,mBAAqB,SAA4B54T,GAC3D,OAAOhwF,KAAKggZ,KAAqBhwT,IAAU,CAC/C,EAQA0xe,EAAcqB,IAAMrB,EAAc94K,mBAQlC84K,EAAcsB,GAAKtB,EAAc94K,mBAQjC84K,EAActS,QAAU,SAAiBp/d,GAGrC,GAFKiwe,EAAOjwe,KACRA,EAAQoxe,EAAUpxe,IAClBhwF,KAAK6hkB,GAAG7xe,GACR,OAAO,EACX,IAAIize,EAAUjjkB,KAAK4hkB,aACfsB,EAAWlze,EAAM4xe,aACrB,OAAIqB,IAAYC,GACJ,GACPD,GAAWC,EACL,EAENljkB,KAAKggkB,SAGFhwe,EAAM+wF,OAAS,EAAM/gL,KAAK+gL,OAAS,GAAO/wF,EAAM+wF,OAAS/gL,KAAK+gL,MAAS/wF,EAAM8wF,MAAQ,EAAM9gL,KAAK8gL,MAAQ,GAAO,EAAI,EAFhH9gL,KAAKoiJ,IAAIpyD,GAAO4xe,cAAgB,EAAI,CAGnD,EASAF,EAAc1hL,KAAO0hL,EAActS,QAMnCsS,EAAcyB,OAAS,WACnB,OAAKnjkB,KAAKggkB,UAAYhgkB,KAAK6hkB,GAAGjB,GACnBA,EACJ5gkB,KAAKojkB,MAAMnwiB,IAAIsuiB,EAC1B,EAOAG,EAAcp+a,IAAMo+a,EAAcyB,OAOlCzB,EAAczuiB,IAAM,SAAaowiB,GACxBpD,EAAOoD,KACRA,EAASjC,EAAUiC,IAIvB,IAAIC,EAAMtjkB,KAAK+gL,OAAS,GACpBwiZ,EAAkB,MAAZvjkB,KAAK+gL,KACXyiZ,EAAMxjkB,KAAK8gL,MAAQ,GACnB2iZ,EAAiB,MAAXzjkB,KAAK8gL,IAEX4iZ,EAAML,EAAOtiZ,OAAS,GACtB4iZ,EAAoB,MAAdN,EAAOtiZ,KACb6iZ,EAAMP,EAAOviZ,MAAQ,GAGrB+iZ,EAAM,EAAGC,EAAM,EAAGC,EAAM,EAAGC,EAAM,EAYrC,OAVAD,IADAC,GAAOP,GAHgB,MAAbJ,EAAOviZ,QAIF,GAGfgjZ,IADAC,GAAOP,EAAMI,KACE,GAGfC,IADAC,GAAOP,EAAMI,KACE,GAEfE,GAAOP,EAAMI,EAENnD,GANPwD,GAAO,QAMiB,IATxBC,GAAO,QAQPH,GAAO,QACoC,IAH3CC,GAAO,OAG+C9jkB,KAAKggkB,SAC/D,EAOA0B,EAAcuC,SAAW,SAAkBC,GAGvC,OAFKjE,EAAOiE,KACRA,EAAa9C,EAAU8C,IACpBlkkB,KAAKizB,IAAIixiB,EAAW5gb,MAC/B,EAQAo+a,EAAct/a,IAAMs/a,EAAcuC,SAOlCvC,EAAclliB,SAAW,SAAkB6hJ,GACvC,GAAIr+K,KAAK2hkB,SACL,OAAOnB,EAKX,GAJKP,EAAO5hZ,KACRA,EAAa+iZ,EAAU/iZ,IAGvBwhZ,EAKA,OAAOU,EAJGV,EAAK59a,IAAIjiJ,KAAK8gL,IACL9gL,KAAK+gL,KACL1C,EAAWyC,IACXzC,EAAW0C,MACT8+Y,EAAKsE,WAAYnkkB,KAAKggkB,UAG/C,GAAI3hZ,EAAWsjZ,SACX,OAAOnB,EACX,GAAIxgkB,KAAK6hkB,GAAGjB,GACR,OAAOviZ,EAAWkkZ,QAAU3B,EAAYJ,EAC5C,GAAIniZ,EAAWwjZ,GAAGjB,GACd,OAAO5gkB,KAAKuikB,QAAU3B,EAAYJ,EAEtC,GAAIxgkB,KAAK4hkB,aACL,OAAIvjZ,EAAWujZ,aACJ5hkB,KAAKsjJ,MAAMrB,IAAIo8B,EAAW/6B,OAE1BtjJ,KAAKsjJ,MAAMrB,IAAIo8B,GAAY/6B,MACnC,GAAI+6B,EAAWujZ,aAClB,OAAO5hkB,KAAKiiJ,IAAIo8B,EAAW/6B,OAAOA,MAGtC,GAAItjJ,KAAK2ikB,GAAGrB,IAAejjZ,EAAWskZ,GAAGrB,GACrC,OAAO1rW,EAAW51N,KAAK65D,WAAawkH,EAAWxkH,WAAY75D,KAAKggkB,UAKpE,IAAIsD,EAAMtjkB,KAAK+gL,OAAS,GACpBwiZ,EAAkB,MAAZvjkB,KAAK+gL,KACXyiZ,EAAMxjkB,KAAK8gL,MAAQ,GACnB2iZ,EAAiB,MAAXzjkB,KAAK8gL,IAEX4iZ,EAAMrlZ,EAAW0C,OAAS,GAC1B4iZ,EAAwB,MAAlBtlZ,EAAW0C,KACjB6iZ,EAAMvlZ,EAAWyC,MAAQ,GACzBsjZ,EAAuB,MAAjB/lZ,EAAWyC,IAEjB+iZ,EAAM,EAAGC,EAAM,EAAGC,EAAM,EAAGC,EAAM,EAqBrC,OAnBAD,IADAC,GAAOP,EAAMW,KACE,GAGfN,IADAC,GAAOP,EAAMY,KACE,GACfL,GAAO,MAEPD,IADAC,GAAON,EAAMG,KACE,GAGfC,IADAC,GAAOP,EAAMa,KACE,GACfN,GAAO,MAEPD,IADAC,GAAON,EAAMI,KACE,GACfE,GAAO,MAEPD,IADAC,GAAOL,EAAME,KACE,GAEfE,GAAOP,EAAMc,EAAMb,EAAMK,EAAMJ,EAAMG,EAAMF,EAAMC,EAE1CnD,GAZPwD,GAAO,QAYiB,IAlBxBC,GAAO,QAiBPH,GAAO,QACoC,IAH3CC,GAAO,OAG+C9jkB,KAAKggkB,SAC/D,EAQA0B,EAAcz/a,IAAMy/a,EAAclliB,SAQlCkliB,EAAc2C,OAAS,SAAgBnwP,GAGnC,GAFK+rP,EAAO/rP,KACRA,EAAUktP,EAAUltP,IACpBA,EAAQytP,SACR,MAAM7qjB,MAAM,oBAaZ,IAWAwtjB,EAAQn6R,EAAK/hO,EArBjB,GAAIy3f,EAIA,OAAK7/jB,KAAKggkB,WACS,aAAfhgkB,KAAK+gL,OACY,IAAjBmzJ,EAAQpzJ,MAAgC,IAAlBozJ,EAAQnzJ,KAU3Bw/Y,GANIvgkB,KAAKggkB,SAAWH,EAAK0E,MAAQ1E,EAAK2E,OACzCxkkB,KAAK8gL,IACL9gL,KAAK+gL,KACLmzJ,EAAQpzJ,IACRozJ,EAAQnzJ,MAES8+Y,EAAKsE,WAAYnkkB,KAAKggkB,UARhChgkB,KAWf,GAAIA,KAAK2hkB,SACL,OAAO3hkB,KAAKggkB,SAAWhqW,EAAQwqW,EAEnC,GAAKxgkB,KAAKggkB,SA6BH,CAKH,GAFK9rP,EAAQ8rP,WACT9rP,EAAUA,EAAQuwP,cAClBvwP,EAAQ4uP,GAAG9ikB,MACX,OAAOg2N,EACX,GAAIk+G,EAAQ4uP,GAAG9ikB,KAAKi1N,KAAK,IACrB,OAAOusW,EACXp5f,EAAM4tJ,CACV,KAvCoB,CAGhB,GAAIh2N,KAAK6hkB,GAAGjB,GACR,OAAI1sP,EAAQ2tP,GAAGN,IAAQrtP,EAAQ2tP,GAAGJ,GACvBb,EACF1sP,EAAQ2tP,GAAGjB,GACTW,GAIP+C,EADetkkB,KAAK0kkB,IAAI,GACNjwf,IAAIy/P,GAAS3+G,IAAI,IACxBssW,GAAGrB,GACHtsP,EAAQ0tP,aAAeL,EAAME,GAEpCt3R,EAAMnqS,KAAKoiJ,IAAI8xL,EAAQjyL,IAAIqib,IAC3Bl8f,EAAMk8f,EAAOrxiB,IAAIk3Q,EAAI11N,IAAIy/P,KAI9B,GAAIA,EAAQ2tP,GAAGjB,GAClB,OAAO5gkB,KAAKggkB,SAAWhqW,EAAQwqW,EACnC,GAAIxgkB,KAAK4hkB,aACL,OAAI1tP,EAAQ0tP,aACD5hkB,KAAKsjJ,MAAM7uE,IAAIy/P,EAAQ5wL,OAC3BtjJ,KAAKsjJ,MAAM7uE,IAAIy/P,GAAS5wL,MAC5B,GAAI4wL,EAAQ0tP,aACf,OAAO5hkB,KAAKy0E,IAAIy/P,EAAQ5wL,OAAOA,MACnCl7E,EAAMo4f,CACV,CAkBA,IADAr2R,EAAMnqS,KACCmqS,EAAI44R,IAAI7uP,IAAU,CAGrBowP,EAASn7iB,KAAK+D,IAAI,EAAG/D,KAAKu+B,MAAMyiP,EAAItwO,WAAaq6Q,EAAQr6Q,aAWzD,IAPA,IAAI4mL,EAAOt3N,KAAKusE,KAAKvsE,KAAKm/C,IAAIg8f,GAAUn7iB,KAAK4yiB,KACzCt6W,EAASg/B,GAAQ,GAAM,EAAIugV,EAAQ,EAAGvgV,EAAO,IAI7CkkV,EAAY/uW,EAAW0uW,GACvBM,EAAYD,EAAU1ib,IAAIiyL,GACvB0wP,EAAUhD,cAAgBgD,EAAU9B,GAAG34R,IAG1Cy6R,GADAD,EAAY/uW,EADZ0uW,GAAU7iX,EACqBzhN,KAAKggkB,WACd/9a,IAAIiyL,GAK1BywP,EAAUhD,WACVgD,EAAYpD,GAEhBn5f,EAAMA,EAAIn1C,IAAI0xiB,GACdx6R,EAAMA,EAAI/nJ,IAAIwib,EAClB,CACA,OAAOx8f,CACX,EAQAs5f,EAAcjtf,IAAMitf,EAAc2C,OAOlC3C,EAAcjiR,OAAS,SAAgBy0B,GAKnC,OAJK+rP,EAAO/rP,KACRA,EAAUktP,EAAUltP,IAGpB2rP,EAOOU,GANIvgkB,KAAKggkB,SAAWH,EAAKgF,MAAQhF,EAAKiF,OACzC9kkB,KAAK8gL,IACL9gL,KAAK+gL,KACLmzJ,EAAQpzJ,IACRozJ,EAAQnzJ,MAES8+Y,EAAKsE,WAAYnkkB,KAAKggkB,UAGxChgkB,KAAKoiJ,IAAIpiJ,KAAKy0E,IAAIy/P,GAASjyL,IAAIiyL,GAC1C,EAQAwtP,EAAczod,IAAMyod,EAAcjiR,OAQlCiiR,EAAcv3R,IAAMu3R,EAAcjiR,OAMlCiiR,EAAc0B,IAAM,WAChB,OAAO7C,GAAUvgkB,KAAK8gL,KAAM9gL,KAAK+gL,KAAM/gL,KAAKggkB,SAChD,EAOA0B,EAAcxrW,IAAM,SAAalmI,GAG7B,OAFKiwe,EAAOjwe,KACRA,EAAQoxe,EAAUpxe,IACfuwe,EAASvgkB,KAAK8gL,IAAM9wF,EAAM8wF,IAAK9gL,KAAK+gL,KAAO/wF,EAAM+wF,KAAM/gL,KAAKggkB,SACvE,EAOA0B,EAAcpsW,GAAK,SAAYtlI,GAG3B,OAFKiwe,EAAOjwe,KACRA,EAAQoxe,EAAUpxe,IACfuwe,EAASvgkB,KAAK8gL,IAAM9wF,EAAM8wF,IAAK9gL,KAAK+gL,KAAO/wF,EAAM+wF,KAAM/gL,KAAKggkB,SACvE,EAOA0B,EAAc1sW,IAAM,SAAahlI,GAG7B,OAFKiwe,EAAOjwe,KACRA,EAAQoxe,EAAUpxe,IACfuwe,EAASvgkB,KAAK8gL,IAAM9wF,EAAM8wF,IAAK9gL,KAAK+gL,KAAO/wF,EAAM+wF,KAAM/gL,KAAKggkB,SACvE,EAOA0B,EAAcqD,UAAY,SAAmBC,GAGzC,OAFI/E,EAAO+E,KACPA,EAAUA,EAAQ39V,SACE,KAAnB29V,GAAW,IACLhlkB,KACFglkB,EAAU,GACRzE,EAASvgkB,KAAK8gL,KAAOkkZ,EAAUhlkB,KAAK+gL,MAAQikZ,EAAYhlkB,KAAK8gL,MAAS,GAAKkkZ,EAAWhlkB,KAAKggkB,UAE3FO,EAAS,EAAGvgkB,KAAK8gL,KAAQkkZ,EAAU,GAAKhlkB,KAAKggkB,SAC5D,EAQA0B,EAAcnsW,IAAMmsW,EAAcqD,UAOlCrD,EAAcuD,WAAa,SAAoBD,GAG3C,OAFI/E,EAAO+E,KACPA,EAAUA,EAAQ39V,SACE,KAAnB29V,GAAW,IACLhlkB,KACFglkB,EAAU,GACRzE,EAAUvgkB,KAAK8gL,MAAQkkZ,EAAYhlkB,KAAK+gL,MAAS,GAAKikZ,EAAWhlkB,KAAK+gL,MAAQikZ,EAAShlkB,KAAKggkB,UAE5FO,EAASvgkB,KAAK+gL,MAASikZ,EAAU,GAAKhlkB,KAAK+gL,MAAQ,EAAI,GAAK,EAAG/gL,KAAKggkB,SACnF,EAQA0B,EAAcgD,IAAMhD,EAAcuD,WAOlCvD,EAAcwD,mBAAqB,SAA4BF,GAI3D,GAHI/E,EAAO+E,KACPA,EAAUA,EAAQ39V,SAEN,KADhB29V,GAAW,IAEP,OAAOhlkB,KAEP,IAAI+gL,EAAO/gL,KAAK+gL,KAChB,OAAIikZ,EAAU,GAEHzE,EADGvgkB,KAAK8gL,MACUkkZ,EAAYjkZ,GAAS,GAAKikZ,EAAWjkZ,IAASikZ,EAAShlkB,KAAKggkB,UAE9EO,EADY,KAAZyE,EACSjkZ,EAEAA,IAAUikZ,EAAU,GAFd,EAAGhlkB,KAAKggkB,SAI1C,EAQA0B,EAAczsW,KAAOysW,EAAcwD,mBAQnCxD,EAAcyD,MAAQzD,EAAcwD,mBAMpCxD,EAAc0D,SAAW,WACrB,OAAKplkB,KAAKggkB,SAEHO,EAASvgkB,KAAK8gL,IAAK9gL,KAAK+gL,MAAM,GAD1B/gL,IAEf,EAMA0hkB,EAAc+C,WAAa,WACvB,OAAIzkkB,KAAKggkB,SACEhgkB,KACJugkB,EAASvgkB,KAAK8gL,IAAK9gL,KAAK+gL,MAAM,EACzC,EAOA2gZ,EAAc2D,QAAU,SAAiBxC,GACrC,OAAOA,EAAK7ikB,KAAKslkB,YAActlkB,KAAKulkB,WACxC,EAMA7D,EAAc4D,UAAY,WACtB,IAAIpX,EAAKlujB,KAAK+gL,KACVotY,EAAKnujB,KAAK8gL,IACd,MAAO,CACS,IAAZqtY,EACAA,IAAQ,EAAI,IACZA,IAAO,GAAK,IACZA,IAAO,GACK,IAAZD,EACAA,IAAQ,EAAI,IACZA,IAAO,GAAK,IACZA,IAAO,GAEf,EAMAwT,EAAc6D,UAAY,WACtB,IAAIrX,EAAKlujB,KAAK+gL,KACVotY,EAAKnujB,KAAK8gL,IACd,MAAO,CACHotY,IAAO,GACPA,IAAO,GAAK,IACZA,IAAQ,EAAI,IACA,IAAZA,EACAC,IAAO,GACPA,IAAO,GAAK,IACZA,IAAQ,EAAI,IACA,IAAZA,EAER,EASA15V,EAAKS,UAAY,SAAmB3vK,EAAOy6gB,EAAU6C,GACjD,OAAOA,EAAKpuW,EAAK+wW,YAAYjghB,EAAOy6gB,GAAYvrW,EAAKgxW,YAAYlghB,EAAOy6gB,EAC5E,EAQAvrW,EAAK+wW,YAAc,SAAqBjghB,EAAOy6gB,GAC3C,OAAO,IAAIvrW,EACPlvK,EAAM,GACNA,EAAM,IAAO,EACbA,EAAM,IAAM,GACZA,EAAM,IAAM,GACZA,EAAM,GACNA,EAAM,IAAO,EACbA,EAAM,IAAM,GACZA,EAAM,IAAM,GACZy6gB,EAER,EAQAvrW,EAAKgxW,YAAc,SAAqBlghB,EAAOy6gB,GAC3C,OAAO,IAAIvrW,EACPlvK,EAAM,IAAM,GACZA,EAAM,IAAM,GACZA,EAAM,IAAO,EACbA,EAAM,GACNA,EAAM,IAAM,GACZA,EAAM,IAAM,GACZA,EAAM,IAAO,EACbA,EAAM,GACNy6gB,EAER,uBC1yCA,UAMqD,EAAO,GAAE,EAA6F,SAASzwhB,IAAI,aAAa,IAAIC,EAAE,oBAAoBntB,KAAKA,KAAK,oBAAoBqD,OAAOA,YAAO,IAAS8pB,EAAEA,EAAE,CAAC,EAAM12B,GAAG02B,EAAExuC,YAAYwuC,EAAEglI,YAAY57J,EAAEE,GAAG,SAASE,MAAMw2B,EAAEwV,UAAU,CAAC,GAAGN,UAAU9mB,EAAE,CAAC,EAAEp4B,EAAE,EAAEq4B,EAAE,CAAC7Z,MAAM,SAAS7hB,EAAEqzD,GAAG,IAAI7zD,GAAG6zD,EAAEA,GAAG,CAAC,GAAGkwgB,gBAAe,EAA0C,GAAvCtud,EAAEz1G,KAAK6zD,EAAEmwgB,sBAAsBhkkB,EAAEA,EAAE,CAAC,GAAM6zD,EAAEkwgB,cAAc/jkB,EAAE6zD,EAAE5pC,YAAYwrF,EAAE5hD,EAAE5pC,YAAY4pC,EAAE5pC,UAAU4pC,EAAEowgB,QAAQ/niB,EAAEgoiB,kBAAkB,CAAC,IAAI70e,EAAE,WAAW,IAAInzD,EAAEgoiB,kBAAkB,OAAM,EAAG,IAAsKlkkB,EAAEqvF,EAApK7uF,GAAGR,EAAE6tC,EAAE8lI,KAAK9lI,EAAEs2hB,WAAW,KAAK90e,EAAEzhD,EAAE7pC,WAAWm4B,EAAEkoiB,WAAWloiB,EAAEkoiB,SAASpkkB,EAAE4zK,gBAAgB,IAAIv6H,KAAK,CAAC,IAAIg2C,EAAE,QAAQ,CAAC7nF,KAAK,uBAAuBqsD,EAAE,IAAIhmB,EAAEw2hB,OAAO7jkB,GAAW,OAAOqzD,EAAE06E,UAAU5hI,EAAEknD,EAAEnxD,GAAGmB,IAAIo4B,EAAE43B,EAAEnxD,IAAImxD,CAAC,CAA7P,GAAiQ,OAAOw7B,EAAEi1e,SAASzwgB,EAAE7lB,KAAKqhD,EAAEk1e,UAAU1wgB,EAAEssN,MAAM9wL,EAAEm1e,aAAa3wgB,EAAEk3D,SAAS17B,EAAEo1e,UAAU5wgB,EAAE3b,MAAM2b,EAAE7lB,KAAKynE,EAAE5hD,EAAE7lB,MAAM6lB,EAAEssN,MAAM1qK,EAAE5hD,EAAEssN,OAAOtsN,EAAEk3D,SAAStV,EAAE5hD,EAAEk3D,UAAUl3D,EAAE3b,MAAMu9D,EAAE5hD,EAAE3b,cAAc2b,EAAEowgB,YAAY50e,EAAEwjF,YAAY,CAACjjF,MAAMpvF,EAAEg3C,OAAOqc,EAAE6wgB,SAASr1e,EAAE3sF,IAAI,CAAC,IAAIyU,EAAE,KAAyL,OAApL+kB,EAAEyoiB,kBAAkB,iBAAiBnkkB,EAAE2W,EAAE08C,EAAEogH,SAAS,IAAIvhI,EAAEmhB,GAAG,IAAIvyC,EAAEuyC,IAAG,IAAKrzD,EAAEokkB,UAAUnvd,EAAEj1G,EAAEwhD,OAAOyzD,EAAEj1G,EAAEw8H,IAAI7lH,EAAE,IAAI47B,EAAE8gB,IAAIhmB,EAAEs8F,MAAM3pI,aAAa2pI,MAAM3pI,aAAa+F,UAAU4Q,EAAE,IAAI80C,EAAE4H,IAAW18C,EAAE+pG,OAAO1gH,EAAE,EAAEqkkB,QAAQ,SAASrkkB,EAAEqzD,GAAG,IAAI18C,GAAE,EAAGxK,GAAE,EAAG6mB,EAAE,IAAItG,EAAE,OAAO0gB,EAAE,IAAI3R,EAAE2R,EAAEA,EAAE5tC,GAAE,EAAGqvF,EAAE,KAAKp4E,GAAE,GAAI,WAAW,GAAG,iBAAiB48C,EAApB,CAAyd,GAA5b,iBAAiBA,EAAEhzD,WAAWq7B,EAAE4oiB,eAAev7jB,QAAO,SAAS/I,GAAG,OAAO,IAAIqzD,EAAEhzD,UAAU0R,QAAQ/R,EAAE,IAAGb,SAAS6zB,EAAEqgC,EAAEhzD,YAAY,kBAAkBgzD,EAAEkxgB,QAAQ,mBAAmBlxgB,EAAEkxgB,QAAQzikB,MAAMiD,QAAQsuD,EAAEkxgB,WAAW5tjB,EAAE08C,EAAEkxgB,QAAQ,kBAAkBlxgB,EAAEmxgB,gBAAgB,iBAAiBnxgB,EAAEmxgB,iBAAiBhlkB,EAAE6zD,EAAEmxgB,gBAAgB,iBAAiBnxgB,EAAEoxgB,UAAU/3iB,EAAE2mC,EAAEoxgB,SAAS,iBAAiBpxgB,EAAEqxgB,YAAYt3hB,EAAEimB,EAAEqxgB,WAAW,kBAAkBrxgB,EAAEnV,SAAS/xC,EAAEknD,EAAEnV,QAAWp8C,MAAMiD,QAAQsuD,EAAEi0C,SAAS,CAAC,GAAG,IAAIj0C,EAAEi0C,QAAQnoG,OAAO,MAAM,IAAIwV,MAAM,2BAA2Bk6E,EAAEx7B,EAAEi0C,OAAO,MAAC,IAASj0C,EAAEsxgB,aAAalpiB,EAAE43B,EAAEsxgB,WAAWv3hB,GAAG,kBAAkBimB,EAAEuxgB,iBAAiBnujB,EAAE48C,EAAEuxgB,eAA5nB,CAA2oB,CAAlrB,GAAsrB,IAAIvhkB,EAAE,IAAIo+C,OAAOme,EAAExyB,GAAG,KAA2C,GAAtC,iBAAiBptC,IAAIA,EAAE4hB,KAAKC,MAAM7hB,IAAO8B,MAAMiD,QAAQ/E,GAAG,CAAC,IAAIA,EAAEb,QAAQ2C,MAAMiD,QAAQ/E,EAAE,IAAI,OAAOuoE,EAAE,KAAKvoE,EAAER,GAAG,GAAG,iBAAiBQ,EAAE,GAAG,OAAOuoE,EAAEsmB,GAAG9oF,OAAO6C,KAAK5I,EAAE,IAAIA,EAAER,EAAE,MAAM,GAAG,iBAAiBQ,EAAE,MAAM,iBAAiBA,EAAE8yB,OAAO9yB,EAAE8yB,KAAKlR,KAAKC,MAAM7hB,EAAE8yB,OAAOhxB,MAAMiD,QAAQ/E,EAAE8yB,QAAQ9yB,EAAEumO,SAASvmO,EAAEumO,OAAOvmO,EAAEyoH,MAAMzoH,EAAEyoH,KAAK89G,QAAQvmO,EAAEumO,SAASvmO,EAAEumO,OAAOzkO,MAAMiD,QAAQ/E,EAAE8yB,KAAK,IAAI9yB,EAAEumO,OAAO,iBAAiBvmO,EAAE8yB,KAAK,GAAG/sB,OAAO6C,KAAK5I,EAAE8yB,KAAK,IAAI,IAAIhxB,MAAMiD,QAAQ/E,EAAE8yB,KAAK,KAAK,iBAAiB9yB,EAAE8yB,KAAK,KAAK9yB,EAAE8yB,KAAK,CAAC9yB,EAAE8yB,QAAQy1C,EAAEvoE,EAAEumO,QAAQ,GAAGvmO,EAAE8yB,MAAM,GAAGtzB,GAAG,MAAM,IAAImV,MAAM,0CAA0C,SAAS4zD,EAAEvoE,EAAEqzD,EAAE7zD,GAAG,IAAIqvF,EAAE,GAAG,iBAAiB7uF,IAAIA,EAAE4hB,KAAKC,MAAM7hB,IAAI,iBAAiBqzD,IAAIA,EAAEzxC,KAAKC,MAAMwxC,IAAI,IAAI18C,EAAE7U,MAAMiD,QAAQ/E,IAAI,EAAEA,EAAEb,OAAOiuC,GAAGtrC,MAAMiD,QAAQsuD,EAAE,IAAI,GAAG18C,GAAGxK,EAAE,CAAC,IAAI,IAAIsvB,EAAE,EAAEA,EAAEz7B,EAAEb,OAAOs8B,IAAI,EAAEA,IAAIozD,GAAG77D,GAAG67D,GAAG9vD,EAAE/+B,EAAEy7B,GAAGA,GAAG,EAAE43B,EAAEl0D,SAAS0vF,GAAGniE,EAAE,CAAC,IAAI,IAAIjW,EAAE,EAAEA,EAAE48C,EAAEl0D,OAAOsX,IAAI,CAAC,IAAIpT,EAAEsT,EAAE3W,EAAEb,OAAOk0D,EAAE58C,GAAGtX,OAAOopE,GAAE,EAAGl7B,EAAE12B,EAAE,IAAI5Q,OAAO6C,KAAKyqD,EAAE58C,IAAItX,OAAO,IAAIk0D,EAAE58C,GAAGtX,OAAO,GAAGK,IAAImX,IAAI4xD,EAAE,WAAW/oE,EAAE,KAAK6zD,EAAE58C,GAAG1M,KAAK,IAAI8qC,OAAO,IAAIwe,EAAE58C,GAAGtX,QAAQ,IAAIk0D,EAAE58C,GAAG,GAAGtX,QAAQ,WAAWK,GAAGmX,EAAE,CAAC,IAAI,IAAI8wD,EAAE,GAAGv1B,EAAE,EAAEA,EAAE7uC,EAAE6uC,IAAI,CAAC,IAAIuZ,EAAEre,EAAEptC,EAAEkyC,GAAGA,EAAEu1B,EAAEnoE,KAAK+zD,EAAE58C,GAAGg1C,GAAG,CAAC8c,EAAE,KAAKd,EAAE19D,KAAK,IAAI8qC,MAAM,CAAC,IAAI0zB,EAAE,CAAC,IAAI,IAAIznD,EAAE,EAAEA,EAAEzd,EAAEyd,IAAI,CAAC,EAAEA,IAAIusB,IAAIwhD,GAAG77D,GAAG,IAAIuf,EAAE57B,GAAGy2B,EAAEptC,EAAE8gB,GAAGA,EAAE+tE,GAAG9vD,EAAEs0B,EAAE58C,GAAG87B,GAAGzxB,EAAE,CAACrK,EAAE48C,EAAEl0D,OAAO,KAAKK,GAAG,EAAE6D,IAAIgqC,KAAKwhD,GAAGniE,EAAE,CAAC,CAAC,OAAOmiE,CAAC,CAAC,SAAS9vD,EAAE/+B,EAAEqzD,GAAG,GAAG,MAAMrzD,EAAE,MAAM,GAAG,GAAGA,EAAE+S,cAAcmU,KAAK,OAAOtF,KAAKE,UAAU9hB,GAAG8O,MAAM,EAAE,KAAI,IAAK2H,GAAG,iBAAiBzW,GAAG,OAAOA,EAAEmE,MAAM,iBAAiBnE,EAAE,IAAIA,GAAG,IAAIR,EAAEQ,EAAEuD,WAAWS,QAAQX,EAAEo4B,GAAGozD,EAAE,kBAAkBl4E,GAAGA,GAAG,mBAAmBA,GAAGA,EAAE3W,EAAEqzD,IAAIvxD,MAAMiD,QAAQ4R,IAAIA,EAAE08C,IAAI,SAASrzD,EAAEqzD,GAAG,IAAI,IAAI7zD,EAAE,EAAEA,EAAE6zD,EAAEl0D,OAAOK,IAAI,IAAI,EAAEQ,EAAE+R,QAAQshD,EAAE7zD,IAAI,OAAM,EAAG,OAAM,CAAE,CAAhF,CAAkFA,EAAEk8B,EAAE4oiB,kBAAkB,EAAE9kkB,EAAEuS,QAAQihB,IAAI,MAAMxzB,EAAEojD,OAAO,IAAI,MAAMpjD,EAAEojD,OAAOpjD,EAAEL,OAAO,GAAG,OAAO0vF,EAAEzhD,EAAE5tC,EAAE4tC,EAAE5tC,CAAC,CAAC,GAAG,GAAGk8B,EAAEmpiB,WAAW99iB,OAAOujD,aAAa,IAAI5uC,EAAEopiB,SAAS/9iB,OAAOujD,aAAa,IAAI5uC,EAAEqpiB,gBAAgB,SAASrpiB,EAAE4oiB,eAAe,CAAC,KAAK,KAAK,IAAI5oiB,EAAEqpiB,iBAAiBrpiB,EAAEgoiB,mBAAmB/sjB,KAAK02B,EAAEw2hB,OAAOnoiB,EAAEyoiB,kBAAkB,EAAEzoiB,EAAEspiB,eAAe,SAAStpiB,EAAEupiB,gBAAgB,QAAQvpiB,EAAEwpiB,iBAAiB,IAAIxpiB,EAAEypiB,OAAOC,EAAE1piB,EAAE2piB,aAAa7lkB,EAAEk8B,EAAE4piB,gBAAgBpzhB,EAAExW,EAAE6piB,aAAa95gB,EAAE/vB,EAAE8piB,eAAe1kjB,EAAE4a,EAAE+piB,uBAAuBlzhB,EAAElF,EAAEyvC,OAAO,CAAC,IAAIrV,EAAEp6B,EAAEyvC,OAAOrV,EAAEjlD,GAAGX,MAAM,SAASpL,GAAG,IAAIjX,EAAEiX,EAAEugC,QAAQ,CAAC,EAAE3zC,EAAE,GAAG,OAAOxF,KAAKquF,MAAK,SAASlsF,GAAG,GAAK,UAAUynE,EAAE5pE,MAAMi1C,KAAK,WAAWU,eAAe,SAASi0B,EAAE5pE,MAAMqgE,KAAK,QAAQj6D,gBAAeopC,EAAE2mI,aAAcn2K,KAAKw4E,OAAO,IAAIx4E,KAAKw4E,MAAMl3E,OAAO,OAAM,EAAG,IAAI,IAAIk0D,EAAE,EAAEA,EAAEx1D,KAAKw4E,MAAMl3E,OAAOk0D,IAAIhwD,EAAE/D,KAAK,CAACokE,KAAK7lE,KAAKw4E,MAAMhjB,GAAGqygB,UAAU7nkB,KAAKksD,eAAe0d,EAAE7yB,OAAO,CAAC,EAAEp1C,IAAI,IAAGQ,IAAInC,KAAK,SAASmC,IAAI,GAAG,IAAIqD,EAAElE,OAAO,CAAC,IAAIa,EAAEqzD,EAAE7zD,EAAEqvF,EAAEl4E,EAAEtT,EAAE,GAAG,GAAG4xG,EAAEx+F,EAAEnY,QAAQ,CAAC,IAAI8uC,EAAE32B,EAAEnY,OAAOqY,EAAE+sD,KAAK/sD,EAAE+ujB,WAAW,GAAG,iBAAiBt4hB,EAAE,CAAC,GAAG,UAAUA,EAAE3qB,OAAO,OAAOziB,EAAE,aAAaqzD,EAAE18C,EAAE+sD,KAAKlkE,EAAEmX,EAAE+ujB,UAAU72e,EAAEzhD,EAAEsa,YAAYutD,EAAEx+F,EAAEihC,QAAQjhC,EAAEihC,MAAM,CAACl1C,KAAKxC,GAAGqzD,EAAE7zD,EAAEqvF,IAAI,GAAG,SAASzhD,EAAE3qB,OAAO,YAAY8lD,IAAI,iBAAiBn7B,EAAE4J,SAASrgC,EAAEozC,eAAe0d,EAAE7yB,OAAOj+B,EAAEozC,eAAe3c,EAAE4J,QAAQ,MAAM,GAAG,SAAS5J,EAAE,YAAYm7B,GAAG,CAAC,IAAI9sC,EAAE9kB,EAAEozC,eAAewgE,SAAS5zG,EAAEozC,eAAewgE,SAAS,SAASvqH,GAAGi1G,EAAEx5E,IAAIA,EAAEz7B,EAAE2W,EAAE+sD,KAAK/sD,EAAE+ujB,WAAWn9f,GAAG,EAAE7sC,EAAE7Z,MAAMlL,EAAE+sD,KAAK/sD,EAAEozC,eAAe,MAAMkrD,EAAEx+F,EAAE8zG,WAAW9zG,EAAE8zG,UAAU,CAAC,SAAShiD,IAAIllE,EAAE6L,OAAO,EAAE,GAAGlP,GAAG,CAAC,CAAC,CAAC,SAASuoE,EAAEvoE,GAAGnC,KAAK8nkB,QAAQ,KAAK9nkB,KAAK+nkB,WAAU,EAAG/nkB,KAAKgokB,YAAW,EAAGhokB,KAAKiokB,SAAQ,EAAGjokB,KAAKkokB,OAAO,KAAKlokB,KAAKmokB,WAAW,EAAEnokB,KAAKookB,aAAa,GAAGpokB,KAAKqokB,UAAU,EAAErokB,KAAKkjG,OAAO,EAAEljG,KAAKsokB,WAAW,KAAKtokB,KAAKuokB,cAAa,EAAGvokB,KAAKwokB,iBAAiB,CAACvziB,KAAK,GAAGwziB,OAAO,GAAG79c,KAAK,CAAC,GAAG,SAASzoH,GAAG,IAAIqzD,EAAE3T,EAAE1/C,GAAGqzD,EAAEwsN,UAAU1oN,SAAS9D,EAAEwsN,WAAW7/Q,EAAEwtC,MAAMxtC,EAAE2/Q,QAAQtsN,EAAEwsN,UAAU,MAAMhiR,KAAK8nkB,QAAQ,IAAInmkB,EAAE6zD,IAAIx1D,KAAK8nkB,QAAQY,SAAS1okB,MAAM2okB,QAAQnzgB,CAAC,EAAEtxD,KAAKlE,KAAKmC,GAAGnC,KAAK4okB,WAAW,SAASzmkB,EAAEqzD,GAAG,GAAGx1D,KAAKuokB,cAAcnxd,EAAEp3G,KAAK2okB,QAAQE,kBAAkB,CAAC,IAAIlnkB,EAAE3B,KAAK2okB,QAAQE,iBAAiB1mkB,QAAG,IAASR,IAAIQ,EAAER,EAAE,CAAC3B,KAAKuokB,cAAa,EAAGvokB,KAAKiokB,SAAQ,EAAG,IAAIj3e,EAAEhxF,KAAKookB,aAAajmkB,EAAEnC,KAAKookB,aAAa,GAAG,IAAItvjB,EAAE9Y,KAAK8nkB,QAAQ9jjB,MAAMgtE,EAAEhxF,KAAKmokB,YAAYnokB,KAAK+nkB,WAAW,IAAI/nkB,KAAK8nkB,QAAQ19iB,WAAWpqB,KAAK8nkB,QAAQ5+gB,UAAU,CAAC,IAAI3Z,EAAEz2B,EAAE8xG,KAAKnkH,OAAOzG,KAAK+nkB,YAAY/nkB,KAAKookB,aAAap3e,EAAExgD,UAAUjB,EAAEvvC,KAAKmokB,YAAYnokB,KAAKmokB,WAAW54hB,GAAGz2B,GAAGA,EAAEmc,OAAOj1B,KAAKqokB,WAAWvvjB,EAAEmc,KAAK3zB,QAAQ,IAAIs8B,EAAE59B,KAAK+nkB,WAAW/nkB,KAAK2okB,QAAQG,SAAS9okB,KAAKqokB,WAAWrokB,KAAK2okB,QAAQG,QAAQ,GAAGlwjB,EAAE42B,EAAEglI,YAAY,CAAC/7F,QAAQ3/D,EAAEutjB,SAASxoiB,EAAEkriB,UAAUrpe,SAAS9hE,SAAS,GAAGw5E,EAAEp3G,KAAK2okB,QAAQ7mT,SAAStsN,EAAE,CAAC,GAAGx1D,KAAK2okB,QAAQ7mT,MAAMhpQ,EAAE9Y,KAAK8nkB,SAAS9nkB,KAAK8nkB,QAAQ19iB,UAAUpqB,KAAK8nkB,QAAQ5+gB,UAAU,YAAYlpD,KAAKiokB,SAAQ,GAAInvjB,OAAE,EAAO9Y,KAAKwokB,sBAAiB,CAAM,CAAC,OAAOxokB,KAAK2okB,QAAQh5hB,MAAM3vC,KAAK2okB,QAAQ7mT,QAAQ9hR,KAAKwokB,iBAAiBvziB,KAAKj1B,KAAKwokB,iBAAiBvziB,KAAK9oB,OAAO2M,EAAEmc,MAAMj1B,KAAKwokB,iBAAiBC,OAAOzokB,KAAKwokB,iBAAiBC,OAAOt8jB,OAAO2M,EAAE2vjB,QAAQzokB,KAAKwokB,iBAAiB59c,KAAK9xG,EAAE8xG,MAAM5qH,KAAKgokB,aAAapqiB,IAAIw5E,EAAEp3G,KAAK2okB,QAAQj8c,WAAW5zG,GAAGA,EAAE8xG,KAAK1hE,UAAUlpD,KAAK2okB,QAAQj8c,SAAS1sH,KAAKwokB,iBAAiBxokB,KAAKkokB,QAAQlokB,KAAKgokB,YAAW,GAAIpqiB,GAAG9kB,GAAGA,EAAE8xG,KAAKxgG,QAAQpqB,KAAKsokB,aAAaxvjB,CAAC,CAAC9Y,KAAKiokB,SAAQ,CAAE,EAAEjokB,KAAKgpkB,WAAW,SAAS7mkB,GAAGi1G,EAAEp3G,KAAK2okB,QAAQ9uhB,OAAO75C,KAAK2okB,QAAQ9uhB,MAAM13C,GAAGyW,GAAG5Y,KAAK2okB,QAAQ9uhB,OAAOrK,EAAEglI,YAAY,CAAC6xZ,SAASxoiB,EAAEkriB,UAAUlvhB,MAAM13C,EAAEu9F,UAAS,GAAI,CAAC,CAAC,SAASrrD,EAAElyC,GAAG,IAAI6uF,GAAG7uF,EAAEA,GAAG,CAAC,GAAG6/Q,YAAY7/Q,EAAE6/Q,UAAUnkP,EAAEupiB,iBAAiB18f,EAAExmE,KAAKlE,KAAKmC,GAAGnC,KAAKsokB,WAAWxvjB,EAAE,WAAW9Y,KAAKipkB,aAAajpkB,KAAKkpkB,cAAc,EAAE,WAAWlpkB,KAAKipkB,YAAY,EAAEjpkB,KAAK6iH,OAAO,SAAS1gH,GAAGnC,KAAKkokB,OAAO/lkB,EAAEnC,KAAKsokB,YAAY,EAAEtokB,KAAKipkB,WAAW,WAAW,GAAGjpkB,KAAK+nkB,UAAU/nkB,KAAKkpkB,mBAAmB,CAAC,GAAGl4e,EAAE,IAAIxqC,eAAexmD,KAAK2okB,QAAQhghB,kBAAkBqoC,EAAEroC,gBAAgB3oD,KAAK2okB,QAAQhghB,iBAAiB7vC,IAAIk4E,EAAE3Y,OAAOn3C,EAAElhC,KAAKkpkB,aAAalpkB,MAAMgxF,EAAE3oC,QAAQnnB,EAAElhC,KAAKmpkB,YAAYnpkB,OAAOgxF,EAAElpC,KAAK9nD,KAAK2okB,QAAQS,oBAAoB,OAAO,MAAMppkB,KAAKkokB,QAAQpvjB,GAAG9Y,KAAK2okB,QAAQU,uBAAuB,CAAC,IAAIlnkB,EAAEnC,KAAK2okB,QAAQU,uBAAuB,IAAI,IAAI7zgB,KAAKrzD,EAAE6uF,EAAEpoC,iBAAiB4M,EAAErzD,EAAEqzD,GAAG,CAAC,GAAGx1D,KAAK2okB,QAAQ3mT,UAAU,CAAC,IAAIrgR,EAAE3B,KAAKkjG,OAAOljG,KAAK2okB,QAAQ3mT,UAAU,EAAEhxL,EAAEpoC,iBAAiB,QAAQ,SAAS5oD,KAAKkjG,OAAO,IAAIvhG,EAAE,CAAC,IAAIqvF,EAAE5nC,KAAKppD,KAAK2okB,QAAQS,oBAAoB,CAAC,MAAMjnkB,GAAGnC,KAAKmpkB,YAAYhnkB,EAAE+2C,QAAQ,CAACpgC,GAAG,IAAIk4E,EAAEr3C,QAAQ35C,KAAKmpkB,aAAa,CAAC,EAAEnpkB,KAAKkpkB,aAAa,WAAW,IAAIl4e,EAAE/oC,aAAa+oC,EAAEr3C,OAAO,KAAK,KAAKq3C,EAAEr3C,OAAO35C,KAAKmpkB,eAAenpkB,KAAKkjG,QAAQljG,KAAK2okB,QAAQ3mT,UAAUhiR,KAAK2okB,QAAQ3mT,UAAUhxL,EAAEppC,aAAatmD,OAAOtB,KAAK+nkB,WAAW/nkB,KAAK2okB,QAAQ3mT,WAAWhiR,KAAKkjG,QAAQ,SAAS/gG,GAAG,IAAIqzD,EAAErzD,EAAEmnkB,kBAAkB,iBAAiB,OAAG,OAAO9zgB,GAAS,EAAS8D,SAAS9D,EAAEhlB,UAAUglB,EAAEwG,YAAY,KAAK,GAAG,CAA9H,CAAgIg1B,GAAGhxF,KAAK4okB,WAAW53e,EAAEppC,eAAe,EAAE5nD,KAAKmpkB,YAAY,SAAShnkB,GAAG,IAAIqzD,EAAEw7B,EAAEnpC,YAAY1lD,EAAEnC,KAAKgpkB,WAAW,IAAIlyjB,MAAM0+C,GAAG,CAAC,CAAC,SAAS5H,EAAEzrD,GAAG,IAAI6uF,EAAEl4E,GAAG3W,EAAEA,GAAG,CAAC,GAAG6/Q,YAAY7/Q,EAAE6/Q,UAAUnkP,EAAEspiB,gBAAgBz8f,EAAExmE,KAAKlE,KAAKmC,GAAG,IAAIotC,EAAE,oBAAoB4mI,WAAWn2K,KAAK6iH,OAAO,SAAS1gH,GAAGnC,KAAKkokB,OAAO/lkB,EAAE2W,EAAE3W,EAAE8O,OAAO9O,EAAEonkB,aAAapnkB,EAAEqnkB,SAASj6hB,IAAIyhD,EAAE,IAAImlF,YAAY99F,OAAOn3C,EAAElhC,KAAKkpkB,aAAalpkB,MAAMgxF,EAAE3oC,QAAQnnB,EAAElhC,KAAKmpkB,YAAYnpkB,OAAOgxF,EAAE,IAAIy4e,eAAezpkB,KAAKsokB,YAAY,EAAEtokB,KAAKsokB,WAAW,WAAWtokB,KAAK+nkB,WAAW/nkB,KAAK2okB,QAAQG,WAAW9okB,KAAKqokB,UAAUrokB,KAAK2okB,QAAQG,UAAU9okB,KAAKipkB,YAAY,EAAEjpkB,KAAKipkB,WAAW,WAAW,IAAI9mkB,EAAEnC,KAAKkokB,OAAO,GAAGlokB,KAAK2okB,QAAQ3mT,UAAU,CAAC,IAAIxsN,EAAErsC,KAAKgE,IAAIntB,KAAKkjG,OAAOljG,KAAK2okB,QAAQ3mT,UAAUhiR,KAAKkokB,OAAO1vhB,MAAMr2C,EAAE2W,EAAE5U,KAAK/B,EAAEnC,KAAKkjG,OAAO1tC,EAAE,CAAC,IAAI7zD,EAAEqvF,EAAEqlF,WAAWl0K,EAAEnC,KAAK2okB,QAAQ10Z,UAAU1kI,GAAGvvC,KAAKkpkB,aAAa,CAAC39jB,OAAO,CAAC/D,OAAO7F,IAAI,EAAE3B,KAAKkpkB,aAAa,SAAS/mkB,GAAGnC,KAAKkjG,QAAQljG,KAAK2okB,QAAQ3mT,UAAUhiR,KAAK+nkB,WAAW/nkB,KAAK2okB,QAAQ3mT,WAAWhiR,KAAKkjG,QAAQljG,KAAKkokB,OAAO1vhB,KAAKx4C,KAAK4okB,WAAWzmkB,EAAEoJ,OAAO/D,OAAO,EAAExH,KAAKmpkB,YAAY,WAAWnpkB,KAAKgpkB,WAAWh4e,EAAEn3C,MAAM,CAAC,CAAC,SAAS52B,EAAE9gB,GAAG,IAAIR,EAAE+oE,EAAExmE,KAAKlE,KAAKmC,EAAEA,GAAG,CAAC,GAAGnC,KAAK6iH,OAAO,SAAS1gH,GAAG,OAAOR,EAAEQ,EAAEnC,KAAKsokB,YAAY,EAAEtokB,KAAKsokB,WAAW,WAAW,IAAItokB,KAAK+nkB,UAAU,CAAC,IAAI5lkB,EAAEqzD,EAAEx1D,KAAK2okB,QAAQ3mT,UAAU,OAAOxsN,GAAGrzD,EAAER,EAAE6uC,UAAU,EAAEglB,GAAG7zD,EAAEA,EAAE6uC,UAAUglB,KAAKrzD,EAAER,EAAEA,EAAE,IAAI3B,KAAK+nkB,WAAWpmkB,EAAE3B,KAAK4okB,WAAWzmkB,EAAE,CAAC,CAAC,CAAC,SAASuyC,EAAEvyC,GAAGuoE,EAAExmE,KAAKlE,KAAKmC,EAAEA,GAAG,CAAC,GAAG,IAAIqzD,EAAE,GAAG7zD,GAAE,EAAGqvF,GAAE,EAAGhxF,KAAKk8F,MAAM,WAAWxxB,EAAE/pE,UAAUu7F,MAAMtyF,MAAM5J,KAAK0J,WAAW1J,KAAKkokB,OAAOhse,OAAO,EAAEl8F,KAAKi/F,OAAO,WAAWv0B,EAAE/pE,UAAUs+F,OAAOr1F,MAAM5J,KAAK0J,WAAW1J,KAAKkokB,OAAOjpe,QAAQ,EAAEj/F,KAAK6iH,OAAO,SAAS1gH,GAAGnC,KAAKkokB,OAAO/lkB,EAAEnC,KAAKkokB,OAAOvpc,GAAG,OAAO3+H,KAAK0pkB,aAAa1pkB,KAAKkokB,OAAOvpc,GAAG,MAAM3+H,KAAK2pkB,YAAY3pkB,KAAKkokB,OAAOvpc,GAAG,QAAQ3+H,KAAK4pkB,aAAa,EAAE5pkB,KAAK6pkB,iBAAiB,WAAW74e,GAAG,IAAIx7B,EAAEl0D,SAAStB,KAAK+nkB,WAAU,EAAG,EAAE/nkB,KAAKsokB,WAAW,WAAWtokB,KAAK6pkB,mBAAmBr0gB,EAAEl0D,OAAOtB,KAAK4okB,WAAWpzgB,EAAEwjD,SAASr3G,GAAE,CAAE,EAAE3B,KAAK0pkB,YAAYxoiB,GAAE,SAAS/+B,GAAG,IAAIqzD,EAAE/zD,KAAK,iBAAiBU,EAAEA,EAAEA,EAAEuD,SAAS1F,KAAK2okB,QAAQ10Z,WAAWtyK,IAAIA,GAAE,EAAG3B,KAAK6pkB,mBAAmB7pkB,KAAK4okB,WAAWpzgB,EAAEwjD,SAAS,CAAC,MAAM72G,GAAGnC,KAAK4pkB,aAAaznkB,EAAE,CAAC,GAAEnC,MAAMA,KAAK4pkB,aAAa1oiB,GAAE,SAAS/+B,GAAGnC,KAAK8pkB,iBAAiB9pkB,KAAKgpkB,WAAW7mkB,EAAE,GAAEnC,MAAMA,KAAK2pkB,WAAWzoiB,GAAE,WAAWlhC,KAAK8pkB,iBAAiB94e,GAAE,EAAGhxF,KAAK0pkB,YAAY,GAAG,GAAE1pkB,MAAMA,KAAK8pkB,eAAe5oiB,GAAE,WAAWlhC,KAAKkokB,OAAO/8D,eAAe,OAAOnrgB,KAAK0pkB,aAAa1pkB,KAAKkokB,OAAO/8D,eAAe,MAAMnrgB,KAAK2pkB,YAAY3pkB,KAAKkokB,OAAO/8D,eAAe,QAAQnrgB,KAAK4pkB,aAAa,GAAE5pkB,KAAK,CAAC,SAAS2B,EAAEwzB,GAAG,IAAIyI,EAAEhlB,EAAEpT,EAAEwrF,EAAE7nE,KAAKqqE,IAAI,EAAE,IAAI16E,GAAGk4E,EAAEzhD,EAAE,mDAAmDm7B,EAAE,mNAAmNlV,EAAEx1D,KAAK2B,EAAE,EAAE6tC,EAAE,EAAEo6B,GAAE,EAAGznE,GAAE,EAAGkyC,EAAE,GAAGuZ,EAAE,CAAC34B,KAAK,GAAGwziB,OAAO,GAAG79c,KAAK,CAAC,GAAG,GAAGxT,EAAEjiF,EAAEwa,MAAM,CAAC,IAAI1sB,EAAEkS,EAAEwa,KAAKxa,EAAEwa,KAAK,SAASxtC,GAAG,GAAGyrD,EAAEzrD,EAAEmM,IAAIomC,QAAQ,CAAC,GAAGA,IAAI,IAAIkZ,EAAE34B,KAAK3zB,OAAO,OAAOK,GAAGQ,EAAE8yB,KAAK3zB,OAAO6zB,EAAE2ziB,SAASnnkB,EAAEwzB,EAAE2ziB,QAAQlwjB,EAAE0yB,SAASsiB,EAAE34B,KAAK24B,EAAE34B,KAAK,GAAGhS,EAAE2qC,EAAE4H,GAAG,CAAC,CAAC,CAAC,SAAS3mC,EAAE1sB,GAAG,MAAM,WAAWgzB,EAAEwxiB,eAAe,KAAKxkkB,EAAE+J,KAAK,IAAI8qC,OAAO,IAAI70C,EAAEb,QAAQ,IAAIa,EAAE,GAAGb,MAAM,CAAC,SAASozC,IAAI,GAAGkZ,GAAGpoD,IAAID,EAAE,YAAY,wBAAwB,6DAA6Ds4B,EAAEwpiB,iBAAiB,KAAK7hkB,GAAE,GAAI2vB,EAAEwxiB,eAAe,IAAI,IAAIxkkB,EAAE,EAAEA,EAAEyrD,EAAE34B,KAAK3zB,OAAOa,IAAI0sB,EAAE++B,EAAE34B,KAAK9yB,KAAKyrD,EAAE34B,KAAK5jB,OAAOlP,IAAI,GAAG,OAAOmM,KAAK,WAAW,GAAIs/C,EAAoF,GAAG3pD,MAAMiD,QAAQ0mD,EAAE34B,KAAK,IAAI,CAAC,IAAI,IAAIugC,EAAE,EAAElnD,KAAKknD,EAAE5H,EAAE34B,KAAK3zB,OAAOk0D,IAAI5H,EAAE34B,KAAKugC,GAAGnzD,QAAQF,GAAGyrD,EAAE34B,KAAK5jB,OAAO,EAAE,EAAE,MAAMu8C,EAAE34B,KAAK5yB,QAAQF,GAAzM,SAASA,EAAEA,EAAEqzD,GAAG4hD,EAAEjiF,EAAE40iB,mBAAmB5nkB,EAAEgzB,EAAE40iB,gBAAgB5nkB,EAAEqzD,IAAInhB,EAAE5yC,KAAKU,EAAE,CAAiI,CAAnO,GAAuO,WAAW,IAAIyrD,IAAIz4B,EAAEkrB,SAASlrB,EAAEuwiB,gBAAgBvwiB,EAAEvJ,UAAU,OAAOgiC,EAAE,SAASzrD,EAAEA,EAAEqzD,GAAG,IAAI7zD,EAAEqvF,EAAE77D,EAAEkrB,OAAO,CAAC,EAAE,GAAG,IAAI1+C,EAAE,EAAEA,EAAEQ,EAAEb,OAAOK,IAAI,CAAC,IAAImX,EAAEnX,EAAE4tC,EAAEptC,EAAER,GAAGwzB,EAAEkrB,SAASvnC,EAAEnX,GAAG0yC,EAAE/yC,OAAO,iBAAiB+yC,EAAE1yC,IAAIwzB,EAAEvJ,YAAY2jB,EAAEpa,EAAEvJ,UAAU2jB,EAAEz2B,IAAIy2B,EAAErO,EAAEpoB,EAAEy2B,GAAG,mBAAmBz2B,GAAGk4E,EAAEl4E,GAAGk4E,EAAEl4E,IAAI,GAAGk4E,EAAEl4E,GAAGrX,KAAK8tC,IAAIyhD,EAAEl4E,GAAGy2B,CAAC,CAAC,OAAOpa,EAAEkrB,SAAS1+C,EAAE0yC,EAAE/yC,OAAOiE,EAAE,gBAAgB,gBAAgB,6BAA6B8uC,EAAE/yC,OAAO,sBAAsBK,EAAE6tC,EAAEgmB,GAAG7zD,EAAE0yC,EAAE/yC,QAAQiE,EAAE,gBAAgB,eAAe,4BAA4B8uC,EAAE/yC,OAAO,sBAAsBK,EAAE6tC,EAAEgmB,IAAIw7B,CAAC,CAAC,IAAIx7B,EAAE,EAAyI,OAAtI5H,EAAE34B,KAAK3zB,QAAQ2C,MAAMiD,QAAQ0mD,EAAE34B,KAAK,KAAK24B,EAAE34B,KAAK24B,EAAE34B,KAAKhoB,IAAI9K,GAAGqzD,EAAE5H,EAAE34B,KAAK3zB,QAAQssD,EAAE34B,KAAK9yB,EAAEyrD,EAAE34B,KAAK,GAAGE,EAAEkrB,QAAQuN,EAAEg9D,OAAOh9D,EAAEg9D,KAAK89G,OAAOr0L,GAAU7E,GAAGgmB,EAAE5H,CAAC,CAAvrB,EAA0rB,CAAC,SAASt/C,IAAI,OAAO6mB,EAAEkrB,QAAQ,IAAIhM,EAAE/yC,MAAM,CAAC,SAAS4/B,EAAE/+B,EAAEqzD,GAAG,OAAO7zD,EAAEQ,EAAEgzB,EAAEwwiB,4BAAuB,IAASxwiB,EAAEuwiB,cAAc/jkB,KAAKwzB,EAAEuwiB,cAAc/jkB,GAAGwzB,EAAEwwiB,sBAAsBhkkB,KAAI,KAAMwzB,EAAEuwiB,cAAc/jkB,IAAIwzB,EAAEuwiB,eAAe,SAASlwgB,GAAG,SAASA,GAAG,UAAUA,GAAG,UAAUA,IAAI,SAASrzD,GAAG,GAAGotC,EAAEv2B,KAAK7W,GAAG,CAAC,IAAIqzD,EAAE+D,WAAWp3D,GAAG,GAAG2W,EAAE08C,GAAGA,EAAEw7B,EAAE,OAAM,CAAE,CAAC,OAAM,CAAE,CAA3E,CAA6Ex7B,GAAG+D,WAAW/D,GAAGkV,EAAE1xD,KAAKw8C,GAAG,IAAInsC,KAAKmsC,GAAG,KAAKA,EAAE,KAAKA,GAAGA,EAAE,IAAI7zD,CAAC,CAAC,SAAS4D,EAAEpD,EAAEqzD,EAAE7zD,EAAEqvF,GAAG,IAAIl4E,EAAE,CAAC3P,KAAKhH,EAAEkR,KAAKmiD,EAAEtc,QAAQv3C,QAAG,IAASqvF,IAAIl4E,EAAE4hG,IAAI1pB,GAAGpjC,EAAE66gB,OAAOhnkB,KAAKqX,EAAE,CAAC9Y,KAAKgkB,MAAM,SAAS7hB,EAAEqzD,EAAE7zD,GAAG,IAAIqvF,EAAE77D,EAAE0xiB,WAAW,IAAI,GAAG1xiB,EAAEyxiB,UAAUzxiB,EAAEyxiB,QAAQ,SAASzkkB,EAAEqzD,GAAGrzD,EAAEA,EAAEquC,UAAU,EAAE,SAAS,IAAI7uC,EAAE,IAAIiiD,OAAOme,EAAEvM,GAAG,UAAUuM,EAAEvM,GAAG,MAAMw7B,GAAG7uF,EAAEA,EAAEgE,QAAQxE,EAAE,KAAK6B,MAAM,MAAMsV,EAAE3W,EAAEqB,MAAM,MAAM+rC,EAAE,EAAEz2B,EAAExX,QAAQwX,EAAE,GAAGxX,OAAO0vF,EAAE,GAAG1vF,OAAO,GAAG,IAAI0vF,EAAE1vF,QAAQiuC,EAAE,MAAM,KAAK,IAAI,IAAI3R,EAAE,EAAEhlB,EAAE,EAAEA,EAAEo4E,EAAE1vF,OAAOsX,IAAI,OAAOo4E,EAAEp4E,GAAG,IAAIglB,IAAI,OAAOA,GAAGozD,EAAE1vF,OAAO,EAAE,OAAO,IAAI,CAA3R,CAA6Ra,EAAE6uF,IAAIxrF,GAAE,EAAG2vB,EAAE3yB,UAAU40G,EAAEjiF,EAAE3yB,aAAa2yB,EAAE3yB,UAAU2yB,EAAE3yB,UAAUL,GAAGyrD,EAAEg9D,KAAKpoH,UAAU2yB,EAAE3yB,eAAe,CAAC,IAAIsW,EAAE,SAAS3W,EAAEqzD,EAAE7zD,EAAEqvF,EAAEl4E,GAAG,IAAIy2B,EAAE3R,EAAEhlB,EAAEpT,EAAEsT,EAAEA,GAAG,CAAC,IAAI,KAAK,IAAI,IAAI+kB,EAAEmpiB,WAAWnpiB,EAAEopiB,UAAU,IAAI,IAAIv8f,EAAE,EAAEA,EAAE5xD,EAAExX,OAAOopE,IAAI,CAAC,IAAIl7B,EAAE12B,EAAE4xD,GAAGd,EAAE,EAAEv1B,EAAE,EAAEuZ,EAAE,EAAEh1C,OAAE,EAAO,IAAI,IAAIqK,EAAE,IAAIskjB,EAAE,CAACyC,SAASh5e,EAAExuF,UAAUgtC,EAAEo3hB,QAAQpxgB,EAAEszgB,QAAQ,KAAK9kjB,MAAM7hB,GAAGuyC,EAAE,EAAEA,EAAEzxB,EAAEgS,KAAK3zB,OAAOozC,IAAI,GAAG/yC,GAAGktB,EAAE5L,EAAEgS,KAAKyf,IAAIkZ,QAAQ,CAAC,IAAIt/C,EAAE2U,EAAEgS,KAAKyf,GAAGpzC,OAAO+yC,GAAG/lC,OAAE,IAASsK,EAAE,EAAEtK,IAAIs7D,GAAGzgD,KAAK0H,IAAIviB,EAAEsK,GAAGA,EAAEtK,GAAGsK,EAAEtK,CAAC,CAAC,EAAE2U,EAAEgS,KAAK3zB,SAAS+yC,GAAGpxB,EAAEgS,KAAK3zB,OAAOssD,SAAI,IAAShwB,GAAGgsC,GAAGhsC,UAAK,IAASp4B,GAAGA,EAAE6uC,IAAI,KAAKA,IAAIzW,EAAEgsC,EAAEr6B,EAAEC,EAAEhqC,EAAE6uC,EAAE,CAAC,MAAM,CAAC41hB,cAAc90iB,EAAE3yB,UAAU+sC,GAAG26hB,cAAc36hB,EAAE,CAAte,CAAweptC,EAAEgzB,EAAEyxiB,QAAQzxiB,EAAEwxiB,eAAexxiB,EAAE60iB,SAAS70iB,EAAEg1iB,mBAAmBrxjB,EAAEmxjB,WAAW90iB,EAAE3yB,UAAUsW,EAAEoxjB,eAAe1kkB,GAAE,EAAG2vB,EAAE3yB,UAAUq7B,EAAEwpiB,kBAAkBz5gB,EAAEg9D,KAAKpoH,UAAU2yB,EAAE3yB,SAAS,CAAC,IAAI+sC,EAAEsS,EAAE1sB,GAAG,OAAOA,EAAE2ziB,SAAS3ziB,EAAEkrB,QAAQ9Q,EAAEu5hB,UAAUlriB,EAAEz7B,EAAEyW,EAAE,IAAI2ujB,EAAEh4hB,GAAGqe,EAAEh1C,EAAEoL,MAAM4Z,EAAE43B,EAAE7zD,GAAG+yC,IAAIk1B,EAAE,CAACghD,KAAK,CAACxgG,QAAO,IAAKwjC,GAAG,CAACg9D,KAAK,CAACxgG,QAAO,GAAI,EAAEpqB,KAAKoqB,OAAO,WAAW,OAAOw/C,CAAC,EAAE5pE,KAAKk8F,MAAM,WAAWtyB,GAAE,EAAGhxD,EAAE0yB,QAAQ1N,EAAEw5E,EAAEjiF,EAAE2sP,OAAO,GAAGlkP,EAAE4S,UAAU53B,EAAEwxjB,eAAe,EAAEpqkB,KAAKi/F,OAAO,WAAWzpC,EAAEkzgB,SAAST,SAASr+f,GAAE,EAAGpU,EAAEkzgB,SAASE,WAAWhriB,GAAE,IAAKnV,WAAW+sC,EAAEypC,OAAO,EAAE,EAAEj/F,KAAKkpD,QAAQ,WAAW,OAAO/mD,CAAC,EAAEnC,KAAKsrC,MAAM,WAAWnpC,GAAE,EAAGyW,EAAE0yB,QAAQsiB,EAAEg9D,KAAK1hE,SAAQ,EAAGkuD,EAAEjiF,EAAEu3F,WAAWv3F,EAAEu3F,SAAS9+D,GAAGhwB,EAAE,EAAE,CAAC,CAAC,SAASmkC,EAAE5/D,GAAG,OAAOA,EAAEgE,QAAQ,sBAAsB,OAAO,CAAC,SAASohkB,EAAEplkB,GAAG,IAAIwhY,EAAE0mM,GAAGlokB,EAAEA,GAAG,CAAC,GAAGK,UAAUmsB,EAAExsB,EAAEykkB,QAAQ0D,EAAEnokB,EAAE6nkB,SAASzP,EAAEp4jB,EAAEwtC,KAAKy0W,EAAEjiZ,EAAE2mkB,QAAQl+f,EAAEzoE,EAAEookB,SAAStogB,EAAE0hU,OAAE,IAASxhY,EAAE0kkB,UAAU,IAAI1kkB,EAAE0kkB,UAAU,QAAG,IAAS1kkB,EAAE2kkB,aAAa7kgB,EAAE9/D,EAAE2kkB,aAAa,iBAAiBuD,IAAI,EAAExsiB,EAAE4oiB,eAAevyjB,QAAQm2jB,MAAMA,EAAE,KAAKC,IAAID,EAAE,MAAM,IAAIvzjB,MAAM,wCAAuC,IAAKwzjB,EAAEA,EAAE,KAAK,iBAAiBA,IAAI,EAAEzsiB,EAAE4oiB,eAAevyjB,QAAQo2jB,MAAMA,GAAE,GAAI,OAAO37iB,GAAG,OAAOA,GAAG,SAASA,IAAIA,EAAE,MAAM,IAAI2gB,EAAE,EAAEm7B,GAAE,EAAGzqE,KAAKgkB,MAAM,SAASgtE,EAAEx7B,EAAE7zD,GAAG,GAAG,iBAAiBqvF,EAAE,MAAM,IAAIl6E,MAAM,0BAA0B,IAAIgC,EAAEk4E,EAAE1vF,OAAOa,EAAEkokB,EAAE/okB,OAAOiuC,EAAE5gB,EAAErtB,OAAOs8B,EAAE0siB,EAAEhpkB,OAAOsX,EAAEw+F,EAAEmjd,GAAG/0jB,EAAE,GAAGklE,EAAE,GAAGl7B,EAAE,GAAGo6B,EAAEt6B,EAAE,EAAE,IAAI0hD,EAAE,OAAOkzT,IAAI,GAAGt5U,IAAG,IAAKA,IAAI,IAAIomB,EAAE98E,QAAQyvX,GAAG,CAAC,IAAI,IAAItvV,EAAE28C,EAAExtF,MAAMmrB,GAAGi/B,EAAE,EAAEA,EAAEvZ,EAAE/yC,OAAOssD,IAAI,CAAC,GAAGpe,EAAE6E,EAAEuZ,GAAGte,GAAGE,EAAEluC,OAAOssD,IAAIvZ,EAAE/yC,OAAO,EAAEguC,GAAG3gB,EAAErtB,YAAY,GAAGK,EAAE,OAAOuiZ,IAAI,IAAIomL,GAAG96hB,EAAEgB,UAAU,EAAE5S,KAAK0siB,EAAE,CAAC,GAAG1xjB,GAAG,GAAGpT,EAAE,GAAGD,EAAEiqC,EAAEhsC,MAAM6mkB,IAAIG,IAAI//f,EAAE,OAAOy5U,SAAS3+Y,EAAEiqC,EAAEhsC,MAAM6mkB,IAAI,GAAGjmL,GAAGA,GAAGx2V,EAAE,OAAOpoD,EAAEA,EAAEyL,MAAM,EAAEmzY,GAAGF,GAAE,EAAG,CAAC,CAAC,OAAOA,GAAG,CAAC,IAAI,IAAIjhY,EAAE+tE,EAAE98E,QAAQm2jB,EAAE/6hB,GAAGoF,EAAEs8C,EAAE98E,QAAQya,EAAE2gB,GAAGhhC,EAAE,IAAIs1C,OAAOme,EAAEE,GAAGF,EAAE4hU,GAAG,KAAKxuW,EAAE67D,EAAE98E,QAAQyvX,EAAEr0V,KAAK,GAAG0hD,EAAE1hD,KAAKq0V,EAAE,GAAG2mM,GAAG,IAAI96hB,EAAEluC,QAAQ0vF,EAAExgD,UAAUlB,EAAEA,EAAE1R,KAAK0siB,EAAE,CAAC,IAAI,IAAI51hB,EAAE,OAAOwvW,IAAI50W,EAAEoF,EAAEnF,EAAEmF,EAAEs8C,EAAE98E,QAAQya,EAAE2gB,GAAGrsB,EAAE+tE,EAAE98E,QAAQm2jB,EAAE/6hB,EAAE,MAAM,IAAI,IAAIrsB,IAAIA,EAAEyxB,IAAI,IAAIA,GAAGlF,EAAE/tC,KAAKuvF,EAAExgD,UAAUlB,EAAErsB,IAAIqsB,EAAErsB,EAAE9gB,EAAE8gB,EAAE+tE,EAAE98E,QAAQm2jB,EAAE/6hB,OAAO,CAAC,IAAI,IAAIoF,EAAE,MAAM,GAAGlF,EAAE/tC,KAAKuvF,EAAExgD,UAAUlB,EAAEoF,IAAImN,EAAEnN,EAAEnF,GAAG32B,IAAI4xjB,IAAI//f,GAAG,OAAOy5U,IAAI,GAAGE,GAAG5+Y,EAAElE,QAAQ8iZ,EAAE,OAAOF,GAAE,EAAG,MAAM,IAAI/uX,EAAEma,EAAEA,MAAM,CAAC,IAAI,KAAKna,EAAE67D,EAAE98E,QAAQyvX,EAAExuW,EAAE,IAAI,OAAOxzB,GAAG+oE,EAAEjpE,KAAK,CAAC0H,KAAK,SAASkK,KAAK,gBAAgB6lC,QAAQ,4BAA4BwhE,IAAIl1G,EAAElE,OAAOkP,MAAM8+B,IAAIi4hB,IAAI,GAAGpyiB,IAAIrc,EAAE,EAAE,OAAOyujB,EAAEv2e,EAAExgD,UAAUlB,EAAEna,GAAGhvB,QAAQmI,EAAEq1X,IAAI,GAAGA,IAAI1hU,GAAG+uB,EAAE77D,EAAE,KAAK8sC,GAAG,GAAG0hU,IAAI1hU,GAAG,IAAI9sC,GAAG67D,EAAE77D,EAAE,KAAK8sC,EAAE,EAAE,IAAIh/C,GAAGA,EAAEkS,EAAE,IAAIlS,EAAE+tE,EAAE98E,QAAQm2jB,EAAEl1iB,EAAE,KAAK,IAAIuf,GAAGA,EAAEvf,EAAE,IAAIuf,EAAEs8C,EAAE98E,QAAQya,EAAEwG,EAAE,IAAI,IAAItG,EAAEgP,GAAG,IAAI6W,EAAEzxB,EAAEkG,KAAKgE,IAAIlK,EAAEyxB,IAAI,GAAGs8C,EAAE77D,EAAE,EAAEtG,KAAKw7iB,EAAE,CAAC76hB,EAAE/tC,KAAKuvF,EAAExgD,UAAUlB,EAAEna,GAAGhvB,QAAQmI,EAAEq1X,IAAI3yS,EAAE1hD,EAAEna,EAAE,EAAEtG,EAAE1sB,KAAKwhY,IAAIxuW,EAAE67D,EAAE98E,QAAQyvX,EAAEr0V,IAAIrsB,EAAE+tE,EAAE98E,QAAQm2jB,EAAE/6hB,GAAGoF,EAAEs8C,EAAE98E,QAAQya,EAAE2gB,GAAG,KAAK,CAAC,IAAIpO,EAAErD,EAAE6W,GAAG,GAAGs8C,EAAExgD,UAAUrb,EAAE,EAAE+L,EAAE/L,EAAE,EAAE+L,EAAEqO,KAAK5gB,EAAE,CAAC,GAAG6gB,EAAE/tC,KAAKuvF,EAAExgD,UAAUlB,EAAEna,GAAGhvB,QAAQmI,EAAEq1X,IAAI9hV,EAAE1sB,EAAE,EAAE+L,EAAEqO,GAAGtsB,EAAE+tE,EAAE98E,QAAQm2jB,EAAE/6hB,GAAGna,EAAE67D,EAAE98E,QAAQyvX,EAAEr0V,GAAG12B,IAAI4xjB,IAAI//f,GAAG,OAAOy5U,IAAI,GAAGE,GAAG5+Y,EAAElE,QAAQ8iZ,EAAE,OAAOF,GAAE,GAAI,KAAK,CAACx5U,EAAEjpE,KAAK,CAAC0H,KAAK,SAASkK,KAAK,gBAAgB6lC,QAAQ,8CAA8CwhE,IAAIl1G,EAAElE,OAAOkP,MAAM8+B,IAAIna,GAAG,OAAOA,GAAG,CAAC,OAAOoyiB,IAAI,SAAShikB,EAAEpD,GAAGqD,EAAE/D,KAAKU,GAAGynE,EAAEt6B,CAAC,CAAC,SAASzR,EAAE17B,GAAG,IAAIqzD,EAAE,EAAE,IAAI,IAAIrzD,EAAE,CAAC,IAAIR,EAAEqvF,EAAExgD,UAAUrb,EAAE,EAAEhzB,GAAGR,GAAG,KAAKA,EAAEq1C,SAASwe,EAAE7zD,EAAEL,OAAO,CAAC,OAAOk0D,CAAC,CAAC,SAAS+xgB,EAAEplkB,GAAG,OAAOR,SAAI,IAASQ,IAAIA,EAAE6uF,EAAExgD,UAAUlB,IAAIE,EAAE/tC,KAAKU,GAAGmtC,EAAEx2B,EAAEvT,EAAEiqC,GAAG52B,GAAG4xjB,KAAKtmL,GAAG,CAAC,SAASriW,EAAE1/C,GAAGmtC,EAAEntC,EAAEoD,EAAEiqC,GAAGA,EAAE,GAAGkF,EAAEs8C,EAAE98E,QAAQya,EAAE2gB,EAAE,CAAC,SAAS40W,EAAE/hZ,GAAG,MAAM,CAAC8yB,KAAKzvB,EAAEijkB,OAAO/9f,EAAEkgD,KAAK,CAACpoH,UAAU6nkB,EAAEI,UAAU97iB,EAAEu6B,QAAQuhB,EAAE8lI,YAAYpuM,EAAEsE,OAAOmjE,GAAGpU,GAAG,IAAI,CAAC,SAASg1gB,IAAIjQ,EAAEr2K,KAAK1+Y,EAAE,GAAGklE,EAAE,EAAE,CAAC,EAAE1qE,KAAKsrC,MAAM,WAAWm/B,GAAE,CAAE,EAAEzqE,KAAKoqkB,aAAa,WAAW,OAAO96hB,CAAC,CAAC,CAAC,SAAShhC,EAAEnM,GAAG,IAAIqzD,EAAErzD,EAAE8yB,KAAKtzB,EAAEi8B,EAAE43B,EAAE6wgB,UAAUr1e,GAAE,EAAG,GAAGx7B,EAAE3b,MAAMl4C,EAAEykkB,UAAU5wgB,EAAE3b,MAAM2b,EAAEqQ,WAAW,GAAGrQ,EAAEijB,SAASjjB,EAAEijB,QAAQxjD,KAAK,CAAC,IAAInc,EAAE,CAACwyB,MAAM,WAAW0lD,GAAE,EAAG77D,EAAEqgC,EAAE6wgB,SAAS,CAACpxiB,KAAK,GAAGwziB,OAAO,GAAG79c,KAAK,CAAC1hE,SAAQ,IAAK,EAAEgzC,MAAMrtE,EAAEowE,OAAOpwE,GAAG,GAAGuoF,EAAEz1G,EAAEskkB,UAAU,CAAC,IAAI,IAAI12hB,EAAE,EAAEA,EAAEimB,EAAEijB,QAAQxjD,KAAK3zB,SAASK,EAAEskkB,SAAS,CAAChxiB,KAAKugC,EAAEijB,QAAQxjD,KAAKsa,GAAGk5hB,OAAOjzgB,EAAEijB,QAAQgwf,OAAO79c,KAAKp1D,EAAEijB,QAAQmyC,MAAM9xG,IAAIk4E,GAAGzhD,YAAYimB,EAAEijB,OAAO,MAAM2+B,EAAEz1G,EAAEukkB,aAAavkkB,EAAEukkB,UAAU1wgB,EAAEijB,QAAQ3/D,EAAE08C,EAAEqQ,aAAarQ,EAAEijB,QAAQ,CAACjjB,EAAEkqC,WAAW1O,GAAG77D,EAAEqgC,EAAE6wgB,SAAS7wgB,EAAEijB,QAAQ,CAAC,SAAStjD,EAAEhzB,EAAEqzD,GAAG,IAAI7zD,EAAEi8B,EAAEz7B,GAAGi1G,EAAEz1G,EAAEwkkB,eAAexkkB,EAAEwkkB,aAAa3wgB,GAAG7zD,EAAE+okB,mBAAmB9siB,EAAEz7B,EAAE,CAAC,SAAS0sB,IAAI,MAAM,IAAI/X,MAAM,mBAAmB,CAAC,SAAS+qC,EAAE1/C,GAAG,GAAG,iBAAiBA,GAAG,OAAOA,EAAE,OAAOA,EAAE,IAAIqzD,EAAEvxD,MAAMiD,QAAQ/E,GAAG,GAAG,CAAC,EAAE,IAAI,IAAIR,KAAKQ,EAAEqzD,EAAE7zD,GAAGkgD,EAAE1/C,EAAER,IAAI,OAAO6zD,CAAC,CAAC,SAASt0B,EAAE/+B,EAAEqzD,GAAG,OAAO,WAAWrzD,EAAEyH,MAAM4rD,EAAE9rD,UAAU,CAAC,CAAC,SAAS0tG,EAAEj1G,GAAG,MAAM,mBAAmBA,CAAC,CAAC,OAAOyW,IAAI42B,EAAE0gG,UAAU,SAAS/tI,GAAG,IAAIqzD,EAAErzD,EAAE8yB,KAAuD,QAAlD,IAAS4I,EAAEkriB,WAAWvzgB,IAAI33B,EAAEkriB,UAAUvzgB,EAAE6wgB,UAAa,iBAAiB7wgB,EAAE+7B,MAAM/hD,EAAEglI,YAAY,CAAC6xZ,SAASxoiB,EAAEkriB,UAAUtwf,QAAQ56C,EAAE7Z,MAAMwxC,EAAE+7B,MAAM/7B,EAAErc,QAAQumD,UAAS,SAAU,GAAGlwD,EAAEs8F,MAAMt2E,EAAE+7B,iBAAiBu6C,MAAMt2E,EAAE+7B,iBAAiBrpF,OAAO,CAAC,IAAIvG,EAAEk8B,EAAE7Z,MAAMwxC,EAAE+7B,MAAM/7B,EAAErc,QAAQx3C,GAAG6tC,EAAEglI,YAAY,CAAC6xZ,SAASxoiB,EAAEkriB,UAAUtwf,QAAQ92E,EAAE+9F,UAAS,GAAI,CAAC,IAAIrrD,EAAE1zC,UAAUuH,OAAOyb,OAAO+mD,EAAE/pE,YAAYuU,YAAYm/B,GAAGuZ,EAAEjtD,UAAUuH,OAAOyb,OAAO+mD,EAAE/pE,YAAYuU,YAAY04C,GAAG3qC,EAAEtiB,UAAUuH,OAAOyb,OAAOV,EAAEtiB,YAAYuU,YAAY+N,GAAGyxB,EAAE/zC,UAAUuH,OAAOyb,OAAO+mD,EAAE/pE,YAAYuU,YAAYw/B,EAAE7W,CAAC,OAAzvkB,+ECNhE,IAAiDyzG,EAS9C5rH,OAT8C4rH,EAStC,WACX,OAAgB,SAAUl2B,GAEhB,IAAIuvd,EAAmB,CAAC,EAGxB,SAAS,EAAoBC,GAG5B,GAAGD,EAAiBC,GACnB,OAAOD,EAAiBC,GAAU/3gB,QAGnC,IAAIn9C,EAASi1jB,EAAiBC,GAAY,CACzCjpkB,EAAGipkB,EACHv2hB,GAAG,EACHwe,QAAS,CAAC,GAUX,OANAuoD,EAAQwvd,GAAU1mkB,KAAKwR,EAAOm9C,QAASn9C,EAAQA,EAAOm9C,QAAS,GAG/Dn9C,EAAO2+B,GAAI,EAGJ3+B,EAAOm9C,OACf,CAyDA,OArDA,EAAoB19B,EAAIimF,EAGxB,EAAoBxtD,EAAI+8gB,EAGxB,EAAoB/ggB,EAAI,SAAS/W,EAASluD,EAAMkmkB,GAC3C,EAAoBjyjB,EAAEi6C,EAASluD,IAClCuD,OAAOyD,eAAeknD,EAASluD,EAAM,CAAE0G,YAAY,EAAMwX,IAAKgojB,GAEhE,EAGA,EAAoB75e,EAAI,SAASn+B,GACX,qBAAX55C,QAA0BA,OAAO66B,aAC1C5rC,OAAOyD,eAAeknD,EAAS55C,OAAO66B,YAAa,CAAE9tC,MAAO,WAE7DkC,OAAOyD,eAAeknD,EAAS,aAAc,CAAE7sD,OAAO,GACvD,EAOA,EAAoBwvD,EAAI,SAASxvD,EAAOwS,GAEvC,GADU,EAAPA,IAAUxS,EAAQ,EAAoBA,IAC/B,EAAPwS,EAAU,OAAOxS,EACpB,GAAW,EAAPwS,GAA8B,kBAAVxS,GAAsBA,GAASA,EAAM0qE,WAAY,OAAO1qE,EAChF,IAAI3C,EAAK6E,OAAOyb,OAAO,MAGvB,GAFA,EAAoBqtE,EAAE3tF,GACtB6E,OAAOyD,eAAetI,EAAI,UAAW,CAAEgI,YAAY,EAAMrF,MAAOA,IACtD,EAAPwS,GAA4B,iBAATxS,EAAmB,IAAI,IAAIzF,KAAOyF,EAAO,EAAoB4jE,EAAEvmE,EAAI9C,EAAK,SAASA,GAAO,OAAOyF,EAAMzF,EAAM,EAAEyyC,KAAK,KAAMzyC,IAC9I,OAAO8C,CACR,EAGA,EAAoByV,EAAI,SAASpD,GAChC,IAAIm1jB,EAASn1jB,GAAUA,EAAOg7D,WAC7B,WAAwB,OAAOh7D,EAAgB,OAAG,EAClD,WAA8B,OAAOA,CAAQ,EAE9C,OADA,EAAoBk0D,EAAEihgB,EAAQ,IAAKA,GAC5BA,CACR,EAGA,EAAoBjyjB,EAAI,SAAS/N,EAAQ/E,GAAY,OAAOoC,OAAOvH,UAAUwH,eAAejE,KAAK2G,EAAQ/E,EAAW,EAGpH,EAAoBmd,EAAI,GAIjB,EAAoB,EAAoBssB,EAAI,EACnD,CApFM,CAsFN,CAEJ,iBAKA,SAAU75B,EAAQ,EAAqB,GAE7C,aACA,EAAoBs7E,EAAE,GACmD,EAA6C,yBAAjG,IAKjB85e,EAH6D,EAAqC,oBAGzC,QAAEp1f,KAEzC,qBAAXhwD,SACTA,OAAOoljB,QAAUA,GAGU,EAA6B,QAAI,CAEvD,EAED,sBAKA,SAAUp1jB,EAAQ,EAAqB,GAE7C,aACA,EAAoBs7E,EAAE,GACtB,IAAI+5e,EAAU,CAEZl5iB,UAAW,WACT,MAAiC,qBAAnB8zW,cAChB,EAEAn+S,KAAM,WACJ,OAAgD,IAAzCl6D,UAAUM,UAAU1Z,QAAQ,WAAoBlT,SAASkkY,YAClE,EAEAl9S,OAAQ,WACN,OAAQ+if,EAAQvjf,UAAY9hE,OAAO0/W,UACrC,EAEA/9S,SAAU,WAER,SADc39E,UAAUpI,OAAS,QAAsBpB,IAAjBwJ,UAAU,GAAmBA,UAAU,GAAKgc,QACjE6/W,MACnB,EAEAj+S,SAAU,WACR,OAAOp/E,OAAOvH,UAAU+E,SAASxB,KAAKwhB,OAAOpd,aAAa4L,QAAQ,eAAiB,IAA8D,IAAzDoZ,UAAUM,UAAUxnB,cAAc8N,QAAQ,SACpI,EAEA82jB,YAAa,WACX,OAA+D,IAAxD19iB,UAAUM,UAAUxnB,cAAc8N,QAAQ,QACnD,GAE2B,EAA6B,QAAI,CAEvD,EAED,wBAKA,SAAUwB,EAAQ,EAAqB,GAE7C,aACA,EAAoBs7E,EAAE,GACS,EAAoBpnB,EAAE,EAAqB,cAAc,WAAa,OAAOqhgB,CAAY,IACzF,EAAoBrhgB,EAAE,EAAqB,mBAAmB,WAAa,OAAOshgB,CAAiB,IACnG,EAAoBthgB,EAAE,EAAqB,iBAAiB,WAAa,OAAOuhgB,CAAe,IAC/F,EAAoBvhgB,EAAE,EAAqB,aAAa,WAAa,OAAOwhgB,CAAW,IACvF,EAAoBxhgB,EAAE,EAAqB,WAAW,WAAa,OAAO+L,CAAS,IACnF,EAAoB/L,EAAE,EAAqB,aAAa,WAAa,OAAOyhgB,CAAW,IACjG,IAAIC,EAAsC,EAAmC,qBACzEC,EAAwC,EAAqC,uBACtG,SAASrojB,EAAQlc,GAAmV,OAAtOkc,EAArD,oBAAXjK,QAAoD,kBAApBA,OAAOC,SAAmC,SAAiBlS,GAAO,cAAcA,CAAK,EAAsB,SAAiBA,GAAO,OAAOA,GAAyB,oBAAXiS,QAAyBjS,EAAIkO,cAAgB+D,QAAUjS,IAAQiS,OAAOtY,UAAY,gBAAkBqG,CAAK,EAAYkc,EAAQlc,EAAM,CAIzX,SAASikkB,EAAWO,EAAU3vhB,GAE5B,MAAO,2BAD0BA,EAAO4vhB,KAAO,2BAA6B5vhB,EAAO6vhB,UAC5E,6BAAoCF,EAAW,QACxD,CACA,SAASN,EAAgBlkkB,GACvB,OAAOA,EAAI+9C,OAAO,GAAGpP,cAAgB3uC,EAAIiK,MAAM,EACjD,CACA,SAASk6jB,EAAcp9iB,EAAS8tB,GAO9B,IANA,IAEI/vC,EAAe,GAEflH,GAJM5D,SAAS4rB,aAAelH,QAIjBgK,iBAAiB3B,EAAS,IAElCxtB,EAAM,EAAGA,EAAMqE,EAAOtD,OAAQf,MAEK,IAAtCs7C,EAAO8vhB,aAAaz3jB,QAAQ,OAA4D,IAA7C2nC,EAAO+vhB,YAAY13jB,QAAQtP,EAAOrE,KAAgBsrkB,EAAkBhwhB,EAAO8vhB,aAAc/mkB,EAAOrE,MACzIqE,EAAOyyF,iBAAiBzyF,EAAOrE,MAAOuL,GAAgBlH,EAAOrE,GAAO,IAAMqE,EAAOyyF,iBAAiBzyF,EAAOrE,IAAQ,KAMzH,OADAuL,GAAgB,cAAgB+vC,EAAOrT,SAAW,6BAA+BqT,EAAO6vhB,UAAY,cAEtG,CAEA,SAASG,EAAkBjnkB,EAAQoB,GACjC,IAAK,IAAIrE,EAAI,EAAGA,EAAIiD,EAAOtD,OAAQK,IACjC,GAAuB,WAAnBuhB,EAAQld,KAAqD,IAA9BA,EAAMkO,QAAQtP,EAAOjD,IAAY,OAAO,EAG7E,OAAO,CACT,CAEA,SAASypkB,EAAUU,EAAcjwhB,GAE/B,IAAIq9b,EAAkBl4e,SAASC,cAAc,OAE7C,GAAIoqkB,EAAUxvhB,EAAOwE,QACnB64b,EAAgB7vG,UAAYxtV,EAAOwE,WAC9B,CAEL,IAAIynd,EAAgB9mgB,SAASC,cAAc,MAEvC8qkB,EAAa/qkB,SAASI,eAAey6C,EAAOwE,QAEhDynd,EAAc3mgB,YAAY4qkB,GAC1BjkE,EAAc5mgB,aAAa,QAAS26C,EAAOmwhB,aAC3C9yF,EAAgB/3e,YAAY2mgB,EAC9B,CAEAgkE,EAAatqkB,aAAa03e,EAAiB4yF,EAAajsL,WAAW,GACrE,CACA,SAASlqU,EAAQ95B,GAEXA,EAAOowhB,WAAWX,EAA6C,QAAEr+b,QAEjEpxF,EAAOqwhB,cAAcrwhB,EAAOqwhB,gBAE5BrwhB,EAAOowhB,WAAapwhB,EAAOswhB,iBAAgBzmjB,OAAO4vJ,IAAI8kY,gBAAgBv+f,EAAOuwhB,WAEjF,IAAI9liB,EAAQ,aAERiliB,EAA+C,QAAElkf,YAAckkf,EAA+C,QAAE15iB,eAElHyU,EAAQ,SAeV5gB,OAAO8Q,iBAAiB8P,GAZV,SAASniB,IAErBuB,OAAO+Q,oBAAoB6P,EAAOniB,GAClC03B,EAAOwwhB,qBAEP,IAAIpmM,EAASjlY,SAASouI,eAAevzF,EAAO+hG,SAExCqoP,GACFA,EAAOniV,QAEX,GAGF,CACA,SAASunhB,EAAUvjkB,GAEjB,OADgB,IAAI87C,OAAO,+CACV5qC,KAAKlR,EACxB,CAEO,EAED,mBAKA,SAAU4N,EAAQ,EAAqB,GAE7C,aACA,EAAoBs7E,EAAE,GACD,IAAIs7e,EAA0C,EAAuC,yBACjFC,EAAsC,EAAmC,qBAyBlG,SAASC,EAAaz+iB,EAAS8tB,GAM7B,IAJA,IAAIv2B,EAAQyI,EAAQk6e,YAEhBwkE,EAAkBxokB,MAAMtD,UAAUsQ,MAAM/M,KAAK6pB,EAAQ8xX,YAEhDl+Y,EAAI,EAAGA,EAAI8qkB,EAAgBnrkB,OAAQK,IAE1C,IAA8D,IAA1Dk6C,EAAO6whB,eAAex4jB,QAAQu4jB,EAAgB9qkB,GAAG0C,IAArD,CAKA,IAAIsokB,EAAcH,EAAaC,EAAgB9qkB,GAAIk6C,GAEnDv2B,EAAMnkB,YAAYwrkB,EALlB,CAcF,OALI9whB,EAAO+whB,YAAmC,IAArB7+iB,EAAQq2E,UAC/B9+E,EAAMpkB,aAAa,QAASgH,OAAOokkB,EAAuD,cAA9DpkkB,CAAiE6lB,EAAS8tB,IAIhG9tB,EAAQjhB,SACd,IAAK,SAEHwY,EAAMtf,MAAQ+nB,EAAQ/nB,MACtB,MAEF,IAAK,SAEHsf,EAAM4kH,WAAW,MAAME,UAAUr8G,EAAS,EAAG,GAIjD,OAAOzI,CACT,CA3D6B,EAA6B,QAAI,CAC5D0vJ,MAAO,SAAen5H,EAAQgxhB,GAE5B,IAAIf,EAAe9qkB,SAASouI,eAAevzF,EAAOuwhB,WAE7CN,GAMLjwhB,EAAOixhB,iBAAmBN,EAAaV,EAAcjwhB,GAEjDA,EAAOwE,QACTn4C,OAAOokkB,EAAmD,UAA1DpkkB,CAA6D2zC,EAAOixhB,iBAAkBjxhB,GAIxF0whB,EAA6C,QAAEnjhB,KAAKvN,EAAQgxhB,IAZ1DnnjB,OAAO8lC,QAAQ3R,MAAM,4BAA8BgC,EAAOuwhB,UAa9D,EA0CK,EAED,oBAKA,SAAU12jB,EAAQ,EAAqB,GAE7C,aACA,EAAoBs7E,EAAE,GACD,IAAIs7e,EAA0C,EAAuC,yBACjFC,EAAsC,EAAmC,qBACzEQ,EAAwC,EAAqC,uBAIzE,EAA6B,QAAI,CAC5D/3Z,MAAO,SAAen5H,EAAQgxhB,GAExBhxhB,EAAOuwhB,UAAUl3jB,cAAgBjR,QAEnC43C,EAAOuwhB,UAAY,CAACvwhB,EAAOuwhB,YAI7BvwhB,EAAOixhB,iBAAmB9rkB,SAASC,cAAc,OAEjD46C,EAAOuwhB,UAAU/pkB,SAAQ,SAAU+1E,GAEjC,IAAIwpC,EAAM5gH,SAASC,cAAc,OAMjC,GALA2gH,EAAI1gH,aAAa,QAAS26C,EAAOmxhB,YAEjCprd,EAAIxpC,IAAMA,EAGN20f,EAA+C,QAAEl7iB,YAAa,CAChE,IAAIo7iB,EAAoBrrd,EAAIxpC,IAC5BwpC,EAAIxpC,IAAM60f,CACZ,CAGA,IAAIC,EAAelskB,SAASC,cAAc,OAE1CiskB,EAAa/rkB,YAAYygH,GAEzB/lE,EAAOixhB,iBAAiB3rkB,YAAY+rkB,EACtC,IAEIrxhB,EAAOwE,QAAQn4C,OAAOokkB,EAAmD,UAA1DpkkB,CAA6D2zC,EAAOixhB,iBAAkBjxhB,GAEzG0whB,EAA6C,QAAEnjhB,KAAKvN,EAAQgxhB,EAC9D,EAGK,EAED,mBAKA,SAAUn3jB,EAAQ,EAAqB,GAE7C,aACA,EAAoBs7E,EAAE,GACD,IAAIm8e,EAAwC,EAAqC,uBAC7EC,EAAsC,EAAmC,qBACzEC,EAAoC,EAAiC,mBACrEC,EAAqC,EAAkC,oBACvEC,EAAyC,EAAsC,wBAC/EC,EAAsC,EAAmC,qBACzEC,EAAqC,EAAkC,oBAGhG,SAASvqjB,EAAQlc,GAAmV,OAAtOkc,EAArD,oBAAXjK,QAAoD,kBAApBA,OAAOC,SAAmC,SAAiBlS,GAAO,cAAcA,CAAK,EAAsB,SAAiBA,GAAO,OAAOA,GAAyB,oBAAXiS,QAAyBjS,EAAIkO,cAAgB+D,QAAUjS,IAAQiS,OAAOtY,UAAY,gBAAkBqG,CAAK,EAAYkc,EAAQlc,EAAM,CASzX,IAAI0mkB,EAAa,CAAC,MAAO,OAAQ,QAAS,OAAQ,YACrB,EAA6B,QAAI,CAC5Dh4f,KAAM,WACJ,IAAI75B,EAAS,CACXuwhB,UAAW,KACXuB,kBAAmB,KACnBxkkB,KAAM,MACNk3C,OAAQ,KACR2rhB,YAAa,oBACbxjiB,SAAU,IACV57B,WAAY,KACZghkB,gBAAiB,8DACjBC,UAAW,oDACX5B,WAAW,EACX9pd,QAAS,SAAiBtoE,GACxB,MAAMA,CACR,EACAsyhB,eAAgB,KAChBD,aAAc,KACdG,mBAAoB,WAA+B,EACnDyB,sBAAuB,WAAkC,EACzDC,aAAc,yBACdnwb,QAAS,UACTkvb,iBAAkB,KAClBkB,cAAe,WACfpC,YAAa,CAAC,QAAS,UAAW,QAAS,YAAa,SAAU,aAAc,cAChFD,aAAc,CAAC,SAAU,MAAO,QAAS,mBACzCe,eAAgB,GAChBuB,mBAAmB,EACnB/kkB,IAAK,KACLwD,MAAO,KACPkgkB,YAAY,EACZrhB,QAAQ,EAER2iB,UAAW,KACXzC,KAAM,gBACNC,UAAW,OACXyC,oBAAoB,EACpBC,YAAY,EACZpB,WAAY,oBAGVrlkB,EAAO+B,UAAU,GAErB,QAAaxJ,IAATyH,EACF,MAAM,IAAImP,MAAM,yCAIlB,OAAQoM,EAAQvb,IACd,IAAK,SACHk0C,EAAOuwhB,UAAYiC,UAAU1mkB,GAC7Bk0C,EAAO8xhB,kBAAoB9xhB,EAAOuwhB,UAClCvwhB,EAAO1yC,KAAOO,UAAU,IAAMmyC,EAAO1yC,KACrC,MAEF,IAAK,SAKH,IAAK,IAAI5D,KAJTs2C,EAAOuwhB,UAAYzkkB,EAAKykkB,UACxBvwhB,EAAO8xhB,kBAAsD,qBAA3BhmkB,EAAKgmkB,kBAAoChmkB,EAAKgmkB,kBAAoB9xhB,EAAOuwhB,UAC3GvwhB,EAAO8xhB,kBAAoB9xhB,EAAO0vgB,OAAS,+BAA+Bp/iB,OAAO0vC,EAAO8xhB,mBAAqB9xhB,EAAO8xhB,kBAEtG9xhB,EACF,cAANt2C,GAA2B,sBAANA,IACzBs2C,EAAOt2C,GAAwB,qBAAZoC,EAAKpC,GAAqBoC,EAAKpC,GAAKs2C,EAAOt2C,IAGhE,MAEF,QACE,MAAM,IAAIuR,MAAM,gEAAkEoM,EAAQvb,IAI9F,IAAKk0C,EAAOuwhB,UAAW,MAAM,IAAIt1jB,MAAM,kCAEvC,IAAK+kC,EAAO1yC,MAA+B,kBAAhB0yC,EAAO1yC,OAAwE,IAAnDukkB,EAAWx5jB,QAAQ2nC,EAAO1yC,KAAK/C,eACpF,MAAM,IAAI0Q,MAAM,uEAId+kC,EAAOowhB,WAAWmB,EAA6C,QAAErhiB,KAAK8P,GAEtEA,EAAOswhB,gBAAgBtwhB,EAAOswhB,iBAElC,IAAImC,EAAYttkB,SAASouI,eAAevzF,EAAO+hG,SAC3C0wb,GAAWA,EAAUhskB,WAAWC,YAAY+rkB,GAEhD,IAAIzB,EAAa7rkB,SAASC,cAAc,UA+BxC,OA7BIkskB,EAA+C,QAAEt7iB,YAInDg7iB,EAAW3rkB,aAAa,QAAS,mHAGjC2rkB,EAAW3rkB,aAAa,QAAS,0EAInC2rkB,EAAW3rkB,aAAa,KAAM26C,EAAO+hG,SAEjB,QAAhB/hG,EAAO1yC,OACT0jkB,EAAW0B,OAAS,sBAAwB1yhB,EAAOmyhB,cAAgB,WAE/DnyhB,EAAO3yC,MAEJjF,MAAMiD,QAAQ20C,EAAO3yC,OAAM2yC,EAAO3yC,IAAM,CAAC2yC,EAAO3yC,MAErD2yC,EAAO3yC,IAAI7G,SAAQ,SAAUwjE,GAC3BgngB,EAAW0B,QAAU,gCAAkC1ogB,EAAO,IAChE,KAGFgngB,EAAW0B,QAAU,+BAIf1yhB,EAAO1yC,MACb,IAAK,MAEH,GAAIgkkB,EAA+C,QAAE3lf,OACnD,IACEh8B,QAAQqzG,KAAK,+DACHn5I,OAAOoiC,KAAKjM,EAAO8xhB,kBAAmB,UAC5ChoL,QACJ9pW,EAAOiyhB,uBACT,CAAE,MAAOj0hB,GACPgC,EAAOsmE,QAAQtoE,EACjB,CAAE,QAEIgC,EAAOowhB,WAAWmB,EAA6C,QAAEngc,QACjEpxF,EAAOqwhB,cAAcrwhB,EAAOqwhB,cAClC,MAEAmB,EAA2C,QAAEr4Z,MAAMn5H,EAAQgxhB,GAG7D,MAEF,IAAK,QACHW,EAA6C,QAAEx4Z,MAAMn5H,EAAQgxhB,GAC7D,MAEF,IAAK,OACHS,EAA4C,QAAEt4Z,MAAMn5H,EAAQgxhB,GAC5D,MAEF,IAAK,WACHU,EAAgD,QAAEv4Z,MAAMn5H,EAAQgxhB,GAChE,MAEF,IAAK,OACHY,EAA4C,QAAEz4Z,MAAMn5H,EAAQgxhB,GAGlE,EAGK,EAED,mBAKA,SAAUn3jB,EAAQ,EAAqB,GAE7C,aACA,EAAoBs7E,EAAE,GACD,IAAIs7e,EAA0C,EAAuC,yBACjFC,EAAsC,EAAmC,qBAClG,SAASrpjB,EAAQlc,GAAmV,OAAtOkc,EAArD,oBAAXjK,QAAoD,kBAApBA,OAAOC,SAAmC,SAAiBlS,GAAO,cAAcA,CAAK,EAAsB,SAAiBA,GAAO,OAAOA,GAAyB,oBAAXiS,QAAyBjS,EAAIkO,cAAgB+D,QAAUjS,IAAQiS,OAAOtY,UAAY,gBAAkBqG,CAAK,EAAYkc,EAAQlc,EAAM,CAI5V,EAA6B,QAAI,CAC5DguK,MAAO,SAAen5H,EAAQgxhB,GAE5B,GAAkC,WAA9B3pjB,EAAQ24B,EAAOuwhB,WACjB,MAAM,IAAIt1jB,MAAM,0CAIlB,GAAwC,mBAA7B+kC,EAAOoyhB,kBAChB,MAAM,IAAIn3jB,MAAM,yDAIlB,IAAK+kC,EAAOjvC,aAAe3I,MAAMiD,QAAQ20C,EAAOjvC,YAC9C,MAAM,IAAIkK,MAAM,gDAIlB+kC,EAAOjvC,WAAaivC,EAAOjvC,WAAWK,KAAI,SAAUnH,GAClD,MAAO,CACL6iO,MAA6B,WAAtBzlN,EAAQpd,GAAyBA,EAAS6iO,MAAQ7iO,EACzDmiB,YAAmC,WAAtB/E,EAAQpd,GAAyBA,EAASmiB,YAAcniB,EACrE0okB,WAAkC,WAAtBtrjB,EAAQpd,IAA0BA,EAAS0okB,WAAa1okB,EAAS0okB,WAAa,IAAM,IAAM3yhB,EAAOjvC,WAAWtL,OAAS,KAErI,IAEAu6C,EAAOixhB,iBAAmB9rkB,SAASC,cAAc,OAE7C46C,EAAOwE,QACTn4C,OAAOokkB,EAAmD,UAA1DpkkB,CAA6D2zC,EAAOixhB,iBAAkBjxhB,GAIxFA,EAAOixhB,iBAAiBzjM,WAM5B,SAAoBxtV,GAElB,IAAI5mB,EAAO4mB,EAAOuwhB,UACdx/jB,EAAaivC,EAAOjvC,WAEpB4+jB,EAAW,0DAEX3vhB,EAAOoyhB,oBACTzC,GAAY,WAIdA,GAAY,OAEZ,IAAK,IAAI5tiB,EAAI,EAAGA,EAAIhxB,EAAWtL,OAAQs8B,IACrC4tiB,GAAY,oBAAsB5+jB,EAAWgxB,GAAG4wiB,WAAa,IAAM3yhB,EAAO+xhB,gBAAkB,KAAO1lkB,OAAOokkB,EAAyD,gBAAhEpkkB,CAAmE0E,EAAWgxB,GAAG3V,aAAe,QAIrMujjB,GAAY,QAER3vhB,EAAOoyhB,oBACTzC,GAAY,YAIdA,GAAY,UAEZ,IAAK,IAAI7pkB,EAAI,EAAGA,EAAIszB,EAAK3zB,OAAQK,IAAK,CAEpC6pkB,GAAY,OAEZ,IAAK,IAAI1yjB,EAAI,EAAGA,EAAIlM,EAAWtL,OAAQwX,IAAK,CAC1C,IAAI21jB,EAAax5iB,EAAKtzB,GAElBmE,EAAW8G,EAAWkM,GAAG6vN,MAAMnlO,MAAM,KAEzC,GAAIsC,EAASxE,OAAS,EACpB,IAAK,IAAI2hB,EAAI,EAAGA,EAAInd,EAASxE,OAAQ2hB,IACnCwrjB,EAAaA,EAAW3okB,EAASmd,SAGnCwrjB,EAAaA,EAAW7hkB,EAAWkM,GAAG6vN,OAIxC6iW,GAAY,oBAAsB5+jB,EAAWkM,GAAG01jB,WAAa3yhB,EAAOgyhB,UAAY,KAAOY,EAAa,OACtG,CAGAjD,GAAY,OACd,CAIA,OADAA,GAAY,kBAEd,CA9DyCkD,CAAW7yhB,GAEhD0whB,EAA6C,QAAEnjhB,KAAKvN,EAAQgxhB,EAC9D,EA6DK,EAED,oBAKA,SAAUn3jB,EAAQ,EAAqB,GAE7C,aACA,EAAoBs7E,EAAE,GACtB,IAAI29e,EAAQ,CACV5iiB,KAAM,SAAc8P,GAElB,IAEI+yhB,EAAa5tkB,SAASC,cAAc,OACxC2tkB,EAAW1tkB,aAAa,QAHP,yPAIjB0tkB,EAAW1tkB,aAAa,KAAM,iBAE9B,IAAI2tkB,EAAa7tkB,SAASC,cAAc,OACxC4tkB,EAAW3tkB,aAAa,QAAS,oEAEjC,IAAI+1E,EAAcj2E,SAASC,cAAc,OACzCg2E,EAAY/1E,aAAa,QAAS,cAClC+1E,EAAY/1E,aAAa,KAAM,cAC/B2tkB,EAAW1tkB,YAAY81E,GAEvB,IAAI63f,EAAU9tkB,SAASC,cAAc,QACrC6tkB,EAAQ5tkB,aAAa,QAAS,gBAC9B2tkB,EAAW1tkB,YAAY2tkB,GAEvB,IAAIC,EAAc/tkB,SAASI,eAAey6C,EAAOkyhB,cACjDc,EAAW1tkB,YAAY4tkB,GAEvBH,EAAWztkB,YAAY0tkB,GAEvB7tkB,SAAS+uE,qBAAqB,QAAQ,GAAG5uE,YAAYytkB,GAErD5tkB,SAASouI,eAAe,cAAc54G,iBAAiB,SAAS,WAC9Dm4iB,EAAM1hc,OACR,GACF,EACAA,MAAO,WACL,IAAI2hc,EAAa5tkB,SAASouI,eAAe,iBAErCw/b,GACFA,EAAWtskB,WAAWC,YAAYqskB,EAEtC,GAE2B,EAA6B,QAAI,CAEvD,EAED,kBAKA,SAAUl5jB,EAAQ,EAAqB,GAE7C,aACA,EAAoBs7E,EAAE,GACD,IAAIg+e,EAAsC,EAAmC,qBACzEC,EAA0C,EAAuC,yBAwC1G,SAASC,EAAmBrzhB,EAAQgxhB,EAAY53iB,GAE9C,IAAIk6iB,EAAW,IAAIzpjB,OAAOs1B,KAAK,CAAC/lB,GAAO,CACrC9rB,KAAM,oBAERgmkB,EAAWzpjB,OAAO4vJ,IAAIC,gBAAgB45Z,GAEtCtC,EAAW3rkB,aAAa,MAAOiukB,GAC/BH,EAA6C,QAAE5lhB,KAAKvN,EAAQgxhB,EAC9D,CA9C6B,EAA6B,QAAI,CAC5D73Z,MAAO,SAAen5H,EAAQgxhB,GAE5B,GAAIhxhB,EAAO0vgB,OAAX,CACE,IAAI6jB,EAAat6hB,WAAW/7B,KAAK6yH,KAAK/vF,EAAOuwhB,YAAY,SAAUx+gB,GACjE,OAAOA,EAAE5rD,WAAW,EACtB,IACAktkB,EAAmBrzhB,EAAQgxhB,EAAYuC,EAEzC,KANA,CASAvzhB,EAAOuwhB,UAAY,qBAAqBpzjB,KAAK6iC,EAAOuwhB,WAAavwhB,EAAOuwhB,UAAY1mjB,OAAOs/B,SAASmyE,QAAyC,MAA/Bt7E,EAAOuwhB,UAAUrnhB,OAAO,GAAa,IAAMlJ,EAAOuwhB,UAAYvwhB,EAAOuwhB,WAEnL,IAAIiD,EAAM,IAAI3pjB,OAAO8gC,eACrB6ohB,EAAI9vhB,aAAe,cACnB8vhB,EAAI74iB,iBAAiB,SAAS,WAC5BtuB,OAAO+mkB,EAAiD,QAAxD/mkB,CAA2D2zC,GAC3DA,EAAOsmE,QAAQktd,EAAIxnhB,WACrB,IACAwnhB,EAAI74iB,iBAAiB,QAAQ,WAE3B,IAAwC,IAApC,CAAC,IAAK,KAAKtiB,QAAQm7jB,EAAI11hB,QAIzB,OAHAzxC,OAAO+mkB,EAAiD,QAAxD/mkB,CAA2D2zC,QAC3DA,EAAOsmE,QAAQktd,EAAIxnhB,YAMrBqnhB,EAAmBrzhB,EAAQgxhB,EAAYwC,EAAIh2hB,SAC7C,IACAg2hB,EAAIvnhB,KAAK,MAAOjM,EAAOuwhB,WAAW,GAClCiD,EAAIjmhB,MAxBJ,CAyBF,EAcK,EAED,oBAKA,SAAU1zC,EAAQ,EAAqB,GAE7C,aACA,EAAoBs7E,EAAE,GACD,IAAIm8e,EAAwC,EAAqC,uBAC7E8B,EAA0C,EAAuC,yBAGtGK,EAAQ,CACVlmhB,KAAM,SAAcvN,EAAQgxhB,GAE1B7rkB,SAAS+uE,qBAAqB,QAAQ,GAAG5uE,YAAY0rkB,GAErD,IAAI0C,EAAgBvukB,SAASouI,eAAevzF,EAAO+hG,SAEnD2xb,EAAcl3f,OAAS,WACrB,GAAoB,QAAhBx8B,EAAO1yC,KAAX,CAcA,IAAIqmkB,EAAgBD,EAAcE,eAAiBF,EAAcG,gBAKjE,GAJIF,EAAcxukB,WAAUwukB,EAAgBA,EAAcxukB,UAE1DwukB,EAAct+iB,KAAK/vB,YAAY06C,EAAOixhB,kBAElB,QAAhBjxhB,EAAO1yC,MAAkB0yC,EAAOnvC,MAAO,CAEzC,IAAIA,EAAQ1L,SAASC,cAAc,SACnCyL,EAAM28X,UAAYxtV,EAAOnvC,MAEzB8ikB,EAAc3rkB,KAAK1C,YAAYuL,EACjC,CAGA,IAAIu2D,EAASusgB,EAAcz/f,qBAAqB,OAE5C9M,EAAO3hE,OAAS,EAsC1B,SAA0B2hE,GACxB,IAAI9Q,EAAW8Q,EAAOh2D,KAAI,SAAUw5I,GAClC,GAAIA,EAAMruE,KAAOquE,EAAMruE,MAAQ1yD,OAAOs/B,SAASP,KAC7C,OAMN,SAAyBgiG,GACvB,OAAO,IAAIzwH,SAAQ,SAAUC,IACX,SAAS05iB,IACtBlpb,GAAuC,qBAAvBA,EAAMmpb,cAAuD,IAAvBnpb,EAAMmpb,cAAuBnpb,EAAM/5B,SAAwCz2F,IAA7BxN,WAAWknjB,EAAW,IAC7H,CAEAA,EACF,GACF,CAdaE,CAAgBppb,EAE3B,IACA,OAAOzwH,QAAQ+b,IAAIogB,EACrB,CA5CQ29gB,CAAiB7rkB,MAAM8U,KAAKkqD,IAASxtD,MAAK,WACxC,OAAOs6jB,EAAaR,EAAe1zhB,EACrC,IAEAk0hB,EAAaR,EAAe1zhB,EAxB9B,MATMsxhB,EAA+C,QAAEt7iB,YACnDpJ,YAAW,WACT,OAAOsnjB,EAAaR,EAAe1zhB,EACrC,GAAG,KAEHk0hB,EAAaR,EAAe1zhB,EA8BlC,CACF,GAGF,SAASk0hB,EAAaR,EAAe1zhB,GACnC,IAGE,GAFA0zhB,EAAc5pL,QAEVwnL,EAA+C,QAAEnlf,UAAYmlf,EAA+C,QAAE3lf,OAChH,IACE+nf,EAAcE,cAAczukB,SAASgvkB,YAAY,SAAS,EAAO,KACnE,CAAE,MAAO7tkB,GACPotkB,EAAcE,cAAcz6Z,OAC9B,MAGAu6Z,EAAcE,cAAcz6Z,OAEhC,CAAE,MAAOn7H,GACPgC,EAAOsmE,QAAQtoE,EACjB,CAAE,QACIszhB,EAA+C,QAAEt7iB,cAEnD09iB,EAAc7ikB,MAAMujkB,WAAa,SACjCV,EAAc7ikB,MAAM0e,KAAO,QAG7BljB,OAAO+mkB,EAAiD,QAAxD/mkB,CAA2D2zC,EAC7D,CACF,CAqB6B,EAA6B,QAAI,CAEvD,EAED,uBAKA,SAAUnmC,EAAQ,EAAqB,GAE7C,aACA,EAAoBs7E,EAAE,GACD,IAAIg+e,EAAsC,EAAmC,qBAErE,EAA6B,QAAI,CAC5Dh6Z,MAAO,SAAen5H,EAAQgxhB,GAE5BhxhB,EAAOixhB,iBAAmB9rkB,SAASC,cAAc,OACjD46C,EAAOixhB,iBAAiB5rkB,aAAa,QAAS,cAE9C26C,EAAOixhB,iBAAiBzjM,UAAYxtV,EAAOuwhB,UAE3C4C,EAA6C,QAAE5lhB,KAAKvN,EAAQgxhB,EAC9D,EAGK,EAED,wBAKA,SAAUn3jB,EAAQm9C,EAASq9gB,GAI1B,EAED,EAKA,SAAUx6jB,EAAQm9C,EAAS,GAEjCn9C,EAAOm9C,QAAU,EAAyC,iBAGnD,IAEc,OACrB,EAp9BEn9C,EAAOm9C,QAAUy+E,2BCDnB,IAAI6+b,EAAa,EAAQ,OAErB9wd,EAAS,EAAQ,OACjB+wd,EAAiB,EAAQ,OACzBC,EAAc,EAAQ,OAE1B,SAASC,EAAcC,EAAYx7f,EAAQjkE,EAAMqX,EAAM4/E,GACrD,IAAIpgG,EAAO,GAAGsJ,MAAM/M,KAAKwF,UAAW,GAChC8mkB,EAAU7okB,EAAKrG,OACfmvkB,EAA2C,oBAAtB9okB,EAAK6okB,EAAU,GAExC,IAAKC,IAAgBN,IACnB,MAAM,IAAIr5jB,MAAM,sCAGlB,IAAI25jB,EAoBG,CACL,GAAID,EAAU,EACZ,MAAM,IAAI15jB,MAAM,8BAYlB,OATgB,IAAZ05jB,GACF1/jB,EAAOikE,EACPA,EAAS5sD,OAAOjoB,GACK,IAAZswkB,GAAkBz7f,EAAOm1D,aAClC/hH,EAAOrX,EACPA,EAAOikE,EACPA,OAAS70E,GAGJ,IAAI81B,SAAQ,SAAUC,EAASwwB,GACpC,IACE,IAAIxxB,EAAOoqF,EAAO17F,OAAO7S,EAAMqX,GAC/B8N,EAAQs6iB,EAAWt7iB,EAAM8/C,EAAQ5sD,GACnC,CAAE,MAAOhmB,GACPskD,EAAOtkD,EACT,CACF,GACF,CAzCE,GAAIqukB,EAAU,EACZ,MAAM,IAAI15jB,MAAM,8BAGF,IAAZ05jB,GACFzoe,EAAKj3F,EACLA,EAAOikE,EACPA,EAAS5sD,OAAOjoB,GACK,IAAZswkB,IACLz7f,EAAOm1D,YAA4B,qBAAPniC,GAC9BA,EAAK5/E,EACLA,OAAOjoB,IAEP6nG,EAAK5/E,EACLA,EAAOrX,EACPA,EAAOikE,EACPA,OAAS70E,IA2Bf,IACE,IAAI+0B,EAAOoqF,EAAO17F,OAAO7S,EAAMqX,GAC/B4/E,EAAG,KAAMwoe,EAAWt7iB,EAAM8/C,EAAQ5sD,GACpC,CAAE,MAAOhmB,GACP4lG,EAAG5lG,EACL,CACF,CAEA0wD,EAAQlvC,OAAS07F,EAAO17F,OACxBkvC,EAAQ69gB,SAAWJ,EAAat9hB,KAAK,KAAMo9hB,EAAe3nkB,QAC1DoqD,EAAQy3E,UAAYgmc,EAAat9hB,KAAK,KAAMo9hB,EAAeO,iBAG3D99gB,EAAQntD,SAAW4qkB,EAAat9hB,KAAK,MAAM,SAAU/d,EAAM3mB,EAAG6Z,GAC5D,OAAOkojB,EAAY5nkB,OAAOwsB,EAAM9M,EAClC,uBCvEAzS,EAAOm9C,QAAU,WACf,MAA0B,oBAAZ78B,SAA0BA,QAAQr1B,WAAaq1B,QAAQr1B,UAAU8U,IACjF,wBCIA,IAAIm7jB,EAAgB,uBAgBpB/9gB,EAAQg+gB,gBAAkB,SAA0BljjB,GAClD,GAAgB,IAAZA,EAAe,MAAO,GAO1B,IALA,IAAImjjB,EAAW3njB,KAAKu+B,MAAM/5B,EAAU,GAAK,EACrC6qB,EAAOo4hB,EAAcjjjB,GACrBojjB,EAAqB,MAATv4hB,EAAe,GAAmD,EAA9CrvB,KAAKusE,MAAMl9C,EAAO,KAAO,EAAIs4hB,EAAW,IACxEluV,EAAY,CAACpqM,EAAO,GAEf72C,EAAI,EAAGA,EAAImvkB,EAAW,EAAGnvkB,IAChCihP,EAAUjhP,GAAKihP,EAAUjhP,EAAI,GAAKovkB,EAKpC,OAFAnuV,EAAUnhP,KAAK,GAERmhP,EAAUzmJ,SACnB,EAsBAtpC,EAAQm+gB,aAAe,SAAuBrjjB,GAK5C,IAJA,IAAIq8Q,EAAS,GACT/sL,EAAMpqD,EAAQg+gB,gBAAgBljjB,GAC9BsjjB,EAAYh0d,EAAI37G,OAEXK,EAAI,EAAGA,EAAIsvkB,EAAWtvkB,IAC7B,IAAK,IAAIogE,EAAI,EAAGA,EAAIkvgB,EAAWlvgB,IAElB,IAANpgE,GAAiB,IAANogE,GACL,IAANpgE,GAAWogE,IAAMkvgB,EAAY,GAC7BtvkB,IAAMsvkB,EAAY,GAAW,IAANlvgB,GAI5BioO,EAAOvoS,KAAK,CAACw7G,EAAIt7G,GAAIs7G,EAAIl7C,KAI7B,OAAOioO,CACT,yBClFA,IAAI7wL,EAAO,EAAQ,OAWf+3d,EAAkB,CACpB,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAC7C,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAC5D,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAC5D,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,KAG1C,SAASC,EAAkBl8iB,GACzBj1B,KAAKwY,KAAO2gG,EAAKi4d,aACjBpxkB,KAAKi1B,KAAOA,CACd,CAEAk8iB,EAAiBE,cAAgB,SAAwB/vkB,GACvD,OAAO,GAAK6nB,KAAKu+B,MAAMpmD,EAAS,GAAUA,EAAS,EAAd,CACvC,EAEA6vkB,EAAiBxwkB,UAAUq2G,UAAY,WACrC,OAAOh3G,KAAKi1B,KAAK3zB,MACnB,EAEA6vkB,EAAiBxwkB,UAAU0wkB,cAAgB,WACzC,OAAOF,EAAiBE,cAAcrxkB,KAAKi1B,KAAK3zB,OAClD,EAEA6vkB,EAAiBxwkB,UAAU0iD,MAAQ,SAAgBiuhB,GACjD,IAAI3vkB,EAIJ,IAAKA,EAAI,EAAGA,EAAI,GAAK3B,KAAKi1B,KAAK3zB,OAAQK,GAAK,EAAG,CAE7C,IAAIqE,EAAgD,GAAxCkrkB,EAAgBh9jB,QAAQlU,KAAKi1B,KAAKtzB,IAG9CqE,GAASkrkB,EAAgBh9jB,QAAQlU,KAAKi1B,KAAKtzB,EAAI,IAG/C2vkB,EAAUr6d,IAAIjxG,EAAO,GACvB,CAIIhG,KAAKi1B,KAAK3zB,OAAS,GACrBgwkB,EAAUr6d,IAAIi6d,EAAgBh9jB,QAAQlU,KAAKi1B,KAAKtzB,IAAK,EAEzD,EAEA+T,EAAOm9C,QAAUs+gB,qBC1DjB,SAASn2d,IACPh7G,KAAKs2C,OAAS,GACdt2C,KAAKsB,OAAS,CAChB,CAEA05G,EAAUr6G,UAAY,CAEpBkiB,IAAK,SAAUrS,GACb,IAAI2nG,EAAWhvF,KAAKu+B,MAAMl3C,EAAQ,GAClC,OAA6D,KAApDxQ,KAAKs2C,OAAO6hE,KAAe,EAAI3nG,EAAQ,EAAM,EACxD,EAEAymG,IAAK,SAAUloG,EAAKzN,GAClB,IAAK,IAAIK,EAAI,EAAGA,EAAIL,EAAQK,IAC1B3B,KAAKo4G,OAA4C,KAAnCrpG,IAASzN,EAASK,EAAI,EAAM,GAE9C,EAEA02G,gBAAiB,WACf,OAAOr4G,KAAKsB,MACd,EAEA82G,OAAQ,SAAUE,GAChB,IAAIH,EAAWhvF,KAAKu+B,MAAM1nD,KAAKsB,OAAS,GACpCtB,KAAKs2C,OAAOh1C,QAAU62G,GACxBn4G,KAAKs2C,OAAO70C,KAAK,GAGf62G,IACFt4G,KAAKs2C,OAAO6hE,IAAc,MAAUn4G,KAAKsB,OAAS,GAGpDtB,KAAKsB,QACP,GAGFoU,EAAOm9C,QAAUmoD,wBCpCjB,IAAIu2d,EAAa,EAAQ,OAOzB,SAASC,EAAWh5hB,GAClB,IAAKA,GAAQA,EAAO,EAClB,MAAM,IAAI1hC,MAAM,qDAGlB9W,KAAKw4C,KAAOA,EACZx4C,KAAKi1B,KAAOs8iB,EAAWtiB,MAAMz2gB,EAAOA,GACpCx4C,KAAKyxkB,YAAcF,EAAWtiB,MAAMz2gB,EAAOA,EAC7C,CAWAg5hB,EAAU7wkB,UAAUyW,IAAM,SAAUsjG,EAAKrlD,EAAKrvD,EAAO0rkB,GACnD,IAAIlhkB,EAAQkqG,EAAM16G,KAAKw4C,KAAO6c,EAC9Br1D,KAAKi1B,KAAKzkB,GAASxK,EACf0rkB,IAAU1xkB,KAAKyxkB,YAAYjhkB,IAAS,EAC1C,EASAghkB,EAAU7wkB,UAAUkiB,IAAM,SAAU63F,EAAKrlD,GACvC,OAAOr1D,KAAKi1B,KAAKylF,EAAM16G,KAAKw4C,KAAO6c,EACrC,EAUAm8gB,EAAU7wkB,UAAUq0N,IAAM,SAAUt6G,EAAKrlD,EAAKrvD,GAC5ChG,KAAKi1B,KAAKylF,EAAM16G,KAAKw4C,KAAO6c,IAAQrvD,CACtC,EASAwrkB,EAAU7wkB,UAAUgxkB,WAAa,SAAUj3d,EAAKrlD,GAC9C,OAAOr1D,KAAKyxkB,YAAY/2d,EAAM16G,KAAKw4C,KAAO6c,EAC5C,EAEA3/C,EAAOm9C,QAAU2+gB,yBClEjB,IAAID,EAAa,EAAQ,OACrBp4d,EAAO,EAAQ,OAEnB,SAASy4d,EAAU38iB,GACjBj1B,KAAKwY,KAAO2gG,EAAK04d,KACjB7xkB,KAAKi1B,KAAOs8iB,EAAWx4jB,KAAKkc,EAC9B,CAEA28iB,EAASP,cAAgB,SAAwB/vkB,GAC/C,OAAgB,EAATA,CACT,EAEAswkB,EAASjxkB,UAAUq2G,UAAY,WAC7B,OAAOh3G,KAAKi1B,KAAK3zB,MACnB,EAEAswkB,EAASjxkB,UAAU0wkB,cAAgB,WACjC,OAAOO,EAASP,cAAcrxkB,KAAKi1B,KAAK3zB,OAC1C,EAEAswkB,EAASjxkB,UAAU0iD,MAAQ,SAAUiuhB,GACnC,IAAK,IAAI3vkB,EAAI,EAAG0yC,EAAIr0C,KAAKi1B,KAAK3zB,OAAQK,EAAI0yC,EAAG1yC,IAC3C2vkB,EAAUr6d,IAAIj3G,KAAKi1B,KAAKtzB,GAAI,EAEhC,EAEA+T,EAAOm9C,QAAU++gB,yBC1BjB,IAAIE,EAAU,EAAQ,OAElBC,EAAkB,CAEpB,EAAG,EAAG,EAAG,EACT,EAAG,EAAG,EAAG,EACT,EAAG,EAAG,EAAG,EACT,EAAG,EAAG,EAAG,EACT,EAAG,EAAG,EAAG,EACT,EAAG,EAAG,EAAG,EACT,EAAG,EAAG,EAAG,EACT,EAAG,EAAG,EAAG,EACT,EAAG,EAAG,EAAG,EACT,EAAG,EAAG,EAAG,EACT,EAAG,EAAG,EAAG,GACT,EAAG,EAAG,GAAI,GACV,EAAG,EAAG,GAAI,GACV,EAAG,EAAG,GAAI,GACV,EAAG,GAAI,GAAI,GACX,EAAG,GAAI,GAAI,GACX,EAAG,GAAI,GAAI,GACX,EAAG,GAAI,GAAI,GACX,EAAG,GAAI,GAAI,GACX,EAAG,GAAI,GAAI,GACX,EAAG,GAAI,GAAI,GACX,EAAG,GAAI,GAAI,GACX,EAAG,GAAI,GAAI,GACX,GAAI,GAAI,GAAI,GACZ,GAAI,GAAI,GAAI,GACZ,GAAI,GAAI,GAAI,GACZ,GAAI,GAAI,GAAI,GACZ,GAAI,GAAI,GAAI,GACZ,GAAI,GAAI,GAAI,GACZ,GAAI,GAAI,GAAI,GACZ,GAAI,GAAI,GAAI,GACZ,GAAI,GAAI,GAAI,GACZ,GAAI,GAAI,GAAI,GACZ,GAAI,GAAI,GAAI,GACZ,GAAI,GAAI,GAAI,GACZ,GAAI,GAAI,GAAI,GACZ,GAAI,GAAI,GAAI,GACZ,GAAI,GAAI,GAAI,GACZ,GAAI,GAAI,GAAI,GACZ,GAAI,GAAI,GAAI,IAGVC,EAAqB,CAEvB,EAAG,GAAI,GAAI,GACX,GAAI,GAAI,GAAI,GACZ,GAAI,GAAI,GAAI,GACZ,GAAI,GAAI,GAAI,GACZ,GAAI,GAAI,GAAI,GACZ,GAAI,GAAI,GAAI,IACZ,GAAI,GAAI,IAAK,IACb,GAAI,GAAI,IAAK,IACb,GAAI,IAAK,IAAK,IACd,GAAI,IAAK,IAAK,IACd,GAAI,IAAK,IAAK,IACd,GAAI,IAAK,IAAK,IACd,IAAK,IAAK,IAAK,IACf,IAAK,IAAK,IAAK,IACf,IAAK,IAAK,IAAK,IACf,IAAK,IAAK,IAAK,IACf,IAAK,IAAK,IAAK,IACf,IAAK,IAAK,IAAK,IACf,IAAK,IAAK,IAAK,IACf,IAAK,IAAK,IAAK,IACf,IAAK,IAAK,IAAK,IACf,IAAK,IAAK,IAAK,IACf,IAAK,IAAK,IAAK,IACf,IAAK,IAAK,IAAK,IACf,IAAK,IAAK,IAAK,KACf,IAAK,IAAK,IAAK,KACf,IAAK,IAAK,KAAM,KAChB,IAAK,IAAK,KAAM,KAChB,IAAK,IAAK,KAAM,KAChB,IAAK,IAAK,KAAM,KAChB,IAAK,IAAK,KAAM,KAChB,IAAK,IAAK,KAAM,KAChB,IAAK,IAAK,KAAM,KAChB,IAAK,KAAM,KAAM,KACjB,IAAK,KAAM,KAAM,KACjB,IAAK,KAAM,KAAM,KACjB,IAAK,KAAM,KAAM,KACjB,IAAK,KAAM,KAAM,KACjB,IAAK,KAAM,KAAM,KACjB,IAAK,KAAM,KAAM,MAWnBn/gB,EAAQo/gB,eAAiB,SAAyBtkjB,EAASukjB,GACzD,OAAQA,GACN,KAAKJ,EAAQ7vgB,EACX,OAAO8vgB,EAAgC,GAAfpkjB,EAAU,GAAS,GAC7C,KAAKmkjB,EAAQ16d,EACX,OAAO26d,EAAgC,GAAfpkjB,EAAU,GAAS,GAC7C,KAAKmkjB,EAAQz6d,EACX,OAAO06d,EAAgC,GAAfpkjB,EAAU,GAAS,GAC7C,KAAKmkjB,EAAQx6d,EACX,OAAOy6d,EAAgC,GAAfpkjB,EAAU,GAAS,GAC7C,QACE,OAEN,EAUAklC,EAAQs/gB,uBAAyB,SAAiCxkjB,EAASukjB,GACzE,OAAQA,GACN,KAAKJ,EAAQ7vgB,EACX,OAAO+vgB,EAAmC,GAAfrkjB,EAAU,GAAS,GAChD,KAAKmkjB,EAAQ16d,EACX,OAAO46d,EAAmC,GAAfrkjB,EAAU,GAAS,GAChD,KAAKmkjB,EAAQz6d,EACX,OAAO26d,EAAmC,GAAfrkjB,EAAU,GAAS,GAChD,KAAKmkjB,EAAQx6d,EACX,OAAO06d,EAAmC,GAAfrkjB,EAAU,GAAS,GAChD,QACE,OAEN,uBCtIAklC,EAAQoP,EAAI,CAAEq2C,IAAK,GACnBzlD,EAAQukD,EAAI,CAAEkB,IAAK,GACnBzlD,EAAQwkD,EAAI,CAAEiB,IAAK,GACnBzlD,EAAQykD,EAAI,CAAEgB,IAAK,GA+BnBzlD,EAAQmC,QAAU,SAAkBoM,GAClC,OAAOA,GAA8B,qBAAdA,EAAMk3C,KAC3Bl3C,EAAMk3C,KAAO,GAAKl3C,EAAMk3C,IAAM,CAClC,EAEAzlD,EAAQ95C,KAAO,SAAe/S,EAAOoyC,GACnC,GAAIya,EAAQmC,QAAQhvD,GAClB,OAAOA,EAGT,IACE,OAxCJ,SAAqBiB,GACnB,GAAsB,kBAAXA,EACT,MAAM,IAAI6P,MAAM,yBAKlB,OAFY7P,EAAOb,eAGjB,IAAK,IACL,IAAK,MACH,OAAOysD,EAAQoP,EAEjB,IAAK,IACL,IAAK,SACH,OAAOpP,EAAQukD,EAEjB,IAAK,IACL,IAAK,WACH,OAAOvkD,EAAQwkD,EAEjB,IAAK,IACL,IAAK,OACH,OAAOxkD,EAAQykD,EAEjB,QACE,MAAM,IAAIxgG,MAAM,qBAAuB7P,GAE7C,CAaW0tN,CAAW3uN,EACpB,CAAE,MAAO7D,GACP,OAAOi2C,CACT,CACF,wBCjDA,IAAIw4hB,EAAgB,uBAUpB/9gB,EAAQm+gB,aAAe,SAAuBrjjB,GAC5C,IAAI6qB,EAAOo4hB,EAAcjjjB,GAEzB,MAAO,CAEL,CAAC,EAAG,GAEJ,CAAC6qB,EAhBqB,EAgBO,GAE7B,CAAC,EAAGA,EAlBkB,GAoB1B,yBCrBA,IAAI45hB,EAAQ,EAAQ,OAIhBC,EAAUD,EAAMv4d,YAFV,MAcVhnD,EAAQy/gB,eAAiB,SAAyBJ,EAAsBp+X,GAItE,IAHA,IAAI7+K,EAASi9iB,EAAqB55d,KAAO,EAAKw7F,EAC1ClqI,EAAI30C,GAAQ,GAETm9iB,EAAMv4d,YAAYjwC,GAAKyogB,GAAW,GACvCzogB,GAnBM,MAmBQwogB,EAAMv4d,YAAYjwC,GAAKyogB,EAMvC,OAxBa,OAwBJp9iB,GAAQ,GAAM20C,EACzB,wBC5BA,IAAI2ngB,EAAa,EAAQ,OAErB34d,EAAY24d,EAAWtiB,MAAM,KAC7Bv2c,EAAY64d,EAAWtiB,MAAM,MAS/B,WAEA,IADA,IAAItgiB,EAAI,EACChtB,EAAI,EAAGA,EAAI,IAAKA,IACvBi3G,EAAUj3G,GAAKgtB,EACf+pF,EAAU/pF,GAAKhtB,EAMP,KAJRgtB,IAAM,KAKJA,GAAK,KAQT,IAAKhtB,EAAI,IAAKA,EAAI,IAAKA,IACrBi3G,EAAUj3G,GAAKi3G,EAAUj3G,EAAI,IAEjC,CAtBC,GA8BDkxD,EAAQyV,IAAM,SAAcxvD,GAC1B,GAAIA,EAAI,EAAG,MAAM,IAAIhC,MAAM,OAASgC,EAAI,KACxC,OAAO4/F,EAAU5/F,EACnB,EAQA+5C,EAAQqG,IAAM,SAAcpgD,GAC1B,OAAO8/F,EAAU9/F,EACnB,EASA+5C,EAAQovF,IAAM,SAActzH,EAAGE,GAC7B,OAAU,IAANF,GAAiB,IAANE,EAAgB,EAIxB+pF,EAAUF,EAAU/pF,GAAK+pF,EAAU7pF,GAC5C,yBCtEA,IAAIsqF,EAAO,EAAQ,OACfi5d,EAAQ,EAAQ,OAEpB,SAASG,EAAWt9iB,GAClBj1B,KAAKwY,KAAO2gG,EAAKq5d,MACjBxykB,KAAKi1B,KAAOA,CACd,CAEAs9iB,EAAUlB,cAAgB,SAAwB/vkB,GAChD,OAAgB,GAATA,CACT,EAEAixkB,EAAU5xkB,UAAUq2G,UAAY,WAC9B,OAAOh3G,KAAKi1B,KAAK3zB,MACnB,EAEAixkB,EAAU5xkB,UAAU0wkB,cAAgB,WAClC,OAAOkB,EAAUlB,cAAcrxkB,KAAKi1B,KAAK3zB,OAC3C,EAEAixkB,EAAU5xkB,UAAU0iD,MAAQ,SAAUiuhB,GACpC,IAAI3vkB,EAKJ,IAAKA,EAAI,EAAGA,EAAI3B,KAAKi1B,KAAK3zB,OAAQK,IAAK,CACrC,IAAIqE,EAAQoskB,EAAMK,OAAOzykB,KAAKi1B,KAAKtzB,IAGnC,GAAIqE,GAAS,OAAUA,GAAS,MAE9BA,GAAS,UAGJ,MAAIA,GAAS,OAAUA,GAAS,OAIrC,MAAM,IAAI8Q,MACR,2BAA6B9W,KAAKi1B,KAAKtzB,GAAvC,qCAHFqE,GAAS,KAKX,CAIAA,EAAkC,KAAvBA,IAAU,EAAK,MAAyB,IAARA,GAG3CsrkB,EAAUr6d,IAAIjxG,EAAO,GACvB,CACF,EAEA0P,EAAOm9C,QAAU0/gB,uBCjDjB1/gB,EAAQ6/gB,SAAW,CACjBC,WAAY,EACZC,WAAY,EACZC,WAAY,EACZC,WAAY,EACZC,WAAY,EACZC,WAAY,EACZC,WAAY,EACZC,WAAY,GAOd,IAAIC,EACE,EADFA,EAEE,EAFFA,EAGE,GAHFA,EAIE,GAkJN,SAASC,EAAWl5d,EAAav4G,EAAGogE,GAClC,OAAQm4C,GACN,KAAKrnD,EAAQ6/gB,SAASC,WAAY,OAAQhxkB,EAAIogE,GAAK,IAAM,EACzD,KAAKlP,EAAQ6/gB,SAASE,WAAY,OAAOjxkB,EAAI,IAAM,EACnD,KAAKkxD,EAAQ6/gB,SAASG,WAAY,OAAO9wgB,EAAI,IAAM,EACnD,KAAKlP,EAAQ6/gB,SAASI,WAAY,OAAQnxkB,EAAIogE,GAAK,IAAM,EACzD,KAAKlP,EAAQ6/gB,SAASK,WAAY,OAAQ5pjB,KAAKu+B,MAAM/lD,EAAI,GAAKwnB,KAAKu+B,MAAMqa,EAAI,IAAM,IAAM,EACzF,KAAKlP,EAAQ6/gB,SAASM,WAAY,OAAQrxkB,EAAIogE,EAAK,EAAKpgE,EAAIogE,EAAK,IAAM,EACvE,KAAKlP,EAAQ6/gB,SAASO,WAAY,OAAStxkB,EAAIogE,EAAK,EAAKpgE,EAAIogE,EAAK,GAAK,IAAM,EAC7E,KAAKlP,EAAQ6/gB,SAASQ,WAAY,OAASvxkB,EAAIogE,EAAK,GAAKpgE,EAAIogE,GAAK,GAAK,IAAM,EAE7E,QAAS,MAAM,IAAIjrD,MAAM,mBAAqBojG,GAElD,CAtJArnD,EAAQmC,QAAU,SAAkB8+I,GAClC,OAAe,MAARA,GAAyB,KAATA,IAAgBrxG,MAAMqxG,IAASA,GAAQ,GAAKA,GAAQ,CAC7E,EASAjhJ,EAAQ95C,KAAO,SAAe/S,GAC5B,OAAO6sD,EAAQmC,QAAQhvD,GAASszD,SAAStzD,EAAO,SAAM9F,CACxD,EASA2yD,EAAQwghB,aAAe,SAAuBp+iB,GAQ5C,IAPA,IAAIujB,EAAOvjB,EAAKujB,KACZ86hB,EAAS,EACTC,EAAe,EACfC,EAAe,EACfC,EAAU,KACVr6G,EAAU,KAEL1+W,EAAM,EAAGA,EAAMliE,EAAMkiE,IAAO,CACnC64d,EAAeC,EAAe,EAC9BC,EAAUr6G,EAAU,KAEpB,IAAK,IAAI/ja,EAAM,EAAGA,EAAM7c,EAAM6c,IAAO,CACnC,IAAI3/C,EAASuf,EAAKpS,IAAI63F,EAAKrlD,GACvB3/C,IAAW+9jB,EACbF,KAEIA,GAAgB,IAAGD,GAAUH,GAAoBI,EAAe,IACpEE,EAAU/9jB,EACV69jB,EAAe,IAGjB79jB,EAASuf,EAAKpS,IAAIwyC,EAAKqlD,MACR0+W,EACbo6G,KAEIA,GAAgB,IAAGF,GAAUH,GAAoBK,EAAe,IACpEp6G,EAAU1jd,EACV89jB,EAAe,EAEnB,CAEID,GAAgB,IAAGD,GAAUH,GAAoBI,EAAe,IAChEC,GAAgB,IAAGF,GAAUH,GAAoBK,EAAe,GACtE,CAEA,OAAOF,CACT,EAOAzghB,EAAQ6ghB,aAAe,SAAuBz+iB,GAI5C,IAHA,IAAIujB,EAAOvjB,EAAKujB,KACZ86hB,EAAS,EAEJ54d,EAAM,EAAGA,EAAMliE,EAAO,EAAGkiE,IAChC,IAAK,IAAIrlD,EAAM,EAAGA,EAAM7c,EAAO,EAAG6c,IAAO,CACvC,IAAIy6R,EAAO76T,EAAKpS,IAAI63F,EAAKrlD,GACvBpgC,EAAKpS,IAAI63F,EAAKrlD,EAAM,GACpBpgC,EAAKpS,IAAI63F,EAAM,EAAGrlD,GAClBpgC,EAAKpS,IAAI63F,EAAM,EAAGrlD,EAAM,GAEb,IAATy6R,GAAuB,IAATA,GAAYwjP,GAChC,CAGF,OAAOA,EAASH,CAClB,EAQAtghB,EAAQ8ghB,aAAe,SAAuB1+iB,GAM5C,IALA,IAAIujB,EAAOvjB,EAAKujB,KACZ86hB,EAAS,EACTM,EAAU,EACVC,EAAU,EAELn5d,EAAM,EAAGA,EAAMliE,EAAMkiE,IAAO,CACnCk5d,EAAUC,EAAU,EACpB,IAAK,IAAIx+gB,EAAM,EAAGA,EAAM7c,EAAM6c,IAC5Bu+gB,EAAYA,GAAW,EAAK,KAAS3+iB,EAAKpS,IAAI63F,EAAKrlD,GAC/CA,GAAO,KAAmB,OAAZu+gB,GAAiC,KAAZA,IAAoBN,IAE3DO,EAAYA,GAAW,EAAK,KAAS5+iB,EAAKpS,IAAIwyC,EAAKqlD,GAC/CrlD,GAAO,KAAmB,OAAZw+gB,GAAiC,KAAZA,IAAoBP,GAE/D,CAEA,OAAOA,EAASH,CAClB,EAUAtghB,EAAQihhB,aAAe,SAAuB7+iB,GAI5C,IAHA,IAAI4lF,EAAY,EACZk5d,EAAe9+iB,EAAKA,KAAK3zB,OAEpBK,EAAI,EAAGA,EAAIoykB,EAAcpykB,IAAKk5G,GAAa5lF,EAAKA,KAAKtzB,GAI9D,OAFQwnB,KAAK0H,IAAI1H,KAAKusE,KAAkB,IAAZmlB,EAAkBk5d,EAAgB,GAAK,IAExDZ,CACb,EA+BAtghB,EAAQmhhB,UAAY,SAAoBz3d,EAAStnF,GAG/C,IAFA,IAAIujB,EAAOvjB,EAAKujB,KAEP6c,EAAM,EAAGA,EAAM7c,EAAM6c,IAC5B,IAAK,IAAIqlD,EAAM,EAAGA,EAAMliE,EAAMkiE,IACxBzlF,EAAK08iB,WAAWj3d,EAAKrlD,IACzBpgC,EAAK+/L,IAAIt6G,EAAKrlD,EAAK+9gB,EAAU72d,EAAS7B,EAAKrlD,GAGjD,EAQAxC,EAAQohhB,YAAc,SAAsBh/iB,EAAMi/iB,GAKhD,IAJA,IAAIC,EAAcjskB,OAAO6C,KAAK8nD,EAAQ6/gB,UAAUpxkB,OAC5C8ykB,EAAc,EACdC,EAAe7hf,IAEVvvE,EAAI,EAAGA,EAAIkxjB,EAAalxjB,IAAK,CACpCixjB,EAAgBjxjB,GAChB4vC,EAAQmhhB,UAAU/wjB,EAAGgS,GAGrB,IAAIq/iB,EACFzhhB,EAAQwghB,aAAap+iB,GACrB49B,EAAQ6ghB,aAAaz+iB,GACrB49B,EAAQ8ghB,aAAa1+iB,GACrB49B,EAAQihhB,aAAa7+iB,GAGvB49B,EAAQmhhB,UAAU/wjB,EAAGgS,GAEjBq/iB,EAAUD,IACZA,EAAeC,EACfF,EAAcnxjB,EAElB,CAEA,OAAOmxjB,CACT,yBCzOA,IAAIG,EAAe,EAAQ,OACvBC,EAAQ,EAAQ,OASpB3hhB,EAAQ4hhB,QAAU,CAChBpwkB,GAAI,UACJi0G,IAAK,EACLo8d,OAAQ,CAAC,GAAI,GAAI,KAYnB7hhB,EAAQu+gB,aAAe,CACrB/skB,GAAI,eACJi0G,IAAK,EACLo8d,OAAQ,CAAC,EAAG,GAAI,KAQlB7hhB,EAAQg/gB,KAAO,CACbxtkB,GAAI,OACJi0G,IAAK,EACLo8d,OAAQ,CAAC,EAAG,GAAI,KAYlB7hhB,EAAQ2/gB,MAAQ,CACdnukB,GAAI,QACJi0G,IAAK,EACLo8d,OAAQ,CAAC,EAAG,GAAI,KASlB7hhB,EAAQ8hhB,MAAQ,CACdr8d,KAAM,GAWRzlD,EAAQ+hhB,sBAAwB,SAAgCp8jB,EAAMmV,GACpE,IAAKnV,EAAKk8jB,OAAQ,MAAM,IAAI59jB,MAAM,iBAAmB0B,GAErD,IAAK+7jB,EAAav/gB,QAAQrnC,GACxB,MAAM,IAAI7W,MAAM,oBAAsB6W,GAGxC,OAAIA,GAAW,GAAKA,EAAU,GAAWnV,EAAKk8jB,OAAO,GAC5C/mjB,EAAU,GAAWnV,EAAKk8jB,OAAO,GACnCl8jB,EAAKk8jB,OAAO,EACrB,EAQA7hhB,EAAQgihB,mBAAqB,SAA6BC,GACxD,OAAIN,EAAMO,YAAYD,GAAiBjihB,EAAQ4hhB,QACtCD,EAAMQ,iBAAiBF,GAAiBjihB,EAAQu+gB,aAChDoD,EAAMS,UAAUH,GAAiBjihB,EAAQ2/gB,MACtC3/gB,EAAQg/gB,IACtB,EAQAh/gB,EAAQntD,SAAW,SAAmB8S,GACpC,GAAIA,GAAQA,EAAKnU,GAAI,OAAOmU,EAAKnU,GACjC,MAAM,IAAIyS,MAAM,eAClB,EAQA+7C,EAAQmC,QAAU,SAAkBx8C,GAClC,OAAOA,GAAQA,EAAK8/F,KAAO9/F,EAAKk8jB,MAClC,EAqCA7hhB,EAAQ95C,KAAO,SAAe/S,EAAOoyC,GACnC,GAAIya,EAAQmC,QAAQhvD,GAClB,OAAOA,EAGT,IACE,OAnCJ,SAAqBiB,GACnB,GAAsB,kBAAXA,EACT,MAAM,IAAI6P,MAAM,yBAKlB,OAFY7P,EAAOb,eAGjB,IAAK,UACH,OAAOysD,EAAQ4hhB,QACjB,IAAK,eACH,OAAO5hhB,EAAQu+gB,aACjB,IAAK,QACH,OAAOv+gB,EAAQ2/gB,MACjB,IAAK,OACH,OAAO3/gB,EAAQg/gB,KACjB,QACE,MAAM,IAAI/6jB,MAAM,iBAAmB7P,GAEzC,CAgBW0tN,CAAW3uN,EACpB,CAAE,MAAO7D,GACP,OAAOi2C,CACT,CACF,yBCtKA,IAAI+gE,EAAO,EAAQ,OAEnB,SAAS+7d,EAAajgjB,GACpBj1B,KAAKwY,KAAO2gG,EAAKs7d,QACjBz0kB,KAAKi1B,KAAOA,EAAKvvB,UACnB,CAEAwvkB,EAAY7D,cAAgB,SAAwB/vkB,GAClD,OAAO,GAAK6nB,KAAKu+B,MAAMpmD,EAAS,IAAOA,EAAS,EAAOA,EAAS,EAAK,EAAI,EAAK,EAChF,EAEA4zkB,EAAYv0kB,UAAUq2G,UAAY,WAChC,OAAOh3G,KAAKi1B,KAAK3zB,MACnB,EAEA4zkB,EAAYv0kB,UAAU0wkB,cAAgB,WACpC,OAAO6D,EAAY7D,cAAcrxkB,KAAKi1B,KAAK3zB,OAC7C,EAEA4zkB,EAAYv0kB,UAAU0iD,MAAQ,SAAgBiuhB,GAC5C,IAAI3vkB,EAAG+nK,EAAO1jK,EAId,IAAKrE,EAAI,EAAGA,EAAI,GAAK3B,KAAKi1B,KAAK3zB,OAAQK,GAAK,EAC1C+nK,EAAQ1pK,KAAKi1B,KAAKi/B,OAAOvyD,EAAG,GAC5BqE,EAAQszD,SAASowG,EAAO,IAExB4na,EAAUr6d,IAAIjxG,EAAO,IAKvB,IAAImvkB,EAAen1kB,KAAKi1B,KAAK3zB,OAASK,EAClCwzkB,EAAe,IACjBzra,EAAQ1pK,KAAKi1B,KAAKi/B,OAAOvyD,GACzBqE,EAAQszD,SAASowG,EAAO,IAExB4na,EAAUr6d,IAAIjxG,EAAsB,EAAfmvkB,EAAmB,GAE5C,EAEAz/jB,EAAOm9C,QAAUqihB,yBC1CjB,IAAI3D,EAAa,EAAQ,OACrB6D,EAAK,EAAQ,MASjBvihB,EAAQovF,IAAM,SAAc17I,EAAIC,GAG9B,IAFA,IAAI6ukB,EAAQ9D,EAAWtiB,MAAM1ojB,EAAGjF,OAASkF,EAAGlF,OAAS,GAE5CK,EAAI,EAAGA,EAAI4E,EAAGjF,OAAQK,IAC7B,IAAK,IAAIogE,EAAI,EAAGA,EAAIv7D,EAAGlF,OAAQygE,IAC7BszgB,EAAM1zkB,EAAIogE,IAAMqzgB,EAAGnzb,IAAI17I,EAAG5E,GAAI6E,EAAGu7D,IAIrC,OAAOszgB,CACT,EASAxihB,EAAQomD,IAAM,SAAcq8d,EAAUphQ,GAGpC,IAFA,IAAI1sU,EAAS+pkB,EAAWx4jB,KAAKu8jB,GAErB9tkB,EAAOlG,OAAS4yU,EAAQ5yU,QAAW,GAAG,CAG5C,IAFA,IAAI+zkB,EAAQ7tkB,EAAO,GAEV7F,EAAI,EAAGA,EAAIuyU,EAAQ5yU,OAAQK,IAClC6F,EAAO7F,IAAMyzkB,EAAGnzb,IAAIiyL,EAAQvyU,GAAI0zkB,GAKlC,IADA,IAAIx8iB,EAAS,EACNA,EAASrxB,EAAOlG,QAA6B,IAAnBkG,EAAOqxB,IAAeA,IACvDrxB,EAASA,EAAOyJ,MAAM4nB,EACxB,CAEA,OAAOrxB,CACT,EASAqrD,EAAQ0ihB,qBAAuB,SAA+BC,GAE5D,IADA,IAAIC,EAAOlE,EAAWx4jB,KAAK,CAAC,IACnBpX,EAAI,EAAGA,EAAI6zkB,EAAQ7zkB,IAC1B8zkB,EAAO5ihB,EAAQovF,IAAIwzb,EAAM,CAAC,EAAGL,EAAGl8gB,IAAIv3D,KAGtC,OAAO8zkB,CACT,yBC9DA,IAAIlE,EAAa,EAAQ,OACrBa,EAAQ,EAAQ,OAChBN,EAAU,EAAQ,OAClB92d,EAAY,EAAQ,OACpBw2d,EAAY,EAAQ,MACpBkE,EAAmB,EAAQ,MAC3BC,EAAgB,EAAQ,MACxBC,EAAc,EAAQ,OACtBC,EAAS,EAAQ,OACjBC,EAAqB,EAAQ,OAC7BC,EAAU,EAAQ,OAClBC,EAAa,EAAQ,OACrB78d,EAAO,EAAQ,OACf88d,EAAW,EAAQ,OACnB/ukB,EAAU,EAAQ,OAqItB,SAASgvkB,EAAiBC,EAAQjE,EAAsBh4d,GACtD,IAEIv4G,EAAGs3G,EAFHzgE,EAAO29hB,EAAO39hB,KACd0kE,EAAO84d,EAAW1D,eAAeJ,EAAsBh4d,GAG3D,IAAKv4G,EAAI,EAAGA,EAAI,GAAIA,IAClBs3G,EAA4B,KAApBiE,GAAQv7G,EAAK,GAGjBA,EAAI,EACNw0kB,EAAO/+jB,IAAIzV,EAAG,EAAGs3G,GAAK,GACbt3G,EAAI,EACbw0kB,EAAO/+jB,IAAIzV,EAAI,EAAG,EAAGs3G,GAAK,GAE1Bk9d,EAAO/+jB,IAAIohC,EAAO,GAAK72C,EAAG,EAAGs3G,GAAK,GAIhCt3G,EAAI,EACNw0kB,EAAO/+jB,IAAI,EAAGohC,EAAO72C,EAAI,EAAGs3G,GAAK,GACxBt3G,EAAI,EACbw0kB,EAAO/+jB,IAAI,EAAG,GAAKzV,EAAI,EAAI,EAAGs3G,GAAK,GAEnCk9d,EAAO/+jB,IAAI,EAAG,GAAKzV,EAAI,EAAGs3G,GAAK,GAKnCk9d,EAAO/+jB,IAAIohC,EAAO,EAAG,EAAG,GAAG,EAC7B,CAwDA,SAAS4jE,EAAYzuF,EAASukjB,EAAsBkE,GAElD,IAAI9/hB,EAAS,IAAI0kE,EAEjBo7d,EAAS/zkB,SAAQ,SAAU4yB,GAEzBqhB,EAAO2gE,IAAIhiF,EAAKzc,KAAK8/F,IAAK,GAS1BhiE,EAAO2gE,IAAIhiF,EAAK+hF,YAAamC,EAAKy7d,sBAAsB3/iB,EAAKzc,KAAMmV,IAGnEsH,EAAKouB,MAAM/M,EACb,IAGA,IAEI+/hB,EAA+D,GAF9CjE,EAAMkE,wBAAwB3ojB,GAC5BkojB,EAAO1D,uBAAuBxkjB,EAASukjB,IAiB9D,IATI57hB,EAAO+hE,kBAAoB,GAAKg+d,GAClC//hB,EAAO2gE,IAAI,EAAG,GAQT3gE,EAAO+hE,kBAAoB,IAAM,GACtC/hE,EAAO8hE,OAAO,GAQhB,IADA,IAAIm+d,GAAiBF,EAAyB//hB,EAAO+hE,mBAAqB,EACjE12G,EAAI,EAAGA,EAAI40kB,EAAe50kB,IACjC20C,EAAO2gE,IAAIt1G,EAAI,EAAI,GAAO,IAAM,GAGlC,OAYF,SAA0B2vkB,EAAW3jjB,EAASukjB,GAmC5C,IAjCA,IAAIsE,EAAiBpE,EAAMkE,wBAAwB3ojB,GAG/C8ojB,EAAmBZ,EAAO1D,uBAAuBxkjB,EAASukjB,GAG1DwE,EAAqBF,EAAiBC,EAGtCE,EAAgBd,EAAO5D,eAAetkjB,EAASukjB,GAI/C0E,EAAiBD,EADAH,EAAiBG,EAGlCE,EAAyB1tjB,KAAKu+B,MAAM8uhB,EAAiBG,GAErDG,EAAwB3tjB,KAAKu+B,MAAMgvhB,EAAqBC,GACxDI,EAAwBD,EAAwB,EAGhDh5d,EAAU+4d,EAAyBC,EAGnCE,EAAK,IAAIlB,EAAmBh4d,GAE5BjlF,EAAS,EACTo+iB,EAAS,IAAIhzkB,MAAM0ykB,GACnBO,EAAS,IAAIjzkB,MAAM0ykB,GACnBQ,EAAc,EACd7giB,EAASi7hB,EAAWx4jB,KAAKu4jB,EAAUh7hB,QAG9BzY,EAAI,EAAGA,EAAI84iB,EAAe94iB,IAAK,CACtC,IAAIu5iB,EAAWv5iB,EAAI+4iB,EAAiBE,EAAwBC,EAG5DE,EAAOp5iB,GAAKyY,EAAOrlC,MAAM4nB,EAAQA,EAASu+iB,GAG1CF,EAAOr5iB,GAAKm5iB,EAAGj7hB,OAAOk7hB,EAAOp5iB,IAE7BhF,GAAUu+iB,EACVD,EAAchujB,KAAK+D,IAAIiqjB,EAAaC,EACtC,CAIA,IAEIz1kB,EAAGqvF,EAFH/7D,EAAOs8iB,EAAWtiB,MAAMunB,GACxBhmkB,EAAQ,EAIZ,IAAK7O,EAAI,EAAGA,EAAIw1kB,EAAax1kB,IAC3B,IAAKqvF,EAAI,EAAGA,EAAI2lf,EAAe3lf,IACzBrvF,EAAIs1kB,EAAOjmf,GAAG1vF,SAChB2zB,EAAKzkB,KAAWymkB,EAAOjmf,GAAGrvF,IAMhC,IAAKA,EAAI,EAAGA,EAAIm8G,EAASn8G,IACvB,IAAKqvF,EAAI,EAAGA,EAAI2lf,EAAe3lf,IAC7B/7D,EAAKzkB,KAAW0mkB,EAAOlmf,GAAGrvF,GAI9B,OAAOszB,CACT,CAnFSoijB,CAAgB/giB,EAAQ3oB,EAASukjB,EAC1C,CA6FA,SAASoF,EAAcrijB,EAAMtH,EAASukjB,EAAsBh4d,GAC1D,IAAIk8d,EAEJ,GAAIlvkB,EAAQ+tB,GACVmhjB,EAAWH,EAASlzM,UAAU9tW,OACzB,IAAoB,kBAATA,EAehB,MAAM,IAAIne,MAAM,gBAdhB,IAAIygkB,EAAmB5pjB,EAEvB,IAAK4pjB,EAAkB,CACrB,IAAIC,EAAcvB,EAASwB,SAASxijB,GAGpCsijB,EAAmBxB,EAAQ2B,sBAAsBF,EAC/CtF,EACJ,CAIAkE,EAAWH,EAASthX,WAAW1/L,EAAMsijB,GAAoB,GAG3D,CAGA,IAAII,EAAc5B,EAAQ2B,sBAAsBtB,EAC5ClE,GAGJ,IAAKyF,EACH,MAAM,IAAI7gkB,MAAM,2DAIlB,GAAK6W,GAIE,GAAIA,EAAUgqjB,EACnB,MAAM,IAAI7gkB,MAAM,wHAE0C6gkB,EAAc,YANxEhqjB,EAAUgqjB,EAUZ,IAAIC,EAAWx7d,EAAWzuF,EAASukjB,EAAsBkE,GAGrD77d,EAAc63d,EAAMxB,cAAcjjjB,GAClCytF,EAAU,IAAIo2d,EAAUj3d,GAgC5B,OA3ZF,SAA6B47d,EAAQxojB,GAInC,IAHA,IAAI6qB,EAAO29hB,EAAO39hB,KACdykE,EAAM04d,EAAc3E,aAAarjjB,GAE5BhsB,EAAI,EAAGA,EAAIs7G,EAAI37G,OAAQK,IAI9B,IAHA,IAAI+4G,EAAMuC,EAAIt7G,GAAG,GACb0zD,EAAM4nD,EAAIt7G,GAAG,GAERqvF,GAAK,EAAGA,GAAK,EAAGA,IACvB,KAAI0pB,EAAM1pB,IAAM,GAAKx4C,GAAQkiE,EAAM1pB,GAEnC,IAAK,IAAIpjC,GAAK,EAAGA,GAAK,EAAGA,IACnByH,EAAMzH,IAAM,GAAKpV,GAAQ6c,EAAMzH,IAE9BojC,GAAK,GAAKA,GAAK,IAAY,IAANpjC,GAAiB,IAANA,IAClCA,GAAK,GAAKA,GAAK,IAAY,IAANojC,GAAiB,IAANA,IAChCA,GAAK,GAAKA,GAAK,GAAKpjC,GAAK,GAAKA,GAAK,EACpCuohB,EAAO/+jB,IAAIsjG,EAAM1pB,EAAG37B,EAAMzH,GAAG,GAAM,GAEnCuohB,EAAO/+jB,IAAIsjG,EAAM1pB,EAAG37B,EAAMzH,GAAG,GAAO,GAK9C,CAsWEiqhB,CAAmBz8d,EAASztF,GA7V9B,SAA6BwojB,GAG3B,IAFA,IAAI39hB,EAAO29hB,EAAO39hB,KAETw4C,EAAI,EAAGA,EAAIx4C,EAAO,EAAGw4C,IAAK,CACjC,IAAIhrF,EAAQgrF,EAAI,IAAM,EACtBmlf,EAAO/+jB,IAAI45E,EAAG,EAAGhrF,GAAO,GACxBmwkB,EAAO/+jB,IAAI,EAAG45E,EAAGhrF,GAAO,EAC1B,CACF,CAsVEi2G,CAAmBb,GA5UrB,SAAgC+6d,EAAQxojB,GAGtC,IAFA,IAAIsvF,EAAMy4d,EAAiB1E,aAAarjjB,GAE/BhsB,EAAI,EAAGA,EAAIs7G,EAAI37G,OAAQK,IAI9B,IAHA,IAAI+4G,EAAMuC,EAAIt7G,GAAG,GACb0zD,EAAM4nD,EAAIt7G,GAAG,GAERqvF,GAAK,EAAGA,GAAK,EAAGA,IACvB,IAAK,IAAIpjC,GAAK,EAAGA,GAAK,EAAGA,KACZ,IAAPojC,GAAkB,IAANA,IAAkB,IAAPpjC,GAAkB,IAANA,GAC9B,IAANojC,GAAiB,IAANpjC,EACZuohB,EAAO/+jB,IAAIsjG,EAAM1pB,EAAG37B,EAAMzH,GAAG,GAAM,GAEnCuohB,EAAO/+jB,IAAIsjG,EAAM1pB,EAAG37B,EAAMzH,GAAG,GAAO,EAK9C,CA2TEkqhB,CAAsB18d,EAASztF,GAM/BuojB,EAAgB96d,EAAS82d,EAAsB,GAE3CvkjB,GAAW,GA3TjB,SAA2BwojB,EAAQxojB,GAKjC,IAJA,IAEI+sF,EAAKrlD,EAAK4jD,EAFVzgE,EAAO29hB,EAAO39hB,KACd0kE,EAAO64d,EAAQzD,eAAe3kjB,GAGzBhsB,EAAI,EAAGA,EAAI,GAAIA,IACtB+4G,EAAMvxF,KAAKu+B,MAAM/lD,EAAI,GACrB0zD,EAAM1zD,EAAI,EAAI62C,EAAO,EAAI,EACzBygE,EAA4B,KAApBiE,GAAQv7G,EAAK,GAErBw0kB,EAAO/+jB,IAAIsjG,EAAKrlD,EAAK4jD,GAAK,GAC1Bk9d,EAAO/+jB,IAAIi+C,EAAKqlD,EAAKzB,GAAK,EAE9B,CA+SI8+d,CAAiB38d,EAASztF,GAjQ9B,SAAoBwojB,EAAQlhjB,GAO1B,IANA,IAAIujB,EAAO29hB,EAAO39hB,KACd2kE,GAAO,EACPzC,EAAMliE,EAAO,EACb4kE,EAAW,EACXC,EAAY,EAEPhoD,EAAM7c,EAAO,EAAG6c,EAAM,EAAGA,GAAO,EAGvC,IAFY,IAARA,GAAWA,MAEF,CACX,IAAK,IAAIzH,EAAI,EAAGA,EAAI,EAAGA,IACrB,IAAKuohB,EAAOxE,WAAWj3d,EAAKrlD,EAAMzH,GAAI,CACpC,IAAIxxC,GAAO,EAEPihG,EAAYpoF,EAAK3zB,SACnB8a,EAAiD,KAAvC6Y,EAAKooF,KAAeD,EAAY,IAG5C+4d,EAAO/+jB,IAAIsjG,EAAKrlD,EAAMzH,EAAGxxC,IAGP,MAFlBghG,IAGEC,IACAD,EAAW,EAEf,CAKF,IAFA1C,GAAOyC,GAEG,GAAK3kE,GAAQkiE,EAAK,CAC1BA,GAAOyC,EACPA,GAAOA,EACP,KACF,CACF,CAEJ,CA+NE66d,CAAU58d,EAASw8d,GAEfn1e,MAAMyX,KAERA,EAAc07d,EAAY3B,YAAY74d,EACpC86d,EAAgBljiB,KAAK,KAAMooE,EAAS82d,KAIxC0D,EAAY5B,UAAU95d,EAAakB,GAGnC86d,EAAgB96d,EAAS82d,EAAsBh4d,GAExC,CACLkB,QAASA,EACTztF,QAASA,EACTukjB,qBAAsBA,EACtBh4d,YAAaA,EACbk8d,SAAUA,EAEd,CAWAvjhB,EAAQlvC,OAAS,SAAiBsR,EAAMl1B,GACtC,GAAoB,qBAATk1B,GAAiC,KAATA,EACjC,MAAM,IAAIne,MAAM,iBAGlB,IACI6W,EACAmmL,EAFAo+X,EAAuBJ,EAAQ16d,EAenC,MAXuB,qBAAZr3G,IAETmykB,EAAuBJ,EAAQ/4jB,KAAKhZ,EAAQmykB,qBAAsBJ,EAAQ16d,GAC1EzpF,EAAUoojB,EAAQh9jB,KAAKhZ,EAAQ4tB,SAC/BmmL,EAAO8hY,EAAY78jB,KAAKhZ,EAAQm6G,aAE5Bn6G,EAAQk4kB,YACV7F,EAAM8F,kBAAkBn4kB,EAAQk4kB,aAI7BX,EAAarijB,EAAMtH,EAASukjB,EAAsBp+X,EAC3D,yBClfA,IAAIy9X,EAAa,EAAQ,OACrBr2d,EAAa,EAAQ,OACrB//D,EAAS,YAEb,SAAS26hB,EAAoBN,GAC3Bx1kB,KAAKm4kB,aAAUj4kB,EACfF,KAAKw1kB,OAASA,EAEVx1kB,KAAKw1kB,QAAQx1kB,KAAKu0H,WAAWv0H,KAAKw1kB,OACxC,CAQAM,EAAmBn1kB,UAAU4zH,WAAa,SAAqBihd,GAE7Dx1kB,KAAKw1kB,OAASA,EACdx1kB,KAAKm4kB,QAAUj9d,EAAWq6d,qBAAqBv1kB,KAAKw1kB,OACtD,EAQAM,EAAmBn1kB,UAAUo7C,OAAS,SAAiB9mB,GACrD,IAAKj1B,KAAKm4kB,QACR,MAAM,IAAIrhkB,MAAM,2BAKlB,IAAIg+H,EAAMy8b,EAAWtiB,MAAMjvjB,KAAKw1kB,QAC5B4C,EAAaj9hB,EAAOhvC,OAAO,CAAC8oB,EAAM6/G,GAAM7/G,EAAK3zB,OAAStB,KAAKw1kB,QAI3D6C,EAAYn9d,EAAWjC,IAAIm/d,EAAYp4kB,KAAKm4kB,SAK5C9ljB,EAAQryB,KAAKw1kB,OAAS6C,EAAU/2kB,OACpC,GAAI+wB,EAAQ,EAAG,CACb,IAAIw6K,EAAO0kY,EAAWtiB,MAAMjvjB,KAAKw1kB,QAGjC,OAFA6C,EAAUj8b,KAAKywD,EAAMx6K,GAEdw6K,CACT,CAEA,OAAOwrY,CACT,EAEA3ikB,EAAOm9C,QAAUijhB,uBCzDjB,IAAIwC,EAAU,SAEVC,EAAQ,mNAMRC,EAAO,8BAFXD,EAAQA,EAAMpykB,QAAQ,KAAM,QAEsB,kBAElD0sD,EAAQ2/gB,MAAQ,IAAI5uhB,OAAO20hB,EAAO,KAClC1lhB,EAAQ4lhB,WAAa,IAAI70hB,OAAO,wBAAyB,KACzDiP,EAAQg/gB,KAAO,IAAIjuhB,OAAO40hB,EAAM,KAChC3lhB,EAAQ4hhB,QAAU,IAAI7whB,OAAO00hB,EAAS,KACtCzlhB,EAAQu+gB,aAAe,IAAIxthB,OAbR,oBAa6B,KAEhD,IAAI80hB,EAAa,IAAI90hB,OAAO,IAAM20hB,EAAQ,KACtCI,EAAe,IAAI/0hB,OAAO,IAAM00hB,EAAU,KAC1CM,EAAoB,IAAIh1hB,OAAO,0BAEnCiP,EAAQoihB,UAAY,SAAoB3vkB,GACtC,OAAOozkB,EAAW1/jB,KAAK1T,EACzB,EAEAutD,EAAQkihB,YAAc,SAAsBzvkB,GAC1C,OAAOqzkB,EAAa3/jB,KAAK1T,EAC3B,EAEAutD,EAAQmihB,iBAAmB,SAA2B1vkB,GACpD,OAAOszkB,EAAkB5/jB,KAAK1T,EAChC,yBC9BA,IAAI6zG,EAAO,EAAQ,OACf+7d,EAAc,EAAQ,OACtB/D,EAAmB,EAAQ,OAC3BS,EAAW,EAAQ,OACnBW,EAAY,EAAQ,OACpBiC,EAAQ,EAAQ,OAChBpC,EAAQ,EAAQ,OAChB1Y,EAAW,EAAQ,OAQvB,SAASmf,EAAqBvzkB,GAC5B,OAAO6hD,SAASxL,mBAAmBr2C,IAAMhE,MAC3C,CAUA,SAASw3kB,EAAavlhB,EAAO/6C,EAAMlT,GAIjC,IAHA,IACIkC,EADA4ukB,EAAW,GAGuB,QAA9B5ukB,EAAS+rD,EAAMtrD,KAAK3C,KAC1B8wkB,EAAS30kB,KAAK,CACZwzB,KAAMztB,EAAO,GACbgJ,MAAOhJ,EAAOgJ,MACdgI,KAAMA,EACNlX,OAAQkG,EAAO,GAAGlG,SAItB,OAAO80kB,CACT,CASA,SAAS2C,EAAuBjE,GAC9B,IAEIkE,EACAC,EAHAC,EAAUJ,EAAYtE,EAAMC,QAASt7d,EAAKs7d,QAASK,GACnDqE,EAAeL,EAAYtE,EAAMpD,aAAcj4d,EAAKi4d,aAAc0D,GActE,OAVI1C,EAAMgH,sBACRJ,EAAWF,EAAYtE,EAAM3C,KAAM14d,EAAK04d,KAAMiD,GAC9CmE,EAAYH,EAAYtE,EAAMhC,MAAOr5d,EAAKq5d,MAAOsC,KAEjDkE,EAAWF,EAAYtE,EAAMiE,WAAYt/d,EAAK04d,KAAMiD,GACpDmE,EAAY,IAGHC,EAAQ/skB,OAAOgtkB,EAAcH,EAAUC,GAG/ClmjB,MAAK,SAAUu4K,EAAIo9D,GAClB,OAAOp9D,EAAG96L,MAAQk4P,EAAGl4P,KACvB,IACCvD,KAAI,SAAUjG,GACb,MAAO,CACLiuB,KAAMjuB,EAAIiuB,KACVzc,KAAMxR,EAAIwR,KACVlX,OAAQ0F,EAAI1F,OAEhB,GACJ,CAUA,SAAS+3kB,EAAsB/3kB,EAAQkX,GACrC,OAAQA,GACN,KAAK2gG,EAAKs7d,QACR,OAAOS,EAAY7D,cAAc/vkB,GACnC,KAAK63G,EAAKi4d,aACR,OAAOD,EAAiBE,cAAc/vkB,GACxC,KAAK63G,EAAKq5d,MACR,OAAOD,EAAUlB,cAAc/vkB,GACjC,KAAK63G,EAAK04d,KACR,OAAOD,EAASP,cAAc/vkB,GAEpC,CAsIA,SAASg4kB,EAAoBrkjB,EAAMskjB,GACjC,IAAI/gkB,EACAghkB,EAAWrge,EAAK07d,mBAAmB5/iB,GAKvC,IAHAzc,EAAO2gG,EAAKpgG,KAAKwgkB,EAAWC,MAGfrge,EAAK04d,MAAQr5jB,EAAK8/F,IAAMkhe,EAASlhe,IAC5C,MAAM,IAAIxhG,MAAM,IAAMme,EAAN,iCACoBkkF,EAAKzzG,SAAS8S,GAChD,0BAA4B2gG,EAAKzzG,SAAS8zkB,IAQ9C,OAJIhhkB,IAAS2gG,EAAKq5d,OAAUJ,EAAMgH,uBAChC5gkB,EAAO2gG,EAAK04d,MAGNr5jB,GACN,KAAK2gG,EAAKs7d,QACR,OAAO,IAAIS,EAAYjgjB,GAEzB,KAAKkkF,EAAKi4d,aACR,OAAO,IAAID,EAAiBl8iB,GAE9B,KAAKkkF,EAAKq5d,MACR,OAAO,IAAID,EAAUt9iB,GAEvB,KAAKkkF,EAAK04d,KACR,OAAO,IAAID,EAAS38iB,GAE1B,CAiBA49B,EAAQkwU,UAAY,SAAoBh1T,GACtC,OAAOA,EAAM1hE,QAAO,SAAU+Z,EAAKqzjB,GAOjC,MANmB,kBAARA,EACTrzjB,EAAI3kB,KAAK63kB,EAAmBG,EAAK,OACxBA,EAAIxkjB,MACb7O,EAAI3kB,KAAK63kB,EAAmBG,EAAIxkjB,KAAMwkjB,EAAIjhkB,OAGrC4N,CACT,GAAG,GACL,EAUAysC,EAAQ8hK,WAAa,SAAqB1/L,EAAMtH,GAQ9C,IAPA,IAEI5pB,EAxKN,SAAqB21kB,GAEnB,IADA,IAAI31kB,EAAQ,GACHpC,EAAI,EAAGA,EAAI+3kB,EAAKp4kB,OAAQK,IAAK,CACpC,IAAI83kB,EAAMC,EAAK/3kB,GAEf,OAAQ83kB,EAAIjhkB,MACV,KAAK2gG,EAAKs7d,QACR1wkB,EAAMtC,KAAK,CAACg4kB,EACV,CAAExkjB,KAAMwkjB,EAAIxkjB,KAAMzc,KAAM2gG,EAAKi4d,aAAc9vkB,OAAQm4kB,EAAIn4kB,QACvD,CAAE2zB,KAAMwkjB,EAAIxkjB,KAAMzc,KAAM2gG,EAAK04d,KAAMvwkB,OAAQm4kB,EAAIn4kB,UAEjD,MACF,KAAK63G,EAAKi4d,aACRrtkB,EAAMtC,KAAK,CAACg4kB,EACV,CAAExkjB,KAAMwkjB,EAAIxkjB,KAAMzc,KAAM2gG,EAAK04d,KAAMvwkB,OAAQm4kB,EAAIn4kB,UAEjD,MACF,KAAK63G,EAAKq5d,MACRzukB,EAAMtC,KAAK,CAACg4kB,EACV,CAAExkjB,KAAMwkjB,EAAIxkjB,KAAMzc,KAAM2gG,EAAK04d,KAAMvwkB,OAAQu3kB,EAAoBY,EAAIxkjB,SAErE,MACF,KAAKkkF,EAAK04d,KACR9tkB,EAAMtC,KAAK,CACT,CAAEwzB,KAAMwkjB,EAAIxkjB,KAAMzc,KAAM2gG,EAAK04d,KAAMvwkB,OAAQu3kB,EAAoBY,EAAIxkjB,SAG3E,CAEA,OAAOlxB,CACT,CA0Ic41kB,CAFDZ,EAAsB9jjB,EAAMm9iB,EAAMgH,uBAGzC3jc,EA7HN,SAAqB1xI,EAAO4pB,GAK1B,IAJA,IAAIkmiB,EAAQ,CAAC,EACTp+a,EAAQ,CAAC,MAAS,CAAC,GACnBmkc,EAAc,CAAC,SAEVj4kB,EAAI,EAAGA,EAAIoC,EAAMzC,OAAQK,IAAK,CAIrC,IAHA,IAAIk4kB,EAAY91kB,EAAMpC,GAClBm4kB,EAAiB,GAEZ/3gB,EAAI,EAAGA,EAAI83gB,EAAUv4kB,OAAQygE,IAAK,CACzC,IAAI59D,EAAO01kB,EAAU93gB,GACjBxhE,EAAM,GAAKoB,EAAIogE,EAEnB+3gB,EAAer4kB,KAAKlB,GACpBszjB,EAAMtzjB,GAAO,CAAE4D,KAAMA,EAAM41kB,UAAW,GACtCtkc,EAAMl1I,GAAO,CAAC,EAEd,IAAK,IAAIuY,EAAI,EAAGA,EAAI8gkB,EAAYt4kB,OAAQwX,IAAK,CAC3C,IAAIkhkB,EAAaJ,EAAY9gkB,GAEzB+6iB,EAAMmmB,IAAenmB,EAAMmmB,GAAY71kB,KAAKqU,OAASrU,EAAKqU,MAC5Di9H,EAAMukc,GAAYz5kB,GAChB84kB,EAAqBxlB,EAAMmmB,GAAYD,UAAY51kB,EAAK7C,OAAQ6C,EAAKqU,MACrE6gkB,EAAqBxlB,EAAMmmB,GAAYD,UAAW51kB,EAAKqU,MAEzDq7iB,EAAMmmB,GAAYD,WAAa51kB,EAAK7C,SAEhCuyjB,EAAMmmB,KAAanmB,EAAMmmB,GAAYD,UAAY51kB,EAAK7C,QAE1Dm0I,EAAMukc,GAAYz5kB,GAAO84kB,EAAqBl1kB,EAAK7C,OAAQ6C,EAAKqU,MAC9D,EAAI2gG,EAAKy7d,sBAAsBzwkB,EAAKqU,KAAMmV,GAEhD,CACF,CAEAisjB,EAAcE,CAChB,CAEA,IAAKhhkB,EAAI,EAAGA,EAAI8gkB,EAAYt4kB,OAAQwX,IAClC28H,EAAMmkc,EAAY9gkB,IAAS,IAAI,EAGjC,MAAO,CAAE7L,IAAKwoI,EAAOo+a,MAAOA,EAC9B,CAkFcomB,CAAWl2kB,EAAO4pB,GAC1BysB,EAAOs/gB,EAASY,UAAU7kb,EAAMxoI,IAAK,QAAS,OAE9CitkB,EAAgB,GACXv4kB,EAAI,EAAGA,EAAIy4C,EAAK94C,OAAS,EAAGK,IACnCu4kB,EAAcz4kB,KAAKg0I,EAAMo+a,MAAMz5gB,EAAKz4C,IAAIwC,MAG1C,OAAO0uD,EAAQkwU,UA9MjB,SAAwB22M,GACtB,OAAOA,EAAKrtkB,QAAO,SAAU+Z,EAAKuwH,GAChC,IAAIwjc,EAAU/zjB,EAAI9kB,OAAS,GAAK,EAAI8kB,EAAIA,EAAI9kB,OAAS,GAAK,KAC1D,OAAI64kB,GAAWA,EAAQ3hkB,OAASm+H,EAAKn+H,MACnC4N,EAAIA,EAAI9kB,OAAS,GAAG2zB,MAAQ0hH,EAAK1hH,KAC1B7O,IAGTA,EAAI3kB,KAAKk1I,GACFvwH,EACT,GAAG,GACL,CAmM2Bg0jB,CAAcF,GACzC,EAYArnhB,EAAQ4khB,SAAW,SAAmBxijB,GACpC,OAAO49B,EAAQkwU,UACbg2M,EAAsB9jjB,EAAMm9iB,EAAMgH,sBAEtC,uBCzUA,IAAIiB,EACAC,EAAkB,CACpB,EACA,GAAI,GAAI,GAAI,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAC1C,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,KAC7C,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KACtD,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,MASxDznhB,EAAQ+9gB,cAAgB,SAAwBjjjB,GAC9C,IAAKA,EAAS,MAAM,IAAI7W,MAAM,yCAC9B,GAAI6W,EAAU,GAAKA,EAAU,GAAI,MAAM,IAAI7W,MAAM,6CACjD,OAAiB,EAAV6W,EAAc,EACvB,EAQAklC,EAAQyjhB,wBAA0B,SAAkC3ojB,GAClE,OAAO2sjB,EAAgB3sjB,EACzB,EAQAklC,EAAQgnD,YAAc,SAAU5kF,GAG9B,IAFA,IAAI8kF,EAAQ,EAEI,IAAT9kF,GACL8kF,IACA9kF,KAAU,EAGZ,OAAO8kF,CACT,EAEAlnD,EAAQqlhB,kBAAoB,SAA4B1oiB,GACtD,GAAiB,oBAANA,EACT,MAAM,IAAI14B,MAAM,yCAGlBujkB,EAAiB7qiB,CACnB,EAEAqjB,EAAQumhB,mBAAqB,WAC3B,MAAiC,qBAAnBiB,CAChB,EAEAxnhB,EAAQ4/gB,OAAS,SAAiB8F,GAChC,OAAO8B,EAAe9B,EACxB,uBCxDA1lhB,EAAQmC,QAAU,SAAkBrnC,GAClC,OAAQ80E,MAAM90E,IAAYA,GAAW,GAAKA,GAAW,EACvD,yBCRA,IAAIykjB,EAAQ,EAAQ,OAChByD,EAAS,EAAQ,OACjB/D,EAAU,EAAQ,OAClB34d,EAAO,EAAQ,OACfo7d,EAAe,EAAQ,OACvBrtkB,EAAU,EAAQ,OAIlBqzkB,EAAUnI,EAAMv4d,YADV,MAaV,SAAS2ge,EAAsBhikB,EAAMmV,GAEnC,OAAOwrF,EAAKy7d,sBAAsBp8jB,EAAMmV,GAAW,CACrD,CAEA,SAAS8sjB,EAA2BrE,EAAUzojB,GAC5C,IAAI+sjB,EAAY,EAOhB,OALAtE,EAAS/zkB,SAAQ,SAAU4yB,GACzB,IAAI0ljB,EAAeH,EAAqBvljB,EAAKzc,KAAMmV,GACnD+sjB,GAAaC,EAAe1ljB,EAAKo8iB,eACnC,IAEOqJ,CACT,CAqBA7nhB,EAAQ95C,KAAO,SAAe/S,EAAOoyC,GACnC,OAAIm8hB,EAAav/gB,QAAQhvD,GAChBszD,SAAStzD,EAAO,IAGlBoyC,CACT,EAWAya,EAAQ+nhB,YAAc,SAAsBjtjB,EAASukjB,EAAsB15jB,GACzE,IAAK+7jB,EAAav/gB,QAAQrnC,GACxB,MAAM,IAAI7W,MAAM,2BAIE,qBAAT0B,IAAsBA,EAAO2gG,EAAK04d,MAG7C,IAMIwE,EAA+D,GAN9CjE,EAAMkE,wBAAwB3ojB,GAG5BkojB,EAAO1D,uBAAuBxkjB,EAASukjB,IAK9D,GAAI15jB,IAAS2gG,EAAKw7d,MAAO,OAAO0B,EAEhC,IAAIwE,EAAaxE,EAAyBmE,EAAqBhikB,EAAMmV,GAGrE,OAAQnV,GACN,KAAK2gG,EAAKs7d,QACR,OAAOtrjB,KAAKu+B,MAAOmzhB,EAAa,GAAM,GAExC,KAAK1he,EAAKi4d,aACR,OAAOjojB,KAAKu+B,MAAOmzhB,EAAa,GAAM,GAExC,KAAK1he,EAAKq5d,MACR,OAAOrpjB,KAAKu+B,MAAMmzhB,EAAa,IAEjC,KAAK1he,EAAK04d,KACV,QACE,OAAO1ojB,KAAKu+B,MAAMmzhB,EAAa,GAErC,EAUAhohB,EAAQ6khB,sBAAwB,SAAgCzijB,EAAMi9iB,GACpE,IAAIuH,EAEAqB,EAAMhJ,EAAQ/4jB,KAAKm5jB,EAAsBJ,EAAQ16d,GAErD,GAAIlwG,EAAQ+tB,GAAO,CACjB,GAAIA,EAAK3zB,OAAS,EAChB,OAzFN,SAAqC80kB,EAAUlE,GAC7C,IAAK,IAAI6I,EAAiB,EAAGA,GAAkB,GAAIA,IAEjD,GADaN,EAA0BrE,EAAU2E,IACnClohB,EAAQ+nhB,YAAYG,EAAgB7I,EAAsB/4d,EAAKw7d,OAC3E,OAAOoG,CAKb,CAgFaC,CAA2B/ljB,EAAM6ljB,GAG1C,GAAoB,IAAhB7ljB,EAAK3zB,OACP,OAAO,EAGTm4kB,EAAMxkjB,EAAK,EACb,MACEwkjB,EAAMxkjB,EAGR,OA/HF,SAAsCzc,EAAMlX,EAAQ4wkB,GAClD,IAAK,IAAI6I,EAAiB,EAAGA,GAAkB,GAAIA,IACjD,GAAIz5kB,GAAUuxD,EAAQ+nhB,YAAYG,EAAgB7I,EAAsB15jB,GACtE,OAAOuikB,CAKb,CAuHSE,CAA4BxB,EAAIjhkB,KAAMihkB,EAAIzie,YAAa8je,EAChE,EAYAjohB,EAAQy/gB,eAAiB,SAAyB3kjB,GAChD,IAAK4mjB,EAAav/gB,QAAQrnC,IAAYA,EAAU,EAC9C,MAAM,IAAI7W,MAAM,2BAKlB,IAFA,IAAI8yD,EAAIj8C,GAAW,GAEZykjB,EAAMv4d,YAAYjwC,GAAK2wgB,GAAW,GACvC3wgB,GAvJM,MAuJQwogB,EAAMv4d,YAAYjwC,GAAK2wgB,EAGvC,OAAQ5sjB,GAAW,GAAMi8C,CAC3B,yBCnKA,IAAIwogB,EAAQ,EAAQ,OAoBpBv/gB,EAAQpqD,OAAS,SAAiByykB,EAAQnmgB,EAAQh1E,GAChD,IAAIooB,EAAOpoB,EACPo7kB,EAAWpmgB,EAEK,qBAAT5sD,GAA0B4sD,GAAWA,EAAOm1D,aACrD/hH,EAAO4sD,EACPA,OAAS70E,GAGN60E,IACHomgB,EAlBJ,WACE,IACE,OAAOn6kB,SAASC,cAAc,SAChC,CAAE,MAAOkB,GACP,MAAM,IAAI2U,MAAM,uCAClB,CACF,CAYeskkB,IAGbjzjB,EAAOiqjB,EAAMiJ,WAAWlzjB,GACxB,IAAIqwB,EAAO45hB,EAAMkJ,cAAcJ,EAAO9/d,QAAQ5iE,KAAMrwB,GAEhDwmE,EAAMwsf,EAASjxc,WAAW,MAC1Buc,EAAQ93D,EAAI4sf,gBAAgB/iiB,EAAMA,GAMtC,OALA45hB,EAAMoJ,cAAc/0b,EAAMxxH,KAAMimjB,EAAQ/yjB,GApC1C,SAAsBwmE,EAAK5Z,EAAQv8B,GACjCm2C,EAAI47C,UAAU,EAAG,EAAGx1D,EAAOzmD,MAAOymD,EAAOvmD,QAEpCumD,EAAOroE,QAAOqoE,EAAOroE,MAAQ,CAAC,GACnCqoE,EAAOvmD,OAASgqB,EAChBu8B,EAAOzmD,MAAQkqB,EACfu8B,EAAOroE,MAAM8hB,OAASgqB,EAAO,KAC7Bu8B,EAAOroE,MAAM4hB,MAAQkqB,EAAO,IAC9B,CA8BEijiB,CAAY9sf,EAAKwsf,EAAU3iiB,GAC3Bm2C,EAAI6vF,aAAa/3B,EAAO,EAAG,GAEpB00b,CACT,EAEAtohB,EAAQ89gB,gBAAkB,SAA0BuK,EAAQnmgB,EAAQh1E,GAClE,IAAIooB,EAAOpoB,EAES,qBAATooB,GAA0B4sD,GAAWA,EAAOm1D,aACrD/hH,EAAO4sD,EACPA,OAAS70E,GAGNioB,IAAMA,EAAO,CAAC,GAEnB,IAAIgzjB,EAAWtohB,EAAQpqD,OAAOyykB,EAAQnmgB,EAAQ5sD,GAE1Chf,EAAOgf,EAAKhf,MAAQ,YACpBuykB,EAAevzjB,EAAKuzjB,cAAgB,CAAC,EAEzC,OAAOP,EAAS7wc,UAAUnhI,EAAMuykB,EAAaC,QAC/C,yBC9DA,IAAIvJ,EAAQ,EAAQ,OAEpB,SAASwJ,EAAgB/7jB,EAAOg8jB,GAC9B,IAAI1xc,EAAQtqH,EAAM+d,EAAI,IAClBt4B,EAAMu2kB,EAAS,KAAOh8jB,EAAMo3C,IAAM,IAEtC,OAAOkzE,EAAQ,EACX7kI,EAAM,IAAMu2kB,EAAS,aAAe1xc,EAAMx4F,QAAQ,GAAG1gC,MAAM,GAAK,IAChE3L,CACN,CAEA,SAASw2kB,EAAQC,EAAKptjB,EAAGE,GACvB,IAAIvpB,EAAMy2kB,EAAMptjB,EAGhB,MAFiB,qBAANE,IAAmBvpB,GAAO,IAAMupB,GAEpCvpB,CACT,CAsCAutD,EAAQpqD,OAAS,SAAiByykB,EAAQn7kB,EAASgoG,GACjD,IAAI5/E,EAAOiqjB,EAAMiJ,WAAWt7kB,GACxBy4C,EAAO0iiB,EAAO9/d,QAAQ5iE,KACtBvjB,EAAOimjB,EAAO9/d,QAAQnmF,KACtB+mjB,EAAaxjiB,EAAqB,EAAdrwB,EAAKqa,OAEzBy5iB,EAAM9zjB,EAAKtI,MAAM1D,MAAMyhB,EAEvB,SAAWg+iB,EAAezzjB,EAAKtI,MAAM1D,MAAO,QAC5C,YAAc6/jB,EAAa,IAAMA,EAAa,SAF9C,GAIA5hiB,EACF,SAAWwhiB,EAAezzjB,EAAKtI,MAAMzD,KAAM,UAC3C,OAjDJ,SAAmB6Y,EAAMujB,EAAMhW,GAM7B,IALA,IAAI4X,EAAO,GACP8hiB,EAAS,EACTC,GAAS,EACTx5V,EAAa,EAERhhP,EAAI,EAAGA,EAAIszB,EAAK3zB,OAAQK,IAAK,CACpC,IAAI0zD,EAAMlsC,KAAKu+B,MAAM/lD,EAAI62C,GACrBkiE,EAAMvxF,KAAKu+B,MAAM/lD,EAAI62C,GAEpB6c,GAAQ8mhB,IAAQA,GAAS,GAE1BlnjB,EAAKtzB,IACPghP,IAEMhhP,EAAI,GAAK0zD,EAAM,GAAKpgC,EAAKtzB,EAAI,KACjCy4C,GAAQ+hiB,EACJL,EAAO,IAAKzmhB,EAAM7yB,EAAQ,GAAMk4E,EAAMl4E,GACtCs5iB,EAAO,IAAKI,EAAQ,GAExBA,EAAS,EACTC,GAAS,GAGL9mhB,EAAM,EAAI7c,GAAQvjB,EAAKtzB,EAAI,KAC/By4C,GAAQ0hiB,EAAO,IAAKn5V,GACpBA,EAAa,IAGfu5V,GAEJ,CAEA,OAAO9hiB,CACT,CAeagiiB,CAASnnjB,EAAMujB,EAAMrwB,EAAKqa,QAAU,MAE3CuzE,EAAU,gBAAuBime,EAAa,IAAMA,EAAa,IAIjEK,EAAS,4CAFAl0jB,EAAKmG,MAAa,UAAYnG,EAAKmG,MAAQ,aAAenG,EAAKmG,MAAQ,KAA1D,IAEwCynF,EAAU,iCAAmCkme,EAAK7hiB,EAAO,WAM3H,MAJkB,oBAAP2tD,GACTA,EAAG,KAAMs0e,GAGJA,CACT,uBChFA,SAASC,EAAUrlhB,GAKjB,GAJmB,kBAARA,IACTA,EAAMA,EAAIvxD,YAGO,kBAARuxD,EACT,MAAM,IAAIngD,MAAM,yCAGlB,IAAIylkB,EAAUtlhB,EAAIhmD,QAAQ9K,QAAQ,IAAK,IAAI3C,MAAM,IACjD,GAAI+4kB,EAAQj7kB,OAAS,GAAwB,IAAnBi7kB,EAAQj7kB,QAAgBi7kB,EAAQj7kB,OAAS,EACjE,MAAM,IAAIwV,MAAM,sBAAwBmgD,GAInB,IAAnBslhB,EAAQj7kB,QAAmC,IAAnBi7kB,EAAQj7kB,SAClCi7kB,EAAUt4kB,MAAMtD,UAAUwL,OAAOvC,MAAM,GAAI2ykB,EAAQtvkB,KAAI,SAAU2gD,GAC/D,MAAO,CAACA,EAAGA,EACb,MAIqB,IAAnB2uhB,EAAQj7kB,QAAci7kB,EAAQ96kB,KAAK,IAAK,KAE5C,IAAI+6kB,EAAWljhB,SAASijhB,EAAQrwkB,KAAK,IAAK,IAE1C,MAAO,CACL8kF,EAAIwrf,GAAY,GAAM,IACtB9niB,EAAI8niB,GAAY,GAAM,IACtB3+iB,EAAI2+iB,GAAY,EAAK,IACrB5+iB,EAAc,IAAX4+iB,EACHvlhB,IAAK,IAAMslhB,EAAQtrkB,MAAM,EAAG,GAAG/E,KAAK,IAExC,CAEA2mD,EAAQwohB,WAAa,SAAqBt7kB,GACnCA,IAASA,EAAU,CAAC,GACpBA,EAAQ8f,QAAO9f,EAAQ8f,MAAQ,CAAC,GAErC,IAAI2iB,EAAmC,qBAAnBziC,EAAQyiC,QACP,OAAnBziC,EAAQyiC,QACRziC,EAAQyiC,OAAS,EAAI,EAAIziC,EAAQyiC,OAE/BlU,EAAQvuB,EAAQuuB,OAASvuB,EAAQuuB,OAAS,GAAKvuB,EAAQuuB,WAAQpuB,EAC/Du4J,EAAQ14J,EAAQ04J,OAAS,EAE7B,MAAO,CACLnqI,MAAOA,EACPmqI,MAAOnqI,EAAQ,EAAImqI,EACnBj2H,OAAQA,EACR3iB,MAAO,CACLzD,KAAMkgkB,EAASv8kB,EAAQ8f,MAAMzD,MAAQ,aACrCD,MAAOmgkB,EAASv8kB,EAAQ8f,MAAM1D,OAAS,cAEzChT,KAAMpJ,EAAQoJ,KACduykB,aAAc37kB,EAAQ27kB,cAAgB,CAAC,EAE3C,EAEA7ohB,EAAQ4phB,SAAW,SAAmBC,EAAQv0jB,GAC5C,OAAOA,EAAKmG,OAASnG,EAAKmG,OAASoujB,EAAuB,EAAdv0jB,EAAKqa,OAC7Cra,EAAKmG,OAASoujB,EAAuB,EAAdv0jB,EAAKqa,QAC5Bra,EAAKswI,KACX,EAEA5lG,EAAQyohB,cAAgB,SAAwBoB,EAAQv0jB,GACtD,IAAIswI,EAAQ5lG,EAAQ4phB,SAASC,EAAQv0jB,GACrC,OAAOgB,KAAKu+B,OAAOg1hB,EAAuB,EAAdv0jB,EAAKqa,QAAci2H,EACjD,EAEA5lG,EAAQ2ohB,cAAgB,SAAwBmB,EAASh9X,EAAIx3L,GAQ3D,IAPA,IAAIqwB,EAAOmnK,EAAGvkG,QAAQ5iE,KAClBvjB,EAAO0qL,EAAGvkG,QAAQnmF,KAClBwjI,EAAQ5lG,EAAQ4phB,SAASjkiB,EAAMrwB,GAC/By0jB,EAAazzjB,KAAKu+B,OAAOlP,EAAqB,EAAdrwB,EAAKqa,QAAci2H,GACnDokb,EAAe10jB,EAAKqa,OAASi2H,EAC7Bqkb,EAAU,CAAC30jB,EAAKtI,MAAM1D,MAAOgM,EAAKtI,MAAMzD,MAEnCza,EAAI,EAAGA,EAAIi7kB,EAAYj7kB,IAC9B,IAAK,IAAIogE,EAAI,EAAGA,EAAI66gB,EAAY76gB,IAAK,CACnC,IAAIg7gB,EAAgC,GAAtBp7kB,EAAIi7kB,EAAa76gB,GAC3Bi7gB,EAAU70jB,EAAKtI,MAAM1D,MAEzB,GAAIxa,GAAKk7kB,GAAgB96gB,GAAK86gB,GAC5Bl7kB,EAAIi7kB,EAAaC,GAAgB96gB,EAAI66gB,EAAaC,EAGlDG,EAAUF,EAAQ7njB,EAFP9L,KAAKu+B,OAAO/lD,EAAIk7kB,GAAgBpkb,GAEbjgH,EADnBrvB,KAAKu+B,OAAOqa,EAAI86gB,GAAgBpkb,IACE,EAAI,GAGnDkkb,EAAQI,KAAYC,EAAQhsf,EAC5B2rf,EAAQI,KAAYC,EAAQtoiB,EAC5BioiB,EAAQI,KAAYC,EAAQn/iB,EAC5B8+iB,EAAQI,GAAUC,EAAQp/iB,CAC5B,CAEJ,sCCvFA,IAAI12B,EAAU,EAAQ,OAatBi0C,EAAO2zgB,oBAXP,WAEE,IACE,IAAI9ijB,EAAM,IAAI8oC,WAAW,GAEzB,OADA9oC,EAAI0W,UAAY,CAACA,UAAWoyB,WAAWn0C,UAAWoujB,IAAK,WAAc,OAAO,EAAG,GAC1D,KAAd/ijB,EAAI+ijB,KACb,CAAE,MAAO5sjB,GACP,OAAO,CACT,CACF,CAE6B6sjB,GAE7B,IAAItD,EAAevwgB,EAAO2zgB,oBACpB,WACA,WAEN,SAAS3zgB,EAAQ/wC,EAAKyuB,EAAQv3B,GAC5B,OAAK65C,EAAO2zgB,qBAAyB9ujB,gBAAgBm7C,EAIlC,kBAAR/wC,EACFwhjB,EAAY5rjB,KAAMoK,GAmQ7B,SAAeqof,EAAMzsf,EAAO6yB,EAAQv3B,GAClC,GAAqB,kBAAV0E,EACT,MAAM,IAAI0T,UAAU,yCAGtB,GAA2B,qBAAhB08B,aAA+BpwC,aAAiBowC,YACzD,OA/KJ,SAA0Bq8c,EAAM1kb,EAAO6jG,EAAYtwK,GACjD,GAAIswK,EAAa,GAAK7jG,EAAM68F,WAAagH,EACvC,MAAM,IAAI4jG,WAAW,6BAGvB,GAAIznM,EAAM68F,WAAagH,GAActwK,GAAU,GAC7C,MAAM,IAAIk0Q,WAAW,6BAGvB,IAAIhkG,EAEFA,OADiBtxK,IAAf0xK,QAAuC1xK,IAAXoB,EACxB,IAAIwzC,WAAWi5B,QACD7tE,IAAXoB,EACH,IAAIwzC,WAAWi5B,EAAO6jG,GAEtB,IAAI98H,WAAWi5B,EAAO6jG,EAAYtwK,GAGtC65C,EAAO2zgB,oBAETt9Y,EAAI9uJ,UAAYy4B,EAAOx6C,UAGvB6wK,EAAMy6Y,EAAcx5D,EAAMjhV,GAG5B,OAAOA,CACT,CAoJWw6Y,CAAgBv5D,EAAMzsf,EAAO6yB,EAAQv3B,GAG9C,GAAqB,kBAAV0E,EACT,OA5MJ,SAAqBysf,EAAMxrf,GACzB,IAAI3F,EAA8B,EAArBspK,EAAW3jK,GACpBuqK,EAAMknJ,EAAa+5L,EAAMnxf,GAEzBq+K,EAASnO,EAAInuH,MAAMp8C,GAEnB04K,IAAWr+K,IAIbkwK,EAAMA,EAAIvgK,MAAM,EAAG0uK,IAGrB,OAAOnO,CACT,CA8LWmjD,CAAW89R,EAAMzsf,GAG1B,OAzJF,SAAqBysf,EAAMzrf,GACzB,GAAIm0C,EAAOrF,SAAS9uC,GAAM,CACxB,IAAIvB,EAA4B,EAAtB+mY,EAAQxlY,EAAI1F,QAClBkwK,EAAMknJ,EAAa+5L,EAAMhtf,GAE7B,OAAmB,IAAf+rK,EAAIlwK,QAIR0F,EAAIo1I,KAAKo1B,EAAK,EAAG,EAAG/rK,GAHX+rK,CAKX,CAEA,GAAIxqK,EAAK,CACP,GAA4B,qBAAhBovC,aACRpvC,EAAIsvC,kBAAkBF,aAAgB,WAAYpvC,EACpD,MAA0B,kBAAfA,EAAI1F,QAvGrB,SAAgBof,GACd,OAAOA,IAAQA,CACjB,CAqG4Cu8jB,CAAMj2kB,EAAI1F,QACvCo3T,EAAa+5L,EAAM,GAErBw5D,EAAcx5D,EAAMzrf,GAG7B,GAAiB,WAAbA,EAAImC,MAAqBlF,MAAMiD,QAAQF,EAAIiuB,MAC7C,OAAOg3hB,EAAcx5D,EAAMzrf,EAAIiuB,KAEnC,CAEA,MAAM,IAAIvb,UAAU,qFACtB,CA6HS2yiB,CAAW55D,EAAMzsf,EAC1B,CA9QS+S,CAAK/Y,KAAMoK,EAAKyuB,EAAQv3B,GAPtB,IAAI65C,EAAO/wC,EAAKyuB,EAAQv3B,EAQnC,CAkBA,SAASkrY,EAASlrY,GAGhB,GAAIA,GAAUoqjB,EACZ,MAAM,IAAIl2S,WAAW,0DACak2S,EAAahmjB,SAAS,IAAM,UAEhE,OAAgB,EAATpE,CACT,CAMA,SAASo3T,EAAc+5L,EAAMnxf,GAC3B,IAAIkwK,EAaJ,OAZIr2H,EAAO2zgB,qBACTt9Y,EAAM,IAAI18H,WAAWxzC,IACjBohB,UAAYy4B,EAAOx6C,WAIX,QADZ6wK,EAAMihV,KAEJjhV,EAAM,IAAIr2H,EAAO75C,IAEnBkwK,EAAIlwK,OAASA,GAGRkwK,CACT,CAEA,SAASo6Y,EAAan5D,EAAMj6c,GAC1B,IAAIg5H,EAAMknJ,EAAa+5L,EAAMj6c,EAAO,EAAI,EAAoB,EAAhBg0V,EAAQh0V,IAEpD,IAAK2C,EAAO2zgB,oBACV,IAAK,IAAIntjB,EAAI,EAAGA,EAAI62C,IAAQ72C,EAC1B6vK,EAAI7vK,GAAK,EAIb,OAAO6vK,CACT,CAkBA,SAASy6Y,EAAex5D,EAAM1kb,GAG5B,IAFA,IAAIzsE,EAASysE,EAAMzsE,OAAS,EAAI,EAA4B,EAAxBkrY,EAAQz+T,EAAMzsE,QAC9CkwK,EAAMknJ,EAAa+5L,EAAMnxf,GACpBK,EAAI,EAAGA,EAAIL,EAAQK,GAAK,EAC/B6vK,EAAI7vK,GAAgB,IAAXosE,EAAMpsE,GAEjB,OAAO6vK,CACT,CA6DA,SAASk7Y,EAAazljB,EAAQu6P,GAE5B,IAAIktT,EADJltT,EAAQA,GAAShvK,IAMjB,IAJA,IAAIlxF,EAAS2F,EAAO3F,OAChBqyjB,EAAgB,KAChBpugB,EAAQ,GAEH5jD,EAAI,EAAGA,EAAIL,IAAUK,EAAG,CAI/B,IAHA+sjB,EAAYznjB,EAAOjF,WAAWL,IAGd,OAAU+sjB,EAAY,MAAQ,CAE5C,IAAKiF,EAAe,CAElB,GAAIjF,EAAY,MAAQ,EAEjBltT,GAAS,IAAM,GAAGj8M,EAAM9jD,KAAK,IAAM,IAAM,KAC9C,QACF,CAAO,GAAIE,EAAI,IAAML,EAAQ,EAEtBkgQ,GAAS,IAAM,GAAGj8M,EAAM9jD,KAAK,IAAM,IAAM,KAC9C,QACF,CAGAkyjB,EAAgBjF,EAEhB,QACF,CAGA,GAAIA,EAAY,MAAQ,EACjBltT,GAAS,IAAM,GAAGj8M,EAAM9jD,KAAK,IAAM,IAAM,KAC9CkyjB,EAAgBjF,EAChB,QACF,CAGAA,EAAkE,OAArDiF,EAAgB,OAAU,GAAKjF,EAAY,MAC1D,MAAWiF,IAEJnyT,GAAS,IAAM,GAAGj8M,EAAM9jD,KAAK,IAAM,IAAM,KAMhD,GAHAkyjB,EAAgB,KAGZjF,EAAY,IAAM,CACpB,IAAKltT,GAAS,GAAK,EAAG,MACtBj8M,EAAM9jD,KAAKitjB,EACb,MAAO,GAAIA,EAAY,KAAO,CAC5B,IAAKltT,GAAS,GAAK,EAAG,MACtBj8M,EAAM9jD,KACJitjB,GAAa,EAAM,IACP,GAAZA,EAAmB,IAEvB,MAAO,GAAIA,EAAY,MAAS,CAC9B,IAAKltT,GAAS,GAAK,EAAG,MACtBj8M,EAAM9jD,KACJitjB,GAAa,GAAM,IACnBA,GAAa,EAAM,GAAO,IACd,GAAZA,EAAmB,IAEvB,KAAO,MAAIA,EAAY,SASrB,MAAM,IAAI53iB,MAAM,sBARhB,IAAK0qP,GAAS,GAAK,EAAG,MACtBj8M,EAAM9jD,KACJitjB,GAAa,GAAO,IACpBA,GAAa,GAAM,GAAO,IAC1BA,GAAa,EAAM,GAAO,IACd,GAAZA,EAAmB,IAIvB,CACF,CAEA,OAAOnpgB,CACT,CAEA,SAASqlH,EAAY3jK,GACnB,OAAIk0C,EAAOrF,SAAS7uC,GACXA,EAAO3F,OAEW,qBAAhB80C,aAA6D,oBAAvBA,YAAYC,SACxDD,YAAYC,OAAOpvC,IAAWA,aAAkBmvC,aAC5CnvC,EAAO2jK,YAEM,kBAAX3jK,IACTA,EAAS,GAAKA,GAIJ,IADFA,EAAO3F,OACK,EAEforjB,EAAYzljB,GAAQ3F,OAC7B,CA/OI65C,EAAO2zgB,sBACT3zgB,EAAOx6C,UAAU+hB,UAAYoyB,WAAWn0C,UACxCw6C,EAAOz4B,UAAYoyB,WAGG,qBAAX77B,QAA0BA,OAAOikkB,SACxC/hiB,EAAOliC,OAAOikkB,WAAa/hiB,GAC7BjzC,OAAOyD,eAAewvC,EAAQliC,OAAOikkB,QAAS,CAC5Cl3kB,MAAO,KACP2T,cAAc,EACdtO,YAAY,EACZuO,UAAU,KAkQhBuhC,EAAOx6C,UAAU0iD,MAAQ,SAAgBp8C,EAAQ4xB,EAAQv3B,QAExCpB,IAAX24B,QAIkB34B,IAAXoB,GAA0C,kBAAXu3B,GAHxCv3B,EAAStB,KAAKsB,OACdu3B,EAAS,GAMAwf,SAASxf,KAClBA,GAAkB,EACdwf,SAAS/2C,GACXA,GAAkB,EAElBA,OAASpB,GAIb,IAAIutjB,EAAYztjB,KAAKsB,OAASu3B,EAG9B,SAFe34B,IAAXoB,GAAwBA,EAASmsjB,KAAWnsjB,EAASmsjB,GAEpDxmjB,EAAO3F,OAAS,IAAMA,EAAS,GAAKu3B,EAAS,IAAOA,EAAS74B,KAAKsB,OACrE,MAAM,IAAIk0Q,WAAW,0CAGvB,OA9CF,SAAoBhkG,EAAKvqK,EAAQ4xB,EAAQv3B,GACvC,OATF,SAAqB82E,EAAK46N,EAAKn6Q,EAAQv3B,GACrC,IAAK,IAAIK,EAAI,EAAGA,EAAIL,KACbK,EAAIk3B,GAAUm6Q,EAAI1xS,QAAYK,GAAKy2E,EAAI92E,UADhBK,EAE5BqxS,EAAIrxS,EAAIk3B,GAAUu/C,EAAIz2E,GAExB,OAAOA,CACT,CAGSisjB,CAAWlB,EAAYzljB,EAAQuqK,EAAIlwK,OAASu3B,GAAS24I,EAAK34I,EAAQv3B,EAC3E,CA4CSqsjB,CAAU3tjB,KAAMiH,EAAQ4xB,EAAQv3B,EACzC,EAEA65C,EAAOx6C,UAAUsQ,MAAQ,SAAgBohB,EAAOC,GAC9C,IAoBIg+hB,EApBA7qjB,EAAMzF,KAAKsB,OAqBf,IApBA+wB,IAAUA,GAGE,GACVA,GAAS5sB,GACG,IAAG4sB,EAAQ,GACdA,EAAQ5sB,IACjB4sB,EAAQ5sB,IANV6sB,OAAcpyB,IAARoyB,EAAoB7sB,IAAQ6sB,GASxB,GACRA,GAAO7sB,GACG,IAAG6sB,EAAM,GACVA,EAAM7sB,IACf6sB,EAAM7sB,GAGJ6sB,EAAMD,IAAOC,EAAMD,GAGnB8oB,EAAO2zgB,qBACTwB,EAAStwjB,KAAKi5J,SAAS5mI,EAAOC,IAEvB5P,UAAYy4B,EAAOx6C,cACrB,CACL,IAAIw8kB,EAAW7qjB,EAAMD,EACrBi+hB,EAAS,IAAIn1gB,EAAOgiiB,OAAUj9kB,GAC9B,IAAK,IAAIyB,EAAI,EAAGA,EAAIw7kB,IAAYx7kB,EAC9B2ujB,EAAO3ujB,GAAK3B,KAAK2B,EAAI0wB,EAEzB,CAEA,OAAOi+hB,CACT,EAEAn1gB,EAAOx6C,UAAUy7I,KAAO,SAAe7wI,EAAQiojB,EAAanhiB,EAAOC,GAQjE,GAPKD,IAAOA,EAAQ,GACfC,GAAe,IAARA,IAAWA,EAAMtyB,KAAKsB,QAC9BkyjB,GAAejojB,EAAOjK,SAAQkyjB,EAAcjojB,EAAOjK,QAClDkyjB,IAAaA,EAAc,GAC5BlhiB,EAAM,GAAKA,EAAMD,IAAOC,EAAMD,GAG9BC,IAAQD,EAAO,OAAO,EAC1B,GAAsB,IAAlB9mB,EAAOjK,QAAgC,IAAhBtB,KAAKsB,OAAc,OAAO,EAGrD,GAAIkyjB,EAAc,EAChB,MAAM,IAAIh+S,WAAW,6BAEvB,GAAInjP,EAAQ,GAAKA,GAASryB,KAAKsB,OAAQ,MAAM,IAAIk0Q,WAAW,6BAC5D,GAAIljP,EAAM,EAAG,MAAM,IAAIkjP,WAAW,2BAG9BljP,EAAMtyB,KAAKsB,SAAQgxB,EAAMtyB,KAAKsB,QAC9BiK,EAAOjK,OAASkyjB,EAAclhiB,EAAMD,IACtCC,EAAM/mB,EAAOjK,OAASkyjB,EAAcnhiB,GAGtC,IACI1wB,EADA8D,EAAM6sB,EAAMD,EAGhB,GAAIryB,OAASuL,GAAU8mB,EAAQmhiB,GAAeA,EAAclhiB,EAE1D,IAAK3wB,EAAI8D,EAAM,EAAG9D,GAAK,IAAKA,EAC1B4J,EAAO5J,EAAI6xjB,GAAexzjB,KAAK2B,EAAI0wB,QAEhC,GAAI5sB,EAAM,MAAS01C,EAAO2zgB,oBAE/B,IAAKntjB,EAAI,EAAGA,EAAI8D,IAAO9D,EACrB4J,EAAO5J,EAAI6xjB,GAAexzjB,KAAK2B,EAAI0wB,QAGrCyiB,WAAWn0C,UAAUyW,IAAIlT,KACvBqH,EACAvL,KAAKi5J,SAAS5mI,EAAOA,EAAQ5sB,GAC7B+tjB,GAIJ,OAAO/tjB,CACT,EAEA01C,EAAOx6C,UAAUiyC,KAAO,SAAelyB,EAAK2R,EAAOC,GAEjD,GAAmB,kBAAR5R,GAOT,GANqB,kBAAV2R,GACTA,EAAQ,EACRC,EAAMtyB,KAAKsB,QACa,kBAARgxB,IAChBA,EAAMtyB,KAAKsB,QAEM,IAAfof,EAAIpf,OAAc,CACpB,IAAI+R,EAAOqN,EAAI1e,WAAW,GACtBqR,EAAO,MACTqN,EAAMrN,EAEV,MACwB,kBAARqN,IAChBA,GAAY,KAId,GAAI2R,EAAQ,GAAKryB,KAAKsB,OAAS+wB,GAASryB,KAAKsB,OAASgxB,EACpD,MAAM,IAAIkjP,WAAW,sBAGvB,GAAIljP,GAAOD,EACT,OAAOryB,KAQT,IAAI2B,EACJ,GANA0wB,KAAkB,EAClBC,OAAcpyB,IAARoyB,EAAoBtyB,KAAKsB,OAASgxB,IAAQ,EAE3C5R,IAAKA,EAAM,GAGG,kBAARA,EACT,IAAK/e,EAAI0wB,EAAO1wB,EAAI2wB,IAAO3wB,EACzB3B,KAAK2B,GAAK+e,MAEP,CACL,IAAI6kC,EAAQpK,EAAOrF,SAASp1B,GACxBA,EACA,IAAIy6B,EAAOz6B,GACXjb,EAAM8/C,EAAMjkD,OAChB,IAAKK,EAAI,EAAGA,EAAI2wB,EAAMD,IAAS1wB,EAC7B3B,KAAK2B,EAAI0wB,GAASkzB,EAAM5jD,EAAI8D,EAEhC,CAEA,OAAOzF,IACT,EAEAm7C,EAAOhvC,OAAS,SAAiBilB,EAAM9vB,GACrC,IAAK4F,EAAQkqB,GACX,MAAM,IAAI1X,UAAU,+CAGtB,GAAoB,IAAhB0X,EAAK9vB,OACP,OAAOo3T,EAAa,KAAM,GAG5B,IAAI/2T,EACJ,QAAezB,IAAXoB,EAEF,IADAA,EAAS,EACJK,EAAI,EAAGA,EAAIyvB,EAAK9vB,SAAUK,EAC7BL,GAAU8vB,EAAKzvB,GAAGL,OAItB,IAAIg1C,EAASs1gB,EAAY,KAAMtqjB,GAC3B27G,EAAM,EACV,IAAKt7G,EAAI,EAAGA,EAAIyvB,EAAK9vB,SAAUK,EAAG,CAChC,IAAI6vK,EAAMpgJ,EAAKzvB,GACf,IAAKw5C,EAAOrF,SAAS07H,GACnB,MAAM,IAAI93J,UAAU,+CAEtB83J,EAAIp1B,KAAK9lG,EAAQ2mE,GACjBA,GAAOu0D,EAAIlwK,MACb,CACA,OAAOg1C,CACT,EAEA6E,EAAOyvH,WAAaA,EAEpBzvH,EAAOx6C,UAAUwujB,WAAY,EAC7Bh0gB,EAAOrF,SAAW,SAAmBjY,GACnC,QAAe,MAALA,IAAaA,EAAEsxhB,UAC3B,EAEAz5iB,EAAOm9C,QAAQo8f,MAAQ,SAAUz2gB,GAC/B,IAAIlC,EAAS,IAAI6E,EAAO3C,GAExB,OADAlC,EAAO1D,KAAK,GACL0D,CACT,EAEA5gC,EAAOm9C,QAAQ95C,KAAO,SAAUkc,GAC9B,OAAO,IAAIkmB,EAAOlmB,EACpB,kCC7eA,SAAS9sB,EAAenB,EAAKiuC,GAC3B,OAAO/sC,OAAOvH,UAAUwH,eAAejE,KAAK8C,EAAKiuC,EACnD,CAEAv/B,EAAOm9C,QAAU,SAASuqhB,EAAIzrX,EAAKkwW,EAAI9hkB,GACrC4xN,EAAMA,GAAO,IACbkwW,EAAKA,GAAM,IACX,IAAI76jB,EAAM,CAAC,EAEX,GAAkB,kBAAPo2kB,GAAiC,IAAdA,EAAG97kB,OAC/B,OAAO0F,EAGT,IAAIq2kB,EAAS,MACbD,EAAKA,EAAG55kB,MAAMmuN,GAEd,IAAI2rX,EAAU,IACVv9kB,GAAsC,kBAApBA,EAAQu9kB,UAC5BA,EAAUv9kB,EAAQu9kB,SAGpB,IAAI73kB,EAAM23kB,EAAG97kB,OAETg8kB,EAAU,GAAK73kB,EAAM63kB,IACvB73kB,EAAM63kB,GAGR,IAAK,IAAI37kB,EAAI,EAAGA,EAAI8D,IAAO9D,EAAG,CAC5B,IAEI47kB,EAAMC,EAAMj4kB,EAAG27B,EAFfvS,EAAIyujB,EAAGz7kB,GAAGwE,QAAQk3kB,EAAQ,OAC1B9rgB,EAAM5iD,EAAEza,QAAQ2tjB,GAGhBtwf,GAAO,GACTgsgB,EAAO5ujB,EAAEulC,OAAO,EAAGqd,GACnBisgB,EAAO7ujB,EAAEulC,OAAOqd,EAAM,KAEtBgsgB,EAAO5ujB,EACP6ujB,EAAO,IAGTj4kB,EAAIs+C,mBAAmB05hB,GACvBr8iB,EAAI2iB,mBAAmB25hB,GAElBr1kB,EAAenB,EAAKzB,GAEd2B,EAAQF,EAAIzB,IACrByB,EAAIzB,GAAG9D,KAAKy/B,GAEZl6B,EAAIzB,GAAK,CAACyB,EAAIzB,GAAI27B,GAJlBl6B,EAAIzB,GAAK27B,CAMb,CAEA,OAAOl6B,CACT,EAEA,IAAIE,EAAUjD,MAAMiD,SAAW,SAAUi9J,GACvC,MAA8C,mBAAvCj8J,OAAOvH,UAAU+E,SAASxB,KAAKigK,EACxC,iCC5DA,IAAIs5a,EAAqB,SAASv8iB,GAChC,cAAeA,GACb,IAAK,SACH,OAAOA,EAET,IAAK,UACH,OAAOA,EAAI,OAAS,QAEtB,IAAK,SACH,OAAOmX,SAASnX,GAAKA,EAAI,GAE3B,QACE,MAAO,GAEb,EAEAxrB,EAAOm9C,QAAU,SAAS7rD,EAAK2qN,EAAKkwW,EAAIl9jB,GAOtC,OANAgtN,EAAMA,GAAO,IACbkwW,EAAKA,GAAM,IACC,OAAR76jB,IACFA,OAAM9G,GAGW,kBAAR8G,EACFiG,EAAIywkB,EAAW12kB,IAAM,SAASzB,GACnC,IAAIo4kB,EAAKhiiB,mBAAmB8hiB,EAAmBl4kB,IAAMs8jB,EACrD,OAAI36jB,EAAQF,EAAIzB,IACP0H,EAAIjG,EAAIzB,IAAI,SAAS27B,GAC1B,OAAOy8iB,EAAKhiiB,mBAAmB8hiB,EAAmBv8iB,GACpD,IAAGh1B,KAAKylN,GAEDgsX,EAAKhiiB,mBAAmB8hiB,EAAmBz2kB,EAAIzB,IAE1D,IAAG2G,KAAKylN,GAILhtN,EACEg3C,mBAAmB8hiB,EAAmB94kB,IAASk9jB,EAC/ClmhB,mBAAmB8hiB,EAAmBz2kB,IAF3B,EAGpB,EAEA,IAAIE,EAAUjD,MAAMiD,SAAW,SAAUi9J,GACvC,MAA8C,mBAAvCj8J,OAAOvH,UAAU+E,SAASxB,KAAKigK,EACxC,EAEA,SAASl3J,EAAKk3J,EAAI30H,GAChB,GAAI20H,EAAGl3J,IAAK,OAAOk3J,EAAGl3J,IAAIuiC,GAE1B,IADA,IAAI44B,EAAM,GACDzmE,EAAI,EAAGA,EAAIwiK,EAAG7iK,OAAQK,IAC7BymE,EAAI3mE,KAAK+tC,EAAE20H,EAAGxiK,GAAIA,IAEpB,OAAOymE,CACT,CAEA,IAAIs1gB,EAAax1kB,OAAO6C,MAAQ,SAAU/D,GACxC,IAAIohE,EAAM,GACV,IAAK,IAAI7nE,KAAOyG,EACVkB,OAAOvH,UAAUwH,eAAejE,KAAK8C,EAAKzG,IAAM6nE,EAAI3mE,KAAKlB,GAE/D,OAAO6nE,CACT,sCClFAvV,EAAQuhH,OAASvhH,EAAQ7uC,MAAQ,EAAhB,OACjB6uC,EAAQ9W,OAAS8W,EAAQ5uC,UAAY,EAApB,0CCGjB,IAAIm7D,EAAQ,EAAQ,OAChBvQ,EAAY,EAAQ,OACpB+ugB,EAAc,EAAQ,OACtBC,EAAmB,EAAQ,QAC3B,SAAEt1kB,EAAQ,SAAEK,GAAaw2E,EAAM/2E,gBAE/By1kB,EAAsBD,EAAiB,CACzC/oB,mBAAoB,WACd90jB,KAAK0I,MAAMq1kB,MACb/9kB,KAAK+9kB,MAAQ/9kB,KAAK0I,MAAMq1kB,MAExB/9kB,KAAK+9kB,MAAQH,EAAYj0P,eAAe3pV,KAAK0I,MAAMuzC,IAEvD,EAEA0pgB,qBAAsB,YACf3ljB,KAAK0I,MAAMq1kB,OAAS/9kB,KAAK+9kB,OAC5B/9kB,KAAK+9kB,MAAMl+T,YAEf,EAEAk1S,0BAA2B,SAAUpxd,GAGjC3jG,KAAK0I,MAAMq1kB,QAAUp6e,EAAUo6e,OAC/B/9kB,KAAK0I,MAAMuzC,MAAQ0nD,EAAU1nD,MAM/Bj8C,KAAK2ljB,uBAGL3ljB,KAAK80jB,qBACP,EAEArsjB,OAAQ,WACN,OAAO22E,EAAMn+E,cACXsH,EACA,CACEvC,MAAO,CACL+3kB,MAAO/9kB,KAAK+9kB,QAGhB/9kB,KAAK0I,MAAMiC,UAAY,KAE3B,IAGFmzkB,EAAoB71jB,YAAc,sBAElC61jB,EAAoBrsgB,UAAY,CAC9BssgB,MAAOlvgB,EAAUhkE,OACjBoxC,IAAK4yB,EAAU5nE,OACf0D,SAAUkkE,EAAUV,KAGtB,IAAI6vgB,EAAwBH,EAAiB,CAC3Cx6B,kBAAmB,WACjB,IACI46B,EAASj+kB,KAAK0I,MAEdw1kB,EAAaD,EAAOC,WAEpBC,EAAgBF,EAAOE,cAEvBC,EAAcH,EAAOG,YAErBC,EAAiBJ,EAAOI,eAExBpxhB,EAAagxhB,EAAOhxhB,WAExBjtD,KAAK+9kB,MAAQ/9kB,KAAK0I,MAAMq1kB,MAAM/xP,cAAcroU,OAAO3jB,KAAK0I,MAAMwb,QAAS,CACrEo6jB,SAAU,SAAUrpjB,GAClBipjB,GAAcA,EAAWjpjB,EAC3B,EACAq/F,YAAa,WACX6pd,GAAiBA,GACnB,EACAI,UAAW,WACTH,GAAeA,GACjB,EACAnyP,aAAc,WACZoyP,GAAkBA,GACpB,EACA3hiB,SAAU,WACRuQ,GAAcA,GAChB,GAEJ,EAEA04f,qBAAsB,WAChB3ljB,KAAK+9kB,QACP/9kB,KAAK0I,MAAMq1kB,MAAM/xP,cAAcloS,OAAO9jD,KAAK+9kB,OAC3C/9kB,KAAK+9kB,MAAQ,KAEjB,EAEA30hB,KAAM,SAAUn0B,GACd,IAAKj1B,KAAK+9kB,MACR,MAAM,IAAIjnkB,MAAM,kCAGlB9W,KAAK+9kB,MAAM30hB,KAAKn0B,EAClB,EAEA64T,QAAS,SAAUlpU,EAAQqQ,GACzB,IAAKj1B,KAAK+9kB,MACR,MAAM,IAAIjnkB,MAAM,kCAGlB9W,KAAK+9kB,MAAMjwP,QAAQlpU,EAAQqQ,EAC7B,EAEAxsB,OAAQ,WACN,OAAOzI,KAAK0I,MAAMiC,UAAY,IAChC,IAGFqzkB,EAAsB/1jB,YAAc,wBAEpC+1jB,EAAsBvsgB,UAAY,CAChCssgB,MAAOlvgB,EAAUhkE,OACjBqzkB,WAAYrvgB,EAAUrmE,KACtB21kB,cAAetvgB,EAAUrmE,KACzB41kB,YAAavvgB,EAAUrmE,KACvB61kB,eAAgBxvgB,EAAUrmE,KAC1BykD,WAAY4hB,EAAUrmE,KACtBmC,SAAUkkE,EAAUV,KAGtB,IAAIqwgB,EAAsBp/f,EAAMv2E,YAAW,SAAUH,EAAOC,GAC1D,IAAI6oE,EAAYqsgB,EAAiB,CAC/Bp1kB,OAAQ,WACN,OAAO22E,EAAMn+E,cAAc2H,EAAU,MAAM,EAAGm1kB,WACrC3+f,EAAMn+E,cACX+8kB,EACA,CACED,WACG/9kB,KAAK0I,MACRC,IAAK3I,KAAK0I,MAAM+1kB,cAElBz+kB,KAAK0I,MAAMiC,UAAY,OAG7B,IAcF,OAXA6mE,EAAUvpD,YAAc,sBAExBupD,EAAUC,UAAY,CACpBysgB,WAAYrvgB,EAAUrmE,KACtB21kB,cAAetvgB,EAAUrmE,KACzB41kB,YAAavvgB,EAAUrmE,KACvB61kB,eAAgBxvgB,EAAUrmE,KAC1BykD,WAAY4hB,EAAUrmE,KACtBmC,SAAUkkE,EAAUV,KAGfiR,EAAMn+E,cACXuwE,EACA,IACK9oE,EACH+1kB,aAAc91kB,GAEhBD,EAAMiC,UAAY,KAEtB,IAEI8+U,EAAco0P,EAAiB,CACjCx6B,kBAAmB,WACjB73f,QAAQC,KACN,uJAEJ,EACAhjD,OAAQ,WACN,OAAO22E,EAAMn+E,cACXu9kB,EACA,IAAKx+kB,KAAK0I,OACV1I,KAAK0I,MAAMiC,UAAY,KAE3B,IAGF8+U,EAAYxhU,YAAc,cAE1BwhU,EAAYh4Q,UAAY,CACtBysgB,WAAYrvgB,EAAUrmE,KACtB21kB,cAAetvgB,EAAUrmE,KACzB41kB,YAAavvgB,EAAUrmE,KACvB61kB,eAAgBxvgB,EAAUrmE,KAC1BykD,WAAY4hB,EAAUrmE,KACtBmC,SAAUkkE,EAAUV,KAItBtb,EAAQ,GAAsB2rhB,EAE9B3rhB,EAAQ,GAAsBirhB,sCCpM9B,IAAIxwgB,EAAuB,EAAQ,OAEnC,SAASC,IAAiB,CAC1B,SAASC,IAA0B,CACnCA,EAAuBH,kBAAoBE,EAE3C73D,EAAOm9C,QAAU,WACf,SAAS4a,EAAK/kE,EAAO62D,EAAU16C,EAAemgC,EAAU0oB,EAAcC,GACpE,GAAIA,IAAWL,EAAf,CAIA,IAAI7zD,EAAM,IAAI3C,MACZ,mLAKF,MADA2C,EAAI9U,KAAO,sBACL8U,CAPN,CAQF,CAEA,SAASm0D,IACP,OAAOH,CACT,CAHAA,EAAKI,WAAaJ,EAMlB,IAAIK,EAAiB,CACnBC,MAAON,EACPO,OAAQP,EACRQ,KAAMR,EACNjlE,KAAMilE,EACNl/D,OAAQk/D,EACR5iE,OAAQ4iE,EACRxmE,OAAQwmE,EACRS,OAAQT,EAERU,IAAKV,EACLW,QAASR,EACT7/C,QAAS0/C,EACTY,YAAaZ,EACba,WAAYV,EACZzpE,KAAMspE,EACNc,SAAUX,EACVY,MAAOZ,EACPa,UAAWb,EACXc,MAAOd,EACPe,MAAOf,EAEPgB,eAAgBpB,EAChBH,kBAAmBE,GAKrB,OAFAO,EAAee,UAAYf,EAEpBA,CACT,yBC/CEp4D,EAAOm9C,QAAU,EAAQ,MAAR,mCCNnBn9C,EAAOm9C,QAFoB,mFCAd,IAAI19B,EAAE,EAAQ,OAAiBrc,EAAE,EAAQ,OAAsBmK,EAAE,EAAQ,MAAwB45D,EAAE,EAAQ,OAA0BmU,EAAE,oBAAoB/3E,QAAQA,OAAY,IAAEu8C,EAAEw7B,EAAE/3E,OAAY,IAAE,iBAAiB,MAAMyxD,EAAEsmB,EAAE/3E,OAAY,IAAE,gBAAgB,MAAMioB,EAAE8vD,EAAE/3E,OAAY,IAAE,kBAAkB,MAAM4oC,EAAEmvC,EAAE/3E,OAAY,IAAE,qBAAqB,MAAM0V,EAAEqiE,EAAE/3E,OAAY,IAAE,kBAAkB,MAAM4V,EAAEmiE,EAAE/3E,OAAY,IAAE,iBAAiB,MAAMwxD,EAAEumB,EAAE/3E,OAAY,IAAE,oBAAoB,MAAM2xD,EAAEomB,EAAE/3E,OAAY,IAAE,qBACvf,MAAM2qX,EAAE,oBAAoB3qX,QAAQA,OAAOC,SAAS,SAASgrY,EAAEtmX,GAAG,IAAI,IAAIC,EAAEn0B,UAAUpI,OAAO,EAAEa,EAAE,wDAA2Dy7B,EAAEgwB,EAAE,EAAEA,EAAE/vB,EAAE+vB,IAAIzrD,GAAG,WAAiBw5C,mBAAmBjyC,UAAUkkD,EAAE,IAAI90C,GAAE,EAAG,yBAAyB8kB,EAAE,4HAA4Hz7B,EAAE,CAAC,IAAIiiZ,EAAE,CAAC/rT,UAAU,WAAW,OAAM,CAAE,EAAEqmf,mBAAmB,WAAW,EAAEhoB,oBAAoB,WAAW,EAAEioB,gBAAgB,WAAW,GAClgB,SAASpX,EAAE3piB,EAAEC,EAAE17B,GAAGnC,KAAK0I,MAAMk1B,EAAE59B,KAAK+C,QAAQ86B,EAAE79B,KAAK+2jB,KAAK9ziB,EAAEjjB,KAAKqjB,QAAQlhB,GAAGiiZ,CAAC,CAAqR,SAAS90W,IAAI,CAAyB,SAASsviB,EAAEhhjB,EAAEC,EAAE17B,GAAGnC,KAAK0I,MAAMk1B,EAAE59B,KAAK+C,QAAQ86B,EAAE79B,KAAK+2jB,KAAK9ziB,EAAEjjB,KAAKqjB,QAAQlhB,GAAGiiZ,CAAC,CAArYmjL,EAAE5mkB,UAAU+5F,iBAAiB,CAAC,EAAE6se,EAAE5mkB,UAAUwjC,SAAS,SAASvG,EAAEC,GAAG,kBAAkBD,GAAG,oBAAoBA,GAAG,MAAMA,GAAEsmX,EAAE,MAAalkZ,KAAKqjB,QAAQs7jB,gBAAgB3+kB,KAAK49B,EAAEC,EAAE,WAAW,EAAE0piB,EAAE5mkB,UAAUyV,YAAY,SAASwnB,GAAG59B,KAAKqjB,QAAQq7jB,mBAAmB1+kB,KAAK49B,EAAE,cAAc,EAAgB0R,EAAE3uC,UAAU4mkB,EAAE5mkB,UAAsF,IAAI22G,EAAEsne,EAAEj+kB,UAAU,IAAI2uC,EACxegoE,EAAEpiG,YAAY0pkB,EAAEzpjB,EAAEmiF,EAAEiwd,EAAE5mkB,WAAW22G,EAAEune,sBAAqB,EAAG,IAAIvU,EAAE,CAACznkB,QAAQ,MAAMi8kB,EAAE52kB,OAAOvH,UAAUwH,eAAe42kB,EAAE,CAACx+kB,KAAI,EAAGoI,KAAI,EAAGq2kB,QAAO,EAAGC,UAAS,GACtJ,SAASh9gB,EAAErkC,EAAEC,EAAE17B,GAAG,IAAIyrD,OAAE,EAAOgc,EAAE,CAAC,EAAEl1B,EAAE,KAAKlvC,EAAE,KAAK,GAAG,MAAMq4B,EAAE,IAAI+vB,UAAK,IAAS/vB,EAAEl1B,MAAMnD,EAAEq4B,EAAEl1B,UAAK,IAASk1B,EAAEt9B,MAAMm0C,EAAE,GAAG7W,EAAEt9B,KAAKs9B,EAAEihjB,EAAE56kB,KAAK25B,EAAE+vB,KAAKmxhB,EAAE52kB,eAAeylD,KAAKgc,EAAEhc,GAAG/vB,EAAE+vB,IAAI,IAAIpe,EAAE9lC,UAAUpI,OAAO,EAAE,GAAG,IAAIkuC,EAAEo6B,EAAEj/D,SAASxI,OAAO,GAAG,EAAEqtC,EAAE,CAAC,IAAI,IAAIjqC,EAAEtB,MAAMurC,GAAG6E,EAAE,EAAEA,EAAE7E,EAAE6E,IAAI9uC,EAAE8uC,GAAG3qC,UAAU2qC,EAAE,GAAGu1B,EAAEj/D,SAASpF,CAAC,CAAC,GAAGq4B,GAAGA,EAAE8zC,aAAa,IAAI9jB,KAAKpe,EAAE5R,EAAE8zC,kBAAe,IAAS9H,EAAEhc,KAAKgc,EAAEhc,GAAGpe,EAAEoe,IAAI,MAAM,CAAC+c,SAASnV,EAAErsD,KAAKy0B,EAAEr9B,IAAIm0C,EAAE/rC,IAAInD,EAAEkD,MAAMkhE,EAAEs1gB,OAAO5U,EAAEznkB,QAAQ,CACpb,SAASu0G,EAAEx5E,GAAG,MAAM,kBAAkBA,GAAG,OAAOA,GAAGA,EAAE+sC,WAAWnV,CAAC,CAAkH,IAAIooJ,EAAE,OAAOysX,EAAE,GAAG,SAASrhgB,EAAEprC,EAAEC,EAAE17B,EAAEyrD,GAAG,GAAGy8gB,EAAE/okB,OAAO,CAAC,IAAIsoE,EAAEyggB,EAAE7uhB,MAA8D,OAAxDouB,EAAEpiE,OAAOo2B,EAAEgsC,EAAEu1gB,UAAUthjB,EAAE+rC,EAAEphE,KAAKrG,EAAEynE,EAAE7mE,QAAQ6qD,EAAEgc,EAAEzT,MAAM,EAASyT,CAAC,CAAC,MAAM,CAACpiE,OAAOo2B,EAAEuhjB,UAAUthjB,EAAEr1B,KAAKrG,EAAEY,QAAQ6qD,EAAEuI,MAAM,EAAE,CAAC,SAASkhD,EAAEz5E,GAAGA,EAAEp2B,OAAO,KAAKo2B,EAAEuhjB,UAAU,KAAKvhjB,EAAEp1B,KAAK,KAAKo1B,EAAE76B,QAAQ,KAAK66B,EAAEu4B,MAAM,EAAE,GAAGk0gB,EAAE/okB,QAAQ+okB,EAAE5okB,KAAKm8B,EAAE,CACnd,SAAS4siB,EAAE5siB,EAAEC,EAAE17B,EAAEyrD,GAAG,IAAIgc,SAAShsC,EAAK,cAAcgsC,GAAG,YAAYA,IAAEhsC,EAAE,MAAK,IAAI8W,GAAE,EAAG,GAAG,OAAO9W,EAAE8W,GAAE,OAAQ,OAAOk1B,GAAG,IAAK,SAAS,IAAK,SAASl1B,GAAE,EAAG,MAAM,IAAK,SAAS,OAAO9W,EAAE+sC,UAAU,KAAKnV,EAAE,KAAKkV,EAAEh2B,GAAE,GAAI,GAAGA,EAAE,OAAOvyC,EAAEyrD,EAAEhwB,EAAE,KAAKC,EAAE,IAAI8lW,EAAE/lW,EAAE,GAAGC,GAAG,EAAyB,GAAvB6W,EAAE,EAAE7W,EAAE,KAAKA,EAAE,IAAIA,EAAE,IAAO55B,MAAMiD,QAAQ02B,GAAG,IAAI,IAAIp4B,EAAE,EAAEA,EAAEo4B,EAAEt8B,OAAOkE,IAAI,CAAQ,IAAIgqC,EAAE3R,EAAE8lW,EAAf/5T,EAAEhsC,EAAEp4B,GAAeA,GAAGkvC,GAAG81hB,EAAE5ggB,EAAEp6B,EAAErtC,EAAEyrD,EAAE,MAAM,GAAG,OAAOhwB,GAAG,qBAAqBA,EAAE4R,EAAE,KAAiCA,EAAE,oBAA7BA,EAAEo0V,GAAGhmW,EAAEgmW,IAAIhmW,EAAE,eAAsC4R,EAAE,KAAM,oBAAoBA,EAAE,IAAI5R,EAAE4R,EAAEtrC,KAAK05B,GACpfp4B,EAAE,IAAIokE,EAAEhsC,EAAEv4B,QAAQmU,MAA6Bk7B,GAAG81hB,EAA1B5ggB,EAAEA,EAAE5jE,MAAMwpC,EAAE3R,EAAE8lW,EAAE/5T,EAAEpkE,KAAcrD,EAAEyrD,OAAO,WAAWgc,GAAWs6U,EAAE,KAAK,qBAAd/hZ,EAAE,GAAGy7B,GAA+B,qBAAqB11B,OAAO6C,KAAK6yB,GAAG1xB,KAAK,MAAM,IAAI/J,EAAE,IAAK,OAAOuyC,CAAC,CAAC,SAASivV,EAAE/lW,EAAEC,GAAG,MAAM,kBAAkBD,GAAG,OAAOA,GAAG,MAAMA,EAAEr9B,IAFlL,SAAgBq9B,GAAG,IAAIC,EAAE,CAAC,IAAO,KAAQ,IAAI,MAAS,MAAM,KAAK,GAAGD,GAAGz3B,QAAQ,SAAQ,SAASy3B,GAAG,OAAOC,EAAED,EAAE,GAAE,CAEsEo3a,CAAOp3a,EAAEr9B,KAAKs9B,EAAEn4B,SAAS,GAAG,CAAC,SAAS60jB,EAAE38hB,EAAEC,GAAGD,EAAEp1B,KAAKtE,KAAK05B,EAAE76B,QAAQ86B,EAAED,EAAEu4B,QAAQ,CACvU,SAASiphB,EAAExhjB,EAAEC,EAAE17B,GAAG,IAAIyrD,EAAEhwB,EAAEp2B,OAAOoiE,EAAEhsC,EAAEuhjB,UAAUvhjB,EAAEA,EAAEp1B,KAAKtE,KAAK05B,EAAE76B,QAAQ86B,EAAED,EAAEu4B,SAASlyD,MAAMiD,QAAQ02B,GAAGumX,EAAEvmX,EAAEgwB,EAAEzrD,EAAE06E,EAAEm+e,qBAAqB,MAAMp9hB,IAAIw5E,EAAEx5E,KAAKC,EAAE+rC,IAAIhsC,EAAEr9B,KAAKs9B,GAAGA,EAAEt9B,MAAMq9B,EAAEr9B,IAAI,IAAI,GAAGq9B,EAAEr9B,KAAK4F,QAAQy3M,EAAE,OAAU,KAAKz7M,EAAEy7B,EAAE,CAAC+sC,SAASnV,EAAErsD,KAAKy0B,EAAEz0B,KAAK5I,IAAIs9B,EAAEl1B,IAAIi1B,EAAEj1B,IAAID,MAAMk1B,EAAEl1B,MAAMw2kB,OAAOthjB,EAAEshjB,SAAStxhB,EAAEnsD,KAAKm8B,GAAG,CAAC,SAASumX,EAAEvmX,EAAEC,EAAE17B,EAAEyrD,EAAEgc,GAAG,IAAIl1B,EAAE,GAAG,MAAMvyC,IAAIuyC,GAAG,GAAGvyC,GAAGgE,QAAQy3M,EAAE,OAAU,KAAK//K,EAAEmrC,EAAEnrC,EAAE6W,EAAEkZ,EAAEgc,GAAG,MAAMhsC,GAAG4siB,EAAE5siB,EAAE,GAAGwhjB,EAAEvhjB,GAAGw5E,EAAEx5E,EAAE,CACla,IAAIwhjB,EAAE,CAACx4jB,SAAS,CAAC5Z,IAAI,SAAS2wB,EAAEC,EAAE17B,GAAG,GAAG,MAAMy7B,EAAE,OAAOA,EAAE,IAAIgwB,EAAE,GAAmB,OAAhBu2V,EAAEvmX,EAAEgwB,EAAE,KAAK/vB,EAAE17B,GAAUyrD,CAAC,EAAEvrD,QAAQ,SAASu7B,EAAEC,EAAE17B,GAAG,GAAG,MAAMy7B,EAAE,OAAOA,EAAEC,EAAEmrC,EAAE,KAAK,KAAKnrC,EAAE17B,GAAG,MAAMy7B,GAAG4siB,EAAE5siB,EAAE,GAAG28hB,EAAE18hB,GAAGw5E,EAAEx5E,EAAE,EAAEs4B,MAAM,SAASv4B,GAAG,OAAO,MAAMA,EAAE,EAAE4siB,EAAE5siB,EAAE,GAAGi/C,EAAEi+e,gBAAgB,KAAK,EAAEh0iB,QAAQ,SAAS8W,GAAG,IAAIC,EAAE,GAAqC,OAAlCsmX,EAAEvmX,EAAEC,EAAE,KAAKg/C,EAAEm+e,qBAA4Bn9hB,CAAC,EAAEyhjB,KAAK,SAAS1hjB,GAAwB,OAArBw5E,EAAEx5E,IAAUsmX,EAAE,OAActmX,CAAC,GAAG2hjB,UAAU,WAAW,MAAM,CAAC18kB,QAAQ,KAAK,EAAE2uE,UAAU+1f,EAAEiY,cAAcZ,EAAEv2kB,cAAc,SAASu1B,EAAEC,GAC5U,YAD+U,IAASA,IAAIA,EAAE,OAAMD,EAAE,CAAC+sC,SAAS97C,EACvf4wjB,sBAAsB5hjB,EAAE6hjB,cAAc9hjB,EAAE+hjB,cAAc/hjB,EAAEgijB,aAAa,EAAEr3kB,SAAS,KAAKK,SAAS,OAAQL,SAAS,CAACoiE,SAASh8C,EAAEhY,SAASinB,GAAUA,EAAEh1B,SAASg1B,CAAC,EAAE/0B,WAAW,SAAS+0B,GAAG,MAAM,CAAC+sC,SAASC,EAAEniE,OAAOm1B,EAAE,EAAEr0B,SAAS23B,EAAEmqC,WAAWxpB,EAAEg+hB,mBAAmBp1gB,EAAExpE,cAAcghE,EAAEuqgB,aAAa,SAAS5uiB,EAAEC,EAAE17B,IAAG,OAAOy7B,QAAG,IAASA,IAAEsmX,EAAE,MAAMtmX,GAAU,IAAIgwB,OAAE,EAAOgc,EAAEz0C,EAAE,CAAC,EAAEyI,EAAEl1B,OAAOgsC,EAAE9W,EAAEr9B,IAAIiF,EAAEo4B,EAAEj1B,IAAI6mC,EAAE5R,EAAEshjB,OAAO,GAAG,MAAMrhjB,EAAE,MAAC,IAASA,EAAEl1B,MAAMnD,EAAEq4B,EAAEl1B,IAAI6mC,EAAE86hB,EAAEznkB,cAAS,IAASg7B,EAAEt9B,MAAMm0C,EAAE,GAAG7W,EAAEt9B,KAAK,IAAIgF,OAAE,EACtc,IAAIqoD,KADychwB,EAAEz0B,MAAMy0B,EAAEz0B,KAAKuoE,eACnfnsE,EAAEq4B,EAAEz0B,KAAKuoE,cAAuB7zC,EAAEihjB,EAAE56kB,KAAK25B,EAAE+vB,KAAKmxhB,EAAE52kB,eAAeylD,KAAKgc,EAAEhc,QAAG,IAAS/vB,EAAE+vB,SAAI,IAASroD,EAAEA,EAAEqoD,GAAG/vB,EAAE+vB,GAAG,CAAsB,GAAG,KAAxBA,EAAElkD,UAAUpI,OAAO,GAAWsoE,EAAEj/D,SAASxI,OAAO,GAAG,EAAEyrD,EAAE,CAACroD,EAAEtB,MAAM2pD,GAAG,IAAI,IAAIvZ,EAAE,EAAEA,EAAEuZ,EAAEvZ,IAAI9uC,EAAE8uC,GAAG3qC,UAAU2qC,EAAE,GAAGu1B,EAAEj/D,SAASpF,CAAC,CAAC,MAAM,CAAColE,SAASnV,EAAErsD,KAAKy0B,EAAEz0B,KAAK5I,IAAIm0C,EAAE/rC,IAAInD,EAAEkD,MAAMkhE,EAAEs1gB,OAAO1viB,EAAE,EAAEswiB,cAAc,SAASlijB,GAAG,IAAIC,EAAEokC,EAAEjvB,KAAK,KAAKpV,GAAY,OAATC,EAAE10B,KAAKy0B,EAASC,CAAC,EAAEw2hB,eAAej9c,EAAEzpF,QAAQ,SAASoyjB,mDAAmD,CAACC,kBAAkB1V,EAAE98jB,OAAO2nB,IAAI8qjB,EAAE/3kB,OAAO43E,OAAO,CAACttB,QAAQ6shB,IACtf/6L,EAAE27L,GAAGZ,GAAGY,EAAEvqkB,EAAOm9C,QAAQyxV,EAAW,QAAEA,EAAW,QAAEA,sCClBjD5uY,EAAOm9C,QAAU,EAAjB,2CCMF,IAAIya,EAAuB,EAAQ,OAEnC,SAASC,IAAiB,CAC1B,SAASC,IAA0B,CACnCA,EAAuBH,kBAAoBE,EAE3C73D,EAAOm9C,QAAU,WACf,SAAS4a,EAAK/kE,EAAO62D,EAAU16C,EAAemgC,EAAU0oB,EAAcC,GACpE,GAAIA,IAAWL,EAAf,CAIA,IAAI7zD,EAAM,IAAI3C,MACZ,mLAKF,MADA2C,EAAI9U,KAAO,sBACL8U,CAPN,CAQF,CAEA,SAASm0D,IACP,OAAOH,CACT,CAHAA,EAAKI,WAAaJ,EAMlB,IAAIK,EAAiB,CACnBC,MAAON,EACPO,OAAQP,EACRQ,KAAMR,EACNjlE,KAAMilE,EACNl/D,OAAQk/D,EACR5iE,OAAQ4iE,EACRxmE,OAAQwmE,EACRS,OAAQT,EAERU,IAAKV,EACLW,QAASR,EACT7/C,QAAS0/C,EACTY,YAAaZ,EACba,WAAYV,EACZzpE,KAAMspE,EACNc,SAAUX,EACVY,MAAOZ,EACPa,UAAWb,EACXc,MAAOd,EACPe,MAAOf,EAEPgB,eAAgBpB,EAChBH,kBAAmBE,GAKrB,OAFAO,EAAee,UAAYf,EAEpBA,CACT,yBC/CEp4D,EAAOm9C,QAAU,EAAQ,MAAR,mCCNnBn9C,EAAOm9C,QAFoB,sJCPvBplD,EAAY,CAAC,WAAY,UAAW,OAAQ,YAAa,MAOzDyykB,EAAqB,cAAiB,SAAU1zkB,EAAM7D,GACxD,IAAIw3kB,EAAW3zkB,EAAK2zkB,SAChBC,EAAU5zkB,EAAK4zkB,QACfC,EAAO7zkB,EAAK6zkB,KACZl7kB,EAAYqH,EAAKrH,UACjBm7kB,EAAU9zkB,EAAK+zkB,GACf/ugB,OAAwB,IAAZ8ugB,EAAqB,OAASA,EAC1C53kB,GAAQ,OAA8B8D,EAAMiB,GAE5C/J,GAAS,QAAmBy8kB,EAAU,SAC1C,OAAoB,gBAAoB3ugB,GAAW,OAAS,CAC1D7oE,IAAKA,GACJD,EAAO,CACRvD,UAAW,IAAWA,EAAWzB,EAAQ28kB,GAAQ38kB,EAAS,QAAS08kB,GAAW18kB,EAAS,IAAM08kB,KAEjG,IACAF,EAAMj4jB,YAAc,QACpBi4jB,EAAMxugB,aApBa,CACjB2ugB,MAAM,GAoBR,kICzBI5ykB,EAAY,CAAC,QAAS,WAAY,WAAY,iBAAkB,UAAW,OAAQ,YAAa,WAAY,oBAAqB,WAAY,OAAQ,MAMrJgkE,EAAY,CAMdptE,GAAI,QAGJogD,KAAM,WAGNzX,QAAS,SAGT+xE,MAAO,SAAelxC,WAGtBs6T,SAAU,SASVq4M,UAAW,IAGXC,SAAU,WAGVC,kBAAmB,SAOnBC,eAAgB,WAGhBR,SAAU,WAGVC,QAAS,WAGT5niB,KAAM,YAYJooiB,EAA8B,cAAiB,SAAUp0kB,EAAM7D,GACjE,IAAIo2G,EAAQvyG,EAAKuyG,MACbp0G,EAAW6B,EAAK7B,SAChBw1kB,EAAW3zkB,EAAK2zkB,SAChBQ,EAAiBn0kB,EAAKm0kB,eACtBP,EAAU5zkB,EAAK4zkB,QACf5niB,EAAOhsC,EAAKgsC,KACZgoiB,EAAYh0kB,EAAKg0kB,UACjBC,EAAWj0kB,EAAKi0kB,SAChBC,EAAoBl0kB,EAAKk0kB,kBACzBv4M,EAAW37X,EAAK27X,SAChB1jV,EAAOj4C,EAAKi4C,KACZpgD,EAAKmI,EAAKnI,GACVqE,GAAQ,OAA8B8D,EAAMiB,GAEhD,OAAoB,gBAAoB,KAAU,OAAS,CACzD9E,IAAKA,GACJD,GAAqB,gBAAoB,IAAgB,CAC1DrE,GAAIA,EACJogD,KAAMA,EACNjM,KAAMA,EACN4niB,QAASA,EACTj4M,SAAUA,EACV04M,cAAeV,GACdphe,GAAqB,gBAAoB,IAAc,CACxD+he,MAAON,EACPl4iB,KAAMm4iB,EACNM,cAAeL,EACfC,eAAgBA,GACfh2kB,GACL,IACAi2kB,EAAe34jB,YAAc,iBAC7B24jB,EAAenvgB,UAAYA,EAC3B,+GC5FA,SAASxkE,EAAItC,EAAUnC,GACrB,IAAIgI,EAAQ,EACZ,OAAO,WAAevD,IAAItC,GAAU,SAAUuC,GAC5C,OAAoB,iBAAqBA,GAAS1E,EAAK0E,EAAOsD,KAAWtD,CAC3E,GACF,CASA,SAAS7K,EAAQsI,EAAUnC,GACzB,IAAIgI,EAAQ,EACZ,WAAenO,QAAQsI,GAAU,SAAUuC,GACvB,iBAAqBA,IAAQ1E,EAAK0E,EAAOsD,IAC7D,GACF,oLC3BI/C,EAAY,CAAC,KAAM,WAAY,UAAW,OAAQ,UAAW,SAAU,eAAgB,YAAa,WAAY,aAehHuzkB,EAAmB,cAAiB,SAAUC,EAAmBt4kB,GACnE,IAAIu4kB,EAmBAC,EACAC,EAlBAC,GAAmB,QAAgBJ,EAAmB,CACxDK,UAAW,aAETC,EAAsBF,EAAiBd,GACvCA,OAA6B,IAAxBgB,EAAiC,MAAQA,EAC9CC,EAAkBH,EAAiBlB,SACnCC,EAAUiB,EAAiBjB,QAC3BxtiB,EAAOyuiB,EAAiBzuiB,KACxB6uiB,EAAUJ,EAAiBI,QAC3BC,EAASL,EAAiBK,OAC1BC,EAAeN,EAAiBM,aAChCx8kB,EAAYk8kB,EAAiBl8kB,UAC7BwF,EAAW02kB,EAAiB12kB,SAC5B22kB,EAAYD,EAAiBC,UAC7B54kB,GAAQ,OAA8B24kB,EAAkB5zkB,GAExD0ykB,GAAW,QAAmBqB,EAAiB,OAG/CI,GAAW,EACXC,GAAgB,IAAA5pkB,YAAW,KAC3B6pkB,GAAc,IAAA7pkB,YAAW,KAS7B,OAPI4pkB,GACFV,EAAiBU,EAAc1B,SAC/ByB,EAAqB,MAAVF,GAAwBA,GAC1BI,IACTV,EAAqBU,EAAYV,oBAGf,gBAAoB,EAAAx2gB,GAAa,OAAS,CAC5D21gB,GAAIA,EACJ53kB,IAAKA,EACL24kB,UAAWA,EACXn8kB,UAAW,IAAWA,GAAY+7kB,EAAc,CAAC,EAAGA,EAAYf,IAAayB,EAAUV,EAAYC,EAAiB,QAAUS,EAAUV,EAAYC,EAAiB,eAAiBS,GAAYD,EAAcT,EAAYE,EAAqB,IAAMhB,KAAagB,EAAoBF,EAAYf,EAAW,IAAMC,KAAaA,EAASc,EAAYf,EAAW,SAAWvtiB,EAAMsuiB,EAAYf,EAAW,cAAgBsB,EAASP,KAClax4kB,GAAQiC,EACb,IACAq2kB,EAAI/4jB,YAAc,MAClB+4jB,EAAItvgB,aA7Ce,CACjB+vgB,SAAS,EACT7uiB,MAAM,GA4CRouiB,EAAIe,KAAO,IACXf,EAAIgB,KAAO,IACX,6GC3DIv0kB,EAAY,CAAC,WAAY,YAAa,WAAY,MAIlDw0kB,EAAuB,cAC3B,SAAUz1kB,EAAM7D,GACd,IAAIw3kB,EAAW3zkB,EAAK2zkB,SAChBh7kB,EAAYqH,EAAKrH,UACjBwF,EAAW6B,EAAK7B,SAChB21kB,EAAU9zkB,EAAK+zkB,GACf/ugB,OAAwB,IAAZ8ugB,EAAqB,MAAQA,EACzC53kB,GAAQ,OAA8B8D,EAAMiB,GAGhD,OADA0ykB,GAAW,QAAmBA,EAAU,YACpB,gBAAoB3ugB,GAAW,OAAS,CAAC,EAAG9oE,EAAO,CACrEC,IAAKA,EACLxD,UAAW,IAAWA,EAAWg7kB,KAC/Bx1kB,EACN,IACAs3kB,EAAQh6jB,YAAc,UACtB,mICpBIxa,EAAY,CAAC,WAAY,WAAY,YAAa,OAAQ,WAAY,WAAY,MAMlFikE,EAAe,CACjBy2T,UAAU,EACVo4M,GAAI,KAEF2B,EAAuB,cAAiB,SAAU11kB,EAAM7D,GAC1D,IAAIw3kB,EAAW3zkB,EAAK2zkB,SAChBh4M,EAAW37X,EAAK27X,SAChBhjY,EAAYqH,EAAKrH,UACjBs/C,EAAOj4C,EAAKi4C,KACZ09hB,EAAW31kB,EAAK21kB,SAChBC,EAAW51kB,EAAK41kB,SAChB7B,EAAK/zkB,EAAK+zkB,GACV73kB,GAAQ,OAA8B8D,EAAMiB,GAGhD,OADA0ykB,GAAW,QAAmBA,EAAU,YACpB,gBAAoB,EAAAv1gB,GAAiB,OAAS,CAAC,EAAGliE,EAAO,CAC3E+7C,KAAMA,EACN97C,IAAKA,EACLw5kB,SAAUA,EACV5B,GAAIA,EACJp4M,SAAUA,EACVi6M,SAAUA,EACVj9kB,UAAW,IAAWA,EAAWg7kB,EAAUh4M,GAAY,cAE3D,IACA+5M,EAAQj6jB,YAAc,UACtBi6jB,EAAQxwgB,aAAeA,EACvB,uHCjCIjkE,EAAY,CAAC,MAAO,MAAO,MAAO,QAAS,SAAU,UAAW,WAAY,YAAa,QAAS,UAAW,YAC7G40kB,EAAa,CAAC,WACdC,EAAa,CAAC,MAAO,MAAO,MAAO,QAAS,SAAU,UAAW,WAAY,WAAY,UAAW,YAAa,YAiDrH,SAASC,EAAcj5jB,EAAK6D,EAAKD,GAC/B,IAAIs1jB,GAAcl5jB,EAAM6D,IAAQD,EAAMC,GAAO,IAC7C,OAAOhE,KAAKI,MA9CQ,IA8CFi5jB,GA9CE,GA+CtB,CAEA,SAASC,EAAkBj2kB,EAAM7D,GAC/B,IAAIu4kB,EAEA/zjB,EAAM3gB,EAAK2gB,IACX7D,EAAM9c,EAAK8c,IACX4D,EAAM1gB,EAAK0gB,IACX+hB,EAAQziC,EAAKyiC,MACbyziB,EAASl2kB,EAAKk2kB,OACdC,EAAUn2kB,EAAKm2kB,QACf1of,EAAWztF,EAAKytF,SAChB90F,EAAYqH,EAAKrH,UACjBuH,EAAQF,EAAKE,MACb0zkB,EAAU5zkB,EAAK4zkB,QACfD,EAAW3zkB,EAAK2zkB,SAChBz3kB,GAAQ,OAA8B8D,EAAMiB,GAEhD,OAAoB,gBAAoB,OAAO,OAAS,CACtD9E,IAAKA,GACJD,EAAO,CACR4/B,KAAM,cACNnjC,UAAW,IAAWA,EAAWg7kB,EAAW,QAASe,EAAc,CAAC,EAAGA,EAAY,MAAQd,GAAWA,EAASc,EAAYf,EAAW,iBAAmBlmf,EAAUinf,EAAYf,EAAW,gBAAkBlmf,GAAY0of,EAASzB,IACjOx0kB,OAAO,OAAS,CACd4hB,MAAOi0jB,EAAcj5jB,EAAK6D,EAAKD,GAAO,KACrCxgB,GACH,gBAAiB4c,EACjB,gBAAiB6D,EACjB,gBAAiBD,IACfw1jB,EAAsB,gBAAoB,OAAQ,CACpDv9kB,UAAW,WACV8pC,GAASA,EACd,CAEA,IAAI2ziB,EAA2B,cAAiB,SAAUh1kB,EAAOjF,GAC/D,IAAIk6kB,EAAUj1kB,EAAMi1kB,QAChBn6kB,GAAQ,OAA8BkF,EAAOy0kB,GAIjD,GAFA35kB,EAAMy3kB,UAAW,QAAmBz3kB,EAAMy3kB,SAAU,YAEhD0C,EACF,OAAOJ,EAAkB/5kB,EAAOC,GAGlC,IAAIwkB,EAAMzkB,EAAMykB,IACZ7D,EAAM5gB,EAAM4gB,IACZ4D,EAAMxkB,EAAMwkB,IACZ+hB,EAAQvmC,EAAMumC,MACdyziB,EAASh6kB,EAAMg6kB,OACfC,EAAUj6kB,EAAMi6kB,QAChB1of,EAAWvxF,EAAMuxF,SACjBkmf,EAAWz3kB,EAAMy3kB,SACjBC,EAAU13kB,EAAM03kB,QAChBj7kB,EAAYuD,EAAMvD,UAClBwF,EAAWjC,EAAMiC,SACjBm4kB,GAAe,OAA8Bp6kB,EAAO45kB,GAExD,OAAoB,gBAAoB,OAAO,OAAS,CACtD35kB,IAAKA,GACJm6kB,EAAc,CACf39kB,UAAW,IAAWA,EAAWg7kB,KAC/Bx1kB,GAAW,OAAIA,GAAU,SAAUuC,GACrC,OAAoB,IAAAs/jB,cAAat/jB,EAAO,CACtC21kB,SAAS,GAEb,IAAKJ,EAAkB,CACrBt1jB,IAAKA,EACL7D,IAAKA,EACL4D,IAAKA,EACL+hB,MAAOA,EACPyziB,OAAQA,EACRC,QAASA,EACT1of,SAAUA,EACVkmf,SAAUA,EACVC,QAASA,GACRz3kB,GACL,IACAi6kB,EAAY36jB,YAAc,cAC1B26jB,EAAYlxgB,aA1FO,CACjBvkD,IAAK,EACLD,IAAK,IACL+sE,UAAU,EACV4of,SAAS,EACTH,QAAQ,EACRC,SAAS,GAqFX,qGChIII,EAAmB,SAAUjygB,GAG/B,SAASiygB,IACP,OAAOjygB,EAAiBlnE,MAAM5J,KAAM0J,YAAc1J,IACpD,CASA,OAbA,OAAe+ilB,EAAKjygB,GAMPiygB,EAAIpilB,UAEV8H,OAAS,WACd,MAAM,IAAIqO,MAAM,8NAElB,EAEOiskB,CACT,CAfuB,CAerB,aAEFA,EAAIj5iB,UAAY,IAChBi5iB,EAAIC,QAAU,IACdD,EAAIE,KAAO,IACX,yFCkBA,IAxCmB,SAAsBv6kB,GACvC,IAAI24kB,GAAmB,QAAgB34kB,EAAO,CAC5C44kB,UAAW,aAETj9kB,EAAKg9kB,EAAiBh9kB,GACtB6+kB,EAAwB7B,EAAiB8B,gBACzCf,EAAWf,EAAiBe,SAC5Bd,EAAYD,EAAiBC,UAC7B32jB,EAAa02jB,EAAiB12jB,WAC9By4jB,EAAe/B,EAAiB+B,aAChCC,EAAgBhC,EAAiBgC,cACjC14kB,EAAW02kB,EAAiB12kB,SAE5Bw4kB,GAAkB,IAAA77jB,UAAQ,WAC5B,OAAO47jB,GAAyB,SAAU3ilB,EAAK4I,GAC7C,OAAO9E,EAAKA,EAAK,IAAM8E,EAAO,IAAM5I,EAAM,IAC5C,CACF,GAAG,CAAC8D,EAAI6+kB,IACJI,GAAa,IAAAh8jB,UAAQ,WACvB,MAAO,CACL86jB,SAAUA,EACVd,UAAWA,EACX32jB,WAAYA,EACZy4jB,aAAcA,IAAgB,EAC9BC,cAAeA,IAAiB,EAChCE,gBAAiB,SAAyBhjlB,GACxC,OAAO4ilB,EAAgB5ilB,EAAK,UAC9B,EACAijlB,gBAAiB,SAAyBjjlB,GACxC,OAAO4ilB,EAAgB5ilB,EAAK,MAC9B,EAEJ,GAAG,CAAC6hlB,EAAUd,EAAW32jB,EAAYy4jB,EAAcC,EAAeF,IAClE,OAAoB,gBAAoB,IAAW56kB,SAAU,CAC3DvC,MAAOs9kB,GACO,gBAAoB,IAAkB/6kB,SAAU,CAC9DvC,MAAOo8kB,GAAY,MAClBz3kB,GACL,yGCzCI8C,EAAY,CAAC,WAAY,KAAM,aAI/Bg2kB,EAA0B,cAAiB,SAAUj3kB,EAAM7D,GAC7D,IAAIw3kB,EAAW3zkB,EAAK2zkB,SAChBG,EAAU9zkB,EAAK+zkB,GACf/ugB,OAAwB,IAAZ8ugB,EAAqB,MAAQA,EACzCn7kB,EAAYqH,EAAKrH,UACjBuD,GAAQ,OAA8B8D,EAAMiB,GAE5Ci2kB,GAAoB,QAAmBvD,EAAU,eACrD,OAAoB,gBAAoB3ugB,GAAW,OAAS,CAC1D7oE,IAAKA,GACJD,EAAO,CACRvD,UAAW,IAAWA,EAAWu+kB,KAErC,IACA,6IClBIj2kB,EAAY,CAAC,YAAa,kBAAmB,mBAC7C40kB,EAAa,CAAC,WAAY,YAAa,SAAU,UAAW,aAAc,YAAa,SAAU,YAAa,WAAY,eAAgB,gBAAiB,aAAc,KAAM,YA6BnL,IAAIsB,EAAuB,cAAiB,SAAUj7kB,EAAOC,GAC3D,IAAIi7kB,EAtBN,SAAuBl7kB,GACrB,IAAI3F,GAAU,IAAAkV,YAAW,KACzB,IAAKlV,EAAS,OAAO2F,EAErB,IAAI44kB,EAAYv+kB,EAAQu+kB,UACpBiC,EAAkBxglB,EAAQwglB,gBAC1BC,EAAkBzglB,EAAQyglB,gBAC1BlwkB,GAAO,OAA8BvQ,EAAS0K,GAE9Co2kB,GAAwC,IAArBn7kB,EAAMiiB,aAA4C,IAApBrX,EAAKqX,WACtDpqB,GAAM,OAAamI,EAAMy5kB,UAC7B,OAAO,OAAS,CAAC,EAAGz5kB,EAAO,CACzBw+B,OAAwB,MAAhBx+B,EAAMw+B,QAAyB,MAAP3mC,GAAc,OAAa+glB,KAAe/glB,EAAMmI,EAAMw+B,OACtF7iC,GAAIk/kB,EAAgB76kB,EAAMy5kB,UAC1B,kBAAmBqB,EAAgB96kB,EAAMy5kB,UACzCx3jB,WAAYk5jB,IAAqBn7kB,EAAMiiB,YAAcrX,EAAKqX,YAAc,KACxEy4jB,aAAoC,MAAtB16kB,EAAM06kB,aAAuB16kB,EAAM06kB,aAAe9vkB,EAAK8vkB,aACrEC,cAAsC,MAAvB36kB,EAAM26kB,cAAwB36kB,EAAM26kB,cAAgB/vkB,EAAK+vkB,eAE5E,CAGuBS,CAAcp7kB,GAC/By3kB,EAAWyD,EAAezD,SAC1Bh7kB,EAAYy+kB,EAAez+kB,UAC3B+hC,EAAS08iB,EAAe18iB,OACxB68iB,EAAUH,EAAeG,QACzBC,EAAaJ,EAAeI,WAC5BC,EAAYL,EAAeK,UAC3Bppd,EAAS+od,EAAe/od,OACxBqpd,EAAYN,EAAeM,UAC3BC,EAAWP,EAAeO,SAC1Bf,EAAeQ,EAAeR,aAC9BC,EAAgBO,EAAeP,cAC/Be,EAAaR,EAAej5jB,WAC5B05jB,EAAoBT,EAAerD,GACnC/ugB,OAAkC,IAAtB6ygB,EAA+B,MAAQA,EAEnD/wkB,GADIswkB,EAAezB,UACZ,OAA8ByB,EAAgBvB,IAErD3+kB,GAAS,QAAmBy8kB,EAAU,YAC1C,IAAKj5iB,IAAWk9iB,GAAcf,EAAe,OAAO,KACpD,IAAIiB,EAAoB,gBAAoB9ygB,GAAW,OAAS,CAAC,EAAGl+D,EAAM,CACxE3K,IAAKA,EACL2/B,KAAM,WACN,eAAgBpB,EAChB/hC,UAAW,IAAWA,EAAWzB,EAAQ,CACvCwjC,OAAQA,OAgBZ,OAbIk9iB,IAAYE,EAAoB,gBAAoBF,EAAY,CAClExid,GAAI16F,EACJ68iB,QAASA,EACTC,WAAYA,EACZC,UAAWA,EACXppd,OAAQA,EACRqpd,UAAWA,EACXC,SAAUA,EACVf,aAAcA,EACdC,cAAeA,GACdiB,IAGiB,gBAAoB,IAAW/7kB,SAAU,CAC3DvC,MAAO,MACO,gBAAoB,IAAkBuC,SAAU,CAC9DvC,MAAO,MACNs+kB,GACL,IACAX,EAAQ17jB,YAAc,UACtB,8KC/EIxa,EAAY,CAAC,KAAM,WAAY,aAAc,eAAgB,gBAAiB,WAAY,aA2B9F,SAAS82kB,EAAUr3kB,GACjB,IAAIs3kB,EAAet3kB,EAAMxE,MACrBq2G,EAAQyle,EAAazle,MACrBoje,EAAWqC,EAAarC,SACxBh6M,EAAWq8M,EAAar8M,SACxBs8M,EAAeD,EAAaC,aAC5BpglB,EAAKmglB,EAAanglB,GAEtB,OAAa,MAAT06G,EACK,KAGW,gBAAoB,IAAS,CAC/Cwhe,GAAI,IACJ4B,SAAUA,EACVh6M,SAAUA,EACV9jY,GAAIA,EACJc,UAAWs/kB,GACV1le,EACL,CAEA,IAAI2le,EAAO,SAAch8kB,GACvB,IAAI24kB,GAAmB,QAAgB34kB,EAAO,CAC5C44kB,UAAW,aAETj9kB,EAAKg9kB,EAAiBh9kB,GACtB+9kB,EAAWf,EAAiBe,SAC5Bz3jB,EAAa02jB,EAAiB12jB,WAC9By4jB,EAAe/B,EAAiB+B,aAChCC,EAAgBhC,EAAiBgC,cACjC14kB,EAAW02kB,EAAiB12kB,SAC5Bg6kB,EAAwBtD,EAAiBC,UACzCA,OAAsC,IAA1BqD,EA1ClB,SAA6Bh6kB,GAC3B,IAAIi6kB,EAMJ,OALA,OAAQj6kB,GAAU,SAAUuC,GACF,MAApB03kB,IACFA,EAAmB13kB,EAAMxE,MAAMy5kB,SAEnC,IACOyC,CACT,CAkCqDC,CAAoBl6kB,GAAYg6kB,EAC/EG,GAAkB,OAA8BzD,EAAkB5zkB,GAEtE,OAAoB,gBAAoB,IAAc,CACpDpJ,GAAIA,EACJi9kB,UAAWA,EACXc,SAAUA,EACVz3jB,WAAYA,EACZy4jB,aAAcA,EACdC,cAAeA,GACD,gBAAoB,KAAK,OAAS,CAAC,EAAGyB,EAAiB,CACrEx8iB,KAAM,UACNi4iB,GAAI,SACF,OAAI51kB,EAAU45kB,IAA0B,gBAAoB,IAAY,MAAM,OAAI55kB,GAAU,SAAUuC,GACxG,IAAI63kB,GAAa,OAAS,CAAC,EAAG73kB,EAAMxE,OAKpC,cAHOq8kB,EAAWhme,aACXgme,EAAW58M,gBACX48M,EAAWN,aACE,gBAAoB,IAASM,EACnD,KACF,EAEAL,EAAKhzgB,aAvEc,CACjB0ugB,QAAS,OACTgD,cAAc,EACdC,eAAe,GAqEjBqB,EAAKz8jB,YAAc,OACnB,kECnFA,SAASrG,EAAgBC,EAAUC,GACjC,KAAMD,aAAoBC,GACxB,MAAM,IAAIpI,UAAU,oCAExB,CAEA,SAASqI,EAAkBxW,EAAQ7C,GACjC,IAAK,IAAI/G,EAAI,EAAGA,EAAI+G,EAAMpH,OAAQK,IAAK,CACrC,IAAIqgB,EAAatZ,EAAM/G,GACvBqgB,EAAW3W,WAAa2W,EAAW3W,aAAc,EACjD2W,EAAWrI,cAAe,EACtB,UAAWqI,IAAYA,EAAWpI,UAAW,GACjD1R,OAAOyD,eAAeJ,EAAQyW,EAAWzhB,IAAKyhB,EAChD,CACF,CAEA,SAASC,EAAaH,EAAaI,EAAYC,GAG7C,OAFID,GAAYH,EAAkBD,EAAYnhB,UAAWuhB,GACrDC,GAAaJ,EAAkBD,EAAaK,GACzCL,CACT,CAEA,SAAS8B,EAAUH,EAAUC,GAC3B,GAA0B,oBAAfA,GAA4C,OAAfA,EACtC,MAAM,IAAIhK,UAAU,sDAGtB+J,EAAS9iB,UAAYuH,OAAOyb,OAAOD,GAAcA,EAAW/iB,UAAW,CACrEuU,YAAa,CACXlP,MAAOyd,EACP7J,UAAU,EACVD,cAAc,KAGd+J,GAAYV,EAAgBS,EAAUC,EAC5C,CAEA,SAASnB,EAAgB3J,GAIvB,OAHA2J,EAAkBra,OAAOsa,eAAiBta,OAAOua,eAAiB,SAAyB7J,GACzF,OAAOA,EAAE8J,WAAaxa,OAAOua,eAAe7J,EAC9C,EACO2J,EAAgB3J,EACzB,CAEA,SAASoK,EAAgBpK,EAAGqK,GAM1B,OALAD,EAAkB9a,OAAOsa,gBAAkB,SAAyB5J,EAAGqK,GAErE,OADArK,EAAE8J,UAAYO,EACPrK,CACT,EAEOoK,EAAgBpK,EAAGqK,EAC5B,CAuBA,SAASK,EAA2BjB,EAAMne,GACxC,OAAIA,GAAyB,kBAATA,GAAqC,oBAATA,EATlD,SAAgCme,GAC9B,QAAa,IAATA,EACF,MAAM,IAAIC,eAAe,6DAG3B,OAAOD,CACT,CAOSD,CAAuBC,GAHrBne,CAIX,CAEA,SAASoQ,EAAaC,GACpB,IAAIC,EA9BN,WACE,GAAuB,qBAAZC,UAA4BA,QAAQC,UAAW,OAAO,EACjE,GAAID,QAAQC,UAAUC,KAAM,OAAO,EACnC,GAAqB,oBAAVC,MAAsB,OAAO,EAExC,IAEE,OADAyU,KAAK1oB,UAAU+E,SAASxB,KAAKuQ,QAAQC,UAAU2U,KAAM,IAAI,WAAa,MAC/D,CACT,CAAE,MAAOlnB,GACP,OAAO,CACT,CACF,CAmBkC4S,GAEhC,OAAO,WACL,IACIvN,EADAwN,EAAQuN,EAAgBhO,GAG5B,GAAIC,EAA2B,CAC7B,IAAIS,EAAYsN,EAAgBviB,MAAMkV,YAEtC1N,EAASiN,QAAQC,UAAUM,EAAOtL,UAAWuL,EAC/C,MACEzN,EAASwN,EAAMpL,MAAM5J,KAAM0J,WAG7B,OAAO4Z,EAA2BtjB,KAAMwH,EAC1C,CACF,CAEA,SAASka,EAAmB1V,GAC1B,OAGF,SAA4BA,GAC1B,GAAI/H,MAAMiD,QAAQ8E,GAAM,OAAOyM,EAAkBzM,EACnD,CALSg5kB,CAAmBh5kB,IAO5B,SAA0B2V,GACxB,GAAsB,qBAAX1I,QAA0BA,OAAOC,YAAYhR,OAAOyZ,GAAO,OAAO1d,MAAM8U,KAAK4I,EAC1F,CAToCsjkB,CAAiBj5kB,IAWrD,SAAqC4M,EAAGC,GACtC,IAAKD,EAAG,OACR,GAAiB,kBAANA,EAAgB,OAAOH,EAAkBG,EAAGC,GACvD,IAAIC,EAAI5Q,OAAOvH,UAAU+E,SAASxB,KAAK0U,GAAG3H,MAAM,GAAI,GAC1C,WAAN6H,GAAkBF,EAAE1D,cAAa4D,EAAIF,EAAE1D,YAAYvQ,MACvD,GAAU,QAANmU,GAAqB,QAANA,EAAa,OAAO7U,MAAM8U,KAAKH,GAClD,GAAU,cAANE,GAAqB,2CAA2CE,KAAKF,GAAI,OAAOL,EAAkBG,EAAGC,EAC3G,CAlB6DF,CAA4B3M,IA4BzF,WACE,MAAM,IAAI0N,UAAU,uIACtB,CA9BiGwrkB,EACjG,CAmBA,SAASzskB,EAAkBzM,EAAKvG,IACnB,MAAPA,GAAeA,EAAMuG,EAAI1K,UAAQmE,EAAMuG,EAAI1K,QAE/C,IAAK,IAAIK,EAAI,EAAG+W,EAAO,IAAIzU,MAAMwB,GAAM9D,EAAI8D,EAAK9D,IAAK+W,EAAK/W,GAAKqK,EAAIrK,GAEnE,OAAO+W,CACT,CAMA,SAAS8oL,EAAQx7L,GACf,IAAI1E,EAASoI,UAAUpI,OAAS,QAAsBpB,IAAjBwJ,UAAU,GAAmBA,UAAU,GAAK,EAC7Ey7kB,EAAWj8jB,OAAOljB,GACtB,GAAe,IAAX1E,EAAc,OAAO6jlB,EACzB,IAAI7+kB,EAAQ6+kB,EAAS7+kB,MAAM,qBACvB5C,EAAS4C,EAAQA,EAAM,GAAK,GAC5B0rK,EAAS1rK,EAAQA,EAAM,GAAK,GAC5B8+kB,EAAQ9+kB,EAAQA,EAAM,GAAK6+kB,EAC3BE,EAAWD,EAAM9jlB,QAAUA,EAAS8jlB,GAAS1jkB,EAAmBzd,MAAM3C,IAAS2L,KAAI,WACrF,MAAO,GACT,IAAGf,KAAK,IAAMk5kB,GAAOn0kB,OAAgB,EAAV3P,GAC3B,MAAO,GAAG6K,OAAOzI,GAAQyI,OAAOk5kB,GAAUl5kB,OAAO6lK,EACnD,CACA,IAAIsza,EAAiC,CACnCC,aAAa,EACbC,YAAa,GAwCf,SAASC,EAAgBC,EAAW3llB,GAClC,IAAI04jB,EAAOitB,EAAUjtB,KACjBpnL,EAAQq0M,EAAUr0M,MAClBC,EAAUo0M,EAAUp0M,QACpBC,EAAUm0M,EAAUn0M,QAEpBr5W,EAAiBhwB,OAAOsF,OAAOtF,OAAOsF,OAAO,CAAC,EAAG83kB,GAAiCvllB,GAClFwllB,EAAcrtjB,EAAeqtjB,YAC7BC,EAActtjB,EAAestjB,YAC7BG,EAAwBztjB,EAAe0tjB,YACvCA,OAAwC,IAA1BD,EAAmCH,EAAcG,EAE/DE,EAAoB18jB,KAAKgE,IAAI,EAAGq4jB,GAChCM,EAAiBP,EAAc/jZ,EAAQ6vM,EAAe,GAAPonL,EAAW+sB,GAAehkZ,EAAQ6vM,EAAOw0M,GAC5F,MAAO,CACLptB,KAAM8sB,EAAc,GAAK/jZ,EAAQi3X,EAAMmtB,GACvCv0M,MAAOy0M,EACPx0M,QAAS9vM,EAAQ8vM,EAASu0M,GAC1Bt0M,QAAS/vM,EAAQ+vM,EAASs0M,GAE9B,CAEA,IAAIE,EAAY,SAAUj1gB,GACxBltD,EAAUmikB,EAAWj1gB,GAErB,IAAIh7D,EAASxB,EAAayxkB,GAE1B,SAASA,IACP,IAAI9vkB,EAyCJ,OAvCA2L,EAAgB5hB,KAAM+llB,IAEtB9vkB,EAAQH,EAAOlM,MAAM5J,KAAM0J,YACrB2gB,MAAQ,CACZ8rC,MAAOlgD,EAAMvN,MAAMytD,OAAS,GAG9BlgD,EAAM+vkB,eAAiB,WACrB/vkB,EAAMq1U,SAAW5lU,OAAOyiD,aAAY,WAGpB,IAFFlyD,EAAMoU,MAAM8rC,MAAQ,GAG9BlgD,EAAMgwkB,gBAENhwkB,EAAMvN,MAAMw9kB,YAAcjwkB,EAAMvN,MAAMw9kB,cAEtCjwkB,EAAMkuB,UAAS,SAAUs+F,GACvB,MAAO,CACLtsE,MAAOssE,EAAUtsE,MAAQ,EAE7B,GAEJ,GAAG,IACL,EAEAlgD,EAAMgwkB,cAAgB,WACpB19gB,cAActyD,EAAMq1U,SACtB,EAEAr1U,EAAMkwkB,QAAU,SAAU50M,GACxBt7X,EAAMgwkB,gBAENhwkB,EAAMkuB,UAAS,SAAUs+F,GACvB,MAAO,CACLtsE,MAAOssE,EAAUtsE,MAAQo7U,EAE7B,GAAGt7X,EAAM+vkB,eACX,EAEO/vkB,CACT,CAqBA,OAnBAgM,EAAa8jkB,EAAW,CAAC,CACvBxllB,IAAK,oBACLyF,MAAO,WACLhG,KAAKgmlB,gBACP,GACC,CACDzllB,IAAK,uBACLyF,MAAO,WACLuiE,cAAcvoE,KAAKsrV,SACrB,GACC,CACD/qV,IAAK,SACLyF,MAAO,WACL,OAAOhG,KAAK0I,MAAMiC,UAAW,IAAA6hkB,cAAaxskB,KAAK0I,MAAMiC,SAAU,CAC7DwrD,MAAOn2D,KAAKqqB,MAAM8rC,QACf,IACP,KAGK4vhB,CACT,CAtEgB,CAsEd,EAAAv0gB,WACFu0gB,EAAUt0gB,UAAY,CACpBtb,MAAO,EAAA5nD,OACP5D,SAAU,EAAAojB,QACVm4jB,WAAY,EAAA19kB,MAGd,IAAI49kB,EAAc,SAAUt1gB,GAC1BltD,EAAUwikB,EAAat1gB,GAEvB,IAAIh7D,EAASxB,EAAa8xkB,GAE1B,SAASA,EAAY19kB,GACnB,IAAIuN,EA8EJ,GA5EA2L,EAAgB5hB,KAAMomlB,IAEtBnwkB,EAAQH,EAAO5R,KAAKlE,KAAM0I,IACpB29kB,SAAU,EAChBpwkB,EAAMqwkB,iBAAmBrwkB,EAAMswkB,2BAC/BtwkB,EAAMuwkB,qBAAuBvwkB,EAAMvN,MAAM+9kB,UAAY,EAAIxwkB,EAAMqwkB,iBAC/DrwkB,EAAMywkB,WAAa,EACnBzwkB,EAAM0wkB,YAAa,EACnB1wkB,EAAM2wkB,oBAAqB,IAAArH,aAE3BtpkB,EAAM4wkB,KAAO,WACX,IAAInB,EAAYzvkB,EAAM6wkB,gBAElBrlkB,EAAWikkB,EAAUh8c,YAAczzH,EAAMvN,MAAMq+kB,cAAW7mlB,EAAY+V,EAAMvN,MAAMs+kB,OAEtF/wkB,EAAMgxkB,kBAAkBvB,OAAWxllB,EAAWuhB,EAChD,EAEAxL,EAAMoc,MAAQ,WACZ,IAAIpc,EAAMixkB,YAAV,CACA,IAAIC,EAA2BlxkB,EAAMuwkB,qBACrCvwkB,EAAMuwkB,qBAAuB,EAC7BvwkB,EAAMywkB,YAAcS,EAA2BlxkB,EAAMswkB,2BAA6BY,EAA2B,EAE7G,IAAIzB,EAAYzvkB,EAAM6wkB,gBAEtB7wkB,EAAMgxkB,kBAAkBvB,EAAW,UAAWzvkB,EAAMvN,MAAMgkF,SAErDz2E,EAAMvN,MAAM0+kB,YAAgB1B,EAAUh8c,YAAazzH,EAAMvN,MAAMq+kB,WAClE9wkB,EAAMoxkB,aAENpxkB,EAAMq1U,SAAW5lU,OAAOyiD,YAAYlyD,EAAM4wkB,KAAM5wkB,EAAMvN,MAAM4+kB,eAZjC,CAc/B,EAEArxkB,EAAMimF,MAAQ,WACRjmF,EAAM2T,aAEV3T,EAAMoxkB,aAENpxkB,EAAMuwkB,qBAAuBvwkB,EAAMswkB,2BAEnCtwkB,EAAMgxkB,kBAAkBhxkB,EAAMoU,MAAMq7jB,UAAW,SAAUzvkB,EAAMvN,MAAM4zF,SACvE,EAEArmF,EAAMc,KAAO,WACPd,EAAMsxkB,cAEVtxkB,EAAMoxkB,aAENpxkB,EAAMuwkB,qBAAuBvwkB,EAAMswkB,2BACnCtwkB,EAAMywkB,WAAazwkB,EAAMuwkB,qBAAuBvwkB,EAAMqwkB,iBAEtDrwkB,EAAMgxkB,kBAAkBhxkB,EAAM6wkB,gBAAiB,UAAW7wkB,EAAMvN,MAAM+wH,QACxE,EAEAxjH,EAAMixkB,UAAY,WAChB,OAAOjxkB,EAAMuxkB,SAAS,UACxB,EAEAvxkB,EAAM2T,SAAW,WACf,OAAO3T,EAAMuxkB,SAAS,SACxB,EAEAvxkB,EAAMsxkB,UAAY,WAChB,OAAOtxkB,EAAMuxkB,SAAS,UACxB,EAEAvxkB,EAAMwxkB,YAAc,WAClB,OAAOxxkB,EAAMuxkB,SAAS,YACxB,EAEAvxkB,EAAMyxkB,iBAAmB,SAAUhC,GAC7BzvkB,EAAMvN,MAAMw9kB,YAAYjwkB,EAAMvN,MAAMw9kB,WAAWR,EACrD,EAEIh9kB,EAAM2nY,KAAM,CACd,IAAIq1M,EAAYzvkB,EAAM6wkB,gBAEtB7wkB,EAAMoU,MAAQ,CACZq7jB,UAAWA,EACX/riB,OAAQ+riB,EAAUh8c,UAAY,YAAc,UAEhD,MACEzzH,EAAM0wkB,YAAa,EAGrB,OAAO1wkB,CACT,CAkMA,OAhMAgM,EAAamkkB,EAAa,CAAC,CACzB7llB,IAAK,oBACLyF,MAAO,WACDhG,KAAK2mlB,aAIT3mlB,KAAKqmlB,SAAU,EACXrmlB,KAAK0I,MAAMi/kB,SAAS3nlB,KAAK0I,MAAMi/kB,QAAQ3nlB,KAAK8mlB,iBAC5C9mlB,KAAK0I,MAAM+9kB,WAAWzmlB,KAAKqyB,QACjC,GACC,CACD9xB,IAAK,qBACLyF,MAAO,SAA4Bi/iB,GAC7BjljB,KAAK2mlB,YAIJ3mlB,KAAK8wV,eAAe9wV,KAAK0I,MAAOu8iB,KAC/BjljB,KAAK0I,MAAM2nY,OAAS40K,EAAU50K,OAChCrwY,KAAKsmlB,iBAAmBtmlB,KAAKumlB,2BAC7BvmlB,KAAKwmlB,qBAAuBxmlB,KAAKsmlB,iBACjCtmlB,KAAK0mlB,WAAa,GAGpB1mlB,KAAKinlB,kBAAkBjnlB,KAAK8mlB,iBAEhC,GACC,CACDvmlB,IAAK,uBACLyF,MAAO,WACDhG,KAAK2mlB,aAIT3mlB,KAAKqmlB,SAAU,EACfrmlB,KAAKqnlB,aACP,GACC,CACD9mlB,IAAK,gBACLyF,MAAO,WACL,IAAI4hlB,EAAc5nlB,KAAK0I,MACnB2nY,EAAOu3M,EAAYv3M,KACnB/mX,EAAMs+jB,EAAYt+jB,IAClB60E,EAAYypf,EAAYzpf,UACxBipf,EAAaQ,EAAYR,WACzBL,EAAWa,EAAYb,SAC3B,OA1RN,SAAuB12M,GACrB,IASIw3M,EATA9nlB,EAAU2J,UAAUpI,OAAS,QAAsBpB,IAAjBwJ,UAAU,GAAmBA,UAAU,GAAK,CAAC,EAC/Eo+kB,EAAe/nlB,EAAQupB,IACvBA,OAAuB,IAAjBw+jB,EAA0Bz+jB,KAAKC,IAAMw+jB,EAC3CC,EAAqBholB,EAAQo+F,UAC7BA,OAAmC,IAAvB4pf,EAAgC,EAAIA,EAChDX,EAAarnlB,EAAQqnlB,WACrBY,EAAsBjolB,EAAQ2mlB,WAC9BA,OAAqC,IAAxBsB,EAAiC,EAAIA,EAClDjB,EAAWhnlB,EAAQgnlB,SAIrBc,EADkB,kBAATx3M,EACQ,IAAIhnX,KAAKgnX,GAAM13T,UACvB03T,aAAgBhnX,KACRgnX,EAAK13T,UAEL03T,EAGd+2M,IACHS,GAAkBnB,GAGpB,IAAIuB,EAAWb,EAAaS,EAAiBA,EAAiBv+jB,IAC1D4+jB,EAAmB/+jB,KAAKgE,IAAI,GAAIhE,KAAK+D,IAAI,EAAGixE,IAC5Cl4C,EAAQ98B,KAAKI,MAAqG,IAA/FgwC,aAAawthB,EAAWkB,EAAW9+jB,KAAK+D,IAAI,EAAG+6jB,IAAa,KAAMt2iB,QAAQu2iB,KAC7F32M,EAAUpoX,KAAK0H,IAAIo1B,GAAS,IAChC,MAAO,CACLA,MAAOA,EACPwygB,KAAMtviB,KAAKu+B,MAAM6pV,EAAU,OAC3BF,MAAOloX,KAAKu+B,MAAM6pV,EAAU,KAAO,IACnCD,QAASnoX,KAAKu+B,MAAM6pV,EAAU,GAAK,IACnCA,QAASpoX,KAAKu+B,MAAM6pV,EAAU,IAC9Bt9C,aAAchrU,QAAQsoX,EAAU,EAAI,KAAM5/V,WAC1C+3F,UAAWzjF,GAAS,EAExB,CAqPa6giB,CAAcz2M,EAAM,CACzB/mX,IAAKA,EACL60E,UAAWA,EACXipf,WAAYA,EACZV,WAAY1mlB,KAAK0mlB,WACjBK,SAAUA,GAEd,GACC,CACDxmlB,IAAK,2BACLyF,MAAO,WACL,OAAOqjB,KAAKC,KACd,GACC,CACD/oB,IAAK,UACLyF,MAAO,SAAiBurY,GACtBvxY,KAAK4mlB,mBAAmB/jlB,QAAQsjlB,QAAQ50M,EAC1C,GACC,CACDhxY,IAAK,aACLyF,MAAO,WACL0f,OAAO6iD,cAAcvoE,KAAKsrV,SAC5B,GACC,CACD/qV,IAAK,WACLyF,MAAO,SAAkB2zC,GACvB,OAAO35C,KAAKqqB,MAAMsvB,SAAWA,CAC/B,GACC,CACDp5C,IAAK,iBACLyF,MAAO,SAAwBmilB,EAAMC,GACnC,IAAIC,EAAQnglB,OAAO6C,KAAKo9kB,GACxB,OAAOE,EAAM/mlB,SAAW4G,OAAO6C,KAAKq9kB,GAAM9mlB,SAAW+mlB,EAAM50jB,MAAK,SAAU60jB,GACxE,IAAIh6P,EAAS65P,EAAKG,GACd/5P,EAAS65P,EAAKE,GAClB,OAAQF,EAAKjglB,eAAemglB,MAAWh6P,IAAWC,GAAUD,IAAWA,GAAUC,IAAWA,EAC9F,GACF,GACC,CACDhuV,IAAK,oBACLyF,MAAO,SAA2B0/kB,EAAW/riB,EAAQl4B,GACnD,IAAIpL,EAASrW,KAEb,GAAKA,KAAKqmlB,QAAV,CACA,IAAIkC,GAECvolB,KAAKqqB,MAAMq7jB,UAAUh8c,WAAag8c,EAAUh8c,YAC1C1pI,KAAK0I,MAAMq+kB,UAAU/mlB,KAAKqnlB,aAC/BkB,EAAoBvolB,KAAK0nlB,kBAQ3B,OAAO1nlB,KAAKmkC,UAAS,SAAUs+F,GAC7B,IAAI+ld,EAAY7uiB,GAAU8oF,EAAU9oF,OAQpC,OANI+riB,EAAUh8c,YAAcrzH,EAAO3N,MAAMq+kB,SACvCyB,EAAY,YACF7uiB,GAAwB,cAAd6uiB,IACpBA,EAAY,WAGP,CACL9C,UAAWA,EACX/riB,OAAQ6uiB,EAEZ,IAlBa,WACP/mkB,GAAUA,EAASpL,EAAOgU,MAAMq7jB,WAChC6C,GAAmBA,EAAkBlykB,EAAOgU,MAAMq7jB,UACxD,GAXyB,CA2B3B,GACC,CACDnllB,IAAK,SACLyF,MAAO,WACL,OAAOhG,KAAKqrC,IAAMrrC,KAAKqrC,KAAO,CAC5BhZ,MAAOryB,KAAKqyB,MACZ6pE,MAAOl8F,KAAKk8F,MACZnlF,KAAM/W,KAAK+W,KACXmwkB,UAAWlnlB,KAAKknlB,UAChBt9jB,SAAU5pB,KAAK4pB,SACf29jB,UAAWvnlB,KAAKunlB,UAChBE,YAAaznlB,KAAKynlB,YAEtB,GACC,CACDlnlB,IAAK,iBACLyF,MAAO,WACL,IAAIyilB,EAAezolB,KAAK0I,MACpB68kB,EAAckD,EAAalD,YAC3BC,EAAciD,EAAajD,YAC3BI,EAAc6C,EAAa7C,YAC3BF,EAAY1llB,KAAKqqB,MAAMq7jB,UAC3B,OAAOx9kB,OAAOsF,OAAOtF,OAAOsF,OAAO,CAAC,EAAGk4kB,GAAY,CACjDr6iB,IAAKrrC,KAAKihW,SACVv4V,MAAO1I,KAAK0I,MACZgglB,UAAWjD,EAAgBC,EAAW,CACpCH,YAAaA,EACbC,YAAaA,EACbI,YAAaA,KAGnB,GACC,CACDrllB,IAAK,SACLyF,MAAO,WACL,GAAIhG,KAAK2mlB,WAAY,CACnB,IAAIgC,EAAe3olB,KAAK0I,MACpBytD,EAAQwyhB,EAAaxyhB,MACrByyhB,EAAYD,EAAah+kB,SACzBu7kB,EAAayC,EAAazC,WAC9B,OAAO,IAAAjllB,eAAc8klB,EAAW,CAC9Bp9kB,IAAK3I,KAAK4mlB,mBACVzwhB,MAAOA,EACP+vhB,WAAYA,GACX0C,EACL,CAEA,IAAIC,EAAe7olB,KAAK0I,MACpBvD,EAAY0jlB,EAAa1jlB,UACzB4hlB,EAAW8B,EAAa9B,SACxBp8kB,EAAWk+kB,EAAal+kB,SACxBoI,EAAW81kB,EAAa91kB,SACxB+1kB,EAAc9olB,KAAK+olB,iBAEvB,GAAIh2kB,EACF,OAAOA,EAAS+1kB,GAGlB,GAAIn+kB,GAAY3K,KAAKqqB,MAAMq7jB,UAAUh8c,YAAcq9c,EACjD,OAAO,IAAAva,cAAa7hkB,EAAU,CAC5Bq+kB,UAAWF,IAIf,IAAIG,EAAwBH,EAAYJ,UACpCjwB,EAAOwwB,EAAsBxwB,KAC7BpnL,EAAQ43M,EAAsB53M,MAC9BC,EAAU23M,EAAsB33M,QAChCC,EAAU03M,EAAsB13M,QACpC,OAAO,IAAAtwY,eAAc,OAAQ,CAC3BkE,UAAWA,GACV2jlB,EAAY7iiB,MAAQ,EAAI,IAAM,GAAIwygB,EAAMA,EAAO,IAAM,GAAIpnL,EAAO,IAAKC,EAAS,IAAKC,EACxF,KAGK60M,CACT,CAnSkB,CAmShB,EAAA50gB,WACF40gB,EAAY10gB,aAAexpE,OAAOsF,OAAOtF,OAAOsF,OAAO,CAAC,EAAG83kB,GAAiC,CAC1F8B,YAAY,EACZE,cAAe,IACfnpf,UAAW,EACXsof,WAAW,IAEbL,EAAY30gB,UAAY,CACtB4+T,MAAM,IAAA5hU,WAAU,EAAC,IAAAH,YAAWjlD,MAAO,EAAApiB,OAAQ,EAAAsH,SAC3Cg3kB,YAAa,EAAAt3gB,KACbu3gB,YAAa,EAAAj3kB,OACbq3kB,YAAa,EAAAr3kB,OACb64kB,WAAY,EAAAn5gB,KACZq5gB,cAAe,EAAA/4kB,OACf4vF,UAAW,EAAA5vF,OACXk4kB,UAAW,EAAAx4gB,KACX84gB,SAAU,EAAA94gB,KACV9oE,UAAW,EAAA8B,OACX0D,SAAU,EAAAojB,QACVhb,SAAU,EAAAvK,KACV8gB,IAAK,EAAA9gB,KACLm/kB,QAAS,EAAAn/kB,KACTkkF,QAAS,EAAAlkF,KACT8zF,QAAS,EAAA9zF,KACTixH,OAAQ,EAAAjxH,KACRw+kB,OAAQ,EAAAx+kB,KACR09kB,WAAY,EAAA19kB,MAGd,2CC1lBa,IAAI0glB,EAAG,EAAQ,OAAS,SAAS70iB,EAAEzW,GAAG,IAAI,IAAIC,EAAE,yDAAyDD,EAAEgwB,EAAE,EAAEA,EAAElkD,UAAUpI,OAAOssD,IAAI/vB,GAAG,WAAW8d,mBAAmBjyC,UAAUkkD,IAAI,MAAM,yBAAyBhwB,EAAE,WAAWC,EAAE,gHAAgH,CAChW,IAAI5a,EAAE/a,OAAOvH,UAAUwH,eAAeghlB,EAAG,8VAA8VC,EAAG,CAAC,EAAEC,EAAG,CAAC,EACjZ,SAASC,EAAG1rjB,GAAG,QAAG3a,EAAE/e,KAAKmllB,EAAGzrjB,KAAe3a,EAAE/e,KAAKkllB,EAAGxrjB,KAAeurjB,EAAGnwkB,KAAK4kB,GAAUyrjB,EAAGzrjB,IAAG,GAAGwrjB,EAAGxrjB,IAAG,GAAS,GAAE,CAAC,SAASozD,EAAEpzD,EAAEC,EAAE+vB,EAAEgc,EAAEp6B,EAAErtC,EAAEuyC,GAAG10C,KAAKuplB,gBAAgB,IAAI1rjB,GAAG,IAAIA,GAAG,IAAIA,EAAE79B,KAAK42V,cAAchtR,EAAE5pE,KAAKwplB,mBAAmBh6iB,EAAExvC,KAAKyplB,gBAAgB77hB,EAAE5tD,KAAKgna,aAAappY,EAAE59B,KAAKmJ,KAAK00B,EAAE79B,KAAK0plB,YAAYvnlB,EAAEnC,KAAK2plB,kBAAkBj1iB,CAAC,CAAC,IAAI8gB,EAAE,CAAC,EAC7U,uIAAuIhyD,MAAM,KAAKnB,SAAQ,SAASu7B,GAAG43B,EAAE53B,GAAG,IAAIozD,EAAEpzD,EAAE,GAAE,EAAGA,EAAE,MAAK,GAAG,EAAG,IAAG,CAAC,CAAC,gBAAgB,kBAAkB,CAAC,YAAY,SAAS,CAAC,UAAU,OAAO,CAAC,YAAY,eAAev7B,SAAQ,SAASu7B,GAAG,IAAIC,EAAED,EAAE,GAAG43B,EAAE33B,GAAG,IAAImzD,EAAEnzD,EAAE,GAAE,EAAGD,EAAE,GAAG,MAAK,GAAG,EAAG,IAAG,CAAC,kBAAkB,YAAY,aAAa,SAASv7B,SAAQ,SAASu7B,GAAG43B,EAAE53B,GAAG,IAAIozD,EAAEpzD,EAAE,GAAE,EAAGA,EAAEx3B,cAAc,MAAK,GAAG,EAAG,IAC1e,CAAC,cAAc,4BAA4B,YAAY,iBAAiB/D,SAAQ,SAASu7B,GAAG43B,EAAE53B,GAAG,IAAIozD,EAAEpzD,EAAE,GAAE,EAAGA,EAAE,MAAK,GAAG,EAAG,IAAG,8OAA8Op6B,MAAM,KAAKnB,SAAQ,SAASu7B,GAAG43B,EAAE53B,GAAG,IAAIozD,EAAEpzD,EAAE,GAAE,EAAGA,EAAEx3B,cAAc,MAAK,GAAG,EAAG,IACxb,CAAC,UAAU,WAAW,QAAQ,YAAY/D,SAAQ,SAASu7B,GAAG43B,EAAE53B,GAAG,IAAIozD,EAAEpzD,EAAE,GAAE,EAAGA,EAAE,MAAK,GAAG,EAAG,IAAG,CAAC,UAAU,YAAYv7B,SAAQ,SAASu7B,GAAG43B,EAAE53B,GAAG,IAAIozD,EAAEpzD,EAAE,GAAE,EAAGA,EAAE,MAAK,GAAG,EAAG,IAAG,CAAC,OAAO,OAAO,OAAO,QAAQv7B,SAAQ,SAASu7B,GAAG43B,EAAE53B,GAAG,IAAIozD,EAAEpzD,EAAE,GAAE,EAAGA,EAAE,MAAK,GAAG,EAAG,IAAG,CAAC,UAAU,SAASv7B,SAAQ,SAASu7B,GAAG43B,EAAE53B,GAAG,IAAIozD,EAAEpzD,EAAE,GAAE,EAAGA,EAAEx3B,cAAc,MAAK,GAAG,EAAG,IAAG,IAAIwjlB,EAAG,gBAAgB,SAASC,EAAGjsjB,GAAG,OAAOA,EAAE,GAAG+X,aAAa,CACxZ,0jCAA0jCnyC,MAAM,KAAKnB,SAAQ,SAASu7B,GAAG,IAAIC,EAAED,EAAEz3B,QAAQyjlB,EACzmCC,GAAIr0hB,EAAE33B,GAAG,IAAImzD,EAAEnzD,EAAE,GAAE,EAAGD,EAAE,MAAK,GAAG,EAAG,IAAG,2EAA2Ep6B,MAAM,KAAKnB,SAAQ,SAASu7B,GAAG,IAAIC,EAAED,EAAEz3B,QAAQyjlB,EAAGC,GAAIr0hB,EAAE33B,GAAG,IAAImzD,EAAEnzD,EAAE,GAAE,EAAGD,EAAE,gCAA+B,GAAG,EAAG,IAAG,CAAC,WAAW,WAAW,aAAav7B,SAAQ,SAASu7B,GAAG,IAAIC,EAAED,EAAEz3B,QAAQyjlB,EAAGC,GAAIr0hB,EAAE33B,GAAG,IAAImzD,EAAEnzD,EAAE,GAAE,EAAGD,EAAE,wCAAuC,GAAG,EAAG,IAAG,CAAC,WAAW,eAAev7B,SAAQ,SAASu7B,GAAG43B,EAAE53B,GAAG,IAAIozD,EAAEpzD,EAAE,GAAE,EAAGA,EAAEx3B,cAAc,MAAK,GAAG,EAAG,IACldovD,EAAEs0hB,UAAU,IAAI94f,EAAE,YAAY,GAAE,EAAG,aAAa,gCAA+B,GAAG,GAAI,CAAC,MAAM,OAAO,SAAS,cAAc3uF,SAAQ,SAASu7B,GAAG43B,EAAE53B,GAAG,IAAIozD,EAAEpzD,EAAE,GAAE,EAAGA,EAAEx3B,cAAc,MAAK,GAAG,EAAG,IAC5L,IAAIskE,EAAE,CAACu+B,yBAAwB,EAAG8gf,aAAY,EAAG7gf,mBAAkB,EAAGC,kBAAiB,EAAGC,kBAAiB,EAAGC,SAAQ,EAAGC,cAAa,EAAGC,iBAAgB,EAAGC,aAAY,EAAGC,SAAQ,EAAGl3D,MAAK,EAAGm3D,UAAS,EAAGC,cAAa,EAAG7pF,YAAW,EAAG8pF,cAAa,EAAGC,WAAU,EAAGmgf,UAAS,EAAGlgf,SAAQ,EAAGC,YAAW,EAAGC,aAAY,EAAGC,cAAa,EAAGC,YAAW,EAAGC,eAAc,EAAGC,gBAAe,EAAGC,iBAAgB,EAAGjqF,YAAW,EAAGkqF,WAAU,EAAG7hE,YAAW,EAAG9c,SAAQ,EAAGiH,OAAM,EAAG23E,SAAQ,EAAGC,SAAQ,EAAGC,QAAO,EAAG9kE,QAAO,EAAG+kE,MAAK,EACzfC,aAAY,EAAGC,cAAa,EAAGC,aAAY,EAAGC,iBAAgB,EAAGC,kBAAiB,EAAGC,kBAAiB,EAAGC,eAAc,EAAGC,aAAY,GAAI++e,EAAG,CAAC,SAAS,KAAK,MAAM,KAAK/hlB,OAAO6C,KAAK2/D,GAAGroE,SAAQ,SAASu7B,GAAGqsjB,EAAG5nlB,SAAQ,SAASw7B,GAAGA,EAAEA,EAAED,EAAEmnB,OAAO,GAAGpP,cAAc/X,EAAE4S,UAAU,GAAGk6B,EAAE7sC,GAAG6sC,EAAE9sC,EAAE,GAAE,IAAG,IAAIssjB,EAAG,UACnS,SAAShpjB,EAAEtD,GAAG,GAAG,mBAAmBA,GAAG,kBAAkBA,EAAE,MAAM,GAAGA,EAAEA,EAAE,GAAGA,EAAE,IAAIC,EAAEqsjB,EAAGjilB,KAAK21B,GAAG,GAAGC,EAAE,CAAC,IAAS+rC,EAALhc,EAAE,GAAKpe,EAAE,EAAE,IAAIo6B,EAAE/rC,EAAErtB,MAAMo5D,EAAEhsC,EAAEt8B,OAAOsoE,IAAI,CAAC,OAAOhsC,EAAE57B,WAAW4nE,IAAI,KAAK,GAAG/rC,EAAE,SAAS,MAAM,KAAK,GAAGA,EAAE,QAAQ,MAAM,KAAK,GAAGA,EAAE,SAAS,MAAM,KAAK,GAAGA,EAAE,OAAO,MAAM,KAAK,GAAGA,EAAE,OAAO,MAAM,QAAQ,SAAS2R,IAAIo6B,IAAIhc,GAAGhwB,EAAE4S,UAAUhB,EAAEo6B,IAAIp6B,EAAEo6B,EAAE,EAAEhc,GAAG/vB,CAAC,CAACD,EAAE4R,IAAIo6B,EAAEhc,EAAEhwB,EAAE4S,UAAUhB,EAAEo6B,GAAGhc,CAAC,CAAC,OAAOhwB,CAAC,CAAC,IAAIusjB,EAAG,WAAWC,EAAG,OAAOC,EAAGpmlB,MAAMiD,QAAQ,SAAS26C,EAAEjkB,EAAEC,GAAG,MAAM,CAACysjB,cAAc1sjB,EAAE2sjB,cAAc1sjB,EAAE,CAC5F,IAAI2sjB,EAAG,IAAItzkB,IACnZ,SAASuzkB,EAAG7sjB,EAAEC,EAAE+vB,GAAG,GAAG,kBAAkBA,EAAE,MAAM92C,MAAMu9B,EAAE,KAAU,IAAI,IAAIu1B,KAAb/rC,GAAE,EAAgB+vB,EAAE,GAAG3qC,EAAE/e,KAAK0pD,EAAEgc,GAAG,CAAC,IAAIp6B,EAAEoe,EAAEgc,GAAG,GAAG,MAAMp6B,GAAG,mBAAmBA,GAAG,KAAKA,EAAE,CAAC,GAAG,IAAIo6B,EAAE11D,QAAQ,MAAM,CAAC,IAAI/R,EAAE++B,EAAE0oC,GAAGp6B,EAAEtO,GAAG,GAAGsO,GAAGwH,OAAO,KAAK,CAAC70C,EAAEynE,EAAE,IAAIl1B,EAAE81iB,EAAG3nkB,IAAI1gB,QAAG,IAASuyC,IAAOA,EAAExT,EAAE/+B,EAAEgE,QAAQgklB,EAAG,OAAO/jlB,cAAcD,QAAQiklB,EAAG,SAASI,EAAGpzkB,IAAIjV,EAAEuyC,IAAxEvyC,EAAEuyC,EAA8ElF,EAAE,kBAAkBA,EAAE,IAAIA,GAAGvsB,EAAE/e,KAAKwmE,EAAEd,GAAG,GAAGp6B,EAAEA,EAAE,KAAKtO,GAAG,GAAGsO,GAAGwH,OAAO,CAACnZ,GAAGA,GAAE,EAAGD,EAAEn8B,KAAK,WAAWU,EAAE,IAAIqtC,IAAI5R,EAAEn8B,KAAK,IAAIU,EAAE,IAAIqtC,EAAE,CAAC,CAAC3R,GAAGD,EAAEn8B,KAAK,IAAI,CAC7c,SAASktB,EAAEiP,EAAEC,EAAE+vB,EAAEgc,GAAG,OAAOhc,GAAG,IAAK,QAAkB,YAAV68hB,EAAG7sjB,EAAEC,EAAE+rC,GAAU,IAAK,eAAe,IAAK,iBAAiB,IAAK,YAAY,IAAK,iCAAiC,IAAK,2BAA2B,OAAO,KAAK,EAAEhc,EAAEtsD,SAAS,MAAMssD,EAAE,IAAI,MAAMA,EAAE,IAAI,MAAMA,EAAE,IAAI,MAAMA,EAAE,GAAG,GAAmC,QAAhC/vB,EAAE23B,EAAErtD,eAAeylD,GAAG4H,EAAE5H,GAAG,MAAc,CAAC,cAAcgc,GAAG,IAAK,WAAW,IAAK,SAAS,OAAO,IAAK,UAAU,IAAI/rC,EAAE0rjB,gBAAgB,OAAyB,OAAlB37hB,EAAE/vB,EAAE+4T,cAAqB/4T,EAAE10B,MAAM,KAAK,EAAEygE,GAAGhsC,EAAEn8B,KAAK,IAAImsD,EAAE,OAAO,MAAM,KAAK,GAAE,IAAKgc,EAAEhsC,EAAEn8B,KAAK,IAAImsD,EAAE,QACpf,IAAKgc,GAAGhsC,EAAEn8B,KAAK,IAAImsD,EAAE,KAAK1sB,EAAE0oC,GAAG,KAAK,MAAM,KAAK,EAAE64B,MAAM74B,IAAIhsC,EAAEn8B,KAAK,IAAImsD,EAAE,KAAK1sB,EAAE0oC,GAAG,KAAK,MAAM,KAAK,GAAG64B,MAAM74B,IAAI,GAAGA,GAAGhsC,EAAEn8B,KAAK,IAAImsD,EAAE,KAAK1sB,EAAE0oC,GAAG,KAAK,MAAM,QAAQ/rC,EAAE6rjB,cAAc9/gB,EAAE,GAAGA,GAAGhsC,EAAEn8B,KAAK,IAAImsD,EAAE,KAAK1sB,EAAE0oC,GAAG,KAAK,MAAM,GAAG0/gB,EAAG17hB,GAAG,CAAC,cAAcgc,GAAG,IAAK,WAAW,IAAK,SAAS,OAAO,IAAK,UAAU,GAAgC,WAA7B/rC,EAAE+vB,EAAExnD,cAAc6K,MAAM,EAAE,KAAgB,UAAU4sB,EAAE,OAAOD,EAAEn8B,KAAK,IAAImsD,EAAE,KAAK1sB,EAAE0oC,GAAG,IAAI,CAAC,CACpY,SAAS/6C,EAAE+O,EAAEC,EAAE+vB,GAAG,GAAG,MAAM/vB,EAAE,CAAC,GAAG,MAAM+vB,EAAE,MAAM92C,MAAMu9B,EAAE,KAAK,GAAG,kBAAkBxW,KAAK,WAAWA,GAAG,MAAM/mB,MAAMu9B,EAAE,KAAgB,QAAXxW,EAAEA,EAAE6sjB,cAAiB,IAAS7sjB,GAAGD,EAAEn8B,KAAK,GAAGo8B,EAAE,CAAC,CACrK,SAAS8sjB,EAAG/sjB,EAAEC,EAAE+vB,EAAEgc,GAAGhsC,EAAEn8B,KAAKmpE,EAAEhd,IAAI,IAAazrD,EAATqtC,EAAEoe,EAAE,KAAO,IAAIzrD,KAAK07B,EAAE,GAAG5a,EAAE/e,KAAK25B,EAAE17B,GAAG,CAAC,IAAIuyC,EAAE7W,EAAE17B,GAAG,GAAG,MAAMuyC,EAAE,OAAOvyC,GAAG,IAAK,WAAWyrD,EAAElZ,EAAE,MAAM,IAAK,0BAA0BlF,EAAEkF,EAAE,MAAM,QAAQ/lB,EAAEiP,EAAEgsC,EAAEznE,EAAEuyC,GAAG,CAAsB,OAArB9W,EAAEn8B,KAAK,KAAKotB,EAAE+O,EAAE4R,EAAEoe,GAAS,kBAAkBA,GAAGhwB,EAAEn8B,KAAKy/B,EAAE0sB,IAAI,MAAMA,CAAC,CAAC,IAAIg9hB,EAAG,8BAA8BC,EAAG,IAAI3zkB,IAAI,SAAS0zD,EAAEhtC,GAAG,IAAIC,EAAEgtjB,EAAGhokB,IAAI+a,GAAG,QAAG,IAASC,EAAE,CAAC,IAAI+sjB,EAAG5xkB,KAAK4kB,GAAG,MAAM9mB,MAAMu9B,EAAE,GAAGzW,IAAIC,EAAE,IAAID,EAAEitjB,EAAGzzkB,IAAIwmB,EAAEC,EAAE,CAAC,OAAOA,CAAC,CACra,SAASitjB,EAAGltjB,EAAEC,EAAE+vB,EAAEgc,EAAEp6B,GAAG,OAAO3R,GAAG,IAAK,SAASD,EAAEn8B,KAAKmpE,EAAE,WAAW,IAAIzoE,EAAE,KAAKuyC,EAAE,KAAK,IAAI57B,KAAK80C,EAAE,GAAG3qC,EAAE/e,KAAK0pD,EAAE90C,GAAG,CAAC,IAAItT,EAAEooD,EAAE90C,GAAG,GAAG,MAAMtT,EAAE,OAAOsT,GAAG,IAAK,WAAW3W,EAAEqD,EAAE,MAAM,IAAK,0BAA0BkvC,EAAElvC,EAAE,MAAM,IAAK,eAAe,IAAK,QAAQ,MAAM,QAAQmpB,EAAEiP,EAAEgsC,EAAE9wD,EAAEtT,GAAG,CAAsB,OAArBo4B,EAAEn8B,KAAK,KAAKotB,EAAE+O,EAAE8W,EAAEvyC,GAAUA,EAAE,IAAK,SAASuyC,EAAElF,EAAE+6iB,cAAc3sjB,EAAEn8B,KAAKmpE,EAAE,WAAW,IAAIrlE,EAAEC,EAAE,KAAK2vB,EAAE,KAASrc,EAAE,KAAK,IAAI3W,KAAKyrD,EAAE,GAAG3qC,EAAE/e,KAAK0pD,EAAEzrD,GAAG,CAAC,IAAI06E,EAAEjvB,EAAEzrD,GAAG,GAAG,MAAM06E,EAAE,OAAO16E,GAAG,IAAK,WAAWqD,EAAEq3E,EAAE,MAAM,IAAK,WAAW1nD,EAAE0nD,EAAE,MAAM,IAAK,0BAA0B/jE,EAC7gB+jE,EAAE,MAAM,IAAK,QAAQt3E,EAAEs3E,EAAE,QAAQluD,EAAEiP,EAAEgsC,EAAEznE,EAAE06E,GAAG,CAAC,GAAG,MAAMnoC,EAAE,GAAGkZ,EAAE,OAAOroD,EAAE,GAAGA,EAH6F,SAAYq4B,GAAG,IAAIC,EAAE,GAAuD,OAApDqrjB,EAAGrikB,SAASxkB,QAAQu7B,GAAE,SAASA,GAAG,MAAMA,IAAIC,GAAGD,EAAE,IAAUC,CAAC,CAG/K8+C,CAAGn3E,GAAG6klB,EAAG31iB,IAAG,IAAIk1B,EAAE,EAAEA,EAAEl1B,EAAEpzC,OAAOsoE,IAAK,GAAG,GAAGl1B,EAAEk1B,KAAKhc,EAAE,CAAChwB,EAAEn8B,KAAK,gBAAgB,KAAK,MAAM,GAAGizC,IAAIkZ,GAAGhwB,EAAEn8B,KAAK,qBAAqB0zB,GAAGyI,EAAEn8B,KAAK,gBAAqC,OAArBm8B,EAAEn8B,KAAK,KAAKotB,EAAE+O,EAAE9kB,EAAEtT,GAAUA,EAAE,IAAK,WAA4C,IAAIA,KAArCo4B,EAAEn8B,KAAKmpE,EAAE,aAAa9xD,EAAE47B,EAAEvyC,EAAE,KAAcyrD,EAAE,GAAG3qC,EAAE/e,KAAK0pD,EAAEpoD,IAAY,OAAPD,EAAEqoD,EAAEpoD,IAAY,OAAOA,GAAG,IAAK,WAAWsT,EAAEvT,EAAE,MAAM,IAAK,QAAQpD,EAAEoD,EAAE,MAAM,IAAK,eAAemvC,EAAEnvC,EAAE,MAAM,IAAK,0BAA0B,MAAMuR,MAAMu9B,EAAE,KAAK,QAAQ1lB,EAAEiP,EAAEgsC,EACnfpkE,EAAED,GAAyC,GAAtC,OAAOpD,GAAG,OAAOuyC,IAAIvyC,EAAEuyC,GAAG9W,EAAEn8B,KAAK,KAAQ,MAAMqX,EAAE,CAAC,GAAG,MAAM3W,EAAE,MAAM2U,MAAMu9B,EAAE,KAAK,GAAGg2iB,EAAGvxkB,IAAI,EAAEA,EAAExX,OAAO,MAAMwV,MAAMu9B,EAAE,KAAKlyC,EAAE,GAAG2W,CAAC,CAA0E,MAAzE,kBAAkB3W,GAAG,OAAOA,EAAE,IAAIy7B,EAAEn8B,KAAK,MAAM,OAAOU,GAAGy7B,EAAEn8B,KAAKy/B,EAAE,GAAG/+B,IAAW,KAAK,IAAK,QAAwC,IAAIuyC,KAApC9W,EAAEn8B,KAAKmpE,EAAE,UAAUrlE,EAAEuT,EAAEtT,EAAErD,EAAE,KAAcyrD,EAAE,GAAG3qC,EAAE/e,KAAK0pD,EAAElZ,IAAY,OAAPvf,EAAEy4B,EAAElZ,IAAY,OAAOA,GAAG,IAAK,WAAW,IAAK,0BAA0B,MAAM59B,MAAMu9B,EAAE,IAAI,UAAU,IAAK,iBAAiB9uC,EAAE4vB,EAAE,MAAM,IAAK,eAAe3vB,EAAE2vB,EAAE,MAAM,IAAK,UAAUrc,EAAEqc,EAAE,MAAM,IAAK,QAAQhzB,EAAEgzB,EAAE,MAC/e,QAAQxG,EAAEiP,EAAEgsC,EAAEl1B,EAAEvf,GAA8H,OAA3H,OAAOrc,EAAE6V,EAAEiP,EAAEgsC,EAAE,UAAU9wD,GAAG,OAAOvT,GAAGopB,EAAEiP,EAAEgsC,EAAE,UAAUrkE,GAAG,OAAOpD,EAAEwsB,EAAEiP,EAAEgsC,EAAE,QAAQznE,GAAG,OAAOqD,GAAGmpB,EAAEiP,EAAEgsC,EAAE,QAAQpkE,GAAGo4B,EAAEn8B,KAAK,MAAa,KAAK,IAAK,WAAiC,IAAI,IAAIyiZ,KAA9BtmX,EAAEn8B,KAAKmpE,EAAE,aAA0Bhd,EAAE,GAAG3qC,EAAE/e,KAAK0pD,EAAEs2V,IAAY,OAAP/hZ,EAAEyrD,EAAEs2V,IAAY,OAAOA,GAAG,IAAK,WAAW,IAAK,0BAA0B,MAAMptY,MAAMu9B,EAAE,MAAM,QAAQ1lB,EAAEiP,EAAEgsC,EAAEs6U,EAAE/hZ,GAAe,OAAZy7B,EAAEn8B,KAAK,KAAY,KAAK,IAAK,QAAkC,IAAIo7E,KAA9Bj/C,EAAEn8B,KAAKmpE,EAAE,UAAUzoE,EAAE,KAAcyrD,EAAE,GAAG3qC,EAAE/e,KAAK0pD,EAAEivB,IAAY,OAAPnoC,EAAEkZ,EAAEivB,IAAY,OAAOA,GAAG,IAAK,WAAW16E,EAAEuyC,EAAE,MAAM,IAAK,0BAA0B,MAAM59B,MAAMu9B,EAAE,MAC5gB,QAAQ1lB,EAAEiP,EAAEgsC,EAAEiT,EAAEnoC,GAAe,OAAZ9W,EAAEn8B,KAAK,KAAYU,EAAE,IAAK,UAAU,IAAK,MAA4B,IAAIoD,KAA1Bq4B,EAAEn8B,KAAKmpE,EAAE/sC,IAAI6W,EAAEvyC,EAAE,KAAcyrD,EAAE,GAAG3qC,EAAE/e,KAAK0pD,EAAEroD,IAAY,OAAPC,EAAEooD,EAAEroD,IAAY,OAAOA,GAAG,IAAK,WAAWpD,EAAEqD,EAAE,MAAM,IAAK,0BAA0BkvC,EAAElvC,EAAE,MAAM,QAAQmpB,EAAEiP,EAAEgsC,EAAErkE,EAAEC,GAAe,GAAZo4B,EAAEn8B,KAAK,KAAQ,MAAMizC,EAAE,CAAC,GAAG,MAAMvyC,EAAE,MAAM2U,MAAMu9B,EAAE,KAAK,GAAG,kBAAkBK,KAAK,WAAWA,GAAG,MAAM59B,MAAMu9B,EAAE,KAAgB,QAAXuZ,EAAElZ,EAAEg2iB,cAAiB,IAAS98hB,IAAI,kBAAkBA,GAAG,EAAEA,EAAEtsD,QAAQ,OAAOssD,EAAE,GAAGhwB,EAAEn8B,KAAK,KAAKmsD,GAAGhwB,EAAEn8B,KAAK,GAAGmsD,GAAG,CAAgD,MAA/C,kBAAkBzrD,GAAG,OAAOA,EAAE,IAAIy7B,EAAEn8B,KAAK,MAAaU,EACvf,IAAK,OAAO,IAAK,OAAO,IAAK,KAAK,IAAK,MAAM,IAAK,QAAQ,IAAK,KAAK,IAAK,MAAM,IAAK,SAAS,IAAK,OAAO,IAAK,OAAO,IAAK,QAAQ,IAAK,SAAS,IAAK,QAAQ,IAAK,MAAmB,IAAI,IAAIiiZ,KAArBxmX,EAAEn8B,KAAKmpE,EAAE/sC,IAAiB+vB,EAAE,GAAG3qC,EAAE/e,KAAK0pD,EAAEw2V,IAAY,OAAPjiZ,EAAEyrD,EAAEw2V,IAAY,OAAOA,GAAG,IAAK,WAAW,IAAK,0BAA0B,MAAMttY,MAAMu9B,EAAE,IAAIxW,IAAI,QAAQlP,EAAEiP,EAAEgsC,EAAEw6U,EAAEjiZ,GAAgB,OAAby7B,EAAEn8B,KAAK,MAAa,KAAK,IAAK,iBAAiB,IAAK,gBAAgB,IAAK,YAAY,IAAK,gBAAgB,IAAK,gBAAgB,IAAK,mBAAmB,IAAK,iBAAiB,IAAK,gBAAgB,OAAOkplB,EAAG/sjB,EACnhBgwB,EAAE/vB,EAAE+rC,GAAG,IAAK,OAAO,OAAO,IAAIp6B,EAAE86iB,eAAe1sjB,EAAEn8B,KAAK,mBAAmBkplB,EAAG/sjB,EAAEgwB,EAAE/vB,EAAE+rC,GAAG,QAAQ,IAAI,IAAI/rC,EAAE3pB,QAAQ,MAAM,kBAAkB05C,EAAE0gC,GAAG,OAAOq8f,EAAG/sjB,EAAEgwB,EAAE/vB,EAAE+rC,GAAyB,IAAIz0C,KAA1ByI,EAAEn8B,KAAKmpE,EAAE/sC,IAAI6W,EAAEvyC,EAAE,KAAcyrD,EAAE,GAAG3qC,EAAE/e,KAAK0pD,EAAEz4B,IAAY,OAAP3vB,EAAEooD,EAAEz4B,IAAY,OAAOA,GAAG,IAAK,WAAWhzB,EAAEqD,EAAE,MAAM,IAAK,0BAA0BkvC,EAAElvC,EAAE,MAAM,IAAK,QAAQillB,EAAG7sjB,EAAEgsC,EAAEpkE,GAAG,MAAM,IAAK,iCAAiC,IAAK,2BAA2B,MAAM,QAAQ8jlB,EAAGn0jB,IAAI,oBAAoB3vB,GAAG,kBAAkBA,GAAGo4B,EAAEn8B,KAAK,IAAI0zB,EAAE,KAAK+L,EAAE17B,GAAG,KAChe,OADqeo4B,EAAEn8B,KAAK,KACrfotB,EAAE+O,EAAE8W,EAAEvyC,GAAUA,EAAE,CAAC,SAAS4olB,EAAGntjB,EAAEC,EAAE+vB,GAA2C,GAAxChwB,EAAEn8B,KAAK,iCAAoC,OAAOmsD,EAAE,MAAM92C,MAAMu9B,EAAE,MAAgB,OAAVzW,EAAEn8B,KAAKmsD,GAAUhwB,EAAEn8B,KAAK,gBAAgB,CAGkL,IAAIuplB,EAAG,mBAC/U,SAASC,EAAGrtjB,GAAG,OAAO7Z,KAAKE,UAAU2Z,GAAGz3B,QAAQ6klB,GAAG,SAASptjB,GAAG,OAAOA,GAAG,IAAK,IAAI,MAAM,UAAU,IAAK,SAAS,MAAM,UAAU,IAAK,SAAS,MAAM,UAAU,QAAQ,MAAM9mB,MAAM,qMAAsM,GAAE,CAC7E,SAASo0kB,EAAGttjB,EAAEC,EAAE+vB,EAAEgc,GAAG,OAAGhc,EAAEu9hB,sBAA4BvtjB,EAAEn8B,KAAKy/B,EAAErD,KAAI,IAAG,KAAKA,EAAED,EAAEgsC,GAAGA,GAAGhsC,EAAEn8B,KAAK,kBAAkBm8B,EAAEn8B,KAAKy/B,EAAErD,IAAID,GAAE,GAAWA,EAAC,CACtb,IAAIgmW,EAAE17X,OAAOsF,OAAO49kB,EAAGnykB,OAAO0wD,IAAI,iBAAiB0hhB,EAAGpykB,OAAO0wD,IAAI,gBAAgB2hhB,EAAGrykB,OAAO0wD,IAAI,kBAAkB4hhB,EAAGtykB,OAAO0wD,IAAI,qBAAqB6hhB,EAAGvykB,OAAO0wD,IAAI,kBAAkB8hhB,EAAGxykB,OAAO0wD,IAAI,kBAAkB+hhB,EAAGzykB,OAAO0wD,IAAI,iBAAiBgihB,EAAG1ykB,OAAO0wD,IAAI,qBAAqBiihB,EAAG3ykB,OAAO0wD,IAAI,kBAAkBkihB,EAAG5ykB,OAAO0wD,IAAI,uBAAuBmihB,EAAG7ykB,OAAO0wD,IAAI,cAAcoihB,EAAG9ykB,OAAO0wD,IAAI,cAAcqihB,EAAG/ykB,OAAO0wD,IAAI,eAAesihB,EAAGhzkB,OAAO0wD,IAAI,0BAA0BuihB,EAAGjzkB,OAAO0wD,IAAI,uBACtewihB,EAAGlzkB,OAAO0wD,IAAI,uBAAuByihB,EAAGnzkB,OAAOC,SAC/C,SAASmzkB,EAAGzujB,GAAG,GAAG,MAAMA,EAAE,OAAO,KAAK,GAAG,oBAAoBA,EAAE,OAAOA,EAAE3V,aAAa2V,EAAEj5B,MAAM,KAAK,GAAG,kBAAkBi5B,EAAE,OAAOA,EAAE,OAAOA,GAAG,KAAK0tjB,EAAG,MAAM,WAAW,KAAKD,EAAG,MAAM,SAAS,KAAKG,EAAG,MAAM,WAAW,KAAKD,EAAG,MAAM,aAAa,KAAKK,EAAG,MAAM,WAAW,KAAKC,EAAG,MAAM,eAAe,GAAG,kBAAkBjujB,EAAE,OAAOA,EAAE+sC,UAAU,KAAK+ghB,EAAG,OAAO9tjB,EAAE3V,aAAa,WAAW,YAAY,KAAKwjkB,EAAG,OAAO7tjB,EAAEjnB,SAASsR,aAAa,WAAW,YAAY,KAAK0jkB,EAAG,IAAI9tjB,EAAED,EAAEn1B,OAC7Z,OADoam1B,EAAEA,EAAE3V,eACnd2V,EAAE,MADieA,EAAEC,EAAE5V,aAClf4V,EAAEl5B,MAAM,IAAY,cAAci5B,EAAE,IAAI,cAAqBA,EAAE,KAAKkujB,EAAG,OAA6B,QAAtBjujB,EAAED,EAAE3V,aAAa,MAAc4V,EAAEwujB,EAAGzujB,EAAEz0B,OAAO,OAAO,KAAK4ilB,EAAGlujB,EAAED,EAAE0ujB,SAAS1ujB,EAAEA,EAAEi8F,MAAM,IAAI,OAAOwyd,EAAGzujB,EAAEC,GAAG,CAAC,MAAM+vB,GAAG,EAAE,OAAO,IAAI,CAAC,IAAI2+hB,GAAG,CAAC,EAAE,SAASC,GAAG5ujB,EAAEC,GAAoB,KAAjBD,EAAEA,EAAE+2hB,cAAmB,OAAO43B,GAAG,IAAS3ihB,EAALhc,EAAE,CAAC,EAAI,IAAIgc,KAAKhsC,EAAEgwB,EAAEgc,GAAG/rC,EAAE+rC,GAAG,OAAOhc,CAAC,CAAC,IAAI25gB,GAAE,KACvT,SAASj4hB,GAAE1R,EAAEC,GAAG,GAAGD,IAAIC,EAAE,CAACD,EAAE76B,QAAQ0plB,eAAe7ujB,EAAE8ujB,YAAY9ujB,EAAEA,EAAErE,OAAO,IAAIq0B,EAAE/vB,EAAEtE,OAAO,GAAG,OAAOqE,GAAG,GAAG,OAAOgwB,EAAE,MAAM92C,MAAMu9B,EAAE,UAAW,CAAC,GAAG,OAAOuZ,EAAE,MAAM92C,MAAMu9B,EAAE,MAAM/E,GAAE1R,EAAEgwB,EAAE,CAAC/vB,EAAE96B,QAAQ0plB,eAAe5ujB,EAAE73B,KAAK,CAAC,CAAC,SAAS40L,GAAGh9J,GAAGA,EAAE76B,QAAQ0plB,eAAe7ujB,EAAE8ujB,YAAuB,QAAX9ujB,EAAEA,EAAErE,SAAiBqhK,GAAGh9J,EAAE,CAAC,SAAS+ujB,GAAG/ujB,GAAG,IAAIC,EAAED,EAAErE,OAAO,OAAOsE,GAAG8ujB,GAAG9ujB,GAAGD,EAAE76B,QAAQ0plB,eAAe7ujB,EAAE53B,KAAK,CACtX,SAAS4mlB,GAAGhvjB,EAAEC,GAAqD,GAAlDD,EAAE76B,QAAQ0plB,eAAe7ujB,EAAE8ujB,YAA0B,QAAd9ujB,EAAEA,EAAErE,QAAmB,MAAMziB,MAAMu9B,EAAE,MAAMzW,EAAEt6B,QAAQu6B,EAAEv6B,MAAMgsC,GAAE1R,EAAEC,GAAG+ujB,GAAGhvjB,EAAEC,EAAE,CAAC,SAASkqE,GAAGnqE,EAAEC,GAAG,IAAI+vB,EAAE/vB,EAAEtE,OAAO,GAAG,OAAOq0B,EAAE,MAAM92C,MAAMu9B,EAAE,MAAMzW,EAAEt6B,QAAQsqD,EAAEtqD,MAAMgsC,GAAE1R,EAAEgwB,GAAGm6C,GAAGnqE,EAAEgwB,GAAG/vB,EAAE96B,QAAQ0plB,eAAe5ujB,EAAE73B,KAAK,CAAC,SAAS44kB,GAAEhhjB,GAAG,IAAIC,EAAE0piB,GAAE1piB,IAAID,IAAI,OAAOC,EAAE8ujB,GAAG/ujB,GAAG,OAAOA,EAAEg9J,GAAG/8J,GAAGA,EAAEv6B,QAAQs6B,EAAEt6B,MAAMgsC,GAAEzR,EAAED,GAAGC,EAAEv6B,MAAMs6B,EAAEt6B,MAAMsplB,GAAG/ujB,EAAED,GAAGmqE,GAAGlqE,EAAED,GAAG2piB,GAAE3piB,EAAE,CAC/X,IAAI8wI,GAAG,CAACr2E,UAAU,WAAW,OAAM,CAAE,EAAEsmf,gBAAgB,SAAS/gjB,EAAEC,GAAuB,QAApBD,EAAEA,EAAEivjB,iBAAyB3+f,OAAOtwD,EAAEswD,MAAMzsF,KAAKo8B,EAAE,EAAE64hB,oBAAoB,SAAS94hB,EAAEC,IAAGD,EAAEA,EAAEivjB,iBAAkB1mlB,SAAQ,EAAGy3B,EAAEswD,MAAM,CAACrwD,EAAE,EAAE6gjB,mBAAmB,WAAW,GACxO,SAASoO,GAAGlvjB,EAAEC,EAAE+vB,EAAEgc,GAAG,IAAIp6B,OAAE,IAAS5R,EAAEvT,MAAMuT,EAAEvT,MAAM,KAAKuT,EAAEva,QAAQqrJ,GAAG9wI,EAAEl1B,MAAMklD,EAAEhwB,EAAEvT,MAAMmlB,EAAE,IAAIrtC,EAAE,CAAC+rF,MAAM,GAAG/nF,SAAQ,GAAIy3B,EAAEivjB,gBAAgB1qlB,EAAE,IAAIuyC,EAAE7W,EAAEkvjB,YAAmL,GAAvKnvjB,EAAE76B,QAAQ,kBAAkB2xC,GAAG,OAAOA,EAAEA,EAAE+3iB,eAAe7ihB,EAA+B,oBAA7Bl1B,EAAE7W,EAAEy3hB,4BAA0D9lhB,EAAE,QAAXkF,EAAEA,EAAEkZ,EAAEpe,UAAe,IAASkF,EAAElF,EAAEo0V,EAAE,CAAC,EAAEp0V,EAAEkF,GAAG9W,EAAEvT,MAAMmlB,GAAM,oBAAoB3R,EAAEy3hB,0BAA0B,oBAAoB13hB,EAAEovjB,0BAA0B,oBAAoBpvjB,EAAEq3hB,2BAA2B,oBAAoBr3hB,EAAEk3hB,oBAAoB,GAAGj3hB,EACtgBD,EAAEvT,MAAM,oBAAoBuT,EAAEk3hB,oBAAoBl3hB,EAAEk3hB,qBAAqB,oBAAoBl3hB,EAAEq3hB,2BAA2Br3hB,EAAEq3hB,4BAA4Bp3hB,IAAID,EAAEvT,OAAOqkJ,GAAGgoZ,oBAAoB94hB,EAAEA,EAAEvT,MAAM,MAAM,OAAOloB,EAAE+rF,OAAO,EAAE/rF,EAAE+rF,MAAM5sF,OAAO,GAAGu8B,EAAE17B,EAAE+rF,MAAMx5C,EAAEvyC,EAAEgE,QAAQhE,EAAE+rF,MAAM,KAAK/rF,EAAEgE,SAAQ,EAAGuuC,GAAG,IAAI7W,EAAEv8B,OAAOs8B,EAAEvT,MAAMwT,EAAE,OAAO,CAAuB,IAAtB17B,EAAEuyC,EAAE7W,EAAE,GAAGD,EAAEvT,MAAMmlB,GAAE,EAAOkF,EAAEA,EAAE,EAAE,EAAEA,EAAE7W,EAAEv8B,OAAOozC,IAAI,CAAC,IAAIlvC,EAAEq4B,EAAE6W,GAA6C,OAA1ClvC,EAAE,oBAAoBA,EAAEA,EAAEtB,KAAK05B,EAAEz7B,EAAEyrD,EAAEgc,GAAGpkE,KAAYgqC,GAAGA,GAAE,EAAGrtC,EAAEyhY,EAAE,CAAC,EAAEzhY,EAAEqD,IAAIo+X,EAAEzhY,EAAEqD,GAAG,CAACo4B,EAAEvT,MAAMloB,CAAC,MAAMA,EAAE+rF,MAAM,IAAI,CAC3e,IAAI++f,GAAG,CAAC5olB,GAAG,EAAEwrB,SAAS,IAAI,SAASq9jB,GAAGtvjB,EAAEC,EAAE+vB,GAAG,IAAIgc,EAAEhsC,EAAEv5B,GAAGu5B,EAAEA,EAAE/N,SAAS,IAAI2f,EAAE,GAAG8nE,GAAE1tC,GAAG,EAAEA,KAAK,GAAGp6B,GAAGoe,GAAG,EAAE,IAAIzrD,EAAE,GAAGm1G,GAAEz5E,GAAG2R,EAAE,GAAG,GAAGrtC,EAAE,CAAC,IAAIuyC,EAAElF,EAAEA,EAAE,EAAyC,OAAvCrtC,GAAGynE,GAAG,GAAGl1B,GAAG,GAAGhvC,SAAS,IAAIkkE,IAAIl1B,EAAElF,GAAGkF,EAAQ,CAACrwC,GAAG,GAAG,GAAGizG,GAAEz5E,GAAG2R,EAAEoe,GAAGpe,EAAEo6B,EAAE/5C,SAAS1tB,EAAEy7B,EAAE,CAAC,MAAM,CAACv5B,GAAG,GAAGlC,EAAEyrD,GAAGpe,EAAEo6B,EAAE/5C,SAAS+N,EAAE,CAAC,IAAI05E,GAAEnuF,KAAKgkkB,MAAMhkkB,KAAKgkkB,MAAiC,SAAYvvjB,GAAU,OAAO,KAAdA,KAAK,GAAe,GAAG,IAAIwvjB,GAAGxvjB,GAAGyvjB,GAAG,GAAG,CAAC,EAA/ED,GAAGjkkB,KAAKm/C,IAAI+khB,GAAGlkkB,KAAK4yiB,IAClT,IAAIuxB,GAAG,oBAAoBpllB,OAAOomF,GAAGpmF,OAAOomF,GADkU,SAAY1wD,EAAEC,GAAG,OAAOD,IAAIC,IAAI,IAAID,GAAG,EAAEA,IAAI,EAAEC,IAAID,IAAIA,GAAGC,IAAIA,CAAC,EAC3XysiB,GAAE,KAAKijB,GAAG,KAAKzO,GAAE,KAAKC,GAAE,KAAK98gB,IAAE,EAAGm1C,IAAE,EAAGwmG,GAAE,EAAEysX,GAAE,KAAKrhgB,GAAE,EAAE,SAASquC,KAAI,GAAG,OAAOizd,GAAE,MAAMxzjB,MAAMu9B,EAAE,MAAM,OAAOi2hB,EAAC,CAAC,SAASkjB,KAAK,GAAG,EAAExkhB,GAAE,MAAMlyD,MAAMu9B,EAAE,MAAM,MAAM,CAACo5iB,cAAc,KAAKv/f,MAAM,KAAK7oF,KAAK,KAAK,CAAC,SAASqolB,KAAqG,OAAhG,OAAO3O,GAAE,OAAOD,IAAG78gB,IAAE,EAAG68gB,GAAEC,GAAEyO,OAAOvrhB,IAAE,EAAG88gB,GAAED,IAAG,OAAOC,GAAE15kB,MAAM48D,IAAE,EAAG88gB,GAAEA,GAAE15kB,KAAKmolB,OAAOvrhB,IAAE,EAAG88gB,GAAEA,GAAE15kB,MAAa05kB,EAAC,CAAC,SAAS4O,KAAKJ,GAAGjjB,GAAE,KAAKlzd,IAAE,EAAG0ne,GAAE,KAAK91gB,GAAE,EAAE+1gB,GAAE1U,GAAE,IAAI,CAAC,SAASujB,GAAGhwjB,EAAEC,GAAG,MAAM,oBAAoBA,EAAEA,EAAED,GAAGC,CAAC,CACld,SAASgwjB,GAAGjwjB,EAAEC,EAAE+vB,GAAgB,GAAb08gB,GAAEjzd,KAAI0ne,GAAE2O,KAAQzrhB,GAAE,CAAC,IAAI2H,EAAEm1gB,GAAE7wf,MAAmB,GAAbrwD,EAAE+rC,EAAEkkhB,SAAY,OAAOzjB,SAAe,KAAXz8gB,EAAEy8gB,GAAExnjB,IAAI+mD,IAAe,CAACyggB,GAAEj9e,OAAOxjB,GAAGA,EAAEm1gB,GAAE0O,cAAc,GAAG7jhB,EAAEhsC,EAAEgsC,EAAEhc,EAAEhpC,QAAQgpC,EAAEA,EAAEvoD,WAAW,OAAOuoD,GAAqB,OAAlBmxhB,GAAE0O,cAAc7jhB,EAAQ,CAACA,EAAE/rC,EAAE,CAAC,MAAM,CAACkhjB,GAAE0O,cAAc5vjB,EAAE,CAA6I,OAA5ID,EAAEA,IAAIgwjB,GAAG,oBAAoB/vjB,EAAEA,IAAIA,OAAE,IAAS+vB,EAAEA,EAAE/vB,GAAGA,EAAEkhjB,GAAE0O,cAAc7vjB,EAAsCA,GAApCA,EAAEmhjB,GAAE7wf,MAAM,CAAC4hQ,KAAK,KAAKg+P,SAAS,OAAUA,SAASC,GAAG/6iB,KAAK,KAAKs3hB,GAAE1siB,GAAS,CAACmhjB,GAAE0O,cAAc7vjB,EAAE,CAC9Y,SAASowjB,GAAGpwjB,EAAEC,GAAoC,GAAjCysiB,GAAEjzd,KAAWx5E,OAAE,IAASA,EAAE,KAAKA,EAAK,QAA9BkhjB,GAAE2O,MAAqC,CAAC,IAAI9/hB,EAAEmxhB,GAAE0O,cAAc,GAAG,OAAO7/hB,GAAG,OAAO/vB,EAAE,CAAC,IAAI+rC,EAAEhc,EAAE,GAAGhwB,EAAE,GAAG,OAAOgsC,EAAEA,GAAE,MAAO,CAAC,IAAI,IAAIp6B,EAAE,EAAEA,EAAEo6B,EAAEtoE,QAAQkuC,EAAE3R,EAAEv8B,OAAOkuC,IAAI,IAAI89iB,GAAGzvjB,EAAE2R,GAAGo6B,EAAEp6B,IAAI,CAACo6B,GAAE,EAAG,MAAMhsC,CAAC,CAACgsC,GAAE,CAAE,CAAC,GAAGA,EAAE,OAAOhc,EAAE,EAAE,CAAC,CAA6B,OAA5BhwB,EAAEA,IAAImhjB,GAAE0O,cAAc,CAAC7vjB,EAAEC,GAAUD,CAAC,CAAC,SAASmwjB,GAAGnwjB,EAAEC,EAAE+vB,GAAG,GAAG,IAAIob,GAAE,MAAMlyD,MAAMu9B,EAAE,MAAM,GAAGzW,IAAI0siB,GAAE,GAAGlzd,IAAE,EAAGx5E,EAAE,CAAChZ,OAAOgpC,EAAEvoD,KAAK,MAAM,OAAOglkB,KAAIA,GAAE,IAAInzjB,UAAgB,KAAX02C,EAAEy8gB,GAAExnjB,IAAIgb,IAAcwsiB,GAAEjzjB,IAAIymB,EAAED,OAAO,CAAC,IAAIC,EAAE+vB,EAAE,OAAO/vB,EAAEx4B,MAAMw4B,EAAEA,EAAEx4B,KAAKw4B,EAAEx4B,KAAKu4B,CAAC,CAAC,CAAC,SAASqwjB,KAAK,MAAMn3kB,MAAMu9B,EAAE,KAAM,CAClf,SAASm2hB,KAAI,CACb,IAAI0jB,GAAG,CAACC,YAAY,SAASvwjB,GAAG,OAAOA,EAAE6ujB,cAAc,EAAEx0kB,WAAW,SAAS2lB,GAAO,OAAJy5E,KAAWz5E,EAAE6ujB,cAAc,EAAEnlkB,QAAQ0mkB,GAAGI,WAAWP,GAAG3skB,OAAO,SAAS0c,GAAG0siB,GAAEjzd,KAAW,IAAIx5E,GAAXkhjB,GAAE2O,MAAaD,cAAc,OAAO,OAAO5vjB,GAAGD,EAAE,CAAC/6B,QAAQ+6B,GAAGmhjB,GAAE0O,cAAc7vjB,GAAGC,CAAC,EAAE7c,SAAS,SAAS4c,GAAG,OAAOiwjB,GAAGD,GAAGhwjB,EAAE,EAAEywjB,mBAAmB7jB,GAAErye,gBAAgB,WAAW,EAAE7/E,YAAY,SAASslB,EAAEC,GAAG,OAAOmwjB,IAAG,WAAW,OAAOpwjB,CAAC,GAAEC,EAAE,EAAEywjB,oBAAoB9jB,GAAEjpjB,UAAUipjB,GAAE3ld,cAAc2ld,GAAE+jB,iBAAiB,SAAS3wjB,GAAO,OAAJy5E,KAAWz5E,CAAC,EAAE4wjB,cAAc,WAAe,OAAJn3e,KAAU,EAAC,EACvgB42e,GAAG,EAAEQ,MAAM,WAAW,IAAI7wjB,EAAE2vjB,GAAGmB,YAAgB7wjB,EAAED,EAAE/N,SAAgB+N,IAAPA,EAAEA,EAAEv5B,MAAU,GAAG,GAAGizG,GAAE15E,GAAG,IAAIl4B,SAAS,IAAIm4B,EAAE,IAAI+vB,EAAE+1U,GAAE,GAAG,OAAO/1U,EAAE,MAAM92C,MAAMu9B,EAAE,MAAgE,OAA1DxW,EAAE+/K,KAAIhgL,EAAE,IAAIgwB,EAAEwqe,SAAS,IAAIx6f,EAAE,EAAEC,IAAID,GAAG,IAAIC,EAAEn4B,SAAS,KAAYk4B,EAAE,GAAG,EAAE+wjB,iBAAiB,SAAS/wjB,EAAEC,GAAO,OAAJw5E,KAAWx5E,EAAED,EAAEgxjB,QAAQ,EAAE1pe,qBAAqB,SAAStnF,EAAEC,EAAE+vB,GAAG,QAAG,IAASA,EAAE,MAAM92C,MAAMu9B,EAAE,MAAM,OAAOuZ,GAAG,GAAG+1U,GAAE,KAAKkrN,GAAG3F,EAAGnJ,mDAAmD+O,uBAAuB,SAASC,GAAGnxjB,GAAoB,OAAjB4tB,QAAQ3R,MAAMjc,GAAU,IAAI,CACte,SAAS28hB,KAAI,CAEuC,SAASy0B,GAAGpxjB,EAAEC,EAAE+vB,EAAEgc,EAAEp6B,EAAErtC,EAAEuyC,EAAElvC,GAAGo4B,EAAEqxjB,kBAAkB,OAAOrhiB,EAAEhwB,EAAEsxjB,mBAAmBthiB,EAAEuhiB,eAAe,IAAI5plB,EAAE,CAACpB,KAAK05B,EAAEivT,KAAK,WAAW,IAAIjvT,EAAED,EAAEwxjB,YAAYvxjB,EAAEp8B,KAAK8D,GAAG,IAAIs4B,EAAEv8B,QAAQ+tlB,GAAGzxjB,EAAE,EAAE0xjB,gBAAgB1hiB,EAAE2hiB,eAAe3lhB,EAAE4lhB,SAAShgjB,EAAEigjB,cAActtlB,EAAEY,QAAQ2xC,EAAEg6iB,YAAYlplB,GAAY,OAATgqC,EAAEvc,IAAI1tB,GAAUA,CAAC,CAAC,SAAS65kB,GAAExhjB,EAAEC,EAAE+vB,EAAEgc,EAAEp6B,EAAErtC,GAAG,MAAM,CAACw3C,OAAO,EAAEt1C,IAAI,EAAEmM,MAAMqtB,EAAE6xjB,eAAc,EAAGC,OAAO,GAAGhllB,SAAS,GAAGillB,cAAchmhB,EAAEnvC,SAASmzB,EAAEiiiB,eAAergjB,EAAEsgjB,aAAa3tlB,EAAE,CACte,SAASgiZ,GAAEvmX,EAAEC,GAAkB,GAAG,OAAlBD,EAAEA,EAAEukF,QAAQtkF,KAAe,kBAAkBD,EAAE,MAAM9mB,MAAM,wMAAwM8mB,EAAE,aAAa,OAAOA,CAAC,CAAC,SAASyhjB,GAAEzhjB,EAAEC,GAAG,IAAI+vB,EAAEhwB,EAAEmyjB,aAAaniiB,EAAE/vB,IAAG+vB,EAAEhwB,EAAEoyjB,cAAenyjB,GAAG,OAAOD,EAAEqyjB,aAAaryjB,EAAE+b,OAAO,EAAE/b,EAAEqyjB,YAAY/5jB,QAAQ2H,KAAKD,EAAE+b,OAAO,EAAE/b,EAAEsyjB,WAAWryjB,EAAE,CACjc,SAASsyjB,GAAGvyjB,EAAEC,EAAE+vB,EAAEgc,EAAEp6B,GAAiB,IAAd86hB,GAAE,CAAC,EAAEijB,GAAG1vjB,EAAE+/K,GAAE,EAAMhgL,EAAEgwB,EAAEgc,EAAEp6B,GAAG4nE,IAAGA,IAAE,EAAGwmG,GAAE,EAAE50I,IAAG,EAAE+1gB,GAAE,KAAKnhjB,EAAEgwB,EAAEgc,EAAEp6B,GAAQ,OAALm+iB,KAAY/vjB,CAAC,CAAC,SAASwyjB,GAAGxyjB,EAAEC,EAAE+vB,EAAEgc,GAAG,IAAIp6B,EAAEoe,EAAEnlD,SAAStG,EAAEynE,EAAEgrf,kBAAkB,GAAG,OAAOzyjB,QAAG,IAASA,EAAE,CAAC,IAAIuyC,EAAE7W,EAAE4xjB,cAAc,GAAG,oBAAoB7hiB,EAAEingB,gBAAgBjrf,EAAEl1B,MAAM,CAAuB,IAAI,IAAIlvC,KAA9BooD,EAAEA,EAAEingB,kBAAiC,KAAKrvjB,KAAKrD,GAAG,MAAM2U,MAAMu9B,EAAE,IAAIg4iB,EAAGzihB,IAAI,UAAUpkE,IAAIokE,EAAEg6T,EAAE,CAAC,EAAElvV,EAAEkZ,EAAE,CAAC/vB,EAAE4xjB,cAAc7lhB,EAAEq2gB,GAAErijB,EAAEC,EAAE2R,GAAG3R,EAAE4xjB,cAAc/6iB,CAAC,MAAMuriB,GAAErijB,EAAEC,EAAE2R,EAAE,CAC7Z,SAAS6gjB,GAAGzyjB,EAAEC,GAAG,GAAGD,GAAGA,EAAE8zC,aAAa,CAA4B,IAAI,IAAI9jB,KAAnC/vB,EAAE+lW,EAAE,CAAC,EAAE/lW,GAAGD,EAAEA,EAAE8zC,kBAA4B,IAAS7zC,EAAE+vB,KAAK/vB,EAAE+vB,GAAGhwB,EAAEgwB,IAAI,OAAO/vB,CAAC,CAAC,OAAOA,CAAC,CAC7H,SAASyyjB,GAAG1yjB,EAAEC,EAAE+vB,EAAEgc,EAAEp6B,GAAG,GAAG,oBAAoBoe,EAAE,GAAGA,EAAEjtD,WAAWitD,EAAEjtD,UAAU+5F,iBAAiB,CAAClrD,EAAEg9iB,GAAG5+hB,EAAE/vB,EAAE4xjB,eAAe,IAAIttlB,EAAEyrD,EAAEm/hB,YAAwED,GAA5D3qlB,EAAE,IAAIyrD,EAAEgc,EAAE,kBAAkBznE,GAAG,OAAOA,EAAEA,EAAEsqlB,eAAej9iB,GAAQoe,EAAEgc,EAAEp6B,GAAG4gjB,GAAGxyjB,EAAEC,EAAE17B,EAAEyrD,EAAE,KAAK,CAAyBpe,EAAE2gjB,GAAGvyjB,EAAEC,EAAE+vB,EAAEgc,EAAnCznE,EAAEqqlB,GAAG5+hB,EAAE/vB,EAAE4xjB,gBAA+B,IAAI/6iB,EAAE,IAAIkpK,GAAE,GAAG,kBAAkBpuK,GAAG,OAAOA,GAAG,oBAAoBA,EAAE/mC,aAAQ,IAAS+mC,EAAEm7B,SAASmihB,GAAGt9iB,EAAEoe,EAAEgc,EAAEznE,GAAGiulB,GAAGxyjB,EAAEC,EAAE2R,EAAEoe,QAAQ,GAAGlZ,EAAE,CAACk1B,EAAE/rC,EAAE6wjB,YAAY7wjB,EAAE6wjB,YAAYxB,GAAGtjhB,EAAE,EAAE,GAAG,IAAIq2gB,GAAErijB,EAAEC,EAAE2R,EAAE,CAAC,QAAQ3R,EAAE6wjB,YAAY9khB,CAAC,CAAC,MAAMq2gB,GAAErijB,EAAEC,EAAE2R,EAAE,KAAM,IAAG,kBAC3eoe,EAAoa,CAAC,OAAOA,GAAG,KAAKs+hB,EAAG,KAAKD,EAAG,KAAKV,EAAG,KAAKC,EAAG,KAAKF,EAC3d,KAAKO,EAAqB,YAAlB5L,GAAErijB,EAAEC,EAAE+rC,EAAEj/D,UAAiB,KAAKqhlB,EAAG,MAAMl1kB,MAAMu9B,EAAE,MAAM,KAAKu3iB,EAAGhujB,EAAE,CAACgwB,EAAE/vB,EAAEyxjB,gBAAgB9/iB,EAAE3R,EAAE0xjB,eAAeptlB,EAAEynE,EAAEutB,SAASvtB,EAAEA,EAAEj/D,SAAmB,IAAInF,EAAE,CAACnB,GAAG,KAAKkslB,eAAe,EAAEb,eAAc,EAAGP,aAAa,EAAEqB,mBAAkB,EAAGC,kBAAkB,GAAGC,SAAS,EAAEC,uBAA/Hj8iB,EAAE,IAAIxkC,IAAkJ0glB,YAAY,MAAMrrlB,EAAE65kB,GAAExhjB,EAAE4R,EAAEmgjB,OAAOrulB,OAAOkE,EAAEgqC,EAAEogjB,eAAc,GAAG,GAAIpgjB,EAAE7kC,SAASlJ,KAAK8D,GAAGiqC,EAAEqgjB,gBAAe,EAAG,IAAI16jB,EAAEiqjB,GAAExhjB,EAAE,EAAE,KAAK4R,EAAEogjB,eAAc,GAAG,GAAIz6jB,EAAEu6jB,eAAc,EAAG7xjB,EAAEyxjB,gBAAgB9plB,EAAEq4B,EAAE0xjB,eAAep6jB,EAAE,IAAI,GAAG07jB,GAAGjzjB,EACrfC,EAAE+rC,GAAGhsC,EAAEkzjB,cAAc3F,sBAAsBh2jB,EAAE06jB,gBAAgB16jB,EAAE26jB,cAAc36jB,EAAEw6jB,OAAOlulB,KAAK,kBAAkB0zB,EAAEwkB,OAAO,EAAE2qW,GAAE9+Y,EAAE2vB,GAAG,IAAI3vB,EAAE2plB,aAAa,MAAMvxjB,CAAC,CAAC,MAAM9kB,GAAGqc,EAAEwkB,OAAO,EAAEn0C,EAAEgrlB,mBAAkB,EAAGhrlB,EAAEorlB,YAAYzsM,GAAEvmX,EAAE9kB,EAAE,CAAC,QAAQ+kB,EAAEyxjB,gBAAgB1hiB,EAAE/vB,EAAE0xjB,eAAe//iB,CAAC,CAAC3R,EAAEmxjB,GAAGpxjB,EAAEz7B,EAAEyrD,EAAEroD,EAAEmvC,EAAE7W,EAAE4xjB,cAAc5xjB,EAAE96B,QAAQ86B,EAAE6wjB,aAAa9wjB,EAAEwxjB,YAAY3tlB,KAAKo8B,EAAE,CAAC,OAAO,GAAG,kBAAkB+vB,GAAG,OAAOA,EAAE,OAAOA,EAAE+c,UAAU,KAAKghhB,EAA0B,GAAvB/hhB,EAAEumhB,GAAGvyjB,EAAEC,EAAE+vB,EAAEnlD,OAAOmhE,EAAEp6B,GAAM,IAAIouK,GAAE,CAAChwJ,EAAE/vB,EAAE6wjB,YAAY7wjB,EAAE6wjB,YAAYxB,GAAGt/hB,EAAE,EAAE,GAAG,IAAIqyhB,GAAErijB,EAAEC,EAAE+rC,EAAE,CAAC,QAAQ/rC,EAAE6wjB,YAC1f9giB,CAAC,CAAC,MAAMqyhB,GAAErijB,EAAEC,EAAE+rC,GAAG,OAAO,KAAKkihB,EAAoC,YAAdwE,GAAG1yjB,EAAEC,EAAxB+vB,EAAEA,EAAEzkD,KAAKygE,EAAEymhB,GAAGziiB,EAAEgc,GAAcp6B,GAAU,KAAKi8iB,EAAoL,GAAjLj8iB,EAAEo6B,EAAEj/D,SAASijD,EAAEA,EAAEj3C,SAASizD,EAAEA,EAAE5jE,MAAM7D,EAAEyrD,EAAE6+hB,eAAe7+hB,EAAE6+hB,eAAe7ihB,EAAM29f,GAAE39f,EAAE,CAACrwC,OAATmb,EAAE6yhB,GAAgBjkkB,MAAM,OAAOoxC,EAAE,EAAEA,EAAEpxC,MAAM,EAAEP,QAAQ6qD,EAAE8+hB,YAAYvqlB,EAAE6D,MAAM4jE,GAAG/rC,EAAE96B,QAAQ6mE,EAAEq2gB,GAAErijB,EAAEC,EAAE2R,GAAU,QAAP5R,EAAE2piB,IAAc,MAAMzwjB,MAAMu9B,EAAE,MAAyG,OAAnGu1B,EAAEhsC,EAAE8ujB,YAAY9ujB,EAAE76B,QAAQ0plB,eAAe7ihB,IAAIuihB,EAAGvujB,EAAE76B,QAAQ28kB,cAAc91gB,EAAEhsC,EAAE2piB,GAAE3piB,EAAErE,YAAOsE,EAAE96B,QAAQ66B,GAAS,KAAK8tjB,EAA+C,YAATzL,GAAErijB,EAAEC,EAA1B+rC,GAAbA,EAAEA,EAAEj/D,UAAaijD,EAAE6+hB,iBAAgC,KAAKV,EAC7b,YADoeuE,GAAG1yjB,EACrfC,EADwd+vB,GAAVpe,EAAEoe,EAAEisE,OAAUjsE,EAAE0+hB,UAAU1ihB,EAAEymhB,GAAGziiB,EAAEgc,QACze,GAAe,MAAM9yD,MAAMu9B,EAAE,IAAI,MAAMuZ,EAAEA,SAASA,EAAE,IAAK,CAJ6G,OAA/IzrD,EAAE2olB,GAArBt7iB,EAAE3R,EAAE0xjB,gBAAsBI,OAAO/hiB,EAAEgc,EAAEhsC,EAAEkzjB,cAActhjB,EAAEogjB,eAAepgjB,EAAEqgjB,gBAAe,EAAGn7iB,EAAElF,EAAEogjB,cAAcpgjB,EAAEogjB,cA1CxH,SAAYhyjB,EAAEC,EAAE+vB,GAAG,OAAO/vB,GAAG,IAAK,SAAS,OAAOgkB,EAAE,EAAE,MAAM+L,EAAE5nD,MAAM4nD,EAAE5nD,MAAM4nD,EAAExV,cAAc,IAAK,MAAM,OAAOyJ,EAAE,EAAE,MAAM,IAAK,OAAO,OAAOA,EAAE,EAAE,MAAM,IAAK,gBAAgB,OAAOA,EAAE,EAAE,MAAM,IAAK,QAAQ,OAAOA,EAAE,EAAE,MAAM,IAAK,QAAQ,IAAK,QAAQ,IAAK,QAAQ,OAAOA,EAAE,EAAE,MAAM,IAAK,WAAW,OAAOA,EAAE,EAAE,MAAM,IAAK,KAAK,OAAOA,EAAE,EAAE,MAAM,OAAO,GAAGjkB,EAAE0sjB,eAAe,IAAI1sjB,EAAE0sjB,cAAczoiB,EAAE,EAAE,MAAMjkB,CAAC,CA0CjQmzjB,CAAGr8iB,EAAEkZ,EAAEgc,GAAGinhB,GAAGjzjB,EAAEC,EAAE17B,GAAGqtC,EAAEogjB,cAAcl7iB,EAASkZ,GAAG,IAAK,OAAO,IAAK,OAAO,IAAK,KAAK,IAAK,MAAM,IAAK,QAAQ,IAAK,KAAK,IAAK,MAAM,IAAK,QAAQ,IAAK,SAAS,IAAK,OAAO,IAAK,OAAO,IAAK,QAAQ,IAAK,SAAS,IAAK,QAAQ,IAAK,MAAM,MAAM,QAAQpe,EAAEmgjB,OAAOlulB,KAAK,KAAKmsD,EAAE,KAAKpe,EAAEqgjB,gBAAe,CAIrW,CAAC,CAChE,SAAS5P,GAAErijB,EAAEC,EAAE+vB,GAAY,GAAT/vB,EAAE15B,KAAKypD,EAAK,kBAAkBA,GAAG,OAAOA,EAAE,CAAC,OAAOA,EAAE+c,UAAU,KAAKyghB,EAAgC,YAA7BkF,GAAG1yjB,EAAEC,EAAE+vB,EAAEzkD,KAAKykD,EAAEllD,MAAMklD,EAAEjlD,KAAY,KAAK0ilB,EAAG,MAAMv0kB,MAAMu9B,EAAE,MAAM,KAAK03iB,EAAG,IAAInihB,EAAEhc,EAAEisE,MAA+B,YAATomd,GAAErijB,EAAEC,EAApB+vB,EAAEgc,EAAEhc,EAAE0+hB,WAA0B,GAAGjC,EAAGz8hB,GAAc,YAAVojiB,GAAGpzjB,EAAEC,EAAE+vB,GAA6G,GAAnG,OAAOA,GAAG,kBAAkBA,EAAEgc,EAAE,KAAmCA,EAAE,oBAA/BA,EAAEwihB,GAAIx+hB,EAAEw+hB,IAAKx+hB,EAAE,eAAsCgc,EAAE,KAASA,IAAIA,EAAEA,EAAE1lE,KAAK0pD,IAAI,CAAY,KAAXA,EAAEgc,EAAEvkE,QAAamU,KAAK,CAAC,IAAIg2B,EAAE,GAAG,GAAGA,EAAE/tC,KAAKmsD,EAAE5nD,OAAO4nD,EAAEgc,EAAEvkE,cAAcuoD,EAAEp0C,MAAMw3kB,GAAGpzjB,EAAEC,EAAE2R,EAAE,CAAC,MAAM,CAAqC,MAApC5R,EAAE11B,OAAOvH,UAAU+E,SAASxB,KAAK0pD,GAAS92C,MAAMu9B,EAAE,GAAG,oBACpfzW,EAAE,qBAAqB11B,OAAO6C,KAAK6iD,GAAG1hD,KAAK,MAAM,IAAI0xB,GAAI,CAAC,kBAAkBgwB,GAAGgc,EAAE/rC,EAAE0xjB,gBAAiBM,eAAe3E,EAAGrtjB,EAAE0xjB,eAAeI,OAAO/hiB,EAAEhwB,EAAEkzjB,cAAclnhB,EAAEimhB,gBAAiB,kBAAkBjiiB,KAAIgc,EAAE/rC,EAAE0xjB,gBAAiBM,eAAe3E,EAAGrtjB,EAAE0xjB,eAAeI,OAAO,GAAG/hiB,EAAEhwB,EAAEkzjB,cAAclnhB,EAAEimhB,gBAAgB,CAAC,SAASmB,GAAGpzjB,EAAEC,EAAE+vB,GAAG,IAAI,IAAIgc,EAAEhc,EAAEtsD,OAAOkuC,EAAE,EAAEA,EAAEo6B,EAAEp6B,IAAI,CAAC,IAAIrtC,EAAE07B,EAAE6wjB,YAAY7wjB,EAAE6wjB,YAAYxB,GAAG/qlB,EAAEynE,EAAEp6B,GAAG,IAAIqhjB,GAAGjzjB,EAAEC,EAAE+vB,EAAEpe,GAAG,CAAC,QAAQ3R,EAAE6wjB,YAAYvslB,CAAC,CAAC,CAAC,CACzb,SAAS0ulB,GAAGjzjB,EAAEC,EAAE+vB,GAAG,IAAIgc,EAAE/rC,EAAE0xjB,eAAeK,cAAcpgjB,EAAE3R,EAAE4xjB,cAActtlB,EAAE07B,EAAE96B,QAAQ,IAAI,OAAOk9kB,GAAErijB,EAAEC,EAAE+vB,EAAE,CAAC,MAAMroD,GAAG,GAAGoolB,KAAK,kBAAkBpolB,GAAG,OAAOA,GAAG,oBAAoBA,EAAEkQ,KAAwT,MAAMooB,EAAE0xjB,eAAeK,cAC/fhmhB,EAAE/rC,EAAE4xjB,cAAcjgjB,EAAE3R,EAAE96B,QAAQZ,EAAEy8kB,GAAEz8kB,GAAGoD,EADiJqoD,EAAEroD,EAAE,IAAImvC,EAAE7W,EAAE0xjB,eAAe/plB,EAAE45kB,GAAExhjB,EAAE8W,EAAEi7iB,OAAOrulB,OAAO,KAAKozC,EAAEk7iB,cAAcl7iB,EAAEm7iB,gBAAe,GAAIn7iB,EAAE/pC,SAASlJ,KAAK+D,GAAGkvC,EAAEm7iB,gBAAe,EAAGjyjB,EAAEoxjB,GAAGpxjB,EAAEC,EAAE15B,KAAK05B,EAAEyxjB,gBAAgB9plB,EAAEq4B,EAAE2xjB,SAAS3xjB,EAAE4xjB,cAAc5xjB,EAAE96B,QAAQ86B,EAAE6wjB,aAAa5hQ,KAAKl/R,EAAEn4C,KAAKmoB,EAAEA,GAAGC,EAAE0xjB,eAAeK,cAAchmhB,EAAE/rC,EAAE4xjB,cAAcjgjB,EAAE3R,EAAE96B,QAAQZ,EAAEy8kB,GAAEz8kB,EACzb,CAAC,CAAC,SAAS8ulB,GAAGrzjB,GAAG,IAAIC,EAAED,EAAE0xjB,iBAAgB1xjB,EAAEA,EAAE2xjB,gBAAiB51iB,OAAO,EAAEu3iB,GAAGlxlB,KAAK69B,EAAED,EAAE,CAC1H,SAASuzjB,GAAGvzjB,EAAEC,EAAE+vB,GAAG,IAAIgc,EAAEhsC,EAAE0xjB,gBAAgB1xjB,EAAE2xjB,eAAe51iB,OAAO,EAAE,OAAOiwB,GAAG/rC,EAAEoxjB,kBAAkB,IAAIpxjB,EAAE8b,SAAS9b,EAAE8b,OAAO,EAAE,OAAO9b,EAAEoyjB,aAAapyjB,EAAEoyjB,YAAYxulB,KAAK,SAASmoE,EAAEulhB,eAAevlhB,EAAE4mhB,oBAAoB5mhB,EAAE4mhB,mBAAkB,EAAG5yjB,OAAE,IAASgwB,EAAE92C,MAAMu9B,EAAE,MAAMuZ,EAAEgc,EAAEgnhB,YAAY/yjB,EAAEskF,QAAQvkF,GAAGgsC,EAAE8lhB,eAAe7xjB,EAAEuzjB,yBAAyB3vlB,KAAKmoE,IAAIA,EAAE+mhB,uBAAuBtulB,SAAQ,SAASu7B,GAAG,OAAOuzjB,GAAGvzjB,EAAEC,EAAE+vB,EAAE,IAAGgc,EAAE+mhB,uBAAuB7ziB,QAAQjf,EAAEoxjB,kBAAkB,IAAIpxjB,EAAEoxjB,kBAAkBrlhB,EAAE/rC,EAAEwzjB,cACte,CAAC,SAAS/sM,GAAE1mX,EAAEC,GAAG,GAAG,IAAIA,EAAE8xjB,OAAOrulB,QAAQ,IAAIu8B,EAAElzB,SAASrJ,QAAQ,OAAOu8B,EAAElzB,SAAS,GAAG8vB,SAAS,CAAC,IAAImzB,EAAE/vB,EAAElzB,SAAS,GAAGijD,EAAEvpD,GAAGw5B,EAAEx5B,GAAGupD,EAAE8hiB,eAAc,EAAG,IAAI9hiB,EAAEjU,QAAQ2qW,GAAE1mX,EAAEgwB,EAAE,MAAMhwB,EAAE6yjB,kBAAkBhvlB,KAAKo8B,EAAE,CAC1M,SAASqzjB,GAAGtzjB,EAAEC,EAAE+vB,GAAG,GAAG,OAAO/vB,EAAE,CAAC,GAAG+vB,EAAE8hiB,cAAc,CAAC,GAAG,OAAO9xjB,EAAE0zjB,qBAAqB,MAAMx6kB,MAAMu9B,EAAE,MAAMzW,EAAE0zjB,qBAAqB1jiB,CAAC,CAAChwB,EAAEsxjB,mBAAmB,IAAItxjB,EAAEsxjB,mBAAmBtxjB,EAAEmyjB,aAAax1B,IAAE18hB,EAAED,EAAE2zjB,gBAAiB,MAAM1zjB,EAAEsxjB,eAAetxjB,EAAE2yjB,oBAAoB,IAAI3yjB,EAAEsxjB,cAAcvhiB,EAAE8hiB,eAAe,IAAI9hiB,EAAEjU,QAAQ2qW,GAAEzmX,EAAE+vB,GAAG/vB,EAAE6xjB,eAAe9xjB,EAAE4zjB,oBAAoB/vlB,KAAKo8B,GAAGA,EAAE8yjB,uBAAuBtulB,QAAQ4ulB,GAAGrzjB,GAAGC,EAAE8yjB,uBAAuB7ziB,SAAS8Q,EAAE8hiB,eAAe,IAAI9hiB,EAAEjU,SAAS2qW,GAAEzmX,EAAE+vB,GAAG,IAAI/vB,EAAE4yjB,kBAAkBnvlB,QACpfu8B,EAAE6xjB,eAAe9xjB,EAAE6zjB,kBAAkBhwlB,KAAKo8B,KAAKD,EAAEqxjB,kBAAkB,IAAIrxjB,EAAEqxjB,kBAAkBrxjB,EAAEA,EAAEyzjB,aAAe,CAC9G,SAAShC,GAAGzxjB,GAAG,GAAG,IAAIA,EAAE+b,OAAO,CAAC,IAAI9b,EAAE0piB,GAAE35gB,EAAEihiB,GAAGhslB,QAAQgslB,GAAGhslB,QAAQqrlB,GAAG,IAAItkhB,EAAE+5T,GAAEA,GAAE/lW,EAAEkzjB,cAAc,IAAI,IAAoB3ulB,EAAhBqtC,EAAE5R,EAAEwxjB,YAAc,IAAIjtlB,EAAE,EAAEA,EAAEqtC,EAAEluC,OAAOa,IAAI,CAAC,IAAIuyC,EAAElF,EAAErtC,GAAOqD,EAAEo4B,EAAEr4B,EAAEmvC,EAAE66iB,eAAe,GAAG,IAAIhqlB,EAAEo0C,OAAO,CAACiliB,GAAElqiB,EAAE3xC,SAAS,IAAIk9kB,GAAEz6kB,EAAEkvC,EAAEA,EAAEvwC,MAAMqB,EAAEsrlB,cAAc3F,sBAAsB5llB,EAAEsqlB,gBAAgBtqlB,EAAEuqlB,cAAcvqlB,EAAEoqlB,OAAOlulB,KAAK,kBAAkBizC,EAAE86iB,SAASpigB,OAAO14C,GAAGnvC,EAAEo0C,OAAO,EAAEu3iB,GAAG1rlB,EAAEkvC,EAAE46iB,gBAAgB/plB,EAAE,CAAC,MAAMklE,GAAG,GAAGkjhB,KAAK,kBAAkBljhB,GAAG,OAAOA,GAAG,oBAAoBA,EAAEh1D,KAAK,CAAC,IAAI0f,EAAEuf,EAAEo4S,KAAKriR,EAAEh1D,KAAK0f,EAAEA,EAAE,KAAK,CAACuf,EAAE86iB,SAASpigB,OAAO14C,GACngBnvC,EAAEo0C,OAAO,EAAE,IAAI7gC,EAAE47B,EAAE46iB,gBAAgBzygB,EAAEpS,EAAEy5U,EAAEC,GAAE3+Y,EAAEq3E,GAA4K,GAAzK,OAAO/jE,EAAEumkB,GAAE75kB,EAAEq3E,IAAI/jE,EAAEq2kB,eAAer2kB,EAAE03kB,oBAAoB13kB,EAAE03kB,mBAAkB,EAAG13kB,EAAE83kB,YAAY1sM,EAAEprY,EAAE42kB,eAAelqlB,EAAE4rlB,yBAAyB3vlB,KAAKqX,KAAKtT,EAAEyplB,kBAAqB,IAAIzplB,EAAEyplB,iBAAoC7qM,EAAb5+Y,EAAE6rlB,aAAe,CAAC,CAAU,CAAC,CAAC7hjB,EAAEn+B,OAAO,EAAElP,GAAG,OAAOy7B,EAAEqyjB,aAAayB,GAAG9zjB,EAAEA,EAAEqyjB,YAAY,CAAC,MAAMxlhB,GAAG05U,GAAEvmX,EAAE6sC,GAAG40gB,GAAEzhjB,EAAE6sC,EAAE,CAAC,QAAQk5T,GAAE/5T,EAAEilhB,GAAGhslB,QAAQ+qD,EAAEA,IAAIsgiB,IAAItP,GAAE/gjB,EAAE,CAAC,CAAC,CAC7Y,SAASwmX,GAAEzmX,EAAEC,EAAE+vB,GAAsB,OAAnBA,EAAE8hiB,eAAc,EAAU9hiB,EAAEjU,QAAQ,KAAK,EAAE,IAAIiwB,EAAEhc,EAAEvpD,GAAGu5B,EAAE+zjB,gBAAwJ,OAAxI/jiB,EAAEiiiB,gBAAe,EAAGjiiB,EAAEkiiB,cAAa,EAAGlyjB,EAAEA,EAAEkzjB,cAAcjzjB,EAAEp8B,KAAK,kBAAkBo8B,EAAEp8B,KAAKm8B,EAAEg0jB,mBAAmBh0jB,EAAEgsC,EAAElkE,SAAS,IAAIm4B,EAAEp8B,KAAKm8B,GAAUC,EAAEp8B,KAAK,iBAAiB,KAAK,EAAEmsD,EAAEjU,OAAO,EAAE,IAAInK,GAAE,EAAGo6B,EAAEhc,EAAE+hiB,OAAO,IAAIxtlB,EAAE,EAAEyrD,EAAEA,EAAEjjD,SAAS,IAAI,IAAI+pC,EAAE,EAAEA,EAAEkZ,EAAEtsD,OAAOozC,IAAI,CAAC,IAAIlF,EAAEoe,EAAElZ,GAAGvyC,EAAEqtC,EAAEh/B,MAAMrO,IAAI07B,EAAEp8B,KAAKmoE,EAAEznE,IAAIqtC,EAAEqijB,GAAGj0jB,EAAEC,EAAE2R,EAAE,CAAC,KAAKrtC,EAAEynE,EAAEtoE,OAAO,EAAEa,IAAI07B,EAAEp8B,KAAKmoE,EAAEznE,IAAiC,OAA7BA,EAAEynE,EAAEtoE,SAASkuC,EAAE3R,EAAEp8B,KAAKmoE,EAAEznE,KAAYqtC,EAAE,QAAQ,MAAM14B,MAAMu9B,EAAE,MAAO,CAChf,SAASw9iB,GAAGj0jB,EAAEC,EAAE+vB,GAAG,IAAIgc,EAAEhc,EAAEnzB,SAAS,GAAG,OAAOmvC,EAAE,OAAOy6U,GAAEzmX,EAAEC,EAAE+vB,GAAsB,GAAnBgc,EAAE8lhB,eAAc,EAAM9lhB,EAAE4mhB,kBAAkB,OAAO5yjB,EAAEkzjB,cAAc3F,uBAAuBvhhB,EAAEA,EAAEgnhB,YAAY/yjB,EAAEp8B,KAAK,mBAAmBo8B,EAAEp8B,KAAK,aAAamoE,IAAI/rC,EAAEp8B,KAAK,gBAAgBmoE,EAAE1oC,EAAE0oC,GAAG/rC,EAAEp8B,KAAKmoE,GAAG/rC,EAAEp8B,KAAK,MAAMo8B,EAAEp8B,KAAK,iBAAiB4iZ,GAAEzmX,EAAEC,EAAE+vB,GAAGhwB,IAAEA,EAAEkzjB,cAAc3F,sBAAwBttjB,EAAEp8B,KAAK,mBAAqB,GAAG,EAAEmoE,EAAEulhB,aAAa,CAACvlhB,EAAE2mhB,cAAc3yjB,EAAE+zjB,gBAAgB,EAAE/nhB,EAAE6mhB,kBAAkBnvlB,QAAQs8B,EAAE6zjB,kBAAkBhwlB,KAAKmoE,GAAG,IAAIp6B,EAAE5R,EAAEkzjB,cAC3e3ulB,EAAEqtC,EAAEsijB,iBAA6F,OAA5EtijB,EAAEA,EAAEuijB,eAAe5vlB,EAAEuD,SAAS,IAAIkkE,EAAEA,EAAEvlE,GAAGmrC,EAAEu7iB,EAAGltjB,EAAED,EAAEkzjB,cAAclnhB,GAAGy6U,GAAEzmX,EAAEC,EAAE+vB,GAAU/vB,EAAEp8B,KAAK,kBAAkB,CAAC,GAAGmoE,EAAE8mhB,SAAS9yjB,EAAEo0jB,qBAAqB,OAAOpohB,EAAE2mhB,cAAc3yjB,EAAE+zjB,gBAAgB/zjB,EAAE4zjB,oBAAoB/vlB,KAAKmoE,GAAGmhhB,EAAGltjB,EAAED,EAAEkzjB,cAAclnhB,EAAEvlE,IAAIggZ,GAAEzmX,EAAEC,EAAE+vB,GAAG/vB,EAAEp8B,KAAK,mBAAwG,GAArFm8B,EAAEkzjB,cAAc3F,sBAAsBttjB,EAAEp8B,KAAK,kBAA2C,KAAzBmsD,EAAEgc,EAAE6mhB,mBAA2BnvlB,OAAO,MAAMwV,MAAMu9B,EAAE,MACna,OADyaw9iB,GAAGj0jB,EAAEC,EAAE+vB,EAAE,IAAIhwB,IAAEA,EAAEkzjB,cAAc3F,sBAAwBttjB,EAAEp8B,KAAK,kBAC/d,CAAC,SAASwwlB,GAAGr0jB,EAAEC,EAAE+vB,GAAwD,OA9CjF,SAAYhwB,EAAEC,EAAE+vB,EAAEgc,GAAG,OAAOhc,EAAE08hB,eAAe,KAAK,EAAE,KAAK,EAAE,OAAO1sjB,EAAEn8B,KAAK,oBAAoBm8B,EAAEn8B,KAAKo8B,EAAEq0jB,eAAer0jB,EAAE+rC,EAAElkE,SAAS,IAAIk4B,EAAEn8B,KAAKo8B,GAAGD,EAAEn8B,KAAK,MAAM,KAAK,EAAE,OAAOm8B,EAAEn8B,KAAK,qDAAqDm8B,EAAEn8B,KAAKo8B,EAAEq0jB,eAAer0jB,EAAE+rC,EAAElkE,SAAS,IAAIk4B,EAAEn8B,KAAKo8B,GAAGD,EAAEn8B,KAAK,MAAM,KAAK,EAAE,OAAOm8B,EAAEn8B,KAAK,sDAAsDm8B,EAAEn8B,KAAKo8B,EAAEq0jB,eAAer0jB,EAAE+rC,EAAElkE,SAAS,IAAIk4B,EAAEn8B,KAAKo8B,GAAGD,EAAEn8B,KAAK,MAAM,KAAK,EAAE,OAAOm8B,EAAEn8B,KAAK,sBAAsBm8B,EAAEn8B,KAAKo8B,EAAEq0jB,eACter0jB,EAAE+rC,EAAElkE,SAAS,IAAIk4B,EAAEn8B,KAAKo8B,GAAGD,EAAEn8B,KAAK,MAAM,KAAK,EAAE,OAAOm8B,EAAEn8B,KAAK,6BAA6Bm8B,EAAEn8B,KAAKo8B,EAAEq0jB,eAAer0jB,EAAE+rC,EAAElkE,SAAS,IAAIk4B,EAAEn8B,KAAKo8B,GAAGD,EAAEn8B,KAAK,MAAM,KAAK,EAAE,OAAOm8B,EAAEn8B,KAAK,0BAA0Bm8B,EAAEn8B,KAAKo8B,EAAEq0jB,eAAer0jB,EAAE+rC,EAAElkE,SAAS,IAAIk4B,EAAEn8B,KAAKo8B,GAAGD,EAAEn8B,KAAK,MAAM,KAAK,EAAE,OAAOm8B,EAAEn8B,KAAK,gCAAgCm8B,EAAEn8B,KAAKo8B,EAAEq0jB,eAAer0jB,EAAE+rC,EAAElkE,SAAS,IAAIk4B,EAAEn8B,KAAKo8B,GAAGD,EAAEn8B,KAAK,MAAM,QAAQ,MAAMqV,MAAMu9B,EAAE,MAAO,CA6C/X89iB,CAAGt0jB,EAAED,EAAEkzjB,cAAcljiB,EAAEgiiB,cAAchiiB,EAAEvpD,IAAIwtlB,GAAGj0jB,EAAEC,EAAE+vB,GA5C9E,SAAYhwB,EAAEC,GAAG,OAAOA,EAAEysjB,eAAe,KAAK,EAAE,KAAK,EAAE,OAAO1sjB,EAAEn8B,KAAK,UAAU,KAAK,EAAE,OAAOm8B,EAAEn8B,KAAK,UAAU,KAAK,EAAE,OAAOm8B,EAAEn8B,KAAK,WAAW,KAAK,EAAE,OAAOm8B,EAAEn8B,KAAK,YAAY,KAAK,EAAE,OAAOm8B,EAAEn8B,KAAK,oBAAoB,KAAK,EAAE,OAAOm8B,EAAEn8B,KAAK,iBAAiB,KAAK,EAAE,OAAOm8B,EAAEn8B,KAAK,uBAAuB,QAAQ,MAAMqV,MAAMu9B,EAAE,MAAO,CA4C/O+9iB,CAAGv0jB,EAAE+vB,EAAEgiiB,cAAc,CAC7G,SAASyC,GAAGz0jB,EAAEC,EAAE+vB,GAAG,IAAI,IAAIgc,EAAEhc,EAAE6iiB,kBAAkBjhjB,EAAE,EAAEA,EAAEo6B,EAAEtoE,OAAOkuC,IAAI8ijB,GAAG10jB,EAAEC,EAAE+vB,EAAEgc,EAAEp6B,IAA6lB,GAAzlBo6B,EAAEtoE,OAAO,EAAEs8B,EAAEA,EAAEkzjB,cAAclnhB,EAAEhc,EAAEvpD,GAAGupD,EAAEA,EAAE2iiB,cAAc1yjB,EAAEp8B,KAAKm8B,EAAE20jB,mBAAmB30jB,EAAE40jB,6BAA6B30jB,EAAEp8B,KAAK,UAAUm8B,EAAE40jB,8BAA6B,EAAG30jB,EAAEp8B,KAAK,8aAAib,OAC/qBmoE,EAAE,MAAM9yD,MAAMu9B,EAAE,MAAiF,OAA3EuZ,EAAEA,EAAEloD,SAAS,IAAIm4B,EAAEp8B,KAAKmoE,GAAG/rC,EAAEp8B,KAAK,OAAOo8B,EAAEp8B,KAAKm8B,EAAEs0jB,eAAer0jB,EAAEp8B,KAAKmsD,GAAU/vB,EAAEp8B,KAAK,eAAiB,CAChI,SAAS6wlB,GAAG10jB,EAAEC,EAAE+vB,EAAEgc,GAAG,GAAG,IAAIA,EAAEjwB,OAAO,OAAM,EAAG,IAAInK,EAAEo6B,EAAEvlE,GAAG,IAAI,IAAImrC,EAAE,CAAC,IAAI,KAAKo6B,EAAEvlE,GAAGupD,EAAE2iiB,eAAe,MAAMz5kB,MAAMu9B,EAAE,MAAM,OAAO49iB,GAAGr0jB,EAAEC,EAAE+rC,EAAE,CACxD,OADyDqohB,GAAGr0jB,EAAEC,EAAE+rC,GAAGhsC,EAAEA,EAAEkzjB,cAAcjzjB,EAAEp8B,KAAKm8B,EAAE20jB,mBAAmB30jB,EAAE60jB,4BAA4B50jB,EAAEp8B,KAAK,UAAUm8B,EAAE60jB,6BAA4B,EAAG50jB,EAAEp8B,KAAK,2MAA2Mo8B,EAAEp8B,KAAKm8B,EAAEs0jB,eAC3e1ijB,EAAEA,EAAE9pC,SAAS,IAAIm4B,EAAEp8B,KAAK+tC,GAAG3R,EAAEp8B,KAAK,OAAOo8B,EAAEp8B,KAAKm8B,EAAEg0jB,mBAAmB/zjB,EAAEp8B,KAAK+tC,GAAU3R,EAAEp8B,KAAK,eAAiB,CAC9G,SAASiwlB,GAAG9zjB,EAAEC,GAAG,IAAI,IAAI+vB,EAAEhwB,EAAE0zjB,qBAAqB,GAAG,OAAO1jiB,GAAG,IAAIhwB,EAAEsxjB,iBAAiB,CAAC2C,GAAGj0jB,EAAEC,EAAE+vB,GAAGhwB,EAAE0zjB,qBAAqB,KAAK,IAAI1nhB,EAAEhsC,EAAEkzjB,cAAc4B,gBAAgB,IAAI9kiB,EAAE,EAAEA,EAAEgc,EAAEtoE,OAAO,EAAEssD,IAAI/vB,EAAEp8B,KAAKmoE,EAAEhc,IAAIA,EAAEgc,EAAEtoE,QAAQu8B,EAAEp8B,KAAKmoE,EAAEhc,GAAG,CAAC,IAAiCzrD,EAA7BqtC,EAAE5R,EAAEwzjB,yBAA2B,IAAIjvlB,EAAE,EAAEA,EAAEqtC,EAAEluC,OAAOa,IAAI,CAAC,IAAIuyC,EAAElF,EAAErtC,GAAGynE,EAAE/rC,EAAE,IAAIr4B,EAAEo4B,EAAEkzjB,cAAcvrlB,EAAEmvC,EAAErwC,GAAG8wB,EAAEuf,EAAEk8iB,YAAY93kB,EAAE47B,EAAEi+iB,aAAa91gB,EAAEnoC,EAAEk+iB,oBAC9W,GADkYhphB,EAAEnoE,KAAK+D,EAAE+slB,mBAAmB/slB,EAAEqtlB,yBAAyBjphB,EAAEnoE,KAAK,UAAU+D,EAAEqtlB,0BAAyB,EAAGjphB,EAAEnoE,KAAK,2LAC5e,OAAO8D,EAAE,MAAMuR,MAAMu9B,EAAE,MAA4B,GAAtBu1B,EAAEnoE,KAAK8D,GAAGqkE,EAAEnoE,KAAK,KAAQ0zB,GAAGrc,GAAG+jE,EAAE,CAACjT,EAAEnoE,KAAK,KAAK,IAAIyiZ,EAAE+mM,EAAG91jB,GAAG,IAAIy0C,EAAEnoE,KAAKyiZ,EAAE,CAAC,GAAGprY,GAAG+jE,EAAE,CAACjT,EAAEnoE,KAAK,KAAK,IAAI2iZ,EAAE6mM,EAAGnykB,GAAG,IAAI8wD,EAAEnoE,KAAK2iZ,EAAE,CAAC,GAAGvnU,EAAE,CAACjT,EAAEnoE,KAAK,KAAK,IAAIgpE,EAAEwghB,EAAGpugB,GAAGjT,EAAEnoE,KAAKgpE,EAAE,CAAC,IAAIb,EAAEnoE,KAAK,eAAuD,OAArCm8B,EAAEqyjB,YAAY,KAAK9tlB,SAAIqtC,EAAEn+B,OAAO,EAAElP,EAAU,CAACqtC,EAAEn+B,OAAO,EAAElP,GAAG,IAAI2wlB,EAAGl1jB,EAAE4zjB,oBAAoB,IAAIrvlB,EAAE,EAAEA,EAAE2wlB,EAAGxxlB,OAAOa,IAAI,IAAIkwlB,GAAGz0jB,EAAEC,EAAEi1jB,EAAG3wlB,IAA2C,OAAtCy7B,EAAEqyjB,YAAY,KAAK9tlB,SAAI2wlB,EAAGzhlB,OAAO,EAAElP,GAAU2wlB,EAAGzhlB,OAAO,EAAElP,GAAG,IAAI4wlB,EAAGn1jB,EAAE6zjB,kBAAkB,IAAItvlB,EAAE,EAAEA,EAAE4wlB,EAAGzxlB,OAAOa,IAAI,CAAC,IAAIuuU,EAAGqiR,EAAG5wlB,GAAGy7B,EAAE,CAAC4R,EAAE5R,EAAE8W,EAAE7W,EAAE,IAAIm1jB,EAAGtiR,EAAG+/Q,kBACjf,IAAIjrlB,EAAE,EAAEA,EAAEwtlB,EAAG1xlB,OAAOkE,IAAI,IAAI8slB,GAAG9ijB,EAAEkF,EAAEg8R,EAAGsiR,EAAGxtlB,IAAI,CAACA,IAAIwtlB,EAAG3hlB,OAAO,EAAE7L,GAAG,IAAIytlB,GAAG,EAAG,MAAMr1jB,CAAC,CAACo1jB,EAAG3hlB,OAAO,EAAE7L,GAAGytlB,GAAG,CAAE,CAAC,IAAIA,EAA0C,OAAtCr1jB,EAAEqyjB,YAAY,KAAK9tlB,SAAI4wlB,EAAG1hlB,OAAO,EAAElP,EAAU,CAAC4wlB,EAAG1hlB,OAAO,EAAElP,GAAG,IAAI+wlB,EAAGt1jB,EAAE4zjB,oBAAoB,IAAIrvlB,EAAE,EAAEA,EAAE+wlB,EAAG5xlB,OAAOa,IAAI,IAAIkwlB,GAAGz0jB,EAAEC,EAAEq1jB,EAAG/wlB,IAA2C,OAAtCy7B,EAAEqyjB,YAAY,KAAK9tlB,SAAI+wlB,EAAG7hlB,OAAO,EAAElP,GAAU+wlB,EAAG7hlB,OAAO,EAAElP,EAAE,CAAC,QAAQ,IAAIy7B,EAAEqxjB,iBAAiB,IAAIrxjB,EAAEwxjB,YAAY9tlB,QAAQ,IAAIs8B,EAAEwzjB,yBAAyB9vlB,QAAQ,IAAIs8B,EAAE4zjB,oBAAoBlwlB,QAAQu8B,EAAEp8B,KAAK,KAAK,CAAC,CAChc,SAAS0xlB,GAAGv1jB,EAAEC,GAAG,IAAI,IAAI+vB,EAAEhwB,EAAEw1jB,eAAexliB,EAAEvrD,SAAQ,SAASurD,GAAG,OAAOujiB,GAAGvjiB,EAAEhwB,EAAEC,EAAE,IAAG+vB,EAAE9Q,QAAQ,OAAOlf,EAAEqyjB,aAAayB,GAAG9zjB,EAAEA,EAAEqyjB,YAAY,CAAC,MAAMrmhB,GAAGu6U,GAAEvmX,EAAEgsC,GAAGy1gB,GAAEzhjB,EAAEgsC,EAAE,CAAC,CAAC,SAASyphB,KAAK,CAC/K,SAASC,GAAG11jB,EAAEC,EAAE+vB,EAAEgc,GAAG,IAAIp6B,GAAE,EAAGrtC,EAAE,KAAKuyC,EAAE,GAAGlvC,EAAE,CAAC/D,KAAK,SAASm8B,GAAoB,OAAjB,OAAOA,IAAI8W,GAAG9W,IAAS,CAAE,EAAE1H,QAAQ,SAAS0H,GAAG4R,GAAE,EAAGrtC,EAAEy7B,CAAC,GAAGr4B,GAAE,EAAkJ,GAA/Iq4B,EAjC7H,SAAYA,EAAEC,EAAE+vB,EAAEgc,EAAEp6B,EAAErtC,EAAEuyC,EAAElvC,EAAED,GAAG,IAAI4vB,EAAE,GAAGrc,EAAE,IAAI5I,IACH,OADya09C,EAAEwxhB,GAApavhjB,EAAE,CAACoyjB,YAAY,KAAKa,cAAcjzjB,EAAEm0jB,0BAAqB,IAASpohB,EAAE,MAAMA,EAAEjwB,OAAO,EAAEu2iB,WAAW,KAAKyB,cAAc,EAAE1C,gBAAgB,EAAEC,iBAAiB,EAAEoC,qBAAqB,KAAK8B,eAAet6kB,EAAEs2kB,YAAYj6jB,EAAEi8jB,yBAAyB,GAAGI,oBAAoB,GAAGC,kBAAkB,GAAGtve,aAAQ,IAAS3yE,EAAEu/iB,GAAGv/iB,EAAE6hjB,gBAAW,IAASlvlB,EAAEo4jB,GAAEp4jB,EAAEovlB,kBAAa,IAAS78iB,EAAE6lhB,GAAE7lhB,EAAEq7iB,kBAAa,IAASvqlB,EAAE+0jB,GAAE/0jB,EAAEwqlB,kBAAa,IAASzqlB,EAAEg1jB,GAAEh1jB,GAAS,EAAE,KAAKqoD,GAAE,GAAG,IAAM8hiB,eAC5e,EAAG9xjB,EAAEoxjB,GAAGnxjB,EAAED,EAAE,KAAKgwB,EAAE90C,EAAEyzkB,GAAG,KAAKU,IAAI93jB,EAAE1zB,KAAKm8B,GAAUC,CAAC,CAgC4E01jB,CAAG31jB,EAnDlI,SAAYA,EAAEC,GAAqB,MAAM,CAAC60jB,gBAAgB,GAAGH,kBAAkB,WAAWX,mBAAzE/zjB,OAAE,IAASA,EAAE,GAAGA,GAA6E,KAAKq0jB,cAAcr0jB,EAAE,KAAKk0jB,eAAel0jB,EAAE,KAAKu6f,SAASv6f,EAAEi0jB,eAAe,EAAEW,6BAA4B,EAAGD,8BAA6B,EAAGK,0BAAyB,EAAG1H,qBAAqBvtjB,EAAE,CAmDxK41jB,CAAG5liB,EAAE/vB,EAAEA,EAAE41jB,sBAAiB,GAAQ,CAACnJ,cAAc,EAAEC,cAAc,MAAM/3f,IAAS6ggB,QAAG,GAAO,WAAW9tlB,GAAE,CAAE,QAAE,OAAO,GAAQ8plB,GAAGzxjB,GAAGu1jB,GAAGv1jB,EAAEgsC,GAAM,IAAIhsC,EAAE+b,OAAO/b,EAAE+b,OAAO,EAAEn0C,EAAE0wB,QAAQ0H,EAAEsyjB,iBAAiB,GAAG,IAAItyjB,EAAE+b,QAAQ,OAAO/b,EAAEqyjB,YAAY,CAACryjB,EAAEqyjB,YAAYzqlB,EAAE,IAAIkslB,GAAG9zjB,EAAEp4B,EAAE,CAAC,MAAM2vB,GAAGgvX,GAAEvmX,EAAEzI,GAAGkqjB,GAAEzhjB,EAAEzI,EAAE,CAAC,CAAC,GAAGqa,EAAE,MAAMrtC,EAAE,IAAIoD,EAAE,MAAMuR,MAAMu9B,EAAE,MAAM,OAAOK,CAAC,CAC9cme,EAAQ6giB,mBAAmB,WAAW,MAAM58kB,MAAMu9B,EAAE,KAAM,EAAEwe,EAAQs1f,qBAAqB,SAASvqhB,EAAEC,GAAG,OAAOy1jB,GAAG11jB,EAAEC,GAAE,EAAG,8NAA8N,EAAEg1B,EAAQ8giB,yBAAyB,WAAW,MAAM78kB,MAAMu9B,EAAE,KAAM,EAAEwe,EAAQ+giB,eAAe,SAASh2jB,EAAEC,GAAG,OAAOy1jB,GAAG11jB,EAAEC,GAAE,EAAG,mXAAmX,EACn0Bg1B,EAAQllC,QAAQ,6CCnFH,IAAIu7jB,EAAG,EAAQ,OAAS,SAAS3jlB,EAAEq4B,GAAG,IAAI,IAAIC,EAAE,yDAAyDD,EAAEgwB,EAAE,EAAEA,EAAElkD,UAAUpI,OAAOssD,IAAI/vB,GAAG,WAAW8d,mBAAmBjyC,UAAUkkD,IAAI,MAAM,yBAAyBhwB,EAAE,WAAWC,EAAE,gHAAgH,CAAC,IAAIwW,EAAE,KAAKv7B,EAAE,EAC9W,SAASmK,EAAE2a,EAAEC,GAAG,GAAG,IAAIA,EAAEv8B,OAAO,GAAG,IAAIu8B,EAAEv8B,OAAO,EAAEwX,IAAI8kB,EAAEi2jB,QAAQ,IAAI/+iB,WAAWT,EAAEiC,OAAO,EAAEx9B,IAAIu7B,EAAE,IAAIS,WAAW,KAAKh8B,EAAE,GAAG8kB,EAAEi2jB,QAAQh2jB,OAAO,CAAC,IAAI+vB,EAAEvZ,EAAE/yC,OAAOwX,EAAE80C,EAAE/vB,EAAEv8B,SAAS,IAAIssD,EAAEhwB,EAAEi2jB,QAAQx/iB,IAAIA,EAAEj9B,IAAIymB,EAAEo7H,SAAS,EAAErrG,GAAG90C,GAAG8kB,EAAEi2jB,QAAQx/iB,GAAGxW,EAAEA,EAAEo7H,SAASrrG,IAAIvZ,EAAE,IAAIS,WAAW,KAAKh8B,EAAE,GAAGu7B,EAAEj9B,IAAIymB,EAAE/kB,GAAGA,GAAG+kB,EAAEv8B,MAAM,CAAC,CAAC,SAASk0D,EAAE53B,EAAEC,GAAU,OAAP5a,EAAE2a,EAAEC,IAAS,CAAE,CAAC,SAASi1jB,EAAGl1jB,GAAGyW,GAAG,EAAEv7B,IAAI8kB,EAAEi2jB,QAAQ,IAAI/+iB,WAAWT,EAAEiC,OAAO,EAAEx9B,IAAIu7B,EAAE,KAAKv7B,EAAE,EAAE,CAAC,IAAIi6kB,EAAG,IAAI5+a,YAAY,SAASzpG,EAAE9sC,GAAG,OAAOm1jB,EAAGh3iB,OAAOne,EAAE,CAAC,SAASikB,EAAEjkB,GAAG,OAAOm1jB,EAAGh3iB,OAAOne,EAAE,CAC7e,SAASo1jB,EAAGp1jB,EAAEC,GAAG,oBAAoBD,EAAEic,MAAMjc,EAAEic,MAAMhc,GAAGD,EAAEqvG,OAAO,CAAC,IAAIt+G,EAAEzmB,OAAOvH,UAAUwH,eAAe+qlB,EAAG,8VAA8V/J,EAAG,CAAC,EAAEC,EAAG,CAAC,EACnd,SAASC,EAAGzrjB,GAAG,QAAGjP,EAAEzqB,KAAKkllB,EAAGxrjB,KAAejP,EAAEzqB,KAAKillB,EAAGvrjB,KAAes1jB,EAAGl6kB,KAAK4kB,GAAUwrjB,EAAGxrjB,IAAG,GAAGurjB,EAAGvrjB,IAAG,GAAS,GAAE,CAAC,SAAS/O,EAAE+O,EAAEC,EAAE+vB,EAAEgc,EAAEp6B,EAAErtC,EAAEuyC,GAAG10C,KAAKuplB,gBAAgB,IAAI1rjB,GAAG,IAAIA,GAAG,IAAIA,EAAE79B,KAAK42V,cAAchtR,EAAE5pE,KAAKwplB,mBAAmBh6iB,EAAExvC,KAAKyplB,gBAAgB77hB,EAAE5tD,KAAKgna,aAAappY,EAAE59B,KAAKmJ,KAAK00B,EAAE79B,KAAK0plB,YAAYvnlB,EAAEnC,KAAK2plB,kBAAkBj1iB,CAAC,CAAC,IAAI+1B,EAAE,CAAC,EAC7U,uIAAuIjnE,MAAM,KAAKnB,SAAQ,SAASu7B,GAAG6sC,EAAE7sC,GAAG,IAAI/O,EAAE+O,EAAE,GAAE,EAAGA,EAAE,MAAK,GAAG,EAAG,IAAG,CAAC,CAAC,gBAAgB,kBAAkB,CAAC,YAAY,SAAS,CAAC,UAAU,OAAO,CAAC,YAAY,eAAev7B,SAAQ,SAASu7B,GAAG,IAAIC,EAAED,EAAE,GAAG6sC,EAAE5sC,GAAG,IAAIhP,EAAEgP,EAAE,GAAE,EAAGD,EAAE,GAAG,MAAK,GAAG,EAAG,IAAG,CAAC,kBAAkB,YAAY,aAAa,SAASv7B,SAAQ,SAASu7B,GAAG6sC,EAAE7sC,GAAG,IAAI/O,EAAE+O,EAAE,GAAE,EAAGA,EAAEx3B,cAAc,MAAK,GAAG,EAAG,IAC1e,CAAC,cAAc,4BAA4B,YAAY,iBAAiB/D,SAAQ,SAASu7B,GAAG6sC,EAAE7sC,GAAG,IAAI/O,EAAE+O,EAAE,GAAE,EAAGA,EAAE,MAAK,GAAG,EAAG,IAAG,8OAA8Op6B,MAAM,KAAKnB,SAAQ,SAASu7B,GAAG6sC,EAAE7sC,GAAG,IAAI/O,EAAE+O,EAAE,GAAE,EAAGA,EAAEx3B,cAAc,MAAK,GAAG,EAAG,IACxb,CAAC,UAAU,WAAW,QAAQ,YAAY/D,SAAQ,SAASu7B,GAAG6sC,EAAE7sC,GAAG,IAAI/O,EAAE+O,EAAE,GAAE,EAAGA,EAAE,MAAK,GAAG,EAAG,IAAG,CAAC,UAAU,YAAYv7B,SAAQ,SAASu7B,GAAG6sC,EAAE7sC,GAAG,IAAI/O,EAAE+O,EAAE,GAAE,EAAGA,EAAE,MAAK,GAAG,EAAG,IAAG,CAAC,OAAO,OAAO,OAAO,QAAQv7B,SAAQ,SAASu7B,GAAG6sC,EAAE7sC,GAAG,IAAI/O,EAAE+O,EAAE,GAAE,EAAGA,EAAE,MAAK,GAAG,EAAG,IAAG,CAAC,UAAU,SAASv7B,SAAQ,SAASu7B,GAAG6sC,EAAE7sC,GAAG,IAAI/O,EAAE+O,EAAE,GAAE,EAAGA,EAAEx3B,cAAc,MAAK,GAAG,EAAG,IAAG,IAAIkjlB,EAAG,gBAAgB,SAASM,EAAGhsjB,GAAG,OAAOA,EAAE,GAAG+X,aAAa,CACxZ,0jCAA0jCnyC,MAAM,KAAKnB,SAAQ,SAASu7B,GAAG,IAAIC,EAAED,EAAEz3B,QAAQmjlB,EACzmCM,GAAIn/gB,EAAE5sC,GAAG,IAAIhP,EAAEgP,EAAE,GAAE,EAAGD,EAAE,MAAK,GAAG,EAAG,IAAG,2EAA2Ep6B,MAAM,KAAKnB,SAAQ,SAASu7B,GAAG,IAAIC,EAAED,EAAEz3B,QAAQmjlB,EAAGM,GAAIn/gB,EAAE5sC,GAAG,IAAIhP,EAAEgP,EAAE,GAAE,EAAGD,EAAE,gCAA+B,GAAG,EAAG,IAAG,CAAC,WAAW,WAAW,aAAav7B,SAAQ,SAASu7B,GAAG,IAAIC,EAAED,EAAEz3B,QAAQmjlB,EAAGM,GAAIn/gB,EAAE5sC,GAAG,IAAIhP,EAAEgP,EAAE,GAAE,EAAGD,EAAE,wCAAuC,GAAG,EAAG,IAAG,CAAC,WAAW,eAAev7B,SAAQ,SAASu7B,GAAG6sC,EAAE7sC,GAAG,IAAI/O,EAAE+O,EAAE,GAAE,EAAGA,EAAEx3B,cAAc,MAAK,GAAG,EAAG,IACldqkE,EAAEq/gB,UAAU,IAAIj7jB,EAAE,YAAY,GAAE,EAAG,aAAa,gCAA+B,GAAG,GAAI,CAAC,MAAM,OAAO,SAAS,cAAcxsB,SAAQ,SAASu7B,GAAG6sC,EAAE7sC,GAAG,IAAI/O,EAAE+O,EAAE,GAAE,EAAGA,EAAEx3B,cAAc,MAAK,GAAG,EAAG,IAC5L,IAAIw9X,EAAE,CAAC36R,yBAAwB,EAAG8gf,aAAY,EAAG7gf,mBAAkB,EAAGC,kBAAiB,EAAGC,kBAAiB,EAAGC,SAAQ,EAAGC,cAAa,EAAGC,iBAAgB,EAAGC,aAAY,EAAGC,SAAQ,EAAGl3D,MAAK,EAAGm3D,UAAS,EAAGC,cAAa,EAAG7pF,YAAW,EAAG8pF,cAAa,EAAGC,WAAU,EAAGmgf,UAAS,EAAGlgf,SAAQ,EAAGC,YAAW,EAAGC,aAAY,EAAGC,cAAa,EAAGC,YAAW,EAAGC,eAAc,EAAGC,gBAAe,EAAGC,iBAAgB,EAAGjqF,YAAW,EAAGkqF,WAAU,EAAG7hE,YAAW,EAAG9c,SAAQ,EAAGiH,OAAM,EAAG23E,SAAQ,EAAGC,SAAQ,EAAGC,QAAO,EAAG9kE,QAAO,EAAG+kE,MAAK,EACzfC,aAAY,EAAGC,cAAa,EAAGC,aAAY,EAAGC,iBAAgB,EAAGC,kBAAiB,EAAGC,kBAAiB,EAAGC,eAAc,EAAGC,aAAY,GAAI2+e,EAAG,CAAC,SAAS,KAAK,MAAM,KAAK3hlB,OAAO6C,KAAK64X,GAAGvhY,SAAQ,SAASu7B,GAAGisjB,EAAGxnlB,SAAQ,SAASw7B,GAAGA,EAAEA,EAAED,EAAEmnB,OAAO,GAAGpP,cAAc/X,EAAE4S,UAAU,GAAGozV,EAAE/lW,GAAG+lW,EAAEhmW,EAAE,GAAE,IAAG,IAAIusjB,EAAG,UACnS,SAASjmM,EAAEtmX,GAAG,GAAG,mBAAmBA,GAAG,kBAAkBA,EAAE,MAAM,GAAGA,EAAEA,EAAE,GAAGA,EAAE,IAAIC,EAAEssjB,EAAGlilB,KAAK21B,GAAG,GAAGC,EAAE,CAAC,IAAS+rC,EAALhc,EAAE,GAAKpe,EAAE,EAAE,IAAIo6B,EAAE/rC,EAAErtB,MAAMo5D,EAAEhsC,EAAEt8B,OAAOsoE,IAAI,CAAC,OAAOhsC,EAAE57B,WAAW4nE,IAAI,KAAK,GAAG/rC,EAAE,SAAS,MAAM,KAAK,GAAGA,EAAE,QAAQ,MAAM,KAAK,GAAGA,EAAE,SAAS,MAAM,KAAK,GAAGA,EAAE,OAAO,MAAM,KAAK,GAAGA,EAAE,OAAO,MAAM,QAAQ,SAAS2R,IAAIo6B,IAAIhc,GAAGhwB,EAAE4S,UAAUhB,EAAEo6B,IAAIp6B,EAAEo6B,EAAE,EAAEhc,GAAG/vB,CAAC,CAACD,EAAE4R,IAAIo6B,EAAEhc,EAAEhwB,EAAE4S,UAAUhB,EAAEo6B,GAAGhc,CAAC,CAAC,OAAOhwB,CAAC,CAC/X,IAAIwsjB,EAAG,WAAWC,EAAG,OAAO0G,EAAG9slB,MAAMiD,QAAQsjlB,EAAG3oiB,EAAE,YAAY4oiB,EAAG5oiB,EAAE,cAAgB86B,EAAG96B,EAAE,iBAAiB8oiB,EAAG9oiB,EAAE,+BAA+B+oiB,EAAG/oiB,EAAE,yBAA2BgpiB,EAAG,sBAAsB,SAASC,EAAGltjB,EAAEC,EAAE+vB,EAAEgc,GAAG,OAAS/rC,GAAG,MAAM+vB,EAAE,UAAU,WAAWgc,CAAC,CAErQ,SAASw6U,EAAExmX,EAAEC,GAAG,MAAM,CAACysjB,cAAc1sjB,EAAE2sjB,cAAc1sjB,EAAE,CACiV,IAAImtjB,EAAGnpiB,EAAE,kBAAkB,SAASopiB,EAAGrtjB,EAAEC,EAAE+vB,EAAEgc,GAAG,MAAG,KAAK/rC,EAAS+rC,GAAEA,GAAGhsC,EAAEn8B,KAAKuplB,GAAIptjB,EAAEn8B,KAAKipE,EAAEw5U,EAAErmX,MAAW,EAAE,CACjf,IAAI21jB,EAAG,IAAIt8kB,IAAIg0kB,EAAGrpiB,EAAE,YAAYupiB,EAAGvpiB,EAAE,KAAKwpiB,EAAGxpiB,EAAE,KAC/C,SAASypiB,EAAG1tjB,EAAEC,EAAE+vB,GAAG,GAAG,kBAAkBA,EAAE,MAAM92C,MAAMvR,EAAE,KAAU,IAAI,IAAIqkE,KAAb/rC,GAAE,EAAgB+vB,EAAE,GAAGj/B,EAAEzqB,KAAK0pD,EAAEgc,GAAG,CAAC,IAAIp6B,EAAEoe,EAAEgc,GAAG,GAAG,MAAMp6B,GAAG,mBAAmBA,GAAG,KAAKA,EAAE,CAAC,GAAG,IAAIo6B,EAAE11D,QAAQ,MAAM,CAAC,IAAI/R,EAAEuoE,EAAEw5U,EAAEt6U,IAAIp6B,EAAEk7B,EAAEw5U,GAAG,GAAG10W,GAAGwH,QAAQ,KAAK,CAAC70C,EAAEynE,EAAE,IAAIl1B,EAAE8+iB,EAAG3wkB,IAAI1gB,QAAG,IAASuyC,IAAOA,EAAEmN,EAAEqiW,EAAE/hZ,EAAEgE,QAAQiklB,EAAG,OAAOhklB,cAAcD,QAAQkklB,EAAG,UAAUmJ,EAAGp8kB,IAAIjV,EAAEuyC,IAA3EvyC,EAAEuyC,EAAiFlF,EAAE,kBAAkBA,EAAE,IAAIA,GAAG7gB,EAAEzqB,KAAK0/X,EAAEh6T,GAAGc,EAAE,GAAGl7B,GAAGk7B,EAAEl7B,EAAE,MAAMk7B,EAAEw5U,GAAG,GAAG10W,GAAGwH,QAAQ,CAACnZ,GAAGA,GAAE,EAAGD,EAAEn8B,KAAKyplB,EAAG/olB,EAAEiplB,EAAG57iB,IAAI5R,EAAEn8B,KAAK4plB,EAAGlplB,EAAEiplB,EAAG57iB,EAAE,CAAC,CAAC3R,GAAGD,EAAEn8B,KAAK8lkB,EAAE,CACld,IAAIjwd,EAAEz1D,EAAE,KAAKyohB,EAAEzohB,EAAE,MAAM0lhB,EAAE1lhB,EAAE,KAAK0piB,EAAG1piB,EAAE,OACrC,SAASi9hB,EAAElhjB,EAAEC,EAAE+vB,EAAEgc,GAAG,OAAOhc,GAAG,IAAK,QAAkB,YAAV09hB,EAAG1tjB,EAAEC,EAAE+rC,GAAU,IAAK,eAAe,IAAK,iBAAiB,IAAK,YAAY,IAAK,iCAAiC,IAAK,2BAA2B,OAAO,KAAK,EAAEhc,EAAEtsD,SAAS,MAAMssD,EAAE,IAAI,MAAMA,EAAE,IAAI,MAAMA,EAAE,IAAI,MAAMA,EAAE,GAAG,GAAmC,QAAhC/vB,EAAE4sC,EAAEtiE,eAAeylD,GAAG6c,EAAE7c,GAAG,MAAc,CAAC,cAAcgc,GAAG,IAAK,WAAW,IAAK,SAAS,OAAO,IAAK,UAAU,IAAI/rC,EAAE0rjB,gBAAgB,OAA4B,OAArB37hB,EAAE8c,EAAE7sC,EAAE+4T,eAAsB/4T,EAAE10B,MAAM,KAAK,EAAEygE,GAAGhsC,EAAEn8B,KAAK61G,EAAE1pD,EAAE29hB,GAAI,MAAM,KAAK,GAAE,IAAK3hhB,EAAEhsC,EAAEn8B,KAAK61G,EAAE1pD,EAAE29hB,IAAI,IACpf3hhB,GAAGhsC,EAAEn8B,KAAK61G,EAAE1pD,EAAE08gB,EAAE5/f,EAAEw5U,EAAEt6U,IAAI29f,GAAG,MAAM,KAAK,EAAE9ke,MAAM74B,IAAIhsC,EAAEn8B,KAAK61G,EAAE1pD,EAAE08gB,EAAE5/f,EAAEw5U,EAAEt6U,IAAI29f,GAAG,MAAM,KAAK,GAAG9ke,MAAM74B,IAAI,GAAGA,GAAGhsC,EAAEn8B,KAAK61G,EAAE1pD,EAAE08gB,EAAE5/f,EAAEw5U,EAAEt6U,IAAI29f,GAAG,MAAM,QAAQ1piB,EAAE6rjB,cAAc9/gB,EAAE,GAAGA,GAAGhsC,EAAEn8B,KAAK61G,EAAE1pD,EAAE08gB,EAAE5/f,EAAEw5U,EAAEt6U,IAAI29f,GAAG,MAAM,GAAG8hB,EAAGz7hB,GAAG,CAAC,cAAcgc,GAAG,IAAK,WAAW,IAAK,SAAS,OAAO,IAAK,UAAU,GAAgC,WAA7B/rC,EAAE+vB,EAAExnD,cAAc6K,MAAM,EAAE,KAAgB,UAAU4sB,EAAE,OAAOD,EAAEn8B,KAAK61G,EAAE5sC,EAAE9c,GAAG08gB,EAAE5/f,EAAEw5U,EAAEt6U,IAAI29f,EAAE,CAAC,CAAC,IAAIwX,EAAEl9hB,EAAE,KAAK2piB,EAAG3piB,EAAE,MACjY,SAASogB,EAAErkC,EAAEC,EAAE+vB,GAAG,GAAG,MAAM/vB,EAAE,CAAC,GAAG,MAAM+vB,EAAE,MAAM92C,MAAMvR,EAAE,KAAK,GAAG,kBAAkBs4B,KAAK,WAAWA,GAAG,MAAM/mB,MAAMvR,EAAE,KAAgB,QAAXs4B,EAAEA,EAAE6sjB,cAAiB,IAAS7sjB,GAAGD,EAAEn8B,KAAKipE,EAAE,GAAG7sC,GAAG,CAAC,CAAsF,IAAI6tjB,EAAG7piB,EAAE,gBACvQ,SAAS8piB,GAAG/tjB,EAAEC,EAAE+vB,EAAEgc,GAAGhsC,EAAEn8B,KAAK21G,GAAExpD,IAAI,IAAazrD,EAATqtC,EAAEoe,EAAE,KAAO,IAAIzrD,KAAK07B,EAAE,GAAGlP,EAAEzqB,KAAK25B,EAAE17B,GAAG,CAAC,IAAIuyC,EAAE7W,EAAE17B,GAAG,GAAG,MAAMuyC,EAAE,OAAOvyC,GAAG,IAAK,WAAWyrD,EAAElZ,EAAE,MAAM,IAAK,0BAA0BlF,EAAEkF,EAAE,MAAM,QAAQoqiB,EAAElhjB,EAAEgsC,EAAEznE,EAAEuyC,GAAG,CAAoB,OAAnB9W,EAAEn8B,KAAKs9kB,GAAG98gB,EAAErkC,EAAE4R,EAAEoe,GAAS,kBAAkBA,GAAGhwB,EAAEn8B,KAAKipE,EAAEw5U,EAAEt2V,KAAK,MAAMA,CAAC,CAAC,IAAIg+hB,GAAG/piB,EAAE,MAAMgqiB,GAAG,8BAA8BC,GAAG,IAAI50kB,IAAI,SAASkgG,GAAEx5E,GAAG,IAAIC,EAAEiujB,GAAGjpkB,IAAI+a,GAAG,QAAG,IAASC,EAAE,CAAC,IAAIgujB,GAAG7ykB,KAAK4kB,GAAG,MAAM9mB,MAAMvR,EAAE,GAAGq4B,IAAIC,EAAEgkB,EAAE,IAAIjkB,GAAGkujB,GAAG10kB,IAAIwmB,EAAEC,EAAE,CAAC,OAAOA,CAAC,CAAC,IAAIkujB,GAAGlqiB,EAAE,mBAC9b,SAASmqiB,GAAGpujB,EAAEC,EAAE+vB,EAAEgc,EAAEp6B,GAAG,OAAO3R,GAAG,IAAK,SAASD,EAAEn8B,KAAK21G,GAAE,WAAW,IAAIj1G,EAAE,KAAKuyC,EAAE,KAAK,IAAIs8C,KAAKpjC,EAAE,GAAGj/B,EAAEzqB,KAAK0pD,EAAEojC,GAAG,CAAC,IAAIxrF,EAAEooD,EAAEojC,GAAG,GAAG,MAAMxrF,EAAE,OAAOwrF,GAAG,IAAK,WAAW7uF,EAAEqD,EAAE,MAAM,IAAK,0BAA0BkvC,EAAElvC,EAAE,MAAM,IAAK,eAAe,IAAK,QAAQ,MAAM,QAAQs5kB,EAAElhjB,EAAEgsC,EAAEonB,EAAExrF,GAAG,CAAoB,OAAnBo4B,EAAEn8B,KAAKs9kB,GAAG98gB,EAAErkC,EAAE8W,EAAEvyC,GAAUA,EAAE,IAAK,SAASuyC,EAAElF,EAAE+6iB,cAAc3sjB,EAAEn8B,KAAK21G,GAAE,WAAW,IAAIjiF,EAAE3vB,EAAE,KAAKq3E,EAAE,KAASmU,EAAE,KAAK,IAAI7uF,KAAKyrD,EAAE,GAAGj/B,EAAEzqB,KAAK0pD,EAAEzrD,GAAG,CAAC,IAAI++B,EAAE0sB,EAAEzrD,GAAG,GAAG,MAAM++B,EAAE,OAAO/+B,GAAG,IAAK,WAAWqD,EAAE07B,EAAE,MAAM,IAAK,WAAW27C,EAAE37C,EAAE,MAAM,IAAK,0BAA0B8vD,EAC3gB9vD,EAAE,MAAM,IAAK,QAAQ/L,EAAE+L,EAAE,QAAQ49iB,EAAElhjB,EAAEgsC,EAAEznE,EAAE++B,GAAG,CAAC,GAAG,MAAMwT,EAAE,GAAGkZ,EAAE,OAAOz4B,EAAE,GAAGA,EAHgG,SAAYyI,GAAG,IAAIC,EAAE,GAAuD,OAApDqrjB,EAAGrikB,SAASxkB,QAAQu7B,GAAE,SAASA,GAAG,MAAMA,IAAIC,GAAGD,EAAE,IAAUC,CAAC,CAGlL4tjB,CAAGjmlB,GAAGurlB,EAAGr8iB,IAAG,IAAIk1B,EAAE,EAAEA,EAAEl1B,EAAEpzC,OAAOsoE,IAAK,GAAG,GAAGl1B,EAAEk1B,KAAKhc,EAAE,CAAChwB,EAAEn8B,KAAKiqlB,GAAI,KAAK,MAAM,GAAGh3iB,IAAIkZ,GAAGhwB,EAAEn8B,KAAKiqlB,QAAS7ugB,GAAGj/C,EAAEn8B,KAAKiqlB,GAAuB,OAAnB9tjB,EAAEn8B,KAAKs9kB,GAAG98gB,EAAErkC,EAAEozD,EAAExrF,GAAUA,EAAE,IAAK,WAA4C,IAAIA,KAArCo4B,EAAEn8B,KAAK21G,GAAE,aAAapmB,EAAEt8C,EAAEvyC,EAAE,KAAcyrD,EAAE,GAAGj/B,EAAEzqB,KAAK0pD,EAAEpoD,IAAY,OAAP2vB,EAAEy4B,EAAEpoD,IAAY,OAAOA,GAAG,IAAK,WAAWwrF,EAAE77D,EAAE,MAAM,IAAK,QAAQhzB,EAAEgzB,EAAE,MAAM,IAAK,eAAeuf,EAAEvf,EAAE,MAAM,IAAK,0BAA0B,MAAMre,MAAMvR,EAAE,KAAK,QAAQu5kB,EAAElhjB,EAAEgsC,EAAEpkE,EAAE2vB,GACjd,GADod,OAAOhzB,GAAG,OAAOuyC,IAAIvyC,EAAEuyC,GAAG9W,EAAEn8B,KAAKs9kB,GAClf,MAAM/tf,EAAE,CAAC,GAAG,MAAM7uF,EAAE,MAAM2U,MAAMvR,EAAE,KAAK,GAAGwrlB,EAAG//f,IAAI,EAAEA,EAAE1vF,OAAO,MAAMwV,MAAMvR,EAAE,KAAKpD,EAAE,GAAG6uF,CAAC,CAA2E,MAA1E,kBAAkB7uF,GAAG,OAAOA,EAAE,IAAIy7B,EAAEn8B,KAAKmqlB,IAAI,OAAOzplB,GAAGy7B,EAAEn8B,KAAKipE,EAAEw5U,EAAE,GAAG/hZ,KAAY,KAAK,IAAK,QAAwC,IAAIuyC,KAApC9W,EAAEn8B,KAAK21G,GAAE,UAAUjiF,EAAE67D,EAAExrF,EAAErD,EAAE,KAAcyrD,EAAE,GAAGj/B,EAAEzqB,KAAK0pD,EAAElZ,IAAY,OAAPmoC,EAAEjvB,EAAElZ,IAAY,OAAOA,GAAG,IAAK,WAAW,IAAK,0BAA0B,MAAM59B,MAAMvR,EAAE,IAAI,UAAU,IAAK,iBAAiB4vB,EAAE0nD,EAAE,MAAM,IAAK,eAAer3E,EAAEq3E,EAAE,MAAM,IAAK,UAAUmU,EAAEnU,EAAE,MAAM,IAAK,QAAQ16E,EAAE06E,EAAE,MAAM,QAAQiigB,EAAElhjB,EAAEgsC,EAAEl1B,EAAEmoC,GAC3X,OAD8X,OAAOmU,EAAE8tf,EAAElhjB,EAAEgsC,EAAE,UAC7eonB,GAAG,OAAO77D,GAAG2pjB,EAAElhjB,EAAEgsC,EAAE,UAAUz0C,GAAG,OAAOhzB,EAAE28kB,EAAElhjB,EAAEgsC,EAAE,QAAQznE,GAAG,OAAOqD,GAAGs5kB,EAAElhjB,EAAEgsC,EAAE,QAAQpkE,GAAGo4B,EAAEn8B,KAAK+plB,GAAW,KAAK,IAAK,WAAiC,IAAI,IAAI5ghB,KAA9BhtC,EAAEn8B,KAAK21G,GAAE,aAA0BxpD,EAAE,GAAGj/B,EAAEzqB,KAAK0pD,EAAEgd,IAAY,OAAPzoE,EAAEyrD,EAAEgd,IAAY,OAAOA,GAAG,IAAK,WAAW,IAAK,0BAA0B,MAAM9zD,MAAMvR,EAAE,MAAM,QAAQu5kB,EAAElhjB,EAAEgsC,EAAEgB,EAAEzoE,GAAa,OAAVy7B,EAAEn8B,KAAKs9kB,GAAU,KAAK,IAAK,QAAkC,IAAI79iB,KAA9BtD,EAAEn8B,KAAK21G,GAAE,UAAUj1G,EAAE,KAAcyrD,EAAE,GAAGj/B,EAAEzqB,KAAK0pD,EAAE1sB,IAAY,OAAPwT,EAAEkZ,EAAE1sB,IAAY,OAAOA,GAAG,IAAK,WAAW/+B,EAAEuyC,EAAE,MAAM,IAAK,0BAA0B,MAAM59B,MAAMvR,EAAE,MAAM,QAAQu5kB,EAAElhjB,EAAEgsC,EAAE1oC,EAAEwT,GAClf,OADqf9W,EAAEn8B,KAAKs9kB,GACrf58kB,EAAE,IAAK,UAAU,IAAK,MAA4B,IAAIgzB,KAA1ByI,EAAEn8B,KAAK21G,GAAEv5E,IAAI6W,EAAEvyC,EAAE,KAAcyrD,EAAE,GAAGj/B,EAAEzqB,KAAK0pD,EAAEz4B,IAAY,OAAP3vB,EAAEooD,EAAEz4B,IAAY,OAAOA,GAAG,IAAK,WAAWhzB,EAAEqD,EAAE,MAAM,IAAK,0BAA0BkvC,EAAElvC,EAAE,MAAM,QAAQs5kB,EAAElhjB,EAAEgsC,EAAEz0C,EAAE3vB,GAAa,GAAVo4B,EAAEn8B,KAAKs9kB,GAAM,MAAMrqiB,EAAE,CAAC,GAAG,MAAMvyC,EAAE,MAAM2U,MAAMvR,EAAE,KAAK,GAAG,kBAAkBmvC,KAAK,WAAWA,GAAG,MAAM59B,MAAMvR,EAAE,KAAgB,QAAXqoD,EAAElZ,EAAEg2iB,cAAiB,IAAS98hB,IAAI,kBAAkBA,GAAG,EAAEA,EAAEtsD,QAAQ,OAAOssD,EAAE,GAAGhwB,EAAEn8B,KAAKmqlB,GAAGlhhB,EAAE9c,IAAIhwB,EAAEn8B,KAAKipE,EAAE,GAAG9c,IAAI,CAA8C,MAA7C,kBAAkBzrD,GAAG,OAAOA,EAAE,IAAIy7B,EAAEn8B,KAAKmqlB,IAAWzplB,EAAE,IAAK,OAAO,IAAK,OAAO,IAAK,KAAK,IAAK,MAAM,IAAK,QAAQ,IAAK,KAAK,IAAK,MAAM,IAAK,SAAS,IAAK,OAAO,IAAK,OAAO,IAAK,QAAQ,IAAK,SAAS,IAAK,QAAQ,IAAK,MAC5nB,IAAI,IAAImtC,KAD0nB1R,EAAEn8B,KAAK21G,GAAEv5E,IAC9nB+vB,EAAE,GAAGj/B,EAAEzqB,KAAK0pD,EAAEte,IAAY,OAAPntC,EAAEyrD,EAAEte,IAAY,OAAOA,GAAG,IAAK,WAAW,IAAK,0BAA0B,MAAMx4B,MAAMvR,EAAE,IAAIs4B,IAAI,QAAQihjB,EAAElhjB,EAAEgsC,EAAEt6B,EAAEntC,GAAc,OAAXy7B,EAAEn8B,KAAK+plB,GAAW,KAAK,IAAK,iBAAiB,IAAK,gBAAgB,IAAK,YAAY,IAAK,gBAAgB,IAAK,gBAAgB,IAAK,mBAAmB,IAAK,iBAAiB,IAAK,gBAAgB,OAAOG,GAAG/tjB,EAAEgwB,EAAE/vB,EAAE+rC,GAAG,IAAK,OAAO,OAAO,IAAIp6B,EAAE86iB,eAAe1sjB,EAAEn8B,KAAKsqlB,IAAIJ,GAAG/tjB,EAAEgwB,EAAE/vB,EAAE+rC,GAAG,QAAQ,IAAI,IAAI/rC,EAAE3pB,QAAQ,MAAM,kBAAkB05C,EAAE0gC,GAAG,OAAOq9f,GAAG/tjB,EAAEgwB,EAAE/vB,EAAE+rC,GACle,IAAIiT,KADiej/C,EAAEn8B,KAAK21G,GAAEv5E,IACvf6W,EAAEvyC,EAAE,KAAcyrD,EAAE,GAAGj/B,EAAEzqB,KAAK0pD,EAAEivB,IAAY,OAAPr3E,EAAEooD,EAAEivB,IAAY,OAAOA,GAAG,IAAK,WAAW16E,EAAEqD,EAAE,MAAM,IAAK,0BAA0BkvC,EAAElvC,EAAE,MAAM,IAAK,QAAQ8llB,EAAG1tjB,EAAEgsC,EAAEpkE,GAAG,MAAM,IAAK,iCAAiC,IAAK,2BAA2B,MAAM,QAAQ6jlB,EAAGxsgB,IAAI,oBAAoBr3E,GAAG,kBAAkBA,GAAGo4B,EAAEn8B,KAAK61G,EAAE5sC,EAAEmS,GAAGytf,EAAE5/f,EAAEw5U,EAAE1+Y,IAAI+hkB,GAAsB,OAAnB3piB,EAAEn8B,KAAKs9kB,GAAG98gB,EAAErkC,EAAE8W,EAAEvyC,GAAUA,EAAE,CAC7V,IAAI8plB,GAAGpqiB,EAAE,MAAMqqiB,GAAGrqiB,EAAE,KAAKsqiB,GAAGtqiB,EAAE,kBAAkBuqiB,GAAGvqiB,EAAE,iBAAiBwqiB,GAAGxqiB,EAAE,kBAAkB0qiB,GAAG1qiB,EAAE,iCAAiC2qiB,GAAG3qiB,EAAE,iBAAiB+4I,GAAG/4I,EAAE,mBAAmB8qiB,GAAG9qiB,EAAE,mBAAmB+qiB,GAAG/qiB,EAAE,aAAakmD,GAAGlmD,EAAE,KAAK6sH,GAAG7sH,EAAE,gBAAgBA,EAAE,eAAeA,EAAE,gBAAgB,IAAIiriB,GAAGjriB,EAAE,gBAAgB,SAASoriB,GAAGrvjB,EAAEC,EAAE+vB,GAAW,GAAR3qC,EAAE2a,EAAE2ujB,IAAO,OAAO3+hB,EAAE,MAAM92C,MAAMvR,EAAE,MAAa,OAAP0d,EAAE2a,EAAEgwB,GAAU4H,EAAE53B,EAAE4ujB,GAAG,CACtY,IAAIU,GAAGrriB,EAAE,oBAAoBiyiB,GAAGjyiB,EAAE,MAAMuriB,GAAGvriB,EAAE,UAAUwriB,GAAGxriB,EAAE,qDAAqDkyiB,GAAGlyiB,EAAE,MAAMyriB,GAAGzriB,EAAE,UAAU6uR,GAAG7uR,EAAE,sDAAsDoxiB,GAAGpxiB,EAAE,MAAM0riB,GAAG1riB,EAAE,WAAW2riB,GAAG3riB,EAAE,sBAAsB6riB,GAAG7riB,EAAE,MAAM8riB,GAAG9riB,EAAE,YAAY+riB,GAAG/riB,EAAE,6BAA6BgsiB,GAAGhsiB,EAAE,MAAMksiB,GAAGlsiB,EAAE,oBAAoBmsiB,GAAGnsiB,EAAE,0BAA0BosiB,GAAGpsiB,EAAE,MAAMqsiB,GAAGrsiB,EAAE,iBAAiBgtiB,GAAGhtiB,EAAE,gCAAgCktiB,GAAGltiB,EAAE,MAAM0xiB,GAAG1xiB,EAAE,uBAGnd,IAAIsuiB,GAAGtuiB,EAAE,0MAA0MuuiB,GAAGvuiB,EAAE,SAASyuiB,GAAGzuiB,EAAE,OAAOgviB,GAAGhviB,EAAE,gBAAkBmviB,GAAGnviB,EAAE,6aACzQoviB,GAAGpviB,EAAE,SAASqviB,GAAGrviB,EAAE,OAAOsviB,GAAGtviB,EAAE,gBAAkB6viB,GAAG7viB,EAAE,0LAA0LgwiB,GAAGhwiB,EAAE,SAASowiB,GAAGpwiB,EAAE,KAAKwwiB,GAAGxwiB,EAAE,eAAiBywiB,GAAGzwiB,EAAE,KAAKsxiB,GAAG,mBAC3S,SAASE,GAAGz1jB,GAAG,OAAO7Z,KAAKE,UAAU2Z,GAAGz3B,QAAQgtlB,IAAG,SAASv1jB,GAAG,OAAOA,GAAG,IAAK,IAAI,MAAM,UAAU,IAAK,SAAS,MAAM,UAAU,IAAK,SAAS,MAAM,UAAU,QAAQ,MAAM9mB,MAAM,qMAAsM,GAAE,CAC1X,IAAI8mM,GAAE11M,OAAOsF,OAAO8llB,GAAGr6kB,OAAO0wD,IAAI,iBAAiBqqhB,GAAG/6kB,OAAO0wD,IAAI,gBAAgBsqhB,GAAGh7kB,OAAO0wD,IAAI,kBAAkBuqhB,GAAGj7kB,OAAO0wD,IAAI,qBAAqBwqhB,GAAGl7kB,OAAO0wD,IAAI,kBAAkByqhB,GAAGn7kB,OAAO0wD,IAAI,kBAAkB0qhB,GAAGp7kB,OAAO0wD,IAAI,iBAAiBkxH,GAAG5hL,OAAO0wD,IAAI,qBAAqB2qhB,GAAGr7kB,OAAO0wD,IAAI,kBAAkB+5T,GAAGzqX,OAAO0wD,IAAI,uBAAuB4qhB,GAAGt7kB,OAAO0wD,IAAI,cAAc6qhB,GAAGv7kB,OAAO0wD,IAAI,cAAc8qhB,GAAGx7kB,OAAO0wD,IAAI,eAAe+qhB,GAAGz7kB,OAAO0wD,IAAI,0BAA0B85T,GAAGxqX,OAAO0wD,IAAI,uBACtegrhB,GAAG17kB,OAAO0wD,IAAI,uBAAuBirhB,GAAG37kB,OAAOC,SAC/C,SAAS27kB,GAAGj3jB,GAAG,GAAG,MAAMA,EAAE,OAAO,KAAK,GAAG,oBAAoBA,EAAE,OAAOA,EAAE3V,aAAa2V,EAAEj5B,MAAM,KAAK,GAAG,kBAAkBi5B,EAAE,OAAOA,EAAE,OAAOA,GAAG,KAAKq2jB,GAAG,MAAM,WAAW,KAAKD,GAAG,MAAM,SAAS,KAAKG,GAAG,MAAM,WAAW,KAAKD,GAAG,MAAM,aAAa,KAAKI,GAAG,MAAM,WAAW,KAAK5wN,GAAG,MAAM,eAAe,GAAG,kBAAkB9lW,EAAE,OAAOA,EAAE+sC,UAAU,KAAK0phB,GAAG,OAAOz2jB,EAAE3V,aAAa,WAAW,YAAY,KAAKmskB,GAAG,OAAOx2jB,EAAEjnB,SAASsR,aAAa,WAAW,YAAY,KAAK4yK,GAAG,IAAIh9J,EAAED,EAAEn1B,OAC7Z,OADoam1B,EAAEA,EAAE3V,eACnd2V,EAAE,MADieA,EAAEC,EAAE5V,aAClf4V,EAAEl5B,MAAM,IAAY,cAAci5B,EAAE,IAAI,cAAqBA,EAAE,KAAK22jB,GAAG,OAA6B,QAAtB12jB,EAAED,EAAE3V,aAAa,MAAc4V,EAAEg3jB,GAAGj3jB,EAAEz0B,OAAO,OAAO,KAAKqrlB,GAAG32jB,EAAED,EAAE0ujB,SAAS1ujB,EAAEA,EAAEi8F,MAAM,IAAI,OAAOg7d,GAAGj3jB,EAAEC,GAAG,CAAC,MAAM+vB,GAAG,EAAE,OAAO,IAAI,CAAC,IAAIkniB,GAAG,CAAC,EAAE,SAASC,GAAGn3jB,EAAEC,GAAoB,KAAjBD,EAAEA,EAAE+2hB,cAAmB,OAAOmgC,GAAG,IAASlrhB,EAALhc,EAAE,CAAC,EAAI,IAAIgc,KAAKhsC,EAAEgwB,EAAEgc,GAAG/rC,EAAE+rC,GAAG,OAAOhc,CAAC,CAAC,IAAIy8gB,GAAE,KACvT,SAASrhgB,GAAEprC,EAAEC,GAAG,GAAGD,IAAIC,EAAE,CAACD,EAAE76B,QAAQ48kB,cAAc/hjB,EAAE8ujB,YAAY9ujB,EAAEA,EAAErE,OAAO,IAAIq0B,EAAE/vB,EAAEtE,OAAO,GAAG,OAAOqE,GAAG,GAAG,OAAOgwB,EAAE,MAAM92C,MAAMvR,EAAE,UAAW,CAAC,GAAG,OAAOqoD,EAAE,MAAM92C,MAAMvR,EAAE,MAAMyjE,GAAEprC,EAAEgwB,EAAE,CAAC/vB,EAAE96B,QAAQ48kB,cAAc9hjB,EAAE73B,KAAK,CAAC,CAAC,SAASgvlB,GAAGp3jB,GAAGA,EAAE76B,QAAQ48kB,cAAc/hjB,EAAE8ujB,YAAuB,QAAX9ujB,EAAEA,EAAErE,SAAiBy7jB,GAAGp3jB,EAAE,CAAC,SAASq3jB,GAAGr3jB,GAAG,IAAIC,EAAED,EAAErE,OAAO,OAAOsE,GAAGo3jB,GAAGp3jB,GAAGD,EAAE76B,QAAQ48kB,cAAc/hjB,EAAE53B,KAAK,CAClX,SAASkvlB,GAAGt3jB,EAAEC,GAAoD,GAAjDD,EAAE76B,QAAQ48kB,cAAc/hjB,EAAE8ujB,YAA0B,QAAd9ujB,EAAEA,EAAErE,QAAmB,MAAMziB,MAAMvR,EAAE,MAAMq4B,EAAEt6B,QAAQu6B,EAAEv6B,MAAM0lE,GAAEprC,EAAEC,GAAGq3jB,GAAGt3jB,EAAEC,EAAE,CAAC,SAASs3jB,GAAGv3jB,EAAEC,GAAG,IAAI+vB,EAAE/vB,EAAEtE,OAAO,GAAG,OAAOq0B,EAAE,MAAM92C,MAAMvR,EAAE,MAAMq4B,EAAEt6B,QAAQsqD,EAAEtqD,MAAM0lE,GAAEprC,EAAEgwB,GAAGuniB,GAAGv3jB,EAAEgwB,GAAG/vB,EAAE96B,QAAQ48kB,cAAc9hjB,EAAE73B,KAAK,CAAC,SAASqxG,GAAEz5E,GAAG,IAAIC,EAAEwsiB,GAAExsiB,IAAID,IAAI,OAAOC,EAAEo3jB,GAAGr3jB,GAAG,OAAOA,EAAEo3jB,GAAGn3jB,GAAGA,EAAEv6B,QAAQs6B,EAAEt6B,MAAM0lE,GAAEnrC,EAAED,GAAGC,EAAEv6B,MAAMs6B,EAAEt6B,MAAM4xlB,GAAGr3jB,EAAED,GAAGu3jB,GAAGt3jB,EAAED,GAAGysiB,GAAEzsiB,EAAE,CAC7X,IAAIw3jB,GAAG,CAAC/8f,UAAU,WAAW,OAAM,CAAE,EAAEsmf,gBAAgB,SAAS/gjB,EAAEC,GAAuB,QAApBD,EAAEA,EAAEivjB,iBAAyB3+f,OAAOtwD,EAAEswD,MAAMzsF,KAAKo8B,EAAE,EAAE64hB,oBAAoB,SAAS94hB,EAAEC,IAAGD,EAAEA,EAAEivjB,iBAAkB1mlB,SAAQ,EAAGy3B,EAAEswD,MAAM,CAACrwD,EAAE,EAAE6gjB,mBAAmB,WAAW,GACxO,SAASl7M,GAAG5lW,EAAEC,EAAE+vB,EAAEgc,GAAG,IAAIp6B,OAAE,IAAS5R,EAAEvT,MAAMuT,EAAEvT,MAAM,KAAKuT,EAAEva,QAAQ+xkB,GAAGx3jB,EAAEl1B,MAAMklD,EAAEhwB,EAAEvT,MAAMmlB,EAAE,IAAIrtC,EAAE,CAAC+rF,MAAM,GAAG/nF,SAAQ,GAAIy3B,EAAEivjB,gBAAgB1qlB,EAAE,IAAIuyC,EAAE7W,EAAEkvjB,YAAkL,GAAtKnvjB,EAAE76B,QAAQ,kBAAkB2xC,GAAG,OAAOA,EAAEA,EAAEiriB,cAAc/1gB,EAA+B,oBAA7Bl1B,EAAE7W,EAAEy3hB,4BAA0D9lhB,EAAE,QAAXkF,EAAEA,EAAEkZ,EAAEpe,UAAe,IAASkF,EAAElF,EAAEouK,GAAE,CAAC,EAAEpuK,EAAEkF,GAAG9W,EAAEvT,MAAMmlB,GAAM,oBAAoB3R,EAAEy3hB,0BAA0B,oBAAoB13hB,EAAEovjB,0BAA0B,oBAAoBpvjB,EAAEq3hB,2BAA2B,oBAAoBr3hB,EAAEk3hB,oBAAoB,GAAGj3hB,EACrgBD,EAAEvT,MAAM,oBAAoBuT,EAAEk3hB,oBAAoBl3hB,EAAEk3hB,qBAAqB,oBAAoBl3hB,EAAEq3hB,2BAA2Br3hB,EAAEq3hB,4BAA4Bp3hB,IAAID,EAAEvT,OAAO+qkB,GAAG1+B,oBAAoB94hB,EAAEA,EAAEvT,MAAM,MAAM,OAAOloB,EAAE+rF,OAAO,EAAE/rF,EAAE+rF,MAAM5sF,OAAO,GAAGu8B,EAAE17B,EAAE+rF,MAAMx5C,EAAEvyC,EAAEgE,QAAQhE,EAAE+rF,MAAM,KAAK/rF,EAAEgE,SAAQ,EAAGuuC,GAAG,IAAI7W,EAAEv8B,OAAOs8B,EAAEvT,MAAMwT,EAAE,OAAO,CAAuB,IAAtB17B,EAAEuyC,EAAE7W,EAAE,GAAGD,EAAEvT,MAAMmlB,GAAE,EAAOkF,EAAEA,EAAE,EAAE,EAAEA,EAAE7W,EAAEv8B,OAAOozC,IAAI,CAAC,IAAIlvC,EAAEq4B,EAAE6W,GAA6C,OAA1ClvC,EAAE,oBAAoBA,EAAEA,EAAEtB,KAAK05B,EAAEz7B,EAAEyrD,EAAEgc,GAAGpkE,KAAYgqC,GAAGA,GAAE,EAAGrtC,EAAEy7M,GAAE,CAAC,EAAEz7M,EAAEqD,IAAIo4M,GAAEz7M,EAAEqD,GAAG,CAACo4B,EAAEvT,MAAMloB,CAAC,MAAMA,EAAE+rF,MAAM,IAAI,CAC3e,IAAImngB,GAAG,CAAChxlB,GAAG,EAAEwrB,SAAS,IAAI,SAASylkB,GAAG13jB,EAAEC,EAAE+vB,GAAG,IAAIgc,EAAEhsC,EAAEv5B,GAAGu5B,EAAEA,EAAE/N,SAAS,IAAI2f,EAAE,GAAG+ljB,GAAG3rhB,GAAG,EAAEA,KAAK,GAAGp6B,GAAGoe,GAAG,EAAE,IAAIzrD,EAAE,GAAGozlB,GAAG13jB,GAAG2R,EAAE,GAAG,GAAGrtC,EAAE,CAAC,IAAIuyC,EAAElF,EAAEA,EAAE,EAAyC,OAAvCrtC,GAAGynE,GAAG,GAAGl1B,GAAG,GAAGhvC,SAAS,IAAIkkE,IAAIl1B,EAAElF,GAAGkF,EAAQ,CAACrwC,GAAG,GAAG,GAAGkxlB,GAAG13jB,GAAG2R,EAAEoe,GAAGpe,EAAEo6B,EAAE/5C,SAAS1tB,EAAEy7B,EAAE,CAAC,MAAM,CAACv5B,GAAG,GAAGlC,EAAEyrD,GAAGpe,EAAEo6B,EAAE/5C,SAAS+N,EAAE,CAAC,IAAI23jB,GAAGpskB,KAAKgkkB,MAAMhkkB,KAAKgkkB,MAAiC,SAAYvvjB,GAAU,OAAO,KAAdA,KAAK,GAAe,GAAG,IAAI43jB,GAAG53jB,GAAG63jB,GAAG,GAAG,CAAC,EAA/ED,GAAGrskB,KAAKm/C,IAAImthB,GAAGtskB,KAAK4yiB,IACtT,IAAI25B,GAAG,oBAAoBxtlB,OAAOomF,GAAGpmF,OAAOomF,GADsU,SAAY1wD,EAAEC,GAAG,OAAOD,IAAIC,IAAI,IAAID,GAAG,EAAEA,IAAI,EAAEC,IAAID,IAAIA,GAAGC,IAAIA,CAAC,EAC/X2siB,GAAE,KAAKmrB,GAAG,KAAKC,GAAG,KAAKjyN,GAAE,KAAK42L,IAAE,EAAGs7B,IAAG,EAAGzW,GAAE,EAAEj7L,GAAE,KAAK2xM,GAAG,EAAE,SAASzW,KAAI,GAAG,OAAO7U,GAAE,MAAM1zjB,MAAMvR,EAAE,MAAM,OAAOilkB,EAAC,CAAC,SAASurB,KAAK,GAAG,EAAED,GAAG,MAAMh/kB,MAAMvR,EAAE,MAAM,MAAM,CAACkolB,cAAc,KAAKv/f,MAAM,KAAK7oF,KAAK,KAAK,CAAC,SAAS2wlB,KAAwG,OAAnG,OAAOryN,GAAE,OAAOiyN,IAAIr7B,IAAE,EAAGq7B,GAAGjyN,GAAEoyN,OAAOx7B,IAAE,EAAG52L,GAAEiyN,IAAI,OAAOjyN,GAAEt+X,MAAMk1jB,IAAE,EAAG52L,GAAEA,GAAEt+X,KAAK0wlB,OAAOx7B,IAAE,EAAG52L,GAAEA,GAAEt+X,MAAas+X,EAAC,CAAC,SAASsyN,KAAKN,GAAGnrB,GAAE,KAAKqrB,IAAG,EAAGD,GAAG,KAAKE,GAAG,EAAEnyN,GAAEwgB,GAAE,IAAI,CAAC,SAAS+xM,GAAGt4jB,EAAEC,GAAG,MAAM,oBAAoBA,EAAEA,EAAED,GAAGC,CAAC,CAC5d,SAASs4jB,GAAGv4jB,EAAEC,EAAE+vB,GAAgB,GAAb48gB,GAAE6U,KAAI17M,GAAEqyN,KAAQz7B,GAAE,CAAC,IAAI3wf,EAAE+5T,GAAEz1S,MAAmB,GAAbrwD,EAAE+rC,EAAEkkhB,SAAY,OAAO3pM,SAAe,KAAXv2V,EAAEu2V,GAAEthY,IAAI+mD,IAAe,CAACu6U,GAAE/2T,OAAOxjB,GAAGA,EAAE+5T,GAAE8pN,cAAc,GAAG7jhB,EAAEhsC,EAAEgsC,EAAEhc,EAAEhpC,QAAQgpC,EAAEA,EAAEvoD,WAAW,OAAOuoD,GAAqB,OAAlB+1U,GAAE8pN,cAAc7jhB,EAAQ,CAACA,EAAE/rC,EAAE,CAAC,MAAM,CAAC8lW,GAAE8pN,cAAc5vjB,EAAE,CAA6I,OAA5ID,EAAEA,IAAIs4jB,GAAG,oBAAoBr4jB,EAAEA,IAAIA,OAAE,IAAS+vB,EAAEA,EAAE/vB,GAAGA,EAAE8lW,GAAE8pN,cAAc7vjB,EAAsCA,GAApCA,EAAE+lW,GAAEz1S,MAAM,CAAC4hQ,KAAK,KAAKg+P,SAAS,OAAUA,SAASsI,GAAGpjjB,KAAK,KAAKw3hB,GAAE5siB,GAAS,CAAC+lW,GAAE8pN,cAAc7vjB,EAAE,CAC9Y,SAASy4jB,GAAGz4jB,EAAEC,GAAoC,GAAjC2siB,GAAE6U,KAAWxhjB,OAAE,IAASA,EAAE,KAAKA,EAAK,QAA9B8lW,GAAEqyN,MAAqC,CAAC,IAAIpoiB,EAAE+1U,GAAE8pN,cAAc,GAAG,OAAO7/hB,GAAG,OAAO/vB,EAAE,CAAC,IAAI+rC,EAAEhc,EAAE,GAAGhwB,EAAE,GAAG,OAAOgsC,EAAEA,GAAE,MAAO,CAAC,IAAI,IAAIp6B,EAAE,EAAEA,EAAEo6B,EAAEtoE,QAAQkuC,EAAE3R,EAAEv8B,OAAOkuC,IAAI,IAAIkmjB,GAAG73jB,EAAE2R,GAAGo6B,EAAEp6B,IAAI,CAACo6B,GAAE,EAAG,MAAMhsC,CAAC,CAACgsC,GAAE,CAAE,CAAC,GAAGA,EAAE,OAAOhc,EAAE,EAAE,CAAC,CAA6B,OAA5BhwB,EAAEA,IAAI+lW,GAAE8pN,cAAc,CAAC7vjB,EAAEC,GAAUD,CAAC,CAAC,SAASw4jB,GAAGx4jB,EAAEC,EAAE+vB,GAAG,GAAG,IAAIkoiB,GAAG,MAAMh/kB,MAAMvR,EAAE,MAAM,GAAGq4B,IAAI4siB,GAAE,GAAGqrB,IAAG,EAAGj4jB,EAAE,CAAChZ,OAAOgpC,EAAEvoD,KAAK,MAAM,OAAO8+Y,KAAIA,GAAE,IAAIjtY,UAAgB,KAAX02C,EAAEu2V,GAAEthY,IAAIgb,IAAcsmX,GAAE/sY,IAAIymB,EAAED,OAAO,CAAC,IAAIC,EAAE+vB,EAAE,OAAO/vB,EAAEx4B,MAAMw4B,EAAEA,EAAEx4B,KAAKw4B,EAAEx4B,KAAKu4B,CAAC,CAAC,CACjd,SAAS04jB,KAAK,MAAMx/kB,MAAMvR,EAAE,KAAM,CAAC,SAASgxlB,KAAK,CACjD,IAAIC,GAAG,CAACrI,YAAY,SAASvwjB,GAAG,OAAOA,EAAE+hjB,aAAa,EAAE1nkB,WAAW,SAAS2lB,GAAO,OAAJyhjB,KAAWzhjB,EAAE+hjB,aAAa,EAAEr4jB,QAAQ+ukB,GAAGjI,WAAW+H,GAAGj1kB,OAAO,SAAS0c,GAAG4siB,GAAE6U,KAAW,IAAIxhjB,GAAX8lW,GAAEqyN,MAAavI,cAAc,OAAO,OAAO5vjB,GAAGD,EAAE,CAAC/6B,QAAQ+6B,GAAG+lW,GAAE8pN,cAAc7vjB,GAAGC,CAAC,EAAE7c,SAAS,SAAS4c,GAAG,OAAOu4jB,GAAGD,GAAGt4jB,EAAE,EAAEywjB,mBAAmBkI,GAAGp+f,gBAAgB,WAAW,EAAE7/E,YAAY,SAASslB,EAAEC,GAAG,OAAOw4jB,IAAG,WAAW,OAAOz4jB,CAAC,GAAEC,EAAE,EAAEywjB,oBAAoBiI,GAAGh1kB,UAAUg1kB,GAAG1xe,cAAc0xe,GAAGhI,iBAAiB,SAAS3wjB,GAAO,OAAJyhjB,KAAWzhjB,CAAC,EAAE4wjB,cAAc,WACnf,OAD8fnP,KACxf,EAAC,EAAGiX,GAAG,EAAE7H,MAAM,WAAW,IAAI7wjB,EAAE+3jB,GAAGjH,YAAgB7wjB,EAAED,EAAE/N,SAAgB+N,IAAPA,EAAEA,EAAEv5B,MAAU,GAAG,GAAGkxlB,GAAG33jB,GAAG,IAAIl4B,SAAS,IAAIm4B,EAAE,IAAI+vB,EAAE6oiB,GAAG,GAAG,OAAO7oiB,EAAE,MAAM92C,MAAMvR,EAAE,MAAgE,OAA1Ds4B,EAAEuhjB,KAAIxhjB,EAAE,IAAIgwB,EAAEwqe,SAAS,IAAIx6f,EAAE,EAAEC,IAAID,GAAG,IAAIC,EAAEn4B,SAAS,KAAYk4B,EAAE,GAAG,EAAE+wjB,iBAAiB,SAAS/wjB,EAAEC,GAAO,OAAJwhjB,KAAWxhjB,EAAED,EAAEgxjB,QAAQ,EAAE1pe,qBAAqB,SAAStnF,EAAEC,EAAE+vB,GAAG,QAAG,IAASA,EAAE,MAAM92C,MAAMvR,EAAE,MAAM,OAAOqoD,GAAG,GAAG6oiB,GAAG,KAAKC,GAAGxN,EAAGnJ,mDAAmD+O,uBAAuB,SAAS6H,GAAG/4jB,GAAoB,OAAjB4tB,QAAQ3R,MAAMjc,GAAU,IAAI,CACnf,SAASqijB,KAAI,CAEuC,SAAS2W,GAAGh5jB,EAAEC,EAAE+vB,EAAEgc,EAAEp6B,EAAErtC,EAAEuyC,EAAElvC,GAAGo4B,EAAEqxjB,kBAAkB,OAAOrhiB,EAAEhwB,EAAEsxjB,mBAAmBthiB,EAAEuhiB,eAAe,IAAIh6jB,EAAE,CAAChxB,KAAK05B,EAAEivT,KAAK,WAAW,IAAIjvT,EAAED,EAAEwxjB,YAAYvxjB,EAAEp8B,KAAK0zB,GAAG,IAAI0I,EAAEv8B,QAAQu1lB,GAAGj5jB,EAAE,EAAE0xjB,gBAAgB1hiB,EAAE2hiB,eAAe3lhB,EAAE4lhB,SAAShgjB,EAAEigjB,cAActtlB,EAAEY,QAAQ2xC,EAAEg6iB,YAAYlplB,GAAY,OAATgqC,EAAEvc,IAAIkC,GAAUA,CAAC,CAAC,SAAS2hkB,GAAGl5jB,EAAEC,EAAE+vB,EAAEgc,EAAEp6B,EAAErtC,GAAG,MAAM,CAACw3C,OAAO,EAAEt1C,IAAI,EAAEmM,MAAMqtB,EAAE6xjB,eAAc,EAAGC,OAAO,GAAGhllB,SAAS,GAAGillB,cAAchmhB,EAAEnvC,SAASmzB,EAAEiiiB,eAAergjB,EAAEsgjB,aAAa3tlB,EAAE,CACve,SAASmiZ,GAAE1mX,EAAEC,GAAkB,GAAG,OAAlBD,EAAEA,EAAEukF,QAAQtkF,KAAe,kBAAkBD,EAAE,MAAM9mB,MAAM,wMAAwM8mB,EAAE,aAAa,OAAOA,CAAC,CAAC,SAASm5jB,GAAGn5jB,EAAEC,GAAG,IAAI+vB,EAAEhwB,EAAEmyjB,aAAaniiB,EAAE/vB,IAAG+vB,EAAEhwB,EAAEoyjB,cAAenyjB,GAAG,OAAOD,EAAEqyjB,aAAaryjB,EAAE+b,OAAO,EAAEq5iB,EAAGp1jB,EAAEqyjB,YAAYpyjB,KAAKD,EAAE+b,OAAO,EAAE/b,EAAEsyjB,WAAWryjB,EAAE,CAC7b,SAASm5jB,GAAGp5jB,EAAEC,EAAE+vB,EAAEgc,EAAEp6B,GAAiB,IAAdg7hB,GAAE,CAAC,EAAEmrB,GAAG93jB,EAAEuhjB,GAAE,EAAMxhjB,EAAEgwB,EAAEgc,EAAEp6B,GAAGqmjB,IAAIA,IAAG,EAAGzW,GAAE,EAAE0W,IAAI,EAAEnyN,GAAE,KAAK/lW,EAAEgwB,EAAEgc,EAAEp6B,GAAQ,OAALymjB,KAAYr4jB,CAAC,CAAC,SAASq5jB,GAAGr5jB,EAAEC,EAAE+vB,EAAEgc,GAAG,IAAIp6B,EAAEoe,EAAEnlD,SAAStG,EAAEynE,EAAEgrf,kBAAkB,GAAG,OAAOzyjB,QAAG,IAASA,EAAE,CAAC,IAAIuyC,EAAE7W,EAAE4xjB,cAAc,GAAG,oBAAoB7hiB,EAAEingB,gBAAgBjrf,EAAEl1B,MAAM,CAAuB,IAAI,IAAIlvC,KAA9BooD,EAAEA,EAAEingB,kBAAiC,KAAKrvjB,KAAKrD,GAAG,MAAM2U,MAAMvR,EAAE,IAAIsvlB,GAAGjrhB,IAAI,UAAUpkE,IAAIokE,EAAEg0I,GAAE,CAAC,EAAElpK,EAAEkZ,EAAE,CAAC/vB,EAAE4xjB,cAAc7lhB,EAAEy6U,GAAEzmX,EAAEC,EAAE2R,GAAG3R,EAAE4xjB,cAAc/6iB,CAAC,MAAM2vW,GAAEzmX,EAAEC,EAAE2R,EAAE,CACha,SAAS0njB,GAAGt5jB,EAAEC,GAAG,GAAGD,GAAGA,EAAE8zC,aAAa,CAA4B,IAAI,IAAI9jB,KAAnC/vB,EAAE+/K,GAAE,CAAC,EAAE//K,GAAGD,EAAEA,EAAE8zC,kBAA4B,IAAS7zC,EAAE+vB,KAAK/vB,EAAE+vB,GAAGhwB,EAAEgwB,IAAI,OAAO/vB,CAAC,CAAC,OAAOA,CAAC,CAC7H,SAASs5jB,GAAGv5jB,EAAEC,EAAE+vB,EAAEgc,EAAEp6B,GAAG,GAAG,oBAAoBoe,EAAE,GAAGA,EAAEjtD,WAAWitD,EAAEjtD,UAAU+5F,iBAAiB,CAAClrD,EAAEuljB,GAAGnniB,EAAE/vB,EAAE4xjB,eAAe,IAAIttlB,EAAEyrD,EAAEm/hB,YAAuEvpN,GAA3DrhY,EAAE,IAAIyrD,EAAEgc,EAAE,kBAAkBznE,GAAG,OAAOA,EAAEA,EAAEw9kB,cAAcnwiB,GAAQoe,EAAEgc,EAAEp6B,GAAGynjB,GAAGr5jB,EAAEC,EAAE17B,EAAEyrD,EAAE,KAAK,CAAyBpe,EAAEwnjB,GAAGp5jB,EAAEC,EAAE+vB,EAAEgc,EAAnCznE,EAAE4ylB,GAAGnniB,EAAE/vB,EAAE4xjB,gBAA+B,IAAI/6iB,EAAE,IAAI0qiB,GAAE,GAAG,kBAAkB5viB,GAAG,OAAOA,GAAG,oBAAoBA,EAAE/mC,aAAQ,IAAS+mC,EAAEm7B,SAAS64T,GAAGh0V,EAAEoe,EAAEgc,EAAEznE,GAAG80lB,GAAGr5jB,EAAEC,EAAE2R,EAAEoe,QAAQ,GAAGlZ,EAAE,CAACk1B,EAAE/rC,EAAE6wjB,YAAY7wjB,EAAE6wjB,YAAY4G,GAAG1rhB,EAAE,EAAE,GAAG,IAAIy6U,GAAEzmX,EAAEC,EAAE2R,EAAE,CAAC,QAAQ3R,EAAE6wjB,YAAY9khB,CAAC,CAAC,MAAMy6U,GAAEzmX,EAAEC,EAAE2R,EAAE,KAAM,IAAG,kBAC1eoe,EAAoa,CAAC,OAAOA,GAAG,KAAK61U,GAAG,KAAKixN,GAAG,KAAKR,GAAG,KAAKC,GAAG,KAAKF,GAC3d,KAAKvwN,GAAqB,YAAlB2gB,GAAEzmX,EAAEC,EAAE+rC,EAAEj/D,UAAiB,KAAK8plB,GAAG,MAAM39kB,MAAMvR,EAAE,MAAM,KAAK+ulB,GAAG12jB,EAAE,CAACgwB,EAAE/vB,EAAEyxjB,gBAAgB9/iB,EAAE3R,EAAE0xjB,eAAeptlB,EAAEynE,EAAEutB,SAASvtB,EAAEA,EAAEj/D,SAAmB,IAAInF,EAAE,CAACnB,GAAG,KAAKkslB,eAAe,EAAEb,eAAc,EAAGP,aAAa,EAAEqB,mBAAkB,EAAGC,kBAAkB,GAAGC,SAAS,EAAEC,uBAA/Hj8iB,EAAE,IAAIxkC,IAAkJ0glB,YAAY,MAAMz7jB,EAAE2hkB,GAAGl5jB,EAAE4R,EAAEmgjB,OAAOrulB,OAAOkE,EAAEgqC,EAAEogjB,eAAc,GAAG,GAAIpgjB,EAAE7kC,SAASlJ,KAAK0zB,GAAGqa,EAAEqgjB,gBAAe,EAAG,IAAIhzgB,EAAEi6gB,GAAGl5jB,EAAE,EAAE,KAAK4R,EAAEogjB,eAAc,GAAG,GAAI/ygB,EAAE6ygB,eAAc,EAAG7xjB,EAAEyxjB,gBAAgB9plB,EAAEq4B,EAAE0xjB,eAAe1ygB,EAAE,IAAI,GAAGytH,GAAG1sK,EACvfC,EAAE+rC,GAAGiT,EAAEgzgB,gBAAgBhzgB,EAAEizgB,cAAcjzgB,EAAE8ygB,OAAOlulB,KAAKuplB,GAAInugB,EAAEljC,OAAO,EAAEy9iB,GAAG5xlB,EAAEq3E,GAAG,IAAIr3E,EAAE2plB,aAAa,MAAMvxjB,CAAC,CAAC,MAAMozD,GAAGnU,EAAEljC,OAAO,EAAEn0C,EAAEgrlB,mBAAkB,EAAGhrlB,EAAEorlB,YAAYtsM,GAAE1mX,EAAEozD,EAAE,CAAC,QAAQnzD,EAAEyxjB,gBAAgB1hiB,EAAE/vB,EAAE0xjB,eAAe//iB,CAAC,CAAC3R,EAAE+4jB,GAAGh5jB,EAAEz7B,EAAEyrD,EAAEz4B,EAAEuf,EAAE7W,EAAE4xjB,cAAc5xjB,EAAE96B,QAAQ86B,EAAE6wjB,aAAa9wjB,EAAEwxjB,YAAY3tlB,KAAKo8B,EAAE,CAAC,OAAO,GAAG,kBAAkB+vB,GAAG,OAAOA,EAAE,OAAOA,EAAE+c,UAAU,KAAKkwH,GAA0B,GAAvBjxH,EAAEothB,GAAGp5jB,EAAEC,EAAE+vB,EAAEnlD,OAAOmhE,EAAEp6B,GAAM,IAAI4viB,GAAE,CAACxxhB,EAAE/vB,EAAE6wjB,YAAY7wjB,EAAE6wjB,YAAY4G,GAAG1niB,EAAE,EAAE,GAAG,IAAIy2V,GAAEzmX,EAAEC,EAAE+rC,EAAE,CAAC,QAAQ/rC,EAAE6wjB,YAAY9giB,CAAC,CAAC,MAAMy2V,GAAEzmX,EAAEC,EAAE+rC,GAAG,OAAO,KAAK2qhB,GACjd,YAAd4C,GAAGv5jB,EAAEC,EAD6d+vB,EACnfA,EAAEzkD,KAAKygE,EAAEsthB,GAAGtpiB,EAAEgc,GAAcp6B,GAAU,KAAK4kjB,GAAkL,GAA/K5kjB,EAAEo6B,EAAEj/D,SAASijD,EAAEA,EAAEj3C,SAASizD,EAAEA,EAAE5jE,MAAM7D,EAAEyrD,EAAE+xhB,cAAc/xhB,EAAE+xhB,cAAc/1gB,EAAMyggB,GAAEzggB,EAAE,CAACrwC,OAATmb,EAAE21hB,GAAgB/mkB,MAAM,OAAOoxC,EAAE,EAAEA,EAAEpxC,MAAM,EAAEP,QAAQ6qD,EAAE8+hB,YAAYvqlB,EAAE6D,MAAM4jE,GAAG/rC,EAAE96B,QAAQ6mE,EAAEy6U,GAAEzmX,EAAEC,EAAE2R,GAAU,QAAP5R,EAAEysiB,IAAc,MAAMvzjB,MAAMvR,EAAE,MAAwG,OAAlGqkE,EAAEhsC,EAAE8ujB,YAAY9ujB,EAAE76B,QAAQ48kB,cAAc/1gB,IAAI+qhB,GAAG/2jB,EAAE76B,QAAQ28kB,cAAc91gB,EAAEhsC,EAAEysiB,GAAEzsiB,EAAErE,YAAOsE,EAAE96B,QAAQ66B,GAAS,KAAKy2jB,GAA8C,YAAThwM,GAAEzmX,EAAEC,EAAzB+rC,GAAbA,EAAEA,EAAEj/D,UAAaijD,EAAE+xhB,gBAA+B,KAAK6U,GAA0D,YAAnB2C,GAAGv5jB,EAAEC,EAA/B+vB,GAAVpe,EAAEoe,EAAEisE,OAAUjsE,EAAE0+hB,UAAU1ihB,EAAEsthB,GAAGtpiB,EAAEgc,QAAc,GAAe,MAAM9yD,MAAMvR,EAAE,IACpf,MAAMqoD,EAAEA,SAASA,EAAE,IAAK,CAJoJ,OAA/IzrD,EAAE6plB,IAArBx8iB,EAAE3R,EAAE0xjB,gBAAsBI,OAAO/hiB,EAAEgc,EAAEhsC,EAAEkzjB,cAActhjB,EAAEogjB,eAAepgjB,EAAEqgjB,gBAAe,EAAGn7iB,EAAElF,EAAEogjB,cAAcpgjB,EAAEogjB,cA7CxH,SAAYhyjB,EAAEC,EAAE+vB,GAAG,OAAO/vB,GAAG,IAAK,SAAS,OAAOumX,EAAE,EAAE,MAAMx2V,EAAE5nD,MAAM4nD,EAAE5nD,MAAM4nD,EAAExV,cAAc,IAAK,MAAM,OAAOgsW,EAAE,EAAE,MAAM,IAAK,OAAO,OAAOA,EAAE,EAAE,MAAM,IAAK,gBAAgB,OAAOA,EAAE,EAAE,MAAM,IAAK,QAAQ,OAAOA,EAAE,EAAE,MAAM,IAAK,QAAQ,IAAK,QAAQ,IAAK,QAAQ,OAAOA,EAAE,EAAE,MAAM,IAAK,WAAW,OAAOA,EAAE,EAAE,MAAM,IAAK,KAAK,OAAOA,EAAE,EAAE,MAAM,OAAO,GAAGxmX,EAAE0sjB,eAAe,IAAI1sjB,EAAE0sjB,cAAclmM,EAAE,EAAE,MAAMxmX,CAAC,CA6CjQw0jB,CAAG19iB,EAAEkZ,EAAEgc,GAAG0gI,GAAG1sK,EAAEC,EAAE17B,GAAGqtC,EAAEogjB,cAAcl7iB,EAASkZ,GAAG,IAAK,OAAO,IAAK,OAAO,IAAK,KAAK,IAAK,MAAM,IAAK,QAAQ,IAAK,KAAK,IAAK,MAAM,IAAK,QAAQ,IAAK,SAAS,IAAK,OAAO,IAAK,OAAO,IAAK,QAAQ,IAAK,SAAS,IAAK,QAAQ,IAAK,MAAM,MAAM,QAAQpe,EAAEmgjB,OAAOlulB,KAAKwqlB,GAAGvhhB,EAAE9c,GAAGs+hB,IAAI18iB,EAAEqgjB,gBAAe,CAI5Y,CAAC,CACzB,SAASxrM,GAAEzmX,EAAEC,EAAE+vB,GAAY,GAAT/vB,EAAE15B,KAAKypD,EAAK,kBAAkBA,GAAG,OAAOA,EAAE,CAAC,OAAOA,EAAE+c,UAAU,KAAK2ohB,GAAgC,YAA7B6D,GAAGv5jB,EAAEC,EAAE+vB,EAAEzkD,KAAKykD,EAAEllD,MAAMklD,EAAEjlD,KAAY,KAAKqrlB,GAAG,MAAMl9kB,MAAMvR,EAAE,MAAM,KAAKivlB,GAAG,IAAI5qhB,EAAEhc,EAAEisE,MAA+B,YAATwqR,GAAEzmX,EAAEC,EAApB+vB,EAAEgc,EAAEhc,EAAE0+hB,WAA0B,GAAGyE,EAAGnjiB,GAAc,YAAVypiB,GAAGz5jB,EAAEC,EAAE+vB,GAA6G,GAAnG,OAAOA,GAAG,kBAAkBA,EAAEgc,EAAE,KAAmCA,EAAE,oBAA/BA,EAAEgrhB,IAAIhniB,EAAEgniB,KAAKhniB,EAAE,eAAsCgc,EAAE,KAASA,IAAIA,EAAEA,EAAE1lE,KAAK0pD,IAAI,CAAY,KAAXA,EAAEgc,EAAEvkE,QAAamU,KAAK,CAAC,IAAIg2B,EAAE,GAAG,GAAGA,EAAE/tC,KAAKmsD,EAAE5nD,OAAO4nD,EAAEgc,EAAEvkE,cAAcuoD,EAAEp0C,MAAM69kB,GAAGz5jB,EAAEC,EAAE2R,EAAE,CAAC,MAAM,CAAqC,MAApC5R,EAAE11B,OAAOvH,UAAU+E,SAASxB,KAAK0pD,GAAS92C,MAAMvR,EAAE,GAAG,oBACpfq4B,EAAE,qBAAqB11B,OAAO6C,KAAK6iD,GAAG1hD,KAAK,MAAM,IAAI0xB,GAAI,CAAC,kBAAkBgwB,GAAGgc,EAAE/rC,EAAE0xjB,gBAAiBM,eAAe5E,EAAGptjB,EAAE0xjB,eAAeI,OAAO/hiB,EAAEhwB,EAAEkzjB,cAAclnhB,EAAEimhB,gBAAiB,kBAAkBjiiB,KAAIgc,EAAE/rC,EAAE0xjB,gBAAiBM,eAAe5E,EAAGptjB,EAAE0xjB,eAAeI,OAAO,GAAG/hiB,EAAEhwB,EAAEkzjB,cAAclnhB,EAAEimhB,gBAAgB,CAAC,SAASwH,GAAGz5jB,EAAEC,EAAE+vB,GAAG,IAAI,IAAIgc,EAAEhc,EAAEtsD,OAAOkuC,EAAE,EAAEA,EAAEo6B,EAAEp6B,IAAI,CAAC,IAAIrtC,EAAE07B,EAAE6wjB,YAAY7wjB,EAAE6wjB,YAAY4G,GAAGnzlB,EAAEynE,EAAEp6B,GAAG,IAAI86J,GAAG1sK,EAAEC,EAAE+vB,EAAEpe,GAAG,CAAC,QAAQ3R,EAAE6wjB,YAAYvslB,CAAC,CAAC,CAAC,CACzb,SAASmoM,GAAG1sK,EAAEC,EAAE+vB,GAAG,IAAIgc,EAAE/rC,EAAE0xjB,eAAeK,cAAcpgjB,EAAE3R,EAAE4xjB,cAActtlB,EAAE07B,EAAE96B,QAAQ,IAAI,OAAOshZ,GAAEzmX,EAAEC,EAAE+vB,EAAE,CAAC,MAAMz4B,GAAG,GAAG8gkB,KAAK,kBAAkB9gkB,GAAG,OAAOA,GAAG,oBAAoBA,EAAE1f,KAAyT,MAAMooB,EAAE0xjB,eAAeK,cAChgBhmhB,EAAE/rC,EAAE4xjB,cAAcjgjB,EAAE3R,EAAE96B,QAAQZ,EAAEk1G,GAAEl1G,GAAGgzB,EADiJy4B,EAAEz4B,EAAE,IAAIuf,EAAE7W,EAAE0xjB,eAAe/plB,EAAEsxlB,GAAGl5jB,EAAE8W,EAAEi7iB,OAAOrulB,OAAO,KAAKozC,EAAEk7iB,cAAcl7iB,EAAEm7iB,gBAAe,GAAIn7iB,EAAE/pC,SAASlJ,KAAK+D,GAAGkvC,EAAEm7iB,gBAAe,EAAGjyjB,EAAEg5jB,GAAGh5jB,EAAEC,EAAE15B,KAAK05B,EAAEyxjB,gBAAgB9plB,EAAEq4B,EAAE2xjB,SAAS3xjB,EAAE4xjB,cAAc5xjB,EAAE96B,QAAQ86B,EAAE6wjB,aAAa5hQ,KAAKl/R,EAAEn4C,KAAKmoB,EAAEA,GAAGC,EAAE0xjB,eAAeK,cAAchmhB,EAAE/rC,EAAE4xjB,cAAcjgjB,EAAE3R,EAAE96B,QAAQZ,EAAEk1G,GAAEl1G,EAC1b,CAAC,CAAC,SAASm1lB,GAAG15jB,GAAG,IAAIC,EAAED,EAAE0xjB,iBAAgB1xjB,EAAEA,EAAE2xjB,gBAAiB51iB,OAAO,EAAE49iB,GAAGv3lB,KAAK69B,EAAED,EAAE,CAC1H,SAAS45jB,GAAG55jB,EAAEC,EAAE+vB,GAAG,IAAIgc,EAAEhsC,EAAE0xjB,gBAAgB1xjB,EAAE2xjB,eAAe51iB,OAAO,EAAE,OAAOiwB,GAAG/rC,EAAEoxjB,kBAAkB,IAAIpxjB,EAAE8b,SAAS9b,EAAE8b,OAAO,EAAE,OAAO9b,EAAEoyjB,aAAapyjB,EAAEoyjB,YAAYhjd,WAAWrjE,EAAEulhB,eAAevlhB,EAAE4mhB,oBAAoB5mhB,EAAE4mhB,mBAAkB,EAAG5yjB,OAAE,IAASgwB,EAAE92C,MAAMvR,EAAE,MAAMqoD,EAAEgc,EAAEgnhB,YAAY/yjB,EAAEskF,QAAQvkF,GAAGgsC,EAAE8lhB,eAAe7xjB,EAAEuzjB,yBAAyB3vlB,KAAKmoE,IAAIA,EAAE+mhB,uBAAuBtulB,SAAQ,SAASu7B,GAAG,OAAO45jB,GAAG55jB,EAAEC,EAAE+vB,EAAE,IAAGgc,EAAE+mhB,uBAAuB7ziB,QAAQjf,EAAEoxjB,kBAAkB,IAAIpxjB,EAAEoxjB,kBAAkBrlhB,EAAE/rC,EAAEwzjB,cAAgB,CACxf,SAAS+F,GAAGx5jB,EAAEC,GAAG,GAAG,IAAIA,EAAE8xjB,OAAOrulB,QAAQ,IAAIu8B,EAAElzB,SAASrJ,QAAQ,OAAOu8B,EAAElzB,SAAS,GAAG8vB,SAAS,CAAC,IAAImzB,EAAE/vB,EAAElzB,SAAS,GAAGijD,EAAEvpD,GAAGw5B,EAAEx5B,GAAGupD,EAAE8hiB,eAAc,EAAG,IAAI9hiB,EAAEjU,QAAQy9iB,GAAGx5jB,EAAEgwB,EAAE,MAAMhwB,EAAE6yjB,kBAAkBhvlB,KAAKo8B,EAAE,CACtM,SAAS05jB,GAAG35jB,EAAEC,EAAE+vB,GAAG,GAAG,OAAO/vB,EAAE,CAAC,GAAG+vB,EAAE8hiB,cAAc,CAAC,GAAG,OAAO9xjB,EAAE0zjB,qBAAqB,MAAMx6kB,MAAMvR,EAAE,MAAMq4B,EAAE0zjB,qBAAqB1jiB,CAAC,CAAChwB,EAAEsxjB,mBAAmB,IAAItxjB,EAAEsxjB,mBAAmBtxjB,EAAEmyjB,aAAa9P,IAAEpijB,EAAED,EAAE2zjB,gBAAiB,MAAM1zjB,EAAEsxjB,eAAetxjB,EAAE2yjB,oBAAoB,IAAI3yjB,EAAEsxjB,cAAcvhiB,EAAE8hiB,eAAe,IAAI9hiB,EAAEjU,QAAQy9iB,GAAGv5jB,EAAE+vB,GAAG/vB,EAAE6xjB,eAAe9xjB,EAAE4zjB,oBAAoB/vlB,KAAKo8B,GAAGA,EAAE8yjB,uBAAuBtulB,QAAQi1lB,GAAG15jB,GAAGC,EAAE8yjB,uBAAuB7ziB,SAAS8Q,EAAE8hiB,eAAe,IAAI9hiB,EAAEjU,SAASy9iB,GAAGv5jB,EAAE+vB,GAAG,IAAI/vB,EAAE4yjB,kBAAkBnvlB,QACtfu8B,EAAE6xjB,eAAe9xjB,EAAE6zjB,kBAAkBhwlB,KAAKo8B,KAAKD,EAAEqxjB,kBAAkB,IAAIrxjB,EAAEqxjB,kBAAkBrxjB,EAAEA,EAAEyzjB,aAAe,CAC9G,SAASwF,GAAGj5jB,GAAG,GAAG,IAAIA,EAAE+b,OAAO,CAAC,IAAI9b,EAAEwsiB,GAAEz8gB,EAAE8oiB,GAAG7zlB,QAAQ6zlB,GAAG7zlB,QAAQ2zlB,GAAG,IAAI5shB,EAAE6shB,GAAGA,GAAG74jB,EAAEkzjB,cAAc,IAAI,IAAoB3ulB,EAAhBqtC,EAAE5R,EAAEwxjB,YAAc,IAAIjtlB,EAAE,EAAEA,EAAEqtC,EAAEluC,OAAOa,IAAI,CAAC,IAAIuyC,EAAElF,EAAErtC,GAAOqD,EAAEo4B,EAAEzI,EAAEuf,EAAE66iB,eAAe,GAAG,IAAIp6jB,EAAEwkB,OAAO,CAAC09D,GAAE3iE,EAAE3xC,SAAS,IAAIshZ,GAAE7+Y,EAAEkvC,EAAEA,EAAEvwC,MAAMgxB,EAAE06jB,gBAAgB16jB,EAAE26jB,cAAc36jB,EAAEw6jB,OAAOlulB,KAAKuplB,GAAIt2iB,EAAE86iB,SAASpigB,OAAO14C,GAAGvf,EAAEwkB,OAAO,EAAE49iB,GAAG/xlB,EAAEkvC,EAAE46iB,gBAAgBn6jB,EAAE,CAAC,MAAMypjB,GAAG,GAAGqX,KAAK,kBAAkBrX,GAAG,OAAOA,GAAG,oBAAoBA,EAAEnpkB,KAAK,CAAC,IAAIonE,EAAEnoC,EAAEo4S,KAAK8xP,EAAEnpkB,KAAKonE,EAAEA,EAAE,KAAK,CAACnoC,EAAE86iB,SAASpigB,OAAO14C,GAAGvf,EAAEwkB,OAAO,EAAE,IAAIq3C,EAAEt8C,EAAE46iB,gBACvepujB,EAAE09iB,EAAEh0gB,EAAE05U,GAAE9+Y,EAAE07B,GAA6K,GAA1K,OAAO8vD,EAAE+lgB,GAAGvxlB,EAAE07B,IAAI8vD,EAAEm+f,eAAen+f,EAAEw/f,oBAAoBx/f,EAAEw/f,mBAAkB,EAAGx/f,EAAE4/f,YAAYhmhB,EAAEomB,EAAE0+f,eAAelqlB,EAAE4rlB,yBAAyB3vlB,KAAKuvF,KAAKxrF,EAAEyplB,kBAAqB,IAAIzplB,EAAEyplB,iBAAoC3/iB,EAAb9pC,EAAE6rlB,aAAe,CAAC,CAAU,CAAC,CAAC7hjB,EAAEn+B,OAAO,EAAElP,GAAG,OAAOy7B,EAAEqyjB,aAAawH,GAAG75jB,EAAEA,EAAEqyjB,YAAY,CAAC,MAAMrR,GAAGt6L,GAAE1mX,EAAEghjB,GAAGmY,GAAGn5jB,EAAEghjB,EAAE,CAAC,QAAQ6X,GAAG7shB,EAAE8shB,GAAG7zlB,QAAQ+qD,EAAEA,IAAI4oiB,IAAIn/e,GAAEx5E,EAAE,CAAC,CAAC,CAC7W,SAAS65jB,GAAG95jB,EAAEC,EAAE+vB,GAAsB,OAAnBA,EAAE8hiB,eAAc,EAAU9hiB,EAAEjU,QAAQ,KAAK,EAAE,IAAIiwB,EAAEhc,EAAEvpD,GAAGu5B,EAAE+zjB,gBAAoI,OAApH/jiB,EAAEiiiB,gBAAe,EAAGjiiB,EAAEkiiB,cAAa,EAAGlyjB,EAAEA,EAAEkzjB,cAAc7tkB,EAAE4a,EAAEsujB,IAAIlpkB,EAAE4a,EAAED,EAAEg0jB,mBAAuC3ukB,EAAE4a,EAAtBD,EAAE8sC,EAAEd,EAAElkE,SAAS,MAAmB8vD,EAAE33B,EAAEuujB,IAAI,KAAK,EAAEx+hB,EAAEjU,OAAO,EAAE,IAAInK,GAAE,EAAGo6B,EAAEhc,EAAE+hiB,OAAO,IAAIxtlB,EAAE,EAAEyrD,EAAEA,EAAEjjD,SAAS,IAAI,IAAI+pC,EAAE,EAAEA,EAAEkZ,EAAEtsD,OAAOozC,IAAI,CAAC,IAAIlF,EAAEoe,EAAElZ,GAAGvyC,EAAEqtC,EAAEh/B,MAAMrO,IAAI8gB,EAAE4a,EAAE+rC,EAAEznE,IAAIqtC,EAAEmojB,GAAG/5jB,EAAEC,EAAE2R,EAAE,CAAC,KAAKrtC,EAAEynE,EAAEtoE,OAAO,EAAEa,IAAI8gB,EAAE4a,EAAE+rC,EAAEznE,IAA8B,OAA1BA,EAAEynE,EAAEtoE,SAASkuC,EAAEgmB,EAAE33B,EAAE+rC,EAAEznE,KAAYqtC,EAAE,QAAQ,MAAM14B,MAAMvR,EAAE,MAAO,CACpc,SAASoylB,GAAG/5jB,EAAEC,EAAE+vB,GAAG,IAAIgc,EAAEhc,EAAEnzB,SAAS,GAAG,OAAOmvC,EAAE,OAAO8thB,GAAG95jB,EAAEC,EAAE+vB,GAAsB,GAAnBgc,EAAE8lhB,eAAc,EAAM9lhB,EAAE4mhB,kBAAkB5mhB,EAAEA,EAAEgnhB,YAAYp7hB,EAAE33B,EAAE+8J,IAAI33K,EAAE4a,EAAE+ujB,IAAIhjhB,IAAI3mD,EAAE4a,EAAE6wI,IAAIzrJ,EAAE4a,EAAE6sC,EAAEw5U,EAAEt6U,KAAK3mD,EAAE4a,EAAEkqE,KAAKvyC,EAAE33B,EAAEivjB,IAAI4K,GAAG95jB,EAAEC,EAAE+vB,QAAQ,GAAG,EAAEgc,EAAEulhB,aAAa,CAACvlhB,EAAE2mhB,cAAc3yjB,EAAE+zjB,gBAAgB,EAAE/nhB,EAAE6mhB,kBAAkBnvlB,QAAQs8B,EAAE6zjB,kBAAkBhwlB,KAAKmoE,GAAG,IAAIp6B,EAAE5R,EAAEkzjB,cAAkB3ulB,EAAEqtC,EAAEsijB,iBAAiBtijB,EAAEqS,EAAErS,EAAEuijB,eAAe5vlB,EAAEuD,SAAS,KAAKkkE,EAAEA,EAAEvlE,GAAGmrC,EAAEy9iB,GAAGpvjB,EAAED,EAAEkzjB,cAAclnhB,GAAG8thB,GAAG95jB,EAAEC,EAAE+vB,EAAE,MAAM,GAAGgc,EAAE8mhB,SAAS9yjB,EAAEo0jB,qBAAqBpohB,EAAE2mhB,cAAc3yjB,EAAE+zjB,gBAChf/zjB,EAAE4zjB,oBAAoB/vlB,KAAKmoE,GAAGqjhB,GAAGpvjB,EAAED,EAAEkzjB,cAAclnhB,EAAEvlE,IAAIqzlB,GAAG95jB,EAAEC,EAAE+vB,OAAO,CAA+B,GAA9B4H,EAAE33B,EAAEwujB,IAA6B,KAAzBz+hB,EAAEgc,EAAE6mhB,mBAA2BnvlB,OAAO,MAAMwV,MAAMvR,EAAE,MAAMoylB,GAAG/5jB,EAAEC,EAAE+vB,EAAE,GAAG,CAAC,OAAO4H,EAAE33B,EAAE8ujB,GAAG,CAAC,SAAStolB,GAAGu5B,EAAEC,EAAE+vB,GAAwD,OA7C9O,SAAYhwB,EAAEC,EAAE+vB,EAAEgc,GAAG,OAAOhc,EAAE08hB,eAAe,KAAK,EAAE,KAAK,EAAE,OAAOrnkB,EAAE2a,EAAEsvjB,IAAIjqkB,EAAE2a,EAAEC,EAAEq0jB,eAAejvkB,EAAE2a,EAAE8sC,EAAEd,EAAElkE,SAAS,MAAM8vD,EAAE53B,EAAEk2jB,IAAI,KAAK,EAAE,OAAO7wkB,EAAE2a,EAAEyvjB,IAAIpqkB,EAAE2a,EAAEC,EAAEq0jB,eAAejvkB,EAAE2a,EAAE8sC,EAAEd,EAAElkE,SAAS,MAAM8vD,EAAE53B,EAAEm2jB,IAAI,KAAK,EAAE,OAAO9wkB,EAAE2a,EAAE8yS,IAAIztT,EAAE2a,EAAEC,EAAEq0jB,eAAejvkB,EAAE2a,EAAE8sC,EAAEd,EAAElkE,SAAS,MAAM8vD,EAAE53B,EAAEq1jB,IAAI,KAAK,EAAE,OAAOhwkB,EAAE2a,EAAE4vjB,IAAIvqkB,EAAE2a,EAAEC,EAAEq0jB,eAAejvkB,EAAE2a,EAAE8sC,EAAEd,EAAElkE,SAAS,MAAM8vD,EAAE53B,EAAE8vjB,IAAI,KAAK,EAAE,OAAOzqkB,EAAE2a,EAAEgwjB,IAAI3qkB,EAAE2a,EAAEC,EAAEq0jB,eAAejvkB,EAAE2a,EAAE8sC,EAAEd,EAAElkE,SAAS,MAAM8vD,EAAE53B,EAAEiwjB,IAAI,KAAK,EAAE,OAAO5qkB,EAAE2a,EAAEowjB,IAAI/qkB,EAAE2a,EAAEC,EAAEq0jB,eAAejvkB,EAAE2a,EAAE8sC,EAAEd,EAAElkE,SAAS,MAAM8vD,EAAE53B,EAAEqwjB,IAAI,KAAK,EAAE,OAAOhrkB,EAAE2a,EAChgBixjB,IAAI5rkB,EAAE2a,EAAEC,EAAEq0jB,eAAejvkB,EAAE2a,EAAE8sC,EAAEd,EAAElkE,SAAS,MAAM8vD,EAAE53B,EAAEmxjB,IAAI,QAAQ,MAAMj4kB,MAAMvR,EAAE,MAAO,CA4CoGyplB,CAAGnxjB,EAAED,EAAEkzjB,cAAcljiB,EAAEgiiB,cAAchiiB,EAAEvpD,IAAIszlB,GAAG/5jB,EAAEC,EAAE+vB,GA5CrJ,SAAYhwB,EAAEC,GAAG,OAAOA,EAAEysjB,eAAe,KAAK,EAAE,KAAK,EAAE,OAAO90hB,EAAE53B,EAAEwvjB,IAAI,KAAK,EAAE,OAAO53hB,EAAE53B,EAAE0vjB,IAAI,KAAK,EAAE,OAAO93hB,EAAE53B,EAAE2vjB,IAAI,KAAK,EAAE,OAAO/3hB,EAAE53B,EAAE+vjB,IAAI,KAAK,EAAE,OAAOn4hB,EAAE53B,EAAEmwjB,IAAI,KAAK,EAAE,OAAOv4hB,EAAE53B,EAAEswjB,IAAI,KAAK,EAAE,OAAO14hB,EAAE53B,EAAE21jB,IAAI,QAAQ,MAAMz8kB,MAAMvR,EAAE,MAAO,CA4CxE8plB,CAAGxxjB,EAAE+vB,EAAEgiiB,cAAc,CAC1Q,SAASgI,GAAGh6jB,EAAEC,EAAE+vB,GAAG,IAAI,IAAIgc,EAAEhc,EAAE6iiB,kBAAkBjhjB,EAAE,EAAEA,EAAEo6B,EAAEtoE,OAAOkuC,IAAIqojB,GAAGj6jB,EAAEC,EAAE+vB,EAAEgc,EAAEp6B,IAAsK,GAAlKo6B,EAAEtoE,OAAO,EAAEs8B,EAAEA,EAAEkzjB,cAAclnhB,EAAEhc,EAAEvpD,GAAGupD,EAAEA,EAAE2iiB,cAActtkB,EAAE4a,EAAED,EAAE20jB,mBAAmB30jB,EAAE40jB,6BAA6BvvkB,EAAE4a,EAAEozjB,KAAKrzjB,EAAE40jB,8BAA6B,EAAGvvkB,EAAE4a,EAAEmzjB,KAAQ,OAAOpnhB,EAAE,MAAM9yD,MAAMvR,EAAE,MAAqE,OAA/DqoD,EAAE8c,EAAE9c,EAAEloD,SAAS,KAAKud,EAAE4a,EAAE+rC,GAAG3mD,EAAE4a,EAAEqzjB,IAAIjukB,EAAE4a,EAAED,EAAEs0jB,eAAejvkB,EAAE4a,EAAE+vB,GAAU4H,EAAE33B,EAAEszjB,GAAG,CAClW,SAAS0G,GAAGj6jB,EAAEC,EAAE+vB,EAAEgc,GAAG,GAAG,IAAIA,EAAEjwB,OAAO,OAAM,EAAG,IAAInK,EAAEo6B,EAAEvlE,GAAG,IAAI,IAAImrC,EAAE,CAAC,IAAI,KAAKo6B,EAAEvlE,GAAGupD,EAAE2iiB,eAAe,MAAMz5kB,MAAMvR,EAAE,MAAM,OAAOlB,GAAGu5B,EAAEC,EAAE+rC,EAAE,CAA+N,OAA9NvlE,GAAGu5B,EAAEC,EAAE+rC,GAAqB3mD,EAAE4a,GAApBD,EAAEA,EAAEkzjB,eAAoByB,mBAAmB30jB,EAAE60jB,4BAA4BxvkB,EAAE4a,EAAEuyjB,KAAKxyjB,EAAE60jB,6BAA4B,EAAGxvkB,EAAE4a,EAAEsyjB,KAAKltkB,EAAE4a,EAAED,EAAEs0jB,eAAmCjvkB,EAAE4a,EAAtB2R,EAAEk7B,EAAEl7B,EAAE9pC,SAAS,MAAYud,EAAE4a,EAAEyyjB,IAAIrtkB,EAAE4a,EAAED,EAAEg0jB,mBAAmB3ukB,EAAE4a,EAAE2R,GAAUgmB,EAAE33B,EAAEgzjB,GAAG,CACpX,SAAS4G,GAAG75jB,EAAEC,GAAGwW,EAAE,IAAIS,WAAW,KAAKh8B,EAAE,EAAE,IAAI,IAAI80C,EAAEhwB,EAAE0zjB,qBAAqB,GAAG,OAAO1jiB,GAAG,IAAIhwB,EAAEsxjB,iBAAiB,CAACyI,GAAG/5jB,EAAEC,EAAE+vB,GAAGhwB,EAAE0zjB,qBAAqB,KAAK,IAAI1nhB,EAAEhsC,EAAEkzjB,cAAc4B,gBAAgB,IAAI9kiB,EAAE,EAAEA,EAAEgc,EAAEtoE,OAAO,EAAEssD,IAAI3qC,EAAE4a,EAAE+rC,EAAEhc,IAAIA,EAAEgc,EAAEtoE,QAAQk0D,EAAE33B,EAAE+rC,EAAEhc,GAAG,CAAC,IAAiCzrD,EAA7BqtC,EAAE5R,EAAEwzjB,yBAA2B,IAAIjvlB,EAAE,EAAEA,EAAEqtC,EAAEluC,OAAOa,IAAI,CAAC,IAAIuyC,EAAElF,EAAErtC,GAAGynE,EAAE/rC,EAAE,IAAIr4B,EAAEo4B,EAAEkzjB,cAAc37jB,EAAEuf,EAAErwC,GAAGw4E,EAAEnoC,EAAEk8iB,YAAY5/f,EAAEt8C,EAAEi+iB,aAAazxjB,EAAEwT,EAAEk+iB,oBAC7X,GADiZ3vkB,EAAE2mD,EAAEpkE,EAAE+slB,mBAAmB/slB,EAAEqtlB,yBAAyB5vkB,EAAE2mD,EAAEiohB,KAAKrslB,EAAEqtlB,0BAAyB,EAAG5vkB,EAAE2mD,EACnf8nhB,KAAQ,OAAOv8jB,EAAE,MAAMre,MAAMvR,EAAE,MAAuH,GAAjH0d,EAAE2mD,EAAEz0C,GAAGlS,EAAE2mD,EAAEqohB,KAAOp1gB,GAAGmU,GAAG9vD,KAAEje,EAAE2mD,EAAE0ohB,IAAIrvkB,EAAE2mD,EAAEc,EAAE2ohB,GAAGx2gB,GAAG,QAASmU,GAAG9vD,KAAEje,EAAE2mD,EAAE0ohB,IAAIrvkB,EAAE2mD,EAAEc,EAAE2ohB,GAAGrigB,GAAG,OAAM9vD,IAAIje,EAAE2mD,EAAE0ohB,IAAIrvkB,EAAE2mD,EAAEc,EAAE2ohB,GAAGnyjB,OAAUs0B,EAAEoU,EAAEyohB,IAA0C,OAArCz0jB,EAAEqyjB,YAAY,KAAK9tlB,SAAIqtC,EAAEn+B,OAAO,EAAElP,EAAU,CAACqtC,EAAEn+B,OAAO,EAAElP,GAAG,IAAIyoE,EAAEhtC,EAAE4zjB,oBAAoB,IAAIrvlB,EAAE,EAAEA,EAAEyoE,EAAEtpE,OAAOa,IAAI,IAAIy1lB,GAAGh6jB,EAAEC,EAAE+sC,EAAEzoE,IAA0C,OAArCy7B,EAAEqyjB,YAAY,KAAK9tlB,SAAIyoE,EAAEv5D,OAAO,EAAElP,GAAUyoE,EAAEv5D,OAAO,EAAElP,GAAG2wlB,EAAGj1jB,GAAGwW,EAAE,IAAIS,WAAW,KAAKh8B,EAAE,EAAE,IAAIw2B,EAAE1R,EAAE6zjB,kBAAkB,IAAItvlB,EAAE,EAAEA,EAAEmtC,EAAEhuC,OAAOa,IAAI,CAAC,IAAIy8kB,EAAEtviB,EAAEntC,GAAGy7B,EAAE,CAAC4R,EAAE5R,EAAE8W,EAAE7W,EAAE,IAAIosjB,EAAGrL,EAAE6R,kBAAkB,IAAIjrlB,EAAE,EAAEA,EAAEyklB,EAAG3olB,OAAOkE,IAAI,IAAIqylB,GAAGrojB,EAC/fkF,EAAEkqiB,EAAEqL,EAAGzklB,IAAI,CAACA,IAAIyklB,EAAG54kB,OAAO,EAAE7L,GAAG,IAAI6qlB,GAAG,EAAG,MAAMzyjB,CAAC,CAACqsjB,EAAG54kB,OAAO,EAAE7L,GAAG6qlB,GAAG,CAAE,CAAC,IAAIA,EAAyC,OAArCzyjB,EAAEqyjB,YAAY,KAAK9tlB,SAAImtC,EAAEj+B,OAAO,EAAElP,EAAU,CAACmtC,EAAEj+B,OAAO,EAAElP,GAAG,IAAI+nlB,EAAGtsjB,EAAE4zjB,oBAAoB,IAAIrvlB,EAAE,EAAEA,EAAE+nlB,EAAG5olB,OAAOa,IAAI,IAAIy1lB,GAAGh6jB,EAAEC,EAAEqsjB,EAAG/nlB,IAA2C,OAAtCy7B,EAAEqyjB,YAAY,KAAK9tlB,SAAI+nlB,EAAG74kB,OAAO,EAAElP,GAAU+nlB,EAAG74kB,OAAO,EAAElP,EAAE,CAAC,QAAQ2wlB,EAAGj1jB,GAAG,IAAID,EAAEqxjB,iBAAiB,IAAIrxjB,EAAEwxjB,YAAY9tlB,QAAQ,IAAIs8B,EAAEwzjB,yBAAyB9vlB,QAAQ,IAAIs8B,EAAE4zjB,oBAAoBlwlB,QAAQu8B,EAAEovG,OAAO,CAAC,CAC/Z,SAAS6qd,GAAGl6jB,EAAEC,GAAG,IAAI,IAAI+vB,EAAEhwB,EAAEw1jB,eAAexliB,EAAEvrD,SAAQ,SAASurD,GAAG,OAAO4piB,GAAG5piB,EAAEhwB,EAAEC,EAAE,IAAG+vB,EAAE9Q,QAAQ,OAAOlf,EAAEqyjB,aAAawH,GAAG75jB,EAAEA,EAAEqyjB,YAAY,CAAC,MAAMrmhB,GAAG06U,GAAE1mX,EAAEgsC,GAAGmthB,GAAGn5jB,EAAEgsC,EAAE,CAAC,CACjK/W,EAAQkliB,uBAAuB,SAASn6jB,EAAEC,GAAG,OAAO,IAAI7H,SAAQ,SAAS43B,EAAEgc,GAAG,IAAIp6B,EAAErtC,EAAEuyC,EAAE,IAAI1e,SAAQ,SAAS4H,EAAEC,GAAG17B,EAAEy7B,EAAE4R,EAAE3R,CAAC,IAAGr4B,EA9B5H,SAAYo4B,EAAEC,EAAE+vB,EAAEgc,EAAEp6B,EAAErtC,EAAEuyC,EAAElvC,EAAE2vB,GAAG,IAAI0nD,EAAE,GAAGmU,EAAE,IAAI9gF,IACH,OADya09C,EAAEkpiB,GAApaj5jB,EAAE,CAACoyjB,YAAY,KAAKa,cAAcjzjB,EAAEm0jB,0BAAqB,IAASpohB,EAAE,MAAMA,EAAEjwB,OAAO,EAAEu2iB,WAAW,KAAKyB,cAAc,EAAE1C,gBAAgB,EAAEC,iBAAiB,EAAEoC,qBAAqB,KAAK8B,eAAepigB,EAAEo+f,YAAYvygB,EAAEu0gB,yBAAyB,GAAGI,oBAAoB,GAAGC,kBAAkB,GAAGtve,aAAQ,IAAS3yE,EAAEmnjB,GAAGnnjB,EAAE6hjB,gBAAW,IAASlvlB,EAAE89kB,GAAE99kB,EAAEovlB,kBAAa,IAAS78iB,EAAEuriB,GAAEvriB,EAAEq7iB,kBAAa,IAASvqlB,EAAEy6kB,GAAEz6kB,EAAEwqlB,kBAAa,IAAS76jB,EAAE8qjB,GAAE9qjB,GAAU,EAAE,KAAKy4B,GAAE,GAAG,IAAM8hiB,eAC7e,EAAG9xjB,EAAEg5jB,GAAG/4jB,EAAED,EAAE,KAAKgwB,EAAEojC,EAAE8jgB,GAAG,KAAKO,IAAIx4gB,EAAEp7E,KAAKm8B,GAAUC,CAAC,CA6B2Em6jB,CAAGp6jB,EAvEjI,SAAYA,EAAEC,EAAE+vB,EAAEgc,EAAEp6B,GAAG5R,OAAE,IAASA,EAAE,GAAGA,EAAEC,OAAE,IAASA,EAAE2sjB,EAAG3oiB,EAAE,kBAAkBqiW,EAAErmX,GAAG,MAAM,IAAI17B,EAAE,GAAqD,QAAlD,IAASyrD,GAAGzrD,EAAEV,KAAKo8B,EAAE6sC,GAAG,GAAG9c,GAAGznD,QAAQ0klB,EAAGC,IAAKL,QAAO,IAAS7ghB,EAAE,IAAIhc,EAAE,EAAEA,EAAEgc,EAAEtoE,OAAOssD,IAAIzrD,EAAEV,KAAKk7E,EAAGjS,EAAEw5U,EAAEt6U,EAAEhc,KAAKg9hB,GAAI,QAAG,IAASp7iB,EAAE,IAAIo6B,EAAE,EAAEA,EAAEp6B,EAAEluC,OAAOsoE,IAAIznE,EAAEV,KAAKkplB,EAAGjghB,EAAEw5U,EAAE10W,EAAEo6B,KAAKghhB,GAAI,MAAM,CAAC8H,gBAAgBvwlB,EAAEowlB,kBAAkB10jB,EAAE+zjB,kBAAkB/viB,EAAEjkB,EAAE,MAAMs0jB,cAAcrwiB,EAAEjkB,EAAE,MAAMm0jB,eAAen0jB,EAAE,KAAKw6f,SAASx6f,EAAEk0jB,eAAe,EAAEW,6BAA4B,EAAGD,8BAA6B,EAAGK,0BAAyB,EAAG,CAuE1X9H,CAAGltjB,EAAEA,EAAE41jB,sBAAiB,EAAO51jB,EAAEA,EAAEv9B,WAAM,EAAOu9B,EAAEA,EAAEo6jB,4BAAuB,EAAOp6jB,EAAEA,EAAEq6jB,sBAAiB,EAAOr6jB,EAAEA,EAAEs6jB,sBAAiB,GAtE9M,SAAYv6jB,GAAG,OAAOwmX,EAAE,+BAA+BxmX,EAAE,EAAE,uCAAuCA,EAAE,EAAE,EAAE,KAAK,CAsEyGu0jB,CAAGt0jB,EAAEA,EAAEu6jB,kBAAa,GAAQv6jB,EAAEA,EAAEm0jB,0BAAqB,EAAOn0jB,EAAEA,EAAEskF,aAAQ,EAAOhgH,GAAE,WAAW,IAAIy7B,EAAE,IAAIy6jB,eAAe,CAAClvlB,KAAK,QAAQmvlB,KAAK,SAAS16jB,GAAG,GAAG,IAAIp4B,EAAEm0C,OAAOn0C,EAAEm0C,OAAO,EAAEq5iB,EAAGp1jB,EAAEp4B,EAAE0qlB,iBAAiB,GAAG,IAAI1qlB,EAAEm0C,QAAQ,OAAOn0C,EAAEyqlB,YAAY,CAACzqlB,EAAEyqlB,YAC9fryjB,EAAE,IAAI65jB,GAAGjylB,EAAEo4B,EAAE,CAAC,MAAMgtC,GAAG05U,GAAE9+Y,EAAEolE,GAAGmshB,GAAGvxlB,EAAEolE,EAAE,CAAC,CAAC,EAAE5hB,OAAO,WAAW8uiB,GAAGtylB,EAAE,GAAG,CAAC+ylB,cAAc,IAAI36jB,EAAE46jB,SAAS9jjB,EAAEkZ,EAAEhwB,EAAE,IAAE,SAASA,GAAG8W,EAAEsE,OAAM,WAAW,IAAG4wB,EAAEhsC,EAAE,GAAE4R,GAAG,GAAG3R,GAAGA,EAAEkpB,OAAO,CAAC,IAAI5xB,EAAE0I,EAAEkpB,OAAO81B,EAAE,WAAWi7gB,GAAGtylB,EAAE2vB,EAAE00B,QAAQ10B,EAAEsB,oBAAoB,QAAQomD,EAAE,EAAE1nD,EAAEqB,iBAAiB,QAAQqmD,EAAE,CAACg6gB,GAAGrxlB,EAAE,GAAE,EAAEqtD,EAAQllC,QAAQ,6CC7FxS,IAAI0mB,EAAG9E,EAEL8E,EAAI,EAAQ,OACZ9E,EAAI,EAAQ,OAMdsjB,EAAQllC,QAAU0mB,EAAE1mB,QACpBklC,EAAQ+giB,eAAiBv/iB,EAAEu/iB,eAC3B/giB,EAAQs1f,qBAAuB9zgB,EAAE8zgB,qBACjCt1f,EAAQ6giB,mBAAqBr/iB,EAAEq/iB,mBAC/B7giB,EAAQ8giB,yBAA2Bt/iB,EAAEs/iB,yBACrC9giB,EAAQkliB,uBAAyBxojB,EAAEwojB,wIChBxBU,EAAoB,IAAIvhlB,IAAI,CACnC,CAAC,MAAO,aACR,CAAC,MAAO,aACR,CAAC,MAAO,gBACR,CAAC,OAAQ,cACT,CAAC,MAAO,cACR,CAAC,MAAO,oBACR,CAAC,MAAO,mBACR,CAAC,MAAO,aACR,CAAC,MAAO,mBACR,CAAC,MAAO,aACR,CAAC,MAAO,mBACR,CAAC,MAAO,sBACR,CAAC,OAAQ,6EAEN,SAASwhlB,EAAe7yhB,EAAMzrB,GACjC,IAAI5K,EAmBR,SAAsBq2B,GAClB,IAAIlhE,EAAOkhE,EAAKlhE,KAEhB,GADmBA,IAAmC,IAA3BA,EAAKq3D,YAAY,OACvB6J,EAAK18D,KAAM,CAC5B,IAAI62T,EAAMr7T,EAAKnB,MAAM,KAChBg4C,MAAMp1C,cACP+C,EAAOsvlB,EAAkB51kB,IAAIm9S,GAC7B72T,GACAjB,OAAOyD,eAAek6D,EAAM,OAAQ,CAChC7/D,MAAOmD,EACPyQ,UAAU,EACVD,cAAc,EACdtO,YAAY,GAGxB,CACA,OAAOw6D,CACX,CApCY8yhB,CAAa9yhB,GACrB,GAAsB,kBAAXr2B,EAAE4K,KAAmB,CAC5B,IAAIw+iB,EAAqB/yhB,EAAK+yhB,mBAC9B1wlB,OAAOyD,eAAe6jC,EAAG,OAAQ,CAC7BxpC,MAAuB,kBAATo0C,EACRA,EAI8B,kBAAvBw+iB,GAAmCA,EAAmBt3lB,OAAS,EAClEs3lB,EACA/yhB,EAAKlhE,KACfiV,UAAU,EACVD,cAAc,EACdtO,YAAY,GAEpB,CACA,OAAOmkC,CACX,CChCA,IAAIqpjB,EAAkB,CAElB,YACA,aAoBJ,SAASC,EAAcC,GAMnB,OAGiB,OARGA,EAAIxtlB,QAClBwtlB,EAAIxtlB,OAAOitE,MACPwghB,EAASD,EAAIxtlB,OAAOitE,OAExB,IACOvrE,KAAI,SAAU44D,GAAQ,OAAO6yhB,EAAe7yhB,EAAO,GACpE,CAIA,SAASozhB,EAAqBhpgB,EAAI9mF,GAC9B,OAAO,QAAUnJ,UAAM,OAAQ,GAAQ,WACnC,IAAI6uF,EACJ,OAAO,QAAY7uF,MAAM,SAAUkmE,GAC/B,OAAQA,EAAGj3B,OACP,KAAK,EACD,OAAKghD,EAAGpB,OACRA,EAAQmqgB,EAAS/ogB,EAAGpB,OACf3jF,QAAO,SAAUuiB,GAAQ,MAAqB,SAAdA,EAAKuoB,IAAiB,IAG9C,SAAT7sC,EACO,CAAC,EAAc0lF,GAEnB,CAAC,EAAa74D,QAAQ+b,IAAI88C,EAAM5hF,IAAIislB,MARrB,CAAC,EAAa,GASxC,KAAK,EAED,MAAO,CAAC,EAAcC,EAAe5ve,EAD7BrjD,EAAGiD,UAEf,KAAK,EAAG,MAAO,CAAC,EAAcgwhB,EAAeH,EAAS/ogB,EAAGzX,OAChDvrE,KAAI,SAAU44D,GAAQ,OAAO6yhB,EAAe7yhB,EAAO,MAEpE,GACJ,GACJ,CACA,SAASszhB,EAAe3ghB,GACpB,OAAOA,EAAMttE,QAAO,SAAU26D,GAAQ,OAA+C,IAAxCgzhB,EAAgB3klB,QAAQ2xD,EAAKlhE,KAAc,GAC5F,CAKA,SAASq0lB,EAASnqgB,GAGd,IAFA,IAAIrW,EAAQ,GAEH72E,EAAI,EAAGA,EAAIktF,EAAMvtF,OAAQK,IAAK,CACnC,IAAIkkE,EAAOgpB,EAAMltF,GACjB62E,EAAM/2E,KAAKokE,EACf,CACA,OAAO2S,CACX,CAEA,SAAS0ghB,EAAezrkB,GACpB,GAAqC,oBAA1BA,EAAK2rkB,iBACZ,OAAOC,EAAqB5rkB,GAEhC,IAAIie,EAAQje,EAAK2rkB,mBAIjB,OAAI1tjB,GAASA,EAAM4tjB,YACRC,EAAa7tjB,GAEjB2tjB,EAAqB5rkB,EAChC,CACA,SAAS87F,EAAQ16B,GACb,OAAOA,EAAMxiF,QAAO,SAAU+Z,EAAKoyD,GAAS,OAAO,QAASpyD,EAAMniB,MAAMiD,QAAQsxE,GAAS+wC,EAAQ/wC,GAAS,CAACA,GAAU,GAAG,GAC5H,CACA,SAAS6ghB,EAAqB5rkB,GAC1B,IAAIo4C,EAAOp4C,EAAK+rkB,YAChB,IAAK3zhB,EACD,OAAO7vC,QAAQywB,OAAOh5B,EAAO,kBAEjC,IAAIgskB,EAAMf,EAAe7yhB,GACzB,OAAO7vC,QAAQC,QAAQwjkB,EAC3B,CAEA,SAASC,EAAUhujB,GACf,OAAO,QAAU1rC,UAAM,OAAQ,GAAQ,WACnC,OAAO,QAAYA,MAAM,SAAUkmE,GAC/B,MAAO,CAAC,EAAcx6B,EAAM4tjB,YAAcC,EAAa7tjB,GAASiujB,EAAcjujB,GAClF,GACJ,GACJ,CAEA,SAAS6tjB,EAAa7tjB,GAClB,IAAIkujB,EAASlujB,EAAMmujB,eACnB,OAAO,IAAI7jkB,SAAQ,SAAUC,EAASwwB,GAClC,IAAIj6B,EAAU,IACd,SAASstkB,IACL,IAAI7jlB,EAAQjW,KAGZ45lB,EAAOE,aAAY,SAAUpje,GAAS,OAAO,QAAUzgH,OAAO,OAAQ,GAAQ,WAC1E,IAAIuiE,EAAOuhhB,EAAOlrgB,EAClB,OAAO,QAAY7uF,MAAM,SAAUkmE,GAC/B,OAAQA,EAAGj3B,OACP,KAAK,EACD,GAAMynF,EAAMp1H,OAAQ,MAAO,CAAC,EAAa,GACzC4kE,EAAGj3B,MAAQ,EACf,KAAK,EAED,OADAi3B,EAAGkD,KAAK3nE,KAAK,CAAC,EAAG,EAAG,CAAE,IACf,CAAC,EAAau0B,QAAQ+b,IAAIvlB,IACrC,KAAK,EAGD,OAFAgsD,EAAQtS,EAAGiD,OACXlzC,EAAQuiD,GACD,CAAC,EAAa,GACzB,KAAK,EAGD,OAFAuhhB,EAAQ7zhB,EAAGiD,OACX1iB,EAAOsziB,GACA,CAAC,EAAa,GACzB,KAAK,EAAG,MAAO,CAAC,EAAa,GAC7B,KAAK,EACDlrgB,EAAQ74D,QAAQ+b,IAAI2kF,EAAMzpH,IAAIyslB,IAC9BltkB,EAAQ/qB,KAAKotF,GAEbirgB,IACA5zhB,EAAGj3B,MAAQ,EACf,KAAK,EAAG,MAAO,CAAC,GAExB,GACJ,GAAI,IAAG,SAAUx1B,GACbgtC,EAAOhtC,EACX,GACJ,CACAqglB,EACJ,GACJ,CAEA,SAASH,EAAcjujB,GACnB,OAAO,QAAU1rC,UAAM,OAAQ,GAAQ,WACnC,OAAO,QAAYA,MAAM,SAAUkmE,GAC/B,MAAO,CAAC,EAAc,IAAIlwC,SAAQ,SAAUC,EAASwwB,GAC7C/a,EAAMm6B,MAAK,SAAUA,GACjB,IAAI4zhB,EAAMf,EAAe7yhB,EAAMn6B,EAAM2b,UACrCpxB,EAAQwjkB,EACZ,IAAG,SAAUhglB,GACTgtC,EAAOhtC,EACX,GACJ,IACR,GACJ,GACJ,eCrKA,SAAS0mE,EAAen0E,EAAKrK,GAAK,OAUlC,SAAyBqK,GAAO,GAAI/H,MAAMiD,QAAQ8E,GAAM,OAAOA,CAAK,CAV3Bo0E,CAAgBp0E,IAQzD,SAA+BA,EAAKrK,GAAK,GAAsB,qBAAXsX,UAA4BA,OAAOC,YAAYhR,OAAO8D,IAAO,OAAQ,IAAImN,EAAO,GAAQC,GAAK,EAAUC,GAAK,EAAWC,OAAKpZ,EAAW,IAAM,IAAK,IAAiCqZ,EAA7BlS,EAAK2E,EAAIiN,OAAOC,cAAmBE,GAAMG,EAAKlS,EAAGhC,QAAQmU,QAAoBL,EAAK1X,KAAK8X,EAAGvT,QAAYrE,GAAKwX,EAAK7X,SAAWK,GAA3DyX,GAAK,GAAkE,CAAE,MAAOK,GAAOJ,GAAK,EAAMC,EAAKG,CAAK,CAAE,QAAU,IAAWL,GAAsB,MAAhB/R,EAAW,QAAWA,EAAW,QAAK,CAAE,QAAU,GAAIgS,EAAI,MAAMC,CAAI,CAAE,CAAE,OAAOH,CAAM,CARvaknE,CAAsBr0E,EAAKrK,IAI5F,SAAqCiX,EAAGC,GAAU,IAAKD,EAAG,OAAQ,GAAiB,kBAANA,EAAgB,OAAOH,EAAkBG,EAAGC,GAAS,IAAIC,EAAI5Q,OAAOvH,UAAU+E,SAASxB,KAAK0U,GAAG3H,MAAM,GAAI,GAAc,WAAN6H,GAAkBF,EAAE1D,cAAa4D,EAAIF,EAAE1D,YAAYvQ,MAAM,GAAU,QAANmU,GAAqB,QAANA,EAAa,OAAO7U,MAAM8U,KAAKH,GAAI,GAAU,cAANE,GAAqB,2CAA2CE,KAAKF,GAAI,OAAOL,EAAkBG,EAAGC,EAAS,CAJ7TF,CAA4B3M,EAAKrK,IAEnI,WAA8B,MAAM,IAAI+X,UAAU,4IAA8I,CAFvD4mE,EAAoB,CAM7J,SAAS7nE,EAAkBzM,EAAKvG,IAAkB,MAAPA,GAAeA,EAAMuG,EAAI1K,UAAQmE,EAAMuG,EAAI1K,QAAQ,IAAK,IAAIK,EAAI,EAAG+W,EAAO,IAAIzU,MAAMwB,GAAM9D,EAAI8D,EAAK9D,IAAO+W,EAAK/W,GAAKqK,EAAIrK,GAAM,OAAO+W,CAAM,CAQ/K,IAKIshlB,EAA6B,SAAoCC,GAC1EA,EAASh2lB,MAAMiD,QAAQ+ylB,IAA6B,IAAlBA,EAAO34lB,OAAe24lB,EAAO,GAAKA,EACpE,IAAIC,EAAgBj2lB,MAAMiD,QAAQ+ylB,GAAU,UAAU9tlB,OAAO8tlB,EAAO/tlB,KAAK,OAAS+tlB,EAClF,MAAO,CACL5mlB,KAT2B,oBAU3B6lC,QAAS,qBAAqB/sC,OAAO+tlB,GAEzC,EACWC,EAA0B,SAAiCx/c,GACpE,MAAO,CACLtnI,KAdwB,iBAexB6lC,QAAS,uBAAuB/sC,OAAOwuI,EAAS,UAEpD,EACWy/c,EAA0B,SAAiCC,GACpE,MAAO,CACLhnlB,KAnBwB,iBAoBxB6lC,QAAS,wBAAwB/sC,OAAOkulB,EAAS,UAErD,EACWC,EAA2B,CACpCjnlB,KAvB0B,iBAwB1B6lC,QAAS,kBAIJ,SAASqhjB,EAAa10hB,EAAMo0hB,GACjC,IAAIO,EAA6B,2BAAd30hB,EAAK18D,OAAqC,OAAQ08D,EAAMo0hB,GAC3E,MAAO,CAACO,EAAcA,EAAe,KAAOR,EAA2BC,GACzE,CACO,SAASQ,EAAc50hB,EAAMw0hB,EAAS1/c,GAC3C,GAAI+/c,EAAU70hB,EAAKrtB,MACjB,GAAIkijB,EAAUL,IAAYK,EAAU//c,GAAU,CAC5C,GAAI90E,EAAKrtB,KAAOmiG,EAAS,MAAO,EAAC,EAAOw/c,EAAwBx/c,IAChE,GAAI90E,EAAKrtB,KAAO6hjB,EAAS,MAAO,EAAC,EAAOD,EAAwBC,GAClE,KAAO,IAAIK,EAAUL,IAAYx0hB,EAAKrtB,KAAO6hjB,EAAS,MAAO,EAAC,EAAOD,EAAwBC,IAAe,GAAIK,EAAU//c,IAAY90E,EAAKrtB,KAAOmiG,EAAS,MAAO,EAAC,EAAOw/c,EAAwBx/c,GAAS,CAG7M,MAAO,EAAC,EAAM,KAChB,CAEA,SAAS+/c,EAAU10lB,GACjB,YAAiB9F,IAAV8F,GAAiC,OAAVA,CAChC,CA6BO,SAAS20lB,EAAqBr0jB,GACnC,MAA0C,oBAA/BA,EAAMq0jB,qBACRr0jB,EAAMq0jB,uBAC0B,qBAAvBr0jB,EAAMs0jB,cACft0jB,EAAMs0jB,YAIjB,CACO,SAASC,EAAev0jB,GAC7B,OAAKA,EAAMula,aAMJ5nc,MAAMtD,UAAU8yB,KAAKvvB,KAAKoiC,EAAMula,aAAaivJ,OAAO,SAAU3xlB,GACnE,MAAgB,UAATA,GAA6B,2BAATA,CAC7B,MAPWm9B,EAAM/6B,UAAY+6B,EAAM/6B,OAAOitE,KAQ5C,CAKO,SAASuihB,EAAmBz0jB,GACjCA,EAAM4G,gBACR,CAyBO,SAAS8tjB,IACd,IAAK,IAAIvxlB,EAAOC,UAAUpI,OAAQyhD,EAAM,IAAI9+C,MAAMwF,GAAOtC,EAAO,EAAGA,EAAOsC,EAAMtC,IAC9E47C,EAAI57C,GAAQuC,UAAUvC,GAGxB,OAAO,SAAUm/B,GACf,IAAK,IAAI97B,EAAQd,UAAUpI,OAAQqG,EAAO,IAAI1D,MAAMuG,EAAQ,EAAIA,EAAQ,EAAI,GAAIC,EAAQ,EAAGA,EAAQD,EAAOC,IACxG9C,EAAK8C,EAAQ,GAAKf,UAAUe,GAG9B,OAAOs4C,EAAItvB,MAAK,SAAU9O,GAKxB,OAJKg2kB,EAAqBr0jB,IAAU3hB,GAClCA,EAAG/a,WAAM,EAAQ,CAAC08B,GAAOn6B,OAAOxE,IAG3BgzlB,EAAqBr0jB,EAC9B,GACF,CACF,CClKA,SAAS5kB,EAAmB1V,GAAO,OAMnC,SAA4BA,GAAO,GAAI/H,MAAMiD,QAAQ8E,GAAM,OAAO,EAAkBA,EAAM,CANhDg5kB,CAAmBh5kB,IAI7D,SAA0B2V,GAAQ,GAAsB,qBAAX1I,QAA0BA,OAAOC,YAAYhR,OAAOyZ,GAAO,OAAO1d,MAAM8U,KAAK4I,EAAO,CAJ5DsjkB,CAAiBj5kB,IAAQ,EAA4BA,IAE1H,WAAgC,MAAM,IAAI0N,UAAU,uIAAyI,CAF3DwrkB,EAAsB,CAQxJ,SAAS,EAAel5kB,EAAKrK,GAAK,OAUlC,SAAyBqK,GAAO,GAAI/H,MAAMiD,QAAQ8E,GAAM,OAAOA,CAAK,CAV3B,CAAgBA,IAQzD,SAA+BA,EAAKrK,GAAK,GAAsB,qBAAXsX,UAA4BA,OAAOC,YAAYhR,OAAO8D,IAAO,OAAQ,IAAImN,EAAO,GAAQC,GAAK,EAAUC,GAAK,EAAWC,OAAKpZ,EAAW,IAAM,IAAK,IAAiCqZ,EAA7BlS,EAAK2E,EAAIiN,OAAOC,cAAmBE,GAAMG,EAAKlS,EAAGhC,QAAQmU,QAAoBL,EAAK1X,KAAK8X,EAAGvT,QAAYrE,GAAKwX,EAAK7X,SAAWK,GAA3DyX,GAAK,GAAkE,CAAE,MAAOK,GAAOJ,GAAK,EAAMC,EAAKG,CAAK,CAAE,QAAU,IAAWL,GAAsB,MAAhB/R,EAAW,QAAWA,EAAW,QAAK,CAAE,QAAU,GAAIgS,EAAI,MAAMC,CAAI,CAAE,CAAE,OAAOH,CAAM,CARva,CAAsBnN,EAAKrK,IAAM,EAA4BqK,EAAKrK,IAEnI,WAA8B,MAAM,IAAI+X,UAAU,4IAA8I,CAFvD,EAAoB,CAI7J,SAAS,EAA4Bd,EAAGC,GAAU,GAAKD,EAAL,CAAgB,GAAiB,kBAANA,EAAgB,OAAO,EAAkBA,EAAGC,GAAS,IAAIC,EAAI5Q,OAAOvH,UAAU+E,SAASxB,KAAK0U,GAAG3H,MAAM,GAAI,GAAiE,MAAnD,WAAN6H,GAAkBF,EAAE1D,cAAa4D,EAAIF,EAAE1D,YAAYvQ,MAAgB,QAANmU,GAAqB,QAANA,EAAoB7U,MAAM8U,KAAKH,GAAc,cAANE,GAAqB,2CAA2CE,KAAKF,GAAW,EAAkBF,EAAGC,QAAzG,CAA7O,CAA+V,CAE/Z,SAAS,EAAkB7M,EAAKvG,IAAkB,MAAPA,GAAeA,EAAMuG,EAAI1K,UAAQmE,EAAMuG,EAAI1K,QAAQ,IAAK,IAAIK,EAAI,EAAG+W,EAAO,IAAIzU,MAAMwB,GAAM9D,EAAI8D,EAAK9D,IAAO+W,EAAK/W,GAAKqK,EAAIrK,GAAM,OAAO+W,CAAM,CAMtL,SAAS9N,EAAQC,EAAQC,GAAkB,IAAIC,EAAO7C,OAAO6C,KAAKF,GAAS,GAAI3C,OAAO8C,sBAAuB,CAAE,IAAIC,EAAU/C,OAAO8C,sBAAsBH,GAAaC,IAAgBG,EAAUA,EAAQC,QAAO,SAAUC,GAAO,OAAOjD,OAAOkD,yBAAyBP,EAAQM,GAAKE,UAAY,KAAIN,EAAKtJ,KAAKmI,MAAMmB,EAAME,EAAU,CAAE,OAAOF,CAAM,CAEpV,SAASO,EAAcC,GAAU,IAAK,IAAI5J,EAAI,EAAGA,EAAI+H,UAAUpI,OAAQK,IAAK,CAAE,IAAI6J,EAAyB,MAAhB9B,UAAU/H,GAAa+H,UAAU/H,GAAK,CAAC,EAAOA,EAAI,EAAKiJ,EAAQ1C,OAAOsD,IAAS,GAAMnJ,SAAQ,SAAU9B,GAAOw/E,EAAgBx0E,EAAQhL,EAAKiL,EAAOjL,GAAO,IAAe2H,OAAOuD,0BAA6BvD,OAAOwD,iBAAiBH,EAAQrD,OAAOuD,0BAA0BD,IAAmBZ,EAAQ1C,OAAOsD,IAASnJ,SAAQ,SAAU9B,GAAO2H,OAAOyD,eAAeJ,EAAQhL,EAAK2H,OAAOkD,yBAAyBI,EAAQjL,GAAO,GAAM,CAAE,OAAOgL,CAAQ,CAErhB,SAASw0E,EAAgB/4E,EAAKzG,EAAKyF,GAAiK,OAApJzF,KAAOyG,EAAOkB,OAAOyD,eAAe3E,EAAKzG,EAAK,CAAEyF,MAAOA,EAAOqF,YAAY,EAAMsO,cAAc,EAAMC,UAAU,IAAkB5S,EAAIzG,GAAOyF,EAAgBgB,CAAK,CAEhN,SAASqQ,EAAyB7L,EAAQ8L,GAAY,GAAc,MAAV9L,EAAgB,MAAO,CAAC,EAAG,IAAkEjL,EAAKoB,EAAnE4J,EAEzF,SAAuCC,EAAQ8L,GAAY,GAAc,MAAV9L,EAAgB,MAAO,CAAC,EAAG,IAA2DjL,EAAKoB,EAA5D4J,EAAS,CAAC,EAAOgM,EAAarP,OAAO6C,KAAKS,GAAqB,IAAK7J,EAAI,EAAGA,EAAI4V,EAAWjW,OAAQK,IAAOpB,EAAMgX,EAAW5V,GAAQ2V,EAASpD,QAAQ3T,IAAQ,IAAagL,EAAOhL,GAAOiL,EAAOjL,IAAQ,OAAOgL,CAAQ,CAFhNo9F,CAA8Bn9F,EAAQ8L,GAAuB,GAAIpP,OAAO8C,sBAAuB,CAAE,IAAIwM,EAAmBtP,OAAO8C,sBAAsBQ,GAAS,IAAK7J,EAAI,EAAGA,EAAI6V,EAAiBlW,OAAQK,IAAOpB,EAAMiX,EAAiB7V,GAAQ2V,EAASpD,QAAQ3T,IAAQ,GAAkB2H,OAAOvH,UAAU8W,qBAAqBvT,KAAKsH,EAAQjL,KAAgBgL,EAAOhL,GAAOiL,EAAOjL,GAAQ,CAAE,OAAOgL,CAAQ,CAwB3e,IAAI0vlB,GAAwB,IAAApylB,aAAW,SAAU2D,EAAM7D,GACrD,IAAIgC,EAAW6B,EAAK7B,SAGhBuwlB,EAAeC,EAFN9jlB,EAAyB7K,EAAM,CAAC,cAGzCs7C,EAAOoziB,EAAapziB,KACpBp/C,EAAQ2O,EAAyB6jlB,EAAc,CAAC,SAQpD,OANA,IAAA5M,qBAAoB3llB,GAAK,WACvB,MAAO,CACLm/C,KAAMA,EAEV,GAAG,CAACA,IAEgB,gBAAoB,EAAAv+C,SAAU,KAAMoB,EAASW,EAAcA,EAAc,CAAC,EAAG5C,GAAQ,CAAC,EAAG,CAC3Go/C,KAAMA,KAEV,IACAmziB,EAAShzkB,YAAc,WAEvB,IAAIypD,EAAe,CACjBy2T,UAAU,EACVizN,kBF3DK,SAAmBrC,GACtB,OAAO,QAAU/4lB,UAAM,OAAQ,GAAQ,WACnC,OAAO,QAAYA,MAAM,SAAUkmE,GAC/B,MAAO,CAAC,GAMDlgE,EANyB+ylB,EAO/B/ylB,EAAM6lc,cAPiCktJ,EAAIltJ,aAClCotJ,EAAqBF,EAAIltJ,aAAcktJ,EAAI5vlB,MAC3C2vlB,EAAcC,KAIpC,IAAmB/ylB,CAHX,GACJ,GACJ,EEoDE20I,QAASnoD,IACT6ngB,QAAS,EACTgB,UAAU,EACVC,SAAU,EACVC,uBAAuB,EACvBC,SAAS,EACTC,YAAY,EACZC,QAAQ,EACRC,sBAAsB,EACtBvwiB,UAAW,MAEb6viB,EAASvphB,aAAeA,EACxBuphB,EAASxphB,UAAY,CAiBnB9mE,SAAU,SAUVsvlB,OAAQ,cAAoB,CAAC,WAAkB,YAAkB,cAKjEoB,SAAU,SAKVE,sBAAuB,SAKvBC,QAAS,SAMTC,WAAY,SAKZC,OAAQ,SAKRC,qBAAsB,SAKtBtB,QAAS,WAKT1/c,QAAS,WAMT2gd,SAAU,WAKVnzN,SAAU,SAOVizN,kBAAmB,SAKnBQ,mBAAoB,SAOpBn2J,YAAa,SAObI,YAAa,SAObg2J,WAAY,SAgCZC,OAAQ,SASRC,eAAgB,SAShBC,eAAgB,SAOhB5wiB,UAAW,UAEb,IAiEIwlE,EAAe,CACjBq5V,WAAW,EACXgyI,oBAAoB,EACpBC,cAAc,EACdC,cAAc,EACdC,cAAc,EACdC,aAAc,GACd7yC,cAAe,GACf8yC,eAAgB,IA2EX,SAASnB,IACd,IAAIp7lB,EAAU2J,UAAUpI,OAAS,QAAsBpB,IAAjBwJ,UAAU,GAAmBA,UAAU,GAAK,CAAC,EAE/E6ylB,EAAwBjxlB,EAAcA,EAAc,CAAC,EAAGomE,GAAe3xE,GACvEk6lB,EAASsC,EAAsBtC,OAC/B9xN,EAAWo0N,EAAsBp0N,SACjCizN,EAAoBmB,EAAsBnB,kBAC1Czgd,EAAU4hd,EAAsB5hd,QAChC0/c,EAAUkC,EAAsBlC,QAChCgB,EAAWkB,EAAsBlB,SACjCC,EAAWiB,EAAsBjB,SACjC71J,EAAc82J,EAAsB92J,YACpCI,EAAc02J,EAAsB12J,YACpCg2J,EAAaU,EAAsBV,WACnCC,EAASS,EAAsBT,OAC/BC,EAAiBQ,EAAsBR,eACvCC,EAAiBO,EAAsBP,eACvCJ,EAAqBW,EAAsBX,mBAC3CL,EAAwBgB,EAAsBhB,sBAC9CC,EAAUe,EAAsBf,QAChCC,EAAac,EAAsBd,WACnCC,EAASa,EAAsBb,OAC/BC,EAAuBY,EAAsBZ,qBAC7CvwiB,EAAYmxiB,EAAsBnxiB,UAElCoxiB,GAAU,IAAAt7kB,QAAO,MACjBu7kB,GAAW,IAAAv7kB,QAAO,MAGlBw7kB,EAAe,GADD,IAAAtO,YAAWh5iB,EAASw7E,GACS,GAC3CvmG,EAAQqykB,EAAa,GACrB5O,EAAW4O,EAAa,GAExBzyI,EAAY5/b,EAAM4/b,UAClBgyI,EAAqB5xkB,EAAM4xkB,mBAC3BI,EAAehykB,EAAMgykB,aAErBM,GAAiB,IAAArklB,cAAY,WAC3BmklB,EAAS55lB,UACXirlB,EAAS,CACP3klB,KAAM,eAERszlB,EAAS55lB,QAAQmD,MAAQ,KACzBy2lB,EAAS55lB,QAAQuigB,QAErB,GAAG,CAAC0oF,IAEA8O,EAAgB,WAEdX,GACFxzkB,YAAW,WACLg0kB,EAAS55lB,UACC45lB,EAAS55lB,QAAQ21E,MAElBl3E,SACTwslB,EAAS,CACP3klB,KAAM,gBAG0B,oBAAvByylB,GACTA,KAIR,GAAG,IAEP,GAEA,IAAAr6kB,YAAU,WAER,OADAmE,OAAO8Q,iBAAiB,QAASomkB,GAAe,GACzC,WACLl3kB,OAAO+Q,oBAAoB,QAASmmkB,GAAe,EACrD,CACF,GAAG,CAACH,EAAUR,EAAoBL,IAElC,IAAIiB,GAAc,IAAAvklB,cAAY,SAAUguB,GAEjCk2jB,EAAQ35lB,SAAY25lB,EAAQ35lB,QAAQi6lB,YAAYx2jB,EAAM/6B,UAIrC,KAAlB+6B,EAAMuwW,SAAoC,KAAlBvwW,EAAMuwW,UAChCvwW,EAAM4G,iBACNyvjB,KAEJ,GAAG,CAACH,EAASC,IAETM,GAAY,IAAAzklB,cAAY,WAC1Bw1kB,EAAS,CACP3klB,KAAM,SAEV,GAAG,IACC6zlB,GAAW,IAAA1klB,cAAY,WACzBw1kB,EAAS,CACP3klB,KAAM,QAEV,GAAG,IAEC8zlB,GAAY,IAAA3klB,cAAY,WACtBkjlB,KDtXD,WACL,IAAI5tkB,EAAYlkB,UAAUpI,OAAS,QAAsBpB,IAAjBwJ,UAAU,GAAmBA,UAAU,GAAKgc,OAAO4H,UAAUM,UACrG,OAVF,SAAcA,GACZ,OAAsC,IAA/BA,EAAU1Z,QAAQ,UAAqD,IAAnC0Z,EAAU1Z,QAAQ,WAC/D,CAQSgplB,CAAKtvkB,IANd,SAAgBA,GACd,OAAuC,IAAhCA,EAAU1Z,QAAQ,QAC3B,CAI4B8zE,CAAOp6D,EACnC,CC0XQuvkB,GAGFR,IAFAl0kB,WAAWk0kB,EAAgB,GAI/B,GAAG,CAACF,EAAUjB,IACV4B,GAAiB,IAAAl8kB,QAAO,IAExBm8kB,GAAiB,SAAwB/2jB,GACvCk2jB,EAAQ35lB,SAAW25lB,EAAQ35lB,QAAQy2B,SAASgN,EAAM/6B,UAKtD+6B,EAAM4G,iBACNkwjB,EAAev6lB,QAAU,GAC3B,GAEA,IAAA0e,YAAU,WAMR,OALIg6kB,IACFv6lB,SAASw1B,iBAAiB,WAAYukkB,GAAoB,GAC1D/5lB,SAASw1B,iBAAiB,OAAQ6mkB,IAAgB,IAG7C,WACD9B,IACFv6lB,SAASy1B,oBAAoB,WAAYskkB,GACzC/5lB,SAASy1B,oBAAoB,OAAQ4mkB,IAEzC,CACF,GAAG,CAACb,EAASjB,IACb,IAAI+B,IAAgB,IAAAhllB,cAAY,SAAUguB,GACxCA,EAAM4G,iBAEN5G,EAAMi3jB,UACN9ob,GAAgBnuI,GAChB82jB,EAAev6lB,QAAU,GAAGsJ,OAAOuV,EAAmB07kB,EAAev6lB,SAAU,CAACyjC,EAAM/6B,SAElFsvlB,EAAev0jB,IACjBtQ,QAAQC,QAAQmlkB,EAAkB90jB,IAAQ7wB,MAAK,SAAU4mlB,GACnD1B,EAAqBr0jB,KAAWq1jB,IAIpC7N,EAAS,CACPuO,aAAcA,EACdH,cAAc,EACd/ylB,KAAM,oBAGJs8b,GACFA,EAAYn/Z,GAEhB,GAEJ,GAAG,CAAC80jB,EAAmB31J,EAAak2J,IAChC6B,IAAe,IAAAlllB,cAAY,SAAUguB,GACvCA,EAAM4G,iBACN5G,EAAMi3jB,UACN9ob,GAAgBnuI,GAChB,IAAIm3jB,EAAW5C,EAAev0jB,GAE9B,GAAIm3jB,GAAYn3jB,EAAMula,aACpB,IACEvla,EAAMula,aAAa6xJ,WAAa,MAClC,CAAE,MAAOC,GAAU,CASrB,OAJIF,GAAY5B,GACdA,EAAWv1jB,IAGN,CACT,GAAG,CAACu1jB,EAAYF,IACZiC,IAAgB,IAAAtllB,cAAY,SAAUguB,GACxCA,EAAM4G,iBACN5G,EAAMi3jB,UACN9ob,GAAgBnuI,GAEhB,IAAI0b,EAAUo7iB,EAAev6lB,QAAQqI,QAAO,SAAUK,GACpD,OAAOixlB,EAAQ35lB,SAAW25lB,EAAQ35lB,QAAQy2B,SAAS/tB,EACrD,IAGIsylB,EAAY77iB,EAAQ9tC,QAAQoyB,EAAM/6B,SAEnB,IAAfsylB,GACF77iB,EAAQ3wC,OAAOwslB,EAAW,GAG5BT,EAAev6lB,QAAUm/C,EAErBA,EAAQ1gD,OAAS,IAIrBwslB,EAAS,CACPoO,cAAc,EACd/ylB,KAAM,kBACNkzlB,aAAc,KAGZxB,EAAev0jB,IAAUu/Z,GAC3BA,EAAYv/Z,GAEhB,GAAG,CAACk2jB,EAAS32J,EAAa81J,IACtBmC,IAAW,IAAAxllB,cAAY,SAAUguB,GACnCA,EAAM4G,iBAEN5G,EAAMi3jB,UACN9ob,GAAgBnuI,GAChB82jB,EAAev6lB,QAAU,GAErBg4lB,EAAev0jB,IACjBtQ,QAAQC,QAAQmlkB,EAAkB90jB,IAAQ7wB,MAAK,SAAU+iE,GACvD,IAAImihB,EAAqBr0jB,IAAWq1jB,EAApC,CAIA,IAAInyC,EAAgB,GAChB8yC,EAAiB,GACrB9jhB,EAAMn2E,SAAQ,SAAUwjE,GACtB,IACIk4hB,EAAiB,EADDxD,EAAa10hB,EAAMo0hB,GACY,GAC/C+D,EAAWD,EAAe,GAC1BE,EAAcF,EAAe,GAG7BG,EAAkB,EADDzD,EAAc50hB,EAAMw0hB,EAAS1/c,GACG,GACjDwjd,EAAYD,EAAgB,GAC5BE,EAAYF,EAAgB,GAE5BG,EAAejziB,EAAYA,EAAUya,GAAQ,KAEjD,GAAIm4hB,GAAYG,IAAcE,EAC5B70C,EAAc/njB,KAAKokE,OACd,CACL,IAAI4igB,EAAS,CAACw1B,EAAaG,GAEvBC,IACF51B,EAASA,EAAOt8jB,OAAOkylB,IAGzB/B,EAAe76lB,KAAK,CAClBokE,KAAMA,EACN4igB,OAAQA,EAAOv9jB,QAAO,SAAU/I,GAC9B,OAAOA,CACT,KAEJ,CACF,MAEKk5lB,GAAY7xC,EAAclojB,OAAS,GAAK+5lB,GAAYC,GAAY,GAAK9xC,EAAclojB,OAASg6lB,KAE/F9xC,EAAcnnjB,SAAQ,SAAUwjE,GAC9By2hB,EAAe76lB,KAAK,CAClBokE,KAAMA,EACN4igB,OAAQ,CAAC6xB,IAEb,IACA9wC,EAAcn4iB,OAAO,IAGvBy8kB,EAAS,CACPtkC,cAAeA,EACf8yC,eAAgBA,EAChBnzlB,KAAM,aAGJ2ylB,GACFA,EAAOtyC,EAAe8yC,EAAgBh2jB,GAGpCg2jB,EAAeh7lB,OAAS,GAAK06lB,GAC/BA,EAAeM,EAAgBh2jB,GAG7BkjhB,EAAclojB,OAAS,GAAKy6lB,GAC9BA,EAAevyC,EAAeljhB,EA7DhC,CA+DF,IAGFwnjB,EAAS,CACP3klB,KAAM,SAEV,GAAG,CAACkylB,EAAUpB,EAAQI,EAAS1/c,EAAS2gd,EAAUF,EAAmBU,EAAQC,EAAgBC,EAAgBL,EAAsBvwiB,IAE/HkziB,GAAiB,SAAwB35kB,GAC3C,OAAOwjX,EAAW,KAAOxjX,CAC3B,EAEI45kB,GAAyB,SAAgC55kB,GAC3D,OAAO82kB,EAAa,KAAO6C,GAAe35kB,EAC5C,EAEI65kB,GAAqB,SAA4B75kB,GACnD,OAAO+2kB,EAAS,KAAO4C,GAAe35kB,EACxC,EAEI8vJ,GAAkB,SAAyBnuI,GACzCq1jB,GACFr1jB,EAAMmuI,iBAEV,EAEIgqb,IAAe,IAAAn3kB,UAAQ,WACzB,OAAO,WACL,IAAI1Z,EAAQlE,UAAUpI,OAAS,QAAsBpB,IAAjBwJ,UAAU,GAAmBA,UAAU,GAAK,CAAC,EAC7Eg1lB,EAAe9wlB,EAAM+wlB,OACrBA,OAA0B,IAAjBD,EAA0B,MAAQA,EAC3CpyjB,EAAY1+B,EAAM0+B,UAClBkB,EAAU5/B,EAAM4/B,QAChBC,EAAS7/B,EAAM6/B,OACfT,EAAUp/B,EAAMo/B,QAChBy4Z,EAAc73b,EAAM63b,YACpBo2J,EAAajulB,EAAMiulB,WACnBh2J,EAAcj4b,EAAMi4b,YACpBi2J,EAASlulB,EAAMkulB,OACfxolB,EAAO+D,EAAyBzJ,EAAO,CAAC,SAAU,YAAa,UAAW,SAAU,UAAW,cAAe,aAAc,cAAe,WAE/I,OAAOtC,EAAcA,EAAcy0E,EAAgB,CACjDzzC,UAAWiyjB,GAAuBvD,EAAqB1ujB,EAAWuwjB,IAClErvjB,QAAS+wjB,GAAuBvD,EAAqBxtjB,EAASuvjB,IAC9DtvjB,OAAQ8wjB,GAAuBvD,EAAqBvtjB,EAAQuvjB,IAC5DhwjB,QAASsxjB,GAAetD,EAAqBhujB,EAASiwjB,IACtDx3J,YAAa+4J,GAAmBxD,EAAqBv1J,EAAa63J,KAClEzB,WAAY2C,GAAmBxD,EAAqBa,EAAY2B,KAChE33J,YAAa24J,GAAmBxD,EAAqBn1J,EAAa+3J,KAClE9B,OAAQ0C,GAAmBxD,EAAqBc,EAAQgC,MACvDa,EAAQnC,GAAWr0N,GAAaszN,EAE/B,CAAC,EAF2C,CAC9C11N,SAAU,IACHzyX,EACX,CACF,GAAG,CAACkplB,EAASK,EAAaE,EAAWC,EAAUC,EAAWK,GAAeE,GAAcI,GAAeE,GAAUrC,EAAYC,EAAQvzN,IAChIy2N,IAAsB,IAAAtmlB,cAAY,SAAUguB,GAC9CA,EAAMmuI,iBACR,GAAG,IACCoqb,IAAgB,IAAAv3kB,UAAQ,WAC1B,OAAO,WACL,IAAI/X,EAAQ7F,UAAUpI,OAAS,QAAsBpB,IAAjBwJ,UAAU,GAAmBA,UAAU,GAAK,CAAC,EAC7Eo1lB,EAAevvlB,EAAMovlB,OACrBA,OAA0B,IAAjBG,EAA0B,MAAQA,EAC3C/mhB,EAAWxoE,EAAMwoE,SACjB/qC,EAAUz9B,EAAMy9B,QAChB15B,EAAO+D,EAAyB9H,EAAO,CAAC,SAAU,WAAY,YAelE,OAAOjE,EAAcA,EAAc,CAAC,EAbnBy0E,EAAgB,CAC/Bk6gB,OAAQA,EACRoB,SAAUA,EACVlylB,KAAM,OACNuD,MAAO,CACLuC,QAAS,QAEX8oE,SAAUumhB,GAAetD,EAAqBjjhB,EAAU+lhB,KACxD9wjB,QAASsxjB,GAAetD,EAAqBhujB,EAAS4xjB,KACtDG,aAAc,MACdh5N,UAAW,GACV44N,EAAQlC,IAEyCnplB,EACtD,CACF,GAAG,CAACmplB,EAAUxC,EAAQoB,EAAUyC,GAAU31N,IACtC62N,GAAY3C,EAAa/6lB,OACzB66lB,GAAe6C,GAAY,GDtsB1B,SAA0BxylB,GAC/B,IAAIgsE,EAAQhsE,EAAKgsE,MACbyhhB,EAASztlB,EAAKytlB,OACdI,EAAU7tlB,EAAK6tlB,QACf1/c,EAAUnuI,EAAKmuI,QACf0gd,EAAW7ulB,EAAK6ulB,SAChBC,EAAW9ulB,EAAK8ulB,SAEpB,SAAKD,GAAY7ihB,EAAMl3E,OAAS,GAAK+5lB,GAAYC,GAAY,GAAK9ihB,EAAMl3E,OAASg6lB,IAI1E9ihB,EAAM/5C,OAAM,SAAUonC,GAC3B,IAEIm4hB,EADiB79gB,EADDo6gB,EAAa10hB,EAAMo0hB,GACY,GACrB,GAI1BkE,EADkBh+gB,EADDs6gB,EAAc50hB,EAAMw0hB,EAAS1/c,GACG,GACrB,GAEhC,OAAOqjd,GAAYG,CACrB,GACF,CC+qBsCc,CAAiB,CACnDzmhB,MAAO6jhB,EACPpC,OAAQA,EACRI,QAASA,EACT1/c,QAASA,EACT0gd,SAAUA,EACVC,SAAUA,IAERc,GAAe4C,GAAY,IAAM7C,GACrC,OAAO7wlB,EAAcA,EAAc,CAAC,EAAG+e,GAAQ,CAAC,EAAG,CACjD8xkB,aAAcA,GACdC,aAAcA,GACdnyI,UAAWA,IAAc9hF,EACzBs2N,aAAcA,GACdI,cAAeA,GACfrC,QAASA,EACTC,SAAUA,EACV30iB,KAAMw2iB,GAAe3B,IAEzB,CAEA,SAASvnjB,EAAQ/qB,EAAOzF,GAEtB,OAAQA,EAAOzb,MACb,IAAK,QACH,OAAOmC,EAAcA,EAAc,CAAC,EAAG+e,GAAQ,CAAC,EAAG,CACjD4/b,WAAW,IAGf,IAAK,OACH,OAAO3+c,EAAcA,EAAc,CAAC,EAAG+e,GAAQ,CAAC,EAAG,CACjD4/b,WAAW,IAGf,IAAK,aACH,OAAO3+c,EAAcA,EAAc,CAAC,EAAG+e,GAAQ,CAAC,EAAG,CACjD4xkB,oBAAoB,IAGxB,IAAK,cACH,OAAO3wlB,EAAcA,EAAc,CAAC,EAAG+e,GAAQ,CAAC,EAAG,CACjD4xkB,oBAAoB,IAGxB,IAAK,kBAEH,IAAIC,EAAet3kB,EAAOs3kB,aACtBG,EAAez3kB,EAAOy3kB,aAC1B,OAAO/wlB,EAAcA,EAAc,CAAC,EAAG+e,GAAQ,CAAC,EAAG,CACjDgykB,aAAcA,EACdH,aAAcA,IAGlB,IAAK,WACH,OAAO5wlB,EAAcA,EAAc,CAAC,EAAG+e,GAAQ,CAAC,EAAG,CACjDm/hB,cAAe5kiB,EAAO4kiB,cACtB8yC,eAAgB13kB,EAAO03kB,iBAG3B,IAAK,QACH,OAAOhxlB,EAAc,CAAC,EAAGslH,GAE3B,QACE,OAAOvmG,EAEb,yGCz0BA,SAAS1J,IAA2Q,OAA9PA,EAAWzY,OAAOsF,QAAU,SAAUjC,GAAU,IAAK,IAAI5J,EAAI,EAAGA,EAAI+H,UAAUpI,OAAQK,IAAK,CAAE,IAAI6J,EAAS9B,UAAU/H,GAAI,IAAK,IAAIpB,KAAOiL,EAActD,OAAOvH,UAAUwH,eAAejE,KAAKsH,EAAQjL,KAAQgL,EAAOhL,GAAOiL,EAAOjL,GAAU,CAAE,OAAOgL,CAAQ,EAAUoV,EAAS/W,MAAM5J,KAAM0J,UAAY,CAI5T,SAAS0Y,EAAuBC,GAAQ,QAAa,IAATA,EAAmB,MAAM,IAAIC,eAAe,6DAAgE,OAAOD,CAAM,CAOrK,IAAI68kB,EAEJ,SAAUpuhB,GAPV,IAAwBrtD,EAAUC,EAUhC,SAASw7kB,IACP,IAAIjplB,EAOJ,OALAA,EAAQ66D,EAAiB5sE,KAAKlE,OAASA,MACjCm/lB,cAAgBlplB,EAAMkplB,cAAcnsjB,KAAK5wB,EAAuBnM,IACtEA,EAAMmplB,cAAgBnplB,EAAMmplB,cAAcpsjB,KAAK5wB,EAAuBnM,IACtEA,EAAMoplB,aAAepplB,EAAMoplB,aAAarsjB,KAAK5wB,EAAuBnM,IACpEA,EAAMqplB,mBAAqBrplB,EAAMqplB,mBAAmBtsjB,KAAK5wB,EAAuBnM,IACzEA,CACT,CAnBgCyN,EAQNotD,GARJrtD,EAQPy7kB,GARwCv+lB,UAAYuH,OAAOyb,OAAOD,EAAW/iB,WAAY8iB,EAAS9iB,UAAUuU,YAAcuO,EAAUA,EAASf,UAAYgB,EAqBxK,IAAIhjB,EAASw+lB,EAAUv+lB,UAkKvB,OAhKAD,EAAO0yD,SAAW,WAChB,OAAIpzD,KAAK0I,MAAM62lB,iBAAiCr/lB,IAAnBF,KAAKw/lB,UACzBx/lB,KAAK0I,MAAM62lB,WAAWE,YAAYz/lB,KAAKw/lB,WAGzC,IACT,EAEA9+lB,EAAOg/lB,YAAc,WACnB,OAAI1/lB,KAAK0I,MAAM62lB,iBAAiCr/lB,IAAnBF,KAAKw/lB,UACzBx/lB,KAAKw/lB,UAGP,IACT,EAEA9+lB,EAAO63H,QAAU,WACf,IAAIgne,EAAav/lB,KAAK0I,MAAM62lB,WAE5B,GAAIA,QAAiCr/lB,IAAnBF,KAAKw/lB,UACrB,OAAOD,EAAWhne,QAAQv4H,KAAKw/lB,WAE/Bx/lB,KAAK2/lB,mBAAoB,CAE7B,EAEAj/lB,EAAOqxJ,aAAe,WACpB,IAAI17I,EAASrW,KAEb,OAAO,IAAIg2B,SAAQ,SAAUC,EAASwwB,GACpCpwC,EAAOuplB,iBAAmB3pkB,EAC1B5f,EAAOwplB,gBAAkBp5iB,EAEzBpwC,EAAOkiH,SACT,GACF,EAEA73H,EAAOk1B,MAAQ,WACT51B,KAAK0I,MAAM62lB,iBAAiCr/lB,IAAnBF,KAAKw/lB,WAChCx/lB,KAAK0I,MAAM62lB,WAAW3pkB,MAAM51B,KAAKw/lB,UAErC,EAEA9+lB,EAAOy+lB,cAAgB,WACjBn/lB,KAAK0I,MAAMo3lB,UACb9/lB,KAAK0I,MAAMo3lB,YAEX9/lB,KAAKq/lB,aAAa,KAEtB,EAEA3+lB,EAAO0+lB,cAAgB,WACjBp/lB,KAAK0I,MAAMq3lB,WACb//lB,KAAK0I,MAAMq3lB,YAGT//lB,KAAK6/lB,kBACP7/lB,KAAK6/lB,yBACE7/lB,KAAK4/lB,wBACL5/lB,KAAK6/lB,gBAEhB,EAEAn/lB,EAAO2+lB,aAAe,SAAsB/kjB,GACtCt6C,KAAK0I,MAAMqvE,UACb/3E,KAAK0I,MAAMqvE,SAASz9B,GAGlBt6C,KAAK4/lB,mBACP5/lB,KAAK4/lB,iBAAiBtljB,UACft6C,KAAK6/lB,uBACL7/lB,KAAK4/lB,iBAEhB,EAEAl/lB,EAAOs/lB,eAAiB,WACtB,GAAIhgmB,KAAK0I,MAAM62lB,YAAcv/lB,KAAK0I,MAAM62lB,WAAW92lB,aAA6BvI,IAAnBF,KAAKw/lB,UAAyB,CACzF,IAAIvwH,EAAUjue,SAASC,cAAc,OACrCjB,KAAKw/lB,UAAYx/lB,KAAK0I,MAAM62lB,WAAW92lB,OAAOwme,EAAS,CACrDgxH,QAASjgmB,KAAK0I,MAAMu3lB,QACpBx+kB,SAAUzhB,KAAKq/lB,aACfr2lB,MAAOhJ,KAAK0I,MAAMM,MAClBG,KAAMnJ,KAAK0I,MAAMS,KACjB+2lB,SAAUlgmB,KAAK0I,MAAMw3lB,SACrB,mBAAoBlgmB,KAAKm/lB,cACzB,iBAAkBn/lB,KAAKo/lB,cACvB5mjB,KAAMx4C,KAAK0I,MAAM8vC,KACjB2njB,OAAQngmB,KAAK0I,MAAMy3lB,OACnBC,GAAIpgmB,KAAK0I,MAAM03lB,GACfC,MAAOrgmB,KAAK0I,MAAM23lB,QAEpBrgmB,KAAKsgmB,QAAQn/lB,YAAY8te,EAC3B,CAEIjve,KAAK2/lB,mBAAqB3/lB,KAAK0I,MAAM62lB,iBAAiCr/lB,IAAnBF,KAAKw/lB,YAC1Dx/lB,KAAK2/lB,mBAAoB,EACzB3/lB,KAAKu4H,UAET,EAEA73H,EAAO2ijB,kBAAoB,WACzBrjjB,KAAKggmB,gBACP,EAEAt/lB,EAAOskjB,mBAAqB,WAC1BhljB,KAAKggmB,gBACP,EAEAt/lB,EAAOiljB,qBAAuB,gBACLzljB,IAAnBF,KAAKw/lB,YACPx/lB,KAAKugmB,+BACLvgmB,KAAK41B,QAET,EAEAl1B,EAAO6/lB,6BAA+B,WACpC,IAAIC,EAAgBx/lB,SAASC,cAAc,OAI3C,IAHAD,SAASkwB,KAAK/vB,YAAYq/lB,GAC1BA,EAAc9zlB,MAAMuC,QAAU,OAEvBjP,KAAKsgmB,QAAQt1jB,YAClBw1jB,EAAcr/lB,YAAYnB,KAAKsgmB,QAAQt1jB,YAIzCviB,YAAW,WACTznB,SAASkwB,KAAK3uB,YAAYi+lB,EAC5B,GAAG,IACL,EAEA9/lB,EAAO4+lB,mBAAqB,SAA4BmB,GACtDzgmB,KAAKsgmB,QAAUG,CACjB,EAEA//lB,EAAO+H,OAAS,WAId,IAAIm/kB,EAAc5nlB,KAAK0I,MAanBq8kB,GAZU6C,EAAYqY,QACXrY,EAAY7vgB,SACf6vgB,EAAY5+kB,MACb4+kB,EAAYz+kB,KACRy+kB,EAAYsY,SACXtY,EAAYkY,UACZlY,EAAYmY,UACjBnY,EAAYpviB,KACVoviB,EAAYuY,OACRvY,EAAY2X,WACjB3X,EAAYyY,MACfzY,EAAYwY,GAjLzB,SAAuC50lB,EAAQ8L,GAAY,GAAc,MAAV9L,EAAgB,MAAO,CAAC,EAAG,IAA2DjL,EAAKoB,EAA5D4J,EAAS,CAAC,EAAOgM,EAAarP,OAAO6C,KAAKS,GAAqB,IAAK7J,EAAI,EAAGA,EAAI4V,EAAWjW,OAAQK,IAAOpB,EAAMgX,EAAW5V,GAAQ2V,EAASpD,QAAQ3T,IAAQ,IAAagL,EAAOhL,GAAOiL,EAAOjL,IAAQ,OAAOgL,CAAQ,CAkL7Ro9F,CAA8Bi/e,EAAa,CAAC,UAAW,WAAY,QAAS,OAAQ,WAAY,YAAa,YAAa,OAAQ,SAAU,aAAc,QAAS,QAIpL,OAAO,gBAAoB,MAAOjnkB,EAAS,CAAC,EAAGokkB,EAAY,CACzDp8kB,IAAK3I,KAAKs/lB,qBAEd,EAEOJ,CACT,CAjLA,CAiLE,aAGFA,EAAUj3kB,YAAc,YACxBi3kB,EAAUzthB,UAAY,CACpBwuhB,QAAS,WAAiBpyhB,WAC1BkK,SAAU,SACVwnhB,WAAY,WACZv2lB,MAAO,UAAgB,CAAC,OAAQ,UAChCG,KAAM,UAAgB,CAAC,QAAS,UAChC+2lB,SAAU,WACVJ,UAAW,SACXC,UAAW,SACXvnjB,KAAM,UAAgB,CAAC,UAAW,SAAU,cAC5C2njB,OAAQ,WACRC,GAAI,WACJC,MAAO,UAAgB,CAAC,cAAe,aAAc,YAEvDnB,EAAUxthB,aAAe,CACvBqG,SAAU,WAAqB,EAC/B/uE,MAAO,QACPG,KAAM,QACN+2lB,SAAU,EACV1njB,KAAM,SACN6njB,MAAO,0DCtNT,SAAS,IAA2Q,OAA9P,EAAWn4lB,OAAOsF,QAAU,SAAUjC,GAAU,IAAK,IAAI5J,EAAI,EAAGA,EAAI+H,UAAUpI,OAAQK,IAAK,CAAE,IAAI6J,EAAS9B,UAAU/H,GAAI,IAAK,IAAIpB,KAAOiL,EAActD,OAAOvH,UAAUwH,eAAejE,KAAKsH,EAAQjL,KAAQgL,EAAOhL,GAAOiL,EAAOjL,GAAU,CAAE,OAAOgL,CAAQ,EAAU,EAAS3B,MAAM5J,KAAM0J,UAAY,CAS5T,IAAIg3lB,EAAa,CAAC,EAEdC,EAAU,ECTd,IAAI/yQ,EAAe,iBAanB,IDHwCgzQ,EAAc7gmB,ECGtD,GDHwC6gmB,ECHxC,WAGE,MAAO,aANkB,qBAAXl7kB,QAA0BA,OAAOm7kB,kBAAoB,CAAC,GAKtCC,gBAAkB,gBAAkB,kBACnC,4BAA8BlzQ,EAAe,kBAC9E,EDAE7tV,GADoDA,ECGT,CAC3C6tV,aAAcA,EACdmzQ,WAde,gBDUM,CAAC,EACf,SAA6Bx1gB,GAClC,IAAIy1gB,EAAuBz1gB,EAAiBtjE,aAAesjE,EAAiB5mF,MAAQ,YAEhFs8lB,EAEJ,SAAUC,GAfd,IAAwBz9kB,EAAUC,EAkB5B,SAASu9kB,EAAkBv4lB,EAAO3F,GAChC,IAAIkT,EAKJ,OAHAA,EAAQirlB,EAAWh9lB,KAAKlE,KAAM0I,EAAO3F,IAAY/C,MAC3CqqB,MAAQ,CAAC,EACfpU,EAAMkrlB,YAAc,GACblrlB,CACT,CAzB4ByN,EAgBMw9kB,GAhBhBz9kB,EAgBHw9kB,GAhBoCtgmB,UAAYuH,OAAOyb,OAAOD,EAAW/iB,WAAY8iB,EAAS9iB,UAAUuU,YAAcuO,EAAUA,EAASf,UAAYgB,EA2BpK,IAAIhjB,EAASugmB,EAAkBtgmB,UAmM/B,OAjMAD,EAAO0gmB,mCAAqC,WAK1C,OAJKphmB,KAAKqhmB,mBACRrhmB,KAAKqhmB,iBAAmB,uBAAyBV,KAG5C3gmB,KAAKqhmB,gBACd,EAEA3gmB,EAAO4gmB,eAAiB,WAEtB,OADAthmB,KAAKmhmB,YAAsC,oBAAjBP,EAA8BA,IAAiBA,EAClE5gmB,KAAKmhmB,WACd,EAEAzgmB,EAAO6gmB,4BAA8B,SAAqCl3kB,GACxE,IAAIhU,EAASrW,KAGbA,KAAKmkC,SAAS9Z,GAAO,WACnB,OAAOhU,EAAO3N,MAAM84lB,mBAAqBnrlB,EAAO3N,MAAM84lB,kBAAkBnrlB,EAAOgU,MACjF,GACF,EAEA3pB,EAAO+gmB,uCAAyC,WAC9C,IAAIC,EAAWhB,EAAW1gmB,KAAKmhmB,aAE/B,IAAKO,IAAaA,EAAS17iB,OACzB,MAAM,IAAIlvC,MAAM,yBAGlB,IAAK,IAAI6qlB,KAAUD,EAASxrgB,UAC1BwrgB,EAASxrgB,UAAUyrgB,GAAQD,UAGtBh8kB,OAAO3lB,EAAQ6tV,aACxB,EAEAltV,EAAO2ijB,kBAAoB,WACzB,IAAIu+C,EAAS5hmB,KAET6hmB,EAAY7hmB,KAAKshmB,iBACjB/gmB,EAAMP,KAAKohmB,qCACXrrkB,EAAWh2B,EACXghmB,EAAahrkB,EAASgrkB,WACtBnzQ,EAAe73T,EAAS63T,aACxBk0Q,EAAW/rkB,EAAS+rkB,SAUxB,GARIf,GAA4C,qBAAvBr7kB,OAAOq7kB,KAC9BL,EAAWmB,GAAa,CACtB77iB,QAAQ,EACRkwC,UAAW,CAAC,IAKZwqgB,EAAWmB,GAAY,CACzB,IAAIn2jB,EAAQg1jB,EAAWmB,GAEvB,OAAIn2jB,IAAUA,EAAMsa,QAAUta,EAAMq2jB,cAClC/hmB,KAAKuhmB,4BAA4B71jB,QAKnCA,EAAMwqD,UAAU31F,GAAO,SAAUmrC,GAC/B,OAAOk2jB,EAAOL,4BAA4B71jB,EAC5C,EAGF,CAQA,IAAIwqD,EAAY,CAAC,EAEjBA,EAAU31F,GAAO,SAAUmrC,GACzB,OAAOk2jB,EAAOL,4BAA4B71jB,EAC5C,EAEAg1jB,EAAWmB,GAAa,CACtB77iB,QAAQ,EACRkwC,UAAWA,GAEb,IAAI/d,EAASn3E,SAASC,cAAc,UAIpC,IAAK,IAAIwhC,KAHT01C,EAAOC,IAAMyphB,EACb1phB,EAAOyoB,OAAQ,EAEO7gG,EAAQslB,WAC5B8yD,EAAOj3E,aAAauhC,EAAW1iC,EAAQslB,WAAWod,IAGhDq/jB,IACF3phB,EAAO9zE,GAAKy9lB,GAGd,IAAIE,EAAoC,SAA2Cx5lB,GACjF,GAAIk4lB,EAAWmB,GAAY,CACzB,IACII,EADWvB,EAAWmB,GACE3rgB,UAE5B,IAAK,IAAIyrgB,KAAUM,EACbz5lB,EAAKy5lB,EAAaN,YACbM,EAAaN,EAG1B,CACF,EAEI/zQ,GAAkC,qBAAXloU,SACzBA,OAAOkoU,GAAgB,WACrB,OAAOg0Q,EAAOH,wCAChB,GAGFtphB,EAAOE,OAAS,WACd,IAAIqphB,EAAWhB,EAAWmB,GAEtBH,IACFA,EAAS17iB,QAAS,EAClBg8iB,GAAkC,SAAU7rgB,GAC1C,OAAIy3P,IAIJz3P,EAASurgB,IACF,EACT,IAEJ,EAEAvphB,EAAO9vB,QAAU,WACf,IAAIq5iB,EAAWhB,EAAWmB,GAEtBH,IACFA,EAASK,SAAU,EACnBC,GAAkC,SAAU7rgB,GAE1C,OADAA,EAASurgB,IACF,CACT,IAEJ,EAEA1gmB,SAASkwB,KAAK/vB,YAAYg3E,EAC5B,EAEAz3E,EAAOiljB,qBAAuB,WAE5B,IAAIk8C,EAAY7hmB,KAAKmhmB,YAErB,IAAgC,IAA5BphmB,EAAQmimB,gBAGV,IAFA,IAAIC,EAAanhmB,SAAS+uE,qBAAqB,UAEtCpuE,EAAI,EAAGA,EAAIwgmB,EAAW7gmB,OAAQK,GAAK,EACtCwgmB,EAAWxgmB,GAAGy2E,IAAIlkE,QAAQ2tlB,IAAc,GACtCM,EAAWxgmB,GAAGW,YAChB6/lB,EAAWxgmB,GAAGW,WAAWC,YAAY4/lB,EAAWxgmB,IAOxD,IAAI+/lB,EAAWhB,EAAWmB,GAEtBH,WACKA,EAASxrgB,UAAUl2F,KAAKohmB,uCAEC,IAA5BrhmB,EAAQmimB,wBACHxB,EAAWmB,GAGxB,EAEAnhmB,EAAO+H,OAAS,WACd,IAAIs4lB,EAAahhmB,EAAQghmB,WAErBnZ,EAAc5nlB,KAAK0I,MAEnB+1kB,GADoBmJ,EAAY4Z,kBACjB5Z,EAAYnJ,cAC3BsG,EArNZ,SAAuCv5kB,EAAQ8L,GAAY,GAAc,MAAV9L,EAAgB,MAAO,CAAC,EAAG,IAA2DjL,EAAKoB,EAA5D4J,EAAS,CAAC,EAAOgM,EAAarP,OAAO6C,KAAKS,GAAqB,IAAK7J,EAAI,EAAGA,EAAI4V,EAAWjW,OAAQK,IAAOpB,EAAMgX,EAAW5V,GAAQ2V,EAASpD,QAAQ3T,IAAQ,IAAagL,EAAOhL,GAAOiL,EAAOjL,IAAQ,OAAOgL,CAAQ,CAqNzR,CAA8Bq8kB,EAAa,CAAC,oBAAqB,iBAQlF,OALImZ,GAAgC,qBAAXr7kB,SACvBq/jB,EAAWgc,GAA4C,qBAAvBr7kB,OAAOq7kB,GAA8Br7kB,OAAOq7kB,QAAc7gmB,GAG5F6klB,EAAWp8kB,IAAM81kB,GACV,IAAAx9kB,eAAcsqF,EAAkBw5f,EACzC,EAEOkc,CACT,CAhNA,CAgNE,EAAAzvhB,WAKE4whB,GAAqB,IAAAv5lB,aAAW,SAAUH,EAAOC,GACnD,OAAO,IAAA1H,eAAcggmB,EAAmB,EAAS,CAAC,EAAGv4lB,EAAO,CAC1D+1kB,aAAc91kB,IAElB,IAKA,OAJAy5lB,EAAmBn6kB,YAAc,qBAAuB+4kB,EAAuB,IAC/EoB,EAAmB3whB,UAAY,CAC7B+vhB,kBAAmB,UAEd,IAAaY,EAAoB72gB,EAC1C,GChOC2zgB,GChBH,wCCOA,IAAI5xhB,EAAuB,EAAQ,MAEnC,SAASC,IAAiB,CAC1B,SAASC,IAA0B,CACnCA,EAAuBH,kBAAoBE,EAE3C73D,EAAOm9C,QAAU,WACf,SAAS4a,EAAK/kE,EAAO62D,EAAU16C,EAAemgC,EAAU0oB,EAAcC,GACpE,GAAIA,IAAWL,EAAf,CAIA,IAAI7zD,EAAM,IAAI3C,MACZ,mLAKF,MADA2C,EAAI9U,KAAO,sBACL8U,CAPN,CAQF,CAEA,SAASm0D,IACP,OAAOH,CACT,CAHAA,EAAKI,WAAaJ,EAMlB,IAAIK,EAAiB,CACnBC,MAAON,EACPO,OAAQP,EACRQ,KAAMR,EACNjlE,KAAMilE,EACNl/D,OAAQk/D,EACR5iE,OAAQ4iE,EACRxmE,OAAQwmE,EACRS,OAAQT,EAERU,IAAKV,EACLW,QAASR,EACT7/C,QAAS0/C,EACTY,YAAaZ,EACba,WAAYV,EACZzpE,KAAMspE,EACNc,SAAUX,EACVY,MAAOZ,EACPa,UAAWb,EACXc,MAAOd,EACPe,MAAOf,EAEPgB,eAAgBpB,EAChBH,kBAAmBE,GAKrB,OAFAO,EAAee,UAAYf,EAEpBA,CACT,yBC/CEp4D,EAAOm9C,QAAU,EAAQ,MAAR,kCCNnBn9C,EAAOm9C,QAFoB,kMCThB4liB,EAAoB,IAAIvhlB,IAAI,CAEnC,CAAC,MAAO,aACR,CAAC,MAAO,yBACR,CAAC,MAAO,yBACR,CAAC,OAAQ,cACT,CAAC,MAAO,mBACR,CAAC,MAAO,gCACR,CAAC,MAAO,4BACR,CAAC,MAAO,aACR,CAAC,KAAM,sBACP,CAAC,MAAO,uBACR,CAAC,MAAO,qBACR,CAAC,MAAO,qBACR,CAAC,MAAO,YACR,CAAC,MAAO,YACR,CAAC,MAAO,sBACR,CAAC,OAAQ,2EACT,CAAC,MAAO,iCACR,CAAC,OAAQ,wBACT,CAAC,KAAM,oBACP,CAAC,MAAO,aACR,CAAC,MAAO,aACR,CAAC,OAAQ,aACT,CAAC,MAAO,4BACR,CAAC,MAAO,iBACR,CAAC,MAAO,4BACR,CAAC,OAAQ,cACT,CAAC,MAAO,cACR,CAAC,KAAM,mBACP,CAAC,OAAQ,oBACT,CAAC,SAAU,uBACX,CAAC,MAAO,cACR,CAAC,OAAQ,cACT,CAAC,MAAO,mBACR,CAAC,MAAO,cACR,CAAC,MAAO,aACR,CAAC,OAAQ,cACT,CAAC,OAAQ,uCACT,CAAC,MAAO,mDACR,CAAC,MAAO,kDACR,CAAC,MAAO,2CACR,CAAC,MAAO,aACR,CAAC,MAAO,aACR,CAAC,MAAO,mBACR,CAAC,OAAQ,cACT,CAAC,MAAO,YACR,CAAC,MAAO,aACR,CAAC,MAAO,mBACR,CAAC,MAAO,2BACR,CAAC,MAAO,iCACR,CAAC,OAAQ,6EACT,CAAC,MAAO,uBACR,CAAC,MAAO,mBACR,CAAC,KAAM,oBACP,CAAC,MAAO,iBACR,CAAC,MAAO,iCACR,CAAC,MAAO,qBACR,CAAC,MAAO,cACR,CAAC,OAAQ,cACT,CAAC,KAAM,cACP,CAAC,MAAO,YACR,CAAC,MAAO,cACR,CAAC,MAAO,yBACR,CAAC,MAAO,aACR,CAAC,OAAQ,cACT,CAAC,OAAQ,cACT,CAAC,OAAQ,cACT,CAAC,OAAQ,aACT,CAAC,QAAS,cACV,CAAC,QAAS,yBACV,CAAC,MAAO,4BACR,CAAC,OAAQ,qEACT,CAAC,MAAO,mBACR,CAAC,MAAO,mCACR,CAAC,MAAO,mBACR,CAAC,KAAM,+BAEP,CAAC,MAAO,oBACR,CAAC,MAAO,mBACR,CAAC,MAAO,gCAEL,SAASwhlB,EAAe7yhB,EAAMzrB,GACjC,IAAI5K,EAmBR,SAAsBq2B,GAClB,IAAIlhE,EAAOkhE,EAAKlhE,KAEhB,GADmBA,IAAmC,IAA3BA,EAAKq3D,YAAY,OACvB6J,EAAK18D,KAAM,CAC5B,IAAI62T,EAAMr7T,EAAKnB,MAAM,KAChBg4C,MAAMp1C,cACP+C,EAAOsvlB,EAAkB51kB,IAAIm9S,GAC7B72T,GACAjB,OAAOyD,eAAek6D,EAAM,OAAQ,CAChC7/D,MAAOmD,EACPyQ,UAAU,EACVD,cAAc,EACdtO,YAAY,GAGxB,CACA,OAAOw6D,CACX,CApCY8yhB,CAAa9yhB,GACrB,GAAsB,kBAAXr2B,EAAE4K,KAAmB,CAC5B,IAAIw+iB,EAAqB/yhB,EAAK+yhB,mBAC9B1wlB,OAAOyD,eAAe6jC,EAAG,OAAQ,CAC7BxpC,MAAuB,kBAATo0C,EACRA,EAI8B,kBAAvBw+iB,GAAmCA,EAAmBt3lB,OAAS,EAClEs3lB,EACA/yhB,EAAKlhE,KACfiV,UAAU,EACVD,cAAc,EACdtO,YAAY,GAEpB,CACA,OAAOmkC,CACX,CCnGA,IAAIqpjB,EAAkB,CAElB,YACA,aAkCJ,SAASjljB,EAAS1S,GACd,MAAoB,kBAANA,GAAwB,OAANA,CACpC,CACA,SAAS43jB,EAAcC,GACnB,OAAOC,EAASD,EAAIxtlB,OAAOitE,OAAOvrE,KAAI,SAAU44D,GAAQ,OAAO6yhB,EAAe7yhB,EAAO,GACzF,CAEA,SAASw8hB,EAAiBxhe,GACtB,OAAO,QAAU7gI,UAAM,OAAQ,GAAQ,WAEnC,OAAO,QAAYA,MAAM,SAAUkmE,GAC/B,OAAQA,EAAGj3B,OACP,KAAK,EAAG,MAAO,CAAC,EAAajZ,QAAQ+b,IAAI8uF,EAAQ5zH,KAAI,SAAUzH,GAAK,OAAOA,EAAE88lB,SAAW,MACxF,KAAK,EAED,MAAO,CAAC,EADAp8hB,EAAGiD,OACiBl8D,KAAI,SAAU44D,GAAQ,OAAO6yhB,EAAe7yhB,EAAO,KAE3F,GACJ,GACJ,CACA,SAASozhB,EAAqBhpgB,EAAI9mF,GAC9B,OAAO,QAAUnJ,UAAM,OAAQ,GAAQ,WACnC,IAAI6uF,EACJ,OAAO,QAAY7uF,MAAM,SAAUkmE,GAC/B,OAAQA,EAAGj3B,OACP,KAAK,EACD,OAAW,OAAPghD,EACO,CAAC,EAAc,IAErBA,EAAGpB,OACRA,EAAQmqgB,EAAS/ogB,EAAGpB,OACf3jF,QAAO,SAAUuiB,GAAQ,MAAqB,SAAdA,EAAKuoB,IAAiB,IAG9C,SAAT7sC,EACO,CAAC,EAAc0lF,GAEnB,CAAC,EAAa74D,QAAQ+b,IAAI88C,EAAM5hF,IAAIislB,MARrB,CAAC,EAAa,GASxC,KAAK,EAED,MAAO,CAAC,EAAcC,EAAe5ve,EAD7BrjD,EAAGiD,UAEf,KAAK,EAAG,MAAO,CAAC,EAAcgwhB,EAAeH,EAAS/ogB,EAAGzX,OAChDvrE,KAAI,SAAU44D,GAAQ,OAAO6yhB,EAAe7yhB,EAAO,MAEpE,GACJ,GACJ,CACA,SAASszhB,EAAe3ghB,GACpB,OAAOA,EAAMttE,QAAO,SAAU26D,GAAQ,OAA+C,IAAxCgzhB,EAAgB3klB,QAAQ2xD,EAAKlhE,KAAc,GAC5F,CAKA,SAASq0lB,EAASnqgB,GACd,GAAc,OAAVA,EACA,MAAO,GAIX,IAFA,IAAIrW,EAAQ,GAEH72E,EAAI,EAAGA,EAAIktF,EAAMvtF,OAAQK,IAAK,CACnC,IAAIkkE,EAAOgpB,EAAMltF,GACjB62E,EAAM/2E,KAAKokE,EACf,CACA,OAAO2S,CACX,CAEA,SAAS0ghB,EAAezrkB,GACpB,GAAqC,oBAA1BA,EAAK2rkB,iBACZ,OAAOC,EAAqB5rkB,GAEhC,IAAIie,EAAQje,EAAK2rkB,mBAIjB,OAAI1tjB,GAASA,EAAM4tjB,YACRC,EAAa7tjB,GAEjB2tjB,EAAqB5rkB,EAChC,CACA,SAAS87F,EAAQ16B,GACb,OAAOA,EAAMxiF,QAAO,SAAU+Z,EAAKoyD,GAAS,OAAO,QAASpyD,EAAMniB,MAAMiD,QAAQsxE,GAAS+wC,EAAQ/wC,GAAS,CAACA,GAAU,GAAG,GAC5H,CACA,SAAS6ghB,EAAqB5rkB,GAC1B,IAAIo4C,EAAOp4C,EAAK+rkB,YAChB,IAAK3zhB,EACD,OAAO7vC,QAAQywB,OAAOh5B,EAAO,kBAEjC,IAAIgskB,EAAMf,EAAe7yhB,GACzB,OAAO7vC,QAAQC,QAAQwjkB,EAC3B,CAEA,SAASC,EAAUhujB,GACf,OAAO,QAAU1rC,UAAM,OAAQ,GAAQ,WACnC,OAAO,QAAYA,MAAM,SAAUkmE,GAC/B,MAAO,CAAC,EAAcx6B,EAAM4tjB,YAAcC,EAAa7tjB,GAASiujB,EAAcjujB,GAClF,GACJ,GACJ,CAEA,SAAS6tjB,EAAa7tjB,GAClB,IAAIkujB,EAASlujB,EAAMmujB,eACnB,OAAO,IAAI7jkB,SAAQ,SAAUC,EAASwwB,GAClC,IAAIj6B,EAAU,IACd,SAASstkB,IACL,IAAI7jlB,EAAQjW,KAGZ45lB,EAAOE,aAAY,SAAUpje,GAAS,OAAO,QAAUzgH,OAAO,OAAQ,GAAQ,WAC1E,IAAIuiE,EAAOuhhB,EAAOlrgB,EAClB,OAAO,QAAY7uF,MAAM,SAAUkmE,GAC/B,OAAQA,EAAGj3B,OACP,KAAK,EACD,GAAMynF,EAAMp1H,OAAQ,MAAO,CAAC,EAAa,GACzC4kE,EAAGj3B,MAAQ,EACf,KAAK,EAED,OADAi3B,EAAGkD,KAAK3nE,KAAK,CAAC,EAAG,EAAG,CAAE,IACf,CAAC,EAAau0B,QAAQ+b,IAAIvlB,IACrC,KAAK,EAGD,OAFAgsD,EAAQtS,EAAGiD,OACXlzC,EAAQuiD,GACD,CAAC,EAAa,GACzB,KAAK,EAGD,OAFAuhhB,EAAQ7zhB,EAAGiD,OACX1iB,EAAOsziB,GACA,CAAC,EAAa,GACzB,KAAK,EAAG,MAAO,CAAC,EAAa,GAC7B,KAAK,EACDlrgB,EAAQ74D,QAAQ+b,IAAI2kF,EAAMzpH,IAAIyslB,IAC9BltkB,EAAQ/qB,KAAKotF,GAEbirgB,IACA5zhB,EAAGj3B,MAAQ,EACf,KAAK,EAAG,MAAO,CAAC,GAExB,GACJ,GAAI,IAAG,SAAUx1B,GACbgtC,EAAOhtC,EACX,GACJ,CACAqglB,EACJ,GACJ,CAEA,SAASH,EAAcjujB,GACnB,OAAO,QAAU1rC,UAAM,OAAQ,GAAQ,WACnC,OAAO,QAAYA,MAAM,SAAUkmE,GAC/B,MAAO,CAAC,EAAc,IAAIlwC,SAAQ,SAAUC,EAASwwB,GAC7C/a,EAAMm6B,MAAK,SAAUA,GACjB,IAAI4zhB,EAAMf,EAAe7yhB,EAAMn6B,EAAM2b,UACrCpxB,EAAQwjkB,EACZ,IAAG,SAAUhglB,GACTgtC,EAAOhtC,EACX,GACJ,IACR,GACJ,GACJ,eCpMA,SAAS7O,EAAQC,EAAQC,GAAkB,IAAIC,EAAO7C,OAAO6C,KAAKF,GAAS,GAAI3C,OAAO8C,sBAAuB,CAAE,IAAIC,EAAU/C,OAAO8C,sBAAsBH,GAASC,IAAmBG,EAAUA,EAAQC,QAAO,SAAUC,GAAO,OAAOjD,OAAOkD,yBAAyBP,EAAQM,GAAKE,UAAY,KAAKN,EAAKtJ,KAAKmI,MAAMmB,EAAME,EAAU,CAAE,OAAOF,CAAM,CAEpV,SAASO,EAAcC,GAAU,IAAK,IAAI5J,EAAI,EAAGA,EAAI+H,UAAUpI,OAAQK,IAAK,CAAE,IAAI6J,EAAS,MAAQ9B,UAAU/H,GAAK+H,UAAU/H,GAAK,CAAC,EAAGA,EAAI,EAAIiJ,EAAQ1C,OAAOsD,IAAS,GAAInJ,SAAQ,SAAU9B,GAAOw/E,EAAgBx0E,EAAQhL,EAAKiL,EAAOjL,GAAO,IAAK2H,OAAOuD,0BAA4BvD,OAAOwD,iBAAiBH,EAAQrD,OAAOuD,0BAA0BD,IAAWZ,EAAQ1C,OAAOsD,IAASnJ,SAAQ,SAAU9B,GAAO2H,OAAOyD,eAAeJ,EAAQhL,EAAK2H,OAAOkD,yBAAyBI,EAAQjL,GAAO,GAAI,CAAE,OAAOgL,CAAQ,CAEzf,SAASw0E,EAAgB/4E,EAAKzG,EAAKyF,GAAiK,OAApJzF,KAAOyG,EAAOkB,OAAOyD,eAAe3E,EAAKzG,EAAK,CAAEyF,MAAOA,EAAOqF,YAAY,EAAMsO,cAAc,EAAMC,UAAU,IAAkB5S,EAAIzG,GAAOyF,EAAgBgB,CAAK,CAIhN,SAASm5E,EAAen0E,EAAKrK,GAAK,OAUlC,SAAyBqK,GAAO,GAAI/H,MAAMiD,QAAQ8E,GAAM,OAAOA,CAAK,CAV3Bo0E,CAAgBp0E,IAQzD,SAA+BA,EAAKrK,GAAK,IAAI0F,EAAY,MAAP2E,EAAc,KAAyB,qBAAXiN,QAA0BjN,EAAIiN,OAAOC,WAAalN,EAAI,cAAe,GAAU,MAAN3E,EAAY,OAAQ,IAAkDkS,EAAID,EAAlDH,EAAO,GAAQC,GAAK,EAAUC,GAAK,EAAmB,IAAM,IAAKhS,EAAKA,EAAGnD,KAAK8H,KAAQoN,GAAMG,EAAKlS,EAAGhC,QAAQmU,QAAoBL,EAAK1X,KAAK8X,EAAGvT,QAAYrE,GAAKwX,EAAK7X,SAAWK,GAA3DyX,GAAK,GAAkE,CAAE,MAAOK,GAAOJ,GAAK,EAAMC,EAAKG,CAAK,CAAE,QAAU,IAAWL,GAAsB,MAAhB/R,EAAW,QAAWA,EAAW,QAAK,CAAE,QAAU,GAAIgS,EAAI,MAAMC,CAAI,CAAE,CAAE,OAAOH,CAAM,CAR/bknE,CAAsBr0E,EAAKrK,IAI5F,SAAqCiX,EAAGC,GAAU,IAAKD,EAAG,OAAQ,GAAiB,kBAANA,EAAgB,OAAOH,EAAkBG,EAAGC,GAAS,IAAIC,EAAI5Q,OAAOvH,UAAU+E,SAASxB,KAAK0U,GAAG3H,MAAM,GAAI,GAAc,WAAN6H,GAAkBF,EAAE1D,cAAa4D,EAAIF,EAAE1D,YAAYvQ,MAAM,GAAU,QAANmU,GAAqB,QAANA,EAAa,OAAO7U,MAAM8U,KAAKH,GAAI,GAAU,cAANE,GAAqB,2CAA2CE,KAAKF,GAAI,OAAOL,EAAkBG,EAAGC,EAAS,CAJ7TF,CAA4B3M,EAAKrK,IAEnI,WAA8B,MAAM,IAAI+X,UAAU,4IAA8I,CAFvD4mE,EAAoB,CAM7J,SAAS7nE,EAAkBzM,EAAKvG,IAAkB,MAAPA,GAAeA,EAAMuG,EAAI1K,UAAQmE,EAAMuG,EAAI1K,QAAQ,IAAK,IAAIK,EAAI,EAAG+W,EAAO,IAAIzU,MAAMwB,GAAM9D,EAAI8D,EAAK9D,IAAO+W,EAAK/W,GAAKqK,EAAIrK,GAAM,OAAO+W,CAAM,CAQ/K,IAAI6plB,EAAoB,oBACpBC,EAAiB,iBACjBC,EAAiB,iBACjBC,EAAiB,iBAQjB1I,EAA6B,SAAoCC,GAC1EA,EAASh2lB,MAAMiD,QAAQ+ylB,IAA6B,IAAlBA,EAAO34lB,OAAe24lB,EAAO,GAAKA,EACpE,IAAIC,EAAgBj2lB,MAAMiD,QAAQ+ylB,GAAU,UAAU9tlB,OAAO8tlB,EAAO/tlB,KAAK,OAAS+tlB,EAClF,MAAO,CACL5mlB,KAAMkvlB,EACNrpjB,QAAS,qBAAqB/sC,OAAO+tlB,GAEzC,EACWC,EAA0B,SAAiCx/c,GACpE,MAAO,CACLtnI,KAAMmvlB,EACNtpjB,QAAS,uBAAuB/sC,OAAOwuI,EAAS,KAAKxuI,OAAmB,IAAZwuI,EAAgB,OAAS,SAEzF,EACWy/c,EAA0B,SAAiCC,GACpE,MAAO,CACLhnlB,KAAMovlB,EACNvpjB,QAAS,wBAAwB/sC,OAAOkulB,EAAS,KAAKlulB,OAAmB,IAAZkulB,EAAgB,OAAS,SAE1F,EACWC,EAA2B,CACpCjnlB,KAAMqvlB,EACNxpjB,QAAS,kBAIJ,SAASqhjB,EAAa10hB,EAAMo0hB,GACjC,IAAIO,EAA6B,2BAAd30hB,EAAK18D,OAAqC,OAAQ08D,EAAMo0hB,GAC3E,MAAO,CAACO,EAAcA,EAAe,KAAOR,EAA2BC,GACzE,CACO,SAASQ,EAAc50hB,EAAMw0hB,EAAS1/c,GAC3C,GAAI+/c,EAAU70hB,EAAKrtB,MACjB,GAAIkijB,EAAUL,IAAYK,EAAU//c,GAAU,CAC5C,GAAI90E,EAAKrtB,KAAOmiG,EAAS,MAAO,EAAC,EAAOw/c,EAAwBx/c,IAChE,GAAI90E,EAAKrtB,KAAO6hjB,EAAS,MAAO,EAAC,EAAOD,EAAwBC,GAClE,KAAO,IAAIK,EAAUL,IAAYx0hB,EAAKrtB,KAAO6hjB,EAAS,MAAO,EAAC,EAAOD,EAAwBC,IAAe,GAAIK,EAAU//c,IAAY90E,EAAKrtB,KAAOmiG,EAAS,MAAO,EAAC,EAAOw/c,EAAwBx/c,GAAS,CAG7M,MAAO,EAAC,EAAM,KAChB,CAEA,SAAS+/c,EAAU10lB,GACjB,YAAiB9F,IAAV8F,GAAiC,OAAVA,CAChC,CA6BO,SAAS20lB,EAAqBr0jB,GACnC,MAA0C,oBAA/BA,EAAMq0jB,qBACRr0jB,EAAMq0jB,uBAC0B,qBAAvBr0jB,EAAMs0jB,cACft0jB,EAAMs0jB,YAIjB,CACO,SAASC,EAAev0jB,GAC7B,OAAKA,EAAMula,aAMJ5nc,MAAMtD,UAAU8yB,KAAKvvB,KAAKoiC,EAAMula,aAAaivJ,OAAO,SAAU3xlB,GACnE,MAAgB,UAATA,GAA6B,2BAATA,CAC7B,MAPWm9B,EAAM/6B,UAAY+6B,EAAM/6B,OAAOitE,KAQ5C,CAKO,SAASuihB,EAAmBz0jB,GACjCA,EAAM4G,gBACR,CAyBO,SAAS8tjB,IACd,IAAK,IAAIvxlB,EAAOC,UAAUpI,OAAQyhD,EAAM,IAAI9+C,MAAMwF,GAAOtC,EAAO,EAAGA,EAAOsC,EAAMtC,IAC9E47C,EAAI57C,GAAQuC,UAAUvC,GAGxB,OAAO,SAAUm/B,GACf,IAAK,IAAI97B,EAAQd,UAAUpI,OAAQqG,EAAO,IAAI1D,MAAMuG,EAAQ,EAAIA,EAAQ,EAAI,GAAIC,EAAQ,EAAGA,EAAQD,EAAOC,IACxG9C,EAAK8C,EAAQ,GAAKf,UAAUe,GAG9B,OAAOs4C,EAAItvB,MAAK,SAAU9O,GAKxB,OAJKg2kB,EAAqBr0jB,IAAU3hB,GAClCA,EAAG/a,WAAM,EAAQ,CAAC08B,GAAOn6B,OAAOxE,IAG3BgzlB,EAAqBr0jB,EAC9B,GACF,CACF,CAOO,SAASq8jB,IACd,MAAO,uBAAwBj9kB,MACjC,CAQO,SAASk9kB,EAAuB3I,GAErC,OADAA,EAA2B,kBAAXA,EAAsBA,EAAOz2lB,MAAM,KAAOy2lB,EACnD,CAAC,CACNzgjB,YAAa,aAEbygjB,OAAQh2lB,MAAMiD,QAAQ+ylB,GAEpBA,EAAO/ulB,QAAO,SAAUuiB,GACxB,MAAgB,YAATA,GAA+B,YAATA,GAA+B,YAATA,GAA+B,WAATA,GAAqB,iBAAiBzU,KAAKyU,EACtH,IAAGphB,QAAO,SAAUuxB,EAAGC,GACrB,OAAOvyB,EAAcA,EAAc,CAAC,EAAGsyB,GAAI,CAAC,EAAGmiD,EAAgB,CAAC,EAAGliD,EAAG,IACxE,GAAG,CAAC,GAAK,CAAC,GAEd,CC5MA,IAAIpwB,EAAY,CAAC,YACb40kB,EAAa,CAAC,QACdC,EAAa,CAAC,SAAU,OAAQ,YAAa,UAAW,SAAU,UAAW,cAAe,aAAc,cAAe,UACzHugB,EAAa,CAAC,SAAU,WAAY,WAExC,SAASnhlB,EAAmB1V,GAAO,OAMnC,SAA4BA,GAAO,GAAI/H,MAAMiD,QAAQ8E,GAAM,OAAO,GAAkBA,EAAM,CANhDg5kB,CAAmBh5kB,IAI7D,SAA0B2V,GAAQ,GAAsB,qBAAX1I,QAAmD,MAAzB0I,EAAK1I,OAAOC,WAA2C,MAAtByI,EAAK,cAAuB,OAAO1d,MAAM8U,KAAK4I,EAAO,CAJxFsjkB,CAAiBj5kB,IAAQ,GAA4BA,IAE1H,WAAgC,MAAM,IAAI0N,UAAU,uIAAyI,CAF3DwrkB,EAAsB,CAQxJ,SAAS,EAAel5kB,EAAKrK,GAAK,OAUlC,SAAyBqK,GAAO,GAAI/H,MAAMiD,QAAQ8E,GAAM,OAAOA,CAAK,CAV3B,CAAgBA,IAQzD,SAA+BA,EAAKrK,GAAK,IAAI0F,EAAY,MAAP2E,EAAc,KAAyB,qBAAXiN,QAA0BjN,EAAIiN,OAAOC,WAAalN,EAAI,cAAe,GAAU,MAAN3E,EAAY,OAAQ,IAAkDkS,EAAID,EAAlDH,EAAO,GAAQC,GAAK,EAAUC,GAAK,EAAmB,IAAM,IAAKhS,EAAKA,EAAGnD,KAAK8H,KAAQoN,GAAMG,EAAKlS,EAAGhC,QAAQmU,QAAoBL,EAAK1X,KAAK8X,EAAGvT,QAAYrE,GAAKwX,EAAK7X,SAAWK,GAA3DyX,GAAK,GAAkE,CAAE,MAAOK,GAAOJ,GAAK,EAAMC,EAAKG,CAAK,CAAE,QAAU,IAAWL,GAAsB,MAAhB/R,EAAW,QAAWA,EAAW,QAAK,CAAE,QAAU,GAAIgS,EAAI,MAAMC,CAAI,CAAE,CAAE,OAAOH,CAAM,CAR/b,CAAsBnN,EAAKrK,IAAM,GAA4BqK,EAAKrK,IAEnI,WAA8B,MAAM,IAAI+X,UAAU,4IAA8I,CAFvD,EAAoB,CAI7J,SAAS,GAA4Bd,EAAGC,GAAU,GAAKD,EAAL,CAAgB,GAAiB,kBAANA,EAAgB,OAAO,GAAkBA,EAAGC,GAAS,IAAIC,EAAI5Q,OAAOvH,UAAU+E,SAASxB,KAAK0U,GAAG3H,MAAM,GAAI,GAAiE,MAAnD,WAAN6H,GAAkBF,EAAE1D,cAAa4D,EAAIF,EAAE1D,YAAYvQ,MAAgB,QAANmU,GAAqB,QAANA,EAAoB7U,MAAM8U,KAAKH,GAAc,cAANE,GAAqB,2CAA2CE,KAAKF,GAAW,GAAkBF,EAAGC,QAAzG,CAA7O,CAA+V,CAE/Z,SAAS,GAAkB7M,EAAKvG,IAAkB,MAAPA,GAAeA,EAAMuG,EAAI1K,UAAQmE,EAAMuG,EAAI1K,QAAQ,IAAK,IAAIK,EAAI,EAAG+W,EAAO,IAAIzU,MAAMwB,GAAM9D,EAAI8D,EAAK9D,IAAO+W,EAAK/W,GAAKqK,EAAIrK,GAAM,OAAO+W,CAAM,CAMtL,SAAS,GAAQ7N,EAAQC,GAAkB,IAAIC,EAAO7C,OAAO6C,KAAKF,GAAS,GAAI3C,OAAO8C,sBAAuB,CAAE,IAAIC,EAAU/C,OAAO8C,sBAAsBH,GAASC,IAAmBG,EAAUA,EAAQC,QAAO,SAAUC,GAAO,OAAOjD,OAAOkD,yBAAyBP,EAAQM,GAAKE,UAAY,KAAKN,EAAKtJ,KAAKmI,MAAMmB,EAAME,EAAU,CAAE,OAAOF,CAAM,CAEpV,SAAS,GAAcQ,GAAU,IAAK,IAAI5J,EAAI,EAAGA,EAAI+H,UAAUpI,OAAQK,IAAK,CAAE,IAAI6J,EAAS,MAAQ9B,UAAU/H,GAAK+H,UAAU/H,GAAK,CAAC,EAAGA,EAAI,EAAI,GAAQuG,OAAOsD,IAAS,GAAInJ,SAAQ,SAAU9B,GAAO,GAAgBgL,EAAQhL,EAAKiL,EAAOjL,GAAO,IAAK2H,OAAOuD,0BAA4BvD,OAAOwD,iBAAiBH,EAAQrD,OAAOuD,0BAA0BD,IAAW,GAAQtD,OAAOsD,IAASnJ,SAAQ,SAAU9B,GAAO2H,OAAOyD,eAAeJ,EAAQhL,EAAK2H,OAAOkD,yBAAyBI,EAAQjL,GAAO,GAAI,CAAE,OAAOgL,CAAQ,CAEzf,SAAS,GAAgBvE,EAAKzG,EAAKyF,GAAiK,OAApJzF,KAAOyG,EAAOkB,OAAOyD,eAAe3E,EAAKzG,EAAK,CAAEyF,MAAOA,EAAOqF,YAAY,EAAMsO,cAAc,EAAMC,UAAU,IAAkB5S,EAAIzG,GAAOyF,EAAgBgB,CAAK,CAEhN,SAASqQ,GAAyB7L,EAAQ8L,GAAY,GAAc,MAAV9L,EAAgB,MAAO,CAAC,EAAG,IAAkEjL,EAAKoB,EAAnE4J,EAEzF,SAAuCC,EAAQ8L,GAAY,GAAc,MAAV9L,EAAgB,MAAO,CAAC,EAAG,IAA2DjL,EAAKoB,EAA5D4J,EAAS,CAAC,EAAOgM,EAAarP,OAAO6C,KAAKS,GAAqB,IAAK7J,EAAI,EAAGA,EAAI4V,EAAWjW,OAAQK,IAAOpB,EAAMgX,EAAW5V,GAAQ2V,EAASpD,QAAQ3T,IAAQ,IAAagL,EAAOhL,GAAOiL,EAAOjL,IAAQ,OAAOgL,CAAQ,CAFhNo9F,CAA8Bn9F,EAAQ8L,GAAuB,GAAIpP,OAAO8C,sBAAuB,CAAE,IAAIwM,EAAmBtP,OAAO8C,sBAAsBQ,GAAS,IAAK7J,EAAI,EAAGA,EAAI6V,EAAiBlW,OAAQK,IAAOpB,EAAMiX,EAAiB7V,GAAQ2V,EAASpD,QAAQ3T,IAAQ,GAAkB2H,OAAOvH,UAAU8W,qBAAqBvT,KAAKsH,EAAQjL,KAAgBgL,EAAOhL,GAAOiL,EAAOjL,GAAQ,CAAE,OAAOgL,CAAQ,CAwB3e,IAAI0vlB,IAAwB,IAAApylB,aAAW,SAAU2D,EAAM7D,GACrD,IAAIgC,EAAW6B,EAAK7B,SAGhBuwlB,EAAeC,GAFN9jlB,GAAyB7K,EAAMiB,IAGxCq6C,EAAOoziB,EAAapziB,KACpBp/C,EAAQ2O,GAAyB6jlB,EAAc7Y,GAQnD,OANA,IAAAiM,qBAAoB3llB,GAAK,WACvB,MAAO,CACLm/C,KAAMA,EAEV,GAAG,CAACA,IAEgB,gBAAoB,EAAAv+C,SAAU,KAAMoB,EAAS,GAAc,GAAc,CAAC,EAAGjC,GAAQ,CAAC,EAAG,CAC3Go/C,KAAMA,KAEV,IACAmziB,GAAShzkB,YAAc,WAEvB,IAAIypD,GAAe,CACjBy2T,UAAU,EACVizN,kBF5DK,SAAmBrC,GACtB,OAAO,QAAU/4lB,UAAM,OAAQ,GAAQ,WACnC,OAAO,QAAYA,MAAM,SAAUkmE,GAC/B,OAAItyB,EAASmljB,IAcdnljB,EAdqCmljB,EActBltJ,cAbH,CAAC,EAAcotJ,EAAqBF,EAAIltJ,aAAcktJ,EAAI5vlB,OAejF,SAAqBnD,GACjB,OAAO4tC,EAAS5tC,IAAU4tC,EAAS5tC,EAAMuF,OAC7C,CAfqBu3lB,CAAY/J,GACV,CAAC,EAAcD,EAAcC,IAE/B90lB,MAAMiD,QAAQ6xlB,IAAQA,EAAIt6jB,OAAM,SAAUhR,GAAQ,MAAO,YAAaA,GAAgC,oBAAjBA,EAAK60kB,OAAwB,IAChH,CAAC,EAAcD,EAAiBtJ,IAEpC,CAAC,EAAc,GAC1B,GACJ,GACJ,EE8CEp+c,QAASnoD,IACT6ngB,QAAS,EACTgB,UAAU,EACVC,SAAU,EACVC,uBAAuB,EACvBC,SAAS,EACTC,YAAY,EACZC,QAAQ,EACRC,sBAAsB,EACtBvwiB,UAAW,KACX23iB,gBAAgB,GAElB9H,GAASvphB,aAAeA,GACxBuphB,GAASxphB,UAAY,CAiBnB9mE,SAAU,SAUVsvlB,OAAQ,cAAoB,CAAC,WAAkB,YAAkB,cAKjEoB,SAAU,SAKVE,sBAAuB,SAKvBC,QAAS,SAMTC,WAAY,SAKZC,OAAQ,SAKRC,qBAAsB,SAKtBtB,QAAS,WAKT1/c,QAAS,WAMT2gd,SAAU,WAKVnzN,SAAU,SAOVizN,kBAAmB,SAKnBQ,mBAAoB,SAKpBoH,iBAAkB,SAMlBD,eAAgB,SAOhBt9J,YAAa,SAObI,YAAa,SAObg2J,WAAY,SAgCZC,OAAQ,SASRC,eAAgB,SAShBC,eAAgB,SAOhB5wiB,UAAW,UAEb,IAiEIwlE,GAAe,CACjBq5V,WAAW,EACXgyI,oBAAoB,EACpBC,cAAc,EACdC,cAAc,EACdC,cAAc,EACdC,aAAc,GACd7yC,cAAe,GACf8yC,eAAgB,IA8EX,SAASnB,KACd,IAAIp7lB,EAAU2J,UAAUpI,OAAS,QAAsBpB,IAAjBwJ,UAAU,GAAmBA,UAAU,GAAK,CAAC,EAE/E6ylB,EAAwB,GAAc,GAAc,CAAC,EAAG7qhB,IAAe3xE,GACvEk6lB,EAASsC,EAAsBtC,OAC/B9xN,EAAWo0N,EAAsBp0N,SACjCizN,EAAoBmB,EAAsBnB,kBAC1Czgd,EAAU4hd,EAAsB5hd,QAChC0/c,EAAUkC,EAAsBlC,QAChCgB,EAAWkB,EAAsBlB,SACjCC,EAAWiB,EAAsBjB,SACjC71J,EAAc82J,EAAsB92J,YACpCI,EAAc02J,EAAsB12J,YACpCg2J,EAAaU,EAAsBV,WACnCC,EAASS,EAAsBT,OAC/BC,EAAiBQ,EAAsBR,eACvCC,EAAiBO,EAAsBP,eACvCJ,EAAqBW,EAAsBX,mBAC3CoH,EAAmBzG,EAAsByG,iBACzCD,EAAiBxG,EAAsBwG,eACvCxH,EAAwBgB,EAAsBhB,sBAC9CC,EAAUe,EAAsBf,QAChCC,EAAac,EAAsBd,WACnCC,EAASa,EAAsBb,OAC/BC,EAAuBY,EAAsBZ,qBAC7CvwiB,EAAYmxiB,EAAsBnxiB,UAElC63iB,GAAqB,IAAA37kB,UAAQ,WAC/B,MAAmC,oBAArB07kB,EAAkCA,EAAmBx9kB,EACrE,GAAG,CAACw9kB,IACAE,GAAuB,IAAA57kB,UAAQ,WACjC,MAAqC,oBAAvBs0kB,EAAoCA,EAAqBp2kB,EACzE,GAAG,CAACo2kB,IACAY,GAAU,IAAAt7kB,QAAO,MACjBu7kB,GAAW,IAAAv7kB,QAAO,MAGlBw7kB,EAAe,GADD,IAAAtO,YAAWh5iB,GAASw7E,IACS,GAC3CvmG,EAAQqykB,EAAa,GACrB5O,EAAW4O,EAAa,GAExBzyI,EAAY5/b,EAAM4/b,UAClBgyI,EAAqB5xkB,EAAM4xkB,mBAC3BI,EAAehykB,EAAMgykB,aAErBO,EAAgB,WAEdX,GACFxzkB,YAAW,WACLg0kB,EAAS55lB,UACC45lB,EAAS55lB,QAAQ21E,MAElBl3E,SACTwslB,EAAS,CACP3klB,KAAM,gBAER+5lB,KAGN,GAAG,IAEP,GAEA,IAAA3hlB,YAAU,WACR,OAAIwhlB,GAAkBJ,IACb,WAAa,GAGtBj9kB,OAAO8Q,iBAAiB,QAASomkB,GAAe,GACzC,WACLl3kB,OAAO+Q,oBAAoB,QAASmmkB,GAAe,EACrD,EACF,GAAG,CAACH,EAAUR,EAAoBiH,EAAsBH,IACxD,IAAI3F,GAAiB,IAAAl8kB,QAAO,IAExBm8kB,EAAiB,SAAwB/2jB,GACvCk2jB,EAAQ35lB,SAAW25lB,EAAQ35lB,QAAQy2B,SAASgN,EAAM/6B,UAKtD+6B,EAAM4G,iBACNkwjB,EAAev6lB,QAAU,GAC3B,GAEA,IAAA0e,YAAU,WAMR,OALIg6kB,IACFv6lB,SAASw1B,iBAAiB,WAAYukkB,GAAoB,GAC1D/5lB,SAASw1B,iBAAiB,OAAQ6mkB,GAAgB,IAG7C,WACD9B,IACFv6lB,SAASy1B,oBAAoB,WAAYskkB,GACzC/5lB,SAASy1B,oBAAoB,OAAQ4mkB,GAEzC,CACF,GAAG,CAACb,EAASjB,IACb,IAAI+B,GAAgB,IAAAhllB,cAAY,SAAUguB,GACxCA,EAAM4G,iBAEN5G,EAAMi3jB,UACN9ob,GAAgBnuI,GAChB82jB,EAAev6lB,QAAU,GAAGsJ,OAAOuV,EAAmB07kB,EAAev6lB,SAAU,CAACyjC,EAAM/6B,SAElFsvlB,EAAev0jB,IACjBtQ,QAAQC,QAAQmlkB,EAAkB90jB,IAAQ7wB,MAAK,SAAU4mlB,GACnD1B,EAAqBr0jB,KAAWq1jB,IAIpC7N,EAAS,CACPuO,aAAcA,EACdH,cAAc,EACd/ylB,KAAM,oBAGJs8b,GACFA,EAAYn/Z,GAEhB,GAEJ,GAAG,CAAC80jB,EAAmB31J,EAAak2J,IAChC6B,GAAe,IAAAlllB,cAAY,SAAUguB,GACvCA,EAAM4G,iBACN5G,EAAMi3jB,UACN9ob,GAAgBnuI,GAChB,IAAIm3jB,EAAW5C,EAAev0jB,GAE9B,GAAIm3jB,GAAYn3jB,EAAMula,aACpB,IACEvla,EAAMula,aAAa6xJ,WAAa,MAClC,CAAE,MAAOC,GAAU,CASrB,OAJIF,GAAY5B,GACdA,EAAWv1jB,IAGN,CACT,GAAG,CAACu1jB,EAAYF,IACZiC,IAAgB,IAAAtllB,cAAY,SAAUguB,GACxCA,EAAM4G,iBACN5G,EAAMi3jB,UACN9ob,GAAgBnuI,GAEhB,IAAI0b,EAAUo7iB,EAAev6lB,QAAQqI,QAAO,SAAUK,GACpD,OAAOixlB,EAAQ35lB,SAAW25lB,EAAQ35lB,QAAQy2B,SAAS/tB,EACrD,IAGIsylB,EAAY77iB,EAAQ9tC,QAAQoyB,EAAM/6B,SAEnB,IAAfsylB,GACF77iB,EAAQ3wC,OAAOwslB,EAAW,GAG5BT,EAAev6lB,QAAUm/C,EAErBA,EAAQ1gD,OAAS,IAIrBwslB,EAAS,CACPoO,cAAc,EACd/ylB,KAAM,kBACNkzlB,aAAc,KAGZxB,EAAev0jB,IAAUu/Z,GAC3BA,EAAYv/Z,GAEhB,GAAG,CAACk2jB,EAAS32J,EAAa81J,IACtBwH,IAAW,IAAA7qlB,cAAY,SAAUkgE,EAAOlyC,GAC1C,IAAIkjhB,EAAgB,GAChB8yC,EAAiB,GACrB9jhB,EAAMn2E,SAAQ,SAAUwjE,GACtB,IACIk4hB,EAAiB,EADDxD,EAAa10hB,EAAMo0hB,GACY,GAC/C+D,EAAWD,EAAe,GAC1BE,EAAcF,EAAe,GAG7BG,EAAkB,EADDzD,EAAc50hB,EAAMw0hB,EAAS1/c,GACG,GACjDwjd,EAAYD,EAAgB,GAC5BE,EAAYF,EAAgB,GAE5BG,EAAejziB,EAAYA,EAAUya,GAAQ,KAEjD,GAAIm4hB,GAAYG,IAAcE,EAC5B70C,EAAc/njB,KAAKokE,OACd,CACL,IAAI4igB,EAAS,CAACw1B,EAAaG,GAEvBC,IACF51B,EAASA,EAAOt8jB,OAAOkylB,IAGzB/B,EAAe76lB,KAAK,CAClBokE,KAAMA,EACN4igB,OAAQA,EAAOv9jB,QAAO,SAAU/I,GAC9B,OAAOA,CACT,KAEJ,CACF,MAEKk5lB,GAAY7xC,EAAclojB,OAAS,GAAK+5lB,GAAYC,GAAY,GAAK9xC,EAAclojB,OAASg6lB,KAE/F9xC,EAAcnnjB,SAAQ,SAAUwjE,GAC9By2hB,EAAe76lB,KAAK,CAClBokE,KAAMA,EACN4igB,OAAQ,CAAC6xB,IAEb,IACA9wC,EAAcn4iB,OAAO,IAGvBy8kB,EAAS,CACPtkC,cAAeA,EACf8yC,eAAgBA,EAChBnzlB,KAAM,aAGJ2ylB,GACFA,EAAOtyC,EAAe8yC,EAAgBh2jB,GAGpCg2jB,EAAeh7lB,OAAS,GAAK06lB,GAC/BA,EAAeM,EAAgBh2jB,GAG7BkjhB,EAAclojB,OAAS,GAAKy6lB,GAC9BA,EAAevyC,EAAeljhB,EAElC,GAAG,CAACwnjB,EAAUuN,EAAUpB,EAAQI,EAAS1/c,EAAS2gd,EAAUQ,EAAQC,EAAgBC,EAAgB5wiB,IAChG0yiB,IAAW,IAAAxllB,cAAY,SAAUguB,GACnCA,EAAM4G,iBAEN5G,EAAMi3jB,UACN9ob,GAAgBnuI,GAChB82jB,EAAev6lB,QAAU,GAErBg4lB,EAAev0jB,IACjBtQ,QAAQC,QAAQmlkB,EAAkB90jB,IAAQ7wB,MAAK,SAAU+iE,GACnDmihB,EAAqBr0jB,KAAWq1jB,GAIpCwH,GAAS3qhB,EAAOlyC,EAClB,IAGFwnjB,EAAS,CACP3klB,KAAM,SAEV,GAAG,CAACiylB,EAAmB+H,GAAUxH,IAE7BgB,IAAiB,IAAArklB,cAAY,WAC/B,GAAIyqlB,GAAkBJ,IAAtB,CACE7U,EAAS,CACP3klB,KAAM,eAER85lB,IAEA,IAAI96kB,EAAO,CACTkzkB,SAAUA,EACVP,MAAO8H,EAAuB3I,IAEhCv0kB,OAAO09kB,mBAAmBj7kB,GAAM1S,MAAK,SAAUorH,GAC7C,OAAOu6d,EAAkBv6d,EAC3B,IAAGprH,MAAK,SAAU+iE,GAChB,OAAO2qhB,GAAS3qhB,EAAO,KACzB,IAAGx/B,OAAM,SAAU72C,GACjB,OAAO+gmB,EAAqB/gmB,EAC9B,IAAGkhmB,SAAQ,WACT,OAAOvV,EAAS,CACd3klB,KAAM,eAEV,GAEF,MAEIszlB,EAAS55lB,UACXirlB,EAAS,CACP3klB,KAAM,eAER85lB,IACAxG,EAAS55lB,QAAQmD,MAAQ,KACzBy2lB,EAAS55lB,QAAQuigB,QAErB,GAAG,CAAC0oF,EAAUmV,EAAoBC,EAAsBH,EAAgBI,GAAUlJ,EAAQoB,IAEtFwB,IAAc,IAAAvklB,cAAY,SAAUguB,GAEjCk2jB,EAAQ35lB,SAAY25lB,EAAQ35lB,QAAQi6lB,YAAYx2jB,EAAM/6B,UAIrC,KAAlB+6B,EAAMuwW,SAAoC,KAAlBvwW,EAAMuwW,UAChCvwW,EAAM4G,iBACNyvjB,MAEJ,GAAG,CAACH,EAASC,EAAUE,KAEnBI,IAAY,IAAAzklB,cAAY,WAC1Bw1kB,EAAS,CACP3klB,KAAM,SAEV,GAAG,IACC6zlB,IAAW,IAAA1klB,cAAY,WACzBw1kB,EAAS,CACP3klB,KAAM,QAEV,GAAG,IAEC8zlB,IAAY,IAAA3klB,cAAY,WACtBkjlB,KD1lBD,WACL,IAAI5tkB,EAAYlkB,UAAUpI,OAAS,QAAsBpB,IAAjBwJ,UAAU,GAAmBA,UAAU,GAAKgc,OAAO4H,UAAUM,UACrG,OAVF,SAAcA,GACZ,OAAsC,IAA/BA,EAAU1Z,QAAQ,UAAqD,IAAnC0Z,EAAU1Z,QAAQ,WAC/D,CAQSgplB,CAAKtvkB,IANd,SAAgBA,GACd,OAAuC,IAAhCA,EAAU1Z,QAAQ,QAC3B,CAI4B8zE,CAAOp6D,EACnC,CC8lBQuvkB,GAGFR,KAFAl0kB,WAAWk0kB,GAAgB,GAI/B,GAAG,CAACF,EAAUjB,EAASmB,KAEnB2B,GAAiB,SAAwB35kB,GAC3C,OAAOwjX,EAAW,KAAOxjX,CAC3B,EAEI45kB,GAAyB,SAAgC55kB,GAC3D,OAAO82kB,EAAa,KAAO6C,GAAe35kB,EAC5C,EAEI65kB,GAAqB,SAA4B75kB,GACnD,OAAO+2kB,EAAS,KAAO4C,GAAe35kB,EACxC,EAEI8vJ,GAAkB,SAAyBnuI,GACzCq1jB,GACFr1jB,EAAMmuI,iBAEV,EAEIgqb,IAAe,IAAAn3kB,UAAQ,WACzB,OAAO,WACL,IAAI1Z,EAAQlE,UAAUpI,OAAS,QAAsBpB,IAAjBwJ,UAAU,GAAmBA,UAAU,GAAK,CAAC,EAC7Eg1lB,EAAe9wlB,EAAM+wlB,OACrBA,OAA0B,IAAjBD,EAA0B,MAAQA,EAC3Cp2jB,EAAO16B,EAAM06B,KACbgE,EAAY1+B,EAAM0+B,UAClBkB,EAAU5/B,EAAM4/B,QAChBC,EAAS7/B,EAAM6/B,OACfT,EAAUp/B,EAAMo/B,QAChBy4Z,EAAc73b,EAAM63b,YACpBo2J,EAAajulB,EAAMiulB,WACnBh2J,EAAcj4b,EAAMi4b,YACpBi2J,EAASlulB,EAAMkulB,OACfxolB,EAAO+D,GAAyBzJ,EAAO00kB,GAE3C,OAAO,GAAc,GAAc,GAAgB,CACjDh2iB,UAAWiyjB,GAAuBvD,EAAqB1ujB,EAAWuwjB,KAClErvjB,QAAS+wjB,GAAuBvD,EAAqBxtjB,EAASuvjB,KAC9DtvjB,OAAQ8wjB,GAAuBvD,EAAqBvtjB,EAAQuvjB,KAC5DhwjB,QAASsxjB,GAAetD,EAAqBhujB,EAASiwjB,KACtDx3J,YAAa+4J,GAAmBxD,EAAqBv1J,EAAa63J,IAClEzB,WAAY2C,GAAmBxD,EAAqBa,EAAY2B,IAChE33J,YAAa24J,GAAmBxD,EAAqBn1J,EAAa+3J,KAClE9B,OAAQ0C,GAAmBxD,EAAqBc,EAAQgC,KACxDx1jB,KAAsB,kBAATA,GAA8B,KAATA,EAAcA,EAAO,UACtDq2jB,EAAQnC,GAAWr0N,GAAaszN,EAE/B,CAAC,EAF2C,CAC9C11N,SAAU,IACHzyX,EACX,CACF,GAAG,CAACkplB,EAASK,GAAaE,GAAWC,GAAUC,GAAWK,EAAeE,EAAcI,GAAeE,GAAUrC,EAAYC,EAAQvzN,IAChIy2N,IAAsB,IAAAtmlB,cAAY,SAAUguB,GAC9CA,EAAMmuI,iBACR,GAAG,IACCoqb,IAAgB,IAAAv3kB,UAAQ,WAC1B,OAAO,WACL,IAAI/X,EAAQ7F,UAAUpI,OAAS,QAAsBpB,IAAjBwJ,UAAU,GAAmBA,UAAU,GAAK,CAAC,EAC7Eo1lB,EAAevvlB,EAAMovlB,OACrBA,OAA0B,IAAjBG,EAA0B,MAAQA,EAC3C/mhB,EAAWxoE,EAAMwoE,SACjB/qC,EAAUz9B,EAAMy9B,QAChB15B,EAAO+D,GAAyB9H,EAAOszlB,GAe3C,OAAO,GAAc,GAAc,CAAC,EAbnB,GAAgB,CAC/B5I,OAAQA,EACRoB,SAAUA,EACVlylB,KAAM,OACNuD,MAAO,CACLuC,QAAS,QAEX8oE,SAAUumhB,GAAetD,EAAqBjjhB,EAAU+lhB,KACxD9wjB,QAASsxjB,GAAetD,EAAqBhujB,EAAS4xjB,KACtDG,aAAc,MACdh5N,UAAW,GACV44N,EAAQlC,IAEyCnplB,EACtD,CACF,GAAG,CAACmplB,EAAUxC,EAAQoB,EAAUyC,GAAU31N,IACtC62N,GAAY3C,EAAa/6lB,OACzB66lB,GAAe6C,GAAY,GDrvB1B,SAA0BxylB,GAC/B,IAAIgsE,EAAQhsE,EAAKgsE,MACbyhhB,EAASztlB,EAAKytlB,OACdI,EAAU7tlB,EAAK6tlB,QACf1/c,EAAUnuI,EAAKmuI,QACf0gd,EAAW7ulB,EAAK6ulB,SAChBC,EAAW9ulB,EAAK8ulB,SAEpB,SAAKD,GAAY7ihB,EAAMl3E,OAAS,GAAK+5lB,GAAYC,GAAY,GAAK9ihB,EAAMl3E,OAASg6lB,IAI1E9ihB,EAAM/5C,OAAM,SAAUonC,GAC3B,IAEIm4hB,EADiB79gB,EADDo6gB,EAAa10hB,EAAMo0hB,GACY,GACrB,GAI1BkE,EADkBh+gB,EADDs6gB,EAAc50hB,EAAMw0hB,EAAS1/c,GACG,GACrB,GAEhC,OAAOqjd,GAAYG,CACrB,GACF,CC8tBsCc,CAAiB,CACnDzmhB,MAAO6jhB,EACPpC,OAAQA,EACRI,QAASA,EACT1/c,QAASA,EACT0gd,SAAUA,EACVC,SAAUA,IAERc,GAAe4C,GAAY,IAAM7C,GACrC,OAAO,GAAc,GAAc,CAAC,EAAG9xkB,GAAQ,CAAC,EAAG,CACjD8xkB,aAAcA,GACdC,aAAcA,GACdnyI,UAAWA,IAAc9hF,EACzBs2N,aAAcA,GACdI,cAAeA,GACfrC,QAASA,EACTC,SAAUA,EACV30iB,KAAMw2iB,GAAe3B,KAEzB,CAEA,SAASvnjB,GAAQ/qB,EAAOzF,GAEtB,OAAQA,EAAOzb,MACb,IAAK,QACH,OAAO,GAAc,GAAc,CAAC,EAAGkhB,GAAQ,CAAC,EAAG,CACjD4/b,WAAW,IAGf,IAAK,OACH,OAAO,GAAc,GAAc,CAAC,EAAG5/b,GAAQ,CAAC,EAAG,CACjD4/b,WAAW,IAGf,IAAK,aACH,OAAO,GAAc,GAAc,CAAC,EAAGr5V,IAAe,CAAC,EAAG,CACxDqre,oBAAoB,IAGxB,IAAK,cACH,OAAO,GAAc,GAAc,CAAC,EAAG5xkB,GAAQ,CAAC,EAAG,CACjD4xkB,oBAAoB,IAGxB,IAAK,kBAEH,IAAIC,EAAet3kB,EAAOs3kB,aACtBG,EAAez3kB,EAAOy3kB,aAC1B,OAAO,GAAc,GAAc,CAAC,EAAGhykB,GAAQ,CAAC,EAAG,CACjDgykB,aAAcA,EACdH,aAAcA,IAGlB,IAAK,WACH,OAAO,GAAc,GAAc,CAAC,EAAG7xkB,GAAQ,CAAC,EAAG,CACjDm/hB,cAAe5kiB,EAAO4kiB,cACtB8yC,eAAgB13kB,EAAO03kB,iBAG3B,IAAK,QACH,OAAO,GAAc,CAAC,EAAG1re,IAE3B,QACE,OAAOvmG,EAEb,CAEA,SAAS7E,KAAQ,CCt4BF,SAAS7E,KAYtB,OAXAA,GAAWzY,OAAOsF,OAAStF,OAAOsF,OAAOwlC,OAAS,SAAUznC,GAC1D,IAAK,IAAI5J,EAAI,EAAGA,EAAI+H,UAAUpI,OAAQK,IAAK,CACzC,IAAI6J,EAAS9B,UAAU/H,GACvB,IAAK,IAAIpB,KAAOiL,EACVtD,OAAOvH,UAAUwH,eAAejE,KAAKsH,EAAQjL,KAC/CgL,EAAOhL,GAAOiL,EAAOjL,GAG3B,CACA,OAAOgL,CACT,EACOoV,GAAS/W,MAAM5J,KAAM0J,UAC9B,gBCZe,SAAS,GAAyB8B,EAAQ8L,GACvD,GAAc,MAAV9L,EAAgB,MAAO,CAAC,EAC5B,IACIjL,EAAKoB,EADL4J,ECHS,SAAuCC,EAAQ8L,GAC5D,GAAc,MAAV9L,EAAgB,MAAO,CAAC,EAC5B,IAEIjL,EAAKoB,EAFL4J,EAAS,CAAC,EACVgM,EAAarP,OAAO6C,KAAKS,GAE7B,IAAK7J,EAAI,EAAGA,EAAI4V,EAAWjW,OAAQK,IACjCpB,EAAMgX,EAAW5V,GACb2V,EAASpD,QAAQ3T,IAAQ,IAC7BgL,EAAOhL,GAAOiL,EAAOjL,IAEvB,OAAOgL,CACT,CDRe,CAA6BC,EAAQ8L,GAElD,GAAIpP,OAAO8C,sBAAuB,CAChC,IAAIwM,EAAmBtP,OAAO8C,sBAAsBQ,GACpD,IAAK7J,EAAI,EAAGA,EAAI6V,EAAiBlW,OAAQK,IACvCpB,EAAMiX,EAAiB7V,GACnB2V,EAASpD,QAAQ3T,IAAQ,GACxB2H,OAAOvH,UAAU8W,qBAAqBvT,KAAKsH,EAAQjL,KACxDgL,EAAOhL,GAAOiL,EAAOjL,GAEzB,CACA,OAAOgL,CACT,CEfe,SAAS,GAAQvE,GAG9B,OAAO,GAAU,mBAAqBiS,QAAU,iBAAmBA,OAAOC,SAAW,SAAUlS,GAC7F,cAAcA,CAChB,EAAI,SAAUA,GACZ,OAAOA,GAAO,mBAAqBiS,QAAUjS,EAAIkO,cAAgB+D,QAAUjS,IAAQiS,OAAOtY,UAAY,gBAAkBqG,CAC1H,EAAG,GAAQA,EACb,iBCRe,SAAS,GAAgB6a,EAAUC,GAChD,KAAMD,aAAoBC,GACxB,MAAM,IAAIpI,UAAU,oCAExB,CCFe,SAAS4plB,GAAel5lB,GACrC,IAAI7J,ECFS,SAAsBgxF,EAAOgygB,GAC1C,GAAuB,WAAnB,GAAQhygB,IAAiC,OAAVA,EAAgB,OAAOA,EAC1D,IAAIiygB,EAAOjygB,EAAMt4E,OAAOqziB,aACxB,QAAapsjB,IAATsjmB,EAAoB,CACtB,IAAIp7hB,EAAMo7hB,EAAKt/lB,KAAKqtF,EAAOgygB,GAAQ,WACnC,GAAqB,WAAjB,GAAQn7hB,GAAmB,OAAOA,EACtC,MAAM,IAAI1uD,UAAU,+CACtB,CACA,OAAiB,WAAT6plB,EAAoBr6kB,OAASD,QAAQsoE,EAC/C,CDPY,CAAYnnF,EAAK,UAC3B,MAAwB,WAAjB,GAAQ7J,GAAoBA,EAAM2oB,OAAO3oB,EAClD,CEJA,SAASwhB,GAAkBxW,EAAQ7C,GACjC,IAAK,IAAI/G,EAAI,EAAGA,EAAI+G,EAAMpH,OAAQK,IAAK,CACrC,IAAIqgB,EAAatZ,EAAM/G,GACvBqgB,EAAW3W,WAAa2W,EAAW3W,aAAc,EACjD2W,EAAWrI,cAAe,EACtB,UAAWqI,IAAYA,EAAWpI,UAAW,GACjD1R,OAAOyD,eAAeJ,EAAQ,GAAcyW,EAAWzhB,KAAMyhB,EAC/D,CACF,CACe,SAAS,GAAaF,EAAaI,EAAYC,GAM5D,OALID,GAAYH,GAAkBD,EAAYnhB,UAAWuhB,GACrDC,GAAaJ,GAAkBD,EAAaK,GAChDja,OAAOyD,eAAemW,EAAa,YAAa,CAC9ClI,UAAU,IAELkI,CACT,CCjBe,SAASkB,GAAgBpK,EAAGqK,GAKzC,OAJAD,GAAkB9a,OAAOsa,eAAiBta,OAAOsa,eAAewwB,OAAS,SAAyBp6B,EAAGqK,GAEnG,OADArK,EAAE8J,UAAYO,EACPrK,CACT,EACOoK,GAAgBpK,EAAGqK,EAC5B,CCLe,SAAS,GAAUQ,EAAUC,GAC1C,GAA0B,oBAAfA,GAA4C,OAAfA,EACtC,MAAM,IAAIhK,UAAU,sDAEtB+J,EAAS9iB,UAAYuH,OAAOyb,OAAOD,GAAcA,EAAW/iB,UAAW,CACrEuU,YAAa,CACXlP,MAAOyd,EACP7J,UAAU,EACVD,cAAc,KAGlBzR,OAAOyD,eAAe8X,EAAU,YAAa,CAC3C7J,UAAU,IAER8J,GAAY,GAAeD,EAAUC,EAC3C,CCfe,SAAS,GAAgB1c,EAAKzG,EAAKyF,GAYhD,OAXAzF,EAAM,GAAcA,MACTyG,EACTkB,OAAOyD,eAAe3E,EAAKzG,EAAK,CAC9ByF,MAAOA,EACPqF,YAAY,EACZsO,cAAc,EACdC,UAAU,IAGZ5S,EAAIzG,GAAOyF,EAENgB,CACT,iBCDA,SAAS,GAAgBA,EAAKzG,EAAKyF,GAYjC,OAXIzF,KAAOyG,EACTkB,OAAOyD,eAAe3E,EAAKzG,EAAK,CAC9ByF,MAAOA,EACPqF,YAAY,EACZsO,cAAc,EACdC,UAAU,IAGZ5S,EAAIzG,GAAOyF,EAGNgB,CACT,CAEA,SAAS,GAAQ6D,EAAQC,GACvB,IAAIC,EAAO7C,OAAO6C,KAAKF,GAEvB,GAAI3C,OAAO8C,sBAAuB,CAChC,IAAIC,EAAU/C,OAAO8C,sBAAsBH,GACvCC,IAAgBG,EAAUA,EAAQC,QAAO,SAAUC,GACrD,OAAOjD,OAAOkD,yBAAyBP,EAAQM,GAAKE,UACtD,KACAN,EAAKtJ,KAAKmI,MAAMmB,EAAME,EACxB,CAEA,OAAOF,CACT,CAEA,SAAS,GAAeQ,GACtB,IAAK,IAAI5J,EAAI,EAAGA,EAAI+H,UAAUpI,OAAQK,IAAK,CACzC,IAAI6J,EAAyB,MAAhB9B,UAAU/H,GAAa+H,UAAU/H,GAAK,CAAC,EAEhDA,EAAI,EACN,GAAQuG,OAAOsD,IAAS,GAAMnJ,SAAQ,SAAU9B,GAC9C,GAAgBgL,EAAQhL,EAAKiL,EAAOjL,GACtC,IACS2H,OAAOuD,0BAChBvD,OAAOwD,iBAAiBH,EAAQrD,OAAOuD,0BAA0BD,IAEjE,GAAQtD,OAAOsD,IAASnJ,SAAQ,SAAU9B,GACxC2H,OAAOyD,eAAeJ,EAAQhL,EAAK2H,OAAOkD,yBAAyBI,EAAQjL,GAC7E,GAEJ,CAEA,OAAOgL,CACT,CAEA,SAASgX,GAAgB3J,GAIvB,OAHA2J,GAAkBra,OAAOsa,eAAiBta,OAAOua,eAAiB,SAAyB7J,GACzF,OAAOA,EAAE8J,WAAaxa,OAAOua,eAAe7J,EAC9C,EACO2J,GAAgB3J,EACzB,CAuBA,SAAS0K,GAA2BjB,EAAMne,GACxC,OAAIA,GAAyB,kBAATA,GAAqC,oBAATA,EATlD,SAAgCme,GAC9B,QAAa,IAATA,EACF,MAAM,IAAIC,eAAe,6DAG3B,OAAOD,CACT,CAOSD,CAAuBC,GAHrBne,CAIX,CAEA,SAAS,GAAaqQ,GACpB,IAAIC,EA9BN,WACE,GAAuB,qBAAZC,UAA4BA,QAAQC,UAAW,OAAO,EACjE,GAAID,QAAQC,UAAUC,KAAM,OAAO,EACnC,GAAqB,oBAAVC,MAAsB,OAAO,EAExC,IAEE,OADAyU,KAAK1oB,UAAU+E,SAASxB,KAAKuQ,QAAQC,UAAU2U,KAAM,IAAI,WAAa,MAC/D,CACT,CAAE,MAAOlnB,GACP,OAAO,CACT,CACF,CAmBkC4S,GAChC,OAAO,WACL,IACIvN,EADAwN,EAAQuN,GAAgBhO,GAG5B,GAAIC,EAA2B,CAC7B,IAAIS,EAAYsN,GAAgBviB,MAAMkV,YACtC1N,EAASiN,QAAQC,UAAUM,EAAOtL,UAAWuL,EAC/C,MACEzN,EAASwN,EAAMpL,MAAM5J,KAAM0J,WAG7B,OAAO4Z,GAA2BtjB,KAAMwH,EAC1C,CACF,CAKA,IAAI,GAAO,WAAiB,EAc5B,SAASi8lB,GAAkB//lB,EAAQiB,GACjC,OAAKA,EAEkB,MAAZA,EAAK,GACPjB,EAASiB,EAETjB,EAAS,KAAOiB,EAJhBjB,CAMX,CAEA,SAASuB,GAAWvB,EAAQ2mB,EAAOllB,GACjC,IAAI6G,EAAM,CAAC7G,GAEX,GAAIklB,GAAS3mB,EACX,IAAK,IAAInD,KAAO8pB,EACVA,EAAMliB,eAAe5H,IAAQ8pB,EAAM9pB,IACrCyL,EAAIvK,KAAK,GAAG0K,OAAOs3lB,GAAkB//lB,EAAQnD,KAKnD,OAAOyL,EAAId,QAAO,SAAUvJ,GAC1B,OAAOA,CACT,IAAGsL,KAAI,SAAUtL,GACf,OAAOunB,OAAOvnB,GAAGq1C,MACnB,IAAG9qC,KAAK,IACV,CAIA,IAAIw3lB,GAAa,SAAoB19lB,GACnC,OAAI/B,MAAMiD,QAAQlB,GAAeA,EAAMkF,OAAO2J,SACvB,WAAnB,GAAQ7O,IAAiC,OAAVA,EAAuB,CAACA,GACpD,EACT,EAII29lB,GAAmB,SAA0Bj7lB,GAiB/C,OAfAA,EAAMvD,UACFuD,EAAMk7lB,WACNl7lB,EAAM6B,GACN7B,EAAMmpC,UACNnpC,EAAM0qD,SACN1qD,EAAM08G,SACN18G,EAAMm7lB,QACNn7lB,EAAMyzX,MACNzzX,EAAM3I,QACN2I,EAAMo7lB,aACNp7lB,EAAMq7lB,YACNr7lB,EAAM+wF,SACN/wF,EAAMM,MAGH,GAAe,CAAC,EAFF,GAAyBN,EAAO,CAAC,YAAa,aAAc,KAAM,YAAa,WAAY,WAAY,UAAW,QAAS,UAAW,eAAgB,cAAe,WAAY,UAGxM,EAeA,SAASs7lB,GAAkB3ojB,GACzB,MAAO,CAACr6C,SAASwuB,gBAAiBxuB,SAASkwB,KAAMxL,QAAQxR,QAAQmnC,IAAO,CAC1E,CAGA,SAASkqf,GAAalqf,GACpB,OAAI2ojB,GAAkB3ojB,GACb31B,OAAO0J,YAGTisB,EAAGlsB,SACZ,CACA,SAAS4/d,GAAS1zc,EAAI/vB,GAEhB04kB,GAAkB3ojB,GACpB31B,OAAOqpe,SAAS,EAAGzje,GAIrB+vB,EAAGlsB,UAAY7D,CACjB,CAsCA,SAAS24kB,GAAiBl2kB,EAASlC,GACjC,IAAI9B,EAAWrgB,UAAUpI,OAAS,QAAsBpB,IAAjBwJ,UAAU,GAAmBA,UAAU,GAAK,IAC/E+X,EAAW/X,UAAUpI,OAAS,QAAsBpB,IAAjBwJ,UAAU,GAAmBA,UAAU,GAAK,GAC/E2oB,EAAQkzgB,GAAax3gB,GACrBu+U,EAASzgV,EAAKwG,EAEd6xkB,EAAc,GAElB,SAASC,IAEP,IAdkB3uiB,EAcd90C,EAAuC4rV,IAbhC92S,GADOA,EAalB0uiB,GAJc,IAKqCn6kB,EAb5B,GAAKyrC,EAAIA,EAAI,GAaAnjC,EACpC08d,GAAShhe,EAASrN,GAEdwjlB,EAAcn6kB,EAChBrE,OAAOkoE,sBAAsBu2gB,GAE7B1ilB,EAASsM,EAEb,CAEAo2kB,EACF,CAgCA,SAASC,KACP,IAEE,OADApjmB,SAASqqX,YAAY,eACd,CACT,CAAE,MAAOlpX,GACP,OAAO,CACT,CACF,CAeA,IAAIkimB,IAAwB,EACxBtkmB,GAAU,CACZ,WAAIq2B,GACF,OAAOiukB,IAAwB,CACjC,GAIExijB,GAAsB,qBAAXn8B,OAAyBA,OAAS,CAAC,EAE9Cm8B,GAAErrB,kBAAoBqrB,GAAEprB,sBAC1BorB,GAAErrB,iBAAiB,IAAK,GAAMz2B,IAC9B8hD,GAAEprB,oBAAoB,IAAK,IAAM,IAGnC,IAAI6tkB,GAAwBD,GAE5B,SAASE,GAAiB/3lB,GACxB,IAAIu3G,EAAYv3G,EAAKu3G,UACjBygf,EAASh4lB,EAAKg4lB,OACdp5N,EAAY5+X,EAAK4+X,UACjB14W,EAAYlmB,EAAKkmB,UACjB+xkB,EAAej4lB,EAAKi4lB,aACpBC,EAAkBl4lB,EAAKk4lB,gBAEvBC,EADQn4lB,EAAKxD,MACG27lB,QAChBrzkB,EAxIN,SAAyBvD,GACvB,IAAIrhB,EAAQgjB,iBAAiB3B,GACzB62kB,EAAyC,aAAnBl4lB,EAAMilB,SAC5BkzkB,EAAa,gBACbC,EAAQ9jmB,SAASwuB,gBAErB,GAAuB,UAAnB9iB,EAAMilB,SAAsB,OAAOmzkB,EAEvC,IAAK,IAAIvrkB,EAASxL,EAASwL,EAASA,EAAOkM,eAGzC,GAFA/4B,EAAQgjB,iBAAiB6J,KAErBqrkB,GAA0C,WAAnBl4lB,EAAMilB,WAI7BkzkB,EAAW7rlB,KAAKtM,EAAMmjB,SAAWnjB,EAAMqjB,UAAYrjB,EAAMojB,WAC3D,OAAOyJ,EAIX,OAAOurkB,CACT,CAmHqB7zkB,CAAgBuzkB,GAC/Bz2O,EAAe,CACjBr7V,UAAW,SACXqxF,UAAWA,GAGb,IAAKygf,IAAWA,EAAOt0kB,aAAc,OAAO69V,EAG5C,IACIzzV,EADwBhJ,EAAaxD,wBACAU,OAErCu2kB,EAAwBP,EAAO12kB,wBAC/Bk3kB,EAAaD,EAAsB55kB,OACnC85kB,EAAaF,EAAsBv2kB,OACnC02kB,EAAUH,EAAsBz5kB,IAGhC65kB,EADwBX,EAAOt0kB,aAAapC,wBACPxC,IAErC85kB,EAAa1/kB,OAAOwlE,YACpB/7D,EAAYo2gB,GAAaj0gB,GACzBs3W,EAAetvU,SAAS5pC,iBAAiB80kB,GAAQ57N,aAAc,IAC/DD,EAAYrvU,SAAS5pC,iBAAiB80kB,GAAQ77N,UAAW,IACzD08N,EAAiBF,EAAex8N,EAChC28N,EAAiBF,EAAaF,EAC9BK,EAAmBF,EAAiBl2kB,EACpCq2kB,EAAmBlrkB,EAAenL,EAAY+1kB,EAC9CO,EAAaT,EAAaI,EAAaj2kB,EAAYy5W,EACnD88N,EAAWv2kB,EAAY+1kB,EAAUv8N,EACjCg9N,EAAiB,IAErB,OAAQjzkB,GACN,IAAK,OACL,IAAK,SAEH,GAAI4ykB,GAAkBL,EACpB,MAAO,CACLvykB,UAAW,SACXqxF,UAAWA,GAKf,GAAIyhf,GAAoBP,IAAeP,EAKrC,OAJID,GACFR,GAAiB3ykB,EAAcm0kB,EAAYE,GAGtC,CACLjzkB,UAAW,SACXqxF,UAAWA,GAKf,IAAK2gf,GAAmBc,GAAoBp6N,GAAas5N,GAAmBY,GAAkBl6N,EAQ5F,OAPIq5N,GACFR,GAAiB3ykB,EAAcm0kB,EAAYE,GAMtC,CACLjzkB,UAAW,SACXqxF,UAHsB2gf,EAAkBY,EAAiB18N,EAAe48N,EAAmB58N,GAS/F,GAAkB,SAAdl2W,GAAwBgykB,EAAiB,CAE3C,IAAIkB,EAAqB7hf,EACrB8hf,EAAanB,EAAkBW,EAAiBE,EAMpD,OAJIM,GAAcz6N,IAChBw6N,EAAqBz8kB,KAAKgE,IAAI04kB,EAAaj9N,EAAe+7N,EAAQmB,cAAe/hf,IAG5E,CACLrxF,UAAW,MACXqxF,UAAW6hf,EAEf,CAGA,GAAkB,WAAdlzkB,EAKF,OAJI+xkB,GACF11G,GAASz9d,EAAcm0kB,GAGlB,CACL/ykB,UAAW,SACXqxF,UAAWA,GAIf,MAEF,IAAK,MAEH,GAAIshf,GAAkBJ,EACpB,MAAO,CACLvykB,UAAW,MACXqxF,UAAWA,GAKf,GAAIwhf,GAAoBN,IAAeP,EAKrC,OAJID,GACFR,GAAiB3ykB,EAAco0kB,EAAUC,GAGpC,CACLjzkB,UAAW,MACXqxF,UAAWA,GAKf,IAAK2gf,GAAmBa,GAAoBn6N,GAAas5N,GAAmBW,GAAkBj6N,EAAW,CACvG,IAAI26N,EAAsBhif,EAW1B,QARK2gf,GAAmBa,GAAoBn6N,GAAas5N,GAAmBW,GAAkBj6N,KAC5F26N,EAAsBrB,EAAkBW,EAAiB18N,EAAY48N,EAAmB58N,GAGtF87N,GACFR,GAAiB3ykB,EAAco0kB,EAAUC,GAGpC,CACLjzkB,UAAW,MACXqxF,UAAWgif,EAEf,CAKA,MAAO,CACLrzkB,UAAW,SACXqxF,UAAWA,GAGf,QACE,MAAM,IAAIjtG,MAAM,+BAAgC3K,OAAOumB,EAAW,OAItE,OAAOq7V,CACT,CAWA,IAAIi4O,GAAkB,SAAyB/ilB,GAC7C,MAAa,SAANA,EAAe,SAAWA,CACnC,EAcIgjlB,IAAsC,IAAA59lB,eAAc,CACtD69lB,mBAAoB,OAGlBC,GAA0B,SAAUjF,GACtC,GAAUiF,EAAYjF,GAEtB,IAAIprlB,EAAS,GAAaqwlB,GAE1B,SAASA,IACP,IAAIlwlB,EAEJ,GAAgBjW,KAAMmmmB,GAEtB,IAAK,IAAI18lB,EAAOC,UAAUpI,OAAQqG,EAAO,IAAI1D,MAAMwF,GAAOtC,EAAO,EAAGA,EAAOsC,EAAMtC,IAC/EQ,EAAKR,GAAQuC,UAAUvC,GA6CzB,OA1CA8O,EAAQH,EAAO5R,KAAK0F,MAAMkM,EAAQ,CAAC9V,MAAMmM,OAAOxE,KAC1C0iB,MAAQ,CACZ05F,UAAW9tG,EAAMvN,MAAM09lB,cACvB1zkB,UAAW,MAGbzc,EAAMowlB,aAAe,SAAU19lB,GAC7B,IAAIi/kB,EAAc3xkB,EAAMvN,MACpB49lB,EAAgB1e,EAAY0e,cAC5BF,EAAgBxe,EAAYwe,cAC5BG,EAAgB3e,EAAY2e,cAC5BC,EAAe5e,EAAY4e,aAC3BC,EAA2B7e,EAAY6e,yBACvCz9lB,EAAQ4+kB,EAAY5+kB,MACxB,GAAKL,EAAL,CAEA,IAAI+7lB,EAAmC,UAAjB8B,EAElBn8kB,EAAQk6kB,GAAiB,CAC3Bxgf,UAAWqif,EACX5B,OAAQ77lB,EACRyiY,UAAWk7N,EACX5zkB,UAAW6zkB,EACX9B,aANiBgC,IAA6B/B,EAO9CA,gBAAiBA,EACjB17lB,MAAOA,IAELk9lB,EAAqBjwlB,EAAMlT,QAAQmjmB,mBACnCA,GAAoBA,EAAmB77kB,GAE3CpU,EAAMkuB,SAAS9Z,EAhBC,CAiBlB,EAEApU,EAAMywlB,gBAAkB,WACtB,IAAIH,EAAgBtwlB,EAAMvN,MAAM69lB,cAC5B7zkB,EAAYzc,EAAMoU,MAAMqI,WAAaszkB,GAAgBO,GACzD,OAAO,GAAe,GAAe,CAAC,EAAGtwlB,EAAMvN,OAAQ,CAAC,EAAG,CACzDgqB,UAAWA,EACXqxF,UAAW9tG,EAAMoU,MAAM05F,WAE3B,EAEO9tG,CACT,CAaA,OAXA,GAAakwlB,EAAY,CAAC,CACxB5lmB,IAAK,SACLyF,MAAO,WAEL,OAAO2E,EADQ3K,KAAK0I,MAAMiC,UACV,CACdhC,IAAK3I,KAAKqmmB,aACVM,YAAa3mmB,KAAK0mmB,mBAEtB,KAGKP,CACT,CAvE8B,CAuE5B,EAAA30hB,WACF20hB,GAAWpZ,YAAckZ,GAEzB,IAmDIW,GAAY,SAAmBn1lB,GACjC,IAAIo1lB,EAAcp1lB,EAAMzI,MACpB89lB,EAAWD,EAAYlC,QAAQmC,SAEnC,MAAO,CACLjnlB,MAFWgnlB,EAAYv3gB,OAETy3gB,UACd/qkB,QAAS,GAAG7vB,OAAkB,EAAX26lB,EAAc,OAAO36lB,OAAkB,EAAX26lB,EAAc,MAC7D33lB,UAAW,SAEf,EAEI63lB,GAAsBJ,GACtBK,GAAoBL,GACpBM,GAAmB,SAA0Bx+lB,GAC/C,IAAIiC,EAAWjC,EAAMiC,SACjBxF,EAAYuD,EAAMvD,UAClBoF,EAAK7B,EAAM6B,GACXsnC,EAAYnpC,EAAMmpC,UAClBs1jB,EAAaz+lB,EAAMy+lB,WACvB,OAAO,QAAI,MAAOxmlB,GAAS,CACzBzX,IAAK2oC,EAAU,mBAAoBnpC,GACnCvD,UAAWoF,EAAG,CACZ,eAAe,EACf,2BAA2B,GAC1BpF,IACFgimB,GAAax8lB,EAClB,EACAu8lB,GAAiBx1hB,aAAe,CAC9B/mE,SAAU,cAEZ,IAAIy8lB,GAAiB,SAAwB1+lB,GAC3C,IAAIiC,EAAWjC,EAAMiC,SACjBxF,EAAYuD,EAAMvD,UAClBoF,EAAK7B,EAAM6B,GACXsnC,EAAYnpC,EAAMmpC,UAClBs1jB,EAAaz+lB,EAAMy+lB,WACvB,OAAO,QAAI,MAAOxmlB,GAAS,CACzBzX,IAAK2oC,EAAU,iBAAkBnpC,GACjCvD,UAAWoF,EAAG,CACZ,eAAe,EACf,wBAAwB,GACvBpF,IACFgimB,GAAax8lB,EAClB,EACAy8lB,GAAe11hB,aAAe,CAC5B/mE,SAAU,cAKZ,IAgLI08lB,GApKAC,GAA0B,SAAUC,GACtC,GAAUD,EAAYC,GAEtB,IAAIC,EAAU,GAAaF,GAE3B,SAASA,IACP,IAAIjxlB,EAEJ,GAAgBrW,KAAMsnmB,GAEtB,IAAK,IAAI98lB,EAAQd,UAAUpI,OAAQqG,EAAO,IAAI1D,MAAMuG,GAAQC,EAAQ,EAAGA,EAAQD,EAAOC,IACpF9C,EAAK8C,GAASf,UAAUe,GAmB1B,OAhBA4L,EAASmxlB,EAAQtjmB,KAAK0F,MAAM49lB,EAAS,CAACxnmB,MAAMmM,OAAOxE,KAC5C0iB,MAAQ,CACbqI,UAAW,MAGbrc,EAAO6vlB,mBAAqB,SAAUl0lB,GACpC,IAAI0gB,EAAY1gB,EAAM0gB,UAGlBA,IAFmBszkB,GAAgB3vlB,EAAO3N,MAAM69lB,gBAGlDlwlB,EAAO8tB,SAAS,CACdzR,UAAWA,GAGjB,EAEOrc,CACT,CA6CA,OA3CA,GAAaixlB,EAAY,CAAC,CACxB/mmB,IAAK,SACLyF,MAAO,WACL,IAAIyilB,EAAezolB,KAAK0I,MACpB++lB,EAAWhf,EAAagf,SACxB98lB,EAAW89kB,EAAa99kB,SACxBxF,EAAYsjlB,EAAatjlB,UACzBuimB,EAAiBjf,EAAaif,eAC9Bn9lB,EAAKk+kB,EAAal+kB,GAClB48lB,EAAa1e,EAAa0e,WAC1BZ,EAAgB9d,EAAa8d,cAC7B50kB,EAAW82jB,EAAa+d,aACxB30jB,EAAY42iB,EAAa52iB,UACzB1hB,EAAuB,UAAbwB,EAEd,IAAK81kB,IAAat3kB,IAAYu3kB,EAC5B,OAAO,KAGT,IAAIh1kB,EAAY1yB,KAAKqqB,MAAMqI,WAAaszkB,GAAgBO,GACpDj2kB,EAxeV,SAA8BvC,GAC5B,IAAIuC,EAAOvC,EAAQD,wBACnB,MAAO,CACL3C,OAAQmF,EAAKnF,OACbqD,OAAQ8B,EAAK9B,OACbpD,KAAMkF,EAAKlF,KACXC,MAAOiF,EAAKjF,MACZC,IAAKgF,EAAKhF,IACVgD,MAAOgC,EAAKhC,MAEhB,CA8diBq5kB,CAAqBD,GAC5BE,EAAiBz3kB,EAAU,EAAIzK,OAAO0J,YAEtC/E,EAAQ,CACVwO,OAFWvI,EAAKoC,GAAak1kB,EAG7Bj2kB,SAAUA,EACVrB,KAAMA,GAGJu3kB,GAAc,QAAI,MAAOlnlB,GAAS,CACpCzX,IAAK2oC,EAAU,aAAcxnB,GAC7BllB,UAAWoF,EAAG,CACZ,eAAe,GACdpF,IACFgimB,GAAax8lB,GAChB,OAAO,QAAIs7lB,GAAuB19lB,SAAU,CAC1CvC,MAAO,CACLkgmB,mBAAoBlmmB,KAAKkmmB,qBAE1BuB,GAAwB,KAAA1hkB,cAAa8hkB,EAAaJ,GAAYI,EACnE,KAGKP,CACT,CA7E8B,CA6E5B,EAAA91hB,WA2FF,ICv4B+C3pE,GAASC,GDu4BpD8F,GAAgD,CAClDjJ,KAAM,SACNC,OAAQ,2FAWNkjmB,GAAM,SAAat7lB,GACrB,IAAIgsC,EAAOhsC,EAAKgsC,KACZ9vC,EAAQ,GAAyB8D,EAAM,CAAC,SAE5C,OAAO,QAAI,MAAOmU,GAAS,CACzB6N,OAAQgqB,EACRlqB,MAAOkqB,EACPu9D,QAAS,YACT,cAAe,OACfo0S,UAAW,QACXjhZ,IAAK0E,IACJlF,GACL,EAEIq/lB,GAAY,SAAmBr/lB,GACjC,OAAO,QAAIo/lB,GAAKnnlB,GAAS,CACvB63B,KAAM,IACL9vC,IAAQ,QAAI,OAAQ,CACrBkhE,EAAG,+VAEP,EACIo+hB,GAAc,SAAqBt/lB,GACrC,OAAO,QAAIo/lB,GAAKnnlB,GAAS,CACvB63B,KAAM,IACL9vC,IAAQ,QAAI,OAAQ,CACrBkhE,EAAG,0RAEP,EAIIq+hB,GAAU,SAAiB14lB,GAC7B,IAAI06c,EAAY16c,EAAM06c,UAClBi+I,EAAc34lB,EAAMvG,MACpB89lB,EAAWoB,EAAYvD,QAAQmC,SAC/Bx3gB,EAAS44gB,EAAY54gB,OACzB,MAAO,CACLrgD,MAAO,qBACPpvB,MAAOoqc,EAAY36X,EAAO64gB,UAAY74gB,EAAO84gB,UAC7Cn5lB,QAAS,OACT+sB,QAAoB,EAAX8qkB,EACTn8kB,WAAY,cACZ,SAAU,CACR9K,MAAOoqc,EAAY36X,EAAO+4gB,UAAY/4gB,EAAOy3gB,WAGnD,EAEIuB,GAAuBL,GAevBM,GAAoBN,GA+CpBO,IAAuB,SAAUnB,KClgCUx/lB,GDkgCmD,CAAC,8DCjgC5FC,KACHA,GAAMD,GAAQoJ,MAAM,IDggCiCo2lB,GC9/BhDn/lB,OAAO43E,OAAO53E,OAAOwD,iBAAiB7D,GAAS,CACpDC,IAAK,CACH9B,MAAOkC,OAAO43E,OAAOh4E,UDkhCvB2gmB,GAAa,SAAoB10lB,GACnC,IAAI8U,EAAQ9U,EAAM8U,MACdgQ,EAAS9kB,EAAM8kB,OACnB,OAAO,QAAI,OAAQ,CACjB3vB,KAAkB,SAAM,CACtBwhB,UAAW,GAAGve,OAAOq8lB,GAAsB,oBAAoBr8lB,OAAO0c,EAAO,gBAC7EnV,gBAAiB,eACjB4M,aAAc,MACdrR,QAAS,eACT45X,WAAYhwW,EAAS,MAAQ,KAC7BrK,OAAQ,MACRk6kB,cAAe,MACfp6kB,MAAO,OACkC,GAAmE,KAElH,EAEIq6kB,GAAmB,SAA0BjgmB,GAC/C,IAAIvD,EAAYuD,EAAMvD,UAClBoF,EAAK7B,EAAM6B,GACXsnC,EAAYnpC,EAAMmpC,UAClBs1jB,EAAaz+lB,EAAMy+lB,WACnBhrO,EAAQzzX,EAAMyzX,MAClB,OAAO,QAAI,MAAOx7W,GAAS,CACzBzX,IAAK2oC,EAAU,mBAAoBnpC,GACnCvD,UAAWoF,EAAG,CACZq+lB,WAAW,EACX,qBAAqB,GACpBzjmB,IACFgimB,IAAa,QAAIsB,GAAY,CAC9B5/kB,MAAO,EACPgQ,OAAQsjW,KACN,QAAIssO,GAAY,CAClB5/kB,MAAO,IACPgQ,QAAQ,KACN,QAAI4vkB,GAAY,CAClB5/kB,MAAO,IACPgQ,QAASsjW,IAEb,EACAwsO,GAAiBj3hB,aAAe,CAC9Bl5B,KAAM,GAGR,IAkIIqwjB,GAAa,SAAoBC,GACnC,MAAO,CACL75jB,MAAO,QACPZ,WAAY,EACZ06jB,OAAQ,EACR5olB,SAAU,UACVwL,QAASm9kB,EAAW,EAAI,EACxBE,QAAS,EACThtkB,QAAS,EACTnc,MAAO,UAEX,EA2EIoplB,GAAoB,SAA2B34lB,GACjD,IAAI3F,EAAW2F,EAAM3F,SACjBw8lB,EAAa72lB,EAAM62lB,WACvB,OAAO,QAAI,MAAOA,EAAYx8lB,EAChC,EACIu+lB,GAAsBD,GACtBE,GAAkBF,GAStB,IAAIG,GAAa,SAAoB1gmB,GACnC,IAAIiC,EAAWjC,EAAMiC,SACjBxF,EAAYuD,EAAMvD,UAClBqwG,EAAa9sG,EAAM8sG,WACnBjrG,EAAK7B,EAAM6B,GACX0qB,EAAOvsB,EAAMusB,KACb4c,EAAYnpC,EAAMmpC,UAClBs1jB,EAAaz+lB,EAAMy+lB,WACnB/6jB,EAAa1jC,EAAM0jC,WACnBi9jB,EAAc3gmB,EAAM2gmB,YACpBtF,EAAcr7lB,EAAMq7lB,YACpBj6jB,EAAY0rE,EAAW1rE,UACvBw/jB,EAAQ9zf,EAAW8zf,MACnBC,EAAS/zf,EAAW+zf,OACxB,OAAO,QAAI,MAAY,MAAM,SAAUx1lB,GACrC,IAAI7K,EAAM6K,EAAM7K,IACZsgmB,EAAYz1lB,EAAMxJ,GACtB,OAAO,QAAIu/B,EAAW,CACpB7U,KAAMA,EACNkykB,WAAY,GAAe,CACzBhimB,UAAWqkmB,EAAUtgmB,EAAI2oC,EAAU,aAAcnpC,IAAS6B,EAAG,CAC3D,eAAe,EACf,2BAA4B6hC,GAC3BjnC,KACFgimB,GACHpD,YAAaA,IACZ,QAAIuF,EAAO,CACZr0kB,KAAMA,EACNkykB,WAAY,CACVhimB,UAAWqkmB,EAAUtgmB,EAAI2oC,EAAU,kBAAmBnpC,IAAS6B,EAAG,CAChE,sBAAsB,GACrBpF,KAEL4+lB,YAAaA,GACZp5lB,IAAW,QAAI4+lB,EAAQ,CACxBt0kB,KAAMA,EACNkykB,WAAY,GAAe,CACzBhimB,UAAWqkmB,EAAUtgmB,EAAI2oC,EAAU,mBAAoBnpC,IAAS6B,EAAG,CACjE,uBAAuB,GACtBpF,KACFkkmB,GACHtF,YAAaA,IAEjB,GACF,EAEAqF,GAAW13hB,aAAe,CACxB+3hB,kBAAkB,GAGpB,IAgHIj0f,GAAa,CACfk0f,eA1fmB,SAAwBhhmB,GAC3C,IAAIiC,EAAWjC,EAAMiC,SACjBxF,EAAYuD,EAAMvD,UAClBoF,EAAK7B,EAAM6B,GACXsnC,EAAYnpC,EAAMmpC,UAClBs1jB,EAAaz+lB,EAAMy+lB,WACvB,OAAO,QAAI,MAAOxmlB,GAAS,CACzBzX,IAAK2oC,EAAU,iBAAkBnpC,GACjCvD,UAAWoF,EAAG,CACZq+lB,WAAW,EACX,mBAAmB,GAClBzjmB,IACFgimB,GAAax8lB,IAAY,QAAIo9lB,GAAW,MAC7C,EA8eE4B,QA7WY,SAAiBjhmB,GAC7B,IAAIiC,EAAWjC,EAAMiC,SACjBJ,EAAK7B,EAAM6B,GACXsnC,EAAYnpC,EAAMmpC,UAClB1sC,EAAYuD,EAAMvD,UAClBinC,EAAa1jC,EAAM0jC,WACnB69a,EAAYvhd,EAAMuhd,UAClBxmb,EAAW/6B,EAAM+6B,SACjB0jkB,EAAaz+lB,EAAMy+lB,WACnByC,EAAalhmB,EAAMkhmB,WACvB,OAAO,QAAI,MAAOjplB,GAAS,CACzBhY,IAAK86B,EACLv6B,IAAK2oC,EAAU,UAAWnpC,GAC1BvD,UAAWoF,EAAG,CACZs/lB,SAAS,EACT,uBAAwBz9jB,EACxB,sBAAuB69a,EACvB,wBAAyB2/I,GACxBzkmB,IACFgimB,GAAax8lB,EAClB,EA0VEm/lB,kBA3gBsB,SAA2BphmB,GACjD,IAAIiC,EAAWjC,EAAMiC,SACjBxF,EAAYuD,EAAMvD,UAClBoF,EAAK7B,EAAM6B,GACXsnC,EAAYnpC,EAAMmpC,UAClBs1jB,EAAaz+lB,EAAMy+lB,WACvB,OAAO,QAAI,MAAOxmlB,GAAS,CACzBzX,IAAK2oC,EAAU,oBAAqBnpC,GACpCvD,UAAWoF,EAAG,CACZq+lB,WAAW,EACX,sBAAsB,GACrBzjmB,IACFgimB,GAAax8lB,IAAY,QAAIq9lB,GAAa,MAC/C,EA+fEA,YAAaA,GACbD,UAAWA,GACXgC,MAnVU,SAAerhmB,GACzB,IAAIiC,EAAWjC,EAAMiC,SACjBxF,EAAYuD,EAAMvD,UAClBoF,EAAK7B,EAAM6B,GACXsnC,EAAYnpC,EAAMmpC,UAClBm4jB,EAAUthmB,EAAMshmB,QAChBC,EAAevhmB,EAAMuhmB,aACrB9C,EAAaz+lB,EAAMy+lB,WACnBl4jB,EAAQvmC,EAAMumC,MACdjmC,EAAQN,EAAMM,MACd+6lB,EAAcr7lB,EAAMq7lB,YACxB,OAAO,QAAI,MAAOpjlB,GAAS,CACzBzX,IAAK2oC,EAAU,QAASnpC,GACxBvD,UAAWoF,EAAG,CACZm/J,OAAO,GACNvkK,IACFgimB,IAAa,QAAI6C,EAASrplB,GAAS,CAAC,EAAGsplB,EAAc,CACtDlG,YAAaA,EACb/6lB,MAAOA,EACP6oC,UAAWA,EACXtnC,GAAIA,IACF0kC,IAAQ,QAAI,MAAO,KAAMtkC,GAC/B,EA8TEu/lB,aA7SiB,SAAsBxhmB,GACvC,IAAImpC,EAAYnpC,EAAMmpC,UAClBtnC,EAAK7B,EAAM6B,GACXpF,EAAYuD,EAAMvD,UAElBglmB,EAAoBxG,GAAiBj7lB,GACrCyhmB,EAAkBl1kB,KAClB,IAAIkykB,EAAa,GAAyBgD,EAAmB,CAAC,SAElE,OAAO,QAAI,MAAOxplB,GAAS,CACzBzX,IAAK2oC,EAAU,eAAgBnpC,GAC/BvD,UAAWoF,EAAG,CACZ,iBAAiB,GAChBpF,IACFgimB,GACL,EA+REiD,oBAhmBwB,SAA6B1hmB,GACrD,IAAIiC,EAAWjC,EAAMiC,SACjBxF,EAAYuD,EAAMvD,UAClBoF,EAAK7B,EAAM6B,GACX48lB,EAAaz+lB,EAAMy+lB,WACnBt1jB,EAAYnpC,EAAMmpC,UACtB,OAAO,QAAI,MAAOlxB,GAAS,CACzBzX,IAAK2oC,EAAU,sBAAuBnpC,GACtCvD,UAAWoF,EAAG,CACZ8/lB,YAAY,GACXllmB,IACFgimB,GAAax8lB,EAClB,EAqlBE2/lB,mBAneuB,SAA4B5hmB,GACnD,IAAIvD,EAAYuD,EAAMvD,UAClBoF,EAAK7B,EAAM6B,GACXsnC,EAAYnpC,EAAMmpC,UAClBs1jB,EAAaz+lB,EAAMy+lB,WACvB,OAAO,QAAI,OAAQxmlB,GAAS,CAAC,EAAGwmlB,EAAY,CAC1Cj+lB,IAAK2oC,EAAU,qBAAsBnpC,GACrCvD,UAAWoF,EAAG,CACZ,uBAAuB,GACtBpF,KAEP,EAydEuwO,MApQU,SAAehtO,GACzB,IAAIvD,EAAYuD,EAAMvD,UAClBoF,EAAK7B,EAAM6B,GACXsnC,EAAYnpC,EAAMmpC,UAElBs4jB,EAAoBxG,GAAiBj7lB,GACrC+6B,EAAW0mkB,EAAkB1mkB,SAC7B2I,EAAa+9jB,EAAkB/9jB,WAC/B08jB,EAAWqB,EAAkBrB,SAC7B3B,EAAa,GAAyBgD,EAAmB,CAAC,WAAY,aAAc,aAExF,OAAO,QAAI,MAAO,CAChBjhmB,IAAK2oC,EAAU,QAASnpC,KACvB,QAAI6hmB,GAAA3/hB,EAAejqD,GAAS,CAC7Bxb,UAAWoF,EAAG,CACZgnF,OAAO,GACNpsF,GACHs3lB,SAAUh5jB,EACVolkB,WAAYA,GAAWC,GACvB3gO,SAAU/7V,GACT+6jB,IACL,EAgPEwB,iBAAkBA,GAClB6B,KA32BS,SAAc9hmB,GACvB,IAAIiC,EAAWjC,EAAMiC,SACjBxF,EAAYuD,EAAMvD,UAClBoF,EAAK7B,EAAM6B,GACXsnC,EAAYnpC,EAAMmpC,UAClBpO,EAAW/6B,EAAM+6B,SACjB0jkB,EAAaz+lB,EAAMy+lB,WACvB,OAAO,QAAI,MAAOxmlB,GAAS,CACzBzX,IAAK2oC,EAAU,OAAQnpC,GACvBvD,UAAWoF,EAAG,CACZkqY,MAAM,GACLtvY,GACHwD,IAAK86B,GACJ0jkB,GAAax8lB,EAClB,EA81BE8/lB,SA70Ba,SAAkB/hmB,GAC/B,IAAIiC,EAAWjC,EAAMiC,SACjBxF,EAAYuD,EAAMvD,UAClBoF,EAAK7B,EAAM6B,GACXsnC,EAAYnpC,EAAMmpC,UAClBs1jB,EAAaz+lB,EAAMy+lB,WACnB1jkB,EAAW/6B,EAAM+6B,SACjBogkB,EAAUn7lB,EAAMm7lB,QACpB,OAAO,QAAI,MAAOljlB,GAAS,CACzBzX,IAAK2oC,EAAU,WAAYnpC,GAC3BvD,UAAWoF,EAAG,CACZ,aAAa,EACb,sBAAuBs5lB,GACtB1+lB,GACHwD,IAAK86B,GACJ0jkB,GAAax8lB,EAClB,EA8zBE28lB,WAAYA,GACZF,eAAgBA,GAChBF,iBAAkBA,GAClBkC,WAAYA,GACZF,oBAAqBA,GACrBC,gBAAiBA,GACjBuB,iBA9LF,SAA0Bj5lB,GACxB,IAAI9G,EAAW8G,EAAM9G,SACjBw8lB,EAAa11lB,EAAM01lB,WACvB,OAAO,QAAI,MAAOA,EAAYx8lB,IAAY,QAAIo9lB,GAAW,CACvDvvjB,KAAM,KAEV,EAyLEmyjB,OA5GW,SAAgBjimB,GAC3B,IAAIiC,EAAWjC,EAAMiC,SACjBxF,EAAYuD,EAAMvD,UAClBoF,EAAK7B,EAAM6B,GACXsnC,EAAYnpC,EAAMmpC,UAClBzF,EAAa1jC,EAAM0jC,WACnB69a,EAAYvhd,EAAMuhd,UAClBrnD,EAAal6Z,EAAMk6Z,WACnBn/X,EAAW/6B,EAAM+6B,SACjB0jkB,EAAaz+lB,EAAMy+lB,WACvB,OAAO,QAAI,MAAOxmlB,GAAS,CACzBzX,IAAK2oC,EAAU,SAAUnpC,GACzBvD,UAAWoF,EAAG,CACZqwC,QAAQ,EACR,sBAAuBxO,EACvB,qBAAsB69a,EACtB,sBAAuBrnD,GACtBz9Z,GACHwD,IAAK86B,GACJ0jkB,GAAax8lB,EAClB,EAyFEigmB,YAxEgB,SAAqBlimB,GACrC,IAAIiC,EAAWjC,EAAMiC,SACjBxF,EAAYuD,EAAMvD,UAClBoF,EAAK7B,EAAM6B,GACXsnC,EAAYnpC,EAAMmpC,UAClBs1jB,EAAaz+lB,EAAMy+lB,WACvB,OAAO,QAAI,MAAOxmlB,GAAS,CACzBzX,IAAK2oC,EAAU,cAAenpC,GAC9BvD,UAAWoF,EAAG,CACZu8Y,aAAa,GACZ3hZ,IACFgimB,GAAax8lB,EAClB,EA6DEkgmB,gBA3qBoB,SAAyBnimB,GAC7C,IAAIiC,EAAWjC,EAAMiC,SACjBxF,EAAYuD,EAAMvD,UAClBoF,EAAK7B,EAAM6B,GACXsnC,EAAYnpC,EAAMmpC,UAClBs1jB,EAAaz+lB,EAAMy+lB,WACnB/6jB,EAAa1jC,EAAM0jC,WACnB+vV,EAAQzzX,EAAMyzX,MAClB,OAAO,QAAI,MAAOx7W,GAAS,CACzBzX,IAAK2oC,EAAU,YAAanpC,GAC5BvD,UAAWoF,EAAG,CACZ,gBAAiB6hC,EACjB,WAAY+vV,GACXh3X,IACFgimB,GAAax8lB,EAClB,EA6pBEmgmB,YAxCgB,SAAqBpimB,GACrC,IAAIiC,EAAWjC,EAAMiC,SACjBxF,EAAYuD,EAAMvD,UAClBoF,EAAK7B,EAAM6B,GACXsnC,EAAYnpC,EAAMmpC,UAClBzF,EAAa1jC,EAAM0jC,WACnB+6jB,EAAaz+lB,EAAMy+lB,WACvB,OAAO,QAAI,MAAOxmlB,GAAS,CACzBzX,IAAK2oC,EAAU,cAAenpC,GAC9BvD,UAAWoF,EAAG,CACZ,gBAAgB,EAChB,4BAA6B6hC,GAC5BjnC,IACFgimB,GAAax8lB,EAClB,EA2BEogmB,eA7oBmB,SAAwBrimB,GAC3C,IAAIiC,EAAWjC,EAAMiC,SACjBxF,EAAYuD,EAAMvD,UAClBoF,EAAK7B,EAAM6B,GACX48lB,EAAaz+lB,EAAMy+lB,WACnBtD,EAAUn7lB,EAAMm7lB,QAChBhyjB,EAAYnpC,EAAMmpC,UAClBuzE,EAAW18G,EAAM08G,SACrB,OAAO,QAAI,MAAOzkG,GAAS,CACzBzX,IAAK2oC,EAAU,iBAAkBnpC,GACjCvD,UAAWoF,EAAG,CACZ,mBAAmB,EACnB,4BAA6Bs5lB,EAC7B,6BAA8Bz+e,GAC7BjgH,IACFgimB,GAAax8lB,EAClB,GEz2Be,SAAS,GAAkBqB,EAAKvG,IAClC,MAAPA,GAAeA,EAAMuG,EAAI1K,UAAQmE,EAAMuG,EAAI1K,QAC/C,IAAK,IAAIK,EAAI,EAAG+W,EAAO,IAAIzU,MAAMwB,GAAM9D,EAAI8D,EAAK9D,IAAK+W,EAAK/W,GAAKqK,EAAIrK,GACnE,OAAO+W,CACT,CCAe,SAAS,GAAmB1M,GACzC,OCJa,SAA4BA,GACzC,GAAI/H,MAAMiD,QAAQ8E,GAAM,OAAO,GAAiBA,EAClD,CDES,CAAkBA,IELZ,SAA0B2V,GACvC,GAAsB,qBAAX1I,QAAmD,MAAzB0I,EAAK1I,OAAOC,WAA2C,MAAtByI,EAAK,cAAuB,OAAO1d,MAAM8U,KAAK4I,EACtH,CFGmC,CAAgB3V,IGJpC,SAAqC4M,EAAGC,GACrD,GAAKD,EAAL,CACA,GAAiB,kBAANA,EAAgB,OAAO,GAAiBA,EAAGC,GACtD,IAAIC,EAAI5Q,OAAOvH,UAAU+E,SAASxB,KAAK0U,GAAG3H,MAAM,GAAI,GAEpD,MADU,WAAN6H,GAAkBF,EAAE1D,cAAa4D,EAAIF,EAAE1D,YAAYvQ,MAC7C,QAANmU,GAAqB,QAANA,EAAoB7U,MAAM8U,KAAKH,GACxC,cAANE,GAAqB,2CAA2CE,KAAKF,GAAW,GAAiBF,EAAGC,QAAxG,CALc,CAMhB,CHH2D,CAA2B7M,IILvE,WACb,MAAM,IAAI0N,UAAU,uIACtB,CJG8F,EAC9F,CKNA,IAAIsxlB,GAAY/hlB,OAAOw5E,OACnB,SAAkBz8F,GACd,MAAwB,kBAAVA,GAAsBA,IAAUA,CAClD,EAUJ,SAASsb,GAAeF,EAAWC,GAC/B,GAAID,EAAU9f,SAAW+f,EAAW/f,OAChC,OAAO,EAEX,IAAK,IAAIK,EAAI,EAAGA,EAAIyf,EAAU9f,OAAQK,IAClC,GAdSugD,EAcI9gC,EAAUzf,GAdPspmB,EAcW5plB,EAAW1f,KAbtCugD,IAAU+ojB,GAGVD,GAAU9ojB,IAAU8ojB,GAAUC,IAW1B,OAAO,EAfnB,IAAiB/ojB,EAAO+ojB,EAkBpB,OAAO,CACX,CAyBA,OAvBA,SAAoBC,EAAUz8gB,GAE1B,IAAI08gB,OADY,IAAZ18gB,IAAsBA,EAAUntE,IAEpC,IACIg7N,EADA9uJ,EAAW,GAEX49gB,GAAa,EAejB,OAdA,WAEI,IADA,IAAIC,EAAU,GACLhkmB,EAAK,EAAGA,EAAKqC,UAAUpI,OAAQ+F,IACpCgkmB,EAAQhkmB,GAAMqC,UAAUrC,GAE5B,OAAI+jmB,GAAcD,IAAanrmB,MAAQyuF,EAAQ48gB,EAAS79gB,KAGxD8uJ,EAAa4uX,EAASthmB,MAAM5J,KAAMqrmB,GAClCD,GAAa,EACbD,EAAWnrmB,KACXwtF,EAAW69gB,GALA/uX,CAOf,CAEJ,EC6aA,IA9cA,IAAI9vO,GAA+C,CACjD7H,KAAM,kBACNC,OAAQ,0JAQN0mmB,GAAW,SAAkB5imB,GAC/B,OAAO,QAAI,OAAQiY,GAAS,CAC1BzX,IAAKsD,IACJ9D,GACL,EAEI6imB,GAA0B,CAC5BC,SAAU,SAAkB9imB,GAC1B,IAAI+imB,EAAe/imB,EAAM+imB,aACrB5H,EAAUn7lB,EAAMm7lB,QAChBz3jB,EAAa1jC,EAAM0jC,WACnBs/jB,EAAkBhjmB,EAAMgjmB,gBAG5B,OAFchjmB,EAAM3F,SAGlB,IAAK,OACH,MAAO,oCAAoCoJ,OAAOigC,EAAa,GAAK,uDAAwD,mCAAmCjgC,OAAOu/lB,EAAkB,qDAAuD,GAAI,KAErP,IAAK,QACH,MAAO,GAAGv/lB,OAAOzD,EAAM,eAAiB,SAAU,gBAAgByD,OAAOs/lB,EAAe,uBAAyB,GAAI,mCAAmCt/lB,OAAO03lB,EAAU,uCAAyC,IAEpN,IAAK,QACH,MAAO,6GAET,QACE,MAAO,GAEb,EACA9rhB,SAAU,SAAkBrvE,GAC1B,IAAIkc,EAASlc,EAAMkc,OACf+mlB,EAAejjmB,EAAMumC,MACrBA,OAAyB,IAAjB08jB,EAA0B,GAAKA,EACvCv/jB,EAAa1jC,EAAM0jC,WAEvB,OAAQxnB,GACN,IAAK,kBACL,IAAK,YACL,IAAK,eACH,MAAO,UAAUzY,OAAO8iC,EAAO,iBAEjC,IAAK,gBACH,MAAoB,UAAU9iC,OAAO8iC,EAA9B7C,EAAqC,uCAAkE,eAEhH,QACE,MAAO,GAEb,EACAoB,QAAS,SAAiB9kC,GACxB,IAAI3F,EAAU2F,EAAM3F,QAChB6omB,EAAiBljmB,EAAMkid,QACvBA,OAA6B,IAAnBghJ,EAA4B,CAAC,EAAIA,EAC3C7rmB,EAAU2I,EAAM3I,QAChB8rmB,EAAgBnjmB,EAAMumC,MACtBA,OAA0B,IAAlB48jB,EAA2B,GAAKA,EACxCC,EAAcpjmB,EAAMojmB,YACpB1/jB,EAAa1jC,EAAM0jC,WACnBw2X,EAAal6Z,EAAMk6Z,WAEnBmpM,EAAgB,SAAuB//lB,EAAKyhB,GAC9C,OAAOzhB,GAAOA,EAAI1K,OAAS,GAAG6K,OAAOH,EAAIkI,QAAQuZ,GAAQ,EAAG,QAAQthB,OAAOH,EAAI1K,QAAU,EAC3F,EAEA,GAAgB,UAAZyB,GAAuB+omB,EACzB,MAAO,SAAS3/lB,OAAO8iC,EAAO,cAAc9iC,OAAO4/lB,EAAcD,EAAalhJ,GAAU,KAG1F,GAAgB,SAAZ7nd,EAAoB,CACtB,IAAIolY,EAAW/7V,EAAa,YAAc,GACtCuN,EAAS,GAAGxtC,OAAOy2Z,EAAa,WAAa,WAAWz2Z,OAAOg8X,GACnE,MAAO,UAAUh8X,OAAO8iC,EAAO,KAAK9iC,OAAOwtC,EAAQ,MAAMxtC,OAAO4/lB,EAAchsmB,EAAS6qd,GAAU,IACnG,CAEA,MAAO,EACT,EACAohJ,SAAU,SAAkBtjmB,GAC1B,IAAIupY,EAAavpY,EAAMupY,WACnBg6N,EAAiBvjmB,EAAMujmB,eAC3B,MAAO,GAAG9/lB,OAAO8/lB,GAAgB9/lB,OAAO8lY,EAAa,oBAAsBA,EAAa,GAAI,IAC9F,GAGEi6N,GAAa,SAAoBxjmB,GACnC,IAAIyjmB,EAAgBzjmB,EAAMyjmB,cACtBC,EAAgB1jmB,EAAM0jmB,cACtBC,EAAe3jmB,EAAM2jmB,aACrBC,EAAmB5jmB,EAAM4jmB,iBACzBriJ,EAAYvhd,EAAMuhd,UAClB6hJ,EAAcpjmB,EAAMojmB,YACpB/H,EAAcr7lB,EAAMq7lB,YACpBwI,EAAmBxI,EAAYwI,iBAC/BC,EAAiBzI,EAAYyI,eAC7Bv6N,EAAa8xN,EAAY9xN,WACzB4xN,EAAUE,EAAYF,QACtB4I,EAAmB1I,EAAY0I,iBAC/BhB,EAAe1H,EAAY0H,aAC3B7B,EAAa7F,EAAY6F,WACzB7pmB,EAAUgkmB,EAAYhkmB,QACtB2smB,EAAqB3I,EAAY2I,mBACjChB,EAAkB3H,EAAY2H,gBAC9Bn1M,EAAYwtM,EAAY,cACxB4I,EAAW5I,EAAY,aAEvBv2d,GAAW,IAAAlmH,UAAQ,WACrB,OAAO,GAAe,GAAe,CAAC,EAAGiklB,IAA0BgB,GAAoB,CAAC,EAC1F,GAAG,CAACA,IAEAK,GAAe,IAAAtllB,UAAQ,WACzB,IAAI4xB,EAAU,GAEd,GAAIizjB,GAAiB3+d,EAASz1D,SAAU,CACtC,IAAIn9B,EAASuxjB,EAAcvxjB,OACvBiyjB,EAAeV,EAAcU,aAC7B7mmB,EAAQmmmB,EAAcnmmB,MAMtB+pY,EAAW88N,GAAgBjyjB,GAJhB,SAAkBl6B,GAC/B,OAAQzc,MAAMiD,QAAQwZ,GAAa,KAANA,CAC/B,CAEyCoslB,CAAS9mmB,GAE9C+mmB,EAAgB,GAAe,CACjC3gkB,WAAY2jW,GAAY08N,EAAiB18N,GACzC9gW,MAAO8gW,EAAWy8N,EAAez8N,GAAY,IAC5Co8N,GAEHjzjB,EAAUs0F,EAASz1D,SAASg1hB,EAC9B,CAEA,OAAO7zjB,CACT,GAAG,CAACizjB,EAAeM,EAAkBD,EAAgBh/d,IACjDw/d,GAAc,IAAA1llB,UAAQ,WACxB,IAAI2llB,EAAW,GACXriJ,EAAUwhJ,GAAiBC,EAC3BzpM,KAAgBwpM,GAAiBN,GAAeA,EAAYx+lB,SAAS8+lB,IAEzE,GAAIxhJ,GAAWp9U,EAAShgG,QAAS,CAC/B,IAAI0/jB,EAAe,CACjBtiJ,QAASA,EACT37a,MAAOu9jB,EAAe5hJ,GACtBx+a,WAAYqgkB,EAAiB7hJ,GAC7BhoD,WAAYA,EACZ7ia,QAASA,EACTgD,QAAS6nd,IAAYwhJ,EAAgB,OAAS,QAC9CN,YAAaA,GAEfmB,EAAWz/d,EAAShgG,QAAQ0/jB,EAC9B,CAEA,OAAOD,CACT,GAAG,CAACb,EAAeC,EAAcG,EAAgBC,EAAkBj/d,EAAUztI,EAAS+rmB,IAClFqB,GAAc,IAAA7llB,UAAQ,WACxB,IAAI8llB,EAAa,GAEjB,GAAIxD,GAAc7pmB,EAAQuB,QAAUksI,EAASw+d,SAAU,CACrD,IAAIC,EAAiBS,EAAmB,CACtCv2iB,MAAOm2iB,EAAiBhrmB,SAE1B8rmB,EAAa5/d,EAASw+d,SAAS,CAC7B/5N,WAAYA,EACZg6N,eAAgBA,GAEpB,CAEA,OAAOmB,CACT,GAAG,CAACd,EAAkBr6N,EAAY23N,EAAYp8d,EAAUztI,EAAS2smB,IAC7DW,GAAe,IAAA/llB,UAAQ,WACzB,IAAIgmlB,EAAc,GAElB,GAAI9/d,EAASg+d,SAAU,CACrB,IAAIzomB,EAAUspmB,EAAe,QAAUzC,EAAa,OAAS,QAC7D0D,EAAc9/d,EAASg+d,SAAS,CAC9B,aAAcj1M,EACdxzZ,QAASA,EACTqpC,WAAYggkB,GAAiBK,EAAiBL,GAC9CvI,QAASA,EACT4H,aAAcA,EACdC,gBAAiBA,GAErB,CAEA,OAAO4B,CACT,GAAG,CAAC/2M,EAAW61M,EAAeC,EAAcxI,EAAS4I,EAAkBhB,EAAc7B,EAAYp8d,EAAUk+d,IACvG6B,EAAc,GAAGphmB,OAAO6gmB,EAAa,KAAK7gmB,OAAOghmB,EAAa,KAAKhhmB,OAAOkhmB,GAC9E,OAAO,QAAI/B,GAAU,CACnB,YAAaqB,EACb,cAAe,QACf,gBAAiB,kBAChB1iJ,IAAa,QAAI,WAAgB,MAAM,QAAI,OAAQ,CACpD5ld,GAAI,kBACHuomB,IAAe,QAAI,OAAQ,CAC5BvomB,GAAI,gBACHkpmB,IACL,EAEIC,GAAa,CAAC,CAChB1qlB,KAAM,IACN2qlB,QAAS,+LACR,CACD3qlB,KAAM,KACN2qlB,QAAS,UACR,CACD3qlB,KAAM,KACN2qlB,QAAS,oBACR,CACD3qlB,KAAM,KACN2qlB,QAAS,UACR,CACD3qlB,KAAM,KACN2qlB,QAAS,UACR,CACD3qlB,KAAM,KACN2qlB,QAAS,gBACR,CACD3qlB,KAAM,KACN2qlB,QAAS,UACR,CACD3qlB,KAAM,IACN2qlB,QAAS,qDACR,CACD3qlB,KAAM,IACN2qlB,QAAS,qEACR,CACD3qlB,KAAM,IACN2qlB,QAAS,mFACR,CACD3qlB,KAAM,KACN2qlB,QAAS,gBACR,CACD3qlB,KAAM,KACN2qlB,QAAS,gBACR,CACD3qlB,KAAM,IACN2qlB,QAAS,2KACR,CACD3qlB,KAAM,IACN2qlB,QAAS,mCACR,CACD3qlB,KAAM,IACN2qlB,QAAS,yFACR,CACD3qlB,KAAM,IACN2qlB,QAAS,mFACR,CACD3qlB,KAAM,IACN2qlB,QAAS,+GACR,CACD3qlB,KAAM,IACN2qlB,QAAS,6BACR,CACD3qlB,KAAM,IACN2qlB,QAAS,mFACR,CACD3qlB,KAAM,IACN2qlB,QAAS,2GACR,CACD3qlB,KAAM,KACN2qlB,QAAS,UACR,CACD3qlB,KAAM,KACN2qlB,QAAS,UACR,CACD3qlB,KAAM,IACN2qlB,QAAS,+CACR,CACD3qlB,KAAM,IACN2qlB,QAAS,6FACR,CACD3qlB,KAAM,KACN2qlB,QAAS,UACR,CACD3qlB,KAAM,KACN2qlB,QAAS,UACR,CACD3qlB,KAAM,IACN2qlB,QAAS,qPACR,CACD3qlB,KAAM,KACN2qlB,QAAS,UACR,CACD3qlB,KAAM,KACN2qlB,QAAS,UACR,CACD3qlB,KAAM,KACN2qlB,QAAS,UACR,CACD3qlB,KAAM,IACN2qlB,QAAS,2DACR,CACD3qlB,KAAM,IACN2qlB,QAAS,mCACR,CACD3qlB,KAAM,IACN2qlB,QAAS,qGACR,CACD3qlB,KAAM,IACN2qlB,QAAS,qGACR,CACD3qlB,KAAM,IACN2qlB,QAAS,yFACR,CACD3qlB,KAAM,KACN2qlB,QAAS,UACR,CACD3qlB,KAAM,IACN2qlB,QAAS,mMACR,CACD3qlB,KAAM,IACN2qlB,QAAS,+CACR,CACD3qlB,KAAM,KACN2qlB,QAAS,UACR,CACD3qlB,KAAM,IACN2qlB,QAAS,2DACR,CACD3qlB,KAAM,IACN2qlB,QAAS,6BACR,CACD3qlB,KAAM,IACN2qlB,QAAS,uFACR,CACD3qlB,KAAM,IACN2qlB,QAAS,mFACR,CACD3qlB,KAAM,IACN2qlB,QAAS,qMACR,CACD3qlB,KAAM,KACN2qlB,QAAS,UACR,CACD3qlB,KAAM,KACN2qlB,QAAS,oBACR,CACD3qlB,KAAM,KACN2qlB,QAAS,UACR,CACD3qlB,KAAM,KACN2qlB,QAAS,UACR,CACD3qlB,KAAM,KACN2qlB,QAAS,gBACR,CACD3qlB,KAAM,KACN2qlB,QAAS,UACR,CACD3qlB,KAAM,IACN2qlB,QAAS,qDACR,CACD3qlB,KAAM,IACN2qlB,QAAS,2EACR,CACD3qlB,KAAM,IACN2qlB,QAAS,mFACR,CACD3qlB,KAAM,KACN2qlB,QAAS,gBACR,CACD3qlB,KAAM,IACN2qlB,QAAS,iLACR,CACD3qlB,KAAM,IACN2qlB,QAAS,mCACR,CACD3qlB,KAAM,IACN2qlB,QAAS,yFACR,CACD3qlB,KAAM,IACN2qlB,QAAS,yFACR,CACD3qlB,KAAM,KACN2qlB,QAAS,UACR,CACD3qlB,KAAM,IACN2qlB,QAAS,+GACR,CACD3qlB,KAAM,IACN2qlB,QAAS,mCACR,CACD3qlB,KAAM,IACN2qlB,QAAS,mFACR,CACD3qlB,KAAM,IACN2qlB,QAAS,iHACR,CACD3qlB,KAAM,KACN2qlB,QAAS,UACR,CACD3qlB,KAAM,IACN2qlB,QAAS,+CACR,CACD3qlB,KAAM,IACN2qlB,QAAS,mGACR,CACD3qlB,KAAM,KACN2qlB,QAAS,UACR,CACD3qlB,KAAM,IACN2qlB,QAAS,qPACR,CACD3qlB,KAAM,KACN2qlB,QAAS,UACR,CACD3qlB,KAAM,KACN2qlB,QAAS,UACR,CACD3qlB,KAAM,KACN2qlB,QAAS,UACR,CACD3qlB,KAAM,IACN2qlB,QAAS,2DACR,CACD3qlB,KAAM,IACN2qlB,QAAS,mCACR,CACD3qlB,KAAM,IACN2qlB,QAAS,qGACR,CACD3qlB,KAAM,IACN2qlB,QAAS,yGACR,CACD3qlB,KAAM,IACN2qlB,QAAS,+FACR,CACD3qlB,KAAM,KACN2qlB,QAAS,UACR,CACD3qlB,KAAM,IACN2qlB,QAAS,mMACR,CACD3qlB,KAAM,IACN2qlB,QAAS,+CACR,CACD3qlB,KAAM,KACN2qlB,QAAS,UACR,CACD3qlB,KAAM,IACN2qlB,QAAS,iEACR,CACD3qlB,KAAM,IACN2qlB,QAAS,6BACR,CACD3qlB,KAAM,IACN2qlB,QAAS,2FACR,CACD3qlB,KAAM,IACN2qlB,QAAS,oFAEPC,GAAe,IAAI9pjB,OAAO,IAAM4pjB,GAAWvgmB,KAAI,SAAU28D,GAC3D,OAAOA,EAAE6jiB,OACX,IAAGvhmB,KAAK,IAAM,IAAK,KACfyhmB,GAAkB,CAAC,EAEdhsmB,GAAI,EAAGA,GAAI6rmB,GAAWlsmB,OAAQK,KAGrC,IAFA,IAAIismB,GAAYJ,GAAW7rmB,IAElBogE,GAAI,EAAGA,GAAI6riB,GAAUH,QAAQnsmB,OAAQygE,KAC5C4riB,GAAgBC,GAAUH,QAAQ1riB,KAAM6riB,GAAU9qlB,KAItD,IAAI+qlB,GAAkB,SAAyBvomB,GAC7C,OAAOA,EAAIa,QAAQunmB,IAAc,SAAUpnmB,GACzC,OAAOqnmB,GAAgBrnmB,EACzB,GACF,EAEIwnmB,GAAkC,GAAWD,IAE7CE,GAAa,SAAoBzomB,GACnC,OAAOA,EAAIa,QAAQ,aAAc,GACnC,EAEI6nmB,GAAmB,SAA0BpzjB,GAC/C,MAAO,GAAGzuC,OAAOyuC,EAAO3L,MAAO,KAAK9iC,OAAOyuC,EAAO50C,MACpD,EAkCA,SAASiomB,GAAWzhmB,GAClBA,EAAKo1H,GACDp1H,EAAK2wF,IACL3wF,EAAK23kB,SACL33kB,EAAKuZ,OACLvZ,EAAKmwF,MACLnwF,EAAK6yH,KACL,IAAI57F,EAAWj3B,EAAKi3B,SACpBj3B,EAAK0hmB,QACL,IAAIxlmB,EAAQ,GAAyB8D,EAAM,CAAC,KAAM,MAAO,WAAY,SAAU,QAAS,OAAQ,WAAY,YAEhH,OAAO,QAAI,QAASmU,GAAS,CAC3BhY,IAAK86B,GACJ/6B,EAAO,CACRQ,KAAkB,SAAI,CACpB+lC,MAAO,aAEPZ,WAAY,EACZ06jB,OAAQ,EACR5olB,SAAU,UACV6olB,QAAS,EACThtkB,QAAS,EAET1N,MAAO,EAEPzO,MAAO,cAEPuL,MAAO,IACPO,QAAS,EACTgG,SAAU,WACV/F,UAAW,YAC8B,GAAmE,MAElH,CA0HA,IAAIuilB,GAAa,CAAC,YAAa,SAAU,WAAY,eAAgB,YACjEC,GAAc,CAChBrulB,UAAW,aAEX8P,SAAU,SACV8B,SAAU,WACVnD,OAAQ,QAGV,SAAS6/kB,GAAiBlsmB,GACxBA,EAAE+qC,gBACJ,CAEA,SAASohkB,GAAensmB,GACtBA,EAAEsyK,iBACJ,CAEA,SAAS85b,KACP,IAAIjjlB,EAAMtrB,KAAKmvB,UACXq/kB,EAAcxumB,KAAKs6B,aACnBm0kB,EAAgBnjlB,EAAMtrB,KAAKuuB,aAEnB,IAARjD,EACFtrB,KAAKmvB,UAAY,EACRs/kB,IAAkBD,IAC3BxumB,KAAKmvB,UAAY7D,EAAM,EAE3B,CAIA,SAASojlB,KACP,MAAO,iBAAkBhplB,QAAU4H,UAAU20D,cAC/C,CAEA,IAAI0shB,KAAiC,qBAAXjplB,SAA0BA,OAAO1kB,WAAY0kB,OAAO1kB,SAASC,eACnF2tmB,GAAoB,EACpBC,GAAkB,CACpBpikB,SAAS,EACTrW,SAAS,GA+FX,IAAI04kB,GAAkB,WACpB,OAAO9tmB,SAASw2a,eAAiBx2a,SAASw2a,cAAcu3L,MAC1D,EAEI,GAAgD,CAClDpqmB,KAAM,UACNC,OAAQ,gDAQV,SAASoqmB,GAAcximB,GACrB,IAAI7B,EAAW6B,EAAK7B,SAChBskmB,EAAczimB,EAAKyimB,YACnBC,EAAsB1imB,EAAK2imB,eAM3BC,EAhRN,SAA0B5imB,GACxB,IAAI27gB,EAAY37gB,EAAK27gB,UACjBknF,EAAiB7imB,EAAK6imB,eACtBC,EAAgB9imB,EAAK8imB,cACrBC,EAAc/imB,EAAK+imB,YACnBC,EAAahjmB,EAAKgjmB,WAClB/wJ,GAAW,IAAAv9b,SAAO,GAClBq9b,GAAQ,IAAAr9b,SAAO,GACfo2Y,GAAa,IAAAp2Y,QAAO,GACpBuulB,GAAe,IAAAvulB,QAAO,MACtBwulB,GAAmB,IAAAp3lB,cAAY,SAAUguB,EAAOm7K,GAElD,GAA6B,OAAzBguZ,EAAa5smB,QAAjB,CACA,IAAI8smB,EAAwBF,EAAa5smB,QACrCssB,EAAYwglB,EAAsBxglB,UAClCmL,EAAeq1kB,EAAsBr1kB,aACrCN,EAAe21kB,EAAsB31kB,aACrCzuB,EAASkkmB,EAAa5smB,QACtB+smB,EAAkBnuZ,EAAQ,EAC1BouZ,EAAkBv1kB,EAAeN,EAAe7K,EAChD2glB,GAAqB,EAErBD,EAAkBpuZ,GAASg9P,EAAS57c,UAClCysmB,GAAeA,EAAchpkB,GACjCm4a,EAAS57c,SAAU,GAGjB+smB,GAAmBrxJ,EAAM17c,UACvB2smB,GAAYA,EAAWlpkB,GAC3Bi4a,EAAM17c,SAAU,GAId+smB,GAAmBnuZ,EAAQouZ,GACzBR,IAAmB5wJ,EAAS57c,SAC9BwsmB,EAAe/okB,GAGjB/6B,EAAO4jB,UAAYmL,EACnBw1kB,GAAqB,EACrBrxJ,EAAS57c,SAAU,IACT+smB,IAAoBnuZ,EAAQtyL,IAClCoglB,IAAgBhxJ,EAAM17c,SACxB0smB,EAAYjpkB,GAGd/6B,EAAO4jB,UAAY,EACnB2glB,GAAqB,EACrBvxJ,EAAM17c,SAAU,GAIditmB,GAzDW,SAAsBxpkB,GACvCA,EAAM4G,iBACN5G,EAAMmuI,iBACR,CAuDMs7b,CAAazpkB,EAzC0B,CA2C3C,GAAG,IACC0pkB,GAAU,IAAA13lB,cAAY,SAAUguB,GAClCopkB,EAAiBppkB,EAAOA,EAAM4yW,OAChC,GAAG,CAACw2N,IACA34M,GAAe,IAAAz+Y,cAAY,SAAUguB,GAEvCgxX,EAAWz0Z,QAAUyjC,EAAMqme,eAAe,GAAGv/d,OAC/C,GAAG,IACC6pX,GAAc,IAAA3+Y,cAAY,SAAUguB,GACtC,IAAI4yW,EAASoe,EAAWz0Z,QAAUyjC,EAAMqme,eAAe,GAAGv/d,QAC1DsikB,EAAiBppkB,EAAO4yW,EAC1B,GAAG,CAACw2N,IACAO,GAAiB,IAAA33lB,cAAY,SAAU+iC,GAEzC,GAAKA,EAAL,CACA,IAAI60jB,IAAa5L,IAAwB,CACvClukB,SAAS,GAGwB,oBAAxBilB,EAAG7kB,kBACZ6kB,EAAG7kB,iBAAiB,QAASw5kB,EAASE,GAGL,oBAAxB70jB,EAAG7kB,kBACZ6kB,EAAG7kB,iBAAiB,aAAcugY,EAAcm5M,GAGf,oBAAxB70jB,EAAG7kB,kBACZ6kB,EAAG7kB,iBAAiB,YAAaygY,EAAai5M,EAdjC,CAgBjB,GAAG,CAACj5M,EAAaF,EAAci5M,IAC3BG,GAAgB,IAAA73lB,cAAY,SAAU+iC,GAEnCA,IAEiC,oBAA3BA,EAAG5kB,qBACZ4kB,EAAG5kB,oBAAoB,QAASu5kB,GAAS,GAGL,oBAA3B30jB,EAAG5kB,qBACZ4kB,EAAG5kB,oBAAoB,aAAcsgY,GAAc,GAGf,oBAA3B17W,EAAG5kB,qBACZ4kB,EAAG5kB,oBAAoB,YAAawgY,GAAa,GAErD,GAAG,CAACA,EAAaF,EAAci5M,IAS/B,OARA,IAAAzulB,YAAU,WACR,GAAK4mgB,EAAL,CACA,IAAIp6f,EAAU0hlB,EAAa5smB,QAE3B,OADAotmB,EAAelilB,GACR,WACLoilB,EAAcpilB,EAChB,CALsB,CAMxB,GAAG,CAACo6f,EAAW8nF,EAAgBE,IACxB,SAAUpilB,GACf0hlB,EAAa5smB,QAAUkrB,CACzB,CACF,CA+J+BqilB,CAAiB,CAC5CjoF,eAN2C,IAAxB+mF,GAAwCA,EAO3DG,eANmB7imB,EAAK6imB,eAOxBC,cANkB9imB,EAAK8imB,cAOvBC,YANgB/imB,EAAK+imB,YAOrBC,WANehjmB,EAAKgjmB,aAQlBa,EA3HN,SAAuB7jmB,GACrB,IAAI27gB,EAAY37gB,EAAK27gB,UACjBmoF,EAAwB9jmB,EAAK+jmB,qBAC7BA,OAAiD,IAA1BD,GAA0CA,EACjEE,GAAiB,IAAAtvlB,QAAO,CAAC,GACzBuulB,GAAe,IAAAvulB,QAAO,MACtBuvlB,GAAgB,IAAAn4lB,cAAY,SAAUo4lB,GACxC,GAAK/B,GAAL,CACA,IAAIpjmB,EAASvK,SAASkwB,KAClB06iB,EAAcrgkB,GAAUA,EAAOmB,MAWnC,GATI6jmB,GAEFpC,GAAW9rmB,SAAQ,SAAU9B,GAC3B,IAAImgB,EAAMkrjB,GAAeA,EAAYrrkB,GACrCiwmB,EAAe3tmB,QAAQtC,GAAOmgB,CAChC,IAIE6vlB,GAAwB3B,GAAoB,EAAG,CACjD,IAAI+B,EAAiBr3iB,SAASk3iB,EAAe3tmB,QAAQoL,aAAc,KAAO,EACtE8rB,EAAc/4B,SAASkwB,KAAOlwB,SAASkwB,KAAK6I,YAAc,EAC1DksL,EAAkBvgM,OAAOulE,WAAalxD,EAAc42kB,GAAkB,EAC1EzomB,OAAO6C,KAAKqjmB,IAAa/rmB,SAAQ,SAAU9B,GACzC,IAAImgB,EAAM0tlB,GAAY7tmB,GAElBqrkB,IACFA,EAAYrrkB,GAAOmgB,EAEvB,IAEIkrjB,IACFA,EAAY39jB,aAAe,GAAG9B,OAAO85M,EAAiB,MAE1D,CAGI16M,GAAUmjmB,OAEZnjmB,EAAOirB,iBAAiB,YAAa63kB,GAAkBQ,IAEnD6B,IACFA,EAAkBl6kB,iBAAiB,aAAc+3kB,GAAsBM,IACvE6B,EAAkBl6kB,iBAAiB,YAAa83kB,GAAgBO,MAKpED,IAAqB,CA1CC,CA2CxB,GAAG,IACCgC,GAAmB,IAAAt4lB,cAAY,SAAUo4lB,GAC3C,GAAK/B,GAAL,CACA,IAAIpjmB,EAASvK,SAASkwB,KAClB06iB,EAAcrgkB,GAAUA,EAAOmB,MAEnCkimB,GAAoBzllB,KAAK+D,IAAI0hlB,GAAoB,EAAG,GAEhD2B,GAAwB3B,GAAoB,GAC9CT,GAAW9rmB,SAAQ,SAAU9B,GAC3B,IAAImgB,EAAM8vlB,EAAe3tmB,QAAQtC,GAE7BqrkB,IACFA,EAAYrrkB,GAAOmgB,EAEvB,IAIEnV,GAAUmjmB,OACZnjmB,EAAOkrB,oBAAoB,YAAa43kB,GAAkBQ,IAEtD6B,IACFA,EAAkBj6kB,oBAAoB,aAAc83kB,GAAsBM,IAC1E6B,EAAkBj6kB,oBAAoB,YAAa63kB,GAAgBO,KAtBjD,CAyBxB,GAAG,IASH,OARA,IAAAttlB,YAAU,WACR,GAAK4mgB,EAAL,CACA,IAAIp6f,EAAU0hlB,EAAa5smB,QAE3B,OADA4tmB,EAAc1ilB,GACP,WACL6ilB,EAAiB7ilB,EACnB,CALsB,CAMxB,GAAG,CAACo6f,EAAWsoF,EAAeG,IACvB,SAAU7ilB,GACf0hlB,EAAa5smB,QAAUkrB,CACzB,CACF,CAkC4B8ilB,CAAc,CACtC1oF,UAAW8mF,IAQb,OAAO,QAAI,WAAgB,KAAMA,IAAe,QAAI,MAAO,CACzDjikB,QAAS8hkB,GACT5lmB,IAAK,KACHyB,GARY,SAAmBojB,GACjCqhlB,EAAuBrhlB,GACvBsilB,EAAoBtilB,EACtB,IAMF,CAEA,IAaI+ilB,GAAgB,CAClBC,eAAgBxI,GAChB/nmB,UTlEiB,SAAsBgM,GACvC,IAAI4/B,EAAa5/B,EAAK4/B,WAEtB,MAAO,CACL6C,MAAO,YACPvjB,UAHUlf,EAAK2vX,MAGI,MAAQ,KAC3B7tV,cAAelC,EAAa,OAAS,KAErCza,SAAU,WAEd,ESyDEk4kB,QTmNQ,SAAar9lB,GACrB,IAAI4/B,EAAa5/B,EAAK4/B,WAClB69a,EAAYz9c,EAAKy9c,UACjB+mJ,EAAaxkmB,EAAKxD,MAClBsmF,EAAS0hhB,EAAW1hhB,OACpBhvE,EAAe0wlB,EAAW1wlB,aAC1BqklB,EAAUqM,EAAWrM,QACzB,MAAO,CACL11jB,MAAO,UACPf,WAAY,SACZx6B,gBAAiB04B,EAAakjD,EAAO2hhB,SAAW3hhB,EAAO4hhB,SACvDC,YAAa/kkB,EAAakjD,EAAO8hhB,UAAYnnJ,EAAY36X,EAAOguQ,QAAUhuQ,EAAO84gB,UACjF9nlB,aAAcA,EACdD,YAAa,QACbgxlB,YAAa,EACbC,UAAWrnJ,EAAY,aAAa99c,OAAOmjF,EAAOguQ,SAAW,KAC7D72V,OAAQ,UACRwI,QAAS,OACTsimB,SAAU,OACVpjkB,eAAgB,gBAChBi9V,UAAWu5N,EAAQmB,cACnBkD,QAAS,eACTr3kB,SAAU,WACVhH,WAAY,YACZ,UAAW,CACTwmlB,YAAalnJ,EAAY36X,EAAOguQ,QAAUhuQ,EAAOkihB,WAGvD,ES9OEC,kBAAmBnJ,GACnB5+b,MTqQa,SAAkBl9J,GAC/B,IAAIm4lB,EAAUn4lB,EAAKxD,MAAM27lB,QACzB,MAAO,CACLj8N,cAAkC,EAAnBi8N,EAAQmC,SACvBr+N,WAA+B,EAAnBk8N,EAAQmC,SAExB,ES1QE4K,aToSoB,SAAyB9jmB,GAC7C,IAAI+2lB,EAAU/2lB,EAAM5E,MAAM27lB,QAC1B,MAAO,CACL11jB,MAAO,QACPpvB,MAAO,OACPpZ,OAAQ,UACRwI,QAAS,QACTkR,SAAU,MACVC,WAAY,MACZwoX,aAAc,SACd5oX,YAAgC,EAAnB2klB,EAAQmC,SACrB74lB,aAAiC,EAAnB02lB,EAAQmC,SACtB6K,cAAe,YAEnB,ESjTEC,oBTR2B,WAC3B,MAAO,CACL1jkB,WAAY,SACZ2jkB,UAAW,UACX5imB,QAAS,OACT6Q,WAAY,EAEhB,ESEEgylB,mBT+G0B,SAA+BxhmB,GACzD,IAAI87B,EAAa97B,EAAM87B,WACnB2lkB,EAAczhmB,EAAMtH,MACpB89lB,EAAWiL,EAAYpN,QAAQmC,SAC/Bx3gB,EAASyihB,EAAYzihB,OACzB,MAAO,CACLrgD,MAAO,qBACP4ikB,UAAW,UACXn+lB,gBAAiB04B,EAAakjD,EAAO8hhB,UAAY9hhB,EAAO84gB,UACxDx/N,aAAyB,EAAXk+N,EACdn+N,UAAsB,EAAXm+N,EACXx4kB,MAAO,EAEX,ES3HEijE,MTiUa,SAAkB/kF,GAC/B,IAAI4/B,EAAa5/B,EAAK4/B,WAClB4kkB,EAAaxkmB,EAAKxD,MAClB27lB,EAAUqM,EAAWrM,QACrBr1gB,EAAS0hhB,EAAW1hhB,OACxB,MAAO,CACL9sD,OAAQmikB,EAAQmC,SAAW,EAC3Bp+N,cAAei8N,EAAQmC,SAAW,EAClCr+N,WAAYk8N,EAAQmC,SAAW,EAC/B72B,WAAY7jiB,EAAa,SAAW,UACpCvsB,MAAOyvE,EAAO+4gB,UAElB,ES5UE2J,iBT2IwB,SAA6BvgmB,GACrD,IAAIw4c,EAAYx4c,EAAMw4c,UAClBzxa,EAAO/mC,EAAM+mC,KACbqujB,EAAcp1lB,EAAMzI,MACpBsmF,EAASu3gB,EAAYv3gB,OACrBw3gB,EAAWD,EAAYlC,QAAQmC,SACnC,MAAO,CACL73jB,MAAO,mBACPpvB,MAAOoqc,EAAY36X,EAAO64gB,UAAY74gB,EAAO84gB,UAC7Cn5lB,QAAS,OACT+sB,QAAoB,EAAX8qkB,EACTn8kB,WAAY,cACZknlB,UAAW,SACX1xlB,SAAUq4B,EACV/P,WAAY,EACZxoB,YAAau4B,EACbrpC,UAAW,SACXu5lB,cAAe,SAEnB,ES7JEuJ,eAAgBhL,GAChBxyN,KTtWY,SAAiB7mY,GAC7B,IAAI2B,EAEAmjB,EAAY9kB,EAAM8kB,UAClBw/kB,EAActkmB,EAAM5E,MACpBsX,EAAe4xlB,EAAY5xlB,aAC3BqklB,EAAUuN,EAAYvN,QACtBr1gB,EAAS4ihB,EAAY5ihB,OACzB,OAEG,GAFI//E,EAAQ,CACb0/B,MAAO,QArBX,SAAwBvc,GAKtB,OAAOA,EAJkB,CACvBvH,OAAQ,MACRG,IAAK,UAE+BoH,GAAa,QACrD,CAgB8By/kB,CAAez/kB,GAAY,QAAS,GAAkBnjB,EAAO,kBAAmB+/E,EAAO4hhB,UAAW,GAAkB3hmB,EAAO,eAAgB+Q,GAAe,GAAkB/Q,EAAO,YAAa,mEAAoE,GAAkBA,EAAO,eAAgBo1lB,EAAQyN,YAAa,GAAkB7imB,EAAO,YAAao1lB,EAAQyN,YAAa,GAAkB7imB,EAAO,WAAY,YAAa,GAAkBA,EAAO,QAAS,QAAS,GAAkBA,EAAO,SAAU,GAAIA,CAC/hB,ES4VE8imB,ST3PgB,SAAqB/hmB,GACrC,IAAIyzG,EAAYzzG,EAAMyzG,UAClB+if,EAAWx2lB,EAAMtH,MAAM27lB,QAAQmC,SACnC,MAAO,CACL/if,UAAWA,EACXh0F,UAAW,OACX24W,cAAeo+N,EACfr+N,WAAYq+N,EACZn1kB,SAAU,WAEV2glB,wBAAyB,QAE7B,ESgPEC,WTzKkB,SAAuBx+lB,GACzC,IAAIuc,EAAOvc,EAAMuc,KACbuI,EAAS9kB,EAAM8kB,OACflH,EAAW5d,EAAM4d,SACrB,MAAO,CACLvG,KAAMkF,EAAKlF,KACXuG,SAAUA,EACVrG,IAAKuN,EACLvK,MAAOgC,EAAKhC,MACZqX,OAAQ,EAEZ,ES+JE6skB,WT6WkB,SAAuBhmmB,GACzC,IAAIwkmB,EAAaxkmB,EAAKxD,MAClB27lB,EAAUqM,EAAWrM,QACrBrklB,EAAe0wlB,EAAW1wlB,aAE9B,MAAO,CACL2uB,MAAO,aACPv7B,gBAHWs9lB,EAAW1hhB,OAGE8hhB,UACxB9wlB,aAAcA,EAAe,EAC7BrR,QAAS,OACTuzB,OAAQmikB,EAAQmC,SAAW,EAC3B53lB,SAAU,EAGd,ES1XEujmB,gBT2XuB,SAA4B7kmB,GACnD,IAAIskmB,EAActkmB,EAAM5E,MACpBsX,EAAe4xlB,EAAY5xlB,aAC3BgvE,EAAS4ihB,EAAY5ihB,OACrBm6gB,EAAmB77lB,EAAM67lB,iBAC7B,MAAO,CACLnplB,aAAcA,EAAe,EAC7BT,MAAOyvE,EAAO+4gB,UACdlolB,SAAU,MACV0P,SAAU,SACVmM,QAAS,EACThc,YAAa,EACb6oB,aAAc4gkB,EAAmB,WAAa,KAC9C51lB,WAAY,SAEhB,ESzYE6+lB,iBT0YwB,SAA6BnjmB,GACrD,IAAI24lB,EAAc34lB,EAAMvG,MACpB27lB,EAAUuD,EAAYvD,QACtBrklB,EAAe4nlB,EAAY5nlB,aAC3BgvE,EAAS44gB,EAAY54gB,OAEzB,MAAO,CACLphD,WAAY,SACZ5tB,aAAcA,EAAe,EAC7B5M,gBAJcnE,EAAM06c,WAIU36X,EAAOqjhB,YACrC1jmB,QAAS,OACT+Q,YAAa2klB,EAAQmC,SACrB74lB,aAAc02lB,EAAQmC,SACtB,SAAU,CACRpzlB,gBAAiB47E,EAAOqjhB,YACxB9ylB,MAAOyvE,EAAOsjhB,QAGpB,ES3ZEC,iBAAkB7L,GAClBpsjB,OT4dc,SAAmBpuC,GACjC,IAAI4/B,EAAa5/B,EAAK4/B,WAClB69a,EAAYz9c,EAAKy9c,UACjBrnD,EAAap2Z,EAAKo2Z,WAClBouM,EAAaxkmB,EAAKxD,MAClB27lB,EAAUqM,EAAWrM,QACrBr1gB,EAAS0hhB,EAAW1hhB,OACxB,MAAO,CACLrgD,MAAO,SACPv7B,gBAAiBkvZ,EAAatzU,EAAOguQ,QAAU2sH,EAAY36X,EAAOwjhB,UAAY,cAC9EjzlB,MAAOusB,EAAakjD,EAAO84gB,UAAYxlM,EAAatzU,EAAO4hhB,SAAW,UACtEzqmB,OAAQ,UACRwI,QAAS,QACTkR,SAAU,UACV6b,QAAS,GAAG7vB,OAA0B,EAAnBw4lB,EAAQmC,SAAc,OAAO36lB,OAA0B,EAAnBw4lB,EAAQmC,SAAc,MAC7Ex4kB,MAAO,OACPlf,WAAY,OACZ2jmB,wBAAyB,mBAEzB,UAAW,CACTr/lB,iBAAkB04B,IAAew2X,EAAatzU,EAAOguQ,QAAUhuQ,EAAO0jhB,YAG5E,ESlfElsN,YT0gBmB,SAAwBt6Y,GAC3C,IAAIwkmB,EAAaxkmB,EAAKxD,MAClB27lB,EAAUqM,EAAWrM,QAEzB,MAAO,CACL11jB,MAAO,cACPpvB,MAHWmxlB,EAAW1hhB,OAGR2jhB,UACdpqO,WAAY87N,EAAQmC,SAAW,EAC/B7mlB,YAAa0klB,EAAQmC,SAAW,EAChCn1kB,SAAU,WACVrG,IAAK,MACLM,UAAW,mBAEf,ESthBEouO,YTsiBU,SAAaxtP,GACvB,IAAI4/B,EAAa5/B,EAAK4/B,WAClB4kkB,EAAaxkmB,EAAKxD,MAClB27lB,EAAUqM,EAAWrM,QACrBr1gB,EAAS0hhB,EAAW1hhB,OACxB,MAAO,CACLrgD,MAAO,cACPpvB,MAAOusB,EAAakjD,EAAOy3gB,UAAYz3gB,EAAO+4gB,UAC9Cx/N,WAAY87N,EAAQmC,SAAW,EAC/B7mlB,YAAa0klB,EAAQmC,SAAW,EAChCt+jB,SAAU,eAAer8B,OAA0B,EAAnBw4lB,EAAQmC,SAAc,OACtDj3kB,SAAU,SACV8B,SAAU,WACVkX,aAAc,WACdh1B,WAAY,SACZyX,IAAK,MACLM,UAAW,mBAEf,ESvjBE2vI,eTxDsB,SAA2B3tJ,GACjD,IAAI+2lB,EAAU/2lB,EAAM5E,MAAM27lB,QAC1B,MAAO,CACLz2jB,WAAY,SACZj/B,QAAS,OACTsjC,KAAM,EACNg/jB,SAAU,OACVv1kB,QAAS,GAAG7vB,OAAOw4lB,EAAQmC,SAAW,EAAG,OAAO36lB,OAA0B,EAAnBw4lB,EAAQmC,SAAc,MAC7EwL,wBAAyB,QACzB3glB,SAAU,WACV9B,SAAU,SAEd,GSmEA,IAxayCspB,GAucrC+5jB,GAAe,CACjB5ylB,aAbiB,EAcjBgvE,OAjCW,CACXguQ,QAAS,UACT61Q,UAAW,UACXH,UAAW,UACXF,UAAW,UACXF,OAAQ,UACRD,YAAa,UACbzB,SAAU,mBACVD,SAAU,kBACVG,UAAW,kBACXhJ,UAAW,kBACXoJ,UAAW,kBACXzK,UAAW,kBACXkM,UAAW,kBACX9K,UAAW,kBACXiL,UAAW,kBACX/K,UAAW,kBACXgL,UAAW,mBAiBX1O,QARY,CACZmC,SANa,EAObhB,cALkB,GAMlBsM,WAJetL,IAYb,GAAe,CACjB,YAAa,SACbwM,uBAAuB,EACvBC,kBAAmBnP,KACnBoP,mBAAoBpP,KACpBqP,mBAAmB,EACnBC,mBAAmB,EACnBl+f,WAAY,CAAC,EACbm+f,0BAA0B,EAC1BC,mBAAmB,EACnBvsN,aAtdO,SAAUzsW,EAAQi5jB,GACvB,IAAIC,EAAwB,GAAe,CACzCC,YAAY,EACZC,eAAe,EACf/vlB,UAAW+plB,GACXh3jB,MAAM,EACNi9jB,UAAW,OACV96jB,IACC46jB,EAAaD,EAAsBC,WACnCC,EAAgBF,EAAsBE,cACtC/vlB,EAAY6vlB,EAAsB7vlB,UAClC+yB,EAAO88jB,EAAsB98jB,KAC7Bi9jB,EAAYH,EAAsBG,UAElC1ihB,EAAQv6C,EAAO+2jB,GAAW8F,GAAYA,EACtCnye,EAAY1qF,EAAO+2jB,GAAW9plB,EAAU22B,IAAW32B,EAAU22B,GAYjE,OAVIm5jB,IACFxihB,EAAQA,EAAMnrF,cACds7H,EAAYA,EAAUt7H,eAGpB4tmB,IACFzihB,EAAQu8gB,GAAgCv8gB,GACxCmwC,EAAYmse,GAAgBnse,IAGT,UAAduye,EAAwBvye,EAAUxtE,OAAO,EAAGq9B,EAAMjwF,UAAYiwF,EAAQmwC,EAAUxtH,QAAQq9E,IAAU,CAC3G,EA2bA2ihB,iBA1GqB,SAA0Bxqc,GAC/C,OAAOA,EAAMz6H,KACf,EAyGEu9jB,eAxGmB,SAAwB5xjB,GAC3C,OAAOA,EAAO3L,KAChB,EAuGEklkB,eAtGmB,SAAwBv5jB,GAC3C,OAAOA,EAAO50C,KAChB,EAqGEomC,YAAY,EACZi4e,WAAW,EACXw/E,SAAS,EACT1nO,OAAO,EACPsvO,cAAc,EACdgB,iBAzGqB,SAA0B7xjB,GAC/C,QAASA,EAAOxO,UAClB,EAwGE6lkB,eAAgB,WACd,MAAO,YACT,EACA7L,cAAe,IACfE,cAAe,IACfsD,YAAY,EACZrD,cAAe,SACfC,aAAc,WACd4N,uBAAuB,EACvB3N,0BTxpBF,WACE,IACE,MAAO,iEAAiEztlB,KAAKsU,UAAUM,UACzF,CAAE,MAAOzrB,GACP,OAAO,CACT,CACF,CSkpB6BkymB,GAC3BxB,iBAAkB,WAChB,MAAO,YACT,EACAyB,iBAAiB,EACjBC,iBAAiB,EACjBx0mB,QAAS,GACTk1gB,SAAU,EACVnuH,YAAa,YACb4lN,mBAAoB,SAA4BlgmB,GAC9C,IAAI2pD,EAAQ3pD,EAAK2pD,MACjB,MAAO,GAAGhqD,OAAOgqD,EAAO,WAAWhqD,OAAiB,IAAVgqD,EAAc,IAAM,GAAI,aACpE,EACAvxD,OAAQ,CAAC,EACTmhY,SAAU,IACV2lO,iBAAiB,GAGnB,SAAS8I,GAAoB9rmB,EAAOkyC,EAAQkxjB,EAAat7lB,GAOvD,MAAO,CACLrH,KAAM,SACN8rB,KAAM2lB,EACNxO,WATeqokB,GAAkB/rmB,EAAOkyC,EAAQkxjB,GAUhDlpM,WARe8xM,GAAkBhsmB,EAAOkyC,EAAQkxjB,GAShD78jB,MAPU0lkB,GAAiBjsmB,EAAOkyC,GAQlC50C,MAPU4umB,GAAiBlsmB,EAAOkyC,GAQlCpqC,MAAOA,EAEX,CAEA,SAASqkmB,GAAwBnsmB,EAAOojmB,GACtC,OAAOpjmB,EAAM3I,QAAQkN,KAAI,SAAU6nmB,EAAeC,GAChD,GAAID,EAAc/0mB,QAAS,CACzB,IAAIi1mB,EAAqBF,EAAc/0mB,QAAQkN,KAAI,SAAU2tC,EAAQq6jB,GACnE,OAAOT,GAAoB9rmB,EAAOkyC,EAAQkxjB,EAAamJ,EACzD,IAAG/pmB,QAAO,SAAUgqmB,GAClB,OAAOrtO,GAAYn/X,EAAOwsmB,EAC5B,IACA,OAAOF,EAAmB1zmB,OAAS,EAAI,CACrC6H,KAAM,QACN8rB,KAAM6/kB,EACN/0mB,QAASi1mB,EACTxkmB,MAAOukmB,QACL70mB,CACN,CAEA,IAAIg1mB,EAAoBV,GAAoB9rmB,EAAOosmB,EAAehJ,EAAaiJ,GAC/E,OAAOltO,GAAYn/X,EAAOwsmB,GAAqBA,OAAoBh1mB,CACrE,IACCgL,QAAO,SAAUgqmB,GAChB,QAASA,CACX,GACF,CAEA,SAASC,GAA4CH,GACnD,OAAOA,EAAmB3omB,QAAO,SAAU+omB,EAAoBF,GAS7D,MAR+B,UAA3BA,EAAkB/rmB,KACpBismB,EAAmB3zmB,KAAKmI,MAAMwrmB,EAAoB,GAAmBF,EAAkBn1mB,QAAQkN,KAAI,SAAU2tC,GAC3G,OAAOA,EAAO3lB,IAChB,MAEAmglB,EAAmB3zmB,KAAKyzmB,EAAkBjglB,MAGrCmglB,CACT,GAAG,GACL,CAMA,SAASvtO,GAAYn/X,EAAOwsmB,GAC1B,IAAIG,EAAoB3smB,EAAMupY,WAC1BA,OAAmC,IAAtBojO,EAA+B,GAAKA,EACjDpglB,EAAOiglB,EAAkBjglB,KACzB2tY,EAAasyM,EAAkBtyM,WAC/B3zX,EAAQimkB,EAAkBjmkB,MAC1BjpC,EAAQkvmB,EAAkBlvmB,MAC9B,QAASsvmB,GAA0B5smB,KAAWk6Z,IAAe2yM,GAAc7smB,EAAO,CAChFumC,MAAOA,EACPjpC,MAAOA,EACPivB,KAAMA,GACLg9W,EACL,CA4BA,IAAI0iO,GAAmB,SAAwBjsmB,EAAOusB,GACpD,OAAOvsB,EAAM8jmB,eAAev3kB,EAC9B,EAEI2/kB,GAAmB,SAAwBlsmB,EAAOusB,GACpD,OAAOvsB,EAAMyrmB,eAAel/kB,EAC9B,EAEA,SAASw/kB,GAAkB/rmB,EAAOkyC,EAAQkxjB,GACxC,MAAyC,oBAA3BpjmB,EAAM+jmB,kBAAkC/jmB,EAAM+jmB,iBAAiB7xjB,EAAQkxjB,EACvF,CAEA,SAAS4I,GAAkBhsmB,EAAOkyC,EAAQkxjB,GACxC,GAAIA,EAAY53lB,QAAQ0mC,IAAW,EAAG,OAAO,EAE7C,GAAsC,oBAA3BlyC,EAAM8smB,iBACf,OAAO9smB,EAAM8smB,iBAAiB56jB,EAAQkxjB,GAGxC,IAAIpqe,EAAYkze,GAAiBlsmB,EAAOkyC,GACxC,OAAOkxjB,EAAYr4kB,MAAK,SAAU9xB,GAChC,OAAOizmB,GAAiBlsmB,EAAO/G,KAAO+/H,CACxC,GACF,CAEA,SAAS6ze,GAAc7smB,EAAOkyC,EAAQq3V,GACpC,OAAOvpY,EAAM2+Y,cAAe3+Y,EAAM2+Y,aAAazsW,EAAQq3V,EACzD,CAEA,IAAIqjO,GAA4B,SAAmC5smB,GACjE,IAAI+smB,EAAsB/smB,EAAM+smB,oBAC5B5R,EAAUn7lB,EAAMm7lB,QACpB,YAA4B3jmB,IAAxBu1mB,EAA0C5R,EACvC4R,CACT,EAEIntQ,GAAa,EAEbtxK,GAAsB,SAAUkqa,GAClC,GAAUlqa,EAAQkqa,GAElB,IAAIprlB,EAAS,GAAakhL,GAS1B,SAASA,EAAOinZ,GACd,IAAIhokB,EA2oBJ,OAzoBA,GAAgBjW,KAAMg3L,IAEtB/gL,EAAQH,EAAO5R,KAAKlE,KAAMi+kB,IACpB5zjB,MAAQ,CACZ8hlB,cAAe,KACfC,cAAe,KACfC,aAAc,KACdqJ,eAAe,EACfzrJ,WAAW,EACX6hJ,YAAa,GACb6J,yBAAyB,EACzBC,8BAA0B11mB,EAC1B+kjB,eAAW/kjB,GAEb+V,EAAM4/lB,kBAAmB,EACzB5/lB,EAAM6/lB,aAAc,EACpB7/lB,EAAM8/lB,iBAAc,EACpB9/lB,EAAM+/lB,cAAgB,EACtB//lB,EAAMggmB,cAAgB,EACtBhgmB,EAAMigmB,eAAiB,GACvBjgmB,EAAMkgmB,gBAAiB,EACvBlgmB,EAAMmgmB,+BAAgC,EACtCngmB,EAAMogmB,oBAAiB,EACvBpgmB,EAAMqgmB,WAAa,KAEnBrgmB,EAAMsgmB,cAAgB,SAAU5tmB,GAC9BsN,EAAMqgmB,WAAa3tmB,CACrB,EAEAsN,EAAMugmB,iBAAmB,KAEzBvgmB,EAAMwgmB,oBAAsB,SAAU9tmB,GACpCsN,EAAMugmB,iBAAmB7tmB,CAC3B,EAEAsN,EAAMygmB,YAAc,KAEpBzgmB,EAAM0gmB,eAAiB,SAAUhumB,GAC/BsN,EAAMygmB,YAAc/tmB,CACtB,EAEAsN,EAAMwmlB,SAAW,KAEjBxmlB,EAAM2gmB,YAAc,SAAUjumB,GAC5BsN,EAAMwmlB,SAAW9zlB,CACnB,EAEAsN,EAAM0vY,MAAQ1vY,EAAM4gmB,WACpB5gmB,EAAM84lB,KAAO94lB,EAAM6gmB,UAEnB7gmB,EAAM8hE,SAAW,SAAUirG,EAAU+zb,GACnC,IAAInvB,EAAc3xkB,EAAMvN,MACpBqvE,EAAW6vgB,EAAY7vgB,SACvBpzE,EAAOijlB,EAAYjjlB,KACvBoymB,EAAWpymB,KAAOA,EAElBsR,EAAM+gmB,aAAah0b,EAAU+zb,GAE7Bh/hB,EAASirG,EAAU+zb,EACrB,EAEA9gmB,EAAMwjF,SAAW,SAAUupF,GACzB,IAAIp+J,EAASlb,UAAUpI,OAAS,QAAsBpB,IAAjBwJ,UAAU,GAAmBA,UAAU,GAAK,YAC7EkxC,EAASlxC,UAAUpI,OAAS,EAAIoI,UAAU,QAAKxJ,EAC/CuolB,EAAexykB,EAAMvN,MACrB+qmB,EAAoBhrB,EAAagrB,kBACjC5P,EAAUpb,EAAaob,QAE3B5tlB,EAAMghmB,cAAc,GAAI,CACtBrylB,OAAQ,cAGN6ulB,IACFx9lB,EAAMkuB,SAAS,CACbyxkB,0BAA2B/R,IAG7B5tlB,EAAMihmB,eAIRjhmB,EAAMkuB,SAAS,CACbwxkB,yBAAyB,IAG3B1/lB,EAAM8hE,SAASirG,EAAU,CACvBp+J,OAAQA,EACRg2B,OAAQA,GAEZ,EAEA3kC,EAAM6tlB,aAAe,SAAU9gb,GAC7B,IAAI2la,EAAe1ykB,EAAMvN,MACrB6qmB,EAAoB5qB,EAAa4qB,kBACjC1P,EAAUlb,EAAakb,QACvBl/lB,EAAOgklB,EAAahklB,KACpBmnmB,EAAc71lB,EAAMoU,MAAMyhlB,YAE1BqL,EAAatT,GAAW5tlB,EAAMu/lB,iBAAiBxyb,EAAU8ob,GAEzD1/jB,EAAan2B,EAAMw2lB,iBAAiBzpb,EAAU8ob,GAElD,GAAIqL,EAAY,CACd,IAAIz1e,EAAYzrH,EAAMk+lB,eAAenxb,GAErC/sK,EAAMwjF,SAASqygB,EAAY5gmB,QAAO,SAAUvJ,GAC1C,OAAOsU,EAAMk+lB,eAAexymB,KAAO+/H,CACrC,IAAI,kBAAmBshD,EACzB,KAAO,IAAK52I,EAaV,YALAn2B,EAAM+gmB,aAAah0b,EAAU,CAC3Bp+J,OAAQ,gBACRjgB,KAAMA,IARJk/lB,EACF5tlB,EAAMwjF,SAAS,GAAGttF,OAAO,GAAmB2/lB,GAAc,CAAC9ob,IAAY,gBAAiBA,GAExF/sK,EAAMwjF,SAASupF,EAAU,gBAS7B,CAEIuwb,GACFt9lB,EAAM6gmB,WAEV,EAEA7gmB,EAAMmhmB,YAAc,SAAUvK,GAC5B,IAAIhJ,EAAU5tlB,EAAMvN,MAAMm7lB,QACtBiI,EAAc71lB,EAAMoU,MAAMyhlB,YAE1Bpqe,EAAYzrH,EAAMk+lB,eAAetH,GAEjCwK,EAAgBvL,EAAY5gmB,QAAO,SAAUvJ,GAC/C,OAAOsU,EAAMk+lB,eAAexymB,KAAO+/H,CACrC,IACIshD,EAAW6gb,EAAUwT,EAAgBA,EAAc,IAAM,KAE7DphmB,EAAM8hE,SAASirG,EAAU,CACvBp+J,OAAQ,eACRiolB,aAAcA,IAGhB52lB,EAAM4gmB,YACR,EAEA5gmB,EAAM2tlB,WAAa,WACjB,IAAIkI,EAAc71lB,EAAMoU,MAAMyhlB,YAE9B71lB,EAAM8hE,SAAS9hE,EAAMvN,MAAMm7lB,QAAU,GAAK,KAAM,CAC9Cj/kB,OAAQ,QACR0ylB,cAAexL,GAEnB,EAEA71lB,EAAMshmB,SAAW,WACf,IAAI1T,EAAU5tlB,EAAMvN,MAAMm7lB,QACtBiI,EAAc71lB,EAAMoU,MAAMyhlB,YAC1B0L,EAAoB1L,EAAYA,EAAYxqmB,OAAS,GACrD+1mB,EAAgBvL,EAAY76lB,MAAM,EAAG66lB,EAAYxqmB,OAAS,GAC1D0hL,EAAW6gb,EAAUwT,EAAgBA,EAAc,IAAM,KAE7DphmB,EAAM8hE,SAASirG,EAAU,CACvBp+J,OAAQ,YACRiolB,aAAc2K,GAElB,EAEAvhmB,EAAMm9C,SAAW,WACf,OAAOn9C,EAAMoU,MAAMyhlB,WACrB,EAEA71lB,EAAM1L,GAAK,WACT,IAAK,IAAId,EAAOC,UAAUpI,OAAQqG,EAAO,IAAI1D,MAAMwF,GAAOtC,EAAO,EAAGA,EAAOsC,EAAMtC,IAC/EQ,EAAKR,GAAQuC,UAAUvC,GAGzB,OAAOlC,GAAW2E,WAAM,EAAQ,CAACqM,EAAMvN,MAAM+umB,iBAAiBtrmB,OAAOxE,GACvE,EAEAsO,EAAMu2lB,eAAiB,SAAUv3kB,GAC/B,OAAO0/kB,GAAiB1+lB,EAAMvN,MAAOusB,EACvC,EAEAhf,EAAMk+lB,eAAiB,SAAUl/kB,GAC/B,OAAO2/kB,GAAiB3+lB,EAAMvN,MAAOusB,EACvC,EAEAhf,EAAM47B,UAAY,SAAUtxC,EAAKmI,GAC/B,IAAIoa,EAAOgulB,GAAcvwmB,GAAKmI,GAC9Boa,EAAK/C,UAAY,aACjB,IAAI23lB,EAASzhmB,EAAMvN,MAAM9D,OAAOrE,GAChC,OAAOm3mB,EAASA,EAAO50lB,EAAMpa,GAASoa,CACxC,EAEA7M,EAAM0hmB,aAAe,SAAU5plB,GAC7B,MAAO,GAAG5hB,OAAO8J,EAAMigmB,eAAgB,KAAK/pmB,OAAO4hB,EACrD,EAEA9X,EAAM2hmB,cAAgB,WACpB,OTsJ6ClvmB,EStJpBuN,EAAMvN,MTuJ5B,GAAe,GAAe,CAAC,EAAG8sG,IAAa9sG,EAAM8sG,YADtC,IAA2B9sG,CSrJ/C,EAEAuN,EAAM4+lB,wBAA0B,WAC9B,OAAOA,GAAwB5+lB,EAAMvN,MAAOuN,EAAMoU,MAAMyhlB,YAC1D,EAEA71lB,EAAM4hmB,sBAAwB,WAC5B,OAAO5hmB,EAAMvN,MAAMkhmB,WAAa3zlB,EAAM4+lB,0BAA4B,EACpE,EAEA5+lB,EAAM6hmB,sBAAwB,WAC5B,OAAO3C,GAA4Cl/lB,EAAM4+lB,0BAC3D,EAEA5+lB,EAAM8hmB,oBAAsB,WAC1B,OAAO9hmB,EAAMvN,MAAMkhmB,WAAa3zlB,EAAM6hmB,wBAA0B,EAClE,EAEA7hmB,EAAM+gmB,aAAe,SAAUhxmB,EAAO+wmB,GACpC9gmB,EAAMkuB,SAAS,CACbgokB,cAAe,GAAe,CAC5BnmmB,MAAOA,GACN+wmB,IAEP,EAEA9gmB,EAAM+hmB,gBAAkB,SAAU1xkB,GACX,IAAjBA,EAAM0/V,SAIV1/V,EAAMmuI,kBACNnuI,EAAM4G,iBAENj3B,EAAM4gmB,aACR,EAEA5gmB,EAAMgimB,gBAAkB,SAAU3xkB,GAChCrwB,EAAM4/lB,kBAAmB,CAC3B,EAEA5/lB,EAAMiimB,mBAAqB,SAAU5xkB,GACnC,IAAIiukB,EAAkBt+lB,EAAMvN,MAAM6rmB,gBAE7Bt+lB,EAAMoU,MAAM4/b,UAMLh0c,EAAMvN,MAAMkhmB,WAMG,UAAzBtjkB,EAAM/6B,OAAOuB,SAAgD,aAAzBw5B,EAAM/6B,OAAOuB,SAC/CmJ,EAAMihmB,cANJ3C,GACFt+lB,EAAMkimB,SAAS,UAPb5D,IACFt+lB,EAAMkgmB,gBAAiB,GAGzBlgmB,EAAM4gmB,cAaiB,UAAzBvwkB,EAAM/6B,OAAOuB,SAAgD,aAAzBw5B,EAAM/6B,OAAOuB,SAC/Cw5B,EAAM4G,gBAEV,EAEAj3B,EAAMmimB,6BAA+B,SAAU9xkB,GAE7C,KAAIA,GAAwB,cAAfA,EAAMn9B,MAAyC,IAAjBm9B,EAAM0/V,UAI7C/vX,EAAMvN,MAAM0jC,WAAhB,CACA,IAAIy8iB,EAAe5ykB,EAAMvN,MACrBm7lB,EAAUhb,EAAagb,QACvB+F,EAAa/gB,EAAa+gB,WAE9B3zlB,EAAM4gmB,aAEFjN,GACF3zlB,EAAMkuB,SAAS,CACbyxkB,0BAA2B/R,IAG7B5tlB,EAAMihmB,eAENjhmB,EAAMkimB,SAAS,SAGjB7xkB,EAAM4G,iBACN5G,EAAMmuI,iBAlB4B,CAmBpC,EAEAx+J,EAAMoimB,0BAA4B,SAAU/xkB,GAEtCA,GAAwB,cAAfA,EAAMn9B,MAAyC,IAAjBm9B,EAAM0/V,SAIjD/vX,EAAM2tlB,aAENt9jB,EAAMmuI,kBACNx+J,EAAMkgmB,gBAAiB,EAEJ,aAAf7vkB,EAAMn9B,KACR8M,EAAM4gmB,aAENpulB,YAAW,WACT,OAAOxS,EAAM4gmB,YACf,IAEJ,EAEA5gmB,EAAMqimB,SAAW,SAAUhykB,GACoB,mBAAlCrwB,EAAMvN,MAAMgrmB,kBACjBptkB,EAAM/6B,kBAAkBjD,aAAe07lB,GAAkB19jB,EAAM/6B,SACjE0K,EAAMvN,MAAMwumB,cAEoC,oBAAlCjhmB,EAAMvN,MAAMgrmB,mBACxBz9lB,EAAMvN,MAAMgrmB,kBAAkBptkB,IAChCrwB,EAAMvN,MAAMwumB,aAGlB,EAEAjhmB,EAAMsimB,mBAAqB,WACzBtimB,EAAM6/lB,aAAc,CACtB,EAEA7/lB,EAAMuimB,iBAAmB,WACvBvimB,EAAM6/lB,aAAc,CACtB,EAEA7/lB,EAAM8gZ,aAAe,SAAUnpZ,GAC7B,IAAI4pZ,EAAU5pZ,EAAM4pZ,QAChBK,EAAQL,GAAWA,EAAQ/pY,KAAK,GAE/BoqY,IAIL5hZ,EAAM+/lB,cAAgBn+M,EAAM1qX,QAC5Bl3B,EAAMggmB,cAAgBp+M,EAAMzqX,QAC5Bn3B,EAAMogmB,gBAAiB,EACzB,EAEApgmB,EAAMghZ,YAAc,SAAU1nZ,GAC5B,IAAIioZ,EAAUjoZ,EAAMioZ,QAChBK,EAAQL,GAAWA,EAAQ/pY,KAAK,GAEpC,GAAKoqY,EAAL,CAIA,IAAI1e,EAAShwX,KAAK0H,IAAIgnY,EAAM1qX,QAAUl3B,EAAM+/lB,eACxC98N,EAAS/vX,KAAK0H,IAAIgnY,EAAMzqX,QAAUn3B,EAAMggmB,eAE5ChgmB,EAAMogmB,eAAiBl9N,EADH,GAC6BD,EAD7B,CAJpB,CAMF,EAEAjjY,EAAMkhZ,WAAa,SAAU7wX,GACvBrwB,EAAMogmB,iBAINpgmB,EAAMqgmB,aAAergmB,EAAMqgmB,WAAWh9kB,SAASgN,EAAM/6B,SAAW0K,EAAMygmB,cAAgBzgmB,EAAMygmB,YAAYp9kB,SAASgN,EAAM/6B,SACzH0K,EAAM6gmB,YAIR7gmB,EAAM+/lB,cAAgB,EACtB//lB,EAAMggmB,cAAgB,EACxB,EAEAhgmB,EAAMwimB,kBAAoB,SAAUnykB,GAC9BrwB,EAAMogmB,gBAEVpgmB,EAAMiimB,mBAAmB5xkB,EAC3B,EAEArwB,EAAMyimB,yBAA2B,SAAUpykB,GACrCrwB,EAAMogmB,gBAEVpgmB,EAAMoimB,0BAA0B/xkB,EAClC,EAEArwB,EAAM0imB,4BAA8B,SAAUrykB,GACxCrwB,EAAMogmB,gBAEVpgmB,EAAMmimB,6BAA6B9xkB,EACrC,EAEArwB,EAAM2imB,kBAAoB,SAAUtykB,GAClC,IAAI2rW,EAAa3rW,EAAMuykB,cAAc7ymB,MAErCiQ,EAAMkuB,SAAS,CACbyxkB,0BAA0B,IAG5B3/lB,EAAMghmB,cAAchlO,EAAY,CAC9BrtX,OAAQ,iBAGL3O,EAAMvN,MAAMkhmB,YACf3zlB,EAAM6imB,YAEV,EAEA7imB,EAAM8imB,aAAe,SAAUzykB,GACzBrwB,EAAMvN,MAAM8kC,SACdv3B,EAAMvN,MAAM8kC,QAAQlH,GAGtBrwB,EAAMkuB,SAAS,CACbyxkB,0BAA0B,EAC1B3rJ,WAAW,KAGTh0c,EAAMkgmB,gBAAkBlgmB,EAAMvN,MAAM4rmB,kBACtCr+lB,EAAMkimB,SAAS,SAGjBlimB,EAAMkgmB,gBAAiB,CACzB,EAEAlgmB,EAAM+imB,YAAc,SAAU1ykB,GACxBrwB,EAAMygmB,aAAezgmB,EAAMygmB,YAAYp9kB,SAASt4B,SAASw2a,eAC3Dvha,EAAMwmlB,SAAS92M,SAKb1vY,EAAMvN,MAAM+kC,QACdx3B,EAAMvN,MAAM+kC,OAAOnH,GAGrBrwB,EAAMghmB,cAAc,GAAI,CACtBrylB,OAAQ,eAGV3O,EAAMihmB,cAENjhmB,EAAMkuB,SAAS,CACbkokB,aAAc,KACdpiJ,WAAW,IAEf,EAEAh0c,EAAMgjmB,cAAgB,SAAU7M,GAC1Bn2lB,EAAM4/lB,kBAAoB5/lB,EAAMoU,MAAM+hlB,gBAAkBA,GAI5Dn2lB,EAAMkuB,SAAS,CACbiokB,cAAeA,GAEnB,EAEAn2lB,EAAMq/lB,0BAA4B,WAChC,OAAOA,GAA0Br/lB,EAAMvN,MACzC,EAEAuN,EAAMq2B,UAAY,SAAUhG,GAC1B,IAAI4ykB,EAAejjmB,EAAMvN,MACrBm7lB,EAAUqV,EAAarV,QACvByP,EAAwB4F,EAAa5F,sBACrCM,EAAoBsF,EAAatF,kBACjC3hO,EAAainO,EAAajnO,WAC1BknO,EAAcD,EAAaC,YAC3B/skB,EAAa8skB,EAAa9skB,WAC1Bw9jB,EAAasP,EAAatP,WAC1Bt9jB,EAAY4skB,EAAa5skB,UACzBo/jB,EAAkBwN,EAAaxN,gBAC/B4I,EAAkB4E,EAAa5E,gBAC/B8E,EAAcnjmB,EAAMoU,MACpB+hlB,EAAgBgN,EAAYhN,cAC5BC,EAAe+M,EAAY/M,aAC3BP,EAAcsN,EAAYtN,YAC9B,IAAI1/jB,IAEqB,oBAAdE,IACTA,EAAUhG,IAENA,EAAM2G,mBAHZ,CAWA,OAFAh3B,EAAM4/lB,kBAAmB,EAEjBvvkB,EAAM/lC,KACZ,IAAK,YACH,IAAKsjmB,GAAW5xN,EAAY,OAE5Bh8X,EAAMojmB,WAAW,YAEjB,MAEF,IAAK,aACH,IAAKxV,GAAW5xN,EAAY,OAE5Bh8X,EAAMojmB,WAAW,QAEjB,MAEF,IAAK,SACL,IAAK,YACH,GAAIpnO,EAAY,OAEhB,GAAIo6N,EACFp2lB,EAAMmhmB,YAAY/K,OACb,CACL,IAAKiH,EAAuB,OAExBzP,EACF5tlB,EAAMshmB,WACG4B,GACTljmB,EAAM2tlB,YAEV,CAEA,MAEF,IAAK,MACH,GAAI3tlB,EAAM6/lB,YAAa,OAEvB,GAAIxvkB,EAAMy/U,WAAa6jP,IAAe8B,IAAoBU,GAE1DkI,GAAmBr+lB,EAAMu/lB,iBAAiBpJ,EAAeN,GACvD,OAGF71lB,EAAM6tlB,aAAasI,GAEnB,MAEF,IAAK,QACH,GAAsB,MAAlB9lkB,EAAMuwW,QAGR,MAGF,GAAI+yN,EAAY,CACd,IAAKwC,EAAe,OACpB,GAAIn2lB,EAAM6/lB,YAAa,OAEvB7/lB,EAAM6tlB,aAAasI,GAEnB,KACF,CAEA,OAEF,IAAK,SACCxC,GACF3zlB,EAAMkuB,SAAS,CACbyxkB,0BAA0B,IAG5B3/lB,EAAMghmB,cAAc,GAAI,CACtBrylB,OAAQ,eAGV3O,EAAMihmB,eACGiC,GAAevF,GACxB39lB,EAAM2tlB,aAGR,MAEF,IAAK,IAEH,GAAI3xN,EACF,OAGF,IAAK23N,EAAY,CACf3zlB,EAAMkimB,SAAS,SAEf,KACF,CAEA,IAAK/L,EAAe,OAEpBn2lB,EAAM6tlB,aAAasI,GAEnB,MAEF,IAAK,UACCxC,EACF3zlB,EAAMqjmB,YAAY,MAElBrjmB,EAAMkimB,SAAS,QAGjB,MAEF,IAAK,YACCvO,EACF3zlB,EAAMqjmB,YAAY,QAElBrjmB,EAAMkimB,SAAS,SAGjB,MAEF,IAAK,SACH,IAAKvO,EAAY,OAEjB3zlB,EAAMqjmB,YAAY,UAElB,MAEF,IAAK,WACH,IAAK1P,EAAY,OAEjB3zlB,EAAMqjmB,YAAY,YAElB,MAEF,IAAK,OACH,IAAK1P,EAAY,OAEjB3zlB,EAAMqjmB,YAAY,SAElB,MAEF,IAAK,MACH,IAAK1P,EAAY,OAEjB3zlB,EAAMqjmB,YAAY,QAElB,MAEF,QACE,OAGJhzkB,EAAM4G,gBA1JN,CA2JF,EAEAj3B,EAAMigmB,eAAiB,iBAAmBjgmB,EAAMvN,MAAM4/V,cAAgBA,IACtEryV,EAAMoU,MAAMyhlB,YAAcpI,GAAWzlB,EAAOj4kB,OACrCiQ,CACT,CA22BA,OAz2BA,GAAa+gL,EAAQ,CAAC,CACpBz2L,IAAK,oBACLyF,MAAO,WACLhG,KAAKu5mB,4BACLv5mB,KAAKw5mB,wBAEDx5mB,KAAK0I,MAAMgrmB,mBAAqB1ymB,UAAYA,SAASw1B,kBAEvDx1B,SAASw1B,iBAAiB,SAAUx2B,KAAKs4mB,UAAU,GAGjDt4mB,KAAK0I,MAAM+wmB,WACbz5mB,KAAK62mB,YAET,GACC,CACDt2mB,IAAK,qBACLyF,MAAO,SAA4Bi/iB,GACjC,ITzgDkBu/C,EAAQkV,EAC1BC,EACAC,EACAC,ESsgDIC,EAAe95mB,KAAK0I,MACpB0jC,EAAa0tkB,EAAa1tkB,WAC1Bw9jB,EAAakQ,EAAalQ,WAC1B3/I,EAAYjqd,KAAKqqB,MAAM4/b,WAG3BA,IAAc79a,GAAc64gB,EAAU74gB,YACtC69a,GAAa2/I,IAAe3kD,EAAU2kD,aACpC5pmB,KAAK62mB,aAGH5sJ,GAAa79a,IAAe64gB,EAAU74gB,YAExCpsC,KAAKmkC,SAAS,CACZ8lb,WAAW,GACVjqd,KAAKk3mB,aAINl3mB,KAAK02mB,aAAe12mB,KAAKw2mB,kBAAoBx2mB,KAAKo2mB,gCT5hDpC5R,ES6hDDxkmB,KAAK02mB,YT7hDIgD,ES6hDS15mB,KAAKw2mB,iBT5hDxCmD,EAAWnV,EAAO12kB,wBAClB8rlB,EAAcF,EAAU5rlB,wBACxB+rlB,EAAaH,EAAUnrlB,aAAe,EAEtCqrlB,EAAYzulB,OAAS0ulB,EAAaF,EAASxulB,OAC7C4je,GAASy1G,EAAQr7kB,KAAKgE,IAAIuslB,EAAU5qlB,UAAY4qlB,EAAU1/kB,aAAewqkB,EAAOj2kB,aAAesrlB,EAAYrV,EAAOlqkB,eACzGs/kB,EAAYtulB,IAAMuulB,EAAaF,EAASrulB,KACjDyje,GAASy1G,EAAQr7kB,KAAK+D,IAAIwslB,EAAU5qlB,UAAY+qlB,EAAY,ISshDxD75mB,KAAKo2mB,+BAAgC,EAEzC,GACC,CACD71mB,IAAK,uBACLyF,MAAO,WACLhG,KAAK+5mB,2BACL/5mB,KAAKg6mB,uBACLh5mB,SAASy1B,oBAAoB,SAAUz2B,KAAKs4mB,UAAU,EACxD,GAIC,CACD/3mB,IAAK,aACLyF,MAAO,WACLhG,KAAK0I,MAAMowmB,YACb,GACC,CACDv4mB,IAAK,cACLyF,MAAO,WACLhG,KAAKi3mB,cAAc,GAAI,CACrBrylB,OAAQ,eAEV5kB,KAAK0I,MAAMwumB,aACb,GACC,CACD32mB,IAAK,gBACLyF,MAAO,SAAuBg9K,EAAU+zb,GACtC/2mB,KAAK0I,MAAMuumB,cAAcj0b,EAAU+zb,EACrC,GAIC,CACDx2mB,IAAK,aACLyF,MAAO,WACAhG,KAAKy8lB,UACVz8lB,KAAKy8lB,SAAS92M,OAChB,GACC,CACDplZ,IAAK,YACLyF,MAAO,WACAhG,KAAKy8lB,UACVz8lB,KAAKy8lB,SAASsS,MAChB,GAEC,CACDxumB,IAAK,WACLyF,MAAO,SAAkBszmB,GACvB,IAAIjjmB,EAASrW,KAETi6mB,EAAej6mB,KAAKqqB,MACpByhlB,EAAcmO,EAAanO,YAC3B7hJ,EAAYgwJ,EAAahwJ,UACzBqiJ,EAAmBtsmB,KAAK83mB,wBACxBoC,EAA8B,UAAhBZ,EAA0B,EAAIhN,EAAiBhrmB,OAAS,EAE1E,IAAKtB,KAAK0I,MAAMm7lB,QAAS,CACvB,IAAIsW,EAAgB7N,EAAiBp4lB,QAAQ43lB,EAAY,IAErDqO,GAAiB,IACnBD,EAAcC,EAElB,CAGAn6mB,KAAKo2mB,gCAAkCnsJ,GAAajqd,KAAK02mB,aACzD12mB,KAAKmkC,SAAS,CACZyxkB,0BAA0B,EAC1BvJ,aAAc,KACdD,cAAeE,EAAiB4N,KAC/B,WACD,OAAO7jmB,EAAOyimB,YAChB,GACF,GACC,CACDv4mB,IAAK,aACLyF,MAAO,SAAoB0lB,GACzB,IAAI0ulB,EAAep6mB,KAAKqqB,MACpByhlB,EAAcsO,EAAatO,YAC3BO,EAAe+N,EAAa/N,aAEhC,GAAKrsmB,KAAK0I,MAAMm7lB,QAAhB,CACA7jmB,KAAKmkC,SAAS,CACZiokB,cAAe,OAEjB,IAAIiO,EAAevO,EAAY53lB,QAAQm4lB,GAElCA,IACHgO,GAAgB,GAGlB,IAAItymB,EAAY+jmB,EAAYxqmB,OAAS,EACjCg5mB,GAAa,EACjB,GAAKxO,EAAYxqmB,OAAjB,CAEA,OAAQoqB,GACN,IAAK,WAGD4ulB,EAFmB,IAAjBD,EAEU,GACe,IAAlBA,EAEGtymB,EAEAsymB,EAAe,EAG7B,MAEF,IAAK,OACCA,GAAgB,GAAKA,EAAetymB,IACtCuymB,EAAYD,EAAe,GAMjCr6mB,KAAKmkC,SAAS,CACZuxkB,eAA8B,IAAf4E,EACfjO,aAAcP,EAAYwO,IA1BG,CAZA,CAwCjC,GACC,CACD/5mB,IAAK,cACLyF,MAAO,WACL,IAAI0lB,EAAYhiB,UAAUpI,OAAS,QAAsBpB,IAAjBwJ,UAAU,GAAmBA,UAAU,GAAK,QAChFurgB,EAAWj1gB,KAAK0I,MAAMusgB,SACtBm3F,EAAgBpsmB,KAAKqqB,MAAM+hlB,cAC3BrsmB,EAAUC,KAAK+3mB,sBACnB,GAAKh4mB,EAAQuB,OAAb,CACA,IAAIg5mB,EAAY,EAEZD,EAAet6mB,EAAQmU,QAAQk4lB,GAE9BA,IACHiO,GAAgB,GAGA,OAAd3ulB,EACF4ulB,EAAYD,EAAe,EAAIA,EAAe,EAAIt6mB,EAAQuB,OAAS,EAC5C,SAAdoqB,EACT4ulB,GAAaD,EAAe,GAAKt6mB,EAAQuB,OAClB,WAAdoqB,GACT4ulB,EAAYD,EAAeplG,GACX,IAAGqlG,EAAY,GACR,aAAd5ulB,GACT4ulB,EAAYD,EAAeplG,GACXl1gB,EAAQuB,OAAS,IAAGg5mB,EAAYv6mB,EAAQuB,OAAS,GAC1C,SAAdoqB,IACT4ulB,EAAYv6mB,EAAQuB,OAAS,GAG/BtB,KAAKo2mB,+BAAgC,EACrCp2mB,KAAKmkC,SAAS,CACZiokB,cAAersmB,EAAQu6mB,GACvBjO,aAAc,MA1BW,CA4B7B,GACC,CACD9rmB,IAAK,WACLyF,MAGA,WAEE,OAAKhG,KAAK0I,MAAMM,MAOgB,oBAArBhJ,KAAK0I,MAAMM,MACbhJ,KAAK0I,MAAMM,MAAMkqmB,IAKnB,GAAe,GAAe,CAAC,EAAGA,IAAelzmB,KAAK0I,MAAMM,OAZ1DkqmB,EAaX,GACC,CACD3ymB,IAAK,iBACLyF,MAAO,WACL,IAAI49lB,EAAa5jmB,KAAK4jmB,WAClBr5lB,EAAKvK,KAAKuK,GACVsnC,EAAY7xC,KAAK6xC,UACjBuhB,EAAWpzD,KAAKozD,SAChB0wiB,EAAe9jmB,KAAK8jmB,aACpBrqgB,EAAWz5F,KAAKy5F,SAChB/wF,EAAQ1I,KAAK0I,MACbm7lB,EAAUn7lB,EAAMm7lB,QAChB1nO,EAAQzzX,EAAMyzX,MACdp8X,EAAU2I,EAAM3I,QAEpB,MAAO,CACL6jmB,WAAYA,EACZr5lB,GAAIA,EACJsnC,UAAWA,EACXuhB,SAAUA,EACVgyD,SANaplH,KAAKolH,WAOlBy+e,QAASA,EACT1nO,MAAOA,EACPp8X,QAASA,EACT+jmB,aAAcA,EACdC,YAAar7lB,EACb+wF,SAAUA,EACVzwF,MAAOhJ,KAAKoa,WAEhB,GACC,CACD7Z,IAAK,WACLyF,MAAO,WAEL,OADkBhG,KAAKqqB,MAAMyhlB,YACVxqmB,OAAS,CAC9B,GACC,CACDf,IAAK,aACLyF,MAAO,WACL,QAAShG,KAAK+3mB,sBAAsBz2mB,MACtC,GACC,CACDf,IAAK,cACLyF,MAAO,WACL,IAAIu0mB,EAAev6mB,KAAK0I,MACpBywmB,EAAcoB,EAAapB,YAC3BtV,EAAU0W,EAAa1W,QAG3B,YAAoB3jmB,IAAhBi5mB,EAAkCtV,EAC/BsV,CACT,GACC,CACD54mB,IAAK,mBACLyF,MAAO,SAA0B40C,EAAQkxjB,GACvC,OAAO2I,GAAkBz0mB,KAAK0I,MAAOkyC,EAAQkxjB,EAC/C,GACC,CACDvrmB,IAAK,mBACLyF,MAAO,SAA0B40C,EAAQkxjB,GACvC,OAAO4I,GAAkB10mB,KAAK0I,MAAOkyC,EAAQkxjB,EAC/C,GACC,CACDvrmB,IAAK,eACLyF,MAAO,SAAsB40C,EAAQq3V,GACnC,OAAOsjO,GAAcv1mB,KAAK0I,MAAOkyC,EAAQq3V,EAC3C,GACC,CACD1xY,IAAK,oBACLyF,MAAO,SAA2BivB,EAAMlyB,GACtC,GAA4C,oBAAjC/C,KAAK0I,MAAM8xmB,kBAAkC,CACtD,IAAIvoO,EAAajyY,KAAK0I,MAAMupY,WACxB65N,EAAc9rmB,KAAKqqB,MAAMyhlB,YAC7B,OAAO9rmB,KAAK0I,MAAM8xmB,kBAAkBvllB,EAAM,CACxClyB,QAASA,EACTkvY,WAAYA,EACZ65N,YAAaA,GAEjB,CACE,OAAO9rmB,KAAKwsmB,eAAev3kB,EAE/B,GACC,CACD10B,IAAK,mBACLyF,MAAO,SAA0BivB,GAC/B,OAAOj1B,KAAK0I,MAAMwrmB,iBAAiBj/kB,EACrC,GAIC,CACD10B,IAAK,4BACLyF,MAGA,WACMhF,UAAYA,SAASw1B,mBACvBx1B,SAASw1B,iBAAiB,mBAAoBx2B,KAAKu4mB,oBAAoB,GACvEv3mB,SAASw1B,iBAAiB,iBAAkBx2B,KAAKw4mB,kBAAkB,GAEvE,GACC,CACDj4mB,IAAK,2BACLyF,MAAO,WACDhF,UAAYA,SAASy1B,sBACvBz1B,SAASy1B,oBAAoB,mBAAoBz2B,KAAKu4mB,oBACtDv3mB,SAASy1B,oBAAoB,iBAAkBz2B,KAAKw4mB,kBAExD,GACC,CACDj4mB,IAAK,wBACLyF,MAGA,WACMhF,UAAYA,SAASw1B,mBACvBx1B,SAASw1B,iBAAiB,aAAcx2B,KAAK+2Z,cAAc,GAC3D/1Z,SAASw1B,iBAAiB,YAAax2B,KAAKi3Z,aAAa,GACzDj2Z,SAASw1B,iBAAiB,WAAYx2B,KAAKm3Z,YAAY,GAE3D,GACC,CACD52Z,IAAK,uBACLyF,MAAO,WACDhF,UAAYA,SAASy1B,sBACvBz1B,SAASy1B,oBAAoB,aAAcz2B,KAAK+2Z,cAChD/1Z,SAASy1B,oBAAoB,YAAaz2B,KAAKi3Z,aAC/Cj2Z,SAASy1B,oBAAoB,WAAYz2B,KAAKm3Z,YAElD,GACC,CACD52Z,IAAK,cACLyF,MAGA,WACE,IAAIy0mB,EAAez6mB,KAAK0I,MACpB0jC,EAAaqukB,EAAarukB,WAC1Bq/jB,EAAegP,EAAahP,aAC5BiP,EAAUD,EAAaC,QACvBzoO,EAAawoO,EAAaxoO,WAC1BlM,EAAW00O,EAAa10O,SACxB40O,EAAOF,EAAaE,KAGpBjlY,EADsB11O,KAAK43mB,gBACCliY,MAE5BggY,EAAgB11mB,KAAKqqB,MAAMqrlB,cAC3BK,EAAc/1mB,KAAK+1mB,YACnB1xmB,EAAKq2mB,GAAW16mB,KAAK23mB,aAAa,SAElCiD,EAAiB,CACnB,oBAAqB,OACrB,aAAc56mB,KAAK0I,MAAM,cACzB,kBAAmB1I,KAAK0I,MAAM,oBAGhC,OAAK+imB,EAgBe,gBAAoB/1X,EAAO/0N,GAAS,CAAC,EAAGo1lB,EAAa,CACvE8E,eAAgB,OAChB9b,aAAc,MACd+b,YAAa,MACbz2mB,GAAIA,EACJo/B,SAAUzjC,KAAK42mB,YACfxqkB,WAAYA,EACZ08jB,SAAU4M,EACVjokB,OAAQztC,KAAKg5mB,YACbjhiB,SAAU/3E,KAAK44mB,kBACfprkB,QAASxtC,KAAK+4mB,aACdgC,WAAY,QACZh1O,SAAUA,EACV40O,KAAMA,EACNxxmB,KAAM,OACNnD,MAAOisY,GACN2oO,IA9BmB,gBAAoB3M,GAAYttlB,GAAS,CAC3Dtc,GAAIA,EACJo/B,SAAUzjC,KAAK42mB,YACfnpkB,OAAQztC,KAAKg5mB,YACbjhiB,SAAU,GACVvqC,QAASxtC,KAAK+4mB,aACd3mN,UAAU,EACVjqB,SAAU/7V,EACV25V,SAAUA,EACV40O,KAAMA,EACN30mB,MAAO,IACN40mB,GAoBP,GACC,CACDr6mB,IAAK,2BACLyF,MAAO,WACL,IAAI47lB,EAAS5hmB,KAETg7mB,EAAuBh7mB,KAAK43mB,gBAC5BxO,EAAa4R,EAAqB5R,WAClCF,EAAsB8R,EAAqB9R,oBAC3CC,EAAkB6R,EAAqB7R,gBACvCuB,EAAmBsQ,EAAqBtQ,iBACxCI,EAAckQ,EAAqBlQ,YACnCF,EAAcoQ,EAAqBpQ,YAEnCmL,EAAc/1mB,KAAK+1mB,YACnBkF,EAAej7mB,KAAK0I,MACpBirmB,EAA2BsH,EAAatH,yBACxCvnkB,EAAa6ukB,EAAa7ukB,WAC1By3jB,EAAUoX,EAAapX,QACvB5xN,EAAagpO,EAAahpO,WAC1B6U,EAAcm0N,EAAan0N,YAC3Bo0N,EAAel7mB,KAAKqqB,MACpByhlB,EAAcoP,EAAapP,YAC3BO,EAAe6O,EAAa7O,aAC5BpiJ,EAAYixJ,EAAajxJ,UAE7B,IAAKjqd,KAAKolH,aAAeuuf,EACvB,OAAO1hO,EAAa,KAAoB,gBAAoB24N,EAAajqlB,GAAS,CAAC,EAAGo1lB,EAAa,CACjGx1mB,IAAK,cACL6rC,WAAYA,EACZ69a,UAAWA,IACTnjE,GAGN,GAAI+8M,EAAS,CACX,IAAIsX,EAAerP,EAAY7+lB,KAAI,SAAUq+C,EAAK96C,GAChD,IAAI4qmB,EAAkB9vjB,IAAQ+gjB,EAC9B,OAAoB,gBAAoBjD,EAAYzolB,GAAS,CAAC,EAAGo1lB,EAAa,CAC5EvggB,WAAY,CACV1rE,UAAWo/jB,EACXI,MAAOH,EACPI,OAAQmB,GAEVzgJ,UAAWmxJ,EACXhvkB,WAAYA,EACZ7rC,IAAK,GAAG4L,OAAOy1lB,EAAOuS,eAAe7ojB,IAAMn/C,OAAOqE,GAClDA,MAAOA,EACP64lB,YAAa,CACXr8jB,QAAS,WACP,OAAO40jB,EAAOwV,YAAY9rjB,EAC5B,EACA6rW,WAAY,WACV,OAAOyqM,EAAOwV,YAAY9rjB,EAC5B,EACAve,YAAa,SAAqB5qC,GAChCA,EAAE+qC,iBACF/qC,EAAEsyK,iBACJ,GAEFx/I,KAAMq2B,IACJs2iB,EAAO4Y,kBAAkBlvjB,EAAK,SACpC,IACA,OAAO6vjB,CACT,CAEA,GAAIlpO,EACF,OAAO,KAGT,IAAIj4I,EAAc8xW,EAAY,GAC9B,OAAoB,gBAAoBhB,EAAanqlB,GAAS,CAAC,EAAGo1lB,EAAa,CAC7E9glB,KAAM+kO,EACN5tN,WAAYA,IACVpsC,KAAKw6mB,kBAAkBxgX,EAAa,SAC1C,GACC,CACDz5P,IAAK,uBACLyF,MAAO,WACL,IACI0jmB,EADuB1pmB,KAAK43mB,gBACUlO,eAEtCqM,EAAc/1mB,KAAK+1mB,YACnBsF,EAAgBr7mB,KAAK0I,MACrB0jC,EAAaivkB,EAAcjvkB,WAC3Bi4e,EAAYg3F,EAAch3F,UAC1Bp6D,EAAYjqd,KAAKqqB,MAAM4/b,UAE3B,IAAKjqd,KAAKm5mB,gBAAkBzP,GAAkBt9jB,IAAepsC,KAAKolH,YAAci/Z,EAC9E,OAAO,KAGT,IAAI8iF,EAAa,CACfp6jB,YAAa/sC,KAAKq4mB,0BAClBlhN,WAAYn3Z,KAAK04mB,yBACjB,cAAe,QAEjB,OAAoB,gBAAoBhP,EAAgB/olB,GAAS,CAAC,EAAGo1lB,EAAa,CAChF5O,WAAYA,EACZl9I,UAAWA,IAEf,GACC,CACD1pd,IAAK,yBACLyF,MAAO,WACL,IACI2imB,EADuB3omB,KAAK43mB,gBACYjP,iBAExCoN,EAAc/1mB,KAAK+1mB,YACnBuF,EAAgBt7mB,KAAK0I,MACrB0jC,EAAakvkB,EAAclvkB,WAC3Bi4e,EAAYi3F,EAAcj3F,UAC1Bp6D,EAAYjqd,KAAKqqB,MAAM4/b,UAC3B,IAAK0+I,IAAqBtkF,EAAW,OAAO,KAI5C,OAAoB,gBAAoBskF,EAAkBholB,GAAS,CAAC,EAAGo1lB,EAAa,CAClF5O,WAJe,CACf,cAAe,QAIf/6jB,WAAYA,EACZ69a,UAAWA,IAEf,GACC,CACD1pd,IAAK,2BACLyF,MAAO,WACL,IAAIu1mB,EAAuBv7mB,KAAK43mB,gBAC5B9N,EAAoByR,EAAqBzR,kBACzCQ,EAAqBiR,EAAqBjR,mBAG9C,IAAKR,IAAsBQ,EAAoB,OAAO,KACtD,IAAIyL,EAAc/1mB,KAAK+1mB,YACnB3pkB,EAAapsC,KAAK0I,MAAM0jC,WACxB69a,EAAYjqd,KAAKqqB,MAAM4/b,UAC3B,OAAoB,gBAAoBqgJ,EAAoB3plB,GAAS,CAAC,EAAGo1lB,EAAa,CACpF3pkB,WAAYA,EACZ69a,UAAWA,IAEf,GACC,CACD1pd,IAAK,0BACLyF,MAAO,WACL,IACI8jmB,EADuB9pmB,KAAK43mB,gBACa9N,kBAE7C,IAAKA,EAAmB,OAAO,KAC/B,IAAIiM,EAAc/1mB,KAAK+1mB,YACnB3pkB,EAAapsC,KAAK0I,MAAM0jC,WACxB69a,EAAYjqd,KAAKqqB,MAAM4/b,UACvBk9I,EAAa,CACfp6jB,YAAa/sC,KAAKo4mB,6BAClBjhN,WAAYn3Z,KAAK24mB,4BACjB,cAAe,QAEjB,OAAoB,gBAAoB7O,EAAmBnplB,GAAS,CAAC,EAAGo1lB,EAAa,CACnF5O,WAAYA,EACZ/6jB,WAAYA,EACZ69a,UAAWA,IAEf,GACC,CACD1pd,IAAK,aACLyF,MAAO,WACL,IAAIw1mB,EAASx7mB,KAETy7mB,EAAuBz7mB,KAAK43mB,gBAC5B7N,EAAQ0R,EAAqB1R,MAC7BG,EAAeuR,EAAqBvR,aACpCM,EAAOiR,EAAqBjR,KAC5BC,EAAWgR,EAAqBhR,SAChCnD,EAAamU,EAAqBnU,WAClCF,EAAiBqU,EAAqBrU,eACtCF,EAAmBuU,EAAqBvU,iBACxCyD,EAAS8Q,EAAqB9Q,OAE9BoL,EAAc/1mB,KAAK+1mB,YACnB3J,EAAgBpsmB,KAAKqqB,MAAM+hlB,cAC3BsP,EAAgB17mB,KAAK0I,MACrB8qmB,EAAoBkI,EAAclI,kBAClCvhO,EAAaypO,EAAczpO,WAC3BoyI,EAAYq3F,EAAcr3F,UAC1B4tF,EAAiByJ,EAAczJ,eAC/B3L,EAAgBoV,EAAcpV,cAC9BF,EAAgBsV,EAActV,cAC9BwD,EAAa8R,EAAc9R,WAC3BrD,EAAgBmV,EAAcnV,cAC9BC,EAAekV,EAAclV,aAC7BmV,EAAmBD,EAAcC,iBACjCvH,EAAwBsH,EAActH,sBACtC3N,EAA2BiV,EAAcjV,yBACzCoM,EAAmB6I,EAAc7I,iBACjC+I,EAAoBF,EAAcE,kBAClCC,EAAuBH,EAAcG,qBACzC,IAAKjS,EAAY,OAAO,KAExB,IAoCIkS,EApCArzmB,EAAS,SAAgBC,EAAOrE,GAClC,IAAI8E,EAAOT,EAAMS,KACb8rB,EAAOvsB,EAAMusB,KACbmX,EAAa1jC,EAAM0jC,WACnBw2X,EAAal6Z,EAAMk6Z,WACnB3zX,EAAQvmC,EAAMumC,MACdjpC,EAAQ0C,EAAM1C,MACdikd,EAAYmiJ,IAAkBn3kB,EAC9B8mlB,EAAU3vkB,OAAalsC,EAAY,WACrC,OAAOs7mB,EAAOvC,cAAchklB,EAC9B,EACImtjB,EAAWh2iB,OAAalsC,EAAY,WACtC,OAAOs7mB,EAAO1X,aAAa7ukB,EAC7B,EACI+mlB,EAAW,GAAG7vmB,OAAOqvmB,EAAO7D,aAAa,UAAW,KAAKxrmB,OAAO9H,GAChE8imB,EAAa,CACf9imB,GAAI23mB,EACJhvkB,QAASo1iB,EACT/0iB,YAAa0ukB,EACb3zkB,YAAa2zkB,EACbh2O,UAAW,GAEb,OAAoB,gBAAoB4kO,EAAQhqlB,GAAS,CAAC,EAAGo1lB,EAAa,CACxE5O,WAAYA,EACZlykB,KAAMA,EACNmX,WAAYA,EACZw2X,WAAYA,EACZria,IAAKy7mB,EACL/skB,MAAOA,EACP9lC,KAAMA,EACNnD,MAAOA,EACPikd,UAAWA,EACXxmb,SAAUwmb,EAAYuxJ,EAAO/E,yBAAsBv2mB,IACjDs7mB,EAAOhB,kBAAkB9xmB,EAAMusB,KAAM,QAC3C,EAIA,GAAIj1B,KAAKi8mB,aACPH,EAAS97mB,KAAK63mB,wBAAwB5qmB,KAAI,SAAUwgB,GAClD,GAAkB,UAAdA,EAAKtkB,KAAkB,CACzB,IAAI8rB,EAAOxH,EAAKwH,KACZl1B,EAAU0tB,EAAK1tB,QACf04K,EAAahrJ,EAAKjd,MAClB63V,EAAU,GAAGl8V,OAAOqvmB,EAAO7D,aAAa,SAAU,KAAKxrmB,OAAOssK,GAC9Dyjc,EAAY,GAAG/vmB,OAAOk8V,EAAS,YACnC,OAAoB,gBAAoB0hQ,EAAOpplB,GAAS,CAAC,EAAGo1lB,EAAa,CACvEx1mB,IAAK8nW,EACLpzU,KAAMA,EACNl1B,QAASA,EACTiqmB,QAASE,EACTD,aAAc,CACZ5lmB,GAAI63mB,EACJjnlB,KAAMxH,EAAKwH,MAEbga,MAAOuskB,EAAOtH,iBAAiBzmlB,EAAKwH,QAClCxH,EAAK1tB,QAAQkN,KAAI,SAAU2tC,GAC7B,OAAOnyC,EAAOmyC,EAAQ,GAAGzuC,OAAOssK,EAAY,KAAKtsK,OAAOyuC,EAAOpqC,OACjE,IACF,CAAO,GAAkB,WAAdid,EAAKtkB,KACd,OAAOV,EAAOglB,EAAM,GAAGthB,OAAOshB,EAAKjd,OAEvC,SACK,GAAI6zgB,EAAW,CACpB,IAAInre,EAAU+4jB,EAAe,CAC3BhgO,WAAYA,IAEd,GAAgB,OAAZ/4V,EAAkB,OAAO,KAC7B4ikB,EAAsB,gBAAoB1U,EAAgB2O,EAAa78jB,EACzE,KAAO,CACL,IAAIijkB,EAAWtJ,EAAiB,CAC9B5gO,WAAYA,IAGd,GAAiB,OAAbkqO,EAAmB,OAAO,KAC9BL,EAAsB,gBAAoB5U,EAAkB6O,EAAaoG,EAC3E,CAEA,IAAIC,EAAqB,CACvB9V,cAAeA,EACfF,cAAeA,EACfG,cAAeA,EACfC,aAAcA,EACdC,yBAA0BA,GAExB4V,EAA2B,gBAAoBlW,GAAYxllB,GAAS,CAAC,EAAGo1lB,EAAaqG,IAAqB,SAAU9rmB,GACtH,IAAI3H,EAAM2H,EAAM3H,IACZ2zmB,EAAoBhsmB,EAAMq2lB,YAC1Bj0kB,EAAY4plB,EAAkB5plB,UAC9BqxF,EAAYu4f,EAAkBv4f,UAClC,OAAoB,gBAAoBymf,EAAM7plB,GAAS,CAAC,EAAGo1lB,EAAaqG,EAAoB,CAC1F34kB,SAAU96B,EACVw+lB,WAAY,CACVp6jB,YAAayukB,EAAOxD,gBACpB3qkB,YAAamukB,EAAOvD,iBAEtB5zF,UAAWA,EACX3xf,UAAWA,IACI,gBAAoBs8kB,GAAe,CAClDG,eAAgBqE,EAChBjE,YAAaqM,EACbvM,eAAgBwM,EAChB5M,YAAamF,IACZ,SAAUmI,GACX,OAAoB,gBAAoB9R,EAAU9plB,GAAS,CAAC,EAAGo1lB,EAAa,CAC1EtykB,SAAU,SAAkB5hB,GAC1B25lB,EAAO7E,eAAe90lB,GAEtB06lB,EAAgB16lB,EAClB,EACAwigB,UAAWA,EACXtga,UAAWA,EACXqof,cAAeA,IACb0P,EACN,IACF,IAIA,OAAOH,GAAqC,UAAjBnV,EAAwC,gBAAoBc,EAAY3mlB,GAAS,CAAC,EAAGo1lB,EAAa,CAC3HtO,SAAUkU,EACVjU,eAAgB1nmB,KAAKs2mB,WACrB/P,cAAeA,EACfC,aAAcA,IACZ6V,GAAeA,CACrB,GACC,CACD97mB,IAAK,kBACLyF,MAAO,WACL,IAAIw2mB,EAASx8mB,KAETy8mB,EAAgBz8mB,KAAK0I,MACrBlG,EAAYi6mB,EAAcj6mB,UAC1B4pC,EAAaqwkB,EAAcrwkB,WAC3By3jB,EAAU4Y,EAAc5Y,QACxBl/lB,EAAO83mB,EAAc93mB,KACrBmnmB,EAAc9rmB,KAAKqqB,MAAMyhlB,YAC7B,GAAKnnmB,IAAQynC,EAAb,CAEA,GAAIy3jB,EAAS,CACX,GAAIrhmB,EAAW,CACb,IAAIwD,EAAQ8lmB,EAAY7+lB,KAAI,SAAUq+C,GACpC,OAAOkxjB,EAAOrI,eAAe7ojB,EAC/B,IAAGp/C,KAAK1J,GACR,OAAoB,gBAAoB,QAAS,CAC/CmC,KAAMA,EACNwE,KAAM,SACNnD,MAAOA,GAEX,CACE,IAAIurF,EAAQu6gB,EAAYxqmB,OAAS,EAAIwqmB,EAAY7+lB,KAAI,SAAUq+C,EAAK3pD,GAClE,OAAoB,gBAAoB,QAAS,CAC/CpB,IAAK,KAAK4L,OAAOxK,GACjBgD,KAAMA,EACNwE,KAAM,SACNnD,MAAOw2mB,EAAOrI,eAAe7ojB,IAEjC,IAAkB,gBAAoB,QAAS,CAC7C3mD,KAAMA,EACNwE,KAAM,WAER,OAAoB,gBAAoB,MAAO,KAAMooF,EAEzD,CACE,IAAI1wC,EAASirjB,EAAY,GAAK9rmB,KAAKm0mB,eAAerI,EAAY,IAAM,GAEpE,OAAoB,gBAAoB,QAAS,CAC/CnnmB,KAAMA,EACNwE,KAAM,SACNnD,MAAO66C,GAhCoB,CAmCjC,GACC,CACDtgD,IAAK,mBACLyF,MAAO,WACL,IAAI+vmB,EAAc/1mB,KAAK+1mB,YACnB2G,EAAe18mB,KAAKqqB,MACpB8hlB,EAAgBuQ,EAAavQ,cAC7BC,EAAgBsQ,EAAatQ,cAC7BC,EAAeqQ,EAAarQ,aAC5BpiJ,EAAYyyJ,EAAazyJ,UACzB6hJ,EAAc4Q,EAAa5Q,YAC3BQ,EAAmBtsmB,KAAK+3mB,sBAC5B,OAAoB,gBAAoB7L,GAAYvrlB,GAAS,CAAC,EAAGo1lB,EAAa,CAC5E5J,cAAeA,EACfC,cAAeA,EACfC,aAAcA,EACdpiJ,UAAWA,EACX6hJ,YAAaA,EACbQ,iBAAkBA,IAEtB,GACC,CACD/rmB,IAAK,SACLyF,MAAO,WACL,IAAI22mB,EAAuB38mB,KAAK43mB,gBAC5BjO,EAAUgT,EAAqBhT,QAC/BS,EAAsBuS,EAAqBvS,oBAC3CS,EAAkB8R,EAAqB9R,gBACvCE,EAAiB4R,EAAqB5R,eAEtC6R,EAAgB58mB,KAAK0I,MACrBvD,EAAYy3mB,EAAcz3mB,UAC1Bd,EAAKu4mB,EAAcv4mB,GACnB+nC,EAAawwkB,EAAcxwkB,WAC3Bw9jB,EAAagT,EAAchT,WAC3B3/I,EAAYjqd,KAAKqqB,MAAM4/b,UACvB8rJ,EAAc/1mB,KAAK+1mB,YAAc/1mB,KAAK68mB,iBAC1C,OAAoB,gBAAoBhS,EAAiBlqlB,GAAS,CAAC,EAAGo1lB,EAAa,CACjF5wmB,UAAWA,EACXgimB,WAAY,CACV9imB,GAAIA,EACJioC,UAAWtsC,KAAKssC,WAElBF,WAAYA,EACZ69a,UAAWA,IACTjqd,KAAK88mB,mBAAiC,gBAAoBnT,EAAShplB,GAAS,CAAC,EAAGo1lB,EAAa,CAC/FtykB,SAAUzjC,KAAKu2mB,cACfpP,WAAY,CACVp6jB,YAAa/sC,KAAKk4mB,mBAClB/gN,WAAYn3Z,KAAKy4mB,mBAEnBrskB,WAAYA,EACZ69a,UAAWA,EACX2/I,WAAYA,IACG,gBAAoBmB,EAAgBpqlB,GAAS,CAAC,EAAGo1lB,EAAa,CAC7E3pkB,WAAYA,IACVpsC,KAAK+8mB,2BAA4B/8mB,KAAKg9mB,eAA6B,gBAAoB5S,EAAqBzplB,GAAS,CAAC,EAAGo1lB,EAAa,CACxI3pkB,WAAYA,IACVpsC,KAAKi9mB,uBAAwBj9mB,KAAKk9mB,yBAA0Bl9mB,KAAKm9mB,2BAA4Bn9mB,KAAKo9mB,4BAA6Bp9mB,KAAKq9mB,aAAcr9mB,KAAKs9mB,kBAC7J,IACE,CAAC,CACH/8mB,IAAK,2BACLyF,MAAO,SAAkC0C,EAAO2hB,GAC9C,IAAI46hB,EAAY56hB,EAAM46hB,UAClB0wD,EAA0BtrlB,EAAMsrlB,wBAChCC,EAA2BvrlB,EAAMurlB,yBACjC71mB,EAAU2I,EAAM3I,QAChBiG,EAAQ0C,EAAM1C,MACd4jmB,EAAalhmB,EAAMkhmB,WACnB33N,EAAavpY,EAAMupY,WACnBsrO,EAAsB,CAAC,EAE3B,GAAIt4D,IAAcj/iB,IAAUi/iB,EAAUj/iB,OAASjG,IAAYkljB,EAAUlljB,SAAW6pmB,IAAe3kD,EAAU2kD,YAAc33N,IAAegzK,EAAUhzK,YAAa,CAC3J,IAAI65N,EAAcpI,GAAW19lB,GACzBsmmB,EAAmB1C,EAhkD/B,SAA+BlhmB,EAAOojmB,GACpC,OAAOqJ,GAA4CN,GAAwBnsmB,EAAOojmB,GACpF,CA8jD4CgM,CAAsBpvmB,EAAOojmB,GAAe,GAC5EO,EAAesJ,EA/iD3B,SAA6BtrlB,EAAOmzlB,GAClC,IAAInR,EAAehilB,EAAMgilB,aAErBoR,EADkBpzlB,EAAMyhlB,YACW53lB,QAAQm4lB,GAE/C,GAAIoR,GAAoB,EAAG,CAGzB,GAFuBD,EAAgBtpmB,QAAQm4lB,IAEvB,EAEtB,OAAOA,EACF,GAAIoR,EAAmBD,EAAgBl8mB,OAG5C,OAAOk8mB,EAAgBC,EAE3B,CAEA,OAAO,IACT,CA4hDqDC,CAAoBrzlB,EAAOyhlB,GAAe,KACnFM,EA3hDZ,SAA8B/hlB,EAAOtqB,GACnC,IAAI49mB,EAAoBtzlB,EAAM+hlB,cAC9B,OAAOuR,GAAqB59mB,EAAQmU,QAAQypmB,IAAsB,EAAIA,EAAoB59mB,EAAQ,EACpG,CAwhD4B69mB,CAAqBvzlB,EAAOiilB,GAChDiR,EAAsB,CACpBzR,YAAaA,EACbM,cAAeA,EACfC,aAAcA,EACdsJ,yBAAyB,EAE7B,CAGA,IAAIkI,EAAoD,MAA5BjI,GAAoCltmB,IAAUu8iB,EAAY,CACpFywD,cAAeE,EACfA,8BAA0B11mB,GACxB,CAAC,EACL,OAAO,GAAe,GAAe,GAAe,CAAC,EAAGq9mB,GAAsBM,GAAwB,CAAC,EAAG,CACxG54D,UAAWv8iB,GAEf,KAGKsuL,CACT,CArgD0B,CAqgDxB,EAAAxlH,WAEFwlH,GAAOtlH,aAAe,GCxnFtB,IAMuCosiB,GACjCtyhB,GAAQuyhB,GAPV,GAAe,CACjBC,kBAAmB,GACnBC,mBAAmB,EACnB7lkB,aAAc,MC8CZ5nC,aD3CmCstmB,GC2Cf9mb,GDxCf+mb,GAAQvyhB,GAAsB,SAAU01gB,GAC7C,GAAUgd,EAAchd,GAExB,IAAIprlB,EAAS,GAAaoomB,GAE1B,SAASA,IACP,IAAIjomB,EAEJ,GAAgBjW,KAAMk+mB,GAEtB,IAAK,IAAIz0mB,EAAOC,UAAUpI,OAAQqG,EAAO,IAAI1D,MAAMwF,GAAOtC,EAAO,EAAGA,EAAOsC,EAAMtC,IAC/EQ,EAAKR,GAAQuC,UAAUvC,GA6CzB,OA1CA8O,EAAQH,EAAO5R,KAAK0F,MAAMkM,EAAQ,CAAC9V,MAAMmM,OAAOxE,KAC1C0kW,YAAS,EACfp2V,EAAMoU,MAAQ,CACZ4nX,gBAAuC/xY,IAA3B+V,EAAMvN,MAAMupY,WAA2Bh8X,EAAMvN,MAAMupY,WAAah8X,EAAMvN,MAAMs1mB,kBACxFpU,gBAAuC1pmB,IAA3B+V,EAAMvN,MAAMkhmB,WAA2B3zlB,EAAMvN,MAAMkhmB,WAAa3zlB,EAAMvN,MAAMu1mB,kBACxFj4mB,WAA6B9F,IAAtB+V,EAAMvN,MAAM1C,MAAsBiQ,EAAMvN,MAAM1C,MAAQiQ,EAAMvN,MAAM0vC,cAG3EniC,EAAM8hE,SAAW,SAAU/xE,EAAO+wmB,GAChC9gmB,EAAMylF,SAAS,WAAY11F,EAAO+wmB,GAElC9gmB,EAAMkuB,SAAS,CACbn+B,MAAOA,GAEX,EAEAiQ,EAAMghmB,cAAgB,SAAUjxmB,EAAO+wmB,GAGrC,IAAI/zb,EAAW/sK,EAAMylF,SAAS,gBAAiB11F,EAAO+wmB,GAEtD9gmB,EAAMkuB,SAAS,CACb8tW,gBAAyB/xY,IAAb8iL,EAAyBA,EAAWh9K,GAEpD,EAEAiQ,EAAM6imB,WAAa,WACjB7imB,EAAMylF,SAAS,cAEfzlF,EAAMkuB,SAAS,CACbylkB,YAAY,GAEhB,EAEA3zlB,EAAMihmB,YAAc,WAClBjhmB,EAAMylF,SAAS,eAEfzlF,EAAMkuB,SAAS,CACbylkB,YAAY,GAEhB,EAEO3zlB,CACT,CA0DA,OAxDA,GAAaiomB,EAAc,CAAC,CAC1B39mB,IAAK,QACLyF,MAAO,WACLhG,KAAKqsW,OAAOs5C,OACd,GACC,CACDplZ,IAAK,OACLyF,MAAO,WACLhG,KAAKqsW,OAAO0iQ,MACd,GAEC,CACDxumB,IAAK,UACLyF,MAAO,SAAiBzF,GACtB,YAA2BL,IAApBF,KAAK0I,MAAMnI,GAAqBP,KAAK0I,MAAMnI,GAAOP,KAAKqqB,MAAM9pB,EACtE,GAEC,CACDA,IAAK,WACLyF,MAAO,SAAkBrB,GACvB,GAAgC,oBAArB3E,KAAK0I,MAAM/D,GAAsB,CAG1C,IAFA,IAAIijlB,EAEKp9kB,EAAQd,UAAUpI,OAAQqG,EAAO,IAAI1D,MAAMuG,EAAQ,EAAIA,EAAQ,EAAI,GAAIC,EAAQ,EAAGA,EAAQD,EAAOC,IACxG9C,EAAK8C,EAAQ,GAAKf,UAAUe,GAG9B,OAAQm9kB,EAAc5nlB,KAAK0I,OAAO/D,GAAMiF,MAAMg+kB,EAAajglB,EAC7D,CACF,GACC,CACDpH,IAAK,SACLyF,MAAO,WACL,IAAIqQ,EAASrW,KAETyolB,EAAezolB,KAAK0I,MACpB+/kB,EAAau1B,kBACbv1B,EAAaw1B,kBACbx1B,EAAarwiB,aACb,IAAI1vC,EAAQ,GAAyB+/kB,EAAc,CAAC,oBAAqB,oBAAqB,iBAElG,OAAoB,gBAAoBq1B,GAAiBn9lB,GAAS,CAAC,EAAGjY,EAAO,CAC3EC,IAAK,SAAa6D,GAChB6J,EAAOg2V,OAAS7/V,CAClB,EACAylY,WAAYjyY,KAAKm+mB,QAAQ,cACzBvU,WAAY5pmB,KAAKm+mB,QAAQ,cACzBpmiB,SAAU/3E,KAAK+3E,SACfk/hB,cAAej3mB,KAAKi3mB,cACpBC,YAAal3mB,KAAKk3mB,YAClB4B,WAAY94mB,KAAK84mB,WACjB9ymB,MAAOhG,KAAKm+mB,QAAQ,WAExB,KAGKD,CACT,CApHqC,CAoHnC,EAAA1siB,WAAYga,GAAO9Z,aAAe,GAAcqsiB,IC1EpD,kBCzCItwQ,GAAgB,SAAS7jS,EAAG/rC,GAI5B,OAHA4vU,GAAgBvlW,OAAOsa,gBAClB,CAAEE,UAAW,cAAgBze,OAAS,SAAU2lE,EAAG/rC,GAAK+rC,EAAElnD,UAAYmb,CAAG,GAC1E,SAAU+rC,EAAG/rC,GAAK,IAAK,IAAI5a,KAAK4a,EAAOA,EAAE11B,eAAe8a,KAAI2mD,EAAE3mD,GAAK4a,EAAE5a,GAAI,EACtEwqV,GAAc7jS,EAAG/rC,EAC5B,EAQA,IAAI4pG,GAAW,WAQX,OAPAA,GAAWv/H,OAAOsF,QAAU,SAAkBgoD,GAC1C,IAAK,IAAIjmB,EAAG5tC,EAAI,EAAGmX,EAAIpP,UAAUpI,OAAQK,EAAImX,EAAGnX,IAE5C,IAAK,IAAIshB,KADTssB,EAAI7lC,UAAU/H,GACOuG,OAAOvH,UAAUwH,eAAejE,KAAKqrC,EAAGtsB,KAAIuyC,EAAEvyC,GAAKssB,EAAEtsB,IAE9E,OAAOuyC,CACX,EACOiyE,GAAS79H,MAAM5J,KAAM0J,UAChC,EAkBA,SAAS00mB,GAAKl4iB,GACV,IAAI/gE,EAAY+gE,EAAG/gE,UAAWk5mB,EAAmBn4iB,EAAGm4iB,iBAAkBC,EAAYp4iB,EAAGo4iB,UAAWC,EAAar4iB,EAAGq4iB,WAAYrzgB,EAAchlC,EAAGglC,YAAax+F,EAAQw5D,EAAGx5D,MACrK,OAAQ,IAAAzL,eAAc,OAAQ,CAAEkE,UAAWA,EAAWuH,MAAOxE,OAAOsF,OAAO,CAAC,EAAGd,EAAO8xmB,GAAa,CAAED,WAAYA,EAAYD,UAAWA,EAAWD,iBAAkBA,KAAsBz0iB,EAAG60iB,GAAmB,CACzMF,WAAYA,EACZF,iBAAkBA,IAClBnzgB,YAAaA,EAAaP,YAAa,GACnD,CACA,SAAS8zgB,GAAmBv4iB,GACxB,IAAIq4iB,EAAar4iB,EAAGq4iB,WAEhBG,EAF+Cx4iB,EAAGm4iB,iBAEpB,EAAI,EACtC,MAAO,+BAFME,EAEgF,aAFhFA,EAEwG,IAFxGA,EAEuH,IAAMG,EAAW,UAAY,EAFpJH,EAEiK,aAFjKA,EAEyL,IAFzLA,EAEwM,IAAMG,EAAW,WAAa,EAFtOH,EAEmP,QACpQ,CACA,SAASC,GAAat4iB,GAClB,IAAIm4iB,EAAmBn4iB,EAAGm4iB,iBAAkBC,EAAYp4iB,EAAGo4iB,UAAWC,EAAar4iB,EAAGq4iB,WAClFI,EAAqB,EAAVx1lB,KAAK2pE,GAASyrhB,EACzBK,GAAa,EAAIN,GAAaK,EAClC,MAAO,CACH7zgB,gBAAiB6zgB,EAAW,MAAQA,EAAW,KAC/C5zgB,kBAAmBszgB,GAAoBO,EAAYA,GAAa,KAExE,CAEA,IAAIC,GAAuB,SAAU/omB,GAEjC,SAAS+omB,IACL,OAAkB,OAAX/omB,GAAmBA,EAAOlM,MAAM5J,KAAM0J,YAAc1J,IAC/D,CAkDA,OA9GJ,SAAmB4pE,EAAG/rC,GAElB,SAAS6wU,IAAO1uW,KAAKkV,YAAc00D,CAAG,CADtC6jS,GAAc7jS,EAAG/rC,GAEjB+rC,EAAEjpE,UAAkB,OAANk9B,EAAa31B,OAAOyb,OAAOka,IAAM6wU,EAAG/tW,UAAYk9B,EAAEl9B,UAAW,IAAI+tW,EACnF,CAqDID,CAAUowQ,EAAqB/omB,GAI/B+omB,EAAoBl+mB,UAAUm+mB,qBAAuB,WACjD,OAAK9+mB,KAAK0I,MAAM2lC,WAGTruC,KAAK0I,MAAMq2mB,kBAFP,CAGf,EACAF,EAAoBl+mB,UAAUq+mB,cAAgB,WAC1C,OAvCkB,GAuCWh/mB,KAAK0I,MAAMwiG,YAAc,EAAIlrG,KAAK8+mB,sBACnE,EACAD,EAAoBl+mB,UAAUs+mB,aAAe,WACzC,IAAI/4iB,EAAKlmE,KAAK0I,MAAO1C,EAAQkgE,EAAGlgE,MAAOmzO,EAAWjzK,EAAGizK,SAAUR,EAAWzyK,EAAGyyK,SAE7E,OADmBxvN,KAAKgE,IAAIhE,KAAK+D,IAAIlnB,EAAOmzO,GAAWR,GAChCQ,IAAaR,EAAWQ,EACnD,EACA0lY,EAAoBl+mB,UAAU8H,OAAS,WACnC,IAAIy9D,EAAKlmE,KAAK0I,MAAOw2mB,EAAch5iB,EAAGg5iB,YAAa/5mB,EAAY+gE,EAAG/gE,UAAWkI,EAAU64D,EAAG74D,QAASgxmB,EAAmBn4iB,EAAGm4iB,iBAAkBz5mB,EAASshE,EAAGthE,OAAQsmG,EAAchlC,EAAGglC,YAAap6F,EAAOo1D,EAAGp1D,KACnMytmB,EAAav+mB,KAAKg/mB,gBAClBG,EAAYn/mB,KAAKi/mB,eACrB,OAAQ,IAAAh+mB,eAAc,MAAO,CAAEkE,UAAWkI,EAAQ+xmB,KAAO,IAAMj6mB,EAAWuH,MAAO9H,EAAOw6mB,KAAMrpgB,QAAS,cAA+C,eAAgB,uBAClK/1G,KAAK0I,MAAM2lC,YAAc,IAAAptC,eAAc,SAAU,CAAEkE,UAAWkI,EAAQghC,WAAY3hC,MAAO9H,EAAOypC,WAAY9jC,GAlDjG,GAkDuH80mB,GAjDvH,GAiD6IruhB,EAnD1I,KAmDuK,MACrL,IAAA/vF,eAAcm9mB,GAAM,CAAEj5mB,UAAWkI,EAAQqvF,MAAO2hhB,iBAAkBA,EAAkBC,UAAWY,EAAaX,WAAYA,EAAYrzgB,YAAaA,EAAax+F,MAAO9H,EAAO83F,SAC5K,IAAAz7F,eAAcm9mB,GAAM,CAAEj5mB,UAAWkI,EAAQ+sC,KAAMikkB,iBAAkBA,EAAkBC,UAAWa,EAAYD,EAAaX,WAAYA,EAAYrzgB,YAAaA,EAAax+F,MAAO9H,EAAOw1C,OACvLtpC,GAAQ,IAAA7P,eAAc,OAAQ,CAAEkE,UAAWkI,EAAQyD,KAAMpE,MAAO9H,EAAOkM,KAAM6d,EArDlE,GAqDuFE,EApDvF,IAoD8G/d,GAAS,KAC1I,EACA+tmB,EAAoBntiB,aAAe,CAC/BrjC,YAAY,EACZ0wkB,kBAAmB,EACnBG,YAAa,EACb7xmB,QAAS,CACL+xmB,KAAM,sBACN1ihB,MAAO,4BACPtiD,KAAM,2BACNtpC,KAAM,2BACNu9B,WAAY,kCAEhBgwkB,kBAAkB,EAClBl5mB,UAAW,GACXwzO,SAAU,IACVQ,SAAU,EACVjuI,YAAa,EACbtmG,OAAQ,CACJw6mB,KAAM,CAAC,EACP1ihB,MAAO,CAAC,EACRtiD,KAAM,CAAC,EACPtpC,KAAM,CAAC,EACPu9B,WAAY,CAAC,GAEjBv9B,KAAM,IAEH+tmB,CACX,CAvD0B,CAuDxB,EAAArtiB,WAEF,SAAS8tiB,GAAgC52mB,GACtBA,EAAMiC,SAArB,IAA+B40mB,EAjGnC,SAAgBhwkB,EAAGptC,GACf,IAAIqzD,EAAI,CAAC,EACT,IAAK,IAAIvyC,KAAKssB,EAAOrnC,OAAOvH,UAAUwH,eAAejE,KAAKqrC,EAAGtsB,IAAM9gB,EAAE+R,QAAQ+O,GAAK,IAC9EuyC,EAAEvyC,GAAKssB,EAAEtsB,IACb,GAAS,MAALssB,GAAqD,oBAAjCrnC,OAAO8C,sBACtB,KAAIrJ,EAAI,EAAb,IAAgBshB,EAAI/a,OAAO8C,sBAAsBukC,GAAI5tC,EAAIshB,EAAE3hB,OAAQK,IAASQ,EAAE+R,QAAQ+O,EAAEthB,IAAM,IAC1F6zD,EAAEvyC,EAAEthB,IAAM4tC,EAAEtsB,EAAEthB,IADgC,CAEtD,OAAO6zD,CACX,CAyF8DkyE,CAAOh/H,EAAO,CAAC,aACzE,OAAQ,IAAAzH,eAAc,MAAO,CAAE,eAAgB,oCAC3C,IAAAA,eAAc,MAAO,CAAEyL,MAAO,CAAEilB,SAAU,WAAYrD,MAAO,OAAQE,OAAQ,UACzE,IAAAvtB,eAAc49mB,GAAqBp3e,GAAS,CAAC,EAAG83e,IAChD72mB,EAAMiC,UAAY,IAAA1J,eAAc,MAAO,CAAE,eAAgB,4CAA6CyL,MAAO,CACrGilB,SAAU,WACVrD,MAAO,OACPE,OAAQ,OACRm6W,UAAW,QACX15X,QAAS,OACTm/B,cAAe,SACfD,eAAgB,SAChBD,WAAY,WACXxlC,EAAMiC,UAAa,MACxC,CA+BA,SAAS60mB,GAAsBx4mB,GAM3B,OALAkB,OAAO6C,KAAK/D,GAAK3E,SAAQ,SAAU9B,GACf,MAAZyG,EAAIzG,WACGyG,EAAIzG,EAEnB,IACOyG,CACX,CCpLA,SAAS,KAYP,OAXA,GAAWkB,OAAOsF,OAAStF,OAAOsF,OAAOwlC,OAAS,SAAUznC,GAC1D,IAAK,IAAI5J,EAAI,EAAGA,EAAI+H,UAAUpI,OAAQK,IAAK,CACzC,IAAI6J,EAAS9B,UAAU/H,GACvB,IAAK,IAAIpB,KAAOiL,EACVtD,OAAOvH,UAAUwH,eAAejE,KAAKsH,EAAQjL,KAC/CgL,EAAOhL,GAAOiL,EAAOjL,GAG3B,CACA,OAAOgL,CACT,EACO,GAAS3B,MAAM5J,KAAM0J,UAC9B,CACA,SAAS+1mB,GAAeh8lB,EAAUC,GAChCD,EAAS9iB,UAAYuH,OAAOyb,OAAOD,EAAW/iB,WAC9C8iB,EAAS9iB,UAAUuU,YAAcuO,EACjC,GAAgBA,EAAUC,EAC5B,CACA,SAAS,GAAgB9K,EAAGqK,GAK1B,OAJA,GAAkB/a,OAAOsa,eAAiBta,OAAOsa,eAAewwB,OAAS,SAAyBp6B,EAAGqK,GAEnG,OADArK,EAAE8J,UAAYO,EACPrK,CACT,EACO,GAAgBA,EAAGqK,EAC5B,CACA,SAASy8lB,GAA4B73mB,EAASC,GAK5C,OAJKA,IACHA,EAAMD,EAAQoJ,MAAM,IAEtBpJ,EAAQC,IAAMA,EACPD,CACT,CAIwD,qBAAXoR,SAA0BA,OAAOC,WAAaD,OAAOC,SAAWD,OAAO,qBAEvD,qBAAXA,SAA0BA,OAAO0mmB,gBAAkB1mmB,OAAO0mmB,cAAgB1mmB,OAAO,0BAenI,IAAI,GAAiB2mmB,GAAkBC,GAAkBC,GAAkBC,GAwCvEC,GAAmBC,GAAoBC,GAAoBC,GAAoBC,GAAoBC,GAAkBC,GAAkBC,GAAkBC,GAAkBC,GAAmBC,GAAmBC,GAAmBC,GAAmBC,GAAmBC,GAAmBC,GAAmBC,GAAmBC,GAAmBC,GAAmBC,GAvCzWC,GAAU,KAAOC,QAAQ,KAAoB,GAAkB3B,GAA4B,CAAC,uDAC5F4B,GAAiB,KAAOhrO,KAAKspO,KAAqBA,GAAmBF,GAA4B,CAAC,mDAAoD,UAAU,SAAUh3mB,GAC5K,OAAIA,EAAMw+B,QACD,QAAI24kB,KAAqBA,GAAmBH,GAA4B,CAAC,2CAE9Eh3mB,EAAM64mB,MACD,QAAIzB,KAAqBA,GAAmBJ,GAA4B,CAAC,gDAAiD,gBAAgB,SAAUh3mB,GACzJ,OAAOA,EAAMM,MAAMsmF,OAAOsuE,OAC5B,SAHF,CAKF,IACI4jd,GAAU,KAAOC,IAAI1B,KAAqBA,GAAmBL,GAA4B,CAAC,8CAC1FgC,GAAS,SAAgBl1mB,GAC3B,IAAI+oF,EAAQ/oF,EAAK+oF,MACfoshB,EAAcn1mB,EAAKm1mB,YACrB,OAAoB,gBAAoBP,GAAS,CAC/C/8mB,GAAI,2BACHkxF,EAAMtoF,KAAI,SAAU0iC,EAAMn/B,GAC3B,IAAI+wmB,EAAOI,EAAcnxmB,EACrB02B,EAASy6kB,IAAgBnxmB,EACzBs/U,EAAOt/U,IAAU+kF,EAAMj0F,OAAS,EACpC,OAAoB,gBAAoBggnB,GAAgB,CACtD/gnB,IAAKiQ,EACL+wmB,KAAMA,EACNr6kB,OAAQA,GACPyI,GAAOmgT,GAAqB,gBAAoB0xR,GAAS,CAC1DvigB,MAAO,6BACP3wF,MAAO,KACPE,OAAQ,KACRokB,KAAM,eACNztC,UAAW,sBACX4wG,QAAS,aACK,gBAAoB,OAAQ,CAC1C6rgB,SAAU,UACVh4iB,EAAG,4HAEP,IACF,EAGI9/B,GAAY,KAAO2qC,IAAIuriB,KAAsBA,GAAoBN,GAA4B,CAAC,kDAC9FmC,GAAa,KAAOptiB,IAAIwriB,KAAuBA,GAAqBP,GAA4B,CAAC,OAAQ,SAAS,SAAUh3mB,GAC9H,IAAI9D,EAAS,CAAC,EAUd,OATI8D,EAAMwjF,QACRtnF,EAAc,MAAI8D,EAAMM,MAAMsmF,OAAOwyhB,WAEnCp5mB,EAAMkqmB,SACRhumB,EAAc,MAAI8D,EAAMM,MAAMsmF,OAAOsjhB,QAEnClqmB,EAAMq5mB,OACRn9mB,EAAmB,WAAI,QAElBA,CACT,IACIo9mB,GAAO,KAAOvtiB,IAAIyriB,KAAuBA,GAAqBR,GAA4B,CAAC,urHAC3F98iB,GAAO,KAAO6R,IAAI0riB,KAAuBA,GAAqBT,GAA4B,CAAC,4GAC3FuC,GAAQ,KAAOxtiB,IAAI2riB,KAAuBA,GAAqBV,GAA4B,CAAC,KAAM,SAAS,SAAUh3mB,GACvH,OAAIA,EAAM2iB,OACD,QAAIg1lB,KAAqBA,GAAmBX,GAA4B,CAAC,wBACvEh3mB,EAAMk5B,QACR,QAAI0+kB,KAAqBA,GAAmBZ,GAA4B,CAAC,8BAD3E,CAGT,IACIwC,GAAS,KAAOztiB,IAAI8riB,KAAqBA,GAAmBb,GAA4B,CAAC,OAAQ,SAAS,SAAUh3mB,GACtH,OAAO,QAAI83mB,KAAqBA,GAAmBd,GAA4B,CAAC,qBAAsB,eAAgBh3mB,EAAM85B,OAC9H,IACI2/kB,GAAS,KAAO1tiB,IAAIgsiB,KAAsBA,GAAoBf,GAA4B,CAAC,OAAQ,SAAS,SAAUh3mB,GACxH,OAAO,QAAIg4mB,KAAsBA,GAAoBhB,GAA4B,CAAC,sBAAuB,eAAgBh3mB,EAAMszB,QACjI,IACIomlB,GAAQ,KAAOvuD,MAAM8sD,KAAsBA,GAAoBjB,GAA4B,CAAC,kGAC5F2C,GAAM,KAAO5tiB,IAAImsiB,KAAsBA,GAAoBlB,GAA4B,CAAC,mDACxF4C,GAAM,KAAO7tiB,IAAIosiB,KAAsBA,GAAoBnB,GAA4B,CAAC,OAAQ,SAAS,SAAUh3mB,GACrH,IAAI65mB,EAAY,CAAC,EAcjB,OAbI75mB,EAAM6pC,KACRgwkB,EAAgB,KAAI75mB,EAAM6pC,KAE1BgwkB,EAAgB,KAAI,EAElB75mB,EAAM85mB,mBACRD,EAAmB,QAAI,OACvBA,EAAsB,WAAI,UAExB75mB,EAAM+5mB,eACRF,EAAmB,QAAI,OACvBA,EAA0B,eAAI,iBAEzBA,CACT,IACIG,GAAS,KAAO18O,OAAO86O,KAAsBA,GAAoBpB,GAA4B,CAAC,6LAA8L,SAAS,SAAUh3mB,GACjT,IAAImX,EAAQnX,EAAMM,MAAMsmF,OAAOguQ,QAa/B,MAZsB,YAAlB50V,EAAM03kB,QACRvgkB,EAAQnX,EAAMM,MAAMsmF,OAAOsuE,QACA,WAAlBl1J,EAAM03kB,QACfvgkB,EAAQnX,EAAMM,MAAMsmF,OAAOsjhB,OACA,cAAlBlqmB,EAAM03kB,QACfvgkB,EAAQnX,EAAMM,MAAMsmF,OAAOwyhB,UACA,YAAlBp5mB,EAAM03kB,UACfvgkB,EAAQnX,EAAMM,MAAMsmF,OAAOqzhB,SAEzBj6mB,EAAMy/X,WACRtoX,GAAS,MAEPnX,EAAMsgmB,SACD,QAAI+X,KAAsBA,GAAoBrB,GAA4B,CAAC,+BAAgC,qBAAsB,eAAgB7/lB,EAAOA,IAExJ,QAAImhmB,KAAsBA,GAAoBtB,GAA4B,CAAC,sDAAuD,gCAAiC,eAAgB7/lB,EAAOA,EAErM,IACI+imB,IAAS,QAAU3B,KAAsBA,GAAoBvB,GAA4B,CAAC,6FAe1FmD,IAdkB,KAAOzziB,OAAO8xiB,KAAsBA,GAAoBxB,GAA4B,CAAC,OAAQ,iBAAkB,yLAAyL,SAAUh3mB,GACtU,IAAI9D,EAAS,CAAC,EACdA,EAAU,EAAI8D,EAAMw5U,QAAU,GAC9Bt9U,EAAO,oBAAoC,EAAdA,EAAU,EAAQukB,KAAK2pE,GACpD,IAAIgwhB,EAAkB,EAAIp6mB,EAAM29C,SAAW,IAE3C,OADAzhD,EAAO,qBAAuBk+mB,EAAkBl+mB,EAAO,qBAAuBA,EAAO,oBAC9EA,CACT,IAAG,SAAU8D,GACX,OAAOA,EAAMM,MAAMsmF,OAAOsuE,OAC5B,IACqB,KAAOxuF,OAAO+xiB,KAAsBA,GAAoBzB,GAA4B,CAAC,kEAAmE,mBAAoB,mLAAmL,SAAUh3mB,GAC5X,OAAOA,EAAMM,MAAMsmF,OAAOsuE,OAC5B,GAAGgld,IAEgB,SAAsBp2mB,GACvC,IAAIu2mB,EAAUv2mB,EAAKu2mB,QACf7nB,EAAeC,KACjB3xC,EAAgB0xC,EAAa1xC,cAC7Bi1C,EAAevD,EAAauD,aAC5BI,EAAgB3D,EAAa2D,cAC7B1C,EAAejB,EAAaiB,cAC9B,IAAA56kB,YAAU,WACJioiB,EAAclojB,OAAS,GACzByhnB,EAAQv5D,EAAc,GAE1B,GAAG,CAACA,IACJ,IAAI91iB,EAAkByolB,EAAe,qBAAuB,qBACxDnzlB,GAAQ,UACZ,OAAoB,gBAAoB45D,GAAM,GAAS,CAAC,EAAG67hB,IAAgB,CACzE/xlB,MAAO,CACLjG,OAAQ,UACRiN,gBAAiBA,KAEJ,gBAAoByumB,GAAQ,CAC3CnmlB,QAAS,QACK,gBAAoB,QAAS6ikB,KAA+B,gBAAoBqjB,GAAQ,CACtG1/kB,OAAQ,cACM,gBAAoBq/kB,GAAY,CAC9C31hB,OAAO,GACN,gBAA8B,gBAAoBm2hB,GAAK,KAAmB,gBAAoBC,GAAK,CACpG/vkB,KAAM,KACQ,gBAAoB8vkB,GAAK,KAAmB,gBAAoBC,GAAK,CACnF/vkB,KAAM,KACQ,gBAAoB,MAAO,CACzC7lC,MAAO,CACLuT,YAAa,QAEfg/F,MAAO,6BACP3wF,MAAO,KACPE,OAAQ,KACRokB,KAAM5pC,EAAMsmF,OAAOwyhB,UACnB38mB,UAAW,uBACX4wG,QAAS,aACK,gBAAoB,OAAQ,CAC1C6rgB,SAAU,UACVh4iB,EAAG,qIACY,gBAAoB,OAAQ,CAC3CA,EAAG,4cACc,gBAAoB04iB,GAAK,CAC1C/vkB,KAAM,KACQ,gBAAoB,KAAM,CACxC7lC,MAAO,CACLk8X,aAAc,SAEf,gCAA8C,gBAAoBi5O,GAAY,CAC/E31hB,OAAO,GACN,4BAA0C,gBAAoBo2hB,GAAK,CACpE/vkB,KAAM,KACQ,gBAAoB0vkB,GAAO,CACzC52lB,OAAO,GACO,gBAAoBq3lB,GAAQ,CAC1CtiC,QAAS,YACT4oB,SAAS,GACR,oBACL,GAEIxmB,GAAa,SAAoB5kjB,EAAGC,GACtC,OAAO1U,KAAKI,MAAMqU,EAAIC,EAAI,IAAM,IAAM,EACxC,EACImllB,GAAoB,SAA2Bx2mB,GACjD,IAAIy2mB,EAAuBC,EACvBC,EAAkB32mB,EAAK22mB,gBACzBC,EAAgB52mB,EAAK42mB,cACnBn9jB,EAAQk9jB,EAAgBl9jB,MACxBw2N,EAAkE,QAAxDwmW,EAAwBE,EAAgBE,kBAAkD,IAA1BJ,OAAmC,EAASA,EAAsBxmW,OAC5I6mW,EAA4E,QAAzDJ,EAAyBC,EAAgBE,kBAAmD,IAA3BH,OAAoC,EAASA,EAAuBI,gBAC5J,IAAK7mW,IAAW6mW,EACd,OAAoB,gBAAoB,MAAO,MAEjD,IAAIt6mB,GAAQ,UACZ,OAAoB,gBAAoB,MAAO,KAAMo6mB,GAA8B,gBAAoB,MAAO,KAAM,cAA4B,gBAAoB,IAAK,KAAMA,EAAcn0kB,SAAUm0kB,GAA8B,gBAAoB,MAAO,KAAmB,gBAAoB,IAAK,KAAM,sBAAoC,gBAAoB,KAAM,MAAoB,gBAAoB,MAAO,KAAmB,gBAAoB,MAAO,CAC3c12mB,MAAO,CACLuT,YAAa,QAEfg/F,MAAO,6BACP3wF,MAAO,KACPE,OAAQ,KACRokB,KAAM5pC,EAAMsmF,OAAOqzhB,QACnBx9mB,UAAW,yBACX4wG,QAAS,aACK,gBAAoB,OAAQ,CAC1CnsC,EAAG,uRACa,gBAAoB,IAAK,KAAM44gB,GAAWv8hB,EAAQw2N,EAAO8mW,OAAQt9jB,GAAQ,KAAM,8CAAyE,IAA1Bq9jB,EAAgBr9jB,OAA4B,gBAAoB,MAAO,KAAmB,gBAAoB,MAAO,CACnQv5C,MAAO,CACLuT,YAAa,QAEfg/F,MAAO,6BACP3wF,MAAO,KACPE,OAAQ,KACRokB,KAAM5pC,EAAMsmF,OAAOsuE,QACnBz4J,UAAW,iBACX4wG,QAAS,aACK,gBAAoB,OAAQ,CAC1CnsC,EAAG,+KACA,6CAA8C05iB,EAAgBr9jB,MAAQ,GAAkB,gBAAoB,MAAO,KAAmB,gBAAoB,MAAO,CACpKv5C,MAAO,CACLuT,YAAa,QAEfg/F,MAAO,6BACP3wF,MAAO,KACPE,OAAQ,KACRokB,KAAM5pC,EAAMsmF,OAAOsjhB,OACnBztmB,UAAW,iCACX4wG,QAAS,aACK,gBAAoB,OAAQ,CAC1CnsC,EAAG,0RACA05iB,EAAgBr9jB,MAAQA,EAAQ,KAAqB,gBAAoB,OAAQ,KAAmB,gBAAoB,IAAK,KAAMq9jB,EAAgBr9jB,OAAQ,+CAAgDq9jB,EAAgBr9jB,MAAQA,GAAS,KAAqB,gBAAoB,OAAQ,KAAmB,gBAAoB,IAAK,KAAMu8hB,GAAW8gC,EAAgBr9jB,MAAOA,GAAQ,KAAM,mDACtY,EACIu9jB,GAAwB,SAA+B51mB,GACzD,IAAIyyC,EAASzyC,EAAMyyC,OACjBojkB,EAAW71mB,EAAM61mB,SACjB7ikB,EAAYhzC,EAAMgzC,UAClB8ikB,EAAiB91mB,EAAM81mB,eACvB3jnB,EAAU6N,EAAM7N,QAClB,OAAoB,gBAAoB,MAAO,KAAmB,gBAAoBminB,GAAQ,CAC5F1/kB,OAAQ,UACM,gBAAoB6/kB,GAAK,KAAmB,gBAAoBC,GAAK,CACnFE,kBAAkB,EAClBC,cAAc,GACA,gBAAoBP,GAAQ,CAC1C1/kB,OAAQ,UACP6d,EAAOpvC,MAAM,EAAG,KAAmB,gBAAoBkxmB,GAAQ,CAChEnmlB,QAAS,UACK,gBAAoB,MAAO,CACzCijF,MAAO,6BACP3wF,MAAO,KACPE,OAAQ,KACRokB,KAAM,eACNztC,UAAW,oBACX4wG,QAAS,aACK,gBAAoB,OAAQ,CAC1C6rgB,SAAU,UACVh4iB,EAAG,qJACe,gBAAoB04iB,GAAK,KAAmB,gBAAoB,GAAQ,CAC1FnJ,aAAa,EACb1N,cAAc,EACdzlmB,MAAO09mB,EACP3jnB,QAASA,EACTg4E,SAAUn3B,OACQ,gBAAoBwhkB,GAAO,KAAmB,gBAAoB,QAAS,KAAMqB,EAASx2mB,KAAI,SAAU9K,EAAGovE,GAC7H,OAAoB,gBAAoB,KAAM,CAC5ChxE,IAAKgxE,GACS,gBAAoB,KAAM,CACxC7kE,MAAO,CACLgH,gBAAiB,UACjBvE,UAAW,SACXmf,MAAO,SAERijD,GAAmB,gBAAoB,KAAM,CAC9C7kE,MAAO,CACLsvB,QAAS,cAEV75B,GAAkB,gBAAoB,IAAK,KAAM,YACtD,MACF,EACIwhnB,GAAkB,SAAyBp0mB,GAC7C,IAAIxP,EAAUwP,EAAMxP,QAClBsgD,EAAS9wC,EAAM8wC,OACfojkB,EAAWl0mB,EAAMk0mB,SACjBG,EAAgBr0mB,EAAMq0mB,cACtBC,EAAmBt0mB,EAAMs0mB,iBACzBV,EAAkB5zmB,EAAM4zmB,gBACtBxgnB,EAAQ,KACRqG,GAAQ,UAuHZ,OArHErG,EADEihnB,EAAcE,UACK,gBAAoBzB,GAAK,KAAmB,gBAAoBC,GAAK,KAAmB,gBAAoBD,GAAK,KAAmB,gBAAoBC,GAAK,CAChLE,kBAAkB,EAClBC,cAAc,GACA,gBAAoBP,GAAQ,CAC1C1/kB,OAAQ,UACP6d,EAAOpvC,MAAM,EAAG,KAAmB,gBAAoBkxmB,GAAQ,CAChEnmlB,QAAS,UACK,gBAAoB,MAAO,CACzCijF,MAAO,6BACP3wF,MAAO,KACPE,OAAQ,KACRokB,KAAM,eACNztC,UAAW,oBACX4wG,QAAS,aACK,gBAAoB,OAAQ,CAC1C6rgB,SAAU,UACVh4iB,EAAG,qJACe,gBAAoB04iB,GAAK,KAAmB,gBAAoB,GAAQ,CAC1Fl2kB,YAAY,EACZpmC,MAAO49mB,EAAcR,mBACH,gBAAoBd,GAAK,CAC3CG,cAAc,EACdD,kBAAkB,GACJ,gBAAoB,MAAO,KAAmB,gBAAoB,MAAO,CACvF91mB,MAAO,CACL81B,OAAQ,aAEVy8E,MAAO,6BACP3wF,MAAO,KACPE,OAAQ,KACRokB,KAAM5pC,EAAMsmF,OAAOsuE,QACnBz4J,UAAW,iBACX4wG,QAAS,aACK,gBAAoB,OAAQ,CAC1CnsC,EAAG,+KACA,aAA2B,gBAAoB84iB,GAAQ,CAC1D11kB,QAAS,WACP62kB,EAAiB,GAAS,CAAC,EAAGD,EAAe,CAC3CE,WAAW,IAEf,GACC,UACMF,EAAcG,QACF,gBAAoB1B,GAAK,KAAmB,gBAAoBC,GAAK,CACxFE,kBAAkB,GACJ,gBAAoBN,GAAQ,CAC1C1/kB,OAAQ,UACP6d,IAAuB,gBAAoBiikB,GAAK,CACjDG,cAAc,EACdD,kBAAkB,GACJ,gBAAoB,MAAO,KAAmB,gBAAoB,MAAO,CACvF91mB,MAAO,CACL81B,OAAQ,aAEVy8E,MAAO,6BACP3wF,MAAO,KACPE,OAAQ,KACRokB,KAAM,eACNztC,UAAW,uBACX4wG,QAAS,aACK,gBAAoB,OAAQ,CAC1CnsC,EAAG,6PACY,gBAAoB,OAAQ,CAC3CA,EAAG,gJACA,WAAyB,gBAAoB84iB,GAAQ,CACxD11kB,QAAS,WACP62kB,EAAiB,GAAS,CAAC,EAAGD,EAAe,CAC3CR,cAAe,KACfW,SAAS,EACTp/mB,KAAM,OAEV,GACC,UAEkB,gBAAoB09mB,GAAK,KAAmB,gBAAoBC,GAAK,KAAmB,gBAAoBkB,GAAuB,CACtJzjnB,QAASA,EACTsgD,OAAQA,EACRojkB,SAAUA,EACVC,eAAgBE,EAAcR,cAC9BxikB,UAAW,SAAmBwikB,GAC5BS,EAAiB,GAAS,CAAC,EAAGD,EAAe,CAC3CR,cAAeA,EACfW,SAAS,EACTp/mB,KAAM07C,IAEV,KACgB,gBAAoBiikB,GAAK,KAAmB,gBAAoBH,GAAQ,CACxFnmlB,QAAS,gBACTtvB,MAAO,CACLuC,QAAS,OACTm/B,cAAe,SACf5f,OAAQ,MACR2f,eAAgB,kBAEJ,gBAAoB,MAAO,KAAMy1kB,EAAcR,eAA8B,gBAAoBJ,GAAmB,CAClII,cAAeQ,EAAcR,cAC7BD,gBAAiBA,KACD,gBAAoB,MAAO,KAAMS,EAAcR,eAA8B,gBAAoBV,GAAQ,CACzHh2mB,MAAO,CACLuT,YAAa,QAEfmgkB,QAAS,UACTpziB,QAAS,WACP62kB,EAAiB,GAAS,CAAC,EAAGD,EAAe,CAC3CE,WAAW,IAEf,GACC,mBAAiC,gBAAoBpB,GAAQ,CAC9DtiC,QAAS,YACT4oB,SAAS,EACTh8jB,QAAS,WACP62kB,EAAiB,GAAS,CAAC,EAAGD,EAAe,CAC3CG,SAAS,IAEb,GACC,0BAEe,gBAAoB7B,GAAQ,CAC9C1/kB,OAAQ,UACM,gBAAoBogC,GAAM,KAAMjgE,GAClD,EAEIqhnB,GAAe,SAAsBx3mB,GACvC,IAAI20C,EAAS30C,EAAK20C,OAChBunL,EAASl8N,EAAKk8N,OACd26Y,EAAa72mB,EAAK62mB,WAClBY,EAAiBz3mB,EAAKy3mB,eACtBC,EAAoB13mB,EAAK03mB,kBACzBC,EAAwB33mB,EAAK23mB,sBAC7Bj+B,EAAa15kB,EAAK05kB,WAClBk+B,EAAU53mB,EAAK43mB,QACbnvlB,EAAOksB,EAAOlsB,KACdl1B,EAAU2oO,EAAOz7N,KAAI,SAAUuiC,GACjC,MAAO,CACLP,MAAOO,EAAEP,MACTjpC,MAAOwpC,EAAEjvC,IAEb,IACI8jnB,EAA2BF,EAAsB7inB,OAAS,EAC9D,OAAoB,gBAAoB,MAAO,KAAmB,gBAAoB,MAAO,KAAmB,gBAAoB,KAAM,KAAM6/C,EAAOlsB,KAAK3zB,OAAS,EAAG,mBAAoB2zB,EAAK,GAAGhoB,KAAI,SAAUozC,EAAQ48f,GACxN,IAAIqnE,EACAb,EAAWxulB,EAAKhkB,MAAM,EAAG,GAAGhE,KAAI,SAAU28D,GAC5C,OAAOA,EAAEqze,EACX,IACI2mE,EAAgBK,EAAehnE,IAAgB,CAAC,EAChDkmE,EAAkB,CACpBl9jB,MAAOo9jB,EAAWp9jB,MAClBo9jB,WAAYA,EAAWkB,qBAA+E,QAAzDD,EAAwBV,EAAcR,qBAAqD,IAA1BkB,OAAmC,EAASA,EAAsBt+mB,QAElL,OAAoB,gBAAoB29mB,GAAiB,CACvDpjnB,IAAK08iB,EACLA,YAAaA,EACb58f,OAAQA,EACRojkB,SAAUA,EACVG,cAAeA,EACfC,iBAAkB,SAA0BD,GAC1C,IAAIY,EAAc,GAAS,CAAC,EAAGP,GAC/BL,EAAc3mE,YAAcA,EAC5BunE,EAAYvnE,GAAe2mE,EAC3BM,EAAkBM,EACpB,EACAzknB,QAASA,EACTojnB,gBAAiBA,GAErB,IAAiB,gBAAoBjB,GAAQ,CAC3C1/kB,OAAQ,UACM,gBAAoBy/kB,GAAO,CACzC52lB,OAAO,GACNg5lB,GAA4BF,EAAsBl3mB,KAAI,SAAUuiC,GACjE,OAAoB,gBAAoB,MAAO,KAAmB,gBAAoBqykB,GAAY,CAChGn1mB,MAAO,CACLk8X,aAAc,QAEhBgqO,QAAQ,EACRmP,MAAM,GACL,uBAAwBvykB,EAAEP,MAAoB,gBAAoB,MAAO,CAC1EviC,MAAO,CACLm8X,WAAY,QAEd5pR,MAAO,6BACP3wF,MAAO,KACPE,OAAQ,KACRokB,KAAM,UACNztC,UAAW,gCACX4wG,QAAS,aACK,gBAAoB,OAAQ,CAC1CnsC,EAAG,qKAEP,KAAkB,gBAAoBy4iB,GAAK,KAAmB,gBAAoBC,GAAK,KAAmB,gBAAoBI,GAAQ,CACpI11kB,QAASo3kB,EACTpb,SAAS,GACR,SAAuB,gBAAoBsZ,GAAK,KAAmB,gBAAoBL,GAAO,CAC/F52lB,OAAO,GACO,gBAAoBq3lB,GAAQ,CAC1C11kB,QAASk5iB,EACT9F,QAASikC,EAA2B,SAAW,WAC9CA,GAA4B,mBAAoBA,GAA4B,cACjF,EAKII,GAAY,SAAmB7mlB,GACjC,OAJsB,SAA2BA,GACjD,OAAa,OAANA,QAAoB19B,IAAN09B,CACvB,CAEU8mlB,CAAkB9mlB,EAC5B,EACI+mlB,GAAa,SAAoBV,EAAgBhvlB,GAenD,IAdA,IAAI28D,EAAS,GACThhF,EAAQ,SAAemvG,GACzB,IAAItyF,EAAO,CAAC,EACRitF,EAAMzlF,EAAK8qF,GACf73G,OAAO6C,KAAKk5mB,GAAgB5hnB,SAAQ,SAAUkD,GAC5C,IAAIq+mB,EAAgBK,EAAe1+mB,GAC/B03iB,EAAc2mE,EAAc3mE,YAC5B2mE,EAAcR,gBAChB31lB,EAAKm2lB,EAAcR,cAAcp9mB,OAAS00G,EAAIuic,GAElD,IACAxvhB,EAAKsyF,SAAWA,EAAW,EAC3BnuB,EAAOnwF,KAAKgsB,EACd,EACSsyF,EAAW,EAAGA,EAAW9qF,EAAK3zB,OAAQy+G,IAC7CnvG,EAAMmvG,GAER,OAAOnuB,CACT,EAuBIgzhB,GAAkB,SAAyBC,GAC7C,OAAOA,EAAc35mB,QAAO,SAAU0+D,GACpC,OAAO1hE,OAAO6C,KAAK6+D,GAAG1+D,QAAO,SAAU3F,GACrC,MAAa,aAANA,CACT,IAAGjE,OAAS,CACd,GACF,EAcIwjnB,GAAkB,SAAyBn8Y,GAC7C,SAAIA,EAAM38K,YAAc28K,EAAM38K,WAAW1qD,OAAS,MAC/BqnO,EAAM38K,WAAWvrC,MAAK,SAAUygB,GAC/C,MAAsB,aAAfA,EAAEqzB,QACX,GAIJ,EACIwwjB,GAAiB,SAAwBF,EAAeG,GAC1D,OAhBwB,SAA6BH,GAIrD,OAHAA,EAAcxinB,SAAQ,SAAUmtC,UACvBA,EAAEuwE,QACX,IACO8kgB,CACT,CAWSI,CAvBe,SAA2BJ,EAAeG,GAChE,IAAIE,EAAuBF,EAAiBE,uBAI5C,OAHAL,EAAgBA,EAAc35mB,QAAO,SAAUwvG,GAC7C,OAAQwqgB,EAAqB/tmB,IAAIujG,EAAIqF,SACvC,IACO6kgB,GAAgBC,EACzB,CAiB6BM,CAAkBP,GAAgBC,GAAgBG,GAC/E,EACA,SAAS,GAASv3lB,GAChB,OAAOA,GAAwB,kBAATA,IAAsBxpB,MAAMiD,QAAQumB,EAC5D,CACA,SAAS0kU,GAAU5mV,GACjB,IAAK,IAAI9B,EAAOC,UAAUpI,OAAQkxV,EAAU,IAAIvuV,MAAMwF,EAAO,EAAIA,EAAO,EAAI,GAAItC,EAAO,EAAGA,EAAOsC,EAAMtC,IACrGqrV,EAAQrrV,EAAO,GAAKuC,UAAUvC,GAEhC,IAAKqrV,EAAQlxV,OAAQ,OAAOiK,EAC5B,IAAIC,EAASgnV,EAAQx5O,QACrB,GAAI,GAASztG,IAAW,GAASC,GAC/B,IAAK,IAAIjL,KAAOiL,EAAQ,CAEpB,IAAI0sB,EAIAb,EALN,GAAI,GAAS7rB,EAAOjL,IAEbgL,EAAOhL,IAAM2H,OAAOsF,OAAOjC,IAAS2sB,EAAiB,CAAC,GAAkB33B,GAAO,CAAC,EAAG23B,IACxFi6T,GAAU5mV,EAAOhL,GAAMiL,EAAOjL,SAG9B2H,OAAOsF,OAAOjC,IAAS8rB,EAAkB,CAAC,GAAmB92B,GAAOiL,EAAOjL,GAAM82B,GAErF,CAEF,OAAO86T,GAAUvoV,WAAM,EAAQ,CAAC2B,GAAQY,OAAOqmV,GACjD,CAUA,IAAI4yR,GAAa,SAAoB54mB,GACnC,IAAIq4mB,EAAgBr4mB,EAAKq4mB,cACvBn8Y,EAASl8N,EAAKk8N,OACd28Y,EAAW74mB,EAAK64mB,SAChBC,EAAS94mB,EAAK84mB,OACdN,EAAmBx4mB,EAAKw4mB,iBACxBpkP,EAAap0X,EAAKo0X,WAChB2kP,GAAY,IAAAvkmB,UAAS,MACvBwhV,EAAU+iR,EAAU,GACpBC,EAAaD,EAAU,GAEvBE,GADe,IAAAzkmB,UAAS,MACM,GAC5B0kmB,GAAgB,IAAAxkmB,QAAO8jmB,GAC3BU,EAAc7inB,QAAUminB,GACxB,IAAAzjmB,YAAU,WACRkH,YAAW,WACG,OAAZ+5U,QAAgC,IAAZA,GAA8BA,EAAQ+wH,YAC5D,GAAG,EACL,GAAG,CAACyxJ,IACJ,IAIIW,GAAa,IAAA3kmB,WAAS,GACxB4kmB,EAAiBD,EAAW,GAC5BE,EAAqBF,EAAW,GAC9BG,EAAmB,SAA0BjqkB,GAC/C,OAAI4okB,GAAU5okB,EAAOz4C,OAAOg6V,OAAOz0H,QAAU87Y,GAAU5okB,EAAO5mB,KAAK8qF,WAAa2lgB,EAAc7inB,QAAQkjnB,SAASlqkB,EAAOz4C,OAAOg6V,OAAOz0H,MAAO9sL,EAAO5mB,KAAK8qF,UAC9I,CACLlgG,MAAO,yBACPnM,gBAAiB,yBACjBq1lB,OAAQ,oCAGL,IACT,EAiBIid,EAAU,WACZ,OAAOpB,GAAgBC,GAAevjnB,OAAS,CACjD,EACI2knB,EAAY/9mB,OAAO6C,KAAKi6mB,EAAiBkB,4BAA4B5knB,OAAS,EAC9E0H,GAAQ,UACZ,OAAoB,gBAAoB,MAAO,KAAmB,gBAAoBk5mB,GAAQ,CAC5F1/kB,OAAQ,YACLwjlB,KAAaC,IAA2B,gBAAoB,MAAO,KAAmB,gBAAoB,QAAS,CACtHz5O,QAASo5O,EACT7tiB,SAAU,SAAkB51E,IAzBN,SAA2B6gL,GAEjD,IAAImjc,EACJ,GAFAN,EAAmB7ic,GAEfA,EAAU,CACZ,IAAIkic,EAAuBF,EAAiBE,uBAC5CiB,EAAatB,EAAc35mB,QAAO,SAAUoD,EAAGkC,GAC7C,OAAO00mB,EAAqB/tmB,IAAI3G,EAClC,GACF,MACE21mB,EAAatB,EAEfriR,EAAQo+B,WAAWulP,EACrB,CAcIC,CAAkBjknB,EAAEoJ,OAAOihY,QAC7B,EACArjY,KAAM,WACNxE,KAAM,aACNN,GAAI,eACW,gBAAoB,QAAS,CAC5CqI,MAAO,CACLm8X,WAAY,QAEdw9O,QAAS,cACR,+BAAgCL,MAAcC,GAA0B,gBAAoB,MAAO,CACpGv5mB,MAAO,CACLmT,MAAO7W,EAAMsmF,OAAOsuE,QACpBx9I,WAAY,OACZnR,QAAS,OACTi/B,WAAY,WAEA,gBAAoB,MAAO,CACzC+wE,MAAO,6BACP3wF,MAAO,KACPE,OAAQ,KACRokB,KAAM,eACN,MAAS,iBACTmjE,QAAS,aACK,gBAAoB,OAAQ,CAC1CnsC,EAAG,2MACA,8BAA4C,gBAAoB,MAAO,CAC1El9D,MAAO,CACL8hB,OAAQ,IACRF,MAAO,QAETnpB,UAAW,mBACG,gBAAoB,GAAA49iB,YAAa,CAC/C3kE,mBA9CuB,SAA4Bvic,GACnD+kV,EAAW/kV,EAAO5mB,KAAM4mB,EAAOkkE,SACjC,EA6CE4gR,QAASkkP,EACTjoO,iBAAkB,EAClBjqC,cAAe,CACbpgU,KAAM,EACNrjC,SAAU,IACVwyV,UAAU,GAEZ4kR,YApFgB,SAAqBzqkB,GACrC2pkB,EAAW3pkB,EAAOxQ,KAClBo6kB,EAAiB5pkB,EAAOqlT,UAC1B,GAkFGx4H,EAAOz7N,KAAI,SAAU07N,GACtB,OAAoB,gBAAoB,GAAAs5U,aAAc,CACpD7/M,WAAW,EACX2xG,UAAW+xK,EACXvlnB,IAAKooO,EAAMpoO,IACXgzW,WAAY5qI,EAAM15L,MAClB6la,mBAAoB,SAA4Bj5Z,GAC9C,IAAIkkE,EAAWlkE,EAAOkkE,SAClBwmgB,EAAa1qkB,EAAOuhT,OAAOz0H,MAC/B,GAAI+8Y,EAAc7inB,QAAQkjnB,SAASQ,EAAYxmgB,GAE7C,OADa2lgB,EAAc7inB,QAAQ2jnB,UAAUD,EAAYxmgB,GAC3C9yG,KAAI,SAAU9K,GAC1B,OAAOA,EAAE+2C,OACX,IAAGhtC,KAAK,KAEZ,EACAy8N,MAAOA,EAAMpoO,KAEjB,MAAmB,gBAAoB2hnB,GAAQ,CAC7C1/kB,OAAQ,UACM,gBAAoB6/kB,GAAK,KAAmB,gBAAoBC,GAAK,KAAMgD,GAAuB,gBAAoB5C,GAAQ,CAC5I11kB,QAASs4kB,EACTtc,SAAS,GACR,SAAuB,gBAAoBsZ,GAAK,KAAmB,gBAAoBL,GAAO,CAC/F52lB,OAAO,GACN26lB,KAA0B,gBAAoBtD,GAAQ,CACvD11kB,QAASq4kB,GACRL,EAAiBiB,aAAe,8BAA+BjB,EAAiBiB,aAAe,cACpG,EAEIQ,GAAS,WACX,IAAIz9mB,GAAQ,UACZ,OAAoB,gBAAoB,MAAO,KAAmB,gBAAoBk5mB,GAAQ,CAC5F1/kB,OAAQ,OACR91B,MAAO,CACLyC,UAAW,WAEC,gBAAoB,MAAO,CACzCzC,MAAO,CACL4hB,MAAO,QACPE,OAAQ,QACRgU,OAAQ,SACR7Q,SAAU,aAEE,gBAAoB,MAAO,CACzCjlB,MAAO,CACLilB,SAAU,WACV6Q,OAAQ,OACRlX,IAAK,IACLH,OAAQ,IACRC,KAAM,IACNC,MAAO,KAET4zF,MAAO,6BACP3wF,MAAO,KACPE,OAAQ,KACRokB,KAAM5pC,EAAMsmF,OAAOsjhB,OACnBztmB,UAAW,aACX4wG,QAAS,aACK,gBAAoB,OAAQ,CAC1CnsC,EAAG,sMACc,gBAAoB,KAAM,CAC3Cl9D,MAAO,CACLyT,SAAU,QAEX,yBACL,EACIummB,GAAY,SAAmBl6mB,GACjC,IArLgByqD,EACZzvD,ED3fe0+D,EACbw4iB,EAAwBiI,EAAkClqmB,EAA0BmqmB,EAAwBC,EAA0BC,EAAoCC,EAAoDC,EAA4BtzmB,EAC1PuzmB,EACAC,EC4qBF7gkB,EAAW75C,EAAK65C,SAClBnyB,EAAU1nB,EAAK0nB,QACblrB,GAAQ,UACRm+mB,GAxLYlwjB,EAwLSjuD,EAAMsmF,OAAOsuE,SAvLlCp2J,EAAS,4CAA4CS,KAAKgvD,IAC9C,CACd+5B,EAAG13B,SAAS9xD,EAAO,GAAI,IACvBktC,EAAG4kB,SAAS9xD,EAAO,GAAI,IACvBq2B,EAAGy7B,SAAS9xD,EAAO,GAAI,KACrB,MAmLFwpF,EAAIm2hB,EAAUn2hB,EACdt8C,EAAIyykB,EAAUzykB,EACd7W,EAAIsplB,EAAUtplB,EAChB,OAAoB,gBAAoB,MAAO,KAAmB,gBAAoBqklB,GAAQ,CAC5F1/kB,OAAQ,OACR91B,MAAO,CACLyC,UAAW,WAEC,gBAAoB,MAAO,CACzCzC,MAAO,CACL4hB,MAAO,QACPE,OAAQ,QACRgU,OAAQ,SACR7Q,SAAU,aAEE,gBAAoB2tlB,GAAiC,CACnEt5mB,MAAOqgD,EACP6kD,YAAa,EACbtmG,QDrsBiBshE,ECqsBG,CAClB2gjB,UAAW,QAAU71hB,EAAI,KAAOt8C,EAAI,KAAO7W,EAAI,KAAOwoB,EAAW,IAAM,KDrsBrEq4jB,EAAWx4iB,EAAGw4iB,SAAUiI,EAAgBzgjB,EAAGygjB,cAAelqmB,EAAYypD,EAAGzpD,UAAWmqmB,EAAW1gjB,EAAG0gjB,SAAUC,EAAY3gjB,EAAG2gjB,UAAWC,EAAiB5gjB,EAAG4gjB,eAAgBC,EAAyB7gjB,EAAG6gjB,uBAAwBC,EAAa9gjB,EAAG8gjB,WAAYtzmB,EAAkBwyD,EAAGxyD,gBAC/QuzmB,EAAgC,MAAZvI,OAAmBx+mB,EAAY,UAAYw+mB,EAAW,QAC1EwI,EAAsC,MAAZxI,OAAmBx+mB,EAAY,gBACtD,CACHk/mB,KAAM,CAAC,EACPhlkB,KAAMolkB,GAAsB,CACxB4H,OAAQP,EACRF,cAAeA,EACf/6lB,UAAWq7lB,EACXplgB,gBAAiBqlgB,EACjBv8lB,WAAYm8lB,EACZO,mBAA8C,MAA1BN,OAAiC7mnB,EAAY6mnB,EAAyB,MAE9FrqhB,MAAO8ihB,GAAsB,CACzB4H,OAAQJ,EACRL,cAAeA,EACf/6lB,UAAWq7lB,EACXplgB,gBAAiBqlgB,IAErBp2mB,KAAM0umB,GAAsB,CACxB5skB,KAAMn2B,EACN0D,SAAUymmB,IAEdv4kB,WAAYmxkB,GAAsB,CAC9B5skB,KAAMl/B,QC+qBZwgB,GAAwB,gBAAoBozlB,GAAa,MAAOpzlB,GAAwB,gBAAoB,MAAO,KAAmB,gBAAoB,IAAK,CACjKxnB,MAAO,CACLyT,SAAU,UAEXkmC,EAAU,QAASnyB,GAAwB,gBAAoB,KAAM,CACtExnB,MAAO,CACLyT,SAAU,QAEX,cAAe+T,GAAwB,gBAAoB,KAAM,CAClExnB,MAAO,CACLyT,SAAU,QAEX,YACL,EACImnmB,GAAc,WAChB,IAAIt+mB,GAAQ,UACZ,OAAoB,gBAAoB,MAAO,CAC7C0D,MAAO,CACLilB,SAAU,WACV6Q,OAAQ,OACRlX,IAAK,IACLH,OAAQ,IACRC,KAAM,IACNC,MAAO,KAET4zF,MAAO,6BACP3wF,MAAO,KACPE,OAAQ,KACRokB,KAAM5pC,EAAMsmF,OAAOsuE,QACnB,MAAS,iBACT7nD,QAAS,aACK,gBAAoB,OAAQ,CAC1CnsC,EAAG,0MAEP,EACI29iB,GAAY,SAAmB35mB,GACjC,IAAIi3mB,EAAgBj3mB,EAAMi3mB,cACxBx+jB,EAAWz4C,EAAMy4C,SACjBnyB,EAAUtmB,EAAMsmB,QAElB,OADWtmB,EAAM45mB,OAEK,gBAAoBf,GAAQ,MAE9B,gBAAoBC,GAAW,CACjDrgkB,SAAUA,EACVw+jB,cAAeA,EACf3wlB,QAASA,GAEb,EAEA,SAAS/c,GAAIwxG,EAAY3iH,GACvB,OAAsC,IAA/B2iH,EAAWz0G,QAAQlO,EAC5B,CACA,SAASyhnB,GAAe9+f,EAAYlnG,GAClC,IAAIza,EAAM,CAAC,EAIX,OAHA2hH,EAAWtmH,SAAQ,SAAUorB,GAC3BhM,EAASgM,EAAMzmB,EACjB,IACOA,CACT,CACA,SAASg/mB,GAAQtrgB,GACf,IAAIzlF,EAAO,GAAS,CAAC,EAAGylF,GAGxB,cAFOzlF,EAAK8qF,SACC73G,OAAOilE,OAAOl4C,GACb3zB,OAAS,CACzB,CAEA,IAAIomnB,GAAyB,WAC3B,SAASA,EAAUlof,GACjBx/H,KAAKw/H,WAAaA,CACpB,CAqBA,OApBakof,EAAU/mnB,UAChBq0D,QAAU,SAAiB2yjB,EAAYjtgB,GAC5C,MAAM,IAAI5jG,MAAM,kBAClB,EACA4wmB,EAAUE,oBAAsB,SAA6Bpof,GAC3D,IAAIqof,EAAU,CACZC,cAAeC,GACf9qW,SAAU+qW,GACVxge,OAAQyge,GACR36mB,SAAU46mB,GACVC,eAAgBC,GAChBC,WAAYC,GACZ5Q,OAAQ6Q,IAEV,KAAM/of,EAAWjrE,YAAYszjB,GAC3B,MAAM,IAAI/wmB,MAAM,yBAA2B0oH,EAAWjrE,SAAW,iCAAmCrsD,OAAO6C,KAAK88mB,GAAS37mB,KAAK,OAGhI,OAAO,IAAIs8mB,EADUX,EAAQrof,EAAWjrE,WACdirE,EAC5B,EACOkof,CACT,CAzB6B,GA0BzBU,GAAsC,SAAUK,GAElD,SAASL,EAAuB5of,GAC9B,IAAIvpH,EAIJ,IAHAA,EAAQwymB,EAAWvknB,KAAKlE,KAAMw/H,IAAex/H,MACvCwC,UAAYg9H,EAAWh9H,WAAa,OAC1CyT,EAAMk3D,OAASqyD,EAAWryD,QACrBl3D,EAAMk3D,OACT,MAAM,IAAIr2D,MAAM,iDAElB,OAAOb,CACT,CAkBA,OA5BAwpmB,GAAe2I,EAAwBK,GAWzBL,EAAuBznnB,UAC7Bq0D,QAAU,SAAiB2yjB,GACjC,IAAItxmB,EAASrW,KAEb,OADa2nnB,EAAWnknB,MAAMxD,KAAKwC,WACxBixB,MAAK,SAAUztB,GACxB,OAAQqQ,EAAO82D,OAAO7/D,SAAStH,EAAMgxC,OACvC,IACS,CACL0xkB,OAAO,EACPxvkB,QAASl5C,KAAKw/H,WAAW3lF,OAAS,0BAClC8ukB,UAAW,YAGR,CACLD,OAAO,EAEX,EACON,CACT,CA9B0C,CA8BxCV,IACEQ,GAAiC,SAAUU,GAE7C,SAASV,EAAkB1of,GACzB,IAAIoie,EAGJ,IAFAA,EAASgnB,EAAY1knB,KAAKlE,KAAMw/H,IAAex/H,MACxCmtE,OAASqyD,EAAWryD,QACtBy0hB,EAAOz0hB,OACV,MAAM,IAAIr2D,MAAM,6CAElB,OAAO8qlB,CACT,CAcA,OAvBA6d,GAAeyI,EAAmBU,GAUpBV,EAAkBvnnB,UACxBq0D,QAAU,SAAiB2yjB,GACjC,OAAK3nnB,KAAKmtE,OAAO7/D,SAASq6mB,GAOnB,CACLe,OAAO,GAPA,CACLA,OAAO,EACPxvkB,QAASl5C,KAAKw/H,WAAW3lF,OAAS,0BAClC8ukB,UAAW,WAMjB,EACOT,CACT,CAzBqC,CAyBnCR,IACEa,GAA+B,SAAUM,GAE3C,SAASN,EAAgB/of,GACvB,IAAIg8e,EACJA,EAASqN,EAAY3knB,KAAKlE,KAAMw/H,IAAex/H,KAC/C,IAAIO,EAAMi/H,EAAWj/H,IACnBuonB,EAAatpf,EAAWspf,WAG1B,OAFAtN,EAAOj7mB,IAAMA,EACbi7mB,EAAOsN,WAAaA,EACbtN,CACT,CAWA,OApBAiE,GAAe8I,EAAiBM,GAUlBN,EAAgB5nnB,UACtBq0D,QAAU,SAAiB2yjB,GACjC,IAAIngnB,EAASxH,KAAK8onB,WAAWnB,GAE7B,MAAO,CACLe,OAFalhnB,EAGb0xC,SAAqB,OAAX1xC,QAA8B,IAAXA,OAAoB,EAASA,EAAO0xC,UAAYl5C,KAAKw/H,WAAW3lF,MAC7F8ukB,WAAuB,OAAXnhnB,QAA8B,IAAXA,OAAoB,EAASA,EAAOjH,MAAQP,KAAKO,IAEpF,EACOgonB,CACT,CAtBmC,CAsBjCb,IACEY,GAAgC,SAAUS,GAE5C,SAAST,IACP,OAAOS,EAAYn/mB,MAAM5J,KAAM0J,YAAc1J,IAC/C,CASA,OAZAy/mB,GAAe6I,EAAkBS,GAInBT,EAAiB3nnB,UACvBq0D,QAAU,SAAiB2yjB,GACjC,MAAO,CACLe,OAAQjmhB,MAAMklhB,IAA8B,OAAfA,QAAsCznnB,IAAfynnB,EACpDzukB,QAASl5C,KAAKw/H,WAAW3lF,OAAS,6BAClC8ukB,UAAW,aAEf,EACOL,CACT,CAdoC,CAclCZ,IACEO,GAA+B,SAAUe,GAE3C,SAASf,EAAgBzof,GACvB,IAAIg9e,EAGJ,OAFAA,EAASwM,EAAY9knB,KAAKlE,KAAMw/H,IAAex/H,MACxC0uJ,KAAO,CAAC,EACR8td,CACT,CAeA,OArBAiD,GAAewI,EAAiBe,GAOlBf,EAAgBtnnB,UACtBq0D,QAAU,SAAiB2yjB,GACjC,OAAIA,KAAc3nnB,KAAK0uJ,KACd,CACLg6d,OAAO,EACPxvkB,QAASl5C,KAAKw/H,WAAW3lF,OAAS,2BAClC8ukB,UAAW,WAGf3onB,KAAK0uJ,KAAKi5d,IAAc,EACjB,CACLe,OAAO,GAEX,EACOT,CACT,CAvBmC,CAuBjCP,IAIF,IAAIK,GAA8B,SAAUkB,GAE1C,SAASlB,EAAevof,GACtB,IAAI0pf,EAQJ,MANuC,kBADvCA,EAASD,EAAY/knB,KAAKlE,KAAMw/H,IAAex/H,MAC7Bw/H,WAAWjsE,MAC3B21jB,EAAO7rC,OAAS6rC,EAAO1pf,WAAWjsE,MAElC21jB,EAAO7rC,OAAS,IAAIz5hB,OAA0BslkB,EAAO1pf,WAAWjsE,MAVzDptD,QAAQ,sBAAuB,SAYxC+inB,EAAOx6d,KAAO,CAAC,EACRw6d,CACT,CAeA,OA1BAzJ,GAAesI,EAAgBkB,GAYjBlB,EAAepnnB,UACrBq0D,QAAU,SAAiB2yjB,GAEjC,OADc3nnB,KAAKq9kB,OAAOrkkB,KAAK2umB,GAQxB,CACLe,OAAO,GAPA,CACLA,OAAO,EACPxvkB,QAAS,wBACTyvkB,UAAW,QAMjB,EACOZ,CACT,CA5BkC,CA4BhCL,IACEM,GAAiC,SAAUmB,GAE7C,SAASnB,IACP,OAAOmB,EAAYv/mB,MAAM5J,KAAM0J,YAAc1J,IAC/C,CAcA,OAjBAy/mB,GAAeuI,EAAmBmB,GAIpBnB,EAAkBrnnB,UACxBq0D,QAAU,SAAiB2yjB,GACjC,OAAKA,EAOE,CACLe,OAAO,GAPA,CACLA,OAAO,EACPxvkB,QAASl5C,KAAKw/H,WAAW3lF,OAAS,yBAClC8ukB,UAAW,WAMjB,EACOX,CACT,CAnBqC,CAmBnCN,IACE0B,GAAgC,WAClC,SAASA,IACPppnB,KAAKkmnB,2BAA6B,CAAC,CACrC,CACA,IAAImD,EAAUD,EAAiBzonB,UAuC/B,OAtCA0onB,EAAQpD,UAAY,WAClB,IAAIqD,EAAStpnB,KACb,OAAOkI,OAAO6C,KAAK/K,KAAKkmnB,4BAA4Bh7mB,QAAO,SAAUq+mB,GACnE,OAAOrhnB,OAAO6C,KAAKu+mB,EAAOpD,2BAA2BqD,IAAWjonB,OAAS,CAC3E,IAAGA,OAAS,CACd,EACA+nnB,EAAQnE,qBAAuB,WAC7B,IAAIsE,EAASxpnB,KACTypnB,EAAgB,GAOpB,OANAvhnB,OAAO6C,KAAK/K,KAAKkmnB,4BAA4B7jnB,SAAQ,SAAUknnB,GAC7D,IAAIG,EAAaxhnB,OAAO6C,KAAKy+mB,EAAOtD,2BAA2BqD,IAC/DE,EAAgBA,EAAct9mB,OAAOu9mB,EAAWz8mB,KAAI,SAAU+jF,GAC5D,OAAO13B,SAAS03B,EAAG,GACrB,IACF,IACO,IAAI9gF,IAAIu5mB,EACjB,EACAJ,EAAQM,SAAW,SAAkBJ,EAAUxpgB,EAAUlmE,GACvD0vkB,EAAWA,EAAS7jnB,WACpBq6G,EAAWA,EAASr6G,WACd6jnB,KAAYvpnB,KAAKkmnB,6BACrBlmnB,KAAKkmnB,2BAA2BqD,GAAY,CAAC,GAEzCxpgB,KAAY//G,KAAKkmnB,2BAA2BqD,KAChDvpnB,KAAKkmnB,2BAA2BqD,GAAUxpgB,GAAY,IAExD//G,KAAKkmnB,2BAA2BqD,GAAUxpgB,GAAUt+G,KAAKo4C,EAC3D,EACAwvkB,EAAQtD,SAAW,SAAkBwD,EAAUxpgB,GAG7C,OAFAwpgB,EAAWA,EAAS7jnB,WACpBq6G,EAAWA,EAASr6G,WACb6jnB,KAAYvpnB,KAAKkmnB,4BAA8BnmgB,KAAY//G,KAAKkmnB,2BAA2BqD,EACpG,EACAF,EAAQ7C,UAAY,SAAmB+C,EAAUxpgB,GAG/C,OAFAwpgB,EAAWA,EAAS7jnB,WACpBq6G,EAAWA,EAASr6G,WACb1F,KAAKkmnB,2BAA2BqD,GAAUxpgB,EACnD,EACOqpgB,CACT,CA5CoC,GAwGhCQ,GAAoB,SAA2B/E,EAAeZ,EAAgBe,GAChF,IAAIT,EAAuB,CAAC,EAW5B,OAVcr8mB,OAAO6C,KAAKk5mB,GAAgBh3mB,KAAI,SAAU1H,GACtD,OAAO0+mB,EAAe1+mB,EACxB,IACQlD,SAAQ,SAAUuhnB,GACxB,GAAKA,EAAcR,cAAnB,CAGA,IAAImG,EAAW3F,EAAcR,cAAcp9mB,MAC3Cu+mB,EAAqBgF,GAxCO,SAAmCA,EAAU1E,EAAegF,GAC1F,IAAIvG,EAAkB,CACpBr9jB,MAAO,GAELw2N,EAAS,CACX8mW,OAAQ,GAoBV,OAlBAsB,EAAcxinB,SAAQ,SAAUunE,GACzBA,EAAE2/iB,KACL9sW,EAAO8mW,QAAU,EAErB,IACAr7mB,OAAO6C,KAAK8+mB,GAAkBxnnB,SAAQ,SAAU09G,GAC9C,IAAI0od,EAASohD,EAAiB9pgB,GAC1B0od,GAAUA,EAAOnnkB,OAAS,IAC5BginB,EAAgBr9jB,OAAS,GAE3BwihB,EAAOpmkB,SAAQ,SAAUw3C,GACnBA,EAAM8ukB,aAAarF,EACrBA,EAAgBzpkB,EAAM8ukB,YAAc,EAEpCrF,EAAgBzpkB,EAAM8ukB,WAAa,CAEvC,GACF,IACO,CACLrF,gBAAiBA,EACjB7mW,OAAQA,EAEZ,CAWqCqtW,CAA0BP,EAAU1E,EAAeG,EAAiBkB,2BAA2BqD,IAAa,CAAC,EAF9I,CAGF,IACO,CACLhF,qBAAsBA,EACtBt+jB,MAAO4+jB,EAAcvjnB,OAEzB,EAEIyonB,GAAiB,CAAC,CAAC,UAAW,MAAO,CAAC,UAAW,MAAO,CAAC,SAAU,MAAO,CAAC,WAAY,MAAO,CAAC,aAAc,MAAO,CAAC,WAAY,MAAO,CAAC,cAAe,MAAO,CAAC,WAAY,MAAO,CAAC,UAAW,MAAO,CAAC,UAAW,MAAO,CAAC,SAAU,MAAO,CAAC,QAAS,MAAO,CAAC,WAAY,MAAO,CAAC,UAAW,MAAO,CAAC,OAAQ,MAAO,CAAC,SAAU,MAAO,CAAC,WAAY,MAAO,CAAC,YAAa,MAAO,CAAC,QAAS,MAAO,CAAC,WAAY,MAAO,CAAC,gBAAiB,MAAO,CAAC,WAAY,MAAO,CAAC,YAAa,MAAO,CAAC,cAAe,MAAO,CAAC,WAAY,MAAO,CAAC,UAAW,MAAO,CAAC,WAAY,MAAO,CAAC,SAAU,MAAO,CAAC,gBAAiB,MAAO,CAAC,aAAc,MAAO,CAAC,aAAc,MAAO,CAAC,WAAY,MAAO,CAAC,iBAAkB,MAAO,CAAC,eAAgB,MAAO,CAAC,OAAQ,MAAO,CAAC,WAAY,MAAO,CAAC,SAAU,MAAO,CAAC,eAAgB,MAAO,CAAC,eAAgB,MAAO,CAAC,iBAAkB,MAAO,CAAC,eAAgB,MAAO,CAAC,YAAa,MAAO,CAAC,QAAS,MAAO,CAAC,OAAQ,MAAO,CAAC,UAAW,MAAO,CAAC,WAAY,MAAO,CAAC,aAAc,MAAO,CAAC,gBAAiB,MAAO,CAAC,YAAa,MAAO,CAAC,UAAW,OAyBzgCC,GAAwB,WAC1B,SAASA,EAASz0hB,QACF,IAAVA,IACFA,EAAQ,IAEVv1F,KAAKu1F,MAAQA,CACf,CACA,IAAI70F,EAASspnB,EAASrpnB,UAWtB,OAVAD,EAAOe,KAAO,SAAckuC,GAC1B3vC,KAAKu1F,MAAM9zF,KAAKkuC,EAClB,EACAjvC,EAAOkrB,UAAY,SAAmB5lB,GACpC,IAAInD,EAAUmD,EAId,OAHAhG,KAAKu1F,MAAMlzF,SAAQ,SAAUstC,GAC3B9sC,EAAU8sC,EAAK/jB,UAAU/oB,EAC3B,IACOA,CACT,EACOmnnB,CACT,CAnB4B,GAoBxBC,GAA2B,WAC7B,SAASA,IAAe,CAqBxB,OApBAA,EAAYrC,oBAAsB,SAA6Bpof,GAC7D,IAAIqof,EAAU,CACZqC,aAAcC,GACdC,YAAaC,GACbC,WAAYC,GACZC,MAAOC,GACP/S,OAAQgT,IAEV,KAAMlrf,EAAWmrf,eAAe9C,GAC9B,MAAM,IAAI/wmB,MAAM,yBAA2B0oH,EAAWmrf,YAAc,mCAAqCzinB,OAAO6C,KAAK88mB,GAAS37mB,KAAK,OAGrI,OAAO,IAAIs8mB,EADUX,EAAQrof,EAAWmrf,cACdnrf,EAC5B,EACcyqf,EAAYtpnB,UAClBirB,UAAY,SAAmB5lB,GACrC,IAAIg9K,EAAWhjL,KAAKgkB,MAAMhe,GAC1B,OAAIg9K,GACGh9K,CACT,EACOiknB,CACT,CAvB+B,GAwB3BQ,GAAgC,SAAUG,GAE5C,SAASH,IACP,OAAOG,EAAahhnB,MAAM5J,KAAM0J,YAAc1J,IAChD,CAKA,OARAy/mB,GAAegL,EAAkBG,GAInBH,EAAiB9pnB,UACvBqjB,MAAQ,SAAehe,GAC7B,OAAOA,EAAMgxC,MACf,EACOyzkB,CACT,CAVoC,CAUlCR,IACES,GAAiC,SAAUG,GAE7C,SAASH,EAAkBlrf,GACzB,IAAIvpH,EACJA,EAAQ40mB,EAAc3mnB,KAAKlE,KAAMw/H,IAAex/H,KAChD,IAAIO,EAAMi/H,EAAWj/H,IACnBuqnB,EAActrf,EAAWsrf,YAG3B,OAFA70mB,EAAM1V,IAAMA,EACZ0V,EAAM+N,MAAQ8mmB,EACP70mB,CACT,CACA,OAVAwpmB,GAAeiL,EAAmBG,GAU3BH,CACT,CAZqC,CAYnCT,IACEE,GAAsC,SAAUY,GAElD,SAASZ,IACP,OAAOY,EAAcnhnB,MAAM5J,KAAM0J,YAAc1J,IACjD,CAKA,OARAy/mB,GAAe0K,EAAwBY,GAIzBZ,EAAuBxpnB,UAC7BqjB,MAAQ,SAAehe,GAC7B,OAAOA,EAAMG,QAAQ,UAAW,GAClC,EACOgknB,CACT,CAV0C,CAUxCF,IACEM,GAAoC,SAAUS,GAEhD,SAAST,IACP,OAAOS,EAAcphnB,MAAM5J,KAAM0J,YAAc1J,IACjD,CAWA,OAdAy/mB,GAAe8K,EAAsBS,GAIvBT,EAAqB5pnB,UAC3BqjB,MAAQ,SAAehe,GAC7B,IAAIokH,EAAS2/f,GAAe98mB,KAAI,SAAUg+mB,GACxC,OAAOA,EAAI,GAAG7knB,aAChB,IACA,GAAI+Q,GAAIizG,EAAQpkH,EAAMI,eAAgB,CACpC,IAAIoK,EAAQ45G,EAAOl2G,QAAQlO,EAAMI,eACjC,OAAO2jnB,GAAev5mB,GAAO,EAC/B,CACF,EACO+5mB,CACT,CAhBwC,CAgBtCN,IACEI,GAAqC,SAAUa,GAEjD,SAASb,IACP,OAAOa,EAActhnB,MAAM5J,KAAM0J,YAAc1J,IACjD,CAOA,OAVAy/mB,GAAe4K,EAAuBa,GAIxBb,EAAsB1pnB,UAC5BqjB,MAAQ,SAAehe,GAC7B,GAAImR,GAAInR,EAAO,KACb,OAAOA,EAAMxC,MAAM,KAAK,EAE5B,EACO6mnB,CACT,CAZyC,CAYvCJ,IAEEphmB,GAAQ,SAAeikE,GACzB,IACE,OAAO92D,QAAQC,QAAQ,IAAID,SAAQ,SAAUC,GAC3CxN,WAAWwN,EAAS62D,EACtB,KAAIr3E,MAAK,WAAa,GACxB,CAAE,MAAOtT,GACP,OAAO6zB,QAAQywB,OAAOtkD,EACxB,CACF,EAEIgpnB,GAAgB,CAClB77hB,OAAQ,CACNguQ,QAAS,UACTwkR,UAAW,UACXlkd,QAAS,UACTg1c,OAAQ,UACR/zc,KAAM,UACN8jd,QAAS,UACTxmmB,MAAO,UACPC,KAAM,YA4BV,SAASgvmB,GAAkBC,GACzB,OAAO,GAAS,CAAC,EAAGA,EAAQ,CAC1B1J,YAAa,EACbxgkB,OAAQ,KACRjtB,SAAS,EACTmyB,SAAU,EACVmhkB,QAAQ,EACR3C,cAAe,GACfxB,WAAY,CACVkB,qBAAsB,CAAC,EACvBt+jB,MAAO,MAETg+jB,eAAgB,CAAC,EACjBe,iBAAkB,IAAIoE,IAE1B,CACA,IAAIkC,GAAkB,SAAyBzG,EAAen8Y,EAAQu7Y,GACpE,IAAIsH,EApRgB,SAAyB1G,EAAen8Y,GAC5D,IAAI8iZ,EAAuB/D,GAAe/+Y,GAAQ,SAAUC,EAAO3hO,GACjEA,EAAI2hO,EAAMpoO,KAAO,GACZooO,EAAM38K,YACX28K,EAAM38K,WAAW3pD,SAAQ,SAAUopnB,GACjCzknB,EAAI2hO,EAAMpoO,KAAKkB,KAAKimnB,GAAUE,oBAAoB6D,GACpD,GACF,IACIzG,EAAmB,IAAIoE,GAmB3B,OAlBA1gZ,EAAOrmO,SAAQ,SAAUsmO,GACvBk8Y,EAAcxinB,SAAQ,SAAUq4G,EAAKqF,GACnC,GAAKimgB,GAAQtrgB,KAGPiuH,EAAMpoO,OAAOm6G,GAASoqgB,GAAgBn8Y,IAA5C,CAGA,IAAI3iO,EAAQ00G,EAAIiuH,EAAMpoO,KACLirnB,EAAqB7iZ,EAAMpoO,KACjC8B,SAAQ,SAAU6+B,GAC3B,IAAI15B,EAAS05B,EAAE8zB,QAAQhvD,GAClBwB,EAAOkhnB,OACV1D,EAAiB2E,SAAShhZ,EAAMpoO,IAAKw/G,EAAUv4G,EAEnD,GARA,CASF,GACF,IACOw9mB,CACT,CAwP4B0G,CAAgB7G,EAAen8Y,GAEzD,MAAO,CACLs8Y,iBAAkBuG,EAClBlI,WAHkBuG,GAAkB/E,EAAeZ,EAAgBsH,GAKvE,EACI,GAAU,SAAiBlhmB,EAAOzF,GACpC,OAAQA,EAAOzb,MACb,IAAK,UACH,OAAOiinB,GAAkB,CACvB1iZ,OAAQr+M,EAAMq+M,SAElB,IAAK,iBACH,OAAO,GAAS,CAAC,EAAGr+M,EAAO,CACzBs3lB,YAAat3lB,EAAMs3lB,YAAc,IAErC,IAAK,qBAED,IAAIgK,EAxNe,SAA8B9G,EAAen8Y,GACtE,IAAIjtH,EAAU,GAAGtvG,OAAO04mB,GACpB+G,EAAqBnE,GAAe/+Y,GAAQ,SAAUC,EAAO3hO,GAC/DA,EAAI2hO,EAAMpoO,KAAO,IAAIypnB,GAChBrhZ,EAAMkjZ,cACXljZ,EAAMkjZ,aAAaxpnB,SAAQ,SAAUypnB,GACnC9knB,EAAI2hO,EAAMpoO,KAAKkB,KAAKwonB,GAAYrC,oBAAoBkE,GACtD,GACF,IAaA,OAZApjZ,EAAOrmO,SAAQ,SAAUsmO,GACvB,IAAIojZ,EAAWH,EAAmBjjZ,EAAMpoO,KACxCk7G,EAAQp5G,SAAQ,SAAUq4G,GACnBsrgB,GAAQtrgB,IAGPiuH,EAAMpoO,OAAOm6G,IAGnBA,EAAIiuH,EAAMpoO,KAAOwrnB,EAASngmB,UAAU8uF,EAAIiuH,EAAMpoO,MAChD,GACF,IACOk7G,CACT,CAkMuCuwgB,CAAqB3hmB,EAAMw6lB,cAAex6lB,EAAMq+M,QAC/E,OAAO,GAAS,CAAC,EAAGr+M,EAAO,CACzBw6lB,cAAe8G,EACfhK,YAAat3lB,EAAMs3lB,YAAc,IAGvC,IAAK,mBAGD,OAAO,GAAS,CAAC,EAAGt3lB,EAAO,CACzBs3lB,YAFgB/8lB,EAAOxB,QAAQu+lB,cAKrC,IAAK,cAED,IAAIsK,GAt4B6DvjZ,EAs4BNr+M,EAAMq+M,OAt4BQnqL,EAs4BA35B,EAAOxB,QAAQ+9B,OAAOlsB,KAAK,GAr4BtGgvlB,EAAiB,CAAC,EACtB1lkB,EAAQl8C,SAAQ,SAAUg+C,EAAQ48f,GAChC,IAAIivE,EAAaxjZ,EAAOjoN,MAAK,SAAU+uB,GAGrC,OAFoBA,EAAEjvC,IAAI6F,cAAcD,QAAQ,IAAK,IAAIA,QAAQ,IAAK,MAC/Ck6C,EAAOj6C,cAAcD,QAAQ,IAAK,IAAIA,QAAQ,IAAK,GAE5E,IACK+lnB,IAGLjI,EAAehnE,GAAe,CAC5BA,YAAaA,EACbt4iB,KAAM07C,EACN+ikB,cAAe,CACbp9mB,MAAOkmnB,EAAW3rnB,IAClB0uC,MAAOi9kB,EAAWj9kB,QAGxB,IACOg1kB,GAm3BGY,EAAgBF,GAAWsH,EAAyBrnmB,EAAOxB,QAAQ+9B,OAAOlsB,MAC9E,OAAO,GAAS,CAAC,EAAG5K,EAAOihmB,GAAgBzG,EAAex6lB,EAAMq+M,OAAQujZ,GAA0B,CAChG9qkB,OAAQv8B,EAAOxB,QAAQ+9B,OACvB8ikB,eAAgBgI,EAChBpH,cAAeA,EACflD,YAAa,IAGnB,IAAK,0BAED,IAAIwK,EAAmBxH,GAAW//lB,EAAOxB,QAAQ6gmB,eAAgB55lB,EAAM82B,OAAOlsB,MAC9E,OAAO,GAAS,CAAC,EAAG5K,EAAOihmB,GAAgBa,EAAkB9hmB,EAAMq+M,OAAQ9jN,EAAOxB,QAAQ6gmB,gBAAiB,CACzGA,eAAgBr/lB,EAAOxB,QAAQ6gmB,eAC/BY,cAAesH,IAGrB,IAAK,eAED,IAAI/ve,EAAO,GAAGjwI,OAAOke,EAAMw6lB,eAE3B,OADAzoe,EAAKx3H,EAAOxB,QAAQ5S,OAASoU,EAAOxB,QAAQs3F,IACrC,GAAS,CAAC,EAAGrwF,EAAOihmB,GAAgBlve,EAAM/xH,EAAMq+M,OAAQr+M,EAAM45lB,gBAAiB,CACpFY,cAAezoe,IAGrB,IAAK,WACH,OAAO,GAAS,CAAC,EAAG/xH,EAAO,CACzBg8B,SAAUzhC,EAAOxB,QAAQijC,WAE7B,IAAK,UACH,OAAO,GAAS,CAAC,EAAGh8B,EAAO,CACzBs3lB,YAAa,EACbztlB,SAAS,EACTmyB,SAAU,IAEd,IAAK,WACH,OAAO,GAAS,CAAC,EAAGh8B,EAAO,CACzBs3lB,YAAa,EACbztlB,SAAS,EACTmyB,SAAU,MAEd,IAAK,SACH,OAAO,GAAS,CAAC,EAAGh8B,EAAO,CACzBs3lB,YAAa,EACb6F,QAAQ,IAEZ,QACE,OAAOn9lB,EAr7BsB,IAAsCq+M,EAAQnqL,EAC3E0lkB,CAs7BN,EAkNA,GAjNe,SAAkBz3mB,GAsC/B,IArCA,IAAI4/mB,EACApjnB,EAAQwD,EAAKxD,MACfk9kB,EAAa15kB,EAAK05kB,WAClBx9W,EAASl8N,EAAKk8N,OACZ2jZ,GAAc,IAAAj+B,YAAW,GAASg9B,GAAkB,CACpD1iZ,OAAQA,KAEV4jZ,EAAeD,EAAY,GAC3B1K,EAAc2K,EAAa3K,YAC3BxgkB,EAASmrkB,EAAanrkB,OACtB0jkB,EAAgByH,EAAazH,cAC7BxB,EAAaiJ,EAAajJ,WAC1BY,EAAiBqI,EAAarI,eAC9Be,EAAmBsH,EAAatH,iBAChC9wlB,EAAUo4lB,EAAap4lB,QACvBmyB,EAAWimkB,EAAajmkB,SACxBmhkB,EAAS8E,EAAa9E,OACtB15B,EAAWu+B,EAAY,GACrBjI,EAAU,WACZt2B,EAAS,CACP3klB,KAAM,WAEV,EAcIw3X,EAAU,GACLh/X,EAAI,EAAGA,EAAI,IAAKA,IACvBg/X,EAAQl/X,KAAK,CACXs+G,SAAUp+G,IAGd,IAAI4qnB,EAAcrknB,OAAO6C,KAAKk5mB,GAAgBh3mB,KAAI,SAAUzH,GAC1D,OAAOy+mB,EAAez+mB,EACxB,IAAG0F,QAAO,SAAU1F,GAClB,OAAQA,EAAEu+mB,SAAWv+mB,EAAE49mB,aACzB,IAAGn2mB,KAAI,SAAUzH,GACf,OAAOA,EAAE49mB,cAAcp9mB,KACzB,IACIwmnB,EAAmB9jZ,EAAOx9N,QAAO,SAAUA,GAC7C,OAA4C,IAArCqhnB,EAAYr4mB,QAAQhJ,EAAO3K,IACpC,IACIg+C,EAAUr2C,OAAO6C,KAAKk5mB,GAAgBh3mB,KAAI,SAAUzH,GACtD,OAAOy+mB,EAAez+mB,EACxB,IAAG0F,QAAO,SAAU1F,GAClB,OAAOA,EAAEs+mB,SACX,IAAG72mB,KAAI,SAAUzH,GACf,OAAOA,EAAE49mB,cAAcp9mB,KACzB,IACIymnB,EAAiB/jZ,EAAOx9N,QAAO,SAAUskC,GAC3C,OAAO+O,EAAQrqC,QAAQs7B,EAAEjvC,MAAQ,CACnC,IACI4jnB,EAAwBz7Y,EAAOx9N,QAAO,SAAUskC,GAClD,OAAOs1kB,GAAgBt1kB,EACzB,IAAGtkC,QAAO,SAAUskC,GAClB,OAEuB,IAFhBi9kB,EAAex/mB,KAAI,SAAUuiC,GAClC,OAAOA,EAAEjvC,GACX,IAAG2T,QAAQs7B,EAAEjvC,IACf,IACImsnB,EAAsBhkZ,EAAOx9N,QAAO,SAAUskC,GAChD,OAAO+O,EAAQrqC,QAAQs7B,EAAEjvC,MAAQ,GAAKuknB,GAAgBt1kB,EACxD,IACIm9kB,EAAgB,WAClB,IACE,IAAIC,EAAS,SAAgBC,GAC3B,OAAOC,EAASD,EAAU72lB,QAAQC,QAAQpN,GAAM,MAAMpT,MAAK,WAOzD,OANAq4kB,EAAS,CACP3klB,KAAM,WACNia,QAAS,CACPijC,SAAU,OAGPrwB,QAAQC,QAAQpN,GAAM,MAAMpT,MAAK,WACtCq4kB,EAAS,CACP3klB,KAAM,YAEV,GACF,GACF,EACI2jnB,GAAS,EACbh/B,EAAS,CACP3klB,KAAM,YAER,IAAI4jnB,EA1iDV,SAAgB77lB,EAAM87lB,GACrB,IACC,IAAIxlnB,EAAS0pB,GACd,CAAE,MAAM/uB,GACP,OAAO6qnB,EAAQ7qnB,EAChB,CACA,OAAIqF,GAAUA,EAAOiO,KACbjO,EAAOiO,UAAK,EAAQu3mB,GAErBxlnB,CACR,CAgiDmBylnB,EAAO,WAClB,OAAOj3lB,QAAQC,QAAQiwjB,EAAW6+B,GAAeF,EAAeG,IAAmB,SAAU3+jB,GAC3FyniB,EAAS,CACP3klB,KAAM,WACNia,QAAS,CACPijC,SAAUA,IAGhB,KAAI5wC,MAAK,WAAa,GACxB,IAAG,WACDq4kB,EAAS,CACP3klB,KAAM,WAER2jnB,GAAS,CACX,IACA,OAAO92lB,QAAQC,QAAQ82lB,GAAUA,EAAOt3mB,KAAOs3mB,EAAOt3mB,KAAKm3mB,GAAUA,EAAOG,GAC9E,CAAE,MAAO5qnB,GACP,OAAO6zB,QAAQywB,OAAOtkD,EACxB,CACF,EACI+qnB,EAAa/6R,GAAU,CAAC,EAAGg5R,GAAeninB,GAE9C,OADAwiD,QAAQ8c,IAAc,OAAVt/D,QAA4B,IAAVA,GAA+D,QAAlCojnB,EAAgBpjnB,EAAMsmF,cAAsC,IAAlB88hB,OAApD,EAAwFA,EAAc9uR,QAAS4vR,EAAW59hB,OAAOguQ,SAC9J,gBAAoB,KAAe,CACrDt0V,MAAOkknB,GACO,gBAAoBlL,GAAM,KAAmB,gBAAoBl4kB,GAAW,KAAmB,gBAAoB43kB,GAAQ,CACzInshB,MAAO,CAAC,SAAU,QAAS,SAAU,YACrCoshB,YAAaA,EACb30kB,QAAS,SAAiB2C,GACX,WAATA,EACFy0kB,IACkB,UAATz0kB,EACTm+iB,EAAS,CACP3klB,KAAM,UACNia,QAAS,CACPu+lB,YAAa,KAGC,WAAThykB,GACTm+iB,EAAS,CACP3klB,KAAM,UACNia,QAAS,CACPu+lB,YAAa,IAIrB,IACkB,IAAhBA,GAAkC,gBAAoB,MAAO,KAAmB,gBAAoBkB,GAAc,CACpHE,QArHY,SAAiBl9iB,GAC7B,UAAWA,EAAM,CACf8ggB,gBAAgB,EAChBj6c,SAAU,SAAkByggB,GAC1Br/B,EAAS,CACP3klB,KAAM,cACNia,QAAS,CACP+9B,OAAQgskB,IAGd,GAEJ,IA0GiB,gBAAoBjL,GAAQ,CAC3C1/kB,OAAQ,iBACM,gBAAoB,KAAM,KAAM,qCAAmD,gBAAoB4ilB,GAAY,CACjI/B,WAAYA,EACZwB,cAAeA,EAAcvjnB,OAAS,EAAIujnB,EAAgBlkP,EAC1Dj4J,OAAQA,EACRu7Y,eAAgBA,EAChBe,iBAAkBA,EAClBK,SAAUsH,EACV/rP,WAAY,SAAoBlmR,EAAKlqG,GACnCs9kB,EAAS,CACP3klB,KAAM,eACNia,QAAS,CACP5S,MAAOA,EACPkqG,IAAKA,IAGX,KACmB,IAAhBingB,GAAkC,gBAAoBqC,GAAc,CACvEX,WAAYA,EACZlikB,OAAQA,EACRunL,OAAQ8jZ,EACRvI,eAAgBA,EAChBE,sBAAuBA,EACvBD,kBAAmB,SAA2BkJ,GAC5Ct/B,EAAS,CACP3klB,KAAM,0BACNia,QAAS,CACP6gmB,eAAgBmJ,IAGtB,EACAhJ,QAASA,EACTl+B,WAAY,WACV4H,EAAS,CACP3klB,KAAM,sBAEV,IACkB,IAAhBw4mB,GAAkC,gBAAoByD,GAAY,CACpE/B,WAAYA,EACZwB,cAAeA,EACfn8Y,OAAQgkZ,EACRzI,eAAgBA,EAChBe,iBAAkBA,EAClBM,OAAQ,WACNx3B,EAAS,CACP3klB,KAAM,kBAEV,EACAk8mB,SAAUsH,EACV/rP,WAAY,SAAoBlmR,EAAKlqG,GACnCs9kB,EAAS,CACP3klB,KAAM,eACNia,QAAS,CACP5S,MAAOA,EACPkqG,IAAKA,IAGX,IACkB,IAAhBingB,GAAkC,gBAAoB4F,GAAW,CACnE1C,cAAeA,EACf3wlB,QAASA,EACTmyB,SAAUA,EACVmhkB,OAAQA,MAEZ,sCC1rDA,SAASz5R,EAAS/nV,GACd,OAAa,MAATA,GAA2B,KAAVA,EACV,KAEJA,CACX,CACA,SAAS+jQ,EAAO/jQ,EAAOgoV,GAEnB,YADyB,IAArBA,IAA+BA,GAAmB,GACtC,MAAThoV,IAA4B,KAAVA,GAAgBgoV,EAC7C,CACA,SAASzyC,EAAQv1S,GACb,OAAQ+jQ,EAAO/jQ,EACnB,CACA,SAASioV,EAAejoV,GACpB,OAAgB,MAATA,GAAkC,IAAjBA,EAAM1E,MAClC,CACA,SAAS4sV,EAAeloV,GACpB,OAAgB,MAATA,GAA2C,oBAAnBA,EAAMN,SAA0BM,EAAMN,WAAa,IACtF,CAEA,SAASyoV,EAAanoV,GAClB,QAAc9F,IAAV8F,EAAJ,CAIA,GAAc,OAAVA,GAA4B,KAAVA,EAElB,OAAO,KAEX,GAAqB,kBAAVA,EACP,OAAOy8F,MAAMz8F,QAAS9F,EAAY8F,EAEtC,IAAIooV,EAAc90R,SAAStzD,EAAO,IAClC,OAAOy8F,MAAM2rP,QAAeluV,EAAYkuV,CATxC,CAUJ,CAEA,SAASC,EAAcroV,GACnB,QAAc9F,IAAV8F,EAIJ,OAAc,OAAVA,GAA4B,KAAVA,IAID,mBAAVA,EAEAA,EAGJ,QAAUgT,KAAKhT,GAC1B,CA0BA,SAAS6xJ,EAAkBy2L,EAAQC,EAAQC,QACf,IAApBA,IAA8BA,GAAkB,GACpD,IAAIC,EAA0B,MAAVH,EAChBI,EAA0B,MAAVH,EAUpB,GANID,GAAUA,EAAOz0R,WACjBy0R,EAASA,EAAOz0R,YAEhB00R,GAAUA,EAAO10R,WACjB00R,EAASA,EAAO10R,YAEhB40R,GAAiBC,EACjB,OAAO,EAEX,GAAID,EACA,OAAQ,EAEZ,GAAIC,EACA,OAAO,EAEX,SAASC,EAAe/wT,EAAGC,GACvB,OAAQD,EAAIC,EAAI,EAAKD,EAAIC,GAAK,EAAI,CACtC,CACA,GAAsB,kBAAXywT,EACP,OAAOK,EAAeL,EAAQC,GAElC,IAAKC,EACD,OAAOG,EAAeL,EAAQC,GAElC,IAEI,OAAOD,EAAOM,cAAcL,EAChC,CACA,MAAOpsV,GAGH,OAAOwsV,EAAeL,EAAQC,EAClC,CACJ,CACA,SAAS9tU,EAAKkoG,EAAYI,EAAW/iH,GACjC,GAAmB,OAAf2iH,QAAsCzoH,IAAfyoH,EACvB,OAAO,KAEX,IAAK1kH,MAAMiD,QAAQyhH,GAEf,OAAOloG,EADU0sD,EAAOw7C,GACAI,EAAW/iH,GAIvC,IAFA,IAAI6oV,EAAoBlmO,EACpBmmO,EAAoB,KACfntV,EAAI,EAAGA,EAAIktV,EAAkBvtV,OAAQK,IAAK,CAC/C,IAAI8rB,EAAOohU,EAAkBltV,GAC7B,GAAyB,kBAAdonH,GACP,GAAIt7F,EAAKs7F,KAAe/iH,EAAO,CAC3B8oV,EAAoBrhU,EACpB,KACJ,OAIA,GADes7F,EACFt7F,GAAO,CAChBqhU,EAAoBrhU,EACpB,KACJ,CAER,CACA,OAAOqhU,CACX,CACA,SAAS3hR,EAAOtiE,GACZ,GAAIA,aAAkBqF,KAAOrF,aAAkBqM,IAAK,CAChD,IAAI63U,EAAQ,GAEZ,OADAlkV,EAAOxI,SAAQ,SAAU2D,GAAS,OAAO+oV,EAAMttV,KAAKuE,EAAQ,IACrD+oV,CACX,CACA,OAAO7mV,OAAO6C,KAAKF,GAAQoC,KAAI,SAAU1M,GAAO,OAAOsK,EAAOtK,EAAM,GACxE,CAtKA2H,OAAOyD,eAAeknD,EAAS,aAA/B,CAA+C7sD,OAAO,IAwKtD,IAAIgpV,EAA4B9mV,OAAO43E,OAAO,CAC1Cp9D,UAAW,KACXqrU,SAAUA,EACVhkF,OAAQA,EACRwxC,QAASA,EACT0yC,eAAgBA,EAChBC,eAAgBA,EAChBC,aAAcA,EACdE,cAAeA,EACfY,aA/GJ,SAAsBjpV,GAClB,GAAa,MAATA,GAA2B,KAAVA,EAGrB,OAAOA,CACX,EA2GIkpV,iBAzGJ,SAA0B9jU,EAAMC,GAC5B,OAAY,MAARD,GAAyB,MAATC,IAGR,MAARD,GAAyB,MAATC,MAGR,MAARD,GAAyB,MAATC,IAGbD,IAASC,EACpB,EA+FI8jU,WA9FJ,SAAoBC,EAAMC,GAGtB,OAFeD,EAAOrrU,KAAKE,UAAUmrU,GAAQ,SAC9BC,EAAOtrU,KAAKE,UAAUorU,GAAQ,KAEjD,EA2FIx3L,kBAAmBA,EACnBp3I,KAAMA,EACN0sD,OAAQA,IASRmiR,EAAkC,WAClC,SAASA,IACLtvV,KAAKuvV,aAAe,CAAC,CACzB,CAkCA,OAjCAD,EAAiB3uV,UAAU6uV,gBAAkB,SAAUzkV,GACnD,IAAK,IAAIpJ,EAAI,EAAGA,EAAIoJ,EAAKzJ,OAAQK,IAC7B3B,KAAKuvV,aAAaxkV,EAAKpJ,KAAM,CAErC,EACA2tV,EAAiB3uV,UAAU8uV,aAAe,SAAUC,EAAOC,GAEvDD,EAAQxB,EAAewB,GAEvB,IADA,IAAIv5R,EAAQ,IACC,CACT,IAAIy5R,OAAU,EAgBd,GAfIF,GACAE,EAAUF,EACI,IAAVv5R,IACAy5R,GAAW,IAAMz5R,IAGhBw5R,GACLC,EAAUD,EACI,IAAVx5R,IACAy5R,GAAW,IAAMz5R,IAIrBy5R,EAAU,GAAKz5R,GAEdn2D,KAAKuvV,aAAaK,GAEnB,OADA5vV,KAAKuvV,aAAaK,IAAW,EACtBA,EAEXz5R,GACJ,CACJ,EACOm5R,CACX,CAtCqC,GA8CrC,SAASO,IAEL,IADA,IAAI1iR,EAAS,GACJ9lE,EAAK,EAAGA,EAAKqC,UAAUpI,OAAQ+F,IACpC8lE,EAAO9lE,GAAMqC,UAAUrC,GAE3B,IAAK,IAAI1F,EAAI,EAAGA,EAAIwrE,EAAO7rE,OAAQK,IAAK,CACpC,IAAIqE,EAAQmnE,EAAOxrE,GACnB,GAAIooQ,EAAO/jQ,GACP,OAAOA,CAEf,CACA,OAAO,IACX,CAQA,SAAS8pV,EAAK9jV,GACV,GAAKA,GAAQA,EAAI1K,OAGjB,OAAO0K,EAAIA,EAAI1K,OAAS,EAC5B,CACA,SAASyuV,EAASnyT,EAAGC,EAAG25H,GACpB,OAAS,MAAL55H,GAAkB,MAALC,GAGL,MAALD,GACE,MAALC,GACAD,EAAEt8B,SAAWu8B,EAAEv8B,QACfm9B,EAAMb,GAAG,SAAU53B,EAAOwK,GAAS,OAAOgnJ,EAAaA,EAAWxxJ,EAAO63B,EAAErtB,IAAUqtB,EAAErtB,KAAWxK,CAAO,GACjH,CASA,SAASgqV,EAAgBjiR,GACrB,OAAOA,EAAMh7C,MAAK,SAAU6K,EAAGC,GAAK,OAAOD,EAAIC,CAAG,GACtD,CAaA,SAASoyT,EAAgBliR,EAAOljE,GAC5B,IAAI2F,EAAQu9D,EAAM75D,QAAQrJ,GACtB2F,GAAS,GACTu9D,EAAM18D,OAAOb,EAAO,EAE5B,CACA,SAAS0/U,EAAmBniR,EAAOoiR,GAC/B9tV,EAAQ8tV,GAAU,SAAU1iU,GAAQ,OAAOwiU,EAAgBliR,EAAOtgD,EAAO,GAC7E,CACA,SAAS2iU,EAAgBriR,EAAOljE,EAAQwlV,GACpCtiR,EAAM18D,OAAOg/U,EAAS,EAAGxlV,EAC7B,CAWA,SAASylV,EAAYviR,EAAOwiR,EAAeF,GAEvCH,EAAmBniR,EAAOwiR,GAG1BluV,EAAQkuV,EAAct/U,QAAQkrF,WAAW,SAAUn1F,GAAO,OAAOopV,EAAgBriR,EAAO/mE,EAAKqpV,EAAU,GAC3G,CACA,SAAS/iV,EAASygE,EAAO/nE,GACrB,OAAO+nE,EAAM75D,QAAQlO,IAAU,CACnC,CAIA,SAAS6vQ,EAAQtqQ,EAAQC,GACP,MAAVA,GAA4B,MAAVD,GAGtBlJ,EAAQmJ,GAAQ,SAAUxF,GAAS,OAAOuF,EAAO9J,KAAKuE,EAAQ,GAClE,CAIA,SAASgnF,EAAU27B,EAAYI,GAC3B,IAAK,IAAIpnH,EAAI,EAAGA,EAAIgnH,EAAWrnH,OAAQK,IACnC,GAAIonH,EAAUJ,EAAWhnH,GAAIA,EAAGgnH,GAC5B,OAAOhnH,EAGf,OAAQ,CACZ,CAeA,SAAS88B,EAAMrN,EAAM23F,GACjB,GAAY,MAAR33F,EACA,OAAO,EAEX,IAAK,IAAIzvB,EAAI,EAAGA,EAAIyvB,EAAK9vB,OAAQK,IAC7B,IAAKonH,EAAU33F,EAAKzvB,GAAIA,GACpB,OAAO,EAGf,OAAO,CACX,CAMA,SAAS8xB,EAAKrC,EAAM23F,GAChB,GAAY,MAAR33F,EACA,OAAO,EAEX,IAAK,IAAIzvB,EAAI,EAAGA,EAAIyvB,EAAK9vB,OAAQK,IAC7B,GAAIonH,EAAU33F,EAAKzvB,GAAIA,GACnB,OAAO,EAGf,OAAO,CACX,CAMA,SAASU,EAAQ+uB,EAAMxM,GACnB,GAAY,MAARwM,EAGJ,IAAK,IAAIzvB,EAAI,EAAGA,EAAIyvB,EAAK9vB,OAAQK,IAC7BijB,EAAOwM,EAAKzvB,GAAIA,EAExB,CAeA,SAASsL,EAAImkB,EAAM4zC,GACf,GAAY,MAAR5zC,EACA,OAAO,KAGX,IADA,IAAI45H,EAAS,GACJrpJ,EAAI,EAAGA,EAAIyvB,EAAK9vB,OAAQK,IAC7BqpJ,EAAOvpJ,KAAKujE,EAAQ5zC,EAAKzvB,GAAIA,IAEjC,OAAOqpJ,CACX,CAMA,SAAS9/I,EAAOkmB,EAAM23F,GAClB,GAAY,MAAR33F,EACA,OAAO,KAGX,IADA,IAAIo/T,EAAW,GACN7uV,EAAI,EAAGA,EAAIyvB,EAAK9vB,OAAQK,IACzBonH,EAAU33F,EAAKzvB,GAAIA,IACnB6uV,EAAS/uV,KAAK2vB,EAAKzvB,IAG3B,OAAO6uV,CACX,CA0BA,IAAIC,EAA0BvoV,OAAO43E,OAAO,CACxCp9D,UAAW,KACXmtU,mBAAoBA,EACpBa,UA3NJ,SAAmBvjR,GACf,OAAOA,GAAwC,MAA9B0iR,EAAmB1iR,EACxC,EA0NIwjR,kBAzNJ,SAA2B3qV,GACvB,OAAgB,MAATA,GAAiBA,EAAM1E,OAAS,CAC3C,EAwNIwuV,KAAMA,EACNC,SAAUA,EACVa,cAzMJ,SAAuBC,EAAQr6H,GAC3B,OAAOu5H,EAASc,EAAQr6H,EAC5B,EAwMIs6H,eAtMJ,SAAwBC,EAAMr4U,GAC1B,OAAOq3U,EAASgB,EAAMr4U,EAC1B,EAqMIs3U,gBAAiBA,EACjBgB,uBAlMJ,SAAgCjjR,EAAOljE,GACnC,GAAKkjE,EAGL,IAAK,IAAIv9D,EAAQu9D,EAAMzsE,OAAS,EAAGkP,GAAS,EAAGA,IAAS,CACpD,IAAIygV,EAAiBljR,EAAMv9D,KAAW3F,EAClCqmV,EAAiBnjR,EAAMv9D,EAAQ,KAAO3F,EACtComV,GAAkBC,GAClBnjR,EAAM18D,OAAOb,EAAQ,EAAG,EAEhC,CACJ,EAwLIy/U,gBAAiBA,EACjBC,mBAAoBA,EACpBE,gBAAiBA,EACjBe,qBA9KJ,SAA8BC,EAAMh5Q,EAAKi4Q,GACrC,GAAY,MAARe,GAAuB,MAAPh5Q,EAIpB,IAAK,IAAIz2E,EAAIy2E,EAAI92E,OAAS,EAAGK,GAAK,EAAGA,IAAK,CAEtCyuV,EAAgBgB,EADLh5Q,EAAIz2E,GACa0uV,EAChC,CACJ,EAsKIC,YAAaA,EACbhjV,SAAUA,EACVi8G,QA7JJ,SAAiB8nO,GACb,MAAO,GAAGllV,OAAOvC,MAAM,GAAIynV,EAC/B,EA4JIx7E,QAASA,EACTriJ,UAtJJ,SAAmBzlD,GACf,OAAO9gE,EAAI8gE,EAAOmgR,EACtB,EAqJIlhQ,UAAWA,EACXp6C,KA7IJ,SAAc+1E,EAAY3iH,EAAOqsB,EAAOC,QACtB,IAAVtsB,IAAoBA,EAAQ,WAClB,IAAVqsB,IAAoBA,EAAQ,QACpB,IAARC,IAAkBA,EAAMq2F,EAAWrnH,QACvC,IAAK,IAAIK,EAAI0wB,EAAO1wB,EAAI2wB,EAAK3wB,IACzBgnH,EAAWhnH,GAAKqE,EAEpB,OAAO2iH,CACX,EAsIIlqF,MAAOA,EACPhL,KAAMA,EACNpxB,QAASA,EACTivV,eA3FJ,SAAwBlgU,EAAMxM,GAC1B,GAAY,MAARwM,EAGJ,IAAK,IAAIzvB,EAAIyvB,EAAK9vB,OAAS,EAAGK,GAAK,EAAGA,IAClCijB,EAAOwM,EAAKzvB,GAAIA,EAExB,EAqFIsL,IAAKA,EACL/B,OAAQA,EACRmB,OA/CJ,SAAgB+kB,EAAMue,EAAM5uB,GACxB,GAAY,MAARqQ,GAA2B,MAAXrQ,EAChB,OAAO,KAGX,IADA,IAAIvZ,EAASuZ,EACJpf,EAAI,EAAGA,EAAIyvB,EAAK9vB,OAAQK,IAC7B6F,EAASmoC,EAAKnoC,EAAQ4pB,EAAKzvB,GAAIA,GAEnC,OAAO6F,CACX,EAuCI+pV,qBArCJ,SAA8BngU,EAAM3P,GAC3B2P,GAGWA,EAAKngB,MAAM,GACjB5O,QAAQof,EACtB,IAwCA,SAAS+vU,EAAc3mV,EAAQ4W,GACb,MAAV5W,IAGA5G,MAAMiD,QAAQ2D,GACdxI,EAAQwI,GAAQ,SAAU7E,EAAOwK,GAAS,OAAOiR,EAAS,GAAKjR,EAAOxK,EAAQ,IAG9E3D,EAAQ6F,OAAO6C,KAAKF,IAAS,SAAUtK,GAAO,OAAOkhB,EAASlhB,EAAKsK,EAAOtK,GAAO,IAEzF,CACA,SAASkxV,EAAY5mV,GAGjB,IAFA,IAAIuxI,EAAO,CAAC,EACRrxI,EAAO7C,OAAO6C,KAAKF,GACdlJ,EAAI,EAAGA,EAAIoJ,EAAKzJ,OAAQK,IAAK,CAClC,IAAIpB,EAAMwK,EAAKpJ,GACXqE,EAAQ6E,EAAOtK,GACnB67I,EAAK77I,GAAOyF,CAChB,CACA,OAAOo2I,CACX,CAQA,SAASs1M,EAAoB7mV,EAAQ8mV,GACjC,GAAK9mV,EAAL,CAGA,IAAI7D,EAAM6D,EACNu9D,EAAM,CAAC,EAkBX,OAjBAlgE,OAAO6C,KAAK/D,GAAK3E,SAAQ,SAAU9B,GAC/B,KAAIoxV,GAAcA,EAAWz9U,QAAQ3T,IAAQ,GAA7C,CAGA,IAAIyF,EAAQgB,EAAIzG,GAKZqxV,EAAuBC,EAAgB7rV,IAAUA,EAAMkP,cAAgBhN,OAEvEkgE,EAAI7nE,GADJqxV,EACWF,EAAoB1rV,GAGpBA,CAXf,CAaJ,IACOoiE,CApBP,CAqBJ,CACA,SAAS0pR,EAAYjnV,EAAQtK,GACzB,OAAOsK,EAAOtK,EAClB,CACA,SAAS41G,EAAYtrG,EAAQtK,EAAKyF,GAC9B6E,EAAOtK,GAAOyF,CAClB,CAgBA,SAAS+rV,EAAsBvmV,EAAQD,EAAQzF,EAAU8lB,GACrD,IAAI5lB,EAAQ8rV,EAAYtmV,EAAQ1F,QAClB5F,IAAV8F,GACAmwG,EAAY5qG,EAAQzF,EAAU8lB,EAAYA,EAAU5lB,GAASA,EAErE,CACA,SAASgsV,EAAoBC,GACzB,IAAIC,EAAY,CAAC,EAIjB,OAHAD,EAAQ/mV,QAAO,SAAUlE,GAAO,OAAc,MAAPA,CAAa,IAAG3E,SAAQ,SAAU2E,GACrE3E,EAAQ6F,OAAO6C,KAAK/D,IAAM,SAAUzG,GAAO,OAAO2xV,EAAU3xV,GAAO,IAAM,GAC7E,IACO2H,OAAO6C,KAAKmnV,EACvB,CACA,SAASiB,EAAqBnsV,GAC1B,IAAKA,EACD,MAAO,GAEX,IAAIqmnB,EAAYnlnB,OAChB,GAAgC,oBAArBmlnB,EAAUlgjB,OACjB,OAAOkgjB,EAAUlgjB,OAAOnmE,GAE5B,IAAIokI,EAAM,GACV,IAAK,IAAI7qI,KAAOyG,EACRA,EAAImB,eAAe5H,IAAQyG,EAAIyQ,qBAAqBlX,IACpD6qI,EAAI3pI,KAAKuF,EAAIzG,IAGrB,OAAO6qI,CACX,CACA,SAAS+mN,EAAUf,EAAM5lV,EAAQ4mV,EAAeC,QACtB,IAAlBD,IAA4BA,GAAgB,QAChB,IAA5BC,IAAsCA,GAA0B,GAC/DtoF,EAAOv+P,IAGZgmV,EAAchmV,GAAQ,SAAUjL,EAAK+xV,GACjC,IAAIC,EAAYnB,EAAK7wV,GACrB,GAAIgyV,IAAcD,EAAlB,CAOA,GAAID,EAEA,GADyC,MAAbE,GAAoC,MAAfD,EAIK,kBAAhBA,GAA4BA,EAAYp9U,cAAgBhN,SAGtFqqV,EAAY,CAAC,EACbnB,EAAK7wV,GAAOgyV,GAIpBV,EAAgBS,IAAgBT,EAAgBU,KAAetuV,MAAMiD,QAAQqrV,GAC7EJ,EAAUI,EAAWD,EAAaF,EAAeC,IAE5CD,QAAiClyV,IAAhBoyV,KACtBlB,EAAK7wV,GAAO+xV,EAtBhB,CAwBJ,GACJ,CACA,SAAS9kV,EAAO3C,GAEZ,IADA,IAAI2nV,EAAU,GACLnrV,EAAK,EAAGA,EAAKqC,UAAUpI,OAAQ+F,IACpCmrV,EAAQnrV,EAAK,GAAKqC,UAAUrC,GAGhC,OADAhF,EAAQmwV,GAAS,SAAUhnV,GAAU,OAAOgmV,EAAchmV,GAAQ,SAAUjL,EAAKyF,GAAS,OAAO6E,EAAOtK,GAAOyF,CAAO,GAAI,IACnH6E,CACX,CA0CA,SAAS8nV,EAAmB19T,EAAM0zM,EAAOiqH,GACrC,GAAKjqH,GAAU1zM,EAAf,CAIA,IAAK29T,EACD,OAAO39T,EAAK0zM,GAKhB,IAFA,IAAID,EAASC,EAAMnlO,MAAM,KACrBqvV,EAAgB59T,EACXtzB,EAAI,EAAGA,EAAI+mO,EAAOpnO,OAAQK,IAAK,CACpC,GAAqB,MAAjBkxV,EACA,OAEJA,EAAgBA,EAAcnqH,EAAO/mO,GACzC,CACA,OAAOkxV,CAdP,CAeJ,CAGA,SAASC,EAAoB9rV,EAAK+rV,GAC9B7qV,OAAO6C,KAAK/D,GAAK3E,SAAQ,SAAU9B,GAIV,kBAHTyG,EAAIzG,KAIZyG,EAAIzG,QAAOL,EAEnB,IACA,IAAIq7G,EAAQrzG,OAAOua,eAAezb,GAC9B4F,EAAa,CAAC,EAClB1E,OAAO6C,KAAKwwG,GAAOl5G,SAAQ,SAAU9B,GAGjC,GAAqB,oBAFTg7G,EAAMh7G,GAEe,CAI7BqM,EAAWrM,GAAO,CAAEyF,MAHT,WACPwlD,QAAQC,KAAK,YAAcsnS,EAAa,aAAexyV,EAAM,2UACjE,EACiCqZ,UAAU,EAC/C,CACJ,IACA1R,OAAOwD,iBAAiB1E,EAAK4F,EACjC,CACA,SAASilV,EAAgB7rV,GACrB,MAAwB,kBAAVA,GAAgC,OAAVA,CACxC,CAEA,IAAIgtV,EAA2B9qV,OAAO43E,OAAO,CACzCp9D,UAAW,KACX8uU,cAAeA,EACfC,YAAaA,EACbwB,gBA3NJ,SAAyBpoV,GACrB,OAAOkZ,KAAKC,MAAMD,KAAKE,UAAUpZ,GACrC,EA0NI6mV,oBAAqBA,EACrBI,YAAaA,EACb37O,YAAaA,EACb+8O,wBArLJ,SAAiC1nV,EAAQD,GAErC,IADA,IAAIqB,EAAa,GACRvF,EAAK,EAAGA,EAAKqC,UAAUpI,OAAQ+F,IACpCuF,EAAWvF,EAAK,GAAKqC,UAAUrC,GAEnChF,EAAQuK,GAAY,SAAUqW,GAAK,OAAO8uU,EAAsBvmV,EAAQD,EAAQ0X,EAAI,GACxF,EAgLI8uU,sBAAuBA,EACvBC,oBAAqBA,EACrBmB,qBAAsBA,EACtBhB,UAAWA,EACX3kV,OAAQA,EACR4lV,qBAvGJ,SAA8BptV,GAC1B,OAAOu1S,EAAQv1S,IAAwC,IAA9BkC,OAAO6C,KAAK/E,GAAO1E,MAChD,EAsGIuhB,IArGJ,SAAarX,EAAQinV,EAAYr6S,GAC7B,GAAc,MAAV5sC,EACA,OAAO4sC,EAIX,IAFA,IAAIrtC,EAAO0nV,EAAWjvV,MAAM,KACxBkvV,EAAelnV,EACZT,EAAKzJ,OAAS,GAEjB,GAAoB,OADpBoxV,EAAeA,EAAa3nV,EAAKiuG,UAE7B,OAAO5gE,EAGf,IAAIpyC,EAAQ0sV,EAAa3nV,EAAK,IAC9B,OAAgB,MAAT/E,EAAgBA,EAAQoyC,CACnC,EAwFIhhC,IAvFJ,SAAa7L,EAAQknV,EAAYzsV,GAC7B,GAAc,MAAVuF,EAAJ,CAKA,IAFA,IAAIR,EAAO0nV,EAAWjvV,MAAM,KACxB6vV,EAAiB9nV,EACdR,EAAKzJ,OAAS,GAEjB,GAAsB,OADtB+xV,EAAiBA,EAAetoV,EAAKiuG,UAEjC,OAGRq6O,EAAetoV,EAAK,IAAM/E,CAT1B,CAUJ,EA2EIstV,WA1EJ,SAASA,EAAWzoV,GAOhB,OANA3C,OAAO43E,OAAOj1E,GACdxI,EAAQ8qE,EAAOtiE,IAAS,SAAUq2B,IAC1B2wT,EAAgB3wT,IAAmB,oBAANA,IAC7BoyT,EAAWpyT,EAEnB,IACOr2B,CACX,EAmEI8nV,mBAAoBA,EACpBG,oBAAqBA,EACrBjB,gBAAiBA,IASjB0B,EAA0B,mCAC1BC,EAA0B,aAC1BC,EAAc,CAAC,EAMnB,SAASC,EAAOlrV,EAAMjI,GACdkzV,EAAYlzV,KAGhBiI,IACAirV,EAAYlzV,IAAO,EACvB,CACA,SAASozV,EAAgBC,GAErB,GAAIA,EAAgBjvV,KAChB,OAAOivV,EAAgBjvV,KAG3B,IAAIkhB,EAAU,sBAAsB5d,KAAK2rV,EAAgBluV,YACzD,OAAOmgB,GAA8B,IAAnBA,EAAQvkB,OAAeukB,EAAQ,GAAGmxB,OAAS,IACjE,CAMA,SAASP,EAAW/1B,GAChB,SAAUA,GAAOA,EAAIxL,aAAewL,EAAIxc,MAAQwc,EAAI9W,MACxD,CACA,SAASiqV,EAAgBC,GACrBC,GAAaD,EAAO,IACxB,CACA,IAAIw5R,EAAyB,GACzBC,IAA2B,EAC/B,SAASv5R,GAAkBxrV,GACvB8knB,EAAuB7rnB,KAAK+G,GACxB+knB,KAGJA,IAA2B,EAC3B7nmB,OAAO+C,YAAW,WACd,IAAI+kmB,EAAYF,EAAuBr8mB,QACvCq8mB,EAAuBhsnB,OAAS,EAChCisnB,IAA2B,EAC3BC,EAAUnrnB,SAAQ,SAAUmG,GAAQ,OAAOA,GAAQ,GACvD,GAAG,GACP,CACA,SAASurV,GAAaD,EAAOG,QACJ,IAAjBA,IAA2BA,EAAe,GAC1CH,EAAMxyV,OAAS,GACfokB,OAAO+C,YAAW,WAAc,OAAOqrU,EAAMzxV,SAAQ,SAAUmG,GAAQ,OAAOA,GAAQ,GAAI,GAAGyrV,EAErG,CAQA,SAASC,GAAS1rV,EAAMqrQ,EAAMz3K,GAK1B,IAAI5zE,EAEJ,YANkB,IAAd4zE,IAAwBA,GAAY,GAMjC,WAEH,IADA,IAAIz0F,EAAO,GACFN,EAAK,EAAGA,EAAKqC,UAAUpI,OAAQ+F,IACpCM,EAAKN,GAAMqC,UAAUrC,GAGzB,IAAItE,EAAU/C,KAGVm0V,EAAU/3P,IAAc5zE,EAK5B9C,OAAO6C,aAAaC,GAEpBA,EAAU9C,OAAO+C,YAAW,WAGxBD,EAAU,KAEL4zE,GAID5zF,EAAKoB,MAAM7G,EAAS4E,EAE5B,GAAGksQ,GAECsgF,GACA3rV,EAAKoB,MAAM7G,EAAS4E,EAE5B,CACJ,CACA,SAAS8lnB,GAAUnkiB,EAAW7nE,EAAU+G,EAASgiC,QAC7B,IAAZhiC,IAAsBA,EAAU,KACpC,IAAIklmB,GAAY,IAAIrkmB,MAAOsvD,UACvB2yQ,EAAW,KACXqiS,GAAW,EACXC,EAAmB,WACnB,IAAIC,GAAmB,IAAIxkmB,MAAOsvD,UAAa+0iB,EAAallmB,GACxD8gE,KAAeukiB,KACfpsmB,IACAksmB,GAAW,EACK,MAAZriS,IACA5lU,OAAO6iD,cAAc+iR,GACrBA,EAAW,MAEXuiS,GAAkBrjkB,GAClBgB,QAAQC,KAAKjB,GAGzB,EACAojkB,IACKD,IACDriS,EAAW5lU,OAAOyiD,YAAYyljB,EAAkB,IAExD,CAQA,SAASx5R,GAAc5rV,GACfA,GACAA,GAER,CAEA,IAAI6rV,GAA6BnsV,OAAO43E,OAAO,CAC3Cp9D,UAAW,KACXgxU,OAAQA,EACRC,gBAAiBA,EACjBW,sBAxHJ,SAA+B9rV,GAC3B,IAAI+rV,EAAQ/rV,EAAK9C,WAAWS,QAAQotV,EAAyB,IAC7D,OAAOgB,EAAMtjV,MAAMsjV,EAAMrgV,QAAQ,KAAO,EAAGqgV,EAAMrgV,QAAQ,MAAM5N,MAAMktV,IAA4B,EACrG,EAsHI/8S,WAAYA,EACZo9S,gBAAiBA,EACjBG,kBAAmBA,GACnBD,aAAcA,GACdG,SAAUA,GACVu5R,UAAWA,GACXj5R,QAxBJ,WAEI,IADA,IAAIzxS,EAAM,GACD17C,EAAK,EAAGA,EAAKqC,UAAUpI,OAAQ+F,IACpC07C,EAAI17C,GAAMqC,UAAUrC,GAExB,OAAO,SAAU+C,GAAO,OAAO24C,EAAI12C,QAAO,SAAUooV,EAAUjlT,GAAK,OAAOA,EAAEilT,EAAW,GAAGrqV,EAAM,CACpG,EAmBIgqV,cAAeA,KASfM,GAAyB,WACzB,SAASA,EAAQ74S,EAAQq8E,GAGrB,GAFAl4H,KAAK20V,aAAe,CAAC,EACrB30V,KAAK40V,WAAY,EACZ/4S,GAAWA,EAAOg5S,YAAvB,CAGA70V,KAAK80V,cAAgBj5S,EACrB77C,KAAKk4H,OAASA,EACdl4H,KAAKk4H,OAAO5vD,IAAI,sCAChBtoE,KAAK+0V,cACL,IAAIC,EAAgBh1V,KAAKi1V,mBACzBj1V,KAAKk1V,UAAUF,GACfh1V,KAAKk4H,OAAO5vD,IAAI,uDAPhB,CAQJ,CAmMA,OAlMAosR,EAAQ/zV,UAAUs0V,iBAAmB,WACjC,OAAO9nR,EAAOntE,KAAK20V,cAAc1nV,KAAI,SAAUkoV,GAAa,OAAOA,EAAUC,YAAc,GAC/F,EACAV,EAAQ/zV,UAAU00V,WAAa,SAAUC,EAAMC,GAC3C,IAAKD,EACD,MAAMx+U,MAAM,uCAGhB,OADA9W,KAAKk1V,UAAU,CAACI,GAAOC,GAChBD,CACX,EACAZ,EAAQ/zV,UAAUu0V,UAAY,SAAUF,EAAeO,GACnDv1V,KAAKw1V,cAAcR,GACnBh1V,KAAKy1V,gBAAgBT,GACrBh1V,KAAK01V,qBAAqBV,EAAe,uBAGrCjrF,EAAOwrF,IACPP,EAAc3yV,QAAQkzV,GAE1Bv1V,KAAK01V,qBAAqBV,EAAe,uBAC7C,EACAN,EAAQ/zV,UAAUo0V,YAAc,WAC5B,IAAI9+U,EAAQjW,KAEZA,KAAK80V,cAAcD,YAAYxyV,QAAQrC,KAAK21V,kBAAkB3iT,KAAKhzC,OAGnEwxV,EAAcxxV,KAAK20V,cAAc,SAAUp0V,EAAK40V,GAC5C,IAAIS,EACAT,EAAUG,KAAKO,kBAAoBV,EAAUG,KAAKO,iBAAiBC,iBAAmBX,EAAUG,KAAKO,iBAAiBC,gBAAgBC,gBACtIH,EAAwBT,EAAUG,KAAKO,iBAAiBC,gBAAgBC,eAE5E,IAsKgB7gV,EACpBvN,EAvKQquV,EAAoB//U,EAAMggV,sBAAsBL,EAAuBT,EAAUG,KAAK3wV,MACtFuxV,GAqKYhhV,EArKqBigV,EAAUG,KAsKnD3tV,EAAO,CAAC,MAAMwE,OAtK2C6pV,GAwKtD,IADe9gV,EAAY89B,KAAKppC,MAAMsL,EAAavN,KAtKlDwtV,EAAUC,aAAec,CAC7B,IACA,IAAIC,EAAmBjuV,OAAO6C,KAAK/K,KAAK20V,cAAczoV,KAAK,MAC3DlM,KAAKk4H,OAAO5vD,IAAI,kBAAoB6tR,EACxC,EAEAzB,EAAQ/zV,UAAUg1V,kBAAoB,SAAUS,GAC5C,IAAIC,EAAWD,EAAUP,iBACzB,IAAKQ,EAAU,CACX,IAAIC,OAAW,EAQf,OANIA,EADAF,EAAUz1V,UAAUuU,YACTy+U,EAAgByC,EAAUz1V,UAAUuU,aAGpC,GAAKkhV,OAEpB5qS,QAAQ3R,MAAM,gBAAkBy8S,EAAW,iBAE/C,CACA,IAAInB,EAAY,CACZG,KAAMc,EACNhB,aAAc,KACdkB,SAAUD,EAASC,UAEvBt2V,KAAK20V,aAAa0B,EAASC,UAAYnB,CAC3C,EACAT,EAAQ/zV,UAAU60V,cAAgB,SAAUR,GACxC,IAAI/+U,EAAQjW,KACZg1V,EAAc3yV,SAAQ,SAAU+yV,GAC5Bn/U,EAAMsgV,2BAA2BnB,GAAc,SAAUiB,EAAUC,GAC/D,IAAIjxU,EAAagxU,EAASG,kBACrBnxU,GAGLA,EAAWhjB,SAAQ,SAAUogC,GACzB,IAAIg0T,EAAYxgV,EAAMygV,mBAAmBJ,EAAU7zT,EAAU6zT,SAAU7zT,EAAUk0T,UACjFvB,EAAa3yT,EAAUm0T,eAAiBH,CAC5C,GACJ,GACJ,GACJ,EACA/B,EAAQ/zV,UAAU80V,gBAAkB,SAAUT,GAC1C,IAAI/+U,EAAQjW,KACZg1V,EAAc3yV,SAAQ,SAAU+yV,GAC5Bn/U,EAAMsgV,2BAA2BnB,GAAc,SAAUiB,EAAUC,GAC/D9E,EAAc6E,EAASP,iBAAiB,SAAUtzS,EAAYq0S,GAE1D,GAAmB,kBAAfr0S,EAAJ,CAGA,IAAIs0S,EAAa7gV,EAAMggV,sBAAsBY,EAAYP,GACzDlB,EAAa5yS,GAAY54C,MAAMwrV,EAAc0B,EAF7C,CAGJ,GACJ,GACJ,GACJ,EACApC,EAAQ/zV,UAAU41V,2BAA6B,SAAUnB,EAAc3zU,GAEnE,IADA,IAAI9gB,EAAYuH,OAAOua,eAAe2yU,GAClB,MAAbz0V,GAAmB,CACtB,IAAIuU,EAAcvU,EAAUuU,YAC5B,GAAIA,EAAY/M,eAAe,oBAG3BsZ,EAFevM,EAAY2gV,iBACZ71V,KAAK+2V,YAAY7hV,IAGpCvU,EAAYuH,OAAOua,eAAe9hB,EACtC,CACJ,EACA+zV,EAAQ/zV,UAAUo2V,YAAc,SAAU7hV,GACtC,GAAIA,EAAY2gV,kBAAoB3gV,EAAY2gV,iBAAiBS,SAC7D,OAAOphV,EAAY2gV,iBAAiBS,SAExC,IAAIU,EAAoB9hV,EAAYxP,WAEpC,OADesxV,EAAkBxmT,UAAU,EAAGwmT,EAAkB9iV,QAAQ,KAE5E,EACAwgV,EAAQ/zV,UAAUs1V,sBAAwB,SAAUgB,EAAYX,GAC5D,IAAIrgV,EAAQjW,KACRk3V,EAAY,GAOhB,OANID,GACAzF,EAAcyF,GAAY,SAAUE,EAAYC,GAC5C,IAAIX,EAAYxgV,EAAMygV,mBAAmBJ,EAAUc,GACnDF,EAAUjuU,OAAOkuU,IAAeV,CACpC,IAEGS,CACX,EACAxC,EAAQ/zV,UAAU+1V,mBAAqB,SAAUW,EAAYf,EAAUK,GAEnE,QADiB,IAAbA,IAAuBA,GAAW,GACrB,YAAbL,EACA,OAAOt2V,KAEX,GAAIA,KAAK80V,cAAcwC,uBAAyBt3V,KAAK80V,cAAcwC,sBAAsBnvV,eAAemuV,GACpG,OAAOt2V,KAAK80V,cAAcwC,sBAAsBhB,GAEpD,IAAInB,EAAYn1V,KAAK20V,aAAa2B,GAClC,OAAInB,EACOA,EAAUC,cAEhBuB,GACDnrS,QAAQ3R,MAAM,0CAA4Cy8S,EAAW,uBAAyBe,GAE3F,KACX,EACA3C,EAAQ/zV,UAAU+0V,qBAAuB,SAAUV,EAAeuC,GAC9D,IAAIthV,EAAQjW,KACZg1V,EAAc3yV,SAAQ,SAAU+yV,GAAgB,OAAOn/U,EAAMuhV,2BAA2BpC,EAAcmC,EAAkB,GAC5H,EACA7C,EAAQ/zV,UAAU62V,2BAA6B,SAAUpC,EAAcmC,EAAiBE,GAEpF,IAAIC,EAAa,CAAC,EAElB13V,KAAKu2V,2BAA2BnB,GAAc,SAAUiB,GACpD,IAAIsB,EAAUtB,EAASkB,GACnBI,GACAA,EAAQt1V,SAAQ,SAAUmgD,GAClBA,GAAci1S,IACdC,EAAWl1S,IAAc,EAEjC,GAER,IACqBt6C,OAAO6C,KAAK2sV,GAClBr1V,SAAQ,SAAUmgD,GAAc,OAAO4yS,EAAa5yS,IAAe,GACtF,EACAkyS,EAAQ/zV,UAAUi3V,QAAU,SAAUjzV,GAClC,OAAO3E,KAAK02V,mBAAmB,UAAW/xV,GAAM,EACpD,EACA+vV,EAAQ/zV,UAAUu1B,QAAU,WACxB,IAAIl2B,KAAK40V,UAAT,CAGA50V,KAAKk4H,OAAO5vD,IAAI,2CAChB,IAAI0sR,EAAgBh1V,KAAKi1V,mBACzBj1V,KAAK63V,aAAa7C,GAClBh1V,KAAK80V,cAAcwC,sBAAwB,KAC3Ct3V,KAAK40V,WAAY,EACjB50V,KAAKk4H,OAAO5vD,IAAI,0DANhB,CAOJ,EACAosR,EAAQ/zV,UAAUm3V,YAAc,SAAUxC,GACjCA,GAGLt1V,KAAK63V,aAAa,CAACvC,GACvB,EACAZ,EAAQ/zV,UAAUk3V,aAAe,SAAUE,GACvC,IAAI9hV,EAAQjW,KACZ,OAAK+3V,GAGLA,EAAM11V,SAAQ,SAAUizV,GACpBr/U,EAAMuhV,2BAA2BlC,EAAM,oBAAqB,WAE5D,IAAI0C,EAAU1C,EACiB,oBAApB0C,EAAQ9hU,SACf8hU,EAAQ9hU,SAEhB,IACO,IAVI,EAWf,EACOw+T,CACX,CAlN4B,GA0N5B,SAASuD,GAAa1sV,EAAQi3C,EAAYxgC,GACtC,IAAItZ,EAAQwvV,GAAiB3sV,EAAO2J,aAC/BxM,EAAMyvV,sBACPzvV,EAAMyvV,oBAAsB,IAEhCzvV,EAAMyvV,oBAAoB12V,KAAK+gD,EACnC,CACA,SAAS41S,GAAc7sV,EAAQi3C,EAAYxgC,GACvC,IAAItZ,EAAQwvV,GAAiB3sV,EAAO2J,aAC/BxM,EAAM2vV,uBACP3vV,EAAM2vV,qBAAuB,IAEjC3vV,EAAM2vV,qBAAqB52V,KAAK+gD,EACpC,CACA,SAAS81S,GAAW/sV,EAAQi3C,EAAYxgC,GACpC,IAAItZ,EAAQwvV,GAAiB3sV,EAAO2J,aAC/BxM,EAAM6vV,oBACP7vV,EAAM6vV,kBAAoB,IAE9B7vV,EAAM6vV,kBAAkB92V,KAAK+gD,EACjC,CACA,SAASg2S,GAAKlC,GACV,OAAO,SAAUmC,GACDP,GAAiBO,GACvBnC,SAAWA,CACrB,CACJ,CACA,SAASoC,GAAU/zV,GACf,OAAO,SAAU4G,EAAQotV,EAAa32U,GAClC42U,GAAcrtV,EAAQ5G,GAAM,EAAO4G,EAAQotV,EAAa,KAC5D,CACJ,CACA,SAASE,GAASl0V,GACd,OAAO,SAAU4G,EAAQotV,EAAa32U,GAClC42U,GAAcrtV,EAAQ5G,GAAM,EAAM4G,EAAQotV,EAAa,KAC3D,CACJ,CACA,SAASC,GAAcrtV,EAAQ5G,EAAMgyV,EAAUmC,EAAgBC,EAAuBvoV,GAClF,GAAa,OAAT7L,EAIJ,GAAqB,kBAAV6L,EAAX,CAKA,IAAI9H,EAAQwvV,GAAiB3sV,EAAO2J,aAC/BxM,EAAM8tV,oBACP9tV,EAAM8tV,kBAAoB,IAE9B9tV,EAAM8tV,kBAAkB/0V,KAAK,CACzBm1V,cAAemC,EACfzC,SAAU3xV,EACVgyV,SAAUA,GATd,MAFInrS,QAAQ3R,MAAM,qDAJd2R,QAAQ3R,MAAM,6CAiBtB,CACA,SAASm/S,GAAUr0V,GACf,OAAO,SAAUm0V,EAAgBC,EAAuBvoV,GACpD,IACI9H,EADAwM,EAAuC,mBAAlB4jV,EAA+BA,EAAiBA,EAAe5jV,YAExF,GAAqB,kBAAV1E,EAAoB,CAE3B,IAAIgyC,OAAa,EACbu2S,GACArwV,EAAQwvV,GAAiBhjV,GACzBstC,EAAau2S,IAGbrwV,EAAQwvV,GAAiBhjV,GACzBstC,EAAa,iBAEZ95C,EAAMotV,kBACPptV,EAAMotV,gBAAkB,CAAC,GAExBptV,EAAMotV,gBAAgBtzS,KACvB95C,EAAMotV,gBAAgBtzS,GAAc,CAAC,GAEzC95C,EAAMotV,gBAAgBtzS,GAAYhyC,GAAS7L,CAC/C,CACJ,CACJ,CACA,SAASuzV,GAAiB3sV,GAItB,OAHKA,EAAOpD,eAAe,sBACvBoD,EAAOsqV,iBAAmB,CAAC,GAExBtqV,EAAOsqV,gBAClB,CAQA,IAyMWoD,GAzMPC,GAAoD,SAAUC,EAAY5tV,EAAQhL,EAAKwiB,GACvF,IAA2H6mD,EAAvHhc,EAAIlkD,UAAUpI,OAAQ0vF,EAAIpjC,EAAI,EAAIriD,EAAkB,OAATwX,EAAgBA,EAAO7a,OAAOkD,yBAAyBG,EAAQhL,GAAOwiB,EACrH,GAAuB,kBAAZtO,SAAoD,oBAArBA,QAAQ07B,SAAyB6gD,EAAIv8E,QAAQ07B,SAASgpT,EAAY5tV,EAAQhL,EAAKwiB,QACpH,IAAK,IAAIphB,EAAIw3V,EAAW73V,OAAS,EAAGK,GAAK,EAAGA,KAASioE,EAAIuvR,EAAWx3V,MAAIqvF,GAAKpjC,EAAI,EAAIgc,EAAEonB,GAAKpjC,EAAI,EAAIgc,EAAEr+D,EAAQhL,EAAKywF,GAAKpnB,EAAEr+D,EAAQhL,KAASywF,GAChJ,OAAOpjC,EAAI,GAAKojC,GAAK9oF,OAAOyD,eAAeJ,EAAQhL,EAAKywF,GAAIA,CAChE,EACIooQ,GAA8C,SAAUjC,EAAYkC,GACpE,OAAO,SAAU9tV,EAAQhL,GAAO84V,EAAU9tV,EAAQhL,EAAK42V,EAAa,CACxE,EACImC,GAA8B,WAC9B,SAASA,IACLt5V,KAAKu5V,iBAAmB,IAAIriV,IAC5BlX,KAAKw5V,kBAAoB,IAAItiV,IAC7BlX,KAAKy5V,oBAAsB,IAAIvpV,IAC/BlQ,KAAK05V,qBAAuB,IAAIxpV,IAChClQ,KAAK25V,oBAAsB,GAC3B35V,KAAK45V,WAAY,EAEjB55V,KAAK65V,YAAc,CAAC,CACxB,CAsIA,OA5HAP,EAAa34V,UAAUm5V,SAAW,SAAUC,EAAeC,EAAoBC,EAAoBC,GAG/F,QAF4B,IAAxBA,IAAkCA,EAAsB,MAC5Dl6V,KAAKi6V,mBAAqBA,EACtBC,EAAqB,CACrB,IAAIt5P,EAAQo5P,EAAmBG,iBAC/Bn6V,KAAKo6V,kBAAkBF,EAAqBt5P,EAChD,CACJ,EACA04P,EAAa34V,UAAU05V,aAAe,SAAU56N,EAAW7+B,EAAOkthB,GAC9D,IAAIxzR,EAAc15P,EAAQ5gG,KAAKw5V,kBAAoBx5V,KAAKu5V,iBACpDrjO,EAAYokO,EAAYz3U,IAAI48G,GAShC,OAJKvJ,GAAa43f,IACd53f,EAAY,IAAIhmH,IAChBoqV,EAAYljV,IAAIqoH,EAAWvJ,IAExBA,CACX,EACAojO,EAAa34V,UAAUotnB,2BAA6B,WAChD,OAAsC,IAA/B/tnB,KAAKu5V,iBAAiB/gT,MAA8C,IAAhCx4C,KAAKw5V,kBAAkBhhT,MAC5B,IAAlCx4C,KAAKy5V,oBAAoBjhT,MAAiD,IAAnCx4C,KAAK05V,qBAAqBlhT,IACzE,EACA8gT,EAAa34V,UAAU61B,iBAAmB,SAAUipG,EAAWjzF,EAAUo0D,QACvD,IAAVA,IAAoBA,GAAQ,GAChC5gG,KAAKq6V,aAAa56N,EAAW7+B,GAAO,GAAM3tE,IAAIuZ,EAClD,EACA8sT,EAAa34V,UAAU81B,oBAAsB,SAAUgpG,EAAWjzF,EAAUo0D,QAC1D,IAAVA,IAAoBA,GAAQ,GAChC,IAAIs1B,EAAYl2H,KAAKq6V,aAAa56N,EAAW7+B,GAAO,GAC/Cs1B,IAGLA,EAAU9oC,OAAO5gD,GACM,IAAnB0pF,EAAU19E,OACQooD,EAAQ5gG,KAAKw5V,kBAAoBx5V,KAAKu5V,kBAC5CnsQ,OAAOqyC,GAE3B,EACA65N,EAAa34V,UAAUy5V,kBAAoB,SAAU5tT,EAAUo0D,QAC7C,IAAVA,IAAoBA,GAAQ,IAC/BA,EAAQ5gG,KAAK05V,qBAAuB15V,KAAKy5V,qBAAqBxmU,IAAIuZ,EACvE,EACA8sT,EAAa34V,UAAU45V,qBAAuB,SAAU/tT,EAAUo0D,QAChD,IAAVA,IAAoBA,GAAQ,IAC/BA,EAAQ5gG,KAAK05V,qBAAuB15V,KAAKy5V,qBAAqBrsQ,OAAO5gD,EAC1E,EACA8sT,EAAa34V,UAAUgmC,cAAgB,SAAUL,GAC7CtmC,KAAKw6V,oBAAoBl0T,GAAO,GAChCtmC,KAAKw6V,oBAAoBl0T,GAAO,GAChCtmC,KAAK65V,YAAYvzT,EAAMn9B,OAAQ,CACnC,EACAmwV,EAAa34V,UAAU85V,kBAAoB,SAAUn0T,GAC5CtmC,KAAK65V,YAAYvzT,EAAMn9B,OACxBnJ,KAAK2mC,cAAcL,EAE3B,EACAgzT,EAAa34V,UAAU65V,oBAAsB,SAAUl0T,EAAOs6D,GAC1D,IAAI3qF,EAAQjW,KACRy/H,EAAYn5F,EAAMn9B,KASlB+sH,EAAYl2H,KAAKq6V,aAAa56N,EAAW7+B,GAAO,GAChDs1B,GATwB,SAAUA,GAAoBA,EAAU7zH,SAAQ,SAAUmqC,GAC9Eo0D,EACA3qF,EAAMykV,eAAc,WAAc,OAAOluT,EAASlG,EAAQ,IAG1DkG,EAASlG,EAEjB,GAAI,CAGA0nlB,CAAsB93f,IAEJt1B,EAAQ5gG,KAAK05V,qBAAuB15V,KAAKy5V,qBAC/Cp3V,SAAQ,SAAUmqC,GAC1Bo0D,EACA3qF,EAAMykV,eAAc,WAAc,OAAOzkV,EAAMgkV,mBAAmBtzT,cAAc84F,GAAW,WAAc,OAAOjzF,EAASizF,EAAWn5F,EAAQ,IAAG,EAAO,IAGtJrwB,EAAMgkV,mBAAmBtzT,cAAc84F,GAAW,WAAc,OAAOjzF,EAASizF,EAAWn5F,EAAQ,IAAG,EAE9G,GACJ,EAKAgzT,EAAa34V,UAAU+5V,cAAgB,SAAUlyV,GAE7CxI,KAAK25V,oBAAoBl4V,KAAK+G,GAKzBxI,KAAK45V,YAENl0U,OAAO+C,WAAWzoB,KAAK26V,gBAAgB3nT,KAAKhzC,MAAO,GAEnDA,KAAK45V,WAAY,EAEzB,EAEAN,EAAa34V,UAAUg6V,gBAAkB,WACrC36V,KAAK45V,WAAY,EAMjB,IAAIgB,EAAY56V,KAAK25V,oBAAoB1oV,QACzCjR,KAAK25V,oBAAsB,GAE3BiB,EAAUv4V,SAAQ,SAAUmG,GAAQ,OAAOA,GAAQ,GACvD,EACA0wV,GAAW,CACPE,GAAQ,EAAGJ,GAAU,kBACrBI,GAAQ,EAAGJ,GAAU,uBACrBI,GAAQ,EAAGJ,GAAU,uBACrBI,GAAQ,EAAGJ,GAAU,yBACtBM,EAAa34V,UAAW,WAAY,MACvC24V,EAAeJ,GAAW,CACtBV,GAAK,iBACNc,EAEP,CAjJiC,GAyJ7BuB,GAA2B,WAC3B,SAASA,IACT,CA4BA,OA3BAA,EAAUC,gBAAkB,GAC5BD,EAAUE,gBAAkB,IAC5BF,EAAUG,kBAAoB,GAC9BH,EAAUI,sBAAwB,WAClCJ,EAAUK,sBAAwB,YAClCL,EAAUM,kBAAoB,QAC9BN,EAAUO,gBAAkB,MAC5BP,EAAUQ,wBAA0B,WACpCR,EAAUS,wBAA0B,WACpCT,EAAUU,2BAA6B,aACvCV,EAAUW,2BAA6B,aACvCX,EAAUY,OAAS,SACnBZ,EAAUa,mBAAqB,mBAC/Bb,EAAUc,WAAa,MACvBd,EAAUe,cAAgB,SAC1Bf,EAAUgB,kBAAoB,SAC9BhB,EAAUiB,iBAAmB,QAC7BjB,EAAUkB,uBAAyB,aACnClB,EAAUmB,qBAAuB,qBACjCnB,EAAUoB,aAAe,QACzBpB,EAAUqB,aAAe,QACzBrB,EAAUsB,YAAc,OACxBtB,EAAUuB,SAAW,MACrBvB,EAAUwB,UAAY,OACtBxB,EAAUyB,eAAiB,kCAC3BzB,EAAU0B,mBAAqB,8CAC/B1B,EAAU2B,kBAAoB,qEACvB3B,CACX,CA/B8B,IAuCnB5B,GAwCRpmS,EAAQomS,cAAgBpmS,EAAQomS,YAAc,CAAC,IAtCb,oBAAI,0BAErCA,GAAiC,oBAAI,yBAErCA,GAAoC,uBAAI,wCACxCA,GAAsC,yBAAI,2CAC1CA,GAA6B,gBAAI,gCAEjCA,GAAkC,qBAAI,2BAEtCA,GAAkC,qBAAI,0BAEtCA,GAA+B,kBAAI,mCACnCA,GAAmC,sBAAI,wCACvCA,GAAoC,uBAAI,wCACxCA,GAAwB,WAAI,2BAC5BA,GAA6B,gBAAI,iCACjCA,GAA+B,kBAAI,mCACnCA,GAA6B,gBAAI,iCACjCA,GAA2B,cAAI,+BAC/BA,GAAkC,qBAAI,sCACtCA,GAAgC,mBAAI,oCACpCA,GAA8B,iBAAI,kCAClCA,GAA8B,iBAAI,6BAClCA,GAAoC,uBAAI,yCACxCA,GAAsC,yBAAI,4CAC1CA,GAA+B,kBAAI,mCACnCA,GAA6B,gBAAI,gCACjCA,GAA8B,iBAAI,iCAGlCA,GAA2B,cAAI,6BAC/BA,GAAyB,YAAI,2BAC7BA,GAAuB,UAAI,yBAC3BA,GAA2B,cAAI,6BAYnC,IAAIwD,GAAgC,WAChC,SAASA,IACT,CA8CA,OA7CAA,EAAetnO,SAAW,SAAUz/G,EAAQgnV,QACpB,IAAhBA,IAA0BA,GAAc,GAC5CD,EAAeE,WAAWjnV,EAAOknV,YAAclnV,OACZxV,IAA/Bu8V,EAAeC,YACfD,EAAeC,YAAcA,EAGzBD,EAAeC,cAAgBA,GAC/BhJ,GAAO,WACHloS,QAAQC,KAAK,4JACbD,QAAQC,KAAK,6FACjB,GAAG,qBAGf,EAEAgxS,EAAeI,gBAAkB,SAAUzhP,EAASshP,QAC5B,IAAhBA,IAA0BA,GAAc,GACvCthP,GAGLA,EAAQ/4G,SAAQ,SAAUqT,GAAU,OAAO+mV,EAAetnO,SAASz/G,EAAQgnV,EAAc,GAC7F,EACAD,EAAeK,iBAAmB,SAAUF,EAAY/yS,GACpD,GAAI7pD,KAAK+V,aAAa6mV,GAClB,OAAO,EAEX,IACIG,EAAiB,0BAA4BlzS,EAAS,cAAgB+yS,EAAa,gFAIvF,OAHAlJ,GAAO,WACHloS,QAAQC,KAAKsxS,EACjB,GAJiBlzS,EAAS+yS,IAKnB,CACX,EACAH,EAAe1mV,aAAe,SAAU6mV,GACpC,QAASH,EAAeE,WAAWC,EACvC,EACAH,EAAeO,qBAAuB,WAClC,OAAO7vR,EAAOsvR,EAAeE,WACjC,EACAF,EAAeQ,eAAiB,WAC5B,OAAQR,EAAeC,WAC3B,EAEAD,EAAeE,WAAa,CAAC,EACtBF,CACX,CAjDmC,GAyD/BS,GAAsD,SAAU/D,EAAY5tV,EAAQhL,EAAKwiB,GACzF,IAA2H6mD,EAAvHhc,EAAIlkD,UAAUpI,OAAQ0vF,EAAIpjC,EAAI,EAAIriD,EAAkB,OAATwX,EAAgBA,EAAO7a,OAAOkD,yBAAyBG,EAAQhL,GAAOwiB,EACrH,GAAuB,kBAAZtO,SAAoD,oBAArBA,QAAQ07B,SAAyB6gD,EAAIv8E,QAAQ07B,SAASgpT,EAAY5tV,EAAQhL,EAAKwiB,QACpH,IAAK,IAAIphB,EAAIw3V,EAAW73V,OAAS,EAAGK,GAAK,EAAGA,KAASioE,EAAIuvR,EAAWx3V,MAAIqvF,GAAKpjC,EAAI,EAAIgc,EAAEonB,GAAKpjC,EAAI,EAAIgc,EAAEr+D,EAAQhL,EAAKywF,GAAKpnB,EAAEr+D,EAAQhL,KAASywF,GAChJ,OAAOpjC,EAAI,GAAKojC,GAAK9oF,OAAOyD,eAAeJ,EAAQhL,EAAKywF,GAAIA,CAChE,EACIi9hB,GAAqB,EAOrB9wR,GAAwB,WACxB,SAASA,EAAOC,EAAQC,EAAoB3N,EAAO4N,GAE/Ct9V,KAAKsoW,WAAa2lR,KAClBjunB,KAAKu9V,QAAS,EACdv9V,KAAKw9V,aAAc,EACnBx9V,KAAKy9V,cAAe,EACpBz9V,KAAK09V,aAAe,IAAIpE,GACxBt5V,KAAK29V,gBAAiB,EACtB39V,KAAK49V,aAAc,EACnB59V,KAAK69V,mBAAoB,EACzB79V,KAAKo9V,OAASA,EACdp9V,KAAKq9V,mBAAqBA,EAC1Br9V,KAAK0vV,MAAQA,EACb1vV,KAAKs9V,QAAUA,EACft9V,KAAKmkC,SAASi5T,EAClB,CA0oBA,OAzoBAD,EAAOx8V,UAAUwoW,cAAgB,WAC7B,OAAOnpW,KAAKsoW,UAChB,EACAnL,EAAOx8V,UAAUwjC,SAAW,SAAUi5T,QAEdl9V,IAAhBk9V,EAAOrqU,KACHqqU,EAAOrqU,OAAS8nU,GAAUuB,UAAYgB,EAAOrqU,OAAS8nU,GAAUwB,YAChEr8V,KAAK+yB,KAAOqqU,EAAOrqU,MAInBqqU,EAAOU,cAAgBjD,GAAUuB,UAAYgB,EAAOU,cAAgBjD,GAAUwB,YAC9Er8V,KAAK+yB,KAAOqqU,EAAOU,aAI3B,IAAIC,EAAY5P,EAAaiP,EAAOW,WAChCC,EAAmB7P,EAAaiP,EAAOY,uBACzB99V,IAAd69V,EACkB,OAAdA,IACA/9V,KAAK+9V,UAAYA,GAII,OAArBC,IACAh+V,KAAK+9V,UAAYC,GAIzB,IAAIp5T,EAAOypT,EAAc+O,EAAOx4T,MAC5Bq5T,EAAc5P,EAAc+O,EAAOa,aAEnCj+V,KAAKk+V,aADIh+V,IAAT0kC,GACgBA,GAGAq5T,OAGE/9V,IAAlBk9V,EAAOe,OACPn+V,KAAKo+V,UAAUhB,EAAOe,QAGtBn+V,KAAKo+V,UAAUhB,EAAOiB,eAG1B,IAAI9rT,EAAO47S,EAAaiP,EAAO7qT,MAC3B+rT,EAAcnQ,EAAaiP,EAAOkB,kBACzBp+V,IAATqyC,EACAvyC,KAAKuyC,KAAOA,OAESryC,IAAhBo+V,IACLt+V,KAAKuyC,KAAO+rT,EAEpB,EAEAnB,EAAOx8V,UAAU49V,UAAY,SAAUnB,EAAQC,GAC3Cr9V,KAAKo9V,OAASA,EACdp9V,KAAKq9V,mBAAqBA,EAC1Br9V,KAAKkunB,sBACLlunB,KAAKmunB,iBACT,EAMAhxR,EAAOx8V,UAAU69V,sBAAwB,WACrC,OAAOx+V,KAAKq9V,kBAChB,EACAF,EAAOx8V,UAAU89V,UAAY,SAAUllU,GACnCv5B,KAAKu5B,OAASA,CAClB,EAEA4jU,EAAOx8V,UAAU+9V,UAAY,WACzB,OAAO1+V,KAAKu5B,MAChB,EACA4jU,EAAOx8V,UAAUg+V,kBAAoB,SAAUC,GAC3C5+V,KAAK4+V,eAAiBA,CAC1B,EACAzB,EAAOx8V,UAAUk+V,kBAAoB,WACjC,OAAO7+V,KAAK4+V,cAChB,EAEAzB,EAAOx8V,UAAUm+V,WAAa,WAC1B9+V,KAAKkunB,sBACLlunB,KAAKm/V,iBAAiB,oBACtBn/V,KAAKmunB,kBACLnunB,KAAKu0D,UACT,EACA4oS,EAAOx8V,UAAUwtnB,gBAAkB,WAC/B,IAAI/uR,EAAsBp/V,KAAKg6V,mBAAmBqF,6BAClDr/V,KAAK4yV,kBAAoB7oF,EAAO/pQ,KAAKo9V,OAAOz0H,QAAU3oO,KAAKo9V,OAAOz0H,MAAMz0N,QAAQ,MAAQ,IAAMkrV,EAC9Fp/V,KAAKs/V,yBAA2Bv1F,EAAO/pQ,KAAKo9V,OAAOmC,eAAiBv/V,KAAKo9V,OAAOmC,aAAarrV,QAAQ,MAAQ,IAAMkrV,CACvH,EACAjC,EAAOx8V,UAAUutnB,oBAAsB,WACnC,IAAI9wR,EAASp9V,KAAKo9V,OAClBp9V,KAAKkP,SAAWlP,KAAKy/V,YAAY2uR,qBAAqBhxR,GACtDp9V,KAAKwoC,SAAWxoC,KAAKy/V,YAAY4uR,qBAAqBjxR,EAC1D,EACAD,EAAOx8V,UAAUw+V,iBAAmB,SAAU3zV,QAC3B,IAAXA,IAAqBA,EAAS,OAClC,IAAIg0V,EAAex/V,KAAKy/V,YAAYC,yBAAyB1/V,KAAKo9V,QAClEp9V,KAAK2/V,eAAeH,EAAch0V,GAAQ,EAC9C,EACA2xV,EAAOx8V,UAAUi/V,aAAe,WAC5B,OAAO,CACX,EACAzC,EAAOx8V,UAAUk/V,oBAAsB,SAAUnQ,GAC7C,GAAIn0C,EAAQv7S,KAAKo9V,SAAW7hD,EAAQv7S,KAAKo9V,OAAO0C,cAC5C,OAAO,EAEX,IAAIC,GAAgD,IAA7B//V,KAAKo9V,OAAO0C,aAC/BE,EAAmBhgW,KAAKo9V,OAAO0C,eAAiBpQ,EACpD,OAAOqQ,GAAoBC,CAC/B,EAEA7C,EAAOx8V,UAAUu/V,UAAY,WACzB,OAAOlgW,KAAKs9V,OAChB,EAEAH,EAAOx8V,UAAUw/V,gBAAkB,WAG/B,IAAIC,IAAkBpgW,KAAKo9V,OAAOlyV,UAAYlL,KAAKo9V,OAAOiD,gBAC1D,OAAOrgW,KAAKs9V,SAAW8C,CAC3B,EACAjD,EAAOx8V,UAAU2/V,oBAAsB,WACnC,OAAOtgW,KAAK4yV,iBAChB,EACAuK,EAAOx8V,UAAU4/V,2BAA6B,WAC1C,OAAOvgW,KAAKs/V,wBAChB,EACAnC,EAAOx8V,UAAU4zD,SAAW,WACxB,IAAIisS,EAAYxgW,KAAKo9V,OACrB,SAASqD,EAAS7rS,EAAKr0D,EAAKyG,GACxB0sV,GAAO,WACC1sV,EACAwkD,QAAQC,KAAKmJ,EAAK5tD,GAGlB0sV,GAAO,WAAc,OAAOloS,QAAQC,KAAKmJ,EAAM,GAAGr0D,EAE1D,GAAGA,EACP,CAEA,GADgBP,KAAKg6V,mBAAmB6/B,sBACtBp9B,GAAe1mV,aAAa88C,EAAQomS,YAAYyH,mBAAoB,CAC3D,CAAC,iBAAkB,WAAY,gBAAiB,cAAe,cAAe,QAAS,aAAc,WAC3Gr+V,SAAQ,SAAUorB,GAC3Bs8O,EAAOy2F,EAAU/yU,MACbgvU,GAAeQ,iBACfwD,EAAS,YAAchzU,EAAO,gFAAkFA,EAAM,2BAA6BA,GAGnJgzU,EAAS,YAAchzU,EAAO,iDAAmDolC,EAAQomS,YAAYyH,kBAAoB,6CAA+CjzU,EAAM,2BAA6BA,GAGvN,GACJ,CAWA,GAVKgvU,GAAe1mV,aAAa88C,EAAQomS,YAAY0H,mBAClB,iBAA3B3gW,KAAKo9V,OAAOwD,aACRnE,GAAeQ,iBACfwD,EAAS,YAAczgW,KAAKo9V,OAAOwD,WAAa,4CAA6C,2BAG7FH,EAAS,YAAczgW,KAAKo9V,OAAOwD,WAAa,oDAAsD/tS,EAAQomS,YAAY0H,iBAAkB,4BAIpJ3gW,KAAKg6V,mBAAmB8G,aAAc,CACJ,CAAC,WAAY,gBAAiB,QAAS,cAC7Cz+V,SAAQ,SAAUorB,GACtCs8O,EAAOy2F,EAAU/yU,KACjBgzU,EAAS,YAAchzU,EAAO,iFAAmFA,EAAM,yBAE/H,GACJ,CACIs8O,EAAO/pQ,KAAKo9V,OAAO9uU,QAAuC,kBAAtBtuB,KAAKo9V,OAAO9uU,OAChDmyU,EAAS,wDAA0DzgW,KAAKo9V,OAAO9uU,MAAO,wBAEtFkyU,EAAU+5K,uBACV95K,EAAS,yZAA0Z,2CAEnaD,EAAU8tR,6BACV7tR,EAAS,yZAA0Z,2CAEnaD,EAAU+tR,gCACV9tR,EAAS,yZAA0Z,2CAEnaD,EAAUguR,sBACV/tR,EAAS,gUAAiU,0CAElV,EAEAtD,EAAOx8V,UAAU61B,iBAAmB,SAAUipG,EAAWjzF,GACrDxsC,KAAK09V,aAAalnU,iBAAiBipG,EAAWjzF,EAClD,EAEA2wT,EAAOx8V,UAAU81B,oBAAsB,SAAUgpG,EAAWjzF,GACxDxsC,KAAK09V,aAAajnU,oBAAoBgpG,EAAWjzF,EACrD,EACA2wT,EAAOx8V,UAAUogW,mCAAqC,SAAUC,GAC5D,MAAO,CACH78V,KAAM68V,EACN/rU,KAAM+rU,EAAQ/rU,KACd7xB,OAAQpD,KACRo9V,OAAQp9V,KAAKo9V,OACbr6V,QAAS/C,KAAKg6V,mBAAmB9vN,aACjC7+F,IAAKrrC,KAAKg6V,mBAAmBiH,SAC7BC,UAAWlhW,KAAKg6V,mBAAmBmH,eAE3C,EACAhE,EAAOx8V,UAAUygW,oBAAsB,SAAUJ,GAE7C,GAA6C,mBAAlChhW,KAAKo9V,OAAOiE,kBACnB,OAAOrhW,KAAKo9V,OAAOiE,kBAGvB,GAA6C,oBAAlCrhW,KAAKo9V,OAAOiE,kBAAkC,CACrD,IAAIxlT,EAAS77C,KAAK+gW,mCAAmCC,GAErD,OAAOM,EADQthW,KAAKo9V,OAAOiE,mBACXxlT,EACpB,CACA,OAAO,CACX,EACAshT,EAAOx8V,UAAU4gW,eAAiB,SAAUP,GAExC,QAAIA,EAAQt3L,QAAU1pK,KAAKg6V,mBAAmBwH,sBAGvCxhW,KAAKyhW,aAAaT,EAAShhW,KAAKo9V,OAAOsE,SAClD,EACAvE,EAAOx8V,UAAU8tnB,qBAAuB,WACpC,QAASzunB,KAAKo9V,OAAOsxR,kBACzB,EACAvxR,EAAOx8V,UAAUghW,UAAY,SAAUX,GACnC,OAAOhhW,KAAKyhW,aAAaT,EAAShhW,KAAKo9V,OAAOwE,QAClD,EACAzE,EAAOx8V,UAAUkhW,YAAc,SAAUb,GACrC,OAAOhhW,KAAKyhW,aAAaT,EAAShhW,KAAKo9V,OAAO0E,UAClD,EACA3E,EAAOx8V,UAAUohW,wBAA0B,SAAUf,GACjD,OAAOhhW,KAAKyhW,aAAaT,EAAShhW,KAAKo9V,OAAO4E,kBAClD,EACA7E,EAAOx8V,UAAUshW,gBAAkB,SAAUjB,GACzC,OAAOhhW,KAAKyhW,aAAaT,EAAShhW,KAAKo9V,OAASp9V,KAAKo9V,OAAO8E,cAAgB,KAChF,EACA/E,EAAOx8V,UAAUwhW,YAAc,WAC3B,OAAiC,IAA1BniW,KAAKo9V,OAAOgF,SACvB,EACAjF,EAAOx8V,UAAU8gW,aAAe,SAAUT,EAASh7V,GAE/C,MAAqB,mBAAVA,EACAA,EAGU,oBAAVA,GAEYA,EADNhG,KAAK+gW,mCAAmCC,GAK7D,EACA7D,EAAOx8V,UAAU0hW,UAAY,SAAU9E,EAAQ/xV,QAC5B,IAAXA,IAAqBA,EAAS,OAClCxL,KAAKu9V,OAASA,EACdv9V,KAAK09V,aAAa/2T,cAAc3mC,KAAKsiW,kBAAkBnF,EAAOoF,qBAAsB/2V,GACxF,EACA2xV,EAAOx8V,UAAU2hW,kBAAoB,SAAUn5V,EAAMqC,GACjD,MAAO,CACH6/B,IAAKrrC,KAAKwiW,QACVtB,UAAWlhW,KAAKkhW,UAChB/3V,KAAMA,EACN/F,OAAQpD,KACRypG,QAAS,CAACzpG,MACVwL,OAAQA,EAEhB,EACA2xV,EAAOx8V,UAAU2hG,SAAW,WACxB,OAAOtiG,KAAKu9V,MAChB,EAEAJ,EAAOx8V,UAAU8hW,QAAU,WACvB,OAAOziW,KAAK+yB,IAChB,EACAoqU,EAAOx8V,UAAU+hW,QAAU,SAAU3vU,EAAMvnB,QACxB,IAAXA,IAAqBA,EAAS,OAC9BxL,KAAK+yB,OAASA,IACd/yB,KAAK+yB,KAAOA,EACZ/yB,KAAK09V,aAAa/2T,cAAc3mC,KAAKsiW,kBAAkBnF,EAAOwF,mBAAoBn3V,IAE1F,EACA2xV,EAAOx8V,UAAUiiW,eAAiB,SAAU1E,EAAS1yV,QAClC,IAAXA,IAAqBA,EAAS,OAC9BxL,KAAKw9V,cAAgBU,IACrBl+V,KAAKw9V,YAAcU,EACnBl+V,KAAK09V,aAAa/2T,cAAc3mC,KAAKsiW,kBAAkBnF,EAAO0F,2BAA4Br3V,IAElG,EACA2xV,EAAOx8V,UAAUmiW,cAAgB,WAC7B,OAAO9iW,KAAKw9V,WAChB,EACAL,EAAOx8V,UAAUoiW,gBAAkB,WAC/B,OAAO/iW,KAAK+yB,OAAS8nU,GAAUuB,QACnC,EACAe,EAAOx8V,UAAUqiW,iBAAmB,WAChC,OAAOhjW,KAAK+yB,OAAS8nU,GAAUwB,SACnC,EACAc,EAAOx8V,UAAUsiW,WAAa,WAC1B,OAAO1nD,EAAQv7S,KAAK+yB,KACxB,EACAoqU,EAAOx8V,UAAUuiW,UAAY,WACzB,OAAOn5F,EAAO/pQ,KAAK+yB,KACvB,EACAoqU,EAAOx8V,UAAUwiW,aAAe,WAC5B,OAAOnjW,KAAK+9V,SAChB,EACAZ,EAAOx8V,UAAUyiW,aAAe,SAAUC,GACtCrjW,KAAK+9V,UAAYsF,CACrB,EACAlG,EAAOx8V,UAAU2iW,WAAa,SAAUC,GACpCvjW,KAAKujW,QAAUA,CACnB,EAEApG,EAAOx8V,UAAU6iW,WAAa,WAC1B,OAAOxjW,KAAKujW,OAChB,EACApG,EAAOx8V,UAAU8iW,QAAU,WACvB,OAAOzjW,KAAKorB,IAChB,EACA+xU,EAAOx8V,UAAU+iW,WAAa,WAC1B,OAAO1jW,KAAK2jW,OAChB,EACAxG,EAAOx8V,UAAUijW,SAAW,WACxB,OAAO5jW,KAAKorB,KAAOprB,KAAK6jW,WAC5B,EACA1G,EAAOx8V,UAAUmjW,QAAU,SAAU14U,EAAM5f,QACxB,IAAXA,IAAqBA,EAAS,OAClCxL,KAAK2jW,QAAU3jW,KAAKorB,KAChBprB,KAAKorB,OAASA,IACdprB,KAAKorB,KAAOA,EACZprB,KAAK09V,aAAa/2T,cAAc3mC,KAAKsiW,kBAAkBnF,EAAO4G,mBAAoBv4V,IAE1F,EAEA2xV,EAAOx8V,UAAUqjW,eAAiB,WAC9B,OAAOhkW,KAAKy9V,YAChB,EAEAN,EAAOx8V,UAAUsjW,gBAAkB,SAAU/8T,EAAQ17B,EAAQ04V,QAC1C,IAAX14V,IAAqBA,EAAS,OAC9BxL,KAAKy9V,eAAiBv2T,IACtBlnC,KAAKy9V,aAAev2T,EACpBlnC,KAAK09V,aAAa/2T,cAAc3mC,KAAKsiW,kBAAkBnF,EAAOgH,4BAA6B34V,KAE/F,IAAI44V,EAAqBpkW,KAAKsiW,kBAAkBnF,EAAOkH,qBAAsB74V,GACzE04V,GACA/R,EAAUiS,EAAoBF,GAElClkW,KAAK09V,aAAa/2T,cAAcy9T,EACpC,EACAjH,EAAOx8V,UAAUy9V,UAAY,SAAUD,IACpB,IAAXA,GAAmBA,IAAWtD,GAAUsB,YACxCn8V,KAAKm+V,OAAStD,GAAUsB,YAEnBgC,IAAWtD,GAAUqB,aAC1Bl8V,KAAKm+V,OAAStD,GAAUqB,aAGxBl8V,KAAKm+V,OAAS,IAEtB,EACAhB,EAAOx8V,UAAU2jW,oBAAsB,SAAUC,EAAkB/4V,QAChD,IAAXA,IAAqBA,EAAS,OAC9BxL,KAAKukW,mBAAqBA,IAC1BvkW,KAAKukW,iBAAmBA,EACxBvkW,KAAK09V,aAAa/2T,cAAc3mC,KAAKsiW,kBAAkBnF,EAAOqH,iCAAkCh5V,IAExG,EACA2xV,EAAOx8V,UAAU8jW,kBAAoB,SAAUC,EAAgBl5V,QAC5C,IAAXA,IAAqBA,EAAS,OAC9BxL,KAAK0kW,iBAAmBA,IACxB1kW,KAAK0kW,eAAiBA,EACtB1kW,KAAK09V,aAAa/2T,cAAc3mC,KAAKsiW,kBAAkBnF,EAAOwH,+BAAgCn5V,IAEtG,EACA2xV,EAAOx8V,UAAUikW,mBAAqB,WAClC,OAAO5kW,KAAKukW,gBAChB,EACApH,EAAOx8V,UAAUkkW,iBAAmB,WAChC,OAAO7kW,KAAK0kW,cAChB,EACAvH,EAAOx8V,UAAUmkW,SAAW,WACxB,OAAO9kW,KAAKm+V,SAAWtD,GAAUsB,aAAen8V,KAAKm+V,SAAWtD,GAAUqB,YAC9E,EACAiB,EAAOx8V,UAAUokW,aAAe,WAC5B,OAAO/kW,KAAKm+V,SAAWtD,GAAUsB,WACrC,EACAgB,EAAOx8V,UAAUqkW,cAAgB,WAC7B,OAAOhlW,KAAKm+V,SAAWtD,GAAUqB,YACrC,EACAiB,EAAOx8V,UAAUskW,UAAY,WACzB,OAAOjlW,KAAKm+V,MAChB,EACAhB,EAAOx8V,UAAUukW,WAAa,SAAUhH,EAAS1yV,QAC9B,IAAXA,IAAqBA,EAAS,OAClC,IAAIw3K,GAAuB,IAAZk7K,EACXl+V,KAAKk+V,UAAYl7K,IACjBhjL,KAAKk+V,QAAUl7K,EACfhjL,KAAK09V,aAAa/2T,cAAc3mC,KAAKsiW,kBAAkBnF,EAAOgI,sBAAuB35V,IAE7F,EACA2xV,EAAOx8V,UAAUkrC,UAAY,WACzB,OAAO7rC,KAAKk+V,OAChB,EAMAf,EAAOx8V,UAAUykW,UAAY,WACzB,OAAOplW,KAAKo9V,MAChB,EACAD,EAAOx8V,UAAU0kW,mBAAqB,WAClC,OAAOrlW,KAAKo9V,OAAOkI,eACvB,EAKAnI,EAAOx8V,UAAU4kW,SAAW,WACxB,OAAOvlW,KAAK0vV,KAChB,EAKAyN,EAAOx8V,UAAUgnC,MAAQ,WACrB,OAAO3nC,KAAKulW,UAChB,EAKApI,EAAOx8V,UAAUs/V,YAAc,WAC3B,OAAOjgW,KAAK2nC,OAChB,EACAw1T,EAAOx8V,UAAU6kW,cAAgB,WAC7B,OAAOxlW,KAAKo9V,MAChB,EAEAD,EAAOx8V,UAAU8kW,eAAiB,WAC9B,OAAOzlW,KAAK6jW,WAChB,EACA1G,EAAOx8V,UAAU+kW,uBAAyB,SAAU1E,GAUhD,MATa,CACT78V,KAAM68V,EACN/rU,KAAM+rU,EAAQ/rU,KACdmoU,OAAQp9V,KAAKo9V,OACbh6V,OAAQpD,KACRqrC,IAAKrrC,KAAKg6V,mBAAmBiH,SAC7BC,UAAWlhW,KAAKg6V,mBAAmBmH,eACnCp+V,QAAS/C,KAAKg6V,mBAAmB9vN,aAGzC,EACAizN,EAAOx8V,UAAUglW,WAAa,SAAU3E,GACpC,GAAIzlD,EAAQv7S,KAAKo9V,OAAOwI,SACpB,OAAO,EAEX,IAAI/pT,EAAS77C,KAAK0lW,uBAAuB1E,GACrC4E,EAAU5lW,KAAKo9V,OAAOwI,QAAQ/pT,GAElC,OAAO1yB,KAAK+D,IAAI04U,EAAS,EAC7B,EACAzI,EAAOx8V,UAAUklW,WAAa,SAAU7E,GACpC,GAAIzlD,EAAQv7S,KAAKo9V,OAAO0I,SACpB,OAAO,EAEX,IAAIjqT,EAAS77C,KAAK0lW,uBAAuB1E,GACrC8E,EAAU9lW,KAAKo9V,OAAO0I,QAAQjqT,GAElC,OAAO1yB,KAAK+D,IAAI44U,EAAS,EAC7B,EACA3I,EAAOx8V,UAAUg/V,eAAiB,SAAUkE,EAAar4V,EAAQu6V,QAC9C,IAAXv6V,IAAqBA,EAAS,YACnB,IAAXu6V,IAAqBA,GAAS,GACb,MAAjB/lW,KAAKkP,WACL20V,EAAc16U,KAAK+D,IAAI22U,EAAa7jW,KAAKkP,WAExB,MAAjBlP,KAAKwoC,WACLq7T,EAAc16U,KAAKgE,IAAI02U,EAAa7jW,KAAKwoC,WAEzCxoC,KAAK6jW,cAAgBA,IAErB7jW,KAAK6jW,YAAcA,EACf7jW,KAAKuyC,MAAmB,SAAX/mC,GAAgC,qBAAXA,IAClCxL,KAAKuyC,KAAO,MAEXwzT,GACD/lW,KAAKgmW,4BAA4Bx6V,GAG7C,EACA2xV,EAAOx8V,UAAUqlW,4BAA8B,SAAUx6V,GACrDxL,KAAK09V,aAAa/2T,cAAc3mC,KAAKsiW,kBAAkBnF,EAAO8I,oBAAqBz6V,GACvF,EACA2xV,EAAOx8V,UAAUulW,iBAAmB,SAAU53U,GAC1C,OAAqB,MAAjBtuB,KAAKwoC,UACEla,EAAQtuB,KAAKwoC,QAG5B,EACA20T,EAAOx8V,UAAUwlW,YAAc,WAC3B,OAAOnmW,KAAKkP,QAChB,EACAiuV,EAAOx8V,UAAUgvS,YAAc,WAC3B,OAAO3vS,KAAKwoC,QAChB,EACA20T,EAAOx8V,UAAUylW,QAAU,WACvB,OAAOpmW,KAAKuyC,MAAQ,CACxB,EAGA4qT,EAAOx8V,UAAU0lW,QAAU,SAAU9zT,GAC7BvyC,KAAKuyC,OAASA,IACdvyC,KAAKuyC,KAAOA,EAEpB,EACA4qT,EAAOx8V,UAAU2lW,WAAa,SAAU96V,QACrB,IAAXA,IAAqBA,EAAS,OAC9Bu+P,EAAO/pQ,KAAKkP,WACZlP,KAAK2/V,eAAe3/V,KAAKkP,SAAU1D,EAE3C,EACA2xV,EAAOx8V,UAAU4lW,kBAAoB,SAAUC,EAAUh7V,QACtC,IAAXA,IAAqBA,EAAS,OAC9BxL,KAAK29V,iBAAmB6I,IACxBxmW,KAAK29V,eAAiB6I,EACtBxmW,KAAK09V,aAAa/2T,cAAc3mC,KAAKsiW,kBAAkBnF,EAAOsJ,wBAAyBj7V,IAE/F,EAEA2xV,EAAOx8V,UAAU+lW,iBAAmB,WAChC,OAAO1mW,KAAK29V,cAChB,EACAR,EAAOx8V,UAAUgmW,eAAiB,SAAUC,EAAOp7V,QAChC,IAAXA,IAAqBA,EAAS,OAC9BxL,KAAK49V,cAAgBgJ,IACrB5mW,KAAK49V,YAAcgJ,EACnB5mW,KAAK09V,aAAa/2T,cAAc3mC,KAAKsiW,kBAAkBnF,EAAO0J,oBAAqBr7V,IAE3F,EAEA2xV,EAAOx8V,UAAUmmW,cAAgB,WAC7B,OAAO9mW,KAAK49V,WAChB,EACAT,EAAOx8V,UAAUomW,oBAAsB,WACnC,OAAO/mW,KAAK8mW,iBAAmB9mW,KAAK0mW,oBAAsB1mW,KAAKgnW,eACnE,EACA7J,EAAOx8V,UAAUsmW,qBAAuB,WACpC,OAAOjnW,KAAKknW,gBAAkBlnW,KAAKmnW,mBAAqBnnW,KAAKonW,cACjE,EACAjK,EAAOx8V,UAAU0mW,eAAiB,SAAUrhW,EAAOwF,QAChC,IAAXA,IAAqBA,EAAS,OAC9BxL,KAAK69V,oBAAsB73V,IAC3BhG,KAAK69V,kBAAoB73V,EACzBhG,KAAK09V,aAAa/2T,cAAc3mC,KAAKsiW,kBAAkBnF,EAAOmK,oBAAqB97V,IAE3F,EAEA2xV,EAAOx8V,UAAUqmW,cAAgB,WAC7B,OAAOhnW,KAAK69V,iBAChB,EACAV,EAAOx8V,UAAUumW,aAAe,WAC5B,OAAmC,IAA5BlnW,KAAKo9V,OAAOmK,WACvB,EACApK,EAAOx8V,UAAUymW,aAAe,WAC5B,OAAmC,IAA5BpnW,KAAKo9V,OAAOoK,WACvB,EACArK,EAAOx8V,UAAUwmW,gBAAkB,WAC/B,OAAsC,IAA/BnnW,KAAKo9V,OAAOqK,cACvB,EACAtK,EAAOx8V,UAAU+mW,YAAc,SAAU9xJ,GACrC,IAAI+xJ,EAAW3nW,KAAKolW,YAAYuC,SAIhC,OAHgB,MAAZA,IACAA,EAAW/xJ,GAER+xJ,CACX,EAGAxK,EAAOx8V,UAAUinW,eAAiB,WAE9B,OADAp8S,QAAQC,KAAK,mHACNzrD,KAAKo9V,UAAWp9V,KAAKo9V,OAAOyK,YACvC,EAGA1K,EAAOx8V,UAAUmnW,cAAgB,WAE7B,OADAt8S,QAAQC,KAAK,iHACNzrD,KAAKo9V,UAAWp9V,KAAKo9V,OAAO2K,WACvC,EAGA5K,EAAOx8V,UAAUqnW,aAAe,WAE5B,OADAx8S,QAAQC,KAAK,+GACNzrD,KAAKo9V,UAAWp9V,KAAKo9V,OAAO6K,UACvC,EAEA9K,EAAOoF,qBAAuB,gBAE9BpF,EAAO4G,mBAAqB,cAE5B5G,EAAO8I,oBAAsB,eAE7B9I,EAAOwH,+BAAiC,wBACxCxH,EAAOqH,iCAAmC,0BAE1CrH,EAAOgI,sBAAwB,iBAE/BhI,EAAOkH,qBAAuB,gBAE9BlH,EAAOgH,4BAA8B,sBAErChH,EAAOwF,mBAAqB,cAC5BxF,EAAO0F,2BAA6B,qBAEpC1F,EAAOsJ,wBAA0B,wBAEjCtJ,EAAO0J,oBAAsB,qBAE7B1J,EAAOmK,oBAAsB,qBAC7BpK,GAAa,CACTxE,GAAU,uBACXyE,EAAOx8V,UAAW,0BAAsB,GAC3Cu8V,GAAa,CACTxE,GAAU,gBACXyE,EAAOx8V,UAAW,mBAAe,GACpCu8V,GAAa,CACTxE,GAAU,cACXyE,EAAOx8V,UAAW,iBAAa,GAClCu8V,GAAa,CACTxE,GAAU,YACXyE,EAAOx8V,UAAW,eAAW,GAChCu8V,GAAa,CACTxE,GAAU,YACXyE,EAAOx8V,UAAW,eAAW,GAChCu8V,GAAa,CACT9E,IACD+E,EAAOx8V,UAAW,aAAc,MAC5Bw8V,CACX,CA3pB2B,GAmqBvB+K,GAAsD,SAAU/O,EAAY5tV,EAAQhL,EAAKwiB,GACzF,IAA2H6mD,EAAvHhc,EAAIlkD,UAAUpI,OAAQ0vF,EAAIpjC,EAAI,EAAIriD,EAAkB,OAATwX,EAAgBA,EAAO7a,OAAOkD,yBAAyBG,EAAQhL,GAAOwiB,EACrH,GAAuB,kBAAZtO,SAAoD,oBAArBA,QAAQ07B,SAAyB6gD,EAAIv8E,QAAQ07B,SAASgpT,EAAY5tV,EAAQhL,EAAKwiB,QACpH,IAAK,IAAIphB,EAAIw3V,EAAW73V,OAAS,EAAGK,GAAK,EAAGA,KAASioE,EAAIuvR,EAAWx3V,MAAIqvF,GAAKpjC,EAAI,EAAIgc,EAAEonB,GAAKpjC,EAAI,EAAIgc,EAAEr+D,EAAQhL,EAAKywF,GAAKpnB,EAAEr+D,EAAQhL,KAASywF,GAChJ,OAAOpjC,EAAI,GAAKojC,GAAK9oF,OAAOyD,eAAeJ,EAAQhL,EAAKywF,GAAIA,CAChE,EACIm3Q,GAA6B,WAC7B,SAASA,EAAYC,EAAqBC,EAASC,EAAYnK,GAE3Dn+V,KAAKuoW,kBAAoB,GACzBvoW,KAAKwoW,kBAAoB,IAAIlP,GAC7Bt5V,KAAKqoW,QAAUA,EACfroW,KAAKsoW,WAAaA,EAClBtoW,KAAKooW,oBAAsBA,EAC3BpoW,KAAKm+V,OAASA,CAClB,CAkQA,OAhQAgK,EAAYM,eAAiB,SAAUJ,EAASC,GAC5C,OAAOD,EAAU,IAAMC,CAC3B,EAGAH,EAAYxnW,UAAUi1B,MAAQ,WAC1B51B,KAAKu5B,OAAS,KACdv5B,KAAK2K,SAAW,KAChB3K,KAAKuoW,kBAAoB,IAC7B,EACAJ,EAAYxnW,UAAU+9V,UAAY,WAC9B,OAAO1+V,KAAKu5B,MAChB,EACA4uU,EAAYxnW,UAAU89V,UAAY,SAAUllU,GACxCv5B,KAAKu5B,OAASA,CAClB,EACA4uU,EAAYxnW,UAAUs/V,YAAc,WAChC,OAAOkI,EAAYM,eAAezoW,KAAKqoW,QAASroW,KAAKsoW,WACzD,EACAH,EAAYxnW,UAAUi/V,aAAe,WACjC,OAAyC,IAAlC5/V,KAAKuoW,kBAAkBjnW,MAClC,EACA6mW,EAAYxnW,UAAU2hG,SAAW,WAC7B,IAAIomQ,EAAiB1oW,KAAK2oW,yBAAyBC,iBACnD,SAAKF,GAA4C,IAA1BA,EAAepnW,SAG/BonW,EAAejqU,OAAM,SAAU42B,GAAO,OAAOA,EAAIitC,UAAY,GACxE,EACA6lQ,EAAYxnW,UAAUkoW,UAAY,WAQ9B,GANA7oW,KAAKuoW,kBAAkBlmW,SAAQ,SAAU6K,GACjCA,aAAiBi7V,GACjBj7V,EAAM27V,WAEd,IAEI7oW,KAAKuoW,kBAAkBjnW,OAAS,EAChC,GAAItB,KAAKg6V,mBAAmB8O,cAAe,CACvC,IACIC,EADYjZ,EAAK9vV,KAAKuoW,mBACI9E,UAC9BzjW,KAAK8jW,QAAQiF,EACjB,KACK,CACD,IAAIC,EAAiBhpW,KAAKuoW,kBAAkB,GAAG9E,UAC/CzjW,KAAK8jW,QAAQkF,EACjB,MAKAhpW,KAAK8jW,QAAQ,KAErB,EACAqE,EAAYxnW,UAAU8iW,QAAU,WAC5B,OAAOzjW,KAAKorB,IAChB,EACA+8U,EAAYxnW,UAAU+iW,WAAa,WAC/B,OAAO1jW,KAAK2jW,OAChB,EACAwE,EAAYxnW,UAAUmjW,QAAU,SAAU14U,GACtCprB,KAAK2jW,QAAUv4U,EACXprB,KAAKorB,OAASA,IACdprB,KAAKorB,KAAOA,EACZprB,KAAKwoW,kBAAkB7hU,cAAc3mC,KAAKipW,cAAcd,EAAYpE,qBAE5E,EACAoE,EAAYxnW,UAAUskW,UAAY,WAC9B,OAAOjlW,KAAKm+V,MAChB,EACAgK,EAAYxnW,UAAUsoW,cAAgB,SAAU9/V,GAC5C,MAAO,CAAEA,KAAMA,EACnB,EACAg/V,EAAYxnW,UAAU61B,iBAAmB,SAAUipG,EAAWjzF,GAC1DxsC,KAAKwoW,kBAAkBhyU,iBAAiBipG,EAAWjzF,EACvD,EACA27T,EAAYxnW,UAAU81B,oBAAsB,SAAUgpG,EAAWjzF,GAC7DxsC,KAAKwoW,kBAAkB/xU,oBAAoBgpG,EAAWjzF,EAC1D,EACA27T,EAAYxnW,UAAUuoW,WAAa,WAC/B,OAAOlpW,KAAKqoW,OAChB,EACAF,EAAYxnW,UAAUwoW,cAAgB,WAClC,OAAOnpW,KAAKsoW,UAChB,EACAH,EAAYxnW,UAAUyoW,6BAA+B,SAAUC,GAC3D,IAAI7hW,GAAS,EAWb,OAVAxH,KAAK2K,SAAStI,SAAQ,SAAUinW,GACxBD,IAAgBC,IAChB9hW,GAAS,GAET8hW,aAAsBnB,GAClBmB,EAAWF,6BAA6BC,KACxC7hW,GAAS,EAGrB,IACOA,CACX,EACA2gW,EAAYxnW,UAAU8kW,eAAiB,WACnC,IAAI8D,EAAmB,EAMvB,OALIvpW,KAAKuoW,mBACLvoW,KAAKuoW,kBAAkBlmW,SAAQ,SAAU6K,GACrCq8V,GAAoBr8V,EAAMu4V,gBAC9B,IAEG8D,CACX,EACApB,EAAYxnW,UAAUwhW,YAAc,WAChC,IAAKniW,KAAKuoW,kBACN,OAAO,EAGX,IAAI/gW,GAAS,EAMb,OALAxH,KAAKuoW,kBAAkBlmW,SAAQ,SAAU6K,GACjCA,EAAMi1V,gBACN36V,GAAS,EAEjB,IACOA,CACX,EACA2gW,EAAYxnW,UAAUwlW,YAAc,WAChC,IAAI3+V,EAAS,EAIb,OAHAxH,KAAKuoW,kBAAkBlmW,SAAQ,SAAUmnW,GACrChiW,GAAUgiW,EAAWrD,eAAiB,CAC1C,IACO3+V,CACX,EACA2gW,EAAYxnW,UAAUy3D,SAAW,SAAUlrD,GAClClN,KAAK2K,WACN3K,KAAK2K,SAAW,IAEpB3K,KAAK2K,SAASlJ,KAAKyL,EACvB,EACAi7V,EAAYxnW,UAAU8oW,qBAAuB,WACzC,OAAOzpW,KAAKuoW,iBAChB,EACAJ,EAAYxnW,UAAUioW,eAAiB,WACnC,IAAIphW,EAAS,GAEb,OADAxH,KAAK0pW,eAAeliW,GACbA,CACX,EACA2gW,EAAYxnW,UAAUgpW,wBAA0B,WAC5C,IAAIniW,EAAS,GAEb,OADAxH,KAAK4pW,wBAAwBpiW,GACtBA,CACX,EAEA2gW,EAAYxnW,UAAU6kW,cAAgB,WAClC,OAAOxlW,KAAKooW,oBAAoByB,gBACpC,EACA1B,EAAYxnW,UAAUkpW,eAAiB,WACnC,OAAO7pW,KAAKooW,oBAAoByB,gBACpC,EACA1B,EAAYxnW,UAAUmpW,UAAY,WAC9B,OAAO9pW,KAAKooW,oBAAoB0B,WACpC,EACA3B,EAAYxnW,UAAUopW,aAAe,WACjC,OAAO/pW,KAAKooW,oBAAoB2B,cACpC,EACA5B,EAAYxnW,UAAUqpW,WAAa,WAC/B,OAAOhqW,KAAKooW,oBAAoB4B,YACpC,EACA7B,EAAYxnW,UAAUspW,YAAc,SAAUz0Q,GAC1Cx1F,KAAKooW,oBAAoB6B,YAAYz0Q,EACzC,EACA2yQ,EAAYxnW,UAAUipW,wBAA0B,SAAUM,GACtDlqW,KAAKuoW,kBAAkBlmW,SAAQ,SAAU6K,GACjCA,aAAiBiwV,GACjB+M,EAAYzoW,KAAKyL,GAEZA,aAAiBi7V,GACtBj7V,EAAM08V,wBAAwBM,EAEtC,GACJ,EACA/B,EAAYxnW,UAAU+oW,eAAiB,SAAUQ,GAC7ClqW,KAAK2K,SAAStI,SAAQ,SAAU6K,GACxBA,aAAiBiwV,GACjB+M,EAAYzoW,KAAKyL,GAEZA,aAAiBi7V,GACtBj7V,EAAMw8V,eAAeQ,EAE7B,GACJ,EACA/B,EAAYxnW,UAAUowH,YAAc,WAChC,OAAO/wH,KAAK2K,QAChB,EACAw9V,EAAYxnW,UAAU0kW,mBAAqB,WACvC,OAAOrlW,KAAKooW,oBAAoB/C,oBACpC,EACA8C,EAAYxnW,UAAUgoW,uBAAyB,WAC3C,OAAO3oW,KAAKooW,mBAChB,EACAD,EAAYxnW,UAAUwpW,gBAAkB,WACpC,IAAI5wU,EAASv5B,KAAK0+V,YAClB,OAAK1+V,KAAK8pW,aAAgBvwU,GAAWA,EAAOuwU,YAGrC,EAAIvwU,EAAO4wU,kBAFP,CAGf,EACAhC,EAAYxnW,UAAUypW,0BAA4B,WAC9C,IAAIn0V,EAAQjW,KAEZA,KAAKuoW,kBAAoB,GAIzB,IADA,IAAI8B,EAAsBrqW,KACI,MAAvBqqW,GAA+BA,EAAoBP,aACtDO,EAAsBA,EAAoB3L,YAI9C,OAFmB2L,GAAsBA,EAAoBjC,oBAAoB2B,gBAK7E,OAFA/pW,KAAKuoW,kBAAoBvoW,KAAK2K,cAC9B3K,KAAKwoW,kBAAkB7hU,cAAc3mC,KAAKipW,cAAcd,EAAYqC,mCAMxExqW,KAAK2K,SAAStI,SAAQ,SAAU6K,GAG5B,KADiBA,aAAiBi7V,KAAiBj7V,EAAMq7V,oBAAsBr7V,EAAMq7V,kBAAkBjnW,SAKvG,OADsB4L,EAAMm4V,sBAExB,KAAK8C,EAAYmC,uBAETD,EAAoBjC,oBAAoB4B,cACxC/zV,EAAMsyV,kBAAkB9mW,KAAKyL,GAEjC,MACJ,KAAKi7V,EAAYoC,yBAERF,EAAoBjC,oBAAoB4B,cACzC/zV,EAAMsyV,kBAAkB9mW,KAAKyL,GAEjC,MACJ,QACI+I,EAAMsyV,kBAAkB9mW,KAAKyL,GAGzC,IACAlN,KAAKwoW,kBAAkB7hU,cAAc3mC,KAAKipW,cAAcd,EAAYqC,kCACxE,EACArC,EAAYmC,uBAAyB,OACrCnC,EAAYoC,yBAA2B,SACvCpC,EAAYpE,mBAAqB,cACjCoE,EAAYqC,iCAAmC,2BAC/CtC,GAAa,CACTxP,GAAU,uBACXyP,EAAYxnW,UAAW,0BAAsB,GACzCwnW,CACX,CA5QgC,GAoR5BwmR,GAAqC,WACrC,SAASA,EAAoBjkR,EAAarC,EAASrsU,EAASolC,GACxDphE,KAAKwoW,kBAAoB,IAAIlP,GAC7Bt5V,KAAK2qW,YAAa,EAClB3qW,KAAK0qW,YAAcA,EACnB1qW,KAAKqoW,QAAUA,EACfroW,KAAKw1F,WAAak1Q,KAAiBA,EAAYE,cAC/C5qW,KAAKg8B,QAAUA,EACfh8B,KAAKohE,MAAQA,CACjB,CAqJA,OApJAutjB,EAAoBhunB,UAAUg+V,kBAAoB,SAAUC,GACxD5+V,KAAK4+V,eAAiBA,CAC1B,EACA+vR,EAAoBhunB,UAAUk+V,kBAAoB,WAC9C,OAAO7+V,KAAK4+V,cAChB,EACA+vR,EAAoBhunB,UAAUkqW,SAAW,WACrC,OAAO7qW,KAAKohE,KAChB,EACAutjB,EAAoBhunB,UAAUkrC,UAAY,WAEtC,QAAI7rC,KAAK2K,UACE3K,KAAK2K,SAAS8oB,MAAK,SAAUvmB,GAAS,OAAOA,EAAM2+B,WAAa,GAG/E,EACA8ilB,EAAoBhunB,UAAUmpW,UAAY,WACtC,OAAO9pW,KAAKg8B,OAChB,EACA2ylB,EAAoBhunB,UAAUspW,YAAc,SAAUz0Q,GAClDx1F,KAAKw1F,cAAwBt1F,IAAbs1F,GAAiCA,EACjD,IAAIlvD,EAAQ,CACRn9B,KAAMwlnB,EAAoB7jR,wBAE9B9qW,KAAKwoW,kBAAkB7hU,cAAcL,EACzC,EACAqolB,EAAoBhunB,UAAUopW,aAAe,WACzC,OAAO/pW,KAAK2qW,UAChB,EACAgkR,EAAoBhunB,UAAUqpW,WAAa,WACvC,OAAOhqW,KAAKw1F,QAChB,EACAm5hB,EAAoBhunB,UAAUuoW,WAAa,WACvC,OAAOlpW,KAAKqoW,OAChB,EACAsmR,EAAoBhunB,UAAUgnC,MAAQ,WAClC,OAAO3nC,KAAKkpW,YAChB,EACAylR,EAAoBhunB,UAAUoqW,YAAc,SAAUpgW,GAClD3K,KAAK2K,SAAWA,CACpB,EACAgknB,EAAoBhunB,UAAUowH,YAAc,WACxC,OAAO/wH,KAAK2K,QAChB,EACAgknB,EAAoBhunB,UAAUkpW,eAAiB,WAC3C,OAAO7pW,KAAK0qW,WAChB,EACAikR,EAAoBhunB,UAAUioW,eAAiB,WAC3C,IAAIphW,EAAS,GAEb,OADAxH,KAAK0pW,eAAeliW,GACbA,CACX,EACAmnnB,EAAoBhunB,UAAU+oW,eAAiB,SAAUQ,GAChDlqW,KAAK2K,UAGV3K,KAAK2K,SAAStI,SAAQ,SAAU6K,GACxBA,aAAiBiwV,GACjB+M,EAAYzoW,KAAKyL,GAEZA,aAAiByhnB,GACtBzhnB,EAAMw8V,eAAeQ,EAE7B,GACJ,EACAykR,EAAoBhunB,UAAU0kW,mBAAqB,WAC/C,IAAIqF,EAAc1qW,KAAK0qW,YACvB,GAAKA,EAGL,OAAOA,EAAYpF,eACvB,EAGAqpR,EAAoBhunB,UAAUqqW,gBAAkB,WAC5C,IAAI/0V,EAAQjW,KACZA,KAAKirW,gBAELjrW,KAAK4oW,iBAAiBvmW,SAAQ,SAAUgzD,GAAO,OAAOA,EAAI7+B,iBAAiB2mU,GAAOgI,sBAAuBlvV,EAAMi1V,0BAA0Bl4T,KAAK/8B,GAAS,GAC3J,EACA04mB,EAAoBhunB,UAAUsqW,cAAgB,WAC1C,IAAIjrW,KAAK8pW,YAAT,CAUA,IANA,IAAIqB,GAA4B,EAE5BC,GAA8B,EAE9BC,GAAuB,EACvB1gW,EAAW3K,KAAKsrW,8BACX3pW,EAAI,EAAGogE,EAAIp3D,EAASrJ,OAAQK,EAAIogE,EAAGpgE,IAAK,CAC7C,IAAI4pW,EAAiB5gW,EAAShJ,GAC9B,GAAK4pW,EAAe1/T,YAApB,CAIA,IAAI2/T,EAAkBD,EAAelG,qBACjCmG,IAAoBrD,GAAYmC,wBAChCa,GAA4B,EAC5BE,GAAuB,GAElBG,IAAoBrD,GAAYoC,0BACrCa,GAA8B,EAC9BC,GAAuB,IAGvBF,GAA4B,EAC5BC,GAA8B,EAblC,CAeJ,CACA,IAAIT,EAAaQ,GAA6BC,GAA+BC,EAC7E,GAAIrrW,KAAK2qW,aAAeA,EAAY,CAChC3qW,KAAK2qW,WAAaA,EAClB,IAAIj1O,EAAU,CACVvsH,KAAMwlnB,EAAoBljR,0BAE9BzrW,KAAKwoW,kBAAkB7hU,cAAc+uF,EACzC,CAnCA,CAoCJ,EACAi5f,EAAoBhunB,UAAU2qW,4BAA8B,WACxD,IAAIljS,EAAM,GACNpD,EAAU,SAAU6pB,GACpBA,EAAMxsF,SAAQ,SAAUorB,GAEKA,aAAgBkhmB,GAAuBlhmB,EAAKq8U,YAEjE9kS,EAAQv3C,EAAK9iB,UAGby9D,EAAI3mE,KAAKgsB,EAEjB,GACJ,EAEA,OADAu3C,EAAQhlE,KAAK2K,UACNy9D,CACX,EACAumjB,EAAoBhunB,UAAUuqW,0BAA4B,WACtDlrW,KAAKirW,eACT,EACA0jR,EAAoBhunB,UAAU61B,iBAAmB,SAAUipG,EAAWjzF,GAClExsC,KAAKwoW,kBAAkBhyU,iBAAiBipG,EAAWjzF,EACvD,EACAmilB,EAAoBhunB,UAAU81B,oBAAsB,SAAUgpG,EAAWjzF,GACrExsC,KAAKwoW,kBAAkB/xU,oBAAoBgpG,EAAWjzF,EAC1D,EACAmilB,EAAoB7jR,uBAAyB,kBAC7C6jR,EAAoBljR,yBAA2B,oBACxCkjR,CACX,CA/JwC,GAuKpCjjR,GAAqB,CACrBC,cAAe,CACXC,YAAa,0BACbC,UAAW,yBAEfC,aAAc,CACVF,YAAa,0BACbC,UAAW,0BAUfE,GAA2B,6BAC3BC,GAAiB,CAAC,aAAc,WAAY,YAAa,eACzDC,GAAW,CAAC,EAUhB,SAASC,GAAyB5lU,GAC9BA,EAAMylU,KAA4B,CACtC,CACA,SAASI,GAA2B7lU,GAChC,OAA2C,IAApCA,EAAMylU,GACjB,CACA,IACQ3rW,GADJgsW,IACIhsW,GAAO,CACPisW,OAAQ,QACRC,OAAQ,QACRC,OAAQ,OACR32U,MAAO,OACPikB,MAAO,MACPs3F,KAAM,MACN7lG,MAAO,OAEQ,SAAUjF,GACzB,GAAmC,mBAAxB4lU,GAAS5lU,GAChB,OAAO4lU,GAAS5lU,GAEpB,IAAIgV,EAAKr6C,SAASC,cAAcb,GAAKimC,IAAc,OAE/CmmU,GADJnmU,EAAY,KAAOA,KACagV,EAKhC,OAJKmxT,IACDnxT,EAAGn6C,aAAamlC,EAAW,WAC3BmmU,EAAsC,mBAAjBnxT,EAAGhV,IAErB4lU,GAAS5lU,GAAammU,CACjC,GAGJ,SAASoiR,GAAgB50R,EAAoB1zT,EAAOn9B,GAEhD,IADA,IAAIujW,EAAgBC,GAAUrmU,GACvBomU,GAAe,CAClB,IAAIE,EAAe5S,EAAmB6S,WAAWH,EAAevjW,GAChE,GAAIyjW,EACA,OAAOA,EAEXF,EAAgBA,EAAcjnU,aAClC,CACA,OAAO,IACX,CAsBA,SAASknU,GAAUrmU,GACf,IAAIwmU,EAAcxmU,EAClB,OAAOwmU,EAAYvhW,QAAUuhW,EAAYC,UAC7C,CACA,SAASC,GAAqBj/U,EAASuY,GACnC,SAAKA,IAAUvY,IAGRk/U,GAAa3mU,GAAOpyB,QAAQ6Z,IAAY,CACnD,CACA,SAASm/U,GAAgB5mU,GAGrB,IAFA,IAAI8hC,EAAM,GACN+kS,EAAUR,GAAUrmU,GACjB6mU,GACH/kS,EAAI3mE,KAAK0rW,GACTA,EAAUA,EAAQ1nU,cAEtB,OAAO2iC,CACX,CAkBA,SAAS6kS,GAAa3mU,GAClB,IAAIwmU,EAAcxmU,EAClB,OAAIwmU,EAAYM,SAELN,EAAYM,WAEnBN,EAAY1yT,KAEL0yT,EAAY1yT,KAEnB0yT,EAAYO,aAELP,EAAYO,eAEnBP,EAAYQ,kBAELR,EAAYQ,kBAIhBJ,GAAgB5mU,EAC3B,CACA,SAASinU,GAA4BtT,EAAoBuT,EAAUlnU,EAAOkG,GACtE,IACIzsC,EADYuN,EAAS0+V,GAAgB1lU,GACf,CAAElQ,SAAS,QAASl2B,EAG1C+5V,GAAsBA,EAAmBzjU,kBACzCyjU,EAAmBzjU,iBAAiBg3U,EAAUlnU,EAAOkG,EAAUzsC,EAEvE,CAEA,IAgKQ0tW,GAhKJC,GAA0BxlW,OAAO43E,OAAO,CACxCp9D,UAAW,KACXwpV,yBAA0BA,GAC1BC,2BAA4BA,GAC5BC,iBAAkBA,GAClBwiR,gBAAiBA,GACjBjhR,kBAzFJ,SAA2B5/U,EAASye,GAChCze,EAAQyI,iBAAiB,UAAWgW,GACpCze,EAAQyI,iBAAiB,QAASgW,GAClCze,EAAQyI,iBAAiB,QAASgW,GAGlCze,EAAQyI,iBAAiB,UAAWgW,GACpCze,EAAQyI,iBAAiB,QAASgW,EACtC,EAkFImgU,UAAWA,GACXK,qBAAsBA,GACtBE,gBAAiBA,GACjBU,mBApDJ,SAA4BtnU,GACxBA,EAAMgnU,kBAAoBL,GAAa3mU,EAC3C,EAmDI2mU,aAAcA,GACdM,4BAA6BA,KAS7BM,GAAsD,SAAU1U,EAAY5tV,EAAQhL,EAAKwiB,GACzF,IAA2H6mD,EAAvHhc,EAAIlkD,UAAUpI,OAAQ0vF,EAAIpjC,EAAI,EAAIriD,EAAkB,OAATwX,EAAgBA,EAAO7a,OAAOkD,yBAAyBG,EAAQhL,GAAOwiB,EACrH,GAAuB,kBAAZtO,SAAoD,oBAArBA,QAAQ07B,SAAyB6gD,EAAIv8E,QAAQ07B,SAASgpT,EAAY5tV,EAAQhL,EAAKwiB,QACpH,IAAK,IAAIphB,EAAIw3V,EAAW73V,OAAS,EAAGK,GAAK,EAAGA,KAASioE,EAAIuvR,EAAWx3V,MAAIqvF,GAAKpjC,EAAI,EAAIgc,EAAEonB,GAAKpjC,EAAI,EAAIgc,EAAEr+D,EAAQhL,EAAKywF,GAAKpnB,EAAEr+D,EAAQhL,KAASywF,GAChJ,OAAOpjC,EAAI,GAAKojC,GAAK9oF,OAAOyD,eAAeJ,EAAQhL,EAAKywF,GAAIA,CAChE,EACI88Q,GAA0B,WAC1B,SAASA,IACL,IAAI73V,EAAQjW,KACZA,KAAK+tW,iBAAmB,GACxB/tW,KAAK40V,WAAY,EAGjB50V,KAAKguW,UAAW,EAChBhuW,KAAKiuW,QAAU,WAAc,OAAQh4V,EAAM2+U,SAAW,CAC1D,CAkHA,OAlGAkZ,EAASntW,UAAUutW,sBAAwB,WACvC,OAAOluW,KAAKi6V,kBAChB,EACA6T,EAASntW,UAAUupI,WAAa,WAC5B,OAAOlqI,KAAK+C,OAChB,EACA+qW,EAASntW,UAAUu1B,QAAU,WAKzBl2B,KAAK+tW,iBAAiB1rW,SAAQ,SAAUmG,GAAQ,OAAOA,GAAQ,IAC/DxI,KAAK+tW,iBAAiBzsW,OAAS,EAC/BtB,KAAK40V,WAAY,EACjB50V,KAAK2mC,cAAc,CAAEx9B,KAAM2kW,EAASK,iBACxC,EACAL,EAASntW,UAAU61B,iBAAmB,SAAUipG,EAAWjzF,GAClDxsC,KAAKwoW,oBACNxoW,KAAKwoW,kBAAoB,IAAIlP,IAEjCt5V,KAAKwoW,kBAAkBhyU,iBAAiBipG,EAAWjzF,EACvD,EACAshU,EAASntW,UAAU81B,oBAAsB,SAAUgpG,EAAWjzF,GACtDxsC,KAAKwoW,mBACLxoW,KAAKwoW,kBAAkB/xU,oBAAoBgpG,EAAWjzF,EAE9D,EACAshU,EAASntW,UAAUytW,mBAAqB,SAAU9nU,GAC9C,IAAIrwB,EAAQjW,KACZ0lB,OAAO+C,YAAW,WAAc,OAAOxS,EAAM0wB,cAAcL,EAAQ,GAAG,EAC1E,EACAwnU,EAASntW,UAAUgmC,cAAgB,SAAUL,GACrCtmC,KAAKwoW,mBACLxoW,KAAKwoW,kBAAkB7hU,cAAcL,EAE7C,EACAwnU,EAASntW,UAAU0tW,mBAAqB,SAAUxjW,EAAQy7B,EAAOkG,GAC7D,IAAIv2B,EAAQjW,KACZ,IAAIA,KAAK40V,UAAT,CAGI/pV,aAAkBvC,YAClBilW,GAA4BvtW,KAAKkuW,wBAAyBrjW,EAAQy7B,EAAOkG,GAGzE3hC,EAAO2rB,iBAAiB8P,EAAOkG,GAEnC,IAAI8hU,EAAc,WAGd,OAFAzjW,EAAO4rB,oBAAoB6P,EAAOkG,GAClCv2B,EAAM83V,iBAAmB93V,EAAM83V,iBAAiB7iW,QAAO,SAAUyZ,GAAM,OAAOA,IAAO2pV,CAAa,IAC3F,IACX,EAEA,OADAtuW,KAAK+tW,iBAAiBtsW,KAAK6sW,GACpBA,CAbP,CAcJ,EACAR,EAASntW,UAAU4tW,eAAiB,SAAU/lW,GAEtCxI,KAAKiuW,UACLjuW,KAAK+tW,iBAAiBtsW,KAAK+G,GAG3BA,GAER,EACAslW,EAASntW,UAAU6tW,kBAAoB,SAAUlZ,EAAMvyV,GACnD,IAAIqlE,EAAMpoE,KAAKq1V,WAAWC,EAAMvyV,GAEhC,OADA/C,KAAKuuW,eAAevuW,KAAK83V,YAAY9kT,KAAKhzC,KAAMs1V,EAAMvyV,IAC/CqlE,CACX,EACA0lS,EAASntW,UAAU00V,WAAa,SAAUC,EAAMvyV,EAASwyV,GACrD,OAAQxyV,GAAW/C,KAAKkqI,cAAcmrN,WAAWC,EAAMC,EAC3D,EACAuY,EAASntW,UAAUm3V,YAAc,SAAUxC,EAAMvyV,GAC7C,OAAQA,GAAW/C,KAAKkqI,cAAc4tN,YAAYxC,EACtD,EACAwY,EAASntW,UAAUk3V,aAAe,SAAUE,EAAOh1V,GAC/C,IAAIkT,EAAQjW,KAIZ,OAHI+3V,GACA11V,EAAQ01V,GAAO,SAAUzC,GAAQ,OAAOr/U,EAAM6hV,YAAYxC,EAAMvyV,EAAU,IAEvE,EACX,EACA+qW,EAASK,gBAAkB,YAC3BN,GAAa,CACTnV,GAAU,uBACXoV,EAASntW,UAAW,0BAAsB,GAC7CktW,GAAa,CACTnV,GAAU,YACXoV,EAASntW,UAAW,eAAW,GAClCktW,GAAa,CACTnV,GAAU,iBACXoV,EAASntW,UAAW,oBAAgB,GACvCktW,GAAa,CACTnV,GAAU,uBACXoV,EAASntW,UAAW,0BAAsB,GAC7CktW,GAAa,CACTvV,IACDwV,EAASntW,UAAW,UAAW,MAC3BmtW,CACX,CA5H6B,GAoIzBW,IACIhB,GAAgB,SAAU7jS,EAAG/rC,GAI7B,OAHA4vU,GAAgBvlW,OAAOsa,gBAClB,CAAEE,UAAW,cAAgBze,OAAS,SAAU2lE,EAAG/rC,GAAK+rC,EAAElnD,UAAYmb,CAAG,GAC1E,SAAU+rC,EAAG/rC,GAAK,IAAK,IAAI5a,KAAK4a,EAAOA,EAAE11B,eAAe8a,KAAI2mD,EAAE3mD,GAAK4a,EAAE5a,GAAI,EACtEwqV,GAAc7jS,EAAG/rC,EAC5B,EACO,SAAU+rC,EAAG/rC,GAEhB,SAAS6wU,IAAO1uW,KAAKkV,YAAc00D,CAAG,CADtC6jS,GAAc7jS,EAAG/rC,GAEjB+rC,EAAEjpE,UAAkB,OAANk9B,EAAa31B,OAAOyb,OAAOka,IAAM6wU,EAAG/tW,UAAYk9B,EAAEl9B,UAAW,IAAI+tW,EACnF,GAEAC,GAAsD,SAAUxV,EAAY5tV,EAAQhL,EAAKwiB,GACzF,IAA2H6mD,EAAvHhc,EAAIlkD,UAAUpI,OAAQ0vF,EAAIpjC,EAAI,EAAIriD,EAAkB,OAATwX,EAAgBA,EAAO7a,OAAOkD,yBAAyBG,EAAQhL,GAAOwiB,EACrH,GAAuB,kBAAZtO,SAAoD,oBAArBA,QAAQ07B,SAAyB6gD,EAAIv8E,QAAQ07B,SAASgpT,EAAY5tV,EAAQhL,EAAKwiB,QACpH,IAAK,IAAIphB,EAAIw3V,EAAW73V,OAAS,EAAGK,GAAK,EAAGA,KAASioE,EAAIuvR,EAAWx3V,MAAIqvF,GAAKpjC,EAAI,EAAIgc,EAAEonB,GAAKpjC,EAAI,EAAIgc,EAAEr+D,EAAQhL,EAAKywF,GAAKpnB,EAAEr+D,EAAQhL,KAASywF,GAChJ,OAAOpjC,EAAI,GAAKojC,GAAK9oF,OAAOyD,eAAeJ,EAAQhL,EAAKywF,GAAIA,CAChE,EACI49Q,GAAgD,SAAUzX,EAAYkC,GACtE,OAAO,SAAU9tV,EAAQhL,GAAO84V,EAAU9tV,EAAQhL,EAAK42V,EAAa,CACxE,EAEI0X,GAA+B,SAAU/4V,GAEzC,SAAS+4V,IACL,OAAkB,OAAX/4V,GAAmBA,EAAOlM,MAAM5J,KAAM0J,YAAc1J,IAC/D,CAoYA,OAvYAyuW,GAAUI,EAAe/4V,GAIzB+4V,EAAcluW,UAAUm5V,SAAW,SAAUC,GACzC/5V,KAAKk4H,OAAS6hO,EAAcp2U,OAAO,gBACvC,EACAkrV,EAAcluW,UAAUmuW,iBAAmB,SAAUC,EAAMC,EAAgBC,GAIvE,IAAIC,EAAmB,IAAI5f,EACvBppR,EAAKlmE,KAAKmvW,wBAAwBF,GAAeG,EAAelpS,EAAGkpS,aAAcC,EAAiBnpS,EAAGmpS,eAAgBC,EAAkBppS,EAAGopS,gBAC9IJ,EAAiB1f,gBAAgB8f,GAEjC,IAAIC,EAAiBvvW,KAAKwvW,yBAAyBT,EAAM,EAAGC,EAAgBI,EAAcF,EAAkBG,GACxGI,EAAWzvW,KAAK0vW,YAAYH,EAAgB,GAChDvvW,KAAKk4H,OAAO5vD,IAAI,2CAA6CmnS,GAC7D,IAAIE,EAAa3vW,KAAK4vW,kBAAkBL,EAAgB,EAAGE,EAAUP,GAUrE,OADAlvW,KAAKy/V,YAAYoQ,6BAA6B,KAAMF,GAR5B,SAAUziW,EAAOqsB,GACjCrsB,aAAiByhnB,IACjBzhnB,EAAM89V,kBAIV99V,EAAMyxV,kBAAkBplU,EAC5B,IAEO,CACHo2U,WAAYA,EACZF,SAAUA,EAElB,EACAZ,EAAcluW,UAAUwuW,wBAA0B,SAAUF,GACxD,IAAIG,EAAe,GACfC,EAAiB,GACjBC,EAAkB,GActB,OAbIL,GACAjvW,KAAKy/V,YAAYoQ,6BAA6B,KAAMZ,GAAc,SAAUxhV,GACxE,GAAIA,aAAgBkhmB,GAAqB,CACrC,IAAIjld,EAAQj8I,EACZ4hV,EAAe5tW,KAAKioK,EACxB,KACK,CACD,IAAIr0G,EAAM5nC,EACV6hV,EAAgB7tW,KAAK4zD,EAAI1tB,SACzBynU,EAAa3tW,KAAK4zD,EACtB,CACJ,IAEG,CAAE+5S,aAAcA,EAAcC,eAAgBA,EAAgBC,gBAAiBA,EAC1F,EACAT,EAAcluW,UAAUmvW,oBAAsB,SAAUC,EAAeC,GACnE,IAAI/5V,EAAQjW,KACRiwW,EAAsB,GAK1B,OAJAF,EAAc1tW,SAAQ,SAAUgzD,GAC5B,IAAI66S,EAAej6V,EAAMk6V,wBAAwBH,EAAkB36S,GACnE46S,EAAoBxuW,KAAKyuW,EAC7B,IACOD,CACX,EACApB,EAAcluW,UAAUwvW,wBAA0B,SAAUC,EAAoBhtW,GAI5E,IAHA,IAEIitW,EAAYjtW,EACPzB,EAHE3B,KAAKswW,UAAUF,GAGN,EAAGzuW,GAAK,EAAGA,IAAK,CAChC,IAAI4uW,EAAY,IAAIo+Q,GAAoB,KAAM,aAAevrnB,EAAOukC,QAAU,KAAOhmC,GAAG,EAAMA,GAC9F3B,KAAK+C,QAAQsyV,WAAWkb,GACxBA,EAAUxF,YAAY,CAACsF,IACvBA,EAAU1R,kBAAkB4R,GAC5BF,EAAYE,CAChB,CAEA,OAAOF,CACX,EACAxB,EAAcluW,UAAU2vW,UAAY,SAAUF,GAG1C,IAFA,IAAII,EAAO,EACPrD,EAAUiD,EACPjD,GAAWA,EAAQ,IAAMA,EAAQ,aAAcwhR,IAClDn+Q,IACArD,EAAUA,EAAQ,GAAGp8O,cAEzB,OAAOy/O,CACX,EACA3B,EAAcluW,UAAUivW,kBAAoB,SAAUL,EAAgBkB,EAAaC,EAAYxB,GAI3F,IAHA,IAAI1nW,EAAS,GAGJ7F,EAAI,EAAGA,EAAI4tW,EAAejuW,OAAQK,IAAK,CAC5C,IAAIuL,EAAQqiW,EAAe5tW,GAC3B,GAAIuL,aAAiByhnB,GAAqB,CAEtC,IAAIh+Q,EAAgBzjW,EAChB0jW,EAAc5wW,KAAK4vW,kBAAkBe,EAAc5/O,cAAe0/O,EAAc,EAAGC,EAAYxB,GACnGyB,EAAc5F,YAAY6F,GAC1BppW,EAAO/F,KAAKkvW,EAChB,KACK,CAKD,IAHA,IAAIE,OAAmB,EACnBC,OAAqB,EAEhB/uS,EAAI2uS,EAAa,EAAG3uS,GAAK0uS,EAAa1uS,IAAK,CAChD,IAAIgvS,EAAW7B,EAAiBzf,aAAa,KAAM,MAC/CuhB,EAAoBhxW,KAAKixW,wBAAwB,MACjDC,EAAc,IAAIy9Q,GAAoB39Q,EAAmBD,GAAU,EAAMN,GAC7EzwW,KAAK+C,QAAQsyV,WAAW6b,GACpBJ,GACAA,EAAmB/F,YAAY,CAACmG,IAEpCJ,EAAqBI,EAChBL,IACDA,EAAmBC,EAE3B,CAEA,GAAID,GAAoBC,EAAoB,CAGxC,GAFAtpW,EAAO/F,KAAKovW,GACItB,EAAe97U,MAAK,SAAU09U,GAAQ,OAAOA,aAAgBw9Q,EAAqB,IACnF,CACX79Q,EAAmB/F,YAAY,CAAC79V,IAChC,QACJ,CAEI4jW,EAAmB/F,YAAYwE,GAC/B,KAER,CACA/nW,EAAO/F,KAAKyL,EAChB,CACJ,CACA,OAAO1F,CACX,EACAqnW,EAAcluW,UAAU+uW,YAAc,SAAU0B,EAAcZ,GAE1D,IADA,IAAIa,EAAmBb,EACd7uW,EAAI,EAAGA,EAAIyvW,EAAa9vW,OAAQK,IAAK,CAC1C,IAAI4pW,EAAiB6F,EAAazvW,GAClC,GAAI4pW,aAA0BojR,GAAqB,CAC/C,IAAIh+Q,EAAgBpF,EAChB+F,EAAUtxW,KAAK0vW,YAAYiB,EAAc5/O,cAAey/O,EAAO,GAC/Da,EAAmBC,IACnBD,EAAmBC,EAE3B,CACJ,CACA,OAAOD,CACX,EACAxC,EAAcluW,UAAU6uW,yBAA2B,SAAUT,EAAM3tS,EAAO4tS,EAAgBuC,EAAkBrC,EAAkBG,GAC1H,IAAIp5V,EAAQjW,KACRwH,EAAS,GACb,OAAKunW,GAGLA,EAAK1sW,SAAQ,SAAUq2I,GACnB,IAAI84N,EAEAA,EADAv7V,EAAMw7V,cAAc/4N,GACDziI,EAAMy7V,kBAAkB1C,EAAgBt2N,EAAKt3E,EAAOmwS,EAAkBrC,EAAkBG,GAGxFp5V,EAAM07V,aAAa3C,EAAgBt2N,EAAK64N,EAAkBrC,GAEjF1nW,EAAO/F,KAAK+vW,EAChB,IACOhqW,GAZIA,CAaf,EACAqnW,EAAcluW,UAAU+wW,kBAAoB,SAAU1C,EAAgBtE,EAAatpS,EAAOwwS,EAAiB1C,EAAkBG,GACzH,IAAI2B,EAAoBhxW,KAAKixW,wBAAwBvG,GACjDrC,EAAU6G,EAAiBzf,aAAauhB,EAAkB3I,SAAW,KAAM,MAC3EsI,EAAgB,IAAIg+Q,GAAoB39Q,EAAmB3I,GAAS,EAAOjnS,GAC/EphE,KAAK+C,QAAQsyV,WAAWsb,GACxB,IAAIkB,EAAgB7xW,KAAK8xW,kBAAkBpH,EAAa2E,GACpDwC,GAAiBA,EAAc7H,cAC/B2G,EAAc1G,aAAY,GAE9B,IAAIt/V,EAAW3K,KAAKwvW,yBAAyBwB,EAAkBrmW,SAAUy2D,EAAQ,EAAG4tS,EAAgB4C,EAAiB1C,EAAkBG,GAEvI,OADAsB,EAAc5F,YAAYpgW,GACnBgmW,CACX,EACA9B,EAAcluW,UAAUswW,wBAA0B,SAAUvG,GACxD,IAAIsG,EAAoB,CAAC,EAIzB,OAHAxjW,EAAOwjW,EAAmBhxW,KAAKg6V,mBAAmB+X,yBAClDvkW,EAAOwjW,EAAmBtG,GAC1B1qW,KAAKgyW,wBAAwBhB,GACtBA,CACX,EACAnC,EAAcluW,UAAUgxW,aAAe,SAAU3C,EAAgB5R,EAAQmU,EAAkBrC,GACvF,IAAI+C,EAAejyW,KAAKkyW,aAAa9U,GACrCp9V,KAAKgyW,wBAAwBC,GAE7B,IAAI7uW,EAASpD,KAAKmyW,mBAAmB/U,EAAQmU,GAC7C,GAAKnuW,EAODA,EAAOm7V,UAAU0T,EAAc7U,GAC/Bp9V,KAAKoyW,iBAAiBhvW,EAAQ6uW,OARrB,CAET,IAAIviB,EAAQwf,EAAiBzf,aAAawiB,EAAaviB,MAAOuiB,EAAatpI,OAC3EvlO,EAAS,IAAI+5V,GAAO8U,EAAc7U,EAAQ1N,EAAOsf,GACjDhvW,KAAK+C,QAAQsyV,WAAWjyV,EAC5B,CAKA,OAAOA,CACX,EACAyrW,EAAcluW,UAAUyxW,iBAAmB,SAAUhvW,EAAQg6V,GAEzD,IAAI7qT,EAAO47S,EAAaiP,EAAO7qT,MAM/B,QALaryC,IAATqyC,GACAnvC,EAAOijW,QAAQ9zT,GAGCnvC,EAAOgjW,WAAa,EACrB,CAEf,IAAI93U,EAAQ6/T,EAAaiP,EAAO9uU,OAChC,GAAa,MAATA,EACAlrB,EAAOu8V,eAAerxU,OAErB,CAGD,IAAIugmB,EAAoBzrnB,EAAOqiW,iBAC/BriW,EAAOu8V,eAAekvR,EAC1B,CACJ,MAEoB3unB,IAAhBk9V,EAAOrqU,OACHqqU,EAAOrqU,MAAQ8nU,GAAUuB,UAAYgB,EAAOrqU,MAAQ8nU,GAAUwB,UAC9Dj5V,EAAOs/V,QAAQtF,EAAOrqU,MAGtB3vB,EAAOs/V,aAAQxiW,IAIvB,IAAI69V,EAAY5P,EAAaiP,EAAOW,gBAClB79V,IAAd69V,GACA36V,EAAOggW,aAAarF,GAGxB,IAAIn5T,EAAOypT,EAAc+O,EAAOx4T,WACnB1kC,IAAT0kC,GACAxhC,EAAO8hW,YAAYtgU,QAGD1kC,IAAlBk9V,EAAOe,QACP/6V,EAAOg7V,UAAUhB,EAAOe,OAEhC,EACA0Q,EAAcluW,UAAUwxW,mBAAqB,SAAUE,EAAWd,GAC9D,IAAInpS,EAAM3nD,EAAK8wV,GAAkB,SAAUe,GACvC,IAAIC,EAAiBD,EAAY9T,wBACjC,IAAK+T,EACD,OAAO,EAEX,IAAIC,EAA8B,MAAnBH,EAAU3iB,MACrB+iB,EAAiC,MAAnBJ,EAAU1pI,MAC5B,OAAI6pI,EACOF,EAAY3qU,UAAY0qU,EAAU3iB,MAEzC+iB,EACOF,EAAe5pI,QAAU0pI,EAAU1pI,MAG1C4pI,IAAmBF,CAI3B,IAMA,OAHId,GAAoBnpS,GACpB6nR,EAAgBshB,EAAkBnpS,GAE/BA,CACX,EACAymS,EAAcluW,UAAUmxW,kBAAoB,SAAUY,EAAarD,GAC/D,IAAIjnS,EAAM3nD,EAAK4uV,GAAgB,SAAUwC,GAErC,QADkBA,EAAchI,qBAIM,MAAvB6I,EAAYrK,UAEhBwJ,EAAclqU,UAAY+qU,EAAYrK,QAGrD,IAMA,OAHIjgS,GACA6nR,EAAgBof,EAAgBjnS,GAE7BA,CACX,EACAymS,EAAcluW,UAAUuxW,aAAe,SAAU9U,GAE7C,IAAI6U,EAAe,CAAC,EAEhBU,EAAgB3yW,KAAKg6V,mBAAmB4Y,mBAC5CzgB,EAAU8f,EAAcU,GAAe,GAAO,GAE9C,IAAIE,EAAazV,EAAOj0V,KAUxB,OATK0pW,IACDA,EAAaF,GAAiBA,EAAcxpW,MAG5C0pW,GACA7yW,KAAK8yW,kBAAkBD,EAAYZ,GAGvC9f,EAAU8f,EAAc7U,GAAQ,GAAO,GAChC6U,CACX,EACApD,EAAcluW,UAAUmyW,kBAAoB,SAAU3pW,EAAM8oW,GACxD,IAAIc,EAAW,GACf,GAAI5pW,aAAgBlF,MAAO,CACJkF,EAAKsqB,MAAK,SAAUmK,GAAK,MAAoB,kBAANA,CAAgB,IAEtE4tB,QAAQC,KAAK,gFAGbsnT,EAAW5pW,CAEnB,KACK,IAAoB,kBAATA,EAKZ,YADAqiD,QAAQC,KAAK,gEAHbsnT,EAAW5pW,EAAK3F,MAAM,IAK1B,CAEA,IAAIwvW,EAAiBxlW,EAAO,CAAC,EAAGk+V,IAEhCla,EADgBxxV,KAAKg6V,mBAAmBiZ,kBAAoB,CAAC,GACpC,SAAU1yW,EAAKyF,GAChCzF,KAAOyyW,EACPxnT,QAAQC,KAAK,6BAA+BlrD,EAAM,wDAGlDyyW,EAAezyW,GAAOyF,CAE9B,IACA+sW,EAAS1wW,SAAQ,SAAUmzD,GACvB,IAAI09S,EAAaF,EAAex9S,EAAExe,QAC9Bk8T,EACA/gB,EAAU8f,EAAciB,GAAY,GAAO,GAG3C1nT,QAAQC,KAAK,yBAA2B+J,EAAI,2DAEpD,GACJ,EACAq5S,EAAcluW,UAAUqxW,wBAA0B,SAAU5U,GACxD,GAAIA,EAAQ,CACR,IAAI+V,EAAe/V,OACQl9V,IAAvBizW,EAAazpM,OACbl+G,QAAQC,KAAK,sHAEgBvrD,IAA7BizW,EAAaC,aACb5nT,QAAQC,KAAK,4HAEoBvrD,IAAjCizW,EAAa3H,iBACbhgT,QAAQC,KAAK,2JAEqBvrD,IAAlCizW,EAAaE,kBACb7nT,QAAQC,KAAK,uFAEwBvrD,IAArCizW,EAAaG,qBACb9nT,QAAQC,KAAK,sFAEb0nT,EAAaE,kBAAoBF,EAAaG,sBAC9C9nT,QAAQC,KAAK,wIAEb0nT,EAAalrV,cACbujC,QAAQC,KAAK,8BAAgC0nT,EAAalrV,YAAc,+DACxEkrV,EAAaI,WAAaJ,EAAalrV,YAE/C,CACJ,EAEA4mV,EAAcluW,UAAU8wW,cAAgB,SAAU+B,GAC9C,YAAmCtzW,IAA5BszW,EAAe7oW,QAC1B,EACAgkW,GAAa,CACTjW,GAAU,gBACXmW,EAAcluW,UAAW,mBAAe,GAC3CguW,GAAa,CACTC,GAAU,EAAG5V,GAAU,mBACxB6V,EAAcluW,UAAW,WAAY,MACxCkuW,EAAgBF,GAAa,CACzBnW,GAAK,kBACNqW,EAEP,CAzYkC,CAyYhCf,IAQE2F,GAAwB,WACxB,SAASA,IACT,CAmJA,OAhJAA,EAAOC,gCAAkC,0BAEzCD,EAAOE,yBAA2B,mBAElCF,EAAOG,gCAAkC,yBAEzCH,EAAOI,+BAAiC,wBAExCJ,EAAOK,0BAA4B,sBAEnCL,EAAOM,2BAA6B,qBAEpCN,EAAOO,2BAA6B,qBAEpCP,EAAOQ,2BAA6B,qBAEpCR,EAAOS,mBAAqB,cAE5BT,EAAOU,qBAAuB,gBAE9BV,EAAOW,oBAAsB,eAE7BX,EAAOY,0BAA4B,oBAEnCZ,EAAOa,qBAAuB,gBAE9Bb,EAAOc,gCAAkC,0BAEzCd,EAAOe,8BAAgC,wBAEvCf,EAAOgB,iCAAmC,2BAE1ChB,EAAOiB,uBAAyB,iBAEhCjB,EAAOkB,uBAAyB,iBAEhClB,EAAOmB,uBAAyB,iBAEhCnB,EAAOoB,8BAAgC,uBAEvCpB,EAAOqB,8BAAgC,wBAEvCrB,EAAOsB,oBAAsB,eAE7BtB,EAAOuB,oCAAsC,6BAE7CvB,EAAOwB,4BAA8B,sBAErCxB,EAAOyB,sBAAwB,iBAE/BzB,EAAO0B,iCAAmC,0BAC1C1B,EAAOq7Q,mCAAqC,2BAC5Cr7Q,EAAOs7Q,iCAAmC,yBAE1Ct7Q,EAAO2B,oBAAsB,eAC7B3B,EAAO4B,kBAAoB,aAC3B5B,EAAO6B,gBAAkB,WACzB7B,EAAO8B,iBAAmB,YAC1B9B,EAAO+B,eAAiB,UACxB/B,EAAOgC,mBAAqB,cAC5BhC,EAAOiC,0BAA4B,oBACnCjC,EAAOkC,sBAAwB,gBAC/BlC,EAAOmC,wBAA0B,kBACjCnC,EAAOoC,yBAA2B,mBAClCpC,EAAOqC,wBAA0B,kBACjCrC,EAAOsC,mBAAqB,cAC5BtC,EAAOuC,mBAAqB,cAC5BvC,EAAOwC,wBAA0B,mBACjCxC,EAAOyC,oBAAsB,cAC7BzC,EAAO0C,qBAAuB,eAC9B1C,EAAO2C,sBAAwB,gBAC/B3C,EAAO4C,qBAAuB,eAE9B5C,EAAOpP,qBAAuB,gBAE9BoP,EAAO6C,sBAAwB,iBAC/B7C,EAAO8C,oBAAsB,eAC7B9C,EAAO9Q,mBAAqB,cAE5B8Q,EAAO+C,0BAA4B,oBACnC/C,EAAOgD,kBAAoB,aAC3BhD,EAAOiD,yBAA2B,mBAElCjD,EAAOkD,iBAAmB,YAG1BlD,EAAOmD,wBAA0B,kBAEjCnD,EAAOoD,uBAAyB,kBAEhCpD,EAAOqD,8BAAgC,wBAEvCrD,EAAOsD,0BAA4B,oBAEnCtD,EAAOuD,mBAAqB,cAE5BvD,EAAOwD,mBAAqB,cAC5BxD,EAAOyD,uBAAyB,kBAChCzD,EAAO0D,0BAA4B,oBACnC1D,EAAO2D,0BAA4B,oBACnC3D,EAAO4D,2BAA6B,qBACpC5D,EAAO6D,2BAA6B,qBAEpC7D,EAAO8D,kBAAoB,aAE3B9D,EAAOu7Q,sBAAwB,gBAC/Bv7Q,EAAOgE,2BAA6B,qBAGpChE,EAAOiE,yBAA2B,oBAIlCjE,EAAOkE,8BAAgC,wBAKvClE,EAAOmE,0BAA4B,oBACnCnE,EAAOoE,sCAAwC,+BAC/CpE,EAAOqE,gCAAkC,0BACzCrE,EAAOsE,2BAA6B,qBACpCtE,EAAOuE,kBAAoB,aAC3BvE,EAAOwE,sCAAwC,+BAC/CxE,EAAOw7Q,6BAA+B,uBACtCx7Q,EAAOy7Q,gCAAkC,yBACzCz7Q,EAAO07Q,iCAAmC,0BAC1C17Q,EAAO27Q,mCAAqC,4BAC5C37Q,EAAOyE,qBAAuB,eAC9BzE,EAAO0E,oBAAsB,cAC7B1E,EAAO2E,qBAAuB,eAC9B3E,EAAO4E,mBAAqB,aAE5B5E,EAAO6E,qBAAuB,eAI9B7E,EAAO8E,sCAAwC,8BAC/C9E,EAAO+E,kCAAoC,2BAC3C/E,EAAOgF,kCAAoC,2BAC3ChF,EAAOiF,qCAAuC,6BAC9CjF,EAAOkF,qBAAuB,gBAC9BlF,EAAOmF,kBAAoB,aAC3BnF,EAAOoF,oBAAsB,eACtBpF,CACX,CAtJ2B,GAwKvBqF,GAAwC,WACxC,SAASA,IAEL94W,KAAK+4W,YAAc,CAAC,CACxB,CAcA,OAbAD,EAAuBn4W,UAAUq4W,oBAAsB,SAAUz4W,GAC7D,IACIiH,EADA80O,EAAat8O,KAAK+4W,YAAYx4W,GAUlC,OANIiH,EAFsB,kBAAf80O,EAEE,EAGAA,EAAa,EAE1Bt8O,KAAK+4W,YAAYx4W,GAAOiH,EACjBA,CACX,EACOsxW,CACX,CAnB2C,GA2BvCG,GAAkB,WAIlBC,GAAe,CACf,IAAK,QACL,IAAK,OACL,IAAK,OACL,IAAK,SACL,IAAK,SA2FT,SAASm2Q,GAAa/pnB,EAAKG,GAEvB,GADAA,EAAM0jB,KAAKu+B,MAAMjiD,GACE,IAAfH,EAAIhE,QAAwB,IAARmE,EACpB,MAAO,GAEX,IAAIqzQ,EAAWxzQ,EAAIhE,OAASmE,EAE5B,IADAA,EAAM0jB,KAAKu+B,MAAMv+B,KAAKm/C,IAAI7iE,GAAO0jB,KAAKm/C,IAAI,IACnC7iE,GACHH,GAAOA,EACPG,IAGJ,OADAH,GAAOA,EAAIkrC,UAAU,EAAGsoO,EAAWxzQ,EAAIhE,OAE3C,CAOA,SAAS6kN,GAAS7gN,EAAKu2I,EAAayze,GAChC,OAAIhqnB,EAAIhE,OAASu6I,EACNv2I,IAEXu2I,GAAev2I,EAAIhE,QACDgunB,EAAOhunB,SACrBgunB,GAAUD,GAAaC,EAAQzze,EAAcyze,EAAOhunB,SAEjDgunB,EAAOr+mB,MAAM,EAAG4qI,GAAev2I,EAC1C,CAOA,SAAS6zW,GAAkB7zW,GACvB,OAAY,OAARA,QAAwBpF,IAARoF,EACT,KAEJA,EAAIa,QAAQ,YAAY,SAAUuuC,GAAK,MAAO,IAAMA,EAAE,GAAGtuC,aAAe,GACnF,CAOA,SAASgzW,GAAkB9zW,GACvB,OAAY,OAARA,QAAwBpF,IAARoF,EACT,KAEJA,EAAIa,QAAQ,aAAa,SAAUuuC,GAAK,OAAOA,EAAE,GAAGiB,aAAe,GAC9E,CACA,SAAS4kU,GAAWj1W,GAChB,OAAOA,EAAI,GAAGqwC,cAAgBrwC,EAAI4uD,OAAO,GAAG9tD,aAChD,CACA,SAASizW,GAAaC,GAIlB,OAAmB,MAAZA,EAAmB,KAAOA,EAAS5zW,WAAWA,WAAWS,QAAQ8yW,IAAiB,SAAUM,GAAO,OAAOL,GAAaK,EAAM,GACxI,CAOA,SAASC,GAAqBC,GAC1B,IAAKA,GAA0B,MAAbA,EACd,OAAO,KAIX,OADYA,EAAUtzW,QADZ,wCACyB,eAAeA,QAAQ,IAAK,KAAK3C,MAAM,KAC7DyJ,KAAI,SAAUysW,GAAQ,OAAOA,EAAKlpU,UAAU,EAAG,GAAGmF,eAAkB+jU,EAAKp4W,OAAS,EAAKo4W,EAAKlpU,UAAU,EAAGkpU,EAAKp4W,QAAU,GAAK,IAAG4K,KAAK,IACtJ,CACA,SAASu1D,GAAWn8D,EAAKq0W,GACrB,OAAIr0W,IAAQq0W,GAGE,MAAPr0W,GAAeA,EAAI2L,MAAM,EAAG0oW,EAAWr4W,UAAYq4W,CAC9D,CAEA,IAAIC,GAA2B1xW,OAAO43E,OAAO,CACzCp9D,UAAW,KACXm3V,YAzKJ,SAAqBtqU,GACjB,IAAIuqU,EAAqB5wV,OAAOujD,aAqChC,SAASstS,EAAWC,EAAOhhQ,GACvB,OAAO8gQ,EAAqBE,GAAShhQ,EAAS,GAAQ,IAC1D,CACA,SAASihQ,EAAgBD,GACrB,GAAKA,GAAS,GAAKA,GAAS,IAAgB,KAAVA,EAG9B,MAAO,KADU7zJ,GADG6zJ,EAAMt0W,SAAS,IAAIiwC,cACE,EAAG,KACjB,IAE/B,GAA4B,IAAf,WAARqkU,GACD,OAAOF,EAAmBE,GAE9B,IAAI9rS,EAAS,GAeb,OAd4B,IAAf,WAAR8rS,GACD9rS,EAAS4rS,EAAqBE,GAAS,EAAK,GAAQ,KAEvB,IAAf,WAARA,KAtBd,SAA0BA,GACtB,GAAIA,GAAS,OAAUA,GAAS,MAC5B,MAAMljW,MAAM,oBAAsBkjW,EAAMt0W,SAAS,IAAIiwC,cACjD,yBAEZ,CAkBQukU,CAAiBF,GACjB9rS,EAAS4rS,EAAqBE,GAAS,GAAM,GAAQ,KACrD9rS,GAAU6rS,EAAWC,EAAO,IAEC,IAAf,WAARA,KACN9rS,EAAS4rS,EAAqBE,GAAS,GAAM,EAAQ,KACrD9rS,GAAU6rS,EAAWC,EAAO,IAC5B9rS,GAAU6rS,EAAWC,EAAO,IAEhC9rS,GAAU4rS,EAA4B,GAARE,EAAgB,IAElD,CAMA,IALA,IAAIG,EAjEJ,SAAoBlzW,GAChB,IAAI2qF,EAAS,GACb,IAAK3qF,EACD,MAAO,GAMX,IAJA,IAEIjB,EACAo0W,EAHA30W,EAAMwB,EAAO3F,OACb8lC,EAAU,EAGPA,EAAU3hC,IACbO,EAAQiB,EAAOjF,WAAWolC,OACb,OAAUphC,GAAS,OAAUohC,EAAU3hC,EAGxB,QAAX,OADb20W,EAAQnzW,EAAOjF,WAAWolC,OAEtBwqD,EAAOnwF,OAAe,KAARuE,IAAkB,KAAe,KAARo0W,GAAiB,QAKxDxoR,EAAOnwF,KAAKuE,GACZohC,KAIJwqD,EAAOnwF,KAAKuE,GAGpB,OAAO4rF,CACX,CAoCiByoR,CAAW9qU,GACxBjuC,EAAS64W,EAAW74W,OACpBkP,GAAS,EAET8pW,EAAa,KACR9pW,EAAQlP,GAEbg5W,GAAcL,EADFE,EAAW3pW,IAG3B,OAAO8pW,CACX,EA6FI+0Q,aAAcA,GACdlpa,SAAUA,GACVgzJ,kBAAmBA,GACnBC,kBAAmBA,GACnBmB,WAAYA,GACZlB,aAAcA,GACdG,qBAAsBA,GACtB/3S,WAAYA,KAShB,SAAS8tjB,GAAavjnB,GAClB,IAAIiB,EAAM,IAAIiK,IAEd,OADAlL,EAAI3J,SAAQ,SAAUs1C,GAAQ,OAAO1qC,EAAImK,IAAIugC,EAAK,GAAIA,EAAK,GAAK,IACzD1qC,CACX,CAaA,IAAIgrY,GAAwB/vY,OAAO43E,OAAO,CACtCp9D,UAAW,KACX6smB,aAAcA,GACdC,QAdJ,SAAiBxjnB,EAAKyV,GAClB,IAAIxU,EAAM,IAAIiK,IAEd,OADAlL,EAAI3J,SAAQ,SAAUorB,GAAQ,OAAOxgB,EAAImK,IAAIqK,EAASgM,GAAOA,EAAO,IAC7DxgB,CACX,EAWIlC,KAVJ,SAAckC,GACV,IAAIjB,EAAM,GAEV,OADAiB,EAAI5K,SAAQ,SAAUiM,EAAG/N,GAAO,OAAOyL,EAAIvK,KAAKlB,EAAM,IAC/CyL,CACX,IAeIwuW,GAAoD,WACpD,IAAI/M,EAAgB,SAAU7jS,EAAG/rC,GAI7B,OAHA4vU,EAAgBvlW,OAAOsa,gBAClB,CAAEE,UAAW,cAAgBze,OAAS,SAAU2lE,EAAG/rC,GAAK+rC,EAAElnD,UAAYmb,CAAG,GAC1E,SAAU+rC,EAAG/rC,GAAK,IAAK,IAAI5a,KAAK4a,EAAOA,EAAE11B,eAAe8a,KAAI2mD,EAAE3mD,GAAK4a,EAAE5a,GAAI,EACtEwqV,EAAc7jS,EAAG/rC,EAC5B,EACA,OAAO,SAAU+rC,EAAG/rC,GAEhB,SAAS6wU,IAAO1uW,KAAKkV,YAAc00D,CAAG,CADtC6jS,EAAc7jS,EAAG/rC,GAEjB+rC,EAAEjpE,UAAkB,OAANk9B,EAAa31B,OAAOyb,OAAOka,IAAM6wU,EAAG/tW,UAAYk9B,EAAEl9B,UAAW,IAAI+tW,EACnF,CACH,CAZuD,GAapD+L,GAAsD,SAAUthB,EAAY5tV,EAAQhL,EAAKwiB,GACzF,IAA2H6mD,EAAvHhc,EAAIlkD,UAAUpI,OAAQ0vF,EAAIpjC,EAAI,EAAIriD,EAAkB,OAATwX,EAAgBA,EAAO7a,OAAOkD,yBAAyBG,EAAQhL,GAAOwiB,EACrH,GAAuB,kBAAZtO,SAAoD,oBAArBA,QAAQ07B,SAAyB6gD,EAAIv8E,QAAQ07B,SAASgpT,EAAY5tV,EAAQhL,EAAKwiB,QACpH,IAAK,IAAIphB,EAAIw3V,EAAW73V,OAAS,EAAGK,GAAK,EAAGA,KAASioE,EAAIuvR,EAAWx3V,MAAIqvF,GAAKpjC,EAAI,EAAIgc,EAAEonB,GAAKpjC,EAAI,EAAIgc,EAAEr+D,EAAQhL,EAAKywF,GAAKpnB,EAAEr+D,EAAQhL,KAASywF,GAChJ,OAAOpjC,EAAI,GAAKojC,GAAK9oF,OAAOyD,eAAeJ,EAAQhL,EAAKywF,GAAIA,CAChE,EACI0pR,GAAgD,SAAUvjB,EAAYkC,GACtE,OAAO,SAAU9tV,EAAQhL,GAAO84V,EAAU9tV,EAAQhL,EAAK42V,EAAa,CACxE,EACIynC,GAA4D,WAC5D,IAAK,IAAIrvV,EAAI,EAAG5tC,EAAI,EAAGk9X,EAAKn1X,UAAUpI,OAAQK,EAAIk9X,EAAIl9X,IAAK4tC,GAAK7lC,UAAU/H,GAAGL,OACxE,IAAI0vF,EAAI/sF,MAAMsrC,GAAIhqC,EAAI,EAA3B,IAA8B5D,EAAI,EAAGA,EAAIk9X,EAAIl9X,IACzC,IAAK,IAAIi8B,EAAIl0B,UAAU/H,GAAIogE,EAAI,EAAG+8T,EAAKlhW,EAAEt8B,OAAQygE,EAAI+8T,EAAI/8T,IAAKx8D,IAC1DyrF,EAAEzrF,GAAKq4B,EAAEmkC,GACjB,OAAOivB,CACX,EACIy+hB,GAA6B,SAAU35mB,GAEvC,SAAS25mB,IACL,IAAIx5mB,EAAmB,OAAXH,GAAmBA,EAAOlM,MAAM5J,KAAM0J,YAAc1J,KAiChE,OA/BAiW,EAAM2kW,sBAAwB,EAC9B3kW,EAAM4kW,wBAA0B,EAChC5kW,EAAM6kW,yBAA0B,EAEhC7kW,EAAM8kW,mBAAqB,EAE3B9kW,EAAM+kW,qBAAuB,GAC7B/kW,EAAMglW,sBAAwB,GAC9BhlW,EAAMilW,uBAAyB,GAE/BjlW,EAAMklW,iBAAmB,GAEzBllW,EAAMmlW,6BAA+B,CAAC,EAEtCnlW,EAAMolW,gBAAkB,GAExBplW,EAAMqlW,sBAAwB,GAC9BrlW,EAAMy5mB,6BAA8B,EACpCz5mB,EAAMslW,gBAAkB,GACxBtlW,EAAMulW,aAAe,GACrBvlW,EAAMwlW,aAAe,GACrBxlW,EAAMonJ,OAAQ,EACdpnJ,EAAMylW,wBAAyB,EAC/BzlW,EAAM0lW,yBAA0B,EAChC1lW,EAAM2lW,WAAY,EAClB3lW,EAAM4lW,UAAY,EAClB5lW,EAAM6lW,UAAY,EAClB7lW,EAAM8lW,WAAa,EACnB9lW,EAAM+lW,gBAAiB,EACvB/lW,EAAMgmW,cAAgB,EACtBhmW,EAAMimW,8BAA+B,EAC9BjmW,CACX,CA0+FA,OA9gGAukW,GAAYi1Q,EAAa35mB,GAqCzB25mB,EAAY9unB,UAAU+0E,KAAO,WACzB11E,KAAKm8W,6BAA+Bn8W,KAAKg6V,mBAAmBoiB,iCAC5D,IAAIR,EAAY57W,KAAKg6V,mBAAmBqiB,cACpCr8W,KAAKs8W,sBAAsBV,KAC3B57W,KAAK47W,UAAYA,GAErB57W,KAAKu8W,cAAgBv8W,KAAKg6V,mBAAmB8G,aAC7C9gW,KAAKquW,mBAAmBruW,KAAKg6V,mBAAoB,qBAAsBh6V,KAAKw8W,4BAA4BxpU,KAAKhzC,MACjH,EACAyvnB,EAAY9unB,UAAU67W,4BAA8B,WAChDx8W,KAAK07W,wBAAyB,EAC9B17W,KAAK27W,yBAA0B,EAC/B37W,KAAKy8W,oBACLz8W,KAAK08W,uBAAuB,qBAChC,EACA+yQ,EAAY9unB,UAAUg8W,iBAAmB,WACrC,OAAO38W,KAAKi8W,aAChB,EACAwzQ,EAAY9unB,UAAUi8W,cAAgB,SAAUC,EAAYrxW,GACxD,IAAIyK,EAAQjW,UACG,IAAXwL,IAAqBA,EAAS,OAClC,IAAIsxW,IAA0B98W,KAAK68W,WACnC78W,KAAKi8W,gBACL,IAAIc,EAAkB/8W,KAAKg9W,kCAAkCxxW,GAC7DxL,KAAK68W,WAAaA,EAGlB78W,KAAKi9W,WAAWC,SAIhBl9W,KAAK07W,wBAAyB,EAC9B,IAAIyB,EAAoBn9W,KAAKgvW,eACzBoO,EAAiBp9W,KAAKq9W,kBACtBC,EAAqBt9W,KAAKu9W,cAAczO,iBAAiB+N,GAAY,EAAMO,GAC/Ep9W,KAAKq9W,kBAAoBC,EAAmB3N,WAC5C3vW,KAAK46W,sBAAwB0C,EAAmB7N,SAAW,EAC3DzvW,KAAKgvW,eAAiBhvW,KAAKw9W,mBAAmBx9W,KAAKq9W,mBACnDr9W,KAAKy9W,kBAAoB,CAAC,EAC1Bz9W,KAAKgvW,eAAe3sW,SAAQ,SAAUgzD,GAAO,OAAOp/C,EAAMwnW,kBAAkBpoT,EAAI1tB,SAAW0tB,CAAK,IAChGr1D,KAAK09W,uBAAuBlyW,EAAQ2xW,GACpCn9W,KAAK29W,oBAAoBnyW,EAAQ2xW,GACjCn9W,KAAK49W,oBAAoBpyW,EAAQ2xW,GACjCn9W,KAAKq9J,OAAQ,EACbr9J,KAAKy8W,oBACDK,GAAyB98W,KAAK69W,qBAAuB79W,KAAKg6V,mBAAmB21R,yBAC7E3vnB,KAAK+9W,8BAET/9W,KAAK08W,uBAAuBlxW,GAC5BxL,KAAKg+W,uBAGLh+W,KAAKi+W,0BAA0BzyW,GAC/BuxW,IACA/8W,KAAKk+W,0BACT,EACAuxQ,EAAY9unB,UAAUu9W,yBAA2B,WAC7C,IAAIC,EAAwB,CACxBh1W,KAAMsqW,GAAOE,yBACbtoU,IAAKrrC,KAAKwiW,QACVtB,UAAWlhW,KAAKkhW,WAEpBlhW,KAAK09V,aAAa/2T,cAAcw3U,EACpC,EAEAsxQ,EAAY9unB,UAAUs9W,0BAA4B,SAAUzyW,QACzC,IAAXA,IAAqBA,EAAS,OAClC,IAAI4yW,EAAyB,CACzBj1W,KAAMsqW,GAAOC,gCACbroU,IAAKrrC,KAAKwiW,QACVtB,UAAWlhW,KAAKkhW,UAChB11V,OAAQA,GAEZxL,KAAK09V,aAAa/2T,cAAcy3U,EACpC,EACAqxQ,EAAY9unB,UAAUo9W,4BAA8B,WAChD,IAAI9nW,EAAQjW,KACRgvW,EAAiBhvW,KAAKgvW,eACrBA,GAGLhvW,KAAKq+W,YAAYtrV,MAAK,SAAUurV,EAAMC,GAClC,IAAIC,EAAgBxP,EAAe96V,QAAQoqW,GACvCG,EAAgBzP,EAAe96V,QAAQqqW,GAGvCG,EAAgBF,GAAiB,EACjCG,EAAgBF,GAAiB,EACrC,OAAIC,GAAiBC,EACVH,EAAgBC,EAEvBC,EAEO,EAEPC,GAEQ,EAIK1oW,EAAMooW,YAAYnqW,QAAQoqW,GAC1BroW,EAAMooW,YAAYnqW,QAAQqqW,EAE/C,GACJ,EACAkxQ,EAAY9unB,UAAUivnB,8BAAgC,WAClD,OAAO5vnB,KAAK6vnB,uBAChB,EACAJ,EAAY9unB,UAAUo+W,YAAc,WAC5B/+W,KAAKg6V,mBAAmB8O,eACxB9oW,KAAKg/W,aAAeh/W,KAAK67W,UAAY77W,KAAKi/W,eAAiBj/W,KAAKq6B,YAChEr6B,KAAKk/W,cAAgBl/W,KAAK67W,UAAY77W,KAAKi/W,iBAG3Cj/W,KAAKg/W,aAAeh/W,KAAKi/W,eACzBj/W,KAAKk/W,cAAgBl/W,KAAKq6B,YAAcr6B,KAAKi/W,eAErD,EAEAwwQ,EAAY9unB,UAAUw+W,8BAAgC,SAAU/7W,GAG5D,IAFA,IAAIg8W,EAAgBh8W,EAChBqmG,EAAU,GACU,MAAjB21Q,GACH31Q,EAAQhoG,KAAK29W,GACbA,EAAgBp/W,KAAKq/W,qBAAqBD,GAE9C,OAAO31Q,CACX,EAIAgmhB,EAAY9unB,UAAUq9W,qBAAuB,WAEzC,GAAmC,MAA/Bh+W,KAAKk7W,uBAAT,CAGA,IAAIoE,EAAat/W,KAAKq7W,gBAAgBpuW,KAAI,SAAU7J,GAAU,OAAOA,EAAOukC,OAAS,IAAGz7B,KAAK,KAG7F,GAFAlM,KAAKu/W,kBAEDD,IADYt/W,KAAKq7W,gBAAgBpuW,KAAI,SAAU7J,GAAU,OAAOA,EAAOukC,OAAS,IAAGz7B,KAAK,KAC9D,CAC1B,IAAIwpH,EAAU,CACVvsH,KAAMsqW,GAAOe,8BACbnpU,IAAKrrC,KAAKwiW,QACVtB,UAAWlhW,KAAKkhW,WAEpBlhW,KAAK09V,aAAa/2T,cAAc+uF,EACpC,CAXA,CAYJ,EACA+5f,EAAY9unB,UAAU6+W,oBAAsB,SAAUnlV,EAAa4kV,IAC3D5kV,IAAgBr6B,KAAKq6B,aAAe4kV,IAAmBj/W,KAAKi/W,gBAAkBj/W,KAAKg8W,kBACnFh8W,KAAKq6B,YAAcA,EACnBr6B,KAAKi/W,eAAiBA,EAItBj/W,KAAKg8W,gBAAiB,EACtBh8W,KAAK++W,cACD/+W,KAAKq9J,OACLr9J,KAAKg+W,uBAGjB,EACAyxQ,EAAY9unB,UAAU07W,YAAc,WAChC,OAAOr8W,KAAK47W,SAChB,EACA6zQ,EAAY9unB,UAAU27W,sBAAwB,SAAU1V,GACpD,OAAIA,IAAS5mW,KAAKg6V,mBAAmB8G,eACjCt1S,QAAQC,KAAK,iGACN,EAGf,EACAgkkB,EAAY9unB,UAAU8+W,aAAe,SAAU7D,EAAWpwW,GAEtD,QADe,IAAXA,IAAqBA,EAAS,OAC9BowW,IAAc57W,KAAK47W,WAAc57W,KAAKs8W,sBAAsBt8W,KAAK47W,WAArE,CAGA57W,KAAK47W,UAAYA,EAIjB57W,KAAK07W,wBAAyB,EAC9B17W,KAAKy8W,oBACLz8W,KAAK08W,uBAAuBlxW,GAC5B,IAAI86B,EAAQ,CACRn9B,KAAMsqW,GAAOG,gCACbvoU,IAAKrrC,KAAKwiW,QACVtB,UAAWlhW,KAAKkhW,WAEpBlhW,KAAK09V,aAAa/2T,cAAcL,EAbhC,CAcJ,EACAmplB,EAAY9unB,UAAU++W,wBAA0B,SAAUC,EAAWC,GACjE,IAAK5/W,KAAK86W,0BAA4B96W,KAAK6/W,iBACvC,OAAO,KAEX,IAAIC,EAAoB9/W,KAAK+/W,iBAAiBH,GAC1CI,EAAc,KAUlB,OATAhgX,KAAK6/W,iBAAiBx9W,SAAQ,SAAUe,GACpC,IAAI68W,EAAgB78W,EAAOgiW,YAAYua,UACnCO,EAAmB98W,EAAOgiW,YAAY8a,iBACpBnwB,EAASkwB,EAAeN,IACtBO,IAAqBJ,IAEzCE,EAAc58W,EAEtB,IACO48W,CACX,EACAyvQ,EAAY9unB,UAAUm5V,SAAW,SAAUC,GACvC/5V,KAAKk4H,OAAS6hO,EAAcp2U,OAAO,cACvC,EACA8rmB,EAAY9unB,UAAUw/W,+BAAiC,SAAU30W,GAC7D,IAAI40W,EACAC,EACArgX,KAAKg6V,mBAAmB8O,eACxBsX,EAAWpgX,KAAKg7W,qBAAuBh7W,KAAKg7W,qBAAqB,GAAK,KACtEqF,EAAargX,KAAKi7W,sBAAwBnrB,EAAK9vV,KAAKi7W,uBAAyB,OAG7EmF,EAAWpgX,KAAKg7W,qBAAuBlrB,EAAK9vV,KAAKg7W,sBAAwB,KACzEqF,EAAargX,KAAKi7W,sBAAwBj7W,KAAKi7W,sBAAsB,GAAK,MAE9Ej7W,KAAKq+W,YAAYh8W,SAAQ,SAAUe,GAC/BA,EAAOqhW,kBAAkBrhW,IAAWg9W,EAAU50W,GAC9CpI,EAAOkhW,oBAAoBlhW,IAAWi9W,EAAY70W,EACtD,GACJ,EACAiknB,EAAY9unB,UAAU2/W,gBAAkB,SAAUv1W,EAAMw1W,EAAY/0W,GAQhE,IAAIyK,EAAQjW,UACG,IAAXwL,IAAqBA,EAAS,OAIlCxL,KAAKwgX,sBAAsBC,iBAE3B,IAAIC,EAAmB,GAEnBC,GAAyB,EAI7B,IAHkB,MAAdJ,IACAA,EAAavgX,KAAKg6V,mBAAmB4mB,0BAER,IAA1BD,GACHA,EAAwB,EACxB3gX,KAAK6gX,oBAAoB91W,GAAM,SAAU3H,GAErC,GAAIs9W,EAAiBxsW,QAAQ9Q,IAAW,EACpC,OAAO,EAGX,IAAI09W,EAAiB7qW,EAAM8qW,oBAAoBC,2BAA2B59W,EAAQm9W,GAElF,GAAIO,EAAiB,EAAG,CACpB,IAAIntE,EAAW19R,EAAMgrW,qBAAqB79W,EAAQ09W,GAClD19W,EAAOu8V,eAAehsD,EAAUnoS,GAChCk1W,EAAiBj/W,KAAK2B,GACtBu9W,GACJ,CACA,OAAO,CACX,GAAGn1W,GAEPxL,KAAKkhX,uBAAuBR,GAAkB,EAAM,kBACxD,EACA+uQ,EAAY9unB,UAAUugX,uBAAyB,SAAUz3Q,EAAS/J,EAAUl0F,EAAQ21W,GAEhF,QADoB,IAAhBA,IAA0BA,EAAc,MACxC13Q,GAAWA,EAAQnoG,OAAQ,CAC3B,IAAI8/W,EAAU,CACVj4W,KAAMsqW,GAAOa,qBACb7qQ,QAASA,EACTrmG,OAA2B,IAAnBqmG,EAAQnoG,OAAemoG,EAAQ,GAAK,KAC5C03Q,YAAaA,EACbzhR,SAAUA,EACVr0D,IAAKrrC,KAAKwiW,QACVtB,UAAWlhW,KAAKkhW,UAChB11V,OAAQA,GAEZxL,KAAK09V,aAAa/2T,cAAcy6U,EACpC,CACJ,EACAquQ,EAAY9unB,UAAU0gX,eAAiB,SAAU9gX,EAAKggX,EAAY/0W,QAC/C,IAAXA,IAAqBA,EAAS,OAC9BjL,GACAP,KAAKsgX,gBAAgB,CAAC//W,GAAMggX,EAAY/0W,EAEhD,EACAiknB,EAAY9unB,UAAU2gX,mBAAqB,SAAUf,EAAY/0W,QAC9C,IAAXA,IAAqBA,EAAS,OAClC,IAAI+1W,EAAsBvhX,KAAKwhX,yBAC/BxhX,KAAKsgX,gBAAgBiB,EAAqBhB,EAAY/0W,EAC1D,EACAiknB,EAAY9unB,UAAU68W,mBAAqB,SAAUiE,GACjD,IAAIj6W,EAAS,GACTk6W,EAAuB,SAAUC,GACjC,IAAK,IAAIhgX,EAAI,EAAGA,EAAIggX,EAAargX,OAAQK,IAAK,CAC1C,IAAIuL,EAAQy0W,EAAahgX,GACrBuL,aAAiBiwV,GACjB31V,EAAO/F,KAAKyL,GAEPA,aAAiByhnB,IACtBjtQ,EAAqBx0W,EAAM6jH,cAEnC,CACJ,EAEA,OADA2wP,EAAqBD,GACdj6W,CACX,EACAionB,EAAY9unB,UAAUihX,qBAAuB,WACzC,OAAI5hX,KAAK6hX,mBAAqB7hX,KAAK8hX,oBAAsB9hX,KAAK+hX,oBACnD/hX,KAAK6hX,kBACP11W,OAAOnM,KAAK+hX,qBACZ51W,OAAOnM,KAAK8hX,oBAEd,IACX,EAEA2tQ,EAAY9unB,UAAUqhX,qBAAuB,WACzC,OAAOhiX,KAAKq9W,iBAChB,EAEAoyQ,EAAY9unB,UAAUshX,kBAAoB,WACtC,OAAOjiX,KAAK+6W,kBAChB,EAEA00Q,EAAY9unB,UAAUuhX,qBAAuB,WACzC,OAAOliX,KAAK6hX,iBAChB,EAEA4tQ,EAAY9unB,UAAUwhX,sBAAwB,WAC1C,OAAOniX,KAAK8hX,kBAChB,EAEA2tQ,EAAY9unB,UAAUyhX,uBAAyB,WAC3C,OAAOpiX,KAAK+hX,mBAChB,EAEA0tQ,EAAY9unB,UAAU0hX,kBAAoB,SAAUj/W,GAChD,OAAOpD,KAAKwhX,yBAAyBttW,QAAQ9Q,IAAW,CAC5D,EAEAqsnB,EAAY9unB,UAAU6gX,uBAAyB,WAC3C,OAAOxhX,KAAKm7W,gBAChB,EACAs0Q,EAAY9unB,UAAU2hX,mBAAqB,WACvC,OAAOtiX,KAAKq7W,eAChB,EACAo0Q,EAAY9unB,UAAU4hX,8BAAgC,SAAUvhB,GAC5D,OAAKhhW,KAAKwiX,cAGHxiX,KAAKyiX,0BAA0BzhB,EAAShhW,KAAKg7W,sBAFzCh7W,KAAKg7W,oBAGpB,EACAy0Q,EAAY9unB,UAAU+hX,+BAAiC,SAAU1hB,GAC7D,OAAKhhW,KAAKwiX,cAGHxiX,KAAKyiX,0BAA0BzhB,EAAShhW,KAAKi7W,uBAFzCj7W,KAAKi7W,qBAGpB,EACAw0Q,EAAY9unB,UAAU8hX,0BAA4B,SAAUzhB,EAASma,EAAkBwH,EAAgBC,GA8CnG,IA7CA,IA4CIC,EA5CAr7W,EAAS,GACTs7W,EAAoB,KACpB5nP,EAAU,SAAUv5H,GACpB,IAYIohX,EAZA1tT,EAAM8lT,EAAiBx5W,GACvBqhX,EAAoB7H,EAAiB75W,OAASK,EAC9CikW,EAAUz8U,KAAKgE,IAAIkoC,EAAIswS,WAAW3E,GAAUgiB,GAC5CC,EAAuB,CAAC5tT,GAC5B,GAAIuwS,EAAU,EAAG,CAEb,IADA,IAAIsd,EAAetd,EAAU,EACpB7jS,EAAI,EAAGA,GAAKmhT,EAAcnhT,IAC/BkhT,EAAqBxhX,KAAK05W,EAAiBx5W,EAAIogE,IAEnDpgE,GAAKuhX,CACT,CAmBA,GAhBIP,GAMAI,GAAe,EACfE,EAAqB5gX,SAAQ,SAAU8gX,GAC/BR,EAAeQ,KACfJ,GAAe,EAEvB,KAGAA,GAAe,EAEfA,EAAc,CACd,GAAsB,IAAlBv7W,EAAOlG,QAAgBwhX,IACDF,GAAyBA,EAAuBvtT,IAElE7tD,EAAO/F,KAAKqhX,GAGpBt7W,EAAO/F,KAAK4zD,EAChB,CACAytT,EAAoBztT,EACpBwtT,EAAUlhX,CACd,EAESA,EAAI,EAAGA,EAAIw5W,EAAiB75W,OAAQK,IACzCu5H,EAAQv5H,GACRA,EAAIkhX,EAER,OAAOr7W,CACX,EAKAionB,EAAY9unB,UAAUyiX,+BAAiC,SAAUpiB,GAC7D,IAAI/qV,EAAQjW,KACZ,IAAKA,KAAKwiX,cACN,OAAOxiX,KAAKs7W,sBAEhB,IAKIqH,EAAiB3iX,KAAKm8W,6BAA+B,KAAOn8W,KAAKqjX,mBAAmBrwU,KAAKhzC,MAC7F,OAAOA,KAAKyiX,0BAA0BzhB,EAAShhW,KAAKk7W,uBAAwByH,GAN/C,SAAUttT,GACnC,IAAIjqC,EAAOiqC,EAAIouS,UACf,OAAO15F,EAAO3+O,IAASA,EAAOnV,EAAM+oW,YACxC,GAIJ,EACAywQ,EAAY9unB,UAAU2iX,mBAAqB,SAAUjuT,GACjD,OAAOr1D,KAAKujX,oBAAoBrvW,QAAQmhD,GAAO,CACnD,EACAo6jB,EAAY9unB,UAAU0iX,mBAAqB,SAAUhuT,GAEjD,GAAIA,EAAI+vS,YAAYixB,WAChB,OAAO,EAEX,IAAI7S,EAAanuT,EAAIouS,WAAa,EAC9BggB,EAAcD,EAAanuT,EAAIowS,iBAK/Bie,EAAa1jX,KAAKg/W,aAAe,IACjC2E,EAAc3jX,KAAKk/W,cAAgB,IAGvC,QAFuBsE,EAAaE,GAAcD,EAAcC,MACxCF,EAAaG,GAAeF,EAAcE,EAEtE,EAIA8rQ,EAAY9unB,UAAUijX,6BAA+B,WACjD,OAAO5jX,KAAK6jX,qBAAqB7jX,KAAKg7W,qBAC1C,EAEAy0Q,EAAY9unB,UAAUmjX,8BAAgC,WAClD,OAAO9jX,KAAK6jX,qBAAqB7jX,KAAKi7W,sBAC1C,EACAw0Q,EAAY9unB,UAAUojX,wBAA0B,SAAUh5W,EAAMi5W,EAAYC,EAAaC,EAAgBzkP,EAAWj0H,GAChH,IAAIyK,EAAQjW,KAEZ,QADe,IAAXwL,IAAqBA,EAAS,OAC7BT,IAAQkjV,EAAeljV,GAA5B,CAGA,IAAIo5W,GAAa,EAqBjB,GApBAp5W,EAAK1I,SAAQ,SAAU9B,GACnB,IAAI6jX,EAAcnuW,EAAM8pW,iBAAiBx/W,GACzC,GAAK6jX,EAAL,CAGA,GAAIH,EAAa,CACb,GAAID,EAAW9vW,QAAQkwW,IAAgB,EACnC,OAEJJ,EAAWviX,KAAK2iX,EACpB,KACK,CACD,GAAIJ,EAAW9vW,QAAQkwW,GAAe,EAClC,OAEJn0B,EAAgB+zB,EAAYI,EAChC,CACAF,EAAeE,GACfD,GAAa,CAdb,CAeJ,IACKA,EAAL,CAGInkX,KAAK07W,wBACL17W,KAAKy8W,oBAETz8W,KAAK08W,uBAAuBlxW,GAC5B,IAAI86B,EAAQ,CACRn9B,KAAMs2H,EACNh2B,QAASu6Q,EACT5gX,OAA8B,IAAtB4gX,EAAW1iX,OAAe0iX,EAAW,GAAK,KAClD34U,IAAKrrC,KAAKwiW,QACVtB,UAAWlhW,KAAKkhW,UAChB11V,OAAQA,GAEZxL,KAAK09V,aAAa/2T,cAAcL,EAbhC,CAxBA,CAsCJ,EACAmplB,EAAY9unB,UAAU0jX,mBAAqB,SAAUC,EAAS94W,QAC3C,IAAXA,IAAqBA,EAAS,OAClCxL,KAAK07W,wBAAyB,EAC9B17W,KAAKukX,qBAAqBD,EAAStkX,KAAKu7W,gBAAiB9H,GAAOI,+BAAgC7zW,KAAKumW,kBAAkBvzT,KAAKhzC,MAAOwL,EACvI,EACAiknB,EAAY9unB,UAAU4lW,kBAAoB,SAAUr/T,EAAQ9jC,EAAQoI,GAC5D07B,IAAW9jC,EAAOsjW,qBAGtBtjW,EAAOmjW,kBAAkBr/T,EAAQ17B,GAC5B07B,GAAWlnC,KAAKg6V,mBAAmBwqB,2CACpCphX,EAAO8hW,YAAW,EAAM15V,GAEhC,EACAiknB,EAAY9unB,UAAU8jX,kBAAoB,SAAUlkX,EAAKiL,QACtC,IAAXA,IAAqBA,EAAS,OAC9BjL,GACAP,KAAK0kX,mBAAmB,CAACnkX,GAAMiL,EAEvC,EACAiknB,EAAY9unB,UAAU+jX,mBAAqB,SAAU35W,EAAMS,QACxC,IAAXA,IAAqBA,EAAS,OAClCxL,KAAK07W,wBAAyB,EAC9B17W,KAAK+jX,wBAAwBh5W,EAAM/K,KAAKu7W,iBAAiB,EAAMv7W,KAAKumW,kBAAkBvzT,KAAKhzC,MAAM,GAAOyzW,GAAOI,+BAAgCroW,EACnJ,EACAiknB,EAAY9unB,UAAUgkX,sBAAwB,SAAU55W,EAAMS,QAC3C,IAAXA,IAAqBA,EAAS,OAClCxL,KAAK07W,wBAAyB,EAC9B17W,KAAK+jX,wBAAwBh5W,EAAM/K,KAAKu7W,iBAAiB,EAAOv7W,KAAKumW,kBAAkBvzT,KAAKhzC,MAAM,GAAQyzW,GAAOI,+BAAgCroW,EACrJ,EACAiknB,EAAY9unB,UAAUikX,qBAAuB,SAAUrkX,EAAKiL,QACzC,IAAXA,IAAqBA,EAAS,OAC9BjL,GACAP,KAAK2kX,sBAAsB,CAACpkX,GAAMiL,EAE1C,EACAiknB,EAAY9unB,UAAUkkX,gBAAkB,SAAU95W,EAAMS,QACrC,IAAXA,IAAqBA,EAAS,OAClCxL,KAAK+jX,wBAAwBh5W,EAAM/K,KAAKy7W,cAAc,GAAM,SAAUr4W,GAAU,OAAOA,EAAOujW,gBAAe,EAAMn7V,EAAS,GAAGioW,GAAOM,2BAA4BvoW,EACtK,EACAiknB,EAAY9unB,UAAUmkX,gBAAkB,SAAUR,EAAS94W,QACxC,IAAXA,IAAqBA,EAAS,OAClCxL,KAAKukX,qBAAqBD,EAAStkX,KAAKy7W,aAAchI,GAAOM,4BAA4B,SAAUphN,EAAOvvJ,GACtGA,EAAOujW,eAAeh0M,EAAOnnJ,EACjC,GAAGA,EACP,EACAiknB,EAAY9unB,UAAUokX,eAAiB,SAAUxkX,EAAKiL,QACnC,IAAXA,IAAqBA,EAAS,OAClCxL,KAAK6kX,gBAAgB,CAACtkX,GAAMiL,EAChC,EACAiknB,EAAY9unB,UAAUqkX,mBAAqB,SAAUj6W,EAAMS,QACxC,IAAXA,IAAqBA,EAAS,OAClCxL,KAAK+jX,wBAAwBh5W,EAAM/K,KAAKy7W,cAAc,GAAO,SAAUr4W,GAAU,OAAOA,EAAOujW,gBAAe,EAAOn7V,EAAS,GAAGioW,GAAOM,2BAA4BvoW,EACxK,EACAiknB,EAAY9unB,UAAUskX,kBAAoB,SAAU1kX,EAAKiL,QACtC,IAAXA,IAAqBA,EAAS,OAClCxL,KAAKglX,mBAAmB,CAACzkX,GAAMiL,EACnC,EACAiknB,EAAY9unB,UAAU4jX,qBAAuB,SAAUD,EAASN,EAAY39U,EAAW69U,EAAgB14W,GACnG,IAAIyK,EAAQjW,KACZgkX,EAAW1iX,OAAS,EAChByoQ,EAAOu6G,IACPA,EAAQjiX,SAAQ,SAAU9B,GACtB,IAAI6C,EAAS6S,EAAM8pW,iBAAiBx/W,GAChC6C,GACA4gX,EAAWviX,KAAK2B,EAExB,KAEHpD,KAAKgvW,gBAAkB,IAAI3sW,SAAQ,SAAUe,GAC1C,IAAIuvJ,EAAQqxN,EAAW9vW,QAAQ9Q,IAAW,EAC1C8gX,EAAevxN,EAAOvvJ,EAC1B,IACIpD,KAAK07W,wBACL17W,KAAKy8W,oBAETz8W,KAAK08W,uBAAuBlxW,GAC5BxL,KAAK23gB,gBAAgBtxe,EAAW29U,EAAYx4W,EAChD,EACAiknB,EAAY9unB,UAAUukX,gBAAkB,SAAUZ,EAAS94W,QACxC,IAAXA,IAAqBA,EAAS,OAClCxL,KAAKukX,qBAAqBD,EAAStkX,KAAKw7W,aAAc/H,GAAOQ,2BAA4Bj0W,KAAKqnW,eAAer0T,KAAKhzC,MAAOwL,EAC7H,EACAiknB,EAAY9unB,UAAU0mW,eAAiB,SAAUngU,EAAQ9jC,EAAQoI,GAC7D,GAAI07B,IAAW9jC,EAAO4jW,kBAGtB5jW,EAAOikW,eAAengU,EAAQ17B,GAC1B07B,IAAW9jC,EAAOogW,cAAc,CAChC,IAAI2hB,EAAiBnlX,KAAKolX,eAAeC,kBAAkBjiX,GAC3DA,EAAOkgW,WAAW6hB,EACtB,CACJ,EACAsqQ,EAAY9unB,UAAU2kX,gBAAkB,SAAUv6W,EAAMS,QACrC,IAAXA,IAAqBA,EAAS,OAClCxL,KAAK+jX,wBAAwBh5W,EAAM/K,KAAKw7W,cAAc,EAAMx7W,KAAKqnW,eAAer0T,KAAKhzC,MAAM,GAAOyzW,GAAOQ,2BAA4BzoW,EACzI,EACAiknB,EAAY9unB,UAAU4kX,eAAiB,SAAUC,EAAQh6W,QACtC,IAAXA,IAAqBA,EAAS,OAC9Bg6W,GACAxlX,KAAKslX,gBAAgB,CAACE,GAASh6W,EAEvC,EACAiknB,EAAY9unB,UAAU8kX,kBAAoB,SAAUD,EAAQh6W,QACzC,IAAXA,IAAqBA,EAAS,OAClCxL,KAAK0lX,mBAAmB,CAACF,GAASh6W,EACtC,EACAiknB,EAAY9unB,UAAU+kX,mBAAqB,SAAU36W,EAAMS,QACxC,IAAXA,IAAqBA,EAAS,OAClCxL,KAAK+jX,wBAAwBh5W,EAAM/K,KAAKw7W,cAAc,EAAOx7W,KAAKqnW,eAAer0T,KAAKhzC,MAAM,GAAQyzW,GAAOQ,2BAA4BzoW,EAC3I,EAEAiknB,EAAY9unB,UAAUsgX,qBAAuB,SAAU79W,EAAQuwS,GAC3D,IAAIzkS,EAAW9L,EAAO+iW,cAClBp8F,EAAO76P,IAAaykS,EAAWzkS,IAC/BykS,EAAWzkS,GAEf,IAAIs5B,EAAWplC,EAAOusS,cAItB,OAHI5lC,EAAOvhO,IAAaplC,EAAO8iW,iBAAiBvyD,KAC5CA,EAAWnrQ,GAERmrQ,CACX,EACA87U,EAAY9unB,UAAUglX,uBAAyB,SAAUplX,GAErD,OADaP,KAAK+/W,iBAAiBx/W,IAClBP,KAAK4lX,cAAcrlX,EACxC,EACAkvnB,EAAY9unB,UAAUklX,gBAAkB,SAAUC,EAAcC,EAChErmR,EACAl0F,GACI,IAAIyK,EAAQjW,UACG,IAAXwL,IAAqBA,EAAS,OAClC,IAAIw6W,EAAO,GACXF,EAAazjX,SAAQ,SAAU4jX,GAC3B,IAAI5wT,EAAMp/C,EAAM0vW,uBAAuBM,EAAY1lX,KACnD,GAAK80D,IAGL2wT,EAAKvkX,KAAK,CACN6sB,MAAO23V,EAAYtyE,SACnBuyE,OAAQ,CAAC,GACTz8Q,QAAS,CAACp0C,KAG0D,UAAnDp/C,EAAM+jV,mBAAmBmsB,wBAE1CJ,GAAYA,GAEZA,GAAU,CACV,IAAIK,EAAWnwW,EAAMopW,qBAAqBhqT,GAC1C,IAAK+wT,EACD,OAEJ,IAAIC,EAAYhxT,EAAIowS,iBAAmBwgB,EAAYtyE,SAC/C2yE,EAAgBF,EAAS3gB,iBAAmB4gB,EAChDL,EAAKvkX,KAAK,CACN6sB,MAAOg4V,EACPJ,OAAQ,CAAC,GACTz8Q,QAAS,CAAC28Q,IAElB,CACJ,IACoB,IAAhBJ,EAAK1kX,QAGTtB,KAAKumX,iBAAiBP,EAAMtmR,EAAUl0F,EAC1C,EACAiknB,EAAY9unB,UAAU6lX,2BAA6B,SAAUC,GACzD,IAAIh9Q,EAAUg9Q,EAAgBh9Q,QAASn7E,EAAQm4V,EAAgBn4V,MAG3Do4V,EAAsB,EACtBC,EAAsB,EACtBC,GAAiB,EAgBrB,OAfAn9Q,EAAQpnG,SAAQ,SAAUgzD,GACtB,IAAInmD,EAAWmmD,EAAI8wS,cACnBugB,GAAuBx3W,GAAY,EACnC,IAAIs5B,EAAW6sB,EAAIs6O,cACf5lC,EAAOvhO,IAAaA,EAAW,EAC/Bm+U,GAAuBn+U,EAKvBo+U,GAAiB,CAEzB,IACqBt4V,GAASo4V,KACRE,GAAmBt4V,GAASq4V,EAEtD,EAKA8oQ,EAAY9unB,UAAU4lX,iBAAmB,SAAUM,EAAYnnR,EAAUl0F,GACrE,IAAIyK,EAAQjW,KAEZ,IADuB6mX,GAAcA,EAAWpoV,OAAM,SAAUgoV,GAAmB,OAAOxwW,EAAMuwW,2BAA2BC,EAAkB,IAC7I,CAQA,IAAIK,EAAc,GACdC,EAAiB,GACrBF,EAAWxkX,SAAQ,SAAU+U,GACzB,IAAIkX,EAAQlX,EAAIkX,MAAOm7E,EAAUryF,EAAIqyF,QAASy8Q,EAAS9uW,EAAI8uW,OAGvDc,EAAY,CAAC,EACbC,EAAe,CAAC,EACpBx9Q,EAAQpnG,SAAQ,SAAUgzD,GAAO,OAAO0xT,EAAetlX,KAAK4zD,EAAM,IAiElE,IAtDA,IAAI6xT,GAAmB,EACnBC,EAAY,EACZC,EAAU,WAEV,KADAD,EACgB,IAIZ,OADA37T,QAAQ3R,MAAM,8CACP,QAEXqtU,GAAmB,EACnB,IAAIG,EAAa,GACbC,EAAmB,EACnBC,EAAqBj5V,EACzBm7E,EAAQpnG,SAAQ,SAAUgzD,EAAK7kD,GAE3B,GADsBy2W,EAAa5xT,EAAI1tB,SAEnC4/U,GAAsBP,EAAU3xT,EAAI1tB,aAEnC,CACD0/U,EAAW5lX,KAAK4zD,GAChB,IAAImyT,EAAetB,EAAO11W,GAC1B82W,GAAoBE,CACxB,CACJ,IAIA,IAAIC,EAAa,EAAIH,EACrBD,EAAWhlX,SAAQ,SAAUgzD,EAAK7kD,GAC9B,IACIk3W,EADUl3W,IAAW62W,EAAW/lX,OAAS,EAGzComX,EAAcH,GAGdG,EAAcv+V,KAAKI,MAAM28V,EAAO11W,GAAS8d,EAAQm5V,GACjDF,GAAsBG,GAE1B,IAAIx4W,EAAWmmD,EAAI8wS,cACf39T,EAAW6sB,EAAIs6O,cACf5lC,EAAO76P,IAAaw4W,EAAcx4W,GAClCw4W,EAAcx4W,EACd+3W,EAAa5xT,EAAI1tB,UAAW,EAC5Bu/U,GAAmB,GAEdn9G,EAAOvhO,IAAaA,EAAW,GAAKk/U,EAAcl/U,IACvDk/U,EAAcl/U,EACdy+U,EAAa5xT,EAAI1tB,UAAW,EAC5Bu/U,GAAmB,GAEvBF,EAAU3xT,EAAI1tB,SAAW+/U,CAC7B,GACJ,EACOR,GAAkB,CAErB,GAAgB,UADFE,IAEV,KACR,CACA39Q,EAAQpnG,SAAQ,SAAUgzD,GACtB,IAAIs+O,EAAWqzE,EAAU3xT,EAAI1tB,SACzB0tB,EAAIowS,mBAAqB9xD,IACzBt+O,EAAIsqS,eAAehsD,EAAUnoS,GAC7Bs7W,EAAYrlX,KAAK4zD,GAEzB,GACJ,IAEA,IAAIsyT,EAAuBb,EAAYxlX,OAAS,EAC5CsmX,EAAa5nX,KAAK6nX,qBAAqB,CAAEC,aAAcf,EAAgBgB,aAAa,IACpFJ,IACA3nX,KAAKgoX,cAAcx8W,GACnBxL,KAAKioX,mBACLjoX,KAAKg+W,wBAOT,IAAIkK,EAAenB,EAAe56W,OAAOy7W,IACrCD,GAAwBjoR,IACxB1/F,KAAKkhX,uBAAuBgH,EAAcxoR,EAAUl0F,EAAQo8W,EAtGhE,MALI,GAAIloR,EAAU,CACV,IAAI+J,EAAUo9Q,GAAcA,EAAWvlX,OAAS,EAAIulX,EAAW,GAAGp9Q,QAAU,KAC5EzpG,KAAKkhX,uBAAuBz3Q,EAAS/J,EAAUl0F,EACnD,CA0GR,EACAiknB,EAAY9unB,UAAUwnX,iBAAmB,SAAU5nX,EAAKgjW,EAAS/3V,GAE7D,QADe,IAAXA,IAAqBA,EAAS,OAC7BjL,EAAL,CAGA,IAAI6C,EAASpD,KAAK+/W,iBAAiBx/W,GAC9B6C,IAGLA,EAAOkgW,WAAWC,GAClBvjW,KAAK23gB,gBAAgBlkK,GAAOQ,2BAA4B,CAAC7wW,GAASoI,GANlE,CAOJ,EACAiknB,EAAY9unB,UAAUg3gB,gBAAkB,SAAUxugB,EAAMsgG,EAASj+F,GAC7D,IAAI86B,EAAQ,CACRn9B,KAAMA,EACNsgG,QAASA,EACTrmG,OAASqmG,GAA6B,GAAlBA,EAAQnoG,OAAemoG,EAAQ,GAAK,KACxDp+D,IAAKrrC,KAAKwiW,QACVtB,UAAWlhW,KAAKkhW,UAChB11V,OAAQA,GAEZxL,KAAK09V,aAAa/2T,cAAcL,EACpC,EACAmplB,EAAY9unB,UAAUynX,mBAAqB,SAAUC,EAAWh4B,EAAS7kV,QACtD,IAAXA,IAAqBA,EAAS,OAClC,IAAIpI,EAASpD,KAAKu7W,gBAAgB8M,GAClCroX,KAAKu7W,gBAAgBlqW,OAAOg3W,EAAW,GACvCroX,KAAKu7W,gBAAgBlqW,OAAOg/U,EAAS,EAAGjtV,GACxC,IAAIkjC,EAAQ,CACRn9B,KAAMsqW,GAAOI,+BACbpqQ,QAASzpG,KAAKu7W,gBACdn4W,OAAwC,IAAhCpD,KAAKu7W,gBAAgBj6W,OAAetB,KAAKu7W,gBAAgB,GAAK,KACtElwU,IAAKrrC,KAAKwiW,QACVtB,UAAWlhW,KAAKkhW,UAChB11V,OAAQA,GAEZxL,KAAK09V,aAAa/2T,cAAcL,EACpC,EACAmplB,EAAY9unB,UAAU2nX,YAAc,SAAUC,EAAmBl4B,EAAS7kV,GAGtE,QAFe,IAAXA,IAAqBA,EAAS,OAClCxL,KAAKwoX,uBAAuBn2V,QACxBg+T,EAAUrwV,KAAKq+W,YAAY/8W,OAASinX,EAAkBjnX,OAGtD,OAFAkqD,QAAQC,KAAK,mEAAqE4kS,QAClF7kS,QAAQC,KAAK,iGAIjB,IAAIg9T,EAAgBzoX,KAAK0oX,eAAeH,GAExC,KADmBvoX,KAAK2oX,kBAAkBF,EAAep4B,GACzD,CAGAC,EAAYtwV,KAAKq+W,YAAaoK,EAAep4B,GAC7CrwV,KAAK08W,uBAAuBlxW,GAC5B,IAAI86B,EAAQ,CACRn9B,KAAMsqW,GAAOS,mBACbzqQ,QAASg/Q,EACTrlX,OAAiC,IAAzBqlX,EAAcnnX,OAAemnX,EAAc,GAAK,KACxDp4B,QAASA,EACThlT,IAAKrrC,KAAKwiW,QACVtB,UAAWlhW,KAAKkhW,UAChB11V,OAAQA,GAEZxL,KAAK09V,aAAa/2T,cAAcL,GAChCtmC,KAAKwoX,uBAAuBxlR,QAb5B,CAcJ,EACAyshB,EAAY9unB,UAAUgoX,kBAAoB,SAAUF,EAAep4B,GAE/D,IAAIu4B,EAAsB5oX,KAAKq+W,YAAYptW,QAG3C,OAFAq/U,EAAYs4B,EAAqBH,EAAep4B,KAE3CrwV,KAAK6oX,0BAA0BD,MAG/B5oX,KAAK8oX,4BAA4BF,EAI1C,EAGA6mQ,EAAY9unB,UAAUooX,2BAA6B,SAAU1qH,GACzD,IAAIpoP,EAAQjW,MACPq+P,GAAQA,EAAK/8P,QAAU,IAGE+8P,EAAKnzP,QAAO,SAAU0iD,GAAK,OAAO33C,EAAMooW,YAAYnqW,QAAQ05C,GAAK,CAAG,IAAGtsD,OAAS,GAI9G+8P,EAAKtrO,MAAK,SAAU6K,EAAGC,GAGnB,OAFa5nB,EAAMooW,YAAYnqW,QAAQ0pB,GAC1B3nB,EAAMooW,YAAYnqW,QAAQ2pB,EAE3C,IACJ,EACA4xlB,EAAY9unB,UAAUmoX,4BAA8B,SAAUF,GAC1D,IAAII,GAAiB,EACjBC,GAAa,EAYjB,OAVAL,EAAoBvmX,SAAQ,SAAUgzD,GAC9BA,EAAI+vS,YAAYyC,aACZmhB,IACAC,GAAa,GAIjBD,GAAiB,CAEzB,IACOC,CACX,EACAwmQ,EAAY9unB,UAAUkoX,0BAA4B,SAAUK,GACxD,IAAID,GAAa,EA4BjB,OA3BAjpX,KAAKy/V,YAAYoQ,6BAA6B,KAAM7vW,KAAKgwW,kBAAkB,SAAU9iW,GACjF,GAAMA,aAAiByhnB,GAAvB,CAGA,IAAIxlQ,EAAcj8W,EACdw9V,EAAcye,EAAYtf,iBAE9B,GADoBa,GAAeA,EAAY0e,cAC/C,CAGA,IAAIC,EAAa,GACjBF,EAAYvgB,iBAAiBvmW,SAAQ,SAAUgzD,GAC3C,IAAIi0T,EAAcJ,EAAeh1W,QAAQmhD,GACzCg0T,EAAW5nX,KAAK6nX,EACpB,IACengW,KAAK+D,IAAItjB,MAAMuf,KAAMkgW,GACrBlgW,KAAKgE,IAAIvjB,MAAMuf,KAAMkgW,GAGpBF,EAAYvgB,iBAAiBtnW,OAAS,IAGlD2nX,GAAa,EAbjB,CANA,CAuBJ,IACOA,CACX,EACAwmQ,EAAY9unB,UAAU4oX,WAAa,SAAUhpX,EAAK8vV,EAAS7kV,QACxC,IAAXA,IAAqBA,EAAS,OAClCxL,KAAKsoX,YAAY,CAAC/nX,GAAM8vV,EAAS7kV,EACrC,EACAiknB,EAAY9unB,UAAU6oX,kBAAoB,SAAUnB,EAAWh4B,EAAS7kV,QACrD,IAAXA,IAAqBA,EAAS,OAClC,IAAIpI,EAASpD,KAAKq+W,YAAYgK,GAC9BroX,KAAKupX,WAAWnmX,EAAQitV,EAAS7kV,EACrC,EACAiknB,EAAY9unB,UAAU8oX,cAAgB,WAClC,IAAIxzW,EAAQjW,KACZ,GAAKA,KAAKgvW,eAAV,CAGA,IAAI3wG,EAAOr+P,KAAKgvW,eAAe/9V,QAO/B,OANIjR,KAAK69W,mBACLx/G,EAAKtrO,MAAK,SAAU6K,EAAGC,GAAK,OAAO5nB,EAAMooW,YAAYnqW,QAAQ0pB,GAAK3nB,EAAMooW,YAAYnqW,QAAQ2pB,EAAI,IAE3F79B,KAAK0pX,kBACVrrH,EAAKtrO,MAAK,SAAU6K,EAAGC,GAAK,OAAO5nB,EAAMyzW,iBAAiBx1W,QAAQ0pB,GAAK3nB,EAAMyzW,iBAAiBx1W,QAAQ2pB,EAAI,IAEvG79B,KAAK2pX,iBAAiBC,gBAAgBvrH,EAAMr+P,KAAKu7W,gBAAiBv7W,KAAKy7W,aAR9E,CASJ,EAKAg0Q,EAAY9unB,UAAUkpX,sBAAwB,WAC1C,OAAO7pX,KAAK67W,SAChB,EACA4zQ,EAAY9unB,UAAUmpX,kBAAoB,SAAU3rB,GAChD,OAAQA,GACJ,KAAKtD,GAAUsB,YACX,OAAOn8V,KAAK87W,UAChB,KAAKjhB,GAAUqB,aACX,OAAOl8V,KAAK+7W,WAChB,QACI,OAAO/7W,KAAK67W,UAExB,EAEA4zQ,EAAY9unB,UAAUsnX,iBAAmB,WACrC,IAAI8B,EAAe/pX,KAAK6jX,qBAAqB7jX,KAAKk7W,wBAC9C8O,EAAehqX,KAAK6jX,qBAAqB7jX,KAAKg7W,sBAC9CiP,EAAgBjqX,KAAK6jX,qBAAqB7jX,KAAKi7W,uBAKnD,GAFAj7W,KAAKg8W,eAAiBh8W,KAAK67W,YAAckO,EACjB/pX,KAAK67W,YAAckO,GAAgB/pX,KAAK87W,YAAckO,GAAgBhqX,KAAK+7W,aAAekO,EAC3F,CACnBjqX,KAAK67W,UAAYkO,EACjB/pX,KAAK87W,UAAYkO,EACjBhqX,KAAK+7W,WAAakO,EAGlB,IAAIC,EAAU,CACV/gX,KAAMsqW,GAAOoE,sCACbxsU,IAAKrrC,KAAKwiW,QACVtB,UAAWlhW,KAAKkhW,WAEpBlhW,KAAK09V,aAAa/2T,cAAcujV,EACpC,CACJ,EAEAulQ,EAAY9unB,UAAUwpX,gBAAkB,WACpC,OAAOnqX,KAAKw7W,aAAex7W,KAAKw7W,aAAe,EACnD,EAEAi0Q,EAAY9unB,UAAUypX,gBAAkB,WACpC,OAAOpqX,KAAKy7W,aAAez7W,KAAKy7W,aAAe,EACnD,EAEAg0Q,EAAY9unB,UAAUmmW,cAAgB,WAClC,OAAO9mW,KAAKy7W,cAAgBz7W,KAAKy7W,aAAan6W,OAAS,GAAKtB,KAAK47W,SACrE,EAEA6zQ,EAAY9unB,UAAU0pX,mBAAqB,WACvC,OAAOrqX,KAAKu7W,gBAAkBv7W,KAAKu7W,gBAAkB,EACzD,EAEAk0Q,EAAY9unB,UAAU2pX,0BAA4B,WAC9C,OAAOtqX,KAAKk7W,sBAChB,EAEAu0Q,EAAY9unB,UAAU4pX,wBAA0B,WAC5C,OAAOvqX,KAAKg7W,oBAChB,EACAy0Q,EAAY9unB,UAAU6pX,yBAA2B,WAC7C,OAAOxqX,KAAKi7W,qBAChB,EACAw0Q,EAAY9unB,UAAU8pX,oBAAsB,SAAUthX,GAClD,OAAQA,GACJ,KAAK0xV,GAAUsB,YACX,OAAOn8V,KAAKuqX,0BAChB,KAAK1vB,GAAUqB,aACX,OAAOl8V,KAAKwqX,2BAChB,QACI,OAAOxqX,KAAKsqX,4BAExB,EAIAmlQ,EAAY9unB,UAAU+pX,qBAAuB,WACzC,OAAO1qX,KAAKgvW,eAAiBhvW,KAAKgvW,eAAe/9V,QAAU,IAC/D,EACAw+mB,EAAY9unB,UAAUgqX,oBAAsB,WACxC,OAAO3qX,KAAK6/W,iBAAmB7/W,KAAK6/W,iBAAiB5uW,QAAU,IACnE,EACAw+mB,EAAY9unB,UAAUiqX,4BAA8B,WAChD,OAAO5qX,KAAK6qX,qBAChB,EAEA4kQ,EAAY9unB,UAAU4iX,kBAAoB,WACtC,OAAOvjX,KAAKq+W,WAChB,EACAoxQ,EAAY9unB,UAAUi1Q,QAAU,WAC5B,OAAOq4E,EAAejuV,KAAKq+W,YAC/B,EACAoxQ,EAAY9unB,UAAUmqX,gBAAkB,WACpC,OAAO78B,EAAejuV,KAAKu7W,gBAC/B,EACAk0Q,EAAY9unB,UAAUoqX,iBAAmB,SAAUxqX,EAAK29V,EAAS1yV,QAC9C,IAAXA,IAAqBA,EAAS,OAClCxL,KAAKgrX,kBAAkB,CAACzqX,GAAM29V,EAAS1yV,EAC3C,EACAiknB,EAAY9unB,UAAUqqX,kBAAoB,SAAUjgX,EAAMmzV,EAAS1yV,GAC/D,IAAIyK,EAAQjW,UACI,IAAZk+V,IAAsBA,GAAU,QACrB,IAAX1yV,IAAqBA,EAAS,OAClCxL,KAAKwoX,uBAAuBn2V,QAC5BryB,KAAK6gX,oBAAoB91W,GAAM,SAAU3H,GACrC,OAAIA,EAAOyoC,cAAgBqyT,IACvB96V,EAAO8hW,WAAWhH,EAAS1yV,IACpB,EAGf,GAAGA,GAAQ,WAUP,MATY,CACRrC,KAAMsqW,GAAOU,qBACbjW,QAASA,EACT96V,OAAQ,KACRqmG,QAAS,KACTp+D,IAAKp1B,EAAMusV,QACXtB,UAAWjrV,EAAMirV,UACjB11V,OAAQA,EAGhB,IACAxL,KAAKwoX,uBAAuBxlR,QAChC,EACAyshB,EAAY9unB,UAAUsqX,gBAAkB,SAAU1qX,EAAK49V,EAAQ3yV,QAC5C,IAAXA,IAAqBA,EAAS,OAC9BjL,GACAP,KAAKkrX,iBAAiB,CAAC3qX,GAAM49V,EAAQ3yV,EAE7C,EACAiknB,EAAY9unB,UAAUuqX,iBAAmB,SAAUngX,EAAMozV,EAAQ3yV,GAC7D,IAOI2/W,EAPAl1W,EAAQjW,WACG,IAAXwL,IAAqBA,EAAS,OACa,UAA3CxL,KAAKg6V,mBAAmBoxB,iBAI5BprX,KAAKwoX,uBAAuBn2V,QAGxB84V,GADW,IAAXhtB,GAAmBA,IAAWtD,GAAUsB,YACzBtB,GAAUsB,YAEpBgC,IAAWtD,GAAUqB,aACXrB,GAAUqB,aAGV,KAEnBl8V,KAAK6gX,oBAAoB91W,GAAM,SAAUsqD,GACrC,OAAIA,EAAI4vS,cAAgBkmB,IACpB91T,EAAI+oS,UAAU+sB,IACP,EAGf,GAAG3/W,GAAQ,WAUP,MATY,CACRrC,KAAMsqW,GAAOW,oBACbjW,OAAQgtB,EACR/nX,OAAQ,KACRqmG,QAAS,KACTp+D,IAAKp1B,EAAMusV,QACXtB,UAAWjrV,EAAMirV,UACjB11V,OAAQA,EAGhB,IACAxL,KAAKwoX,uBAAuBxlR,UAhCxBx3C,QAAQC,KAAK,2EAiCrB,EAKAgkkB,EAAY9unB,UAAUkgX,oBAAsB,SAC5C91W,EAGA6Z,EAEApZ,EAAQ6/W,GACJ,IAAIp1W,EAAQjW,KACZ,IAAIiuV,EAAeljV,GAAnB,CAGA,IAAIugX,EAAiB,GAarB,GAZAvgX,EAAK1I,SAAQ,SAAU9B,GACnB,IAAI6C,EAAS6S,EAAM2vW,cAAcrlX,GAC5B6C,KAMkB,IADFwhB,EAAOxhB,IAExBkoX,EAAe7pX,KAAK2B,GAE5B,IACKkoX,EAAehqX,SAGpBtB,KAAK08W,uBAAuBlxW,GACxBu+P,EAAOshH,IAAgBA,GAAa,CACpC,IAAIE,EAAUF,IACdE,EAAQ9hR,QAAU6hR,EAClBC,EAAQnoX,OAAmC,IAA1BkoX,EAAehqX,OAAegqX,EAAe,GAAK,KACnEtrX,KAAK09V,aAAa/2T,cAAc4kV,EACpC,CAvBA,CAwBJ,EACAkkQ,EAAY9unB,UAAU6qX,sBAAwB,SAAUn2T,GACpD,IAAIksT,EAAsBvhX,KAAKwhX,yBAC3BiK,EAAWlK,EAAoBrtW,QAAQmhD,GAC3C,OAAIo2T,EAAW,EACJlK,EAAoBkK,EAAW,GAEnC,IACX,EAGAgkQ,EAAY9unB,UAAU0+W,qBAAuB,SAAUhqT,GACnD,IAAIksT,EAAsBvhX,KAAKwhX,yBAC3BiK,EAAWlK,EAAoBrtW,QAAQmhD,GAC3C,OAAIo2T,EAAYlK,EAAoBjgX,OAAS,EAClCigX,EAAoBkK,EAAW,GAEnC,IACX,EACAgkQ,EAAY9unB,UAAU+qX,uBAAyB,SAAUvC,GACrD,OAAOnpX,KAAK2rX,6BAA6BxC,EAAa,QAC1D,EACAsmQ,EAAY9unB,UAAUirX,wBAA0B,SAAUzC,GACtD,OAAOnpX,KAAK2rX,6BAA6BxC,EAAa,SAC1D,EACAsmQ,EAAY9unB,UAAUgrX,6BAA+B,SAAUxC,EAAaz9V,GAMxE,IAJA,IAAImgW,EAAgB1C,EAAYxgB,yBAAyBkC,WAAase,EAAYhf,kBAC9E2hB,EAAsB3C,EAAYxf,0BAClCt0S,EAAoB,UAAd3pC,EAAwBokU,EAAKg8B,GAAuBA,EAAoB,GAC9EC,EAAsB,kBAAoBrgW,IACjC,CAET,IAAItoB,EAASpD,KAAK+rX,GAAqB12T,GACvC,IAAKjyD,EACD,OAAO,KAEX,IAAI4oX,EAAehsX,KAAKisX,sBAAsB7oX,EAAQyoX,GACtD,GAAIG,IAAiB7C,EACjB,OAAO6C,CAEf,CACJ,EACAyjQ,EAAY9unB,UAAUsrX,sBAAwB,SAAU7oX,EAAQg+D,GAK5D,IAHA,IAAI4qT,EAAe5oX,EAAOs7V,cAGb,CAIT,GAHsCstB,EAAarjB,yBACEkC,WACjCmhB,EAAa7hB,mBACa/oS,EAC1C,MAEJ4qT,EAAeA,EAAattB,WAChC,CACA,OAAOstB,CACX,EACAyjQ,EAAY9unB,UAAUurX,cAAgB,WAClC,OAAOlsX,KAAKg7W,qBAAqB15W,OAAS,CAC9C,EACAmunB,EAAY9unB,UAAUwrX,eAAiB,WACnC,OAAOnsX,KAAKi7W,sBAAsB35W,OAAS,CAC/C,EACAmunB,EAAY9unB,UAAUyrX,qCAAuC,WACzD,IAAI5kX,EAASxH,KAAKgvW,eAAiBhvW,KAAKgvW,eAAe/9V,MAAM,GAAK,GAOlE,OANIjR,KAAKqsX,kBAAoBtiH,EAAO/pQ,KAAKqsX,mBACrCrsX,KAAKqsX,iBAAiBhqX,SAAQ,SAAUgzD,GAAO,OAAO7tD,EAAO/F,KAAK4zD,EAAM,IAExEr1D,KAAK86W,yBAA2B96W,KAAK6/W,kBACrC7/W,KAAK6/W,iBAAiBx9W,SAAQ,SAAUe,GAAU,OAAOoE,EAAO/F,KAAK2B,EAAS,IAE3EoE,CACX,EACAionB,EAAY9unB,UAAU2rX,0BAA4B,SAAUlpX,GACxD,IAAImpX,EAAgBnpX,EAAOsjW,mBAAqB1mW,KAAKu7W,gBAAgBrnW,QAAQ9Q,GAAU,KACnFopX,EAAappX,EAAO0jW,gBAAkB9mW,KAAKy7W,aAAavnW,QAAQ9Q,GAAU,KAC1EmgW,EAAUngW,EAAO4jW,gBAAkB5jW,EAAOogW,aAAe,KACzDzwU,EAA2B,MAApB3vB,EAAOq/V,UAAoBr/V,EAAOq/V,UAAY,KACrD1E,EAAqC,MAAzB36V,EAAO+/V,eAAyB//V,EAAO+/V,eAAiB,KACpE5wT,EAA2B,MAApBnvC,EAAOgjW,WAAqBhjW,EAAOgjW,UAAY,EAAIhjW,EAAOgjW,UAAY,KAejF,MAdU,CACN1W,MAAOtsV,EAAOmiW,WACdj3U,MAAOlrB,EAAOqiW,iBACd7gU,MAAOxhC,EAAOyoC,YACdsyT,OAAQ/6V,EAAO6hW,YACflyU,KAAMA,EACNgrU,UAAWA,EACXwF,QAASA,EACTiD,SAAUpjW,EAAOsjW,mBACjB6lB,cAAeA,EACf3lB,MAAOxjW,EAAO0jW,gBACd0lB,WAAYA,EACZj6U,KAAMA,EAGd,EACAk9kB,EAAY9unB,UAAU8rX,eAAiB,WACnC,GAAIlxE,EAAQv7S,KAAKgvW,kBAAoBhvW,KAAKiuW,UACtC,MAAO,GAEX,IACI7lS,EADepoE,KAAKosX,uCACDn/W,IAAIjN,KAAKssX,0BAA0Bt5U,KAAKhzC,OAI/D,OAHKA,KAAK47W,WACN57W,KAAK4sX,qBAAqBxkT,GAEvBA,CACX,EACAqnjB,EAAY9unB,UAAUmvnB,2BAA6B,WAC/C,OAAK9vnB,KAAKqsX,iBAGHuS,GAAgB5+X,KAAKgvW,gBAAkB,GAAKhvW,KAAKqsX,kBAF7CrsX,KAAKgvW,cAGpB,EACAygR,EAAY9unB,UAAUisX,qBAAuB,SAAUD,GAEnD,IAAIE,EAAkB0iQ,GAAavvnB,KAAKq+W,YAAYpxW,KAAI,SAAUooD,EAAK7kD,GAAS,MAAO,CAAC6kD,EAAIkwS,WAAY/0V,EAAQ,KAChHm8W,EAAgB55V,MAAK,SAAU+5V,EAAOC,GAGlC,OAFWF,EAAgB11W,IAAI21W,EAAMp9B,OAASm9B,EAAgBhqW,IAAIiqW,EAAMp9B,QAAU,IACvEm9B,EAAgB11W,IAAI41W,EAAMr9B,OAASm9B,EAAgBhqW,IAAIkqW,EAAMr9B,QAAU,EAEtF,GACJ,EACA+/R,EAAY9unB,UAAUqsX,iBAAmB,SAAUxhX,QAIhC,IAAXA,IAAqBA,EAAS,OAElC,IAAIwjW,EAAiBhvW,KAAKw9W,mBAAmBx9W,KAAKq9W,mBAC9C4P,EAAe,GAIfC,EAAmB,IACnBC,EAAgB,IAChBC,EAAgB,GAChBptX,KAAKqsX,mBACLe,EAAgBA,EAAcjhX,OAAOnM,KAAKqsX,mBAE1Crd,IACAoe,EAAgBA,EAAcjhX,OAAO6iW,IAEzCoe,EAAc/qX,SAAQ,SAAUe,GAC5B,IAAI2snB,EAAiB,SAAUnylB,EAAGC,GAAK,OAAY,MAALD,EAAYA,EAAS,MAALC,EAAYA,EAAI,IAAM,EAChFu/T,EAASh6V,EAAOgiW,YAChBryU,EAAOg9lB,EAAe3yR,EAAOrqU,KAAMqqU,EAAOU,aAC1CC,EAAYgyR,EAAe3yR,EAAOW,UAAWX,EAAOY,kBACpDp5T,EAAOmrlB,EAAe3yR,EAAOx4T,KAAMw4T,EAAOa,aAC1CE,EAAS4xR,EAAe3yR,EAAOe,OAAQf,EAAOiB,eAC9C/vU,EAAQyhmB,EAAe3yR,EAAO9uU,MAAO8uU,EAAOoC,cAC5CjtT,EAAOw9kB,EAAe3yR,EAAO7qT,KAAM6qT,EAAOkB,aAC1CiuB,EAAgBwjQ,EAAe3yR,EAAOmvB,cAAenvB,EAAO81B,sBAC5D1sB,EAAWupR,EAAe3yR,EAAOoJ,SAAUpJ,EAAO+1B,iBACjC,MAAjB5G,GAAsC,MAAZ/lB,GAAgC,GAAZA,IAC9C+lB,EAAgB,KAChB/lB,EAAW,MAEf,IAAIgmB,EAAaujQ,EAAe3yR,EAAOovB,WAAYpvB,EAAO62B,mBACtDrtB,EAAQmpR,EAAe3yR,EAAOwJ,MAAOxJ,EAAO82B,cAC9B,MAAd1H,GAAgC,MAAT5lB,GAA0B,GAATA,IACxC4lB,EAAa,KACb5lB,EAAQ,MAEZ,IAAIrD,EAAUwsR,EAAe3yR,EAAOmG,QAASnG,EAAO+nB,gBAChDkI,EAAY,CACZ39B,MAAOtsV,EAAOmiW,WACdxyU,KAAMA,EACNgrU,UAAWA,EACXn5T,KAAMA,EACNu5T,OAAQA,EACR7vU,MAAOA,EACPikB,KAAMA,EACNi0T,SAAUA,EACV+lB,cAAeA,EACf3lB,MAAOA,EACP4lB,WAAYA,EACZjpB,QAASA,GAEThoD,EAAQgxE,IAAkB/lB,IAC1B6mB,EAAUd,cAAgBW,KAE1B3xE,EAAQixE,IAAe5lB,IACvBymB,EAAUb,WAAaW,KAE3BF,EAAaxrX,KAAK4rX,EACtB,IACArtX,KAAKoyW,iBAAiB,CAAE/nV,MAAO4iW,EAAcK,YAAY,GAAQ9hX,EACrE,EACAiknB,EAAY9unB,UAAUyxW,iBAAmB,SAAUv2T,EAAQrwC,GACvD,IAAIyK,EAAQjW,KAEZ,QADe,IAAXwL,IAAqBA,EAAS,OAC9ByiV,EAAejuV,KAAKgvW,gBACpB,OAAO,EAEX,GAAInzT,GAAUA,EAAOxxB,QAAUwxB,EAAOxxB,MAAMhoB,QAExC,OADAmpD,QAAQC,KAAK,4LACN,EAEXzrD,KAAKwoX,uBAAuBn2V,QAC5B,IAAI0qV,EAAkB/8W,KAAKg9W,kCAAkCxxW,GAC7DxL,KAAK07W,wBAAyB,EAE9B,IAAI6R,EAAqBvtX,KAAKgvW,eAAe/9V,QACzC2sJ,GAAU,EACV4vN,EAAkB,CAAC,EACnBC,EAAe,CAAC,EAChBC,EAAwB,GACxBC,EAAuB3tX,KAAKu7W,gBAAgBtqW,QAC5C28W,EAAoB5tX,KAAKy7W,aAAaxqW,QACtC4qC,EAAOxxB,OACPwxB,EAAOxxB,MAAMhoB,SAAQ,SAAUgoB,GAC3B,IAAIwjW,EAAoBhzB,GAAUmB,qBAC9BtM,EAAQrlU,EAAMqlU,OAAS,GAG3B,GADwBjuR,GAAWiuR,EAAOm+B,GAEtCH,EAAsBjsX,KAAK4oB,OAD/B,CAIA,IAAIjnB,EAAS6S,EAAM8pW,iBAAiBrwB,GAC/BtsV,GAQD6S,EAAM63W,wBAAwB1qX,EAAQinB,EAAOwxB,EAAOkyU,aAAcP,EAAiBC,GAAc,EAAOjiX,GACxGykV,EAAgBs9B,EAAoBnqX,IAJpCw6J,GAAU,CAPd,CAaJ,IAGJ,IAAIoyd,EAAoB,SAAU36jB,GAC9B,OAAOp/C,EAAM63W,wBAAwBz4T,EAAK,KAAMxZ,EAAOkyU,aAAcP,EAAiBC,GAAc,EAAOjiX,EAC/G,EACA+hX,EAAmBlrX,QAAQ2tnB,GAE3B,IAAIx4d,EAAa,SAAU78G,EAASqzU,EAAS1P,EAAMC,GAC/C,IAAI0P,EAAStzU,EAAQ2jU,EAAK32U,SACtBumV,EAASvzU,EAAQ4jU,EAAK52U,SACtBwmV,EAAsB,MAAVF,EACZG,EAAsB,MAAVF,EAChB,GAAIC,GAAaC,EAEb,OAAOH,EAASC,EAEpB,GAAIC,EAEA,OAAQ,EAEZ,GAAIC,EAEA,OAAO,EAEX,IAAIC,EAAYL,EAAQ95W,QAAQoqW,GAC5BgQ,EAAYN,EAAQ95W,QAAQqqW,GAC5BgQ,EAAeF,GAAa,EAEhC,OAAIE,GADeD,GAAa,EAGrBD,EAAYC,EAEnBC,GAEQ,EAIL,CACX,EACAvuX,KAAKu7W,gBAAgBxoV,KAAKykI,EAAWxkH,KAAKhzC,KAAMwtX,EAAiBG,IACjE3tX,KAAKy7W,aAAa1oV,KAAKykI,EAAWxkH,KAAKhzC,KAAMytX,EAAcG,IAC3D5tX,KAAKy8W,oBAEL,IAAIwzQ,EAAoBjwnB,KAAKqsX,iBAAmBrsX,KAAKqsX,iBAAiBp7W,QAAU,GAahF,OAZAy8W,EAAsBrrX,SAAQ,SAAUgrX,GACpC,IAAImB,EAAUv4W,EAAMw4W,cAAcpB,EAAU39B,OAC5CO,EAAgBggS,EAAmBzhQ,GACnCv4W,EAAM63W,wBAAwBU,EAASnB,EAAWxxU,EAAOkyU,aAAc,KAAM,MAAM,EAAMviX,EAC7F,IAEAyknB,EAAkB5tnB,QAAQ2tnB,GAC1BhwnB,KAAK0uX,0BAA0B7yU,GAC/B77C,KAAK08W,uBAAuBlxW,GAC5BxL,KAAKi+W,0BAA0BzyW,GAC/BuxW,IACA/8W,KAAKwoX,uBAAuBxlR,SACrB46D,CACX,EACA6xd,EAAY9unB,UAAU+tX,0BAA4B,SAAU7yU,GACxD,GAAK77C,KAAK69W,oBAAuBhiU,EAAOyxU,YAAezxU,EAAOxxB,MAA9D,CAGA,IAAIskW,EAAW,GACXC,EAAkB,CAAC,EACnB0C,EAAiB,CAAC,EACtBtxX,KAAKq+W,YAAYh8W,SAAQ,SAAUgzD,GAAO,OAAOi8T,EAAej8T,EAAI1tB,SAAW0tB,CAAK,IACpFxZ,EAAOxxB,MAAMhoB,SAAQ,SAAUorB,GAC3B,GAAKA,EAAKiiU,QAASk/B,EAAgBnhW,EAAKiiU,OAAxC,CAGA,IAAIr6R,EAAMi8T,EAAe7jW,EAAKiiU,OAC1Br6R,IACAs5T,EAASltX,KAAK4zD,GACdu5T,EAAgBnhW,EAAKiiU,QAAS,EAJlC,CAMJ,IAEA1vV,KAAKq+W,YAAYh8W,SAAQ,SAAUgzD,GAC1Bu5T,EAAgBv5T,EAAIkwS,aACrBopB,EAASltX,KAAK4zD,EAEtB,IAKAs5T,EAAW3uX,KAAK6uX,qBAAqBF,GAChC3uX,KAAK6oX,0BAA0B8F,GAIpC3uX,KAAKq+W,YAAcsQ,EAHfnjU,QAAQC,KAAK,gIA3BjB,CA+BJ,EACAgkkB,EAAY9unB,UAAUq8W,kCAAoC,SAAUxxW,GAChE,IAAIyK,EAAQjW,KAIZ,MAD8BA,KAAK68W,WAE/B,OAAO,WAAc,EAEzB,IAAIiS,EAAa,CACbvT,gBAAiBv7W,KAAKu7W,gBAAgBtqW,QACtCwqW,aAAcz7W,KAAKy7W,aAAaxqW,QAChCuqW,aAAcx7W,KAAKw7W,aAAavqW,SAEhC89W,EAAoB/uX,KAAKysX,iBACzBuC,EAAuB,CAAC,EAI5B,OAHAD,EAAkB1sX,SAAQ,SAAUgzD,GAChC25T,EAAqB35T,EAAIq6R,OAASr6R,CACtC,IACO,WACH,IAAIp/C,EAAM+jV,mBAAmBi1B,8BAA7B,CAGA,IAAIihQ,EAAej6mB,EAAM65mB,6BAErB5gQ,EAA0B,SAAUzvP,EAAW0vP,EAAYC,EAAWC,GAItE,IADgBt/B,EAFCo/B,EAAWliX,IAAIoiX,GAChBD,EAAUniX,IAAIoiX,IAE9B,CAIA,IAAI/oV,EAAQ,CACRn9B,KAAMs2H,EACNh2B,QAAS2lR,EACThsX,OAA6B,IAArBgsX,EAAU9tX,OAAe8tX,EAAU,GAAK,KAChD/jV,IAAKp1B,EAAMusV,QACXtB,UAAWjrV,EAAMirV,UACjB11V,OAAQA,GAEZyK,EAAMynV,aAAa/2T,cAAcL,EAVjC,CAWJ,EAEIgpV,EAAoB,SAAUC,GAC9B,IAAIC,EAAiB,GAOrB,OANC0gQ,GAAgB,IAAI7tnB,SAAQ,SAAUe,GACnC,IAAIqsX,EAAiBT,EAAqB5rX,EAAOmiW,YAC7CkqB,GAAkBF,EAAiBE,EAAgBrsX,IACnDosX,EAAe/tX,KAAK2B,EAE5B,IACOosX,CACX,EACIE,EAAiB,SAAU9hU,GAAK,OAAOA,EAAE23S,UAAY,EACzD2pB,EAAwBzb,GAAOI,+BAAgCib,EAAWvT,gBAAiBtlW,EAAMslW,gBAAiBmU,GAClHR,EAAwBzb,GAAOM,2BAA4B+a,EAAWrT,aAAcxlW,EAAMwlW,aAAciU,GAQpFJ,GAPO,SAAUK,EAAI/hU,GACrC,IAAIuikB,EAA0B,MAAdxgQ,EAAGpsB,QACf6sR,EAAgBD,GAAavikB,EAAEo5S,gBAE/BqpR,EAAiBF,GAAaxgQ,EAAGpsB,SAAW31S,EAAE41S,aAClD,OAAO4sR,GAAiBC,CAC5B,IAEkB/unB,OAAS,GAMvB2U,EAAM0hgB,gBAAgBlkK,GAAOQ,2BAA4Bh+V,EAAMulW,aAAchwW,GAGjFyK,EAAMirW,uBAAuBoO,GADD,SAAUK,EAAI/hU,GAAK,OAAO+hU,EAAGrhW,OAASs/B,EAAE63S,gBAAkB,KACf,EAAMj6V,GAE7EyK,EAAM25W,uBAAuBN,GADD,SAAUK,EAAI/hU,GAAK,OAAO+hU,EAAGxxB,QAAUvwS,EAAEq3S,WAAa,IACXz5V,GAEvEyK,EAAM45W,wBAAwBP,GADE,SAAUK,EAAI/hU,GAAK,OAAO+hU,EAAG/qV,MAAQgpB,EAAE/hB,WAAa,IACRrgC,GAExE8jX,GADsB,SAAUK,EAAI/hU,GAAK,OAAO+hU,EAAG58V,MAAQ66B,EAAE60S,WAAaktB,EAAG5xB,WAAanwS,EAAEu1S,cAAgB,IACrE7hW,OAAS,GAChD2U,EAAM65W,eAAeC,4BAGzB95W,EAAM+5W,sBAAsBjB,EAAmBvjX,EA9D/C,CA+DJ,CACJ,EACAiknB,EAAY9unB,UAAUivX,uBAAyB,SAAUJ,EAAgBhkX,GACrE,GAAKgkX,EAAeluX,OAApB,CAIA,IAAI8B,EAAmC,IAA1BosX,EAAeluX,OAAekuX,EAAe,GAAK,KAE3DrxB,EAASn+V,KAAKswnB,eAAe9gQ,GAAgB,SAAUn6T,GAAO,OAAOA,EAAI4vS,WAAa,IACtF3+T,EAAQ,CACRn9B,KAAMsqW,GAAOW,oBAEbjW,OAAkB,MAAVA,EAAiBA,EAAS,KAClC10P,QAAS+lR,EACTpsX,OAAQA,EACRioC,IAAKrrC,KAAKwiW,QACVtB,UAAWlhW,KAAKkhW,UAChB11V,OAAQA,GAEZxL,KAAK09V,aAAa/2T,cAAcL,EAfhC,CAgBJ,EACAmplB,EAAY9unB,UAAU2vnB,eAAiB,SAAUjyX,EAAM+1J,GACnD,GAAK/1J,GAAuB,GAAfA,EAAK/8P,OAAlB,CAKA,IADA,IAAIivnB,EAAan8N,EAAY/1J,EAAK,IACzB18P,EAAI,EAAGA,EAAI08P,EAAK/8P,OAAQK,IAC7B,GAAI4unB,IAAen8N,EAAY/1J,EAAK18P,IAEhC,OAGR,OAAO4unB,CATP,CAUJ,EACAd,EAAY9unB,UAAUkvX,wBAA0B,SAAUL,EAAgBhkX,GACtE,GAAKgkX,EAAeluX,OAApB,CAIA,IAAI8B,EAAmC,IAA1BosX,EAAeluX,OAAekuX,EAAe,GAAK,KAE3DtxB,EAAUl+V,KAAKswnB,eAAe9gQ,GAAgB,SAAUn6T,GAAO,OAAOA,EAAIxpB,WAAa,IACvFvF,EAAQ,CACRn9B,KAAMsqW,GAAOU,qBACbjW,QAASA,EACTz0P,QAAS+lR,EACTpsX,OAAQA,EACRioC,IAAKrrC,KAAKwiW,QACVtB,UAAWlhW,KAAKkhW,UAChB11V,OAAQA,GAEZxL,KAAK09V,aAAa/2T,cAAcL,EAdhC,CAeJ,EACAmplB,EAAY9unB,UAAUqvX,sBAAwB,SAAUP,EAAgBjkX,GAEpE,IAAIyK,EAAQjW,KACRiwX,EAAgBjwX,KAAKysX,iBACrByD,EAAsB,CAAC,EAC3BD,EAAc5tX,SAAQ,SAAUktC,GAAK,OAAO2gV,EAAoB3gV,EAAEmgT,OAASngT,CAAG,IAE9E,IAAI4gV,EAAmB,CAAC,EACxBV,EAAeptX,SAAQ,SAAUktC,GACzB2gV,EAAoB3gV,EAAEmgT,SACtBygC,EAAiB5gV,EAAEmgT,QAAS,EAEpC,IAEA,IAAI0gC,EAAiBllX,EAAOukX,GAAgB,SAAU7hU,GAAK,OAAOuiU,EAAiBviU,EAAE8hS,MAAQ,IACzF2gC,EAAgBnlX,EAAO+kX,GAAe,SAAUriU,GAAK,OAAOuiU,EAAiBviU,EAAE8hS,MAAQ,IAEvF4gC,EAAe,GAUnB,GATAD,EAAchuX,SAAQ,SAAUkuX,EAAS//W,GACrC,IAAIggX,EAAWJ,GAAkBA,EAAe5/W,GAChD,GAAIggX,GAAYA,EAAS9gC,QAAU6gC,EAAQ7gC,MAAO,CAC9C,IAAI+gC,EAAUx6W,EAAM2vW,cAAc4K,EAAS9gC,OACvC+gC,GACAH,EAAa7uX,KAAKgvX,EAE1B,CACJ,IACKH,EAAahvX,OAAlB,CAGA,IAAIglC,EAAQ,CACRn9B,KAAMsqW,GAAOS,mBACbzqQ,QAAS6mR,EACTltX,OAAQ,KACRioC,IAAKrrC,KAAKwiW,QACVtB,UAAWlhW,KAAKkhW,UAChB11V,OAAQA,GAEZxL,KAAK09V,aAAa/2T,cAAcL,EAThC,CAUJ,EACAmplB,EAAY9unB,UAAUmtX,wBAA0B,SAAU1qX,EAAQiqX,EAAWU,EAAcP,EAAiBC,EAAce,EAAShjX,GAC/H,GAAKpI,EAAL,CAGA,IAAIgwD,EAAW,SAAUs9T,EAAMC,GAC3B,IAAIC,EAAWvD,EACXwD,EAAa9C,EACb/mX,EAAM,CAAE8pX,YAAQ5wX,EAAW6wX,YAAQ7wX,GACnC8wX,GAAa,EAmBjB,OAlBIJ,SACuB1wX,IAAnB0wX,EAASF,KACT1pX,EAAI8pX,OAASF,EAASF,GACtBM,GAAa,GAEbjnH,EAAO4mH,SAA4BzwX,IAAnB0wX,EAASD,KACzB3pX,EAAI+pX,OAASH,EAASD,GACtBK,GAAa,KAGhBA,GAAcH,SACU3wX,IAArB2wX,EAAWH,KACX1pX,EAAI8pX,OAASD,EAAWH,IAExB3mH,EAAO4mH,SAA8BzwX,IAArB2wX,EAAWF,KAC3B3pX,EAAI+pX,OAASF,EAAWF,KAGzB3pX,CACX,EAEI49B,EAAOwuB,EAAS,QAAQ09T,YACf5wX,IAAT0kC,GACAxhC,EAAO8hW,YAAYtgU,EAAMp5B,GAG7B,IAAI2yV,EAAS/qS,EAAS,UAAU09T,YACjB5wX,IAAXi+V,GACA/6V,EAAOg7V,UAAUD,GAGrB,IAAIY,EAAc/+V,KAAKy/V,YAAY2uR,qBAAqBhrnB,EAAOgiW,aAE3D7yT,EAAO6gB,EAAS,QAAQ09T,OAM5B,QALa5wX,IAATqyC,GACAnvC,EAAOijW,QAAQ9zT,GAGCnvC,EAAOgjW,WAAa,EACrB,CAEf,IAAI93U,EAAQ8kC,EAAS,SAAS09T,OACjB,MAATxiW,GACmB,MAAfywU,GAAuBzwU,GAASywU,GAChC37V,EAAOu8V,eAAerxU,EAAO9iB,EAGzC,CACA,IAAIunB,EAAOqgC,EAAS,QAAQ09T,YACf5wX,IAAT6yB,IACIA,IAAS8nU,GAAUwB,WAAatpU,IAAS8nU,GAAUuB,SACnDh5V,EAAOs/V,QAAQ3vU,GAGf3vB,EAAOs/V,aAAQxiW,IAGvB,IAAI69V,EAAY3qS,EAAS,aAAa09T,OAKtC,QAJkB5wX,IAAd69V,GACA36V,EAAOggW,aAAarF,IAGpBywB,EAAJ,CAGA,IAAIjrB,EAAUnwS,EAAS,WAAW09T,YAClB5wX,IAAZqjW,IACuB,kBAAZA,GACPngW,EAAOkgW,WAAWC,GACbngW,EAAO4jW,kBACR5jW,EAAOikW,gBAAe,EAAM77V,GAC5BxL,KAAKw7W,aAAa/5W,KAAK2B,MAIvB2mQ,EAAOw5F,IACP/3S,QAAQC,KAAK,yPAObroD,EAAO4jW,kBACP5jW,EAAOikW,gBAAe,EAAO77V,GAC7BykV,EAAgBjwV,KAAKw7W,aAAcp4W,MAI/C,IAAI8iE,EAAK9S,EAAS,WAAY,iBAAkBozS,EAAWtgS,EAAG4qT,OAAQvE,EAAgBrmT,EAAG6qT,YACxE7wX,IAAbsmW,QAA4CtmW,IAAlBqsX,IACG,kBAAlBA,GAA8B/lB,GAChCpjW,EAAOsjW,qBACRtjW,EAAOmjW,mBAAkB,EAAM/6V,GAC/BxL,KAAKu7W,gBAAgB95W,KAAK2B,IAE1BoqX,GAA4C,kBAAlBjB,IAC1BiB,EAAgBpqX,EAAOukC,SAAW4kV,IAIlCnpX,EAAOsjW,qBACPtjW,EAAOmjW,mBAAkB,EAAO/6V,GAChCykV,EAAgBjwV,KAAKu7W,gBAAiBn4W,KAIlD,IAAIiwE,EAAKjgB,EAAS,QAAS,cAAewzS,EAAQvzR,EAAGy9S,OAAQtE,EAAan5S,EAAG09S,YAC/D7wX,IAAV0mW,QAAsC1mW,IAAfssX,IACG,kBAAfA,GAA2B5lB,GAC7BxjW,EAAO0jW,kBACR1jW,EAAOujW,gBAAe,EAAMn7V,GAC5BxL,KAAKy7W,aAAah6W,KAAK2B,IAEvBqqX,GAAsC,kBAAfjB,IACvBiB,EAAarqX,EAAOukC,SAAW6kV,IAI/BppX,EAAO0jW,kBACP1jW,EAAOujW,gBAAe,EAAOn7V,GAC7BykV,EAAgBjwV,KAAKy7W,aAAcr4W,IAzD/C,CAtEA,CAmIJ,EACAqsnB,EAAY9unB,UAAU+nX,eAAiB,SAAU39W,GAC7C,OAAO/K,KAAKixX,WAAWlmX,EAAM/K,KAAK4lX,cAAc5yU,KAAKhzC,MACzD,EACAyvnB,EAAY9unB,UAAUswX,WAAa,SAAUlmX,EAAMmmX,GAC/C,IAAIC,EAAe,GASnB,OARIpmX,GACAA,EAAK1I,SAAQ,SAAU9B,GACnB,IAAI6C,EAAS8tX,EAAqB3wX,GAC9B6C,GACA+tX,EAAa1vX,KAAK2B,EAE1B,IAEG+tX,CACX,EAEAs+P,EAAY9unB,UAAUywX,wBAA0B,SAAU7wX,GACtD,GAAW,MAAPA,EACA,OAAO,KAEX,IAAI6C,EAASpD,KAAK4lX,cAAcrlX,GAIhC,OAHK6C,GACDooD,QAAQC,KAAK,kCAAoClrD,GAE9C6C,CACX,EACAqsnB,EAAY9unB,UAAUo/W,iBAAmB,SAAUx/W,GAC/C,OAAKP,KAAKgvW,eAGHhvW,KAAKqxX,UAAU9wX,EAAKP,KAAKgvW,eAAgBhvW,KAAKy9W,mBAF1C,IAGf,EACAgyQ,EAAY9unB,UAAUilX,cAAgB,SAAUrlX,GAC5C,OAAOP,KAAKqxX,UAAU9wX,EAAKP,KAAKq+W,YAAar+W,KAAKsxX,eACtD,EACAm+P,EAAY9unB,UAAU0wX,UAAY,SAAU9wX,EAAKgxX,EAAYC,GACzD,IAAKjxX,EACD,OAAO,KAIX,GAAkB,iBAAPA,GAAmBixX,EAAUjxX,GACpC,OAAOixX,EAAUjxX,GAErB,IAAK,IAAIoB,EAAI,EAAGA,EAAI4vX,EAAWjwX,OAAQK,IACnC,GAAI3B,KAAKyxX,aAAaF,EAAW5vX,GAAIpB,GACjC,OAAOgxX,EAAW5vX,GAG1B,OAAO3B,KAAKyuX,cAAcluX,EAC9B,EACAkvnB,EAAY9unB,UAAU8tX,cAAgB,SAAUluX,GAC5C,IAAI0V,EAAQjW,KACZ,OAAKA,KAAKqsX,kBACLtiH,EAAO/pQ,KAAKqsX,oBACb9wE,EAAQv7S,KAAKqsX,kBAGV5rW,EAAKzgB,KAAKqsX,kBAAkB,SAAUqF,GAAY,OAAOz7W,EAAMw7W,aAAaC,EAAUnxX,EAAM,IAFxF,IAGf,EACAkvnB,EAAY9unB,UAAU8wX,aAAe,SAAUruX,EAAQ7C,GACnD,IAAIoxX,EAAgBvuX,IAAW7C,EAC3BqxX,EAAgBxuX,EAAOgiW,cAAgB7kW,EACvCsxX,EAAYzuX,EAAOmiW,YAAchlW,EACrC,OAAOoxX,GAAiBC,GAAiBC,CAC7C,EACA49P,EAAY9unB,UAAUmxX,wBAA0B,SAAU1uX,EAAQ4hD,EAAU+sU,GAExE,QADuB,IAAnBA,IAA6BA,GAAiB,IAC7C3uX,EACD,OAAO,KAEX,IAAImwW,EAAavzW,KAAKgyX,cAAc5uX,EAAOgiW,YAAahiW,EAAQ,KAAM,KAAM4hD,GAC5E,OAAI+sU,EACO/xX,KAAKiyX,0BAA0B7uX,EAAQmwW,GAE3CA,CACX,EACAk8Q,EAAY9unB,UAAUuxX,qCAAuC,SAAU/I,EAAa/gB,EAAqBpjT,GACrG,IAAI0lT,EAActC,EAAsBA,EAAoByB,iBAAmB,KAC/E,OAAIa,EACO1qW,KAAKgyX,cAActnB,EAAa,KAAMye,EAAa/gB,EAAqBpjT,GAE5E,IACX,EACAyqkB,EAAY9unB,UAAUwxX,6BAA+B,SAAUhJ,EAAankU,GACxE,OAAOhlD,KAAKkyX,qCAAqC/I,EAAaA,EAAYxgB,yBAA0B3jT,EACxG,EAEAyqkB,EAAY9unB,UAAUqxX,cAAgB,SAAU50B,EAAQh6V,EAAQ+lX,EAAa/gB,EAAqBpjT,GAC9F,IAAIotU,EAAoBh1B,EAAOg1B,kBAC/B,GAAIA,EAAmB,CACnB,IAAIv2U,EAAS,CACTuhT,OAAQA,EACRh6V,OAAQA,EACR+lX,YAAaA,EACb/gB,oBAAqBA,EACrBpjT,SAAUA,EACV3Z,IAAKrrC,KAAKg6V,mBAAmBiH,SAC7Bl+V,QAAS/C,KAAKg6V,mBAAmB9vN,cAErC,MAAiC,oBAAtBkoP,EAEAA,EAAkBv2U,GAES,kBAAtBu2U,EAELpyX,KAAKqyX,kBAAkB5kI,SAAS2kI,EAAmBv2U,IAE9D2P,QAAQC,KAAK,6DACN,GACX,CACK,OAAyB,MAArB2xS,EAAOmW,WACLnW,EAAOmW,WAETnW,EAAOz0H,MACL6wI,GAAqBpc,EAAOz0H,OAEhC,EACX,EACA8mZ,EAAY9unB,UAAUsxX,0BAA4B,SAAU7uX,EAAQmwW,GAChE,GAAIvzW,KAAKg6V,mBAAmBs4B,4BACxB,OAAO/e,EAGX,IAGIgf,EAHArS,EAAmB98W,EAAOgiW,YAAY8a,iBAEtC3c,EAAU,KAGd,GAJ8Bx5F,EAAOm2G,GAKjC3c,EAAU2c,EAAmBA,EAAiB1c,aAAe,KAC7D+uB,GAAe,MAEd,CACD,IAAIC,EAAgBpvX,EAAO4jW,gBACvByrB,EAAqBzyX,KAAK47W,YAAc57W,KAAK8qX,kBAC7C0H,GAAiBC,GACjBlvB,EAAUngW,EAAOogW,aACjB+uB,GAAe,GAGfA,GAAe,CAEvB,CACA,GAAIA,EAAc,CACd,IAAIG,EAAoC,kBAAZnvB,EAAwBA,EAAU,OAG9D,OAFqBvjW,KAAKg6V,mBAAmB24B,mBACfC,CAAeF,EAAeA,GAC3B,IAAMnf,EAAa,GACxD,CACA,OAAOA,CACX,EAGAk8Q,EAAY9unB,UAAUkyX,eAAiB,SAAUnjC,EAAO4Y,GACpD,IAAK5Y,EACD,OAAO,KAEX,GAAIA,aAAiByY,GACjB,OAAOzY,EAEX,IAAIojC,EAAkB9yX,KAAK4hX,uBACvBmR,EAAwC,kBAAfzqB,EACzB9gW,EAAS,KAgBb,OAfAxH,KAAKy/V,YAAYuzB,8BAA8BF,GAAiB,SAAU5lX,GACtE,GAAIA,aAAiBi7V,GAAa,CAC9B,IAAIghB,EAAcj8W,GAEd6lX,EACUrjC,IAAUy5B,EAAYjgB,cAAgBZ,IAAe6gB,EAAYhgB,gBAGjEzZ,IAAUy5B,EAAYjgB,gBAGhC1hW,EAAS2hX,EAEjB,CACJ,IACO3hX,CACX,EACAionB,EAAY9unB,UAAUioB,QAAU,WAC5B,OAAO5oB,KAAKq9J,KAChB,EACAoyd,EAAY9unB,UAAUi9W,oBAAsB,SAAUpyW,EAAQ2xW,GAC1Dn9W,KAAKw7W,aAAex7W,KAAKizX,eAAe9V,EAAmBn9W,KAAKw7W,cAAc,SAAUnmT,EAAK6tL,GAAQ,OAAO7tL,EAAIgyS,eAAenkH,EAAM13O,EAAS,IAE9I,WAAgC,IAAG,WAAgC,IAEnE,SAAU4xV,GACN,IAAImG,EAAUnG,EAAOmG,QAErB,OAAgB,OAAZA,GAAgC,KAAZA,EACb,UAEKrjW,IAAZqjW,IAGKA,OAHT,CAIJ,IAAG,SAAUnG,GAET,OAAgC,MAAzBA,EAAO+nB,gBAAmD,IAAzB/nB,EAAO+nB,cACnD,IAEAnlX,KAAKw7W,aAAan5W,SAAQ,SAAUgzD,GAChC,IAAI+nS,EAAS/nS,EAAI+vS,YAEK,MAAlBhI,EAAOmG,SAAqC,IAAlBnG,EAAOmG,QACjCluS,EAAIiuS,WAAWlG,EAAOmG,SAIjBluS,EAAImuS,cACLnuS,EAAIiuS,WAAWlG,EAAO+nB,eAGlC,GACJ,EACAsqQ,EAAY9unB,UAAU+8W,uBAAyB,SAAUlyW,EAAQ2xW,GAC7Dn9W,KAAKu7W,gBAAkBv7W,KAAKizX,eAAe9V,EAAmBn9W,KAAKu7W,iBAAiB,SAAUlmT,EAAK6tL,GAAQ,OAAO7tL,EAAIkxS,kBAAkBrjH,EAAM13O,EAAS,IAAG,SAAU4xV,GAAU,OAAOA,EAAOmvB,aAAe,IAAG,SAAUnvB,GAAU,OAAOA,EAAO81B,oBAAsB,IAAG,SAAU91B,GAAU,OAAOA,EAAOoJ,QAAU,IAAG,SAAUpJ,GAAU,OAAOA,EAAO+1B,eAAiB,GAC/W,EACAs8P,EAAY9unB,UAAUsyX,eAAiB,SAAU9V,EAAmBiW,EAAcC,EAAaC,EAAcC,EAAqBC,EAAcC,QAClH,IAAtBtW,IAAgCA,EAAoB,SACnC,IAAjBiW,IAA2BA,EAAe,IAC9C,IAAIM,EAAgB,GAChBC,EAAgB,IAInB3zX,KAAKgvW,gBAAkB,IAAI3sW,SAAQ,SAAUgzD,GAC1C,IAAIw+T,EAAW1W,EAAkBjpW,QAAQmhD,GAAO,EAC5C+nS,EAAS/nS,EAAI+vS,YACbp/V,EAAQqoV,EAAcmlC,EAAap2B,IACnC76L,EAAe8rL,EAAcolC,EAAoBr2B,IACjD5sV,EAAQ29U,EAAamlC,EAAal2B,IAClC02B,EAAe3lC,EAAaolC,EAAoBn2B,UAEvBl9V,IAAV8F,EAKLA,OAJe9F,IAAVsQ,EAOD,OAAVA,GAQUA,GAAS,EAInBqjX,OAlBmC3zX,IAAjBqiK,EAqBJA,UApBqBriK,IAAjB4zX,KAuBY,MAAhBA,GAAwBA,GAAgB,GAS5CV,EAAal/W,QAAQmhD,IAAQ,MAI5Bw+T,EAAqB,MAATrjX,GAAiC,MAAhBsjX,EAAiC,MAATtjX,GACzDkjX,EAAcjyX,KAAK4zD,GAAOs+T,EAAclyX,KAAK4zD,GAEhE,IACA,IAAI0+T,EAAiB,SAAU1+T,GAC3B,IAAI7kD,EAAQ8iX,EAAaj+T,EAAI+vS,aACzB4uB,EAAeT,EAAoBl+T,EAAI+vS,aAC3C,OAAgB,MAAT50V,EAAgBA,EAAQwjX,CACnC,EAEAN,EAAc3gW,MAAK,SAAUurV,EAAMC,GAC/B,IAAI0P,EAAS8F,EAAezV,GACxB4P,EAAS6F,EAAexV,GAC5B,OAAI0P,IAAWC,EACJ,EAEPD,EAASC,GACD,EAEL,CACX,IACA,IAAI9lT,EAAM,GAAGj8D,OAAOunX,GA0BpB,OAvBAN,EAAa/wX,SAAQ,SAAUgzD,GACvBs+T,EAAcz/W,QAAQmhD,IAAQ,GAC9B+S,EAAI3mE,KAAK4zD,EAEjB,IAEAs+T,EAActxX,SAAQ,SAAUgzD,GACxB+S,EAAIl0D,QAAQmhD,GAAO,GACnB+S,EAAI3mE,KAAK4zD,EAEjB,IAEA+9T,EAAa/wX,SAAQ,SAAUgzD,GACvB+S,EAAIl0D,QAAQmhD,GAAO,GACnBg+T,EAAYh+T,GAAK,EAEzB,IAEA+S,EAAI/lE,SAAQ,SAAUgzD,GACd+9T,EAAal/W,QAAQmhD,GAAO,GAC5Bg+T,EAAYh+T,GAAK,EAEzB,IACO+S,CACX,EACAqnjB,EAAY9unB,UAAUg9W,oBAAsB,SAAUnyW,EAAQ2xW,GAC1Dn9W,KAAKy7W,aAAez7W,KAAKizX,eAAe9V,EAAmBn9W,KAAKy7W,cAAc,SAAUpmT,EAAK6tL,GAAQ,OAAO7tL,EAAIsxS,eAAezjH,EAAM13O,EAAS,IAAG,SAAU4xV,GAAU,OAAOA,EAAOovB,UAAY,IAAG,SAAUpvB,GAAU,OAAOA,EAAO62B,iBAAmB,IAAG,SAAU72B,GAAU,OAAOA,EAAOwJ,KAAO,IAAG,SAAUxJ,GAAU,OAAOA,EAAO82B,YAAc,GAC1V,EACAu7P,EAAY9unB,UAAUwzX,sBAAwB,SAAU3oX,QACrC,IAAXA,IAAqBA,EAAS,OAClC,IAAI4oX,EAAa,GACjBp0X,KAAKy/V,YAAYoQ,6BAA6B,KAAM7vW,KAAKq9W,mBAAmB,SAAUnwW,GAClF,GAAIA,aAAiByhnB,GAAqB,CACtC,IAAIjkR,EAAcx9V,EAAM28V,iBACpBwqB,EAAa,CACbhsB,QAASn7V,EAAMg8V,aACfphT,KAAO4iT,EAA0BA,EAAYE,mBAAxB1qW,GAEzBk0X,EAAW3yX,KAAK4yX,EACpB,CACJ,IACAr0X,KAAKs0X,oBAAoBF,EAAY5oX,EACzC,EACAiknB,EAAY9unB,UAAU4zX,oBAAsB,WACxC,IAAIC,EAAmB,GAUvB,OATAx0X,KAAKy/V,YAAYoQ,6BAA6B,KAAM7vW,KAAKgwW,kBAAkB,SAAU7rW,GACjF,GAAIA,aAAgBwqnB,GAAqB,CACrC,IAAIvmR,EAAsBjkW,EAC1BqwX,EAAiB/yX,KAAK,CAClB4mW,QAASD,EAAoBc,aAC7BphT,KAAMsgT,EAAoB4B,cAElC,CACJ,IACOwqB,CACX,EACAi7P,EAAY9unB,UAAU2zX,oBAAsB,SAAUF,EAAY5oX,GAC9D,IAAIyK,EAAQjW,UACG,IAAXwL,IAAqBA,EAAS,OAClCxL,KAAKwoX,uBAAuBn2V,QAC5B,IAAIoiW,EAAiB,GACrBL,EAAW/xX,SAAQ,SAAUgrX,GACzB,IAAIqH,EAAWrH,EAAUhlB,QACrBrlL,EAAWqqM,EAAUvlU,KACrBsgT,EAAsBnyV,EAAM0yV,uBAAuB+rB,GAClDtsB,GAGDA,EAAoB4B,eAAiBhnL,IAGzC/sK,EAAMiiH,OAAO5vD,IAAI,qBAAuB8/R,EAAoBc,aAAe,IAAMlmL,EAAW,KAC5FolL,EAAoB6B,YAAYjnL,GAChCyxM,EAAehzX,KAAK2mW,GACxB,IACApoW,KAAK20X,gCAAgCnpX,GACrCxL,KAAKmgX,+BAA+B30W,GACpCipX,EAAepyX,SAAQ,SAAU+lW,GAC7B,IAAI9hU,EAAQ,CACRn9B,KAAMsqW,GAAOY,0BACb8U,YAAa/gB,EACb/8T,IAAKp1B,EAAMusV,QACXtB,UAAWjrV,EAAMirV,WAErBjrV,EAAMynV,aAAa/2T,cAAcL,EACrC,IACAtmC,KAAKwoX,uBAAuBxlR,QAChC,EAEAyshB,EAAY9unB,UAAUi0X,qBAAuB,SAAUr0X,EAAKyiL,EAAUx3K,GAElE,IAAIqpX,OADW,IAAXrpX,IAAqBA,EAAS,OAG9BqpX,EADAt0X,aAAeounB,GACDpunB,EAAIonC,QAGJpnC,GAAO,GAEzBP,KAAKs0X,oBAAoB,CAAC,CAAEjsB,QAASwsB,EAAa/sU,KAAMk7H,IAAax3K,EACzE,EACAiknB,EAAY9unB,UAAUgoW,uBAAyB,SAAUpoW,GACrD,GAAIA,aAAeounB,GACf,OAAOpunB,EAEQ,kBAARA,GACPirD,QAAQ3R,MAAM,uCAGlB,IAAIuuB,EAAM,KASV,OARApoE,KAAKy/V,YAAYoQ,6BAA6B,KAAM7vW,KAAKgwW,kBAAkB,SAAU7rW,GACjF,GAAIA,aAAgBwqnB,GAAqB,CACrC,IAAIvmR,EAAsBjkW,EACtBikW,EAAoBzgU,UAAYpnC,IAChC6nE,EAAMggS,EAEd,CACJ,IACOhgS,CACX,EACAqnjB,EAAY9unB,UAAUm0X,2BAA6B,WAC/C,IAAI7+W,EAAQjW,KAoBZ,OAlBIA,KAAK47W,YAAc57W,KAAK86W,wBAGJ96W,KAAKq+W,YAAYnzW,QAAO,SAAU9H,GAClD,IAAI2xX,EAAiB9+W,EAAMo2W,kBAAoB/+W,EAAS2I,EAAMo2W,iBAAkBjpX,GAC5E4xX,EAAa/+W,EAAMulW,cAAgBluW,EAAS2I,EAAMulW,aAAcp4W,GACpE,OAAO2xX,GAAkBC,CAC7B,IAKoBh1X,KAAKq+W,YAAYnzW,QAAO,SAAU9H,GAGlD,OADqB6S,EAAMo2W,kBAAoB/+W,EAAS2I,EAAMo2W,iBAAkBjpX,IACvDA,EAAOyoC,WACpC,GAGR,EACA4jlB,EAAY9unB,UAAUs0X,yBAA2B,SAAUxrR,GACvD,IAAIjiG,GAAS,EAMb,OALAiiG,EAAQpnG,SAAQ,SAAUgzD,GAClB00M,EAAO10M,EAAI+vS,YAAYQ,WACvBp+V,GAAS,EAEjB,IACOA,CACX,EACAionB,EAAY9unB,UAAUu0X,gCAAkC,WACpD,IAAIj/W,EAAQjW,KACZA,KAAKm1X,oBAAsB,GAC3B,IAAIC,EAAY,SAAU//T,GACtB,IAAI+nS,EAAS/nS,EAAI+vS,YACbhI,GAAUrzF,EAAOqzF,EAAO0C,eACxB7pV,EAAMk/W,oBAAoB1zX,KAAK4zD,EAEvC,EACAr1D,KAAKq+W,YAAYh8W,QAAQ+yX,GACrBp1X,KAAKqsX,kBACLrsX,KAAKqsX,iBAAiBhqX,QAAQ+yX,EAEtC,EACAq6P,EAAY9unB,UAAU00X,uBAAyB,WAC3C,OAAOr1X,KAAKm1X,mBAChB,EACAs6P,EAAY9unB,UAAU+7W,uBAAyB,SAAUlxW,GACrD,IAAI8pX,EAAoBt1X,KAAK80X,6BAC7B90X,KAAKu1X,oBAAoBD,GACzBt1X,KAAKk1X,kCAELl1X,KAAK20X,gCAAgCnpX,GAErCxL,KAAKmgX,+BAA+B30W,EACxC,EACAiknB,EAAY9unB,UAAU60X,0BAA4B,WAC9C,OAAOx1X,KAAK86W,uBAChB,EACA20Q,EAAY9unB,UAAU80X,oBAAsB,SAAUC,EAASlqX,QAC5C,IAAXA,IAAqBA,EAAS,OAClC,IAAImqX,EAAiBD,GAAWA,EAAQp0X,OAAS,EAEjD,GAAKq0X,GAAmB31X,KAAK86W,wBAA7B,CAGA,GAAI6a,EAAgB,CAChB31X,KAAK41X,kCAAkCF,GACvC,IAAIpY,EAAqBt9W,KAAKu9W,cAAczO,iBAAiB4mB,GAAS,GACtE11X,KAAK61X,sBAAwBvY,EAAmB3N,WAChD3vW,KAAK66W,wBAA0ByC,EAAmB7N,SAAW,EAC7DzvW,KAAK6/W,iBAAmB7/W,KAAKw9W,mBAAmBx9W,KAAK61X,uBACrD71X,KAAK86W,yBAA0B,CACnC,MAEI96W,KAAK61X,sBAAwB,KAC7B71X,KAAK66W,yBAA2B,EAChC76W,KAAK6/W,iBAAmB,KACxB7/W,KAAK86W,yBAA0B,EAEnC96W,KAAKy8W,oBACLz8W,KAAK08W,uBAAuBlxW,EAhB5B,CAiBJ,EACAiknB,EAAY9unB,UAAUi1X,kCAAoC,SAAUF,GAChE,IAAIxR,EAAiBlkX,KAAKg6V,mBAAmB87B,gCACzCC,EAAgB/1X,KAAKg6V,mBAAmBg8B,qCAC5C,GAAK9R,GAAmB6R,EAAxB,CAGA,IAAIE,EAAmB,SAAUC,GAC7BA,EAAS7zX,SAAQ,SAAUmxW,GAEvB,GADczpG,EAAOypG,EAAe7oW,UACvB,CACT,IAAI+/V,EAAc8I,EACduiB,GACAA,EAAcrrB,GAElBurB,EAAiBvrB,EAAY//V,SACjC,KACK,CAEGu5W,GACAA,EAFS1Q,EAIjB,CACJ,GACJ,EACIkiB,GACAO,EAAiBP,EApBrB,CAsBJ,EAEA+5P,EAAY9unB,UAAU87W,kBAAoB,WACtC,IAAIxmW,EAAQjW,KACRA,KAAK69W,qBACL79W,KAAK0pX,iBAAmB1pX,KAAKq+W,aAE7Br+W,KAAK6/W,kBAAoB7/W,KAAK61X,uBAC9B71X,KAAKgwW,iBAAmBhwW,KAAK61X,sBAAsB5kX,QACnDjR,KAAK+6W,mBAAqB/6W,KAAK66W,wBAC/B76W,KAAKq+W,YAAcr+W,KAAK6/W,iBAAiB5uW,QACzCjR,KAAK69W,oBAAqB,GAErB79W,KAAKgvW,iBACVhvW,KAAKgwW,iBAAmBhwW,KAAKq9W,kBAAkBpsW,QAC/CjR,KAAK+6W,mBAAqB/6W,KAAK46W,sBAC/B56W,KAAKq+W,YAAcr+W,KAAKgvW,eAAe/9V,QACvCjR,KAAK69W,oBAAqB,EAI1B79W,KAAKm2X,gCAETn2X,KAAKo2X,4BACLp2X,KAAKq+W,YAAcr+W,KAAK6uX,qBAAqB7uX,KAAKq+W,aAClDr+W,KAAKs2X,0BACLt2X,KAAKu2X,mCACLv2X,KAAKwiX,cAAgBxiX,KAAKi1X,yBAAyBj1X,KAAKq+W,aACxDr+W,KAAKsxX,eAAiB,CAAC,EACvBtxX,KAAKq+W,YAAYh8W,SAAQ,SAAUgzD,GAAO,OAAOp/C,EAAMq7W,eAAej8T,EAAI1tB,SAAW0tB,CAAK,IAC1Fr1D,KAAKwwnB,sBACL,IAAIlqlB,EAAQ,CACRn9B,KAAMsqW,GAAOO,2BACb3oU,IAAKrrC,KAAKwiW,QACVtB,UAAWlhW,KAAKkhW,WAEpBlhW,KAAK09V,aAAa/2T,cAAcL,EACpC,EACAmplB,EAAY9unB,UAAU6vnB,oBAAsB,WAExC,GADAxwnB,KAAKywnB,iBAAmBzwnB,KAAKq+W,YAAYnzW,QAAO,SAAUmqD,GAAO,OAAOA,EAAI+vS,YAAYixB,UAAY,IAAG/0X,OAAS,EAC5GtB,KAAKywnB,iBAAkB,CACvBzwnB,KAAK0vnB,6BAA8B,EACnC,IAAI/sM,EAAe3ib,KAAK85X,SAAS4yB,UAEjC,KADwBi2B,IAAiB9nF,GAAUU,4BAA8BonF,IAAiB9nF,GAAUW,4BACpF,CAEpB9H,GAAO,WAAc,OAAOloS,QAAQC,KADpB,+FACqC,GAAG,iCAC5D,CACJ,CACJ,EACAgkkB,EAAY9unB,UAAUw1X,6BAA+B,WACjD,IAAI56E,EAAQv7S,KAAK0pX,kBAAjB,CAGA,IAAI8M,EAAyB+4P,GAAavvnB,KAAK0pX,iBAAiBz8W,KAAI,SAAUooD,EAAK7kD,GAAS,MAAO,CAAC6kD,EAAK7kD,EAAQ,KAG7GimX,GAAc,EAMlB,GALAz2X,KAAKq+W,YAAYh8W,SAAQ,SAAUgzD,GAC3BmhU,EAAuBr/W,IAAIk+C,KAC3BohU,GAAc,EAEtB,KACIA,EAAJ,CAKA,IAAIC,EAAc64P,GAAavvnB,KAAKq+W,YAAYpxW,KAAI,SAAUooD,GAAO,MAAO,CAACA,GAAK,EAAO,KACrFshU,EAAiB32X,KAAK0pX,iBAAiBx+W,QAAO,SAAUmqD,GAAO,OAAOqhU,EAAYv/W,IAAIk+C,EAAM,IAC5FuhU,EAAa24P,GAAa54P,EAAe1pX,KAAI,SAAUooD,GAAO,MAAO,CAACA,GAAK,EAAO,KAClFwhU,EAAiB72X,KAAKq+W,YAAYnzW,QAAO,SAAUmqD,GAAO,OAAQuhU,EAAWz/W,IAAIk+C,EAAM,IAEvFyhU,EAAiBH,EAAe1lX,QACpC4lX,EAAex0X,SAAQ,SAAU00X,GAC7B,IAAIx9V,EAASw9V,EAAOl4B,oBAEpB,GAAKtlU,EAAL,CAOA,IADA,IAAIy9V,EAAW,IACPA,EAAS11X,QAAUi4B,GAAQ,CAChBA,EAAOqvU,iBACbvmW,SAAQ,SAAU40X,GACvB,IAAIC,EAAyBJ,EAAe5iX,QAAQ+iX,IAAY,EAC5DE,EAAkBH,EAAS9iX,QAAQ+iX,GAAW,EAC9CC,GAA0BC,GAC1BH,EAASv1X,KAAKw1X,EAEtB,IACA19V,EAASA,EAAOslU,mBACpB,CAEA,GAAKm4B,EAAS11X,OAAd,CAKA,IAAIq5C,EAAUq8U,EAAS/pX,KAAI,SAAUooD,GAAO,OAAOyhU,EAAe5iX,QAAQmhD,EAAM,IAC5EttD,EAAYohB,KAAK+D,IAAItjB,MAAMuf,KAAMwxB,GACrCy1S,EAAgB0mC,EAAgBC,EAAQhvX,EAAY,EAJpD,MAFI+uX,EAAer1X,KAAKs1X,EAjBxB,MAFID,EAAer1X,KAAKs1X,EA0B5B,IACA/2X,KAAKq+W,YAAcyY,CAxCnB,CAZA,CAqDJ,EACA24P,EAAY9unB,UAAUy2X,6BAA+B,WACjD,OAAOp3X,KAAK46W,sBAAwB,CACxC,EAMA60Q,EAAY9unB,UAAU21X,wBAA0B,WACxCt2X,KAAKqsX,iBACLrsX,KAAK6qX,uBAAyB7qX,KAAKgvW,gBAAkB,IAAI7iW,OAAOnM,KAAKqsX,kBAEhErsX,KAAKgvW,iBACVhvW,KAAK6qX,sBAAwB7qX,KAAKgvW,eAE1C,EACAygR,EAAY9unB,UAAUkuX,qBAAuB,SAAUxwH,GACnD,IAAIg5H,EAASh5H,EAAKnzP,QAAO,SAAU0iD,GAAK,OAAOA,EAAEw3S,YAAYyC,YAAc,IACvEyvB,EAAWj5H,EAAKnzP,QAAO,SAAU0iD,GAAK,OAAQA,EAAEw3S,YAAYyC,YAAc,IAC9E,OAAOwvB,EAAOlrX,OAAOmrX,EACzB,EACAm4P,EAAY9unB,UAAUy1X,0BAA4B,WAG9C,GADAp2X,KAAKu3X,kCACDh8E,EAAQv7S,KAAKqsX,kBAAjB,CAGArsX,KAAKq+W,YAAcr+W,KAAKqsX,iBAAmBrsX,KAAKqsX,iBAAiBlgX,OAAOnM,KAAKq+W,aAAer+W,KAAKq+W,YACjG,IAAIpO,EAAsBjwW,KAAKu9W,cAAczN,oBAAoB9vW,KAAKqsX,iBAAkBrsX,KAAKgwW,kBAC7FhwW,KAAKgwW,iBAAmBC,EAAoB9jW,OAAOnM,KAAKgwW,iBAHxD,CAIJ,EAMAy/Q,EAAY9unB,UAAU41X,iCAAmC,WACrDv2X,KAAK6hX,kBAAoB,GACzB7hX,KAAK8hX,mBAAqB,GAC1B9hX,KAAK+hX,oBAAsB,GAC3B/hX,KAAKw3X,gBAAkB,CAAC,EACxBx3X,KAAKy3X,iBAAmB,CAAC,EACzBz3X,KAAK03X,kBAAoB,CAAC,EAC1B13X,KAAKg7W,qBAAuB,GAC5Bh7W,KAAKi7W,sBAAwB,GAC7Bj7W,KAAKk7W,uBAAyB,GAC9Bl7W,KAAKm7W,iBAAmB,GACxBn7W,KAAKq7W,gBAAkB,EAC3B,EACAo0Q,EAAY9unB,UAAUg0X,gCAAkC,SAAUnpX,GAC9DxL,KAAK23X,2CACL33X,KAAK43X,uBAAuBpsX,GAC5BxL,KAAK6nX,uBACL7nX,KAAKu/W,kBACLv/W,KAAKioX,mBAEL,IAAI3hV,EAAQ,CACRn9B,KAAMsqW,GAAOc,gCACblpU,IAAKrrC,KAAKwiW,QACVtB,UAAWlhW,KAAKkhW,WAEpBlhW,KAAK09V,aAAa/2T,cAAcL,EACpC,EACAmplB,EAAY9unB,UAAUi3X,uBAAyB,SAAUpsX,GACrDxL,KAAK63X,yCAAyC73X,KAAK6hX,kBAAmB7hX,KAAKg7W,sBAC3Eh7W,KAAK63X,yCAAyC73X,KAAK+hX,oBAAqB/hX,KAAKk7W,wBAC7El7W,KAAK63X,yCAAyC73X,KAAK8hX,mBAAoB9hX,KAAKi7W,uBAC5Ej7W,KAAK83X,uBACL93X,KAAKgoX,cAAcx8W,GACnBxL,KAAK6vnB,wBAA0B7vnB,KAAKm7W,iBAAiBjwW,QAAO,SAAUmqD,GAAO,OAAOA,EAAI+vS,YAAYixB,UAAY,GACpH,EACAo5P,EAAY9unB,UAAUi+W,sBAAwB,WAC1C,OAAO5+W,KAAKywnB,gBAChB,EACAhB,EAAY9unB,UAAU+vnB,2BAA6B,WAC/C,OAAO1wnB,KAAK0vnB,2BAChB,EACAD,EAAY9unB,UAAUm3X,qBAAuB,WACrC93X,KAAKg6V,mBAAmB8O,cACxB9oW,KAAKm7W,iBAAmBn7W,KAAKi7W,sBACxB9uW,OAAOnM,KAAKk7W,wBACZ/uW,OAAOnM,KAAKg7W,sBAGjBh7W,KAAKm7W,iBAAmBn7W,KAAKg7W,qBACxB7uW,OAAOnM,KAAKk7W,wBACZ/uW,OAAOnM,KAAKi7W,sBAEzB,EAEAw0Q,EAAY9unB,UAAUqnX,cAAgB,SAAUx8W,GAC5CxL,KAAK+3X,uBAAuBvsX,GAC5BxL,KAAKg4X,uBACT,EACAy3P,EAAY9unB,UAAUo3X,uBAAyB,SAAUvsX,GACrD,IAAIyK,EAAQjW,KACZ,GAAKA,KAAKgvW,eAAV,CAIA,IAAIipB,EAAaj4X,KAAKgvW,eAAe/9V,MAAM,GAEvCinX,EAAWl4X,KAAKg6V,mBAAmB8O,cACvC,CACI9oW,KAAKg7W,qBACLh7W,KAAKi7W,sBACLj7W,KAAKk7W,wBACP74W,SAAQ,SAAUonG,GAChB,GAAIyuR,EAAU,CAEV,IAAIC,EAASliX,EAAM4tW,qBAAqBp6Q,GACxCA,EAAQpnG,SAAQ,SAAUe,GACtB+0X,GAAU/0X,EAAOqiW,iBACjBriW,EAAO0gW,QAAQq0B,EAAQ3sX,EAC3B,GACJ,KACK,CAED,IAAI4sX,EAAS,EACb3uR,EAAQpnG,SAAQ,SAAUe,GACtBA,EAAO0gW,QAAQs0B,EAAQ5sX,GACvB4sX,GAAUh1X,EAAOqiW,gBACrB,GACJ,CACAvV,EAAmB+nC,EAAYxuR,EACnC,IAIAwuR,EAAW51X,SAAQ,SAAUe,GACzBA,EAAO0gW,QAAQ,KAAMt4V,EACzB,GAjCA,CAkCJ,EACAiknB,EAAY9unB,UAAUq3X,sBAAwB,WAE1C,CACIh4X,KAAK6hX,kBACL7hX,KAAK8hX,mBACL9hX,KAAK+hX,qBACP1/W,SAAQ,SAAUonG,GAChBA,EAAQpnG,SAAQ,SAAUe,GAClBA,aAAkB+kW,IACA/kW,EACNylW,WAEpB,GACJ,GACJ,EACA4mR,EAAY9unB,UAAUk3X,yCAA2C,SAAU7nX,EAAMy5F,GAC7EA,EAAQnoG,OAAS,EACjBtB,KAAKy/V,YAAY44B,oCAAoCroX,GAAM,SAAU9C,GAC7DA,aAAiBiwV,IACjB1zP,EAAQhoG,KAAKyL,EAErB,GACJ,EACAuinB,EAAY9unB,UAAU23X,uBAAyB,WACvCt4X,KAAKm8W,6BAELn8W,KAAKs7W,sBAAwBt7W,KAAKk7W,uBAIlCl7W,KAAKs7W,sBAAwBt7W,KAAKu4X,iCAEtCv4X,KAAKq7W,gBAAkBr7W,KAAKs7W,sBACvBnvW,OAAOnM,KAAKg7W,sBACZ7uW,OAAOnM,KAAKi7W,sBACrB,EACAw0Q,EAAY9unB,UAAU63X,yBAA2B,SAAUrvX,EAAMqnW,GAC7D,IAAIhpW,EACJ,OAAQ2B,GACJ,KAAK0xV,GAAUsB,YACX30V,EAASxH,KAAKw3X,gBAAgBhnB,GAC9B,MACJ,KAAK3V,GAAUqB,aACX10V,EAASxH,KAAKy3X,iBAAiBjnB,GAC/B,MACJ,QACIhpW,EAASxH,KAAK03X,kBAAkBlnB,GAMxC,OAHIj1D,EAAQ/zS,KACRA,EAAS,IAENA,CACX,EACAionB,EAAY9unB,UAAU83X,oBAAsB,WAGxCz4X,KAAKw3X,gBAAkB,CAAC,EACxBx3X,KAAKy3X,iBAAmB,CAAC,EACzBz3X,KAAK03X,kBAAoB,CAAC,EAE1B,IAAIgB,EAAgB,CAAC,EACrB14X,KAAKq7W,gBAAgBh5W,SAAQ,SAAUgzD,GAAO,OAAOqjU,EAAcrjU,EAAI1tB,UAAW,CAAM,IACxF,IAAIgxV,EAAY,SAAUhuX,EAAUnD,EAAQgpW,GAExC,IADA,IAAIhpD,GAAc,EACT7lT,EAAI,EAAGA,EAAIgJ,EAASrJ,OAAQK,IAAK,CAEtC,IAAIuL,EAAQvC,EAAShJ,GACjBi3X,GAAc,EAClB,GAAI1rX,aAAiBiwV,GAEjBy7B,GAA+C,IAAjCF,EAAcxrX,EAAMy6B,aAEjC,CAED,IACI4gU,EADcr7V,EACkBu8V,uBAChClB,IACAqwB,EAAcD,EAAUpwB,EAAmB/gW,EAAQgpW,EAAO,GAElE,CACIooB,IACApxE,GAAc,EACThgT,EAAOgpW,KACRhpW,EAAOgpW,GAAQ,IAEnBhpW,EAAOgpW,GAAM/uW,KAAKyL,GAE1B,CACA,OAAOs6S,CACX,EACAmxE,EAAU34X,KAAK6hX,kBAAmB7hX,KAAKw3X,gBAAiB,GACxDmB,EAAU34X,KAAK8hX,mBAAoB9hX,KAAKy3X,iBAAkB,GAC1DkB,EAAU34X,KAAK+hX,oBAAqB/hX,KAAK03X,kBAAmB,EAChE,EACA+3P,EAAY9unB,UAAU4+W,gBAAkB,WACpCv/W,KAAKs4X,yBACLt4X,KAAKy4X,qBACT,EACAg3P,EAAY9unB,UAAU43X,+BAAiC,WACnD,OAAOv4X,KAAKk7W,uBAAuBhwW,OAAOlL,KAAKqjX,mBAAmBrwU,KAAKhzC,MAC3E,EACAyvnB,EAAY9unB,UAAUknX,qBAAuB,SAAUhsU,GACnD,IAAI5lC,EAAQjW,UACG,IAAX67C,IAAqBA,EAAS,CAAC,GACnC,IAAIrwC,EAASqwC,EAAOrwC,OAASqwC,EAAOrwC,OAAS,OAI7C,GAH4B,MAAxBqwC,EAAOg9U,gBACP74X,KAAK84X,kBAAoBj9U,EAAOg9U,gBAE/B74X,KAAK84X,kBACN,MAAO,GAKX,IAAIC,GAAyB,EACzBl9U,EAAOisU,cACPjsU,EAAOisU,aAAazlX,SAAQ,SAAUgzD,GAClC,IAAI2jU,EAAa/iX,EAAMilW,uBAAuBhnW,QAAQmhD,GAClD0jU,EAAwBC,IACxBD,EAAwBC,EAEhC,IAEJ,IAAIC,EAAY,SAAU5jU,GACtB,IAAI6jU,EAAoBjjX,EAAMilW,uBAAuBhnW,QAAQmhD,GAAO0jU,EACpE,OAAO1jU,EAAI+wS,WAAa8yB,CAC5B,EACIC,EAAoBn5X,KAAKk7W,uBAAuBhwW,QAAO,SAAUmqD,GAAO,OAAQ4jU,EAAU5jU,EAAM,IAChG+jU,EAAiBp5X,KAAKk7W,uBAAuBhwW,QAAO,SAAUmqD,GAAO,OAAO4jU,EAAU5jU,EAAM,IAC5Fm6T,EAAiB,GACrB,IAAK4J,EAAe93X,OAChB,MAAO,GAEX,IACI+3X,EADAC,EAAqB,GAEzBC,EAAO,OAAa,CAChB,IAAIC,EAAYJ,EAAe/sX,QAAO,SAAU8pD,EAAOd,GAAO,OAAOc,EAAQd,EAAI+wS,SAAW,GAAG,GAC/FizB,EAAyBr5X,KAAK84X,kBAAoB94X,KAAK6jX,qBAAqBsV,GAC5E,IAAK,IAAIx3X,EAAI,EAAGA,EAAIy3X,EAAe93X,OAAQK,IAAK,CAC5C,IAAI0zD,EAAM+jU,EAAez3X,GACrB83X,EAAkBJ,EAAyBhkU,EAAI+wS,UAAYozB,EAC3DE,EAAmB,EACnBxqX,EAAWmmD,EAAI8wS,cACf39T,EAAW6sB,EAAIs6O,cAOnB,GANI5lC,EAAO76P,IAAauqX,EAAkBvqX,EACtCwqX,EAAmBxqX,EAEd66P,EAAOvhO,IAAaixV,EAAkBjxV,IAC3CkxV,EAAmBlxV,GAEnBkxV,EAAkB,CAGlBrkU,EAAIsqS,eAAe+5B,EAAkBluX,GACrCykV,EAAgBmpC,EAAgB/jU,GAChCm6T,EAAe/tX,KAAK4zD,GACpB8jU,EAAkB13X,KAAK4zD,GACvB,SAASkkU,CACb,CACAD,EAAmB33X,GAAKwnB,KAAKI,MAAMkwW,EACvC,CACA,KACJ,CACA,IAAIE,EAAiBN,EA2BrB,OA1BAD,EAAe/2X,SAAQ,SAAUgzD,EAAK1zD,GAClC0zD,EAAIsqS,eAAex2U,KAAKgE,IAAImsW,EAAmB33X,GAAIg4X,GAAiBnuX,GACpEgkX,EAAe/tX,KAAK4zD,GACpBskU,GAAkBL,EAAmB33X,EACzC,IACKk6C,EAAOksU,aACR/nX,KAAKgoX,cAAcx8W,GAEnBqwC,EAAOosU,kBACPjoX,KAAKioX,mBAELpsU,EAAO+9U,kBACP55X,KAAKkhX,uBAAuBsO,GAAgB,EAAMhkX,EAAQ4tX,GAQzDp5X,KAAKk8W,+BACFl8W,KAAKg6V,mBAAmB6/B,qBACxB75X,KAAK85X,SAASC,kBAElB/5X,KAAKk8W,8BAA+B,GAEjCkd,CACX,EAEAq2P,EAAY9unB,UAAUq5X,iBAAmB,SAAUC,EAAWzuX,EAAQu6V,QACnD,IAAXv6V,IAAqBA,EAAS,oBAElC,IAAI+1W,EAAsBvhX,KAAKwhX,yBAC/B,KAAIyY,GAAa,IAAM1Y,EAAoBjgX,OAA3C,CAGA,IAAI44X,EAAe,GACfC,EAAkB,GACtB5Y,EAAoBl/W,SAAQ,SAAUe,IACW,IAAzCA,EAAOgiW,YAAYg1B,kBACnBD,EAAgB14X,KAAK2B,GAGrB82X,EAAaz4X,KAAK2B,EAE1B,IAEA,IAAIi3X,EAAqBH,EAAajpX,MAAM,GACxCqpX,GAAmB,EACnBC,EAAkB,SAAUn3X,GAC5B6sV,EAAgBiqC,EAAc92X,GAC9B+2X,EAAgB14X,KAAK2B,EACzB,EAUA,IADA82X,EAAa73X,SAAQ,SAAUe,GAAU,OAAOA,EAAO+7V,iBAAiB3zV,EAAS,KACzE8uX,GAAkB,CACtBA,GAAmB,EACnB,IAAIE,EAAkBP,EAAYj6X,KAAK6jX,qBAAqBsW,GAC5D,GAAIK,GAAmB,EAEnBN,EAAa73X,SAAQ,SAAUe,GAC3BA,EAAOkjW,WAAW96V,EACtB,SAQA,IALA,IAAIitJ,EAAQ+hO,EAAkBx6X,KAAK6jX,qBAAqBqW,GAGpDO,EAAmBD,EAEd74X,EAAIu4X,EAAa54X,OAAS,EAAGK,GAAK,EAAGA,IAAK,CAC/C,IAAIyB,EAAS82X,EAAav4X,GACtBuN,EAAW9L,EAAO+iW,cAClB39T,EAAWplC,EAAOusS,cAClBgE,EAAWxqR,KAAKI,MAAMnmB,EAAOqiW,iBAAmBhtM,GAChDsxG,EAAO76P,IAAaykS,EAAWzkS,GAC/BykS,EAAWzkS,EACXqrX,EAAgBn3X,GAChBk3X,GAAmB,GAEdvwH,EAAOvhO,IAAaplC,EAAO8iW,iBAAiBvyD,IACjDA,EAAWnrQ,EACX+xV,EAAgBn3X,GAChBk3X,GAAmB,GAER,IAAN34X,IACLgyS,EAAW8mF,GAEfr3X,EAAOu8V,eAAehsD,EAAUnoS,GAAQ,GACxCivX,GAAoB9mF,CACxB,CAER,CAEA0mF,EAAmBh4X,SAAQ,SAAUgzD,GACjCA,EAAI2wS,4BAA4Bx6V,EACpC,IACAxL,KAAKgoX,cAAcx8W,GACnBxL,KAAKioX,mBACDliB,GAGJ/lW,KAAKkhX,uBAAuBmZ,GAAoB,EAAM7uX,EA1EtD,CA2EJ,EACAiknB,EAAY9unB,UAAU40X,oBAAsB,SAAUmF,GAClD,IAAIC,EAAqB,GACrBC,EAAsB,GACtBC,EAAuB,GAC3BH,EAAer4X,SAAQ,SAAUe,GAC7B,OAAQA,EAAO6hW,aACX,IAAK,OACD01B,EAAmBl5X,KAAK2B,GACxB,MACJ,IAAK,QACDw3X,EAAoBn5X,KAAK2B,GACzB,MACJ,QACIy3X,EAAqBp5X,KAAK2B,GAGtC,IACA,IAAI03X,EAAyB,IAAIhiB,GACjC94W,KAAK6hX,kBAAoB7hX,KAAK+6X,sBAAsBC,sBAAsBL,EAAoB36X,KAAKgwW,iBAAkB8qB,EAAwBjgC,GAAUsB,YAAan8V,KAAK6hX,mBACzK7hX,KAAK8hX,mBAAqB9hX,KAAK+6X,sBAAsBC,sBAAsBJ,EAAqB56X,KAAKgwW,iBAAkB8qB,EAAwBjgC,GAAUqB,aAAcl8V,KAAK8hX,oBAC5K9hX,KAAK+hX,oBAAsB/hX,KAAK+6X,sBAAsBC,sBAAsBH,EAAsB76X,KAAKgwW,iBAAkB8qB,EAAwB,KAAM96X,KAAK+hX,qBAC5J/hX,KAAKi7X,oBACT,EACAw0P,EAAY9unB,UAAUs6X,mBAAqB,WACvC,IAAIhlX,EAAQjW,KACZA,KAAKo7W,6BAA+B,CAAC,EACrC,IAAI5yW,EAAO,SAAU0E,GACjB+I,EAAMmlW,6BAA6BluW,EAAM+yV,eAAiB/yV,CAC9D,EACAlN,KAAKy/V,YAAYuzB,8BAA8BhzX,KAAK+hX,oBAAqBv5W,GACzExI,KAAKy/V,YAAYuzB,8BAA8BhzX,KAAK6hX,kBAAmBr5W,GACvExI,KAAKy/V,YAAYuzB,8BAA8BhzX,KAAK8hX,mBAAoBt5W,EAC5E,EACAinnB,EAAY9unB,UAAUu6X,YAAc,SAAUztW,GAG1C,OAFcztB,KAAKo7W,6BAA6B3tV,EAAKwyU,iBAElCxyU,CACvB,EACAgimB,EAAY9unB,UAAUg3X,yCAA2C,WAC7D,IAAI7E,EAAkB9yX,KAAK4hX,uBAC3B5hX,KAAKy/V,YAAYuzB,8BAA8BF,GAAiB,SAAU5lX,GAClEA,aAAiBi7V,IACCj7V,EACNk9V,2BAEpB,GACJ,EACAqlR,EAAY9unB,UAAUw6X,oBAAsB,WACxC,OAAOn7X,KAAKqsX,gBAChB,EACAojQ,EAAY9unB,UAAU42X,+BAAiC,WACnD,GAAKv3X,KAAK07W,uBAAV,CAGA17W,KAAK07W,wBAAyB,EAC9B,IAAI0f,EAAoBp7X,KAAKg6V,mBAAmBqhC,oBAAoBr7X,KAAK47W,WAOrE0f,EAAqBt7X,KAAK47W,UAC1B57W,KAAKg6V,mBAAmBuhC,4BAA8Bv7X,KAAKg6V,mBAAmBwhC,4BAGlF,IAFqBx7X,KAAKu7W,gBAAgBj6W,OAAS,GAAKtB,KAAKu8W,iBACpB+e,IAAuBF,EAC3C,CACjB,IAAIK,EAAmBz7X,KAAK07X,oBAAoBC,uBAAuB37X,KAAKu7W,mBACnDv7W,KAAK47X,cAAcH,EAAkBz7X,KAAKqsX,mBAG1CrsX,KAAK27W,2BAC1B37W,KAAKqsX,iBAAmBoP,EAEhC,MAEIz7X,KAAKqsX,iBAAmB,IAvB5B,CAyBJ,EACAojQ,EAAY9unB,UAAUi7X,cAAgB,SAAUC,EAAOC,GACnD,OAAO/rC,EAAS8rC,EAAOC,GAAO,SAAUl+V,EAAGC,GAAK,OAAOD,EAAE2nU,aAAe1nU,EAAE0nU,UAAY,GAC1F,EACAkqR,EAAY9unB,UAAUkjX,qBAAuB,SAAU0N,GACnD,OAAOA,EAAWllX,QAAO,SAAUiiB,EAAO+mC,GAAO,OAAO/mC,EAAQ+mC,EAAIowS,gBAAkB,GAAG,EAC7F,EACAgqR,EAAY9unB,UAAUo7X,oBAAsB,WACxC,OAAO/7X,KAAKgwW,gBAChB,EACAy/Q,EAAY9unB,UAAUq7X,mBAAqB,WACvC,QAAKh8X,KAAKq+W,aAGAr+W,KAAKq+W,YAAY5qV,MAAK,SAAU4hC,GAAO,OAAOA,EAAI+vS,YAAY62B,cAAgB,GAE5F,EACAwzP,EAAY9unB,UAAUu7X,wBAA0B,WAC5C,IAAIC,EAAQn8X,KAAKg6V,mBAAmB8O,cAChCszB,EAAa,CACb,0BACA,4BACA,4BAEAD,GACAC,EAAWjgS,UAEf,IAAK,IAAIx6F,EAAI,EAAGA,EAAIy6X,EAAW96X,OAAQK,IAAK,CACxC,IAAInB,EAAYR,KAAKo8X,EAAWz6X,MAChC,GAAInB,EAAUc,OACV,OAAO66X,EAAQrsC,EAAKtvV,GAAaA,EAAU,EAEnD,CACA,OAAO,IACX,EACAi6W,GAAa,CACT/hB,GAAU,sBACX+2R,EAAY9unB,UAAW,yBAAqB,GAC/C85W,GAAa,CACT/hB,GAAU,kBACX+2R,EAAY9unB,UAAW,qBAAiB,GAC3C85W,GAAa,CACT/hB,GAAU,0BACX+2R,EAAY9unB,UAAW,6BAAyB,GACnD85W,GAAa,CACT/hB,GAAU,wBACX+2R,EAAY9unB,UAAW,2BAAuB,GACjD85W,GAAa,CACT/hB,GAAU,gBACX+2R,EAAY9unB,UAAW,mBAAe,GACzC85W,GAAa,CACT/hB,GAAU,2BACX+2R,EAAY9unB,UAAW,8BAA0B,GACpD85W,GAAa,CACT/hB,GAAU,wBACX+2R,EAAY9unB,UAAW,2BAAuB,GACjD85W,GAAa,CACT5hB,GAAS,mBACV42R,EAAY9unB,UAAW,sBAAkB,GAC5C85W,GAAa,CACT5hB,GAAS,eACV42R,EAAY9unB,UAAW,kBAAc,GACxC85W,GAAa,CACT5hB,GAAS,0BACV42R,EAAY9unB,UAAW,6BAAyB,GACnD85W,GAAa,CACT/hB,GAAU,aACX+2R,EAAY9unB,UAAW,gBAAY,GACtC85W,GAAa,CACT/hB,GAAU,cACX+2R,EAAY9unB,UAAW,iBAAa,GACvC85W,GAAa,CACT/hB,GAAU,YACX+2R,EAAY9unB,UAAW,eAAW,GACrC85W,GAAa,CACT/hB,GAAU,mBACX+2R,EAAY9unB,UAAW,sBAAkB,GAC5C85W,GAAa,CACT/hB,GAAU,qBACX+2R,EAAY9unB,UAAW,wBAAoB,GAC9C85W,GAAa,CACTriB,IACDq3R,EAAY9unB,UAAW,OAAQ,MAClC85W,GAAa,CACTC,GAAU,EAAG1hB,GAAU,mBACxBy2R,EAAY9unB,UAAW,WAAY,MACtC8unB,EAAch1Q,GAAa,CACvBjiB,GAAK,gBACNi3R,EAEP,CAhhGgC,CAghG9B3hR,IAQF,SAAS6iR,GAAmB3qnB,EAAOq2X,GAC/B,OAAOl2K,GAASngN,EAAMN,WAAY22X,EAAiB,IACvD,CACA,SAASE,GAAqBr6U,EAAO4tS,GAEjC,IADA,IAAItoV,EAAS,GACJ7F,EAAIugD,EAAOvgD,GAAKmuV,EAAMnuV,IAC3B6F,EAAO/F,KAAKE,GAEhB,OAAO6F,CACX,CAOA,SAASg1X,GAAUx2X,GACf,MAAiB,KAAVA,IAAiBy8F,MAAMlpC,WAAWvzD,KAAWqyC,SAASryC,EACjE,CACA,SAASy2X,KAEL,OAAOxzW,OAAO2hM,kBAAoB,gBACtC,CA+BA,SAAS8xK,GAAmB12X,GACxB,MAAqB,kBAAVA,EACA,GAEJA,EAAMN,WAAWS,QAAQ,0BAA2B,MAC/D,CAKA,IAAIw2X,GAA2Bz0X,OAAO43E,OAAO,CACzCp9D,UAAW,KACXiumB,mBAAoBA,GACpBp0P,qBAAsBA,GACtBC,UAAWA,GACXC,kBAAmBA,GACnBG,YA9CJ,SAAqB52X,GAIjB,MAHqB,kBAAVA,IACPA,EAAQszD,SAAStzD,EAAO,KAEP,kBAAVA,EACAmjB,KAAKu+B,MAAM1hD,GAEf,IACX,EAuCI62X,SAtCJ,SAAkBtuX,EAAQg3C,GAEtB,IADA,IAAI0R,EAAM,GACDt1D,EAAI,EAAGA,EAAI4jD,EAAO5jD,IACvBs1D,GAAO/tC,OAAOujD,aAAsB,IAATl+D,GAC3BA,KAAY,EAEhB,OAAO0oD,CACX,EAgCI6lU,sCA/BJ,SAA+C92X,GAC3C,MAAqB,kBAAVA,EACA,GAEJ02X,GAAmBvzW,KAAKI,MAAc,IAARvjB,GAAe,IACxD,EA2BI02X,mBAAoBA,GACpB7yO,IAdJ,SAAa18E,GACT,OAAiB,MAAVA,EAAiB,KAAOA,EAAO9gE,QAAO,SAAU45C,EAAOjgD,GAAS,OAAOigD,EAAQjgD,CAAO,GAAG,EACpG,IAqBI+2X,GAAoD,WACpD,IAAItvB,EAAgB,SAAU7jS,EAAG/rC,GAI7B,OAHA4vU,EAAgBvlW,OAAOsa,gBAClB,CAAEE,UAAW,cAAgBze,OAAS,SAAU2lE,EAAG/rC,GAAK+rC,EAAElnD,UAAYmb,CAAG,GAC1E,SAAU+rC,EAAG/rC,GAAK,IAAK,IAAI5a,KAAK4a,EAAOA,EAAE11B,eAAe8a,KAAI2mD,EAAE3mD,GAAK4a,EAAE5a,GAAI,EACtEwqV,EAAc7jS,EAAG/rC,EAC5B,EACA,OAAO,SAAU+rC,EAAG/rC,GAEhB,SAAS6wU,IAAO1uW,KAAKkV,YAAc00D,CAAG,CADtC6jS,EAAc7jS,EAAG/rC,GAEjB+rC,EAAEjpE,UAAkB,OAANk9B,EAAa31B,OAAOyb,OAAOka,IAAM6wU,EAAG/tW,UAAYk9B,EAAEl9B,UAAW,IAAI+tW,EACnF,CACH,CAZuD,GAapDsuB,GAAsD,SAAU7jC,EAAY5tV,EAAQhL,EAAKwiB,GACzF,IAA2H6mD,EAAvHhc,EAAIlkD,UAAUpI,OAAQ0vF,EAAIpjC,EAAI,EAAIriD,EAAkB,OAATwX,EAAgBA,EAAO7a,OAAOkD,yBAAyBG,EAAQhL,GAAOwiB,EACrH,GAAuB,kBAAZtO,SAAoD,oBAArBA,QAAQ07B,SAAyB6gD,EAAIv8E,QAAQ07B,SAASgpT,EAAY5tV,EAAQhL,EAAKwiB,QACpH,IAAK,IAAIphB,EAAIw3V,EAAW73V,OAAS,EAAGK,GAAK,EAAGA,KAASioE,EAAIuvR,EAAWx3V,MAAIqvF,GAAKpjC,EAAI,EAAIgc,EAAEonB,GAAKpjC,EAAI,EAAIgc,EAAEr+D,EAAQhL,EAAKywF,GAAKpnB,EAAEr+D,EAAQhL,KAASywF,GAChJ,OAAOpjC,EAAI,GAAKojC,GAAK9oF,OAAOyD,eAAeJ,EAAQhL,EAAKywF,GAAIA,CAChE,EAEIisS,GAA6B,SAAUnnX,GAEvC,SAASmnX,IACL,OAAkB,OAAXnnX,GAAmBA,EAAOlM,MAAM5J,KAAM0J,YAAc1J,IAC/D,CAwFA,OA3FA+8X,GAAYE,EAAannX,GAIzBmnX,EAAYt8X,UAAUytnB,qBAAuB,SAAUhxR,GACnD,OAA0B,MAAnBA,EAAOluV,SAAmBkuV,EAAOluV,SAAWlP,KAAKg6V,mBAAmBgF,gBAC/E,EACAi+B,EAAYt8X,UAAU0tnB,qBAAuB,SAAUjxR,GACnD,OAA0B,MAAnBA,EAAO50T,SAAmB40T,EAAO50T,SAAYxoC,KAAKg6V,mBAAmBkF,kBAAoBu9B,IACpG,EACAQ,EAAYt8X,UAAU++V,yBAA2B,SAAUtC,GACvD,IAEI9uU,EAFAywU,EAAc/+V,KAAKounB,qBAAqBhxR,GACxC6B,EAAcj/V,KAAKqunB,qBAAqBjxR,GAExC+/B,EAAchvC,EAAaiP,EAAO9uU,OAClC8uW,EAAqBjvC,EAAaiP,EAAOoC,cAU7C,OARIlxU,EADe,MAAf6uW,EACQA,EAEmB,MAAtBC,EACGA,EAGAp9X,KAAKg6V,mBAAmBqjC,cAE7Bl0W,KAAK+D,IAAI/D,KAAKgE,IAAImB,EAAO2wU,GAAcF,EAClD,EACAk+B,EAAYt8X,UAAU28X,yBAA2B,SAAUl6X,EAAQm6X,GAC/D,IAAI/1X,EAAS,GACTkwJ,GAAQ,EACR8lO,EAAc,SAAUptB,EAAoBI,GAC5C,IAAK,IAAI7uW,EAAI,EAAGA,EAAIyuW,EAAmB9uW,OAAQK,IAAK,CAChD,GAAI+1J,EACA,OAGJ,IAAIvzJ,EAAOisW,EAAmBzuW,GAC9B,GAAIwC,aAAgBwqnB,GAEhBnxP,EADer5X,EACM4sH,cAAey/O,EAAO,GAC3ChpW,EAAOgpW,GAAQrsW,OAEVA,IAASf,IACds0J,GAAQ,EAEhB,CACJ,EAIA,OAHA8lO,EAAYD,EAAsB,GAG3B7lO,EAAQlwJ,EAAS,IAC5B,EACAy1X,EAAYt8X,UAAUkvW,6BAA+B,SAAUt2U,EAAQvpB,EAAMyR,GACzE,IAAIxL,EAAQjW,KACPgQ,GAGLA,EAAK3N,SAAQ,SAAU6K,GACfA,aAAiByhnB,IACjB14mB,EAAM45V,6BAA6B3iW,EAAOA,EAAM6jH,cAAetvG,GAEnEA,EAASvU,EAAOqsB,EACpB,GACJ,EACA0jW,EAAYt8X,UAAUqyX,8BAAgC,SAAUhjX,EAAMyR,GAClE,IAAIxL,EAAQjW,KACPgQ,GAGLA,EAAK3N,SAAQ,SAAU6K,GACfA,aAAiBi7V,IACjBlyV,EAAM+8W,8BAA8B9lX,EAAM6jH,cAAetvG,GAE7DA,EAASvU,EACb,GACJ,EACA+vX,EAAYt8X,UAAU03X,oCAAsC,SAAUroX,EAAMyR,GACxE,IAAIxL,EAAQjW,KACPgQ,GAGLA,EAAK3N,SAAQ,SAAU6K,GACfA,aAAiBi7V,IACjBlyV,EAAMoiX,oCAAoCnrX,EAAMu8V,uBAAwBhoV,GAE5EA,EAASvU,EACb,GACJ,EACA+vX,EAAcD,GAAa,CACvBxkC,GAAK,gBACNykC,EAEP,CA7FgC,CA6F9BnvB,IAQE2vB,GAAoD,WACpD,IAAIhwB,EAAgB,SAAU7jS,EAAG/rC,GAI7B,OAHA4vU,EAAgBvlW,OAAOsa,gBAClB,CAAEE,UAAW,cAAgBze,OAAS,SAAU2lE,EAAG/rC,GAAK+rC,EAAElnD,UAAYmb,CAAG,GAC1E,SAAU+rC,EAAG/rC,GAAK,IAAK,IAAI5a,KAAK4a,EAAOA,EAAE11B,eAAe8a,KAAI2mD,EAAE3mD,GAAK4a,EAAE5a,GAAI,EACtEwqV,EAAc7jS,EAAG/rC,EAC5B,EACA,OAAO,SAAU+rC,EAAG/rC,GAEhB,SAAS6wU,IAAO1uW,KAAKkV,YAAc00D,CAAG,CADtC6jS,EAAc7jS,EAAG/rC,GAEjB+rC,EAAEjpE,UAAkB,OAANk9B,EAAa31B,OAAOyb,OAAOka,IAAM6wU,EAAG/tW,UAAYk9B,EAAEl9B,UAAW,IAAI+tW,EACnF,CACH,CAZuD,GAapDgvB,GAAsD,SAAUvkC,EAAY5tV,EAAQhL,EAAKwiB,GACzF,IAA2H6mD,EAAvHhc,EAAIlkD,UAAUpI,OAAQ0vF,EAAIpjC,EAAI,EAAIriD,EAAkB,OAATwX,EAAgBA,EAAO7a,OAAOkD,yBAAyBG,EAAQhL,GAAOwiB,EACrH,GAAuB,kBAAZtO,SAAoD,oBAArBA,QAAQ07B,SAAyB6gD,EAAIv8E,QAAQ07B,SAASgpT,EAAY5tV,EAAQhL,EAAKwiB,QACpH,IAAK,IAAIphB,EAAIw3V,EAAW73V,OAAS,EAAGK,GAAK,EAAGA,KAASioE,EAAIuvR,EAAWx3V,MAAIqvF,GAAKpjC,EAAI,EAAIgc,EAAEonB,GAAKpjC,EAAI,EAAIgc,EAAEr+D,EAAQhL,EAAKywF,GAAKpnB,EAAEr+D,EAAQhL,KAASywF,GAChJ,OAAOpjC,EAAI,GAAKojC,GAAK9oF,OAAOyD,eAAeJ,EAAQhL,EAAKywF,GAAIA,CAChE,EAEI2sS,GAAuC,SAAU7nX,GAEjD,SAAS6nX,IACL,OAAkB,OAAX7nX,GAAmBA,EAAOlM,MAAM5J,KAAM0J,YAAc1J,IAC/D,CA0IA,OA7IAy9X,GAAYE,EAAuB7nX,GAInC6nX,EAAsBh9X,UAAUq6X,sBAAwB,SAExD4C,EAEAxtB,EAEA0qB,EAEA38B,EAEA0/B,GACI,IAEIC,EACAC,EAHA9nX,EAAQjW,KACRwH,EAAS,GAGTw2X,EAAmBh+X,KAAKi+X,iBAAiBJ,GAuC7C,OApCAD,EAAqBv7X,SAAQ,SAAU+8W,GAInC,IAHA,IAAI8e,EAAsBjoX,EAAMqnX,yBAAyBltB,EAAoBgP,GACzE+e,EAAkB,GAClBC,GAAeL,EACVp8X,EAAI,EAAGA,EAAIu8X,EAAoB58X,OAAQK,IAC5C,GAAIy8X,GAAeF,EAAoBv8X,KAAOo8X,EAAqBp8X,GAAI,CAEnE,IAAI08X,EAAWpoX,EAAMy7V,kBAAkBwsB,EAAoBv8X,GAAIm5X,EAAwBkD,EAAkB7/B,GACzGggC,EAAgBx8X,GAAK08X,EAEZ,GAAL18X,EACA6F,EAAO/F,KAAK48X,GAGZF,EAAgBx8X,EAAI,GAAGy2D,SAASimU,EAExC,MAGIF,EAAgBx8X,GAAKm8X,EAAiBn8X,GAGE,IAA3Bw8X,EAAgB78X,OAIjCkG,EAAO/F,KAAK29W,GAGItvB,EAAKquC,GACX/lU,SAASgnT,GAEvB0e,EAAmBK,EACnBJ,EAAuBG,CAC3B,IACAl+X,KAAKs+X,wBAAwB92X,EAAQ,MAC9BA,CACX,EACAm2X,EAAsBh9X,UAAU+wW,kBAAoB,SAAUf,EAAemqB,EAAwBkD,EAAkB7/B,GACnH,IAAIkK,EAAUsI,EAAczH,aACxBZ,EAAawyB,EAAuB9hB,oBAAoB3Q,GAExD8gB,EAAc6U,EADH71B,GAAYM,eAAeJ,EAASC,IAgBnD,OAXI6gB,GAAeA,EAAYxgB,2BAA6BgI,IACxDwY,EAAc,MAEdp/G,EAAOo/G,GAEPA,EAAYvzV,SAGZuzV,EAAc,IAAIhhB,GAAYwI,EAAetI,EAASC,EAAYnK,GAClEn+V,KAAK+C,QAAQsyV,WAAW8zB,IAErBA,CACX,EAEAwU,EAAsBh9X,UAAUs9X,iBAAmB,SAAUM,GACzD,IAAI/2X,EAAS,CAAC,EACVg3X,EAAY,SAAUC,GACtBA,EAAgBp8X,SAAQ,SAAUq8X,GAC9B,GAAIA,aAAyBv2B,GAAa,CACtC,IAAIghB,EAAcuV,EAClBl3X,EAAOk3X,EAAcz+B,eAAiBkpB,EACtCqV,EAAUrV,EAAYp4P,cAC1B,CACJ,GACJ,EAIA,OAHIwtQ,GACAC,EAAUD,GAEP/2X,CACX,EACAm2X,EAAsBh9X,UAAU29X,wBAA0B,SAAUG,EAAiBllW,GACjF,IAAItjB,EAAQjW,KACZy+X,EAAgBp8X,SAAQ,SAAUs8X,GAE9B,GADAA,EAAelgC,UAAUllU,GACrBolW,aAA0Bx2B,GAAa,CACvC,IAAIghB,EAAcwV,EAClB1oX,EAAMqoX,wBAAwBnV,EAAYp4P,cAAeo4P,EAC7D,CACJ,GACJ,EACAwU,EAAsBh9X,UAAU28X,yBAA2B,SAAUltB,EAAoBhtW,GACrF,IAAIoE,EAAS,GACTkwJ,GAAQ,EACR8lO,EAAc,SAAU7tB,EAAYa,GACpC,IAAK,IAAI7uW,EAAI,EAAGA,EAAIguW,EAAWruW,OAAQK,IAAK,CAExC,GAAI+1J,EACA,OAEJ,IAAIvzJ,EAAOwrW,EAAWhuW,GACtB,GAAIwC,aAAgBwqnB,GAEhBnxP,EADer5X,EACM4sH,cAAey/O,EAAO,GAC3ChpW,EAAOgpW,GAAQrsW,OAEVA,IAASf,IACds0J,GAAQ,EAEhB,CACJ,EAKA,OAJA8lO,EAAYptB,EAAoB,GAI5B14M,EACOlwJ,GAEXgkD,QAAQC,KAAK,sBACN,KACX,EACAkyU,EAAwBD,GAAa,CACjCllC,GAAK,0BACNmlC,EAEP,CA/I0C,CA+IxC7vB,IAQE0xB,GAA8D,WAC9D,IAAK,IAAIjwV,EAAI,EAAG5tC,EAAI,EAAGk9X,EAAKn1X,UAAUpI,OAAQK,EAAIk9X,EAAIl9X,IAAK4tC,GAAK7lC,UAAU/H,GAAGL,OACxE,IAAI0vF,EAAI/sF,MAAMsrC,GAAIhqC,EAAI,EAA3B,IAA8B5D,EAAI,EAAGA,EAAIk9X,EAAIl9X,IACzC,IAAK,IAAIi8B,EAAIl0B,UAAU/H,GAAIogE,EAAI,EAAG+8T,EAAKlhW,EAAEt8B,OAAQygE,EAAI+8T,EAAI/8T,IAAKx8D,IAC1DyrF,EAAEzrF,GAAKq4B,EAAEmkC,GACjB,OAAOivB,CACX,EAKI+tS,GAA8B,WAC9B,SAASA,IACT,CAiFA,OAhFAA,EAAaC,kBAAoB,CAC7B,eAAgB,WAAY,eAAgB,yBAA0B,wBACtE,kBAAmB,eAAgB,WAAY,YAAa,uBAAwB,oBACpF,eAAgB,yBAA0B,iBAAkB,iBAAkB,sBAC9E,sBAAuB,mBAAoB,uBAE/CD,EAAaE,kBAAoB,CAC7B,aAAc,sBAAuB,WAAY,UAAW,qBAAsB,aAAc,QAChG,aAAc,uBAAwB,qBAAsB,yBAA0B,WAAY,8BAClG,qBAAsB,gBAAiB,sBAAuB,yBAA0B,2BAA4B,cACpH,gBAAiB,2BAA4B,4BAA6B,gCAC1E,+BAAgC,cAAe,mBAAoB,YAAa,UAAW,sBAC3F,qBAEJF,EAAaG,iBAAmB,CAC5B,eAAgB,UAAW,aAAc,cAAe,mBAAoB,sBAAuB,eAEvGH,EAAaI,kBAAoB,CAC7B,YAAa,kBAAmB,YAAa,WAAY,eAAgB,oBAAqB,wBAC9F,oBAAqB,yBAA0B,uBAAwB,cAAe,cAAe,2BACrG,6BAA8B,kBAAmB,mBAAoB,kCAAmC,mBACxG,oBAAqB,qBAAsB,iBAAkB,0BAA2B,iBACxF,wBAAyB,6BAA8B,0BAA2B,sBAClF,2BAA4B,iBAAkB,gBAAiB,YAEnEJ,EAAaK,mBAAqB,CAC9B,wCAAyC,4BAA6B,wBAAyB,2BAC/F,6BAA8B,2BAA4B,QAAS,wBAAyB,wBAC5F,qBAAsB,wBAAyB,0BAA2B,uBAAwB,qBAClG,0BAA2B,oBAAqB,2BAA4B,mBAAoB,yBAChG,aAAc,oBAAqB,kBAAmB,yBAA0B,wBAAyB,mBACzG,uBAAwB,4BAA6B,8BAA+B,yBACpF,2BAA4B,uBAAwB,oBAAqB,mBAAoB,+BAC7F,YAAa,gBAAiB,sBAAuB,iCAAkC,sBACvF,gCAAiC,wBAAyB,gCAAiC,6BAC3F,qCAAsC,8BAA+B,yBAA0B,YAC/F,0BAA2B,+BAAgC,yBAA0B,4BACrF,mBAAoB,oBAAqB,cAAe,uBAAwB,4BAChF,kCAAmC,YAAa,oBAAqB,mBAAoB,iBAAkB,kBAC3G,8BAA+B,kBAAmB,kBAAmB,qBAAsB,+BAC3F,0BAA2B,iBAAkB,uBAAwB,uBAAwB,aAC7F,gCAAiC,yBAA0B,0BAA2B,kCACtF,sBAAuB,mBAAoB,mBAAoB,iBAAkB,eAAgB,0BACjG,aAAc,yBAA0B,8BAA+B,yBAA0B,sBACjG,oBAAqB,WAAY,eAAgB,8BAA+B,0BAA2B,iBAC3G,6BAA8B,0BAA2B,sCAAuC,0BAChG,4BAA6B,uBAAwB,yBAA0B,+BAC/E,gCAAiC,+BAAgC,4BAA6B,eAAgB,kBAC9G,gCAAiC,0BAA2B,gCAAiC,oCAC7F,uCAAwC,oBAAqB,iBAAkB,oBAAqB,8BACpG,sBAAuB,gCAAiC,gBAAiB,mBAAoB,0BAC7F,gCAAiC,sBAAuB,4BAA6B,sBACrF,kCAAmC,0BAA2B,kBAAmB,uBACjF,4CAA6C,gCAAiC,sBAAuB,qBACrG,uBAAwB,WAG5BL,EAAaM,oBAAsB,CAC/B,iBAAkB,wBAAyB,iCAC3C,mBAAoB,4BAA6B,0BAA2B,eAAgB,yBAC5F,cAAe,cAAe,sBAAuB,mBAAoB,uBAAwB,0BACjG,mBAAoB,eAAgB,kBAAmB,wBAAyB,iCAChF,yBAA0B,8BAA+B,wBAAyB,kBAAmB,uBACrG,kBAAmB,qBAAsB,gBAAiB,2BAA4B,cAAe,mBACrG,gBAAiB,cAAe,sBAAuB,+BAAgC,0BACvF,mCAAoC,yBAA0B,kCAAmC,qBACjG,8BAA+B,cAAe,kBAAmB,WAAY,4BAC7E,4BAA6B,2BAA4B,wBAAyB,oBAClF,wBAAyB,uBAAwB,uBAAwB,gBAAiB,+BAC1F,2BAA4B,iCAAkC,uBAAwB,6BACtF,8BAA+B,+BAEnCN,EAAaO,eAAiBE,GAAiBT,EAAaG,iBAAkBH,EAAaE,kBAAmBF,EAAaC,kBAAmBD,EAAaI,kBAAmBJ,EAAaM,oBAAqBN,EAAaK,oBAK7NL,EAAaQ,qBAAuB,CAChC,SAAU,WAAY,eAAgB,yBAA0B,kBAAmB,WAAY,8BAE5FR,CACX,CApFiC,GA4F7Bt3P,GAAgD,WAShD,OARAA,GAAWv/H,OAAOsF,QAAU,SAASgoD,GACjC,IAAK,IAAIjmB,EAAG5tC,EAAI,EAAGmX,EAAIpP,UAAUpI,OAAQK,EAAImX,EAAGnX,IAE5C,IAAK,IAAIshB,KADTssB,EAAI7lC,UAAU/H,GACOuG,OAAOvH,UAAUwH,eAAejE,KAAKqrC,EAAGtsB,KACzDuyC,EAAEvyC,GAAKssB,EAAEtsB,IAEjB,OAAOuyC,CACX,EACOiyE,GAAS79H,MAAM5J,KAAM0J,UAChC,EACI24X,GAA8D,WAC9D,IAAK,IAAI9yV,EAAI,EAAG5tC,EAAI,EAAGk9X,EAAKn1X,UAAUpI,OAAQK,EAAIk9X,EAAIl9X,IAAK4tC,GAAK7lC,UAAU/H,GAAGL,OACxE,IAAI0vF,EAAI/sF,MAAMsrC,GAAIhqC,EAAI,EAA3B,IAA8B5D,EAAI,EAAGA,EAAIk9X,EAAIl9X,IACzC,IAAK,IAAIi8B,EAAIl0B,UAAU/H,GAAIogE,EAAI,EAAG+8T,EAAKlhW,EAAEt8B,OAAQygE,EAAI+8T,EAAI/8T,IAAKx8D,IAC1DyrF,EAAEzrF,GAAKq4B,EAAEmkC,GACjB,OAAOivB,CACX,EACIyuS,GAA+B,WAC/B,SAASA,IACT,CAsJA,OArJAA,EAAcC,kBAAoB,WAI9B,OAHKD,EAAcE,kBACfF,EAAcE,gBAAkBF,EAAcG,OAAO3yX,KAAI,SAAUq5B,GAAS,OAAOm5V,EAAcI,oBAAoBv5V,EAAQ,KAE1Hm5V,EAAcE,eACzB,EACAF,EAAcK,4BAA8B,SAAUC,EAAal2V,EAAWm2V,GAE/C,kBAAhBD,IACPA,EAAc,CAAC,GAGnB,IAAIE,EAAeF,EACfG,EAAY,SAAU3/X,GAAO,MAAiC,qBAAnBspC,EAAUtpC,EAAsB,EAU/E,OARA8hY,GAAiB5C,EAAcP,iBAAkBO,EAAcT,kBAAmBS,EAAcR,kBAAmBQ,EAAcJ,oBAAqBI,EAAcC,qBAAqBx0X,OAAOg1X,GAC3L79X,SAAQ,SAAU9B,GAAO,OAAO0/X,EAAa1/X,GAAOspC,EAAUtpC,EAAM,IACzEk/X,EAAcL,mBACTl0X,OAAOg1X,GACP79X,SAAQ,SAAU9B,GAAO,OAAO0/X,EAAa1/X,GAAOk/X,EAAcU,UAAUt2V,EAAUtpC,GAAO,IAClGk/X,EAAcN,kBACTj0X,OAAOg1X,GACP79X,SAAQ,SAAU9B,GAAO,OAAO0/X,EAAa1/X,GAAOk/X,EAAc5lU,SAAShwB,EAAUtpC,GAAO,IAC1Fw/X,CACX,EACAN,EAAcI,oBAAsB,SAAUx5V,GAC1C,OAAKA,GAAaA,EAAU/kC,OAAS,EAC1B+kC,EAEJ,KAAOA,EAAU,GAAGsP,cAAgBtP,EAAU6tB,OAAO,EAChE,EACAurU,EAAcW,gBAAkB,SAAUC,EAASN,EAAa10V,EAAK61T,GACjE,GAAKm/B,EAAL,CAGA,IAAIuwP,EAAiBnpf,GAAS,CAAC,EAAG44P,GAE9BJ,EAAeF,EACfG,EAAY,SAAU3/X,GAAO,OAAOqwnB,EAAerwnB,EAAM,EAE7D8hY,GAAiB5C,EAAcP,iBAAkBO,EAAcR,kBAAmBQ,EAAcT,kBAAmBS,EAAcC,qBAAqBx0X,OAAOg1X,GACxJ79X,SAAQ,SAAU9B,GAAO,OAAO0/X,EAAa1/X,GAAOqwnB,EAAerwnB,GAAK+/X,YAAc,IAC3Fb,EAAcL,mBACTl0X,OAAOg1X,GACP79X,SAAQ,SAAU9B,GAAO,OAAO0/X,EAAa1/X,GAAOk/X,EAAcU,UAAUywP,EAAerwnB,GAAK+/X,aAAe,IACpHb,EAAcN,kBACTj0X,OAAOg1X,GACP79X,SAAQ,SAAU9B,GAAO,OAAO0/X,EAAa1/X,GAAOk/X,EAAc5lU,SAAS+2jB,EAAerwnB,GAAK+/X,aAAe,IAC/GswP,EAAerwP,0BACfl1V,EAAIm1V,2BAA2Bf,EAAcU,UAAUywP,EAAerwP,wBAAwBD,sBACvFswP,EAAerwP,yBAEtBqwP,EAAenwP,kBACfp1V,EAAIq1V,eAAekwP,EAAenwP,gBAAgBH,qBAC3CswP,EAAenwP,iBAEtBmwP,EAAe3vP,qBACf51V,EAAI61V,sBAAsB0vP,EAAe3vP,mBAAmBX,aAAc,6BACnEswP,EAAe3vP,oBAEtB2vP,EAAe/zQ,aACfxxU,EAAIuxU,cAAcg0Q,EAAe/zQ,WAAWyjB,aAAc,6BACnDswP,EAAe/zQ,YAEtB+zQ,EAAervP,qBACfl2V,EAAIm2V,sBAAsB/B,EAAc5lU,SAAS+2jB,EAAervP,mBAAmBjB,sBAC5EswP,EAAervP,oBAEtBqvP,EAAeh1Q,YACf1a,EAAUue,aAAaggB,EAAcU,UAAUywP,EAAeh1Q,UAAU0kB,sBACjEswP,EAAeh1Q,WAEtBg1Q,EAAenvP,4BACfp2V,EAAIq2V,6BAA6BjC,EAAcU,UAAUywP,EAAenvP,0BAA0BnB,sBAC3FswP,EAAenvP,2BAEtBmvP,EAAejvP,kBACft2V,EAAIu2V,mBAAmBnC,EAAcU,UAAUywP,EAAejvP,gBAAgBrB,sBACvEswP,EAAejvP,iBAEtBivP,EAAe/uP,8BACfx2V,EAAIy2V,+BAA+BrC,EAAcU,UAAUywP,EAAe/uP,4BAA4BvB,sBAC/FswP,EAAe/uP,6BAEtB+uP,EAAe7uP,4BACf12V,EAAI22V,6BAA6BvC,EAAcU,UAAUywP,EAAe7uP,0BAA0BzB,sBAC3FswP,EAAe7uP,2BAEtB6uP,EAAe3uP,yBACf52V,EAAI62V,0BAA0BzC,EAAcU,UAAUywP,EAAe3uP,uBAAuB3B,sBACrFswP,EAAe3uP,wBAEtB2uP,EAAevvP,eACfh2V,EAAIi2V,gBAAgB7B,EAAc5lU,SAAS+2jB,EAAevvP,aAAaf,sBAChEswP,EAAevvP,cAI1B,IAAIwvP,EAAaxllB,EACjBnjC,OAAO6C,KAAK6lnB,GACPvunB,SAAQ,SAAUyD,GACnB,IAAIgrnB,EAAa,MAAQhrnB,EAASi/C,OAAO,GAAGpP,cAAgB7vC,EAAS0qC,UAAU,GAC3EqglB,EAAWC,IACXD,EAAWC,GAAYzwP,EAAQv6X,GAAUw6X,aAEjD,IAEA,IAAIh6V,EAAQ,CACRn9B,KAAMsqW,GAAOkE,8BACbtsU,IAAK00V,EAAY10V,IACjB61T,UAAW6+B,EAAY7+B,WAE3B1P,EAAc6uC,GAAS,SAAU9/X,EAAKyF,GAClCsgC,EAAM/lC,GAAOyF,CACjB,IACAqlC,EAAI1E,cAAcL,EAjFlB,CAkFJ,EACAm5V,EAAcU,UAAY,SAAUn6X,GAChC,MAAqB,mBAAVA,EACAA,EAEU,kBAAVA,IAGwB,SAAxBA,EAAM2vC,eAAqC,IAAT3vC,EAGjD,EACAy5X,EAAc5lU,SAAW,SAAU7zD,GAC/B,MAAqB,kBAAVA,EACAA,EAEU,kBAAVA,EACAijB,OAAOjjB,QADlB,CAGJ,EAEAy5X,EAAcG,OAAS,GAEvBH,EAAcsxP,cAAgB,GAE9BtxP,EAAcuxP,yBAA2B,GACzCvxP,EAAcT,kBAAoBD,GAAaC,kBAC/CS,EAAcR,kBAAoBF,GAAaE,kBAC/CQ,EAAcP,iBAAmBH,GAAaG,iBAC9CO,EAAcN,kBAAoBJ,GAAaI,kBAC/CM,EAAcL,mBAAqBL,GAAaK,mBAChDK,EAAcJ,oBAAsBN,GAAaM,oBACjDI,EAAcH,eAAiBP,GAAaO,eACrCG,CACX,CAzJkC,GA0JlCA,GAAcG,OAASzyT,EAAOsmS,IAE9BgsB,GAAcuxP,yBAA2B,CACrCv9Q,GAAOqD,8BACPrD,GAAOyD,uBACPzD,GAAOgE,2BACPhE,GAAOmE,0BACPnE,GAAOoE,sCACPpE,GAAOqE,gCACPrE,GAAOsE,2BACPtE,GAAOuE,kBACPvE,GAAOwE,sCACPxE,GAAOw7Q,6BACPx7Q,GAAOy7Q,gCACPz7Q,GAAO07Q,iCACP17Q,GAAO27Q,mCACP37Q,GAAO6E,qBACP7E,GAAOkF,qBACPlF,GAAOmF,kBACPnF,GAAOoF,oBACPpF,GAAOq7Q,mCACPr7Q,GAAOs7Q,iCACPt7Q,GAAO8B,iBACP9B,GAAO+B,gBAGXiqB,GAAcsxP,cAAgBtxP,GAAcG,OAAO10X,QAAO,SAAU/I,GAAK,OAAQmL,EAASmyX,GAAcuxP,yBAA0B7unB,EAAI,IAQtI,IAAI85Y,GAAoD,WACpD,IAAIxuC,EAAgB,SAAU7jS,EAAG/rC,GAI7B,OAHA4vU,EAAgBvlW,OAAOsa,gBAClB,CAAEE,UAAW,cAAgBze,OAAS,SAAU2lE,EAAG/rC,GAAK+rC,EAAElnD,UAAYmb,CAAG,GAC1E,SAAU+rC,EAAG/rC,GAAK,IAAK,IAAI5a,KAAK4a,EAAOA,EAAE11B,eAAe8a,KAAI2mD,EAAE3mD,GAAK4a,EAAE5a,GAAI,EACtEwqV,EAAc7jS,EAAG/rC,EAC5B,EACA,OAAO,SAAU+rC,EAAG/rC,GAEhB,SAAS6wU,IAAO1uW,KAAKkV,YAAc00D,CAAG,CADtC6jS,EAAc7jS,EAAG/rC,GAEjB+rC,EAAEjpE,UAAkB,OAANk9B,EAAa31B,OAAOyb,OAAOka,IAAM6wU,EAAG/tW,UAAYk9B,EAAEl9B,UAAW,IAAI+tW,EACnF,CACH,CAZuD,GAapDwtC,GAAsD,SAAU/iD,EAAY5tV,EAAQhL,EAAKwiB,GACzF,IAA2H6mD,EAAvHhc,EAAIlkD,UAAUpI,OAAQ0vF,EAAIpjC,EAAI,EAAIriD,EAAkB,OAATwX,EAAgBA,EAAO7a,OAAOkD,yBAAyBG,EAAQhL,GAAOwiB,EACrH,GAAuB,kBAAZtO,SAAoD,oBAArBA,QAAQ07B,SAAyB6gD,EAAIv8E,QAAQ07B,SAASgpT,EAAY5tV,EAAQhL,EAAKwiB,QACpH,IAAK,IAAIphB,EAAIw3V,EAAW73V,OAAS,EAAGK,GAAK,EAAGA,KAASioE,EAAIuvR,EAAWx3V,MAAIqvF,GAAKpjC,EAAI,EAAIgc,EAAEonB,GAAKpjC,EAAI,EAAIgc,EAAEr+D,EAAQhL,EAAKywF,GAAKpnB,EAAEr+D,EAAQhL,KAASywF,GAChJ,OAAOpjC,EAAI,GAAKojC,GAAK9oF,OAAOyD,eAAeJ,EAAQhL,EAAKywF,GAAIA,CAChE,EACI+pc,GAA2C,SAAUjlhB,GAErD,SAASilhB,IACL,IAAI9khB,EAAmB,OAAXH,GAAmBA,EAAOlM,MAAM5J,KAAM0J,YAAc1J,KAEhE,OADAiW,EAAM+khB,uBAAyB,CAAC,EACzB/khB,CACX,CAwBA,OA7BAgmY,GAAY8+I,EAA2BjlhB,GAMvCilhB,EAA0Bp6hB,UAAUs6hB,gBAAkB,SAAUzlb,GAC5D,IAAIv/F,EAAQjW,KACRw1G,GACAA,EAAWnzG,SAAQ,SAAU64hB,GAAiB,OAAOjlhB,EAAMklhB,aAAaD,EAAgB,GAEhG,EACAH,EAA0Bp6hB,UAAUw6hB,aAAe,SAAUD,GAKzD,IAEIE,EAFeF,EAAcr2gB,cAAc1e,QAAQ,kBAAmB,SAASC,cAEjDuvC,cAElC31C,KAAKg7hB,uBAAuBI,GAAkBF,EAAcG,cAChE,EACAN,EAA0Bp6hB,UAAU4/Y,kBAAoB,SAAU+6I,GAC9D,OAAOt7hB,KAAKg7hB,uBAAuBM,EACvC,EACAP,EAA4B7+I,GAAa,CACrC1jD,GAAK,8BACNuiM,EAEP,CA/B8C,CA+B5CjtL,IAQEwxE,GAA8D,WAC9D,IAAK,IAAI/vY,EAAI,EAAG5tC,EAAI,EAAGk9X,EAAKn1X,UAAUpI,OAAQK,EAAIk9X,EAAIl9X,IAAK4tC,GAAK7lC,UAAU/H,GAAGL,OACxE,IAAI0vF,EAAI/sF,MAAMsrC,GAAIhqC,EAAI,EAA3B,IAA8B5D,EAAI,EAAGA,EAAIk9X,EAAIl9X,IACzC,IAAK,IAAIi8B,EAAIl0B,UAAU/H,GAAIogE,EAAI,EAAG+8T,EAAKlhW,EAAEt8B,OAAQygE,EAAI+8T,EAAI/8T,IAAKx8D,IAC1DyrF,EAAEzrF,GAAKq4B,EAAEmkC,GACjB,OAAOivB,CACX,EACIsxS,GAA4B,WAC5B,SAASA,IACT,CAqKA,OApKAA,EAAWtD,kBAAoB,CAC3B,aACA,kBACA,cACA,iBACA,oBACA,YACA,UACA,QACA,OACA,cACA,QACA,OACA,mBACA,eACA,gBACA,YACA,eACA,WACA,cACA,SACA,iBACA,UACA,eACA,aACA,SACA,gBACA,gBACA,2BAEJsD,EAAWrD,kBAAoB,CAC3B,uBACA,gCACA,6BACA,YACA,qBACA,sBACA,mBACA,iCACA,8BACA,kBACA,eACA,mBACA,kBACA,2BACA,wBACA,0BACA,gCACA,mCACA,mBACA,yBACA,4BACA,UACA,qBAEJqD,EAAWpD,iBAAmB,CAC1B,WACA,eACA,kBACA,WACA,sBACA,iBACA,SAEJoD,EAAWnD,kBAAoB,CAC3B,WACA,YACA,mBACA,OACA,cACA,QACA,eACA,WACA,WACA,gBACA,uBACA,aACA,qBAEJmD,EAAWlD,mBAAqB,CAC5B,oBACA,2BACA,2BACA,gBACA,gBACA,OACA,cACA,WACA,kBACA,QACA,eACA,oBACA,0BACA,sCACA,eACA,kBACA,eACA,cACA,aACA,aACA,oBACA,mBACA,iBACA,cACA,cACA,WACA,gBACA,oBACA,wBACA,UACA,YACA,aACA,WACA,WACA,YACA,kBACA,iBACA,kBACA,sBAEJkD,EAAWjD,oBAAsB,CAC7B,qBACA,cACA,cACA,oBACA,aACA,eACA,wBACA,wBACA,iBACA,0BACA,cACA,aACA,SACA,kBACA,wBACA,8BACA,UACA,UACA,qBACA,kBACA,qBACA,gBACA,sBACA,oBACA,cACA,qBACA,mBACA,4BACA,uBACA,sBAEJiD,EAAWhD,eAAiBggD,GAAiBh9C,EAAWpD,iBAAkBoD,EAAWrD,kBAAmBqD,EAAWtD,kBAAmBsD,EAAWnD,kBAAmBmD,EAAWjD,oBAAqBiD,EAAWlD,oBAG/MkD,EAAW/C,qBAAuB,CAC9B,SACA,WACA,eACA,yBACA,kBACA,WACA,8BAEG+C,CACX,CAxK+B,GAgL3BC,GAAuB,WAavB,SAASA,EAAMvxS,EAAGt8C,EAAG7W,EAAGD,QACV,IAANA,IAAgBA,EAAI,GA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","sources":["webpack://biostatus/./node_modules/@emotion/sheet/dist/sheet.browser.esm.js","webpack://biostatus/./node_modules/@emotion/core/node_modules/@emotion/cache/dist/cache.browser.esm.js","webpack://biostatus/./node_modules/@emotion/utils/dist/utils.browser.esm.js","webpack://biostatus/./node_modules/@emotion/hash/dist/hash.browser.esm.js","webpack://biostatus/./node_modules/@emotion/serialize/dist/serialize.browser.esm.js","webpack://biostatus/./node_modules/@emotion/core/dist/emotion-element-04d85134.browser.esm.js","webpack://biostatus/./node_modules/@emotion/css/dist/css.browser.esm.js","webpack://biostatus/./node_modules/@emotion/core/dist/core.browser.esm.js","webpack://biostatus/./node_modules/react-syntax-highlighter/dist/esm/create-element.js","webpack://biostatus/./node_modules/react-syntax-highlighter/dist/esm/checkForListedLanguage.js","webpack://biostatus/./node_modules/react-syntax-highlighter/dist/esm/highlight.js","webpack://biostatus/./node_modules/react-syntax-highlighter/dist/esm/async-syntax-highlighter.js","webpack://biostatus/./node_modules/react-syntax-highlighter/dist/esm/prism-async.js","webpack://biostatus/./node_modules/react-syntax-highlighter/dist/esm/languages/prism/supported-languages.js","webpack://biostatus/./node_modules/@atlaskit/theme/node_modules/@babel/runtime/helpers/esm/objectWithoutProperties.js","webpack://biostatus/./node_modules/@atlaskit/theme/node_modules/@babel/runtime/helpers/esm/objectWithoutPropertiesLoose.js","webpack://biostatus/./node_modules/@atlaskit/theme/dist/esm/utils/create-theme.js","webpack://biostatus/./node_modules/@atlaskit/theme/dist/esm/components/theme.js","webpack://biostatus/./node_modules/@atlaskit/code/node_modules/@babel/runtime/helpers/esm/arrayLikeToArray.js","webpack://biostatus/./node_modules/@atlaskit/code/node_modules/@babel/runtime/helpers/esm/unsupportedIterableToArray.js","webpack://biostatus/./node_modules/@atlaskit/code/node_modules/@babel/runtime/helpers/esm/slicedToArray.js","webpack://biostatus/./node_modules/@atlaskit/code/node_modules/@babel/runtime/helpers/esm/arrayWithHoles.js","webpack://biostatus/./node_modules/@atlaskit/code/node_modules/@babel/runtime/helpers/esm/iterableToArrayLimit.js","webpack://biostatus/./node_modules/@atlaskit/code/node_modules/@babel/runtime/helpers/esm/nonIterableRest.js","webpack://biostatus/./node_modules/@atlaskit/code/node_modules/@babel/runtime/helpers/esm/defineProperty.js","webpack://biostatus/./node_modules/@atlaskit/code/dist/esm/internal/hooks/use-highlight.js","webpack://biostatus/./node_modules/@atlaskit/theme/dist/esm/constants.js","webpack://biostatus/./node_modules/@atlaskit/code/dist/esm/internal/theme/constants.js","webpack://biostatus/./node_modules/@atlaskit/theme/dist/esm/utils/get-theme.js","webpack://biostatus/./node_modules/@atlaskit/theme/dist/esm/utils/themed.js","webpack://biostatus/./node_modules/@atlaskit/theme/dist/esm/colors.js","webpack://biostatus/./node_modules/@atlaskit/code/dist/esm/internal/theme/get-theme.js","webpack://biostatus/./node_modules/@atlaskit/code/dist/esm/internal/theme/styles.js","webpack://biostatus/./node_modules/@atlaskit/code/dist/esm/constants.js","webpack://biostatus/./node_modules/@atlaskit/code/dist/esm/internal/utils/get-normalized-language.js","webpack://biostatus/./node_modules/@atlaskit/code/node_modules/@babel/runtime/helpers/esm/extends.js","webpack://biostatus/./node_modules/@atlaskit/code/node_modules/@babel/runtime/helpers/esm/objectWithoutProperties.js","webpack://biostatus/./node_modules/@atlaskit/code/node_modules/@babel/runtime/helpers/esm/objectWithoutPropertiesLoose.js","webpack://biostatus/./node_modules/@atlaskit/tooltip/node_modules/@babel/runtime/helpers/esm/extends.js","webpack://biostatus/./node_modules/@atlaskit/tooltip/node_modules/@babel/runtime/helpers/esm/arrayLikeToArray.js","webpack://biostatus/./node_modules/@atlaskit/tooltip/node_modules/@babel/runtime/helpers/esm/slicedToArray.js","webpack://biostatus/./node_modules/@atlaskit/tooltip/node_modules/@babel/runtime/helpers/esm/arrayWithHoles.js","webpack://biostatus/./node_modules/@atlaskit/tooltip/node_modules/@babel/runtime/helpers/esm/iterableToArrayLimit.js","webpack://biostatus/./node_modules/@atlaskit/tooltip/node_modules/@babel/runtime/helpers/esm/unsupportedIterableToArray.js","webpack://biostatus/./node_modules/@atlaskit/tooltip/node_modules/@babel/runtime/helpers/esm/nonIterableRest.js","webpack://biostatus/./node_modules/@atlaskit/tooltip/node_modules/@babel/runtime/helpers/esm/defineProperty.js","webpack://biostatus/./node_modules/@atlaskit/analytics-next/node_modules/@babel/runtime/helpers/esm/defineProperty.js","webpack://biostatus/./node_modules/use-memo-one/dist/use-memo-one.esm.js","webpack://biostatus/./node_modules/@atlaskit/analytics-next/node_modules/@babel/runtime/helpers/esm/arrayLikeToArray.js","webpack://biostatus/./node_modules/@atlaskit/analytics-next/node_modules/@babel/runtime/helpers/esm/toConsumableArray.js","webpack://biostatus/./node_modules/@atlaskit/analytics-next/node_modules/@babel/runtime/helpers/esm/arrayWithoutHoles.js","webpack://biostatus/./node_modules/@atlaskit/analytics-next/node_modules/@babel/runtime/helpers/esm/iterableToArray.js","webpack://biostatus/./node_modules/@atlaskit/analytics-next/node_modules/@babel/runtime/helpers/esm/unsupportedIterableToArray.js","webpack://biostatus/./node_modules/@atlaskit/analytics-next/node_modules/@babel/runtime/helpers/esm/nonIterableSpread.js","webpack://biostatus/./node_modules/@atlaskit/analytics-next/node_modules/@babel/runtime/helpers/esm/classCallCheck.js","webpack://biostatus/./node_modules/@atlaskit/analytics-next/node_modules/@babel/runtime/helpers/esm/createClass.js","webpack://biostatus/./node_modules/@atlaskit/analytics-next/node_modules/@babel/runtime/helpers/esm/assertThisInitialized.js","webpack://biostatus/./node_modules/@atlaskit/analytics-next/node_modules/@babel/runtime/helpers/esm/getPrototypeOf.js","webpack://biostatus/./node_modules/@atlaskit/analytics-next/node_modules/@babel/runtime/helpers/esm/get.js","webpack://biostatus/./node_modules/@atlaskit/analytics-next/node_modules/@babel/runtime/helpers/esm/superPropBase.js","webpack://biostatus/./node_modules/@atlaskit/analytics-next/node_modules/@babel/runtime/helpers/esm/setPrototypeOf.js","webpack://biostatus/./node_modules/@atlaskit/analytics-next/node_modules/@babel/runtime/helpers/esm/typeof.js","webpack://biostatus/./node_modules/@atlaskit/analytics-next/dist/esm/events/AnalyticsEvent.js","webpack://biostatus/./node_modules/@atlaskit/analytics-next/dist/esm/events/UIAnalyticsEvent.js","webpack://biostatus/./node_modules/@atlaskit/analytics-next/node_modules/@babel/runtime/helpers/esm/possibleConstructorReturn.js","webpack://biostatus/./node_modules/@atlaskit/analytics-next/node_modules/@babel/runtime/helpers/esm/inherits.js","webpack://biostatus/./node_modules/@atlaskit/analytics-next-stable-react-context/dist/esm/index.js","webpack://biostatus/./node_modules/@atlaskit/analytics-next-stable-react-context/dist/esm/context.js","webpack://biostatus/./node_modules/@atlaskit/analytics-next/dist/esm/hooks/useAnalyticsEvents.js","webpack://biostatus/./node_modules/@atlaskit/analytics-next/dist/esm/hooks/useAnalyticsContext.js","webpack://biostatus/./node_modules/@atlaskit/analytics-next/dist/esm/hooks/useTrackedRef.js","webpack://biostatus/./node_modules/@atlaskit/analytics-next/dist/esm/hooks/usePlatformLeafSyntheticEventHandler.js","webpack://biostatus/./node_modules/@atlaskit/ds-lib/dist/esm/utils/noop.js","webpack://biostatus/./node_modules/@atlaskit/motion/dist/esm/utils/accessibility.js","webpack://biostatus/./node_modules/@atlaskit/motion/node_modules/@babel/runtime/helpers/esm/arrayLikeToArray.js","webpack://biostatus/./node_modules/@atlaskit/motion/node_modules/@babel/runtime/helpers/esm/slicedToArray.js","webpack://biostatus/./node_modules/@atlaskit/motion/node_modules/@babel/runtime/helpers/esm/arrayWithHoles.js","webpack://biostatus/./node_modules/@atlaskit/motion/node_modules/@babel/runtime/helpers/esm/iterableToArrayLimit.js","webpack://biostatus/./node_modules/@atlaskit/motion/node_modules/@babel/runtime/helpers/esm/unsupportedIterableToArray.js","webpack://biostatus/./node_modules/@atlaskit/motion/node_modules/@babel/runtime/helpers/esm/nonIterableRest.js","webpack://biostatus/./node_modules/@atlaskit/motion/dist/esm/utils/use-force-render.js","webpack://biostatus/./node_modules/@atlaskit/motion/dist/esm/entering/exiting-persistence.js","webpack://biostatus/./node_modules/@atlaskit/motion/node_modules/@babel/runtime/helpers/esm/defineProperty.js","webpack://biostatus/./node_modules/@atlaskit/motion/dist/esm/utils/curves.js","webpack://biostatus/./node_modules/@atlaskit/motion/dist/esm/utils/timer-hooks.js","webpack://biostatus/./node_modules/@atlaskit/motion/dist/esm/entering/staggered-entrance.js","webpack://biostatus/./node_modules/@atlaskit/motion/dist/esm/utils/use-unique-id.js","webpack://biostatus/./node_modules/@atlaskit/motion/dist/esm/entering/keyframes-motion.js","webpack://biostatus/./node_modules/@atlaskit/motion/dist/esm/utils/durations.js","webpack://biostatus/./node_modules/@atlaskit/motion/dist/esm/entering/fade-in.js","webpack://biostatus/./node_modules/@atlaskit/popper/node_modules/@babel/runtime/helpers/esm/arrayLikeToArray.js","webpack://biostatus/./node_modules/@atlaskit/popper/node_modules/@babel/runtime/helpers/esm/unsupportedIterableToArray.js","webpack://biostatus/./node_modules/@atlaskit/popper/node_modules/@babel/runtime/helpers/esm/toConsumableArray.js","webpack://biostatus/./node_modules/@atlaskit/popper/node_modules/@babel/runtime/helpers/esm/arrayWithoutHoles.js","webpack://biostatus/./node_modules/@atlaskit/popper/node_modules/@babel/runtime/helpers/esm/iterableToArray.js","webpack://biostatus/./node_modules/@atlaskit/popper/node_modules/@babel/runtime/helpers/esm/nonIterableSpread.js","webpack://biostatus/./node_modules/@atlaskit/popper/node_modules/@babel/runtime/helpers/esm/slicedToArray.js","webpack://biostatus/./node_modules/@atlaskit/popper/node_modules/@babel/runtime/helpers/esm/arrayWithHoles.js","webpack://biostatus/./node_modules/@atlaskit/popper/node_modules/@babel/runtime/helpers/esm/iterableToArrayLimit.js","webpack://biostatus/./node_modules/@atlaskit/popper/node_modules/@babel/runtime/helpers/esm/nonIterableRest.js","webpack://biostatus/./node_modules/react-popper/lib/esm/Manager.js","webpack://biostatus/./node_modules/react-popper/lib/esm/utils.js","webpack://biostatus/./node_modules/@popperjs/core/lib/dom-utils/getWindow.js","webpack://biostatus/./node_modules/@popperjs/core/lib/dom-utils/instanceOf.js","webpack://biostatus/./node_modules/@popperjs/core/lib/utils/math.js","webpack://biostatus/./node_modules/@popperjs/core/lib/utils/userAgent.js","webpack://biostatus/./node_modules/@popperjs/core/lib/dom-utils/isLayoutViewport.js","webpack://biostatus/./node_modules/@popperjs/core/lib/dom-utils/getBoundingClientRect.js","webpack://biostatus/./node_modules/@popperjs/core/lib/dom-utils/getWindowScroll.js","webpack://biostatus/./node_modules/@popperjs/core/lib/dom-utils/getNodeName.js","webpack://biostatus/./node_modules/@popperjs/core/lib/dom-utils/getDocumentElement.js","webpack://biostatus/./node_modules/@popperjs/core/lib/dom-utils/getWindowScrollBarX.js","webpack://biostatus/./node_modules/@popperjs/core/lib/dom-utils/getComputedStyle.js","webpack://biostatus/./node_modules/@popperjs/core/lib/dom-utils/isScrollParent.js","webpack://biostatus/./node_modules/@popperjs/core/lib/dom-utils/getCompositeRect.js","webpack://biostatus/./node_modules/@popperjs/core/lib/dom-utils/getNodeScroll.js","webpack://biostatus/./node_modules/@popperjs/core/lib/dom-utils/getHTMLElementScroll.js","webpack://biostatus/./node_modules/@popperjs/core/lib/dom-utils/getLayoutRect.js","webpack://biostatus/./node_modules/@popperjs/core/lib/dom-utils/getParentNode.js","webpack://biostatus/./node_modules/@popperjs/core/lib/dom-utils/getScrollParent.js","webpack://biostatus/./node_modules/@popperjs/core/lib/dom-utils/listScrollParents.js","webpack://biostatus/./node_modules/@popperjs/core/lib/dom-utils/isTableElement.js","webpack://biostatus/./node_modules/@popperjs/core/lib/dom-utils/getOffsetParent.js","webpack://biostatus/./node_modules/@popperjs/core/lib/enums.js","webpack://biostatus/./node_modules/@popperjs/core/lib/utils/orderModifiers.js","webpack://biostatus/./node_modules/@popperjs/core/lib/createPopper.js","webpack://biostatus/./node_modules/@popperjs/core/lib/utils/debounce.js","webpack://biostatus/./node_modules/@popperjs/core/lib/utils/mergeByName.js","webpack://biostatus/./node_modules/@popperjs/core/lib/modifiers/eventListeners.js","webpack://biostatus/./node_modules/@popperjs/core/lib/utils/getBasePlacement.js","webpack://biostatus/./node_modules/@popperjs/core/lib/utils/getVariation.js","webpack://biostatus/./node_modules/@popperjs/core/lib/utils/getMainAxisFromPlacement.js","webpack://biostatus/./node_modules/@popperjs/core/lib/utils/computeOffsets.js","webpack://biostatus/./node_modules/@popperjs/core/lib/modifiers/popperOffsets.js","webpack://biostatus/./node_modules/@popperjs/core/lib/modifiers/computeStyles.js","webpack://biostatus/./node_modules/@popperjs/core/lib/modifiers/offset.js","webpack://biostatus/./node_modules/@popperjs/core/lib/utils/getOppositePlacement.js","webpack://biostatus/./node_modules/@popperjs/core/lib/utils/getOppositeVariationPlacement.js","webpack://biostatus/./node_modules/@popperjs/core/lib/dom-utils/contains.js","webpack://biostatus/./node_modules/@popperjs/core/lib/utils/rectToClientRect.js","webpack://biostatus/./node_modules/@popperjs/core/lib/dom-utils/getClippingRect.js","webpack://biostatus/./node_modules/@popperjs/core/lib/dom-utils/getViewportRect.js","webpack://biostatus/./node_modules/@popperjs/core/lib/dom-utils/getDocumentRect.js","webpack://biostatus/./node_modules/@popperjs/core/lib/utils/mergePaddingObject.js","webpack://biostatus/./node_modules/@popperjs/core/lib/utils/getFreshSideObject.js","webpack://biostatus/./node_modules/@popperjs/core/lib/utils/expandToHashMap.js","webpack://biostatus/./node_modules/@popperjs/core/lib/utils/detectOverflow.js","webpack://biostatus/./node_modules/@popperjs/core/lib/modifiers/flip.js","webpack://biostatus/./node_modules/@popperjs/core/lib/utils/computeAutoPlacement.js","webpack://biostatus/./node_modules/@popperjs/core/lib/utils/within.js","webpack://biostatus/./node_modules/@popperjs/core/lib/modifiers/preventOverflow.js","webpack://biostatus/./node_modules/@popperjs/core/lib/utils/getAltAxis.js","webpack://biostatus/./node_modules/@popperjs/core/lib/modifiers/arrow.js","webpack://biostatus/./node_modules/@popperjs/core/lib/modifiers/hide.js","webpack://biostatus/./node_modules/@popperjs/core/lib/popper.js","webpack://biostatus/./node_modules/@popperjs/core/lib/modifiers/applyStyles.js","webpack://biostatus/./node_modules/react-popper/lib/esm/usePopper.js","webpack://biostatus/./node_modules/react-popper/lib/esm/Popper.js","webpack://biostatus/./node_modules/@atlaskit/popper/dist/esm/popper.js","webpack://biostatus/./node_modules/@atlaskit/portal/dist/esm/internal/constants.js","webpack://biostatus/./node_modules/@atlaskit/portal/dist/esm/internal/utils/portal-dom-utils.js","webpack://biostatus/./node_modules/@atlaskit/portal/dist/esm/internal/components/internal-portal.js","webpack://biostatus/./node_modules/@atlaskit/portal/node_modules/@babel/runtime/helpers/esm/arrayLikeToArray.js","webpack://biostatus/./node_modules/@atlaskit/portal/node_modules/@babel/runtime/helpers/esm/slicedToArray.js","webpack://biostatus/./node_modules/@atlaskit/portal/node_modules/@babel/runtime/helpers/esm/arrayWithHoles.js","webpack://biostatus/./node_modules/@atlaskit/portal/node_modules/@babel/runtime/helpers/esm/iterableToArrayLimit.js","webpack://biostatus/./node_modules/@atlaskit/portal/node_modules/@babel/runtime/helpers/esm/unsupportedIterableToArray.js","webpack://biostatus/./node_modules/@atlaskit/portal/node_modules/@babel/runtime/helpers/esm/nonIterableRest.js","webpack://biostatus/./node_modules/@atlaskit/portal/dist/esm/internal/hooks/use-is-subsequent-render.js","webpack://biostatus/./node_modules/@atlaskit/portal/dist/esm/internal/utils/portal-custom-event.js","webpack://biostatus/./node_modules/@atlaskit/portal/dist/esm/internal/hooks/use-portal-event.js","webpack://biostatus/./node_modules/@atlaskit/portal/dist/esm/constants.js","webpack://biostatus/./node_modules/@atlaskit/portal/dist/esm/portal.js","webpack://biostatus/./node_modules/@atlaskit/tooltip/dist/esm/internal/shared-schedule.js","webpack://biostatus/./node_modules/@atlaskit/tooltip/dist/esm/internal/tooltip-manager.js","webpack://biostatus/./node_modules/react-uid/dist/es2015/uid.js","webpack://biostatus/./node_modules/react-uid/dist/es2015/context.js","webpack://biostatus/./node_modules/react-uid/dist/es2015/hooks.js","webpack://biostatus/./node_modules/@atlaskit/tooltip/dist/esm/internal/use-unique-id.js","webpack://biostatus/./node_modules/@atlaskit/tooltip/dist/esm/TooltipPrimitive.js","webpack://biostatus/./node_modules/@atlaskit/tooltip/dist/esm/TooltipContainer.js","webpack://biostatus/./node_modules/@atlaskit/tooltip/dist/esm/utilities.js","webpack://biostatus/./node_modules/@atlaskit/tooltip/dist/esm/Tooltip.js","webpack://biostatus/./node_modules/@atlaskit/ds-lib/dist/esm/hooks/use-close-on-escape-press.js","webpack://biostatus/./node_modules/@atlaskit/ds-lib/dist/esm/utils/keycodes.js","webpack://biostatus/./node_modules/@atlaskit/code/dist/esm/bidi-warning/ui/styled.js","webpack://biostatus/./node_modules/@atlaskit/code/dist/esm/bidi-warning/ui/index.js","webpack://biostatus/./node_modules/@atlaskit/code/node_modules/@babel/runtime/helpers/esm/toConsumableArray.js","webpack://biostatus/./node_modules/@atlaskit/code/node_modules/@babel/runtime/helpers/esm/arrayWithoutHoles.js","webpack://biostatus/./node_modules/@atlaskit/code/node_modules/@babel/runtime/helpers/esm/iterableToArray.js","webpack://biostatus/./node_modules/@atlaskit/code/node_modules/@babel/runtime/helpers/esm/nonIterableSpread.js","webpack://biostatus/./node_modules/@atlaskit/code/dist/esm/bidi-warning/bidi-warning-decorator.js","webpack://biostatus/./node_modules/@atlaskit/code/dist/esm/react-syntax-highlighter-bidi-warning-renderer.js","webpack://biostatus/./node_modules/@atlaskit/code/dist/esm/code-block.js","webpack://biostatus/./node_modules/@cardscan.ai/insurance-cardscan-react/dist/index.es.js","webpack://biostatus/./node_modules/@googlemaps/react-wrapper/dist/index.umd.js","webpack://biostatus/./node_modules/@mergeapi/react-merge-link/dist/index.esm.js","webpack://biostatus/./node_modules/@tensorflow/tfjs-converter/dist/data/compiled_api.js","webpack://biostatus/./node_modules/@tensorflow/tfjs-converter/dist/flags.js","webpack://biostatus/./node_modules/@tensorflow/tfjs-converter/dist/operations/custom_op/register.js","webpack://biostatus/./node_modules/@tensorflow/tfjs-converter/dist/operations/executors/utils.js","webpack://biostatus/./node_modules/@tensorflow/tfjs-converter/dist/operations/op_list/arithmetic.js","webpack://biostatus/./node_modules/@tensorflow/tfjs-converter/dist/operations/op_list/basic_math.js","webpack://biostatus/./node_modules/@tensorflow/tfjs-converter/dist/operations/op_list/control.js","webpack://biostatus/./node_modules/@tensorflow/tfjs-converter/dist/operations/op_list/convolution.js","webpack://biostatus/./node_modules/@tensorflow/tfjs-converter/dist/operations/op_list/creation.js","webpack://biostatus/./node_modules/@tensorflow/tfjs-converter/dist/operations/op_list/dynamic.js","webpack://biostatus/./node_modules/@tensorflow/tfjs-converter/dist/operations/op_list/evaluation.js","webpack://biostatus/./node_modules/@tensorflow/tfjs-converter/dist/operations/op_list/graph.js","webpack://biostatus/./node_modules/@tensorflow/tfjs-converter/dist/operations/op_list/hash_table.js","webpack://biostatus/./node_modules/@tensorflow/tfjs-converter/dist/operations/op_list/image.js","webpack://biostatus/./node_modules/@tensorflow/tfjs-converter/dist/operations/op_list/logical.js","webpack://biostatus/./node_modules/@tensorflow/tfjs-converter/dist/operations/op_list/matrices.js","webpack://biostatus/./node_modules/@tensorflow/tfjs-converter/dist/operations/op_list/normalization.js","webpack://biostatus/./node_modules/@tensorflow/tfjs-converter/dist/operations/op_list/reduction.js","webpack://biostatus/./node_modules/@tensorflow/tfjs-converter/dist/operations/op_list/slice_join.js","webpack://biostatus/./node_modules/@tensorflow/tfjs-converter/dist/operations/op_list/sparse.js","webpack://biostatus/./node_modules/@tensorflow/tfjs-converter/dist/operations/op_list/spectral.js","webpack://biostatus/./node_modules/@tensorflow/tfjs-converter/dist/operations/op_list/string.js","webpack://biostatus/./node_modules/@tensorflow/tfjs-converter/dist/operations/op_list/transformation.js","webpack://biostatus/./node_modules/@tensorflow/tfjs-converter/dist/operations/operation_mapper.js","webpack://biostatus/./node_modules/@tensorflow/tfjs-converter/dist/operations/custom_op/node_value_impl.js","webpack://biostatus/./node_modules/@tensorflow/tfjs-converter/dist/executor/tensor_utils.js","webpack://biostatus/./node_modules/@tensorflow/tfjs-converter/dist/executor/tensor_array.js","webpack://biostatus/./node_modules/@tensorflow/tfjs-converter/dist/executor/tensor_list.js","webpack://biostatus/./node_modules/@tensorflow/tfjs-converter/dist/operations/executors/control_executor.js","webpack://biostatus/./node_modules/@tensorflow/tfjs-converter/dist/operations/executors/convolution_executor.js","webpack://biostatus/./node_modules/@tensorflow/tfjs-converter/dist/operations/executors/dynamic_executor.js","webpack://biostatus/./node_modules/@tensorflow/tfjs-converter/dist/executor/hash_table.js","webpack://biostatus/./node_modules/@tensorflow/tfjs-converter/dist/operations/operation_executor.js","webpack://biostatus/./node_modules/@tensorflow/tfjs-converter/dist/operations/executors/arithmetic_executor.js","webpack://biostatus/./node_modules/@tensorflow/tfjs-converter/dist/operations/executors/basic_math_executor.js","webpack://biostatus/./node_modules/@tensorflow/tfjs-converter/dist/operations/executors/creation_executor.js","webpack://biostatus/./node_modules/@tensorflow/tfjs-converter/dist/operations/executors/evaluation_executor.js","webpack://biostatus/./node_modules/@tensorflow/tfjs-converter/dist/operations/executors/image_executor.js","webpack://biostatus/./node_modules/@tensorflow/tfjs-converter/dist/operations/executors/graph_executor.js","webpack://biostatus/./node_modules/@tensorflow/tfjs-converter/dist/operations/executors/logical_executor.js","webpack://biostatus/./node_modules/@tensorflow/tfjs-converter/dist/operations/executors/matrices_executor.js","webpack://biostatus/./node_modules/@tensorflow/tfjs-converter/dist/operations/executors/normalization_executor.js","webpack://biostatus/./node_modules/@tensorflow/tfjs-converter/dist/operations/executors/reduction_executor.js","webpack://biostatus/./node_modules/@tensorflow/tfjs-converter/dist/operations/executors/slice_join_executor.js","webpack://biostatus/./node_modules/@tensorflow/tfjs-converter/dist/operations/executors/sparse_executor.js","webpack://biostatus/./node_modules/@tensorflow/tfjs-converter/dist/operations/executors/spectral_executor.js","webpack://biostatus/./node_modules/@tensorflow/tfjs-converter/dist/operations/executors/string_executor.js","webpack://biostatus/./node_modules/@tensorflow/tfjs-converter/dist/operations/executors/transformation_executor.js","webpack://biostatus/./node_modules/@tensorflow/tfjs-converter/dist/operations/executors/hash_table_executor.js","webpack://biostatus/./node_modules/@tensorflow/tfjs-converter/dist/executor/execution_context.js","webpack://biostatus/./node_modules/@tensorflow/tfjs-converter/dist/executor/model_analysis.js","webpack://biostatus/./node_modules/@tensorflow/tfjs-converter/dist/executor/graph_executor.js","webpack://biostatus/./node_modules/@tensorflow/tfjs-converter/dist/executor/resource_manager.js","webpack://biostatus/./node_modules/@tensorflow/tfjs-converter/dist/executor/graph_model.js","webpack://biostatus/./node_modules/@tensorflow/tfjs-converter/dist/version.js","webpack://biostatus/./node_modules/@tensorflow/tfjs-core/dist/backends/backend.js","webpack://biostatus/./node_modules/@tensorflow/tfjs-core/dist/backends/non_max_suppression_util.js","webpack://biostatus/./node_modules/@tensorflow/tfjs-core/dist/backends/non_max_suppression_impl.js","webpack://biostatus/./node_modules/@tensorflow/tfjs-core/dist/backends/where_impl.js","webpack://biostatus/./node_modules/@tensorflow/tfjs-core/dist/profiler.js","webpack://biostatus/./node_modules/@tensorflow/tfjs-core/dist/engine.js","webpack://biostatus/./node_modules/@tensorflow/tfjs-core/dist/tape.js","webpack://biostatus/./node_modules/@tensorflow/tfjs-core/dist/environment.js","webpack://biostatus/./node_modules/@tensorflow/tfjs-core/dist/global_util.js","webpack://biostatus/./node_modules/@tensorflow/tfjs-core/dist/globals.js","webpack://biostatus/./node_modules/@tensorflow/tfjs-core/dist/gradients.js","webpack://biostatus/./node_modules/@tensorflow/tfjs-core/dist/device_util.js","webpack://biostatus/./node_modules/@tensorflow/tfjs-core/dist/flags.js","webpack://biostatus/./node_modules/@tensorflow/tfjs-core/dist/io/types.js","webpack://biostatus/./node_modules/@tensorflow/tfjs-core/dist/io/io_utils.js","webpack://biostatus/./node_modules/@tensorflow/tfjs-core/dist/io/router_registry.js","webpack://biostatus/./node_modules/@tensorflow/tfjs-core/dist/io/indexed_db.js","webpack://biostatus/./node_modules/@tensorflow/tfjs-core/dist/io/local_storage.js","webpack://biostatus/./node_modules/@tensorflow/tfjs-core/dist/io/model_management.js","webpack://biostatus/./node_modules/@tensorflow/tfjs-core/dist/platforms/platform_browser.js","webpack://biostatus/./node_modules/@tensorflow/tfjs-core/dist/platforms/platform_node.js","webpack://biostatus/./node_modules/@tensorflow/tfjs-core/dist/base_side_effects.js","webpack://biostatus/./node_modules/@tensorflow/tfjs-core/dist/io/browser_files.js","webpack://biostatus/./node_modules/@tensorflow/tfjs-core/dist/io/progress.js","webpack://biostatus/./node_modules/@tensorflow/tfjs-core/dist/io/weights_loader.js","webpack://biostatus/./node_modules/@tensorflow/tfjs-core/dist/io/http.js","webpack://biostatus/./node_modules/@tensorflow/tfjs-core/dist/io/passthrough.js","webpack://biostatus/./node_modules/@tensorflow/tfjs-core/dist/ops/confusion_matrix.js","webpack://biostatus/./node_modules/@tensorflow/tfjs-core/dist/ops/browser.js","webpack://biostatus/./node_modules/@tensorflow/tfjs-core/dist/ops/gather_nd_util.js","webpack://biostatus/./node_modules/@tensorflow/tfjs-core/dist/serialization.js","webpack://biostatus/./node_modules/@tensorflow/tfjs-core/dist/test_util.js","webpack://biostatus/./node_modules/@tensorflow/tfjs-core/dist/version.js","webpack://biostatus/./node_modules/@tensorflow/tfjs-core/dist/optimizers/optimizer.js","webpack://biostatus/./node_modules/@tensorflow/tfjs-core/dist/optimizers/adadelta_optimizer.js","webpack://biostatus/./node_modules/@tensorflow/tfjs-core/dist/optimizers/adagrad_optimizer.js","webpack://biostatus/./node_modules/@tensorflow/tfjs-core/dist/optimizers/adam_optimizer.js","webpack://biostatus/./node_modules/@tensorflow/tfjs-core/dist/optimizers/adamax_optimizer.js","webpack://biostatus/./node_modules/@tensorflow/tfjs-core/dist/optimizers/sgd_optimizer.js","webpack://biostatus/./node_modules/@tensorflow/tfjs-core/dist/optimizers/momentum_optimizer.js","webpack://biostatus/./node_modules/@tensorflow/tfjs-core/dist/optimizers/rmsprop_optimizer.js","webpack://biostatus/./node_modules/@tensorflow/tfjs-core/dist/optimizers/optimizer_constructors.js","webpack://biostatus/./node_modules/@tensorflow/tfjs-core/dist/train.js","webpack://biostatus/./node_modules/@tensorflow/tfjs-core/dist/browser_util.js","webpack://biostatus/./node_modules/@tensorflow/tfjs-core/dist/ops/concat_util.js","webpack://biostatus/./node_modules/@tensorflow/tfjs-core/dist/ops/ragged_to_dense_util.js","webpack://biostatus/./node_modules/@tensorflow/tfjs-core/dist/ops/reduce_util.js","webpack://biostatus/./node_modules/@tensorflow/tfjs-core/dist/ops/rotate_util.js","webpack://biostatus/./node_modules/@tensorflow/tfjs-core/dist/ops/array_ops_util.js","webpack://biostatus/./node_modules/@tensorflow/tfjs-core/dist/ops/erf_util.js","webpack://biostatus/./node_modules/@tensorflow/tfjs-core/dist/backends/complex_util.js","webpack://biostatus/./node_modules/@tensorflow/tfjs-core/dist/backends/einsum_util.js","webpack://biostatus/./node_modules/@tensorflow/tfjs-core/dist/ops/split_util.js","webpack://biostatus/./node_modules/@tensorflow/tfjs-core/dist/ops/sparse/sparse_fill_empty_rows_util.js","webpack://biostatus/./node_modules/@tensorflow/tfjs-core/dist/ops/sparse/sparse_reshape_util.js","webpack://biostatus/./node_modules/@tensorflow/tfjs-core/dist/ops/sparse/sparse_segment_reduction_util.js","webpack://biostatus/./node_modules/@tensorflow/tfjs-core/dist/ops/segment_util.js","webpack://biostatus/./node_modules/@tensorflow/tfjs-core/dist/backends/backend_util.js","webpack://biostatus/./node_modules/@tensorflow/tfjs-core/dist/kernel_names.js","webpack://biostatus/./node_modules/@tensorflow/tfjs-core/dist/kernel_registry.js","webpack://biostatus/./node_modules/@tensorflow/tfjs-core/dist/log.js","webpack://biostatus/./node_modules/@tensorflow/tfjs-core/dist/ops/abs.js","webpack://biostatus/./node_modules/@tensorflow/tfjs-core/dist/ops/acos.js","webpack://biostatus/./node_modules/@tensorflow/tfjs-core/dist/ops/acosh.js","webpack://biostatus/./node_modules/@tensorflow/tfjs-core/dist/ops/add.js","webpack://biostatus/./node_modules/@tensorflow/tfjs-core/dist/ops/all.js","webpack://biostatus/./node_modules/@tensorflow/tfjs-core/dist/ops/any.js","webpack://biostatus/./node_modules/@tensorflow/tfjs-core/dist/ops/arg_max.js","webpack://biostatus/./node_modules/@tensorflow/tfjs-core/dist/ops/arg_min.js","webpack://biostatus/./node_modules/@tensorflow/tfjs-core/dist/ops/asin.js","webpack://biostatus/./node_modules/@tensorflow/tfjs-core/dist/ops/asinh.js","webpack://biostatus/./node_modules/@tensorflow/tfjs-core/dist/ops/atan.js","webpack://biostatus/./node_modules/@tensorflow/tfjs-core/dist/ops/atan2.js","webpack://biostatus/./node_modules/@tensorflow/tfjs-core/dist/ops/atanh.js","webpack://biostatus/./node_modules/@tensorflow/tfjs-core/dist/ops/avg_pool.js","webpack://biostatus/./node_modules/@tensorflow/tfjs-core/dist/ops/axis_util.js","webpack://biostatus/./node_modules/@tensorflow/tfjs-core/dist/ops/batch_to_space_nd.js","webpack://biostatus/./node_modules/@tensorflow/tfjs-core/dist/ops/batchnorm.js","webpack://biostatus/./node_modules/@tensorflow/tfjs-core/dist/ops/batchnorm_util.js","webpack://biostatus/./node_modules/@tensorflow/tfjs-core/dist/ops/broadcast_to.js","webpack://biostatus/./node_modules/@tensorflow/tfjs-core/dist/ops/broadcast_util.js","webpack://biostatus/./node_modules/@tensorflow/tfjs-core/dist/ops/buffer.js","webpack://biostatus/./node_modules/@tensorflow/tfjs-core/dist/ops/cast.js","webpack://biostatus/./node_modules/@tensorflow/tfjs-core/dist/ops/ceil.js","webpack://biostatus/./node_modules/@tensorflow/tfjs-core/dist/ops/clip_by_value.js","webpack://biostatus/./node_modules/@tensorflow/tfjs-core/dist/ops/clone.js","webpack://biostatus/./node_modules/@tensorflow/tfjs-core/dist/ops/complex.js","webpack://biostatus/./node_modules/@tensorflow/tfjs-core/dist/ops/concat.js","webpack://biostatus/./node_modules/@tensorflow/tfjs-core/dist/ops/conv1d.js","webpack://biostatus/./node_modules/@tensorflow/tfjs-core/dist/ops/conv2d.js","webpack://biostatus/./node_modules/@tensorflow/tfjs-core/dist/ops/conv2d_backprop_filter.js","webpack://biostatus/./node_modules/@tensorflow/tfjs-core/dist/ops/conv2d_backprop_input.js","webpack://biostatus/./node_modules/@tensorflow/tfjs-core/dist/ops/conv2d_transpose.js","webpack://biostatus/./node_modules/@tensorflow/tfjs-core/dist/ops/conv3d_backprop_input.js","webpack://biostatus/./node_modules/@tensorflow/tfjs-core/dist/ops/conv_util.js","webpack://biostatus/./node_modules/@tensorflow/tfjs-core/dist/ops/cos.js","webpack://biostatus/./node_modules/@tensorflow/tfjs-core/dist/ops/cosh.js","webpack://biostatus/./node_modules/@tensorflow/tfjs-core/dist/ops/cumprod.js","webpack://biostatus/./node_modules/@tensorflow/tfjs-core/dist/ops/cumsum.js","webpack://biostatus/./node_modules/@tensorflow/tfjs-core/dist/ops/depth_to_space.js","webpack://biostatus/./node_modules/@tensorflow/tfjs-core/dist/ops/depthwise_conv2d.js","webpack://biostatus/./node_modules/@tensorflow/tfjs-core/dist/ops/depthwise_conv2d_native_backprop_filter.js","webpack://biostatus/./node_modules/@tensorflow/tfjs-core/dist/ops/depthwise_conv2d_native_backprop_input.js","webpack://biostatus/./node_modules/@tensorflow/tfjs-core/dist/ops/dilation2d.js","webpack://biostatus/./node_modules/@tensorflow/tfjs-core/dist/ops/div.js","webpack://biostatus/./node_modules/@tensorflow/tfjs-core/dist/ops/div_no_nan.js","webpack://biostatus/./node_modules/@tensorflow/tfjs-core/dist/ops/dot.js","webpack://biostatus/./node_modules/@tensorflow/tfjs-core/dist/ops/elu.js","webpack://biostatus/./node_modules/@tensorflow/tfjs-core/dist/ops/equal.js","webpack://biostatus/./node_modules/@tensorflow/tfjs-core/dist/ops/erf.js","webpack://biostatus/./node_modules/@tensorflow/tfjs-core/dist/ops/euclidean_norm.js","webpack://biostatus/./node_modules/@tensorflow/tfjs-core/dist/ops/exp.js","webpack://biostatus/./node_modules/@tensorflow/tfjs-core/dist/ops/expand_dims.js","webpack://biostatus/./node_modules/@tensorflow/tfjs-core/dist/ops/expm1.js","webpack://biostatus/./node_modules/@tensorflow/tfjs-core/dist/ops/fill.js","webpack://biostatus/./node_modules/@tensorflow/tfjs-core/dist/ops/floor.js","webpack://biostatus/./node_modules/@tensorflow/tfjs-core/dist/ops/floorDiv.js","webpack://biostatus/./node_modules/@tensorflow/tfjs-core/dist/ops/fused_util.js","webpack://biostatus/./node_modules/@tensorflow/tfjs-core/dist/ops/gather.js","webpack://biostatus/./node_modules/@tensorflow/tfjs-core/dist/ops/greater.js","webpack://biostatus/./node_modules/@tensorflow/tfjs-core/dist/ops/greater_equal.js","webpack://biostatus/./node_modules/@tensorflow/tfjs-core/dist/ops/imag.js","webpack://biostatus/./node_modules/@tensorflow/tfjs-core/dist/ops/image/resize_bilinear.js","webpack://biostatus/./node_modules/@tensorflow/tfjs-core/dist/ops/image/resize_nearest_neighbor.js","webpack://biostatus/./node_modules/@tensorflow/tfjs-core/dist/ops/is_finite.js","webpack://biostatus/./node_modules/@tensorflow/tfjs-core/dist/ops/is_inf.js","webpack://biostatus/./node_modules/@tensorflow/tfjs-core/dist/ops/is_nan.js","webpack://biostatus/./node_modules/@tensorflow/tfjs-core/dist/ops/leaky_relu.js","webpack://biostatus/./node_modules/@tensorflow/tfjs-core/dist/ops/less.js","webpack://biostatus/./node_modules/@tensorflow/tfjs-core/dist/ops/less_equal.js","webpack://biostatus/./node_modules/@tensorflow/tfjs-core/dist/ops/local_response_normalization.js","webpack://biostatus/./node_modules/@tensorflow/tfjs-core/dist/ops/log.js","webpack://biostatus/./node_modules/@tensorflow/tfjs-core/dist/ops/log1p.js","webpack://biostatus/./node_modules/@tensorflow/tfjs-core/dist/ops/log_sigmoid.js","webpack://biostatus/./node_modules/@tensorflow/tfjs-core/dist/ops/log_softmax.js","webpack://biostatus/./node_modules/@tensorflow/tfjs-core/dist/ops/log_sum_exp.js","webpack://biostatus/./node_modules/@tensorflow/tfjs-core/dist/ops/logical_and.js","webpack://biostatus/./node_modules/@tensorflow/tfjs-core/dist/ops/logical_not.js","webpack://biostatus/./node_modules/@tensorflow/tfjs-core/dist/ops/logical_or.js","webpack://biostatus/./node_modules/@tensorflow/tfjs-core/dist/ops/logical_xor.js","webpack://biostatus/./node_modules/@tensorflow/tfjs-core/dist/ops/loss_ops_utils.js","webpack://biostatus/./node_modules/@tensorflow/tfjs-core/dist/ops/mat_mul.js","webpack://biostatus/./node_modules/@tensorflow/tfjs-core/dist/ops/max.js","webpack://biostatus/./node_modules/@tensorflow/tfjs-core/dist/ops/max_pool.js","webpack://biostatus/./node_modules/@tensorflow/tfjs-core/dist/ops/maximum.js","webpack://biostatus/./node_modules/@tensorflow/tfjs-core/dist/ops/mean.js","webpack://biostatus/./node_modules/@tensorflow/tfjs-core/dist/ops/min.js","webpack://biostatus/./node_modules/@tensorflow/tfjs-core/dist/ops/minimum.js","webpack://biostatus/./node_modules/@tensorflow/tfjs-core/dist/ops/mirror_pad.js","webpack://biostatus/./node_modules/@tensorflow/tfjs-core/dist/ops/mod.js","webpack://biostatus/./node_modules/@tensorflow/tfjs-core/dist/ops/mul.js","webpack://biostatus/./node_modules/@tensorflow/tfjs-core/dist/ops/neg.js","webpack://biostatus/./node_modules/@tensorflow/tfjs-core/dist/ops/norm.js","webpack://biostatus/./node_modules/@tensorflow/tfjs-core/dist/ops/not_equal.js","webpack://biostatus/./node_modules/@tensorflow/tfjs-core/dist/ops/one_hot.js","webpack://biostatus/./node_modules/@tensorflow/tfjs-core/dist/ops/ones.js","webpack://biostatus/./node_modules/@tensorflow/tfjs-core/dist/ops/ones_like.js","webpack://biostatus/./node_modules/@tensorflow/tfjs-core/dist/ops/operation.js","webpack://biostatus/./node_modules/@tensorflow/tfjs-core/dist/ops/add_n.js","webpack://biostatus/./node_modules/@tensorflow/tfjs-core/dist/ops/avg_pool_3d.js","webpack://biostatus/./node_modules/@tensorflow/tfjs-core/dist/ops/basic_lstm_cell.js","webpack://biostatus/./node_modules/@tensorflow/tfjs-core/dist/ops/batchnorm2d.js","webpack://biostatus/./node_modules/@tensorflow/tfjs-core/dist/ops/batchnorm3d.js","webpack://biostatus/./node_modules/@tensorflow/tfjs-core/dist/ops/batchnorm4d.js","webpack://biostatus/./node_modules/@tensorflow/tfjs-core/dist/ops/bincount.js","webpack://biostatus/./node_modules/@tensorflow/tfjs-core/dist/ops/broadcast_args.js","webpack://biostatus/./node_modules/@tensorflow/tfjs-core/dist/ops/concat_1d.js","webpack://biostatus/./node_modules/@tensorflow/tfjs-core/dist/ops/concat_2d.js","webpack://biostatus/./node_modules/@tensorflow/tfjs-core/dist/ops/concat_3d.js","webpack://biostatus/./node_modules/@tensorflow/tfjs-core/dist/ops/concat_4d.js","webpack://biostatus/./node_modules/@tensorflow/tfjs-core/dist/ops/conv3d.js","webpack://biostatus/./node_modules/@tensorflow/tfjs-core/dist/ops/conv3d_transpose.js","webpack://biostatus/./node_modules/@tensorflow/tfjs-core/dist/ops/dense_bincount.js","webpack://biostatus/./node_modules/@tensorflow/tfjs-core/dist/ops/diag.js","webpack://biostatus/./node_modules/@tensorflow/tfjs-core/dist/ops/einsum.js","webpack://biostatus/./node_modules/@tensorflow/tfjs-core/dist/ops/eye.js","webpack://biostatus/./node_modules/@tensorflow/tfjs-core/dist/ops/linspace.js","webpack://biostatus/./node_modules/@tensorflow/tfjs-core/dist/ops/search_sorted.js","webpack://biostatus/./node_modules/@tensorflow/tfjs-core/dist/ops/lower_bound.js","webpack://biostatus/./node_modules/@tensorflow/tfjs-core/dist/ops/max_pool_3d.js","webpack://biostatus/./node_modules/@tensorflow/tfjs-core/dist/ops/max_pool_with_argmax.js","webpack://biostatus/./node_modules/@tensorflow/tfjs-core/dist/ops/meshgrid.js","webpack://biostatus/./node_modules/@tensorflow/tfjs-core/dist/ops/moments.js","webpack://biostatus/./node_modules/@tensorflow/tfjs-core/dist/ops/multi_rnn_cell.js","webpack://biostatus/./node_modules/@tensorflow/tfjs-core/dist/ops/multinomial.js","webpack://biostatus/./node_modules/@tensorflow/tfjs-core/dist/ops/outer_product.js","webpack://biostatus/./node_modules/@tensorflow/tfjs-core/dist/ops/pad1d.js","webpack://biostatus/./node_modules/@tensorflow/tfjs-core/dist/ops/pad2d.js","webpack://biostatus/./node_modules/@tensorflow/tfjs-core/dist/ops/pad3d.js","webpack://biostatus/./node_modules/@tensorflow/tfjs-core/dist/ops/pad4d.js","webpack://biostatus/./node_modules/@tensorflow/tfjs-core/dist/ops/ragged_gather.js","webpack://biostatus/./node_modules/@tensorflow/tfjs-core/dist/ops/ragged_tensor_to_tensor.js","webpack://biostatus/./node_modules/@tensorflow/tfjs-core/dist/ops/rand.js","webpack://biostatus/./node_modules/@tensorflow/tfjs-core/dist/ops/rand_util.js","webpack://biostatus/./node_modules/@tensorflow/tfjs-core/dist/ops/random_gamma.js","webpack://biostatus/./node_modules/@tensorflow/tfjs-core/dist/ops/random_normal.js","webpack://biostatus/./node_modules/@tensorflow/tfjs-core/dist/ops/random_standard_normal.js","webpack://biostatus/./node_modules/@tensorflow/tfjs-core/dist/ops/random_uniform.js","webpack://biostatus/./node_modules/@tensorflow/tfjs-core/dist/ops/range.js","webpack://biostatus/./node_modules/@tensorflow/tfjs-core/dist/ops/reverse_1d.js","webpack://biostatus/./node_modules/@tensorflow/tfjs-core/dist/ops/reverse_2d.js","webpack://biostatus/./node_modules/@tensorflow/tfjs-core/dist/ops/reverse_3d.js","webpack://biostatus/./node_modules/@tensorflow/tfjs-core/dist/ops/reverse_4d.js","webpack://biostatus/./node_modules/@tensorflow/tfjs-core/dist/ops/setdiff1d_async.js","webpack://biostatus/./node_modules/@tensorflow/tfjs-core/dist/ops/slice1d.js","webpack://biostatus/./node_modules/@tensorflow/tfjs-core/dist/ops/slice2d.js","webpack://biostatus/./node_modules/@tensorflow/tfjs-core/dist/ops/slice3d.js","webpack://biostatus/./node_modules/@tensorflow/tfjs-core/dist/ops/slice4d.js","webpack://biostatus/./node_modules/@tensorflow/tfjs-core/dist/ops/tensor1d.js","webpack://biostatus/./node_modules/@tensorflow/tfjs-core/dist/ops/tensor2d.js","webpack://biostatus/./node_modules/@tensorflow/tfjs-core/dist/ops/tensor4d.js","webpack://biostatus/./node_modules/@tensorflow/tfjs-core/dist/ops/tensor5d.js","webpack://biostatus/./node_modules/@tensorflow/tfjs-core/dist/ops/tensor6d.js","webpack://biostatus/./node_modules/@tensorflow/tfjs-core/dist/ops/truncated_normal.js","webpack://biostatus/./node_modules/@tensorflow/tfjs-core/dist/ops/upper_bound.js","webpack://biostatus/./node_modules/@tensorflow/tfjs-core/dist/ops/variable.js","webpack://biostatus/./node_modules/@tensorflow/tfjs-core/dist/ops/where_async.js","webpack://biostatus/./node_modules/@tensorflow/tfjs-core/dist/ops/boolean_mask.js","webpack://biostatus/./node_modules/@tensorflow/tfjs-core/dist/ops/moving_average.js","webpack://biostatus/./node_modules/@tensorflow/tfjs-core/dist/ops/scatter_nd.js","webpack://biostatus/./node_modules/@tensorflow/tfjs-core/dist/ops/sparse_to_dense.js","webpack://biostatus/./node_modules/@tensorflow/tfjs-core/dist/ops/sparse_to_dense_util.js","webpack://biostatus/./node_modules/@tensorflow/tfjs-core/dist/ops/gather_nd.js","webpack://biostatus/./node_modules/@tensorflow/tfjs-core/dist/ops/dropout.js","webpack://biostatus/./node_modules/@tensorflow/tfjs-core/dist/ops/dropout_util.js","webpack://biostatus/./node_modules/@tensorflow/tfjs-core/dist/ops/signal_ops_util.js","webpack://biostatus/./node_modules/@tensorflow/tfjs-core/dist/ops/in_top_k.js","webpack://biostatus/./node_modules/@tensorflow/tfjs-core/dist/ops/fused/conv2d.js","webpack://biostatus/./node_modules/@tensorflow/tfjs-core/dist/ops/fused/depthwise_conv2d.js","webpack://biostatus/./node_modules/@tensorflow/tfjs-core/dist/ops/fused/mat_mul.js","webpack://biostatus/./node_modules/@tensorflow/tfjs-core/dist/ops/signal/hamming_window.js","webpack://biostatus/./node_modules/@tensorflow/tfjs-core/dist/ops/signal/hann_window.js","webpack://biostatus/./node_modules/@tensorflow/tfjs-core/dist/ops/signal/frame.js","webpack://biostatus/./node_modules/@tensorflow/tfjs-core/dist/ops/signal/stft.js","webpack://biostatus/./node_modules/@tensorflow/tfjs-core/dist/ops/image/crop_and_resize.js","webpack://biostatus/./node_modules/@tensorflow/tfjs-core/dist/ops/image/flip_left_right.js","webpack://biostatus/./node_modules/@tensorflow/tfjs-core/dist/ops/image/grayscale_to_rgb.js","webpack://biostatus/./node_modules/@tensorflow/tfjs-core/dist/ops/image/rotate_with_offset.js","webpack://biostatus/./node_modules/@tensorflow/tfjs-core/dist/ops/nonmax_util.js","webpack://biostatus/./node_modules/@tensorflow/tfjs-core/dist/ops/image/non_max_suppression.js","webpack://biostatus/./node_modules/@tensorflow/tfjs-core/dist/ops/image/non_max_suppression_async.js","webpack://biostatus/./node_modules/@tensorflow/tfjs-core/dist/ops/image/non_max_suppression_with_score.js","webpack://biostatus/./node_modules/@tensorflow/tfjs-core/dist/ops/image/non_max_suppression_with_score_async.js","webpack://biostatus/./node_modules/@tensorflow/tfjs-core/dist/ops/image/non_max_suppression_padded.js","webpack://biostatus/./node_modules/@tensorflow/tfjs-core/dist/ops/image/non_max_suppression_padded_async.js","webpack://biostatus/./node_modules/@tensorflow/tfjs-core/dist/ops/image/threshold.js","webpack://biostatus/./node_modules/@tensorflow/tfjs-core/dist/ops/image/transform.js","webpack://biostatus/./node_modules/@tensorflow/tfjs-core/dist/ops/linalg/band_part.js","webpack://biostatus/./node_modules/@tensorflow/tfjs-core/dist/ops/linalg/gram_schmidt.js","webpack://biostatus/./node_modules/@tensorflow/tfjs-core/dist/ops/linalg/qr.js","webpack://biostatus/./node_modules/@tensorflow/tfjs-core/dist/ops/losses/compute_weighted_loss.js","webpack://biostatus/./node_modules/@tensorflow/tfjs-core/dist/ops/losses/absolute_difference.js","webpack://biostatus/./node_modules/@tensorflow/tfjs-core/dist/ops/losses/cosine_distance.js","webpack://biostatus/./node_modules/@tensorflow/tfjs-core/dist/ops/losses/hinge_loss.js","webpack://biostatus/./node_modules/@tensorflow/tfjs-core/dist/ops/losses/huber_loss.js","webpack://biostatus/./node_modules/@tensorflow/tfjs-core/dist/ops/losses/log_loss.js","webpack://biostatus/./node_modules/@tensorflow/tfjs-core/dist/ops/losses/mean_squared_error.js","webpack://biostatus/./node_modules/@tensorflow/tfjs-core/dist/ops/losses/sigmoid_cross_entropy.js","webpack://biostatus/./node_modules/@tensorflow/tfjs-core/dist/ops/losses/softmax_cross_entropy.js","webpack://biostatus/./node_modules/@tensorflow/tfjs-core/dist/ops/sparse/sparse_fill_empty_rows.js","webpack://biostatus/./node_modules/@tensorflow/tfjs-core/dist/ops/sparse/sparse_reshape.js","webpack://biostatus/./node_modules/@tensorflow/tfjs-core/dist/ops/sparse/sparse_segment_mean.js","webpack://biostatus/./node_modules/@tensorflow/tfjs-core/dist/ops/sparse/sparse_segment_sum.js","webpack://biostatus/./node_modules/@tensorflow/tfjs-core/dist/ops/string/string_n_grams.js","webpack://biostatus/./node_modules/@tensorflow/tfjs-core/dist/ops/string/string_split.js","webpack://biostatus/./node_modules/@tensorflow/tfjs-core/dist/ops/string/string_to_hash_bucket_fast.js","webpack://biostatus/./node_modules/@tensorflow/tfjs-core/dist/ops/ops.js","webpack://biostatus/./node_modules/@tensorflow/tfjs-core/dist/ops/pad.js","webpack://biostatus/./node_modules/@tensorflow/tfjs-core/dist/ops/pool.js","webpack://biostatus/./node_modules/@tensorflow/tfjs-core/dist/ops/pow.js","webpack://biostatus/./node_modules/@tensorflow/tfjs-core/dist/ops/prelu.js","webpack://biostatus/./node_modules/@tensorflow/tfjs-core/dist/ops/print.js","webpack://biostatus/./node_modules/@tensorflow/tfjs-core/dist/ops/prod.js","webpack://biostatus/./node_modules/@tensorflow/tfjs-core/dist/ops/real.js","webpack://biostatus/./node_modules/@tensorflow/tfjs-core/dist/ops/reciprocal.js","webpack://biostatus/./node_modules/@tensorflow/tfjs-core/dist/ops/relu.js","webpack://biostatus/./node_modules/@tensorflow/tfjs-core/dist/ops/relu6.js","webpack://biostatus/./node_modules/@tensorflow/tfjs-core/dist/ops/reshape.js","webpack://biostatus/./node_modules/@tensorflow/tfjs-core/dist/ops/reverse.js","webpack://biostatus/./node_modules/@tensorflow/tfjs-core/dist/ops/round.js","webpack://biostatus/./node_modules/@tensorflow/tfjs-core/dist/ops/rsqrt.js","webpack://biostatus/./node_modules/@tensorflow/tfjs-core/dist/ops/scalar.js","webpack://biostatus/./node_modules/@tensorflow/tfjs-core/dist/ops/scatter_nd_util.js","webpack://biostatus/./node_modules/@tensorflow/tfjs-core/dist/ops/selu.js","webpack://biostatus/./node_modules/@tensorflow/tfjs-core/dist/ops/selu_util.js","webpack://biostatus/./node_modules/@tensorflow/tfjs-core/dist/ops/separable_conv2d.js","webpack://biostatus/./node_modules/@tensorflow/tfjs-core/dist/ops/sigmoid.js","webpack://biostatus/./node_modules/@tensorflow/tfjs-core/dist/ops/sign.js","webpack://biostatus/./node_modules/@tensorflow/tfjs-core/dist/ops/sin.js","webpack://biostatus/./node_modules/@tensorflow/tfjs-core/dist/ops/sinh.js","webpack://biostatus/./node_modules/@tensorflow/tfjs-core/dist/ops/slice.js","webpack://biostatus/./node_modules/@tensorflow/tfjs-core/dist/ops/slice_util.js","webpack://biostatus/./node_modules/@tensorflow/tfjs-core/dist/ops/softmax.js","webpack://biostatus/./node_modules/@tensorflow/tfjs-core/dist/ops/softplus.js","webpack://biostatus/./node_modules/@tensorflow/tfjs-core/dist/ops/space_to_batch_nd.js","webpack://biostatus/./node_modules/@tensorflow/tfjs-core/dist/ops/spectral/fft.js","webpack://biostatus/./node_modules/@tensorflow/tfjs-core/dist/ops/spectral/ifft.js","webpack://biostatus/./node_modules/@tensorflow/tfjs-core/dist/ops/spectral/irfft.js","webpack://biostatus/./node_modules/@tensorflow/tfjs-core/dist/ops/spectral/rfft.js","webpack://biostatus/./node_modules/@tensorflow/tfjs-core/dist/ops/split.js","webpack://biostatus/./node_modules/@tensorflow/tfjs-core/dist/ops/sqrt.js","webpack://biostatus/./node_modules/@tensorflow/tfjs-core/dist/ops/square.js","webpack://biostatus/./node_modules/@tensorflow/tfjs-core/dist/ops/squared_difference.js","webpack://biostatus/./node_modules/@tensorflow/tfjs-core/dist/ops/squeeze.js","webpack://biostatus/./node_modules/@tensorflow/tfjs-core/dist/ops/stack.js","webpack://biostatus/./node_modules/@tensorflow/tfjs-core/dist/ops/step.js","webpack://biostatus/./node_modules/@tensorflow/tfjs-core/dist/ops/strided_slice.js","webpack://biostatus/./node_modules/@tensorflow/tfjs-core/dist/ops/sub.js","webpack://biostatus/./node_modules/@tensorflow/tfjs-core/dist/ops/sum.js","webpack://biostatus/./node_modules/@tensorflow/tfjs-core/dist/ops/tan.js","webpack://biostatus/./node_modules/@tensorflow/tfjs-core/dist/ops/tanh.js","webpack://biostatus/./node_modules/@tensorflow/tfjs-core/dist/ops/tensor.js","webpack://biostatus/./node_modules/@tensorflow/tfjs-core/dist/ops/tensor3d.js","webpack://biostatus/./node_modules/@tensorflow/tfjs-core/dist/ops/tensor_ops_util.js","webpack://biostatus/./node_modules/@tensorflow/tfjs-core/dist/ops/tile.js","webpack://biostatus/./node_modules/@tensorflow/tfjs-core/dist/ops/topk.js","webpack://biostatus/./node_modules/@tensorflow/tfjs-core/dist/ops/transpose.js","webpack://biostatus/./node_modules/@tensorflow/tfjs-core/dist/ops/unique.js","webpack://biostatus/./node_modules/@tensorflow/tfjs-core/dist/ops/unsorted_segment_sum.js","webpack://biostatus/./node_modules/@tensorflow/tfjs-core/dist/ops/unstack.js","webpack://biostatus/./node_modules/@tensorflow/tfjs-core/dist/ops/where.js","webpack://biostatus/./node_modules/@tensorflow/tfjs-core/dist/ops/zeros.js","webpack://biostatus/./node_modules/@tensorflow/tfjs-core/dist/ops/zeros_like.js","webpack://biostatus/./node_modules/@tensorflow/tfjs-core/dist/tensor_format.js","webpack://biostatus/./node_modules/@tensorflow/tfjs-core/dist/tensor.js","webpack://biostatus/./node_modules/@tensorflow/tfjs-core/dist/tensor_util.js","webpack://biostatus/./node_modules/@tensorflow/tfjs-core/dist/tensor_util_env.js","webpack://biostatus/./node_modules/@tensorflow/tfjs-core/dist/types.js","webpack://biostatus/./node_modules/@tensorflow/tfjs-core/dist/hash_util.js","webpack://biostatus/./node_modules/@tensorflow/tfjs-core/dist/util.js","webpack://biostatus/./node_modules/@tensorflow/tfjs-core/dist/util_base.js","webpack://biostatus/./node_modules/@tensorflow/tfjs-core/dist/gradients/Abs_grad.js","webpack://biostatus/./node_modules/@tensorflow/tfjs-core/dist/gradients/Acos_grad.js","webpack://biostatus/./node_modules/@tensorflow/tfjs-core/dist/gradients/Acosh_grad.js","webpack://biostatus/./node_modules/@tensorflow/tfjs-core/dist/gradients/Add_grad.js","webpack://biostatus/./node_modules/@tensorflow/tfjs-core/dist/gradients/AddN_grad.js","webpack://biostatus/./node_modules/@tensorflow/tfjs-core/dist/gradients/ArgMax_grad.js","webpack://biostatus/./node_modules/@tensorflow/tfjs-core/dist/gradients/ArgMin_grad.js","webpack://biostatus/./node_modules/@tensorflow/tfjs-core/dist/gradients/Asin_grad.js","webpack://biostatus/./node_modules/@tensorflow/tfjs-core/dist/gradients/Asinh_grad.js","webpack://biostatus/./node_modules/@tensorflow/tfjs-core/dist/gradients/Atan2_grad.js","webpack://biostatus/./node_modules/@tensorflow/tfjs-core/dist/gradients/Atan_grad.js","webpack://biostatus/./node_modules/@tensorflow/tfjs-core/dist/gradients/Atanh_grad.js","webpack://biostatus/./node_modules/@tensorflow/tfjs-core/dist/ops/avg_pool_3d_grad.js","webpack://biostatus/./node_modules/@tensorflow/tfjs-core/dist/gradients/AvgPool3D_grad.js","webpack://biostatus/./node_modules/@tensorflow/tfjs-core/dist/ops/avg_pool_grad.js","webpack://biostatus/./node_modules/@tensorflow/tfjs-core/dist/gradients/AvgPool_grad.js","webpack://biostatus/./node_modules/@tensorflow/tfjs-core/dist/gradients/BatchMatMul_grad.js","webpack://biostatus/./node_modules/@tensorflow/tfjs-core/dist/gradients/BatchToSpaceND_grad.js","webpack://biostatus/./node_modules/@tensorflow/tfjs-core/dist/gradients/BroadcastTo_grad.js","webpack://biostatus/./node_modules/@tensorflow/tfjs-core/dist/gradients/Cast_grad.js","webpack://biostatus/./node_modules/@tensorflow/tfjs-core/dist/gradients/Ceil_grad.js","webpack://biostatus/./node_modules/@tensorflow/tfjs-core/dist/gradients/ClipByValue_grad.js","webpack://biostatus/./node_modules/@tensorflow/tfjs-core/dist/gradients/ComplexAbs_grad.js","webpack://biostatus/./node_modules/@tensorflow/tfjs-core/dist/gradients/Concat_grad.js","webpack://biostatus/./node_modules/@tensorflow/tfjs-core/dist/gradients/Conv2D_grad.js","webpack://biostatus/./node_modules/@tensorflow/tfjs-core/dist/gradients/Conv2DBackpropInput_grad.js","webpack://biostatus/./node_modules/@tensorflow/tfjs-core/dist/ops/conv3d_backprop_filter.js","webpack://biostatus/./node_modules/@tensorflow/tfjs-core/dist/gradients/Conv3D_grad.js","webpack://biostatus/./node_modules/@tensorflow/tfjs-core/dist/gradients/Cos_grad.js","webpack://biostatus/./node_modules/@tensorflow/tfjs-core/dist/gradients/Cosh_grad.js","webpack://biostatus/./node_modules/@tensorflow/tfjs-core/dist/gradients/Cumsum_grad.js","webpack://biostatus/./node_modules/@tensorflow/tfjs-core/dist/gradients/DepthwiseConv2dNative_grad.js","webpack://biostatus/./node_modules/@tensorflow/tfjs-core/dist/gradients/Dilation2D_grad.js","webpack://biostatus/./node_modules/@tensorflow/tfjs-core/dist/gradients/Elu_grad.js","webpack://biostatus/./node_modules/@tensorflow/tfjs-core/dist/gradients/Erf_grad.js","webpack://biostatus/./node_modules/@tensorflow/tfjs-core/dist/gradients/Exp_grad.js","webpack://biostatus/./node_modules/@tensorflow/tfjs-core/dist/gradients/ExpandDims_grad.js","webpack://biostatus/./node_modules/@tensorflow/tfjs-core/dist/gradients/Expm1_grad.js","webpack://biostatus/./node_modules/@tensorflow/tfjs-core/dist/gradients/Floor_grad.js","webpack://biostatus/./node_modules/@tensorflow/tfjs-core/dist/gradients/FloorDiv_grad.js","webpack://biostatus/./node_modules/@tensorflow/tfjs-core/dist/gradients/FusedBatchNorm_grad.js","webpack://biostatus/./node_modules/@tensorflow/tfjs-core/dist/gradients/GatherV2_grad.js","webpack://biostatus/./node_modules/@tensorflow/tfjs-core/dist/gradients/GreaterEqual_grad.js","webpack://biostatus/./node_modules/@tensorflow/tfjs-core/dist/gradients/Identity_grad.js","webpack://biostatus/./node_modules/@tensorflow/tfjs-core/dist/gradients/IsFinite_grad.js","webpack://biostatus/./node_modules/@tensorflow/tfjs-core/dist/gradients/IsInf_grad.js","webpack://biostatus/./node_modules/@tensorflow/tfjs-core/dist/gradients/IsNan_grad.js","webpack://biostatus/./node_modules/@tensorflow/tfjs-core/dist/gradients/LeakyRelu_grad.js","webpack://biostatus/./node_modules/@tensorflow/tfjs-core/dist/gradients/Log1p_grad.js","webpack://biostatus/./node_modules/@tensorflow/tfjs-core/dist/gradients/Log_grad.js","webpack://biostatus/./node_modules/@tensorflow/tfjs-core/dist/gradients/LogSoftmax_grad.js","webpack://biostatus/./node_modules/@tensorflow/tfjs-core/dist/ops/local_response_normalization_backprop.js","webpack://biostatus/./node_modules/@tensorflow/tfjs-core/dist/gradients/LRN_grad.js","webpack://biostatus/./node_modules/@tensorflow/tfjs-core/dist/gradients/min_max_grad_util.js","webpack://biostatus/./node_modules/@tensorflow/tfjs-core/dist/gradients/Max_grad.js","webpack://biostatus/./node_modules/@tensorflow/tfjs-core/dist/gradients/Maximum_grad.js","webpack://biostatus/./node_modules/@tensorflow/tfjs-core/dist/ops/max_pool_3d_grad.js","webpack://biostatus/./node_modules/@tensorflow/tfjs-core/dist/gradients/MaxPool3D_grad.js","webpack://biostatus/./node_modules/@tensorflow/tfjs-core/dist/ops/max_pool_grad.js","webpack://biostatus/./node_modules/@tensorflow/tfjs-core/dist/gradients/MaxPool_grad.js","webpack://biostatus/./node_modules/@tensorflow/tfjs-core/dist/gradients/Mean_grad.js","webpack://biostatus/./node_modules/@tensorflow/tfjs-core/dist/gradients/Min_grad.js","webpack://biostatus/./node_modules/@tensorflow/tfjs-core/dist/gradients/Minimum_grad.js","webpack://biostatus/./node_modules/@tensorflow/tfjs-core/dist/gradients/MirrorPad_grad.js","webpack://biostatus/./node_modules/@tensorflow/tfjs-core/dist/gradients/Mod_grad.js","webpack://biostatus/./node_modules/@tensorflow/tfjs-core/dist/gradients/Multiply_grad.js","webpack://biostatus/./node_modules/@tensorflow/tfjs-core/dist/gradients/Neg_grad.js","webpack://biostatus/./node_modules/@tensorflow/tfjs-core/dist/gradients/OneHot_grad.js","webpack://biostatus/./node_modules/@tensorflow/tfjs-core/dist/gradients/OnesLike_grad.js","webpack://biostatus/./node_modules/@tensorflow/tfjs-core/dist/gradients/Pack_grad.js","webpack://biostatus/./node_modules/@tensorflow/tfjs-core/dist/gradients/PadV2_grad.js","webpack://biostatus/./node_modules/@tensorflow/tfjs-core/dist/gradients/Pow_grad.js","webpack://biostatus/./node_modules/@tensorflow/tfjs-core/dist/gradients/Prelu_grad.js","webpack://biostatus/./node_modules/@tensorflow/tfjs-core/dist/gradients/Prod_grad.js","webpack://biostatus/./node_modules/@tensorflow/tfjs-core/dist/gradients/RealDiv_grad.js","webpack://biostatus/./node_modules/@tensorflow/tfjs-core/dist/gradients/Reciprocal_grad.js","webpack://biostatus/./node_modules/@tensorflow/tfjs-core/dist/gradients/Relu6_grad.js","webpack://biostatus/./node_modules/@tensorflow/tfjs-core/dist/gradients/Relu_grad.js","webpack://biostatus/./node_modules/@tensorflow/tfjs-core/dist/gradients/Reshape_grad.js","webpack://biostatus/./node_modules/@tensorflow/tfjs-core/dist/gradients/ResizeBilinear_grad.js","webpack://biostatus/./node_modules/@tensorflow/tfjs-core/dist/gradients/ResizeNearestNeighbor_grad.js","webpack://biostatus/./node_modules/@tensorflow/tfjs-core/dist/gradients/Reverse_grad.js","webpack://biostatus/./node_modules/@tensorflow/tfjs-core/dist/gradients/Round_grad.js","webpack://biostatus/./node_modules/@tensorflow/tfjs-core/dist/gradients/Rsqrt_grad.js","webpack://biostatus/./node_modules/@tensorflow/tfjs-core/dist/gradients/Select_grad.js","webpack://biostatus/./node_modules/@tensorflow/tfjs-core/dist/gradients/Selu_grad.js","webpack://biostatus/./node_modules/@tensorflow/tfjs-core/dist/gradients/Sigmoid_grad.js","webpack://biostatus/./node_modules/@tensorflow/tfjs-core/dist/gradients/Sign_grad.js","webpack://biostatus/./node_modules/@tensorflow/tfjs-core/dist/gradients/Sin_grad.js","webpack://biostatus/./node_modules/@tensorflow/tfjs-core/dist/gradients/Sinh_grad.js","webpack://biostatus/./node_modules/@tensorflow/tfjs-core/dist/gradients/Slice_grad.js","webpack://biostatus/./node_modules/@tensorflow/tfjs-core/dist/gradients/Softmax_grad.js","webpack://biostatus/./node_modules/@tensorflow/tfjs-core/dist/gradients/Softplus_grad.js","webpack://biostatus/./node_modules/@tensorflow/tfjs-core/dist/gradients/SpaceToBatchND_grad.js","webpack://biostatus/./node_modules/@tensorflow/tfjs-core/dist/gradients/SplitV_grad.js","webpack://biostatus/./node_modules/@tensorflow/tfjs-core/dist/gradients/Sqrt_grad.js","webpack://biostatus/./node_modules/@tensorflow/tfjs-core/dist/gradients/Square_grad.js","webpack://biostatus/./node_modules/@tensorflow/tfjs-core/dist/gradients/SquaredDifference_grad.js","webpack://biostatus/./node_modules/@tensorflow/tfjs-core/dist/gradients/Step_grad.js","webpack://biostatus/./node_modules/@tensorflow/tfjs-core/dist/gradients/Sub_grad.js","webpack://biostatus/./node_modules/@tensorflow/tfjs-core/dist/gradients/Sum_grad.js","webpack://biostatus/./node_modules/@tensorflow/tfjs-core/dist/gradients/Tan_grad.js","webpack://biostatus/./node_modules/@tensorflow/tfjs-core/dist/gradients/Tanh_grad.js","webpack://biostatus/./node_modules/@tensorflow/tfjs-core/dist/gradients/Tile_grad.js","webpack://biostatus/./node_modules/@tensorflow/tfjs-core/dist/gradients/Transpose_grad.js","webpack://biostatus/./node_modules/@tensorflow/tfjs-core/dist/gradients/Unpack_grad.js","webpack://biostatus/./node_modules/@tensorflow/tfjs-core/dist/gradients/UnsortedSegmentSum_grad.js","webpack://biostatus/./node_modules/@tensorflow/tfjs-core/dist/gradients/ZerosLike_grad.js","webpack://biostatus/./node_modules/@tensorflow/tfjs-core/dist/register_all_gradients.js","webpack://biostatus/./node_modules/@tensorflow/tfjs-core/dist/public/chained_ops/abs.js","webpack://biostatus/./node_modules/@tensorflow/tfjs-core/dist/public/chained_ops/acos.js","webpack://biostatus/./node_modules/@tensorflow/tfjs-core/dist/public/chained_ops/acosh.js","webpack://biostatus/./node_modules/@tensorflow/tfjs-core/dist/public/chained_ops/add.js","webpack://biostatus/./node_modules/@tensorflow/tfjs-core/dist/public/chained_ops/all.js","webpack://biostatus/./node_modules/@tensorflow/tfjs-core/dist/public/chained_ops/any.js","webpack://biostatus/./node_modules/@tensorflow/tfjs-core/dist/public/chained_ops/arg_max.js","webpack://biostatus/./node_modules/@tensorflow/tfjs-core/dist/public/chained_ops/arg_min.js","webpack://biostatus/./node_modules/@tensorflow/tfjs-core/dist/public/chained_ops/as_scalar.js","webpack://biostatus/./node_modules/@tensorflow/tfjs-core/dist/public/chained_ops/as_type.js","webpack://biostatus/./node_modules/@tensorflow/tfjs-core/dist/public/chained_ops/as1d.js","webpack://biostatus/./node_modules/@tensorflow/tfjs-core/dist/public/chained_ops/as2d.js","webpack://biostatus/./node_modules/@tensorflow/tfjs-core/dist/public/chained_ops/as3d.js","webpack://biostatus/./node_modules/@tensorflow/tfjs-core/dist/public/chained_ops/as4d.js","webpack://biostatus/./node_modules/@tensorflow/tfjs-core/dist/public/chained_ops/as5d.js","webpack://biostatus/./node_modules/@tensorflow/tfjs-core/dist/public/chained_ops/asin.js","webpack://biostatus/./node_modules/@tensorflow/tfjs-core/dist/public/chained_ops/asinh.js","webpack://biostatus/./node_modules/@tensorflow/tfjs-core/dist/public/chained_ops/atan.js","webpack://biostatus/./node_modules/@tensorflow/tfjs-core/dist/public/chained_ops/atan2.js","webpack://biostatus/./node_modules/@tensorflow/tfjs-core/dist/public/chained_ops/atanh.js","webpack://biostatus/./node_modules/@tensorflow/tfjs-core/dist/public/chained_ops/avg_pool.js","webpack://biostatus/./node_modules/@tensorflow/tfjs-core/dist/public/chained_ops/batch_to_space_nd.js","webpack://biostatus/./node_modules/@tensorflow/tfjs-core/dist/public/chained_ops/batchnorm.js","webpack://biostatus/./node_modules/@tensorflow/tfjs-core/dist/public/chained_ops/broadcast_to.js","webpack://biostatus/./node_modules/@tensorflow/tfjs-core/dist/public/chained_ops/cast.js","webpack://biostatus/./node_modules/@tensorflow/tfjs-core/dist/public/chained_ops/ceil.js","webpack://biostatus/./node_modules/@tensorflow/tfjs-core/dist/public/chained_ops/clip_by_value.js","webpack://biostatus/./node_modules/@tensorflow/tfjs-core/dist/public/chained_ops/concat.js","webpack://biostatus/./node_modules/@tensorflow/tfjs-core/dist/public/chained_ops/conv1d.js","webpack://biostatus/./node_modules/@tensorflow/tfjs-core/dist/public/chained_ops/conv2d_transpose.js","webpack://biostatus/./node_modules/@tensorflow/tfjs-core/dist/public/chained_ops/conv2d.js","webpack://biostatus/./node_modules/@tensorflow/tfjs-core/dist/public/chained_ops/cos.js","webpack://biostatus/./node_modules/@tensorflow/tfjs-core/dist/public/chained_ops/cosh.js","webpack://biostatus/./node_modules/@tensorflow/tfjs-core/dist/public/chained_ops/cumprod.js","webpack://biostatus/./node_modules/@tensorflow/tfjs-core/dist/public/chained_ops/cumsum.js","webpack://biostatus/./node_modules/@tensorflow/tfjs-core/dist/public/chained_ops/depth_to_space.js","webpack://biostatus/./node_modules/@tensorflow/tfjs-core/dist/public/chained_ops/depthwise_conv2d.js","webpack://biostatus/./node_modules/@tensorflow/tfjs-core/dist/public/chained_ops/dilation2d.js","webpack://biostatus/./node_modules/@tensorflow/tfjs-core/dist/public/chained_ops/div_no_nan.js","webpack://biostatus/./node_modules/@tensorflow/tfjs-core/dist/public/chained_ops/div.js","webpack://biostatus/./node_modules/@tensorflow/tfjs-core/dist/public/chained_ops/dot.js","webpack://biostatus/./node_modules/@tensorflow/tfjs-core/dist/public/chained_ops/elu.js","webpack://biostatus/./node_modules/@tensorflow/tfjs-core/dist/public/chained_ops/equal.js","webpack://biostatus/./node_modules/@tensorflow/tfjs-core/dist/public/chained_ops/erf.js","webpack://biostatus/./node_modules/@tensorflow/tfjs-core/dist/public/chained_ops/euclidean_norm.js","webpack://biostatus/./node_modules/@tensorflow/tfjs-core/dist/public/chained_ops/exp.js","webpack://biostatus/./node_modules/@tensorflow/tfjs-core/dist/public/chained_ops/expand_dims.js","webpack://biostatus/./node_modules/@tensorflow/tfjs-core/dist/public/chained_ops/expm1.js","webpack://biostatus/./node_modules/@tensorflow/tfjs-core/dist/public/chained_ops/fft.js","webpack://biostatus/./node_modules/@tensorflow/tfjs-core/dist/public/chained_ops/flatten.js","webpack://biostatus/./node_modules/@tensorflow/tfjs-core/dist/public/chained_ops/floor.js","webpack://biostatus/./node_modules/@tensorflow/tfjs-core/dist/public/chained_ops/floorDiv.js","webpack://biostatus/./node_modules/@tensorflow/tfjs-core/dist/public/chained_ops/gather.js","webpack://biostatus/./node_modules/@tensorflow/tfjs-core/dist/public/chained_ops/greater_equal.js","webpack://biostatus/./node_modules/@tensorflow/tfjs-core/dist/public/chained_ops/greater.js","webpack://biostatus/./node_modules/@tensorflow/tfjs-core/dist/public/chained_ops/ifft.js","webpack://biostatus/./node_modules/@tensorflow/tfjs-core/dist/public/chained_ops/irfft.js","webpack://biostatus/./node_modules/@tensorflow/tfjs-core/dist/public/chained_ops/is_finite.js","webpack://biostatus/./node_modules/@tensorflow/tfjs-core/dist/public/chained_ops/is_inf.js","webpack://biostatus/./node_modules/@tensorflow/tfjs-core/dist/public/chained_ops/is_nan.js","webpack://biostatus/./node_modules/@tensorflow/tfjs-core/dist/public/chained_ops/leaky_relu.js","webpack://biostatus/./node_modules/@tensorflow/tfjs-core/dist/public/chained_ops/less_equal.js","webpack://biostatus/./node_modules/@tensorflow/tfjs-core/dist/public/chained_ops/less.js","webpack://biostatus/./node_modules/@tensorflow/tfjs-core/dist/public/chained_ops/local_response_normalization.js","webpack://biostatus/./node_modules/@tensorflow/tfjs-core/dist/public/chained_ops/log_sigmoid.js","webpack://biostatus/./node_modules/@tensorflow/tfjs-core/dist/public/chained_ops/log_softmax.js","webpack://biostatus/./node_modules/@tensorflow/tfjs-core/dist/public/chained_ops/log_sum_exp.js","webpack://biostatus/./node_modules/@tensorflow/tfjs-core/dist/public/chained_ops/log.js","webpack://biostatus/./node_modules/@tensorflow/tfjs-core/dist/public/chained_ops/log1p.js","webpack://biostatus/./node_modules/@tensorflow/tfjs-core/dist/public/chained_ops/logical_and.js","webpack://biostatus/./node_modules/@tensorflow/tfjs-core/dist/public/chained_ops/logical_not.js","webpack://biostatus/./node_modules/@tensorflow/tfjs-core/dist/public/chained_ops/logical_or.js","webpack://biostatus/./node_modules/@tensorflow/tfjs-core/dist/public/chained_ops/logical_xor.js","webpack://biostatus/./node_modules/@tensorflow/tfjs-core/dist/public/chained_ops/mat_mul.js","webpack://biostatus/./node_modules/@tensorflow/tfjs-core/dist/public/chained_ops/max_pool.js","webpack://biostatus/./node_modules/@tensorflow/tfjs-core/dist/public/chained_ops/max.js","webpack://biostatus/./node_modules/@tensorflow/tfjs-core/dist/public/chained_ops/maximum.js","webpack://biostatus/./node_modules/@tensorflow/tfjs-core/dist/public/chained_ops/mean.js","webpack://biostatus/./node_modules/@tensorflow/tfjs-core/dist/public/chained_ops/min.js","webpack://biostatus/./node_modules/@tensorflow/tfjs-core/dist/public/chained_ops/minimum.js","webpack://biostatus/./node_modules/@tensorflow/tfjs-core/dist/public/chained_ops/mirror_pad.js","webpack://biostatus/./node_modules/@tensorflow/tfjs-core/dist/public/chained_ops/mod.js","webpack://biostatus/./node_modules/@tensorflow/tfjs-core/dist/public/chained_ops/mul.js","webpack://biostatus/./node_modules/@tensorflow/tfjs-core/dist/public/chained_ops/neg.js","webpack://biostatus/./node_modules/@tensorflow/tfjs-core/dist/public/chained_ops/norm.js","webpack://biostatus/./node_modules/@tensorflow/tfjs-core/dist/public/chained_ops/not_equal.js","webpack://biostatus/./node_modules/@tensorflow/tfjs-core/dist/public/chained_ops/one_hot.js","webpack://biostatus/./node_modules/@tensorflow/tfjs-core/dist/public/chained_ops/ones_like.js","webpack://biostatus/./node_modules/@tensorflow/tfjs-core/dist/public/chained_ops/pad.js","webpack://biostatus/./node_modules/@tensorflow/tfjs-core/dist/public/chained_ops/pool.js","webpack://biostatus/./node_modules/@tensorflow/tfjs-core/dist/public/chained_ops/pow.js","webpack://biostatus/./node_modules/@tensorflow/tfjs-core/dist/public/chained_ops/prelu.js","webpack://biostatus/./node_modules/@tensorflow/tfjs-core/dist/public/chained_ops/prod.js","webpack://biostatus/./node_modules/@tensorflow/tfjs-core/dist/public/chained_ops/reciprocal.js","webpack://biostatus/./node_modules/@tensorflow/tfjs-core/dist/public/chained_ops/relu.js","webpack://biostatus/./node_modules/@tensorflow/tfjs-core/dist/public/chained_ops/relu6.js","webpack://biostatus/./node_modules/@tensorflow/tfjs-core/dist/public/chained_ops/reshape_as.js","webpack://biostatus/./node_modules/@tensorflow/tfjs-core/dist/public/chained_ops/reshape.js","webpack://biostatus/./node_modules/@tensorflow/tfjs-core/dist/public/chained_ops/resize_bilinear.js","webpack://biostatus/./node_modules/@tensorflow/tfjs-core/dist/public/chained_ops/resize_nearest_neighbor.js","webpack://biostatus/./node_modules/@tensorflow/tfjs-core/dist/public/chained_ops/reverse.js","webpack://biostatus/./node_modules/@tensorflow/tfjs-core/dist/public/chained_ops/rfft.js","webpack://biostatus/./node_modules/@tensorflow/tfjs-core/dist/public/chained_ops/round.js","webpack://biostatus/./node_modules/@tensorflow/tfjs-core/dist/public/chained_ops/rsqrt.js","webpack://biostatus/./node_modules/@tensorflow/tfjs-core/dist/public/chained_ops/selu.js","webpack://biostatus/./node_modules/@tensorflow/tfjs-core/dist/public/chained_ops/separable_conv2d.js","webpack://biostatus/./node_modules/@tensorflow/tfjs-core/dist/public/chained_ops/sigmoid.js","webpack://biostatus/./node_modules/@tensorflow/tfjs-core/dist/public/chained_ops/sign.js","webpack://biostatus/./node_modules/@tensorflow/tfjs-core/dist/public/chained_ops/sin.js","webpack://biostatus/./node_modules/@tensorflow/tfjs-core/dist/public/chained_ops/sinh.js","webpack://biostatus/./node_modules/@tensorflow/tfjs-core/dist/public/chained_ops/slice.js","webpack://biostatus/./node_modules/@tensorflow/tfjs-core/dist/public/chained_ops/softmax.js","webpack://biostatus/./node_modules/@tensorflow/tfjs-core/dist/public/chained_ops/softplus.js","webpack://biostatus/./node_modules/@tensorflow/tfjs-core/dist/public/chained_ops/space_to_batch_nd.js","webpack://biostatus/./node_modules/@tensorflow/tfjs-core/dist/public/chained_ops/split.js","webpack://biostatus/./node_modules/@tensorflow/tfjs-core/dist/public/chained_ops/sqrt.js","webpack://biostatus/./node_modules/@tensorflow/tfjs-core/dist/public/chained_ops/square.js","webpack://biostatus/./node_modules/@tensorflow/tfjs-core/dist/public/chained_ops/squared_difference.js","webpack://biostatus/./node_modules/@tensorflow/tfjs-core/dist/public/chained_ops/squeeze.js","webpack://biostatus/./node_modules/@tensorflow/tfjs-core/dist/public/chained_ops/stack.js","webpack://biostatus/./node_modules/@tensorflow/tfjs-core/dist/public/chained_ops/step.js","webpack://biostatus/./node_modules/@tensorflow/tfjs-core/dist/public/chained_ops/strided_slice.js","webpack://biostatus/./node_modules/@tensorflow/tfjs-core/dist/public/chained_ops/sub.js","webpack://biostatus/./node_modules/@tensorflow/tfjs-core/dist/public/chained_ops/sum.js","webpack://biostatus/./node_modules/@tensorflow/tfjs-core/dist/public/chained_ops/tan.js","webpack://biostatus/./node_modules/@tensorflow/tfjs-core/dist/public/chained_ops/tanh.js","webpack://biostatus/./node_modules/@tensorflow/tfjs-core/dist/public/chained_ops/tile.js","webpack://biostatus/./node_modules/@tensorflow/tfjs-core/dist/public/chained_ops/to_bool.js","webpack://biostatus/./node_modules/@tensorflow/tfjs-core/dist/public/chained_ops/to_float.js","webpack://biostatus/./node_modules/@tensorflow/tfjs-core/dist/public/chained_ops/to_int.js","webpack://biostatus/./node_modules/@tensorflow/tfjs-core/dist/public/chained_ops/topk.js","webpack://biostatus/./node_modules/@tensorflow/tfjs-core/dist/public/chained_ops/transpose.js","webpack://biostatus/./node_modules/@tensorflow/tfjs-core/dist/public/chained_ops/unique.js","webpack://biostatus/./node_modules/@tensorflow/tfjs-core/dist/public/chained_ops/unsorted_segment_sum.js","webpack://biostatus/./node_modules/@tensorflow/tfjs-core/dist/public/chained_ops/unstack.js","webpack://biostatus/./node_modules/@tensorflow/tfjs-core/dist/public/chained_ops/where.js","webpack://biostatus/./node_modules/@tensorflow/tfjs-core/dist/public/chained_ops/zeros_like.js","webpack://biostatus/./node_modules/@tensorflow/tfjs-layers/dist/errors.js","webpack://biostatus/./node_modules/@tensorflow/tfjs-layers/dist/utils/executor_utils.js","webpack://biostatus/./node_modules/@tensorflow/tfjs-layers/dist/utils/generic_utils.js","webpack://biostatus/./node_modules/@tensorflow/tfjs-layers/dist/backend/state.js","webpack://biostatus/./node_modules/@tensorflow/tfjs-layers/dist/keras_format/common.js","webpack://biostatus/./node_modules/@tensorflow/tfjs-layers/dist/common.js","webpack://biostatus/./node_modules/@tensorflow/tfjs-layers/dist/utils/math_utils.js","webpack://biostatus/./node_modules/@tensorflow/tfjs-layers/dist/backend/common.js","webpack://biostatus/./node_modules/@tensorflow/tfjs-layers/dist/backend/tfjs_backend.js","webpack://biostatus/./node_modules/@tensorflow/tfjs-layers/dist/keras_format/initializer_config.js","webpack://biostatus/./node_modules/@tensorflow/tfjs-layers/dist/initializers.js","webpack://biostatus/./node_modules/@tensorflow/tfjs-layers/dist/utils/types_utils.js","webpack://biostatus/./node_modules/@tensorflow/tfjs-layers/dist/utils/variable_utils.js","webpack://biostatus/./node_modules/@tensorflow/tfjs-layers/dist/variables.js","webpack://biostatus/./node_modules/@tensorflow/tfjs-layers/dist/engine/topology.js","webpack://biostatus/./node_modules/@tensorflow/tfjs-layers/dist/engine/input_layer.js","webpack://biostatus/./node_modules/@tensorflow/tfjs-layers/dist/engine/executor.js","webpack://biostatus/./node_modules/@tensorflow/tfjs-layers/dist/constraints.js","webpack://biostatus/./node_modules/@tensorflow/tfjs-layers/dist/flags_layers.js","webpack://biostatus/./node_modules/@tensorflow/tfjs-layers/dist/exports_constraints.js","webpack://biostatus/./node_modules/@tensorflow/tfjs-layers/dist/exports_initializers.js","webpack://biostatus/./node_modules/@tensorflow/tfjs-layers/dist/logs.js","webpack://biostatus/./node_modules/@tensorflow/tfjs-layers/dist/base_callbacks.js","webpack://biostatus/./node_modules/@tensorflow/tfjs-layers/dist/layers/serialization.js","webpack://biostatus/./node_modules/@tensorflow/tfjs-layers/dist/losses.js","webpack://biostatus/./node_modules/@tensorflow/tfjs-layers/dist/metrics.js","webpack://biostatus/./node_modules/@tensorflow/tfjs-layers/dist/user_defined_metadata.js","webpack://biostatus/./node_modules/@tensorflow/tfjs-layers/dist/utils/layer_utils.js","webpack://biostatus/./node_modules/@tensorflow/tfjs-layers/dist/utils/serialization_utils.js","webpack://biostatus/./node_modules/@tensorflow/tfjs-layers/dist/version.js","webpack://biostatus/./node_modules/@tensorflow/tfjs-layers/dist/engine/container.js","webpack://biostatus/./node_modules/@tensorflow/tfjs-layers/dist/engine/training_utils.js","webpack://biostatus/./node_modules/@tensorflow/tfjs-layers/dist/engine/training_dataset.js","webpack://biostatus/./node_modules/@tensorflow/tfjs-layers/dist/engine/training_tensors.js","webpack://biostatus/./node_modules/@tensorflow/tfjs-layers/dist/engine/training.js","webpack://biostatus/./node_modules/@tensorflow/tfjs-layers/dist/optimizers.js","webpack://biostatus/./node_modules/@tensorflow/tfjs-layers/dist/models.js","webpack://biostatus/./node_modules/@tensorflow/tfjs-layers/dist/exports.js","webpack://biostatus/./node_modules/@tensorflow/tfjs-layers/dist/activations.js","webpack://biostatus/./node_modules/@tensorflow/tfjs-layers/dist/regularizers.js","webpack://biostatus/./node_modules/@tensorflow/tfjs-layers/dist/layers/advanced_activations.js","webpack://biostatus/./node_modules/@tensorflow/tfjs-layers/dist/utils/conv_utils.js","webpack://biostatus/./node_modules/@tensorflow/tfjs-layers/dist/layers/convolutional.js","webpack://biostatus/./node_modules/@tensorflow/tfjs-layers/dist/layers/convolutional_depthwise.js","webpack://biostatus/./node_modules/@tensorflow/tfjs-layers/dist/layers/recurrent.js","webpack://biostatus/./node_modules/@tensorflow/tfjs-layers/dist/layers/convolutional_recurrent.js","webpack://biostatus/./node_modules/@tensorflow/tfjs-layers/dist/layers/core.js","webpack://biostatus/./node_modules/@tensorflow/tfjs-layers/dist/layers/embeddings.js","webpack://biostatus/./node_modules/@tensorflow/tfjs-layers/dist/layers/merge.js","webpack://biostatus/./node_modules/@tensorflow/tfjs-layers/dist/layers/noise.js","webpack://biostatus/./node_modules/@tensorflow/tfjs-layers/dist/layers/normalization.js","webpack://biostatus/./node_modules/@tensorflow/tfjs-layers/dist/layers/padding.js","webpack://biostatus/./node_modules/@tensorflow/tfjs-layers/dist/layers/pooling.js","webpack://biostatus/./node_modules/@tensorflow/tfjs-layers/dist/layers/wrappers.js","webpack://biostatus/./node_modules/@tensorflow/tfjs-layers/dist/layers/preprocessing/image_preprocessing.js","webpack://biostatus/./node_modules/@tensorflow/tfjs-layers/dist/exports_layers.js","webpack://biostatus/./node_modules/@tensorflow/tfjs-layers/dist/exports_metrics.js","webpack://biostatus/./node_modules/@tensorflow/tfjs-layers/dist/exports_regularizers.js","webpack://biostatus/./node_modules/@tensorflow/tfjs-layers/dist/callbacks.js","webpack://biostatus/./node_modules/@tensorflow/tfjs-data/dist/iterators/lazy_iterator.js","webpack://biostatus/./node_modules/@tensorflow/tfjs-data/dist/util/deep_map.js","webpack://biostatus/./node_modules/@tensorflow/tfjs-data/dist/util/deep_clone.js","webpack://biostatus/./node_modules/@tensorflow/tfjs-data/dist/util/ring_buffer.js","webpack://biostatus/./node_modules/@tensorflow/tfjs-data/dist/util/growing_ring_buffer.js","webpack://biostatus/./node_modules/@tensorflow/tfjs-data/dist/dataset.js","webpack://biostatus/./node_modules/@tensorflow/tfjs-data/dist/datasets/text_line_dataset.js","webpack://biostatus/./node_modules/@tensorflow/tfjs-data/dist/datasets/csv_dataset.js","webpack://biostatus/./node_modules/@tensorflow/tfjs-data/dist/iterators/microphone_iterator.js","webpack://biostatus/./node_modules/@tensorflow/tfjs-data/dist/iterators/webcam_iterator.js","webpack://biostatus/./node_modules/@tensorflow/tfjs-data/dist/datasource.js","webpack://biostatus/./node_modules/@tensorflow/tfjs-data/dist/iterators/string_iterator.js","webpack://biostatus/./node_modules/@tensorflow/tfjs-data/dist/iterators/byte_chunk_iterator.js","webpack://biostatus/./node_modules/@tensorflow/tfjs-data/dist/iterators/file_chunk_iterator.js","webpack://biostatus/./node_modules/@tensorflow/tfjs-data/dist/iterators/url_chunk_iterator.js","webpack://biostatus/./node_modules/@tensorflow/tfjs-data/dist/util/source_util.js","webpack://biostatus/./node_modules/@tensorflow/tfjs-data/dist/sources/file_data_source.js","webpack://biostatus/./node_modules/@tensorflow/tfjs-data/dist/sources/url_data_source.js","webpack://biostatus/./node_modules/@tensorflow/tfjs-data/dist/readers.js","webpack://biostatus/./node_modules/@tensorflow/tfjs-data/dist/version.js","webpack://biostatus/./node_modules/@tensorflow/tfjs-backend-cpu/dist/cpu_util.js","webpack://biostatus/./node_modules/@tensorflow/tfjs-backend-cpu/dist/backend_cpu.js","webpack://biostatus/./node_modules/@tensorflow/tfjs-backend-cpu/dist/utils/unary_utils.js","webpack://biostatus/./node_modules/@tensorflow/tfjs-backend-cpu/dist/base.js","webpack://biostatus/./node_modules/@tensorflow/tfjs-backend-cpu/dist/kernels/Elu.js","webpack://biostatus/./node_modules/@tensorflow/tfjs-backend-cpu/dist/kernels/Identity.js","webpack://biostatus/./node_modules/@tensorflow/tfjs-backend-cpu/dist/kernels/LeakyRelu.js","webpack://biostatus/./node_modules/@tensorflow/tfjs-backend-cpu/dist/utils/binary_impl.js","webpack://biostatus/./node_modules/@tensorflow/tfjs-backend-cpu/dist/kernels/Prelu.js","webpack://biostatus/./node_modules/@tensorflow/tfjs-backend-cpu/dist/kernels/Relu.js","webpack://biostatus/./node_modules/@tensorflow/tfjs-backend-cpu/dist/kernels/Relu6.js","webpack://biostatus/./node_modules/@tensorflow/tfjs-backend-cpu/dist/utils/unary_impl.js","webpack://biostatus/./node_modules/@tensorflow/tfjs-backend-cpu/dist/kernels/Sigmoid.js","webpack://biostatus/./node_modules/@tensorflow/tfjs-backend-cpu/dist/utils/fused_utils.js","webpack://biostatus/./node_modules/@tensorflow/tfjs-backend-cpu/dist/kernels/Complex.js","webpack://biostatus/./node_modules/@tensorflow/tfjs-backend-cpu/dist/utils/zeros_impl.js","webpack://biostatus/./node_modules/@tensorflow/tfjs-backend-cpu/dist/kernels/Real.js","webpack://biostatus/./node_modules/@tensorflow/tfjs-backend-cpu/dist/kernels/Cast.js","webpack://biostatus/./node_modules/@tensorflow/tfjs-backend-cpu/dist/utils/binary_utils.js","webpack://biostatus/./node_modules/@tensorflow/tfjs-backend-cpu/dist/kernels/Add.js","webpack://biostatus/./node_modules/@tensorflow/tfjs-backend-cpu/dist/kernels/Reshape.js","webpack://biostatus/./node_modules/@tensorflow/tfjs-backend-cpu/dist/kernels/BatchMatMul.js","webpack://biostatus/./node_modules/@tensorflow/tfjs-backend-cpu/dist/kernels/_FusedMatMul.js","webpack://biostatus/./node_modules/@tensorflow/tfjs-backend-cpu/dist/kernels/Abs.js","webpack://biostatus/./node_modules/@tensorflow/tfjs-backend-cpu/dist/kernels/Acos.js","webpack://biostatus/./node_modules/@tensorflow/tfjs-backend-cpu/dist/kernels/Acosh.js","webpack://biostatus/./node_modules/@tensorflow/tfjs-backend-cpu/dist/kernels/AddN.js","webpack://biostatus/./node_modules/@tensorflow/tfjs-backend-cpu/dist/kernels/Transpose_impl.js","webpack://biostatus/./node_modules/@tensorflow/tfjs-backend-cpu/dist/kernels/Transpose.js","webpack://biostatus/./node_modules/@tensorflow/tfjs-backend-cpu/dist/kernels/All.js","webpack://biostatus/./node_modules/@tensorflow/tfjs-backend-cpu/dist/kernels/Any.js","webpack://biostatus/./node_modules/@tensorflow/tfjs-backend-cpu/dist/kernels/ArgMax.js","webpack://biostatus/./node_modules/@tensorflow/tfjs-backend-cpu/dist/kernels/ArgMin.js","webpack://biostatus/./node_modules/@tensorflow/tfjs-backend-cpu/dist/kernels/Asin.js","webpack://biostatus/./node_modules/@tensorflow/tfjs-backend-cpu/dist/kernels/Asinh.js","webpack://biostatus/./node_modules/@tensorflow/tfjs-backend-cpu/dist/kernels/Atan.js","webpack://biostatus/./node_modules/@tensorflow/tfjs-backend-cpu/dist/kernels/Atan2.js","webpack://biostatus/./node_modules/@tensorflow/tfjs-backend-cpu/dist/kernels/Atanh.js","webpack://biostatus/./node_modules/@tensorflow/tfjs-backend-cpu/dist/utils/pool_utils.js","webpack://biostatus/./node_modules/@tensorflow/tfjs-backend-cpu/dist/kernels/AvgPool.js","webpack://biostatus/./node_modules/@tensorflow/tfjs-backend-cpu/dist/kernels/AvgPool3D.js","webpack://biostatus/./node_modules/@tensorflow/tfjs-backend-cpu/dist/kernels/AvgPool3DGrad.js","webpack://biostatus/./node_modules/@tensorflow/tfjs-backend-cpu/dist/kernels/AvgPoolGrad.js","webpack://biostatus/./node_modules/@tensorflow/tfjs-backend-cpu/dist/kernels/BatchNorm.js","webpack://biostatus/./node_modules/@tensorflow/tfjs-backend-cpu/dist/kernels/Slice.js","webpack://biostatus/./node_modules/@tensorflow/tfjs-backend-cpu/dist/kernels/BatchToSpaceND.js","webpack://biostatus/./node_modules/@tensorflow/tfjs-backend-cpu/dist/kernels/Bincount_impl.js","webpack://biostatus/./node_modules/@tensorflow/tfjs-backend-cpu/dist/kernels/Bincount.js","webpack://biostatus/./node_modules/@tensorflow/tfjs-backend-cpu/dist/kernels/BroadcastArgs.js","webpack://biostatus/./node_modules/@tensorflow/tfjs-backend-cpu/dist/kernels/Ceil.js","webpack://biostatus/./node_modules/@tensorflow/tfjs-backend-cpu/dist/kernels/ClipByValue.js","webpack://biostatus/./node_modules/@tensorflow/tfjs-backend-cpu/dist/kernels/ComplexAbs.js","webpack://biostatus/./node_modules/@tensorflow/tfjs-backend-cpu/dist/kernels/Concat_impl.js","webpack://biostatus/./node_modules/@tensorflow/tfjs-backend-cpu/dist/kernels/Imag.js","webpack://biostatus/./node_modules/@tensorflow/tfjs-backend-cpu/dist/kernels/Concat.js","webpack://biostatus/./node_modules/@tensorflow/tfjs-backend-cpu/dist/kernels/Conv2D.js","webpack://biostatus/./node_modules/@tensorflow/tfjs-backend-cpu/dist/kernels/Conv2DBackpropFilter.js","webpack://biostatus/./node_modules/@tensorflow/tfjs-backend-cpu/dist/kernels/Conv2DBackpropInput.js","webpack://biostatus/./node_modules/@tensorflow/tfjs-backend-cpu/dist/kernels/Conv3D.js","webpack://biostatus/./node_modules/@tensorflow/tfjs-backend-cpu/dist/kernels/Conv3DBackpropFilterV2.js","webpack://biostatus/./node_modules/@tensorflow/tfjs-backend-cpu/dist/kernels/Conv3DBackpropInputV2.js","webpack://biostatus/./node_modules/@tensorflow/tfjs-backend-cpu/dist/kernels/Cos.js","webpack://biostatus/./node_modules/@tensorflow/tfjs-backend-cpu/dist/kernels/Cosh.js","webpack://biostatus/./node_modules/@tensorflow/tfjs-backend-cpu/dist/kernels/CropAndResize.js","webpack://biostatus/./node_modules/@tensorflow/tfjs-backend-cpu/dist/kernels/Cumprod.js","webpack://biostatus/./node_modules/@tensorflow/tfjs-backend-cpu/dist/kernels/Cumsum.js","webpack://biostatus/./node_modules/@tensorflow/tfjs-backend-cpu/dist/kernels/DenseBincount.js","webpack://biostatus/./node_modules/@tensorflow/tfjs-backend-cpu/dist/kernels/DepthToSpace.js","webpack://biostatus/./node_modules/@tensorflow/tfjs-backend-cpu/dist/kernels/DepthwiseConv2dNative.js","webpack://biostatus/./node_modules/@tensorflow/tfjs-backend-cpu/dist/kernels/DepthwiseConv2dNativeBackpropFilter.js","webpack://biostatus/./node_modules/@tensorflow/tfjs-backend-cpu/dist/kernels/DepthwiseConv2dNativeBackpropInput.js","webpack://biostatus/./node_modules/@tensorflow/tfjs-backend-cpu/dist/kernels/Diag.js","webpack://biostatus/./node_modules/@tensorflow/tfjs-backend-cpu/dist/kernels/Dilation2D.js","webpack://biostatus/./node_modules/@tensorflow/tfjs-backend-cpu/dist/kernels/Dilation2DBackpropFilter.js","webpack://biostatus/./node_modules/@tensorflow/tfjs-backend-cpu/dist/kernels/Dilation2DBackpropInput.js","webpack://biostatus/./node_modules/@tensorflow/tfjs-backend-cpu/dist/kernels/Multiply.js","webpack://biostatus/./node_modules/@tensorflow/tfjs-backend-cpu/dist/kernels/Sum.js","webpack://biostatus/./node_modules/@tensorflow/tfjs-backend-cpu/dist/kernels/Einsum.js","webpack://biostatus/./node_modules/@tensorflow/tfjs-backend-cpu/dist/kernels/EluGrad.js","webpack://biostatus/./node_modules/@tensorflow/tfjs-backend-cpu/dist/kernels/Equal.js","webpack://biostatus/./node_modules/@tensorflow/tfjs-backend-cpu/dist/kernels/Erf.js","webpack://biostatus/./node_modules/@tensorflow/tfjs-backend-cpu/dist/kernels/Exp.js","webpack://biostatus/./node_modules/@tensorflow/tfjs-backend-cpu/dist/kernels/ExpandDims.js","webpack://biostatus/./node_modules/@tensorflow/tfjs-backend-cpu/dist/kernels/Expm1.js","webpack://biostatus/./node_modules/@tensorflow/tfjs-backend-cpu/dist/kernels/RealDiv.js","webpack://biostatus/./node_modules/@tensorflow/tfjs-backend-cpu/dist/kernels/Sub.js","webpack://biostatus/./node_modules/@tensorflow/tfjs-backend-cpu/dist/utils/fft_utils.js","webpack://biostatus/./node_modules/@tensorflow/tfjs-backend-cpu/dist/kernels/FFT.js","webpack://biostatus/./node_modules/@tensorflow/tfjs-backend-cpu/dist/kernels/Fill.js","webpack://biostatus/./node_modules/@tensorflow/tfjs-backend-cpu/dist/kernels/FlipLeftRight.js","webpack://biostatus/./node_modules/@tensorflow/tfjs-backend-cpu/dist/kernels/Floor.js","webpack://biostatus/./node_modules/@tensorflow/tfjs-backend-cpu/dist/kernels/FloorDiv.js","webpack://biostatus/./node_modules/@tensorflow/tfjs-backend-cpu/dist/kernels/FusedConv2D.js","webpack://biostatus/./node_modules/@tensorflow/tfjs-backend-cpu/dist/kernels/FusedDepthwiseConv2D.js","webpack://biostatus/./node_modules/@tensorflow/tfjs-backend-cpu/dist/kernels/GatherNd_Impl.js","webpack://biostatus/./node_modules/@tensorflow/tfjs-backend-cpu/dist/kernels/GatherNd.js","webpack://biostatus/./node_modules/@tensorflow/tfjs-backend-cpu/dist/kernels/GatherV2_impl.js","webpack://biostatus/./node_modules/@tensorflow/tfjs-backend-cpu/dist/kernels/GatherV2.js","webpack://biostatus/./node_modules/@tensorflow/tfjs-backend-cpu/dist/kernels/Greater.js","webpack://biostatus/./node_modules/@tensorflow/tfjs-backend-cpu/dist/kernels/GreaterEqual.js","webpack://biostatus/./node_modules/@tensorflow/tfjs-backend-cpu/dist/kernels/IFFT.js","webpack://biostatus/./node_modules/@tensorflow/tfjs-backend-cpu/dist/kernels/IsFinite.js","webpack://biostatus/./node_modules/@tensorflow/tfjs-backend-cpu/dist/kernels/IsInf.js","webpack://biostatus/./node_modules/@tensorflow/tfjs-backend-cpu/dist/kernels/IsNaN.js","webpack://biostatus/./node_modules/@tensorflow/tfjs-backend-cpu/dist/kernels/Less.js","webpack://biostatus/./node_modules/@tensorflow/tfjs-backend-cpu/dist/kernels/LessEqual.js","webpack://biostatus/./node_modules/@tensorflow/tfjs-backend-cpu/dist/kernels/LinSpace_impl.js","webpack://biostatus/./node_modules/@tensorflow/tfjs-backend-cpu/dist/kernels/LinSpace.js","webpack://biostatus/./node_modules/@tensorflow/tfjs-backend-cpu/dist/kernels/Log.js","webpack://biostatus/./node_modules/@tensorflow/tfjs-backend-cpu/dist/kernels/Log1p.js","webpack://biostatus/./node_modules/@tensorflow/tfjs-backend-cpu/dist/kernels/LogicalAnd.js","webpack://biostatus/./node_modules/@tensorflow/tfjs-backend-cpu/dist/kernels/LogicalNot.js","webpack://biostatus/./node_modules/@tensorflow/tfjs-backend-cpu/dist/kernels/LogicalOr.js","webpack://biostatus/./node_modules/@tensorflow/tfjs-backend-cpu/dist/kernels/LRN.js","webpack://biostatus/./node_modules/@tensorflow/tfjs-backend-cpu/dist/kernels/LRNGrad.js","webpack://biostatus/./node_modules/@tensorflow/tfjs-backend-cpu/dist/kernels/Max_impl.js","webpack://biostatus/./node_modules/@tensorflow/tfjs-backend-cpu/dist/kernels/Max.js","webpack://biostatus/./node_modules/@tensorflow/tfjs-backend-cpu/dist/kernels/Maximum.js","webpack://biostatus/./node_modules/@tensorflow/tfjs-backend-cpu/dist/kernels/MaxPool.js","webpack://biostatus/./node_modules/@tensorflow/tfjs-backend-cpu/dist/kernels/MaxPool3D.js","webpack://biostatus/./node_modules/@tensorflow/tfjs-backend-cpu/dist/kernels/MaxPool3DGrad.js","webpack://biostatus/./node_modules/@tensorflow/tfjs-backend-cpu/dist/kernels/MaxPoolGrad.js","webpack://biostatus/./node_modules/@tensorflow/tfjs-backend-cpu/dist/kernels/MaxPoolWithArgmax.js","webpack://biostatus/./node_modules/@tensorflow/tfjs-backend-cpu/dist/kernels/MaxPoolWithArgmax_impl.js","webpack://biostatus/./node_modules/@tensorflow/tfjs-backend-cpu/dist/kernels/Mean.js","webpack://biostatus/./node_modules/@tensorflow/tfjs-backend-cpu/dist/kernels/Min.js","webpack://biostatus/./node_modules/@tensorflow/tfjs-backend-cpu/dist/kernels/Minimum.js","webpack://biostatus/./node_modules/@tensorflow/tfjs-backend-cpu/dist/kernels/MirrorPad.js","webpack://biostatus/./node_modules/@tensorflow/tfjs-backend-cpu/dist/kernels/Mod.js","webpack://biostatus/./node_modules/@tensorflow/tfjs-backend-cpu/dist/kernels/Softmax.js","webpack://biostatus/./node_modules/@tensorflow/tfjs-backend-cpu/dist/kernels/Multinomial.js","webpack://biostatus/./node_modules/@tensorflow/tfjs-backend-cpu/dist/kernels/Neg.js","webpack://biostatus/./node_modules/@tensorflow/tfjs-backend-cpu/dist/kernels/NonMaxSuppressionV3.js","webpack://biostatus/./node_modules/@tensorflow/tfjs-backend-cpu/dist/kernels/NonMaxSuppressionV4.js","webpack://biostatus/./node_modules/@tensorflow/tfjs-backend-cpu/dist/kernels/NonMaxSuppressionV5.js","webpack://biostatus/./node_modules/@tensorflow/tfjs-backend-cpu/dist/kernels/NotEqual.js","webpack://biostatus/./node_modules/@tensorflow/tfjs-backend-cpu/dist/kernels/OneHot.js","webpack://biostatus/./node_modules/@tensorflow/tfjs-backend-cpu/dist/kernels/ZerosLike.js","webpack://biostatus/./node_modules/@tensorflow/tfjs-backend-cpu/dist/kernels/OnesLike.js","webpack://biostatus/./node_modules/@tensorflow/tfjs-backend-cpu/dist/kernels/Pack.js","webpack://biostatus/./node_modules/@tensorflow/tfjs-backend-cpu/dist/kernels/PadV2.js","webpack://biostatus/./node_modules/@tensorflow/tfjs-backend-cpu/dist/kernels/Pow.js","webpack://biostatus/./node_modules/@tensorflow/tfjs-backend-cpu/dist/kernels/Prod.js","webpack://biostatus/./node_modules/@tensorflow/tfjs-backend-cpu/dist/kernels/RaggedGather_impl.js","webpack://biostatus/./node_modules/@tensorflow/tfjs-backend-cpu/dist/kernels/RaggedGather.js","webpack://biostatus/./node_modules/@tensorflow/tfjs-backend-cpu/dist/kernels/RaggedTensorToTensor_impl.js","webpack://biostatus/./node_modules/@tensorflow/tfjs-backend-cpu/dist/kernels/RaggedTensorToTensor.js","webpack://biostatus/./node_modules/@tensorflow/tfjs-backend-cpu/dist/kernels/Range_impl.js","webpack://biostatus/./node_modules/@tensorflow/tfjs-backend-cpu/dist/kernels/Range.js","webpack://biostatus/./node_modules/@tensorflow/tfjs-backend-cpu/dist/kernels/Reciprocal.js","webpack://biostatus/./node_modules/@tensorflow/tfjs-backend-cpu/dist/kernels/ResizeBilinear.js","webpack://biostatus/./node_modules/@tensorflow/tfjs-backend-cpu/dist/kernels/ResizeBilinearGrad.js","webpack://biostatus/./node_modules/@tensorflow/tfjs-backend-cpu/dist/kernels/ResizeNearestNeighbor.js","webpack://biostatus/./node_modules/@tensorflow/tfjs-backend-cpu/dist/kernels/ResizeNearestNeighborGrad.js","webpack://biostatus/./node_modules/@tensorflow/tfjs-backend-cpu/dist/kernels/Reverse.js","webpack://biostatus/./node_modules/@tensorflow/tfjs-backend-cpu/dist/kernels/RotateWithOffset.js","webpack://biostatus/./node_modules/@tensorflow/tfjs-backend-cpu/dist/kernels/Round.js","webpack://biostatus/./node_modules/@tensorflow/tfjs-backend-cpu/dist/kernels/Rsqrt.js","webpack://biostatus/./node_modules/@tensorflow/tfjs-backend-cpu/dist/kernels/Scatter_impl.js","webpack://biostatus/./node_modules/@tensorflow/tfjs-backend-cpu/dist/kernels/ScatterNd.js","webpack://biostatus/./node_modules/@tensorflow/tfjs-backend-cpu/dist/kernels/SearchSorted_impl.js","webpack://biostatus/./node_modules/@tensorflow/tfjs-backend-cpu/dist/kernels/SearchSorted.js","webpack://biostatus/./node_modules/@tensorflow/tfjs-backend-cpu/dist/kernels/Select.js","webpack://biostatus/./node_modules/@tensorflow/tfjs-backend-cpu/dist/kernels/Selu.js","webpack://biostatus/./node_modules/@tensorflow/tfjs-backend-cpu/dist/kernels/Sign.js","webpack://biostatus/./node_modules/@tensorflow/tfjs-backend-cpu/dist/kernels/Sin.js","webpack://biostatus/./node_modules/@tensorflow/tfjs-backend-cpu/dist/kernels/Sinh.js","webpack://biostatus/./node_modules/@tensorflow/tfjs-backend-cpu/dist/kernels/Softplus.js","webpack://biostatus/./node_modules/@tensorflow/tfjs-backend-cpu/dist/kernels/SpaceToBatchND.js","webpack://biostatus/./node_modules/@tensorflow/tfjs-backend-cpu/dist/kernels/SparseFillEmptyRows_impl.js","webpack://biostatus/./node_modules/@tensorflow/tfjs-backend-cpu/dist/kernels/SparseFillEmptyRows.js","webpack://biostatus/./node_modules/@tensorflow/tfjs-backend-cpu/dist/kernels/SparseReshape_impl.js","webpack://biostatus/./node_modules/@tensorflow/tfjs-backend-cpu/dist/kernels/SparseReshape.js","webpack://biostatus/./node_modules/@tensorflow/tfjs-backend-cpu/dist/kernels/SparseSegmentReduction_impl.js","webpack://biostatus/./node_modules/@tensorflow/tfjs-backend-cpu/dist/kernels/SparseSegmentMean.js","webpack://biostatus/./node_modules/@tensorflow/tfjs-backend-cpu/dist/kernels/SparseSegmentSum.js","webpack://biostatus/./node_modules/@tensorflow/tfjs-backend-cpu/dist/kernels/SparseToDense.js","webpack://biostatus/./node_modules/@tensorflow/tfjs-backend-cpu/dist/kernels/SplitV.js","webpack://biostatus/./node_modules/@tensorflow/tfjs-backend-cpu/dist/kernels/Sqrt.js","webpack://biostatus/./node_modules/@tensorflow/tfjs-backend-cpu/dist/kernels/Square.js","webpack://biostatus/./node_modules/@tensorflow/tfjs-backend-cpu/dist/kernels/SquaredDifference.js","webpack://biostatus/./node_modules/@tensorflow/tfjs-backend-cpu/dist/kernels/Step.js","webpack://biostatus/./node_modules/@tensorflow/tfjs-backend-cpu/dist/kernels/StridedSlice_impl.js","webpack://biostatus/./node_modules/@tensorflow/tfjs-backend-cpu/dist/kernels/StridedSlice.js","webpack://biostatus/./node_modules/@tensorflow/tfjs-backend-cpu/dist/kernels/StringNGrams_impl.js","webpack://biostatus/./node_modules/@tensorflow/tfjs-backend-cpu/dist/kernels/StringNGrams.js","webpack://biostatus/./node_modules/@tensorflow/tfjs-backend-cpu/dist/kernels/StringSplit_impl.js","webpack://biostatus/./node_modules/@tensorflow/tfjs-backend-cpu/dist/kernels/StringSplit.js","webpack://biostatus/./node_modules/@tensorflow/tfjs-backend-cpu/dist/kernels/StringToHashBucketFast_impl.js","webpack://biostatus/./node_modules/@tensorflow/tfjs-backend-cpu/dist/kernels/StringToHashBucketFast.js","webpack://biostatus/./node_modules/@tensorflow/tfjs-backend-cpu/dist/kernels/Tan.js","webpack://biostatus/./node_modules/@tensorflow/tfjs-backend-cpu/dist/kernels/Tanh.js","webpack://biostatus/./node_modules/@tensorflow/tfjs-backend-cpu/dist/kernels/Tile_impl.js","webpack://biostatus/./node_modules/@tensorflow/tfjs-backend-cpu/dist/kernels/Tile.js","webpack://biostatus/./node_modules/@tensorflow/tfjs-backend-cpu/dist/kernels/TopK_impl.js","webpack://biostatus/./node_modules/@tensorflow/tfjs-backend-cpu/dist/kernels/TopK.js","webpack://biostatus/./node_modules/@tensorflow/tfjs-backend-cpu/dist/kernels/Transform.js","webpack://biostatus/./node_modules/@tensorflow/tfjs-backend-cpu/dist/kernels/Unique_impl.js","webpack://biostatus/./node_modules/@tensorflow/tfjs-backend-cpu/dist/kernels/Unique.js","webpack://biostatus/./node_modules/@tensorflow/tfjs-backend-cpu/dist/kernels/Unpack.js","webpack://biostatus/./node_modules/@tensorflow/tfjs-backend-cpu/dist/kernels/UnsortedSegmentSum.js","webpack://biostatus/./node_modules/@tensorflow/tfjs-backend-cpu/dist/register_all_kernels.js","webpack://biostatus/./node_modules/@tensorflow/tfjs-backend-webgl/dist/canvas_util.js","webpack://biostatus/./node_modules/@tensorflow/tfjs-backend-webgl/dist/tex_util.js","webpack://biostatus/./node_modules/@tensorflow/tfjs-backend-webgl/dist/webgl_util.js","webpack://biostatus/./node_modules/@tensorflow/tfjs-backend-webgl/dist/flags_webgl.js","webpack://biostatus/./node_modules/@tensorflow/tfjs-backend-webgl/dist/glsl_version.js","webpack://biostatus/./node_modules/@tensorflow/tfjs-backend-webgl/dist/shader_compiler_util.js","webpack://biostatus/./node_modules/@tensorflow/tfjs-backend-webgl/dist/shader_compiler.js","webpack://biostatus/./node_modules/@tensorflow/tfjs-backend-webgl/dist/gpgpu_math.js","webpack://biostatus/./node_modules/@tensorflow/tfjs-backend-webgl/dist/decode_matrix_gpu.js","webpack://biostatus/./node_modules/@tensorflow/tfjs-backend-webgl/dist/decode_matrix_packed_gpu.js","webpack://biostatus/./node_modules/@tensorflow/tfjs-backend-webgl/dist/encode_float_gpu.js","webpack://biostatus/./node_modules/@tensorflow/tfjs-backend-webgl/dist/encode_float_packed_gpu.js","webpack://biostatus/./node_modules/@tensorflow/tfjs-backend-webgl/dist/encode_matrix_gpu.js","webpack://biostatus/./node_modules/@tensorflow/tfjs-backend-webgl/dist/encode_matrix_packed_gpu.js","webpack://biostatus/./node_modules/@tensorflow/tfjs-backend-webgl/dist/gpgpu_util.js","webpack://biostatus/./node_modules/@tensorflow/tfjs-backend-webgl/dist/gpgpu_context.js","webpack://biostatus/./node_modules/@tensorflow/tfjs-backend-webgl/dist/kernel_utils/shared.js","webpack://biostatus/./node_modules/@tensorflow/tfjs-backend-webgl/dist/packing_util.js","webpack://biostatus/./node_modules/@tensorflow/tfjs-backend-webgl/dist/pack_gpu.js","webpack://biostatus/./node_modules/@tensorflow/tfjs-backend-webgl/dist/reshape_packed_gpu.js","webpack://biostatus/./node_modules/@tensorflow/tfjs-backend-webgl/dist/texture_manager.js","webpack://biostatus/./node_modules/@tensorflow/tfjs-backend-webgl/dist/unaryop_gpu.js","webpack://biostatus/./node_modules/@tensorflow/tfjs-backend-webgl/dist/unaryop_packed_gpu.js","webpack://biostatus/./node_modules/@tensorflow/tfjs-backend-webgl/dist/unpack_gpu.js","webpack://biostatus/./node_modules/@tensorflow/tfjs-backend-webgl/dist/backend_webgl.js","webpack://biostatus/./node_modules/@tensorflow/tfjs-backend-webgl/dist/base.js","webpack://biostatus/./node_modules/@tensorflow/tfjs-backend-webgl/dist/binaryop_gpu.js","webpack://biostatus/./node_modules/@tensorflow/tfjs-backend-webgl/dist/binaryop_packed_gpu.js","webpack://biostatus/./node_modules/@tensorflow/tfjs-backend-webgl/dist/kernels/Identity.js","webpack://biostatus/./node_modules/@tensorflow/tfjs-backend-webgl/dist/kernels/Complex.js","webpack://biostatus/./node_modules/@tensorflow/tfjs-backend-webgl/dist/kernels/LeakyRelu.js","webpack://biostatus/./node_modules/@tensorflow/tfjs-backend-webgl/dist/kernels/Prelu.js","webpack://biostatus/./node_modules/@tensorflow/tfjs-backend-webgl/dist/kernel_utils/kernel_funcs_utils.js","webpack://biostatus/./node_modules/@tensorflow/tfjs-backend-webgl/dist/mulmat_packed_gpu.js","webpack://biostatus/./node_modules/@tensorflow/tfjs-backend-webgl/dist/binaryop_complex_gpu.js","webpack://biostatus/./node_modules/@tensorflow/tfjs-backend-webgl/dist/kernels/Multiply.js","webpack://biostatus/./node_modules/@tensorflow/tfjs-backend-webgl/dist/kernels/Reshape.js","webpack://biostatus/./node_modules/@tensorflow/tfjs-backend-webgl/dist/kernel_utils/reshape.js","webpack://biostatus/./node_modules/@tensorflow/tfjs-backend-webgl/dist/mean_gpu.js","webpack://biostatus/./node_modules/@tensorflow/tfjs-backend-webgl/dist/reduce_gpu.js","webpack://biostatus/./node_modules/@tensorflow/tfjs-backend-webgl/dist/kernel_utils/reduce.js","webpack://biostatus/./node_modules/@tensorflow/tfjs-backend-webgl/dist/transpose_gpu.js","webpack://biostatus/./node_modules/@tensorflow/tfjs-backend-webgl/dist/transpose_packed_gpu.js","webpack://biostatus/./node_modules/@tensorflow/tfjs-backend-webgl/dist/kernels/Transpose_impl.js","webpack://biostatus/./node_modules/@tensorflow/tfjs-backend-webgl/dist/kernels/Sum.js","webpack://biostatus/./node_modules/@tensorflow/tfjs-backend-webgl/dist/kernels/Sum_impl.js","webpack://biostatus/./node_modules/@tensorflow/tfjs-backend-webgl/dist/kernels/Transpose.js","webpack://biostatus/./node_modules/@tensorflow/tfjs-backend-webgl/dist/kernels/BatchMatMul_impl.js","webpack://biostatus/./node_modules/@tensorflow/tfjs-backend-webgl/dist/kernels/_FusedMatMul.js","webpack://biostatus/./node_modules/@tensorflow/tfjs-backend-webgl/dist/kernels/Abs.js","webpack://biostatus/./node_modules/@tensorflow/tfjs-backend-webgl/dist/kernels/Acos.js","webpack://biostatus/./node_modules/@tensorflow/tfjs-backend-webgl/dist/kernels/Acosh.js","webpack://biostatus/./node_modules/@tensorflow/tfjs-backend-webgl/dist/kernels/Add.js","webpack://biostatus/./node_modules/@tensorflow/tfjs-backend-webgl/dist/addn_gpu.js","webpack://biostatus/./node_modules/@tensorflow/tfjs-backend-webgl/dist/addn_packed_gpu.js","webpack://biostatus/./node_modules/@tensorflow/tfjs-backend-webgl/dist/kernels/AddN.js","webpack://biostatus/./node_modules/@tensorflow/tfjs-backend-webgl/dist/kernels/All.js","webpack://biostatus/./node_modules/@tensorflow/tfjs-backend-webgl/dist/kernels/Any.js","webpack://biostatus/./node_modules/@tensorflow/tfjs-backend-webgl/dist/argminmax_gpu.js","webpack://biostatus/./node_modules/@tensorflow/tfjs-backend-webgl/dist/argminmax_packed_gpu.js","webpack://biostatus/./node_modules/@tensorflow/tfjs-backend-webgl/dist/kernel_utils/arg_min_max.js","webpack://biostatus/./node_modules/@tensorflow/tfjs-backend-webgl/dist/kernels/ArgMax.js","webpack://biostatus/./node_modules/@tensorflow/tfjs-backend-webgl/dist/kernels/ArgMin.js","webpack://biostatus/./node_modules/@tensorflow/tfjs-backend-webgl/dist/kernels/Asin.js","webpack://biostatus/./node_modules/@tensorflow/tfjs-backend-webgl/dist/kernels/Asinh.js","webpack://biostatus/./node_modules/@tensorflow/tfjs-backend-webgl/dist/kernels/Atan.js","webpack://biostatus/./node_modules/@tensorflow/tfjs-backend-webgl/dist/kernels/Atan2.js","webpack://biostatus/./node_modules/@tensorflow/tfjs-backend-webgl/dist/kernels/Atanh.js","webpack://biostatus/./node_modules/@tensorflow/tfjs-backend-webgl/dist/pool_gpu.js","webpack://biostatus/./node_modules/@tensorflow/tfjs-backend-webgl/dist/kernels/AvgPool.js","webpack://biostatus/./node_modules/@tensorflow/tfjs-backend-webgl/dist/kernels/AvgPool3D.js","webpack://biostatus/./node_modules/@tensorflow/tfjs-backend-webgl/dist/avg_pool_backprop_gpu.js","webpack://biostatus/./node_modules/@tensorflow/tfjs-backend-webgl/dist/kernels/AvgPool3DGrad.js","webpack://biostatus/./node_modules/@tensorflow/tfjs-backend-webgl/dist/kernels/AvgPoolGrad.js","webpack://biostatus/./node_modules/@tensorflow/tfjs-backend-webgl/dist/kernels/BatchMatMul.js","webpack://biostatus/./node_modules/@tensorflow/tfjs-backend-webgl/dist/batchnorm_gpu.js","webpack://biostatus/./node_modules/@tensorflow/tfjs-backend-webgl/dist/batchnorm_packed_gpu.js","webpack://biostatus/./node_modules/@tensorflow/tfjs-backend-webgl/dist/kernels/BatchNorm.js","webpack://biostatus/./node_modules/@tensorflow/tfjs-backend-webgl/dist/slice_gpu.js","webpack://biostatus/./node_modules/@tensorflow/tfjs-backend-webgl/dist/slice_packed_gpu.js","webpack://biostatus/./node_modules/@tensorflow/tfjs-backend-webgl/dist/kernels/Slice.js","webpack://biostatus/./node_modules/@tensorflow/tfjs-backend-webgl/dist/kernels/BatchToSpaceND.js","webpack://biostatus/./node_modules/@tensorflow/tfjs-backend-webgl/dist/kernels/Bincount.js","webpack://biostatus/./node_modules/@tensorflow/tfjs-backend-webgl/dist/kernels/BroadcastArgs.js","webpack://biostatus/./node_modules/@tensorflow/tfjs-backend-webgl/dist/kernels/NotEqual.js","webpack://biostatus/./node_modules/@tensorflow/tfjs-backend-webgl/dist/kernels/Real.js","webpack://biostatus/./node_modules/@tensorflow/tfjs-backend-webgl/dist/kernels/Cast.js","webpack://biostatus/./node_modules/@tensorflow/tfjs-backend-webgl/dist/kernel_utils/int.js","webpack://biostatus/./node_modules/@tensorflow/tfjs-backend-webgl/dist/kernels/Ceil.js","webpack://biostatus/./node_modules/@tensorflow/tfjs-backend-webgl/dist/clip_gpu.js","webpack://biostatus/./node_modules/@tensorflow/tfjs-backend-webgl/dist/clip_packed_gpu.js","webpack://biostatus/./node_modules/@tensorflow/tfjs-backend-webgl/dist/kernels/ClipByValue.js","webpack://biostatus/./node_modules/@tensorflow/tfjs-backend-webgl/dist/complex_abs_gpu.js","webpack://biostatus/./node_modules/@tensorflow/tfjs-backend-webgl/dist/kernels/ComplexAbs.js","webpack://biostatus/./node_modules/@tensorflow/tfjs-backend-webgl/dist/concat_gpu.js","webpack://biostatus/./node_modules/@tensorflow/tfjs-backend-webgl/dist/concat_packed_gpu.js","webpack://biostatus/./node_modules/@tensorflow/tfjs-backend-webgl/dist/kernels/Imag.js","webpack://biostatus/./node_modules/@tensorflow/tfjs-backend-webgl/dist/kernels/Concat_impl.js","webpack://biostatus/./node_modules/@tensorflow/tfjs-backend-webgl/dist/kernels/Concat.js","webpack://biostatus/./node_modules/@tensorflow/tfjs-backend-webgl/dist/conv_gpu.js","webpack://biostatus/./node_modules/@tensorflow/tfjs-backend-webgl/dist/conv_packed_gpu.js","webpack://biostatus/./node_modules/@tensorflow/tfjs-backend-webgl/dist/im2col_packed_gpu.js","webpack://biostatus/./node_modules/@tensorflow/tfjs-backend-webgl/dist/kernels/Conv2D_impl.js","webpack://biostatus/./node_modules/@tensorflow/tfjs-backend-webgl/dist/kernels/Conv2D.js","webpack://biostatus/./node_modules/@tensorflow/tfjs-backend-webgl/dist/conv_backprop_gpu.js","webpack://biostatus/./node_modules/@tensorflow/tfjs-backend-webgl/dist/kernels/Conv2DBackpropFilter.js","webpack://biostatus/./node_modules/@tensorflow/tfjs-backend-webgl/dist/kernels/Conv2DBackpropInput.js","webpack://biostatus/./node_modules/@tensorflow/tfjs-backend-webgl/dist/kernels/Conv3D.js","webpack://biostatus/./node_modules/@tensorflow/tfjs-backend-webgl/dist/kernels/Conv3DBackpropFilterV2.js","webpack://biostatus/./node_modules/@tensorflow/tfjs-backend-webgl/dist/kernels/Conv3DBackpropInputV2.js","webpack://biostatus/./node_modules/@tensorflow/tfjs-backend-webgl/dist/kernels/Cos.js","webpack://biostatus/./node_modules/@tensorflow/tfjs-backend-webgl/dist/kernels/Cosh.js","webpack://biostatus/./node_modules/@tensorflow/tfjs-backend-webgl/dist/crop_and_resize_gpu.js","webpack://biostatus/./node_modules/@tensorflow/tfjs-backend-webgl/dist/kernels/CropAndResize.js","webpack://biostatus/./node_modules/@tensorflow/tfjs-backend-webgl/dist/cum_gpu.js","webpack://biostatus/./node_modules/@tensorflow/tfjs-backend-webgl/dist/kernels/Cum_impl.js","webpack://biostatus/./node_modules/@tensorflow/tfjs-backend-webgl/dist/kernels/Cumprod.js","webpack://biostatus/./node_modules/@tensorflow/tfjs-backend-webgl/dist/kernels/Cumsum.js","webpack://biostatus/./node_modules/@tensorflow/tfjs-backend-webgl/dist/kernels/DenseBincount.js","webpack://biostatus/./node_modules/@tensorflow/tfjs-backend-webgl/dist/depth_to_space_gpu.js","webpack://biostatus/./node_modules/@tensorflow/tfjs-backend-webgl/dist/kernels/DepthToSpace.js","webpack://biostatus/./node_modules/@tensorflow/tfjs-backend-webgl/dist/conv_gpu_depthwise.js","webpack://biostatus/./node_modules/@tensorflow/tfjs-backend-webgl/dist/conv_packed_gpu_depthwise.js","webpack://biostatus/./node_modules/@tensorflow/tfjs-backend-webgl/dist/kernels/DepthwiseConv2dNative.js","webpack://biostatus/./node_modules/@tensorflow/tfjs-backend-webgl/dist/conv_backprop_gpu_depthwise.js","webpack://biostatus/./node_modules/@tensorflow/tfjs-backend-webgl/dist/kernels/DepthwiseConv2dNativeBackpropFilter.js","webpack://biostatus/./node_modules/@tensorflow/tfjs-backend-webgl/dist/kernels/DepthwiseConv2dNativeBackpropInput.js","webpack://biostatus/./node_modules/@tensorflow/tfjs-backend-webgl/dist/diag_gpu.js","webpack://biostatus/./node_modules/@tensorflow/tfjs-backend-webgl/dist/kernels/Diag.js","webpack://biostatus/./node_modules/@tensorflow/tfjs-backend-webgl/dist/dilation_gpu.js","webpack://biostatus/./node_modules/@tensorflow/tfjs-backend-webgl/dist/kernels/Dilation2D.js","webpack://biostatus/./node_modules/@tensorflow/tfjs-backend-webgl/dist/kernels/Einsum.js","webpack://biostatus/./node_modules/@tensorflow/tfjs-backend-webgl/dist/kernels/Elu.js","webpack://biostatus/./node_modules/@tensorflow/tfjs-backend-webgl/dist/kernels/EluGrad.js","webpack://biostatus/./node_modules/@tensorflow/tfjs-backend-webgl/dist/kernels/Equal.js","webpack://biostatus/./node_modules/@tensorflow/tfjs-backend-webgl/dist/kernels/Erf.js","webpack://biostatus/./node_modules/@tensorflow/tfjs-backend-webgl/dist/kernels/Exp.js","webpack://biostatus/./node_modules/@tensorflow/tfjs-backend-webgl/dist/kernels/ExpandDims.js","webpack://biostatus/./node_modules/@tensorflow/tfjs-backend-webgl/dist/kernels/Expm1.js","webpack://biostatus/./node_modules/@tensorflow/tfjs-backend-webgl/dist/fft_gpu.js","webpack://biostatus/./node_modules/@tensorflow/tfjs-backend-webgl/dist/kernels/FFT_impl.js","webpack://biostatus/./node_modules/@tensorflow/tfjs-backend-webgl/dist/kernels/FFT.js","webpack://biostatus/./node_modules/@tensorflow/tfjs-backend-webgl/dist/fill_gpu.js","webpack://biostatus/./node_modules/@tensorflow/tfjs-backend-webgl/dist/kernels/Fill.js","webpack://biostatus/./node_modules/@tensorflow/tfjs-backend-webgl/dist/flip_left_right_gpu.js","webpack://biostatus/./node_modules/@tensorflow/tfjs-backend-webgl/dist/kernels/FlipLeftRight.js","webpack://biostatus/./node_modules/@tensorflow/tfjs-backend-webgl/dist/kernels/Floor.js","webpack://biostatus/./node_modules/@tensorflow/tfjs-backend-webgl/dist/kernels/FloorDiv.js","webpack://biostatus/./node_modules/@tensorflow/tfjs-backend-webgl/dist/kernels/FromPixels_utils/from_pixels_gpu.js","webpack://biostatus/./node_modules/@tensorflow/tfjs-backend-webgl/dist/kernels/FromPixels_utils/from_pixels_packed_gpu.js","webpack://biostatus/./node_modules/@tensorflow/tfjs-backend-webgl/dist/kernels/FromPixels.js","webpack://biostatus/./node_modules/@tensorflow/tfjs-backend-webgl/dist/kernels/FusedConv2D.js","webpack://biostatus/./node_modules/@tensorflow/tfjs-backend-webgl/dist/kernels/FusedDepthwiseConv2D.js","webpack://biostatus/./node_modules/@tensorflow/tfjs-backend-webgl/dist/gather_nd_gpu.js","webpack://biostatus/./node_modules/@tensorflow/tfjs-backend-webgl/dist/kernels/GatherNd.js","webpack://biostatus/./node_modules/@tensorflow/tfjs-backend-webgl/dist/gather_gpu.js","webpack://biostatus/./node_modules/@tensorflow/tfjs-backend-webgl/dist/kernels/GatherV2.js","webpack://biostatus/./node_modules/@tensorflow/tfjs-backend-webgl/dist/kernels/Greater.js","webpack://biostatus/./node_modules/@tensorflow/tfjs-backend-webgl/dist/kernels/GreaterEqual.js","webpack://biostatus/./node_modules/@tensorflow/tfjs-backend-webgl/dist/kernels/IFFT.js","webpack://biostatus/./node_modules/@tensorflow/tfjs-backend-webgl/dist/kernels/IsFinite.js","webpack://biostatus/./node_modules/@tensorflow/tfjs-backend-webgl/dist/kernels/IsInf.js","webpack://biostatus/./node_modules/@tensorflow/tfjs-backend-webgl/dist/kernels/IsNaN.js","webpack://biostatus/./node_modules/@tensorflow/tfjs-backend-webgl/dist/kernels/Less.js","webpack://biostatus/./node_modules/@tensorflow/tfjs-backend-webgl/dist/kernels/LessEqual.js","webpack://biostatus/./node_modules/@tensorflow/tfjs-backend-webgl/dist/kernels/LinSpace.js","webpack://biostatus/./node_modules/@tensorflow/tfjs-backend-webgl/dist/kernels/Log.js","webpack://biostatus/./node_modules/@tensorflow/tfjs-backend-webgl/dist/kernels/Log1p.js","webpack://biostatus/./node_modules/@tensorflow/tfjs-backend-webgl/dist/kernels/LogicalAnd.js","webpack://biostatus/./node_modules/@tensorflow/tfjs-backend-webgl/dist/kernels/LogicalNot.js","webpack://biostatus/./node_modules/@tensorflow/tfjs-backend-webgl/dist/kernels/LogicalOr.js","webpack://biostatus/./node_modules/@tensorflow/tfjs-backend-webgl/dist/lrn_gpu.js","webpack://biostatus/./node_modules/@tensorflow/tfjs-backend-webgl/dist/lrn_packed_gpu.js","webpack://biostatus/./node_modules/@tensorflow/tfjs-backend-webgl/dist/kernels/LRN.js","webpack://biostatus/./node_modules/@tensorflow/tfjs-backend-webgl/dist/lrn_grad_gpu.js","webpack://biostatus/./node_modules/@tensorflow/tfjs-backend-webgl/dist/kernels/LRNGrad.js","webpack://biostatus/./node_modules/@tensorflow/tfjs-backend-webgl/dist/kernels/Max.js","webpack://biostatus/./node_modules/@tensorflow/tfjs-backend-webgl/dist/kernels/Max_impl.js","webpack://biostatus/./node_modules/@tensorflow/tfjs-backend-webgl/dist/kernels/Maximum.js","webpack://biostatus/./node_modules/@tensorflow/tfjs-backend-webgl/dist/kernels/MaxPool.js","webpack://biostatus/./node_modules/@tensorflow/tfjs-backend-webgl/dist/kernels/MaxPool3D.js","webpack://biostatus/./node_modules/@tensorflow/tfjs-backend-webgl/dist/max_pool_backprop_gpu.js","webpack://biostatus/./node_modules/@tensorflow/tfjs-backend-webgl/dist/kernels/MaxPool3DGrad.js","webpack://biostatus/./node_modules/@tensorflow/tfjs-backend-webgl/dist/kernels/MaxPoolGrad.js","webpack://biostatus/./node_modules/@tensorflow/tfjs-backend-webgl/dist/kernels/MaxPoolWithArgmax.js","webpack://biostatus/./node_modules/@tensorflow/tfjs-backend-webgl/dist/kernels/MaxPoolWithArgmax_impl.js","webpack://biostatus/./node_modules/@tensorflow/tfjs-backend-webgl/dist/kernels/Mean.js","webpack://biostatus/./node_modules/@tensorflow/tfjs-backend-webgl/dist/kernels/Mean_impl.js","webpack://biostatus/./node_modules/@tensorflow/tfjs-backend-webgl/dist/kernels/Min.js","webpack://biostatus/./node_modules/@tensorflow/tfjs-backend-webgl/dist/kernels/Minimum.js","webpack://biostatus/./node_modules/@tensorflow/tfjs-backend-webgl/dist/mirror_pad_gpu.js","webpack://biostatus/./node_modules/@tensorflow/tfjs-backend-webgl/dist/mirror_pad_packed_gpu.js","webpack://biostatus/./node_modules/@tensorflow/tfjs-backend-webgl/dist/kernels/MirrorPad.js","webpack://biostatus/./node_modules/@tensorflow/tfjs-backend-webgl/dist/kernels/Mod.js","webpack://biostatus/./node_modules/@tensorflow/tfjs-backend-webgl/dist/multinomial_gpu.js","webpack://biostatus/./node_modules/@tensorflow/tfjs-backend-webgl/dist/kernels/RealDiv.js","webpack://biostatus/./node_modules/@tensorflow/tfjs-backend-webgl/dist/kernels/Sub.js","webpack://biostatus/./node_modules/@tensorflow/tfjs-backend-webgl/dist/kernels/Softmax.js","webpack://biostatus/./node_modules/@tensorflow/tfjs-backend-webgl/dist/kernels/Multinomial.js","webpack://biostatus/./node_modules/@tensorflow/tfjs-backend-webgl/dist/kernels/Neg.js","webpack://biostatus/./node_modules/@tensorflow/tfjs-backend-webgl/dist/kernels/NonMaxSuppressionV3.js","webpack://biostatus/./node_modules/@tensorflow/tfjs-backend-webgl/dist/kernels/NonMaxSuppressionV4.js","webpack://biostatus/./node_modules/@tensorflow/tfjs-backend-webgl/dist/kernels/NonMaxSuppressionV5.js","webpack://biostatus/./node_modules/@tensorflow/tfjs-backend-webgl/dist/onehot_gpu.js","webpack://biostatus/./node_modules/@tensorflow/tfjs-backend-webgl/dist/kernels/OneHot.js","webpack://biostatus/./node_modules/@tensorflow/tfjs-backend-webgl/dist/kernels/ZerosLike.js","webpack://biostatus/./node_modules/@tensorflow/tfjs-backend-webgl/dist/kernels/OnesLike.js","webpack://biostatus/./node_modules/@tensorflow/tfjs-backend-webgl/dist/kernels/Pack.js","webpack://biostatus/./node_modules/@tensorflow/tfjs-backend-webgl/dist/pad_gpu.js","webpack://biostatus/./node_modules/@tensorflow/tfjs-backend-webgl/dist/pad_packed_gpu.js","webpack://biostatus/./node_modules/@tensorflow/tfjs-backend-webgl/dist/kernels/PadV2.js","webpack://biostatus/./node_modules/@tensorflow/tfjs-backend-webgl/dist/kernels/Pow.js","webpack://biostatus/./node_modules/@tensorflow/tfjs-backend-webgl/dist/kernels/Prod.js","webpack://biostatus/./node_modules/@tensorflow/tfjs-backend-webgl/dist/kernels/RaggedGather.js","webpack://biostatus/./node_modules/@tensorflow/tfjs-backend-webgl/dist/kernels/RaggedTensorToTensor.js","webpack://biostatus/./node_modules/@tensorflow/tfjs-backend-webgl/dist/kernels/Range.js","webpack://biostatus/./node_modules/@tensorflow/tfjs-backend-webgl/dist/kernels/Reciprocal.js","webpack://biostatus/./node_modules/@tensorflow/tfjs-backend-webgl/dist/kernels/Relu.js","webpack://biostatus/./node_modules/@tensorflow/tfjs-backend-webgl/dist/kernels/Relu6.js","webpack://biostatus/./node_modules/@tensorflow/tfjs-backend-webgl/dist/resize_bilinear_gpu.js","webpack://biostatus/./node_modules/@tensorflow/tfjs-backend-webgl/dist/resize_bilinear_packed_gpu.js","webpack://biostatus/./node_modules/@tensorflow/tfjs-backend-webgl/dist/kernels/ResizeBilinear.js","webpack://biostatus/./node_modules/@tensorflow/tfjs-backend-webgl/dist/resize_bilinear_backprop_gpu.js","webpack://biostatus/./node_modules/@tensorflow/tfjs-backend-webgl/dist/kernels/ResizeBilinearGrad.js","webpack://biostatus/./node_modules/@tensorflow/tfjs-backend-webgl/dist/resize_nearest_neighbor_gpu.js","webpack://biostatus/./node_modules/@tensorflow/tfjs-backend-webgl/dist/resize_nearest_neighbor_packed_gpu.js","webpack://biostatus/./node_modules/@tensorflow/tfjs-backend-webgl/dist/kernels/ResizeNearestNeighbor.js","webpack://biostatus/./node_modules/@tensorflow/tfjs-backend-webgl/dist/resize_nearest_neighbor_backprop_gpu.js","webpack://biostatus/./node_modules/@tensorflow/tfjs-backend-webgl/dist/kernels/ResizeNearestNeighborGrad.js","webpack://biostatus/./node_modules/@tensorflow/tfjs-backend-webgl/dist/reverse_gpu.js","webpack://biostatus/./node_modules/@tensorflow/tfjs-backend-webgl/dist/reverse_packed_gpu.js","webpack://biostatus/./node_modules/@tensorflow/tfjs-backend-webgl/dist/kernels/Reverse.js","webpack://biostatus/./node_modules/@tensorflow/tfjs-backend-webgl/dist/rotate_gpu.js","webpack://biostatus/./node_modules/@tensorflow/tfjs-backend-webgl/dist/kernels/RotateWithOffset.js","webpack://biostatus/./node_modules/@tensorflow/tfjs-backend-webgl/dist/kernels/Round.js","webpack://biostatus/./node_modules/@tensorflow/tfjs-backend-webgl/dist/kernels/Rsqrt.js","webpack://biostatus/./node_modules/@tensorflow/tfjs-backend-webgl/dist/scatter_gpu.js","webpack://biostatus/./node_modules/@tensorflow/tfjs-backend-webgl/dist/kernels/ScatterNd.js","webpack://biostatus/./node_modules/@tensorflow/tfjs-backend-webgl/dist/search_sorted_gpu.js","webpack://biostatus/./node_modules/@tensorflow/tfjs-backend-webgl/dist/kernels/SearchSorted.js","webpack://biostatus/./node_modules/@tensorflow/tfjs-backend-webgl/dist/select_gpu.js","webpack://biostatus/./node_modules/@tensorflow/tfjs-backend-webgl/dist/kernels/Select.js","webpack://biostatus/./node_modules/@tensorflow/tfjs-backend-webgl/dist/kernels/Selu.js","webpack://biostatus/./node_modules/@tensorflow/tfjs-backend-webgl/dist/kernels/Sigmoid.js","webpack://biostatus/./node_modules/@tensorflow/tfjs-backend-webgl/dist/kernels/Sign.js","webpack://biostatus/./node_modules/@tensorflow/tfjs-backend-webgl/dist/kernels/Sin.js","webpack://biostatus/./node_modules/@tensorflow/tfjs-backend-webgl/dist/kernels/Sinh.js","webpack://biostatus/./node_modules/@tensorflow/tfjs-backend-webgl/dist/kernels/Softplus.js","webpack://biostatus/./node_modules/@tensorflow/tfjs-backend-webgl/dist/kernels/SpaceToBatchND.js","webpack://biostatus/./node_modules/@tensorflow/tfjs-backend-webgl/dist/kernels/SparseFillEmptyRows.js","webpack://biostatus/./node_modules/@tensorflow/tfjs-backend-webgl/dist/kernels/SparseReshape.js","webpack://biostatus/./node_modules/@tensorflow/tfjs-backend-webgl/dist/kernels/SparseSegmentMean.js","webpack://biostatus/./node_modules/@tensorflow/tfjs-backend-webgl/dist/kernels/SparseSegmentSum.js","webpack://biostatus/./node_modules/@tensorflow/tfjs-backend-webgl/dist/kernels/SparseToDense.js","webpack://biostatus/./node_modules/@tensorflow/tfjs-backend-webgl/dist/kernels/SplitV.js","webpack://biostatus/./node_modules/@tensorflow/tfjs-backend-webgl/dist/kernels/Sqrt.js","webpack://biostatus/./node_modules/@tensorflow/tfjs-backend-webgl/dist/kernels/Square.js","webpack://biostatus/./node_modules/@tensorflow/tfjs-backend-webgl/dist/kernels/SquaredDifference.js","webpack://biostatus/./node_modules/@tensorflow/tfjs-backend-webgl/dist/kernels/Step.js","webpack://biostatus/./node_modules/@tensorflow/tfjs-backend-webgl/dist/strided_slice_gpu.js","webpack://biostatus/./node_modules/@tensorflow/tfjs-backend-webgl/dist/kernels/StridedSlice.js","webpack://biostatus/./node_modules/@tensorflow/tfjs-backend-webgl/dist/kernels/StringNGrams.js","webpack://biostatus/./node_modules/@tensorflow/tfjs-backend-webgl/dist/kernels/StringSplit.js","webpack://biostatus/./node_modules/@tensorflow/tfjs-backend-webgl/dist/kernels/StringToHashBucketFast.js","webpack://biostatus/./node_modules/@tensorflow/tfjs-backend-webgl/dist/kernels/Tan.js","webpack://biostatus/./node_modules/@tensorflow/tfjs-backend-webgl/dist/kernels/Tanh.js","webpack://biostatus/./node_modules/@tensorflow/tfjs-backend-webgl/dist/tile_gpu.js","webpack://biostatus/./node_modules/@tensorflow/tfjs-backend-webgl/dist/kernels/Tile.js","webpack://biostatus/./node_modules/@tensorflow/tfjs-backend-webgl/dist/top_k_gpu.js","webpack://biostatus/./node_modules/@tensorflow/tfjs-backend-webgl/dist/kernels/TopK.js","webpack://biostatus/./node_modules/@tensorflow/tfjs-backend-webgl/dist/transform_gpu.js","webpack://biostatus/./node_modules/@tensorflow/tfjs-backend-webgl/dist/kernels/Transform.js","webpack://biostatus/./node_modules/@tensorflow/tfjs-backend-webgl/dist/kernels/Unique.js","webpack://biostatus/./node_modules/@tensorflow/tfjs-backend-webgl/dist/kernels/Unpack.js","webpack://biostatus/./node_modules/@tensorflow/tfjs-backend-webgl/dist/segment_gpu.js","webpack://biostatus/./node_modules/@tensorflow/tfjs-backend-webgl/dist/kernels/UnsortedSegmentSum.js","webpack://biostatus/./node_modules/@tensorflow/tfjs-backend-webgl/dist/register_all_kernels.js","webpack://biostatus/./node_modules/@tensorflow/tfjs/dist/version.js","webpack://biostatus/./node_modules/@tensorflow/tfjs/dist/index.js","webpack://biostatus/./node_modules/@tensorflow/tfjs-backend-cpu/dist/version.js","webpack://biostatus/./node_modules/@tensorflow/tfjs-backend-webgl/dist/version.js","webpack://biostatus/./node_modules/actioncable/lib/assets/compiled/action_cable.js","webpack://biostatus/./node_modules/ag-grid-community/dist/ag-grid-community.cjs.js","webpack://biostatus/./node_modules/ag-grid-react/lib/agGridColumn.js","webpack://biostatus/./node_modules/ag-grid-react/lib/agGridReact.js","webpack://biostatus/./node_modules/ag-grid-react/lib/changeDetectionService.js","webpack://biostatus/./node_modules/ag-grid-react/lib/keyGenerator.js","webpack://biostatus/./node_modules/ag-grid-react/lib/legacyReactComponent.js","webpack://biostatus/./node_modules/ag-grid-react/lib/newReactComponent.js","webpack://biostatus/./node_modules/ag-grid-react/lib/reactComponent.js","webpack://biostatus/./node_modules/ag-grid-react/lib/utils.js","webpack://biostatus/./node_modules/ag-grid-react/main.js","webpack://biostatus/./node_modules/ag-grid-react/node_modules/prop-types/factoryWithThrowingShims.js","webpack://biostatus/./node_modules/ag-grid-react/node_modules/prop-types/index.js","webpack://biostatus/./node_modules/ag-grid-react/node_modules/prop-types/lib/ReactPropTypesSecret.js","webpack://biostatus/./node_modules/attr-accept/dist/es/index.js","webpack://biostatus/./node_modules/base64-js/index.js","webpack://biostatus/./node_modules/bind-event-listener/dist/bind-all.js","webpack://biostatus/./node_modules/bind-event-listener/dist/bind.js","webpack://biostatus/./node_modules/bind-event-listener/dist/index.js","webpack://biostatus/./node_modules/buffer/index.js","webpack://biostatus/./node_modules/create-react-class/factory.js","webpack://biostatus/./node_modules/create-react-class/index.js","webpack://biostatus/./node_modules/date-fns/esm/differenceInSeconds/index.js","webpack://biostatus/./node_modules/date-fns/esm/differenceInMilliseconds/index.js","webpack://biostatus/./node_modules/date-fns/esm/formatDistanceStrict/index.js","webpack://biostatus/./node_modules/date-fns/esm/_lib/cloneObject/index.js","webpack://biostatus/./node_modules/date-fns/esm/formatDistanceToNowStrict/index.js","webpack://biostatus/./node_modules/date-fns/esm/isBefore/index.js","webpack://biostatus/./node_modules/date-fns/esm/max/index.js","webpack://biostatus/./node_modules/date-fns/esm/addHours/index.js","webpack://biostatus/./node_modules/date-fns/esm/subHours/index.js","webpack://biostatus/./node_modules/dijkstrajs/dijkstra.js","webpack://biostatus/./node_modules/fbjs/lib/emptyFunction.js","webpack://biostatus/./node_modules/fbjs/lib/emptyObject.js","webpack://biostatus/./node_modules/fbjs/lib/invariant.js","webpack://biostatus/./node_modules/hex-rgb/index.js","webpack://biostatus/./node_modules/ieee754/index.js","webpack://biostatus/./node_modules/isarray/index.js","webpack://biostatus/./node_modules/lodash/_arrayMap.js","webpack://biostatus/./node_modules/lodash/_arrayReduce.js","webpack://biostatus/./node_modules/lodash/_asciiToArray.js","webpack://biostatus/./node_modules/lodash/_asciiWords.js","webpack://biostatus/./node_modules/lodash/_basePropertyOf.js","webpack://biostatus/./node_modules/lodash/_baseSlice.js","webpack://biostatus/./node_modules/lodash/_baseToString.js","webpack://biostatus/./node_modules/lodash/_castSlice.js","webpack://biostatus/./node_modules/lodash/_createCaseFirst.js","webpack://biostatus/./node_modules/lodash/_createCompounder.js","webpack://biostatus/./node_modules/lodash/_deburrLetter.js","webpack://biostatus/./node_modules/lodash/_hasUnicode.js","webpack://biostatus/./node_modules/lodash/_hasUnicodeWord.js","webpack://biostatus/./node_modules/lodash/_stringToArray.js","webpack://biostatus/./node_modules/lodash/_unicodeToArray.js","webpack://biostatus/./node_modules/lodash/_unicodeWords.js","webpack://biostatus/./node_modules/lodash/deburr.js","webpack://biostatus/./node_modules/lodash/startCase.js","webpack://biostatus/./node_modules/lodash/toString.js","webpack://biostatus/./node_modules/lodash/upperFirst.js","webpack://biostatus/./node_modules/lodash/words.js","webpack://biostatus/./node_modules/long/src/long.js","webpack://biostatus/./node_modules/papaparse/papaparse.min.js","webpack://biostatus/./node_modules/print-js/dist/print.js","webpack://biostatus/./node_modules/qrcode/lib/browser.js","webpack://biostatus/./node_modules/qrcode/lib/can-promise.js","webpack://biostatus/./node_modules/qrcode/lib/core/alignment-pattern.js","webpack://biostatus/./node_modules/qrcode/lib/core/alphanumeric-data.js","webpack://biostatus/./node_modules/qrcode/lib/core/bit-buffer.js","webpack://biostatus/./node_modules/qrcode/lib/core/bit-matrix.js","webpack://biostatus/./node_modules/qrcode/lib/core/byte-data.js","webpack://biostatus/./node_modules/qrcode/lib/core/error-correction-code.js","webpack://biostatus/./node_modules/qrcode/lib/core/error-correction-level.js","webpack://biostatus/./node_modules/qrcode/lib/core/finder-pattern.js","webpack://biostatus/./node_modules/qrcode/lib/core/format-info.js","webpack://biostatus/./node_modules/qrcode/lib/core/galois-field.js","webpack://biostatus/./node_modules/qrcode/lib/core/kanji-data.js","webpack://biostatus/./node_modules/qrcode/lib/core/mask-pattern.js","webpack://biostatus/./node_modules/qrcode/lib/core/mode.js","webpack://biostatus/./node_modules/qrcode/lib/core/numeric-data.js","webpack://biostatus/./node_modules/qrcode/lib/core/polynomial.js","webpack://biostatus/./node_modules/qrcode/lib/core/qrcode.js","webpack://biostatus/./node_modules/qrcode/lib/core/reed-solomon-encoder.js","webpack://biostatus/./node_modules/qrcode/lib/core/regex.js","webpack://biostatus/./node_modules/qrcode/lib/core/segments.js","webpack://biostatus/./node_modules/qrcode/lib/core/utils.js","webpack://biostatus/./node_modules/qrcode/lib/core/version-check.js","webpack://biostatus/./node_modules/qrcode/lib/core/version.js","webpack://biostatus/./node_modules/qrcode/lib/renderer/canvas.js","webpack://biostatus/./node_modules/qrcode/lib/renderer/svg-tag.js","webpack://biostatus/./node_modules/qrcode/lib/renderer/utils.js","webpack://biostatus/./node_modules/qrcode/lib/utils/typedarray-buffer.js","webpack://biostatus/./node_modules/querystring-es3/decode.js","webpack://biostatus/./node_modules/querystring-es3/encode.js","webpack://biostatus/./node_modules/querystring-es3/index.js","webpack://biostatus/./node_modules/react-actioncable-provider/lib/index.js","webpack://biostatus/./node_modules/react-actioncable-provider/node_modules/prop-types/factoryWithThrowingShims.js","webpack://biostatus/./node_modules/react-actioncable-provider/node_modules/prop-types/index.js","webpack://biostatus/./node_modules/react-actioncable-provider/node_modules/prop-types/lib/ReactPropTypesSecret.js","webpack://biostatus/./node_modules/react-actioncable-provider/node_modules/react/cjs/react.production.min.js","webpack://biostatus/./node_modules/react-actioncable-provider/node_modules/react/index.js","webpack://biostatus/./node_modules/react-async-script/node_modules/prop-types/factoryWithThrowingShims.js","webpack://biostatus/./node_modules/react-async-script/node_modules/prop-types/index.js","webpack://biostatus/./node_modules/react-async-script/node_modules/prop-types/lib/ReactPropTypesSecret.js","webpack://biostatus/./node_modules/react-bootstrap/esm/Badge.js","webpack://biostatus/./node_modules/react-bootstrap/esm/DropdownButton.js","webpack://biostatus/./node_modules/react-bootstrap/esm/ElementChildren.js","webpack://biostatus/./node_modules/react-bootstrap/esm/Nav.js","webpack://biostatus/./node_modules/react-bootstrap/esm/NavItem.js","webpack://biostatus/./node_modules/react-bootstrap/esm/NavLink.js","webpack://biostatus/./node_modules/react-bootstrap/esm/ProgressBar.js","webpack://biostatus/./node_modules/react-bootstrap/esm/Tab.js","webpack://biostatus/./node_modules/react-bootstrap/esm/TabContainer.js","webpack://biostatus/./node_modules/react-bootstrap/esm/TabContent.js","webpack://biostatus/./node_modules/react-bootstrap/esm/TabPane.js","webpack://biostatus/./node_modules/react-bootstrap/esm/Tabs.js","webpack://biostatus/./node_modules/react-countdown/dist/index.es.js","webpack://biostatus/./node_modules/react-dom/cjs/react-dom-server-legacy.browser.production.min.js","webpack://biostatus/./node_modules/react-dom/cjs/react-dom-server.browser.production.min.js","webpack://biostatus/./node_modules/react-dom/server.browser.js","webpack://biostatus/./node_modules/file-selector/dist/es5/file.js","webpack://biostatus/./node_modules/file-selector/dist/es5/file-selector.js","webpack://biostatus/./node_modules/react-dropzone/dist/es/utils/index.js","webpack://biostatus/./node_modules/react-dropzone/dist/es/index.js","webpack://biostatus/./node_modules/react-google-recaptcha/lib/esm/recaptcha.js","webpack://biostatus/./node_modules/react-async-script/lib/esm/async-script-loader.js","webpack://biostatus/./node_modules/react-google-recaptcha/lib/esm/recaptcha-wrapper.js","webpack://biostatus/./node_modules/react-google-recaptcha/lib/esm/index.js","webpack://biostatus/./node_modules/react-google-recaptcha/node_modules/prop-types/factoryWithThrowingShims.js","webpack://biostatus/./node_modules/react-google-recaptcha/node_modules/prop-types/index.js","webpack://biostatus/./node_modules/react-google-recaptcha/node_modules/prop-types/lib/ReactPropTypesSecret.js","webpack://biostatus/./node_modules/react-importer/node_modules/file-selector/dist/es5/file.js","webpack://biostatus/./node_modules/react-importer/node_modules/file-selector/dist/es5/file-selector.js","webpack://biostatus/./node_modules/react-importer/node_modules/react-dropzone/dist/es/utils/index.js","webpack://biostatus/./node_modules/react-importer/node_modules/react-dropzone/dist/es/index.js","webpack://biostatus/./node_modules/react-importer/node_modules/@babel/runtime/helpers/esm/extends.js","webpack://biostatus/./node_modules/react-importer/node_modules/@babel/runtime/helpers/esm/objectWithoutProperties.js","webpack://biostatus/./node_modules/react-importer/node_modules/@babel/runtime/helpers/esm/objectWithoutPropertiesLoose.js","webpack://biostatus/./node_modules/react-importer/node_modules/@babel/runtime/helpers/esm/typeof.js","webpack://biostatus/./node_modules/react-importer/node_modules/@babel/runtime/helpers/esm/classCallCheck.js","webpack://biostatus/./node_modules/react-importer/node_modules/@babel/runtime/helpers/esm/toPropertyKey.js","webpack://biostatus/./node_modules/react-importer/node_modules/@babel/runtime/helpers/esm/toPrimitive.js","webpack://biostatus/./node_modules/react-importer/node_modules/@babel/runtime/helpers/esm/createClass.js","webpack://biostatus/./node_modules/react-importer/node_modules/@babel/runtime/helpers/esm/setPrototypeOf.js","webpack://biostatus/./node_modules/react-importer/node_modules/@babel/runtime/helpers/esm/inherits.js","webpack://biostatus/./node_modules/react-importer/node_modules/@babel/runtime/helpers/esm/defineProperty.js","webpack://biostatus/./node_modules/react-importer/node_modules/react-select/dist/index-4bd03571.esm.js","webpack://biostatus/./node_modules/react-importer/node_modules/@babel/runtime/helpers/esm/taggedTemplateLiteral.js","webpack://biostatus/./node_modules/react-importer/node_modules/@babel/runtime/helpers/esm/arrayLikeToArray.js","webpack://biostatus/./node_modules/react-importer/node_modules/@babel/runtime/helpers/esm/toConsumableArray.js","webpack://biostatus/./node_modules/react-importer/node_modules/@babel/runtime/helpers/esm/arrayWithoutHoles.js","webpack://biostatus/./node_modules/react-importer/node_modules/@babel/runtime/helpers/esm/iterableToArray.js","webpack://biostatus/./node_modules/react-importer/node_modules/@babel/runtime/helpers/esm/unsupportedIterableToArray.js","webpack://biostatus/./node_modules/react-importer/node_modules/@babel/runtime/helpers/esm/nonIterableSpread.js","webpack://biostatus/./node_modules/react-importer/node_modules/memoize-one/dist/memoize-one.esm.js","webpack://biostatus/./node_modules/react-importer/node_modules/react-select/dist/Select-dbb12e54.esm.js","webpack://biostatus/./node_modules/react-importer/node_modules/react-select/dist/stateManager-845a3300.esm.js","webpack://biostatus/./node_modules/react-importer/node_modules/react-select/dist/react-select.esm.js","webpack://biostatus/./node_modules/react-circular-progressbar/dist/index.esm.js","webpack://biostatus/./node_modules/react-importer/dist/index.modern.js","webpack://biostatus/./node_modules/react-importer/node_modules/ag-grid-community/dist/ag-grid-community.cjs.js","webpack://biostatus/./node_modules/react-importer/node_modules/ag-grid-react/lib/agGridReact.js","webpack://biostatus/./node_modules/react-importer/node_modules/ag-grid-react/lib/legacy/agGridReactLegacy.js","webpack://biostatus/./node_modules/react-importer/node_modules/ag-grid-react/lib/legacy/legacyReactComponent.js","webpack://biostatus/./node_modules/react-importer/node_modules/ag-grid-react/lib/reactUi/agGridReactUi.js","webpack://biostatus/./node_modules/react-importer/node_modules/ag-grid-react/lib/reactUi/beansContext.js","webpack://biostatus/./node_modules/react-importer/node_modules/ag-grid-react/lib/reactUi/cellRenderer/detailCellRenderer.js","webpack://biostatus/./node_modules/react-importer/node_modules/ag-grid-react/lib/reactUi/cellRenderer/groupCellRenderer.js","webpack://biostatus/./node_modules/react-importer/node_modules/ag-grid-react/lib/reactUi/cells/cellComp.js","webpack://biostatus/./node_modules/react-importer/node_modules/ag-grid-react/lib/reactUi/cells/popupEditorComp.js","webpack://biostatus/./node_modules/react-importer/node_modules/ag-grid-react/lib/reactUi/cells/showJsRenderer.js","webpack://biostatus/./node_modules/react-importer/node_modules/ag-grid-react/lib/reactUi/gridBodyComp.js","webpack://biostatus/./node_modules/react-importer/node_modules/ag-grid-react/lib/reactUi/gridComp.js","webpack://biostatus/./node_modules/react-importer/node_modules/ag-grid-react/lib/reactUi/header/gridHeaderComp.js","webpack://biostatus/./node_modules/react-importer/node_modules/ag-grid-react/lib/reactUi/header/headerCellComp.js","webpack://biostatus/./node_modules/react-importer/node_modules/ag-grid-react/lib/reactUi/header/headerFilterCellComp.js","webpack://biostatus/./node_modules/react-importer/node_modules/ag-grid-react/lib/reactUi/header/headerGroupCellComp.js","webpack://biostatus/./node_modules/react-importer/node_modules/ag-grid-react/lib/reactUi/header/headerRowComp.js","webpack://biostatus/./node_modules/react-importer/node_modules/ag-grid-react/lib/reactUi/header/headerRowContainerComp.js","webpack://biostatus/./node_modules/react-importer/node_modules/ag-grid-react/lib/reactUi/jsComp.js","webpack://biostatus/./node_modules/react-importer/node_modules/ag-grid-react/lib/reactUi/reactComment.js","webpack://biostatus/./node_modules/react-importer/node_modules/ag-grid-react/lib/reactUi/reactFrameworkOverrides.js","webpack://biostatus/./node_modules/react-importer/node_modules/ag-grid-react/lib/reactUi/rows/rowComp.js","webpack://biostatus/./node_modules/react-importer/node_modules/ag-grid-react/lib/reactUi/rows/rowContainerComp.js","webpack://biostatus/./node_modules/react-importer/node_modules/ag-grid-react/lib/reactUi/tabGuardComp.js","webpack://biostatus/./node_modules/react-importer/node_modules/ag-grid-react/lib/reactUi/utils.js","webpack://biostatus/./node_modules/react-importer/node_modules/ag-grid-react/lib/shared/agGridColumn.js","webpack://biostatus/./node_modules/react-importer/node_modules/ag-grid-react/lib/shared/changeDetectionService.js","webpack://biostatus/./node_modules/react-importer/node_modules/ag-grid-react/lib/shared/keyGenerator.js","webpack://biostatus/./node_modules/react-importer/node_modules/ag-grid-react/lib/shared/newReactComponent.js","webpack://biostatus/./node_modules/react-importer/node_modules/ag-grid-react/lib/shared/portalManager.js","webpack://biostatus/./node_modules/react-importer/node_modules/ag-grid-react/lib/shared/reactComponent.js","webpack://biostatus/./node_modules/react-importer/node_modules/ag-grid-react/lib/shared/utils.js","webpack://biostatus/./node_modules/react-importer/node_modules/ag-grid-react/main.js","webpack://biostatus/./node_modules/react-importer/node_modules/prop-types/factoryWithThrowingShims.js","webpack://biostatus/./node_modules/react-importer/node_modules/prop-types/index.js","webpack://biostatus/./node_modules/react-importer/node_modules/prop-types/lib/ReactPropTypesSecret.js","webpack://biostatus/./node_modules/react-input-autosize/lib/AutosizeInput.js","webpack://biostatus/./node_modules/react-input-autosize/node_modules/prop-types/factoryWithThrowingShims.js","webpack://biostatus/./node_modules/react-input-autosize/node_modules/prop-types/index.js","webpack://biostatus/./node_modules/react-input-autosize/node_modules/prop-types/lib/ReactPropTypesSecret.js","webpack://biostatus/./node_modules/react-multi-date-picker/plugins/date_panel.js","webpack://biostatus/./node_modules/react-popper/node_modules/react-fast-compare/index.js","webpack://biostatus/./node_modules/react-select/dist/useAsync-fd9b28d9.esm.js","webpack://biostatus/./node_modules/react-select/async/dist/react-select-async.esm.js","webpack://biostatus/./node_modules/react-syntax-highlighter/node_modules/@babel/runtime/helpers/arrayLikeToArray.js","webpack://biostatus/./node_modules/react-syntax-highlighter/node_modules/@babel/runtime/helpers/arrayWithoutHoles.js","webpack://biostatus/./node_modules/react-syntax-highlighter/node_modules/@babel/runtime/helpers/asyncToGenerator.js","webpack://biostatus/./node_modules/react-syntax-highlighter/node_modules/@babel/runtime/helpers/classCallCheck.js","webpack://biostatus/./node_modules/react-syntax-highlighter/node_modules/@babel/runtime/helpers/createClass.js","webpack://biostatus/./node_modules/react-syntax-highlighter/node_modules/@babel/runtime/helpers/defineProperty.js","webpack://biostatus/./node_modules/react-syntax-highlighter/node_modules/@babel/runtime/helpers/extends.js","webpack://biostatus/./node_modules/react-syntax-highlighter/node_modules/@babel/runtime/helpers/getPrototypeOf.js","webpack://biostatus/./node_modules/react-syntax-highlighter/node_modules/@babel/runtime/helpers/inherits.js","webpack://biostatus/./node_modules/react-syntax-highlighter/node_modules/@babel/runtime/helpers/iterableToArray.js","webpack://biostatus/./node_modules/react-syntax-highlighter/node_modules/@babel/runtime/helpers/nonIterableSpread.js","webpack://biostatus/./node_modules/react-syntax-highlighter/node_modules/@babel/runtime/helpers/objectWithoutProperties.js","webpack://biostatus/./node_modules/react-syntax-highlighter/node_modules/@babel/runtime/helpers/objectWithoutPropertiesLoose.js","webpack://biostatus/./node_modules/react-syntax-highlighter/node_modules/@babel/runtime/helpers/possibleConstructorReturn.js","webpack://biostatus/./node_modules/react-syntax-highlighter/node_modules/@babel/runtime/helpers/toConsumableArray.js","webpack://biostatus/./node_modules/react-syntax-highlighter/node_modules/@babel/runtime/helpers/typeof.js","webpack://biostatus/./node_modules/react-syntax-highlighter/node_modules/@babel/runtime/helpers/unsupportedIterableToArray.js","webpack://biostatus/./node_modules/react-syntax-highlighter/node_modules/@babel/runtime/regenerator/index.js","webpack://biostatus/./node_modules/react-window/node_modules/@babel/runtime/helpers/esm/extends.js","webpack://biostatus/./node_modules/react-window/node_modules/@babel/runtime/helpers/esm/setPrototypeOf.js","webpack://biostatus/./node_modules/react-window/node_modules/@babel/runtime/helpers/esm/inheritsLoose.js","webpack://biostatus/./node_modules/react-window/node_modules/@babel/runtime/helpers/esm/assertThisInitialized.js","webpack://biostatus/./node_modules/react-window/node_modules/memoize-one/dist/memoize-one.esm.js","webpack://biostatus/./node_modules/react-window/dist/index.esm.js","webpack://biostatus/./node_modules/regenerator-runtime/runtime.js","webpack://biostatus/./node_modules/seedrandom/index.js","webpack://biostatus/./node_modules/seedrandom/lib/alea.js","webpack://biostatus/./node_modules/seedrandom/lib/tychei.js","webpack://biostatus/./node_modules/seedrandom/lib/xor128.js","webpack://biostatus/./node_modules/seedrandom/lib/xor4096.js","webpack://biostatus/./node_modules/seedrandom/lib/xorshift7.js","webpack://biostatus/./node_modules/seedrandom/lib/xorwow.js","webpack://biostatus/./node_modules/seedrandom/seedrandom.js","webpack://biostatus/./node_modules/lower-case/dist.es2015/index.js","webpack://biostatus/./node_modules/no-case/dist.es2015/index.js","webpack://biostatus/./node_modules/sentence-case/dist.es2015/index.js","webpack://biostatus/./node_modules/upper-case-first/dist.es2015/index.js","webpack://biostatus/./node_modules/tslib/tslib.es6.js","webpack://biostatus/./node_modules/@googlemaps/react-wrapper/node_modules/@googlemaps/js-api-loader/dist/index.mjs"],"sourcesContent":["/*\n\nBased off glamor's StyleSheet, thanks Sunil ❤️\n\nhigh performance StyleSheet for css-in-js systems\n\n- uses multiple style tags behind the scenes for millions of rules\n- uses `insertRule` for appending in production for *much* faster performance\n\n// usage\n\nimport { StyleSheet } from '@emotion/sheet'\n\nlet styleSheet = new StyleSheet({ key: '', container: document.head })\n\nstyleSheet.insert('#box { border: 1px solid red; }')\n- appends a css rule into the stylesheet\n\nstyleSheet.flush()\n- empties the stylesheet of all its contents\n\n*/\n// $FlowFixMe\nfunction sheetForTag(tag) {\n if (tag.sheet) {\n // $FlowFixMe\n return tag.sheet;\n } // this weirdness brought to you by firefox\n\n /* istanbul ignore next */\n\n\n for (var i = 0; i < document.styleSheets.length; i++) {\n if (document.styleSheets[i].ownerNode === tag) {\n // $FlowFixMe\n return document.styleSheets[i];\n }\n }\n}\n\nfunction createStyleElement(options) {\n var tag = document.createElement('style');\n tag.setAttribute('data-emotion', options.key);\n\n if (options.nonce !== undefined) {\n tag.setAttribute('nonce', options.nonce);\n }\n\n tag.appendChild(document.createTextNode(''));\n return tag;\n}\n\nvar StyleSheet =\n/*#__PURE__*/\nfunction () {\n function StyleSheet(options) {\n this.isSpeedy = options.speedy === undefined ? process.env.NODE_ENV === 'production' : options.speedy;\n this.tags = [];\n this.ctr = 0;\n this.nonce = options.nonce; // key is the value of the data-emotion attribute, it's used to identify different sheets\n\n this.key = options.key;\n this.container = options.container;\n this.before = null;\n }\n\n var _proto = StyleSheet.prototype;\n\n _proto.insert = function insert(rule) {\n // the max length is how many rules we have per style tag, it's 65000 in speedy mode\n // it's 1 in dev because we insert source maps that map a single rule to a location\n // and you can only have one source map per style tag\n if (this.ctr % (this.isSpeedy ? 65000 : 1) === 0) {\n var _tag = createStyleElement(this);\n\n var before;\n\n if (this.tags.length === 0) {\n before = this.before;\n } else {\n before = this.tags[this.tags.length - 1].nextSibling;\n }\n\n this.container.insertBefore(_tag, before);\n this.tags.push(_tag);\n }\n\n var tag = this.tags[this.tags.length - 1];\n\n if (this.isSpeedy) {\n var sheet = sheetForTag(tag);\n\n try {\n // this is a really hot path\n // we check the second character first because having \"i\"\n // as the second character will happen less often than\n // having \"@\" as the first character\n var isImportRule = rule.charCodeAt(1) === 105 && rule.charCodeAt(0) === 64; // this is the ultrafast version, works across browsers\n // the big drawback is that the css won't be editable in devtools\n\n sheet.insertRule(rule, // we need to insert @import rules before anything else\n // otherwise there will be an error\n // technically this means that the @import rules will\n // _usually_(not always since there could be multiple style tags)\n // be the first ones in prod and generally later in dev\n // this shouldn't really matter in the real world though\n // @import is generally only used for font faces from google fonts and etc.\n // so while this could be technically correct then it would be slower and larger\n // for a tiny bit of correctness that won't matter in the real world\n isImportRule ? 0 : sheet.cssRules.length);\n } catch (e) {\n if (process.env.NODE_ENV !== 'production') {\n console.warn(\"There was a problem inserting the following rule: \\\"\" + rule + \"\\\"\", e);\n }\n }\n } else {\n tag.appendChild(document.createTextNode(rule));\n }\n\n this.ctr++;\n };\n\n _proto.flush = function flush() {\n // $FlowFixMe\n this.tags.forEach(function (tag) {\n return tag.parentNode.removeChild(tag);\n });\n this.tags = [];\n this.ctr = 0;\n };\n\n return StyleSheet;\n}();\n\nexport { StyleSheet };\n","import { StyleSheet } from '@emotion/sheet';\nimport Stylis from '@emotion/stylis';\nimport '@emotion/weak-memoize';\n\n// https://github.com/thysultan/stylis.js/tree/master/plugins/rule-sheet\n// inlined to avoid umd wrapper and peerDep warnings/installing stylis\n// since we use stylis after closure compiler\nvar delimiter = '/*|*/';\nvar needle = delimiter + '}';\n\nfunction toSheet(block) {\n if (block) {\n Sheet.current.insert(block + '}');\n }\n}\n\nvar Sheet = {\n current: null\n};\nvar ruleSheet = function ruleSheet(context, content, selectors, parents, line, column, length, ns, depth, at) {\n switch (context) {\n // property\n case 1:\n {\n switch (content.charCodeAt(0)) {\n case 64:\n {\n // @import\n Sheet.current.insert(content + ';');\n return '';\n }\n // charcode for l\n\n case 108:\n {\n // charcode for b\n // this ignores label\n if (content.charCodeAt(2) === 98) {\n return '';\n }\n }\n }\n\n break;\n }\n // selector\n\n case 2:\n {\n if (ns === 0) return content + delimiter;\n break;\n }\n // at-rule\n\n case 3:\n {\n switch (ns) {\n // @font-face, @page\n case 102:\n case 112:\n {\n Sheet.current.insert(selectors[0] + content);\n return '';\n }\n\n default:\n {\n return content + (at === 0 ? delimiter : '');\n }\n }\n }\n\n case -2:\n {\n content.split(needle).forEach(toSheet);\n }\n }\n};\n\nvar createCache = function createCache(options) {\n if (options === undefined) options = {};\n var key = options.key || 'css';\n var stylisOptions;\n\n if (options.prefix !== undefined) {\n stylisOptions = {\n prefix: options.prefix\n };\n }\n\n var stylis = new Stylis(stylisOptions);\n\n if (process.env.NODE_ENV !== 'production') {\n // $FlowFixMe\n if (/[^a-z-]/.test(key)) {\n throw new Error(\"Emotion key must only contain lower case alphabetical characters and - but \\\"\" + key + \"\\\" was passed\");\n }\n }\n\n var inserted = {}; // $FlowFixMe\n\n var container;\n\n {\n container = options.container || document.head;\n var nodes = document.querySelectorAll(\"style[data-emotion-\" + key + \"]\");\n Array.prototype.forEach.call(nodes, function (node) {\n var attrib = node.getAttribute(\"data-emotion-\" + key); // $FlowFixMe\n\n attrib.split(' ').forEach(function (id) {\n inserted[id] = true;\n });\n\n if (node.parentNode !== container) {\n container.appendChild(node);\n }\n });\n }\n\n var _insert;\n\n {\n stylis.use(options.stylisPlugins)(ruleSheet);\n\n _insert = function insert(selector, serialized, sheet, shouldCache) {\n var name = serialized.name;\n Sheet.current = sheet;\n\n if (process.env.NODE_ENV !== 'production' && serialized.map !== undefined) {\n var map = serialized.map;\n Sheet.current = {\n insert: function insert(rule) {\n sheet.insert(rule + map);\n }\n };\n }\n\n stylis(selector, serialized.styles);\n\n if (shouldCache) {\n cache.inserted[name] = true;\n }\n };\n }\n\n if (process.env.NODE_ENV !== 'production') {\n // https://esbench.com/bench/5bf7371a4cd7e6009ef61d0a\n var commentStart = /\\/\\*/g;\n var commentEnd = /\\*\\//g;\n stylis.use(function (context, content) {\n switch (context) {\n case -1:\n {\n while (commentStart.test(content)) {\n commentEnd.lastIndex = commentStart.lastIndex;\n\n if (commentEnd.test(content)) {\n commentStart.lastIndex = commentEnd.lastIndex;\n continue;\n }\n\n throw new Error('Your styles have an unterminated comment (\"/*\" without corresponding \"*/\").');\n }\n\n commentStart.lastIndex = 0;\n break;\n }\n }\n });\n stylis.use(function (context, content, selectors) {\n switch (context) {\n case -1:\n {\n var flag = 'emotion-disable-server-rendering-unsafe-selector-warning-please-do-not-use-this-the-warning-exists-for-a-reason';\n var unsafePseudoClasses = content.match(/(:first|:nth|:nth-last)-child/g);\n\n if (unsafePseudoClasses && cache.compat !== true) {\n unsafePseudoClasses.forEach(function (unsafePseudoClass) {\n var ignoreRegExp = new RegExp(unsafePseudoClass + \".*\\\\/\\\\* \" + flag + \" \\\\*\\\\/\");\n var ignore = ignoreRegExp.test(content);\n\n if (unsafePseudoClass && !ignore) {\n console.error(\"The pseudo class \\\"\" + unsafePseudoClass + \"\\\" is potentially unsafe when doing server-side rendering. Try changing it to \\\"\" + unsafePseudoClass.split('-child')[0] + \"-of-type\\\".\");\n }\n });\n }\n\n break;\n }\n }\n });\n }\n\n var cache = {\n key: key,\n sheet: new StyleSheet({\n key: key,\n container: container,\n nonce: options.nonce,\n speedy: options.speedy\n }),\n nonce: options.nonce,\n inserted: inserted,\n registered: {},\n insert: _insert\n };\n return cache;\n};\n\nexport default createCache;\n","var isBrowser = \"object\" !== 'undefined';\nfunction getRegisteredStyles(registered, registeredStyles, classNames) {\n var rawClassName = '';\n classNames.split(' ').forEach(function (className) {\n if (registered[className] !== undefined) {\n registeredStyles.push(registered[className]);\n } else {\n rawClassName += className + \" \";\n }\n });\n return rawClassName;\n}\nvar insertStyles = function insertStyles(cache, serialized, isStringTag) {\n var className = cache.key + \"-\" + serialized.name;\n\n if ( // we only need to add the styles to the registered cache if the\n // class name could be used further down\n // the tree but if it's a string tag, we know it won't\n // so we don't have to add it to registered cache.\n // this improves memory usage since we can avoid storing the whole style string\n (isStringTag === false || // we need to always store it if we're in compat mode and\n // in node since emotion-server relies on whether a style is in\n // the registered cache to know whether a style is global or not\n // also, note that this check will be dead code eliminated in the browser\n isBrowser === false && cache.compat !== undefined) && cache.registered[className] === undefined) {\n cache.registered[className] = serialized.styles;\n }\n\n if (cache.inserted[serialized.name] === undefined) {\n var current = serialized;\n\n do {\n var maybeStyles = cache.insert(\".\" + className, current, cache.sheet, true);\n\n current = current.next;\n } while (current !== undefined);\n }\n};\n\nexport { getRegisteredStyles, insertStyles };\n","/* eslint-disable */\n// Inspired by https://github.com/garycourt/murmurhash-js\n// Ported from https://github.com/aappleby/smhasher/blob/61a0530f28277f2e850bfc39600ce61d02b518de/src/MurmurHash2.cpp#L37-L86\nfunction murmur2(str) {\n // 'm' and 'r' are mixing constants generated offline.\n // They're not really 'magic', they just happen to work well.\n // const m = 0x5bd1e995;\n // const r = 24;\n // Initialize the hash\n var h = 0; // Mix 4 bytes at a time into the hash\n\n var k,\n i = 0,\n len = str.length;\n\n for (; len >= 4; ++i, len -= 4) {\n k = str.charCodeAt(i) & 0xff | (str.charCodeAt(++i) & 0xff) << 8 | (str.charCodeAt(++i) & 0xff) << 16 | (str.charCodeAt(++i) & 0xff) << 24;\n k =\n /* Math.imul(k, m): */\n (k & 0xffff) * 0x5bd1e995 + ((k >>> 16) * 0xe995 << 16);\n k ^=\n /* k >>> r: */\n k >>> 24;\n h =\n /* Math.imul(k, m): */\n (k & 0xffff) * 0x5bd1e995 + ((k >>> 16) * 0xe995 << 16) ^\n /* Math.imul(h, m): */\n (h & 0xffff) * 0x5bd1e995 + ((h >>> 16) * 0xe995 << 16);\n } // Handle the last few bytes of the input array\n\n\n switch (len) {\n case 3:\n h ^= (str.charCodeAt(i + 2) & 0xff) << 16;\n\n case 2:\n h ^= (str.charCodeAt(i + 1) & 0xff) << 8;\n\n case 1:\n h ^= str.charCodeAt(i) & 0xff;\n h =\n /* Math.imul(h, m): */\n (h & 0xffff) * 0x5bd1e995 + ((h >>> 16) * 0xe995 << 16);\n } // Do a few final mixes of the hash to ensure the last few\n // bytes are well-incorporated.\n\n\n h ^= h >>> 13;\n h =\n /* Math.imul(h, m): */\n (h & 0xffff) * 0x5bd1e995 + ((h >>> 16) * 0xe995 << 16);\n return ((h ^ h >>> 15) >>> 0).toString(36);\n}\n\nexport default murmur2;\n","import hashString from '@emotion/hash';\nimport unitless from '@emotion/unitless';\nimport memoize from '@emotion/memoize';\n\nvar ILLEGAL_ESCAPE_SEQUENCE_ERROR = \"You have illegal escape sequence in your template literal, most likely inside content's property value.\\nBecause you write your CSS inside a JavaScript string you actually have to do double escaping, so for example \\\"content: '\\\\00d7';\\\" should become \\\"content: '\\\\\\\\00d7';\\\".\\nYou can read more about this here:\\nhttps://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Template_literals#ES2018_revision_of_illegal_escape_sequences\";\nvar UNDEFINED_AS_OBJECT_KEY_ERROR = \"You have passed in falsy value as style object's key (can happen when in example you pass unexported component as computed key).\";\nvar hyphenateRegex = /[A-Z]|^ms/g;\nvar animationRegex = /_EMO_([^_]+?)_([^]*?)_EMO_/g;\n\nvar isCustomProperty = function isCustomProperty(property) {\n return property.charCodeAt(1) === 45;\n};\n\nvar isProcessableValue = function isProcessableValue(value) {\n return value != null && typeof value !== 'boolean';\n};\n\nvar processStyleName = memoize(function (styleName) {\n return isCustomProperty(styleName) ? styleName : styleName.replace(hyphenateRegex, '-$&').toLowerCase();\n});\n\nvar processStyleValue = function processStyleValue(key, value) {\n switch (key) {\n case 'animation':\n case 'animationName':\n {\n if (typeof value === 'string') {\n return value.replace(animationRegex, function (match, p1, p2) {\n cursor = {\n name: p1,\n styles: p2,\n next: cursor\n };\n return p1;\n });\n }\n }\n }\n\n if (unitless[key] !== 1 && !isCustomProperty(key) && typeof value === 'number' && value !== 0) {\n return value + 'px';\n }\n\n return value;\n};\n\nif (process.env.NODE_ENV !== 'production') {\n var contentValuePattern = /(attr|calc|counters?|url)\\(/;\n var contentValues = ['normal', 'none', 'counter', 'open-quote', 'close-quote', 'no-open-quote', 'no-close-quote', 'initial', 'inherit', 'unset'];\n var oldProcessStyleValue = processStyleValue;\n var msPattern = /^-ms-/;\n var hyphenPattern = /-(.)/g;\n var hyphenatedCache = {};\n\n processStyleValue = function processStyleValue(key, value) {\n if (key === 'content') {\n if (typeof value !== 'string' || contentValues.indexOf(value) === -1 && !contentValuePattern.test(value) && (value.charAt(0) !== value.charAt(value.length - 1) || value.charAt(0) !== '\"' && value.charAt(0) !== \"'\")) {\n console.error(\"You seem to be using a value for 'content' without quotes, try replacing it with `content: '\\\"\" + value + \"\\\"'`\");\n }\n }\n\n var processed = oldProcessStyleValue(key, value);\n\n if (processed !== '' && !isCustomProperty(key) && key.indexOf('-') !== -1 && hyphenatedCache[key] === undefined) {\n hyphenatedCache[key] = true;\n console.error(\"Using kebab-case for css properties in objects is not supported. Did you mean \" + key.replace(msPattern, 'ms-').replace(hyphenPattern, function (str, _char) {\n return _char.toUpperCase();\n }) + \"?\");\n }\n\n return processed;\n };\n}\n\nvar shouldWarnAboutInterpolatingClassNameFromCss = true;\n\nfunction handleInterpolation(mergedProps, registered, interpolation, couldBeSelectorInterpolation) {\n if (interpolation == null) {\n return '';\n }\n\n if (interpolation.__emotion_styles !== undefined) {\n if (process.env.NODE_ENV !== 'production' && interpolation.toString() === 'NO_COMPONENT_SELECTOR') {\n throw new Error('Component selectors can only be used in conjunction with babel-plugin-emotion.');\n }\n\n return interpolation;\n }\n\n switch (typeof interpolation) {\n case 'boolean':\n {\n return '';\n }\n\n case 'object':\n {\n if (interpolation.anim === 1) {\n cursor = {\n name: interpolation.name,\n styles: interpolation.styles,\n next: cursor\n };\n return interpolation.name;\n }\n\n if (interpolation.styles !== undefined) {\n var next = interpolation.next;\n\n if (next !== undefined) {\n // not the most efficient thing ever but this is a pretty rare case\n // and there will be very few iterations of this generally\n while (next !== undefined) {\n cursor = {\n name: next.name,\n styles: next.styles,\n next: cursor\n };\n next = next.next;\n }\n }\n\n var styles = interpolation.styles + \";\";\n\n if (process.env.NODE_ENV !== 'production' && interpolation.map !== undefined) {\n styles += interpolation.map;\n }\n\n return styles;\n }\n\n return createStringFromObject(mergedProps, registered, interpolation);\n }\n\n case 'function':\n {\n if (mergedProps !== undefined) {\n var previousCursor = cursor;\n var result = interpolation(mergedProps);\n cursor = previousCursor;\n return handleInterpolation(mergedProps, registered, result, couldBeSelectorInterpolation);\n } else if (process.env.NODE_ENV !== 'production') {\n console.error('Functions that are interpolated in css calls will be stringified.\\n' + 'If you want to have a css call based on props, create a function that returns a css call like this\\n' + 'let dynamicStyle = (props) => css`color: ${props.color}`\\n' + 'It can be called directly with props or interpolated in a styled call like this\\n' + \"let SomeComponent = styled('div')`${dynamicStyle}`\");\n }\n\n break;\n }\n\n case 'string':\n if (process.env.NODE_ENV !== 'production') {\n var matched = [];\n var replaced = interpolation.replace(animationRegex, function (match, p1, p2) {\n var fakeVarName = \"animation\" + matched.length;\n matched.push(\"const \" + fakeVarName + \" = keyframes`\" + p2.replace(/^@keyframes animation-\\w+/, '') + \"`\");\n return \"${\" + fakeVarName + \"}\";\n });\n\n if (matched.length) {\n console.error('`keyframes` output got interpolated into plain string, please wrap it with `css`.\\n\\n' + 'Instead of doing this:\\n\\n' + [].concat(matched, [\"`\" + replaced + \"`\"]).join('\\n') + '\\n\\nYou should wrap it with `css` like this:\\n\\n' + (\"css`\" + replaced + \"`\"));\n }\n }\n\n break;\n } // finalize string values (regular strings and functions interpolated into css calls)\n\n\n if (registered == null) {\n return interpolation;\n }\n\n var cached = registered[interpolation];\n\n if (process.env.NODE_ENV !== 'production' && couldBeSelectorInterpolation && shouldWarnAboutInterpolatingClassNameFromCss && cached !== undefined) {\n console.error('Interpolating a className from css`` is not recommended and will cause problems with composition.\\n' + 'Interpolating a className from css`` will be completely unsupported in a future major version of Emotion');\n shouldWarnAboutInterpolatingClassNameFromCss = false;\n }\n\n return cached !== undefined && !couldBeSelectorInterpolation ? cached : interpolation;\n}\n\nfunction createStringFromObject(mergedProps, registered, obj) {\n var string = '';\n\n if (Array.isArray(obj)) {\n for (var i = 0; i < obj.length; i++) {\n string += handleInterpolation(mergedProps, registered, obj[i], false);\n }\n } else {\n for (var _key in obj) {\n var value = obj[_key];\n\n if (typeof value !== 'object') {\n if (registered != null && registered[value] !== undefined) {\n string += _key + \"{\" + registered[value] + \"}\";\n } else if (isProcessableValue(value)) {\n string += processStyleName(_key) + \":\" + processStyleValue(_key, value) + \";\";\n }\n } else {\n if (_key === 'NO_COMPONENT_SELECTOR' && process.env.NODE_ENV !== 'production') {\n throw new Error('Component selectors can only be used in conjunction with babel-plugin-emotion.');\n }\n\n if (Array.isArray(value) && typeof value[0] === 'string' && (registered == null || registered[value[0]] === undefined)) {\n for (var _i = 0; _i < value.length; _i++) {\n if (isProcessableValue(value[_i])) {\n string += processStyleName(_key) + \":\" + processStyleValue(_key, value[_i]) + \";\";\n }\n }\n } else {\n var interpolated = handleInterpolation(mergedProps, registered, value, false);\n\n switch (_key) {\n case 'animation':\n case 'animationName':\n {\n string += processStyleName(_key) + \":\" + interpolated + \";\";\n break;\n }\n\n default:\n {\n if (process.env.NODE_ENV !== 'production' && _key === 'undefined') {\n console.error(UNDEFINED_AS_OBJECT_KEY_ERROR);\n }\n\n string += _key + \"{\" + interpolated + \"}\";\n }\n }\n }\n }\n }\n }\n\n return string;\n}\n\nvar labelPattern = /label:\\s*([^\\s;\\n{]+)\\s*;/g;\nvar sourceMapPattern;\n\nif (process.env.NODE_ENV !== 'production') {\n sourceMapPattern = /\\/\\*#\\ssourceMappingURL=data:application\\/json;\\S+\\s+\\*\\//;\n} // this is the cursor for keyframes\n// keyframes are stored on the SerializedStyles object as a linked list\n\n\nvar cursor;\nvar serializeStyles = function serializeStyles(args, registered, mergedProps) {\n if (args.length === 1 && typeof args[0] === 'object' && args[0] !== null && args[0].styles !== undefined) {\n return args[0];\n }\n\n var stringMode = true;\n var styles = '';\n cursor = undefined;\n var strings = args[0];\n\n if (strings == null || strings.raw === undefined) {\n stringMode = false;\n styles += handleInterpolation(mergedProps, registered, strings, false);\n } else {\n if (process.env.NODE_ENV !== 'production' && strings[0] === undefined) {\n console.error(ILLEGAL_ESCAPE_SEQUENCE_ERROR);\n }\n\n styles += strings[0];\n } // we start at 1 since we've already handled the first arg\n\n\n for (var i = 1; i < args.length; i++) {\n styles += handleInterpolation(mergedProps, registered, args[i], styles.charCodeAt(styles.length - 1) === 46);\n\n if (stringMode) {\n if (process.env.NODE_ENV !== 'production' && strings[i] === undefined) {\n console.error(ILLEGAL_ESCAPE_SEQUENCE_ERROR);\n }\n\n styles += strings[i];\n }\n }\n\n var sourceMap;\n\n if (process.env.NODE_ENV !== 'production') {\n styles = styles.replace(sourceMapPattern, function (match) {\n sourceMap = match;\n return '';\n });\n } // using a global regex with .exec is stateful so lastIndex has to be reset each time\n\n\n labelPattern.lastIndex = 0;\n var identifierName = '';\n var match; // https://esbench.com/bench/5b809c2cf2949800a0f61fb5\n\n while ((match = labelPattern.exec(styles)) !== null) {\n identifierName += '-' + // $FlowFixMe we know it's not null\n match[1];\n }\n\n var name = hashString(styles) + identifierName;\n\n if (process.env.NODE_ENV !== 'production') {\n // $FlowFixMe SerializedStyles type doesn't have toString property (and we don't want to add it)\n return {\n name: name,\n styles: styles,\n map: sourceMap,\n next: cursor,\n toString: function toString() {\n return \"You have tried to stringify object returned from `css` function. It isn't supposed to be used directly (e.g. as value of the `className` prop), but rather handed to emotion so it can handle it (e.g. as value of `css` prop).\";\n }\n };\n }\n\n return {\n name: name,\n styles: styles,\n next: cursor\n };\n};\n\nexport { serializeStyles };\n","import '@babel/runtime/helpers/inheritsLoose';\nimport { createContext, forwardRef, createElement, Fragment } from 'react';\nimport createCache from '@emotion/cache';\nimport { getRegisteredStyles, insertStyles } from '@emotion/utils';\nimport { serializeStyles } from '@emotion/serialize';\n\nvar hasOwnProperty = Object.prototype.hasOwnProperty;\n\nvar EmotionCacheContext = /*#__PURE__*/createContext( // we're doing this to avoid preconstruct's dead code elimination in this one case\n// because this module is primarily intended for the browser and node\n// but it's also required in react native and similar environments sometimes\n// and we could have a special build just for that\n// but this is much easier and the native packages\n// might use a different theme context in the future anyway\ntypeof HTMLElement !== 'undefined' ? createCache() : null);\nvar ThemeContext = /*#__PURE__*/createContext({});\nvar CacheProvider = EmotionCacheContext.Provider;\n\nvar withEmotionCache = function withEmotionCache(func) {\n var render = function render(props, ref) {\n return /*#__PURE__*/createElement(EmotionCacheContext.Consumer, null, function (cache) {\n return func(props, cache, ref);\n });\n }; // $FlowFixMe\n\n\n return /*#__PURE__*/forwardRef(render);\n};\n\n// thus we only need to replace what is a valid character for JS, but not for CSS\n\nvar sanitizeIdentifier = function sanitizeIdentifier(identifier) {\n return identifier.replace(/\\$/g, '-');\n};\n\nvar typePropName = '__EMOTION_TYPE_PLEASE_DO_NOT_USE__';\nvar labelPropName = '__EMOTION_LABEL_PLEASE_DO_NOT_USE__';\nvar createEmotionProps = function createEmotionProps(type, props) {\n if (process.env.NODE_ENV !== 'production' && typeof props.css === 'string' && // check if there is a css declaration\n props.css.indexOf(':') !== -1) {\n throw new Error(\"Strings are not allowed as css prop values, please wrap it in a css template literal from '@emotion/css' like this: css`\" + props.css + \"`\");\n }\n\n var newProps = {};\n\n for (var key in props) {\n if (hasOwnProperty.call(props, key)) {\n newProps[key] = props[key];\n }\n }\n\n newProps[typePropName] = type; // TODO: check if this still works with all of those different JSX functions\n\n if (process.env.NODE_ENV !== 'production') {\n var error = new Error();\n\n if (error.stack) {\n // chrome\n var match = error.stack.match(/at (?:Object\\.|Module\\.|)(?:jsx|createEmotionProps).*\\n\\s+at (?:Object\\.|)([A-Z][A-Za-z$]+) /);\n\n if (!match) {\n // safari and firefox\n match = error.stack.match(/.*\\n([A-Z][A-Za-z$]+)@/);\n }\n\n if (match) {\n newProps[labelPropName] = sanitizeIdentifier(match[1]);\n }\n }\n }\n\n return newProps;\n};\n\nvar Noop = function Noop() {\n return null;\n};\n\nvar render = function render(cache, props, theme, ref) {\n var cssProp = theme === null ? props.css : props.css(theme); // so that using `css` from `emotion` and passing the result to the css prop works\n // not passing the registered cache to serializeStyles because it would\n // make certain babel optimisations not possible\n\n if (typeof cssProp === 'string' && cache.registered[cssProp] !== undefined) {\n cssProp = cache.registered[cssProp];\n }\n\n var type = props[typePropName];\n var registeredStyles = [cssProp];\n var className = '';\n\n if (typeof props.className === 'string') {\n className = getRegisteredStyles(cache.registered, registeredStyles, props.className);\n } else if (props.className != null) {\n className = props.className + \" \";\n }\n\n var serialized = serializeStyles(registeredStyles);\n\n if (process.env.NODE_ENV !== 'production' && serialized.name.indexOf('-') === -1) {\n var labelFromStack = props[labelPropName];\n\n if (labelFromStack) {\n serialized = serializeStyles([serialized, 'label:' + labelFromStack + ';']);\n }\n }\n\n var rules = insertStyles(cache, serialized, typeof type === 'string');\n className += cache.key + \"-\" + serialized.name;\n var newProps = {};\n\n for (var key in props) {\n if (hasOwnProperty.call(props, key) && key !== 'css' && key !== typePropName && (process.env.NODE_ENV === 'production' || key !== labelPropName)) {\n newProps[key] = props[key];\n }\n }\n\n newProps.ref = ref;\n newProps.className = className;\n var ele = /*#__PURE__*/createElement(type, newProps);\n var possiblyStyleElement = /*#__PURE__*/createElement(Noop, null);\n\n\n return /*#__PURE__*/createElement(Fragment, null, possiblyStyleElement, ele);\n}; // eslint-disable-next-line no-undef\n\n\nvar Emotion = /* #__PURE__ */withEmotionCache(function (props, cache, ref) {\n if (typeof props.css === 'function') {\n return /*#__PURE__*/createElement(ThemeContext.Consumer, null, function (theme) {\n return render(cache, props, theme, ref);\n });\n }\n\n return render(cache, props, null, ref);\n});\n\nif (process.env.NODE_ENV !== 'production') {\n Emotion.displayName = 'EmotionCssPropInternal';\n}\n\nexport { CacheProvider as C, Emotion as E, ThemeContext as T, createEmotionProps as c, hasOwnProperty as h, withEmotionCache as w };\n","import { serializeStyles } from '@emotion/serialize';\n\nfunction css() {\n for (var _len = arguments.length, args = new Array(_len), _key = 0; _key < _len; _key++) {\n args[_key] = arguments[_key];\n }\n\n return serializeStyles(args);\n}\n\nexport default css;\n","import _inheritsLoose from '@babel/runtime/helpers/esm/inheritsLoose';\nimport { createElement, Component, Fragment } from 'react';\nimport '@emotion/cache';\nimport { h as hasOwnProperty, E as Emotion, c as createEmotionProps, w as withEmotionCache, T as ThemeContext } from './emotion-element-04d85134.browser.esm.js';\nexport { C as CacheProvider, T as ThemeContext, w as withEmotionCache } from './emotion-element-04d85134.browser.esm.js';\nimport { insertStyles, getRegisteredStyles } from '@emotion/utils';\nimport { serializeStyles } from '@emotion/serialize';\nimport { StyleSheet } from '@emotion/sheet';\nimport css from '@emotion/css';\nexport { default as css } from '@emotion/css';\n\nvar jsx = function jsx(type, props) {\n var args = arguments;\n\n if (props == null || !hasOwnProperty.call(props, 'css')) {\n // $FlowFixMe\n return createElement.apply(undefined, args);\n }\n\n var argsLength = args.length;\n var createElementArgArray = new Array(argsLength);\n createElementArgArray[0] = Emotion;\n createElementArgArray[1] = createEmotionProps(type, props);\n\n for (var i = 2; i < argsLength; i++) {\n createElementArgArray[i] = args[i];\n } // $FlowFixMe\n\n\n return createElement.apply(null, createElementArgArray);\n};\n\nvar warnedAboutCssPropForGlobal = false;\nvar Global = /* #__PURE__ */withEmotionCache(function (props, cache) {\n if (process.env.NODE_ENV !== 'production' && !warnedAboutCssPropForGlobal && ( // check for className as well since the user is\n // probably using the custom createElement which\n // means it will be turned into a className prop\n // $FlowFixMe I don't really want to add it to the type since it shouldn't be used\n props.className || props.css)) {\n console.error(\"It looks like you're using the css prop on Global, did you mean to use the styles prop instead?\");\n warnedAboutCssPropForGlobal = true;\n }\n\n var styles = props.styles;\n\n if (typeof styles === 'function') {\n return /*#__PURE__*/createElement(ThemeContext.Consumer, null, function (theme) {\n var serialized = serializeStyles([styles(theme)]);\n return /*#__PURE__*/createElement(InnerGlobal, {\n serialized: serialized,\n cache: cache\n });\n });\n }\n\n var serialized = serializeStyles([styles]);\n return /*#__PURE__*/createElement(InnerGlobal, {\n serialized: serialized,\n cache: cache\n });\n});\n\n// maintain place over rerenders.\n// initial render from browser, insertBefore context.sheet.tags[0] or if a style hasn't been inserted there yet, appendChild\n// initial client-side render from SSR, use place of hydrating tag\nvar InnerGlobal = /*#__PURE__*/function (_React$Component) {\n _inheritsLoose(InnerGlobal, _React$Component);\n\n function InnerGlobal(props, context, updater) {\n return _React$Component.call(this, props, context, updater) || this;\n }\n\n var _proto = InnerGlobal.prototype;\n\n _proto.componentDidMount = function componentDidMount() {\n this.sheet = new StyleSheet({\n key: this.props.cache.key + \"-global\",\n nonce: this.props.cache.sheet.nonce,\n container: this.props.cache.sheet.container\n }); // $FlowFixMe\n\n var node = document.querySelector(\"style[data-emotion-\" + this.props.cache.key + \"=\\\"\" + this.props.serialized.name + \"\\\"]\");\n\n if (node !== null) {\n this.sheet.tags.push(node);\n }\n\n if (this.props.cache.sheet.tags.length) {\n this.sheet.before = this.props.cache.sheet.tags[0];\n }\n\n this.insertStyles();\n };\n\n _proto.componentDidUpdate = function componentDidUpdate(prevProps) {\n if (prevProps.serialized.name !== this.props.serialized.name) {\n this.insertStyles();\n }\n };\n\n _proto.insertStyles = function insertStyles$1() {\n if (this.props.serialized.next !== undefined) {\n // insert keyframes\n insertStyles(this.props.cache, this.props.serialized.next, true);\n }\n\n if (this.sheet.tags.length) {\n // if this doesn't exist then it will be null so the style element will be appended\n var element = this.sheet.tags[this.sheet.tags.length - 1].nextElementSibling;\n this.sheet.before = element;\n this.sheet.flush();\n }\n\n this.props.cache.insert(\"\", this.props.serialized, this.sheet, false);\n };\n\n _proto.componentWillUnmount = function componentWillUnmount() {\n this.sheet.flush();\n };\n\n _proto.render = function render() {\n\n return null;\n };\n\n return InnerGlobal;\n}(Component);\n\nvar keyframes = function keyframes() {\n var insertable = css.apply(void 0, arguments);\n var name = \"animation-\" + insertable.name; // $FlowFixMe\n\n return {\n name: name,\n styles: \"@keyframes \" + name + \"{\" + insertable.styles + \"}\",\n anim: 1,\n toString: function toString() {\n return \"_EMO_\" + this.name + \"_\" + this.styles + \"_EMO_\";\n }\n };\n};\n\nvar classnames = function classnames(args) {\n var len = args.length;\n var i = 0;\n var cls = '';\n\n for (; i < len; i++) {\n var arg = args[i];\n if (arg == null) continue;\n var toAdd = void 0;\n\n switch (typeof arg) {\n case 'boolean':\n break;\n\n case 'object':\n {\n if (Array.isArray(arg)) {\n toAdd = classnames(arg);\n } else {\n toAdd = '';\n\n for (var k in arg) {\n if (arg[k] && k) {\n toAdd && (toAdd += ' ');\n toAdd += k;\n }\n }\n }\n\n break;\n }\n\n default:\n {\n toAdd = arg;\n }\n }\n\n if (toAdd) {\n cls && (cls += ' ');\n cls += toAdd;\n }\n }\n\n return cls;\n};\n\nfunction merge(registered, css, className) {\n var registeredStyles = [];\n var rawClassName = getRegisteredStyles(registered, registeredStyles, className);\n\n if (registeredStyles.length < 2) {\n return className;\n }\n\n return rawClassName + css(registeredStyles);\n}\n\nvar Noop = function Noop() {\n return null;\n};\n\nvar ClassNames = withEmotionCache(function (props, context) {\n return /*#__PURE__*/createElement(ThemeContext.Consumer, null, function (theme) {\n var hasRendered = false;\n\n var css = function css() {\n if (hasRendered && process.env.NODE_ENV !== 'production') {\n throw new Error('css can only be used during render');\n }\n\n for (var _len = arguments.length, args = new Array(_len), _key = 0; _key < _len; _key++) {\n args[_key] = arguments[_key];\n }\n\n var serialized = serializeStyles(args, context.registered);\n\n {\n insertStyles(context, serialized, false);\n }\n\n return context.key + \"-\" + serialized.name;\n };\n\n var cx = function cx() {\n if (hasRendered && process.env.NODE_ENV !== 'production') {\n throw new Error('cx can only be used during render');\n }\n\n for (var _len2 = arguments.length, args = new Array(_len2), _key2 = 0; _key2 < _len2; _key2++) {\n args[_key2] = arguments[_key2];\n }\n\n return merge(context.registered, css, classnames(args));\n };\n\n var content = {\n css: css,\n cx: cx,\n theme: theme\n };\n var ele = props.children(content);\n hasRendered = true;\n var possiblyStyleElement = /*#__PURE__*/createElement(Noop, null);\n\n\n return /*#__PURE__*/createElement(Fragment, null, possiblyStyleElement, ele);\n });\n});\n\nexport { ClassNames, Global, jsx as createElement, jsx, keyframes };\n","import _extends from \"@babel/runtime/helpers/extends\";\nimport _defineProperty from \"@babel/runtime/helpers/defineProperty\";\n\nfunction ownKeys(object, enumerableOnly) { var keys = Object.keys(object); if (Object.getOwnPropertySymbols) { var symbols = Object.getOwnPropertySymbols(object); enumerableOnly && (symbols = symbols.filter(function (sym) { return Object.getOwnPropertyDescriptor(object, sym).enumerable; })), keys.push.apply(keys, symbols); } return keys; }\n\nfunction _objectSpread(target) { for (var i = 1; i < arguments.length; i++) { var source = null != arguments[i] ? arguments[i] : {}; i % 2 ? ownKeys(Object(source), !0).forEach(function (key) { _defineProperty(target, key, source[key]); }) : Object.getOwnPropertyDescriptors ? Object.defineProperties(target, Object.getOwnPropertyDescriptors(source)) : ownKeys(Object(source)).forEach(function (key) { Object.defineProperty(target, key, Object.getOwnPropertyDescriptor(source, key)); }); } return target; }\n\nimport React from 'react'; // Get all possible permutations of all power sets\n//\n// Super simple, non-algorithmic solution since the\n// number of class names will not be greater than 4\n\nfunction powerSetPermutations(arr) {\n var arrLength = arr.length;\n if (arrLength === 0 || arrLength === 1) return arr;\n\n if (arrLength === 2) {\n // prettier-ignore\n return [arr[0], arr[1], \"\".concat(arr[0], \".\").concat(arr[1]), \"\".concat(arr[1], \".\").concat(arr[0])];\n }\n\n if (arrLength === 3) {\n return [arr[0], arr[1], arr[2], \"\".concat(arr[0], \".\").concat(arr[1]), \"\".concat(arr[0], \".\").concat(arr[2]), \"\".concat(arr[1], \".\").concat(arr[0]), \"\".concat(arr[1], \".\").concat(arr[2]), \"\".concat(arr[2], \".\").concat(arr[0]), \"\".concat(arr[2], \".\").concat(arr[1]), \"\".concat(arr[0], \".\").concat(arr[1], \".\").concat(arr[2]), \"\".concat(arr[0], \".\").concat(arr[2], \".\").concat(arr[1]), \"\".concat(arr[1], \".\").concat(arr[0], \".\").concat(arr[2]), \"\".concat(arr[1], \".\").concat(arr[2], \".\").concat(arr[0]), \"\".concat(arr[2], \".\").concat(arr[0], \".\").concat(arr[1]), \"\".concat(arr[2], \".\").concat(arr[1], \".\").concat(arr[0])];\n }\n\n if (arrLength >= 4) {\n // Currently does not support more than 4 extra\n // class names (after `.token` has been removed)\n return [arr[0], arr[1], arr[2], arr[3], \"\".concat(arr[0], \".\").concat(arr[1]), \"\".concat(arr[0], \".\").concat(arr[2]), \"\".concat(arr[0], \".\").concat(arr[3]), \"\".concat(arr[1], \".\").concat(arr[0]), \"\".concat(arr[1], \".\").concat(arr[2]), \"\".concat(arr[1], \".\").concat(arr[3]), \"\".concat(arr[2], \".\").concat(arr[0]), \"\".concat(arr[2], \".\").concat(arr[1]), \"\".concat(arr[2], \".\").concat(arr[3]), \"\".concat(arr[3], \".\").concat(arr[0]), \"\".concat(arr[3], \".\").concat(arr[1]), \"\".concat(arr[3], \".\").concat(arr[2]), \"\".concat(arr[0], \".\").concat(arr[1], \".\").concat(arr[2]), \"\".concat(arr[0], \".\").concat(arr[1], \".\").concat(arr[3]), \"\".concat(arr[0], \".\").concat(arr[2], \".\").concat(arr[1]), \"\".concat(arr[0], \".\").concat(arr[2], \".\").concat(arr[3]), \"\".concat(arr[0], \".\").concat(arr[3], \".\").concat(arr[1]), \"\".concat(arr[0], \".\").concat(arr[3], \".\").concat(arr[2]), \"\".concat(arr[1], \".\").concat(arr[0], \".\").concat(arr[2]), \"\".concat(arr[1], \".\").concat(arr[0], \".\").concat(arr[3]), \"\".concat(arr[1], \".\").concat(arr[2], \".\").concat(arr[0]), \"\".concat(arr[1], \".\").concat(arr[2], \".\").concat(arr[3]), \"\".concat(arr[1], \".\").concat(arr[3], \".\").concat(arr[0]), \"\".concat(arr[1], \".\").concat(arr[3], \".\").concat(arr[2]), \"\".concat(arr[2], \".\").concat(arr[0], \".\").concat(arr[1]), \"\".concat(arr[2], \".\").concat(arr[0], \".\").concat(arr[3]), \"\".concat(arr[2], \".\").concat(arr[1], \".\").concat(arr[0]), \"\".concat(arr[2], \".\").concat(arr[1], \".\").concat(arr[3]), \"\".concat(arr[2], \".\").concat(arr[3], \".\").concat(arr[0]), \"\".concat(arr[2], \".\").concat(arr[3], \".\").concat(arr[1]), \"\".concat(arr[3], \".\").concat(arr[0], \".\").concat(arr[1]), \"\".concat(arr[3], \".\").concat(arr[0], \".\").concat(arr[2]), \"\".concat(arr[3], \".\").concat(arr[1], \".\").concat(arr[0]), \"\".concat(arr[3], \".\").concat(arr[1], \".\").concat(arr[2]), \"\".concat(arr[3], \".\").concat(arr[2], \".\").concat(arr[0]), \"\".concat(arr[3], \".\").concat(arr[2], \".\").concat(arr[1]), \"\".concat(arr[0], \".\").concat(arr[1], \".\").concat(arr[2], \".\").concat(arr[3]), \"\".concat(arr[0], \".\").concat(arr[1], \".\").concat(arr[3], \".\").concat(arr[2]), \"\".concat(arr[0], \".\").concat(arr[2], \".\").concat(arr[1], \".\").concat(arr[3]), \"\".concat(arr[0], \".\").concat(arr[2], \".\").concat(arr[3], \".\").concat(arr[1]), \"\".concat(arr[0], \".\").concat(arr[3], \".\").concat(arr[1], \".\").concat(arr[2]), \"\".concat(arr[0], \".\").concat(arr[3], \".\").concat(arr[2], \".\").concat(arr[1]), \"\".concat(arr[1], \".\").concat(arr[0], \".\").concat(arr[2], \".\").concat(arr[3]), \"\".concat(arr[1], \".\").concat(arr[0], \".\").concat(arr[3], \".\").concat(arr[2]), \"\".concat(arr[1], \".\").concat(arr[2], \".\").concat(arr[0], \".\").concat(arr[3]), \"\".concat(arr[1], \".\").concat(arr[2], \".\").concat(arr[3], \".\").concat(arr[0]), \"\".concat(arr[1], \".\").concat(arr[3], \".\").concat(arr[0], \".\").concat(arr[2]), \"\".concat(arr[1], \".\").concat(arr[3], \".\").concat(arr[2], \".\").concat(arr[0]), \"\".concat(arr[2], \".\").concat(arr[0], \".\").concat(arr[1], \".\").concat(arr[3]), \"\".concat(arr[2], \".\").concat(arr[0], \".\").concat(arr[3], \".\").concat(arr[1]), \"\".concat(arr[2], \".\").concat(arr[1], \".\").concat(arr[0], \".\").concat(arr[3]), \"\".concat(arr[2], \".\").concat(arr[1], \".\").concat(arr[3], \".\").concat(arr[0]), \"\".concat(arr[2], \".\").concat(arr[3], \".\").concat(arr[0], \".\").concat(arr[1]), \"\".concat(arr[2], \".\").concat(arr[3], \".\").concat(arr[1], \".\").concat(arr[0]), \"\".concat(arr[3], \".\").concat(arr[0], \".\").concat(arr[1], \".\").concat(arr[2]), \"\".concat(arr[3], \".\").concat(arr[0], \".\").concat(arr[2], \".\").concat(arr[1]), \"\".concat(arr[3], \".\").concat(arr[1], \".\").concat(arr[0], \".\").concat(arr[2]), \"\".concat(arr[3], \".\").concat(arr[1], \".\").concat(arr[2], \".\").concat(arr[0]), \"\".concat(arr[3], \".\").concat(arr[2], \".\").concat(arr[0], \".\").concat(arr[1]), \"\".concat(arr[3], \".\").concat(arr[2], \".\").concat(arr[1], \".\").concat(arr[0])];\n }\n}\n\nvar classNameCombinations = {};\n\nfunction getClassNameCombinations(classNames) {\n if (classNames.length === 0 || classNames.length === 1) return classNames;\n var key = classNames.join('.');\n\n if (!classNameCombinations[key]) {\n classNameCombinations[key] = powerSetPermutations(classNames);\n }\n\n return classNameCombinations[key];\n}\n\nexport function createStyleObject(classNames) {\n var elementStyle = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : {};\n var stylesheet = arguments.length > 2 ? arguments[2] : undefined;\n var nonTokenClassNames = classNames.filter(function (className) {\n return className !== 'token';\n });\n var classNamesCombinations = getClassNameCombinations(nonTokenClassNames);\n return classNamesCombinations.reduce(function (styleObject, className) {\n return _objectSpread(_objectSpread({}, styleObject), stylesheet[className]);\n }, elementStyle);\n}\nexport function createClassNameString(classNames) {\n return classNames.join(' ');\n}\nexport function createChildren(stylesheet, useInlineStyles) {\n var childrenCount = 0;\n return function (children) {\n childrenCount += 1;\n return children.map(function (child, i) {\n return createElement({\n node: child,\n stylesheet: stylesheet,\n useInlineStyles: useInlineStyles,\n key: \"code-segment-\".concat(childrenCount, \"-\").concat(i)\n });\n });\n };\n}\nexport default function createElement(_ref) {\n var node = _ref.node,\n stylesheet = _ref.stylesheet,\n _ref$style = _ref.style,\n style = _ref$style === void 0 ? {} : _ref$style,\n useInlineStyles = _ref.useInlineStyles,\n key = _ref.key;\n var properties = node.properties,\n type = node.type,\n TagName = node.tagName,\n value = node.value;\n\n if (type === 'text') {\n return value;\n } else if (TagName) {\n var childrenCreator = createChildren(stylesheet, useInlineStyles);\n var props;\n\n if (!useInlineStyles) {\n props = _objectSpread(_objectSpread({}, properties), {}, {\n className: createClassNameString(properties.className)\n });\n } else {\n var allStylesheetSelectors = Object.keys(stylesheet).reduce(function (classes, selector) {\n selector.split('.').forEach(function (className) {\n if (!classes.includes(className)) classes.push(className);\n });\n return classes;\n }, []); // For compatibility with older versions of react-syntax-highlighter\n\n var startingClassName = properties.className && properties.className.includes('token') ? ['token'] : [];\n var className = properties.className && startingClassName.concat(properties.className.filter(function (className) {\n return !allStylesheetSelectors.includes(className);\n }));\n props = _objectSpread(_objectSpread({}, properties), {}, {\n className: createClassNameString(className) || undefined,\n style: createStyleObject(properties.className, Object.assign({}, properties.style, style), stylesheet)\n });\n }\n\n var children = childrenCreator(node.children);\n return /*#__PURE__*/React.createElement(TagName, _extends({\n key: key\n }, props), children);\n }\n}","export default (function (astGenerator, language) {\n var langs = astGenerator.listLanguages();\n return langs.indexOf(language) !== -1;\n});","import _objectWithoutProperties from \"@babel/runtime/helpers/objectWithoutProperties\";\nimport _toConsumableArray from \"@babel/runtime/helpers/toConsumableArray\";\nimport _defineProperty from \"@babel/runtime/helpers/defineProperty\";\nvar _excluded = [\"language\", \"children\", \"style\", \"customStyle\", \"codeTagProps\", \"useInlineStyles\", \"showLineNumbers\", \"showInlineLineNumbers\", \"startingLineNumber\", \"lineNumberContainerStyle\", \"lineNumberStyle\", \"wrapLines\", \"wrapLongLines\", \"lineProps\", \"renderer\", \"PreTag\", \"CodeTag\", \"code\", \"astGenerator\"];\n\nfunction ownKeys(object, enumerableOnly) { var keys = Object.keys(object); if (Object.getOwnPropertySymbols) { var symbols = Object.getOwnPropertySymbols(object); enumerableOnly && (symbols = symbols.filter(function (sym) { return Object.getOwnPropertyDescriptor(object, sym).enumerable; })), keys.push.apply(keys, symbols); } return keys; }\n\nfunction _objectSpread(target) { for (var i = 1; i < arguments.length; i++) { var source = null != arguments[i] ? arguments[i] : {}; i % 2 ? ownKeys(Object(source), !0).forEach(function (key) { _defineProperty(target, key, source[key]); }) : Object.getOwnPropertyDescriptors ? Object.defineProperties(target, Object.getOwnPropertyDescriptors(source)) : ownKeys(Object(source)).forEach(function (key) { Object.defineProperty(target, key, Object.getOwnPropertyDescriptor(source, key)); }); } return target; }\n\nimport React from 'react';\nimport createElement from './create-element';\nimport checkForListedLanguage from './checkForListedLanguage';\nvar newLineRegex = /\\n/g;\n\nfunction getNewLines(str) {\n return str.match(newLineRegex);\n}\n\nfunction getAllLineNumbers(_ref) {\n var lines = _ref.lines,\n startingLineNumber = _ref.startingLineNumber,\n style = _ref.style;\n return lines.map(function (_, i) {\n var number = i + startingLineNumber;\n return /*#__PURE__*/React.createElement(\"span\", {\n key: \"line-\".concat(i),\n className: \"react-syntax-highlighter-line-number\",\n style: typeof style === 'function' ? style(number) : style\n }, \"\".concat(number, \"\\n\"));\n });\n}\n\nfunction AllLineNumbers(_ref2) {\n var codeString = _ref2.codeString,\n codeStyle = _ref2.codeStyle,\n _ref2$containerStyle = _ref2.containerStyle,\n containerStyle = _ref2$containerStyle === void 0 ? {\n \"float\": 'left',\n paddingRight: '10px'\n } : _ref2$containerStyle,\n _ref2$numberStyle = _ref2.numberStyle,\n numberStyle = _ref2$numberStyle === void 0 ? {} : _ref2$numberStyle,\n startingLineNumber = _ref2.startingLineNumber;\n return /*#__PURE__*/React.createElement(\"code\", {\n style: Object.assign({}, codeStyle, containerStyle)\n }, getAllLineNumbers({\n lines: codeString.replace(/\\n$/, '').split('\\n'),\n style: numberStyle,\n startingLineNumber: startingLineNumber\n }));\n}\n\nfunction getEmWidthOfNumber(num) {\n return \"\".concat(num.toString().length, \".25em\");\n}\n\nfunction getInlineLineNumber(lineNumber, inlineLineNumberStyle) {\n return {\n type: 'element',\n tagName: 'span',\n properties: {\n key: \"line-number--\".concat(lineNumber),\n className: ['comment', 'linenumber', 'react-syntax-highlighter-line-number'],\n style: inlineLineNumberStyle\n },\n children: [{\n type: 'text',\n value: lineNumber\n }]\n };\n}\n\nfunction assembleLineNumberStyles(lineNumberStyle, lineNumber, largestLineNumber) {\n // minimally necessary styling for line numbers\n var defaultLineNumberStyle = {\n display: 'inline-block',\n minWidth: getEmWidthOfNumber(largestLineNumber),\n paddingRight: '1em',\n textAlign: 'right',\n userSelect: 'none'\n }; // prep custom styling\n\n var customLineNumberStyle = typeof lineNumberStyle === 'function' ? lineNumberStyle(lineNumber) : lineNumberStyle; // combine\n\n var assembledStyle = _objectSpread(_objectSpread({}, defaultLineNumberStyle), customLineNumberStyle);\n\n return assembledStyle;\n}\n\nfunction createLineElement(_ref3) {\n var children = _ref3.children,\n lineNumber = _ref3.lineNumber,\n lineNumberStyle = _ref3.lineNumberStyle,\n largestLineNumber = _ref3.largestLineNumber,\n showInlineLineNumbers = _ref3.showInlineLineNumbers,\n _ref3$lineProps = _ref3.lineProps,\n lineProps = _ref3$lineProps === void 0 ? {} : _ref3$lineProps,\n _ref3$className = _ref3.className,\n className = _ref3$className === void 0 ? [] : _ref3$className,\n showLineNumbers = _ref3.showLineNumbers,\n wrapLongLines = _ref3.wrapLongLines;\n var properties = typeof lineProps === 'function' ? lineProps(lineNumber) : lineProps;\n properties['className'] = className;\n\n if (lineNumber && showInlineLineNumbers) {\n var inlineLineNumberStyle = assembleLineNumberStyles(lineNumberStyle, lineNumber, largestLineNumber);\n children.unshift(getInlineLineNumber(lineNumber, inlineLineNumberStyle));\n }\n\n if (wrapLongLines & showLineNumbers) {\n properties.style = _objectSpread(_objectSpread({}, properties.style), {}, {\n display: 'flex'\n });\n }\n\n return {\n type: 'element',\n tagName: 'span',\n properties: properties,\n children: children\n };\n}\n\nfunction flattenCodeTree(tree) {\n var className = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : [];\n var newTree = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : [];\n\n for (var i = 0; i < tree.length; i++) {\n var node = tree[i];\n\n if (node.type === 'text') {\n newTree.push(createLineElement({\n children: [node],\n className: _toConsumableArray(new Set(className))\n }));\n } else if (node.children) {\n var classNames = className.concat(node.properties.className);\n flattenCodeTree(node.children, classNames).forEach(function (i) {\n return newTree.push(i);\n });\n }\n }\n\n return newTree;\n}\n\nfunction processLines(codeTree, wrapLines, lineProps, showLineNumbers, showInlineLineNumbers, startingLineNumber, largestLineNumber, lineNumberStyle, wrapLongLines) {\n var _ref4;\n\n var tree = flattenCodeTree(codeTree.value);\n var newTree = [];\n var lastLineBreakIndex = -1;\n var index = 0;\n\n function createWrappedLine(children, lineNumber) {\n var className = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : [];\n return createLineElement({\n children: children,\n lineNumber: lineNumber,\n lineNumberStyle: lineNumberStyle,\n largestLineNumber: largestLineNumber,\n showInlineLineNumbers: showInlineLineNumbers,\n lineProps: lineProps,\n className: className,\n showLineNumbers: showLineNumbers,\n wrapLongLines: wrapLongLines\n });\n }\n\n function createUnwrappedLine(children, lineNumber) {\n if (showLineNumbers && lineNumber && showInlineLineNumbers) {\n var inlineLineNumberStyle = assembleLineNumberStyles(lineNumberStyle, lineNumber, largestLineNumber);\n children.unshift(getInlineLineNumber(lineNumber, inlineLineNumberStyle));\n }\n\n return children;\n }\n\n function createLine(children, lineNumber) {\n var className = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : [];\n return wrapLines || className.length > 0 ? createWrappedLine(children, lineNumber, className) : createUnwrappedLine(children, lineNumber);\n }\n\n var _loop = function _loop() {\n var node = tree[index];\n var value = node.children[0].value;\n var newLines = getNewLines(value);\n\n if (newLines) {\n var splitValue = value.split('\\n');\n splitValue.forEach(function (text, i) {\n var lineNumber = showLineNumbers && newTree.length + startingLineNumber;\n var newChild = {\n type: 'text',\n value: \"\".concat(text, \"\\n\")\n }; // if it's the first line\n\n if (i === 0) {\n var _children = tree.slice(lastLineBreakIndex + 1, index).concat(createLineElement({\n children: [newChild],\n className: node.properties.className\n }));\n\n var _line = createLine(_children, lineNumber);\n\n newTree.push(_line); // if it's the last line\n } else if (i === splitValue.length - 1) {\n var stringChild = tree[index + 1] && tree[index + 1].children && tree[index + 1].children[0];\n var lastLineInPreviousSpan = {\n type: 'text',\n value: \"\".concat(text)\n };\n\n if (stringChild) {\n var newElem = createLineElement({\n children: [lastLineInPreviousSpan],\n className: node.properties.className\n });\n tree.splice(index + 1, 0, newElem);\n } else {\n var _children2 = [lastLineInPreviousSpan];\n\n var _line2 = createLine(_children2, lineNumber, node.properties.className);\n\n newTree.push(_line2);\n } // if it's neither the first nor the last line\n\n } else {\n var _children3 = [newChild];\n\n var _line3 = createLine(_children3, lineNumber, node.properties.className);\n\n newTree.push(_line3);\n }\n });\n lastLineBreakIndex = index;\n }\n\n index++;\n };\n\n while (index < tree.length) {\n _loop();\n }\n\n if (lastLineBreakIndex !== tree.length - 1) {\n var children = tree.slice(lastLineBreakIndex + 1, tree.length);\n\n if (children && children.length) {\n var lineNumber = showLineNumbers && newTree.length + startingLineNumber;\n var line = createLine(children, lineNumber);\n newTree.push(line);\n }\n }\n\n return wrapLines ? newTree : (_ref4 = []).concat.apply(_ref4, newTree);\n}\n\nfunction defaultRenderer(_ref5) {\n var rows = _ref5.rows,\n stylesheet = _ref5.stylesheet,\n useInlineStyles = _ref5.useInlineStyles;\n return rows.map(function (node, i) {\n return createElement({\n node: node,\n stylesheet: stylesheet,\n useInlineStyles: useInlineStyles,\n key: \"code-segement\".concat(i)\n });\n });\n} // only highlight.js has the highlightAuto method\n\n\nfunction isHighlightJs(astGenerator) {\n return astGenerator && typeof astGenerator.highlightAuto !== 'undefined';\n}\n\nfunction getCodeTree(_ref6) {\n var astGenerator = _ref6.astGenerator,\n language = _ref6.language,\n code = _ref6.code,\n defaultCodeValue = _ref6.defaultCodeValue;\n\n // figure out whether we're using lowlight/highlight or refractor/prism\n // then attempt highlighting accordingly\n // lowlight/highlight?\n if (isHighlightJs(astGenerator)) {\n var hasLanguage = checkForListedLanguage(astGenerator, language);\n\n if (language === 'text') {\n return {\n value: defaultCodeValue,\n language: 'text'\n };\n } else if (hasLanguage) {\n return astGenerator.highlight(language, code);\n } else {\n return astGenerator.highlightAuto(code);\n }\n } // must be refractor/prism, then\n\n\n try {\n return language && language !== 'text' ? {\n value: astGenerator.highlight(code, language)\n } : {\n value: defaultCodeValue\n };\n } catch (e) {\n return {\n value: defaultCodeValue\n };\n }\n}\n\nexport default function (defaultAstGenerator, defaultStyle) {\n return function SyntaxHighlighter(_ref7) {\n var language = _ref7.language,\n children = _ref7.children,\n _ref7$style = _ref7.style,\n style = _ref7$style === void 0 ? defaultStyle : _ref7$style,\n _ref7$customStyle = _ref7.customStyle,\n customStyle = _ref7$customStyle === void 0 ? {} : _ref7$customStyle,\n _ref7$codeTagProps = _ref7.codeTagProps,\n codeTagProps = _ref7$codeTagProps === void 0 ? {\n className: language ? \"language-\".concat(language) : undefined,\n style: _objectSpread(_objectSpread({}, style['code[class*=\"language-\"]']), style[\"code[class*=\\\"language-\".concat(language, \"\\\"]\")])\n } : _ref7$codeTagProps,\n _ref7$useInlineStyles = _ref7.useInlineStyles,\n useInlineStyles = _ref7$useInlineStyles === void 0 ? true : _ref7$useInlineStyles,\n _ref7$showLineNumbers = _ref7.showLineNumbers,\n showLineNumbers = _ref7$showLineNumbers === void 0 ? false : _ref7$showLineNumbers,\n _ref7$showInlineLineN = _ref7.showInlineLineNumbers,\n showInlineLineNumbers = _ref7$showInlineLineN === void 0 ? true : _ref7$showInlineLineN,\n _ref7$startingLineNum = _ref7.startingLineNumber,\n startingLineNumber = _ref7$startingLineNum === void 0 ? 1 : _ref7$startingLineNum,\n lineNumberContainerStyle = _ref7.lineNumberContainerStyle,\n _ref7$lineNumberStyle = _ref7.lineNumberStyle,\n lineNumberStyle = _ref7$lineNumberStyle === void 0 ? {} : _ref7$lineNumberStyle,\n wrapLines = _ref7.wrapLines,\n _ref7$wrapLongLines = _ref7.wrapLongLines,\n wrapLongLines = _ref7$wrapLongLines === void 0 ? false : _ref7$wrapLongLines,\n _ref7$lineProps = _ref7.lineProps,\n lineProps = _ref7$lineProps === void 0 ? {} : _ref7$lineProps,\n renderer = _ref7.renderer,\n _ref7$PreTag = _ref7.PreTag,\n PreTag = _ref7$PreTag === void 0 ? 'pre' : _ref7$PreTag,\n _ref7$CodeTag = _ref7.CodeTag,\n CodeTag = _ref7$CodeTag === void 0 ? 'code' : _ref7$CodeTag,\n _ref7$code = _ref7.code,\n code = _ref7$code === void 0 ? (Array.isArray(children) ? children[0] : children) || '' : _ref7$code,\n astGenerator = _ref7.astGenerator,\n rest = _objectWithoutProperties(_ref7, _excluded);\n\n astGenerator = astGenerator || defaultAstGenerator;\n var allLineNumbers = showLineNumbers ? /*#__PURE__*/React.createElement(AllLineNumbers, {\n containerStyle: lineNumberContainerStyle,\n codeStyle: codeTagProps.style || {},\n numberStyle: lineNumberStyle,\n startingLineNumber: startingLineNumber,\n codeString: code\n }) : null;\n var defaultPreStyle = style.hljs || style['pre[class*=\"language-\"]'] || {\n backgroundColor: '#fff'\n };\n var generatorClassName = isHighlightJs(astGenerator) ? 'hljs' : 'prismjs';\n var preProps = useInlineStyles ? Object.assign({}, rest, {\n style: Object.assign({}, defaultPreStyle, customStyle)\n }) : Object.assign({}, rest, {\n className: rest.className ? \"\".concat(generatorClassName, \" \").concat(rest.className) : generatorClassName,\n style: Object.assign({}, customStyle)\n });\n\n if (wrapLongLines) {\n codeTagProps.style = _objectSpread(_objectSpread({}, codeTagProps.style), {}, {\n whiteSpace: 'pre-wrap'\n });\n } else {\n codeTagProps.style = _objectSpread(_objectSpread({}, codeTagProps.style), {}, {\n whiteSpace: 'pre'\n });\n }\n\n if (!astGenerator) {\n return /*#__PURE__*/React.createElement(PreTag, preProps, allLineNumbers, /*#__PURE__*/React.createElement(CodeTag, codeTagProps, code));\n }\n /*\n * Some custom renderers rely on individual row elements so we need to turn wrapLines on\n * if renderer is provided and wrapLines is undefined.\n */\n\n\n if (wrapLines === undefined && renderer || wrapLongLines) wrapLines = true;\n renderer = renderer || defaultRenderer;\n var defaultCodeValue = [{\n type: 'text',\n value: code\n }];\n var codeTree = getCodeTree({\n astGenerator: astGenerator,\n language: language,\n code: code,\n defaultCodeValue: defaultCodeValue\n });\n\n if (codeTree.language === null) {\n codeTree.value = defaultCodeValue;\n } // determine largest line number so that we can force minWidth on all linenumber elements\n\n\n var largestLineNumber = codeTree.value.length + startingLineNumber;\n var rows = processLines(codeTree, wrapLines, lineProps, showLineNumbers, showInlineLineNumbers, startingLineNumber, largestLineNumber, lineNumberStyle, wrapLongLines);\n return /*#__PURE__*/React.createElement(PreTag, preProps, /*#__PURE__*/React.createElement(CodeTag, codeTagProps, !showInlineLineNumbers && allLineNumbers, renderer({\n rows: rows,\n stylesheet: style,\n useInlineStyles: useInlineStyles\n })));\n };\n}","import _asyncToGenerator from \"@babel/runtime/helpers/asyncToGenerator\";\nimport _extends from \"@babel/runtime/helpers/extends\";\nimport _classCallCheck from \"@babel/runtime/helpers/classCallCheck\";\nimport _createClass from \"@babel/runtime/helpers/createClass\";\nimport _inherits from \"@babel/runtime/helpers/inherits\";\nimport _possibleConstructorReturn from \"@babel/runtime/helpers/possibleConstructorReturn\";\nimport _getPrototypeOf from \"@babel/runtime/helpers/getPrototypeOf\";\nimport _defineProperty from \"@babel/runtime/helpers/defineProperty\";\nimport _regeneratorRuntime from \"@babel/runtime/regenerator\";\n\nfunction _createSuper(Derived) { var hasNativeReflectConstruct = _isNativeReflectConstruct(); return function _createSuperInternal() { var Super = _getPrototypeOf(Derived), result; if (hasNativeReflectConstruct) { var NewTarget = _getPrototypeOf(this).constructor; result = Reflect.construct(Super, arguments, NewTarget); } else { result = Super.apply(this, arguments); } return _possibleConstructorReturn(this, result); }; }\n\nfunction _isNativeReflectConstruct() { if (typeof Reflect === \"undefined\" || !Reflect.construct) return false; if (Reflect.construct.sham) return false; if (typeof Proxy === \"function\") return true; try { Boolean.prototype.valueOf.call(Reflect.construct(Boolean, [], function () {})); return true; } catch (e) { return false; } }\n\nimport React from 'react';\nimport highlight from './highlight';\nexport default (function (options) {\n var loader = options.loader,\n isLanguageRegistered = options.isLanguageRegistered,\n registerLanguage = options.registerLanguage,\n languageLoaders = options.languageLoaders,\n noAsyncLoadingLanguages = options.noAsyncLoadingLanguages;\n\n var ReactAsyncHighlighter = /*#__PURE__*/function (_React$PureComponent) {\n _inherits(ReactAsyncHighlighter, _React$PureComponent);\n\n var _super = _createSuper(ReactAsyncHighlighter);\n\n function ReactAsyncHighlighter() {\n _classCallCheck(this, ReactAsyncHighlighter);\n\n return _super.apply(this, arguments);\n }\n\n _createClass(ReactAsyncHighlighter, [{\n key: \"componentDidUpdate\",\n value: function componentDidUpdate() {\n if (!ReactAsyncHighlighter.isRegistered(this.props.language) && languageLoaders) {\n this.loadLanguage();\n }\n }\n }, {\n key: \"componentDidMount\",\n value: function componentDidMount() {\n var _this = this;\n\n if (!ReactAsyncHighlighter.astGeneratorPromise) {\n ReactAsyncHighlighter.loadAstGenerator();\n }\n\n if (!ReactAsyncHighlighter.astGenerator) {\n ReactAsyncHighlighter.astGeneratorPromise.then(function () {\n _this.forceUpdate();\n });\n }\n\n if (!ReactAsyncHighlighter.isRegistered(this.props.language) && languageLoaders) {\n this.loadLanguage();\n }\n }\n }, {\n key: \"loadLanguage\",\n value: function loadLanguage() {\n var _this2 = this;\n\n var language = this.props.language;\n\n if (language === 'text') {\n return;\n }\n\n ReactAsyncHighlighter.loadLanguage(language).then(function () {\n return _this2.forceUpdate();\n })[\"catch\"](function () {});\n }\n }, {\n key: \"normalizeLanguage\",\n value: function normalizeLanguage(language) {\n return ReactAsyncHighlighter.isSupportedLanguage(language) ? language : 'text';\n }\n }, {\n key: \"render\",\n value: function render() {\n return /*#__PURE__*/React.createElement(ReactAsyncHighlighter.highlightInstance, _extends({}, this.props, {\n language: this.normalizeLanguage(this.props.language),\n astGenerator: ReactAsyncHighlighter.astGenerator\n }));\n }\n }], [{\n key: \"preload\",\n value: function preload() {\n return ReactAsyncHighlighter.loadAstGenerator();\n }\n }, {\n key: \"loadLanguage\",\n value: function () {\n var _loadLanguage = _asyncToGenerator( /*#__PURE__*/_regeneratorRuntime.mark(function _callee(language) {\n var languageLoader;\n return _regeneratorRuntime.wrap(function _callee$(_context) {\n while (1) {\n switch (_context.prev = _context.next) {\n case 0:\n languageLoader = languageLoaders[language];\n\n if (!(typeof languageLoader === 'function')) {\n _context.next = 5;\n break;\n }\n\n return _context.abrupt(\"return\", languageLoader(ReactAsyncHighlighter.registerLanguage));\n\n case 5:\n throw new Error(\"Language \".concat(language, \" not supported\"));\n\n case 6:\n case \"end\":\n return _context.stop();\n }\n }\n }, _callee);\n }));\n\n function loadLanguage(_x) {\n return _loadLanguage.apply(this, arguments);\n }\n\n return loadLanguage;\n }()\n }, {\n key: \"isSupportedLanguage\",\n value: function isSupportedLanguage(language) {\n return ReactAsyncHighlighter.isRegistered(language) || typeof languageLoaders[language] === 'function';\n }\n }, {\n key: \"loadAstGenerator\",\n value: function loadAstGenerator() {\n ReactAsyncHighlighter.astGeneratorPromise = loader().then(function (astGenerator) {\n ReactAsyncHighlighter.astGenerator = astGenerator;\n\n if (registerLanguage) {\n ReactAsyncHighlighter.languages.forEach(function (language, name) {\n return registerLanguage(astGenerator, name, language);\n });\n }\n });\n return ReactAsyncHighlighter.astGeneratorPromise;\n }\n }]);\n\n return ReactAsyncHighlighter;\n }(React.PureComponent);\n\n _defineProperty(ReactAsyncHighlighter, \"astGenerator\", null);\n\n _defineProperty(ReactAsyncHighlighter, \"highlightInstance\", highlight(null, {}));\n\n _defineProperty(ReactAsyncHighlighter, \"astGeneratorPromise\", null);\n\n _defineProperty(ReactAsyncHighlighter, \"languages\", new Map());\n\n _defineProperty(ReactAsyncHighlighter, \"supportedLanguages\", options.supportedLanguages || Object.keys(languageLoaders || {}));\n\n _defineProperty(ReactAsyncHighlighter, \"isRegistered\", function (language) {\n if (noAsyncLoadingLanguages) {\n return true;\n }\n\n if (!registerLanguage) {\n throw new Error(\"Current syntax highlighter doesn't support registration of languages\");\n }\n\n if (!ReactAsyncHighlighter.astGenerator) {\n // Ast generator not available yet, but language will be registered once it is.\n return ReactAsyncHighlighter.languages.has(language);\n }\n\n return isLanguageRegistered(ReactAsyncHighlighter.astGenerator, language);\n });\n\n _defineProperty(ReactAsyncHighlighter, \"registerLanguage\", function (name, language) {\n if (!registerLanguage) {\n throw new Error(\"Current syntax highlighter doesn't support registration of languages\");\n }\n\n if (ReactAsyncHighlighter.astGenerator) {\n return registerLanguage(ReactAsyncHighlighter.astGenerator, name, language);\n } else {\n ReactAsyncHighlighter.languages.set(name, language);\n }\n });\n\n return ReactAsyncHighlighter;\n});","import createAsyncLoadingHighlighter from './async-syntax-highlighter';\nimport supportedLanguages from './languages/prism/supported-languages';\nexport default createAsyncLoadingHighlighter({\n loader: function loader() {\n return import(\n /* webpackChunkName:\"react-syntax-highlighter/refractor-import\" */\n 'refractor').then(function (module) {\n // Webpack 3 returns module.exports as default as module, but webpack 4 returns module.exports as module.default\n return module[\"default\"] || module;\n });\n },\n noAsyncLoadingLanguages: true,\n supportedLanguages: supportedLanguages\n});","//\n// This file has been auto-generated by the `npm run build-languages-prism` task\n//\nexport default ['abap', 'abnf', 'actionscript', 'ada', 'agda', 'al', 'antlr4', 'apacheconf', 'apex', 'apl', 'applescript', 'aql', 'arduino', 'arff', 'asciidoc', 'asm6502', 'asmatmel', 'aspnet', 'autohotkey', 'autoit', 'avisynth', 'avro-idl', 'bash', 'basic', 'batch', 'bbcode', 'bicep', 'birb', 'bison', 'bnf', 'brainfuck', 'brightscript', 'bro', 'bsl', 'c', 'cfscript', 'chaiscript', 'cil', 'clike', 'clojure', 'cmake', 'cobol', 'coffeescript', 'concurnas', 'coq', 'cpp', 'crystal', 'csharp', 'cshtml', 'csp', 'css-extras', 'css', 'csv', 'cypher', 'd', 'dart', 'dataweave', 'dax', 'dhall', 'diff', 'django', 'dns-zone-file', 'docker', 'dot', 'ebnf', 'editorconfig', 'eiffel', 'ejs', 'elixir', 'elm', 'erb', 'erlang', 'etlua', 'excel-formula', 'factor', 'false', 'firestore-security-rules', 'flow', 'fortran', 'fsharp', 'ftl', 'gap', 'gcode', 'gdscript', 'gedcom', 'gherkin', 'git', 'glsl', 'gml', 'gn', 'go-module', 'go', 'graphql', 'groovy', 'haml', 'handlebars', 'haskell', 'haxe', 'hcl', 'hlsl', 'hoon', 'hpkp', 'hsts', 'http', 'ichigojam', 'icon', 'icu-message-format', 'idris', 'iecst', 'ignore', 'inform7', 'ini', 'io', 'j', 'java', 'javadoc', 'javadoclike', 'javascript', 'javastacktrace', 'jexl', 'jolie', 'jq', 'js-extras', 'js-templates', 'jsdoc', 'json', 'json5', 'jsonp', 'jsstacktrace', 'jsx', 'julia', 'keepalived', 'keyman', 'kotlin', 'kumir', 'kusto', 'latex', 'latte', 'less', 'lilypond', 'liquid', 'lisp', 'livescript', 'llvm', 'log', 'lolcode', 'lua', 'magma', 'makefile', 'markdown', 'markup-templating', 'markup', 'matlab', 'maxscript', 'mel', 'mermaid', 'mizar', 'mongodb', 'monkey', 'moonscript', 'n1ql', 'n4js', 'nand2tetris-hdl', 'naniscript', 'nasm', 'neon', 'nevod', 'nginx', 'nim', 'nix', 'nsis', 'objectivec', 'ocaml', 'opencl', 'openqasm', 'oz', 'parigp', 'parser', 'pascal', 'pascaligo', 'pcaxis', 'peoplecode', 'perl', 'php-extras', 'php', 'phpdoc', 'plsql', 'powerquery', 'powershell', 'processing', 'prolog', 'promql', 'properties', 'protobuf', 'psl', 'pug', 'puppet', 'pure', 'purebasic', 'purescript', 'python', 'q', 'qml', 'qore', 'qsharp', 'r', 'racket', 'reason', 'regex', 'rego', 'renpy', 'rest', 'rip', 'roboconf', 'robotframework', 'ruby', 'rust', 'sas', 'sass', 'scala', 'scheme', 'scss', 'shell-session', 'smali', 'smalltalk', 'smarty', 'sml', 'solidity', 'solution-file', 'soy', 'sparql', 'splunk-spl', 'sqf', 'sql', 'squirrel', 'stan', 'stylus', 'swift', 'systemd', 't4-cs', 't4-templating', 't4-vb', 'tap', 'tcl', 'textile', 'toml', 'tremor', 'tsx', 'tt2', 'turtle', 'twig', 'typescript', 'typoscript', 'unrealscript', 'uorazor', 'uri', 'v', 'vala', 'vbnet', 'velocity', 'verilog', 'vhdl', 'vim', 'visual-basic', 'warpscript', 'wasm', 'web-idl', 'wiki', 'wolfram', 'wren', 'xeora', 'xml-doc', 'xojo', 'xquery', 'yaml', 'yang', 'zig'];","import objectWithoutPropertiesLoose from \"./objectWithoutPropertiesLoose.js\";\nexport default function _objectWithoutProperties(source, excluded) {\n if (source == null) return {};\n var target = objectWithoutPropertiesLoose(source, excluded);\n var key, i;\n\n if (Object.getOwnPropertySymbols) {\n var sourceSymbolKeys = Object.getOwnPropertySymbols(source);\n\n for (i = 0; i < sourceSymbolKeys.length; i++) {\n key = sourceSymbolKeys[i];\n if (excluded.indexOf(key) >= 0) continue;\n if (!Object.prototype.propertyIsEnumerable.call(source, key)) continue;\n target[key] = source[key];\n }\n }\n\n return target;\n}","export default function _objectWithoutPropertiesLoose(source, excluded) {\n if (source == null) return {};\n var target = {};\n var sourceKeys = Object.keys(source);\n var key, i;\n\n for (i = 0; i < sourceKeys.length; i++) {\n key = sourceKeys[i];\n if (excluded.indexOf(key) >= 0) continue;\n target[key] = source[key];\n }\n\n return target;\n}","import _objectWithoutProperties from \"@babel/runtime/helpers/objectWithoutProperties\";\nvar _excluded = [\"children\"];\nimport React, { createContext, useCallback, useContext } from 'react';\n\n/**\n * createTheme is used to create a set of Providers and Consumers for theming components.\n * - Takes a default theme function; this theme function gets a set of props, and returns tokens\n * based on those props. An example of this default theme function is one that produces the standard\n * appearance of the component\n * - Returns three things - a Provider that allow for additional themes to be applied, a Consumer\n * that can get the current theme and fetch it, and a custom hook - useTheme which provides an alternate (although functionally the same) API\n * to the Consumer.\n */\nexport function createTheme(defaultGetTokens) {\n var emptyThemeFn = function emptyThemeFn(getTokens, props) {\n return getTokens(props);\n };\n /**\n * Internally, Theme uses React Context, with internal providers and consumers.\n * The React Context passes only a function that gets props, and turns them into tokens. This\n * function gets mixed as more Providers with their own themes are added. This mixed function\n * is ultimately picked up by Consumers, which implement a context consumer internally to fetch\n * the theme.\n */\n\n\n var ThemeContext = /*#__PURE__*/createContext(defaultGetTokens);\n\n function useTheme(themeProps) {\n var theme = useContext(ThemeContext);\n var themeFn = theme || emptyThemeFn;\n var tokens = themeFn(themeProps);\n return tokens;\n } // The Theme Consumer takes a function as its child - this function takes tokens, and the\n // return value is generally a set of nodes with the tokens applied appropriately.\n\n\n function Consumer(props) {\n var children = props.children,\n themeProps = _objectWithoutProperties(props, _excluded); // @ts-ignore See issue for more info: https://github.com/Microsoft/TypeScript/issues/10727\n // Argument of type 'Pick ReactNode; }, Exclude>' is not assignable to parameter of type 'ThemeProps'.ts(2345)\n\n\n var tokens = useTheme(themeProps); // We add a fragment to ensure we don't break people upgrading.\n // Previously they may have been able to pass in undefined without things blowing up.\n\n return /*#__PURE__*/React.createElement(React.Fragment, null, children(tokens));\n }\n /**\n * The Theme Provider takes regular nodes as its children, but also takes a *theme function*\n * - The theme function takes a set of props, as well as a function (getTokens) that can turn props into tokens.\n * - The getTokens function isn't called immediately - instead the props are passed\n * through a mix of parent theming functions\n * Children of this provider will receive this mixed theme\n */\n\n\n function Provider(props) {\n var themeFn = useContext(ThemeContext);\n var valueFn = props.value || emptyThemeFn;\n var mixedFn = useCallback(function (themeProps) {\n return valueFn(themeFn, themeProps);\n }, [themeFn, valueFn]);\n return /*#__PURE__*/React.createElement(ThemeContext.Provider, {\n value: mixedFn\n }, props.children);\n }\n\n return {\n Consumer: Consumer,\n Provider: Provider,\n useTheme: useTheme\n };\n}","import { createTheme } from '../utils/create-theme'; // Create default global light theme\n\nvar _createTheme = createTheme(function () {\n return {\n mode: 'light'\n };\n}),\n Provider = _createTheme.Provider,\n Consumer = _createTheme.Consumer,\n useTheme = _createTheme.useTheme;\n\nexport { useTheme as useGlobalTheme };\nexport default {\n Provider: Provider,\n Consumer: Consumer\n};","export default function _arrayLikeToArray(arr, len) {\n if (len == null || len > arr.length) len = arr.length;\n\n for (var i = 0, arr2 = new Array(len); i < len; i++) {\n arr2[i] = arr[i];\n }\n\n return arr2;\n}","import arrayLikeToArray from \"./arrayLikeToArray.js\";\nexport default function _unsupportedIterableToArray(o, minLen) {\n if (!o) return;\n if (typeof o === \"string\") return arrayLikeToArray(o, minLen);\n var n = Object.prototype.toString.call(o).slice(8, -1);\n if (n === \"Object\" && o.constructor) n = o.constructor.name;\n if (n === \"Map\" || n === \"Set\") return Array.from(o);\n if (n === \"Arguments\" || /^(?:Ui|I)nt(?:8|16|32)(?:Clamped)?Array$/.test(n)) return arrayLikeToArray(o, minLen);\n}","import arrayWithHoles from \"./arrayWithHoles.js\";\nimport iterableToArrayLimit from \"./iterableToArrayLimit.js\";\nimport unsupportedIterableToArray from \"./unsupportedIterableToArray.js\";\nimport nonIterableRest from \"./nonIterableRest.js\";\nexport default function _slicedToArray(arr, i) {\n return arrayWithHoles(arr) || iterableToArrayLimit(arr, i) || unsupportedIterableToArray(arr, i) || nonIterableRest();\n}","export default function _arrayWithHoles(arr) {\n if (Array.isArray(arr)) return arr;\n}","export default function _iterableToArrayLimit(arr, i) {\n if (typeof Symbol === \"undefined\" || !(Symbol.iterator in Object(arr))) return;\n var _arr = [];\n var _n = true;\n var _d = false;\n var _e = undefined;\n\n try {\n for (var _i = arr[Symbol.iterator](), _s; !(_n = (_s = _i.next()).done); _n = true) {\n _arr.push(_s.value);\n\n if (i && _arr.length === i) break;\n }\n } catch (err) {\n _d = true;\n _e = err;\n } finally {\n try {\n if (!_n && _i[\"return\"] != null) _i[\"return\"]();\n } finally {\n if (_d) throw _e;\n }\n }\n\n return _arr;\n}","export default function _nonIterableRest() {\n throw new TypeError(\"Invalid attempt to destructure non-iterable instance.\\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method.\");\n}","export default function _defineProperty(obj, key, value) {\n if (key in obj) {\n Object.defineProperty(obj, key, {\n value: value,\n enumerable: true,\n configurable: true,\n writable: true\n });\n } else {\n obj[key] = value;\n }\n\n return obj;\n}","import _slicedToArray from \"@babel/runtime/helpers/slicedToArray\";\nimport _defineProperty from \"@babel/runtime/helpers/defineProperty\";\n\nfunction ownKeys(object, enumerableOnly) { var keys = Object.keys(object); if (Object.getOwnPropertySymbols) { var symbols = Object.getOwnPropertySymbols(object); enumerableOnly && (symbols = symbols.filter(function (sym) { return Object.getOwnPropertyDescriptor(object, sym).enumerable; })), keys.push.apply(keys, symbols); } return keys; }\n\nfunction _objectSpread(target) { for (var i = 1; i < arguments.length; i++) { var source = null != arguments[i] ? arguments[i] : {}; i % 2 ? ownKeys(Object(source), !0).forEach(function (key) { _defineProperty(target, key, source[key]); }) : Object.getOwnPropertyDescriptors ? Object.defineProperties(target, Object.getOwnPropertyDescriptors(source)) : ownKeys(Object(source)).forEach(function (key) { Object.defineProperty(target, key, Object.getOwnPropertyDescriptor(source, key)); }); } return target; }\n\nimport { useCallback, useMemo } from 'react';\nvar DEFAULT_LINE_EL_ATTR_OBJ = {\n 'data-ds--code--row': ''\n};\n\nvar getLineStyleObject = function getLineStyleObject(lineNumber, testId) {\n return testId ? _objectSpread({\n 'data-testid': \"\".concat(testId, \"-line-\").concat(lineNumber)\n }, DEFAULT_LINE_EL_ATTR_OBJ) : DEFAULT_LINE_EL_ATTR_OBJ;\n};\n\nexport var useHighlightLines = function useHighlightLines(_ref) {\n var _ref$highlight = _ref.highlight,\n highlight = _ref$highlight === void 0 ? '' : _ref$highlight,\n testId = _ref.testId;\n var highlightedLines = useMemo(function () {\n if (!highlight) {\n return [];\n }\n\n return highlight.split(',').map(function (num) {\n if (num.indexOf('-') > 0) {\n // We found a line group, e.g. 1-3\n var _num$split$map$sort = num.split('-').map(Number) // Sort by lowest value first, highest value last.\n .sort(function (a, b) {\n return a - b;\n }),\n _num$split$map$sort2 = _slicedToArray(_num$split$map$sort, 2),\n from = _num$split$map$sort2[0],\n to = _num$split$map$sort2[1];\n\n return Array(to + 1).fill(undefined).map(function (_, index) {\n return index;\n }).slice(from, to + 1);\n }\n\n return Number(num);\n }).reduce(function (acc, val) {\n return acc.concat(val);\n }, []) || [];\n }, [highlight]);\n var getHighlightStyles = useCallback(function (lineNumber, highlightedLines) {\n if (!highlight || highlightedLines.length === 0) {\n return getLineStyleObject(lineNumber, testId);\n }\n\n if (highlightedLines.includes(lineNumber)) {\n var highlightedDataAttrObj = {\n 'data-ds--code--row--highlight': ''\n };\n return _objectSpread(_objectSpread({}, highlightedDataAttrObj), getLineStyleObject(lineNumber, testId));\n }\n\n return getLineStyleObject(lineNumber, testId);\n }, [highlight, testId]);\n return {\n getHighlightStyles: getHighlightStyles,\n highlightedLines: highlightedLines\n };\n};","import deprecationWarning from '@atlaskit/ds-lib/deprecation-warning';\nimport { B100, N30A, skeleton as skeletonColor } from './colors';\nexport var CHANNEL = '__ATLASKIT_THEME__';\nexport var DEFAULT_THEME_MODE = 'light';\nexport var THEME_MODES = ['light', 'dark'];\n/*\n These theme values are expressed as functions so that if we decide to make\n them dependent on props in the future, it wouldn't require a significant\n refactor everywhere they are being used.\n*/\n\nexport var borderRadius = function borderRadius() {\n return 3;\n};\nexport var gridSize = function gridSize() {\n return 8;\n};\nexport var fontSize = function fontSize() {\n return 14;\n};\nexport var fontSizeSmall = function fontSizeSmall() {\n return 11;\n};\nexport var fontFamily = function fontFamily() {\n return \"-apple-system, BlinkMacSystemFont, 'Segoe UI', 'Roboto', 'Oxygen', 'Ubuntu', 'Fira Sans', 'Droid Sans', 'Helvetica Neue', sans-serif\";\n};\nexport var codeFontFamily = function codeFontFamily() {\n return \"'SFMono-Medium', 'SF Mono', 'Segoe UI Mono', 'Roboto Mono', 'Ubuntu Mono', Menlo, Consolas, Courier, monospace\";\n};\n/**\n * @deprecated Please use `@atlaskit/focus-ring`\n */\n\nexport var focusRing = function focusRing() {\n var color = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : \"var(--ds-border-focused, \".concat(B100, \")\");\n var outlineWidth = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : gridSize() / 4;\n deprecationWarning('@atlaskit/theme', 'focus ring mixin', 'Please use `@atlaskit/focus-ring` instead.');\n return \"\\n &:focus {\\n outline: none;\\n box-shadow: 0px 0px 0px \".concat(outlineWidth, \"px \").concat(color, \";\\n }\\n\");\n};\n/**\n * @deprecated Please use `@atlaskit/focus-ring`\n */\n\nexport var noFocusRing = function noFocusRing() {\n return \"\\n box-shadow: none;\\n\";\n};\nexport var layers = {\n card: function card() {\n return 100;\n },\n navigation: function navigation() {\n return 200;\n },\n dialog: function dialog() {\n return 300;\n },\n layer: function layer() {\n return 400;\n },\n blanket: function blanket() {\n return 500;\n },\n modal: function modal() {\n return 510;\n },\n flag: function flag() {\n return 600;\n },\n spotlight: function spotlight() {\n return 700;\n },\n tooltip: function tooltip() {\n return 800;\n }\n}; // eslint-disable-next-line @atlaskit/design-system/use-visually-hidden\n\n/**\n * @deprecated Please use `@atlaskit/visually-hidden`\n */\n\nexport var visuallyHidden = function visuallyHidden() {\n deprecationWarning('@atlaskit/theme', 'visually hidden mixin', 'Please use `@atlaskit/visually-hidden` instead.');\n return {\n border: '0 !important',\n clip: 'rect(1px, 1px, 1px, 1px) !important',\n height: '1px !important',\n overflow: 'hidden !important',\n padding: '0 !important',\n position: 'absolute !important',\n width: '1px !important',\n whiteSpace: 'nowrap !important'\n };\n};\n/**\n * @deprecated Please use `@atlaskit/visually-hidden`\n */\n\nexport var assistive = visuallyHidden;\n/**\n * These styles are mirrored in:\n * packages/design-system/menu/src/internal/components/skeleton-shimmer.tsx\n *\n * Please update both.\n */\n\nexport var skeletonShimmer = function skeletonShimmer() {\n return {\n css: {\n backgroundColor: \"var(--ds-skeleton, \".concat(skeletonColor(), \")\"),\n animationDuration: '1.5s',\n animationIterationCount: 'infinite',\n animationTimingFunction: 'linear',\n animationDirection: 'alternate'\n },\n keyframes: {\n from: {\n backgroundColor: \"var(--ds-skeleton, \".concat(skeletonColor(), \")\")\n },\n to: {\n backgroundColor: \"var(--ds-skeleton-subtle, \".concat(N30A, \")\")\n }\n }\n };\n};","import { gridSize } from '@atlaskit/theme/constants';\nexport var CODE_FONT_SIZE = 12;\nexport var CODE_LINE_HEIGHT = '20px';\nexport var HIGHLIGHT_BORDER_WIDTH = '4px';\nexport var SPACING = gridSize();\nexport var LINE_NUMBER_GUTTER = SPACING * 2;\nexport var VAR_CODE_LINE_NUMBER_BG_COLOR = '--ds--code--line-number-bg-color';\nexport var VAR_CODE_BG_COLOR = '--ds--code--bg-color'; // selector for codeblock\n\nexport var CODE_BLOCK_SELECTOR = \"data-ds--code--code-block\";","import { CHANNEL, DEFAULT_THEME_MODE, THEME_MODES } from '../constants';\n// Resolves the different types of theme objects in the current API\nexport default function getTheme(props) {\n if (props && props.theme) {\n // Theme is the global Atlaskit theme\n if (CHANNEL in props.theme) {\n return props.theme[CHANNEL];\n } // User has provided alternative modes\n else if ('mode' in props.theme && THEME_MODES.includes(props.theme.mode)) {\n return props.theme;\n }\n } // If format not supported (or no theme provided), return standard theme\n\n\n return {\n mode: DEFAULT_THEME_MODE\n };\n}","/* eslint-disable prefer-rest-params */\nimport getTheme from './get-theme';\n\n// Unpack custom variants, and get correct value for the current theme\nfunction themedVariants(variantProp, variants) {\n return function (props) {\n var theme = getTheme(props);\n\n if (props && props[variantProp] && variants) {\n var modes = variants[props[variantProp]];\n\n if (modes && modes[theme.mode]) {\n var value = modes[theme.mode];\n\n if (value) {\n return value;\n } // TS believes value can be undefined\n\n }\n }\n\n return '';\n };\n}\n\nexport default function themed(modesOrVariant, variantModes) {\n if (typeof modesOrVariant === 'string') {\n return themedVariants(modesOrVariant, variantModes);\n }\n\n var modes = modesOrVariant;\n return function (props) {\n // Get theme from the user's props\n var theme = getTheme(props); // User isn't required to provide both light and dark values\n\n if (theme.mode in modes) {\n var value = modes[theme.mode]; // TS believes value can be undefined\n\n if (value) {\n return value;\n }\n }\n\n return '';\n };\n}","/* eslint-disable @atlaskit/design-system/ensure-design-token-usage */\nimport themed from './utils/themed'; // Reds\n\nexport var R50 = '#FFEBE6';\nexport var R75 = '#FFBDAD';\nexport var R100 = '#FF8F73';\nexport var R200 = '#FF7452';\nexport var R300 = '#FF5630';\nexport var R400 = '#DE350B';\nexport var R500 = '#BF2600'; // Yellows\n\nexport var Y50 = '#FFFAE6';\nexport var Y75 = '#FFF0B3';\nexport var Y100 = '#FFE380';\nexport var Y200 = '#FFC400';\nexport var Y300 = '#FFAB00';\nexport var Y400 = '#FF991F';\nexport var Y500 = '#FF8B00'; // Greens\n\nexport var G50 = '#E3FCEF';\nexport var G75 = '#ABF5D1';\nexport var G100 = '#79F2C0';\nexport var G200 = '#57D9A3';\nexport var G300 = '#36B37E';\nexport var G400 = '#00875A';\nexport var G500 = '#006644'; // Blues\n\nexport var B50 = '#DEEBFF';\nexport var B75 = '#B3D4FF';\nexport var B100 = '#4C9AFF';\nexport var B200 = '#2684FF';\nexport var B300 = '#0065FF';\nexport var B400 = '#0052CC';\nexport var B500 = '#0747A6'; // Purples\n\nexport var P50 = '#EAE6FF';\nexport var P75 = '#C0B6F2';\nexport var P100 = '#998DD9';\nexport var P200 = '#8777D9';\nexport var P300 = '#6554C0';\nexport var P400 = '#5243AA';\nexport var P500 = '#403294'; // Teals\n\nexport var T50 = '#E6FCFF';\nexport var T75 = '#B3F5FF';\nexport var T100 = '#79E2F2';\nexport var T200 = '#00C7E6';\nexport var T300 = '#00B8D9';\nexport var T400 = '#00A3BF';\nexport var T500 = '#008DA6'; // Neutrals\n\nexport var N0 = '#FFFFFF';\nexport var N10 = '#FAFBFC';\nexport var N20 = '#F4F5F7';\nexport var N30 = '#EBECF0';\nexport var N40 = '#DFE1E6';\nexport var N50 = '#C1C7D0';\nexport var N60 = '#B3BAC5';\nexport var N70 = '#A5ADBA';\nexport var N80 = '#97A0AF';\nexport var N90 = '#8993A4';\nexport var N100 = '#7A869A';\nexport var N200 = '#6B778C';\nexport var N300 = '#5E6C84';\nexport var N400 = '#505F79';\nexport var N500 = '#42526E';\nexport var N600 = '#344563';\nexport var N700 = '#253858';\nexport var N800 = '#172B4D'; // ATTENTION: update the tints if you update this\n\nexport var N900 = '#091E42'; // Each tint is made of N900 and an alpha channel\n\nexport var N10A = 'rgba(9, 30, 66, 0.02)';\nexport var N20A = 'rgba(9, 30, 66, 0.04)';\nexport var N30A = 'rgba(9, 30, 66, 0.08)';\nexport var N40A = 'rgba(9, 30, 66, 0.13)';\nexport var N50A = 'rgba(9, 30, 66, 0.25)';\nexport var N60A = 'rgba(9, 30, 66, 0.31)';\nexport var N70A = 'rgba(9, 30, 66, 0.36)';\nexport var N80A = 'rgba(9, 30, 66, 0.42)';\nexport var N90A = 'rgba(9, 30, 66, 0.48)';\nexport var N100A = 'rgba(9, 30, 66, 0.54)';\nexport var N200A = 'rgba(9, 30, 66, 0.60)';\nexport var N300A = 'rgba(9, 30, 66, 0.66)';\nexport var N400A = 'rgba(9, 30, 66, 0.71)';\nexport var N500A = 'rgba(9, 30, 66, 0.77)';\nexport var N600A = 'rgba(9, 30, 66, 0.82)';\nexport var N700A = 'rgba(9, 30, 66, 0.89)';\nexport var N800A = 'rgba(9, 30, 66, 0.95)'; // Dark Mode Neutrals\n\nexport var DN900 = '#E6EDFA';\nexport var DN800 = '#DCE5F5';\nexport var DN700 = '#CED9EB';\nexport var DN600 = '#B8C7E0';\nexport var DN500 = '#ABBBD6';\nexport var DN400 = '#9FB0CC';\nexport var DN300 = '#8C9CB8';\nexport var DN200 = '#7988A3';\nexport var DN100 = '#67758F';\nexport var DN90 = '#56637A';\nexport var DN80 = '#455166';\nexport var DN70 = '#3B475C';\nexport var DN60 = '#313D52';\nexport var DN50 = '#283447';\nexport var DN40 = '#202B3D';\nexport var DN30 = '#1B2638';\nexport var DN20 = '#121A29';\nexport var DN10 = '#0E1624'; // ATTENTION: update the tints if you update this\n\nexport var DN0 = '#0D1424'; // Each dark tint is made of DN0 and an alpha channel\n\nexport var DN800A = 'rgba(13, 20, 36, 0.06)';\nexport var DN700A = 'rgba(13, 20, 36, 0.14)';\nexport var DN600A = 'rgba(13, 20, 36, 0.18)';\nexport var DN500A = 'rgba(13, 20, 36, 0.29)';\nexport var DN400A = 'rgba(13, 20, 36, 0.36)';\nexport var DN300A = 'rgba(13, 20, 36, 0.40)';\nexport var DN200A = 'rgba(13, 20, 36, 0.47)';\nexport var DN100A = 'rgba(13, 20, 36, 0.53)';\nexport var DN90A = 'rgba(13, 20, 36, 0.63)';\nexport var DN80A = 'rgba(13, 20, 36, 0.73)';\nexport var DN70A = 'rgba(13, 20, 36, 0.78)';\nexport var DN60A = 'rgba(13, 20, 36, 0.81)';\nexport var DN50A = 'rgba(13, 20, 36, 0.85)';\nexport var DN40A = 'rgba(13, 20, 36, 0.89)';\nexport var DN30A = 'rgba(13, 20, 36, 0.92)';\nexport var DN20A = 'rgba(13, 20, 36, 0.95)';\nexport var DN10A = 'rgba(13, 20, 36, 0.97)'; // Themed colors\n\nexport var background = themed({\n light: \"var(--ds-surface, \".concat(N0, \")\"),\n dark: \"var(--ds-surface, \".concat(DN30, \")\")\n});\nexport var backgroundActive = themed({\n light: \"var(--ds-background-selected, \".concat(B50, \")\"),\n dark: \"var(--ds-background-selected, \".concat(B75, \")\")\n});\nexport var backgroundHover = themed({\n light: \"var(--ds-background-neutral-hovered, \".concat(N30, \")\"),\n dark: \"var(--ds-background-neutral-hovered, \".concat(DN70, \")\")\n});\nexport var backgroundOnLayer = themed({\n light: \"var(--ds-surface-overlay, \".concat(N0, \")\"),\n dark: \"var(--ds-surface-overlay, \".concat(DN50, \")\")\n});\nexport var text = themed({\n light: \"var(--ds-text, \".concat(N900, \")\"),\n dark: \"var(--ds-text, \".concat(DN600, \")\")\n});\nexport var textHover = themed({\n light: \"var(--ds-text, \".concat(N800, \")\"),\n dark: \"var(--ds-text, \".concat(DN600, \")\")\n});\nexport var textActive = themed({\n light: \"var(--ds-text-selected, \".concat(B400, \")\"),\n dark: \"var(--ds-text-selected, \".concat(B400, \")\")\n});\nexport var subtleText = themed({\n light: \"var(--ds-text-subtlest, \".concat(N200, \")\"),\n dark: \"var(--ds-text-subtlest, \".concat(DN300, \")\")\n});\nexport var placeholderText = themed({\n light: \"var(--ds-text-subtlest, \".concat(N100, \")\"),\n dark: \"var(--ds-text-subtlest, \".concat(DN200, \")\")\n});\nexport var heading = themed({\n light: \"var(--ds-text, \".concat(N800, \")\"),\n dark: \"var(--ds-text, \".concat(DN600, \")\")\n});\nexport var subtleHeading = themed({\n light: \"var(--ds-text-subtlest, \".concat(N200, \")\"),\n dark: \"var(--ds-text-subtlest, \".concat(DN300, \")\")\n});\nexport var codeBlock = themed({\n light: N20,\n dark: DN50\n});\nexport var link = themed({\n light: \"var(--ds-link, \".concat(B400, \")\"),\n dark: \"var(--ds-link, \".concat(B100, \")\")\n});\nexport var linkHover = themed({\n light: \"var(--ds-link-pressed, \".concat(B300, \")\"),\n dark: \"var(--ds-link-pressed, \".concat(B200, \")\")\n});\nexport var linkActive = themed({\n light: \"var(--ds-link-pressed, \".concat(B500, \")\"),\n dark: \"var(--ds-link-pressed, \".concat(B100, \")\")\n});\nexport var linkOutline = themed({\n light: \"var(--ds-border-focused, \".concat(B100, \")\"),\n dark: \"var(--ds-border-focused, \".concat(B200, \")\")\n});\nexport var primary = themed({\n light: \"var(--ds-background-brand-bold, \".concat(B400, \")\"),\n dark: \"var(--ds-background-brand-bold, \".concat(B100, \")\")\n});\nexport var blue = themed({\n light: B400,\n dark: B100\n});\nexport var teal = themed({\n light: T300,\n dark: T200\n});\nexport var purple = themed({\n light: P300,\n dark: P100\n});\nexport var red = themed({\n light: R300,\n dark: R300\n});\nexport var yellow = themed({\n light: Y300,\n dark: Y300\n});\nexport var green = themed({\n light: G300,\n dark: G300\n});\nexport var skeleton = function skeleton() {\n return \"var(--ds-skeleton, \".concat(N20A, \")\");\n};","import _defineProperty from \"@babel/runtime/helpers/defineProperty\";\n\nfunction ownKeys(object, enumerableOnly) { var keys = Object.keys(object); if (Object.getOwnPropertySymbols) { var symbols = Object.getOwnPropertySymbols(object); enumerableOnly && (symbols = symbols.filter(function (sym) { return Object.getOwnPropertyDescriptor(object, sym).enumerable; })), keys.push.apply(keys, symbols); } return keys; }\n\nfunction _objectSpread(target) { for (var i = 1; i < arguments.length; i++) { var source = null != arguments[i] ? arguments[i] : {}; i % 2 ? ownKeys(Object(source), !0).forEach(function (key) { _defineProperty(target, key, source[key]); }) : Object.getOwnPropertyDescriptors ? Object.defineProperties(target, Object.getOwnPropertyDescriptors(source)) : ownKeys(Object(source)).forEach(function (key) { Object.defineProperty(target, key, Object.getOwnPropertyDescriptor(source, key)); }); } return target; }\n\nimport memoizeOne from 'memoize-one';\nimport * as colors from '@atlaskit/theme/colors';\nimport { themed } from '@atlaskit/theme/components';\nimport { codeFontFamily } from '@atlaskit/theme/constants';\n// Hardcoded values have been used due to the current color palette not having any\n// accessible color options for Teal and Yellow and +20A\nvar T800 = '#067384';\nvar Y1100 = '#7A5D1A';\nvar PLUS20 = '#3A434E';\nexport var getBaseTheme = function getBaseTheme(theme) {\n return {\n fontFamily: codeFontFamily(),\n fontFamilyItalic: \"SFMono-MediumItalic, \".concat(codeFontFamily()),\n backgroundColor: themed({\n light: \"var(--ds-background-neutral, \".concat(colors.N20, \")\"),\n dark: \"var(--ds-background-neutral, \".concat(colors.DN50, \")\")\n })({\n theme: theme\n }),\n textColor: themed({\n light: \"var(--ds-text, \".concat(colors.N800, \")\"),\n dark: \"var(--ds-text, \".concat(colors.DN800, \")\")\n })({\n theme: theme\n }),\n lineNumberColor: themed({\n light: \"var(--ds-text-subtlest, \".concat(colors.N400, \")\"),\n dark: \"var(--ds-text-subtlest, \".concat(colors.DN400, \")\")\n })({\n theme: theme\n }),\n lineNumberBgColor: themed({\n light: \"var(--ds-background-neutral, \".concat(colors.N30, \")\"),\n dark: \"var(--ds-background-neutral, \".concat(colors.DN20, \")\")\n })({\n theme: theme\n })\n };\n};\nexport var defaultBaseTheme = getBaseTheme({\n mode: 'light'\n});\nexport var getColorPalette = memoizeOne(function (theme) {\n var akTheme = {\n theme: theme\n };\n return {\n highlightedLineBgColor: themed({\n light: \"var(--ds-background-neutral, \".concat(colors.N30, \")\"),\n dark: \"var(--ds-background-neutral, \".concat(PLUS20, \")\")\n })(akTheme),\n highlightedLineBorderColor: themed({\n light: \"var(--ds-border-focused, \".concat(colors.B200, \")\"),\n dark: \"var(--ds-border-focused, \".concat(colors.B100, \")\")\n })(akTheme),\n substringColor: themed({\n light: \"var(--ds-text-subtlest, \".concat(colors.N400, \")\"),\n dark: \"var(--ds-text-subtlest, \".concat(colors.DN400, \")\")\n })(akTheme),\n keywordColor: themed({\n light: \"var(--ds-text-accent-blue, \".concat(colors.B400, \")\"),\n dark: \"var(--ds-text-accent-blue, \".concat(colors.B75, \")\")\n })(akTheme),\n attributeColor: themed({\n light: \"var(--ds-text-accent-teal, \".concat(T800, \")\"),\n dark: \"var(--ds-text-accent-teal, \".concat(colors.T200, \")\")\n })(akTheme),\n selectorTagColor: themed({\n light: \"var(--ds-text-accent-blue, \".concat(colors.B400, \")\"),\n dark: \"var(--ds-text-accent-blue, \".concat(colors.B75, \")\")\n })(akTheme),\n docTagColor: themed({\n light: \"var(--ds-text-accent-yellow, \".concat(Y1100, \")\"),\n dark: \"var(--ds-text-accent-yellow, \".concat(colors.Y300, \")\")\n })(akTheme),\n nameColor: themed({\n light: \"var(--ds-text-accent-blue, \".concat(colors.B400, \")\"),\n dark: \"var(--ds-text-accent-blue, \".concat(colors.B75, \")\")\n })(akTheme),\n builtInColor: themed({\n light: \"var(--ds-text-accent-blue, \".concat(colors.B400, \")\"),\n dark: \"var(--ds-text-accent-blue, \".concat(colors.B75, \")\")\n })(akTheme),\n literalColor: themed({\n light: \"var(--ds-text-accent-blue, \".concat(colors.B400, \")\"),\n dark: \"var(--ds-text-accent-blue, \".concat(colors.B75, \")\")\n })(akTheme),\n bulletColor: themed({\n light: \"var(--ds-text-accent-blue, \".concat(colors.B400, \")\"),\n dark: \"var(--ds-text-accent-blue, \".concat(colors.B75, \")\")\n })(akTheme),\n codeColor: themed({\n light: \"var(--ds-text-accent-blue, \".concat(colors.B400, \")\"),\n dark: \"var(--ds-text-accent-blue, \".concat(colors.B75, \")\")\n })(akTheme),\n regexpColor: themed({\n light: \"var(--ds-text-accent-teal, \".concat(T800, \")\"),\n dark: \"var(--ds-text-accent-teal, \".concat(colors.T200, \")\")\n })(akTheme),\n symbolColor: themed({\n light: \"var(--ds-text-accent-teal, \".concat(T800, \")\"),\n dark: \"var(--ds-text-accent-teal, \".concat(colors.T200, \")\")\n })(akTheme),\n variableColor: themed({\n light: \"var(--ds-text-accent-teal, \".concat(T800, \")\"),\n dark: \"var(--ds-text-accent-teal, \".concat(colors.T200, \")\")\n })(akTheme),\n templateVariableColor: themed({\n light: \"var(--ds-text-accent-teal, \".concat(T800, \")\"),\n dark: \"var(--ds-text-accent-teal, \".concat(colors.T200, \")\")\n })(akTheme),\n linkColor: themed({\n light: \"var(--ds-text-accent-purple, \".concat(colors.P300, \")\"),\n dark: \"var(--ds-text-accent-purple, \".concat(colors.P75, \")\")\n })(akTheme),\n selectorAttributeColor: themed({\n light: \"var(--ds-text-accent-teal, \".concat(T800, \")\"),\n dark: \"var(--ds-text-accent-teal, \".concat(colors.T200, \")\")\n })(akTheme),\n selectorPseudoColor: themed({\n light: \"var(--ds-text-accent-teal, \".concat(T800, \")\"),\n dark: \"var(--ds-text-accent-teal, \".concat(colors.T200, \")\")\n })(akTheme),\n typeColor: themed({\n light: \"var(--ds-text-accent-teal, \".concat(T800, \")\"),\n dark: \"var(--ds-text-accent-teal, \".concat(colors.T100, \")\")\n })(akTheme),\n stringColor: themed({\n light: \"var(--ds-text-accent-green, \".concat(colors.G500, \")\"),\n dark: \"var(--ds-text-accent-green, \".concat(colors.G200, \")\")\n })(akTheme),\n selectorIdColor: themed({\n light: \"var(--ds-text-accent-teal, \".concat(T800, \")\"),\n dark: \"var(--ds-text-accent-teal, \".concat(colors.T100, \")\")\n })(akTheme),\n selectorClassColor: themed({\n light: \"var(--ds-text-accent-teal, \".concat(T800, \")\"),\n dark: \"var(--ds-text-accent-teal, \".concat(colors.T100, \")\")\n })(akTheme),\n quoteColor: themed({\n light: \"var(--ds-text-accent-teal, \".concat(T800, \")\"),\n dark: \"var(--ds-text-accent-teal, \".concat(colors.T100, \")\")\n })(akTheme),\n templateTagColor: themed({\n light: \"var(--ds-text-accent-teal, \".concat(T800, \")\"),\n dark: \"var(--ds-text-accent-teal, \".concat(colors.T100, \")\")\n })(akTheme),\n titleColor: themed({\n light: \"var(--ds-text-accent-purple, \".concat(colors.P300, \")\"),\n dark: \"var(--ds-text-accent-purple, \".concat(colors.P75, \")\")\n })(akTheme),\n sectionColor: themed({\n light: \"var(--ds-text-accent-purple, \".concat(colors.P300, \")\"),\n dark: \"var(--ds-text-accent-purple, \".concat(colors.P75, \")\")\n })(akTheme),\n commentColor: themed({\n light: \"var(--ds-text-subtlest, \".concat(colors.N400, \")\"),\n dark: \"var(--ds-text-subtlest, \".concat(colors.DN400, \")\")\n })(akTheme),\n metaKeywordColor: themed({\n light: \"var(--ds-text-accent-green, \".concat(colors.G500, \")\"),\n dark: \"var(--ds-text-accent-green, \".concat(colors.G200, \")\")\n })(akTheme),\n metaColor: themed({\n light: \"var(--ds-text-subtlest, \".concat(colors.N400, \")\"),\n dark: \"var(--ds-text-subtlest, \".concat(colors.DN400, \")\")\n })(akTheme),\n functionColor: themed({\n light: \"var(--ds-text, \".concat(colors.N800, \")\"),\n dark: \"var(--ds-text, \".concat(colors.DN800, \")\")\n })(akTheme),\n numberColor: themed({\n light: \"var(--ds-text-accent-blue, \".concat(colors.B400, \")\"),\n dark: \"var(--ds-text-accent-blue, \".concat(colors.B75, \")\")\n })(akTheme),\n prologColor: themed({\n light: \"var(--ds-text-accent-blue, \".concat(colors.B400, \")\"),\n dark: \"var(--ds-text-accent-blue, \".concat(colors.B75, \")\")\n })(akTheme),\n cdataColor: themed({\n light: \"var(--ds-text-subtlest, \".concat(colors.N400, \")\"),\n dark: \"var(--ds-text-subtlest, \".concat(colors.B75, \")\")\n })(akTheme),\n punctuationColor: themed({\n light: \"var(--ds-text, \".concat(colors.N800, \")\"),\n dark: \"var(--ds-text, \".concat(colors.DN800, \")\")\n })(akTheme),\n propertyColor: themed({\n light: \"var(--ds-text-accent-purple, \".concat(colors.P300, \")\"),\n dark: \"var(--ds-text-accent-purple, \".concat(colors.P75, \")\")\n })(akTheme),\n constantColor: themed({\n light: \"var(--ds-text-accent-teal, \".concat(T800, \")\"),\n dark: \"var(--ds-text-accent-teal, \".concat(colors.T100, \")\")\n })(akTheme),\n booleanColor: themed({\n light: \"var(--ds-text-accent-blue, \".concat(colors.B400, \")\"),\n dark: \"var(--ds-text-accent-blue, \".concat(colors.B75, \")\")\n })(akTheme),\n charColor: themed({\n light: \"var(--ds-text, \".concat(colors.N800, \")\"),\n dark: \"var(--ds-text, \".concat(colors.DN800, \")\")\n })(akTheme),\n insertedColor: themed({\n light: \"var(--ds-text-accent-green, \".concat(colors.G500, \")\"),\n dark: \"var(--ds-text-accent-green, \".concat(colors.B75, \")\")\n })(akTheme),\n deletedColor: themed({\n light: \"var(--ds-text-accent-red, \".concat(colors.R500, \")\"),\n dark: \"var(--ds-text-accent-red, \".concat(colors.B75, \")\")\n })(akTheme),\n operatorColor: themed({\n light: \"var(--ds-text, \".concat(colors.N800, \")\"),\n dark: \"var(--ds-text, \".concat(colors.B75, \")\")\n })(akTheme),\n atruleColor: themed({\n light: \"var(--ds-text-accent-green, \".concat(colors.G500, \")\"),\n dark: \"var(--ds-text-accent-green, \".concat(colors.G200, \")\")\n })(akTheme),\n importantColor: themed({\n light: \"var(--ds-text-accent-yellow, \".concat(Y1100, \")\"),\n dark: \"var(--ds-text-accent-yellow, \".concat(colors.Y300, \")\")\n })(akTheme)\n };\n});\n\nvar getTheme = function getTheme(theme) {\n return _objectSpread(_objectSpread({}, getBaseTheme(theme)), getColorPalette(theme));\n};\n\nexport default getTheme;","import _defineProperty from \"@babel/runtime/helpers/defineProperty\";\n\nfunction ownKeys(object, enumerableOnly) { var keys = Object.keys(object); if (Object.getOwnPropertySymbols) { var symbols = Object.getOwnPropertySymbols(object); enumerableOnly && (symbols = symbols.filter(function (sym) { return Object.getOwnPropertyDescriptor(object, sym).enumerable; })), keys.push.apply(keys, symbols); } return keys; }\n\nfunction _objectSpread(target) { for (var i = 1; i < arguments.length; i++) { var source = null != arguments[i] ? arguments[i] : {}; i % 2 ? ownKeys(Object(source), !0).forEach(function (key) { _defineProperty(target, key, source[key]); }) : Object.getOwnPropertyDescriptors ? Object.defineProperties(target, Object.getOwnPropertyDescriptors(source)) : ownKeys(Object(source)).forEach(function (key) { Object.defineProperty(target, key, Object.getOwnPropertyDescriptor(source, key)); }); } return target; }\n\nimport { borderRadius } from '@atlaskit/theme/constants';\nimport { CODE_FONT_SIZE, CODE_LINE_HEIGHT, HIGHLIGHT_BORDER_WIDTH, LINE_NUMBER_GUTTER, SPACING, VAR_CODE_BG_COLOR, VAR_CODE_LINE_NUMBER_BG_COLOR } from './constants';\nimport { getBaseTheme, getColorPalette } from './get-theme';\nexport var getLineNumWidth = function getLineNumWidth(numLines) {\n if (!numLines) {\n return '1ch';\n }\n\n return \"\".concat(numLines.toFixed(0).length, \"ch\");\n};\n\nvar lineNumberStyle = function lineNumberStyle(theme) {\n return {\n // width of the line number gutter\n minWidth: \"calc(\".concat(theme.lineNumberWidth, \" + \").concat(LINE_NUMBER_GUTTER, \"px) !important\"),\n // this needs to be important or it gets overwritten by inline styles\n fontStyle: 'normal !important',\n // this needs to be important or it gets overwritten by inline styles\n color: \"\".concat(theme.lineNumberColor, \" !important\"),\n flexShrink: 0,\n // needed to replicate existing design spec\n boxSizing: 'border-box',\n paddingRight: \"\".concat(SPACING, \"px !important\"),\n paddingLeft: SPACING,\n marginRight: SPACING,\n textAlign: 'right',\n userSelect: 'none',\n // this is to fix SSR spacing issue\n display: 'block'\n };\n}; // order of these keys does matter as it will affect the css precedence\n\n\nvar syntaxKeywordColors = function syntaxKeywordColors(theme) {\n return {\n '.token': {\n // this specifically stops prism css cascading.\n '&:not([class=token],[data-ds--code--row--highlight])': {\n all: 'unset'\n },\n // additional specificity required to match the all: unset\n '&.key,&.keyword': {\n color: theme.keywordColor,\n fontWeight: 'bolder'\n },\n '&.attr-name': {\n color: theme.attributeColor\n },\n '&.selector': {\n color: theme.selectorTagColor\n },\n '&.comment,&.block-comment': {\n color: theme.commentColor,\n fontFamily: theme.fontFamilyItalic,\n fontStyle: 'italic'\n },\n '&.function-name': {\n color: theme.sectionColor\n },\n '&.doctype': {\n color: theme.docTagColor\n },\n '&.substr': {\n color: theme.substringColor\n },\n '&.namespace': {\n color: theme.nameColor\n },\n '&.builtin': {\n color: theme.builtInColor\n },\n '&.entity': {\n color: theme.literalColor\n },\n '&.bullet': {\n color: theme.bulletColor\n },\n '&.code': {\n color: theme.codeColor\n },\n '&.regex': {\n color: theme.regexpColor\n },\n '&.symbol': {\n color: theme.symbolColor\n },\n '&.variable': {\n color: theme.variableColor\n },\n '&.url': {\n color: theme.linkColor\n },\n '&.selector-attr': {\n color: theme.selectorAttributeColor\n },\n '&.selector-pseudo': {\n color: theme.selectorPseudoColor\n },\n '&.type': {\n color: theme.typeColor\n },\n '&.quote': {\n color: theme.quoteColor\n },\n '&.tag': {\n color: theme.templateTagColor\n },\n '&.string': {\n color: theme.stringColor\n },\n '&.class-name': {\n color: theme.sectionColor\n },\n '&.title': {\n color: theme.titleColor\n },\n '&.section': {\n color: theme.sectionColor\n },\n '&.meta-keyword': {\n color: theme.metaKeywordColor\n },\n '&.meta': {\n color: theme.metaColor\n },\n '&.italic': {\n fontStyle: 'italic'\n },\n '&.bold': {\n fontWeight: 'bolder'\n },\n '&.function': {\n color: theme.functionColor\n },\n '&.number': {\n color: theme.numberColor\n },\n '&.attr-value': {\n color: theme.attributeColor\n },\n '&.prolog': {\n color: theme.prologColor\n },\n '&.cdata': {\n color: theme.cdataColor\n },\n '&.punctuation': {\n color: theme.punctuationColor\n },\n '&.property': {\n color: theme.propertyColor\n },\n '&.constant': {\n color: theme.constantColor\n },\n '&.deleted': {\n color: theme.deletedColor\n },\n '&.boolean': {\n color: theme.booleanColor\n },\n '&.char': {\n color: theme.charColor\n },\n '&.inserted': {\n color: theme.insertedColor\n },\n '&.operator': {\n color: theme.operatorColor\n },\n '&.atrule': {\n color: theme.atruleColor\n },\n '&.important': {\n color: theme.importantColor,\n fontWeight: 'bold'\n }\n }\n };\n};\n/**\n * Styles applied at the root element level, common across code/codeblock\n */\n\n\nexport var getBaseCodeStyles = function getBaseCodeStyles(theme) {\n return {\n fontSize: CODE_FONT_SIZE,\n fontFamily: theme.fontFamily,\n fontWeight: 'normal',\n backgroundColor: \"var(\".concat(VAR_CODE_BG_COLOR, \",\").concat(theme.backgroundColor, \")\"),\n color: theme.textColor,\n borderStyle: 'none',\n borderRadius: \"\".concat(borderRadius(), \"px\")\n };\n};\n/**\n * Takes an implemented CodeBlock theme, and returns styles required for\n * react-syntax-highlighter.\n *\n * @param theme\n */\n\nexport var getCodeBlockStyles = function getCodeBlockStyles(theme) {\n return function (highlightedStartText, highlightedEndText, hasLineNumbers) {\n return _objectSpread(_objectSpread(_objectSpread({\n // this is required to account for prismjs styles leaking into the codeblock\n 'code[class*=\"language-\"], pre[class*=\"language-\"], code': {\n all: 'unset',\n padding: hasLineNumbers ? \"\".concat(SPACING, \"px 0\") : SPACING\n },\n display: 'flex',\n lineHeight: CODE_LINE_HEIGHT,\n overflowX: 'auto',\n whiteSpace: 'pre'\n }, getBaseCodeStyles(theme)), syntaxKeywordColors(theme)), {}, {\n // this is to account for SSR spacing issue once loaded in browser\n '& .linenumber, .react-syntax-highlighter-line-number': lineNumberStyle(theme),\n '& .linenumber': {\n display: 'inline-block !important'\n },\n // these styles are for line highlighting\n '& [data-ds--code--row]': {\n display: 'block',\n paddingRight: \"\".concat(SPACING, \"px !important\"),\n marginRight: \"-\".concat(SPACING, \"px\")\n },\n '& [data-ds--code--row--highlight]': {\n background: \"\".concat(theme.highlightedLineBgColor),\n // eslint-disable-next-line @atlaskit/design-system/use-visually-hidden\n '&::before, &::after': {\n clipPath: 'inset(100%)',\n clip: 'rect(1px, 1px, 1px, 1px)',\n height: '1px',\n overflow: 'hidden',\n position: 'absolute',\n whiteSpace: 'nowrap',\n width: '1px'\n },\n '&::before': {\n content: \"\\\", \".concat(highlightedStartText, \", \\\"\")\n },\n '&::after': {\n content: \"\\\", \".concat(highlightedEndText, \", \\\"\")\n }\n },\n '& [data-ds--code--row--highlight] .linenumber': {\n borderLeft: \"\".concat(HIGHLIGHT_BORDER_WIDTH, \" solid \").concat(theme.highlightedLineBorderColor),\n paddingLeft: \"\".concat(SPACING / 2, \"px !important\"),\n position: 'relative'\n },\n // fill in space caused by parent border top\n '& [data-ds--code--row--highlight] .linenumber::before': {\n content: '\"\"',\n position: 'absolute',\n width: HIGHLIGHT_BORDER_WIDTH,\n top: '-1px',\n left: \"-\".concat(HIGHLIGHT_BORDER_WIDTH),\n borderTop: \"1px solid \".concat(theme.highlightedLineBorderColor)\n },\n '[data-ds--code--row--highlight] + [data-ds--code--row]:not([data-ds--code--row--highlight]), [data-ds--code--row]:not([data-ds--code--row--highlight]) + [data-ds--code--row--highlight]': {\n borderTop: '1px dashed transparent'\n },\n '[data-ds--code--row--highlight]:last-child': {\n borderBottom: '1px dashed transparent'\n },\n '& code:first-of-type': {\n paddingRight: \"0px !important\",\n backgroundImage: hasLineNumbers ? \"linear-gradient(to right, var(\".concat(VAR_CODE_LINE_NUMBER_BG_COLOR, \",\").concat(theme.lineNumberBgColor, \"), var(\").concat(VAR_CODE_LINE_NUMBER_BG_COLOR, \",\").concat(theme.lineNumberBgColor, \")\\n calc(\").concat(theme.lineNumberWidth, \" + \").concat(LINE_NUMBER_GUTTER, \"px), transparent calc(\").concat(theme.lineNumberWidth, \" + \").concat(LINE_NUMBER_GUTTER, \"px), transparent)\") : undefined\n },\n // we need to use last-of-type because when Code is SSR'd\n // 2 elements are created and we don't want this style\n // applied to the first one\n '& code:last-of-type': {\n paddingRight: \"\".concat(SPACING, \"px !important\"),\n flex: '1 0 auto'\n },\n // Prevents empty code blocks from vertically collapsing\n 'code > span:only-child:empty:before, code > span:only-child > span:only-child:empty:before': {\n content: '\" \"'\n }\n });\n };\n};\nexport var getCodeStyles = function getCodeStyles(globalTheme) {\n // Required to have proper compatibility with styled components interpolations\n var akTheme = 'theme' in globalTheme ? globalTheme.theme : globalTheme;\n var theme = getBaseTheme(akTheme);\n var baseStyles = getBaseCodeStyles(theme);\n return _objectSpread(_objectSpread({}, baseStyles), {}, {\n display: 'inline',\n // monospace font appears slightly larger than the serif font so\n // we use a relative size to better match when used inline\n fontSize: '0.875em',\n // NB vertical padding _will_ effect the boxes vertical alignment so it needs to be\n // minimised. 2px provides a minumum and allows the line height to do the heavy lifting\n // ; 0.5ch is to emulate the half space between the next word with varied font sizes.\n padding: '2px 0.5ch',\n whiteSpace: 'pre-wrap',\n overflowWrap: 'break-word',\n overflow: 'auto',\n boxDecorationBreak: 'clone'\n });\n};\nexport var getCodeBlockTheme = function getCodeBlockTheme(globalTheme, maxLines) {\n return _objectSpread(_objectSpread(_objectSpread({}, getBaseTheme(globalTheme)), getColorPalette(globalTheme)), {}, {\n lineNumberWidth: maxLines ? getLineNumWidth(maxLines) : undefined\n });\n};","export var SUPPORTED_LANGUAGES = [{\n name: 'PHP',\n alias: ['php', 'php3', 'php4', 'php5'],\n value: 'php'\n}, {\n name: 'Java',\n alias: ['java'],\n value: 'java'\n}, {\n name: 'CSharp',\n alias: ['csharp', 'c#'],\n value: 'cs'\n}, {\n name: 'Python',\n alias: ['python', 'py'],\n value: 'python'\n}, {\n name: 'JavaScript',\n alias: ['javascript', 'js'],\n value: 'javascript'\n}, {\n name: 'Html',\n alias: ['html'],\n value: 'xml'\n}, {\n name: 'C++',\n alias: ['c++', 'cpp', 'clike'],\n value: 'cpp'\n}, {\n name: 'Ruby',\n alias: ['ruby', 'rb', 'duby'],\n value: 'ruby'\n}, {\n name: 'Objective-C',\n alias: ['objective-c', 'objectivec', 'obj-c', 'objc'],\n value: 'objectivec'\n}, {\n name: 'C',\n alias: ['c'],\n value: 'cpp'\n}, {\n name: 'Swift',\n alias: ['swift'],\n value: 'swift'\n}, {\n name: 'TeX',\n alias: ['tex', 'latex'],\n value: 'tex'\n}, {\n name: 'Shell',\n alias: ['shell', 'bash', 'sh', 'ksh', 'zsh'],\n value: 'shell'\n}, {\n name: 'Scala',\n alias: ['scala'],\n value: 'scala'\n}, {\n name: 'Go',\n alias: ['go'],\n value: 'go'\n}, {\n name: 'ActionScript',\n alias: ['actionscript', 'actionscript3', 'as'],\n value: 'actionscript'\n}, {\n name: 'ColdFusion',\n alias: ['coldfusion'],\n value: 'xml'\n}, {\n name: 'JavaFX',\n alias: ['javafx', 'jfx'],\n value: 'java'\n}, {\n name: 'VbNet',\n alias: ['vbnet', 'vb.net', 'vfp', 'clipper', 'xbase'],\n value: 'vbnet'\n}, {\n name: 'JSON',\n alias: ['json'],\n value: 'json'\n}, {\n name: 'MATLAB',\n alias: ['matlab'],\n value: 'matlab'\n}, {\n name: 'Groovy',\n alias: ['groovy'],\n value: 'groovy'\n}, {\n name: 'SQL',\n alias: ['sql', 'postgresql', 'postgres', 'plpgsql', 'psql', 'postgresql-console', 'postgres-console', 'tsql', 't-sql', 'mysql', 'sqlite'],\n value: 'sql'\n}, {\n name: 'R',\n alias: ['r'],\n value: 'r'\n}, {\n name: 'Perl',\n alias: ['perl', 'pl'],\n value: 'perl'\n}, {\n name: 'Lua',\n alias: ['lua'],\n value: 'lua'\n}, {\n name: 'Pascal',\n alias: ['pas', 'pascal', 'objectpascal', 'delphi'],\n value: 'pascal'\n}, {\n name: 'XML',\n alias: ['xml'],\n value: 'xml'\n}, {\n name: 'TypeScript',\n alias: ['typescript', 'ts'],\n value: 'typescript'\n}, {\n name: 'CoffeeScript',\n alias: ['coffeescript', 'coffee-script', 'coffee'],\n value: 'coffeescript'\n}, {\n name: 'Haskell',\n alias: ['haskell', 'hs'],\n value: 'haskell'\n}, {\n name: 'Puppet',\n alias: ['puppet'],\n value: 'puppet'\n}, {\n name: 'Arduino',\n alias: ['arduino'],\n value: 'arduino'\n}, {\n name: 'Fortran',\n alias: ['fortran'],\n value: 'fortran'\n}, {\n name: 'Erlang',\n alias: ['erlang', 'erl'],\n value: 'erlang'\n}, {\n name: 'PowerShell',\n alias: ['powershell', 'posh', 'ps1', 'psm1'],\n value: 'powershell'\n}, {\n name: 'Haxe',\n alias: ['haxe', 'hx', 'hxsl'],\n value: 'haxe'\n}, {\n name: 'Elixir',\n alias: ['elixir', 'ex', 'exs'],\n value: 'elixir'\n}, {\n name: 'Verilog',\n alias: ['verilog', 'v'],\n value: 'verilog'\n}, {\n name: 'Rust',\n alias: ['rust'],\n value: 'rust'\n}, {\n name: 'VHDL',\n alias: ['vhdl'],\n value: 'vhdl'\n}, {\n name: 'Sass',\n alias: ['sass'],\n value: 'less'\n}, {\n name: 'OCaml',\n alias: ['ocaml'],\n value: 'ocaml'\n}, {\n name: 'Dart',\n alias: ['dart'],\n value: 'dart'\n}, {\n name: 'CSS',\n alias: ['css'],\n value: 'css'\n}, {\n name: 'reStructuredText',\n alias: ['restructuredtext', 'rst', 'rest'],\n value: 'rest'\n}, {\n name: 'Kotlin',\n alias: ['kotlin'],\n value: 'kotlin'\n}, {\n name: 'D',\n alias: ['d'],\n value: 'd'\n}, {\n name: 'Octave',\n alias: ['octave'],\n value: 'matlab'\n}, {\n name: 'QML',\n alias: ['qbs', 'qml'],\n value: 'qml'\n}, {\n name: 'Prolog',\n alias: ['prolog'],\n value: 'prolog'\n}, {\n name: 'FoxPro',\n alias: ['foxpro', 'purebasic'],\n value: 'purebasic'\n}, {\n name: 'Scheme',\n alias: ['scheme', 'scm'],\n value: 'scheme'\n}, {\n name: 'CUDA',\n alias: ['cuda', 'cu'],\n value: 'cpp'\n}, {\n name: 'Julia',\n alias: ['julia', 'jl'],\n value: 'julia'\n}, {\n name: 'Racket',\n alias: ['racket', 'rkt'],\n value: 'lisp'\n}, {\n name: 'Ada',\n alias: ['ada', 'ada95', 'ada2005'],\n value: 'ada'\n}, {\n name: 'Tcl',\n alias: ['tcl'],\n value: 'tcl'\n}, {\n name: 'Mathematica',\n alias: ['mathematica', 'mma', 'nb'],\n value: 'mathematica'\n}, {\n name: 'Autoit',\n alias: ['autoit'],\n value: 'autoit'\n}, {\n name: 'StandardML',\n alias: ['standardmL', 'sml', 'standardml'],\n value: 'sml'\n}, {\n name: 'Objective-J',\n alias: ['objective-j', 'objectivej', 'obj-j', 'objj'],\n value: 'objectivec'\n}, {\n name: 'Smalltalk',\n alias: ['smalltalk', 'squeak', 'st'],\n value: 'smalltalk'\n}, {\n name: 'Vala',\n alias: ['vala', 'vapi'],\n value: 'vala'\n}, {\n name: 'ABAP',\n alias: ['abap'],\n value: 'sql'\n}, {\n name: 'LiveScript',\n alias: ['livescript', 'live-script'],\n value: 'livescript'\n}, {\n name: 'XQuery',\n alias: ['xquery', 'xqy', 'xq', 'xql', 'xqm'],\n value: 'xquery'\n}, {\n name: 'PlainText',\n alias: ['text', 'plaintext'],\n value: 'text'\n}, {\n name: 'Yaml',\n alias: ['yaml', 'yml'],\n value: 'yaml'\n}, {\n name: 'GraphQL',\n alias: ['graphql'],\n value: 'graphql'\n}, {\n name: 'AppleScript',\n alias: ['applescript'],\n value: 'applescript'\n}, {\n name: 'Clojure',\n alias: ['clojure'],\n value: 'clojure'\n}, {\n name: 'Diff',\n alias: ['diff'],\n value: 'diff'\n}, {\n name: 'VisualBasic',\n alias: ['visualbasic'],\n value: 'visual-basic'\n}, {\n name: 'JSX',\n alias: ['jsx'],\n value: 'jsx'\n}, {\n name: 'TSX',\n alias: ['tsx'],\n value: 'tsx'\n}, {\n name: 'SplunkSPL',\n alias: ['splunk-spl'],\n value: 'splunk-spl'\n}];\nexport { CODE_BLOCK_SELECTOR } from './internal/theme/constants';","import memoizeOne from 'memoize-one';\nimport { SUPPORTED_LANGUAGES } from '../../constants';\nexport var normalizeLanguage = memoizeOne(function (language) {\n if (!language) {\n return '';\n }\n\n var match = SUPPORTED_LANGUAGES.find(function (val) {\n return val.name === language || val.alias.includes(language);\n }); // Fallback to plain monospaced text if language passed but not supported\n\n return match ? match.value : 'text';\n});","export default function _extends() {\n _extends = Object.assign || function (target) {\n for (var i = 1; i < arguments.length; i++) {\n var source = arguments[i];\n\n for (var key in source) {\n if (Object.prototype.hasOwnProperty.call(source, key)) {\n target[key] = source[key];\n }\n }\n }\n\n return target;\n };\n\n return _extends.apply(this, arguments);\n}","import objectWithoutPropertiesLoose from \"./objectWithoutPropertiesLoose.js\";\nexport default function _objectWithoutProperties(source, excluded) {\n if (source == null) return {};\n var target = objectWithoutPropertiesLoose(source, excluded);\n var key, i;\n\n if (Object.getOwnPropertySymbols) {\n var sourceSymbolKeys = Object.getOwnPropertySymbols(source);\n\n for (i = 0; i < sourceSymbolKeys.length; i++) {\n key = sourceSymbolKeys[i];\n if (excluded.indexOf(key) >= 0) continue;\n if (!Object.prototype.propertyIsEnumerable.call(source, key)) continue;\n target[key] = source[key];\n }\n }\n\n return target;\n}","export default function _objectWithoutPropertiesLoose(source, excluded) {\n if (source == null) return {};\n var target = {};\n var sourceKeys = Object.keys(source);\n var key, i;\n\n for (i = 0; i < sourceKeys.length; i++) {\n key = sourceKeys[i];\n if (excluded.indexOf(key) >= 0) continue;\n target[key] = source[key];\n }\n\n return target;\n}","export default function _extends() {\n _extends = Object.assign || function (target) {\n for (var i = 1; i < arguments.length; i++) {\n var source = arguments[i];\n\n for (var key in source) {\n if (Object.prototype.hasOwnProperty.call(source, key)) {\n target[key] = source[key];\n }\n }\n }\n\n return target;\n };\n\n return _extends.apply(this, arguments);\n}","export default function _arrayLikeToArray(arr, len) {\n if (len == null || len > arr.length) len = arr.length;\n\n for (var i = 0, arr2 = new Array(len); i < len; i++) {\n arr2[i] = arr[i];\n }\n\n return arr2;\n}","import arrayWithHoles from \"./arrayWithHoles.js\";\nimport iterableToArrayLimit from \"./iterableToArrayLimit.js\";\nimport unsupportedIterableToArray from \"./unsupportedIterableToArray.js\";\nimport nonIterableRest from \"./nonIterableRest.js\";\nexport default function _slicedToArray(arr, i) {\n return arrayWithHoles(arr) || iterableToArrayLimit(arr, i) || unsupportedIterableToArray(arr, i) || nonIterableRest();\n}","export default function _arrayWithHoles(arr) {\n if (Array.isArray(arr)) return arr;\n}","export default function _iterableToArrayLimit(arr, i) {\n if (typeof Symbol === \"undefined\" || !(Symbol.iterator in Object(arr))) return;\n var _arr = [];\n var _n = true;\n var _d = false;\n var _e = undefined;\n\n try {\n for (var _i = arr[Symbol.iterator](), _s; !(_n = (_s = _i.next()).done); _n = true) {\n _arr.push(_s.value);\n\n if (i && _arr.length === i) break;\n }\n } catch (err) {\n _d = true;\n _e = err;\n } finally {\n try {\n if (!_n && _i[\"return\"] != null) _i[\"return\"]();\n } finally {\n if (_d) throw _e;\n }\n }\n\n return _arr;\n}","import arrayLikeToArray from \"./arrayLikeToArray.js\";\nexport default function _unsupportedIterableToArray(o, minLen) {\n if (!o) return;\n if (typeof o === \"string\") return arrayLikeToArray(o, minLen);\n var n = Object.prototype.toString.call(o).slice(8, -1);\n if (n === \"Object\" && o.constructor) n = o.constructor.name;\n if (n === \"Map\" || n === \"Set\") return Array.from(o);\n if (n === \"Arguments\" || /^(?:Ui|I)nt(?:8|16|32)(?:Clamped)?Array$/.test(n)) return arrayLikeToArray(o, minLen);\n}","export default function _nonIterableRest() {\n throw new TypeError(\"Invalid attempt to destructure non-iterable instance.\\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method.\");\n}","export default function _defineProperty(obj, key, value) {\n if (key in obj) {\n Object.defineProperty(obj, key, {\n value: value,\n enumerable: true,\n configurable: true,\n writable: true\n });\n } else {\n obj[key] = value;\n }\n\n return obj;\n}","export default function _defineProperty(obj, key, value) {\n if (key in obj) {\n Object.defineProperty(obj, key, {\n value: value,\n enumerable: true,\n configurable: true,\n writable: true\n });\n } else {\n obj[key] = value;\n }\n\n return obj;\n}","import { useState, useRef, useEffect } from 'react';\n\nfunction areInputsEqual(newInputs, lastInputs) {\n if (newInputs.length !== lastInputs.length) {\n return false;\n }\n\n for (var i = 0; i < newInputs.length; i++) {\n if (newInputs[i] !== lastInputs[i]) {\n return false;\n }\n }\n\n return true;\n}\n\nfunction useMemoOne(getResult, inputs) {\n var initial = useState(function () {\n return {\n inputs: inputs,\n result: getResult()\n };\n })[0];\n var isFirstRun = useRef(true);\n var committed = useRef(initial);\n var useCache = isFirstRun.current || Boolean(inputs && committed.current.inputs && areInputsEqual(inputs, committed.current.inputs));\n var cache = useCache ? committed.current : {\n inputs: inputs,\n result: getResult()\n };\n useEffect(function () {\n isFirstRun.current = false;\n committed.current = cache;\n }, [cache]);\n return cache.result;\n}\nfunction useCallbackOne(callback, inputs) {\n return useMemoOne(function () {\n return callback;\n }, inputs);\n}\nvar useMemo = useMemoOne;\nvar useCallback = useCallbackOne;\n\nexport { useCallback, useCallbackOne, useMemo, useMemoOne };\n","export default function _arrayLikeToArray(arr, len) {\n if (len == null || len > arr.length) len = arr.length;\n\n for (var i = 0, arr2 = new Array(len); i < len; i++) {\n arr2[i] = arr[i];\n }\n\n return arr2;\n}","import arrayWithoutHoles from \"./arrayWithoutHoles.js\";\nimport iterableToArray from \"./iterableToArray.js\";\nimport unsupportedIterableToArray from \"./unsupportedIterableToArray.js\";\nimport nonIterableSpread from \"./nonIterableSpread.js\";\nexport default function _toConsumableArray(arr) {\n return arrayWithoutHoles(arr) || iterableToArray(arr) || unsupportedIterableToArray(arr) || nonIterableSpread();\n}","import arrayLikeToArray from \"./arrayLikeToArray.js\";\nexport default function _arrayWithoutHoles(arr) {\n if (Array.isArray(arr)) return arrayLikeToArray(arr);\n}","export default function _iterableToArray(iter) {\n if (typeof Symbol !== \"undefined\" && Symbol.iterator in Object(iter)) return Array.from(iter);\n}","import arrayLikeToArray from \"./arrayLikeToArray.js\";\nexport default function _unsupportedIterableToArray(o, minLen) {\n if (!o) return;\n if (typeof o === \"string\") return arrayLikeToArray(o, minLen);\n var n = Object.prototype.toString.call(o).slice(8, -1);\n if (n === \"Object\" && o.constructor) n = o.constructor.name;\n if (n === \"Map\" || n === \"Set\") return Array.from(o);\n if (n === \"Arguments\" || /^(?:Ui|I)nt(?:8|16|32)(?:Clamped)?Array$/.test(n)) return arrayLikeToArray(o, minLen);\n}","export default function _nonIterableSpread() {\n throw new TypeError(\"Invalid attempt to spread non-iterable instance.\\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method.\");\n}","export default function _classCallCheck(instance, Constructor) {\n if (!(instance instanceof Constructor)) {\n throw new TypeError(\"Cannot call a class as a function\");\n }\n}","function _defineProperties(target, props) {\n for (var i = 0; i < props.length; i++) {\n var descriptor = props[i];\n descriptor.enumerable = descriptor.enumerable || false;\n descriptor.configurable = true;\n if (\"value\" in descriptor) descriptor.writable = true;\n Object.defineProperty(target, descriptor.key, descriptor);\n }\n}\n\nexport default function _createClass(Constructor, protoProps, staticProps) {\n if (protoProps) _defineProperties(Constructor.prototype, protoProps);\n if (staticProps) _defineProperties(Constructor, staticProps);\n return Constructor;\n}","export default function _assertThisInitialized(self) {\n if (self === void 0) {\n throw new ReferenceError(\"this hasn't been initialised - super() hasn't been called\");\n }\n\n return self;\n}","export default function _getPrototypeOf(o) {\n _getPrototypeOf = Object.setPrototypeOf ? Object.getPrototypeOf : function _getPrototypeOf(o) {\n return o.__proto__ || Object.getPrototypeOf(o);\n };\n return _getPrototypeOf(o);\n}","import superPropBase from \"./superPropBase.js\";\nexport default function _get(target, property, receiver) {\n if (typeof Reflect !== \"undefined\" && Reflect.get) {\n _get = Reflect.get;\n } else {\n _get = function _get(target, property, receiver) {\n var base = superPropBase(target, property);\n if (!base) return;\n var desc = Object.getOwnPropertyDescriptor(base, property);\n\n if (desc.get) {\n return desc.get.call(receiver);\n }\n\n return desc.value;\n };\n }\n\n return _get(target, property, receiver || target);\n}","import getPrototypeOf from \"./getPrototypeOf.js\";\nexport default function _superPropBase(object, property) {\n while (!Object.prototype.hasOwnProperty.call(object, property)) {\n object = getPrototypeOf(object);\n if (object === null) break;\n }\n\n return object;\n}","export default function _setPrototypeOf(o, p) {\n _setPrototypeOf = Object.setPrototypeOf || function _setPrototypeOf(o, p) {\n o.__proto__ = p;\n return o;\n };\n\n return _setPrototypeOf(o, p);\n}","export default function _typeof(obj) {\n \"@babel/helpers - typeof\";\n\n if (typeof Symbol === \"function\" && typeof Symbol.iterator === \"symbol\") {\n _typeof = function _typeof(obj) {\n return typeof obj;\n };\n } else {\n _typeof = function _typeof(obj) {\n return obj && typeof Symbol === \"function\" && obj.constructor === Symbol && obj !== Symbol.prototype ? \"symbol\" : typeof obj;\n };\n }\n\n return _typeof(obj);\n}","import _typeof from \"@babel/runtime/helpers/typeof\";\nimport _classCallCheck from \"@babel/runtime/helpers/classCallCheck\";\nimport _createClass from \"@babel/runtime/helpers/createClass\";\nimport _defineProperty from \"@babel/runtime/helpers/defineProperty\";\n\nfunction ownKeys(object, enumerableOnly) { var keys = Object.keys(object); if (Object.getOwnPropertySymbols) { var symbols = Object.getOwnPropertySymbols(object); enumerableOnly && (symbols = symbols.filter(function (sym) { return Object.getOwnPropertyDescriptor(object, sym).enumerable; })), keys.push.apply(keys, symbols); } return keys; }\n\nfunction _objectSpread(target) { for (var i = 1; i < arguments.length; i++) { var source = null != arguments[i] ? arguments[i] : {}; i % 2 ? ownKeys(Object(source), !0).forEach(function (key) { _defineProperty(target, key, source[key]); }) : Object.getOwnPropertyDescriptors ? Object.defineProperties(target, Object.getOwnPropertyDescriptors(source)) : ownKeys(Object(source)).forEach(function (key) { Object.defineProperty(target, key, Object.getOwnPropertyDescriptor(source, key)); }); } return target; }\n\nexport var isAnalyticsEvent = function isAnalyticsEvent(obj) {\n var _obj$constructor;\n\n return obj instanceof AnalyticsEvent || !!(obj !== null && obj !== void 0 && obj._isAnalyticsEvent) || // Backwards compatibility with older analytics-next packages\n (obj === null || obj === void 0 ? void 0 : (_obj$constructor = obj.constructor) === null || _obj$constructor === void 0 ? void 0 : _obj$constructor.name) === 'AnalyticsEvent';\n};\n\nvar AnalyticsEvent = /*#__PURE__*/function () {\n function AnalyticsEvent(props) {\n var _this = this;\n\n _classCallCheck(this, AnalyticsEvent);\n\n _defineProperty(this, \"_isAnalyticsEvent\", true);\n\n _defineProperty(this, \"clone\", function () {\n // just a shallow clone, don't change sub refs unless you want to\n // affect the original's too\n var payload = _objectSpread({}, _this.payload);\n\n return new AnalyticsEvent({\n payload: payload\n });\n });\n\n this.payload = props.payload;\n }\n\n _createClass(AnalyticsEvent, [{\n key: \"update\",\n value: function update(updater) {\n if (typeof updater === 'function') {\n this.payload = updater(this.payload);\n }\n\n if (_typeof(updater) === 'object') {\n this.payload = _objectSpread(_objectSpread({}, this.payload), updater);\n }\n\n return this;\n }\n }]);\n\n return AnalyticsEvent;\n}();\n\nexport { AnalyticsEvent as default };","import _toConsumableArray from \"@babel/runtime/helpers/toConsumableArray\";\nimport _classCallCheck from \"@babel/runtime/helpers/classCallCheck\";\nimport _createClass from \"@babel/runtime/helpers/createClass\";\nimport _assertThisInitialized from \"@babel/runtime/helpers/assertThisInitialized\";\nimport _get from \"@babel/runtime/helpers/get\";\nimport _inherits from \"@babel/runtime/helpers/inherits\";\nimport _possibleConstructorReturn from \"@babel/runtime/helpers/possibleConstructorReturn\";\nimport _getPrototypeOf from \"@babel/runtime/helpers/getPrototypeOf\";\nimport _defineProperty from \"@babel/runtime/helpers/defineProperty\";\n\nfunction _createSuper(Derived) { var hasNativeReflectConstruct = _isNativeReflectConstruct(); return function _createSuperInternal() { var Super = _getPrototypeOf(Derived), result; if (hasNativeReflectConstruct) { var NewTarget = _getPrototypeOf(this).constructor; result = Reflect.construct(Super, arguments, NewTarget); } else { result = Super.apply(this, arguments); } return _possibleConstructorReturn(this, result); }; }\n\nfunction _isNativeReflectConstruct() { if (typeof Reflect === \"undefined\" || !Reflect.construct) return false; if (Reflect.construct.sham) return false; if (typeof Proxy === \"function\") return true; try { Boolean.prototype.valueOf.call(Reflect.construct(Boolean, [], function () {})); return true; } catch (e) { return false; } }\n\nimport AnalyticsEvent from './AnalyticsEvent';\nexport var isUIAnalyticsEvent = function isUIAnalyticsEvent(obj) {\n var _obj$constructor;\n\n return obj instanceof UIAnalyticsEvent || !!(obj !== null && obj !== void 0 && obj._isUIAnalyticsEvent) || // Backwards compatibility with older analytics-next packages\n (obj === null || obj === void 0 ? void 0 : (_obj$constructor = obj.constructor) === null || _obj$constructor === void 0 ? void 0 : _obj$constructor.name) === 'UIAnalyticsEvent';\n};\n\nvar UIAnalyticsEvent = /*#__PURE__*/function (_AnalyticsEvent) {\n _inherits(UIAnalyticsEvent, _AnalyticsEvent);\n\n var _super = _createSuper(UIAnalyticsEvent);\n\n function UIAnalyticsEvent(props) {\n var _this;\n\n _classCallCheck(this, UIAnalyticsEvent);\n\n _this = _super.call(this, props);\n\n _defineProperty(_assertThisInitialized(_this), \"_isUIAnalyticsEvent\", true);\n\n _defineProperty(_assertThisInitialized(_this), \"clone\", function () {\n if (_this.hasFired) {\n if (process.env.NODE_ENV !== 'production' && !process.env.CI) {\n // eslint-disable-next-line no-console\n console.warn(\"Cannot clone an event after it's been fired.\");\n }\n\n return null;\n }\n\n var context = _toConsumableArray(_this.context);\n\n var handlers = _toConsumableArray(_this.handlers);\n /**\n * A hacky \"deep clone\" of the object. This is limited in that it wont\n * support functions, regexs, Maps, Sets, etc, but none of those need to\n * be represented in our payload.\n */\n\n\n var payload = JSON.parse(JSON.stringify(_this.payload));\n return new UIAnalyticsEvent({\n context: context,\n handlers: handlers,\n payload: payload\n });\n });\n\n _defineProperty(_assertThisInitialized(_this), \"fire\", function (channel) {\n if (_this.hasFired) {\n if (process.env.NODE_ENV !== 'production' && !process.env.CI) {\n // eslint-disable-next-line no-console\n console.warn('Cannot fire an event twice.');\n }\n\n return;\n }\n\n _this.handlers.forEach(function (handler) {\n return handler(_assertThisInitialized(_this), channel);\n });\n\n _this.hasFired = true;\n });\n\n _this.context = props.context || [];\n _this.handlers = props.handlers || [];\n _this.hasFired = false;\n return _this;\n }\n\n _createClass(UIAnalyticsEvent, [{\n key: \"update\",\n value: function update(updater) {\n if (this.hasFired) {\n if (process.env.NODE_ENV !== 'production' && !process.env.CI) {\n // eslint-disable-next-line no-console\n console.warn(\"Cannot update an event after it's been fired.\");\n }\n\n return this;\n }\n\n return _get(_getPrototypeOf(UIAnalyticsEvent.prototype), \"update\", this).call(this, updater);\n }\n }]);\n\n return UIAnalyticsEvent;\n}(AnalyticsEvent);\n\nexport { UIAnalyticsEvent as default };","import _typeof from \"@babel/runtime/helpers/typeof\";\nimport assertThisInitialized from \"./assertThisInitialized.js\";\nexport default function _possibleConstructorReturn(self, call) {\n if (call && (_typeof(call) === \"object\" || typeof call === \"function\")) {\n return call;\n }\n\n return assertThisInitialized(self);\n}","import setPrototypeOf from \"./setPrototypeOf.js\";\nexport default function _inherits(subClass, superClass) {\n if (typeof superClass !== \"function\" && superClass !== null) {\n throw new TypeError(\"Super expression must either be null or a function\");\n }\n\n subClass.prototype = Object.create(superClass && superClass.prototype, {\n constructor: {\n value: subClass,\n writable: true,\n configurable: true\n }\n });\n if (superClass) setPrototypeOf(subClass, superClass);\n}","import AnalyticsNextContext from './context';\nexport default AnalyticsNextContext;\n//# sourceMappingURL=index.js.map","import { createContext } from 'react';\nvar AnalyticsNextContext = createContext({\n getAtlaskitAnalyticsContext: function () { return []; },\n getAtlaskitAnalyticsEventHandlers: function () { return []; },\n});\nexport default AnalyticsNextContext;\n//# sourceMappingURL=context.js.map","import { useCallbackOne } from 'use-memo-one';\nimport UIAnalyticsEvent from '../events/UIAnalyticsEvent';\nimport { useAnalyticsContext } from './useAnalyticsContext';\nexport function useAnalyticsEvents() {\n var analyticsContext = useAnalyticsContext();\n var createAnalyticsEvent = useCallbackOne(function (payload) {\n return new UIAnalyticsEvent({\n context: analyticsContext.getAtlaskitAnalyticsContext(),\n handlers: analyticsContext.getAtlaskitAnalyticsEventHandlers(),\n payload: payload\n });\n }, [analyticsContext]);\n return {\n createAnalyticsEvent: createAnalyticsEvent\n };\n}","import { useContext } from 'react';\nimport { default as AnalyticsReactContext } from '@atlaskit/analytics-next-stable-react-context';\nexport var useAnalyticsContext = function useAnalyticsContext() {\n return useContext(AnalyticsReactContext);\n};","import { useEffect, useRef } from 'react';\nexport var useTrackedRef = function useTrackedRef(value) {\n var ref = useRef(value);\n useEffect(function () {\n ref.current = value;\n }, [value]);\n return ref;\n};","import _defineProperty from \"@babel/runtime/helpers/defineProperty\";\n\nfunction ownKeys(object, enumerableOnly) { var keys = Object.keys(object); if (Object.getOwnPropertySymbols) { var symbols = Object.getOwnPropertySymbols(object); enumerableOnly && (symbols = symbols.filter(function (sym) { return Object.getOwnPropertyDescriptor(object, sym).enumerable; })), keys.push.apply(keys, symbols); } return keys; }\n\nfunction _objectSpread(target) { for (var i = 1; i < arguments.length; i++) { var source = null != arguments[i] ? arguments[i] : {}; i % 2 ? ownKeys(Object(source), !0).forEach(function (key) { _defineProperty(target, key, source[key]); }) : Object.getOwnPropertyDescriptors ? Object.defineProperties(target, Object.getOwnPropertyDescriptors(source)) : ownKeys(Object(source)).forEach(function (key) { Object.defineProperty(target, key, Object.getOwnPropertyDescriptor(source, key)); }); } return target; }\n\nimport { useCallback } from 'react';\nimport { useAnalyticsEvents } from './useAnalyticsEvents';\nimport { useTrackedRef } from './useTrackedRef';\n// WARNING: This hook will only function correctly for leaf node components - as in\n// no children inside the component will require analytics themselves.\n// Ignoring this warning will mean the analytics context of child components will not\n// include the context of this component, .e.g, lost data.\n// If you are going to have child components that require analytics use withAnalytics\n// or AnalyticsContext component instead.\nexport function usePlatformLeafSyntheticEventHandler(_ref) {\n var fn = _ref.fn,\n action = _ref.action,\n componentName = _ref.componentName,\n packageName = _ref.packageName,\n packageVersion = _ref.packageVersion,\n analyticsData = _ref.analyticsData;\n\n var _useAnalyticsEvents = useAnalyticsEvents(),\n createAnalyticsEvent = _useAnalyticsEvents.createAnalyticsEvent; // We put analyticsData and fn in a ref so that we don't need to break\n // memoization.\n // Generally these could be defined by consumers inline\n // and so we do this to avoid breaking memoization of useCallback\n\n\n var dataRef = useTrackedRef(analyticsData);\n var fnRef = useTrackedRef(fn);\n var handler = useCallback(function () {\n var analyticsEvent = createAnalyticsEvent({\n action: action,\n actionSubject: componentName,\n attributes: {\n componentName: componentName,\n packageName: packageName,\n packageVersion: packageVersion\n }\n }); // To avoid wrapping this component in AnalyticsContext we manually\n // push the parent context's meta data into the context.\n // Note: this new 'context'\n\n var context = _objectSpread({\n componentName: componentName,\n packageName: packageName,\n packageVersion: packageVersion\n }, dataRef.current);\n\n analyticsEvent.context.push(context); // fire an event on the atlaskit channel\n\n var clone = analyticsEvent.clone();\n\n if (clone) {\n clone.fire('atlaskit');\n }\n\n fnRef.current(analyticsEvent);\n }, [// These are strings and won't change\n action, componentName, packageName, packageVersion, // This function is memoized in the context\n createAnalyticsEvent, // these are a stable ref because of the useTrackedRef hook\n dataRef, fnRef]);\n return handler;\n}","/**\n * An empty function which does nothing.\n */\n// eslint-disable-next-line @repo/internal/react/use-noop\nexport default function noop() {}","import _slicedToArray from \"@babel/runtime/helpers/slicedToArray\";\nimport { useEffect, useState } from 'react';\nimport { bind } from 'bind-event-listener';\n\nvar isMatchMediaAvailable = function isMatchMediaAvailable() {\n return typeof window !== 'undefined' && 'matchMedia' in window;\n};\n/**\n * Use for any programatic motions needed at runtime.\n * Will return `true` if the current user prefers reduced motion.\n * This is generally set through OS preferences/settings.\n */\n\n\nexport var isReducedMotion = function isReducedMotion() {\n if (!isMatchMediaAvailable()) {\n return false;\n }\n\n var _window$matchMedia = window.matchMedia('(prefers-reduced-motion: reduce)'),\n matches = _window$matchMedia.matches;\n\n return matches;\n};\n/**\n * A React hook version of {@link isReducedMotion}.\n * Useful for React components that need to re-render if the user's motion\n * preference changes at runtime.\n */\n\nexport var useIsReducedMotion = function useIsReducedMotion() {\n var _useState = useState(isReducedMotion),\n _useState2 = _slicedToArray(_useState, 2),\n prefersReducedMotion = _useState2[0],\n setPrefersReducedMotion = _useState2[1];\n\n useEffect(function () {\n if (!isMatchMediaAvailable()) {\n return;\n }\n\n var mediaQueryList = window.matchMedia('(prefers-reduced-motion: reduce)');\n\n var onChange = function onChange(event) {\n return setPrefersReducedMotion(event.matches);\n };\n\n return bind(mediaQueryList, {\n type: 'change',\n listener: onChange\n });\n }, []);\n return prefersReducedMotion;\n};\n/**\n * Use for any CSS based motion (animation or transition).\n * Always put at the end of your declaration for correct use of the cascade.\n * Reduced motion preference is generally set through OS preferences/settings.\n */\n\nexport var prefersReducedMotion = function prefersReducedMotion() {\n return {\n '@media (prefers-reduced-motion: reduce)': {\n animation: 'none',\n transition: 'none'\n }\n };\n};","export default function _arrayLikeToArray(arr, len) {\n if (len == null || len > arr.length) len = arr.length;\n\n for (var i = 0, arr2 = new Array(len); i < len; i++) {\n arr2[i] = arr[i];\n }\n\n return arr2;\n}","import arrayWithHoles from \"./arrayWithHoles.js\";\nimport iterableToArrayLimit from \"./iterableToArrayLimit.js\";\nimport unsupportedIterableToArray from \"./unsupportedIterableToArray.js\";\nimport nonIterableRest from \"./nonIterableRest.js\";\nexport default function _slicedToArray(arr, i) {\n return arrayWithHoles(arr) || iterableToArrayLimit(arr, i) || unsupportedIterableToArray(arr, i) || nonIterableRest();\n}","export default function _arrayWithHoles(arr) {\n if (Array.isArray(arr)) return arr;\n}","export default function _iterableToArrayLimit(arr, i) {\n if (typeof Symbol === \"undefined\" || !(Symbol.iterator in Object(arr))) return;\n var _arr = [];\n var _n = true;\n var _d = false;\n var _e = undefined;\n\n try {\n for (var _i = arr[Symbol.iterator](), _s; !(_n = (_s = _i.next()).done); _n = true) {\n _arr.push(_s.value);\n\n if (i && _arr.length === i) break;\n }\n } catch (err) {\n _d = true;\n _e = err;\n } finally {\n try {\n if (!_n && _i[\"return\"] != null) _i[\"return\"]();\n } finally {\n if (_d) throw _e;\n }\n }\n\n return _arr;\n}","import arrayLikeToArray from \"./arrayLikeToArray.js\";\nexport default function _unsupportedIterableToArray(o, minLen) {\n if (!o) return;\n if (typeof o === \"string\") return arrayLikeToArray(o, minLen);\n var n = Object.prototype.toString.call(o).slice(8, -1);\n if (n === \"Object\" && o.constructor) n = o.constructor.name;\n if (n === \"Map\" || n === \"Set\") return Array.from(o);\n if (n === \"Arguments\" || /^(?:Ui|I)nt(?:8|16|32)(?:Clamped)?Array$/.test(n)) return arrayLikeToArray(o, minLen);\n}","export default function _nonIterableRest() {\n throw new TypeError(\"Invalid attempt to destructure non-iterable instance.\\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method.\");\n}","import _slicedToArray from \"@babel/runtime/helpers/slicedToArray\";\nimport { useCallback, useState } from 'react';\nexport var useForceRender = function useForceRender() {\n var _useState = useState({}),\n _useState2 = _slicedToArray(_useState, 2),\n updateState = _useState2[1];\n\n var forceRender = useCallback(function () {\n return updateState({});\n }, []);\n return forceRender;\n};","import React, { Children, createContext, memo, useContext, useMemo, useRef } from 'react';\nimport { isReducedMotion } from '../utils/accessibility';\nimport { useForceRender } from '../utils/use-force-render';\n/**\n * Internally we will be playing with an element that will always have a key defined.\n */\n\n// We define empty context here so the object doesn't change.\nvar emptyContext = {\n // Motions will always appear if not inside a exiting persistence component.\n appear: true,\n isExiting: false\n};\nvar ExitingContext = /*#__PURE__*/createContext(emptyContext);\n\nvar isAnyPreviousKeysMissingFromCurrent = function isAnyPreviousKeysMissingFromCurrent(currentMap, previous) {\n for (var i = 0; i < previous.length; i++) {\n var element = previous[i];\n var _key = element.key;\n\n if (!currentMap[_key]) {\n return true;\n }\n }\n\n return false;\n};\n/**\n * This method will wrap any React element with a context provider. We're using context (instead of\n * cloneElement) so we can communicate between multiple elements without the need of prop drilling\n * (results in a better API for consumers).\n */\n\n\nvar wrapChildWithContextProvider = function wrapChildWithContextProvider(child) {\n var value = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : emptyContext;\n return /*#__PURE__*/React.createElement(ExitingContext.Provider, {\n key: \"\".concat(child.key, \"-provider\"),\n value: value\n }, child);\n};\n\nvar childrenToObj = function childrenToObj(children) {\n return children.reduce(function (acc, child) {\n acc[child.key] = child;\n return acc;\n }, {});\n};\n\nvar spliceNewElementsIntoPrevious = function spliceNewElementsIntoPrevious(current, previous) {\n var splicedChildren = previous.concat([]);\n var previousMap = childrenToObj(previous);\n\n for (var i = 0; i < current.length; i++) {\n var child = current[i];\n var childIsNew = !previousMap[child.key];\n\n if (childIsNew) {\n // This will insert the new element after the previous element.\n splicedChildren.splice(i + 1, 0, child);\n }\n }\n\n return splicedChildren;\n};\n/**\n * This function will convert all children types to an array while also filtering out non-valid React elements.\n */\n\n\nvar childrenToArray = function childrenToArray(children) {\n var childrenAsArray = []; // We convert children to an array using this helper method as it will add keys to children that do not\n // have them, such as when we have hardcoded children that are conditionally rendered.\n\n Children.toArray(children).forEach(function (child) {\n // We ignore any boolean children to make our code a little more simple later on,\n // and also filter out any falsies (empty strings, nulls, and undefined).\n if (typeof child !== 'boolean' && Boolean(child)) {\n // Children WILL have a key after being forced into an array using the React.Children helper.\n childrenAsArray.push(child);\n }\n });\n return childrenAsArray;\n};\n/**\n * This handles the case when a render updates during an exit motion.\n * If any child is mounted again we removed them from the exiting children object and return true.\n */\n\n\nvar hasAnyExitingChildMountedAgain = function hasAnyExitingChildMountedAgain(exitingChildren, children) {\n var exitingChildMountedAgain = false;\n children.forEach(function (child) {\n if (exitingChildren.current[child.key]) {\n exitingChildMountedAgain = true;\n delete exitingChildren.current[child.key];\n }\n });\n return exitingChildMountedAgain;\n};\n/**\n * __ExitingPersistence__\n *\n * Useful for enabling elements to persist and animate away when they are removed from the DOM.\n *\n * - [Examples](https://atlaskit.atlassian.com/packages/design-system/motion/docs/entering-motions)\n */\n\n\nvar ExitingPersistence = /*#__PURE__*/memo(function (_ref) {\n var _ref$appear = _ref.appear,\n appearFromProp = _ref$appear === void 0 ? false : _ref$appear,\n childs = _ref.children,\n exitThenEnter = _ref.exitThenEnter;\n var children = childrenToArray(childs);\n var childrenObj = childrenToObj(children);\n var previousChildren = useRef([]);\n var persistedChildren = useRef([]);\n var forceRender = useForceRender();\n var exitingChildren = useRef({});\n var appear = useRef(appearFromProp);\n var defaultContextValue = useMemo(function () {\n return {\n appear: appear.current,\n isExiting: false\n };\n }, // React rules of hooks says this isn't needed because mutating appear won't cause a re-render.\n // While technically true - it will trigger this to make a new object on the _next_ render which is what we want.\n // Remove this or use appear instead of appear.current and you will notice a test breaks.\n // eslint-disable-next-line react-hooks/exhaustive-deps\n [appear.current]);\n\n if (isReducedMotion()) {\n return children;\n }\n\n if (!appear.current) {\n // We always want child motions to appear after the initial mount.\n appear.current = true;\n } // This entire block can't be an effect because we need it to run synchronously during a render\n // else when elements are being removed they will be remounted instead of being updated.\n\n\n if (previousChildren.current.length && isAnyPreviousKeysMissingFromCurrent(childrenObj, previousChildren.current)) {\n if (persistedChildren.current.length === 0 || hasAnyExitingChildMountedAgain(exitingChildren, children)) {\n persistedChildren.current = previousChildren.current;\n } // We have persisted children now set from previous children.\n // Let's update previous children so we have it available next render.\n\n\n previousChildren.current = children;\n return (exitThenEnter ? persistedChildren.current : spliceNewElementsIntoPrevious(children, persistedChildren.current)).map(function (child) {\n // eslint-disable-next-line @repo/internal/react/no-children-properties-access\n var currentChild = childrenObj[child.key];\n\n if (!currentChild) {\n // We've found an exiting child - mark it!\n exitingChildren.current[child.key] = true;\n return wrapChildWithContextProvider(child, {\n isExiting: true,\n appear: true,\n onFinish: function onFinish() {\n delete exitingChildren.current[child.key]; // We will only remove the exiting elements when any subsequent exiting elements have also finished.\n // Think of removing many items from a todo list - when removing a few over a few clicks we don't\n // want the list jumping around when they exit.\n\n if (Object.keys(exitingChildren.current).length === 0) {\n // Set previous children to nothing.\n // This let's us skip the next render check as it's assumed children and previous will be the same.\n previousChildren.current = [];\n persistedChildren.current = []; // Re-render after the element(s) have animated away which will end up rendering the latest children.\n\n forceRender();\n }\n }\n });\n } // This element isn't exiting.\n // Wrap context and let's continue on our way.\n\n\n return wrapChildWithContextProvider(currentChild, defaultContextValue);\n });\n } else {\n previousChildren.current = children;\n }\n\n return children.map(function (child) {\n return wrapChildWithContextProvider(child, defaultContextValue);\n });\n});\nexport var useExitingPersistence = function useExitingPersistence() {\n return useContext(ExitingContext);\n};\nExitingPersistence.displayName = 'ExitingPersistence';\nexport default ExitingPersistence;","export default function _defineProperty(obj, key, value) {\n if (key in obj) {\n Object.defineProperty(obj, key, {\n value: value,\n enumerable: true,\n configurable: true,\n writable: true\n });\n } else {\n obj[key] = value;\n }\n\n return obj;\n}","export var easeInOut = 'cubic-bezier(0.15,1,0.3,1)';\nexport var easeOut = 'cubic-bezier(0.2,0,0,1)';\nexport var easeIn = 'cubic-bezier(0.8,0,0,0.8)';","import { useCallback, useEffect, useRef } from 'react';\n\nvar getHookDeps = function getHookDeps(opts) {\n switch (opts.cleanup) {\n case 'next-effect':\n return undefined;\n\n case 'unmount':\n default:\n return [];\n }\n};\n/**\n * Will return request animation frame as a function which will clean itself up.\n */\n\n\nexport var useRequestAnimationFrame = function useRequestAnimationFrame() {\n var opts = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : {\n cleanup: 'unmount'\n };\n var frames = useRef([]);\n useEffect(function () {\n return function () {\n if (frames.current.length) {\n frames.current.forEach(function (id) {\n return cancelAnimationFrame(id);\n });\n frames.current = [];\n }\n }; // We dynamically set this so we either clean up on the next effect - or on unmount.\n // eslint-disable-next-line react-hooks/exhaustive-deps\n }, getHookDeps(opts));\n return useCallback(function (handler) {\n var id = requestAnimationFrame(function (time) {\n frames.current = frames.current.filter(function (frameId) {\n return frameId !== id;\n });\n handler(time);\n });\n frames.current.push(id);\n }, []);\n};\n/**\n * Will return set timeout as a function which will clean itself up.\n */\n\nexport var useSetTimeout = function useSetTimeout() {\n var opts = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : {\n cleanup: 'unmount'\n };\n var timeouts = useRef([]);\n useEffect(function () {\n return function () {\n if (timeouts.current.length) {\n timeouts.current.forEach(function (id) {\n return clearTimeout(id);\n });\n timeouts.current = [];\n }\n }; // We dynamically set this so we either clean up on the next effect - or on unmount.\n // eslint-disable-next-line react-hooks/exhaustive-deps\n }, getHookDeps(opts));\n return useCallback(function (handler, timeout) {\n for (var _len = arguments.length, args = new Array(_len > 2 ? _len - 2 : 0), _key = 2; _key < _len; _key++) {\n args[_key - 2] = arguments[_key];\n }\n\n var id = setTimeout.apply(void 0, [function () {\n timeouts.current = timeouts.current.filter(function (timeoutId) {\n return timeoutId !== id;\n });\n handler();\n }, timeout].concat(args));\n timeouts.current.push(id);\n }, []);\n};","import _slicedToArray from \"@babel/runtime/helpers/slicedToArray\";\nimport React, { createContext, useContext, useRef, useState } from 'react';\nimport noop from '@atlaskit/ds-lib/noop';\nimport { useLayoutEffect } from '../utils/use-layout-effect';\nimport { useUniqueId } from '../utils/use-unique-id';\nvar StaggeredEntranceContext = /*#__PURE__*/createContext(function () {\n return {\n isReady: true,\n delay: 0,\n ref: noop\n };\n});\nexport var useStaggeredEntrance = function useStaggeredEntrance() {\n var indentifier = useUniqueId();\n var context = useContext(StaggeredEntranceContext);\n return context(indentifier);\n};\n/**\n * For a list of elements that need to animate in,\n * this should be used in conjunction with entering components.\n * This does not need Javascript to execute so it will run immediately for any SSR rendered React apps before the JS has executed.\n *\n * Will dynamically add delay to each child entering component.\n * Unfortunately all entering components _NEED_ to be a direct descendant.\n */\n\nvar StaggeredEntrance = function StaggeredEntrance(_ref) {\n var children = _ref.children,\n column = _ref.column,\n _ref$columns = _ref.columns,\n columns = _ref$columns === void 0 ? 'responsive' : _ref$columns,\n _ref$delayStep = _ref.delayStep,\n delayStep = _ref$delayStep === void 0 ? 50 : _ref$delayStep;\n var elementRefs = useRef([]);\n var indexes = [];\n\n var _useState = useState(function () {\n if (typeof columns === 'number') {\n // A hardcoded columns is set so bail out and set it to that!\n return columns;\n }\n\n if (typeof column === 'number') {\n // A hardcoded column is set so we will set actualColumns to be 1.\n return 1;\n } // We are in \"responsive\" mode.\n // So we will be calculating when the Javascript executes on the client how many columns there will be.\n\n\n return 0;\n }),\n _useState2 = _slicedToArray(_useState, 2),\n actualColumns = _useState2[0],\n setActualColumns = _useState2[1];\n\n useLayoutEffect(function () {\n // We want to only run this code when we are in \"responsive\" mode.\n // It is assumed we are in responsive mode if `columns` is \"responsive\",\n // we have children element refs ready to be read (i.e. if there are no children this won't run as well)\n // and finally that `actualColumns` is `0` - this is because for the first render cycle `actualColumns` will be `0` (set above)\n // and then after this layout effect runs the value for `actualColumns` will then be calculated and set.\n if (columns === 'responsive' && elementRefs.current.length && actualColumns === 0) {\n var currentTop = 0;\n var numberColumns = 0;\n\n if (elementRefs.current.length <= 1) {\n setActualColumns(1);\n return;\n } // We set the current top to the first elements.\n // We will be comparing this and incrementing the column count\n // until we hit an element that has a different offset top (or we run out of elements).\n\n\n currentTop = elementRefs.current[0] ? elementRefs.current[0].offsetTop : 0;\n\n for (var i = 0; i < elementRefs.current.length; i++) {\n var child = elementRefs.current[i];\n\n if (!child) {\n break;\n }\n\n if (currentTop === child.offsetTop) {\n numberColumns += 1;\n\n if (elementRefs.current.length - 1 === i) {\n setActualColumns(numberColumns);\n }\n\n continue;\n }\n\n setActualColumns(numberColumns);\n break;\n }\n } // We only want this effect to run once - on initial mount.\n // eslint-disable-next-line react-hooks/exhaustive-deps\n\n }, []);\n return /*#__PURE__*/React.createElement(StaggeredEntranceContext.Provider, {\n value: function value(id) {\n if (!indexes.includes(id)) {\n indexes.push(id);\n }\n\n var isReady = actualColumns > 0;\n var index = indexes.indexOf(id);\n var currentColumn = column || index % actualColumns;\n var currentRow = Math.floor(index / actualColumns);\n var distanceFromTopLeftElement = currentRow + currentColumn; // We don't want loads of elements to have the same staggered delay as it ends up looking slow for users.\n // To get around that we calculate the logarithm using `distanceFromTopLeftElement` which ends making\n // elements appear faster the further away from the top left element.\n\n var delay = Math.ceil(Math.log(distanceFromTopLeftElement + 1) * delayStep * 1.5) || 0;\n return {\n delay: delay,\n isReady: isReady,\n ref: function ref(element) {\n return elementRefs.current[index] = element;\n }\n };\n }\n }, children);\n};\n\nexport default StaggeredEntrance;","/* eslint-disable @repo/internal/react/disallow-unstable-values */\nimport { useRef } from 'react';\n/**\n * Will return a unique id that does not change between renders.\n * Try not use this to render DOM markup (attributes or otherwise)\n * as you will probably not get the same result on the Server vs. Client.\n */\n\nexport function useUniqueId() {\n var identifier = useRef('');\n\n if (!identifier.current) {\n identifier.current = '_' + (Number(String(Math.random()).slice(2)) + Date.now() + Math.round(performance.now())).toString(36);\n }\n\n return identifier.current;\n}","import _defineProperty from \"@babel/runtime/helpers/defineProperty\";\nimport _slicedToArray from \"@babel/runtime/helpers/slicedToArray\";\n\nfunction ownKeys(object, enumerableOnly) { var keys = Object.keys(object); if (Object.getOwnPropertySymbols) { var symbols = Object.getOwnPropertySymbols(object); enumerableOnly && (symbols = symbols.filter(function (sym) { return Object.getOwnPropertyDescriptor(object, sym).enumerable; })), keys.push.apply(keys, symbols); } return keys; }\n\nfunction _objectSpread(target) { for (var i = 1; i < arguments.length; i++) { var source = null != arguments[i] ? arguments[i] : {}; i % 2 ? ownKeys(Object(source), !0).forEach(function (key) { _defineProperty(target, key, source[key]); }) : Object.getOwnPropertyDescriptors ? Object.defineProperties(target, Object.getOwnPropertyDescriptors(source)) : ownKeys(Object(source)).forEach(function (key) { Object.defineProperty(target, key, Object.getOwnPropertyDescriptor(source, key)); }); } return target; }\n\nimport React, { useEffect, useState } from 'react';\nimport { ClassNames, keyframes } from '@emotion/core';\nimport { prefersReducedMotion } from '../utils/accessibility';\nimport { largeDurationMs } from '../utils/durations';\nimport { useSetTimeout } from '../utils/timer-hooks';\nimport { useExitingPersistence } from './exiting-persistence';\nimport { useStaggeredEntrance } from './staggered-entrance';\n\n/**\n * Used to multiply the initial duration for exiting motions.\n */\nvar EXITING_MOTION_MULTIPLIER = 0.5;\n/**\n * This is the base INTERNAL component used for all other entering motions.\n * This does not need Javascript to execute on the client so it will run immediately\n * for any SSR rendered React apps before the JS has executed.\n */\n\nvar EnteringMotion = function EnteringMotion(_ref) {\n var children = _ref.children,\n animationTimingFunction = _ref.animationTimingFunction,\n enteringAnimation = _ref.enteringAnimation,\n exitingAnimation = _ref.exitingAnimation,\n isPaused = _ref.isPaused,\n onFinishMotion = _ref.onFinish,\n _ref$duration = _ref.duration,\n duration = _ref$duration === void 0 ? largeDurationMs : _ref$duration;\n var staggered = useStaggeredEntrance();\n\n var _useExitingPersistenc = useExitingPersistence(),\n isExiting = _useExitingPersistenc.isExiting,\n onExitFinished = _useExitingPersistenc.onFinish,\n appear = _useExitingPersistenc.appear;\n\n var setTimeout = useSetTimeout();\n var paused = isPaused || !staggered.isReady;\n var delay = isExiting ? 0 : staggered.delay;\n var state = isExiting ? 'exiting' : 'entering';\n\n var _useState = useState(appear),\n _useState2 = _slicedToArray(_useState, 2),\n hasAnimationStyles = _useState2[0],\n setHasAnimationStyles = _useState2[1];\n\n useEffect(function () {\n // Tracking this to prevent changing state on an unmounted component\n var isCancelled = false;\n\n if (paused) {\n return;\n } // On initial mount if elements aren't set to animate on appear, we return early and callback\n\n\n if (!appear) {\n onFinishMotion && onFinishMotion(state);\n return;\n } // Elements may need animation styles back after initial mount (they could animate out)\n\n\n setHasAnimationStyles(true);\n setTimeout(function () {\n if (state === 'exiting') {\n onExitFinished && onExitFinished();\n }\n\n if (!isCancelled) {\n setHasAnimationStyles(false);\n }\n\n onFinishMotion && onFinishMotion(state);\n }, isExiting ? duration * EXITING_MOTION_MULTIPLIER : duration + delay);\n return function () {\n isCancelled = true;\n }; // We ignore this for onFinishMotion as consumers could potentially inline the function\n // which would then trigger this effect every re-render.\n // We want to make it easier for consumers so we go down this path unfortunately.\n // eslint-disable-next-line react-hooks/exhaustive-deps\n }, [onExitFinished, state, isExiting, duration, delay, paused, setTimeout]);\n return /*#__PURE__*/React.createElement(ClassNames, null, function (_ref2) {\n var css = _ref2.css;\n return children({\n ref: staggered.ref,\n className: hasAnimationStyles ? css(_objectSpread(_objectSpread({}, prefersReducedMotion()), {}, {\n animationDelay: \"\".concat(delay, \"ms\"),\n animationDuration: \"\".concat(isExiting ? duration * EXITING_MOTION_MULTIPLIER : duration, \"ms\"),\n animationFillMode: isExiting ? 'forwards' : 'backwards',\n animationName: \"\".concat(keyframes(isExiting ? exitingAnimation || enteringAnimation : enteringAnimation)),\n animationPlayState: paused ? 'paused' : 'running',\n animationTimingFunction: animationTimingFunction(state)\n })) : ''\n }, state);\n });\n};\n\nexport default EnteringMotion;","/**\n * Think of this as the motion equivalent of the @atlaskit/theme `grid()`.\n */\nexport var durationStep = 25;\nexport var smallDurationMs = durationStep * 4;\nexport var mediumDurationMs = durationStep * 14;\nexport var largeDurationMs = durationStep * 28;","import _defineProperty from \"@babel/runtime/helpers/defineProperty\";\n\nfunction ownKeys(object, enumerableOnly) { var keys = Object.keys(object); if (Object.getOwnPropertySymbols) { var symbols = Object.getOwnPropertySymbols(object); enumerableOnly && (symbols = symbols.filter(function (sym) { return Object.getOwnPropertyDescriptor(object, sym).enumerable; })), keys.push.apply(keys, symbols); } return keys; }\n\nfunction _objectSpread(target) { for (var i = 1; i < arguments.length; i++) { var source = null != arguments[i] ? arguments[i] : {}; i % 2 ? ownKeys(Object(source), !0).forEach(function (key) { _defineProperty(target, key, source[key]); }) : Object.getOwnPropertyDescriptors ? Object.defineProperties(target, Object.getOwnPropertyDescriptors(source)) : ownKeys(Object(source)).forEach(function (key) { Object.defineProperty(target, key, Object.getOwnPropertyDescriptor(source, key)); }); } return target; }\n\nimport React from 'react';\nimport { easeInOut } from '../utils/curves';\nimport { largeDurationMs } from '../utils/durations';\nimport KeyframesMotion from './keyframes-motion';\nvar directionMotions = {\n proportional: {\n bottom: 'translate3d(0, calc(5% + 4px), 0)',\n left: 'translate3d(calc(-5% - 4px), 0, 0)',\n right: 'translate3d(calc(5% + 4px), 0, 0)',\n top: 'translate3d(0, calc(-5% - 4px), 0)'\n },\n constant: {\n bottom: 'translate3d(0, 4px, 0)',\n left: 'translate3d(-4px, 0, 0)',\n right: 'translate3d(4px, 0, 0)',\n top: 'translate3d(0, -4px, 0)'\n }\n};\nvar invertedDirection = {\n top: 'bottom',\n bottom: 'top',\n left: 'right',\n right: 'left'\n};\nexport var fadeInAnimation = function fadeInAnimation(direction) {\n var distance = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : 'proportional';\n return {\n from: _objectSpread({\n opacity: 0\n }, direction !== undefined && {\n transform: directionMotions[distance][direction]\n }),\n '50%': {\n opacity: 1\n },\n to: {\n transform: direction !== undefined ? 'none' : undefined\n }\n };\n};\nexport var fadeOutAnimation = function fadeOutAnimation(direction) {\n var distance = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : 'proportional';\n return {\n from: {\n opacity: 1,\n transform: direction !== undefined ? 'translate3d(0, 0, 0)' : undefined\n },\n to: _objectSpread({\n opacity: 0\n }, direction !== undefined && {\n transform: directionMotions[distance][direction]\n })\n };\n};\n/**\n * Props for controlling the behavior of the FadeIn animation\n */\n\n/**\n * __FadeIn__\n *\n * Useful for fading in one or more elements.\n *\n * - [Examples](https://atlaskit.atlassian.com/packages/design-system/motion/docs/entering-motions)\n */\nvar FadeIn = function FadeIn(_ref) {\n var children = _ref.children,\n _ref$duration = _ref.duration,\n duration = _ref$duration === void 0 ? largeDurationMs : _ref$duration,\n entranceDirection = _ref.entranceDirection,\n exitDirection = _ref.exitDirection,\n _ref$distance = _ref.distance,\n distance = _ref$distance === void 0 ? 'proportional' : _ref$distance,\n onFinish = _ref.onFinish,\n isPaused = _ref.isPaused;\n var invertedEntranceDirection = entranceDirection && invertedDirection[entranceDirection];\n return /*#__PURE__*/React.createElement(KeyframesMotion, {\n duration: duration,\n enteringAnimation: fadeInAnimation(entranceDirection, distance),\n exitingAnimation: fadeOutAnimation(exitDirection || invertedEntranceDirection, distance),\n animationTimingFunction: function animationTimingFunction() {\n return easeInOut;\n },\n onFinish: onFinish,\n isPaused: isPaused\n }, children);\n};\n\nexport default FadeIn;","export default function _arrayLikeToArray(arr, len) {\n if (len == null || len > arr.length) len = arr.length;\n\n for (var i = 0, arr2 = new Array(len); i < len; i++) {\n arr2[i] = arr[i];\n }\n\n return arr2;\n}","import arrayLikeToArray from \"./arrayLikeToArray.js\";\nexport default function _unsupportedIterableToArray(o, minLen) {\n if (!o) return;\n if (typeof o === \"string\") return arrayLikeToArray(o, minLen);\n var n = Object.prototype.toString.call(o).slice(8, -1);\n if (n === \"Object\" && o.constructor) n = o.constructor.name;\n if (n === \"Map\" || n === \"Set\") return Array.from(o);\n if (n === \"Arguments\" || /^(?:Ui|I)nt(?:8|16|32)(?:Clamped)?Array$/.test(n)) return arrayLikeToArray(o, minLen);\n}","import arrayWithoutHoles from \"./arrayWithoutHoles.js\";\nimport iterableToArray from \"./iterableToArray.js\";\nimport unsupportedIterableToArray from \"./unsupportedIterableToArray.js\";\nimport nonIterableSpread from \"./nonIterableSpread.js\";\nexport default function _toConsumableArray(arr) {\n return arrayWithoutHoles(arr) || iterableToArray(arr) || unsupportedIterableToArray(arr) || nonIterableSpread();\n}","import arrayLikeToArray from \"./arrayLikeToArray.js\";\nexport default function _arrayWithoutHoles(arr) {\n if (Array.isArray(arr)) return arrayLikeToArray(arr);\n}","export default function _iterableToArray(iter) {\n if (typeof Symbol !== \"undefined\" && Symbol.iterator in Object(iter)) return Array.from(iter);\n}","export default function _nonIterableSpread() {\n throw new TypeError(\"Invalid attempt to spread non-iterable instance.\\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method.\");\n}","import arrayWithHoles from \"./arrayWithHoles.js\";\nimport iterableToArrayLimit from \"./iterableToArrayLimit.js\";\nimport unsupportedIterableToArray from \"./unsupportedIterableToArray.js\";\nimport nonIterableRest from \"./nonIterableRest.js\";\nexport default function _slicedToArray(arr, i) {\n return arrayWithHoles(arr) || iterableToArrayLimit(arr, i) || unsupportedIterableToArray(arr, i) || nonIterableRest();\n}","export default function _arrayWithHoles(arr) {\n if (Array.isArray(arr)) return arr;\n}","export default function _iterableToArrayLimit(arr, i) {\n if (typeof Symbol === \"undefined\" || !(Symbol.iterator in Object(arr))) return;\n var _arr = [];\n var _n = true;\n var _d = false;\n var _e = undefined;\n\n try {\n for (var _i = arr[Symbol.iterator](), _s; !(_n = (_s = _i.next()).done); _n = true) {\n _arr.push(_s.value);\n\n if (i && _arr.length === i) break;\n }\n } catch (err) {\n _d = true;\n _e = err;\n } finally {\n try {\n if (!_n && _i[\"return\"] != null) _i[\"return\"]();\n } finally {\n if (_d) throw _e;\n }\n }\n\n return _arr;\n}","export default function _nonIterableRest() {\n throw new TypeError(\"Invalid attempt to destructure non-iterable instance.\\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method.\");\n}","import * as React from 'react';\nexport var ManagerReferenceNodeContext = React.createContext();\nexport var ManagerReferenceNodeSetterContext = React.createContext();\nexport function Manager(_ref) {\n var children = _ref.children;\n\n var _React$useState = React.useState(null),\n referenceNode = _React$useState[0],\n setReferenceNode = _React$useState[1];\n\n var hasUnmounted = React.useRef(false);\n React.useEffect(function () {\n return function () {\n hasUnmounted.current = true;\n };\n }, []);\n var handleSetReferenceNode = React.useCallback(function (node) {\n if (!hasUnmounted.current) {\n setReferenceNode(node);\n }\n }, []);\n return /*#__PURE__*/React.createElement(ManagerReferenceNodeContext.Provider, {\n value: referenceNode\n }, /*#__PURE__*/React.createElement(ManagerReferenceNodeSetterContext.Provider, {\n value: handleSetReferenceNode\n }, children));\n}","import * as React from 'react';\n\n/**\n * Takes an argument and if it's an array, returns the first item in the array,\n * otherwise returns the argument. Used for Preact compatibility.\n */\nexport var unwrapArray = function unwrapArray(arg) {\n return Array.isArray(arg) ? arg[0] : arg;\n};\n/**\n * Takes a maybe-undefined function and arbitrary args and invokes the function\n * only if it is defined.\n */\n\nexport var safeInvoke = function safeInvoke(fn) {\n if (typeof fn === 'function') {\n for (var _len = arguments.length, args = new Array(_len > 1 ? _len - 1 : 0), _key = 1; _key < _len; _key++) {\n args[_key - 1] = arguments[_key];\n }\n\n return fn.apply(void 0, args);\n }\n};\n/**\n * Sets a ref using either a ref callback or a ref object\n */\n\nexport var setRef = function setRef(ref, node) {\n // if its a function call it\n if (typeof ref === 'function') {\n return safeInvoke(ref, node);\n } // otherwise we should treat it as a ref object\n else if (ref != null) {\n ref.current = node;\n }\n};\n/**\n * Simple ponyfill for Object.fromEntries\n */\n\nexport var fromEntries = function fromEntries(entries) {\n return entries.reduce(function (acc, _ref) {\n var key = _ref[0],\n value = _ref[1];\n acc[key] = value;\n return acc;\n }, {});\n};\n/**\n * Small wrapper around `useLayoutEffect` to get rid of the warning on SSR envs\n */\n\nexport var useIsomorphicLayoutEffect = typeof window !== 'undefined' && window.document && window.document.createElement ? React.useLayoutEffect : React.useEffect;","export default function getWindow(node) {\n if (node == null) {\n return window;\n }\n\n if (node.toString() !== '[object Window]') {\n var ownerDocument = node.ownerDocument;\n return ownerDocument ? ownerDocument.defaultView || window : window;\n }\n\n return node;\n}","import getWindow from \"./getWindow.js\";\n\nfunction isElement(node) {\n var OwnElement = getWindow(node).Element;\n return node instanceof OwnElement || node instanceof Element;\n}\n\nfunction isHTMLElement(node) {\n var OwnElement = getWindow(node).HTMLElement;\n return node instanceof OwnElement || node instanceof HTMLElement;\n}\n\nfunction isShadowRoot(node) {\n // IE 11 has no ShadowRoot\n if (typeof ShadowRoot === 'undefined') {\n return false;\n }\n\n var OwnElement = getWindow(node).ShadowRoot;\n return node instanceof OwnElement || node instanceof ShadowRoot;\n}\n\nexport { isElement, isHTMLElement, isShadowRoot };","export var max = Math.max;\nexport var min = Math.min;\nexport var round = Math.round;","export default function getUAString() {\n var uaData = navigator.userAgentData;\n\n if (uaData != null && uaData.brands) {\n return uaData.brands.map(function (item) {\n return item.brand + \"/\" + item.version;\n }).join(' ');\n }\n\n return navigator.userAgent;\n}","import getUAString from \"../utils/userAgent.js\";\nexport default function isLayoutViewport() {\n return !/^((?!chrome|android).)*safari/i.test(getUAString());\n}","import { isElement, isHTMLElement } from \"./instanceOf.js\";\nimport { round } from \"../utils/math.js\";\nimport getWindow from \"./getWindow.js\";\nimport isLayoutViewport from \"./isLayoutViewport.js\";\nexport default function getBoundingClientRect(element, includeScale, isFixedStrategy) {\n if (includeScale === void 0) {\n includeScale = false;\n }\n\n if (isFixedStrategy === void 0) {\n isFixedStrategy = false;\n }\n\n var clientRect = element.getBoundingClientRect();\n var scaleX = 1;\n var scaleY = 1;\n\n if (includeScale && isHTMLElement(element)) {\n scaleX = element.offsetWidth > 0 ? round(clientRect.width) / element.offsetWidth || 1 : 1;\n scaleY = element.offsetHeight > 0 ? round(clientRect.height) / element.offsetHeight || 1 : 1;\n }\n\n var _ref = isElement(element) ? getWindow(element) : window,\n visualViewport = _ref.visualViewport;\n\n var addVisualOffsets = !isLayoutViewport() && isFixedStrategy;\n var x = (clientRect.left + (addVisualOffsets && visualViewport ? visualViewport.offsetLeft : 0)) / scaleX;\n var y = (clientRect.top + (addVisualOffsets && visualViewport ? visualViewport.offsetTop : 0)) / scaleY;\n var width = clientRect.width / scaleX;\n var height = clientRect.height / scaleY;\n return {\n width: width,\n height: height,\n top: y,\n right: x + width,\n bottom: y + height,\n left: x,\n x: x,\n y: y\n };\n}","import getWindow from \"./getWindow.js\";\nexport default function getWindowScroll(node) {\n var win = getWindow(node);\n var scrollLeft = win.pageXOffset;\n var scrollTop = win.pageYOffset;\n return {\n scrollLeft: scrollLeft,\n scrollTop: scrollTop\n };\n}","export default function getNodeName(element) {\n return element ? (element.nodeName || '').toLowerCase() : null;\n}","import { isElement } from \"./instanceOf.js\";\nexport default function getDocumentElement(element) {\n // $FlowFixMe[incompatible-return]: assume body is always available\n return ((isElement(element) ? element.ownerDocument : // $FlowFixMe[prop-missing]\n element.document) || window.document).documentElement;\n}","import getBoundingClientRect from \"./getBoundingClientRect.js\";\nimport getDocumentElement from \"./getDocumentElement.js\";\nimport getWindowScroll from \"./getWindowScroll.js\";\nexport default function getWindowScrollBarX(element) {\n // If has a CSS width greater than the viewport, then this will be\n // incorrect for RTL.\n // Popper 1 is broken in this case and never had a bug report so let's assume\n // it's not an issue. I don't think anyone ever specifies width on \n // anyway.\n // Browsers where the left scrollbar doesn't cause an issue report `0` for\n // this (e.g. Edge 2019, IE11, Safari)\n return getBoundingClientRect(getDocumentElement(element)).left + getWindowScroll(element).scrollLeft;\n}","import getWindow from \"./getWindow.js\";\nexport default function getComputedStyle(element) {\n return getWindow(element).getComputedStyle(element);\n}","import getComputedStyle from \"./getComputedStyle.js\";\nexport default function isScrollParent(element) {\n // Firefox wants us to check `-x` and `-y` variations as well\n var _getComputedStyle = getComputedStyle(element),\n overflow = _getComputedStyle.overflow,\n overflowX = _getComputedStyle.overflowX,\n overflowY = _getComputedStyle.overflowY;\n\n return /auto|scroll|overlay|hidden/.test(overflow + overflowY + overflowX);\n}","import getBoundingClientRect from \"./getBoundingClientRect.js\";\nimport getNodeScroll from \"./getNodeScroll.js\";\nimport getNodeName from \"./getNodeName.js\";\nimport { isHTMLElement } from \"./instanceOf.js\";\nimport getWindowScrollBarX from \"./getWindowScrollBarX.js\";\nimport getDocumentElement from \"./getDocumentElement.js\";\nimport isScrollParent from \"./isScrollParent.js\";\nimport { round } from \"../utils/math.js\";\n\nfunction isElementScaled(element) {\n var rect = element.getBoundingClientRect();\n var scaleX = round(rect.width) / element.offsetWidth || 1;\n var scaleY = round(rect.height) / element.offsetHeight || 1;\n return scaleX !== 1 || scaleY !== 1;\n} // Returns the composite rect of an element relative to its offsetParent.\n// Composite means it takes into account transforms as well as layout.\n\n\nexport default function getCompositeRect(elementOrVirtualElement, offsetParent, isFixed) {\n if (isFixed === void 0) {\n isFixed = false;\n }\n\n var isOffsetParentAnElement = isHTMLElement(offsetParent);\n var offsetParentIsScaled = isHTMLElement(offsetParent) && isElementScaled(offsetParent);\n var documentElement = getDocumentElement(offsetParent);\n var rect = getBoundingClientRect(elementOrVirtualElement, offsetParentIsScaled, isFixed);\n var scroll = {\n scrollLeft: 0,\n scrollTop: 0\n };\n var offsets = {\n x: 0,\n y: 0\n };\n\n if (isOffsetParentAnElement || !isOffsetParentAnElement && !isFixed) {\n if (getNodeName(offsetParent) !== 'body' || // https://github.com/popperjs/popper-core/issues/1078\n isScrollParent(documentElement)) {\n scroll = getNodeScroll(offsetParent);\n }\n\n if (isHTMLElement(offsetParent)) {\n offsets = getBoundingClientRect(offsetParent, true);\n offsets.x += offsetParent.clientLeft;\n offsets.y += offsetParent.clientTop;\n } else if (documentElement) {\n offsets.x = getWindowScrollBarX(documentElement);\n }\n }\n\n return {\n x: rect.left + scroll.scrollLeft - offsets.x,\n y: rect.top + scroll.scrollTop - offsets.y,\n width: rect.width,\n height: rect.height\n };\n}","import getWindowScroll from \"./getWindowScroll.js\";\nimport getWindow from \"./getWindow.js\";\nimport { isHTMLElement } from \"./instanceOf.js\";\nimport getHTMLElementScroll from \"./getHTMLElementScroll.js\";\nexport default function getNodeScroll(node) {\n if (node === getWindow(node) || !isHTMLElement(node)) {\n return getWindowScroll(node);\n } else {\n return getHTMLElementScroll(node);\n }\n}","export default function getHTMLElementScroll(element) {\n return {\n scrollLeft: element.scrollLeft,\n scrollTop: element.scrollTop\n };\n}","import getBoundingClientRect from \"./getBoundingClientRect.js\"; // Returns the layout rect of an element relative to its offsetParent. Layout\n// means it doesn't take into account transforms.\n\nexport default function getLayoutRect(element) {\n var clientRect = getBoundingClientRect(element); // Use the clientRect sizes if it's not been transformed.\n // Fixes https://github.com/popperjs/popper-core/issues/1223\n\n var width = element.offsetWidth;\n var height = element.offsetHeight;\n\n if (Math.abs(clientRect.width - width) <= 1) {\n width = clientRect.width;\n }\n\n if (Math.abs(clientRect.height - height) <= 1) {\n height = clientRect.height;\n }\n\n return {\n x: element.offsetLeft,\n y: element.offsetTop,\n width: width,\n height: height\n };\n}","import getNodeName from \"./getNodeName.js\";\nimport getDocumentElement from \"./getDocumentElement.js\";\nimport { isShadowRoot } from \"./instanceOf.js\";\nexport default function getParentNode(element) {\n if (getNodeName(element) === 'html') {\n return element;\n }\n\n return (// this is a quicker (but less type safe) way to save quite some bytes from the bundle\n // $FlowFixMe[incompatible-return]\n // $FlowFixMe[prop-missing]\n element.assignedSlot || // step into the shadow DOM of the parent of a slotted node\n element.parentNode || ( // DOM Element detected\n isShadowRoot(element) ? element.host : null) || // ShadowRoot detected\n // $FlowFixMe[incompatible-call]: HTMLElement is a Node\n getDocumentElement(element) // fallback\n\n );\n}","import getParentNode from \"./getParentNode.js\";\nimport isScrollParent from \"./isScrollParent.js\";\nimport getNodeName from \"./getNodeName.js\";\nimport { isHTMLElement } from \"./instanceOf.js\";\nexport default function getScrollParent(node) {\n if (['html', 'body', '#document'].indexOf(getNodeName(node)) >= 0) {\n // $FlowFixMe[incompatible-return]: assume body is always available\n return node.ownerDocument.body;\n }\n\n if (isHTMLElement(node) && isScrollParent(node)) {\n return node;\n }\n\n return getScrollParent(getParentNode(node));\n}","import getScrollParent from \"./getScrollParent.js\";\nimport getParentNode from \"./getParentNode.js\";\nimport getWindow from \"./getWindow.js\";\nimport isScrollParent from \"./isScrollParent.js\";\n/*\ngiven a DOM element, return the list of all scroll parents, up the list of ancesors\nuntil we get to the top window object. This list is what we attach scroll listeners\nto, because if any of these parent elements scroll, we'll need to re-calculate the\nreference element's position.\n*/\n\nexport default function listScrollParents(element, list) {\n var _element$ownerDocumen;\n\n if (list === void 0) {\n list = [];\n }\n\n var scrollParent = getScrollParent(element);\n var isBody = scrollParent === ((_element$ownerDocumen = element.ownerDocument) == null ? void 0 : _element$ownerDocumen.body);\n var win = getWindow(scrollParent);\n var target = isBody ? [win].concat(win.visualViewport || [], isScrollParent(scrollParent) ? scrollParent : []) : scrollParent;\n var updatedList = list.concat(target);\n return isBody ? updatedList : // $FlowFixMe[incompatible-call]: isBody tells us target will be an HTMLElement here\n updatedList.concat(listScrollParents(getParentNode(target)));\n}","import getNodeName from \"./getNodeName.js\";\nexport default function isTableElement(element) {\n return ['table', 'td', 'th'].indexOf(getNodeName(element)) >= 0;\n}","import getWindow from \"./getWindow.js\";\nimport getNodeName from \"./getNodeName.js\";\nimport getComputedStyle from \"./getComputedStyle.js\";\nimport { isHTMLElement, isShadowRoot } from \"./instanceOf.js\";\nimport isTableElement from \"./isTableElement.js\";\nimport getParentNode from \"./getParentNode.js\";\nimport getUAString from \"../utils/userAgent.js\";\n\nfunction getTrueOffsetParent(element) {\n if (!isHTMLElement(element) || // https://github.com/popperjs/popper-core/issues/837\n getComputedStyle(element).position === 'fixed') {\n return null;\n }\n\n return element.offsetParent;\n} // `.offsetParent` reports `null` for fixed elements, while absolute elements\n// return the containing block\n\n\nfunction getContainingBlock(element) {\n var isFirefox = /firefox/i.test(getUAString());\n var isIE = /Trident/i.test(getUAString());\n\n if (isIE && isHTMLElement(element)) {\n // In IE 9, 10 and 11 fixed elements containing block is always established by the viewport\n var elementCss = getComputedStyle(element);\n\n if (elementCss.position === 'fixed') {\n return null;\n }\n }\n\n var currentNode = getParentNode(element);\n\n if (isShadowRoot(currentNode)) {\n currentNode = currentNode.host;\n }\n\n while (isHTMLElement(currentNode) && ['html', 'body'].indexOf(getNodeName(currentNode)) < 0) {\n var css = getComputedStyle(currentNode); // This is non-exhaustive but covers the most common CSS properties that\n // create a containing block.\n // https://developer.mozilla.org/en-US/docs/Web/CSS/Containing_block#identifying_the_containing_block\n\n if (css.transform !== 'none' || css.perspective !== 'none' || css.contain === 'paint' || ['transform', 'perspective'].indexOf(css.willChange) !== -1 || isFirefox && css.willChange === 'filter' || isFirefox && css.filter && css.filter !== 'none') {\n return currentNode;\n } else {\n currentNode = currentNode.parentNode;\n }\n }\n\n return null;\n} // Gets the closest ancestor positioned element. Handles some edge cases,\n// such as table ancestors and cross browser bugs.\n\n\nexport default function getOffsetParent(element) {\n var window = getWindow(element);\n var offsetParent = getTrueOffsetParent(element);\n\n while (offsetParent && isTableElement(offsetParent) && getComputedStyle(offsetParent).position === 'static') {\n offsetParent = getTrueOffsetParent(offsetParent);\n }\n\n if (offsetParent && (getNodeName(offsetParent) === 'html' || getNodeName(offsetParent) === 'body' && getComputedStyle(offsetParent).position === 'static')) {\n return window;\n }\n\n return offsetParent || getContainingBlock(element) || window;\n}","export var top = 'top';\nexport var bottom = 'bottom';\nexport var right = 'right';\nexport var left = 'left';\nexport var auto = 'auto';\nexport var basePlacements = [top, bottom, right, left];\nexport var start = 'start';\nexport var end = 'end';\nexport var clippingParents = 'clippingParents';\nexport var viewport = 'viewport';\nexport var popper = 'popper';\nexport var reference = 'reference';\nexport var variationPlacements = /*#__PURE__*/basePlacements.reduce(function (acc, placement) {\n return acc.concat([placement + \"-\" + start, placement + \"-\" + end]);\n}, []);\nexport var placements = /*#__PURE__*/[].concat(basePlacements, [auto]).reduce(function (acc, placement) {\n return acc.concat([placement, placement + \"-\" + start, placement + \"-\" + end]);\n}, []); // modifiers that need to read the DOM\n\nexport var beforeRead = 'beforeRead';\nexport var read = 'read';\nexport var afterRead = 'afterRead'; // pure-logic modifiers\n\nexport var beforeMain = 'beforeMain';\nexport var main = 'main';\nexport var afterMain = 'afterMain'; // modifier with the purpose to write to the DOM (or write into a framework state)\n\nexport var beforeWrite = 'beforeWrite';\nexport var write = 'write';\nexport var afterWrite = 'afterWrite';\nexport var modifierPhases = [beforeRead, read, afterRead, beforeMain, main, afterMain, beforeWrite, write, afterWrite];","import { modifierPhases } from \"../enums.js\"; // source: https://stackoverflow.com/questions/49875255\n\nfunction order(modifiers) {\n var map = new Map();\n var visited = new Set();\n var result = [];\n modifiers.forEach(function (modifier) {\n map.set(modifier.name, modifier);\n }); // On visiting object, check for its dependencies and visit them recursively\n\n function sort(modifier) {\n visited.add(modifier.name);\n var requires = [].concat(modifier.requires || [], modifier.requiresIfExists || []);\n requires.forEach(function (dep) {\n if (!visited.has(dep)) {\n var depModifier = map.get(dep);\n\n if (depModifier) {\n sort(depModifier);\n }\n }\n });\n result.push(modifier);\n }\n\n modifiers.forEach(function (modifier) {\n if (!visited.has(modifier.name)) {\n // check for visited object\n sort(modifier);\n }\n });\n return result;\n}\n\nexport default function orderModifiers(modifiers) {\n // order based on dependencies\n var orderedModifiers = order(modifiers); // order based on phase\n\n return modifierPhases.reduce(function (acc, phase) {\n return acc.concat(orderedModifiers.filter(function (modifier) {\n return modifier.phase === phase;\n }));\n }, []);\n}","import getCompositeRect from \"./dom-utils/getCompositeRect.js\";\nimport getLayoutRect from \"./dom-utils/getLayoutRect.js\";\nimport listScrollParents from \"./dom-utils/listScrollParents.js\";\nimport getOffsetParent from \"./dom-utils/getOffsetParent.js\";\nimport getComputedStyle from \"./dom-utils/getComputedStyle.js\";\nimport orderModifiers from \"./utils/orderModifiers.js\";\nimport debounce from \"./utils/debounce.js\";\nimport validateModifiers from \"./utils/validateModifiers.js\";\nimport uniqueBy from \"./utils/uniqueBy.js\";\nimport getBasePlacement from \"./utils/getBasePlacement.js\";\nimport mergeByName from \"./utils/mergeByName.js\";\nimport detectOverflow from \"./utils/detectOverflow.js\";\nimport { isElement } from \"./dom-utils/instanceOf.js\";\nimport { auto } from \"./enums.js\";\nvar INVALID_ELEMENT_ERROR = 'Popper: Invalid reference or popper argument provided. They must be either a DOM element or virtual element.';\nvar INFINITE_LOOP_ERROR = 'Popper: An infinite loop in the modifiers cycle has been detected! The cycle has been interrupted to prevent a browser crash.';\nvar DEFAULT_OPTIONS = {\n placement: 'bottom',\n modifiers: [],\n strategy: 'absolute'\n};\n\nfunction areValidElements() {\n for (var _len = arguments.length, args = new Array(_len), _key = 0; _key < _len; _key++) {\n args[_key] = arguments[_key];\n }\n\n return !args.some(function (element) {\n return !(element && typeof element.getBoundingClientRect === 'function');\n });\n}\n\nexport function popperGenerator(generatorOptions) {\n if (generatorOptions === void 0) {\n generatorOptions = {};\n }\n\n var _generatorOptions = generatorOptions,\n _generatorOptions$def = _generatorOptions.defaultModifiers,\n defaultModifiers = _generatorOptions$def === void 0 ? [] : _generatorOptions$def,\n _generatorOptions$def2 = _generatorOptions.defaultOptions,\n defaultOptions = _generatorOptions$def2 === void 0 ? DEFAULT_OPTIONS : _generatorOptions$def2;\n return function createPopper(reference, popper, options) {\n if (options === void 0) {\n options = defaultOptions;\n }\n\n var state = {\n placement: 'bottom',\n orderedModifiers: [],\n options: Object.assign({}, DEFAULT_OPTIONS, defaultOptions),\n modifiersData: {},\n elements: {\n reference: reference,\n popper: popper\n },\n attributes: {},\n styles: {}\n };\n var effectCleanupFns = [];\n var isDestroyed = false;\n var instance = {\n state: state,\n setOptions: function setOptions(setOptionsAction) {\n var options = typeof setOptionsAction === 'function' ? setOptionsAction(state.options) : setOptionsAction;\n cleanupModifierEffects();\n state.options = Object.assign({}, defaultOptions, state.options, options);\n state.scrollParents = {\n reference: isElement(reference) ? listScrollParents(reference) : reference.contextElement ? listScrollParents(reference.contextElement) : [],\n popper: listScrollParents(popper)\n }; // Orders the modifiers based on their dependencies and `phase`\n // properties\n\n var orderedModifiers = orderModifiers(mergeByName([].concat(defaultModifiers, state.options.modifiers))); // Strip out disabled modifiers\n\n state.orderedModifiers = orderedModifiers.filter(function (m) {\n return m.enabled;\n }); // Validate the provided modifiers so that the consumer will get warned\n // if one of the modifiers is invalid for any reason\n\n if (process.env.NODE_ENV !== \"production\") {\n var modifiers = uniqueBy([].concat(orderedModifiers, state.options.modifiers), function (_ref) {\n var name = _ref.name;\n return name;\n });\n validateModifiers(modifiers);\n\n if (getBasePlacement(state.options.placement) === auto) {\n var flipModifier = state.orderedModifiers.find(function (_ref2) {\n var name = _ref2.name;\n return name === 'flip';\n });\n\n if (!flipModifier) {\n console.error(['Popper: \"auto\" placements require the \"flip\" modifier be', 'present and enabled to work.'].join(' '));\n }\n }\n\n var _getComputedStyle = getComputedStyle(popper),\n marginTop = _getComputedStyle.marginTop,\n marginRight = _getComputedStyle.marginRight,\n marginBottom = _getComputedStyle.marginBottom,\n marginLeft = _getComputedStyle.marginLeft; // We no longer take into account `margins` on the popper, and it can\n // cause bugs with positioning, so we'll warn the consumer\n\n\n if ([marginTop, marginRight, marginBottom, marginLeft].some(function (margin) {\n return parseFloat(margin);\n })) {\n console.warn(['Popper: CSS \"margin\" styles cannot be used to apply padding', 'between the popper and its reference element or boundary.', 'To replicate margin, use the `offset` modifier, as well as', 'the `padding` option in the `preventOverflow` and `flip`', 'modifiers.'].join(' '));\n }\n }\n\n runModifierEffects();\n return instance.update();\n },\n // Sync update – it will always be executed, even if not necessary. This\n // is useful for low frequency updates where sync behavior simplifies the\n // logic.\n // For high frequency updates (e.g. `resize` and `scroll` events), always\n // prefer the async Popper#update method\n forceUpdate: function forceUpdate() {\n if (isDestroyed) {\n return;\n }\n\n var _state$elements = state.elements,\n reference = _state$elements.reference,\n popper = _state$elements.popper; // Don't proceed if `reference` or `popper` are not valid elements\n // anymore\n\n if (!areValidElements(reference, popper)) {\n if (process.env.NODE_ENV !== \"production\") {\n console.error(INVALID_ELEMENT_ERROR);\n }\n\n return;\n } // Store the reference and popper rects to be read by modifiers\n\n\n state.rects = {\n reference: getCompositeRect(reference, getOffsetParent(popper), state.options.strategy === 'fixed'),\n popper: getLayoutRect(popper)\n }; // Modifiers have the ability to reset the current update cycle. The\n // most common use case for this is the `flip` modifier changing the\n // placement, which then needs to re-run all the modifiers, because the\n // logic was previously ran for the previous placement and is therefore\n // stale/incorrect\n\n state.reset = false;\n state.placement = state.options.placement; // On each update cycle, the `modifiersData` property for each modifier\n // is filled with the initial data specified by the modifier. This means\n // it doesn't persist and is fresh on each update.\n // To ensure persistent data, use `${name}#persistent`\n\n state.orderedModifiers.forEach(function (modifier) {\n return state.modifiersData[modifier.name] = Object.assign({}, modifier.data);\n });\n var __debug_loops__ = 0;\n\n for (var index = 0; index < state.orderedModifiers.length; index++) {\n if (process.env.NODE_ENV !== \"production\") {\n __debug_loops__ += 1;\n\n if (__debug_loops__ > 100) {\n console.error(INFINITE_LOOP_ERROR);\n break;\n }\n }\n\n if (state.reset === true) {\n state.reset = false;\n index = -1;\n continue;\n }\n\n var _state$orderedModifie = state.orderedModifiers[index],\n fn = _state$orderedModifie.fn,\n _state$orderedModifie2 = _state$orderedModifie.options,\n _options = _state$orderedModifie2 === void 0 ? {} : _state$orderedModifie2,\n name = _state$orderedModifie.name;\n\n if (typeof fn === 'function') {\n state = fn({\n state: state,\n options: _options,\n name: name,\n instance: instance\n }) || state;\n }\n }\n },\n // Async and optimistically optimized update – it will not be executed if\n // not necessary (debounced to run at most once-per-tick)\n update: debounce(function () {\n return new Promise(function (resolve) {\n instance.forceUpdate();\n resolve(state);\n });\n }),\n destroy: function destroy() {\n cleanupModifierEffects();\n isDestroyed = true;\n }\n };\n\n if (!areValidElements(reference, popper)) {\n if (process.env.NODE_ENV !== \"production\") {\n console.error(INVALID_ELEMENT_ERROR);\n }\n\n return instance;\n }\n\n instance.setOptions(options).then(function (state) {\n if (!isDestroyed && options.onFirstUpdate) {\n options.onFirstUpdate(state);\n }\n }); // Modifiers have the ability to execute arbitrary code before the first\n // update cycle runs. They will be executed in the same order as the update\n // cycle. This is useful when a modifier adds some persistent data that\n // other modifiers need to use, but the modifier is run after the dependent\n // one.\n\n function runModifierEffects() {\n state.orderedModifiers.forEach(function (_ref3) {\n var name = _ref3.name,\n _ref3$options = _ref3.options,\n options = _ref3$options === void 0 ? {} : _ref3$options,\n effect = _ref3.effect;\n\n if (typeof effect === 'function') {\n var cleanupFn = effect({\n state: state,\n name: name,\n instance: instance,\n options: options\n });\n\n var noopFn = function noopFn() {};\n\n effectCleanupFns.push(cleanupFn || noopFn);\n }\n });\n }\n\n function cleanupModifierEffects() {\n effectCleanupFns.forEach(function (fn) {\n return fn();\n });\n effectCleanupFns = [];\n }\n\n return instance;\n };\n}\nexport var createPopper = /*#__PURE__*/popperGenerator(); // eslint-disable-next-line import/no-unused-modules\n\nexport { detectOverflow };","export default function debounce(fn) {\n var pending;\n return function () {\n if (!pending) {\n pending = new Promise(function (resolve) {\n Promise.resolve().then(function () {\n pending = undefined;\n resolve(fn());\n });\n });\n }\n\n return pending;\n };\n}","export default function mergeByName(modifiers) {\n var merged = modifiers.reduce(function (merged, current) {\n var existing = merged[current.name];\n merged[current.name] = existing ? Object.assign({}, existing, current, {\n options: Object.assign({}, existing.options, current.options),\n data: Object.assign({}, existing.data, current.data)\n }) : current;\n return merged;\n }, {}); // IE11 does not support Object.values\n\n return Object.keys(merged).map(function (key) {\n return merged[key];\n });\n}","import getWindow from \"../dom-utils/getWindow.js\"; // eslint-disable-next-line import/no-unused-modules\n\nvar passive = {\n passive: true\n};\n\nfunction effect(_ref) {\n var state = _ref.state,\n instance = _ref.instance,\n options = _ref.options;\n var _options$scroll = options.scroll,\n scroll = _options$scroll === void 0 ? true : _options$scroll,\n _options$resize = options.resize,\n resize = _options$resize === void 0 ? true : _options$resize;\n var window = getWindow(state.elements.popper);\n var scrollParents = [].concat(state.scrollParents.reference, state.scrollParents.popper);\n\n if (scroll) {\n scrollParents.forEach(function (scrollParent) {\n scrollParent.addEventListener('scroll', instance.update, passive);\n });\n }\n\n if (resize) {\n window.addEventListener('resize', instance.update, passive);\n }\n\n return function () {\n if (scroll) {\n scrollParents.forEach(function (scrollParent) {\n scrollParent.removeEventListener('scroll', instance.update, passive);\n });\n }\n\n if (resize) {\n window.removeEventListener('resize', instance.update, passive);\n }\n };\n} // eslint-disable-next-line import/no-unused-modules\n\n\nexport default {\n name: 'eventListeners',\n enabled: true,\n phase: 'write',\n fn: function fn() {},\n effect: effect,\n data: {}\n};","import { auto } from \"../enums.js\";\nexport default function getBasePlacement(placement) {\n return placement.split('-')[0];\n}","export default function getVariation(placement) {\n return placement.split('-')[1];\n}","export default function getMainAxisFromPlacement(placement) {\n return ['top', 'bottom'].indexOf(placement) >= 0 ? 'x' : 'y';\n}","import getBasePlacement from \"./getBasePlacement.js\";\nimport getVariation from \"./getVariation.js\";\nimport getMainAxisFromPlacement from \"./getMainAxisFromPlacement.js\";\nimport { top, right, bottom, left, start, end } from \"../enums.js\";\nexport default function computeOffsets(_ref) {\n var reference = _ref.reference,\n element = _ref.element,\n placement = _ref.placement;\n var basePlacement = placement ? getBasePlacement(placement) : null;\n var variation = placement ? getVariation(placement) : null;\n var commonX = reference.x + reference.width / 2 - element.width / 2;\n var commonY = reference.y + reference.height / 2 - element.height / 2;\n var offsets;\n\n switch (basePlacement) {\n case top:\n offsets = {\n x: commonX,\n y: reference.y - element.height\n };\n break;\n\n case bottom:\n offsets = {\n x: commonX,\n y: reference.y + reference.height\n };\n break;\n\n case right:\n offsets = {\n x: reference.x + reference.width,\n y: commonY\n };\n break;\n\n case left:\n offsets = {\n x: reference.x - element.width,\n y: commonY\n };\n break;\n\n default:\n offsets = {\n x: reference.x,\n y: reference.y\n };\n }\n\n var mainAxis = basePlacement ? getMainAxisFromPlacement(basePlacement) : null;\n\n if (mainAxis != null) {\n var len = mainAxis === 'y' ? 'height' : 'width';\n\n switch (variation) {\n case start:\n offsets[mainAxis] = offsets[mainAxis] - (reference[len] / 2 - element[len] / 2);\n break;\n\n case end:\n offsets[mainAxis] = offsets[mainAxis] + (reference[len] / 2 - element[len] / 2);\n break;\n\n default:\n }\n }\n\n return offsets;\n}","import computeOffsets from \"../utils/computeOffsets.js\";\n\nfunction popperOffsets(_ref) {\n var state = _ref.state,\n name = _ref.name;\n // Offsets are the actual position the popper needs to have to be\n // properly positioned near its reference element\n // This is the most basic placement, and will be adjusted by\n // the modifiers in the next step\n state.modifiersData[name] = computeOffsets({\n reference: state.rects.reference,\n element: state.rects.popper,\n strategy: 'absolute',\n placement: state.placement\n });\n} // eslint-disable-next-line import/no-unused-modules\n\n\nexport default {\n name: 'popperOffsets',\n enabled: true,\n phase: 'read',\n fn: popperOffsets,\n data: {}\n};","import { top, left, right, bottom, end } from \"../enums.js\";\nimport getOffsetParent from \"../dom-utils/getOffsetParent.js\";\nimport getWindow from \"../dom-utils/getWindow.js\";\nimport getDocumentElement from \"../dom-utils/getDocumentElement.js\";\nimport getComputedStyle from \"../dom-utils/getComputedStyle.js\";\nimport getBasePlacement from \"../utils/getBasePlacement.js\";\nimport getVariation from \"../utils/getVariation.js\";\nimport { round } from \"../utils/math.js\"; // eslint-disable-next-line import/no-unused-modules\n\nvar unsetSides = {\n top: 'auto',\n right: 'auto',\n bottom: 'auto',\n left: 'auto'\n}; // Round the offsets to the nearest suitable subpixel based on the DPR.\n// Zooming can change the DPR, but it seems to report a value that will\n// cleanly divide the values into the appropriate subpixels.\n\nfunction roundOffsetsByDPR(_ref) {\n var x = _ref.x,\n y = _ref.y;\n var win = window;\n var dpr = win.devicePixelRatio || 1;\n return {\n x: round(x * dpr) / dpr || 0,\n y: round(y * dpr) / dpr || 0\n };\n}\n\nexport function mapToStyles(_ref2) {\n var _Object$assign2;\n\n var popper = _ref2.popper,\n popperRect = _ref2.popperRect,\n placement = _ref2.placement,\n variation = _ref2.variation,\n offsets = _ref2.offsets,\n position = _ref2.position,\n gpuAcceleration = _ref2.gpuAcceleration,\n adaptive = _ref2.adaptive,\n roundOffsets = _ref2.roundOffsets,\n isFixed = _ref2.isFixed;\n var _offsets$x = offsets.x,\n x = _offsets$x === void 0 ? 0 : _offsets$x,\n _offsets$y = offsets.y,\n y = _offsets$y === void 0 ? 0 : _offsets$y;\n\n var _ref3 = typeof roundOffsets === 'function' ? roundOffsets({\n x: x,\n y: y\n }) : {\n x: x,\n y: y\n };\n\n x = _ref3.x;\n y = _ref3.y;\n var hasX = offsets.hasOwnProperty('x');\n var hasY = offsets.hasOwnProperty('y');\n var sideX = left;\n var sideY = top;\n var win = window;\n\n if (adaptive) {\n var offsetParent = getOffsetParent(popper);\n var heightProp = 'clientHeight';\n var widthProp = 'clientWidth';\n\n if (offsetParent === getWindow(popper)) {\n offsetParent = getDocumentElement(popper);\n\n if (getComputedStyle(offsetParent).position !== 'static' && position === 'absolute') {\n heightProp = 'scrollHeight';\n widthProp = 'scrollWidth';\n }\n } // $FlowFixMe[incompatible-cast]: force type refinement, we compare offsetParent with window above, but Flow doesn't detect it\n\n\n offsetParent = offsetParent;\n\n if (placement === top || (placement === left || placement === right) && variation === end) {\n sideY = bottom;\n var offsetY = isFixed && offsetParent === win && win.visualViewport ? win.visualViewport.height : // $FlowFixMe[prop-missing]\n offsetParent[heightProp];\n y -= offsetY - popperRect.height;\n y *= gpuAcceleration ? 1 : -1;\n }\n\n if (placement === left || (placement === top || placement === bottom) && variation === end) {\n sideX = right;\n var offsetX = isFixed && offsetParent === win && win.visualViewport ? win.visualViewport.width : // $FlowFixMe[prop-missing]\n offsetParent[widthProp];\n x -= offsetX - popperRect.width;\n x *= gpuAcceleration ? 1 : -1;\n }\n }\n\n var commonStyles = Object.assign({\n position: position\n }, adaptive && unsetSides);\n\n var _ref4 = roundOffsets === true ? roundOffsetsByDPR({\n x: x,\n y: y\n }) : {\n x: x,\n y: y\n };\n\n x = _ref4.x;\n y = _ref4.y;\n\n if (gpuAcceleration) {\n var _Object$assign;\n\n return Object.assign({}, commonStyles, (_Object$assign = {}, _Object$assign[sideY] = hasY ? '0' : '', _Object$assign[sideX] = hasX ? '0' : '', _Object$assign.transform = (win.devicePixelRatio || 1) <= 1 ? \"translate(\" + x + \"px, \" + y + \"px)\" : \"translate3d(\" + x + \"px, \" + y + \"px, 0)\", _Object$assign));\n }\n\n return Object.assign({}, commonStyles, (_Object$assign2 = {}, _Object$assign2[sideY] = hasY ? y + \"px\" : '', _Object$assign2[sideX] = hasX ? x + \"px\" : '', _Object$assign2.transform = '', _Object$assign2));\n}\n\nfunction computeStyles(_ref5) {\n var state = _ref5.state,\n options = _ref5.options;\n var _options$gpuAccelerat = options.gpuAcceleration,\n gpuAcceleration = _options$gpuAccelerat === void 0 ? true : _options$gpuAccelerat,\n _options$adaptive = options.adaptive,\n adaptive = _options$adaptive === void 0 ? true : _options$adaptive,\n _options$roundOffsets = options.roundOffsets,\n roundOffsets = _options$roundOffsets === void 0 ? true : _options$roundOffsets;\n\n if (process.env.NODE_ENV !== \"production\") {\n var transitionProperty = getComputedStyle(state.elements.popper).transitionProperty || '';\n\n if (adaptive && ['transform', 'top', 'right', 'bottom', 'left'].some(function (property) {\n return transitionProperty.indexOf(property) >= 0;\n })) {\n console.warn(['Popper: Detected CSS transitions on at least one of the following', 'CSS properties: \"transform\", \"top\", \"right\", \"bottom\", \"left\".', '\\n\\n', 'Disable the \"computeStyles\" modifier\\'s `adaptive` option to allow', 'for smooth transitions, or remove these properties from the CSS', 'transition declaration on the popper element if only transitioning', 'opacity or background-color for example.', '\\n\\n', 'We recommend using the popper element as a wrapper around an inner', 'element that can have any CSS property transitioned for animations.'].join(' '));\n }\n }\n\n var commonStyles = {\n placement: getBasePlacement(state.placement),\n variation: getVariation(state.placement),\n popper: state.elements.popper,\n popperRect: state.rects.popper,\n gpuAcceleration: gpuAcceleration,\n isFixed: state.options.strategy === 'fixed'\n };\n\n if (state.modifiersData.popperOffsets != null) {\n state.styles.popper = Object.assign({}, state.styles.popper, mapToStyles(Object.assign({}, commonStyles, {\n offsets: state.modifiersData.popperOffsets,\n position: state.options.strategy,\n adaptive: adaptive,\n roundOffsets: roundOffsets\n })));\n }\n\n if (state.modifiersData.arrow != null) {\n state.styles.arrow = Object.assign({}, state.styles.arrow, mapToStyles(Object.assign({}, commonStyles, {\n offsets: state.modifiersData.arrow,\n position: 'absolute',\n adaptive: false,\n roundOffsets: roundOffsets\n })));\n }\n\n state.attributes.popper = Object.assign({}, state.attributes.popper, {\n 'data-popper-placement': state.placement\n });\n} // eslint-disable-next-line import/no-unused-modules\n\n\nexport default {\n name: 'computeStyles',\n enabled: true,\n phase: 'beforeWrite',\n fn: computeStyles,\n data: {}\n};","import getBasePlacement from \"../utils/getBasePlacement.js\";\nimport { top, left, right, placements } from \"../enums.js\"; // eslint-disable-next-line import/no-unused-modules\n\nexport function distanceAndSkiddingToXY(placement, rects, offset) {\n var basePlacement = getBasePlacement(placement);\n var invertDistance = [left, top].indexOf(basePlacement) >= 0 ? -1 : 1;\n\n var _ref = typeof offset === 'function' ? offset(Object.assign({}, rects, {\n placement: placement\n })) : offset,\n skidding = _ref[0],\n distance = _ref[1];\n\n skidding = skidding || 0;\n distance = (distance || 0) * invertDistance;\n return [left, right].indexOf(basePlacement) >= 0 ? {\n x: distance,\n y: skidding\n } : {\n x: skidding,\n y: distance\n };\n}\n\nfunction offset(_ref2) {\n var state = _ref2.state,\n options = _ref2.options,\n name = _ref2.name;\n var _options$offset = options.offset,\n offset = _options$offset === void 0 ? [0, 0] : _options$offset;\n var data = placements.reduce(function (acc, placement) {\n acc[placement] = distanceAndSkiddingToXY(placement, state.rects, offset);\n return acc;\n }, {});\n var _data$state$placement = data[state.placement],\n x = _data$state$placement.x,\n y = _data$state$placement.y;\n\n if (state.modifiersData.popperOffsets != null) {\n state.modifiersData.popperOffsets.x += x;\n state.modifiersData.popperOffsets.y += y;\n }\n\n state.modifiersData[name] = data;\n} // eslint-disable-next-line import/no-unused-modules\n\n\nexport default {\n name: 'offset',\n enabled: true,\n phase: 'main',\n requires: ['popperOffsets'],\n fn: offset\n};","var hash = {\n left: 'right',\n right: 'left',\n bottom: 'top',\n top: 'bottom'\n};\nexport default function getOppositePlacement(placement) {\n return placement.replace(/left|right|bottom|top/g, function (matched) {\n return hash[matched];\n });\n}","var hash = {\n start: 'end',\n end: 'start'\n};\nexport default function getOppositeVariationPlacement(placement) {\n return placement.replace(/start|end/g, function (matched) {\n return hash[matched];\n });\n}","import { isShadowRoot } from \"./instanceOf.js\";\nexport default function contains(parent, child) {\n var rootNode = child.getRootNode && child.getRootNode(); // First, attempt with faster native method\n\n if (parent.contains(child)) {\n return true;\n } // then fallback to custom implementation with Shadow DOM support\n else if (rootNode && isShadowRoot(rootNode)) {\n var next = child;\n\n do {\n if (next && parent.isSameNode(next)) {\n return true;\n } // $FlowFixMe[prop-missing]: need a better way to handle this...\n\n\n next = next.parentNode || next.host;\n } while (next);\n } // Give up, the result is false\n\n\n return false;\n}","export default function rectToClientRect(rect) {\n return Object.assign({}, rect, {\n left: rect.x,\n top: rect.y,\n right: rect.x + rect.width,\n bottom: rect.y + rect.height\n });\n}","import { viewport } from \"../enums.js\";\nimport getViewportRect from \"./getViewportRect.js\";\nimport getDocumentRect from \"./getDocumentRect.js\";\nimport listScrollParents from \"./listScrollParents.js\";\nimport getOffsetParent from \"./getOffsetParent.js\";\nimport getDocumentElement from \"./getDocumentElement.js\";\nimport getComputedStyle from \"./getComputedStyle.js\";\nimport { isElement, isHTMLElement } from \"./instanceOf.js\";\nimport getBoundingClientRect from \"./getBoundingClientRect.js\";\nimport getParentNode from \"./getParentNode.js\";\nimport contains from \"./contains.js\";\nimport getNodeName from \"./getNodeName.js\";\nimport rectToClientRect from \"../utils/rectToClientRect.js\";\nimport { max, min } from \"../utils/math.js\";\n\nfunction getInnerBoundingClientRect(element, strategy) {\n var rect = getBoundingClientRect(element, false, strategy === 'fixed');\n rect.top = rect.top + element.clientTop;\n rect.left = rect.left + element.clientLeft;\n rect.bottom = rect.top + element.clientHeight;\n rect.right = rect.left + element.clientWidth;\n rect.width = element.clientWidth;\n rect.height = element.clientHeight;\n rect.x = rect.left;\n rect.y = rect.top;\n return rect;\n}\n\nfunction getClientRectFromMixedType(element, clippingParent, strategy) {\n return clippingParent === viewport ? rectToClientRect(getViewportRect(element, strategy)) : isElement(clippingParent) ? getInnerBoundingClientRect(clippingParent, strategy) : rectToClientRect(getDocumentRect(getDocumentElement(element)));\n} // A \"clipping parent\" is an overflowable container with the characteristic of\n// clipping (or hiding) overflowing elements with a position different from\n// `initial`\n\n\nfunction getClippingParents(element) {\n var clippingParents = listScrollParents(getParentNode(element));\n var canEscapeClipping = ['absolute', 'fixed'].indexOf(getComputedStyle(element).position) >= 0;\n var clipperElement = canEscapeClipping && isHTMLElement(element) ? getOffsetParent(element) : element;\n\n if (!isElement(clipperElement)) {\n return [];\n } // $FlowFixMe[incompatible-return]: https://github.com/facebook/flow/issues/1414\n\n\n return clippingParents.filter(function (clippingParent) {\n return isElement(clippingParent) && contains(clippingParent, clipperElement) && getNodeName(clippingParent) !== 'body';\n });\n} // Gets the maximum area that the element is visible in due to any number of\n// clipping parents\n\n\nexport default function getClippingRect(element, boundary, rootBoundary, strategy) {\n var mainClippingParents = boundary === 'clippingParents' ? getClippingParents(element) : [].concat(boundary);\n var clippingParents = [].concat(mainClippingParents, [rootBoundary]);\n var firstClippingParent = clippingParents[0];\n var clippingRect = clippingParents.reduce(function (accRect, clippingParent) {\n var rect = getClientRectFromMixedType(element, clippingParent, strategy);\n accRect.top = max(rect.top, accRect.top);\n accRect.right = min(rect.right, accRect.right);\n accRect.bottom = min(rect.bottom, accRect.bottom);\n accRect.left = max(rect.left, accRect.left);\n return accRect;\n }, getClientRectFromMixedType(element, firstClippingParent, strategy));\n clippingRect.width = clippingRect.right - clippingRect.left;\n clippingRect.height = clippingRect.bottom - clippingRect.top;\n clippingRect.x = clippingRect.left;\n clippingRect.y = clippingRect.top;\n return clippingRect;\n}","import getWindow from \"./getWindow.js\";\nimport getDocumentElement from \"./getDocumentElement.js\";\nimport getWindowScrollBarX from \"./getWindowScrollBarX.js\";\nimport isLayoutViewport from \"./isLayoutViewport.js\";\nexport default function getViewportRect(element, strategy) {\n var win = getWindow(element);\n var html = getDocumentElement(element);\n var visualViewport = win.visualViewport;\n var width = html.clientWidth;\n var height = html.clientHeight;\n var x = 0;\n var y = 0;\n\n if (visualViewport) {\n width = visualViewport.width;\n height = visualViewport.height;\n var layoutViewport = isLayoutViewport();\n\n if (layoutViewport || !layoutViewport && strategy === 'fixed') {\n x = visualViewport.offsetLeft;\n y = visualViewport.offsetTop;\n }\n }\n\n return {\n width: width,\n height: height,\n x: x + getWindowScrollBarX(element),\n y: y\n };\n}","import getDocumentElement from \"./getDocumentElement.js\";\nimport getComputedStyle from \"./getComputedStyle.js\";\nimport getWindowScrollBarX from \"./getWindowScrollBarX.js\";\nimport getWindowScroll from \"./getWindowScroll.js\";\nimport { max } from \"../utils/math.js\"; // Gets the entire size of the scrollable document area, even extending outside\n// of the `` and `` rect bounds if horizontally scrollable\n\nexport default function getDocumentRect(element) {\n var _element$ownerDocumen;\n\n var html = getDocumentElement(element);\n var winScroll = getWindowScroll(element);\n var body = (_element$ownerDocumen = element.ownerDocument) == null ? void 0 : _element$ownerDocumen.body;\n var width = max(html.scrollWidth, html.clientWidth, body ? body.scrollWidth : 0, body ? body.clientWidth : 0);\n var height = max(html.scrollHeight, html.clientHeight, body ? body.scrollHeight : 0, body ? body.clientHeight : 0);\n var x = -winScroll.scrollLeft + getWindowScrollBarX(element);\n var y = -winScroll.scrollTop;\n\n if (getComputedStyle(body || html).direction === 'rtl') {\n x += max(html.clientWidth, body ? body.clientWidth : 0) - width;\n }\n\n return {\n width: width,\n height: height,\n x: x,\n y: y\n };\n}","import getFreshSideObject from \"./getFreshSideObject.js\";\nexport default function mergePaddingObject(paddingObject) {\n return Object.assign({}, getFreshSideObject(), paddingObject);\n}","export default function getFreshSideObject() {\n return {\n top: 0,\n right: 0,\n bottom: 0,\n left: 0\n };\n}","export default function expandToHashMap(value, keys) {\n return keys.reduce(function (hashMap, key) {\n hashMap[key] = value;\n return hashMap;\n }, {});\n}","import getClippingRect from \"../dom-utils/getClippingRect.js\";\nimport getDocumentElement from \"../dom-utils/getDocumentElement.js\";\nimport getBoundingClientRect from \"../dom-utils/getBoundingClientRect.js\";\nimport computeOffsets from \"./computeOffsets.js\";\nimport rectToClientRect from \"./rectToClientRect.js\";\nimport { clippingParents, reference, popper, bottom, top, right, basePlacements, viewport } from \"../enums.js\";\nimport { isElement } from \"../dom-utils/instanceOf.js\";\nimport mergePaddingObject from \"./mergePaddingObject.js\";\nimport expandToHashMap from \"./expandToHashMap.js\"; // eslint-disable-next-line import/no-unused-modules\n\nexport default function detectOverflow(state, options) {\n if (options === void 0) {\n options = {};\n }\n\n var _options = options,\n _options$placement = _options.placement,\n placement = _options$placement === void 0 ? state.placement : _options$placement,\n _options$strategy = _options.strategy,\n strategy = _options$strategy === void 0 ? state.strategy : _options$strategy,\n _options$boundary = _options.boundary,\n boundary = _options$boundary === void 0 ? clippingParents : _options$boundary,\n _options$rootBoundary = _options.rootBoundary,\n rootBoundary = _options$rootBoundary === void 0 ? viewport : _options$rootBoundary,\n _options$elementConte = _options.elementContext,\n elementContext = _options$elementConte === void 0 ? popper : _options$elementConte,\n _options$altBoundary = _options.altBoundary,\n altBoundary = _options$altBoundary === void 0 ? false : _options$altBoundary,\n _options$padding = _options.padding,\n padding = _options$padding === void 0 ? 0 : _options$padding;\n var paddingObject = mergePaddingObject(typeof padding !== 'number' ? padding : expandToHashMap(padding, basePlacements));\n var altContext = elementContext === popper ? reference : popper;\n var popperRect = state.rects.popper;\n var element = state.elements[altBoundary ? altContext : elementContext];\n var clippingClientRect = getClippingRect(isElement(element) ? element : element.contextElement || getDocumentElement(state.elements.popper), boundary, rootBoundary, strategy);\n var referenceClientRect = getBoundingClientRect(state.elements.reference);\n var popperOffsets = computeOffsets({\n reference: referenceClientRect,\n element: popperRect,\n strategy: 'absolute',\n placement: placement\n });\n var popperClientRect = rectToClientRect(Object.assign({}, popperRect, popperOffsets));\n var elementClientRect = elementContext === popper ? popperClientRect : referenceClientRect; // positive = overflowing the clipping rect\n // 0 or negative = within the clipping rect\n\n var overflowOffsets = {\n top: clippingClientRect.top - elementClientRect.top + paddingObject.top,\n bottom: elementClientRect.bottom - clippingClientRect.bottom + paddingObject.bottom,\n left: clippingClientRect.left - elementClientRect.left + paddingObject.left,\n right: elementClientRect.right - clippingClientRect.right + paddingObject.right\n };\n var offsetData = state.modifiersData.offset; // Offsets can be applied only to the popper element\n\n if (elementContext === popper && offsetData) {\n var offset = offsetData[placement];\n Object.keys(overflowOffsets).forEach(function (key) {\n var multiply = [right, bottom].indexOf(key) >= 0 ? 1 : -1;\n var axis = [top, bottom].indexOf(key) >= 0 ? 'y' : 'x';\n overflowOffsets[key] += offset[axis] * multiply;\n });\n }\n\n return overflowOffsets;\n}","import getOppositePlacement from \"../utils/getOppositePlacement.js\";\nimport getBasePlacement from \"../utils/getBasePlacement.js\";\nimport getOppositeVariationPlacement from \"../utils/getOppositeVariationPlacement.js\";\nimport detectOverflow from \"../utils/detectOverflow.js\";\nimport computeAutoPlacement from \"../utils/computeAutoPlacement.js\";\nimport { bottom, top, start, right, left, auto } from \"../enums.js\";\nimport getVariation from \"../utils/getVariation.js\"; // eslint-disable-next-line import/no-unused-modules\n\nfunction getExpandedFallbackPlacements(placement) {\n if (getBasePlacement(placement) === auto) {\n return [];\n }\n\n var oppositePlacement = getOppositePlacement(placement);\n return [getOppositeVariationPlacement(placement), oppositePlacement, getOppositeVariationPlacement(oppositePlacement)];\n}\n\nfunction flip(_ref) {\n var state = _ref.state,\n options = _ref.options,\n name = _ref.name;\n\n if (state.modifiersData[name]._skip) {\n return;\n }\n\n var _options$mainAxis = options.mainAxis,\n checkMainAxis = _options$mainAxis === void 0 ? true : _options$mainAxis,\n _options$altAxis = options.altAxis,\n checkAltAxis = _options$altAxis === void 0 ? true : _options$altAxis,\n specifiedFallbackPlacements = options.fallbackPlacements,\n padding = options.padding,\n boundary = options.boundary,\n rootBoundary = options.rootBoundary,\n altBoundary = options.altBoundary,\n _options$flipVariatio = options.flipVariations,\n flipVariations = _options$flipVariatio === void 0 ? true : _options$flipVariatio,\n allowedAutoPlacements = options.allowedAutoPlacements;\n var preferredPlacement = state.options.placement;\n var basePlacement = getBasePlacement(preferredPlacement);\n var isBasePlacement = basePlacement === preferredPlacement;\n var fallbackPlacements = specifiedFallbackPlacements || (isBasePlacement || !flipVariations ? [getOppositePlacement(preferredPlacement)] : getExpandedFallbackPlacements(preferredPlacement));\n var placements = [preferredPlacement].concat(fallbackPlacements).reduce(function (acc, placement) {\n return acc.concat(getBasePlacement(placement) === auto ? computeAutoPlacement(state, {\n placement: placement,\n boundary: boundary,\n rootBoundary: rootBoundary,\n padding: padding,\n flipVariations: flipVariations,\n allowedAutoPlacements: allowedAutoPlacements\n }) : placement);\n }, []);\n var referenceRect = state.rects.reference;\n var popperRect = state.rects.popper;\n var checksMap = new Map();\n var makeFallbackChecks = true;\n var firstFittingPlacement = placements[0];\n\n for (var i = 0; i < placements.length; i++) {\n var placement = placements[i];\n\n var _basePlacement = getBasePlacement(placement);\n\n var isStartVariation = getVariation(placement) === start;\n var isVertical = [top, bottom].indexOf(_basePlacement) >= 0;\n var len = isVertical ? 'width' : 'height';\n var overflow = detectOverflow(state, {\n placement: placement,\n boundary: boundary,\n rootBoundary: rootBoundary,\n altBoundary: altBoundary,\n padding: padding\n });\n var mainVariationSide = isVertical ? isStartVariation ? right : left : isStartVariation ? bottom : top;\n\n if (referenceRect[len] > popperRect[len]) {\n mainVariationSide = getOppositePlacement(mainVariationSide);\n }\n\n var altVariationSide = getOppositePlacement(mainVariationSide);\n var checks = [];\n\n if (checkMainAxis) {\n checks.push(overflow[_basePlacement] <= 0);\n }\n\n if (checkAltAxis) {\n checks.push(overflow[mainVariationSide] <= 0, overflow[altVariationSide] <= 0);\n }\n\n if (checks.every(function (check) {\n return check;\n })) {\n firstFittingPlacement = placement;\n makeFallbackChecks = false;\n break;\n }\n\n checksMap.set(placement, checks);\n }\n\n if (makeFallbackChecks) {\n // `2` may be desired in some cases – research later\n var numberOfChecks = flipVariations ? 3 : 1;\n\n var _loop = function _loop(_i) {\n var fittingPlacement = placements.find(function (placement) {\n var checks = checksMap.get(placement);\n\n if (checks) {\n return checks.slice(0, _i).every(function (check) {\n return check;\n });\n }\n });\n\n if (fittingPlacement) {\n firstFittingPlacement = fittingPlacement;\n return \"break\";\n }\n };\n\n for (var _i = numberOfChecks; _i > 0; _i--) {\n var _ret = _loop(_i);\n\n if (_ret === \"break\") break;\n }\n }\n\n if (state.placement !== firstFittingPlacement) {\n state.modifiersData[name]._skip = true;\n state.placement = firstFittingPlacement;\n state.reset = true;\n }\n} // eslint-disable-next-line import/no-unused-modules\n\n\nexport default {\n name: 'flip',\n enabled: true,\n phase: 'main',\n fn: flip,\n requiresIfExists: ['offset'],\n data: {\n _skip: false\n }\n};","import getVariation from \"./getVariation.js\";\nimport { variationPlacements, basePlacements, placements as allPlacements } from \"../enums.js\";\nimport detectOverflow from \"./detectOverflow.js\";\nimport getBasePlacement from \"./getBasePlacement.js\";\nexport default function computeAutoPlacement(state, options) {\n if (options === void 0) {\n options = {};\n }\n\n var _options = options,\n placement = _options.placement,\n boundary = _options.boundary,\n rootBoundary = _options.rootBoundary,\n padding = _options.padding,\n flipVariations = _options.flipVariations,\n _options$allowedAutoP = _options.allowedAutoPlacements,\n allowedAutoPlacements = _options$allowedAutoP === void 0 ? allPlacements : _options$allowedAutoP;\n var variation = getVariation(placement);\n var placements = variation ? flipVariations ? variationPlacements : variationPlacements.filter(function (placement) {\n return getVariation(placement) === variation;\n }) : basePlacements;\n var allowedPlacements = placements.filter(function (placement) {\n return allowedAutoPlacements.indexOf(placement) >= 0;\n });\n\n if (allowedPlacements.length === 0) {\n allowedPlacements = placements;\n\n if (process.env.NODE_ENV !== \"production\") {\n console.error(['Popper: The `allowedAutoPlacements` option did not allow any', 'placements. Ensure the `placement` option matches the variation', 'of the allowed placements.', 'For example, \"auto\" cannot be used to allow \"bottom-start\".', 'Use \"auto-start\" instead.'].join(' '));\n }\n } // $FlowFixMe[incompatible-type]: Flow seems to have problems with two array unions...\n\n\n var overflows = allowedPlacements.reduce(function (acc, placement) {\n acc[placement] = detectOverflow(state, {\n placement: placement,\n boundary: boundary,\n rootBoundary: rootBoundary,\n padding: padding\n })[getBasePlacement(placement)];\n return acc;\n }, {});\n return Object.keys(overflows).sort(function (a, b) {\n return overflows[a] - overflows[b];\n });\n}","import { max as mathMax, min as mathMin } from \"./math.js\";\nexport function within(min, value, max) {\n return mathMax(min, mathMin(value, max));\n}\nexport function withinMaxClamp(min, value, max) {\n var v = within(min, value, max);\n return v > max ? max : v;\n}","import { top, left, right, bottom, start } from \"../enums.js\";\nimport getBasePlacement from \"../utils/getBasePlacement.js\";\nimport getMainAxisFromPlacement from \"../utils/getMainAxisFromPlacement.js\";\nimport getAltAxis from \"../utils/getAltAxis.js\";\nimport { within, withinMaxClamp } from \"../utils/within.js\";\nimport getLayoutRect from \"../dom-utils/getLayoutRect.js\";\nimport getOffsetParent from \"../dom-utils/getOffsetParent.js\";\nimport detectOverflow from \"../utils/detectOverflow.js\";\nimport getVariation from \"../utils/getVariation.js\";\nimport getFreshSideObject from \"../utils/getFreshSideObject.js\";\nimport { min as mathMin, max as mathMax } from \"../utils/math.js\";\n\nfunction preventOverflow(_ref) {\n var state = _ref.state,\n options = _ref.options,\n name = _ref.name;\n var _options$mainAxis = options.mainAxis,\n checkMainAxis = _options$mainAxis === void 0 ? true : _options$mainAxis,\n _options$altAxis = options.altAxis,\n checkAltAxis = _options$altAxis === void 0 ? false : _options$altAxis,\n boundary = options.boundary,\n rootBoundary = options.rootBoundary,\n altBoundary = options.altBoundary,\n padding = options.padding,\n _options$tether = options.tether,\n tether = _options$tether === void 0 ? true : _options$tether,\n _options$tetherOffset = options.tetherOffset,\n tetherOffset = _options$tetherOffset === void 0 ? 0 : _options$tetherOffset;\n var overflow = detectOverflow(state, {\n boundary: boundary,\n rootBoundary: rootBoundary,\n padding: padding,\n altBoundary: altBoundary\n });\n var basePlacement = getBasePlacement(state.placement);\n var variation = getVariation(state.placement);\n var isBasePlacement = !variation;\n var mainAxis = getMainAxisFromPlacement(basePlacement);\n var altAxis = getAltAxis(mainAxis);\n var popperOffsets = state.modifiersData.popperOffsets;\n var referenceRect = state.rects.reference;\n var popperRect = state.rects.popper;\n var tetherOffsetValue = typeof tetherOffset === 'function' ? tetherOffset(Object.assign({}, state.rects, {\n placement: state.placement\n })) : tetherOffset;\n var normalizedTetherOffsetValue = typeof tetherOffsetValue === 'number' ? {\n mainAxis: tetherOffsetValue,\n altAxis: tetherOffsetValue\n } : Object.assign({\n mainAxis: 0,\n altAxis: 0\n }, tetherOffsetValue);\n var offsetModifierState = state.modifiersData.offset ? state.modifiersData.offset[state.placement] : null;\n var data = {\n x: 0,\n y: 0\n };\n\n if (!popperOffsets) {\n return;\n }\n\n if (checkMainAxis) {\n var _offsetModifierState$;\n\n var mainSide = mainAxis === 'y' ? top : left;\n var altSide = mainAxis === 'y' ? bottom : right;\n var len = mainAxis === 'y' ? 'height' : 'width';\n var offset = popperOffsets[mainAxis];\n var min = offset + overflow[mainSide];\n var max = offset - overflow[altSide];\n var additive = tether ? -popperRect[len] / 2 : 0;\n var minLen = variation === start ? referenceRect[len] : popperRect[len];\n var maxLen = variation === start ? -popperRect[len] : -referenceRect[len]; // We need to include the arrow in the calculation so the arrow doesn't go\n // outside the reference bounds\n\n var arrowElement = state.elements.arrow;\n var arrowRect = tether && arrowElement ? getLayoutRect(arrowElement) : {\n width: 0,\n height: 0\n };\n var arrowPaddingObject = state.modifiersData['arrow#persistent'] ? state.modifiersData['arrow#persistent'].padding : getFreshSideObject();\n var arrowPaddingMin = arrowPaddingObject[mainSide];\n var arrowPaddingMax = arrowPaddingObject[altSide]; // If the reference length is smaller than the arrow length, we don't want\n // to include its full size in the calculation. If the reference is small\n // and near the edge of a boundary, the popper can overflow even if the\n // reference is not overflowing as well (e.g. virtual elements with no\n // width or height)\n\n var arrowLen = within(0, referenceRect[len], arrowRect[len]);\n var minOffset = isBasePlacement ? referenceRect[len] / 2 - additive - arrowLen - arrowPaddingMin - normalizedTetherOffsetValue.mainAxis : minLen - arrowLen - arrowPaddingMin - normalizedTetherOffsetValue.mainAxis;\n var maxOffset = isBasePlacement ? -referenceRect[len] / 2 + additive + arrowLen + arrowPaddingMax + normalizedTetherOffsetValue.mainAxis : maxLen + arrowLen + arrowPaddingMax + normalizedTetherOffsetValue.mainAxis;\n var arrowOffsetParent = state.elements.arrow && getOffsetParent(state.elements.arrow);\n var clientOffset = arrowOffsetParent ? mainAxis === 'y' ? arrowOffsetParent.clientTop || 0 : arrowOffsetParent.clientLeft || 0 : 0;\n var offsetModifierValue = (_offsetModifierState$ = offsetModifierState == null ? void 0 : offsetModifierState[mainAxis]) != null ? _offsetModifierState$ : 0;\n var tetherMin = offset + minOffset - offsetModifierValue - clientOffset;\n var tetherMax = offset + maxOffset - offsetModifierValue;\n var preventedOffset = within(tether ? mathMin(min, tetherMin) : min, offset, tether ? mathMax(max, tetherMax) : max);\n popperOffsets[mainAxis] = preventedOffset;\n data[mainAxis] = preventedOffset - offset;\n }\n\n if (checkAltAxis) {\n var _offsetModifierState$2;\n\n var _mainSide = mainAxis === 'x' ? top : left;\n\n var _altSide = mainAxis === 'x' ? bottom : right;\n\n var _offset = popperOffsets[altAxis];\n\n var _len = altAxis === 'y' ? 'height' : 'width';\n\n var _min = _offset + overflow[_mainSide];\n\n var _max = _offset - overflow[_altSide];\n\n var isOriginSide = [top, left].indexOf(basePlacement) !== -1;\n\n var _offsetModifierValue = (_offsetModifierState$2 = offsetModifierState == null ? void 0 : offsetModifierState[altAxis]) != null ? _offsetModifierState$2 : 0;\n\n var _tetherMin = isOriginSide ? _min : _offset - referenceRect[_len] - popperRect[_len] - _offsetModifierValue + normalizedTetherOffsetValue.altAxis;\n\n var _tetherMax = isOriginSide ? _offset + referenceRect[_len] + popperRect[_len] - _offsetModifierValue - normalizedTetherOffsetValue.altAxis : _max;\n\n var _preventedOffset = tether && isOriginSide ? withinMaxClamp(_tetherMin, _offset, _tetherMax) : within(tether ? _tetherMin : _min, _offset, tether ? _tetherMax : _max);\n\n popperOffsets[altAxis] = _preventedOffset;\n data[altAxis] = _preventedOffset - _offset;\n }\n\n state.modifiersData[name] = data;\n} // eslint-disable-next-line import/no-unused-modules\n\n\nexport default {\n name: 'preventOverflow',\n enabled: true,\n phase: 'main',\n fn: preventOverflow,\n requiresIfExists: ['offset']\n};","export default function getAltAxis(axis) {\n return axis === 'x' ? 'y' : 'x';\n}","import getBasePlacement from \"../utils/getBasePlacement.js\";\nimport getLayoutRect from \"../dom-utils/getLayoutRect.js\";\nimport contains from \"../dom-utils/contains.js\";\nimport getOffsetParent from \"../dom-utils/getOffsetParent.js\";\nimport getMainAxisFromPlacement from \"../utils/getMainAxisFromPlacement.js\";\nimport { within } from \"../utils/within.js\";\nimport mergePaddingObject from \"../utils/mergePaddingObject.js\";\nimport expandToHashMap from \"../utils/expandToHashMap.js\";\nimport { left, right, basePlacements, top, bottom } from \"../enums.js\";\nimport { isHTMLElement } from \"../dom-utils/instanceOf.js\"; // eslint-disable-next-line import/no-unused-modules\n\nvar toPaddingObject = function toPaddingObject(padding, state) {\n padding = typeof padding === 'function' ? padding(Object.assign({}, state.rects, {\n placement: state.placement\n })) : padding;\n return mergePaddingObject(typeof padding !== 'number' ? padding : expandToHashMap(padding, basePlacements));\n};\n\nfunction arrow(_ref) {\n var _state$modifiersData$;\n\n var state = _ref.state,\n name = _ref.name,\n options = _ref.options;\n var arrowElement = state.elements.arrow;\n var popperOffsets = state.modifiersData.popperOffsets;\n var basePlacement = getBasePlacement(state.placement);\n var axis = getMainAxisFromPlacement(basePlacement);\n var isVertical = [left, right].indexOf(basePlacement) >= 0;\n var len = isVertical ? 'height' : 'width';\n\n if (!arrowElement || !popperOffsets) {\n return;\n }\n\n var paddingObject = toPaddingObject(options.padding, state);\n var arrowRect = getLayoutRect(arrowElement);\n var minProp = axis === 'y' ? top : left;\n var maxProp = axis === 'y' ? bottom : right;\n var endDiff = state.rects.reference[len] + state.rects.reference[axis] - popperOffsets[axis] - state.rects.popper[len];\n var startDiff = popperOffsets[axis] - state.rects.reference[axis];\n var arrowOffsetParent = getOffsetParent(arrowElement);\n var clientSize = arrowOffsetParent ? axis === 'y' ? arrowOffsetParent.clientHeight || 0 : arrowOffsetParent.clientWidth || 0 : 0;\n var centerToReference = endDiff / 2 - startDiff / 2; // Make sure the arrow doesn't overflow the popper if the center point is\n // outside of the popper bounds\n\n var min = paddingObject[minProp];\n var max = clientSize - arrowRect[len] - paddingObject[maxProp];\n var center = clientSize / 2 - arrowRect[len] / 2 + centerToReference;\n var offset = within(min, center, max); // Prevents breaking syntax highlighting...\n\n var axisProp = axis;\n state.modifiersData[name] = (_state$modifiersData$ = {}, _state$modifiersData$[axisProp] = offset, _state$modifiersData$.centerOffset = offset - center, _state$modifiersData$);\n}\n\nfunction effect(_ref2) {\n var state = _ref2.state,\n options = _ref2.options;\n var _options$element = options.element,\n arrowElement = _options$element === void 0 ? '[data-popper-arrow]' : _options$element;\n\n if (arrowElement == null) {\n return;\n } // CSS selector\n\n\n if (typeof arrowElement === 'string') {\n arrowElement = state.elements.popper.querySelector(arrowElement);\n\n if (!arrowElement) {\n return;\n }\n }\n\n if (process.env.NODE_ENV !== \"production\") {\n if (!isHTMLElement(arrowElement)) {\n console.error(['Popper: \"arrow\" element must be an HTMLElement (not an SVGElement).', 'To use an SVG arrow, wrap it in an HTMLElement that will be used as', 'the arrow.'].join(' '));\n }\n }\n\n if (!contains(state.elements.popper, arrowElement)) {\n if (process.env.NODE_ENV !== \"production\") {\n console.error(['Popper: \"arrow\" modifier\\'s `element` must be a child of the popper', 'element.'].join(' '));\n }\n\n return;\n }\n\n state.elements.arrow = arrowElement;\n} // eslint-disable-next-line import/no-unused-modules\n\n\nexport default {\n name: 'arrow',\n enabled: true,\n phase: 'main',\n fn: arrow,\n effect: effect,\n requires: ['popperOffsets'],\n requiresIfExists: ['preventOverflow']\n};","import { top, bottom, left, right } from \"../enums.js\";\nimport detectOverflow from \"../utils/detectOverflow.js\";\n\nfunction getSideOffsets(overflow, rect, preventedOffsets) {\n if (preventedOffsets === void 0) {\n preventedOffsets = {\n x: 0,\n y: 0\n };\n }\n\n return {\n top: overflow.top - rect.height - preventedOffsets.y,\n right: overflow.right - rect.width + preventedOffsets.x,\n bottom: overflow.bottom - rect.height + preventedOffsets.y,\n left: overflow.left - rect.width - preventedOffsets.x\n };\n}\n\nfunction isAnySideFullyClipped(overflow) {\n return [top, right, bottom, left].some(function (side) {\n return overflow[side] >= 0;\n });\n}\n\nfunction hide(_ref) {\n var state = _ref.state,\n name = _ref.name;\n var referenceRect = state.rects.reference;\n var popperRect = state.rects.popper;\n var preventedOffsets = state.modifiersData.preventOverflow;\n var referenceOverflow = detectOverflow(state, {\n elementContext: 'reference'\n });\n var popperAltOverflow = detectOverflow(state, {\n altBoundary: true\n });\n var referenceClippingOffsets = getSideOffsets(referenceOverflow, referenceRect);\n var popperEscapeOffsets = getSideOffsets(popperAltOverflow, popperRect, preventedOffsets);\n var isReferenceHidden = isAnySideFullyClipped(referenceClippingOffsets);\n var hasPopperEscaped = isAnySideFullyClipped(popperEscapeOffsets);\n state.modifiersData[name] = {\n referenceClippingOffsets: referenceClippingOffsets,\n popperEscapeOffsets: popperEscapeOffsets,\n isReferenceHidden: isReferenceHidden,\n hasPopperEscaped: hasPopperEscaped\n };\n state.attributes.popper = Object.assign({}, state.attributes.popper, {\n 'data-popper-reference-hidden': isReferenceHidden,\n 'data-popper-escaped': hasPopperEscaped\n });\n} // eslint-disable-next-line import/no-unused-modules\n\n\nexport default {\n name: 'hide',\n enabled: true,\n phase: 'main',\n requiresIfExists: ['preventOverflow'],\n fn: hide\n};","import { popperGenerator, detectOverflow } from \"./createPopper.js\";\nimport eventListeners from \"./modifiers/eventListeners.js\";\nimport popperOffsets from \"./modifiers/popperOffsets.js\";\nimport computeStyles from \"./modifiers/computeStyles.js\";\nimport applyStyles from \"./modifiers/applyStyles.js\";\nimport offset from \"./modifiers/offset.js\";\nimport flip from \"./modifiers/flip.js\";\nimport preventOverflow from \"./modifiers/preventOverflow.js\";\nimport arrow from \"./modifiers/arrow.js\";\nimport hide from \"./modifiers/hide.js\";\nvar defaultModifiers = [eventListeners, popperOffsets, computeStyles, applyStyles, offset, flip, preventOverflow, arrow, hide];\nvar createPopper = /*#__PURE__*/popperGenerator({\n defaultModifiers: defaultModifiers\n}); // eslint-disable-next-line import/no-unused-modules\n\nexport { createPopper, popperGenerator, defaultModifiers, detectOverflow }; // eslint-disable-next-line import/no-unused-modules\n\nexport { createPopper as createPopperLite } from \"./popper-lite.js\"; // eslint-disable-next-line import/no-unused-modules\n\nexport * from \"./modifiers/index.js\";","import getNodeName from \"../dom-utils/getNodeName.js\";\nimport { isHTMLElement } from \"../dom-utils/instanceOf.js\"; // This modifier takes the styles prepared by the `computeStyles` modifier\n// and applies them to the HTMLElements such as popper and arrow\n\nfunction applyStyles(_ref) {\n var state = _ref.state;\n Object.keys(state.elements).forEach(function (name) {\n var style = state.styles[name] || {};\n var attributes = state.attributes[name] || {};\n var element = state.elements[name]; // arrow is optional + virtual elements\n\n if (!isHTMLElement(element) || !getNodeName(element)) {\n return;\n } // Flow doesn't support to extend this property, but it's the most\n // effective way to apply styles to an HTMLElement\n // $FlowFixMe[cannot-write]\n\n\n Object.assign(element.style, style);\n Object.keys(attributes).forEach(function (name) {\n var value = attributes[name];\n\n if (value === false) {\n element.removeAttribute(name);\n } else {\n element.setAttribute(name, value === true ? '' : value);\n }\n });\n });\n}\n\nfunction effect(_ref2) {\n var state = _ref2.state;\n var initialStyles = {\n popper: {\n position: state.options.strategy,\n left: '0',\n top: '0',\n margin: '0'\n },\n arrow: {\n position: 'absolute'\n },\n reference: {}\n };\n Object.assign(state.elements.popper.style, initialStyles.popper);\n state.styles = initialStyles;\n\n if (state.elements.arrow) {\n Object.assign(state.elements.arrow.style, initialStyles.arrow);\n }\n\n return function () {\n Object.keys(state.elements).forEach(function (name) {\n var element = state.elements[name];\n var attributes = state.attributes[name] || {};\n var styleProperties = Object.keys(state.styles.hasOwnProperty(name) ? state.styles[name] : initialStyles[name]); // Set all values to an empty string to unset them\n\n var style = styleProperties.reduce(function (style, property) {\n style[property] = '';\n return style;\n }, {}); // arrow is optional + virtual elements\n\n if (!isHTMLElement(element) || !getNodeName(element)) {\n return;\n }\n\n Object.assign(element.style, style);\n Object.keys(attributes).forEach(function (attribute) {\n element.removeAttribute(attribute);\n });\n });\n };\n} // eslint-disable-next-line import/no-unused-modules\n\n\nexport default {\n name: 'applyStyles',\n enabled: true,\n phase: 'write',\n fn: applyStyles,\n effect: effect,\n requires: ['computeStyles']\n};","import * as React from 'react';\nimport * as ReactDOM from 'react-dom';\nimport { createPopper as defaultCreatePopper } from '@popperjs/core';\nimport isEqual from 'react-fast-compare';\nimport { fromEntries, useIsomorphicLayoutEffect } from './utils';\nvar EMPTY_MODIFIERS = [];\nexport var usePopper = function usePopper(referenceElement, popperElement, options) {\n if (options === void 0) {\n options = {};\n }\n\n var prevOptions = React.useRef(null);\n var optionsWithDefaults = {\n onFirstUpdate: options.onFirstUpdate,\n placement: options.placement || 'bottom',\n strategy: options.strategy || 'absolute',\n modifiers: options.modifiers || EMPTY_MODIFIERS\n };\n\n var _React$useState = React.useState({\n styles: {\n popper: {\n position: optionsWithDefaults.strategy,\n left: '0',\n top: '0'\n },\n arrow: {\n position: 'absolute'\n }\n },\n attributes: {}\n }),\n state = _React$useState[0],\n setState = _React$useState[1];\n\n var updateStateModifier = React.useMemo(function () {\n return {\n name: 'updateState',\n enabled: true,\n phase: 'write',\n fn: function fn(_ref) {\n var state = _ref.state;\n var elements = Object.keys(state.elements);\n ReactDOM.flushSync(function () {\n setState({\n styles: fromEntries(elements.map(function (element) {\n return [element, state.styles[element] || {}];\n })),\n attributes: fromEntries(elements.map(function (element) {\n return [element, state.attributes[element]];\n }))\n });\n });\n },\n requires: ['computeStyles']\n };\n }, []);\n var popperOptions = React.useMemo(function () {\n var newOptions = {\n onFirstUpdate: optionsWithDefaults.onFirstUpdate,\n placement: optionsWithDefaults.placement,\n strategy: optionsWithDefaults.strategy,\n modifiers: [].concat(optionsWithDefaults.modifiers, [updateStateModifier, {\n name: 'applyStyles',\n enabled: false\n }])\n };\n\n if (isEqual(prevOptions.current, newOptions)) {\n return prevOptions.current || newOptions;\n } else {\n prevOptions.current = newOptions;\n return newOptions;\n }\n }, [optionsWithDefaults.onFirstUpdate, optionsWithDefaults.placement, optionsWithDefaults.strategy, optionsWithDefaults.modifiers, updateStateModifier]);\n var popperInstanceRef = React.useRef();\n useIsomorphicLayoutEffect(function () {\n if (popperInstanceRef.current) {\n popperInstanceRef.current.setOptions(popperOptions);\n }\n }, [popperOptions]);\n useIsomorphicLayoutEffect(function () {\n if (referenceElement == null || popperElement == null) {\n return;\n }\n\n var createPopper = options.createPopper || defaultCreatePopper;\n var popperInstance = createPopper(referenceElement, popperElement, popperOptions);\n popperInstanceRef.current = popperInstance;\n return function () {\n popperInstance.destroy();\n popperInstanceRef.current = null;\n };\n }, [referenceElement, popperElement, options.createPopper]);\n return {\n state: popperInstanceRef.current ? popperInstanceRef.current.state : null,\n styles: state.styles,\n attributes: state.attributes,\n update: popperInstanceRef.current ? popperInstanceRef.current.update : null,\n forceUpdate: popperInstanceRef.current ? popperInstanceRef.current.forceUpdate : null\n };\n};","import * as React from 'react';\nimport { ManagerReferenceNodeContext } from './Manager';\nimport { unwrapArray, setRef } from './utils';\nimport { usePopper } from './usePopper';\n\nvar NOOP = function NOOP() {\n return void 0;\n};\n\nvar NOOP_PROMISE = function NOOP_PROMISE() {\n return Promise.resolve(null);\n};\n\nvar EMPTY_MODIFIERS = [];\nexport function Popper(_ref) {\n var _ref$placement = _ref.placement,\n placement = _ref$placement === void 0 ? 'bottom' : _ref$placement,\n _ref$strategy = _ref.strategy,\n strategy = _ref$strategy === void 0 ? 'absolute' : _ref$strategy,\n _ref$modifiers = _ref.modifiers,\n modifiers = _ref$modifiers === void 0 ? EMPTY_MODIFIERS : _ref$modifiers,\n referenceElement = _ref.referenceElement,\n onFirstUpdate = _ref.onFirstUpdate,\n innerRef = _ref.innerRef,\n children = _ref.children;\n var referenceNode = React.useContext(ManagerReferenceNodeContext);\n\n var _React$useState = React.useState(null),\n popperElement = _React$useState[0],\n setPopperElement = _React$useState[1];\n\n var _React$useState2 = React.useState(null),\n arrowElement = _React$useState2[0],\n setArrowElement = _React$useState2[1];\n\n React.useEffect(function () {\n setRef(innerRef, popperElement);\n }, [innerRef, popperElement]);\n var options = React.useMemo(function () {\n return {\n placement: placement,\n strategy: strategy,\n onFirstUpdate: onFirstUpdate,\n modifiers: [].concat(modifiers, [{\n name: 'arrow',\n enabled: arrowElement != null,\n options: {\n element: arrowElement\n }\n }])\n };\n }, [placement, strategy, onFirstUpdate, modifiers, arrowElement]);\n\n var _usePopper = usePopper(referenceElement || referenceNode, popperElement, options),\n state = _usePopper.state,\n styles = _usePopper.styles,\n forceUpdate = _usePopper.forceUpdate,\n update = _usePopper.update;\n\n var childrenProps = React.useMemo(function () {\n return {\n ref: setPopperElement,\n style: styles.popper,\n placement: state ? state.placement : placement,\n hasPopperEscaped: state && state.modifiersData.hide ? state.modifiersData.hide.hasPopperEscaped : null,\n isReferenceHidden: state && state.modifiersData.hide ? state.modifiersData.hide.isReferenceHidden : null,\n arrowProps: {\n style: styles.arrow,\n ref: setArrowElement\n },\n forceUpdate: forceUpdate || NOOP,\n update: update || NOOP_PROMISE\n };\n }, [setPopperElement, setArrowElement, placement, state, styles, update, forceUpdate]);\n return unwrapArray(children)(childrenProps);\n}","import _toConsumableArray from \"@babel/runtime/helpers/toConsumableArray\";\nimport _slicedToArray from \"@babel/runtime/helpers/slicedToArray\";\nimport React, { useMemo } from 'react';\nimport { Popper as ReactPopper } from 'react-popper';\nexport { placements } from '@popperjs/core'; // Export types from PopperJS / React Popper\n\nvar constantModifiers = [{\n name: 'flip',\n options: {\n flipVariations: false,\n padding: 5,\n boundary: 'clippingParents',\n rootBoundary: 'viewport'\n }\n}, {\n name: 'preventOverflow',\n options: {\n padding: 5,\n rootBoundary: 'document'\n }\n}];\n\nfunction defaultChildrenFn() {\n return null;\n}\n\nvar defaultOffset = [0, 8];\nexport function Popper(_ref) {\n var _ref$children = _ref.children,\n children = _ref$children === void 0 ? defaultChildrenFn : _ref$children,\n _ref$offset = _ref.offset,\n offset = _ref$offset === void 0 ? defaultOffset : _ref$offset,\n _ref$placement = _ref.placement,\n placement = _ref$placement === void 0 ? 'bottom-start' : _ref$placement,\n _ref$referenceElement = _ref.referenceElement,\n referenceElement = _ref$referenceElement === void 0 ? undefined : _ref$referenceElement,\n modifiers = _ref.modifiers,\n _ref$strategy = _ref.strategy,\n strategy = _ref$strategy === void 0 ? 'fixed' : _ref$strategy;\n\n var _offset = _slicedToArray(offset, 2),\n offsetX = _offset[0],\n offsetY = _offset[1];\n\n // Merge a new offset modifier only if new offset values passed in\n var internalModifiers = useMemo(function () {\n var offsetModifier = {\n name: 'offset',\n options: {\n offset: [offsetX, offsetY]\n }\n };\n return [].concat(constantModifiers, [offsetModifier]);\n }, [offsetX, offsetY]); // Merge custom props and memoize\n\n var mergedModifiers = useMemo(function () {\n if (modifiers == null) {\n return internalModifiers;\n }\n\n return [].concat(_toConsumableArray(internalModifiers), _toConsumableArray(modifiers));\n }, [internalModifiers, modifiers]);\n return /*#__PURE__*/React.createElement(ReactPopper, {\n modifiers: mergedModifiers,\n placement: placement,\n strategy: strategy,\n referenceElement: referenceElement\n }, children);\n}","export var portalParentClassName = 'atlaskit-portal-container';\nexport var portalParentSelector = 'body > .atlaskit-portal-container';\nexport var portalClassName = 'atlaskit-portal';","import { portalClassName, portalParentClassName, portalParentSelector } from '../constants';\n/**\n * Creates a new portal container element with provided z-index and class name 'atlaskit-portal',\n * it is not be attached to any DOM node at this stage.\n * @param {number | string} zIndex - the z-index value of the newly created portal container element\n * @return {number} - The newly created container element\n */\n\nexport var createContainer = function createContainer(zIndex) {\n var container = document.createElement('div');\n container.className = portalClassName;\n container.style.zIndex = \"\".concat(zIndex);\n return container;\n};\n/**\n * Returns document body element\n * @return {number} - The document body element\n */\n\nvar getBody = function getBody() {\n return document.body;\n};\n/**\n * Returns portal parent container. If no container exists already then it creates a new container with class name 'atlaskit-portal-container'\n * @return {Element} - The portal parent container div element\n */\n\n\nvar getPortalParent = function getPortalParent() {\n var parentElement = document.querySelector(portalParentSelector);\n\n if (!parentElement) {\n var parent = document.createElement('div');\n parent.className = portalParentClassName; // we are setting display to flex because we want each portal to create a new stacking context\n // See https://developer.mozilla.org/en-US/docs/Web/CSS/CSS_Positioning/Understanding_z_index/The_stacking_context\n\n parent.style.display = 'flex';\n getBody().appendChild(parent);\n return parent;\n }\n\n return parentElement;\n};\n/**\n * Removes portal container from portal parent container\n * @param {HTMLDivElement | undefined} container - portal container to be removed from portal parent container\n */\n\n\nexport var removePortalContainer = function removePortalContainer(container) {\n getPortalParent().removeChild(container);\n};\n/**\n * Appends portal container to portal parent container if it hasn't already been done\n * @param {HTMLDivElement | undefined} container - portal container to be added to portal parent container\n */\n\nexport var appendPortalContainerIfNotAppended = function appendPortalContainerIfNotAppended(container) {\n if (!container.parentElement) {\n getPortalParent().appendChild(container);\n }\n};","import { useEffect, useMemo } from 'react';\nimport { createPortal } from 'react-dom';\nimport { appendPortalContainerIfNotAppended, createContainer, removePortalContainer } from '../utils/portal-dom-utils';\nexport default function InternalPortal(props) {\n var zIndex = props.zIndex,\n children = props.children;\n var container = useMemo(function () {\n return createContainer(zIndex);\n }, [zIndex]); // This is in the render method instead of useEffect so that\n // the portal will be added to the DOM before the children render.\n // For any further changes, ensure that the container does not have a\n // parent besides the portal parent.\n\n appendPortalContainerIfNotAppended(container);\n useEffect(function () {\n return function () {\n removePortalContainer(container);\n };\n }, [container]);\n return /*#__PURE__*/createPortal(children, container);\n}","export default function _arrayLikeToArray(arr, len) {\n if (len == null || len > arr.length) len = arr.length;\n\n for (var i = 0, arr2 = new Array(len); i < len; i++) {\n arr2[i] = arr[i];\n }\n\n return arr2;\n}","import arrayWithHoles from \"./arrayWithHoles.js\";\nimport iterableToArrayLimit from \"./iterableToArrayLimit.js\";\nimport unsupportedIterableToArray from \"./unsupportedIterableToArray.js\";\nimport nonIterableRest from \"./nonIterableRest.js\";\nexport default function _slicedToArray(arr, i) {\n return arrayWithHoles(arr) || iterableToArrayLimit(arr, i) || unsupportedIterableToArray(arr, i) || nonIterableRest();\n}","export default function _arrayWithHoles(arr) {\n if (Array.isArray(arr)) return arr;\n}","export default function _iterableToArrayLimit(arr, i) {\n if (typeof Symbol === \"undefined\" || !(Symbol.iterator in Object(arr))) return;\n var _arr = [];\n var _n = true;\n var _d = false;\n var _e = undefined;\n\n try {\n for (var _i = arr[Symbol.iterator](), _s; !(_n = (_s = _i.next()).done); _n = true) {\n _arr.push(_s.value);\n\n if (i && _arr.length === i) break;\n }\n } catch (err) {\n _d = true;\n _e = err;\n } finally {\n try {\n if (!_n && _i[\"return\"] != null) _i[\"return\"]();\n } finally {\n if (_d) throw _e;\n }\n }\n\n return _arr;\n}","import arrayLikeToArray from \"./arrayLikeToArray.js\";\nexport default function _unsupportedIterableToArray(o, minLen) {\n if (!o) return;\n if (typeof o === \"string\") return arrayLikeToArray(o, minLen);\n var n = Object.prototype.toString.call(o).slice(8, -1);\n if (n === \"Object\" && o.constructor) n = o.constructor.name;\n if (n === \"Map\" || n === \"Set\") return Array.from(o);\n if (n === \"Arguments\" || /^(?:Ui|I)nt(?:8|16|32)(?:Clamped)?Array$/.test(n)) return arrayLikeToArray(o, minLen);\n}","export default function _nonIterableRest() {\n throw new TypeError(\"Invalid attempt to destructure non-iterable instance.\\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method.\");\n}","import _slicedToArray from \"@babel/runtime/helpers/slicedToArray\";\nimport { useEffect, useState } from 'react';\n\nvar useIsSubsequentRender = function useIsSubsequentRender() {\n var _useState = useState(false),\n _useState2 = _slicedToArray(_useState, 2),\n isSubsequentRender = _useState2[0],\n setIsSubsequentRender = _useState2[1];\n\n useEffect(function () {\n setIsSubsequentRender(true);\n }, []);\n return isSubsequentRender;\n};\n\nexport default useIsSubsequentRender;","var zIndexToName = {\n 100: 'card',\n 200: 'navigation',\n 300: 'dialog',\n 400: 'layer',\n 500: 'blanket',\n 510: 'modal',\n 600: 'flag',\n 700: 'spotlight',\n 800: 'tooltip'\n};\n/**\n * return layer name in Atlassian design system corresponding to given z-index\n * @param {number} zIndex - z-index value for which layer name is needed\n * @returns {LayerName | null} - The layer name for given z-index. If layer name is not found then null is returned\n */\n\nvar getLayerName = function getLayerName(zIndex) {\n return zIndexToName.hasOwnProperty(zIndex) ? zIndexToName[zIndex] : null;\n};\n/**\n * Creates a PortalEvent object with given eventName, given zIndex and corresponding layer\n * @param {string} eventName - either of Mount or Unmount event name\n * @param {number} zIndex - z-index value which will be included in the event to be dispatched\n * @returns {PortalEvent} - The newly created PortalEvent object\n */\n\n\nvar getEvent = function getEvent(eventName, zIndex) {\n var detail = {\n layer: getLayerName(Number(zIndex)),\n zIndex: zIndex\n };\n return new CustomEvent(eventName, {\n detail: detail\n });\n};\n/**\n * Dispatches a custom event on window with given eventName, given zIndex and corresponding layer\n * @param {string} eventName - either of Mount or Unmount event name\n * @param {number} zIndex - z-index value which will be included in the event to be dispatched\n */\n\n\nexport default function firePortalEvent(eventName, zIndex) {\n var event = getEvent(eventName, zIndex);\n window.dispatchEvent(event);\n}","import { useEffect } from 'react';\nimport { PORTAL_MOUNT_EVENT, PORTAL_UNMOUNT_EVENT } from '../../constants';\nimport firePortalEvent from '../utils/portal-custom-event';\n\nvar useFirePortalEvent = function useFirePortalEvent(zIndex) {\n var zIndexNumber = Number(zIndex);\n useEffect(function () {\n firePortalEvent(PORTAL_MOUNT_EVENT, zIndexNumber);\n return function () {\n firePortalEvent(PORTAL_UNMOUNT_EVENT, zIndexNumber);\n };\n }, [zIndexNumber]);\n};\n\nexport default useFirePortalEvent;","export var PORTAL_MOUNT_EVENT = 'akPortalMount';\nexport var PORTAL_UNMOUNT_EVENT = 'akPortalUnmount';","import React from 'react';\nimport InternalPortal from './internal/components/internal-portal';\nimport useIsSubsequentRender from './internal/hooks/use-is-subsequent-render';\nimport useFirePortalEvent from './internal/hooks/use-portal-event';\nexport default function Portal(props) {\n var _props$zIndex = props.zIndex,\n zIndex = _props$zIndex === void 0 ? 0 : _props$zIndex,\n children = props.children;\n var isSubsequentRender = useIsSubsequentRender();\n useFirePortalEvent(zIndex);\n return isSubsequentRender ? /*#__PURE__*/React.createElement(InternalPortal, {\n zIndex: zIndex\n }, children) : null;\n}","var delayId = null;\nexport function clearScheduled() {\n if (delayId != null) {\n window.clearTimeout(delayId);\n delayId = null;\n }\n}\nexport function scheduleTimeout(fn, delay) {\n clearScheduled();\n delayId = window.setTimeout(function () {\n delayId = null;\n fn();\n }, delay);\n}","import { clearScheduled, scheduleTimeout } from './shared-schedule'; // This file is a singleton for managing tooltips\n\nvar active = null;\nexport function show(entry) {\n var phase = 'waiting-to-show';\n\n function isActive() {\n return Boolean(active && active.entry === entry);\n }\n\n function cleanup() {\n if (isActive()) {\n clearScheduled();\n active = null;\n }\n }\n\n function done() {\n if (isActive()) {\n entry.done();\n }\n\n phase = 'done';\n cleanup();\n }\n\n function immediatelyHideAndDone() {\n if (isActive()) {\n entry.hide({\n isImmediate: true\n });\n }\n\n done();\n }\n\n function keep() {\n if (!isActive()) {\n return;\n } // aborting a wait to hide\n\n\n if (phase === 'waiting-to-hide') {\n phase = 'shown';\n clearScheduled();\n return;\n } // aborting hide animation\n\n\n if (phase === 'hide-animating') {\n phase = 'shown';\n clearScheduled();\n entry.show({\n isImmediate: false\n });\n return;\n }\n }\n\n function requestHide(_ref) {\n var isImmediate = _ref.isImmediate;\n\n if (!isActive()) {\n return;\n } // If we were not showing yet anyway; finish straight away\n\n\n if (phase === 'waiting-to-show') {\n immediatelyHideAndDone();\n return;\n } // already waiting to hide\n\n\n if (phase === 'waiting-to-hide') {\n return;\n }\n\n if (isImmediate) {\n immediatelyHideAndDone();\n return;\n }\n\n phase = 'waiting-to-hide';\n scheduleTimeout(function () {\n phase = 'hide-animating';\n entry.hide({\n isImmediate: false\n });\n }, entry.delay);\n }\n\n function finishHideAnimation() {\n if (isActive() && phase === 'hide-animating') {\n done();\n }\n }\n\n function isVisible() {\n return phase === 'shown' || phase === 'waiting-to-hide' || phase === 'hide-animating';\n }\n\n function getInitialMouse() {\n if (entry.source.type === 'mouse') {\n return entry.source.mouse;\n }\n\n return null;\n }\n\n function start() {\n var showImmediately = Boolean(active && active.isVisible()); // If there was an active tooltip; we tell it to remove itself at once!\n\n if (active) {\n clearScheduled();\n active.entry.hide({\n isImmediate: true\n });\n active.entry.done();\n active = null;\n } // this tooltip is now the active tooltip\n\n\n active = {\n entry: entry,\n isVisible: isVisible\n };\n\n function show() {\n phase = 'shown';\n entry.show({\n isImmediate: showImmediately\n });\n }\n\n if (showImmediately) {\n show();\n return;\n }\n\n phase = 'waiting-to-show';\n scheduleTimeout(show, entry.delay);\n } // let's get started!\n\n\n start();\n var result = {\n keep: keep,\n abort: cleanup,\n isActive: isActive,\n requestHide: requestHide,\n finishHideAnimation: finishHideAnimation,\n mousePosition: getInitialMouse()\n };\n return result;\n}","/**\n * generates a UID factory\n * @internal\n * @example\n * const uid = generateUID();\n * uid(object) = 1;\n * uid(object) = 1;\n * uid(anotherObject) = 2;\n */\nexport var generateUID = function () {\n var counter = 1;\n var map = new WeakMap();\n /**\n * @borrows {uid}\n */\n var uid = function (item, index) {\n if (typeof item === 'number' ||\n typeof item === 'string') {\n return index ? \"idx-\" + index : \"val-\" + item;\n }\n if (!map.has(item)) {\n map.set(item, counter++);\n return uid(item);\n }\n return 'uid' + map.get(item);\n };\n return uid;\n};\n/**\n * @name uid\n * returns an UID associated with {item}\n * @param {Object} item - object to generate UID for\n * @param {Number} index, a fallback index\n * @example\n * uid(object) == 1;\n * uid(object) == 1;\n * uid(anotherObject) == 2;\n * uid(\"not object\", 42) == 42\n *\n * @see {@link useUID}\n */\nexport var uid = generateUID();\n","import * as React from 'react';\nimport { generateUID } from \"./uid\";\nexport var createSource = function (prefix) {\n if (prefix === void 0) { prefix = ''; }\n return ({\n value: 1,\n prefix: prefix,\n uid: generateUID()\n });\n};\nexport var counter = createSource();\nexport var source = React.createContext(createSource());\nexport var getId = function (source) { return source.value++; };\nexport var getPrefix = function (source) { return source ? source.prefix : ''; };\n","import * as React from \"react\";\nimport { counter, getId, getPrefix, source } from \"./context\";\nvar generateUID = function (context) {\n var quartz = context || counter;\n var prefix = getPrefix(quartz);\n var id = getId(quartz);\n var uid = prefix + id;\n var gen = function (item) { return uid + quartz.uid(item); };\n return { uid: uid, gen: gen };\n};\nvar useUIDState = function () {\n if (process.env.NODE_ENV !== \"production\") {\n if (!('useContext' in React)) {\n throw new Error('Hooks API requires React 16.8+');\n }\n }\n // @ts-ignore\n return React.useState(generateUID(React.useContext(source)));\n};\n/**\n * returns and unique id. SSR friendly\n * returns {String}\n * @see {@link UIDConsumer}\n * @see https://github.com/thearnica/react-uid#hooks-168\n * @example\n * const id = useUID();\n * id == 1; // for example\n */\nexport var useUID = function () {\n var uid = useUIDState()[0].uid;\n return uid;\n};\n/**\n * returns an uid generator\n * @see {@link UIDConsumer}\n * @see https://github.com/thearnica/react-uid#hooks-168\n * @example\n * const uid = useUIDSeed();\n * return (\n * <>\n * \n * \n * {data.map(item =>
...
\n * \n * )\n */\nexport var useUIDSeed = function () {\n var gen = useUIDState()[0].gen;\n return gen;\n};\n","import { useUIDSeed } from 'react-uid';\nexport default function useUniqueId(prefix, shouldRenderId) {\n var seed = useUIDSeed();\n return shouldRenderId ? \"\".concat(seed(prefix)) : undefined;\n}","import _defineProperty from \"@babel/runtime/helpers/defineProperty\";\n\nfunction ownKeys(object, enumerableOnly) { var keys = Object.keys(object); if (Object.getOwnPropertySymbols) { var symbols = Object.getOwnPropertySymbols(object); enumerableOnly && (symbols = symbols.filter(function (sym) { return Object.getOwnPropertyDescriptor(object, sym).enumerable; })), keys.push.apply(keys, symbols); } return keys; }\n\nfunction _objectSpread(target) { for (var i = 1; i < arguments.length; i++) { var source = null != arguments[i] ? arguments[i] : {}; i % 2 ? ownKeys(Object(source), !0).forEach(function (key) { _defineProperty(target, key, source[key]); }) : Object.getOwnPropertyDescriptors ? Object.defineProperties(target, Object.getOwnPropertyDescriptors(source)) : ownKeys(Object(source)).forEach(function (key) { Object.defineProperty(target, key, Object.getOwnPropertyDescriptor(source, key)); }); } return target; }\n\n/** @jsx jsx */\nimport { forwardRef } from 'react';\nimport { css, jsx } from '@emotion/core';\nimport { layers } from '@atlaskit/theme/constants';\nvar VAR_PRIMITIVE_ZINDEX = 'tooltipPrimitiveZindex';\nvar primitiveStyles = css({\n zindex: \"var(\".concat(VAR_PRIMITIVE_ZINDEX, \")\"),\n cursor: \"default\"\n});\nvar TooltipPrimitive = /*#__PURE__*/forwardRef(function TooltipPrimitive(_ref, ref) {\n var style = _ref.style,\n className = _ref.className,\n children = _ref.children,\n placement = _ref.placement,\n testId = _ref.testId,\n onMouseOut = _ref.onMouseOut,\n onMouseOver = _ref.onMouseOver,\n id = _ref.id;\n\n var styleWithZIndex = _objectSpread(_objectSpread({}, style), {}, _defineProperty({}, VAR_PRIMITIVE_ZINDEX, layers.tooltip()));\n\n return jsx(\"div\", {\n ref: ref,\n style: styleWithZIndex,\n \"data-testid\": testId ? \"\".concat(testId, \"--wrapper\") : undefined\n }, jsx(\"div\", {\n role: \"tooltip\",\n className: className,\n onMouseOut: onMouseOut,\n onMouseOver: onMouseOver,\n css: primitiveStyles,\n \"data-placement\": placement,\n \"data-testid\": testId,\n id: id\n }, children));\n});\nTooltipPrimitive.displayName = 'TooltipPrimitive';\nexport default TooltipPrimitive;","/** @jsx jsx */\nimport { forwardRef } from 'react';\nimport { css, jsx } from '@emotion/core';\nimport { DN0, DN600, N0, N800 } from '@atlaskit/theme/colors';\nimport GlobalTheme from '@atlaskit/theme/components';\nimport { borderRadius } from '@atlaskit/theme/constants';\nimport TooltipPrimitive from './TooltipPrimitive';\nvar baseStyles = css({\n boxSizing: 'border-box',\n maxWidth: '240px',\n padding: '2px 6px',\n top: 0,\n left: 0,\n borderRadius: \"\".concat(borderRadius(), \"px\"),\n fontSize: '12px',\n lineHeight: 1.3,\n overflowWrap: 'break-word',\n wordWrap: 'break-word'\n});\nvar truncateStyles = css({\n maxWidth: '420px',\n overflow: 'hidden',\n textOverflow: 'ellipsis',\n whiteSpace: 'nowrap'\n});\nvar lightStyles = css({\n backgroundColor: \"var(--ds-background-neutral-bold, \".concat(N800, \")\"),\n color: \"var(--ds-text-inverse, \".concat(N0, \")\")\n});\nvar darkStyles = css({\n backgroundColor: \"var(--ds-background-neutral-bold, \".concat(DN0, \")\"),\n color: \"var(--ds-text-inverse, \".concat(DN600, \")\")\n});\nvar TooltipContainer = /*#__PURE__*/forwardRef(function TooltipContainer(_ref, ref) {\n var style = _ref.style,\n className = _ref.className,\n children = _ref.children,\n truncate = _ref.truncate,\n placement = _ref.placement,\n testId = _ref.testId,\n onMouseOut = _ref.onMouseOut,\n onMouseOver = _ref.onMouseOver,\n id = _ref.id;\n return jsx(GlobalTheme.Consumer, null, function (_ref2) {\n var mode = _ref2.mode;\n return (// eslint-disable-next-line jsx-a11y/mouse-events-have-key-events\n jsx(TooltipPrimitive, {\n ref: ref,\n style: style,\n className: className,\n placement: placement,\n testId: testId,\n id: id,\n onMouseOut: onMouseOut,\n onMouseOver: onMouseOver,\n css: [baseStyles, truncate ? truncateStyles : null, mode === 'light' ? lightStyles : darkStyles]\n }, children)\n );\n });\n});\nTooltipContainer.displayName = 'TooltipContainer';\nexport default TooltipContainer;","export function getMousePosition(mouseCoordinates) {\n var safeMouse = mouseCoordinates || {\n top: 0,\n left: 0\n };\n\n var getBoundingClientRect = function getBoundingClientRect() {\n return {\n top: safeMouse.top,\n left: safeMouse.left,\n bottom: safeMouse.top,\n right: safeMouse.left,\n width: 0,\n height: 0\n };\n };\n\n return {\n getBoundingClientRect: getBoundingClientRect,\n clientWidth: 0,\n clientHeight: 0\n };\n}","import _extends from \"@babel/runtime/helpers/extends\";\nimport _slicedToArray from \"@babel/runtime/helpers/slicedToArray\";\nimport _defineProperty from \"@babel/runtime/helpers/defineProperty\";\n\nfunction ownKeys(object, enumerableOnly) { var keys = Object.keys(object); if (Object.getOwnPropertySymbols) { var symbols = Object.getOwnPropertySymbols(object); enumerableOnly && (symbols = symbols.filter(function (sym) { return Object.getOwnPropertyDescriptor(object, sym).enumerable; })), keys.push.apply(keys, symbols); } return keys; }\n\nfunction _objectSpread(target) { for (var i = 1; i < arguments.length; i++) { var source = null != arguments[i] ? arguments[i] : {}; i % 2 ? ownKeys(Object(source), !0).forEach(function (key) { _defineProperty(target, key, source[key]); }) : Object.getOwnPropertyDescriptors ? Object.defineProperties(target, Object.getOwnPropertyDescriptors(source)) : ownKeys(Object(source)).forEach(function (key) { Object.defineProperty(target, key, Object.getOwnPropertyDescriptor(source, key)); }); } return target; }\n\n/** @jsx jsx */\nimport React, { useCallback, useEffect, useRef, useState } from 'react';\nimport { jsx } from '@emotion/core';\nimport { bind } from 'bind-event-listener';\nimport { usePlatformLeafSyntheticEventHandler } from '@atlaskit/analytics-next';\nimport noop from '@atlaskit/ds-lib/noop';\nimport useCloseOnEscapePress from '@atlaskit/ds-lib/use-close-on-escape-press';\nimport { ExitingPersistence, FadeIn } from '@atlaskit/motion';\nimport { mediumDurationMs } from '@atlaskit/motion/durations';\nimport { Popper } from '@atlaskit/popper';\nimport Portal from '@atlaskit/portal';\nimport { layers } from '@atlaskit/theme/constants';\nimport { show } from './internal/tooltip-manager';\nimport useUniqueId from './internal/use-unique-id';\nimport TooltipContainer from './TooltipContainer';\nimport { getMousePosition } from './utilities';\nvar tooltipZIndex = layers.tooltip();\nvar analyticsAttributes = {\n componentName: 'tooltip',\n packageName: \"@atlaskit/tooltip\",\n packageVersion: \"17.5.17\"\n}; // Inverts motion direction\n\nvar invertedDirection = {\n top: 'bottom',\n bottom: 'top',\n left: 'right',\n right: 'left'\n};\n/**\n * Converts a Popper placement to it's general direction.\n *\n * @param position - Popper Placement value, e.g. 'top-start'\n * @returns Popper Direction, e.g. 'top'\n */\n\nvar getDirectionFromPlacement = function getDirectionFromPlacement(placement) {\n return placement.split('-')[0];\n};\n\nfunction Tooltip(_ref) {\n var children = _ref.children,\n _ref$position = _ref.position,\n position = _ref$position === void 0 ? 'bottom' : _ref$position,\n _ref$mousePosition = _ref.mousePosition,\n mousePosition = _ref$mousePosition === void 0 ? 'bottom' : _ref$mousePosition,\n content = _ref.content,\n _ref$truncate = _ref.truncate,\n truncate = _ref$truncate === void 0 ? false : _ref$truncate,\n _ref$component = _ref.component,\n Container = _ref$component === void 0 ? TooltipContainer : _ref$component,\n _ref$tag = _ref.tag,\n TargetContainer = _ref$tag === void 0 ? 'div' : _ref$tag,\n testId = _ref.testId,\n _ref$delay = _ref.delay,\n delay = _ref$delay === void 0 ? 300 : _ref$delay,\n _ref$onShow = _ref.onShow,\n onShow = _ref$onShow === void 0 ? noop : _ref$onShow,\n _ref$onHide = _ref.onHide,\n onHide = _ref$onHide === void 0 ? noop : _ref$onHide,\n _ref$hideTooltipOnCli = _ref.hideTooltipOnClick,\n hideTooltipOnClick = _ref$hideTooltipOnCli === void 0 ? false : _ref$hideTooltipOnCli,\n _ref$hideTooltipOnMou = _ref.hideTooltipOnMouseDown,\n hideTooltipOnMouseDown = _ref$hideTooltipOnMou === void 0 ? false : _ref$hideTooltipOnMou,\n analyticsContext = _ref.analyticsContext,\n _ref$strategy = _ref.strategy,\n strategy = _ref$strategy === void 0 ? 'fixed' : _ref$strategy;\n var tooltipPosition = position === 'mouse' ? mousePosition : position;\n var onShowHandler = usePlatformLeafSyntheticEventHandler(_objectSpread({\n fn: onShow,\n action: 'displayed',\n analyticsData: analyticsContext\n }, analyticsAttributes));\n var onHideHandler = usePlatformLeafSyntheticEventHandler(_objectSpread({\n fn: onHide,\n action: 'hidden',\n analyticsData: analyticsContext\n }, analyticsAttributes));\n var apiRef = useRef(null);\n\n var _useState = useState('hide'),\n _useState2 = _slicedToArray(_useState, 2),\n state = _useState2[0],\n setState = _useState2[1];\n\n var targetRef = useRef(null);\n var containerRef = useRef(null);\n var setRef = useCallback(function (node) {\n if (!node) {\n return;\n }\n\n if (typeof children === 'function') {\n // @ts-ignore - React Ref typing is too strict for this use case\n targetRef.current = node;\n } else {\n // @ts-ignore - React Ref typing is too strict for this use case\n containerRef.current = node; // @ts-ignore - React Ref typing is too strict for this use case\n\n targetRef.current = node.firstChild;\n }\n }, [children]); // Putting a few things into refs so that we don't have to break memoization\n\n var lastState = useRef(state);\n var lastDelay = useRef(delay);\n var lastHandlers = useRef({\n onShowHandler: onShowHandler,\n onHideHandler: onHideHandler\n });\n var hasCalledShowHandler = useRef(false);\n useEffect(function () {\n lastState.current = state;\n lastDelay.current = delay;\n lastHandlers.current = {\n onShowHandler: onShowHandler,\n onHideHandler: onHideHandler\n };\n }, [delay, onHideHandler, onShowHandler, state]);\n var start = useCallback(function (api) {\n // @ts-ignore\n apiRef.current = api;\n hasCalledShowHandler.current = false;\n }, []);\n var done = useCallback(function () {\n if (!apiRef.current) {\n return;\n } // Only call onHideHandler if we have called onShowHandler\n\n\n if (hasCalledShowHandler.current) {\n lastHandlers.current.onHideHandler();\n } // @ts-ignore\n\n\n apiRef.current = null; // @ts-ignore\n\n hasCalledShowHandler.current = false; // just in case\n\n setState('hide');\n }, []);\n var abort = useCallback(function () {\n if (!apiRef.current) {\n return;\n }\n\n apiRef.current.abort(); // Only call onHideHandler if we have called onShowHandler\n\n if (hasCalledShowHandler.current) {\n lastHandlers.current.onHideHandler();\n } // @ts-ignore\n\n\n apiRef.current = null;\n }, []);\n useEffect(function mount() {\n return function unmount() {\n if (apiRef.current) {\n abort();\n }\n };\n }, [abort]);\n var showTooltip = useCallback(function (source) {\n if (apiRef.current && !apiRef.current.isActive()) {\n abort();\n } // Tell the tooltip to keep showing\n\n\n if (apiRef.current && apiRef.current.isActive()) {\n apiRef.current.keep();\n return;\n }\n\n var entry = {\n source: source,\n delay: lastDelay.current,\n show: function show(_ref2) {\n var isImmediate = _ref2.isImmediate;\n\n // Call the onShow handler if it hasn't been called yet\n if (!hasCalledShowHandler.current) {\n hasCalledShowHandler.current = true;\n lastHandlers.current.onShowHandler();\n }\n\n setState(isImmediate ? 'show-immediate' : 'fade-in');\n },\n hide: function hide(_ref3) {\n var isImmediate = _ref3.isImmediate;\n\n if (isImmediate) {\n setState('hide');\n } else {\n setState('before-fade-out');\n }\n },\n done: done\n };\n var api = show(entry);\n start(api);\n }, [abort, done, start]);\n var hideTooltipOnEsc = useCallback(function () {\n var _apiRef$current;\n\n (_apiRef$current = apiRef.current) === null || _apiRef$current === void 0 ? void 0 : _apiRef$current.requestHide({\n isImmediate: true\n });\n }, [apiRef]);\n useCloseOnEscapePress({\n onClose: hideTooltipOnEsc,\n isDisabled: state === 'hide' || state === 'fade-out'\n });\n useEffect(function () {\n if (state === 'hide') {\n return noop;\n }\n\n if (state === 'before-fade-out') {\n setState('fade-out');\n }\n\n var unbind = bind(window, {\n type: 'scroll',\n listener: function listener() {\n if (apiRef.current) {\n apiRef.current.requestHide({\n isImmediate: true\n });\n }\n },\n options: {\n capture: true,\n passive: true,\n once: true\n }\n });\n return unbind;\n }, [state]);\n var onMouseDown = useCallback(function () {\n if (hideTooltipOnMouseDown && apiRef.current) {\n apiRef.current.requestHide({\n isImmediate: true\n });\n }\n }, [hideTooltipOnMouseDown]);\n var onClick = useCallback(function () {\n if (hideTooltipOnClick && apiRef.current) {\n apiRef.current.requestHide({\n isImmediate: true\n });\n }\n }, [hideTooltipOnClick]); // Ideally we would be using onMouseEnter here, but\n // because we are binding the event to the target parent\n // we need to listen for the mouseover of all sub elements\n // This means when moving along a tooltip we are quickly toggling\n // between api.requestHide and api.keep. This it not ideal\n\n var onMouseOver = useCallback(function (event) {\n // Ignoring events from the container ref\n if (containerRef.current && event.target === containerRef.current) {\n return;\n } // Using prevent default as a signal that parent tooltips\n\n\n if (event.defaultPrevented) {\n return;\n }\n\n event.preventDefault();\n var source = position === 'mouse' ? {\n type: 'mouse',\n // TODO: ideally not recalculating this object each time\n mouse: getMousePosition({\n left: event.clientX,\n top: event.clientY\n })\n } : {\n type: 'keyboard'\n };\n showTooltip(source);\n }, [position, showTooltip]); // Ideally we would be using onMouseEnter here, but\n // because we are binding the event to the target parent\n // we need to listen for the mouseout of all sub elements\n // This means when moving along a tooltip we are quickly toggling\n // between api.requestHide and api.keep. This it not ideal\n\n var onMouseOut = useCallback(function (event) {\n // Ignoring events from the container ref\n if (containerRef.current && event.target === containerRef.current) {\n return;\n } // Using prevent default as a signal that parent tooltips\n\n\n if (event.defaultPrevented) {\n return;\n }\n\n event.preventDefault();\n\n if (apiRef.current) {\n apiRef.current.requestHide({\n isImmediate: false\n });\n }\n }, []);\n var onMouseMove = position === 'mouse' ? function (event) {\n var _apiRef$current2;\n\n if ((_apiRef$current2 = apiRef.current) !== null && _apiRef$current2 !== void 0 && _apiRef$current2.isActive()) {\n apiRef.current.mousePosition = getMousePosition({\n left: event.clientX,\n top: event.clientY\n });\n }\n } : undefined;\n var onMouseOverTooltip = useCallback(function () {\n if (apiRef.current && apiRef.current.isActive()) {\n apiRef.current.keep();\n return;\n }\n }, []);\n var onFocus = useCallback(function () {\n showTooltip({\n type: 'keyboard'\n });\n }, [showTooltip]);\n var onBlur = useCallback(function () {\n if (apiRef.current) {\n apiRef.current.requestHide({\n isImmediate: false\n });\n }\n }, []);\n var onAnimationFinished = useCallback(function (transition) {\n // Using lastState here because motion is not picking up the latest value\n if (transition === 'exiting' && lastState.current === 'fade-out' && apiRef.current) {\n // @ts-ignore: refs are writeable\n apiRef.current.finishHideAnimation();\n }\n }, []); // Doing a cast because typescript is struggling to narrow the type\n\n var CastTargetContainer = TargetContainer;\n var shouldRenderTooltipContainer = state !== 'hide' && Boolean(content);\n var shouldRenderTooltipChildren = state !== 'hide' && state !== 'fade-out';\n\n var getReferenceElement = function getReferenceElement() {\n var _apiRef$current3;\n\n if (position === 'mouse' && (_apiRef$current3 = apiRef.current) !== null && _apiRef$current3 !== void 0 && _apiRef$current3.mousePosition) {\n var _apiRef$current4;\n\n return (_apiRef$current4 = apiRef.current) === null || _apiRef$current4 === void 0 ? void 0 : _apiRef$current4.mousePosition;\n }\n\n return targetRef.current || undefined;\n };\n\n var tooltipId = useUniqueId('tooltip', shouldRenderTooltipContainer);\n var tooltipTriggerProps = {\n onMouseOver: onMouseOver,\n onMouseOut: onMouseOut,\n onMouseMove: onMouseMove,\n onClick: onClick,\n onMouseDown: onMouseDown,\n onFocus: onFocus,\n onBlur: onBlur,\n ref: setRef,\n 'aria-describedby': tooltipId,\n 'data-testid': testId ? \"\".concat(testId, \"--container\") : undefined\n };\n return jsx(React.Fragment, null, typeof children === 'function' ? children(tooltipTriggerProps) : jsx(CastTargetContainer, _extends({}, tooltipTriggerProps, {\n role: \"presentation\"\n }), children), shouldRenderTooltipContainer ? jsx(Portal, {\n zIndex: tooltipZIndex\n }, jsx(Popper, {\n placement: tooltipPosition,\n referenceElement: getReferenceElement(),\n strategy: strategy\n }, function (_ref4) {\n var ref = _ref4.ref,\n style = _ref4.style,\n update = _ref4.update,\n placement = _ref4.placement;\n // Invert the entrance and exit directions.\n // E.g. a tooltip's position is on the 'right', it should enter from and exit to the 'left'\n // This gives the effect the tooltip is appearing from the target\n var direction = position === 'mouse' ? undefined : invertedDirection[getDirectionFromPlacement(placement)];\n return jsx(ExitingPersistence, {\n appear: true\n }, shouldRenderTooltipChildren && jsx(FadeIn, {\n distance: \"constant\",\n entranceDirection: direction,\n exitDirection: direction,\n onFinish: onAnimationFinished,\n duration: state === 'show-immediate' ? 0 : mediumDurationMs\n }, function (_ref5) {\n var className = _ref5.className;\n return (// eslint-disable-next-line jsx-a11y/mouse-events-have-key-events\n jsx(Container, {\n ref: ref,\n className: \"Tooltip \".concat(className),\n style: style,\n truncate: truncate,\n placement: tooltipPosition,\n testId: testId,\n onMouseOut: onMouseOut,\n onMouseOver: onMouseOverTooltip,\n id: tooltipId\n }, typeof content === 'function' ? content({\n update: update\n }) : content)\n );\n }));\n })) : null);\n}\n\nTooltip.displayName = 'Tooltip';\nexport default Tooltip;","import { useCallback, useEffect, useRef } from 'react';\nimport { bindAll } from 'bind-event-listener';\nimport { ESCAPE } from '../utils/keycodes';\n\n/**\n * Calls back when the escape key is pressed.\n * To be used exclusively for closing layered components.\n * Use the `isDisabled` argument to ignore closing events.\n *\n * ```js\n * useCloseOnEscapePress({\n * onClose: () => {},\n * isDisabled: false,\n * });\n * ```\n */\nexport default function useCloseOnEscapePress(_ref) {\n var onClose = _ref.onClose,\n isDisabled = _ref.isDisabled;\n var escapePressed = useRef(false);\n var onKeyDown = useCallback(function (e) {\n if (isDisabled || escapePressed.current || e.key !== ESCAPE) {\n // We're either already handling the key down event or it's not escape.\n // Bail early!\n return;\n }\n\n escapePressed.current = true;\n onClose(e);\n }, [onClose, isDisabled]);\n var onKeyUp = useCallback(function () {\n escapePressed.current = false;\n }, []);\n useEffect(function () {\n return bindAll(document, [{\n type: 'keydown',\n listener: onKeyDown\n }, {\n type: 'keyup',\n listener: onKeyUp\n }], {\n capture: false\n });\n }, [onKeyDown, onKeyUp]);\n}","/**\n * Character key codes which can be used in keyboard events.\n */\nexport var KEY_UP = 'ArrowUp';\nexport var KEY_DOWN = 'ArrowDown';\nexport var KEY_HOME = 'Home';\nexport var KEY_END = 'End';\nexport var ESCAPE = 'Escape';","/** @jsx jsx */\nimport { css, jsx } from '@emotion/core';\nimport { Y75 } from '@atlaskit/theme/colors';\nvar decoration = css({\n // Required as otherwise the following bidi characters cause the span\n // to not receive hover events.\n //\n // U+2066 LEFT-TO-RIGHT ISOLATE (when using pseudo element before)\n // U+202E RIGHT-TO-LEFT OVERRIDE' (when using pseudo element after)\n position: 'relative',\n ':before': {\n display: 'inline-flex',\n padding: '0 4px',\n alignItems: 'center',\n justifyContent: 'center',\n flexDirection: 'row',\n background: \"var(--ds-background-warning, \".concat(Y75, \")\"),\n color: \"var(--ds-text-warning, #7F5F01)\",\n content: '\"<\"attr(data-bidi-character-code)\">\"',\n fontSize: '14px',\n fontStyle: 'normal',\n lineHeight: '18px',\n\n /**\n * Ensures the decoration receives pointer events when it occurs with\n * an ancestor that disables them.\n */\n pointerEvents: 'auto'\n },\n ':hover:before': {\n background: \"var(--ds-background-warning-hovered, \".concat(Y75, \")\"),\n color: \"var(--ds-text-warning, #533F04)\"\n }\n});\nexport function Decorator(_ref) {\n var bidiCharacter = _ref.bidiCharacter,\n children = _ref.children,\n testId = _ref.testId;\n var bidiCharacterCode = getBidiCharacterCode(bidiCharacter);\n return jsx(\"span\", {\n \"aria-label\": bidiCharacterCode\n }, jsx(\"span\", {\n css: decoration,\n \"data-testid\": testId,\n \"data-bidi-character-code\": bidiCharacterCode // This is set to true so that the content is not read out by\n // screen readers as the content includes angle brackets for\n // visual decoration purposes.\n // We use a span with the aria-label set to the bidi character code\n // above this span for screen readers.\n ,\n \"aria-hidden\": \"true\"\n }, children));\n}\n\nfunction getBidiCharacterCode(bidiCharacter) {\n var _bidiCharacter$codePo;\n\n var bidiCharacterCode = (_bidiCharacter$codePo = bidiCharacter.codePointAt(0)) === null || _bidiCharacter$codePo === void 0 ? void 0 : _bidiCharacter$codePo.toString(16);\n return \"U+\".concat(bidiCharacterCode);\n}","import _extends from \"@babel/runtime/helpers/extends\";\nimport _objectWithoutProperties from \"@babel/runtime/helpers/objectWithoutProperties\";\nvar _excluded = [\"children\"];\nimport React from 'react';\nimport Tooltip from '@atlaskit/tooltip';\nimport { Decorator } from './styled';\nexport default function BidiWarning(_ref) {\n var testId = _ref.testId,\n bidiCharacter = _ref.bidiCharacter,\n skipChildren = _ref.skipChildren,\n tooltipEnabled = _ref.tooltipEnabled,\n _ref$label = _ref.label,\n label = _ref$label === void 0 ? 'Bidirectional characters change the order that text is rendered. This could be used to obscure malicious code.' : _ref$label;\n\n if (tooltipEnabled) {\n return (\n /*#__PURE__*/\n // Following patches, this should be updated to use the render props signature which will provide aria attributes.\n // Note: this should be tested, as initial testing did not see attributes work with current tooltip implementation.\n React.createElement(Tooltip, {\n content: label,\n tag: CustomizedTagWithRef\n }, /*#__PURE__*/React.createElement(Decorator, {\n testId: testId,\n bidiCharacter: bidiCharacter\n }, skipChildren ? null : bidiCharacter))\n );\n }\n\n return /*#__PURE__*/React.createElement(Decorator, {\n testId: testId,\n bidiCharacter: bidiCharacter\n }, skipChildren ? null : bidiCharacter);\n}\nvar CustomizedTagWithRef = /*#__PURE__*/React.forwardRef(function (props, ref) {\n var children = props.children,\n rest = _objectWithoutProperties(props, _excluded);\n\n return /*#__PURE__*/React.createElement(\"span\", _extends({}, rest, {\n ref: ref\n }), children);\n});","import arrayWithoutHoles from \"./arrayWithoutHoles.js\";\nimport iterableToArray from \"./iterableToArray.js\";\nimport unsupportedIterableToArray from \"./unsupportedIterableToArray.js\";\nimport nonIterableSpread from \"./nonIterableSpread.js\";\nexport default function _toConsumableArray(arr) {\n return arrayWithoutHoles(arr) || iterableToArray(arr) || unsupportedIterableToArray(arr) || nonIterableSpread();\n}","import arrayLikeToArray from \"./arrayLikeToArray.js\";\nexport default function _arrayWithoutHoles(arr) {\n if (Array.isArray(arr)) return arrayLikeToArray(arr);\n}","export default function _iterableToArray(iter) {\n if (typeof Symbol !== \"undefined\" && Symbol.iterator in Object(iter)) return Array.from(iter);\n}","export default function _nonIterableSpread() {\n throw new TypeError(\"Invalid attempt to spread non-iterable instance.\\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method.\");\n}","import _toConsumableArray from \"@babel/runtime/helpers/toConsumableArray\";\n\nfunction _createForOfIteratorHelper(o, allowArrayLike) { var it = typeof Symbol !== \"undefined\" && o[Symbol.iterator] || o[\"@@iterator\"]; if (!it) { if (Array.isArray(o) || (it = _unsupportedIterableToArray(o)) || allowArrayLike && o && typeof o.length === \"number\") { if (it) o = it; var i = 0; var F = function F() {}; return { s: F, n: function n() { if (i >= o.length) return { done: true }; return { done: false, value: o[i++] }; }, e: function e(_e) { throw _e; }, f: F }; } throw new TypeError(\"Invalid attempt to iterate non-iterable instance.\\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method.\"); } var normalCompletion = true, didErr = false, err; return { s: function s() { it = it.call(o); }, n: function n() { var step = it.next(); normalCompletion = step.done; return step; }, e: function e(_e2) { didErr = true; err = _e2; }, f: function f() { try { if (!normalCompletion && it.return != null) it.return(); } finally { if (didErr) throw err; } } }; }\n\nfunction _unsupportedIterableToArray(o, minLen) { if (!o) return; if (typeof o === \"string\") return _arrayLikeToArray(o, minLen); var n = Object.prototype.toString.call(o).slice(8, -1); if (n === \"Object\" && o.constructor) n = o.constructor.name; if (n === \"Map\" || n === \"Set\") return Array.from(o); if (n === \"Arguments\" || /^(?:Ui|I)nt(?:8|16|32)(?:Clamped)?Array$/.test(n)) return _arrayLikeToArray(o, minLen); }\n\nfunction _arrayLikeToArray(arr, len) { if (len == null || len > arr.length) len = arr.length; for (var i = 0, arr2 = new Array(len); i < len; i++) { arr2[i] = arr[i]; } return arr2; }\n\nexport var bidiCharacterRegex = /[\\u202A-\\u202E\\u2066-\\u2069]/g;\nexport default function codeBidiWarningDecorator(originalText, decorate) {\n var matches = _toConsumableArray(originalText.matchAll(bidiCharacterRegex));\n\n if (matches.length === 0) {\n // No matches encountered, so we return the originalText value\n return originalText;\n }\n\n var children = [];\n var mappedTo = 0;\n\n var _iterator = _createForOfIteratorHelper(matches),\n _step;\n\n try {\n for (_iterator.s(); !(_step = _iterator.n()).done;) {\n var match = _step.value;\n\n if (mappedTo !== match.index) {\n // There were unmatched characters prior to this match which haven't been\n // mapped to the children.\n // Add them as plain text.\n children.push(originalText.substring(mappedTo, match.index));\n }\n\n children.push(decorate({\n bidiCharacter: match[0],\n index: match.index\n })); // While index is guaranteed to be present, it needs to be asserted due\n // to a limitation of typescripts regex handling\n //\n // https://github.com/microsoft/TypeScript/issues/36788\n // Decorate bidi character\n\n mappedTo = match.index + match[0].length;\n }\n } catch (err) {\n _iterator.e(err);\n } finally {\n _iterator.f();\n }\n\n if (mappedTo !== originalText.length) {\n // There is text following the final match, which needs to be mapped\n // to the children.\n // Added as plain text.\n children.push(originalText.substring(mappedTo, originalText.length));\n } // return the mapped children with decorated bidi characters\n\n\n return children;\n}","import _extends from \"@babel/runtime/helpers/extends\";\nimport _defineProperty from \"@babel/runtime/helpers/defineProperty\";\n\nfunction ownKeys(object, enumerableOnly) { var keys = Object.keys(object); if (Object.getOwnPropertySymbols) { var symbols = Object.getOwnPropertySymbols(object); enumerableOnly && (symbols = symbols.filter(function (sym) { return Object.getOwnPropertyDescriptor(object, sym).enumerable; })), keys.push.apply(keys, symbols); } return keys; }\n\nfunction _objectSpread(target) { for (var i = 1; i < arguments.length; i++) { var source = null != arguments[i] ? arguments[i] : {}; i % 2 ? ownKeys(Object(source), !0).forEach(function (key) { _defineProperty(target, key, source[key]); }) : Object.getOwnPropertyDescriptors ? Object.defineProperties(target, Object.getOwnPropertyDescriptors(source)) : ownKeys(Object(source)).forEach(function (key) { Object.defineProperty(target, key, Object.getOwnPropertyDescriptor(source, key)); }); } return target; }\n\n// @ts-nocheck\nimport React from 'react';\nimport CodeBidiWarning from './bidi-warning';\nimport codeBidiWarningDecorator from './bidi-warning/bidi-warning-decorator'; // File mostly vendored from react-syntax-highlighter\n//\n// - https://github.com/react-syntax-highlighter/react-syntax-highlighter/blob/efc3f7b7537d1729193b7a472067bcbe6cbecaf1/src/highlight.js#L272-L281\n// - https://github.com/react-syntax-highlighter/react-syntax-highlighter/blob/efc3f7b7537d1729193b7a472067bcbe6cbecaf1/src/create-element.js\n//\n// Patching react syntax-highlighter with a decoration feature is likely preferable\n\nexport function createBidiWarningRenderer(codeBidiWarningConfig) {\n return function bidiWarningRenderer(_ref) {\n var rows = _ref.rows,\n stylesheet = _ref.stylesheet,\n useInlineStyles = _ref.useInlineStyles;\n return rows.map(function (node, i) {\n return createElement({\n node: node,\n stylesheet: stylesheet,\n useInlineStyles: useInlineStyles,\n codeBidiWarningConfig: codeBidiWarningConfig,\n key: \"code-segement\".concat(i)\n });\n });\n };\n} // Get all possible permutations of all power sets\n//\n// Super simple, non-algorithmic solution since the\n// number of class names will not be greater than 4\n\nfunction powerSetPermutations(arr) {\n var arrLength = arr.length;\n\n if (arrLength === 0 || arrLength === 1) {\n return arr;\n }\n\n if (arrLength === 2) {\n // prettier-ignore\n return [arr[0], arr[1], \"\".concat(arr[0], \".\").concat(arr[1]), \"\".concat(arr[1], \".\").concat(arr[0])];\n }\n\n if (arrLength === 3) {\n return [arr[0], arr[1], arr[2], \"\".concat(arr[0], \".\").concat(arr[1]), \"\".concat(arr[0], \".\").concat(arr[2]), \"\".concat(arr[1], \".\").concat(arr[0]), \"\".concat(arr[1], \".\").concat(arr[2]), \"\".concat(arr[2], \".\").concat(arr[0]), \"\".concat(arr[2], \".\").concat(arr[1]), \"\".concat(arr[0], \".\").concat(arr[1], \".\").concat(arr[2]), \"\".concat(arr[0], \".\").concat(arr[2], \".\").concat(arr[1]), \"\".concat(arr[1], \".\").concat(arr[0], \".\").concat(arr[2]), \"\".concat(arr[1], \".\").concat(arr[2], \".\").concat(arr[0]), \"\".concat(arr[2], \".\").concat(arr[0], \".\").concat(arr[1]), \"\".concat(arr[2], \".\").concat(arr[1], \".\").concat(arr[0])];\n }\n\n if (arrLength >= 4) {\n // Currently does not support more than 4 extra\n // class names (after `.token` has been removed)\n return [arr[0], arr[1], arr[2], arr[3], \"\".concat(arr[0], \".\").concat(arr[1]), \"\".concat(arr[0], \".\").concat(arr[2]), \"\".concat(arr[0], \".\").concat(arr[3]), \"\".concat(arr[1], \".\").concat(arr[0]), \"\".concat(arr[1], \".\").concat(arr[2]), \"\".concat(arr[1], \".\").concat(arr[3]), \"\".concat(arr[2], \".\").concat(arr[0]), \"\".concat(arr[2], \".\").concat(arr[1]), \"\".concat(arr[2], \".\").concat(arr[3]), \"\".concat(arr[3], \".\").concat(arr[0]), \"\".concat(arr[3], \".\").concat(arr[1]), \"\".concat(arr[3], \".\").concat(arr[2]), \"\".concat(arr[0], \".\").concat(arr[1], \".\").concat(arr[2]), \"\".concat(arr[0], \".\").concat(arr[1], \".\").concat(arr[3]), \"\".concat(arr[0], \".\").concat(arr[2], \".\").concat(arr[1]), \"\".concat(arr[0], \".\").concat(arr[2], \".\").concat(arr[3]), \"\".concat(arr[0], \".\").concat(arr[3], \".\").concat(arr[1]), \"\".concat(arr[0], \".\").concat(arr[3], \".\").concat(arr[2]), \"\".concat(arr[1], \".\").concat(arr[0], \".\").concat(arr[2]), \"\".concat(arr[1], \".\").concat(arr[0], \".\").concat(arr[3]), \"\".concat(arr[1], \".\").concat(arr[2], \".\").concat(arr[0]), \"\".concat(arr[1], \".\").concat(arr[2], \".\").concat(arr[3]), \"\".concat(arr[1], \".\").concat(arr[3], \".\").concat(arr[0]), \"\".concat(arr[1], \".\").concat(arr[3], \".\").concat(arr[2]), \"\".concat(arr[2], \".\").concat(arr[0], \".\").concat(arr[1]), \"\".concat(arr[2], \".\").concat(arr[0], \".\").concat(arr[3]), \"\".concat(arr[2], \".\").concat(arr[1], \".\").concat(arr[0]), \"\".concat(arr[2], \".\").concat(arr[1], \".\").concat(arr[3]), \"\".concat(arr[2], \".\").concat(arr[3], \".\").concat(arr[0]), \"\".concat(arr[2], \".\").concat(arr[3], \".\").concat(arr[1]), \"\".concat(arr[3], \".\").concat(arr[0], \".\").concat(arr[1]), \"\".concat(arr[3], \".\").concat(arr[0], \".\").concat(arr[2]), \"\".concat(arr[3], \".\").concat(arr[1], \".\").concat(arr[0]), \"\".concat(arr[3], \".\").concat(arr[1], \".\").concat(arr[2]), \"\".concat(arr[3], \".\").concat(arr[2], \".\").concat(arr[0]), \"\".concat(arr[3], \".\").concat(arr[2], \".\").concat(arr[1]), \"\".concat(arr[0], \".\").concat(arr[1], \".\").concat(arr[2], \".\").concat(arr[3]), \"\".concat(arr[0], \".\").concat(arr[1], \".\").concat(arr[3], \".\").concat(arr[2]), \"\".concat(arr[0], \".\").concat(arr[2], \".\").concat(arr[1], \".\").concat(arr[3]), \"\".concat(arr[0], \".\").concat(arr[2], \".\").concat(arr[3], \".\").concat(arr[1]), \"\".concat(arr[0], \".\").concat(arr[3], \".\").concat(arr[1], \".\").concat(arr[2]), \"\".concat(arr[0], \".\").concat(arr[3], \".\").concat(arr[2], \".\").concat(arr[1]), \"\".concat(arr[1], \".\").concat(arr[0], \".\").concat(arr[2], \".\").concat(arr[3]), \"\".concat(arr[1], \".\").concat(arr[0], \".\").concat(arr[3], \".\").concat(arr[2]), \"\".concat(arr[1], \".\").concat(arr[2], \".\").concat(arr[0], \".\").concat(arr[3]), \"\".concat(arr[1], \".\").concat(arr[2], \".\").concat(arr[3], \".\").concat(arr[0]), \"\".concat(arr[1], \".\").concat(arr[3], \".\").concat(arr[0], \".\").concat(arr[2]), \"\".concat(arr[1], \".\").concat(arr[3], \".\").concat(arr[2], \".\").concat(arr[0]), \"\".concat(arr[2], \".\").concat(arr[0], \".\").concat(arr[1], \".\").concat(arr[3]), \"\".concat(arr[2], \".\").concat(arr[0], \".\").concat(arr[3], \".\").concat(arr[1]), \"\".concat(arr[2], \".\").concat(arr[1], \".\").concat(arr[0], \".\").concat(arr[3]), \"\".concat(arr[2], \".\").concat(arr[1], \".\").concat(arr[3], \".\").concat(arr[0]), \"\".concat(arr[2], \".\").concat(arr[3], \".\").concat(arr[0], \".\").concat(arr[1]), \"\".concat(arr[2], \".\").concat(arr[3], \".\").concat(arr[1], \".\").concat(arr[0]), \"\".concat(arr[3], \".\").concat(arr[0], \".\").concat(arr[1], \".\").concat(arr[2]), \"\".concat(arr[3], \".\").concat(arr[0], \".\").concat(arr[2], \".\").concat(arr[1]), \"\".concat(arr[3], \".\").concat(arr[1], \".\").concat(arr[0], \".\").concat(arr[2]), \"\".concat(arr[3], \".\").concat(arr[1], \".\").concat(arr[2], \".\").concat(arr[0]), \"\".concat(arr[3], \".\").concat(arr[2], \".\").concat(arr[0], \".\").concat(arr[1]), \"\".concat(arr[3], \".\").concat(arr[2], \".\").concat(arr[1], \".\").concat(arr[0])];\n }\n}\n\nvar classNameCombinations = {};\n\nfunction getClassNameCombinations(classNames) {\n if (classNames.length === 0 || classNames.length === 1) {\n return classNames;\n }\n\n var key = classNames.join('.');\n\n if (!classNameCombinations[key]) {\n classNameCombinations[key] = powerSetPermutations(classNames);\n }\n\n return classNameCombinations[key];\n}\n\nexport function createStyleObject(classNames) {\n var elementStyle = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : {};\n var stylesheet = arguments.length > 2 ? arguments[2] : undefined;\n var nonTokenClassNames = classNames.filter(function (className) {\n return className !== 'token';\n });\n var classNamesCombinations = getClassNameCombinations(nonTokenClassNames);\n return classNamesCombinations.reduce(function (styleObject, className) {\n return _objectSpread(_objectSpread({}, styleObject), stylesheet[className]);\n }, elementStyle);\n}\nexport function createClassNameString(classNames) {\n return classNames.join(' ');\n}\nexport function createChildren(stylesheet, useInlineStyles, codeBidiWarningConfig) {\n var childrenCount = 0;\n return function (children) {\n childrenCount += 1;\n return children.map(function (child, i) {\n return createElement({\n node: child,\n stylesheet: stylesheet,\n useInlineStyles: useInlineStyles,\n codeBidiWarningConfig: codeBidiWarningConfig,\n key: \"code-segment-\".concat(childrenCount, \"-\").concat(i)\n });\n });\n };\n}\n\nfunction createElement(_ref2) {\n var node = _ref2.node,\n stylesheet = _ref2.stylesheet,\n _ref2$style = _ref2.style,\n style = _ref2$style === void 0 ? {} : _ref2$style,\n useInlineStyles = _ref2.useInlineStyles,\n codeBidiWarningConfig = _ref2.codeBidiWarningConfig,\n key = _ref2.key;\n var properties = node.properties,\n type = node.type,\n TagName = node.tagName,\n value = node.value;\n\n if (type === 'text') {\n // occasionally react-syntax-highlighter passes a numeric value when the\n // type is text\n var textValue = value + '';\n var decorated = codeBidiWarningDecorator(textValue, function (_ref3) {\n var bidiCharacter = _ref3.bidiCharacter,\n index = _ref3.index;\n return /*#__PURE__*/React.createElement(CodeBidiWarning, {\n bidiCharacter: bidiCharacter,\n key: index,\n label: codeBidiWarningConfig.codeBidiWarningLabel,\n tooltipEnabled: codeBidiWarningConfig.codeBidiWarningTooltipEnabled\n });\n });\n return decorated;\n } else if (TagName) {\n var childrenCreator = createChildren(stylesheet, useInlineStyles, codeBidiWarningConfig);\n var props;\n\n if (!useInlineStyles) {\n props = _objectSpread(_objectSpread({}, properties), {}, {\n className: createClassNameString(properties.className)\n });\n } else {\n var allStylesheetSelectors = Object.keys(stylesheet).reduce(function (classes, selector) {\n selector.split('.').forEach(function (className) {\n if (!classes.includes(className)) {\n classes.push(className);\n }\n });\n return classes;\n }, []); // For compatibility with older versions of react-syntax-highlighter\n\n var startingClassName = properties.className && properties.className.includes('token') ? ['token'] : [];\n var className = properties.className && startingClassName.concat(properties.className.filter(function (className) {\n return !allStylesheetSelectors.includes(className);\n }));\n props = _objectSpread(_objectSpread({}, properties), {}, {\n className: createClassNameString(className) || undefined,\n style: createStyleObject(properties.className, Object.assign({}, properties.style, style), stylesheet)\n });\n }\n\n var children = childrenCreator(node.children);\n return /*#__PURE__*/React.createElement(TagName, _extends({\n key: key\n }, props), children);\n }\n}","/** @jsx jsx */\nimport { memo, useCallback, useMemo } from 'react';\nimport { jsx } from '@emotion/core';\nimport { PrismAsync as SyntaxHighlighter } from 'react-syntax-highlighter';\nimport { useGlobalTheme } from '@atlaskit/theme/components';\nimport { useHighlightLines } from './internal/hooks/use-highlight';\nimport { getCodeBlockStyles, getCodeBlockTheme } from './internal/theme/styles';\nimport { normalizeLanguage } from './internal/utils/get-normalized-language';\nimport { createBidiWarningRenderer } from './react-syntax-highlighter-bidi-warning-renderer';\n/**\n * __Code block__\n *\n * A code block highlights an entire block of code and keeps the formatting.\n *\n * - [Examples](https://atlassian.design/components/code/code-block/examples)\n * - [Code](https://atlassian.design/components/code/code-block/code)\n * - [Usage](https://atlassian.design/components/code/code-block/usage)\n */\n\nvar CodeBlock = /*#__PURE__*/memo(function CodeBlock(_ref) {\n var _ref$showLineNumbers = _ref.showLineNumbers,\n showLineNumbers = _ref$showLineNumbers === void 0 ? true : _ref$showLineNumbers,\n _ref$language = _ref.language,\n providedLanguage = _ref$language === void 0 ? 'text' : _ref$language,\n _ref$highlight = _ref.highlight,\n highlight = _ref$highlight === void 0 ? '' : _ref$highlight,\n _ref$highlightedStart = _ref.highlightedStartText,\n highlightedStartText = _ref$highlightedStart === void 0 ? 'Highlight start' : _ref$highlightedStart,\n _ref$highlightedEndTe = _ref.highlightedEndText,\n highlightedEndText = _ref$highlightedEndTe === void 0 ? 'Highlight end' : _ref$highlightedEndTe,\n testId = _ref.testId,\n text = _ref.text,\n _ref$codeBidiWarnings = _ref.codeBidiWarnings,\n codeBidiWarnings = _ref$codeBidiWarnings === void 0 ? true : _ref$codeBidiWarnings,\n codeBidiWarningLabel = _ref.codeBidiWarningLabel,\n _ref$codeBidiWarningT = _ref.codeBidiWarningTooltipEnabled,\n codeBidiWarningTooltipEnabled = _ref$codeBidiWarningT === void 0 ? true : _ref$codeBidiWarningT;\n var numLines = (text || '').split('\\n').length;\n var globalTheme = useGlobalTheme();\n var theme = useMemo(function () {\n return getCodeBlockTheme(globalTheme, numLines);\n }, [globalTheme, numLines]);\n var getStyles = useMemo(function () {\n return getCodeBlockStyles(theme);\n }, [theme]);\n var styles = useMemo(function () {\n return getStyles(highlightedStartText, highlightedEndText, showLineNumbers);\n }, [highlightedStartText, highlightedEndText, showLineNumbers, getStyles]);\n\n var _useHighlightLines = useHighlightLines({\n highlight: highlight,\n testId: testId\n }),\n getHighlightStyles = _useHighlightLines.getHighlightStyles,\n highlightedLines = _useHighlightLines.highlightedLines;\n\n var getLineProps = useCallback(function (line) {\n return getHighlightStyles(line, highlightedLines);\n }, [getHighlightStyles, highlightedLines]);\n var language = useMemo(function () {\n return normalizeLanguage(providedLanguage);\n }, [providedLanguage]); // https://product-fabric.atlassian.net/browse/DST-2472\n\n var languageToUse = text ? language : 'text';\n var renderer = codeBidiWarnings ? createBidiWarningRenderer({\n codeBidiWarningLabel: codeBidiWarningLabel,\n codeBidiWarningTooltipEnabled: codeBidiWarningTooltipEnabled\n }) : undefined;\n return jsx(SyntaxHighlighter, {\n \"data-testid\": testId,\n \"data-code-lang\": language,\n \"data-ds--code--code-block\": \"\",\n css: styles,\n language: languageToUse,\n PreTag: \"span\",\n showLineNumbers: showLineNumbers // Wrap lines is needed to set styles on the line when highlighting.\n ,\n wrapLines: highlight.length > 0 || !!testId,\n lineProps: getLineProps,\n useInlineStyles: false,\n renderer: renderer\n }, text);\n});\nCodeBlock.displayName = 'CodeBlock';\nexport default CodeBlock;","import { jsx, jsxs, Fragment } from 'react/jsx-runtime';\nimport * as React$1 from 'react';\nimport React__default$1, { createContext, useContext, useState, useEffect, useLayoutEffect, useRef, forwardRef, useCallback, useMemo } from 'react';\nimport { unstable_batchedUpdates } from 'react-dom';\n\nfunction bind(fn, thisArg) {\n return function wrap() {\n return fn.apply(thisArg, arguments);\n };\n}\n\n// utils is a library of generic helper functions non-specific to axios\n\nconst {toString} = Object.prototype;\nconst {getPrototypeOf} = Object;\n\nconst kindOf = (cache => thing => {\n const str = toString.call(thing);\n return cache[str] || (cache[str] = str.slice(8, -1).toLowerCase());\n})(Object.create(null));\n\nconst kindOfTest = (type) => {\n type = type.toLowerCase();\n return (thing) => kindOf(thing) === type\n};\n\nconst typeOfTest = type => thing => typeof thing === type;\n\n/**\n * Determine if a value is an Array\n *\n * @param {Object} val The value to test\n *\n * @returns {boolean} True if value is an Array, otherwise false\n */\nconst {isArray: isArray$1} = Array;\n\n/**\n * Determine if a value is undefined\n *\n * @param {*} val The value to test\n *\n * @returns {boolean} True if the value is undefined, otherwise false\n */\nconst isUndefined = typeOfTest('undefined');\n\n/**\n * Determine if a value is a Buffer\n *\n * @param {*} val The value to test\n *\n * @returns {boolean} True if value is a Buffer, otherwise false\n */\nfunction isBuffer(val) {\n return val !== null && !isUndefined(val) && val.constructor !== null && !isUndefined(val.constructor)\n && isFunction$1(val.constructor.isBuffer) && val.constructor.isBuffer(val);\n}\n\n/**\n * Determine if a value is an ArrayBuffer\n *\n * @param {*} val The value to test\n *\n * @returns {boolean} True if value is an ArrayBuffer, otherwise false\n */\nconst isArrayBuffer = kindOfTest('ArrayBuffer');\n\n\n/**\n * Determine if a value is a view on an ArrayBuffer\n *\n * @param {*} val The value to test\n *\n * @returns {boolean} True if value is a view on an ArrayBuffer, otherwise false\n */\nfunction isArrayBufferView(val) {\n let result;\n if ((typeof ArrayBuffer !== 'undefined') && (ArrayBuffer.isView)) {\n result = ArrayBuffer.isView(val);\n } else {\n result = (val) && (val.buffer) && (isArrayBuffer(val.buffer));\n }\n return result;\n}\n\n/**\n * Determine if a value is a String\n *\n * @param {*} val The value to test\n *\n * @returns {boolean} True if value is a String, otherwise false\n */\nconst isString$1 = typeOfTest('string');\n\n/**\n * Determine if a value is a Function\n *\n * @param {*} val The value to test\n * @returns {boolean} True if value is a Function, otherwise false\n */\nconst isFunction$1 = typeOfTest('function');\n\n/**\n * Determine if a value is a Number\n *\n * @param {*} val The value to test\n *\n * @returns {boolean} True if value is a Number, otherwise false\n */\nconst isNumber = typeOfTest('number');\n\n/**\n * Determine if a value is an Object\n *\n * @param {*} thing The value to test\n *\n * @returns {boolean} True if value is an Object, otherwise false\n */\nconst isObject = (thing) => thing !== null && typeof thing === 'object';\n\n/**\n * Determine if a value is a Boolean\n *\n * @param {*} thing The value to test\n * @returns {boolean} True if value is a Boolean, otherwise false\n */\nconst isBoolean = thing => thing === true || thing === false;\n\n/**\n * Determine if a value is a plain Object\n *\n * @param {*} val The value to test\n *\n * @returns {boolean} True if value is a plain Object, otherwise false\n */\nconst isPlainObject = (val) => {\n if (kindOf(val) !== 'object') {\n return false;\n }\n\n const prototype = getPrototypeOf(val);\n return (prototype === null || prototype === Object.prototype || Object.getPrototypeOf(prototype) === null) && !(Symbol.toStringTag in val) && !(Symbol.iterator in val);\n};\n\n/**\n * Determine if a value is a Date\n *\n * @param {*} val The value to test\n *\n * @returns {boolean} True if value is a Date, otherwise false\n */\nconst isDate = kindOfTest('Date');\n\n/**\n * Determine if a value is a File\n *\n * @param {*} val The value to test\n *\n * @returns {boolean} True if value is a File, otherwise false\n */\nconst isFile = kindOfTest('File');\n\n/**\n * Determine if a value is a Blob\n *\n * @param {*} val The value to test\n *\n * @returns {boolean} True if value is a Blob, otherwise false\n */\nconst isBlob = kindOfTest('Blob');\n\n/**\n * Determine if a value is a FileList\n *\n * @param {*} val The value to test\n *\n * @returns {boolean} True if value is a File, otherwise false\n */\nconst isFileList = kindOfTest('FileList');\n\n/**\n * Determine if a value is a Stream\n *\n * @param {*} val The value to test\n *\n * @returns {boolean} True if value is a Stream, otherwise false\n */\nconst isStream = (val) => isObject(val) && isFunction$1(val.pipe);\n\n/**\n * Determine if a value is a FormData\n *\n * @param {*} thing The value to test\n *\n * @returns {boolean} True if value is an FormData, otherwise false\n */\nconst isFormData = (thing) => {\n let kind;\n return thing && (\n (typeof FormData === 'function' && thing instanceof FormData) || (\n isFunction$1(thing.append) && (\n (kind = kindOf(thing)) === 'formdata' ||\n // detect form-data instance\n (kind === 'object' && isFunction$1(thing.toString) && thing.toString() === '[object FormData]')\n )\n )\n )\n};\n\n/**\n * Determine if a value is a URLSearchParams object\n *\n * @param {*} val The value to test\n *\n * @returns {boolean} True if value is a URLSearchParams object, otherwise false\n */\nconst isURLSearchParams = kindOfTest('URLSearchParams');\n\n/**\n * Trim excess whitespace off the beginning and end of a string\n *\n * @param {String} str The String to trim\n *\n * @returns {String} The String freed of excess whitespace\n */\nconst trim = (str) => str.trim ?\n str.trim() : str.replace(/^[\\s\\uFEFF\\xA0]+|[\\s\\uFEFF\\xA0]+$/g, '');\n\n/**\n * Iterate over an Array or an Object invoking a function for each item.\n *\n * If `obj` is an Array callback will be called passing\n * the value, index, and complete array for each item.\n *\n * If 'obj' is an Object callback will be called passing\n * the value, key, and complete object for each property.\n *\n * @param {Object|Array} obj The object to iterate\n * @param {Function} fn The callback to invoke for each item\n *\n * @param {Boolean} [allOwnKeys = false]\n * @returns {any}\n */\nfunction forEach(obj, fn, {allOwnKeys = false} = {}) {\n // Don't bother if no value provided\n if (obj === null || typeof obj === 'undefined') {\n return;\n }\n\n let i;\n let l;\n\n // Force an array if not already something iterable\n if (typeof obj !== 'object') {\n /*eslint no-param-reassign:0*/\n obj = [obj];\n }\n\n if (isArray$1(obj)) {\n // Iterate over array values\n for (i = 0, l = obj.length; i < l; i++) {\n fn.call(null, obj[i], i, obj);\n }\n } else {\n // Iterate over object keys\n const keys = allOwnKeys ? Object.getOwnPropertyNames(obj) : Object.keys(obj);\n const len = keys.length;\n let key;\n\n for (i = 0; i < len; i++) {\n key = keys[i];\n fn.call(null, obj[key], key, obj);\n }\n }\n}\n\nfunction findKey(obj, key) {\n key = key.toLowerCase();\n const keys = Object.keys(obj);\n let i = keys.length;\n let _key;\n while (i-- > 0) {\n _key = keys[i];\n if (key === _key.toLowerCase()) {\n return _key;\n }\n }\n return null;\n}\n\nconst _global = (() => {\n /*eslint no-undef:0*/\n if (typeof globalThis !== \"undefined\") return globalThis;\n return typeof self !== \"undefined\" ? self : (typeof window !== 'undefined' ? window : global)\n})();\n\nconst isContextDefined = (context) => !isUndefined(context) && context !== _global;\n\n/**\n * Accepts varargs expecting each argument to be an object, then\n * immutably merges the properties of each object and returns result.\n *\n * When multiple objects contain the same key the later object in\n * the arguments list will take precedence.\n *\n * Example:\n *\n * ```js\n * var result = merge({foo: 123}, {foo: 456});\n * console.log(result.foo); // outputs 456\n * ```\n *\n * @param {Object} obj1 Object to merge\n *\n * @returns {Object} Result of all merge properties\n */\nfunction merge(/* obj1, obj2, obj3, ... */) {\n const {caseless} = isContextDefined(this) && this || {};\n const result = {};\n const assignValue = (val, key) => {\n const targetKey = caseless && findKey(result, key) || key;\n if (isPlainObject(result[targetKey]) && isPlainObject(val)) {\n result[targetKey] = merge(result[targetKey], val);\n } else if (isPlainObject(val)) {\n result[targetKey] = merge({}, val);\n } else if (isArray$1(val)) {\n result[targetKey] = val.slice();\n } else {\n result[targetKey] = val;\n }\n };\n\n for (let i = 0, l = arguments.length; i < l; i++) {\n arguments[i] && forEach(arguments[i], assignValue);\n }\n return result;\n}\n\n/**\n * Extends object a by mutably adding to it the properties of object b.\n *\n * @param {Object} a The object to be extended\n * @param {Object} b The object to copy properties from\n * @param {Object} thisArg The object to bind function to\n *\n * @param {Boolean} [allOwnKeys]\n * @returns {Object} The resulting value of object a\n */\nconst extend = (a, b, thisArg, {allOwnKeys}= {}) => {\n forEach(b, (val, key) => {\n if (thisArg && isFunction$1(val)) {\n a[key] = bind(val, thisArg);\n } else {\n a[key] = val;\n }\n }, {allOwnKeys});\n return a;\n};\n\n/**\n * Remove byte order marker. This catches EF BB BF (the UTF-8 BOM)\n *\n * @param {string} content with BOM\n *\n * @returns {string} content value without BOM\n */\nconst stripBOM = (content) => {\n if (content.charCodeAt(0) === 0xFEFF) {\n content = content.slice(1);\n }\n return content;\n};\n\n/**\n * Inherit the prototype methods from one constructor into another\n * @param {function} constructor\n * @param {function} superConstructor\n * @param {object} [props]\n * @param {object} [descriptors]\n *\n * @returns {void}\n */\nconst inherits = (constructor, superConstructor, props, descriptors) => {\n constructor.prototype = Object.create(superConstructor.prototype, descriptors);\n constructor.prototype.constructor = constructor;\n Object.defineProperty(constructor, 'super', {\n value: superConstructor.prototype\n });\n props && Object.assign(constructor.prototype, props);\n};\n\n/**\n * Resolve object with deep prototype chain to a flat object\n * @param {Object} sourceObj source object\n * @param {Object} [destObj]\n * @param {Function|Boolean} [filter]\n * @param {Function} [propFilter]\n *\n * @returns {Object}\n */\nconst toFlatObject = (sourceObj, destObj, filter, propFilter) => {\n let props;\n let i;\n let prop;\n const merged = {};\n\n destObj = destObj || {};\n // eslint-disable-next-line no-eq-null,eqeqeq\n if (sourceObj == null) return destObj;\n\n do {\n props = Object.getOwnPropertyNames(sourceObj);\n i = props.length;\n while (i-- > 0) {\n prop = props[i];\n if ((!propFilter || propFilter(prop, sourceObj, destObj)) && !merged[prop]) {\n destObj[prop] = sourceObj[prop];\n merged[prop] = true;\n }\n }\n sourceObj = filter !== false && getPrototypeOf(sourceObj);\n } while (sourceObj && (!filter || filter(sourceObj, destObj)) && sourceObj !== Object.prototype);\n\n return destObj;\n};\n\n/**\n * Determines whether a string ends with the characters of a specified string\n *\n * @param {String} str\n * @param {String} searchString\n * @param {Number} [position= 0]\n *\n * @returns {boolean}\n */\nconst endsWith = (str, searchString, position) => {\n str = String(str);\n if (position === undefined || position > str.length) {\n position = str.length;\n }\n position -= searchString.length;\n const lastIndex = str.indexOf(searchString, position);\n return lastIndex !== -1 && lastIndex === position;\n};\n\n\n/**\n * Returns new array from array like object or null if failed\n *\n * @param {*} [thing]\n *\n * @returns {?Array}\n */\nconst toArray$2 = (thing) => {\n if (!thing) return null;\n if (isArray$1(thing)) return thing;\n let i = thing.length;\n if (!isNumber(i)) return null;\n const arr = new Array(i);\n while (i-- > 0) {\n arr[i] = thing[i];\n }\n return arr;\n};\n\n/**\n * Checking if the Uint8Array exists and if it does, it returns a function that checks if the\n * thing passed in is an instance of Uint8Array\n *\n * @param {TypedArray}\n *\n * @returns {Array}\n */\n// eslint-disable-next-line func-names\nconst isTypedArray = (TypedArray => {\n // eslint-disable-next-line func-names\n return thing => {\n return TypedArray && thing instanceof TypedArray;\n };\n})(typeof Uint8Array !== 'undefined' && getPrototypeOf(Uint8Array));\n\n/**\n * For each entry in the object, call the function with the key and value.\n *\n * @param {Object} obj - The object to iterate over.\n * @param {Function} fn - The function to call for each entry.\n *\n * @returns {void}\n */\nconst forEachEntry = (obj, fn) => {\n const generator = obj && obj[Symbol.iterator];\n\n const iterator = generator.call(obj);\n\n let result;\n\n while ((result = iterator.next()) && !result.done) {\n const pair = result.value;\n fn.call(obj, pair[0], pair[1]);\n }\n};\n\n/**\n * It takes a regular expression and a string, and returns an array of all the matches\n *\n * @param {string} regExp - The regular expression to match against.\n * @param {string} str - The string to search.\n *\n * @returns {Array}\n */\nconst matchAll = (regExp, str) => {\n let matches;\n const arr = [];\n\n while ((matches = regExp.exec(str)) !== null) {\n arr.push(matches);\n }\n\n return arr;\n};\n\n/* Checking if the kindOfTest function returns true when passed an HTMLFormElement. */\nconst isHTMLForm = kindOfTest('HTMLFormElement');\n\nconst toCamelCase = str => {\n return str.toLowerCase().replace(/[-_\\s]([a-z\\d])(\\w*)/g,\n function replacer(m, p1, p2) {\n return p1.toUpperCase() + p2;\n }\n );\n};\n\n/* Creating a function that will check if an object has a property. */\nconst hasOwnProperty$1 = (({hasOwnProperty}) => (obj, prop) => hasOwnProperty.call(obj, prop))(Object.prototype);\n\n/**\n * Determine if a value is a RegExp object\n *\n * @param {*} val The value to test\n *\n * @returns {boolean} True if value is a RegExp object, otherwise false\n */\nconst isRegExp = kindOfTest('RegExp');\n\nconst reduceDescriptors = (obj, reducer) => {\n const descriptors = Object.getOwnPropertyDescriptors(obj);\n const reducedDescriptors = {};\n\n forEach(descriptors, (descriptor, name) => {\n if (reducer(descriptor, name, obj) !== false) {\n reducedDescriptors[name] = descriptor;\n }\n });\n\n Object.defineProperties(obj, reducedDescriptors);\n};\n\n/**\n * Makes all methods read-only\n * @param {Object} obj\n */\n\nconst freezeMethods = (obj) => {\n reduceDescriptors(obj, (descriptor, name) => {\n // skip restricted props in strict mode\n if (isFunction$1(obj) && ['arguments', 'caller', 'callee'].indexOf(name) !== -1) {\n return false;\n }\n\n const value = obj[name];\n\n if (!isFunction$1(value)) return;\n\n descriptor.enumerable = false;\n\n if ('writable' in descriptor) {\n descriptor.writable = false;\n return;\n }\n\n if (!descriptor.set) {\n descriptor.set = () => {\n throw Error('Can not rewrite read-only method \\'' + name + '\\'');\n };\n }\n });\n};\n\nconst toObjectSet = (arrayOrString, delimiter) => {\n const obj = {};\n\n const define = (arr) => {\n arr.forEach(value => {\n obj[value] = true;\n });\n };\n\n isArray$1(arrayOrString) ? define(arrayOrString) : define(String(arrayOrString).split(delimiter));\n\n return obj;\n};\n\nconst noop$1 = () => {};\n\nconst toFiniteNumber = (value, defaultValue) => {\n value = +value;\n return Number.isFinite(value) ? value : defaultValue;\n};\n\nconst ALPHA = 'abcdefghijklmnopqrstuvwxyz';\n\nconst DIGIT = '0123456789';\n\nconst ALPHABET = {\n DIGIT,\n ALPHA,\n ALPHA_DIGIT: ALPHA + ALPHA.toUpperCase() + DIGIT\n};\n\nconst generateString = (size = 16, alphabet = ALPHABET.ALPHA_DIGIT) => {\n let str = '';\n const {length} = alphabet;\n while (size--) {\n str += alphabet[Math.random() * length|0];\n }\n\n return str;\n};\n\n/**\n * If the thing is a FormData object, return true, otherwise return false.\n *\n * @param {unknown} thing - The thing to check.\n *\n * @returns {boolean}\n */\nfunction isSpecCompliantForm(thing) {\n return !!(thing && isFunction$1(thing.append) && thing[Symbol.toStringTag] === 'FormData' && thing[Symbol.iterator]);\n}\n\nconst toJSONObject = (obj) => {\n const stack = new Array(10);\n\n const visit = (source, i) => {\n\n if (isObject(source)) {\n if (stack.indexOf(source) >= 0) {\n return;\n }\n\n if(!('toJSON' in source)) {\n stack[i] = source;\n const target = isArray$1(source) ? [] : {};\n\n forEach(source, (value, key) => {\n const reducedValue = visit(value, i + 1);\n !isUndefined(reducedValue) && (target[key] = reducedValue);\n });\n\n stack[i] = undefined;\n\n return target;\n }\n }\n\n return source;\n };\n\n return visit(obj, 0);\n};\n\nconst isAsyncFn = kindOfTest('AsyncFunction');\n\nconst isThenable = (thing) =>\n thing && (isObject(thing) || isFunction$1(thing)) && isFunction$1(thing.then) && isFunction$1(thing.catch);\n\nvar utils = {\n isArray: isArray$1,\n isArrayBuffer,\n isBuffer,\n isFormData,\n isArrayBufferView,\n isString: isString$1,\n isNumber,\n isBoolean,\n isObject,\n isPlainObject,\n isUndefined,\n isDate,\n isFile,\n isBlob,\n isRegExp,\n isFunction: isFunction$1,\n isStream,\n isURLSearchParams,\n isTypedArray,\n isFileList,\n forEach,\n merge,\n extend,\n trim,\n stripBOM,\n inherits,\n toFlatObject,\n kindOf,\n kindOfTest,\n endsWith,\n toArray: toArray$2,\n forEachEntry,\n matchAll,\n isHTMLForm,\n hasOwnProperty: hasOwnProperty$1,\n hasOwnProp: hasOwnProperty$1, // an alias to avoid ESLint no-prototype-builtins detection\n reduceDescriptors,\n freezeMethods,\n toObjectSet,\n toCamelCase,\n noop: noop$1,\n toFiniteNumber,\n findKey,\n global: _global,\n isContextDefined,\n ALPHABET,\n generateString,\n isSpecCompliantForm,\n toJSONObject,\n isAsyncFn,\n isThenable\n};\n\n/**\n * Create an Error with the specified message, config, error code, request and response.\n *\n * @param {string} message The error message.\n * @param {string} [code] The error code (for example, 'ECONNABORTED').\n * @param {Object} [config] The config.\n * @param {Object} [request] The request.\n * @param {Object} [response] The response.\n *\n * @returns {Error} The created error.\n */\nfunction AxiosError(message, code, config, request, response) {\n Error.call(this);\n\n if (Error.captureStackTrace) {\n Error.captureStackTrace(this, this.constructor);\n } else {\n this.stack = (new Error()).stack;\n }\n\n this.message = message;\n this.name = 'AxiosError';\n code && (this.code = code);\n config && (this.config = config);\n request && (this.request = request);\n response && (this.response = response);\n}\n\nutils.inherits(AxiosError, Error, {\n toJSON: function toJSON() {\n return {\n // Standard\n message: this.message,\n name: this.name,\n // Microsoft\n description: this.description,\n number: this.number,\n // Mozilla\n fileName: this.fileName,\n lineNumber: this.lineNumber,\n columnNumber: this.columnNumber,\n stack: this.stack,\n // Axios\n config: utils.toJSONObject(this.config),\n code: this.code,\n status: this.response && this.response.status ? this.response.status : null\n };\n }\n});\n\nconst prototype$1 = AxiosError.prototype;\nconst descriptors = {};\n\n[\n 'ERR_BAD_OPTION_VALUE',\n 'ERR_BAD_OPTION',\n 'ECONNABORTED',\n 'ETIMEDOUT',\n 'ERR_NETWORK',\n 'ERR_FR_TOO_MANY_REDIRECTS',\n 'ERR_DEPRECATED',\n 'ERR_BAD_RESPONSE',\n 'ERR_BAD_REQUEST',\n 'ERR_CANCELED',\n 'ERR_NOT_SUPPORT',\n 'ERR_INVALID_URL'\n// eslint-disable-next-line func-names\n].forEach(code => {\n descriptors[code] = {value: code};\n});\n\nObject.defineProperties(AxiosError, descriptors);\nObject.defineProperty(prototype$1, 'isAxiosError', {value: true});\n\n// eslint-disable-next-line func-names\nAxiosError.from = (error, code, config, request, response, customProps) => {\n const axiosError = Object.create(prototype$1);\n\n utils.toFlatObject(error, axiosError, function filter(obj) {\n return obj !== Error.prototype;\n }, prop => {\n return prop !== 'isAxiosError';\n });\n\n AxiosError.call(axiosError, error.message, code, config, request, response);\n\n axiosError.cause = error;\n\n axiosError.name = error.name;\n\n customProps && Object.assign(axiosError, customProps);\n\n return axiosError;\n};\n\n// eslint-disable-next-line strict\nvar httpAdapter = null;\n\n/**\n * Determines if the given thing is a array or js object.\n *\n * @param {string} thing - The object or array to be visited.\n *\n * @returns {boolean}\n */\nfunction isVisitable(thing) {\n return utils.isPlainObject(thing) || utils.isArray(thing);\n}\n\n/**\n * It removes the brackets from the end of a string\n *\n * @param {string} key - The key of the parameter.\n *\n * @returns {string} the key without the brackets.\n */\nfunction removeBrackets(key) {\n return utils.endsWith(key, '[]') ? key.slice(0, -2) : key;\n}\n\n/**\n * It takes a path, a key, and a boolean, and returns a string\n *\n * @param {string} path - The path to the current key.\n * @param {string} key - The key of the current object being iterated over.\n * @param {string} dots - If true, the key will be rendered with dots instead of brackets.\n *\n * @returns {string} The path to the current key.\n */\nfunction renderKey(path, key, dots) {\n if (!path) return key;\n return path.concat(key).map(function each(token, i) {\n // eslint-disable-next-line no-param-reassign\n token = removeBrackets(token);\n return !dots && i ? '[' + token + ']' : token;\n }).join(dots ? '.' : '');\n}\n\n/**\n * If the array is an array and none of its elements are visitable, then it's a flat array.\n *\n * @param {Array} arr - The array to check\n *\n * @returns {boolean}\n */\nfunction isFlatArray(arr) {\n return utils.isArray(arr) && !arr.some(isVisitable);\n}\n\nconst predicates = utils.toFlatObject(utils, {}, null, function filter(prop) {\n return /^is[A-Z]/.test(prop);\n});\n\n/**\n * Convert a data object to FormData\n *\n * @param {Object} obj\n * @param {?Object} [formData]\n * @param {?Object} [options]\n * @param {Function} [options.visitor]\n * @param {Boolean} [options.metaTokens = true]\n * @param {Boolean} [options.dots = false]\n * @param {?Boolean} [options.indexes = false]\n *\n * @returns {Object}\n **/\n\n/**\n * It converts an object into a FormData object\n *\n * @param {Object} obj - The object to convert to form data.\n * @param {string} formData - The FormData object to append to.\n * @param {Object} options\n *\n * @returns\n */\nfunction toFormData(obj, formData, options) {\n if (!utils.isObject(obj)) {\n throw new TypeError('target must be an object');\n }\n\n // eslint-disable-next-line no-param-reassign\n formData = formData || new (FormData)();\n\n // eslint-disable-next-line no-param-reassign\n options = utils.toFlatObject(options, {\n metaTokens: true,\n dots: false,\n indexes: false\n }, false, function defined(option, source) {\n // eslint-disable-next-line no-eq-null,eqeqeq\n return !utils.isUndefined(source[option]);\n });\n\n const metaTokens = options.metaTokens;\n // eslint-disable-next-line no-use-before-define\n const visitor = options.visitor || defaultVisitor;\n const dots = options.dots;\n const indexes = options.indexes;\n const _Blob = options.Blob || typeof Blob !== 'undefined' && Blob;\n const useBlob = _Blob && utils.isSpecCompliantForm(formData);\n\n if (!utils.isFunction(visitor)) {\n throw new TypeError('visitor must be a function');\n }\n\n function convertValue(value) {\n if (value === null) return '';\n\n if (utils.isDate(value)) {\n return value.toISOString();\n }\n\n if (!useBlob && utils.isBlob(value)) {\n throw new AxiosError('Blob is not supported. Use a Buffer instead.');\n }\n\n if (utils.isArrayBuffer(value) || utils.isTypedArray(value)) {\n return useBlob && typeof Blob === 'function' ? new Blob([value]) : Buffer.from(value);\n }\n\n return value;\n }\n\n /**\n * Default visitor.\n *\n * @param {*} value\n * @param {String|Number} key\n * @param {Array} path\n * @this {FormData}\n *\n * @returns {boolean} return true to visit the each prop of the value recursively\n */\n function defaultVisitor(value, key, path) {\n let arr = value;\n\n if (value && !path && typeof value === 'object') {\n if (utils.endsWith(key, '{}')) {\n // eslint-disable-next-line no-param-reassign\n key = metaTokens ? key : key.slice(0, -2);\n // eslint-disable-next-line no-param-reassign\n value = JSON.stringify(value);\n } else if (\n (utils.isArray(value) && isFlatArray(value)) ||\n ((utils.isFileList(value) || utils.endsWith(key, '[]')) && (arr = utils.toArray(value))\n )) {\n // eslint-disable-next-line no-param-reassign\n key = removeBrackets(key);\n\n arr.forEach(function each(el, index) {\n !(utils.isUndefined(el) || el === null) && formData.append(\n // eslint-disable-next-line no-nested-ternary\n indexes === true ? renderKey([key], index, dots) : (indexes === null ? key : key + '[]'),\n convertValue(el)\n );\n });\n return false;\n }\n }\n\n if (isVisitable(value)) {\n return true;\n }\n\n formData.append(renderKey(path, key, dots), convertValue(value));\n\n return false;\n }\n\n const stack = [];\n\n const exposedHelpers = Object.assign(predicates, {\n defaultVisitor,\n convertValue,\n isVisitable\n });\n\n function build(value, path) {\n if (utils.isUndefined(value)) return;\n\n if (stack.indexOf(value) !== -1) {\n throw Error('Circular reference detected in ' + path.join('.'));\n }\n\n stack.push(value);\n\n utils.forEach(value, function each(el, key) {\n const result = !(utils.isUndefined(el) || el === null) && visitor.call(\n formData, el, utils.isString(key) ? key.trim() : key, path, exposedHelpers\n );\n\n if (result === true) {\n build(el, path ? path.concat(key) : [key]);\n }\n });\n\n stack.pop();\n }\n\n if (!utils.isObject(obj)) {\n throw new TypeError('data must be an object');\n }\n\n build(obj);\n\n return formData;\n}\n\n/**\n * It encodes a string by replacing all characters that are not in the unreserved set with\n * their percent-encoded equivalents\n *\n * @param {string} str - The string to encode.\n *\n * @returns {string} The encoded string.\n */\nfunction encode$1(str) {\n const charMap = {\n '!': '%21',\n \"'\": '%27',\n '(': '%28',\n ')': '%29',\n '~': '%7E',\n '%20': '+',\n '%00': '\\x00'\n };\n return encodeURIComponent(str).replace(/[!'()~]|%20|%00/g, function replacer(match) {\n return charMap[match];\n });\n}\n\n/**\n * It takes a params object and converts it to a FormData object\n *\n * @param {Object} params - The parameters to be converted to a FormData object.\n * @param {Object} options - The options object passed to the Axios constructor.\n *\n * @returns {void}\n */\nfunction AxiosURLSearchParams(params, options) {\n this._pairs = [];\n\n params && toFormData(params, this, options);\n}\n\nconst prototype = AxiosURLSearchParams.prototype;\n\nprototype.append = function append(name, value) {\n this._pairs.push([name, value]);\n};\n\nprototype.toString = function toString(encoder) {\n const _encode = encoder ? function(value) {\n return encoder.call(this, value, encode$1);\n } : encode$1;\n\n return this._pairs.map(function each(pair) {\n return _encode(pair[0]) + '=' + _encode(pair[1]);\n }, '').join('&');\n};\n\n/**\n * It replaces all instances of the characters `:`, `$`, `,`, `+`, `[`, and `]` with their\n * URI encoded counterparts\n *\n * @param {string} val The value to be encoded.\n *\n * @returns {string} The encoded value.\n */\nfunction encode(val) {\n return encodeURIComponent(val).\n replace(/%3A/gi, ':').\n replace(/%24/g, '$').\n replace(/%2C/gi, ',').\n replace(/%20/g, '+').\n replace(/%5B/gi, '[').\n replace(/%5D/gi, ']');\n}\n\n/**\n * Build a URL by appending params to the end\n *\n * @param {string} url The base of the url (e.g., http://www.google.com)\n * @param {object} [params] The params to be appended\n * @param {?object} options\n *\n * @returns {string} The formatted url\n */\nfunction buildURL(url, params, options) {\n /*eslint no-param-reassign:0*/\n if (!params) {\n return url;\n }\n \n const _encode = options && options.encode || encode;\n\n const serializeFn = options && options.serialize;\n\n let serializedParams;\n\n if (serializeFn) {\n serializedParams = serializeFn(params, options);\n } else {\n serializedParams = utils.isURLSearchParams(params) ?\n params.toString() :\n new AxiosURLSearchParams(params, options).toString(_encode);\n }\n\n if (serializedParams) {\n const hashmarkIndex = url.indexOf(\"#\");\n\n if (hashmarkIndex !== -1) {\n url = url.slice(0, hashmarkIndex);\n }\n url += (url.indexOf('?') === -1 ? '?' : '&') + serializedParams;\n }\n\n return url;\n}\n\nclass InterceptorManager {\n constructor() {\n this.handlers = [];\n }\n\n /**\n * Add a new interceptor to the stack\n *\n * @param {Function} fulfilled The function to handle `then` for a `Promise`\n * @param {Function} rejected The function to handle `reject` for a `Promise`\n *\n * @return {Number} An ID used to remove interceptor later\n */\n use(fulfilled, rejected, options) {\n this.handlers.push({\n fulfilled,\n rejected,\n synchronous: options ? options.synchronous : false,\n runWhen: options ? options.runWhen : null\n });\n return this.handlers.length - 1;\n }\n\n /**\n * Remove an interceptor from the stack\n *\n * @param {Number} id The ID that was returned by `use`\n *\n * @returns {Boolean} `true` if the interceptor was removed, `false` otherwise\n */\n eject(id) {\n if (this.handlers[id]) {\n this.handlers[id] = null;\n }\n }\n\n /**\n * Clear all interceptors from the stack\n *\n * @returns {void}\n */\n clear() {\n if (this.handlers) {\n this.handlers = [];\n }\n }\n\n /**\n * Iterate over all the registered interceptors\n *\n * This method is particularly useful for skipping over any\n * interceptors that may have become `null` calling `eject`.\n *\n * @param {Function} fn The function to call for each interceptor\n *\n * @returns {void}\n */\n forEach(fn) {\n utils.forEach(this.handlers, function forEachHandler(h) {\n if (h !== null) {\n fn(h);\n }\n });\n }\n}\n\nvar InterceptorManager$1 = InterceptorManager;\n\nvar transitionalDefaults = {\n silentJSONParsing: true,\n forcedJSONParsing: true,\n clarifyTimeoutError: false\n};\n\nvar URLSearchParams$1 = typeof URLSearchParams !== 'undefined' ? URLSearchParams : AxiosURLSearchParams;\n\nvar FormData$1 = typeof FormData !== 'undefined' ? FormData : null;\n\nvar Blob$1 = typeof Blob !== 'undefined' ? Blob : null;\n\n/**\n * Determine if we're running in a standard browser environment\n *\n * This allows axios to run in a web worker, and react-native.\n * Both environments support XMLHttpRequest, but not fully standard globals.\n *\n * web workers:\n * typeof window -> undefined\n * typeof document -> undefined\n *\n * react-native:\n * navigator.product -> 'ReactNative'\n * nativescript\n * navigator.product -> 'NativeScript' or 'NS'\n *\n * @returns {boolean}\n */\nconst isStandardBrowserEnv = (() => {\n let product;\n if (typeof navigator !== 'undefined' && (\n (product = navigator.product) === 'ReactNative' ||\n product === 'NativeScript' ||\n product === 'NS')\n ) {\n return false;\n }\n\n return typeof window !== 'undefined' && typeof document !== 'undefined';\n})();\n\n/**\n * Determine if we're running in a standard browser webWorker environment\n *\n * Although the `isStandardBrowserEnv` method indicates that\n * `allows axios to run in a web worker`, the WebWorker will still be\n * filtered out due to its judgment standard\n * `typeof window !== 'undefined' && typeof document !== 'undefined'`.\n * This leads to a problem when axios post `FormData` in webWorker\n */\n const isStandardBrowserWebWorkerEnv = (() => {\n return (\n typeof WorkerGlobalScope !== 'undefined' &&\n // eslint-disable-next-line no-undef\n self instanceof WorkerGlobalScope &&\n typeof self.importScripts === 'function'\n );\n})();\n\n\nvar platform = {\n isBrowser: true,\n classes: {\n URLSearchParams: URLSearchParams$1,\n FormData: FormData$1,\n Blob: Blob$1\n },\n isStandardBrowserEnv,\n isStandardBrowserWebWorkerEnv,\n protocols: ['http', 'https', 'file', 'blob', 'url', 'data']\n};\n\nfunction toURLEncodedForm(data, options) {\n return toFormData(data, new platform.classes.URLSearchParams(), Object.assign({\n visitor: function(value, key, path, helpers) {\n\n return helpers.defaultVisitor.apply(this, arguments);\n }\n }, options));\n}\n\n/**\n * It takes a string like `foo[x][y][z]` and returns an array like `['foo', 'x', 'y', 'z']\n *\n * @param {string} name - The name of the property to get.\n *\n * @returns An array of strings.\n */\nfunction parsePropPath(name) {\n // foo[x][y][z]\n // foo.x.y.z\n // foo-x-y-z\n // foo x y z\n return utils.matchAll(/\\w+|\\[(\\w*)]/g, name).map(match => {\n return match[0] === '[]' ? '' : match[1] || match[0];\n });\n}\n\n/**\n * Convert an array to an object.\n *\n * @param {Array} arr - The array to convert to an object.\n *\n * @returns An object with the same keys and values as the array.\n */\nfunction arrayToObject(arr) {\n const obj = {};\n const keys = Object.keys(arr);\n let i;\n const len = keys.length;\n let key;\n for (i = 0; i < len; i++) {\n key = keys[i];\n obj[key] = arr[key];\n }\n return obj;\n}\n\n/**\n * It takes a FormData object and returns a JavaScript object\n *\n * @param {string} formData The FormData object to convert to JSON.\n *\n * @returns {Object | null} The converted object.\n */\nfunction formDataToJSON(formData) {\n function buildPath(path, value, target, index) {\n let name = path[index++];\n const isNumericKey = Number.isFinite(+name);\n const isLast = index >= path.length;\n name = !name && utils.isArray(target) ? target.length : name;\n\n if (isLast) {\n if (utils.hasOwnProp(target, name)) {\n target[name] = [target[name], value];\n } else {\n target[name] = value;\n }\n\n return !isNumericKey;\n }\n\n if (!target[name] || !utils.isObject(target[name])) {\n target[name] = [];\n }\n\n const result = buildPath(path, value, target[name], index);\n\n if (result && utils.isArray(target[name])) {\n target[name] = arrayToObject(target[name]);\n }\n\n return !isNumericKey;\n }\n\n if (utils.isFormData(formData) && utils.isFunction(formData.entries)) {\n const obj = {};\n\n utils.forEachEntry(formData, (name, value) => {\n buildPath(parsePropPath(name), value, obj, 0);\n });\n\n return obj;\n }\n\n return null;\n}\n\nconst DEFAULT_CONTENT_TYPE = {\n 'Content-Type': undefined\n};\n\n/**\n * It takes a string, tries to parse it, and if it fails, it returns the stringified version\n * of the input\n *\n * @param {any} rawValue - The value to be stringified.\n * @param {Function} parser - A function that parses a string into a JavaScript object.\n * @param {Function} encoder - A function that takes a value and returns a string.\n *\n * @returns {string} A stringified version of the rawValue.\n */\nfunction stringifySafely(rawValue, parser, encoder) {\n if (utils.isString(rawValue)) {\n try {\n (parser || JSON.parse)(rawValue);\n return utils.trim(rawValue);\n } catch (e) {\n if (e.name !== 'SyntaxError') {\n throw e;\n }\n }\n }\n\n return (encoder || JSON.stringify)(rawValue);\n}\n\nconst defaults$1 = {\n\n transitional: transitionalDefaults,\n\n adapter: ['xhr', 'http'],\n\n transformRequest: [function transformRequest(data, headers) {\n const contentType = headers.getContentType() || '';\n const hasJSONContentType = contentType.indexOf('application/json') > -1;\n const isObjectPayload = utils.isObject(data);\n\n if (isObjectPayload && utils.isHTMLForm(data)) {\n data = new FormData(data);\n }\n\n const isFormData = utils.isFormData(data);\n\n if (isFormData) {\n if (!hasJSONContentType) {\n return data;\n }\n return hasJSONContentType ? JSON.stringify(formDataToJSON(data)) : data;\n }\n\n if (utils.isArrayBuffer(data) ||\n utils.isBuffer(data) ||\n utils.isStream(data) ||\n utils.isFile(data) ||\n utils.isBlob(data)\n ) {\n return data;\n }\n if (utils.isArrayBufferView(data)) {\n return data.buffer;\n }\n if (utils.isURLSearchParams(data)) {\n headers.setContentType('application/x-www-form-urlencoded;charset=utf-8', false);\n return data.toString();\n }\n\n let isFileList;\n\n if (isObjectPayload) {\n if (contentType.indexOf('application/x-www-form-urlencoded') > -1) {\n return toURLEncodedForm(data, this.formSerializer).toString();\n }\n\n if ((isFileList = utils.isFileList(data)) || contentType.indexOf('multipart/form-data') > -1) {\n const _FormData = this.env && this.env.FormData;\n\n return toFormData(\n isFileList ? {'files[]': data} : data,\n _FormData && new _FormData(),\n this.formSerializer\n );\n }\n }\n\n if (isObjectPayload || hasJSONContentType ) {\n headers.setContentType('application/json', false);\n return stringifySafely(data);\n }\n\n return data;\n }],\n\n transformResponse: [function transformResponse(data) {\n const transitional = this.transitional || defaults$1.transitional;\n const forcedJSONParsing = transitional && transitional.forcedJSONParsing;\n const JSONRequested = this.responseType === 'json';\n\n if (data && utils.isString(data) && ((forcedJSONParsing && !this.responseType) || JSONRequested)) {\n const silentJSONParsing = transitional && transitional.silentJSONParsing;\n const strictJSONParsing = !silentJSONParsing && JSONRequested;\n\n try {\n return JSON.parse(data);\n } catch (e) {\n if (strictJSONParsing) {\n if (e.name === 'SyntaxError') {\n throw AxiosError.from(e, AxiosError.ERR_BAD_RESPONSE, this, null, this.response);\n }\n throw e;\n }\n }\n }\n\n return data;\n }],\n\n /**\n * A timeout in milliseconds to abort a request. If set to 0 (default) a\n * timeout is not created.\n */\n timeout: 0,\n\n xsrfCookieName: 'XSRF-TOKEN',\n xsrfHeaderName: 'X-XSRF-TOKEN',\n\n maxContentLength: -1,\n maxBodyLength: -1,\n\n env: {\n FormData: platform.classes.FormData,\n Blob: platform.classes.Blob\n },\n\n validateStatus: function validateStatus(status) {\n return status >= 200 && status < 300;\n },\n\n headers: {\n common: {\n 'Accept': 'application/json, text/plain, */*'\n }\n }\n};\n\nutils.forEach(['delete', 'get', 'head'], function forEachMethodNoData(method) {\n defaults$1.headers[method] = {};\n});\n\nutils.forEach(['post', 'put', 'patch'], function forEachMethodWithData(method) {\n defaults$1.headers[method] = utils.merge(DEFAULT_CONTENT_TYPE);\n});\n\nvar defaults$2 = defaults$1;\n\n// RawAxiosHeaders whose duplicates are ignored by node\n// c.f. https://nodejs.org/api/http.html#http_message_headers\nconst ignoreDuplicateOf = utils.toObjectSet([\n 'age', 'authorization', 'content-length', 'content-type', 'etag',\n 'expires', 'from', 'host', 'if-modified-since', 'if-unmodified-since',\n 'last-modified', 'location', 'max-forwards', 'proxy-authorization',\n 'referer', 'retry-after', 'user-agent'\n]);\n\n/**\n * Parse headers into an object\n *\n * ```\n * Date: Wed, 27 Aug 2014 08:58:49 GMT\n * Content-Type: application/json\n * Connection: keep-alive\n * Transfer-Encoding: chunked\n * ```\n *\n * @param {String} rawHeaders Headers needing to be parsed\n *\n * @returns {Object} Headers parsed into an object\n */\nvar parseHeaders = rawHeaders => {\n const parsed = {};\n let key;\n let val;\n let i;\n\n rawHeaders && rawHeaders.split('\\n').forEach(function parser(line) {\n i = line.indexOf(':');\n key = line.substring(0, i).trim().toLowerCase();\n val = line.substring(i + 1).trim();\n\n if (!key || (parsed[key] && ignoreDuplicateOf[key])) {\n return;\n }\n\n if (key === 'set-cookie') {\n if (parsed[key]) {\n parsed[key].push(val);\n } else {\n parsed[key] = [val];\n }\n } else {\n parsed[key] = parsed[key] ? parsed[key] + ', ' + val : val;\n }\n });\n\n return parsed;\n};\n\nconst $internals = Symbol('internals');\n\nfunction normalizeHeader(header) {\n return header && String(header).trim().toLowerCase();\n}\n\nfunction normalizeValue(value) {\n if (value === false || value == null) {\n return value;\n }\n\n return utils.isArray(value) ? value.map(normalizeValue) : String(value);\n}\n\nfunction parseTokens(str) {\n const tokens = Object.create(null);\n const tokensRE = /([^\\s,;=]+)\\s*(?:=\\s*([^,;]+))?/g;\n let match;\n\n while ((match = tokensRE.exec(str))) {\n tokens[match[1]] = match[2];\n }\n\n return tokens;\n}\n\nconst isValidHeaderName = (str) => /^[-_a-zA-Z0-9^`|~,!#$%&'*+.]+$/.test(str.trim());\n\nfunction matchHeaderValue(context, value, header, filter, isHeaderNameFilter) {\n if (utils.isFunction(filter)) {\n return filter.call(this, value, header);\n }\n\n if (isHeaderNameFilter) {\n value = header;\n }\n\n if (!utils.isString(value)) return;\n\n if (utils.isString(filter)) {\n return value.indexOf(filter) !== -1;\n }\n\n if (utils.isRegExp(filter)) {\n return filter.test(value);\n }\n}\n\nfunction formatHeader(header) {\n return header.trim()\n .toLowerCase().replace(/([a-z\\d])(\\w*)/g, (w, char, str) => {\n return char.toUpperCase() + str;\n });\n}\n\nfunction buildAccessors(obj, header) {\n const accessorName = utils.toCamelCase(' ' + header);\n\n ['get', 'set', 'has'].forEach(methodName => {\n Object.defineProperty(obj, methodName + accessorName, {\n value: function(arg1, arg2, arg3) {\n return this[methodName].call(this, header, arg1, arg2, arg3);\n },\n configurable: true\n });\n });\n}\n\nclass AxiosHeaders {\n constructor(headers) {\n headers && this.set(headers);\n }\n\n set(header, valueOrRewrite, rewrite) {\n const self = this;\n\n function setHeader(_value, _header, _rewrite) {\n const lHeader = normalizeHeader(_header);\n\n if (!lHeader) {\n throw new Error('header name must be a non-empty string');\n }\n\n const key = utils.findKey(self, lHeader);\n\n if(!key || self[key] === undefined || _rewrite === true || (_rewrite === undefined && self[key] !== false)) {\n self[key || _header] = normalizeValue(_value);\n }\n }\n\n const setHeaders = (headers, _rewrite) =>\n utils.forEach(headers, (_value, _header) => setHeader(_value, _header, _rewrite));\n\n if (utils.isPlainObject(header) || header instanceof this.constructor) {\n setHeaders(header, valueOrRewrite);\n } else if(utils.isString(header) && (header = header.trim()) && !isValidHeaderName(header)) {\n setHeaders(parseHeaders(header), valueOrRewrite);\n } else {\n header != null && setHeader(valueOrRewrite, header, rewrite);\n }\n\n return this;\n }\n\n get(header, parser) {\n header = normalizeHeader(header);\n\n if (header) {\n const key = utils.findKey(this, header);\n\n if (key) {\n const value = this[key];\n\n if (!parser) {\n return value;\n }\n\n if (parser === true) {\n return parseTokens(value);\n }\n\n if (utils.isFunction(parser)) {\n return parser.call(this, value, key);\n }\n\n if (utils.isRegExp(parser)) {\n return parser.exec(value);\n }\n\n throw new TypeError('parser must be boolean|regexp|function');\n }\n }\n }\n\n has(header, matcher) {\n header = normalizeHeader(header);\n\n if (header) {\n const key = utils.findKey(this, header);\n\n return !!(key && this[key] !== undefined && (!matcher || matchHeaderValue(this, this[key], key, matcher)));\n }\n\n return false;\n }\n\n delete(header, matcher) {\n const self = this;\n let deleted = false;\n\n function deleteHeader(_header) {\n _header = normalizeHeader(_header);\n\n if (_header) {\n const key = utils.findKey(self, _header);\n\n if (key && (!matcher || matchHeaderValue(self, self[key], key, matcher))) {\n delete self[key];\n\n deleted = true;\n }\n }\n }\n\n if (utils.isArray(header)) {\n header.forEach(deleteHeader);\n } else {\n deleteHeader(header);\n }\n\n return deleted;\n }\n\n clear(matcher) {\n const keys = Object.keys(this);\n let i = keys.length;\n let deleted = false;\n\n while (i--) {\n const key = keys[i];\n if(!matcher || matchHeaderValue(this, this[key], key, matcher, true)) {\n delete this[key];\n deleted = true;\n }\n }\n\n return deleted;\n }\n\n normalize(format) {\n const self = this;\n const headers = {};\n\n utils.forEach(this, (value, header) => {\n const key = utils.findKey(headers, header);\n\n if (key) {\n self[key] = normalizeValue(value);\n delete self[header];\n return;\n }\n\n const normalized = format ? formatHeader(header) : String(header).trim();\n\n if (normalized !== header) {\n delete self[header];\n }\n\n self[normalized] = normalizeValue(value);\n\n headers[normalized] = true;\n });\n\n return this;\n }\n\n concat(...targets) {\n return this.constructor.concat(this, ...targets);\n }\n\n toJSON(asStrings) {\n const obj = Object.create(null);\n\n utils.forEach(this, (value, header) => {\n value != null && value !== false && (obj[header] = asStrings && utils.isArray(value) ? value.join(', ') : value);\n });\n\n return obj;\n }\n\n [Symbol.iterator]() {\n return Object.entries(this.toJSON())[Symbol.iterator]();\n }\n\n toString() {\n return Object.entries(this.toJSON()).map(([header, value]) => header + ': ' + value).join('\\n');\n }\n\n get [Symbol.toStringTag]() {\n return 'AxiosHeaders';\n }\n\n static from(thing) {\n return thing instanceof this ? thing : new this(thing);\n }\n\n static concat(first, ...targets) {\n const computed = new this(first);\n\n targets.forEach((target) => computed.set(target));\n\n return computed;\n }\n\n static accessor(header) {\n const internals = this[$internals] = (this[$internals] = {\n accessors: {}\n });\n\n const accessors = internals.accessors;\n const prototype = this.prototype;\n\n function defineAccessor(_header) {\n const lHeader = normalizeHeader(_header);\n\n if (!accessors[lHeader]) {\n buildAccessors(prototype, _header);\n accessors[lHeader] = true;\n }\n }\n\n utils.isArray(header) ? header.forEach(defineAccessor) : defineAccessor(header);\n\n return this;\n }\n}\n\nAxiosHeaders.accessor(['Content-Type', 'Content-Length', 'Accept', 'Accept-Encoding', 'User-Agent', 'Authorization']);\n\nutils.freezeMethods(AxiosHeaders.prototype);\nutils.freezeMethods(AxiosHeaders);\n\nvar AxiosHeaders$1 = AxiosHeaders;\n\n/**\n * Transform the data for a request or a response\n *\n * @param {Array|Function} fns A single function or Array of functions\n * @param {?Object} response The response object\n *\n * @returns {*} The resulting transformed data\n */\nfunction transformData(fns, response) {\n const config = this || defaults$2;\n const context = response || config;\n const headers = AxiosHeaders$1.from(context.headers);\n let data = context.data;\n\n utils.forEach(fns, function transform(fn) {\n data = fn.call(config, data, headers.normalize(), response ? response.status : undefined);\n });\n\n headers.normalize();\n\n return data;\n}\n\nfunction isCancel(value) {\n return !!(value && value.__CANCEL__);\n}\n\n/**\n * A `CanceledError` is an object that is thrown when an operation is canceled.\n *\n * @param {string=} message The message.\n * @param {Object=} config The config.\n * @param {Object=} request The request.\n *\n * @returns {CanceledError} The created error.\n */\nfunction CanceledError(message, config, request) {\n // eslint-disable-next-line no-eq-null,eqeqeq\n AxiosError.call(this, message == null ? 'canceled' : message, AxiosError.ERR_CANCELED, config, request);\n this.name = 'CanceledError';\n}\n\nutils.inherits(CanceledError, AxiosError, {\n __CANCEL__: true\n});\n\n/**\n * Resolve or reject a Promise based on response status.\n *\n * @param {Function} resolve A function that resolves the promise.\n * @param {Function} reject A function that rejects the promise.\n * @param {object} response The response.\n *\n * @returns {object} The response.\n */\nfunction settle(resolve, reject, response) {\n const validateStatus = response.config.validateStatus;\n if (!response.status || !validateStatus || validateStatus(response.status)) {\n resolve(response);\n } else {\n reject(new AxiosError(\n 'Request failed with status code ' + response.status,\n [AxiosError.ERR_BAD_REQUEST, AxiosError.ERR_BAD_RESPONSE][Math.floor(response.status / 100) - 4],\n response.config,\n response.request,\n response\n ));\n }\n}\n\nvar cookies = platform.isStandardBrowserEnv ?\n\n// Standard browser envs support document.cookie\n (function standardBrowserEnv() {\n return {\n write: function write(name, value, expires, path, domain, secure) {\n const cookie = [];\n cookie.push(name + '=' + encodeURIComponent(value));\n\n if (utils.isNumber(expires)) {\n cookie.push('expires=' + new Date(expires).toGMTString());\n }\n\n if (utils.isString(path)) {\n cookie.push('path=' + path);\n }\n\n if (utils.isString(domain)) {\n cookie.push('domain=' + domain);\n }\n\n if (secure === true) {\n cookie.push('secure');\n }\n\n document.cookie = cookie.join('; ');\n },\n\n read: function read(name) {\n const match = document.cookie.match(new RegExp('(^|;\\\\s*)(' + name + ')=([^;]*)'));\n return (match ? decodeURIComponent(match[3]) : null);\n },\n\n remove: function remove(name) {\n this.write(name, '', Date.now() - 86400000);\n }\n };\n })() :\n\n// Non standard browser env (web workers, react-native) lack needed support.\n (function nonStandardBrowserEnv() {\n return {\n write: function write() {},\n read: function read() { return null; },\n remove: function remove() {}\n };\n })();\n\n/**\n * Determines whether the specified URL is absolute\n *\n * @param {string} url The URL to test\n *\n * @returns {boolean} True if the specified URL is absolute, otherwise false\n */\nfunction isAbsoluteURL(url) {\n // A URL is considered absolute if it begins with \"://\" or \"//\" (protocol-relative URL).\n // RFC 3986 defines scheme name as a sequence of characters beginning with a letter and followed\n // by any combination of letters, digits, plus, period, or hyphen.\n return /^([a-z][a-z\\d+\\-.]*:)?\\/\\//i.test(url);\n}\n\n/**\n * Creates a new URL by combining the specified URLs\n *\n * @param {string} baseURL The base URL\n * @param {string} relativeURL The relative URL\n *\n * @returns {string} The combined URL\n */\nfunction combineURLs(baseURL, relativeURL) {\n return relativeURL\n ? baseURL.replace(/\\/+$/, '') + '/' + relativeURL.replace(/^\\/+/, '')\n : baseURL;\n}\n\n/**\n * Creates a new URL by combining the baseURL with the requestedURL,\n * only when the requestedURL is not already an absolute URL.\n * If the requestURL is absolute, this function returns the requestedURL untouched.\n *\n * @param {string} baseURL The base URL\n * @param {string} requestedURL Absolute or relative URL to combine\n *\n * @returns {string} The combined full path\n */\nfunction buildFullPath(baseURL, requestedURL) {\n if (baseURL && !isAbsoluteURL(requestedURL)) {\n return combineURLs(baseURL, requestedURL);\n }\n return requestedURL;\n}\n\nvar isURLSameOrigin = platform.isStandardBrowserEnv ?\n\n// Standard browser envs have full support of the APIs needed to test\n// whether the request URL is of the same origin as current location.\n (function standardBrowserEnv() {\n const msie = /(msie|trident)/i.test(navigator.userAgent);\n const urlParsingNode = document.createElement('a');\n let originURL;\n\n /**\n * Parse a URL to discover it's components\n *\n * @param {String} url The URL to be parsed\n * @returns {Object}\n */\n function resolveURL(url) {\n let href = url;\n\n if (msie) {\n // IE needs attribute set twice to normalize properties\n urlParsingNode.setAttribute('href', href);\n href = urlParsingNode.href;\n }\n\n urlParsingNode.setAttribute('href', href);\n\n // urlParsingNode provides the UrlUtils interface - http://url.spec.whatwg.org/#urlutils\n return {\n href: urlParsingNode.href,\n protocol: urlParsingNode.protocol ? urlParsingNode.protocol.replace(/:$/, '') : '',\n host: urlParsingNode.host,\n search: urlParsingNode.search ? urlParsingNode.search.replace(/^\\?/, '') : '',\n hash: urlParsingNode.hash ? urlParsingNode.hash.replace(/^#/, '') : '',\n hostname: urlParsingNode.hostname,\n port: urlParsingNode.port,\n pathname: (urlParsingNode.pathname.charAt(0) === '/') ?\n urlParsingNode.pathname :\n '/' + urlParsingNode.pathname\n };\n }\n\n originURL = resolveURL(window.location.href);\n\n /**\n * Determine if a URL shares the same origin as the current location\n *\n * @param {String} requestURL The URL to test\n * @returns {boolean} True if URL shares the same origin, otherwise false\n */\n return function isURLSameOrigin(requestURL) {\n const parsed = (utils.isString(requestURL)) ? resolveURL(requestURL) : requestURL;\n return (parsed.protocol === originURL.protocol &&\n parsed.host === originURL.host);\n };\n })() :\n\n // Non standard browser envs (web workers, react-native) lack needed support.\n (function nonStandardBrowserEnv() {\n return function isURLSameOrigin() {\n return true;\n };\n })();\n\nfunction parseProtocol(url) {\n const match = /^([-+\\w]{1,25})(:?\\/\\/|:)/.exec(url);\n return match && match[1] || '';\n}\n\n/**\n * Calculate data maxRate\n * @param {Number} [samplesCount= 10]\n * @param {Number} [min= 1000]\n * @returns {Function}\n */\nfunction speedometer(samplesCount, min) {\n samplesCount = samplesCount || 10;\n const bytes = new Array(samplesCount);\n const timestamps = new Array(samplesCount);\n let head = 0;\n let tail = 0;\n let firstSampleTS;\n\n min = min !== undefined ? min : 1000;\n\n return function push(chunkLength) {\n const now = Date.now();\n\n const startedAt = timestamps[tail];\n\n if (!firstSampleTS) {\n firstSampleTS = now;\n }\n\n bytes[head] = chunkLength;\n timestamps[head] = now;\n\n let i = tail;\n let bytesCount = 0;\n\n while (i !== head) {\n bytesCount += bytes[i++];\n i = i % samplesCount;\n }\n\n head = (head + 1) % samplesCount;\n\n if (head === tail) {\n tail = (tail + 1) % samplesCount;\n }\n\n if (now - firstSampleTS < min) {\n return;\n }\n\n const passed = startedAt && now - startedAt;\n\n return passed ? Math.round(bytesCount * 1000 / passed) : undefined;\n };\n}\n\nfunction progressEventReducer(listener, isDownloadStream) {\n let bytesNotified = 0;\n const _speedometer = speedometer(50, 250);\n\n return e => {\n const loaded = e.loaded;\n const total = e.lengthComputable ? e.total : undefined;\n const progressBytes = loaded - bytesNotified;\n const rate = _speedometer(progressBytes);\n const inRange = loaded <= total;\n\n bytesNotified = loaded;\n\n const data = {\n loaded,\n total,\n progress: total ? (loaded / total) : undefined,\n bytes: progressBytes,\n rate: rate ? rate : undefined,\n estimated: rate && total && inRange ? (total - loaded) / rate : undefined,\n event: e\n };\n\n data[isDownloadStream ? 'download' : 'upload'] = true;\n\n listener(data);\n };\n}\n\nconst isXHRAdapterSupported = typeof XMLHttpRequest !== 'undefined';\n\nvar xhrAdapter = isXHRAdapterSupported && function (config) {\n return new Promise(function dispatchXhrRequest(resolve, reject) {\n let requestData = config.data;\n const requestHeaders = AxiosHeaders$1.from(config.headers).normalize();\n const responseType = config.responseType;\n let onCanceled;\n function done() {\n if (config.cancelToken) {\n config.cancelToken.unsubscribe(onCanceled);\n }\n\n if (config.signal) {\n config.signal.removeEventListener('abort', onCanceled);\n }\n }\n\n if (utils.isFormData(requestData)) {\n if (platform.isStandardBrowserEnv || platform.isStandardBrowserWebWorkerEnv) {\n requestHeaders.setContentType(false); // Let the browser set it\n } else {\n requestHeaders.setContentType('multipart/form-data;', false); // mobile/desktop app frameworks\n }\n }\n\n let request = new XMLHttpRequest();\n\n // HTTP basic authentication\n if (config.auth) {\n const username = config.auth.username || '';\n const password = config.auth.password ? unescape(encodeURIComponent(config.auth.password)) : '';\n requestHeaders.set('Authorization', 'Basic ' + btoa(username + ':' + password));\n }\n\n const fullPath = buildFullPath(config.baseURL, config.url);\n\n request.open(config.method.toUpperCase(), buildURL(fullPath, config.params, config.paramsSerializer), true);\n\n // Set the request timeout in MS\n request.timeout = config.timeout;\n\n function onloadend() {\n if (!request) {\n return;\n }\n // Prepare the response\n const responseHeaders = AxiosHeaders$1.from(\n 'getAllResponseHeaders' in request && request.getAllResponseHeaders()\n );\n const responseData = !responseType || responseType === 'text' || responseType === 'json' ?\n request.responseText : request.response;\n const response = {\n data: responseData,\n status: request.status,\n statusText: request.statusText,\n headers: responseHeaders,\n config,\n request\n };\n\n settle(function _resolve(value) {\n resolve(value);\n done();\n }, function _reject(err) {\n reject(err);\n done();\n }, response);\n\n // Clean up request\n request = null;\n }\n\n if ('onloadend' in request) {\n // Use onloadend if available\n request.onloadend = onloadend;\n } else {\n // Listen for ready state to emulate onloadend\n request.onreadystatechange = function handleLoad() {\n if (!request || request.readyState !== 4) {\n return;\n }\n\n // The request errored out and we didn't get a response, this will be\n // handled by onerror instead\n // With one exception: request that using file: protocol, most browsers\n // will return status as 0 even though it's a successful request\n if (request.status === 0 && !(request.responseURL && request.responseURL.indexOf('file:') === 0)) {\n return;\n }\n // readystate handler is calling before onerror or ontimeout handlers,\n // so we should call onloadend on the next 'tick'\n setTimeout(onloadend);\n };\n }\n\n // Handle browser request cancellation (as opposed to a manual cancellation)\n request.onabort = function handleAbort() {\n if (!request) {\n return;\n }\n\n reject(new AxiosError('Request aborted', AxiosError.ECONNABORTED, config, request));\n\n // Clean up request\n request = null;\n };\n\n // Handle low level network errors\n request.onerror = function handleError() {\n // Real errors are hidden from us by the browser\n // onerror should only fire if it's a network error\n reject(new AxiosError('Network Error', AxiosError.ERR_NETWORK, config, request));\n\n // Clean up request\n request = null;\n };\n\n // Handle timeout\n request.ontimeout = function handleTimeout() {\n let timeoutErrorMessage = config.timeout ? 'timeout of ' + config.timeout + 'ms exceeded' : 'timeout exceeded';\n const transitional = config.transitional || transitionalDefaults;\n if (config.timeoutErrorMessage) {\n timeoutErrorMessage = config.timeoutErrorMessage;\n }\n reject(new AxiosError(\n timeoutErrorMessage,\n transitional.clarifyTimeoutError ? AxiosError.ETIMEDOUT : AxiosError.ECONNABORTED,\n config,\n request));\n\n // Clean up request\n request = null;\n };\n\n // Add xsrf header\n // This is only done if running in a standard browser environment.\n // Specifically not if we're in a web worker, or react-native.\n if (platform.isStandardBrowserEnv) {\n // Add xsrf header\n const xsrfValue = (config.withCredentials || isURLSameOrigin(fullPath))\n && config.xsrfCookieName && cookies.read(config.xsrfCookieName);\n\n if (xsrfValue) {\n requestHeaders.set(config.xsrfHeaderName, xsrfValue);\n }\n }\n\n // Remove Content-Type if data is undefined\n requestData === undefined && requestHeaders.setContentType(null);\n\n // Add headers to the request\n if ('setRequestHeader' in request) {\n utils.forEach(requestHeaders.toJSON(), function setRequestHeader(val, key) {\n request.setRequestHeader(key, val);\n });\n }\n\n // Add withCredentials to request if needed\n if (!utils.isUndefined(config.withCredentials)) {\n request.withCredentials = !!config.withCredentials;\n }\n\n // Add responseType to request if needed\n if (responseType && responseType !== 'json') {\n request.responseType = config.responseType;\n }\n\n // Handle progress if needed\n if (typeof config.onDownloadProgress === 'function') {\n request.addEventListener('progress', progressEventReducer(config.onDownloadProgress, true));\n }\n\n // Not all browsers support upload events\n if (typeof config.onUploadProgress === 'function' && request.upload) {\n request.upload.addEventListener('progress', progressEventReducer(config.onUploadProgress));\n }\n\n if (config.cancelToken || config.signal) {\n // Handle cancellation\n // eslint-disable-next-line func-names\n onCanceled = cancel => {\n if (!request) {\n return;\n }\n reject(!cancel || cancel.type ? new CanceledError(null, config, request) : cancel);\n request.abort();\n request = null;\n };\n\n config.cancelToken && config.cancelToken.subscribe(onCanceled);\n if (config.signal) {\n config.signal.aborted ? onCanceled() : config.signal.addEventListener('abort', onCanceled);\n }\n }\n\n const protocol = parseProtocol(fullPath);\n\n if (protocol && platform.protocols.indexOf(protocol) === -1) {\n reject(new AxiosError('Unsupported protocol ' + protocol + ':', AxiosError.ERR_BAD_REQUEST, config));\n return;\n }\n\n\n // Send the request\n request.send(requestData || null);\n });\n};\n\nconst knownAdapters = {\n http: httpAdapter,\n xhr: xhrAdapter\n};\n\nutils.forEach(knownAdapters, (fn, value) => {\n if(fn) {\n try {\n Object.defineProperty(fn, 'name', {value});\n } catch (e) {\n // eslint-disable-next-line no-empty\n }\n Object.defineProperty(fn, 'adapterName', {value});\n }\n});\n\nvar adapters = {\n getAdapter: (adapters) => {\n adapters = utils.isArray(adapters) ? adapters : [adapters];\n\n const {length} = adapters;\n let nameOrAdapter;\n let adapter;\n\n for (let i = 0; i < length; i++) {\n nameOrAdapter = adapters[i];\n if((adapter = utils.isString(nameOrAdapter) ? knownAdapters[nameOrAdapter.toLowerCase()] : nameOrAdapter)) {\n break;\n }\n }\n\n if (!adapter) {\n if (adapter === false) {\n throw new AxiosError(\n `Adapter ${nameOrAdapter} is not supported by the environment`,\n 'ERR_NOT_SUPPORT'\n );\n }\n\n throw new Error(\n utils.hasOwnProp(knownAdapters, nameOrAdapter) ?\n `Adapter '${nameOrAdapter}' is not available in the build` :\n `Unknown adapter '${nameOrAdapter}'`\n );\n }\n\n if (!utils.isFunction(adapter)) {\n throw new TypeError('adapter is not a function');\n }\n\n return adapter;\n },\n adapters: knownAdapters\n};\n\n/**\n * Throws a `CanceledError` if cancellation has been requested.\n *\n * @param {Object} config The config that is to be used for the request\n *\n * @returns {void}\n */\nfunction throwIfCancellationRequested(config) {\n if (config.cancelToken) {\n config.cancelToken.throwIfRequested();\n }\n\n if (config.signal && config.signal.aborted) {\n throw new CanceledError(null, config);\n }\n}\n\n/**\n * Dispatch a request to the server using the configured adapter.\n *\n * @param {object} config The config that is to be used for the request\n *\n * @returns {Promise} The Promise to be fulfilled\n */\nfunction dispatchRequest(config) {\n throwIfCancellationRequested(config);\n\n config.headers = AxiosHeaders$1.from(config.headers);\n\n // Transform request data\n config.data = transformData.call(\n config,\n config.transformRequest\n );\n\n if (['post', 'put', 'patch'].indexOf(config.method) !== -1) {\n config.headers.setContentType('application/x-www-form-urlencoded', false);\n }\n\n const adapter = adapters.getAdapter(config.adapter || defaults$2.adapter);\n\n return adapter(config).then(function onAdapterResolution(response) {\n throwIfCancellationRequested(config);\n\n // Transform response data\n response.data = transformData.call(\n config,\n config.transformResponse,\n response\n );\n\n response.headers = AxiosHeaders$1.from(response.headers);\n\n return response;\n }, function onAdapterRejection(reason) {\n if (!isCancel(reason)) {\n throwIfCancellationRequested(config);\n\n // Transform response data\n if (reason && reason.response) {\n reason.response.data = transformData.call(\n config,\n config.transformResponse,\n reason.response\n );\n reason.response.headers = AxiosHeaders$1.from(reason.response.headers);\n }\n }\n\n return Promise.reject(reason);\n });\n}\n\nconst headersToObject = (thing) => thing instanceof AxiosHeaders$1 ? thing.toJSON() : thing;\n\n/**\n * Config-specific merge-function which creates a new config-object\n * by merging two configuration objects together.\n *\n * @param {Object} config1\n * @param {Object} config2\n *\n * @returns {Object} New object resulting from merging config2 to config1\n */\nfunction mergeConfig$1(config1, config2) {\n // eslint-disable-next-line no-param-reassign\n config2 = config2 || {};\n const config = {};\n\n function getMergedValue(target, source, caseless) {\n if (utils.isPlainObject(target) && utils.isPlainObject(source)) {\n return utils.merge.call({caseless}, target, source);\n } else if (utils.isPlainObject(source)) {\n return utils.merge({}, source);\n } else if (utils.isArray(source)) {\n return source.slice();\n }\n return source;\n }\n\n // eslint-disable-next-line consistent-return\n function mergeDeepProperties(a, b, caseless) {\n if (!utils.isUndefined(b)) {\n return getMergedValue(a, b, caseless);\n } else if (!utils.isUndefined(a)) {\n return getMergedValue(undefined, a, caseless);\n }\n }\n\n // eslint-disable-next-line consistent-return\n function valueFromConfig2(a, b) {\n if (!utils.isUndefined(b)) {\n return getMergedValue(undefined, b);\n }\n }\n\n // eslint-disable-next-line consistent-return\n function defaultToConfig2(a, b) {\n if (!utils.isUndefined(b)) {\n return getMergedValue(undefined, b);\n } else if (!utils.isUndefined(a)) {\n return getMergedValue(undefined, a);\n }\n }\n\n // eslint-disable-next-line consistent-return\n function mergeDirectKeys(a, b, prop) {\n if (prop in config2) {\n return getMergedValue(a, b);\n } else if (prop in config1) {\n return getMergedValue(undefined, a);\n }\n }\n\n const mergeMap = {\n url: valueFromConfig2,\n method: valueFromConfig2,\n data: valueFromConfig2,\n baseURL: defaultToConfig2,\n transformRequest: defaultToConfig2,\n transformResponse: defaultToConfig2,\n paramsSerializer: defaultToConfig2,\n timeout: defaultToConfig2,\n timeoutMessage: defaultToConfig2,\n withCredentials: defaultToConfig2,\n adapter: defaultToConfig2,\n responseType: defaultToConfig2,\n xsrfCookieName: defaultToConfig2,\n xsrfHeaderName: defaultToConfig2,\n onUploadProgress: defaultToConfig2,\n onDownloadProgress: defaultToConfig2,\n decompress: defaultToConfig2,\n maxContentLength: defaultToConfig2,\n maxBodyLength: defaultToConfig2,\n beforeRedirect: defaultToConfig2,\n transport: defaultToConfig2,\n httpAgent: defaultToConfig2,\n httpsAgent: defaultToConfig2,\n cancelToken: defaultToConfig2,\n socketPath: defaultToConfig2,\n responseEncoding: defaultToConfig2,\n validateStatus: mergeDirectKeys,\n headers: (a, b) => mergeDeepProperties(headersToObject(a), headersToObject(b), true)\n };\n\n utils.forEach(Object.keys(Object.assign({}, config1, config2)), function computeConfigValue(prop) {\n const merge = mergeMap[prop] || mergeDeepProperties;\n const configValue = merge(config1[prop], config2[prop], prop);\n (utils.isUndefined(configValue) && merge !== mergeDirectKeys) || (config[prop] = configValue);\n });\n\n return config;\n}\n\nconst VERSION = \"1.4.0\";\n\nconst validators$1 = {};\n\n// eslint-disable-next-line func-names\n['object', 'boolean', 'number', 'function', 'string', 'symbol'].forEach((type, i) => {\n validators$1[type] = function validator(thing) {\n return typeof thing === type || 'a' + (i < 1 ? 'n ' : ' ') + type;\n };\n});\n\nconst deprecatedWarnings = {};\n\n/**\n * Transitional option validator\n *\n * @param {function|boolean?} validator - set to false if the transitional option has been removed\n * @param {string?} version - deprecated version / removed since version\n * @param {string?} message - some message with additional info\n *\n * @returns {function}\n */\nvalidators$1.transitional = function transitional(validator, version, message) {\n function formatMessage(opt, desc) {\n return '[Axios v' + VERSION + '] Transitional option \\'' + opt + '\\'' + desc + (message ? '. ' + message : '');\n }\n\n // eslint-disable-next-line func-names\n return (value, opt, opts) => {\n if (validator === false) {\n throw new AxiosError(\n formatMessage(opt, ' has been removed' + (version ? ' in ' + version : '')),\n AxiosError.ERR_DEPRECATED\n );\n }\n\n if (version && !deprecatedWarnings[opt]) {\n deprecatedWarnings[opt] = true;\n // eslint-disable-next-line no-console\n console.warn(\n formatMessage(\n opt,\n ' has been deprecated since v' + version + ' and will be removed in the near future'\n )\n );\n }\n\n return validator ? validator(value, opt, opts) : true;\n };\n};\n\n/**\n * Assert object's properties type\n *\n * @param {object} options\n * @param {object} schema\n * @param {boolean?} allowUnknown\n *\n * @returns {object}\n */\n\nfunction assertOptions(options, schema, allowUnknown) {\n if (typeof options !== 'object') {\n throw new AxiosError('options must be an object', AxiosError.ERR_BAD_OPTION_VALUE);\n }\n const keys = Object.keys(options);\n let i = keys.length;\n while (i-- > 0) {\n const opt = keys[i];\n const validator = schema[opt];\n if (validator) {\n const value = options[opt];\n const result = value === undefined || validator(value, opt, options);\n if (result !== true) {\n throw new AxiosError('option ' + opt + ' must be ' + result, AxiosError.ERR_BAD_OPTION_VALUE);\n }\n continue;\n }\n if (allowUnknown !== true) {\n throw new AxiosError('Unknown option ' + opt, AxiosError.ERR_BAD_OPTION);\n }\n }\n}\n\nvar validator$3 = {\n assertOptions,\n validators: validators$1\n};\n\nconst validators = validator$3.validators;\n\n/**\n * Create a new instance of Axios\n *\n * @param {Object} instanceConfig The default config for the instance\n *\n * @return {Axios} A new instance of Axios\n */\nclass Axios {\n constructor(instanceConfig) {\n this.defaults = instanceConfig;\n this.interceptors = {\n request: new InterceptorManager$1(),\n response: new InterceptorManager$1()\n };\n }\n\n /**\n * Dispatch a request\n *\n * @param {String|Object} configOrUrl The config specific for this request (merged with this.defaults)\n * @param {?Object} config\n *\n * @returns {Promise} The Promise to be fulfilled\n */\n request(configOrUrl, config) {\n /*eslint no-param-reassign:0*/\n // Allow for axios('example/url'[, config]) a la fetch API\n if (typeof configOrUrl === 'string') {\n config = config || {};\n config.url = configOrUrl;\n } else {\n config = configOrUrl || {};\n }\n\n config = mergeConfig$1(this.defaults, config);\n\n const {transitional, paramsSerializer, headers} = config;\n\n if (transitional !== undefined) {\n validator$3.assertOptions(transitional, {\n silentJSONParsing: validators.transitional(validators.boolean),\n forcedJSONParsing: validators.transitional(validators.boolean),\n clarifyTimeoutError: validators.transitional(validators.boolean)\n }, false);\n }\n\n if (paramsSerializer != null) {\n if (utils.isFunction(paramsSerializer)) {\n config.paramsSerializer = {\n serialize: paramsSerializer\n };\n } else {\n validator$3.assertOptions(paramsSerializer, {\n encode: validators.function,\n serialize: validators.function\n }, true);\n }\n }\n\n // Set config.method\n config.method = (config.method || this.defaults.method || 'get').toLowerCase();\n\n let contextHeaders;\n\n // Flatten headers\n contextHeaders = headers && utils.merge(\n headers.common,\n headers[config.method]\n );\n\n contextHeaders && utils.forEach(\n ['delete', 'get', 'head', 'post', 'put', 'patch', 'common'],\n (method) => {\n delete headers[method];\n }\n );\n\n config.headers = AxiosHeaders$1.concat(contextHeaders, headers);\n\n // filter out skipped interceptors\n const requestInterceptorChain = [];\n let synchronousRequestInterceptors = true;\n this.interceptors.request.forEach(function unshiftRequestInterceptors(interceptor) {\n if (typeof interceptor.runWhen === 'function' && interceptor.runWhen(config) === false) {\n return;\n }\n\n synchronousRequestInterceptors = synchronousRequestInterceptors && interceptor.synchronous;\n\n requestInterceptorChain.unshift(interceptor.fulfilled, interceptor.rejected);\n });\n\n const responseInterceptorChain = [];\n this.interceptors.response.forEach(function pushResponseInterceptors(interceptor) {\n responseInterceptorChain.push(interceptor.fulfilled, interceptor.rejected);\n });\n\n let promise;\n let i = 0;\n let len;\n\n if (!synchronousRequestInterceptors) {\n const chain = [dispatchRequest.bind(this), undefined];\n chain.unshift.apply(chain, requestInterceptorChain);\n chain.push.apply(chain, responseInterceptorChain);\n len = chain.length;\n\n promise = Promise.resolve(config);\n\n while (i < len) {\n promise = promise.then(chain[i++], chain[i++]);\n }\n\n return promise;\n }\n\n len = requestInterceptorChain.length;\n\n let newConfig = config;\n\n i = 0;\n\n while (i < len) {\n const onFulfilled = requestInterceptorChain[i++];\n const onRejected = requestInterceptorChain[i++];\n try {\n newConfig = onFulfilled(newConfig);\n } catch (error) {\n onRejected.call(this, error);\n break;\n }\n }\n\n try {\n promise = dispatchRequest.call(this, newConfig);\n } catch (error) {\n return Promise.reject(error);\n }\n\n i = 0;\n len = responseInterceptorChain.length;\n\n while (i < len) {\n promise = promise.then(responseInterceptorChain[i++], responseInterceptorChain[i++]);\n }\n\n return promise;\n }\n\n getUri(config) {\n config = mergeConfig$1(this.defaults, config);\n const fullPath = buildFullPath(config.baseURL, config.url);\n return buildURL(fullPath, config.params, config.paramsSerializer);\n }\n}\n\n// Provide aliases for supported request methods\nutils.forEach(['delete', 'get', 'head', 'options'], function forEachMethodNoData(method) {\n /*eslint func-names:0*/\n Axios.prototype[method] = function(url, config) {\n return this.request(mergeConfig$1(config || {}, {\n method,\n url,\n data: (config || {}).data\n }));\n };\n});\n\nutils.forEach(['post', 'put', 'patch'], function forEachMethodWithData(method) {\n /*eslint func-names:0*/\n\n function generateHTTPMethod(isForm) {\n return function httpMethod(url, data, config) {\n return this.request(mergeConfig$1(config || {}, {\n method,\n headers: isForm ? {\n 'Content-Type': 'multipart/form-data'\n } : {},\n url,\n data\n }));\n };\n }\n\n Axios.prototype[method] = generateHTTPMethod();\n\n Axios.prototype[method + 'Form'] = generateHTTPMethod(true);\n});\n\nvar Axios$1 = Axios;\n\n/**\n * A `CancelToken` is an object that can be used to request cancellation of an operation.\n *\n * @param {Function} executor The executor function.\n *\n * @returns {CancelToken}\n */\nclass CancelToken {\n constructor(executor) {\n if (typeof executor !== 'function') {\n throw new TypeError('executor must be a function.');\n }\n\n let resolvePromise;\n\n this.promise = new Promise(function promiseExecutor(resolve) {\n resolvePromise = resolve;\n });\n\n const token = this;\n\n // eslint-disable-next-line func-names\n this.promise.then(cancel => {\n if (!token._listeners) return;\n\n let i = token._listeners.length;\n\n while (i-- > 0) {\n token._listeners[i](cancel);\n }\n token._listeners = null;\n });\n\n // eslint-disable-next-line func-names\n this.promise.then = onfulfilled => {\n let _resolve;\n // eslint-disable-next-line func-names\n const promise = new Promise(resolve => {\n token.subscribe(resolve);\n _resolve = resolve;\n }).then(onfulfilled);\n\n promise.cancel = function reject() {\n token.unsubscribe(_resolve);\n };\n\n return promise;\n };\n\n executor(function cancel(message, config, request) {\n if (token.reason) {\n // Cancellation has already been requested\n return;\n }\n\n token.reason = new CanceledError(message, config, request);\n resolvePromise(token.reason);\n });\n }\n\n /**\n * Throws a `CanceledError` if cancellation has been requested.\n */\n throwIfRequested() {\n if (this.reason) {\n throw this.reason;\n }\n }\n\n /**\n * Subscribe to the cancel signal\n */\n\n subscribe(listener) {\n if (this.reason) {\n listener(this.reason);\n return;\n }\n\n if (this._listeners) {\n this._listeners.push(listener);\n } else {\n this._listeners = [listener];\n }\n }\n\n /**\n * Unsubscribe from the cancel signal\n */\n\n unsubscribe(listener) {\n if (!this._listeners) {\n return;\n }\n const index = this._listeners.indexOf(listener);\n if (index !== -1) {\n this._listeners.splice(index, 1);\n }\n }\n\n /**\n * Returns an object that contains a new `CancelToken` and a function that, when called,\n * cancels the `CancelToken`.\n */\n static source() {\n let cancel;\n const token = new CancelToken(function executor(c) {\n cancel = c;\n });\n return {\n token,\n cancel\n };\n }\n}\n\nvar CancelToken$1 = CancelToken;\n\n/**\n * Syntactic sugar for invoking a function and expanding an array for arguments.\n *\n * Common use case would be to use `Function.prototype.apply`.\n *\n * ```js\n * function f(x, y, z) {}\n * var args = [1, 2, 3];\n * f.apply(null, args);\n * ```\n *\n * With `spread` this example can be re-written.\n *\n * ```js\n * spread(function(x, y, z) {})([1, 2, 3]);\n * ```\n *\n * @param {Function} callback\n *\n * @returns {Function}\n */\nfunction spread(callback) {\n return function wrap(arr) {\n return callback.apply(null, arr);\n };\n}\n\n/**\n * Determines whether the payload is an error thrown by Axios\n *\n * @param {*} payload The value to test\n *\n * @returns {boolean} True if the payload is an error thrown by Axios, otherwise false\n */\nfunction isAxiosError(payload) {\n return utils.isObject(payload) && (payload.isAxiosError === true);\n}\n\nconst HttpStatusCode = {\n Continue: 100,\n SwitchingProtocols: 101,\n Processing: 102,\n EarlyHints: 103,\n Ok: 200,\n Created: 201,\n Accepted: 202,\n NonAuthoritativeInformation: 203,\n NoContent: 204,\n ResetContent: 205,\n PartialContent: 206,\n MultiStatus: 207,\n AlreadyReported: 208,\n ImUsed: 226,\n MultipleChoices: 300,\n MovedPermanently: 301,\n Found: 302,\n SeeOther: 303,\n NotModified: 304,\n UseProxy: 305,\n Unused: 306,\n TemporaryRedirect: 307,\n PermanentRedirect: 308,\n BadRequest: 400,\n Unauthorized: 401,\n PaymentRequired: 402,\n Forbidden: 403,\n NotFound: 404,\n MethodNotAllowed: 405,\n NotAcceptable: 406,\n ProxyAuthenticationRequired: 407,\n RequestTimeout: 408,\n Conflict: 409,\n Gone: 410,\n LengthRequired: 411,\n PreconditionFailed: 412,\n PayloadTooLarge: 413,\n UriTooLong: 414,\n UnsupportedMediaType: 415,\n RangeNotSatisfiable: 416,\n ExpectationFailed: 417,\n ImATeapot: 418,\n MisdirectedRequest: 421,\n UnprocessableEntity: 422,\n Locked: 423,\n FailedDependency: 424,\n TooEarly: 425,\n UpgradeRequired: 426,\n PreconditionRequired: 428,\n TooManyRequests: 429,\n RequestHeaderFieldsTooLarge: 431,\n UnavailableForLegalReasons: 451,\n InternalServerError: 500,\n NotImplemented: 501,\n BadGateway: 502,\n ServiceUnavailable: 503,\n GatewayTimeout: 504,\n HttpVersionNotSupported: 505,\n VariantAlsoNegotiates: 506,\n InsufficientStorage: 507,\n LoopDetected: 508,\n NotExtended: 510,\n NetworkAuthenticationRequired: 511,\n};\n\nObject.entries(HttpStatusCode).forEach(([key, value]) => {\n HttpStatusCode[value] = key;\n});\n\nvar HttpStatusCode$1 = HttpStatusCode;\n\n/**\n * Create an instance of Axios\n *\n * @param {Object} defaultConfig The default config for the instance\n *\n * @returns {Axios} A new instance of Axios\n */\nfunction createInstance(defaultConfig) {\n const context = new Axios$1(defaultConfig);\n const instance = bind(Axios$1.prototype.request, context);\n\n // Copy axios.prototype to instance\n utils.extend(instance, Axios$1.prototype, context, {allOwnKeys: true});\n\n // Copy context to instance\n utils.extend(instance, context, null, {allOwnKeys: true});\n\n // Factory for creating new instances\n instance.create = function create(instanceConfig) {\n return createInstance(mergeConfig$1(defaultConfig, instanceConfig));\n };\n\n return instance;\n}\n\n// Create the default instance to be exported\nconst axios = createInstance(defaults$2);\n\n// Expose Axios class to allow class inheritance\naxios.Axios = Axios$1;\n\n// Expose Cancel & CancelToken\naxios.CanceledError = CanceledError;\naxios.CancelToken = CancelToken$1;\naxios.isCancel = isCancel;\naxios.VERSION = VERSION;\naxios.toFormData = toFormData;\n\n// Expose AxiosError class\naxios.AxiosError = AxiosError;\n\n// alias for CanceledError for backward compatibility\naxios.Cancel = axios.CanceledError;\n\n// Expose all/spread\naxios.all = function all(promises) {\n return Promise.all(promises);\n};\n\naxios.spread = spread;\n\n// Expose isAxiosError\naxios.isAxiosError = isAxiosError;\n\n// Expose mergeConfig\naxios.mergeConfig = mergeConfig$1;\n\naxios.AxiosHeaders = AxiosHeaders$1;\n\naxios.formToJSON = thing => formDataToJSON(utils.isHTMLForm(thing) ? new FormData(thing) : thing);\n\naxios.HttpStatusCode = HttpStatusCode$1;\n\naxios.default = axios;\n\n// this module should only have a default export\nvar axios$1 = axios;\n\nvar commonjsGlobal = typeof globalThis !== 'undefined' ? globalThis : typeof window !== 'undefined' ? window : typeof global !== 'undefined' ? global : typeof self !== 'undefined' ? self : {};\n\nvar validator$2 = {};\n\nvar util$4 = {};\n\n(function (exports) {\n\nconst nameStartChar = ':A-Za-z_\\\\u00C0-\\\\u00D6\\\\u00D8-\\\\u00F6\\\\u00F8-\\\\u02FF\\\\u0370-\\\\u037D\\\\u037F-\\\\u1FFF\\\\u200C-\\\\u200D\\\\u2070-\\\\u218F\\\\u2C00-\\\\u2FEF\\\\u3001-\\\\uD7FF\\\\uF900-\\\\uFDCF\\\\uFDF0-\\\\uFFFD';\nconst nameChar = nameStartChar + '\\\\-.\\\\d\\\\u00B7\\\\u0300-\\\\u036F\\\\u203F-\\\\u2040';\nconst nameRegexp = '[' + nameStartChar + '][' + nameChar + ']*';\nconst regexName = new RegExp('^' + nameRegexp + '$');\n\nconst getAllMatches = function(string, regex) {\n const matches = [];\n let match = regex.exec(string);\n while (match) {\n const allmatches = [];\n allmatches.startIndex = regex.lastIndex - match[0].length;\n const len = match.length;\n for (let index = 0; index < len; index++) {\n allmatches.push(match[index]);\n }\n matches.push(allmatches);\n match = regex.exec(string);\n }\n return matches;\n};\n\nconst isName = function(string) {\n const match = regexName.exec(string);\n return !(match === null || typeof match === 'undefined');\n};\n\nexports.isExist = function(v) {\n return typeof v !== 'undefined';\n};\n\nexports.isEmptyObject = function(obj) {\n return Object.keys(obj).length === 0;\n};\n\n/**\n * Copy all the properties of a into b.\n * @param {*} target\n * @param {*} a\n */\nexports.merge = function(target, a, arrayMode) {\n if (a) {\n const keys = Object.keys(a); // will return an array of own properties\n const len = keys.length; //don't make it inline\n for (let i = 0; i < len; i++) {\n if (arrayMode === 'strict') {\n target[keys[i]] = [ a[keys[i]] ];\n } else {\n target[keys[i]] = a[keys[i]];\n }\n }\n }\n};\n/* exports.merge =function (b,a){\n return Object.assign(b,a);\n} */\n\nexports.getValue = function(v) {\n if (exports.isExist(v)) {\n return v;\n } else {\n return '';\n }\n};\n\n// const fakeCall = function(a) {return a;};\n// const fakeCallNoReturn = function() {};\n\nexports.isName = isName;\nexports.getAllMatches = getAllMatches;\nexports.nameRegexp = nameRegexp;\n}(util$4));\n\nconst util$3 = util$4;\n\nconst defaultOptions$3 = {\n allowBooleanAttributes: false, //A tag can have attributes without any value\n unpairedTags: []\n};\n\n//const tagsPattern = new RegExp(\"<\\\\/?([\\\\w:\\\\-_\\.]+)\\\\s*\\/?>\",\"g\");\nvalidator$2.validate = function (xmlData, options) {\n options = Object.assign({}, defaultOptions$3, options);\n\n //xmlData = xmlData.replace(/(\\r\\n|\\n|\\r)/gm,\"\");//make it single line\n //xmlData = xmlData.replace(/(^\\s*<\\?xml.*?\\?>)/g,\"\");//Remove XML starting tag\n //xmlData = xmlData.replace(/()/g,\"\");//Remove DOCTYPE\n const tags = [];\n let tagFound = false;\n\n //indicates that the root tag has been closed (aka. depth 0 has been reached)\n let reachedRoot = false;\n\n if (xmlData[0] === '\\ufeff') {\n // check for byte order mark (BOM)\n xmlData = xmlData.substr(1);\n }\n \n for (let i = 0; i < xmlData.length; i++) {\n\n if (xmlData[i] === '<' && xmlData[i+1] === '?') {\n i+=2;\n i = readPI(xmlData,i);\n if (i.err) return i;\n }else if (xmlData[i] === '<') {\n //starting of tag\n //read until you reach to '>' avoiding any '>' in attribute value\n let tagStartPos = i;\n i++;\n \n if (xmlData[i] === '!') {\n i = readCommentAndCDATA(xmlData, i);\n continue;\n } else {\n let closingTag = false;\n if (xmlData[i] === '/') {\n //closing tag\n closingTag = true;\n i++;\n }\n //read tagname\n let tagName = '';\n for (; i < xmlData.length &&\n xmlData[i] !== '>' &&\n xmlData[i] !== ' ' &&\n xmlData[i] !== '\\t' &&\n xmlData[i] !== '\\n' &&\n xmlData[i] !== '\\r'; i++\n ) {\n tagName += xmlData[i];\n }\n tagName = tagName.trim();\n //console.log(tagName);\n\n if (tagName[tagName.length - 1] === '/') {\n //self closing tag without attributes\n tagName = tagName.substring(0, tagName.length - 1);\n //continue;\n i--;\n }\n if (!validateTagName(tagName)) {\n let msg;\n if (tagName.trim().length === 0) {\n msg = \"Invalid space after '<'.\";\n } else {\n msg = \"Tag '\"+tagName+\"' is an invalid name.\";\n }\n return getErrorObject('InvalidTag', msg, getLineNumberForPosition(xmlData, i));\n }\n\n const result = readAttributeStr(xmlData, i);\n if (result === false) {\n return getErrorObject('InvalidAttr', \"Attributes for '\"+tagName+\"' have open quote.\", getLineNumberForPosition(xmlData, i));\n }\n let attrStr = result.value;\n i = result.index;\n\n if (attrStr[attrStr.length - 1] === '/') {\n //self closing tag\n const attrStrStart = i - attrStr.length;\n attrStr = attrStr.substring(0, attrStr.length - 1);\n const isValid = validateAttributeString(attrStr, options);\n if (isValid === true) {\n tagFound = true;\n //continue; //text may presents after self closing tag\n } else {\n //the result from the nested function returns the position of the error within the attribute\n //in order to get the 'true' error line, we need to calculate the position where the attribute begins (i - attrStr.length) and then add the position within the attribute\n //this gives us the absolute index in the entire xml, which we can use to find the line at last\n return getErrorObject(isValid.err.code, isValid.err.msg, getLineNumberForPosition(xmlData, attrStrStart + isValid.err.line));\n }\n } else if (closingTag) {\n if (!result.tagClosed) {\n return getErrorObject('InvalidTag', \"Closing tag '\"+tagName+\"' doesn't have proper closing.\", getLineNumberForPosition(xmlData, i));\n } else if (attrStr.trim().length > 0) {\n return getErrorObject('InvalidTag', \"Closing tag '\"+tagName+\"' can't have attributes or invalid starting.\", getLineNumberForPosition(xmlData, tagStartPos));\n } else {\n const otg = tags.pop();\n if (tagName !== otg.tagName) {\n let openPos = getLineNumberForPosition(xmlData, otg.tagStartPos);\n return getErrorObject('InvalidTag',\n \"Expected closing tag '\"+otg.tagName+\"' (opened in line \"+openPos.line+\", col \"+openPos.col+\") instead of closing tag '\"+tagName+\"'.\",\n getLineNumberForPosition(xmlData, tagStartPos));\n }\n\n //when there are no more tags, we reached the root level.\n if (tags.length == 0) {\n reachedRoot = true;\n }\n }\n } else {\n const isValid = validateAttributeString(attrStr, options);\n if (isValid !== true) {\n //the result from the nested function returns the position of the error within the attribute\n //in order to get the 'true' error line, we need to calculate the position where the attribute begins (i - attrStr.length) and then add the position within the attribute\n //this gives us the absolute index in the entire xml, which we can use to find the line at last\n return getErrorObject(isValid.err.code, isValid.err.msg, getLineNumberForPosition(xmlData, i - attrStr.length + isValid.err.line));\n }\n\n //if the root level has been reached before ...\n if (reachedRoot === true) {\n return getErrorObject('InvalidXml', 'Multiple possible root nodes found.', getLineNumberForPosition(xmlData, i));\n } else if(options.unpairedTags.indexOf(tagName) !== -1); else {\n tags.push({tagName, tagStartPos});\n }\n tagFound = true;\n }\n\n //skip tag text value\n //It may include comments and CDATA value\n for (i++; i < xmlData.length; i++) {\n if (xmlData[i] === '<') {\n if (xmlData[i + 1] === '!') {\n //comment or CADATA\n i++;\n i = readCommentAndCDATA(xmlData, i);\n continue;\n } else if (xmlData[i+1] === '?') {\n i = readPI(xmlData, ++i);\n if (i.err) return i;\n } else {\n break;\n }\n } else if (xmlData[i] === '&') {\n const afterAmp = validateAmpersand(xmlData, i);\n if (afterAmp == -1)\n return getErrorObject('InvalidChar', \"char '&' is not expected.\", getLineNumberForPosition(xmlData, i));\n i = afterAmp;\n }else {\n if (reachedRoot === true && !isWhiteSpace(xmlData[i])) {\n return getErrorObject('InvalidXml', \"Extra text at the end\", getLineNumberForPosition(xmlData, i));\n }\n }\n } //end of reading tag text value\n if (xmlData[i] === '<') {\n i--;\n }\n }\n } else {\n if ( isWhiteSpace(xmlData[i])) {\n continue;\n }\n return getErrorObject('InvalidChar', \"char '\"+xmlData[i]+\"' is not expected.\", getLineNumberForPosition(xmlData, i));\n }\n }\n\n if (!tagFound) {\n return getErrorObject('InvalidXml', 'Start tag expected.', 1);\n }else if (tags.length == 1) {\n return getErrorObject('InvalidTag', \"Unclosed tag '\"+tags[0].tagName+\"'.\", getLineNumberForPosition(xmlData, tags[0].tagStartPos));\n }else if (tags.length > 0) {\n return getErrorObject('InvalidXml', \"Invalid '\"+\n JSON.stringify(tags.map(t => t.tagName), null, 4).replace(/\\r?\\n/g, '')+\n \"' found.\", {line: 1, col: 1});\n }\n\n return true;\n};\n\nfunction isWhiteSpace(char){\n return char === ' ' || char === '\\t' || char === '\\n' || char === '\\r';\n}\n/**\n * Read Processing insstructions and skip\n * @param {*} xmlData\n * @param {*} i\n */\nfunction readPI(xmlData, i) {\n const start = i;\n for (; i < xmlData.length; i++) {\n if (xmlData[i] == '?' || xmlData[i] == ' ') {\n //tagname\n const tagname = xmlData.substr(start, i - start);\n if (i > 5 && tagname === 'xml') {\n return getErrorObject('InvalidXml', 'XML declaration allowed only at the start of the document.', getLineNumberForPosition(xmlData, i));\n } else if (xmlData[i] == '?' && xmlData[i + 1] == '>') {\n //check if valid attribut string\n i++;\n break;\n } else {\n continue;\n }\n }\n }\n return i;\n}\n\nfunction readCommentAndCDATA(xmlData, i) {\n if (xmlData.length > i + 5 && xmlData[i + 1] === '-' && xmlData[i + 2] === '-') {\n //comment\n for (i += 3; i < xmlData.length; i++) {\n if (xmlData[i] === '-' && xmlData[i + 1] === '-' && xmlData[i + 2] === '>') {\n i += 2;\n break;\n }\n }\n } else if (\n xmlData.length > i + 8 &&\n xmlData[i + 1] === 'D' &&\n xmlData[i + 2] === 'O' &&\n xmlData[i + 3] === 'C' &&\n xmlData[i + 4] === 'T' &&\n xmlData[i + 5] === 'Y' &&\n xmlData[i + 6] === 'P' &&\n xmlData[i + 7] === 'E'\n ) {\n let angleBracketsCount = 1;\n for (i += 8; i < xmlData.length; i++) {\n if (xmlData[i] === '<') {\n angleBracketsCount++;\n } else if (xmlData[i] === '>') {\n angleBracketsCount--;\n if (angleBracketsCount === 0) {\n break;\n }\n }\n }\n } else if (\n xmlData.length > i + 9 &&\n xmlData[i + 1] === '[' &&\n xmlData[i + 2] === 'C' &&\n xmlData[i + 3] === 'D' &&\n xmlData[i + 4] === 'A' &&\n xmlData[i + 5] === 'T' &&\n xmlData[i + 6] === 'A' &&\n xmlData[i + 7] === '['\n ) {\n for (i += 8; i < xmlData.length; i++) {\n if (xmlData[i] === ']' && xmlData[i + 1] === ']' && xmlData[i + 2] === '>') {\n i += 2;\n break;\n }\n }\n }\n\n return i;\n}\n\nconst doubleQuote = '\"';\nconst singleQuote = \"'\";\n\n/**\n * Keep reading xmlData until '<' is found outside the attribute value.\n * @param {string} xmlData\n * @param {number} i\n */\nfunction readAttributeStr(xmlData, i) {\n let attrStr = '';\n let startChar = '';\n let tagClosed = false;\n for (; i < xmlData.length; i++) {\n if (xmlData[i] === doubleQuote || xmlData[i] === singleQuote) {\n if (startChar === '') {\n startChar = xmlData[i];\n } else if (startChar !== xmlData[i]) ; else {\n startChar = '';\n }\n } else if (xmlData[i] === '>') {\n if (startChar === '') {\n tagClosed = true;\n break;\n }\n }\n attrStr += xmlData[i];\n }\n if (startChar !== '') {\n return false;\n }\n\n return {\n value: attrStr,\n index: i,\n tagClosed: tagClosed\n };\n}\n\n/**\n * Select all the attributes whether valid or invalid.\n */\nconst validAttrStrRegxp = new RegExp('(\\\\s*)([^\\\\s=]+)(\\\\s*=)?(\\\\s*([\\'\"])(([\\\\s\\\\S])*?)\\\\5)?', 'g');\n\n//attr, =\"sd\", a=\"amit's\", a=\"sd\"b=\"saf\", ab cd=\"\"\n\nfunction validateAttributeString(attrStr, options) {\n //console.log(\"start:\"+attrStr+\":end\");\n\n //if(attrStr.trim().length === 0) return true; //empty string\n\n const matches = util$3.getAllMatches(attrStr, validAttrStrRegxp);\n const attrNames = {};\n\n for (let i = 0; i < matches.length; i++) {\n if (matches[i][1].length === 0) {\n //nospace before attribute name: a=\"sd\"b=\"saf\"\n return getErrorObject('InvalidAttr', \"Attribute '\"+matches[i][2]+\"' has no space in starting.\", getPositionFromMatch(matches[i]))\n } else if (matches[i][3] !== undefined && matches[i][4] === undefined) {\n return getErrorObject('InvalidAttr', \"Attribute '\"+matches[i][2]+\"' is without value.\", getPositionFromMatch(matches[i]));\n } else if (matches[i][3] === undefined && !options.allowBooleanAttributes) {\n //independent attribute: ab\n return getErrorObject('InvalidAttr', \"boolean attribute '\"+matches[i][2]+\"' is not allowed.\", getPositionFromMatch(matches[i]));\n }\n /* else if(matches[i][6] === undefined){//attribute without value: ab=\n return { err: { code:\"InvalidAttr\",msg:\"attribute \" + matches[i][2] + \" has no value assigned.\"}};\n } */\n const attrName = matches[i][2];\n if (!validateAttrName(attrName)) {\n return getErrorObject('InvalidAttr', \"Attribute '\"+attrName+\"' is an invalid name.\", getPositionFromMatch(matches[i]));\n }\n if (!attrNames.hasOwnProperty(attrName)) {\n //check for duplicate attribute.\n attrNames[attrName] = 1;\n } else {\n return getErrorObject('InvalidAttr', \"Attribute '\"+attrName+\"' is repeated.\", getPositionFromMatch(matches[i]));\n }\n }\n\n return true;\n}\n\nfunction validateNumberAmpersand(xmlData, i) {\n let re = /\\d/;\n if (xmlData[i] === 'x') {\n i++;\n re = /[\\da-fA-F]/;\n }\n for (; i < xmlData.length; i++) {\n if (xmlData[i] === ';')\n return i;\n if (!xmlData[i].match(re))\n break;\n }\n return -1;\n}\n\nfunction validateAmpersand(xmlData, i) {\n // https://www.w3.org/TR/xml/#dt-charref\n i++;\n if (xmlData[i] === ';')\n return -1;\n if (xmlData[i] === '#') {\n i++;\n return validateNumberAmpersand(xmlData, i);\n }\n let count = 0;\n for (; i < xmlData.length; i++, count++) {\n if (xmlData[i].match(/\\w/) && count < 20)\n continue;\n if (xmlData[i] === ';')\n break;\n return -1;\n }\n return i;\n}\n\nfunction getErrorObject(code, message, lineNumber) {\n return {\n err: {\n code: code,\n msg: message,\n line: lineNumber.line || lineNumber,\n col: lineNumber.col,\n },\n };\n}\n\nfunction validateAttrName(attrName) {\n return util$3.isName(attrName);\n}\n\n// const startsWithXML = /^xml/i;\n\nfunction validateTagName(tagname) {\n return util$3.isName(tagname) /* && !tagname.match(startsWithXML) */;\n}\n\n//this function returns the line number for the character at the given index\nfunction getLineNumberForPosition(xmlData, index) {\n const lines = xmlData.substring(0, index).split(/\\r?\\n/);\n return {\n line: lines.length,\n\n // column number is last line's length + 1, because column numbering starts at 1:\n col: lines[lines.length - 1].length + 1\n };\n}\n\n//this function returns the position of the first character of match within attrStr\nfunction getPositionFromMatch(match) {\n return match.startIndex + match[1].length;\n}\n\nvar OptionsBuilder = {};\n\nconst defaultOptions$2 = {\n preserveOrder: false,\n attributeNamePrefix: '@_',\n attributesGroupName: false,\n textNodeName: '#text',\n ignoreAttributes: true,\n removeNSPrefix: false, // remove NS from tag name or attribute name if true\n allowBooleanAttributes: false, //a tag can have attributes without any value\n //ignoreRootElement : false,\n parseTagValue: true,\n parseAttributeValue: false,\n trimValues: true, //Trim string values of tag and attributes\n cdataPropName: false,\n numberParseOptions: {\n hex: true,\n leadingZeros: true,\n eNotation: true\n },\n tagValueProcessor: function(tagName, val) {\n return val;\n },\n attributeValueProcessor: function(attrName, val) {\n return val;\n },\n stopNodes: [], //nested tags will not be parsed even for errors\n alwaysCreateTextNode: false,\n isArray: () => false,\n commentPropName: false,\n unpairedTags: [],\n processEntities: true,\n htmlEntities: false,\n ignoreDeclaration: false,\n ignorePiTags: false,\n transformTagName: false,\n transformAttributeName: false,\n updateTag: function(tagName, jPath, attrs){\n return tagName\n },\n // skipEmptyListItem: false\n};\n \nconst buildOptions$1 = function(options) {\n return Object.assign({}, defaultOptions$2, options);\n};\n\nOptionsBuilder.buildOptions = buildOptions$1;\nOptionsBuilder.defaultOptions = defaultOptions$2;\n\nclass XmlNode{\n constructor(tagname) {\n this.tagname = tagname;\n this.child = []; //nested tags, text, cdata, comments in order\n this[\":@\"] = {}; //attributes map\n }\n add(key,val){\n // this.child.push( {name : key, val: val, isCdata: isCdata });\n if(key === \"__proto__\") key = \"#__proto__\";\n this.child.push( {[key]: val });\n }\n addChild(node) {\n if(node.tagname === \"__proto__\") node.tagname = \"#__proto__\";\n if(node[\":@\"] && Object.keys(node[\":@\"]).length > 0){\n this.child.push( { [node.tagname]: node.child, [\":@\"]: node[\":@\"] });\n }else {\n this.child.push( { [node.tagname]: node.child });\n }\n };\n}\n\nvar xmlNode$1 = XmlNode;\n\n//TODO: handle comments\nfunction readDocType$1(xmlData, i){\n \n const entities = {};\n if( xmlData[i + 3] === 'O' &&\n xmlData[i + 4] === 'C' &&\n xmlData[i + 5] === 'T' &&\n xmlData[i + 6] === 'Y' &&\n xmlData[i + 7] === 'P' &&\n xmlData[i + 8] === 'E')\n { \n i = i+9;\n let angleBracketsCount = 1;\n let hasBody = false, comment = false;\n let exp = \"\";\n for(;i') { //Read tag content\n if(comment){\n if( xmlData[i - 1] === \"-\" && xmlData[i - 2] === \"-\"){\n comment = false;\n angleBracketsCount--;\n }\n }else {\n angleBracketsCount--;\n }\n if (angleBracketsCount === 0) {\n break;\n }\n }else if( xmlData[i] === '['){\n hasBody = true;\n }else {\n exp += xmlData[i];\n }\n }\n if(angleBracketsCount !== 0){\n throw new Error(`Unclosed DOCTYPE`);\n }\n }else {\n throw new Error(`Invalid Tag instead of DOCTYPE`);\n }\n return {entities, i};\n}\n\nfunction readEntityExp(xmlData,i){\n //External entities are not supported\n // \n\n //Parameter entities are not supported\n // \n\n //Internal entities are supported\n // \n \n //read EntityName\n let entityName = \"\";\n for (; i < xmlData.length && (xmlData[i] !== \"'\" && xmlData[i] !== '\"' ); i++) {\n // if(xmlData[i] === \" \") continue;\n // else \n entityName += xmlData[i];\n }\n entityName = entityName.trim();\n if(entityName.indexOf(\" \") !== -1) throw new Error(\"External entites are not supported\");\n\n //read Entity Value\n const startChar = xmlData[i++];\n let val = \"\";\n for (; i < xmlData.length && xmlData[i] !== startChar ; i++) {\n val += xmlData[i];\n }\n return [entityName, val, i];\n}\n\nfunction isComment(xmlData, i){\n if(xmlData[i+1] === '!' &&\n xmlData[i+2] === '-' &&\n xmlData[i+3] === '-') return true\n return false\n}\nfunction isEntity(xmlData, i){\n if(xmlData[i+1] === '!' &&\n xmlData[i+2] === 'E' &&\n xmlData[i+3] === 'N' &&\n xmlData[i+4] === 'T' &&\n xmlData[i+5] === 'I' &&\n xmlData[i+6] === 'T' &&\n xmlData[i+7] === 'Y') return true\n return false\n}\nfunction isElement(xmlData, i){\n if(xmlData[i+1] === '!' &&\n xmlData[i+2] === 'E' &&\n xmlData[i+3] === 'L' &&\n xmlData[i+4] === 'E' &&\n xmlData[i+5] === 'M' &&\n xmlData[i+6] === 'E' &&\n xmlData[i+7] === 'N' &&\n xmlData[i+8] === 'T') return true\n return false\n}\n\nfunction isAttlist(xmlData, i){\n if(xmlData[i+1] === '!' &&\n xmlData[i+2] === 'A' &&\n xmlData[i+3] === 'T' &&\n xmlData[i+4] === 'T' &&\n xmlData[i+5] === 'L' &&\n xmlData[i+6] === 'I' &&\n xmlData[i+7] === 'S' &&\n xmlData[i+8] === 'T') return true\n return false\n}\nfunction isNotation(xmlData, i){\n if(xmlData[i+1] === '!' &&\n xmlData[i+2] === 'N' &&\n xmlData[i+3] === 'O' &&\n xmlData[i+4] === 'T' &&\n xmlData[i+5] === 'A' &&\n xmlData[i+6] === 'T' &&\n xmlData[i+7] === 'I' &&\n xmlData[i+8] === 'O' &&\n xmlData[i+9] === 'N') return true\n return false\n}\n\n//an entity name should not contains special characters that may be used in regex\n//Eg !?\\\\\\/[]$%{}^&*()<>\nconst specialChar = \"!?\\\\\\/[]$%{}^&*()<>|+\";\n\nfunction validateEntityName(name){\n for (let i = 0; i < specialChar.length; i++) {\n const ch = specialChar[i];\n if(name.indexOf(ch) !== -1) throw new Error(`Invalid character ${ch} in entity name`);\n }\n return name;\n}\n\nvar DocTypeReader = readDocType$1;\n\nconst hexRegex = /^[-+]?0x[a-fA-F0-9]+$/;\nconst numRegex = /^([\\-\\+])?(0*)(\\.[0-9]+([eE]\\-?[0-9]+)?|[0-9]+(\\.[0-9]+([eE]\\-?[0-9]+)?)?)$/;\n// const octRegex = /0x[a-z0-9]+/;\n// const binRegex = /0x[a-z0-9]+/;\n\n\n//polyfill\nif (!Number.parseInt && window.parseInt) {\n Number.parseInt = window.parseInt;\n}\nif (!Number.parseFloat && window.parseFloat) {\n Number.parseFloat = window.parseFloat;\n}\n\n \nconst consider = {\n hex : true,\n leadingZeros: true,\n decimalPoint: \"\\.\",\n eNotation: true\n //skipLike: /regex/\n};\n\nfunction toNumber$1(str, options = {}){\n // const options = Object.assign({}, consider);\n // if(opt.leadingZeros === false){\n // options.leadingZeros = false;\n // }else if(opt.hex === false){\n // options.hex = false;\n // }\n\n options = Object.assign({}, consider, options );\n if(!str || typeof str !== \"string\" ) return str;\n \n let trimmedStr = str.trim();\n // if(trimmedStr === \"0.0\") return 0;\n // else if(trimmedStr === \"+0.0\") return 0;\n // else if(trimmedStr === \"-0.0\") return -0;\n\n if(options.skipLike !== undefined && options.skipLike.test(trimmedStr)) return str;\n else if (options.hex && hexRegex.test(trimmedStr)) {\n return Number.parseInt(trimmedStr, 16);\n // } else if (options.parseOct && octRegex.test(str)) {\n // return Number.parseInt(val, 8);\n // }else if (options.parseBin && binRegex.test(str)) {\n // return Number.parseInt(val, 2);\n }else {\n //separate negative sign, leading zeros, and rest number\n const match = numRegex.exec(trimmedStr);\n if(match){\n const sign = match[1];\n const leadingZeros = match[2];\n let numTrimmedByZeros = trimZeros(match[3]); //complete num without leading zeros\n //trim ending zeros for floating number\n \n const eNotation = match[4] || match[6];\n if(!options.leadingZeros && leadingZeros.length > 0 && sign && trimmedStr[2] !== \".\") return str; //-0123\n else if(!options.leadingZeros && leadingZeros.length > 0 && !sign && trimmedStr[1] !== \".\") return str; //0123\n else {//no leading zeros or leading zeros are allowed\n const num = Number(trimmedStr);\n const numStr = \"\" + num;\n if(numStr.search(/[eE]/) !== -1){ //given number is long and parsed to eNotation\n if(options.eNotation) return num;\n else return str;\n }else if(eNotation){ //given number has enotation\n if(options.eNotation) return num;\n else return str;\n }else if(trimmedStr.indexOf(\".\") !== -1){ //floating number\n // const decimalPart = match[5].substr(1);\n // const intPart = trimmedStr.substr(0,trimmedStr.indexOf(\".\"));\n\n \n // const p = numStr.indexOf(\".\");\n // const givenIntPart = numStr.substr(0,p);\n // const givenDecPart = numStr.substr(p+1);\n if(numStr === \"0\" && (numTrimmedByZeros === \"\") ) return num; //0.0\n else if(numStr === numTrimmedByZeros) return num; //0.456. 0.79000\n else if( sign && numStr === \"-\"+numTrimmedByZeros) return num;\n else return str;\n }\n \n if(leadingZeros){\n // if(numTrimmedByZeros === numStr){\n // if(options.leadingZeros) return num;\n // else return str;\n // }else return str;\n if(numTrimmedByZeros === numStr) return num;\n else if(sign+numTrimmedByZeros === numStr) return num;\n else return str;\n }\n\n if(trimmedStr === numStr) return num;\n else if(trimmedStr === sign+numStr) return num;\n // else{\n // //number with +/- sign\n // trimmedStr.test(/[-+][0-9]);\n\n // }\n return str;\n }\n // else if(!eNotation && trimmedStr && trimmedStr !== Number(trimmedStr) ) return str;\n \n }else { //non-numeric string\n return str;\n }\n }\n}\n\n/**\n * \n * @param {string} numStr without leading zeros\n * @returns \n */\nfunction trimZeros(numStr){\n if(numStr && numStr.indexOf(\".\") !== -1){//float\n numStr = numStr.replace(/0+$/, \"\"); //remove ending zeros\n if(numStr === \".\") numStr = \"0\";\n else if(numStr[0] === \".\") numStr = \"0\"+numStr;\n else if(numStr[numStr.length-1] === \".\") numStr = numStr.substr(0,numStr.length-1);\n return numStr;\n }\n return numStr;\n}\nvar strnum = toNumber$1;\n\n///@ts-check\n\nconst util$2 = util$4;\nconst xmlNode = xmlNode$1;\nconst readDocType = DocTypeReader;\nconst toNumber = strnum;\n\n'<((!\\\\[CDATA\\\\[([\\\\s\\\\S]*?)(]]>))|((NAME:)?(NAME))([^>]*)>|((\\\\/)(NAME)\\\\s*>))([^<]*)'\n .replace(/NAME/g, util$2.nameRegexp);\n\n//const tagsRegx = new RegExp(\"<(\\\\/?[\\\\w:\\\\-\\._]+)([^>]*)>(\\\\s*\"+cdataRegx+\")*([^<]+)?\",\"g\");\n//const tagsRegx = new RegExp(\"<(\\\\/?)((\\\\w*:)?([\\\\w:\\\\-\\._]+))([^>]*)>([^<]*)(\"+cdataRegx+\"([^<]*))*([^<]+)?\",\"g\");\n\nclass OrderedObjParser$1{\n constructor(options){\n this.options = options;\n this.currentNode = null;\n this.tagsNodeStack = [];\n this.docTypeEntities = {};\n this.lastEntities = {\n \"apos\" : { regex: /&(apos|#39|#x27);/g, val : \"'\"},\n \"gt\" : { regex: /&(gt|#62|#x3E);/g, val : \">\"},\n \"lt\" : { regex: /&(lt|#60|#x3C);/g, val : \"<\"},\n \"quot\" : { regex: /&(quot|#34|#x22);/g, val : \"\\\"\"},\n };\n this.ampEntity = { regex: /&(amp|#38|#x26);/g, val : \"&\"};\n this.htmlEntities = {\n \"space\": { regex: /&(nbsp|#160);/g, val: \" \" },\n // \"lt\" : { regex: /&(lt|#60);/g, val: \"<\" },\n // \"gt\" : { regex: /&(gt|#62);/g, val: \">\" },\n // \"amp\" : { regex: /&(amp|#38);/g, val: \"&\" },\n // \"quot\" : { regex: /&(quot|#34);/g, val: \"\\\"\" },\n // \"apos\" : { regex: /&(apos|#39);/g, val: \"'\" },\n \"cent\" : { regex: /&(cent|#162);/g, val: \"¢\" },\n \"pound\" : { regex: /&(pound|#163);/g, val: \"£\" },\n \"yen\" : { regex: /&(yen|#165);/g, val: \"¥\" },\n \"euro\" : { regex: /&(euro|#8364);/g, val: \"€\" },\n \"copyright\" : { regex: /&(copy|#169);/g, val: \"©\" },\n \"reg\" : { regex: /&(reg|#174);/g, val: \"®\" },\n \"inr\" : { regex: /&(inr|#8377);/g, val: \"₹\" },\n };\n this.addExternalEntities = addExternalEntities;\n this.parseXml = parseXml;\n this.parseTextData = parseTextData;\n this.resolveNameSpace = resolveNameSpace;\n this.buildAttributesMap = buildAttributesMap;\n this.isItStopNode = isItStopNode;\n this.replaceEntitiesValue = replaceEntitiesValue$1;\n this.readStopNodeData = readStopNodeData;\n this.saveTextToParentTag = saveTextToParentTag;\n this.addChild = addChild;\n }\n\n}\n\nfunction addExternalEntities(externalEntities){\n const entKeys = Object.keys(externalEntities);\n for (let i = 0; i < entKeys.length; i++) {\n const ent = entKeys[i];\n this.lastEntities[ent] = {\n regex: new RegExp(\"&\"+ent+\";\",\"g\"),\n val : externalEntities[ent]\n };\n }\n}\n\n/**\n * @param {string} val\n * @param {string} tagName\n * @param {string} jPath\n * @param {boolean} dontTrim\n * @param {boolean} hasAttributes\n * @param {boolean} isLeafNode\n * @param {boolean} escapeEntities\n */\nfunction parseTextData(val, tagName, jPath, dontTrim, hasAttributes, isLeafNode, escapeEntities) {\n if (val !== undefined) {\n if (this.options.trimValues && !dontTrim) {\n val = val.trim();\n }\n if(val.length > 0){\n if(!escapeEntities) val = this.replaceEntitiesValue(val);\n \n const newval = this.options.tagValueProcessor(tagName, val, jPath, hasAttributes, isLeafNode);\n if(newval === null || newval === undefined){\n //don't parse\n return val;\n }else if(typeof newval !== typeof val || newval !== val){\n //overwrite\n return newval;\n }else if(this.options.trimValues){\n return parseValue(val, this.options.parseTagValue, this.options.numberParseOptions);\n }else {\n const trimmedVal = val.trim();\n if(trimmedVal === val){\n return parseValue(val, this.options.parseTagValue, this.options.numberParseOptions);\n }else {\n return val;\n }\n }\n }\n }\n}\n\nfunction resolveNameSpace(tagname) {\n if (this.options.removeNSPrefix) {\n const tags = tagname.split(':');\n const prefix = tagname.charAt(0) === '/' ? '/' : '';\n if (tags[0] === 'xmlns') {\n return '';\n }\n if (tags.length === 2) {\n tagname = prefix + tags[1];\n }\n }\n return tagname;\n}\n\n//TODO: change regex to capture NS\n//const attrsRegx = new RegExp(\"([\\\\w\\\\-\\\\.\\\\:]+)\\\\s*=\\\\s*(['\\\"])((.|\\n)*?)\\\\2\",\"gm\");\nconst attrsRegx = new RegExp('([^\\\\s=]+)\\\\s*(=\\\\s*([\\'\"])([\\\\s\\\\S]*?)\\\\3)?', 'gm');\n\nfunction buildAttributesMap(attrStr, jPath, tagName) {\n if (!this.options.ignoreAttributes && typeof attrStr === 'string') {\n // attrStr = attrStr.replace(/\\r?\\n/g, ' ');\n //attrStr = attrStr || attrStr.trim();\n\n const matches = util$2.getAllMatches(attrStr, attrsRegx);\n const len = matches.length; //don't make it inline\n const attrs = {};\n for (let i = 0; i < len; i++) {\n const attrName = this.resolveNameSpace(matches[i][1]);\n let oldVal = matches[i][4];\n let aName = this.options.attributeNamePrefix + attrName;\n if (attrName.length) {\n if (this.options.transformAttributeName) {\n aName = this.options.transformAttributeName(aName);\n }\n if(aName === \"__proto__\") aName = \"#__proto__\";\n if (oldVal !== undefined) {\n if (this.options.trimValues) {\n oldVal = oldVal.trim();\n }\n oldVal = this.replaceEntitiesValue(oldVal);\n const newVal = this.options.attributeValueProcessor(attrName, oldVal, jPath);\n if(newVal === null || newVal === undefined){\n //don't parse\n attrs[aName] = oldVal;\n }else if(typeof newVal !== typeof oldVal || newVal !== oldVal){\n //overwrite\n attrs[aName] = newVal;\n }else {\n //parse\n attrs[aName] = parseValue(\n oldVal,\n this.options.parseAttributeValue,\n this.options.numberParseOptions\n );\n }\n } else if (this.options.allowBooleanAttributes) {\n attrs[aName] = true;\n }\n }\n }\n if (!Object.keys(attrs).length) {\n return;\n }\n if (this.options.attributesGroupName) {\n const attrCollection = {};\n attrCollection[this.options.attributesGroupName] = attrs;\n return attrCollection;\n }\n return attrs\n }\n}\n\nconst parseXml = function(xmlData) {\n xmlData = xmlData.replace(/\\r\\n?/g, \"\\n\"); //TODO: remove this line\n const xmlObj = new xmlNode('!xml');\n let currentNode = xmlObj;\n let textData = \"\";\n let jPath = \"\";\n for(let i=0; i< xmlData.length; i++){//for each char in XML data\n const ch = xmlData[i];\n if(ch === '<'){\n // const nextIndex = i+1;\n // const _2ndChar = xmlData[nextIndex];\n if( xmlData[i+1] === '/') {//Closing Tag\n const closeIndex = findClosingIndex(xmlData, \">\", i, \"Closing Tag is not closed.\");\n let tagName = xmlData.substring(i+2,closeIndex).trim();\n\n if(this.options.removeNSPrefix){\n const colonIndex = tagName.indexOf(\":\");\n if(colonIndex !== -1){\n tagName = tagName.substr(colonIndex+1);\n }\n }\n\n if(this.options.transformTagName) {\n tagName = this.options.transformTagName(tagName);\n }\n\n if(currentNode){\n textData = this.saveTextToParentTag(textData, currentNode, jPath);\n }\n\n //check if last tag of nested tag was unpaired tag\n const lastTagName = jPath.substring(jPath.lastIndexOf(\".\")+1);\n if(tagName && this.options.unpairedTags.indexOf(tagName) !== -1 ){\n throw new Error(`Unpaired tag can not be used as closing tag: `);\n }\n let propIndex = 0;\n if(lastTagName && this.options.unpairedTags.indexOf(lastTagName) !== -1 ){\n propIndex = jPath.lastIndexOf('.', jPath.lastIndexOf('.')-1);\n this.tagsNodeStack.pop();\n }else {\n propIndex = jPath.lastIndexOf(\".\");\n }\n jPath = jPath.substring(0, propIndex);\n\n currentNode = this.tagsNodeStack.pop();//avoid recursion, set the parent tag scope\n textData = \"\";\n i = closeIndex;\n } else if( xmlData[i+1] === '?') {\n\n let tagData = readTagExp(xmlData,i, false, \"?>\");\n if(!tagData) throw new Error(\"Pi Tag is not closed.\");\n\n textData = this.saveTextToParentTag(textData, currentNode, jPath);\n if( (this.options.ignoreDeclaration && tagData.tagName === \"?xml\") || this.options.ignorePiTags);else {\n \n const childNode = new xmlNode(tagData.tagName);\n childNode.add(this.options.textNodeName, \"\");\n \n if(tagData.tagName !== tagData.tagExp && tagData.attrExpPresent){\n childNode[\":@\"] = this.buildAttributesMap(tagData.tagExp, jPath, tagData.tagName);\n }\n this.addChild(currentNode, childNode, jPath);\n\n }\n\n\n i = tagData.closeIndex + 1;\n } else if(xmlData.substr(i + 1, 3) === '!--') {\n const endIndex = findClosingIndex(xmlData, \"-->\", i+4, \"Comment is not closed.\");\n if(this.options.commentPropName){\n const comment = xmlData.substring(i + 4, endIndex - 2);\n\n textData = this.saveTextToParentTag(textData, currentNode, jPath);\n\n currentNode.add(this.options.commentPropName, [ { [this.options.textNodeName] : comment } ]);\n }\n i = endIndex;\n } else if( xmlData.substr(i + 1, 2) === '!D') {\n const result = readDocType(xmlData, i);\n this.docTypeEntities = result.entities;\n i = result.i;\n }else if(xmlData.substr(i + 1, 2) === '![') {\n const closeIndex = findClosingIndex(xmlData, \"]]>\", i, \"CDATA is not closed.\") - 2;\n const tagExp = xmlData.substring(i + 9,closeIndex);\n\n textData = this.saveTextToParentTag(textData, currentNode, jPath);\n\n //cdata should be set even if it is 0 length string\n if(this.options.cdataPropName){\n // let val = this.parseTextData(tagExp, this.options.cdataPropName, jPath + \".\" + this.options.cdataPropName, true, false, true);\n // if(!val) val = \"\";\n currentNode.add(this.options.cdataPropName, [ { [this.options.textNodeName] : tagExp } ]);\n }else {\n let val = this.parseTextData(tagExp, currentNode.tagname, jPath, true, false, true);\n if(val == undefined) val = \"\";\n currentNode.add(this.options.textNodeName, val);\n }\n \n i = closeIndex + 2;\n }else {//Opening tag\n let result = readTagExp(xmlData,i, this.options.removeNSPrefix);\n let tagName= result.tagName;\n let tagExp = result.tagExp;\n let attrExpPresent = result.attrExpPresent;\n let closeIndex = result.closeIndex;\n\n if (this.options.transformTagName) {\n tagName = this.options.transformTagName(tagName);\n }\n \n //save text as child node\n if (currentNode && textData) {\n if(currentNode.tagname !== '!xml'){\n //when nested tag is found\n textData = this.saveTextToParentTag(textData, currentNode, jPath, false);\n }\n }\n\n //check if last tag was unpaired tag\n const lastTag = currentNode;\n if(lastTag && this.options.unpairedTags.indexOf(lastTag.tagname) !== -1 ){\n currentNode = this.tagsNodeStack.pop();\n jPath = jPath.substring(0, jPath.lastIndexOf(\".\"));\n }\n if(tagName !== xmlObj.tagname){\n jPath += jPath ? \".\" + tagName : tagName;\n }\n if (this.isItStopNode(this.options.stopNodes, jPath, tagName)) { //TODO: namespace\n let tagContent = \"\";\n //self-closing tag\n if(tagExp.length > 0 && tagExp.lastIndexOf(\"/\") === tagExp.length - 1){\n i = result.closeIndex;\n }\n //unpaired tag\n else if(this.options.unpairedTags.indexOf(tagName) !== -1){\n i = result.closeIndex;\n }\n //normal tag\n else {\n //read until closing tag is found\n const result = this.readStopNodeData(xmlData, tagName, closeIndex + 1);\n if(!result) throw new Error(`Unexpected end of ${tagName}`);\n i = result.i;\n tagContent = result.tagContent;\n }\n\n const childNode = new xmlNode(tagName);\n if(tagName !== tagExp && attrExpPresent){\n childNode[\":@\"] = this.buildAttributesMap(tagExp, jPath, tagName);\n }\n if(tagContent) {\n tagContent = this.parseTextData(tagContent, tagName, jPath, true, attrExpPresent, true, true);\n }\n \n jPath = jPath.substr(0, jPath.lastIndexOf(\".\"));\n childNode.add(this.options.textNodeName, tagContent);\n \n this.addChild(currentNode, childNode, jPath);\n }else {\n //selfClosing tag\n if(tagExp.length > 0 && tagExp.lastIndexOf(\"/\") === tagExp.length - 1){\n if(tagName[tagName.length - 1] === \"/\"){ //remove trailing '/'\n tagName = tagName.substr(0, tagName.length - 1);\n tagExp = tagName;\n }else {\n tagExp = tagExp.substr(0, tagExp.length - 1);\n }\n \n if(this.options.transformTagName) {\n tagName = this.options.transformTagName(tagName);\n }\n\n const childNode = new xmlNode(tagName);\n if(tagName !== tagExp && attrExpPresent){\n childNode[\":@\"] = this.buildAttributesMap(tagExp, jPath, tagName);\n }\n this.addChild(currentNode, childNode, jPath);\n jPath = jPath.substr(0, jPath.lastIndexOf(\".\"));\n }\n //opening tag\n else {\n const childNode = new xmlNode( tagName);\n this.tagsNodeStack.push(currentNode);\n \n if(tagName !== tagExp && attrExpPresent){\n childNode[\":@\"] = this.buildAttributesMap(tagExp, jPath, tagName);\n }\n this.addChild(currentNode, childNode, jPath);\n currentNode = childNode;\n }\n textData = \"\";\n i = closeIndex;\n }\n }\n }else {\n textData += xmlData[i];\n }\n }\n return xmlObj.child;\n};\n\nfunction addChild(currentNode, childNode, jPath){\n const result = this.options.updateTag(childNode.tagname, jPath, childNode[\":@\"]);\n if(result === false);else if(typeof result === \"string\"){\n childNode.tagname = result;\n currentNode.addChild(childNode);\n }else {\n currentNode.addChild(childNode);\n }\n}\n\nconst replaceEntitiesValue$1 = function(val){\n\n if(this.options.processEntities){\n for(let entityName in this.docTypeEntities){\n const entity = this.docTypeEntities[entityName];\n val = val.replace( entity.regx, entity.val);\n }\n for(let entityName in this.lastEntities){\n const entity = this.lastEntities[entityName];\n val = val.replace( entity.regex, entity.val);\n }\n if(this.options.htmlEntities){\n for(let entityName in this.htmlEntities){\n const entity = this.htmlEntities[entityName];\n val = val.replace( entity.regex, entity.val);\n }\n }\n val = val.replace( this.ampEntity.regex, this.ampEntity.val);\n }\n return val;\n};\nfunction saveTextToParentTag(textData, currentNode, jPath, isLeafNode) {\n if (textData) { //store previously collected data as textNode\n if(isLeafNode === undefined) isLeafNode = Object.keys(currentNode.child).length === 0;\n \n textData = this.parseTextData(textData,\n currentNode.tagname,\n jPath,\n false,\n currentNode[\":@\"] ? Object.keys(currentNode[\":@\"]).length !== 0 : false,\n isLeafNode);\n\n if (textData !== undefined && textData !== \"\")\n currentNode.add(this.options.textNodeName, textData);\n textData = \"\";\n }\n return textData;\n}\n\n//TODO: use jPath to simplify the logic\n/**\n * \n * @param {string[]} stopNodes \n * @param {string} jPath\n * @param {string} currentTagName \n */\nfunction isItStopNode(stopNodes, jPath, currentTagName){\n const allNodesExp = \"*.\" + currentTagName;\n for (const stopNodePath in stopNodes) {\n const stopNodeExp = stopNodes[stopNodePath];\n if( allNodesExp === stopNodeExp || jPath === stopNodeExp ) return true;\n }\n return false;\n}\n\n/**\n * Returns the tag Expression and where it is ending handling single-double quotes situation\n * @param {string} xmlData \n * @param {number} i starting index\n * @returns \n */\nfunction tagExpWithClosingIndex(xmlData, i, closingChar = \">\"){\n let attrBoundary;\n let tagExp = \"\";\n for (let index = i; index < xmlData.length; index++) {\n let ch = xmlData[index];\n if (attrBoundary) {\n if (ch === attrBoundary) attrBoundary = \"\";//reset\n } else if (ch === '\"' || ch === \"'\") {\n attrBoundary = ch;\n } else if (ch === closingChar[0]) {\n if(closingChar[1]){\n if(xmlData[index + 1] === closingChar[1]){\n return {\n data: tagExp,\n index: index\n }\n }\n }else {\n return {\n data: tagExp,\n index: index\n }\n }\n } else if (ch === '\\t') {\n ch = \" \";\n }\n tagExp += ch;\n }\n}\n\nfunction findClosingIndex(xmlData, str, i, errMsg){\n const closingIndex = xmlData.indexOf(str, i);\n if(closingIndex === -1){\n throw new Error(errMsg)\n }else {\n return closingIndex + str.length - 1;\n }\n}\n\nfunction readTagExp(xmlData,i, removeNSPrefix, closingChar = \">\"){\n const result = tagExpWithClosingIndex(xmlData, i+1, closingChar);\n if(!result) return;\n let tagExp = result.data;\n const closeIndex = result.index;\n const separatorIndex = tagExp.search(/\\s/);\n let tagName = tagExp;\n let attrExpPresent = true;\n if(separatorIndex !== -1){//separate tag name and attributes expression\n tagName = tagExp.substr(0, separatorIndex).replace(/\\s\\s*$/, '');\n tagExp = tagExp.substr(separatorIndex + 1);\n }\n\n if(removeNSPrefix){\n const colonIndex = tagName.indexOf(\":\");\n if(colonIndex !== -1){\n tagName = tagName.substr(colonIndex+1);\n attrExpPresent = tagName !== result.data.substr(colonIndex + 1);\n }\n }\n\n return {\n tagName: tagName,\n tagExp: tagExp,\n closeIndex: closeIndex,\n attrExpPresent: attrExpPresent,\n }\n}\n/**\n * find paired tag for a stop node\n * @param {string} xmlData \n * @param {string} tagName \n * @param {number} i \n */\nfunction readStopNodeData(xmlData, tagName, i){\n const startIndex = i;\n // Starting at 1 since we already have an open tag\n let openTagCount = 1;\n\n for (; i < xmlData.length; i++) {\n if( xmlData[i] === \"<\"){ \n if (xmlData[i+1] === \"/\") {//close tag\n const closeIndex = findClosingIndex(xmlData, \">\", i, `${tagName} is not closed`);\n let closeTagName = xmlData.substring(i+2,closeIndex).trim();\n if(closeTagName === tagName){\n openTagCount--;\n if (openTagCount === 0) {\n return {\n tagContent: xmlData.substring(startIndex, i),\n i : closeIndex\n }\n }\n }\n i=closeIndex;\n } else if(xmlData[i+1] === '?') { \n const closeIndex = findClosingIndex(xmlData, \"?>\", i+1, \"StopNode is not closed.\");\n i=closeIndex;\n } else if(xmlData.substr(i + 1, 3) === '!--') { \n const closeIndex = findClosingIndex(xmlData, \"-->\", i+3, \"StopNode is not closed.\");\n i=closeIndex;\n } else if(xmlData.substr(i + 1, 2) === '![') { \n const closeIndex = findClosingIndex(xmlData, \"]]>\", i, \"StopNode is not closed.\") - 2;\n i=closeIndex;\n } else {\n const tagData = readTagExp(xmlData, i, '>');\n\n if (tagData) {\n const openTagName = tagData && tagData.tagName;\n if (openTagName === tagName && tagData.tagExp[tagData.tagExp.length-1] !== \"/\") {\n openTagCount++;\n }\n i=tagData.closeIndex;\n }\n }\n }\n }//end for loop\n}\n\nfunction parseValue(val, shouldParse, options) {\n if (shouldParse && typeof val === 'string') {\n //console.log(options)\n const newval = val.trim();\n if(newval === 'true' ) return true;\n else if(newval === 'false' ) return false;\n else return toNumber(val, options);\n } else {\n if (util$2.isExist(val)) {\n return val;\n } else {\n return '';\n }\n }\n}\n\n\nvar OrderedObjParser_1 = OrderedObjParser$1;\n\nvar node2json = {};\n\n/**\n * \n * @param {array} node \n * @param {any} options \n * @returns \n */\nfunction prettify$1(node, options){\n return compress( node, options);\n}\n\n/**\n * \n * @param {array} arr \n * @param {object} options \n * @param {string} jPath \n * @returns object\n */\nfunction compress(arr, options, jPath){\n let text;\n const compressedObj = {};\n for (let i = 0; i < arr.length; i++) {\n const tagObj = arr[i];\n const property = propName$1(tagObj);\n let newJpath = \"\";\n if(jPath === undefined) newJpath = property;\n else newJpath = jPath + \".\" + property;\n\n if(property === options.textNodeName){\n if(text === undefined) text = tagObj[property];\n else text += \"\" + tagObj[property];\n }else if(property === undefined){\n continue;\n }else if(tagObj[property]){\n \n let val = compress(tagObj[property], options, newJpath);\n const isLeaf = isLeafTag(val, options);\n\n if(tagObj[\":@\"]){\n assignAttributes( val, tagObj[\":@\"], newJpath, options);\n }else if(Object.keys(val).length === 1 && val[options.textNodeName] !== undefined && !options.alwaysCreateTextNode){\n val = val[options.textNodeName];\n }else if(Object.keys(val).length === 0){\n if(options.alwaysCreateTextNode) val[options.textNodeName] = \"\";\n else val = \"\";\n }\n\n if(compressedObj[property] !== undefined && compressedObj.hasOwnProperty(property)) {\n if(!Array.isArray(compressedObj[property])) {\n compressedObj[property] = [ compressedObj[property] ];\n }\n compressedObj[property].push(val);\n }else {\n //TODO: if a node is not an array, then check if it should be an array\n //also determine if it is a leaf node\n if (options.isArray(property, newJpath, isLeaf )) {\n compressedObj[property] = [val];\n }else {\n compressedObj[property] = val;\n }\n }\n }\n \n }\n // if(text && text.length > 0) compressedObj[options.textNodeName] = text;\n if(typeof text === \"string\"){\n if(text.length > 0) compressedObj[options.textNodeName] = text;\n }else if(text !== undefined) compressedObj[options.textNodeName] = text;\n return compressedObj;\n}\n\nfunction propName$1(obj){\n const keys = Object.keys(obj);\n for (let i = 0; i < keys.length; i++) {\n const key = keys[i];\n if(key !== \":@\") return key;\n }\n}\n\nfunction assignAttributes(obj, attrMap, jpath, options){\n if (attrMap) {\n const keys = Object.keys(attrMap);\n const len = keys.length; //don't make it inline\n for (let i = 0; i < len; i++) {\n const atrrName = keys[i];\n if (options.isArray(atrrName, jpath + \".\" + atrrName, true, true)) {\n obj[atrrName] = [ attrMap[atrrName] ];\n } else {\n obj[atrrName] = attrMap[atrrName];\n }\n }\n }\n}\n\nfunction isLeafTag(obj, options){\n const { textNodeName } = options;\n const propCount = Object.keys(obj).length;\n \n if (propCount === 0) {\n return true;\n }\n\n if (\n propCount === 1 &&\n (obj[textNodeName] || typeof obj[textNodeName] === \"boolean\" || obj[textNodeName] === 0)\n ) {\n return true;\n }\n\n return false;\n}\nnode2json.prettify = prettify$1;\n\nconst { buildOptions} = OptionsBuilder;\nconst OrderedObjParser = OrderedObjParser_1;\nconst { prettify} = node2json;\nconst validator$1 = validator$2;\n\nclass XMLParser$1{\n \n constructor(options){\n this.externalEntities = {};\n this.options = buildOptions(options);\n \n }\n /**\n * Parse XML dats to JS object \n * @param {string|Buffer} xmlData \n * @param {boolean|Object} validationOption \n */\n parse(xmlData,validationOption){\n if(typeof xmlData === \"string\");else if( xmlData.toString){\n xmlData = xmlData.toString();\n }else {\n throw new Error(\"XML data is accepted in String or Bytes[] form.\")\n }\n if( validationOption){\n if(validationOption === true) validationOption = {}; //validate with default options\n \n const result = validator$1.validate(xmlData, validationOption);\n if (result !== true) {\n throw Error( `${result.err.msg}:${result.err.line}:${result.err.col}` )\n }\n }\n const orderedObjParser = new OrderedObjParser(this.options);\n orderedObjParser.addExternalEntities(this.externalEntities);\n const orderedResult = orderedObjParser.parseXml(xmlData);\n if(this.options.preserveOrder || orderedResult === undefined) return orderedResult;\n else return prettify(orderedResult, this.options);\n }\n\n /**\n * Add Entity which is not by default supported by this library\n * @param {string} key \n * @param {string} value \n */\n addEntity(key, value){\n if(value.indexOf(\"&\") !== -1){\n throw new Error(\"Entity value can't have '&'\")\n }else if(key.indexOf(\"&\") !== -1 || key.indexOf(\";\") !== -1){\n throw new Error(\"An entity must be set without '&' and ';'. Eg. use '#xD' for ' '\")\n }else if(value === \"&\"){\n throw new Error(\"An entity with value '&' is not permitted\");\n }else {\n this.externalEntities[key] = value;\n }\n }\n}\n\nvar XMLParser_1 = XMLParser$1;\n\nconst EOL = \"\\n\";\n\n/**\n * \n * @param {array} jArray \n * @param {any} options \n * @returns \n */\nfunction toXml(jArray, options) {\n let indentation = \"\";\n if (options.format && options.indentBy.length > 0) {\n indentation = EOL;\n }\n return arrToStr(jArray, options, \"\", indentation);\n}\n\nfunction arrToStr(arr, options, jPath, indentation) {\n let xmlStr = \"\";\n let isPreviousElementTag = false;\n\n for (let i = 0; i < arr.length; i++) {\n const tagObj = arr[i];\n const tagName = propName(tagObj);\n let newJPath = \"\";\n if (jPath.length === 0) newJPath = tagName;\n else newJPath = `${jPath}.${tagName}`;\n\n if (tagName === options.textNodeName) {\n let tagText = tagObj[tagName];\n if (!isStopNode(newJPath, options)) {\n tagText = options.tagValueProcessor(tagName, tagText);\n tagText = replaceEntitiesValue(tagText, options);\n }\n if (isPreviousElementTag) {\n xmlStr += indentation;\n }\n xmlStr += tagText;\n isPreviousElementTag = false;\n continue;\n } else if (tagName === options.cdataPropName) {\n if (isPreviousElementTag) {\n xmlStr += indentation;\n }\n xmlStr += ``;\n isPreviousElementTag = false;\n continue;\n } else if (tagName === options.commentPropName) {\n xmlStr += indentation + ``;\n isPreviousElementTag = true;\n continue;\n } else if (tagName[0] === \"?\") {\n const attStr = attr_to_str(tagObj[\":@\"], options);\n const tempInd = tagName === \"?xml\" ? \"\" : indentation;\n let piTextNodeName = tagObj[tagName][0][options.textNodeName];\n piTextNodeName = piTextNodeName.length !== 0 ? \" \" + piTextNodeName : \"\"; //remove extra spacing\n xmlStr += tempInd + `<${tagName}${piTextNodeName}${attStr}?>`;\n isPreviousElementTag = true;\n continue;\n }\n let newIdentation = indentation;\n if (newIdentation !== \"\") {\n newIdentation += options.indentBy;\n }\n const attStr = attr_to_str(tagObj[\":@\"], options);\n const tagStart = indentation + `<${tagName}${attStr}`;\n const tagValue = arrToStr(tagObj[tagName], options, newJPath, newIdentation);\n if (options.unpairedTags.indexOf(tagName) !== -1) {\n if (options.suppressUnpairedNode) xmlStr += tagStart + \">\";\n else xmlStr += tagStart + \"/>\";\n } else if ((!tagValue || tagValue.length === 0) && options.suppressEmptyNode) {\n xmlStr += tagStart + \"/>\";\n } else if (tagValue && tagValue.endsWith(\">\")) {\n xmlStr += tagStart + `>${tagValue}${indentation}`;\n } else {\n xmlStr += tagStart + \">\";\n if (tagValue && indentation !== \"\" && (tagValue.includes(\"/>\") || tagValue.includes(\"`;\n }\n isPreviousElementTag = true;\n }\n\n return xmlStr;\n}\n\nfunction propName(obj) {\n const keys = Object.keys(obj);\n for (let i = 0; i < keys.length; i++) {\n const key = keys[i];\n if (key !== \":@\") return key;\n }\n}\n\nfunction attr_to_str(attrMap, options) {\n let attrStr = \"\";\n if (attrMap && !options.ignoreAttributes) {\n for (let attr in attrMap) {\n let attrVal = options.attributeValueProcessor(attr, attrMap[attr]);\n attrVal = replaceEntitiesValue(attrVal, options);\n if (attrVal === true && options.suppressBooleanAttributes) {\n attrStr += ` ${attr.substr(options.attributeNamePrefix.length)}`;\n } else {\n attrStr += ` ${attr.substr(options.attributeNamePrefix.length)}=\"${attrVal}\"`;\n }\n }\n }\n return attrStr;\n}\n\nfunction isStopNode(jPath, options) {\n jPath = jPath.substr(0, jPath.length - options.textNodeName.length - 1);\n let tagName = jPath.substr(jPath.lastIndexOf(\".\") + 1);\n for (let index in options.stopNodes) {\n if (options.stopNodes[index] === jPath || options.stopNodes[index] === \"*.\" + tagName) return true;\n }\n return false;\n}\n\nfunction replaceEntitiesValue(textValue, options) {\n if (textValue && textValue.length > 0 && options.processEntities) {\n for (let i = 0; i < options.entities.length; i++) {\n const entity = options.entities[i];\n textValue = textValue.replace(entity.regex, entity.val);\n }\n }\n return textValue;\n}\nvar orderedJs2Xml = toXml;\n\n//parse Empty Node as self closing node\nconst buildFromOrderedJs = orderedJs2Xml;\n\nconst defaultOptions$1 = {\n attributeNamePrefix: '@_',\n attributesGroupName: false,\n textNodeName: '#text',\n ignoreAttributes: true,\n cdataPropName: false,\n format: false,\n indentBy: ' ',\n suppressEmptyNode: false,\n suppressUnpairedNode: true,\n suppressBooleanAttributes: true,\n tagValueProcessor: function(key, a) {\n return a;\n },\n attributeValueProcessor: function(attrName, a) {\n return a;\n },\n preserveOrder: false,\n commentPropName: false,\n unpairedTags: [],\n entities: [\n { regex: new RegExp(\"&\", \"g\"), val: \"&\" },//it must be on top\n { regex: new RegExp(\">\", \"g\"), val: \">\" },\n { regex: new RegExp(\"<\", \"g\"), val: \"<\" },\n { regex: new RegExp(\"\\'\", \"g\"), val: \"'\" },\n { regex: new RegExp(\"\\\"\", \"g\"), val: \""\" }\n ],\n processEntities: true,\n stopNodes: [],\n // transformTagName: false,\n // transformAttributeName: false,\n oneListGroup: false\n};\n\nfunction Builder(options) {\n this.options = Object.assign({}, defaultOptions$1, options);\n if (this.options.ignoreAttributes || this.options.attributesGroupName) {\n this.isAttribute = function(/*a*/) {\n return false;\n };\n } else {\n this.attrPrefixLen = this.options.attributeNamePrefix.length;\n this.isAttribute = isAttribute;\n }\n\n this.processTextOrObjNode = processTextOrObjNode;\n\n if (this.options.format) {\n this.indentate = indentate;\n this.tagEndChar = '>\\n';\n this.newLine = '\\n';\n } else {\n this.indentate = function() {\n return '';\n };\n this.tagEndChar = '>';\n this.newLine = '';\n }\n}\n\nBuilder.prototype.build = function(jObj) {\n if(this.options.preserveOrder){\n return buildFromOrderedJs(jObj, this.options);\n }else {\n if(Array.isArray(jObj) && this.options.arrayNodeName && this.options.arrayNodeName.length > 1){\n jObj = {\n [this.options.arrayNodeName] : jObj\n };\n }\n return this.j2x(jObj, 0).val;\n }\n};\n\nBuilder.prototype.j2x = function(jObj, level) {\n let attrStr = '';\n let val = '';\n for (let key in jObj) {\n if (typeof jObj[key] === 'undefined') ; else if (jObj[key] === null) {\n if(key[0] === \"?\") val += this.indentate(level) + '<' + key + '?' + this.tagEndChar;\n else val += this.indentate(level) + '<' + key + '/' + this.tagEndChar;\n // val += this.indentate(level) + '<' + key + '/' + this.tagEndChar;\n } else if (jObj[key] instanceof Date) {\n val += this.buildTextValNode(jObj[key], key, '', level);\n } else if (typeof jObj[key] !== 'object') {\n //premitive type\n const attr = this.isAttribute(key);\n if (attr) {\n attrStr += this.buildAttrPairStr(attr, '' + jObj[key]);\n }else {\n //tag value\n if (key === this.options.textNodeName) {\n let newval = this.options.tagValueProcessor(key, '' + jObj[key]);\n val += this.replaceEntitiesValue(newval);\n } else {\n val += this.buildTextValNode(jObj[key], key, '', level);\n }\n }\n } else if (Array.isArray(jObj[key])) {\n //repeated nodes\n const arrLen = jObj[key].length;\n let listTagVal = \"\";\n for (let j = 0; j < arrLen; j++) {\n const item = jObj[key][j];\n if (typeof item === 'undefined') ; else if (item === null) {\n if(key[0] === \"?\") val += this.indentate(level) + '<' + key + '?' + this.tagEndChar;\n else val += this.indentate(level) + '<' + key + '/' + this.tagEndChar;\n // val += this.indentate(level) + '<' + key + '/' + this.tagEndChar;\n } else if (typeof item === 'object') {\n if(this.options.oneListGroup ){\n listTagVal += this.j2x(item, level + 1).val;\n }else {\n listTagVal += this.processTextOrObjNode(item, key, level);\n }\n } else {\n listTagVal += this.buildTextValNode(item, key, '', level);\n }\n }\n if(this.options.oneListGroup){\n listTagVal = this.buildObjectNode(listTagVal, key, '', level);\n }\n val += listTagVal;\n } else {\n //nested node\n if (this.options.attributesGroupName && key === this.options.attributesGroupName) {\n const Ks = Object.keys(jObj[key]);\n const L = Ks.length;\n for (let j = 0; j < L; j++) {\n attrStr += this.buildAttrPairStr(Ks[j], '' + jObj[key][Ks[j]]);\n }\n } else {\n val += this.processTextOrObjNode(jObj[key], key, level);\n }\n }\n }\n return {attrStr: attrStr, val: val};\n};\n\nBuilder.prototype.buildAttrPairStr = function(attrName, val){\n val = this.options.attributeValueProcessor(attrName, '' + val);\n val = this.replaceEntitiesValue(val);\n if (this.options.suppressBooleanAttributes && val === \"true\") {\n return ' ' + attrName;\n } else return ' ' + attrName + '=\"' + val + '\"';\n};\n\nfunction processTextOrObjNode (object, key, level) {\n const result = this.j2x(object, level + 1);\n if (object[this.options.textNodeName] !== undefined && Object.keys(object).length === 1) {\n return this.buildTextValNode(object[this.options.textNodeName], key, result.attrStr, level);\n } else {\n return this.buildObjectNode(result.val, key, result.attrStr, level);\n }\n}\n\nBuilder.prototype.buildObjectNode = function(val, key, attrStr, level) {\n if(val === \"\"){\n if(key[0] === \"?\") return this.indentate(level) + '<' + key + attrStr+ '?' + this.tagEndChar;\n else {\n return this.indentate(level) + '<' + key + attrStr + this.closeTag(key) + this.tagEndChar;\n }\n }else {\n\n let tagEndExp = '' + val + tagEndExp );\n } else if (this.options.commentPropName !== false && key === this.options.commentPropName && piClosingChar.length === 0) {\n return this.indentate(level) + `` + this.newLine;\n }else {\n return (\n this.indentate(level) + '<' + key + attrStr + piClosingChar + this.tagEndChar +\n val +\n this.indentate(level) + tagEndExp );\n }\n }\n};\n\nBuilder.prototype.closeTag = function(key){\n let closeTag = \"\";\n if(this.options.unpairedTags.indexOf(key) !== -1){ //unpaired\n if(!this.options.suppressUnpairedNode) closeTag = \"/\";\n }else if(this.options.suppressEmptyNode){ //empty\n closeTag = \"/\";\n }else {\n closeTag = `>` + this.newLine;\n }else if (this.options.commentPropName !== false && key === this.options.commentPropName) {\n return this.indentate(level) + `` + this.newLine;\n }else if(key[0] === \"?\") {//PI tag\n return this.indentate(level) + '<' + key + attrStr+ '?' + this.tagEndChar; \n }else {\n let textValue = this.options.tagValueProcessor(key, val);\n textValue = this.replaceEntitiesValue(textValue);\n \n if( textValue === ''){\n return this.indentate(level) + '<' + key + attrStr + this.closeTag(key) + this.tagEndChar;\n }else {\n return this.indentate(level) + '<' + key + attrStr + '>' +\n textValue +\n ' 0 && this.options.processEntities){\n for (let i=0; i 0 && t[t.length - 1]) && (op[0] === 6 || op[0] === 2)) { _ = 0; continue; }\r\n if (op[0] === 3 && (!t || (op[1] > t[0] && op[1] < t[3]))) { _.label = op[1]; break; }\r\n if (op[0] === 6 && _.label < t[1]) { _.label = t[1]; t = op; break; }\r\n if (t && _.label < t[2]) { _.label = t[2]; _.ops.push(op); break; }\r\n if (t[2]) _.ops.pop();\r\n _.trys.pop(); continue;\r\n }\r\n op = body.call(thisArg, _);\r\n } catch (e) { op = [6, e]; y = 0; } finally { f = t = 0; }\r\n if (op[0] & 5) throw op[1]; return { value: op[0] ? op[1] : void 0, done: true };\r\n }\r\n}\n\nvar propTypes$2 = {exports: {}};\n\nvar reactIs = {exports: {}};\n\nvar reactIs_production_min = {};\n\n/** @license React v16.13.1\n * react-is.production.min.js\n *\n * Copyright (c) Facebook, Inc. and its affiliates.\n *\n * This source code is licensed under the MIT license found in the\n * LICENSE file in the root directory of this source tree.\n */\nvar b=\"function\"===typeof Symbol&&Symbol.for,c=b?Symbol.for(\"react.element\"):60103,d=b?Symbol.for(\"react.portal\"):60106,e$1=b?Symbol.for(\"react.fragment\"):60107,f=b?Symbol.for(\"react.strict_mode\"):60108,g=b?Symbol.for(\"react.profiler\"):60114,h$2=b?Symbol.for(\"react.provider\"):60109,k$1=b?Symbol.for(\"react.context\"):60110,l$1=b?Symbol.for(\"react.async_mode\"):60111,m$1=b?Symbol.for(\"react.concurrent_mode\"):60111,n$2=b?Symbol.for(\"react.forward_ref\"):60112,p$2=b?Symbol.for(\"react.suspense\"):60113,q$2=b?\nSymbol.for(\"react.suspense_list\"):60120,r$2=b?Symbol.for(\"react.memo\"):60115,t$2=b?Symbol.for(\"react.lazy\"):60116,v$1=b?Symbol.for(\"react.block\"):60121,w$1=b?Symbol.for(\"react.fundamental\"):60117,x=b?Symbol.for(\"react.responder\"):60118,y=b?Symbol.for(\"react.scope\"):60119;\nfunction z(a){if(\"object\"===typeof a&&null!==a){var u=a.$$typeof;switch(u){case c:switch(a=a.type,a){case l$1:case m$1:case e$1:case g:case f:case p$2:return a;default:switch(a=a&&a.$$typeof,a){case k$1:case n$2:case t$2:case r$2:case h$2:return a;default:return u}}case d:return u}}}function A(a){return z(a)===m$1}reactIs_production_min.AsyncMode=l$1;reactIs_production_min.ConcurrentMode=m$1;reactIs_production_min.ContextConsumer=k$1;reactIs_production_min.ContextProvider=h$2;reactIs_production_min.Element=c;reactIs_production_min.ForwardRef=n$2;reactIs_production_min.Fragment=e$1;reactIs_production_min.Lazy=t$2;reactIs_production_min.Memo=r$2;reactIs_production_min.Portal=d;\nreactIs_production_min.Profiler=g;reactIs_production_min.StrictMode=f;reactIs_production_min.Suspense=p$2;reactIs_production_min.isAsyncMode=function(a){return A(a)||z(a)===l$1};reactIs_production_min.isConcurrentMode=A;reactIs_production_min.isContextConsumer=function(a){return z(a)===k$1};reactIs_production_min.isContextProvider=function(a){return z(a)===h$2};reactIs_production_min.isElement=function(a){return \"object\"===typeof a&&null!==a&&a.$$typeof===c};reactIs_production_min.isForwardRef=function(a){return z(a)===n$2};reactIs_production_min.isFragment=function(a){return z(a)===e$1};reactIs_production_min.isLazy=function(a){return z(a)===t$2};\nreactIs_production_min.isMemo=function(a){return z(a)===r$2};reactIs_production_min.isPortal=function(a){return z(a)===d};reactIs_production_min.isProfiler=function(a){return z(a)===g};reactIs_production_min.isStrictMode=function(a){return z(a)===f};reactIs_production_min.isSuspense=function(a){return z(a)===p$2};\nreactIs_production_min.isValidElementType=function(a){return \"string\"===typeof a||\"function\"===typeof a||a===e$1||a===m$1||a===g||a===f||a===p$2||a===q$2||\"object\"===typeof a&&null!==a&&(a.$$typeof===t$2||a.$$typeof===r$2||a.$$typeof===h$2||a.$$typeof===k$1||a.$$typeof===n$2||a.$$typeof===w$1||a.$$typeof===x||a.$$typeof===y||a.$$typeof===v$1)};reactIs_production_min.typeOf=z;\n\nvar reactIs_development = {};\n\n/** @license React v16.13.1\n * react-is.development.js\n *\n * Copyright (c) Facebook, Inc. and its affiliates.\n *\n * This source code is licensed under the MIT license found in the\n * LICENSE file in the root directory of this source tree.\n */\n\n\n\nif (process.env.NODE_ENV !== \"production\") {\n (function() {\n\n// The Symbol used to tag the ReactElement-like types. If there is no native Symbol\n// nor polyfill, then a plain number is used for performance.\nvar hasSymbol = typeof Symbol === 'function' && Symbol.for;\nvar REACT_ELEMENT_TYPE = hasSymbol ? Symbol.for('react.element') : 0xeac7;\nvar REACT_PORTAL_TYPE = hasSymbol ? Symbol.for('react.portal') : 0xeaca;\nvar REACT_FRAGMENT_TYPE = hasSymbol ? Symbol.for('react.fragment') : 0xeacb;\nvar REACT_STRICT_MODE_TYPE = hasSymbol ? Symbol.for('react.strict_mode') : 0xeacc;\nvar REACT_PROFILER_TYPE = hasSymbol ? Symbol.for('react.profiler') : 0xead2;\nvar REACT_PROVIDER_TYPE = hasSymbol ? Symbol.for('react.provider') : 0xeacd;\nvar REACT_CONTEXT_TYPE = hasSymbol ? Symbol.for('react.context') : 0xeace; // TODO: We don't use AsyncMode or ConcurrentMode anymore. They were temporary\n// (unstable) APIs that have been removed. Can we remove the symbols?\n\nvar REACT_ASYNC_MODE_TYPE = hasSymbol ? Symbol.for('react.async_mode') : 0xeacf;\nvar REACT_CONCURRENT_MODE_TYPE = hasSymbol ? Symbol.for('react.concurrent_mode') : 0xeacf;\nvar REACT_FORWARD_REF_TYPE = hasSymbol ? Symbol.for('react.forward_ref') : 0xead0;\nvar REACT_SUSPENSE_TYPE = hasSymbol ? Symbol.for('react.suspense') : 0xead1;\nvar REACT_SUSPENSE_LIST_TYPE = hasSymbol ? Symbol.for('react.suspense_list') : 0xead8;\nvar REACT_MEMO_TYPE = hasSymbol ? Symbol.for('react.memo') : 0xead3;\nvar REACT_LAZY_TYPE = hasSymbol ? Symbol.for('react.lazy') : 0xead4;\nvar REACT_BLOCK_TYPE = hasSymbol ? Symbol.for('react.block') : 0xead9;\nvar REACT_FUNDAMENTAL_TYPE = hasSymbol ? Symbol.for('react.fundamental') : 0xead5;\nvar REACT_RESPONDER_TYPE = hasSymbol ? Symbol.for('react.responder') : 0xead6;\nvar REACT_SCOPE_TYPE = hasSymbol ? Symbol.for('react.scope') : 0xead7;\n\nfunction isValidElementType(type) {\n return typeof type === 'string' || typeof type === 'function' || // Note: its typeof might be other than 'symbol' or 'number' if it's a polyfill.\n type === REACT_FRAGMENT_TYPE || type === REACT_CONCURRENT_MODE_TYPE || type === REACT_PROFILER_TYPE || type === REACT_STRICT_MODE_TYPE || type === REACT_SUSPENSE_TYPE || type === REACT_SUSPENSE_LIST_TYPE || typeof type === 'object' && type !== null && (type.$$typeof === REACT_LAZY_TYPE || type.$$typeof === REACT_MEMO_TYPE || type.$$typeof === REACT_PROVIDER_TYPE || type.$$typeof === REACT_CONTEXT_TYPE || type.$$typeof === REACT_FORWARD_REF_TYPE || type.$$typeof === REACT_FUNDAMENTAL_TYPE || type.$$typeof === REACT_RESPONDER_TYPE || type.$$typeof === REACT_SCOPE_TYPE || type.$$typeof === REACT_BLOCK_TYPE);\n}\n\nfunction typeOf(object) {\n if (typeof object === 'object' && object !== null) {\n var $$typeof = object.$$typeof;\n\n switch ($$typeof) {\n case REACT_ELEMENT_TYPE:\n var type = object.type;\n\n switch (type) {\n case REACT_ASYNC_MODE_TYPE:\n case REACT_CONCURRENT_MODE_TYPE:\n case REACT_FRAGMENT_TYPE:\n case REACT_PROFILER_TYPE:\n case REACT_STRICT_MODE_TYPE:\n case REACT_SUSPENSE_TYPE:\n return type;\n\n default:\n var $$typeofType = type && type.$$typeof;\n\n switch ($$typeofType) {\n case REACT_CONTEXT_TYPE:\n case REACT_FORWARD_REF_TYPE:\n case REACT_LAZY_TYPE:\n case REACT_MEMO_TYPE:\n case REACT_PROVIDER_TYPE:\n return $$typeofType;\n\n default:\n return $$typeof;\n }\n\n }\n\n case REACT_PORTAL_TYPE:\n return $$typeof;\n }\n }\n\n return undefined;\n} // AsyncMode is deprecated along with isAsyncMode\n\nvar AsyncMode = REACT_ASYNC_MODE_TYPE;\nvar ConcurrentMode = REACT_CONCURRENT_MODE_TYPE;\nvar ContextConsumer = REACT_CONTEXT_TYPE;\nvar ContextProvider = REACT_PROVIDER_TYPE;\nvar Element = REACT_ELEMENT_TYPE;\nvar ForwardRef = REACT_FORWARD_REF_TYPE;\nvar Fragment = REACT_FRAGMENT_TYPE;\nvar Lazy = REACT_LAZY_TYPE;\nvar Memo = REACT_MEMO_TYPE;\nvar Portal = REACT_PORTAL_TYPE;\nvar Profiler = REACT_PROFILER_TYPE;\nvar StrictMode = REACT_STRICT_MODE_TYPE;\nvar Suspense = REACT_SUSPENSE_TYPE;\nvar hasWarnedAboutDeprecatedIsAsyncMode = false; // AsyncMode should be deprecated\n\nfunction isAsyncMode(object) {\n {\n if (!hasWarnedAboutDeprecatedIsAsyncMode) {\n hasWarnedAboutDeprecatedIsAsyncMode = true; // Using console['warn'] to evade Babel and ESLint\n\n console['warn']('The ReactIs.isAsyncMode() alias has been deprecated, ' + 'and will be removed in React 17+. Update your code to use ' + 'ReactIs.isConcurrentMode() instead. It has the exact same API.');\n }\n }\n\n return isConcurrentMode(object) || typeOf(object) === REACT_ASYNC_MODE_TYPE;\n}\nfunction isConcurrentMode(object) {\n return typeOf(object) === REACT_CONCURRENT_MODE_TYPE;\n}\nfunction isContextConsumer(object) {\n return typeOf(object) === REACT_CONTEXT_TYPE;\n}\nfunction isContextProvider(object) {\n return typeOf(object) === REACT_PROVIDER_TYPE;\n}\nfunction isElement(object) {\n return typeof object === 'object' && object !== null && object.$$typeof === REACT_ELEMENT_TYPE;\n}\nfunction isForwardRef(object) {\n return typeOf(object) === REACT_FORWARD_REF_TYPE;\n}\nfunction isFragment(object) {\n return typeOf(object) === REACT_FRAGMENT_TYPE;\n}\nfunction isLazy(object) {\n return typeOf(object) === REACT_LAZY_TYPE;\n}\nfunction isMemo(object) {\n return typeOf(object) === REACT_MEMO_TYPE;\n}\nfunction isPortal(object) {\n return typeOf(object) === REACT_PORTAL_TYPE;\n}\nfunction isProfiler(object) {\n return typeOf(object) === REACT_PROFILER_TYPE;\n}\nfunction isStrictMode(object) {\n return typeOf(object) === REACT_STRICT_MODE_TYPE;\n}\nfunction isSuspense(object) {\n return typeOf(object) === REACT_SUSPENSE_TYPE;\n}\n\nreactIs_development.AsyncMode = AsyncMode;\nreactIs_development.ConcurrentMode = ConcurrentMode;\nreactIs_development.ContextConsumer = ContextConsumer;\nreactIs_development.ContextProvider = ContextProvider;\nreactIs_development.Element = Element;\nreactIs_development.ForwardRef = ForwardRef;\nreactIs_development.Fragment = Fragment;\nreactIs_development.Lazy = Lazy;\nreactIs_development.Memo = Memo;\nreactIs_development.Portal = Portal;\nreactIs_development.Profiler = Profiler;\nreactIs_development.StrictMode = StrictMode;\nreactIs_development.Suspense = Suspense;\nreactIs_development.isAsyncMode = isAsyncMode;\nreactIs_development.isConcurrentMode = isConcurrentMode;\nreactIs_development.isContextConsumer = isContextConsumer;\nreactIs_development.isContextProvider = isContextProvider;\nreactIs_development.isElement = isElement;\nreactIs_development.isForwardRef = isForwardRef;\nreactIs_development.isFragment = isFragment;\nreactIs_development.isLazy = isLazy;\nreactIs_development.isMemo = isMemo;\nreactIs_development.isPortal = isPortal;\nreactIs_development.isProfiler = isProfiler;\nreactIs_development.isStrictMode = isStrictMode;\nreactIs_development.isSuspense = isSuspense;\nreactIs_development.isValidElementType = isValidElementType;\nreactIs_development.typeOf = typeOf;\n })();\n}\n\nif (process.env.NODE_ENV === 'production') {\n reactIs.exports = reactIs_production_min;\n} else {\n reactIs.exports = reactIs_development;\n}\n\n/*\nobject-assign\n(c) Sindre Sorhus\n@license MIT\n*/\n/* eslint-disable no-unused-vars */\nvar getOwnPropertySymbols = Object.getOwnPropertySymbols;\nvar hasOwnProperty = Object.prototype.hasOwnProperty;\nvar propIsEnumerable = Object.prototype.propertyIsEnumerable;\n\nfunction toObject(val) {\n\tif (val === null || val === undefined) {\n\t\tthrow new TypeError('Object.assign cannot be called with null or undefined');\n\t}\n\n\treturn Object(val);\n}\n\nfunction shouldUseNative() {\n\ttry {\n\t\tif (!Object.assign) {\n\t\t\treturn false;\n\t\t}\n\n\t\t// Detect buggy property enumeration order in older V8 versions.\n\n\t\t// https://bugs.chromium.org/p/v8/issues/detail?id=4118\n\t\tvar test1 = new String('abc'); // eslint-disable-line no-new-wrappers\n\t\ttest1[5] = 'de';\n\t\tif (Object.getOwnPropertyNames(test1)[0] === '5') {\n\t\t\treturn false;\n\t\t}\n\n\t\t// https://bugs.chromium.org/p/v8/issues/detail?id=3056\n\t\tvar test2 = {};\n\t\tfor (var i = 0; i < 10; i++) {\n\t\t\ttest2['_' + String.fromCharCode(i)] = i;\n\t\t}\n\t\tvar order2 = Object.getOwnPropertyNames(test2).map(function (n) {\n\t\t\treturn test2[n];\n\t\t});\n\t\tif (order2.join('') !== '0123456789') {\n\t\t\treturn false;\n\t\t}\n\n\t\t// https://bugs.chromium.org/p/v8/issues/detail?id=3056\n\t\tvar test3 = {};\n\t\t'abcdefghijklmnopqrst'.split('').forEach(function (letter) {\n\t\t\ttest3[letter] = letter;\n\t\t});\n\t\tif (Object.keys(Object.assign({}, test3)).join('') !==\n\t\t\t\t'abcdefghijklmnopqrst') {\n\t\t\treturn false;\n\t\t}\n\n\t\treturn true;\n\t} catch (err) {\n\t\t// We don't expect any of the above to throw, but better to be safe.\n\t\treturn false;\n\t}\n}\n\nvar objectAssign = shouldUseNative() ? Object.assign : function (target, source) {\n\tvar from;\n\tvar to = toObject(target);\n\tvar symbols;\n\n\tfor (var s = 1; s < arguments.length; s++) {\n\t\tfrom = Object(arguments[s]);\n\n\t\tfor (var key in from) {\n\t\t\tif (hasOwnProperty.call(from, key)) {\n\t\t\t\tto[key] = from[key];\n\t\t\t}\n\t\t}\n\n\t\tif (getOwnPropertySymbols) {\n\t\t\tsymbols = getOwnPropertySymbols(from);\n\t\t\tfor (var i = 0; i < symbols.length; i++) {\n\t\t\t\tif (propIsEnumerable.call(from, symbols[i])) {\n\t\t\t\t\tto[symbols[i]] = from[symbols[i]];\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t}\n\n\treturn to;\n};\n\n/**\n * Copyright (c) 2013-present, Facebook, Inc.\n *\n * This source code is licensed under the MIT license found in the\n * LICENSE file in the root directory of this source tree.\n */\n\nvar ReactPropTypesSecret$3 = 'SECRET_DO_NOT_PASS_THIS_OR_YOU_WILL_BE_FIRED';\n\nvar ReactPropTypesSecret_1 = ReactPropTypesSecret$3;\n\nvar has$3 = Function.call.bind(Object.prototype.hasOwnProperty);\n\n/**\n * Copyright (c) 2013-present, Facebook, Inc.\n *\n * This source code is licensed under the MIT license found in the\n * LICENSE file in the root directory of this source tree.\n */\n\nvar printWarning$1 = function() {};\n\nif (process.env.NODE_ENV !== 'production') {\n var ReactPropTypesSecret$2 = ReactPropTypesSecret_1;\n var loggedTypeFailures = {};\n var has$2 = has$3;\n\n printWarning$1 = function(text) {\n var message = 'Warning: ' + text;\n if (typeof console !== 'undefined') {\n console.error(message);\n }\n try {\n // --- Welcome to debugging React ---\n // This error was thrown as a convenience so that you can use this stack\n // to find the callsite that caused this warning to fire.\n throw new Error(message);\n } catch (x) { /**/ }\n };\n}\n\n/**\n * Assert that the values match with the type specs.\n * Error messages are memorized and will only be shown once.\n *\n * @param {object} typeSpecs Map of name to a ReactPropType\n * @param {object} values Runtime values that need to be type-checked\n * @param {string} location e.g. \"prop\", \"context\", \"child context\"\n * @param {string} componentName Name of the component for error messages.\n * @param {?Function} getStack Returns the component stack.\n * @private\n */\nfunction checkPropTypes$1(typeSpecs, values, location, componentName, getStack) {\n if (process.env.NODE_ENV !== 'production') {\n for (var typeSpecName in typeSpecs) {\n if (has$2(typeSpecs, typeSpecName)) {\n var error;\n // Prop type validation may throw. In case they do, we don't want to\n // fail the render phase where it didn't fail before. So we log it.\n // After these have been cleaned up, we'll let them throw.\n try {\n // This is intentionally an invariant that gets caught. It's the same\n // behavior as without this statement except with a better message.\n if (typeof typeSpecs[typeSpecName] !== 'function') {\n var err = Error(\n (componentName || 'React class') + ': ' + location + ' type `' + typeSpecName + '` is invalid; ' +\n 'it must be a function, usually from the `prop-types` package, but received `' + typeof typeSpecs[typeSpecName] + '`.' +\n 'This often happens because of typos such as `PropTypes.function` instead of `PropTypes.func`.'\n );\n err.name = 'Invariant Violation';\n throw err;\n }\n error = typeSpecs[typeSpecName](values, typeSpecName, componentName, location, null, ReactPropTypesSecret$2);\n } catch (ex) {\n error = ex;\n }\n if (error && !(error instanceof Error)) {\n printWarning$1(\n (componentName || 'React class') + ': type specification of ' +\n location + ' `' + typeSpecName + '` is invalid; the type checker ' +\n 'function must return `null` or an `Error` but returned a ' + typeof error + '. ' +\n 'You may have forgotten to pass an argument to the type checker ' +\n 'creator (arrayOf, instanceOf, objectOf, oneOf, oneOfType, and ' +\n 'shape all require an argument).'\n );\n }\n if (error instanceof Error && !(error.message in loggedTypeFailures)) {\n // Only monitor this failure once because there tends to be a lot of the\n // same error.\n loggedTypeFailures[error.message] = true;\n\n var stack = getStack ? getStack() : '';\n\n printWarning$1(\n 'Failed ' + location + ' type: ' + error.message + (stack != null ? stack : '')\n );\n }\n }\n }\n }\n}\n\n/**\n * Resets warning cache when testing.\n *\n * @private\n */\ncheckPropTypes$1.resetWarningCache = function() {\n if (process.env.NODE_ENV !== 'production') {\n loggedTypeFailures = {};\n }\n};\n\nvar checkPropTypes_1 = checkPropTypes$1;\n\n/**\n * Copyright (c) 2013-present, Facebook, Inc.\n *\n * This source code is licensed under the MIT license found in the\n * LICENSE file in the root directory of this source tree.\n */\n\nvar ReactIs$1 = reactIs.exports;\nvar assign$4 = objectAssign;\n\nvar ReactPropTypesSecret$1 = ReactPropTypesSecret_1;\nvar has$1 = has$3;\nvar checkPropTypes = checkPropTypes_1;\n\nvar printWarning = function() {};\n\nif (process.env.NODE_ENV !== 'production') {\n printWarning = function(text) {\n var message = 'Warning: ' + text;\n if (typeof console !== 'undefined') {\n console.error(message);\n }\n try {\n // --- Welcome to debugging React ---\n // This error was thrown as a convenience so that you can use this stack\n // to find the callsite that caused this warning to fire.\n throw new Error(message);\n } catch (x) {}\n };\n}\n\nfunction emptyFunctionThatReturnsNull() {\n return null;\n}\n\nvar factoryWithTypeCheckers = function(isValidElement, throwOnDirectAccess) {\n /* global Symbol */\n var ITERATOR_SYMBOL = typeof Symbol === 'function' && Symbol.iterator;\n var FAUX_ITERATOR_SYMBOL = '@@iterator'; // Before Symbol spec.\n\n /**\n * Returns the iterator method function contained on the iterable object.\n *\n * Be sure to invoke the function with the iterable as context:\n *\n * var iteratorFn = getIteratorFn(myIterable);\n * if (iteratorFn) {\n * var iterator = iteratorFn.call(myIterable);\n * ...\n * }\n *\n * @param {?object} maybeIterable\n * @return {?function}\n */\n function getIteratorFn(maybeIterable) {\n var iteratorFn = maybeIterable && (ITERATOR_SYMBOL && maybeIterable[ITERATOR_SYMBOL] || maybeIterable[FAUX_ITERATOR_SYMBOL]);\n if (typeof iteratorFn === 'function') {\n return iteratorFn;\n }\n }\n\n /**\n * Collection of methods that allow declaration and validation of props that are\n * supplied to React components. Example usage:\n *\n * var Props = require('ReactPropTypes');\n * var MyArticle = React.createClass({\n * propTypes: {\n * // An optional string prop named \"description\".\n * description: Props.string,\n *\n * // A required enum prop named \"category\".\n * category: Props.oneOf(['News','Photos']).isRequired,\n *\n * // A prop named \"dialog\" that requires an instance of Dialog.\n * dialog: Props.instanceOf(Dialog).isRequired\n * },\n * render: function() { ... }\n * });\n *\n * A more formal specification of how these methods are used:\n *\n * type := array|bool|func|object|number|string|oneOf([...])|instanceOf(...)\n * decl := ReactPropTypes.{type}(.isRequired)?\n *\n * Each and every declaration produces a function with the same signature. This\n * allows the creation of custom validation functions. For example:\n *\n * var MyLink = React.createClass({\n * propTypes: {\n * // An optional string or URI prop named \"href\".\n * href: function(props, propName, componentName) {\n * var propValue = props[propName];\n * if (propValue != null && typeof propValue !== 'string' &&\n * !(propValue instanceof URI)) {\n * return new Error(\n * 'Expected a string or an URI for ' + propName + ' in ' +\n * componentName\n * );\n * }\n * }\n * },\n * render: function() {...}\n * });\n *\n * @internal\n */\n\n var ANONYMOUS = '<>';\n\n // Important!\n // Keep this list in sync with production version in `./factoryWithThrowingShims.js`.\n var ReactPropTypes = {\n array: createPrimitiveTypeChecker('array'),\n bigint: createPrimitiveTypeChecker('bigint'),\n bool: createPrimitiveTypeChecker('boolean'),\n func: createPrimitiveTypeChecker('function'),\n number: createPrimitiveTypeChecker('number'),\n object: createPrimitiveTypeChecker('object'),\n string: createPrimitiveTypeChecker('string'),\n symbol: createPrimitiveTypeChecker('symbol'),\n\n any: createAnyTypeChecker(),\n arrayOf: createArrayOfTypeChecker,\n element: createElementTypeChecker(),\n elementType: createElementTypeTypeChecker(),\n instanceOf: createInstanceTypeChecker,\n node: createNodeChecker(),\n objectOf: createObjectOfTypeChecker,\n oneOf: createEnumTypeChecker,\n oneOfType: createUnionTypeChecker,\n shape: createShapeTypeChecker,\n exact: createStrictShapeTypeChecker,\n };\n\n /**\n * inlined Object.is polyfill to avoid requiring consumers ship their own\n * https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Object/is\n */\n /*eslint-disable no-self-compare*/\n function is(x, y) {\n // SameValue algorithm\n if (x === y) {\n // Steps 1-5, 7-10\n // Steps 6.b-6.e: +0 != -0\n return x !== 0 || 1 / x === 1 / y;\n } else {\n // Step 6.a: NaN == NaN\n return x !== x && y !== y;\n }\n }\n /*eslint-enable no-self-compare*/\n\n /**\n * We use an Error-like object for backward compatibility as people may call\n * PropTypes directly and inspect their output. However, we don't use real\n * Errors anymore. We don't inspect their stack anyway, and creating them\n * is prohibitively expensive if they are created too often, such as what\n * happens in oneOfType() for any type before the one that matched.\n */\n function PropTypeError(message, data) {\n this.message = message;\n this.data = data && typeof data === 'object' ? data: {};\n this.stack = '';\n }\n // Make `instanceof Error` still work for returned errors.\n PropTypeError.prototype = Error.prototype;\n\n function createChainableTypeChecker(validate) {\n if (process.env.NODE_ENV !== 'production') {\n var manualPropTypeCallCache = {};\n var manualPropTypeWarningCount = 0;\n }\n function checkType(isRequired, props, propName, componentName, location, propFullName, secret) {\n componentName = componentName || ANONYMOUS;\n propFullName = propFullName || propName;\n\n if (secret !== ReactPropTypesSecret$1) {\n if (throwOnDirectAccess) {\n // New behavior only for users of `prop-types` package\n var err = new Error(\n 'Calling PropTypes validators directly is not supported by the `prop-types` package. ' +\n 'Use `PropTypes.checkPropTypes()` to call them. ' +\n 'Read more at http://fb.me/use-check-prop-types'\n );\n err.name = 'Invariant Violation';\n throw err;\n } else if (process.env.NODE_ENV !== 'production' && typeof console !== 'undefined') {\n // Old behavior for people using React.PropTypes\n var cacheKey = componentName + ':' + propName;\n if (\n !manualPropTypeCallCache[cacheKey] &&\n // Avoid spamming the console because they are often not actionable except for lib authors\n manualPropTypeWarningCount < 3\n ) {\n printWarning(\n 'You are manually calling a React.PropTypes validation ' +\n 'function for the `' + propFullName + '` prop on `' + componentName + '`. This is deprecated ' +\n 'and will throw in the standalone `prop-types` package. ' +\n 'You may be seeing this warning due to a third-party PropTypes ' +\n 'library. See https://fb.me/react-warning-dont-call-proptypes ' + 'for details.'\n );\n manualPropTypeCallCache[cacheKey] = true;\n manualPropTypeWarningCount++;\n }\n }\n }\n if (props[propName] == null) {\n if (isRequired) {\n if (props[propName] === null) {\n return new PropTypeError('The ' + location + ' `' + propFullName + '` is marked as required ' + ('in `' + componentName + '`, but its value is `null`.'));\n }\n return new PropTypeError('The ' + location + ' `' + propFullName + '` is marked as required in ' + ('`' + componentName + '`, but its value is `undefined`.'));\n }\n return null;\n } else {\n return validate(props, propName, componentName, location, propFullName);\n }\n }\n\n var chainedCheckType = checkType.bind(null, false);\n chainedCheckType.isRequired = checkType.bind(null, true);\n\n return chainedCheckType;\n }\n\n function createPrimitiveTypeChecker(expectedType) {\n function validate(props, propName, componentName, location, propFullName, secret) {\n var propValue = props[propName];\n var propType = getPropType(propValue);\n if (propType !== expectedType) {\n // `propValue` being instance of, say, date/regexp, pass the 'object'\n // check, but we can offer a more precise error message here rather than\n // 'of type `object`'.\n var preciseType = getPreciseType(propValue);\n\n return new PropTypeError(\n 'Invalid ' + location + ' `' + propFullName + '` of type ' + ('`' + preciseType + '` supplied to `' + componentName + '`, expected ') + ('`' + expectedType + '`.'),\n {expectedType: expectedType}\n );\n }\n return null;\n }\n return createChainableTypeChecker(validate);\n }\n\n function createAnyTypeChecker() {\n return createChainableTypeChecker(emptyFunctionThatReturnsNull);\n }\n\n function createArrayOfTypeChecker(typeChecker) {\n function validate(props, propName, componentName, location, propFullName) {\n if (typeof typeChecker !== 'function') {\n return new PropTypeError('Property `' + propFullName + '` of component `' + componentName + '` has invalid PropType notation inside arrayOf.');\n }\n var propValue = props[propName];\n if (!Array.isArray(propValue)) {\n var propType = getPropType(propValue);\n return new PropTypeError('Invalid ' + location + ' `' + propFullName + '` of type ' + ('`' + propType + '` supplied to `' + componentName + '`, expected an array.'));\n }\n for (var i = 0; i < propValue.length; i++) {\n var error = typeChecker(propValue, i, componentName, location, propFullName + '[' + i + ']', ReactPropTypesSecret$1);\n if (error instanceof Error) {\n return error;\n }\n }\n return null;\n }\n return createChainableTypeChecker(validate);\n }\n\n function createElementTypeChecker() {\n function validate(props, propName, componentName, location, propFullName) {\n var propValue = props[propName];\n if (!isValidElement(propValue)) {\n var propType = getPropType(propValue);\n return new PropTypeError('Invalid ' + location + ' `' + propFullName + '` of type ' + ('`' + propType + '` supplied to `' + componentName + '`, expected a single ReactElement.'));\n }\n return null;\n }\n return createChainableTypeChecker(validate);\n }\n\n function createElementTypeTypeChecker() {\n function validate(props, propName, componentName, location, propFullName) {\n var propValue = props[propName];\n if (!ReactIs$1.isValidElementType(propValue)) {\n var propType = getPropType(propValue);\n return new PropTypeError('Invalid ' + location + ' `' + propFullName + '` of type ' + ('`' + propType + '` supplied to `' + componentName + '`, expected a single ReactElement type.'));\n }\n return null;\n }\n return createChainableTypeChecker(validate);\n }\n\n function createInstanceTypeChecker(expectedClass) {\n function validate(props, propName, componentName, location, propFullName) {\n if (!(props[propName] instanceof expectedClass)) {\n var expectedClassName = expectedClass.name || ANONYMOUS;\n var actualClassName = getClassName(props[propName]);\n return new PropTypeError('Invalid ' + location + ' `' + propFullName + '` of type ' + ('`' + actualClassName + '` supplied to `' + componentName + '`, expected ') + ('instance of `' + expectedClassName + '`.'));\n }\n return null;\n }\n return createChainableTypeChecker(validate);\n }\n\n function createEnumTypeChecker(expectedValues) {\n if (!Array.isArray(expectedValues)) {\n if (process.env.NODE_ENV !== 'production') {\n if (arguments.length > 1) {\n printWarning(\n 'Invalid arguments supplied to oneOf, expected an array, got ' + arguments.length + ' arguments. ' +\n 'A common mistake is to write oneOf(x, y, z) instead of oneOf([x, y, z]).'\n );\n } else {\n printWarning('Invalid argument supplied to oneOf, expected an array.');\n }\n }\n return emptyFunctionThatReturnsNull;\n }\n\n function validate(props, propName, componentName, location, propFullName) {\n var propValue = props[propName];\n for (var i = 0; i < expectedValues.length; i++) {\n if (is(propValue, expectedValues[i])) {\n return null;\n }\n }\n\n var valuesString = JSON.stringify(expectedValues, function replacer(key, value) {\n var type = getPreciseType(value);\n if (type === 'symbol') {\n return String(value);\n }\n return value;\n });\n return new PropTypeError('Invalid ' + location + ' `' + propFullName + '` of value `' + String(propValue) + '` ' + ('supplied to `' + componentName + '`, expected one of ' + valuesString + '.'));\n }\n return createChainableTypeChecker(validate);\n }\n\n function createObjectOfTypeChecker(typeChecker) {\n function validate(props, propName, componentName, location, propFullName) {\n if (typeof typeChecker !== 'function') {\n return new PropTypeError('Property `' + propFullName + '` of component `' + componentName + '` has invalid PropType notation inside objectOf.');\n }\n var propValue = props[propName];\n var propType = getPropType(propValue);\n if (propType !== 'object') {\n return new PropTypeError('Invalid ' + location + ' `' + propFullName + '` of type ' + ('`' + propType + '` supplied to `' + componentName + '`, expected an object.'));\n }\n for (var key in propValue) {\n if (has$1(propValue, key)) {\n var error = typeChecker(propValue, key, componentName, location, propFullName + '.' + key, ReactPropTypesSecret$1);\n if (error instanceof Error) {\n return error;\n }\n }\n }\n return null;\n }\n return createChainableTypeChecker(validate);\n }\n\n function createUnionTypeChecker(arrayOfTypeCheckers) {\n if (!Array.isArray(arrayOfTypeCheckers)) {\n process.env.NODE_ENV !== 'production' ? printWarning('Invalid argument supplied to oneOfType, expected an instance of array.') : void 0;\n return emptyFunctionThatReturnsNull;\n }\n\n for (var i = 0; i < arrayOfTypeCheckers.length; i++) {\n var checker = arrayOfTypeCheckers[i];\n if (typeof checker !== 'function') {\n printWarning(\n 'Invalid argument supplied to oneOfType. Expected an array of check functions, but ' +\n 'received ' + getPostfixForTypeWarning(checker) + ' at index ' + i + '.'\n );\n return emptyFunctionThatReturnsNull;\n }\n }\n\n function validate(props, propName, componentName, location, propFullName) {\n var expectedTypes = [];\n for (var i = 0; i < arrayOfTypeCheckers.length; i++) {\n var checker = arrayOfTypeCheckers[i];\n var checkerResult = checker(props, propName, componentName, location, propFullName, ReactPropTypesSecret$1);\n if (checkerResult == null) {\n return null;\n }\n if (checkerResult.data && has$1(checkerResult.data, 'expectedType')) {\n expectedTypes.push(checkerResult.data.expectedType);\n }\n }\n var expectedTypesMessage = (expectedTypes.length > 0) ? ', expected one of type [' + expectedTypes.join(', ') + ']': '';\n return new PropTypeError('Invalid ' + location + ' `' + propFullName + '` supplied to ' + ('`' + componentName + '`' + expectedTypesMessage + '.'));\n }\n return createChainableTypeChecker(validate);\n }\n\n function createNodeChecker() {\n function validate(props, propName, componentName, location, propFullName) {\n if (!isNode(props[propName])) {\n return new PropTypeError('Invalid ' + location + ' `' + propFullName + '` supplied to ' + ('`' + componentName + '`, expected a ReactNode.'));\n }\n return null;\n }\n return createChainableTypeChecker(validate);\n }\n\n function invalidValidatorError(componentName, location, propFullName, key, type) {\n return new PropTypeError(\n (componentName || 'React class') + ': ' + location + ' type `' + propFullName + '.' + key + '` is invalid; ' +\n 'it must be a function, usually from the `prop-types` package, but received `' + type + '`.'\n );\n }\n\n function createShapeTypeChecker(shapeTypes) {\n function validate(props, propName, componentName, location, propFullName) {\n var propValue = props[propName];\n var propType = getPropType(propValue);\n if (propType !== 'object') {\n return new PropTypeError('Invalid ' + location + ' `' + propFullName + '` of type `' + propType + '` ' + ('supplied to `' + componentName + '`, expected `object`.'));\n }\n for (var key in shapeTypes) {\n var checker = shapeTypes[key];\n if (typeof checker !== 'function') {\n return invalidValidatorError(componentName, location, propFullName, key, getPreciseType(checker));\n }\n var error = checker(propValue, key, componentName, location, propFullName + '.' + key, ReactPropTypesSecret$1);\n if (error) {\n return error;\n }\n }\n return null;\n }\n return createChainableTypeChecker(validate);\n }\n\n function createStrictShapeTypeChecker(shapeTypes) {\n function validate(props, propName, componentName, location, propFullName) {\n var propValue = props[propName];\n var propType = getPropType(propValue);\n if (propType !== 'object') {\n return new PropTypeError('Invalid ' + location + ' `' + propFullName + '` of type `' + propType + '` ' + ('supplied to `' + componentName + '`, expected `object`.'));\n }\n // We need to check all keys in case some are required but missing from props.\n var allKeys = assign$4({}, props[propName], shapeTypes);\n for (var key in allKeys) {\n var checker = shapeTypes[key];\n if (has$1(shapeTypes, key) && typeof checker !== 'function') {\n return invalidValidatorError(componentName, location, propFullName, key, getPreciseType(checker));\n }\n if (!checker) {\n return new PropTypeError(\n 'Invalid ' + location + ' `' + propFullName + '` key `' + key + '` supplied to `' + componentName + '`.' +\n '\\nBad object: ' + JSON.stringify(props[propName], null, ' ') +\n '\\nValid keys: ' + JSON.stringify(Object.keys(shapeTypes), null, ' ')\n );\n }\n var error = checker(propValue, key, componentName, location, propFullName + '.' + key, ReactPropTypesSecret$1);\n if (error) {\n return error;\n }\n }\n return null;\n }\n\n return createChainableTypeChecker(validate);\n }\n\n function isNode(propValue) {\n switch (typeof propValue) {\n case 'number':\n case 'string':\n case 'undefined':\n return true;\n case 'boolean':\n return !propValue;\n case 'object':\n if (Array.isArray(propValue)) {\n return propValue.every(isNode);\n }\n if (propValue === null || isValidElement(propValue)) {\n return true;\n }\n\n var iteratorFn = getIteratorFn(propValue);\n if (iteratorFn) {\n var iterator = iteratorFn.call(propValue);\n var step;\n if (iteratorFn !== propValue.entries) {\n while (!(step = iterator.next()).done) {\n if (!isNode(step.value)) {\n return false;\n }\n }\n } else {\n // Iterator will provide entry [k,v] tuples rather than values.\n while (!(step = iterator.next()).done) {\n var entry = step.value;\n if (entry) {\n if (!isNode(entry[1])) {\n return false;\n }\n }\n }\n }\n } else {\n return false;\n }\n\n return true;\n default:\n return false;\n }\n }\n\n function isSymbol(propType, propValue) {\n // Native Symbol.\n if (propType === 'symbol') {\n return true;\n }\n\n // falsy value can't be a Symbol\n if (!propValue) {\n return false;\n }\n\n // 19.4.3.5 Symbol.prototype[@@toStringTag] === 'Symbol'\n if (propValue['@@toStringTag'] === 'Symbol') {\n return true;\n }\n\n // Fallback for non-spec compliant Symbols which are polyfilled.\n if (typeof Symbol === 'function' && propValue instanceof Symbol) {\n return true;\n }\n\n return false;\n }\n\n // Equivalent of `typeof` but with special handling for array and regexp.\n function getPropType(propValue) {\n var propType = typeof propValue;\n if (Array.isArray(propValue)) {\n return 'array';\n }\n if (propValue instanceof RegExp) {\n // Old webkits (at least until Android 4.0) return 'function' rather than\n // 'object' for typeof a RegExp. We'll normalize this here so that /bla/\n // passes PropTypes.object.\n return 'object';\n }\n if (isSymbol(propType, propValue)) {\n return 'symbol';\n }\n return propType;\n }\n\n // This handles more types than `getPropType`. Only used for error messages.\n // See `createPrimitiveTypeChecker`.\n function getPreciseType(propValue) {\n if (typeof propValue === 'undefined' || propValue === null) {\n return '' + propValue;\n }\n var propType = getPropType(propValue);\n if (propType === 'object') {\n if (propValue instanceof Date) {\n return 'date';\n } else if (propValue instanceof RegExp) {\n return 'regexp';\n }\n }\n return propType;\n }\n\n // Returns a string that is postfixed to a warning about an invalid type.\n // For example, \"undefined\" or \"of type array\"\n function getPostfixForTypeWarning(value) {\n var type = getPreciseType(value);\n switch (type) {\n case 'array':\n case 'object':\n return 'an ' + type;\n case 'boolean':\n case 'date':\n case 'regexp':\n return 'a ' + type;\n default:\n return type;\n }\n }\n\n // Returns class name of the object, if any.\n function getClassName(propValue) {\n if (!propValue.constructor || !propValue.constructor.name) {\n return ANONYMOUS;\n }\n return propValue.constructor.name;\n }\n\n ReactPropTypes.checkPropTypes = checkPropTypes;\n ReactPropTypes.resetWarningCache = checkPropTypes.resetWarningCache;\n ReactPropTypes.PropTypes = ReactPropTypes;\n\n return ReactPropTypes;\n};\n\n/**\n * Copyright (c) 2013-present, Facebook, Inc.\n *\n * This source code is licensed under the MIT license found in the\n * LICENSE file in the root directory of this source tree.\n */\n\nvar ReactPropTypesSecret = ReactPropTypesSecret_1;\n\nfunction emptyFunction() {}\nfunction emptyFunctionWithReset() {}\nemptyFunctionWithReset.resetWarningCache = emptyFunction;\n\nvar factoryWithThrowingShims = function() {\n function shim(props, propName, componentName, location, propFullName, secret) {\n if (secret === ReactPropTypesSecret) {\n // It is still safe when called from React.\n return;\n }\n var err = new Error(\n 'Calling PropTypes validators directly is not supported by the `prop-types` package. ' +\n 'Use PropTypes.checkPropTypes() to call them. ' +\n 'Read more at http://fb.me/use-check-prop-types'\n );\n err.name = 'Invariant Violation';\n throw err;\n } shim.isRequired = shim;\n function getShim() {\n return shim;\n } // Important!\n // Keep this list in sync with production version in `./factoryWithTypeCheckers.js`.\n var ReactPropTypes = {\n array: shim,\n bigint: shim,\n bool: shim,\n func: shim,\n number: shim,\n object: shim,\n string: shim,\n symbol: shim,\n\n any: shim,\n arrayOf: getShim,\n element: shim,\n elementType: shim,\n instanceOf: getShim,\n node: shim,\n objectOf: getShim,\n oneOf: getShim,\n oneOfType: getShim,\n shape: getShim,\n exact: getShim,\n\n checkPropTypes: emptyFunctionWithReset,\n resetWarningCache: emptyFunction\n };\n\n ReactPropTypes.PropTypes = ReactPropTypes;\n\n return ReactPropTypes;\n};\n\n/**\n * Copyright (c) 2013-present, Facebook, Inc.\n *\n * This source code is licensed under the MIT license found in the\n * LICENSE file in the root directory of this source tree.\n */\n\nif (process.env.NODE_ENV !== 'production') {\n var ReactIs = reactIs.exports;\n\n // By explicitly using `prop-types` you are opting into new development behavior.\n // http://fb.me/prop-types-in-prod\n var throwOnDirectAccess = true;\n propTypes$2.exports = factoryWithTypeCheckers(ReactIs.isElement, throwOnDirectAccess);\n} else {\n // By explicitly using `prop-types` you are opting into new production behavior.\n // http://fb.me/prop-types-in-prod\n propTypes$2.exports = factoryWithThrowingShims();\n}\n\nvar PropTypes = propTypes$2.exports;\n\nvar classnames = {exports: {}};\n\n/*!\n\tCopyright (c) 2018 Jed Watson.\n\tLicensed under the MIT License (MIT), see\n\thttp://jedwatson.github.io/classnames\n*/\n\n(function (module) {\n/* global define */\n\n(function () {\n\n\tvar hasOwn = {}.hasOwnProperty;\n\n\tfunction classNames() {\n\t\tvar classes = [];\n\n\t\tfor (var i = 0; i < arguments.length; i++) {\n\t\t\tvar arg = arguments[i];\n\t\t\tif (!arg) continue;\n\n\t\t\tvar argType = typeof arg;\n\n\t\t\tif (argType === 'string' || argType === 'number') {\n\t\t\t\tclasses.push(arg);\n\t\t\t} else if (Array.isArray(arg)) {\n\t\t\t\tif (arg.length) {\n\t\t\t\t\tvar inner = classNames.apply(null, arg);\n\t\t\t\t\tif (inner) {\n\t\t\t\t\t\tclasses.push(inner);\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t} else if (argType === 'object') {\n\t\t\t\tif (arg.toString !== Object.prototype.toString && !arg.toString.toString().includes('[native code]')) {\n\t\t\t\t\tclasses.push(arg.toString());\n\t\t\t\t\tcontinue;\n\t\t\t\t}\n\n\t\t\t\tfor (var key in arg) {\n\t\t\t\t\tif (hasOwn.call(arg, key) && arg[key]) {\n\t\t\t\t\t\tclasses.push(key);\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\n\t\treturn classes.join(' ');\n\t}\n\n\tif (module.exports) {\n\t\tclassNames.default = classNames;\n\t\tmodule.exports = classNames;\n\t} else {\n\t\twindow.classNames = classNames;\n\t}\n}());\n}(classnames));\n\nvar _extends$7 = Object.assign || function (target) { for (var i = 1; i < arguments.length; i++) { var source = arguments[i]; for (var key in source) { if (Object.prototype.hasOwnProperty.call(source, key)) { target[key] = source[key]; } } } return target; };\n\nvar spinkitSpinners = {\n circle: { className: 'sk-circle', divCount: 12 },\n 'cube-grid': { className: 'sk-cube-grid', divCount: 9 },\n wave: { className: 'sk-wave', divCount: 5 },\n 'folding-cube': { className: 'sk-folding-cube', divCount: 4 },\n 'three-bounce': { className: 'sk-three-bounce', divCount: 3 },\n 'double-bounce': { className: 'sk-double-bounce', divCount: 2 },\n 'wandering-cubes': { className: 'sk-wandering-cubes', divCount: 2 },\n 'chasing-dots': { className: 'sk-chasing-dots', divCount: 2 },\n 'rotating-plane': { className: 'sk-rotating-plane', divCount: 1 },\n pulse: { className: 'sk-pulse', divCount: 1 },\n wordpress: { className: 'sk-wordpress', divCount: 1 }\n};\n\nvar loadersCssSpinners = {\n 'ball-grid-beat': { divCount: 9 },\n 'ball-grid-pulse': { divCount: 9 },\n 'line-spin-fade-loader': { divCount: 8 },\n 'ball-spin-fade-loader': { divCount: 8 },\n 'ball-pulse-rise': { divCount: 5 },\n 'line-scale': { divCount: 5 },\n 'line-scale-pulse-out': { divCount: 5 },\n 'line-scale-pulse-out-rapid': { divCount: 5 },\n pacman: { divCount: 5 },\n 'line-scale-party': { divCount: 4 },\n 'ball-triangle-path': { divCount: 3 },\n 'ball-scale-multiple': { divCount: 3 },\n 'ball-scale-ripple-multiple': { divCount: 3 },\n 'ball-pulse-sync': { divCount: 3 },\n 'ball-beat': { divCount: 3 },\n 'ball-zig-zag': { divCount: 2 },\n 'ball-zig-zag-deflect': { divCount: 2 },\n 'ball-clip-rotate-pulse': { divCount: 2 },\n 'ball-clip-rotate-multiple': { divCount: 2 },\n 'ball-clip-rotate': { divCount: 1 },\n 'ball-scale-ripple': { divCount: 1 },\n 'triangle-skew-spin': { divCount: 1 }\n};\n\nvar spinners = {\n spinkitSpinners: spinkitSpinners,\n loadersCssSpinners: loadersCssSpinners,\n allSpinners: _extends$7({}, spinkitSpinners, loadersCssSpinners)\n};\n\nfunction styleInject(css, ref) {\n if ( ref === void 0 ) ref = {};\n var insertAt = ref.insertAt;\n\n if (!css || typeof document === 'undefined') { return; }\n\n var head = document.head || document.getElementsByTagName('head')[0];\n var style = document.createElement('style');\n style.type = 'text/css';\n\n if (insertAt === 'top') {\n if (head.firstChild) {\n head.insertBefore(style, head.firstChild);\n } else {\n head.appendChild(style);\n }\n } else {\n head.appendChild(style);\n }\n\n if (style.styleSheet) {\n style.styleSheet.cssText = css;\n } else {\n style.appendChild(document.createTextNode(css));\n }\n}\n\nvar css_248z$p = \"@-webkit-keyframes scale{0%{opacity:1;-webkit-transform:scale(1);transform:scale(1)}45%{opacity:.7;-webkit-transform:scale(.1);transform:scale(.1)}80%{opacity:1;-webkit-transform:scale(1);transform:scale(1)}}.ball-pulse>div:nth-child(0){-webkit-animation:scale .75s cubic-bezier(.2,.68,.18,1.08) -.36s infinite;animation:scale .75s cubic-bezier(.2,.68,.18,1.08) -.36s infinite}.ball-pulse>div:first-child{-webkit-animation:scale .75s cubic-bezier(.2,.68,.18,1.08) -.24s infinite;animation:scale .75s cubic-bezier(.2,.68,.18,1.08) -.24s infinite}.ball-pulse>div:nth-child(2){-webkit-animation:scale .75s cubic-bezier(.2,.68,.18,1.08) -.12s infinite;animation:scale .75s cubic-bezier(.2,.68,.18,1.08) -.12s infinite}.ball-pulse>div:nth-child(3){-webkit-animation:scale .75s cubic-bezier(.2,.68,.18,1.08) 0s infinite;animation:scale .75s cubic-bezier(.2,.68,.18,1.08) 0s infinite}.ball-pulse>div{-webkit-animation-fill-mode:both;animation-fill-mode:both;background-color:#fff;border-radius:100%;display:inline-block;height:15px;margin:2px;width:15px}@-webkit-keyframes ball-pulse-sync{33%{-webkit-transform:translateY(10px);transform:translateY(10px)}66%{-webkit-transform:translateY(-10px);transform:translateY(-10px)}to{-webkit-transform:translateY(0);transform:translateY(0)}}@keyframes ball-pulse-sync{33%{-webkit-transform:translateY(10px);transform:translateY(10px)}66%{-webkit-transform:translateY(-10px);transform:translateY(-10px)}to{-webkit-transform:translateY(0);transform:translateY(0)}}.ball-pulse-sync>div:nth-child(0){-webkit-animation:ball-pulse-sync .6s ease-in-out -.21s infinite;animation:ball-pulse-sync .6s ease-in-out -.21s infinite}.ball-pulse-sync>div:first-child{-webkit-animation:ball-pulse-sync .6s ease-in-out -.14s infinite;animation:ball-pulse-sync .6s ease-in-out -.14s infinite}.ball-pulse-sync>div:nth-child(2){-webkit-animation:ball-pulse-sync .6s ease-in-out -.07s infinite;animation:ball-pulse-sync .6s ease-in-out -.07s infinite}.ball-pulse-sync>div:nth-child(3){-webkit-animation:ball-pulse-sync .6s ease-in-out 0s infinite;animation:ball-pulse-sync .6s ease-in-out 0s infinite}.ball-pulse-sync>div{-webkit-animation-fill-mode:both;animation-fill-mode:both;background-color:#fff;border-radius:100%;display:inline-block;height:15px;margin:2px;width:15px}@-webkit-keyframes ball-scale{0%{-webkit-transform:scale(0);transform:scale(0)}to{opacity:0;-webkit-transform:scale(1);transform:scale(1)}}@keyframes ball-scale{0%{-webkit-transform:scale(0);transform:scale(0)}to{opacity:0;-webkit-transform:scale(1);transform:scale(1)}}.ball-scale>div{-webkit-animation-fill-mode:both;animation-fill-mode:both;-webkit-animation:ball-scale 1s ease-in-out 0s infinite;animation:ball-scale 1s ease-in-out 0s infinite;background-color:#fff;border-radius:100%;display:inline-block;height:15px;height:60px;margin:2px;width:15px;width:60px}.ball-scale-random{height:40px;width:37px}.ball-scale-random>div{-webkit-animation-fill-mode:both;animation-fill-mode:both;-webkit-animation:ball-scale 1s ease-in-out 0s infinite;animation:ball-scale 1s ease-in-out 0s infinite;background-color:#fff;border-radius:100%;display:inline-block;height:15px;height:30px;margin:2px;position:absolute;width:15px;width:30px}.ball-scale-random>div:first-child{-webkit-animation:ball-scale 1s ease-in-out .2s infinite;animation:ball-scale 1s ease-in-out .2s infinite;margin-left:-7px}.ball-scale-random>div:nth-child(3){-webkit-animation:ball-scale 1s ease-in-out .5s infinite;animation:ball-scale 1s ease-in-out .5s infinite;margin-left:-2px;margin-top:9px}@-webkit-keyframes rotate{0%{-webkit-transform:rotate(0deg);transform:rotate(0deg)}50%{-webkit-transform:rotate(180deg);transform:rotate(180deg)}to{-webkit-transform:rotate(1turn);transform:rotate(1turn)}}.ball-rotate,.ball-rotate>div{position:relative}.ball-rotate>div{-webkit-animation-fill-mode:both;animation-fill-mode:both;background-color:#fff;border-radius:100%;height:15px;margin:2px;width:15px}.ball-rotate>div:first-child{-webkit-animation:rotate 1s cubic-bezier(.7,-.13,.22,.86) 0s infinite;animation:rotate 1s cubic-bezier(.7,-.13,.22,.86) 0s infinite}.ball-rotate>div:after,.ball-rotate>div:before{background-color:#fff;border-radius:100%;content:\\\"\\\";height:15px;margin:2px;opacity:.8;position:absolute;width:15px}.ball-rotate>div:before{left:-28px;top:0}.ball-rotate>div:after{left:25px;top:0}.ball-clip-rotate>div{-webkit-animation-fill-mode:both;animation-fill-mode:both;-webkit-animation:rotate .75s linear 0s infinite;animation:rotate .75s linear 0s infinite;background-color:#fff;background:transparent!important;border:2px solid;border-color:#fff #fff transparent;border-radius:100%;display:inline-block;height:15px;height:25px;margin:2px;width:15px;width:25px}@keyframes scale{30%{-webkit-transform:scale(.3);transform:scale(.3)}to{-webkit-transform:scale(1);transform:scale(1)}}.ball-clip-rotate-pulse{position:relative;-webkit-transform:translateY(-15px);-ms-transform:translateY(-15px);transform:translateY(-15px)}.ball-clip-rotate-pulse>div{-webkit-animation-fill-mode:both;animation-fill-mode:both;border-radius:100%;left:0;position:absolute;top:0}.ball-clip-rotate-pulse>div:first-child{-webkit-animation:scale 1s cubic-bezier(.09,.57,.49,.9) 0s infinite;animation:scale 1s cubic-bezier(.09,.57,.49,.9) 0s infinite;background:#fff;height:16px;left:-7px;top:7px;width:16px}.ball-clip-rotate-pulse>div:last-child{-webkit-animation:rotate 1s cubic-bezier(.09,.57,.49,.9) 0s infinite;animation:rotate 1s cubic-bezier(.09,.57,.49,.9) 0s infinite;-webkit-animation-duration:1s;animation-duration:1s;background:transparent;border:2px solid;border-color:#fff transparent;border-style:solid;border-width:2px;height:30px;left:-16px;position:absolute;top:-2px;width:30px}@keyframes rotate{0%{-webkit-transform:rotate(0deg) scale(1);transform:rotate(0deg) scale(1)}50%{-webkit-transform:rotate(180deg) scale(.6);transform:rotate(180deg) scale(.6)}to{-webkit-transform:rotate(1turn) scale(1);transform:rotate(1turn) scale(1)}}.ball-clip-rotate-multiple{position:relative}.ball-clip-rotate-multiple>div{-webkit-animation-fill-mode:both;animation-fill-mode:both;-webkit-animation:rotate 1s ease-in-out 0s infinite;animation:rotate 1s ease-in-out 0s infinite;border-color:transparent #fff;border-radius:100%;border-style:solid;border-width:2px;height:35px;left:-20px;position:absolute;top:-20px;width:35px}.ball-clip-rotate-multiple>div:last-child{-webkit-animation-direction:reverse;animation-direction:reverse;-webkit-animation-duration:.5s;animation-duration:.5s;border-color:#fff transparent;display:inline-block;height:15px;left:-10px;top:-10px;width:15px}@-webkit-keyframes ball-scale-ripple{0%{opacity:1;-webkit-transform:scale(.1);transform:scale(.1)}70%{opacity:.7;-webkit-transform:scale(1);transform:scale(1)}to{opacity:0}}@keyframes ball-scale-ripple{0%{opacity:1;-webkit-transform:scale(.1);transform:scale(.1)}70%{opacity:.7;-webkit-transform:scale(1);transform:scale(1)}to{opacity:0}}.ball-scale-ripple>div{-webkit-animation-fill-mode:both;animation-fill-mode:both;-webkit-animation:ball-scale-ripple 1s cubic-bezier(.21,.53,.56,.8) 0s infinite;animation:ball-scale-ripple 1s cubic-bezier(.21,.53,.56,.8) 0s infinite;border:2px solid #fff;border-radius:100%;height:50px;width:50px}@-webkit-keyframes ball-scale-ripple-multiple{0%{opacity:1;-webkit-transform:scale(.1);transform:scale(.1)}70%{opacity:.7;-webkit-transform:scale(1);transform:scale(1)}to{opacity:0}}@keyframes ball-scale-ripple-multiple{0%{opacity:1;-webkit-transform:scale(.1);transform:scale(.1)}70%{opacity:.7;-webkit-transform:scale(1);transform:scale(1)}to{opacity:0}}.ball-scale-ripple-multiple{position:relative;-webkit-transform:translateY(-25px);-ms-transform:translateY(-25px);transform:translateY(-25px)}.ball-scale-ripple-multiple>div:nth-child(0){-webkit-animation-delay:-.8s;animation-delay:-.8s}.ball-scale-ripple-multiple>div:first-child{-webkit-animation-delay:-.6s;animation-delay:-.6s}.ball-scale-ripple-multiple>div:nth-child(2){-webkit-animation-delay:-.4s;animation-delay:-.4s}.ball-scale-ripple-multiple>div:nth-child(3){-webkit-animation-delay:-.2s;animation-delay:-.2s}.ball-scale-ripple-multiple>div{-webkit-animation-fill-mode:both;animation-fill-mode:both;-webkit-animation:ball-scale-ripple-multiple 1.25s cubic-bezier(.21,.53,.56,.8) 0s infinite;animation:ball-scale-ripple-multiple 1.25s cubic-bezier(.21,.53,.56,.8) 0s infinite;border:2px solid #fff;border-radius:100%;height:50px;left:-26px;position:absolute;top:-2px;width:50px}@-webkit-keyframes ball-beat{50%{opacity:.2;-webkit-transform:scale(.75);transform:scale(.75)}to{opacity:1;-webkit-transform:scale(1);transform:scale(1)}}@keyframes ball-beat{50%{opacity:.2;-webkit-transform:scale(.75);transform:scale(.75)}to{opacity:1;-webkit-transform:scale(1);transform:scale(1)}}.ball-beat>div{-webkit-animation-fill-mode:both;animation-fill-mode:both;-webkit-animation:ball-beat .7s linear 0s infinite;animation:ball-beat .7s linear 0s infinite;background-color:#fff;border-radius:100%;display:inline-block;height:15px;margin:2px;width:15px}.ball-beat>div:nth-child(2n-1){-webkit-animation-delay:-.35s!important;animation-delay:-.35s!important}@-webkit-keyframes ball-scale-multiple{0%{opacity:0;-webkit-transform:scale(0);transform:scale(0)}5%{opacity:1}to{opacity:0;-webkit-transform:scale(1);transform:scale(1)}}@keyframes ball-scale-multiple{0%{opacity:0;-webkit-transform:scale(0);transform:scale(0)}5%{opacity:1}to{opacity:0;-webkit-transform:scale(1);transform:scale(1)}}.ball-scale-multiple{position:relative;-webkit-transform:translateY(-30px);-ms-transform:translateY(-30px);transform:translateY(-30px)}.ball-scale-multiple>div:nth-child(2){-webkit-animation-delay:-.4s;animation-delay:-.4s}.ball-scale-multiple>div:nth-child(3){-webkit-animation-delay:-.2s;animation-delay:-.2s}.ball-scale-multiple>div{-webkit-animation-fill-mode:both;animation-fill-mode:both;-webkit-animation:ball-scale-multiple 1s linear 0s infinite;animation:ball-scale-multiple 1s linear 0s infinite;background-color:#fff;border-radius:100%;height:15px;height:60px;left:-30px;margin:0;opacity:0;position:absolute;top:0;width:15px;width:60px}@-webkit-keyframes ball-triangle-path-1{33%{-webkit-transform:translate(25px,-50px);transform:translate(25px,-50px)}66%{-webkit-transform:translate(50px);transform:translate(50px)}to{-webkit-transform:translate(0);transform:translate(0)}}@keyframes ball-triangle-path-1{33%{-webkit-transform:translate(25px,-50px);transform:translate(25px,-50px)}66%{-webkit-transform:translate(50px);transform:translate(50px)}to{-webkit-transform:translate(0);transform:translate(0)}}@-webkit-keyframes ball-triangle-path-2{33%{-webkit-transform:translate(25px,50px);transform:translate(25px,50px)}66%{-webkit-transform:translate(-25px,50px);transform:translate(-25px,50px)}to{-webkit-transform:translate(0);transform:translate(0)}}@keyframes ball-triangle-path-2{33%{-webkit-transform:translate(25px,50px);transform:translate(25px,50px)}66%{-webkit-transform:translate(-25px,50px);transform:translate(-25px,50px)}to{-webkit-transform:translate(0);transform:translate(0)}}@-webkit-keyframes ball-triangle-path-3{33%{-webkit-transform:translate(-50px);transform:translate(-50px)}66%{-webkit-transform:translate(-25px,-50px);transform:translate(-25px,-50px)}to{-webkit-transform:translate(0);transform:translate(0)}}@keyframes ball-triangle-path-3{33%{-webkit-transform:translate(-50px);transform:translate(-50px)}66%{-webkit-transform:translate(-25px,-50px);transform:translate(-25px,-50px)}to{-webkit-transform:translate(0);transform:translate(0)}}.ball-triangle-path{position:relative;-webkit-transform:translate(-29.994px,-37.50938px);-ms-transform:translate(-29.994px,-37.50938px);transform:translate(-29.994px,-37.50938px)}.ball-triangle-path>div:first-child{-webkit-animation-iteration-count:infinite;animation-iteration-count:infinite;-webkit-animation-name:ball-triangle-path-1;animation-name:ball-triangle-path-1;-webkit-animation-timing-function:ease-in-out;animation-timing-function:ease-in-out}.ball-triangle-path>div:first-child,.ball-triangle-path>div:nth-child(2){-webkit-animation-delay:0;animation-delay:0;-webkit-animation-duration:2s;animation-duration:2s}.ball-triangle-path>div:nth-child(2){-webkit-animation-iteration-count:infinite;animation-iteration-count:infinite;-webkit-animation-name:ball-triangle-path-2;animation-name:ball-triangle-path-2;-webkit-animation-timing-function:ease-in-out;animation-timing-function:ease-in-out}.ball-triangle-path>div:nth-child(3){-webkit-animation-delay:0;animation-delay:0;-webkit-animation-duration:2s;animation-duration:2s;-webkit-animation-iteration-count:infinite;animation-iteration-count:infinite;-webkit-animation-name:ball-triangle-path-3;animation-name:ball-triangle-path-3;-webkit-animation-timing-function:ease-in-out;animation-timing-function:ease-in-out}.ball-triangle-path>div{-webkit-animation-fill-mode:both;animation-fill-mode:both;border:1px solid #fff;border-radius:100%;height:10px;position:absolute;width:10px}.ball-triangle-path>div:first-of-type{top:50px}.ball-triangle-path>div:nth-of-type(2){left:25px}.ball-triangle-path>div:nth-of-type(3){left:50px;top:50px}@-webkit-keyframes ball-pulse-rise-even{0%{-webkit-transform:scale(1.1);transform:scale(1.1)}25%{-webkit-transform:translateY(-30px);transform:translateY(-30px)}50%{-webkit-transform:scale(.4);transform:scale(.4)}75%{-webkit-transform:translateY(30px);transform:translateY(30px)}to{-webkit-transform:translateY(0);transform:translateY(0);-webkit-transform:scale(1);transform:scale(1)}}@keyframes ball-pulse-rise-even{0%{-webkit-transform:scale(1.1);transform:scale(1.1)}25%{-webkit-transform:translateY(-30px);transform:translateY(-30px)}50%{-webkit-transform:scale(.4);transform:scale(.4)}75%{-webkit-transform:translateY(30px);transform:translateY(30px)}to{-webkit-transform:translateY(0);transform:translateY(0);-webkit-transform:scale(1);transform:scale(1)}}@-webkit-keyframes ball-pulse-rise-odd{0%{-webkit-transform:scale(.4);transform:scale(.4)}25%{-webkit-transform:translateY(30px);transform:translateY(30px)}50%{-webkit-transform:scale(1.1);transform:scale(1.1)}75%{-webkit-transform:translateY(-30px);transform:translateY(-30px)}to{-webkit-transform:translateY(0);transform:translateY(0);-webkit-transform:scale(.75);transform:scale(.75)}}@keyframes ball-pulse-rise-odd{0%{-webkit-transform:scale(.4);transform:scale(.4)}25%{-webkit-transform:translateY(30px);transform:translateY(30px)}50%{-webkit-transform:scale(1.1);transform:scale(1.1)}75%{-webkit-transform:translateY(-30px);transform:translateY(-30px)}to{-webkit-transform:translateY(0);transform:translateY(0);-webkit-transform:scale(.75);transform:scale(.75)}}.ball-pulse-rise>div{-webkit-animation-delay:0;animation-delay:0;-webkit-animation-duration:1s;animation-duration:1s;-webkit-animation-fill-mode:both;animation-fill-mode:both;-webkit-animation-iteration-count:infinite;animation-iteration-count:infinite;-webkit-animation-timing-function:cubic-bezier(.15,.46,.9,.6);animation-timing-function:cubic-bezier(.15,.46,.9,.6);background-color:#fff;border-radius:100%;display:inline-block;height:15px;margin:2px;width:15px}.ball-pulse-rise>div:nth-child(2n){-webkit-animation-name:ball-pulse-rise-even;animation-name:ball-pulse-rise-even}.ball-pulse-rise>div:nth-child(2n-1){-webkit-animation-name:ball-pulse-rise-odd;animation-name:ball-pulse-rise-odd}@-webkit-keyframes ball-grid-beat{50%{opacity:.7}to{opacity:1}}@keyframes ball-grid-beat{50%{opacity:.7}to{opacity:1}}.ball-grid-beat{width:57px}.ball-grid-beat>div:first-child{-webkit-animation-delay:.44s;animation-delay:.44s;-webkit-animation-duration:1.27s;animation-duration:1.27s}.ball-grid-beat>div:nth-child(2){-webkit-animation-delay:.2s;animation-delay:.2s;-webkit-animation-duration:1.52s;animation-duration:1.52s}.ball-grid-beat>div:nth-child(3){-webkit-animation-delay:.14s;animation-delay:.14s;-webkit-animation-duration:.61s;animation-duration:.61s}.ball-grid-beat>div:nth-child(4){-webkit-animation-delay:.15s;animation-delay:.15s;-webkit-animation-duration:.82s;animation-duration:.82s}.ball-grid-beat>div:nth-child(5){-webkit-animation-delay:-.01s;animation-delay:-.01s;-webkit-animation-duration:1.24s;animation-duration:1.24s}.ball-grid-beat>div:nth-child(6){-webkit-animation-delay:-.07s;animation-delay:-.07s;-webkit-animation-duration:1.35s;animation-duration:1.35s}.ball-grid-beat>div:nth-child(7){-webkit-animation-delay:.29s;animation-delay:.29s;-webkit-animation-duration:1.44s;animation-duration:1.44s}.ball-grid-beat>div:nth-child(8){-webkit-animation-delay:.63s;animation-delay:.63s;-webkit-animation-duration:1.19s;animation-duration:1.19s}.ball-grid-beat>div:nth-child(9){-webkit-animation-delay:-.18s;animation-delay:-.18s;-webkit-animation-duration:1.48s;animation-duration:1.48s}.ball-grid-beat>div{-webkit-animation-delay:0;animation-delay:0;-webkit-animation-fill-mode:both;animation-fill-mode:both;-webkit-animation-iteration-count:infinite;animation-iteration-count:infinite;-webkit-animation-name:ball-grid-beat;animation-name:ball-grid-beat;background-color:#fff;border-radius:100%;display:inline-block;float:left;height:15px;margin:2px;width:15px}@-webkit-keyframes ball-grid-pulse{0%{-webkit-transform:scale(1);transform:scale(1)}50%{opacity:.7;-webkit-transform:scale(.5);transform:scale(.5)}to{opacity:1;-webkit-transform:scale(1);transform:scale(1)}}@keyframes ball-grid-pulse{0%{-webkit-transform:scale(1);transform:scale(1)}50%{opacity:.7;-webkit-transform:scale(.5);transform:scale(.5)}to{opacity:1;-webkit-transform:scale(1);transform:scale(1)}}.ball-grid-pulse{width:57px}.ball-grid-pulse>div:first-child{-webkit-animation-delay:.58s;animation-delay:.58s;-webkit-animation-duration:.9s;animation-duration:.9s}.ball-grid-pulse>div:nth-child(2){-webkit-animation-delay:.01s;animation-delay:.01s;-webkit-animation-duration:.94s;animation-duration:.94s}.ball-grid-pulse>div:nth-child(3){-webkit-animation-delay:.25s;animation-delay:.25s;-webkit-animation-duration:1.43s;animation-duration:1.43s}.ball-grid-pulse>div:nth-child(4){-webkit-animation-delay:-.03s;animation-delay:-.03s;-webkit-animation-duration:.74s;animation-duration:.74s}.ball-grid-pulse>div:nth-child(5){-webkit-animation-delay:.21s;animation-delay:.21s;-webkit-animation-duration:.68s;animation-duration:.68s}.ball-grid-pulse>div:nth-child(6){-webkit-animation-delay:.25s;animation-delay:.25s;-webkit-animation-duration:1.17s;animation-duration:1.17s}.ball-grid-pulse>div:nth-child(7){-webkit-animation-delay:.46s;animation-delay:.46s;-webkit-animation-duration:1.41s;animation-duration:1.41s}.ball-grid-pulse>div:nth-child(8){-webkit-animation-delay:.02s;animation-delay:.02s;-webkit-animation-duration:1.56s;animation-duration:1.56s}.ball-grid-pulse>div:nth-child(9){-webkit-animation-delay:.13s;animation-delay:.13s;-webkit-animation-duration:.78s;animation-duration:.78s}.ball-grid-pulse>div{-webkit-animation-delay:0;animation-delay:0;-webkit-animation-fill-mode:both;animation-fill-mode:both;-webkit-animation-iteration-count:infinite;animation-iteration-count:infinite;-webkit-animation-name:ball-grid-pulse;animation-name:ball-grid-pulse;background-color:#fff;border-radius:100%;display:inline-block;float:left;height:15px;margin:2px;width:15px}@-webkit-keyframes ball-spin-fade-loader{50%{opacity:.3;-webkit-transform:scale(.4);transform:scale(.4)}to{opacity:1;-webkit-transform:scale(1);transform:scale(1)}}@keyframes ball-spin-fade-loader{50%{opacity:.3;-webkit-transform:scale(.4);transform:scale(.4)}to{opacity:1;-webkit-transform:scale(1);transform:scale(1)}}.ball-spin-fade-loader{left:-10px;position:relative;top:-10px}.ball-spin-fade-loader>div:first-child{-webkit-animation:ball-spin-fade-loader 1s linear -.96s infinite;animation:ball-spin-fade-loader 1s linear -.96s infinite;left:0;top:25px}.ball-spin-fade-loader>div:nth-child(2){-webkit-animation:ball-spin-fade-loader 1s linear -.84s infinite;animation:ball-spin-fade-loader 1s linear -.84s infinite;left:17.04545px;top:17.04545px}.ball-spin-fade-loader>div:nth-child(3){-webkit-animation:ball-spin-fade-loader 1s linear -.72s infinite;animation:ball-spin-fade-loader 1s linear -.72s infinite;left:25px;top:0}.ball-spin-fade-loader>div:nth-child(4){-webkit-animation:ball-spin-fade-loader 1s linear -.6s infinite;animation:ball-spin-fade-loader 1s linear -.6s infinite;left:17.04545px;top:-17.04545px}.ball-spin-fade-loader>div:nth-child(5){-webkit-animation:ball-spin-fade-loader 1s linear -.48s infinite;animation:ball-spin-fade-loader 1s linear -.48s infinite;left:0;top:-25px}.ball-spin-fade-loader>div:nth-child(6){-webkit-animation:ball-spin-fade-loader 1s linear -.36s infinite;animation:ball-spin-fade-loader 1s linear -.36s infinite;left:-17.04545px;top:-17.04545px}.ball-spin-fade-loader>div:nth-child(7){-webkit-animation:ball-spin-fade-loader 1s linear -.24s infinite;animation:ball-spin-fade-loader 1s linear -.24s infinite;left:-25px;top:0}.ball-spin-fade-loader>div:nth-child(8){-webkit-animation:ball-spin-fade-loader 1s linear -.12s infinite;animation:ball-spin-fade-loader 1s linear -.12s infinite;left:-17.04545px;top:17.04545px}.ball-spin-fade-loader>div{-webkit-animation-fill-mode:both;animation-fill-mode:both;background-color:#fff;border-radius:100%;height:15px;margin:2px;position:absolute;width:15px}@-webkit-keyframes ball-spin-loader{75%{opacity:.2}to{opacity:1}}@keyframes ball-spin-loader{75%{opacity:.2}to{opacity:1}}.ball-spin-loader{position:relative}.ball-spin-loader>span:first-child{-webkit-animation:ball-spin-loader 2s linear .9s infinite;animation:ball-spin-loader 2s linear .9s infinite;left:0;top:45px}.ball-spin-loader>span:nth-child(2){-webkit-animation:ball-spin-loader 2s linear 1.8s infinite;animation:ball-spin-loader 2s linear 1.8s infinite;left:30.68182px;top:30.68182px}.ball-spin-loader>span:nth-child(3){-webkit-animation:ball-spin-loader 2s linear 2.7s infinite;animation:ball-spin-loader 2s linear 2.7s infinite;left:45px;top:0}.ball-spin-loader>span:nth-child(4){-webkit-animation:ball-spin-loader 2s linear 3.6s infinite;animation:ball-spin-loader 2s linear 3.6s infinite;left:30.68182px;top:-30.68182px}.ball-spin-loader>span:nth-child(5){-webkit-animation:ball-spin-loader 2s linear 4.5s infinite;animation:ball-spin-loader 2s linear 4.5s infinite;left:0;top:-45px}.ball-spin-loader>span:nth-child(6){-webkit-animation:ball-spin-loader 2s linear 5.4s infinite;animation:ball-spin-loader 2s linear 5.4s infinite;left:-30.68182px;top:-30.68182px}.ball-spin-loader>span:nth-child(7){-webkit-animation:ball-spin-loader 2s linear 6.3s infinite;animation:ball-spin-loader 2s linear 6.3s infinite;left:-45px;top:0}.ball-spin-loader>span:nth-child(8){-webkit-animation:ball-spin-loader 2s linear 7.2s infinite;animation:ball-spin-loader 2s linear 7.2s infinite;left:-30.68182px;top:30.68182px}.ball-spin-loader>div{-webkit-animation-fill-mode:both;animation-fill-mode:both;background:green;border-radius:100%;height:15px;position:absolute;width:15px}@-webkit-keyframes ball-zig{33%{-webkit-transform:translate(-15px,-30px);transform:translate(-15px,-30px)}66%{-webkit-transform:translate(15px,-30px);transform:translate(15px,-30px)}to{-webkit-transform:translate(0);transform:translate(0)}}@keyframes ball-zig{33%{-webkit-transform:translate(-15px,-30px);transform:translate(-15px,-30px)}66%{-webkit-transform:translate(15px,-30px);transform:translate(15px,-30px)}to{-webkit-transform:translate(0);transform:translate(0)}}@-webkit-keyframes ball-zag{33%{-webkit-transform:translate(15px,30px);transform:translate(15px,30px)}66%{-webkit-transform:translate(-15px,30px);transform:translate(-15px,30px)}to{-webkit-transform:translate(0);transform:translate(0)}}@keyframes ball-zag{33%{-webkit-transform:translate(15px,30px);transform:translate(15px,30px)}66%{-webkit-transform:translate(-15px,30px);transform:translate(-15px,30px)}to{-webkit-transform:translate(0);transform:translate(0)}}.ball-zig-zag{position:relative;-webkit-transform:translate(-15px,-15px);-ms-transform:translate(-15px,-15px);transform:translate(-15px,-15px)}.ball-zig-zag>div{-webkit-animation-fill-mode:both;animation-fill-mode:both;background-color:#fff;border-radius:100%;height:15px;left:-7px;margin:2px 2px 2px 15px;position:absolute;top:4px;width:15px}.ball-zig-zag>div:first-child{-webkit-animation:ball-zig .7s linear 0s infinite;animation:ball-zig .7s linear 0s infinite}.ball-zig-zag>div:last-child{-webkit-animation:ball-zag .7s linear 0s infinite;animation:ball-zag .7s linear 0s infinite}@-webkit-keyframes ball-zig-deflect{17%{-webkit-transform:translate(-15px,-30px);transform:translate(-15px,-30px)}34%{-webkit-transform:translate(15px,-30px);transform:translate(15px,-30px)}50%{-webkit-transform:translate(0);transform:translate(0)}67%{-webkit-transform:translate(15px,-30px);transform:translate(15px,-30px)}84%{-webkit-transform:translate(-15px,-30px);transform:translate(-15px,-30px)}to{-webkit-transform:translate(0);transform:translate(0)}}@keyframes ball-zig-deflect{17%{-webkit-transform:translate(-15px,-30px);transform:translate(-15px,-30px)}34%{-webkit-transform:translate(15px,-30px);transform:translate(15px,-30px)}50%{-webkit-transform:translate(0);transform:translate(0)}67%{-webkit-transform:translate(15px,-30px);transform:translate(15px,-30px)}84%{-webkit-transform:translate(-15px,-30px);transform:translate(-15px,-30px)}to{-webkit-transform:translate(0);transform:translate(0)}}@-webkit-keyframes ball-zag-deflect{17%{-webkit-transform:translate(15px,30px);transform:translate(15px,30px)}34%{-webkit-transform:translate(-15px,30px);transform:translate(-15px,30px)}50%{-webkit-transform:translate(0);transform:translate(0)}67%{-webkit-transform:translate(-15px,30px);transform:translate(-15px,30px)}84%{-webkit-transform:translate(15px,30px);transform:translate(15px,30px)}to{-webkit-transform:translate(0);transform:translate(0)}}@keyframes ball-zag-deflect{17%{-webkit-transform:translate(15px,30px);transform:translate(15px,30px)}34%{-webkit-transform:translate(-15px,30px);transform:translate(-15px,30px)}50%{-webkit-transform:translate(0);transform:translate(0)}67%{-webkit-transform:translate(-15px,30px);transform:translate(-15px,30px)}84%{-webkit-transform:translate(15px,30px);transform:translate(15px,30px)}to{-webkit-transform:translate(0);transform:translate(0)}}.ball-zig-zag-deflect{position:relative;-webkit-transform:translate(-15px,-15px);-ms-transform:translate(-15px,-15px);transform:translate(-15px,-15px)}.ball-zig-zag-deflect>div{-webkit-animation-fill-mode:both;animation-fill-mode:both;background-color:#fff;border-radius:100%;height:15px;left:-7px;margin:2px 2px 2px 15px;position:absolute;top:4px;width:15px}.ball-zig-zag-deflect>div:first-child{-webkit-animation:ball-zig-deflect 1.5s linear 0s infinite;animation:ball-zig-deflect 1.5s linear 0s infinite}.ball-zig-zag-deflect>div:last-child{-webkit-animation:ball-zag-deflect 1.5s linear 0s infinite;animation:ball-zag-deflect 1.5s linear 0s infinite}@-webkit-keyframes line-scale{0%{-webkit-transform:scaley(1);transform:scaley(1)}50%{-webkit-transform:scaley(.4);transform:scaley(.4)}to{-webkit-transform:scaley(1);transform:scaley(1)}}@keyframes line-scale{0%{-webkit-transform:scaley(1);transform:scaley(1)}50%{-webkit-transform:scaley(.4);transform:scaley(.4)}to{-webkit-transform:scaley(1);transform:scaley(1)}}.line-scale>div:first-child{-webkit-animation:line-scale 1s cubic-bezier(.2,.68,.18,1.08) -.4s infinite;animation:line-scale 1s cubic-bezier(.2,.68,.18,1.08) -.4s infinite}.line-scale>div:nth-child(2){-webkit-animation:line-scale 1s cubic-bezier(.2,.68,.18,1.08) -.3s infinite;animation:line-scale 1s cubic-bezier(.2,.68,.18,1.08) -.3s infinite}.line-scale>div:nth-child(3){-webkit-animation:line-scale 1s cubic-bezier(.2,.68,.18,1.08) -.2s infinite;animation:line-scale 1s cubic-bezier(.2,.68,.18,1.08) -.2s infinite}.line-scale>div:nth-child(4){-webkit-animation:line-scale 1s cubic-bezier(.2,.68,.18,1.08) -.1s infinite;animation:line-scale 1s cubic-bezier(.2,.68,.18,1.08) -.1s infinite}.line-scale>div:nth-child(5){-webkit-animation:line-scale 1s cubic-bezier(.2,.68,.18,1.08) 0s infinite;animation:line-scale 1s cubic-bezier(.2,.68,.18,1.08) 0s infinite}.line-scale>div{-webkit-animation-fill-mode:both;animation-fill-mode:both;background-color:#fff;border-radius:2px;display:inline-block;height:35px;margin:2px;width:4px}@-webkit-keyframes line-scale-party{0%{-webkit-transform:scale(1);transform:scale(1)}50%{-webkit-transform:scale(.5);transform:scale(.5)}to{-webkit-transform:scale(1);transform:scale(1)}}@keyframes line-scale-party{0%{-webkit-transform:scale(1);transform:scale(1)}50%{-webkit-transform:scale(.5);transform:scale(.5)}to{-webkit-transform:scale(1);transform:scale(1)}}.line-scale-party>div:first-child{-webkit-animation-delay:-.09s;animation-delay:-.09s;-webkit-animation-duration:.83s;animation-duration:.83s}.line-scale-party>div:nth-child(2){-webkit-animation-delay:.33s;animation-delay:.33s;-webkit-animation-duration:.64s;animation-duration:.64s}.line-scale-party>div:nth-child(3){-webkit-animation-delay:.32s;animation-delay:.32s;-webkit-animation-duration:.39s;animation-duration:.39s}.line-scale-party>div:nth-child(4){-webkit-animation-delay:.47s;animation-delay:.47s;-webkit-animation-duration:.52s;animation-duration:.52s}.line-scale-party>div{-webkit-animation-delay:0;animation-delay:0;-webkit-animation-fill-mode:both;animation-fill-mode:both;-webkit-animation-iteration-count:infinite;animation-iteration-count:infinite;-webkit-animation-name:line-scale-party;animation-name:line-scale-party;background-color:#fff;border-radius:2px;display:inline-block;height:35px;margin:2px;width:4px}@-webkit-keyframes line-scale-pulse-out{0%{-webkit-transform:scaley(1);transform:scaley(1)}50%{-webkit-transform:scaley(.4);transform:scaley(.4)}to{-webkit-transform:scaley(1);transform:scaley(1)}}@keyframes line-scale-pulse-out{0%{-webkit-transform:scaley(1);transform:scaley(1)}50%{-webkit-transform:scaley(.4);transform:scaley(.4)}to{-webkit-transform:scaley(1);transform:scaley(1)}}.line-scale-pulse-out>div{-webkit-animation-fill-mode:both;animation-fill-mode:both;-webkit-animation:line-scale-pulse-out .9s cubic-bezier(.85,.25,.37,.85) -.6s infinite;animation:line-scale-pulse-out .9s cubic-bezier(.85,.25,.37,.85) -.6s infinite;background-color:#fff;border-radius:2px;display:inline-block;height:35px;margin:2px;width:4px}.line-scale-pulse-out>div:nth-child(2),.line-scale-pulse-out>div:nth-child(4){-webkit-animation-delay:-.4s!important;animation-delay:-.4s!important}.line-scale-pulse-out>div:first-child,.line-scale-pulse-out>div:nth-child(5){-webkit-animation-delay:-.2s!important;animation-delay:-.2s!important}@-webkit-keyframes line-scale-pulse-out-rapid{0%{-webkit-transform:scaley(1);transform:scaley(1)}80%{-webkit-transform:scaley(.3);transform:scaley(.3)}90%{-webkit-transform:scaley(1);transform:scaley(1)}}@keyframes line-scale-pulse-out-rapid{0%{-webkit-transform:scaley(1);transform:scaley(1)}80%{-webkit-transform:scaley(.3);transform:scaley(.3)}90%{-webkit-transform:scaley(1);transform:scaley(1)}}.line-scale-pulse-out-rapid>div{-webkit-animation-fill-mode:both;animation-fill-mode:both;-webkit-animation:line-scale-pulse-out-rapid .9s cubic-bezier(.11,.49,.38,.78) -.5s infinite;animation:line-scale-pulse-out-rapid .9s cubic-bezier(.11,.49,.38,.78) -.5s infinite;background-color:#fff;border-radius:2px;display:inline-block;height:35px;margin:2px;width:4px}.line-scale-pulse-out-rapid>div:nth-child(2),.line-scale-pulse-out-rapid>div:nth-child(4){-webkit-animation-delay:-.25s!important;animation-delay:-.25s!important}.line-scale-pulse-out-rapid>div:first-child,.line-scale-pulse-out-rapid>div:nth-child(5){-webkit-animation-delay:0s!important;animation-delay:0s!important}@-webkit-keyframes line-spin-fade-loader{50%{opacity:.3}to{opacity:1}}@keyframes line-spin-fade-loader{50%{opacity:.3}to{opacity:1}}.line-spin-fade-loader{left:-4px;position:relative;top:-10px}.line-spin-fade-loader>div:first-child{-webkit-animation:line-spin-fade-loader 1.2s ease-in-out -.84s infinite;animation:line-spin-fade-loader 1.2s ease-in-out -.84s infinite;left:0;top:20px}.line-spin-fade-loader>div:nth-child(2){-webkit-animation:line-spin-fade-loader 1.2s ease-in-out -.72s infinite;animation:line-spin-fade-loader 1.2s ease-in-out -.72s infinite;left:13.63636px;top:13.63636px;-webkit-transform:rotate(-45deg);-ms-transform:rotate(-45deg);transform:rotate(-45deg)}.line-spin-fade-loader>div:nth-child(3){-webkit-animation:line-spin-fade-loader 1.2s ease-in-out -.6s infinite;animation:line-spin-fade-loader 1.2s ease-in-out -.6s infinite;left:20px;top:0;-webkit-transform:rotate(90deg);-ms-transform:rotate(90deg);transform:rotate(90deg)}.line-spin-fade-loader>div:nth-child(4){-webkit-animation:line-spin-fade-loader 1.2s ease-in-out -.48s infinite;animation:line-spin-fade-loader 1.2s ease-in-out -.48s infinite;left:13.63636px;top:-13.63636px;-webkit-transform:rotate(45deg);-ms-transform:rotate(45deg);transform:rotate(45deg)}.line-spin-fade-loader>div:nth-child(5){-webkit-animation:line-spin-fade-loader 1.2s ease-in-out -.36s infinite;animation:line-spin-fade-loader 1.2s ease-in-out -.36s infinite;left:0;top:-20px}.line-spin-fade-loader>div:nth-child(6){-webkit-animation:line-spin-fade-loader 1.2s ease-in-out -.24s infinite;animation:line-spin-fade-loader 1.2s ease-in-out -.24s infinite;left:-13.63636px;top:-13.63636px;-webkit-transform:rotate(-45deg);-ms-transform:rotate(-45deg);transform:rotate(-45deg)}.line-spin-fade-loader>div:nth-child(7){-webkit-animation:line-spin-fade-loader 1.2s ease-in-out -.12s infinite;animation:line-spin-fade-loader 1.2s ease-in-out -.12s infinite;left:-20px;top:0;-webkit-transform:rotate(90deg);-ms-transform:rotate(90deg);transform:rotate(90deg)}.line-spin-fade-loader>div:nth-child(8){-webkit-animation:line-spin-fade-loader 1.2s ease-in-out 0s infinite;animation:line-spin-fade-loader 1.2s ease-in-out 0s infinite;left:-13.63636px;top:13.63636px;-webkit-transform:rotate(45deg);-ms-transform:rotate(45deg);transform:rotate(45deg)}.line-spin-fade-loader>div{-webkit-animation-fill-mode:both;animation-fill-mode:both;background-color:#fff;border-radius:2px;height:35px;height:15px;margin:2px;position:absolute;width:4px;width:5px}@-webkit-keyframes triangle-skew-spin{25%{-webkit-transform:perspective(100px) rotateX(180deg) rotateY(0);transform:perspective(100px) rotateX(180deg) rotateY(0)}50%{-webkit-transform:perspective(100px) rotateX(180deg) rotateY(180deg);transform:perspective(100px) rotateX(180deg) rotateY(180deg)}75%{-webkit-transform:perspective(100px) rotateX(0) rotateY(180deg);transform:perspective(100px) rotateX(0) rotateY(180deg)}to{-webkit-transform:perspective(100px) rotateX(0) rotateY(0);transform:perspective(100px) rotateX(0) rotateY(0)}}@keyframes triangle-skew-spin{25%{-webkit-transform:perspective(100px) rotateX(180deg) rotateY(0);transform:perspective(100px) rotateX(180deg) rotateY(0)}50%{-webkit-transform:perspective(100px) rotateX(180deg) rotateY(180deg);transform:perspective(100px) rotateX(180deg) rotateY(180deg)}75%{-webkit-transform:perspective(100px) rotateX(0) rotateY(180deg);transform:perspective(100px) rotateX(0) rotateY(180deg)}to{-webkit-transform:perspective(100px) rotateX(0) rotateY(0);transform:perspective(100px) rotateX(0) rotateY(0)}}.triangle-skew-spin>div{-webkit-animation-fill-mode:both;animation-fill-mode:both;-webkit-animation:triangle-skew-spin 3s cubic-bezier(.09,.57,.49,.9) 0s infinite;animation:triangle-skew-spin 3s cubic-bezier(.09,.57,.49,.9) 0s infinite;border-bottom:20px solid #fff;border-left:20px solid transparent;border-right:20px solid transparent;height:0;width:0}@-webkit-keyframes square-spin{25%{-webkit-transform:perspective(100px) rotateX(180deg) rotateY(0);transform:perspective(100px) rotateX(180deg) rotateY(0)}50%{-webkit-transform:perspective(100px) rotateX(180deg) rotateY(180deg);transform:perspective(100px) rotateX(180deg) rotateY(180deg)}75%{-webkit-transform:perspective(100px) rotateX(0) rotateY(180deg);transform:perspective(100px) rotateX(0) rotateY(180deg)}to{-webkit-transform:perspective(100px) rotateX(0) rotateY(0);transform:perspective(100px) rotateX(0) rotateY(0)}}@keyframes square-spin{25%{-webkit-transform:perspective(100px) rotateX(180deg) rotateY(0);transform:perspective(100px) rotateX(180deg) rotateY(0)}50%{-webkit-transform:perspective(100px) rotateX(180deg) rotateY(180deg);transform:perspective(100px) rotateX(180deg) rotateY(180deg)}75%{-webkit-transform:perspective(100px) rotateX(0) rotateY(180deg);transform:perspective(100px) rotateX(0) rotateY(180deg)}to{-webkit-transform:perspective(100px) rotateX(0) rotateY(0);transform:perspective(100px) rotateX(0) rotateY(0)}}.square-spin>div{-webkit-animation-fill-mode:both;animation-fill-mode:both;-webkit-animation:square-spin 3s cubic-bezier(.09,.57,.49,.9) 0s infinite;animation:square-spin 3s cubic-bezier(.09,.57,.49,.9) 0s infinite;background:#fff;border:1px solid red;height:50px;width:50px}@-webkit-keyframes rotate_pacman_half_up{0%{-webkit-transform:rotate(270deg);transform:rotate(270deg)}50%{-webkit-transform:rotate(1turn);transform:rotate(1turn)}to{-webkit-transform:rotate(270deg);transform:rotate(270deg)}}@keyframes rotate_pacman_half_up{0%{-webkit-transform:rotate(270deg);transform:rotate(270deg)}50%{-webkit-transform:rotate(1turn);transform:rotate(1turn)}to{-webkit-transform:rotate(270deg);transform:rotate(270deg)}}@-webkit-keyframes rotate_pacman_half_down{0%{-webkit-transform:rotate(90deg);transform:rotate(90deg)}50%{-webkit-transform:rotate(0deg);transform:rotate(0deg)}to{-webkit-transform:rotate(90deg);transform:rotate(90deg)}}@keyframes rotate_pacman_half_down{0%{-webkit-transform:rotate(90deg);transform:rotate(90deg)}50%{-webkit-transform:rotate(0deg);transform:rotate(0deg)}to{-webkit-transform:rotate(90deg);transform:rotate(90deg)}}@-webkit-keyframes pacman-balls{75%{opacity:.7}to{-webkit-transform:translate(-100px,-6.25px);transform:translate(-100px,-6.25px)}}@keyframes pacman-balls{75%{opacity:.7}to{-webkit-transform:translate(-100px,-6.25px);transform:translate(-100px,-6.25px)}}.pacman{position:relative}.pacman>div:nth-child(2){-webkit-animation:pacman-balls 1s linear -.99s infinite;animation:pacman-balls 1s linear -.99s infinite}.pacman>div:nth-child(3){-webkit-animation:pacman-balls 1s linear -.66s infinite;animation:pacman-balls 1s linear -.66s infinite}.pacman>div:nth-child(4){-webkit-animation:pacman-balls 1s linear -.33s infinite;animation:pacman-balls 1s linear -.33s infinite}.pacman>div:nth-child(5){-webkit-animation:pacman-balls 1s linear 0s infinite;animation:pacman-balls 1s linear 0s infinite}.pacman>div:first-of-type{-webkit-animation:rotate_pacman_half_up .5s 0s infinite;animation:rotate_pacman_half_up .5s 0s infinite}.pacman>div:first-of-type,.pacman>div:nth-child(2){border:25px solid #fff;border-radius:25px;border-right-color:transparent;height:0;left:-30px;position:relative;width:0}.pacman>div:nth-child(2){-webkit-animation:rotate_pacman_half_down .5s 0s infinite;animation:rotate_pacman_half_down .5s 0s infinite;margin-top:-50px}.pacman>div:nth-child(3),.pacman>div:nth-child(4),.pacman>div:nth-child(5),.pacman>div:nth-child(6){background-color:#fff;border-radius:100%;height:15px;height:10px;left:70px;margin:2px;position:absolute;top:25px;-webkit-transform:translateY(-6.25px);-ms-transform:translateY(-6.25px);transform:translateY(-6.25px);width:15px;width:10px}@-webkit-keyframes cube-transition{25%{-webkit-transform:translateX(50px) scale(.5) rotate(-90deg);transform:translateX(50px) scale(.5) rotate(-90deg)}50%{-webkit-transform:translate(50px,50px) rotate(-180deg);transform:translate(50px,50px) rotate(-180deg)}75%{-webkit-transform:translateY(50px) scale(.5) rotate(-270deg);transform:translateY(50px) scale(.5) rotate(-270deg)}to{-webkit-transform:rotate(-1turn);transform:rotate(-1turn)}}@keyframes cube-transition{25%{-webkit-transform:translateX(50px) scale(.5) rotate(-90deg);transform:translateX(50px) scale(.5) rotate(-90deg)}50%{-webkit-transform:translate(50px,50px) rotate(-180deg);transform:translate(50px,50px) rotate(-180deg)}75%{-webkit-transform:translateY(50px) scale(.5) rotate(-270deg);transform:translateY(50px) scale(.5) rotate(-270deg)}to{-webkit-transform:rotate(-1turn);transform:rotate(-1turn)}}.cube-transition{position:relative;-webkit-transform:translate(-25px,-25px);-ms-transform:translate(-25px,-25px);transform:translate(-25px,-25px)}.cube-transition>div{-webkit-animation-fill-mode:both;animation-fill-mode:both;-webkit-animation:cube-transition 1.6s ease-in-out 0s infinite;animation:cube-transition 1.6s ease-in-out 0s infinite;background-color:#fff;height:10px;left:-5px;position:absolute;top:-5px;width:10px}.cube-transition>div:last-child{-webkit-animation-delay:-.8s;animation-delay:-.8s}@-webkit-keyframes spin-rotate{0%{-webkit-transform:rotate(0deg);transform:rotate(0deg)}50%{-webkit-transform:rotate(180deg);transform:rotate(180deg)}to{-webkit-transform:rotate(1turn);transform:rotate(1turn)}}@keyframes spin-rotate{0%{-webkit-transform:rotate(0deg);transform:rotate(0deg)}50%{-webkit-transform:rotate(180deg);transform:rotate(180deg)}to{-webkit-transform:rotate(1turn);transform:rotate(1turn)}}.semi-circle-spin{height:35px;overflow:hidden;position:relative;width:35px}.semi-circle-spin>div{-webkit-animation:spin-rotate .6s linear 0s infinite;animation:spin-rotate .6s linear 0s infinite;background-image:-webkit-linear-gradient(transparent,transparent 70%,#fff 0,#fff);background-image:linear-gradient(transparent,transparent 70%,#fff 0,#fff);border-radius:100%;border-width:0;height:100%;position:absolute;width:100%}@-webkit-keyframes bar-progress{0%{opacity:1;-webkit-transform:scaleY(20%);transform:scaleY(20%)}25%{opacity:.7;-webkit-transform:translateX(6%) scaleY(10%);transform:translateX(6%) scaleY(10%)}50%{opacity:1;-webkit-transform:translateX(20%) scaleY(20%);transform:translateX(20%) scaleY(20%)}75%{opacity:.7;-webkit-transform:translateX(6%) scaleY(10%);transform:translateX(6%) scaleY(10%)}to{opacity:1;-webkit-transform:scaleY(20%);transform:scaleY(20%)}}@keyframes bar-progress{0%{opacity:1;-webkit-transform:scaleY(20%);transform:scaleY(20%)}25%{opacity:.7;-webkit-transform:translateX(6%) scaleY(10%);transform:translateX(6%) scaleY(10%)}50%{opacity:1;-webkit-transform:translateX(20%) scaleY(20%);transform:translateX(20%) scaleY(20%)}75%{opacity:.7;-webkit-transform:translateX(6%) scaleY(10%);transform:translateX(6%) scaleY(10%)}to{opacity:1;-webkit-transform:scaleY(20%);transform:scaleY(20%)}}.bar-progress{height:12px;width:30%}.bar-progress>div{-webkit-animation:bar-progress 3s cubic-bezier(.57,.1,.44,.93) infinite;animation:bar-progress 3s cubic-bezier(.57,.1,.44,.93) infinite;background-color:#fff;border-radius:10px;height:12px;opacity:1;position:relative;width:20%}@-webkit-keyframes bar-swing{0%{left:0}50%{left:70%}to{left:0}}@keyframes bar-swing{0%{left:0}50%{left:70%}to{left:0}}.bar-swing,.bar-swing>div{height:8px;width:30%}.bar-swing>div{-webkit-animation:bar-swing 1.5s infinite;animation:bar-swing 1.5s infinite;background-color:#fff;border-radius:10px;position:relative}@-webkit-keyframes bar-swing-container{0%{left:0;-webkit-transform:translateX(0);transform:translateX(0)}50%{left:70%;-webkit-transform:translateX(-4px);transform:translateX(-4px)}to{left:0;-webkit-transform:translateX(0);transform:translateX(0)}}@keyframes bar-swing-container{0%{left:0;-webkit-transform:translateX(0);transform:translateX(0)}50%{left:70%;-webkit-transform:translateX(-4px);transform:translateX(-4px)}to{left:0;-webkit-transform:translateX(0);transform:translateX(0)}}.bar-swing-container{height:8px;position:relative;width:20%}.bar-swing-container div:first-child{background-color:hsla(0,0%,100%,.2);border-radius:10px;height:12px;position:absolute;width:100%}.bar-swing-container div:nth-child(2){-webkit-animation:bar-swing-container 2s cubic-bezier(.91,.35,.12,.6) infinite;animation:bar-swing-container 2s cubic-bezier(.91,.35,.12,.6) infinite;background-color:#fff;border-radius:10px;height:8px;margin:2px 2px 0;position:absolute;width:30%}\\n/*# sourceMappingURL=data:application/json;base64,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eEIsdUJBQTBCLENBQ3BDLElBQ0UsUUFBUyxDQUNULGtDQUFtQyxDQUMzQiwwQkFBNkIsQ0FDdkMsR0FDRSxNQUFPLENBQ1AsK0JBQWdDLENBQ3hCLHVCQUEwQixDQUFFLENBRXhDLCtCQUNFLEdBQ0UsTUFBTyxDQUNQLCtCQUFnQyxDQUN4Qix1QkFBMEIsQ0FDcEMsSUFDRSxRQUFTLENBQ1Qsa0NBQW1DLENBQzNCLDBCQUE2QixDQUN2QyxHQUNFLE1BQU8sQ0FDUCwrQkFBZ0MsQ0FDeEIsdUJBQTBCLENBQUUsQ0FFeEMscUJBRUUsVUFBVyxDQUNYLGlCQUFrQixDQUZsQixTQUVvQixDQUNwQixxQ0FHRSxtQ0FBMEMsQ0FFMUMsa0JBQW1CLENBRG5CLFdBQVksQ0FIWixpQkFBa0IsQ0FDbEIsVUFHcUIsQ0FDdkIsc0NBTUUsOEVBQXNGLENBQzlFLHNFQUE4RSxDQUZ0RixxQkFBc0IsQ0FEdEIsa0JBQW1CLENBRG5CLFVBQVcsQ0FLWCxnQkFBaUIsQ0FQakIsaUJBQWtCLENBQ2xCLFNBTW1CIiwiZmlsZSI6ImxvYWRlcnMuY3NzIiwic291cmNlc0NvbnRlbnQiOlsiLyoqXG4gKlxuICogQWxsIGFuaW1hdGlvbnMgbXVzdCBsaXZlIGluIHRoZWlyIG93biBmaWxlXG4gKiBpbiB0aGUgYW5pbWF0aW9ucyBkaXJlY3RvcnkgYW5kIGJlIGluY2x1ZGVkXG4gKiBoZXJlLlxuICpcbiAqL1xuLyoqXG4gKiBTdHlsZXMgc2hhcmVkIGJ5IG11bHRpcGxlIGFuaW1hdGlvbnNcbiAqL1xuLyoqXG4gKiBEb3RzXG4gKi9cbkAtd2Via2l0LWtleWZyYW1lcyBzY2FsZSB7XG4gIDAlIHtcbiAgICAtd2Via2l0LXRyYW5zZm9ybTogc2NhbGUoMSk7XG4gICAgICAgICAgICB0cmFuc2Zvcm06IHNjYWxlKDEpO1xuICAgIG9wYWNpdHk6IDE7IH1cbiAgNDUlIHtcbiAgICAtd2Via2l0LXRyYW5zZm9ybTogc2NhbGUoMC4xKTtcbiAgICAgICAgICAgIHRyYW5zZm9ybTogc2NhbGUoMC4xKTtcbiAgICBvcGFjaXR5OiAwLjc7IH1cbiAgODAlIHtcbiAgICAtd2Via2l0LXRyYW5zZm9ybTogc2NhbGUoMSk7XG4gICAgICAgICAgICB0cmFuc2Zvcm06IHNjYWxlKDEpO1xuICAgIG9wYWNpdHk6IDE7IH0gfVxuQGtleWZyYW1lcyBzY2FsZSB7XG4gIDAlIHtcbiAgICAtd2Via2l0LXRyYW5zZm9ybTogc2NhbGUoMSk7XG4gICAgICAgICAgICB0cmFuc2Zvcm06IHNjYWxlKDEpO1xuICAgIG9wYWNpdHk6IDE7IH1cbiAgNDUlIHtcbiAgICAtd2Via2l0LXRyYW5zZm9ybTogc2NhbGUoMC4xKTtcbiAgICAgICAgICAgIHRyYW5zZm9ybTogc2NhbGUoMC4xKTtcbiAgICBvcGFjaXR5OiAwLjc7IH1cbiAgODAlIHtcbiAgICAtd2Via2l0LXRyYW5zZm9ybTogc2NhbGUoMSk7XG4gICAgICAgICAgICB0cmFuc2Zvcm06IHNjYWxlKDEpO1xuICAgIG9wYWNpdHk6IDE7IH0gfVxuXG4uYmFsbC1wdWxzZSA+IGRpdjpudGgtY2hpbGQoMCkge1xuICAtd2Via2l0LWFuaW1hdGlvbjogc2NhbGUgMC43NXMgLTAuMzZzIGluZmluaXRlIGN1YmljLWJlemllcigwLjIsIDAuNjgsIDAuMTgsIDEuMDgpO1xuICAgICAgICAgIGFuaW1hdGlvbjogc2NhbGUgMC43NXMgLTAuMzZzIGluZmluaXRlIGN1YmljLWJlemllcigwLjIsIDAuNjgsIDAuMTgsIDEuMDgpOyB9XG5cbi5iYWxsLXB1bHNlID4gZGl2Om50aC1jaGlsZCgxKSB7XG4gIC13ZWJraXQtYW5pbWF0aW9uOiBzY2FsZSAwLjc1cyAtMC4yNHMgaW5maW5pdGUgY3ViaWMtYmV6aWVyKDAuMiwgMC42OCwgMC4xOCwgMS4wOCk7XG4gICAgICAgICAgYW5pbWF0aW9uOiBzY2FsZSAwLjc1cyAtMC4yNHMgaW5maW5pdGUgY3ViaWMtYmV6aWVyKDAuMiwgMC42OCwgMC4xOCwgMS4wOCk7IH1cblxuLmJhbGwtcHVsc2UgPiBkaXY6bnRoLWNoaWxkKDIpIHtcbiAgLXdlYmtpdC1hbmltYXRpb246IHNjYWxlIDAuNzVzIC0wLjEycyBpbmZpbml0ZSBjdWJpYy1iZXppZXIoMC4yLCAwLjY4LCAwLjE4LCAxLjA4KTtcbiAgICAgICAgICBhbmltYXRpb246IHNjYWxlIDAuNzVzIC0wLjEycyBpbmZpbml0ZSBjdWJpYy1iZXppZXIoMC4yLCAwLjY4LCAwLjE4LCAxLjA4KTsgfVxuXG4uYmFsbC1wdWxzZSA+IGRpdjpudGgtY2hpbGQoMykge1xuICAtd2Via2l0LWFuaW1hdGlvbjogc2NhbGUgMC43NXMgMHMgaW5maW5pdGUgY3ViaWMtYmV6aWVyKDAuMiwgMC42OCwgMC4xOCwgMS4wOCk7XG4gICAgICAgICAgYW5pbWF0aW9uOiBzY2FsZSAwLjc1cyAwcyBpbmZpbml0ZSBjdWJpYy1iZXppZXIoMC4yLCAwLjY4LCAwLjE4LCAxLjA4KTsgfVxuXG4uYmFsbC1wdWxzZSA+IGRpdiB7XG4gIGJhY2tncm91bmQtY29sb3I6ICNmZmY7XG4gIHdpZHRoOiAxNXB4O1xuICBoZWlnaHQ6IDE1cHg7XG4gIGJvcmRlci1yYWRpdXM6IDEwMCU7XG4gIG1hcmdpbjogMnB4O1xuICAtd2Via2l0LWFuaW1hdGlvbi1maWxsLW1vZGU6IGJvdGg7XG4gICAgICAgICAgYW5pbWF0aW9uLWZpbGwtbW9kZTogYm90aDtcbiAgZGlzcGxheTogaW5saW5lLWJsb2NrOyB9XG5cbkAtd2Via2l0LWtleWZyYW1lcyBiYWxsLXB1bHNlLXN5bmMge1xuICAzMyUge1xuICAgIC13ZWJraXQtdHJhbnNmb3JtOiB0cmFuc2xhdGVZKDEwcHgpO1xuICAgICAgICAgICAgdHJhbnNmb3JtOiB0cmFuc2xhdGVZKDEwcHgpOyB9XG4gIDY2JSB7XG4gICAgLXdlYmtpdC10cmFuc2Zvcm06IHRyYW5zbGF0ZVkoLTEwcHgpO1xuICAgICAgICAgICAgdHJhbnNmb3JtOiB0cmFuc2xhdGVZKC0xMHB4KTsgfVxuICAxMDAlIHtcbiAgICAtd2Via2l0LXRyYW5zZm9ybTogdHJhbnNsYXRlWSgwKTtcbiAgICAgICAgICAgIHRyYW5zZm9ybTogdHJhbnNsYXRlWSgwKTsgfSB9XG5cbkBrZXlmcmFtZXMgYmFsbC1wdWxzZS1zeW5jIHtcbiAgMzMlIHtcbiAgICAtd2Via2l0LXRyYW5zZm9ybTogdHJhbnNsYXRlWSgxMHB4KTtcbiAgICAgICAgICAgIHRyYW5zZm9ybTogdHJhbnNsYXRlWSgxMHB4KTsgfVxuICA2NiUge1xuICAgIC13ZWJraXQtdHJhbnNmb3JtOiB0cmFuc2xhdGVZKC0xMHB4KTtcbiAgICAgICAgICAgIHRyYW5zZm9ybTogdHJhbnNsYXRlWSgtMTBweCk7IH1cbiAgMTAwJSB7XG4gICAgLXdlYmtpdC10cmFuc2Zvcm06IHRyYW5zbGF0ZVkoMCk7XG4gICAgICAgICAgICB0cmFuc2Zvcm06IHRyYW5zbGF0ZVkoMCk7IH0gfVxuXG4uYmFsbC1wdWxzZS1zeW5jID4gZGl2Om50aC1jaGlsZCgwKSB7XG4gIC13ZWJraXQtYW5pbWF0aW9uOiBiYWxsLXB1bHNlLXN5bmMgMC42cyAtMC4yMXMgaW5maW5pdGUgZWFzZS1pbi1vdXQ7XG4gICAgICAgICAgYW5pbWF0aW9uOiBiYWxsLXB1bHNlLXN5bmMgMC42cyAtMC4yMXMgaW5maW5pdGUgZWFzZS1pbi1vdXQ7IH1cblxuLmJhbGwtcHVsc2Utc3luYyA+IGRpdjpudGgtY2hpbGQoMSkge1xuICAtd2Via2l0LWFuaW1hdGlvbjogYmFsbC1wdWxzZS1zeW5jIDAuNnMgLTAuMTRzIGluZmluaXRlIGVhc2UtaW4tb3V0O1xuICAgICAgICAgIGFuaW1hdGlvbjogYmFsbC1wdWxzZS1zeW5jIDAuNnMgLTAuMTRzIGluZmluaXRlIGVhc2UtaW4tb3V0OyB9XG5cbi5iYWxsLXB1bHNlLXN5bmMgPiBkaXY6bnRoLWNoaWxkKDIpIHtcbiAgLXdlYmtpdC1hbmltYXRpb246IGJhbGwtcHVsc2Utc3luYyAwLjZzIC0wLjA3cyBpbmZpbml0ZSBlYXNlLWluLW91dDtcbiAgICAgICAgICBhbmltYXRpb246IGJhbGwtcHVsc2Utc3luYyAwLjZzIC0wLjA3cyBpbmZpbml0ZSBlYXNlLWluLW91dDsgfVxuXG4uYmFsbC1wdWxzZS1zeW5jID4gZGl2Om50aC1jaGlsZCgzKSB7XG4gIC13ZWJraXQtYW5pbWF0aW9uOiBiYWxsLXB1bHNlLXN5bmMgMC42cyAwcyBpbmZpbml0ZSBlYXNlLWluLW91dDtcbiAgICAgICAgICBhbmltYXRpb246IGJhbGwtcHVsc2Utc3luYyAwLjZzIDBzIGluZmluaXRlIGVhc2UtaW4tb3V0OyB9XG5cbi5iYWxsLXB1bHNlLXN5bmMgPiBkaXYge1xuICBiYWNrZ3JvdW5kLWNvbG9yOiAjZmZmO1xuICB3aWR0aDogMTVweDtcbiAgaGVpZ2h0OiAxNXB4O1xuICBib3JkZXItcmFkaXVzOiAxMDAlO1xuICBtYXJnaW46IDJweDtcbiAgLXdlYmtpdC1hbmltYXRpb24tZmlsbC1tb2RlOiBib3RoO1xuICAgICAgICAgIGFuaW1hdGlvbi1maWxsLW1vZGU6IGJvdGg7XG4gIGRpc3BsYXk6IGlubGluZS1ibG9jazsgfVxuXG5ALXdlYmtpdC1rZXlmcmFtZXMgYmFsbC1zY2FsZSB7XG4gIDAlIHtcbiAgICAtd2Via2l0LXRyYW5zZm9ybTogc2NhbGUoMCk7XG4gICAgICAgICAgICB0cmFuc2Zvcm06IHNjYWxlKDApOyB9XG4gIDEwMCUge1xuICAgIC13ZWJraXQtdHJhbnNmb3JtOiBzY2FsZSgxKTtcbiAgICAgICAgICAgIHRyYW5zZm9ybTogc2NhbGUoMSk7XG4gICAgb3BhY2l0eTogMDsgfSB9XG5cbkBrZXlmcmFtZXMgYmFsbC1zY2FsZSB7XG4gIDAlIHtcbiAgICAtd2Via2l0LXRyYW5zZm9ybTogc2NhbGUoMCk7XG4gICAgICAgICAgICB0cmFuc2Zvcm06IHNjYWxlKDApOyB9XG4gIDEwMCUge1xuICAgIC13ZWJraXQtdHJhbnNmb3JtOiBzY2FsZSgxKTtcbiAgICAgICAgICAgIHRyYW5zZm9ybTogc2NhbGUoMSk7XG4gICAgb3BhY2l0eTogMDsgfSB9XG5cbi5iYWxsLXNjYWxlID4gZGl2IHtcbiAgYmFja2dyb3VuZC1jb2xvcjogI2ZmZjtcbiAgd2lkdGg6IDE1cHg7XG4gIGhlaWdodDogMTVweDtcbiAgYm9yZGVyLXJhZGl1czogMTAwJTtcbiAgbWFyZ2luOiAycHg7XG4gIC13ZWJraXQtYW5pbWF0aW9uLWZpbGwtbW9kZTogYm90aDtcbiAgICAgICAgICBhbmltYXRpb24tZmlsbC1tb2RlOiBib3RoO1xuICBkaXNwbGF5OiBpbmxpbmUtYmxvY2s7XG4gIGhlaWdodDogNjBweDtcbiAgd2lkdGg6IDYwcHg7XG4gIC13ZWJraXQtYW5pbWF0aW9uOiBiYWxsLXNjYWxlIDFzIDBzIGVhc2UtaW4tb3V0IGluZmluaXRlO1xuICAgICAgICAgIGFuaW1hdGlvbjogYmFsbC1zY2FsZSAxcyAwcyBlYXNlLWluLW91dCBpbmZpbml0ZTsgfVxuXG5Aa2V5ZnJhbWVzIGJhbGwtc2NhbGUge1xuICAwJSB7XG4gICAgLXdlYmtpdC10cmFuc2Zvcm06IHNjYWxlKDApO1xuICAgICAgICAgICAgdHJhbnNmb3JtOiBzY2FsZSgwKTsgfVxuICAxMDAlIHtcbiAgICAtd2Via2l0LXRyYW5zZm9ybTogc2NhbGUoMSk7XG4gICAgICAgICAgICB0cmFuc2Zvcm06IHNjYWxlKDEpO1xuICAgIG9wYWNpdHk6IDA7IH0gfVxuXG4uYmFsbC1zY2FsZSA+IGRpdiB7XG4gIGJhY2tncm91bmQtY29sb3I6ICNmZmY7XG4gIHdpZHRoOiAxNXB4O1xuICBoZWlnaHQ6IDE1cHg7XG4gIGJvcmRlci1yYWRpdXM6IDEwMCU7XG4gIG1hcmdpbjogMnB4O1xuICAtd2Via2l0LWFuaW1hdGlvbi1maWxsLW1vZGU6IGJvdGg7XG4gICAgICAgICAgYW5pbWF0aW9uLWZpbGwtbW9kZTogYm90aDtcbiAgZGlzcGxheTogaW5saW5lLWJsb2NrO1xuICBoZWlnaHQ6IDYwcHg7XG4gIHdpZHRoOiA2MHB4O1xuICAtd2Via2l0LWFuaW1hdGlvbjogYmFsbC1zY2FsZSAxcyAwcyBlYXNlLWluLW91dCBpbmZpbml0ZTtcbiAgICAgICAgICBhbmltYXRpb246IGJhbGwtc2NhbGUgMXMgMHMgZWFzZS1pbi1vdXQgaW5maW5pdGU7IH1cblxuLmJhbGwtc2NhbGUtcmFuZG9tIHtcbiAgd2lkdGg6IDM3cHg7XG4gIGhlaWdodDogNDBweDsgfVxuICAuYmFsbC1zY2FsZS1yYW5kb20gPiBkaXYge1xuICAgIGJhY2tncm91bmQtY29sb3I6ICNmZmY7XG4gICAgd2lkdGg6IDE1cHg7XG4gICAgaGVpZ2h0OiAxNXB4O1xuICAgIGJvcmRlci1yYWRpdXM6IDEwMCU7XG4gICAgbWFyZ2luOiAycHg7XG4gICAgLXdlYmtpdC1hbmltYXRpb24tZmlsbC1tb2RlOiBib3RoO1xuICAgICAgICAgICAgYW5pbWF0aW9uLWZpbGwtbW9kZTogYm90aDtcbiAgICBwb3NpdGlvbjogYWJzb2x1dGU7XG4gICAgZGlzcGxheTogaW5saW5lLWJsb2NrO1xuICAgIGhlaWdodDogMzBweDtcbiAgICB3aWR0aDogMzBweDtcbiAgICAtd2Via2l0LWFuaW1hdGlvbjogYmFsbC1zY2FsZSAxcyAwcyBlYXNlLWluLW91dCBpbmZpbml0ZTtcbiAgICAgICAgICAgIGFuaW1hdGlvbjogYmFsbC1zY2FsZSAxcyAwcyBlYXNlLWluLW91dCBpbmZpbml0ZTsgfVxuICAgIC5iYWxsLXNjYWxlLXJhbmRvbSA+IGRpdjpudGgtY2hpbGQoMSkge1xuICAgICAgbWFyZ2luLWxlZnQ6IC03cHg7XG4gICAgICAtd2Via2l0LWFuaW1hdGlvbjogYmFsbC1zY2FsZSAxcyAwLjJzIGVhc2UtaW4tb3V0IGluZmluaXRlO1xuICAgICAgICAgICAgICBhbmltYXRpb246IGJhbGwtc2NhbGUgMXMgMC4ycyBlYXNlLWluLW91dCBpbmZpbml0ZTsgfVxuICAgIC5iYWxsLXNjYWxlLXJhbmRvbSA+IGRpdjpudGgtY2hpbGQoMykge1xuICAgICAgbWFyZ2luLWxlZnQ6IC0ycHg7XG4gICAgICBtYXJnaW4tdG9wOiA5cHg7XG4gICAgICAtd2Via2l0LWFuaW1hdGlvbjogYmFsbC1zY2FsZSAxcyAwLjVzIGVhc2UtaW4tb3V0IGluZmluaXRlO1xuICAgICAgICAgICAgICBhbmltYXRpb246IGJhbGwtc2NhbGUgMXMgMC41cyBlYXNlLWluLW91dCBpbmZpbml0ZTsgfVxuXG5ALXdlYmtpdC1rZXlmcmFtZXMgcm90YXRlIHtcbiAgMCUge1xuICAgIC13ZWJraXQtdHJhbnNmb3JtOiByb3RhdGUoMGRlZyk7XG4gICAgICAgICAgICB0cmFuc2Zvcm06IHJvdGF0ZSgwZGVnKTsgfVxuICA1MCUge1xuICAgIC13ZWJraXQtdHJhbnNmb3JtOiByb3RhdGUoMTgwZGVnKTtcbiAgICAgICAgICAgIHRyYW5zZm9ybTogcm90YXRlKDE4MGRlZyk7IH1cbiAgMTAwJSB7XG4gICAgLXdlYmtpdC10cmFuc2Zvcm06IHJvdGF0ZSgzNjBkZWcpO1xuICAgICAgICAgICAgdHJhbnNmb3JtOiByb3RhdGUoMzYwZGVnKTsgfSB9XG5cbkBrZXlmcmFtZXMgcm90YXRlIHtcbiAgMCUge1xuICAgIC13ZWJraXQtdHJhbnNmb3JtOiByb3RhdGUoMGRlZyk7XG4gICAgICAgICAgICB0cmFuc2Zvcm06IHJvdGF0ZSgwZGVnKTsgfVxuICA1MCUge1xuICAgIC13ZWJraXQtdHJhbnNmb3JtOiByb3RhdGUoMTgwZGVnKTtcbiAgICAgICAgICAgIHRyYW5zZm9ybTogcm90YXRlKDE4MGRlZyk7IH1cbiAgMTAwJSB7XG4gICAgLXdlYmtpdC10cmFuc2Zvcm06IHJvdGF0ZSgzNjBkZWcpO1xuICAgICAgICAgICAgdHJhbnNmb3JtOiByb3RhdGUoMzYwZGVnKTsgfSB9XG5cbi5iYWxsLXJvdGF0ZSB7XG4gIHBvc2l0aW9uOiByZWxhdGl2ZTsgfVxuICAuYmFsbC1yb3RhdGUgPiBkaXYge1xuICAgIGJhY2tncm91bmQtY29sb3I6ICNmZmY7XG4gICAgd2lkdGg6IDE1cHg7XG4gICAgaGVpZ2h0OiAxNXB4O1xuICAgIGJvcmRlci1yYWRpdXM6IDEwMCU7XG4gICAgbWFyZ2luOiAycHg7XG4gICAgLXdlYmtpdC1hbmltYXRpb24tZmlsbC1tb2RlOiBib3RoO1xuICAgICAgICAgICAgYW5pbWF0aW9uLWZpbGwtbW9kZTogYm90aDtcbiAgICBwb3NpdGlvbjogcmVsYXRpdmU7IH1cbiAgICAuYmFsbC1yb3RhdGUgPiBkaXY6Zmlyc3QtY2hpbGQge1xuICAgICAgLXdlYmtpdC1hbmltYXRpb246IHJvdGF0ZSAxcyAwcyBjdWJpYy1iZXppZXIoMC43LCAtMC4xMywgMC4yMiwgMC44NikgaW5maW5pdGU7XG4gICAgICAgICAgICAgIGFuaW1hdGlvbjogcm90YXRlIDFzIDBzIGN1YmljLWJlemllcigwLjcsIC0wLjEzLCAwLjIyLCAwLjg2KSBpbmZpbml0ZTsgfVxuICAgIC5iYWxsLXJvdGF0ZSA+IGRpdjpiZWZvcmUsIC5iYWxsLXJvdGF0ZSA+IGRpdjphZnRlciB7XG4gICAgICBiYWNrZ3JvdW5kLWNvbG9yOiAjZmZmO1xuICAgICAgd2lkdGg6IDE1cHg7XG4gICAgICBoZWlnaHQ6IDE1cHg7XG4gICAgICBib3JkZXItcmFkaXVzOiAxMDAlO1xuICAgICAgbWFyZ2luOiAycHg7XG4gICAgICBjb250ZW50OiBcIlwiO1xuICAgICAgcG9zaXRpb246IGFic29sdXRlO1xuICAgICAgb3BhY2l0eTogMC44OyB9XG4gICAgLmJhbGwtcm90YXRlID4gZGl2OmJlZm9yZSB7XG4gICAgICB0b3A6IDBweDtcbiAgICAgIGxlZnQ6IC0yOHB4OyB9XG4gICAgLmJhbGwtcm90YXRlID4gZGl2OmFmdGVyIHtcbiAgICAgIHRvcDogMHB4O1xuICAgICAgbGVmdDogMjVweDsgfVxuXG5Aa2V5ZnJhbWVzIHJvdGF0ZSB7XG4gIDAlIHtcbiAgICAtd2Via2l0LXRyYW5zZm9ybTogcm90YXRlKDBkZWcpIHNjYWxlKDEpO1xuICAgICAgICAgICAgdHJhbnNmb3JtOiByb3RhdGUoMGRlZykgc2NhbGUoMSk7IH1cbiAgNTAlIHtcbiAgICAtd2Via2l0LXRyYW5zZm9ybTogcm90YXRlKDE4MGRlZykgc2NhbGUoMC42KTtcbiAgICAgICAgICAgIHRyYW5zZm9ybTogcm90YXRlKDE4MGRlZykgc2NhbGUoMC42KTsgfVxuICAxMDAlIHtcbiAgICAtd2Via2l0LXRyYW5zZm9ybTogcm90YXRlKDM2MGRlZykgc2NhbGUoMSk7XG4gICAgICAgICAgICB0cmFuc2Zvcm06IHJvdGF0ZSgzNjBkZWcpIHNjYWxlKDEpOyB9IH1cblxuLmJhbGwtY2xpcC1yb3RhdGUgPiBkaXYge1xuICBiYWNrZ3JvdW5kLWNvbG9yOiAjZmZmO1xuICB3aWR0aDogMTVweDtcbiAgaGVpZ2h0OiAxNXB4O1xuICBib3JkZXItcmFkaXVzOiAxMDAlO1xuICBtYXJnaW46IDJweDtcbiAgLXdlYmtpdC1hbmltYXRpb24tZmlsbC1tb2RlOiBib3RoO1xuICAgICAgICAgIGFuaW1hdGlvbi1maWxsLW1vZGU6IGJvdGg7XG4gIGJvcmRlcjogMnB4IHNvbGlkICNmZmY7XG4gIGJvcmRlci1ib3R0b20tY29sb3I6IHRyYW5zcGFyZW50O1xuICBoZWlnaHQ6IDI1cHg7XG4gIHdpZHRoOiAyNXB4O1xuICBiYWNrZ3JvdW5kOiB0cmFuc3BhcmVudCAhaW1wb3J0YW50O1xuICBkaXNwbGF5OiBpbmxpbmUtYmxvY2s7XG4gIC13ZWJraXQtYW5pbWF0aW9uOiByb3RhdGUgMC43NXMgMHMgbGluZWFyIGluZmluaXRlO1xuICAgICAgICAgIGFuaW1hdGlvbjogcm90YXRlIDAuNzVzIDBzIGxpbmVhciBpbmZpbml0ZTsgfVxuXG5Aa2V5ZnJhbWVzIHJvdGF0ZSB7XG4gIDAlIHtcbiAgICAtd2Via2l0LXRyYW5zZm9ybTogcm90YXRlKDBkZWcpIHNjYWxlKDEpO1xuICAgICAgICAgICAgdHJhbnNmb3JtOiByb3RhdGUoMGRlZykgc2NhbGUoMSk7IH1cbiAgNTAlIHtcbiAgICAtd2Via2l0LXRyYW5zZm9ybTogcm90YXRlKDE4MGRlZykgc2NhbGUoMC42KTtcbiAgICAgICAgICAgIHRyYW5zZm9ybTogcm90YXRlKDE4MGRlZykgc2NhbGUoMC42KTsgfVxuICAxMDAlIHtcbiAgICAtd2Via2l0LXRyYW5zZm9ybTogcm90YXRlKDM2MGRlZykgc2NhbGUoMSk7XG4gICAgICAgICAgICB0cmFuc2Zvcm06IHJvdGF0ZSgzNjBkZWcpIHNjYWxlKDEpOyB9IH1cblxuQGtleWZyYW1lcyBzY2FsZSB7XG4gIDMwJSB7XG4gICAgLXdlYmtpdC10cmFuc2Zvcm06IHNjYWxlKDAuMyk7XG4gICAgICAgICAgICB0cmFuc2Zvcm06IHNjYWxlKDAuMyk7IH1cbiAgMTAwJSB7XG4gICAgLXdlYmtpdC10cmFuc2Zvcm06IHNjYWxlKDEpO1xuICAgICAgICAgICAgdHJhbnNmb3JtOiBzY2FsZSgxKTsgfSB9XG5cbi5iYWxsLWNsaXAtcm90YXRlLXB1bHNlIHtcbiAgcG9zaXRpb246IHJlbGF0aXZlO1xuICAtd2Via2l0LXRyYW5zZm9ybTogdHJhbnNsYXRlWSgtMTVweCk7XG4gICAgICAtbXMtdHJhbnNmb3JtOiB0cmFuc2xhdGVZKC0xNXB4KTtcbiAgICAgICAgICB0cmFuc2Zvcm06IHRyYW5zbGF0ZVkoLTE1cHgpOyB9XG4gIC5iYWxsLWNsaXAtcm90YXRlLXB1bHNlID4gZGl2IHtcbiAgICAtd2Via2l0LWFuaW1hdGlvbi1maWxsLW1vZGU6IGJvdGg7XG4gICAgICAgICAgICBhbmltYXRpb24tZmlsbC1tb2RlOiBib3RoO1xuICAgIHBvc2l0aW9uOiBhYnNvbHV0ZTtcbiAgICB0b3A6IDBweDtcbiAgICBsZWZ0OiAwcHg7XG4gICAgYm9yZGVyLXJhZGl1czogMTAwJTsgfVxuICAgIC5iYWxsLWNsaXAtcm90YXRlLXB1bHNlID4gZGl2OmZpcnN0LWNoaWxkIHtcbiAgICAgIGJhY2tncm91bmQ6ICNmZmY7XG4gICAgICBoZWlnaHQ6IDE2cHg7XG4gICAgICB3aWR0aDogMTZweDtcbiAgICAgIHRvcDogN3B4O1xuICAgICAgbGVmdDogLTdweDtcbiAgICAgIC13ZWJraXQtYW5pbWF0aW9uOiBzY2FsZSAxcyAwcyBjdWJpYy1iZXppZXIoMC4wOSwgMC41NywgMC40OSwgMC45KSBpbmZpbml0ZTtcbiAgICAgICAgICAgICAgYW5pbWF0aW9uOiBzY2FsZSAxcyAwcyBjdWJpYy1iZXppZXIoMC4wOSwgMC41NywgMC40OSwgMC45KSBpbmZpbml0ZTsgfVxuICAgIC5iYWxsLWNsaXAtcm90YXRlLXB1bHNlID4gZGl2Omxhc3QtY2hpbGQge1xuICAgICAgcG9zaXRpb246IGFic29sdXRlO1xuICAgICAgYm9yZGVyOiAycHggc29saWQgI2ZmZjtcbiAgICAgIHdpZHRoOiAzMHB4O1xuICAgICAgaGVpZ2h0OiAzMHB4O1xuICAgICAgbGVmdDogLTE2cHg7XG4gICAgICB0b3A6IC0ycHg7XG4gICAgICBiYWNrZ3JvdW5kOiB0cmFuc3BhcmVudDtcbiAgICAgIGJvcmRlcjogMnB4IHNvbGlkO1xuICAgICAgYm9yZGVyLWNvbG9yOiAjZmZmIHRyYW5zcGFyZW50ICNmZmYgdHJhbnNwYXJlbnQ7XG4gICAgICAtd2Via2l0LWFuaW1hdGlvbjogcm90YXRlIDFzIDBzIGN1YmljLWJlemllcigwLjA5LCAwLjU3LCAwLjQ5LCAwLjkpIGluZmluaXRlO1xuICAgICAgICAgICAgICBhbmltYXRpb246IHJvdGF0ZSAxcyAwcyBjdWJpYy1iZXppZXIoMC4wOSwgMC41NywgMC40OSwgMC45KSBpbmZpbml0ZTtcbiAgICAgIC13ZWJraXQtYW5pbWF0aW9uLWR1cmF0aW9uOiAxcztcbiAgICAgICAgICAgICAgYW5pbWF0aW9uLWR1cmF0aW9uOiAxczsgfVxuXG5Aa2V5ZnJhbWVzIHJvdGF0ZSB7XG4gIDAlIHtcbiAgICAtd2Via2l0LXRyYW5zZm9ybTogcm90YXRlKDBkZWcpIHNjYWxlKDEpO1xuICAgICAgICAgICAgdHJhbnNmb3JtOiByb3RhdGUoMGRlZykgc2NhbGUoMSk7IH1cbiAgNTAlIHtcbiAgICAtd2Via2l0LXRyYW5zZm9ybTogcm90YXRlKDE4MGRlZykgc2NhbGUoMC42KTtcbiAgICAgICAgICAgIHRyYW5zZm9ybTogcm90YXRlKDE4MGRlZykgc2NhbGUoMC42KTsgfVxuICAxMDAlIHtcbiAgICAtd2Via2l0LXRyYW5zZm9ybTogcm90YXRlKDM2MGRlZykgc2NhbGUoMSk7XG4gICAgICAgICAgICB0cmFuc2Zvcm06IHJvdGF0ZSgzNjBkZWcpIHNjYWxlKDEpOyB9IH1cblxuLmJhbGwtY2xpcC1yb3RhdGUtbXVsdGlwbGUge1xuICBwb3NpdGlvbjogcmVsYXRpdmU7IH1cbiAgLmJhbGwtY2xpcC1yb3RhdGUtbXVsdGlwbGUgPiBkaXYge1xuICAgIC13ZWJraXQtYW5pbWF0aW9uLWZpbGwtbW9kZTogYm90aDtcbiAgICAgICAgICAgIGFuaW1hdGlvbi1maWxsLW1vZGU6IGJvdGg7XG4gICAgcG9zaXRpb246IGFic29sdXRlO1xuICAgIGxlZnQ6IC0yMHB4O1xuICAgIHRvcDogLTIwcHg7XG4gICAgYm9yZGVyOiAycHggc29saWQgI2ZmZjtcbiAgICBib3JkZXItYm90dG9tLWNvbG9yOiB0cmFuc3BhcmVudDtcbiAgICBib3JkZXItdG9wLWNvbG9yOiB0cmFuc3BhcmVudDtcbiAgICBib3JkZXItcmFkaXVzOiAxMDAlO1xuICAgIGhlaWdodDogMzVweDtcbiAgICB3aWR0aDogMzVweDtcbiAgICAtd2Via2l0LWFuaW1hdGlvbjogcm90YXRlIDFzIDBzIGVhc2UtaW4tb3V0IGluZmluaXRlO1xuICAgICAgICAgICAgYW5pbWF0aW9uOiByb3RhdGUgMXMgMHMgZWFzZS1pbi1vdXQgaW5maW5pdGU7IH1cbiAgICAuYmFsbC1jbGlwLXJvdGF0ZS1tdWx0aXBsZSA+IGRpdjpsYXN0LWNoaWxkIHtcbiAgICAgIGRpc3BsYXk6IGlubGluZS1ibG9jaztcbiAgICAgIHRvcDogLTEwcHg7XG4gICAgICBsZWZ0OiAtMTBweDtcbiAgICAgIHdpZHRoOiAxNXB4O1xuICAgICAgaGVpZ2h0OiAxNXB4O1xuICAgICAgLXdlYmtpdC1hbmltYXRpb24tZHVyYXRpb246IDAuNXM7XG4gICAgICAgICAgICAgIGFuaW1hdGlvbi1kdXJhdGlvbjogMC41cztcbiAgICAgIGJvcmRlci1jb2xvcjogI2ZmZiB0cmFuc3BhcmVudCAjZmZmIHRyYW5zcGFyZW50O1xuICAgICAgLXdlYmtpdC1hbmltYXRpb24tZGlyZWN0aW9uOiByZXZlcnNlO1xuICAgICAgICAgICAgICBhbmltYXRpb24tZGlyZWN0aW9uOiByZXZlcnNlOyB9XG5cbkAtd2Via2l0LWtleWZyYW1lcyBiYWxsLXNjYWxlLXJpcHBsZSB7XG4gIDAlIHtcbiAgICAtd2Via2l0LXRyYW5zZm9ybTogc2NhbGUoMC4xKTtcbiAgICAgICAgICAgIHRyYW5zZm9ybTogc2NhbGUoMC4xKTtcbiAgICBvcGFjaXR5OiAxOyB9XG4gIDcwJSB7XG4gICAgLXdlYmtpdC10cmFuc2Zvcm06IHNjYWxlKDEpO1xuICAgICAgICAgICAgdHJhbnNmb3JtOiBzY2FsZSgxKTtcbiAgICBvcGFjaXR5OiAwLjc7IH1cbiAgMTAwJSB7XG4gICAgb3BhY2l0eTogMC4wOyB9IH1cblxuQGtleWZyYW1lcyBiYWxsLXNjYWxlLXJpcHBsZSB7XG4gIDAlIHtcbiAgICAtd2Via2l0LXRyYW5zZm9ybTogc2NhbGUoMC4xKTtcbiAgICAgICAgICAgIHRyYW5zZm9ybTogc2NhbGUoMC4xKTtcbiAgICBvcGFjaXR5OiAxOyB9XG4gIDcwJSB7XG4gICAgLXdlYmtpdC10cmFuc2Zvcm06IHNjYWxlKDEpO1xuICAgICAgICAgICAgdHJhbnNmb3JtOiBzY2FsZSgxKTtcbiAgICBvcGFjaXR5OiAwLjc7IH1cbiAgMTAwJSB7XG4gICAgb3BhY2l0eTogMC4wOyB9IH1cblxuLmJhbGwtc2NhbGUtcmlwcGxlID4gZGl2IHtcbiAgLXdlYmtpdC1hbmltYXRpb24tZmlsbC1tb2RlOiBib3RoO1xuICAgICAgICAgIGFuaW1hdGlvbi1maWxsLW1vZGU6IGJvdGg7XG4gIGhlaWdodDogNTBweDtcbiAgd2lkdGg6IDUwcHg7XG4gIGJvcmRlci1yYWRpdXM6IDEwMCU7XG4gIGJvcmRlcjogMnB4IHNvbGlkICNmZmY7XG4gIC13ZWJraXQtYW5pbWF0aW9uOiBiYWxsLXNjYWxlLXJpcHBsZSAxcyAwcyBpbmZpbml0ZSBjdWJpYy1iZXppZXIoMC4yMSwgMC41MywgMC41NiwgMC44KTtcbiAgICAgICAgICBhbmltYXRpb246IGJhbGwtc2NhbGUtcmlwcGxlIDFzIDBzIGluZmluaXRlIGN1YmljLWJlemllcigwLjIxLCAwLjUzLCAwLjU2LCAwLjgpOyB9XG5cbkAtd2Via2l0LWtleWZyYW1lcyBiYWxsLXNjYWxlLXJpcHBsZS1tdWx0aXBsZSB7XG4gIDAlIHtcbiAgICAtd2Via2l0LXRyYW5zZm9ybTogc2NhbGUoMC4xKTtcbiAgICAgICAgICAgIHRyYW5zZm9ybTogc2NhbGUoMC4xKTtcbiAgICBvcGFjaXR5OiAxOyB9XG4gIDcwJSB7XG4gICAgLXdlYmtpdC10cmFuc2Zvcm06IHNjYWxlKDEpO1xuICAgICAgICAgICAgdHJhbnNmb3JtOiBzY2FsZSgxKTtcbiAgICBvcGFjaXR5OiAwLjc7IH1cbiAgMTAwJSB7XG4gICAgb3BhY2l0eTogMC4wOyB9IH1cblxuQGtleWZyYW1lcyBiYWxsLXNjYWxlLXJpcHBsZS1tdWx0aXBsZSB7XG4gIDAlIHtcbiAgICAtd2Via2l0LXRyYW5zZm9ybTogc2NhbGUoMC4xKTtcbiAgICAgICAgICAgIHRyYW5zZm9ybTogc2NhbGUoMC4xKTtcbiAgICBvcGFjaXR5OiAxOyB9XG4gIDcwJSB7XG4gICAgLXdlYmtpdC10cmFuc2Zvcm06IHNjYWxlKDEpO1xuICAgICAgICAgICAgdHJhbnNmb3JtOiBzY2FsZSgxKTtcbiAgICBvcGFjaXR5OiAwLjc7IH1cbiAgMTAwJSB7XG4gICAgb3BhY2l0eTogMC4wOyB9IH1cblxuLmJhbGwtc2NhbGUtcmlwcGxlLW11bHRpcGxlIHtcbiAgcG9zaXRpb246IHJlbGF0aXZlO1xuICAtd2Via2l0LXRyYW5zZm9ybTogdHJhbnNsYXRlWSgtMjVweCk7XG4gICAgICAtbXMtdHJhbnNmb3JtOiB0cmFuc2xhdGVZKC0yNXB4KTtcbiAgICAgICAgICB0cmFuc2Zvcm06IHRyYW5zbGF0ZVkoLTI1cHgpOyB9XG4gIC5iYWxsLXNjYWxlLXJpcHBsZS1tdWx0aXBsZSA+IGRpdjpudGgtY2hpbGQoMCkge1xuICAgIC13ZWJraXQtYW5pbWF0aW9uLWRlbGF5OiAtMC44cztcbiAgICAgICAgICAgIGFuaW1hdGlvbi1kZWxheTogLTAuOHM7IH1cbiAgLmJhbGwtc2NhbGUtcmlwcGxlLW11bHRpcGxlID4gZGl2Om50aC1jaGlsZCgxKSB7XG4gICAgLXdlYmtpdC1hbmltYXRpb24tZGVsYXk6IC0wLjZzO1xuICAgICAgICAgICAgYW5pbWF0aW9uLWRlbGF5OiAtMC42czsgfVxuICAuYmFsbC1zY2FsZS1yaXBwbGUtbXVsdGlwbGUgPiBkaXY6bnRoLWNoaWxkKDIpIHtcbiAgICAtd2Via2l0LWFuaW1hdGlvbi1kZWxheTogLTAuNHM7XG4gICAgICAgICAgICBhbmltYXRpb24tZGVsYXk6IC0wLjRzOyB9XG4gIC5iYWxsLXNjYWxlLXJpcHBsZS1tdWx0aXBsZSA+IGRpdjpudGgtY2hpbGQoMykge1xuICAgIC13ZWJraXQtYW5pbWF0aW9uLWRlbGF5OiAtMC4ycztcbiAgICAgICAgICAgIGFuaW1hdGlvbi1kZWxheTogLTAuMnM7IH1cbiAgLmJhbGwtc2NhbGUtcmlwcGxlLW11bHRpcGxlID4gZGl2IHtcbiAgICAtd2Via2l0LWFuaW1hdGlvbi1maWxsLW1vZGU6IGJvdGg7XG4gICAgICAgICAgICBhbmltYXRpb24tZmlsbC1tb2RlOiBib3RoO1xuICAgIHBvc2l0aW9uOiBhYnNvbHV0ZTtcbiAgICB0b3A6IC0ycHg7XG4gICAgbGVmdDogLTI2cHg7XG4gICAgd2lkdGg6IDUwcHg7XG4gICAgaGVpZ2h0OiA1MHB4O1xuICAgIGJvcmRlci1yYWRpdXM6IDEwMCU7XG4gICAgYm9yZGVyOiAycHggc29saWQgI2ZmZjtcbiAgICAtd2Via2l0LWFuaW1hdGlvbjogYmFsbC1zY2FsZS1yaXBwbGUtbXVsdGlwbGUgMS4yNXMgMHMgaW5maW5pdGUgY3ViaWMtYmV6aWVyKDAuMjEsIDAuNTMsIDAuNTYsIDAuOCk7XG4gICAgICAgICAgICBhbmltYXRpb246IGJhbGwtc2NhbGUtcmlwcGxlLW11bHRpcGxlIDEuMjVzIDBzIGluZmluaXRlIGN1YmljLWJlemllcigwLjIxLCAwLjUzLCAwLjU2LCAwLjgpOyB9XG5cbkAtd2Via2l0LWtleWZyYW1lcyBiYWxsLWJlYXQge1xuICA1MCUge1xuICAgIG9wYWNpdHk6IDAuMjtcbiAgICAtd2Via2l0LXRyYW5zZm9ybTogc2NhbGUoMC43NSk7XG4gICAgICAgICAgICB0cmFuc2Zvcm06IHNjYWxlKDAuNzUpOyB9XG4gIDEwMCUge1xuICAgIG9wYWNpdHk6IDE7XG4gICAgLXdlYmtpdC10cmFuc2Zvcm06IHNjYWxlKDEpO1xuICAgICAgICAgICAgdHJhbnNmb3JtOiBzY2FsZSgxKTsgfSB9XG5cbkBrZXlmcmFtZXMgYmFsbC1iZWF0IHtcbiAgNTAlIHtcbiAgICBvcGFjaXR5OiAwLjI7XG4gICAgLXdlYmtpdC10cmFuc2Zvcm06IHNjYWxlKDAuNzUpO1xuICAgICAgICAgICAgdHJhbnNmb3JtOiBzY2FsZSgwLjc1KTsgfVxuICAxMDAlIHtcbiAgICBvcGFjaXR5OiAxO1xuICAgIC13ZWJraXQtdHJhbnNmb3JtOiBzY2FsZSgxKTtcbiAgICAgICAgICAgIHRyYW5zZm9ybTogc2NhbGUoMSk7IH0gfVxuXG4uYmFsbC1iZWF0ID4gZGl2IHtcbiAgYmFja2dyb3VuZC1jb2xvcjogI2ZmZjtcbiAgd2lkdGg6IDE1cHg7XG4gIGhlaWdodDogMTVweDtcbiAgYm9yZGVyLXJhZGl1czogMTAwJTtcbiAgbWFyZ2luOiAycHg7XG4gIC13ZWJraXQtYW5pbWF0aW9uLWZpbGwtbW9kZTogYm90aDtcbiAgICAgICAgICBhbmltYXRpb24tZmlsbC1tb2RlOiBib3RoO1xuICBkaXNwbGF5OiBpbmxpbmUtYmxvY2s7XG4gIC13ZWJraXQtYW5pbWF0aW9uOiBiYWxsLWJlYXQgMC43cyAwcyBpbmZpbml0ZSBsaW5lYXI7XG4gICAgICAgICAgYW5pbWF0aW9uOiBiYWxsLWJlYXQgMC43cyAwcyBpbmZpbml0ZSBsaW5lYXI7IH1cbiAgLmJhbGwtYmVhdCA+IGRpdjpudGgtY2hpbGQoMm4tMSkge1xuICAgIC13ZWJraXQtYW5pbWF0aW9uLWRlbGF5OiAtMC4zNXMgIWltcG9ydGFudDtcbiAgICAgICAgICAgIGFuaW1hdGlvbi1kZWxheTogLTAuMzVzICFpbXBvcnRhbnQ7IH1cblxuQC13ZWJraXQta2V5ZnJhbWVzIGJhbGwtc2NhbGUtbXVsdGlwbGUge1xuICAwJSB7XG4gICAgLXdlYmtpdC10cmFuc2Zvcm06IHNjYWxlKDApO1xuICAgICAgICAgICAgdHJhbnNmb3JtOiBzY2FsZSgwKTtcbiAgICBvcGFjaXR5OiAwOyB9XG4gIDUlIHtcbiAgICBvcGFjaXR5OiAxOyB9XG4gIDEwMCUge1xuICAgIC13ZWJraXQtdHJhbnNmb3JtOiBzY2FsZSgxKTtcbiAgICAgICAgICAgIHRyYW5zZm9ybTogc2NhbGUoMSk7XG4gICAgb3BhY2l0eTogMDsgfSB9XG5cbkBrZXlmcmFtZXMgYmFsbC1zY2FsZS1tdWx0aXBsZSB7XG4gIDAlIHtcbiAgICAtd2Via2l0LXRyYW5zZm9ybTogc2NhbGUoMCk7XG4gICAgICAgICAgICB0cmFuc2Zvcm06IHNjYWxlKDApO1xuICAgIG9wYWNpdHk6IDA7IH1cbiAgNSUge1xuICAgIG9wYWNpdHk6IDE7IH1cbiAgMTAwJSB7XG4gICAgLXdlYmtpdC10cmFuc2Zvcm06IHNjYWxlKDEpO1xuICAgICAgICAgICAgdHJhbnNmb3JtOiBzY2FsZSgxKTtcbiAgICBvcGFjaXR5OiAwOyB9IH1cblxuLmJhbGwtc2NhbGUtbXVsdGlwbGUge1xuICBwb3NpdGlvbjogcmVsYXRpdmU7XG4gIC13ZWJraXQtdHJhbnNmb3JtOiB0cmFuc2xhdGVZKC0zMHB4KTtcbiAgICAgIC1tcy10cmFuc2Zvcm06IHRyYW5zbGF0ZVkoLTMwcHgpO1xuICAgICAgICAgIHRyYW5zZm9ybTogdHJhbnNsYXRlWSgtMzBweCk7IH1cbiAgLmJhbGwtc2NhbGUtbXVsdGlwbGUgPiBkaXY6bnRoLWNoaWxkKDIpIHtcbiAgICAtd2Via2l0LWFuaW1hdGlvbi1kZWxheTogLTAuNHM7XG4gICAgICAgICAgICBhbmltYXRpb24tZGVsYXk6IC0wLjRzOyB9XG4gIC5iYWxsLXNjYWxlLW11bHRpcGxlID4gZGl2Om50aC1jaGlsZCgzKSB7XG4gICAgLXdlYmtpdC1hbmltYXRpb24tZGVsYXk6IC0wLjJzO1xuICAgICAgICAgICAgYW5pbWF0aW9uLWRlbGF5OiAtMC4yczsgfVxuICAuYmFsbC1zY2FsZS1tdWx0aXBsZSA+IGRpdiB7XG4gICAgYmFja2dyb3VuZC1jb2xvcjogI2ZmZjtcbiAgICB3aWR0aDogMTVweDtcbiAgICBoZWlnaHQ6IDE1cHg7XG4gICAgYm9yZGVyLXJhZGl1czogMTAwJTtcbiAgICBtYXJnaW46IDJweDtcbiAgICAtd2Via2l0LWFuaW1hdGlvbi1maWxsLW1vZGU6IGJvdGg7XG4gICAgICAgICAgICBhbmltYXRpb24tZmlsbC1tb2RlOiBib3RoO1xuICAgIHBvc2l0aW9uOiBhYnNvbHV0ZTtcbiAgICBsZWZ0OiAtMzBweDtcbiAgICB0b3A6IDBweDtcbiAgICBvcGFjaXR5OiAwO1xuICAgIG1hcmdpbjogMDtcbiAgICB3aWR0aDogNjBweDtcbiAgICBoZWlnaHQ6IDYwcHg7XG4gICAgLXdlYmtpdC1hbmltYXRpb246IGJhbGwtc2NhbGUtbXVsdGlwbGUgMXMgMHMgbGluZWFyIGluZmluaXRlO1xuICAgICAgICAgICAgYW5pbWF0aW9uOiBiYWxsLXNjYWxlLW11bHRpcGxlIDFzIDBzIGxpbmVhciBpbmZpbml0ZTsgfVxuXG5ALXdlYmtpdC1rZXlmcmFtZXMgYmFsbC10cmlhbmdsZS1wYXRoLTEge1xuICAzMyUge1xuICAgIC13ZWJraXQtdHJhbnNmb3JtOiB0cmFuc2xhdGUoMjVweCwgLTUwcHgpO1xuICAgICAgICAgICAgdHJhbnNmb3JtOiB0cmFuc2xhdGUoMjVweCwgLTUwcHgpOyB9XG4gIDY2JSB7XG4gICAgLXdlYmtpdC10cmFuc2Zvcm06IHRyYW5zbGF0ZSg1MHB4LCAwcHgpO1xuICAgICAgICAgICAgdHJhbnNmb3JtOiB0cmFuc2xhdGUoNTBweCwgMHB4KTsgfVxuICAxMDAlIHtcbiAgICAtd2Via2l0LXRyYW5zZm9ybTogdHJhbnNsYXRlKDBweCwgMHB4KTtcbiAgICAgICAgICAgIHRyYW5zZm9ybTogdHJhbnNsYXRlKDBweCwgMHB4KTsgfSB9XG5cbkBrZXlmcmFtZXMgYmFsbC10cmlhbmdsZS1wYXRoLTEge1xuICAzMyUge1xuICAgIC13ZWJraXQtdHJhbnNmb3JtOiB0cmFuc2xhdGUoMjVweCwgLTUwcHgpO1xuICAgICAgICAgICAgdHJhbnNmb3JtOiB0cmFuc2xhdGUoMjVweCwgLTUwcHgpOyB9XG4gIDY2JSB7XG4gICAgLXdlYmtpdC10cmFuc2Zvcm06IHRyYW5zbGF0ZSg1MHB4LCAwcHgpO1xuICAgICAgICAgICAgdHJhbnNmb3JtOiB0cmFuc2xhdGUoNTBweCwgMHB4KTsgfVxuICAxMDAlIHtcbiAgICAtd2Via2l0LXRyYW5zZm9ybTogdHJhbnNsYXRlKDBweCwgMHB4KTtcbiAgICAgICAgICAgIHRyYW5zZm9ybTogdHJhbnNsYXRlKDBweCwgMHB4KTsgfSB9XG5cbkAtd2Via2l0LWtleWZyYW1lcyBiYWxsLXRyaWFuZ2xlLXBhdGgtMiB7XG4gIDMzJSB7XG4gICAgLXdlYmtpdC10cmFuc2Zvcm06IHRyYW5zbGF0ZSgyNXB4LCA1MHB4KTtcbiAgICAgICAgICAgIHRyYW5zZm9ybTogdHJhbnNsYXRlKDI1cHgsIDUwcHgpOyB9XG4gIDY2JSB7XG4gICAgLXdlYmtpdC10cmFuc2Zvcm06IHRyYW5zbGF0ZSgtMjVweCwgNTBweCk7XG4gICAgICAgICAgICB0cmFuc2Zvcm06IHRyYW5zbGF0ZSgtMjVweCwgNTBweCk7IH1cbiAgMTAwJSB7XG4gICAgLXdlYmtpdC10cmFuc2Zvcm06IHRyYW5zbGF0ZSgwcHgsIDBweCk7XG4gICAgICAgICAgICB0cmFuc2Zvcm06IHRyYW5zbGF0ZSgwcHgsIDBweCk7IH0gfVxuXG5Aa2V5ZnJhbWVzIGJhbGwtdHJpYW5nbGUtcGF0aC0yIHtcbiAgMzMlIHtcbiAgICAtd2Via2l0LXRyYW5zZm9ybTogdHJhbnNsYXRlKDI1cHgsIDUwcHgpO1xuICAgICAgICAgICAgdHJhbnNmb3JtOiB0cmFuc2xhdGUoMjVweCwgNTBweCk7IH1cbiAgNjYlIHtcbiAgICAtd2Via2l0LXRyYW5zZm9ybTogdHJhbnNsYXRlKC0yNXB4LCA1MHB4KTtcbiAgICAgICAgICAgIHRyYW5zZm9ybTogdHJhbnNsYXRlKC0yNXB4LCA1MHB4KTsgfVxuICAxMDAlIHtcbiAgICAtd2Via2l0LXRyYW5zZm9ybTogdHJhbnNsYXRlKDBweCwgMHB4KTtcbiAgICAgICAgICAgIHRyYW5zZm9ybTogdHJhbnNsYXRlKDBweCwgMHB4KTsgfSB9XG5cbkAtd2Via2l0LWtleWZyYW1lcyBiYWxsLXRyaWFuZ2xlLXBhdGgtMyB7XG4gIDMzJSB7XG4gICAgLXdlYmtpdC10cmFuc2Zvcm06IHRyYW5zbGF0ZSgtNTBweCwgMHB4KTtcbiAgICAgICAgICAgIHRyYW5zZm9ybTogdHJhbnNsYXRlKC01MHB4LCAwcHgpOyB9XG4gIDY2JSB7XG4gICAgLXdlYmtpdC10cmFuc2Zvcm06IHRyYW5zbGF0ZSgtMjVweCwgLTUwcHgpO1xuICAgICAgICAgICAgdHJhbnNmb3JtOiB0cmFuc2xhdGUoLTI1cHgsIC01MHB4KTsgfVxuICAxMDAlIHtcbiAgICAtd2Via2l0LXRyYW5zZm9ybTogdHJhbnNsYXRlKDBweCwgMHB4KTtcbiAgICAgICAgICAgIHRyYW5zZm9ybTogdHJhbnNsYXRlKDBweCwgMHB4KTsgfSB9XG5cbkBrZXlmcmFtZXMgYmFsbC10cmlhbmdsZS1wYXRoLTMge1xuICAzMyUge1xuICAgIC13ZWJraXQtdHJhbnNmb3JtOiB0cmFuc2xhdGUoLTUwcHgsIDBweCk7XG4gICAgICAgICAgICB0cmFuc2Zvcm06IHRyYW5zbGF0ZSgtNTBweCwgMHB4KTsgfVxuICA2NiUge1xuICAgIC13ZWJraXQtdHJhbnNmb3JtOiB0cmFuc2xhdGUoLTI1cHgsIC01MHB4KTtcbiAgICAgICAgICAgIHRyYW5zZm9ybTogdHJhbnNsYXRlKC0yNXB4LCAtNTBweCk7IH1cbiAgMTAwJSB7XG4gICAgLXdlYmtpdC10cmFuc2Zvcm06IHRyYW5zbGF0ZSgwcHgsIDBweCk7XG4gICAgICAgICAgICB0cmFuc2Zvcm06IHRyYW5zbGF0ZSgwcHgsIDBweCk7IH0gfVxuXG4uYmFsbC10cmlhbmdsZS1wYXRoIHtcbiAgcG9zaXRpb246IHJlbGF0aXZlO1xuICAtd2Via2l0LXRyYW5zZm9ybTogdHJhbnNsYXRlKC0yOS45OTRweCwgLTM3LjUwOTM4cHgpO1xuICAgICAgLW1zLXRyYW5zZm9ybTogdHJhbnNsYXRlKC0yOS45OTRweCwgLTM3LjUwOTM4cHgpO1xuICAgICAgICAgIHRyYW5zZm9ybTogdHJhbnNsYXRlKC0yOS45OTRweCwgLTM3LjUwOTM4cHgpOyB9XG4gIC5iYWxsLXRyaWFuZ2xlLXBhdGggPiBkaXY6bnRoLWNoaWxkKDEpIHtcbiAgICAtd2Via2l0LWFuaW1hdGlvbi1uYW1lOiBiYWxsLXRyaWFuZ2xlLXBhdGgtMTtcbiAgICAgICAgICAgIGFuaW1hdGlvbi1uYW1lOiBiYWxsLXRyaWFuZ2xlLXBhdGgtMTtcbiAgICAtd2Via2l0LWFuaW1hdGlvbi1kZWxheTogMDtcbiAgICAgICAgICAgIGFuaW1hdGlvbi1kZWxheTogMDtcbiAgICAtd2Via2l0LWFuaW1hdGlvbi1kdXJhdGlvbjogMnM7XG4gICAgICAgICAgICBhbmltYXRpb24tZHVyYXRpb246IDJzO1xuICAgIC13ZWJraXQtYW5pbWF0aW9uLXRpbWluZy1mdW5jdGlvbjogZWFzZS1pbi1vdXQ7XG4gICAgICAgICAgICBhbmltYXRpb24tdGltaW5nLWZ1bmN0aW9uOiBlYXNlLWluLW91dDtcbiAgICAtd2Via2l0LWFuaW1hdGlvbi1pdGVyYXRpb24tY291bnQ6IGluZmluaXRlO1xuICAgICAgICAgICAgYW5pbWF0aW9uLWl0ZXJhdGlvbi1jb3VudDogaW5maW5pdGU7IH1cbiAgLmJhbGwtdHJpYW5nbGUtcGF0aCA+IGRpdjpudGgtY2hpbGQoMikge1xuICAgIC13ZWJraXQtYW5pbWF0aW9uLW5hbWU6IGJhbGwtdHJpYW5nbGUtcGF0aC0yO1xuICAgICAgICAgICAgYW5pbWF0aW9uLW5hbWU6IGJhbGwtdHJpYW5nbGUtcGF0aC0yO1xuICAgIC13ZWJraXQtYW5pbWF0aW9uLWRlbGF5OiAwO1xuICAgICAgICAgICAgYW5pbWF0aW9uLWRlbGF5OiAwO1xuICAgIC13ZWJraXQtYW5pbWF0aW9uLWR1cmF0aW9uOiAycztcbiAgICAgICAgICAgIGFuaW1hdGlvbi1kdXJhdGlvbjogMnM7XG4gICAgLXdlYmtpdC1hbmltYXRpb24tdGltaW5nLWZ1bmN0aW9uOiBlYXNlLWluLW91dDtcbiAgICAgICAgICAgIGFuaW1hdGlvbi10aW1pbmctZnVuY3Rpb246IGVhc2UtaW4tb3V0O1xuICAgIC13ZWJraXQtYW5pbWF0aW9uLWl0ZXJhdGlvbi1jb3VudDogaW5maW5pdGU7XG4gICAgICAgICAgICBhbmltYXRpb24taXRlcmF0aW9uLWNvdW50OiBpbmZpbml0ZTsgfVxuICAuYmFsbC10cmlhbmdsZS1wYXRoID4gZGl2Om50aC1jaGlsZCgzKSB7XG4gICAgLXdlYmtpdC1hbmltYXRpb24tbmFtZTogYmFsbC10cmlhbmdsZS1wYXRoLTM7XG4gICAgICAgICAgICBhbmltYXRpb24tbmFtZTogYmFsbC10cmlhbmdsZS1wYXRoLTM7XG4gICAgLXdlYmtpdC1hbmltYXRpb24tZGVsYXk6IDA7XG4gICAgICAgICAgICBhbmltYXRpb24tZGVsYXk6IDA7XG4gICAgLXdlYmtpdC1hbmltYXRpb24tZHVyYXRpb246IDJzO1xuICAgICAgICAgICAgYW5pbWF0aW9uLWR1cmF0aW9uOiAycztcbiAgICAtd2Via2l0LWFuaW1hdGlvbi10aW1pbmctZnVuY3Rpb246IGVhc2UtaW4tb3V0O1xuICAgICAgICAgICAgYW5pbWF0aW9uLXRpbWluZy1mdW5jdGlvbjogZWFzZS1pbi1vdXQ7XG4gICAgLXdlYmtpdC1hbmltYXRpb24taXRlcmF0aW9uLWNvdW50OiBpbmZpbml0ZTtcbiAgICAgICAgICAgIGFuaW1hdGlvbi1pdGVyYXRpb24tY291bnQ6IGluZmluaXRlOyB9XG4gIC5iYWxsLXRyaWFuZ2xlLXBhdGggPiBkaXYge1xuICAgIC13ZWJraXQtYW5pbWF0aW9uLWZpbGwtbW9kZTogYm90aDtcbiAgICAgICAgICAgIGFuaW1hdGlvbi1maWxsLW1vZGU6IGJvdGg7XG4gICAgcG9zaXRpb246IGFic29sdXRlO1xuICAgIHdpZHRoOiAxMHB4O1xuICAgIGhlaWdodDogMTBweDtcbiAgICBib3JkZXItcmFkaXVzOiAxMDAlO1xuICAgIGJvcmRlcjogMXB4IHNvbGlkICNmZmY7IH1cbiAgICAuYmFsbC10cmlhbmdsZS1wYXRoID4gZGl2Om50aC1vZi10eXBlKDEpIHtcbiAgICAgIHRvcDogNTBweDsgfVxuICAgIC5iYWxsLXRyaWFuZ2xlLXBhdGggPiBkaXY6bnRoLW9mLXR5cGUoMikge1xuICAgICAgbGVmdDogMjVweDsgfVxuICAgIC5iYWxsLXRyaWFuZ2xlLXBhdGggPiBkaXY6bnRoLW9mLXR5cGUoMykge1xuICAgICAgdG9wOiA1MHB4O1xuICAgICAgbGVmdDogNTBweDsgfVxuXG5ALXdlYmtpdC1rZXlmcmFtZXMgYmFsbC1wdWxzZS1yaXNlLWV2ZW4ge1xuICAwJSB7XG4gICAgLXdlYmtpdC10cmFuc2Zvcm06IHNjYWxlKDEuMSk7XG4gICAgICAgICAgICB0cmFuc2Zvcm06IHNjYWxlKDEuMSk7IH1cbiAgMjUlIHtcbiAgICAtd2Via2l0LXRyYW5zZm9ybTogdHJhbnNsYXRlWSgtMzBweCk7XG4gICAgICAgICAgICB0cmFuc2Zvcm06IHRyYW5zbGF0ZVkoLTMwcHgpOyB9XG4gIDUwJSB7XG4gICAgLXdlYmtpdC10cmFuc2Zvcm06IHNjYWxlKDAuNCk7XG4gICAgICAgICAgICB0cmFuc2Zvcm06IHNjYWxlKDAuNCk7IH1cbiAgNzUlIHtcbiAgICAtd2Via2l0LXRyYW5zZm9ybTogdHJhbnNsYXRlWSgzMHB4KTtcbiAgICAgICAgICAgIHRyYW5zZm9ybTogdHJhbnNsYXRlWSgzMHB4KTsgfVxuICAxMDAlIHtcbiAgICAtd2Via2l0LXRyYW5zZm9ybTogdHJhbnNsYXRlWSgwKTtcbiAgICAgICAgICAgIHRyYW5zZm9ybTogdHJhbnNsYXRlWSgwKTtcbiAgICAtd2Via2l0LXRyYW5zZm9ybTogc2NhbGUoMSk7XG4gICAgICAgICAgICB0cmFuc2Zvcm06IHNjYWxlKDEpOyB9IH1cblxuQGtleWZyYW1lcyBiYWxsLXB1bHNlLXJpc2UtZXZlbiB7XG4gIDAlIHtcbiAgICAtd2Via2l0LXRyYW5zZm9ybTogc2NhbGUoMS4xKTtcbiAgICAgICAgICAgIHRyYW5zZm9ybTogc2NhbGUoMS4xKTsgfVxuICAyNSUge1xuICAgIC13ZWJraXQtdHJhbnNmb3JtOiB0cmFuc2xhdGVZKC0zMHB4KTtcbiAgICAgICAgICAgIHRyYW5zZm9ybTogdHJhbnNsYXRlWSgtMzBweCk7IH1cbiAgNTAlIHtcbiAgICAtd2Via2l0LXRyYW5zZm9ybTogc2NhbGUoMC40KTtcbiAgICAgICAgICAgIHRyYW5zZm9ybTogc2NhbGUoMC40KTsgfVxuICA3NSUge1xuICAgIC13ZWJraXQtdHJhbnNmb3JtOiB0cmFuc2xhdGVZKDMwcHgpO1xuICAgICAgICAgICAgdHJhbnNmb3JtOiB0cmFuc2xhdGVZKDMwcHgpOyB9XG4gIDEwMCUge1xuICAgIC13ZWJraXQtdHJhbnNmb3JtOiB0cmFuc2xhdGVZKDApO1xuICAgICAgICAgICAgdHJhbnNmb3JtOiB0cmFuc2xhdGVZKDApO1xuICAgIC13ZWJraXQtdHJhbnNmb3JtOiBzY2FsZSgxKTtcbiAgICAgICAgICAgIHRyYW5zZm9ybTogc2NhbGUoMSk7IH0gfVxuXG5ALXdlYmtpdC1rZXlmcmFtZXMgYmFsbC1wdWxzZS1yaXNlLW9kZCB7XG4gIDAlIHtcbiAgICAtd2Via2l0LXRyYW5zZm9ybTogc2NhbGUoMC40KTtcbiAgICAgICAgICAgIHRyYW5zZm9ybTogc2NhbGUoMC40KTsgfVxuICAyNSUge1xuICAgIC13ZWJraXQtdHJhbnNmb3JtOiB0cmFuc2xhdGVZKDMwcHgpO1xuICAgICAgICAgICAgdHJhbnNmb3JtOiB0cmFuc2xhdGVZKDMwcHgpOyB9XG4gIDUwJSB7XG4gICAgLXdlYmtpdC10cmFuc2Zvcm06IHNjYWxlKDEuMSk7XG4gICAgICAgICAgICB0cmFuc2Zvcm06IHNjYWxlKDEuMSk7IH1cbiAgNzUlIHtcbiAgICAtd2Via2l0LXRyYW5zZm9ybTogdHJhbnNsYXRlWSgtMzBweCk7XG4gICAgICAgICAgICB0cmFuc2Zvcm06IHRyYW5zbGF0ZVkoLTMwcHgpOyB9XG4gIDEwMCUge1xuICAgIC13ZWJraXQtdHJhbnNmb3JtOiB0cmFuc2xhdGVZKDApO1xuICAgICAgICAgICAgdHJhbnNmb3JtOiB0cmFuc2xhdGVZKDApO1xuICAgIC13ZWJraXQtdHJhbnNmb3JtOiBzY2FsZSgwLjc1KTtcbiAgICAgICAgICAgIHRyYW5zZm9ybTogc2NhbGUoMC43NSk7IH0gfVxuXG5Aa2V5ZnJhbWVzIGJhbGwtcHVsc2UtcmlzZS1vZGQge1xuICAwJSB7XG4gICAgLXdlYmtpdC10cmFuc2Zvcm06IHNjYWxlKDAuNCk7XG4gICAgICAgICAgICB0cmFuc2Zvcm06IHNjYWxlKDAuNCk7IH1cbiAgMjUlIHtcbiAgICAtd2Via2l0LXRyYW5zZm9ybTogdHJhbnNsYXRlWSgzMHB4KTtcbiAgICAgICAgICAgIHRyYW5zZm9ybTogdHJhbnNsYXRlWSgzMHB4KTsgfVxuICA1MCUge1xuICAgIC13ZWJraXQtdHJhbnNmb3JtOiBzY2FsZSgxLjEpO1xuICAgICAgICAgICAgdHJhbnNmb3JtOiBzY2FsZSgxLjEpOyB9XG4gIDc1JSB7XG4gICAgLXdlYmtpdC10cmFuc2Zvcm06IHRyYW5zbGF0ZVkoLTMwcHgpO1xuICAgICAgICAgICAgdHJhbnNmb3JtOiB0cmFuc2xhdGVZKC0zMHB4KTsgfVxuICAxMDAlIHtcbiAgICAtd2Via2l0LXRyYW5zZm9ybTogdHJhbnNsYXRlWSgwKTtcbiAgICAgICAgICAgIHRyYW5zZm9ybTogdHJhbnNsYXRlWSgwKTtcbiAgICAtd2Via2l0LXRyYW5zZm9ybTogc2NhbGUoMC43NSk7XG4gICAgICAgICAgICB0cmFuc2Zvcm06IHNjYWxlKDAuNzUpOyB9IH1cblxuLmJhbGwtcHVsc2UtcmlzZSA+IGRpdiB7XG4gIGJhY2tncm91bmQtY29sb3I6ICNmZmY7XG4gIHdpZHRoOiAxNXB4O1xuICBoZWlnaHQ6IDE1cHg7XG4gIGJvcmRlci1yYWRpdXM6IDEwMCU7XG4gIG1hcmdpbjogMnB4O1xuICAtd2Via2l0LWFuaW1hdGlvbi1maWxsLW1vZGU6IGJvdGg7XG4gICAgICAgICAgYW5pbWF0aW9uLWZpbGwtbW9kZTogYm90aDtcbiAgZGlzcGxheTogaW5saW5lLWJsb2NrO1xuICAtd2Via2l0LWFuaW1hdGlvbi1kdXJhdGlvbjogMXM7XG4gICAgICAgICAgYW5pbWF0aW9uLWR1cmF0aW9uOiAxcztcbiAgLXdlYmtpdC1hbmltYXRpb24tdGltaW5nLWZ1bmN0aW9uOiBjdWJpYy1iZXppZXIoMC4xNSwgMC40NiwgMC45LCAwLjYpO1xuICAgICAgICAgIGFuaW1hdGlvbi10aW1pbmctZnVuY3Rpb246IGN1YmljLWJlemllcigwLjE1LCAwLjQ2LCAwLjksIDAuNik7XG4gIC13ZWJraXQtYW5pbWF0aW9uLWl0ZXJhdGlvbi1jb3VudDogaW5maW5pdGU7XG4gICAgICAgICAgYW5pbWF0aW9uLWl0ZXJhdGlvbi1jb3VudDogaW5maW5pdGU7XG4gIC13ZWJraXQtYW5pbWF0aW9uLWRlbGF5OiAwO1xuICAgICAgICAgIGFuaW1hdGlvbi1kZWxheTogMDsgfVxuICAuYmFsbC1wdWxzZS1yaXNlID4gZGl2Om50aC1jaGlsZCgybikge1xuICAgIC13ZWJraXQtYW5pbWF0aW9uLW5hbWU6IGJhbGwtcHVsc2UtcmlzZS1ldmVuO1xuICAgICAgICAgICAgYW5pbWF0aW9uLW5hbWU6IGJhbGwtcHVsc2UtcmlzZS1ldmVuOyB9XG4gIC5iYWxsLXB1bHNlLXJpc2UgPiBkaXY6bnRoLWNoaWxkKDJuLTEpIHtcbiAgICAtd2Via2l0LWFuaW1hdGlvbi1uYW1lOiBiYWxsLXB1bHNlLXJpc2Utb2RkO1xuICAgICAgICAgICAgYW5pbWF0aW9uLW5hbWU6IGJhbGwtcHVsc2UtcmlzZS1vZGQ7IH1cblxuQC13ZWJraXQta2V5ZnJhbWVzIGJhbGwtZ3JpZC1iZWF0IHtcbiAgNTAlIHtcbiAgICBvcGFjaXR5OiAwLjc7IH1cbiAgMTAwJSB7XG4gICAgb3BhY2l0eTogMTsgfSB9XG5cbkBrZXlmcmFtZXMgYmFsbC1ncmlkLWJlYXQge1xuICA1MCUge1xuICAgIG9wYWNpdHk6IDAuNzsgfVxuICAxMDAlIHtcbiAgICBvcGFjaXR5OiAxOyB9IH1cblxuLmJhbGwtZ3JpZC1iZWF0IHtcbiAgd2lkdGg6IDU3cHg7IH1cbiAgLmJhbGwtZ3JpZC1iZWF0ID4gZGl2Om50aC1jaGlsZCgxKSB7XG4gICAgLXdlYmtpdC1hbmltYXRpb24tZGVsYXk6IDAuNDRzO1xuICAgICAgICAgICAgYW5pbWF0aW9uLWRlbGF5OiAwLjQ0cztcbiAgICAtd2Via2l0LWFuaW1hdGlvbi1kdXJhdGlvbjogMS4yN3M7XG4gICAgICAgICAgICBhbmltYXRpb24tZHVyYXRpb246IDEuMjdzOyB9XG4gIC5iYWxsLWdyaWQtYmVhdCA+IGRpdjpudGgtY2hpbGQoMikge1xuICAgIC13ZWJraXQtYW5pbWF0aW9uLWRlbGF5OiAwLjJzO1xuICAgICAgICAgICAgYW5pbWF0aW9uLWRlbGF5OiAwLjJzO1xuICAgIC13ZWJraXQtYW5pbWF0aW9uLWR1cmF0aW9uOiAxLjUycztcbiAgICAgICAgICAgIGFuaW1hdGlvbi1kdXJhdGlvbjogMS41MnM7IH1cbiAgLmJhbGwtZ3JpZC1iZWF0ID4gZGl2Om50aC1jaGlsZCgzKSB7XG4gICAgLXdlYmtpdC1hbmltYXRpb24tZGVsYXk6IDAuMTRzO1xuICAgICAgICAgICAgYW5pbWF0aW9uLWRlbGF5OiAwLjE0cztcbiAgICAtd2Via2l0LWFuaW1hdGlvbi1kdXJhdGlvbjogMC42MXM7XG4gICAgICAgICAgICBhbmltYXRpb24tZHVyYXRpb246IDAuNjFzOyB9XG4gIC5iYWxsLWdyaWQtYmVhdCA+IGRpdjpudGgtY2hpbGQoNCkge1xuICAgIC13ZWJraXQtYW5pbWF0aW9uLWRlbGF5OiAwLjE1cztcbiAgICAgICAgICAgIGFuaW1hdGlvbi1kZWxheTogMC4xNXM7XG4gICAgLXdlYmtpdC1hbmltYXRpb24tZHVyYXRpb246IDAuODJzO1xuICAgICAgICAgICAgYW5pbWF0aW9uLWR1cmF0aW9uOiAwLjgyczsgfVxuICAuYmFsbC1ncmlkLWJlYXQgPiBkaXY6bnRoLWNoaWxkKDUpIHtcbiAgICAtd2Via2l0LWFuaW1hdGlvbi1kZWxheTogLTAuMDFzO1xuICAgICAgICAgICAgYW5pbWF0aW9uLWRlbGF5OiAtMC4wMXM7XG4gICAgLXdlYmtpdC1hbmltYXRpb24tZHVyYXRpb246IDEuMjRzO1xuICAgICAgICAgICAgYW5pbWF0aW9uLWR1cmF0aW9uOiAxLjI0czsgfVxuICAuYmFsbC1ncmlkLWJlYXQgPiBkaXY6bnRoLWNoaWxkKDYpIHtcbiAgICAtd2Via2l0LWFuaW1hdGlvbi1kZWxheTogLTAuMDdzO1xuICAgICAgICAgICAgYW5pbWF0aW9uLWRlbGF5OiAtMC4wN3M7XG4gICAgLXdlYmtpdC1hbmltYXRpb24tZHVyYXRpb246IDEuMzVzO1xuICAgICAgICAgICAgYW5pbWF0aW9uLWR1cmF0aW9uOiAxLjM1czsgfVxuICAuYmFsbC1ncmlkLWJlYXQgPiBkaXY6bnRoLWNoaWxkKDcpIHtcbiAgICAtd2Via2l0LWFuaW1hdGlvbi1kZWxheTogMC4yOXM7XG4gICAgICAgICAgICBhbmltYXRpb24tZGVsYXk6IDAuMjlzO1xuICAgIC13ZWJraXQtYW5pbWF0aW9uLWR1cmF0aW9uOiAxLjQ0cztcbiAgICAgICAgICAgIGFuaW1hdGlvbi1kdXJhdGlvbjogMS40NHM7IH1cbiAgLmJhbGwtZ3JpZC1iZWF0ID4gZGl2Om50aC1jaGlsZCg4KSB7XG4gICAgLXdlYmtpdC1hbmltYXRpb24tZGVsYXk6IDAuNjNzO1xuICAgICAgICAgICAgYW5pbWF0aW9uLWRlbGF5OiAwLjYzcztcbiAgICAtd2Via2l0LWFuaW1hdGlvbi1kdXJhdGlvbjogMS4xOXM7XG4gICAgICAgICAgICBhbmltYXRpb24tZHVyYXRpb246IDEuMTlzOyB9XG4gIC5iYWxsLWdyaWQtYmVhdCA+IGRpdjpudGgtY2hpbGQoOSkge1xuICAgIC13ZWJraXQtYW5pbWF0aW9uLWRlbGF5OiAtMC4xOHM7XG4gICAgICAgICAgICBhbmltYXRpb24tZGVsYXk6IC0wLjE4cztcbiAgICAtd2Via2l0LWFuaW1hdGlvbi1kdXJhdGlvbjogMS40OHM7XG4gICAgICAgICAgICBhbmltYXRpb24tZHVyYXRpb246IDEuNDhzOyB9XG4gIC5iYWxsLWdyaWQtYmVhdCA+IGRpdiB7XG4gICAgYmFja2dyb3VuZC1jb2xvcjogI2ZmZjtcbiAgICB3aWR0aDogMTVweDtcbiAgICBoZWlnaHQ6IDE1cHg7XG4gICAgYm9yZGVyLXJhZGl1czogMTAwJTtcbiAgICBtYXJnaW46IDJweDtcbiAgICAtd2Via2l0LWFuaW1hdGlvbi1maWxsLW1vZGU6IGJvdGg7XG4gICAgICAgICAgICBhbmltYXRpb24tZmlsbC1tb2RlOiBib3RoO1xuICAgIGRpc3BsYXk6IGlubGluZS1ibG9jaztcbiAgICBmbG9hdDogbGVmdDtcbiAgICAtd2Via2l0LWFuaW1hdGlvbi1uYW1lOiBiYWxsLWdyaWQtYmVhdDtcbiAgICAgICAgICAgIGFuaW1hdGlvbi1uYW1lOiBiYWxsLWdyaWQtYmVhdDtcbiAgICAtd2Via2l0LWFuaW1hdGlvbi1pdGVyYXRpb24tY291bnQ6IGluZmluaXRlO1xuICAgICAgICAgICAgYW5pbWF0aW9uLWl0ZXJhdGlvbi1jb3VudDogaW5maW5pdGU7XG4gICAgLXdlYmtpdC1hbmltYXRpb24tZGVsYXk6IDA7XG4gICAgICAgICAgICBhbmltYXRpb24tZGVsYXk6IDA7IH1cblxuQC13ZWJraXQta2V5ZnJhbWVzIGJhbGwtZ3JpZC1wdWxzZSB7XG4gIDAlIHtcbiAgICAtd2Via2l0LXRyYW5zZm9ybTogc2NhbGUoMSk7XG4gICAgICAgICAgICB0cmFuc2Zvcm06IHNjYWxlKDEpOyB9XG4gIDUwJSB7XG4gICAgLXdlYmtpdC10cmFuc2Zvcm06IHNjYWxlKDAuNSk7XG4gICAgICAgICAgICB0cmFuc2Zvcm06IHNjYWxlKDAuNSk7XG4gICAgb3BhY2l0eTogMC43OyB9XG4gIDEwMCUge1xuICAgIC13ZWJraXQtdHJhbnNmb3JtOiBzY2FsZSgxKTtcbiAgICAgICAgICAgIHRyYW5zZm9ybTogc2NhbGUoMSk7XG4gICAgb3BhY2l0eTogMTsgfSB9XG5cbkBrZXlmcmFtZXMgYmFsbC1ncmlkLXB1bHNlIHtcbiAgMCUge1xuICAgIC13ZWJraXQtdHJhbnNmb3JtOiBzY2FsZSgxKTtcbiAgICAgICAgICAgIHRyYW5zZm9ybTogc2NhbGUoMSk7IH1cbiAgNTAlIHtcbiAgICAtd2Via2l0LXRyYW5zZm9ybTogc2NhbGUoMC41KTtcbiAgICAgICAgICAgIHRyYW5zZm9ybTogc2NhbGUoMC41KTtcbiAgICBvcGFjaXR5OiAwLjc7IH1cbiAgMTAwJSB7XG4gICAgLXdlYmtpdC10cmFuc2Zvcm06IHNjYWxlKDEpO1xuICAgICAgICAgICAgdHJhbnNmb3JtOiBzY2FsZSgxKTtcbiAgICBvcGFjaXR5OiAxOyB9IH1cblxuLmJhbGwtZ3JpZC1wdWxzZSB7XG4gIHdpZHRoOiA1N3B4OyB9XG4gIC5iYWxsLWdyaWQtcHVsc2UgPiBkaXY6bnRoLWNoaWxkKDEpIHtcbiAgICAtd2Via2l0LWFuaW1hdGlvbi1kZWxheTogMC41OHM7XG4gICAgICAgICAgICBhbmltYXRpb24tZGVsYXk6IDAuNThzO1xuICAgIC13ZWJraXQtYW5pbWF0aW9uLWR1cmF0aW9uOiAwLjlzO1xuICAgICAgICAgICAgYW5pbWF0aW9uLWR1cmF0aW9uOiAwLjlzOyB9XG4gIC5iYWxsLWdyaWQtcHVsc2UgPiBkaXY6bnRoLWNoaWxkKDIpIHtcbiAgICAtd2Via2l0LWFuaW1hdGlvbi1kZWxheTogMC4wMXM7XG4gICAgICAgICAgICBhbmltYXRpb24tZGVsYXk6IDAuMDFzO1xuICAgIC13ZWJraXQtYW5pbWF0aW9uLWR1cmF0aW9uOiAwLjk0cztcbiAgICAgICAgICAgIGFuaW1hdGlvbi1kdXJhdGlvbjogMC45NHM7IH1cbiAgLmJhbGwtZ3JpZC1wdWxzZSA+IGRpdjpudGgtY2hpbGQoMykge1xuICAgIC13ZWJraXQtYW5pbWF0aW9uLWRlbGF5OiAwLjI1cztcbiAgICAgICAgICAgIGFuaW1hdGlvbi1kZWxheTogMC4yNXM7XG4gICAgLXdlYmtpdC1hbmltYXRpb24tZHVyYXRpb246IDEuNDNzO1xuICAgICAgICAgICAgYW5pbWF0aW9uLWR1cmF0aW9uOiAxLjQzczsgfVxuICAuYmFsbC1ncmlkLXB1bHNlID4gZGl2Om50aC1jaGlsZCg0KSB7XG4gICAgLXdlYmtpdC1hbmltYXRpb24tZGVsYXk6IC0wLjAzcztcbiAgICAgICAgICAgIGFuaW1hdGlvbi1kZWxheTogLTAuMDNzO1xuICAgIC13ZWJraXQtYW5pbWF0aW9uLWR1cmF0aW9uOiAwLjc0cztcbiAgICAgICAgICAgIGFuaW1hdGlvbi1kdXJhdGlvbjogMC43NHM7IH1cbiAgLmJhbGwtZ3JpZC1wdWxzZSA+IGRpdjpudGgtY2hpbGQoNSkge1xuICAgIC13ZWJraXQtYW5pbWF0aW9uLWRlbGF5OiAwLjIxcztcbiAgICAgICAgICAgIGFuaW1hdGlvbi1kZWxheTogMC4yMXM7XG4gICAgLXdlYmtpdC1hbmltYXRpb24tZHVyYXRpb246IDAuNjhzO1xuICAgICAgICAgICAgYW5pbWF0aW9uLWR1cmF0aW9uOiAwLjY4czsgfVxuICAuYmFsbC1ncmlkLXB1bHNlID4gZGl2Om50aC1jaGlsZCg2KSB7XG4gICAgLXdlYmtpdC1hbmltYXRpb24tZGVsYXk6IDAuMjVzO1xuICAgICAgICAgICAgYW5pbWF0aW9uLWRlbGF5OiAwLjI1cztcbiAgICAtd2Via2l0LWFuaW1hdGlvbi1kdXJhdGlvbjogMS4xN3M7XG4gICAgICAgICAgICBhbmltYXRpb24tZHVyYXRpb246IDEuMTdzOyB9XG4gIC5iYWxsLWdyaWQtcHVsc2UgPiBkaXY6bnRoLWNoaWxkKDcpIHtcbiAgICAtd2Via2l0LWFuaW1hdGlvbi1kZWxheTogMC40NnM7XG4gICAgICAgICAgICBhbmltYXRpb24tZGVsYXk6IDAuNDZzO1xuICAgIC13ZWJraXQtYW5pbWF0aW9uLWR1cmF0aW9uOiAxLjQxcztcbiAgICAgICAgICAgIGFuaW1hdGlvbi1kdXJhdGlvbjogMS40MXM7IH1cbiAgLmJhbGwtZ3JpZC1wdWxzZSA+IGRpdjpudGgtY2hpbGQoOCkge1xuICAgIC13ZWJraXQtYW5pbWF0aW9uLWRlbGF5OiAwLjAycztcbiAgICAgICAgICAgIGFuaW1hdGlvbi1kZWxheTogMC4wMnM7XG4gICAgLXdlYmtpdC1hbmltYXRpb24tZHVyYXRpb246IDEuNTZzO1xuICAgICAgICAgICAgYW5pbWF0aW9uLWR1cmF0aW9uOiAxLjU2czsgfVxuICAuYmFsbC1ncmlkLXB1bHNlID4gZGl2Om50aC1jaGlsZCg5KSB7XG4gICAgLXdlYmtpdC1hbmltYXRpb24tZGVsYXk6IDAuMTNzO1xuICAgICAgICAgICAgYW5pbWF0aW9uLWRlbGF5OiAwLjEzcztcbiAgICAtd2Via2l0LWFuaW1hdGlvbi1kdXJhdGlvbjogMC43OHM7XG4gICAgICAgICAgICBhbmltYXRpb24tZHVyYXRpb246IDAuNzhzOyB9XG4gIC5iYWxsLWdyaWQtcHVsc2UgPiBkaXYge1xuICAgIGJhY2tncm91bmQtY29sb3I6ICNmZmY7XG4gICAgd2lkdGg6IDE1cHg7XG4gICAgaGVpZ2h0OiAxNXB4O1xuICAgIGJvcmRlci1yYWRpdXM6IDEwMCU7XG4gICAgbWFyZ2luOiAycHg7XG4gICAgLXdlYmtpdC1hbmltYXRpb24tZmlsbC1tb2RlOiBib3RoO1xuICAgICAgICAgICAgYW5pbWF0aW9uLWZpbGwtbW9kZTogYm90aDtcbiAgICBkaXNwbGF5OiBpbmxpbmUtYmxvY2s7XG4gICAgZmxvYXQ6IGxlZnQ7XG4gICAgLXdlYmtpdC1hbmltYXRpb24tbmFtZTogYmFsbC1ncmlkLXB1bHNlO1xuICAgICAgICAgICAgYW5pbWF0aW9uLW5hbWU6IGJhbGwtZ3JpZC1wdWxzZTtcbiAgICAtd2Via2l0LWFuaW1hdGlvbi1pdGVyYXRpb24tY291bnQ6IGluZmluaXRlO1xuICAgICAgICAgICAgYW5pbWF0aW9uLWl0ZXJhdGlvbi1jb3VudDogaW5maW5pdGU7XG4gICAgLXdlYmtpdC1hbmltYXRpb24tZGVsYXk6IDA7XG4gICAgICAgICAgICBhbmltYXRpb24tZGVsYXk6IDA7IH1cblxuQC13ZWJraXQta2V5ZnJhbWVzIGJhbGwtc3Bpbi1mYWRlLWxvYWRlciB7XG4gIDUwJSB7XG4gICAgb3BhY2l0eTogMC4zO1xuICAgIC13ZWJraXQtdHJhbnNmb3JtOiBzY2FsZSgwLjQpO1xuICAgICAgICAgICAgdHJhbnNmb3JtOiBzY2FsZSgwLjQpOyB9XG4gIDEwMCUge1xuICAgIG9wYWNpdHk6IDE7XG4gICAgLXdlYmtpdC10cmFuc2Zvcm06IHNjYWxlKDEpO1xuICAgICAgICAgICAgdHJhbnNmb3JtOiBzY2FsZSgxKTsgfSB9XG5cbkBrZXlmcmFtZXMgYmFsbC1zcGluLWZhZGUtbG9hZGVyIHtcbiAgNTAlIHtcbiAgICBvcGFjaXR5OiAwLjM7XG4gICAgLXdlYmtpdC10cmFuc2Zvcm06IHNjYWxlKDAuNCk7XG4gICAgICAgICAgICB0cmFuc2Zvcm06IHNjYWxlKDAuNCk7IH1cbiAgMTAwJSB7XG4gICAgb3BhY2l0eTogMTtcbiAgICAtd2Via2l0LXRyYW5zZm9ybTogc2NhbGUoMSk7XG4gICAgICAgICAgICB0cmFuc2Zvcm06IHNjYWxlKDEpOyB9IH1cblxuLmJhbGwtc3Bpbi1mYWRlLWxvYWRlciB7XG4gIHBvc2l0aW9uOiByZWxhdGl2ZTtcbiAgdG9wOiAtMTBweDtcbiAgbGVmdDogLTEwcHg7IH1cbiAgLmJhbGwtc3Bpbi1mYWRlLWxvYWRlciA+IGRpdjpudGgtY2hpbGQoMSkge1xuICAgIHRvcDogMjVweDtcbiAgICBsZWZ0OiAwO1xuICAgIC13ZWJraXQtYW5pbWF0aW9uOiBiYWxsLXNwaW4tZmFkZS1sb2FkZXIgMXMgLTAuOTZzIGluZmluaXRlIGxpbmVhcjtcbiAgICAgICAgICAgIGFuaW1hdGlvbjogYmFsbC1zcGluLWZhZGUtbG9hZGVyIDFzIC0wLjk2cyBpbmZpbml0ZSBsaW5lYXI7IH1cbiAgLmJhbGwtc3Bpbi1mYWRlLWxvYWRlciA+IGRpdjpudGgtY2hpbGQoMikge1xuICAgIHRvcDogMTcuMDQ1NDVweDtcbiAgICBsZWZ0OiAxNy4wNDU0NXB4O1xuICAgIC13ZWJraXQtYW5pbWF0aW9uOiBiYWxsLXNwaW4tZmFkZS1sb2FkZXIgMXMgLTAuODRzIGluZmluaXRlIGxpbmVhcjtcbiAgICAgICAgICAgIGFuaW1hdGlvbjogYmFsbC1zcGluLWZhZGUtbG9hZGVyIDFzIC0wLjg0cyBpbmZpbml0ZSBsaW5lYXI7IH1cbiAgLmJhbGwtc3Bpbi1mYWRlLWxvYWRlciA+IGRpdjpudGgtY2hpbGQoMykge1xuICAgIHRvcDogMDtcbiAgICBsZWZ0OiAyNXB4O1xuICAgIC13ZWJraXQtYW5pbWF0aW9uOiBiYWxsLXNwaW4tZmFkZS1sb2FkZXIgMXMgLTAuNzJzIGluZmluaXRlIGxpbmVhcjtcbiAgICAgICAgICAgIGFuaW1hdGlvbjogYmFsbC1zcGluLWZhZGUtbG9hZGVyIDFzIC0wLjcycyBpbmZpbml0ZSBsaW5lYXI7IH1cbiAgLmJhbGwtc3Bpbi1mYWRlLWxvYWRlciA+IGRpdjpudGgtY2hpbGQoNCkge1xuICAgIHRvcDogLTE3LjA0NTQ1cHg7XG4gICAgbGVmdDogMTcuMDQ1NDVweDtcbiAgICAtd2Via2l0LWFuaW1hdGlvbjogYmFsbC1zcGluLWZhZGUtbG9hZGVyIDFzIC0wLjZzIGluZmluaXRlIGxpbmVhcjtcbiAgICAgICAgICAgIGFuaW1hdGlvbjogYmFsbC1zcGluLWZhZGUtbG9hZGVyIDFzIC0wLjZzIGluZmluaXRlIGxpbmVhcjsgfVxuICAuYmFsbC1zcGluLWZhZGUtbG9hZGVyID4gZGl2Om50aC1jaGlsZCg1KSB7XG4gICAgdG9wOiAtMjVweDtcbiAgICBsZWZ0OiAwO1xuICAgIC13ZWJraXQtYW5pbWF0aW9uOiBiYWxsLXNwaW4tZmFkZS1sb2FkZXIgMXMgLTAuNDhzIGluZmluaXRlIGxpbmVhcjtcbiAgICAgICAgICAgIGFuaW1hdGlvbjogYmFsbC1zcGluLWZhZGUtbG9hZGVyIDFzIC0wLjQ4cyBpbmZpbml0ZSBsaW5lYXI7IH1cbiAgLmJhbGwtc3Bpbi1mYWRlLWxvYWRlciA+IGRpdjpudGgtY2hpbGQoNikge1xuICAgIHRvcDogLTE3LjA0NTQ1cHg7XG4gICAgbGVmdDogLTE3LjA0NTQ1cHg7XG4gICAgLXdlYmtpdC1hbmltYXRpb246IGJhbGwtc3Bpbi1mYWRlLWxvYWRlciAxcyAtMC4zNnMgaW5maW5pdGUgbGluZWFyO1xuICAgICAgICAgICAgYW5pbWF0aW9uOiBiYWxsLXNwaW4tZmFkZS1sb2FkZXIgMXMgLTAuMzZzIGluZmluaXRlIGxpbmVhcjsgfVxuICAuYmFsbC1zcGluLWZhZGUtbG9hZGVyID4gZGl2Om50aC1jaGlsZCg3KSB7XG4gICAgdG9wOiAwO1xuICAgIGxlZnQ6IC0yNXB4O1xuICAgIC13ZWJraXQtYW5pbWF0aW9uOiBiYWxsLXNwaW4tZmFkZS1sb2FkZXIgMXMgLTAuMjRzIGluZmluaXRlIGxpbmVhcjtcbiAgICAgICAgICAgIGFuaW1hdGlvbjogYmFsbC1zcGluLWZhZGUtbG9hZGVyIDFzIC0wLjI0cyBpbmZpbml0ZSBsaW5lYXI7IH1cbiAgLmJhbGwtc3Bpbi1mYWRlLWxvYWRlciA+IGRpdjpudGgtY2hpbGQoOCkge1xuICAgIHRvcDogMTcuMDQ1NDVweDtcbiAgICBsZWZ0OiAtMTcuMDQ1NDVweDtcbiAgICAtd2Via2l0LWFuaW1hdGlvbjogYmFsbC1zcGluLWZhZGUtbG9hZGVyIDFzIC0wLjEycyBpbmZpbml0ZSBsaW5lYXI7XG4gICAgICAgICAgICBhbmltYXRpb246IGJhbGwtc3Bpbi1mYWRlLWxvYWRlciAxcyAtMC4xMnMgaW5maW5pdGUgbGluZWFyOyB9XG4gIC5iYWxsLXNwaW4tZmFkZS1sb2FkZXIgPiBkaXYge1xuICAgIGJhY2tncm91bmQtY29sb3I6ICNmZmY7XG4gICAgd2lkdGg6IDE1cHg7XG4gICAgaGVpZ2h0OiAxNXB4O1xuICAgIGJvcmRlci1yYWRpdXM6IDEwMCU7XG4gICAgbWFyZ2luOiAycHg7XG4gICAgLXdlYmtpdC1hbmltYXRpb24tZmlsbC1tb2RlOiBib3RoO1xuICAgICAgICAgICAgYW5pbWF0aW9uLWZpbGwtbW9kZTogYm90aDtcbiAgICBwb3NpdGlvbjogYWJzb2x1dGU7IH1cblxuQC13ZWJraXQta2V5ZnJhbWVzIGJhbGwtc3Bpbi1sb2FkZXIge1xuICA3NSUge1xuICAgIG9wYWNpdHk6IDAuMjsgfVxuICAxMDAlIHtcbiAgICBvcGFjaXR5OiAxOyB9IH1cblxuQGtleWZyYW1lcyBiYWxsLXNwaW4tbG9hZGVyIHtcbiAgNzUlIHtcbiAgICBvcGFjaXR5OiAwLjI7IH1cbiAgMTAwJSB7XG4gICAgb3BhY2l0eTogMTsgfSB9XG5cbi5iYWxsLXNwaW4tbG9hZGVyIHtcbiAgcG9zaXRpb246IHJlbGF0aXZlOyB9XG4gIC5iYWxsLXNwaW4tbG9hZGVyID4gc3BhbjpudGgtY2hpbGQoMSkge1xuICAgIHRvcDogNDVweDtcbiAgICBsZWZ0OiAwO1xuICAgIC13ZWJraXQtYW5pbWF0aW9uOiBiYWxsLXNwaW4tbG9hZGVyIDJzIDAuOXMgaW5maW5pdGUgbGluZWFyO1xuICAgICAgICAgICAgYW5pbWF0aW9uOiBiYWxsLXNwaW4tbG9hZGVyIDJzIDAuOXMgaW5maW5pdGUgbGluZWFyOyB9XG4gIC5iYWxsLXNwaW4tbG9hZGVyID4gc3BhbjpudGgtY2hpbGQoMikge1xuICAgIHRvcDogMzAuNjgxODJweDtcbiAgICBsZWZ0OiAzMC42ODE4MnB4O1xuICAgIC13ZWJraXQtYW5pbWF0aW9uOiBiYWxsLXNwaW4tbG9hZGVyIDJzIDEuOHMgaW5maW5pdGUgbGluZWFyO1xuICAgICAgICAgICAgYW5pbWF0aW9uOiBiYWxsLXNwaW4tbG9hZGVyIDJzIDEuOHMgaW5maW5pdGUgbGluZWFyOyB9XG4gIC5iYWxsLXNwaW4tbG9hZGVyID4gc3BhbjpudGgtY2hpbGQoMykge1xuICAgIHRvcDogMDtcbiAgICBsZWZ0OiA0NXB4O1xuICAgIC13ZWJraXQtYW5pbWF0aW9uOiBiYWxsLXNwaW4tbG9hZGVyIDJzIDIuN3MgaW5maW5pdGUgbGluZWFyO1xuICAgICAgICAgICAgYW5pbWF0aW9uOiBiYWxsLXNwaW4tbG9hZGVyIDJzIDIuN3MgaW5maW5pdGUgbGluZWFyOyB9XG4gIC5iYWxsLXNwaW4tbG9hZGVyID4gc3BhbjpudGgtY2hpbGQoNCkge1xuICAgIHRvcDogLTMwLjY4MTgycHg7XG4gICAgbGVmdDogMzAuNjgxODJweDtcbiAgICAtd2Via2l0LWFuaW1hdGlvbjogYmFsbC1zcGluLWxvYWRlciAycyAzLjZzIGluZmluaXRlIGxpbmVhcjtcbiAgICAgICAgICAgIGFuaW1hdGlvbjogYmFsbC1zcGluLWxvYWRlciAycyAzLjZzIGluZmluaXRlIGxpbmVhcjsgfVxuICAuYmFsbC1zcGluLWxvYWRlciA+IHNwYW46bnRoLWNoaWxkKDUpIHtcbiAgICB0b3A6IC00NXB4O1xuICAgIGxlZnQ6IDA7XG4gICAgLXdlYmtpdC1hbmltYXRpb246IGJhbGwtc3Bpbi1sb2FkZXIgMnMgNC41cyBpbmZpbml0ZSBsaW5lYXI7XG4gICAgICAgICAgICBhbmltYXRpb246IGJhbGwtc3Bpbi1sb2FkZXIgMnMgNC41cyBpbmZpbml0ZSBsaW5lYXI7IH1cbiAgLmJhbGwtc3Bpbi1sb2FkZXIgPiBzcGFuOm50aC1jaGlsZCg2KSB7XG4gICAgdG9wOiAtMzAuNjgxODJweDtcbiAgICBsZWZ0OiAtMzAuNjgxODJweDtcbiAgICAtd2Via2l0LWFuaW1hdGlvbjogYmFsbC1zcGluLWxvYWRlciAycyA1LjRzIGluZmluaXRlIGxpbmVhcjtcbiAgICAgICAgICAgIGFuaW1hdGlvbjogYmFsbC1zcGluLWxvYWRlciAycyA1LjRzIGluZmluaXRlIGxpbmVhcjsgfVxuICAuYmFsbC1zcGluLWxvYWRlciA+IHNwYW46bnRoLWNoaWxkKDcpIHtcbiAgICB0b3A6IDA7XG4gICAgbGVmdDogLTQ1cHg7XG4gICAgLXdlYmtpdC1hbmltYXRpb246IGJhbGwtc3Bpbi1sb2FkZXIgMnMgNi4zcyBpbmZpbml0ZSBsaW5lYXI7XG4gICAgICAgICAgICBhbmltYXRpb246IGJhbGwtc3Bpbi1sb2FkZXIgMnMgNi4zcyBpbmZpbml0ZSBsaW5lYXI7IH1cbiAgLmJhbGwtc3Bpbi1sb2FkZXIgPiBzcGFuOm50aC1jaGlsZCg4KSB7XG4gICAgdG9wOiAzMC42ODE4MnB4O1xuICAgIGxlZnQ6IC0zMC42ODE4MnB4O1xuICAgIC13ZWJraXQtYW5pbWF0aW9uOiBiYWxsLXNwaW4tbG9hZGVyIDJzIDcuMnMgaW5maW5pdGUgbGluZWFyO1xuICAgICAgICAgICAgYW5pbWF0aW9uOiBiYWxsLXNwaW4tbG9hZGVyIDJzIDcuMnMgaW5maW5pdGUgbGluZWFyOyB9XG4gIC5iYWxsLXNwaW4tbG9hZGVyID4gZGl2IHtcbiAgICAtd2Via2l0LWFuaW1hdGlvbi1maWxsLW1vZGU6IGJvdGg7XG4gICAgICAgICAgICBhbmltYXRpb24tZmlsbC1tb2RlOiBib3RoO1xuICAgIHBvc2l0aW9uOiBhYnNvbHV0ZTtcbiAgICB3aWR0aDogMTVweDtcbiAgICBoZWlnaHQ6IDE1cHg7XG4gICAgYm9yZGVyLXJhZGl1czogMTAwJTtcbiAgICBiYWNrZ3JvdW5kOiBncmVlbjsgfVxuXG5ALXdlYmtpdC1rZXlmcmFtZXMgYmFsbC16aWcge1xuICAzMyUge1xuICAgIC13ZWJraXQtdHJhbnNmb3JtOiB0cmFuc2xhdGUoLTE1cHgsIC0zMHB4KTtcbiAgICAgICAgICAgIHRyYW5zZm9ybTogdHJhbnNsYXRlKC0xNXB4LCAtMzBweCk7IH1cbiAgNjYlIHtcbiAgICAtd2Via2l0LXRyYW5zZm9ybTogdHJhbnNsYXRlKDE1cHgsIC0zMHB4KTtcbiAgICAgICAgICAgIHRyYW5zZm9ybTogdHJhbnNsYXRlKDE1cHgsIC0zMHB4KTsgfVxuICAxMDAlIHtcbiAgICAtd2Via2l0LXRyYW5zZm9ybTogdHJhbnNsYXRlKDAsIDApO1xuICAgICAgICAgICAgdHJhbnNmb3JtOiB0cmFuc2xhdGUoMCwgMCk7IH0gfVxuXG5Aa2V5ZnJhbWVzIGJhbGwtemlnIHtcbiAgMzMlIHtcbiAgICAtd2Via2l0LXRyYW5zZm9ybTogdHJhbnNsYXRlKC0xNXB4LCAtMzBweCk7XG4gICAgICAgICAgICB0cmFuc2Zvcm06IHRyYW5zbGF0ZSgtMTVweCwgLTMwcHgpOyB9XG4gIDY2JSB7XG4gICAgLXdlYmtpdC10cmFuc2Zvcm06IHRyYW5zbGF0ZSgxNXB4LCAtMzBweCk7XG4gICAgICAgICAgICB0cmFuc2Zvcm06IHRyYW5zbGF0ZSgxNXB4LCAtMzBweCk7IH1cbiAgMTAwJSB7XG4gICAgLXdlYmtpdC10cmFuc2Zvcm06IHRyYW5zbGF0ZSgwLCAwKTtcbiAgICAgICAgICAgIHRyYW5zZm9ybTogdHJhbnNsYXRlKDAsIDApOyB9IH1cblxuQC13ZWJraXQta2V5ZnJhbWVzIGJhbGwtemFnIHtcbiAgMzMlIHtcbiAgICAtd2Via2l0LXRyYW5zZm9ybTogdHJhbnNsYXRlKDE1cHgsIDMwcHgpO1xuICAgICAgICAgICAgdHJhbnNmb3JtOiB0cmFuc2xhdGUoMTVweCwgMzBweCk7IH1cbiAgNjYlIHtcbiAgICAtd2Via2l0LXRyYW5zZm9ybTogdHJhbnNsYXRlKC0xNXB4LCAzMHB4KTtcbiAgICAgICAgICAgIHRyYW5zZm9ybTogdHJhbnNsYXRlKC0xNXB4LCAzMHB4KTsgfVxuICAxMDAlIHtcbiAgICAtd2Via2l0LXRyYW5zZm9ybTogdHJhbnNsYXRlKDAsIDApO1xuICAgICAgICAgICAgdHJhbnNmb3JtOiB0cmFuc2xhdGUoMCwgMCk7IH0gfVxuXG5Aa2V5ZnJhbWVzIGJhbGwtemFnIHtcbiAgMzMlIHtcbiAgICAtd2Via2l0LXRyYW5zZm9ybTogdHJhbnNsYXRlKDE1cHgsIDMwcHgpO1xuICAgICAgICAgICAgdHJhbnNmb3JtOiB0cmFuc2xhdGUoMTVweCwgMzBweCk7IH1cbiAgNjYlIHtcbiAgICAtd2Via2l0LXRyYW5zZm9ybTogdHJhbnNsYXRlKC0xNXB4LCAzMHB4KTtcbiAgICAgICAgICAgIHRyYW5zZm9ybTogdHJhbnNsYXRlKC0xNXB4LCAzMHB4KTsgfVxuICAxMDAlIHtcbiAgICAtd2Via2l0LXRyYW5zZm9ybTogdHJhbnNsYXRlKDAsIDApO1xuICAgICAgICAgICAgdHJhbnNmb3JtOiB0cmFuc2xhdGUoMCwgMCk7IH0gfVxuXG4uYmFsbC16aWctemFnIHtcbiAgcG9zaXRpb246IHJlbGF0aXZlO1xuICAtd2Via2l0LXRyYW5zZm9ybTogdHJhbnNsYXRlKC0xNXB4LCAtMTVweCk7XG4gICAgICAtbXMtdHJhbnNmb3JtOiB0cmFuc2xhdGUoLTE1cHgsIC0xNXB4KTtcbiAgICAgICAgICB0cmFuc2Zvcm06IHRyYW5zbGF0ZSgtMTVweCwgLTE1cHgpOyB9XG4gIC5iYWxsLXppZy16YWcgPiBkaXYge1xuICAgIGJhY2tncm91bmQtY29sb3I6ICNmZmY7XG4gICAgd2lkdGg6IDE1cHg7XG4gICAgaGVpZ2h0OiAxNXB4O1xuICAgIGJvcmRlci1yYWRpdXM6IDEwMCU7XG4gICAgbWFyZ2luOiAycHg7XG4gICAgLXdlYmtpdC1hbmltYXRpb24tZmlsbC1tb2RlOiBib3RoO1xuICAgICAgICAgICAgYW5pbWF0aW9uLWZpbGwtbW9kZTogYm90aDtcbiAgICBwb3NpdGlvbjogYWJzb2x1dGU7XG4gICAgbWFyZ2luLWxlZnQ6IDE1cHg7XG4gICAgdG9wOiA0cHg7XG4gICAgbGVmdDogLTdweDsgfVxuICAgIC5iYWxsLXppZy16YWcgPiBkaXY6Zmlyc3QtY2hpbGQge1xuICAgICAgLXdlYmtpdC1hbmltYXRpb246IGJhbGwtemlnIDAuN3MgMHMgaW5maW5pdGUgbGluZWFyO1xuICAgICAgICAgICAgICBhbmltYXRpb246IGJhbGwtemlnIDAuN3MgMHMgaW5maW5pdGUgbGluZWFyOyB9XG4gICAgLmJhbGwtemlnLXphZyA+IGRpdjpsYXN0LWNoaWxkIHtcbiAgICAgIC13ZWJraXQtYW5pbWF0aW9uOiBiYWxsLXphZyAwLjdzIDBzIGluZmluaXRlIGxpbmVhcjtcbiAgICAgICAgICAgICAgYW5pbWF0aW9uOiBiYWxsLXphZyAwLjdzIDBzIGluZmluaXRlIGxpbmVhcjsgfVxuXG5ALXdlYmtpdC1rZXlmcmFtZXMgYmFsbC16aWctZGVmbGVjdCB7XG4gIDE3JSB7XG4gICAgLXdlYmtpdC10cmFuc2Zvcm06IHRyYW5zbGF0ZSgtMTVweCwgLTMwcHgpO1xuICAgICAgICAgICAgdHJhbnNmb3JtOiB0cmFuc2xhdGUoLTE1cHgsIC0zMHB4KTsgfVxuICAzNCUge1xuICAgIC13ZWJraXQtdHJhbnNmb3JtOiB0cmFuc2xhdGUoMTVweCwgLTMwcHgpO1xuICAgICAgICAgICAgdHJhbnNmb3JtOiB0cmFuc2xhdGUoMTVweCwgLTMwcHgpOyB9XG4gIDUwJSB7XG4gICAgLXdlYmtpdC10cmFuc2Zvcm06IHRyYW5zbGF0ZSgwLCAwKTtcbiAgICAgICAgICAgIHRyYW5zZm9ybTogdHJhbnNsYXRlKDAsIDApOyB9XG4gIDY3JSB7XG4gICAgLXdlYmtpdC10cmFuc2Zvcm06IHRyYW5zbGF0ZSgxNXB4LCAtMzBweCk7XG4gICAgICAgICAgICB0cmFuc2Zvcm06IHRyYW5zbGF0ZSgxNXB4LCAtMzBweCk7IH1cbiAgODQlIHtcbiAgICAtd2Via2l0LXRyYW5zZm9ybTogdHJhbnNsYXRlKC0xNXB4LCAtMzBweCk7XG4gICAgICAgICAgICB0cmFuc2Zvcm06IHRyYW5zbGF0ZSgtMTVweCwgLTMwcHgpOyB9XG4gIDEwMCUge1xuICAgIC13ZWJraXQtdHJhbnNmb3JtOiB0cmFuc2xhdGUoMCwgMCk7XG4gICAgICAgICAgICB0cmFuc2Zvcm06IHRyYW5zbGF0ZSgwLCAwKTsgfSB9XG5cbkBrZXlmcmFtZXMgYmFsbC16aWctZGVmbGVjdCB7XG4gIDE3JSB7XG4gICAgLXdlYmtpdC10cmFuc2Zvcm06IHRyYW5zbGF0ZSgtMTVweCwgLTMwcHgpO1xuICAgICAgICAgICAgdHJhbnNmb3JtOiB0cmFuc2xhdGUoLTE1cHgsIC0zMHB4KTsgfVxuICAzNCUge1xuICAgIC13ZWJraXQtdHJhbnNmb3JtOiB0cmFuc2xhdGUoMTVweCwgLTMwcHgpO1xuICAgICAgICAgICAgdHJhbnNmb3JtOiB0cmFuc2xhdGUoMTVweCwgLTMwcHgpOyB9XG4gIDUwJSB7XG4gICAgLXdlYmtpdC10cmFuc2Zvcm06IHRyYW5zbGF0ZSgwLCAwKTtcbiAgICAgICAgICAgIHRyYW5zZm9ybTogdHJhbnNsYXRlKDAsIDApOyB9XG4gIDY3JSB7XG4gICAgLXdlYmtpdC10cmFuc2Zvcm06IHRyYW5zbGF0ZSgxNXB4LCAtMzBweCk7XG4gICAgICAgICAgICB0cmFuc2Zvcm06IHRyYW5zbGF0ZSgxNXB4LCAtMzBweCk7IH1cbiAgODQlIHtcbiAgICAtd2Via2l0LXRyYW5zZm9ybTogdHJhbnNsYXRlKC0xNXB4LCAtMzBweCk7XG4gICAgICAgICAgICB0cmFuc2Zvcm06IHRyYW5zbGF0ZSgtMTVweCwgLTMwcHgpOyB9XG4gIDEwMCUge1xuICAgIC13ZWJraXQtdHJhbnNmb3JtOiB0cmFuc2xhdGUoMCwgMCk7XG4gICAgICAgICAgICB0cmFuc2Zvcm06IHRyYW5zbGF0ZSgwLCAwKTsgfSB9XG5cbkAtd2Via2l0LWtleWZyYW1lcyBiYWxsLXphZy1kZWZsZWN0IHtcbiAgMTclIHtcbiAgICAtd2Via2l0LXRyYW5zZm9ybTogdHJhbnNsYXRlKDE1cHgsIDMwcHgpO1xuICAgICAgICAgICAgdHJhbnNmb3JtOiB0cmFuc2xhdGUoMTVweCwgMzBweCk7IH1cbiAgMzQlIHtcbiAgICAtd2Via2l0LXRyYW5zZm9ybTogdHJhbnNsYXRlKC0xNXB4LCAzMHB4KTtcbiAgICAgICAgICAgIHRyYW5zZm9ybTogdHJhbnNsYXRlKC0xNXB4LCAzMHB4KTsgfVxuICA1MCUge1xuICAgIC13ZWJraXQtdHJhbnNmb3JtOiB0cmFuc2xhdGUoMCwgMCk7XG4gICAgICAgICAgICB0cmFuc2Zvcm06IHRyYW5zbGF0ZSgwLCAwKTsgfVxuICA2NyUge1xuICAgIC13ZWJraXQtdHJhbnNmb3JtOiB0cmFuc2xhdGUoLTE1cHgsIDMwcHgpO1xuICAgICAgICAgICAgdHJhbnNmb3JtOiB0cmFuc2xhdGUoLTE1cHgsIDMwcHgpOyB9XG4gIDg0JSB7XG4gICAgLXdlYmtpdC10cmFuc2Zvcm06IHRyYW5zbGF0ZSgxNXB4LCAzMHB4KTtcbiAgICAgICAgICAgIHRyYW5zZm9ybTogdHJhbnNsYXRlKDE1cHgsIDMwcHgpOyB9XG4gIDEwMCUge1xuICAgIC13ZWJraXQtdHJhbnNmb3JtOiB0cmFuc2xhdGUoMCwgMCk7XG4gICAgICAgICAgICB0cmFuc2Zvcm06IHRyYW5zbGF0ZSgwLCAwKTsgfSB9XG5cbkBrZXlmcmFtZXMgYmFsbC16YWctZGVmbGVjdCB7XG4gIDE3JSB7XG4gICAgLXdlYmtpdC10cmFuc2Zvcm06IHRyYW5zbGF0ZSgxNXB4LCAzMHB4KTtcbiAgICAgICAgICAgIHRyYW5zZm9ybTogdHJhbnNsYXRlKDE1cHgsIDMwcHgpOyB9XG4gIDM0JSB7XG4gICAgLXdlYmtpdC10cmFuc2Zvcm06IHRyYW5zbGF0ZSgtMTVweCwgMzBweCk7XG4gICAgICAgICAgICB0cmFuc2Zvcm06IHRyYW5zbGF0ZSgtMTVweCwgMzBweCk7IH1cbiAgNTAlIHtcbiAgICAtd2Via2l0LXRyYW5zZm9ybTogdHJhbnNsYXRlKDAsIDApO1xuICAgICAgICAgICAgdHJhbnNmb3JtOiB0cmFuc2xhdGUoMCwgMCk7IH1cbiAgNjclIHtcbiAgICAtd2Via2l0LXRyYW5zZm9ybTogdHJhbnNsYXRlKC0xNXB4LCAzMHB4KTtcbiAgICAgICAgICAgIHRyYW5zZm9ybTogdHJhbnNsYXRlKC0xNXB4LCAzMHB4KTsgfVxuICA4NCUge1xuICAgIC13ZWJraXQtdHJhbnNmb3JtOiB0cmFuc2xhdGUoMTVweCwgMzBweCk7XG4gICAgICAgICAgICB0cmFuc2Zvcm06IHRyYW5zbGF0ZSgxNXB4LCAzMHB4KTsgfVxuICAxMDAlIHtcbiAgICAtd2Via2l0LXRyYW5zZm9ybTogdHJhbnNsYXRlKDAsIDApO1xuICAgICAgICAgICAgdHJhbnNmb3JtOiB0cmFuc2xhdGUoMCwgMCk7IH0gfVxuXG4uYmFsbC16aWctemFnLWRlZmxlY3Qge1xuICBwb3NpdGlvbjogcmVsYXRpdmU7XG4gIC13ZWJraXQtdHJhbnNmb3JtOiB0cmFuc2xhdGUoLTE1cHgsIC0xNXB4KTtcbiAgICAgIC1tcy10cmFuc2Zvcm06IHRyYW5zbGF0ZSgtMTVweCwgLTE1cHgpO1xuICAgICAgICAgIHRyYW5zZm9ybTogdHJhbnNsYXRlKC0xNXB4LCAtMTVweCk7IH1cbiAgLmJhbGwtemlnLXphZy1kZWZsZWN0ID4gZGl2IHtcbiAgICBiYWNrZ3JvdW5kLWNvbG9yOiAjZmZmO1xuICAgIHdpZHRoOiAxNXB4O1xuICAgIGhlaWdodDogMTVweDtcbiAgICBib3JkZXItcmFkaXVzOiAxMDAlO1xuICAgIG1hcmdpbjogMnB4O1xuICAgIC13ZWJraXQtYW5pbWF0aW9uLWZpbGwtbW9kZTogYm90aDtcbiAgICAgICAgICAgIGFuaW1hdGlvbi1maWxsLW1vZGU6IGJvdGg7XG4gICAgcG9zaXRpb246IGFic29sdXRlO1xuICAgIG1hcmdpbi1sZWZ0OiAxNXB4O1xuICAgIHRvcDogNHB4O1xuICAgIGxlZnQ6IC03cHg7IH1cbiAgICAuYmFsbC16aWctemFnLWRlZmxlY3QgPiBkaXY6Zmlyc3QtY2hpbGQge1xuICAgICAgLXdlYmtpdC1hbmltYXRpb246IGJhbGwtemlnLWRlZmxlY3QgMS41cyAwcyBpbmZpbml0ZSBsaW5lYXI7XG4gICAgICAgICAgICAgIGFuaW1hdGlvbjogYmFsbC16aWctZGVmbGVjdCAxLjVzIDBzIGluZmluaXRlIGxpbmVhcjsgfVxuICAgIC5iYWxsLXppZy16YWctZGVmbGVjdCA+IGRpdjpsYXN0LWNoaWxkIHtcbiAgICAgIC13ZWJraXQtYW5pbWF0aW9uOiBiYWxsLXphZy1kZWZsZWN0IDEuNXMgMHMgaW5maW5pdGUgbGluZWFyO1xuICAgICAgICAgICAgICBhbmltYXRpb246IGJhbGwtemFnLWRlZmxlY3QgMS41cyAwcyBpbmZpbml0ZSBsaW5lYXI7IH1cblxuLyoqXG4gKiBMaW5lc1xuICovXG5ALXdlYmtpdC1rZXlmcmFtZXMgbGluZS1zY2FsZSB7XG4gIDAlIHtcbiAgICAtd2Via2l0LXRyYW5zZm9ybTogc2NhbGV5KDEpO1xuICAgICAgICAgICAgdHJhbnNmb3JtOiBzY2FsZXkoMSk7IH1cbiAgNTAlIHtcbiAgICAtd2Via2l0LXRyYW5zZm9ybTogc2NhbGV5KDAuNCk7XG4gICAgICAgICAgICB0cmFuc2Zvcm06IHNjYWxleSgwLjQpOyB9XG4gIDEwMCUge1xuICAgIC13ZWJraXQtdHJhbnNmb3JtOiBzY2FsZXkoMSk7XG4gICAgICAgICAgICB0cmFuc2Zvcm06IHNjYWxleSgxKTsgfSB9XG5Aa2V5ZnJhbWVzIGxpbmUtc2NhbGUge1xuICAwJSB7XG4gICAgLXdlYmtpdC10cmFuc2Zvcm06IHNjYWxleSgxKTtcbiAgICAgICAgICAgIHRyYW5zZm9ybTogc2NhbGV5KDEpOyB9XG4gIDUwJSB7XG4gICAgLXdlYmtpdC10cmFuc2Zvcm06IHNjYWxleSgwLjQpO1xuICAgICAgICAgICAgdHJhbnNmb3JtOiBzY2FsZXkoMC40KTsgfVxuICAxMDAlIHtcbiAgICAtd2Via2l0LXRyYW5zZm9ybTogc2NhbGV5KDEpO1xuICAgICAgICAgICAgdHJhbnNmb3JtOiBzY2FsZXkoMSk7IH0gfVxuXG4ubGluZS1zY2FsZSA+IGRpdjpudGgtY2hpbGQoMSkge1xuICAtd2Via2l0LWFuaW1hdGlvbjogbGluZS1zY2FsZSAxcyAtMC40cyBpbmZpbml0ZSBjdWJpYy1iZXppZXIoMC4yLCAwLjY4LCAwLjE4LCAxLjA4KTtcbiAgICAgICAgICBhbmltYXRpb246IGxpbmUtc2NhbGUgMXMgLTAuNHMgaW5maW5pdGUgY3ViaWMtYmV6aWVyKDAuMiwgMC42OCwgMC4xOCwgMS4wOCk7IH1cblxuLmxpbmUtc2NhbGUgPiBkaXY6bnRoLWNoaWxkKDIpIHtcbiAgLXdlYmtpdC1hbmltYXRpb246IGxpbmUtc2NhbGUgMXMgLTAuM3MgaW5maW5pdGUgY3ViaWMtYmV6aWVyKDAuMiwgMC42OCwgMC4xOCwgMS4wOCk7XG4gICAgICAgICAgYW5pbWF0aW9uOiBsaW5lLXNjYWxlIDFzIC0wLjNzIGluZmluaXRlIGN1YmljLWJlemllcigwLjIsIDAuNjgsIDAuMTgsIDEuMDgpOyB9XG5cbi5saW5lLXNjYWxlID4gZGl2Om50aC1jaGlsZCgzKSB7XG4gIC13ZWJraXQtYW5pbWF0aW9uOiBsaW5lLXNjYWxlIDFzIC0wLjJzIGluZmluaXRlIGN1YmljLWJlemllcigwLjIsIDAuNjgsIDAuMTgsIDEuMDgpO1xuICAgICAgICAgIGFuaW1hdGlvbjogbGluZS1zY2FsZSAxcyAtMC4ycyBpbmZpbml0ZSBjdWJpYy1iZXppZXIoMC4yLCAwLjY4LCAwLjE4LCAxLjA4KTsgfVxuXG4ubGluZS1zY2FsZSA+IGRpdjpudGgtY2hpbGQoNCkge1xuICAtd2Via2l0LWFuaW1hdGlvbjogbGluZS1zY2FsZSAxcyAtMC4xcyBpbmZpbml0ZSBjdWJpYy1iZXppZXIoMC4yLCAwLjY4LCAwLjE4LCAxLjA4KTtcbiAgICAgICAgICBhbmltYXRpb246IGxpbmUtc2NhbGUgMXMgLTAuMXMgaW5maW5pdGUgY3ViaWMtYmV6aWVyKDAuMiwgMC42OCwgMC4xOCwgMS4wOCk7IH1cblxuLmxpbmUtc2NhbGUgPiBkaXY6bnRoLWNoaWxkKDUpIHtcbiAgLXdlYmtpdC1hbmltYXRpb246IGxpbmUtc2NhbGUgMXMgMHMgaW5maW5pdGUgY3ViaWMtYmV6aWVyKDAuMiwgMC42OCwgMC4xOCwgMS4wOCk7XG4gICAgICAgICAgYW5pbWF0aW9uOiBsaW5lLXNjYWxlIDFzIDBzIGluZmluaXRlIGN1YmljLWJlemllcigwLjIsIDAuNjgsIDAuMTgsIDEuMDgpOyB9XG5cbi5saW5lLXNjYWxlID4gZGl2IHtcbiAgYmFja2dyb3VuZC1jb2xvcjogI2ZmZjtcbiAgd2lkdGg6IDRweDtcbiAgaGVpZ2h0OiAzNXB4O1xuICBib3JkZXItcmFkaXVzOiAycHg7XG4gIG1hcmdpbjogMnB4O1xuICAtd2Via2l0LWFuaW1hdGlvbi1maWxsLW1vZGU6IGJvdGg7XG4gICAgICAgICAgYW5pbWF0aW9uLWZpbGwtbW9kZTogYm90aDtcbiAgZGlzcGxheTogaW5saW5lLWJsb2NrOyB9XG5cbkAtd2Via2l0LWtleWZyYW1lcyBsaW5lLXNjYWxlLXBhcnR5IHtcbiAgMCUge1xuICAgIC13ZWJraXQtdHJhbnNmb3JtOiBzY2FsZSgxKTtcbiAgICAgICAgICAgIHRyYW5zZm9ybTogc2NhbGUoMSk7IH1cbiAgNTAlIHtcbiAgICAtd2Via2l0LXRyYW5zZm9ybTogc2NhbGUoMC41KTtcbiAgICAgICAgICAgIHRyYW5zZm9ybTogc2NhbGUoMC41KTsgfVxuICAxMDAlIHtcbiAgICAtd2Via2l0LXRyYW5zZm9ybTogc2NhbGUoMSk7XG4gICAgICAgICAgICB0cmFuc2Zvcm06IHNjYWxlKDEpOyB9IH1cblxuQGtleWZyYW1lcyBsaW5lLXNjYWxlLXBhcnR5IHtcbiAgMCUge1xuICAgIC13ZWJraXQtdHJhbnNmb3JtOiBzY2FsZSgxKTtcbiAgICAgICAgICAgIHRyYW5zZm9ybTogc2NhbGUoMSk7IH1cbiAgNTAlIHtcbiAgICAtd2Via2l0LXRyYW5zZm9ybTogc2NhbGUoMC41KTtcbiAgICAgICAgICAgIHRyYW5zZm9ybTogc2NhbGUoMC41KTsgfVxuICAxMDAlIHtcbiAgICAtd2Via2l0LXRyYW5zZm9ybTogc2NhbGUoMSk7XG4gICAgICAgICAgICB0cmFuc2Zvcm06IHNjYWxlKDEpOyB9IH1cblxuLmxpbmUtc2NhbGUtcGFydHkgPiBkaXY6bnRoLWNoaWxkKDEpIHtcbiAgLXdlYmtpdC1hbmltYXRpb24tZGVsYXk6IC0wLjA5cztcbiAgICAgICAgICBhbmltYXRpb24tZGVsYXk6IC0wLjA5cztcbiAgLXdlYmtpdC1hbmltYXRpb24tZHVyYXRpb246IDAuODNzO1xuICAgICAgICAgIGFuaW1hdGlvbi1kdXJhdGlvbjogMC44M3M7IH1cblxuLmxpbmUtc2NhbGUtcGFydHkgPiBkaXY6bnRoLWNoaWxkKDIpIHtcbiAgLXdlYmtpdC1hbmltYXRpb24tZGVsYXk6IDAuMzNzO1xuICAgICAgICAgIGFuaW1hdGlvbi1kZWxheTogMC4zM3M7XG4gIC13ZWJraXQtYW5pbWF0aW9uLWR1cmF0aW9uOiAwLjY0cztcbiAgICAgICAgICBhbmltYXRpb24tZHVyYXRpb246IDAuNjRzOyB9XG5cbi5saW5lLXNjYWxlLXBhcnR5ID4gZGl2Om50aC1jaGlsZCgzKSB7XG4gIC13ZWJraXQtYW5pbWF0aW9uLWRlbGF5OiAwLjMycztcbiAgICAgICAgICBhbmltYXRpb24tZGVsYXk6IDAuMzJzO1xuICAtd2Via2l0LWFuaW1hdGlvbi1kdXJhdGlvbjogMC4zOXM7XG4gICAgICAgICAgYW5pbWF0aW9uLWR1cmF0aW9uOiAwLjM5czsgfVxuXG4ubGluZS1zY2FsZS1wYXJ0eSA+IGRpdjpudGgtY2hpbGQoNCkge1xuICAtd2Via2l0LWFuaW1hdGlvbi1kZWxheTogMC40N3M7XG4gICAgICAgICAgYW5pbWF0aW9uLWRlbGF5OiAwLjQ3cztcbiAgLXdlYmtpdC1hbmltYXRpb24tZHVyYXRpb246IDAuNTJzO1xuICAgICAgICAgIGFuaW1hdGlvbi1kdXJhdGlvbjogMC41MnM7IH1cblxuLmxpbmUtc2NhbGUtcGFydHkgPiBkaXYge1xuICBiYWNrZ3JvdW5kLWNvbG9yOiAjZmZmO1xuICB3aWR0aDogNHB4O1xuICBoZWlnaHQ6IDM1cHg7XG4gIGJvcmRlci1yYWRpdXM6IDJweDtcbiAgbWFyZ2luOiAycHg7XG4gIC13ZWJraXQtYW5pbWF0aW9uLWZpbGwtbW9kZTogYm90aDtcbiAgICAgICAgICBhbmltYXRpb24tZmlsbC1tb2RlOiBib3RoO1xuICBkaXNwbGF5OiBpbmxpbmUtYmxvY2s7XG4gIC13ZWJraXQtYW5pbWF0aW9uLW5hbWU6IGxpbmUtc2NhbGUtcGFydHk7XG4gICAgICAgICAgYW5pbWF0aW9uLW5hbWU6IGxpbmUtc2NhbGUtcGFydHk7XG4gIC13ZWJraXQtYW5pbWF0aW9uLWl0ZXJhdGlvbi1jb3VudDogaW5maW5pdGU7XG4gICAgICAgICAgYW5pbWF0aW9uLWl0ZXJhdGlvbi1jb3VudDogaW5maW5pdGU7XG4gIC13ZWJraXQtYW5pbWF0aW9uLWRlbGF5OiAwO1xuICAgICAgICAgIGFuaW1hdGlvbi1kZWxheTogMDsgfVxuXG5ALXdlYmtpdC1rZXlmcmFtZXMgbGluZS1zY2FsZS1wdWxzZS1vdXQge1xuICAwJSB7XG4gICAgLXdlYmtpdC10cmFuc2Zvcm06IHNjYWxleSgxKTtcbiAgICAgICAgICAgIHRyYW5zZm9ybTogc2NhbGV5KDEpOyB9XG4gIDUwJSB7XG4gICAgLXdlYmtpdC10cmFuc2Zvcm06IHNjYWxleSgwLjQpO1xuICAgICAgICAgICAgdHJhbnNmb3JtOiBzY2FsZXkoMC40KTsgfVxuICAxMDAlIHtcbiAgICAtd2Via2l0LXRyYW5zZm9ybTogc2NhbGV5KDEpO1xuICAgICAgICAgICAgdHJhbnNmb3JtOiBzY2FsZXkoMSk7IH0gfVxuXG5Aa2V5ZnJhbWVzIGxpbmUtc2NhbGUtcHVsc2Utb3V0IHtcbiAgMCUge1xuICAgIC13ZWJraXQtdHJhbnNmb3JtOiBzY2FsZXkoMSk7XG4gICAgICAgICAgICB0cmFuc2Zvcm06IHNjYWxleSgxKTsgfVxuICA1MCUge1xuICAgIC13ZWJraXQtdHJhbnNmb3JtOiBzY2FsZXkoMC40KTtcbiAgICAgICAgICAgIHRyYW5zZm9ybTogc2NhbGV5KDAuNCk7IH1cbiAgMTAwJSB7XG4gICAgLXdlYmtpdC10cmFuc2Zvcm06IHNjYWxleSgxKTtcbiAgICAgICAgICAgIHRyYW5zZm9ybTogc2NhbGV5KDEpOyB9IH1cblxuLmxpbmUtc2NhbGUtcHVsc2Utb3V0ID4gZGl2IHtcbiAgYmFja2dyb3VuZC1jb2xvcjogI2ZmZjtcbiAgd2lkdGg6IDRweDtcbiAgaGVpZ2h0OiAzNXB4O1xuICBib3JkZXItcmFkaXVzOiAycHg7XG4gIG1hcmdpbjogMnB4O1xuICAtd2Via2l0LWFuaW1hdGlvbi1maWxsLW1vZGU6IGJvdGg7XG4gICAgICAgICAgYW5pbWF0aW9uLWZpbGwtbW9kZTogYm90aDtcbiAgZGlzcGxheTogaW5saW5lLWJsb2NrO1xuICAtd2Via2l0LWFuaW1hdGlvbjogbGluZS1zY2FsZS1wdWxzZS1vdXQgMC45cyAtMC42cyBpbmZpbml0ZSBjdWJpYy1iZXppZXIoMC44NSwgMC4yNSwgMC4zNywgMC44NSk7XG4gICAgICAgICAgYW5pbWF0aW9uOiBsaW5lLXNjYWxlLXB1bHNlLW91dCAwLjlzIC0wLjZzIGluZmluaXRlIGN1YmljLWJlemllcigwLjg1LCAwLjI1LCAwLjM3LCAwLjg1KTsgfVxuICAubGluZS1zY2FsZS1wdWxzZS1vdXQgPiBkaXY6bnRoLWNoaWxkKDIpLCAubGluZS1zY2FsZS1wdWxzZS1vdXQgPiBkaXY6bnRoLWNoaWxkKDQpIHtcbiAgICAtd2Via2l0LWFuaW1hdGlvbi1kZWxheTogLTAuNHMgIWltcG9ydGFudDtcbiAgICAgICAgICAgIGFuaW1hdGlvbi1kZWxheTogLTAuNHMgIWltcG9ydGFudDsgfVxuICAubGluZS1zY2FsZS1wdWxzZS1vdXQgPiBkaXY6bnRoLWNoaWxkKDEpLCAubGluZS1zY2FsZS1wdWxzZS1vdXQgPiBkaXY6bnRoLWNoaWxkKDUpIHtcbiAgICAtd2Via2l0LWFuaW1hdGlvbi1kZWxheTogLTAuMnMgIWltcG9ydGFudDtcbiAgICAgICAgICAgIGFuaW1hdGlvbi1kZWxheTogLTAuMnMgIWltcG9ydGFudDsgfVxuXG5ALXdlYmtpdC1rZXlmcmFtZXMgbGluZS1zY2FsZS1wdWxzZS1vdXQtcmFwaWQge1xuICAwJSB7XG4gICAgLXdlYmtpdC10cmFuc2Zvcm06IHNjYWxleSgxKTtcbiAgICAgICAgICAgIHRyYW5zZm9ybTogc2NhbGV5KDEpOyB9XG4gIDgwJSB7XG4gICAgLXdlYmtpdC10cmFuc2Zvcm06IHNjYWxleSgwLjMpO1xuICAgICAgICAgICAgdHJhbnNmb3JtOiBzY2FsZXkoMC4zKTsgfVxuICA5MCUge1xuICAgIC13ZWJraXQtdHJhbnNmb3JtOiBzY2FsZXkoMSk7XG4gICAgICAgICAgICB0cmFuc2Zvcm06IHNjYWxleSgxKTsgfSB9XG5cbkBrZXlmcmFtZXMgbGluZS1zY2FsZS1wdWxzZS1vdXQtcmFwaWQge1xuICAwJSB7XG4gICAgLXdlYmtpdC10cmFuc2Zvcm06IHNjYWxleSgxKTtcbiAgICAgICAgICAgIHRyYW5zZm9ybTogc2NhbGV5KDEpOyB9XG4gIDgwJSB7XG4gICAgLXdlYmtpdC10cmFuc2Zvcm06IHNjYWxleSgwLjMpO1xuICAgICAgICAgICAgdHJhbnNmb3JtOiBzY2FsZXkoMC4zKTsgfVxuICA5MCUge1xuICAgIC13ZWJraXQtdHJhbnNmb3JtOiBzY2FsZXkoMSk7XG4gICAgICAgICAgICB0cmFuc2Zvcm06IHNjYWxleSgxKTsgfSB9XG5cbi5saW5lLXNjYWxlLXB1bHNlLW91dC1yYXBpZCA+IGRpdiB7XG4gIGJhY2tncm91bmQtY29sb3I6ICNmZmY7XG4gIHdpZHRoOiA0cHg7XG4gIGhlaWdodDogMzVweDtcbiAgYm9yZGVyLXJhZGl1czogMnB4O1xuICBtYXJnaW46IDJweDtcbiAgLXdlYmtpdC1hbmltYXRpb24tZmlsbC1tb2RlOiBib3RoO1xuICAgICAgICAgIGFuaW1hdGlvbi1maWxsLW1vZGU6IGJvdGg7XG4gIGRpc3BsYXk6IGlubGluZS1ibG9jaztcbiAgLXdlYmtpdC1hbmltYXRpb246IGxpbmUtc2NhbGUtcHVsc2Utb3V0LXJhcGlkIDAuOXMgLTAuNXMgaW5maW5pdGUgY3ViaWMtYmV6aWVyKDAuMTEsIDAuNDksIDAuMzgsIDAuNzgpO1xuICAgICAgICAgIGFuaW1hdGlvbjogbGluZS1zY2FsZS1wdWxzZS1vdXQtcmFwaWQgMC45cyAtMC41cyBpbmZpbml0ZSBjdWJpYy1iZXppZXIoMC4xMSwgMC40OSwgMC4zOCwgMC43OCk7IH1cbiAgLmxpbmUtc2NhbGUtcHVsc2Utb3V0LXJhcGlkID4gZGl2Om50aC1jaGlsZCgyKSwgLmxpbmUtc2NhbGUtcHVsc2Utb3V0LXJhcGlkID4gZGl2Om50aC1jaGlsZCg0KSB7XG4gICAgLXdlYmtpdC1hbmltYXRpb24tZGVsYXk6IC0wLjI1cyAhaW1wb3J0YW50O1xuICAgICAgICAgICAgYW5pbWF0aW9uLWRlbGF5OiAtMC4yNXMgIWltcG9ydGFudDsgfVxuICAubGluZS1zY2FsZS1wdWxzZS1vdXQtcmFwaWQgPiBkaXY6bnRoLWNoaWxkKDEpLCAubGluZS1zY2FsZS1wdWxzZS1vdXQtcmFwaWQgPiBkaXY6bnRoLWNoaWxkKDUpIHtcbiAgICAtd2Via2l0LWFuaW1hdGlvbi1kZWxheTogMHMgIWltcG9ydGFudDtcbiAgICAgICAgICAgIGFuaW1hdGlvbi1kZWxheTogMHMgIWltcG9ydGFudDsgfVxuXG5ALXdlYmtpdC1rZXlmcmFtZXMgbGluZS1zcGluLWZhZGUtbG9hZGVyIHtcbiAgNTAlIHtcbiAgICBvcGFjaXR5OiAwLjM7IH1cbiAgMTAwJSB7XG4gICAgb3BhY2l0eTogMTsgfSB9XG5cbkBrZXlmcmFtZXMgbGluZS1zcGluLWZhZGUtbG9hZGVyIHtcbiAgNTAlIHtcbiAgICBvcGFjaXR5OiAwLjM7IH1cbiAgMTAwJSB7XG4gICAgb3BhY2l0eTogMTsgfSB9XG5cbi5saW5lLXNwaW4tZmFkZS1sb2FkZXIge1xuICBwb3NpdGlvbjogcmVsYXRpdmU7XG4gIHRvcDogLTEwcHg7XG4gIGxlZnQ6IC00cHg7IH1cbiAgLmxpbmUtc3Bpbi1mYWRlLWxvYWRlciA+IGRpdjpudGgtY2hpbGQoMSkge1xuICAgIHRvcDogMjBweDtcbiAgICBsZWZ0OiAwO1xuICAgIC13ZWJraXQtYW5pbWF0aW9uOiBsaW5lLXNwaW4tZmFkZS1sb2FkZXIgMS4ycyAtMC44NHMgaW5maW5pdGUgZWFzZS1pbi1vdXQ7XG4gICAgICAgICAgICBhbmltYXRpb246IGxpbmUtc3Bpbi1mYWRlLWxvYWRlciAxLjJzIC0wLjg0cyBpbmZpbml0ZSBlYXNlLWluLW91dDsgfVxuICAubGluZS1zcGluLWZhZGUtbG9hZGVyID4gZGl2Om50aC1jaGlsZCgyKSB7XG4gICAgdG9wOiAxMy42MzYzNnB4O1xuICAgIGxlZnQ6IDEzLjYzNjM2cHg7XG4gICAgLXdlYmtpdC10cmFuc2Zvcm06IHJvdGF0ZSgtNDVkZWcpO1xuICAgICAgICAtbXMtdHJhbnNmb3JtOiByb3RhdGUoLTQ1ZGVnKTtcbiAgICAgICAgICAgIHRyYW5zZm9ybTogcm90YXRlKC00NWRlZyk7XG4gICAgLXdlYmtpdC1hbmltYXRpb246IGxpbmUtc3Bpbi1mYWRlLWxvYWRlciAxLjJzIC0wLjcycyBpbmZpbml0ZSBlYXNlLWluLW91dDtcbiAgICAgICAgICAgIGFuaW1hdGlvbjogbGluZS1zcGluLWZhZGUtbG9hZGVyIDEuMnMgLTAuNzJzIGluZmluaXRlIGVhc2UtaW4tb3V0OyB9XG4gIC5saW5lLXNwaW4tZmFkZS1sb2FkZXIgPiBkaXY6bnRoLWNoaWxkKDMpIHtcbiAgICB0b3A6IDA7XG4gICAgbGVmdDogMjBweDtcbiAgICAtd2Via2l0LXRyYW5zZm9ybTogcm90YXRlKDkwZGVnKTtcbiAgICAgICAgLW1zLXRyYW5zZm9ybTogcm90YXRlKDkwZGVnKTtcbiAgICAgICAgICAgIHRyYW5zZm9ybTogcm90YXRlKDkwZGVnKTtcbiAgICAtd2Via2l0LWFuaW1hdGlvbjogbGluZS1zcGluLWZhZGUtbG9hZGVyIDEuMnMgLTAuNnMgaW5maW5pdGUgZWFzZS1pbi1vdXQ7XG4gICAgICAgICAgICBhbmltYXRpb246IGxpbmUtc3Bpbi1mYWRlLWxvYWRlciAxLjJzIC0wLjZzIGluZmluaXRlIGVhc2UtaW4tb3V0OyB9XG4gIC5saW5lLXNwaW4tZmFkZS1sb2FkZXIgPiBkaXY6bnRoLWNoaWxkKDQpIHtcbiAgICB0b3A6IC0xMy42MzYzNnB4O1xuICAgIGxlZnQ6IDEzLjYzNjM2cHg7XG4gICAgLXdlYmtpdC10cmFuc2Zvcm06IHJvdGF0ZSg0NWRlZyk7XG4gICAgICAgIC1tcy10cmFuc2Zvcm06IHJvdGF0ZSg0NWRlZyk7XG4gICAgICAgICAgICB0cmFuc2Zvcm06IHJvdGF0ZSg0NWRlZyk7XG4gICAgLXdlYmtpdC1hbmltYXRpb246IGxpbmUtc3Bpbi1mYWRlLWxvYWRlciAxLjJzIC0wLjQ4cyBpbmZpbml0ZSBlYXNlLWluLW91dDtcbiAgICAgICAgICAgIGFuaW1hdGlvbjogbGluZS1zcGluLWZhZGUtbG9hZGVyIDEuMnMgLTAuNDhzIGluZmluaXRlIGVhc2UtaW4tb3V0OyB9XG4gIC5saW5lLXNwaW4tZmFkZS1sb2FkZXIgPiBkaXY6bnRoLWNoaWxkKDUpIHtcbiAgICB0b3A6IC0yMHB4O1xuICAgIGxlZnQ6IDA7XG4gICAgLXdlYmtpdC1hbmltYXRpb246IGxpbmUtc3Bpbi1mYWRlLWxvYWRlciAxLjJzIC0wLjM2cyBpbmZpbml0ZSBlYXNlLWluLW91dDtcbiAgICAgICAgICAgIGFuaW1hdGlvbjogbGluZS1zcGluLWZhZGUtbG9hZGVyIDEuMnMgLTAuMzZzIGluZmluaXRlIGVhc2UtaW4tb3V0OyB9XG4gIC5saW5lLXNwaW4tZmFkZS1sb2FkZXIgPiBkaXY6bnRoLWNoaWxkKDYpIHtcbiAgICB0b3A6IC0xMy42MzYzNnB4O1xuICAgIGxlZnQ6IC0xMy42MzYzNnB4O1xuICAgIC13ZWJraXQtdHJhbnNmb3JtOiByb3RhdGUoLTQ1ZGVnKTtcbiAgICAgICAgLW1zLXRyYW5zZm9ybTogcm90YXRlKC00NWRlZyk7XG4gICAgICAgICAgICB0cmFuc2Zvcm06IHJvdGF0ZSgtNDVkZWcpO1xuICAgIC13ZWJraXQtYW5pbWF0aW9uOiBsaW5lLXNwaW4tZmFkZS1sb2FkZXIgMS4ycyAtMC4yNHMgaW5maW5pdGUgZWFzZS1pbi1vdXQ7XG4gICAgICAgICAgICBhbmltYXRpb246IGxpbmUtc3Bpbi1mYWRlLWxvYWRlciAxLjJzIC0wLjI0cyBpbmZpbml0ZSBlYXNlLWluLW91dDsgfVxuICAubGluZS1zcGluLWZhZGUtbG9hZGVyID4gZGl2Om50aC1jaGlsZCg3KSB7XG4gICAgdG9wOiAwO1xuICAgIGxlZnQ6IC0yMHB4O1xuICAgIC13ZWJraXQtdHJhbnNmb3JtOiByb3RhdGUoOTBkZWcpO1xuICAgICAgICAtbXMtdHJhbnNmb3JtOiByb3RhdGUoOTBkZWcpO1xuICAgICAgICAgICAgdHJhbnNmb3JtOiByb3RhdGUoOTBkZWcpO1xuICAgIC13ZWJraXQtYW5pbWF0aW9uOiBsaW5lLXNwaW4tZmFkZS1sb2FkZXIgMS4ycyAtMC4xMnMgaW5maW5pdGUgZWFzZS1pbi1vdXQ7XG4gICAgICAgICAgICBhbmltYXRpb246IGxpbmUtc3Bpbi1mYWRlLWxvYWRlciAxLjJzIC0wLjEycyBpbmZpbml0ZSBlYXNlLWluLW91dDsgfVxuICAubGluZS1zcGluLWZhZGUtbG9hZGVyID4gZGl2Om50aC1jaGlsZCg4KSB7XG4gICAgdG9wOiAxMy42MzYzNnB4O1xuICAgIGxlZnQ6IC0xMy42MzYzNnB4O1xuICAgIC13ZWJraXQtdHJhbnNmb3JtOiByb3RhdGUoNDVkZWcpO1xuICAgICAgICAtbXMtdHJhbnNmb3JtOiByb3RhdGUoNDVkZWcpO1xuICAgICAgICAgICAgdHJhbnNmb3JtOiByb3RhdGUoNDVkZWcpO1xuICAgIC13ZWJraXQtYW5pbWF0aW9uOiBsaW5lLXNwaW4tZmFkZS1sb2FkZXIgMS4ycyAwcyBpbmZpbml0ZSBlYXNlLWluLW91dDtcbiAgICAgICAgICAgIGFuaW1hdGlvbjogbGluZS1zcGluLWZhZGUtbG9hZGVyIDEuMnMgMHMgaW5maW5pdGUgZWFzZS1pbi1vdXQ7IH1cbiAgLmxpbmUtc3Bpbi1mYWRlLWxvYWRlciA+IGRpdiB7XG4gICAgYmFja2dyb3VuZC1jb2xvcjogI2ZmZjtcbiAgICB3aWR0aDogNHB4O1xuICAgIGhlaWdodDogMzVweDtcbiAgICBib3JkZXItcmFkaXVzOiAycHg7XG4gICAgbWFyZ2luOiAycHg7XG4gICAgLXdlYmtpdC1hbmltYXRpb24tZmlsbC1tb2RlOiBib3RoO1xuICAgICAgICAgICAgYW5pbWF0aW9uLWZpbGwtbW9kZTogYm90aDtcbiAgICBwb3NpdGlvbjogYWJzb2x1dGU7XG4gICAgd2lkdGg6IDVweDtcbiAgICBoZWlnaHQ6IDE1cHg7IH1cblxuLyoqXG4gKiBNaXNjXG4gKi9cbkAtd2Via2l0LWtleWZyYW1lcyB0cmlhbmdsZS1za2V3LXNwaW4ge1xuICAyNSUge1xuICAgIC13ZWJraXQtdHJhbnNmb3JtOiBwZXJzcGVjdGl2ZSgxMDBweCkgcm90YXRlWCgxODBkZWcpIHJvdGF0ZVkoMCk7XG4gICAgICAgICAgICB0cmFuc2Zvcm06IHBlcnNwZWN0aXZlKDEwMHB4KSByb3RhdGVYKDE4MGRlZykgcm90YXRlWSgwKTsgfVxuICA1MCUge1xuICAgIC13ZWJraXQtdHJhbnNmb3JtOiBwZXJzcGVjdGl2ZSgxMDBweCkgcm90YXRlWCgxODBkZWcpIHJvdGF0ZVkoMTgwZGVnKTtcbiAgICAgICAgICAgIHRyYW5zZm9ybTogcGVyc3BlY3RpdmUoMTAwcHgpIHJvdGF0ZVgoMTgwZGVnKSByb3RhdGVZKDE4MGRlZyk7IH1cbiAgNzUlIHtcbiAgICAtd2Via2l0LXRyYW5zZm9ybTogcGVyc3BlY3RpdmUoMTAwcHgpIHJvdGF0ZVgoMCkgcm90YXRlWSgxODBkZWcpO1xuICAgICAgICAgICAgdHJhbnNmb3JtOiBwZXJzcGVjdGl2ZSgxMDBweCkgcm90YXRlWCgwKSByb3RhdGVZKDE4MGRlZyk7IH1cbiAgMTAwJSB7XG4gICAgLXdlYmtpdC10cmFuc2Zvcm06IHBlcnNwZWN0aXZlKDEwMHB4KSByb3RhdGVYKDApIHJvdGF0ZVkoMCk7XG4gICAgICAgICAgICB0cmFuc2Zvcm06IHBlcnNwZWN0aXZlKDEwMHB4KSByb3RhdGVYKDApIHJvdGF0ZVkoMCk7IH0gfVxuQGtleWZyYW1lcyB0cmlhbmdsZS1za2V3LXNwaW4ge1xuICAyNSUge1xuICAgIC13ZWJraXQtdHJhbnNmb3JtOiBwZXJzcGVjdGl2ZSgxMDBweCkgcm90YXRlWCgxODBkZWcpIHJvdGF0ZVkoMCk7XG4gICAgICAgICAgICB0cmFuc2Zvcm06IHBlcnNwZWN0aXZlKDEwMHB4KSByb3RhdGVYKDE4MGRlZykgcm90YXRlWSgwKTsgfVxuICA1MCUge1xuICAgIC13ZWJraXQtdHJhbnNmb3JtOiBwZXJzcGVjdGl2ZSgxMDBweCkgcm90YXRlWCgxODBkZWcpIHJvdGF0ZVkoMTgwZGVnKTtcbiAgICAgICAgICAgIHRyYW5zZm9ybTogcGVyc3BlY3RpdmUoMTAwcHgpIHJvdGF0ZVgoMTgwZGVnKSByb3RhdGVZKDE4MGRlZyk7IH1cbiAgNzUlIHtcbiAgICAtd2Via2l0LXRyYW5zZm9ybTogcGVyc3BlY3RpdmUoMTAwcHgpIHJvdGF0ZVgoMCkgcm90YXRlWSgxODBkZWcpO1xuICAgICAgICAgICAgdHJhbnNmb3JtOiBwZXJzcGVjdGl2ZSgxMDBweCkgcm90YXRlWCgwKSByb3RhdGVZKDE4MGRlZyk7IH1cbiAgMTAwJSB7XG4gICAgLXdlYmtpdC10cmFuc2Zvcm06IHBlcnNwZWN0aXZlKDEwMHB4KSByb3RhdGVYKDApIHJvdGF0ZVkoMCk7XG4gICAgICAgICAgICB0cmFuc2Zvcm06IHBlcnNwZWN0aXZlKDEwMHB4KSByb3RhdGVYKDApIHJvdGF0ZVkoMCk7IH0gfVxuXG4udHJpYW5nbGUtc2tldy1zcGluID4gZGl2IHtcbiAgLXdlYmtpdC1hbmltYXRpb24tZmlsbC1tb2RlOiBib3RoO1xuICAgICAgICAgIGFuaW1hdGlvbi1maWxsLW1vZGU6IGJvdGg7XG4gIHdpZHRoOiAwO1xuICBoZWlnaHQ6IDA7XG4gIGJvcmRlci1sZWZ0OiAyMHB4IHNvbGlkIHRyYW5zcGFyZW50O1xuICBib3JkZXItcmlnaHQ6IDIwcHggc29saWQgdHJhbnNwYXJlbnQ7XG4gIGJvcmRlci1ib3R0b206IDIwcHggc29saWQgI2ZmZjtcbiAgLXdlYmtpdC1hbmltYXRpb246IHRyaWFuZ2xlLXNrZXctc3BpbiAzcyAwcyBjdWJpYy1iZXppZXIoMC4wOSwgMC41NywgMC40OSwgMC45KSBpbmZpbml0ZTtcbiAgICAgICAgICBhbmltYXRpb246IHRyaWFuZ2xlLXNrZXctc3BpbiAzcyAwcyBjdWJpYy1iZXppZXIoMC4wOSwgMC41NywgMC40OSwgMC45KSBpbmZpbml0ZTsgfVxuXG5ALXdlYmtpdC1rZXlmcmFtZXMgc3F1YXJlLXNwaW4ge1xuICAyNSUge1xuICAgIC13ZWJraXQtdHJhbnNmb3JtOiBwZXJzcGVjdGl2ZSgxMDBweCkgcm90YXRlWCgxODBkZWcpIHJvdGF0ZVkoMCk7XG4gICAgICAgICAgICB0cmFuc2Zvcm06IHBlcnNwZWN0aXZlKDEwMHB4KSByb3RhdGVYKDE4MGRlZykgcm90YXRlWSgwKTsgfVxuICA1MCUge1xuICAgIC13ZWJraXQtdHJhbnNmb3JtOiBwZXJzcGVjdGl2ZSgxMDBweCkgcm90YXRlWCgxODBkZWcpIHJvdGF0ZVkoMTgwZGVnKTtcbiAgICAgICAgICAgIHRyYW5zZm9ybTogcGVyc3BlY3RpdmUoMTAwcHgpIHJvdGF0ZVgoMTgwZGVnKSByb3RhdGVZKDE4MGRlZyk7IH1cbiAgNzUlIHtcbiAgICAtd2Via2l0LXRyYW5zZm9ybTogcGVyc3BlY3RpdmUoMTAwcHgpIHJvdGF0ZVgoMCkgcm90YXRlWSgxODBkZWcpO1xuICAgICAgICAgICAgdHJhbnNmb3JtOiBwZXJzcGVjdGl2ZSgxMDBweCkgcm90YXRlWCgwKSByb3RhdGVZKDE4MGRlZyk7IH1cbiAgMTAwJSB7XG4gICAgLXdlYmtpdC10cmFuc2Zvcm06IHBlcnNwZWN0aXZlKDEwMHB4KSByb3RhdGVYKDApIHJvdGF0ZVkoMCk7XG4gICAgICAgICAgICB0cmFuc2Zvcm06IHBlcnNwZWN0aXZlKDEwMHB4KSByb3RhdGVYKDApIHJvdGF0ZVkoMCk7IH0gfVxuXG5Aa2V5ZnJhbWVzIHNxdWFyZS1zcGluIHtcbiAgMjUlIHtcbiAgICAtd2Via2l0LXRyYW5zZm9ybTogcGVyc3BlY3RpdmUoMTAwcHgpIHJvdGF0ZVgoMTgwZGVnKSByb3RhdGVZKDApO1xuICAgICAgICAgICAgdHJhbnNmb3JtOiBwZXJzcGVjdGl2ZSgxMDBweCkgcm90YXRlWCgxODBkZWcpIHJvdGF0ZVkoMCk7IH1cbiAgNTAlIHtcbiAgICAtd2Via2l0LXRyYW5zZm9ybTogcGVyc3BlY3RpdmUoMTAwcHgpIHJvdGF0ZVgoMTgwZGVnKSByb3RhdGVZKDE4MGRlZyk7XG4gICAgICAgICAgICB0cmFuc2Zvcm06IHBlcnNwZWN0aXZlKDEwMHB4KSByb3RhdGVYKDE4MGRlZykgcm90YXRlWSgxODBkZWcpOyB9XG4gIDc1JSB7XG4gICAgLXdlYmtpdC10cmFuc2Zvcm06IHBlcnNwZWN0aXZlKDEwMHB4KSByb3RhdGVYKDApIHJvdGF0ZVkoMTgwZGVnKTtcbiAgICAgICAgICAgIHRyYW5zZm9ybTogcGVyc3BlY3RpdmUoMTAwcHgpIHJvdGF0ZVgoMCkgcm90YXRlWSgxODBkZWcpOyB9XG4gIDEwMCUge1xuICAgIC13ZWJraXQtdHJhbnNmb3JtOiBwZXJzcGVjdGl2ZSgxMDBweCkgcm90YXRlWCgwKSByb3RhdGVZKDApO1xuICAgICAgICAgICAgdHJhbnNmb3JtOiBwZXJzcGVjdGl2ZSgxMDBweCkgcm90YXRlWCgwKSByb3RhdGVZKDApOyB9IH1cblxuLnNxdWFyZS1zcGluID4gZGl2IHtcbiAgLXdlYmtpdC1hbmltYXRpb24tZmlsbC1tb2RlOiBib3RoO1xuICAgICAgICAgIGFuaW1hdGlvbi1maWxsLW1vZGU6IGJvdGg7XG4gIHdpZHRoOiA1MHB4O1xuICBoZWlnaHQ6IDUwcHg7XG4gIGJhY2tncm91bmQ6ICNmZmY7XG4gIGJvcmRlcjogMXB4IHNvbGlkIHJlZDtcbiAgLXdlYmtpdC1hbmltYXRpb246IHNxdWFyZS1zcGluIDNzIDBzIGN1YmljLWJlemllcigwLjA5LCAwLjU3LCAwLjQ5LCAwLjkpIGluZmluaXRlO1xuICAgICAgICAgIGFuaW1hdGlvbjogc3F1YXJlLXNwaW4gM3MgMHMgY3ViaWMtYmV6aWVyKDAuMDksIDAuNTcsIDAuNDksIDAuOSkgaW5maW5pdGU7IH1cblxuQC13ZWJraXQta2V5ZnJhbWVzIHJvdGF0ZV9wYWNtYW5faGFsZl91cCB7XG4gIDAlIHtcbiAgICAtd2Via2l0LXRyYW5zZm9ybTogcm90YXRlKDI3MGRlZyk7XG4gICAgICAgICAgICB0cmFuc2Zvcm06IHJvdGF0ZSgyNzBkZWcpOyB9XG4gIDUwJSB7XG4gICAgLXdlYmtpdC10cmFuc2Zvcm06IHJvdGF0ZSgzNjBkZWcpO1xuICAgICAgICAgICAgdHJhbnNmb3JtOiByb3RhdGUoMzYwZGVnKTsgfVxuICAxMDAlIHtcbiAgICAtd2Via2l0LXRyYW5zZm9ybTogcm90YXRlKDI3MGRlZyk7XG4gICAgICAgICAgICB0cmFuc2Zvcm06IHJvdGF0ZSgyNzBkZWcpOyB9IH1cblxuQGtleWZyYW1lcyByb3RhdGVfcGFjbWFuX2hhbGZfdXAge1xuICAwJSB7XG4gICAgLXdlYmtpdC10cmFuc2Zvcm06IHJvdGF0ZSgyNzBkZWcpO1xuICAgICAgICAgICAgdHJhbnNmb3JtOiByb3RhdGUoMjcwZGVnKTsgfVxuICA1MCUge1xuICAgIC13ZWJraXQtdHJhbnNmb3JtOiByb3RhdGUoMzYwZGVnKTtcbiAgICAgICAgICAgIHRyYW5zZm9ybTogcm90YXRlKDM2MGRlZyk7IH1cbiAgMTAwJSB7XG4gICAgLXdlYmtpdC10cmFuc2Zvcm06IHJvdGF0ZSgyNzBkZWcpO1xuICAgICAgICAgICAgdHJhbnNmb3JtOiByb3RhdGUoMjcwZGVnKTsgfSB9XG5cbkAtd2Via2l0LWtleWZyYW1lcyByb3RhdGVfcGFjbWFuX2hhbGZfZG93biB7XG4gIDAlIHtcbiAgICAtd2Via2l0LXRyYW5zZm9ybTogcm90YXRlKDkwZGVnKTtcbiAgICAgICAgICAgIHRyYW5zZm9ybTogcm90YXRlKDkwZGVnKTsgfVxuICA1MCUge1xuICAgIC13ZWJraXQtdHJhbnNmb3JtOiByb3RhdGUoMGRlZyk7XG4gICAgICAgICAgICB0cmFuc2Zvcm06IHJvdGF0ZSgwZGVnKTsgfVxuICAxMDAlIHtcbiAgICAtd2Via2l0LXRyYW5zZm9ybTogcm90YXRlKDkwZGVnKTtcbiAgICAgICAgICAgIHRyYW5zZm9ybTogcm90YXRlKDkwZGVnKTsgfSB9XG5cbkBrZXlmcmFtZXMgcm90YXRlX3BhY21hbl9oYWxmX2Rvd24ge1xuICAwJSB7XG4gICAgLXdlYmtpdC10cmFuc2Zvcm06IHJvdGF0ZSg5MGRlZyk7XG4gICAgICAgICAgICB0cmFuc2Zvcm06IHJvdGF0ZSg5MGRlZyk7IH1cbiAgNTAlIHtcbiAgICAtd2Via2l0LXRyYW5zZm9ybTogcm90YXRlKDBkZWcpO1xuICAgICAgICAgICAgdHJhbnNmb3JtOiByb3RhdGUoMGRlZyk7IH1cbiAgMTAwJSB7XG4gICAgLXdlYmtpdC10cmFuc2Zvcm06IHJvdGF0ZSg5MGRlZyk7XG4gICAgICAgICAgICB0cmFuc2Zvcm06IHJvdGF0ZSg5MGRlZyk7IH0gfVxuXG5ALXdlYmtpdC1rZXlmcmFtZXMgcGFjbWFuLWJhbGxzIHtcbiAgNzUlIHtcbiAgICBvcGFjaXR5OiAwLjc7IH1cbiAgMTAwJSB7XG4gICAgLXdlYmtpdC10cmFuc2Zvcm06IHRyYW5zbGF0ZSgtMTAwcHgsIC02LjI1cHgpO1xuICAgICAgICAgICAgdHJhbnNmb3JtOiB0cmFuc2xhdGUoLTEwMHB4LCAtNi4yNXB4KTsgfSB9XG5cbkBrZXlmcmFtZXMgcGFjbWFuLWJhbGxzIHtcbiAgNzUlIHtcbiAgICBvcGFjaXR5OiAwLjc7IH1cbiAgMTAwJSB7XG4gICAgLXdlYmtpdC10cmFuc2Zvcm06IHRyYW5zbGF0ZSgtMTAwcHgsIC02LjI1cHgpO1xuICAgICAgICAgICAgdHJhbnNmb3JtOiB0cmFuc2xhdGUoLTEwMHB4LCAtNi4yNXB4KTsgfSB9XG5cbi5wYWNtYW4ge1xuICBwb3NpdGlvbjogcmVsYXRpdmU7IH1cbiAgLnBhY21hbiA+IGRpdjpudGgtY2hpbGQoMikge1xuICAgIC13ZWJraXQtYW5pbWF0aW9uOiBwYWNtYW4tYmFsbHMgMXMgLTAuOTlzIGluZmluaXRlIGxpbmVhcjtcbiAgICAgICAgICAgIGFuaW1hdGlvbjogcGFjbWFuLWJhbGxzIDFzIC0wLjk5cyBpbmZpbml0ZSBsaW5lYXI7IH1cbiAgLnBhY21hbiA+IGRpdjpudGgtY2hpbGQoMykge1xuICAgIC13ZWJraXQtYW5pbWF0aW9uOiBwYWNtYW4tYmFsbHMgMXMgLTAuNjZzIGluZmluaXRlIGxpbmVhcjtcbiAgICAgICAgICAgIGFuaW1hdGlvbjogcGFjbWFuLWJhbGxzIDFzIC0wLjY2cyBpbmZpbml0ZSBsaW5lYXI7IH1cbiAgLnBhY21hbiA+IGRpdjpudGgtY2hpbGQoNCkge1xuICAgIC13ZWJraXQtYW5pbWF0aW9uOiBwYWNtYW4tYmFsbHMgMXMgLTAuMzNzIGluZmluaXRlIGxpbmVhcjtcbiAgICAgICAgICAgIGFuaW1hdGlvbjogcGFjbWFuLWJhbGxzIDFzIC0wLjMzcyBpbmZpbml0ZSBsaW5lYXI7IH1cbiAgLnBhY21hbiA+IGRpdjpudGgtY2hpbGQoNSkge1xuICAgIC13ZWJraXQtYW5pbWF0aW9uOiBwYWNtYW4tYmFsbHMgMXMgMHMgaW5maW5pdGUgbGluZWFyO1xuICAgICAgICAgICAgYW5pbWF0aW9uOiBwYWNtYW4tYmFsbHMgMXMgMHMgaW5maW5pdGUgbGluZWFyOyB9XG4gIC5wYWNtYW4gPiBkaXY6Zmlyc3Qtb2YtdHlwZSB7XG4gICAgd2lkdGg6IDBweDtcbiAgICBoZWlnaHQ6IDBweDtcbiAgICBib3JkZXItcmlnaHQ6IDI1cHggc29saWQgdHJhbnNwYXJlbnQ7XG4gICAgYm9yZGVyLXRvcDogMjVweCBzb2xpZCAjZmZmO1xuICAgIGJvcmRlci1sZWZ0OiAyNXB4IHNvbGlkICNmZmY7XG4gICAgYm9yZGVyLWJvdHRvbTogMjVweCBzb2xpZCAjZmZmO1xuICAgIGJvcmRlci1yYWRpdXM6IDI1cHg7XG4gICAgLXdlYmtpdC1hbmltYXRpb246IHJvdGF0ZV9wYWNtYW5faGFsZl91cCAwLjVzIDBzIGluZmluaXRlO1xuICAgICAgICAgICAgYW5pbWF0aW9uOiByb3RhdGVfcGFjbWFuX2hhbGZfdXAgMC41cyAwcyBpbmZpbml0ZTtcbiAgICBwb3NpdGlvbjogcmVsYXRpdmU7XG4gICAgbGVmdDogLTMwcHg7IH1cbiAgLnBhY21hbiA+IGRpdjpudGgtY2hpbGQoMikge1xuICAgIHdpZHRoOiAwcHg7XG4gICAgaGVpZ2h0OiAwcHg7XG4gICAgYm9yZGVyLXJpZ2h0OiAyNXB4IHNvbGlkIHRyYW5zcGFyZW50O1xuICAgIGJvcmRlci10b3A6IDI1cHggc29saWQgI2ZmZjtcbiAgICBib3JkZXItbGVmdDogMjVweCBzb2xpZCAjZmZmO1xuICAgIGJvcmRlci1ib3R0b206IDI1cHggc29saWQgI2ZmZjtcbiAgICBib3JkZXItcmFkaXVzOiAyNXB4O1xuICAgIC13ZWJraXQtYW5pbWF0aW9uOiByb3RhdGVfcGFjbWFuX2hhbGZfZG93biAwLjVzIDBzIGluZmluaXRlO1xuICAgICAgICAgICAgYW5pbWF0aW9uOiByb3RhdGVfcGFjbWFuX2hhbGZfZG93biAwLjVzIDBzIGluZmluaXRlO1xuICAgIG1hcmdpbi10b3A6IC01MHB4O1xuICAgIHBvc2l0aW9uOiByZWxhdGl2ZTtcbiAgICBsZWZ0OiAtMzBweDsgfVxuICAucGFjbWFuID4gZGl2Om50aC1jaGlsZCgzKSxcbiAgLnBhY21hbiA+IGRpdjpudGgtY2hpbGQoNCksXG4gIC5wYWNtYW4gPiBkaXY6bnRoLWNoaWxkKDUpLFxuICAucGFjbWFuID4gZGl2Om50aC1jaGlsZCg2KSB7XG4gICAgYmFja2dyb3VuZC1jb2xvcjogI2ZmZjtcbiAgICB3aWR0aDogMTVweDtcbiAgICBoZWlnaHQ6IDE1cHg7XG4gICAgYm9yZGVyLXJhZGl1czogMTAwJTtcbiAgICBtYXJnaW46IDJweDtcbiAgICB3aWR0aDogMTBweDtcbiAgICBoZWlnaHQ6IDEwcHg7XG4gICAgcG9zaXRpb246IGFic29sdXRlO1xuICAgIC13ZWJraXQtdHJhbnNmb3JtOiB0cmFuc2xhdGUoMCwgLTYuMjVweCk7XG4gICAgICAgIC1tcy10cmFuc2Zvcm06IHRyYW5zbGF0ZSgwLCAtNi4yNXB4KTtcbiAgICAgICAgICAgIHRyYW5zZm9ybTogdHJhbnNsYXRlKDAsIC02LjI1cHgpO1xuICAgIHRvcDogMjVweDtcbiAgICBsZWZ0OiA3MHB4OyB9XG5cbkAtd2Via2l0LWtleWZyYW1lcyBjdWJlLXRyYW5zaXRpb24ge1xuICAyNSUge1xuICAgIC13ZWJraXQtdHJhbnNmb3JtOiB0cmFuc2xhdGVYKDUwcHgpIHNjYWxlKDAuNSkgcm90YXRlKC05MGRlZyk7XG4gICAgICAgICAgICB0cmFuc2Zvcm06IHRyYW5zbGF0ZVgoNTBweCkgc2NhbGUoMC41KSByb3RhdGUoLTkwZGVnKTsgfVxuICA1MCUge1xuICAgIC13ZWJraXQtdHJhbnNmb3JtOiB0cmFuc2xhdGUoNTBweCwgNTBweCkgcm90YXRlKC0xODBkZWcpO1xuICAgICAgICAgICAgdHJhbnNmb3JtOiB0cmFuc2xhdGUoNTBweCwgNTBweCkgcm90YXRlKC0xODBkZWcpOyB9XG4gIDc1JSB7XG4gICAgLXdlYmtpdC10cmFuc2Zvcm06IHRyYW5zbGF0ZVkoNTBweCkgc2NhbGUoMC41KSByb3RhdGUoLTI3MGRlZyk7XG4gICAgICAgICAgICB0cmFuc2Zvcm06IHRyYW5zbGF0ZVkoNTBweCkgc2NhbGUoMC41KSByb3RhdGUoLTI3MGRlZyk7IH1cbiAgMTAwJSB7XG4gICAgLXdlYmtpdC10cmFuc2Zvcm06IHJvdGF0ZSgtMzYwZGVnKTtcbiAgICAgICAgICAgIHRyYW5zZm9ybTogcm90YXRlKC0zNjBkZWcpOyB9IH1cblxuQGtleWZyYW1lcyBjdWJlLXRyYW5zaXRpb24ge1xuICAyNSUge1xuICAgIC13ZWJraXQtdHJhbnNmb3JtOiB0cmFuc2xhdGVYKDUwcHgpIHNjYWxlKDAuNSkgcm90YXRlKC05MGRlZyk7XG4gICAgICAgICAgICB0cmFuc2Zvcm06IHRyYW5zbGF0ZVgoNTBweCkgc2NhbGUoMC41KSByb3RhdGUoLTkwZGVnKTsgfVxuICA1MCUge1xuICAgIC13ZWJraXQtdHJhbnNmb3JtOiB0cmFuc2xhdGUoNTBweCwgNTBweCkgcm90YXRlKC0xODBkZWcpO1xuICAgICAgICAgICAgdHJhbnNmb3JtOiB0cmFuc2xhdGUoNTBweCwgNTBweCkgcm90YXRlKC0xODBkZWcpOyB9XG4gIDc1JSB7XG4gICAgLXdlYmtpdC10cmFuc2Zvcm06IHRyYW5zbGF0ZVkoNTBweCkgc2NhbGUoMC41KSByb3RhdGUoLTI3MGRlZyk7XG4gICAgICAgICAgICB0cmFuc2Zvcm06IHRyYW5zbGF0ZVkoNTBweCkgc2NhbGUoMC41KSByb3RhdGUoLTI3MGRlZyk7IH1cbiAgMTAwJSB7XG4gICAgLXdlYmtpdC10cmFuc2Zvcm06IHJvdGF0ZSgtMzYwZGVnKTtcbiAgICAgICAgICAgIHRyYW5zZm9ybTogcm90YXRlKC0zNjBkZWcpOyB9IH1cblxuLmN1YmUtdHJhbnNpdGlvbiB7XG4gIHBvc2l0aW9uOiByZWxhdGl2ZTtcbiAgLXdlYmtpdC10cmFuc2Zvcm06IHRyYW5zbGF0ZSgtMjVweCwgLTI1cHgpO1xuICAgICAgLW1zLXRyYW5zZm9ybTogdHJhbnNsYXRlKC0yNXB4LCAtMjVweCk7XG4gICAgICAgICAgdHJhbnNmb3JtOiB0cmFuc2xhdGUoLTI1cHgsIC0yNXB4KTsgfVxuICAuY3ViZS10cmFuc2l0aW9uID4gZGl2IHtcbiAgICAtd2Via2l0LWFuaW1hdGlvbi1maWxsLW1vZGU6IGJvdGg7XG4gICAgICAgICAgICBhbmltYXRpb24tZmlsbC1tb2RlOiBib3RoO1xuICAgIHdpZHRoOiAxMHB4O1xuICAgIGhlaWdodDogMTBweDtcbiAgICBwb3NpdGlvbjogYWJzb2x1dGU7XG4gICAgdG9wOiAtNXB4O1xuICAgIGxlZnQ6IC01cHg7XG4gICAgYmFja2dyb3VuZC1jb2xvcjogI2ZmZjtcbiAgICAtd2Via2l0LWFuaW1hdGlvbjogY3ViZS10cmFuc2l0aW9uIDEuNnMgMHMgaW5maW5pdGUgZWFzZS1pbi1vdXQ7XG4gICAgICAgICAgICBhbmltYXRpb246IGN1YmUtdHJhbnNpdGlvbiAxLjZzIDBzIGluZmluaXRlIGVhc2UtaW4tb3V0OyB9XG4gICAgLmN1YmUtdHJhbnNpdGlvbiA+IGRpdjpsYXN0LWNoaWxkIHtcbiAgICAgIC13ZWJraXQtYW5pbWF0aW9uLWRlbGF5OiAtMC44cztcbiAgICAgICAgICAgICAgYW5pbWF0aW9uLWRlbGF5OiAtMC44czsgfVxuXG5ALXdlYmtpdC1rZXlmcmFtZXMgc3Bpbi1yb3RhdGUge1xuICAwJSB7XG4gICAgLXdlYmtpdC10cmFuc2Zvcm06IHJvdGF0ZSgwZGVnKTtcbiAgICAgICAgICAgIHRyYW5zZm9ybTogcm90YXRlKDBkZWcpOyB9XG4gIDUwJSB7XG4gICAgLXdlYmtpdC10cmFuc2Zvcm06IHJvdGF0ZSgxODBkZWcpO1xuICAgICAgICAgICAgdHJhbnNmb3JtOiByb3RhdGUoMTgwZGVnKTsgfVxuICAxMDAlIHtcbiAgICAtd2Via2l0LXRyYW5zZm9ybTogcm90YXRlKDM2MGRlZyk7XG4gICAgICAgICAgICB0cmFuc2Zvcm06IHJvdGF0ZSgzNjBkZWcpOyB9IH1cblxuQGtleWZyYW1lcyBzcGluLXJvdGF0ZSB7XG4gIDAlIHtcbiAgICAtd2Via2l0LXRyYW5zZm9ybTogcm90YXRlKDBkZWcpO1xuICAgICAgICAgICAgdHJhbnNmb3JtOiByb3RhdGUoMGRlZyk7IH1cbiAgNTAlIHtcbiAgICAtd2Via2l0LXRyYW5zZm9ybTogcm90YXRlKDE4MGRlZyk7XG4gICAgICAgICAgICB0cmFuc2Zvcm06IHJvdGF0ZSgxODBkZWcpOyB9XG4gIDEwMCUge1xuICAgIC13ZWJraXQtdHJhbnNmb3JtOiByb3RhdGUoMzYwZGVnKTtcbiAgICAgICAgICAgIHRyYW5zZm9ybTogcm90YXRlKDM2MGRlZyk7IH0gfVxuXG4uc2VtaS1jaXJjbGUtc3BpbiB7XG4gIHBvc2l0aW9uOiByZWxhdGl2ZTtcbiAgd2lkdGg6IDM1cHg7XG4gIGhlaWdodDogMzVweDtcbiAgb3ZlcmZsb3c6IGhpZGRlbjsgfVxuICAuc2VtaS1jaXJjbGUtc3BpbiA+IGRpdiB7XG4gICAgcG9zaXRpb246IGFic29sdXRlO1xuICAgIGJvcmRlci13aWR0aDogMHB4O1xuICAgIGJvcmRlci1yYWRpdXM6IDEwMCU7XG4gICAgLXdlYmtpdC1hbmltYXRpb246IHNwaW4tcm90YXRlIDAuNnMgMHMgaW5maW5pdGUgbGluZWFyO1xuICAgICAgICAgICAgYW5pbWF0aW9uOiBzcGluLXJvdGF0ZSAwLjZzIDBzIGluZmluaXRlIGxpbmVhcjtcbiAgICBiYWNrZ3JvdW5kLWltYWdlOiAtd2Via2l0LWxpbmVhci1ncmFkaWVudCh0cmFuc3BhcmVudCAwJSwgdHJhbnNwYXJlbnQgNzAlLCAjZmZmIDMwJSwgI2ZmZiAxMDAlKTtcbiAgICBiYWNrZ3JvdW5kLWltYWdlOiBsaW5lYXItZ3JhZGllbnQodHJhbnNwYXJlbnQgMCUsIHRyYW5zcGFyZW50IDcwJSwgI2ZmZiAzMCUsICNmZmYgMTAwJSk7XG4gICAgd2lkdGg6IDEwMCU7XG4gICAgaGVpZ2h0OiAxMDAlOyB9XG5cbkAtd2Via2l0LWtleWZyYW1lcyBiYXItcHJvZ3Jlc3Mge1xuICAwJSB7XG4gICAgLXdlYmtpdC10cmFuc2Zvcm06IHNjYWxlWSgyMCUpO1xuICAgICAgICAgICAgdHJhbnNmb3JtOiBzY2FsZVkoMjAlKTtcbiAgICBvcGFjaXR5OiAxOyB9XG4gIDI1JSB7XG4gICAgLXdlYmtpdC10cmFuc2Zvcm06IHRyYW5zbGF0ZVgoNiUpIHNjYWxlWSgxMCUpO1xuICAgICAgICAgICAgdHJhbnNmb3JtOiB0cmFuc2xhdGVYKDYlKSBzY2FsZVkoMTAlKTtcbiAgICBvcGFjaXR5OiAwLjc7IH1cbiAgNTAlIHtcbiAgICAtd2Via2l0LXRyYW5zZm9ybTogdHJhbnNsYXRlWCgyMCUpIHNjYWxlWSgyMCUpO1xuICAgICAgICAgICAgdHJhbnNmb3JtOiB0cmFuc2xhdGVYKDIwJSkgc2NhbGVZKDIwJSk7XG4gICAgb3BhY2l0eTogMTsgfVxuICA3NSUge1xuICAgIC13ZWJraXQtdHJhbnNmb3JtOiB0cmFuc2xhdGVYKDYlKSBzY2FsZVkoMTAlKTtcbiAgICAgICAgICAgIHRyYW5zZm9ybTogdHJhbnNsYXRlWCg2JSkgc2NhbGVZKDEwJSk7XG4gICAgb3BhY2l0eTogMC43OyB9XG4gIDEwMCUge1xuICAgIC13ZWJraXQtdHJhbnNmb3JtOiBzY2FsZVkoMjAlKTtcbiAgICAgICAgICAgIHRyYW5zZm9ybTogc2NhbGVZKDIwJSk7XG4gICAgb3BhY2l0eTogMTsgfSB9XG5cbkBrZXlmcmFtZXMgYmFyLXByb2dyZXNzIHtcbiAgMCUge1xuICAgIC13ZWJraXQtdHJhbnNmb3JtOiBzY2FsZVkoMjAlKTtcbiAgICAgICAgICAgIHRyYW5zZm9ybTogc2NhbGVZKDIwJSk7XG4gICAgb3BhY2l0eTogMTsgfVxuICAyNSUge1xuICAgIC13ZWJraXQtdHJhbnNmb3JtOiB0cmFuc2xhdGVYKDYlKSBzY2FsZVkoMTAlKTtcbiAgICAgICAgICAgIHRyYW5zZm9ybTogdHJhbnNsYXRlWCg2JSkgc2NhbGVZKDEwJSk7XG4gICAgb3BhY2l0eTogMC43OyB9XG4gIDUwJSB7XG4gICAgLXdlYmtpdC10cmFuc2Zvcm06IHRyYW5zbGF0ZVgoMjAlKSBzY2FsZVkoMjAlKTtcbiAgICAgICAgICAgIHRyYW5zZm9ybTogdHJhbnNsYXRlWCgyMCUpIHNjYWxlWSgyMCUpO1xuICAgIG9wYWNpdHk6IDE7IH1cbiAgNzUlIHtcbiAgICAtd2Via2l0LXRyYW5zZm9ybTogdHJhbnNsYXRlWCg2JSkgc2NhbGVZKDEwJSk7XG4gICAgICAgICAgICB0cmFuc2Zvcm06IHRyYW5zbGF0ZVgoNiUpIHNjYWxlWSgxMCUpO1xuICAgIG9wYWNpdHk6IDAuNzsgfVxuICAxMDAlIHtcbiAgICAtd2Via2l0LXRyYW5zZm9ybTogc2NhbGVZKDIwJSk7XG4gICAgICAgICAgICB0cmFuc2Zvcm06IHNjYWxlWSgyMCUpO1xuICAgIG9wYWNpdHk6IDE7IH0gfVxuXG4uYmFyLXByb2dyZXNzIHtcbiAgd2lkdGg6IDMwJTtcbiAgaGVpZ2h0OiAxMnB4OyB9XG4gIC5iYXItcHJvZ3Jlc3MgPiBkaXYge1xuICAgIHBvc2l0aW9uOiByZWxhdGl2ZTtcbiAgICB3aWR0aDogMjAlO1xuICAgIGhlaWdodDogMTJweDtcbiAgICBib3JkZXItcmFkaXVzOiAxMHB4O1xuICAgIGJhY2tncm91bmQtY29sb3I6ICNmZmY7XG4gICAgLXdlYmtpdC1hbmltYXRpb246IGJhci1wcm9ncmVzcyAzcyBjdWJpYy1iZXppZXIoMC41NywgMC4xLCAwLjQ0LCAwLjkzKSBpbmZpbml0ZTtcbiAgICAgICAgICAgIGFuaW1hdGlvbjogYmFyLXByb2dyZXNzIDNzIGN1YmljLWJlemllcigwLjU3LCAwLjEsIDAuNDQsIDAuOTMpIGluZmluaXRlO1xuICAgIG9wYWNpdHk6IDE7IH1cblxuQC13ZWJraXQta2V5ZnJhbWVzIGJhci1zd2luZyB7XG4gIDAlIHtcbiAgICBsZWZ0OiAwOyB9XG4gIDUwJSB7XG4gICAgbGVmdDogNzAlOyB9XG4gIDEwMCUge1xuICAgIGxlZnQ6IDA7IH0gfVxuXG5Aa2V5ZnJhbWVzIGJhci1zd2luZyB7XG4gIDAlIHtcbiAgICBsZWZ0OiAwOyB9XG4gIDUwJSB7XG4gICAgbGVmdDogNzAlOyB9XG4gIDEwMCUge1xuICAgIGxlZnQ6IDA7IH0gfVxuXG4uYmFyLXN3aW5nIHtcbiAgd2lkdGg6IDMwJTtcbiAgaGVpZ2h0OiA4cHg7IH1cbiAgLmJhci1zd2luZyA+IGRpdiB7XG4gICAgcG9zaXRpb246IHJlbGF0aXZlO1xuICAgIHdpZHRoOiAzMCU7XG4gICAgaGVpZ2h0OiA4cHg7XG4gICAgYm9yZGVyLXJhZGl1czogMTBweDtcbiAgICBiYWNrZ3JvdW5kLWNvbG9yOiAjZmZmO1xuICAgIC13ZWJraXQtYW5pbWF0aW9uOiBiYXItc3dpbmcgMS41cyBpbmZpbml0ZTtcbiAgICAgICAgICAgIGFuaW1hdGlvbjogYmFyLXN3aW5nIDEuNXMgaW5maW5pdGU7IH1cblxuQC13ZWJraXQta2V5ZnJhbWVzIGJhci1zd2luZy1jb250YWluZXIge1xuICAwJSB7XG4gICAgbGVmdDogMDtcbiAgICAtd2Via2l0LXRyYW5zZm9ybTogdHJhbnNsYXRlWCgwKTtcbiAgICAgICAgICAgIHRyYW5zZm9ybTogdHJhbnNsYXRlWCgwKTsgfVxuICA1MCUge1xuICAgIGxlZnQ6IDcwJTtcbiAgICAtd2Via2l0LXRyYW5zZm9ybTogdHJhbnNsYXRlWCgtNHB4KTtcbiAgICAgICAgICAgIHRyYW5zZm9ybTogdHJhbnNsYXRlWCgtNHB4KTsgfVxuICAxMDAlIHtcbiAgICBsZWZ0OiAwO1xuICAgIC13ZWJraXQtdHJhbnNmb3JtOiB0cmFuc2xhdGVYKDApO1xuICAgICAgICAgICAgdHJhbnNmb3JtOiB0cmFuc2xhdGVYKDApOyB9IH1cblxuQGtleWZyYW1lcyBiYXItc3dpbmctY29udGFpbmVyIHtcbiAgMCUge1xuICAgIGxlZnQ6IDA7XG4gICAgLXdlYmtpdC10cmFuc2Zvcm06IHRyYW5zbGF0ZVgoMCk7XG4gICAgICAgICAgICB0cmFuc2Zvcm06IHRyYW5zbGF0ZVgoMCk7IH1cbiAgNTAlIHtcbiAgICBsZWZ0OiA3MCU7XG4gICAgLXdlYmtpdC10cmFuc2Zvcm06IHRyYW5zbGF0ZVgoLTRweCk7XG4gICAgICAgICAgICB0cmFuc2Zvcm06IHRyYW5zbGF0ZVgoLTRweCk7IH1cbiAgMTAwJSB7XG4gICAgbGVmdDogMDtcbiAgICAtd2Via2l0LXRyYW5zZm9ybTogdHJhbnNsYXRlWCgwKTtcbiAgICAgICAgICAgIHRyYW5zZm9ybTogdHJhbnNsYXRlWCgwKTsgfSB9XG5cbi5iYXItc3dpbmctY29udGFpbmVyIHtcbiAgd2lkdGg6IDIwJTtcbiAgaGVpZ2h0OiA4cHg7XG4gIHBvc2l0aW9uOiByZWxhdGl2ZTsgfVxuICAuYmFyLXN3aW5nLWNvbnRhaW5lciBkaXY6bnRoLWNoaWxkKDEpIHtcbiAgICBwb3NpdGlvbjogYWJzb2x1dGU7XG4gICAgd2lkdGg6IDEwMCU7XG4gICAgYmFja2dyb3VuZC1jb2xvcjogcmdiYSgyNTUsIDI1NSwgMjU1LCAwLjIpO1xuICAgIGhlaWdodDogMTJweDtcbiAgICBib3JkZXItcmFkaXVzOiAxMHB4OyB9XG4gIC5iYXItc3dpbmctY29udGFpbmVyIGRpdjpudGgtY2hpbGQoMikge1xuICAgIHBvc2l0aW9uOiBhYnNvbHV0ZTtcbiAgICB3aWR0aDogMzAlO1xuICAgIGhlaWdodDogOHB4O1xuICAgIGJvcmRlci1yYWRpdXM6IDEwcHg7XG4gICAgYmFja2dyb3VuZC1jb2xvcjogI2ZmZjtcbiAgICAtd2Via2l0LWFuaW1hdGlvbjogYmFyLXN3aW5nLWNvbnRhaW5lciAycyBjdWJpYy1iZXppZXIoMC45MSwgMC4zNSwgMC4xMiwgMC42KSBpbmZpbml0ZTtcbiAgICAgICAgICAgIGFuaW1hdGlvbjogYmFyLXN3aW5nLWNvbnRhaW5lciAycyBjdWJpYy1iZXppZXIoMC45MSwgMC4zNSwgMC4xMiwgMC42KSBpbmZpbml0ZTtcbiAgICBtYXJnaW46IDJweCAycHggMDsgfVxuIl19 */\";\nstyleInject(css_248z$p);\n\nvar css_248z$o = \".sk-spinner{color:#333}.sk-spinner>div{background-color:currentColor}\\n/*# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbImJhc2UuY3NzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLFlBQ0UsVUFDRixDQUVBLGdCQUNFLDZCQUNGIiwiZmlsZSI6ImJhc2UuY3NzIiwic291cmNlc0NvbnRlbnQiOlsiLnNrLXNwaW5uZXIge1xuICBjb2xvcjogIzMzMztcbn1cblxuLnNrLXNwaW5uZXIgPiBkaXYge1xuICBiYWNrZ3JvdW5kLWNvbG9yOiBjdXJyZW50Q29sb3I7XG59XG4iXX0= */\";\nstyleInject(css_248z$o);\n\nvar css_248z$n = \".ball-scale-ripple-multiple>div,.ball-scale-ripple>div,.ball-triangle-path>div{background-color:initial;border-color:currentColor}.ball-clip-rotate>div{background-color:initial;border-left-color:currentColor;border-right-color:currentColor;border-top-color:currentColor}.ball-clip-rotate-pulse>div:first-child{background-color:currentColor}.ball-clip-rotate-pulse>div:last-child{background-color:initial;border-bottom-color:currentColor;border-top-color:currentColor}.ball-clip-rotate-multiple>div:first-child{background-color:initial;border-left-color:currentColor;border-right-color:currentColor}.ball-clip-rotate-multiple>div:last-child{border-top-color:currentColor}.ball-clip-rotate-multiple>div:last-child,.pacman>div:first-child,.pacman>div:nth-child(2),.triangle-skew-spin>div{background-color:initial;border-bottom-color:currentColor}.pacman>div:first-child,.pacman>div:nth-child(2){border-left-color:currentColor;border-top-color:currentColor}.pacman>div:nth-child(3),.pacman>div:nth-child(4),.pacman>div:nth-child(5){background-color:currentColor}\\n/*# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbImxvYWRlcnMtY3NzLmNzcyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSwrRUFHRSx3QkFBeUIsQ0FDekIseUJBQ0YsQ0FFQSxzQkFDRSx3QkFBeUIsQ0FHekIsOEJBQStCLENBRC9CLCtCQUFnQyxDQURoQyw2QkFHRixDQUVBLHdDQUNFLDZCQUNGLENBQ0EsdUNBQ0Usd0JBQXlCLENBRXpCLGdDQUFpQyxDQURqQyw2QkFFRixDQUVBLDJDQUNFLHdCQUF5QixDQUV6Qiw4QkFBK0IsQ0FEL0IsK0JBRUYsQ0FDQSwwQ0FFRSw2QkFFRixDQU9BLG1IQVZFLHdCQUF5QixDQUV6QixnQ0FjRixDQU5BLGlEQUlFLDhCQUErQixDQUQvQiw2QkFHRixDQUVBLDJFQUdFLDZCQUNGIiwiZmlsZSI6ImxvYWRlcnMtY3NzLmNzcyIsInNvdXJjZXNDb250ZW50IjpbIi5iYWxsLXRyaWFuZ2xlLXBhdGggPiBkaXYsXG4uYmFsbC1zY2FsZS1yaXBwbGUtbXVsdGlwbGUgPiBkaXYsXG4uYmFsbC1zY2FsZS1yaXBwbGUgPiBkaXYge1xuICBiYWNrZ3JvdW5kLWNvbG9yOiBpbml0aWFsO1xuICBib3JkZXItY29sb3I6IGN1cnJlbnRDb2xvcjtcbn1cblxuLmJhbGwtY2xpcC1yb3RhdGUgPiBkaXYge1xuICBiYWNrZ3JvdW5kLWNvbG9yOiBpbml0aWFsO1xuICBib3JkZXItdG9wLWNvbG9yOiBjdXJyZW50Q29sb3I7XG4gIGJvcmRlci1yaWdodC1jb2xvcjogY3VycmVudENvbG9yO1xuICBib3JkZXItbGVmdC1jb2xvcjogY3VycmVudENvbG9yO1xufVxuXG4uYmFsbC1jbGlwLXJvdGF0ZS1wdWxzZSA+IGRpdjpmaXJzdC1jaGlsZCB7XG4gIGJhY2tncm91bmQtY29sb3I6IGN1cnJlbnRDb2xvcjtcbn1cbi5iYWxsLWNsaXAtcm90YXRlLXB1bHNlID4gZGl2Omxhc3QtY2hpbGQge1xuICBiYWNrZ3JvdW5kLWNvbG9yOiBpbml0aWFsO1xuICBib3JkZXItdG9wLWNvbG9yOiBjdXJyZW50Q29sb3I7XG4gIGJvcmRlci1ib3R0b20tY29sb3I6IGN1cnJlbnRDb2xvcjtcbn1cblxuLmJhbGwtY2xpcC1yb3RhdGUtbXVsdGlwbGUgPiBkaXY6Zmlyc3QtY2hpbGQge1xuICBiYWNrZ3JvdW5kLWNvbG9yOiBpbml0aWFsO1xuICBib3JkZXItcmlnaHQtY29sb3I6IGN1cnJlbnRDb2xvcjtcbiAgYm9yZGVyLWxlZnQtY29sb3I6IGN1cnJlbnRDb2xvcjtcbn1cbi5iYWxsLWNsaXAtcm90YXRlLW11bHRpcGxlID4gZGl2Omxhc3QtY2hpbGQge1xuICBiYWNrZ3JvdW5kLWNvbG9yOiBpbml0aWFsO1xuICBib3JkZXItdG9wLWNvbG9yOiBjdXJyZW50Q29sb3I7XG4gIGJvcmRlci1ib3R0b20tY29sb3I6IGN1cnJlbnRDb2xvcjtcbn1cblxuLnRyaWFuZ2xlLXNrZXctc3BpbiA+IGRpdiB7XG4gIGJhY2tncm91bmQtY29sb3I6IGluaXRpYWw7XG4gIGJvcmRlci1ib3R0b20tY29sb3I6IGN1cnJlbnRDb2xvcjtcbn1cblxuLnBhY21hbiA+IGRpdjpudGgtY2hpbGQoMSksXG4ucGFjbWFuID4gZGl2Om50aC1jaGlsZCgyKSB7XG4gIGJhY2tncm91bmQtY29sb3I6IGluaXRpYWw7XG4gIGJvcmRlci10b3AtY29sb3I6IGN1cnJlbnRDb2xvcjtcbiAgYm9yZGVyLWxlZnQtY29sb3I6IGN1cnJlbnRDb2xvcjtcbiAgYm9yZGVyLWJvdHRvbS1jb2xvcjogY3VycmVudENvbG9yO1xufVxuXG4ucGFjbWFuID4gZGl2Om50aC1jaGlsZCgzKSxcbi5wYWNtYW4gPiBkaXY6bnRoLWNoaWxkKDQpLFxuLnBhY21hbiA+IGRpdjpudGgtY2hpbGQoNSkge1xuICBiYWNrZ3JvdW5kLWNvbG9yOiBjdXJyZW50Q29sb3I7XG59XG4iXX0= */\";\nstyleInject(css_248z$n);\n\nvar css_248z$m = \"@-webkit-keyframes sk-fade-in{0%{opacity:0}50%{opacity:0}to{opacity:1}}@-moz-keyframes sk-fade-in{0%{opacity:0}50%{opacity:0}to{opacity:1}}@-ms-keyframes sk-fade-in{0%{opacity:0}50%{opacity:0}to{opacity:1}}@keyframes sk-fade-in{0%{opacity:0}50%{opacity:0}to{opacity:1}}.sk-fade-in{-webkit-animation:sk-fade-in 2s;-moz-animation:sk-fade-in 2s;-o-animation:sk-fade-in 2s;-ms-animation:sk-fade-in 2s;animation:sk-fade-in 2s}.sk-fade-in-half-second{-webkit-animation:sk-fade-in 1s;-moz-animation:sk-fade-in 1s;-o-animation:sk-fade-in 1s;-ms-animation:sk-fade-in 1s;animation:sk-fade-in 1s}.sk-fade-in-quarter-second{-webkit-animation:sk-fade-in .5s;-moz-animation:sk-fade-in .5s;-o-animation:sk-fade-in .5s;-ms-animation:sk-fade-in .5s;animation:sk-fade-in .5s}\\n/*# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbImZhZGUtaW4uY3NzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLDhCQUNFLEdBQ0ksU0FDSixDQUNBLElBQ0ksU0FDSixDQUNBLEdBQ0ksU0FDSixDQUNGLENBRUEsMkJBQ0UsR0FDSSxTQUNKLENBQ0EsSUFDSSxTQUNKLENBQ0EsR0FDSSxTQUNKLENBQ0YsQ0FFQSwwQkFDRSxHQUNJLFNBQ0osQ0FDQSxJQUNJLFNBQ0osQ0FDQSxHQUNJLFNBQ0osQ0FDRixDQUVBLHNCQUNFLEdBQ0ksU0FDSixDQUNBLElBQ0ksU0FDSixDQUNBLEdBQ0ksU0FDSixDQUNGLENBRUEsWUFDRSwrQkFBZ0MsQ0FDaEMsNEJBQTZCLENBQzdCLDBCQUEyQixDQUMzQiwyQkFBNEIsQ0FDNUIsdUJBQ0YsQ0FFQSx3QkFDRSwrQkFBZ0MsQ0FDaEMsNEJBQTZCLENBQzdCLDBCQUEyQixDQUMzQiwyQkFBNEIsQ0FDNUIsdUJBQ0YsQ0FFQSwyQkFDRSxnQ0FBa0MsQ0FDbEMsNkJBQStCLENBQy9CLDJCQUE2QixDQUM3Qiw0QkFBOEIsQ0FDOUIsd0JBQ0YiLCJmaWxlIjoiZmFkZS1pbi5jc3MiLCJzb3VyY2VzQ29udGVudCI6WyJALXdlYmtpdC1rZXlmcmFtZXMgc2stZmFkZS1pbiB7XG4gIDAlIHtcbiAgICAgIG9wYWNpdHk6IDA7XG4gIH1cbiAgNTAlIHtcbiAgICAgIG9wYWNpdHk6IDA7XG4gIH1cbiAgMTAwJSB7XG4gICAgICBvcGFjaXR5OiAxO1xuICB9XG59XG5cbkAtbW96LWtleWZyYW1lcyBzay1mYWRlLWluIHtcbiAgMCUge1xuICAgICAgb3BhY2l0eTogMDtcbiAgfVxuICA1MCUge1xuICAgICAgb3BhY2l0eTogMDtcbiAgfVxuICAxMDAlIHtcbiAgICAgIG9wYWNpdHk6IDE7XG4gIH1cbn1cblxuQC1tcy1rZXlmcmFtZXMgc2stZmFkZS1pbiB7XG4gIDAlIHtcbiAgICAgIG9wYWNpdHk6IDA7XG4gIH1cbiAgNTAlIHtcbiAgICAgIG9wYWNpdHk6IDA7XG4gIH1cbiAgMTAwJSB7XG4gICAgICBvcGFjaXR5OiAxO1xuICB9XG59XG5cbkBrZXlmcmFtZXMgc2stZmFkZS1pbiB7XG4gIDAlIHtcbiAgICAgIG9wYWNpdHk6IDA7XG4gIH1cbiAgNTAlIHtcbiAgICAgIG9wYWNpdHk6IDA7XG4gIH1cbiAgMTAwJSB7XG4gICAgICBvcGFjaXR5OiAxO1xuICB9XG59XG5cbi5zay1mYWRlLWluIHtcbiAgLXdlYmtpdC1hbmltYXRpb246IHNrLWZhZGUtaW4gMnM7XG4gIC1tb3otYW5pbWF0aW9uOiBzay1mYWRlLWluIDJzO1xuICAtby1hbmltYXRpb246IHNrLWZhZGUtaW4gMnM7XG4gIC1tcy1hbmltYXRpb246IHNrLWZhZGUtaW4gMnM7XG4gIGFuaW1hdGlvbjogc2stZmFkZS1pbiAycztcbn1cblxuLnNrLWZhZGUtaW4taGFsZi1zZWNvbmQge1xuICAtd2Via2l0LWFuaW1hdGlvbjogc2stZmFkZS1pbiAxcztcbiAgLW1vei1hbmltYXRpb246IHNrLWZhZGUtaW4gMXM7XG4gIC1vLWFuaW1hdGlvbjogc2stZmFkZS1pbiAxcztcbiAgLW1zLWFuaW1hdGlvbjogc2stZmFkZS1pbiAxcztcbiAgYW5pbWF0aW9uOiBzay1mYWRlLWluIDFzO1xufVxuXG4uc2stZmFkZS1pbi1xdWFydGVyLXNlY29uZCB7XG4gIC13ZWJraXQtYW5pbWF0aW9uOiBzay1mYWRlLWluIDAuNXM7XG4gIC1tb3otYW5pbWF0aW9uOiBzay1mYWRlLWluIDAuNXM7XG4gIC1vLWFuaW1hdGlvbjogc2stZmFkZS1pbiAwLjVzO1xuICAtbXMtYW5pbWF0aW9uOiBzay1mYWRlLWluIDAuNXM7XG4gIGFuaW1hdGlvbjogc2stZmFkZS1pbiAwLjVzO1xufVxuIl19 */\";\nstyleInject(css_248z$m);\n\nvar css_248z$l = \".sk-chasing-dots{-webkit-animation:sk-rotate 2s linear infinite;animation:sk-rotate 2s linear infinite;height:27px;position:relative;width:27px}.sk-chasing-dots>div{-webkit-animation:sk-bounce 2s ease-in-out infinite;animation:sk-bounce 2s ease-in-out infinite;background-color:currentColor;border-radius:100%;display:inline-block;height:60%;position:absolute;top:0;width:60%}.sk-chasing-dots>div:last-child{-webkit-animation-delay:-1s;animation-delay:-1s;bottom:0;top:auto}@-webkit-keyframes sk-rotate{to{-webkit-transform:rotate(1turn)}}@keyframes sk-rotate{to{transform:rotate(1turn);-webkit-transform:rotate(1turn)}}@-webkit-keyframes sk-bounce{0%,to{-webkit-transform:scale(0)}50%{-webkit-transform:scale(1)}}@keyframes sk-bounce{0%,to{transform:scale(0);-webkit-transform:scale(0)}50%{transform:scale(1);-webkit-transform:scale(1)}}\\n/*# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbImNoYXNpbmctZG90cy5jc3MiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsaUJBS0UsOENBQWlELENBQ2pELHNDQUF5QyxDQUp6QyxXQUFZLENBQ1osaUJBQWtCLENBRmxCLFVBTUYsQ0FFQSxxQkFTRSxtREFBc0QsQ0FDdEQsMkNBQThDLENBSjlDLDZCQUE4QixDQUM5QixrQkFBbUIsQ0FKbkIsb0JBQXFCLENBRHJCLFVBQVcsQ0FFWCxpQkFBa0IsQ0FDbEIsS0FBTSxDQUpOLFNBVUYsQ0FFQSxnQ0FJRSwyQkFBOEIsQ0FDOUIsbUJBQXNCLENBSHRCLFFBQVMsQ0FEVCxRQUtGLENBRUEsNkJBQStCLEdBQU8sK0JBQWtDLENBQUMsQ0FDekUscUJBQ0UsR0FDRSx1QkFBeUIsQ0FDekIsK0JBQ0YsQ0FDRixDQUVBLDZCQUNFLE1BQVcsMEJBQThCLENBQ3pDLElBQU0sMEJBQThCLENBQ3RDLENBRUEscUJBQ0UsTUFDRSxrQkFBcUIsQ0FDckIsMEJBQ0YsQ0FBRSxJQUNBLGtCQUFxQixDQUNyQiwwQkFDRixDQUNGIiwiZmlsZSI6ImNoYXNpbmctZG90cy5jc3MiLCJzb3VyY2VzQ29udGVudCI6WyIuc2stY2hhc2luZy1kb3RzIHtcbiAgd2lkdGg6IDI3cHg7XG4gIGhlaWdodDogMjdweDtcbiAgcG9zaXRpb246IHJlbGF0aXZlO1xuXG4gIC13ZWJraXQtYW5pbWF0aW9uOiBzay1yb3RhdGUgMi4wcyBpbmZpbml0ZSBsaW5lYXI7XG4gIGFuaW1hdGlvbjogc2stcm90YXRlIDIuMHMgaW5maW5pdGUgbGluZWFyO1xufVxuXG4uc2stY2hhc2luZy1kb3RzID4gZGl2IHtcbiAgd2lkdGg6IDYwJTtcbiAgaGVpZ2h0OiA2MCU7XG4gIGRpc3BsYXk6IGlubGluZS1ibG9jaztcbiAgcG9zaXRpb246IGFic29sdXRlO1xuICB0b3A6IDA7XG4gIGJhY2tncm91bmQtY29sb3I6IGN1cnJlbnRDb2xvcjtcbiAgYm9yZGVyLXJhZGl1czogMTAwJTtcblxuICAtd2Via2l0LWFuaW1hdGlvbjogc2stYm91bmNlIDIuMHMgaW5maW5pdGUgZWFzZS1pbi1vdXQ7XG4gIGFuaW1hdGlvbjogc2stYm91bmNlIDIuMHMgaW5maW5pdGUgZWFzZS1pbi1vdXQ7XG59XG5cbi5zay1jaGFzaW5nLWRvdHMgPiBkaXY6bGFzdC1jaGlsZCB7XG4gIHRvcDogYXV0bztcbiAgYm90dG9tOiAwO1xuXG4gIC13ZWJraXQtYW5pbWF0aW9uLWRlbGF5OiAtMS4wcztcbiAgYW5pbWF0aW9uLWRlbGF5OiAtMS4wcztcbn1cblxuQC13ZWJraXQta2V5ZnJhbWVzIHNrLXJvdGF0ZSB7IDEwMCUgeyAtd2Via2l0LXRyYW5zZm9ybTogcm90YXRlKDM2MGRlZykgfX1cbkBrZXlmcmFtZXMgc2stcm90YXRlIHtcbiAgMTAwJSB7XG4gICAgdHJhbnNmb3JtOiByb3RhdGUoMzYwZGVnKTtcbiAgICAtd2Via2l0LXRyYW5zZm9ybTogcm90YXRlKDM2MGRlZyk7XG4gIH1cbn1cblxuQC13ZWJraXQta2V5ZnJhbWVzIHNrLWJvdW5jZSB7XG4gIDAlLCAxMDAlIHsgLXdlYmtpdC10cmFuc2Zvcm06IHNjYWxlKDAuMCkgfVxuICA1MCUgeyAtd2Via2l0LXRyYW5zZm9ybTogc2NhbGUoMS4wKSB9XG59XG5cbkBrZXlmcmFtZXMgc2stYm91bmNlIHtcbiAgMCUsIDEwMCUge1xuICAgIHRyYW5zZm9ybTogc2NhbGUoMC4wKTtcbiAgICAtd2Via2l0LXRyYW5zZm9ybTogc2NhbGUoMC4wKTtcbiAgfSA1MCUge1xuICAgIHRyYW5zZm9ybTogc2NhbGUoMS4wKTtcbiAgICAtd2Via2l0LXRyYW5zZm9ybTogc2NhbGUoMS4wKTtcbiAgfVxufVxuIl19 */\";\nstyleInject(css_248z$l);\n\nvar css_248z$k = \".sk-circle{height:22px;position:relative;width:22px}.sk-circle>div{background-color:initial;height:100%;left:0;position:absolute;top:0;width:100%}.sk-circle>div:before{-webkit-animation:sk-bouncedelay 1.2s ease-in-out infinite;animation:sk-bouncedelay 1.2s ease-in-out infinite;-webkit-animation-fill-mode:both;animation-fill-mode:both;background-color:currentColor;border-radius:100%;content:\\\"\\\";display:block;height:20%;margin:0 auto;width:20%}.sk-circle>div:nth-child(2){-webkit-transform:rotate(30deg);transform:rotate(30deg)}.sk-circle>div:nth-child(3){-webkit-transform:rotate(60deg);transform:rotate(60deg)}.sk-circle>div:nth-child(4){-webkit-transform:rotate(90deg);transform:rotate(90deg)}.sk-circle>div:nth-child(5){-webkit-transform:rotate(120deg);transform:rotate(120deg)}.sk-circle>div:nth-child(6){-webkit-transform:rotate(150deg);transform:rotate(150deg)}.sk-circle>div:nth-child(7){-webkit-transform:rotate(180deg);transform:rotate(180deg)}.sk-circle>div:nth-child(8){-webkit-transform:rotate(210deg);transform:rotate(210deg)}.sk-circle>div:nth-child(9){-webkit-transform:rotate(240deg);transform:rotate(240deg)}.sk-circle>div:nth-child(10){-webkit-transform:rotate(270deg);transform:rotate(270deg)}.sk-circle>div:nth-child(11){-webkit-transform:rotate(300deg);transform:rotate(300deg)}.sk-circle>div:nth-child(12){-webkit-transform:rotate(330deg);transform:rotate(330deg)}.sk-circle>div:nth-child(2):before{-webkit-animation-delay:-1.1s;animation-delay:-1.1s}.sk-circle>div:nth-child(3):before{-webkit-animation-delay:-1s;animation-delay:-1s}.sk-circle>div:nth-child(4):before{-webkit-animation-delay:-.9s;animation-delay:-.9s}.sk-circle>div:nth-child(5):before{-webkit-animation-delay:-.8s;animation-delay:-.8s}.sk-circle>div:nth-child(6):before{-webkit-animation-delay:-.7s;animation-delay:-.7s}.sk-circle>div:nth-child(7):before{-webkit-animation-delay:-.6s;animation-delay:-.6s}.sk-circle>div:nth-child(8):before{-webkit-animation-delay:-.5s;animation-delay:-.5s}.sk-circle>div:nth-child(9):before{-webkit-animation-delay:-.4s;animation-delay:-.4s}.sk-circle>div:nth-child(10):before{-webkit-animation-delay:-.3s;animation-delay:-.3s}.sk-circle>div:nth-child(11):before{-webkit-animation-delay:-.2s;animation-delay:-.2s}.sk-circle>div:nth-child(12):before{-webkit-animation-delay:-.1s;animation-delay:-.1s}@-webkit-keyframes sk-bouncedelay{0%,80%,to{-webkit-transform:scale(0)}40%{-webkit-transform:scale(1)}}@keyframes sk-bouncedelay{0%,80%,to{-webkit-transform:scale(0);transform:scale(0)}40%{-webkit-transform:scale(1);transform:scale(1)}}\\n/*# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbImNpcmNsZS5jc3MiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsV0FFRSxXQUFZLENBQ1osaUJBQWtCLENBRmxCLFVBR0YsQ0FFQSxlQUNFLHdCQUF5QixDQUV6QixXQUFZLENBRVosTUFBTyxDQURQLGlCQUFrQixDQUVsQixLQUFNLENBSk4sVUFLRixDQUVBLHNCQVNFLDBEQUEyRCxDQUMzRCxrREFBbUQsQ0FFbkQsZ0NBQWlDLENBQ2pDLHdCQUF5QixDQVB6Qiw2QkFBOEIsQ0FDOUIsa0JBQW1CLENBTm5CLFVBQVcsQ0FDWCxhQUFjLENBR2QsVUFBVyxDQUZYLGFBQWMsQ0FDZCxTQVVGLENBRUEsNEJBQWlDLCtCQUFnQyxDQUFHLHVCQUEwQixDQUM5Riw0QkFBaUMsK0JBQWdDLENBQUcsdUJBQTBCLENBQzlGLDRCQUFpQywrQkFBZ0MsQ0FBRyx1QkFBMEIsQ0FDOUYsNEJBQWlDLGdDQUFpQyxDQUFFLHdCQUEwQixDQUM5Riw0QkFBaUMsZ0NBQWlDLENBQUUsd0JBQTBCLENBQzlGLDRCQUFpQyxnQ0FBaUMsQ0FBRSx3QkFBMEIsQ0FDOUYsNEJBQWlDLGdDQUFpQyxDQUFFLHdCQUEwQixDQUM5Riw0QkFBaUMsZ0NBQWlDLENBQUUsd0JBQTBCLENBQzlGLDZCQUFpQyxnQ0FBaUMsQ0FBRSx3QkFBMEIsQ0FDOUYsNkJBQWlDLGdDQUFpQyxDQUFFLHdCQUEwQixDQUM5Riw2QkFBaUMsZ0NBQWlDLENBQUUsd0JBQTBCLENBRTlGLG1DQUF5Qyw2QkFBOEIsQ0FBRSxxQkFBdUIsQ0FDaEcsbUNBQXlDLDJCQUE4QixDQUFFLG1CQUF1QixDQUNoRyxtQ0FBeUMsNEJBQThCLENBQUUsb0JBQXVCLENBQ2hHLG1DQUF5Qyw0QkFBOEIsQ0FBRSxvQkFBdUIsQ0FDaEcsbUNBQXlDLDRCQUE4QixDQUFFLG9CQUF1QixDQUNoRyxtQ0FBeUMsNEJBQThCLENBQUUsb0JBQXVCLENBQ2hHLG1DQUF5Qyw0QkFBOEIsQ0FBRSxvQkFBdUIsQ0FDaEcsbUNBQXlDLDRCQUE4QixDQUFFLG9CQUF1QixDQUNoRyxvQ0FBeUMsNEJBQThCLENBQUUsb0JBQXVCLENBQ2hHLG9DQUF5Qyw0QkFBOEIsQ0FBRSxvQkFBdUIsQ0FDaEcsb0NBQXlDLDRCQUE4QixDQUFFLG9CQUF1QixDQUVoRyxrQ0FDRSxVQUFnQiwwQkFBOEIsQ0FDOUMsSUFBTSwwQkFBOEIsQ0FDdEMsQ0FFQSwwQkFDRSxVQUNFLDBCQUE2QixDQUM3QixrQkFDRixDQUFFLElBQ0EsMEJBQTZCLENBQzdCLGtCQUNGLENBQ0YiLCJmaWxlIjoiY2lyY2xlLmNzcyIsInNvdXJjZXNDb250ZW50IjpbIi5zay1jaXJjbGUge1xuICB3aWR0aDogMjJweDtcbiAgaGVpZ2h0OiAyMnB4O1xuICBwb3NpdGlvbjogcmVsYXRpdmU7XG59XG5cbi5zay1jaXJjbGUgPiBkaXYge1xuICBiYWNrZ3JvdW5kLWNvbG9yOiBpbml0aWFsO1xuICB3aWR0aDogMTAwJTtcbiAgaGVpZ2h0OiAxMDAlO1xuICBwb3NpdGlvbjogYWJzb2x1dGU7XG4gIGxlZnQ6IDA7XG4gIHRvcDogMDtcbn1cblxuLnNrLWNpcmNsZSA+IGRpdjo6YmVmb3JlIHtcbiAgY29udGVudDogJyc7XG4gIGRpc3BsYXk6IGJsb2NrO1xuICBtYXJnaW46IDAgYXV0bztcbiAgd2lkdGg6IDIwJTtcbiAgaGVpZ2h0OiAyMCU7XG4gIGJhY2tncm91bmQtY29sb3I6IGN1cnJlbnRDb2xvcjtcbiAgYm9yZGVyLXJhZGl1czogMTAwJTtcblxuICAtd2Via2l0LWFuaW1hdGlvbjogc2stYm91bmNlZGVsYXkgMS4ycyBpbmZpbml0ZSBlYXNlLWluLW91dDtcbiAgYW5pbWF0aW9uOiBzay1ib3VuY2VkZWxheSAxLjJzIGluZmluaXRlIGVhc2UtaW4tb3V0O1xuICAvKiBQcmV2ZW50IGZpcnN0IGZyYW1lIGZyb20gZmxpY2tlcmluZyB3aGVuIGFuaW1hdGlvbiBzdGFydHMgKi9cbiAgLXdlYmtpdC1hbmltYXRpb24tZmlsbC1tb2RlOiBib3RoO1xuICBhbmltYXRpb24tZmlsbC1tb2RlOiBib3RoO1xufVxuXG4uc2stY2lyY2xlID4gZGl2Om50aC1jaGlsZCgyKSAgeyAtd2Via2l0LXRyYW5zZm9ybTogcm90YXRlKDMwZGVnKTsgIHRyYW5zZm9ybTogcm90YXRlKDMwZGVnKSAgfVxuLnNrLWNpcmNsZSA+IGRpdjpudGgtY2hpbGQoMykgIHsgLXdlYmtpdC10cmFuc2Zvcm06IHJvdGF0ZSg2MGRlZyk7ICB0cmFuc2Zvcm06IHJvdGF0ZSg2MGRlZykgIH1cbi5zay1jaXJjbGUgPiBkaXY6bnRoLWNoaWxkKDQpICB7IC13ZWJraXQtdHJhbnNmb3JtOiByb3RhdGUoOTBkZWcpOyAgdHJhbnNmb3JtOiByb3RhdGUoOTBkZWcpICB9XG4uc2stY2lyY2xlID4gZGl2Om50aC1jaGlsZCg1KSAgeyAtd2Via2l0LXRyYW5zZm9ybTogcm90YXRlKDEyMGRlZyk7IHRyYW5zZm9ybTogcm90YXRlKDEyMGRlZykgfVxuLnNrLWNpcmNsZSA+IGRpdjpudGgtY2hpbGQoNikgIHsgLXdlYmtpdC10cmFuc2Zvcm06IHJvdGF0ZSgxNTBkZWcpOyB0cmFuc2Zvcm06IHJvdGF0ZSgxNTBkZWcpIH1cbi5zay1jaXJjbGUgPiBkaXY6bnRoLWNoaWxkKDcpICB7IC13ZWJraXQtdHJhbnNmb3JtOiByb3RhdGUoMTgwZGVnKTsgdHJhbnNmb3JtOiByb3RhdGUoMTgwZGVnKSB9XG4uc2stY2lyY2xlID4gZGl2Om50aC1jaGlsZCg4KSAgeyAtd2Via2l0LXRyYW5zZm9ybTogcm90YXRlKDIxMGRlZyk7IHRyYW5zZm9ybTogcm90YXRlKDIxMGRlZykgfVxuLnNrLWNpcmNsZSA+IGRpdjpudGgtY2hpbGQoOSkgIHsgLXdlYmtpdC10cmFuc2Zvcm06IHJvdGF0ZSgyNDBkZWcpOyB0cmFuc2Zvcm06IHJvdGF0ZSgyNDBkZWcpIH1cbi5zay1jaXJjbGUgPiBkaXY6bnRoLWNoaWxkKDEwKSB7IC13ZWJraXQtdHJhbnNmb3JtOiByb3RhdGUoMjcwZGVnKTsgdHJhbnNmb3JtOiByb3RhdGUoMjcwZGVnKSB9XG4uc2stY2lyY2xlID4gZGl2Om50aC1jaGlsZCgxMSkgeyAtd2Via2l0LXRyYW5zZm9ybTogcm90YXRlKDMwMGRlZyk7IHRyYW5zZm9ybTogcm90YXRlKDMwMGRlZykgfVxuLnNrLWNpcmNsZSA+IGRpdjpudGgtY2hpbGQoMTIpIHsgLXdlYmtpdC10cmFuc2Zvcm06IHJvdGF0ZSgzMzBkZWcpOyB0cmFuc2Zvcm06IHJvdGF0ZSgzMzBkZWcpIH1cblxuLnNrLWNpcmNsZSA+IGRpdjpudGgtY2hpbGQoMik6OmJlZm9yZSAgeyAtd2Via2l0LWFuaW1hdGlvbi1kZWxheTogLTEuMXM7IGFuaW1hdGlvbi1kZWxheTogLTEuMXMgfVxuLnNrLWNpcmNsZSA+IGRpdjpudGgtY2hpbGQoMyk6OmJlZm9yZSAgeyAtd2Via2l0LWFuaW1hdGlvbi1kZWxheTogLTEuMHM7IGFuaW1hdGlvbi1kZWxheTogLTEuMHMgfVxuLnNrLWNpcmNsZSA+IGRpdjpudGgtY2hpbGQoNCk6OmJlZm9yZSAgeyAtd2Via2l0LWFuaW1hdGlvbi1kZWxheTogLTAuOXM7IGFuaW1hdGlvbi1kZWxheTogLTAuOXMgfVxuLnNrLWNpcmNsZSA+IGRpdjpudGgtY2hpbGQoNSk6OmJlZm9yZSAgeyAtd2Via2l0LWFuaW1hdGlvbi1kZWxheTogLTAuOHM7IGFuaW1hdGlvbi1kZWxheTogLTAuOHMgfVxuLnNrLWNpcmNsZSA+IGRpdjpudGgtY2hpbGQoNik6OmJlZm9yZSAgeyAtd2Via2l0LWFuaW1hdGlvbi1kZWxheTogLTAuN3M7IGFuaW1hdGlvbi1kZWxheTogLTAuN3MgfVxuLnNrLWNpcmNsZSA+IGRpdjpudGgtY2hpbGQoNyk6OmJlZm9yZSAgeyAtd2Via2l0LWFuaW1hdGlvbi1kZWxheTogLTAuNnM7IGFuaW1hdGlvbi1kZWxheTogLTAuNnMgfVxuLnNrLWNpcmNsZSA+IGRpdjpudGgtY2hpbGQoOCk6OmJlZm9yZSAgeyAtd2Via2l0LWFuaW1hdGlvbi1kZWxheTogLTAuNXM7IGFuaW1hdGlvbi1kZWxheTogLTAuNXMgfVxuLnNrLWNpcmNsZSA+IGRpdjpudGgtY2hpbGQoOSk6OmJlZm9yZSAgeyAtd2Via2l0LWFuaW1hdGlvbi1kZWxheTogLTAuNHM7IGFuaW1hdGlvbi1kZWxheTogLTAuNHMgfVxuLnNrLWNpcmNsZSA+IGRpdjpudGgtY2hpbGQoMTApOjpiZWZvcmUgeyAtd2Via2l0LWFuaW1hdGlvbi1kZWxheTogLTAuM3M7IGFuaW1hdGlvbi1kZWxheTogLTAuM3MgfVxuLnNrLWNpcmNsZSA+IGRpdjpudGgtY2hpbGQoMTEpOjpiZWZvcmUgeyAtd2Via2l0LWFuaW1hdGlvbi1kZWxheTogLTAuMnM7IGFuaW1hdGlvbi1kZWxheTogLTAuMnMgfVxuLnNrLWNpcmNsZSA+IGRpdjpudGgtY2hpbGQoMTIpOjpiZWZvcmUgeyAtd2Via2l0LWFuaW1hdGlvbi1kZWxheTogLTAuMXM7IGFuaW1hdGlvbi1kZWxheTogLTAuMXMgfVxuXG5ALXdlYmtpdC1rZXlmcmFtZXMgc2stYm91bmNlZGVsYXkge1xuICAwJSwgODAlLCAxMDAlIHsgLXdlYmtpdC10cmFuc2Zvcm06IHNjYWxlKDAuMCkgfVxuICA0MCUgeyAtd2Via2l0LXRyYW5zZm9ybTogc2NhbGUoMS4wKSB9XG59XG5cbkBrZXlmcmFtZXMgc2stYm91bmNlZGVsYXkge1xuICAwJSwgODAlLCAxMDAlIHtcbiAgICAtd2Via2l0LXRyYW5zZm9ybTogc2NhbGUoMC4wKTtcbiAgICB0cmFuc2Zvcm06IHNjYWxlKDAuMCk7XG4gIH0gNDAlIHtcbiAgICAtd2Via2l0LXRyYW5zZm9ybTogc2NhbGUoMS4wKTtcbiAgICB0cmFuc2Zvcm06IHNjYWxlKDEuMCk7XG4gIH1cbn1cbiJdfQ== */\";\nstyleInject(css_248z$k);\n\nvar css_248z$j = \".sk-cube-grid{height:27px;width:27px}.sk-cube-grid>div{-webkit-animation:sk-scaleDelay 1.3s ease-in-out infinite;animation:sk-scaleDelay 1.3s ease-in-out infinite;background-color:currentColor;float:left;height:33%;width:33%}.sk-cube-grid>div:first-child{-webkit-animation-delay:.2s;animation-delay:.2s}.sk-cube-grid>div:nth-child(2){-webkit-animation-delay:.3s;animation-delay:.3s}.sk-cube-grid>div:nth-child(3){-webkit-animation-delay:.4s;animation-delay:.4s}.sk-cube-grid>div:nth-child(4){-webkit-animation-delay:.1s;animation-delay:.1s}.sk-cube-grid>div:nth-child(5){-webkit-animation-delay:.2s;animation-delay:.2s}.sk-cube-grid>div:nth-child(6){-webkit-animation-delay:.3s;animation-delay:.3s}.sk-cube-grid>div:nth-child(7){-webkit-animation-delay:0s;animation-delay:0s}.sk-cube-grid>div:nth-child(8){-webkit-animation-delay:.1s;animation-delay:.1s}.sk-cube-grid>div:nth-child(9){-webkit-animation-delay:.2s;animation-delay:.2s}@-webkit-keyframes sk-scaleDelay{0%,70%,to{-webkit-transform:scaleX(1)}35%{-webkit-transform:scale3D(0,0,1)}}@keyframes sk-scaleDelay{0%,70%,to{-webkit-transform:scaleX(1);transform:scaleX(1)}35%{-webkit-transform:scaleX(1);transform:scale3D(0,0,1)}}\\n/*# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbImN1YmUtZ3JpZC5jc3MiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsY0FFRSxXQUFZLENBRFosVUFFRixDQUVBLGtCQU1FLHlEQUEwRCxDQUMxRCxpREFBa0QsQ0FKbEQsNkJBQThCLENBQzlCLFVBQVcsQ0FGWCxVQUFXLENBRFgsU0FPRixDQVNBLDhCQUFtQywyQkFBNkIsQ0FBRSxtQkFBdUIsQ0FDekYsK0JBQW1DLDJCQUE2QixDQUFFLG1CQUF1QixDQUN6RiwrQkFBbUMsMkJBQTZCLENBQUUsbUJBQXVCLENBQ3pGLCtCQUFtQywyQkFBNkIsQ0FBRSxtQkFBdUIsQ0FDekYsK0JBQW1DLDJCQUE2QixDQUFFLG1CQUF1QixDQUN6RiwrQkFBbUMsMkJBQTZCLENBQUUsbUJBQXVCLENBQ3pGLCtCQUFtQywwQkFBNkIsQ0FBRSxrQkFBdUIsQ0FDekYsK0JBQW1DLDJCQUE2QixDQUFFLG1CQUF1QixDQUN6RiwrQkFBbUMsMkJBQTZCLENBQUUsbUJBQXVCLENBRXpGLGlDQUNFLFVBQWdCLDJCQUF5QyxDQUN6RCxJQUFnQixnQ0FBeUMsQ0FDM0QsQ0FFQSx5QkFDRSxVQUFnQiwyQkFBd0MsQ0FBRSxtQkFBaUMsQ0FDM0YsSUFBZ0IsMkJBQXdDLENBQUUsd0JBQWlDLENBQzdGIiwiZmlsZSI6ImN1YmUtZ3JpZC5jc3MiLCJzb3VyY2VzQ29udGVudCI6WyIuc2stY3ViZS1ncmlkIHtcbiAgd2lkdGg6IDI3cHg7XG4gIGhlaWdodDogMjdweDtcbn1cblxuLnNrLWN1YmUtZ3JpZCA+IGRpdiB7XG4gIHdpZHRoOiAzMyU7XG4gIGhlaWdodDogMzMlO1xuICBiYWNrZ3JvdW5kLWNvbG9yOiBjdXJyZW50Q29sb3I7XG4gIGZsb2F0OiBsZWZ0O1xuXG4gIC13ZWJraXQtYW5pbWF0aW9uOiBzay1zY2FsZURlbGF5IDEuM3MgaW5maW5pdGUgZWFzZS1pbi1vdXQ7XG4gIGFuaW1hdGlvbjogc2stc2NhbGVEZWxheSAxLjNzIGluZmluaXRlIGVhc2UtaW4tb3V0O1xufVxuXG4vKlxuICogU3Bpbm5lciBwb3NpdGlvbnNcbiAqIDEgMiAzXG4gKiA0IDUgNlxuICogNyA4IDlcbiAqL1xuXG4uc2stY3ViZS1ncmlkID4gZGl2Om50aC1jaGlsZCgxKSB7IC13ZWJraXQtYW5pbWF0aW9uLWRlbGF5OiAwLjJzOyBhbmltYXRpb24tZGVsYXk6IDAuMnMgIH1cbi5zay1jdWJlLWdyaWQgPiBkaXY6bnRoLWNoaWxkKDIpIHsgLXdlYmtpdC1hbmltYXRpb24tZGVsYXk6IDAuM3M7IGFuaW1hdGlvbi1kZWxheTogMC4zcyAgfVxuLnNrLWN1YmUtZ3JpZCA+IGRpdjpudGgtY2hpbGQoMykgeyAtd2Via2l0LWFuaW1hdGlvbi1kZWxheTogMC40czsgYW5pbWF0aW9uLWRlbGF5OiAwLjRzICB9XG4uc2stY3ViZS1ncmlkID4gZGl2Om50aC1jaGlsZCg0KSB7IC13ZWJraXQtYW5pbWF0aW9uLWRlbGF5OiAwLjFzOyBhbmltYXRpb24tZGVsYXk6IDAuMXMgIH1cbi5zay1jdWJlLWdyaWQgPiBkaXY6bnRoLWNoaWxkKDUpIHsgLXdlYmtpdC1hbmltYXRpb24tZGVsYXk6IDAuMnM7IGFuaW1hdGlvbi1kZWxheTogMC4ycyAgfVxuLnNrLWN1YmUtZ3JpZCA+IGRpdjpudGgtY2hpbGQoNikgeyAtd2Via2l0LWFuaW1hdGlvbi1kZWxheTogMC4zczsgYW5pbWF0aW9uLWRlbGF5OiAwLjNzICB9XG4uc2stY3ViZS1ncmlkID4gZGl2Om50aC1jaGlsZCg3KSB7IC13ZWJraXQtYW5pbWF0aW9uLWRlbGF5OiAwLjBzOyBhbmltYXRpb24tZGVsYXk6IDAuMHMgIH1cbi5zay1jdWJlLWdyaWQgPiBkaXY6bnRoLWNoaWxkKDgpIHsgLXdlYmtpdC1hbmltYXRpb24tZGVsYXk6IDAuMXM7IGFuaW1hdGlvbi1kZWxheTogMC4xcyAgfVxuLnNrLWN1YmUtZ3JpZCA+IGRpdjpudGgtY2hpbGQoOSkgeyAtd2Via2l0LWFuaW1hdGlvbi1kZWxheTogMC4yczsgYW5pbWF0aW9uLWRlbGF5OiAwLjJzICB9XG5cbkAtd2Via2l0LWtleWZyYW1lcyBzay1zY2FsZURlbGF5IHtcbiAgMCUsIDcwJSwgMTAwJSB7IC13ZWJraXQtdHJhbnNmb3JtOnNjYWxlM0QoMS4wLCAxLjAsIDEuMCkgfVxuICAzNSUgICAgICAgICAgIHsgLXdlYmtpdC10cmFuc2Zvcm06c2NhbGUzRCgwLjAsIDAuMCwgMS4wKSB9XG59XG5cbkBrZXlmcmFtZXMgc2stc2NhbGVEZWxheSB7XG4gIDAlLCA3MCUsIDEwMCUgeyAtd2Via2l0LXRyYW5zZm9ybTpzY2FsZTNEKDEuMCwgMS4wLCAxLjApOyB0cmFuc2Zvcm06c2NhbGUzRCgxLjAsIDEuMCwgMS4wKSB9XG4gIDM1JSAgICAgICAgICAgeyAtd2Via2l0LXRyYW5zZm9ybTpzY2FsZTNEKDEuMCwgMS4wLCAxLjApOyB0cmFuc2Zvcm06c2NhbGUzRCgwLjAsIDAuMCwgMS4wKSB9XG59XG4iXX0= */\";\nstyleInject(css_248z$j);\n\nvar css_248z$i = \".sk-double-bounce{height:27px;position:relative;width:27px}.sk-double-bounce>div{-webkit-animation:sk-bounce 2s ease-in-out infinite;animation:sk-bounce 2s ease-in-out infinite;background-color:currentColor;border-radius:50%;height:100%;left:0;opacity:.6;position:absolute;top:0;width:100%}.sk-double-bounce>div:last-child{-webkit-animation-delay:-1s;animation-delay:-1s}@-webkit-keyframes sk-bounce{0%,to{-webkit-transform:scale(0)}50%{-webkit-transform:scale(1)}}@keyframes sk-bounce{0%,to{transform:scale(0);-webkit-transform:scale(0)}50%{transform:scale(1);-webkit-transform:scale(1)}}\\n/*# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbImRvdWJsZS1ib3VuY2UuY3NzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLGtCQUVFLFdBQVksQ0FDWixpQkFBa0IsQ0FGbEIsVUFHRixDQUVBLHNCQVVFLG1EQUFzRCxDQUN0RCwyQ0FBOEMsQ0FQOUMsNkJBQThCLENBRDlCLGlCQUFrQixDQURsQixXQUFZLENBTVosTUFBTyxDQUhQLFVBQVksQ0FDWixpQkFBa0IsQ0FDbEIsS0FBTSxDQU5OLFVBV0YsQ0FFQSxpQ0FDRSwyQkFBOEIsQ0FDOUIsbUJBQ0YsQ0FFQSw2QkFDRSxNQUFXLDBCQUE4QixDQUN6QyxJQUFNLDBCQUE4QixDQUN0QyxDQUVBLHFCQUNFLE1BQ0Usa0JBQXFCLENBQ3JCLDBCQUNGLENBQUUsSUFDQSxrQkFBcUIsQ0FDckIsMEJBQ0YsQ0FDRiIsImZpbGUiOiJkb3VibGUtYm91bmNlLmNzcyIsInNvdXJjZXNDb250ZW50IjpbIi5zay1kb3VibGUtYm91bmNlIHtcbiAgd2lkdGg6IDI3cHg7XG4gIGhlaWdodDogMjdweDtcbiAgcG9zaXRpb246IHJlbGF0aXZlO1xufVxuXG4uc2stZG91YmxlLWJvdW5jZSA+IGRpdiB7XG4gIHdpZHRoOiAxMDAlO1xuICBoZWlnaHQ6IDEwMCU7XG4gIGJvcmRlci1yYWRpdXM6IDUwJTtcbiAgYmFja2dyb3VuZC1jb2xvcjogY3VycmVudENvbG9yO1xuICBvcGFjaXR5OiAwLjY7XG4gIHBvc2l0aW9uOiBhYnNvbHV0ZTtcbiAgdG9wOiAwO1xuICBsZWZ0OiAwO1xuXG4gIC13ZWJraXQtYW5pbWF0aW9uOiBzay1ib3VuY2UgMi4wcyBpbmZpbml0ZSBlYXNlLWluLW91dDtcbiAgYW5pbWF0aW9uOiBzay1ib3VuY2UgMi4wcyBpbmZpbml0ZSBlYXNlLWluLW91dDtcbn1cblxuLnNrLWRvdWJsZS1ib3VuY2UgPiBkaXY6bGFzdC1jaGlsZCB7XG4gIC13ZWJraXQtYW5pbWF0aW9uLWRlbGF5OiAtMS4wcztcbiAgYW5pbWF0aW9uLWRlbGF5OiAtMS4wcztcbn1cblxuQC13ZWJraXQta2V5ZnJhbWVzIHNrLWJvdW5jZSB7XG4gIDAlLCAxMDAlIHsgLXdlYmtpdC10cmFuc2Zvcm06IHNjYWxlKDAuMCkgfVxuICA1MCUgeyAtd2Via2l0LXRyYW5zZm9ybTogc2NhbGUoMS4wKSB9XG59XG5cbkBrZXlmcmFtZXMgc2stYm91bmNlIHtcbiAgMCUsIDEwMCUge1xuICAgIHRyYW5zZm9ybTogc2NhbGUoMC4wKTtcbiAgICAtd2Via2l0LXRyYW5zZm9ybTogc2NhbGUoMC4wKTtcbiAgfSA1MCUge1xuICAgIHRyYW5zZm9ybTogc2NhbGUoMS4wKTtcbiAgICAtd2Via2l0LXRyYW5zZm9ybTogc2NhbGUoMS4wKTtcbiAgfVxufVxuIl19 */\";\nstyleInject(css_248z$i);\n\nvar css_248z$h = \".sk-folding-cube{height:27px;position:relative;-webkit-transform:rotate(45deg);transform:rotate(45deg);width:27px}.sk-folding-cube>div{background-color:initial;float:left;height:50%;position:relative;-webkit-transform:scale(1.1);-ms-transform:scale(1.1);transform:scale(1.1);width:50%}.sk-folding-cube>div:before{-webkit-animation:sk-foldCubeAngle 2.4s linear infinite both;animation:sk-foldCubeAngle 2.4s linear infinite both;background-color:currentColor;content:\\\"\\\";height:100%;left:0;position:absolute;top:0;-webkit-transform-origin:100% 100%;-ms-transform-origin:100% 100%;transform-origin:100% 100%;width:100%}.sk-folding-cube>div:nth-child(2){-webkit-transform:scale(1.1) rotate(90deg);transform:scale(1.1) rotate(90deg)}.sk-folding-cube>div:nth-child(4){-webkit-transform:scale(1.1) rotate(180deg);transform:scale(1.1) rotate(180deg)}.sk-folding-cube>div:nth-child(3){-webkit-transform:scale(1.1) rotate(270deg);transform:scale(1.1) rotate(270deg)}.sk-folding-cube>div:nth-child(2):before{-webkit-animation-delay:.3s;animation-delay:.3s}.sk-folding-cube>div:nth-child(4):before{-webkit-animation-delay:.6s;animation-delay:.6s}.sk-folding-cube>div:nth-child(3):before{-webkit-animation-delay:.9s;animation-delay:.9s}@-webkit-keyframes sk-foldCubeAngle{0%,10%{opacity:0;-webkit-transform:perspective(140px) rotateX(-180deg);transform:perspective(140px) rotateX(-180deg)}25%,75%{opacity:1;-webkit-transform:perspective(140px) rotateX(0deg);transform:perspective(140px) rotateX(0deg)}90%,to{opacity:0;-webkit-transform:perspective(140px) rotateY(180deg);transform:perspective(140px) rotateY(180deg)}}@keyframes sk-foldCubeAngle{0%,10%{opacity:0;-webkit-transform:perspective(140px) rotateX(-180deg);transform:perspective(140px) rotateX(-180deg)}25%,75%{opacity:1;-webkit-transform:perspective(140px) rotateX(0deg);transform:perspective(140px) rotateX(0deg)}90%,to{opacity:0;-webkit-transform:perspective(140px) rotateY(180deg);transform:perspective(140px) rotateY(180deg)}}\\n/*# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbImZvbGRpbmctY3ViZS5jc3MiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsaUJBRUUsV0FBWSxDQUNaLGlCQUFrQixDQUVsQiwrQkFBaUMsQ0FDekIsdUJBQXlCLENBTGpDLFVBTUYsQ0FFQSxxQkFDRSx3QkFBeUIsQ0FDekIsVUFBVyxDQUVYLFVBQVcsQ0FDWCxpQkFBa0IsQ0FFbEIsNEJBQTZCLENBQ3pCLHdCQUF5QixDQUNyQixvQkFBcUIsQ0FON0IsU0FPRixDQUNBLDRCQVNFLDREQUE2RCxDQUNyRCxvREFBcUQsQ0FIN0QsNkJBQThCLENBTjlCLFVBQVcsQ0FLWCxXQUFZLENBRlosTUFBTyxDQUZQLGlCQUFrQixDQUNsQixLQUFNLENBUU4sa0NBQW1DLENBQy9CLDhCQUErQixDQUMzQiwwQkFBMkIsQ0FSbkMsVUFTRixDQUNBLGtDQUNFLDBDQUE0QyxDQUNwQyxrQ0FDVixDQUNBLGtDQUNFLDJDQUE2QyxDQUNyQyxtQ0FDVixDQUNBLGtDQUNFLDJDQUE2QyxDQUNyQyxtQ0FDVixDQUNBLHlDQUNFLDJCQUE2QixDQUNyQixtQkFDVixDQUNBLHlDQUNFLDJCQUE2QixDQUNyQixtQkFDVixDQUNBLHlDQUNFLDJCQUE2QixDQUNyQixtQkFDVixDQUNBLG9DQUNFLE9BR0UsU0FBVSxDQUZWLHFEQUFzRCxDQUM5Qyw2Q0FFVixDQUFFLFFBR0EsU0FBVSxDQUZWLGtEQUFtRCxDQUMzQywwQ0FFVixDQUFFLE9BR0EsU0FBVSxDQUZWLG9EQUFxRCxDQUM3Qyw0Q0FFVixDQUNGLENBRUEsNEJBQ0UsT0FHRSxTQUFVLENBRlYscURBQXNELENBQzlDLDZDQUVWLENBQUUsUUFHQSxTQUFVLENBRlYsa0RBQW1ELENBQzNDLDBDQUVWLENBQUUsT0FHQSxTQUFVLENBRlYsb0RBQXFELENBQzdDLDRDQUVWLENBQ0YiLCJmaWxlIjoiZm9sZGluZy1jdWJlLmNzcyIsInNvdXJjZXNDb250ZW50IjpbIi5zay1mb2xkaW5nLWN1YmUge1xuICB3aWR0aDogMjdweDtcbiAgaGVpZ2h0OiAyN3B4O1xuICBwb3NpdGlvbjogcmVsYXRpdmU7XG5cbiAgLXdlYmtpdC10cmFuc2Zvcm06IHJvdGF0ZVooNDVkZWcpO1xuICAgICAgICAgIHRyYW5zZm9ybTogcm90YXRlWig0NWRlZyk7XG59XG5cbi5zay1mb2xkaW5nLWN1YmUgPiBkaXYge1xuICBiYWNrZ3JvdW5kLWNvbG9yOiBpbml0aWFsO1xuICBmbG9hdDogbGVmdDtcbiAgd2lkdGg6IDUwJTtcbiAgaGVpZ2h0OiA1MCU7XG4gIHBvc2l0aW9uOiByZWxhdGl2ZTtcblxuICAtd2Via2l0LXRyYW5zZm9ybTogc2NhbGUoMS4xKTtcbiAgICAgIC1tcy10cmFuc2Zvcm06IHNjYWxlKDEuMSk7XG4gICAgICAgICAgdHJhbnNmb3JtOiBzY2FsZSgxLjEpO1xufVxuLnNrLWZvbGRpbmctY3ViZSA+IGRpdjo6YmVmb3JlIHtcbiAgY29udGVudDogJyc7XG4gIHBvc2l0aW9uOiBhYnNvbHV0ZTtcbiAgdG9wOiAwO1xuICBsZWZ0OiAwO1xuICB3aWR0aDogMTAwJTtcbiAgaGVpZ2h0OiAxMDAlO1xuICBiYWNrZ3JvdW5kLWNvbG9yOiBjdXJyZW50Q29sb3I7XG5cbiAgLXdlYmtpdC1hbmltYXRpb246IHNrLWZvbGRDdWJlQW5nbGUgMi40cyBpbmZpbml0ZSBsaW5lYXIgYm90aDtcbiAgICAgICAgICBhbmltYXRpb246IHNrLWZvbGRDdWJlQW5nbGUgMi40cyBpbmZpbml0ZSBsaW5lYXIgYm90aDtcbiAgLXdlYmtpdC10cmFuc2Zvcm0tb3JpZ2luOiAxMDAlIDEwMCU7XG4gICAgICAtbXMtdHJhbnNmb3JtLW9yaWdpbjogMTAwJSAxMDAlO1xuICAgICAgICAgIHRyYW5zZm9ybS1vcmlnaW46IDEwMCUgMTAwJTtcbn1cbi5zay1mb2xkaW5nLWN1YmUgPiBkaXY6bnRoLWNoaWxkKDIpIHtcbiAgLXdlYmtpdC10cmFuc2Zvcm06IHNjYWxlKDEuMSkgcm90YXRlWig5MGRlZyk7XG4gICAgICAgICAgdHJhbnNmb3JtOiBzY2FsZSgxLjEpIHJvdGF0ZVooOTBkZWcpO1xufVxuLnNrLWZvbGRpbmctY3ViZSA+IGRpdjpudGgtY2hpbGQoNCkge1xuICAtd2Via2l0LXRyYW5zZm9ybTogc2NhbGUoMS4xKSByb3RhdGVaKDE4MGRlZyk7XG4gICAgICAgICAgdHJhbnNmb3JtOiBzY2FsZSgxLjEpIHJvdGF0ZVooMTgwZGVnKTtcbn1cbi5zay1mb2xkaW5nLWN1YmUgPiBkaXY6bnRoLWNoaWxkKDMpIHtcbiAgLXdlYmtpdC10cmFuc2Zvcm06IHNjYWxlKDEuMSkgcm90YXRlWigyNzBkZWcpO1xuICAgICAgICAgIHRyYW5zZm9ybTogc2NhbGUoMS4xKSByb3RhdGVaKDI3MGRlZyk7XG59XG4uc2stZm9sZGluZy1jdWJlID4gZGl2Om50aC1jaGlsZCgyKTo6YmVmb3JlIHtcbiAgLXdlYmtpdC1hbmltYXRpb24tZGVsYXk6IDAuM3M7XG4gICAgICAgICAgYW5pbWF0aW9uLWRlbGF5OiAwLjNzO1xufVxuLnNrLWZvbGRpbmctY3ViZSA+IGRpdjpudGgtY2hpbGQoNCk6OmJlZm9yZSB7XG4gIC13ZWJraXQtYW5pbWF0aW9uLWRlbGF5OiAwLjZzO1xuICAgICAgICAgIGFuaW1hdGlvbi1kZWxheTogMC42cztcbn1cbi5zay1mb2xkaW5nLWN1YmUgPiBkaXY6bnRoLWNoaWxkKDMpOjpiZWZvcmUge1xuICAtd2Via2l0LWFuaW1hdGlvbi1kZWxheTogMC45cztcbiAgICAgICAgICBhbmltYXRpb24tZGVsYXk6IDAuOXM7XG59XG5ALXdlYmtpdC1rZXlmcmFtZXMgc2stZm9sZEN1YmVBbmdsZSB7XG4gIDAlLCAxMCUge1xuICAgIC13ZWJraXQtdHJhbnNmb3JtOiBwZXJzcGVjdGl2ZSgxNDBweCkgcm90YXRlWCgtMTgwZGVnKTtcbiAgICAgICAgICAgIHRyYW5zZm9ybTogcGVyc3BlY3RpdmUoMTQwcHgpIHJvdGF0ZVgoLTE4MGRlZyk7XG4gICAgb3BhY2l0eTogMDtcbiAgfSAyNSUsIDc1JSB7XG4gICAgLXdlYmtpdC10cmFuc2Zvcm06IHBlcnNwZWN0aXZlKDE0MHB4KSByb3RhdGVYKDBkZWcpO1xuICAgICAgICAgICAgdHJhbnNmb3JtOiBwZXJzcGVjdGl2ZSgxNDBweCkgcm90YXRlWCgwZGVnKTtcbiAgICBvcGFjaXR5OiAxO1xuICB9IDkwJSwgMTAwJSB7XG4gICAgLXdlYmtpdC10cmFuc2Zvcm06IHBlcnNwZWN0aXZlKDE0MHB4KSByb3RhdGVZKDE4MGRlZyk7XG4gICAgICAgICAgICB0cmFuc2Zvcm06IHBlcnNwZWN0aXZlKDE0MHB4KSByb3RhdGVZKDE4MGRlZyk7XG4gICAgb3BhY2l0eTogMDtcbiAgfVxufVxuXG5Aa2V5ZnJhbWVzIHNrLWZvbGRDdWJlQW5nbGUge1xuICAwJSwgMTAlIHtcbiAgICAtd2Via2l0LXRyYW5zZm9ybTogcGVyc3BlY3RpdmUoMTQwcHgpIHJvdGF0ZVgoLTE4MGRlZyk7XG4gICAgICAgICAgICB0cmFuc2Zvcm06IHBlcnNwZWN0aXZlKDE0MHB4KSByb3RhdGVYKC0xODBkZWcpO1xuICAgIG9wYWNpdHk6IDA7XG4gIH0gMjUlLCA3NSUge1xuICAgIC13ZWJraXQtdHJhbnNmb3JtOiBwZXJzcGVjdGl2ZSgxNDBweCkgcm90YXRlWCgwZGVnKTtcbiAgICAgICAgICAgIHRyYW5zZm9ybTogcGVyc3BlY3RpdmUoMTQwcHgpIHJvdGF0ZVgoMGRlZyk7XG4gICAgb3BhY2l0eTogMTtcbiAgfSA5MCUsIDEwMCUge1xuICAgIC13ZWJraXQtdHJhbnNmb3JtOiBwZXJzcGVjdGl2ZSgxNDBweCkgcm90YXRlWSgxODBkZWcpO1xuICAgICAgICAgICAgdHJhbnNmb3JtOiBwZXJzcGVjdGl2ZSgxNDBweCkgcm90YXRlWSgxODBkZWcpO1xuICAgIG9wYWNpdHk6IDA7XG4gIH1cbn1cbiJdfQ== */\";\nstyleInject(css_248z$h);\n\nvar css_248z$g = \".sk-pulse>div{-webkit-animation:sk-scaleout 1s ease-in-out infinite;animation:sk-scaleout 1s ease-in-out infinite;background-color:currentColor;border-radius:100%;height:27px;width:27px}@-webkit-keyframes sk-scaleout{0%{-webkit-transform:scale(0)}to{opacity:0;-webkit-transform:scale(1)}}@keyframes sk-scaleout{0%{transform:scale(0);-webkit-transform:scale(0)}to{opacity:0;transform:scale(1);-webkit-transform:scale(1)}}\\n/*# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbInB1bHNlLmNzcyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxjQU1FLHFEQUF3RCxDQUN4RCw2Q0FBZ0QsQ0FKaEQsNkJBQThCLENBQzlCLGtCQUFtQixDQUZuQixXQUFZLENBRFosVUFPRixDQUVBLCtCQUNFLEdBQUssMEJBQThCLENBQ25DLEdBRUUsU0FBVSxDQURWLDBCQUVGLENBQ0YsQ0FFQSx1QkFDRSxHQUNFLGtCQUFxQixDQUNyQiwwQkFDRixDQUFFLEdBR0EsU0FBVSxDQUZWLGtCQUFxQixDQUNyQiwwQkFFRixDQUNGIiwiZmlsZSI6InB1bHNlLmNzcyIsInNvdXJjZXNDb250ZW50IjpbIi5zay1wdWxzZSA+IGRpdiB7XG4gIHdpZHRoOiAyN3B4O1xuICBoZWlnaHQ6IDI3cHg7XG4gIGJhY2tncm91bmQtY29sb3I6IGN1cnJlbnRDb2xvcjtcbiAgYm9yZGVyLXJhZGl1czogMTAwJTtcblxuICAtd2Via2l0LWFuaW1hdGlvbjogc2stc2NhbGVvdXQgMS4wcyBpbmZpbml0ZSBlYXNlLWluLW91dDtcbiAgYW5pbWF0aW9uOiBzay1zY2FsZW91dCAxLjBzIGluZmluaXRlIGVhc2UtaW4tb3V0O1xufVxuXG5ALXdlYmtpdC1rZXlmcmFtZXMgc2stc2NhbGVvdXQge1xuICAwJSB7IC13ZWJraXQtdHJhbnNmb3JtOiBzY2FsZSgwLjApIH1cbiAgMTAwJSB7XG4gICAgLXdlYmtpdC10cmFuc2Zvcm06IHNjYWxlKDEuMCk7XG4gICAgb3BhY2l0eTogMDtcbiAgfVxufVxuXG5Aa2V5ZnJhbWVzIHNrLXNjYWxlb3V0IHtcbiAgMCUge1xuICAgIHRyYW5zZm9ybTogc2NhbGUoMC4wKTtcbiAgICAtd2Via2l0LXRyYW5zZm9ybTogc2NhbGUoMC4wKTtcbiAgfSAxMDAlIHtcbiAgICB0cmFuc2Zvcm06IHNjYWxlKDEuMCk7XG4gICAgLXdlYmtpdC10cmFuc2Zvcm06IHNjYWxlKDEuMCk7XG4gICAgb3BhY2l0eTogMDtcbiAgfVxufVxuIl19 */\";\nstyleInject(css_248z$g);\n\nvar css_248z$f = \".sk-rotating-plane>div{-webkit-animation:sk-rotateplane 1.2s ease-in-out infinite;animation:sk-rotateplane 1.2s ease-in-out infinite;background-color:currentColor;height:27px;width:27px}@-webkit-keyframes sk-rotateplane{0%{-webkit-transform:perspective(120px)}50%{-webkit-transform:perspective(120px) rotateY(180deg)}to{-webkit-transform:perspective(120px) rotateY(180deg) rotateX(180deg)}}@keyframes sk-rotateplane{0%{transform:perspective(120px) rotateX(0deg) rotateY(0deg);-webkit-transform:perspective(120px) rotateX(0deg) rotateY(0deg)}50%{transform:perspective(120px) rotateX(-180.1deg) rotateY(0deg);-webkit-transform:perspective(120px) rotateX(-180.1deg) rotateY(0deg)}to{transform:perspective(120px) rotateX(-180deg) rotateY(-179.9deg);-webkit-transform:perspective(120px) rotateX(-180deg) rotateY(-179.9deg)}}\\n/*# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbInJvdGF0aW5nLXBsYW5lLmNzcyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSx1QkFLRSwwREFBMkQsQ0FDM0Qsa0RBQW1ELENBSG5ELDZCQUE4QixDQUQ5QixXQUFZLENBRFosVUFNRixDQUVBLGtDQUNFLEdBQUssb0NBQXNDLENBQzNDLElBQU0sb0RBQXNELENBQzVELEdBQU8sb0VBQXVFLENBQ2hGLENBRUEsMEJBQ0UsR0FDRSx3REFBeUQsQ0FDekQsZ0VBQ0YsQ0FBRSxJQUNBLDZEQUE4RCxDQUM5RCxxRUFDRixDQUFFLEdBQ0EsZ0VBQWlFLENBQ2pFLHdFQUNGLENBQ0YiLCJmaWxlIjoicm90YXRpbmctcGxhbmUuY3NzIiwic291cmNlc0NvbnRlbnQiOlsiLnNrLXJvdGF0aW5nLXBsYW5lID4gZGl2IHtcbiAgd2lkdGg6IDI3cHg7XG4gIGhlaWdodDogMjdweDtcbiAgYmFja2dyb3VuZC1jb2xvcjogY3VycmVudENvbG9yO1xuXG4gIC13ZWJraXQtYW5pbWF0aW9uOiBzay1yb3RhdGVwbGFuZSAxLjJzIGluZmluaXRlIGVhc2UtaW4tb3V0O1xuICBhbmltYXRpb246IHNrLXJvdGF0ZXBsYW5lIDEuMnMgaW5maW5pdGUgZWFzZS1pbi1vdXQ7XG59XG5cbkAtd2Via2l0LWtleWZyYW1lcyBzay1yb3RhdGVwbGFuZSB7XG4gIDAlIHsgLXdlYmtpdC10cmFuc2Zvcm06IHBlcnNwZWN0aXZlKDEyMHB4KSB9XG4gIDUwJSB7IC13ZWJraXQtdHJhbnNmb3JtOiBwZXJzcGVjdGl2ZSgxMjBweCkgcm90YXRlWSgxODBkZWcpIH1cbiAgMTAwJSB7IC13ZWJraXQtdHJhbnNmb3JtOiBwZXJzcGVjdGl2ZSgxMjBweCkgcm90YXRlWSgxODBkZWcpICByb3RhdGVYKDE4MGRlZykgfVxufVxuXG5Aa2V5ZnJhbWVzIHNrLXJvdGF0ZXBsYW5lIHtcbiAgMCUge1xuICAgIHRyYW5zZm9ybTogcGVyc3BlY3RpdmUoMTIwcHgpIHJvdGF0ZVgoMGRlZykgcm90YXRlWSgwZGVnKTtcbiAgICAtd2Via2l0LXRyYW5zZm9ybTogcGVyc3BlY3RpdmUoMTIwcHgpIHJvdGF0ZVgoMGRlZykgcm90YXRlWSgwZGVnKTtcbiAgfSA1MCUge1xuICAgIHRyYW5zZm9ybTogcGVyc3BlY3RpdmUoMTIwcHgpIHJvdGF0ZVgoLTE4MC4xZGVnKSByb3RhdGVZKDBkZWcpO1xuICAgIC13ZWJraXQtdHJhbnNmb3JtOiBwZXJzcGVjdGl2ZSgxMjBweCkgcm90YXRlWCgtMTgwLjFkZWcpIHJvdGF0ZVkoMGRlZyk7XG4gIH0gMTAwJSB7XG4gICAgdHJhbnNmb3JtOiBwZXJzcGVjdGl2ZSgxMjBweCkgcm90YXRlWCgtMTgwZGVnKSByb3RhdGVZKC0xNzkuOWRlZyk7XG4gICAgLXdlYmtpdC10cmFuc2Zvcm06IHBlcnNwZWN0aXZlKDEyMHB4KSByb3RhdGVYKC0xODBkZWcpIHJvdGF0ZVkoLTE3OS45ZGVnKTtcbiAgfVxufVxuIl19 */\";\nstyleInject(css_248z$f);\n\nvar css_248z$e = \".sk-three-bounce{height:18px}.sk-three-bounce>div{-webkit-animation:sk-bouncedelay 1.4s ease-in-out infinite;animation:sk-bouncedelay 1.4s ease-in-out infinite;-webkit-animation-fill-mode:both;animation-fill-mode:both;background-color:currentColor;border-radius:100%;display:inline-block;height:18px;width:18px}.sk-three-bounce>div:first-child{-webkit-animation-delay:-.32s;animation-delay:-.32s}.sk-three-bounce>div:nth-child(2){-webkit-animation-delay:-.16s;animation-delay:-.16s}@-webkit-keyframes sk-bouncedelay{0%,80%,to{-webkit-transform:scale(0)}40%{-webkit-transform:scale(1)}}@keyframes sk-bouncedelay{0%,80%,to{transform:scale(0);-webkit-transform:scale(0)}40%{transform:scale(1);-webkit-transform:scale(1)}}\\n/*# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbInRocmVlLWJvdW5jZS5jc3MiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsaUJBQ0UsV0FDRixDQUVBLHFCQU9FLDBEQUEyRCxDQUMzRCxrREFBbUQsQ0FFbkQsZ0NBQWlDLENBQ2pDLHdCQUF5QixDQVJ6Qiw2QkFBOEIsQ0FDOUIsa0JBQW1CLENBQ25CLG9CQUFxQixDQUhyQixXQUFZLENBRFosVUFXRixDQUVBLGlDQUNFLDZCQUErQixDQUMvQixxQkFDRixDQUVBLGtDQUNFLDZCQUErQixDQUMvQixxQkFDRixDQUVBLGtDQUNFLFVBQWdCLDBCQUE4QixDQUM5QyxJQUFNLDBCQUE4QixDQUN0QyxDQUVBLDBCQUNFLFVBQ0Usa0JBQXFCLENBQ3JCLDBCQUNGLENBQUUsSUFDQSxrQkFBcUIsQ0FDckIsMEJBQ0YsQ0FDRiIsImZpbGUiOiJ0aHJlZS1ib3VuY2UuY3NzIiwic291cmNlc0NvbnRlbnQiOlsiLnNrLXRocmVlLWJvdW5jZSB7XG4gIGhlaWdodDogMThweDtcbn1cblxuLnNrLXRocmVlLWJvdW5jZSA+IGRpdiB7XG4gIHdpZHRoOiAxOHB4O1xuICBoZWlnaHQ6IDE4cHg7XG4gIGJhY2tncm91bmQtY29sb3I6IGN1cnJlbnRDb2xvcjtcbiAgYm9yZGVyLXJhZGl1czogMTAwJTtcbiAgZGlzcGxheTogaW5saW5lLWJsb2NrO1xuXG4gIC13ZWJraXQtYW5pbWF0aW9uOiBzay1ib3VuY2VkZWxheSAxLjRzIGluZmluaXRlIGVhc2UtaW4tb3V0O1xuICBhbmltYXRpb246IHNrLWJvdW5jZWRlbGF5IDEuNHMgaW5maW5pdGUgZWFzZS1pbi1vdXQ7XG4gIC8qIFByZXZlbnQgZmlyc3QgZnJhbWUgZnJvbSBmbGlja2VyaW5nIHdoZW4gYW5pbWF0aW9uIHN0YXJ0cyAqL1xuICAtd2Via2l0LWFuaW1hdGlvbi1maWxsLW1vZGU6IGJvdGg7XG4gIGFuaW1hdGlvbi1maWxsLW1vZGU6IGJvdGg7XG59XG5cbi5zay10aHJlZS1ib3VuY2UgPiBkaXY6Zmlyc3QtY2hpbGQge1xuICAtd2Via2l0LWFuaW1hdGlvbi1kZWxheTogLTAuMzJzO1xuICBhbmltYXRpb24tZGVsYXk6IC0wLjMycztcbn1cblxuLnNrLXRocmVlLWJvdW5jZSA+IGRpdjpudGgtY2hpbGQoMikge1xuICAtd2Via2l0LWFuaW1hdGlvbi1kZWxheTogLTAuMTZzO1xuICBhbmltYXRpb24tZGVsYXk6IC0wLjE2cztcbn1cblxuQC13ZWJraXQta2V5ZnJhbWVzIHNrLWJvdW5jZWRlbGF5IHtcbiAgMCUsIDgwJSwgMTAwJSB7IC13ZWJraXQtdHJhbnNmb3JtOiBzY2FsZSgwLjApIH1cbiAgNDAlIHsgLXdlYmtpdC10cmFuc2Zvcm06IHNjYWxlKDEuMCkgfVxufVxuXG5Aa2V5ZnJhbWVzIHNrLWJvdW5jZWRlbGF5IHtcbiAgMCUsIDgwJSwgMTAwJSB7XG4gICAgdHJhbnNmb3JtOiBzY2FsZSgwLjApO1xuICAgIC13ZWJraXQtdHJhbnNmb3JtOiBzY2FsZSgwLjApO1xuICB9IDQwJSB7XG4gICAgdHJhbnNmb3JtOiBzY2FsZSgxLjApO1xuICAgIC13ZWJraXQtdHJhbnNmb3JtOiBzY2FsZSgxLjApO1xuICB9XG59XG4iXX0= */\";\nstyleInject(css_248z$e);\n\nvar css_248z$d = \".sk-wandering-cubes{height:52px;position:relative;width:52px}.sk-wandering-cubes>div{-webkit-animation:sk-cubemove 1.8s ease-in-out infinite;animation:sk-cubemove 1.8s ease-in-out infinite;background-color:currentColor;height:10px;left:0;position:absolute;top:0;width:10px}.sk-wandering-cubes>div:last-child{-webkit-animation-delay:-.9s;animation-delay:-.9s}@-webkit-keyframes sk-cubemove{25%{-webkit-transform:translateX(42px) rotate(-90deg) scale(.5)}50%{-webkit-transform:translateX(42px) translateY(42px) rotate(-180deg)}75%{-webkit-transform:translateX(0) translateY(42px) rotate(-270deg) scale(.5)}to{-webkit-transform:rotate(-1turn)}}@keyframes sk-cubemove{25%{transform:translateX(42px) rotate(-90deg) scale(.5);-webkit-transform:translateX(42px) rotate(-90deg) scale(.5)}50%{transform:translateX(42px) translateY(42px) rotate(-179deg);-webkit-transform:translateX(42px) translateY(42px) rotate(-179deg)}50.1%{transform:translateX(42px) translateY(42px) rotate(-180deg);-webkit-transform:translateX(42px) translateY(42px) rotate(-180deg)}75%{transform:translateX(0) translateY(42px) rotate(-270deg) scale(.5);-webkit-transform:translateX(0) translateY(42px) rotate(-270deg) scale(.5)}to{transform:rotate(-1turn);-webkit-transform:rotate(-1turn)}}\\n/*# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIndhbmRlcmluZy1jdWJlcy5jc3MiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsb0JBRUUsV0FBWSxDQUNaLGlCQUFrQixDQUZsQixVQUdGLENBRUEsd0JBUUUsdURBQXdELENBQ3hELCtDQUFnRCxDQVJoRCw2QkFBOEIsQ0FFOUIsV0FBWSxDQUdaLE1BQU8sQ0FGUCxpQkFBa0IsQ0FDbEIsS0FBTSxDQUhOLFVBUUYsQ0FFQSxtQ0FDRSw0QkFBOEIsQ0FDOUIsb0JBQ0YsQ0FFQSwrQkFDRSxJQUFNLDJEQUE4RCxDQUNwRSxJQUFNLG1FQUFxRSxDQUMzRSxJQUFNLDBFQUErRSxDQUNyRixHQUFPLGdDQUFtQyxDQUM1QyxDQUVBLHVCQUNFLElBQ0UsbURBQXFELENBQ3JELDJEQUNGLENBQUUsSUFFQSwyREFBNEQsQ0FDNUQsbUVBQ0YsQ0FBRSxNQUNBLDJEQUE0RCxDQUM1RCxtRUFDRixDQUFFLElBQ0Esa0VBQXNFLENBQ3RFLDBFQUNGLENBQUUsR0FDQSx3QkFBMEIsQ0FDMUIsZ0NBQ0YsQ0FDRiIsImZpbGUiOiJ3YW5kZXJpbmctY3ViZXMuY3NzIiwic291cmNlc0NvbnRlbnQiOlsiLnNrLXdhbmRlcmluZy1jdWJlcyB7XG4gIHdpZHRoOiA1MnB4O1xuICBoZWlnaHQ6IDUycHg7XG4gIHBvc2l0aW9uOiByZWxhdGl2ZTtcbn1cblxuLnNrLXdhbmRlcmluZy1jdWJlcyA+IGRpdiB7XG4gIGJhY2tncm91bmQtY29sb3I6IGN1cnJlbnRDb2xvcjtcbiAgd2lkdGg6IDEwcHg7XG4gIGhlaWdodDogMTBweDtcbiAgcG9zaXRpb246IGFic29sdXRlO1xuICB0b3A6IDA7XG4gIGxlZnQ6IDA7XG5cbiAgLXdlYmtpdC1hbmltYXRpb246IHNrLWN1YmVtb3ZlIDEuOHMgaW5maW5pdGUgZWFzZS1pbi1vdXQ7XG4gIGFuaW1hdGlvbjogc2stY3ViZW1vdmUgMS44cyBpbmZpbml0ZSBlYXNlLWluLW91dDtcbn1cblxuLnNrLXdhbmRlcmluZy1jdWJlcyA+IGRpdjpsYXN0LWNoaWxkIHtcbiAgLXdlYmtpdC1hbmltYXRpb24tZGVsYXk6IC0wLjlzO1xuICBhbmltYXRpb24tZGVsYXk6IC0wLjlzO1xufVxuXG5ALXdlYmtpdC1rZXlmcmFtZXMgc2stY3ViZW1vdmUge1xuICAyNSUgeyAtd2Via2l0LXRyYW5zZm9ybTogdHJhbnNsYXRlWCg0MnB4KSByb3RhdGUoLTkwZGVnKSBzY2FsZSgwLjUpIH1cbiAgNTAlIHsgLXdlYmtpdC10cmFuc2Zvcm06IHRyYW5zbGF0ZVgoNDJweCkgdHJhbnNsYXRlWSg0MnB4KSByb3RhdGUoLTE4MGRlZykgfVxuICA3NSUgeyAtd2Via2l0LXRyYW5zZm9ybTogdHJhbnNsYXRlWCgwcHgpIHRyYW5zbGF0ZVkoNDJweCkgcm90YXRlKC0yNzBkZWcpIHNjYWxlKDAuNSkgfVxuICAxMDAlIHsgLXdlYmtpdC10cmFuc2Zvcm06IHJvdGF0ZSgtMzYwZGVnKSB9XG59XG5cbkBrZXlmcmFtZXMgc2stY3ViZW1vdmUge1xuICAyNSUge1xuICAgIHRyYW5zZm9ybTogdHJhbnNsYXRlWCg0MnB4KSByb3RhdGUoLTkwZGVnKSBzY2FsZSgwLjUpO1xuICAgIC13ZWJraXQtdHJhbnNmb3JtOiB0cmFuc2xhdGVYKDQycHgpIHJvdGF0ZSgtOTBkZWcpIHNjYWxlKDAuNSk7XG4gIH0gNTAlIHtcbiAgICAvKiBIYWNrIHRvIG1ha2UgRkYgcm90YXRlIGluIHRoZSByaWdodCBkaXJlY3Rpb24gKi9cbiAgICB0cmFuc2Zvcm06IHRyYW5zbGF0ZVgoNDJweCkgdHJhbnNsYXRlWSg0MnB4KSByb3RhdGUoLTE3OWRlZyk7XG4gICAgLXdlYmtpdC10cmFuc2Zvcm06IHRyYW5zbGF0ZVgoNDJweCkgdHJhbnNsYXRlWSg0MnB4KSByb3RhdGUoLTE3OWRlZyk7XG4gIH0gNTAuMSUge1xuICAgIHRyYW5zZm9ybTogdHJhbnNsYXRlWCg0MnB4KSB0cmFuc2xhdGVZKDQycHgpIHJvdGF0ZSgtMTgwZGVnKTtcbiAgICAtd2Via2l0LXRyYW5zZm9ybTogdHJhbnNsYXRlWCg0MnB4KSB0cmFuc2xhdGVZKDQycHgpIHJvdGF0ZSgtMTgwZGVnKTtcbiAgfSA3NSUge1xuICAgIHRyYW5zZm9ybTogdHJhbnNsYXRlWCgwcHgpIHRyYW5zbGF0ZVkoNDJweCkgcm90YXRlKC0yNzBkZWcpIHNjYWxlKDAuNSk7XG4gICAgLXdlYmtpdC10cmFuc2Zvcm06IHRyYW5zbGF0ZVgoMHB4KSB0cmFuc2xhdGVZKDQycHgpIHJvdGF0ZSgtMjcwZGVnKSBzY2FsZSgwLjUpO1xuICB9IDEwMCUge1xuICAgIHRyYW5zZm9ybTogcm90YXRlKC0zNjBkZWcpO1xuICAgIC13ZWJraXQtdHJhbnNmb3JtOiByb3RhdGUoLTM2MGRlZyk7XG4gIH1cbn1cbiJdfQ== */\";\nstyleInject(css_248z$d);\n\nvar css_248z$c = \".sk-wave{height:27px;width:30px}.sk-wave>div{-webkit-animation:sk-stretchdelay 1.2s ease-in-out infinite;animation:sk-stretchdelay 1.2s ease-in-out infinite;background-color:currentColor;display:inline-block;height:100%;width:6px}.sk-wave>div:nth-child(2){-webkit-animation-delay:-1.1s;animation-delay:-1.1s}.sk-wave>div:nth-child(3){-webkit-animation-delay:-1s;animation-delay:-1s}.sk-wave>div:nth-child(4){-webkit-animation-delay:-.9s;animation-delay:-.9s}.sk-wave>div:nth-child(5){-webkit-animation-delay:-.8s;animation-delay:-.8s}@-webkit-keyframes sk-stretchdelay{0%,40%,to{-webkit-transform:scaleY(.4)}20%{-webkit-transform:scaleY(1)}}@keyframes sk-stretchdelay{0%,40%,to{transform:scaleY(.4);-webkit-transform:scaleY(.4)}20%{transform:scaleY(1);-webkit-transform:scaleY(1)}}\\n/*# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIndhdmUuY3NzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLFNBRUUsV0FBWSxDQURaLFVBRUYsQ0FFQSxhQU1FLDJEQUE0RCxDQUM1RCxtREFBb0QsQ0FOcEQsNkJBQThCLENBRzlCLG9CQUFxQixDQUZyQixXQUFZLENBQ1osU0FLRixDQUVBLDBCQUNFLDZCQUE4QixDQUM5QixxQkFDRixDQUVBLDBCQUNFLDJCQUE4QixDQUM5QixtQkFDRixDQUVBLDBCQUNFLDRCQUE4QixDQUM5QixvQkFDRixDQUVBLDBCQUNFLDRCQUE4QixDQUM5QixvQkFDRixDQUVBLG1DQUNFLFVBQWdCLDRCQUErQixDQUMvQyxJQUFNLDJCQUErQixDQUN2QyxDQUVBLDJCQUNFLFVBQ0Usb0JBQXNCLENBQ3RCLDRCQUNGLENBQUUsSUFDQSxtQkFBc0IsQ0FDdEIsMkJBQ0YsQ0FDRiIsImZpbGUiOiJ3YXZlLmNzcyIsInNvdXJjZXNDb250ZW50IjpbIi5zay13YXZlIHtcbiAgd2lkdGg6IDMwcHg7XG4gIGhlaWdodDogMjdweDtcbn1cblxuLnNrLXdhdmUgPiBkaXYge1xuICBiYWNrZ3JvdW5kLWNvbG9yOiBjdXJyZW50Q29sb3I7XG4gIGhlaWdodDogMTAwJTtcbiAgd2lkdGg6IDZweDtcbiAgZGlzcGxheTogaW5saW5lLWJsb2NrO1xuXG4gIC13ZWJraXQtYW5pbWF0aW9uOiBzay1zdHJldGNoZGVsYXkgMS4ycyBpbmZpbml0ZSBlYXNlLWluLW91dDtcbiAgYW5pbWF0aW9uOiBzay1zdHJldGNoZGVsYXkgMS4ycyBpbmZpbml0ZSBlYXNlLWluLW91dDtcbn1cblxuLnNrLXdhdmUgPiBkaXY6bnRoLWNoaWxkKDIpIHtcbiAgLXdlYmtpdC1hbmltYXRpb24tZGVsYXk6IC0xLjFzO1xuICBhbmltYXRpb24tZGVsYXk6IC0xLjFzO1xufVxuXG4uc2std2F2ZSA+IGRpdjpudGgtY2hpbGQoMykge1xuICAtd2Via2l0LWFuaW1hdGlvbi1kZWxheTogLTEuMHM7XG4gIGFuaW1hdGlvbi1kZWxheTogLTEuMHM7XG59XG5cbi5zay13YXZlID4gZGl2Om50aC1jaGlsZCg0KSB7XG4gIC13ZWJraXQtYW5pbWF0aW9uLWRlbGF5OiAtMC45cztcbiAgYW5pbWF0aW9uLWRlbGF5OiAtMC45cztcbn1cblxuLnNrLXdhdmUgPiBkaXY6bnRoLWNoaWxkKDUpIHtcbiAgLXdlYmtpdC1hbmltYXRpb24tZGVsYXk6IC0wLjhzO1xuICBhbmltYXRpb24tZGVsYXk6IC0wLjhzO1xufVxuXG5ALXdlYmtpdC1rZXlmcmFtZXMgc2stc3RyZXRjaGRlbGF5IHtcbiAgMCUsIDQwJSwgMTAwJSB7IC13ZWJraXQtdHJhbnNmb3JtOiBzY2FsZVkoMC40KSB9XG4gIDIwJSB7IC13ZWJraXQtdHJhbnNmb3JtOiBzY2FsZVkoMS4wKSB9XG59XG5cbkBrZXlmcmFtZXMgc2stc3RyZXRjaGRlbGF5IHtcbiAgMCUsIDQwJSwgMTAwJSB7XG4gICAgdHJhbnNmb3JtOiBzY2FsZVkoMC40KTtcbiAgICAtd2Via2l0LXRyYW5zZm9ybTogc2NhbGVZKDAuNCk7XG4gIH0gMjAlIHtcbiAgICB0cmFuc2Zvcm06IHNjYWxlWSgxLjApO1xuICAgIC13ZWJraXQtdHJhbnNmb3JtOiBzY2FsZVkoMS4wKTtcbiAgfVxufVxuIl19 */\";\nstyleInject(css_248z$c);\n\nvar css_248z$b = \".sk-wordpress>div{-webkit-animation:sk-inner-circle 1s linear infinite;animation:sk-inner-circle 1s linear infinite;background-color:currentColor;border-radius:27px;display:inline-block;height:27px;position:relative;width:27px}.sk-wordpress>div:after{background-color:#fff;border-radius:8px;content:\\\"\\\";display:block;height:8px;left:5px;position:absolute;top:5px;width:8px}@-webkit-keyframes sk-inner-circle{0%{-webkit-transform:rotate(0)}to{-webkit-transform:rotate(1turn)}}@keyframes sk-inner-circle{0%{transform:rotate(0);-webkit-transform:rotate(0)}to{transform:rotate(1turn);-webkit-transform:rotate(1turn)}}\\n/*# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIndvcmRwcmVzcy5jc3MiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsa0JBUUUsb0RBQXFELENBQ3JELDRDQUE2QyxDQU43Qyw2QkFBOEIsQ0FFOUIsa0JBQW1CLENBRG5CLG9CQUFxQixDQUZyQixXQUFZLENBSVosaUJBQWtCLENBTGxCLFVBU0YsQ0FFQSx3QkFHRSxxQkFBc0IsQ0FJdEIsaUJBQWtCLENBTmxCLFVBQVcsQ0FDWCxhQUFjLENBR2QsVUFBVyxDQUlYLFFBQVMsQ0FIVCxpQkFBa0IsQ0FFbEIsT0FBUSxDQUpSLFNBTUYsQ0FFQSxtQ0FDRSxHQUFLLDJCQUE4QixDQUNuQyxHQUFPLCtCQUFtQyxDQUM1QyxDQUVBLDJCQUNFLEdBQUssbUJBQW9CLENBQUUsMkJBQTZCLENBQ3hELEdBQU8sdUJBQXlCLENBQUUsK0JBQWtDLENBQ3RFIiwiZmlsZSI6IndvcmRwcmVzcy5jc3MiLCJzb3VyY2VzQ29udGVudCI6WyIuc2std29yZHByZXNzID4gZGl2IHtcbiAgd2lkdGg6IDI3cHg7XG4gIGhlaWdodDogMjdweDtcbiAgYmFja2dyb3VuZC1jb2xvcjogY3VycmVudENvbG9yO1xuICBkaXNwbGF5OiBpbmxpbmUtYmxvY2s7XG4gIGJvcmRlci1yYWRpdXM6IDI3cHg7XG4gIHBvc2l0aW9uOiByZWxhdGl2ZTtcblxuICAtd2Via2l0LWFuaW1hdGlvbjogc2staW5uZXItY2lyY2xlIDFzIGxpbmVhciBpbmZpbml0ZTtcbiAgYW5pbWF0aW9uOiBzay1pbm5lci1jaXJjbGUgMXMgbGluZWFyIGluZmluaXRlO1xufVxuXG4uc2std29yZHByZXNzID4gZGl2OjphZnRlciB7XG4gIGNvbnRlbnQ6ICcnO1xuICBkaXNwbGF5OiBibG9jaztcbiAgYmFja2dyb3VuZC1jb2xvcjogI2ZmZjtcbiAgd2lkdGg6IDhweDtcbiAgaGVpZ2h0OiA4cHg7XG4gIHBvc2l0aW9uOiBhYnNvbHV0ZTtcbiAgYm9yZGVyLXJhZGl1czogOHB4O1xuICB0b3A6IDVweDtcbiAgbGVmdDogNXB4O1xufVxuXG5ALXdlYmtpdC1rZXlmcmFtZXMgc2staW5uZXItY2lyY2xlIHtcbiAgMCUgeyAtd2Via2l0LXRyYW5zZm9ybTogcm90YXRlKDApOyB9XG4gIDEwMCUgeyAtd2Via2l0LXRyYW5zZm9ybTogcm90YXRlKDM2MGRlZyk7IH1cbn1cblxuQGtleWZyYW1lcyBzay1pbm5lci1jaXJjbGUge1xuICAwJSB7IHRyYW5zZm9ybTogcm90YXRlKDApOyAtd2Via2l0LXRyYW5zZm9ybTpyb3RhdGUoMCk7IH1cbiAgMTAwJSB7IHRyYW5zZm9ybTogcm90YXRlKDM2MGRlZyk7IC13ZWJraXQtdHJhbnNmb3JtOnJvdGF0ZSgzNjBkZWcpOyB9XG59XG4iXX0= */\";\nstyleInject(css_248z$b);\n\nvar _extends$6 = Object.assign || function (target) { for (var i = 1; i < arguments.length; i++) { var source = arguments[i]; for (var key in source) { if (Object.prototype.hasOwnProperty.call(source, key)) { target[key] = source[key]; } } } return target; };\n\nvar _createClass$1 = function () { function defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if (\"value\" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } } return function (Constructor, protoProps, staticProps) { if (protoProps) defineProperties(Constructor.prototype, protoProps); if (staticProps) defineProperties(Constructor, staticProps); return Constructor; }; }();\n\nvar _propTypes$2 = propTypes$2.exports;\n\nvar _propTypes2$2 = _interopRequireDefault$2(_propTypes$2);\n\nvar _react$2 = React__default$1;\n\nvar _react2$2 = _interopRequireDefault$2(_react$2);\n\nvar _classnames = classnames.exports;\n\nvar _classnames2 = _interopRequireDefault$2(_classnames);\n\nvar _objectAssign = objectAssign;\n\nvar _objectAssign2 = _interopRequireDefault$2(_objectAssign);\n\nvar _spinners = spinners;\n\nfunction _interopRequireDefault$2(obj) { return obj && obj.__esModule ? obj : { default: obj }; }\n\nfunction _toConsumableArray(arr) { if (Array.isArray(arr)) { for (var i = 0, arr2 = Array(arr.length); i < arr.length; i++) { arr2[i] = arr[i]; } return arr2; } else { return Array.from(arr); } }\n\nfunction _defineProperty$1(obj, key, value) { if (key in obj) { Object.defineProperty(obj, key, { value: value, enumerable: true, configurable: true, writable: true }); } else { obj[key] = value; } return obj; }\n\nfunction _classCallCheck$1(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError(\"Cannot call a class as a function\"); } }\n\nfunction _possibleConstructorReturn$1(self, call) { if (!self) { throw new ReferenceError(\"this hasn't been initialised - super() hasn't been called\"); } return call && (typeof call === \"object\" || typeof call === \"function\") ? call : self; }\n\nfunction _inherits$1(subClass, superClass) { if (typeof superClass !== \"function\" && superClass !== null) { throw new TypeError(\"Super expression must either be null or a function, not \" + typeof superClass); } subClass.prototype = Object.create(superClass && superClass.prototype, { constructor: { value: subClass, enumerable: false, writable: true, configurable: true } }); if (superClass) Object.setPrototypeOf ? Object.setPrototypeOf(subClass, superClass) : subClass.__proto__ = superClass; } // eslint-disable-line import/no-extraneous-dependencies\n\n\nif (!process.env.REACT_SPINKIT_NO_STYLES) ;\n\nvar noFadeInWarning = \"Deprecation Warning (react-spinkit): noFadeIn prop should be replaced with fadeIn='none'\";\n\nvar Spinner = function (_React$Component) {\n _inherits$1(Spinner, _React$Component);\n\n function Spinner(props) {\n _classCallCheck$1(this, Spinner);\n\n if (props.noFadeIn) {\n console.warn(noFadeInWarning); // eslint-disable-line no-console\n }\n\n var _this = _possibleConstructorReturn$1(this, (Spinner.__proto__ || Object.getPrototypeOf(Spinner)).call(this, props));\n\n _this.displayName = 'SpinKit';\n return _this;\n }\n\n _createClass$1(Spinner, [{\n key: 'render',\n value: function render() {\n var _cx;\n\n var spinnerInfo = _spinners.allSpinners[this.props.name] || _spinners.allSpinners['three-bounce'];\n var classes = (0, _classnames2.default)((_cx = {\n 'sk-fade-in': this.props.fadeIn === 'full' && !this.props.noFadeIn,\n 'sk-fade-in-half-second': this.props.fadeIn === 'half' && !this.props.noFadeIn,\n 'sk-fade-in-quarter-second': this.props.fadeIn === 'quarter' && !this.props.noFadeIn,\n 'sk-spinner': !this.props.overrideSpinnerClassName\n }, _defineProperty$1(_cx, this.props.overrideSpinnerClassName, !!this.props.overrideSpinnerClassName), _defineProperty$1(_cx, this.props.className, !!this.props.className), _defineProperty$1(_cx, spinnerInfo.className || this.props.name, true), _cx));\n\n var props = (0, _objectAssign2.default)({}, this.props);\n delete props.name;\n delete props.fadeIn;\n delete props.noFadeIn;\n delete props.overrideSpinnerClassName;\n delete props.className;\n\n if (this.props.color) {\n props.style = props.style ? _extends$6({}, props.style, { color: this.props.color }) : { color: this.props.color };\n }\n\n return _react2$2.default.createElement(\n 'div',\n _extends$6({}, props, { className: classes }),\n [].concat(_toConsumableArray(Array(spinnerInfo.divCount))).map(function (_, idx) {\n return _react2$2.default.createElement('div', { key: idx });\n })\n );\n }\n }]);\n\n return Spinner;\n}(_react2$2.default.Component);\n\nSpinner.propTypes = {\n name: _propTypes2$2.default.string.isRequired,\n noFadeIn: _propTypes2$2.default.bool,\n fadeIn: _propTypes2$2.default.oneOf(['full', 'half', 'quarter', 'none']),\n overrideSpinnerClassName: _propTypes2$2.default.string,\n className: _propTypes2$2.default.string,\n color: _propTypes2$2.default.string\n};\n\nSpinner.defaultProps = {\n name: 'three-bounce',\n noFadeIn: false,\n fadeIn: 'full',\n overrideSpinnerClassName: ''\n};\n\nvar dist = Spinner;\n\nvar css_248z$a = \"@font-face{font-family:HK Grotesk Pro;src:url(https://cardscan-assets.s3-accelerate.amazonaws.com/fonts/HK/HKGroteskPro-Regular.otf)}html{--cardscan-video-width:0px;--cardscan-video-height:0px;--cardscan-app-height:100vh;--cardscan-app-width:100vw;--cardscan-buffer-size:0;--cardscan-buffer-max-size:1;--cardscan-video-background-height:0;--cardscan-corner-width:62px;--cardscan-corner-height:62px;--cardscan-auto-switch-active-color:#6fcf97;--cardscan-auto-switch-inactive-color:#bdbdbd;--cardscan-progress-bar-color:#6fcf97;--cardscan-widget-background-color:rgba(29,29,29,.9);--cardscan-message-font-size:18px;--cardscan-message-text-color:#fff;--cardscan-message-background-color:rgba(0,0,0,.45)}\\n/*# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbInN0eWxlcy5zY3NzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLFdBQ0UsMEJBQTZCLENBQzdCLDhGQUNGLENBQ0EsS0FDRSwwQkFBMkIsQ0FDM0IsMkJBQTRCLENBQzVCLDJCQUE0QixDQUM1QiwwQkFBMkIsQ0FDM0Isd0JBQXlCLENBQ3pCLDRCQUE2QixDQUM3QixvQ0FBcUMsQ0FDckMsNEJBQTZCLENBQzdCLDZCQUE4QixDQUM5QiwyQ0FBNEMsQ0FDNUMsNkNBQThDLENBQzlDLHFDQUFzQyxDQUN0QyxvREFBeUQsQ0FDekQsaUNBQWtDLENBQ2xDLGtDQUFvQyxDQUNwQyxtREFDRiIsImZpbGUiOiJzdHlsZXMuc2NzcyIsInNvdXJjZXNDb250ZW50IjpbIkBmb250LWZhY2Uge1xuICBmb250LWZhbWlseTogXCJISyBHcm90ZXNrIFByb1wiO1xuICBzcmM6IHVybChodHRwczovL2NhcmRzY2FuLWFzc2V0cy5zMy1hY2NlbGVyYXRlLmFtYXpvbmF3cy5jb20vZm9udHMvSEsvSEtHcm90ZXNrUHJvLVJlZ3VsYXIub3RmKTtcbn1cbmh0bWwge1xuICAtLWNhcmRzY2FuLXZpZGVvLXdpZHRoOiAwcHg7XG4gIC0tY2FyZHNjYW4tdmlkZW8taGVpZ2h0OiAwcHg7XG4gIC0tY2FyZHNjYW4tYXBwLWhlaWdodDogMTAwdmg7XG4gIC0tY2FyZHNjYW4tYXBwLXdpZHRoOiAxMDB2dztcbiAgLS1jYXJkc2Nhbi1idWZmZXItc2l6ZTogMDtcbiAgLS1jYXJkc2Nhbi1idWZmZXItbWF4LXNpemU6IDE7XG4gIC0tY2FyZHNjYW4tdmlkZW8tYmFja2dyb3VuZC1oZWlnaHQ6IDA7XG4gIC0tY2FyZHNjYW4tY29ybmVyLXdpZHRoOiA2MnB4O1xuICAtLWNhcmRzY2FuLWNvcm5lci1oZWlnaHQ6IDYycHg7XG4gIC0tY2FyZHNjYW4tYXV0by1zd2l0Y2gtYWN0aXZlLWNvbG9yOiAjNmZjZjk3O1xuICAtLWNhcmRzY2FuLWF1dG8tc3dpdGNoLWluYWN0aXZlLWNvbG9yOiAjYmRiZGJkO1xuICAtLWNhcmRzY2FuLXByb2dyZXNzLWJhci1jb2xvcjogIzZmY2Y5NztcbiAgLS1jYXJkc2Nhbi13aWRnZXQtYmFja2dyb3VuZC1jb2xvcjogcmdiYSgyOSwgMjksIDI5LCAwLjkpO1xuICAtLWNhcmRzY2FuLW1lc3NhZ2UtZm9udC1zaXplOiAxOHB4O1xuICAtLWNhcmRzY2FuLW1lc3NhZ2UtdGV4dC1jb2xvcjogd2hpdGU7XG4gIC0tY2FyZHNjYW4tbWVzc2FnZS1iYWNrZ3JvdW5kLWNvbG9yOiByZ2JhKDAsIDAsIDAsIDAuNDUpO1xufSJdfQ== */\";\nstyleInject(css_248z$a);\n\nvar defaultMessages = {\r\n manualCaptureTitle: \"Use Button Below to Scan Card\",\r\n frontsideCompletedTitle: \"Front side scan is complete\\nRotate card to scan back\",\r\n autoCaptureTitle: \"Hold Card in Frame\\nIt Will Scan Automatically\",\r\n processingTitle: \"Keep Card Still While Scanning\",\r\n completedTitle: \"Card Scanned Successfully\",\r\n errorTitle: \"Setup Failure - Please Reload the Page\",\r\n retryTitle: \"Scanning Failed - Please Try Again\",\r\n cameraErrorTitle: \"Unable to Setup Camera for Capture\",\r\n};\r\nvar defaultIndicatorOptions = {\r\n name: \"ball-spin-fade-loader\",\r\n fadeIn: \"none\",\r\n color: \"#FFF\",\r\n};\n\n/* eslint-disable @typescript-eslint/no-var-requires */\r\nvar tf = require(\"@tensorflow/tfjs\");\r\nvar loadGraphModel = require(\"@tensorflow/tfjs-converter\").loadGraphModel;\r\nvar CardDetector = /** @class */ (function () {\r\n function CardDetector() {\r\n var _this = this;\r\n //model is fixed to IMG_SIZE x IMG_SIZE\r\n this.IMG_SIZE = 224;\r\n this._debug = false;\r\n this.laplaceFilter = tf\r\n .tensor2d([\r\n [0, 1, 0],\r\n [1, -4, 1],\r\n [0, 1, 0],\r\n ])\r\n .expandDims(-1)\r\n .expandDims(-1);\r\n console.debug(\"CardScan: Detector -- init\");\r\n this._modelState = \"loading\";\r\n this.load_model().then(function (model) {\r\n _this.model = model;\r\n _this._modelState = \"loaded\";\r\n _this.warm_model();\r\n });\r\n //TODO: catch error loading model....\r\n }\r\n Object.defineProperty(CardDetector.prototype, \"debug\", {\r\n set: function (value) {\r\n this._debug = value;\r\n if (value) {\r\n //link to console so that we can output debug messages when in debug mode.\r\n this.console = window.console;\r\n }\r\n },\r\n enumerable: false,\r\n configurable: true\r\n });\r\n Object.defineProperty(CardDetector.prototype, \"modelState\", {\r\n get: function () {\r\n return this._modelState;\r\n },\r\n enumerable: false,\r\n configurable: true\r\n });\r\n CardDetector.prototype.load_model = function () {\r\n return __awaiter(this, void 0, void 0, function () {\r\n var model, t0, t1;\r\n return __generator(this, function (_b) {\r\n switch (_b.label) {\r\n case 0:\r\n t0 = performance.now();\r\n _b.label = 1;\r\n case 1:\r\n _b.trys.push([1, 3, , 5]);\r\n return [4 /*yield*/, loadGraphModel(\"indexeddb://cardscan-class-model\")];\r\n case 2:\r\n model = _b.sent();\r\n console.debug(\"model loading from cache\");\r\n return [3 /*break*/, 5];\r\n case 3:\r\n _b.sent();\r\n return [4 /*yield*/, loadGraphModel(\"https://cardscan-models.s3-accelerate.amazonaws.com/card-detection-ft-class/model-v2-tfjs/model.json\")];\r\n case 4:\r\n model = _b.sent();\r\n console.debug(\"model loading from S3\");\r\n return [3 /*break*/, 5];\r\n case 5:\r\n t1 = performance.now();\r\n console.debug(\"model-load: \".concat(t1 - t0, \" ms\"));\r\n return [2 /*return*/, model];\r\n }\r\n });\r\n });\r\n };\r\n CardDetector.prototype.warm_model = function () {\r\n var _this = this;\r\n if (this.model == null) {\r\n console.error(\"Unable to warm unloaded model\");\r\n return;\r\n }\r\n //TOOD: check https, check IP isn't HOME.\r\n var expression = /((^\\s*((([0-9]|[1-9][0-9]|1[0-9]{2}|2[0-4][0-9]|25[0-5])\\.){3}([0-9]|[1-9][0-9]|1[0-9]{2}|2[0-4][0-9]|25[0-5]))\\s*$)|(^\\s*((([0-9A-Fa-f]{1,4}:){7}([0-9A-Fa-f]{1,4}|:))|(([0-9A-Fa-f]{1,4}:){6}(:[0-9A-Fa-f]{1,4}|((25[0-5]|2[0-4]\\d|1\\d\\d|[1-9]?\\d)(\\.(25[0-5]|2[0-4]\\d|1\\d\\d|[1-9]?\\d)){3})|:))|(([0-9A-Fa-f]{1,4}:){5}(((:[0-9A-Fa-f]{1,4}){1,2})|:((25[0-5]|2[0-4]\\d|1\\d\\d|[1-9]?\\d)(\\.(25[0-5]|2[0-4]\\d|1\\d\\d|[1-9]?\\d)){3})|:))|(([0-9A-Fa-f]{1,4}:){4}(((:[0-9A-Fa-f]{1,4}){1,3})|((:[0-9A-Fa-f]{1,4})?:((25[0-5]|2[0-4]\\d|1\\d\\d|[1-9]?\\d)(\\.(25[0-5]|2[0-4]\\d|1\\d\\d|[1-9]?\\d)){3}))|:))|(([0-9A-Fa-f]{1,4}:){3}(((:[0-9A-Fa-f]{1,4}){1,4})|((:[0-9A-Fa-f]{1,4}){0,2}:((25[0-5]|2[0-4]\\d|1\\d\\d|[1-9]?\\d)(\\.(25[0-5]|2[0-4]\\d|1\\d\\d|[1-9]?\\d)){3}))|:))|(([0-9A-Fa-f]{1,4}:){2}(((:[0-9A-Fa-f]{1,4}){1,5})|((:[0-9A-Fa-f]{1,4}){0,3}:((25[0-5]|2[0-4]\\d|1\\d\\d|[1-9]?\\d)(\\.(25[0-5]|2[0-4]\\d|1\\d\\d|[1-9]?\\d)){3}))|:))|(([0-9A-Fa-f]{1,4}:){1}(((:[0-9A-Fa-f]{1,4}){1,6})|((:[0-9A-Fa-f]{1,4}){0,4}:((25[0-5]|2[0-4]\\d|1\\d\\d|[1-9]?\\d)(\\.(25[0-5]|2[0-4]\\d|1\\d\\d|[1-9]?\\d)){3}))|:))|(:(((:[0-9A-Fa-f]{1,4}){1,7})|((:[0-9A-Fa-f]{1,4}){0,5}:((25[0-5]|2[0-4]\\d|1\\d\\d|[1-9]?\\d)(\\.(25[0-5]|2[0-4]\\d|1\\d\\d|[1-9]?\\d)){3}))|:)))(%.+)?\\s*$))/;\r\n //trying to stop other devs from wasting time.\r\n if (expression.test(window.location.hostname) &&\r\n window.location.hostname != \"127.0.0.1\") {\r\n console.log(\"CardScanView: many browsers do not allow camera access on IP addresses. Please use localhost or a domain.\");\r\n }\r\n if (window.location.protocol != \"https:\" &&\r\n window.location.hostname != \"localhost\" &&\r\n window.location.hostname != \"127.0.0.1\") {\r\n console.log(\"CardScanView: many browsers do not allow camera access on insecure connections. Please use localhost or https\");\r\n }\r\n tf.tidy(function () {\r\n var t0 = performance.now();\r\n var results = _this.model.predict(tf.zeros([_this.IMG_SIZE, _this.IMG_SIZE, 3], \"float32\").expandDims(0));\r\n results.data().then(function () {\r\n _this._modelState = \"warmed\";\r\n //save model on successful warm\r\n _this.model.save(\"indexeddb://cardscan-class-model\");\r\n });\r\n var t1 = performance.now();\r\n console.debug(\"model-warm: \".concat(t1 - t0, \" ms\"));\r\n console.debug(_this.tf_mem_log(tf.memory()));\r\n });\r\n };\r\n CardDetector.prototype.tf_mem_log = function (memory) {\r\n return \"TF Memory Usage - t:\".concat(memory.numTensors, \", gpu:\").concat(memory.numBytesInGPU, \", gpufree:\").concat(memory.numBytesInGPUFree, \" buf:\").concat(memory.numDataBuffers, \", mem:\").concat(memory.numBytes);\r\n };\r\n CardDetector.prototype.prepare_results = function (modelResult, laplaceResult) {\r\n var response = {};\r\n var predictions = tf.sigmoid(modelResult);\r\n var score = predictions.dataSync()[0];\r\n response[\"modelClass\"] = score < 0.5 ? \"card\" : \"notcard\";\r\n response[\"modelScore\"] = score;\r\n response[\"modelProbability\"] = score < 0.5 ? 1 - score : score;\r\n laplaceResult = laplaceResult.squeeze();\r\n laplaceResult = laplaceResult.div(tf.scalar(255)); //need to workaround #2475\r\n response[\"laplaceVariance\"] = tf\r\n .moments(laplaceResult)\r\n .variance.dataSync()[0];\r\n response[\"laplaceMax\"] = laplaceResult.max(1).dataSync()[0];\r\n //cleanup memory\r\n laplaceResult.dispose();\r\n modelResult.dispose();\r\n predictions.dispose();\r\n return response;\r\n };\r\n CardDetector.prototype.predict_image = function (canvas) {\r\n return __awaiter(this, void 0, void 0, function () {\r\n var _this = this;\r\n return __generator(this, function (_a) {\r\n //on slow systems the model might not be loaded yet.\r\n if (this.model === undefined) {\r\n return [2 /*return*/, null];\r\n }\r\n //TODO check canvas matches model image size\r\n //cleans up all tensors on exit\r\n return [2 /*return*/, tf.tidy(function () {\r\n var _a, _b, _c, _d;\r\n var t0 = performance.now();\r\n var data = tf.browser.fromPixels(canvas, 3);\r\n var grey = data.mean(2);\r\n data = tf.cast(data, \"float32\");\r\n //normalize from 0 to 1\r\n data = data.div(tf.scalar(255));\r\n (_a = _this.console) === null || _a === void 0 ? void 0 : _a.debug(\"image-prepare: \".concat(performance.now() - t0, \" ms\"));\r\n t0 = performance.now();\r\n var result = _this.model.predict(data.expandDims(0));\r\n (_b = _this.console) === null || _b === void 0 ? void 0 : _b.debug(\"model-predict: \".concat(performance.now() - t0, \" ms\"));\r\n grey = grey.expandDims(0).expandDims(-1);\r\n t0 = performance.now();\r\n var lapResult = grey.conv2d(_this.laplaceFilter, 1, \"valid\");\r\n (_c = _this.console) === null || _c === void 0 ? void 0 : _c.debug(\"laplacian: \".concat(performance.now() - t0, \" ms\"));\r\n (_d = _this.console) === null || _d === void 0 ? void 0 : _d.debug(_this.tf_mem_log(tf.memory()));\r\n return _this.prepare_results(result, lapResult);\r\n })];\r\n });\r\n });\r\n };\r\n return CardDetector;\r\n}());\r\nvar DetectorWrapper = /** @class */ (function () {\r\n function DetectorWrapper() {\r\n }\r\n DetectorWrapper.get = function () {\r\n //Lazy init -- if not pre-initalized.\r\n if (window.cardDetector === undefined) {\r\n window.cardDetector = new CardDetector();\r\n }\r\n return window.cardDetector;\r\n };\r\n DetectorWrapper.init = function () {\r\n if (window.cardDetector === undefined) {\r\n window.cardDetector = new CardDetector();\r\n }\r\n };\r\n DetectorWrapper.cleanUp = function () {\r\n delete window.cardDetector;\r\n };\r\n return DetectorWrapper;\r\n}());\r\nvar CardScanModel = /** @class */ (function () {\r\n function CardScanModel() {\r\n }\r\n CardScanModel.warm = function () {\r\n console.debug(\"CardScan: Detector -- warm model\");\r\n DetectorWrapper.init();\r\n };\r\n return CardScanModel;\r\n}());\n\n/* eslint-disable @typescript-eslint/no-empty-function */\r\nvar MyGlobalContext = createContext({\r\n debug: true,\r\n modelState: {},\r\n scanDebugState: {},\r\n threshold: {},\r\n setThreshold: {},\r\n laplacianThreshold: {},\r\n setLaplacianThreshold: {},\r\n scanFreqency: {},\r\n setScanFreqency: {},\r\n bufferSize: {},\r\n setBufferSize: {},\r\n bufferRef: {},\r\n debugCanvasBestRef: {},\r\n bestScore: {},\r\n debugCanvasLatestRef: {},\r\n latestScore: {},\r\n latestLaplacian: {},\r\n showCurtain: false,\r\n onCloseBtn: function () { },\r\n closeButton: null,\r\n isMobile: false,\r\n isMobileOnLandscape: false,\r\n stateMachineState: {},\r\n stateMachineSend: function () { },\r\n stateMachineService: {},\r\n});\r\nvar useGlobalContext = function () { return useContext(MyGlobalContext); };\n\nvar css_248z$9 = \".scanDebugMenu{background-color:grey;left:0;position:absolute;top:0;z-index:2000}.scanDebugMenu *{font-size:14px}.scanDebugMenu input{background-color:#d3d3d3;width:60px}.scanDebugMenu button{background-color:#656464;border-radius:6px;color:#fff;margin-left:13px;padding:0 3px}\\n/*# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbImRlYnVnLm1vZHVsZXMuc2NzcyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxlQUNFLHFCQUFzQixDQUd0QixNQUFTLENBRlQsaUJBQWtCLENBQ2xCLEtBQVEsQ0FFUixZQUNGLENBQ0EsaUJBQ0UsY0FDRixDQUNBLHFCQUVFLHdCQUEyQixDQUQzQixVQUVGLENBQ0Esc0JBQ0Usd0JBQXlCLENBR3pCLGlCQUFrQixDQUZsQixVQUFZLENBQ1osZ0JBQWlCLENBRWpCLGFBQ0YiLCJmaWxlIjoiZGVidWcubW9kdWxlcy5zY3NzIiwic291cmNlc0NvbnRlbnQiOlsiLnNjYW5EZWJ1Z01lbnUge1xuICBiYWNrZ3JvdW5kLWNvbG9yOiBncmV5O1xuICBwb3NpdGlvbjogYWJzb2x1dGU7XG4gIHRvcDogMHB4O1xuICBsZWZ0OiAwcHg7XG4gIHotaW5kZXg6IDIwMDA7XG59XG4uc2NhbkRlYnVnTWVudSAqIHtcbiAgZm9udC1zaXplOiAxNHB4O1xufVxuLnNjYW5EZWJ1Z01lbnUgaW5wdXQge1xuICB3aWR0aDogNjBweDtcbiAgYmFja2dyb3VuZC1jb2xvcjogbGlnaHRncmF5O1xufVxuLnNjYW5EZWJ1Z01lbnUgYnV0dG9uIHtcbiAgYmFja2dyb3VuZC1jb2xvcjogIzY1NjQ2NDtcbiAgY29sb3I6IHdoaXRlO1xuICBtYXJnaW4tbGVmdDogMTNweDtcbiAgYm9yZGVyLXJhZGl1czogNnB4O1xuICBwYWRkaW5nOiAwcHggM3B4O1xufSJdfQ== */\";\nstyleInject(css_248z$9);\n\nvar DebugMenu = function () {\r\n var _a = useGlobalContext(), debug = _a.debug, bufferRef = _a.bufferRef, threshold = _a.threshold, setThreshold = _a.setThreshold, modelState = _a.modelState, scanDebugState = _a.scanDebugState, laplacianThreshold = _a.laplacianThreshold, scanFreqency = _a.scanFreqency, debugCanvasBestRef = _a.debugCanvasBestRef, bestScore = _a.bestScore, setBufferSize = _a.setBufferSize, setScanFreqency = _a.setScanFreqency, latestScore = _a.latestScore, latestLaplacian = _a.latestLaplacian, debugCanvasLatestRef = _a.debugCanvasLatestRef, setLaplacianThreshold = _a.setLaplacianThreshold, bufferSize = _a.bufferSize;\r\n var _b = useState(true), showDebugMenu = _b[0], setShowDebugMenu = _b[1];\r\n var loadDebugLibraries = function () { return __awaiter(void 0, void 0, void 0, function () {\r\n return __generator(this, function (_a) {\r\n //Load debug libraries in dynamically at runtine so we don't need them in the package.\r\n return [2 /*return*/, new Promise(function (resolve, reject) {\r\n if (debug == false) {\r\n return reject();\r\n }\r\n // @ts-expect-error: Debug libraries loading dynamically.\r\n if (window.JSZip != undefined || window.saveAs != undefined) {\r\n //already loaded\r\n return resolve();\r\n }\r\n console.log(\"JSZip & FileSaver are required for this feature\");\r\n // @ts-expect-error: FileSaver loading dynamically.\r\n if (window.FileSaver == undefined) {\r\n var script = document.createElement(\"script\");\r\n script.src =\r\n \"https://cdnjs.cloudflare.com/ajax/libs/FileSaver.js/2.0.0/FileSaver.min.js\";\r\n script.id = \"filesaver-dynamic-load\";\r\n document.body.appendChild(script);\r\n }\r\n // @ts-expect-error: JSZip loading dynamically.\r\n if (window.JSZip == undefined) {\r\n var script = document.createElement(\"script\");\r\n script.src =\r\n \"https://cdnjs.cloudflare.com/ajax/libs/jszip/3.7.1/jszip.min.js\";\r\n script.id = \"jszip-dynamic-load\";\r\n document.body.appendChild(script);\r\n script.onload = function () {\r\n // console.log(\"JSZip loaded!\");\r\n return resolve();\r\n };\r\n }\r\n })];\r\n });\r\n }); };\r\n var downloadDebugLog = function (event) {\r\n if (bufferRef.current.length == 0) {\r\n console.log(\"No cards to download\");\r\n return;\r\n }\r\n loadDebugLibraries().then(function () {\r\n // @ts-expect-error: Debug libraries loading dynamically.\r\n var zip = new window.JSZip();\r\n bufferRef.current.forEach(function (element) {\r\n var name = element.file.lastModified + \".jpg\";\r\n zip.file(name, element.file);\r\n });\r\n var files = bufferRef.current.map(function (element) {\r\n element[\"file\"] = element.file.lastModified;\r\n return element;\r\n });\r\n var results = new Blob([JSON.stringify(files, null, 2)], {\r\n type: \"application/json\",\r\n });\r\n zip.file(\"results.json\", results);\r\n var filename = \"download_\" + new Date().getTime() + \".zip\";\r\n zip.generateAsync({ type: \"blob\" }).then(function (content) {\r\n // @ts-expect-error: Debug libraries loading dynamically.\r\n window.saveAs(content, filename);\r\n });\r\n });\r\n };\r\n if (!debug) {\r\n return jsx(\"div\", {});\r\n }\r\n return (jsxs(\"div\", __assign$2({ \"data-cy\": \"scanDebugMenu\", className: css_248z$9.scanDebugMenu }, { children: [jsx(\"button\", __assign$2({ onClick: function (e) {\r\n setShowDebugMenu(!showDebugMenu);\r\n } }, { children: showDebugMenu ? \"Hide\" : \"Show\" })), jsxs(\"div\", __assign$2({ className: \"scan-debug-wrapper\", hidden: !showDebugMenu }, { children: [jsxs(\"div\", __assign$2({ \"data-cy\": \"scanDebugModelstate\", className: \"scan-debug-modelstate\" }, { children: [\"Model: \", modelState] })), jsxs(\"div\", __assign$2({ \"data-cy\": \"scanDebugScanstate\", className: \"scan-debug-scanstate\" }, { children: [\"Scanning: \", scanDebugState] })), jsxs(\"div\", __assign$2({ className: \"scan-debug-threshold\" }, { children: [\"Model Threshold:\", \" \", jsx(\"input\", { type: \"number\", value: threshold, onChange: function (event) {\r\n setThreshold(Number(event.target.value));\r\n } })] })), jsxs(\"div\", __assign$2({ className: \"scan-debug-threshold\" }, { children: [\"Laplacian Threshold:\", \" \", jsx(\"input\", { type: \"number\", value: laplacianThreshold, onChange: function (event) {\r\n setLaplacianThreshold(Number(event.target.value));\r\n } })] })), jsxs(\"div\", __assign$2({ className: \"scan-debug-frequency\" }, { children: [\"Scan Frequency:\", \" \", jsx(\"input\", { type: \"number\", value: scanFreqency, onChange: function (event) {\r\n setScanFreqency(Number(event.target.value));\r\n } })] })), jsxs(\"div\", __assign$2({ className: \"scan-debug-results\" }, { children: [\"Buffer: \", bufferRef.current.length, \" /\", \" \", jsx(\"input\", { type: \"number\", width: \"35px\", value: bufferSize, onChange: function (event) {\r\n setBufferSize(Number(event.target.value));\r\n } }), jsx(\"button\", __assign$2({ onClick: function (event) {\r\n bufferRef.current = [];\r\n } }, { children: \"Clear\" }))] })), jsxs(\"div\", __assign$2({ className: \"scan-debug-best-score\" }, { children: [\"Best Score: \", (Math.round(bestScore * 1000) / 1000).toFixed(3)] })), jsx(\"canvas\", { ref: debugCanvasBestRef, width: \"200\", height: \"125\" }), jsxs(\"div\", __assign$2({ className: \"scan-debug-latest-score\" }, { children: [\"Latest Score: \", (Math.round(latestScore * 1000) / 1000).toFixed(3), \" \", jsx(\"br\", {}), \"Laplacian: \", (Math.round(latestLaplacian * 1000) / 1000).toFixed(3)] })), jsx(\"canvas\", { ref: debugCanvasLatestRef, width: \"200\", height: \"125\" }), jsx(\"div\", __assign$2({ className: \"scan-debug-get-debug\" }, { children: jsx(\"button\", __assign$2({ onClick: downloadDebugLog }, { children: \"Download Buffer\" })) }))] }))] })));\r\n};\n\nvar img$7 = \"data:image/png;base64,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04qTwtkwDKMLMO2008qiiy7aagDPC2XWsU0mInU44efgAq+5zywTQ9K7vTmTRdBqbrYJ5CxMmjRJ3nzzLZl33r4y00wzVd1u1PvvS6+ePWWeeeaRetGIY/7222/yzjvvykILLdihEWrDmBwcddRRVdfx/Ho3uCwEcWLT6HeYD50rclASkC0N7TJZFDP6RadTL5gh869//Ut23HFHWWyxxWS99daT448/Xn744QeZWuBaNt10E/nvf/9bc7v999tPzjnnHKknjTjm//73P72e559/QQyjOXGz8vxPb0Hw1oMMIrIdKZykWFAY/6/DkL116623ln/84x/y008/yd577y39+/eX6667TjbccEMZPXq0GIZhdD7c7LxqTg6NmKnn52Tnw4Tjc3wyHeeGG26QN954Q/baay859thj4+UbbbSR7LLLLiqYjznmmIrnlOa8s+zXqOOmPU4j9qk3neEcDKMzEJlwi8HokyaKwGcPSUmm4EJhYnaeZpxW52epC48++qjMOeecreaRr7322jJkyJCCnfKdeNlLL70kW2yxhcw///yyzDLLyP777y/fffddvH7zzTeXs88+W/bdd1/dZrXVVpNhw4bJww8/LGuuuaYu23jjjTWQSJKLL75YBq2/vq6nzGeeeSZe99lnn+lxrrnmGt2XbUjL8uuvv8o///lPWWWVVXQZ+w8dOlTaYuzYsdr4+PMjwlQye205uOLQILHt4osvLrvttlvBTPB8yTZcD9eMuYd64fuYMWOqHvOmm27S4913//0lZXAt7H/AAQfodSe59dZb4+unnkeOHCmG0dQweBc4Ueq9LEri/DTKD1mKaZuikcRMZdXklVdekQEDBkj37t1brTvttNNUQ4ZvvvlGttpqK20Qzj33XBVqjz32mPz1r3+Nt//oo4/kggsukFlmmUXOP/98mWGGGWT33XdXYc/naaedrsL0kEMOifdBgOPuslZBYGNnRTgilN98801dz+AVwomR2BVWWEEF6Gyzzab7XXHFFbLddtvp+czWp48cfPDB8tZbb9W8Xq6ppaVF96HRueSSS6qG/cOcs+uuu8rdd9+t53TyySfLt99+qz0Hf36cG+so929/+5vsV7AXv/jii9pwMZBYDvXJdnvuuadsuskmus0ee+yhZfB52GGHyWuvvabH/PHHH3WfBx98UAdFZp11Vq0j6oFrNYym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1ELANmzLPu0BLfiaa66RM844Q1MrEWeYtESkUBozZky8HclIV1llFbVdJ7Vn8tvtvPPOmu6J9EukIaIrDz6n3W677aaaPLniCDBP40FaJI518cUXa3nk1PNp7hFmfl8gwwjbek0bM4FP90TWEJ8duhL0HshTx7YHHnig/PrrrxW3oxEiRZO/hq+//jped9/998frKI9zL4dzJk8gqaLSXieQR5B0UKSVOvjgg+WAAw6Q22+/veI5kjOQe8BxMFd5k8irr76q58cxuFaSxYIv+7zzztNzJ9MKYxHUHduSEurbb79tdXzqntRSHhLLnnrqqbqOZK7cezJucx780buq1JuqtR11Qzowzovykj2N5P3lul588cWSezFo/fX1eDxzPBv+Wrk3XBfHSyaB5dicO8ejfjuivBhtEThzReCyKXm/CicvG6Mh8//QmSv8TJR8MZdUB+GlIW+a14xff/31VtuQMNRrymzLPu3h448/1s9VV121ZDl548455xz9jsC++uqrVZM+99xzVVM/++yzdR2pjYYPH6755cjAzAuOxg7sA7zECDlGXElhz+xGXky+c94cnySlNDTAS+YHMIHt2Za0T6QwQsBz3QSrJ9PGnnvuWfX6yFfHS3jllVdqxhEESzkjRoxUYU0uvptuukmFNimi4I033pC/FPYnl911112nQvDQQw8t2Z+GYsiQIbLtttvKBhtskPo6SdtEg0q+vqFDh8p0002n2axJoFoOdcs1IOC4L2Te5trgyCOP1GSsNCpLL720CirwZY8aNUqTvs4+++x6jQMHDpS7775b65heESC0+H7qqafJscceq0KcxhbIeM2xTzrpJK1rhB37Y44699zz9DtJZMuptR3n+MEHH+h1kVeROqGOeJ64v2QS5/7SsJEfkftOklnuxQ6FuubaR44cGedepDGBJ598Us16Rx11lN4remccm2eX8ke9/77ceOONYjSKvB/Kc+aJ0GWhjmzIDckYEgY+iIYUp+jVcWIIyTq9hpjUDsrhAUUwkVWZjMXtLQtqpU7ixUIIoX0B2hkvGYIAZp11Vjn88MP1Oy8TLy74YPLzzz+/CoOk1unhZeEa+vbtqy9gLW0XRowYoQKC/Uh5RFlogQiXZNJTDwIPYQpHFzS0f/7jH3LyySeXbDNs2KPqsbLXXnvpb15uGig0XUw3JDH1vRU03WRd0wCR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QPYRLIKiE3S9JoagBVxzzTWaGp6XBZZZZhn55z//Kf/5z3/099dffy1HHnmkPPvsszLTTDPJfvvtJ7vssouu22KLLWTVVVeVu+66S8aPHy+nn366bnf77bfLbLPNJueff74+0HDf/ffLhRdeKF99+aWss846ui0v9j/+8Q/Ndv3yK6/odo88/LDuz76YUDg++/Xp00c++eQTeeyxx2S33XaTyQ0CeP7554t/1zMD9+DBg2X99dfX72eeeaZe8xprrKG/yQx94IEHSqNJE86VOphvvnnliy++kKeeekouvOACOeSQQ1Q4l3PTTTfJiBEj5IADDpBFFllEtbxLLrlE7rzzTtl2222lMzNhwgQVwF4hoW5mn312+etf/yq//fabvPTSS3LPPffIUksvXbVB8lS7d98UhP1///vfNgXy5Lj3XZVkDj2NipnPx9Exfdq7tGSIZRFlDMmHk1w8ZIRykClwRjV8VwgBkASByR9cUHjpfvzxR7nlllvklYLQxJyxQUEz4gHlxXzwwQf1RUPL3nfffVW43H77HXLuuefIGWecIbfeequ89dZb8pfCi3nyySfLoosuKscdd5wK/ZNOOkk1BV5SNPUVVlhBvvrqKzniiCPk1FNP1W1POOEE1dJOO+001RbOOussfaHR4Ccn008/ncwwwwwly77//nu58sortaGgcUGorrfeerqOrilCiTqiIdthhx30euC5556T+wsN1E8//SRLLLGENjD+2GiPaGDJsm677Tbp1q2bbLnlllpPiy22mDz//PMyceJEPS71+/LLL2ud7LXXXrLQQgtVLYfjdKQOfNZqruW8886Te++9V4VyEjRizm/XXXeNrxmhjXbM8rbqrh7XSN0jWD/88EPdjoYfjZRtf/nlF5l77rlV66yUgZuyuAfzzDNPvIxyaYT5GzhwoD6L3xWeXbjqqqukb9++MmjQIP1NnfDOcN4oF/7eebjmiy+6SL8j5Nlu+eWXr1jnyf25JpQo9kdRWnbZZWW77bab7O+CByXr4YceqriO3tOmm2wijcT3ToIo02nhd4sb0IsCC+WC9D2xzNHetJAgCjWkgTPqYEPGpgW10sLzciAw+/XrJ1tttZUuGzVqVLyeriymjj333FN/o03Tld9mm23i4z9c0HrR+BCkPES8wLwYHo6788476wuFoOeB4yFdaqmlZK211tJuL2BK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\";\n\nvar FirefoxVideo = \"https://cardscan-assets.s3-accelerate.amazonaws.com/permissions-videos/firefox.mp4\";\r\nvar SafariVideo = \"https://cardscan-assets.s3-accelerate.amazonaws.com/permissions-videos/safari.mp4\";\r\nvar ChromeVideo = \"https://cardscan-assets.s3-accelerate.amazonaws.com/permissions-videos/chrome.mp4\";\r\nvar CardScanLogoURL = \"https://cardscan-assets.s3-accelerate.amazonaws.com/images/cardscan-logo.png\";\r\nvar getBrowserHelperImage = function (browserName) {\r\n if (browserName === void 0) { browserName = \"Chrome\"; }\r\n return ({\r\n Firefox: FirefoxVideo,\r\n Chrome: ChromeVideo,\r\n Safari: SafariVideo,\r\n Edge: img$7,\r\n }[browserName]);\r\n};\r\nfunction dataURLtoFile(dataurl, filename) {\r\n var arr = dataurl.split(\",\"), mime = arr[0].match(/:(.*?);/)[1], bstr = window.atob(arr[1]);\r\n var n = bstr.length;\r\n var u8arr = new Uint8Array(n);\r\n while (n--) {\r\n u8arr[n] = bstr.charCodeAt(n);\r\n }\r\n return new File([u8arr], filename, { type: mime });\r\n}\r\nvar calculateGuides = function (videoRefBg, frameDivRef, debug) {\r\n var _a, _b, _c, _d, _e, _f;\r\n var scaleX = (((_a = videoRefBg.current) === null || _a === void 0 ? void 0 : _a.videoWidth) || 0) /\r\n (((_b = videoRefBg.current) === null || _b === void 0 ? void 0 : _b.clientWidth) || 1);\r\n var scaleY = (((_c = videoRefBg.current) === null || _c === void 0 ? void 0 : _c.videoHeight) || 0) /\r\n (((_d = videoRefBg.current) === null || _d === void 0 ? void 0 : _d.clientHeight) || 1);\r\n var frameDivDimensions = (_e = frameDivRef.current) === null || _e === void 0 ? void 0 : _e.getBoundingClientRect();\r\n var videoElementDimensions = (_f = videoRefBg.current) === null || _f === void 0 ? void 0 : _f.getBoundingClientRect();\r\n var offsetX = ((frameDivDimensions === null || frameDivDimensions === void 0 ? void 0 : frameDivDimensions.x) || 0) - ((videoElementDimensions === null || videoElementDimensions === void 0 ? void 0 : videoElementDimensions.x) || 0);\r\n var offsetY = ((frameDivDimensions === null || frameDivDimensions === void 0 ? void 0 : frameDivDimensions.y) || 0) - ((videoElementDimensions === null || videoElementDimensions === void 0 ? void 0 : videoElementDimensions.y) || 0);\r\n var guideX = Math.max(Math.round(offsetX * scaleX), 0);\r\n var guideY = Math.max(Math.round(offsetY * scaleY), 0);\r\n var guideWidth = Math.round(frameDivDimensions.width * scaleX);\r\n var guideHeight = Math.round(frameDivDimensions.height * scaleY);\r\n if (debug) {\r\n console.debug(\"Guide: \".concat(guideX, \", \").concat(guideY, \", \").concat(guideWidth, \", \").concat(guideHeight));\r\n }\r\n return [guideX, guideY, guideWidth, guideHeight];\r\n};\r\nvar getHeaderTitle = function (status, messageState, isAuto) {\r\n return ({\r\n cameraLoading: messageState.autoCaptureTitle,\r\n autoCapture: messageState.autoCaptureTitle,\r\n manualCapture: messageState.manualCaptureTitle,\r\n frontsideProcessing: messageState.processingTitle,\r\n backsidePending: messageState.frontsideCompletedTitle,\r\n frontsideCompleted: messageState.frontsideCompletedTitle,\r\n backsideProcessing: messageState.processingTitle,\r\n completed: messageState.completedTitle,\r\n pending: isAuto\r\n ? messageState.autoCaptureTitle\r\n : messageState.manualCaptureTitle,\r\n error: messageState.errorTitle,\r\n cameraError: messageState.cameraErrorTitle,\r\n retry: messageState.retryTitle,\r\n }[status]);\r\n};\n\nvar lib$1 = {};\n\nvar uaParser_min = {exports: {}};\n\n/* UAParser.js v1.0.33\n Copyright © 2012-2021 Faisal Salman \n MIT License */\n\n(function (module, exports) {\n(function(window,undefined$1){var LIBVERSION=\"0.7.33\",EMPTY=\"\",UNKNOWN=\"?\",FUNC_TYPE=\"function\",UNDEF_TYPE=\"undefined\",OBJ_TYPE=\"object\",STR_TYPE=\"string\",MAJOR=\"major\",MODEL=\"model\",NAME=\"name\",TYPE=\"type\",VENDOR=\"vendor\",VERSION=\"version\",ARCHITECTURE=\"architecture\",CONSOLE=\"console\",MOBILE=\"mobile\",TABLET=\"tablet\",SMARTTV=\"smarttv\",WEARABLE=\"wearable\",EMBEDDED=\"embedded\",UA_MAX_LENGTH=350;var AMAZON=\"Amazon\",APPLE=\"Apple\",ASUS=\"ASUS\",BLACKBERRY=\"BlackBerry\",BROWSER=\"Browser\",CHROME=\"Chrome\",EDGE=\"Edge\",FIREFOX=\"Firefox\",GOOGLE=\"Google\",HUAWEI=\"Huawei\",LG=\"LG\",MICROSOFT=\"Microsoft\",MOTOROLA=\"Motorola\",OPERA=\"Opera\",SAMSUNG=\"Samsung\",SHARP=\"Sharp\",SONY=\"Sony\",XIAOMI=\"Xiaomi\",ZEBRA=\"Zebra\",FACEBOOK=\"Facebook\";var extend=function(regexes,extensions){var mergedRegexes={};for(var i in regexes){if(extensions[i]&&extensions[i].length%2===0){mergedRegexes[i]=extensions[i].concat(regexes[i]);}else {mergedRegexes[i]=regexes[i];}}return mergedRegexes},enumerize=function(arr){var enums={};for(var i=0;i0){if(q.length===2){if(typeof q[1]==FUNC_TYPE){this[q[0]]=q[1].call(this,match);}else {this[q[0]]=q[1];}}else if(q.length===3){if(typeof q[1]===FUNC_TYPE&&!(q[1].exec&&q[1].test)){this[q[0]]=match?q[1].call(this,match,q[2]):undefined$1;}else {this[q[0]]=match?match.replace(q[1],q[2]):undefined$1;}}else if(q.length===4){this[q[0]]=match?q[3].call(this,match.replace(q[1],q[2])):undefined$1;}}else {this[q]=match?match:undefined$1;}}}}i+=2;}},strMapper=function(str,map){for(var i in map){if(typeof map[i]===OBJ_TYPE&&map[i].length>0){for(var j=0;jUA_MAX_LENGTH?trim(ua,UA_MAX_LENGTH):ua;return this};this.setUA(_ua);return this};UAParser.VERSION=LIBVERSION;UAParser.BROWSER=enumerize([NAME,VERSION,MAJOR]);UAParser.CPU=enumerize([ARCHITECTURE]);UAParser.DEVICE=enumerize([MODEL,VENDOR,TYPE,CONSOLE,MOBILE,SMARTTV,TABLET,WEARABLE,EMBEDDED]);UAParser.ENGINE=UAParser.OS=enumerize([NAME,VERSION]);{if(module.exports){exports=module.exports=UAParser;}exports.UAParser=UAParser;}var $=typeof window!==UNDEF_TYPE&&(window.jQuery||window.Zepto);if($&&!$.ua){var parser=new UAParser;$.ua=parser.getResult();$.ua.get=function(){return parser.getUA()};$.ua.set=function(ua){parser.setUA(ua);var result=parser.getResult();for(var prop in result){$.ua[prop]=result[prop];}};}})(typeof window===\"object\"?window:commonjsGlobal);\n}(uaParser_min, uaParser_min.exports));\n\nObject.defineProperty(lib$1, '__esModule', { value: true });\n\nfunction _interopDefault (ex) { return (ex && (typeof ex === 'object') && 'default' in ex) ? ex['default'] : ex; }\n\nvar React = React__default$1;\nvar React__default = _interopDefault(React);\n\nvar UAParser = uaParser_min.exports;\n\nvar ClientUAInstance = new UAParser();\nvar browser = ClientUAInstance.getBrowser();\nvar cpu = ClientUAInstance.getCPU();\nvar device = ClientUAInstance.getDevice();\nvar engine = ClientUAInstance.getEngine();\nvar os = ClientUAInstance.getOS();\nvar ua = ClientUAInstance.getUA();\nvar setUa = function setUa(userAgentString) {\n return ClientUAInstance.setUA(userAgentString);\n};\nvar parseUserAgent = function parseUserAgent(userAgent) {\n if (!userAgent) {\n console.error('No userAgent string was provided');\n return;\n }\n\n var UserAgentInstance = new UAParser(userAgent);\n return {\n UA: UserAgentInstance,\n browser: UserAgentInstance.getBrowser(),\n cpu: UserAgentInstance.getCPU(),\n device: UserAgentInstance.getDevice(),\n engine: UserAgentInstance.getEngine(),\n os: UserAgentInstance.getOS(),\n ua: UserAgentInstance.getUA(),\n setUserAgent: function setUserAgent(userAgentString) {\n return UserAgentInstance.setUA(userAgentString);\n }\n };\n};\n\nvar UAHelper = /*#__PURE__*/Object.freeze({\n ClientUAInstance: ClientUAInstance,\n browser: browser,\n cpu: cpu,\n device: device,\n engine: engine,\n os: os,\n ua: ua,\n setUa: setUa,\n parseUserAgent: parseUserAgent\n});\n\nfunction ownKeys(object, enumerableOnly) {\n var keys = Object.keys(object);\n\n if (Object.getOwnPropertySymbols) {\n var symbols = Object.getOwnPropertySymbols(object);\n\n if (enumerableOnly) {\n symbols = symbols.filter(function (sym) {\n return Object.getOwnPropertyDescriptor(object, sym).enumerable;\n });\n }\n\n keys.push.apply(keys, symbols);\n }\n\n return keys;\n}\n\nfunction _objectSpread2(target) {\n for (var i = 1; i < arguments.length; i++) {\n var source = arguments[i] != null ? arguments[i] : {};\n\n if (i % 2) {\n ownKeys(Object(source), true).forEach(function (key) {\n _defineProperty(target, key, source[key]);\n });\n } else if (Object.getOwnPropertyDescriptors) {\n Object.defineProperties(target, Object.getOwnPropertyDescriptors(source));\n } else {\n ownKeys(Object(source)).forEach(function (key) {\n Object.defineProperty(target, key, Object.getOwnPropertyDescriptor(source, key));\n });\n }\n }\n\n return target;\n}\n\nfunction _typeof(obj) {\n \"@babel/helpers - typeof\";\n\n if (typeof Symbol === \"function\" && typeof Symbol.iterator === \"symbol\") {\n _typeof = function (obj) {\n return typeof obj;\n };\n } else {\n _typeof = function (obj) {\n return obj && typeof Symbol === \"function\" && obj.constructor === Symbol && obj !== Symbol.prototype ? \"symbol\" : typeof obj;\n };\n }\n\n return _typeof(obj);\n}\n\nfunction _classCallCheck(instance, Constructor) {\n if (!(instance instanceof Constructor)) {\n throw new TypeError(\"Cannot call a class as a function\");\n }\n}\n\nfunction _defineProperties(target, props) {\n for (var i = 0; i < props.length; i++) {\n var descriptor = props[i];\n descriptor.enumerable = descriptor.enumerable || false;\n descriptor.configurable = true;\n if (\"value\" in descriptor) descriptor.writable = true;\n Object.defineProperty(target, descriptor.key, descriptor);\n }\n}\n\nfunction _createClass(Constructor, protoProps, staticProps) {\n if (protoProps) _defineProperties(Constructor.prototype, protoProps);\n if (staticProps) _defineProperties(Constructor, staticProps);\n return Constructor;\n}\n\nfunction _defineProperty(obj, key, value) {\n if (key in obj) {\n Object.defineProperty(obj, key, {\n value: value,\n enumerable: true,\n configurable: true,\n writable: true\n });\n } else {\n obj[key] = value;\n }\n\n return obj;\n}\n\nfunction _extends$5() {\n _extends$5 = Object.assign || function (target) {\n for (var i = 1; i < arguments.length; i++) {\n var source = arguments[i];\n\n for (var key in source) {\n if (Object.prototype.hasOwnProperty.call(source, key)) {\n target[key] = source[key];\n }\n }\n }\n\n return target;\n };\n\n return _extends$5.apply(this, arguments);\n}\n\nfunction _inherits(subClass, superClass) {\n if (typeof superClass !== \"function\" && superClass !== null) {\n throw new TypeError(\"Super expression must either be null or a function\");\n }\n\n subClass.prototype = Object.create(superClass && superClass.prototype, {\n constructor: {\n value: subClass,\n writable: true,\n configurable: true\n }\n });\n if (superClass) _setPrototypeOf(subClass, superClass);\n}\n\nfunction _getPrototypeOf(o) {\n _getPrototypeOf = Object.setPrototypeOf ? Object.getPrototypeOf : function _getPrototypeOf(o) {\n return o.__proto__ || Object.getPrototypeOf(o);\n };\n return _getPrototypeOf(o);\n}\n\nfunction _setPrototypeOf(o, p) {\n _setPrototypeOf = Object.setPrototypeOf || function _setPrototypeOf(o, p) {\n o.__proto__ = p;\n return o;\n };\n\n return _setPrototypeOf(o, p);\n}\n\nfunction _objectWithoutPropertiesLoose$2(source, excluded) {\n if (source == null) return {};\n var target = {};\n var sourceKeys = Object.keys(source);\n var key, i;\n\n for (i = 0; i < sourceKeys.length; i++) {\n key = sourceKeys[i];\n if (excluded.indexOf(key) >= 0) continue;\n target[key] = source[key];\n }\n\n return target;\n}\n\nfunction _objectWithoutProperties$2(source, excluded) {\n if (source == null) return {};\n\n var target = _objectWithoutPropertiesLoose$2(source, excluded);\n\n var key, i;\n\n if (Object.getOwnPropertySymbols) {\n var sourceSymbolKeys = Object.getOwnPropertySymbols(source);\n\n for (i = 0; i < sourceSymbolKeys.length; i++) {\n key = sourceSymbolKeys[i];\n if (excluded.indexOf(key) >= 0) continue;\n if (!Object.prototype.propertyIsEnumerable.call(source, key)) continue;\n target[key] = source[key];\n }\n }\n\n return target;\n}\n\nfunction _assertThisInitialized(self) {\n if (self === void 0) {\n throw new ReferenceError(\"this hasn't been initialised - super() hasn't been called\");\n }\n\n return self;\n}\n\nfunction _possibleConstructorReturn(self, call) {\n if (call && (typeof call === \"object\" || typeof call === \"function\")) {\n return call;\n } else if (call !== void 0) {\n throw new TypeError(\"Derived constructors may only return object or undefined\");\n }\n\n return _assertThisInitialized(self);\n}\n\nfunction _slicedToArray(arr, i) {\n return _arrayWithHoles(arr) || _iterableToArrayLimit(arr, i) || _unsupportedIterableToArray(arr, i) || _nonIterableRest();\n}\n\nfunction _arrayWithHoles(arr) {\n if (Array.isArray(arr)) return arr;\n}\n\nfunction _iterableToArrayLimit(arr, i) {\n var _i = arr == null ? null : typeof Symbol !== \"undefined\" && arr[Symbol.iterator] || arr[\"@@iterator\"];\n\n if (_i == null) return;\n var _arr = [];\n var _n = true;\n var _d = false;\n\n var _s, _e;\n\n try {\n for (_i = _i.call(arr); !(_n = (_s = _i.next()).done); _n = true) {\n _arr.push(_s.value);\n\n if (i && _arr.length === i) break;\n }\n } catch (err) {\n _d = true;\n _e = err;\n } finally {\n try {\n if (!_n && _i[\"return\"] != null) _i[\"return\"]();\n } finally {\n if (_d) throw _e;\n }\n }\n\n return _arr;\n}\n\nfunction _unsupportedIterableToArray(o, minLen) {\n if (!o) return;\n if (typeof o === \"string\") return _arrayLikeToArray(o, minLen);\n var n = Object.prototype.toString.call(o).slice(8, -1);\n if (n === \"Object\" && o.constructor) n = o.constructor.name;\n if (n === \"Map\" || n === \"Set\") return Array.from(o);\n if (n === \"Arguments\" || /^(?:Ui|I)nt(?:8|16|32)(?:Clamped)?Array$/.test(n)) return _arrayLikeToArray(o, minLen);\n}\n\nfunction _arrayLikeToArray(arr, len) {\n if (len == null || len > arr.length) len = arr.length;\n\n for (var i = 0, arr2 = new Array(len); i < len; i++) arr2[i] = arr[i];\n\n return arr2;\n}\n\nfunction _nonIterableRest() {\n throw new TypeError(\"Invalid attempt to destructure non-iterable instance.\\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method.\");\n}\n\nvar DeviceTypes = {\n Mobile: 'mobile',\n Tablet: 'tablet',\n SmartTv: 'smarttv',\n Console: 'console',\n Wearable: 'wearable',\n Embedded: 'embedded',\n Browser: undefined\n};\nvar BrowserTypes = {\n Chrome: 'Chrome',\n Firefox: 'Firefox',\n Opera: 'Opera',\n Yandex: 'Yandex',\n Safari: 'Safari',\n InternetExplorer: 'Internet Explorer',\n Edge: 'Edge',\n Chromium: 'Chromium',\n Ie: 'IE',\n MobileSafari: 'Mobile Safari',\n EdgeChromium: 'Edge Chromium',\n MIUI: 'MIUI Browser',\n SamsungBrowser: 'Samsung Browser'\n};\nvar OsTypes = {\n IOS: 'iOS',\n Android: 'Android',\n WindowsPhone: 'Windows Phone',\n Windows: 'Windows',\n MAC_OS: 'Mac OS'\n};\nvar InitialDeviceTypes = {\n isMobile: false,\n isTablet: false,\n isBrowser: false,\n isSmartTV: false,\n isConsole: false,\n isWearable: false\n};\n\nvar checkDeviceType = function checkDeviceType(type) {\n switch (type) {\n case DeviceTypes.Mobile:\n return {\n isMobile: true\n };\n\n case DeviceTypes.Tablet:\n return {\n isTablet: true\n };\n\n case DeviceTypes.SmartTv:\n return {\n isSmartTV: true\n };\n\n case DeviceTypes.Console:\n return {\n isConsole: true\n };\n\n case DeviceTypes.Wearable:\n return {\n isWearable: true\n };\n\n case DeviceTypes.Browser:\n return {\n isBrowser: true\n };\n\n case DeviceTypes.Embedded:\n return {\n isEmbedded: true\n };\n\n default:\n return InitialDeviceTypes;\n }\n};\nvar setUserAgent = function setUserAgent(userAgent) {\n return setUa(userAgent);\n};\nvar setDefaults = function setDefaults(p) {\n var d = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : 'none';\n return p ? p : d;\n};\nvar getNavigatorInstance = function getNavigatorInstance() {\n if (typeof window !== 'undefined') {\n if (window.navigator || navigator) {\n return window.navigator || navigator;\n }\n }\n\n return false;\n};\nvar isIOS13Check = function isIOS13Check(type) {\n var nav = getNavigatorInstance();\n return nav && nav.platform && (nav.platform.indexOf(type) !== -1 || nav.platform === 'MacIntel' && nav.maxTouchPoints > 1 && !window.MSStream);\n};\n\nvar browserPayload = function browserPayload(isBrowser, browser, engine, os, ua) {\n return {\n isBrowser: isBrowser,\n browserMajorVersion: setDefaults(browser.major),\n browserFullVersion: setDefaults(browser.version),\n browserName: setDefaults(browser.name),\n engineName: setDefaults(engine.name),\n engineVersion: setDefaults(engine.version),\n osName: setDefaults(os.name),\n osVersion: setDefaults(os.version),\n userAgent: setDefaults(ua)\n };\n};\nvar mobilePayload = function mobilePayload(type, device, os, ua) {\n return _objectSpread2({}, type, {\n vendor: setDefaults(device.vendor),\n model: setDefaults(device.model),\n os: setDefaults(os.name),\n osVersion: setDefaults(os.version),\n ua: setDefaults(ua)\n });\n};\nvar smartTvPayload = function smartTvPayload(isSmartTV, engine, os, ua) {\n return {\n isSmartTV: isSmartTV,\n engineName: setDefaults(engine.name),\n engineVersion: setDefaults(engine.version),\n osName: setDefaults(os.name),\n osVersion: setDefaults(os.version),\n userAgent: setDefaults(ua)\n };\n};\nvar consolePayload = function consolePayload(isConsole, engine, os, ua) {\n return {\n isConsole: isConsole,\n engineName: setDefaults(engine.name),\n engineVersion: setDefaults(engine.version),\n osName: setDefaults(os.name),\n osVersion: setDefaults(os.version),\n userAgent: setDefaults(ua)\n };\n};\nvar wearablePayload = function wearablePayload(isWearable, engine, os, ua) {\n return {\n isWearable: isWearable,\n engineName: setDefaults(engine.name),\n engineVersion: setDefaults(engine.version),\n osName: setDefaults(os.name),\n osVersion: setDefaults(os.version),\n userAgent: setDefaults(ua)\n };\n};\nvar embeddedPayload = function embeddedPayload(isEmbedded, device, engine, os, ua) {\n return {\n isEmbedded: isEmbedded,\n vendor: setDefaults(device.vendor),\n model: setDefaults(device.model),\n engineName: setDefaults(engine.name),\n engineVersion: setDefaults(engine.version),\n osName: setDefaults(os.name),\n osVersion: setDefaults(os.version),\n userAgent: setDefaults(ua)\n };\n};\n\nfunction deviceDetect(userAgent) {\n var _ref = userAgent ? parseUserAgent(userAgent) : UAHelper,\n device = _ref.device,\n browser = _ref.browser,\n engine = _ref.engine,\n os = _ref.os,\n ua = _ref.ua;\n\n var type = checkDeviceType(device.type);\n var isBrowser = type.isBrowser,\n isMobile = type.isMobile,\n isTablet = type.isTablet,\n isSmartTV = type.isSmartTV,\n isConsole = type.isConsole,\n isWearable = type.isWearable,\n isEmbedded = type.isEmbedded;\n\n if (isBrowser) {\n return browserPayload(isBrowser, browser, engine, os, ua);\n }\n\n if (isSmartTV) {\n return smartTvPayload(isSmartTV, engine, os, ua);\n }\n\n if (isConsole) {\n return consolePayload(isConsole, engine, os, ua);\n }\n\n if (isMobile) {\n return mobilePayload(type, device, os, ua);\n }\n\n if (isTablet) {\n return mobilePayload(type, device, os, ua);\n }\n\n if (isWearable) {\n return wearablePayload(isWearable, engine, os, ua);\n }\n\n if (isEmbedded) {\n return embeddedPayload(isEmbedded, device, engine, os, ua);\n }\n}\n\nvar isMobileType = function isMobileType(_ref) {\n var type = _ref.type;\n return type === DeviceTypes.Mobile;\n};\nvar isTabletType = function isTabletType(_ref2) {\n var type = _ref2.type;\n return type === DeviceTypes.Tablet;\n};\nvar isMobileAndTabletType = function isMobileAndTabletType(_ref3) {\n var type = _ref3.type;\n return type === DeviceTypes.Mobile || type === DeviceTypes.Tablet;\n};\nvar isSmartTVType = function isSmartTVType(_ref4) {\n var type = _ref4.type;\n return type === DeviceTypes.SmartTv;\n};\nvar isBrowserType = function isBrowserType(_ref5) {\n var type = _ref5.type;\n return type === DeviceTypes.Browser;\n};\nvar isWearableType = function isWearableType(_ref6) {\n var type = _ref6.type;\n return type === DeviceTypes.Wearable;\n};\nvar isConsoleType = function isConsoleType(_ref7) {\n var type = _ref7.type;\n return type === DeviceTypes.Console;\n};\nvar isEmbeddedType = function isEmbeddedType(_ref8) {\n var type = _ref8.type;\n return type === DeviceTypes.Embedded;\n};\nvar getMobileVendor = function getMobileVendor(_ref9) {\n var vendor = _ref9.vendor;\n return setDefaults(vendor);\n};\nvar getMobileModel = function getMobileModel(_ref10) {\n var model = _ref10.model;\n return setDefaults(model);\n};\nvar getDeviceType = function getDeviceType(_ref11) {\n var type = _ref11.type;\n return setDefaults(type, 'browser');\n}; // os types\n\nvar isAndroidType = function isAndroidType(_ref12) {\n var name = _ref12.name;\n return name === OsTypes.Android;\n};\nvar isWindowsType = function isWindowsType(_ref13) {\n var name = _ref13.name;\n return name === OsTypes.Windows;\n};\nvar isMacOsType = function isMacOsType(_ref14) {\n var name = _ref14.name;\n return name === OsTypes.MAC_OS;\n};\nvar isWinPhoneType = function isWinPhoneType(_ref15) {\n var name = _ref15.name;\n return name === OsTypes.WindowsPhone;\n};\nvar isIOSType = function isIOSType(_ref16) {\n var name = _ref16.name;\n return name === OsTypes.IOS;\n};\nvar getOsVersion = function getOsVersion(_ref17) {\n var version = _ref17.version;\n return setDefaults(version);\n};\nvar getOsName = function getOsName(_ref18) {\n var name = _ref18.name;\n return setDefaults(name);\n}; // browser types\n\nvar isChromeType = function isChromeType(_ref19) {\n var name = _ref19.name;\n return name === BrowserTypes.Chrome;\n};\nvar isFirefoxType = function isFirefoxType(_ref20) {\n var name = _ref20.name;\n return name === BrowserTypes.Firefox;\n};\nvar isChromiumType = function isChromiumType(_ref21) {\n var name = _ref21.name;\n return name === BrowserTypes.Chromium;\n};\nvar isEdgeType = function isEdgeType(_ref22) {\n var name = _ref22.name;\n return name === BrowserTypes.Edge;\n};\nvar isYandexType = function isYandexType(_ref23) {\n var name = _ref23.name;\n return name === BrowserTypes.Yandex;\n};\nvar isSafariType = function isSafariType(_ref24) {\n var name = _ref24.name;\n return name === BrowserTypes.Safari || name === BrowserTypes.MobileSafari;\n};\nvar isMobileSafariType = function isMobileSafariType(_ref25) {\n var name = _ref25.name;\n return name === BrowserTypes.MobileSafari;\n};\nvar isOperaType = function isOperaType(_ref26) {\n var name = _ref26.name;\n return name === BrowserTypes.Opera;\n};\nvar isIEType = function isIEType(_ref27) {\n var name = _ref27.name;\n return name === BrowserTypes.InternetExplorer || name === BrowserTypes.Ie;\n};\nvar isMIUIType = function isMIUIType(_ref28) {\n var name = _ref28.name;\n return name === BrowserTypes.MIUI;\n};\nvar isSamsungBrowserType = function isSamsungBrowserType(_ref29) {\n var name = _ref29.name;\n return name === BrowserTypes.SamsungBrowser;\n};\nvar getBrowserFullVersion = function getBrowserFullVersion(_ref30) {\n var version = _ref30.version;\n return setDefaults(version);\n};\nvar getBrowserVersion = function getBrowserVersion(_ref31) {\n var major = _ref31.major;\n return setDefaults(major);\n};\nvar getBrowserName = function getBrowserName(_ref32) {\n var name = _ref32.name;\n return setDefaults(name);\n}; // engine types\n\nvar getEngineName = function getEngineName(_ref33) {\n var name = _ref33.name;\n return setDefaults(name);\n};\nvar getEngineVersion = function getEngineVersion(_ref34) {\n var version = _ref34.version;\n return setDefaults(version);\n};\nvar isElectronType = function isElectronType() {\n var nav = getNavigatorInstance();\n var ua = nav && nav.userAgent && nav.userAgent.toLowerCase();\n return typeof ua === 'string' ? /electron/.test(ua) : false;\n};\nvar isEdgeChromiumType = function isEdgeChromiumType(ua) {\n return typeof ua === 'string' && ua.indexOf('Edg/') !== -1;\n};\nvar getIOS13 = function getIOS13() {\n var nav = getNavigatorInstance();\n return nav && (/iPad|iPhone|iPod/.test(nav.platform) || nav.platform === 'MacIntel' && nav.maxTouchPoints > 1) && !window.MSStream;\n};\nvar getIPad13 = function getIPad13() {\n return isIOS13Check('iPad');\n};\nvar getIphone13 = function getIphone13() {\n return isIOS13Check('iPhone');\n};\nvar getIPod13 = function getIPod13() {\n return isIOS13Check('iPod');\n};\nvar getUseragent = function getUseragent(userAg) {\n return setDefaults(userAg);\n};\n\nfunction buildSelectorsObject(options) {\n var _ref = options ? options : UAHelper,\n device = _ref.device,\n browser = _ref.browser,\n os = _ref.os,\n engine = _ref.engine,\n ua = _ref.ua;\n\n return {\n isSmartTV: isSmartTVType(device),\n isConsole: isConsoleType(device),\n isWearable: isWearableType(device),\n isEmbedded: isEmbeddedType(device),\n isMobileSafari: isMobileSafariType(browser) || getIPad13(),\n isChromium: isChromiumType(browser),\n isMobile: isMobileAndTabletType(device) || getIPad13(),\n isMobileOnly: isMobileType(device),\n isTablet: isTabletType(device) || getIPad13(),\n isBrowser: isBrowserType(device),\n isDesktop: isBrowserType(device),\n isAndroid: isAndroidType(os),\n isWinPhone: isWinPhoneType(os),\n isIOS: isIOSType(os) || getIPad13(),\n isChrome: isChromeType(browser),\n isFirefox: isFirefoxType(browser),\n isSafari: isSafariType(browser),\n isOpera: isOperaType(browser),\n isIE: isIEType(browser),\n osVersion: getOsVersion(os),\n osName: getOsName(os),\n fullBrowserVersion: getBrowserFullVersion(browser),\n browserVersion: getBrowserVersion(browser),\n browserName: getBrowserName(browser),\n mobileVendor: getMobileVendor(device),\n mobileModel: getMobileModel(device),\n engineName: getEngineName(engine),\n engineVersion: getEngineVersion(engine),\n getUA: getUseragent(ua),\n isEdge: isEdgeType(browser) || isEdgeChromiumType(ua),\n isYandex: isYandexType(browser),\n deviceType: getDeviceType(device),\n isIOS13: getIOS13(),\n isIPad13: getIPad13(),\n isIPhone13: getIphone13(),\n isIPod13: getIPod13(),\n isElectron: isElectronType(),\n isEdgeChromium: isEdgeChromiumType(ua),\n isLegacyEdge: isEdgeType(browser) && !isEdgeChromiumType(ua),\n isWindows: isWindowsType(os),\n isMacOs: isMacOsType(os),\n isMIUI: isMIUIType(browser),\n isSamsungBrowser: isSamsungBrowserType(browser)\n };\n}\n\nvar isSmartTV = isSmartTVType(device);\nvar isConsole = isConsoleType(device);\nvar isWearable = isWearableType(device);\nvar isEmbedded = isEmbeddedType(device);\nvar isMobileSafari = isMobileSafariType(browser) || getIPad13();\nvar isChromium = isChromiumType(browser);\nvar isMobile = isMobileAndTabletType(device) || getIPad13();\nvar isMobileOnly = isMobileType(device);\nvar isTablet = isTabletType(device) || getIPad13();\nvar isBrowser = isBrowserType(device);\nvar isDesktop = isBrowserType(device);\nvar isAndroid = isAndroidType(os);\nvar isWinPhone = isWinPhoneType(os);\nvar isIOS = isIOSType(os) || getIPad13();\nvar isChrome = isChromeType(browser);\nvar isFirefox = isFirefoxType(browser);\nvar isSafari = isSafariType(browser);\nvar isOpera = isOperaType(browser);\nvar isIE = isIEType(browser);\nvar osVersion = getOsVersion(os);\nvar osName = getOsName(os);\nvar fullBrowserVersion = getBrowserFullVersion(browser);\nvar browserVersion = getBrowserVersion(browser);\nvar browserName = getBrowserName(browser);\nvar mobileVendor = getMobileVendor(device);\nvar mobileModel = getMobileModel(device);\nvar engineName = getEngineName(engine);\nvar engineVersion = getEngineVersion(engine);\nvar getUA = getUseragent(ua);\nvar isEdge = isEdgeType(browser) || isEdgeChromiumType(ua);\nvar isYandex = isYandexType(browser);\nvar deviceType = getDeviceType(device);\nvar isIOS13 = getIOS13();\nvar isIPad13 = getIPad13();\nvar isIPhone13 = getIphone13();\nvar isIPod13 = getIPod13();\nvar isElectron = isElectronType();\nvar isEdgeChromium = isEdgeChromiumType(ua);\nvar isLegacyEdge = isEdgeType(browser) && !isEdgeChromiumType(ua);\nvar isWindows = isWindowsType(os);\nvar isMacOs = isMacOsType(os);\nvar isMIUI = isMIUIType(browser);\nvar isSamsungBrowser = isSamsungBrowserType(browser);\nvar getSelectorsByUserAgent = function getSelectorsByUserAgent(userAgent) {\n if (!userAgent || typeof userAgent !== 'string') {\n console.error('No valid user agent string was provided');\n return;\n }\n\n var _UAHelper$parseUserAg = parseUserAgent(userAgent),\n device = _UAHelper$parseUserAg.device,\n browser = _UAHelper$parseUserAg.browser,\n os = _UAHelper$parseUserAg.os,\n engine = _UAHelper$parseUserAg.engine,\n ua = _UAHelper$parseUserAg.ua;\n\n return buildSelectorsObject({\n device: device,\n browser: browser,\n os: os,\n engine: engine,\n ua: ua\n });\n};\n\nvar AndroidView = function AndroidView(_ref) {\n var renderWithFragment = _ref.renderWithFragment,\n children = _ref.children,\n props = _objectWithoutProperties$2(_ref, [\"renderWithFragment\", \"children\"]);\n\n return isAndroid ? renderWithFragment ? React__default.createElement(React.Fragment, null, children) : React__default.createElement(\"div\", props, children) : null;\n};\nvar BrowserView = function BrowserView(_ref2) {\n var renderWithFragment = _ref2.renderWithFragment,\n children = _ref2.children,\n props = _objectWithoutProperties$2(_ref2, [\"renderWithFragment\", \"children\"]);\n\n return isBrowser ? renderWithFragment ? React__default.createElement(React.Fragment, null, children) : React__default.createElement(\"div\", props, children) : null;\n};\nvar IEView = function IEView(_ref3) {\n var renderWithFragment = _ref3.renderWithFragment,\n children = _ref3.children,\n props = _objectWithoutProperties$2(_ref3, [\"renderWithFragment\", \"children\"]);\n\n return isIE ? renderWithFragment ? React__default.createElement(React.Fragment, null, children) : React__default.createElement(\"div\", props, children) : null;\n};\nvar IOSView = function IOSView(_ref4) {\n var renderWithFragment = _ref4.renderWithFragment,\n children = _ref4.children,\n props = _objectWithoutProperties$2(_ref4, [\"renderWithFragment\", \"children\"]);\n\n return isIOS ? renderWithFragment ? React__default.createElement(React.Fragment, null, children) : React__default.createElement(\"div\", props, children) : null;\n};\nvar MobileView = function MobileView(_ref5) {\n var renderWithFragment = _ref5.renderWithFragment,\n children = _ref5.children,\n props = _objectWithoutProperties$2(_ref5, [\"renderWithFragment\", \"children\"]);\n\n return isMobile ? renderWithFragment ? React__default.createElement(React.Fragment, null, children) : React__default.createElement(\"div\", props, children) : null;\n};\nvar TabletView = function TabletView(_ref6) {\n var renderWithFragment = _ref6.renderWithFragment,\n children = _ref6.children,\n props = _objectWithoutProperties$2(_ref6, [\"renderWithFragment\", \"children\"]);\n\n return isTablet ? renderWithFragment ? React__default.createElement(React.Fragment, null, children) : React__default.createElement(\"div\", props, children) : null;\n};\nvar WinPhoneView = function WinPhoneView(_ref7) {\n var renderWithFragment = _ref7.renderWithFragment,\n children = _ref7.children,\n props = _objectWithoutProperties$2(_ref7, [\"renderWithFragment\", \"children\"]);\n\n return isWinPhone ? renderWithFragment ? React__default.createElement(React.Fragment, null, children) : React__default.createElement(\"div\", props, children) : null;\n};\nvar MobileOnlyView = function MobileOnlyView(_ref8) {\n var renderWithFragment = _ref8.renderWithFragment,\n children = _ref8.children;\n _ref8.viewClassName;\n _ref8.style;\n var props = _objectWithoutProperties$2(_ref8, [\"renderWithFragment\", \"children\", \"viewClassName\", \"style\"]);\n\n return isMobileOnly ? renderWithFragment ? React__default.createElement(React.Fragment, null, children) : React__default.createElement(\"div\", props, children) : null;\n};\nvar SmartTVView = function SmartTVView(_ref9) {\n var renderWithFragment = _ref9.renderWithFragment,\n children = _ref9.children,\n props = _objectWithoutProperties$2(_ref9, [\"renderWithFragment\", \"children\"]);\n\n return isSmartTV ? renderWithFragment ? React__default.createElement(React.Fragment, null, children) : React__default.createElement(\"div\", props, children) : null;\n};\nvar ConsoleView = function ConsoleView(_ref10) {\n var renderWithFragment = _ref10.renderWithFragment,\n children = _ref10.children,\n props = _objectWithoutProperties$2(_ref10, [\"renderWithFragment\", \"children\"]);\n\n return isConsole ? renderWithFragment ? React__default.createElement(React.Fragment, null, children) : React__default.createElement(\"div\", props, children) : null;\n};\nvar WearableView = function WearableView(_ref11) {\n var renderWithFragment = _ref11.renderWithFragment,\n children = _ref11.children,\n props = _objectWithoutProperties$2(_ref11, [\"renderWithFragment\", \"children\"]);\n\n return isWearable ? renderWithFragment ? React__default.createElement(React.Fragment, null, children) : React__default.createElement(\"div\", props, children) : null;\n};\nvar CustomView = function CustomView(_ref12) {\n var renderWithFragment = _ref12.renderWithFragment,\n children = _ref12.children;\n _ref12.viewClassName;\n _ref12.style;\n var condition = _ref12.condition,\n props = _objectWithoutProperties$2(_ref12, [\"renderWithFragment\", \"children\", \"viewClassName\", \"style\", \"condition\"]);\n\n return condition ? renderWithFragment ? React__default.createElement(React.Fragment, null, children) : React__default.createElement(\"div\", props, children) : null;\n};\n\nfunction withOrientationChange(WrappedComponent) {\n return /*#__PURE__*/function (_React$Component) {\n _inherits(_class, _React$Component);\n\n function _class(props) {\n var _this;\n\n _classCallCheck(this, _class);\n\n _this = _possibleConstructorReturn(this, _getPrototypeOf(_class).call(this, props));\n _this.isEventListenerAdded = false;\n _this.handleOrientationChange = _this.handleOrientationChange.bind(_assertThisInitialized(_this));\n _this.onOrientationChange = _this.onOrientationChange.bind(_assertThisInitialized(_this));\n _this.onPageLoad = _this.onPageLoad.bind(_assertThisInitialized(_this));\n _this.state = {\n isLandscape: false,\n isPortrait: false\n };\n return _this;\n }\n\n _createClass(_class, [{\n key: \"handleOrientationChange\",\n value: function handleOrientationChange() {\n if (!this.isEventListenerAdded) {\n this.isEventListenerAdded = true;\n }\n\n var orientation = window.innerWidth > window.innerHeight ? 90 : 0;\n this.setState({\n isPortrait: orientation === 0,\n isLandscape: orientation === 90\n });\n }\n }, {\n key: \"onOrientationChange\",\n value: function onOrientationChange() {\n this.handleOrientationChange();\n }\n }, {\n key: \"onPageLoad\",\n value: function onPageLoad() {\n this.handleOrientationChange();\n }\n }, {\n key: \"componentDidMount\",\n value: function componentDidMount() {\n if ((typeof window === \"undefined\" ? \"undefined\" : _typeof(window)) !== undefined && isMobile) {\n if (!this.isEventListenerAdded) {\n this.handleOrientationChange();\n window.addEventListener(\"load\", this.onPageLoad, false);\n } else {\n window.removeEventListener(\"load\", this.onPageLoad, false);\n }\n\n window.addEventListener(\"resize\", this.onOrientationChange, false);\n }\n }\n }, {\n key: \"componentWillUnmount\",\n value: function componentWillUnmount() {\n window.removeEventListener(\"resize\", this.onOrientationChange, false);\n }\n }, {\n key: \"render\",\n value: function render() {\n return React__default.createElement(WrappedComponent, _extends$5({}, this.props, {\n isLandscape: this.state.isLandscape,\n isPortrait: this.state.isPortrait\n }));\n }\n }]);\n\n return _class;\n }(React__default.Component);\n}\n\nfunction useMobileOrientation() {\n var _useState = React.useState(function () {\n var orientation = window.innerWidth > window.innerHeight ? 90 : 0;\n return {\n isPortrait: orientation === 0,\n isLandscape: orientation === 90,\n orientation: orientation === 0 ? 'portrait' : 'landscape'\n };\n }),\n _useState2 = _slicedToArray(_useState, 2),\n state = _useState2[0],\n setState = _useState2[1];\n\n var handleOrientationChange = React.useCallback(function () {\n var orientation = window.innerWidth > window.innerHeight ? 90 : 0;\n var next = {\n isPortrait: orientation === 0,\n isLandscape: orientation === 90,\n orientation: orientation === 0 ? 'portrait' : 'landscape'\n };\n state.orientation !== next.orientation && setState(next);\n }, [state.orientation]);\n React.useEffect(function () {\n if ((typeof window === \"undefined\" ? \"undefined\" : _typeof(window)) !== undefined && isMobile) {\n handleOrientationChange();\n window.addEventListener(\"load\", handleOrientationChange, false);\n window.addEventListener(\"resize\", handleOrientationChange, false);\n }\n\n return function () {\n window.removeEventListener(\"resize\", handleOrientationChange, false);\n window.removeEventListener(\"load\", handleOrientationChange, false);\n };\n }, [handleOrientationChange]);\n return state;\n}\n\nfunction useDeviceData(userAgent) {\n var hookUserAgent = userAgent ? userAgent : window.navigator.userAgent;\n return parseUserAgent(hookUserAgent);\n}\n\nfunction useDeviceSelectors(userAgent) {\n var hookUserAgent = userAgent ? userAgent : window.navigator.userAgent;\n var deviceData = useDeviceData(hookUserAgent);\n var selectors = buildSelectorsObject(deviceData);\n return [selectors, deviceData];\n}\n\nlib$1.AndroidView = AndroidView;\nlib$1.BrowserTypes = BrowserTypes;\nlib$1.BrowserView = BrowserView;\nlib$1.ConsoleView = ConsoleView;\nlib$1.CustomView = CustomView;\nlib$1.IEView = IEView;\nlib$1.IOSView = IOSView;\nlib$1.MobileOnlyView = MobileOnlyView;\nlib$1.MobileView = MobileView;\nlib$1.OsTypes = OsTypes;\nlib$1.SmartTVView = SmartTVView;\nlib$1.TabletView = TabletView;\nlib$1.WearableView = WearableView;\nlib$1.WinPhoneView = WinPhoneView;\nvar browserName_1 = lib$1.browserName = browserName;\nlib$1.browserVersion = browserVersion;\nlib$1.deviceDetect = deviceDetect;\nlib$1.deviceType = deviceType;\nlib$1.engineName = engineName;\nlib$1.engineVersion = engineVersion;\nlib$1.fullBrowserVersion = fullBrowserVersion;\nlib$1.getSelectorsByUserAgent = getSelectorsByUserAgent;\nlib$1.getUA = getUA;\nlib$1.isAndroid = isAndroid;\nlib$1.isBrowser = isBrowser;\nlib$1.isChrome = isChrome;\nlib$1.isChromium = isChromium;\nlib$1.isConsole = isConsole;\nlib$1.isDesktop = isDesktop;\nlib$1.isEdge = isEdge;\nlib$1.isEdgeChromium = isEdgeChromium;\nlib$1.isElectron = isElectron;\nlib$1.isEmbedded = isEmbedded;\nlib$1.isFirefox = isFirefox;\nlib$1.isIE = isIE;\nvar isIOS_1 = lib$1.isIOS = isIOS;\nlib$1.isIOS13 = isIOS13;\nlib$1.isIPad13 = isIPad13;\nlib$1.isIPhone13 = isIPhone13;\nlib$1.isIPod13 = isIPod13;\nlib$1.isLegacyEdge = isLegacyEdge;\nlib$1.isMIUI = isMIUI;\nlib$1.isMacOs = isMacOs;\nvar isMobile_1 = lib$1.isMobile = isMobile;\nlib$1.isMobileOnly = isMobileOnly;\nlib$1.isMobileSafari = isMobileSafari;\nlib$1.isOpera = isOpera;\nlib$1.isSafari = isSafari;\nlib$1.isSamsungBrowser = isSamsungBrowser;\nlib$1.isSmartTV = isSmartTV;\nlib$1.isTablet = isTablet;\nlib$1.isWearable = isWearable;\nlib$1.isWinPhone = isWinPhone;\nlib$1.isWindows = isWindows;\nlib$1.isYandex = isYandex;\nlib$1.mobileModel = mobileModel;\nlib$1.mobileVendor = mobileVendor;\nlib$1.osName = osName;\nlib$1.osVersion = osVersion;\nlib$1.parseUserAgent = parseUserAgent;\nlib$1.setUserAgent = setUserAgent;\nlib$1.useDeviceData = useDeviceData;\nlib$1.useDeviceSelectors = useDeviceSelectors;\nvar useMobileOrientation_1 = lib$1.useMobileOrientation = useMobileOrientation;\nlib$1.withOrientationChange = withOrientationChange;\n\nvar css_248z$8 = \".permissionModal-module_scanErrorModal__l1xjO{align-items:center;background-color:#f9fbfd;border-radius:16px;box-shadow:0 8px 36px 0 rgba(0,0,0,.161);display:flex;flex-direction:column;height:630px;left:50%;padding:20px;position:absolute;text-align:center;top:50%;transform:translate(-50%,-50%);width:550px;z-index:999999}.permissionModal-module_scanErrorModal__l1xjO>*{margin-bottom:16px}.permissionModal-module_scanErrorTitle__7oc7e{color:#000;font-size:24px;font-weight:700;text-align:center}.permissionModal-module_scanErrorDescription__EgD59{color:rgba(21,25,32,.5);font-size:18px;font-weight:400;text-align:center}.permissionModal-module_scanErrorButton__-Tl-x{border:none;border-radius:8px;font-size:14px;font-weight:600;height:42px;min-width:230px}.permissionModal-module_scanErrorButtonContainer__cKvdH{display:flex;justify-content:space-around;width:100%}.permissionModal-module_scanErrorButtonSecondary__UrV9T{background:#fff;border:1px solid #566789;color:rgba(21,25,32,.5)}.permissionModal-module_scanErrorButtonPrimary__jBcc9{background-color:#2f80ed;color:#fff}\\n/*# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbInBlcm1pc3Npb25Nb2RhbC5tb2R1bGUuc2NzcyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSw4Q0FZRSxrQkFBbUIsQ0FWbkIsd0JBQXlCLENBQ3pCLGtCQUFtQixDQVluQix3Q0FBd0QsQ0FMeEQsWUFBYSxDQUNiLHFCQUFzQixDQU50QixZQUFhLENBRWIsUUFBUyxDQU9ULFlBQWEsQ0FiYixpQkFBa0IsQ0FZbEIsaUJBQWtCLENBTGxCLE9BQVEsQ0FDUiw4QkFBZ0MsQ0FMaEMsV0FBWSxDQUVaLGNBVUYsQ0FDQSxnREFDRSxrQkFDRixDQUVBLDhDQUNFLFVBQWMsQ0FFZCxjQUFlLENBRGYsZUFBZ0IsQ0FFaEIsaUJBQ0YsQ0FFQSxvREFDRSx1QkFBNEIsQ0FDNUIsY0FBZSxDQUNmLGVBQWdCLENBQ2hCLGlCQUNGLENBRUEsK0NBTUUsV0FBWSxDQUhaLGlCQUFrQixDQUVsQixjQUFlLENBRGYsZUFBZ0IsQ0FGaEIsV0FBWSxDQURaLGVBTUYsQ0FFQSx3REFDRSxZQUFhLENBQ2IsNEJBQTZCLENBQzdCLFVBQ0YsQ0FFQSx3REFHRSxlQUFnQixDQUZoQix3QkFBeUIsQ0FDekIsdUJBRUYsQ0FFQSxzREFDRSx3QkFBeUIsQ0FDekIsVUFDRiIsImZpbGUiOiJwZXJtaXNzaW9uTW9kYWwubW9kdWxlLnNjc3MiLCJzb3VyY2VzQ29udGVudCI6WyIuc2NhbkVycm9yTW9kYWwge1xuICBwb3NpdGlvbjogYWJzb2x1dGU7XG4gIGJhY2tncm91bmQtY29sb3I6ICNmOWZiZmQ7XG4gIGJvcmRlci1yYWRpdXM6IDE2cHg7XG4gIHdpZHRoOiA1NTBweDtcbiAgaGVpZ2h0OiA2MzBweDtcbiAgei1pbmRleDogOTk5OTk5O1xuICBsZWZ0OiA1MCU7XG4gIHRvcDogNTAlO1xuICB0cmFuc2Zvcm06IHRyYW5zbGF0ZSgtNTAlLCAtNTAlKTtcbiAgZGlzcGxheTogZmxleDtcbiAgZmxleC1kaXJlY3Rpb246IGNvbHVtbjtcbiAgYWxpZ24taXRlbXM6IGNlbnRlcjtcbiAgdGV4dC1hbGlnbjogY2VudGVyO1xuICBwYWRkaW5nOiAyMHB4O1xuICBib3gtc2hhZG93OiAwcHggOHB4IDM2cHggMHB4IHJnYmEoMCwgMCwgMCwgMC4xNjA3ODQzMTM3KTtcbn1cbi5zY2FuRXJyb3JNb2RhbCA+ICoge1xuICBtYXJnaW4tYm90dG9tOiAxNnB4O1xufVxuXG4uc2NhbkVycm9yVGl0bGUge1xuICBjb2xvcjogIzAwMDAwMDtcbiAgZm9udC13ZWlnaHQ6IDcwMDtcbiAgZm9udC1zaXplOiAyNHB4O1xuICB0ZXh0LWFsaWduOiBjZW50ZXI7XG59XG5cbi5zY2FuRXJyb3JEZXNjcmlwdGlvbiB7XG4gIGNvbG9yOiByZ2JhKDIxLCAyNSwgMzIsIDAuNSk7XG4gIGZvbnQtc2l6ZTogMThweDtcbiAgZm9udC13ZWlnaHQ6IDQwMDtcbiAgdGV4dC1hbGlnbjogY2VudGVyO1xufVxuXG4uc2NhbkVycm9yQnV0dG9uIHtcbiAgbWluLXdpZHRoOiAyMzBweDtcbiAgaGVpZ2h0OiA0MnB4O1xuICBib3JkZXItcmFkaXVzOiA4cHg7XG4gIGZvbnQtd2VpZ2h0OiA2MDA7XG4gIGZvbnQtc2l6ZTogMTRweDtcbiAgYm9yZGVyOiBub25lO1xufVxuXG4uc2NhbkVycm9yQnV0dG9uQ29udGFpbmVyIHtcbiAgZGlzcGxheTogZmxleDtcbiAganVzdGlmeS1jb250ZW50OiBzcGFjZS1hcm91bmQ7XG4gIHdpZHRoOiAxMDAlO1xufVxuXG4uc2NhbkVycm9yQnV0dG9uU2Vjb25kYXJ5IHtcbiAgYm9yZGVyOiAxcHggc29saWQgIzU2Njc4OTtcbiAgY29sb3I6IHJnYmEoMjEsIDI1LCAzMiwgMC41KTtcbiAgYmFja2dyb3VuZDogI2ZmZjtcbn1cblxuLnNjYW5FcnJvckJ1dHRvblByaW1hcnkge1xuICBiYWNrZ3JvdW5kLWNvbG9yOiAjMmY4MGVkO1xuICBjb2xvcjogI2ZmZjtcbn0iXX0= */\";\nvar styles$7 = {\"scanErrorModal\":\"permissionModal-module_scanErrorModal__l1xjO\",\"scanErrorTitle\":\"permissionModal-module_scanErrorTitle__7oc7e\",\"scanErrorDescription\":\"permissionModal-module_scanErrorDescription__EgD59\",\"scanErrorButton\":\"permissionModal-module_scanErrorButton__-Tl-x\",\"scanErrorButtonContainer\":\"permissionModal-module_scanErrorButtonContainer__cKvdH\",\"scanErrorButtonSecondary\":\"permissionModal-module_scanErrorButtonSecondary__UrV9T\",\"scanErrorButtonPrimary\":\"permissionModal-module_scanErrorButtonPrimary__jBcc9\"};\nstyleInject(css_248z$8);\n\nvar CameraPermissionModal = function (_a) {\r\n var enableModel = _a.enableModel;\r\n if (!enableModel) {\r\n return jsx(\"div\", {});\r\n }\r\n return (jsxs(\"div\", __assign$2({ className: styles$7.scanErrorModal }, { children: [jsx(\"h2\", __assign$2({ className: styles$7.scanErrorTitle }, { children: \"Camera Permission Needed\" })), jsx(\"p\", { children: \"This application needs access to the camera to scan your medical insurance card. Please allow access to the camera.\" }), jsxs(\"video\", __assign$2({ controls: true, autoPlay: true, loop: true, muted: true, width: \"400\" }, { children: [jsx(\"source\", { src: getBrowserHelperImage(browserName_1), type: \"video/mp4\" }), \"Sorry, your browser doesn't support embedded videos.\"] })), jsx(\"div\", __assign$2({ className: styles$7.scanErrorButtonContainer }, { children: jsx(\"button\", __assign$2({ className: \"\".concat(styles$7.scanErrorButton, \" \").concat(styles$7.scanErrorButtonPrimary), onClick: function () { return window.location.reload(); } }, { children: \"Try Again\" })) }))] })));\r\n};\n\nlet updateQueue = makeQueue();\nconst raf = fn => schedule(fn, updateQueue);\nlet writeQueue = makeQueue();\n\nraf.write = fn => schedule(fn, writeQueue);\n\nlet onStartQueue = makeQueue();\n\nraf.onStart = fn => schedule(fn, onStartQueue);\n\nlet onFrameQueue = makeQueue();\n\nraf.onFrame = fn => schedule(fn, onFrameQueue);\n\nlet onFinishQueue = makeQueue();\n\nraf.onFinish = fn => schedule(fn, onFinishQueue);\n\nlet timeouts = [];\n\nraf.setTimeout = (handler, ms) => {\n let time = raf.now() + ms;\n\n let cancel = () => {\n let i = timeouts.findIndex(t => t.cancel == cancel);\n if (~i) timeouts.splice(i, 1);\n pendingCount -= ~i ? 1 : 0;\n };\n\n let timeout = {\n time,\n handler,\n cancel\n };\n timeouts.splice(findTimeout(time), 0, timeout);\n pendingCount += 1;\n start$2();\n return timeout;\n};\n\nlet findTimeout = time => ~(~timeouts.findIndex(t => t.time > time) || ~timeouts.length);\n\nraf.cancel = fn => {\n onStartQueue.delete(fn);\n onFrameQueue.delete(fn);\n onFinishQueue.delete(fn);\n updateQueue.delete(fn);\n writeQueue.delete(fn);\n};\n\nraf.sync = fn => {\n sync = true;\n raf.batchedUpdates(fn);\n sync = false;\n};\n\nraf.throttle = fn => {\n let lastArgs;\n\n function queuedFn() {\n try {\n fn(...lastArgs);\n } finally {\n lastArgs = null;\n }\n }\n\n function throttled(...args) {\n lastArgs = args;\n raf.onStart(queuedFn);\n }\n\n throttled.handler = fn;\n\n throttled.cancel = () => {\n onStartQueue.delete(queuedFn);\n lastArgs = null;\n };\n\n return throttled;\n};\n\nlet nativeRaf = typeof window != 'undefined' ? window.requestAnimationFrame : () => {};\n\nraf.use = impl => nativeRaf = impl;\n\nraf.now = typeof performance != 'undefined' ? () => performance.now() : Date.now;\n\nraf.batchedUpdates = fn => fn();\n\nraf.catch = console.error;\nraf.frameLoop = 'always';\n\nraf.advance = () => {\n if (raf.frameLoop !== 'demand') {\n console.warn('Cannot call the manual advancement of rafz whilst frameLoop is not set as demand');\n } else {\n update$1();\n }\n};\n\nlet ts = -1;\nlet pendingCount = 0;\nlet sync = false;\n\nfunction schedule(fn, queue) {\n if (sync) {\n queue.delete(fn);\n fn(0);\n } else {\n queue.add(fn);\n start$2();\n }\n}\n\nfunction start$2() {\n if (ts < 0) {\n ts = 0;\n\n if (raf.frameLoop !== 'demand') {\n nativeRaf(loop);\n }\n }\n}\n\nfunction stop$2() {\n ts = -1;\n}\n\nfunction loop() {\n if (~ts) {\n nativeRaf(loop);\n raf.batchedUpdates(update$1);\n }\n}\n\nfunction update$1() {\n let prevTs = ts;\n ts = raf.now();\n let count = findTimeout(ts);\n\n if (count) {\n eachSafely(timeouts.splice(0, count), t => t.handler());\n pendingCount -= count;\n }\n\n if (!pendingCount) {\n stop$2();\n return;\n }\n\n onStartQueue.flush();\n updateQueue.flush(prevTs ? Math.min(64, ts - prevTs) : 16.667);\n onFrameQueue.flush();\n writeQueue.flush();\n onFinishQueue.flush();\n}\n\nfunction makeQueue() {\n let next = new Set();\n let current = next;\n return {\n add(fn) {\n pendingCount += current == next && !next.has(fn) ? 1 : 0;\n next.add(fn);\n },\n\n delete(fn) {\n pendingCount -= current == next && next.has(fn) ? 1 : 0;\n return next.delete(fn);\n },\n\n flush(arg) {\n if (current.size) {\n next = new Set();\n pendingCount -= current.size;\n eachSafely(current, fn => fn(arg) && next.add(fn));\n pendingCount += next.size;\n current = next;\n }\n }\n\n };\n}\n\nfunction eachSafely(values, each) {\n values.forEach(value => {\n try {\n each(value);\n } catch (e) {\n raf.catch(e);\n }\n });\n}\n\nfunction noop() {}\nconst defineHidden = (obj, key, value) => Object.defineProperty(obj, key, {\n value,\n writable: true,\n configurable: true\n});\nconst is = {\n arr: Array.isArray,\n obj: a => !!a && a.constructor.name === 'Object',\n fun: a => typeof a === 'function',\n str: a => typeof a === 'string',\n num: a => typeof a === 'number',\n und: a => a === undefined\n};\nfunction isEqual(a, b) {\n if (is.arr(a)) {\n if (!is.arr(b) || a.length !== b.length) return false;\n\n for (let i = 0; i < a.length; i++) {\n if (a[i] !== b[i]) return false;\n }\n\n return true;\n }\n\n return a === b;\n}\nconst each = (obj, fn) => obj.forEach(fn);\nfunction eachProp(obj, fn, ctx) {\n if (is.arr(obj)) {\n for (let i = 0; i < obj.length; i++) {\n fn.call(ctx, obj[i], `${i}`);\n }\n\n return;\n }\n\n for (const key in obj) {\n if (obj.hasOwnProperty(key)) {\n fn.call(ctx, obj[key], key);\n }\n }\n}\nconst toArray$1 = a => is.und(a) ? [] : is.arr(a) ? a : [a];\nfunction flush(queue, iterator) {\n if (queue.size) {\n const items = Array.from(queue);\n queue.clear();\n each(items, iterator);\n }\n}\nconst flushCalls = (queue, ...args) => flush(queue, fn => fn(...args));\nconst isSSR = () => typeof window === 'undefined' || !window.navigator || /ServerSideRendering|^Deno\\//.test(window.navigator.userAgent);\n\nlet createStringInterpolator$1;\nlet to;\nlet colors$1 = null;\nlet skipAnimation = false;\nlet willAdvance = noop;\nconst assign$3 = globals => {\n if (globals.to) to = globals.to;\n if (globals.now) raf.now = globals.now;\n if (globals.colors !== undefined) colors$1 = globals.colors;\n if (globals.skipAnimation != null) skipAnimation = globals.skipAnimation;\n if (globals.createStringInterpolator) createStringInterpolator$1 = globals.createStringInterpolator;\n if (globals.requestAnimationFrame) raf.use(globals.requestAnimationFrame);\n if (globals.batchedUpdates) raf.batchedUpdates = globals.batchedUpdates;\n if (globals.willAdvance) willAdvance = globals.willAdvance;\n if (globals.frameLoop) raf.frameLoop = globals.frameLoop;\n};\n\nvar globals = /*#__PURE__*/Object.freeze({\n __proto__: null,\n get createStringInterpolator () { return createStringInterpolator$1; },\n get to () { return to; },\n get colors () { return colors$1; },\n get skipAnimation () { return skipAnimation; },\n get willAdvance () { return willAdvance; },\n assign: assign$3\n});\n\nconst startQueue = new Set();\nlet currentFrame = [];\nlet prevFrame = [];\nlet priority = 0;\nconst frameLoop = {\n get idle() {\n return !startQueue.size && !currentFrame.length;\n },\n\n start(animation) {\n if (priority > animation.priority) {\n startQueue.add(animation);\n raf.onStart(flushStartQueue);\n } else {\n startSafely(animation);\n raf(advance);\n }\n },\n\n advance,\n\n sort(animation) {\n if (priority) {\n raf.onFrame(() => frameLoop.sort(animation));\n } else {\n const prevIndex = currentFrame.indexOf(animation);\n\n if (~prevIndex) {\n currentFrame.splice(prevIndex, 1);\n startUnsafely(animation);\n }\n }\n },\n\n clear() {\n currentFrame = [];\n startQueue.clear();\n }\n\n};\n\nfunction flushStartQueue() {\n startQueue.forEach(startSafely);\n startQueue.clear();\n raf(advance);\n}\n\nfunction startSafely(animation) {\n if (!currentFrame.includes(animation)) startUnsafely(animation);\n}\n\nfunction startUnsafely(animation) {\n currentFrame.splice(findIndex(currentFrame, other => other.priority > animation.priority), 0, animation);\n}\n\nfunction advance(dt) {\n const nextFrame = prevFrame;\n\n for (let i = 0; i < currentFrame.length; i++) {\n const animation = currentFrame[i];\n priority = animation.priority;\n\n if (!animation.idle) {\n willAdvance(animation);\n animation.advance(dt);\n\n if (!animation.idle) {\n nextFrame.push(animation);\n }\n }\n }\n\n priority = 0;\n prevFrame = currentFrame;\n prevFrame.length = 0;\n currentFrame = nextFrame;\n return currentFrame.length > 0;\n}\n\nfunction findIndex(arr, test) {\n const index = arr.findIndex(test);\n return index < 0 ? arr.length : index;\n}\n\nconst clamp = (min, max, v) => Math.min(Math.max(v, min), max);\n\nconst colors = {\n transparent: 0x00000000,\n aliceblue: 0xf0f8ffff,\n antiquewhite: 0xfaebd7ff,\n aqua: 0x00ffffff,\n aquamarine: 0x7fffd4ff,\n azure: 0xf0ffffff,\n beige: 0xf5f5dcff,\n bisque: 0xffe4c4ff,\n black: 0x000000ff,\n blanchedalmond: 0xffebcdff,\n blue: 0x0000ffff,\n blueviolet: 0x8a2be2ff,\n brown: 0xa52a2aff,\n burlywood: 0xdeb887ff,\n burntsienna: 0xea7e5dff,\n cadetblue: 0x5f9ea0ff,\n chartreuse: 0x7fff00ff,\n chocolate: 0xd2691eff,\n coral: 0xff7f50ff,\n cornflowerblue: 0x6495edff,\n cornsilk: 0xfff8dcff,\n crimson: 0xdc143cff,\n cyan: 0x00ffffff,\n darkblue: 0x00008bff,\n darkcyan: 0x008b8bff,\n darkgoldenrod: 0xb8860bff,\n darkgray: 0xa9a9a9ff,\n darkgreen: 0x006400ff,\n darkgrey: 0xa9a9a9ff,\n darkkhaki: 0xbdb76bff,\n darkmagenta: 0x8b008bff,\n darkolivegreen: 0x556b2fff,\n darkorange: 0xff8c00ff,\n darkorchid: 0x9932ccff,\n darkred: 0x8b0000ff,\n darksalmon: 0xe9967aff,\n darkseagreen: 0x8fbc8fff,\n darkslateblue: 0x483d8bff,\n darkslategray: 0x2f4f4fff,\n darkslategrey: 0x2f4f4fff,\n darkturquoise: 0x00ced1ff,\n darkviolet: 0x9400d3ff,\n deeppink: 0xff1493ff,\n deepskyblue: 0x00bfffff,\n dimgray: 0x696969ff,\n dimgrey: 0x696969ff,\n dodgerblue: 0x1e90ffff,\n firebrick: 0xb22222ff,\n floralwhite: 0xfffaf0ff,\n forestgreen: 0x228b22ff,\n fuchsia: 0xff00ffff,\n gainsboro: 0xdcdcdcff,\n ghostwhite: 0xf8f8ffff,\n gold: 0xffd700ff,\n goldenrod: 0xdaa520ff,\n gray: 0x808080ff,\n green: 0x008000ff,\n greenyellow: 0xadff2fff,\n grey: 0x808080ff,\n honeydew: 0xf0fff0ff,\n hotpink: 0xff69b4ff,\n indianred: 0xcd5c5cff,\n indigo: 0x4b0082ff,\n ivory: 0xfffff0ff,\n khaki: 0xf0e68cff,\n lavender: 0xe6e6faff,\n lavenderblush: 0xfff0f5ff,\n lawngreen: 0x7cfc00ff,\n lemonchiffon: 0xfffacdff,\n lightblue: 0xadd8e6ff,\n lightcoral: 0xf08080ff,\n lightcyan: 0xe0ffffff,\n lightgoldenrodyellow: 0xfafad2ff,\n lightgray: 0xd3d3d3ff,\n lightgreen: 0x90ee90ff,\n lightgrey: 0xd3d3d3ff,\n lightpink: 0xffb6c1ff,\n lightsalmon: 0xffa07aff,\n lightseagreen: 0x20b2aaff,\n lightskyblue: 0x87cefaff,\n lightslategray: 0x778899ff,\n lightslategrey: 0x778899ff,\n lightsteelblue: 0xb0c4deff,\n lightyellow: 0xffffe0ff,\n lime: 0x00ff00ff,\n limegreen: 0x32cd32ff,\n linen: 0xfaf0e6ff,\n magenta: 0xff00ffff,\n maroon: 0x800000ff,\n mediumaquamarine: 0x66cdaaff,\n mediumblue: 0x0000cdff,\n mediumorchid: 0xba55d3ff,\n mediumpurple: 0x9370dbff,\n mediumseagreen: 0x3cb371ff,\n mediumslateblue: 0x7b68eeff,\n mediumspringgreen: 0x00fa9aff,\n mediumturquoise: 0x48d1ccff,\n mediumvioletred: 0xc71585ff,\n midnightblue: 0x191970ff,\n mintcream: 0xf5fffaff,\n mistyrose: 0xffe4e1ff,\n moccasin: 0xffe4b5ff,\n navajowhite: 0xffdeadff,\n navy: 0x000080ff,\n oldlace: 0xfdf5e6ff,\n olive: 0x808000ff,\n olivedrab: 0x6b8e23ff,\n orange: 0xffa500ff,\n orangered: 0xff4500ff,\n orchid: 0xda70d6ff,\n palegoldenrod: 0xeee8aaff,\n palegreen: 0x98fb98ff,\n paleturquoise: 0xafeeeeff,\n palevioletred: 0xdb7093ff,\n papayawhip: 0xffefd5ff,\n peachpuff: 0xffdab9ff,\n peru: 0xcd853fff,\n pink: 0xffc0cbff,\n plum: 0xdda0ddff,\n powderblue: 0xb0e0e6ff,\n purple: 0x800080ff,\n rebeccapurple: 0x663399ff,\n red: 0xff0000ff,\n rosybrown: 0xbc8f8fff,\n royalblue: 0x4169e1ff,\n saddlebrown: 0x8b4513ff,\n salmon: 0xfa8072ff,\n sandybrown: 0xf4a460ff,\n seagreen: 0x2e8b57ff,\n seashell: 0xfff5eeff,\n sienna: 0xa0522dff,\n silver: 0xc0c0c0ff,\n skyblue: 0x87ceebff,\n slateblue: 0x6a5acdff,\n slategray: 0x708090ff,\n slategrey: 0x708090ff,\n snow: 0xfffafaff,\n springgreen: 0x00ff7fff,\n steelblue: 0x4682b4ff,\n tan: 0xd2b48cff,\n teal: 0x008080ff,\n thistle: 0xd8bfd8ff,\n tomato: 0xff6347ff,\n turquoise: 0x40e0d0ff,\n violet: 0xee82eeff,\n wheat: 0xf5deb3ff,\n white: 0xffffffff,\n whitesmoke: 0xf5f5f5ff,\n yellow: 0xffff00ff,\n yellowgreen: 0x9acd32ff\n};\n\nconst NUMBER = '[-+]?\\\\d*\\\\.?\\\\d+';\nconst PERCENTAGE = NUMBER + '%';\n\nfunction call(...parts) {\n return '\\\\(\\\\s*(' + parts.join(')\\\\s*,\\\\s*(') + ')\\\\s*\\\\)';\n}\n\nconst rgb = new RegExp('rgb' + call(NUMBER, NUMBER, NUMBER));\nconst rgba = new RegExp('rgba' + call(NUMBER, NUMBER, NUMBER, NUMBER));\nconst hsl = new RegExp('hsl' + call(NUMBER, PERCENTAGE, PERCENTAGE));\nconst hsla = new RegExp('hsla' + call(NUMBER, PERCENTAGE, PERCENTAGE, NUMBER));\nconst hex3 = /^#([0-9a-fA-F]{1})([0-9a-fA-F]{1})([0-9a-fA-F]{1})$/;\nconst hex4 = /^#([0-9a-fA-F]{1})([0-9a-fA-F]{1})([0-9a-fA-F]{1})([0-9a-fA-F]{1})$/;\nconst hex6 = /^#([0-9a-fA-F]{6})$/;\nconst hex8 = /^#([0-9a-fA-F]{8})$/;\n\nfunction normalizeColor(color) {\n let match;\n\n if (typeof color === 'number') {\n return color >>> 0 === color && color >= 0 && color <= 0xffffffff ? color : null;\n }\n\n if (match = hex6.exec(color)) return parseInt(match[1] + 'ff', 16) >>> 0;\n\n if (colors$1 && colors$1[color] !== undefined) {\n return colors$1[color];\n }\n\n if (match = rgb.exec(color)) {\n return (parse255(match[1]) << 24 | parse255(match[2]) << 16 | parse255(match[3]) << 8 | 0x000000ff) >>> 0;\n }\n\n if (match = rgba.exec(color)) {\n return (parse255(match[1]) << 24 | parse255(match[2]) << 16 | parse255(match[3]) << 8 | parse1(match[4])) >>> 0;\n }\n\n if (match = hex3.exec(color)) {\n return parseInt(match[1] + match[1] + match[2] + match[2] + match[3] + match[3] + 'ff', 16) >>> 0;\n }\n\n if (match = hex8.exec(color)) return parseInt(match[1], 16) >>> 0;\n\n if (match = hex4.exec(color)) {\n return parseInt(match[1] + match[1] + match[2] + match[2] + match[3] + match[3] + match[4] + match[4], 16) >>> 0;\n }\n\n if (match = hsl.exec(color)) {\n return (hslToRgb(parse360(match[1]), parsePercentage(match[2]), parsePercentage(match[3])) | 0x000000ff) >>> 0;\n }\n\n if (match = hsla.exec(color)) {\n return (hslToRgb(parse360(match[1]), parsePercentage(match[2]), parsePercentage(match[3])) | parse1(match[4])) >>> 0;\n }\n\n return null;\n}\n\nfunction hue2rgb(p, q, t) {\n if (t < 0) t += 1;\n if (t > 1) t -= 1;\n if (t < 1 / 6) return p + (q - p) * 6 * t;\n if (t < 1 / 2) return q;\n if (t < 2 / 3) return p + (q - p) * (2 / 3 - t) * 6;\n return p;\n}\n\nfunction hslToRgb(h, s, l) {\n const q = l < 0.5 ? l * (1 + s) : l + s - l * s;\n const p = 2 * l - q;\n const r = hue2rgb(p, q, h + 1 / 3);\n const g = hue2rgb(p, q, h);\n const b = hue2rgb(p, q, h - 1 / 3);\n return Math.round(r * 255) << 24 | Math.round(g * 255) << 16 | Math.round(b * 255) << 8;\n}\n\nfunction parse255(str) {\n const int = parseInt(str, 10);\n if (int < 0) return 0;\n if (int > 255) return 255;\n return int;\n}\n\nfunction parse360(str) {\n const int = parseFloat(str);\n return (int % 360 + 360) % 360 / 360;\n}\n\nfunction parse1(str) {\n const num = parseFloat(str);\n if (num < 0) return 0;\n if (num > 1) return 255;\n return Math.round(num * 255);\n}\n\nfunction parsePercentage(str) {\n const int = parseFloat(str);\n if (int < 0) return 0;\n if (int > 100) return 1;\n return int / 100;\n}\n\nfunction colorToRgba(input) {\n let int32Color = normalizeColor(input);\n if (int32Color === null) return input;\n int32Color = int32Color || 0;\n let r = (int32Color & 0xff000000) >>> 24;\n let g = (int32Color & 0x00ff0000) >>> 16;\n let b = (int32Color & 0x0000ff00) >>> 8;\n let a = (int32Color & 0x000000ff) / 255;\n return `rgba(${r}, ${g}, ${b}, ${a})`;\n}\n\nconst createInterpolator = (range, output, extrapolate) => {\n if (is.fun(range)) {\n return range;\n }\n\n if (is.arr(range)) {\n return createInterpolator({\n range,\n output: output,\n extrapolate\n });\n }\n\n if (is.str(range.output[0])) {\n return createStringInterpolator$1(range);\n }\n\n const config = range;\n const outputRange = config.output;\n const inputRange = config.range || [0, 1];\n const extrapolateLeft = config.extrapolateLeft || config.extrapolate || 'extend';\n const extrapolateRight = config.extrapolateRight || config.extrapolate || 'extend';\n\n const easing = config.easing || (t => t);\n\n return input => {\n const range = findRange(input, inputRange);\n return interpolate(input, inputRange[range], inputRange[range + 1], outputRange[range], outputRange[range + 1], easing, extrapolateLeft, extrapolateRight, config.map);\n };\n};\n\nfunction interpolate(input, inputMin, inputMax, outputMin, outputMax, easing, extrapolateLeft, extrapolateRight, map) {\n let result = map ? map(input) : input;\n\n if (result < inputMin) {\n if (extrapolateLeft === 'identity') return result;else if (extrapolateLeft === 'clamp') result = inputMin;\n }\n\n if (result > inputMax) {\n if (extrapolateRight === 'identity') return result;else if (extrapolateRight === 'clamp') result = inputMax;\n }\n\n if (outputMin === outputMax) return outputMin;\n if (inputMin === inputMax) return input <= inputMin ? outputMin : outputMax;\n if (inputMin === -Infinity) result = -result;else if (inputMax === Infinity) result = result - inputMin;else result = (result - inputMin) / (inputMax - inputMin);\n result = easing(result);\n if (outputMin === -Infinity) result = -result;else if (outputMax === Infinity) result = result + outputMin;else result = result * (outputMax - outputMin) + outputMin;\n return result;\n}\n\nfunction findRange(input, inputRange) {\n for (var i = 1; i < inputRange.length - 1; ++i) if (inputRange[i] >= input) break;\n\n return i - 1;\n}\n\nconst steps = (steps, direction = 'end') => progress => {\n progress = direction === 'end' ? Math.min(progress, 0.999) : Math.max(progress, 0.001);\n const expanded = progress * steps;\n const rounded = direction === 'end' ? Math.floor(expanded) : Math.ceil(expanded);\n return clamp(0, 1, rounded / steps);\n};\n\nconst c1 = 1.70158;\nconst c2 = c1 * 1.525;\nconst c3 = c1 + 1;\nconst c4 = 2 * Math.PI / 3;\nconst c5 = 2 * Math.PI / 4.5;\n\nconst bounceOut = x => {\n const n1 = 7.5625;\n const d1 = 2.75;\n\n if (x < 1 / d1) {\n return n1 * x * x;\n } else if (x < 2 / d1) {\n return n1 * (x -= 1.5 / d1) * x + 0.75;\n } else if (x < 2.5 / d1) {\n return n1 * (x -= 2.25 / d1) * x + 0.9375;\n } else {\n return n1 * (x -= 2.625 / d1) * x + 0.984375;\n }\n};\n\nconst easings = {\n linear: x => x,\n easeInQuad: x => x * x,\n easeOutQuad: x => 1 - (1 - x) * (1 - x),\n easeInOutQuad: x => x < 0.5 ? 2 * x * x : 1 - Math.pow(-2 * x + 2, 2) / 2,\n easeInCubic: x => x * x * x,\n easeOutCubic: x => 1 - Math.pow(1 - x, 3),\n easeInOutCubic: x => x < 0.5 ? 4 * x * x * x : 1 - Math.pow(-2 * x + 2, 3) / 2,\n easeInQuart: x => x * x * x * x,\n easeOutQuart: x => 1 - Math.pow(1 - x, 4),\n easeInOutQuart: x => x < 0.5 ? 8 * x * x * x * x : 1 - Math.pow(-2 * x + 2, 4) / 2,\n easeInQuint: x => x * x * x * x * x,\n easeOutQuint: x => 1 - Math.pow(1 - x, 5),\n easeInOutQuint: x => x < 0.5 ? 16 * x * x * x * x * x : 1 - Math.pow(-2 * x + 2, 5) / 2,\n easeInSine: x => 1 - Math.cos(x * Math.PI / 2),\n easeOutSine: x => Math.sin(x * Math.PI / 2),\n easeInOutSine: x => -(Math.cos(Math.PI * x) - 1) / 2,\n easeInExpo: x => x === 0 ? 0 : Math.pow(2, 10 * x - 10),\n easeOutExpo: x => x === 1 ? 1 : 1 - Math.pow(2, -10 * x),\n easeInOutExpo: x => x === 0 ? 0 : x === 1 ? 1 : x < 0.5 ? Math.pow(2, 20 * x - 10) / 2 : (2 - Math.pow(2, -20 * x + 10)) / 2,\n easeInCirc: x => 1 - Math.sqrt(1 - Math.pow(x, 2)),\n easeOutCirc: x => Math.sqrt(1 - Math.pow(x - 1, 2)),\n easeInOutCirc: x => x < 0.5 ? (1 - Math.sqrt(1 - Math.pow(2 * x, 2))) / 2 : (Math.sqrt(1 - Math.pow(-2 * x + 2, 2)) + 1) / 2,\n easeInBack: x => c3 * x * x * x - c1 * x * x,\n easeOutBack: x => 1 + c3 * Math.pow(x - 1, 3) + c1 * Math.pow(x - 1, 2),\n easeInOutBack: x => x < 0.5 ? Math.pow(2 * x, 2) * ((c2 + 1) * 2 * x - c2) / 2 : (Math.pow(2 * x - 2, 2) * ((c2 + 1) * (x * 2 - 2) + c2) + 2) / 2,\n easeInElastic: x => x === 0 ? 0 : x === 1 ? 1 : -Math.pow(2, 10 * x - 10) * Math.sin((x * 10 - 10.75) * c4),\n easeOutElastic: x => x === 0 ? 0 : x === 1 ? 1 : Math.pow(2, -10 * x) * Math.sin((x * 10 - 0.75) * c4) + 1,\n easeInOutElastic: x => x === 0 ? 0 : x === 1 ? 1 : x < 0.5 ? -(Math.pow(2, 20 * x - 10) * Math.sin((20 * x - 11.125) * c5)) / 2 : Math.pow(2, -20 * x + 10) * Math.sin((20 * x - 11.125) * c5) / 2 + 1,\n easeInBounce: x => 1 - bounceOut(1 - x),\n easeOutBounce: bounceOut,\n easeInOutBounce: x => x < 0.5 ? (1 - bounceOut(1 - 2 * x)) / 2 : (1 + bounceOut(2 * x - 1)) / 2,\n steps\n};\n\nfunction _extends$4() {\n _extends$4 = Object.assign ? Object.assign.bind() : function (target) {\n for (var i = 1; i < arguments.length; i++) {\n var source = arguments[i];\n\n for (var key in source) {\n if (Object.prototype.hasOwnProperty.call(source, key)) {\n target[key] = source[key];\n }\n }\n }\n\n return target;\n };\n return _extends$4.apply(this, arguments);\n}\n\nconst $get = Symbol.for('FluidValue.get');\nconst $observers = Symbol.for('FluidValue.observers');\n\nconst hasFluidValue = arg => Boolean(arg && arg[$get]);\n\nconst getFluidValue = arg => arg && arg[$get] ? arg[$get]() : arg;\n\nconst getFluidObservers = target => target[$observers] || null;\n\nfunction callFluidObserver(observer, event) {\n if (observer.eventObserved) {\n observer.eventObserved(event);\n } else {\n observer(event);\n }\n}\n\nfunction callFluidObservers(target, event) {\n let observers = target[$observers];\n\n if (observers) {\n observers.forEach(observer => {\n callFluidObserver(observer, event);\n });\n }\n}\n\nclass FluidValue {\n constructor(get) {\n this[$get] = void 0;\n this[$observers] = void 0;\n\n if (!get && !(get = this.get)) {\n throw Error('Unknown getter');\n }\n\n setFluidGetter(this, get);\n }\n\n}\n\nconst setFluidGetter = (target, get) => setHidden(target, $get, get);\n\nfunction addFluidObserver(target, observer) {\n if (target[$get]) {\n let observers = target[$observers];\n\n if (!observers) {\n setHidden(target, $observers, observers = new Set());\n }\n\n if (!observers.has(observer)) {\n observers.add(observer);\n\n if (target.observerAdded) {\n target.observerAdded(observers.size, observer);\n }\n }\n }\n\n return observer;\n}\n\nfunction removeFluidObserver(target, observer) {\n let observers = target[$observers];\n\n if (observers && observers.has(observer)) {\n const count = observers.size - 1;\n\n if (count) {\n observers.delete(observer);\n } else {\n target[$observers] = null;\n }\n\n if (target.observerRemoved) {\n target.observerRemoved(count, observer);\n }\n }\n}\n\nconst setHidden = (target, key, value) => Object.defineProperty(target, key, {\n value,\n writable: true,\n configurable: true\n});\n\nconst numberRegex = /[+\\-]?(?:0|[1-9]\\d*)(?:\\.\\d*)?(?:[eE][+\\-]?\\d+)?/g;\nconst colorRegex = /(#(?:[0-9a-f]{2}){2,4}|(#[0-9a-f]{3})|(rgb|hsl)a?\\((-?\\d+%?[,\\s]+){2,3}\\s*[\\d\\.]+%?\\))/gi;\nconst unitRegex = new RegExp(`(${numberRegex.source})(%|[a-z]+)`, 'i');\nconst rgbaRegex = /rgba\\(([0-9\\.-]+), ([0-9\\.-]+), ([0-9\\.-]+), ([0-9\\.-]+)\\)/gi;\nconst cssVariableRegex = /var\\((--[a-zA-Z0-9-_]+),? ?([a-zA-Z0-9 ()%#.,-]+)?\\)/;\n\nconst variableToRgba = input => {\n const [token, fallback] = parseCSSVariable(input);\n\n if (!token || isSSR()) {\n return input;\n }\n\n const value = window.getComputedStyle(document.documentElement).getPropertyValue(token);\n\n if (value) {\n return value.trim();\n } else if (fallback && fallback.startsWith('--')) {\n const _value = window.getComputedStyle(document.documentElement).getPropertyValue(fallback);\n\n if (_value) {\n return _value;\n } else {\n return input;\n }\n } else if (fallback && cssVariableRegex.test(fallback)) {\n return variableToRgba(fallback);\n } else if (fallback) {\n return fallback;\n }\n\n return input;\n};\n\nconst parseCSSVariable = current => {\n const match = cssVariableRegex.exec(current);\n if (!match) return [,];\n const [, token, fallback] = match;\n return [token, fallback];\n};\n\nlet namedColorRegex;\n\nconst rgbaRound = (_, p1, p2, p3, p4) => `rgba(${Math.round(p1)}, ${Math.round(p2)}, ${Math.round(p3)}, ${p4})`;\n\nconst createStringInterpolator = config => {\n if (!namedColorRegex) namedColorRegex = colors$1 ? new RegExp(`(${Object.keys(colors$1).join('|')})(?!\\\\w)`, 'g') : /^\\b$/;\n const output = config.output.map(value => {\n return getFluidValue(value).replace(cssVariableRegex, variableToRgba).replace(colorRegex, colorToRgba).replace(namedColorRegex, colorToRgba);\n });\n const keyframes = output.map(value => value.match(numberRegex).map(Number));\n const outputRanges = keyframes[0].map((_, i) => keyframes.map(values => {\n if (!(i in values)) {\n throw Error('The arity of each \"output\" value must be equal');\n }\n\n return values[i];\n }));\n const interpolators = outputRanges.map(output => createInterpolator(_extends$4({}, config, {\n output\n })));\n return input => {\n var _output$find;\n\n const missingUnit = !unitRegex.test(output[0]) && ((_output$find = output.find(value => unitRegex.test(value))) == null ? void 0 : _output$find.replace(numberRegex, ''));\n let i = 0;\n return output[0].replace(numberRegex, () => `${interpolators[i++](input)}${missingUnit || ''}`).replace(rgbaRegex, rgbaRound);\n };\n};\n\nconst prefix = 'react-spring: ';\nconst once = fn => {\n const func = fn;\n let called = false;\n\n if (typeof func != 'function') {\n throw new TypeError(`${prefix}once requires a function parameter`);\n }\n\n return (...args) => {\n if (!called) {\n func(...args);\n called = true;\n }\n };\n};\nconst warnInterpolate = once(console.warn);\nfunction deprecateInterpolate() {\n warnInterpolate(`${prefix}The \"interpolate\" function is deprecated in v9 (use \"to\" instead)`);\n}\nconst warnDirectCall = once(console.warn);\nfunction deprecateDirectCall() {\n warnDirectCall(`${prefix}Directly calling start instead of using the api object is deprecated in v9 (use \".start\" instead), this will be removed in later 0.X.0 versions`);\n}\n\nfunction isAnimatedString(value) {\n return is.str(value) && (value[0] == '#' || /\\d/.test(value) || !isSSR() && cssVariableRegex.test(value) || value in (colors$1 || {}));\n}\n\nconst useIsomorphicLayoutEffect$1 = isSSR() ? useEffect : useLayoutEffect;\n\nconst useIsMounted = () => {\n const isMounted = useRef(false);\n useIsomorphicLayoutEffect$1(() => {\n isMounted.current = true;\n return () => {\n isMounted.current = false;\n };\n }, []);\n return isMounted;\n};\n\nfunction useForceUpdate() {\n const update = useState()[1];\n const isMounted = useIsMounted();\n return () => {\n if (isMounted.current) {\n update(Math.random());\n }\n };\n}\n\nfunction useMemoOne(getResult, inputs) {\n const [initial] = useState(() => ({\n inputs,\n result: getResult()\n }));\n const committed = useRef();\n const prevCache = committed.current;\n let cache = prevCache;\n\n if (cache) {\n const useCache = Boolean(inputs && cache.inputs && areInputsEqual(inputs, cache.inputs));\n\n if (!useCache) {\n cache = {\n inputs,\n result: getResult()\n };\n }\n } else {\n cache = initial;\n }\n\n useEffect(() => {\n committed.current = cache;\n\n if (prevCache == initial) {\n initial.inputs = initial.result = undefined;\n }\n }, [cache]);\n return cache.result;\n}\n\nfunction areInputsEqual(next, prev) {\n if (next.length !== prev.length) {\n return false;\n }\n\n for (let i = 0; i < next.length; i++) {\n if (next[i] !== prev[i]) {\n return false;\n }\n }\n\n return true;\n}\n\nconst useOnce = effect => useEffect(effect, emptyDeps);\nconst emptyDeps = [];\n\nfunction usePrev(value) {\n const prevRef = useRef();\n useEffect(() => {\n prevRef.current = value;\n });\n return prevRef.current;\n}\n\nconst $node = Symbol.for('Animated:node');\nconst isAnimated = value => !!value && value[$node] === value;\nconst getAnimated = owner => owner && owner[$node];\nconst setAnimated = (owner, node) => defineHidden(owner, $node, node);\nconst getPayload = owner => owner && owner[$node] && owner[$node].getPayload();\nclass Animated {\n constructor() {\n this.payload = void 0;\n setAnimated(this, this);\n }\n\n getPayload() {\n return this.payload || [];\n }\n\n}\n\nclass AnimatedValue extends Animated {\n constructor(_value) {\n super();\n this.done = true;\n this.elapsedTime = void 0;\n this.lastPosition = void 0;\n this.lastVelocity = void 0;\n this.v0 = void 0;\n this.durationProgress = 0;\n this._value = _value;\n\n if (is.num(this._value)) {\n this.lastPosition = this._value;\n }\n }\n\n static create(value) {\n return new AnimatedValue(value);\n }\n\n getPayload() {\n return [this];\n }\n\n getValue() {\n return this._value;\n }\n\n setValue(value, step) {\n if (is.num(value)) {\n this.lastPosition = value;\n\n if (step) {\n value = Math.round(value / step) * step;\n\n if (this.done) {\n this.lastPosition = value;\n }\n }\n }\n\n if (this._value === value) {\n return false;\n }\n\n this._value = value;\n return true;\n }\n\n reset() {\n const {\n done\n } = this;\n this.done = false;\n\n if (is.num(this._value)) {\n this.elapsedTime = 0;\n this.durationProgress = 0;\n this.lastPosition = this._value;\n if (done) this.lastVelocity = null;\n this.v0 = null;\n }\n }\n\n}\n\nclass AnimatedString extends AnimatedValue {\n constructor(value) {\n super(0);\n this._string = null;\n this._toString = void 0;\n this._toString = createInterpolator({\n output: [value, value]\n });\n }\n\n static create(value) {\n return new AnimatedString(value);\n }\n\n getValue() {\n let value = this._string;\n return value == null ? this._string = this._toString(this._value) : value;\n }\n\n setValue(value) {\n if (is.str(value)) {\n if (value == this._string) {\n return false;\n }\n\n this._string = value;\n this._value = 1;\n } else if (super.setValue(value)) {\n this._string = null;\n } else {\n return false;\n }\n\n return true;\n }\n\n reset(goal) {\n if (goal) {\n this._toString = createInterpolator({\n output: [this.getValue(), goal]\n });\n }\n\n this._value = 0;\n super.reset();\n }\n\n}\n\nconst TreeContext = {\n dependencies: null\n};\n\nclass AnimatedObject extends Animated {\n constructor(source) {\n super();\n this.source = source;\n this.setValue(source);\n }\n\n getValue(animated) {\n const values = {};\n eachProp(this.source, (source, key) => {\n if (isAnimated(source)) {\n values[key] = source.getValue(animated);\n } else if (hasFluidValue(source)) {\n values[key] = getFluidValue(source);\n } else if (!animated) {\n values[key] = source;\n }\n });\n return values;\n }\n\n setValue(source) {\n this.source = source;\n this.payload = this._makePayload(source);\n }\n\n reset() {\n if (this.payload) {\n each(this.payload, node => node.reset());\n }\n }\n\n _makePayload(source) {\n if (source) {\n const payload = new Set();\n eachProp(source, this._addToPayload, payload);\n return Array.from(payload);\n }\n }\n\n _addToPayload(source) {\n if (TreeContext.dependencies && hasFluidValue(source)) {\n TreeContext.dependencies.add(source);\n }\n\n const payload = getPayload(source);\n\n if (payload) {\n each(payload, node => this.add(node));\n }\n }\n\n}\n\nclass AnimatedArray extends AnimatedObject {\n constructor(source) {\n super(source);\n }\n\n static create(source) {\n return new AnimatedArray(source);\n }\n\n getValue() {\n return this.source.map(node => node.getValue());\n }\n\n setValue(source) {\n const payload = this.getPayload();\n\n if (source.length == payload.length) {\n return payload.map((node, i) => node.setValue(source[i])).some(Boolean);\n }\n\n super.setValue(source.map(makeAnimated));\n return true;\n }\n\n}\n\nfunction makeAnimated(value) {\n const nodeType = isAnimatedString(value) ? AnimatedString : AnimatedValue;\n return nodeType.create(value);\n}\n\nfunction getAnimatedType(value) {\n const parentNode = getAnimated(value);\n return parentNode ? parentNode.constructor : is.arr(value) ? AnimatedArray : isAnimatedString(value) ? AnimatedString : AnimatedValue;\n}\n\nfunction _extends$3() {\n _extends$3 = Object.assign ? Object.assign.bind() : function (target) {\n for (var i = 1; i < arguments.length; i++) {\n var source = arguments[i];\n\n for (var key in source) {\n if (Object.prototype.hasOwnProperty.call(source, key)) {\n target[key] = source[key];\n }\n }\n }\n\n return target;\n };\n return _extends$3.apply(this, arguments);\n}\n\nconst withAnimated = (Component, host) => {\n const hasInstance = !is.fun(Component) || Component.prototype && Component.prototype.isReactComponent;\n return forwardRef((givenProps, givenRef) => {\n const instanceRef = useRef(null);\n const ref = hasInstance && useCallback(value => {\n instanceRef.current = updateRef(givenRef, value);\n }, [givenRef]);\n const [props, deps] = getAnimatedState(givenProps, host);\n const forceUpdate = useForceUpdate();\n\n const callback = () => {\n const instance = instanceRef.current;\n\n if (hasInstance && !instance) {\n return;\n }\n\n const didUpdate = instance ? host.applyAnimatedValues(instance, props.getValue(true)) : false;\n\n if (didUpdate === false) {\n forceUpdate();\n }\n };\n\n const observer = new PropsObserver(callback, deps);\n const observerRef = useRef();\n useIsomorphicLayoutEffect$1(() => {\n observerRef.current = observer;\n each(deps, dep => addFluidObserver(dep, observer));\n return () => {\n if (observerRef.current) {\n each(observerRef.current.deps, dep => removeFluidObserver(dep, observerRef.current));\n raf.cancel(observerRef.current.update);\n }\n };\n });\n useEffect(callback, []);\n useOnce(() => () => {\n const observer = observerRef.current;\n each(observer.deps, dep => removeFluidObserver(dep, observer));\n });\n const usedProps = host.getComponentProps(props.getValue());\n return React$1.createElement(Component, _extends$3({}, usedProps, {\n ref: ref\n }));\n });\n};\n\nclass PropsObserver {\n constructor(update, deps) {\n this.update = update;\n this.deps = deps;\n }\n\n eventObserved(event) {\n if (event.type == 'change') {\n raf.write(this.update);\n }\n }\n\n}\n\nfunction getAnimatedState(props, host) {\n const dependencies = new Set();\n TreeContext.dependencies = dependencies;\n if (props.style) props = _extends$3({}, props, {\n style: host.createAnimatedStyle(props.style)\n });\n props = new AnimatedObject(props);\n TreeContext.dependencies = null;\n return [props, dependencies];\n}\n\nfunction updateRef(ref, value) {\n if (ref) {\n if (is.fun(ref)) ref(value);else ref.current = value;\n }\n\n return value;\n}\n\nconst cacheKey = Symbol.for('AnimatedComponent');\nconst createHost = (components, {\n applyAnimatedValues: _applyAnimatedValues = () => false,\n createAnimatedStyle: _createAnimatedStyle = style => new AnimatedObject(style),\n getComponentProps: _getComponentProps = props => props\n} = {}) => {\n const hostConfig = {\n applyAnimatedValues: _applyAnimatedValues,\n createAnimatedStyle: _createAnimatedStyle,\n getComponentProps: _getComponentProps\n };\n\n const animated = Component => {\n const displayName = getDisplayName(Component) || 'Anonymous';\n\n if (is.str(Component)) {\n Component = animated[Component] || (animated[Component] = withAnimated(Component, hostConfig));\n } else {\n Component = Component[cacheKey] || (Component[cacheKey] = withAnimated(Component, hostConfig));\n }\n\n Component.displayName = `Animated(${displayName})`;\n return Component;\n };\n\n eachProp(components, (Component, key) => {\n if (is.arr(components)) {\n key = getDisplayName(Component);\n }\n\n animated[key] = animated(Component);\n });\n return {\n animated\n };\n};\n\nconst getDisplayName = arg => is.str(arg) ? arg : arg && is.str(arg.displayName) ? arg.displayName : is.fun(arg) && arg.name || null;\n\nfunction _extends$2() {\n _extends$2 = Object.assign ? Object.assign.bind() : function (target) {\n for (var i = 1; i < arguments.length; i++) {\n var source = arguments[i];\n\n for (var key in source) {\n if (Object.prototype.hasOwnProperty.call(source, key)) {\n target[key] = source[key];\n }\n }\n }\n\n return target;\n };\n return _extends$2.apply(this, arguments);\n}\n\nfunction callProp(value, ...args) {\n return is.fun(value) ? value(...args) : value;\n}\nconst matchProp = (value, key) => value === true || !!(key && value && (is.fun(value) ? value(key) : toArray$1(value).includes(key)));\nconst resolveProp = (prop, key) => is.obj(prop) ? key && prop[key] : prop;\nconst getDefaultProp = (props, key) => props.default === true ? props[key] : props.default ? props.default[key] : undefined;\n\nconst noopTransform = value => value;\n\nconst getDefaultProps = (props, transform = noopTransform) => {\n let keys = DEFAULT_PROPS;\n\n if (props.default && props.default !== true) {\n props = props.default;\n keys = Object.keys(props);\n }\n\n const defaults = {};\n\n for (const key of keys) {\n const value = transform(props[key], key);\n\n if (!is.und(value)) {\n defaults[key] = value;\n }\n }\n\n return defaults;\n};\nconst DEFAULT_PROPS = ['config', 'onProps', 'onStart', 'onChange', 'onPause', 'onResume', 'onRest'];\nconst RESERVED_PROPS = {\n config: 1,\n from: 1,\n to: 1,\n ref: 1,\n loop: 1,\n reset: 1,\n pause: 1,\n cancel: 1,\n reverse: 1,\n immediate: 1,\n default: 1,\n delay: 1,\n onProps: 1,\n onStart: 1,\n onChange: 1,\n onPause: 1,\n onResume: 1,\n onRest: 1,\n onResolve: 1,\n items: 1,\n trail: 1,\n sort: 1,\n expires: 1,\n initial: 1,\n enter: 1,\n update: 1,\n leave: 1,\n children: 1,\n onDestroyed: 1,\n keys: 1,\n callId: 1,\n parentId: 1\n};\n\nfunction getForwardProps(props) {\n const forward = {};\n let count = 0;\n eachProp(props, (value, prop) => {\n if (!RESERVED_PROPS[prop]) {\n forward[prop] = value;\n count++;\n }\n });\n\n if (count) {\n return forward;\n }\n}\n\nfunction inferTo(props) {\n const to = getForwardProps(props);\n\n if (to) {\n const out = {\n to\n };\n eachProp(props, (val, key) => key in to || (out[key] = val));\n return out;\n }\n\n return _extends$2({}, props);\n}\nfunction computeGoal(value) {\n value = getFluidValue(value);\n return is.arr(value) ? value.map(computeGoal) : isAnimatedString(value) ? globals.createStringInterpolator({\n range: [0, 1],\n output: [value, value]\n })(1) : value;\n}\nfunction hasProps(props) {\n for (const _ in props) return true;\n\n return false;\n}\nfunction isAsyncTo(to) {\n return is.fun(to) || is.arr(to) && is.obj(to[0]);\n}\nfunction detachRefs(ctrl, ref) {\n var _ctrl$ref;\n\n (_ctrl$ref = ctrl.ref) == null ? void 0 : _ctrl$ref.delete(ctrl);\n ref == null ? void 0 : ref.delete(ctrl);\n}\nfunction replaceRef(ctrl, ref) {\n if (ref && ctrl.ref !== ref) {\n var _ctrl$ref2;\n\n (_ctrl$ref2 = ctrl.ref) == null ? void 0 : _ctrl$ref2.delete(ctrl);\n ref.add(ctrl);\n ctrl.ref = ref;\n }\n}\n\nconst config = {\n default: {\n tension: 170,\n friction: 26\n },\n gentle: {\n tension: 120,\n friction: 14\n },\n wobbly: {\n tension: 180,\n friction: 12\n },\n stiff: {\n tension: 210,\n friction: 20\n },\n slow: {\n tension: 280,\n friction: 60\n },\n molasses: {\n tension: 280,\n friction: 120\n }\n};\n\nconst defaults = _extends$2({}, config.default, {\n mass: 1,\n damping: 1,\n easing: easings.linear,\n clamp: false\n});\n\nclass AnimationConfig {\n constructor() {\n this.tension = void 0;\n this.friction = void 0;\n this.frequency = void 0;\n this.damping = void 0;\n this.mass = void 0;\n this.velocity = 0;\n this.restVelocity = void 0;\n this.precision = void 0;\n this.progress = void 0;\n this.duration = void 0;\n this.easing = void 0;\n this.clamp = void 0;\n this.bounce = void 0;\n this.decay = void 0;\n this.round = void 0;\n Object.assign(this, defaults);\n }\n\n}\nfunction mergeConfig(config, newConfig, defaultConfig) {\n if (defaultConfig) {\n defaultConfig = _extends$2({}, defaultConfig);\n sanitizeConfig(defaultConfig, newConfig);\n newConfig = _extends$2({}, defaultConfig, newConfig);\n }\n\n sanitizeConfig(config, newConfig);\n Object.assign(config, newConfig);\n\n for (const key in defaults) {\n if (config[key] == null) {\n config[key] = defaults[key];\n }\n }\n\n let {\n mass,\n frequency,\n damping\n } = config;\n\n if (!is.und(frequency)) {\n if (frequency < 0.01) frequency = 0.01;\n if (damping < 0) damping = 0;\n config.tension = Math.pow(2 * Math.PI / frequency, 2) * mass;\n config.friction = 4 * Math.PI * damping * mass / frequency;\n }\n\n return config;\n}\n\nfunction sanitizeConfig(config, props) {\n if (!is.und(props.decay)) {\n config.duration = undefined;\n } else {\n const isTensionConfig = !is.und(props.tension) || !is.und(props.friction);\n\n if (isTensionConfig || !is.und(props.frequency) || !is.und(props.damping) || !is.und(props.mass)) {\n config.duration = undefined;\n config.decay = undefined;\n }\n\n if (isTensionConfig) {\n config.frequency = undefined;\n }\n }\n}\n\nconst emptyArray = [];\nclass Animation {\n constructor() {\n this.changed = false;\n this.values = emptyArray;\n this.toValues = null;\n this.fromValues = emptyArray;\n this.to = void 0;\n this.from = void 0;\n this.config = new AnimationConfig();\n this.immediate = false;\n }\n\n}\n\nfunction scheduleProps(callId, {\n key,\n props,\n defaultProps,\n state,\n actions\n}) {\n return new Promise((resolve, reject) => {\n var _props$cancel;\n\n let delay;\n let timeout;\n let cancel = matchProp((_props$cancel = props.cancel) != null ? _props$cancel : defaultProps == null ? void 0 : defaultProps.cancel, key);\n\n if (cancel) {\n onStart();\n } else {\n if (!is.und(props.pause)) {\n state.paused = matchProp(props.pause, key);\n }\n\n let pause = defaultProps == null ? void 0 : defaultProps.pause;\n\n if (pause !== true) {\n pause = state.paused || matchProp(pause, key);\n }\n\n delay = callProp(props.delay || 0, key);\n\n if (pause) {\n state.resumeQueue.add(onResume);\n actions.pause();\n } else {\n actions.resume();\n onResume();\n }\n }\n\n function onPause() {\n state.resumeQueue.add(onResume);\n state.timeouts.delete(timeout);\n timeout.cancel();\n delay = timeout.time - raf.now();\n }\n\n function onResume() {\n if (delay > 0 && !globals.skipAnimation) {\n state.delayed = true;\n timeout = raf.setTimeout(onStart, delay);\n state.pauseQueue.add(onPause);\n state.timeouts.add(timeout);\n } else {\n onStart();\n }\n }\n\n function onStart() {\n if (state.delayed) {\n state.delayed = false;\n }\n\n state.pauseQueue.delete(onPause);\n state.timeouts.delete(timeout);\n\n if (callId <= (state.cancelId || 0)) {\n cancel = true;\n }\n\n try {\n actions.start(_extends$2({}, props, {\n callId,\n cancel\n }), resolve);\n } catch (err) {\n reject(err);\n }\n }\n });\n}\n\nconst getCombinedResult = (target, results) => results.length == 1 ? results[0] : results.some(result => result.cancelled) ? getCancelledResult(target.get()) : results.every(result => result.noop) ? getNoopResult(target.get()) : getFinishedResult(target.get(), results.every(result => result.finished));\nconst getNoopResult = value => ({\n value,\n noop: true,\n finished: true,\n cancelled: false\n});\nconst getFinishedResult = (value, finished, cancelled = false) => ({\n value,\n finished,\n cancelled\n});\nconst getCancelledResult = value => ({\n value,\n cancelled: true,\n finished: false\n});\n\nfunction runAsync(to, props, state, target) {\n const {\n callId,\n parentId,\n onRest\n } = props;\n const {\n asyncTo: prevTo,\n promise: prevPromise\n } = state;\n\n if (!parentId && to === prevTo && !props.reset) {\n return prevPromise;\n }\n\n return state.promise = (async () => {\n state.asyncId = callId;\n state.asyncTo = to;\n const defaultProps = getDefaultProps(props, (value, key) => key === 'onRest' ? undefined : value);\n let preventBail;\n let bail;\n const bailPromise = new Promise((resolve, reject) => (preventBail = resolve, bail = reject));\n\n const bailIfEnded = bailSignal => {\n const bailResult = callId <= (state.cancelId || 0) && getCancelledResult(target) || callId !== state.asyncId && getFinishedResult(target, false);\n\n if (bailResult) {\n bailSignal.result = bailResult;\n bail(bailSignal);\n throw bailSignal;\n }\n };\n\n const animate = (arg1, arg2) => {\n const bailSignal = new BailSignal();\n const skipAnimationSignal = new SkipAnimationSignal();\n return (async () => {\n if (globals.skipAnimation) {\n stopAsync(state);\n skipAnimationSignal.result = getFinishedResult(target, false);\n bail(skipAnimationSignal);\n throw skipAnimationSignal;\n }\n\n bailIfEnded(bailSignal);\n const props = is.obj(arg1) ? _extends$2({}, arg1) : _extends$2({}, arg2, {\n to: arg1\n });\n props.parentId = callId;\n eachProp(defaultProps, (value, key) => {\n if (is.und(props[key])) {\n props[key] = value;\n }\n });\n const result = await target.start(props);\n bailIfEnded(bailSignal);\n\n if (state.paused) {\n await new Promise(resume => {\n state.resumeQueue.add(resume);\n });\n }\n\n return result;\n })();\n };\n\n let result;\n\n if (globals.skipAnimation) {\n stopAsync(state);\n return getFinishedResult(target, false);\n }\n\n try {\n let animating;\n\n if (is.arr(to)) {\n animating = (async queue => {\n for (const props of queue) {\n await animate(props);\n }\n })(to);\n } else {\n animating = Promise.resolve(to(animate, target.stop.bind(target)));\n }\n\n await Promise.all([animating.then(preventBail), bailPromise]);\n result = getFinishedResult(target.get(), true, false);\n } catch (err) {\n if (err instanceof BailSignal) {\n result = err.result;\n } else if (err instanceof SkipAnimationSignal) {\n result = err.result;\n } else {\n throw err;\n }\n } finally {\n if (callId == state.asyncId) {\n state.asyncId = parentId;\n state.asyncTo = parentId ? prevTo : undefined;\n state.promise = parentId ? prevPromise : undefined;\n }\n }\n\n if (is.fun(onRest)) {\n raf.batchedUpdates(() => {\n onRest(result, target, target.item);\n });\n }\n\n return result;\n })();\n}\nfunction stopAsync(state, cancelId) {\n flush(state.timeouts, t => t.cancel());\n state.pauseQueue.clear();\n state.resumeQueue.clear();\n state.asyncId = state.asyncTo = state.promise = undefined;\n if (cancelId) state.cancelId = cancelId;\n}\nclass BailSignal extends Error {\n constructor() {\n super('An async animation has been interrupted. You see this error because you ' + 'forgot to use `await` or `.catch(...)` on its returned promise.');\n this.result = void 0;\n }\n\n}\nclass SkipAnimationSignal extends Error {\n constructor() {\n super('SkipAnimationSignal');\n this.result = void 0;\n }\n\n}\n\nconst isFrameValue = value => value instanceof FrameValue;\nlet nextId$1 = 1;\nclass FrameValue extends FluidValue {\n constructor(...args) {\n super(...args);\n this.id = nextId$1++;\n this.key = void 0;\n this._priority = 0;\n }\n\n get priority() {\n return this._priority;\n }\n\n set priority(priority) {\n if (this._priority != priority) {\n this._priority = priority;\n\n this._onPriorityChange(priority);\n }\n }\n\n get() {\n const node = getAnimated(this);\n return node && node.getValue();\n }\n\n to(...args) {\n return globals.to(this, args);\n }\n\n interpolate(...args) {\n deprecateInterpolate();\n return globals.to(this, args);\n }\n\n toJSON() {\n return this.get();\n }\n\n observerAdded(count) {\n if (count == 1) this._attach();\n }\n\n observerRemoved(count) {\n if (count == 0) this._detach();\n }\n\n _attach() {}\n\n _detach() {}\n\n _onChange(value, idle = false) {\n callFluidObservers(this, {\n type: 'change',\n parent: this,\n value,\n idle\n });\n }\n\n _onPriorityChange(priority) {\n if (!this.idle) {\n frameLoop.sort(this);\n }\n\n callFluidObservers(this, {\n type: 'priority',\n parent: this,\n priority\n });\n }\n\n}\n\nconst $P = Symbol.for('SpringPhase');\nconst HAS_ANIMATED = 1;\nconst IS_ANIMATING = 2;\nconst IS_PAUSED = 4;\nconst hasAnimated = target => (target[$P] & HAS_ANIMATED) > 0;\nconst isAnimating = target => (target[$P] & IS_ANIMATING) > 0;\nconst isPaused = target => (target[$P] & IS_PAUSED) > 0;\nconst setActiveBit = (target, active) => active ? target[$P] |= IS_ANIMATING | HAS_ANIMATED : target[$P] &= ~IS_ANIMATING;\nconst setPausedBit = (target, paused) => paused ? target[$P] |= IS_PAUSED : target[$P] &= ~IS_PAUSED;\n\nclass SpringValue extends FrameValue {\n constructor(arg1, arg2) {\n super();\n this.key = void 0;\n this.animation = new Animation();\n this.queue = void 0;\n this.defaultProps = {};\n this._state = {\n paused: false,\n delayed: false,\n pauseQueue: new Set(),\n resumeQueue: new Set(),\n timeouts: new Set()\n };\n this._pendingCalls = new Set();\n this._lastCallId = 0;\n this._lastToId = 0;\n this._memoizedDuration = 0;\n\n if (!is.und(arg1) || !is.und(arg2)) {\n const props = is.obj(arg1) ? _extends$2({}, arg1) : _extends$2({}, arg2, {\n from: arg1\n });\n\n if (is.und(props.default)) {\n props.default = true;\n }\n\n this.start(props);\n }\n }\n\n get idle() {\n return !(isAnimating(this) || this._state.asyncTo) || isPaused(this);\n }\n\n get goal() {\n return getFluidValue(this.animation.to);\n }\n\n get velocity() {\n const node = getAnimated(this);\n return node instanceof AnimatedValue ? node.lastVelocity || 0 : node.getPayload().map(node => node.lastVelocity || 0);\n }\n\n get hasAnimated() {\n return hasAnimated(this);\n }\n\n get isAnimating() {\n return isAnimating(this);\n }\n\n get isPaused() {\n return isPaused(this);\n }\n\n get isDelayed() {\n return this._state.delayed;\n }\n\n advance(dt) {\n let idle = true;\n let changed = false;\n const anim = this.animation;\n let {\n config,\n toValues\n } = anim;\n const payload = getPayload(anim.to);\n\n if (!payload && hasFluidValue(anim.to)) {\n toValues = toArray$1(getFluidValue(anim.to));\n }\n\n anim.values.forEach((node, i) => {\n if (node.done) return;\n const to = node.constructor == AnimatedString ? 1 : payload ? payload[i].lastPosition : toValues[i];\n let finished = anim.immediate;\n let position = to;\n\n if (!finished) {\n position = node.lastPosition;\n\n if (config.tension <= 0) {\n node.done = true;\n return;\n }\n\n let elapsed = node.elapsedTime += dt;\n const from = anim.fromValues[i];\n const v0 = node.v0 != null ? node.v0 : node.v0 = is.arr(config.velocity) ? config.velocity[i] : config.velocity;\n let velocity;\n const precision = config.precision || (from == to ? 0.005 : Math.min(1, Math.abs(to - from) * 0.001));\n\n if (!is.und(config.duration)) {\n let p = 1;\n\n if (config.duration > 0) {\n if (this._memoizedDuration !== config.duration) {\n this._memoizedDuration = config.duration;\n\n if (node.durationProgress > 0) {\n node.elapsedTime = config.duration * node.durationProgress;\n elapsed = node.elapsedTime += dt;\n }\n }\n\n p = (config.progress || 0) + elapsed / this._memoizedDuration;\n p = p > 1 ? 1 : p < 0 ? 0 : p;\n node.durationProgress = p;\n }\n\n position = from + config.easing(p) * (to - from);\n velocity = (position - node.lastPosition) / dt;\n finished = p == 1;\n } else if (config.decay) {\n const decay = config.decay === true ? 0.998 : config.decay;\n const e = Math.exp(-(1 - decay) * elapsed);\n position = from + v0 / (1 - decay) * (1 - e);\n finished = Math.abs(node.lastPosition - position) <= precision;\n velocity = v0 * e;\n } else {\n velocity = node.lastVelocity == null ? v0 : node.lastVelocity;\n const restVelocity = config.restVelocity || precision / 10;\n const bounceFactor = config.clamp ? 0 : config.bounce;\n const canBounce = !is.und(bounceFactor);\n const isGrowing = from == to ? node.v0 > 0 : from < to;\n let isMoving;\n let isBouncing = false;\n const step = 1;\n const numSteps = Math.ceil(dt / step);\n\n for (let n = 0; n < numSteps; ++n) {\n isMoving = Math.abs(velocity) > restVelocity;\n\n if (!isMoving) {\n finished = Math.abs(to - position) <= precision;\n\n if (finished) {\n break;\n }\n }\n\n if (canBounce) {\n isBouncing = position == to || position > to == isGrowing;\n\n if (isBouncing) {\n velocity = -velocity * bounceFactor;\n position = to;\n }\n }\n\n const springForce = -config.tension * 0.000001 * (position - to);\n const dampingForce = -config.friction * 0.001 * velocity;\n const acceleration = (springForce + dampingForce) / config.mass;\n velocity = velocity + acceleration * step;\n position = position + velocity * step;\n }\n }\n\n node.lastVelocity = velocity;\n\n if (Number.isNaN(position)) {\n console.warn(`Got NaN while animating:`, this);\n finished = true;\n }\n }\n\n if (payload && !payload[i].done) {\n finished = false;\n }\n\n if (finished) {\n node.done = true;\n } else {\n idle = false;\n }\n\n if (node.setValue(position, config.round)) {\n changed = true;\n }\n });\n const node = getAnimated(this);\n const currVal = node.getValue();\n\n if (idle) {\n const finalVal = getFluidValue(anim.to);\n\n if ((currVal !== finalVal || changed) && !config.decay) {\n node.setValue(finalVal);\n\n this._onChange(finalVal);\n } else if (changed && config.decay) {\n this._onChange(currVal);\n }\n\n this._stop();\n } else if (changed) {\n this._onChange(currVal);\n }\n }\n\n set(value) {\n raf.batchedUpdates(() => {\n this._stop();\n\n this._focus(value);\n\n this._set(value);\n });\n return this;\n }\n\n pause() {\n this._update({\n pause: true\n });\n }\n\n resume() {\n this._update({\n pause: false\n });\n }\n\n finish() {\n if (isAnimating(this)) {\n const {\n to,\n config\n } = this.animation;\n raf.batchedUpdates(() => {\n this._onStart();\n\n if (!config.decay) {\n this._set(to, false);\n }\n\n this._stop();\n });\n }\n\n return this;\n }\n\n update(props) {\n const queue = this.queue || (this.queue = []);\n queue.push(props);\n return this;\n }\n\n start(to, arg2) {\n let queue;\n\n if (!is.und(to)) {\n queue = [is.obj(to) ? to : _extends$2({}, arg2, {\n to\n })];\n } else {\n queue = this.queue || [];\n this.queue = [];\n }\n\n return Promise.all(queue.map(props => {\n const up = this._update(props);\n\n return up;\n })).then(results => getCombinedResult(this, results));\n }\n\n stop(cancel) {\n const {\n to\n } = this.animation;\n\n this._focus(this.get());\n\n stopAsync(this._state, cancel && this._lastCallId);\n raf.batchedUpdates(() => this._stop(to, cancel));\n return this;\n }\n\n reset() {\n this._update({\n reset: true\n });\n }\n\n eventObserved(event) {\n if (event.type == 'change') {\n this._start();\n } else if (event.type == 'priority') {\n this.priority = event.priority + 1;\n }\n }\n\n _prepareNode(props) {\n const key = this.key || '';\n let {\n to,\n from\n } = props;\n to = is.obj(to) ? to[key] : to;\n\n if (to == null || isAsyncTo(to)) {\n to = undefined;\n }\n\n from = is.obj(from) ? from[key] : from;\n\n if (from == null) {\n from = undefined;\n }\n\n const range = {\n to,\n from\n };\n\n if (!hasAnimated(this)) {\n if (props.reverse) [to, from] = [from, to];\n from = getFluidValue(from);\n\n if (!is.und(from)) {\n this._set(from);\n } else if (!getAnimated(this)) {\n this._set(to);\n }\n }\n\n return range;\n }\n\n _update(_ref, isLoop) {\n let props = _extends$2({}, _ref);\n\n const {\n key,\n defaultProps\n } = this;\n if (props.default) Object.assign(defaultProps, getDefaultProps(props, (value, prop) => /^on/.test(prop) ? resolveProp(value, key) : value));\n mergeActiveFn(this, props, 'onProps');\n sendEvent(this, 'onProps', props, this);\n\n const range = this._prepareNode(props);\n\n if (Object.isFrozen(this)) {\n throw Error('Cannot animate a `SpringValue` object that is frozen. ' + 'Did you forget to pass your component to `animated(...)` before animating its props?');\n }\n\n const state = this._state;\n return scheduleProps(++this._lastCallId, {\n key,\n props,\n defaultProps,\n state,\n actions: {\n pause: () => {\n if (!isPaused(this)) {\n setPausedBit(this, true);\n flushCalls(state.pauseQueue);\n sendEvent(this, 'onPause', getFinishedResult(this, checkFinished(this, this.animation.to)), this);\n }\n },\n resume: () => {\n if (isPaused(this)) {\n setPausedBit(this, false);\n\n if (isAnimating(this)) {\n this._resume();\n }\n\n flushCalls(state.resumeQueue);\n sendEvent(this, 'onResume', getFinishedResult(this, checkFinished(this, this.animation.to)), this);\n }\n },\n start: this._merge.bind(this, range)\n }\n }).then(result => {\n if (props.loop && result.finished && !(isLoop && result.noop)) {\n const nextProps = createLoopUpdate(props);\n\n if (nextProps) {\n return this._update(nextProps, true);\n }\n }\n\n return result;\n });\n }\n\n _merge(range, props, resolve) {\n if (props.cancel) {\n this.stop(true);\n return resolve(getCancelledResult(this));\n }\n\n const hasToProp = !is.und(range.to);\n const hasFromProp = !is.und(range.from);\n\n if (hasToProp || hasFromProp) {\n if (props.callId > this._lastToId) {\n this._lastToId = props.callId;\n } else {\n return resolve(getCancelledResult(this));\n }\n }\n\n const {\n key,\n defaultProps,\n animation: anim\n } = this;\n const {\n to: prevTo,\n from: prevFrom\n } = anim;\n let {\n to = prevTo,\n from = prevFrom\n } = range;\n\n if (hasFromProp && !hasToProp && (!props.default || is.und(to))) {\n to = from;\n }\n\n if (props.reverse) [to, from] = [from, to];\n const hasFromChanged = !isEqual(from, prevFrom);\n\n if (hasFromChanged) {\n anim.from = from;\n }\n\n from = getFluidValue(from);\n const hasToChanged = !isEqual(to, prevTo);\n\n if (hasToChanged) {\n this._focus(to);\n }\n\n const hasAsyncTo = isAsyncTo(props.to);\n const {\n config\n } = anim;\n const {\n decay,\n velocity\n } = config;\n\n if (hasToProp || hasFromProp) {\n config.velocity = 0;\n }\n\n if (props.config && !hasAsyncTo) {\n mergeConfig(config, callProp(props.config, key), props.config !== defaultProps.config ? callProp(defaultProps.config, key) : void 0);\n }\n\n let node = getAnimated(this);\n\n if (!node || is.und(to)) {\n return resolve(getFinishedResult(this, true));\n }\n\n const reset = is.und(props.reset) ? hasFromProp && !props.default : !is.und(from) && matchProp(props.reset, key);\n const value = reset ? from : this.get();\n const goal = computeGoal(to);\n const isAnimatable = is.num(goal) || is.arr(goal) || isAnimatedString(goal);\n const immediate = !hasAsyncTo && (!isAnimatable || matchProp(defaultProps.immediate || props.immediate, key));\n\n if (hasToChanged) {\n const nodeType = getAnimatedType(to);\n\n if (nodeType !== node.constructor) {\n if (immediate) {\n node = this._set(goal);\n } else throw Error(`Cannot animate between ${node.constructor.name} and ${nodeType.name}, as the \"to\" prop suggests`);\n }\n }\n\n const goalType = node.constructor;\n let started = hasFluidValue(to);\n let finished = false;\n\n if (!started) {\n const hasValueChanged = reset || !hasAnimated(this) && hasFromChanged;\n\n if (hasToChanged || hasValueChanged) {\n finished = isEqual(computeGoal(value), goal);\n started = !finished;\n }\n\n if (!isEqual(anim.immediate, immediate) && !immediate || !isEqual(config.decay, decay) || !isEqual(config.velocity, velocity)) {\n started = true;\n }\n }\n\n if (finished && isAnimating(this)) {\n if (anim.changed && !reset) {\n started = true;\n } else if (!started) {\n this._stop(prevTo);\n }\n }\n\n if (!hasAsyncTo) {\n if (started || hasFluidValue(prevTo)) {\n anim.values = node.getPayload();\n anim.toValues = hasFluidValue(to) ? null : goalType == AnimatedString ? [1] : toArray$1(goal);\n }\n\n if (anim.immediate != immediate) {\n anim.immediate = immediate;\n\n if (!immediate && !reset) {\n this._set(prevTo);\n }\n }\n\n if (started) {\n const {\n onRest\n } = anim;\n each(ACTIVE_EVENTS, type => mergeActiveFn(this, props, type));\n const result = getFinishedResult(this, checkFinished(this, prevTo));\n flushCalls(this._pendingCalls, result);\n\n this._pendingCalls.add(resolve);\n\n if (anim.changed) raf.batchedUpdates(() => {\n anim.changed = !reset;\n onRest == null ? void 0 : onRest(result, this);\n\n if (reset) {\n callProp(defaultProps.onRest, result);\n } else {\n anim.onStart == null ? void 0 : anim.onStart(result, this);\n }\n });\n }\n }\n\n if (reset) {\n this._set(value);\n }\n\n if (hasAsyncTo) {\n resolve(runAsync(props.to, props, this._state, this));\n } else if (started) {\n this._start();\n } else if (isAnimating(this) && !hasToChanged) {\n this._pendingCalls.add(resolve);\n } else {\n resolve(getNoopResult(value));\n }\n }\n\n _focus(value) {\n const anim = this.animation;\n\n if (value !== anim.to) {\n if (getFluidObservers(this)) {\n this._detach();\n }\n\n anim.to = value;\n\n if (getFluidObservers(this)) {\n this._attach();\n }\n }\n }\n\n _attach() {\n let priority = 0;\n const {\n to\n } = this.animation;\n\n if (hasFluidValue(to)) {\n addFluidObserver(to, this);\n\n if (isFrameValue(to)) {\n priority = to.priority + 1;\n }\n }\n\n this.priority = priority;\n }\n\n _detach() {\n const {\n to\n } = this.animation;\n\n if (hasFluidValue(to)) {\n removeFluidObserver(to, this);\n }\n }\n\n _set(arg, idle = true) {\n const value = getFluidValue(arg);\n\n if (!is.und(value)) {\n const oldNode = getAnimated(this);\n\n if (!oldNode || !isEqual(value, oldNode.getValue())) {\n const nodeType = getAnimatedType(value);\n\n if (!oldNode || oldNode.constructor != nodeType) {\n setAnimated(this, nodeType.create(value));\n } else {\n oldNode.setValue(value);\n }\n\n if (oldNode) {\n raf.batchedUpdates(() => {\n this._onChange(value, idle);\n });\n }\n }\n }\n\n return getAnimated(this);\n }\n\n _onStart() {\n const anim = this.animation;\n\n if (!anim.changed) {\n anim.changed = true;\n sendEvent(this, 'onStart', getFinishedResult(this, checkFinished(this, anim.to)), this);\n }\n }\n\n _onChange(value, idle) {\n if (!idle) {\n this._onStart();\n\n callProp(this.animation.onChange, value, this);\n }\n\n callProp(this.defaultProps.onChange, value, this);\n\n super._onChange(value, idle);\n }\n\n _start() {\n const anim = this.animation;\n getAnimated(this).reset(getFluidValue(anim.to));\n\n if (!anim.immediate) {\n anim.fromValues = anim.values.map(node => node.lastPosition);\n }\n\n if (!isAnimating(this)) {\n setActiveBit(this, true);\n\n if (!isPaused(this)) {\n this._resume();\n }\n }\n }\n\n _resume() {\n if (globals.skipAnimation) {\n this.finish();\n } else {\n frameLoop.start(this);\n }\n }\n\n _stop(goal, cancel) {\n if (isAnimating(this)) {\n setActiveBit(this, false);\n const anim = this.animation;\n each(anim.values, node => {\n node.done = true;\n });\n\n if (anim.toValues) {\n anim.onChange = anim.onPause = anim.onResume = undefined;\n }\n\n callFluidObservers(this, {\n type: 'idle',\n parent: this\n });\n const result = cancel ? getCancelledResult(this.get()) : getFinishedResult(this.get(), checkFinished(this, goal != null ? goal : anim.to));\n flushCalls(this._pendingCalls, result);\n\n if (anim.changed) {\n anim.changed = false;\n sendEvent(this, 'onRest', result, this);\n }\n }\n }\n\n}\n\nfunction checkFinished(target, to) {\n const goal = computeGoal(to);\n const value = computeGoal(target.get());\n return isEqual(value, goal);\n}\n\nfunction createLoopUpdate(props, loop = props.loop, to = props.to) {\n let loopRet = callProp(loop);\n\n if (loopRet) {\n const overrides = loopRet !== true && inferTo(loopRet);\n const reverse = (overrides || props).reverse;\n const reset = !overrides || overrides.reset;\n return createUpdate(_extends$2({}, props, {\n loop,\n default: false,\n pause: undefined,\n to: !reverse || isAsyncTo(to) ? to : undefined,\n from: reset ? props.from : undefined,\n reset\n }, overrides));\n }\n}\nfunction createUpdate(props) {\n const {\n to,\n from\n } = props = inferTo(props);\n const keys = new Set();\n if (is.obj(to)) findDefined(to, keys);\n if (is.obj(from)) findDefined(from, keys);\n props.keys = keys.size ? Array.from(keys) : null;\n return props;\n}\nfunction declareUpdate(props) {\n const update = createUpdate(props);\n\n if (is.und(update.default)) {\n update.default = getDefaultProps(update);\n }\n\n return update;\n}\n\nfunction findDefined(values, keys) {\n eachProp(values, (value, key) => value != null && keys.add(key));\n}\n\nconst ACTIVE_EVENTS = ['onStart', 'onRest', 'onChange', 'onPause', 'onResume'];\n\nfunction mergeActiveFn(target, props, type) {\n target.animation[type] = props[type] !== getDefaultProp(props, type) ? resolveProp(props[type], target.key) : undefined;\n}\n\nfunction sendEvent(target, type, ...args) {\n var _target$animation$typ, _target$animation, _target$defaultProps$, _target$defaultProps;\n\n (_target$animation$typ = (_target$animation = target.animation)[type]) == null ? void 0 : _target$animation$typ.call(_target$animation, ...args);\n (_target$defaultProps$ = (_target$defaultProps = target.defaultProps)[type]) == null ? void 0 : _target$defaultProps$.call(_target$defaultProps, ...args);\n}\n\nconst BATCHED_EVENTS = ['onStart', 'onChange', 'onRest'];\nlet nextId = 1;\nclass Controller {\n constructor(props, flush) {\n this.id = nextId++;\n this.springs = {};\n this.queue = [];\n this.ref = void 0;\n this._flush = void 0;\n this._initialProps = void 0;\n this._lastAsyncId = 0;\n this._active = new Set();\n this._changed = new Set();\n this._started = false;\n this._item = void 0;\n this._state = {\n paused: false,\n pauseQueue: new Set(),\n resumeQueue: new Set(),\n timeouts: new Set()\n };\n this._events = {\n onStart: new Map(),\n onChange: new Map(),\n onRest: new Map()\n };\n this._onFrame = this._onFrame.bind(this);\n\n if (flush) {\n this._flush = flush;\n }\n\n if (props) {\n this.start(_extends$2({\n default: true\n }, props));\n }\n }\n\n get idle() {\n return !this._state.asyncTo && Object.values(this.springs).every(spring => {\n return spring.idle && !spring.isDelayed && !spring.isPaused;\n });\n }\n\n get item() {\n return this._item;\n }\n\n set item(item) {\n this._item = item;\n }\n\n get() {\n const values = {};\n this.each((spring, key) => values[key] = spring.get());\n return values;\n }\n\n set(values) {\n for (const key in values) {\n const value = values[key];\n\n if (!is.und(value)) {\n this.springs[key].set(value);\n }\n }\n }\n\n update(props) {\n if (props) {\n this.queue.push(createUpdate(props));\n }\n\n return this;\n }\n\n start(props) {\n let {\n queue\n } = this;\n\n if (props) {\n queue = toArray$1(props).map(createUpdate);\n } else {\n this.queue = [];\n }\n\n if (this._flush) {\n return this._flush(this, queue);\n }\n\n prepareKeys(this, queue);\n return flushUpdateQueue(this, queue);\n }\n\n stop(arg, keys) {\n if (arg !== !!arg) {\n keys = arg;\n }\n\n if (keys) {\n const springs = this.springs;\n each(toArray$1(keys), key => springs[key].stop(!!arg));\n } else {\n stopAsync(this._state, this._lastAsyncId);\n this.each(spring => spring.stop(!!arg));\n }\n\n return this;\n }\n\n pause(keys) {\n if (is.und(keys)) {\n this.start({\n pause: true\n });\n } else {\n const springs = this.springs;\n each(toArray$1(keys), key => springs[key].pause());\n }\n\n return this;\n }\n\n resume(keys) {\n if (is.und(keys)) {\n this.start({\n pause: false\n });\n } else {\n const springs = this.springs;\n each(toArray$1(keys), key => springs[key].resume());\n }\n\n return this;\n }\n\n each(iterator) {\n eachProp(this.springs, iterator);\n }\n\n _onFrame() {\n const {\n onStart,\n onChange,\n onRest\n } = this._events;\n const active = this._active.size > 0;\n const changed = this._changed.size > 0;\n\n if (active && !this._started || changed && !this._started) {\n this._started = true;\n flush(onStart, ([onStart, result]) => {\n result.value = this.get();\n onStart(result, this, this._item);\n });\n }\n\n const idle = !active && this._started;\n const values = changed || idle && onRest.size ? this.get() : null;\n\n if (changed && onChange.size) {\n flush(onChange, ([onChange, result]) => {\n result.value = values;\n onChange(result, this, this._item);\n });\n }\n\n if (idle) {\n this._started = false;\n flush(onRest, ([onRest, result]) => {\n result.value = values;\n onRest(result, this, this._item);\n });\n }\n }\n\n eventObserved(event) {\n if (event.type == 'change') {\n this._changed.add(event.parent);\n\n if (!event.idle) {\n this._active.add(event.parent);\n }\n } else if (event.type == 'idle') {\n this._active.delete(event.parent);\n } else return;\n\n raf.onFrame(this._onFrame);\n }\n\n}\nfunction flushUpdateQueue(ctrl, queue) {\n return Promise.all(queue.map(props => flushUpdate(ctrl, props))).then(results => getCombinedResult(ctrl, results));\n}\nasync function flushUpdate(ctrl, props, isLoop) {\n const {\n keys,\n to,\n from,\n loop,\n onRest,\n onResolve\n } = props;\n const defaults = is.obj(props.default) && props.default;\n\n if (loop) {\n props.loop = false;\n }\n\n if (to === false) props.to = null;\n if (from === false) props.from = null;\n const asyncTo = is.arr(to) || is.fun(to) ? to : undefined;\n\n if (asyncTo) {\n props.to = undefined;\n props.onRest = undefined;\n\n if (defaults) {\n defaults.onRest = undefined;\n }\n } else {\n each(BATCHED_EVENTS, key => {\n const handler = props[key];\n\n if (is.fun(handler)) {\n const queue = ctrl['_events'][key];\n\n props[key] = ({\n finished,\n cancelled\n }) => {\n const result = queue.get(handler);\n\n if (result) {\n if (!finished) result.finished = false;\n if (cancelled) result.cancelled = true;\n } else {\n queue.set(handler, {\n value: null,\n finished: finished || false,\n cancelled: cancelled || false\n });\n }\n };\n\n if (defaults) {\n defaults[key] = props[key];\n }\n }\n });\n }\n\n const state = ctrl['_state'];\n\n if (props.pause === !state.paused) {\n state.paused = props.pause;\n flushCalls(props.pause ? state.pauseQueue : state.resumeQueue);\n } else if (state.paused) {\n props.pause = true;\n }\n\n const promises = (keys || Object.keys(ctrl.springs)).map(key => ctrl.springs[key].start(props));\n const cancel = props.cancel === true || getDefaultProp(props, 'cancel') === true;\n\n if (asyncTo || cancel && state.asyncId) {\n promises.push(scheduleProps(++ctrl['_lastAsyncId'], {\n props,\n state,\n actions: {\n pause: noop,\n resume: noop,\n\n start(props, resolve) {\n if (cancel) {\n stopAsync(state, ctrl['_lastAsyncId']);\n resolve(getCancelledResult(ctrl));\n } else {\n props.onRest = onRest;\n resolve(runAsync(asyncTo, props, state, ctrl));\n }\n }\n\n }\n }));\n }\n\n if (state.paused) {\n await new Promise(resume => {\n state.resumeQueue.add(resume);\n });\n }\n\n const result = getCombinedResult(ctrl, await Promise.all(promises));\n\n if (loop && result.finished && !(isLoop && result.noop)) {\n const nextProps = createLoopUpdate(props, loop, to);\n\n if (nextProps) {\n prepareKeys(ctrl, [nextProps]);\n return flushUpdate(ctrl, nextProps, true);\n }\n }\n\n if (onResolve) {\n raf.batchedUpdates(() => onResolve(result, ctrl, ctrl.item));\n }\n\n return result;\n}\nfunction getSprings(ctrl, props) {\n const springs = _extends$2({}, ctrl.springs);\n\n if (props) {\n each(toArray$1(props), props => {\n if (is.und(props.keys)) {\n props = createUpdate(props);\n }\n\n if (!is.obj(props.to)) {\n props = _extends$2({}, props, {\n to: undefined\n });\n }\n\n prepareSprings(springs, props, key => {\n return createSpring(key);\n });\n });\n }\n\n setSprings(ctrl, springs);\n return springs;\n}\nfunction setSprings(ctrl, springs) {\n eachProp(springs, (spring, key) => {\n if (!ctrl.springs[key]) {\n ctrl.springs[key] = spring;\n addFluidObserver(spring, ctrl);\n }\n });\n}\n\nfunction createSpring(key, observer) {\n const spring = new SpringValue();\n spring.key = key;\n\n if (observer) {\n addFluidObserver(spring, observer);\n }\n\n return spring;\n}\n\nfunction prepareSprings(springs, props, create) {\n if (props.keys) {\n each(props.keys, key => {\n const spring = springs[key] || (springs[key] = create(key));\n spring['_prepareNode'](props);\n });\n }\n}\n\nfunction prepareKeys(ctrl, queue) {\n each(queue, props => {\n prepareSprings(ctrl.springs, props, key => {\n return createSpring(key, ctrl);\n });\n });\n}\n\nfunction _objectWithoutPropertiesLoose$1(source, excluded) {\n if (source == null) return {};\n var target = {};\n var sourceKeys = Object.keys(source);\n var key, i;\n\n for (i = 0; i < sourceKeys.length; i++) {\n key = sourceKeys[i];\n if (excluded.indexOf(key) >= 0) continue;\n target[key] = source[key];\n }\n\n return target;\n}\n\nconst _excluded$6 = [\"children\"];\nconst SpringContext = _ref => {\n let {\n children\n } = _ref,\n props = _objectWithoutPropertiesLoose$1(_ref, _excluded$6);\n\n const inherited = useContext(ctx);\n const pause = props.pause || !!inherited.pause,\n immediate = props.immediate || !!inherited.immediate;\n props = useMemoOne(() => ({\n pause,\n immediate\n }), [pause, immediate]);\n const {\n Provider\n } = ctx;\n return React$1.createElement(Provider, {\n value: props\n }, children);\n};\nconst ctx = makeContext(SpringContext, {});\nSpringContext.Provider = ctx.Provider;\nSpringContext.Consumer = ctx.Consumer;\n\nfunction makeContext(target, init) {\n Object.assign(target, React$1.createContext(init));\n target.Provider._context = target;\n target.Consumer._context = target;\n return target;\n}\n\nconst SpringRef = () => {\n const current = [];\n\n const SpringRef = function SpringRef(props) {\n deprecateDirectCall();\n const results = [];\n each(current, (ctrl, i) => {\n if (is.und(props)) {\n results.push(ctrl.start());\n } else {\n const update = _getProps(props, ctrl, i);\n\n if (update) {\n results.push(ctrl.start(update));\n }\n }\n });\n return results;\n };\n\n SpringRef.current = current;\n\n SpringRef.add = function (ctrl) {\n if (!current.includes(ctrl)) {\n current.push(ctrl);\n }\n };\n\n SpringRef.delete = function (ctrl) {\n const i = current.indexOf(ctrl);\n if (~i) current.splice(i, 1);\n };\n\n SpringRef.pause = function () {\n each(current, ctrl => ctrl.pause(...arguments));\n return this;\n };\n\n SpringRef.resume = function () {\n each(current, ctrl => ctrl.resume(...arguments));\n return this;\n };\n\n SpringRef.set = function (values) {\n each(current, ctrl => ctrl.set(values));\n };\n\n SpringRef.start = function (props) {\n const results = [];\n each(current, (ctrl, i) => {\n if (is.und(props)) {\n results.push(ctrl.start());\n } else {\n const update = this._getProps(props, ctrl, i);\n\n if (update) {\n results.push(ctrl.start(update));\n }\n }\n });\n return results;\n };\n\n SpringRef.stop = function () {\n each(current, ctrl => ctrl.stop(...arguments));\n return this;\n };\n\n SpringRef.update = function (props) {\n each(current, (ctrl, i) => ctrl.update(this._getProps(props, ctrl, i)));\n return this;\n };\n\n const _getProps = function _getProps(arg, ctrl, index) {\n return is.fun(arg) ? arg(index, ctrl) : arg;\n };\n\n SpringRef._getProps = _getProps;\n return SpringRef;\n};\n\nfunction useSprings(length, props, deps) {\n const propsFn = is.fun(props) && props;\n if (propsFn && !deps) deps = [];\n const ref = useMemo(() => propsFn || arguments.length == 3 ? SpringRef() : void 0, []);\n const layoutId = useRef(0);\n const forceUpdate = useForceUpdate();\n const state = useMemo(() => ({\n ctrls: [],\n queue: [],\n\n flush(ctrl, updates) {\n const springs = getSprings(ctrl, updates);\n const canFlushSync = layoutId.current > 0 && !state.queue.length && !Object.keys(springs).some(key => !ctrl.springs[key]);\n return canFlushSync ? flushUpdateQueue(ctrl, updates) : new Promise(resolve => {\n setSprings(ctrl, springs);\n state.queue.push(() => {\n resolve(flushUpdateQueue(ctrl, updates));\n });\n forceUpdate();\n });\n }\n\n }), []);\n const ctrls = useRef([...state.ctrls]);\n const updates = [];\n const prevLength = usePrev(length) || 0;\n useMemo(() => {\n each(ctrls.current.slice(length, prevLength), ctrl => {\n detachRefs(ctrl, ref);\n ctrl.stop(true);\n });\n ctrls.current.length = length;\n declareUpdates(prevLength, length);\n }, [length]);\n useMemo(() => {\n declareUpdates(0, Math.min(prevLength, length));\n }, deps);\n\n function declareUpdates(startIndex, endIndex) {\n for (let i = startIndex; i < endIndex; i++) {\n const ctrl = ctrls.current[i] || (ctrls.current[i] = new Controller(null, state.flush));\n const update = propsFn ? propsFn(i, ctrl) : props[i];\n\n if (update) {\n updates[i] = declareUpdate(update);\n }\n }\n }\n\n const springs = ctrls.current.map((ctrl, i) => getSprings(ctrl, updates[i]));\n const context = useContext(SpringContext);\n const prevContext = usePrev(context);\n const hasContext = context !== prevContext && hasProps(context);\n useIsomorphicLayoutEffect$1(() => {\n layoutId.current++;\n state.ctrls = ctrls.current;\n const {\n queue\n } = state;\n\n if (queue.length) {\n state.queue = [];\n each(queue, cb => cb());\n }\n\n each(ctrls.current, (ctrl, i) => {\n ref == null ? void 0 : ref.add(ctrl);\n\n if (hasContext) {\n ctrl.start({\n default: context\n });\n }\n\n const update = updates[i];\n\n if (update) {\n replaceRef(ctrl, update.ref);\n\n if (ctrl.ref) {\n ctrl.queue.push(update);\n } else {\n ctrl.start(update);\n }\n }\n });\n });\n useOnce(() => () => {\n each(state.ctrls, ctrl => ctrl.stop(true));\n });\n const values = springs.map(x => _extends$2({}, x));\n return ref ? [values, ref] : values;\n}\n\nfunction useSpring(props, deps) {\n const isFn = is.fun(props);\n const [[values], ref] = useSprings(1, isFn ? props : [props], isFn ? deps || [] : deps);\n return isFn || arguments.length == 2 ? [values, ref] : values;\n}\n\nlet TransitionPhase;\n\n(function (TransitionPhase) {\n TransitionPhase[\"MOUNT\"] = \"mount\";\n TransitionPhase[\"ENTER\"] = \"enter\";\n TransitionPhase[\"UPDATE\"] = \"update\";\n TransitionPhase[\"LEAVE\"] = \"leave\";\n})(TransitionPhase || (TransitionPhase = {}));\n\nclass Interpolation extends FrameValue {\n constructor(source, args) {\n super();\n this.key = void 0;\n this.idle = true;\n this.calc = void 0;\n this._active = new Set();\n this.source = source;\n this.calc = createInterpolator(...args);\n\n const value = this._get();\n\n const nodeType = getAnimatedType(value);\n setAnimated(this, nodeType.create(value));\n }\n\n advance(_dt) {\n const value = this._get();\n\n const oldValue = this.get();\n\n if (!isEqual(value, oldValue)) {\n getAnimated(this).setValue(value);\n\n this._onChange(value, this.idle);\n }\n\n if (!this.idle && checkIdle(this._active)) {\n becomeIdle(this);\n }\n }\n\n _get() {\n const inputs = is.arr(this.source) ? this.source.map(getFluidValue) : toArray$1(getFluidValue(this.source));\n return this.calc(...inputs);\n }\n\n _start() {\n if (this.idle && !checkIdle(this._active)) {\n this.idle = false;\n each(getPayload(this), node => {\n node.done = false;\n });\n\n if (globals.skipAnimation) {\n raf.batchedUpdates(() => this.advance());\n becomeIdle(this);\n } else {\n frameLoop.start(this);\n }\n }\n }\n\n _attach() {\n let priority = 1;\n each(toArray$1(this.source), source => {\n if (hasFluidValue(source)) {\n addFluidObserver(source, this);\n }\n\n if (isFrameValue(source)) {\n if (!source.idle) {\n this._active.add(source);\n }\n\n priority = Math.max(priority, source.priority + 1);\n }\n });\n this.priority = priority;\n\n this._start();\n }\n\n _detach() {\n each(toArray$1(this.source), source => {\n if (hasFluidValue(source)) {\n removeFluidObserver(source, this);\n }\n });\n\n this._active.clear();\n\n becomeIdle(this);\n }\n\n eventObserved(event) {\n if (event.type == 'change') {\n if (event.idle) {\n this.advance();\n } else {\n this._active.add(event.parent);\n\n this._start();\n }\n } else if (event.type == 'idle') {\n this._active.delete(event.parent);\n } else if (event.type == 'priority') {\n this.priority = toArray$1(this.source).reduce((highest, parent) => Math.max(highest, (isFrameValue(parent) ? parent.priority : 0) + 1), 0);\n }\n }\n\n}\n\nfunction isIdle(source) {\n return source.idle !== false;\n}\n\nfunction checkIdle(active) {\n return !active.size || Array.from(active).every(isIdle);\n}\n\nfunction becomeIdle(self) {\n if (!self.idle) {\n self.idle = true;\n each(getPayload(self), node => {\n node.done = true;\n });\n callFluidObservers(self, {\n type: 'idle',\n parent: self\n });\n }\n}\n\nglobals.assign({\n createStringInterpolator,\n to: (source, args) => new Interpolation(source, args)\n});\n\nfunction _objectWithoutPropertiesLoose(source, excluded) {\n if (source == null) return {};\n var target = {};\n var sourceKeys = Object.keys(source);\n var key, i;\n\n for (i = 0; i < sourceKeys.length; i++) {\n key = sourceKeys[i];\n if (excluded.indexOf(key) >= 0) continue;\n target[key] = source[key];\n }\n\n return target;\n}\n\nconst _excluded$2 = [\"style\", \"children\", \"scrollTop\", \"scrollLeft\", \"viewBox\"];\nconst isCustomPropRE = /^--/;\n\nfunction dangerousStyleValue(name, value) {\n if (value == null || typeof value === 'boolean' || value === '') return '';\n if (typeof value === 'number' && value !== 0 && !isCustomPropRE.test(name) && !(isUnitlessNumber.hasOwnProperty(name) && isUnitlessNumber[name])) return value + 'px';\n return ('' + value).trim();\n}\n\nconst attributeCache = {};\nfunction applyAnimatedValues(instance, props) {\n if (!instance.nodeType || !instance.setAttribute) {\n return false;\n }\n\n const isFilterElement = instance.nodeName === 'filter' || instance.parentNode && instance.parentNode.nodeName === 'filter';\n\n const _ref = props,\n {\n style,\n children,\n scrollTop,\n scrollLeft,\n viewBox\n } = _ref,\n attributes = _objectWithoutPropertiesLoose(_ref, _excluded$2);\n\n const values = Object.values(attributes);\n const names = Object.keys(attributes).map(name => isFilterElement || instance.hasAttribute(name) ? name : attributeCache[name] || (attributeCache[name] = name.replace(/([A-Z])/g, n => '-' + n.toLowerCase())));\n\n if (children !== void 0) {\n instance.textContent = children;\n }\n\n for (let name in style) {\n if (style.hasOwnProperty(name)) {\n const value = dangerousStyleValue(name, style[name]);\n\n if (isCustomPropRE.test(name)) {\n instance.style.setProperty(name, value);\n } else {\n instance.style[name] = value;\n }\n }\n }\n\n names.forEach((name, i) => {\n instance.setAttribute(name, values[i]);\n });\n\n if (scrollTop !== void 0) {\n instance.scrollTop = scrollTop;\n }\n\n if (scrollLeft !== void 0) {\n instance.scrollLeft = scrollLeft;\n }\n\n if (viewBox !== void 0) {\n instance.setAttribute('viewBox', viewBox);\n }\n}\nlet isUnitlessNumber = {\n animationIterationCount: true,\n borderImageOutset: true,\n borderImageSlice: true,\n borderImageWidth: true,\n boxFlex: true,\n boxFlexGroup: true,\n boxOrdinalGroup: true,\n columnCount: true,\n columns: true,\n flex: true,\n flexGrow: true,\n flexPositive: true,\n flexShrink: true,\n flexNegative: true,\n flexOrder: true,\n gridRow: true,\n gridRowEnd: true,\n gridRowSpan: true,\n gridRowStart: true,\n gridColumn: true,\n gridColumnEnd: true,\n gridColumnSpan: true,\n gridColumnStart: true,\n fontWeight: true,\n lineClamp: true,\n lineHeight: true,\n opacity: true,\n order: true,\n orphans: true,\n tabSize: true,\n widows: true,\n zIndex: true,\n zoom: true,\n fillOpacity: true,\n floodOpacity: true,\n stopOpacity: true,\n strokeDasharray: true,\n strokeDashoffset: true,\n strokeMiterlimit: true,\n strokeOpacity: true,\n strokeWidth: true\n};\n\nconst prefixKey = (prefix, key) => prefix + key.charAt(0).toUpperCase() + key.substring(1);\n\nconst prefixes = ['Webkit', 'Ms', 'Moz', 'O'];\nisUnitlessNumber = Object.keys(isUnitlessNumber).reduce((acc, prop) => {\n prefixes.forEach(prefix => acc[prefixKey(prefix, prop)] = acc[prop]);\n return acc;\n}, isUnitlessNumber);\n\nconst _excluded$1 = [\"x\", \"y\", \"z\"];\nconst domTransforms = /^(matrix|translate|scale|rotate|skew)/;\nconst pxTransforms = /^(translate)/;\nconst degTransforms = /^(rotate|skew)/;\n\nconst addUnit = (value, unit) => is.num(value) && value !== 0 ? value + unit : value;\n\nconst isValueIdentity = (value, id) => is.arr(value) ? value.every(v => isValueIdentity(v, id)) : is.num(value) ? value === id : parseFloat(value) === id;\n\nclass AnimatedStyle extends AnimatedObject {\n constructor(_ref) {\n let {\n x,\n y,\n z\n } = _ref,\n style = _objectWithoutPropertiesLoose(_ref, _excluded$1);\n\n const inputs = [];\n const transforms = [];\n\n if (x || y || z) {\n inputs.push([x || 0, y || 0, z || 0]);\n transforms.push(xyz => [`translate3d(${xyz.map(v => addUnit(v, 'px')).join(',')})`, isValueIdentity(xyz, 0)]);\n }\n\n eachProp(style, (value, key) => {\n if (key === 'transform') {\n inputs.push([value || '']);\n transforms.push(transform => [transform, transform === '']);\n } else if (domTransforms.test(key)) {\n delete style[key];\n if (is.und(value)) return;\n const unit = pxTransforms.test(key) ? 'px' : degTransforms.test(key) ? 'deg' : '';\n inputs.push(toArray$1(value));\n transforms.push(key === 'rotate3d' ? ([x, y, z, deg]) => [`rotate3d(${x},${y},${z},${addUnit(deg, unit)})`, isValueIdentity(deg, 0)] : input => [`${key}(${input.map(v => addUnit(v, unit)).join(',')})`, isValueIdentity(input, key.startsWith('scale') ? 1 : 0)]);\n }\n });\n\n if (inputs.length) {\n style.transform = new FluidTransform(inputs, transforms);\n }\n\n super(style);\n }\n\n}\n\nclass FluidTransform extends FluidValue {\n constructor(inputs, transforms) {\n super();\n this._value = null;\n this.inputs = inputs;\n this.transforms = transforms;\n }\n\n get() {\n return this._value || (this._value = this._get());\n }\n\n _get() {\n let transform = '';\n let identity = true;\n each(this.inputs, (input, i) => {\n const arg1 = getFluidValue(input[0]);\n const [t, id] = this.transforms[i](is.arr(arg1) ? arg1 : input.map(getFluidValue));\n transform += ' ' + t;\n identity = identity && id;\n });\n return identity ? 'none' : transform;\n }\n\n observerAdded(count) {\n if (count == 1) each(this.inputs, input => each(input, value => hasFluidValue(value) && addFluidObserver(value, this)));\n }\n\n observerRemoved(count) {\n if (count == 0) each(this.inputs, input => each(input, value => hasFluidValue(value) && removeFluidObserver(value, this)));\n }\n\n eventObserved(event) {\n if (event.type == 'change') {\n this._value = null;\n }\n\n callFluidObservers(this, event);\n }\n\n}\n\nconst primitives = ['a', 'abbr', 'address', 'area', 'article', 'aside', 'audio', 'b', 'base', 'bdi', 'bdo', 'big', 'blockquote', 'body', 'br', 'button', 'canvas', 'caption', 'cite', 'code', 'col', 'colgroup', 'data', 'datalist', 'dd', 'del', 'details', 'dfn', 'dialog', 'div', 'dl', 'dt', 'em', 'embed', 'fieldset', 'figcaption', 'figure', 'footer', 'form', 'h1', 'h2', 'h3', 'h4', 'h5', 'h6', 'head', 'header', 'hgroup', 'hr', 'html', 'i', 'iframe', 'img', 'input', 'ins', 'kbd', 'keygen', 'label', 'legend', 'li', 'link', 'main', 'map', 'mark', 'menu', 'menuitem', 'meta', 'meter', 'nav', 'noscript', 'object', 'ol', 'optgroup', 'option', 'output', 'p', 'param', 'picture', 'pre', 'progress', 'q', 'rp', 'rt', 'ruby', 's', 'samp', 'script', 'section', 'select', 'small', 'source', 'span', 'strong', 'style', 'sub', 'summary', 'sup', 'table', 'tbody', 'td', 'textarea', 'tfoot', 'th', 'thead', 'time', 'title', 'tr', 'track', 'u', 'ul', 'var', 'video', 'wbr', 'circle', 'clipPath', 'defs', 'ellipse', 'foreignObject', 'g', 'image', 'line', 'linearGradient', 'mask', 'path', 'pattern', 'polygon', 'polyline', 'radialGradient', 'rect', 'stop', 'svg', 'text', 'tspan'];\n\nconst _excluded = [\"scrollTop\", \"scrollLeft\"];\nglobals.assign({\n batchedUpdates: unstable_batchedUpdates,\n createStringInterpolator,\n colors\n});\nconst host = createHost(primitives, {\n applyAnimatedValues,\n createAnimatedStyle: style => new AnimatedStyle(style),\n getComponentProps: _ref => {\n let props = _objectWithoutPropertiesLoose(_ref, _excluded);\n\n return props;\n }\n});\nconst animated = host.animated;\n\nvar img$6 = \"data:image/png;base64,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\";\n\nvar img$5 = \"data:image/png;base64,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\";\n\nvar img$4 = \"data:image/png;base64,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\";\n\nvar img$3 = \"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAQ4AAAC+CAYAAADEDOFkAAAMbGlDQ1BJQ0MgUHJvZmlsZQAASImVVwdYU8kWnltSSWgBBKSE3gSRGkBKCC2A9CLYCEkgocSYEFTsZVHBtYsoVnRVRLGtgNixK4ti74siCsq6qIsNlTchAV33le+d75t7/5w5859yZ3LvAUDrA08qzUO1AciXFMgSwoOZo9PSmaRnAAEUQAXmwIfHl0vZcXHRAMrA/e/y7ha0hnLdWcn1z/n/KroCoZwPADIW4kyBnJ8P8UkA8PV8qawAAKJSbzW5QKrEsyHWk8EAIV6lxNkqvFOJM1X4aL9NUgIH4qsAkGk8niwbAM0HUM8s5GdDHs3PELtKBGIJAFrDIA7gi3gCiJWxD8vPn6jE5RDbQ3spxDAewMr8jjP7b/yZg/w8XvYgVuXVL+QQsVyax5v6f5bmf0t+nmLAhy0cNJEsIkGZP6zhndyJUUpMg7hLkhkTq6w1xB/EAlXdAUCpIkVEssoeNeHLObB+wABiVwEvJApiE4jDJHkx0Wp9ZpY4jAsx3C3oFHEBNwliQ4gXCuWhiWqbzbKJCWpfaG2WjMNW6y/wZP1+lb4eKXKT2Wr+NyIhV82PaRaJklIhpkJsXShOiYFYE2IXeW5ilNpmZJGIEzNgI1MkKOO3hjhBKAkPVvFjhVmysAS1fUm+fCBfbLNIzI1R4wMFoqQIVX2wM3xef/wwF+yqUMJOHuARykdHD+QiEIaEqnLHOoSS5EQ1zwdpQXCCai1OlebFqe1xS2FeuFJvCbGHvDBRvRZPKYCbU8WPZ0kL4pJUceJFObzIOFU8+DIQDTggBDCBAo5MMBHkAHFzV10X/KWaCQM8IAPZQAic1ZqBFan9MxJ4TQRF4A+IhEA+uC64f1YICqH+y6BWdXUGWf2zhf0rcsEziPNBFMiDvxX9qySD3lLAU6gR/8M7Dw4+jDcPDuX8v9cPaL9p2FATrdYoBjwytQYsiaHEEGIEMYzogBvjAbgfHg2vQXC44SzcZyCPb/aEZ4QWwhPCTUIr4e4E8VzZD1GOAq2QP0xdi8zva4HbQk5PPBj3h+yQGTfAjYEz7gH9sPFA6NkTajnquJVVYf7A/bcMvnsaajuKKwWlDKEEUex/XKnpqOk5yKKs9ff1UcWaOVhvzuDMj/4531VfAO9RP1piC7GD2HnsFHYRO4rVASZ2AqvHmrBjSjy4u572764Bbwn98eRCHvE//PHUPpWVlLtWu3a6flbNFQinFCgPHmeidKpMnC0qYLLh20HI5Er4LsOYbq5ubgAo3zWqv6+38f3vEMSg6Ztu3u8A+J/o6+s78k0XeQKA/d7w+B/+prNnAaCjAcCFw3yFrFClw5UXAvyX0IInzQiYAStgD/NxA17ADwSBUBAJYkESSAPjYZVFcJ/LwGQwHcwBxaAULAOrwTqwCWwFO8EecADUgaPgFDgHLoOr4Ca4D3dPO3gJusE70IsgCAmhIwzECDFHbBAnxA1hIQFIKBKNJCBpSAaSjUgQBTIdmYeUIiuQdcgWpArZjxxGTiEXkRbkLvIY6UTeIJ9QDKWheqgpaosOR1koG41Ck9BxaDY6CS1C56NL0HK0Et2N1qKn0MvoTbQVfYn2YADTwAwwC8wZY2EcLBZLx7IwGTYTK8HKsEqsBmuAz/k61op1YR9xIs7Ambgz3MEReDLOxyfhM/HF+Dp8J16Ln8Gv44/xbvwrgU4wITgRfAlcwmhCNmEyoZhQRthOOEQ4C89SO+EdkUg0INoRveFZTCPmEKcRFxM3EPcSTxJbiG3EHhKJZERyIvmTYkk8UgGpmLSWtJt0gnSN1E76QNYgm5PdyGHkdLKEPJdcRt5FPk6+Rn5O7qVoU2wovpRYioAylbKUso3SQLlCaaf0UnWodlR/ahI1hzqHWk6toZ6lPqC+1dDQsNTw0YjXEGvM1ijX2KdxQeOxxkeaLs2RxqGNpSloS2g7aCdpd2lv6XS6LT2Ink4voC+hV9FP0x/RP2gyNF00uZoCzVmaFZq1mtc0X2lRtGy02FrjtYq0yrQOal3R6tKmaNtqc7R52jO1K7QPa9/W7tFh6IzQidXJ11mss0vnok6HLknXVjdUV6A7X3er7mndNgbGsGJwGHzGPMY2xllGux5Rz06Pq5ejV6q3R69Zr1tfV99DP0V/in6F/jH9VgPMwNaAa5BnsNTggMEtg09DTIewhwiHLBpSM+TakPeGQw2DDIWGJYZ7DW8afjJiGoUa5RotN6ozemiMGzsaxxtPNt5ofNa4a6jeUL+h/KElQw8MvWeCmjiaJJhMM9lq0mTSY2pmGm4qNV1retq0y8zALMgsx2yV2XGzTnOGeYC52HyV+QnzF0x9JpuZxyxnnmF2W5hYRFgoLLZYNFv0WtpZJlvOtdxr+dCKasWyyrJaZdVo1W1tbj3Kerp1tfU9G4oNy0Zks8bmvM17WzvbVNsFtnW2HXaGdly7Irtquwf2dPtA+0n2lfY3HIgOLIdchw0OVx1RR09HkWOF4xUn1MnLSey0wallGGGYzzDJsMpht51pzmznQudq58cuBi7RLnNd6lxeDbcenj58+fDzw7+6errmuW5zvT9Cd0TkiLkjGka8cXN047tVuN1wp7uHuc9yr3d/7eHkIfTY6HHHk+E5ynOBZ6PnFy9vL5lXjVent7V3hvd679ssPVYcazHrgg/BJ9hnls9Rn4++Xr4Fvgd8//Rz9sv12+XXMdJupHDktpFt/pb+PP8t/q0BzICMgM0BrYEWgbzAysAnQVZBgqDtQc/ZDuwc9m72q2DXYFnwoeD3HF/ODM7JECwkPKQkpDlUNzQ5dF3oozDLsOyw6rDucM/waeEnIwgRURHLI25zTbl8bhW3O9I7ckbkmShaVGLUuqgn0Y7RsuiGUeioyFErRz2IsYmRxNTFglhu7MrYh3F2cZPijsQT4+PiK+KfJYxImJ5wPpGROCFxV+K7pOCkpUn3k+2TFcmNKVopY1OqUt6nhqSuSG0dPXz0jNGX04zTxGn16aT0lPTt6T1jQsesHtM+1nNs8dhb4+zGTRl3cbzx+LzxxyZoTeBNOJhByEjN2JXxmRfLq+T1ZHIz12d28zn8NfyXgiDBKkGn0F+4Qvg8yz9rRVZHtn/2yuxOUaCoTNQl5ojXiV/nRORsynmfG5u7I7cvLzVvbz45PyP/sERXkis5M9Fs4pSJLVInabG0dZLvpNWTumVRsu1yRD5OXl+gBz/qmxT2ip8UjwsDCisKP0xOmXxwis4UyZSmqY5TF019XhRW9Ms0fBp/WuN0i+lzpj+ewZ6xZSYyM3Nm4yyrWfNntc8On71zDnVO7pzf5rrOXTH3r3mp8xrmm86fPb/tp/Cfqos1i2XFtxf4Ldi0EF8oXti8yH3R2kVfSwQll0pdS8tKPy/mL77084ify3/uW5K1pHmp19KNy4jLJMtuLQ9cvnOFzoqiFW0rR62sXcVcVbLqr9UTVl8s8yjbtIa6RrGmtTy6vH6t9dplaz+vE627WRFcsXe9yfpF699vEGy4tjFoY80m002lmz5tFm++syV8S22lbWXZVuLWwq3PtqVsO/8L65eq7cbbS7d/2SHZ0bozYeeZKu+qql0mu5ZWo9WK6s7dY3df3ROyp77GuWbLXoO9pfvAPsW+F/sz9t86EHWg8SDrYM2vNr+uP8Q4VFKL1E6t7a4T1bXWp9W3HI483Njg13DoiMuRHUctjlYc0z+29Dj1+PzjfSeKTvSclJ7sOpV9qq1xQuP906NP3zgTf6b5bNTZC+fCzp0+zz5/4oL/haMXfS8evsS6VHfZ63Jtk2fTod88fzvU7NVce8X7Sv1Vn6sNLSNbjl8LvHbqesj1cze4Ny7fjLnZciv51p3bY2+33hHc6bibd/f1vcJ7vfdnPyA8KHmo/bDskcmjyt8dft/b6tV67HHI46YniU/ut/HbXj6VP/3cPv8Z/VnZc/PnVR1uHUc7wzqvvhjzov2l9GVvV/EfOn+sf2X/6tc/g/5s6h7d3f5a9rrvzeK3Rm93/OXxV2NPXM+jd/nvet+XfDD6sPMj6+P5T6mfnvdO/kz6XP7F4UvD16ivD/ry+/qkPBmv/1MAgwPNygLgzQ4A6GkAMGDfRh2j6gX7BVH1r/0I/Ces6hf7xQuAGvj9Ht8Fv25uA7BvG2y/IL8W7FXj6AAk+QDU3X1wqEWe5e6m4qLBPoXwqK/vLezZSCsB+LKsr6+3sq/vy1YYLOwdT0pUPahSiLBn2BzzJTM/E/wbUfWn3+X44x0oI/AAP97/BYZdkNoYik/8AAAAOGVYSWZNTQAqAAAACAABh2kABAAAAAEAAAAaAAAAAAACoAIABAAAAAEAAAEOoAMABAAAAAEAAAC+AAAAAGGtpTUAAArbSURBVHgB7d2/bhtHHgfwpRE3TmEdIBdOIdNQiriIbVwKuXAAOk+QNzjnDXKP4CfI5QliP0HuniAC4kZFdBeosBrhZBdWY+Cswmpc6OZHkIIsSjZ/S1Eakp8BNvyjneXsZ0bf7HJX406TLIeHh91S5fuy3CtLryxLg6U8KAQIzIDA29LG3cHyr/K43ul04vXYpTPumiUwHpd1/1aWXlkUAgTmS2C97M6zEiBPx9mtTwZHCYxe2dAvZemWRSFAYL4FdsvuPflUgJwZHCUw4hTkp7I8LotCgMBiCTwtu/v3EiBxWjNSTg2OwfcYv5W1uyM1vEGAwKII7JYdfVTCIx4/KCPBITQ+8PGCwKIL7BaAkfD4IDgGpyf/Lit2y6IQIEAgBHbL8kF4XIl3j5V/lOfdY689JUCAQLcQxAWSo3IUHOVo43F5Ny63KgQIEDgp0CsZ8ePwzaNTlfLmf8ub3eEPPBIgQOCEQFxhud0pV1r6RxyDo43uiZW8JECAwHGBpfKif9TRP+IowRFfiN4/vobnBAgQOEXgbTni+EunhEa3/DBOUxQCBAiMI/AoTlW+H2dN6xAgQGAgcD+Co4eDAAECCYFeBMetRAWrEiBA4F4ER5cDAQIEEgJL8eXoYaKCVQkQINDEEYdCgACBlIDgSHFZmQCBEBAcxgEBAmkBwZEmU4EAAcFhDBAgkBYQHGkyFQgQEBzGAAECaQHBkSZTgQABwWEMECCQFhAcaTIVCBAQHMYAAQJpAcGRJlOBAIHP/vnrrxQIECCQEnDEkeKyMgECISA4jAMCBNICgiNNpgIBAoLDGCBAIC0gONJkKhAgIDiMAQIE0gKCI02mAgECgsMYIEAgLSA40mQqECAgOIwBAgTSAoIjTaYCAQKCwxggQCAtIDjSZCoQICA4jAECBNICgiNNpgIBAoLDGCBAIC0gONJkKhAgIDiMAQIE0gKCI02mAgECgsMYIEAgLSA40mQqECDQOSwFAwECBDICjjgyWtYlQKAvIDgMBAIE0gKCI02mAgECgsMYIEAgLSA40mQqECAgOIwBAgTSAoIjTaYCAQKCwxggQCAtIDjSZCoQICA4jAECBNICgiNNpgIBAoLDGCBAIC0gONJkKhAgIDiMAQIE0gKCI02mAgECgsMYIEAgLSA40mQqECAgOIwBAgTSAoIjTaYCAQKCwxggQCAtIDjSZCoQICA4jAECBNICgiNNpgIBAoLDGCBAIC0gONJkKhAgIDiMAQIE0gKCI02mAgECgsMYIEAgLSA40mQqECAgOIwBAgTSAp+laxyrcHBw0Ozs7DR7r1838VwhQKBugevXrzexfHXnTnPt2rXWje0cltKm9quXL5utra3m/fv3baqrQ4DAJQpcvXq1+fru3WZlZaVVK1qdqrx586bZ3NwUGq3IVSJw+QLxP/zNP/5o4ne5TWkVHBEaCgECsy+w/eJFq51IB8f+/n5z8O5dqw9TiQCBugTiiCN+p7MlHRy+BM0SW59A3QIXEhy+DK17EGgdgaxAfFGaLekjjuXl5exnWJ8AgYoF2lyWTQdHfIjwqHgUaBqBhED8Lsd9HdmSDo74gLj+2+bwJts46xMgMD2B+B3+6zfftPqA1jeAxRcqGxsbrrC0YleJwOUKxJnD2oMHrY42ouWtgyMqxxWWuJwTd5G62hIiCoG6BfpfNdy40ayurk501jBRcNRNpHUECExLoNV3HNNqjO0SIDAbAoJjNvpJKwlUJSA4quoOjSEwGwKCYzb6SSsJVCUgOKrqDo0hMBsCgmM2+kkrCVQlIDiq6g6NITAbAoJjNvpJKwlUJWCy4qq6Q2MITFfAZMXT9bV1AnMtYLLiue5eO0dgOgImK56Oq60SWAgBkxUvRDfbSQLnK2Cy4vP1tDUCCyNgsuKF6Wo7SuD8BNrM5pe+j8N8o+fXYbZEoAYBkxXX0AvaQGCGBExWPEOdpakEahAwWXENvaANBGZIwGTFM9RZmkrgsgVMVnzZPeDzCSywQPqqygJb2XUCBAYCgsNQIEAgLSA40mQqECAgOIwBAgTSAoIjTaYCAQKCwxggQCAtIDjSZCoQICA4jAECBNICE01WHNOPvXr1qtl7/bo5ODjoL+kWqECgAoH4u42YyHfl1q3m5s2bTZs/Na9gNy6sCZ3DUtp8WgTF8+fPm4N379pUV4dAtQJxW/bDb79t2vy5ebU7dc4NaxUcQuOce8HmqhOII45H330nPM7omVbfcWxvbzvSOAPU2/MhMJwFfD725vz3olVwxASnCoF5F4hxHgGijAqkg6P/JajvNUYlvTOXAjHelVGBdHCMbsI7BOZXwBHH6X2bDo74ptmlqtMxvTt/AnGJVhkVSAdHbGL1yy9Ht+QdAnMmsLKy4n+SZ/Rpu+BYXW2uff75GZv0NoHZF4gj66/u3Jn9HZnSHrQKjjhVefjwofCYUqfY7OUKRGisPXjgHo6PdEOrG8COby9uOX/18qVbzo+jeD5zAhEWsSzfuNGsliNq3+N9vAsnDo6Pb95PCRCYR4FWpyrzCGGfCBAYX0BwjG9lTQIEBgKCw1AgQCAtIDjSZCoQICA4jAECBNICgiNNpgIBAoLDGCBAIC0gONJkKhAgMNFkxTFXwc7OztFkxTgnF+hPmFv+uOrmF1+45XlyTluYkkDrO0fjNvOtrS0zJE2pY+L2ZxPmTgnXZicWaHWqElOqbW5uCo2J+c/eQH9C6N9/909OnE3kJ5co0Co4IjSU6QtEeGy/eDH9D/IJBJIC6eDY3983w3kSeZLV9/b2HNlNAqjuVATSwWHy1qn0w5kbjTkvzXt5Jo8fXJJAOjgM4kvqKR9LoCKBdHAsLy9X1Pz5b0pMKBNXWBQCNQmkg6M/S5LwuLA+jH8AWSFQm0A6OGIHvr5719RqF9CTEdImzL0AaB+RFmh9A1hcXdnY2HCFJU0+XoXrS0vN2tqa05TxuKx1wQKtgyPaGVdY4maw4WTFF9z2ufy4uOU8bjePf9NDIVCrwETBUetOaRcBAtMVaPUdx3SbZOsECNQuIDhq7yHtI1ChgOCosFM0iUDtAoKj9h7SPgIVCgiOCjtFkwjULiA4au8h7SNQoYDgqLBTNIlA7QKCo/Ye0j4CFQoIjgo7RZMI1C4gOGrvIe0jUKGA4KiwUzSJQO0CgqP2HtI+AhUKCI4KO0WTCNQuIDhq7yHtI1ChwBWTD1fYK5pEoHKBK/65g8p7SPMIVCYQs/9dif8oBAgQGFcgDjZiBrAfS4Wfxq1kPQIEFl7ghwiOpcLwv4WnAECAwLgCt690Op23Ze31cWtYjwCBhRZ4WjJjd3g59slCU9h5AgTGFXgWK/aDoyTIenkei0KAAIGzBOJoYz1+2BmuUb7r6JXnvw1feyRAgMAJgdtxmhLvDU9VmkGS/HxiRS8JECAQAk+GoREvjo444kWUcuQRRx29eK4QIECgCPxcQiNu2zgqpwVHXJ6N8Lh/tJYnBAgsqsCfJTRGsuDoVGWoUlZ6W54/Ksv68D2PBAgspMB62eveaXs+EhyxUoRHWSI8npxWyXsECMy9QJyePIosOG1PR05VTq5UvvPolvd+KUuvLAoBAvMtsFt274cSGOsf281TjziOVygb2C1LHH3E8uz4zzwnQGBuBP5T9iQC43ZZ1j+1V5884ji5gcHftvTK+7HcK8tSWbqDx/KgECAwAwK7pY0RFn+WZX2csCjrHZX/A/bnNHU3plTqAAAAAElFTkSuQmCC\";\n\nvar img$2 = \"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABQAAAAVCAYAAABG1c6oAAAACXBIWXMAAAsTAAALEwEAmpwYAAAAAXNSR0IArs4c6QAAAARnQU1BAACxjwv8YQUAAALZSURBVHgBlVXrTRtBEN7ds2Mh5OATAim/cnQAFXCkAaACnArAFRjSAHRgUoFJBYYGgqkA+5elIHFO/L7HTr7Z23Nsg21lpPHsa76d+XbGJ8UKIaISzD7UgzahXVYpZVf8j0RR5Mdx3EiSREMphtq1Z6jmPejZWiBE5MGxEUYRQXUYhmwZrDoajS7Hk4k2Oh4TVI8mkxrWvVkMmQ14A6k0bHqC0k02bQB+xaTBK7xG0y3MpWhFyjlyNzZac4DD8bguSB+TJnPKxiyUVGVE6Wuty/Ye4wdBQpTZNq45cF23azzB0yUivNNEj3McSNkaD4enUqnHN/wASKSA2S03O9vblRzzBoKrhUKBhqPRDTbOs5uVEOUQCwXH8cW7EgPMscM4tSD+fBKGTHbAPL4GwStUB0FQE0sE6Tegml8/scpzBFJVidYniFBizjVXjbX+hmKReMWrZYAAuIKCci3gzxcYG8WxL/v9fgBCSpQxQXTUR6SfdndvxQpBZtcI6YLfnOmxy7/ln16PQ5X/uJb3H4vFI7FGuItA0TMctuyCQeWUu3oadsLp+ODvQqwXDz5XeiZltgq91bYTQg1Skm5WAVpaFR3O11EZTfD/lPnDvanwc88TRCZZcQEDlkBwVSzn7wJnPvOr4mEqCR7V+GrdlJ1Ox3Py+UPDn+O0Zh13XPdhEcz27rPpJuLapgq67BgD31HKN4eAfmvrSWd1FS/MWSFng8GgNhgOCaqtomyD/V8vL9cmKMuJh379iYE7F07a06bFYFv4kzjl9sz6eHpMqcvi5qap21zqJ1uoxy8YNHBqK0uHtyiFpXw+f4Ko7yitO2Ft+s+Dh5mCzwbEoeO2OpdE5oQT/PfzPUqSB7jXUhD0euralbnciVssPrwLyNIJAu+DEGfoqzI8PV4DkQfCceqA8kzx4hOA1O8GvV5lb29v7nPwBnAh4kPwxqBPADqX/E1RqgmgH4tAmfwFCACBSzrNB+sAAAAASUVORK5CYII=\";\n\nvar css_248z$7 = \".scanSwitch-module_cardScanAutoSwitch__6ONVZ{background-color:var(--cardscan-auto-switch-active-color);border-radius:50px;box-sizing:border-box;color:#fff;cursor:pointer;display:flex;flex-flow:row-reverse;font-size:14px;font-weight:600;justify-content:space-evenly;left:50%;line-height:1.5;padding:4px;position:fixed;top:-50px;transform:translateX(-50%);transition:all 1s ease;width:77px;z-index:9}.scanSwitch-module_cardScanAutoSwitchMobile__Bo8Za{top:10px}.scanSwitch-module_cardScanAutoSwitchMobileLandscape__GYVhq{top:16px}.scanSwitch-module_cardScanSwitchOff__x9Hne{background:var(--cardscan-auto-switch-inactive-color);flex-flow:row}\\n/*# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbInNjYW5Td2l0Y2gubW9kdWxlLnNjc3MiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsNkNBR0UseURBQTBELENBQzFELGtCQUFtQixDQUhuQixxQkFBc0IsQ0FJdEIsVUFBVyxDQVlYLGNBQWUsQ0FKZixZQUFhLENBQ2IscUJBQXNCLENBUHRCLGNBQWUsQ0FEZixlQUFnQixDQVNoQiw0QkFBNkIsQ0FKN0IsUUFBUyxDQUhULGVBQWdCLENBUWhCLFdBQVksQ0FQWixjQUFlLENBQ2YsU0FBVSxDQUVWLDBCQUEyQixDQU0zQixzQkFBdUIsQ0FoQnZCLFVBQVcsQ0FpQlgsU0FDRixDQUVBLG1EQUNFLFFBQ0YsQ0FFQSw0REFDRSxRQUNGLENBRUEsNENBQ0UscURBQXNELENBQ3RELGFBQ0YiLCJmaWxlIjoic2NhblN3aXRjaC5tb2R1bGUuc2NzcyIsInNvdXJjZXNDb250ZW50IjpbIi5jYXJkU2NhbkF1dG9Td2l0Y2gge1xuICBib3gtc2l6aW5nOiBib3JkZXItYm94O1xuICB3aWR0aDogNzdweDtcbiAgYmFja2dyb3VuZC1jb2xvcjogdmFyKC0tY2FyZHNjYW4tYXV0by1zd2l0Y2gtYWN0aXZlLWNvbG9yKTtcbiAgYm9yZGVyLXJhZGl1czogNTBweDtcbiAgY29sb3I6ICNmZmY7XG4gIGZvbnQtd2VpZ2h0OiA2MDA7XG4gIGZvbnQtc2l6ZTogMTRweDtcbiAgbGluZS1oZWlnaHQ6IDEuNTtcbiAgcG9zaXRpb246IGZpeGVkO1xuICB0b3A6IC01MHB4O1xuICBsZWZ0OiA1MCU7XG4gIHRyYW5zZm9ybTogdHJhbnNsYXRlWCgtNTAlKTtcbiAgZGlzcGxheTogZmxleDtcbiAgZmxleC1mbG93OiByb3ctcmV2ZXJzZTtcbiAganVzdGlmeS1jb250ZW50OiBzcGFjZS1ldmVubHk7XG4gIHBhZGRpbmc6IDRweDtcbiAgY3Vyc29yOiBwb2ludGVyO1xuICB0cmFuc2l0aW9uOiBhbGwgMXMgZWFzZTtcbiAgei1pbmRleDogOTtcbn1cblxuLmNhcmRTY2FuQXV0b1N3aXRjaE1vYmlsZSB7XG4gIHRvcDogMTBweDtcbn1cblxuLmNhcmRTY2FuQXV0b1N3aXRjaE1vYmlsZUxhbmRzY2FwZSB7XG4gIHRvcDogMTZweDtcbn1cblxuLmNhcmRTY2FuU3dpdGNoT2ZmIHtcbiAgYmFja2dyb3VuZDogdmFyKC0tY2FyZHNjYW4tYXV0by1zd2l0Y2gtaW5hY3RpdmUtY29sb3IpO1xuICBmbGV4LWZsb3c6IHJvdztcbn0iXX0= */\";\nvar styles$6 = {\"cardScanAutoSwitch\":\"scanSwitch-module_cardScanAutoSwitch__6ONVZ\",\"cardScanAutoSwitchMobile\":\"scanSwitch-module_cardScanAutoSwitchMobile__Bo8Za\",\"cardScanAutoSwitchMobileLandscape\":\"scanSwitch-module_cardScanAutoSwitchMobileLandscape__GYVhq\",\"cardScanSwitchOff\":\"scanSwitch-module_cardScanSwitchOff__x9Hne\"};\nstyleInject(css_248z$7);\n\nvar ScanSwitch = function (_a) {\r\n var isMobile = _a.isMobile;\r\n var _b = useGlobalContext(), isMobileOnLandscape = _b.isMobileOnLandscape, stateMachineState = _b.stateMachineState, stateMachineSend = _b.stateMachineSend;\r\n return (jsxs(\"div\", __assign$2({ \"data-cy\": \"cardScanAutoSwitch\", className: \"\".concat(styles$6.cardScanAutoSwitch, \" \").concat(stateMachineState.context.autoScan ? \"\" : styles$6.cardScanSwitchOff, \" \").concat(isMobile\r\n ? isMobileOnLandscape\r\n ? styles$6.cardScanAutoSwitchMobileLandscape\r\n : styles$6.cardScanAutoSwitchMobile\r\n : \"\"), onClick: function () { return stateMachineSend(\"TOGGLE\"); } }, { children: [jsx(\"img\", { src: img$2 }), stateMachineState.context.autoScan ? \"Auto\" : \"Off\"] })));\r\n};\r\nScanSwitch.propTypes = {\r\n isMobile: PropTypes.bool,\r\n};\n\nvar css_248z$6 = \".scanFrame-module_cardscanHelperText__BSvel{background:var(--cardscan-message-background-color);border-radius:6px;color:var(--cardscan-message-text-color);font-size:var(--cardscan-message-font-size);font-weight:400;line-height:1.5;padding:6px;text-align:center;text-transform:none;transition:all 1.5s ease;white-space:pre-line;width:fit-content}@media (min-width:680px){.scanFrame-module_cardscanHelperText__BSvel{font-size:35px;font-weight:600}}.scanFrame-module_cardscanRetryButton__4iwA9{background:#6fcf97;border:none;border-radius:13px;box-shadow:0 2px 4px rgba(0,0,0,.25);color:#dfdedf;cursor:pointer;font-family:Roboto,sans-serif;font-size:14px;font-weight:600;letter-spacing:2px;line-height:22px;outline:none;padding:6px 14px;text-align:center;text-transform:uppercase;transition:all .3s ease 0s}.scanFrame-module_cardscanRetryButton__4iwA9:active,.scanFrame-module_cardscanRetryButton__4iwA9:focus{outline:none;transform:translate(2px,2px)}.scanFrame-module_corner__S6aVE{border-color:var(--cardscan-progress-bar-color);border-radius:5px;border-style:solid;content:\\\" \\\";height:62px;position:absolute;transition:border-color .5s ease,width .75s linear,height .75s linear;width:62px}.scanFrame-module_corner__S6aVE.scanFrame-module_cardscanCornerOff__G373s{border-color:#e3eaf4}.scanFrame-module_corner1__ouwk5{border-width:5px 0 0 5px;left:-2px;top:-2px;width:var(--cardscan-corner-width)}.scanFrame-module_corner2__LR0Sj{border-width:5px 5px 0 0;height:var(--cardscan-corner-height);right:-2px;top:-2px}.scanFrame-module_corner3__SSofi{border-width:0 5px 5px 0;bottom:-2px;right:-2px;width:var(--cardscan-corner-width)}.scanFrame-module_corner4__-rkSZ{border-width:0 0 5px 5px;bottom:-2px;height:var(--cardscan-corner-height);left:-2px}.scanFrame-module_cardGuide__41-fv{aspect-ratio:5/3;border:1px solid rgba(31,45,61,.08);box-shadow:0 0 8px 0 rgba(0,0,0,.55);left:50%;max-width:calc(var(--cardscan-video-width) - 20px);position:relative;position:fixed;top:50%;transform:translate(-50%,-50%);width:calc(100% - 20px);z-index:2}@supports not (aspect-ratio:5/3){.scanFrame-module_cardGuide__41-fv:before{content:\\\"\\\";float:left;padding-top:56.25%}.scanFrame-module_cardGuide__41-fv:after{clear:both;content:\\\"\\\";display:block}}@media (min-width:641px){.scanFrame-module_cardGuide__41-fv{width:calc(100% - 200px)}}@media (min-width:1025px){.scanFrame-module_cardGuide__41-fv{height:calc(var(--cardscan-video-background-height) - 140px);width:unset}}.scanFrame-module_cardGuide__41-fv .scanFrame-module_processStatus__Z-dLU,.scanFrame-module_cardGuide__41-fv .scanFrame-module_spinnerWrapper__rxkNG{display:block}.scanFrame-module_cardGuide__41-fv .scanFrame-module_processStatus__Z-dLU,.scanFrame-module_cardGuide__41-fv .scanFrame-module_spinnerWrapper__rxkNG{align-items:center;display:flex;flex-direction:column;justify-content:center;position:absolute;top:50%;transform:translateY(-50%);width:100%}.scanFrame-module_cardGuide__41-fv .scanFrame-module_processStatus__Z-dLU img{max-width:9%}.scanFrame-module_cardGuideLandscape__FZ9pd{height:calc(100% - 40px)}\\n/*# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbInNjYW5GcmFtZS5tb2R1bGUuc2NzcyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSw0Q0FJRSxtREFBb0QsQ0FDcEQsaUJBQWtCLENBRmxCLHdDQUF5QyxDQUZ6QywyQ0FBNEMsQ0FDNUMsZUFBZ0IsQ0FVaEIsZUFBZ0IsQ0FOaEIsV0FBWSxDQUdaLGlCQUFrQixDQUVsQixtQkFBb0IsQ0FIcEIsd0JBQXlCLENBRXpCLG9CQUFxQixDQUhyQixpQkFNRixDQUNBLHlCQUNFLDRDQUNFLGNBQWUsQ0FDZixlQUNGLENBQ0YsQ0FFQSw2Q0FhRSxrQkFBbUIsQ0FEbkIsV0FBWSxDQURaLGtCQUFtQixDQUZuQixvQ0FBMkMsQ0FLM0MsYUFBYyxDQUNkLGNBQWUsQ0FkZiw2QkFBaUMsQ0FDakMsY0FBZSxDQUdmLGVBQWdCLENBRGhCLGtCQUFtQixDQUluQixnQkFBaUIsQ0FRakIsWUFBYSxDQU5iLGdCQUFpQixDQUhqQixpQkFBa0IsQ0FKbEIsd0JBQXlCLENBR3pCLDBCQVdGLENBRUEsdUdBRUUsWUFBYSxDQUNiLDRCQUNGLENBRUEsZ0NBR0UsK0NBQWdELENBSWhELGlCQUFrQixDQUhsQixrQkFBbUIsQ0FGbkIsV0FBWSxDQUlaLFdBQVksQ0FMWixpQkFBa0IsQ0FPbEIscUVBQTJFLENBSDNFLFVBSUYsQ0FDQSwwRUFDRSxvQkFDRixDQUVBLGlDQUdFLHdCQUF5QixDQUR6QixTQUFVLENBRFYsUUFBUyxDQUdULGtDQUNGLENBRUEsaUNBR0Usd0JBQXlCLENBQ3pCLG9DQUFxQyxDQUZyQyxVQUFXLENBRFgsUUFJRixDQUVBLGlDQUdFLHdCQUF5QixDQUZ6QixXQUFZLENBQ1osVUFBVyxDQUVYLGtDQUNGLENBRUEsaUNBR0Usd0JBQXlCLENBRnpCLFdBQVksQ0FHWixvQ0FBcUMsQ0FGckMsU0FHRixDQUVBLG1DQVdFLGdCQUFpQixDQVJqQixtQ0FBd0MsQ0FDeEMsb0NBQStDLENBRy9DLFFBQVMsQ0FHVCxrREFBbUQsQ0FSbkQsaUJBQWtCLENBR2xCLGNBQWUsQ0FDZixPQUFRLENBRVIsOEJBQWdDLENBQ2hDLHVCQUF3QixDQVJ4QixTQVdGLENBQ0EsaUNBQ0UsMENBR0UsVUFBVyxDQUZYLFVBQVcsQ0FDWCxrQkFFRixDQUNBLHlDQUdFLFVBQVcsQ0FEWCxVQUFXLENBRFgsYUFHRixDQUNGLENBQ0EseUJBQ0UsbUNBQ0Usd0JBQ0YsQ0FDRixDQUNBLDBCQUNFLG1DQUNFLDREQUE2RCxDQUM3RCxXQUNGLENBQ0YsQ0FDQSxxSkFFRSxhQUNGLENBV0EscUpBRUUsa0JBQW1CLENBRG5CLFlBQWEsQ0FFYixxQkFBc0IsQ0FJdEIsc0JBQXVCLENBSHZCLGlCQUFrQixDQUNsQixPQUFRLENBR1IsMEJBQTJCLENBRjNCLFVBR0YsQ0FDQSw4RUFDRSxZQUNGLENBRUEsNENBQ0Usd0JBQ0YiLCJmaWxlIjoic2NhbkZyYW1lLm1vZHVsZS5zY3NzIiwic291cmNlc0NvbnRlbnQiOlsiLmNhcmRzY2FuSGVscGVyVGV4dCB7XG4gIGZvbnQtc2l6ZTogdmFyKC0tY2FyZHNjYW4tbWVzc2FnZS1mb250LXNpemUpO1xuICBmb250LXdlaWdodDogNDAwO1xuICBjb2xvcjogdmFyKC0tY2FyZHNjYW4tbWVzc2FnZS10ZXh0LWNvbG9yKTtcbiAgYmFja2dyb3VuZDogdmFyKC0tY2FyZHNjYW4tbWVzc2FnZS1iYWNrZ3JvdW5kLWNvbG9yKTtcbiAgYm9yZGVyLXJhZGl1czogNnB4O1xuICBwYWRkaW5nOiA2cHg7XG4gIHdpZHRoOiBmaXQtY29udGVudDtcbiAgdHJhbnNpdGlvbjogYWxsIDEuNXMgZWFzZTtcbiAgdGV4dC1hbGlnbjogY2VudGVyO1xuICB3aGl0ZS1zcGFjZTogcHJlLWxpbmU7XG4gIHRleHQtdHJhbnNmb3JtOiBub25lO1xuICBsaW5lLWhlaWdodDogMS41O1xufVxuQG1lZGlhIChtaW4td2lkdGg6IDY4MHB4KSB7XG4gIC5jYXJkc2NhbkhlbHBlclRleHQge1xuICAgIGZvbnQtc2l6ZTogMzVweDtcbiAgICBmb250LXdlaWdodDogNjAwO1xuICB9XG59XG5cbi5jYXJkc2NhblJldHJ5QnV0dG9uIHtcbiAgZm9udC1mYW1pbHk6IFwiUm9ib3RvXCIsIHNhbnMtc2VyaWY7XG4gIGZvbnQtc2l6ZTogMTRweDtcbiAgdGV4dC10cmFuc2Zvcm06IHVwcGVyY2FzZTtcbiAgbGV0dGVyLXNwYWNpbmc6IDJweDtcbiAgZm9udC13ZWlnaHQ6IDYwMDtcbiAgdHJhbnNpdGlvbjogYWxsIDAuM3MgZWFzZSAwcztcbiAgdGV4dC1hbGlnbjogY2VudGVyO1xuICBsaW5lLWhlaWdodDogMjJweDtcbiAgYm94LXNoYWRvdzogMHB4IDJweCA0cHggcmdiYSgwLCAwLCAwLCAwLjI1KTtcbiAgcGFkZGluZzogNnB4IDE0cHg7XG4gIGJvcmRlci1yYWRpdXM6IDEzcHg7XG4gIGJvcmRlcjogbm9uZTtcbiAgYmFja2dyb3VuZDogIzZmY2Y5NztcbiAgY29sb3I6ICNkZmRlZGY7XG4gIGN1cnNvcjogcG9pbnRlcjtcbiAgb3V0bGluZTogbm9uZTtcbn1cblxuLmNhcmRzY2FuUmV0cnlCdXR0b246YWN0aXZlLFxuLmNhcmRzY2FuUmV0cnlCdXR0b246Zm9jdXMge1xuICBvdXRsaW5lOiBub25lO1xuICB0cmFuc2Zvcm06IHRyYW5zbGF0ZSgycHgsIDJweCk7XG59XG5cbi5jb3JuZXIge1xuICBwb3NpdGlvbjogYWJzb2x1dGU7XG4gIGNvbnRlbnQ6IFwiIFwiO1xuICBib3JkZXItY29sb3I6IHZhcigtLWNhcmRzY2FuLXByb2dyZXNzLWJhci1jb2xvcik7XG4gIGJvcmRlci1zdHlsZTogc29saWQ7XG4gIHdpZHRoOiA2MnB4O1xuICBoZWlnaHQ6IDYycHg7XG4gIGJvcmRlci1yYWRpdXM6IDVweDtcbiAgdHJhbnNpdGlvbjogYm9yZGVyLWNvbG9yIDAuNXMgZWFzZSwgd2lkdGggbGluZWFyIDAuNzVzLCBoZWlnaHQgbGluZWFyIDAuNzVzO1xufVxuLmNvcm5lci5jYXJkc2NhbkNvcm5lck9mZiB7XG4gIGJvcmRlci1jb2xvcjogI2UzZWFmNDtcbn1cblxuLmNvcm5lcjEge1xuICB0b3A6IC0ycHg7XG4gIGxlZnQ6IC0ycHg7XG4gIGJvcmRlci13aWR0aDogNXB4IDAgMCA1cHg7XG4gIHdpZHRoOiB2YXIoLS1jYXJkc2Nhbi1jb3JuZXItd2lkdGgpO1xufVxuXG4uY29ybmVyMiB7XG4gIHRvcDogLTJweDtcbiAgcmlnaHQ6IC0ycHg7XG4gIGJvcmRlci13aWR0aDogNXB4IDVweCAwIDA7XG4gIGhlaWdodDogdmFyKC0tY2FyZHNjYW4tY29ybmVyLWhlaWdodCk7XG59XG5cbi5jb3JuZXIzIHtcbiAgYm90dG9tOiAtMnB4O1xuICByaWdodDogLTJweDtcbiAgYm9yZGVyLXdpZHRoOiAwIDVweCA1cHggMDtcbiAgd2lkdGg6IHZhcigtLWNhcmRzY2FuLWNvcm5lci13aWR0aCk7XG59XG5cbi5jb3JuZXI0IHtcbiAgYm90dG9tOiAtMnB4O1xuICBsZWZ0OiAtMnB4O1xuICBib3JkZXItd2lkdGg6IDAgMCA1cHggNXB4O1xuICBoZWlnaHQ6IHZhcigtLWNhcmRzY2FuLWNvcm5lci1oZWlnaHQpO1xufVxuXG4uY2FyZEd1aWRlIHtcbiAgei1pbmRleDogMjtcbiAgcG9zaXRpb246IHJlbGF0aXZlO1xuICBib3JkZXI6IDFweCBzb2xpZCByZ2JhKDMxLCA0NSwgNjEsIDAuMDgpO1xuICBib3gtc2hhZG93OiAwcHggMHB4IDhweCAwcHggcmdiYSgwLCAwLCAwLCAwLjU1KTtcbiAgcG9zaXRpb246IGZpeGVkO1xuICB0b3A6IDUwJTtcbiAgbGVmdDogNTAlO1xuICB0cmFuc2Zvcm06IHRyYW5zbGF0ZSgtNTAlLCAtNTAlKTtcbiAgd2lkdGg6IGNhbGMoMTAwJSAtIDIwcHgpO1xuICBtYXgtd2lkdGg6IGNhbGModmFyKC0tY2FyZHNjYW4tdmlkZW8td2lkdGgpIC0gMjBweCk7XG4gIGFzcGVjdC1yYXRpbzogNS8zO1xufVxuQHN1cHBvcnRzIG5vdCAoYXNwZWN0LXJhdGlvOiA1LzMpIHtcbiAgLmNhcmRHdWlkZTo6YmVmb3JlIHtcbiAgICBmbG9hdDogbGVmdDtcbiAgICBwYWRkaW5nLXRvcDogNTYuMjUlO1xuICAgIGNvbnRlbnQ6IFwiXCI7XG4gIH1cbiAgLmNhcmRHdWlkZTphZnRlciB7XG4gICAgZGlzcGxheTogYmxvY2s7XG4gICAgY29udGVudDogXCJcIjtcbiAgICBjbGVhcjogYm90aDtcbiAgfVxufVxuQG1lZGlhIChtaW4td2lkdGg6IDY0MXB4KSB7XG4gIC5jYXJkR3VpZGUge1xuICAgIHdpZHRoOiBjYWxjKDEwMCUgLSAyMDBweCk7XG4gIH1cbn1cbkBtZWRpYSAobWluLXdpZHRoOiAxMDI1cHgpIHtcbiAgLmNhcmRHdWlkZSB7XG4gICAgaGVpZ2h0OiBjYWxjKHZhcigtLWNhcmRzY2FuLXZpZGVvLWJhY2tncm91bmQtaGVpZ2h0KSAtIDE0MHB4KTtcbiAgICB3aWR0aDogdW5zZXQ7XG4gIH1cbn1cbi5jYXJkR3VpZGUgLnNwaW5uZXJXcmFwcGVyLFxuLmNhcmRHdWlkZSAucHJvY2Vzc1N0YXR1cyB7XG4gIGRpc3BsYXk6IGJsb2NrO1xufVxuLmNhcmRHdWlkZSAuc3Bpbm5lcldyYXBwZXIge1xuICBkaXNwbGF5OiBmbGV4O1xuICBhbGlnbi1pdGVtczogY2VudGVyO1xuICBmbGV4LWRpcmVjdGlvbjogY29sdW1uO1xuICBwb3NpdGlvbjogYWJzb2x1dGU7XG4gIHRvcDogNTAlO1xuICB3aWR0aDogMTAwJTtcbiAganVzdGlmeS1jb250ZW50OiBjZW50ZXI7XG4gIHRyYW5zZm9ybTogdHJhbnNsYXRlWSgtNTAlKTtcbn1cbi5jYXJkR3VpZGUgLnByb2Nlc3NTdGF0dXMge1xuICBkaXNwbGF5OiBmbGV4O1xuICBhbGlnbi1pdGVtczogY2VudGVyO1xuICBmbGV4LWRpcmVjdGlvbjogY29sdW1uO1xuICBwb3NpdGlvbjogYWJzb2x1dGU7XG4gIHRvcDogNTAlO1xuICB3aWR0aDogMTAwJTtcbiAganVzdGlmeS1jb250ZW50OiBjZW50ZXI7XG4gIHRyYW5zZm9ybTogdHJhbnNsYXRlWSgtNTAlKTtcbn1cbi5jYXJkR3VpZGUgLnByb2Nlc3NTdGF0dXMgaW1nIHtcbiAgbWF4LXdpZHRoOiA5JTtcbn1cblxuLmNhcmRHdWlkZUxhbmRzY2FwZSB7XG4gIGhlaWdodDogY2FsYygxMDAlIC0gNDBweCk7XG59Il19 */\";\nvar scanFrameStyles = {\"cardscanHelperText\":\"scanFrame-module_cardscanHelperText__BSvel\",\"cardscanRetryButton\":\"scanFrame-module_cardscanRetryButton__4iwA9\",\"corner\":\"scanFrame-module_corner__S6aVE\",\"cardscanCornerOff\":\"scanFrame-module_cardscanCornerOff__G373s\",\"corner1\":\"scanFrame-module_corner1__ouwk5\",\"corner2\":\"scanFrame-module_corner2__LR0Sj\",\"corner3\":\"scanFrame-module_corner3__SSofi\",\"corner4\":\"scanFrame-module_corner4__-rkSZ\",\"cardGuide\":\"scanFrame-module_cardGuide__41-fv\",\"spinnerWrapper\":\"scanFrame-module_spinnerWrapper__rxkNG\",\"processStatus\":\"scanFrame-module_processStatus__Z-dLU\",\"cardGuideLandscape\":\"scanFrame-module_cardGuideLandscape__FZ9pd\"};\nstyleInject(css_248z$6);\n\nvar css_248z$5 = \".webToMobileModal-module_scanErrorModal__lMrJJ{align-items:center;background-color:#f9fbfd;border-radius:16px;box-shadow:0 8px 36px 0 rgba(0,0,0,.161);display:flex;flex-direction:column;height:500px;left:50%;padding:20px;position:absolute;text-align:center;top:50%;transform:translate(-50%,-50%);width:550px;z-index:999999}.webToMobileModal-module_scanErrorModal__lMrJJ>*{margin-bottom:16px}.webToMobileModal-module_scanErrorTitle__xn1rc{color:#000;font-size:24px;font-weight:700;text-align:center}.webToMobileModal-module_scanErrorDescription__M7bCV{color:rgba(21,25,32,.5);font-size:18px;font-weight:400;text-align:center}.webToMobileModal-module_scanErrorButton__OT-QR{border:none;border-radius:8px;font-size:14px;font-weight:600;height:42px;min-width:230px}.webToMobileModal-module_scanErrorButtonContainer__DImXw{display:flex;justify-content:space-around;width:100%}.webToMobileModal-module_scanErrorButtonSecondary__ObyA-{background:#fff;border:1px solid #566789;color:rgba(21,25,32,.5)}.webToMobileModal-module_scanErrorButtonPrimary__hqs2M{background-color:#2f80ed;color:#fff}.webToMobileModal-module_processStatus__zcTGi,.webToMobileModal-module_spinnerWrapper__lbMCo{display:block}.webToMobileModal-module_spinnerWrapper__lbMCo{display:flex;height:256px}\\n/*# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIndlYlRvTW9iaWxlTW9kYWwubW9kdWxlLnNjc3MiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsK0NBWUUsa0JBQW1CLENBVm5CLHdCQUF5QixDQUN6QixrQkFBbUIsQ0FZbkIsd0NBQXdELENBTHhELFlBQWEsQ0FDYixxQkFBc0IsQ0FOdEIsWUFBYSxDQUViLFFBQVMsQ0FPVCxZQUFhLENBYmIsaUJBQWtCLENBWWxCLGlCQUFrQixDQUxsQixPQUFRLENBQ1IsOEJBQWdDLENBTGhDLFdBQVksQ0FFWixjQVVGLENBQ0EsaURBQ0Usa0JBQ0YsQ0FFQSwrQ0FDRSxVQUFjLENBRWQsY0FBZSxDQURmLGVBQWdCLENBRWhCLGlCQUNGLENBRUEscURBQ0UsdUJBQTRCLENBQzVCLGNBQWUsQ0FDZixlQUFnQixDQUNoQixpQkFDRixDQUVBLGdEQU1FLFdBQVksQ0FIWixpQkFBa0IsQ0FFbEIsY0FBZSxDQURmLGVBQWdCLENBRmhCLFdBQVksQ0FEWixlQU1GLENBRUEseURBQ0UsWUFBYSxDQUNiLDRCQUE2QixDQUM3QixVQUNGLENBRUEseURBR0UsZUFBZ0IsQ0FGaEIsd0JBQXlCLENBQ3pCLHVCQUVGLENBRUEsdURBQ0Usd0JBQXlCLENBQ3pCLFVBQ0YsQ0FFQSw2RkFFRSxhQUNGLENBRUEsK0NBQ0UsWUFBYSxDQUNiLFlBQ0YiLCJmaWxlIjoid2ViVG9Nb2JpbGVNb2RhbC5tb2R1bGUuc2NzcyIsInNvdXJjZXNDb250ZW50IjpbIi5zY2FuRXJyb3JNb2RhbCB7XG4gIHBvc2l0aW9uOiBhYnNvbHV0ZTtcbiAgYmFja2dyb3VuZC1jb2xvcjogI2Y5ZmJmZDtcbiAgYm9yZGVyLXJhZGl1czogMTZweDtcbiAgd2lkdGg6IDU1MHB4O1xuICBoZWlnaHQ6IDUwMHB4O1xuICB6LWluZGV4OiA5OTk5OTk7XG4gIGxlZnQ6IDUwJTtcbiAgdG9wOiA1MCU7XG4gIHRyYW5zZm9ybTogdHJhbnNsYXRlKC01MCUsIC01MCUpO1xuICBkaXNwbGF5OiBmbGV4O1xuICBmbGV4LWRpcmVjdGlvbjogY29sdW1uO1xuICBhbGlnbi1pdGVtczogY2VudGVyO1xuICB0ZXh0LWFsaWduOiBjZW50ZXI7XG4gIHBhZGRpbmc6IDIwcHg7XG4gIGJveC1zaGFkb3c6IDBweCA4cHggMzZweCAwcHggcmdiYSgwLCAwLCAwLCAwLjE2MDc4NDMxMzcpO1xufVxuLnNjYW5FcnJvck1vZGFsID4gKiB7XG4gIG1hcmdpbi1ib3R0b206IDE2cHg7XG59XG5cbi5zY2FuRXJyb3JUaXRsZSB7XG4gIGNvbG9yOiAjMDAwMDAwO1xuICBmb250LXdlaWdodDogNzAwO1xuICBmb250LXNpemU6IDI0cHg7XG4gIHRleHQtYWxpZ246IGNlbnRlcjtcbn1cblxuLnNjYW5FcnJvckRlc2NyaXB0aW9uIHtcbiAgY29sb3I6IHJnYmEoMjEsIDI1LCAzMiwgMC41KTtcbiAgZm9udC1zaXplOiAxOHB4O1xuICBmb250LXdlaWdodDogNDAwO1xuICB0ZXh0LWFsaWduOiBjZW50ZXI7XG59XG5cbi5zY2FuRXJyb3JCdXR0b24ge1xuICBtaW4td2lkdGg6IDIzMHB4O1xuICBoZWlnaHQ6IDQycHg7XG4gIGJvcmRlci1yYWRpdXM6IDhweDtcbiAgZm9udC13ZWlnaHQ6IDYwMDtcbiAgZm9udC1zaXplOiAxNHB4O1xuICBib3JkZXI6IG5vbmU7XG59XG5cbi5zY2FuRXJyb3JCdXR0b25Db250YWluZXIge1xuICBkaXNwbGF5OiBmbGV4O1xuICBqdXN0aWZ5LWNvbnRlbnQ6IHNwYWNlLWFyb3VuZDtcbiAgd2lkdGg6IDEwMCU7XG59XG5cbi5zY2FuRXJyb3JCdXR0b25TZWNvbmRhcnkge1xuICBib3JkZXI6IDFweCBzb2xpZCAjNTY2Nzg5O1xuICBjb2xvcjogcmdiYSgyMSwgMjUsIDMyLCAwLjUpO1xuICBiYWNrZ3JvdW5kOiAjZmZmO1xufVxuXG4uc2NhbkVycm9yQnV0dG9uUHJpbWFyeSB7XG4gIGJhY2tncm91bmQtY29sb3I6ICMyZjgwZWQ7XG4gIGNvbG9yOiAjZmZmO1xufVxuXG4uc3Bpbm5lcldyYXBwZXIsXG4ucHJvY2Vzc1N0YXR1cyB7XG4gIGRpc3BsYXk6IGJsb2NrO1xufVxuXG4uc3Bpbm5lcldyYXBwZXIge1xuICBkaXNwbGF5OiBmbGV4O1xuICBoZWlnaHQ6IDI1NnB4O1xufSJdfQ== */\";\nvar styles$5 = {\"scanErrorModal\":\"webToMobileModal-module_scanErrorModal__lMrJJ\",\"scanErrorTitle\":\"webToMobileModal-module_scanErrorTitle__xn1rc\",\"scanErrorDescription\":\"webToMobileModal-module_scanErrorDescription__M7bCV\",\"scanErrorButton\":\"webToMobileModal-module_scanErrorButton__OT-QR\",\"scanErrorButtonContainer\":\"webToMobileModal-module_scanErrorButtonContainer__DImXw\",\"scanErrorButtonSecondary\":\"webToMobileModal-module_scanErrorButtonSecondary__ObyA-\",\"scanErrorButtonPrimary\":\"webToMobileModal-module_scanErrorButtonPrimary__hqs2M\",\"spinnerWrapper\":\"webToMobileModal-module_spinnerWrapper__lbMCo\",\"processStatus\":\"webToMobileModal-module_processStatus__zcTGi\"};\nstyleInject(css_248z$5);\n\nvar lib = {};\n\nvar mode$1 = {\n\tMODE_NUMBER :\t\t1 << 0,\n\tMODE_ALPHA_NUM : \t1 << 1,\n\tMODE_8BIT_BYTE : \t1 << 2,\n\tMODE_KANJI :\t\t1 << 3\n};\n\nvar mode = mode$1;\n\nfunction QR8bitByte(data) {\n\tthis.mode = mode.MODE_8BIT_BYTE;\n\tthis.data = data;\n}\n\nQR8bitByte.prototype = {\n\n\tgetLength : function(buffer) {\n\t\treturn this.data.length;\n\t},\n\t\n\twrite : function(buffer) {\n\t\tfor (var i = 0; i < this.data.length; i++) {\n\t\t\t// not JIS ...\n\t\t\tbuffer.put(this.data.charCodeAt(i), 8);\n\t\t}\n\t}\n};\n\nvar _8BitByte = QR8bitByte;\n\nvar ErrorCorrectLevel = {\n\tL : 1,\n\tM : 0,\n\tQ : 3,\n\tH : 2\n};\n\n// ErrorCorrectLevel\nvar ECL = ErrorCorrectLevel;\n\nfunction QRRSBlock(totalCount, dataCount) {\n\tthis.totalCount = totalCount;\n\tthis.dataCount = dataCount;\n}\n\nQRRSBlock.RS_BLOCK_TABLE = [\n\n\t// L\n\t// M\n\t// Q\n\t// H\n\n\t// 1\n\t[1, 26, 19],\n\t[1, 26, 16],\n\t[1, 26, 13],\n\t[1, 26, 9],\n\t\n\t// 2\n\t[1, 44, 34],\n\t[1, 44, 28],\n\t[1, 44, 22],\n\t[1, 44, 16],\n\n\t// 3\n\t[1, 70, 55],\n\t[1, 70, 44],\n\t[2, 35, 17],\n\t[2, 35, 13],\n\n\t// 4\t\t\n\t[1, 100, 80],\n\t[2, 50, 32],\n\t[2, 50, 24],\n\t[4, 25, 9],\n\t\n\t// 5\n\t[1, 134, 108],\n\t[2, 67, 43],\n\t[2, 33, 15, 2, 34, 16],\n\t[2, 33, 11, 2, 34, 12],\n\t\n\t// 6\n\t[2, 86, 68],\n\t[4, 43, 27],\n\t[4, 43, 19],\n\t[4, 43, 15],\n\t\n\t// 7\t\t\n\t[2, 98, 78],\n\t[4, 49, 31],\n\t[2, 32, 14, 4, 33, 15],\n\t[4, 39, 13, 1, 40, 14],\n\t\n\t// 8\n\t[2, 121, 97],\n\t[2, 60, 38, 2, 61, 39],\n\t[4, 40, 18, 2, 41, 19],\n\t[4, 40, 14, 2, 41, 15],\n\t\n\t// 9\n\t[2, 146, 116],\n\t[3, 58, 36, 2, 59, 37],\n\t[4, 36, 16, 4, 37, 17],\n\t[4, 36, 12, 4, 37, 13],\n\t\n\t// 10\t\t\n\t[2, 86, 68, 2, 87, 69],\n\t[4, 69, 43, 1, 70, 44],\n\t[6, 43, 19, 2, 44, 20],\n\t[6, 43, 15, 2, 44, 16],\n\n\t// 11\n\t[4, 101, 81],\n\t[1, 80, 50, 4, 81, 51],\n\t[4, 50, 22, 4, 51, 23],\n\t[3, 36, 12, 8, 37, 13],\n\n\t// 12\n\t[2, 116, 92, 2, 117, 93],\n\t[6, 58, 36, 2, 59, 37],\n\t[4, 46, 20, 6, 47, 21],\n\t[7, 42, 14, 4, 43, 15],\n\n\t// 13\n\t[4, 133, 107],\n\t[8, 59, 37, 1, 60, 38],\n\t[8, 44, 20, 4, 45, 21],\n\t[12, 33, 11, 4, 34, 12],\n\n\t// 14\n\t[3, 145, 115, 1, 146, 116],\n\t[4, 64, 40, 5, 65, 41],\n\t[11, 36, 16, 5, 37, 17],\n\t[11, 36, 12, 5, 37, 13],\n\n\t// 15\n\t[5, 109, 87, 1, 110, 88],\n\t[5, 65, 41, 5, 66, 42],\n\t[5, 54, 24, 7, 55, 25],\n\t[11, 36, 12],\n\n\t// 16\n\t[5, 122, 98, 1, 123, 99],\n\t[7, 73, 45, 3, 74, 46],\n\t[15, 43, 19, 2, 44, 20],\n\t[3, 45, 15, 13, 46, 16],\n\n\t// 17\n\t[1, 135, 107, 5, 136, 108],\n\t[10, 74, 46, 1, 75, 47],\n\t[1, 50, 22, 15, 51, 23],\n\t[2, 42, 14, 17, 43, 15],\n\n\t// 18\n\t[5, 150, 120, 1, 151, 121],\n\t[9, 69, 43, 4, 70, 44],\n\t[17, 50, 22, 1, 51, 23],\n\t[2, 42, 14, 19, 43, 15],\n\n\t// 19\n\t[3, 141, 113, 4, 142, 114],\n\t[3, 70, 44, 11, 71, 45],\n\t[17, 47, 21, 4, 48, 22],\n\t[9, 39, 13, 16, 40, 14],\n\n\t// 20\n\t[3, 135, 107, 5, 136, 108],\n\t[3, 67, 41, 13, 68, 42],\n\t[15, 54, 24, 5, 55, 25],\n\t[15, 43, 15, 10, 44, 16],\n\n\t// 21\n\t[4, 144, 116, 4, 145, 117],\n\t[17, 68, 42],\n\t[17, 50, 22, 6, 51, 23],\n\t[19, 46, 16, 6, 47, 17],\n\n\t// 22\n\t[2, 139, 111, 7, 140, 112],\n\t[17, 74, 46],\n\t[7, 54, 24, 16, 55, 25],\n\t[34, 37, 13],\n\n\t// 23\n\t[4, 151, 121, 5, 152, 122],\n\t[4, 75, 47, 14, 76, 48],\n\t[11, 54, 24, 14, 55, 25],\n\t[16, 45, 15, 14, 46, 16],\n\n\t// 24\n\t[6, 147, 117, 4, 148, 118],\n\t[6, 73, 45, 14, 74, 46],\n\t[11, 54, 24, 16, 55, 25],\n\t[30, 46, 16, 2, 47, 17],\n\n\t// 25\n\t[8, 132, 106, 4, 133, 107],\n\t[8, 75, 47, 13, 76, 48],\n\t[7, 54, 24, 22, 55, 25],\n\t[22, 45, 15, 13, 46, 16],\n\n\t// 26\n\t[10, 142, 114, 2, 143, 115],\n\t[19, 74, 46, 4, 75, 47],\n\t[28, 50, 22, 6, 51, 23],\n\t[33, 46, 16, 4, 47, 17],\n\n\t// 27\n\t[8, 152, 122, 4, 153, 123],\n\t[22, 73, 45, 3, 74, 46],\n\t[8, 53, 23, 26, 54, 24],\n\t[12, 45, 15, 28, 46, 16],\n\n\t// 28\n\t[3, 147, 117, 10, 148, 118],\n\t[3, 73, 45, 23, 74, 46],\n\t[4, 54, 24, 31, 55, 25],\n\t[11, 45, 15, 31, 46, 16],\n\n\t// 29\n\t[7, 146, 116, 7, 147, 117],\n\t[21, 73, 45, 7, 74, 46],\n\t[1, 53, 23, 37, 54, 24],\n\t[19, 45, 15, 26, 46, 16],\n\n\t// 30\n\t[5, 145, 115, 10, 146, 116],\n\t[19, 75, 47, 10, 76, 48],\n\t[15, 54, 24, 25, 55, 25],\n\t[23, 45, 15, 25, 46, 16],\n\n\t// 31\n\t[13, 145, 115, 3, 146, 116],\n\t[2, 74, 46, 29, 75, 47],\n\t[42, 54, 24, 1, 55, 25],\n\t[23, 45, 15, 28, 46, 16],\n\n\t// 32\n\t[17, 145, 115],\n\t[10, 74, 46, 23, 75, 47],\n\t[10, 54, 24, 35, 55, 25],\n\t[19, 45, 15, 35, 46, 16],\n\n\t// 33\n\t[17, 145, 115, 1, 146, 116],\n\t[14, 74, 46, 21, 75, 47],\n\t[29, 54, 24, 19, 55, 25],\n\t[11, 45, 15, 46, 46, 16],\n\n\t// 34\n\t[13, 145, 115, 6, 146, 116],\n\t[14, 74, 46, 23, 75, 47],\n\t[44, 54, 24, 7, 55, 25],\n\t[59, 46, 16, 1, 47, 17],\n\n\t// 35\n\t[12, 151, 121, 7, 152, 122],\n\t[12, 75, 47, 26, 76, 48],\n\t[39, 54, 24, 14, 55, 25],\n\t[22, 45, 15, 41, 46, 16],\n\n\t// 36\n\t[6, 151, 121, 14, 152, 122],\n\t[6, 75, 47, 34, 76, 48],\n\t[46, 54, 24, 10, 55, 25],\n\t[2, 45, 15, 64, 46, 16],\n\n\t// 37\n\t[17, 152, 122, 4, 153, 123],\n\t[29, 74, 46, 14, 75, 47],\n\t[49, 54, 24, 10, 55, 25],\n\t[24, 45, 15, 46, 46, 16],\n\n\t// 38\n\t[4, 152, 122, 18, 153, 123],\n\t[13, 74, 46, 32, 75, 47],\n\t[48, 54, 24, 14, 55, 25],\n\t[42, 45, 15, 32, 46, 16],\n\n\t// 39\n\t[20, 147, 117, 4, 148, 118],\n\t[40, 75, 47, 7, 76, 48],\n\t[43, 54, 24, 22, 55, 25],\n\t[10, 45, 15, 67, 46, 16],\n\n\t// 40\n\t[19, 148, 118, 6, 149, 119],\n\t[18, 75, 47, 31, 76, 48],\n\t[34, 54, 24, 34, 55, 25],\n\t[20, 45, 15, 61, 46, 16]\n];\n\nQRRSBlock.getRSBlocks = function(typeNumber, errorCorrectLevel) {\n\t\n\tvar rsBlock = QRRSBlock.getRsBlockTable(typeNumber, errorCorrectLevel);\n\t\n\tif (rsBlock == undefined) {\n\t\tthrow new Error(\"bad rs block @ typeNumber:\" + typeNumber + \"/errorCorrectLevel:\" + errorCorrectLevel);\n\t}\n\n\tvar length = rsBlock.length / 3;\n\t\n\tvar list = new Array();\n\t\n\tfor (var i = 0; i < length; i++) {\n\n\t\tvar count = rsBlock[i * 3 + 0];\n\t\tvar totalCount = rsBlock[i * 3 + 1];\n\t\tvar dataCount = rsBlock[i * 3 + 2];\n\n\t\tfor (var j = 0; j < count; j++) {\n\t\t\tlist.push(new QRRSBlock(totalCount, dataCount) );\t\n\t\t}\n\t}\n\t\n\treturn list;\n};\n\nQRRSBlock.getRsBlockTable = function(typeNumber, errorCorrectLevel) {\n\n\tswitch(errorCorrectLevel) {\n\tcase ECL.L :\n\t\treturn QRRSBlock.RS_BLOCK_TABLE[(typeNumber - 1) * 4 + 0];\n\tcase ECL.M :\n\t\treturn QRRSBlock.RS_BLOCK_TABLE[(typeNumber - 1) * 4 + 1];\n\tcase ECL.Q :\n\t\treturn QRRSBlock.RS_BLOCK_TABLE[(typeNumber - 1) * 4 + 2];\n\tcase ECL.H :\n\t\treturn QRRSBlock.RS_BLOCK_TABLE[(typeNumber - 1) * 4 + 3];\n\tdefault :\n\t\treturn undefined;\n\t}\n};\n\nvar RSBlock$1 = QRRSBlock;\n\nfunction QRBitBuffer() {\n\tthis.buffer = new Array();\n\tthis.length = 0;\n}\n\nQRBitBuffer.prototype = {\n\n\tget : function(index) {\n\t\tvar bufIndex = Math.floor(index / 8);\n\t\treturn ( (this.buffer[bufIndex] >>> (7 - index % 8) ) & 1) == 1;\n\t},\n\t\n\tput : function(num, length) {\n\t\tfor (var i = 0; i < length; i++) {\n\t\t\tthis.putBit( ( (num >>> (length - i - 1) ) & 1) == 1);\n\t\t}\n\t},\n\t\n\tgetLengthInBits : function() {\n\t\treturn this.length;\n\t},\n\t\n\tputBit : function(bit) {\n\t\n\t\tvar bufIndex = Math.floor(this.length / 8);\n\t\tif (this.buffer.length <= bufIndex) {\n\t\t\tthis.buffer.push(0);\n\t\t}\n\t\n\t\tif (bit) {\n\t\t\tthis.buffer[bufIndex] |= (0x80 >>> (this.length % 8) );\n\t\t}\n\t\n\t\tthis.length++;\n\t}\n};\n\nvar BitBuffer$1 = QRBitBuffer;\n\nvar QRMath = {\n\n\tglog : function(n) {\n\t\n\t\tif (n < 1) {\n\t\t\tthrow new Error(\"glog(\" + n + \")\");\n\t\t}\n\t\t\n\t\treturn QRMath.LOG_TABLE[n];\n\t},\n\t\n\tgexp : function(n) {\n\t\n\t\twhile (n < 0) {\n\t\t\tn += 255;\n\t\t}\n\t\n\t\twhile (n >= 256) {\n\t\t\tn -= 255;\n\t\t}\n\t\n\t\treturn QRMath.EXP_TABLE[n];\n\t},\n\t\n\tEXP_TABLE : new Array(256),\n\t\n\tLOG_TABLE : new Array(256)\n\n};\n\t\nfor (var i = 0; i < 8; i++) {\n\tQRMath.EXP_TABLE[i] = 1 << i;\n}\nfor (var i = 8; i < 256; i++) {\n\tQRMath.EXP_TABLE[i] = QRMath.EXP_TABLE[i - 4]\n\t\t^ QRMath.EXP_TABLE[i - 5]\n\t\t^ QRMath.EXP_TABLE[i - 6]\n\t\t^ QRMath.EXP_TABLE[i - 8];\n}\nfor (var i = 0; i < 255; i++) {\n\tQRMath.LOG_TABLE[QRMath.EXP_TABLE[i] ] = i;\n}\n\nvar math$2 = QRMath;\n\nvar math$1 = math$2;\n\nfunction QRPolynomial(num, shift) {\n\n\tif (num.length == undefined) {\n\t\tthrow new Error(num.length + \"/\" + shift);\n\t}\n\n\tvar offset = 0;\n\n\twhile (offset < num.length && num[offset] == 0) {\n\t\toffset++;\n\t}\n\n\tthis.num = new Array(num.length - offset + shift);\n\tfor (var i = 0; i < num.length - offset; i++) {\n\t\tthis.num[i] = num[i + offset];\n\t}\n}\n\nQRPolynomial.prototype = {\n\n\tget : function(index) {\n\t\treturn this.num[index];\n\t},\n\t\n\tgetLength : function() {\n\t\treturn this.num.length;\n\t},\n\t\n\tmultiply : function(e) {\n\t\n\t\tvar num = new Array(this.getLength() + e.getLength() - 1);\n\t\n\t\tfor (var i = 0; i < this.getLength(); i++) {\n\t\t\tfor (var j = 0; j < e.getLength(); j++) {\n\t\t\t\tnum[i + j] ^= math$1.gexp(math$1.glog(this.get(i) ) + math$1.glog(e.get(j) ) );\n\t\t\t}\n\t\t}\n\t\n\t\treturn new QRPolynomial(num, 0);\n\t},\n\t\n\tmod : function(e) {\n\t\n\t\tif (this.getLength() - e.getLength() < 0) {\n\t\t\treturn this;\n\t\t}\n\t\n\t\tvar ratio = math$1.glog(this.get(0) ) - math$1.glog(e.get(0) );\n\t\n\t\tvar num = new Array(this.getLength() );\n\t\t\n\t\tfor (var i = 0; i < this.getLength(); i++) {\n\t\t\tnum[i] = this.get(i);\n\t\t}\n\t\t\n\t\tfor (var i = 0; i < e.getLength(); i++) {\n\t\t\tnum[i] ^= math$1.gexp(math$1.glog(e.get(i) ) + ratio);\n\t\t}\n\t\n\t\t// recursive call\n\t\treturn new QRPolynomial(num, 0).mod(e);\n\t}\n};\n\nvar Polynomial$2 = QRPolynomial;\n\nvar Mode = mode$1;\nvar Polynomial$1 = Polynomial$2;\nvar math = math$2;\n\nvar QRMaskPattern = {\n\tPATTERN000 : 0,\n\tPATTERN001 : 1,\n\tPATTERN010 : 2,\n\tPATTERN011 : 3,\n\tPATTERN100 : 4,\n\tPATTERN101 : 5,\n\tPATTERN110 : 6,\n\tPATTERN111 : 7\n};\n\nvar QRUtil = {\n\n PATTERN_POSITION_TABLE : [\n\t [],\n\t [6, 18],\n\t [6, 22],\n\t [6, 26],\n\t [6, 30],\n\t [6, 34],\n\t [6, 22, 38],\n\t [6, 24, 42],\n\t [6, 26, 46],\n\t [6, 28, 50],\n\t [6, 30, 54],\t\t\n\t [6, 32, 58],\n\t [6, 34, 62],\n\t [6, 26, 46, 66],\n\t [6, 26, 48, 70],\n\t [6, 26, 50, 74],\n\t [6, 30, 54, 78],\n\t [6, 30, 56, 82],\n\t [6, 30, 58, 86],\n\t [6, 34, 62, 90],\n\t [6, 28, 50, 72, 94],\n\t [6, 26, 50, 74, 98],\n\t [6, 30, 54, 78, 102],\n\t [6, 28, 54, 80, 106],\n\t [6, 32, 58, 84, 110],\n\t [6, 30, 58, 86, 114],\n\t [6, 34, 62, 90, 118],\n\t [6, 26, 50, 74, 98, 122],\n\t [6, 30, 54, 78, 102, 126],\n\t [6, 26, 52, 78, 104, 130],\n\t [6, 30, 56, 82, 108, 134],\n\t [6, 34, 60, 86, 112, 138],\n\t [6, 30, 58, 86, 114, 142],\n\t [6, 34, 62, 90, 118, 146],\n\t [6, 30, 54, 78, 102, 126, 150],\n\t [6, 24, 50, 76, 102, 128, 154],\n\t [6, 28, 54, 80, 106, 132, 158],\n\t [6, 32, 58, 84, 110, 136, 162],\n\t [6, 26, 54, 82, 110, 138, 166],\n\t [6, 30, 58, 86, 114, 142, 170]\n ],\n\n G15 : (1 << 10) | (1 << 8) | (1 << 5) | (1 << 4) | (1 << 2) | (1 << 1) | (1 << 0),\n G18 : (1 << 12) | (1 << 11) | (1 << 10) | (1 << 9) | (1 << 8) | (1 << 5) | (1 << 2) | (1 << 0),\n G15_MASK : (1 << 14) | (1 << 12) | (1 << 10)\t| (1 << 4) | (1 << 1),\n\n getBCHTypeInfo : function(data) {\n\t var d = data << 10;\n\t while (QRUtil.getBCHDigit(d) - QRUtil.getBCHDigit(QRUtil.G15) >= 0) {\n\t\t d ^= (QRUtil.G15 << (QRUtil.getBCHDigit(d) - QRUtil.getBCHDigit(QRUtil.G15) ) ); \t\n\t }\n\t return ( (data << 10) | d) ^ QRUtil.G15_MASK;\n },\n\n getBCHTypeNumber : function(data) {\n\t var d = data << 12;\n\t while (QRUtil.getBCHDigit(d) - QRUtil.getBCHDigit(QRUtil.G18) >= 0) {\n\t\t d ^= (QRUtil.G18 << (QRUtil.getBCHDigit(d) - QRUtil.getBCHDigit(QRUtil.G18) ) ); \t\n\t }\n\t return (data << 12) | d;\n },\n\n getBCHDigit : function(data) {\n\n\t var digit = 0;\n\n\t while (data != 0) {\n\t\t digit++;\n\t\t data >>>= 1;\n\t }\n\n\t return digit;\n },\n\n getPatternPosition : function(typeNumber) {\n\t return QRUtil.PATTERN_POSITION_TABLE[typeNumber - 1];\n },\n\n getMask : function(maskPattern, i, j) {\n\t \n\t switch (maskPattern) {\n\t\t \n\t case QRMaskPattern.PATTERN000 : return (i + j) % 2 == 0;\n\t case QRMaskPattern.PATTERN001 : return i % 2 == 0;\n\t case QRMaskPattern.PATTERN010 : return j % 3 == 0;\n\t case QRMaskPattern.PATTERN011 : return (i + j) % 3 == 0;\n\t case QRMaskPattern.PATTERN100 : return (Math.floor(i / 2) + Math.floor(j / 3) ) % 2 == 0;\n\t case QRMaskPattern.PATTERN101 : return (i * j) % 2 + (i * j) % 3 == 0;\n\t case QRMaskPattern.PATTERN110 : return ( (i * j) % 2 + (i * j) % 3) % 2 == 0;\n\t case QRMaskPattern.PATTERN111 : return ( (i * j) % 3 + (i + j) % 2) % 2 == 0;\n\n\t default :\n\t\t throw new Error(\"bad maskPattern:\" + maskPattern);\n\t }\n },\n\n getErrorCorrectPolynomial : function(errorCorrectLength) {\n\n\t var a = new Polynomial$1([1], 0);\n\n\t for (var i = 0; i < errorCorrectLength; i++) {\n\t\t a = a.multiply(new Polynomial$1([1, math.gexp(i)], 0) );\n\t }\n\n\t return a;\n },\n\n getLengthInBits : function(mode, type) {\n\n\t if (1 <= type && type < 10) {\n\n\t\t // 1 - 9\n\n\t\t switch(mode) {\n\t\t case Mode.MODE_NUMBER \t: return 10;\n\t\t case Mode.MODE_ALPHA_NUM \t: return 9;\n\t\t case Mode.MODE_8BIT_BYTE\t: return 8;\n\t\t case Mode.MODE_KANJI \t: return 8;\n\t\t default :\n\t\t\t throw new Error(\"mode:\" + mode);\n\t\t }\n\n\t } else if (type < 27) {\n\n\t\t // 10 - 26\n\n\t\t switch(mode) {\n\t\t case Mode.MODE_NUMBER \t: return 12;\n\t\t case Mode.MODE_ALPHA_NUM \t: return 11;\n\t\t case Mode.MODE_8BIT_BYTE\t: return 16;\n\t\t case Mode.MODE_KANJI \t: return 10;\n\t\t default :\n\t\t\t throw new Error(\"mode:\" + mode);\n\t\t }\n\n\t } else if (type < 41) {\n\n\t\t // 27 - 40\n\n\t\t switch(mode) {\n\t\t case Mode.MODE_NUMBER \t: return 14;\n\t\t case Mode.MODE_ALPHA_NUM\t: return 13;\n\t\t case Mode.MODE_8BIT_BYTE\t: return 16;\n\t\t case Mode.MODE_KANJI \t: return 12;\n\t\t default :\n\t\t\t throw new Error(\"mode:\" + mode);\n\t\t }\n\n\t } else {\n\t\t throw new Error(\"type:\" + type);\n\t }\n },\n\n getLostPoint : function(qrCode) {\n\t \n\t var moduleCount = qrCode.getModuleCount();\n\t \n\t var lostPoint = 0;\n\t \n\t // LEVEL1\n\t \n\t for (var row = 0; row < moduleCount; row++) {\n\n\t\t for (var col = 0; col < moduleCount; col++) {\n\n\t\t\t var sameCount = 0;\n\t\t\t var dark = qrCode.isDark(row, col);\n\n\t\t\t\tfor (var r = -1; r <= 1; r++) {\n\n\t\t\t\t if (row + r < 0 || moduleCount <= row + r) {\n\t\t\t\t\t continue;\n\t\t\t\t }\n\n\t\t\t\t for (var c = -1; c <= 1; c++) {\n\n\t\t\t\t\t if (col + c < 0 || moduleCount <= col + c) {\n\t\t\t\t\t\t continue;\n\t\t\t\t\t }\n\n\t\t\t\t\t if (r == 0 && c == 0) {\n\t\t\t\t\t\t continue;\n\t\t\t\t\t }\n\n\t\t\t\t\t if (dark == qrCode.isDark(row + r, col + c) ) {\n\t\t\t\t\t\t sameCount++;\n\t\t\t\t\t }\n\t\t\t\t }\n\t\t\t }\n\n\t\t\t if (sameCount > 5) {\n\t\t\t\t lostPoint += (3 + sameCount - 5);\n\t\t\t }\n\t\t }\n\t }\n\n\t // LEVEL2\n\n\t for (var row = 0; row < moduleCount - 1; row++) {\n\t\t for (var col = 0; col < moduleCount - 1; col++) {\n\t\t\t var count = 0;\n\t\t\t if (qrCode.isDark(row, col ) ) count++;\n\t\t\t if (qrCode.isDark(row + 1, col ) ) count++;\n\t\t\t if (qrCode.isDark(row, col + 1) ) count++;\n\t\t\t if (qrCode.isDark(row + 1, col + 1) ) count++;\n\t\t\t if (count == 0 || count == 4) {\n\t\t\t\t lostPoint += 3;\n\t\t\t }\n\t\t }\n\t }\n\n\t // LEVEL3\n\n\t for (var row = 0; row < moduleCount; row++) {\n\t\t for (var col = 0; col < moduleCount - 6; col++) {\n\t\t\t if (qrCode.isDark(row, col)\n\t\t\t\t\t && !qrCode.isDark(row, col + 1)\n\t\t\t\t\t && qrCode.isDark(row, col + 2)\n\t\t\t\t\t && qrCode.isDark(row, col + 3)\n\t\t\t\t\t && qrCode.isDark(row, col + 4)\n\t\t\t\t\t && !qrCode.isDark(row, col + 5)\n\t\t\t\t\t && qrCode.isDark(row, col + 6) ) {\n\t\t\t\t lostPoint += 40;\n\t\t\t }\n\t\t }\n\t }\n\n\t for (var col = 0; col < moduleCount; col++) {\n\t\t for (var row = 0; row < moduleCount - 6; row++) {\n\t\t\t if (qrCode.isDark(row, col)\n\t\t\t\t\t && !qrCode.isDark(row + 1, col)\n\t\t\t\t\t && qrCode.isDark(row + 2, col)\n\t\t\t\t\t && qrCode.isDark(row + 3, col)\n\t\t\t\t\t && qrCode.isDark(row + 4, col)\n\t\t\t\t\t && !qrCode.isDark(row + 5, col)\n\t\t\t\t\t && qrCode.isDark(row + 6, col) ) {\n\t\t\t\t lostPoint += 40;\n\t\t\t }\n\t\t }\n\t }\n\n\t // LEVEL4\n\t \n\t var darkCount = 0;\n\n\t for (var col = 0; col < moduleCount; col++) {\n\t\t for (var row = 0; row < moduleCount; row++) {\n\t\t\t if (qrCode.isDark(row, col) ) {\n\t\t\t\t darkCount++;\n\t\t\t }\n\t\t }\n\t }\n\t \n\t var ratio = Math.abs(100 * darkCount / moduleCount / moduleCount - 50) / 5;\n\t lostPoint += ratio * 10;\n\n\t return lostPoint;\t\t\n }\n};\n\nvar util$1 = QRUtil;\n\nvar BitByte = _8BitByte;\nvar RSBlock = RSBlock$1;\nvar BitBuffer = BitBuffer$1;\nvar util = util$1;\nvar Polynomial = Polynomial$2;\n\nfunction QRCode$1(typeNumber, errorCorrectLevel) {\n\tthis.typeNumber = typeNumber;\n\tthis.errorCorrectLevel = errorCorrectLevel;\n\tthis.modules = null;\n\tthis.moduleCount = 0;\n\tthis.dataCache = null;\n\tthis.dataList = [];\n}\n\n// for client side minification\nvar proto = QRCode$1.prototype;\n\nproto.addData = function(data) {\n\tvar newData = new BitByte(data);\n\tthis.dataList.push(newData);\n\tthis.dataCache = null;\n};\n\nproto.isDark = function(row, col) {\n\tif (row < 0 || this.moduleCount <= row || col < 0 || this.moduleCount <= col) {\n\t\tthrow new Error(row + \",\" + col);\n\t}\n\treturn this.modules[row][col];\n};\n\nproto.getModuleCount = function() {\n\treturn this.moduleCount;\n};\n\nproto.make = function() {\n\t// Calculate automatically typeNumber if provided is < 1\n\tif (this.typeNumber < 1 ){\n\t\tvar typeNumber = 1;\n\t\tfor (typeNumber = 1; typeNumber < 40; typeNumber++) {\n\t\t\tvar rsBlocks = RSBlock.getRSBlocks(typeNumber, this.errorCorrectLevel);\n\n\t\t\tvar buffer = new BitBuffer();\n\t\t\tvar totalDataCount = 0;\n\t\t\tfor (var i = 0; i < rsBlocks.length; i++) {\n\t\t\t\ttotalDataCount += rsBlocks[i].dataCount;\n\t\t\t}\n\n\t\t\tfor (var i = 0; i < this.dataList.length; i++) {\n\t\t\t\tvar data = this.dataList[i];\n\t\t\t\tbuffer.put(data.mode, 4);\n\t\t\t\tbuffer.put(data.getLength(), util.getLengthInBits(data.mode, typeNumber) );\n\t\t\t\tdata.write(buffer);\n\t\t\t}\n\t\t\tif (buffer.getLengthInBits() <= totalDataCount * 8)\n\t\t\t\tbreak;\n\t\t}\n\t\tthis.typeNumber = typeNumber;\n\t}\n\tthis.makeImpl(false, this.getBestMaskPattern() );\n};\n\nproto.makeImpl = function(test, maskPattern) {\n\t\n\tthis.moduleCount = this.typeNumber * 4 + 17;\n\tthis.modules = new Array(this.moduleCount);\n\t\n\tfor (var row = 0; row < this.moduleCount; row++) {\n\t\t\n\t\tthis.modules[row] = new Array(this.moduleCount);\n\t\t\n\t\tfor (var col = 0; col < this.moduleCount; col++) {\n\t\t\tthis.modules[row][col] = null;//(col + row) % 3;\n\t\t}\n\t}\n\n\tthis.setupPositionProbePattern(0, 0);\n\tthis.setupPositionProbePattern(this.moduleCount - 7, 0);\n\tthis.setupPositionProbePattern(0, this.moduleCount - 7);\n\tthis.setupPositionAdjustPattern();\n\tthis.setupTimingPattern();\n\tthis.setupTypeInfo(test, maskPattern);\n\t\n\tif (this.typeNumber >= 7) {\n\t\tthis.setupTypeNumber(test);\n\t}\n\n\tif (this.dataCache == null) {\n\t\tthis.dataCache = QRCode$1.createData(this.typeNumber, this.errorCorrectLevel, this.dataList);\n\t}\n\n\tthis.mapData(this.dataCache, maskPattern);\n};\n\nproto.setupPositionProbePattern = function(row, col) {\n\t\n\tfor (var r = -1; r <= 7; r++) {\n\t\t\n\t\tif (row + r <= -1 || this.moduleCount <= row + r) continue;\n\t\t\n\t\tfor (var c = -1; c <= 7; c++) {\n\t\t\t\n\t\t\tif (col + c <= -1 || this.moduleCount <= col + c) continue;\n\t\t\t\n\t\t\tif ( (0 <= r && r <= 6 && (c == 0 || c == 6) )\n\t\t\t\t\t|| (0 <= c && c <= 6 && (r == 0 || r == 6) )\n\t\t\t\t\t|| (2 <= r && r <= 4 && 2 <= c && c <= 4) ) {\n\t\t\t\tthis.modules[row + r][col + c] = true;\n\t\t\t} else {\n\t\t\t\tthis.modules[row + r][col + c] = false;\n\t\t\t}\n\t\t}\t\t\n\t}\t\t\n};\n\nproto.getBestMaskPattern = function() {\n\n\tvar minLostPoint = 0;\n\tvar pattern = 0;\n\n\tfor (var i = 0; i < 8; i++) {\n\t\t\n\t\tthis.makeImpl(true, i);\n\n\t\tvar lostPoint = util.getLostPoint(this);\n\n\t\tif (i == 0 || minLostPoint > lostPoint) {\n\t\t\tminLostPoint = lostPoint;\n\t\t\tpattern = i;\n\t\t}\n\t}\n\n\treturn pattern;\n};\n\nproto.createMovieClip = function(target_mc, instance_name, depth) {\n\n\tvar qr_mc = target_mc.createEmptyMovieClip(instance_name, depth);\n\tvar cs = 1;\n\n\tthis.make();\n\n\tfor (var row = 0; row < this.modules.length; row++) {\n\t\t\n\t\tvar y = row * cs;\n\t\t\n\t\tfor (var col = 0; col < this.modules[row].length; col++) {\n\n\t\t\tvar x = col * cs;\n\t\t\tvar dark = this.modules[row][col];\n\t\t\n\t\t\tif (dark) {\n\t\t\t\tqr_mc.beginFill(0, 100);\n\t\t\t\tqr_mc.moveTo(x, y);\n\t\t\t\tqr_mc.lineTo(x + cs, y);\n\t\t\t\tqr_mc.lineTo(x + cs, y + cs);\n\t\t\t\tqr_mc.lineTo(x, y + cs);\n\t\t\t\tqr_mc.endFill();\n\t\t\t}\n\t\t}\n\t}\n\t\n\treturn qr_mc;\n};\n\nproto.setupTimingPattern = function() {\n\t\n\tfor (var r = 8; r < this.moduleCount - 8; r++) {\n\t\tif (this.modules[r][6] != null) {\n\t\t\tcontinue;\n\t\t}\n\t\tthis.modules[r][6] = (r % 2 == 0);\n\t}\n\n\tfor (var c = 8; c < this.moduleCount - 8; c++) {\n\t\tif (this.modules[6][c] != null) {\n\t\t\tcontinue;\n\t\t}\n\t\tthis.modules[6][c] = (c % 2 == 0);\n\t}\n};\n\nproto.setupPositionAdjustPattern = function() {\n\n\tvar pos = util.getPatternPosition(this.typeNumber);\n\t\n\tfor (var i = 0; i < pos.length; i++) {\n\t\n\t\tfor (var j = 0; j < pos.length; j++) {\n\t\t\n\t\t\tvar row = pos[i];\n\t\t\tvar col = pos[j];\n\t\t\t\n\t\t\tif (this.modules[row][col] != null) {\n\t\t\t\tcontinue;\n\t\t\t}\n\t\t\t\n\t\t\tfor (var r = -2; r <= 2; r++) {\n\t\t\t\n\t\t\t\tfor (var c = -2; c <= 2; c++) {\n\t\t\t\t\n\t\t\t\t\tif (r == -2 || r == 2 || c == -2 || c == 2\n\t\t\t\t\t\t\t|| (r == 0 && c == 0) ) {\n\t\t\t\t\t\tthis.modules[row + r][col + c] = true;\n\t\t\t\t\t} else {\n\t\t\t\t\t\tthis.modules[row + r][col + c] = false;\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t}\n};\n\nproto.setupTypeNumber = function(test) {\n\n\tvar bits = util.getBCHTypeNumber(this.typeNumber);\n\n\tfor (var i = 0; i < 18; i++) {\n\t\tvar mod = (!test && ( (bits >> i) & 1) == 1);\n\t\tthis.modules[Math.floor(i / 3)][i % 3 + this.moduleCount - 8 - 3] = mod;\n\t}\n\n\tfor (var i = 0; i < 18; i++) {\n\t\tvar mod = (!test && ( (bits >> i) & 1) == 1);\n\t\tthis.modules[i % 3 + this.moduleCount - 8 - 3][Math.floor(i / 3)] = mod;\n\t}\n};\n\nproto.setupTypeInfo = function(test, maskPattern) {\n\n\tvar data = (this.errorCorrectLevel << 3) | maskPattern;\n\tvar bits = util.getBCHTypeInfo(data);\n\n\t// vertical\t\t\n\tfor (var i = 0; i < 15; i++) {\n\n\t\tvar mod = (!test && ( (bits >> i) & 1) == 1);\n\n\t\tif (i < 6) {\n\t\t\tthis.modules[i][8] = mod;\n\t\t} else if (i < 8) {\n\t\t\tthis.modules[i + 1][8] = mod;\n\t\t} else {\n\t\t\tthis.modules[this.moduleCount - 15 + i][8] = mod;\n\t\t}\n\t}\n\n\t// horizontal\n\tfor (var i = 0; i < 15; i++) {\n\n\t\tvar mod = (!test && ( (bits >> i) & 1) == 1);\n\t\t\n\t\tif (i < 8) {\n\t\t\tthis.modules[8][this.moduleCount - i - 1] = mod;\n\t\t} else if (i < 9) {\n\t\t\tthis.modules[8][15 - i - 1 + 1] = mod;\n\t\t} else {\n\t\t\tthis.modules[8][15 - i - 1] = mod;\n\t\t}\n\t}\n\n\t// fixed module\n\tthis.modules[this.moduleCount - 8][8] = (!test);\n};\n\nproto.mapData = function(data, maskPattern) {\n\t\n\tvar inc = -1;\n\tvar row = this.moduleCount - 1;\n\tvar bitIndex = 7;\n\tvar byteIndex = 0;\n\t\n\tfor (var col = this.moduleCount - 1; col > 0; col -= 2) {\n\n\t\tif (col == 6) col--;\n\n\t\twhile (true) {\n\n\t\t\tfor (var c = 0; c < 2; c++) {\n\t\t\t\t\n\t\t\t\tif (this.modules[row][col - c] == null) {\n\t\t\t\t\t\n\t\t\t\t\tvar dark = false;\n\n\t\t\t\t\tif (byteIndex < data.length) {\n\t\t\t\t\t\tdark = ( ( (data[byteIndex] >>> bitIndex) & 1) == 1);\n\t\t\t\t\t}\n\n\t\t\t\t\tvar mask = util.getMask(maskPattern, row, col - c);\n\n\t\t\t\t\tif (mask) {\n\t\t\t\t\t\tdark = !dark;\n\t\t\t\t\t}\n\t\t\t\t\t\n\t\t\t\t\tthis.modules[row][col - c] = dark;\n\t\t\t\t\tbitIndex--;\n\n\t\t\t\t\tif (bitIndex == -1) {\n\t\t\t\t\t\tbyteIndex++;\n\t\t\t\t\t\tbitIndex = 7;\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\t\t\t\t\t\t\t\n\t\t\trow += inc;\n\n\t\t\tif (row < 0 || this.moduleCount <= row) {\n\t\t\t\trow -= inc;\n\t\t\t\tinc = -inc;\n\t\t\t\tbreak;\n\t\t\t}\n\t\t}\n\t}\n};\n\nQRCode$1.PAD0 = 0xEC;\nQRCode$1.PAD1 = 0x11;\n\nQRCode$1.createData = function(typeNumber, errorCorrectLevel, dataList) {\n\t\n\tvar rsBlocks = RSBlock.getRSBlocks(typeNumber, errorCorrectLevel);\n\t\n\tvar buffer = new BitBuffer();\n\t\n\tfor (var i = 0; i < dataList.length; i++) {\n\t\tvar data = dataList[i];\n\t\tbuffer.put(data.mode, 4);\n\t\tbuffer.put(data.getLength(), util.getLengthInBits(data.mode, typeNumber) );\n\t\tdata.write(buffer);\n\t}\n\n\t// calc num max data.\n\tvar totalDataCount = 0;\n\tfor (var i = 0; i < rsBlocks.length; i++) {\n\t\ttotalDataCount += rsBlocks[i].dataCount;\n\t}\n\n\tif (buffer.getLengthInBits() > totalDataCount * 8) {\n\t\tthrow new Error(\"code length overflow. (\"\n\t\t\t+ buffer.getLengthInBits()\n\t\t\t+ \">\"\n\t\t\t+ totalDataCount * 8\n\t\t\t+ \")\");\n\t}\n\n\t// end code\n\tif (buffer.getLengthInBits() + 4 <= totalDataCount * 8) {\n\t\tbuffer.put(0, 4);\n\t}\n\n\t// padding\n\twhile (buffer.getLengthInBits() % 8 != 0) {\n\t\tbuffer.putBit(false);\n\t}\n\n\t// padding\n\twhile (true) {\n\t\t\n\t\tif (buffer.getLengthInBits() >= totalDataCount * 8) {\n\t\t\tbreak;\n\t\t}\n\t\tbuffer.put(QRCode$1.PAD0, 8);\n\t\t\n\t\tif (buffer.getLengthInBits() >= totalDataCount * 8) {\n\t\t\tbreak;\n\t\t}\n\t\tbuffer.put(QRCode$1.PAD1, 8);\n\t}\n\n\treturn QRCode$1.createBytes(buffer, rsBlocks);\n};\n\nQRCode$1.createBytes = function(buffer, rsBlocks) {\n\n\tvar offset = 0;\n\t\n\tvar maxDcCount = 0;\n\tvar maxEcCount = 0;\n\t\n\tvar dcdata = new Array(rsBlocks.length);\n\tvar ecdata = new Array(rsBlocks.length);\n\t\n\tfor (var r = 0; r < rsBlocks.length; r++) {\n\n\t\tvar dcCount = rsBlocks[r].dataCount;\n\t\tvar ecCount = rsBlocks[r].totalCount - dcCount;\n\n\t\tmaxDcCount = Math.max(maxDcCount, dcCount);\n\t\tmaxEcCount = Math.max(maxEcCount, ecCount);\n\t\t\n\t\tdcdata[r] = new Array(dcCount);\n\t\t\n\t\tfor (var i = 0; i < dcdata[r].length; i++) {\n\t\t\tdcdata[r][i] = 0xff & buffer.buffer[i + offset];\n\t\t}\n\t\toffset += dcCount;\n\t\t\n\t\tvar rsPoly = util.getErrorCorrectPolynomial(ecCount);\n\t\tvar rawPoly = new Polynomial(dcdata[r], rsPoly.getLength() - 1);\n\n\t\tvar modPoly = rawPoly.mod(rsPoly);\n\t\tecdata[r] = new Array(rsPoly.getLength() - 1);\n\t\tfor (var i = 0; i < ecdata[r].length; i++) {\n var modIndex = i + modPoly.getLength() - ecdata[r].length;\n\t\t\tecdata[r][i] = (modIndex >= 0)? modPoly.get(modIndex) : 0;\n\t\t}\n\n\t}\n\t\n\tvar totalCodeCount = 0;\n\tfor (var i = 0; i < rsBlocks.length; i++) {\n\t\ttotalCodeCount += rsBlocks[i].totalCount;\n\t}\n\n\tvar data = new Array(totalCodeCount);\n\tvar index = 0;\n\n\tfor (var i = 0; i < maxDcCount; i++) {\n\t\tfor (var r = 0; r < rsBlocks.length; r++) {\n\t\t\tif (i < dcdata[r].length) {\n\t\t\t\tdata[index++] = dcdata[r][i];\n\t\t\t}\n\t\t}\n\t}\n\n\tfor (var i = 0; i < maxEcCount; i++) {\n\t\tfor (var r = 0; r < rsBlocks.length; r++) {\n\t\t\tif (i < ecdata[r].length) {\n\t\t\t\tdata[index++] = ecdata[r][i];\n\t\t\t}\n\t\t}\n\t}\n\n\treturn data;\n};\n\nvar QRCode_1 = QRCode$1;\n\nvar QRCodeSvg$1 = {};\n\nObject.defineProperty(QRCodeSvg$1, \"__esModule\", {\n value: true\n});\n\nvar _extends$1 = Object.assign || function (target) { for (var i = 1; i < arguments.length; i++) { var source = arguments[i]; for (var key in source) { if (Object.prototype.hasOwnProperty.call(source, key)) { target[key] = source[key]; } } } return target; };\n\nvar _propTypes$1 = propTypes$2.exports;\n\nvar _propTypes2$1 = _interopRequireDefault$1(_propTypes$1);\n\nvar _react$1 = React__default$1;\n\nvar _react2$1 = _interopRequireDefault$1(_react$1);\n\nfunction _interopRequireDefault$1(obj) { return obj && obj.__esModule ? obj : { default: obj }; }\n\nfunction _objectWithoutProperties$1(obj, keys) { var target = {}; for (var i in obj) { if (keys.indexOf(i) >= 0) continue; if (!Object.prototype.hasOwnProperty.call(obj, i)) continue; target[i] = obj[i]; } return target; }\n\nvar propTypes$1 = {\n bgColor: _propTypes2$1.default.oneOfType([_propTypes2$1.default.object, _propTypes2$1.default.string]).isRequired,\n bgD: _propTypes2$1.default.string.isRequired,\n fgColor: _propTypes2$1.default.oneOfType([_propTypes2$1.default.object, _propTypes2$1.default.string]).isRequired,\n fgD: _propTypes2$1.default.string.isRequired,\n size: _propTypes2$1.default.number.isRequired,\n title: _propTypes2$1.default.string,\n viewBoxSize: _propTypes2$1.default.number.isRequired,\n xmlns: _propTypes2$1.default.string\n};\n\nvar defaultProps$1 = {\n title: undefined,\n xmlns: \"http://www.w3.org/2000/svg\"\n};\n\nvar QRCodeSvg = (0, _react$1.forwardRef)(function (_ref, ref) {\n var bgColor = _ref.bgColor,\n bgD = _ref.bgD,\n fgD = _ref.fgD,\n fgColor = _ref.fgColor,\n size = _ref.size,\n title = _ref.title,\n viewBoxSize = _ref.viewBoxSize,\n props = _objectWithoutProperties$1(_ref, [\"bgColor\", \"bgD\", \"fgD\", \"fgColor\", \"size\", \"title\", \"viewBoxSize\"]);\n\n return _react2$1.default.createElement(\n \"svg\",\n _extends$1({}, props, { height: size, ref: ref, viewBox: \"0 0 \" + viewBoxSize + \" \" + viewBoxSize, width: size }),\n title ? _react2$1.default.createElement(\n \"title\",\n null,\n title\n ) : null,\n _react2$1.default.createElement(\"path\", { d: bgD, fill: bgColor }),\n _react2$1.default.createElement(\"path\", { d: fgD, fill: fgColor })\n );\n});\n\nQRCodeSvg.displayName = \"QRCodeSvg\";\nQRCodeSvg.propTypes = propTypes$1;\nQRCodeSvg.defaultProps = defaultProps$1;\n\nQRCodeSvg$1.default = QRCodeSvg;\n\nObject.defineProperty(lib, \"__esModule\", {\n value: true\n});\nlib.QRCode = undefined;\n\nvar _extends = Object.assign || function (target) { for (var i = 1; i < arguments.length; i++) { var source = arguments[i]; for (var key in source) { if (Object.prototype.hasOwnProperty.call(source, key)) { target[key] = source[key]; } } } return target; };\n\nvar _QRCode = QRCode_1;\n\nvar _QRCode2 = _interopRequireDefault(_QRCode);\n\nvar _ErrorCorrectLevel = ErrorCorrectLevel;\n\nvar _ErrorCorrectLevel2 = _interopRequireDefault(_ErrorCorrectLevel);\n\nvar _propTypes = propTypes$2.exports;\n\nvar _propTypes2 = _interopRequireDefault(_propTypes);\n\nvar _react = React__default$1;\n\nvar _react2 = _interopRequireDefault(_react);\n\nvar _QRCodeSvg = QRCodeSvg$1;\n\nvar _QRCodeSvg2 = _interopRequireDefault(_QRCodeSvg);\n\nfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }\n\nfunction _objectWithoutProperties(obj, keys) { var target = {}; for (var i in obj) { if (keys.indexOf(i) >= 0) continue; if (!Object.prototype.hasOwnProperty.call(obj, i)) continue; target[i] = obj[i]; } return target; } // A `qr.js` doesn't handle error level of zero (M) so we need to do it right, thus the deep require.\n\n\nvar propTypes = {\n bgColor: _propTypes2.default.oneOfType([_propTypes2.default.object, _propTypes2.default.string]),\n fgColor: _propTypes2.default.oneOfType([_propTypes2.default.object, _propTypes2.default.string]),\n level: _propTypes2.default.string,\n size: _propTypes2.default.number,\n value: _propTypes2.default.string.isRequired\n};\n\nvar defaultProps = {\n bgColor: \"#FFFFFF\",\n fgColor: \"#000000\",\n level: \"L\",\n size: 256\n};\n\nvar QRCode = (0, _react.forwardRef)(function (_ref, ref) {\n var bgColor = _ref.bgColor,\n fgColor = _ref.fgColor,\n level = _ref.level,\n size = _ref.size,\n value = _ref.value,\n props = _objectWithoutProperties(_ref, [\"bgColor\", \"fgColor\", \"level\", \"size\", \"value\"]);\n\n // Use type === -1 to automatically pick the best type.\n var qrcode = new _QRCode2.default(-1, _ErrorCorrectLevel2.default[level]);\n qrcode.addData(value);\n qrcode.make();\n var cells = qrcode.modules;\n return _react2.default.createElement(_QRCodeSvg2.default, _extends({}, props, {\n bgColor: bgColor,\n bgD: cells.map(function (row, rowIndex) {\n return row.map(function (cell, cellIndex) {\n return !cell ? \"M \" + cellIndex + \" \" + rowIndex + \" l 1 0 0 1 -1 0 Z\" : \"\";\n }).join(\" \");\n }).join(\" \"),\n fgColor: fgColor,\n fgD: cells.map(function (row, rowIndex) {\n return row.map(function (cell, cellIndex) {\n return cell ? \"M \" + cellIndex + \" \" + rowIndex + \" l 1 0 0 1 -1 0 Z\" : \"\";\n }).join(\" \");\n }).join(\" \"),\n ref: ref,\n size: size,\n viewBoxSize: cells.length\n }));\n});\n\nlib.QRCode = QRCode;\nQRCode.displayName = \"QRCode\";\nQRCode.propTypes = propTypes;\nQRCode.defaultProps = defaultProps;\n\nvar _default = lib.default = QRCode;\n\nvar WebToMobileModal = function (_a) {\r\n var enableModel = _a.enableModel, cardScanApi = _a.cardScanApi, webToMobileHandoffConfig = _a.webToMobileHandoffConfig, spinnerOptions = _a.spinnerOptions;\r\n var _b = useState(\"\"), webToMobileLink = _b[0], setWebToMobileLink = _b[1];\r\n useEffect(function () {\r\n var _a;\r\n if (enableModel &&\r\n cardScanApi.current.sessionToken &&\r\n webToMobileHandoffConfig) {\r\n (_a = cardScanApi === null || cardScanApi === void 0 ? void 0 : cardScanApi.current) === null || _a === void 0 ? void 0 : _a.generateMagicLink().then(function (res) {\r\n setWebToMobileLink(\"\".concat(webToMobileHandoffConfig === null || webToMobileHandoffConfig === void 0 ? void 0 : webToMobileHandoffConfig.urlBase, \"/?token=\").concat(res.data.token, \"&companyName=\").concat(webToMobileHandoffConfig === null || webToMobileHandoffConfig === void 0 ? void 0 : webToMobileHandoffConfig.companyName));\r\n }).catch(function (error) {\r\n console.log(error);\r\n //_handleError(error, stateMachineSend, onError);\r\n });\r\n }\r\n }, []);\r\n if (!enableModel) {\r\n return jsx(\"div\", {});\r\n }\r\n return (jsxs(\"div\", __assign$2({ className: styles$5.scanErrorModal }, { children: [jsx(\"h2\", __assign$2({ className: styles$5.scanErrorTitle }, { children: \"Scanning Failed\" })), jsxs(\"p\", { children: [\"Please scan this QR Code to continue scanning on your mobile phone.\", jsx(\"br\", {}), \"Return here once successful to continue.\"] }), jsx(\"div\", __assign$2({ style: { height: \"auto\", margin: \"20px auto\", width: \"400\" } }, { children: webToMobileLink ? (jsx(_default, { style: { height: \"auto\", maxWidth: \"100%\", width: \"100%\" }, value: webToMobileLink, viewBox: \"0 0 256 256\" })) : (jsx(\"div\", __assign$2({ className: styles$5.spinnerWrapper }, { children: jsx(dist, __assign$2({}, spinnerOptions)) }))) })), jsx(\"div\", __assign$2({ className: styles$5.scanErrorButtonContainer }, { children: jsx(\"button\", __assign$2({ className: \"\".concat(styles$5.scanErrorButton, \" \").concat(styles$5.scanErrorButtonPrimary), onClick: function () { return window.location.reload(); } }, { children: \"Try Again\" })) }))] })));\r\n};\n\nvar ScanFrame = function (_a) {\r\n var successIndicator = _a.successIndicator, handleRetryButton = _a.handleRetryButton, frameDivRef = _a.frameDivRef, spinnerOptions = _a.spinnerOptions, errorIndicator = _a.errorIndicator, webToMobileHandoffConfig = _a.webToMobileHandoffConfig, cardScanApi = _a.cardScanApi;\r\n var _b = useGlobalContext(), stateMachineState = _b.stateMachineState, showCurtain = _b.showCurtain, isMobile = _b.isMobile, isMobileOnLandscape = _b.isMobileOnLandscape;\r\n var _c = useState(false), flipped = _c[0], setFlipped = _c[1];\r\n var _d = useSpring({\r\n opacity: flipped ? 1 : 0,\r\n transform: \"perspective(300px) translateY(-100%) translateX(-50px) rotateY(\".concat(flipped ? 180 : 0, \"deg)\"),\r\n config: config.molasses,\r\n }), transform = _d.transform, opacity = _d.opacity;\r\n useEffect(function () {\r\n var id = setInterval(function () {\r\n setFlipped(function (flipped) { return !flipped; });\r\n }, 2000);\r\n return function () {\r\n clearInterval(id);\r\n };\r\n }, []);\r\n var shouldShowProgress = [\r\n \"frontsideProcessing\",\r\n \"backsideProcessing\",\r\n \"autoCapture\",\r\n \"manualCapture\",\r\n \"backsidePending\",\r\n ].some(stateMachineState.matches);\r\n var shouldShowRotateToScanBack = stateMachineState.matches(\"backsidePending\") ||\r\n (stateMachineState.matches(\"backsideProcessing\") &&\r\n !stateMachineState.context.processing);\r\n var isPending = [\"cameraLoading\", \"autoCapture\", \"manualCapture\"].some(stateMachineState.matches);\r\n var isProcessing = [\"frontsideProcessing\", \"backsideProcessing\"].some(stateMachineState.matches) && stateMachineState.context.processing;\r\n var isProcessingAuto = isProcessing;\r\n isProcessing &&\r\n !stateMachineState.context.autoScan &&\r\n stateMachineState.context.scannerRunning;\r\n var isErrorOrRetry = [\"error\", \"cameraError\", \"retry\"].some(stateMachineState.matches);\r\n var greyCorner = [\"manualCapture\", \"backsidePending\"].some(stateMachineState.matches) &&\r\n !stateMachineState.context.autoScan;\r\n return (jsx(Fragment, { children: jsxs(\"div\", __assign$2({ style: isErrorOrRetry ? { minWidth: \"400px\" } : {}, className: \"\".concat(scanFrameStyles.cardGuide, \" cardscan-card-guide active \").concat(stateMachineState.matches(\"manualCapture\")\r\n ? \"cardscan-card-guide-processing\"\r\n : \"\", \" \").concat(isMobileOnLandscape && \"card-guide-landscape\"), ref: frameDivRef }, { children: [!showCurtain && !stateMachineState.context.processing && (jsx(ScanSwitch, {})), !stateMachineState.matches(\"completed\") && (jsx(\"div\", { className: \"\\n \".concat(shouldShowProgress ? scanFrameStyles.corner : \"\", \" \\n \").concat(scanFrameStyles.corner1, \" \\n \").concat(greyCorner ? scanFrameStyles.cardscanCornerOff : \"\", \"\\n \").concat(shouldShowProgress ? \"cardscan-corner-active\" : \"\") })), !stateMachineState.matches(\"completed\") && (jsx(\"div\", { className: \"\\n \".concat(shouldShowProgress ? scanFrameStyles.corner : \"\", \" \\n \").concat(scanFrameStyles.corner2, \"\\n \").concat(greyCorner ? scanFrameStyles.cardscanCornerOff : \"\", \"\\n \").concat(shouldShowProgress ? \"cardscan-corner-active\" : \"\") })), !stateMachineState.matches(\"completed\") && (jsx(\"div\", { className: \"\\n \".concat(shouldShowProgress ? scanFrameStyles.corner : \"\", \" \\n \").concat(scanFrameStyles.corner3, \"\\n \").concat(greyCorner ? scanFrameStyles.cardscanCornerOff : \"\", \"\\n \").concat(shouldShowProgress ? \"cardscan-corner-active\" : \"\") })), !stateMachineState.matches(\"completed\") && (jsx(\"div\", { className: \"\".concat(shouldShowProgress ? scanFrameStyles.corner : \"\", \" \\n \").concat(scanFrameStyles.corner4, \"\\n \").concat(greyCorner ? scanFrameStyles.cardscanCornerOff : \"\", \"\\n \").concat(shouldShowProgress ? \"cardscan-corner-active\" : \"\") })), stateMachineState.matches(\"completed\") && (jsxs(\"div\", __assign$2({ className: scanFrameStyles.processStatus }, { children: [successIndicator != null ? (successIndicator) : (jsx(\"img\", { src: img$6, alt: \"\" })), jsx(\"p\", __assign$2({ \"data-cy\": \"cardscanHelperText\", className: scanFrameStyles.cardscanHelperText }, { children: stateMachineState.context.headerTitle }))] }))), isErrorOrRetry && (!(webToMobileHandoffConfig === null || webToMobileHandoffConfig === void 0 ? void 0 : webToMobileHandoffConfig.enabled) || isMobile) && (jsxs(\"div\", __assign$2({ className: scanFrameStyles.processStatus }, { children: [errorIndicator != null ? (errorIndicator) : (jsx(\"img\", { src: img$5, alt: \"\" })), jsx(\"p\", __assign$2({ \"data-cy\": \"cardscanHelperText\", className: scanFrameStyles.cardscanHelperText }, { children: stateMachineState.context.headerTitle })), stateMachineState.matches(\"retry\") && (jsx(\"div\", __assign$2({ className: scanFrameStyles.cardscanRetryButton, onClick: handleRetryButton }, { children: \"Retry Scan\" })))] }))), isErrorOrRetry && !isMobile && (webToMobileHandoffConfig === null || webToMobileHandoffConfig === void 0 ? void 0 : webToMobileHandoffConfig.enabled) && (jsx(WebToMobileModal, { enableModel: true, cardScanApi: cardScanApi, webToMobileHandoffConfig: webToMobileHandoffConfig, spinnerOptions: spinnerOptions })), shouldShowRotateToScanBack && (jsxs(\"div\", __assign$2({ className: scanFrameStyles.processStatus, style: { top: \"70%\" } }, { children: [jsxs(\"div\", __assign$2({ style: { position: \"relative\" } }, { children: [jsx(animated.img, { src: img$3, style: {\r\n position: \"absolute\",\r\n width: \"100px\",\r\n maxWidth: \"100px\",\r\n opacity: opacity.to(function (o) { return 1 - o; }),\r\n transform: transform,\r\n willChange: \"transform, opacity\",\r\n transformOrigin: \"center\",\r\n } }), jsx(animated.img, { src: img$4, style: {\r\n position: \"absolute\",\r\n width: \"100px\",\r\n maxWidth: \"100px\",\r\n willChange: \"transform, opacity\",\r\n opacity: opacity,\r\n transform: transform,\r\n transformOrigin: \"center\",\r\n } })] })), jsx(\"p\", __assign$2({ \"data-cy\": \"cardscanHelperText\", className: scanFrameStyles.cardscanHelperText }, { children: stateMachineState.context.headerTitle }))] }))), (isProcessingAuto || isPending) && (jsx(\"div\", __assign$2({ className: scanFrameStyles.processStatus }, { children: jsx(\"p\", __assign$2({ \"data-cy\": \"cardscanHelperText\", className: scanFrameStyles.cardscanHelperText }, { children: stateMachineState.context.headerTitle })) })))] })) }));\r\n};\n\nvar css_248z$4 = \".scanVideoViewer-module_videoBackground__9LiTo{background-color:#708090;max-width:65vw;width:var(--cardscan-video-width);z-index:2}.scanVideoViewer-module_videoBackground__9LiTo.scanVideoViewer-module_heightFrame__q1B2p{height:unset;max-height:var(--cardscan-video-height);max-width:var(--cardscan-video-width);width:var(--cardscan-app-width)}\\n/*# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbInNjYW5WaWRlb1ZpZXdlci5tb2R1bGUuc2NzcyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSwrQ0FDRSx3QkFBMkIsQ0FFM0IsY0FBZSxDQURmLGlDQUFrQyxDQUVsQyxTQUNGLENBQ0EseUZBQ0UsWUFBYSxDQUNiLHVDQUF3QyxDQUN4QyxxQ0FBc0MsQ0FDdEMsK0JBQ0YiLCJmaWxlIjoic2NhblZpZGVvVmlld2VyLm1vZHVsZS5zY3NzIiwic291cmNlc0NvbnRlbnQiOlsiLnZpZGVvQmFja2dyb3VuZCB7XG4gIGJhY2tncm91bmQtY29sb3I6IHNsYXRlZ3JleTtcbiAgd2lkdGg6IHZhcigtLWNhcmRzY2FuLXZpZGVvLXdpZHRoKTtcbiAgbWF4LXdpZHRoOiA2NXZ3O1xuICB6LWluZGV4OiAyO1xufVxuLnZpZGVvQmFja2dyb3VuZC5oZWlnaHRGcmFtZSB7XG4gIGhlaWdodDogdW5zZXQ7XG4gIG1heC1oZWlnaHQ6IHZhcigtLWNhcmRzY2FuLXZpZGVvLWhlaWdodCk7XG4gIG1heC13aWR0aDogdmFyKC0tY2FyZHNjYW4tdmlkZW8td2lkdGgpO1xuICB3aWR0aDogdmFyKC0tY2FyZHNjYW4tYXBwLXdpZHRoKTtcbn0iXX0= */\";\nvar styles$4 = {\"videoBackground\":\"scanVideoViewer-module_videoBackground__9LiTo\",\"heightFrame\":\"scanVideoViewer-module_heightFrame__q1B2p\"};\nstyleInject(css_248z$4);\n\nvar ScanVideoViewer = function (_a) {\r\n var videoRef = _a.videoRef, setShowErrorModal = _a.setShowErrorModal, stateMachineSend = _a.stateMachineSend, setScanDebugState = _a.setScanDebugState, onError = _a.onError, setVideoMetadata = _a.setVideoMetadata, isMobile = _a.isMobile;\r\n var getVideo = useCallback(function (videoBg) {\r\n if (!navigator.mediaDevices || !navigator.mediaDevices.getUserMedia) {\r\n console.error(\"Video Error - mediaDevices or getUserMedia undefined\");\r\n return;\r\n }\r\n var webCamPromise = navigator.mediaDevices\r\n .getUserMedia({\r\n audio: false,\r\n video: {\r\n width: 1920,\r\n facingMode: \"environment\",\r\n },\r\n })\r\n .then(function (stream) {\r\n setShowErrorModal(false);\r\n videoBg.srcObject = stream;\r\n var videoPromise = videoBg.play();\r\n if (videoPromise === undefined) {\r\n console.error(\"Video Error - videoPromise undefined\");\r\n return;\r\n }\r\n videoPromise\r\n .then(function () { return console.debug(\"CardScan: Video Started\"); })\r\n .catch(function (error) {\r\n var err = generateError(error.message, \"VideoError\", 675);\r\n console.error(\"Video Error: \", err);\r\n if (onError) {\r\n onError(err);\r\n }\r\n stateMachineSend(\"ERROR\");\r\n });\r\n var videoTrack = stream.getVideoTracks().pop();\r\n var settings = (videoTrack === null || videoTrack === void 0 ? void 0 : videoTrack.getSettings()) || {};\r\n setVideoMetadata({ videoTrack: settings });\r\n //only works on chrome powered\r\n navigator.mediaDevices.enumerateDevices().then(function (devices) {\r\n var device = devices\r\n .filter(function (device) { return device[\"kind\"] === \"videoinput\"; })\r\n .pop();\r\n // getCapabilities won't likely be supported by TS\r\n // https://github.com/microsoft/TypeScript/issues/45660\r\n if (device && device.getCapabilities != undefined) {\r\n var caps = device.getCapabilities();\r\n setVideoMetadata({\r\n videoTrack: settings,\r\n cameraCapabilities: caps,\r\n });\r\n }\r\n });\r\n // //1024x768 or less if video is smaller. If canvas is over 1024 we have GPU memory issues.\r\n // const captureCanvas = captureCanvasRef.current;\r\n // if (captureCanvas && settings.width && settings.height) {\r\n // captureCanvas.width = Math.min(settings.width, 1024);\r\n // captureCanvas.height = Math.min(settings.height, 768);\r\n // }\r\n return new Promise(function (resolve) {\r\n videoBg.onloadedmetadata = function () {\r\n resolve(stream);\r\n // send(\"CAMERA_LOADED\", { videoLoaded: true });\r\n stateMachineSend(\"CAMERA_LOADED\");\r\n setScanDebugState(\"loading\");\r\n //setScannerRunning(true);\r\n };\r\n });\r\n });\r\n webCamPromise\r\n .then(function () {\r\n stateMachineSend(\"CAMERA_LOADED\");\r\n setScanDebugState(\"loading\");\r\n //once video is loaded start the detection & capture loop\r\n //setScannerRunning(true);\r\n })\r\n .catch(function (error) {\r\n //leave it to the caller to treat the error\r\n });\r\n return webCamPromise;\r\n }, [\r\n onError,\r\n stateMachineSend,\r\n setScanDebugState,\r\n setShowErrorModal,\r\n setVideoMetadata,\r\n ]);\r\n useEffect(function () {\r\n var _a;\r\n var videoBg = videoRef.current;\r\n var videoPromise;\r\n if (videoBg) {\r\n (_a = getVideo(videoBg)) === null || _a === void 0 ? void 0 : _a.then(function (media) {\r\n videoPromise = media;\r\n }).catch(function (error) {\r\n var err = generateError(error.message, \"VideoError\", 676);\r\n console.error(\"Video Error: \", err);\r\n if (onError) {\r\n onError(err);\r\n }\r\n //Only show error modal when error is a permissions error.\r\n if (error.name === \"NotAllowedError\") {\r\n setShowErrorModal(true);\r\n stateMachineSend(\"CAMERAERROR\");\r\n }\r\n else if (error.name === \"NotFoundError\") {\r\n setShowErrorModal(true);\r\n stateMachineSend(\"CAMERAERROR\");\r\n }\r\n else {\r\n setShowErrorModal(false);\r\n stateMachineSend(\"ERROR\");\r\n }\r\n });\r\n }\r\n return function () {\r\n if (videoPromise) {\r\n videoPromise.getTracks().forEach(function (track) {\r\n videoPromise.removeTrack(track);\r\n });\r\n }\r\n };\r\n }, [videoRef, getVideo, onError]);\r\n return (jsx(\"video\", { ref: videoRef, style: isMobile ? { maxHeight: \"100%\", maxWidth: \"100%\" } : {}, className: styles$4.videoBackground, id: \"frame\", muted: true, playsInline: true, autoPlay: true }));\r\n};\n\nvar img$1 = \"data:image/png;base64,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\";\n\nvar css_248z$3 = \".closeButton-module_closeBtn__XDcux{cursor:pointer;height:28px;position:fixed;right:10px;top:10px;width:28px;z-index:3}@media (min-width:680px){.closeButton-module_closeBtn__XDcux{height:38px;width:38px}}.closeButton-module_closeBtnLandscape__aztsu{top:16px}\\n/*# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbImNsb3NlQnV0dG9uLm1vZHVsZS5zY3NzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLG9DQUlFLGNBQWUsQ0FFZixXQUFZLENBTFosY0FBZSxDQUVmLFVBQVcsQ0FEWCxRQUFTLENBS1QsVUFBVyxDQUZYLFNBR0YsQ0FDQSx5QkFDRSxvQ0FFRSxXQUFZLENBRFosVUFFRixDQUNGLENBRUEsNkNBQ0UsUUFDRiIsImZpbGUiOiJjbG9zZUJ1dHRvbi5tb2R1bGUuc2NzcyIsInNvdXJjZXNDb250ZW50IjpbIi5jbG9zZUJ0biB7XG4gIHBvc2l0aW9uOiBmaXhlZDtcbiAgdG9wOiAxMHB4O1xuICByaWdodDogMTBweDtcbiAgY3Vyc29yOiBwb2ludGVyO1xuICB6LWluZGV4OiAzO1xuICBoZWlnaHQ6IDI4cHg7XG4gIHdpZHRoOiAyOHB4O1xufVxuQG1lZGlhIChtaW4td2lkdGg6IDY4MHB4KSB7XG4gIC5jbG9zZUJ0biB7XG4gICAgd2lkdGg6IDM4cHg7XG4gICAgaGVpZ2h0OiAzOHB4O1xuICB9XG59XG5cbi5jbG9zZUJ0bkxhbmRzY2FwZSB7XG4gIHRvcDogMTZweDtcbn0iXX0= */\";\nvar styles$3 = {\"closeBtn\":\"closeButton-module_closeBtn__XDcux\",\"closeBtnLandscape\":\"closeButton-module_closeBtnLandscape__aztsu\"};\nstyleInject(css_248z$3);\n\nvar CloseButton = function (_a) {\r\n var onCloseBtn = _a.onCloseBtn, closeButton = _a.closeButton;\r\n var isMobileOnLandscape = useGlobalContext().isMobileOnLandscape;\r\n return closeButton != null ? (jsx(\"div\", __assign$2({ \"data-cy\": \"closeBtn\", onClick: onCloseBtn, className: \" \".concat(styles$3.closeBtn, \" \").concat(isMobileOnLandscape && styles$3.closeBtnLandscape) }, { children: closeButton }))) : (jsx(\"span\", __assign$2({ \"data-cy\": \"closeBtn\", onClick: onCloseBtn, className: \" \".concat(styles$3.closeBtn, \" \").concat(isMobileOnLandscape && styles$3.closeBtnLandscape) }, { children: jsx(\"img\", { src: img$1, alt: \"\", style: { height: \"100%\" } }) })));\r\n};\r\nCloseButton.propTypes = {\r\n onCloseBtn: PropTypes.func.isRequired,\r\n closeButton: PropTypes.bool,\r\n};\n\nvar img = \"data:image/png;base64,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\";\n\nvar css_248z$2 = \".cardCapture-module_bottomCurtain__psmrF{background:rgba(29,29,29,.7);bottom:0;height:150px;position:fixed;width:100%;z-index:8}.cardCapture-module_bottomCurtainLandscape__jTj1A{background:rgba(29,29,29,.7);bottom:0;height:16px;position:fixed;width:100%;z-index:8}.cardCapture-module_topCurtain__caSuL{background:rgba(29,29,29,.7);height:150px;position:fixed;top:0;width:100%;z-index:8}.cardCapture-module_topCurtainLandscape__US-NS{height:16px}.cardCapture-module_cameraBtn__bH3O4{cursor:pointer;left:50%;position:absolute;transform:translate(-50%,-12px);width:55px;z-index:3}.cardCapture-module_cameraBtn__bH3O4.cardCapture-module_heightFrame__azykv{bottom:40px;transform:translate(-50%)}.cardCapture-module_cameraBtn__bH3O4:active{transform:translate(-49%,-11px)}.cardCapture-module_cameraBtn__bH3O4:active.cardCapture-module_heightFrame__azykv{transform:translate(-49%,1px)}.cardCapture-module_cardscanLogo__CxQei{box-sizing:border-box;left:4px;max-width:135px;position:absolute;top:0;transform:translateY(-100%);z-index:300}.cardCapture-module_cardscanLogoLandscape__pAGr7{-webkit-filter:invert(100%);filter:invert(100%);max-width:90px}\\n/*# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbImNhcmRDYXB0dXJlLm1vZHVsZS5zY3NzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLHlDQUNFLDRCQUFpQyxDQUlqQyxRQUFTLENBRlQsWUFBYSxDQUNiLGNBQWUsQ0FGZixVQUFXLENBSVgsU0FDRixDQUVBLGtEQUNFLDRCQUFpQyxDQUlqQyxRQUFTLENBRlQsV0FBWSxDQUNaLGNBQWUsQ0FGZixVQUFXLENBSVgsU0FDRixDQUVBLHNDQUNFLDRCQUFpQyxDQUVqQyxZQUFhLENBQ2IsY0FBZSxDQUNmLEtBQU0sQ0FITixVQUFXLENBSVgsU0FDRixDQUVBLCtDQUNFLFdBQ0YsQ0FFQSxxQ0FFRSxjQUFlLENBRWYsUUFBUyxDQUhULGlCQUFrQixDQUlsQiwrQkFBaUMsQ0FDakMsVUFBVyxDQUhYLFNBSUYsQ0FDQSwyRUFFRSxXQUFZLENBRFoseUJBRUYsQ0FFQSw0Q0FDRSwrQkFDRixDQUNBLGtGQUNFLDZCQUNGLENBRUEsd0NBTUUscUJBQXNCLENBSHRCLFFBQVMsQ0FJVCxlQUFnQixDQU5oQixpQkFBa0IsQ0FHbEIsS0FBTSxDQUNOLDJCQUE0QixDQUg1QixXQU1GLENBRUEsaURBRUUsMkJBQTRCLENBQzVCLG1CQUFvQixDQUZwQixjQUdGIiwiZmlsZSI6ImNhcmRDYXB0dXJlLm1vZHVsZS5zY3NzIiwic291cmNlc0NvbnRlbnQiOlsiLmJvdHRvbUN1cnRhaW4ge1xuICBiYWNrZ3JvdW5kOiByZ2JhKDI5LCAyOSwgMjksIDAuNyk7XG4gIHdpZHRoOiAxMDAlO1xuICBoZWlnaHQ6IDE1MHB4O1xuICBwb3NpdGlvbjogZml4ZWQ7XG4gIGJvdHRvbTogMDtcbiAgei1pbmRleDogODtcbn1cblxuLmJvdHRvbUN1cnRhaW5MYW5kc2NhcGUge1xuICBiYWNrZ3JvdW5kOiByZ2JhKDI5LCAyOSwgMjksIDAuNyk7XG4gIHdpZHRoOiAxMDAlO1xuICBoZWlnaHQ6IDE2cHg7XG4gIHBvc2l0aW9uOiBmaXhlZDtcbiAgYm90dG9tOiAwO1xuICB6LWluZGV4OiA4O1xufVxuXG4udG9wQ3VydGFpbiB7XG4gIGJhY2tncm91bmQ6IHJnYmEoMjksIDI5LCAyOSwgMC43KTtcbiAgd2lkdGg6IDEwMCU7XG4gIGhlaWdodDogMTUwcHg7XG4gIHBvc2l0aW9uOiBmaXhlZDtcbiAgdG9wOiAwO1xuICB6LWluZGV4OiA4O1xufVxuXG4udG9wQ3VydGFpbkxhbmRzY2FwZSB7XG4gIGhlaWdodDogMTZweDtcbn1cblxuLmNhbWVyYUJ0biB7XG4gIHBvc2l0aW9uOiBhYnNvbHV0ZTtcbiAgY3Vyc29yOiBwb2ludGVyO1xuICB6LWluZGV4OiAzO1xuICBsZWZ0OiA1MCU7XG4gIHRyYW5zZm9ybTogdHJhbnNsYXRlKC01MCUsIC0xMnB4KTtcbiAgd2lkdGg6IDU1cHg7XG59XG4uY2FtZXJhQnRuLmhlaWdodEZyYW1lIHtcbiAgdHJhbnNmb3JtOiB0cmFuc2xhdGUoLTUwJSwgMCk7XG4gIGJvdHRvbTogNDBweDtcbn1cblxuLmNhbWVyYUJ0bjphY3RpdmUge1xuICB0cmFuc2Zvcm06IHRyYW5zbGF0ZSgtNDklLCAtMTFweCk7XG59XG4uY2FtZXJhQnRuOmFjdGl2ZS5oZWlnaHRGcmFtZSB7XG4gIHRyYW5zZm9ybTogdHJhbnNsYXRlKC00OSUsIDFweCk7XG59XG5cbi5jYXJkc2NhbkxvZ28ge1xuICBwb3NpdGlvbjogYWJzb2x1dGU7XG4gIHotaW5kZXg6IDMwMDtcbiAgbGVmdDogNHB4O1xuICB0b3A6IDA7XG4gIHRyYW5zZm9ybTogdHJhbnNsYXRlWSgtMTAwJSk7XG4gIGJveC1zaXppbmc6IGJvcmRlci1ib3g7XG4gIG1heC13aWR0aDogMTM1cHg7XG59XG5cbi5jYXJkc2NhbkxvZ29MYW5kc2NhcGUge1xuICBtYXgtd2lkdGg6IDkwcHg7XG4gIC13ZWJraXQtZmlsdGVyOiBpbnZlcnQoMTAwJSk7XG4gIGZpbHRlcjogaW52ZXJ0KDEwMCUpO1xufSJdfQ== */\";\nvar styles$2 = {\"bottomCurtain\":\"cardCapture-module_bottomCurtain__psmrF\",\"bottomCurtainLandscape\":\"cardCapture-module_bottomCurtainLandscape__jTj1A\",\"topCurtain\":\"cardCapture-module_topCurtain__caSuL\",\"topCurtainLandscape\":\"cardCapture-module_topCurtainLandscape__US-NS\",\"cameraBtn\":\"cardCapture-module_cameraBtn__bH3O4\",\"heightFrame\":\"cardCapture-module_heightFrame__azykv\",\"cardscanLogo\":\"cardCapture-module_cardscanLogo__CxQei\",\"cardscanLogoLandscape\":\"cardCapture-module_cardscanLogoLandscape__pAGr7\"};\nstyleInject(css_248z$2);\n\nvar CardCapture = function (_a) {\r\n var children = _a.children;\r\n var _b = useGlobalContext(), showCurtain = _b.showCurtain, onCloseBtn = _b.onCloseBtn, closeButton = _b.closeButton, isMobileOnLandscape = _b.isMobileOnLandscape, stateMachineState = _b.stateMachineState, stateMachineSend = _b.stateMachineSend;\r\n [\"cameraLoading\", \"autoCapture\", \"manualCapture\"].some(stateMachineState.matches);\r\n return (jsxs(Fragment, { children: [!showCurtain && (jsx(CloseButton, { onCloseBtn: onCloseBtn, closeButton: closeButton })), jsxs(\"div\", __assign$2({ className: \"\".concat(styles$2.topCurtain, \" \").concat(isMobileOnLandscape && styles$2.topCurtainLandscape), style: {\r\n display: showCurtain ? \"block\" : \"none\",\r\n } }, { children: [showCurtain && (jsx(CloseButton, { onCloseBtn: onCloseBtn, closeButton: closeButton })), showCurtain && !stateMachineState.context.processing && (jsx(ScanSwitch, { isMobile: showCurtain }))] })), children, jsxs(\"div\", __assign$2({ className: isMobileOnLandscape\r\n ? styles$2.bottomCurtainLandscape\r\n : styles$2.bottomCurtain, style: {\r\n display: showCurtain ? \"block\" : \"none\",\r\n } }, { children: [jsx(\"img\", { \"data-cy\": \"cardscanLogo\", src: CardScanLogoURL, className: \"\".concat(styles$2.cardscanLogo, \" \").concat(isMobileOnLandscape && styles$2.cardscanLogoLandscape) }), !stateMachineState.context.autoScan &&\r\n !stateMachineState.context.processing && (jsx(\"img\", { \"data-cy\": \"cameraBtn\", src: img, className: styles$2.cameraBtn, id: \"camera-btn\", onClick: function () { return stateMachineSend(\"MANUAL_BUTTON_CLICK\"); } }))] }))] }));\r\n};\n\nvar ScanCanvas = function (_a) {\r\n var detectionCanvasRef = _a.detectionCanvasRef, captureCanvasRef = _a.captureCanvasRef; _a.videoRefBg; _a.frameDivRef; _a.frameDivDimensions; var videoHeight = _a.videoHeight, videoWidth = _a.videoWidth;\r\n return (jsxs(Fragment, { children: [jsx(\"canvas\", { className: \"detectionCanvas\", width: DetectorWrapper.get().IMG_SIZE, height: DetectorWrapper.get().IMG_SIZE, ref: detectionCanvasRef, style: { display: \"none\" } }), jsx(\"canvas\", { className: \"captureCanvas\", width: videoWidth, height: videoHeight, ref: captureCanvasRef, style: { display: \"none\" } })] }));\r\n};\n\nvar useCustomWidget = function (autoSwitchActiveColor, autoSwitchInactiveColor, progressBarColor, widgetBackgroundColor, messageFontSize, messageTextColor, messageBackgroundColor) {\r\n useEffect(function () {\r\n if (messageFontSize) {\r\n document.documentElement.style.setProperty(\"--cardscan-message-font-size\", messageFontSize);\r\n }\r\n if (messageTextColor) {\r\n document.documentElement.style.setProperty(\"--cardscan-message-text-color\", messageTextColor);\r\n }\r\n if (messageBackgroundColor) {\r\n document.documentElement.style.setProperty(\"--cardscan-message-background-color\", messageBackgroundColor);\r\n }\r\n if (widgetBackgroundColor) {\r\n document.documentElement.style.setProperty(\"--cardscan-widget-background-color\", widgetBackgroundColor);\r\n }\r\n if (progressBarColor) {\r\n document.documentElement.style.setProperty(\"--cardscan-progress-bar-color\", progressBarColor);\r\n }\r\n if (autoSwitchActiveColor) {\r\n document.documentElement.style.setProperty(\"--cardscan-auto-switch-active-color\", autoSwitchActiveColor);\r\n }\r\n if (autoSwitchInactiveColor) {\r\n document.documentElement.style.setProperty(\"--cardscan-auto-switch-inactive-color\", autoSwitchInactiveColor);\r\n }\r\n }, [\r\n messageFontSize,\r\n messageTextColor,\r\n messageBackgroundColor,\r\n widgetBackgroundColor,\r\n progressBarColor,\r\n autoSwitchActiveColor,\r\n autoSwitchInactiveColor,\r\n ]);\r\n};\n\nvar useLayoutHeight = function (videoRefBg, isVideoLoading, videoLayoutHeight) {\r\n useEffect(function () {\r\n if (isVideoLoading)\r\n return;\r\n document.documentElement.style.setProperty(\"--cardscan-video-background-height\", videoLayoutHeight ? \"\".concat(videoLayoutHeight, \"px\") : \"0\");\r\n window.addEventListener(\"resize\", function () {\r\n document.documentElement.style.setProperty(\"--cardscan-video-background-height\", videoLayoutHeight ? \"\".concat(videoLayoutHeight, \"px\") : \"0\");\r\n });\r\n }, [videoRefBg, isVideoLoading, videoLayoutHeight]);\r\n};\n\nvar useBufferSize = function (bufferSize) {\r\n useEffect(function () {\r\n document.documentElement.style.setProperty(\"--cardscan-buffer-max-size\", bufferSize.toString());\r\n }, [bufferSize]);\r\n //XXX NLS what is this?\r\n var bufferInfo = useState(4);\r\n return bufferInfo;\r\n};\n\nvar useVideoSizes = function (videoRefBg, setShowCurtain, stateMachineState) {\r\n var _a, _b;\r\n useEffect(function () {\r\n var _a, _b, _c, _d, _e, _f;\r\n if (stateMachineState.matches(\"cameraLoading\"))\r\n return;\r\n document.documentElement.style.setProperty(\"--cardscan-video-width\", ((_a = videoRefBg === null || videoRefBg === void 0 ? void 0 : videoRefBg.current) === null || _a === void 0 ? void 0 : _a.videoWidth)\r\n ? \"\".concat((_b = videoRefBg === null || videoRefBg === void 0 ? void 0 : videoRefBg.current) === null || _b === void 0 ? void 0 : _b.videoWidth.toString(), \"px\")\r\n : \"0\");\r\n document.documentElement.style.setProperty(\"--cardscan-video-height\", ((_c = videoRefBg === null || videoRefBg === void 0 ? void 0 : videoRefBg.current) === null || _c === void 0 ? void 0 : _c.videoHeight)\r\n ? \"\".concat((_d = videoRefBg === null || videoRefBg === void 0 ? void 0 : videoRefBg.current) === null || _d === void 0 ? void 0 : _d.videoHeight.toString(), \"px\")\r\n : \"0\");\r\n if ((((_e = videoRefBg === null || videoRefBg === void 0 ? void 0 : videoRefBg.current) === null || _e === void 0 ? void 0 : _e.videoWidth) &&\r\n ((_f = videoRefBg === null || videoRefBg === void 0 ? void 0 : videoRefBg.current) === null || _f === void 0 ? void 0 : _f.videoWidth) > 2 * window.innerWidth) ||\r\n isMobile_1) {\r\n setShowCurtain(true);\r\n var appHeight = function () {\r\n var doc = document.documentElement;\r\n doc.style.setProperty(\"--cardscan-app-height\", \"\".concat(window.innerHeight, \"px\"));\r\n doc.style.setProperty(\"--cardscan-app-width\", \"\".concat(window.innerWidth, \"px\"));\r\n };\r\n window.addEventListener(\"resize\", appHeight);\r\n appHeight();\r\n var videoFrame = document.getElementById(\"frame\");\r\n videoFrame === null || videoFrame === void 0 ? void 0 : videoFrame.classList.add(\"heightFrame\");\r\n var cameraButton = document.getElementById(\"camera-btn\");\r\n cameraButton === null || cameraButton === void 0 ? void 0 : cameraButton.classList.add(\"heightFrame\");\r\n }\r\n }, [\r\n (_a = videoRefBg === null || videoRefBg === void 0 ? void 0 : videoRefBg.current) === null || _a === void 0 ? void 0 : _a.videoWidth,\r\n (_b = videoRefBg === null || videoRefBg === void 0 ? void 0 : videoRefBg.current) === null || _b === void 0 ? void 0 : _b.videoHeight,\r\n setShowCurtain,\r\n videoRefBg,\r\n stateMachineState,\r\n ]);\r\n};\n\nvar useRect = function () {\r\n var ref = useRef(null);\r\n var _a = useState(null), rect = _a[0], setRect = _a[1];\r\n var set = function () {\r\n return setRect(ref && ref.current ? ref.current.getBoundingClientRect() : null);\r\n };\r\n useEffect(function () {\r\n set();\r\n window.addEventListener(\"resize\", set);\r\n return function () { return window.removeEventListener(\"resize\", set); };\r\n }, []);\r\n return [rect, ref];\r\n};\n\nvar useIsomorphicLayoutEffect = typeof window !== \"undefined\" ? useLayoutEffect : useEffect;\n\nfunction useInterval(callback, delay) {\r\n var savedCallback = useRef(callback);\r\n // Remember the latest callback if it changes.\r\n useIsomorphicLayoutEffect(function () {\r\n savedCallback.current = callback;\r\n }, [callback]);\r\n // Set up the interval.\r\n useEffect(function () {\r\n // Don't schedule if no delay is specified.\r\n // Note: 0 is a valid value for delay.\r\n if (!delay && delay !== 0) {\r\n return;\r\n }\r\n var id = setInterval(function () { return savedCallback.current(); }, delay);\r\n return function () { return clearInterval(id); };\r\n }, [delay]);\r\n}\n\nvar withSelector = {exports: {}};\n\nvar withSelector_production_min = {};\n\nvar shim = {exports: {}};\n\nvar useSyncExternalStoreShim_production_min = {};\n\n/**\n * @license React\n * use-sync-external-store-shim.production.min.js\n *\n * Copyright (c) Facebook, Inc. and its affiliates.\n *\n * This source code is licensed under the MIT license found in the\n * LICENSE file in the root directory of this source tree.\n */\nvar e=React__default$1;function h$1(a,b){return a===b&&(0!==a||1/a===1/b)||a!==a&&b!==b}var k=\"function\"===typeof Object.is?Object.is:h$1,l=e.useState,m=e.useEffect,n$1=e.useLayoutEffect,p$1=e.useDebugValue;function q$1(a,b){var d=b(),f=l({inst:{value:d,getSnapshot:b}}),c=f[0].inst,g=f[1];n$1(function(){c.value=d;c.getSnapshot=b;r$1(c)&&g({inst:c});},[a,d,b]);m(function(){r$1(c)&&g({inst:c});return a(function(){r$1(c)&&g({inst:c});})},[a]);p$1(d);return d}\nfunction r$1(a){var b=a.getSnapshot;a=a.value;try{var d=b();return !k(a,d)}catch(f){return !0}}function t$1(a,b){return b()}var u$1=\"undefined\"===typeof window||\"undefined\"===typeof window.document||\"undefined\"===typeof window.document.createElement?t$1:q$1;useSyncExternalStoreShim_production_min.useSyncExternalStore=void 0!==e.useSyncExternalStore?e.useSyncExternalStore:u$1;\n\nvar useSyncExternalStoreShim_development = {};\n\n/**\n * @license React\n * use-sync-external-store-shim.development.js\n *\n * Copyright (c) Facebook, Inc. and its affiliates.\n *\n * This source code is licensed under the MIT license found in the\n * LICENSE file in the root directory of this source tree.\n */\n\nif (process.env.NODE_ENV !== \"production\") {\n (function() {\n\n/* global __REACT_DEVTOOLS_GLOBAL_HOOK__ */\nif (\n typeof __REACT_DEVTOOLS_GLOBAL_HOOK__ !== 'undefined' &&\n typeof __REACT_DEVTOOLS_GLOBAL_HOOK__.registerInternalModuleStart ===\n 'function'\n) {\n __REACT_DEVTOOLS_GLOBAL_HOOK__.registerInternalModuleStart(new Error());\n}\n var React = React__default$1;\n\nvar ReactSharedInternals = React.__SECRET_INTERNALS_DO_NOT_USE_OR_YOU_WILL_BE_FIRED;\n\nfunction error(format) {\n {\n {\n for (var _len2 = arguments.length, args = new Array(_len2 > 1 ? _len2 - 1 : 0), _key2 = 1; _key2 < _len2; _key2++) {\n args[_key2 - 1] = arguments[_key2];\n }\n\n printWarning('error', format, args);\n }\n }\n}\n\nfunction printWarning(level, format, args) {\n // When changing this logic, you might want to also\n // update consoleWithStackDev.www.js as well.\n {\n var ReactDebugCurrentFrame = ReactSharedInternals.ReactDebugCurrentFrame;\n var stack = ReactDebugCurrentFrame.getStackAddendum();\n\n if (stack !== '') {\n format += '%s';\n args = args.concat([stack]);\n } // eslint-disable-next-line react-internal/safe-string-coercion\n\n\n var argsWithFormat = args.map(function (item) {\n return String(item);\n }); // Careful: RN currently depends on this prefix\n\n argsWithFormat.unshift('Warning: ' + format); // We intentionally don't use spread (or .apply) directly because it\n // breaks IE9: https://github.com/facebook/react/issues/13610\n // eslint-disable-next-line react-internal/no-production-logging\n\n Function.prototype.apply.call(console[level], console, argsWithFormat);\n }\n}\n\n/**\n * inlined Object.is polyfill to avoid requiring consumers ship their own\n * https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Object/is\n */\nfunction is(x, y) {\n return x === y && (x !== 0 || 1 / x === 1 / y) || x !== x && y !== y // eslint-disable-line no-self-compare\n ;\n}\n\nvar objectIs = typeof Object.is === 'function' ? Object.is : is;\n\n// dispatch for CommonJS interop named imports.\n\nvar useState = React.useState,\n useEffect = React.useEffect,\n useLayoutEffect = React.useLayoutEffect,\n useDebugValue = React.useDebugValue;\nvar didWarnOld18Alpha = false;\nvar didWarnUncachedGetSnapshot = false; // Disclaimer: This shim breaks many of the rules of React, and only works\n// because of a very particular set of implementation details and assumptions\n// -- change any one of them and it will break. The most important assumption\n// is that updates are always synchronous, because concurrent rendering is\n// only available in versions of React that also have a built-in\n// useSyncExternalStore API. And we only use this shim when the built-in API\n// does not exist.\n//\n// Do not assume that the clever hacks used by this hook also work in general.\n// The point of this shim is to replace the need for hacks by other libraries.\n\nfunction useSyncExternalStore(subscribe, getSnapshot, // Note: The shim does not use getServerSnapshot, because pre-18 versions of\n// React do not expose a way to check if we're hydrating. So users of the shim\n// will need to track that themselves and return the correct value\n// from `getSnapshot`.\ngetServerSnapshot) {\n {\n if (!didWarnOld18Alpha) {\n if (React.startTransition !== undefined) {\n didWarnOld18Alpha = true;\n\n error('You are using an outdated, pre-release alpha of React 18 that ' + 'does not support useSyncExternalStore. The ' + 'use-sync-external-store shim will not work correctly. Upgrade ' + 'to a newer pre-release.');\n }\n }\n } // Read the current snapshot from the store on every render. Again, this\n // breaks the rules of React, and only works here because of specific\n // implementation details, most importantly that updates are\n // always synchronous.\n\n\n var value = getSnapshot();\n\n {\n if (!didWarnUncachedGetSnapshot) {\n var cachedValue = getSnapshot();\n\n if (!objectIs(value, cachedValue)) {\n error('The result of getSnapshot should be cached to avoid an infinite loop');\n\n didWarnUncachedGetSnapshot = true;\n }\n }\n } // Because updates are synchronous, we don't queue them. Instead we force a\n // re-render whenever the subscribed state changes by updating an some\n // arbitrary useState hook. Then, during render, we call getSnapshot to read\n // the current value.\n //\n // Because we don't actually use the state returned by the useState hook, we\n // can save a bit of memory by storing other stuff in that slot.\n //\n // To implement the early bailout, we need to track some things on a mutable\n // object. Usually, we would put that in a useRef hook, but we can stash it in\n // our useState hook instead.\n //\n // To force a re-render, we call forceUpdate({inst}). That works because the\n // new object always fails an equality check.\n\n\n var _useState = useState({\n inst: {\n value: value,\n getSnapshot: getSnapshot\n }\n }),\n inst = _useState[0].inst,\n forceUpdate = _useState[1]; // Track the latest getSnapshot function with a ref. This needs to be updated\n // in the layout phase so we can access it during the tearing check that\n // happens on subscribe.\n\n\n useLayoutEffect(function () {\n inst.value = value;\n inst.getSnapshot = getSnapshot; // Whenever getSnapshot or subscribe changes, we need to check in the\n // commit phase if there was an interleaved mutation. In concurrent mode\n // this can happen all the time, but even in synchronous mode, an earlier\n // effect may have mutated the store.\n\n if (checkIfSnapshotChanged(inst)) {\n // Force a re-render.\n forceUpdate({\n inst: inst\n });\n }\n }, [subscribe, value, getSnapshot]);\n useEffect(function () {\n // Check for changes right before subscribing. Subsequent changes will be\n // detected in the subscription handler.\n if (checkIfSnapshotChanged(inst)) {\n // Force a re-render.\n forceUpdate({\n inst: inst\n });\n }\n\n var handleStoreChange = function () {\n // TODO: Because there is no cross-renderer API for batching updates, it's\n // up to the consumer of this library to wrap their subscription event\n // with unstable_batchedUpdates. Should we try to detect when this isn't\n // the case and print a warning in development?\n // The store changed. Check if the snapshot changed since the last time we\n // read from the store.\n if (checkIfSnapshotChanged(inst)) {\n // Force a re-render.\n forceUpdate({\n inst: inst\n });\n }\n }; // Subscribe to the store and return a clean-up function.\n\n\n return subscribe(handleStoreChange);\n }, [subscribe]);\n useDebugValue(value);\n return value;\n}\n\nfunction checkIfSnapshotChanged(inst) {\n var latestGetSnapshot = inst.getSnapshot;\n var prevValue = inst.value;\n\n try {\n var nextValue = latestGetSnapshot();\n return !objectIs(prevValue, nextValue);\n } catch (error) {\n return true;\n }\n}\n\nfunction useSyncExternalStore$1(subscribe, getSnapshot, getServerSnapshot) {\n // Note: The shim does not use getServerSnapshot, because pre-18 versions of\n // React do not expose a way to check if we're hydrating. So users of the shim\n // will need to track that themselves and return the correct value\n // from `getSnapshot`.\n return getSnapshot();\n}\n\nvar canUseDOM = !!(typeof window !== 'undefined' && typeof window.document !== 'undefined' && typeof window.document.createElement !== 'undefined');\n\nvar isServerEnvironment = !canUseDOM;\n\nvar shim = isServerEnvironment ? useSyncExternalStore$1 : useSyncExternalStore;\nvar useSyncExternalStore$2 = React.useSyncExternalStore !== undefined ? React.useSyncExternalStore : shim;\n\nuseSyncExternalStoreShim_development.useSyncExternalStore = useSyncExternalStore$2;\n /* global __REACT_DEVTOOLS_GLOBAL_HOOK__ */\nif (\n typeof __REACT_DEVTOOLS_GLOBAL_HOOK__ !== 'undefined' &&\n typeof __REACT_DEVTOOLS_GLOBAL_HOOK__.registerInternalModuleStop ===\n 'function'\n) {\n __REACT_DEVTOOLS_GLOBAL_HOOK__.registerInternalModuleStop(new Error());\n}\n \n })();\n}\n\nif (process.env.NODE_ENV === 'production') {\n shim.exports = useSyncExternalStoreShim_production_min;\n} else {\n shim.exports = useSyncExternalStoreShim_development;\n}\n\n/**\n * @license React\n * use-sync-external-store-shim/with-selector.production.min.js\n *\n * Copyright (c) Facebook, Inc. and its affiliates.\n *\n * This source code is licensed under the MIT license found in the\n * LICENSE file in the root directory of this source tree.\n */\nvar h=React__default$1,n=shim.exports;function p(a,b){return a===b&&(0!==a||1/a===1/b)||a!==a&&b!==b}var q=\"function\"===typeof Object.is?Object.is:p,r=n.useSyncExternalStore,t=h.useRef,u=h.useEffect,v=h.useMemo,w=h.useDebugValue;\nwithSelector_production_min.useSyncExternalStoreWithSelector=function(a,b,e,l,g){var c=t(null);if(null===c.current){var f={hasValue:!1,value:null};c.current=f;}else f=c.current;c=v(function(){function a(a){if(!c){c=!0;d=a;a=l(a);if(void 0!==g&&f.hasValue){var b=f.value;if(g(b,a))return k=b}return k=a}b=k;if(q(d,a))return b;var e=l(a);if(void 0!==g&&g(b,e))return b;d=a;return k=e}var c=!1,d,k,m=void 0===e?null:e;return [function(){return a(b())},null===m?void 0:function(){return a(m())}]},[b,e,l,g]);var d=r(a,c[0],c[1]);\nu(function(){f.hasValue=!0;f.value=d;},[d]);w(d);return d};\n\nvar withSelector_development = {};\n\n/**\n * @license React\n * use-sync-external-store-shim/with-selector.development.js\n *\n * Copyright (c) Facebook, Inc. and its affiliates.\n *\n * This source code is licensed under the MIT license found in the\n * LICENSE file in the root directory of this source tree.\n */\n\nif (process.env.NODE_ENV !== \"production\") {\n (function() {\n\n/* global __REACT_DEVTOOLS_GLOBAL_HOOK__ */\nif (\n typeof __REACT_DEVTOOLS_GLOBAL_HOOK__ !== 'undefined' &&\n typeof __REACT_DEVTOOLS_GLOBAL_HOOK__.registerInternalModuleStart ===\n 'function'\n) {\n __REACT_DEVTOOLS_GLOBAL_HOOK__.registerInternalModuleStart(new Error());\n}\n var React = React__default$1;\nvar shim$1 = shim.exports;\n\n/**\n * inlined Object.is polyfill to avoid requiring consumers ship their own\n * https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Object/is\n */\nfunction is(x, y) {\n return x === y && (x !== 0 || 1 / x === 1 / y) || x !== x && y !== y // eslint-disable-line no-self-compare\n ;\n}\n\nvar objectIs = typeof Object.is === 'function' ? Object.is : is;\n\nvar useSyncExternalStore = shim$1.useSyncExternalStore;\n\n// for CommonJS interop.\n\nvar useRef = React.useRef,\n useEffect = React.useEffect,\n useMemo = React.useMemo,\n useDebugValue = React.useDebugValue; // Same as useSyncExternalStore, but supports selector and isEqual arguments.\n\nfunction useSyncExternalStoreWithSelector(subscribe, getSnapshot, getServerSnapshot, selector, isEqual) {\n // Use this to track the rendered snapshot.\n var instRef = useRef(null);\n var inst;\n\n if (instRef.current === null) {\n inst = {\n hasValue: false,\n value: null\n };\n instRef.current = inst;\n } else {\n inst = instRef.current;\n }\n\n var _useMemo = useMemo(function () {\n // Track the memoized state using closure variables that are local to this\n // memoized instance of a getSnapshot function. Intentionally not using a\n // useRef hook, because that state would be shared across all concurrent\n // copies of the hook/component.\n var hasMemo = false;\n var memoizedSnapshot;\n var memoizedSelection;\n\n var memoizedSelector = function (nextSnapshot) {\n if (!hasMemo) {\n // The first time the hook is called, there is no memoized result.\n hasMemo = true;\n memoizedSnapshot = nextSnapshot;\n\n var _nextSelection = selector(nextSnapshot);\n\n if (isEqual !== undefined) {\n // Even if the selector has changed, the currently rendered selection\n // may be equal to the new selection. We should attempt to reuse the\n // current value if possible, to preserve downstream memoizations.\n if (inst.hasValue) {\n var currentSelection = inst.value;\n\n if (isEqual(currentSelection, _nextSelection)) {\n memoizedSelection = currentSelection;\n return currentSelection;\n }\n }\n }\n\n memoizedSelection = _nextSelection;\n return _nextSelection;\n } // We may be able to reuse the previous invocation's result.\n\n\n // We may be able to reuse the previous invocation's result.\n var prevSnapshot = memoizedSnapshot;\n var prevSelection = memoizedSelection;\n\n if (objectIs(prevSnapshot, nextSnapshot)) {\n // The snapshot is the same as last time. Reuse the previous selection.\n return prevSelection;\n } // The snapshot has changed, so we need to compute a new selection.\n\n\n // The snapshot has changed, so we need to compute a new selection.\n var nextSelection = selector(nextSnapshot); // If a custom isEqual function is provided, use that to check if the data\n // has changed. If it hasn't, return the previous selection. That signals\n // to React that the selections are conceptually equal, and we can bail\n // out of rendering.\n\n // If a custom isEqual function is provided, use that to check if the data\n // has changed. If it hasn't, return the previous selection. That signals\n // to React that the selections are conceptually equal, and we can bail\n // out of rendering.\n if (isEqual !== undefined && isEqual(prevSelection, nextSelection)) {\n return prevSelection;\n }\n\n memoizedSnapshot = nextSnapshot;\n memoizedSelection = nextSelection;\n return nextSelection;\n }; // Assigning this to a constant so that Flow knows it can't change.\n\n\n // Assigning this to a constant so that Flow knows it can't change.\n var maybeGetServerSnapshot = getServerSnapshot === undefined ? null : getServerSnapshot;\n\n var getSnapshotWithSelector = function () {\n return memoizedSelector(getSnapshot());\n };\n\n var getServerSnapshotWithSelector = maybeGetServerSnapshot === null ? undefined : function () {\n return memoizedSelector(maybeGetServerSnapshot());\n };\n return [getSnapshotWithSelector, getServerSnapshotWithSelector];\n }, [getSnapshot, getServerSnapshot, selector, isEqual]),\n getSelection = _useMemo[0],\n getServerSelection = _useMemo[1];\n\n var value = useSyncExternalStore(subscribe, getSelection, getServerSelection);\n useEffect(function () {\n inst.hasValue = true;\n inst.value = value;\n }, [value]);\n useDebugValue(value);\n return value;\n}\n\nwithSelector_development.useSyncExternalStoreWithSelector = useSyncExternalStoreWithSelector;\n /* global __REACT_DEVTOOLS_GLOBAL_HOOK__ */\nif (\n typeof __REACT_DEVTOOLS_GLOBAL_HOOK__ !== 'undefined' &&\n typeof __REACT_DEVTOOLS_GLOBAL_HOOK__.registerInternalModuleStop ===\n 'function'\n) {\n __REACT_DEVTOOLS_GLOBAL_HOOK__.registerInternalModuleStop(new Error());\n}\n \n })();\n}\n\nif (process.env.NODE_ENV === 'production') {\n withSelector.exports = withSelector_production_min;\n} else {\n withSelector.exports = withSelector_development;\n}\n\n/*! *****************************************************************************\r\nCopyright (c) Microsoft Corporation.\r\n\r\nPermission to use, copy, modify, and/or distribute this software for any\r\npurpose with or without fee is hereby granted.\r\n\r\nTHE SOFTWARE IS PROVIDED \"AS IS\" AND THE AUTHOR DISCLAIMS ALL WARRANTIES WITH\r\nREGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY\r\nAND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY SPECIAL, DIRECT,\r\nINDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM\r\nLOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR\r\nOTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR\r\nPERFORMANCE OF THIS SOFTWARE.\r\n***************************************************************************** */\r\n\r\nvar __assign$1 = function() {\r\n __assign$1 = Object.assign || function __assign(t) {\r\n for (var s, i = 1, n = arguments.length; i < n; i++) {\r\n s = arguments[i];\r\n for (var p in s) if (Object.prototype.hasOwnProperty.call(s, p)) t[p] = s[p];\r\n }\r\n return t;\r\n };\r\n return __assign$1.apply(this, arguments);\r\n};\r\n\r\nfunction __rest$1(s, e) {\r\n var t = {};\r\n for (var p in s) if (Object.prototype.hasOwnProperty.call(s, p) && e.indexOf(p) < 0)\r\n t[p] = s[p];\r\n if (s != null && typeof Object.getOwnPropertySymbols === \"function\")\r\n for (var i = 0, p = Object.getOwnPropertySymbols(s); i < p.length; i++) {\r\n if (e.indexOf(p[i]) < 0 && Object.prototype.propertyIsEnumerable.call(s, p[i]))\r\n t[p[i]] = s[p[i]];\r\n }\r\n return t;\r\n}\r\n\r\nfunction __values(o) {\r\n var s = typeof Symbol === \"function\" && Symbol.iterator, m = s && o[s], i = 0;\r\n if (m) return m.call(o);\r\n if (o && typeof o.length === \"number\") return {\r\n next: function () {\r\n if (o && i >= o.length) o = void 0;\r\n return { value: o && o[i++], done: !o };\r\n }\r\n };\r\n throw new TypeError(s ? \"Object is not iterable.\" : \"Symbol.iterator is not defined.\");\r\n}\r\n\r\nfunction __read$2(o, n) {\r\n var m = typeof Symbol === \"function\" && o[Symbol.iterator];\r\n if (!m) return o;\r\n var i = m.call(o), r, ar = [], e;\r\n try {\r\n while ((n === void 0 || n-- > 0) && !(r = i.next()).done) ar.push(r.value);\r\n }\r\n catch (error) { e = { error: error }; }\r\n finally {\r\n try {\r\n if (r && !r.done && (m = i[\"return\"])) m.call(i);\r\n }\r\n finally { if (e) throw e.error; }\r\n }\r\n return ar;\r\n}\r\n\r\nfunction __spreadArray(to, from, pack) {\r\n if (pack || arguments.length === 2) for (var i = 0, l = from.length, ar; i < l; i++) {\r\n if (ar || !(i in from)) {\r\n if (!ar) ar = Array.prototype.slice.call(from, 0, i);\r\n ar[i] = from[i];\r\n }\r\n }\r\n return to.concat(ar || Array.prototype.slice.call(from));\r\n}\n\nvar ActionTypes;\n\n(function (ActionTypes) {\n ActionTypes[\"Start\"] = \"xstate.start\";\n ActionTypes[\"Stop\"] = \"xstate.stop\";\n ActionTypes[\"Raise\"] = \"xstate.raise\";\n ActionTypes[\"Send\"] = \"xstate.send\";\n ActionTypes[\"Cancel\"] = \"xstate.cancel\";\n ActionTypes[\"NullEvent\"] = \"\";\n ActionTypes[\"Assign\"] = \"xstate.assign\";\n ActionTypes[\"After\"] = \"xstate.after\";\n ActionTypes[\"DoneState\"] = \"done.state\";\n ActionTypes[\"DoneInvoke\"] = \"done.invoke\";\n ActionTypes[\"Log\"] = \"xstate.log\";\n ActionTypes[\"Init\"] = \"xstate.init\";\n ActionTypes[\"Invoke\"] = \"xstate.invoke\";\n ActionTypes[\"ErrorExecution\"] = \"error.execution\";\n ActionTypes[\"ErrorCommunication\"] = \"error.communication\";\n ActionTypes[\"ErrorPlatform\"] = \"error.platform\";\n ActionTypes[\"ErrorCustom\"] = \"xstate.error\";\n ActionTypes[\"Update\"] = \"xstate.update\";\n ActionTypes[\"Pure\"] = \"xstate.pure\";\n ActionTypes[\"Choose\"] = \"xstate.choose\";\n})(ActionTypes || (ActionTypes = {}));\n\nvar SpecialTargets;\n\n(function (SpecialTargets) {\n SpecialTargets[\"Parent\"] = \"#_parent\";\n SpecialTargets[\"Internal\"] = \"#_internal\";\n})(SpecialTargets || (SpecialTargets = {}));\n\nvar start$1 = ActionTypes.Start;\nvar stop$1 = ActionTypes.Stop;\nvar raise$1 = ActionTypes.Raise;\nvar send$1 = ActionTypes.Send;\nvar cancel$1 = ActionTypes.Cancel;\nvar nullEvent = ActionTypes.NullEvent;\nvar assign$2 = ActionTypes.Assign;\nActionTypes.After;\nActionTypes.DoneState;\nvar log = ActionTypes.Log;\nvar init = ActionTypes.Init;\nvar invoke = ActionTypes.Invoke;\nActionTypes.ErrorExecution;\nvar errorPlatform = ActionTypes.ErrorPlatform;\nvar error$1 = ActionTypes.ErrorCustom;\nvar update = ActionTypes.Update;\nvar choose = ActionTypes.Choose;\nvar pure = ActionTypes.Pure;\n\nvar STATE_DELIMITER = '.';\nvar EMPTY_ACTIVITY_MAP = {};\nvar DEFAULT_GUARD_TYPE = 'xstate.guard';\nvar TARGETLESS_KEY = '';\n\nvar IS_PRODUCTION = process.env.NODE_ENV === 'production';\n\nvar _a;\nfunction matchesState(parentStateId, childStateId, delimiter) {\n if (delimiter === void 0) {\n delimiter = STATE_DELIMITER;\n }\n\n var parentStateValue = toStateValue(parentStateId, delimiter);\n var childStateValue = toStateValue(childStateId, delimiter);\n\n if (isString(childStateValue)) {\n if (isString(parentStateValue)) {\n return childStateValue === parentStateValue;\n } // Parent more specific than child\n\n\n return false;\n }\n\n if (isString(parentStateValue)) {\n return parentStateValue in childStateValue;\n }\n\n return Object.keys(parentStateValue).every(function (key) {\n if (!(key in childStateValue)) {\n return false;\n }\n\n return matchesState(parentStateValue[key], childStateValue[key]);\n });\n}\nfunction getEventType(event) {\n try {\n return isString(event) || typeof event === 'number' ? \"\".concat(event) : event.type;\n } catch (e) {\n throw new Error('Events must be strings or objects with a string event.type property.');\n }\n}\nfunction toStatePath(stateId, delimiter) {\n try {\n if (isArray(stateId)) {\n return stateId;\n }\n\n return stateId.toString().split(delimiter);\n } catch (e) {\n throw new Error(\"'\".concat(stateId, \"' is not a valid state path.\"));\n }\n}\nfunction isStateLike(state) {\n return typeof state === 'object' && 'value' in state && 'context' in state && 'event' in state && '_event' in state;\n}\nfunction toStateValue(stateValue, delimiter) {\n if (isStateLike(stateValue)) {\n return stateValue.value;\n }\n\n if (isArray(stateValue)) {\n return pathToStateValue(stateValue);\n }\n\n if (typeof stateValue !== 'string') {\n return stateValue;\n }\n\n var statePath = toStatePath(stateValue, delimiter);\n return pathToStateValue(statePath);\n}\nfunction pathToStateValue(statePath) {\n if (statePath.length === 1) {\n return statePath[0];\n }\n\n var value = {};\n var marker = value;\n\n for (var i = 0; i < statePath.length - 1; i++) {\n if (i === statePath.length - 2) {\n marker[statePath[i]] = statePath[i + 1];\n } else {\n marker[statePath[i]] = {};\n marker = marker[statePath[i]];\n }\n }\n\n return value;\n}\nfunction mapValues(collection, iteratee) {\n var result = {};\n var collectionKeys = Object.keys(collection);\n\n for (var i = 0; i < collectionKeys.length; i++) {\n var key = collectionKeys[i];\n result[key] = iteratee(collection[key], key, collection, i);\n }\n\n return result;\n}\nfunction mapFilterValues(collection, iteratee, predicate) {\n var e_1, _a;\n\n var result = {};\n\n try {\n for (var _b = __values(Object.keys(collection)), _c = _b.next(); !_c.done; _c = _b.next()) {\n var key = _c.value;\n var item = collection[key];\n\n if (!predicate(item)) {\n continue;\n }\n\n result[key] = iteratee(item, key, collection);\n }\n } catch (e_1_1) {\n e_1 = {\n error: e_1_1\n };\n } finally {\n try {\n if (_c && !_c.done && (_a = _b.return)) _a.call(_b);\n } finally {\n if (e_1) throw e_1.error;\n }\n }\n\n return result;\n}\n/**\r\n * Retrieves a value at the given path.\r\n * @param props The deep path to the prop of the desired value\r\n */\n\nvar path = function (props) {\n return function (object) {\n var e_2, _a;\n\n var result = object;\n\n try {\n for (var props_1 = __values(props), props_1_1 = props_1.next(); !props_1_1.done; props_1_1 = props_1.next()) {\n var prop = props_1_1.value;\n result = result[prop];\n }\n } catch (e_2_1) {\n e_2 = {\n error: e_2_1\n };\n } finally {\n try {\n if (props_1_1 && !props_1_1.done && (_a = props_1.return)) _a.call(props_1);\n } finally {\n if (e_2) throw e_2.error;\n }\n }\n\n return result;\n };\n};\n/**\r\n * Retrieves a value at the given path via the nested accessor prop.\r\n * @param props The deep path to the prop of the desired value\r\n */\n\nfunction nestedPath(props, accessorProp) {\n return function (object) {\n var e_3, _a;\n\n var result = object;\n\n try {\n for (var props_2 = __values(props), props_2_1 = props_2.next(); !props_2_1.done; props_2_1 = props_2.next()) {\n var prop = props_2_1.value;\n result = result[accessorProp][prop];\n }\n } catch (e_3_1) {\n e_3 = {\n error: e_3_1\n };\n } finally {\n try {\n if (props_2_1 && !props_2_1.done && (_a = props_2.return)) _a.call(props_2);\n } finally {\n if (e_3) throw e_3.error;\n }\n }\n\n return result;\n };\n}\nfunction toStatePaths(stateValue) {\n if (!stateValue) {\n return [[]];\n }\n\n if (isString(stateValue)) {\n return [[stateValue]];\n }\n\n var result = flatten(Object.keys(stateValue).map(function (key) {\n var subStateValue = stateValue[key];\n\n if (typeof subStateValue !== 'string' && (!subStateValue || !Object.keys(subStateValue).length)) {\n return [[key]];\n }\n\n return toStatePaths(stateValue[key]).map(function (subPath) {\n return [key].concat(subPath);\n });\n }));\n return result;\n}\nfunction flatten(array) {\n var _a;\n\n return (_a = []).concat.apply(_a, __spreadArray([], __read$2(array), false));\n}\nfunction toArrayStrict(value) {\n if (isArray(value)) {\n return value;\n }\n\n return [value];\n}\nfunction toArray(value) {\n if (value === undefined) {\n return [];\n }\n\n return toArrayStrict(value);\n}\nfunction mapContext(mapper, context, _event) {\n var e_5, _a;\n\n if (isFunction(mapper)) {\n return mapper(context, _event.data);\n }\n\n var result = {};\n\n try {\n for (var _b = __values(Object.keys(mapper)), _c = _b.next(); !_c.done; _c = _b.next()) {\n var key = _c.value;\n var subMapper = mapper[key];\n\n if (isFunction(subMapper)) {\n result[key] = subMapper(context, _event.data);\n } else {\n result[key] = subMapper;\n }\n }\n } catch (e_5_1) {\n e_5 = {\n error: e_5_1\n };\n } finally {\n try {\n if (_c && !_c.done && (_a = _b.return)) _a.call(_b);\n } finally {\n if (e_5) throw e_5.error;\n }\n }\n\n return result;\n}\nfunction isBuiltInEvent(eventType) {\n return /^(done|error)\\./.test(eventType);\n}\nfunction isPromiseLike(value) {\n if (value instanceof Promise) {\n return true;\n } // Check if shape matches the Promise/A+ specification for a \"thenable\".\n\n\n if (value !== null && (isFunction(value) || typeof value === 'object') && isFunction(value.then)) {\n return true;\n }\n\n return false;\n}\nfunction isBehavior(value) {\n return value !== null && typeof value === 'object' && 'transition' in value && typeof value.transition === 'function';\n}\nfunction partition(items, predicate) {\n var e_6, _a;\n\n var _b = __read$2([[], []], 2),\n truthy = _b[0],\n falsy = _b[1];\n\n try {\n for (var items_1 = __values(items), items_1_1 = items_1.next(); !items_1_1.done; items_1_1 = items_1.next()) {\n var item = items_1_1.value;\n\n if (predicate(item)) {\n truthy.push(item);\n } else {\n falsy.push(item);\n }\n }\n } catch (e_6_1) {\n e_6 = {\n error: e_6_1\n };\n } finally {\n try {\n if (items_1_1 && !items_1_1.done && (_a = items_1.return)) _a.call(items_1);\n } finally {\n if (e_6) throw e_6.error;\n }\n }\n\n return [truthy, falsy];\n}\nfunction updateHistoryStates(hist, stateValue) {\n return mapValues(hist.states, function (subHist, key) {\n if (!subHist) {\n return undefined;\n }\n\n var subStateValue = (isString(stateValue) ? undefined : stateValue[key]) || (subHist ? subHist.current : undefined);\n\n if (!subStateValue) {\n return undefined;\n }\n\n return {\n current: subStateValue,\n states: updateHistoryStates(subHist, subStateValue)\n };\n });\n}\nfunction updateHistoryValue(hist, stateValue) {\n return {\n current: stateValue,\n states: updateHistoryStates(hist, stateValue)\n };\n}\nfunction updateContext(context, _event, assignActions, state) {\n if (!IS_PRODUCTION) {\n warn(!!context, 'Attempting to update undefined context');\n }\n\n var updatedContext = context ? assignActions.reduce(function (acc, assignAction) {\n var e_7, _a;\n\n var assignment = assignAction.assignment;\n var meta = {\n state: state,\n action: assignAction,\n _event: _event\n };\n var partialUpdate = {};\n\n if (isFunction(assignment)) {\n partialUpdate = assignment(acc, _event.data, meta);\n } else {\n try {\n for (var _b = __values(Object.keys(assignment)), _c = _b.next(); !_c.done; _c = _b.next()) {\n var key = _c.value;\n var propAssignment = assignment[key];\n partialUpdate[key] = isFunction(propAssignment) ? propAssignment(acc, _event.data, meta) : propAssignment;\n }\n } catch (e_7_1) {\n e_7 = {\n error: e_7_1\n };\n } finally {\n try {\n if (_c && !_c.done && (_a = _b.return)) _a.call(_b);\n } finally {\n if (e_7) throw e_7.error;\n }\n }\n }\n\n return Object.assign({}, acc, partialUpdate);\n }, context) : context;\n return updatedContext;\n} // tslint:disable-next-line:no-empty\n\nvar warn = function () {};\n\nif (!IS_PRODUCTION) {\n warn = function (condition, message) {\n var error = condition instanceof Error ? condition : undefined;\n\n if (!error && condition) {\n return;\n }\n\n if (console !== undefined) {\n var args = [\"Warning: \".concat(message)];\n\n if (error) {\n args.push(error);\n } // tslint:disable-next-line:no-console\n\n\n console.warn.apply(console, args);\n }\n };\n}\nfunction isArray(value) {\n return Array.isArray(value);\n} // tslint:disable-next-line:ban-types\n\nfunction isFunction(value) {\n return typeof value === 'function';\n}\nfunction isString(value) {\n return typeof value === 'string';\n}\nfunction toGuard(condition, guardMap) {\n if (!condition) {\n return undefined;\n }\n\n if (isString(condition)) {\n return {\n type: DEFAULT_GUARD_TYPE,\n name: condition,\n predicate: guardMap ? guardMap[condition] : undefined\n };\n }\n\n if (isFunction(condition)) {\n return {\n type: DEFAULT_GUARD_TYPE,\n name: condition.name,\n predicate: condition\n };\n }\n\n return condition;\n}\nfunction isObservable(value) {\n try {\n return 'subscribe' in value && isFunction(value.subscribe);\n } catch (e) {\n return false;\n }\n}\nvar symbolObservable = /*#__PURE__*/function () {\n return typeof Symbol === 'function' && Symbol.observable || '@@observable';\n}(); // TODO: to be removed in v5, left it out just to minimize the scope of the change and maintain compatibility with older versions of integration paackages\n\n(_a = {}, _a[symbolObservable] = function () {\n return this;\n}, _a[Symbol.observable] = function () {\n return this;\n}, _a);\nfunction isMachine(value) {\n return !!value && '__xstatenode' in value;\n}\nfunction isActor$1(value) {\n return !!value && typeof value.send === 'function';\n}\nfunction toEventObject(event, payload // id?: TEvent['type']\n) {\n if (isString(event) || typeof event === 'number') {\n return __assign$1({\n type: event\n }, payload);\n }\n\n return event;\n}\nfunction toSCXMLEvent(event, scxmlEvent) {\n if (!isString(event) && '$$type' in event && event.$$type === 'scxml') {\n return event;\n }\n\n var eventObject = toEventObject(event);\n return __assign$1({\n name: eventObject.type,\n data: eventObject,\n $$type: 'scxml',\n type: 'external'\n }, scxmlEvent);\n}\nfunction toTransitionConfigArray(event, configLike) {\n var transitions = toArrayStrict(configLike).map(function (transitionLike) {\n if (typeof transitionLike === 'undefined' || typeof transitionLike === 'string' || isMachine(transitionLike)) {\n return {\n target: transitionLike,\n event: event\n };\n }\n\n return __assign$1(__assign$1({}, transitionLike), {\n event: event\n });\n });\n return transitions;\n}\nfunction normalizeTarget(target) {\n if (target === undefined || target === TARGETLESS_KEY) {\n return undefined;\n }\n\n return toArray(target);\n}\nfunction reportUnhandledExceptionOnInvocation(originalError, currentError, id) {\n if (!IS_PRODUCTION) {\n var originalStackTrace = originalError.stack ? \" Stacktrace was '\".concat(originalError.stack, \"'\") : '';\n\n if (originalError === currentError) {\n // tslint:disable-next-line:no-console\n console.error(\"Missing onError handler for invocation '\".concat(id, \"', error was '\").concat(originalError, \"'.\").concat(originalStackTrace));\n } else {\n var stackTrace = currentError.stack ? \" Stacktrace was '\".concat(currentError.stack, \"'\") : ''; // tslint:disable-next-line:no-console\n\n console.error(\"Missing onError handler and/or unhandled exception/promise rejection for invocation '\".concat(id, \"'. \") + \"Original error: '\".concat(originalError, \"'. \").concat(originalStackTrace, \" Current error is '\").concat(currentError, \"'.\").concat(stackTrace));\n }\n }\n}\nfunction evaluateGuard(machine, guard, context, _event, state) {\n var guards = machine.options.guards;\n var guardMeta = {\n state: state,\n cond: guard,\n _event: _event\n }; // TODO: do not hardcode!\n\n if (guard.type === DEFAULT_GUARD_TYPE) {\n return ((guards === null || guards === void 0 ? void 0 : guards[guard.name]) || guard.predicate)(context, _event.data, guardMeta);\n }\n\n var condFn = guards === null || guards === void 0 ? void 0 : guards[guard.type];\n\n if (!condFn) {\n throw new Error(\"Guard '\".concat(guard.type, \"' is not implemented on machine '\").concat(machine.id, \"'.\"));\n }\n\n return condFn(context, _event.data, guardMeta);\n}\nfunction toInvokeSource$1(src) {\n if (typeof src === 'string') {\n return {\n type: src\n };\n }\n\n return src;\n}\nfunction toObserver(nextHandler, errorHandler, completionHandler) {\n var noop = function () {};\n\n var isObserver = typeof nextHandler === 'object';\n var self = isObserver ? nextHandler : null;\n return {\n next: ((isObserver ? nextHandler.next : nextHandler) || noop).bind(self),\n error: ((isObserver ? nextHandler.error : errorHandler) || noop).bind(self),\n complete: ((isObserver ? nextHandler.complete : completionHandler) || noop).bind(self)\n };\n}\nfunction createInvokeId(stateNodeId, index) {\n return \"\".concat(stateNodeId, \":invocation[\").concat(index, \"]\");\n}\nfunction isRaisableAction(action) {\n return (action.type === raise$1 || action.type === send$1 && action.to === SpecialTargets.Internal) && typeof action.delay !== 'number';\n}\n\nvar initEvent = /*#__PURE__*/toSCXMLEvent({\n type: init\n});\nfunction getActionFunction(actionType, actionFunctionMap) {\n return actionFunctionMap ? actionFunctionMap[actionType] || undefined : undefined;\n}\nfunction toActionObject(action, actionFunctionMap) {\n var actionObject;\n\n if (isString(action) || typeof action === 'number') {\n var exec = getActionFunction(action, actionFunctionMap);\n\n if (isFunction(exec)) {\n actionObject = {\n type: action,\n exec: exec\n };\n } else if (exec) {\n actionObject = exec;\n } else {\n actionObject = {\n type: action,\n exec: undefined\n };\n }\n } else if (isFunction(action)) {\n actionObject = {\n // Convert action to string if unnamed\n type: action.name || action.toString(),\n exec: action\n };\n } else {\n var exec = getActionFunction(action.type, actionFunctionMap);\n\n if (isFunction(exec)) {\n actionObject = __assign$1(__assign$1({}, action), {\n exec: exec\n });\n } else if (exec) {\n var actionType = exec.type || action.type;\n actionObject = __assign$1(__assign$1(__assign$1({}, exec), action), {\n type: actionType\n });\n } else {\n actionObject = action;\n }\n }\n\n return actionObject;\n}\nvar toActionObjects = function (action, actionFunctionMap) {\n if (!action) {\n return [];\n }\n\n var actions = isArray(action) ? action : [action];\n return actions.map(function (subAction) {\n return toActionObject(subAction, actionFunctionMap);\n });\n};\nfunction toActivityDefinition(action) {\n var actionObject = toActionObject(action);\n return __assign$1(__assign$1({\n id: isString(action) ? action : actionObject.id\n }, actionObject), {\n type: actionObject.type\n });\n}\n/**\r\n * Raises an event. This places the event in the internal event queue, so that\r\n * the event is immediately consumed by the machine in the current step.\r\n *\r\n * @param eventType The event to raise.\r\n */\n\nfunction raise(event, options) {\n return {\n type: raise$1,\n event: typeof event === 'function' ? event : toEventObject(event),\n delay: options ? options.delay : undefined,\n id: options === null || options === void 0 ? void 0 : options.id\n };\n}\nfunction resolveRaise(action, ctx, _event, delaysMap) {\n var meta = {\n _event: _event\n };\n var resolvedEvent = toSCXMLEvent(isFunction(action.event) ? action.event(ctx, _event.data, meta) : action.event);\n var resolvedDelay;\n\n if (isString(action.delay)) {\n var configDelay = delaysMap && delaysMap[action.delay];\n resolvedDelay = isFunction(configDelay) ? configDelay(ctx, _event.data, meta) : configDelay;\n } else {\n resolvedDelay = isFunction(action.delay) ? action.delay(ctx, _event.data, meta) : action.delay;\n }\n\n return __assign$1(__assign$1({}, action), {\n type: raise$1,\n _event: resolvedEvent,\n delay: resolvedDelay\n });\n}\n/**\r\n * Sends an event. This returns an action that will be read by an interpreter to\r\n * send the event in the next step, after the current step is finished executing.\r\n *\r\n * @deprecated Use the `sendTo(...)` action creator instead.\r\n *\r\n * @param event The event to send.\r\n * @param options Options to pass into the send event:\r\n * - `id` - The unique send event identifier (used with `cancel()`).\r\n * - `delay` - The number of milliseconds to delay the sending of the event.\r\n * - `to` - The target of this event (by default, the machine the event was sent from).\r\n */\n\nfunction send(event, options) {\n return {\n to: options ? options.to : undefined,\n type: send$1,\n event: isFunction(event) ? event : toEventObject(event),\n delay: options ? options.delay : undefined,\n // TODO: don't auto-generate IDs here like that\n // there is too big chance of the ID collision\n id: options && options.id !== undefined ? options.id : isFunction(event) ? event.name : getEventType(event)\n };\n}\nfunction resolveSend(action, ctx, _event, delaysMap) {\n var meta = {\n _event: _event\n }; // TODO: helper function for resolving Expr\n\n var resolvedEvent = toSCXMLEvent(isFunction(action.event) ? action.event(ctx, _event.data, meta) : action.event);\n var resolvedDelay;\n\n if (isString(action.delay)) {\n var configDelay = delaysMap && delaysMap[action.delay];\n resolvedDelay = isFunction(configDelay) ? configDelay(ctx, _event.data, meta) : configDelay;\n } else {\n resolvedDelay = isFunction(action.delay) ? action.delay(ctx, _event.data, meta) : action.delay;\n }\n\n var resolvedTarget = isFunction(action.to) ? action.to(ctx, _event.data, meta) : action.to;\n return __assign$1(__assign$1({}, action), {\n to: resolvedTarget,\n _event: resolvedEvent,\n event: resolvedEvent.data,\n delay: resolvedDelay\n });\n}\nvar resolveLog = function (action, ctx, _event) {\n return __assign$1(__assign$1({}, action), {\n value: isString(action.expr) ? action.expr : action.expr(ctx, _event.data, {\n _event: _event\n })\n });\n};\n/**\r\n * Cancels an in-flight `send(...)` action. A canceled sent action will not\r\n * be executed, nor will its event be sent, unless it has already been sent\r\n * (e.g., if `cancel(...)` is called after the `send(...)` action's `delay`).\r\n *\r\n * @param sendId The `id` of the `send(...)` action to cancel.\r\n */\n\nvar cancel = function (sendId) {\n return {\n type: cancel$1,\n sendId: sendId\n };\n};\n/**\r\n * Starts an activity.\r\n *\r\n * @param activity The activity to start.\r\n */\n\nfunction start(activity) {\n var activityDef = toActivityDefinition(activity);\n return {\n type: ActionTypes.Start,\n activity: activityDef,\n exec: undefined\n };\n}\n/**\r\n * Stops an activity.\r\n *\r\n * @param actorRef The activity to stop.\r\n */\n\nfunction stop(actorRef) {\n var activity = isFunction(actorRef) ? actorRef : toActivityDefinition(actorRef);\n return {\n type: ActionTypes.Stop,\n activity: activity,\n exec: undefined\n };\n}\nfunction resolveStop(action, context, _event) {\n var actorRefOrString = isFunction(action.activity) ? action.activity(context, _event.data) : action.activity;\n var resolvedActorRef = typeof actorRefOrString === 'string' ? {\n id: actorRefOrString\n } : actorRefOrString;\n var actionObject = {\n type: ActionTypes.Stop,\n activity: resolvedActorRef\n };\n return actionObject;\n}\n/**\r\n * Updates the current context of the machine.\r\n *\r\n * @param assignment An object that represents the partial context to update.\r\n */\n\nvar assign$1 = function (assignment) {\n return {\n type: assign$2,\n assignment: assignment\n };\n};\n/**\r\n * Returns an event type that represents an implicit event that\r\n * is sent after the specified `delay`.\r\n *\r\n * @param delayRef The delay in milliseconds\r\n * @param id The state node ID where this event is handled\r\n */\n\nfunction after(delayRef, id) {\n var idSuffix = id ? \"#\".concat(id) : '';\n return \"\".concat(ActionTypes.After, \"(\").concat(delayRef, \")\").concat(idSuffix);\n}\n/**\r\n * Returns an event that represents that a final state node\r\n * has been reached in the parent state node.\r\n *\r\n * @param id The final state node's parent state node `id`\r\n * @param data The data to pass into the event\r\n */\n\nfunction done(id, data) {\n var type = \"\".concat(ActionTypes.DoneState, \".\").concat(id);\n var eventObject = {\n type: type,\n data: data\n };\n\n eventObject.toString = function () {\n return type;\n };\n\n return eventObject;\n}\n/**\r\n * Returns an event that represents that an invoked service has terminated.\r\n *\r\n * An invoked service is terminated when it has reached a top-level final state node,\r\n * but not when it is canceled.\r\n *\r\n * @param id The final state node ID\r\n * @param data The data to pass into the event\r\n */\n\nfunction doneInvoke(id, data) {\n var type = \"\".concat(ActionTypes.DoneInvoke, \".\").concat(id);\n var eventObject = {\n type: type,\n data: data\n };\n\n eventObject.toString = function () {\n return type;\n };\n\n return eventObject;\n}\nfunction error(id, data) {\n var type = \"\".concat(ActionTypes.ErrorPlatform, \".\").concat(id);\n var eventObject = {\n type: type,\n data: data\n };\n\n eventObject.toString = function () {\n return type;\n };\n\n return eventObject;\n}\n\nvar pluckAssigns = function (actionBlocks) {\n var e_1, _a;\n\n var assignActions = [];\n\n try {\n for (var actionBlocks_1 = __values(actionBlocks), actionBlocks_1_1 = actionBlocks_1.next(); !actionBlocks_1_1.done; actionBlocks_1_1 = actionBlocks_1.next()) {\n var block = actionBlocks_1_1.value;\n var i = 0;\n\n while (i < block.actions.length) {\n if (block.actions[i].type === assign$2) {\n assignActions.push(block.actions[i]);\n block.actions.splice(i, 1);\n continue;\n }\n\n i++;\n }\n }\n } catch (e_1_1) {\n e_1 = {\n error: e_1_1\n };\n } finally {\n try {\n if (actionBlocks_1_1 && !actionBlocks_1_1.done && (_a = actionBlocks_1.return)) _a.call(actionBlocks_1);\n } finally {\n if (e_1) throw e_1.error;\n }\n }\n\n return assignActions;\n};\n\nfunction resolveActions(machine, currentState, currentContext, _event, actionBlocks, predictableExec, preserveActionOrder) {\n if (preserveActionOrder === void 0) {\n preserveActionOrder = false;\n }\n\n var assignActions = preserveActionOrder ? [] : pluckAssigns(actionBlocks);\n var updatedContext = assignActions.length ? updateContext(currentContext, _event, assignActions, currentState) : currentContext;\n var preservedContexts = preserveActionOrder ? [currentContext] : undefined;\n var deferredToBlockEnd = [];\n\n function handleAction(blockType, actionObject) {\n var _a;\n\n switch (actionObject.type) {\n case raise$1:\n {\n var raisedAction = resolveRaise(actionObject, updatedContext, _event, machine.options.delays);\n\n if (predictableExec && typeof raisedAction.delay === 'number') {\n predictableExec(raisedAction, updatedContext, _event);\n }\n\n return raisedAction;\n }\n\n case send$1:\n var sendAction = resolveSend(actionObject, updatedContext, _event, machine.options.delays); // TODO: fix ActionTypes.Init\n\n if (!IS_PRODUCTION) {\n var configuredDelay = actionObject.delay; // warn after resolving as we can create better contextual message here\n\n warn(!isString(configuredDelay) || typeof sendAction.delay === 'number', // tslint:disable-next-line:max-line-length\n \"No delay reference for delay expression '\".concat(configuredDelay, \"' was found on machine '\").concat(machine.id, \"'\"));\n }\n\n if (predictableExec && sendAction.to !== SpecialTargets.Internal) {\n if (blockType === 'entry') {\n deferredToBlockEnd.push(sendAction);\n } else {\n predictableExec(sendAction, updatedContext, _event);\n }\n }\n\n return sendAction;\n\n case log:\n {\n var resolved = resolveLog(actionObject, updatedContext, _event);\n predictableExec === null || predictableExec === void 0 ? void 0 : predictableExec(resolved, updatedContext, _event);\n return resolved;\n }\n\n case choose:\n {\n var chooseAction = actionObject;\n var matchedActions = (_a = chooseAction.conds.find(function (condition) {\n var guard = toGuard(condition.cond, machine.options.guards);\n return !guard || evaluateGuard(machine, guard, updatedContext, _event, !predictableExec ? currentState : undefined);\n })) === null || _a === void 0 ? void 0 : _a.actions;\n\n if (!matchedActions) {\n return [];\n }\n\n var _b = __read$2(resolveActions(machine, currentState, updatedContext, _event, [{\n type: blockType,\n actions: toActionObjects(toArray(matchedActions), machine.options.actions)\n }], predictableExec, preserveActionOrder), 2),\n resolvedActionsFromChoose = _b[0],\n resolvedContextFromChoose = _b[1];\n\n updatedContext = resolvedContextFromChoose;\n preservedContexts === null || preservedContexts === void 0 ? void 0 : preservedContexts.push(updatedContext);\n return resolvedActionsFromChoose;\n }\n\n case pure:\n {\n var matchedActions = actionObject.get(updatedContext, _event.data);\n\n if (!matchedActions) {\n return [];\n }\n\n var _c = __read$2(resolveActions(machine, currentState, updatedContext, _event, [{\n type: blockType,\n actions: toActionObjects(toArray(matchedActions), machine.options.actions)\n }], predictableExec, preserveActionOrder), 2),\n resolvedActionsFromPure = _c[0],\n resolvedContext = _c[1];\n\n updatedContext = resolvedContext;\n preservedContexts === null || preservedContexts === void 0 ? void 0 : preservedContexts.push(updatedContext);\n return resolvedActionsFromPure;\n }\n\n case stop$1:\n {\n var resolved = resolveStop(actionObject, updatedContext, _event);\n predictableExec === null || predictableExec === void 0 ? void 0 : predictableExec(resolved, currentContext, _event);\n return resolved;\n }\n\n case assign$2:\n {\n updatedContext = updateContext(updatedContext, _event, [actionObject], !predictableExec ? currentState : undefined);\n preservedContexts === null || preservedContexts === void 0 ? void 0 : preservedContexts.push(updatedContext);\n break;\n }\n\n default:\n var resolvedActionObject = toActionObject(actionObject, machine.options.actions);\n var exec_1 = resolvedActionObject.exec;\n\n if (predictableExec) {\n predictableExec(resolvedActionObject, updatedContext, _event);\n } else if (exec_1 && preservedContexts) {\n var contextIndex_1 = preservedContexts.length - 1;\n\n var wrapped = __assign$1(__assign$1({}, resolvedActionObject), {\n exec: function (_ctx) {\n var args = [];\n\n for (var _i = 1; _i < arguments.length; _i++) {\n args[_i - 1] = arguments[_i];\n }\n\n exec_1.apply(void 0, __spreadArray([preservedContexts[contextIndex_1]], __read$2(args), false));\n }\n });\n\n resolvedActionObject = wrapped;\n }\n\n return resolvedActionObject;\n }\n }\n\n function processBlock(block) {\n var e_2, _a;\n\n var resolvedActions = [];\n\n try {\n for (var _b = __values(block.actions), _c = _b.next(); !_c.done; _c = _b.next()) {\n var action = _c.value;\n var resolved = handleAction(block.type, action);\n\n if (resolved) {\n resolvedActions = resolvedActions.concat(resolved);\n }\n }\n } catch (e_2_1) {\n e_2 = {\n error: e_2_1\n };\n } finally {\n try {\n if (_c && !_c.done && (_a = _b.return)) _a.call(_b);\n } finally {\n if (e_2) throw e_2.error;\n }\n }\n\n deferredToBlockEnd.forEach(function (action) {\n predictableExec(action, updatedContext, _event);\n });\n deferredToBlockEnd.length = 0;\n return resolvedActions;\n }\n\n var resolvedActions = flatten(actionBlocks.map(processBlock));\n return [resolvedActions, updatedContext];\n}\n\n/**\r\n * Maintains a stack of the current service in scope.\r\n * This is used to provide the correct service to spawn().\r\n */\nvar provide = function (service, fn) {\n var result = fn(service);\n return result;\n};\n\nfunction createNullActor(id) {\n var _a;\n\n return _a = {\n id: id,\n send: function () {\n return void 0;\n },\n subscribe: function () {\n return {\n unsubscribe: function () {\n return void 0;\n }\n };\n },\n getSnapshot: function () {\n return undefined;\n },\n toJSON: function () {\n return {\n id: id\n };\n }\n }, _a[symbolObservable] = function () {\n return this;\n }, _a;\n}\n/**\r\n * Creates a deferred actor that is able to be invoked given the provided\r\n * invocation information in its `.meta` value.\r\n *\r\n * @param invokeDefinition The meta information needed to invoke the actor.\r\n */\n\nfunction createInvocableActor(invokeDefinition, machine, context, _event) {\n var _a;\n\n var invokeSrc = toInvokeSource$1(invokeDefinition.src);\n var serviceCreator = (_a = machine === null || machine === void 0 ? void 0 : machine.options.services) === null || _a === void 0 ? void 0 : _a[invokeSrc.type];\n var resolvedData = invokeDefinition.data ? mapContext(invokeDefinition.data, context, _event) : undefined;\n var tempActor = serviceCreator ? createDeferredActor(serviceCreator, invokeDefinition.id, resolvedData) : createNullActor(invokeDefinition.id); // @ts-ignore\n\n tempActor.meta = invokeDefinition;\n return tempActor;\n}\nfunction createDeferredActor(entity, id, data) {\n var tempActor = createNullActor(id); // @ts-ignore\n\n tempActor.deferred = true;\n\n if (isMachine(entity)) {\n // \"mute\" the existing service scope so potential spawned actors within the `.initialState` stay deferred here\n var initialState_1 = tempActor.state = provide(undefined, function () {\n return (data ? entity.withContext(data) : entity).initialState;\n });\n\n tempActor.getSnapshot = function () {\n return initialState_1;\n };\n }\n\n return tempActor;\n}\nfunction isActor(item) {\n try {\n return typeof item.send === 'function';\n } catch (e) {\n return false;\n }\n}\nfunction isSpawnedActor(item) {\n return isActor(item) && 'id' in item;\n} // TODO: refactor the return type, this could be written in a better way but it's best to avoid unneccessary breaking changes now\n\nfunction toActorRef(actorRefLike) {\n var _a;\n\n return __assign$1((_a = {\n subscribe: function () {\n return {\n unsubscribe: function () {\n return void 0;\n }\n };\n },\n id: 'anonymous',\n getSnapshot: function () {\n return undefined;\n }\n }, _a[symbolObservable] = function () {\n return this;\n }, _a), actorRefLike);\n}\n\nvar isLeafNode = function (stateNode) {\n return stateNode.type === 'atomic' || stateNode.type === 'final';\n};\nfunction getAllChildren(stateNode) {\n return Object.keys(stateNode.states).map(function (key) {\n return stateNode.states[key];\n });\n}\nfunction getChildren(stateNode) {\n return getAllChildren(stateNode).filter(function (sn) {\n return sn.type !== 'history';\n });\n}\nfunction getAllStateNodes(stateNode) {\n var stateNodes = [stateNode];\n\n if (isLeafNode(stateNode)) {\n return stateNodes;\n }\n\n return stateNodes.concat(flatten(getChildren(stateNode).map(getAllStateNodes)));\n}\nfunction getConfiguration(prevStateNodes, stateNodes) {\n var e_1, _a, e_2, _b, e_3, _c, e_4, _d;\n\n var prevConfiguration = new Set(prevStateNodes);\n var prevAdjList = getAdjList(prevConfiguration);\n var configuration = new Set(stateNodes);\n\n try {\n // add all ancestors\n for (var configuration_1 = __values(configuration), configuration_1_1 = configuration_1.next(); !configuration_1_1.done; configuration_1_1 = configuration_1.next()) {\n var s = configuration_1_1.value;\n var m = s.parent;\n\n while (m && !configuration.has(m)) {\n configuration.add(m);\n m = m.parent;\n }\n }\n } catch (e_1_1) {\n e_1 = {\n error: e_1_1\n };\n } finally {\n try {\n if (configuration_1_1 && !configuration_1_1.done && (_a = configuration_1.return)) _a.call(configuration_1);\n } finally {\n if (e_1) throw e_1.error;\n }\n }\n\n var adjList = getAdjList(configuration);\n\n try {\n // add descendants\n for (var configuration_2 = __values(configuration), configuration_2_1 = configuration_2.next(); !configuration_2_1.done; configuration_2_1 = configuration_2.next()) {\n var s = configuration_2_1.value; // if previously active, add existing child nodes\n\n if (s.type === 'compound' && (!adjList.get(s) || !adjList.get(s).length)) {\n if (prevAdjList.get(s)) {\n prevAdjList.get(s).forEach(function (sn) {\n return configuration.add(sn);\n });\n } else {\n s.initialStateNodes.forEach(function (sn) {\n return configuration.add(sn);\n });\n }\n } else {\n if (s.type === 'parallel') {\n try {\n for (var _e = (e_3 = void 0, __values(getChildren(s))), _f = _e.next(); !_f.done; _f = _e.next()) {\n var child = _f.value;\n\n if (!configuration.has(child)) {\n configuration.add(child);\n\n if (prevAdjList.get(child)) {\n prevAdjList.get(child).forEach(function (sn) {\n return configuration.add(sn);\n });\n } else {\n child.initialStateNodes.forEach(function (sn) {\n return configuration.add(sn);\n });\n }\n }\n }\n } catch (e_3_1) {\n e_3 = {\n error: e_3_1\n };\n } finally {\n try {\n if (_f && !_f.done && (_c = _e.return)) _c.call(_e);\n } finally {\n if (e_3) throw e_3.error;\n }\n }\n }\n }\n }\n } catch (e_2_1) {\n e_2 = {\n error: e_2_1\n };\n } finally {\n try {\n if (configuration_2_1 && !configuration_2_1.done && (_b = configuration_2.return)) _b.call(configuration_2);\n } finally {\n if (e_2) throw e_2.error;\n }\n }\n\n try {\n // add all ancestors\n for (var configuration_3 = __values(configuration), configuration_3_1 = configuration_3.next(); !configuration_3_1.done; configuration_3_1 = configuration_3.next()) {\n var s = configuration_3_1.value;\n var m = s.parent;\n\n while (m && !configuration.has(m)) {\n configuration.add(m);\n m = m.parent;\n }\n }\n } catch (e_4_1) {\n e_4 = {\n error: e_4_1\n };\n } finally {\n try {\n if (configuration_3_1 && !configuration_3_1.done && (_d = configuration_3.return)) _d.call(configuration_3);\n } finally {\n if (e_4) throw e_4.error;\n }\n }\n\n return configuration;\n}\n\nfunction getValueFromAdj(baseNode, adjList) {\n var childStateNodes = adjList.get(baseNode);\n\n if (!childStateNodes) {\n return {}; // todo: fix?\n }\n\n if (baseNode.type === 'compound') {\n var childStateNode = childStateNodes[0];\n\n if (childStateNode) {\n if (isLeafNode(childStateNode)) {\n return childStateNode.key;\n }\n } else {\n return {};\n }\n }\n\n var stateValue = {};\n childStateNodes.forEach(function (csn) {\n stateValue[csn.key] = getValueFromAdj(csn, adjList);\n });\n return stateValue;\n}\n\nfunction getAdjList(configuration) {\n var e_5, _a;\n\n var adjList = new Map();\n\n try {\n for (var configuration_4 = __values(configuration), configuration_4_1 = configuration_4.next(); !configuration_4_1.done; configuration_4_1 = configuration_4.next()) {\n var s = configuration_4_1.value;\n\n if (!adjList.has(s)) {\n adjList.set(s, []);\n }\n\n if (s.parent) {\n if (!adjList.has(s.parent)) {\n adjList.set(s.parent, []);\n }\n\n adjList.get(s.parent).push(s);\n }\n }\n } catch (e_5_1) {\n e_5 = {\n error: e_5_1\n };\n } finally {\n try {\n if (configuration_4_1 && !configuration_4_1.done && (_a = configuration_4.return)) _a.call(configuration_4);\n } finally {\n if (e_5) throw e_5.error;\n }\n }\n\n return adjList;\n}\nfunction getValue(rootNode, configuration) {\n var config = getConfiguration([rootNode], configuration);\n return getValueFromAdj(rootNode, getAdjList(config));\n}\nfunction has(iterable, item) {\n if (Array.isArray(iterable)) {\n return iterable.some(function (member) {\n return member === item;\n });\n }\n\n if (iterable instanceof Set) {\n return iterable.has(item);\n }\n\n return false; // TODO: fix\n}\nfunction nextEvents(configuration) {\n return __spreadArray([], __read$2(new Set(flatten(__spreadArray([], __read$2(configuration.map(function (sn) {\n return sn.ownEvents;\n })), false)))), false);\n}\nfunction isInFinalState(configuration, stateNode) {\n if (stateNode.type === 'compound') {\n return getChildren(stateNode).some(function (s) {\n return s.type === 'final' && has(configuration, s);\n });\n }\n\n if (stateNode.type === 'parallel') {\n return getChildren(stateNode).every(function (sn) {\n return isInFinalState(configuration, sn);\n });\n }\n\n return false;\n}\nfunction getMeta(configuration) {\n if (configuration === void 0) {\n configuration = [];\n }\n\n return configuration.reduce(function (acc, stateNode) {\n if (stateNode.meta !== undefined) {\n acc[stateNode.id] = stateNode.meta;\n }\n\n return acc;\n }, {});\n}\nfunction getTagsFromConfiguration(configuration) {\n return new Set(flatten(configuration.map(function (sn) {\n return sn.tags;\n })));\n}\n\nfunction stateValuesEqual(a, b) {\n if (a === b) {\n return true;\n }\n\n if (a === undefined || b === undefined) {\n return false;\n }\n\n if (isString(a) || isString(b)) {\n return a === b;\n }\n\n var aKeys = Object.keys(a);\n var bKeys = Object.keys(b);\n return aKeys.length === bKeys.length && aKeys.every(function (key) {\n return stateValuesEqual(a[key], b[key]);\n });\n}\nfunction isStateConfig(state) {\n if (typeof state !== 'object' || state === null) {\n return false;\n }\n\n return 'value' in state && '_event' in state;\n}\nfunction bindActionToState(action, state) {\n var exec = action.exec;\n\n var boundAction = __assign$1(__assign$1({}, action), {\n exec: exec !== undefined ? function () {\n return exec(state.context, state.event, {\n action: action,\n state: state,\n _event: state._event\n });\n } : undefined\n });\n\n return boundAction;\n}\n\nvar State =\n/*#__PURE__*/\n\n/** @class */\nfunction () {\n /**\r\n * Creates a new State instance.\r\n * @param value The state value\r\n * @param context The extended state\r\n * @param historyValue The tree representing historical values of the state nodes\r\n * @param history The previous state\r\n * @param actions An array of action objects to execute as side-effects\r\n * @param activities A mapping of activities and whether they are started (`true`) or stopped (`false`).\r\n * @param meta\r\n * @param events Internal event queue. Should be empty with run-to-completion semantics.\r\n * @param configuration\r\n */\n function State(config) {\n var _this = this;\n\n var _a;\n\n this.actions = [];\n this.activities = EMPTY_ACTIVITY_MAP;\n this.meta = {};\n this.events = [];\n this.value = config.value;\n this.context = config.context;\n this._event = config._event;\n this._sessionid = config._sessionid;\n this.event = this._event.data;\n this.historyValue = config.historyValue;\n this.history = config.history;\n this.actions = config.actions || [];\n this.activities = config.activities || EMPTY_ACTIVITY_MAP;\n this.meta = getMeta(config.configuration);\n this.events = config.events || [];\n this.matches = this.matches.bind(this);\n this.toStrings = this.toStrings.bind(this);\n this.configuration = config.configuration;\n this.transitions = config.transitions;\n this.children = config.children;\n this.done = !!config.done;\n this.tags = (_a = Array.isArray(config.tags) ? new Set(config.tags) : config.tags) !== null && _a !== void 0 ? _a : new Set();\n this.machine = config.machine;\n Object.defineProperty(this, 'nextEvents', {\n get: function () {\n return nextEvents(_this.configuration);\n }\n });\n }\n /**\r\n * Creates a new State instance for the given `stateValue` and `context`.\r\n * @param stateValue\r\n * @param context\r\n */\n\n\n State.from = function (stateValue, context) {\n if (stateValue instanceof State) {\n if (stateValue.context !== context) {\n return new State({\n value: stateValue.value,\n context: context,\n _event: stateValue._event,\n _sessionid: null,\n historyValue: stateValue.historyValue,\n history: stateValue.history,\n actions: [],\n activities: stateValue.activities,\n meta: {},\n events: [],\n configuration: [],\n transitions: [],\n children: {}\n });\n }\n\n return stateValue;\n }\n\n var _event = initEvent;\n return new State({\n value: stateValue,\n context: context,\n _event: _event,\n _sessionid: null,\n historyValue: undefined,\n history: undefined,\n actions: [],\n activities: undefined,\n meta: undefined,\n events: [],\n configuration: [],\n transitions: [],\n children: {}\n });\n };\n /**\r\n * Creates a new State instance for the given `config`.\r\n * @param config The state config\r\n */\n\n\n State.create = function (config) {\n return new State(config);\n };\n /**\r\n * Creates a new `State` instance for the given `stateValue` and `context` with no actions (side-effects).\r\n * @param stateValue\r\n * @param context\r\n */\n\n\n State.inert = function (stateValue, context) {\n if (stateValue instanceof State) {\n if (!stateValue.actions.length) {\n return stateValue;\n }\n\n var _event = initEvent;\n return new State({\n value: stateValue.value,\n context: context,\n _event: _event,\n _sessionid: null,\n historyValue: stateValue.historyValue,\n history: stateValue.history,\n activities: stateValue.activities,\n configuration: stateValue.configuration,\n transitions: [],\n children: {}\n });\n }\n\n return State.from(stateValue, context);\n };\n /**\r\n * Returns an array of all the string leaf state node paths.\r\n * @param stateValue\r\n * @param delimiter The character(s) that separate each subpath in the string state node path.\r\n */\n\n\n State.prototype.toStrings = function (stateValue, delimiter) {\n var _this = this;\n\n if (stateValue === void 0) {\n stateValue = this.value;\n }\n\n if (delimiter === void 0) {\n delimiter = '.';\n }\n\n if (isString(stateValue)) {\n return [stateValue];\n }\n\n var valueKeys = Object.keys(stateValue);\n return valueKeys.concat.apply(valueKeys, __spreadArray([], __read$2(valueKeys.map(function (key) {\n return _this.toStrings(stateValue[key], delimiter).map(function (s) {\n return key + delimiter + s;\n });\n })), false));\n };\n\n State.prototype.toJSON = function () {\n var _a = this;\n _a.configuration;\n _a.transitions;\n var tags = _a.tags;\n _a.machine;\n var jsonValues = __rest$1(_a, [\"configuration\", \"transitions\", \"tags\", \"machine\"]);\n\n return __assign$1(__assign$1({}, jsonValues), {\n tags: Array.from(tags)\n });\n };\n\n State.prototype.matches = function (parentStateValue) {\n return matchesState(parentStateValue, this.value);\n };\n /**\r\n * Whether the current state configuration has a state node with the specified `tag`.\r\n * @param tag\r\n */\n\n\n State.prototype.hasTag = function (tag) {\n return this.tags.has(tag);\n };\n /**\r\n * Determines whether sending the `event` will cause a non-forbidden transition\r\n * to be selected, even if the transitions have no actions nor\r\n * change the state value.\r\n *\r\n * @param event The event to test\r\n * @returns Whether the event will cause a transition\r\n */\n\n\n State.prototype.can = function (event) {\n var _a;\n\n if (IS_PRODUCTION) {\n warn(!!this.machine, \"state.can(...) used outside of a machine-created State object; this will always return false.\");\n }\n\n var transitionData = (_a = this.machine) === null || _a === void 0 ? void 0 : _a.getTransitionData(this, event);\n return !!(transitionData === null || transitionData === void 0 ? void 0 : transitionData.transitions.length) && // Check that at least one transition is not forbidden\n transitionData.transitions.some(function (t) {\n return t.target !== undefined || t.actions.length;\n });\n };\n\n return State;\n}();\n\nvar defaultOptions = {\n deferEvents: false\n};\n\nvar Scheduler =\n/*#__PURE__*/\n\n/** @class */\nfunction () {\n function Scheduler(options) {\n this.processingEvent = false;\n this.queue = [];\n this.initialized = false;\n this.options = __assign$1(__assign$1({}, defaultOptions), options);\n }\n\n Scheduler.prototype.initialize = function (callback) {\n this.initialized = true;\n\n if (callback) {\n if (!this.options.deferEvents) {\n this.schedule(callback);\n return;\n }\n\n this.process(callback);\n }\n\n this.flushEvents();\n };\n\n Scheduler.prototype.schedule = function (task) {\n if (!this.initialized || this.processingEvent) {\n this.queue.push(task);\n return;\n }\n\n if (this.queue.length !== 0) {\n throw new Error('Event queue should be empty when it is not processing events');\n }\n\n this.process(task);\n this.flushEvents();\n };\n\n Scheduler.prototype.clear = function () {\n this.queue = [];\n };\n\n Scheduler.prototype.flushEvents = function () {\n var nextCallback = this.queue.shift();\n\n while (nextCallback) {\n this.process(nextCallback);\n nextCallback = this.queue.shift();\n }\n };\n\n Scheduler.prototype.process = function (callback) {\n this.processingEvent = true;\n\n try {\n callback();\n } catch (e) {\n // there is no use to keep the future events\n // as the situation is not anymore the same\n this.clear();\n throw e;\n } finally {\n this.processingEvent = false;\n }\n };\n\n return Scheduler;\n}();\n\nvar children = /*#__PURE__*/new Map();\nvar sessionIdIndex = 0;\nvar registry = {\n bookId: function () {\n return \"x:\".concat(sessionIdIndex++);\n },\n register: function (id, actor) {\n children.set(id, actor);\n return id;\n },\n get: function (id) {\n return children.get(id);\n },\n free: function (id) {\n children.delete(id);\n }\n};\n\nfunction getGlobal() {\n if (typeof globalThis !== 'undefined') {\n return globalThis;\n }\n\n if (typeof self !== 'undefined') {\n return self;\n }\n\n if (typeof window !== 'undefined') {\n return window;\n }\n\n if (typeof global !== 'undefined') {\n return global;\n }\n\n if (!IS_PRODUCTION) {\n console.warn('XState could not find a global object in this environment. Please let the maintainers know and raise an issue here: https://github.com/statelyai/xstate/issues');\n }\n}\n\nfunction getDevTools() {\n var global = getGlobal();\n\n if (global && '__xstate__' in global) {\n return global.__xstate__;\n }\n\n return undefined;\n}\n\nfunction registerService(service) {\n if (!getGlobal()) {\n return;\n }\n\n var devTools = getDevTools();\n\n if (devTools) {\n devTools.register(service);\n }\n}\n\nfunction spawnBehavior(behavior, options) {\n if (options === void 0) {\n options = {};\n }\n\n var state = behavior.initialState;\n var observers = new Set();\n var mailbox = [];\n var flushing = false;\n\n var flush = function () {\n if (flushing) {\n return;\n }\n\n flushing = true;\n\n while (mailbox.length > 0) {\n var event_1 = mailbox.shift();\n state = behavior.transition(state, event_1, actorCtx);\n observers.forEach(function (observer) {\n return observer.next(state);\n });\n }\n\n flushing = false;\n };\n\n var actor = toActorRef({\n id: options.id,\n send: function (event) {\n mailbox.push(event);\n flush();\n },\n getSnapshot: function () {\n return state;\n },\n subscribe: function (next, handleError, complete) {\n var observer = toObserver(next, handleError, complete);\n observers.add(observer);\n observer.next(state);\n return {\n unsubscribe: function () {\n observers.delete(observer);\n }\n };\n }\n });\n var actorCtx = {\n parent: options.parent,\n self: actor,\n id: options.id || 'anonymous',\n observers: observers\n };\n state = behavior.start ? behavior.start(actorCtx) : state;\n return actor;\n}\n\nvar DEFAULT_SPAWN_OPTIONS = {\n sync: false,\n autoForward: false\n};\nvar InterpreterStatus;\n\n(function (InterpreterStatus) {\n InterpreterStatus[InterpreterStatus[\"NotStarted\"] = 0] = \"NotStarted\";\n InterpreterStatus[InterpreterStatus[\"Running\"] = 1] = \"Running\";\n InterpreterStatus[InterpreterStatus[\"Stopped\"] = 2] = \"Stopped\";\n})(InterpreterStatus || (InterpreterStatus = {}));\n\nvar Interpreter =\n/*#__PURE__*/\n\n/** @class */\nfunction () {\n /**\r\n * Creates a new Interpreter instance (i.e., service) for the given machine with the provided options, if any.\r\n *\r\n * @param machine The machine to be interpreted\r\n * @param options Interpreter options\r\n */\n function Interpreter(machine, options) {\n if (options === void 0) {\n options = Interpreter.defaultOptions;\n }\n\n var _this = this;\n\n this.machine = machine;\n this.delayedEventsMap = {};\n this.listeners = new Set();\n this.contextListeners = new Set();\n this.stopListeners = new Set();\n this.doneListeners = new Set();\n this.eventListeners = new Set();\n this.sendListeners = new Set();\n /**\r\n * Whether the service is started.\r\n */\n\n this.initialized = false;\n this.status = InterpreterStatus.NotStarted;\n this.children = new Map();\n this.forwardTo = new Set();\n this._outgoingQueue = [];\n /**\r\n * Alias for Interpreter.prototype.start\r\n */\n\n this.init = this.start;\n /**\r\n * Sends an event to the running interpreter to trigger a transition.\r\n *\r\n * An array of events (batched) can be sent as well, which will send all\r\n * batched events to the running interpreter. The listeners will be\r\n * notified only **once** when all events are processed.\r\n *\r\n * @param event The event(s) to send\r\n */\n\n this.send = function (event, payload) {\n if (isArray(event)) {\n _this.batch(event);\n\n return _this.state;\n }\n\n var _event = toSCXMLEvent(toEventObject(event, payload));\n\n if (_this.status === InterpreterStatus.Stopped) {\n // do nothing\n if (!IS_PRODUCTION) {\n warn(false, \"Event \\\"\".concat(_event.name, \"\\\" was sent to stopped service \\\"\").concat(_this.machine.id, \"\\\". This service has already reached its final state, and will not transition.\\nEvent: \").concat(JSON.stringify(_event.data)));\n }\n\n return _this.state;\n }\n\n if (_this.status !== InterpreterStatus.Running && !_this.options.deferEvents) {\n throw new Error(\"Event \\\"\".concat(_event.name, \"\\\" was sent to uninitialized service \\\"\").concat(_this.machine.id // tslint:disable-next-line:max-line-length\n , \"\\\". Make sure .start() is called for this service, or set { deferEvents: true } in the service options.\\nEvent: \").concat(JSON.stringify(_event.data)));\n }\n\n _this.scheduler.schedule(function () {\n // Forward copy of event to child actors\n _this.forward(_event);\n\n var nextState = _this._nextState(_event);\n\n _this.update(nextState, _event);\n });\n\n return _this._state; // TODO: deprecate (should return void)\n // tslint:disable-next-line:semicolon\n };\n\n this.sendTo = function (event, to, immediate) {\n var isParent = _this.parent && (to === SpecialTargets.Parent || _this.parent.id === to);\n var target = isParent ? _this.parent : isString(to) ? to === SpecialTargets.Internal ? _this : _this.children.get(to) || registry.get(to) : isActor$1(to) ? to : undefined;\n\n if (!target) {\n if (!isParent) {\n throw new Error(\"Unable to send event to child '\".concat(to, \"' from service '\").concat(_this.id, \"'.\"));\n } // tslint:disable-next-line:no-console\n\n\n if (!IS_PRODUCTION) {\n warn(false, \"Service '\".concat(_this.id, \"' has no parent: unable to send event \").concat(event.type));\n }\n\n return;\n }\n\n if ('machine' in target) {\n // perhaps those events should be rejected in the parent\n // but atm it doesn't have easy access to all of the information that is required to do it reliably\n if (_this.status !== InterpreterStatus.Stopped || _this.parent !== target || // we need to send events to the parent from exit handlers of a machine that reached its final state\n _this.state.done) {\n // Send SCXML events to machines\n var scxmlEvent = __assign$1(__assign$1({}, event), {\n name: event.name === error$1 ? \"\".concat(error(_this.id)) : event.name,\n origin: _this.sessionId\n });\n\n if (!immediate && _this.machine.config.predictableActionArguments) {\n _this._outgoingQueue.push([target, scxmlEvent]);\n } else {\n target.send(scxmlEvent);\n }\n }\n } else {\n // Send normal events to other targets\n if (!immediate && _this.machine.config.predictableActionArguments) {\n _this._outgoingQueue.push([target, event.data]);\n } else {\n target.send(event.data);\n }\n }\n };\n\n this._exec = function (action, context, _event, actionFunctionMap) {\n if (actionFunctionMap === void 0) {\n actionFunctionMap = _this.machine.options.actions;\n }\n\n var actionOrExec = action.exec || getActionFunction(action.type, actionFunctionMap);\n var exec = isFunction(actionOrExec) ? actionOrExec : actionOrExec ? actionOrExec.exec : action.exec;\n\n if (exec) {\n try {\n return exec(context, _event.data, !_this.machine.config.predictableActionArguments ? {\n action: action,\n state: _this.state,\n _event: _event\n } : {\n action: action,\n _event: _event\n });\n } catch (err) {\n if (_this.parent) {\n _this.parent.send({\n type: 'xstate.error',\n data: err\n });\n }\n\n throw err;\n }\n }\n\n switch (action.type) {\n case raise$1:\n {\n // if raise action reached the interpreter then it's a delayed one\n var sendAction_1 = action;\n\n _this.defer(sendAction_1);\n\n break;\n }\n\n case send$1:\n var sendAction = action;\n\n if (typeof sendAction.delay === 'number') {\n _this.defer(sendAction);\n\n return;\n } else {\n if (sendAction.to) {\n _this.sendTo(sendAction._event, sendAction.to, _event === initEvent);\n } else {\n _this.send(sendAction._event);\n }\n }\n\n break;\n\n case cancel$1:\n _this.cancel(action.sendId);\n\n break;\n\n case start$1:\n {\n if (_this.status !== InterpreterStatus.Running) {\n return;\n }\n\n var activity = action.activity; // If the activity will be stopped right after it's started\n // (such as in transient states)\n // don't bother starting the activity.\n\n if ( // in v4 with `predictableActionArguments` invokes are called eagerly when the `this.state` still points to the previous state\n !_this.machine.config.predictableActionArguments && !_this.state.activities[activity.id || activity.type]) {\n break;\n } // Invoked services\n\n\n if (activity.type === ActionTypes.Invoke) {\n var invokeSource = toInvokeSource$1(activity.src);\n var serviceCreator = _this.machine.options.services ? _this.machine.options.services[invokeSource.type] : undefined;\n var id = activity.id,\n data = activity.data;\n\n if (!IS_PRODUCTION) {\n warn(!('forward' in activity), // tslint:disable-next-line:max-line-length\n \"`forward` property is deprecated (found in invocation of '\".concat(activity.src, \"' in in machine '\").concat(_this.machine.id, \"'). \") + \"Please use `autoForward` instead.\");\n }\n\n var autoForward = 'autoForward' in activity ? activity.autoForward : !!activity.forward;\n\n if (!serviceCreator) {\n // tslint:disable-next-line:no-console\n if (!IS_PRODUCTION) {\n warn(false, \"No service found for invocation '\".concat(activity.src, \"' in machine '\").concat(_this.machine.id, \"'.\"));\n }\n\n return;\n }\n\n var resolvedData = data ? mapContext(data, context, _event) : undefined;\n\n if (typeof serviceCreator === 'string') {\n // TODO: warn\n return;\n }\n\n var source = isFunction(serviceCreator) ? serviceCreator(context, _event.data, {\n data: resolvedData,\n src: invokeSource,\n meta: activity.meta\n }) : serviceCreator;\n\n if (!source) {\n // TODO: warn?\n return;\n }\n\n var options = void 0;\n\n if (isMachine(source)) {\n source = resolvedData ? source.withContext(resolvedData) : source;\n options = {\n autoForward: autoForward\n };\n }\n\n _this.spawn(source, id, options);\n } else {\n _this.spawnActivity(activity);\n }\n\n break;\n }\n\n case stop$1:\n {\n _this.stopChild(action.activity.id);\n\n break;\n }\n\n case log:\n var _a = action,\n label = _a.label,\n value = _a.value;\n\n if (label) {\n _this.logger(label, value);\n } else {\n _this.logger(value);\n }\n\n break;\n\n default:\n if (!IS_PRODUCTION) {\n warn(false, \"No implementation found for action type '\".concat(action.type, \"'\"));\n }\n\n break;\n }\n };\n\n var resolvedOptions = __assign$1(__assign$1({}, Interpreter.defaultOptions), options);\n\n var clock = resolvedOptions.clock,\n logger = resolvedOptions.logger,\n parent = resolvedOptions.parent,\n id = resolvedOptions.id;\n var resolvedId = id !== undefined ? id : machine.id;\n this.id = resolvedId;\n this.logger = logger;\n this.clock = clock;\n this.parent = parent;\n this.options = resolvedOptions;\n this.scheduler = new Scheduler({\n deferEvents: this.options.deferEvents\n });\n this.sessionId = registry.bookId();\n }\n\n Object.defineProperty(Interpreter.prototype, \"initialState\", {\n get: function () {\n var _this = this;\n\n if (this._initialState) {\n return this._initialState;\n }\n\n return provide(this, function () {\n _this._initialState = _this.machine.initialState;\n return _this._initialState;\n });\n },\n enumerable: false,\n configurable: true\n });\n Object.defineProperty(Interpreter.prototype, \"state\", {\n /**\r\n * @deprecated Use `.getSnapshot()` instead.\r\n */\n get: function () {\n if (!IS_PRODUCTION) {\n warn(this.status !== InterpreterStatus.NotStarted, \"Attempted to read state from uninitialized service '\".concat(this.id, \"'. Make sure the service is started first.\"));\n }\n\n return this._state;\n },\n enumerable: false,\n configurable: true\n });\n /**\r\n * Executes the actions of the given state, with that state's `context` and `event`.\r\n *\r\n * @param state The state whose actions will be executed\r\n * @param actionsConfig The action implementations to use\r\n */\n\n Interpreter.prototype.execute = function (state, actionsConfig) {\n var e_1, _a;\n\n try {\n for (var _b = __values(state.actions), _c = _b.next(); !_c.done; _c = _b.next()) {\n var action = _c.value;\n this.exec(action, state, actionsConfig);\n }\n } catch (e_1_1) {\n e_1 = {\n error: e_1_1\n };\n } finally {\n try {\n if (_c && !_c.done && (_a = _b.return)) _a.call(_b);\n } finally {\n if (e_1) throw e_1.error;\n }\n }\n };\n\n Interpreter.prototype.update = function (state, _event) {\n var e_2, _a, e_3, _b, e_4, _c, e_5, _d;\n\n var _this = this; // Attach session ID to state\n\n\n state._sessionid = this.sessionId; // Update state\n\n this._state = state; // Execute actions\n\n if ((!this.machine.config.predictableActionArguments || // this is currently required to execute initial actions as the `initialState` gets cached\n // we can't just recompute it (and execute actions while doing so) because we try to preserve identity of actors created within initial assigns\n _event === initEvent) && this.options.execute) {\n this.execute(this.state);\n } else {\n var item = void 0;\n\n while (item = this._outgoingQueue.shift()) {\n item[0].send(item[1]);\n }\n } // Update children\n\n\n this.children.forEach(function (child) {\n _this.state.children[child.id] = child;\n }); // Dev tools\n\n if (this.devTools) {\n this.devTools.send(_event.data, state);\n } // Execute listeners\n\n\n if (state.event) {\n try {\n for (var _e = __values(this.eventListeners), _f = _e.next(); !_f.done; _f = _e.next()) {\n var listener = _f.value;\n listener(state.event);\n }\n } catch (e_2_1) {\n e_2 = {\n error: e_2_1\n };\n } finally {\n try {\n if (_f && !_f.done && (_a = _e.return)) _a.call(_e);\n } finally {\n if (e_2) throw e_2.error;\n }\n }\n }\n\n try {\n for (var _g = __values(this.listeners), _h = _g.next(); !_h.done; _h = _g.next()) {\n var listener = _h.value;\n listener(state, state.event);\n }\n } catch (e_3_1) {\n e_3 = {\n error: e_3_1\n };\n } finally {\n try {\n if (_h && !_h.done && (_b = _g.return)) _b.call(_g);\n } finally {\n if (e_3) throw e_3.error;\n }\n }\n\n try {\n for (var _j = __values(this.contextListeners), _k = _j.next(); !_k.done; _k = _j.next()) {\n var contextListener = _k.value;\n contextListener(this.state.context, this.state.history ? this.state.history.context : undefined);\n }\n } catch (e_4_1) {\n e_4 = {\n error: e_4_1\n };\n } finally {\n try {\n if (_k && !_k.done && (_c = _j.return)) _c.call(_j);\n } finally {\n if (e_4) throw e_4.error;\n }\n }\n\n if (this.state.done) {\n // get final child state node\n var finalChildStateNode = state.configuration.find(function (sn) {\n return sn.type === 'final' && sn.parent === _this.machine;\n });\n var doneData = finalChildStateNode && finalChildStateNode.doneData ? mapContext(finalChildStateNode.doneData, state.context, _event) : undefined;\n this._doneEvent = doneInvoke(this.id, doneData);\n\n try {\n for (var _l = __values(this.doneListeners), _m = _l.next(); !_m.done; _m = _l.next()) {\n var listener = _m.value;\n listener(this._doneEvent);\n }\n } catch (e_5_1) {\n e_5 = {\n error: e_5_1\n };\n } finally {\n try {\n if (_m && !_m.done && (_d = _l.return)) _d.call(_l);\n } finally {\n if (e_5) throw e_5.error;\n }\n }\n\n this._stop();\n\n this._stopChildren();\n\n registry.free(this.sessionId);\n }\n };\n /*\r\n * Adds a listener that is notified whenever a state transition happens. The listener is called with\r\n * the next state and the event object that caused the state transition.\r\n *\r\n * @param listener The state listener\r\n */\n\n\n Interpreter.prototype.onTransition = function (listener) {\n this.listeners.add(listener); // Send current state to listener\n\n if (this.status === InterpreterStatus.Running) {\n listener(this.state, this.state.event);\n }\n\n return this;\n };\n\n Interpreter.prototype.subscribe = function (nextListenerOrObserver, _, // TODO: error listener\n completeListener) {\n var _this = this;\n\n var observer = toObserver(nextListenerOrObserver, _, completeListener);\n this.listeners.add(observer.next); // Send current state to listener\n\n if (this.status !== InterpreterStatus.NotStarted) {\n observer.next(this.state);\n }\n\n var completeOnce = function () {\n _this.doneListeners.delete(completeOnce);\n\n _this.stopListeners.delete(completeOnce);\n\n observer.complete();\n };\n\n if (this.status === InterpreterStatus.Stopped) {\n observer.complete();\n } else {\n this.onDone(completeOnce);\n this.onStop(completeOnce);\n }\n\n return {\n unsubscribe: function () {\n _this.listeners.delete(observer.next);\n\n _this.doneListeners.delete(completeOnce);\n\n _this.stopListeners.delete(completeOnce);\n }\n };\n };\n /**\r\n * Adds an event listener that is notified whenever an event is sent to the running interpreter.\r\n * @param listener The event listener\r\n */\n\n\n Interpreter.prototype.onEvent = function (listener) {\n this.eventListeners.add(listener);\n return this;\n };\n /**\r\n * Adds an event listener that is notified whenever a `send` event occurs.\r\n * @param listener The event listener\r\n */\n\n\n Interpreter.prototype.onSend = function (listener) {\n this.sendListeners.add(listener);\n return this;\n };\n /**\r\n * Adds a context listener that is notified whenever the state context changes.\r\n * @param listener The context listener\r\n */\n\n\n Interpreter.prototype.onChange = function (listener) {\n this.contextListeners.add(listener);\n return this;\n };\n /**\r\n * Adds a listener that is notified when the machine is stopped.\r\n * @param listener The listener\r\n */\n\n\n Interpreter.prototype.onStop = function (listener) {\n this.stopListeners.add(listener);\n return this;\n };\n /**\r\n * Adds a state listener that is notified when the statechart has reached its final state.\r\n * @param listener The state listener\r\n */\n\n\n Interpreter.prototype.onDone = function (listener) {\n if (this.status === InterpreterStatus.Stopped && this._doneEvent) {\n listener(this._doneEvent);\n } else {\n this.doneListeners.add(listener);\n }\n\n return this;\n };\n /**\r\n * Removes a listener.\r\n * @param listener The listener to remove\r\n */\n\n\n Interpreter.prototype.off = function (listener) {\n this.listeners.delete(listener);\n this.eventListeners.delete(listener);\n this.sendListeners.delete(listener);\n this.stopListeners.delete(listener);\n this.doneListeners.delete(listener);\n this.contextListeners.delete(listener);\n return this;\n };\n /**\r\n * Starts the interpreter from the given state, or the initial state.\r\n * @param initialState The state to start the statechart from\r\n */\n\n\n Interpreter.prototype.start = function (initialState) {\n var _this = this;\n\n if (this.status === InterpreterStatus.Running) {\n // Do not restart the service if it is already started\n return this;\n } // yes, it's a hack but we need the related cache to be populated for some things to work (like delayed transitions)\n // this is usually called by `machine.getInitialState` but if we rehydrate from a state we might bypass this call\n // we also don't want to call this method here as it resolves the full initial state which might involve calling assign actions\n // and that could potentially lead to some unwanted side-effects (even such as creating some rogue actors)\n\n\n this.machine._init();\n\n registry.register(this.sessionId, this);\n this.initialized = true;\n this.status = InterpreterStatus.Running;\n var resolvedState = initialState === undefined ? this.initialState : provide(this, function () {\n return isStateConfig(initialState) ? _this.machine.resolveState(initialState) : _this.machine.resolveState(State.from(initialState, _this.machine.context));\n });\n\n if (this.options.devTools) {\n this.attachDev();\n }\n\n this.scheduler.initialize(function () {\n _this.update(resolvedState, initEvent);\n });\n return this;\n };\n\n Interpreter.prototype._stopChildren = function () {\n // TODO: think about converting those to actions\n this.children.forEach(function (child) {\n if (isFunction(child.stop)) {\n child.stop();\n }\n });\n this.children.clear();\n };\n\n Interpreter.prototype._stop = function () {\n var e_6, _a, e_7, _b, e_8, _c, e_9, _d, e_10, _e;\n\n try {\n for (var _f = __values(this.listeners), _g = _f.next(); !_g.done; _g = _f.next()) {\n var listener = _g.value;\n this.listeners.delete(listener);\n }\n } catch (e_6_1) {\n e_6 = {\n error: e_6_1\n };\n } finally {\n try {\n if (_g && !_g.done && (_a = _f.return)) _a.call(_f);\n } finally {\n if (e_6) throw e_6.error;\n }\n }\n\n try {\n for (var _h = __values(this.stopListeners), _j = _h.next(); !_j.done; _j = _h.next()) {\n var listener = _j.value; // call listener, then remove\n\n listener();\n this.stopListeners.delete(listener);\n }\n } catch (e_7_1) {\n e_7 = {\n error: e_7_1\n };\n } finally {\n try {\n if (_j && !_j.done && (_b = _h.return)) _b.call(_h);\n } finally {\n if (e_7) throw e_7.error;\n }\n }\n\n try {\n for (var _k = __values(this.contextListeners), _l = _k.next(); !_l.done; _l = _k.next()) {\n var listener = _l.value;\n this.contextListeners.delete(listener);\n }\n } catch (e_8_1) {\n e_8 = {\n error: e_8_1\n };\n } finally {\n try {\n if (_l && !_l.done && (_c = _k.return)) _c.call(_k);\n } finally {\n if (e_8) throw e_8.error;\n }\n }\n\n try {\n for (var _m = __values(this.doneListeners), _o = _m.next(); !_o.done; _o = _m.next()) {\n var listener = _o.value;\n this.doneListeners.delete(listener);\n }\n } catch (e_9_1) {\n e_9 = {\n error: e_9_1\n };\n } finally {\n try {\n if (_o && !_o.done && (_d = _m.return)) _d.call(_m);\n } finally {\n if (e_9) throw e_9.error;\n }\n }\n\n if (!this.initialized) {\n // Interpreter already stopped; do nothing\n return this;\n }\n\n this.initialized = false;\n this.status = InterpreterStatus.Stopped;\n this._initialState = undefined;\n\n try {\n // we are going to stop within the current sync frame\n // so we can safely just cancel this here as nothing async should be fired anyway\n for (var _p = __values(Object.keys(this.delayedEventsMap)), _q = _p.next(); !_q.done; _q = _p.next()) {\n var key = _q.value;\n this.clock.clearTimeout(this.delayedEventsMap[key]);\n }\n } catch (e_10_1) {\n e_10 = {\n error: e_10_1\n };\n } finally {\n try {\n if (_q && !_q.done && (_e = _p.return)) _e.call(_p);\n } finally {\n if (e_10) throw e_10.error;\n }\n } // clear everything that might be enqueued\n\n\n this.scheduler.clear();\n this.scheduler = new Scheduler({\n deferEvents: this.options.deferEvents\n });\n };\n /**\r\n * Stops the interpreter and unsubscribe all listeners.\r\n *\r\n * This will also notify the `onStop` listeners.\r\n */\n\n\n Interpreter.prototype.stop = function () {\n // TODO: add warning for stopping non-root interpreters\n var _this = this; // grab the current scheduler as it will be replaced in _stop\n\n\n var scheduler = this.scheduler;\n\n this._stop(); // let what is currently processed to be finished\n\n\n scheduler.schedule(function () {\n // it feels weird to handle this here but we need to handle this even slightly \"out of band\"\n var _event = toSCXMLEvent({\n type: 'xstate.stop'\n });\n\n var nextState = provide(_this, function () {\n var exitActions = flatten(__spreadArray([], __read$2(_this.state.configuration), false).sort(function (a, b) {\n return b.order - a.order;\n }).map(function (stateNode) {\n return toActionObjects(stateNode.onExit, _this.machine.options.actions);\n }));\n\n var _a = __read$2(resolveActions(_this.machine, _this.state, _this.state.context, _event, [{\n type: 'exit',\n actions: exitActions\n }], _this.machine.config.predictableActionArguments ? _this._exec : undefined, _this.machine.config.predictableActionArguments || _this.machine.config.preserveActionOrder), 2),\n resolvedActions = _a[0],\n updatedContext = _a[1];\n\n var newState = new State({\n value: _this.state.value,\n context: updatedContext,\n _event: _event,\n _sessionid: _this.sessionId,\n historyValue: undefined,\n history: _this.state,\n actions: resolvedActions.filter(function (action) {\n return !isRaisableAction(action);\n }),\n activities: {},\n events: [],\n configuration: [],\n transitions: [],\n children: {},\n done: _this.state.done,\n tags: _this.state.tags,\n machine: _this.machine\n });\n newState.changed = true;\n return newState;\n });\n\n _this.update(nextState, _event);\n\n _this._stopChildren();\n\n registry.free(_this.sessionId);\n });\n return this;\n };\n\n Interpreter.prototype.batch = function (events) {\n var _this = this;\n\n if (this.status === InterpreterStatus.NotStarted && this.options.deferEvents) {\n // tslint:disable-next-line:no-console\n if (!IS_PRODUCTION) {\n warn(false, \"\".concat(events.length, \" event(s) were sent to uninitialized service \\\"\").concat(this.machine.id, \"\\\" and are deferred. Make sure .start() is called for this service.\\nEvent: \").concat(JSON.stringify(event)));\n }\n } else if (this.status !== InterpreterStatus.Running) {\n throw new Error( // tslint:disable-next-line:max-line-length\n \"\".concat(events.length, \" event(s) were sent to uninitialized service \\\"\").concat(this.machine.id, \"\\\". Make sure .start() is called for this service, or set { deferEvents: true } in the service options.\"));\n }\n\n if (!events.length) {\n return;\n }\n\n var exec = !!this.machine.config.predictableActionArguments && this._exec;\n this.scheduler.schedule(function () {\n var e_11, _a;\n\n var nextState = _this.state;\n var batchChanged = false;\n var batchedActions = [];\n\n var _loop_1 = function (event_1) {\n var _event = toSCXMLEvent(event_1);\n\n _this.forward(_event);\n\n nextState = provide(_this, function () {\n return _this.machine.transition(nextState, _event, undefined, exec || undefined);\n });\n batchedActions.push.apply(batchedActions, __spreadArray([], __read$2(_this.machine.config.predictableActionArguments ? nextState.actions : nextState.actions.map(function (a) {\n return bindActionToState(a, nextState);\n })), false));\n batchChanged = batchChanged || !!nextState.changed;\n };\n\n try {\n for (var events_1 = __values(events), events_1_1 = events_1.next(); !events_1_1.done; events_1_1 = events_1.next()) {\n var event_1 = events_1_1.value;\n\n _loop_1(event_1);\n }\n } catch (e_11_1) {\n e_11 = {\n error: e_11_1\n };\n } finally {\n try {\n if (events_1_1 && !events_1_1.done && (_a = events_1.return)) _a.call(events_1);\n } finally {\n if (e_11) throw e_11.error;\n }\n }\n\n nextState.changed = batchChanged;\n nextState.actions = batchedActions;\n\n _this.update(nextState, toSCXMLEvent(events[events.length - 1]));\n });\n };\n /**\r\n * Returns a send function bound to this interpreter instance.\r\n *\r\n * @param event The event to be sent by the sender.\r\n */\n\n\n Interpreter.prototype.sender = function (event) {\n return this.send.bind(this, event);\n };\n\n Interpreter.prototype._nextState = function (event, exec) {\n var _this = this;\n\n if (exec === void 0) {\n exec = !!this.machine.config.predictableActionArguments && this._exec;\n }\n\n var _event = toSCXMLEvent(event);\n\n if (_event.name.indexOf(errorPlatform) === 0 && !this.state.nextEvents.some(function (nextEvent) {\n return nextEvent.indexOf(errorPlatform) === 0;\n })) {\n throw _event.data.data;\n }\n\n var nextState = provide(this, function () {\n return _this.machine.transition(_this.state, _event, undefined, exec || undefined);\n });\n return nextState;\n };\n /**\r\n * Returns the next state given the interpreter's current state and the event.\r\n *\r\n * This is a pure method that does _not_ update the interpreter's state.\r\n *\r\n * @param event The event to determine the next state\r\n */\n\n\n Interpreter.prototype.nextState = function (event) {\n return this._nextState(event, false);\n };\n\n Interpreter.prototype.forward = function (event) {\n var e_12, _a;\n\n try {\n for (var _b = __values(this.forwardTo), _c = _b.next(); !_c.done; _c = _b.next()) {\n var id = _c.value;\n var child = this.children.get(id);\n\n if (!child) {\n throw new Error(\"Unable to forward event '\".concat(event, \"' from interpreter '\").concat(this.id, \"' to nonexistant child '\").concat(id, \"'.\"));\n }\n\n child.send(event);\n }\n } catch (e_12_1) {\n e_12 = {\n error: e_12_1\n };\n } finally {\n try {\n if (_c && !_c.done && (_a = _b.return)) _a.call(_b);\n } finally {\n if (e_12) throw e_12.error;\n }\n }\n };\n\n Interpreter.prototype.defer = function (sendAction) {\n var _this = this;\n\n var timerId = this.clock.setTimeout(function () {\n if ('to' in sendAction && sendAction.to) {\n _this.sendTo(sendAction._event, sendAction.to, true);\n } else {\n _this.send(sendAction._event);\n }\n }, sendAction.delay);\n\n if (sendAction.id) {\n this.delayedEventsMap[sendAction.id] = timerId;\n }\n };\n\n Interpreter.prototype.cancel = function (sendId) {\n this.clock.clearTimeout(this.delayedEventsMap[sendId]);\n delete this.delayedEventsMap[sendId];\n };\n\n Interpreter.prototype.exec = function (action, state, actionFunctionMap) {\n if (actionFunctionMap === void 0) {\n actionFunctionMap = this.machine.options.actions;\n }\n\n this._exec(action, state.context, state._event, actionFunctionMap);\n };\n\n Interpreter.prototype.removeChild = function (childId) {\n var _a;\n\n this.children.delete(childId);\n this.forwardTo.delete(childId); // this.state might not exist at the time this is called,\n // such as when a child is added then removed while initializing the state\n\n (_a = this.state) === null || _a === void 0 ? true : delete _a.children[childId];\n };\n\n Interpreter.prototype.stopChild = function (childId) {\n var child = this.children.get(childId);\n\n if (!child) {\n return;\n }\n\n this.removeChild(childId);\n\n if (isFunction(child.stop)) {\n child.stop();\n }\n };\n\n Interpreter.prototype.spawn = function (entity, name, options) {\n if (this.status !== InterpreterStatus.Running) {\n return createDeferredActor(entity, name);\n }\n\n if (isPromiseLike(entity)) {\n return this.spawnPromise(Promise.resolve(entity), name);\n } else if (isFunction(entity)) {\n return this.spawnCallback(entity, name);\n } else if (isSpawnedActor(entity)) {\n return this.spawnActor(entity, name);\n } else if (isObservable(entity)) {\n return this.spawnObservable(entity, name);\n } else if (isMachine(entity)) {\n return this.spawnMachine(entity, __assign$1(__assign$1({}, options), {\n id: name\n }));\n } else if (isBehavior(entity)) {\n return this.spawnBehavior(entity, name);\n } else {\n throw new Error(\"Unable to spawn entity \\\"\".concat(name, \"\\\" of type \\\"\").concat(typeof entity, \"\\\".\"));\n }\n };\n\n Interpreter.prototype.spawnMachine = function (machine, options) {\n var _this = this;\n\n if (options === void 0) {\n options = {};\n }\n\n var childService = new Interpreter(machine, __assign$1(__assign$1({}, this.options), {\n parent: this,\n id: options.id || machine.id\n }));\n\n var resolvedOptions = __assign$1(__assign$1({}, DEFAULT_SPAWN_OPTIONS), options);\n\n if (resolvedOptions.sync) {\n childService.onTransition(function (state) {\n _this.send(update, {\n state: state,\n id: childService.id\n });\n });\n }\n\n var actor = childService;\n this.children.set(childService.id, actor);\n\n if (resolvedOptions.autoForward) {\n this.forwardTo.add(childService.id);\n }\n\n childService.onDone(function (doneEvent) {\n _this.removeChild(childService.id);\n\n _this.send(toSCXMLEvent(doneEvent, {\n origin: childService.id\n }));\n }).start();\n return actor;\n };\n\n Interpreter.prototype.spawnBehavior = function (behavior, id) {\n var actorRef = spawnBehavior(behavior, {\n id: id,\n parent: this\n });\n this.children.set(id, actorRef);\n return actorRef;\n };\n\n Interpreter.prototype.spawnPromise = function (promise, id) {\n var _a;\n\n var _this = this;\n\n var canceled = false;\n var resolvedData;\n promise.then(function (response) {\n if (!canceled) {\n resolvedData = response;\n\n _this.removeChild(id);\n\n _this.send(toSCXMLEvent(doneInvoke(id, response), {\n origin: id\n }));\n }\n }, function (errorData) {\n if (!canceled) {\n _this.removeChild(id);\n\n var errorEvent = error(id, errorData);\n\n try {\n // Send \"error.platform.id\" to this (parent).\n _this.send(toSCXMLEvent(errorEvent, {\n origin: id\n }));\n } catch (error) {\n reportUnhandledExceptionOnInvocation(errorData, error, id);\n\n if (_this.devTools) {\n _this.devTools.send(errorEvent, _this.state);\n }\n\n if (_this.machine.strict) {\n // it would be better to always stop the state machine if unhandled\n // exception/promise rejection happens but because we don't want to\n // break existing code so enforce it on strict mode only especially so\n // because documentation says that onError is optional\n _this.stop();\n }\n }\n }\n });\n var actor = (_a = {\n id: id,\n send: function () {\n return void 0;\n },\n subscribe: function (next, handleError, complete) {\n var observer = toObserver(next, handleError, complete);\n var unsubscribed = false;\n promise.then(function (response) {\n if (unsubscribed) {\n return;\n }\n\n observer.next(response);\n\n if (unsubscribed) {\n return;\n }\n\n observer.complete();\n }, function (err) {\n if (unsubscribed) {\n return;\n }\n\n observer.error(err);\n });\n return {\n unsubscribe: function () {\n return unsubscribed = true;\n }\n };\n },\n stop: function () {\n canceled = true;\n },\n toJSON: function () {\n return {\n id: id\n };\n },\n getSnapshot: function () {\n return resolvedData;\n }\n }, _a[symbolObservable] = function () {\n return this;\n }, _a);\n this.children.set(id, actor);\n return actor;\n };\n\n Interpreter.prototype.spawnCallback = function (callback, id) {\n var _a;\n\n var _this = this;\n\n var canceled = false;\n var receivers = new Set();\n var listeners = new Set();\n var emitted;\n\n var receive = function (e) {\n emitted = e;\n listeners.forEach(function (listener) {\n return listener(e);\n });\n\n if (canceled) {\n return;\n }\n\n _this.send(toSCXMLEvent(e, {\n origin: id\n }));\n };\n\n var callbackStop;\n\n try {\n callbackStop = callback(receive, function (newListener) {\n receivers.add(newListener);\n });\n } catch (err) {\n this.send(error(id, err));\n }\n\n if (isPromiseLike(callbackStop)) {\n // it turned out to be an async function, can't reliably check this before calling `callback`\n // because transpiled async functions are not recognizable\n return this.spawnPromise(callbackStop, id);\n }\n\n var actor = (_a = {\n id: id,\n send: function (event) {\n return receivers.forEach(function (receiver) {\n return receiver(event);\n });\n },\n subscribe: function (next) {\n var observer = toObserver(next);\n listeners.add(observer.next);\n return {\n unsubscribe: function () {\n listeners.delete(observer.next);\n }\n };\n },\n stop: function () {\n canceled = true;\n\n if (isFunction(callbackStop)) {\n callbackStop();\n }\n },\n toJSON: function () {\n return {\n id: id\n };\n },\n getSnapshot: function () {\n return emitted;\n }\n }, _a[symbolObservable] = function () {\n return this;\n }, _a);\n this.children.set(id, actor);\n return actor;\n };\n\n Interpreter.prototype.spawnObservable = function (source, id) {\n var _a;\n\n var _this = this;\n\n var emitted;\n var subscription = source.subscribe(function (value) {\n emitted = value;\n\n _this.send(toSCXMLEvent(value, {\n origin: id\n }));\n }, function (err) {\n _this.removeChild(id);\n\n _this.send(toSCXMLEvent(error(id, err), {\n origin: id\n }));\n }, function () {\n _this.removeChild(id);\n\n _this.send(toSCXMLEvent(doneInvoke(id), {\n origin: id\n }));\n });\n var actor = (_a = {\n id: id,\n send: function () {\n return void 0;\n },\n subscribe: function (next, handleError, complete) {\n return source.subscribe(next, handleError, complete);\n },\n stop: function () {\n return subscription.unsubscribe();\n },\n getSnapshot: function () {\n return emitted;\n },\n toJSON: function () {\n return {\n id: id\n };\n }\n }, _a[symbolObservable] = function () {\n return this;\n }, _a);\n this.children.set(id, actor);\n return actor;\n };\n\n Interpreter.prototype.spawnActor = function (actor, name) {\n this.children.set(name, actor);\n return actor;\n };\n\n Interpreter.prototype.spawnActivity = function (activity) {\n var implementation = this.machine.options && this.machine.options.activities ? this.machine.options.activities[activity.type] : undefined;\n\n if (!implementation) {\n if (!IS_PRODUCTION) {\n warn(false, \"No implementation found for activity '\".concat(activity.type, \"'\"));\n } // tslint:disable-next-line:no-console\n\n\n return;\n } // Start implementation\n\n\n var dispose = implementation(this.state.context, activity);\n this.spawnEffect(activity.id, dispose);\n };\n\n Interpreter.prototype.spawnEffect = function (id, dispose) {\n var _a;\n\n this.children.set(id, (_a = {\n id: id,\n send: function () {\n return void 0;\n },\n subscribe: function () {\n return {\n unsubscribe: function () {\n return void 0;\n }\n };\n },\n stop: dispose || undefined,\n getSnapshot: function () {\n return undefined;\n },\n toJSON: function () {\n return {\n id: id\n };\n }\n }, _a[symbolObservable] = function () {\n return this;\n }, _a));\n };\n\n Interpreter.prototype.attachDev = function () {\n var global = getGlobal();\n\n if (this.options.devTools && global) {\n if (global.__REDUX_DEVTOOLS_EXTENSION__) {\n var devToolsOptions = typeof this.options.devTools === 'object' ? this.options.devTools : undefined;\n this.devTools = global.__REDUX_DEVTOOLS_EXTENSION__.connect(__assign$1(__assign$1({\n name: this.id,\n autoPause: true,\n stateSanitizer: function (state) {\n return {\n value: state.value,\n context: state.context,\n actions: state.actions\n };\n }\n }, devToolsOptions), {\n features: __assign$1({\n jump: false,\n skip: false\n }, devToolsOptions ? devToolsOptions.features : undefined)\n }), this.machine);\n this.devTools.init(this.state);\n } // add XState-specific dev tooling hook\n\n\n registerService(this);\n }\n };\n\n Interpreter.prototype.toJSON = function () {\n return {\n id: this.id\n };\n };\n\n Interpreter.prototype[symbolObservable] = function () {\n return this;\n };\n\n Interpreter.prototype.getSnapshot = function () {\n if (this.status === InterpreterStatus.NotStarted) {\n return this.initialState;\n }\n\n return this._state;\n };\n /**\r\n * The default interpreter options:\r\n *\r\n * - `clock` uses the global `setTimeout` and `clearTimeout` functions\r\n * - `logger` uses the global `console.log()` method\r\n */\n\n\n Interpreter.defaultOptions = {\n execute: true,\n deferEvents: true,\n clock: {\n setTimeout: function (fn, ms) {\n return setTimeout(fn, ms);\n },\n clearTimeout: function (id) {\n return clearTimeout(id);\n }\n },\n logger: /*#__PURE__*/console.log.bind(console),\n devTools: false\n };\n Interpreter.interpret = interpret;\n return Interpreter;\n}();\n/**\r\n * Creates a new Interpreter instance for the given machine with the provided options, if any.\r\n *\r\n * @param machine The machine to interpret\r\n * @param options Interpreter options\r\n */\n\nfunction interpret(machine, options) {\n var interpreter = new Interpreter(machine, options);\n return interpreter;\n}\n\nfunction toInvokeSource(src) {\n if (typeof src === 'string') {\n var simpleSrc = {\n type: src\n };\n\n simpleSrc.toString = function () {\n return src;\n }; // v4 compat - TODO: remove in v5\n\n\n return simpleSrc;\n }\n\n return src;\n}\nfunction toInvokeDefinition(invokeConfig) {\n return __assign$1(__assign$1({\n type: invoke\n }, invokeConfig), {\n toJSON: function () {\n invokeConfig.onDone;\n invokeConfig.onError;\n var invokeDef = __rest$1(invokeConfig, [\"onDone\", \"onError\"]);\n\n return __assign$1(__assign$1({}, invokeDef), {\n type: invoke,\n src: toInvokeSource(invokeConfig.src)\n });\n }\n });\n}\n\nvar NULL_EVENT = '';\nvar STATE_IDENTIFIER = '#';\nvar WILDCARD = '*';\nvar EMPTY_OBJECT = {};\n\nvar isStateId = function (str) {\n return str[0] === STATE_IDENTIFIER;\n};\n\nvar createDefaultOptions = function () {\n return {\n actions: {},\n guards: {},\n services: {},\n activities: {},\n delays: {}\n };\n};\n\nvar validateArrayifiedTransitions = function (stateNode, event, transitions) {\n var hasNonLastUnguardedTarget = transitions.slice(0, -1).some(function (transition) {\n return !('cond' in transition) && !('in' in transition) && (isString(transition.target) || isMachine(transition.target));\n });\n var eventText = event === NULL_EVENT ? 'the transient event' : \"event '\".concat(event, \"'\");\n warn(!hasNonLastUnguardedTarget, \"One or more transitions for \".concat(eventText, \" on state '\").concat(stateNode.id, \"' are unreachable. \") + \"Make sure that the default transition is the last one defined.\");\n};\n\nvar StateNode =\n/*#__PURE__*/\n\n/** @class */\nfunction () {\n function StateNode(\n /**\r\n * The raw config used to create the machine.\r\n */\n config, options,\n /**\r\n * The initial extended state\r\n */\n _context, // TODO: this is unsafe, but we're removing it in v5 anyway\n _stateInfo) {\n if (_context === void 0) {\n _context = 'context' in config ? config.context : undefined;\n }\n\n var _this = this;\n\n var _a;\n\n this.config = config;\n this._context = _context;\n /**\r\n * The order this state node appears. Corresponds to the implicit SCXML document order.\r\n */\n\n this.order = -1;\n this.__xstatenode = true;\n this.__cache = {\n events: undefined,\n relativeValue: new Map(),\n initialStateValue: undefined,\n initialState: undefined,\n on: undefined,\n transitions: undefined,\n candidates: {},\n delayedTransitions: undefined\n };\n this.idMap = {};\n this.tags = [];\n this.options = Object.assign(createDefaultOptions(), options);\n this.parent = _stateInfo === null || _stateInfo === void 0 ? void 0 : _stateInfo.parent;\n this.key = this.config.key || (_stateInfo === null || _stateInfo === void 0 ? void 0 : _stateInfo.key) || this.config.id || '(machine)';\n this.machine = this.parent ? this.parent.machine : this;\n this.path = this.parent ? this.parent.path.concat(this.key) : [];\n this.delimiter = this.config.delimiter || (this.parent ? this.parent.delimiter : STATE_DELIMITER);\n this.id = this.config.id || __spreadArray([this.machine.key], __read$2(this.path), false).join(this.delimiter);\n this.version = this.parent ? this.parent.version : this.config.version;\n this.type = this.config.type || (this.config.parallel ? 'parallel' : this.config.states && Object.keys(this.config.states).length ? 'compound' : this.config.history ? 'history' : 'atomic');\n this.schema = this.parent ? this.machine.schema : (_a = this.config.schema) !== null && _a !== void 0 ? _a : {};\n this.description = this.config.description;\n\n if (!IS_PRODUCTION) {\n warn(!('parallel' in this.config), \"The \\\"parallel\\\" property is deprecated and will be removed in version 4.1. \".concat(this.config.parallel ? \"Replace with `type: 'parallel'`\" : \"Use `type: '\".concat(this.type, \"'`\"), \" in the config for state node '\").concat(this.id, \"' instead.\"));\n }\n\n this.initial = this.config.initial;\n this.states = this.config.states ? mapValues(this.config.states, function (stateConfig, key) {\n var _a;\n\n var stateNode = new StateNode(stateConfig, {}, undefined, {\n parent: _this,\n key: key\n });\n Object.assign(_this.idMap, __assign$1((_a = {}, _a[stateNode.id] = stateNode, _a), stateNode.idMap));\n return stateNode;\n }) : EMPTY_OBJECT; // Document order\n\n var order = 0;\n\n function dfs(stateNode) {\n var e_1, _a;\n\n stateNode.order = order++;\n\n try {\n for (var _b = __values(getAllChildren(stateNode)), _c = _b.next(); !_c.done; _c = _b.next()) {\n var child = _c.value;\n dfs(child);\n }\n } catch (e_1_1) {\n e_1 = {\n error: e_1_1\n };\n } finally {\n try {\n if (_c && !_c.done && (_a = _b.return)) _a.call(_b);\n } finally {\n if (e_1) throw e_1.error;\n }\n }\n }\n\n dfs(this); // History config\n\n this.history = this.config.history === true ? 'shallow' : this.config.history || false;\n this._transient = !!this.config.always || (!this.config.on ? false : Array.isArray(this.config.on) ? this.config.on.some(function (_a) {\n var event = _a.event;\n return event === NULL_EVENT;\n }) : NULL_EVENT in this.config.on);\n this.strict = !!this.config.strict; // TODO: deprecate (entry)\n\n this.onEntry = toArray(this.config.entry || this.config.onEntry).map(function (action) {\n return toActionObject(action);\n }); // TODO: deprecate (exit)\n\n this.onExit = toArray(this.config.exit || this.config.onExit).map(function (action) {\n return toActionObject(action);\n });\n this.meta = this.config.meta;\n this.doneData = this.type === 'final' ? this.config.data : undefined;\n this.invoke = toArray(this.config.invoke).map(function (invokeConfig, i) {\n var _a, _b;\n\n if (isMachine(invokeConfig)) {\n var invokeId = createInvokeId(_this.id, i);\n _this.machine.options.services = __assign$1((_a = {}, _a[invokeId] = invokeConfig, _a), _this.machine.options.services);\n return toInvokeDefinition({\n src: invokeId,\n id: invokeId\n });\n } else if (isString(invokeConfig.src)) {\n var invokeId = invokeConfig.id || createInvokeId(_this.id, i);\n return toInvokeDefinition(__assign$1(__assign$1({}, invokeConfig), {\n id: invokeId,\n src: invokeConfig.src\n }));\n } else if (isMachine(invokeConfig.src) || isFunction(invokeConfig.src)) {\n var invokeId = invokeConfig.id || createInvokeId(_this.id, i);\n _this.machine.options.services = __assign$1((_b = {}, _b[invokeId] = invokeConfig.src, _b), _this.machine.options.services);\n return toInvokeDefinition(__assign$1(__assign$1({\n id: invokeId\n }, invokeConfig), {\n src: invokeId\n }));\n } else {\n var invokeSource = invokeConfig.src;\n return toInvokeDefinition(__assign$1(__assign$1({\n id: createInvokeId(_this.id, i)\n }, invokeConfig), {\n src: invokeSource\n }));\n }\n });\n this.activities = toArray(this.config.activities).concat(this.invoke).map(function (activity) {\n return toActivityDefinition(activity);\n });\n this.transition = this.transition.bind(this);\n this.tags = toArray(this.config.tags); // TODO: this is the real fix for initialization once\n // state node getters are deprecated\n // if (!this.parent) {\n // this._init();\n // }\n }\n\n StateNode.prototype._init = function () {\n if (this.__cache.transitions) {\n return;\n }\n\n getAllStateNodes(this).forEach(function (stateNode) {\n return stateNode.on;\n });\n };\n /**\r\n * Clones this state machine with custom options and context.\r\n *\r\n * @param options Options (actions, guards, activities, services) to recursively merge with the existing options.\r\n * @param context Custom context (will override predefined context)\r\n */\n\n\n StateNode.prototype.withConfig = function (options, context) {\n var _a = this.options,\n actions = _a.actions,\n activities = _a.activities,\n guards = _a.guards,\n services = _a.services,\n delays = _a.delays;\n return new StateNode(this.config, {\n actions: __assign$1(__assign$1({}, actions), options.actions),\n activities: __assign$1(__assign$1({}, activities), options.activities),\n guards: __assign$1(__assign$1({}, guards), options.guards),\n services: __assign$1(__assign$1({}, services), options.services),\n delays: __assign$1(__assign$1({}, delays), options.delays)\n }, context !== null && context !== void 0 ? context : this.context);\n };\n /**\r\n * Clones this state machine with custom context.\r\n *\r\n * @param context Custom context (will override predefined context, not recursive)\r\n */\n\n\n StateNode.prototype.withContext = function (context) {\n return new StateNode(this.config, this.options, context);\n };\n\n Object.defineProperty(StateNode.prototype, \"context\", {\n get: function () {\n return isFunction(this._context) ? this._context() : this._context;\n },\n enumerable: false,\n configurable: true\n });\n Object.defineProperty(StateNode.prototype, \"definition\", {\n /**\r\n * The well-structured state node definition.\r\n */\n get: function () {\n return {\n id: this.id,\n key: this.key,\n version: this.version,\n context: this.context,\n type: this.type,\n initial: this.initial,\n history: this.history,\n states: mapValues(this.states, function (state) {\n return state.definition;\n }),\n on: this.on,\n transitions: this.transitions,\n entry: this.onEntry,\n exit: this.onExit,\n activities: this.activities || [],\n meta: this.meta,\n order: this.order || -1,\n data: this.doneData,\n invoke: this.invoke,\n description: this.description,\n tags: this.tags\n };\n },\n enumerable: false,\n configurable: true\n });\n\n StateNode.prototype.toJSON = function () {\n return this.definition;\n };\n\n Object.defineProperty(StateNode.prototype, \"on\", {\n /**\r\n * The mapping of events to transitions.\r\n */\n get: function () {\n if (this.__cache.on) {\n return this.__cache.on;\n }\n\n var transitions = this.transitions;\n return this.__cache.on = transitions.reduce(function (map, transition) {\n map[transition.eventType] = map[transition.eventType] || [];\n map[transition.eventType].push(transition);\n return map;\n }, {});\n },\n enumerable: false,\n configurable: true\n });\n Object.defineProperty(StateNode.prototype, \"after\", {\n get: function () {\n return this.__cache.delayedTransitions || (this.__cache.delayedTransitions = this.getDelayedTransitions(), this.__cache.delayedTransitions);\n },\n enumerable: false,\n configurable: true\n });\n Object.defineProperty(StateNode.prototype, \"transitions\", {\n /**\r\n * All the transitions that can be taken from this state node.\r\n */\n get: function () {\n return this.__cache.transitions || (this.__cache.transitions = this.formatTransitions(), this.__cache.transitions);\n },\n enumerable: false,\n configurable: true\n });\n\n StateNode.prototype.getCandidates = function (eventName) {\n if (this.__cache.candidates[eventName]) {\n return this.__cache.candidates[eventName];\n }\n\n var transient = eventName === NULL_EVENT;\n var candidates = this.transitions.filter(function (transition) {\n var sameEventType = transition.eventType === eventName; // null events should only match against eventless transitions\n\n return transient ? sameEventType : sameEventType || transition.eventType === WILDCARD;\n });\n this.__cache.candidates[eventName] = candidates;\n return candidates;\n };\n /**\r\n * All delayed transitions from the config.\r\n */\n\n\n StateNode.prototype.getDelayedTransitions = function () {\n var _this = this;\n\n var afterConfig = this.config.after;\n\n if (!afterConfig) {\n return [];\n }\n\n var mutateEntryExit = function (delay, i) {\n var delayRef = isFunction(delay) ? \"\".concat(_this.id, \":delay[\").concat(i, \"]\") : delay;\n var eventType = after(delayRef, _this.id);\n\n _this.onEntry.push(send(eventType, {\n delay: delay\n }));\n\n _this.onExit.push(cancel(eventType));\n\n return eventType;\n };\n\n var delayedTransitions = isArray(afterConfig) ? afterConfig.map(function (transition, i) {\n var eventType = mutateEntryExit(transition.delay, i);\n return __assign$1(__assign$1({}, transition), {\n event: eventType\n });\n }) : flatten(Object.keys(afterConfig).map(function (delay, i) {\n var configTransition = afterConfig[delay];\n var resolvedTransition = isString(configTransition) ? {\n target: configTransition\n } : configTransition;\n var resolvedDelay = !isNaN(+delay) ? +delay : delay;\n var eventType = mutateEntryExit(resolvedDelay, i);\n return toArray(resolvedTransition).map(function (transition) {\n return __assign$1(__assign$1({}, transition), {\n event: eventType,\n delay: resolvedDelay\n });\n });\n }));\n return delayedTransitions.map(function (delayedTransition) {\n var delay = delayedTransition.delay;\n return __assign$1(__assign$1({}, _this.formatTransition(delayedTransition)), {\n delay: delay\n });\n });\n };\n /**\r\n * Returns the state nodes represented by the current state value.\r\n *\r\n * @param state The state value or State instance\r\n */\n\n\n StateNode.prototype.getStateNodes = function (state) {\n var _a;\n\n var _this = this;\n\n if (!state) {\n return [];\n }\n\n var stateValue = state instanceof State ? state.value : toStateValue(state, this.delimiter);\n\n if (isString(stateValue)) {\n var initialStateValue = this.getStateNode(stateValue).initial;\n return initialStateValue !== undefined ? this.getStateNodes((_a = {}, _a[stateValue] = initialStateValue, _a)) : [this, this.states[stateValue]];\n }\n\n var subStateKeys = Object.keys(stateValue);\n var subStateNodes = [this];\n subStateNodes.push.apply(subStateNodes, __spreadArray([], __read$2(flatten(subStateKeys.map(function (subStateKey) {\n return _this.getStateNode(subStateKey).getStateNodes(stateValue[subStateKey]);\n }))), false));\n return subStateNodes;\n };\n /**\r\n * Returns `true` if this state node explicitly handles the given event.\r\n *\r\n * @param event The event in question\r\n */\n\n\n StateNode.prototype.handles = function (event) {\n var eventType = getEventType(event);\n return this.events.includes(eventType);\n };\n /**\r\n * Resolves the given `state` to a new `State` instance relative to this machine.\r\n *\r\n * This ensures that `.events` and `.nextEvents` represent the correct values.\r\n *\r\n * @param state The state to resolve\r\n */\n\n\n StateNode.prototype.resolveState = function (state) {\n var stateFromConfig = state instanceof State ? state : State.create(state);\n var configuration = Array.from(getConfiguration([], this.getStateNodes(stateFromConfig.value)));\n return new State(__assign$1(__assign$1({}, stateFromConfig), {\n value: this.resolve(stateFromConfig.value),\n configuration: configuration,\n done: isInFinalState(configuration, this),\n tags: getTagsFromConfiguration(configuration),\n machine: this.machine\n }));\n };\n\n StateNode.prototype.transitionLeafNode = function (stateValue, state, _event) {\n var stateNode = this.getStateNode(stateValue);\n var next = stateNode.next(state, _event);\n\n if (!next || !next.transitions.length) {\n return this.next(state, _event);\n }\n\n return next;\n };\n\n StateNode.prototype.transitionCompoundNode = function (stateValue, state, _event) {\n var subStateKeys = Object.keys(stateValue);\n var stateNode = this.getStateNode(subStateKeys[0]);\n\n var next = stateNode._transition(stateValue[subStateKeys[0]], state, _event);\n\n if (!next || !next.transitions.length) {\n return this.next(state, _event);\n }\n\n return next;\n };\n\n StateNode.prototype.transitionParallelNode = function (stateValue, state, _event) {\n var e_2, _a;\n\n var transitionMap = {};\n\n try {\n for (var _b = __values(Object.keys(stateValue)), _c = _b.next(); !_c.done; _c = _b.next()) {\n var subStateKey = _c.value;\n var subStateValue = stateValue[subStateKey];\n\n if (!subStateValue) {\n continue;\n }\n\n var subStateNode = this.getStateNode(subStateKey);\n\n var next = subStateNode._transition(subStateValue, state, _event);\n\n if (next) {\n transitionMap[subStateKey] = next;\n }\n }\n } catch (e_2_1) {\n e_2 = {\n error: e_2_1\n };\n } finally {\n try {\n if (_c && !_c.done && (_a = _b.return)) _a.call(_b);\n } finally {\n if (e_2) throw e_2.error;\n }\n }\n\n var stateTransitions = Object.keys(transitionMap).map(function (key) {\n return transitionMap[key];\n });\n var enabledTransitions = flatten(stateTransitions.map(function (st) {\n return st.transitions;\n }));\n var willTransition = stateTransitions.some(function (st) {\n return st.transitions.length > 0;\n });\n\n if (!willTransition) {\n return this.next(state, _event);\n }\n\n var configuration = flatten(Object.keys(transitionMap).map(function (key) {\n return transitionMap[key].configuration;\n }));\n return {\n transitions: enabledTransitions,\n exitSet: flatten(stateTransitions.map(function (t) {\n return t.exitSet;\n })),\n configuration: configuration,\n source: state,\n actions: flatten(Object.keys(transitionMap).map(function (key) {\n return transitionMap[key].actions;\n }))\n };\n };\n\n StateNode.prototype._transition = function (stateValue, state, _event) {\n // leaf node\n if (isString(stateValue)) {\n return this.transitionLeafNode(stateValue, state, _event);\n } // hierarchical node\n\n\n if (Object.keys(stateValue).length === 1) {\n return this.transitionCompoundNode(stateValue, state, _event);\n } // orthogonal node\n\n\n return this.transitionParallelNode(stateValue, state, _event);\n };\n\n StateNode.prototype.getTransitionData = function (state, event) {\n return this._transition(state.value, state, toSCXMLEvent(event));\n };\n\n StateNode.prototype.next = function (state, _event) {\n var e_3, _a;\n\n var _this = this;\n\n var eventName = _event.name;\n var actions = [];\n var nextStateNodes = [];\n var selectedTransition;\n\n try {\n for (var _b = __values(this.getCandidates(eventName)), _c = _b.next(); !_c.done; _c = _b.next()) {\n var candidate = _c.value;\n var cond = candidate.cond,\n stateIn = candidate.in;\n var resolvedContext = state.context;\n var isInState = stateIn ? isString(stateIn) && isStateId(stateIn) ? // Check if in state by ID\n state.matches(toStateValue(this.getStateNodeById(stateIn).path, this.delimiter)) : // Check if in state by relative grandparent\n matchesState(toStateValue(stateIn, this.delimiter), path(this.path.slice(0, -2))(state.value)) : true;\n var guardPassed = false;\n\n try {\n guardPassed = !cond || evaluateGuard(this.machine, cond, resolvedContext, _event, state);\n } catch (err) {\n throw new Error(\"Unable to evaluate guard '\".concat(cond.name || cond.type, \"' in transition for event '\").concat(eventName, \"' in state node '\").concat(this.id, \"':\\n\").concat(err.message));\n }\n\n if (guardPassed && isInState) {\n if (candidate.target !== undefined) {\n nextStateNodes = candidate.target;\n }\n\n actions.push.apply(actions, __spreadArray([], __read$2(candidate.actions), false));\n selectedTransition = candidate;\n break;\n }\n }\n } catch (e_3_1) {\n e_3 = {\n error: e_3_1\n };\n } finally {\n try {\n if (_c && !_c.done && (_a = _b.return)) _a.call(_b);\n } finally {\n if (e_3) throw e_3.error;\n }\n }\n\n if (!selectedTransition) {\n return undefined;\n }\n\n if (!nextStateNodes.length) {\n return {\n transitions: [selectedTransition],\n exitSet: [],\n configuration: state.value ? [this] : [],\n source: state,\n actions: actions\n };\n }\n\n var allNextStateNodes = flatten(nextStateNodes.map(function (stateNode) {\n return _this.getRelativeStateNodes(stateNode, state.historyValue);\n }));\n var isInternal = !!selectedTransition.internal;\n return {\n transitions: [selectedTransition],\n exitSet: isInternal ? [] : flatten(nextStateNodes.map(function (targetNode) {\n return _this.getPotentiallyReenteringNodes(targetNode);\n })),\n configuration: allNextStateNodes,\n source: state,\n actions: actions\n };\n }; // even though the name of this function mentions reentry nodes\n // we are pushing its result into `exitSet`\n // that's because what we exit might be reentered (it's an invariant of reentrancy)\n\n\n StateNode.prototype.getPotentiallyReenteringNodes = function (targetNode) {\n if (this.order < targetNode.order) {\n return [this];\n }\n\n var nodes = [];\n var marker = this;\n var possibleAncestor = targetNode;\n\n while (marker && marker !== possibleAncestor) {\n nodes.push(marker);\n marker = marker.parent;\n }\n\n if (marker !== possibleAncestor) {\n // we never got to `possibleAncestor`, therefore the initial `marker` \"escapes\" it\n // it's in a different part of the tree so no states will be reentered for such an external transition\n return [];\n }\n\n nodes.push(possibleAncestor);\n return nodes;\n };\n\n StateNode.prototype.getActions = function (resolvedConfig, isDone, transition, currentContext, _event, prevState, predictableExec) {\n var e_4, _a, e_5, _b;\n\n var _this = this;\n\n var prevConfig = prevState ? getConfiguration([], this.getStateNodes(prevState.value)) : [];\n var entrySet = new Set();\n\n try {\n for (var _c = __values(Array.from(resolvedConfig).sort(function (a, b) {\n return a.order - b.order;\n })), _d = _c.next(); !_d.done; _d = _c.next()) {\n var sn = _d.value;\n\n if (!has(prevConfig, sn) || has(transition.exitSet, sn) || sn.parent && entrySet.has(sn.parent)) {\n entrySet.add(sn);\n }\n }\n } catch (e_4_1) {\n e_4 = {\n error: e_4_1\n };\n } finally {\n try {\n if (_d && !_d.done && (_a = _c.return)) _a.call(_c);\n } finally {\n if (e_4) throw e_4.error;\n }\n }\n\n try {\n for (var prevConfig_1 = __values(prevConfig), prevConfig_1_1 = prevConfig_1.next(); !prevConfig_1_1.done; prevConfig_1_1 = prevConfig_1.next()) {\n var sn = prevConfig_1_1.value;\n\n if (!has(resolvedConfig, sn) || has(transition.exitSet, sn.parent)) {\n transition.exitSet.push(sn);\n }\n }\n } catch (e_5_1) {\n e_5 = {\n error: e_5_1\n };\n } finally {\n try {\n if (prevConfig_1_1 && !prevConfig_1_1.done && (_b = prevConfig_1.return)) _b.call(prevConfig_1);\n } finally {\n if (e_5) throw e_5.error;\n }\n }\n\n transition.exitSet.sort(function (a, b) {\n return b.order - a.order;\n });\n var entryStates = Array.from(entrySet).sort(function (a, b) {\n return a.order - b.order;\n });\n var exitStates = new Set(transition.exitSet);\n var doneEvents = flatten(entryStates.map(function (sn) {\n var events = [];\n\n if (sn.type !== 'final') {\n return events;\n }\n\n var parent = sn.parent;\n\n if (!parent.parent) {\n return events;\n }\n\n events.push(done(sn.id, sn.doneData), // TODO: deprecate - final states should not emit done events for their own state.\n done(parent.id, sn.doneData ? mapContext(sn.doneData, currentContext, _event) : undefined));\n var grandparent = parent.parent;\n\n if (grandparent.type === 'parallel') {\n if (getChildren(grandparent).every(function (parentNode) {\n return isInFinalState(transition.configuration, parentNode);\n })) {\n events.push(done(grandparent.id));\n }\n }\n\n return events;\n }));\n var entryActions = entryStates.map(function (stateNode) {\n var entryActions = stateNode.onEntry;\n var invokeActions = stateNode.activities.map(function (activity) {\n return start(activity);\n });\n return {\n type: 'entry',\n actions: toActionObjects(predictableExec ? __spreadArray(__spreadArray([], __read$2(entryActions), false), __read$2(invokeActions), false) : __spreadArray(__spreadArray([], __read$2(invokeActions), false), __read$2(entryActions), false), _this.machine.options.actions)\n };\n }).concat({\n type: 'state_done',\n actions: doneEvents.map(function (event) {\n return raise(event);\n })\n });\n var exitActions = Array.from(exitStates).map(function (stateNode) {\n return {\n type: 'exit',\n actions: toActionObjects(__spreadArray(__spreadArray([], __read$2(stateNode.onExit), false), __read$2(stateNode.activities.map(function (activity) {\n return stop(activity);\n })), false), _this.machine.options.actions)\n };\n });\n var actions = exitActions.concat({\n type: 'transition',\n actions: toActionObjects(transition.actions, this.machine.options.actions)\n }).concat(entryActions);\n\n if (isDone) {\n var stopActions = toActionObjects(flatten(__spreadArray([], __read$2(resolvedConfig), false).sort(function (a, b) {\n return b.order - a.order;\n }).map(function (stateNode) {\n return stateNode.onExit;\n })), this.machine.options.actions).filter(function (action) {\n return !isRaisableAction(action);\n });\n return actions.concat({\n type: 'stop',\n actions: stopActions\n });\n }\n\n return actions;\n };\n /**\r\n * Determines the next state given the current `state` and sent `event`.\r\n *\r\n * @param state The current State instance or state value\r\n * @param event The event that was sent at the current state\r\n * @param context The current context (extended state) of the current state\r\n */\n\n\n StateNode.prototype.transition = function (state, event, context, exec) {\n if (state === void 0) {\n state = this.initialState;\n }\n\n var _event = toSCXMLEvent(event);\n\n var currentState;\n\n if (state instanceof State) {\n currentState = context === undefined ? state : this.resolveState(State.from(state, context));\n } else {\n var resolvedStateValue = isString(state) ? this.resolve(pathToStateValue(this.getResolvedPath(state))) : this.resolve(state);\n var resolvedContext = context !== null && context !== void 0 ? context : this.machine.context;\n currentState = this.resolveState(State.from(resolvedStateValue, resolvedContext));\n }\n\n if (!IS_PRODUCTION && _event.name === WILDCARD) {\n throw new Error(\"An event cannot have the wildcard type ('\".concat(WILDCARD, \"')\"));\n }\n\n if (this.strict) {\n if (!this.events.includes(_event.name) && !isBuiltInEvent(_event.name)) {\n throw new Error(\"Machine '\".concat(this.id, \"' does not accept event '\").concat(_event.name, \"'\"));\n }\n }\n\n var stateTransition = this._transition(currentState.value, currentState, _event) || {\n transitions: [],\n configuration: [],\n exitSet: [],\n source: currentState,\n actions: []\n };\n var prevConfig = getConfiguration([], this.getStateNodes(currentState.value));\n var resolvedConfig = stateTransition.configuration.length ? getConfiguration(prevConfig, stateTransition.configuration) : prevConfig;\n stateTransition.configuration = __spreadArray([], __read$2(resolvedConfig), false);\n return this.resolveTransition(stateTransition, currentState, currentState.context, exec, _event);\n };\n\n StateNode.prototype.resolveRaisedTransition = function (state, _event, originalEvent, predictableExec) {\n var _a;\n\n var currentActions = state.actions;\n state = this.transition(state, _event, undefined, predictableExec); // Save original event to state\n // TODO: this should be the raised event! Delete in V5 (breaking)\n\n state._event = originalEvent;\n state.event = originalEvent.data;\n\n (_a = state.actions).unshift.apply(_a, __spreadArray([], __read$2(currentActions), false));\n\n return state;\n };\n\n StateNode.prototype.resolveTransition = function (stateTransition, currentState, context, predictableExec, _event) {\n var e_6, _a, e_7, _b;\n\n var _this = this;\n\n if (_event === void 0) {\n _event = initEvent;\n }\n\n var configuration = stateTransition.configuration; // Transition will \"apply\" if:\n // - this is the initial state (there is no current state)\n // - OR there are transitions\n\n var willTransition = !currentState || stateTransition.transitions.length > 0;\n var resolvedConfiguration = willTransition ? stateTransition.configuration : currentState ? currentState.configuration : [];\n var isDone = isInFinalState(resolvedConfiguration, this);\n var resolvedStateValue = willTransition ? getValue(this.machine, configuration) : undefined;\n var historyValue = currentState ? currentState.historyValue ? currentState.historyValue : stateTransition.source ? this.machine.historyValue(currentState.value) : undefined : undefined;\n var actionBlocks = this.getActions(new Set(resolvedConfiguration), isDone, stateTransition, context, _event, currentState, predictableExec);\n var activities = currentState ? __assign$1({}, currentState.activities) : {};\n\n try {\n for (var actionBlocks_1 = __values(actionBlocks), actionBlocks_1_1 = actionBlocks_1.next(); !actionBlocks_1_1.done; actionBlocks_1_1 = actionBlocks_1.next()) {\n var block = actionBlocks_1_1.value;\n\n try {\n for (var _c = (e_7 = void 0, __values(block.actions)), _d = _c.next(); !_d.done; _d = _c.next()) {\n var action = _d.value;\n\n if (action.type === start$1) {\n activities[action.activity.id || action.activity.type] = action;\n } else if (action.type === stop$1) {\n activities[action.activity.id || action.activity.type] = false;\n }\n }\n } catch (e_7_1) {\n e_7 = {\n error: e_7_1\n };\n } finally {\n try {\n if (_d && !_d.done && (_b = _c.return)) _b.call(_c);\n } finally {\n if (e_7) throw e_7.error;\n }\n }\n }\n } catch (e_6_1) {\n e_6 = {\n error: e_6_1\n };\n } finally {\n try {\n if (actionBlocks_1_1 && !actionBlocks_1_1.done && (_a = actionBlocks_1.return)) _a.call(actionBlocks_1);\n } finally {\n if (e_6) throw e_6.error;\n }\n }\n\n var _e = __read$2(resolveActions(this, currentState, context, _event, actionBlocks, predictableExec, this.machine.config.predictableActionArguments || this.machine.config.preserveActionOrder), 2),\n resolvedActions = _e[0],\n updatedContext = _e[1];\n\n var _f = __read$2(partition(resolvedActions, isRaisableAction), 2),\n raisedEvents = _f[0],\n nonRaisedActions = _f[1];\n\n var invokeActions = resolvedActions.filter(function (action) {\n var _a;\n\n return action.type === start$1 && ((_a = action.activity) === null || _a === void 0 ? void 0 : _a.type) === invoke;\n });\n var children = invokeActions.reduce(function (acc, action) {\n acc[action.activity.id] = createInvocableActor(action.activity, _this.machine, updatedContext, _event);\n return acc;\n }, currentState ? __assign$1({}, currentState.children) : {});\n var nextState = new State({\n value: resolvedStateValue || currentState.value,\n context: updatedContext,\n _event: _event,\n // Persist _sessionid between states\n _sessionid: currentState ? currentState._sessionid : null,\n historyValue: resolvedStateValue ? historyValue ? updateHistoryValue(historyValue, resolvedStateValue) : undefined : currentState ? currentState.historyValue : undefined,\n history: !resolvedStateValue || stateTransition.source ? currentState : undefined,\n actions: resolvedStateValue ? nonRaisedActions : [],\n activities: resolvedStateValue ? activities : currentState ? currentState.activities : {},\n events: [],\n configuration: resolvedConfiguration,\n transitions: stateTransition.transitions,\n children: children,\n done: isDone,\n tags: getTagsFromConfiguration(resolvedConfiguration),\n machine: this\n });\n var didUpdateContext = context !== updatedContext;\n nextState.changed = _event.name === update || didUpdateContext; // Dispose of penultimate histories to prevent memory leaks\n\n var history = nextState.history;\n\n if (history) {\n delete history.history;\n } // There are transient transitions if the machine is not in a final state\n // and if some of the state nodes have transient (\"always\") transitions.\n\n\n var hasAlwaysTransitions = !isDone && (this._transient || configuration.some(function (stateNode) {\n return stateNode._transient;\n })); // If there are no enabled transitions, check if there are transient transitions.\n // If there are transient transitions, continue checking for more transitions\n // because an transient transition should be triggered even if there are no\n // enabled transitions.\n //\n // If we're already working on an transient transition then stop to prevent an infinite loop.\n //\n // Otherwise, if there are no enabled nor transient transitions, we are done.\n\n if (!willTransition && (!hasAlwaysTransitions || _event.name === NULL_EVENT)) {\n return nextState;\n }\n\n var maybeNextState = nextState;\n\n if (!isDone) {\n if (hasAlwaysTransitions) {\n maybeNextState = this.resolveRaisedTransition(maybeNextState, {\n type: nullEvent\n }, _event, predictableExec);\n }\n\n while (raisedEvents.length) {\n var raisedEvent = raisedEvents.shift();\n maybeNextState = this.resolveRaisedTransition(maybeNextState, raisedEvent._event, _event, predictableExec);\n }\n } // Detect if state changed\n\n\n var changed = maybeNextState.changed || (history ? !!maybeNextState.actions.length || didUpdateContext || typeof history.value !== typeof maybeNextState.value || !stateValuesEqual(maybeNextState.value, history.value) : undefined);\n maybeNextState.changed = changed; // Preserve original history after raised events\n\n maybeNextState.history = history;\n return maybeNextState;\n };\n /**\r\n * Returns the child state node from its relative `stateKey`, or throws.\r\n */\n\n\n StateNode.prototype.getStateNode = function (stateKey) {\n if (isStateId(stateKey)) {\n return this.machine.getStateNodeById(stateKey);\n }\n\n if (!this.states) {\n throw new Error(\"Unable to retrieve child state '\".concat(stateKey, \"' from '\").concat(this.id, \"'; no child states exist.\"));\n }\n\n var result = this.states[stateKey];\n\n if (!result) {\n throw new Error(\"Child state '\".concat(stateKey, \"' does not exist on '\").concat(this.id, \"'\"));\n }\n\n return result;\n };\n /**\r\n * Returns the state node with the given `stateId`, or throws.\r\n *\r\n * @param stateId The state ID. The prefix \"#\" is removed.\r\n */\n\n\n StateNode.prototype.getStateNodeById = function (stateId) {\n var resolvedStateId = isStateId(stateId) ? stateId.slice(STATE_IDENTIFIER.length) : stateId;\n\n if (resolvedStateId === this.id) {\n return this;\n }\n\n var stateNode = this.machine.idMap[resolvedStateId];\n\n if (!stateNode) {\n throw new Error(\"Child state node '#\".concat(resolvedStateId, \"' does not exist on machine '\").concat(this.id, \"'\"));\n }\n\n return stateNode;\n };\n /**\r\n * Returns the relative state node from the given `statePath`, or throws.\r\n *\r\n * @param statePath The string or string array relative path to the state node.\r\n */\n\n\n StateNode.prototype.getStateNodeByPath = function (statePath) {\n if (typeof statePath === 'string' && isStateId(statePath)) {\n try {\n return this.getStateNodeById(statePath.slice(1));\n } catch (e) {// try individual paths\n // throw e;\n }\n }\n\n var arrayStatePath = toStatePath(statePath, this.delimiter).slice();\n var currentStateNode = this;\n\n while (arrayStatePath.length) {\n var key = arrayStatePath.shift();\n\n if (!key.length) {\n break;\n }\n\n currentStateNode = currentStateNode.getStateNode(key);\n }\n\n return currentStateNode;\n };\n /**\r\n * Resolves a partial state value with its full representation in this machine.\r\n *\r\n * @param stateValue The partial state value to resolve.\r\n */\n\n\n StateNode.prototype.resolve = function (stateValue) {\n var _a;\n\n var _this = this;\n\n if (!stateValue) {\n return this.initialStateValue || EMPTY_OBJECT; // TODO: type-specific properties\n }\n\n switch (this.type) {\n case 'parallel':\n return mapValues(this.initialStateValue, function (subStateValue, subStateKey) {\n return subStateValue ? _this.getStateNode(subStateKey).resolve(stateValue[subStateKey] || subStateValue) : EMPTY_OBJECT;\n });\n\n case 'compound':\n if (isString(stateValue)) {\n var subStateNode = this.getStateNode(stateValue);\n\n if (subStateNode.type === 'parallel' || subStateNode.type === 'compound') {\n return _a = {}, _a[stateValue] = subStateNode.initialStateValue, _a;\n }\n\n return stateValue;\n }\n\n if (!Object.keys(stateValue).length) {\n return this.initialStateValue || {};\n }\n\n return mapValues(stateValue, function (subStateValue, subStateKey) {\n return subStateValue ? _this.getStateNode(subStateKey).resolve(subStateValue) : EMPTY_OBJECT;\n });\n\n default:\n return stateValue || EMPTY_OBJECT;\n }\n };\n\n StateNode.prototype.getResolvedPath = function (stateIdentifier) {\n if (isStateId(stateIdentifier)) {\n var stateNode = this.machine.idMap[stateIdentifier.slice(STATE_IDENTIFIER.length)];\n\n if (!stateNode) {\n throw new Error(\"Unable to find state node '\".concat(stateIdentifier, \"'\"));\n }\n\n return stateNode.path;\n }\n\n return toStatePath(stateIdentifier, this.delimiter);\n };\n\n Object.defineProperty(StateNode.prototype, \"initialStateValue\", {\n get: function () {\n var _a;\n\n if (this.__cache.initialStateValue) {\n return this.__cache.initialStateValue;\n }\n\n var initialStateValue;\n\n if (this.type === 'parallel') {\n initialStateValue = mapFilterValues(this.states, function (state) {\n return state.initialStateValue || EMPTY_OBJECT;\n }, function (stateNode) {\n return !(stateNode.type === 'history');\n });\n } else if (this.initial !== undefined) {\n if (!this.states[this.initial]) {\n throw new Error(\"Initial state '\".concat(this.initial, \"' not found on '\").concat(this.key, \"'\"));\n }\n\n initialStateValue = isLeafNode(this.states[this.initial]) ? this.initial : (_a = {}, _a[this.initial] = this.states[this.initial].initialStateValue, _a);\n } else {\n // The finite state value of a machine without child states is just an empty object\n initialStateValue = {};\n }\n\n this.__cache.initialStateValue = initialStateValue;\n return this.__cache.initialStateValue;\n },\n enumerable: false,\n configurable: true\n });\n\n StateNode.prototype.getInitialState = function (stateValue, context) {\n this._init(); // TODO: this should be in the constructor (see note in constructor)\n\n\n var configuration = this.getStateNodes(stateValue);\n return this.resolveTransition({\n configuration: configuration,\n exitSet: [],\n transitions: [],\n source: undefined,\n actions: []\n }, undefined, context !== null && context !== void 0 ? context : this.machine.context, undefined);\n };\n\n Object.defineProperty(StateNode.prototype, \"initialState\", {\n /**\r\n * The initial State instance, which includes all actions to be executed from\r\n * entering the initial state.\r\n */\n get: function () {\n var initialStateValue = this.initialStateValue;\n\n if (!initialStateValue) {\n throw new Error(\"Cannot retrieve initial state from simple state '\".concat(this.id, \"'.\"));\n }\n\n return this.getInitialState(initialStateValue);\n },\n enumerable: false,\n configurable: true\n });\n Object.defineProperty(StateNode.prototype, \"target\", {\n /**\r\n * The target state value of the history state node, if it exists. This represents the\r\n * default state value to transition to if no history value exists yet.\r\n */\n get: function () {\n var target;\n\n if (this.type === 'history') {\n var historyConfig = this.config;\n\n if (isString(historyConfig.target)) {\n target = isStateId(historyConfig.target) ? pathToStateValue(this.machine.getStateNodeById(historyConfig.target).path.slice(this.path.length - 1)) : historyConfig.target;\n } else {\n target = historyConfig.target;\n }\n }\n\n return target;\n },\n enumerable: false,\n configurable: true\n });\n /**\r\n * Returns the leaf nodes from a state path relative to this state node.\r\n *\r\n * @param relativeStateId The relative state path to retrieve the state nodes\r\n * @param history The previous state to retrieve history\r\n * @param resolve Whether state nodes should resolve to initial child state nodes\r\n */\n\n StateNode.prototype.getRelativeStateNodes = function (relativeStateId, historyValue, resolve) {\n if (resolve === void 0) {\n resolve = true;\n }\n\n return resolve ? relativeStateId.type === 'history' ? relativeStateId.resolveHistory(historyValue) : relativeStateId.initialStateNodes : [relativeStateId];\n };\n\n Object.defineProperty(StateNode.prototype, \"initialStateNodes\", {\n get: function () {\n var _this = this;\n\n if (isLeafNode(this)) {\n return [this];\n } // Case when state node is compound but no initial state is defined\n\n\n if (this.type === 'compound' && !this.initial) {\n if (!IS_PRODUCTION) {\n warn(false, \"Compound state node '\".concat(this.id, \"' has no initial state.\"));\n }\n\n return [this];\n }\n\n var initialStateNodePaths = toStatePaths(this.initialStateValue);\n return flatten(initialStateNodePaths.map(function (initialPath) {\n return _this.getFromRelativePath(initialPath);\n }));\n },\n enumerable: false,\n configurable: true\n });\n /**\r\n * Retrieves state nodes from a relative path to this state node.\r\n *\r\n * @param relativePath The relative path from this state node\r\n * @param historyValue\r\n */\n\n StateNode.prototype.getFromRelativePath = function (relativePath) {\n if (!relativePath.length) {\n return [this];\n }\n\n var _a = __read$2(relativePath),\n stateKey = _a[0],\n childStatePath = _a.slice(1);\n\n if (!this.states) {\n throw new Error(\"Cannot retrieve subPath '\".concat(stateKey, \"' from node with no states\"));\n }\n\n var childStateNode = this.getStateNode(stateKey);\n\n if (childStateNode.type === 'history') {\n return childStateNode.resolveHistory();\n }\n\n if (!this.states[stateKey]) {\n throw new Error(\"Child state '\".concat(stateKey, \"' does not exist on '\").concat(this.id, \"'\"));\n }\n\n return this.states[stateKey].getFromRelativePath(childStatePath);\n };\n\n StateNode.prototype.historyValue = function (relativeStateValue) {\n if (!Object.keys(this.states).length) {\n return undefined;\n }\n\n return {\n current: relativeStateValue || this.initialStateValue,\n states: mapFilterValues(this.states, function (stateNode, key) {\n if (!relativeStateValue) {\n return stateNode.historyValue();\n }\n\n var subStateValue = isString(relativeStateValue) ? undefined : relativeStateValue[key];\n return stateNode.historyValue(subStateValue || stateNode.initialStateValue);\n }, function (stateNode) {\n return !stateNode.history;\n })\n };\n };\n /**\r\n * Resolves to the historical value(s) of the parent state node,\r\n * represented by state nodes.\r\n *\r\n * @param historyValue\r\n */\n\n\n StateNode.prototype.resolveHistory = function (historyValue) {\n var _this = this;\n\n if (this.type !== 'history') {\n return [this];\n }\n\n var parent = this.parent;\n\n if (!historyValue) {\n var historyTarget = this.target;\n return historyTarget ? flatten(toStatePaths(historyTarget).map(function (relativeChildPath) {\n return parent.getFromRelativePath(relativeChildPath);\n })) : parent.initialStateNodes;\n }\n\n var subHistoryValue = nestedPath(parent.path, 'states')(historyValue).current;\n\n if (isString(subHistoryValue)) {\n return [parent.getStateNode(subHistoryValue)];\n }\n\n return flatten(toStatePaths(subHistoryValue).map(function (subStatePath) {\n return _this.history === 'deep' ? parent.getFromRelativePath(subStatePath) : [parent.states[subStatePath[0]]];\n }));\n };\n\n Object.defineProperty(StateNode.prototype, \"stateIds\", {\n /**\r\n * All the state node IDs of this state node and its descendant state nodes.\r\n */\n get: function () {\n var _this = this;\n\n var childStateIds = flatten(Object.keys(this.states).map(function (stateKey) {\n return _this.states[stateKey].stateIds;\n }));\n return [this.id].concat(childStateIds);\n },\n enumerable: false,\n configurable: true\n });\n Object.defineProperty(StateNode.prototype, \"events\", {\n /**\r\n * All the event types accepted by this state node and its descendants.\r\n */\n get: function () {\n var e_8, _a, e_9, _b;\n\n if (this.__cache.events) {\n return this.__cache.events;\n }\n\n var states = this.states;\n var events = new Set(this.ownEvents);\n\n if (states) {\n try {\n for (var _c = __values(Object.keys(states)), _d = _c.next(); !_d.done; _d = _c.next()) {\n var stateId = _d.value;\n var state = states[stateId];\n\n if (state.states) {\n try {\n for (var _e = (e_9 = void 0, __values(state.events)), _f = _e.next(); !_f.done; _f = _e.next()) {\n var event_1 = _f.value;\n events.add(\"\".concat(event_1));\n }\n } catch (e_9_1) {\n e_9 = {\n error: e_9_1\n };\n } finally {\n try {\n if (_f && !_f.done && (_b = _e.return)) _b.call(_e);\n } finally {\n if (e_9) throw e_9.error;\n }\n }\n }\n }\n } catch (e_8_1) {\n e_8 = {\n error: e_8_1\n };\n } finally {\n try {\n if (_d && !_d.done && (_a = _c.return)) _a.call(_c);\n } finally {\n if (e_8) throw e_8.error;\n }\n }\n }\n\n return this.__cache.events = Array.from(events);\n },\n enumerable: false,\n configurable: true\n });\n Object.defineProperty(StateNode.prototype, \"ownEvents\", {\n /**\r\n * All the events that have transitions directly from this state node.\r\n *\r\n * Excludes any inert events.\r\n */\n get: function () {\n var events = new Set(this.transitions.filter(function (transition) {\n return !(!transition.target && !transition.actions.length && transition.internal);\n }).map(function (transition) {\n return transition.eventType;\n }));\n return Array.from(events);\n },\n enumerable: false,\n configurable: true\n });\n\n StateNode.prototype.resolveTarget = function (_target) {\n var _this = this;\n\n if (_target === undefined) {\n // an undefined target signals that the state node should not transition from that state when receiving that event\n return undefined;\n }\n\n return _target.map(function (target) {\n if (!isString(target)) {\n return target;\n }\n\n var isInternalTarget = target[0] === _this.delimiter; // If internal target is defined on machine,\n // do not include machine key on target\n\n if (isInternalTarget && !_this.parent) {\n return _this.getStateNodeByPath(target.slice(1));\n }\n\n var resolvedTarget = isInternalTarget ? _this.key + target : target;\n\n if (_this.parent) {\n try {\n var targetStateNode = _this.parent.getStateNodeByPath(resolvedTarget);\n\n return targetStateNode;\n } catch (err) {\n throw new Error(\"Invalid transition definition for state node '\".concat(_this.id, \"':\\n\").concat(err.message));\n }\n } else {\n return _this.getStateNodeByPath(resolvedTarget);\n }\n });\n };\n\n StateNode.prototype.formatTransition = function (transitionConfig) {\n var _this = this;\n\n var normalizedTarget = normalizeTarget(transitionConfig.target);\n var internal = 'internal' in transitionConfig ? transitionConfig.internal : normalizedTarget ? normalizedTarget.some(function (_target) {\n return isString(_target) && _target[0] === _this.delimiter;\n }) : true;\n var guards = this.machine.options.guards;\n var target = this.resolveTarget(normalizedTarget);\n\n var transition = __assign$1(__assign$1({}, transitionConfig), {\n actions: toActionObjects(toArray(transitionConfig.actions)),\n cond: toGuard(transitionConfig.cond, guards),\n target: target,\n source: this,\n internal: internal,\n eventType: transitionConfig.event,\n toJSON: function () {\n return __assign$1(__assign$1({}, transition), {\n target: transition.target ? transition.target.map(function (t) {\n return \"#\".concat(t.id);\n }) : undefined,\n source: \"#\".concat(_this.id)\n });\n }\n });\n\n return transition;\n };\n\n StateNode.prototype.formatTransitions = function () {\n var e_10, _a;\n\n var _this = this;\n\n var onConfig;\n\n if (!this.config.on) {\n onConfig = [];\n } else if (Array.isArray(this.config.on)) {\n onConfig = this.config.on;\n } else {\n var _b = this.config.on,\n _c = WILDCARD,\n _d = _b[_c],\n wildcardConfigs = _d === void 0 ? [] : _d,\n strictTransitionConfigs_1 = __rest$1(_b, [typeof _c === \"symbol\" ? _c : _c + \"\"]);\n\n onConfig = flatten(Object.keys(strictTransitionConfigs_1).map(function (key) {\n if (!IS_PRODUCTION && key === NULL_EVENT) {\n warn(false, \"Empty string transition configs (e.g., `{ on: { '': ... }}`) for transient transitions are deprecated. Specify the transition in the `{ always: ... }` property instead. \" + \"Please check the `on` configuration for \\\"#\".concat(_this.id, \"\\\".\"));\n }\n\n var transitionConfigArray = toTransitionConfigArray(key, strictTransitionConfigs_1[key]);\n\n if (!IS_PRODUCTION) {\n validateArrayifiedTransitions(_this, key, transitionConfigArray);\n }\n\n return transitionConfigArray;\n }).concat(toTransitionConfigArray(WILDCARD, wildcardConfigs)));\n }\n\n var eventlessConfig = this.config.always ? toTransitionConfigArray('', this.config.always) : [];\n var doneConfig = this.config.onDone ? toTransitionConfigArray(String(done(this.id)), this.config.onDone) : [];\n\n if (!IS_PRODUCTION) {\n warn(!(this.config.onDone && !this.parent), \"Root nodes cannot have an \\\".onDone\\\" transition. Please check the config of \\\"\".concat(this.id, \"\\\".\"));\n }\n\n var invokeConfig = flatten(this.invoke.map(function (invokeDef) {\n var settleTransitions = [];\n\n if (invokeDef.onDone) {\n settleTransitions.push.apply(settleTransitions, __spreadArray([], __read$2(toTransitionConfigArray(String(doneInvoke(invokeDef.id)), invokeDef.onDone)), false));\n }\n\n if (invokeDef.onError) {\n settleTransitions.push.apply(settleTransitions, __spreadArray([], __read$2(toTransitionConfigArray(String(error(invokeDef.id)), invokeDef.onError)), false));\n }\n\n return settleTransitions;\n }));\n var delayedTransitions = this.after;\n var formattedTransitions = flatten(__spreadArray(__spreadArray(__spreadArray(__spreadArray([], __read$2(doneConfig), false), __read$2(invokeConfig), false), __read$2(onConfig), false), __read$2(eventlessConfig), false).map(function (transitionConfig) {\n return toArray(transitionConfig).map(function (transition) {\n return _this.formatTransition(transition);\n });\n }));\n\n try {\n for (var delayedTransitions_1 = __values(delayedTransitions), delayedTransitions_1_1 = delayedTransitions_1.next(); !delayedTransitions_1_1.done; delayedTransitions_1_1 = delayedTransitions_1.next()) {\n var delayedTransition = delayedTransitions_1_1.value;\n formattedTransitions.push(delayedTransition);\n }\n } catch (e_10_1) {\n e_10 = {\n error: e_10_1\n };\n } finally {\n try {\n if (delayedTransitions_1_1 && !delayedTransitions_1_1.done && (_a = delayedTransitions_1.return)) _a.call(delayedTransitions_1);\n } finally {\n if (e_10) throw e_10.error;\n }\n }\n\n return formattedTransitions;\n };\n\n return StateNode;\n}();\n\nvar warned = false;\nfunction createMachine(config, options) {\n if (!IS_PRODUCTION && !('predictableActionArguments' in config) && !warned) {\n warned = true;\n console.warn('It is highly recommended to set `predictableActionArguments` to `true` when using `createMachine`. https://xstate.js.org/docs/guides/actions.html');\n }\n\n return new StateNode(config, options);\n}\n\nvar assign = assign$1;\n\nvar index = useLayoutEffect ;\n\nfunction useConstant(fn) {\n var ref = React$1.useRef();\n if (!ref.current) {\n ref.current = { v: fn() };\n }\n return ref.current.v;\n}\n\nvar __assign = (undefined && undefined.__assign) || function () {\n __assign = Object.assign || function(t) {\n for (var s, i = 1, n = arguments.length; i < n; i++) {\n s = arguments[i];\n for (var p in s) if (Object.prototype.hasOwnProperty.call(s, p))\n t[p] = s[p];\n }\n return t;\n };\n return __assign.apply(this, arguments);\n};\nvar __rest = (undefined && undefined.__rest) || function (s, e) {\n var t = {};\n for (var p in s) if (Object.prototype.hasOwnProperty.call(s, p) && e.indexOf(p) < 0)\n t[p] = s[p];\n if (s != null && typeof Object.getOwnPropertySymbols === \"function\")\n for (var i = 0, p = Object.getOwnPropertySymbols(s); i < p.length; i++) {\n if (e.indexOf(p[i]) < 0 && Object.prototype.propertyIsEnumerable.call(s, p[i]))\n t[p[i]] = s[p[i]];\n }\n return t;\n};\nvar __read$1 = (undefined && undefined.__read) || function (o, n) {\n var m = typeof Symbol === \"function\" && o[Symbol.iterator];\n if (!m) return o;\n var i = m.call(o), r, ar = [], e;\n try {\n while ((n === void 0 || n-- > 0) && !(r = i.next()).done) ar.push(r.value);\n }\n catch (error) { e = { error: error }; }\n finally {\n try {\n if (r && !r.done && (m = i[\"return\"])) m.call(i);\n }\n finally { if (e) throw e.error; }\n }\n return ar;\n};\nfunction useIdleInterpreter(getMachine, options) {\n var machine = useConstant(function () {\n return typeof getMachine === 'function' ? getMachine() : getMachine;\n });\n if (process.env.NODE_ENV !== 'production' &&\n typeof getMachine !== 'function') {\n var _a = __read$1(useState(machine), 1), initialMachine = _a[0];\n if (getMachine !== initialMachine) {\n console.warn('Machine given to `useMachine` has changed between renders. This is not supported and might lead to unexpected results.\\n' +\n 'Please make sure that you pass the same Machine as argument each time.');\n }\n }\n var context = options.context, guards = options.guards, actions = options.actions, activities = options.activities, services = options.services, delays = options.delays; options.state; var interpreterOptions = __rest(options, [\"context\", \"guards\", \"actions\", \"activities\", \"services\", \"delays\", \"state\"]);\n var service = useConstant(function () {\n var machineConfig = {\n context: context,\n guards: guards,\n actions: actions,\n activities: activities,\n services: services,\n delays: delays\n };\n var machineWithConfig = machine.withConfig(machineConfig, function () { return (__assign(__assign({}, machine.context), context)); });\n return interpret(machineWithConfig, interpreterOptions);\n });\n // Make sure options are kept updated when they change.\n // This mutation assignment is safe because the service instance is only used\n // in one place -- this hook's caller.\n index(function () {\n Object.assign(service.machine.options.actions, actions);\n Object.assign(service.machine.options.guards, guards);\n Object.assign(service.machine.options.activities, activities);\n Object.assign(service.machine.options.services, services);\n Object.assign(service.machine.options.delays, delays);\n }, [actions, guards, activities, services, delays]);\n return service;\n}\n\n(undefined && undefined.__read) || function (o, n) {\n var m = typeof Symbol === \"function\" && o[Symbol.iterator];\n if (!m) return o;\n var i = m.call(o), r, ar = [], e;\n try {\n while ((n === void 0 || n-- > 0) && !(r = i.next()).done) ar.push(r.value);\n }\n catch (error) { e = { error: error }; }\n finally {\n try {\n if (r && !r.done && (m = i[\"return\"])) m.call(i);\n }\n finally { if (e) throw e.error; }\n }\n return ar;\n};\n(undefined && undefined.__values) || function(o) {\n var s = typeof Symbol === \"function\" && Symbol.iterator, m = s && o[s], i = 0;\n if (m) return m.call(o);\n if (o && typeof o.length === \"number\") return {\n next: function () {\n if (o && i >= o.length) o = void 0;\n return { value: o && o[i++], done: !o };\n }\n };\n throw new TypeError(s ? \"Object is not iterable.\" : \"Symbol.iterator is not defined.\");\n};\nfunction isInterpreterStateEqual(service, prevState, nextState) {\n if (service.status === InterpreterStatus.NotStarted) {\n return true;\n }\n // Only change the current state if:\n // - the incoming state is the \"live\" initial state (since it might have new actors)\n // - OR the incoming state actually changed.\n //\n // The \"live\" initial state will have .changed === undefined.\n var initialStateChanged = nextState.changed === undefined &&\n (Object.keys(nextState.children).length > 0 ||\n typeof prevState.changed === 'boolean');\n return !(nextState.changed || initialStateChanged);\n}\n\nvar __read = (undefined && undefined.__read) || function (o, n) {\n var m = typeof Symbol === \"function\" && o[Symbol.iterator];\n if (!m) return o;\n var i = m.call(o), r, ar = [], e;\n try {\n while ((n === void 0 || n-- > 0) && !(r = i.next()).done) ar.push(r.value);\n }\n catch (error) { e = { error: error }; }\n finally {\n try {\n if (r && !r.done && (m = i[\"return\"])) m.call(i);\n }\n finally { if (e) throw e.error; }\n }\n return ar;\n};\nfunction identity(a) {\n return a;\n}\nfunction useMachine(getMachine) {\n var _a = [];\n for (var _i = 1; _i < arguments.length; _i++) {\n _a[_i - 1] = arguments[_i];\n }\n var _b = __read(_a, 1), _c = _b[0], options = _c === void 0 ? {} : _c;\n // using `useIdleInterpreter` allows us to subscribe to the service *before* we start it\n // so we don't miss any notifications\n var service = useIdleInterpreter(getMachine, options);\n var getSnapshot = useCallback(function () {\n if (service.status === InterpreterStatus.NotStarted) {\n return (options.state\n ? State.create(options.state)\n : service.machine.initialState);\n }\n return service.getSnapshot();\n }, [service]);\n var isEqual = useCallback(function (prevState, nextState) {\n return isInterpreterStateEqual(service, prevState, nextState);\n }, [service]);\n var subscribe = useCallback(function (handleStoreChange) {\n var unsubscribe = service.subscribe(handleStoreChange).unsubscribe;\n return unsubscribe;\n }, [service]);\n var storeSnapshot = withSelector.exports.useSyncExternalStoreWithSelector(subscribe, getSnapshot, getSnapshot, identity, isEqual);\n useEffect(function () {\n var rehydratedState = options.state;\n service.start(rehydratedState ? State.create(rehydratedState) : undefined);\n return function () {\n service.stop();\n service.status = InterpreterStatus.NotStarted;\n };\n }, []);\n return [storeSnapshot, service.send, service];\n}\n\nvar scanViewStateMachine = createMachine({\r\n id: \"scanStatus\",\r\n initial: \"cameraLoading\",\r\n context: {\r\n card_id: \"\",\r\n scan_id: \"\",\r\n autoScan: true,\r\n scannerRunning: false,\r\n backSideSupport: false,\r\n headerTitle: \"Hold Card in Frame\\nIt Will Scan Automatically\",\r\n messageState: {},\r\n toggledAutoManual: false,\r\n processing: false,\r\n httpCode: 0,\r\n httpMessage: \"\",\r\n },\r\n states: {\r\n cameraLoading: {\r\n on: {\r\n CAMERA_LOADED: {\r\n target: \"autoCapture\",\r\n actions: [\r\n assign({\r\n scannerRunning: true,\r\n }),\r\n \"updateHeaderTitle\",\r\n ],\r\n },\r\n ERROR: {\r\n target: \"error\",\r\n actions: [\r\n assign({\r\n scannerRunning: true,\r\n httpCode: function (context, event) { return event.httpCode; },\r\n httpMessage: function (context, event) { return event.httpMessage; },\r\n }),\r\n \"updateHeaderTitle\",\r\n ],\r\n },\r\n CAMERAERROR: {\r\n target: \"cameraError\",\r\n actions: [\r\n assign({\r\n scannerRunning: true,\r\n httpCode: function (context, event) { return event.httpCode; },\r\n httpMessage: function (context, event) { return event.httpMessage; },\r\n }),\r\n \"updateHeaderTitle\",\r\n ],\r\n },\r\n },\r\n },\r\n autoCapture: {\r\n on: {\r\n \"card.frontside_processing\": {\r\n target: \"frontsideProcessing\",\r\n actions: [\r\n assign({\r\n card_id: function (context, event) { return event.card_id; },\r\n scan_id: function (context, event) { return event.scan_id; },\r\n backSideSupport: function (context, event) {\r\n return event.backSideSupport ? event.backSideSupport : false;\r\n },\r\n processing: true,\r\n }),\r\n \"updateHeaderTitle\",\r\n ],\r\n },\r\n TOGGLE: {\r\n target: \"manualCapture\",\r\n actions: [\r\n assign({\r\n autoScan: false,\r\n scannerRunning: false,\r\n toggledAutoManual: true,\r\n }),\r\n \"updateHeaderTitle\",\r\n ],\r\n },\r\n \"card.error\": {\r\n target: \"retry\",\r\n actions: [\r\n assign({\r\n scannerRunning: false,\r\n }),\r\n \"updateHeaderTitle\",\r\n ],\r\n },\r\n ERROR: {\r\n target: \"error\",\r\n actions: [\r\n assign({\r\n scannerRunning: true,\r\n httpCode: function (context, event) { return event.httpCode; },\r\n httpMessage: function (context, event) { return event.httpMessage; },\r\n }),\r\n \"updateHeaderTitle\",\r\n ],\r\n },\r\n },\r\n },\r\n manualCapture: {\r\n on: {\r\n \"card.frontside_processing\": {\r\n target: \"frontsideProcessing\",\r\n actions: [\r\n assign({\r\n scannerRunning: true,\r\n processing: true,\r\n }),\r\n \"updateHeaderTitle\",\r\n ],\r\n },\r\n MANUAL_BUTTON_CLICK: {\r\n target: \"frontsideProcessing\",\r\n actions: [\r\n assign({\r\n scannerRunning: true,\r\n processing: true,\r\n }),\r\n \"updateHeaderTitle\",\r\n ],\r\n },\r\n TOGGLE: {\r\n target: \"autoCapture\",\r\n actions: [\r\n assign({\r\n autoScan: true,\r\n scannerRunning: true,\r\n toggledAutoManual: true,\r\n }),\r\n \"updateHeaderTitle\",\r\n ],\r\n },\r\n \"card.error\": {\r\n target: \"retry\",\r\n actions: [\r\n assign({\r\n scannerRunning: false,\r\n }),\r\n \"updateHeaderTitle\",\r\n ],\r\n },\r\n ERROR: {\r\n target: \"error\",\r\n actions: [\r\n assign({\r\n scannerRunning: true,\r\n httpCode: function (context, event) { return event.httpCode; },\r\n httpMessage: function (context, event) { return event.httpMessage; },\r\n }),\r\n \"updateHeaderTitle\",\r\n ],\r\n },\r\n },\r\n },\r\n frontsideProcessing: {\r\n on: {\r\n //when frontside only\r\n \"card.completed\": [\r\n {\r\n target: \"completed\",\r\n actions: [\r\n assign({\r\n scannerRunning: false,\r\n }),\r\n \"updateHeaderTitle\",\r\n ],\r\n },\r\n ],\r\n //when backside supported\r\n \"card.backside_processing\": [\r\n {\r\n target: \"backsidePending\",\r\n actions: [\r\n assign({\r\n scannerRunning: false,\r\n processing: false,\r\n }),\r\n \"updateHeaderTitle\",\r\n ],\r\n },\r\n ],\r\n \"card.frontside_failed\": {\r\n target: \"retry\",\r\n actions: [\r\n assign({\r\n scannerRunning: false,\r\n }),\r\n \"updateHeaderTitle\",\r\n ],\r\n },\r\n \"card.error\": {\r\n target: \"retry\",\r\n actions: [\r\n assign({\r\n scannerRunning: false,\r\n }),\r\n \"updateHeaderTitle\",\r\n ],\r\n },\r\n ERROR: {\r\n target: \"retry\",\r\n actions: [\r\n assign({\r\n scannerRunning: false,\r\n httpCode: function (context, event) { return event.httpCode; },\r\n httpMessage: function (context, event) { return event.httpMessage; },\r\n }),\r\n \"updateHeaderTitle\",\r\n ],\r\n },\r\n },\r\n },\r\n backsidePending: {\r\n on: {\r\n ERROR: {\r\n target: \"error\",\r\n actions: [\r\n assign({\r\n scannerRunning: true,\r\n processing: false,\r\n httpCode: function (context, event) { return event.httpCode; },\r\n httpMessage: function (context, event) { return event.httpMessage; },\r\n }),\r\n \"updateHeaderTitle\",\r\n ],\r\n },\r\n \"card.error\": {\r\n target: \"retry\",\r\n actions: [\r\n assign({\r\n scannerRunning: false,\r\n }),\r\n \"updateHeaderTitle\",\r\n ],\r\n },\r\n \"card.backside_failed\": {\r\n target: \"retry\",\r\n actions: [\r\n assign({\r\n scannerRunning: false,\r\n }),\r\n \"updateHeaderTitle\",\r\n ],\r\n },\r\n TOGGLE: [\r\n {\r\n //when toggled from manual to auto scan, transition immediately\r\n target: \"backsideProcessing\",\r\n cond: function (ctx) { return !ctx.autoScan; },\r\n actions: [\r\n assign({\r\n scannerRunning: true,\r\n processing: true,\r\n autoScan: true,\r\n toggledAutoManual: true,\r\n }),\r\n \"updateHeaderTitle\",\r\n ],\r\n },\r\n {\r\n //when toggled from auto to manual scan, disable runner and await manual button click\r\n cond: function (ctx) { return ctx.autoScan; },\r\n actions: [\r\n assign({\r\n scannerRunning: false,\r\n processing: false,\r\n autoScan: false,\r\n toggledAutoManual: true,\r\n }),\r\n \"updateHeaderTitle\",\r\n ],\r\n },\r\n ],\r\n MANUAL_BUTTON_CLICK: {\r\n target: \"backsideProcessing\",\r\n actions: [\r\n assign({\r\n scannerRunning: true,\r\n processing: true,\r\n }),\r\n \"updateHeaderTitle\",\r\n ],\r\n },\r\n },\r\n after: {\r\n // after 5 seconds, transition to backsideProcessing\r\n 5000: {\r\n target: \"backsideProcessing\",\r\n cond: function (ctx) { return ctx.autoScan; },\r\n actions: [\r\n assign({\r\n autoScan: true,\r\n scannerRunning: true,\r\n }),\r\n ],\r\n },\r\n },\r\n },\r\n backsideProcessing: {\r\n on: {\r\n MANUAL_BUTTON_CLICK: {\r\n actions: [\r\n assign({\r\n scannerRunning: true,\r\n }),\r\n \"updateHeaderTitle\",\r\n ],\r\n },\r\n \"scan.processing\": {\r\n actions: [\r\n assign({\r\n scannerRunning: true,\r\n processing: true,\r\n }),\r\n \"updateHeaderTitle\",\r\n ],\r\n },\r\n \"card.completed\": {\r\n target: \"completed\",\r\n actions: [\r\n assign({\r\n scannerRunning: false, //replaces on cleanUp\r\n }),\r\n \"updateHeaderTitle\",\r\n ],\r\n },\r\n \"card.backside_failed\": {\r\n target: \"retry\",\r\n actions: [\r\n assign({\r\n scannerRunning: false,\r\n }),\r\n \"updateHeaderTitle\",\r\n ],\r\n },\r\n \"card.error\": {\r\n target: \"retry\",\r\n actions: [\r\n assign({\r\n scannerRunning: false,\r\n }),\r\n \"updateHeaderTitle\",\r\n ],\r\n },\r\n ERROR: {\r\n target: \"retry\",\r\n actions: [\r\n assign({\r\n scannerRunning: false,\r\n httpCode: function (context, event) { return event.httpCode; },\r\n httpMessage: function (context, event) { return event.httpMessage; },\r\n }),\r\n \"updateHeaderTitle\",\r\n ],\r\n },\r\n },\r\n },\r\n retry: {\r\n on: {\r\n retry_scan: {\r\n target: \"autoCapture\",\r\n actions: [\r\n assign({\r\n scannerRunning: true,\r\n autoScan: true,\r\n processing: false,\r\n }),\r\n \"updateHeaderTitle\",\r\n ],\r\n },\r\n },\r\n },\r\n completed: {\r\n type: \"final\",\r\n },\r\n error: {\r\n //type: \"final\",\r\n on: {\r\n \"card.completed\": {\r\n target: \"completed\",\r\n actions: [\r\n assign({\r\n scannerRunning: false,\r\n processing: true,\r\n }),\r\n \"updateHeaderTitle\",\r\n ],\r\n },\r\n },\r\n },\r\n cameraError: {\r\n //type: \"final\",\r\n on: {\r\n \"card.completed\": {\r\n target: \"completed\",\r\n actions: [\r\n assign({\r\n scannerRunning: false,\r\n processing: true,\r\n }),\r\n \"updateHeaderTitle\",\r\n ],\r\n },\r\n },\r\n },\r\n },\r\n}, {\r\n actions: {\r\n log: function (context, event, meta) {\r\n console.log(\"backSideSupport: \" + context.backSideSupport);\r\n },\r\n updateHeaderTitle: function (context, event, meta) {\r\n context.headerTitle = getHeaderTitle(String(meta.state.value), context.messageState, context.autoScan);\r\n },\r\n },\r\n});\n\nvar _handleError = function (error, stateMachineSend, onError, stateMachineState) {\r\n console.error(error);\r\n if (error.isAxiosError === true && error.response) {\r\n stateMachineSend(\"ERROR\", {\r\n httpCode: error.response.status,\r\n httpMessage: error.message,\r\n });\r\n var err = generateError(error.message, \"ResponseError\", error.response.status);\r\n if (onError) {\r\n onError(err);\r\n }\r\n console.debug(err);\r\n }\r\n else if (error.isAxiosError === true && error.request) {\r\n stateMachineSend(\"ERROR\", {\r\n httpCode: error.request.status,\r\n httpMessage: error.message,\r\n });\r\n var err = generateError(error.message, \"RequestError\", error.request.status);\r\n if (onError) {\r\n onError(err);\r\n }\r\n console.debug(err);\r\n }\r\n else if (error.isCardScanError == true) {\r\n var err = error;\r\n //avoid calling onError on 403 here\r\n //because it is already handled in AxiosError\r\n //so we don't get onError being called twice\r\n //when websocket fails on 403\r\n if (stateMachineState.context.httpCode == 403) {\r\n err = generateError(stateMachineState.context.httpMessage, \"RequestError\", stateMachineState.context.httpCode);\r\n stateMachineSend(\"ERROR\", {\r\n httpCode: stateMachineState.context.httpCode,\r\n httpMessage: stateMachineState.context.httpMessage,\r\n });\r\n }\r\n else {\r\n stateMachineSend(\"ERROR\");\r\n if (onError) {\r\n onError(err);\r\n }\r\n }\r\n }\r\n else {\r\n var err = generateError(error.message, \"UnknownError\", 606);\r\n if (onError) {\r\n onError(err);\r\n }\r\n //don't change UI Status as we don't know if this error is fatal or not.\r\n }\r\n};\n\nvar generateImageFromCanvas = function (videoRefBg, frameDivRef, captureCanvasRef, debug) {\r\n var _a = calculateGuides(videoRefBg, frameDivRef, debug), guideX = _a[0], guideY = _a[1], guideWidth = _a[2], guideHeight = _a[3];\r\n var captureCanvas = captureCanvasRef.current;\r\n var video = videoRefBg.current;\r\n if (!captureCanvas || !video) {\r\n return;\r\n }\r\n //resize image to canvas sizes\r\n var ctx = captureCanvas === null || captureCanvas === void 0 ? void 0 : captureCanvas.getContext(\"2d\", { alpha: false });\r\n ctx === null || ctx === void 0 ? void 0 : ctx.drawImage(video, guideX, guideY, guideWidth, guideHeight, 0, 0, captureCanvas.width, captureCanvas.height);\r\n //The captureCanvas drawImage use a large amount of GPU memory and isn't getting properly garbage collected inside of the loop.\r\n //To fix this we convert the captured image to a jpeg string, which is stored in RAM.\r\n //We then clear the canvas context to clear up GPU memory when possible.\r\n var jpegUrl = captureCanvas.toDataURL(\"image/jpeg\", 0.85);\r\n ctx === null || ctx === void 0 ? void 0 : ctx.clearRect(0, 0, captureCanvas.width, captureCanvas.height);\r\n return jpegUrl;\r\n};\r\nvar generateImageMetadata = function (capture, videoRefBg, frameDivRef, captureCanvasRef, threshold, laplacianThreshold, videoMetadata, debug) {\r\n var video = videoRefBg.current;\r\n var captureCanvas = captureCanvasRef.current;\r\n var _a = calculateGuides(videoRefBg, frameDivRef, debug), guideX = _a[0], guideY = _a[1], guideWidth = _a[2], guideHeight = _a[3];\r\n var metadata = { captureType: capture };\r\n metadata[\"guides\"] = {\r\n x: guideX,\r\n y: guideY,\r\n width: guideWidth,\r\n height: guideHeight,\r\n };\r\n metadata[\"captureCanvas\"] = {\r\n width: captureCanvas === null || captureCanvas === void 0 ? void 0 : captureCanvas.width,\r\n height: captureCanvas === null || captureCanvas === void 0 ? void 0 : captureCanvas.height,\r\n };\r\n metadata[\"videoBackground\"] = {\r\n width: video === null || video === void 0 ? void 0 : video.videoWidth,\r\n height: video === null || video === void 0 ? void 0 : video.videoHeight,\r\n };\r\n metadata[\"windowInner\"] = {\r\n width: window.innerWidth,\r\n height: window.innerHeight,\r\n };\r\n if (capture == \"automatic\" /* CaptureType.automatic */) {\r\n metadata[\"mlThreshold\"] = threshold;\r\n metadata[\"laplacianThreshold\"] = laplacianThreshold;\r\n }\r\n metadata[\"package_name\"] = \"insurance-cardscan-react\";\r\n metadata[\"package_version\"] = cardScanPackageVersion;\r\n metadata = Object.assign({}, metadata, videoMetadata);\r\n return metadata;\r\n};\n\n//Main scan processing handler for scans -- called every ~250ms when active.\r\n//Handles: auto & manual scan\r\n//---------------------------------------\r\n// Hot Path\r\n//---------------------------------------\r\nvar scanHandler = function (videoRefBg, frameDivRef, captureCanvasRef, detectionCanvasRef, debugCanvasLatestRef, setLatestScore, setLatestLaplacian, setBestScore, setModelState, setScanDebugState, setScanProgress, scanCaptureBuffer, threshold, laplacianThreshold, onError, scanProgress, softMaxUploads, bufferSize, videoMetadata, cardScanApi, cardIdRef, stateMachineState, stateMachineSend, debug) {\r\n var _a;\r\n var video = videoRefBg.current;\r\n if (!video || stateMachineState.matches(\"cameraLoading\")) {\r\n console.log(\"scanHandler -- no video found\");\r\n return;\r\n }\r\n var detectionCanvas = detectionCanvasRef.current;\r\n var captureCanvas = captureCanvasRef.current;\r\n var _b = calculateGuides(videoRefBg, frameDivRef, debug), guideX = _b[0], guideY = _b[1], guideWidth = _b[2], guideHeight = _b[3];\r\n if (debug) {\r\n console.debug(\"Canvas: \".concat(captureCanvas === null || captureCanvas === void 0 ? void 0 : captureCanvas.width, \", \").concat(captureCanvas === null || captureCanvas === void 0 ? void 0 : captureCanvas.height));\r\n console.debug(\"Video: \".concat(video.videoWidth, \", \").concat(video.videoHeight));\r\n }\r\n if (!(detectionCanvas && captureCanvas)) {\r\n console.error(\"CardScan: no canvas found - critical failure\");\r\n return;\r\n }\r\n //resize image to canvas sizes\r\n (_a = detectionCanvas\r\n .getContext(\"2d\")) === null || _a === void 0 ? void 0 : _a.drawImage(video, guideX, guideY, guideWidth, guideHeight, 0, 0, detectionCanvas.width, detectionCanvas.height);\r\n var jpegUrl;\r\n //work around for iOS GPU memory issue.\r\n //TODO: check we still need this and remove if not. might have been fixed by useInterval\r\n if (!isIOS_1) {\r\n jpegUrl = generateImageFromCanvas(videoRefBg, frameDivRef, captureCanvasRef, debug);\r\n }\r\n detectCard(videoRefBg, frameDivRef, captureCanvasRef, detectionCanvas, debugCanvasLatestRef, setLatestScore, setLatestLaplacian, setBestScore, setModelState, setScanDebugState, threshold, laplacianThreshold, onError, scanCaptureBuffer, scanProgress, setScanProgress, softMaxUploads, bufferSize, videoMetadata, cardScanApi, cardIdRef, stateMachineState, stateMachineSend, jpegUrl, debug);\r\n};\r\nvar detectCard = function (videoRefBg, frameDivRef, captureCanvasRef, detectionCanvas, debugCanvasLatestRef, setLatestScore, setLatestLaplacian, setBestScore, setModelState, setScanDebugState, threshold, laplacianThreshold, onError, scanCaptureBuffer, scanProgress, setScanProgress, softMaxUploads, bufferSize, videoMetadata, cardScanApi, cardIdRef, stateMachineState, stateMachineSend, jpegUrl, debug) {\r\n DetectorWrapper\r\n .get()\r\n .predict_image(detectionCanvas)\r\n .then(function (ret) {\r\n if (ret === null) {\r\n console.debug(\"cardDetector race condition -- early exit\");\r\n return;\r\n }\r\n if (debug) {\r\n setModelState(DetectorWrapper.get().modelState);\r\n setScanDebugState(\"active\");\r\n }\r\n if (ret[\"modelClass\"] === \"card\" &&\r\n [\"autoCapture\", \"frontsideProcessing\", \"backsideProcessing\"].some(stateMachineState.matches)) {\r\n var score = Number(ret[\"modelProbability\"]);\r\n var laplacian = Number(ret[\"laplaceVariance\"]);\r\n if (debug) {\r\n setLatestScore(score);\r\n setLatestLaplacian(laplacian);\r\n renderDebugCanvas(videoRefBg, frameDivRef, debugCanvasLatestRef, debug);\r\n }\r\n // Add quality images to the buffer...\r\n if (score > threshold && laplacian > laplacianThreshold) {\r\n if (debug) {\r\n setBestScore(score);\r\n renderDebugCanvas(videoRefBg, frameDivRef, debugCanvasLatestRef, debug);\r\n }\r\n //TODO: see if this is still an issue.\r\n if (jpegUrl === undefined) {\r\n //lazy jpeg capture to workaround iOS GPU memory issue\r\n //downside is that we capture the submitted image ~10-15ms after detection but should be Ok\r\n var jpeg = generateImageFromCanvas(videoRefBg, frameDivRef, captureCanvasRef, debug);\r\n addImageToBuffer(jpeg, score, laplacian, scanCaptureBuffer, scanProgress, setScanProgress, softMaxUploads, bufferSize, videoRefBg, frameDivRef, captureCanvasRef, threshold, laplacianThreshold, videoMetadata, cardScanApi, cardIdRef, stateMachineState, onError, debug);\r\n }\r\n else {\r\n addImageToBuffer(jpegUrl, score, laplacian, scanCaptureBuffer, scanProgress, setScanProgress, softMaxUploads, bufferSize, videoRefBg, frameDivRef, captureCanvasRef, threshold, laplacianThreshold, videoMetadata, cardScanApi, cardIdRef, stateMachineState, onError, debug);\r\n }\r\n }\r\n }\r\n })\r\n .catch(function (error) {\r\n _handleError(error, stateMachineSend, onError);\r\n });\r\n};\r\nvar addImageToBuffer = function (jpegUrl, score, laplacian, scanCaptureBuffer, scanProgress, setScanProgress, softMaxUploads, bufferSize, videoRefBg, frameDivRef, captureCanvasRef, threshold, laplacianThreshold, videoMetadata, cardScanApi, cardIdRef, stateMachineState, onError, debug) {\r\n var file = dataURLtoFile(jpegUrl, \"card.jpeg\");\r\n scanCaptureBuffer.current.push({ file: file, score: score, laplacian: laplacian });\r\n var cardGuide = document.getElementsByClassName(scanFrameStyles.cardGuide)[0];\r\n //TODO: update progress UI -- a little slow to update, we could use the scanCapture buffer.\r\n if (debug) {\r\n console.log(\"CardScan: add image to buffer: \", scanProgress, new Date().toISOString());\r\n }\r\n setScanProgress(function (p) {\r\n if (p >= (softMaxUploads * bufferSize) / 2) {\r\n return p + 0.5;\r\n }\r\n else {\r\n return p + 1;\r\n }\r\n });\r\n var numScans = Math.min(Math.ceil(scanProgress), softMaxUploads * bufferSize);\r\n var cornerWidth = 62 +\r\n ((cardGuide.clientWidth - 124) / (softMaxUploads * bufferSize - 1)) *\r\n numScans;\r\n var cornerHeight = 62 +\r\n ((cardGuide.clientHeight - 124) / (softMaxUploads * bufferSize - 1)) *\r\n numScans;\r\n document.documentElement.style.setProperty(\"--cardscan-corner-height\", \"\".concat(cornerHeight, \"px\"));\r\n document.documentElement.style.setProperty(\"--cardscan-corner-width\", \"\".concat(cornerWidth, \"px\"));\r\n document.documentElement.style.setProperty(\"--cardscan-buffer-size\", numScans.toString());\r\n if (scanCaptureBuffer.current.length === bufferSize) {\r\n //pull best / least blurry image from buffer\r\n var lapScores = scanCaptureBuffer.current.map(function (i) {\r\n return Number(i.laplacian);\r\n });\r\n var maxScore = Math.max.apply(null, lapScores);\r\n var index = lapScores.indexOf(maxScore);\r\n if (debug) {\r\n console.debug(\"Current Buffer: \", scanCaptureBuffer.current);\r\n }\r\n var bestImage = scanCaptureBuffer.current[index].file;\r\n if (debug) {\r\n console.debug(\"Upload Picked: \", bestImage);\r\n }\r\n //Note: metadata might have changed between capture and upload.\r\n var metadata = generateImageMetadata(\"automatic\" /* CaptureType.automatic */, videoRefBg, frameDivRef, captureCanvasRef, threshold, laplacianThreshold, videoMetadata, debug);\r\n var scores = scanCaptureBuffer.current.map(function (i) { return ({\r\n score: i.score,\r\n laplacian: i.laplacian,\r\n }); });\r\n metadata[\"capture_score\"] = { scores: scores, max_lapScore: maxScore };\r\n uploadFile(bestImage, \"automatic\" /* CaptureType.automatic */, metadata, cardScanApi, cardIdRef, stateMachineState, debug, onError, function () {\r\n if (debug) {\r\n console.debug(\"CardScan: upload complete: \", new Date().toISOString());\r\n }\r\n });\r\n //start capture buffer here so that we start the upload timer right away\r\n scanCaptureBuffer.current = [];\r\n }\r\n};\r\nvar uploadFile = function (file, captureType, metadata, cardScanApi, cardIdRef, stateMachineState, debug, stateMachineSend, onError, cb) { return __awaiter(void 0, void 0, void 0, function () {\r\n var _a;\r\n return __generator(this, function (_b) {\r\n (_a = cardScanApi.current) === null || _a === void 0 ? void 0 : _a.uploadScanImage(file, cardIdRef.current, captureType, [\"backsideProcessing\", \"backsidePending\"].some(stateMachineState.matches)\r\n ? \"back\"\r\n : \"front\", metadata).then(function () {\r\n if (cb) {\r\n cb();\r\n }\r\n if (debug) {\r\n console.debug(\"Upload Success\");\r\n }\r\n }).catch(function (error) {\r\n _handleError(error, stateMachineSend, onError);\r\n });\r\n return [2 /*return*/];\r\n });\r\n}); };\r\n//---------------------------------------\r\n// Debug Menu\r\n//---------------------------------------\r\n//debug data to be passed in with every scan\r\nvar renderDebugCanvas = function (videoRefBg, frameDivRef, debugCanvasRef, debug) {\r\n var videoBg = videoRefBg.current;\r\n if (debug && debugCanvasRef && videoBg) {\r\n var _a = calculateGuides(videoRefBg, frameDivRef, debug), guideX = _a[0], guideY = _a[1], guideWidth = _a[2], guideHeight = _a[3];\r\n var dCanvas = debugCanvasRef.current;\r\n if (dCanvas) {\r\n var destCtx = dCanvas.getContext(\"2d\", { alpha: false });\r\n destCtx === null || destCtx === void 0 ? void 0 : destCtx.drawImage(videoBg, guideX, guideY, guideWidth, guideHeight, 0, 0, dCanvas.width, dCanvas.height);\r\n }\r\n }\r\n};\n\nvar resetCorners = function () {\r\n //reset corners before flipping\r\n document.documentElement.style.setProperty(\"--cardscan-corner-width\", \"62px\");\r\n document.documentElement.style.setProperty(\"--cardscan-corner-height\", \"62px\");\r\n};\n\n//---------------------------------------\r\n// Exit and Cleanup\r\n//---------------------------------------\r\nvar cleanUp = function (scanCaptureBuffer, setScanProgress, videoRefBg, cardScanApi) {\r\n //kill timer\r\n //setScannerRunning(false); on completed state\r\n var _a;\r\n //empty both detection buffer and clear progress UI\r\n scanCaptureBuffer.current = [];\r\n setScanProgress(0);\r\n //disable camera on exit\r\n if (videoRefBg && videoRefBg.current) {\r\n var videoBackground = videoRefBg.current;\r\n var stream = videoBackground.srcObject;\r\n if (stream) {\r\n var tracks = stream.getTracks();\r\n tracks.forEach(function (track) { return track.stop(); });\r\n videoBackground.srcObject = null;\r\n }\r\n }\r\n DetectorWrapper.cleanUp();\r\n if (cardScanApi === null || cardScanApi === void 0 ? void 0 : cardScanApi.current) {\r\n (_a = cardScanApi.current) === null || _a === void 0 ? void 0 : _a.socket.close();\r\n cardScanApi.current = null;\r\n }\r\n resetCorners();\r\n};\n\n//---------------------------------------\r\n// Websocket message handling\r\n//---------------------------------------\r\nvar webSocketHandler = function (cardScanApi, cardIdRef, onError, debug, stateMachineState, stateMachineSend, backSideSupport) {\r\n var _a;\r\n if ((_a = cardScanApi === null || cardScanApi === void 0 ? void 0 : cardScanApi.current) === null || _a === void 0 ? void 0 : _a.socket) {\r\n cardScanApi.current.socket.onopen = function () {\r\n var _a;\r\n if (debug) {\r\n console.debug(\"CardScan: Socket Successfully Opened\");\r\n }\r\n //register current card on socket creation -- check card_id length to avoid race condition.\r\n if (cardIdRef.current && cardIdRef.current.length > 0) {\r\n var payload = JSON.stringify({\r\n card_id: cardIdRef.current,\r\n action: \"register\",\r\n source: \"onopen\",\r\n });\r\n (_a = cardScanApi === null || cardScanApi === void 0 ? void 0 : cardScanApi.current) === null || _a === void 0 ? void 0 : _a.socket.send(payload);\r\n }\r\n };\r\n cardScanApi.current.socket.onclose = function (event) {\r\n console.debug(\"CardScan: websocket closed\", event);\r\n if (event.code == 1005 && event.wasClean) {\r\n console.debug(\"CardScan: websocket closed cleanly\");\r\n }\r\n else if (event.code == 1000) {\r\n console.debug(\"CardScan: websocket closed cleanly\");\r\n }\r\n else {\r\n var error = generateError(\"The connection was closed abnormally\", \"WSError\", event.code);\r\n _handleError(error, stateMachineSend, onError, stateMachineState);\r\n }\r\n };\r\n cardScanApi.current.socket.onerror = function (event) {\r\n var error;\r\n if (stateMachineState.context.httpCode == 403) {\r\n error = generateError(stateMachineState.context.httpMessage, \"WSError\", 403);\r\n }\r\n else {\r\n error = generateError(\"Unknown error from websocket\", \"WSError\", 642);\r\n }\r\n _handleError(error, stateMachineSend, onError, stateMachineState);\r\n };\r\n cardScanApi.current.socket.onmessage = function (event) {\r\n //early exit for keepalive\r\n if (event.data == \"pong\") {\r\n return;\r\n }\r\n var _type = \"\";\r\n try {\r\n var type = JSON.parse(event.data).type;\r\n _type = type;\r\n }\r\n catch (error) {\r\n console.log(\"CardScan: Unable to parse event received from websocket\");\r\n console.debug(event);\r\n }\r\n if (_type == \"card\") {\r\n var _a = JSON.parse(event.data), state = _a.state, details = _a.details, error = _a.error, card_id = _a.card_id;\r\n var cardState = state;\r\n console.debug(\"Card Event Received: cardId: \".concat(card_id, \" card_state:\").concat(cardState, \" - ui_status:\").concat(stateMachineState.value, \" - \").concat(new Date().toISOString()));\r\n if (debug && details) {\r\n console.debug(\"CardScan: socket event received with\", details);\r\n }\r\n stateMachineSend(\"card.\".concat(cardState), { card_id: card_id, backSideSupport: backSideSupport });\r\n }\r\n else if (_type == \"scan\") {\r\n var _b = JSON.parse(event.data), state = _b.state, error = _b.error, scan_id = _b.scan_id, card_id = _b.card_id;\r\n var scanState = state;\r\n // If we receive a skipped card error,\r\n // and we are in an error state or cameraError state\r\n // and the card is in completed state\r\n // we need to transition to completed state\r\n // This is a workaround for when we use web-to-mobile handoff\r\n // and the user completes the scan on mobile\r\n // the desktop widget will receive the completed message\r\n if (error &&\r\n error.error === \"SkippedCard\" &&\r\n error.message ===\r\n \"Skipping scan for card received in completed state\" &&\r\n [\"error\", \"cameraError\"].some(stateMachineState.matches)) {\r\n stateMachineSend(\"card.completed\");\r\n }\r\n console.debug(\"Scan Event Received: scanId: \".concat(scan_id, \" scan_state:\").concat(scanState, \" cardId: \").concat(card_id, \" - ui_status:\").concat(stateMachineState.value, \" - \").concat(new Date().toISOString()));\r\n stateMachineSend(\"scan.\".concat(scanState), { card_id: card_id, scan_id: scan_id });\r\n }\r\n else {\r\n console.log(\"CardScan: Unknown event received from websocket\");\r\n console.debug(event);\r\n }\r\n };\r\n }\r\n else {\r\n var error = generateError(\"No websocket found - critical failure\", \"WSError\", 640);\r\n _handleError(error, stateMachineSend, onError, stateMachineState);\r\n }\r\n};\n\nvar css_248z$1 = \".scanview-module_cardscanMain__JjW3i{align-items:center;background-color:var(--cardscan-widget-background-color);box-sizing:border-box;display:flex;font-family:HK Grotesk Pro,-apple-system,BlinkMacSystemFont,Segoe UI,Roboto,Oxygen,Ubuntu,Cantarell,Open Sans,Helvetica Neue,sans-serif;font-size:17px;height:-webkit-fill-available;height:var(--cardscan-app-height);justify-content:center;line-height:1.5;max-height:100%;max-width:100%;overflow:hidden;position:relative;width:var(--cardscan-app-width)}.scanview-module_cardscanVideoContainer__PK-Ea{position:relative}.scanview-module_cameraBtn__87nOC{cursor:pointer;left:50%;position:absolute;transform:translate(-50%,-12px);width:55px;z-index:3}.scanview-module_cameraBtn__87nOC.scanview-module_heightFrame__k92qj{bottom:40px;transform:translate(-50%)}.scanview-module_cameraBtn__87nOC:active{transform:translate(-49%,-11px)}.scanview-module_cameraBtn__87nOC:active.scanview-module_heightFrame__k92qj{transform:translate(-49%,1px)}.scanview-module_cardscanLogo__T3S98{box-sizing:border-box;left:4px;max-width:135px;position:absolute;top:0;transform:translateY(-100%);z-index:300}.scanview-module_cardscanLogoLandscape__LkARY{-webkit-filter:invert(100%);filter:invert(100%);max-width:90px}\\n/*# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbInNjYW52aWV3Lm1vZHVsZS5zY3NzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLHFDQU9FLGtCQUFtQixDQU1uQix3REFBeUQsQ0FaekQscUJBQXNCLENBS3RCLFlBQWEsQ0FGYix1SUFBMEosQ0FGMUosY0FBZSxDQU9mLDZCQUE4QixDQUM5QixpQ0FBa0MsQ0FGbEMsc0JBQXVCLENBTHZCLGVBQWdCLENBV2hCLGVBQWdCLENBQ2hCLGNBQWUsQ0FIZixlQUFnQixDQVBoQixpQkFBa0IsQ0FNbEIsK0JBS0YsQ0FFQSwrQ0FDRSxpQkFDRixDQUVBLGtDQUVFLGNBQWUsQ0FFZixRQUFTLENBSFQsaUJBQWtCLENBSWxCLCtCQUFpQyxDQUNqQyxVQUFXLENBSFgsU0FJRixDQUNBLHFFQUVFLFdBQVksQ0FEWix5QkFFRixDQUVBLHlDQUNFLCtCQUNGLENBQ0EsNEVBQ0UsNkJBQ0YsQ0FFQSxxQ0FNRSxxQkFBc0IsQ0FIdEIsUUFBUyxDQUlULGVBQWdCLENBTmhCLGlCQUFrQixDQUdsQixLQUFNLENBQ04sMkJBQTRCLENBSDVCLFdBTUYsQ0FFQSw4Q0FFRSwyQkFBNEIsQ0FDNUIsbUJBQW9CLENBRnBCLGNBR0YiLCJmaWxlIjoic2NhbnZpZXcubW9kdWxlLnNjc3MiLCJzb3VyY2VzQ29udGVudCI6WyIuY2FyZHNjYW5NYWluIHtcbiAgYm94LXNpemluZzogYm9yZGVyLWJveDtcbiAgZm9udC1zaXplOiAxN3B4O1xuICBsaW5lLWhlaWdodDogMS41O1xuICBmb250LWZhbWlseTogXCJISyBHcm90ZXNrIFByb1wiLCAtYXBwbGUtc3lzdGVtLCBCbGlua01hY1N5c3RlbUZvbnQsIFwiU2Vnb2UgVUlcIiwgUm9ib3RvLCBPeHlnZW4sIFVidW50dSwgQ2FudGFyZWxsLCBcIk9wZW4gU2Fuc1wiLCBcIkhlbHZldGljYSBOZXVlXCIsIHNhbnMtc2VyaWY7XG4gIHBvc2l0aW9uOiByZWxhdGl2ZTtcbiAgZGlzcGxheTogZmxleDtcbiAgYWxpZ24taXRlbXM6IGNlbnRlcjtcbiAganVzdGlmeS1jb250ZW50OiBjZW50ZXI7XG4gIGhlaWdodDogLXdlYmtpdC1maWxsLWF2YWlsYWJsZTtcbiAgaGVpZ2h0OiB2YXIoLS1jYXJkc2Nhbi1hcHAtaGVpZ2h0KTtcbiAgd2lkdGg6IHZhcigtLWNhcmRzY2FuLWFwcC13aWR0aCk7XG4gIG92ZXJmbG93OiBoaWRkZW47XG4gIGJhY2tncm91bmQtY29sb3I6IHZhcigtLWNhcmRzY2FuLXdpZGdldC1iYWNrZ3JvdW5kLWNvbG9yKTtcbiAgbWF4LWhlaWdodDogMTAwJTtcbiAgbWF4LXdpZHRoOiAxMDAlO1xufVxuXG4uY2FyZHNjYW5WaWRlb0NvbnRhaW5lciB7XG4gIHBvc2l0aW9uOiByZWxhdGl2ZTtcbn1cblxuLmNhbWVyYUJ0biB7XG4gIHBvc2l0aW9uOiBhYnNvbHV0ZTtcbiAgY3Vyc29yOiBwb2ludGVyO1xuICB6LWluZGV4OiAzO1xuICBsZWZ0OiA1MCU7XG4gIHRyYW5zZm9ybTogdHJhbnNsYXRlKC01MCUsIC0xMnB4KTtcbiAgd2lkdGg6IDU1cHg7XG59XG4uY2FtZXJhQnRuLmhlaWdodEZyYW1lIHtcbiAgdHJhbnNmb3JtOiB0cmFuc2xhdGUoLTUwJSwgMCk7XG4gIGJvdHRvbTogNDBweDtcbn1cblxuLmNhbWVyYUJ0bjphY3RpdmUge1xuICB0cmFuc2Zvcm06IHRyYW5zbGF0ZSgtNDklLCAtMTFweCk7XG59XG4uY2FtZXJhQnRuOmFjdGl2ZS5oZWlnaHRGcmFtZSB7XG4gIHRyYW5zZm9ybTogdHJhbnNsYXRlKC00OSUsIDFweCk7XG59XG5cbi5jYXJkc2NhbkxvZ28ge1xuICBwb3NpdGlvbjogYWJzb2x1dGU7XG4gIHotaW5kZXg6IDMwMDtcbiAgbGVmdDogNHB4O1xuICB0b3A6IDA7XG4gIHRyYW5zZm9ybTogdHJhbnNsYXRlWSgtMTAwJSk7XG4gIGJveC1zaXppbmc6IGJvcmRlci1ib3g7XG4gIG1heC13aWR0aDogMTM1cHg7XG59XG5cbi5jYXJkc2NhbkxvZ29MYW5kc2NhcGUge1xuICBtYXgtd2lkdGg6IDkwcHg7XG4gIC13ZWJraXQtZmlsdGVyOiBpbnZlcnQoMTAwJSk7XG4gIGZpbHRlcjogaW52ZXJ0KDEwMCUpO1xufSJdfQ== */\";\nvar styles$1 = {\"cardscanMain\":\"scanview-module_cardscanMain__JjW3i\",\"cardscanVideoContainer\":\"scanview-module_cardscanVideoContainer__PK-Ea\",\"cameraBtn\":\"scanview-module_cameraBtn__87nOC\",\"heightFrame\":\"scanview-module_heightFrame__k92qj\",\"cardscanLogo\":\"scanview-module_cardscanLogo__T3S98\",\"cardscanLogoLandscape\":\"scanview-module_cardscanLogoLandscape__LkARY\"};\nstyleInject(css_248z$1);\n\nvar CardScanView = function (_a) {\r\n var _b, _c, _d, _e, _f, _g;\r\n var debug = _a.debug, live = _a.live, sessionToken = _a.sessionToken, onSuccess = _a.onSuccess, onCancel = _a.onCancel, onError = _a.onError, onRetry = _a.onRetry; _a.shouldRetry; var backsideSupport = _a.backsideSupport, requiredFields = _a.requiredFields, optionalFields = _a.optionalFields, eligibility = _a.eligibility, _h = _a.messages, messages = _h === void 0 ? {} : _h, closeButton = _a.closeButton, successIndicator = _a.successIndicator, errorIndicator = _a.errorIndicator, indicatorOptions = _a.indicatorOptions, enableCameraPermissionModal = _a.enableCameraPermissionModal, autoSwitchActiveColor = _a.autoSwitchActiveColor, autoSwitchInactiveColor = _a.autoSwitchInactiveColor, progressBarColor = _a.progressBarColor, widgetBackgroundColor = _a.widgetBackgroundColor, messageFontSize = _a.messageFontSize, messageTextColor = _a.messageTextColor, messageBackgroundColor = _a.messageBackgroundColor, webToMobileHandoffConfig = _a.webToMobileHandoffConfig;\r\n //video, detection and image capture canvas\r\n var videoRefBg = useRef(null);\r\n var detectionCanvasRef = useRef(null);\r\n var captureCanvasRef = useRef(null);\r\n var _j = useRect(), frameDivRefRect = _j[0], frameDivRef = _j[1];\r\n var isLandscape = useMobileOrientation_1().isLandscape;\r\n var isMobileOnLandscape = isLandscape && isMobile_1;\r\n var cardScanApi = useRef(null);\r\n //TODO: remove this and move to state machine?\r\n var cardIdRef = useRef(\"\");\r\n if (sessionToken && !cardScanApi.current) {\r\n cardScanApi.current = new CardScanApi({\r\n sessionToken: sessionToken,\r\n live: live || false,\r\n });\r\n }\r\n // Update user UI\r\n var _k = useState(false), showCurtain = _k[0], setShowCurtain = _k[1];\r\n var _l = useState(false), showErrorModal = _l[0], setShowErrorModal = _l[1];\r\n var messageState = useState(__assign$2(__assign$2({}, defaultMessages), messages))[0];\r\n var spinnerOptions = useState(__assign$2(__assign$2({}, defaultIndicatorOptions), indicatorOptions))[0];\r\n var _m = useMachine(scanViewStateMachine, {\r\n context: {\r\n messageState: messageState,\r\n },\r\n }), stateMachineState = _m[0], stateMachineSend = _m[1], stateMachineService = _m[2];\r\n // Buffer for storing scan_id of sent images.\r\n var _o = useState(0.0), scanProgress = _o[0], setScanProgress = _o[1];\r\n // Also set server side for max successful scans.\r\n var softMaxUploads = 12;\r\n // Card detection parameters & metadata\r\n var _p = useState(0.9), threshold = _p[0], setThreshold = _p[1];\r\n var _q = useState(0.01), laplacianThreshold = _q[0], setLaplacianThreshold = _q[1];\r\n var defaultScanFrequency = 250;\r\n var _r = useState(defaultScanFrequency), scanFreqency = _r[0], setScanFreqency = _r[1];\r\n // state to save timestamp of last WS ping\r\n var pingFrequency = 6500;\r\n var _s = useState(new Date()), lastPing = _s[0], setLastPing = _s[1];\r\n var _t = useState({}), videoMetadata = _t[0], setVideoMetadata = _t[1];\r\n // Short lived buffer for storing scan images before upload\r\n var _u = useBufferSize(4), bufferSize = _u[0], setBufferSize = _u[1];\r\n var scanCaptureBuffer = useRef([]);\r\n //debug options\r\n var _v = useState(0.0), latestScore = _v[0], setLatestScore = _v[1];\r\n var _w = useState(0.0), latestLaplacian = _w[0], setLatestLaplacian = _w[1];\r\n var _x = useState(0.0), bestScore = _x[0], setBestScore = _x[1];\r\n var debugCanvasBestRef = useRef(null);\r\n var debugCanvasLatestRef = useRef(null);\r\n var _y = useState(\"\"), modelState = _y[0], setModelState = _y[1];\r\n var _z = useState(\"\"), scanDebugState = _z[0], setScanDebugState = _z[1];\r\n useVideoSizes(videoRefBg, setShowCurtain, stateMachineState);\r\n var videoWidth = ((_b = videoRefBg === null || videoRefBg === void 0 ? void 0 : videoRefBg.current) === null || _b === void 0 ? void 0 : _b.videoWidth)\r\n ? (_c = videoRefBg === null || videoRefBg === void 0 ? void 0 : videoRefBg.current) === null || _c === void 0 ? void 0 : _c.videoWidth\r\n : 500;\r\n var videoHeight = ((_d = videoRefBg === null || videoRefBg === void 0 ? void 0 : videoRefBg.current) === null || _d === void 0 ? void 0 : _d.videoHeight)\r\n ? (_e = videoRefBg === null || videoRefBg === void 0 ? void 0 : videoRefBg.current) === null || _e === void 0 ? void 0 : _e.videoHeight\r\n : 500;\r\n var totalPixels = videoWidth * videoHeight;\r\n if (totalPixels <= 786432) {\r\n //1024*768 -> 90%\r\n videoHeight = 0.9 * videoHeight;\r\n videoWidth = 0.9 * videoWidth;\r\n }\r\n else {\r\n // > 1024*768 -> 50%\r\n videoHeight = 0.5 * videoHeight;\r\n videoWidth = 0.5 * videoWidth;\r\n }\r\n var videoLayoutHeight = ((_g = (_f = videoRefBg === null || videoRefBg === void 0 ? void 0 : videoRefBg.current) === null || _f === void 0 ? void 0 : _f.getBoundingClientRect()) === null || _g === void 0 ? void 0 : _g.height) || 0;\r\n videoLayoutHeight =\r\n videoLayoutHeight > videoHeight ? videoHeight : videoLayoutHeight;\r\n useLayoutHeight(videoRefBg, stateMachineState.matches(\"cameraLoading\"), videoLayoutHeight);\r\n useCustomWidget(autoSwitchActiveColor, autoSwitchInactiveColor, progressBarColor, widgetBackgroundColor, messageFontSize, messageTextColor, messageBackgroundColor);\r\n //This is the main scanning loop and is enabled once the video has loaded.\r\n //Toggable with setScannerRunning & loop duration is set via scanFrequency.\r\n useInterval(function () {\r\n scanHandler(videoRefBg, frameDivRef, captureCanvasRef, detectionCanvasRef, debugCanvasLatestRef, setLatestScore, setLatestLaplacian, setBestScore, setModelState, setScanDebugState, setScanProgress, scanCaptureBuffer, threshold, laplacianThreshold, onError, scanProgress, softMaxUploads, bufferSize, videoMetadata, cardScanApi, cardIdRef, stateMachineState, stateMachineSend, debug);\r\n wsPing(); //this should be moved to a separate interval\r\n }, stateMachineState.context.scannerRunning ? scanFreqency : null);\r\n useEffect(function () {\r\n webSocketHandler(cardScanApi, cardIdRef, onError, debug, stateMachineState, stateMachineSend, backsideSupport);\r\n }, [cardScanApi, stateMachineState, stateMachineSend, stateMachineService]);\r\n //TODO: find a way to reset states more clearly\r\n useEffect(function () {\r\n var subscription = stateMachineService.subscribe(function (state) {\r\n var _a;\r\n if (state.matches(\"completed\")) {\r\n (_a = cardScanApi === null || cardScanApi === void 0 ? void 0 : cardScanApi.current) === null || _a === void 0 ? void 0 : _a.getCard(cardIdRef.current).then(function (res) {\r\n var card = new Card(res.data);\r\n onSuccess(card);\r\n });\r\n cleanUp(scanCaptureBuffer, setScanProgress, videoRefBg, cardScanApi);\r\n }\r\n //reset before moving to backside\r\n if (state.matches(\"backsidePending\")) {\r\n scanCaptureBuffer.current = [];\r\n setScanProgress(0);\r\n resetCorners();\r\n }\r\n // on toggle\r\n if (state.context.toggledAutoManual &&\r\n [\"autoCapture\", \"manualCapture\"].some(state.matches)) {\r\n scanCaptureBuffer.current = [];\r\n setScanProgress(0);\r\n document.documentElement.style.setProperty(\"--cardscan-buffer-size\", \"0\");\r\n setScanFreqency(defaultScanFrequency);\r\n }\r\n });\r\n return subscription.unsubscribe;\r\n }, [stateMachineService]);\r\n useEffect(function () {\r\n var _a;\r\n //de-dupe this or make it lazy.\r\n //creating and saving card_id.\r\n (_a = cardScanApi.current) === null || _a === void 0 ? void 0 : _a.createCard(backsideSupport, requiredFields, optionalFields, eligibility).then(function (response) {\r\n var _a, _b;\r\n cardIdRef.current = response.data.card_id;\r\n console.debug(\"Setting Card ID\", cardIdRef.current);\r\n //register socket on card creation\r\n if (((_a = cardScanApi === null || cardScanApi === void 0 ? void 0 : cardScanApi.current) === null || _a === void 0 ? void 0 : _a.socket) &&\r\n ((_b = cardScanApi === null || cardScanApi === void 0 ? void 0 : cardScanApi.current) === null || _b === void 0 ? void 0 : _b.socket.readyState) == 1) {\r\n // 1 is open\r\n var payload = JSON.stringify({\r\n card_id: response.data.card_id,\r\n action: \"register\",\r\n source: \"startup\",\r\n });\r\n cardScanApi.current.socket.send(payload);\r\n }\r\n }).catch(function (error) {\r\n _handleError(error, stateMachineSend, onError);\r\n });\r\n }, [cardScanApi, stateMachineSend]);\r\n useEffect(function () {\r\n //TODO: move this - make into a cleanup state?\r\n window.onpopstate = function () {\r\n cleanUp(scanCaptureBuffer, setScanProgress, videoRefBg, cardScanApi);\r\n };\r\n if (debug) {\r\n setModelState(DetectorWrapper.get().modelState);\r\n DetectorWrapper.get().debug = true;\r\n }\r\n }, [debug]);\r\n //TODO: move this into cardScanApi w/ own timer and toggle on/off?\r\n var wsPing = function () {\r\n var _a;\r\n var now = new Date();\r\n var ms = lastPing.getTime();\r\n if ([\"completed\", \"error\"].some(stateMachineState.matches)) {\r\n return;\r\n }\r\n if (now.getTime() - ms < pingFrequency) {\r\n return;\r\n }\r\n if (((_a = cardScanApi === null || cardScanApi === void 0 ? void 0 : cardScanApi.current) === null || _a === void 0 ? void 0 : _a.socket) &&\r\n cardScanApi.current.socket.readyState == 1) {\r\n cardScanApi.current.socket.send(\"ping\");\r\n setLastPing(now);\r\n }\r\n };\r\n //---------------------------------------\r\n // UI Interaction handlers\r\n //---------------------------------------\r\n //TODO: most of this could be reduced to state machine (but need to add retry state -> autocapture)\r\n var handleRetryButton = function () {\r\n //sanity check we're in retry mode.\r\n var _a;\r\n //empty both detection buffer and clear progress UI\r\n scanCaptureBuffer.current = [];\r\n setScanProgress(0);\r\n document.documentElement.style.setProperty(\"--cardscan-buffer-size\", \"0\");\r\n var video = videoRefBg.current;\r\n if (video === null || video === void 0 ? void 0 : video.paused) {\r\n video === null || video === void 0 ? void 0 : video.play();\r\n }\r\n //reset state.\r\n stateMachineSend(\"retry_scan\");\r\n setScanFreqency(defaultScanFrequency);\r\n cardIdRef.current = \"\";\r\n if (onRetry) {\r\n onRetry();\r\n }\r\n //de-dupe this\r\n (_a = cardScanApi.current) === null || _a === void 0 ? void 0 : _a.createCard(backsideSupport, requiredFields, optionalFields, eligibility).then(function (response) {\r\n var _a;\r\n cardIdRef.current = response.data.card_id;\r\n //register socket on card creation\r\n if ((_a = cardScanApi === null || cardScanApi === void 0 ? void 0 : cardScanApi.current) === null || _a === void 0 ? void 0 : _a.socket) {\r\n var payload = JSON.stringify({\r\n card_id: response.data.card_id,\r\n action: \"register\",\r\n source: \"retry\",\r\n });\r\n cardScanApi.current.socket.send(payload);\r\n }\r\n //needs to implement another state coming to \"retry\"\r\n stateMachineSend(\"retry_scan\");\r\n }).catch(function (error) {\r\n _handleError(error, stateMachineSend, onError);\r\n });\r\n };\r\n var onCloseBtn = function () {\r\n if (onCancel) {\r\n onCancel();\r\n }\r\n };\r\n //---------------------------------------\r\n // Rendering\r\n //---------------------------------------\r\n return (jsxs(MyGlobalContext.Provider, __assign$2({ value: {\r\n debug: debug,\r\n modelState: modelState,\r\n scanDebugState: scanDebugState,\r\n threshold: threshold,\r\n setThreshold: setThreshold,\r\n laplacianThreshold: laplacianThreshold,\r\n setLaplacianThreshold: setLaplacianThreshold,\r\n scanFreqency: scanFreqency,\r\n setScanFreqency: setScanFreqency,\r\n bufferSize: bufferSize,\r\n setBufferSize: setBufferSize,\r\n bufferRef: scanCaptureBuffer,\r\n debugCanvasBestRef: debugCanvasBestRef,\r\n bestScore: bestScore,\r\n debugCanvasLatestRef: debugCanvasLatestRef,\r\n latestScore: latestScore,\r\n latestLaplacian: latestLaplacian,\r\n showCurtain: showCurtain,\r\n onCloseBtn: onCloseBtn,\r\n closeButton: closeButton,\r\n isMobile: isMobile_1,\r\n isMobileOnLandscape: isMobileOnLandscape,\r\n stateMachineState: stateMachineState,\r\n stateMachineSend: stateMachineSend,\r\n stateMachineService: stateMachineService,\r\n } }, { children: [jsx(CameraPermissionModal, { enableModel: showErrorModal &&\r\n enableCameraPermissionModal &&\r\n (!(webToMobileHandoffConfig === null || webToMobileHandoffConfig === void 0 ? void 0 : webToMobileHandoffConfig.enabled) || isMobile_1) }), jsx(WebToMobileModal, { enableModel: showErrorModal &&\r\n !isMobile_1 &&\r\n !enableCameraPermissionModal &&\r\n (webToMobileHandoffConfig === null || webToMobileHandoffConfig === void 0 ? void 0 : webToMobileHandoffConfig.enabled) !== undefined\r\n ? webToMobileHandoffConfig === null || webToMobileHandoffConfig === void 0 ? void 0 : webToMobileHandoffConfig.enabled\r\n : false, cardScanApi: cardScanApi, webToMobileHandoffConfig: webToMobileHandoffConfig, spinnerOptions: spinnerOptions }), jsxs(\"div\", __assign$2({ className: styles$1.cardscanMain }, { children: [jsx(DebugMenu, {}), jsx(CardCapture, { children: jsxs(\"div\", __assign$2({ className: styles$1.cardscanVideoContainer }, { children: [jsx(ScanVideoViewer, { videoRef: videoRefBg, setShowErrorModal: setShowErrorModal, stateMachineSend: stateMachineSend, setScanDebugState: setScanDebugState, onError: onError, captureCanvasRef: captureCanvasRef, setVideoMetadata: setVideoMetadata, isMobile: isMobile_1 }), stateMachineState.matches(\"cameraLoading\") ? (jsx(\"div\", __assign$2({ className: \"spinner-wrapper\" }, { children: jsx(dist, __assign$2({}, spinnerOptions)) }))) : (jsx(ScanFrame, { successIndicator: successIndicator, errorIndicator: errorIndicator, handleRetryButton: handleRetryButton, frameDivRef: frameDivRef, spinnerOptions: spinnerOptions, webToMobileHandoffConfig: webToMobileHandoffConfig, cardScanApi: cardScanApi })), !showCurtain && !stateMachineState.matches(\"cameraLoading\") && (jsxs(Fragment, { children: [!showErrorModal && !(webToMobileHandoffConfig === null || webToMobileHandoffConfig === void 0 ? void 0 : webToMobileHandoffConfig.enabled) && (jsx(\"img\", { \"data-cy\": \"cardscanLogo\", src: CardScanLogoURL, className: styles$1.cardscanLogo, style: {\r\n bottom: 0,\r\n top: \"unset\",\r\n transform: \"translate(-5px, -4px)\",\r\n } })), !stateMachineState.context.autoScan &&\r\n !stateMachineState.context.processing && (jsx(\"img\", { \"data-cy\": \"cameraBtn\", src: img, className: styles$1.cameraBtn, onClick: function () { return stateMachineSend(\"MANUAL_BUTTON_CLICK\"); }, style: { bottom: 0 } }))] }))] })) })] })), jsx(ScanCanvas, { captureCanvasRef: captureCanvasRef, detectionCanvasRef: detectionCanvasRef, frameDivDimensions: frameDivRefRect, frameDivRef: frameDivRef, videoRefBg: videoRefBg, videoHeight: videoHeight, videoWidth: videoWidth })] })));\r\n};\n\nvar css_248z = \".scanErrorWrapper-module_scanErrorBar__Vz8hg{background:#ffe0e0;border:1px solid #a33a3a;color:#ba3939;margin:10px;padding:10px}\\n/*# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbInNjYW5FcnJvcldyYXBwZXIubW9kdWxlLnNjc3MiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsNkNBSUUsa0JBQW1CLENBQ25CLHdCQUF5QixDQUZ6QixhQUFjLENBRGQsV0FBWSxDQURaLFlBS0YiLCJmaWxlIjoic2NhbkVycm9yV3JhcHBlci5tb2R1bGUuc2NzcyIsInNvdXJjZXNDb250ZW50IjpbIi5zY2FuRXJyb3JCYXIge1xuICBwYWRkaW5nOiAxMHB4O1xuICBtYXJnaW46IDEwcHg7XG4gIGNvbG9yOiAjYmEzOTM5O1xuICBiYWNrZ3JvdW5kOiAjZmZlMGUwO1xuICBib3JkZXI6IDFweCBzb2xpZCAjYTMzYTNhO1xufSJdfQ== */\";\nvar styles = {\"scanErrorBar\":\"scanErrorWrapper-module_scanErrorBar__Vz8hg\"};\nstyleInject(css_248z);\n\n// Check if there is a valid token\r\nvar ScanErrorWrapper = function (_a) {\r\n var sessionToken = _a.sessionToken, children = _a.children;\r\n return !sessionToken || sessionToken.length == 0 ? (jsx(\"div\", __assign$2({ \"data-cy\": \"scanErrorBar\", className: styles.scanErrorBar }, { children: \"A Session Token is needed to continue.\" }))) : (jsx(\"div\", { children: children }));\r\n};\n\nvar App = function (_a) {\r\n var _b = _a.debug, debug = _b === void 0 ? false : _b, _c = _a.live, live = _c === void 0 ? false : _c, sessionToken = _a.sessionToken, onSuccess = _a.onSuccess, onCancel = _a.onCancel, onError = _a.onError, messages = _a.messages, _d = _a.backsideSupport, backsideSupport = _d === void 0 ? false : _d, eligibility = _a.eligibility, _e = _a.indicatorOptions, indicatorOptions = _e === void 0 ? {} : _e, _f = _a.enableCameraPermissionModal, enableCameraPermissionModal = _f === void 0 ? true : _f, closeButton = _a.closeButton, successIndicator = _a.successIndicator, errorIndicator = _a.errorIndicator, autoSwitchActiveColor = _a.autoSwitchActiveColor, autoSwitchInactiveColor = _a.autoSwitchInactiveColor, progressBarColor = _a.progressBarColor, widgetBackgroundColor = _a.widgetBackgroundColor, messageFontSize = _a.messageFontSize, messageTextColor = _a.messageTextColor, messageBackgroundColor = _a.messageBackgroundColor, _g = _a.webToMobileHandoffConfig, webToMobileHandoffConfig = _g === void 0 ? {\r\n enabled: false,\r\n urlBase: live\r\n ? \"https://capture.cardscan.ai\"\r\n : \"https://sandbox-capture.cardscan.ai\",\r\n companyName: \"CardScanHealth\",\r\n } : _g;\r\n return (jsx(ScanErrorWrapper, __assign$2({ sessionToken: sessionToken }, { children: jsx(CardScanView, { live: live, debug: debug, sessionToken: sessionToken, onSuccess: onSuccess, onCancel: onCancel, onError: onError, messages: messages, backsideSupport: backsideSupport, eligibility: eligibility, indicatorOptions: indicatorOptions, enableCameraPermissionModal: enableCameraPermissionModal, closeButton: closeButton, successIndicator: successIndicator, errorIndicator: errorIndicator, autoSwitchActiveColor: autoSwitchActiveColor, autoSwitchInactiveColor: autoSwitchInactiveColor, progressBarColor: progressBarColor, widgetBackgroundColor: widgetBackgroundColor, messageFontSize: messageFontSize, messageTextColor: messageTextColor, messageBackgroundColor: messageBackgroundColor, webToMobileHandoffConfig: webToMobileHandoffConfig }) })));\r\n};\r\nApp.propTypes = {\r\n debug: PropTypes.bool,\r\n live: PropTypes.bool,\r\n sessionToken: PropTypes.string.isRequired,\r\n onSuccess: PropTypes.func.isRequired,\r\n onCancel: PropTypes.func,\r\n onError: PropTypes.func,\r\n enableCameraPermissionModal: PropTypes.bool,\r\n backsideSupport: PropTypes.bool,\r\n webToMobileHandoffConfig: PropTypes.shape({}),\r\n};\r\nApp.defaultProps = {\r\n enableCameraPermissionModal: true,\r\n webToMobileHandoffConfig: {\r\n enabled: false,\r\n urlBase: \"capture.cardscan.ai\",\r\n companyName: \"CardScanHealth\",\r\n },\r\n};\n\nexport { CardScanApi, CardScanModel, App as CardScanView, CardState };\n//# sourceMappingURL=index.es.js.map\n","(function (global, factory) {\n typeof exports === 'object' && typeof module !== 'undefined' ? factory(exports, require('@googlemaps/js-api-loader'), require('react')) :\n typeof define === 'function' && define.amd ? define(['exports', '@googlemaps/js-api-loader', 'react'], factory) :\n (global = typeof globalThis !== 'undefined' ? globalThis : global || self, factory(global.Loader = {}, global.jsApiLoader, global.React));\n})(this, (function (exports, jsApiLoader, React) { 'use strict';\n\n function _interopDefaultLegacy (e) { return e && typeof e === 'object' && 'default' in e ? e : { 'default': e }; }\n\n var React__default = /*#__PURE__*/_interopDefaultLegacy(React);\n\n /**\n * Copyright 2021 Google LLC. All Rights Reserved.\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at.\n *\n * Http://www.apache.org/licenses/LICENSE-2.0.\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n exports.Status = void 0;\n (function (Status) {\n Status[\"LOADING\"] = \"LOADING\";\n Status[\"FAILURE\"] = \"FAILURE\";\n Status[\"SUCCESS\"] = \"SUCCESS\";\n })(exports.Status || (exports.Status = {}));\n /**\n * A component to wrap the loading of the Google Maps JavaScript API.\n *\n * ```\n * import { Wrapper } from '@googlemaps/react-wrapper';\n *\n * const MyApp = () => (\n * \t\n * \t\t\n * \t\n * );\n * ```\n *\n * @param props\n */\n const Wrapper = ({ children, render, callback, ...options }) => {\n const [status, setStatus] = React.useState(exports.Status.LOADING);\n React.useEffect(() => {\n const loader = new jsApiLoader.Loader(options);\n const setStatusAndExecuteCallback = (status) => {\n if (callback)\n callback(status, loader);\n setStatus(status);\n };\n setStatusAndExecuteCallback(exports.Status.LOADING);\n loader.load().then(() => setStatusAndExecuteCallback(exports.Status.SUCCESS), () => setStatusAndExecuteCallback(exports.Status.FAILURE));\n }, []);\n if (status === exports.Status.SUCCESS && children)\n return React__default[\"default\"].createElement(React__default[\"default\"].Fragment, null, children);\n if (render)\n return render(status);\n return React__default[\"default\"].createElement(React__default[\"default\"].Fragment, null);\n };\n\n exports.Wrapper = Wrapper;\n\n Object.defineProperty(exports, '__esModule', { value: true });\n\n}));\n","import { useState, useEffect } from 'react';\n\nfunction _defineProperty(obj, key, value) {\n if (key in obj) {\n Object.defineProperty(obj, key, {\n value: value,\n enumerable: true,\n configurable: true,\n writable: true\n });\n } else {\n obj[key] = value;\n }\n\n return obj;\n}\n\nfunction ownKeys(object, enumerableOnly) {\n var keys = Object.keys(object);\n\n if (Object.getOwnPropertySymbols) {\n var symbols = Object.getOwnPropertySymbols(object);\n if (enumerableOnly) symbols = symbols.filter(function (sym) {\n return Object.getOwnPropertyDescriptor(object, sym).enumerable;\n });\n keys.push.apply(keys, symbols);\n }\n\n return keys;\n}\n\nfunction _objectSpread2(target) {\n for (var i = 1; i < arguments.length; i++) {\n var source = arguments[i] != null ? arguments[i] : {};\n\n if (i % 2) {\n ownKeys(Object(source), true).forEach(function (key) {\n _defineProperty(target, key, source[key]);\n });\n } else if (Object.getOwnPropertyDescriptors) {\n Object.defineProperties(target, Object.getOwnPropertyDescriptors(source));\n } else {\n ownKeys(Object(source)).forEach(function (key) {\n Object.defineProperty(target, key, Object.getOwnPropertyDescriptor(source, key));\n });\n }\n }\n\n return target;\n}\n\nfunction _objectWithoutPropertiesLoose(source, excluded) {\n if (source == null) return {};\n var target = {};\n var sourceKeys = Object.keys(source);\n var key, i;\n\n for (i = 0; i < sourceKeys.length; i++) {\n key = sourceKeys[i];\n if (excluded.indexOf(key) >= 0) continue;\n target[key] = source[key];\n }\n\n return target;\n}\n\nfunction _objectWithoutProperties(source, excluded) {\n if (source == null) return {};\n\n var target = _objectWithoutPropertiesLoose(source, excluded);\n\n var key, i;\n\n if (Object.getOwnPropertySymbols) {\n var sourceSymbolKeys = Object.getOwnPropertySymbols(source);\n\n for (i = 0; i < sourceSymbolKeys.length; i++) {\n key = sourceSymbolKeys[i];\n if (excluded.indexOf(key) >= 0) continue;\n if (!Object.prototype.propertyIsEnumerable.call(source, key)) continue;\n target[key] = source[key];\n }\n }\n\n return target;\n}\n\nfunction _slicedToArray(arr, i) {\n return _arrayWithHoles(arr) || _iterableToArrayLimit(arr, i) || _unsupportedIterableToArray(arr, i) || _nonIterableRest();\n}\n\nfunction _arrayWithHoles(arr) {\n if (Array.isArray(arr)) return arr;\n}\n\nfunction _iterableToArrayLimit(arr, i) {\n if (typeof Symbol === \"undefined\" || !(Symbol.iterator in Object(arr))) return;\n var _arr = [];\n var _n = true;\n var _d = false;\n var _e = undefined;\n\n try {\n for (var _i = arr[Symbol.iterator](), _s; !(_n = (_s = _i.next()).done); _n = true) {\n _arr.push(_s.value);\n\n if (i && _arr.length === i) break;\n }\n } catch (err) {\n _d = true;\n _e = err;\n } finally {\n try {\n if (!_n && _i[\"return\"] != null) _i[\"return\"]();\n } finally {\n if (_d) throw _e;\n }\n }\n\n return _arr;\n}\n\nfunction _unsupportedIterableToArray(o, minLen) {\n if (!o) return;\n if (typeof o === \"string\") return _arrayLikeToArray(o, minLen);\n var n = Object.prototype.toString.call(o).slice(8, -1);\n if (n === \"Object\" && o.constructor) n = o.constructor.name;\n if (n === \"Map\" || n === \"Set\") return Array.from(o);\n if (n === \"Arguments\" || /^(?:Ui|I)nt(?:8|16|32)(?:Clamped)?Array$/.test(n)) return _arrayLikeToArray(o, minLen);\n}\n\nfunction _arrayLikeToArray(arr, len) {\n if (len == null || len > arr.length) len = arr.length;\n\n for (var i = 0, arr2 = new Array(len); i < len; i++) arr2[i] = arr[i];\n\n return arr2;\n}\n\nfunction _nonIterableRest() {\n throw new TypeError(\"Invalid attempt to destructure non-iterable instance.\\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method.\");\n}\n\nfunction useScript(_ref) {\n var src = _ref.src,\n _ref$checkForExisting = _ref.checkForExisting,\n checkForExisting = _ref$checkForExisting === void 0 ? false : _ref$checkForExisting,\n attributes = _objectWithoutProperties(_ref, [\"src\", \"checkForExisting\"]);\n\n var _useState = useState(Boolean(src)),\n _useState2 = _slicedToArray(_useState, 2),\n loading = _useState2[0],\n setLoading = _useState2[1];\n\n var _useState3 = useState(null),\n _useState4 = _slicedToArray(_useState3, 2),\n error = _useState4[0],\n setError = _useState4[1];\n\n useEffect(function () {\n if (!isBrowser || !src) return;\n\n if (checkForExisting) {\n var existing = document.querySelectorAll(\"script[src=\\\"\".concat(src, \"\\\"]\"));\n\n if (existing.length > 0) {\n setLoading(false);\n return;\n }\n }\n\n var scriptEl = document.createElement('script');\n scriptEl.setAttribute('src', src);\n Object.keys(attributes).forEach(function (key) {\n //@ts-ignore\n if (scriptEl[key] === undefined) {\n scriptEl.setAttribute(key, attributes[key]);\n } else {\n //@ts-ignore\n scriptEl[key] = attributes[key];\n }\n });\n\n var handleLoad = function handleLoad() {\n setLoading(false);\n };\n\n var handleError = function handleError(error) {\n setError(error);\n };\n\n scriptEl.addEventListener('load', handleLoad);\n scriptEl.addEventListener('error', handleError);\n document.body.appendChild(scriptEl);\n return function () {\n scriptEl.removeEventListener('load', handleLoad);\n scriptEl.removeEventListener('error', handleError);\n }; // we need to ignore the attributes as they're a new object per call, so we'd never skip an effect call\n }, [src]);\n return [loading, error];\n}\nvar isBrowser = typeof window !== 'undefined' && typeof window.document !== 'undefined';\n\nvar useMergeLink = function useMergeLink(config) {\n var _useScript = useScript({\n src: 'https://cdn.merge.dev/initialize.js',\n checkForExisting: true\n }),\n _useScript2 = _slicedToArray(_useScript, 2),\n loading = _useScript2[0],\n error = _useScript2[1];\n\n var _useState = useState(false),\n _useState2 = _slicedToArray(_useState, 2),\n isReady = _useState2[0],\n setIsReady = _useState2[1];\n\n var isServer = typeof window === 'undefined';\n var isReadyForInitialization = !isServer && !!window.MergeLink && !loading && !error;\n useEffect(function () {\n if (isReadyForInitialization && window.MergeLink) {\n window.MergeLink.initialize(_objectSpread2(_objectSpread2({}, config), {}, {\n onReady: function onReady() {\n return setIsReady(true);\n }\n }));\n }\n }, [isReadyForInitialization, config]);\n\n var open = function open() {\n if (window.MergeLink) {\n window.MergeLink.openLink(config);\n }\n };\n\n return {\n open: open,\n isReady: isReady,\n error: error\n };\n};\n\nexport { useMergeLink };\n","/**\n * @license\n * Copyright 2019 Google LLC. All Rights Reserved.\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n *\n * =============================================================================\n */\n/** DataType enum. */\nexport var DataType;\n(function (DataType) {\n // Not a legal value for DataType. Used to indicate a DataType field\n // has not been set.\n DataType[DataType[\"DT_INVALID\"] = 0] = \"DT_INVALID\";\n // Data types that all computation devices are expected to be\n // capable to support.\n DataType[DataType[\"DT_FLOAT\"] = 1] = \"DT_FLOAT\";\n DataType[DataType[\"DT_DOUBLE\"] = 2] = \"DT_DOUBLE\";\n DataType[DataType[\"DT_INT32\"] = 3] = \"DT_INT32\";\n DataType[DataType[\"DT_UINT8\"] = 4] = \"DT_UINT8\";\n DataType[DataType[\"DT_INT16\"] = 5] = \"DT_INT16\";\n DataType[DataType[\"DT_INT8\"] = 6] = \"DT_INT8\";\n DataType[DataType[\"DT_STRING\"] = 7] = \"DT_STRING\";\n DataType[DataType[\"DT_COMPLEX64\"] = 8] = \"DT_COMPLEX64\";\n DataType[DataType[\"DT_INT64\"] = 9] = \"DT_INT64\";\n DataType[DataType[\"DT_BOOL\"] = 10] = \"DT_BOOL\";\n DataType[DataType[\"DT_QINT8\"] = 11] = \"DT_QINT8\";\n DataType[DataType[\"DT_QUINT8\"] = 12] = \"DT_QUINT8\";\n DataType[DataType[\"DT_QINT32\"] = 13] = \"DT_QINT32\";\n DataType[DataType[\"DT_BFLOAT16\"] = 14] = \"DT_BFLOAT16\";\n DataType[DataType[\"DT_QINT16\"] = 15] = \"DT_QINT16\";\n DataType[DataType[\"DT_QUINT16\"] = 16] = \"DT_QUINT16\";\n DataType[DataType[\"DT_UINT16\"] = 17] = \"DT_UINT16\";\n DataType[DataType[\"DT_COMPLEX128\"] = 18] = \"DT_COMPLEX128\";\n DataType[DataType[\"DT_HALF\"] = 19] = \"DT_HALF\";\n DataType[DataType[\"DT_RESOURCE\"] = 20] = \"DT_RESOURCE\";\n DataType[DataType[\"DT_VARIANT\"] = 21] = \"DT_VARIANT\";\n DataType[DataType[\"DT_UINT32\"] = 22] = \"DT_UINT32\";\n DataType[DataType[\"DT_UINT64\"] = 23] = \"DT_UINT64\";\n // Do not use! These are only for parameters. Every enum above\n // should have a corresponding value below (verified by types_test).\n DataType[DataType[\"DT_FLOAT_REF\"] = 101] = \"DT_FLOAT_REF\";\n DataType[DataType[\"DT_DOUBLE_REF\"] = 102] = \"DT_DOUBLE_REF\";\n DataType[DataType[\"DT_INT32_REF\"] = 103] = \"DT_INT32_REF\";\n DataType[DataType[\"DT_UINT8_REF\"] = 104] = \"DT_UINT8_REF\";\n DataType[DataType[\"DT_INT16_REF\"] = 105] = \"DT_INT16_REF\";\n DataType[DataType[\"DT_INT8_REF\"] = 106] = \"DT_INT8_REF\";\n DataType[DataType[\"DT_STRING_REF\"] = 107] = \"DT_STRING_REF\";\n DataType[DataType[\"DT_COMPLEX64_REF\"] = 108] = \"DT_COMPLEX64_REF\";\n DataType[DataType[\"DT_INT64_REF\"] = 109] = \"DT_INT64_REF\";\n DataType[DataType[\"DT_BOOL_REF\"] = 110] = \"DT_BOOL_REF\";\n DataType[DataType[\"DT_QINT8_REF\"] = 111] = \"DT_QINT8_REF\";\n DataType[DataType[\"DT_QUINT8_REF\"] = 112] = \"DT_QUINT8_REF\";\n DataType[DataType[\"DT_QINT32_REF\"] = 113] = \"DT_QINT32_REF\";\n DataType[DataType[\"DT_BFLOAT16_REF\"] = 114] = \"DT_BFLOAT16_REF\";\n DataType[DataType[\"DT_QINT16_REF\"] = 115] = \"DT_QINT16_REF\";\n DataType[DataType[\"DT_QUINT16_REF\"] = 116] = \"DT_QUINT16_REF\";\n DataType[DataType[\"DT_UINT16_REF\"] = 117] = \"DT_UINT16_REF\";\n DataType[DataType[\"DT_COMPLEX128_REF\"] = 118] = \"DT_COMPLEX128_REF\";\n DataType[DataType[\"DT_HALF_REF\"] = 119] = \"DT_HALF_REF\";\n DataType[DataType[\"DT_RESOURCE_REF\"] = 120] = \"DT_RESOURCE_REF\";\n DataType[DataType[\"DT_VARIANT_REF\"] = 121] = \"DT_VARIANT_REF\";\n DataType[DataType[\"DT_UINT32_REF\"] = 122] = \"DT_UINT32_REF\";\n DataType[DataType[\"DT_UINT64_REF\"] = 123] = \"DT_UINT64_REF\";\n})(DataType || (DataType = {}));\nexport var SaverDef;\n(function (SaverDef) {\n /** CheckpointFormatVersion enum. */\n let CheckpointFormatVersion;\n (function (CheckpointFormatVersion) {\n CheckpointFormatVersion[CheckpointFormatVersion[\"LEGACY\"] = 0] = \"LEGACY\";\n CheckpointFormatVersion[CheckpointFormatVersion[\"V1\"] = 1] = \"V1\";\n CheckpointFormatVersion[CheckpointFormatVersion[\"V2\"] = 2] = \"V2\";\n })(CheckpointFormatVersion = SaverDef.CheckpointFormatVersion || (SaverDef.CheckpointFormatVersion = {}));\n})(SaverDef || (SaverDef = {}));\n//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY29tcGlsZWRfYXBpLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vLi4vdGZqcy1jb252ZXJ0ZXIvc3JjL2RhdGEvY29tcGlsZWRfYXBpLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBOzs7Ozs7Ozs7Ozs7Ozs7O0dBZ0JHO0FBYUgscUJBQXFCO0FBQ3JCLE1BQU0sQ0FBTixJQUFZLFFBd0RYO0FBeERELFdBQVksUUFBUTtJQUNsQixxRUFBcUU7SUFDckUsb0JBQW9CO0lBQ3BCLG1EQUFjLENBQUE7SUFFZCw2REFBNkQ7SUFDN0Qsc0JBQXNCO0lBQ3RCLCtDQUFZLENBQUE7SUFDWixpREFBYSxDQUFBO0lBQ2IsK0NBQVksQ0FBQTtJQUNaLCtDQUFZLENBQUE7SUFDWiwrQ0FBWSxDQUFBO0lBQ1osNkNBQVcsQ0FBQTtJQUNYLGlEQUFhLENBQUE7SUFDYix1REFBZ0IsQ0FBQTtJQUNoQiwrQ0FBWSxDQUFBO0lBQ1osOENBQVksQ0FBQTtJQUNaLGdEQUFhLENBQUE7SUFDYixrREFBYyxDQUFBO0lBQ2Qsa0RBQWMsQ0FBQTtJQUNkLHNEQUFnQixDQUFBO0lBQ2hCLGtEQUFjLENBQUE7SUFDZCxvREFBZSxDQUFBO0lBQ2Ysa0RBQWMsQ0FBQTtJQUNkLDBEQUFrQixDQUFBO0lBQ2xCLDhDQUFZLENBQUE7SUFDWixzREFBZ0IsQ0FBQTtJQUNoQixvREFBZSxDQUFBO0lBQ2Ysa0RBQWMsQ0FBQTtJQUNkLGtEQUFjLENBQUE7SUFFZCxnRUFBZ0U7SUFDaEUsb0VBQW9FO0lBQ3BFLHlEQUFrQixDQUFBO0lBQ2xCLDJEQUFtQixDQUFBO0lBQ25CLHlEQUFrQixDQUFBO0lBQ2xCLHlEQUFrQixDQUFBO0lBQ2xCLHlEQUFrQixDQUFBO0lBQ2xCLHVEQUFpQixDQUFBO0lBQ2pCLDJEQUFtQixDQUFBO0lBQ25CLGlFQUFzQixDQUFBO0lBQ3RCLHlEQUFrQixDQUFBO0lBQ2xCLHVEQUFpQixDQUFBO0lBQ2pCLHlEQUFrQixDQUFBO0lBQ2xCLDJEQUFtQixDQUFBO0lBQ25CLDJEQUFtQixDQUFBO0lBQ25CLCtEQUFxQixDQUFBO0lBQ3JCLDJEQUFtQixDQUFBO0lBQ25CLDZEQUFvQixDQUFBO0lBQ3BCLDJEQUFtQixDQUFBO0lBQ25CLG1FQUF1QixDQUFBO0lBQ3ZCLHVEQUFpQixDQUFBO0lBQ2pCLCtEQUFxQixDQUFBO0lBQ3JCLDZEQUFvQixDQUFBO0lBQ3BCLDJEQUFtQixDQUFBO0lBQ25CLDJEQUFtQixDQUFBO0FBQ3JCLENBQUMsRUF4RFcsUUFBUSxLQUFSLFFBQVEsUUF3RG5CO0FBMlBELE1BQU0sS0FBVyxRQUFRLENBR3hCO0FBSEQsV0FBaUIsUUFBUTtJQUN2QixvQ0FBb0M7SUFDcEMsSUFBWSx1QkFBMEQ7SUFBdEUsV0FBWSx1QkFBdUI7UUFBRSx5RUFBWSxDQUFBO1FBQUUsaUVBQVEsQ0FBQTtRQUFFLGlFQUFRLENBQUE7SUFBQSxDQUFDLEVBQTFELHVCQUF1QixHQUF2QixnQ0FBdUIsS0FBdkIsZ0NBQXVCLFFBQW1DO0FBQ3hFLENBQUMsRUFIZ0IsUUFBUSxLQUFSLFFBQVEsUUFHeEIiLCJzb3VyY2VzQ29udGVudCI6WyIvKipcbiAqIEBsaWNlbnNlXG4gKiBDb3B5cmlnaHQgMjAxOSBHb29nbGUgTExDLiBBbGwgUmlnaHRzIFJlc2VydmVkLlxuICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlIFwiTGljZW5zZVwiKTtcbiAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS5cbiAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdFxuICpcbiAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMFxuICpcbiAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmVcbiAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuIFwiQVMgSVNcIiBCQVNJUyxcbiAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLlxuICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZFxuICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuXG4gKlxuICogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbiAqL1xuXG4vKiB0c2xpbnQ6ZGlzYWJsZSAqL1xuXG4vKiogUHJvcGVydGllcyBvZiBhbiBBbnkuICovXG5leHBvcnQgZGVjbGFyZSBpbnRlcmZhY2UgSUFueSB7XG4gIC8qKiBBbnkgdHlwZVVybCAqL1xuICB0eXBlVXJsPzogKHN0cmluZ3xudWxsKTtcblxuICAvKiogQW55IHZhbHVlICovXG4gIHZhbHVlPzogKFVpbnQ4QXJyYXl8bnVsbCk7XG59XG5cbi8qKiBEYXRhVHlwZSBlbnVtLiAqL1xuZXhwb3J0IGVudW0gRGF0YVR5cGUge1xuICAvLyBOb3QgYSBsZWdhbCB2YWx1ZSBmb3IgRGF0YVR5cGUuICBVc2VkIHRvIGluZGljYXRlIGEgRGF0YVR5cGUgZmllbGRcbiAgLy8gaGFzIG5vdCBiZWVuIHNldC5cbiAgRFRfSU5WQUxJRCA9IDAsXG5cbiAgLy8gRGF0YSB0eXBlcyB0aGF0IGFsbCBjb21wdXRhdGlvbiBkZXZpY2VzIGFyZSBleHBlY3RlZCB0byBiZVxuICAvLyBjYXBhYmxlIHRvIHN1cHBvcnQuXG4gIERUX0ZMT0FUID0gMSxcbiAgRFRfRE9VQkxFID0gMixcbiAgRFRfSU5UMzIgPSAzLFxuICBEVF9VSU5UOCA9IDQsXG4gIERUX0lOVDE2ID0gNSxcbiAgRFRfSU5UOCA9IDYsXG4gIERUX1NUUklORyA9IDcsXG4gIERUX0NPTVBMRVg2NCA9IDgsICAvLyBTaW5nbGUtcHJlY2lzaW9uIGNvbXBsZXhcbiAgRFRfSU5UNjQgPSA5LFxuICBEVF9CT09MID0gMTAsXG4gIERUX1FJTlQ4ID0gMTEsICAgICAvLyBRdWFudGl6ZWQgaW50OFxuICBEVF9RVUlOVDggPSAxMiwgICAgLy8gUXVhbnRpemVkIHVpbnQ4XG4gIERUX1FJTlQzMiA9IDEzLCAgICAvLyBRdWFudGl6ZWQgaW50MzJcbiAgRFRfQkZMT0FUMTYgPSAxNCwgIC8vIEZsb2F0MzIgdHJ1bmNhdGVkIHRvIDE2IGJpdHMuICBPbmx5IGZvciBjYXN0IG9wcy5cbiAgRFRfUUlOVDE2ID0gMTUsICAgIC8vIFF1YW50aXplZCBpbnQxNlxuICBEVF9RVUlOVDE2ID0gMTYsICAgLy8gUXVhbnRpemVkIHVpbnQxNlxuICBEVF9VSU5UMTYgPSAxNyxcbiAgRFRfQ09NUExFWDEyOCA9IDE4LCAgLy8gRG91YmxlLXByZWNpc2lvbiBjb21wbGV4XG4gIERUX0hBTEYgPSAxOSxcbiAgRFRfUkVTT1VSQ0UgPSAyMCxcbiAgRFRfVkFSSUFOVCA9IDIxLCAgLy8gQXJiaXRyYXJ5IEMrKyBkYXRhIHR5cGVzXG4gIERUX1VJTlQzMiA9IDIyLFxuICBEVF9VSU5UNjQgPSAyMyxcblxuICAvLyBEbyBub3QgdXNlISAgVGhlc2UgYXJlIG9ubHkgZm9yIHBhcmFtZXRlcnMuICBFdmVyeSBlbnVtIGFib3ZlXG4gIC8vIHNob3VsZCBoYXZlIGEgY29ycmVzcG9uZGluZyB2YWx1ZSBiZWxvdyAodmVyaWZpZWQgYnkgdHlwZXNfdGVzdCkuXG4gIERUX0ZMT0FUX1JFRiA9IDEwMSxcbiAgRFRfRE9VQkxFX1JFRiA9IDEwMixcbiAgRFRfSU5UMzJfUkVGID0gMTAzLFxuICBEVF9VSU5UOF9SRUYgPSAxMDQsXG4gIERUX0lOVDE2X1JFRiA9IDEwNSxcbiAgRFRfSU5UOF9SRUYgPSAxMDYsXG4gIERUX1NUUklOR19SRUYgPSAxMDcsXG4gIERUX0NPTVBMRVg2NF9SRUYgPSAxMDgsXG4gIERUX0lOVDY0X1JFRiA9IDEwOSxcbiAgRFRfQk9PTF9SRUYgPSAxMTAsXG4gIERUX1FJTlQ4X1JFRiA9IDExMSxcbiAgRFRfUVVJTlQ4X1JFRiA9IDExMixcbiAgRFRfUUlOVDMyX1JFRiA9IDExMyxcbiAgRFRfQkZMT0FUMTZfUkVGID0gMTE0LFxuICBEVF9RSU5UMTZfUkVGID0gMTE1LFxuICBEVF9RVUlOVDE2X1JFRiA9IDExNixcbiAgRFRfVUlOVDE2X1JFRiA9IDExNyxcbiAgRFRfQ09NUExFWDEyOF9SRUYgPSAxMTgsXG4gIERUX0hBTEZfUkVGID0gMTE5LFxuICBEVF9SRVNPVVJDRV9SRUYgPSAxMjAsXG4gIERUX1ZBUklBTlRfUkVGID0gMTIxLFxuICBEVF9VSU5UMzJfUkVGID0gMTIyLFxuICBEVF9VSU5UNjRfUkVGID0gMTIzLFxufVxuXG4vKiogUHJvcGVydGllcyBvZiBhIFRlbnNvclNoYXBlLiAqL1xuZXhwb3J0IGRlY2xhcmUgaW50ZXJmYWNlIElUZW5zb3JTaGFwZSB7XG4gIC8qKiBUZW5zb3JTaGFwZSBkaW0gKi9cbiAgZGltPzogKFRlbnNvclNoYXBlLklEaW1bXXxudWxsKTtcblxuICAvKiogVGVuc29yU2hhcGUgdW5rbm93blJhbmsgKi9cbiAgdW5rbm93blJhbms/OiAoYm9vbGVhbnxudWxsKTtcbn1cblxuZXhwb3J0IG5hbWVzcGFjZSBUZW5zb3JTaGFwZSB7XG4gIC8qKiBQcm9wZXJ0aWVzIG9mIGEgRGltLiAqL1xuICBleHBvcnQgZGVjbGFyZSBpbnRlcmZhY2UgSURpbSB7XG4gICAgLyoqIERpbSBzaXplICovXG4gICAgc2l6ZT86IChudW1iZXJ8c3RyaW5nfG51bGwpO1xuXG4gICAgLyoqIERpbSBuYW1lICovXG4gICAgbmFtZT86IChzdHJpbmd8bnVsbCk7XG4gIH1cbn1cblxuLyoqIFByb3BlcnRpZXMgb2YgYSBUZW5zb3IuICovXG5leHBvcnQgZGVjbGFyZSBpbnRlcmZhY2UgSVRlbnNvciB7XG4gIC8qKiBUZW5zb3IgZHR5cGUgKi9cbiAgZHR5cGU/OiAoRGF0YVR5cGV8bnVsbCk7XG5cbiAgLyoqIFRlbnNvciB0ZW5zb3JTaGFwZSAqL1xuICB0ZW5zb3JTaGFwZT86IChJVGVuc29yU2hhcGV8bnVsbCk7XG5cbiAgLyoqIFRlbnNvciB2ZXJzaW9uTnVtYmVyICovXG4gIHZlcnNpb25OdW1iZXI/OiAobnVtYmVyfG51bGwpO1xuXG4gIC8qKiBUZW5zb3IgdGVuc29yQ29udGVudCAqL1xuICB0ZW5zb3JDb250ZW50PzogKFVpbnQ4QXJyYXl8bnVsbCk7XG5cbiAgLyoqIFRlbnNvciBmbG9hdFZhbCAqL1xuICBmbG9hdFZhbD86IChudW1iZXJbXXxudWxsKTtcblxuICAvKiogVGVuc29yIGRvdWJsZVZhbCAqL1xuICBkb3VibGVWYWw/OiAobnVtYmVyW118bnVsbCk7XG5cbiAgLyoqIFRlbnNvciBpbnRWYWwgKi9cbiAgaW50VmFsPzogKG51bWJlcltdfG51bGwpO1xuXG4gIC8qKiBUZW5zb3Igc3RyaW5nVmFsICovXG4gIHN0cmluZ1ZhbD86IChVaW50OEFycmF5W118bnVsbCk7XG5cbiAgLyoqIFRlbnNvciBzY29tcGxleFZhbCAqL1xuICBzY29tcGxleFZhbD86IChudW1iZXJbXXxudWxsKTtcblxuICAvKiogVGVuc29yIGludDY0VmFsICovXG4gIGludDY0VmFsPzogKChudW1iZXIgfCBzdHJpbmcpW118bnVsbCk7XG5cbiAgLyoqIFRlbnNvciBib29sVmFsICovXG4gIGJvb2xWYWw/OiAoYm9vbGVhbltdfG51bGwpO1xuXG4gIC8qKiBUZW5zb3IgdWludDMyVmFsICovXG4gIHVpbnQzMlZhbD86IChudW1iZXJbXXxudWxsKTtcblxuICAvKiogVGVuc29yIHVpbnQ2NFZhbCAqL1xuICB1aW50NjRWYWw/OiAoKG51bWJlciB8IHN0cmluZylbXXxudWxsKTtcbn1cblxuLyoqIFByb3BlcnRpZXMgb2YgYW4gQXR0clZhbHVlLiAqL1xuZXhwb3J0IGRlY2xhcmUgaW50ZXJmYWNlIElBdHRyVmFsdWUge1xuICAvKiogQXR0clZhbHVlIGxpc3QgKi9cbiAgbGlzdD86IChBdHRyVmFsdWUuSUxpc3RWYWx1ZXxudWxsKTtcblxuICAvKiogQXR0clZhbHVlIHMgKi9cbiAgcz86IChzdHJpbmd8bnVsbCk7XG5cbiAgLyoqIEF0dHJWYWx1ZSBpICovXG4gIGk/OiAobnVtYmVyfHN0cmluZ3xudWxsKTtcblxuICAvKiogQXR0clZhbHVlIGYgKi9cbiAgZj86IChudW1iZXJ8bnVsbCk7XG5cbiAgLyoqIEF0dHJWYWx1ZSBiICovXG4gIGI/OiAoYm9vbGVhbnxudWxsKTtcblxuICAvKiogQXR0clZhbHVlIHR5cGUgKi9cbiAgdHlwZT86IChEYXRhVHlwZXxudWxsKTtcblxuICAvKiogQXR0clZhbHVlIHNoYXBlICovXG4gIHNoYXBlPzogKElUZW5zb3JTaGFwZXxudWxsKTtcblxuICAvKiogQXR0clZhbHVlIHRlbnNvciAqL1xuICB0ZW5zb3I/OiAoSVRlbnNvcnxudWxsKTtcblxuICAvKiogQXR0clZhbHVlIHBsYWNlaG9sZGVyICovXG4gIHBsYWNlaG9sZGVyPzogKHN0cmluZ3xudWxsKTtcblxuICAvKiogQXR0clZhbHVlIGZ1bmMgKi9cbiAgZnVuYz86IChJTmFtZUF0dHJMaXN0fG51bGwpO1xufVxuXG5leHBvcnQgbmFtZXNwYWNlIEF0dHJWYWx1ZSB7XG4gIC8qKiBQcm9wZXJ0aWVzIG9mIGEgTGlzdFZhbHVlLiAqL1xuICBleHBvcnQgZGVjbGFyZSBpbnRlcmZhY2UgSUxpc3RWYWx1ZSB7XG4gICAgLyoqIExpc3RWYWx1ZSBzICovXG4gICAgcz86IChzdHJpbmdbXXxudWxsKTtcblxuICAgIC8qKiBMaXN0VmFsdWUgaSAqL1xuICAgIGk/OiAoKG51bWJlciB8IHN0cmluZylbXXxudWxsKTtcblxuICAgIC8qKiBMaXN0VmFsdWUgZiAqL1xuICAgIGY/OiAobnVtYmVyW118bnVsbCk7XG5cbiAgICAvKiogTGlzdFZhbHVlIGIgKi9cbiAgICBiPzogKGJvb2xlYW5bXXxudWxsKTtcblxuICAgIC8qKiBMaXN0VmFsdWUgdHlwZSAqL1xuICAgIHR5cGU/OiAoRGF0YVR5cGVbXXxudWxsKTtcblxuICAgIC8qKiBMaXN0VmFsdWUgc2hhcGUgKi9cbiAgICBzaGFwZT86IChJVGVuc29yU2hhcGVbXXxudWxsKTtcblxuICAgIC8qKiBMaXN0VmFsdWUgdGVuc29yICovXG4gICAgdGVuc29yPzogKElUZW5zb3JbXXxudWxsKTtcblxuICAgIC8qKiBMaXN0VmFsdWUgZnVuYyAqL1xuICAgIGZ1bmM/OiAoSU5hbWVBdHRyTGlzdFtdfG51bGwpO1xuICB9XG59XG5cbi8qKiBQcm9wZXJ0aWVzIG9mIGEgTmFtZUF0dHJMaXN0LiAqL1xuZXhwb3J0IGRlY2xhcmUgaW50ZXJmYWNlIElOYW1lQXR0ckxpc3Qge1xuICAvKiogTmFtZUF0dHJMaXN0IG5hbWUgKi9cbiAgbmFtZT86IChzdHJpbmd8bnVsbCk7XG5cbiAgLyoqIE5hbWVBdHRyTGlzdCBhdHRyICovXG4gIGF0dHI/OiAoe1trOiBzdHJpbmddOiBJQXR0clZhbHVlfXxudWxsKTtcbn1cblxuLyoqIFByb3BlcnRpZXMgb2YgYSBOb2RlRGVmLiAqL1xuZXhwb3J0IGRlY2xhcmUgaW50ZXJmYWNlIElOb2RlRGVmIHtcbiAgLyoqIE5vZGVEZWYgbmFtZSAqL1xuICBuYW1lPzogKHN0cmluZ3xudWxsKTtcblxuICAvKiogTm9kZURlZiBvcCAqL1xuICBvcD86IChzdHJpbmd8bnVsbCk7XG5cbiAgLyoqIE5vZGVEZWYgaW5wdXQgKi9cbiAgaW5wdXQ/OiAoc3RyaW5nW118bnVsbCk7XG5cbiAgLyoqIE5vZGVEZWYgZGV2aWNlICovXG4gIGRldmljZT86IChzdHJpbmd8bnVsbCk7XG5cbiAgLyoqIE5vZGVEZWYgYXR0ciAqL1xuICBhdHRyPzogKHtbazogc3RyaW5nXTogSUF0dHJWYWx1ZX18bnVsbCk7XG59XG5cbi8qKiBQcm9wZXJ0aWVzIG9mIGEgVmVyc2lvbkRlZi4gKi9cbmV4cG9ydCBkZWNsYXJlIGludGVyZmFjZSBJVmVyc2lvbkRlZiB7XG4gIC8qKiBWZXJzaW9uRGVmIHByb2R1Y2VyICovXG4gIHByb2R1Y2VyPzogKG51bWJlcnxudWxsKTtcblxuICAvKiogVmVyc2lvbkRlZiBtaW5Db25zdW1lciAqL1xuICBtaW5Db25zdW1lcj86IChudW1iZXJ8bnVsbCk7XG5cbiAgLyoqIFZlcnNpb25EZWYgYmFkQ29uc3VtZXJzICovXG4gIGJhZENvbnN1bWVycz86IChudW1iZXJbXXxudWxsKTtcbn1cblxuLyoqIFByb3BlcnRpZXMgb2YgYSBHcmFwaERlZi4gKi9cbmV4cG9ydCBkZWNsYXJlIGludGVyZmFjZSBJR3JhcGhEZWYge1xuICAvKiogR3JhcGhEZWYgbm9kZSAqL1xuICBub2RlPzogKElOb2RlRGVmW118bnVsbCk7XG5cbiAgLyoqIEdyYXBoRGVmIHZlcnNpb25zICovXG4gIHZlcnNpb25zPzogKElWZXJzaW9uRGVmfG51bGwpO1xuXG4gIC8qKiBHcmFwaERlZiBsaWJyYXJ5ICovXG4gIGxpYnJhcnk/OiAoSUZ1bmN0aW9uRGVmTGlicmFyeXxudWxsKTtcbn1cblxuLyoqIFByb3BlcnRpZXMgb2YgYSBDb2xsZWN0aW9uRGVmLiAqL1xuZXhwb3J0IGRlY2xhcmUgaW50ZXJmYWNlIElDb2xsZWN0aW9uRGVmIHtcbiAgLyoqIENvbGxlY3Rpb25EZWYgbm9kZUxpc3QgKi9cbiAgbm9kZUxpc3Q/OiAoQ29sbGVjdGlvbkRlZi5JTm9kZUxpc3R8bnVsbCk7XG5cbiAgLyoqIENvbGxlY3Rpb25EZWYgYnl0ZXNMaXN0ICovXG4gIGJ5dGVzTGlzdD86IChDb2xsZWN0aW9uRGVmLklCeXRlc0xpc3R8bnVsbCk7XG5cbiAgLyoqIENvbGxlY3Rpb25EZWYgaW50NjRMaXN0ICovXG4gIGludDY0TGlzdD86IChDb2xsZWN0aW9uRGVmLklJbnQ2NExpc3R8bnVsbCk7XG5cbiAgLyoqIENvbGxlY3Rpb25EZWYgZmxvYXRMaXN0ICovXG4gIGZsb2F0TGlzdD86IChDb2xsZWN0aW9uRGVmLklGbG9hdExpc3R8bnVsbCk7XG5cbiAgLyoqIENvbGxlY3Rpb25EZWYgYW55TGlzdCAqL1xuICBhbnlMaXN0PzogKENvbGxlY3Rpb25EZWYuSUFueUxpc3R8bnVsbCk7XG59XG5cbmV4cG9ydCBuYW1lc3BhY2UgQ29sbGVjdGlvbkRlZiB7XG4gIC8qKiBQcm9wZXJ0aWVzIG9mIGEgTm9kZUxpc3QuICovXG4gIGV4cG9ydCBkZWNsYXJlIGludGVyZmFjZSBJTm9kZUxpc3Qge1xuICAgIC8qKiBOb2RlTGlzdCB2YWx1ZSAqL1xuICAgIHZhbHVlPzogKHN0cmluZ1tdfG51bGwpO1xuICB9XG5cbiAgLyoqIFByb3BlcnRpZXMgb2YgYSBCeXRlc0xpc3QuICovXG4gIGV4cG9ydCBkZWNsYXJlIGludGVyZmFjZSBJQnl0ZXNMaXN0IHtcbiAgICAvKiogQnl0ZXNMaXN0IHZhbHVlICovXG4gICAgdmFsdWU/OiAoVWludDhBcnJheVtdfG51bGwpO1xuICB9XG5cbiAgLyoqIFByb3BlcnRpZXMgb2YgYW4gSW50NjRMaXN0LiAqL1xuICBleHBvcnQgZGVjbGFyZSBpbnRlcmZhY2UgSUludDY0TGlzdCB7XG4gICAgLyoqIEludDY0TGlzdCB2YWx1ZSAqL1xuICAgIHZhbHVlPzogKChudW1iZXIgfCBzdHJpbmcpW118bnVsbCk7XG4gIH1cblxuICAvKiogUHJvcGVydGllcyBvZiBhIEZsb2F0TGlzdC4gKi9cbiAgZXhwb3J0IGRlY2xhcmUgaW50ZXJmYWNlIElGbG9hdExpc3Qge1xuICAgIC8qKiBGbG9hdExpc3QgdmFsdWUgKi9cbiAgICB2YWx1ZT86IChudW1iZXJbXXxudWxsKTtcbiAgfVxuXG4gIC8qKiBQcm9wZXJ0aWVzIG9mIGFuIEFueUxpc3QuICovXG4gIGV4cG9ydCBkZWNsYXJlIGludGVyZmFjZSBJQW55TGlzdCB7XG4gICAgLyoqIEFueUxpc3QgdmFsdWUgKi9cbiAgICB2YWx1ZT86IChJQW55W118bnVsbCk7XG4gIH1cbn1cblxuLyoqIFByb3BlcnRpZXMgb2YgYSBTYXZlckRlZi4gKi9cbmV4cG9ydCBkZWNsYXJlIGludGVyZmFjZSBJU2F2ZXJEZWYge1xuICAvKiogU2F2ZXJEZWYgZmlsZW5hbWVUZW5zb3JOYW1lICovXG4gIGZpbGVuYW1lVGVuc29yTmFtZT86IChzdHJpbmd8bnVsbCk7XG5cbiAgLyoqIFNhdmVyRGVmIHNhdmVUZW5zb3JOYW1lICovXG4gIHNhdmVUZW5zb3JOYW1lPzogKHN0cmluZ3xudWxsKTtcblxuICAvKiogU2F2ZXJEZWYgcmVzdG9yZU9wTmFtZSAqL1xuICByZXN0b3JlT3BOYW1lPzogKHN0cmluZ3xudWxsKTtcblxuICAvKiogU2F2ZXJEZWYgbWF4VG9LZWVwICovXG4gIG1heFRvS2VlcD86IChudW1iZXJ8bnVsbCk7XG5cbiAgLyoqIFNhdmVyRGVmIHNoYXJkZWQgKi9cbiAgc2hhcmRlZD86IChib29sZWFufG51bGwpO1xuXG4gIC8qKiBTYXZlckRlZiBrZWVwQ2hlY2twb2ludEV2ZXJ5TkhvdXJzICovXG4gIGtlZXBDaGVja3BvaW50RXZlcnlOSG91cnM/OiAobnVtYmVyfG51bGwpO1xuXG4gIC8qKiBTYXZlckRlZiB2ZXJzaW9uICovXG4gIHZlcnNpb24/OiAoU2F2ZXJEZWYuQ2hlY2twb2ludEZvcm1hdFZlcnNpb258bnVsbCk7XG59XG5cbmV4cG9ydCBuYW1lc3BhY2UgU2F2ZXJEZWYge1xuICAvKiogQ2hlY2twb2ludEZvcm1hdFZlcnNpb24gZW51bS4gKi9cbiAgZXhwb3J0IGVudW0gQ2hlY2twb2ludEZvcm1hdFZlcnNpb24geydMRUdBQ1knID0gMCwgJ1YxJyA9IDEsICdWMicgPSAyfVxufVxuXG4vKiogUHJvcGVydGllcyBvZiBhIFRlbnNvckluZm8uICovXG5leHBvcnQgZGVjbGFyZSBpbnRlcmZhY2UgSVRlbnNvckluZm8ge1xuICAvKiogVGVuc29ySW5mbyBuYW1lICovXG4gIG5hbWU/OiAoc3RyaW5nfG51bGwpO1xuXG4gIC8qKiBUZW5zb3JJbmZvIGNvb1NwYXJzZSAqL1xuICBjb29TcGFyc2U/OiAoVGVuc29ySW5mby5JQ29vU3BhcnNlfG51bGwpO1xuXG4gIC8qKiBUZW5zb3JJbmZvIGR0eXBlICovXG4gIGR0eXBlPzogKERhdGFUeXBlfG51bGwpO1xuXG4gIC8qKiBUZW5zb3JJbmZvIHRlbnNvclNoYXBlICovXG4gIHRlbnNvclNoYXBlPzogKElUZW5zb3JTaGFwZXxudWxsKTtcbn1cblxuZXhwb3J0IG5hbWVzcGFjZSBUZW5zb3JJbmZvIHtcbiAgLyoqIFByb3BlcnRpZXMgb2YgYSBDb29TcGFyc2UuICovXG4gIGV4cG9ydCBkZWNsYXJlIGludGVyZmFjZSBJQ29vU3BhcnNlIHtcbiAgICAvKiogQ29vU3BhcnNlIHZhbHVlc1RlbnNvck5hbWUgKi9cbiAgICB2YWx1ZXNUZW5zb3JOYW1lPzogKHN0cmluZ3xudWxsKTtcblxuICAgIC8qKiBDb29TcGFyc2UgaW5kaWNlc1RlbnNvck5hbWUgKi9cbiAgICBpbmRpY2VzVGVuc29yTmFtZT86IChzdHJpbmd8bnVsbCk7XG5cbiAgICAvKiogQ29vU3BhcnNlIGRlbnNlU2hhcGVUZW5zb3JOYW1lICovXG4gICAgZGVuc2VTaGFwZVRlbnNvck5hbWU/OiAoc3RyaW5nfG51bGwpO1xuICB9XG59XG5cbi8qKiBQcm9wZXJ0aWVzIG9mIGEgU2lnbmF0dXJlRGVmLiAqL1xuZXhwb3J0IGRlY2xhcmUgaW50ZXJmYWNlIElTaWduYXR1cmVEZWYge1xuICAvKiogU2lnbmF0dXJlRGVmIGlucHV0cyAqL1xuICBpbnB1dHM/OiAoe1trOiBzdHJpbmddOiBJVGVuc29ySW5mb318bnVsbCk7XG5cbiAgLyoqIFNpZ25hdHVyZURlZiBvdXRwdXRzICovXG4gIG91dHB1dHM/OiAoe1trOiBzdHJpbmddOiBJVGVuc29ySW5mb318bnVsbCk7XG5cbiAgLyoqIFNpZ25hdHVyZURlZiBtZXRob2ROYW1lICovXG4gIG1ldGhvZE5hbWU/OiAoc3RyaW5nfG51bGwpO1xufVxuXG4vKiogUHJvcGVydGllcyBvZiBhbiBBc3NldEZpbGVEZWYuICovXG5leHBvcnQgZGVjbGFyZSBpbnRlcmZhY2UgSUFzc2V0RmlsZURlZiB7XG4gIC8qKiBBc3NldEZpbGVEZWYgdGVuc29ySW5mbyAqL1xuICB0ZW5zb3JJbmZvPzogKElUZW5zb3JJbmZvfG51bGwpO1xuXG4gIC8qKiBBc3NldEZpbGVEZWYgZmlsZW5hbWUgKi9cbiAgZmlsZW5hbWU/OiAoc3RyaW5nfG51bGwpO1xufVxuXG4vKiogUHJvcGVydGllcyBvZiBhbiBPcERlZi4gKi9cbmV4cG9ydCBkZWNsYXJlIGludGVyZmFjZSBJT3BEZWYge1xuICAvKiogT3BEZWYgbmFtZSAqL1xuICBuYW1lPzogKHN0cmluZ3xudWxsKTtcblxuICAvKiogT3BEZWYgaW5wdXRBcmcgKi9cbiAgaW5wdXRBcmc/OiAoT3BEZWYuSUFyZ0RlZltdfG51bGwpO1xuXG4gIC8qKiBPcERlZiBvdXRwdXRBcmcgKi9cbiAgb3V0cHV0QXJnPzogKE9wRGVmLklBcmdEZWZbXXxudWxsKTtcblxuICAvKiogT3BEZWYgYXR0ciAqL1xuICBhdHRyPzogKE9wRGVmLklBdHRyRGVmW118bnVsbCk7XG5cbiAgLyoqIE9wRGVmIGRlcHJlY2F0aW9uICovXG4gIGRlcHJlY2F0aW9uPzogKE9wRGVmLklPcERlcHJlY2F0aW9ufG51bGwpO1xuXG4gIC8qKiBPcERlZiBzdW1tYXJ5ICovXG4gIHN1bW1hcnk/OiAoc3RyaW5nfG51bGwpO1xuXG4gIC8qKiBPcERlZiBkZXNjcmlwdGlvbiAqL1xuICBkZXNjcmlwdGlvbj86IChzdHJpbmd8bnVsbCk7XG5cbiAgLyoqIE9wRGVmIGlzQ29tbXV0YXRpdmUgKi9cbiAgaXNDb21tdXRhdGl2ZT86IChib29sZWFufG51bGwpO1xuXG4gIC8qKiBPcERlZiBpc0FnZ3JlZ2F0ZSAqL1xuICBpc0FnZ3JlZ2F0ZT86IChib29sZWFufG51bGwpO1xuXG4gIC8qKiBPcERlZiBpc1N0YXRlZnVsICovXG4gIGlzU3RhdGVmdWw/OiAoYm9vbGVhbnxudWxsKTtcblxuICAvKiogT3BEZWYgYWxsb3dzVW5pbml0aWFsaXplZElucHV0ICovXG4gIGFsbG93c1VuaW5pdGlhbGl6ZWRJbnB1dD86IChib29sZWFufG51bGwpO1xufVxuXG5leHBvcnQgbmFtZXNwYWNlIE9wRGVmIHtcbiAgLyoqIFByb3BlcnRpZXMgb2YgYW4gQXJnRGVmLiAqL1xuICBleHBvcnQgZGVjbGFyZSBpbnRlcmZhY2UgSUFyZ0RlZiB7XG4gICAgLyoqIEFyZ0RlZiBuYW1lICovXG4gICAgbmFtZT86IChzdHJpbmd8bnVsbCk7XG5cbiAgICAvKiogQXJnRGVmIGRlc2NyaXB0aW9uICovXG4gICAgZGVzY3JpcHRpb24/OiAoc3RyaW5nfG51bGwpO1xuXG4gICAgLyoqIEFyZ0RlZiB0eXBlICovXG4gICAgdHlwZT86IChEYXRhVHlwZXxudWxsKTtcblxuICAgIC8qKiBBcmdEZWYgdHlwZUF0dHIgKi9cbiAgICB0eXBlQXR0cj86IChzdHJpbmd8bnVsbCk7XG5cbiAgICAvKiogQXJnRGVmIG51bWJlckF0dHIgKi9cbiAgICBudW1iZXJBdHRyPzogKHN0cmluZ3xudWxsKTtcblxuICAgIC8qKiBBcmdEZWYgdHlwZUxpc3RBdHRyICovXG4gICAgdHlwZUxpc3RBdHRyPzogKHN0cmluZ3xudWxsKTtcblxuICAgIC8qKiBBcmdEZWYgaXNSZWYgKi9cbiAgICBpc1JlZj86IChib29sZWFufG51bGwpO1xuICB9XG5cbiAgLyoqIFByb3BlcnRpZXMgb2YgYW4gQXR0ckRlZi4gKi9cbiAgZXhwb3J0IGRlY2xhcmUgaW50ZXJmYWNlIElBdHRyRGVmIHtcbiAgICAvKiogQXR0ckRlZiBuYW1lICovXG4gICAgbmFtZT86IChzdHJpbmd8bnVsbCk7XG5cbiAgICAvKiogQXR0ckRlZiB0eXBlICovXG4gICAgdHlwZT86IChzdHJpbmd8bnVsbCk7XG5cbiAgICAvKiogQXR0ckRlZiBkZWZhdWx0VmFsdWUgKi9cbiAgICBkZWZhdWx0VmFsdWU/OiAoSUF0dHJWYWx1ZXxudWxsKTtcblxuICAgIC8qKiBBdHRyRGVmIGRlc2NyaXB0aW9uICovXG4gICAgZGVzY3JpcHRpb24/OiAoc3RyaW5nfG51bGwpO1xuXG4gICAgLyoqIEF0dHJEZWYgaGFzTWluaW11bSAqL1xuICAgIGhhc01pbmltdW0/OiAoYm9vbGVhbnxudWxsKTtcblxuICAgIC8qKiBBdHRyRGVmIG1pbmltdW0gKi9cbiAgICBtaW5pbXVtPzogKG51bWJlcnxzdHJpbmd8bnVsbCk7XG5cbiAgICAvKiogQXR0ckRlZiBhbGxvd2VkVmFsdWVzICovXG4gICAgYWxsb3dlZFZhbHVlcz86IChJQXR0clZhbHVlfG51bGwpO1xuICB9XG5cbiAgLyoqIFByb3BlcnRpZXMgb2YgYW4gT3BEZXByZWNhdGlvbi4gKi9cbiAgZXhwb3J0IGRlY2xhcmUgaW50ZXJmYWNlIElPcERlcHJlY2F0aW9uIHtcbiAgICAvKiogT3BEZXByZWNhdGlvbiB2ZXJzaW9uICovXG4gICAgdmVyc2lvbj86IChudW1iZXJ8bnVsbCk7XG5cbiAgICAvKiogT3BEZXByZWNhdGlvbiBleHBsYW5hdGlvbiAqL1xuICAgIGV4cGxhbmF0aW9uPzogKHN0cmluZ3xudWxsKTtcbiAgfVxufVxuXG4vKiogUHJvcGVydGllcyBvZiBhbiBPcExpc3QuICovXG5leHBvcnQgZGVjbGFyZSBpbnRlcmZhY2UgSU9wTGlzdCB7XG4gIC8qKiBPcExpc3Qgb3AgKi9cbiAgb3A/OiAoSU9wRGVmW118bnVsbCk7XG59XG5cbi8qKiBQcm9wZXJ0aWVzIG9mIGEgTWV0YUdyYXBoRGVmLiAqL1xuZXhwb3J0IGRlY2xhcmUgaW50ZXJmYWNlIElNZXRhR3JhcGhEZWYge1xuICAvKiogTWV0YUdyYXBoRGVmIG1ldGFJbmZvRGVmICovXG4gIG1ldGFJbmZvRGVmPzogKE1ldGFHcmFwaERlZi5JTWV0YUluZm9EZWZ8bnVsbCk7XG5cbiAgLyoqIE1ldGFHcmFwaERlZiBncmFwaERlZiAqL1xuICBncmFwaERlZj86IChJR3JhcGhEZWZ8bnVsbCk7XG5cbiAgLyoqIE1ldGFHcmFwaERlZiBzYXZlckRlZiAqL1xuICBzYXZlckRlZj86IChJU2F2ZXJEZWZ8bnVsbCk7XG5cbiAgLyoqIE1ldGFHcmFwaERlZiBjb2xsZWN0aW9uRGVmICovXG4gIGNvbGxlY3Rpb25EZWY/OiAoe1trOiBzdHJpbmddOiBJQ29sbGVjdGlvbkRlZn18bnVsbCk7XG5cbiAgLyoqIE1ldGFHcmFwaERlZiBzaWduYXR1cmVEZWYgKi9cbiAgc2lnbmF0dXJlRGVmPzogKHtbazogc3RyaW5nXTogSVNpZ25hdHVyZURlZn18bnVsbCk7XG5cbiAgLyoqIE1ldGFHcmFwaERlZiBhc3NldEZpbGVEZWYgKi9cbiAgYXNzZXRGaWxlRGVmPzogKElBc3NldEZpbGVEZWZbXXxudWxsKTtcbn1cblxuZXhwb3J0IG5hbWVzcGFjZSBNZXRhR3JhcGhEZWYge1xuICAvKiogUHJvcGVydGllcyBvZiBhIE1ldGFJbmZvRGVmLiAqL1xuICBleHBvcnQgZGVjbGFyZSBpbnRlcmZhY2UgSU1ldGFJbmZvRGVmIHtcbiAgICAvKiogTWV0YUluZm9EZWYgbWV0YUdyYXBoVmVyc2lvbiAqL1xuICAgIG1ldGFHcmFwaFZlcnNpb24/OiAoc3RyaW5nfG51bGwpO1xuXG4gICAgLyoqIE1ldGFJbmZvRGVmIHN0cmlwcGVkT3BMaXN0ICovXG4gICAgc3RyaXBwZWRPcExpc3Q/OiAoSU9wTGlzdHxudWxsKTtcblxuICAgIC8qKiBNZXRhSW5mb0RlZiBhbnlJbmZvICovXG4gICAgYW55SW5mbz86IChJQW55fG51bGwpO1xuXG4gICAgLyoqIE1ldGFJbmZvRGVmIHRhZ3MgKi9cbiAgICB0YWdzPzogKHN0cmluZ1tdfG51bGwpO1xuXG4gICAgLyoqIE1ldGFJbmZvRGVmIHRlbnNvcmZsb3dWZXJzaW9uICovXG4gICAgdGVuc29yZmxvd1ZlcnNpb24/OiAoc3RyaW5nfG51bGwpO1xuXG4gICAgLyoqIE1ldGFJbmZvRGVmIHRlbnNvcmZsb3dHaXRWZXJzaW9uICovXG4gICAgdGVuc29yZmxvd0dpdFZlcnNpb24/OiAoc3RyaW5nfG51bGwpO1xuICB9XG59XG5cbi8qKiBQcm9wZXJ0aWVzIG9mIGEgU2F2ZWRNb2RlbC4gKi9cbmV4cG9ydCBkZWNsYXJlIGludGVyZmFjZSBJU2F2ZWRNb2RlbCB7XG4gIC8qKiBTYXZlZE1vZGVsIHNhdmVkTW9kZWxTY2hlbWFWZXJzaW9uICovXG4gIHNhdmVkTW9kZWxTY2hlbWFWZXJzaW9uPzogKG51bWJlcnxzdHJpbmd8bnVsbCk7XG5cbiAgLyoqIFNhdmVkTW9kZWwgbWV0YUdyYXBocyAqL1xuICBtZXRhR3JhcGhzPzogKElNZXRhR3JhcGhEZWZbXXxudWxsKTtcbn1cblxuLyoqIFByb3BlcnRpZXMgb2YgYSBGdW5jdGlvbkRlZkxpYnJhcnkuICovXG5leHBvcnQgZGVjbGFyZSBpbnRlcmZhY2UgSUZ1bmN0aW9uRGVmTGlicmFyeSB7XG4gIC8qKiBGdW5jdGlvbkRlZkxpYnJhcnkgZnVuY3Rpb24gKi9cbiAgJ2Z1bmN0aW9uJz86IChJRnVuY3Rpb25EZWZbXXxudWxsKTtcblxuICAvKiogRnVuY3Rpb25EZWZMaWJyYXJ5IGdyYWRpZW50ICovXG4gIGdyYWRpZW50PzogKElHcmFkaWVudERlZltdfG51bGwpO1xufVxuXG4vKiogUHJvcGVydGllcyBvZiBhIEZ1bmN0aW9uRGVmLiAqL1xuZXhwb3J0IGRlY2xhcmUgaW50ZXJmYWNlIElGdW5jdGlvbkRlZiB7XG4gIC8qKiBGdW5jdGlvbkRlZiBzaWduYXR1cmUgKi9cbiAgc2lnbmF0dXJlPzogKElPcERlZnxudWxsKTtcblxuICAvKiogRnVuY3Rpb25EZWYgYXR0ciAqL1xuICBhdHRyPzogKHtbazogc3RyaW5nXTogSUF0dHJWYWx1ZX18bnVsbCk7XG5cbiAgLyoqIEZ1bmN0aW9uRGVmIG5vZGVEZWYgKi9cbiAgbm9kZURlZj86IChJTm9kZURlZltdfG51bGwpO1xuXG4gIC8qKiBGdW5jdGlvbkRlZiByZXQgKi9cbiAgcmV0PzogKHtbazogc3RyaW5nXTogc3RyaW5nfXxudWxsKTtcbn1cblxuLyoqIFByb3BlcnRpZXMgb2YgYSBHcmFkaWVudERlZi4gKi9cbmV4cG9ydCBkZWNsYXJlIGludGVyZmFjZSBJR3JhZGllbnREZWYge1xuICAvKiogR3JhZGllbnREZWYgZnVuY3Rpb25OYW1lICovXG4gIGZ1bmN0aW9uTmFtZT86IChzdHJpbmd8bnVsbCk7XG5cbiAgLyoqIEdyYWRpZW50RGVmIGdyYWRpZW50RnVuYyAqL1xuICBncmFkaWVudEZ1bmM/OiAoc3RyaW5nfG51bGwpO1xufVxuIl19","/**\n * @license\n * Copyright 2021 Google LLC. All Rights Reserved.\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n * =============================================================================\n */\nimport { env } from '@tensorflow/tfjs-core';\nconst ENV = env();\n/** Whether to keep intermediate tensors. */\nENV.registerFlag('KEEP_INTERMEDIATE_TENSORS', () => false, debugValue => {\n if (debugValue) {\n console.warn('Keep intermediate tensors is ON. This will print the values of all ' +\n 'intermediate tensors during model inference. Not all models ' +\n 'support this mode. For details, check e2e/benchmarks/ ' +\n 'model_config.js. This significantly impacts performance.');\n }\n});\n//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZmxhZ3MuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi90ZmpzLWNvbnZlcnRlci9zcmMvZmxhZ3MudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUE7Ozs7Ozs7Ozs7Ozs7OztHQWVHO0FBRUgsT0FBTyxFQUFDLEdBQUcsRUFBQyxNQUFNLHVCQUF1QixDQUFDO0FBRTFDLE1BQU0sR0FBRyxHQUFHLEdBQUcsRUFBRSxDQUFDO0FBRWxCLDRDQUE0QztBQUM1QyxHQUFHLENBQUMsWUFBWSxDQUFDLDJCQUEyQixFQUFFLEdBQUcsRUFBRSxDQUFDLEtBQUssRUFBRSxVQUFVLENBQUMsRUFBRTtJQUN0RSxJQUFJLFVBQVUsRUFBRTtRQUNkLE9BQU8sQ0FBQyxJQUFJLENBQ1IscUVBQXFFO1lBQ3JFLDhEQUE4RDtZQUM5RCx3REFBd0Q7WUFDeEQsMERBQTBELENBQUMsQ0FBQztLQUNqRTtBQUNILENBQUMsQ0FBQyxDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiLyoqXG4gKiBAbGljZW5zZVxuICogQ29weXJpZ2h0IDIwMjEgR29vZ2xlIExMQy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC5cbiAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSBcIkxpY2Vuc2VcIik7XG4gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuXG4gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXRcbiAqXG4gKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjBcbiAqXG4gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlXG4gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiBcIkFTIElTXCIgQkFTSVMsXG4gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC5cbiAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmRcbiAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLlxuICogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbiAqL1xuXG5pbXBvcnQge2Vudn0gZnJvbSAnQHRlbnNvcmZsb3cvdGZqcy1jb3JlJztcblxuY29uc3QgRU5WID0gZW52KCk7XG5cbi8qKiBXaGV0aGVyIHRvIGtlZXAgaW50ZXJtZWRpYXRlIHRlbnNvcnMuICovXG5FTlYucmVnaXN0ZXJGbGFnKCdLRUVQX0lOVEVSTUVESUFURV9URU5TT1JTJywgKCkgPT4gZmFsc2UsIGRlYnVnVmFsdWUgPT4ge1xuICBpZiAoZGVidWdWYWx1ZSkge1xuICAgIGNvbnNvbGUud2FybihcbiAgICAgICAgJ0tlZXAgaW50ZXJtZWRpYXRlIHRlbnNvcnMgaXMgT04uIFRoaXMgd2lsbCBwcmludCB0aGUgdmFsdWVzIG9mIGFsbCAnICtcbiAgICAgICAgJ2ludGVybWVkaWF0ZSB0ZW5zb3JzIGR1cmluZyBtb2RlbCBpbmZlcmVuY2UuIE5vdCBhbGwgbW9kZWxzICcgK1xuICAgICAgICAnc3VwcG9ydCB0aGlzIG1vZGUuIEZvciBkZXRhaWxzLCBjaGVjayBlMmUvYmVuY2htYXJrcy8gJyArXG4gICAgICAgICdtb2RlbF9jb25maWcuanMuIFRoaXMgc2lnbmlmaWNhbnRseSBpbXBhY3RzIHBlcmZvcm1hbmNlLicpO1xuICB9XG59KTtcbiJdfQ==","/**\n * @license\n * Copyright 2019 Google LLC. All Rights Reserved.\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n * =============================================================================\n */\nconst CUSTOM_OPS = {};\n/**\n * Register an Op for graph model executor. This allows you to register\n * TensorFlow custom op or override existing op.\n *\n * Here is an example of registering a new MatMul Op.\n * ```js\n * const customMatmul = (node) =>\n * tf.matMul(\n * node.inputs[0], node.inputs[1],\n * node.attrs['transpose_a'], node.attrs['transpose_b']);\n *\n * tf.registerOp('MatMul', customMatmul);\n * ```\n * The inputs and attrs of the node object are based on the TensorFlow op\n * registry.\n *\n * @param name The Tensorflow Op name.\n * @param opFunc An op function which is called with the current graph node\n * during execution and needs to return a tensor or a list of tensors. The node\n * has the following attributes:\n * - attr: A map from attribute name to its value\n * - inputs: A list of input tensors\n *\n * @doc {heading: 'Models', subheading: 'Op Registry'}\n */\nexport function registerOp(name, opFunc) {\n const opMapper = {\n tfOpName: name,\n category: 'custom',\n inputs: [],\n attrs: [],\n customExecutor: opFunc\n };\n CUSTOM_OPS[name] = opMapper;\n}\n/**\n * Retrieve the OpMapper object for the registered op.\n *\n * @param name The Tensorflow Op name.\n *\n * @doc {heading: 'Models', subheading: 'Op Registry'}\n */\nexport function getRegisteredOp(name) {\n return CUSTOM_OPS[name];\n}\n/**\n * Deregister the Op for graph model executor.\n *\n * @param name The Tensorflow Op name.\n *\n * @doc {heading: 'Models', subheading: 'Op Registry'}\n */\nexport function deregisterOp(name) {\n delete CUSTOM_OPS[name];\n}\n//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicmVnaXN0ZXIuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi8uLi8uLi90ZmpzLWNvbnZlcnRlci9zcmMvb3BlcmF0aW9ucy9jdXN0b21fb3AvcmVnaXN0ZXIudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQ0E7Ozs7Ozs7Ozs7Ozs7OztHQWVHO0FBSUgsTUFBTSxVQUFVLEdBQThCLEVBQUUsQ0FBQztBQUVqRDs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7O0dBd0JHO0FBQ0gsTUFBTSxVQUFVLFVBQVUsQ0FBQyxJQUFZLEVBQUUsTUFBa0I7SUFDekQsTUFBTSxRQUFRLEdBQWE7UUFDekIsUUFBUSxFQUFFLElBQUk7UUFDZCxRQUFRLEVBQUUsUUFBUTtRQUNsQixNQUFNLEVBQUUsRUFBRTtRQUNWLEtBQUssRUFBRSxFQUFFO1FBQ1QsY0FBYyxFQUFFLE1BQU07S0FDdkIsQ0FBQztJQUVGLFVBQVUsQ0FBQyxJQUFJLENBQUMsR0FBRyxRQUFRLENBQUM7QUFDOUIsQ0FBQztBQUVEOzs7Ozs7R0FNRztBQUNILE1BQU0sVUFBVSxlQUFlLENBQUMsSUFBWTtJQUMxQyxPQUFPLFVBQVUsQ0FBQyxJQUFJLENBQUMsQ0FBQztBQUMxQixDQUFDO0FBRUQ7Ozs7OztHQU1HO0FBQ0gsTUFBTSxVQUFVLFlBQVksQ0FBQyxJQUFZO0lBQ3ZDLE9BQU8sVUFBVSxDQUFDLElBQUksQ0FBQyxDQUFDO0FBQzFCLENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyJcbi8qKlxuICogQGxpY2Vuc2VcbiAqIENvcHlyaWdodCAyMDE5IEdvb2dsZSBMTEMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuXG4gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgXCJMaWNlbnNlXCIpO1xuICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLlxuICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0XG4gKlxuICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wXG4gKlxuICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZVxuICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gXCJBUyBJU1wiIEJBU0lTLFxuICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuXG4gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kXG4gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS5cbiAqID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4gKi9cblxuaW1wb3J0IHtPcEV4ZWN1dG9yLCBPcE1hcHBlcn0gZnJvbSAnLi4vdHlwZXMnO1xuXG5jb25zdCBDVVNUT01fT1BTOiB7W2tleTogc3RyaW5nXTogT3BNYXBwZXJ9ID0ge307XG5cbi8qKlxuICogUmVnaXN0ZXIgYW4gT3AgZm9yIGdyYXBoIG1vZGVsIGV4ZWN1dG9yLiBUaGlzIGFsbG93cyB5b3UgdG8gcmVnaXN0ZXJcbiAqIFRlbnNvckZsb3cgY3VzdG9tIG9wIG9yIG92ZXJyaWRlIGV4aXN0aW5nIG9wLlxuICpcbiAqIEhlcmUgaXMgYW4gZXhhbXBsZSBvZiByZWdpc3RlcmluZyBhIG5ldyBNYXRNdWwgT3AuXG4gKiBgYGBqc1xuICogY29uc3QgY3VzdG9tTWF0bXVsID0gKG5vZGUpID0+XG4gKiAgICB0Zi5tYXRNdWwoXG4gKiAgICAgICAgbm9kZS5pbnB1dHNbMF0sIG5vZGUuaW5wdXRzWzFdLFxuICogICAgICAgIG5vZGUuYXR0cnNbJ3RyYW5zcG9zZV9hJ10sIG5vZGUuYXR0cnNbJ3RyYW5zcG9zZV9iJ10pO1xuICpcbiAqIHRmLnJlZ2lzdGVyT3AoJ01hdE11bCcsIGN1c3RvbU1hdG11bCk7XG4gKiBgYGBcbiAqIFRoZSBpbnB1dHMgYW5kIGF0dHJzIG9mIHRoZSBub2RlIG9iamVjdCBhcmUgYmFzZWQgb24gdGhlIFRlbnNvckZsb3cgb3BcbiAqIHJlZ2lzdHJ5LlxuICpcbiAqIEBwYXJhbSBuYW1lIFRoZSBUZW5zb3JmbG93IE9wIG5hbWUuXG4gKiBAcGFyYW0gb3BGdW5jIEFuIG9wIGZ1bmN0aW9uIHdoaWNoIGlzIGNhbGxlZCB3aXRoIHRoZSBjdXJyZW50IGdyYXBoIG5vZGVcbiAqIGR1cmluZyBleGVjdXRpb24gYW5kIG5lZWRzIHRvIHJldHVybiBhIHRlbnNvciBvciBhIGxpc3Qgb2YgdGVuc29ycy4gVGhlIG5vZGVcbiAqIGhhcyB0aGUgZm9sbG93aW5nIGF0dHJpYnV0ZXM6XG4gKiAgICAtIGF0dHI6IEEgbWFwIGZyb20gYXR0cmlidXRlIG5hbWUgdG8gaXRzIHZhbHVlXG4gKiAgICAtIGlucHV0czogQSBsaXN0IG9mIGlucHV0IHRlbnNvcnNcbiAqXG4gKiBAZG9jIHtoZWFkaW5nOiAnTW9kZWxzJywgc3ViaGVhZGluZzogJ09wIFJlZ2lzdHJ5J31cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHJlZ2lzdGVyT3AobmFtZTogc3RyaW5nLCBvcEZ1bmM6IE9wRXhlY3V0b3IpIHtcbiAgY29uc3Qgb3BNYXBwZXI6IE9wTWFwcGVyID0ge1xuICAgIHRmT3BOYW1lOiBuYW1lLFxuICAgIGNhdGVnb3J5OiAnY3VzdG9tJyxcbiAgICBpbnB1dHM6IFtdLFxuICAgIGF0dHJzOiBbXSxcbiAgICBjdXN0b21FeGVjdXRvcjogb3BGdW5jXG4gIH07XG5cbiAgQ1VTVE9NX09QU1tuYW1lXSA9IG9wTWFwcGVyO1xufVxuXG4vKipcbiAqIFJldHJpZXZlIHRoZSBPcE1hcHBlciBvYmplY3QgZm9yIHRoZSByZWdpc3RlcmVkIG9wLlxuICpcbiAqIEBwYXJhbSBuYW1lIFRoZSBUZW5zb3JmbG93IE9wIG5hbWUuXG4gKlxuICogQGRvYyB7aGVhZGluZzogJ01vZGVscycsIHN1YmhlYWRpbmc6ICdPcCBSZWdpc3RyeSd9XG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBnZXRSZWdpc3RlcmVkT3AobmFtZTogc3RyaW5nKTogT3BNYXBwZXIge1xuICByZXR1cm4gQ1VTVE9NX09QU1tuYW1lXTtcbn1cblxuLyoqXG4gKiBEZXJlZ2lzdGVyIHRoZSBPcCBmb3IgZ3JhcGggbW9kZWwgZXhlY3V0b3IuXG4gKlxuICogQHBhcmFtIG5hbWUgVGhlIFRlbnNvcmZsb3cgT3AgbmFtZS5cbiAqXG4gKiBAZG9jIHtoZWFkaW5nOiAnTW9kZWxzJywgc3ViaGVhZGluZzogJ09wIFJlZ2lzdHJ5J31cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGRlcmVnaXN0ZXJPcChuYW1lOiBzdHJpbmcpIHtcbiAgZGVsZXRlIENVU1RPTV9PUFNbbmFtZV07XG59XG4iXX0=","/**\n * @license\n * Copyright 2018 Google LLC. All Rights Reserved.\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n * =============================================================================\n */\nimport { clone, util } from '@tensorflow/tfjs-core';\nexport function getParamValue(paramName, node, tensorMap, context, resourceManager) {\n const inputParam = node.inputParams[paramName];\n if (inputParam && inputParam.inputIndexStart !== undefined) {\n const start = inputParam.inputIndexStart;\n const end = inputParam.inputIndexEnd === 0 ?\n undefined :\n (inputParam.inputIndexEnd === undefined ? start + 1 :\n inputParam.inputIndexEnd);\n if (inputParam.type === 'tensor') {\n return getTensor(node.inputNames[inputParam.inputIndexStart], tensorMap, context, resourceManager);\n }\n if (inputParam.type === 'tensors') {\n const inputs = node.inputNames.slice(start, end);\n return inputs.map(name => getTensor(name, tensorMap, context, resourceManager));\n }\n const tensor = getTensor(node.inputNames.slice(start)[0], tensorMap, context, resourceManager);\n const data = tensor.dataSync();\n return inputParam.type === 'number' ?\n data[0] :\n util.toNestedArray(tensor.shape, data);\n }\n const attrParam = node.attrParams[paramName];\n return attrParam && attrParam.value;\n}\n/**\n * Retrieve the tensor from tensorsMap based on input name.\n * @param name Node input name\n * @param tensorsMap Tensors map keyed by the node\n * @param context contains tensors and information for running the current node.\n * @param resourceManager Optional. Contains global resources of the model.\n */\nexport function getTensor(name, tensorsMap, context, resourceManager) {\n const [nodeName, index] = parseNodeName(name);\n if (resourceManager != null) {\n const tensor = resourceManager.getHashTableHandleByName(nodeName);\n if (tensor != null) {\n return tensor;\n }\n }\n const contextId = context.currentContextIds.find(contextId => {\n return !!tensorsMap[getNodeNameWithContextId(nodeName, contextId)];\n });\n return contextId !== undefined ?\n tensorsMap[getNodeNameWithContextId(nodeName, contextId)][index] :\n undefined;\n}\n/**\n * Retrieve the tensors based on input name for current context.\n * @param name Node input name\n * @param tensorsMap Tensors map keyed by the node\n */\nexport function getTensorsForCurrentContenxt(name, tensorsMap, context) {\n return tensorsMap[getNodeNameWithContextId(name, context.currentContextId)];\n}\n/**\n * Returns the node name, outputName and index from the Node input name.\n * @param inputName The input name of the node, in format of\n * node_name:output_index, i.e. MatMul:0, if the output_index is not set, it is\n * default to 0.\n * If the input name contains output name i.e. StringSplit:indices:0, it will\n * return ['StringSplit', 0, 'indices'].\n */\nexport function getNodeNameAndIndex(inputName, context) {\n const [nodeName, index, outputName] = parseNodeName(inputName);\n return [\n getNodeNameWithContextId(nodeName, context && context.currentContextId),\n index, outputName\n ];\n}\nfunction getNodeNameWithContextId(name, contextId) {\n return !!contextId ? `${name}-${contextId}` : name;\n}\nexport function parseNodeName(name) {\n const parts = name.split(':');\n if (parts.length === 1) {\n return [name, 0, undefined];\n }\n const nodeName = parts[0];\n const outputName = parts.length === 3 ? parts[1] : undefined;\n const index = Number(parts[parts.length - 1]);\n return [nodeName, index, outputName];\n}\nexport function split(arr, size) {\n const res = [];\n for (let i = 0; i < arr.length; i += size) {\n res.push(arr.slice(i, i + size));\n }\n return res;\n}\nexport function getPadding(node, tensorMap, context) {\n let pad = getParamValue('pad', node, tensorMap, context);\n if (pad === 'explicit') {\n // This is 1d array, we need to convert it to 2d array\n pad = getParamValue('explicitPaddings', node, tensorMap, context);\n const explicitPadding = [[0, 0], [0, 0], [0, 0], [0, 0]];\n for (let i = 0; i < 4; i++) {\n explicitPadding[i][0] = pad[i * 2];\n explicitPadding[i][1] = pad[i * 2 + 1];\n }\n return explicitPadding;\n }\n return pad;\n}\n/**\n * Reuse the tensor if it is marked as keep, otherwise clone the tensor to\n * avoid disposal. This is important for TensorArray and TensorList ops, since\n * internally they use a tensor as the id for TensorArray and TensorList, and\n * to simplify lookup, they also use Tensor.id as the key to the internal map.\n * These id tensors have been marked as kept in the backend, we need avoid clone\n * them in order to create new Tensor.id.\n * @param tensor\n */\nexport function cloneTensor(tensor) {\n return tensor.kept ? tensor : clone(tensor);\n}\n//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidXRpbHMuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi8uLi8uLi90ZmpzLWNvbnZlcnRlci9zcmMvb3BlcmF0aW9ucy9leGVjdXRvcnMvdXRpbHMudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUE7Ozs7Ozs7Ozs7Ozs7OztHQWVHO0FBRUgsT0FBTyxFQUFDLEtBQUssRUFBVSxJQUFJLEVBQUMsTUFBTSx1QkFBdUIsQ0FBQztBQU8xRCxNQUFNLFVBQVUsYUFBYSxDQUN6QixTQUFpQixFQUFFLElBQVUsRUFBRSxTQUEwQixFQUN6RCxPQUF5QixFQUFFLGVBQWlDO0lBQzlELE1BQU0sVUFBVSxHQUFHLElBQUksQ0FBQyxXQUFXLENBQUMsU0FBUyxDQUFDLENBQUM7SUFDL0MsSUFBSSxVQUFVLElBQUksVUFBVSxDQUFDLGVBQWUsS0FBSyxTQUFTLEVBQUU7UUFDMUQsTUFBTSxLQUFLLEdBQUcsVUFBVSxDQUFDLGVBQWUsQ0FBQztRQUN6QyxNQUFNLEdBQUcsR0FBRyxVQUFVLENBQUMsYUFBYSxLQUFLLENBQUMsQ0FBQyxDQUFDO1lBQ3hDLFNBQVMsQ0FBQyxDQUFDO1lBQ1gsQ0FBQyxVQUFVLENBQUMsYUFBYSxLQUFLLFNBQVMsQ0FBQyxDQUFDLENBQUMsS0FBSyxHQUFHLENBQUMsQ0FBQyxDQUFDO2dCQUNYLFVBQVUsQ0FBQyxhQUFhLENBQUMsQ0FBQztRQUN4RSxJQUFJLFVBQVUsQ0FBQyxJQUFJLEtBQUssUUFBUSxFQUFFO1lBQ2hDLE9BQU8sU0FBUyxDQUNaLElBQUksQ0FBQyxVQUFVLENBQUMsVUFBVSxDQUFDLGVBQWUsQ0FBQyxFQUFFLFNBQVMsRUFBRSxPQUFPLEVBQy9ELGVBQWUsQ0FBQyxDQUFDO1NBQ3RCO1FBQ0QsSUFBSSxVQUFVLENBQUMsSUFBSSxLQUFLLFNBQVMsRUFBRTtZQUNqQyxNQUFNLE1BQU0sR0FBRyxJQUFJLENBQUMsVUFBVSxDQUFDLEtBQUssQ0FBQyxLQUFLLEVBQUUsR0FBRyxDQUFDLENB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QU0sZUFBZSxHQUVqQixDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUM7UUFDckMsS0FBSyxJQUFJLENBQUMsR0FBRyxDQUFDLEVBQUUsQ0FBQyxHQUFHLENBQUMsRUFBRSxDQUFDLEVBQUUsRUFBRTtZQUMxQixlQUFlLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLEdBQUksR0FBZ0IsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUM7WUFDakQsZUFBZSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxHQUFJLEdBQWdCLENBQUMsQ0FBQyxHQUFHLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQztTQUN0RDtRQUNELE9BQU8sZUFBZSxDQUFDO0tBQ3hCO0lBQ0QsT0FBTyxHQUFHLENBQUM7QUFDYixDQUFDO0FBRUQ7Ozs7Ozs7O0dBUUc7QUFDSCxNQUFNLFVBQVUsV0FBVyxDQUFDLE1BQWM7SUFDeEMsT0FBTyxNQUFNLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxNQUFNLENBQUMsQ0FBQyxDQUFDLEtBQUssQ0FBQyxNQUFNLENBQUMsQ0FBQztBQUM5QyxDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiLyoqXG4gKiBAbGljZW5zZVxuICogQ29weXJpZ2h0IDIwMTggR29vZ2xlIExMQy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC5cbiAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSBcIkxpY2Vuc2VcIik7XG4gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuXG4gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXRcbiAqXG4gKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjBcbiAqXG4gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlXG4gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiBcIkFTIElTXCIgQkFTSVMsXG4gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC5cbiAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmRcbiAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLlxuICogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbiAqL1xuXG5pbXBvcnQge2Nsb25lLCBUZW5zb3IsIHV0aWx9IGZyb20gJ0B0ZW5zb3JmbG93L3RmanMtY29yZSc7XG5cbmltcG9ydCB7TmFtZWRUZW5zb3JzTWFwfSBmcm9tICcuLi8uLi9kYXRhL3R5cGVzJztcbmltcG9ydCB7RXhlY3V0aW9uQ29udGV4dH0gZnJvbSAnLi4vLi4vZXhlY3V0b3IvZXhlY3V0aW9uX2NvbnRleHQnO1xuaW1wb3J0IHtSZXNvdXJjZU1hbmFnZXJ9IGZyb20gJy4uLy4uL2V4ZWN1dG9yL3Jlc291cmNlX21hbmFnZXInO1xuaW1wb3J0IHtOb2RlLCBWYWx1ZVR5cGV9IGZyb20gJy4uL3R5cGVzJztcblxuZXhwb3J0IGZ1bmN0aW9uIGdldFBhcmFtVmFsdWUoXG4gICAgcGFyYW1OYW1lOiBzdHJpbmcsIG5vZGU6IE5vZGUsIHRlbnNvck1hcDogTmFtZWRUZW5zb3JzTWFwLFxuICAgIGNvbnRleHQ6IEV4ZWN1dGlvbkNvbnRleHQsIHJlc291cmNlTWFuYWdlcj86IFJlc291cmNlTWFuYWdlcik6IFZhbHVlVHlwZSB7XG4gIGNvbnN0IGlucHV0UGFyYW0gPSBub2RlLmlucHV0UGFyYW1zW3BhcmFtTmFtZV07XG4gIGlmIChpbnB1dFBhcmFtICYmIGlucHV0UGFyYW0uaW5wdXRJbmRleFN0YXJ0ICE9PSB1bmRlZmluZWQpIHtcbiAgICBjb25zdCBzdGFydCA9IGlucHV0UGFyYW0uaW5wdXRJbmRleFN0YXJ0O1xuICAgIGNvbnN0IGVuZCA9IGlucHV0UGFyYW0uaW5wdXRJbmRleEVuZCA9PT0gMCA/XG4gICAgICAgIHVuZGVmaW5lZCA6XG4gICAgICAgIChpbnB1dFBhcmFtLmlucHV0SW5kZXhFbmQgPT09IHVuZGVmaW5lZCA/IHN0YXJ0ICsgMSA6XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlucHV0UGFyYW0uaW5wdXRJbmRleEVuZCk7XG4gICAgaWYgKGlucHV0UGFyYW0udHlwZSA9PT0gJ3RlbnNvcicpIHtcbiAgICAgIHJldHVybiBnZXRUZW5zb3IoXG4gICAgICAgICAgbm9kZS5pbnB1dE5hbWVzW2lucHV0UGFyYW0uaW5wdXRJbmRleFN0YXJ0XSwgdGVuc29yTWFwLCBjb250ZXh0LFxuICAgICAgICAgIHJlc291cmNlTWFuYWdlcik7XG4gICAgfVxuICAgIGlmIChpbnB1dFBhcmFtLnR5cGUgPT09ICd0ZW5zb3JzJykge1xuICAgICAgY29uc3QgaW5wdXRzID0gbm9kZS5pbnB1dE5hbWVzLnNsaWNlKHN0YXJ0LCBlbmQpO1xuXG4gICAgICByZXR1cm4gaW5wdXRzLm1hcChcbiAgICAgICAgICBuYW1lID0+IGdldFRlbnNvcihuYW1lLCB0ZW5zb3JNYXAsIGNvbnRleHQsIHJlc291cmNlTWFuYWdlcikpO1xuICAgIH1cbiAgICBjb25zdCB0ZW5zb3IgPSBnZXRUZW5zb3IoXG4gICAgICAgIG5vZGUuaW5wdXROYW1lcy5zbGljZShzdGFydClbMF0sIHRlbnNvck1hcCwgY29udGV4dCwgcmVzb3VyY2VNYW5hZ2VyKTtcbiAgICBjb25zdCBkYXRhID0gdGVuc29yLmRhdGFTeW5jKCk7XG4gICAgcmV0dXJuIGlucHV0UGFyYW0udHlwZSA9PT0gJ251bWJlcicgP1xuICAgICAgICBkYXRhWzBdIDpcbiAgICAgICAgdXRpbC50b05lc3RlZEFycmF5KHRlbnNvci5zaGFwZSwgZGF0YSk7XG4gIH1cbiAgY29uc3QgYXR0clBhcmFtID0gbm9kZS5hdHRyUGFyYW1zW3BhcmFtTmFtZV07XG4gIHJldHVybiBhdHRyUGFyYW0gJiYgYXR0clBhcmFtLnZhbHVlO1xufVxuXG4vKipcbiAqIFJldHJpZXZlIHRoZSB0ZW5zb3IgZnJvbSB0ZW5zb3JzTWFwIGJhc2VkIG9uIGlucHV0IG5hbWUuXG4gKiBAcGFyYW0gbmFtZSBOb2RlIGlucHV0IG5hbWVcbiAqIEBwYXJhbSB0ZW5zb3JzTWFwIFRlbnNvcnMgbWFwIGtleWVkIGJ5IHRoZSBub2RlXG4gKiBAcGFyYW0gY29udGV4dCBjb250YWlucyB0ZW5zb3JzIGFuZCBpbmZvcm1hdGlvbiBmb3IgcnVubmluZyB0aGUgY3VycmVudCBub2RlLlxuICogQHBhcmFtIHJlc291cmNlTWFuYWdlciBPcHRpb25hbC4gQ29udGFpbnMgZ2xvYmFsIHJlc291cmNlcyBvZiB0aGUgbW9kZWwuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBnZXRUZW5zb3IoXG4gICAgbmFtZTogc3RyaW5nLCB0ZW5zb3JzTWFwOiBOYW1lZFRlbnNvcnNNYXAsIGNvbnRleHQ6IEV4ZWN1dGlvbkNvbnRleHQsXG4gICAgcmVzb3VyY2VNYW5hZ2VyPzogUmVzb3VyY2VNYW5hZ2VyKTogVGVuc29yIHtcbiAgY29uc3QgW25vZGVOYW1lLCBpbmRleF0gPSBwYXJzZU5vZGVOYW1lKG5hbWUpO1xuXG4gIGlmIChyZXNvdXJjZU1hbmFnZXIgIT0gbnVsbCkge1xuICAgIGNvbnN0IHRlbnNvciA9IHJlc291cmNlTWFuYWdlci5nZXRIYXNoVGFibGVIYW5kbGVCeU5hbWUobm9kZU5hbWUpO1xuICAgIGlmICh0ZW5zb3IgIT0gbnVsbCkge1xuICAgICAgcmV0dXJuIHRlbnNvcjtcbiAgICB9XG4gIH1cblxuICBjb25zdCBjb250ZXh0SWQgPSBjb250ZXh0LmN1cnJlbnRDb250ZXh0SWRzLmZpbmQoY29udGV4dElkID0+IHtcbiAgICByZXR1cm4gISF0ZW5zb3JzTWFwW2dldE5vZGVOYW1lV2l0aENvbnRleHRJZChub2RlTmFtZSwgY29udGV4dElkKV07XG4gIH0pO1xuXG4gIHJldHVybiBjb250ZXh0SWQgIT09IHVuZGVmaW5lZCA/XG4gICAgICB0ZW5zb3JzTWFwW2dldE5vZGVOYW1lV2l0aENvbnRleHRJZChub2RlTmFtZSwgY29udGV4dElkKV1baW5kZXhdIDpcbiAgICAgIHVuZGVmaW5lZDtcbn1cblxuLyoqXG4gKiBSZXRyaWV2ZSB0aGUgdGVuc29ycyBiYXNlZCBvbiBpbnB1dCBuYW1lIGZvciBjdXJyZW50IGNvbnRleHQuXG4gKiBAcGFyYW0gbmFtZSBOb2RlIGlucHV0IG5hbWVcbiAqIEBwYXJhbSB0ZW5zb3JzTWFwIFRlbnNvcnMgbWFwIGtleWVkIGJ5IHRoZSBub2RlXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBnZXRUZW5zb3JzRm9yQ3VycmVudENvbnRlbnh0KFxuICAgIG5hbWU6IHN0cmluZywgdGVuc29yc01hcDogTmFtZWRUZW5zb3JzTWFwLFxuICAgIGNvbnRleHQ6IEV4ZWN1dGlvbkNvbnRleHQpOiBUZW5zb3JbXSB7XG4gIHJldHVybiB0ZW5zb3JzTWFwW2dldE5vZGVOYW1lV2l0aENvbnRleHRJZChuYW1lLCBjb250ZXh0LmN1cnJlbnRDb250ZXh0SWQpXTtcbn1cblxuLyoqXG4gKiBSZXR1cm5zIHRoZSBub2RlIG5hbWUsIG91dHB1dE5hbWUgYW5kIGluZGV4IGZyb20gdGhlIE5vZGUgaW5wdXQgbmFtZS5cbiAqIEBwYXJhbSBpbnB1dE5hbWUgVGhlIGlucHV0IG5hbWUgb2YgdGhlIG5vZGUsIGluIGZvcm1hdCBvZlxuICogbm9kZV9uYW1lOm91dHB1dF9pbmRleCwgaS5lLiBNYXRNdWw6MCwgaWYgdGhlIG91dHB1dF9pbmRleCBpcyBub3Qgc2V0LCBpdCBpc1xuICogZGVmYXVsdCB0byAwLlxuICogSWYgdGhlIGlucHV0IG5hbWUgY29udGFpbnMgb3V0cHV0IG5hbWUgaS5lLiBTdHJpbmdTcGxpdDppbmRpY2VzOjAsIGl0IHdpbGxcbiAqIHJldHVybiBbJ1N0cmluZ1NwbGl0JywgMCwgJ2luZGljZXMnXS5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGdldE5vZGVOYW1lQW5kSW5kZXgoXG4gICAgaW5wdXROYW1lOiBzdHJpbmcsIGNvbnRleHQ/OiBFeGVjdXRpb25Db250ZXh0KTogW3N0cmluZywgbnVtYmVyLCBzdHJpbmddIHtcbiAgY29uc3QgW25vZGVOYW1lLCBpbmRleCwgb3V0cHV0TmFtZV0gPSBwYXJzZU5vZGVOYW1lKGlucHV0TmFtZSk7XG5cbiAgcmV0dXJuIFtcbiAgICBnZXROb2RlTmFtZVdpdGhDb250ZXh0SWQobm9kZU5hbWUsIGNvbnRleHQgJiYgY29udGV4dC5jdXJyZW50Q29udGV4dElkKSxcbiAgICBpbmRleCwgb3V0cHV0TmFtZVxuICBdO1xufVxuXG5mdW5jdGlvbiBnZXROb2RlTmFtZVdpdGhDb250ZXh0SWQobmFtZTogc3RyaW5nLCBjb250ZXh0SWQ/OiBzdHJpbmcpOiBzdHJpbmcge1xuICByZXR1cm4gISFjb250ZXh0SWQgPyBgJHtuYW1lfS0ke2NvbnRleHRJZH1gIDogbmFtZTtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIHBhcnNlTm9kZU5hbWUobmFtZTogc3RyaW5nKTogW3N0cmluZywgbnVtYmVyLCBzdHJpbmddIHtcbiAgY29uc3QgcGFydHMgPSBuYW1lLnNwbGl0KCc6Jyk7XG4gIGlmIChwYXJ0cy5sZW5ndGggPT09IDEpIHtcbiAgICByZXR1cm4gW25hbWUsIDAsIHVuZGVmaW5lZF07XG4gIH1cblxuICBjb25zdCBub2RlTmFtZSA9IHBhcnRzWzBdO1xuICBjb25zdCBvdXRwdXROYW1lID0gcGFydHMubGVuZ3RoID09PSAzID8gcGFydHNbMV0gOiB1bmRlZmluZWQ7XG4gIGNvbnN0IGluZGV4ID0gTnVtYmVyKHBhcnRzW3BhcnRzLmxlbmd0aCAtIDFdKTtcbiAgcmV0dXJuIFtub2RlTmFtZSwgaW5kZXgsIG91dHB1dE5hbWVdO1xufVxuXG5leHBvcnQgZnVuY3Rpb24gc3BsaXQoYXJyOiBudW1iZXJbXSwgc2l6ZTogbnVtYmVyKSB7XG4gIGNvbnN0IHJlcyA9IFtdO1xuICBmb3IgKGxldCBpID0gMDsgaSA8IGFyci5sZW5ndGg7IGkgKz0gc2l6ZSkge1xuICAgIHJlcy5wdXNoKGFyci5zbGljZShpLCBpICsgc2l6ZSkpO1xuICB9XG4gIHJldHVybiByZXM7XG59XG5leHBvcnQgZnVuY3Rpb24gZ2V0UGFkZGluZyhcbiAgICBub2RlOiBOb2RlLCB0ZW5zb3JNYXA6IE5hbWVkVGVuc29yc01hcCxcbiAgICBjb250ZXh0OiBFeGVjdXRpb25Db250ZXh0KTogVmFsdWVUeXBlIHtcbiAgbGV0IHBhZCA9IGdldFBhcmFtVmFsdWUoJ3BhZCcsIG5vZGUsIHRlbnNvck1hcCwgY29udGV4dCk7XG4gIGlmIChwYWQgPT09ICdleHBsaWNpdCcpIHtcbiAgICAvLyBUaGlzIGlzIDFkIGFycmF5LCB3ZSBuZWVkIHRvIGNvbnZlcnQgaXQgdG8gMmQgYXJyYXlcbiAgICBwYWQgPSBnZXRQYXJhbVZhbHVlKCdleHBsaWNpdFBhZGRpbmdzJywgbm9kZSwgdGVuc29yTWFwLCBjb250ZXh0KTtcbiAgICBjb25zdCBleHBsaWNpdFBhZGRpbmc6IFtcbiAgICAgIFtudW1iZXIsIG51bWJlcl0sIFtudW1iZXIsIG51bWJlcl0sIFtudW1iZXIsIG51bWJlcl0sIFtudW1iZXIsIG51bWJlcl1cbiAgICBdID0gW1swLCAwXSwgWzAsIDBdLCBbMCwgMF0sIFswLCAwXV07XG4gICAgZm9yIChsZXQgaSA9IDA7IGkgPCA0OyBpKyspIHtcbiAgICAgIGV4cGxpY2l0UGFkZGluZ1tpXVswXSA9IChwYWQgYXMgbnVtYmVyW10pW2kgKiAyXTtcbiAgICAgIGV4cGxpY2l0UGFkZGluZ1tpXVsxXSA9IChwYWQgYXMgbnVtYmVyW10pW2kgKiAyICsgMV07XG4gICAgfVxuICAgIHJldHVybiBleHBsaWNpdFBhZGRpbmc7XG4gIH1cbiAgcmV0dXJuIHBhZDtcbn1cblxuLyoqXG4gKiAgUmV1c2UgdGhlIHRlbnNvciBpZiBpdCBpcyBtYXJrZWQgYXMga2VlcCwgb3RoZXJ3aXNlIGNsb25lIHRoZSB0ZW5zb3IgdG9cbiAqICBhdm9pZCBkaXNwb3NhbC4gVGhpcyBpcyBpbXBvcnRhbnQgZm9yIFRlbnNvckFycmF5IGFuZCBUZW5zb3JMaXN0IG9wcywgc2luY2VcbiAqICBpbnRlcm5hbGx5IHRoZXkgdXNlIGEgdGVuc29yIGFzIHRoZSBpZCBmb3IgVGVuc29yQXJyYXkgYW5kIFRlbnNvckxpc3QsIGFuZFxuICogdG8gc2ltcGxpZnkgbG9va3VwLCB0aGV5IGFsc28gdXNlIFRlbnNvci5pZCBhcyB0aGUga2V5IHRvIHRoZSBpbnRlcm5hbCBtYXAuXG4gKiBUaGVzZSBpZCB0ZW5zb3JzIGhhdmUgYmVlbiBtYXJrZWQgYXMga2VwdCBpbiB0aGUgYmFja2VuZCwgd2UgbmVlZCBhdm9pZCBjbG9uZVxuICogdGhlbSBpbiBvcmRlciB0byBjcmVhdGUgbmV3IFRlbnNvci5pZC5cbiAqIEBwYXJhbSB0ZW5zb3JcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGNsb25lVGVuc29yKHRlbnNvcjogVGVuc29yKTogVGVuc29yIHtcbiAgcmV0dXJuIHRlbnNvci5rZXB0ID8gdGVuc29yIDogY2xvbmUodGVuc29yKTtcbn1cbiJdfQ==","/**\n * @license\n * Copyright 2022 Google LLC. All Rights Reserved.\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n * =============================================================================\n */\nexport const json = [\n {\n 'tfOpName': 'Add',\n 'category': 'arithmetic',\n 'inputs': [\n {\n 'start': 0,\n 'name': 'a',\n 'type': 'tensor'\n },\n {\n 'start': 1,\n 'name': 'b',\n 'type': 'tensor'\n }\n ],\n 'attrs': [\n {\n 'tfName': 'T',\n 'name': 'dtype',\n 'type': 'dtype',\n 'notSupported': true\n }\n ]\n },\n {\n 'tfOpName': 'AddV2',\n 'category': 'arithmetic',\n 'inputs': [\n {\n 'start': 0,\n 'name': 'a',\n 'type': 'tensor'\n },\n {\n 'start': 1,\n 'name': 'b',\n 'type': 'tensor'\n }\n ],\n 'attrs': [\n {\n 'tfName': 'T',\n 'name': 'dtype',\n 'type': 'dtype',\n 'notSupported': true\n }\n ]\n },\n {\n 'tfOpName': 'AddN',\n 'category': 'arithmetic',\n 'inputs': [\n {\n 'start': 0,\n 'end': 0,\n 'name': 'tensors',\n 'type': 'tensors'\n }\n ]\n },\n {\n 'tfOpName': 'BiasAdd',\n 'category': 'arithmetic',\n 'inputs': [\n {\n 'start': 0,\n 'name': 'a',\n 'type': 'tensor'\n },\n {\n 'start': 1,\n 'name': 'b',\n 'type': 'tensor'\n }\n ],\n 'attrs': [\n {\n 'tfName': 'T',\n 'name': 'dtype',\n 'type': 'dtype',\n 'notSupported': true\n },\n {\n 'tfName': 'data_format',\n 'name': 'dataFormat',\n 'type': 'string',\n 'notSupported': true\n }\n ]\n },\n {\n 'tfOpName': 'Sub',\n 'category': 'arithmetic',\n 'inputs': [\n {\n 'start': 0,\n 'name': 'a',\n 'type': 'tensor'\n },\n {\n 'start': 1,\n 'name': 'b',\n 'type': 'tensor'\n }\n ],\n 'attrs': [\n {\n 'tfName': 'T',\n 'name': 'dtype',\n 'type': 'dtype',\n 'notSupported': true\n }\n ]\n },\n {\n 'tfOpName': 'RealDiv',\n 'category': 'arithmetic',\n 'inputs': [\n {\n 'start': 0,\n 'name': 'a',\n 'type': 'tensor'\n },\n {\n 'start': 1,\n 'name': 'b',\n 'type': 'tensor'\n }\n ],\n 'attrs': [\n {\n 'tfName': 'T',\n 'name': 'dtype',\n 'type': 'dtype',\n 'notSupported': true\n }\n ]\n },\n {\n 'tfOpName': 'Div',\n 'category': 'arithmetic',\n 'inputs': [\n {\n 'start': 0,\n 'name': 'a',\n 'type': 'tensor'\n },\n {\n 'start': 1,\n 'name': 'b',\n 'type': 'tensor'\n }\n ],\n 'attrs': [\n {\n 'tfName': 'T',\n 'name': 'dtype',\n 'type': 'dtype',\n 'notSupported': true\n }\n ]\n },\n {\n 'tfOpName': 'DivNoNan',\n 'category': 'arithmetic',\n 'inputs': [\n {\n 'start': 0,\n 'name': 'a',\n 'type': 'tensor'\n },\n {\n 'start': 1,\n 'name': 'b',\n 'type': 'tensor'\n }\n ],\n 'attrs': [\n {\n 'tfName': 'T',\n 'name': 'dtype',\n 'type': 'dtype',\n 'notSupported': true\n }\n ]\n },\n {\n 'tfOpName': 'FloorDiv',\n 'category': 'arithmetic',\n 'inputs': [\n {\n 'start': 0,\n 'name': 'a',\n 'type': 'tensor'\n },\n {\n 'start': 1,\n 'name': 'b',\n 'type': 'tensor'\n }\n ],\n 'attrs': [\n {\n 'tfName': 'T',\n 'name': 'dtype',\n 'type': 'dtype',\n 'notSupported': true\n }\n ]\n },\n {\n 'tfOpName': 'Mul',\n 'category': 'arithmetic',\n 'inputs': [\n {\n 'start': 0,\n 'name': 'a',\n 'type': 'tensor'\n },\n {\n 'start': 1,\n 'name': 'b',\n 'type': 'tensor'\n }\n ],\n 'attrs': [\n {\n 'tfName': 'T',\n 'name': 'dtype',\n 'type': 'dtype',\n 'notSupported': true\n }\n ]\n },\n {\n 'tfOpName': 'Maximum',\n 'category': 'arithmetic',\n 'inputs': [\n {\n 'start': 0,\n 'name': 'a',\n 'type': 'tensor'\n },\n {\n 'start': 1,\n 'name': 'b',\n 'type': 'tensor'\n }\n ],\n 'attrs': [\n {\n 'tfName': 'T',\n 'name': 'dtype',\n 'type': 'dtype',\n 'notSupported': true\n }\n ]\n },\n {\n 'tfOpName': 'Minimum',\n 'category': 'arithmetic',\n 'inputs': [\n {\n 'start': 0,\n 'name': 'a',\n 'type': 'tensor'\n },\n {\n 'start': 1,\n 'name': 'b',\n 'type': 'tensor'\n }\n ],\n 'attrs': [\n {\n 'tfName': 'T',\n 'name': 'dtype',\n 'type': 'dtype',\n 'notSupported': true\n }\n ]\n },\n {\n 'tfOpName': 'Pow',\n 'category': 'arithmetic',\n 'inputs': [\n {\n 'start': 0,\n 'name': 'a',\n 'type': 'tensor'\n },\n {\n 'start': 1,\n 'name': 'b',\n 'type': 'tensor'\n }\n ],\n 'attrs': [\n {\n 'tfName': 'T',\n 'name': 'dtype',\n 'type': 'dtype',\n 'notSupported': true\n }\n ]\n },\n {\n 'tfOpName': 'SquaredDifference',\n 'category': 'arithmetic',\n 'inputs': [\n {\n 'start': 0,\n 'name': 'a',\n 'type': 'tensor'\n },\n {\n 'start': 1,\n 'name': 'b',\n 'type': 'tensor'\n }\n ],\n 'attrs': [\n {\n 'tfName': 'T',\n 'name': 'dtype',\n 'type': 'dtype',\n 'notSupported': true\n }\n ]\n },\n {\n 'tfOpName': 'Mod',\n 'category': 'arithmetic',\n 'inputs': [\n {\n 'start': 0,\n 'name': 'a',\n 'type': 'tensor'\n },\n {\n 'start': 1,\n 'name': 'b',\n 'type': 'tensor'\n }\n ],\n 'attrs': [\n {\n 'tfName': 'T',\n 'name': 'dtype',\n 'type': 'dtype',\n 'notSupported': true\n }\n ]\n },\n {\n 'tfOpName': 'FloorMod',\n 'category': 'arithmetic',\n 'inputs': [\n {\n 'start': 0,\n 'name': 'a',\n 'type': 'tensor'\n },\n {\n 'start': 1,\n 'name': 'b',\n 'type': 'tensor'\n }\n ],\n 'attrs': [\n {\n 'tfName': 'T',\n 'name': 'dtype',\n 'type': 'dtype',\n 'notSupported': true\n }\n ]\n }\n];\n//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYXJpdGhtZXRpYy5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uLy4uLy4uL3RmanMtY29udmVydGVyL3NyYy9vcGVyYXRpb25zL29wX2xpc3QvYXJpdGhtZXRpYy50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFDQTs7Ozs7Ozs7Ozs7Ozs7O0dBZUc7QUFJSCxNQUFNLENBQUMsTUFBTSxJQUFJLEdBQWU7SUFDOUI7UUFDRSxVQUFVLEVBQUUsS0FBSztRQUNqQixVQUFVLEVBQUUsWUFBWTtRQUN4QixRQUFRLEVBQUU7WUFDUjtnQkFDRSxPQUFPLEVBQUUsQ0FBQztnQkFDVixNQUFNLEVBQUUsR0FBRztnQkFDWCxNQUFNLEVBQUUsUUFBUTthQUNqQjtZQUNEO2dCQUNFLE9BQU8sRUFBRSxDQUFDO2dCQUNWLE1BQU0sRUFBRSxHQUFHO2dCQUNYLE1BQU0sRUFBRSxRQUFRO2FBQ2pCO1NBQ0Y7UUFDRCxPQUFPLEVBQUU7WUFDUDtnQkFDRSxRQUFRLEVBQUUsR0FBRztnQkFDYixNQUFNLEVBQUUsT0FBTztnQkFDZixNQUFNLEVBQUUsT0FBTztnQkFDZixjQUFjLEVBQUUsSUFBSTthQUNyQjtTQUNGO0tBQ0Y7SUFDRDtRQUNFLFVBQVUsRUFBRSxPQUFPO1FBQ25CLFVBQVUsRUFBRSxZQUFZO1FBQ3hCLFFBQVEsRUFBRTtZQUNSO2dCQUNFLE9BQU8sRUFBRSxDQUFDO2dCQUNWLE1BQU0sRUFBRSxHQUFHO2dCQUNYLE1BQU0sRUFBRSxRQUFRO2FBQ2pCO1lBQ0Q7Z0JBQ0UsT0FBTyxFQUFFLENBQUM7Z0JBQ1YsTUFBTSxFQUFFLEdBQUc7Z0JBQ1gsTUFBTSxFQUFFLFFBQVE7YUFDakI7U0FDRjtRQUNELE9BQU8sRUFBRTtZQUNQO2dCQUNFLFFBQVEsRUFBRSxHQUFHO2dCQUNiLE1BQU0sRUFBRSxPQUFPO2dCQUNmLE1BQU0sRUFBRSxPQUFPO2dCQUNmLGNBQWMsRUFBRSxJQUFJO2FBQ3JCO1NBQ0Y7S0FDRjtJQUNEO1FBQ0UsVUFB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RUFBRTtZQUNQO2dCQUNFLFFBQVEsRUFBRSxHQUFHO2dCQUNiLE1BQU0sRUFBRSxPQUFPO2dCQUNmLE1BQU0sRUFBRSxPQUFPO2dCQUNmLGNBQWMsRUFBRSxJQUFJO2FBQ3JCO1NBQ0Y7S0FDRjtDQUNGLENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyJcbi8qKlxuICogQGxpY2Vuc2VcbiAqIENvcHlyaWdodCAyMDIyIEdvb2dsZSBMTEMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuXG4gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgXCJMaWNlbnNlXCIpO1xuICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLlxuICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0XG4gKlxuICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wXG4gKlxuICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZVxuICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gXCJBUyBJU1wiIEJBU0lTLFxuICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuXG4gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kXG4gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS5cbiAqID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4gKi9cblxuaW1wb3J0IHtPcE1hcHBlcn0gZnJvbSAnLi4vdHlwZXMnO1xuXG5leHBvcnQgY29uc3QganNvbjogT3BNYXBwZXJbXSA9IFtcbiAge1xuICAgICd0Zk9wTmFtZSc6ICdBZGQnLFxuICAgICdjYXRlZ29yeSc6ICdhcml0aG1ldGljJyxcbiAgICAnaW5wdXRzJzogW1xuICAgICAge1xuICAgICAgICAnc3RhcnQnOiAwLFxuICAgICAgICAnbmFtZSc6ICdhJyxcbiAgICAgICAgJ3R5cGUnOiAndGVuc29yJ1xuICAgICAgfSxcbiAgICAgIHtcbiAgICAgICAgJ3N0YXJ0JzogMSxcbiAgICAgICAgJ25hbWUnOiAnYicsXG4gICAgICAgICd0eXBlJzogJ3RlbnNvcidcbiAgICAgIH1cbiAgICBdLFxuICAgICdhdHRycyc6IFtcbiAgICAgIHtcbiAgICAgICAgJ3RmTmFtZSc6ICdUJyxcbiAgICAgICAgJ25hbWUnOiAnZHR5cGUnLFxuICAgICAgICAndHlwZSc6ICdkdHlwZScsXG4gICAgICAgICdub3RTdXBwb3J0ZWQnOiB0cnVlXG4gICAgICB9XG4gICAgXVxuICB9LFxuICB7XG4gICAgJ3RmT3BOYW1lJzogJ0FkZFYyJyxcbiAgICAnY2F0ZWdvcnknOiAnYXJpdGhtZXRpYycsXG4gICAgJ2lucHV0cyc6IFtcbiAgICAgIHtcbiAgICAgICAgJ3N0YXJ0JzogMCxcbiAgICAgICAgJ25hbWUnOiAnYScsXG4gICAgICAgICd0eXBlJzogJ3RlbnNvcidcbiAgICAgIH0sXG4gICAgICB7XG4gICAgICAgICdzdGFydCc6IDEsXG4gICAgICAgICduYW1lJzogJ2InLFxuICAgICAgICAndHlwZSc6ICd0ZW5zb3InXG4gICAgICB9XG4gICAgXSxcbiAgICAnYXR0cnMnOiBbXG4gICAgICB7XG4gICAgICAgICd0Zk5hbWUnOiAnVCcsXG4gICAgICAgICduYW1lJzogJ2R0eXBlJyxcbiAgICAgICAgJ3R5cGUnOiAnZHR5cGUnLFxuICAgICAgICAnbm90U3VwcG9ydGVkJzogdHJ1ZVxuICAgICAgfVxuICAgIF1cbiAgfSxcbiAge1xuICAgICd0Zk9wTmFtZSc6ICdBZGROJyxcbiAgICAnY2F0ZWdvcnknOiAnYXJpdGhtZXRpYycsXG4gICAgJ2lucHV0cyc6IFtcbiAgICAgIHtcbiAgICAgICAgJ3N0YXJ0JzogMCxcbiAgICAgICAgJ2VuZCc6IDAsXG4gICAgICAgICduYW1lJzogJ3RlbnNvcnMnLFxuICAgICAgICAndHlwZSc6ICd0ZW5zb3JzJ1xuICAgICAgfVxuICAgIF1cbiAgfSxcbiAge1xuICAgICd0Zk9wTmFtZSc6ICdCaWFzQWRkJyxcbiAgICAnY2F0ZWdvcnknOiAnYXJpdGhtZXRpYycsXG4gICAgJ2lucHV0cyc6IFtcbiAgICAgIHtcbiAgICAgICAgJ3N0YXJ0JzogMCxcbiAgICAgICAgJ25hbWUnOiAnYScsXG4gICAgICAgICd0eXBlJzogJ3RlbnNvcidcbiAgICAgIH0sXG4gICAgICB7XG4gICAgICAgICdzdGFydCc6IDEsXG4gICAgICAgICduYW1lJzogJ2InLFxuICAgICAgICAndHlwZSc6ICd0ZW5zb3InXG4gICAgICB9XG4gICAgXSxcbiAgICAnYXR0cnMnOiBbXG4gICAgICB7XG4gICAgICAgICd0Zk5hbWUnOiAnVCcsXG4gICAgICAgICduYW1lJzogJ2R0eXBlJyxcbiAgICAgICAgJ3R5cGUnOiAnZHR5cGUnLFxuICAgICAgICAnbm90U3VwcG9ydGVkJzogdHJ1ZVxuICAgICAgfSxcbiAgICAgIHtcbiAgICAgICAgJ3RmTmFtZSc6ICdkYXRhX2Zvcm1hdCcsXG4gICAgICAgICduYW1lJzogJ2RhdGFGb3JtYXQnLFxuICAgICAgICAndHlwZSc6ICdzdHJpbmcnLFxuICAgICAgICAnbm90U3VwcG9ydGVkJzogdHJ1ZVxuICAgICAgfVxuICAgIF1cbiAgfSxcbiAge1xuICAgICd0Zk9wTmFtZSc6ICdTdWInLFxuICAgICdjYXRlZ29yeSc6ICdhcml0aG1ldGljJyxcbiAgICAnaW5wdXRzJzogW1xuICAgICAge1xuICAgICAgICAnc3RhcnQnOiAwLFxuICAgICAgICAnbmFtZSc6ICdhJyxcbiAgICAgICAgJ3R5cGUnOiAndGVuc29yJ1xuICAgICAgfSxcbiAgICAgIHtcbiAgICAgICAgJ3N0YXJ0JzogMSxcbiAgICAgICAgJ25hbWUnOiAnYicsXG4gICAgICAgICd0eXBlJzogJ3RlbnNvcidcbiAgICAgIH1cbiAgICBdLFxuICAgICdhdHRycyc6IFtcbiAgICAgIHtcbiAgICAgICAgJ3RmTmFtZSc6ICdUJyxcbiAgICAgICAgJ25hbWUnOiAnZHR5cGUnLFxuICAgICAgICAndHlwZSc6ICdkdHlwZScsXG4gICAgICAgICdub3RTdXBwb3J0ZWQnOiB0cnVlXG4gICAgICB9XG4gICAgXVxuICB9LFxuICB7XG4gICAgJ3RmT3BOYW1lJzogJ1JlYWxEaXYnLFxuICAgICdjYXRlZ29yeSc6ICdhcml0aG1ldGljJyxcbiAgICAnaW5wdXRzJzogW1xuICAgICAge1xuICAgICAgICAnc3RhcnQnOiAwLFxuICAgICAgICAnbmFtZSc6ICdhJyxcbiAgICAgICAgJ3R5cGUnOiAndGVuc29yJ1xuICAgICAgfSxcbiAgICAgIHtcbiAgICAgICAgJ3N0YXJ0JzogMSxcbiAgICAgICAgJ25hbWUnOiAnYicsXG4gICAgICAgICd0eXBlJzogJ3RlbnNvcidcbiAgICAgIH1cbiAgICBdLFxuICAgICdhdHRycyc6IFtcbiAgICAgIHtcbiAgICAgICAgJ3RmTmFtZSc6ICdUJyxcbiAgICAgICAgJ25hbWUnOiAnZHR5cGUnLFxuICAgICAgICAndHlwZSc6ICdkdHlwZScsXG4gICAgICAgICdub3RTdXBwb3J0ZWQnOiB0cnVlXG4gICAgICB9XG4gICAgXVxuICB9LFxuICB7XG4gICAgJ3RmT3BOYW1lJzogJ0RpdicsXG4gICAgJ2NhdGVnb3J5JzogJ2FyaXRobWV0aWMnLFxuICAgICdpbnB1dHMnOiBbXG4gICAgICB7XG4gICAgICAgICdzdGFydCc6IDAsXG4gICAgICAgICduYW1lJzogJ2EnLFxuICAgICAgICAndHlwZSc6ICd0ZW5zb3InXG4gICAgICB9LFxuICAgICAge1xuICAgICAgICAnc3RhcnQnOiAxLFxuICAgICAgICAnbmFtZSc6ICdiJyxcbiAgICAgICAgJ3R5cGUnOiAndGVuc29yJ1xuICAgICAgfVxuICAgIF0sXG4gICAgJ2F0dHJzJzogW1xuICAgICAge1xuICAgICAgICAndGZOYW1lJzogJ1QnLFxuICAgICAgICAnbmFtZSc6ICdkdHlwZScsXG4gICAgICAgICd0eXBlJzogJ2R0eXBlJyxcbiAgICAgICAgJ25vdFN1cHBvcnRlZCc6IHRydWVcbiAgICAgIH1cbiAgICBdXG4gIH0sXG4gIHtcbiAgICAndGZPcE5hbWUnOiAnRGl2Tm9OYW4nLFxuICAgICdjYXRlZ29yeSc6ICdhcml0aG1ldGljJyxcbiAgICAnaW5wdXRzJzogW1xuICAgICAge1xuICAgICAgICAnc3RhcnQnOiAwLFxuICAgICAgICAnbmFtZSc6ICdhJyxcbiAgICAgICAgJ3R5cGUnOiAndGVuc29yJ1xuICAgICAgfSxcbiAgICAgIHtcbiAgICAgICAgJ3N0YXJ0JzogMSxcbiAgICAgICAgJ25hbWUnOiAnYicsXG4gICAgICAgICd0eXBlJzogJ3RlbnNvcidcbiAgICAgIH1cbiAgICBdLFxuICAgICdhdHRycyc6IFtcbiAgICAgIHtcbiAgICAgICAgJ3RmTmFtZSc6ICdUJyxcbiAgICAgICAgJ25hbWUnOiAnZHR5cGUnLFxuICAgICAgICAndHlwZSc6ICdkdHlwZScsXG4gICAgICAgICdub3RTdXBwb3J0ZWQnOiB0cnVlXG4gICAgICB9XG4gICAgXVxuICB9LFxuICB7XG4gICAgJ3RmT3BOYW1lJzogJ0Zsb29yRGl2JyxcbiAgICAnY2F0ZWdvcnknOiAnYXJpdGhtZXRpYycsXG4gICAgJ2lucHV0cyc6IFtcbiAgICAgIHtcbiAgICAgICAgJ3N0YXJ0JzogMCxcbiAgICAgICAgJ25hbWUnOiAnYScsXG4gICAgICAgICd0eXBlJzogJ3RlbnNvcidcbiAgICAgIH0sXG4gICAgICB7XG4gICAgICAgICdzdGFydCc6IDEsXG4gICAgICAgICduYW1lJzogJ2InLFxuICAgICAgICAndHlwZSc6ICd0ZW5zb3InXG4gICAgICB9XG4gICAgXSxcbiAgICAnYXR0cnMnOiBbXG4gICAgICB7XG4gICAgICAgICd0Zk5hbWUnOiAnVCcsXG4gICAgICAgICduYW1lJzogJ2R0eXBlJyxcbiAgICAgICAgJ3R5cGUnOiAnZHR5cGUnLFxuICAgICAgICAnbm90U3VwcG9ydGVkJzogdHJ1ZVxuICAgICAgfVxuICAgIF1cbiAgfSxcbiAge1xuICAgICd0Zk9wTmFtZSc6ICdNdWwnLFxuICAgICdjYXRlZ29yeSc6ICdhcml0aG1ldGljJyxcbiAgICAnaW5wdXRzJzogW1xuICAgICAge1xuICAgICAgICAnc3RhcnQnOiAwLFxuICAgICAgICAnbmFtZSc6ICdhJyxcbiAgICAgICAgJ3R5cGUnOiAndGVuc29yJ1xuICAgICAgfSxcbiAgICAgIHtcbiAgICAgICAgJ3N0YXJ0JzogMSxcbiAgICAgICAgJ25hbWUnOiAnYicsXG4gICAgICAgICd0eXBlJzogJ3RlbnNvcidcbiAgICAgIH1cbiAgICBdLFxuICAgICdhdHRycyc6IFtcbiAgICAgIHtcbiAgICAgICAgJ3RmTmFtZSc6ICdUJyxcbiAgICAgICAgJ25hbWUnOiAnZHR5cGUnLFxuICAgICAgICAndHlwZSc6ICdkdHlwZScsXG4gICAgICAgICdub3RTdXBwb3J0ZWQnOiB0cnVlXG4gICAgICB9XG4gICAgXVxuICB9LFxuICB7XG4gICAgJ3RmT3BOYW1lJzogJ01heGltdW0nLFxuICAgICdjYXRlZ29yeSc6ICdhcml0aG1ldGljJyxcbiAgICAnaW5wdXRzJzogW1xuICAgICAge1xuICAgICAgICAnc3RhcnQnOiAwLFxuICAgICAgICAnbmFtZSc6ICdhJyxcbiAgICAgICAgJ3R5cGUnOiAndGVuc29yJ1xuICAgICAgfSxcbiAgICAgIHtcbiAgICAgICAgJ3N0YXJ0JzogMSxcbiAgICAgICAgJ25hbWUnOiAnYicsXG4gICAgICAgICd0eXBlJzogJ3RlbnNvcidcbiAgICAgIH1cbiAgICBdLFxuICAgICdhdHRycyc6IFtcbiAgICAgIHtcbiAgICAgICAgJ3RmTmFtZSc6ICdUJyxcbiAgICAgICAgJ25hbWUnOiAnZHR5cGUnLFxuICAgICAgICAndHlwZSc6ICdkdHlwZScsXG4gICAgICAgICdub3RTdXBwb3J0ZWQnOiB0cnVlXG4gICAgICB9XG4gICAgXVxuICB9LFxuICB7XG4gICAgJ3RmT3BOYW1lJzogJ01pbmltdW0nLFxuICAgICdjYXRlZ29yeSc6ICdhcml0aG1ldGljJyxcbiAgICAnaW5wdXRzJzogW1xuICAgICAge1xuICAgICAgICAnc3RhcnQnOiAwLFxuICAgICAgICAnbmFtZSc6ICdhJyxcbiAgICAgICAgJ3R5cGUnOiAndGVuc29yJ1xuICAgICAgfSxcbiAgICAgIHtcbiAgICAgICAgJ3N0YXJ0JzogMSxcbiAgICAgICAgJ25hbWUnOiAnYicsXG4gICAgICAgICd0eXBlJzogJ3RlbnNvcidcbiAgICAgIH1cbiAgICBdLFxuICAgICdhdHRycyc6IFtcbiAgICAgIHtcbiAgICAgICAgJ3RmTmFtZSc6ICdUJyxcbiAgICAgICAgJ25hbWUnOiAnZHR5cGUnLFxuICAgICAgICAndHlwZSc6ICdkdHlwZScsXG4gICAgICAgICdub3RTdXBwb3J0ZWQnOiB0cnVlXG4gICAgICB9XG4gICAgXVxuICB9LFxuICB7XG4gICAgJ3RmT3BOYW1lJzogJ1BvdycsXG4gICAgJ2NhdGVnb3J5JzogJ2FyaXRobWV0aWMnLFxuICAgICdpbnB1dHMnOiBbXG4gICAgICB7XG4gICAgICAgICdzdGFydCc6IDAsXG4gICAgICAgICduYW1lJzogJ2EnLFxuICAgICAgICAndHlwZSc6ICd0ZW5zb3InXG4gICAgICB9LFxuICAgICAge1xuICAgICAgICAnc3RhcnQnOiAxLFxuICAgICAgICAnbmFtZSc6ICdiJyxcbiAgICAgICAgJ3R5cGUnOiAndGVuc29yJ1xuICAgICAgfVxuICAgIF0sXG4gICAgJ2F0dHJzJzogW1xuICAgICAge1xuICAgICAgICAndGZOYW1lJzogJ1QnLFxuICAgICAgICAnbmFtZSc6ICdkdHlwZScsXG4gICAgICAgICd0eXBlJzogJ2R0eXBlJyxcbiAgICAgICAgJ25vdFN1cHBvcnRlZCc6IHRydWVcbiAgICAgIH1cbiAgICBdXG4gIH0sXG4gIHtcbiAgICAndGZPcE5hbWUnOiAnU3F1YXJlZERpZmZlcmVuY2UnLFxuICAgICdjYXRlZ29yeSc6ICdhcml0aG1ldGljJyxcbiAgICAnaW5wdXRzJzogW1xuICAgICAge1xuICAgICAgICAnc3RhcnQnOiAwLFxuICAgICAgICAnbmFtZSc6ICdhJyxcbiAgICAgICAgJ3R5cGUnOiAndGVuc29yJ1xuICAgICAgfSxcbiAgICAgIHtcbiAgICAgICAgJ3N0YXJ0JzogMSxcbiAgICAgICAgJ25hbWUnOiAnYicsXG4gICAgICAgICd0eXBlJzogJ3RlbnNvcidcbiAgICAgIH1cbiAgICBdLFxuICAgICdhdHRycyc6IFtcbiAgICAgIHtcbiAgICAgICAgJ3RmTmFtZSc6ICdUJyxcbiAgICAgICAgJ25hbWUnOiAnZHR5cGUnLFxuICAgICAgICAndHlwZSc6ICdkdHlwZScsXG4gICAgICAgICdub3RTdXBwb3J0ZWQnOiB0cnVlXG4gICAgICB9XG4gICAgXVxuICB9LFxuICB7XG4gICAgJ3RmT3BOYW1lJzogJ01vZCcsXG4gICAgJ2NhdGVnb3J5JzogJ2FyaXRobWV0aWMnLFxuICAgICdpbnB1dHMnOiBbXG4gICAgICB7XG4gICAgICAgICdzdGFydCc6IDAsXG4gICAgICAgICduYW1lJzogJ2EnLFxuICAgICAgICAndHlwZSc6ICd0ZW5zb3InXG4gICAgICB9LFxuICAgICAge1xuICAgICAgICAnc3RhcnQnOiAxLFxuICAgICAgICAnbmFtZSc6ICdiJyxcbiAgICAgICAgJ3R5cGUnOiAndGVuc29yJ1xuICAgICAgfVxuICAgIF0sXG4gICAgJ2F0dHJzJzogW1xuICAgICAge1xuICAgICAgICAndGZOYW1lJzogJ1QnLFxuICAgICAgICAnbmFtZSc6ICdkdHlwZScsXG4gICAgICAgICd0eXBlJzogJ2R0eXBlJyxcbiAgICAgICAgJ25vdFN1cHBvcnRlZCc6IHRydWVcbiAgICAgIH1cbiAgICBdXG4gIH0sXG4gIHtcbiAgICAndGZPcE5hbWUnOiAnRmxvb3JNb2QnLFxuICAgICdjYXRlZ29yeSc6ICdhcml0aG1ldGljJyxcbiAgICAnaW5wdXRzJzogW1xuICAgICAge1xuICAgICAgICAnc3RhcnQnOiAwLFxuICAgICAgICAnbmFtZSc6ICdhJyxcbiAgICAgICAgJ3R5cGUnOiAndGVuc29yJ1xuICAgICAgfSxcbiAgICAgIHtcbiAgICAgICAgJ3N0YXJ0JzogMSxcbiAgICAgICAgJ25hbWUnOiAnYicsXG4gICAgICAgICd0eXBlJzogJ3RlbnNvcidcbiAgICAgIH1cbiAgICBdLFxuICAgICdhdHRycyc6IFtcbiAgICAgIHtcbiAgICAgICAgJ3RmTmFtZSc6ICdUJyxcbiAgICAgICAgJ25hbWUnOiAnZHR5cGUnLFxuICAgICAgICAndHlwZSc6ICdkdHlwZScsXG4gICAgICAgICdub3RTdXBwb3J0ZWQnOiB0cnVlXG4gICAgICB9XG4gICAgXVxuICB9XG5dO1xuIl19","/**\n * @license\n * Copyright 2022 Google LLC. All Rights Reserved.\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n * =============================================================================\n */\nexport const json = [\n {\n 'tfOpName': 'Abs',\n 'category': 'basic_math',\n 'inputs': [\n {\n 'start': 0,\n 'name': 'x',\n 'type': 'tensor'\n }\n ],\n 'attrs': [\n {\n 'tfName': 'T',\n 'name': 'dtype',\n 'type': 'dtype',\n 'notSupported': true\n }\n ]\n },\n {\n 'tfOpName': 'Acos',\n 'category': 'basic_math',\n 'inputs': [\n {\n 'start': 0,\n 'name': 'x',\n 'type': 'tensor'\n }\n ],\n 'attrs': [\n {\n 'tfName': 'T',\n 'name': 'dtype',\n 'type': 'dtype',\n 'notSupported': true\n }\n ]\n },\n {\n 'tfOpName': 'Asin',\n 'category': 'basic_math',\n 'inputs': [\n {\n 'start': 0,\n 'name': 'x',\n 'type': 'tensor'\n }\n ],\n 'attrs': [\n {\n 'tfName': 'T',\n 'name': 'dtype',\n 'type': 'dtype',\n 'notSupported': true\n }\n ]\n },\n {\n 'tfOpName': 'Atan',\n 'category': 'basic_math',\n 'inputs': [\n {\n 'start': 0,\n 'name': 'x',\n 'type': 'tensor'\n }\n ],\n 'attrs': [\n {\n 'tfName': 'T',\n 'name': 'dtype',\n 'type': 'dtype',\n 'notSupported': true\n }\n ]\n },\n {\n 'tfOpName': 'Atan2',\n 'category': 'basic_math',\n 'inputs': [\n {\n 'start': 0,\n 'name': 'x',\n 'type': 'tensor'\n },\n {\n 'start': 1,\n 'name': 'y',\n 'type': 'tensor'\n }\n ],\n 'attrs': [\n {\n 'tfName': 'T',\n 'name': 'dtype',\n 'type': 'dtype',\n 'notSupported': true\n }\n ]\n },\n {\n 'tfOpName': 'Ceil',\n 'category': 'basic_math',\n 'inputs': [\n {\n 'start': 0,\n 'name': 'x',\n 'type': 'tensor'\n }\n ],\n 'attrs': [\n {\n 'tfName': 'T',\n 'name': 'dtype',\n 'type': 'dtype',\n 'notSupported': true\n }\n ]\n },\n {\n 'tfOpName': 'ClipByValue',\n 'category': 'basic_math',\n 'inputs': [\n {\n 'start': 0,\n 'name': 'x',\n 'type': 'tensor'\n },\n {\n 'start': 1,\n 'name': 'clipValueMin',\n 'type': 'number'\n },\n {\n 'start': 2,\n 'name': 'clipValueMax',\n 'type': 'number'\n }\n ],\n 'attrs': [\n {\n 'tfName': 'T',\n 'name': 'dtype',\n 'type': 'dtype',\n 'notSupported': true\n }\n ]\n },\n {\n 'tfOpName': 'Complex',\n 'category': 'basic_math',\n 'inputs': [\n {\n 'start': 0,\n 'name': 'real',\n 'type': 'tensor'\n },\n {\n 'start': 1,\n 'name': 'imag',\n 'type': 'tensor'\n }\n ],\n 'attrs': [\n {\n 'tfName': 'T',\n 'name': 'dtype',\n 'type': 'dtype',\n 'notSupported': true\n }\n ]\n },\n {\n 'tfOpName': 'ComplexAbs',\n 'category': 'basic_math',\n 'inputs': [\n {\n 'start': 0,\n 'name': 'x',\n 'type': 'tensor'\n }\n ],\n 'attrs': [\n {\n 'tfName': 'T',\n 'name': 'dtype',\n 'type': 'dtype',\n 'notSupported': true\n }\n ]\n },\n {\n 'tfOpName': 'Cos',\n 'category': 'basic_math',\n 'inputs': [\n {\n 'start': 0,\n 'name': 'x',\n 'type': 'tensor'\n }\n ],\n 'attrs': [\n {\n 'tfName': 'T',\n 'name': 'dtype',\n 'type': 'dtype',\n 'notSupported': true\n }\n ]\n },\n {\n 'tfOpName': 'Cosh',\n 'category': 'basic_math',\n 'inputs': [\n {\n 'start': 0,\n 'name': 'x',\n 'type': 'tensor'\n }\n ],\n 'attrs': [\n {\n 'tfName': 'T',\n 'name': 'dtype',\n 'type': 'dtype',\n 'notSupported': true\n }\n ]\n },\n {\n 'tfOpName': 'Elu',\n 'category': 'basic_math',\n 'inputs': [\n {\n 'start': 0,\n 'name': 'x',\n 'type': 'tensor'\n }\n ],\n 'attrs': [\n {\n 'tfName': 'T',\n 'name': 'dtype',\n 'type': 'dtype',\n 'notSupported': true\n }\n ]\n },\n {\n 'tfOpName': 'Exp',\n 'category': 'basic_math',\n 'inputs': [\n {\n 'start': 0,\n 'name': 'x',\n 'type': 'tensor'\n }\n ],\n 'attrs': [\n {\n 'tfName': 'T',\n 'name': 'dtype',\n 'type': 'dtype',\n 'notSupported': true\n }\n ]\n },\n {\n 'tfOpName': 'Floor',\n 'category': 'basic_math',\n 'inputs': [\n {\n 'start': 0,\n 'name': 'x',\n 'type': 'tensor'\n }\n ],\n 'attrs': [\n {\n 'tfName': 'T',\n 'name': 'dtype',\n 'type': 'dtype',\n 'notSupported': true\n }\n ]\n },\n {\n 'tfOpName': 'Log',\n 'category': 'basic_math',\n 'inputs': [\n {\n 'start': 0,\n 'name': 'x',\n 'type': 'tensor'\n }\n ],\n 'attrs': [\n {\n 'tfName': 'T',\n 'name': 'dtype',\n 'type': 'dtype',\n 'notSupported': true\n }\n ]\n },\n {\n 'tfOpName': 'Imag',\n 'category': 'basic_math',\n 'inputs': [\n {\n 'start': 0,\n 'name': 'x',\n 'type': 'tensor'\n }\n ],\n 'attrs': [\n {\n 'tfName': 'T',\n 'name': 'dtype',\n 'type': 'dtype',\n 'notSupported': true\n },\n {\n 'tfName': 'Tout',\n 'name': 'outputType',\n 'type': 'dtype',\n 'notSupported': true\n }\n ]\n },\n {\n 'tfOpName': 'Neg',\n 'category': 'basic_math',\n 'inputs': [\n {\n 'start': 0,\n 'name': 'x',\n 'type': 'tensor'\n }\n ],\n 'attrs': [\n {\n 'tfName': 'T',\n 'name': 'dtype',\n 'type': 'dtype',\n 'notSupported': true\n }\n ]\n },\n {\n 'tfOpName': 'Real',\n 'category': 'basic_math',\n 'inputs': [\n {\n 'start': 0,\n 'name': 'x',\n 'type': 'tensor'\n }\n ],\n 'attrs': [\n {\n 'tfName': 'T',\n 'name': 'dtype',\n 'type': 'dtype',\n 'notSupported': true\n },\n {\n 'tfName': 'Tout',\n 'name': 'outputType',\n 'type': 'dtype',\n 'notSupported': true\n }\n ]\n },\n {\n 'tfOpName': 'Prelu',\n 'category': 'basic_math',\n 'inputs': [\n {\n 'start': 0,\n 'name': 'x',\n 'type': 'tensor'\n },\n {\n 'start': 1,\n 'name': 'alpha',\n 'type': 'tensor'\n }\n ],\n 'attrs': [\n {\n 'tfName': 'T',\n 'name': 'dtype',\n 'type': 'dtype',\n 'notSupported': true\n }\n ]\n },\n {\n 'tfOpName': 'Relu',\n 'category': 'basic_math',\n 'inputs': [\n {\n 'start': 0,\n 'name': 'x',\n 'type': 'tensor'\n }\n ],\n 'attrs': [\n {\n 'tfName': 'T',\n 'name': 'dtype',\n 'type': 'dtype',\n 'notSupported': true\n }\n ]\n },\n {\n 'tfOpName': 'Relu6',\n 'category': 'basic_math',\n 'inputs': [\n {\n 'start': 0,\n 'name': 'x',\n 'type': 'tensor'\n }\n ],\n 'attrs': [\n {\n 'tfName': 'T',\n 'name': 'dtype',\n 'type': 'dtype',\n 'notSupported': true\n }\n ]\n },\n {\n 'tfOpName': 'Selu',\n 'category': 'basic_math',\n 'inputs': [\n {\n 'start': 0,\n 'name': 'x',\n 'type': 'tensor'\n }\n ],\n 'attrs': [\n {\n 'tfName': 'T',\n 'name': 'dtype',\n 'type': 'dtype',\n 'notSupported': true\n }\n ]\n },\n {\n 'tfOpName': 'Sigmoid',\n 'category': 'basic_math',\n 'inputs': [\n {\n 'start': 0,\n 'name': 'x',\n 'type': 'tensor'\n }\n ],\n 'attrs': [\n {\n 'tfName': 'T',\n 'name': 'dtype',\n 'type': 'dtype',\n 'notSupported': true\n }\n ]\n },\n {\n 'tfOpName': 'Sin',\n 'category': 'basic_math',\n 'inputs': [\n {\n 'start': 0,\n 'name': 'x',\n 'type': 'tensor'\n }\n ],\n 'attrs': [\n {\n 'tfName': 'T',\n 'name': 'dtype',\n 'type': 'dtype',\n 'notSupported': true\n }\n ]\n },\n {\n 'tfOpName': 'Sinh',\n 'category': 'basic_math',\n 'inputs': [\n {\n 'start': 0,\n 'name': 'x',\n 'type': 'tensor'\n }\n ],\n 'attrs': [\n {\n 'tfName': 'T',\n 'name': 'dtype',\n 'type': 'dtype',\n 'notSupported': true\n }\n ]\n },\n {\n 'tfOpName': 'Sqrt',\n 'category': 'basic_math',\n 'inputs': [\n {\n 'start': 0,\n 'name': 'x',\n 'type': 'tensor'\n }\n ],\n 'attrs': [\n {\n 'tfName': 'T',\n 'name': 'dtype',\n 'type': 'dtype',\n 'notSupported': true\n }\n ]\n },\n {\n 'tfOpName': 'Rsqrt',\n 'category': 'basic_math',\n 'inputs': [\n {\n 'start': 0,\n 'name': 'x',\n 'type': 'tensor'\n }\n ],\n 'attrs': [\n {\n 'tfName': 'T',\n 'name': 'dtype',\n 'type': 'dtype',\n 'notSupported': true\n }\n ]\n },\n {\n 'tfOpName': 'Square',\n 'category': 'basic_math',\n 'inputs': [\n {\n 'start': 0,\n 'name': 'x',\n 'type': 'tensor'\n }\n ],\n 'attrs': [\n {\n 'tfName': 'T',\n 'name': 'dtype',\n 'type': 'dtype',\n 'notSupported': true\n }\n ]\n },\n {\n 'tfOpName': 'Tan',\n 'category': 'basic_math',\n 'inputs': [\n {\n 'start': 0,\n 'name': 'x',\n 'type': 'tensor'\n }\n ],\n 'attrs': [\n {\n 'tfName': 'T',\n 'name': 'dtype',\n 'type': 'dtype',\n 'notSupported': true\n }\n ]\n },\n {\n 'tfOpName': 'Tanh',\n 'category': 'basic_math',\n 'inputs': [\n {\n 'start': 0,\n 'name': 'x',\n 'type': 'tensor'\n }\n ],\n 'attrs': [\n {\n 'tfName': 'T',\n 'name': 'dtype',\n 'type': 'dtype',\n 'notSupported': true\n }\n ]\n },\n {\n 'tfOpName': 'Sign',\n 'category': 'basic_math',\n 'inputs': [\n {\n 'start': 0,\n 'name': 'x',\n 'type': 'tensor'\n }\n ],\n 'attrs': [\n {\n 'tfName': 'T',\n 'name': 'dtype',\n 'type': 'dtype',\n 'notSupported': true\n }\n ]\n },\n {\n 'tfOpName': 'Round',\n 'category': 'basic_math',\n 'inputs': [\n {\n 'start': 0,\n 'name': 'x',\n 'type': 'tensor'\n }\n ],\n 'attrs': [\n {\n 'tfName': 'T',\n 'name': 'dtype',\n 'type': 'dtype',\n 'notSupported': true\n }\n ]\n },\n {\n 'tfOpName': 'Expm1',\n 'category': 'basic_math',\n 'inputs': [\n {\n 'start': 0,\n 'name': 'x',\n 'type': 'tensor'\n }\n ],\n 'attrs': [\n {\n 'tfName': 'T',\n 'name': 'dtype',\n 'type': 'dtype',\n 'notSupported': true\n }\n ]\n },\n {\n 'tfOpName': 'Log1p',\n 'category': 'basic_math',\n 'inputs': [\n {\n 'start': 0,\n 'name': 'x',\n 'type': 'tensor'\n }\n ],\n 'attrs': [\n {\n 'tfName': 'T',\n 'name': 'dtype',\n 'type': 'dtype',\n 'notSupported': true\n }\n ]\n },\n {\n 'tfOpName': 'Reciprocal',\n 'category': 'basic_math',\n 'inputs': [\n {\n 'start': 0,\n 'name': 'x',\n 'type': 'tensor'\n }\n ],\n 'attrs': [\n {\n 'tfName': 'T',\n 'name': 'dtype',\n 'type': 'dtype',\n 'notSupported': true\n }\n ]\n },\n {\n 'tfOpName': 'Softplus',\n 'category': 'basic_math',\n 'inputs': [\n {\n 'start': 0,\n 'name': 'x',\n 'type': 'tensor'\n }\n ],\n 'attrs': [\n {\n 'tfName': 'T',\n 'name': 'dtype',\n 'type': 'dtype',\n 'notSupported': true\n }\n ]\n },\n {\n 'tfOpName': 'Asinh',\n 'category': 'basic_math',\n 'inputs': [\n {\n 'start': 0,\n 'name': 'x',\n 'type': 'tensor'\n }\n ],\n 'attrs': [\n {\n 'tfName': 'T',\n 'name': 'dtype',\n 'type': 'dtype',\n 'notSupported': true\n }\n ]\n },\n {\n 'tfOpName': 'Acosh',\n 'category': 'basic_math',\n 'inputs': [\n {\n 'start': 0,\n 'name': 'x',\n 'type': 'tensor'\n }\n ],\n 'attrs': [\n {\n 'tfName': 'T',\n 'name': 'dtype',\n 'type': 'dtype',\n 'notSupported': true\n }\n ]\n },\n {\n 'tfOpName': 'Atanh',\n 'category': 'basic_math',\n 'inputs': [\n {\n 'start': 0,\n 'name': 'x',\n 'type': 'tensor'\n }\n ],\n 'attrs': [\n {\n 'tfName': 'T',\n 'name': 'dtype',\n 'type': 'dtype',\n 'notSupported': true\n }\n ]\n },\n {\n 'tfOpName': 'Erf',\n 'category': 'basic_math',\n 'inputs': [\n {\n 'start': 0,\n 'name': 'x',\n 'type': 'tensor'\n }\n ],\n 'attrs': [\n {\n 'tfName': 'T',\n 'name': 'dtype',\n 'type': 'dtype',\n 'notSupported': true\n }\n ]\n },\n {\n 'tfOpName': 'Prod',\n 'category': 'basic_math',\n 'inputs': [\n {\n 'start': 0,\n 'name': 'x',\n 'type': 'tensor'\n },\n {\n 'start': 1,\n 'name': 'axes',\n 'type': 'number[]'\n }\n ],\n 'attrs': [\n {\n 'tfName': 'keep_dims',\n 'name': 'keepDims',\n 'type': 'bool',\n 'notSupported': true\n },\n {\n 'tfName': 'T',\n 'name': 'dtype',\n 'type': 'dtype',\n 'notSupported': true\n }\n ]\n },\n {\n 'tfOpName': 'LeakyRelu',\n 'category': 'basic_math',\n 'inputs': [\n {\n 'start': 0,\n 'name': 'x',\n 'type': 'tensor'\n }\n ],\n 'attrs': [\n {\n 'tfName': 'alpha',\n 'name': 'alpha',\n 'type': 'number',\n 'defaultValue': 0.2\n },\n {\n 'tfName': 'T',\n 'name': 'dtype',\n 'type': 'dtype',\n 'notSupported': true\n }\n ]\n },\n {\n 'tfOpName': 'IsNan',\n 'category': 'basic_math',\n 'inputs': [\n {\n 'start': 0,\n 'name': 'x',\n 'type': 'tensor'\n }\n ],\n 'attrs': [\n {\n 'tfName': 'T',\n 'name': 'dtype',\n 'type': 'dtype',\n 'notSupported': true\n }\n ]\n }\n];\n//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYmFzaWNfbWF0aC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uLy4uLy4uL3RmanMtY29udmVydGVyL3NyYy9vcGVyYXRpb25zL29wX2xpc3QvYmFzaWNfbWF0aC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFDQTs7Ozs7Ozs7Ozs7Ozs7O0dBZUc7QUFJSCxNQUFNLENBQUMsTUFBTSxJQUFJLEdBQWU7SUFDOUI7UUFDRSxVQUFVLEVBQUUsS0FBSztRQUNqQixVQUFVLEVBQUUsWUFBWTtRQUN4QixRQUFRLEVBQUU7WUFDUjtnQkFDRSxPQUFPLEVBQUUsQ0FBQztnQkFDVixNQUFNLEVBQUUsR0FBRztnQkFDWCxNQUFNLEVBQUUsUUFBUTthQUNqQjtTQUNGO1FBQ0QsT0FBTyxFQUFFO1lBQ1A7Z0JBQ0UsUUFBUSxFQUFFLEdBQUc7Z0JBQ2IsTUFBTSxFQUFFLE9BQU87Z0JBQ2YsTUFBTSxFQUFFLE9BQU87Z0JBQ2YsY0FBYyxFQUFFLElBQUk7YUFDckI7U0FDRjtLQUNGO0lBQ0Q7UUFDRSxVQUFVLEVBQUUsTUFBTTtRQUNsQixVQUFVLEVBQUUsWUFBWTtRQUN4QixRQUFRLEVBQUU7WUFDUjtnQkFDRSxPQUFPLEVBQUUsQ0FBQztnQkFDVixNQUFNLEVBQUUsR0FBRztnQkFDWCxNQUFNLEVBQUUsUUFBUTthQUNqQjtTQUNGO1FBQ0QsT0FBTyxFQUFFO1lBQ1A7Z0JBQ0UsUUFBUSxFQUFFLEdBQUc7Z0JBQ2IsTUFBTSxFQUFFLE9BQU87Z0JBQ2YsTUFBTSxFQUFFLE9BQU87Z0JBQ2YsY0FBYyxFQUFFLElBQUk7YUFDckI7U0FDRjtLQUNGO0lBQ0Q7UUFDRSxVQUFVLEVBQUUsTUFBTTtRQUNsQixVQUFVLEVBQUUsWUFBWTtRQUN4QixRQUFRLEVBQUU7WUFDUjtnQkFDRSxPQUFPLEVBQUUsQ0FBQztnQkFDVixNQUFNLEVBQUUsR0FBRztnQkFDWCxNQUFNLEVBQUUsUUFBUTthQUNqQjtTQUNGO1FBQ0QsT0FBTyxFQUFFO1lBQ1A7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O1FBQ3hCLFFBQVEsRUFBRTtZQUNSO2dCQUNFLE9BQU8sRUFBRSxDQUFDO2dCQUNWLE1BQU0sRUFBRSxHQUFHO2dCQUNYLE1BQU0sRUFBRSxRQUFRO2FBQ2pCO1NBQ0Y7UUFDRCxPQUFPLEVBQUU7WUFDUDtnQkFDRSxRQUFRLEVBQUUsT0FBTztnQkFDakIsTUFBTSxFQUFFLE9BQU87Z0JBQ2YsTUFBTSxFQUFFLFFBQVE7Z0JBQ2hCLGNBQWMsRUFBRSxHQUFHO2FBQ3BCO1lBQ0Q7Z0JBQ0UsUUFBUSxFQUFFLEdBQUc7Z0JBQ2IsTUFBTSxFQUFFLE9BQU87Z0JBQ2YsTUFBTSxFQUFFLE9BQU87Z0JBQ2YsY0FBYyxFQUFFLElBQUk7YUFDckI7U0FDRjtLQUNGO0lBQ0Q7UUFDRSxVQUFVLEVBQUUsT0FBTztRQUNuQixVQUFVLEVBQUUsWUFBWTtRQUN4QixRQUFRLEVBQUU7WUFDUjtnQkFDRSxPQUFPLEVBQUUsQ0FBQztnQkFDVixNQUFNLEVBQUUsR0FBRztnQkFDWCxNQUFNLEVBQUUsUUFBUTthQUNqQjtTQUNGO1FBQ0QsT0FBTyxFQUFFO1lBQ1A7Z0JBQ0UsUUFBUSxFQUFFLEdBQUc7Z0JBQ2IsTUFBTSxFQUFFLE9BQU87Z0JBQ2YsTUFBTSxFQUFFLE9BQU87Z0JBQ2YsY0FBYyxFQUFFLElBQUk7YUFDckI7U0FDRjtLQUNGO0NBQ0YsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbIlxuLyoqXG4gKiBAbGljZW5zZVxuICogQ29weXJpZ2h0IDIwMjIgR29vZ2xlIExMQy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC5cbiAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSBcIkxpY2Vuc2VcIik7XG4gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuXG4gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXRcbiAqXG4gKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjBcbiAqXG4gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlXG4gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiBcIkFTIElTXCIgQkFTSVMsXG4gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC5cbiAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmRcbiAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLlxuICogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbiAqL1xuXG5pbXBvcnQge09wTWFwcGVyfSBmcm9tICcuLi90eXBlcyc7XG5cbmV4cG9ydCBjb25zdCBqc29uOiBPcE1hcHBlcltdID0gW1xuICB7XG4gICAgJ3RmT3BOYW1lJzogJ0FicycsXG4gICAgJ2NhdGVnb3J5JzogJ2Jhc2ljX21hdGgnLFxuICAgICdpbnB1dHMnOiBbXG4gICAgICB7XG4gICAgICAgICdzdGFydCc6IDAsXG4gICAgICAgICduYW1lJzogJ3gnLFxuICAgICAgICAndHlwZSc6ICd0ZW5zb3InXG4gICAgICB9XG4gICAgXSxcbiAgICAnYXR0cnMnOiBbXG4gICAgICB7XG4gICAgICAgICd0Zk5hbWUnOiAnVCcsXG4gICAgICAgICduYW1lJzogJ2R0eXBlJyxcbiAgICAgICAgJ3R5cGUnOiAnZHR5cGUnLFxuICAgICAgICAnbm90U3VwcG9ydGVkJzogdHJ1ZVxuICAgICAgfVxuICAgIF1cbiAgfSxcbiAge1xuICAgICd0Zk9wTmFtZSc6ICdBY29zJyxcbiAgICAnY2F0ZWdvcnknOiAnYmFzaWNfbWF0aCcsXG4gICAgJ2lucHV0cyc6IFtcbiAgICAgIHtcbiAgICAgICAgJ3N0YXJ0JzogMCxcbiAgICAgICAgJ25hbWUnOiAneCcsXG4gICAgICAgICd0eXBlJzogJ3RlbnNvcidcbiAgICAgIH1cbiAgICBdLFxuICAgICdhdHRycyc6IFtcbiAgICAgIHtcbiAgICAgICAgJ3RmTmFtZSc6ICdUJyxcbiAgICAgICAgJ25hbWUnOiAnZHR5cGUnLFxuICAgICAgICAndHlwZSc6ICdkdHlwZScsXG4gICAgICAgICdub3RTdXBwb3J0ZWQnOiB0cnVlXG4gICAgICB9XG4gICAgXVxuICB9LFxuICB7XG4gICAgJ3RmT3BOYW1lJzogJ0FzaW4nLFxuICAgICdjYXRlZ29yeSc6ICdiYXNpY19tYXRoJyxcbiAgICAnaW5wdXRzJzogW1xuICAgICAge1xuICAgICAgICAnc3RhcnQnOiAwLFxuICAgICAgICAnbmFtZSc6ICd4JyxcbiAgICAgICAgJ3R5cGUnOiAndGVuc29yJ1xuICAgICAgfVxuICAgIF0sXG4gICAgJ2F0dHJzJzogW1xuICAgICAge1xuICAgICAgICAndGZOYW1lJzogJ1QnLFxuICAgICAgICAnbmFtZSc6ICdkdHlwZScsXG4gICAgICAgICd0eXBlJzogJ2R0eXBlJyxcbiAgICAgICAgJ25vdFN1cHBvcnRlZCc6IHRydWVcbiAgICAgIH1cbiAgICBdXG4gIH0sXG4gIHtcbiAgICAndGZPcE5hbWUnOiAnQXRhbicsXG4gICAgJ2NhdGVnb3J5JzogJ2Jhc2ljX21hdGgnLFxuICAgICdpbnB1dHMnOiBbXG4gICAgICB7XG4gICAgICAgICdzdGFydCc6IDAsXG4gICAgICAgICduYW1lJzogJ3gnLFxuICAgICAgICAndHlwZSc6ICd0ZW5zb3InXG4gICAgICB9XG4gICAgXSxcbiAgICAnYXR0cnMnOiBbXG4gICAgICB7XG4gICAgICAgICd0Zk5hbWUnOiAnVCcsXG4gICAgICAgICduYW1lJzogJ2R0eXBlJyxcbiAgICAgICAgJ3R5cGUnOiAnZHR5cGUnLFxuICAgICAgICAnbm90U3VwcG9ydGVkJzogdHJ1ZVxuICAgICAgfVxuICAgIF1cbiAgfSxcbiAge1xuICAgICd0Zk9wTmFtZSc6ICdBdGFuMicsXG4gICAgJ2NhdGVnb3J5JzogJ2Jhc2ljX21hdGgnLFxuICAgICdpbnB1dHMnOiBbXG4gICAgICB7XG4gICAgICAgICdzdGFydCc6IDAsXG4gICAgICAgICduYW1lJzogJ3gnLFxuICAgICAgICAndHlwZSc6ICd0ZW5zb3InXG4gICAgICB9LFxuICAgICAge1xuICAgICAgICAnc3RhcnQnOiAxLFxuICAgICAgICAnbmFtZSc6ICd5JyxcbiAgICAgICAgJ3R5cGUnOiAndGVuc29yJ1xuICAgICAgfVxuICAgIF0sXG4gICAgJ2F0dHJzJzogW1xuICAgICAge1xuICAgICAgICAndGZOYW1lJzogJ1QnLFxuICAgICAgICAnbmFtZSc6ICdkdHlwZScsXG4gICAgICAgICd0eXBlJzogJ2R0eXBlJyxcbiAgICAgICAgJ25vdFN1cHBvcnRlZCc6IHRydWVcbiAgICAgIH1cbiAgICBdXG4gIH0sXG4gIHtcbiAgICAndGZPcE5hbWUnOiAnQ2VpbCcsXG4gICAgJ2NhdGVnb3J5JzogJ2Jhc2ljX21hdGgnLFxuICAgICdpbnB1dHMnOiBbXG4gICAgICB7XG4gICAgICAgICdzdGFydCc6IDAsXG4gICAgICAgICduYW1lJzogJ3gnLFxuICAgICAgICAndHlwZSc6ICd0ZW5zb3InXG4gICAgICB9XG4gICAgXSxcbiAgICAnYXR0cnMnOiBbXG4gICAgICB7XG4gICAgICAgICd0Zk5hbWUnOiAnVCcsXG4gICAgICAgICduYW1lJzogJ2R0eXBlJyxcbiAgICAgICAgJ3R5cGUnOiAnZHR5cGUnLFxuICAgICAgICAnbm90U3VwcG9ydGVkJzogdHJ1ZVxuICAgICAgfVxuICAgIF1cbiAgfSxcbiAge1xuICAgICd0Zk9wTmFtZSc6ICdDbGlwQnlWYWx1ZScsXG4gICAgJ2NhdGVnb3J5JzogJ2Jhc2ljX21hdGgnLFxuICAgICdpbnB1dHMnOiBbXG4gICAgICB7XG4gICAgICAgICdzdGFydCc6IDAsXG4gICAgICAgICduYW1lJzogJ3gnLFxuICAgICAgICAndHlwZSc6ICd0ZW5zb3InXG4gICAgICB9LFxuICAgICAge1xuICAgICAgICAnc3RhcnQnOiAxLFxuICAgICAgICAnbmFtZSc6ICdjbGlwVmFsdWVNaW4nLFxuICAgICAgICAndHlwZSc6ICdudW1iZXInXG4gICAgICB9LFxuICAgICAge1xuICAgICAgICAnc3RhcnQnOiAyLFxuICAgICAgICAnbmFtZSc6ICdjbGlwVmFsdWVNYXgnLFxuICAgICAgICAndHlwZSc6ICdudW1iZXInXG4gICAgICB9XG4gICAgXSxcbiAgICAnYXR0cnMnOiBbXG4gICAgICB7XG4gICAgICAgICd0Zk5hbWUnOiAnVCcsXG4gICAgICAgICduYW1lJzogJ2R0eXBlJyxcbiAgICAgICAgJ3R5cGUnOiAnZHR5cGUnLFxuICAgICAgICAnbm90U3VwcG9ydGVkJzogdHJ1ZVxuICAgICAgfVxuICAgIF1cbiAgfSxcbiAge1xuICAgICd0Zk9wTmFtZSc6ICdDb21wbGV4JyxcbiAgICAnY2F0ZWdvcnknOiAnYmFzaWNfbWF0aCcsXG4gICAgJ2lucHV0cyc6IFtcbiAgICAgIHtcbiAgICAgICAgJ3N0YXJ0JzogMCxcbiAgICAgICAgJ25hbWUnOiAncmVhbCcsXG4gICAgICAgICd0eXBlJzogJ3RlbnNvcidcbiAgICAgIH0sXG4gICAgICB7XG4gICAgICAgICdzdGFydCc6IDEsXG4gICAgICAgICduYW1lJzogJ2ltYWcnLFxuICAgICAgICAndHlwZSc6ICd0ZW5zb3InXG4gICAgICB9XG4gICAgXSxcbiAgICAnYXR0cnMnOiBbXG4gICAgICB7XG4gICAgICAgICd0Zk5hbWUnOiAnVCcsXG4gICAgICAgICduYW1lJzogJ2R0eXBlJyxcbiAgICAgICAgJ3R5cGUnOiAnZHR5cGUnLFxuICAgICAgICAnbm90U3VwcG9ydGVkJzogdHJ1ZVxuICAgICAgfVxuICAgIF1cbiAgfSxcbiAge1xuICAgICd0Zk9wTmFtZSc6ICdDb21wbGV4QWJzJyxcbiAgICAnY2F0ZWdvcnknOiAnYmFzaWNfbWF0aCcsXG4gICAgJ2lucHV0cyc6IFtcbiAgICAgIHtcbiAgICAgICAgJ3N0YXJ0JzogMCxcbiAgICAgICAgJ25hbWUnOiAneCcsXG4gICAgICAgICd0eXBlJzogJ3RlbnNvcidcbiAgICAgIH1cbiAgICBdLFxuICAgICdhdHRycyc6IFtcbiAgICAgIHtcbiAgICAgICAgJ3RmTmFtZSc6ICdUJyxcbiAgICAgICAgJ25hbWUnOiAnZHR5cGUnLFxuICAgICAgICAndHlwZSc6ICdkdHlwZScsXG4gICAgICAgICdub3RTdXBwb3J0ZWQnOiB0cnVlXG4gICAgICB9XG4gICAgXVxuICB9LFxuICB7XG4gICAgJ3RmT3BOYW1lJzogJ0NvcycsXG4gICAgJ2NhdGVnb3J5JzogJ2Jhc2ljX21hdGgnLFxuICAgICdpbnB1dHMnOiBbXG4gICAgICB7XG4gICAgICAgICdzdGFydCc6IDAsXG4gICAgICAgICduYW1lJzogJ3gnLFxuICAgICAgICAndHlwZSc6ICd0ZW5zb3InXG4gICAgICB9XG4gICAgXSxcbiAgICAnYXR0cnMnOiBbXG4gICAgICB7XG4gICAgICAgICd0Zk5hbWUnOiAnVCcsXG4gICAgICAgICduYW1lJzogJ2R0eXBlJyxcbiAgICAgICAgJ3R5cGUnOiAnZHR5cGUnLFxuICAgICAgICAnbm90U3VwcG9ydGVkJzogdHJ1ZVxuICAgICAgfVxuICAgIF1cbiAgfSxcbiAge1xuICAgICd0Zk9wTmFtZSc6ICdDb3NoJyxcbiAgICAnY2F0ZWdvcnknOiAnYmFzaWNfbWF0aCcsXG4gICAgJ2lucHV0cyc6IFtcbiAgICAgIHtcbiAgICAgICAgJ3N0YXJ0JzogMCxcbiAgICAgICAgJ25hbWUnOiAneCcsXG4gICAgICAgICd0eXBlJzogJ3RlbnNvcidcbiAgICAgIH1cbiAgICBdLFxuICAgICdhdHRycyc6IFtcbiAgICAgIHtcbiAgICAgICAgJ3RmTmFtZSc6ICdUJyxcbiAgICAgICAgJ25hbWUnOiAnZHR5cGUnLFxuICAgICAgICAndHlwZSc6ICdkdHlwZScsXG4gICAgICAgICdub3RTdXBwb3J0ZWQnOiB0cnVlXG4gICAgICB9XG4gICAgXVxuICB9LFxuICB7XG4gICAgJ3RmT3BOYW1lJzogJ0VsdScsXG4gICAgJ2NhdGVnb3J5JzogJ2Jhc2ljX21hdGgnLFxuICAgICdpbnB1dHMnOiBbXG4gICAgICB7XG4gICAgICAgICdzdGFydCc6IDAsXG4gICAgICAgICduYW1lJzogJ3gnLFxuICAgICAgICAndHlwZSc6ICd0ZW5zb3InXG4gICAgICB9XG4gICAgXSxcbiAgICAnYXR0cnMnOiBbXG4gICAgICB7XG4gICAgICAgICd0Zk5hbWUnOiAnVCcsXG4gICAgICAgICduYW1lJzogJ2R0eXBlJyxcbiAgICAgICAgJ3R5cGUnOiAnZHR5cGUnLFxuICAgICAgICAnbm90U3VwcG9ydGVkJzogdHJ1ZVxuICAgICAgfVxuICAgIF1cbiAgfSxcbiAge1xuICAgICd0Zk9wTmFtZSc6ICdFeHAnLFxuICAgICdjYXRlZ29yeSc6ICdiYXNpY19tYXRoJyxcbiAgICAnaW5wdXRzJzogW1xuICAgICAge1xuICAgICAgICAnc3RhcnQnOiAwLFxuICAgICAgICAnbmFtZSc6ICd4JyxcbiAgICAgICAgJ3R5cGUnOiAndGVuc29yJ1xuICAgICAgfVxuICAgIF0sXG4gICAgJ2F0dHJzJzogW1xuICAgICAge1xuICAgICAgICAndGZOYW1lJzogJ1QnLFxuICAgICAgICAnbmFtZSc6ICdkdHlwZScsXG4gICAgICAgICd0eXBlJzogJ2R0eXBlJyxcbiAgICAgICAgJ25vdFN1cHBvcnRlZCc6IHRydWVcbiAgICAgIH1cbiAgICBdXG4gIH0sXG4gIHtcbiAgICAndGZPcE5hbWUnOiAnRmxvb3InLFxuICAgICdjYXRlZ29yeSc6ICdiYXNpY19tYXRoJyxcbiAgICAnaW5wdXRzJzogW1xuICAgICAge1xuICAgICAgICAnc3RhcnQnOiAwLFxuICAgICAgICAnbmFtZSc6ICd4JyxcbiAgICAgICAgJ3R5cGUnOiAndGVuc29yJ1xuICAgICAgfVxuICAgIF0sXG4gICAgJ2F0dHJzJzogW1xuICAgICAge1xuICAgICAgICAndGZOYW1lJzogJ1QnLFxuICAgICAgICAnbmFtZSc6ICdkdHlwZScsXG4gICAgICAgICd0eXBlJzogJ2R0eXBlJyxcbiAgICAgICAgJ25vdFN1cHBvcnRlZCc6IHRydWVcbiAgICAgIH1cbiAgICBdXG4gIH0sXG4gIHtcbiAgICAndGZPcE5hbWUnOiAnTG9nJyxcbiAgICAnY2F0ZWdvcnknOiAnYmFzaWNfbWF0aCcsXG4gICAgJ2lucHV0cyc6IFtcbiAgICAgIHtcbiAgICAgICAgJ3N0YXJ0JzogMCxcbiAgICAgICAgJ25hbWUnOiAneCcsXG4gICAgICAgICd0eXBlJzogJ3RlbnNvcidcbiAgICAgIH1cbiAgICBdLFxuICAgICdhdHRycyc6IFtcbiAgICAgIHtcbiAgICAgICAgJ3RmTmFtZSc6ICdUJyxcbiAgICAgICAgJ25hbWUnOiAnZHR5cGUnLFxuICAgICAgICAndHlwZSc6ICdkdHlwZScsXG4gICAgICAgICdub3RTdXBwb3J0ZWQnOiB0cnVlXG4gICAgICB9XG4gICAgXVxuICB9LFxuICB7XG4gICAgJ3RmT3BOYW1lJzogJ0ltYWcnLFxuICAgICdjYXRlZ29yeSc6ICdiYXNpY19tYXRoJyxcbiAgICAnaW5wdXRzJzogW1xuICAgICAge1xuICAgICAgICAnc3RhcnQnOiAwLFxuICAgICAgICAnbmFtZSc6ICd4JyxcbiAgICAgICAgJ3R5cGUnOiAndGVuc29yJ1xuICAgICAgfVxuICAgIF0sXG4gICAgJ2F0dHJzJzogW1xuICAgICAge1xuICAgICAgICAndGZOYW1lJzogJ1QnLFxuICAgICAgICAnbmFtZSc6ICdkdHlwZScsXG4gICAgICAgICd0eXBlJzogJ2R0eXBlJyxcbiAgICAgICAgJ25vdFN1cHBvcnRlZCc6IHRydWVcbiAgICAgIH0sXG4gICAgICB7XG4gICAgICAgICd0Zk5hbWUnOiAnVG91dCcsXG4gICAgICAgICduYW1lJzogJ291dHB1dFR5cGUnLFxuICAgICAgICAndHlwZSc6ICdkdHlwZScsXG4gICAgICAgICdub3RTdXBwb3J0ZWQnOiB0cnVlXG4gICAgICB9XG4gICAgXVxuICB9LFxuICB7XG4gICAgJ3RmT3BOYW1lJzogJ05lZycsXG4gICAgJ2NhdGVnb3J5JzogJ2Jhc2ljX21hdGgnLFxuICAgICdpbnB1dHMnOiBbXG4gICAgICB7XG4gICAgICAgICdzdGFydCc6IDAsXG4gICAgICAgICduYW1lJzogJ3gnLFxuICAgICAgICAndHlwZSc6ICd0ZW5zb3InXG4gICAgICB9XG4gICAgXSxcbiAgICAnYXR0cnMnOiBbXG4gICAgICB7XG4gICAgICAgICd0Zk5hbWUnOiAnVCcsXG4gICAgICAgICduYW1lJzogJ2R0eXBlJyxcbiAgICAgICAgJ3R5cGUnOiAnZHR5cGUnLFxuICAgICAgICAnbm90U3VwcG9ydGVkJzogdHJ1ZVxuICAgICAgfVxuICAgIF1cbiAgfSxcbiAge1xuICAgICd0Zk9wTmFtZSc6ICdSZWFsJyxcbiAgICAnY2F0ZWdvcnknOiAnYmFzaWNfbWF0aCcsXG4gICAgJ2lucHV0cyc6IFtcbiAgICAgIHtcbiAgICAgICAgJ3N0YXJ0JzogMCxcbiAgICAgICAgJ25hbWUnOiAneCcsXG4gICAgICAgICd0eXBlJzogJ3RlbnNvcidcbiAgICAgIH1cbiAgICBdLFxuICAgICdhdHRycyc6IFtcbiAgICAgIHtcbiAgICAgICAgJ3RmTmFtZSc6ICdUJyxcbiAgICAgICAgJ25hbWUnOiAnZHR5cGUnLFxuICAgICAgICAndHlwZSc6ICdkdHlwZScsXG4gICAgICAgICdub3RTdXBwb3J0ZWQnOiB0cnVlXG4gICAgICB9LFxuICAgICAge1xuICAgICAgICAndGZOYW1lJzogJ1RvdXQnLFxuICAgICAgICAnbmFtZSc6ICdvdXRwdXRUeXBlJyxcbiAgICAgICAgJ3R5cGUnOiAnZHR5cGUnLFxuICAgICAgICAnbm90U3VwcG9ydGVkJzogdHJ1ZVxuICAgICAgfVxuICAgIF1cbiAgfSxcbiAge1xuICAgICd0Zk9wTmFtZSc6ICdQcmVsdScsXG4gICAgJ2NhdGVnb3J5JzogJ2Jhc2ljX21hdGgnLFxuICAgICdpbnB1dHMnOiBbXG4gICAgICB7XG4gICAgICAgICdzdGFydCc6IDAsXG4gICAgICAgICduYW1lJzogJ3gnLFxuICAgICAgICAndHlwZSc6ICd0ZW5zb3InXG4gICAgICB9LFxuICAgICAge1xuICAgICAgICAnc3RhcnQnOiAxLFxuICAgICAgICAnbmFtZSc6ICdhbHBoYScsXG4gICAgICAgICd0eXBlJzogJ3RlbnNvcidcbiAgICAgIH1cbiAgICBdLFxuICAgICdhdHRycyc6IFtcbiAgICAgIHtcbiAgICAgICAgJ3RmTmFtZSc6ICdUJyxcbiAgICAgICAgJ25hbWUnOiAnZHR5cGUnLFxuICAgICAgICAndHlwZSc6ICdkdHlwZScsXG4gICAgICAgICdub3RTdXBwb3J0ZWQnOiB0cnVlXG4gICAgICB9XG4gICAgXVxuICB9LFxuICB7XG4gICAgJ3RmT3BOYW1lJzogJ1JlbHUnLFxuICAgICdjYXRlZ29yeSc6ICdiYXNpY19tYXRoJyxcbiAgICAnaW5wdXRzJzogW1xuICAgICAge1xuICAgICAgICAnc3RhcnQnOiAwLFxuICAgICAgICAnbmFtZSc6ICd4JyxcbiAgICAgICAgJ3R5cGUnOiAndGVuc29yJ1xuICAgICAgfVxuICAgIF0sXG4gICAgJ2F0dHJzJzogW1xuICAgICAge1xuICAgICAgICAndGZOYW1lJzogJ1QnLFxuICAgICAgICAnbmFtZSc6ICdkdHlwZScsXG4gICAgICAgICd0eXBlJzogJ2R0eXBlJyxcbiAgICAgICAgJ25vdFN1cHBvcnRlZCc6IHRydWVcbiAgICAgIH1cbiAgICBdXG4gIH0sXG4gIHtcbiAgICAndGZPcE5hbWUnOiAnUmVsdTYnLFxuICAgICdjYXRlZ29yeSc6ICdiYXNpY19tYXRoJyxcbiAgICAnaW5wdXRzJzogW1xuICAgICAge1xuICAgICAgICAnc3RhcnQnOiAwLFxuICAgICAgICAnbmFtZSc6ICd4JyxcbiAgICAgICAgJ3R5cGUnOiAndGVuc29yJ1xuICAgICAgfVxuICAgIF0sXG4gICAgJ2F0dHJzJzogW1xuICAgICAge1xuICAgICAgICAndGZOYW1lJzogJ1QnLFxuICAgICAgICAnbmFtZSc6ICdkdHlwZScsXG4gICAgICAgICd0eXBlJzogJ2R0eXBlJyxcbiAgICAgICAgJ25vdFN1cHBvcnRlZCc6IHRydWVcbiAgICAgIH1cbiAgICBdXG4gIH0sXG4gIHtcbiAgICAndGZPcE5hbWUnOiAnU2VsdScsXG4gICAgJ2NhdGVnb3J5JzogJ2Jhc2ljX21hdGgnLFxuICAgICdpbnB1dHMnOiBbXG4gICAgICB7XG4gICAgICAgICdzdGFydCc6IDAsXG4gICAgICAgICduYW1lJzogJ3gnLFxuICAgICAgICAndHlwZSc6ICd0ZW5zb3InXG4gICAgICB9XG4gICAgXSxcbiAgICAnYXR0cnMnOiBbXG4gICAgICB7XG4gICAgICAgICd0Zk5hbWUnOiAnVCcsXG4gICAgICAgICduYW1lJzogJ2R0eXBlJyxcbiAgICAgICAgJ3R5cGUnOiAnZHR5cGUnLFxuICAgICAgICAnbm90U3VwcG9ydGVkJzogdHJ1ZVxuICAgICAgfVxuICAgIF1cbiAgfSxcbiAge1xuICAgICd0Zk9wTmFtZSc6ICdTaWdtb2lkJyxcbiAgICAnY2F0ZWdvcnknOiAnYmFzaWNfbWF0aCcsXG4gICAgJ2lucHV0cyc6IFtcbiAgICAgIHtcbiAgICAgICAgJ3N0YXJ0JzogMCxcbiAgICAgICAgJ25hbWUnOiAneCcsXG4gICAgICAgICd0eXBlJzogJ3RlbnNvcidcbiAgICAgIH1cbiAgICBdLFxuICAgICdhdHRycyc6IFtcbiAgICAgIHtcbiAgICAgICAgJ3RmTmFtZSc6ICdUJyxcbiAgICAgICAgJ25hbWUnOiAnZHR5cGUnLFxuICAgICAgICAndHlwZSc6ICdkdHlwZScsXG4gICAgICAgICdub3RTdXBwb3J0ZWQnOiB0cnVlXG4gICAgICB9XG4gICAgXVxuICB9LFxuICB7XG4gICAgJ3RmT3BOYW1lJzogJ1NpbicsXG4gICAgJ2NhdGVnb3J5JzogJ2Jhc2ljX21hdGgnLFxuICAgICdpbnB1dHMnOiBbXG4gICAgICB7XG4gICAgICAgICdzdGFydCc6IDAsXG4gICAgICAgICduYW1lJzogJ3gnLFxuICAgICAgICAndHlwZSc6ICd0ZW5zb3InXG4gICAgICB9XG4gICAgXSxcbiAgICAnYXR0cnMnOiBbXG4gICAgICB7XG4gICAgICAgICd0Zk5hbWUnOiAnVCcsXG4gICAgICAgICduYW1lJzogJ2R0eXBlJyxcbiAgICAgICAgJ3R5cGUnOiAnZHR5cGUnLFxuICAgICAgICAnbm90U3VwcG9ydGVkJzogdHJ1ZVxuICAgICAgfVxuICAgIF1cbiAgfSxcbiAge1xuICAgICd0Zk9wTmFtZSc6ICdTaW5oJyxcbiAgICAnY2F0ZWdvcnknOiAnYmFzaWNfbWF0aCcsXG4gICAgJ2lucHV0cyc6IFtcbiAgICAgIHtcbiAgICAgICAgJ3N0YXJ0JzogMCxcbiAgICAgICAgJ25hbWUnOiAneCcsXG4gICAgICAgICd0eXBlJzogJ3RlbnNvcidcbiAgICAgIH1cbiAgICBdLFxuICAgICdhdHRycyc6IFtcbiAgICAgIHtcbiAgICAgICAgJ3RmTmFtZSc6ICdUJyxcbiAgICAgICAgJ25hbWUnOiAnZHR5cGUnLFxuICAgICAgICAndHlwZSc6ICdkdHlwZScsXG4gICAgICAgICdub3RTdXBwb3J0ZWQnOiB0cnVlXG4gICAgICB9XG4gICAgXVxuICB9LFxuICB7XG4gICAgJ3RmT3BOYW1lJzogJ1NxcnQnLFxuICAgICdjYXRlZ29yeSc6ICdiYXNpY19tYXRoJyxcbiAgICAnaW5wdXRzJzogW1xuICAgICAge1xuICAgICAgICAnc3RhcnQnOiAwLFxuICAgICAgICAnbmFtZSc6ICd4JyxcbiAgICAgICAgJ3R5cGUnOiAndGVuc29yJ1xuICAgICAgfVxuICAgIF0sXG4gICAgJ2F0dHJzJzogW1xuICAgICAge1xuICAgICAgICAndGZOYW1lJzogJ1QnLFxuICAgICAgICAnbmFtZSc6ICdkdHlwZScsXG4gICAgICAgICd0eXBlJzogJ2R0eXBlJyxcbiAgICAgICAgJ25vdFN1cHBvcnRlZCc6IHRydWVcbiAgICAgIH1cbiAgICBdXG4gIH0sXG4gIHtcbiAgICAndGZPcE5hbWUnOiAnUnNxcnQnLFxuICAgICdjYXRlZ29yeSc6ICdiYXNpY19tYXRoJyxcbiAgICAnaW5wdXRzJzogW1xuICAgICAge1xuICAgICAgICAnc3RhcnQnOiAwLFxuICAgICAgICAnbmFtZSc6ICd4JyxcbiAgICAgICAgJ3R5cGUnOiAndGVuc29yJ1xuICAgICAgfVxuICAgIF0sXG4gICAgJ2F0dHJzJzogW1xuICAgICAge1xuICAgICAgICAndGZOYW1lJzogJ1QnLFxuICAgICAgICAnbmFtZSc6ICdkdHlwZScsXG4gICAgICAgICd0eXBlJzogJ2R0eXBlJyxcbiAgICAgICAgJ25vdFN1cHBvcnRlZCc6IHRydWVcbiAgICAgIH1cbiAgICBdXG4gIH0sXG4gIHtcbiAgICAndGZPcE5hbWUnOiAnU3F1YXJlJyxcbiAgICAnY2F0ZWdvcnknOiAnYmFzaWNfbWF0aCcsXG4gICAgJ2lucHV0cyc6IFtcbiAgICAgIHtcbiAgICAgICAgJ3N0YXJ0JzogMCxcbiAgICAgICAgJ25hbWUnOiAneCcsXG4gICAgICAgICd0eXBlJzogJ3RlbnNvcidcbiAgICAgIH1cbiAgICBdLFxuICAgICdhdHRycyc6IFtcbiAgICAgIHtcbiAgICAgICAgJ3RmTmFtZSc6ICdUJyxcbiAgICAgICAgJ25hbWUnOiAnZHR5cGUnLFxuICAgICAgICAndHlwZSc6ICdkdHlwZScsXG4gICAgICAgICdub3RTdXBwb3J0ZWQnOiB0cnVlXG4gICAgICB9XG4gICAgXVxuICB9LFxuICB7XG4gICAgJ3RmT3BOYW1lJzogJ1RhbicsXG4gICAgJ2NhdGVnb3J5JzogJ2Jhc2ljX21hdGgnLFxuICAgICdpbnB1dHMnOiBbXG4gICAgICB7XG4gICAgICAgICdzdGFydCc6IDAsXG4gICAgICAgICduYW1lJzogJ3gnLFxuICAgICAgICAndHlwZSc6ICd0ZW5zb3InXG4gICAgICB9XG4gICAgXSxcbiAgICAnYXR0cnMnOiBbXG4gICAgICB7XG4gICAgICAgICd0Zk5hbWUnOiAnVCcsXG4gICAgICAgICduYW1lJzogJ2R0eXBlJyxcbiAgICAgICAgJ3R5cGUnOiAnZHR5cGUnLFxuICAgICAgICAnbm90U3VwcG9ydGVkJzogdHJ1ZVxuICAgICAgfVxuICAgIF1cbiAgfSxcbiAge1xuICAgICd0Zk9wTmFtZSc6ICdUYW5oJyxcbiAgICAnY2F0ZWdvcnknOiAnYmFzaWNfbWF0aCcsXG4gICAgJ2lucHV0cyc6IFtcbiAgICAgIHtcbiAgICAgICAgJ3N0YXJ0JzogMCxcbiAgICAgICAgJ25hbWUnOiAneCcsXG4gICAgICAgICd0eXBlJzogJ3RlbnNvcidcbiAgICAgIH1cbiAgICBdLFxuICAgICdhdHRycyc6IFtcbiAgICAgIHtcbiAgICAgICAgJ3RmTmFtZSc6ICdUJyxcbiAgICAgICAgJ25hbWUnOiAnZHR5cGUnLFxuICAgICAgICAndHlwZSc6ICdkdHlwZScsXG4gICAgICAgICdub3RTdXBwb3J0ZWQnOiB0cnVlXG4gICAgICB9XG4gICAgXVxuICB9LFxuICB7XG4gICAgJ3RmT3BOYW1lJzogJ1NpZ24nLFxuICAgICdjYXRlZ29yeSc6ICdiYXNpY19tYXRoJyxcbiAgICAnaW5wdXRzJzogW1xuICAgICAge1xuICAgICAgICAnc3RhcnQnOiAwLFxuICAgICAgICAnbmFtZSc6ICd4JyxcbiAgICAgICAgJ3R5cGUnOiAndGVuc29yJ1xuICAgICAgfVxuICAgIF0sXG4gICAgJ2F0dHJzJzogW1xuICAgICAge1xuICAgICAgICAndGZOYW1lJzogJ1QnLFxuICAgICAgICAnbmFtZSc6ICdkdHlwZScsXG4gICAgICAgICd0eXBlJzogJ2R0eXBlJyxcbiAgICAgICAgJ25vdFN1cHBvcnRlZCc6IHRydWVcbiAgICAgIH1cbiAgICBdXG4gIH0sXG4gIHtcbiAgICAndGZPcE5hbWUnOiAnUm91bmQnLFxuICAgICdjYXRlZ29yeSc6ICdiYXNpY19tYXRoJyxcbiAgICAnaW5wdXRzJzogW1xuICAgICAge1xuICAgICAgICAnc3RhcnQnOiAwLFxuICAgICAgICAnbmFtZSc6ICd4JyxcbiAgICAgICAgJ3R5cGUnOiAndGVuc29yJ1xuICAgICAgfVxuICAgIF0sXG4gICAgJ2F0dHJzJzogW1xuICAgICAge1xuICAgICAgICAndGZOYW1lJzogJ1QnLFxuICAgICAgICAnbmFtZSc6ICdkdHlwZScsXG4gICAgICAgICd0eXBlJzogJ2R0eXBlJyxcbiAgICAgICAgJ25vdFN1cHBvcnRlZCc6IHRydWVcbiAgICAgIH1cbiAgICBdXG4gIH0sXG4gIHtcbiAgICAndGZPcE5hbWUnOiAnRXhwbTEnLFxuICAgICdjYXRlZ29yeSc6ICdiYXNpY19tYXRoJyxcbiAgICAnaW5wdXRzJzogW1xuICAgICAge1xuICAgICAgICAnc3RhcnQnOiAwLFxuICAgICAgICAnbmFtZSc6ICd4JyxcbiAgICAgICAgJ3R5cGUnOiAndGVuc29yJ1xuICAgICAgfVxuICAgIF0sXG4gICAgJ2F0dHJzJzogW1xuICAgICAge1xuICAgICAgICAndGZOYW1lJzogJ1QnLFxuICAgICAgICAnbmFtZSc6ICdkdHlwZScsXG4gICAgICAgICd0eXBlJzogJ2R0eXBlJyxcbiAgICAgICAgJ25vdFN1cHBvcnRlZCc6IHRydWVcbiAgICAgIH1cbiAgICBdXG4gIH0sXG4gIHtcbiAgICAndGZPcE5hbWUnOiAnTG9nMXAnLFxuICAgICdjYXRlZ29yeSc6ICdiYXNpY19tYXRoJyxcbiAgICAnaW5wdXRzJzogW1xuICAgICAge1xuICAgICAgICAnc3RhcnQnOiAwLFxuICAgICAgICAnbmFtZSc6ICd4JyxcbiAgICAgICAgJ3R5cGUnOiAndGVuc29yJ1xuICAgICAgfVxuICAgIF0sXG4gICAgJ2F0dHJzJzogW1xuICAgICAge1xuICAgICAgICAndGZOYW1lJzogJ1QnLFxuICAgICAgICAnbmFtZSc6ICdkdHlwZScsXG4gICAgICAgICd0eXBlJzogJ2R0eXBlJyxcbiAgICAgICAgJ25vdFN1cHBvcnRlZCc6IHRydWVcbiAgICAgIH1cbiAgICBdXG4gIH0sXG4gIHtcbiAgICAndGZPcE5hbWUnOiAnUmVjaXByb2NhbCcsXG4gICAgJ2NhdGVnb3J5JzogJ2Jhc2ljX21hdGgnLFxuICAgICdpbnB1dHMnOiBbXG4gICAgICB7XG4gICAgICAgICdzdGFydCc6IDAsXG4gICAgICAgICduYW1lJzogJ3gnLFxuICAgICAgICAndHlwZSc6ICd0ZW5zb3InXG4gICAgICB9XG4gICAgXSxcbiAgICAnYXR0cnMnOiBbXG4gICAgICB7XG4gICAgICAgICd0Zk5hbWUnOiAnVCcsXG4gICAgICAgICduYW1lJzogJ2R0eXBlJyxcbiAgICAgICAgJ3R5cGUnOiAnZHR5cGUnLFxuICAgICAgICAnbm90U3VwcG9ydGVkJzogdHJ1ZVxuICAgICAgfVxuICAgIF1cbiAgfSxcbiAge1xuICAgICd0Zk9wTmFtZSc6ICdTb2Z0cGx1cycsXG4gICAgJ2NhdGVnb3J5JzogJ2Jhc2ljX21hdGgnLFxuICAgICdpbnB1dHMnOiBbXG4gICAgICB7XG4gICAgICAgICdzdGFydCc6IDAsXG4gICAgICAgICduYW1lJzogJ3gnLFxuICAgICAgICAndHlwZSc6ICd0ZW5zb3InXG4gICAgICB9XG4gICAgXSxcbiAgICAnYXR0cnMnOiBbXG4gICAgICB7XG4gICAgICAgICd0Zk5hbWUnOiAnVCcsXG4gICAgICAgICduYW1lJzogJ2R0eXBlJyxcbiAgICAgICAgJ3R5cGUnOiAnZHR5cGUnLFxuICAgICAgICAnbm90U3VwcG9ydGVkJzogdHJ1ZVxuICAgICAgfVxuICAgIF1cbiAgfSxcbiAge1xuICAgICd0Zk9wTmFtZSc6ICdBc2luaCcsXG4gICAgJ2NhdGVnb3J5JzogJ2Jhc2ljX21hdGgnLFxuICAgICdpbnB1dHMnOiBbXG4gICAgICB7XG4gICAgICAgICdzdGFydCc6IDAsXG4gICAgICAgICduYW1lJzogJ3gnLFxuICAgICAgICAndHlwZSc6ICd0ZW5zb3InXG4gICAgICB9XG4gICAgXSxcbiAgICAnYXR0cnMnOiBbXG4gICAgICB7XG4gICAgICAgICd0Zk5hbWUnOiAnVCcsXG4gICAgICAgICduYW1lJzogJ2R0eXBlJyxcbiAgICAgICAgJ3R5cGUnOiAnZHR5cGUnLFxuICAgICAgICAnbm90U3VwcG9ydGVkJzogdHJ1ZVxuICAgICAgfVxuICAgIF1cbiAgfSxcbiAge1xuICAgICd0Zk9wTmFtZSc6ICdBY29zaCcsXG4gICAgJ2NhdGVnb3J5JzogJ2Jhc2ljX21hdGgnLFxuICAgICdpbnB1dHMnOiBbXG4gICAgICB7XG4gICAgICAgICdzdGFydCc6IDAsXG4gICAgICAgICduYW1lJzogJ3gnLFxuICAgICAgICAndHlwZSc6ICd0ZW5zb3InXG4gICAgICB9XG4gICAgXSxcbiAgICAnYXR0cnMnOiBbXG4gICAgICB7XG4gICAgICAgICd0Zk5hbWUnOiAnVCcsXG4gICAgICAgICduYW1lJzogJ2R0eXBlJyxcbiAgICAgICAgJ3R5cGUnOiAnZHR5cGUnLFxuICAgICAgICAnbm90U3VwcG9ydGVkJzogdHJ1ZVxuICAgICAgfVxuICAgIF1cbiAgfSxcbiAge1xuICAgICd0Zk9wTmFtZSc6ICdBdGFuaCcsXG4gICAgJ2NhdGVnb3J5JzogJ2Jhc2ljX21hdGgnLFxuICAgICdpbnB1dHMnOiBbXG4gICAgICB7XG4gICAgICAgICdzdGFydCc6IDAsXG4gICAgICAgICduYW1lJzogJ3gnLFxuICAgICAgICAndHlwZSc6ICd0ZW5zb3InXG4gICAgICB9XG4gICAgXSxcbiAgICAnYXR0cnMnOiBbXG4gICAgICB7XG4gICAgICAgICd0Zk5hbWUnOiAnVCcsXG4gICAgICAgICduYW1lJzogJ2R0eXBlJyxcbiAgICAgICAgJ3R5cGUnOiAnZHR5cGUnLFxuICAgICAgICAnbm90U3VwcG9ydGVkJzogdHJ1ZVxuICAgICAgfVxuICAgIF1cbiAgfSxcbiAge1xuICAgICd0Zk9wTmFtZSc6ICdFcmYnLFxuICAgICdjYXRlZ29yeSc6ICdiYXNpY19tYXRoJyxcbiAgICAnaW5wdXRzJzogW1xuICAgICAge1xuICAgICAgICAnc3RhcnQnOiAwLFxuICAgICAgICAnbmFtZSc6ICd4JyxcbiAgICAgICAgJ3R5cGUnOiAndGVuc29yJ1xuICAgICAgfVxuICAgIF0sXG4gICAgJ2F0dHJzJzogW1xuICAgICAge1xuICAgICAgICAndGZOYW1lJzogJ1QnLFxuICAgICAgICAnbmFtZSc6ICdkdHlwZScsXG4gICAgICAgICd0eXBlJzogJ2R0eXBlJyxcbiAgICAgICAgJ25vdFN1cHBvcnRlZCc6IHRydWVcbiAgICAgIH1cbiAgICBdXG4gIH0sXG4gIHtcbiAgICAndGZPcE5hbWUnOiAnUHJvZCcsXG4gICAgJ2NhdGVnb3J5JzogJ2Jhc2ljX21hdGgnLFxuICAgICdpbnB1dHMnOiBbXG4gICAgICB7XG4gICAgICAgICdzdGFydCc6IDAsXG4gICAgICAgICduYW1lJzogJ3gnLFxuICAgICAgICAndHlwZSc6ICd0ZW5zb3InXG4gICAgICB9LFxuICAgICAge1xuICAgICAgICAnc3RhcnQnOiAxLFxuICAgICAgICAnbmFtZSc6ICdheGVzJyxcbiAgICAgICAgJ3R5cGUnOiAnbnVtYmVyW10nXG4gICAgICB9XG4gICAgXSxcbiAgICAnYXR0cnMnOiBbXG4gICAgICB7XG4gICAgICAgICd0Zk5hbWUnOiAna2VlcF9kaW1zJyxcbiAgICAgICAgJ25hbWUnOiAna2VlcERpbXMnLFxuICAgICAgICAndHlwZSc6ICdib29sJyxcbiAgICAgICAgJ25vdFN1cHBvcnRlZCc6IHRydWVcbiAgICAgIH0sXG4gICAgICB7XG4gICAgICAgICd0Zk5hbWUnOiAnVCcsXG4gICAgICAgICduYW1lJzogJ2R0eXBlJyxcbiAgICAgICAgJ3R5cGUnOiAnZHR5cGUnLFxuICAgICAgICAnbm90U3VwcG9ydGVkJzogdHJ1ZVxuICAgICAgfVxuICAgIF1cbiAgfSxcbiAge1xuICAgICd0Zk9wTmFtZSc6ICdMZWFreVJlbHUnLFxuICAgICdjYXRlZ29yeSc6ICdiYXNpY19tYXRoJyxcbiAgICAnaW5wdXRzJzogW1xuICAgICAge1xuICAgICAgICAnc3RhcnQnOiAwLFxuICAgICAgICAnbmFtZSc6ICd4JyxcbiAgICAgICAgJ3R5cGUnOiAndGVuc29yJ1xuICAgICAgfVxuICAgIF0sXG4gICAgJ2F0dHJzJzogW1xuICAgICAge1xuICAgICAgICAndGZOYW1lJzogJ2FscGhhJyxcbiAgICAgICAgJ25hbWUnOiAnYWxwaGEnLFxuICAgICAgICAndHlwZSc6ICdudW1iZXInLFxuICAgICAgICAnZGVmYXVsdFZhbHVlJzogMC4yXG4gICAgICB9LFxuICAgICAge1xuICAgICAgICAndGZOYW1lJzogJ1QnLFxuICAgICAgICAnbmFtZSc6ICdkdHlwZScsXG4gICAgICAgICd0eXBlJzogJ2R0eXBlJyxcbiAgICAgICAgJ25vdFN1cHBvcnRlZCc6IHRydWVcbiAgICAgIH1cbiAgICBdXG4gIH0sXG4gIHtcbiAgICAndGZPcE5hbWUnOiAnSXNOYW4nLFxuICAgICdjYXRlZ29yeSc6ICdiYXNpY19tYXRoJyxcbiAgICAnaW5wdXRzJzogW1xuICAgICAge1xuICAgICAgICAnc3RhcnQnOiAwLFxuICAgICAgICAnbmFtZSc6ICd4JyxcbiAgICAgICAgJ3R5cGUnOiAndGVuc29yJ1xuICAgICAgfVxuICAgIF0sXG4gICAgJ2F0dHJzJzogW1xuICAgICAge1xuICAgICAgICAndGZOYW1lJzogJ1QnLFxuICAgICAgICAnbmFtZSc6ICdkdHlwZScsXG4gICAgICAgICd0eXBlJzogJ2R0eXBlJyxcbiAgICAgICAgJ25vdFN1cHBvcnRlZCc6IHRydWVcbiAgICAgIH1cbiAgICBdXG4gIH1cbl07XG4iXX0=","/**\n * @license\n * Copyright 2022 Google LLC. All Rights Reserved.\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n * =============================================================================\n */\nexport const json = [\n {\n 'tfOpName': 'EmptyTensorList',\n 'category': 'control',\n 'inputs': [\n {\n 'start': 0,\n 'name': 'elementShape',\n 'type': 'shape'\n },\n {\n 'start': 1,\n 'name': 'maxNumElements',\n 'type': 'number'\n }\n ],\n 'attrs': [\n {\n 'tfName': 'element_dtype',\n 'name': 'elementDType',\n 'type': 'dtype'\n }\n ]\n },\n {\n 'tfOpName': 'LoopCond',\n 'category': 'control',\n 'inputs': [\n {\n 'start': 0,\n 'name': 'pred',\n 'type': 'tensor'\n }\n ]\n },\n {\n 'tfOpName': 'Switch',\n 'category': 'control',\n 'inputs': [\n {\n 'start': 0,\n 'name': 'data',\n 'type': 'tensor'\n },\n {\n 'start': 1,\n 'name': 'pred',\n 'type': 'tensor'\n }\n ]\n },\n {\n 'tfOpName': 'Merge',\n 'category': 'control',\n 'inputs': [\n {\n 'start': 0,\n 'end': 0,\n 'name': 'tensors',\n 'type': 'tensors'\n }\n ]\n },\n {\n 'tfOpName': 'Enter',\n 'category': 'control',\n 'inputs': [\n {\n 'start': 0,\n 'name': 'tensor',\n 'type': 'tensor'\n }\n ],\n 'attrs': [\n {\n 'tfName': 'T',\n 'name': 'dtype',\n 'type': 'dtype',\n 'notSupported': true\n },\n {\n 'tfName': 'frame_name',\n 'name': 'frameName',\n 'type': 'string'\n },\n {\n 'tfName': 'is_constant',\n 'name': 'isConstant',\n 'type': 'bool'\n }\n ]\n },\n {\n 'tfOpName': 'Exit',\n 'category': 'control',\n 'inputs': [\n {\n 'start': 0,\n 'name': 'tensor',\n 'type': 'tensor'\n }\n ],\n 'attrs': [\n {\n 'tfName': 'T',\n 'name': 'dtype',\n 'type': 'dtype',\n 'notSupported': true\n }\n ]\n },\n {\n 'tfOpName': 'NextIteration',\n 'category': 'control',\n 'inputs': [\n {\n 'start': 0,\n 'name': 'tensor',\n 'type': 'tensor'\n }\n ],\n 'attrs': [\n {\n 'tfName': 'T',\n 'name': 'dtype',\n 'type': 'dtype',\n 'notSupported': true\n }\n ]\n },\n {\n 'tfOpName': 'TensorArrayV3',\n 'category': 'control',\n 'inputs': [\n {\n 'start': 0,\n 'name': 'size',\n 'type': 'number'\n }\n ],\n 'attrs': [\n {\n 'tfName': 'dtype',\n 'name': 'dtype',\n 'type': 'dtype'\n },\n {\n 'tfName': 'element_shape',\n 'name': 'elementShape',\n 'type': 'shape'\n },\n {\n 'tfName': 'dynamic_size',\n 'name': 'dynamicSize',\n 'type': 'bool'\n },\n {\n 'tfName': 'clear_after_read',\n 'name': 'clearAfterRead',\n 'type': 'bool'\n },\n {\n 'tfName': 'identical_element_shapes',\n 'name': 'identicalElementShapes',\n 'type': 'bool'\n },\n {\n 'tfName': 'tensor_array_name',\n 'name': 'name',\n 'type': 'string'\n }\n ]\n },\n {\n 'tfOpName': 'TensorArrayWriteV3',\n 'category': 'control',\n 'inputs': [\n {\n 'start': 0,\n 'name': 'tensorArrayId',\n 'type': 'tensor'\n },\n {\n 'start': 1,\n 'name': 'index',\n 'type': 'number'\n },\n {\n 'start': 2,\n 'name': 'tensor',\n 'type': 'tensor'\n },\n {\n 'start': 3,\n 'name': 'flowIn',\n 'type': 'number'\n }\n ],\n 'attrs': [\n {\n 'tfName': 'T',\n 'name': 'dtype',\n 'type': 'dtype',\n 'notSupported': true\n }\n ]\n },\n {\n 'tfOpName': 'TensorArrayReadV3',\n 'category': 'control',\n 'inputs': [\n {\n 'start': 0,\n 'name': 'tensorArrayId',\n 'type': 'tensor'\n },\n {\n 'start': 1,\n 'name': 'index',\n 'type': 'number'\n },\n {\n 'start': 2,\n 'name': 'flowIn',\n 'type': 'number'\n }\n ],\n 'attrs': [\n {\n 'tfName': 'dtype',\n 'name': 'dtype',\n 'type': 'dtype',\n 'notSupported': true\n }\n ]\n },\n {\n 'tfOpName': 'TensorArrayGatherV3',\n 'category': 'control',\n 'inputs': [\n {\n 'start': 0,\n 'name': 'tensorArrayId',\n 'type': 'tensor'\n },\n {\n 'start': 1,\n 'name': 'indices',\n 'type': 'number[]'\n },\n {\n 'start': 2,\n 'name': 'flowIn',\n 'type': 'number'\n }\n ],\n 'attrs': [\n {\n 'tfName': 'dtype',\n 'name': 'dtype',\n 'type': 'dtype'\n },\n {\n 'tfName': 'element_shape',\n 'name': 'elementShape',\n 'type': 'shape'\n }\n ]\n },\n {\n 'tfOpName': 'TensorArrayScatterV3',\n 'category': 'control',\n 'inputs': [\n {\n 'start': 0,\n 'name': 'tensorArrayId',\n 'type': 'tensor'\n },\n {\n 'start': 1,\n 'name': 'indices',\n 'type': 'number[]'\n },\n {\n 'start': 2,\n 'name': 'tensor',\n 'type': 'tensor'\n },\n {\n 'start': 3,\n 'name': 'flowIn',\n 'type': 'number'\n }\n ],\n 'attrs': [\n {\n 'tfName': 'T',\n 'name': 'dtype',\n 'type': 'dtype'\n }\n ]\n },\n {\n 'tfOpName': 'TensorArrayConcatV3',\n 'category': 'control',\n 'inputs': [\n {\n 'start': 0,\n 'name': 'tensorArrayId',\n 'type': 'tensor'\n },\n {\n 'start': 1,\n 'name': 'flowIn',\n 'type': 'number'\n }\n ],\n 'attrs': [\n {\n 'tfName': 'dtype',\n 'name': 'dtype',\n 'type': 'dtype'\n },\n {\n 'tfName': 'element_shape_except0',\n 'name': 'elementShapeExcept0',\n 'type': 'shape',\n 'notSupported': true\n }\n ]\n },\n {\n 'tfOpName': 'TensorArraySplitV3',\n 'category': 'control',\n 'inputs': [\n {\n 'start': 0,\n 'name': 'tensorArrayId',\n 'type': 'tensor'\n },\n {\n 'start': 1,\n 'name': 'tensor',\n 'type': 'tensor'\n },\n {\n 'start': 2,\n 'name': 'lengths',\n 'type': 'number[]'\n },\n {\n 'start': 3,\n 'name': 'flowIn',\n 'type': 'number'\n }\n ],\n 'attrs': [\n {\n 'tfName': 'T',\n 'name': 'dtype',\n 'type': 'dtype'\n }\n ]\n },\n {\n 'tfOpName': 'TensorArraySizeV3',\n 'category': 'control',\n 'inputs': [\n {\n 'start': 0,\n 'name': 'tensorArrayId',\n 'type': 'tensor'\n },\n {\n 'start': 1,\n 'name': 'flowIn',\n 'type': 'number'\n }\n ]\n },\n {\n 'tfOpName': 'TensorArrayCloseV3',\n 'category': 'control',\n 'inputs': [\n {\n 'start': 0,\n 'name': 'tensorArrayId',\n 'type': 'tensor'\n }\n ]\n },\n {\n 'tfOpName': 'StatelessIf',\n 'category': 'control',\n 'inputs': [\n {\n 'start': 0,\n 'name': 'cond',\n 'type': 'tensor'\n },\n {\n 'start': 1,\n 'end': 0,\n 'name': 'args',\n 'type': 'tensors'\n }\n ],\n 'attrs': [\n {\n 'tfName': 'then_branch',\n 'name': 'thenBranch',\n 'type': 'func'\n },\n {\n 'tfName': 'else_branch',\n 'name': 'elseBranch',\n 'type': 'func'\n }\n ]\n },\n {\n 'tfOpName': 'If',\n 'category': 'control',\n 'inputs': [\n {\n 'start': 0,\n 'name': 'cond',\n 'type': 'tensor'\n },\n {\n 'start': 1,\n 'end': 0,\n 'name': 'args',\n 'type': 'tensors'\n }\n ],\n 'attrs': [\n {\n 'tfName': 'then_branch',\n 'name': 'thenBranch',\n 'type': 'func'\n },\n {\n 'tfName': 'else_branch',\n 'name': 'elseBranch',\n 'type': 'func'\n }\n ]\n },\n {\n 'tfOpName': 'StatelessWhile',\n 'category': 'control',\n 'inputs': [\n {\n 'start': 0,\n 'end': 0,\n 'name': 'args',\n 'type': 'tensors'\n }\n ],\n 'attrs': [\n {\n 'tfName': 'cond',\n 'name': 'cond',\n 'type': 'func'\n },\n {\n 'tfName': 'body',\n 'name': 'body',\n 'type': 'func'\n }\n ]\n },\n {\n 'tfOpName': 'While',\n 'category': 'control',\n 'inputs': [\n {\n 'start': 0,\n 'end': 0,\n 'name': 'args',\n 'type': 'tensors'\n }\n ],\n 'attrs': [\n {\n 'tfName': 'cond',\n 'name': 'cond',\n 'type': 'func'\n },\n {\n 'tfName': 'body',\n 'name': 'body',\n 'type': 'func'\n }\n ]\n },\n {\n 'tfOpName': 'TensorListScatter',\n 'category': 'control',\n 'inputs': [\n {\n 'start': 0,\n 'name': 'tensor',\n 'type': 'tensor'\n },\n {\n 'start': 1,\n 'name': 'indices',\n 'type': 'number[]'\n },\n {\n 'start': 2,\n 'name': 'elementShape',\n 'type': 'shape'\n }\n ],\n 'attrs': [\n {\n 'tfName': 'element_dtype',\n 'name': 'elementDType',\n 'type': 'dtype'\n }\n ]\n },\n {\n 'tfOpName': 'TensorListScatterV2',\n 'category': 'control',\n 'inputs': [\n {\n 'start': 0,\n 'name': 'tensor',\n 'type': 'tensor'\n },\n {\n 'start': 1,\n 'name': 'indices',\n 'type': 'number[]'\n },\n {\n 'start': 2,\n 'name': 'elementShape',\n 'type': 'shape'\n },\n {\n 'start': 3,\n 'name': 'numElements',\n 'type': 'number'\n }\n ],\n 'attrs': [\n {\n 'tfName': 'element_dtype',\n 'name': 'elementDType',\n 'type': 'dtype'\n }\n ]\n },\n {\n 'tfOpName': 'TensorListGather',\n 'category': 'control',\n 'inputs': [\n {\n 'start': 0,\n 'name': 'tensorListId',\n 'type': 'tensor'\n },\n {\n 'start': 1,\n 'name': 'indices',\n 'type': 'number[]'\n },\n {\n 'start': 2,\n 'name': 'elementShape',\n 'type': 'shape'\n }\n ],\n 'attrs': [\n {\n 'tfName': 'element_dtype',\n 'name': 'elementDType',\n 'type': 'dtype'\n }\n ]\n },\n {\n 'tfOpName': 'TensorListGetItem',\n 'category': 'control',\n 'inputs': [\n {\n 'start': 0,\n 'name': 'tensorListId',\n 'type': 'tensor'\n },\n {\n 'start': 1,\n 'name': 'index',\n 'type': 'number'\n },\n {\n 'start': 2,\n 'name': 'elementShape',\n 'type': 'shape'\n }\n ],\n 'attrs': [\n {\n 'tfName': 'element_dtype',\n 'name': 'elementDType',\n 'type': 'dtype'\n }\n ]\n },\n {\n 'tfOpName': 'TensorListSetItem',\n 'category': 'control',\n 'inputs': [\n {\n 'start': 0,\n 'name': 'tensorListId',\n 'type': 'tensor'\n },\n {\n 'start': 1,\n 'name': 'index',\n 'type': 'number'\n },\n {\n 'start': 2,\n 'name': 'tensor',\n 'type': 'tensor'\n }\n ],\n 'attrs': [\n {\n 'tfName': 'element_dtype',\n 'name': 'elementDType',\n 'type': 'dtype'\n }\n ]\n },\n {\n 'tfOpName': 'TensorListReserve',\n 'category': 'control',\n 'inputs': [\n {\n 'start': 0,\n 'name': 'elementShape',\n 'type': 'shape'\n },\n {\n 'start': 1,\n 'name': 'numElements',\n 'type': 'number'\n }\n ],\n 'attrs': [\n {\n 'tfName': 'element_dtype',\n 'name': 'elementDType',\n 'type': 'dtype'\n }\n ]\n },\n {\n 'tfOpName': 'TensorListFromTensor',\n 'category': 'control',\n 'inputs': [\n {\n 'start': 0,\n 'name': 'tensor',\n 'type': 'tensor'\n },\n {\n 'start': 1,\n 'name': 'elementShape',\n 'type': 'shape'\n }\n ],\n 'attrs': [\n {\n 'tfName': 'element_dtype',\n 'name': 'elementDType',\n 'type': 'dtype'\n }\n ]\n },\n {\n 'tfOpName': 'TensorListStack',\n 'category': 'control',\n 'inputs': [\n {\n 'start': 0,\n 'name': 'tensorListId',\n 'type': 'tensor'\n },\n {\n 'start': 1,\n 'name': 'elementShape',\n 'type': 'shape'\n }\n ],\n 'attrs': [\n {\n 'tfName': 'element_dtype',\n 'name': 'elementDType',\n 'type': 'dtype'\n },\n {\n 'tfName': 'num_elements',\n 'name': 'numElements',\n 'type': 'dtype'\n }\n ]\n },\n {\n 'tfOpName': 'TensorListSplit',\n 'category': 'control',\n 'inputs': [\n {\n 'start': 0,\n 'name': 'tensor',\n 'type': 'tensor'\n },\n {\n 'start': 1,\n 'name': 'elementShape',\n 'type': 'shape'\n },\n {\n 'start': 2,\n 'name': 'lengths',\n 'type': 'number[]'\n }\n ],\n 'attrs': [\n {\n 'tfName': 'element_dtype',\n 'name': 'elementDType',\n 'type': 'dtype'\n }\n ]\n },\n {\n 'tfOpName': 'TensorListConcat',\n 'category': 'control',\n 'inputs': [\n {\n 'start': 0,\n 'name': 'tensorListId',\n 'type': 'tensor'\n }\n ],\n 'attrs': [\n {\n 'tfName': 'element_shape',\n 'name': 'elementShape',\n 'type': 'shape'\n },\n {\n 'tfName': 'element_dtype',\n 'name': 'elementDType',\n 'type': 'dtype'\n }\n ]\n },\n {\n 'tfOpName': 'TensorListConcatV2',\n 'category': 'control',\n 'inputs': [\n {\n 'start': 0,\n 'name': 'tensorListId',\n 'type': 'tensor'\n }\n ],\n 'attrs': [\n {\n 'tfName': 'element_shape',\n 'name': 'elementShape',\n 'type': 'shape'\n },\n {\n 'tfName': 'element_dtype',\n 'name': 'elementDType',\n 'type': 'dtype'\n }\n ]\n },\n {\n 'tfOpName': 'TensorListPopBack',\n 'category': 'control',\n 'inputs': [\n {\n 'start': 0,\n 'name': 'tensorListId',\n 'type': 'tensor'\n },\n {\n 'start': 1,\n 'name': 'elementShape',\n 'type': 'shape'\n }\n ],\n 'attrs': [\n {\n 'tfName': 'element_dtype',\n 'name': 'elementDType',\n 'type': 'dtype'\n }\n ]\n },\n {\n 'tfOpName': 'TensorListPushBack',\n 'category': 'control',\n 'inputs': [\n {\n 'start': 0,\n 'name': 'tensorListId',\n 'type': 'tensor'\n },\n {\n 'start': 1,\n 'name': 'tensor',\n 'type': 'tensor'\n }\n ],\n 'attrs': [\n {\n 'tfName': 'element_dtype',\n 'name': 'elementDType',\n 'type': 'dtype'\n }\n ]\n },\n {\n 'tfOpName': 'TensorListLength',\n 'category': 'control',\n 'inputs': [\n {\n 'start': 0,\n 'name': 'tensorListId',\n 'type': 'tensor'\n }\n ]\n },\n {\n 'tfOpName': 'TensorListResize',\n 'category': 'control',\n 'inputs': [\n {\n 'start': 0,\n 'name': 'tensorListId',\n 'type': 'tensor'\n },\n {\n 'start': 1,\n 'name': 'size',\n 'type': 'number'\n }\n ]\n }\n];\n//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY29udHJvbC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uLy4uLy4uL3RmanMtY29udmVydGVyL3NyYy9vcGVyYXRpb25zL29wX2xpc3QvY29udHJvbC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFDQTs7Ozs7Ozs7Ozs7Ozs7O0dBZUc7QUFJSCxNQUFNLENBQUMsTUFBTSxJQUFJLEdBQWU7SUFDOUI7UUFDRSxVQUFVLEVBQUUsaUJBQWlCO1FBQzdCLFVBQVUsRUFBRSxTQUFTO1FBQ3JCLFFBQVEsRUFBRTtZQUNSO2dCQUNFLE9BQU8sRUFBRSxDQUFDO2dCQUNWLE1BQU0sRUFBRSxjQUFjO2dCQUN0QixNQUFNLEVBQUUsT0FBTzthQUNoQjtZQUNEO2dCQUNFLE9BQU8sRUFBRSxDQUFDO2dCQUNWLE1BQU0sRUFBRSxnQkFBZ0I7Z0JBQ3hCLE1BQU0sRUFBRSxRQUFRO2FBQ2pCO1NBQ0Y7UUFDRCxPQUFPLEVBQUU7WUFDUDtnQkFDRSxRQUFRLEVBQUUsZUFBZTtnQkFDekIsTUFBTSxFQUFFLGNBQWM7Z0JBQ3RCLE1BQU0sRUFBRSxPQUFPO2FBQ2hCO1NBQ0Y7S0FDRjtJQUNEO1FBQ0UsVUFBVSxFQUFFLFVBQVU7UUFDdEIsVUFBVSxFQUFFLFNBQVM7UUFDckIsUUFBUSxFQUFFO1lBQ1I7Z0JBQ0UsT0FBTyxFQUFFLENBQUM7Z0JBQ1YsTUFBTSxFQUFFLE1BQU07Z0JBQ2QsTUFBTSxFQUFFLFFBQVE7YUFDakI7U0FDRjtLQUNGO0lBQ0Q7UUFDRSxVQUFVLEVBQUUsUUFBUTtRQUNwQixVQUFVLEVBQUUsU0FBUztRQUNyQixRQUFRLEVBQUU7WUFDUjtnQkFDRSxPQUFPLEVBQUUsQ0FBQztnQkFDVixNQUFNLEVBQUUsTUFBTTtnQkFDZCxNQUFNLEVBQUUsUUFBUTthQUNqQjtZQUNEO2dCQUNFLE9BQU8sRUFBRSxDQUFDO2dCQUNWLE1BQU0sRUFBRSxNQUFNO2dCQUNkLE1BQU0sRUFBRSxRQUFRO2FBQ2pCO1NBQ0Y7S0FDRjtJ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VUFBVSxFQUFFLFNBQVM7UUFDckIsUUFBUSxFQUFFO1lBQ1I7Z0JBQ0UsT0FBTyxFQUFFLENBQUM7Z0JBQ1YsTUFBTSxFQUFFLGNBQWM7Z0JBQ3RCLE1BQU0sRUFBRSxRQUFRO2FBQ2pCO1lBQ0Q7Z0JBQ0UsT0FBTyxFQUFFLENBQUM7Z0JBQ1YsTUFBTSxFQUFFLFFBQVE7Z0JBQ2hCLE1BQU0sRUFBRSxRQUFRO2FBQ2pCO1NBQ0Y7UUFDRCxPQUFPLEVBQUU7WUFDUDtnQkFDRSxRQUFRLEVBQUUsZUFBZTtnQkFDekIsTUFBTSxFQUFFLGNBQWM7Z0JBQ3RCLE1BQU0sRUFBRSxPQUFPO2FBQ2hCO1NBQ0Y7S0FDRjtJQUNEO1FBQ0UsVUFBVSxFQUFFLGtCQUFrQjtRQUM5QixVQUFVLEVBQUUsU0FBUztRQUNyQixRQUFRLEVBQUU7WUFDUjtnQkFDRSxPQUFPLEVBQUUsQ0FBQztnQkFDVixNQUFNLEVBQUUsY0FBYztnQkFDdEIsTUFBTSxFQUFFLFFBQVE7YUFDakI7U0FDRjtLQUNGO0lBQ0Q7UUFDRSxVQUFVLEVBQUUsa0JBQWtCO1FBQzlCLFVBQVUsRUFBRSxTQUFTO1FBQ3JCLFFBQVEsRUFBRTtZQUNSO2dCQUNFLE9BQU8sRUFBRSxDQUFDO2dCQUNWLE1BQU0sRUFBRSxjQUFjO2dCQUN0QixNQUFNLEVBQUUsUUFBUTthQUNqQjtZQUNEO2dCQUNFLE9BQU8sRUFBRSxDQUFDO2dCQUNWLE1BQU0sRUFBRSxNQUFNO2dCQUNkLE1BQU0sRUFBRSxRQUFRO2FBQ2pCO1NBQ0Y7S0FDRjtDQUNGLENBQ0EiLCJzb3VyY2VzQ29udGVudCI6WyJcbi8qKlxuICogQGxpY2Vuc2VcbiAqIENvcHlyaWdodCAyMDIyIEdvb2dsZSBMTEMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuXG4gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgXCJMaWNlbnNlXCIpO1xuICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLlxuICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0XG4gKlxuICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wXG4gKlxuICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZVxuICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gXCJBUyBJU1wiIEJBU0lTLFxuICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuXG4gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kXG4gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS5cbiAqID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4gKi9cblxuaW1wb3J0IHtPcE1hcHBlcn0gZnJvbSAnLi4vdHlwZXMnO1xuXG5leHBvcnQgY29uc3QganNvbjogT3BNYXBwZXJbXSA9IFtcbiAge1xuICAgICd0Zk9wTmFtZSc6ICdFbXB0eVRlbnNvckxpc3QnLFxuICAgICdjYXRlZ29yeSc6ICdjb250cm9sJyxcbiAgICAnaW5wdXRzJzogW1xuICAgICAge1xuICAgICAgICAnc3RhcnQnOiAwLFxuICAgICAgICAnbmFtZSc6ICdlbGVtZW50U2hhcGUnLFxuICAgICAgICAndHlwZSc6ICdzaGFwZSdcbiAgICAgIH0sXG4gICAgICB7XG4gICAgICAgICdzdGFydCc6IDEsXG4gICAgICAgICduYW1lJzogJ21heE51bUVsZW1lbnRzJyxcbiAgICAgICAgJ3R5cGUnOiAnbnVtYmVyJ1xuICAgICAgfVxuICAgIF0sXG4gICAgJ2F0dHJzJzogW1xuICAgICAge1xuICAgICAgICAndGZOYW1lJzogJ2VsZW1lbnRfZHR5cGUnLFxuICAgICAgICAnbmFtZSc6ICdlbGVtZW50RFR5cGUnLFxuICAgICAgICAndHlwZSc6ICdkdHlwZSdcbiAgICAgIH1cbiAgICBdXG4gIH0sXG4gIHtcbiAgICAndGZPcE5hbWUnOiAnTG9vcENvbmQnLFxuICAgICdjYXRlZ29yeSc6ICdjb250cm9sJyxcbiAgICAnaW5wdXRzJzogW1xuICAgICAge1xuICAgICAgICAnc3RhcnQnOiAwLFxuICAgICAgICAnbmFtZSc6ICdwcmVkJyxcbiAgICAgICAgJ3R5cGUnOiAndGVuc29yJ1xuICAgICAgfVxuICAgIF1cbiAgfSxcbiAge1xuICAgICd0Zk9wTmFtZSc6ICdTd2l0Y2gnLFxuICAgICdjYXRlZ29yeSc6ICdjb250cm9sJyxcbiAgICAnaW5wdXRzJzogW1xuICAgICAge1xuICAgICAgICAnc3RhcnQnOiAwLFxuICAgICAgICAnbmFtZSc6ICdkYXRhJyxcbiAgICAgICAgJ3R5cGUnOiAndGVuc29yJ1xuICAgICAgfSxcbiAgICAgIHtcbiAgICAgICAgJ3N0YXJ0JzogMSxcbiAgICAgICAgJ25hbWUnOiAncHJlZCcsXG4gICAgICAgICd0eXBlJzogJ3RlbnNvcidcbiAgICAgIH1cbiAgICBdXG4gIH0sXG4gIHtcbiAgICAndGZPcE5hbWUnOiAnTWVyZ2UnLFxuICAgICdjYXRlZ29yeSc6ICdjb250cm9sJyxcbiAgICAnaW5wdXRzJzogW1xuICAgICAge1xuICAgICAgICAnc3RhcnQnOiAwLFxuICAgICAgICAnZW5kJzogMCxcbiAgICAgICAgJ25hbWUnOiAndGVuc29ycycsXG4gICAgICAgICd0eXBlJzogJ3RlbnNvcnMnXG4gICAgICB9XG4gICAgXVxuICB9LFxuICB7XG4gICAgJ3RmT3BOYW1lJzogJ0VudGVyJyxcbiAgICAnY2F0ZWdvcnknOiAnY29udHJvbCcsXG4gICAgJ2lucHV0cyc6IFtcbiAgICAgIHtcbiAgICAgICAgJ3N0YXJ0JzogMCxcbiAgICAgICAgJ25hbWUnOiAndGVuc29yJyxcbiAgICAgICAgJ3R5cGUnOiAndGVuc29yJ1xuICAgICAgfVxuICAgIF0sXG4gICAgJ2F0dHJzJzogW1xuICAgICAge1xuICAgICAgICAndGZOYW1lJzogJ1QnLFxuICAgICAgICAnbmFtZSc6ICdkdHlwZScsXG4gICAgICAgICd0eXBlJzogJ2R0eXBlJyxcbiAgICAgICAgJ25vdFN1cHBvcnRlZCc6IHRydWVcbiAgICAgIH0sXG4gICAgICB7XG4gICAgICAgICd0Zk5hbWUnOiAnZnJhbWVfbmFtZScsXG4gICAgICAgICduYW1lJzogJ2ZyYW1lTmFtZScsXG4gICAgICAgICd0eXBlJzogJ3N0cmluZydcbiAgICAgIH0sXG4gICAgICB7XG4gICAgICAgICd0Zk5hbWUnOiAnaXNfY29uc3RhbnQnLFxuICAgICAgICAnbmFtZSc6ICdpc0NvbnN0YW50JyxcbiAgICAgICAgJ3R5cGUnOiAnYm9vbCdcbiAgICAgIH1cbiAgICBdXG4gIH0sXG4gIHtcbiAgICAndGZPcE5hbWUnOiAnRXhpdCcsXG4gICAgJ2NhdGVnb3J5JzogJ2NvbnRyb2wnLFxuICAgICdpbnB1dHMnOiBbXG4gICAgICB7XG4gICAgICAgICdzdGFydCc6IDAsXG4gICAgICAgICduYW1lJzogJ3RlbnNvcicsXG4gICAgICAgICd0eXBlJzogJ3RlbnNvcidcbiAgICAgIH1cbiAgICBdLFxuICAgICdhdHRycyc6IFtcbiAgICAgIHtcbiAgICAgICAgJ3RmTmFtZSc6ICdUJyxcbiAgICAgICAgJ25hbWUnOiAnZHR5cGUnLFxuICAgICAgICAndHlwZSc6ICdkdHlwZScsXG4gICAgICAgICdub3RTdXBwb3J0ZWQnOiB0cnVlXG4gICAgICB9XG4gICAgXVxuICB9LFxuICB7XG4gICAgJ3RmT3BOYW1lJzogJ05leHRJdGVyYXRpb24nLFxuICAgICdjYXRlZ29yeSc6ICdjb250cm9sJyxcbiAgICAnaW5wdXRzJzogW1xuICAgICAge1xuICAgICAgICAnc3RhcnQnOiAwLFxuICAgICAgICAnbmFtZSc6ICd0ZW5zb3InLFxuICAgICAgICAndHlwZSc6ICd0ZW5zb3InXG4gICAgICB9XG4gICAgXSxcbiAgICAnYXR0cnMnOiBbXG4gICAgICB7XG4gICAgICAgICd0Zk5hbWUnOiAnVCcsXG4gICAgICAgICduYW1lJzogJ2R0eXBlJyxcbiAgICAgICAgJ3R5cGUnOiAnZHR5cGUnLFxuICAgICAgICAnbm90U3VwcG9ydGVkJzogdHJ1ZVxuICAgICAgfVxuICAgIF1cbiAgfSxcbiAge1xuICAgICd0Zk9wTmFtZSc6ICdUZW5zb3JBcnJheVYzJyxcbiAgICAnY2F0ZWdvcnknOiAnY29udHJvbCcsXG4gICAgJ2lucHV0cyc6IFtcbiAgICAgIHtcbiAgICAgICAgJ3N0YXJ0JzogMCxcbiAgICAgICAgJ25hbWUnOiAnc2l6ZScsXG4gICAgICAgICd0eXBlJzogJ251bWJlcidcbiAgICAgIH1cbiAgICBdLFxuICAgICdhdHRycyc6IFtcbiAgICAgIHtcbiAgICAgICAgJ3RmTmFtZSc6ICdkdHlwZScsXG4gICAgICAgICduYW1lJzogJ2R0eXBlJyxcbiAgICAgICAgJ3R5cGUnOiAnZHR5cGUnXG4gICAgICB9LFxuICAgICAge1xuICAgICAgICAndGZOYW1lJzogJ2VsZW1lbnRfc2hhcGUnLFxuICAgICAgICAnbmFtZSc6ICdlbGVtZW50U2hhcGUnLFxuICAgICAgICAndHlwZSc6ICdzaGFwZSdcbiAgICAgIH0sXG4gICAgICB7XG4gICAgICAgICd0Zk5hbWUnOiAnZHluYW1pY19zaXplJyxcbiAgICAgICAgJ25hbWUnOiAnZHluYW1pY1NpemUnLFxuICAgICAgICAndHlwZSc6ICdib29sJ1xuICAgICAgfSxcbiAgICAgIHtcbiAgICAgICAgJ3RmTmFtZSc6ICdjbGVhcl9hZnRlcl9yZWFkJyxcbiAgICAgICAgJ25hbWUnOiAnY2xlYXJBZnRlclJlYWQnLFxuICAgICAgICAndHlwZSc6ICdib29sJ1xuICAgICAgfSxcbiAgICAgIHtcbiAgICAgICAgJ3RmTmFtZSc6ICdpZGVudGljYWxfZWxlbWVudF9zaGFwZXMnLFxuICAgICAgICAnbmFtZSc6ICdpZGVudGljYWxFbGVtZW50U2hhcGVzJyxcbiAgICAgICAgJ3R5cGUnOiAnYm9vbCdcbiAgICAgIH0sXG4gICAgICB7XG4gICAgICAgICd0Zk5hbWUnOiAndGVuc29yX2FycmF5X25hbWUnLFxuICAgICAgICAnbmFtZSc6ICduYW1lJyxcbiAgICAgICAgJ3R5cGUnOiAnc3RyaW5nJ1xuICAgICAgfVxuICAgIF1cbiAgfSxcbiAge1xuICAgICd0Zk9wTmFtZSc6ICdUZW5zb3JBcnJheVdyaXRlVjMnLFxuICAgICdjYXRlZ29yeSc6ICdjb250cm9sJyxcbiAgICAnaW5wdXRzJzogW1xuICAgICAge1xuICAgICAgICAnc3RhcnQnOiAwLFxuICAgICAgICAnbmFtZSc6ICd0ZW5zb3JBcnJheUlkJyxcbiAgICAgICAgJ3R5cGUnOiAndGVuc29yJ1xuICAgICAgfSxcbiAgICAgIHtcbiAgICAgICAgJ3N0YXJ0JzogMSxcbiAgICAgICAgJ25hbWUnOiAnaW5kZXgnLFxuICAgICAgICAndHlwZSc6ICdudW1iZXInXG4gICAgICB9LFxuICAgICAge1xuICAgICAgICAnc3RhcnQnOiAyLFxuICAgICAgICAnbmFtZSc6ICd0ZW5zb3InLFxuICAgICAgICAndHlwZSc6ICd0ZW5zb3InXG4gICAgICB9LFxuICAgICAge1xuICAgICAgICAnc3RhcnQnOiAzLFxuICAgICAgICAnbmFtZSc6ICdmbG93SW4nLFxuICAgICAgICAndHlwZSc6ICdudW1iZXInXG4gICAgICB9XG4gICAgXSxcbiAgICAnYXR0cnMnOiBbXG4gICAgICB7XG4gICAgICAgICd0Zk5hbWUnOiAnVCcsXG4gICAgICAgICduYW1lJzogJ2R0eXBlJyxcbiAgICAgICAgJ3R5cGUnOiAnZHR5cGUnLFxuICAgICAgICAnbm90U3VwcG9ydGVkJzogdHJ1ZVxuICAgICAgfVxuICAgIF1cbiAgfSxcbiAge1xuICAgICd0Zk9wTmFtZSc6ICdUZW5zb3JBcnJheVJlYWRWMycsXG4gICAgJ2NhdGVnb3J5JzogJ2NvbnRyb2wnLFxuICAgICdpbnB1dHMnOiBbXG4gICAgICB7XG4gICAgICAgICdzdGFydCc6IDAsXG4gICAgICAgICduYW1lJzogJ3RlbnNvckFycmF5SWQnLFxuICAgICAgICAndHlwZSc6ICd0ZW5zb3InXG4gICAgICB9LFxuICAgICAge1xuICAgICAgICAnc3RhcnQnOiAxLFxuICAgICAgICAnbmFtZSc6ICdpbmRleCcsXG4gICAgICAgICd0eXBlJzogJ251bWJlcidcbiAgICAgIH0sXG4gICAgICB7XG4gICAgICAgICdzdGFydCc6IDIsXG4gICAgICAgICduYW1lJzogJ2Zsb3dJbicsXG4gICAgICAgICd0eXBlJzogJ251bWJlcidcbiAgICAgIH1cbiAgICBdLFxuICAgICdhdHRycyc6IFtcbiAgICAgIHtcbiAgICAgICAgJ3RmTmFtZSc6ICdkdHlwZScsXG4gICAgICAgICduYW1lJzogJ2R0eXBlJyxcbiAgICAgICAgJ3R5cGUnOiAnZHR5cGUnLFxuICAgICAgICAnbm90U3VwcG9ydGVkJzogdHJ1ZVxuICAgICAgfVxuICAgIF1cbiAgfSxcbiAge1xuICAgICd0Zk9wTmFtZSc6ICdUZW5zb3JBcnJheUdhdGhlclYzJyxcbiAgICAnY2F0ZWdvcnknOiAnY29udHJvbCcsXG4gICAgJ2lucHV0cyc6IFtcbiAgICAgIHtcbiAgICAgICAgJ3N0YXJ0JzogMCxcbiAgICAgICAgJ25hbWUnOiAndGVuc29yQXJyYXlJZCcsXG4gICAgICAgICd0eXBlJzogJ3RlbnNvcidcbiAgICAgIH0sXG4gICAgICB7XG4gICAgICAgICdzdGFydCc6IDEsXG4gICAgICAgICduYW1lJzogJ2luZGljZXMnLFxuICAgICAgICAndHlwZSc6ICdudW1iZXJbXSdcbiAgICAgIH0sXG4gICAgICB7XG4gICAgICAgICdzdGFydCc6IDIsXG4gICAgICAgICduYW1lJzogJ2Zsb3dJbicsXG4gICAgICAgICd0eXBlJzogJ251bWJlcidcbiAgICAgIH1cbiAgICBdLFxuICAgICdhdHRycyc6IFtcbiAgICAgIHtcbiAgICAgICAgJ3RmTmFtZSc6ICdkdHlwZScsXG4gICAgICAgICduYW1lJzogJ2R0eXBlJyxcbiAgICAgICAgJ3R5cGUnOiAnZHR5cGUnXG4gICAgICB9LFxuICAgICAge1xuICAgICAgICAndGZOYW1lJzogJ2VsZW1lbnRfc2hhcGUnLFxuICAgICAgICAnbmFtZSc6ICdlbGVtZW50U2hhcGUnLFxuICAgICAgICAndHlwZSc6ICdzaGFwZSdcbiAgICAgIH1cbiAgICBdXG4gIH0sXG4gIHtcbiAgICAndGZPcE5hbWUnOiAnVGVuc29yQXJyYXlTY2F0dGVyVjMnLFxuICAgICdjYXRlZ29yeSc6ICdjb250cm9sJyxcbiAgICAnaW5wdXRzJzogW1xuICAgICAge1xuICAgICAgICAnc3RhcnQnOiAwLFxuICAgICAgICAnbmFtZSc6ICd0ZW5zb3JBcnJheUlkJyxcbiAgICAgICAgJ3R5cGUnOiAndGVuc29yJ1xuICAgICAgfSxcbiAgICAgIHtcbiAgICAgICAgJ3N0YXJ0JzogMSxcbiAgICAgICAgJ25hbWUnOiAnaW5kaWNlcycsXG4gICAgICAgICd0eXBlJzogJ251bWJlcltdJ1xuICAgICAgfSxcbiAgICAgIHtcbiAgICAgICAgJ3N0YXJ0JzogMixcbiAgICAgICAgJ25hbWUnOiAndGVuc29yJyxcbiAgICAgICAgJ3R5cGUnOiAndGVuc29yJ1xuICAgICAgfSxcbiAgICAgIHtcbiAgICAgICAgJ3N0YXJ0JzogMyxcbiAgICAgICAgJ25hbWUnOiAnZmxvd0luJyxcbiAgICAgICAgJ3R5cGUnOiAnbnVtYmVyJ1xuICAgICAgfVxuICAgIF0sXG4gICAgJ2F0dHJzJzogW1xuICAgICAge1xuICAgICAgICAndGZOYW1lJzogJ1QnLFxuICAgICAgICAnbmFtZSc6ICdkdHlwZScsXG4gICAgICAgICd0eXBlJzogJ2R0eXBlJ1xuICAgICAgfVxuICAgIF1cbiAgfSxcbiAge1xuICAgICd0Zk9wTmFtZSc6ICdUZW5zb3JBcnJheUNvbmNhdFYzJyxcbiAgICAnY2F0ZWdvcnknOiAnY29udHJvbCcsXG4gICAgJ2lucHV0cyc6IFtcbiAgICAgIHtcbiAgICAgICAgJ3N0YXJ0JzogMCxcbiAgICAgICAgJ25hbWUnOiAndGVuc29yQXJyYXlJZCcsXG4gICAgICAgICd0eXBlJzogJ3RlbnNvcidcbiAgICAgIH0sXG4gICAgICB7XG4gICAgICAgICdzdGFydCc6IDEsXG4gICAgICAgICduYW1lJzogJ2Zsb3dJbicsXG4gICAgICAgICd0eXBlJzogJ251bWJlcidcbiAgICAgIH1cbiAgICBdLFxuICAgICdhdHRycyc6IFtcbiAgICAgIHtcbiAgICAgICAgJ3RmTmFtZSc6ICdkdHlwZScsXG4gICAgICAgICduYW1lJzogJ2R0eXBlJyxcbiAgICAgICAgJ3R5cGUnOiAnZHR5cGUnXG4gICAgICB9LFxuICAgICAge1xuICAgICAgICAndGZOYW1lJzogJ2VsZW1lbnRfc2hhcGVfZXhjZXB0MCcsXG4gICAgICAgICduYW1lJzogJ2VsZW1lbnRTaGFwZUV4Y2VwdDAnLFxuICAgICAgICAndHlwZSc6ICdzaGFwZScsXG4gICAgICAgICdub3RTdXBwb3J0ZWQnOiB0cnVlXG4gICAgICB9XG4gICAgXVxuICB9LFxuICB7XG4gICAgJ3RmT3BOYW1lJzogJ1RlbnNvckFycmF5U3BsaXRWMycsXG4gICAgJ2NhdGVnb3J5JzogJ2NvbnRyb2wnLFxuICAgICdpbnB1dHMnOiBbXG4gICAgICB7XG4gICAgICAgICdzdGFydCc6IDAsXG4gICAgICAgICduYW1lJzogJ3RlbnNvckFycmF5SWQnLFxuICAgICAgICAndHlwZSc6ICd0ZW5zb3InXG4gICAgICB9LFxuICAgICAge1xuICAgICAgICAnc3RhcnQnOiAxLFxuICAgICAgICAnbmFtZSc6ICd0ZW5zb3InLFxuICAgICAgICAndHlwZSc6ICd0ZW5zb3InXG4gICAgICB9LFxuICAgICAge1xuICAgICAgICAnc3RhcnQnOiAyLFxuICAgICAgICAnbmFtZSc6ICdsZW5ndGhzJyxcbiAgICAgICAgJ3R5cGUnOiAnbnVtYmVyW10nXG4gICAgICB9LFxuICAgICAge1xuICAgICAgICAnc3RhcnQnOiAzLFxuICAgICAgICAnbmFtZSc6ICdmbG93SW4nLFxuICAgICAgICAndHlwZSc6ICdudW1iZXInXG4gICAgICB9XG4gICAgXSxcbiAgICAnYXR0cnMnOiBbXG4gICAgICB7XG4gICAgICAgICd0Zk5hbWUnOiAnVCcsXG4gICAgICAgICduYW1lJzogJ2R0eXBlJyxcbiAgICAgICAgJ3R5cGUnOiAnZHR5cGUnXG4gICAgICB9XG4gICAgXVxuICB9LFxuICB7XG4gICAgJ3RmT3BOYW1lJzogJ1RlbnNvckFycmF5U2l6ZVYzJyxcbiAgICAnY2F0ZWdvcnknOiAnY29udHJvbCcsXG4gICAgJ2lucHV0cyc6IFtcbiAgICAgIHtcbiAgICAgICAgJ3N0YXJ0JzogMCxcbiAgICAgICAgJ25hbWUnOiAndGVuc29yQXJyYXlJZCcsXG4gICAgICAgICd0eXBlJzogJ3RlbnNvcidcbiAgICAgIH0sXG4gICAgICB7XG4gICAgICAgICdzdGFydCc6IDEsXG4gICAgICAgICduYW1lJzogJ2Zsb3dJbicsXG4gICAgICAgICd0eXBlJzogJ251bWJlcidcbiAgICAgIH1cbiAgICBdXG4gIH0sXG4gIHtcbiAgICAndGZPcE5hbWUnOiAnVGVuc29yQXJyYXlDbG9zZVYzJyxcbiAgICAnY2F0ZWdvcnknOiAnY29udHJvbCcsXG4gICAgJ2lucHV0cyc6IFtcbiAgICAgIHtcbiAgICAgICAgJ3N0YXJ0JzogMCxcbiAgICAgICAgJ25hbWUnOiAndGVuc29yQXJyYXlJZCcsXG4gICAgICAgICd0eXBlJzogJ3RlbnNvcidcbiAgICAgIH1cbiAgICBdXG4gIH0sXG4gIHtcbiAgICAndGZPcE5hbWUnOiAnU3RhdGVsZXNzSWYnLFxuICAgICdjYXRlZ29yeSc6ICdjb250cm9sJyxcbiAgICAnaW5wdXRzJzogW1xuICAgICAge1xuICAgICAgICAnc3RhcnQnOiAwLFxuICAgICAgICAnbmFtZSc6ICdjb25kJyxcbiAgICAgICAgJ3R5cGUnOiAndGVuc29yJ1xuICAgICAgfSxcbiAgICAgIHtcbiAgICAgICAgJ3N0YXJ0JzogMSxcbiAgICAgICAgJ2VuZCc6IDAsXG4gICAgICAgICduYW1lJzogJ2FyZ3MnLFxuICAgICAgICAndHlwZSc6ICd0ZW5zb3JzJ1xuICAgICAgfVxuICAgIF0sXG4gICAgJ2F0dHJzJzogW1xuICAgICAge1xuICAgICAgICAndGZOYW1lJzogJ3RoZW5fYnJhbmNoJyxcbiAgICAgICAgJ25hbWUnOiAndGhlbkJyYW5jaCcsXG4gICAgICAgICd0eXBlJzogJ2Z1bmMnXG4gICAgICB9LFxuICAgICAge1xuICAgICAgICAndGZOYW1lJzogJ2Vsc2VfYnJhbmNoJyxcbiAgICAgICAgJ25hbWUnOiAnZWxzZUJyYW5jaCcsXG4gICAgICAgICd0eXBlJzogJ2Z1bmMnXG4gICAgICB9XG4gICAgXVxuICB9LFxuICB7XG4gICAgJ3RmT3BOYW1lJzogJ0lmJyxcbiAgICAnY2F0ZWdvcnknOiAnY29udHJvbCcsXG4gICAgJ2lucHV0cyc6IFtcbiAgICAgIHtcbiAgICAgICAgJ3N0YXJ0JzogMCxcbiAgICAgICAgJ25hbWUnOiAnY29uZCcsXG4gICAgICAgICd0eXBlJzogJ3RlbnNvcidcbiAgICAgIH0sXG4gICAgICB7XG4gICAgICAgICdzdGFydCc6IDEsXG4gICAgICAgICdlbmQnOiAwLFxuICAgICAgICAnbmFtZSc6ICdhcmdzJyxcbiAgICAgICAgJ3R5cGUnOiAndGVuc29ycydcbiAgICAgIH1cbiAgICBdLFxuICAgICdhdHRycyc6IFtcbiAgICAgIHtcbiAgICAgICAgJ3RmTmFtZSc6ICd0aGVuX2JyYW5jaCcsXG4gICAgICAgICduYW1lJzogJ3RoZW5CcmFuY2gnLFxuICAgICAgICAndHlwZSc6ICdmdW5jJ1xuICAgICAgfSxcbiAgICAgIHtcbiAgICAgICAgJ3RmTmFtZSc6ICdlbHNlX2JyYW5jaCcsXG4gICAgICAgICduYW1lJzogJ2Vsc2VCcmFuY2gnLFxuICAgICAgICAndHlwZSc6ICdmdW5jJ1xuICAgICAgfVxuICAgIF1cbiAgfSxcbiAge1xuICAgICd0Zk9wTmFtZSc6ICdTdGF0ZWxlc3NXaGlsZScsXG4gICAgJ2NhdGVnb3J5JzogJ2NvbnRyb2wnLFxuICAgICdpbnB1dHMnOiBbXG4gICAgICB7XG4gICAgICAgICdzdGFydCc6IDAsXG4gICAgICAgICdlbmQnOiAwLFxuICAgICAgICAnbmFtZSc6ICdhcmdzJyxcbiAgICAgICAgJ3R5cGUnOiAndGVuc29ycydcbiAgICAgIH1cbiAgICBdLFxuICAgICdhdHRycyc6IFtcbiAgICAgIHtcbiAgICAgICAgJ3RmTmFtZSc6ICdjb25kJyxcbiAgICAgICAgJ25hbWUnOiAnY29uZCcsXG4gICAgICAgICd0eXBlJzogJ2Z1bmMnXG4gICAgICB9LFxuICAgICAge1xuICAgICAgICAndGZOYW1lJzogJ2JvZHknLFxuICAgICAgICAnbmFtZSc6ICdib2R5JyxcbiAgICAgICAgJ3R5cGUnOiAnZnVuYydcbiAgICAgIH1cbiAgICBdXG4gIH0sXG4gIHtcbiAgICAndGZPcE5hbWUnOiAnV2hpbGUnLFxuICAgICdjYXRlZ29yeSc6ICdjb250cm9sJyxcbiAgICAnaW5wdXRzJzogW1xuICAgICAge1xuICAgICAgICAnc3RhcnQnOiAwLFxuICAgICAgICAnZW5kJzogMCxcbiAgICAgICAgJ25hbWUnOiAnYXJncycsXG4gICAgICAgICd0eXBlJzogJ3RlbnNvcnMnXG4gICAgICB9XG4gICAgXSxcbiAgICAnYXR0cnMnOiBbXG4gICAgICB7XG4gICAgICAgICd0Zk5hbWUnOiAnY29uZCcsXG4gICAgICAgICduYW1lJzogJ2NvbmQnLFxuICAgICAgICAndHlwZSc6ICdmdW5jJ1xuICAgICAgfSxcbiAgICAgIHtcbiAgICAgICAgJ3RmTmFtZSc6ICdib2R5JyxcbiAgICAgICAgJ25hbWUnOiAnYm9keScsXG4gICAgICAgICd0eXBlJzogJ2Z1bmMnXG4gICAgICB9XG4gICAgXVxuICB9LFxuICB7XG4gICAgJ3RmT3BOYW1lJzogJ1RlbnNvckxpc3RTY2F0dGVyJyxcbiAgICAnY2F0ZWdvcnknOiAnY29udHJvbCcsXG4gICAgJ2lucHV0cyc6IFtcbiAgICAgIHtcbiAgICAgICAgJ3N0YXJ0JzogMCxcbiAgICAgICAgJ25hbWUnOiAndGVuc29yJyxcbiAgICAgICAgJ3R5cGUnOiAndGVuc29yJ1xuICAgICAgfSxcbiAgICAgIHtcbiAgICAgICAgJ3N0YXJ0JzogMSxcbiAgICAgICAgJ25hbWUnOiAnaW5kaWNlcycsXG4gICAgICAgICd0eXBlJzogJ251bWJlcltdJ1xuICAgICAgfSxcbiAgICAgIHtcbiAgICAgICAgJ3N0YXJ0JzogMixcbiAgICAgICAgJ25hbWUnOiAnZWxlbWVudFNoYXBlJyxcbiAgICAgICAgJ3R5cGUnOiAnc2hhcGUnXG4gICAgICB9XG4gICAgXSxcbiAgICAnYXR0cnMnOiBbXG4gICAgICB7XG4gICAgICAgICd0Zk5hbWUnOiAnZWxlbWVudF9kdHlwZScsXG4gICAgICAgICduYW1lJzogJ2VsZW1lbnREVHlwZScsXG4gICAgICAgICd0eXBlJzogJ2R0eXBlJ1xuICAgICAgfVxuICAgIF1cbiAgfSxcbiAge1xuICAgICd0Zk9wTmFtZSc6ICdUZW5zb3JMaXN0U2NhdHRlclYyJyxcbiAgICAnY2F0ZWdvcnknOiAnY29udHJvbCcsXG4gICAgJ2lucHV0cyc6IFtcbiAgICAgIHtcbiAgICAgICAgJ3N0YXJ0JzogMCxcbiAgICAgICAgJ25hbWUnOiAndGVuc29yJyxcbiAgICAgICAgJ3R5cGUnOiAndGVuc29yJ1xuICAgICAgfSxcbiAgICAgIHtcbiAgICAgICAgJ3N0YXJ0JzogMSxcbiAgICAgICAgJ25hbWUnOiAnaW5kaWNlcycsXG4gICAgICAgICd0eXBlJzogJ251bWJlcltdJ1xuICAgICAgfSxcbiAgICAgIHtcbiAgICAgICAgJ3N0YXJ0JzogMixcbiAgICAgICAgJ25hbWUnOiAnZWxlbWVudFNoYXBlJyxcbiAgICAgICAgJ3R5cGUnOiAnc2hhcGUnXG4gICAgICB9LFxuICAgICAge1xuICAgICAgICAnc3RhcnQnOiAzLFxuICAgICAgICAnbmFtZSc6ICdudW1FbGVtZW50cycsXG4gICAgICAgICd0eXBlJzogJ251bWJlcidcbiAgICAgIH1cbiAgICBdLFxuICAgICdhdHRycyc6IFtcbiAgICAgIHtcbiAgICAgICAgJ3RmTmFtZSc6ICdlbGVtZW50X2R0eXBlJyxcbiAgICAgICAgJ25hbWUnOiAnZWxlbWVudERUeXBlJyxcbiAgICAgICAgJ3R5cGUnOiAnZHR5cGUnXG4gICAgICB9XG4gICAgXVxuICB9LFxuICB7XG4gICAgJ3RmT3BOYW1lJzogJ1RlbnNvckxpc3RHYXRoZXInLFxuICAgICdjYXRlZ29yeSc6ICdjb250cm9sJyxcbiAgICAnaW5wdXRzJzogW1xuICAgICAge1xuICAgICAgICAnc3RhcnQnOiAwLFxuICAgICAgICAnbmFtZSc6ICd0ZW5zb3JMaXN0SWQnLFxuICAgICAgICAndHlwZSc6ICd0ZW5zb3InXG4gICAgICB9LFxuICAgICAge1xuICAgICAgICAnc3RhcnQnOiAxLFxuICAgICAgICAnbmFtZSc6ICdpbmRpY2VzJyxcbiAgICAgICAgJ3R5cGUnOiAnbnVtYmVyW10nXG4gICAgICB9LFxuICAgICAge1xuICAgICAgICAnc3RhcnQnOiAyLFxuICAgICAgICAnbmFtZSc6ICdlbGVtZW50U2hhcGUnLFxuICAgICAgICAndHlwZSc6ICdzaGFwZSdcbiAgICAgIH1cbiAgICBdLFxuICAgICdhdHRycyc6IFtcbiAgICAgIHtcbiAgICAgICAgJ3RmTmFtZSc6ICdlbGVtZW50X2R0eXBlJyxcbiAgICAgICAgJ25hbWUnOiAnZWxlbWVudERUeXBlJyxcbiAgICAgICAgJ3R5cGUnOiAnZHR5cGUnXG4gICAgICB9XG4gICAgXVxuICB9LFxuICB7XG4gICAgJ3RmT3BOYW1lJzogJ1RlbnNvckxpc3RHZXRJdGVtJyxcbiAgICAnY2F0ZWdvcnknOiAnY29udHJvbCcsXG4gICAgJ2lucHV0cyc6IFtcbiAgICAgIHtcbiAgICAgICAgJ3N0YXJ0JzogMCxcbiAgICAgICAgJ25hbWUnOiAndGVuc29yTGlzdElkJyxcbiAgICAgICAgJ3R5cGUnOiAndGVuc29yJ1xuICAgICAgfSxcbiAgICAgIHtcbiAgICAgICAgJ3N0YXJ0JzogMSxcbiAgICAgICAgJ25hbWUnOiAnaW5kZXgnLFxuICAgICAgICAndHlwZSc6ICdudW1iZXInXG4gICAgICB9LFxuICAgICAge1xuICAgICAgICAnc3RhcnQnOiAyLFxuICAgICAgICAnbmFtZSc6ICdlbGVtZW50U2hhcGUnLFxuICAgICAgICAndHlwZSc6ICdzaGFwZSdcbiAgICAgIH1cbiAgICBdLFxuICAgICdhdHRycyc6IFtcbiAgICAgIHtcbiAgICAgICAgJ3RmTmFtZSc6ICdlbGVtZW50X2R0eXBlJyxcbiAgICAgICAgJ25hbWUnOiAnZWxlbWVudERUeXBlJyxcbiAgICAgICAgJ3R5cGUnOiAnZHR5cGUnXG4gICAgICB9XG4gICAgXVxuICB9LFxuICB7XG4gICAgJ3RmT3BOYW1lJzogJ1RlbnNvckxpc3RTZXRJdGVtJyxcbiAgICAnY2F0ZWdvcnknOiAnY29udHJvbCcsXG4gICAgJ2lucHV0cyc6IFtcbiAgICAgIHtcbiAgICAgICAgJ3N0YXJ0JzogMCxcbiAgICAgICAgJ25hbWUnOiAndGVuc29yTGlzdElkJyxcbiAgICAgICAgJ3R5cGUnOiAndGVuc29yJ1xuICAgICAgfSxcbiAgICAgIHtcbiAgICAgICAgJ3N0YXJ0JzogMSxcbiAgICAgICAgJ25hbWUnOiAnaW5kZXgnLFxuICAgICAgICAndHlwZSc6ICdudW1iZXInXG4gICAgICB9LFxuICAgICAge1xuICAgICAgICAnc3RhcnQnOiAyLFxuICAgICAgICAnbmFtZSc6ICd0ZW5zb3InLFxuICAgICAgICAndHlwZSc6ICd0ZW5zb3InXG4gICAgICB9XG4gICAgXSxcbiAgICAnYXR0cnMnOiBbXG4gICAgICB7XG4gICAgICAgICd0Zk5hbWUnOiAnZWxlbWVudF9kdHlwZScsXG4gICAgICAgICduYW1lJzogJ2VsZW1lbnREVHlwZScsXG4gICAgICAgICd0eXBlJzogJ2R0eXBlJ1xuICAgICAgfVxuICAgIF1cbiAgfSxcbiAge1xuICAgICd0Zk9wTmFtZSc6ICdUZW5zb3JMaXN0UmVzZXJ2ZScsXG4gICAgJ2NhdGVnb3J5JzogJ2NvbnRyb2wnLFxuICAgICdpbnB1dHMnOiBbXG4gICAgICB7XG4gICAgICAgICdzdGFydCc6IDAsXG4gICAgICAgICduYW1lJzogJ2VsZW1lbnRTaGFwZScsXG4gICAgICAgICd0eXBlJzogJ3NoYXBlJ1xuICAgICAgfSxcbiAgICAgIHtcbiAgICAgICAgJ3N0YXJ0JzogMSxcbiAgICAgICAgJ25hbWUnOiAnbnVtRWxlbWVudHMnLFxuICAgICAgICAndHlwZSc6ICdudW1iZXInXG4gICAgICB9XG4gICAgXSxcbiAgICAnYXR0cnMnOiBbXG4gICAgICB7XG4gICAgICAgICd0Zk5hbWUnOiAnZWxlbWVudF9kdHlwZScsXG4gICAgICAgICduYW1lJzogJ2VsZW1lbnREVHlwZScsXG4gICAgICAgICd0eXBlJzogJ2R0eXBlJ1xuICAgICAgfVxuICAgIF1cbiAgfSxcbiAge1xuICAgICd0Zk9wTmFtZSc6ICdUZW5zb3JMaXN0RnJvbVRlbnNvcicsXG4gICAgJ2NhdGVnb3J5JzogJ2NvbnRyb2wnLFxuICAgICdpbnB1dHMnOiBbXG4gICAgICB7XG4gICAgICAgICdzdGFydCc6IDAsXG4gICAgICAgICduYW1lJzogJ3RlbnNvcicsXG4gICAgICAgICd0eXBlJzogJ3RlbnNvcidcbiAgICAgIH0sXG4gICAgICB7XG4gICAgICAgICdzdGFydCc6IDEsXG4gICAgICAgICduYW1lJzogJ2VsZW1lbnRTaGFwZScsXG4gICAgICAgICd0eXBlJzogJ3NoYXBlJ1xuICAgICAgfVxuICAgIF0sXG4gICAgJ2F0dHJzJzogW1xuICAgICAge1xuICAgICAgICAndGZOYW1lJzogJ2VsZW1lbnRfZHR5cGUnLFxuICAgICAgICAnbmFtZSc6ICdlbGVtZW50RFR5cGUnLFxuICAgICAgICAndHlwZSc6ICdkdHlwZSdcbiAgICAgIH1cbiAgICBdXG4gIH0sXG4gIHtcbiAgICAndGZPcE5hbWUnOiAnVGVuc29yTGlzdFN0YWNrJyxcbiAgICAnY2F0ZWdvcnknOiAnY29udHJvbCcsXG4gICAgJ2lucHV0cyc6IFtcbiAgICAgIHtcbiAgICAgICAgJ3N0YXJ0JzogMCxcbiAgICAgICAgJ25hbWUnOiAndGVuc29yTGlzdElkJyxcbiAgICAgICAgJ3R5cGUnOiAndGVuc29yJ1xuICAgICAgfSxcbiAgICAgIHtcbiAgICAgICAgJ3N0YXJ0JzogMSxcbiAgICAgICAgJ25hbWUnOiAnZWxlbWVudFNoYXBlJyxcbiAgICAgICAgJ3R5cGUnOiAnc2hhcGUnXG4gICAgICB9XG4gICAgXSxcbiAgICAnYXR0cnMnOiBbXG4gICAgICB7XG4gICAgICAgICd0Zk5hbWUnOiAnZWxlbWVudF9kdHlwZScsXG4gICAgICAgICduYW1lJzogJ2VsZW1lbnREVHlwZScsXG4gICAgICAgICd0eXBlJzogJ2R0eXBlJ1xuICAgICAgfSxcbiAgICAgIHtcbiAgICAgICAgJ3RmTmFtZSc6ICdudW1fZWxlbWVudHMnLFxuICAgICAgICAnbmFtZSc6ICdudW1FbGVtZW50cycsXG4gICAgICAgICd0eXBlJzogJ2R0eXBlJ1xuICAgICAgfVxuICAgIF1cbiAgfSxcbiAge1xuICAgICd0Zk9wTmFtZSc6ICdUZW5zb3JMaXN0U3BsaXQnLFxuICAgICdjYXRlZ29yeSc6ICdjb250cm9sJyxcbiAgICAnaW5wdXRzJzogW1xuICAgICAge1xuICAgICAgICAnc3RhcnQnOiAwLFxuICAgICAgICAnbmFtZSc6ICd0ZW5zb3InLFxuICAgICAgICAndHlwZSc6ICd0ZW5zb3InXG4gICAgICB9LFxuICAgICAge1xuICAgICAgICAnc3RhcnQnOiAxLFxuICAgICAgICAnbmFtZSc6ICdlbGVtZW50U2hhcGUnLFxuICAgICAgICAndHlwZSc6ICdzaGFwZSdcbiAgICAgIH0sXG4gICAgICB7XG4gICAgICAgICdzdGFydCc6IDIsXG4gICAgICAgICduYW1lJzogJ2xlbmd0aHMnLFxuICAgICAgICAndHlwZSc6ICdudW1iZXJbXSdcbiAgICAgIH1cbiAgICBdLFxuICAgICdhdHRycyc6IFtcbiAgICAgIHtcbiAgICAgICAgJ3RmTmFtZSc6ICdlbGVtZW50X2R0eXBlJyxcbiAgICAgICAgJ25hbWUnOiAnZWxlbWVudERUeXBlJyxcbiAgICAgICAgJ3R5cGUnOiAnZHR5cGUnXG4gICAgICB9XG4gICAgXVxuICB9LFxuICB7XG4gICAgJ3RmT3BOYW1lJzogJ1RlbnNvckxpc3RDb25jYXQnLFxuICAgICdjYXRlZ29yeSc6ICdjb250cm9sJyxcbiAgICAnaW5wdXRzJzogW1xuICAgICAge1xuICAgICAgICAnc3RhcnQnOiAwLFxuICAgICAgICAnbmFtZSc6ICd0ZW5zb3JMaXN0SWQnLFxuICAgICAgICAndHlwZSc6ICd0ZW5zb3InXG4gICAgICB9XG4gICAgXSxcbiAgICAnYXR0cnMnOiBbXG4gICAgICB7XG4gICAgICAgICd0Zk5hbWUnOiAnZWxlbWVudF9zaGFwZScsXG4gICAgICAgICduYW1lJzogJ2VsZW1lbnRTaGFwZScsXG4gICAgICAgICd0eXBlJzogJ3NoYXBlJ1xuICAgICAgfSxcbiAgICAgIHtcbiAgICAgICAgJ3RmTmFtZSc6ICdlbGVtZW50X2R0eXBlJyxcbiAgICAgICAgJ25hbWUnOiAnZWxlbWVudERUeXBlJyxcbiAgICAgICAgJ3R5cGUnOiAnZHR5cGUnXG4gICAgICB9XG4gICAgXVxuICB9LFxuICB7XG4gICAgJ3RmT3BOYW1lJzogJ1RlbnNvckxpc3RDb25jYXRWMicsXG4gICAgJ2NhdGVnb3J5JzogJ2NvbnRyb2wnLFxuICAgICdpbnB1dHMnOiBbXG4gICAgICB7XG4gICAgICAgICdzdGFydCc6IDAsXG4gICAgICAgICduYW1lJzogJ3RlbnNvckxpc3RJZCcsXG4gICAgICAgICd0eXBlJzogJ3RlbnNvcidcbiAgICAgIH1cbiAgICBdLFxuICAgICdhdHRycyc6IFtcbiAgICAgIHtcbiAgICAgICAgJ3RmTmFtZSc6ICdlbGVtZW50X3NoYXBlJyxcbiAgICAgICAgJ25hbWUnOiAnZWxlbWVudFNoYXBlJyxcbiAgICAgICAgJ3R5cGUnOiAnc2hhcGUnXG4gICAgICB9LFxuICAgICAge1xuICAgICAgICAndGZOYW1lJzogJ2VsZW1lbnRfZHR5cGUnLFxuICAgICAgICAnbmFtZSc6ICdlbGVtZW50RFR5cGUnLFxuICAgICAgICAndHlwZSc6ICdkdHlwZSdcbiAgICAgIH1cbiAgICBdXG4gIH0sXG4gIHtcbiAgICAndGZPcE5hbWUnOiAnVGVuc29yTGlzdFBvcEJhY2snLFxuICAgICdjYXRlZ29yeSc6ICdjb250cm9sJyxcbiAgICAnaW5wdXRzJzogW1xuICAgICAge1xuICAgICAgICAnc3RhcnQnOiAwLFxuICAgICAgICAnbmFtZSc6ICd0ZW5zb3JMaXN0SWQnLFxuICAgICAgICAndHlwZSc6ICd0ZW5zb3InXG4gICAgICB9LFxuICAgICAge1xuICAgICAgICAnc3RhcnQnOiAxLFxuICAgICAgICAnbmFtZSc6ICdlbGVtZW50U2hhcGUnLFxuICAgICAgICAndHlwZSc6ICdzaGFwZSdcbiAgICAgIH1cbiAgICBdLFxuICAgICdhdHRycyc6IFtcbiAgICAgIHtcbiAgICAgICAgJ3RmTmFtZSc6ICdlbGVtZW50X2R0eXBlJyxcbiAgICAgICAgJ25hbWUnOiAnZWxlbWVudERUeXBlJyxcbiAgICAgICAgJ3R5cGUnOiAnZHR5cGUnXG4gICAgICB9XG4gICAgXVxuICB9LFxuICB7XG4gICAgJ3RmT3BOYW1lJzogJ1RlbnNvckxpc3RQdXNoQmFjaycsXG4gICAgJ2NhdGVnb3J5JzogJ2NvbnRyb2wnLFxuICAgICdpbnB1dHMnOiBbXG4gICAgICB7XG4gICAgICAgICdzdGFydCc6IDAsXG4gICAgICAgICduYW1lJzogJ3RlbnNvckxpc3RJZCcsXG4gICAgICAgICd0eXBlJzogJ3RlbnNvcidcbiAgICAgIH0sXG4gICAgICB7XG4gICAgICAgICdzdGFydCc6IDEsXG4gICAgICAgICduYW1lJzogJ3RlbnNvcicsXG4gICAgICAgICd0eXBlJzogJ3RlbnNvcidcbiAgICAgIH1cbiAgICBdLFxuICAgICdhdHRycyc6IFtcbiAgICAgIHtcbiAgICAgICAgJ3RmTmFtZSc6ICdlbGVtZW50X2R0eXBlJyxcbiAgICAgICAgJ25hbWUnOiAnZWxlbWVudERUeXBlJyxcbiAgICAgICAgJ3R5cGUnOiAnZHR5cGUnXG4gICAgICB9XG4gICAgXVxuICB9LFxuICB7XG4gICAgJ3RmT3BOYW1lJzogJ1RlbnNvckxpc3RMZW5ndGgnLFxuICAgICdjYXRlZ29yeSc6ICdjb250cm9sJyxcbiAgICAnaW5wdXRzJzogW1xuICAgICAge1xuICAgICAgICAnc3RhcnQnOiAwLFxuICAgICAgICAnbmFtZSc6ICd0ZW5zb3JMaXN0SWQnLFxuICAgICAgICAndHlwZSc6ICd0ZW5zb3InXG4gICAgICB9XG4gICAgXVxuICB9LFxuICB7XG4gICAgJ3RmT3BOYW1lJzogJ1RlbnNvckxpc3RSZXNpemUnLFxuICAgICdjYXRlZ29yeSc6ICdjb250cm9sJyxcbiAgICAnaW5wdXRzJzogW1xuICAgICAge1xuICAgICAgICAnc3RhcnQnOiAwLFxuICAgICAgICAnbmFtZSc6ICd0ZW5zb3JMaXN0SWQnLFxuICAgICAgICAndHlwZSc6ICd0ZW5zb3InXG4gICAgICB9LFxuICAgICAge1xuICAgICAgICAnc3RhcnQnOiAxLFxuICAgICAgICAnbmFtZSc6ICdzaXplJyxcbiAgICAgICAgJ3R5cGUnOiAnbnVtYmVyJ1xuICAgICAgfVxuICAgIF1cbiAgfVxuXVxuO1xuIl19","/**\n * @license\n * Copyright 2022 Google LLC. All Rights Reserved.\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n * =============================================================================\n */\nexport const json = [\n {\n 'tfOpName': 'AvgPool',\n 'category': 'convolution',\n 'inputs': [\n {\n 'start': 0,\n 'name': 'x',\n 'type': 'tensor'\n }\n ],\n 'attrs': [\n {\n 'tfName': 'strides',\n 'name': 'strides',\n 'type': 'number[]'\n },\n {\n 'tfName': 'padding',\n 'name': 'pad',\n 'type': 'string'\n },\n {\n 'tfName': 'data_format',\n 'name': 'dataFormat',\n 'type': 'string',\n 'notSupported': true\n },\n {\n 'tfName': 'ksize',\n 'name': 'kernelSize',\n 'type': 'number[]'\n },\n {\n 'tfName': 'T',\n 'name': 'dtype',\n 'type': 'dtype',\n 'notSupported': true\n }\n ]\n },\n {\n 'tfOpName': 'MaxPool',\n 'category': 'convolution',\n 'inputs': [\n {\n 'start': 0,\n 'name': 'x',\n 'type': 'tensor'\n }\n ],\n 'attrs': [\n {\n 'tfName': 'strides',\n 'name': 'strides',\n 'type': 'number[]'\n },\n {\n 'tfName': 'padding',\n 'name': 'pad',\n 'type': 'string'\n },\n {\n 'tfName': 'data_format',\n 'name': 'dataFormat',\n 'type': 'string',\n 'notSupported': true\n },\n {\n 'tfName': 'ksize',\n 'name': 'kernelSize',\n 'type': 'number[]'\n },\n {\n 'tfName': 'explicit_paddings',\n 'name': 'explicitPaddings',\n 'type': 'number[]',\n 'defaultValue': [],\n 'notSupported': true\n },\n {\n 'tfName': 'T',\n 'name': 'dtype',\n 'type': 'dtype',\n 'notSupported': true\n }\n ]\n },\n {\n 'tfOpName': 'MaxPoolWithArgmax',\n 'category': 'convolution',\n 'inputs': [\n {\n 'start': 0,\n 'name': 'x',\n 'type': 'tensor'\n }\n ],\n 'attrs': [\n {\n 'tfName': 'strides',\n 'name': 'strides',\n 'type': 'number[]'\n },\n {\n 'tfName': 'padding',\n 'name': 'pad',\n 'type': 'string'\n },\n {\n 'tfName': 'ksize',\n 'name': 'kernelSize',\n 'type': 'number[]'\n },\n {\n 'tfName': 'include_batch_in_index',\n 'name': 'includeBatchInIndex',\n 'type': 'bool'\n },\n {\n 'tfName': 'T',\n 'name': 'dtype',\n 'type': 'dtype',\n 'notSupported': true\n }\n ]\n },\n {\n 'tfOpName': 'AvgPool3D',\n 'category': 'convolution',\n 'inputs': [\n {\n 'start': 0,\n 'name': 'x',\n 'type': 'tensor'\n }\n ],\n 'attrs': [\n {\n 'tfName': 'strides',\n 'name': 'strides',\n 'type': 'number[]'\n },\n {\n 'tfName': 'padding',\n 'name': 'pad',\n 'type': 'string'\n },\n {\n 'tfName': 'data_format',\n 'name': 'dataFormat',\n 'type': 'string',\n 'notSupported': true\n },\n {\n 'tfName': 'ksize',\n 'name': 'kernelSize',\n 'type': 'number[]'\n },\n {\n 'tfName': 'T',\n 'name': 'dtype',\n 'type': 'dtype',\n 'notSupported': true\n }\n ]\n },\n {\n 'tfOpName': 'MaxPool3D',\n 'category': 'convolution',\n 'inputs': [\n {\n 'start': 0,\n 'name': 'x',\n 'type': 'tensor'\n }\n ],\n 'attrs': [\n {\n 'tfName': 'strides',\n 'name': 'strides',\n 'type': 'number[]'\n },\n {\n 'tfName': 'padding',\n 'name': 'pad',\n 'type': 'string'\n },\n {\n 'tfName': 'data_format',\n 'name': 'dataFormat',\n 'type': 'string',\n 'notSupported': true\n },\n {\n 'tfName': 'ksize',\n 'name': 'kernelSize',\n 'type': 'number[]'\n },\n {\n 'tfName': 'T',\n 'name': 'dtype',\n 'type': 'dtype',\n 'notSupported': true\n }\n ]\n },\n {\n 'tfOpName': 'Conv1D',\n 'category': 'convolution',\n 'inputs': [\n {\n 'start': 0,\n 'name': 'x',\n 'type': 'tensor'\n },\n {\n 'start': 1,\n 'name': 'filter',\n 'type': 'tensor'\n }\n ],\n 'attrs': [\n {\n 'tfName': 'stride',\n 'name': 'stride',\n 'type': 'number'\n },\n {\n 'tfName': 'padding',\n 'name': 'pad',\n 'type': 'string'\n },\n {\n 'tfName': 'data_format',\n 'name': 'dataFormat',\n 'type': 'string',\n 'defaultValue': 'NWC'\n },\n {\n 'tfName': 'T',\n 'name': 'dtype',\n 'type': 'dtype',\n 'notSupported': true\n },\n {\n 'tfName': 'dilation',\n 'name': 'dilation',\n 'type': 'number',\n 'defaultValue': 1\n }\n ]\n },\n {\n 'tfOpName': 'Conv2D',\n 'category': 'convolution',\n 'inputs': [\n {\n 'start': 0,\n 'name': 'x',\n 'type': 'tensor'\n },\n {\n 'start': 1,\n 'name': 'filter',\n 'type': 'tensor'\n }\n ],\n 'attrs': [\n {\n 'tfName': 'T',\n 'name': 'dtype',\n 'type': 'dtype',\n 'notSupported': true\n },\n {\n 'tfName': 'strides',\n 'name': 'strides',\n 'type': 'number[]'\n },\n {\n 'tfName': 'padding',\n 'name': 'pad',\n 'type': 'string'\n },\n {\n 'tfName': 'useCudnnOnGpu',\n 'name': 'useCudnnOnGpu',\n 'type': 'bool'\n },\n {\n 'tfName': 'data_format',\n 'name': 'dataFormat',\n 'type': 'string',\n 'defaultValue': 'NHWC'\n },\n {\n 'tfName': 'explicit_paddings',\n 'name': 'explicitPaddings',\n 'type': 'number[]',\n 'defaultValue': []\n },\n {\n 'tfName': 'dilations',\n 'name': 'dilations',\n 'type': 'number[]'\n }\n ]\n },\n {\n 'tfOpName': '_FusedConv2D',\n 'category': 'convolution',\n 'inputs': [\n {\n 'start': 0,\n 'name': 'x',\n 'type': 'tensor'\n },\n {\n 'start': 1,\n 'name': 'filter',\n 'type': 'tensor'\n },\n {\n 'start': 2,\n 'end': 0,\n 'name': 'args',\n 'type': 'tensors'\n }\n ],\n 'attrs': [\n {\n 'tfName': 'num_args',\n 'name': 'numArgs',\n 'type': 'number'\n },\n {\n 'tfName': 'T',\n 'name': 'dtype',\n 'type': 'dtype',\n 'notSupported': true\n },\n {\n 'tfName': 'strides',\n 'name': 'strides',\n 'type': 'number[]'\n },\n {\n 'tfName': 'padding',\n 'name': 'pad',\n 'type': 'string'\n },\n {\n 'tfName': 'explicit_paddings',\n 'name': 'explicitPaddings',\n 'type': 'number[]',\n 'defaultValue': []\n },\n {\n 'tfName': 'use_cudnn_on_gpu',\n 'name': 'useCudnnOnGpu',\n 'type': 'bool',\n 'defaultValue': true\n },\n {\n 'tfName': 'data_format',\n 'name': 'dataFormat',\n 'type': 'string',\n 'defaultValue': 'NHWC'\n },\n {\n 'tfName': 'dilations',\n 'name': 'dilations',\n 'type': 'number[]',\n 'defaultValue': [\n 1,\n 1,\n 1,\n 1\n ]\n },\n {\n 'tfName': 'fused_ops',\n 'name': 'fusedOps',\n 'type': 'string[]',\n 'defaultValue': []\n },\n {\n 'tfName': 'epsilon',\n 'name': 'epsilon',\n 'type': 'number',\n 'defaultValue': 0.0001\n },\n {\n 'tfName': 'leakyrelu_alpha',\n 'name': 'leakyreluAlpha',\n 'type': 'number',\n 'defaultValue': 0.2\n }\n ]\n },\n {\n 'tfOpName': 'Conv2DBackpropInput',\n 'category': 'convolution',\n 'inputs': [\n {\n 'start': 2,\n 'name': 'x',\n 'type': 'tensor'\n },\n {\n 'start': 1,\n 'name': 'filter',\n 'type': 'tensor'\n },\n {\n 'start': 0,\n 'name': 'outputShape',\n 'type': 'number[]'\n }\n ],\n 'attrs': [\n {\n 'tfName': 'strides',\n 'name': 'strides',\n 'type': 'number[]'\n },\n {\n 'tfName': 'padding',\n 'name': 'pad',\n 'type': 'string'\n },\n {\n 'tfName': 'data_format',\n 'name': 'dataFormat',\n 'type': 'string',\n 'notSupported': true\n },\n {\n 'tfName': 'explicit_paddings',\n 'name': 'explicitPaddings',\n 'type': 'number[]',\n 'defaultValue': []\n },\n {\n 'tfName': 'dilations',\n 'name': 'dilations',\n 'type': 'number[]',\n 'notSupported': true\n }\n ]\n },\n {\n 'tfOpName': 'DepthwiseConv2d',\n 'category': 'convolution',\n 'inputs': [\n {\n 'start': 0,\n 'name': 'input',\n 'type': 'tensor'\n },\n {\n 'start': 1,\n 'name': 'filter',\n 'type': 'tensor'\n }\n ],\n 'attrs': [\n {\n 'tfName': 'strides',\n 'name': 'strides',\n 'type': 'number[]'\n },\n {\n 'tfName': 'padding',\n 'name': 'pad',\n 'type': 'string'\n },\n {\n 'tfName': 'data_format',\n 'name': 'dataFormat',\n 'type': 'string',\n 'defaultValue': 'NHWC'\n },\n {\n 'tfName': 'explicit_paddings',\n 'name': 'explicitPaddings',\n 'type': 'number[]',\n 'defaultValue': []\n },\n {\n 'tfName': 'dilations',\n 'name': 'dilations',\n 'type': 'number[]'\n }\n ]\n },\n {\n 'tfOpName': 'DepthwiseConv2dNative',\n 'category': 'convolution',\n 'inputs': [\n {\n 'start': 0,\n 'name': 'input',\n 'type': 'tensor'\n },\n {\n 'start': 1,\n 'name': 'filter',\n 'type': 'tensor'\n }\n ],\n 'attrs': [\n {\n 'tfName': 'strides',\n 'name': 'strides',\n 'type': 'number[]'\n },\n {\n 'tfName': 'padding',\n 'name': 'pad',\n 'type': 'string'\n },\n {\n 'tfName': 'data_format',\n 'name': 'dataFormat',\n 'type': 'string',\n 'defaultValue': 'NHWC'\n },\n {\n 'tfName': 'explicit_paddings',\n 'name': 'explicitPaddings',\n 'type': 'number[]',\n 'defaultValue': []\n },\n {\n 'tfName': 'dilations',\n 'name': 'dilations',\n 'type': 'number[]'\n }\n ]\n },\n {\n 'tfOpName': 'FusedDepthwiseConv2dNative',\n 'category': 'convolution',\n 'inputs': [\n {\n 'start': 0,\n 'name': 'x',\n 'type': 'tensor'\n },\n {\n 'start': 1,\n 'name': 'filter',\n 'type': 'tensor'\n },\n {\n 'start': 2,\n 'end': 0,\n 'name': 'args',\n 'type': 'tensors'\n }\n ],\n 'attrs': [\n {\n 'tfName': 'num_args',\n 'name': 'numArgs',\n 'type': 'number'\n },\n {\n 'tfName': 'T',\n 'name': 'dtype',\n 'type': 'dtype',\n 'notSupported': true\n },\n {\n 'tfName': 'strides',\n 'name': 'strides',\n 'type': 'number[]'\n },\n {\n 'tfName': 'padding',\n 'name': 'pad',\n 'type': 'string'\n },\n {\n 'tfName': 'data_format',\n 'name': 'dataFormat',\n 'type': 'string',\n 'defaultValue': 'NHWC'\n },\n {\n 'tfName': 'dilations',\n 'name': 'dilations',\n 'type': 'number[]',\n 'defaultValue': [\n 1,\n 1,\n 1,\n 1\n ]\n },\n {\n 'tfName': 'fused_ops',\n 'name': 'fusedOps',\n 'type': 'string[]',\n 'defaultValue': []\n },\n {\n 'tfName': 'explicit_paddings',\n 'name': 'explicitPaddings',\n 'type': 'number[]',\n 'defaultValue': []\n }\n ]\n },\n {\n 'tfOpName': 'Conv3D',\n 'category': 'convolution',\n 'inputs': [\n {\n 'start': 0,\n 'name': 'x',\n 'type': 'tensor'\n },\n {\n 'start': 1,\n 'name': 'filter',\n 'type': 'tensor'\n }\n ],\n 'attrs': [\n {\n 'tfName': 'strides',\n 'name': 'strides',\n 'type': 'number[]'\n },\n {\n 'tfName': 'padding',\n 'name': 'pad',\n 'type': 'string'\n },\n {\n 'tfName': 'data_format',\n 'name': 'dataFormat',\n 'type': 'string',\n 'defaultValue': 'NHWC'\n },\n {\n 'tfName': 'dilations',\n 'name': 'dilations',\n 'type': 'number[]'\n }\n ]\n },\n {\n 'tfOpName': 'Dilation2D',\n 'category': 'convolution',\n 'inputs': [\n {\n 'start': 0,\n 'name': 'x',\n 'type': 'tensor'\n },\n {\n 'start': 1,\n 'name': 'filter',\n 'type': 'tensor'\n }\n ],\n 'attrs': [\n {\n 'tfName': 'strides',\n 'name': 'strides',\n 'type': 'number[]'\n },\n {\n 'tfName': 'rates',\n 'name': 'dilations',\n 'type': 'number[]'\n },\n {\n 'tfName': 'padding',\n 'name': 'pad',\n 'type': 'string'\n }\n ]\n }\n];\n//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY29udm9sdXRpb24uanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi8uLi8uLi90ZmpzLWNvbnZlcnRlci9zcmMvb3BlcmF0aW9ucy9vcF9saXN0L2NvbnZvbHV0aW9uLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUNBOzs7Ozs7Ozs7Ozs7Ozs7R0FlRztBQUlILE1BQU0sQ0FBQyxNQUFNLElBQUksR0FBZTtJQUM5QjtRQUNFLFVBQVUsRUFBRSxTQUFTO1FBQ3JCLFVBQVUsRUFBRSxhQUFhO1FBQ3pCLFFBQVEsRUFBRTtZQUNSO2dCQUNFLE9BQU8sRUFBRSxDQUFDO2dCQUNWLE1BQU0sRUFBRSxHQUFHO2dCQUNYLE1BQU0sRUFBRSxRQUFRO2FBQ2pCO1NBQ0Y7UUFDRCxPQUFPLEVBQUU7WUFDUDtnQkFDRSxRQUFRLEVBQUUsU0FBUztnQkFDbkIsTUFBTSxFQUFFLFNBQVM7Z0JBQ2pCLE1BQU0sRUFBRSxVQUFVO2FBQ25CO1lBQ0Q7Z0JBQ0UsUUFBUSxFQUFFLFNBQVM7Z0JBQ25CLE1BQU0sRUFBRSxLQUFLO2dCQUNiLE1BQU0sRUFBRSxRQUFRO2FBQ2pCO1lBQ0Q7Z0JBQ0UsUUFBUSxFQUFFLGFBQWE7Z0JBQ3ZCLE1BQU0sRUFBRSxZQUFZO2dCQUNwQixNQUFNLEVBQUUsUUFBUTtnQkFDaEIsY0FBYyxFQUFFLElBQUk7YUFDckI7WUFDRDtnQkFDRSxRQUFRLEVBQUUsT0FBTztnQkFDakIsTUFBTSxFQUFFLFlBQVk7Z0JBQ3BCLE1BQU0sRUFBRSxVQUFVO2FBQ25CO1lBQ0Q7Z0JBQ0UsUUFBUSxFQUFFLEdBQUc7Z0JBQ2IsTUFBTSxFQUFFLE9BQU87Z0JBQ2YsTUFBTSxFQUFFLE9BQU87Z0JBQ2YsY0FBYyxFQUFFLElBQUk7YUFDckI7U0FDRjtLQUNGO0lBQ0Q7UUFDRSxVQUFVLEVBQUUsU0FBUztRQUNyQixVQUFVLEVBQUUsYUFBYTtRQUN6QixRQUFRLEVBQUU7WUFDUjtnQkFDRSxPQUFPLEVBQUUsQ0FBQztnQkFDVixN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QUFFLFdBQVc7Z0JBQ25CLE1BQU0sRUFBRSxVQUFVO2FBQ25CO1NBQ0Y7S0FDRjtJQUNEO1FBQ0UsVUFBVSxFQUFFLFlBQVk7UUFDeEIsVUFBVSxFQUFFLGFBQWE7UUFDekIsUUFBUSxFQUFFO1lBQ1I7Z0JBQ0UsT0FBTyxFQUFFLENBQUM7Z0JBQ1YsTUFBTSxFQUFFLEdBQUc7Z0JBQ1gsTUFBTSxFQUFFLFFBQVE7YUFDakI7WUFDRDtnQkFDRSxPQUFPLEVBQUUsQ0FBQztnQkFDVixNQUFNLEVBQUUsUUFBUTtnQkFDaEIsTUFBTSxFQUFFLFFBQVE7YUFDakI7U0FDRjtRQUNELE9BQU8sRUFBRTtZQUNQO2dCQUNFLFFBQVEsRUFBRSxTQUFTO2dCQUNuQixNQUFNLEVBQUUsU0FBUztnQkFDakIsTUFBTSxFQUFFLFVBQVU7YUFDbkI7WUFDRDtnQkFDRSxRQUFRLEVBQUUsT0FBTztnQkFDakIsTUFBTSxFQUFFLFdBQVc7Z0JBQ25CLE1BQU0sRUFBRSxVQUFVO2FBQ25CO1lBQ0Q7Z0JBQ0UsUUFBUSxFQUFFLFNBQVM7Z0JBQ25CLE1BQU0sRUFBRSxLQUFLO2dCQUNiLE1BQU0sRUFBRSxRQUFRO2FBQ2pCO1NBQ0Y7S0FDRjtDQUNGLENBQ0EiLCJzb3VyY2VzQ29udGVudCI6WyJcbi8qKlxuICogQGxpY2Vuc2VcbiAqIENvcHlyaWdodCAyMDIyIEdvb2dsZSBMTEMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuXG4gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgXCJMaWNlbnNlXCIpO1xuICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLlxuICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0XG4gKlxuICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wXG4gKlxuICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZVxuICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gXCJBUyBJU1wiIEJBU0lTLFxuICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuXG4gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kXG4gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS5cbiAqID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4gKi9cblxuaW1wb3J0IHtPcE1hcHBlcn0gZnJvbSAnLi4vdHlwZXMnO1xuXG5leHBvcnQgY29uc3QganNvbjogT3BNYXBwZXJbXSA9IFtcbiAge1xuICAgICd0Zk9wTmFtZSc6ICdBdmdQb29sJyxcbiAgICAnY2F0ZWdvcnknOiAnY29udm9sdXRpb24nLFxuICAgICdpbnB1dHMnOiBbXG4gICAgICB7XG4gICAgICAgICdzdGFydCc6IDAsXG4gICAgICAgICduYW1lJzogJ3gnLFxuICAgICAgICAndHlwZSc6ICd0ZW5zb3InXG4gICAgICB9XG4gICAgXSxcbiAgICAnYXR0cnMnOiBbXG4gICAgICB7XG4gICAgICAgICd0Zk5hbWUnOiAnc3RyaWRlcycsXG4gICAgICAgICduYW1lJzogJ3N0cmlkZXMnLFxuICAgICAgICAndHlwZSc6ICdudW1iZXJbXSdcbiAgICAgIH0sXG4gICAgICB7XG4gICAgICAgICd0Zk5hbWUnOiAncGFkZGluZycsXG4gICAgICAgICduYW1lJzogJ3BhZCcsXG4gICAgICAgICd0eXBlJzogJ3N0cmluZydcbiAgICAgIH0sXG4gICAgICB7XG4gICAgICAgICd0Zk5hbWUnOiAnZGF0YV9mb3JtYXQnLFxuICAgICAgICAnbmFtZSc6ICdkYXRhRm9ybWF0JyxcbiAgICAgICAgJ3R5cGUnOiAnc3RyaW5nJyxcbiAgICAgICAgJ25vdFN1cHBvcnRlZCc6IHRydWVcbiAgICAgIH0sXG4gICAgICB7XG4gICAgICAgICd0Zk5hbWUnOiAna3NpemUnLFxuICAgICAgICAnbmFtZSc6ICdrZXJuZWxTaXplJyxcbiAgICAgICAgJ3R5cGUnOiAnbnVtYmVyW10nXG4gICAgICB9LFxuICAgICAge1xuICAgICAgICAndGZOYW1lJzogJ1QnLFxuICAgICAgICAnbmFtZSc6ICdkdHlwZScsXG4gICAgICAgICd0eXBlJzogJ2R0eXBlJyxcbiAgICAgICAgJ25vdFN1cHBvcnRlZCc6IHRydWVcbiAgICAgIH1cbiAgICBdXG4gIH0sXG4gIHtcbiAgICAndGZPcE5hbWUnOiAnTWF4UG9vbCcsXG4gICAgJ2NhdGVnb3J5JzogJ2NvbnZvbHV0aW9uJyxcbiAgICAnaW5wdXRzJzogW1xuICAgICAge1xuICAgICAgICAnc3RhcnQnOiAwLFxuICAgICAgICAnbmFtZSc6ICd4JyxcbiAgICAgICAgJ3R5cGUnOiAndGVuc29yJ1xuICAgICAgfVxuICAgIF0sXG4gICAgJ2F0dHJzJzogW1xuICAgICAge1xuICAgICAgICAndGZOYW1lJzogJ3N0cmlkZXMnLFxuICAgICAgICAnbmFtZSc6ICdzdHJpZGVzJyxcbiAgICAgICAgJ3R5cGUnOiAnbnVtYmVyW10nXG4gICAgICB9LFxuICAgICAge1xuICAgICAgICAndGZOYW1lJzogJ3BhZGRpbmcnLFxuICAgICAgICAnbmFtZSc6ICdwYWQnLFxuICAgICAgICAndHlwZSc6ICdzdHJpbmcnXG4gICAgICB9LFxuICAgICAge1xuICAgICAgICAndGZOYW1lJzogJ2RhdGFfZm9ybWF0JyxcbiAgICAgICAgJ25hbWUnOiAnZGF0YUZvcm1hdCcsXG4gICAgICAgICd0eXBlJzogJ3N0cmluZycsXG4gICAgICAgICdub3RTdXBwb3J0ZWQnOiB0cnVlXG4gICAgICB9LFxuICAgICAge1xuICAgICAgICAndGZOYW1lJzogJ2tzaXplJyxcbiAgICAgICAgJ25hbWUnOiAna2VybmVsU2l6ZScsXG4gICAgICAgICd0eXBlJzogJ251bWJlcltdJ1xuICAgICAgfSxcbiAgICAgIHtcbiAgICAgICAgJ3RmTmFtZSc6ICdleHBsaWNpdF9wYWRkaW5ncycsXG4gICAgICAgICduYW1lJzogJ2V4cGxpY2l0UGFkZGluZ3MnLFxuICAgICAgICAndHlwZSc6ICdudW1iZXJbXScsXG4gICAgICAgICdkZWZhdWx0VmFsdWUnOiBbXSxcbiAgICAgICAgJ25vdFN1cHBvcnRlZCc6IHRydWVcbiAgICAgIH0sXG4gICAgICB7XG4gICAgICAgICd0Zk5hbWUnOiAnVCcsXG4gICAgICAgICduYW1lJzogJ2R0eXBlJyxcbiAgICAgICAgJ3R5cGUnOiAnZHR5cGUnLFxuICAgICAgICAnbm90U3VwcG9ydGVkJzogdHJ1ZVxuICAgICAgfVxuICAgIF1cbiAgfSxcbiAge1xuICAgICd0Zk9wTmFtZSc6ICdNYXhQb29sV2l0aEFyZ21heCcsXG4gICAgJ2NhdGVnb3J5JzogJ2NvbnZvbHV0aW9uJyxcbiAgICAnaW5wdXRzJzogW1xuICAgICAge1xuICAgICAgICAnc3RhcnQnOiAwLFxuICAgICAgICAnbmFtZSc6ICd4JyxcbiAgICAgICAgJ3R5cGUnOiAndGVuc29yJ1xuICAgICAgfVxuICAgIF0sXG4gICAgJ2F0dHJzJzogW1xuICAgICAge1xuICAgICAgICAndGZOYW1lJzogJ3N0cmlkZXMnLFxuICAgICAgICAnbmFtZSc6ICdzdHJpZGVzJyxcbiAgICAgICAgJ3R5cGUnOiAnbnVtYmVyW10nXG4gICAgICB9LFxuICAgICAge1xuICAgICAgICAndGZOYW1lJzogJ3BhZGRpbmcnLFxuICAgICAgICAnbmFtZSc6ICdwYWQnLFxuICAgICAgICAndHlwZSc6ICdzdHJpbmcnXG4gICAgICB9LFxuICAgICAge1xuICAgICAgICAndGZOYW1lJzogJ2tzaXplJyxcbiAgICAgICAgJ25hbWUnOiAna2VybmVsU2l6ZScsXG4gICAgICAgICd0eXBlJzogJ251bWJlcltdJ1xuICAgICAgfSxcbiAgICAgIHtcbiAgICAgICAgJ3RmTmFtZSc6ICdpbmNsdWRlX2JhdGNoX2luX2luZGV4JyxcbiAgICAgICAgJ25hbWUnOiAnaW5jbHVkZUJhdGNoSW5JbmRleCcsXG4gICAgICAgICd0eXBlJzogJ2Jvb2wnXG4gICAgICB9LFxuICAgICAge1xuICAgICAgICAndGZOYW1lJzogJ1QnLFxuICAgICAgICAnbmFtZSc6ICdkdHlwZScsXG4gICAgICAgICd0eXBlJzogJ2R0eXBlJyxcbiAgICAgICAgJ25vdFN1cHBvcnRlZCc6IHRydWVcbiAgICAgIH1cbiAgICBdXG4gIH0sXG4gIHtcbiAgICAndGZPcE5hbWUnOiAnQXZnUG9vbDNEJyxcbiAgICAnY2F0ZWdvcnknOiAnY29udm9sdXRpb24nLFxuICAgICdpbnB1dHMnOiBbXG4gICAgICB7XG4gICAgICAgICdzdGFydCc6IDAsXG4gICAgICAgICduYW1lJzogJ3gnLFxuICAgICAgICAndHlwZSc6ICd0ZW5zb3InXG4gICAgICB9XG4gICAgXSxcbiAgICAnYXR0cnMnOiBbXG4gICAgICB7XG4gICAgICAgICd0Zk5hbWUnOiAnc3RyaWRlcycsXG4gICAgICAgICduYW1lJzogJ3N0cmlkZXMnLFxuICAgICAgICAndHlwZSc6ICdudW1iZXJbXSdcbiAgICAgIH0sXG4gICAgICB7XG4gICAgICAgICd0Zk5hbWUnOiAncGFkZGluZycsXG4gICAgICAgICduYW1lJzogJ3BhZCcsXG4gICAgICAgICd0eXBlJzogJ3N0cmluZydcbiAgICAgIH0sXG4gICAgICB7XG4gICAgICAgICd0Zk5hbWUnOiAnZGF0YV9mb3JtYXQnLFxuICAgICAgICAnbmFtZSc6ICdkYXRhRm9ybWF0JyxcbiAgICAgICAgJ3R5cGUnOiAnc3RyaW5nJyxcbiAgICAgICAgJ25vdFN1cHBvcnRlZCc6IHRydWVcbiAgICAgIH0sXG4gICAgICB7XG4gICAgICAgICd0Zk5hbWUnOiAna3NpemUnLFxuICAgICAgICAnbmFtZSc6ICdrZXJuZWxTaXplJyxcbiAgICAgICAgJ3R5cGUnOiAnbnVtYmVyW10nXG4gICAgICB9LFxuICAgICAge1xuICAgICAgICAndGZOYW1lJzogJ1QnLFxuICAgICAgICAnbmFtZSc6ICdkdHlwZScsXG4gICAgICAgICd0eXBlJzogJ2R0eXBlJyxcbiAgICAgICAgJ25vdFN1cHBvcnRlZCc6IHRydWVcbiAgICAgIH1cbiAgICBdXG4gIH0sXG4gIHtcbiAgICAndGZPcE5hbWUnOiAnTWF4UG9vbDNEJyxcbiAgICAnY2F0ZWdvcnknOiAnY29udm9sdXRpb24nLFxuICAgICdpbnB1dHMnOiBbXG4gICAgICB7XG4gICAgICAgICdzdGFydCc6IDAsXG4gICAgICAgICduYW1lJzogJ3gnLFxuICAgICAgICAndHlwZSc6ICd0ZW5zb3InXG4gICAgICB9XG4gICAgXSxcbiAgICAnYXR0cnMnOiBbXG4gICAgICB7XG4gICAgICAgICd0Zk5hbWUnOiAnc3RyaWRlcycsXG4gICAgICAgICduYW1lJzogJ3N0cmlkZXMnLFxuICAgICAgICAndHlwZSc6ICdudW1iZXJbXSdcbiAgICAgIH0sXG4gICAgICB7XG4gICAgICAgICd0Zk5hbWUnOiAncGFkZGluZycsXG4gICAgICAgICduYW1lJzogJ3BhZCcsXG4gICAgICAgICd0eXBlJzogJ3N0cmluZydcbiAgICAgIH0sXG4gICAgICB7XG4gICAgICAgICd0Zk5hbWUnOiAnZGF0YV9mb3JtYXQnLFxuICAgICAgICAnbmFtZSc6ICdkYXRhRm9ybWF0JyxcbiAgICAgICAgJ3R5cGUnOiAnc3RyaW5nJyxcbiAgICAgICAgJ25vdFN1cHBvcnRlZCc6IHRydWVcbiAgICAgIH0sXG4gICAgICB7XG4gICAgICAgICd0Zk5hbWUnOiAna3NpemUnLFxuICAgICAgICAnbmFtZSc6ICdrZXJuZWxTaXplJyxcbiAgICAgICAgJ3R5cGUnOiAnbnVtYmVyW10nXG4gICAgICB9LFxuICAgICAge1xuICAgICAgICAndGZOYW1lJzogJ1QnLFxuICAgICAgICAnbmFtZSc6ICdkdHlwZScsXG4gICAgICAgICd0eXBlJzogJ2R0eXBlJyxcbiAgICAgICAgJ25vdFN1cHBvcnRlZCc6IHRydWVcbiAgICAgIH1cbiAgICBdXG4gIH0sXG4gIHtcbiAgICAndGZPcE5hbWUnOiAnQ29udjFEJyxcbiAgICAnY2F0ZWdvcnknOiAnY29udm9sdXRpb24nLFxuICAgICdpbnB1dHMnOiBbXG4gICAgICB7XG4gICAgICAgICdzdGFydCc6IDAsXG4gICAgICAgICduYW1lJzogJ3gnLFxuICAgICAgICAndHlwZSc6ICd0ZW5zb3InXG4gICAgICB9LFxuICAgICAge1xuICAgICAgICAnc3RhcnQnOiAxLFxuICAgICAgICAnbmFtZSc6ICdmaWx0ZXInLFxuICAgICAgICAndHlwZSc6ICd0ZW5zb3InXG4gICAgICB9XG4gICAgXSxcbiAgICAnYXR0cnMnOiBbXG4gICAgICB7XG4gICAgICAgICd0Zk5hbWUnOiAnc3RyaWRlJyxcbiAgICAgICAgJ25hbWUnOiAnc3RyaWRlJyxcbiAgICAgICAgJ3R5cGUnOiAnbnVtYmVyJ1xuICAgICAgfSxcbiAgICAgIHtcbiAgICAgICAgJ3RmTmFtZSc6ICdwYWRkaW5nJyxcbiAgICAgICAgJ25hbWUnOiAncGFkJyxcbiAgICAgICAgJ3R5cGUnOiAnc3RyaW5nJ1xuICAgICAgfSxcbiAgICAgIHtcbiAgICAgICAgJ3RmTmFtZSc6ICdkYXRhX2Zvcm1hdCcsXG4gICAgICAgICduYW1lJzogJ2RhdGFGb3JtYXQnLFxuICAgICAgICAndHlwZSc6ICdzdHJpbmcnLFxuICAgICAgICAnZGVmYXVsdFZhbHVlJzogJ05XQydcbiAgICAgIH0sXG4gICAgICB7XG4gICAgICAgICd0Zk5hbWUnOiAnVCcsXG4gICAgICAgICduYW1lJzogJ2R0eXBlJyxcbiAgICAgICAgJ3R5cGUnOiAnZHR5cGUnLFxuICAgICAgICAnbm90U3VwcG9ydGVkJzogdHJ1ZVxuICAgICAgfSxcbiAgICAgIHtcbiAgICAgICAgJ3RmTmFtZSc6ICdkaWxhdGlvbicsXG4gICAgICAgICduYW1lJzogJ2RpbGF0aW9uJyxcbiAgICAgICAgJ3R5cGUnOiAnbnVtYmVyJyxcbiAgICAgICAgJ2RlZmF1bHRWYWx1ZSc6IDFcbiAgICAgIH1cbiAgICBdXG4gIH0sXG4gIHtcbiAgICAndGZPcE5hbWUnOiAnQ29udjJEJyxcbiAgICAnY2F0ZWdvcnknOiAnY29udm9sdXRpb24nLFxuICAgICdpbnB1dHMnOiBbXG4gICAgICB7XG4gICAgICAgICdzdGFydCc6IDAsXG4gICAgICAgICduYW1lJzogJ3gnLFxuICAgICAgICAndHlwZSc6ICd0ZW5zb3InXG4gICAgICB9LFxuICAgICAge1xuICAgICAgICAnc3RhcnQnOiAxLFxuICAgICAgICAnbmFtZSc6ICdmaWx0ZXInLFxuICAgICAgICAndHlwZSc6ICd0ZW5zb3InXG4gICAgICB9XG4gICAgXSxcbiAgICAnYXR0cnMnOiBbXG4gICAgICB7XG4gICAgICAgICd0Zk5hbWUnOiAnVCcsXG4gICAgICAgICduYW1lJzogJ2R0eXBlJyxcbiAgICAgICAgJ3R5cGUnOiAnZHR5cGUnLFxuICAgICAgICAnbm90U3VwcG9ydGVkJzogdHJ1ZVxuICAgICAgfSxcbiAgICAgIHtcbiAgICAgICAgJ3RmTmFtZSc6ICdzdHJpZGVzJyxcbiAgICAgICAgJ25hbWUnOiAnc3RyaWRlcycsXG4gICAgICAgICd0eXBlJzogJ251bWJlcltdJ1xuICAgICAgfSxcbiAgICAgIHtcbiAgICAgICAgJ3RmTmFtZSc6ICdwYWRkaW5nJyxcbiAgICAgICAgJ25hbWUnOiAncGFkJyxcbiAgICAgICAgJ3R5cGUnOiAnc3RyaW5nJ1xuICAgICAgfSxcbiAgICAgIHtcbiAgICAgICAgJ3RmTmFtZSc6ICd1c2VDdWRubk9uR3B1JyxcbiAgICAgICAgJ25hbWUnOiAndXNlQ3Vkbm5PbkdwdScsXG4gICAgICAgICd0eXBlJzogJ2Jvb2wnXG4gICAgICB9LFxuICAgICAge1xuICAgICAgICAndGZOYW1lJzogJ2RhdGFfZm9ybWF0JyxcbiAgICAgICAgJ25hbWUnOiAnZGF0YUZvcm1hdCcsXG4gICAgICAgICd0eXBlJzogJ3N0cmluZycsXG4gICAgICAgICdkZWZhdWx0VmFsdWUnOiAnTkhXQydcbiAgICAgIH0sXG4gICAgICB7XG4gICAgICAgICd0Zk5hbWUnOiAnZXhwbGljaXRfcGFkZGluZ3MnLFxuICAgICAgICAnbmFtZSc6ICdleHBsaWNpdFBhZGRpbmdzJyxcbiAgICAgICAgJ3R5cGUnOiAnbnVtYmVyW10nLFxuICAgICAgICAnZGVmYXVsdFZhbHVlJzogW11cbiAgICAgIH0sXG4gICAgICB7XG4gICAgICAgICd0Zk5hbWUnOiAnZGlsYXRpb25zJyxcbiAgICAgICAgJ25hbWUnOiAnZGlsYXRpb25zJyxcbiAgICAgICAgJ3R5cGUnOiAnbnVtYmVyW10nXG4gICAgICB9XG4gICAgXVxuICB9LFxuICB7XG4gICAgJ3RmT3BOYW1lJzogJ19GdXNlZENvbnYyRCcsXG4gICAgJ2NhdGVnb3J5JzogJ2NvbnZvbHV0aW9uJyxcbiAgICAnaW5wdXRzJzogW1xuICAgICAge1xuICAgICAgICAnc3RhcnQnOiAwLFxuICAgICAgICAnbmFtZSc6ICd4JyxcbiAgICAgICAgJ3R5cGUnOiAndGVuc29yJ1xuICAgICAgfSxcbiAgICAgIHtcbiAgICAgICAgJ3N0YXJ0JzogMSxcbiAgICAgICAgJ25hbWUnOiAnZmlsdGVyJyxcbiAgICAgICAgJ3R5cGUnOiAndGVuc29yJ1xuICAgICAgfSxcbiAgICAgIHtcbiAgICAgICAgJ3N0YXJ0JzogMixcbiAgICAgICAgJ2VuZCc6IDAsXG4gICAgICAgICduYW1lJzogJ2FyZ3MnLFxuICAgICAgICAndHlwZSc6ICd0ZW5zb3JzJ1xuICAgICAgfVxuICAgIF0sXG4gICAgJ2F0dHJzJzogW1xuICAgICAge1xuICAgICAgICAndGZOYW1lJzogJ251bV9hcmdzJyxcbiAgICAgICAgJ25hbWUnOiAnbnVtQXJncycsXG4gICAgICAgICd0eXBlJzogJ251bWJlcidcbiAgICAgIH0sXG4gICAgICB7XG4gICAgICAgICd0Zk5hbWUnOiAnVCcsXG4gICAgICAgICduYW1lJzogJ2R0eXBlJyxcbiAgICAgICAgJ3R5cGUnOiAnZHR5cGUnLFxuICAgICAgICAnbm90U3VwcG9ydGVkJzogdHJ1ZVxuICAgICAgfSxcbiAgICAgIHtcbiAgICAgICAgJ3RmTmFtZSc6ICdzdHJpZGVzJyxcbiAgICAgICAgJ25hbWUnOiAnc3RyaWRlcycsXG4gICAgICAgICd0eXBlJzogJ251bWJlcltdJ1xuICAgICAgfSxcbiAgICAgIHtcbiAgICAgICAgJ3RmTmFtZSc6ICdwYWRkaW5nJyxcbiAgICAgICAgJ25hbWUnOiAncGFkJyxcbiAgICAgICAgJ3R5cGUnOiAnc3RyaW5nJ1xuICAgICAgfSxcbiAgICAgIHtcbiAgICAgICAgJ3RmTmFtZSc6ICdleHBsaWNpdF9wYWRkaW5ncycsXG4gICAgICAgICduYW1lJzogJ2V4cGxpY2l0UGFkZGluZ3MnLFxuICAgICAgICAndHlwZSc6ICdudW1iZXJbXScsXG4gICAgICAgICdkZWZhdWx0VmFsdWUnOiBbXVxuICAgICAgfSxcbiAgICAgIHtcbiAgICAgICAgJ3RmTmFtZSc6ICd1c2VfY3Vkbm5fb25fZ3B1JyxcbiAgICAgICAgJ25hbWUnOiAndXNlQ3Vkbm5PbkdwdScsXG4gICAgICAgICd0eXBlJzogJ2Jvb2wnLFxuICAgICAgICAnZGVmYXVsdFZhbHVlJzogdHJ1ZVxuICAgICAgfSxcbiAgICAgIHtcbiAgICAgICAgJ3RmTmFtZSc6ICdkYXRhX2Zvcm1hdCcsXG4gICAgICAgICduYW1lJzogJ2RhdGFGb3JtYXQnLFxuICAgICAgICAndHlwZSc6ICdzdHJpbmcnLFxuICAgICAgICAnZGVmYXVsdFZhbHVlJzogJ05IV0MnXG4gICAgICB9LFxuICAgICAge1xuICAgICAgICAndGZOYW1lJzogJ2RpbGF0aW9ucycsXG4gICAgICAgICduYW1lJzogJ2RpbGF0aW9ucycsXG4gICAgICAgICd0eXBlJzogJ251bWJlcltdJyxcbiAgICAgICAgJ2RlZmF1bHRWYWx1ZSc6IFtcbiAgICAgICAgICAxLFxuICAgICAgICAgIDEsXG4gICAgICAgICAgMSxcbiAgICAgICAgICAxXG4gICAgICAgIF1cbiAgICAgIH0sXG4gICAgICB7XG4gICAgICAgICd0Zk5hbWUnOiAnZnVzZWRfb3BzJyxcbiAgICAgICAgJ25hbWUnOiAnZnVzZWRPcHMnLFxuICAgICAgICAndHlwZSc6ICdzdHJpbmdbXScsXG4gICAgICAgICdkZWZhdWx0VmFsdWUnOiBbXVxuICAgICAgfSxcbiAgICAgIHtcbiAgICAgICAgJ3RmTmFtZSc6ICdlcHNpbG9uJyxcbiAgICAgICAgJ25hbWUnOiAnZXBzaWxvbicsXG4gICAgICAgICd0eXBlJzogJ251bWJlcicsXG4gICAgICAgICdkZWZhdWx0VmFsdWUnOiAwLjAwMDFcbiAgICAgIH0sXG4gICAgICB7XG4gICAgICAgICd0Zk5hbWUnOiAnbGVha3lyZWx1X2FscGhhJyxcbiAgICAgICAgJ25hbWUnOiAnbGVha3lyZWx1QWxwaGEnLFxuICAgICAgICAndHlwZSc6ICdudW1iZXInLFxuICAgICAgICAnZGVmYXVsdFZhbHVlJzogMC4yXG4gICAgICB9XG4gICAgXVxuICB9LFxuICB7XG4gICAgJ3RmT3BOYW1lJzogJ0NvbnYyREJhY2twcm9wSW5wdXQnLFxuICAgICdjYXRlZ29yeSc6ICdjb252b2x1dGlvbicsXG4gICAgJ2lucHV0cyc6IFtcbiAgICAgIHtcbiAgICAgICAgJ3N0YXJ0JzogMixcbiAgICAgICAgJ25hbWUnOiAneCcsXG4gICAgICAgICd0eXBlJzogJ3RlbnNvcidcbiAgICAgIH0sXG4gICAgICB7XG4gICAgICAgICdzdGFydCc6IDEsXG4gICAgICAgICduYW1lJzogJ2ZpbHRlcicsXG4gICAgICAgICd0eXBlJzogJ3RlbnNvcidcbiAgICAgIH0sXG4gICAgICB7XG4gICAgICAgICdzdGFydCc6IDAsXG4gICAgICAgICduYW1lJzogJ291dHB1dFNoYXBlJyxcbiAgICAgICAgJ3R5cGUnOiAnbnVtYmVyW10nXG4gICAgICB9XG4gICAgXSxcbiAgICAnYXR0cnMnOiBbXG4gICAgICB7XG4gICAgICAgICd0Zk5hbWUnOiAnc3RyaWRlcycsXG4gICAgICAgICduYW1lJzogJ3N0cmlkZXMnLFxuICAgICAgICAndHlwZSc6ICdudW1iZXJbXSdcbiAgICAgIH0sXG4gICAgICB7XG4gICAgICAgICd0Zk5hbWUnOiAncGFkZGluZycsXG4gICAgICAgICduYW1lJzogJ3BhZCcsXG4gICAgICAgICd0eXBlJzogJ3N0cmluZydcbiAgICAgIH0sXG4gICAgICB7XG4gICAgICAgICd0Zk5hbWUnOiAnZGF0YV9mb3JtYXQnLFxuICAgICAgICAnbmFtZSc6ICdkYXRhRm9ybWF0JyxcbiAgICAgICAgJ3R5cGUnOiAnc3RyaW5nJyxcbiAgICAgICAgJ25vdFN1cHBvcnRlZCc6IHRydWVcbiAgICAgIH0sXG4gICAgICB7XG4gICAgICAgICd0Zk5hbWUnOiAnZXhwbGljaXRfcGFkZGluZ3MnLFxuICAgICAgICAnbmFtZSc6ICdleHBsaWNpdFBhZGRpbmdzJyxcbiAgICAgICAgJ3R5cGUnOiAnbnVtYmVyW10nLFxuICAgICAgICAnZGVmYXVsdFZhbHVlJzogW11cbiAgICAgIH0sXG4gICAgICB7XG4gICAgICAgICd0Zk5hbWUnOiAnZGlsYXRpb25zJyxcbiAgICAgICAgJ25hbWUnOiAnZGlsYXRpb25zJyxcbiAgICAgICAgJ3R5cGUnOiAnbnVtYmVyW10nLFxuICAgICAgICAnbm90U3VwcG9ydGVkJzogdHJ1ZVxuICAgICAgfVxuICAgIF1cbiAgfSxcbiAge1xuICAgICd0Zk9wTmFtZSc6ICdEZXB0aHdpc2VDb252MmQnLFxuICAgICdjYXRlZ29yeSc6ICdjb252b2x1dGlvbicsXG4gICAgJ2lucHV0cyc6IFtcbiAgICAgIHtcbiAgICAgICAgJ3N0YXJ0JzogMCxcbiAgICAgICAgJ25hbWUnOiAnaW5wdXQnLFxuICAgICAgICAndHlwZSc6ICd0ZW5zb3InXG4gICAgICB9LFxuICAgICAge1xuICAgICAgICAnc3RhcnQnOiAxLFxuICAgICAgICAnbmFtZSc6ICdmaWx0ZXInLFxuICAgICAgICAndHlwZSc6ICd0ZW5zb3InXG4gICAgICB9XG4gICAgXSxcbiAgICAnYXR0cnMnOiBbXG4gICAgICB7XG4gICAgICAgICd0Zk5hbWUnOiAnc3RyaWRlcycsXG4gICAgICAgICduYW1lJzogJ3N0cmlkZXMnLFxuICAgICAgICAndHlwZSc6ICdudW1iZXJbXSdcbiAgICAgIH0sXG4gICAgICB7XG4gICAgICAgICd0Zk5hbWUnOiAncGFkZGluZycsXG4gICAgICAgICduYW1lJzogJ3BhZCcsXG4gICAgICAgICd0eXBlJzogJ3N0cmluZydcbiAgICAgIH0sXG4gICAgICB7XG4gICAgICAgICd0Zk5hbWUnOiAnZGF0YV9mb3JtYXQnLFxuICAgICAgICAnbmFtZSc6ICdkYXRhRm9ybWF0JyxcbiAgICAgICAgJ3R5cGUnOiAnc3RyaW5nJyxcbiAgICAgICAgJ2RlZmF1bHRWYWx1ZSc6ICdOSFdDJ1xuICAgICAgfSxcbiAgICAgIHtcbiAgICAgICAgJ3RmTmFtZSc6ICdleHBsaWNpdF9wYWRkaW5ncycsXG4gICAgICAgICduYW1lJzogJ2V4cGxpY2l0UGFkZGluZ3MnLFxuICAgICAgICAndHlwZSc6ICdudW1iZXJbXScsXG4gICAgICAgICdkZWZhdWx0VmFsdWUnOiBbXVxuICAgICAgfSxcbiAgICAgIHtcbiAgICAgICAgJ3RmTmFtZSc6ICdkaWxhdGlvbnMnLFxuICAgICAgICAnbmFtZSc6ICdkaWxhdGlvbnMnLFxuICAgICAgICAndHlwZSc6ICdudW1iZXJbXSdcbiAgICAgIH1cbiAgICBdXG4gIH0sXG4gIHtcbiAgICAndGZPcE5hbWUnOiAnRGVwdGh3aXNlQ29udjJkTmF0aXZlJyxcbiAgICAnY2F0ZWdvcnknOiAnY29udm9sdXRpb24nLFxuICAgICdpbnB1dHMnOiBbXG4gICAgICB7XG4gICAgICAgICdzdGFydCc6IDAsXG4gICAgICAgICduYW1lJzogJ2lucHV0JyxcbiAgICAgICAgJ3R5cGUnOiAndGVuc29yJ1xuICAgICAgfSxcbiAgICAgIHtcbiAgICAgICAgJ3N0YXJ0JzogMSxcbiAgICAgICAgJ25hbWUnOiAnZmlsdGVyJyxcbiAgICAgICAgJ3R5cGUnOiAndGVuc29yJ1xuICAgICAgfVxuICAgIF0sXG4gICAgJ2F0dHJzJzogW1xuICAgICAge1xuICAgICAgICAndGZOYW1lJzogJ3N0cmlkZXMnLFxuICAgICAgICAnbmFtZSc6ICdzdHJpZGVzJyxcbiAgICAgICAgJ3R5cGUnOiAnbnVtYmVyW10nXG4gICAgICB9LFxuICAgICAge1xuICAgICAgICAndGZOYW1lJzogJ3BhZGRpbmcnLFxuICAgICAgICAnbmFtZSc6ICdwYWQnLFxuICAgICAgICAndHlwZSc6ICdzdHJpbmcnXG4gICAgICB9LFxuICAgICAge1xuICAgICAgICAndGZOYW1lJzogJ2RhdGFfZm9ybWF0JyxcbiAgICAgICAgJ25hbWUnOiAnZGF0YUZvcm1hdCcsXG4gICAgICAgICd0eXBlJzogJ3N0cmluZycsXG4gICAgICAgICdkZWZhdWx0VmFsdWUnOiAnTkhXQydcbiAgICAgIH0sXG4gICAgICB7XG4gICAgICAgICd0Zk5hbWUnOiAnZXhwbGljaXRfcGFkZGluZ3MnLFxuICAgICAgICAnbmFtZSc6ICdleHBsaWNpdFBhZGRpbmdzJyxcbiAgICAgICAgJ3R5cGUnOiAnbnVtYmVyW10nLFxuICAgICAgICAnZGVmYXVsdFZhbHVlJzogW11cbiAgICAgIH0sXG4gICAgICB7XG4gICAgICAgICd0Zk5hbWUnOiAnZGlsYXRpb25zJyxcbiAgICAgICAgJ25hbWUnOiAnZGlsYXRpb25zJyxcbiAgICAgICAgJ3R5cGUnOiAnbnVtYmVyW10nXG4gICAgICB9XG4gICAgXVxuICB9LFxuICB7XG4gICAgJ3RmT3BOYW1lJzogJ0Z1c2VkRGVwdGh3aXNlQ29udjJkTmF0aXZlJyxcbiAgICAnY2F0ZWdvcnknOiAnY29udm9sdXRpb24nLFxuICAgICdpbnB1dHMnOiBbXG4gICAgICB7XG4gICAgICAgICdzdGFydCc6IDAsXG4gICAgICAgICduYW1lJzogJ3gnLFxuICAgICAgICAndHlwZSc6ICd0ZW5zb3InXG4gICAgICB9LFxuICAgICAge1xuICAgICAgICAnc3RhcnQnOiAxLFxuICAgICAgICAnbmFtZSc6ICdmaWx0ZXInLFxuICAgICAgICAndHlwZSc6ICd0ZW5zb3InXG4gICAgICB9LFxuICAgICAge1xuICAgICAgICAnc3RhcnQnOiAyLFxuICAgICAgICAnZW5kJzogMCxcbiAgICAgICAgJ25hbWUnOiAnYXJncycsXG4gICAgICAgICd0eXBlJzogJ3RlbnNvcnMnXG4gICAgICB9XG4gICAgXSxcbiAgICAnYXR0cnMnOiBbXG4gICAgICB7XG4gICAgICAgICd0Zk5hbWUnOiAnbnVtX2FyZ3MnLFxuICAgICAgICAnbmFtZSc6ICdudW1BcmdzJyxcbiAgICAgICAgJ3R5cGUnOiAnbnVtYmVyJ1xuICAgICAgfSxcbiAgICAgIHtcbiAgICAgICAgJ3RmTmFtZSc6ICdUJyxcbiAgICAgICAgJ25hbWUnOiAnZHR5cGUnLFxuICAgICAgICAndHlwZSc6ICdkdHlwZScsXG4gICAgICAgICdub3RTdXBwb3J0ZWQnOiB0cnVlXG4gICAgICB9LFxuICAgICAge1xuICAgICAgICAndGZOYW1lJzogJ3N0cmlkZXMnLFxuICAgICAgICAnbmFtZSc6ICdzdHJpZGVzJyxcbiAgICAgICAgJ3R5cGUnOiAnbnVtYmVyW10nXG4gICAgICB9LFxuICAgICAge1xuICAgICAgICAndGZOYW1lJzogJ3BhZGRpbmcnLFxuICAgICAgICAnbmFtZSc6ICdwYWQnLFxuICAgICAgICAndHlwZSc6ICdzdHJpbmcnXG4gICAgICB9LFxuICAgICAge1xuICAgICAgICAndGZOYW1lJzogJ2RhdGFfZm9ybWF0JyxcbiAgICAgICAgJ25hbWUnOiAnZGF0YUZvcm1hdCcsXG4gICAgICAgICd0eXBlJzogJ3N0cmluZycsXG4gICAgICAgICdkZWZhdWx0VmFsdWUnOiAnTkhXQydcbiAgICAgIH0sXG4gICAgICB7XG4gICAgICAgICd0Zk5hbWUnOiAnZGlsYXRpb25zJyxcbiAgICAgICAgJ25hbWUnOiAnZGlsYXRpb25zJyxcbiAgICAgICAgJ3R5cGUnOiAnbnVtYmVyW10nLFxuICAgICAgICAnZGVmYXVsdFZhbHVlJzogW1xuICAgICAgICAgIDEsXG4gICAgICAgICAgMSxcbiAgICAgICAgICAxLFxuICAgICAgICAgIDFcbiAgICAgICAgXVxuICAgICAgfSxcbiAgICAgIHtcbiAgICAgICAgJ3RmTmFtZSc6ICdmdXNlZF9vcHMnLFxuICAgICAgICAnbmFtZSc6ICdmdXNlZE9wcycsXG4gICAgICAgICd0eXBlJzogJ3N0cmluZ1tdJyxcbiAgICAgICAgJ2RlZmF1bHRWYWx1ZSc6IFtdXG4gICAgICB9LFxuICAgICAge1xuICAgICAgICAndGZOYW1lJzogJ2V4cGxpY2l0X3BhZGRpbmdzJyxcbiAgICAgICAgJ25hbWUnOiAnZXhwbGljaXRQYWRkaW5ncycsXG4gICAgICAgICd0eXBlJzogJ251bWJlcltdJyxcbiAgICAgICAgJ2RlZmF1bHRWYWx1ZSc6IFtdXG4gICAgICB9XG4gICAgXVxuICB9LFxuICB7XG4gICAgJ3RmT3BOYW1lJzogJ0NvbnYzRCcsXG4gICAgJ2NhdGVnb3J5JzogJ2NvbnZvbHV0aW9uJyxcbiAgICAnaW5wdXRzJzogW1xuICAgICAge1xuICAgICAgICAnc3RhcnQnOiAwLFxuICAgICAgICAnbmFtZSc6ICd4JyxcbiAgICAgICAgJ3R5cGUnOiAndGVuc29yJ1xuICAgICAgfSxcbiAgICAgIHtcbiAgICAgICAgJ3N0YXJ0JzogMSxcbiAgICAgICAgJ25hbWUnOiAnZmlsdGVyJyxcbiAgICAgICAgJ3R5cGUnOiAndGVuc29yJ1xuICAgICAgfVxuICAgIF0sXG4gICAgJ2F0dHJzJzogW1xuICAgICAge1xuICAgICAgICAndGZOYW1lJzogJ3N0cmlkZXMnLFxuICAgICAgICAnbmFtZSc6ICdzdHJpZGVzJyxcbiAgICAgICAgJ3R5cGUnOiAnbnVtYmVyW10nXG4gICAgICB9LFxuICAgICAge1xuICAgICAgICAndGZOYW1lJzogJ3BhZGRpbmcnLFxuICAgICAgICAnbmFtZSc6ICdwYWQnLFxuICAgICAgICAndHlwZSc6ICdzdHJpbmcnXG4gICAgICB9LFxuICAgICAge1xuICAgICAgICAndGZOYW1lJzogJ2RhdGFfZm9ybWF0JyxcbiAgICAgICAgJ25hbWUnOiAnZGF0YUZvcm1hdCcsXG4gICAgICAgICd0eXBlJzogJ3N0cmluZycsXG4gICAgICAgICdkZWZhdWx0VmFsdWUnOiAnTkhXQydcbiAgICAgIH0sXG4gICAgICB7XG4gICAgICAgICd0Zk5hbWUnOiAnZGlsYXRpb25zJyxcbiAgICAgICAgJ25hbWUnOiAnZGlsYXRpb25zJyxcbiAgICAgICAgJ3R5cGUnOiAnbnVtYmVyW10nXG4gICAgICB9XG4gICAgXVxuICB9LFxuICB7XG4gICAgJ3RmT3BOYW1lJzogJ0RpbGF0aW9uMkQnLFxuICAgICdjYXRlZ29yeSc6ICdjb252b2x1dGlvbicsXG4gICAgJ2lucHV0cyc6IFtcbiAgICAgIHtcbiAgICAgICAgJ3N0YXJ0JzogMCxcbiAgICAgICAgJ25hbWUnOiAneCcsXG4gICAgICAgICd0eXBlJzogJ3RlbnNvcidcbiAgICAgIH0sXG4gICAgICB7XG4gICAgICAgICdzdGFydCc6IDEsXG4gICAgICAgICduYW1lJzogJ2ZpbHRlcicsXG4gICAgICAgICd0eXBlJzogJ3RlbnNvcidcbiAgICAgIH1cbiAgICBdLFxuICAgICdhdHRycyc6IFtcbiAgICAgIHtcbiAgICAgICAgJ3RmTmFtZSc6ICdzdHJpZGVzJyxcbiAgICAgICAgJ25hbWUnOiAnc3RyaWRlcycsXG4gICAgICAgICd0eXBlJzogJ251bWJlcltdJ1xuICAgICAgfSxcbiAgICAgIHtcbiAgICAgICAgJ3RmTmFtZSc6ICdyYXRlcycsXG4gICAgICAgICduYW1lJzogJ2RpbGF0aW9ucycsXG4gICAgICAgICd0eXBlJzogJ251bWJlcltdJ1xuICAgICAgfSxcbiAgICAgIHtcbiAgICAgICAgJ3RmTmFtZSc6ICdwYWRkaW5nJyxcbiAgICAgICAgJ25hbWUnOiAncGFkJyxcbiAgICAgICAgJ3R5cGUnOiAnc3RyaW5nJ1xuICAgICAgfVxuICAgIF1cbiAgfVxuXVxuO1xuIl19","/**\n * @license\n * Copyright 2022 Google LLC. All Rights Reserved.\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n * =============================================================================\n */\nexport const json = [\n {\n 'tfOpName': 'Fill',\n 'category': 'creation',\n 'inputs': [\n {\n 'start': 0,\n 'name': 'shape',\n 'type': 'number[]'\n },\n {\n 'start': 1,\n 'name': 'value',\n 'type': 'number'\n }\n ],\n 'attrs': [\n {\n 'tfName': 'T',\n 'name': 'dtype',\n 'type': 'dtype'\n }\n ]\n },\n {\n 'tfOpName': 'LinSpace',\n 'category': 'creation',\n 'inputs': [\n {\n 'start': 0,\n 'name': 'start',\n 'type': 'number'\n },\n {\n 'start': 1,\n 'name': 'stop',\n 'type': 'number'\n },\n {\n 'start': 2,\n 'name': 'num',\n 'type': 'number'\n }\n ],\n 'attrs': [\n {\n 'tfName': 'T',\n 'name': 'dtype',\n 'type': 'dtype',\n 'notSupported': true\n }\n ]\n },\n {\n 'tfOpName': 'OneHot',\n 'category': 'creation',\n 'inputs': [\n {\n 'start': 0,\n 'name': 'indices',\n 'type': 'tensor'\n },\n {\n 'start': 1,\n 'name': 'depth',\n 'type': 'number'\n },\n {\n 'start': 2,\n 'name': 'onValue',\n 'type': 'number',\n 'defaultValue': 1\n },\n {\n 'start': 3,\n 'name': 'offValue',\n 'type': 'number',\n 'defaultValue': 0\n }\n ],\n 'attrs': [\n {\n 'tfName': 'axis',\n 'name': 'axis',\n 'type': 'number',\n 'notSupported': true\n },\n {\n 'tfName': 'T',\n 'name': 'dtype',\n 'type': 'dtype'\n }\n ]\n },\n {\n 'tfOpName': 'Ones',\n 'category': 'creation',\n 'inputs': [\n {\n 'start': 0,\n 'name': 'shape',\n 'type': 'number[]'\n }\n ],\n 'attrs': [\n {\n 'tfName': 'T',\n 'name': 'dtype',\n 'type': 'dtype'\n }\n ]\n },\n {\n 'tfOpName': 'OnesLike',\n 'category': 'creation',\n 'inputs': [\n {\n 'start': 0,\n 'name': 'x',\n 'type': 'tensor'\n }\n ],\n 'attrs': [\n {\n 'tfName': 'dtype',\n 'name': 'dtype',\n 'type': 'dtype'\n }\n ]\n },\n {\n 'tfOpName': 'RandomStandardNormal',\n 'category': 'creation',\n 'inputs': [\n {\n 'start': 0,\n 'name': 'shape',\n 'type': 'number[]'\n }\n ],\n 'attrs': [\n {\n 'tfName': 'seed',\n 'name': 'seed',\n 'type': 'number',\n 'defaultValue': 0\n },\n {\n 'tfName': 'seed2',\n 'name': 'seed2',\n 'type': 'number',\n 'defaultValue': 0,\n 'notSupported': true\n },\n {\n 'tfName': 'dtype',\n 'name': 'dtype',\n 'type': 'dtype'\n },\n {\n 'tfName': 'T',\n 'name': 'T',\n 'type': 'number',\n 'notSupported': true\n }\n ]\n },\n {\n 'tfOpName': 'RandomUniform',\n 'category': 'creation',\n 'inputs': [\n {\n 'start': 0,\n 'name': 'shape',\n 'type': 'number[]'\n }\n ],\n 'attrs': [\n {\n 'tfName': 'minval',\n 'name': 'minval',\n 'type': 'number',\n 'defaultValue': 0\n },\n {\n 'tfName': 'maxval',\n 'name': 'maxval',\n 'type': 'number',\n 'defaultValue': 1\n },\n {\n 'tfName': 'dtype',\n 'name': 'dtype',\n 'type': 'dtype'\n },\n {\n 'tfName': 'seed',\n 'name': 'seed',\n 'type': 'number',\n 'defaultValue': 0\n },\n {\n 'tfName': 'seed2',\n 'name': 'seed2',\n 'type': 'number',\n 'defaultValue': 0,\n 'notSupported': true\n },\n {\n 'tfName': 'T',\n 'name': 'T',\n 'type': 'number',\n 'notSupported': true\n }\n ]\n },\n {\n 'tfOpName': 'Range',\n 'category': 'creation',\n 'inputs': [\n {\n 'start': 0,\n 'name': 'start',\n 'type': 'number'\n },\n {\n 'start': 1,\n 'name': 'stop',\n 'type': 'number'\n },\n {\n 'start': 2,\n 'name': 'step',\n 'type': 'number',\n 'defaultValue': 0\n }\n ],\n 'attrs': [\n {\n 'tfName': 'Tidx',\n 'name': 'dtype',\n 'type': 'dtype'\n }\n ]\n },\n {\n 'tfOpName': 'TruncatedNormal',\n 'category': 'creation',\n 'inputs': [\n {\n 'start': 0,\n 'name': 'shape',\n 'type': 'number[]'\n }\n ],\n 'attrs': [\n {\n 'tfName': 'means',\n 'name': 'mean',\n 'type': 'number',\n 'defaultValue': 0\n },\n {\n 'tfName': 'stddev',\n 'name': 'stdDev',\n 'type': 'number',\n 'defaultValue': 1\n },\n {\n 'tfName': 'seed',\n 'name': 'seed',\n 'type': 'number'\n },\n {\n 'tfName': 'seed2',\n 'name': 'seed2',\n 'type': 'number',\n 'defaultValue': 0,\n 'notSupported': true\n },\n {\n 'tfName': 'dtype',\n 'name': 'dtype',\n 'type': 'dtype'\n },\n {\n 'tfName': 'T',\n 'name': 'T',\n 'type': 'number',\n 'notSupported': true\n }\n ]\n },\n {\n 'tfOpName': 'Zeros',\n 'category': 'creation',\n 'inputs': [\n {\n 'start': 0,\n 'name': 'shape',\n 'type': 'number[]'\n }\n ],\n 'attrs': [\n {\n 'tfName': 'T',\n 'name': 'dtype',\n 'type': 'dtype'\n }\n ]\n },\n {\n 'tfOpName': 'ZerosLike',\n 'category': 'creation',\n 'inputs': [\n {\n 'start': 0,\n 'name': 'x',\n 'type': 'tensor'\n }\n ],\n 'attrs': [\n {\n 'tfName': 'T',\n 'name': 'dtype',\n 'type': 'dtype'\n }\n ]\n },\n {\n 'tfOpName': 'Multinomial',\n 'category': 'creation',\n 'inputs': [\n {\n 'start': 0,\n 'name': 'logits',\n 'type': 'tensor'\n },\n {\n 'start': 1,\n 'name': 'numSamples',\n 'type': 'number'\n }\n ],\n 'attrs': [\n {\n 'tfName': 'seed',\n 'name': 'seed',\n 'type': 'number'\n },\n {\n 'tfName': 'seed2',\n 'name': 'seed2',\n 'type': 'number'\n },\n {\n 'tfName': 'T',\n 'name': 'dtype',\n 'type': 'dtype'\n },\n {\n 'tfName': 'output_dtype',\n 'name': 'output_dtype',\n 'type': 'dtype'\n }\n ]\n }\n];\n//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY3JlYXRpb24uanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi8uLi8uLi90ZmpzLWNvbnZlcnRlci9zcmMvb3BlcmF0aW9ucy9vcF9saXN0L2NyZWF0aW9uLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUNBOzs7Ozs7Ozs7Ozs7Ozs7R0FlRztBQUlILE1BQU0sQ0FBQyxNQUFNLElBQUksR0FBZTtJQUM5QjtRQUNFLFVBQVUsRUFBRSxNQUFNO1FBQ2xCLFVBQVUsRUFBRSxVQUFVO1FBQ3RCLFFBQVEsRUFBRTtZQUNSO2dCQUNFLE9BQU8sRUFBRSxDQUFDO2dCQUNWLE1BQU0sRUFBRSxPQUFPO2dCQUNmLE1BQU0sRUFBRSxVQUFVO2FBQ25CO1lBQ0Q7Z0JBQ0UsT0FBTyxFQUFFLENBQUM7Z0JBQ1YsTUFBTSxFQUFFLE9BQU87Z0JBQ2YsTUFBTSxFQUFFLFFBQVE7YUFDakI7U0FDRjtRQUNELE9BQU8sRUFBRTtZQUNQO2dCQUNFLFFBQVEsRUFBRSxHQUFHO2dCQUNiLE1BQU0sRUFBRSxPQUFPO2dCQUNmLE1BQU0sRUFBRSxPQUFPO2FBQ2hCO1NBQ0Y7S0FDRjtJQUNEO1FBQ0UsVUFBVSxFQUFFLFVBQVU7UUFDdEIsVUFBVSxFQUFFLFVBQVU7UUFDdEIsUUFBUSxFQUFFO1lBQ1I7Z0JBQ0UsT0FBTyxFQUFFLENBQUM7Z0JBQ1YsTUFBTSxFQUFFLE9BQU87Z0JBQ2YsTUFBTSxFQUFFLFFBQVE7YUFDakI7WUFDRDtnQkFDRSxPQUFPLEVBQUUsQ0FBQztnQkFDVixNQUFNLEVBQUUsTUFBTTtnQkFDZCxNQUFNLEVBQUUsUUFBUTthQUNqQjtZQUNEO2dCQUNFLE9BQU8sRUFBRSxDQUFDO2dCQUNWLE1BQU0sRUFBRSxLQUFLO2dCQUNiLE1BQU0sRUFBRSxRQUFRO2FBQ2pCO1NBQ0Y7UUFDRCxPQUFPLEVBQUU7WUFDUDtnQkFDRSxRQUFRLEVBQUUsR0FBRztnQkFDYixNQUFNLEVBQUUsT0FBTztnQkFDZixNQUFNLEVBQUUsT0FBTztn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QjtZQUNEO2dCQUNFLFFBQVEsRUFBRSxjQUFjO2dCQUN4QixNQUFNLEVBQUUsY0FBYztnQkFDdEIsTUFBTSxFQUFFLE9BQU87YUFDaEI7U0FDRjtLQUNGO0NBQ0YsQ0FDQSIsInNvdXJjZXNDb250ZW50IjpbIlxuLyoqXG4gKiBAbGljZW5zZVxuICogQ29weXJpZ2h0IDIwMjIgR29vZ2xlIExMQy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC5cbiAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSBcIkxpY2Vuc2VcIik7XG4gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuXG4gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXRcbiAqXG4gKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjBcbiAqXG4gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlXG4gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiBcIkFTIElTXCIgQkFTSVMsXG4gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC5cbiAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmRcbiAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLlxuICogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbiAqL1xuXG5pbXBvcnQge09wTWFwcGVyfSBmcm9tICcuLi90eXBlcyc7XG5cbmV4cG9ydCBjb25zdCBqc29uOiBPcE1hcHBlcltdID0gW1xuICB7XG4gICAgJ3RmT3BOYW1lJzogJ0ZpbGwnLFxuICAgICdjYXRlZ29yeSc6ICdjcmVhdGlvbicsXG4gICAgJ2lucHV0cyc6IFtcbiAgICAgIHtcbiAgICAgICAgJ3N0YXJ0JzogMCxcbiAgICAgICAgJ25hbWUnOiAnc2hhcGUnLFxuICAgICAgICAndHlwZSc6ICdudW1iZXJbXSdcbiAgICAgIH0sXG4gICAgICB7XG4gICAgICAgICdzdGFydCc6IDEsXG4gICAgICAgICduYW1lJzogJ3ZhbHVlJyxcbiAgICAgICAgJ3R5cGUnOiAnbnVtYmVyJ1xuICAgICAgfVxuICAgIF0sXG4gICAgJ2F0dHJzJzogW1xuICAgICAge1xuICAgICAgICAndGZOYW1lJzogJ1QnLFxuICAgICAgICAnbmFtZSc6ICdkdHlwZScsXG4gICAgICAgICd0eXBlJzogJ2R0eXBlJ1xuICAgICAgfVxuICAgIF1cbiAgfSxcbiAge1xuICAgICd0Zk9wTmFtZSc6ICdMaW5TcGFjZScsXG4gICAgJ2NhdGVnb3J5JzogJ2NyZWF0aW9uJyxcbiAgICAnaW5wdXRzJzogW1xuICAgICAge1xuICAgICAgICAnc3RhcnQnOiAwLFxuICAgICAgICAnbmFtZSc6ICdzdGFydCcsXG4gICAgICAgICd0eXBlJzogJ251bWJlcidcbiAgICAgIH0sXG4gICAgICB7XG4gICAgICAgICdzdGFydCc6IDEsXG4gICAgICAgICduYW1lJzogJ3N0b3AnLFxuICAgICAgICAndHlwZSc6ICdudW1iZXInXG4gICAgICB9LFxuICAgICAge1xuICAgICAgICAnc3RhcnQnOiAyLFxuICAgICAgICAnbmFtZSc6ICdudW0nLFxuICAgICAgICAndHlwZSc6ICdudW1iZXInXG4gICAgICB9XG4gICAgXSxcbiAgICAnYXR0cnMnOiBbXG4gICAgICB7XG4gICAgICAgICd0Zk5hbWUnOiAnVCcsXG4gICAgICAgICduYW1lJzogJ2R0eXBlJyxcbiAgICAgICAgJ3R5cGUnOiAnZHR5cGUnLFxuICAgICAgICAnbm90U3VwcG9ydGVkJzogdHJ1ZVxuICAgICAgfVxuICAgIF1cbiAgfSxcbiAge1xuICAgICd0Zk9wTmFtZSc6ICdPbmVIb3QnLFxuICAgICdjYXRlZ29yeSc6ICdjcmVhdGlvbicsXG4gICAgJ2lucHV0cyc6IFtcbiAgICAgIHtcbiAgICAgICAgJ3N0YXJ0JzogMCxcbiAgICAgICAgJ25hbWUnOiAnaW5kaWNlcycsXG4gICAgICAgICd0eXBlJzogJ3RlbnNvcidcbiAgICAgIH0sXG4gICAgICB7XG4gICAgICAgICdzdGFydCc6IDEsXG4gICAgICAgICduYW1lJzogJ2RlcHRoJyxcbiAgICAgICAgJ3R5cGUnOiAnbnVtYmVyJ1xuICAgICAgfSxcbiAgICAgIHtcbiAgICAgICAgJ3N0YXJ0JzogMixcbiAgICAgICAgJ25hbWUnOiAnb25WYWx1ZScsXG4gICAgICAgICd0eXBlJzogJ251bWJlcicsXG4gICAgICAgICdkZWZhdWx0VmFsdWUnOiAxXG4gICAgICB9LFxuICAgICAge1xuICAgICAgICAnc3RhcnQnOiAzLFxuICAgICAgICAnbmFtZSc6ICdvZmZWYWx1ZScsXG4gICAgICAgICd0eXBlJzogJ251bWJlcicsXG4gICAgICAgICdkZWZhdWx0VmFsdWUnOiAwXG4gICAgICB9XG4gICAgXSxcbiAgICAnYXR0cnMnOiBbXG4gICAgICB7XG4gICAgICAgICd0Zk5hbWUnOiAnYXhpcycsXG4gICAgICAgICduYW1lJzogJ2F4aXMnLFxuICAgICAgICAndHlwZSc6ICdudW1iZXInLFxuICAgICAgICAnbm90U3VwcG9ydGVkJzogdHJ1ZVxuICAgICAgfSxcbiAgICAgIHtcbiAgICAgICAgJ3RmTmFtZSc6ICdUJyxcbiAgICAgICAgJ25hbWUnOiAnZHR5cGUnLFxuICAgICAgICAndHlwZSc6ICdkdHlwZSdcbiAgICAgIH1cbiAgICBdXG4gIH0sXG4gIHtcbiAgICAndGZPcE5hbWUnOiAnT25lcycsXG4gICAgJ2NhdGVnb3J5JzogJ2NyZWF0aW9uJyxcbiAgICAnaW5wdXRzJzogW1xuICAgICAge1xuICAgICAgICAnc3RhcnQnOiAwLFxuICAgICAgICAnbmFtZSc6ICdzaGFwZScsXG4gICAgICAgICd0eXBlJzogJ251bWJlcltdJ1xuICAgICAgfVxuICAgIF0sXG4gICAgJ2F0dHJzJzogW1xuICAgICAge1xuICAgICAgICAndGZOYW1lJzogJ1QnLFxuICAgICAgICAnbmFtZSc6ICdkdHlwZScsXG4gICAgICAgICd0eXBlJzogJ2R0eXBlJ1xuICAgICAgfVxuICAgIF1cbiAgfSxcbiAge1xuICAgICd0Zk9wTmFtZSc6ICdPbmVzTGlrZScsXG4gICAgJ2NhdGVnb3J5JzogJ2NyZWF0aW9uJyxcbiAgICAnaW5wdXRzJzogW1xuICAgICAge1xuICAgICAgICAnc3RhcnQnOiAwLFxuICAgICAgICAnbmFtZSc6ICd4JyxcbiAgICAgICAgJ3R5cGUnOiAndGVuc29yJ1xuICAgICAgfVxuICAgIF0sXG4gICAgJ2F0dHJzJzogW1xuICAgICAge1xuICAgICAgICAndGZOYW1lJzogJ2R0eXBlJyxcbiAgICAgICAgJ25hbWUnOiAnZHR5cGUnLFxuICAgICAgICAndHlwZSc6ICdkdHlwZSdcbiAgICAgIH1cbiAgICBdXG4gIH0sXG4gIHtcbiAgICAndGZPcE5hbWUnOiAnUmFuZG9tU3RhbmRhcmROb3JtYWwnLFxuICAgICdjYXRlZ29yeSc6ICdjcmVhdGlvbicsXG4gICAgJ2lucHV0cyc6IFtcbiAgICAgIHtcbiAgICAgICAgJ3N0YXJ0JzogMCxcbiAgICAgICAgJ25hbWUnOiAnc2hhcGUnLFxuICAgICAgICAndHlwZSc6ICdudW1iZXJbXSdcbiAgICAgIH1cbiAgICBdLFxuICAgICdhdHRycyc6IFtcbiAgICAgIHtcbiAgICAgICAgJ3RmTmFtZSc6ICdzZWVkJyxcbiAgICAgICAgJ25hbWUnOiAnc2VlZCcsXG4gICAgICAgICd0eXBlJzogJ251bWJlcicsXG4gICAgICAgICdkZWZhdWx0VmFsdWUnOiAwXG4gICAgICB9LFxuICAgICAge1xuICAgICAgICAndGZOYW1lJzogJ3NlZWQyJyxcbiAgICAgICAgJ25hbWUnOiAnc2VlZDInLFxuICAgICAgICAndHlwZSc6ICdudW1iZXInLFxuICAgICAgICAnZGVmYXVsdFZhbHVlJzogMCxcbiAgICAgICAgJ25vdFN1cHBvcnRlZCc6IHRydWVcbiAgICAgIH0sXG4gICAgICB7XG4gICAgICAgICd0Zk5hbWUnOiAnZHR5cGUnLFxuICAgICAgICAnbmFtZSc6ICdkdHlwZScsXG4gICAgICAgICd0eXBlJzogJ2R0eXBlJ1xuICAgICAgfSxcbiAgICAgIHtcbiAgICAgICAgJ3RmTmFtZSc6ICdUJyxcbiAgICAgICAgJ25hbWUnOiAnVCcsXG4gICAgICAgICd0eXBlJzogJ251bWJlcicsXG4gICAgICAgICdub3RTdXBwb3J0ZWQnOiB0cnVlXG4gICAgICB9XG4gICAgXVxuICB9LFxuICB7XG4gICAgJ3RmT3BOYW1lJzogJ1JhbmRvbVVuaWZvcm0nLFxuICAgICdjYXRlZ29yeSc6ICdjcmVhdGlvbicsXG4gICAgJ2lucHV0cyc6IFtcbiAgICAgIHtcbiAgICAgICAgJ3N0YXJ0JzogMCxcbiAgICAgICAgJ25hbWUnOiAnc2hhcGUnLFxuICAgICAgICAndHlwZSc6ICdudW1iZXJbXSdcbiAgICAgIH1cbiAgICBdLFxuICAgICdhdHRycyc6IFtcbiAgICAgIHtcbiAgICAgICAgJ3RmTmFtZSc6ICdtaW52YWwnLFxuICAgICAgICAnbmFtZSc6ICdtaW52YWwnLFxuICAgICAgICAndHlwZSc6ICdudW1iZXInLFxuICAgICAgICAnZGVmYXVsdFZhbHVlJzogMFxuICAgICAgfSxcbiAgICAgIHtcbiAgICAgICAgJ3RmTmFtZSc6ICdtYXh2YWwnLFxuICAgICAgICAnbmFtZSc6ICdtYXh2YWwnLFxuICAgICAgICAndHlwZSc6ICdudW1iZXInLFxuICAgICAgICAnZGVmYXVsdFZhbHVlJzogMVxuICAgICAgfSxcbiAgICAgIHtcbiAgICAgICAgJ3RmTmFtZSc6ICdkdHlwZScsXG4gICAgICAgICduYW1lJzogJ2R0eXBlJyxcbiAgICAgICAgJ3R5cGUnOiAnZHR5cGUnXG4gICAgICB9LFxuICAgICAge1xuICAgICAgICAndGZOYW1lJzogJ3NlZWQnLFxuICAgICAgICAnbmFtZSc6ICdzZWVkJyxcbiAgICAgICAgJ3R5cGUnOiAnbnVtYmVyJyxcbiAgICAgICAgJ2RlZmF1bHRWYWx1ZSc6IDBcbiAgICAgIH0sXG4gICAgICB7XG4gICAgICAgICd0Zk5hbWUnOiAnc2VlZDInLFxuICAgICAgICAnbmFtZSc6ICdzZWVkMicsXG4gICAgICAgICd0eXBlJzogJ251bWJlcicsXG4gICAgICAgICdkZWZhdWx0VmFsdWUnOiAwLFxuICAgICAgICAnbm90U3VwcG9ydGVkJzogdHJ1ZVxuICAgICAgfSxcbiAgICAgIHtcbiAgICAgICAgJ3RmTmFtZSc6ICdUJyxcbiAgICAgICAgJ25hbWUnOiAnVCcsXG4gICAgICAgICd0eXBlJzogJ251bWJlcicsXG4gICAgICAgICdub3RTdXBwb3J0ZWQnOiB0cnVlXG4gICAgICB9XG4gICAgXVxuICB9LFxuICB7XG4gICAgJ3RmT3BOYW1lJzogJ1JhbmdlJyxcbiAgICAnY2F0ZWdvcnknOiAnY3JlYXRpb24nLFxuICAgICdpbnB1dHMnOiBbXG4gICAgICB7XG4gICAgICAgICdzdGFydCc6IDAsXG4gICAgICAgICduYW1lJzogJ3N0YXJ0JyxcbiAgICAgICAgJ3R5cGUnOiAnbnVtYmVyJ1xuICAgICAgfSxcbiAgICAgIHtcbiAgICAgICAgJ3N0YXJ0JzogMSxcbiAgICAgICAgJ25hbWUnOiAnc3RvcCcsXG4gICAgICAgICd0eXBlJzogJ251bWJlcidcbiAgICAgIH0sXG4gICAgICB7XG4gICAgICAgICdzdGFydCc6IDIsXG4gICAgICAgICduYW1lJzogJ3N0ZXAnLFxuICAgICAgICAndHlwZSc6ICdudW1iZXInLFxuICAgICAgICAnZGVmYXVsdFZhbHVlJzogMFxuICAgICAgfVxuICAgIF0sXG4gICAgJ2F0dHJzJzogW1xuICAgICAge1xuICAgICAgICAndGZOYW1lJzogJ1RpZHgnLFxuICAgICAgICAnbmFtZSc6ICdkdHlwZScsXG4gICAgICAgICd0eXBlJzogJ2R0eXBlJ1xuICAgICAgfVxuICAgIF1cbiAgfSxcbiAge1xuICAgICd0Zk9wTmFtZSc6ICdUcnVuY2F0ZWROb3JtYWwnLFxuICAgICdjYXRlZ29yeSc6ICdjcmVhdGlvbicsXG4gICAgJ2lucHV0cyc6IFtcbiAgICAgIHtcbiAgICAgICAgJ3N0YXJ0JzogMCxcbiAgICAgICAgJ25hbWUnOiAnc2hhcGUnLFxuICAgICAgICAndHlwZSc6ICdudW1iZXJbXSdcbiAgICAgIH1cbiAgICBdLFxuICAgICdhdHRycyc6IFtcbiAgICAgIHtcbiAgICAgICAgJ3RmTmFtZSc6ICdtZWFucycsXG4gICAgICAgICduYW1lJzogJ21lYW4nLFxuICAgICAgICAndHlwZSc6ICdudW1iZXInLFxuICAgICAgICAnZGVmYXVsdFZhbHVlJzogMFxuICAgICAgfSxcbiAgICAgIHtcbiAgICAgICAgJ3RmTmFtZSc6ICdzdGRkZXYnLFxuICAgICAgICAnbmFtZSc6ICdzdGREZXYnLFxuICAgICAgICAndHlwZSc6ICdudW1iZXInLFxuICAgICAgICAnZGVmYXVsdFZhbHVlJzogMVxuICAgICAgfSxcbiAgICAgIHtcbiAgICAgICAgJ3RmTmFtZSc6ICdzZWVkJyxcbiAgICAgICAgJ25hbWUnOiAnc2VlZCcsXG4gICAgICAgICd0eXBlJzogJ251bWJlcidcbiAgICAgIH0sXG4gICAgICB7XG4gICAgICAgICd0Zk5hbWUnOiAnc2VlZDInLFxuICAgICAgICAnbmFtZSc6ICdzZWVkMicsXG4gICAgICAgICd0eXBlJzogJ251bWJlcicsXG4gICAgICAgICdkZWZhdWx0VmFsdWUnOiAwLFxuICAgICAgICAnbm90U3VwcG9ydGVkJzogdHJ1ZVxuICAgICAgfSxcbiAgICAgIHtcbiAgICAgICAgJ3RmTmFtZSc6ICdkdHlwZScsXG4gICAgICAgICduYW1lJzogJ2R0eXBlJyxcbiAgICAgICAgJ3R5cGUnOiAnZHR5cGUnXG4gICAgICB9LFxuICAgICAge1xuICAgICAgICAndGZOYW1lJzogJ1QnLFxuICAgICAgICAnbmFtZSc6ICdUJyxcbiAgICAgICAgJ3R5cGUnOiAnbnVtYmVyJyxcbiAgICAgICAgJ25vdFN1cHBvcnRlZCc6IHRydWVcbiAgICAgIH1cbiAgICBdXG4gIH0sXG4gIHtcbiAgICAndGZPcE5hbWUnOiAnWmVyb3MnLFxuICAgICdjYXRlZ29yeSc6ICdjcmVhdGlvbicsXG4gICAgJ2lucHV0cyc6IFtcbiAgICAgIHtcbiAgICAgICAgJ3N0YXJ0JzogMCxcbiAgICAgICAgJ25hbWUnOiAnc2hhcGUnLFxuICAgICAgICAndHlwZSc6ICdudW1iZXJbXSdcbiAgICAgIH1cbiAgICBdLFxuICAgICdhdHRycyc6IFtcbiAgICAgIHtcbiAgICAgICAgJ3RmTmFtZSc6ICdUJyxcbiAgICAgICAgJ25hbWUnOiAnZHR5cGUnLFxuICAgICAgICAndHlwZSc6ICdkdHlwZSdcbiAgICAgIH1cbiAgICBdXG4gIH0sXG4gIHtcbiAgICAndGZPcE5hbWUnOiAnWmVyb3NMaWtlJyxcbiAgICAnY2F0ZWdvcnknOiAnY3JlYXRpb24nLFxuICAgICdpbnB1dHMnOiBbXG4gICAgICB7XG4gICAgICAgICdzdGFydCc6IDAsXG4gICAgICAgICduYW1lJzogJ3gnLFxuICAgICAgICAndHlwZSc6ICd0ZW5zb3InXG4gICAgICB9XG4gICAgXSxcbiAgICAnYXR0cnMnOiBbXG4gICAgICB7XG4gICAgICAgICd0Zk5hbWUnOiAnVCcsXG4gICAgICAgICduYW1lJzogJ2R0eXBlJyxcbiAgICAgICAgJ3R5cGUnOiAnZHR5cGUnXG4gICAgICB9XG4gICAgXVxuICB9LFxuICB7XG4gICAgJ3RmT3BOYW1lJzogJ011bHRpbm9taWFsJyxcbiAgICAnY2F0ZWdvcnknOiAnY3JlYXRpb24nLFxuICAgICdpbnB1dHMnOiBbXG4gICAgICB7XG4gICAgICAgICdzdGFydCc6IDAsXG4gICAgICAgICduYW1lJzogJ2xvZ2l0cycsXG4gICAgICAgICd0eXBlJzogJ3RlbnNvcidcbiAgICAgIH0sXG4gICAgICB7XG4gICAgICAgICdzdGFydCc6IDEsXG4gICAgICAgICduYW1lJzogJ251bVNhbXBsZXMnLFxuICAgICAgICAndHlwZSc6ICdudW1iZXInXG4gICAgICB9XG4gICAgXSxcbiAgICAnYXR0cnMnOiBbXG4gICAgICB7XG4gICAgICAgICd0Zk5hbWUnOiAnc2VlZCcsXG4gICAgICAgICduYW1lJzogJ3NlZWQnLFxuICAgICAgICAndHlwZSc6ICdudW1iZXInXG4gICAgICB9LFxuICAgICAge1xuICAgICAgICAndGZOYW1lJzogJ3NlZWQyJyxcbiAgICAgICAgJ25hbWUnOiAnc2VlZDInLFxuICAgICAgICAndHlwZSc6ICdudW1iZXInXG4gICAgICB9LFxuICAgICAge1xuICAgICAgICAndGZOYW1lJzogJ1QnLFxuICAgICAgICAnbmFtZSc6ICdkdHlwZScsXG4gICAgICAgICd0eXBlJzogJ2R0eXBlJ1xuICAgICAgfSxcbiAgICAgIHtcbiAgICAgICAgJ3RmTmFtZSc6ICdvdXRwdXRfZHR5cGUnLFxuICAgICAgICAnbmFtZSc6ICdvdXRwdXRfZHR5cGUnLFxuICAgICAgICAndHlwZSc6ICdkdHlwZSdcbiAgICAgIH1cbiAgICBdXG4gIH1cbl1cbjtcbiJdfQ==","/**\n * @license\n * Copyright 2022 Google LLC. All Rights Reserved.\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n * =============================================================================\n */\nexport const json = [\n {\n 'tfOpName': 'NonMaxSuppressionV2',\n 'category': 'dynamic',\n 'inputs': [\n {\n 'start': 0,\n 'name': 'boxes',\n 'type': 'tensor'\n },\n {\n 'start': 1,\n 'name': 'scores',\n 'type': 'tensor'\n },\n {\n 'start': 2,\n 'name': 'maxOutputSize',\n 'type': 'number'\n },\n {\n 'start': 3,\n 'name': 'iouThreshold',\n 'type': 'number'\n }\n ]\n },\n {\n 'tfOpName': 'NonMaxSuppressionV3',\n 'category': 'dynamic',\n 'inputs': [\n {\n 'start': 0,\n 'name': 'boxes',\n 'type': 'tensor'\n },\n {\n 'start': 1,\n 'name': 'scores',\n 'type': 'tensor'\n },\n {\n 'start': 2,\n 'name': 'maxOutputSize',\n 'type': 'number'\n },\n {\n 'start': 3,\n 'name': 'iouThreshold',\n 'type': 'number'\n },\n {\n 'start': 4,\n 'name': 'scoreThreshold',\n 'type': 'number'\n }\n ]\n },\n {\n 'tfOpName': 'NonMaxSuppressionV4',\n 'category': 'dynamic',\n 'inputs': [\n {\n 'start': 0,\n 'name': 'boxes',\n 'type': 'tensor'\n },\n {\n 'start': 1,\n 'name': 'scores',\n 'type': 'tensor'\n },\n {\n 'start': 2,\n 'name': 'maxOutputSize',\n 'type': 'number'\n },\n {\n 'start': 3,\n 'name': 'iouThreshold',\n 'type': 'number'\n },\n {\n 'start': 4,\n 'name': 'scoreThreshold',\n 'type': 'number'\n }\n ],\n 'attrs': [\n {\n 'tfName': 'T',\n 'name': 'dtype',\n 'type': 'dtype',\n 'notSupported': true\n },\n {\n 'tfName': 'T_threshold',\n 'name': 'threshold',\n 'type': 'dtype',\n 'notSupported': true\n },\n {\n 'tfName': 'pad_to_max_output_size',\n 'name': 'padToMaxOutputSize',\n 'type': 'bool'\n }\n ]\n },\n {\n 'tfOpName': 'NonMaxSuppressionV5',\n 'category': 'dynamic',\n 'inputs': [\n {\n 'start': 0,\n 'name': 'boxes',\n 'type': 'tensor'\n },\n {\n 'start': 1,\n 'name': 'scores',\n 'type': 'tensor'\n },\n {\n 'start': 2,\n 'name': 'maxOutputSize',\n 'type': 'number'\n },\n {\n 'start': 3,\n 'name': 'iouThreshold',\n 'type': 'number'\n },\n {\n 'start': 4,\n 'name': 'scoreThreshold',\n 'type': 'number'\n },\n {\n 'start': 5,\n 'name': 'softNmsSigma',\n 'type': 'number'\n }\n ]\n },\n {\n 'tfOpName': 'Where',\n 'category': 'dynamic',\n 'inputs': [\n {\n 'start': 0,\n 'name': 'condition',\n 'type': 'tensor'\n }\n ],\n 'attrs': [\n {\n 'tfName': 'T',\n 'name': 'dtype',\n 'type': 'dtype',\n 'notSupported': true\n }\n ]\n },\n {\n 'tfOpName': 'ListDiff',\n 'category': 'dynamic',\n 'inputs': [\n {\n 'start': 0,\n 'name': 'x',\n 'type': 'tensor'\n },\n {\n 'start': 1,\n 'name': 'y',\n 'type': 'tensor'\n }\n ],\n 'attrs': [\n {\n 'tfName': 'T',\n 'name': 'dtype',\n 'type': 'dtype',\n 'notSupported': true\n }\n ]\n }\n];\n//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZHluYW1pYy5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uLy4uLy4uL3RmanMtY29udmVydGVyL3NyYy9vcGVyYXRpb25zL29wX2xpc3QvZHluYW1pYy50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFDQTs7Ozs7Ozs7Ozs7Ozs7O0dBZUc7QUFJSCxNQUFNLENBQUMsTUFBTSxJQUFJLEdBQWU7SUFDOUI7UUFDRSxVQUFVLEVBQUUscUJBQXFCO1FBQ2pDLFVBQVUsRUFBRSxTQUFTO1FBQ3JCLFFBQVEsRUFBRTtZQUNSO2dCQUNFLE9BQU8sRUFBRSxDQUFDO2dCQUNWLE1BQU0sRUFBRSxPQUFPO2dCQUNmLE1BQU0sRUFBRSxRQUFRO2FBQ2pCO1lBQ0Q7Z0JBQ0UsT0FBTyxFQUFFLENBQUM7Z0JBQ1YsTUFBTSxFQUFFLFFBQVE7Z0JBQ2hCLE1BQU0sRUFBRSxRQUFRO2FBQ2pCO1lBQ0Q7Z0JBQ0UsT0FBTyxFQUFFLENBQUM7Z0JBQ1YsTUFBTSxFQUFFLGVBQWU7Z0JBQ3ZCLE1BQU0sRUFBRSxRQUFRO2FBQ2pCO1lBQ0Q7Z0JBQ0UsT0FBTyxFQUFFLENBQUM7Z0JBQ1YsTUFBTSxFQUFFLGNBQWM7Z0JBQ3RCLE1BQU0sRUFBRSxRQUFRO2FBQ2pCO1NBQ0Y7S0FDRjtJQUNEO1FBQ0UsVUFBVSxFQUFFLHFCQUFxQjtRQUNqQyxVQUFVLEVBQUUsU0FBUztRQUNyQixRQUFRLEVBQUU7WUFDUjtnQkFDRSxPQUFPLEVBQUUsQ0FBQztnQkFDVixNQUFNLEVBQUUsT0FBTztnQkFDZixNQUFNLEVBQUUsUUFBUTthQUNqQjtZQUNEO2dCQUNFLE9BQU8sRUFBRSxDQUFDO2dCQUNWLE1BQU0sRUFBRSxRQUFRO2dCQUNoQixNQUFNLEVBQUUsUUFBUTthQUNqQjtZQUNEO2dCQUNFLE9BQU8sRUFBRSxDQUFDO2dCQUNWLE1BQU0sRUFBRSxlQUFlO2dCQUN2QixNQUFNLEVBQUUsUUFBUTthQUNqQjtZQUNEO2dCQUNFLE9BQU8sRUFBRSxDQUFDO2dC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Q0Q7Z0JBQ0UsT0FBTyxFQUFFLENBQUM7Z0JBQ1YsTUFBTSxFQUFFLEdBQUc7Z0JBQ1gsTUFBTSxFQUFFLFFBQVE7YUFDakI7U0FDRjtRQUNELE9BQU8sRUFBRTtZQUNQO2dCQUNFLFFBQVEsRUFBRSxHQUFHO2dCQUNiLE1BQU0sRUFBRSxPQUFPO2dCQUNmLE1BQU0sRUFBRSxPQUFPO2dCQUNmLGNBQWMsRUFBRSxJQUFJO2FBQ3JCO1NBQ0Y7S0FDRjtDQUNGLENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyJcbi8qKlxuICogQGxpY2Vuc2VcbiAqIENvcHlyaWdodCAyMDIyIEdvb2dsZSBMTEMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuXG4gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgXCJMaWNlbnNlXCIpO1xuICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLlxuICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0XG4gKlxuICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wXG4gKlxuICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZVxuICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gXCJBUyBJU1wiIEJBU0lTLFxuICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuXG4gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kXG4gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS5cbiAqID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4gKi9cblxuaW1wb3J0IHtPcE1hcHBlcn0gZnJvbSAnLi4vdHlwZXMnO1xuXG5leHBvcnQgY29uc3QganNvbjogT3BNYXBwZXJbXSA9IFtcbiAge1xuICAgICd0Zk9wTmFtZSc6ICdOb25NYXhTdXBwcmVzc2lvblYyJyxcbiAgICAnY2F0ZWdvcnknOiAnZHluYW1pYycsXG4gICAgJ2lucHV0cyc6IFtcbiAgICAgIHtcbiAgICAgICAgJ3N0YXJ0JzogMCxcbiAgICAgICAgJ25hbWUnOiAnYm94ZXMnLFxuICAgICAgICAndHlwZSc6ICd0ZW5zb3InXG4gICAgICB9LFxuICAgICAge1xuICAgICAgICAnc3RhcnQnOiAxLFxuICAgICAgICAnbmFtZSc6ICdzY29yZXMnLFxuICAgICAgICAndHlwZSc6ICd0ZW5zb3InXG4gICAgICB9LFxuICAgICAge1xuICAgICAgICAnc3RhcnQnOiAyLFxuICAgICAgICAnbmFtZSc6ICdtYXhPdXRwdXRTaXplJyxcbiAgICAgICAgJ3R5cGUnOiAnbnVtYmVyJ1xuICAgICAgfSxcbiAgICAgIHtcbiAgICAgICAgJ3N0YXJ0JzogMyxcbiAgICAgICAgJ25hbWUnOiAnaW91VGhyZXNob2xkJyxcbiAgICAgICAgJ3R5cGUnOiAnbnVtYmVyJ1xuICAgICAgfVxuICAgIF1cbiAgfSxcbiAge1xuICAgICd0Zk9wTmFtZSc6ICdOb25NYXhTdXBwcmVzc2lvblYzJyxcbiAgICAnY2F0ZWdvcnknOiAnZHluYW1pYycsXG4gICAgJ2lucHV0cyc6IFtcbiAgICAgIHtcbiAgICAgICAgJ3N0YXJ0JzogMCxcbiAgICAgICAgJ25hbWUnOiAnYm94ZXMnLFxuICAgICAgICAndHlwZSc6ICd0ZW5zb3InXG4gICAgICB9LFxuICAgICAge1xuICAgICAgICAnc3RhcnQnOiAxLFxuICAgICAgICAnbmFtZSc6ICdzY29yZXMnLFxuICAgICAgICAndHlwZSc6ICd0ZW5zb3InXG4gICAgICB9LFxuICAgICAge1xuICAgICAgICAnc3RhcnQnOiAyLFxuICAgICAgICAnbmFtZSc6ICdtYXhPdXRwdXRTaXplJyxcbiAgICAgICAgJ3R5cGUnOiAnbnVtYmVyJ1xuICAgICAgfSxcbiAgICAgIHtcbiAgICAgICAgJ3N0YXJ0JzogMyxcbiAgICAgICAgJ25hbWUnOiAnaW91VGhyZXNob2xkJyxcbiAgICAgICAgJ3R5cGUnOiAnbnVtYmVyJ1xuICAgICAgfSxcbiAgICAgIHtcbiAgICAgICAgJ3N0YXJ0JzogNCxcbiAgICAgICAgJ25hbWUnOiAnc2NvcmVUaHJlc2hvbGQnLFxuICAgICAgICAndHlwZSc6ICdudW1iZXInXG4gICAgICB9XG4gICAgXVxuICB9LFxuICB7XG4gICAgJ3RmT3BOYW1lJzogJ05vbk1heFN1cHByZXNzaW9uVjQnLFxuICAgICdjYXRlZ29yeSc6ICdkeW5hbWljJyxcbiAgICAnaW5wdXRzJzogW1xuICAgICAge1xuICAgICAgICAnc3RhcnQnOiAwLFxuICAgICAgICAnbmFtZSc6ICdib3hlcycsXG4gICAgICAgICd0eXBlJzogJ3RlbnNvcidcbiAgICAgIH0sXG4gICAgICB7XG4gICAgICAgICdzdGFydCc6IDEsXG4gICAgICAgICduYW1lJzogJ3Njb3JlcycsXG4gICAgICAgICd0eXBlJzogJ3RlbnNvcidcbiAgICAgIH0sXG4gICAgICB7XG4gICAgICAgICdzdGFydCc6IDIsXG4gICAgICAgICduYW1lJzogJ21heE91dHB1dFNpemUnLFxuICAgICAgICAndHlwZSc6ICdudW1iZXInXG4gICAgICB9LFxuICAgICAge1xuICAgICAgICAnc3RhcnQnOiAzLFxuICAgICAgICAnbmFtZSc6ICdpb3VUaHJlc2hvbGQnLFxuICAgICAgICAndHlwZSc6ICdudW1iZXInXG4gICAgICB9LFxuICAgICAge1xuICAgICAgICAnc3RhcnQnOiA0LFxuICAgICAgICAnbmFtZSc6ICdzY29yZVRocmVzaG9sZCcsXG4gICAgICAgICd0eXBlJzogJ251bWJlcidcbiAgICAgIH1cbiAgICBdLFxuICAgICdhdHRycyc6IFtcbiAgICAgIHtcbiAgICAgICAgJ3RmTmFtZSc6ICdUJyxcbiAgICAgICAgJ25hbWUnOiAnZHR5cGUnLFxuICAgICAgICAndHlwZSc6ICdkdHlwZScsXG4gICAgICAgICdub3RTdXBwb3J0ZWQnOiB0cnVlXG4gICAgICB9LFxuICAgICAge1xuICAgICAgICAndGZOYW1lJzogJ1RfdGhyZXNob2xkJyxcbiAgICAgICAgJ25hbWUnOiAndGhyZXNob2xkJyxcbiAgICAgICAgJ3R5cGUnOiAnZHR5cGUnLFxuICAgICAgICAnbm90U3VwcG9ydGVkJzogdHJ1ZVxuICAgICAgfSxcbiAgICAgIHtcbiAgICAgICAgJ3RmTmFtZSc6ICdwYWRfdG9fbWF4X291dHB1dF9zaXplJyxcbiAgICAgICAgJ25hbWUnOiAncGFkVG9NYXhPdXRwdXRTaXplJyxcbiAgICAgICAgJ3R5cGUnOiAnYm9vbCdcbiAgICAgIH1cbiAgICBdXG4gIH0sXG4gIHtcbiAgICAndGZPcE5hbWUnOiAnTm9uTWF4U3VwcHJlc3Npb25WNScsXG4gICAgJ2NhdGVnb3J5JzogJ2R5bmFtaWMnLFxuICAgICdpbnB1dHMnOiBbXG4gICAgICB7XG4gICAgICAgICdzdGFydCc6IDAsXG4gICAgICAgICduYW1lJzogJ2JveGVzJyxcbiAgICAgICAgJ3R5cGUnOiAndGVuc29yJ1xuICAgICAgfSxcbiAgICAgIHtcbiAgICAgICAgJ3N0YXJ0JzogMSxcbiAgICAgICAgJ25hbWUnOiAnc2NvcmVzJyxcbiAgICAgICAgJ3R5cGUnOiAndGVuc29yJ1xuICAgICAgfSxcbiAgICAgIHtcbiAgICAgICAgJ3N0YXJ0JzogMixcbiAgICAgICAgJ25hbWUnOiAnbWF4T3V0cHV0U2l6ZScsXG4gICAgICAgICd0eXBlJzogJ251bWJlcidcbiAgICAgIH0sXG4gICAgICB7XG4gICAgICAgICdzdGFydCc6IDMsXG4gICAgICAgICduYW1lJzogJ2lvdVRocmVzaG9sZCcsXG4gICAgICAgICd0eXBlJzogJ251bWJlcidcbiAgICAgIH0sXG4gICAgICB7XG4gICAgICAgICdzdGFydCc6IDQsXG4gICAgICAgICduYW1lJzogJ3Njb3JlVGhyZXNob2xkJyxcbiAgICAgICAgJ3R5cGUnOiAnbnVtYmVyJ1xuICAgICAgfSxcbiAgICAgIHtcbiAgICAgICAgJ3N0YXJ0JzogNSxcbiAgICAgICAgJ25hbWUnOiAnc29mdE5tc1NpZ21hJyxcbiAgICAgICAgJ3R5cGUnOiAnbnVtYmVyJ1xuICAgICAgfVxuICAgIF1cbiAgfSxcbiAge1xuICAgICd0Zk9wTmFtZSc6ICdXaGVyZScsXG4gICAgJ2NhdGVnb3J5JzogJ2R5bmFtaWMnLFxuICAgICdpbnB1dHMnOiBbXG4gICAgICB7XG4gICAgICAgICdzdGFydCc6IDAsXG4gICAgICAgICduYW1lJzogJ2NvbmRpdGlvbicsXG4gICAgICAgICd0eXBlJzogJ3RlbnNvcidcbiAgICAgIH1cbiAgICBdLFxuICAgICdhdHRycyc6IFtcbiAgICAgIHtcbiAgICAgICAgJ3RmTmFtZSc6ICdUJyxcbiAgICAgICAgJ25hbWUnOiAnZHR5cGUnLFxuICAgICAgICAndHlwZSc6ICdkdHlwZScsXG4gICAgICAgICdub3RTdXBwb3J0ZWQnOiB0cnVlXG4gICAgICB9XG4gICAgXVxuICB9LFxuICB7XG4gICAgJ3RmT3BOYW1lJzogJ0xpc3REaWZmJyxcbiAgICAnY2F0ZWdvcnknOiAnZHluYW1pYycsXG4gICAgJ2lucHV0cyc6IFtcbiAgICAgIHtcbiAgICAgICAgJ3N0YXJ0JzogMCxcbiAgICAgICAgJ25hbWUnOiAneCcsXG4gICAgICAgICd0eXBlJzogJ3RlbnNvcidcbiAgICAgIH0sXG4gICAgICB7XG4gICAgICAgICdzdGFydCc6IDEsXG4gICAgICAgICduYW1lJzogJ3knLFxuICAgICAgICAndHlwZSc6ICd0ZW5zb3InXG4gICAgICB9XG4gICAgXSxcbiAgICAnYXR0cnMnOiBbXG4gICAgICB7XG4gICAgICAgICd0Zk5hbWUnOiAnVCcsXG4gICAgICAgICduYW1lJzogJ2R0eXBlJyxcbiAgICAgICAgJ3R5cGUnOiAnZHR5cGUnLFxuICAgICAgICAnbm90U3VwcG9ydGVkJzogdHJ1ZVxuICAgICAgfVxuICAgIF1cbiAgfVxuXTtcbiJdfQ==","/**\n * @license\n * Copyright 2022 Google LLC. All Rights Reserved.\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n * =============================================================================\n */\nexport const json = [\n {\n 'tfOpName': 'LowerBound',\n 'category': 'evaluation',\n 'inputs': [\n {\n 'start': 0,\n 'name': 'sortedSequence',\n 'type': 'tensor'\n },\n {\n 'start': 1,\n 'name': 'values',\n 'type': 'tensor'\n }\n ]\n },\n {\n 'tfOpName': 'TopKV2',\n 'category': 'evaluation',\n 'inputs': [\n {\n 'start': 0,\n 'name': 'x',\n 'type': 'tensor'\n },\n {\n 'start': 1,\n 'name': 'k',\n 'type': 'number'\n }\n ],\n 'attrs': [\n {\n 'tfName': 'sorted',\n 'name': 'sorted',\n 'type': 'bool'\n }\n ]\n },\n {\n 'tfOpName': 'UpperBound',\n 'category': 'evaluation',\n 'inputs': [\n {\n 'start': 0,\n 'name': 'sortedSequence',\n 'type': 'tensor'\n },\n {\n 'start': 1,\n 'name': 'values',\n 'type': 'tensor'\n }\n ]\n },\n {\n 'tfOpName': 'Unique',\n 'category': 'evaluation',\n 'inputs': [\n {\n 'start': 0,\n 'name': 'x',\n 'type': 'tensor'\n }\n ]\n },\n {\n 'tfOpName': 'UniqueV2',\n 'category': 'evaluation',\n 'inputs': [\n {\n 'start': 0,\n 'name': 'x',\n 'type': 'tensor'\n },\n {\n 'start': 1,\n 'name': 'axis',\n 'type': 'number'\n }\n ]\n }\n];\n//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZXZhbHVhdGlvbi5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uLy4uLy4uL3RmanMtY29udmVydGVyL3NyYy9vcGVyYXRpb25zL29wX2xpc3QvZXZhbHVhdGlvbi50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFDQTs7Ozs7Ozs7Ozs7Ozs7O0dBZUc7QUFJSCxNQUFNLENBQUMsTUFBTSxJQUFJLEdBQWU7SUFDOUI7UUFDRSxVQUFVLEVBQUUsWUFBWTtRQUN4QixVQUFVLEVBQUUsWUFBWTtRQUN4QixRQUFRLEVBQUU7WUFDUjtnQkFDRSxPQUFPLEVBQUUsQ0FBQztnQkFDVixNQUFNLEVBQUUsZ0JBQWdCO2dCQUN4QixNQUFNLEVBQUUsUUFBUTthQUNqQjtZQUNEO2dCQUNFLE9BQU8sRUFBRSxDQUFDO2dCQUNWLE1BQU0sRUFBRSxRQUFRO2dCQUNoQixNQUFNLEVBQUUsUUFBUTthQUNqQjtTQUNGO0tBQ0Y7SUFDRDtRQUNFLFVBQVUsRUFBRSxRQUFRO1FBQ3BCLFVBQVUsRUFBRSxZQUFZO1FBQ3hCLFFBQVEsRUFBRTtZQUNSO2dCQUNFLE9BQU8sRUFBRSxDQUFDO2dCQUNWLE1BQU0sRUFBRSxHQUFHO2dCQUNYLE1BQU0sRUFBRSxRQUFRO2FBQ2pCO1lBQ0Q7Z0JBQ0UsT0FBTyxFQUFFLENBQUM7Z0JBQ1YsTUFBTSxFQUFFLEdBQUc7Z0JBQ1gsTUFBTSxFQUFFLFFBQVE7YUFDakI7U0FDRjtRQUNELE9BQU8sRUFBRTtZQUNQO2dCQUNFLFFBQVEsRUFBRSxRQUFRO2dCQUNsQixNQUFNLEVBQUUsUUFBUTtnQkFDaEIsTUFBTSxFQUFFLE1BQU07YUFDZjtTQUNGO0tBQ0Y7SUFDRDtRQUNFLFVBQVUsRUFBRSxZQUFZO1FBQ3hCLFVBQVUsRUFBRSxZQUFZO1FBQ3hCLFFBQVEsRUFBRTtZQUNSO2dCQUNFLE9BQU8sRUFBRSxDQUFDO2dCQUNWLE1BQU0sRUFBRSxnQkFBZ0I7Z0JBQ3hCLE1BQU0sRUFBRSxRQUFRO2FBQ2pCO1lBQ0Q7Z0JBQ0UsT0FBTyxFQUFFLENBQUM7Z0JBQ1YsTUFBTSxFQUFFLFFBQVE7Z0JBQ2hCLE1BQU0sRUFBRSxRQUFRO2FBQ2pCO1NBQ0Y7S0FDRjtJQUNEO1FBQ0UsVUFBVSxFQUFFLFFBQVE7UUFDcEIsVUFBVSxFQUFFLFlBQVk7UUFDeEIsUUFBUSxFQUFFO1lBQ1I7Z0JBQ0UsT0FBTyxFQUFFLENBQUM7Z0JBQ1YsTUFBTSxFQUFFLEdBQUc7Z0JBQ1gsTUFBTSxFQUFFLFFBQVE7YUFDakI7U0FDRjtLQUNGO0lBQ0Q7UUFDRSxVQUFVLEVBQUUsVUFBVTtRQUN0QixVQUFVLEVBQUUsWUFBWTtRQUN4QixRQUFRLEVBQUU7WUFDUjtnQkFDRSxPQUFPLEVBQUUsQ0FBQztnQkFDVixNQUFNLEVBQUUsR0FBRztnQkFDWCxNQUFNLEVBQUUsUUFBUTthQUNqQjtZQUNEO2dCQUNFLE9BQU8sRUFBRSxDQUFDO2dCQUNWLE1BQU0sRUFBRSxNQUFNO2dCQUNkLE1BQU0sRUFBRSxRQUFRO2FBQ2pCO1NBQ0Y7S0FDRjtDQUNGLENBQ0EiLCJzb3VyY2VzQ29udGVudCI6WyJcbi8qKlxuICogQGxpY2Vuc2VcbiAqIENvcHlyaWdodCAyMDIyIEdvb2dsZSBMTEMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuXG4gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgXCJMaWNlbnNlXCIpO1xuICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLlxuICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0XG4gKlxuICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wXG4gKlxuICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZVxuICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gXCJBUyBJU1wiIEJBU0lTLFxuICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuXG4gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kXG4gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS5cbiAqID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4gKi9cblxuaW1wb3J0IHtPcE1hcHBlcn0gZnJvbSAnLi4vdHlwZXMnO1xuXG5leHBvcnQgY29uc3QganNvbjogT3BNYXBwZXJbXSA9IFtcbiAge1xuICAgICd0Zk9wTmFtZSc6ICdMb3dlckJvdW5kJyxcbiAgICAnY2F0ZWdvcnknOiAnZXZhbHVhdGlvbicsXG4gICAgJ2lucHV0cyc6IFtcbiAgICAgIHtcbiAgICAgICAgJ3N0YXJ0JzogMCxcbiAgICAgICAgJ25hbWUnOiAnc29ydGVkU2VxdWVuY2UnLFxuICAgICAgICAndHlwZSc6ICd0ZW5zb3InXG4gICAgICB9LFxuICAgICAge1xuICAgICAgICAnc3RhcnQnOiAxLFxuICAgICAgICAnbmFtZSc6ICd2YWx1ZXMnLFxuICAgICAgICAndHlwZSc6ICd0ZW5zb3InXG4gICAgICB9XG4gICAgXVxuICB9LFxuICB7XG4gICAgJ3RmT3BOYW1lJzogJ1RvcEtWMicsXG4gICAgJ2NhdGVnb3J5JzogJ2V2YWx1YXRpb24nLFxuICAgICdpbnB1dHMnOiBbXG4gICAgICB7XG4gICAgICAgICdzdGFydCc6IDAsXG4gICAgICAgICduYW1lJzogJ3gnLFxuICAgICAgICAndHlwZSc6ICd0ZW5zb3InXG4gICAgICB9LFxuICAgICAge1xuICAgICAgICAnc3RhcnQnOiAxLFxuICAgICAgICAnbmFtZSc6ICdrJyxcbiAgICAgICAgJ3R5cGUnOiAnbnVtYmVyJ1xuICAgICAgfVxuICAgIF0sXG4gICAgJ2F0dHJzJzogW1xuICAgICAge1xuICAgICAgICAndGZOYW1lJzogJ3NvcnRlZCcsXG4gICAgICAgICduYW1lJzogJ3NvcnRlZCcsXG4gICAgICAgICd0eXBlJzogJ2Jvb2wnXG4gICAgICB9XG4gICAgXVxuICB9LFxuICB7XG4gICAgJ3RmT3BOYW1lJzogJ1VwcGVyQm91bmQnLFxuICAgICdjYXRlZ29yeSc6ICdldmFsdWF0aW9uJyxcbiAgICAnaW5wdXRzJzogW1xuICAgICAge1xuICAgICAgICAnc3RhcnQnOiAwLFxuICAgICAgICAnbmFtZSc6ICdzb3J0ZWRTZXF1ZW5jZScsXG4gICAgICAgICd0eXBlJzogJ3RlbnNvcidcbiAgICAgIH0sXG4gICAgICB7XG4gICAgICAgICdzdGFydCc6IDEsXG4gICAgICAgICduYW1lJzogJ3ZhbHVlcycsXG4gICAgICAgICd0eXBlJzogJ3RlbnNvcidcbiAgICAgIH1cbiAgICBdXG4gIH0sXG4gIHtcbiAgICAndGZPcE5hbWUnOiAnVW5pcXVlJyxcbiAgICAnY2F0ZWdvcnknOiAnZXZhbHVhdGlvbicsXG4gICAgJ2lucHV0cyc6IFtcbiAgICAgIHtcbiAgICAgICAgJ3N0YXJ0JzogMCxcbiAgICAgICAgJ25hbWUnOiAneCcsXG4gICAgICAgICd0eXBlJzogJ3RlbnNvcidcbiAgICAgIH1cbiAgICBdXG4gIH0sXG4gIHtcbiAgICAndGZPcE5hbWUnOiAnVW5pcXVlVjInLFxuICAgICdjYXRlZ29yeSc6ICdldmFsdWF0aW9uJyxcbiAgICAnaW5wdXRzJzogW1xuICAgICAge1xuICAgICAgICAnc3RhcnQnOiAwLFxuICAgICAgICAnbmFtZSc6ICd4JyxcbiAgICAgICAgJ3R5cGUnOiAndGVuc29yJ1xuICAgICAgfSxcbiAgICAgIHtcbiAgICAgICAgJ3N0YXJ0JzogMSxcbiAgICAgICAgJ25hbWUnOiAnYXhpcycsXG4gICAgICAgICd0eXBlJzogJ251bWJlcidcbiAgICAgIH1cbiAgICBdXG4gIH1cbl1cbjtcbiJdfQ==","/**\n * @license\n * Copyright 2022 Google LLC. All Rights Reserved.\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n * =============================================================================\n */\nexport const json = [\n {\n 'tfOpName': 'PlaceholderWithDefault',\n 'category': 'graph',\n 'inputs': [\n {\n 'start': 0,\n 'name': 'default',\n 'type': 'tensor'\n }\n ],\n 'attrs': [\n {\n 'tfName': 'shape',\n 'name': 'shape',\n 'type': 'shape'\n },\n {\n 'tfName': 'dtype',\n 'name': 'dtype',\n 'type': 'dtype'\n }\n ]\n },\n {\n 'tfOpName': 'Placeholder',\n 'category': 'graph',\n 'attrs': [\n {\n 'tfName': 'shape',\n 'name': 'shape',\n 'type': 'shape'\n },\n {\n 'tfName': 'dtype',\n 'name': 'dtype',\n 'type': 'dtype'\n }\n ]\n },\n {\n 'tfOpName': 'Const',\n 'category': 'graph'\n },\n {\n 'tfOpName': 'Identity',\n 'category': 'graph',\n 'inputs': [\n {\n 'start': 0,\n 'name': 'x',\n 'type': 'tensor'\n }\n ]\n },\n {\n 'tfOpName': 'IdentityN',\n 'category': 'graph',\n 'inputs': [\n {\n 'start': 0,\n 'end': 0,\n 'name': 'x',\n 'type': 'tensors'\n }\n ]\n },\n {\n 'tfOpName': 'Snapshot',\n 'category': 'graph',\n 'inputs': [\n {\n 'start': 0,\n 'name': 'x',\n 'type': 'tensor'\n }\n ]\n },\n {\n 'tfOpName': 'Rank',\n 'category': 'graph',\n 'inputs': [\n {\n 'start': 0,\n 'name': 'x',\n 'type': 'tensor'\n }\n ]\n },\n {\n 'tfOpName': 'Size',\n 'category': 'graph',\n 'inputs': [\n {\n 'start': 0,\n 'name': 'x',\n 'type': 'tensor'\n }\n ]\n },\n {\n 'tfOpName': 'Shape',\n 'category': 'graph',\n 'inputs': [\n {\n 'start': 0,\n 'name': 'x',\n 'type': 'tensor'\n }\n ]\n },\n {\n 'tfOpName': 'ShapeN',\n 'category': 'graph',\n 'inputs': [\n {\n 'start': 0,\n 'end': 0,\n 'name': 'x',\n 'type': 'tensors'\n }\n ]\n },\n {\n 'tfOpName': 'Print',\n 'category': 'graph',\n 'inputs': [\n {\n 'start': 0,\n 'name': 'x',\n 'type': 'tensor'\n },\n {\n 'start': 1,\n 'name': 'data',\n 'type': 'tensors'\n }\n ],\n 'attrs': [\n {\n 'tfName': 'message',\n 'name': 'message',\n 'type': 'string'\n },\n {\n 'tfName': 'first_n',\n 'name': 'firstN',\n 'type': 'number',\n 'notSupported': true\n },\n {\n 'tfName': 'summarize',\n 'name': 'summarize',\n 'type': 'number',\n 'defaultValue': 3\n }\n ]\n },\n {\n 'tfOpName': 'NoOp',\n 'category': 'graph',\n 'inputs': []\n },\n {\n 'tfOpName': 'StopGradient',\n 'category': 'graph',\n 'inputs': [\n {\n 'start': 0,\n 'name': 'x',\n 'type': 'tensor'\n }\n ]\n },\n {\n 'tfOpName': 'FakeQuantWithMinMaxVars',\n 'category': 'graph',\n 'inputs': [\n {\n 'start': 0,\n 'name': 'x',\n 'type': 'tensor'\n }\n ],\n 'attrs': [\n {\n 'tfName': 'min',\n 'name': 'min',\n 'type': 'number'\n },\n {\n 'tfName': 'max',\n 'name': 'max',\n 'type': 'number'\n }\n ]\n }\n];\n//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZ3JhcGguanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi8uLi8uLi90ZmpzLWNvbnZlcnRlci9zcmMvb3BlcmF0aW9ucy9vcF9saXN0L2dyYXBoLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUNBOzs7Ozs7Ozs7Ozs7Ozs7R0FlRztBQUlILE1BQU0sQ0FBQyxNQUFNLElBQUksR0FBZTtJQUM5QjtRQUNFLFVBQVUsRUFBRSx3QkFBd0I7UUFDcEMsVUFBVSxFQUFFLE9BQU87UUFDbkIsUUFBUSxFQUFFO1lBQ1I7Z0JBQ0UsT0FBTyxFQUFFLENBQUM7Z0JBQ1YsTUFBTSxFQUFFLFNBQVM7Z0JBQ2pCLE1BQU0sRUFBRSxRQUFRO2FBQ2pCO1NBQ0Y7UUFDRCxPQUFPLEVBQUU7WUFDUDtnQkFDRSxRQUFRLEVBQUUsT0FBTztnQkFDakIsTUFBTSxFQUFFLE9BQU87Z0JBQ2YsTUFBTSxFQUFFLE9BQU87YUFDaEI7WUFDRDtnQkFDRSxRQUFRLEVBQUUsT0FBTztnQkFDakIsTUFBTSxFQUFFLE9BQU87Z0JBQ2YsTUFBTSxFQUFFLE9BQU87YUFDaEI7U0FDRjtLQUNGO0lBQ0Q7UUFDRSxVQUFVLEVBQUUsYUFBYTtRQUN6QixVQUFVLEVBQUUsT0FBTztRQUNuQixPQUFPLEVBQUU7WUFDUDtnQkFDRSxRQUFRLEVBQUUsT0FBTztnQkFDakIsTUFBTSxFQUFFLE9BQU87Z0JBQ2YsTUFBTSxFQUFFLE9BQU87YUFDaEI7WUFDRDtnQkFDRSxRQUFRLEVBQUUsT0FBTztnQkFDakIsTUFBTSxFQUFFLE9BQU87Z0JBQ2YsTUFBTSxFQUFFLE9BQU87YUFDaEI7U0FDRjtLQUNGO0lBQ0Q7UUFDRSxVQUFVLEVBQUUsT0FBTztRQUNuQixVQUFVLEVBQUUsT0FBTztLQUNwQjtJQUNEO1FBQ0UsVUFBVSxFQUFFLFVBQVU7UUFDdEIsVUFBVSxFQUFFLE9BQU87UUFDbkIsUUFBUSxFQUFFO1lBQ1I7Z0JBQ0UsT0FBTyxFQUFFLENBQUM7Z0JBQ1YsTUFBTSxF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R0FBRztnQkFDWCxNQUFNLEVBQUUsUUFBUTthQUNqQjtTQUNGO1FBQ0QsT0FBTyxFQUFFO1lBQ1A7Z0JBQ0UsUUFBUSxFQUFFLEtBQUs7Z0JBQ2YsTUFBTSxFQUFFLEtBQUs7Z0JBQ2IsTUFBTSxFQUFFLFFBQVE7YUFDakI7WUFDRDtnQkFDRSxRQUFRLEVBQUUsS0FBSztnQkFDZixNQUFNLEVBQUUsS0FBSztnQkFDYixNQUFNLEVBQUUsUUFBUTthQUNqQjtTQUNGO0tBQ0Y7Q0FDRixDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiXG4vKipcbiAqIEBsaWNlbnNlXG4gKiBDb3B5cmlnaHQgMjAyMiBHb29nbGUgTExDLiBBbGwgUmlnaHRzIFJlc2VydmVkLlxuICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlIFwiTGljZW5zZVwiKTtcbiAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS5cbiAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdFxuICpcbiAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMFxuICpcbiAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmVcbiAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuIFwiQVMgSVNcIiBCQVNJUyxcbiAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLlxuICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZFxuICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuXG4gKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuICovXG5cbmltcG9ydCB7T3BNYXBwZXJ9IGZyb20gJy4uL3R5cGVzJztcblxuZXhwb3J0IGNvbnN0IGpzb246IE9wTWFwcGVyW10gPSBbXG4gIHtcbiAgICAndGZPcE5hbWUnOiAnUGxhY2Vob2xkZXJXaXRoRGVmYXVsdCcsXG4gICAgJ2NhdGVnb3J5JzogJ2dyYXBoJyxcbiAgICAnaW5wdXRzJzogW1xuICAgICAge1xuICAgICAgICAnc3RhcnQnOiAwLFxuICAgICAgICAnbmFtZSc6ICdkZWZhdWx0JyxcbiAgICAgICAgJ3R5cGUnOiAndGVuc29yJ1xuICAgICAgfVxuICAgIF0sXG4gICAgJ2F0dHJzJzogW1xuICAgICAge1xuICAgICAgICAndGZOYW1lJzogJ3NoYXBlJyxcbiAgICAgICAgJ25hbWUnOiAnc2hhcGUnLFxuICAgICAgICAndHlwZSc6ICdzaGFwZSdcbiAgICAgIH0sXG4gICAgICB7XG4gICAgICAgICd0Zk5hbWUnOiAnZHR5cGUnLFxuICAgICAgICAnbmFtZSc6ICdkdHlwZScsXG4gICAgICAgICd0eXBlJzogJ2R0eXBlJ1xuICAgICAgfVxuICAgIF1cbiAgfSxcbiAge1xuICAgICd0Zk9wTmFtZSc6ICdQbGFjZWhvbGRlcicsXG4gICAgJ2NhdGVnb3J5JzogJ2dyYXBoJyxcbiAgICAnYXR0cnMnOiBbXG4gICAgICB7XG4gICAgICAgICd0Zk5hbWUnOiAnc2hhcGUnLFxuICAgICAgICAnbmFtZSc6ICdzaGFwZScsXG4gICAgICAgICd0eXBlJzogJ3NoYXBlJ1xuICAgICAgfSxcbiAgICAgIHtcbiAgICAgICAgJ3RmTmFtZSc6ICdkdHlwZScsXG4gICAgICAgICduYW1lJzogJ2R0eXBlJyxcbiAgICAgICAgJ3R5cGUnOiAnZHR5cGUnXG4gICAgICB9XG4gICAgXVxuICB9LFxuICB7XG4gICAgJ3RmT3BOYW1lJzogJ0NvbnN0JyxcbiAgICAnY2F0ZWdvcnknOiAnZ3JhcGgnXG4gIH0sXG4gIHtcbiAgICAndGZPcE5hbWUnOiAnSWRlbnRpdHknLFxuICAgICdjYXRlZ29yeSc6ICdncmFwaCcsXG4gICAgJ2lucHV0cyc6IFtcbiAgICAgIHtcbiAgICAgICAgJ3N0YXJ0JzogMCxcbiAgICAgICAgJ25hbWUnOiAneCcsXG4gICAgICAgICd0eXBlJzogJ3RlbnNvcidcbiAgICAgIH1cbiAgICBdXG4gIH0sXG4gIHtcbiAgICAndGZPcE5hbWUnOiAnSWRlbnRpdHlOJyxcbiAgICAnY2F0ZWdvcnknOiAnZ3JhcGgnLFxuICAgICdpbnB1dHMnOiBbXG4gICAgICB7XG4gICAgICAgICdzdGFydCc6IDAsXG4gICAgICAgICdlbmQnOiAwLFxuICAgICAgICAnbmFtZSc6ICd4JyxcbiAgICAgICAgJ3R5cGUnOiAndGVuc29ycydcbiAgICAgIH1cbiAgICBdXG4gIH0sXG4gIHtcbiAgICAndGZPcE5hbWUnOiAnU25hcHNob3QnLFxuICAgICdjYXRlZ29yeSc6ICdncmFwaCcsXG4gICAgJ2lucHV0cyc6IFtcbiAgICAgIHtcbiAgICAgICAgJ3N0YXJ0JzogMCxcbiAgICAgICAgJ25hbWUnOiAneCcsXG4gICAgICAgICd0eXBlJzogJ3RlbnNvcidcbiAgICAgIH1cbiAgICBdXG4gIH0sXG4gIHtcbiAgICAndGZPcE5hbWUnOiAnUmFuaycsXG4gICAgJ2NhdGVnb3J5JzogJ2dyYXBoJyxcbiAgICAnaW5wdXRzJzogW1xuICAgICAge1xuICAgICAgICAnc3RhcnQnOiAwLFxuICAgICAgICAnbmFtZSc6ICd4JyxcbiAgICAgICAgJ3R5cGUnOiAndGVuc29yJ1xuICAgICAgfVxuICAgIF1cbiAgfSxcbiAge1xuICAgICd0Zk9wTmFtZSc6ICdTaXplJyxcbiAgICAnY2F0ZWdvcnknOiAnZ3JhcGgnLFxuICAgICdpbnB1dHMnOiBbXG4gICAgICB7XG4gICAgICAgICdzdGFydCc6IDAsXG4gICAgICAgICduYW1lJzogJ3gnLFxuICAgICAgICAndHlwZSc6ICd0ZW5zb3InXG4gICAgICB9XG4gICAgXVxuICB9LFxuICB7XG4gICAgJ3RmT3BOYW1lJzogJ1NoYXBlJyxcbiAgICAnY2F0ZWdvcnknOiAnZ3JhcGgnLFxuICAgICdpbnB1dHMnOiBbXG4gICAgICB7XG4gICAgICAgICdzdGFydCc6IDAsXG4gICAgICAgICduYW1lJzogJ3gnLFxuICAgICAgICAndHlwZSc6ICd0ZW5zb3InXG4gICAgICB9XG4gICAgXVxuICB9LFxuICB7XG4gICAgJ3RmT3BOYW1lJzogJ1NoYXBlTicsXG4gICAgJ2NhdGVnb3J5JzogJ2dyYXBoJyxcbiAgICAnaW5wdXRzJzogW1xuICAgICAge1xuICAgICAgICAnc3RhcnQnOiAwLFxuICAgICAgICAnZW5kJzogMCxcbiAgICAgICAgJ25hbWUnOiAneCcsXG4gICAgICAgICd0eXBlJzogJ3RlbnNvcnMnXG4gICAgICB9XG4gICAgXVxuICB9LFxuICB7XG4gICAgJ3RmT3BOYW1lJzogJ1ByaW50JyxcbiAgICAnY2F0ZWdvcnknOiAnZ3JhcGgnLFxuICAgICdpbnB1dHMnOiBbXG4gICAgICB7XG4gICAgICAgICdzdGFydCc6IDAsXG4gICAgICAgICduYW1lJzogJ3gnLFxuICAgICAgICAndHlwZSc6ICd0ZW5zb3InXG4gICAgICB9LFxuICAgICAge1xuICAgICAgICAnc3RhcnQnOiAxLFxuICAgICAgICAnbmFtZSc6ICdkYXRhJyxcbiAgICAgICAgJ3R5cGUnOiAndGVuc29ycydcbiAgICAgIH1cbiAgICBdLFxuICAgICdhdHRycyc6IFtcbiAgICAgIHtcbiAgICAgICAgJ3RmTmFtZSc6ICdtZXNzYWdlJyxcbiAgICAgICAgJ25hbWUnOiAnbWVzc2FnZScsXG4gICAgICAgICd0eXBlJzogJ3N0cmluZydcbiAgICAgIH0sXG4gICAgICB7XG4gICAgICAgICd0Zk5hbWUnOiAnZmlyc3RfbicsXG4gICAgICAgICduYW1lJzogJ2ZpcnN0TicsXG4gICAgICAgICd0eXBlJzogJ251bWJlcicsXG4gICAgICAgICdub3RTdXBwb3J0ZWQnOiB0cnVlXG4gICAgICB9LFxuICAgICAge1xuICAgICAgICAndGZOYW1lJzogJ3N1bW1hcml6ZScsXG4gICAgICAgICduYW1lJzogJ3N1bW1hcml6ZScsXG4gICAgICAgICd0eXBlJzogJ251bWJlcicsXG4gICAgICAgICdkZWZhdWx0VmFsdWUnOiAzXG4gICAgICB9XG4gICAgXVxuICB9LFxuICB7XG4gICAgJ3RmT3BOYW1lJzogJ05vT3AnLFxuICAgICdjYXRlZ29yeSc6ICdncmFwaCcsXG4gICAgJ2lucHV0cyc6IFtdXG4gIH0sXG4gIHtcbiAgICAndGZPcE5hbWUnOiAnU3RvcEdyYWRpZW50JyxcbiAgICAnY2F0ZWdvcnknOiAnZ3JhcGgnLFxuICAgICdpbnB1dHMnOiBbXG4gICAgICB7XG4gICAgICAgICdzdGFydCc6IDAsXG4gICAgICAgICduYW1lJzogJ3gnLFxuICAgICAgICAndHlwZSc6ICd0ZW5zb3InXG4gICAgICB9XG4gICAgXVxuICB9LFxuICB7XG4gICAgJ3RmT3BOYW1lJzogJ0Zha2VRdWFudFdpdGhNaW5NYXhWYXJzJyxcbiAgICAnY2F0ZWdvcnknOiAnZ3JhcGgnLFxuICAgICdpbnB1dHMnOiBbXG4gICAgICB7XG4gICAgICAgICdzdGFydCc6IDAsXG4gICAgICAgICduYW1lJzogJ3gnLFxuICAgICAgICAndHlwZSc6ICd0ZW5zb3InXG4gICAgICB9XG4gICAgXSxcbiAgICAnYXR0cnMnOiBbXG4gICAgICB7XG4gICAgICAgICd0Zk5hbWUnOiAnbWluJyxcbiAgICAgICAgJ25hbWUnOiAnbWluJyxcbiAgICAgICAgJ3R5cGUnOiAnbnVtYmVyJ1xuICAgICAgfSxcbiAgICAgIHtcbiAgICAgICAgJ3RmTmFtZSc6ICdtYXgnLFxuICAgICAgICAnbmFtZSc6ICdtYXgnLFxuICAgICAgICAndHlwZSc6ICdudW1iZXInXG4gICAgICB9XG4gICAgXVxuICB9XG5dO1xuIl19","/**\n * @license\n * Copyright 2022 Google LLC. All Rights Reserved.\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n * =============================================================================\n */\nexport const json = [\n {\n 'tfOpName': 'HashTable',\n 'category': 'hash_table',\n 'inputs': [],\n 'attrs': [\n {\n 'tfName': 'shared_name',\n 'name': 'sharedName',\n 'type': 'string'\n },\n {\n 'tfName': 'use_node_name_sharing',\n 'name': 'useNodeNameSharing',\n 'type': 'bool'\n },\n {\n 'tfName': 'key_dtype',\n 'name': 'keyDType',\n 'type': 'dtype'\n },\n {\n 'tfName': 'value_dtype',\n 'name': 'valueDType',\n 'type': 'dtype'\n }\n ]\n },\n {\n 'tfOpName': 'HashTableV2',\n 'category': 'hash_table',\n 'inputs': [],\n 'attrs': [\n {\n 'tfName': 'shared_name',\n 'name': 'sharedName',\n 'type': 'string'\n },\n {\n 'tfName': 'use_node_name_sharing',\n 'name': 'useNodeNameSharing',\n 'type': 'bool'\n },\n {\n 'tfName': 'key_dtype',\n 'name': 'keyDType',\n 'type': 'dtype'\n },\n {\n 'tfName': 'value_dtype',\n 'name': 'valueDType',\n 'type': 'dtype'\n }\n ]\n },\n {\n 'tfOpName': 'LookupTableImport',\n 'category': 'hash_table',\n 'inputs': [\n {\n 'start': 0,\n 'name': 'tableHandle',\n 'type': 'tensor'\n },\n {\n 'start': 1,\n 'name': 'keys',\n 'type': 'tensor'\n },\n {\n 'start': 2,\n 'name': 'values',\n 'type': 'tensor'\n }\n ],\n 'attrs': [\n {\n 'tfName': 'Tin',\n 'name': 'tIn',\n 'type': 'dtype',\n 'notSupported': true\n },\n {\n 'tfName': 'Tout',\n 'name': 'tOut',\n 'type': 'dtype',\n 'notSupported': true\n }\n ]\n },\n {\n 'tfOpName': 'LookupTableImportV2',\n 'category': 'hash_table',\n 'inputs': [\n {\n 'start': 0,\n 'name': 'tableHandle',\n 'type': 'tensor'\n },\n {\n 'start': 1,\n 'name': 'keys',\n 'type': 'tensor'\n },\n {\n 'start': 2,\n 'name': 'values',\n 'type': 'tensor'\n }\n ],\n 'attrs': [\n {\n 'tfName': 'Tin',\n 'name': 'tIn',\n 'type': 'dtype',\n 'notSupported': true\n },\n {\n 'tfName': 'Tout',\n 'name': 'tOut',\n 'type': 'dtype',\n 'notSupported': true\n }\n ]\n },\n {\n 'tfOpName': 'LookupTableFind',\n 'category': 'hash_table',\n 'inputs': [\n {\n 'start': 0,\n 'name': 'tableHandle',\n 'type': 'tensor'\n },\n {\n 'start': 1,\n 'name': 'keys',\n 'type': 'tensor'\n },\n {\n 'start': 2,\n 'name': 'defaultValue',\n 'type': 'tensor'\n }\n ],\n 'attrs': [\n {\n 'tfName': 'Tin',\n 'name': 'tIn',\n 'type': 'dtype',\n 'notSupported': true\n },\n {\n 'tfName': 'Tout',\n 'name': 'tOut',\n 'type': 'dtype',\n 'notSupported': true\n }\n ]\n },\n {\n 'tfOpName': 'LookupTableFindV2',\n 'category': 'hash_table',\n 'inputs': [\n {\n 'start': 0,\n 'name': 'tableHandle',\n 'type': 'tensor'\n },\n {\n 'start': 1,\n 'name': 'keys',\n 'type': 'tensor'\n },\n {\n 'start': 2,\n 'name': 'defaultValue',\n 'type': 'tensor'\n }\n ],\n 'attrs': [\n {\n 'tfName': 'Tin',\n 'name': 'tIn',\n 'type': 'dtype',\n 'notSupported': true\n },\n {\n 'tfName': 'Tout',\n 'name': 'tOut',\n 'type': 'dtype',\n 'notSupported': true\n }\n ]\n },\n {\n 'tfOpName': 'LookupTableSize',\n 'category': 'hash_table',\n 'inputs': [\n {\n 'start': 0,\n 'name': 'tableHandle',\n 'type': 'tensor'\n }\n ]\n },\n {\n 'tfOpName': 'LookupTableSizeV2',\n 'category': 'hash_table',\n 'inputs': [\n {\n 'start': 0,\n 'name': 'tableHandle',\n 'type': 'tensor'\n }\n ]\n }\n];\n//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaGFzaF90YWJsZS5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uLy4uLy4uL3RmanMtY29udmVydGVyL3NyYy9vcGVyYXRpb25zL29wX2xpc3QvaGFzaF90YWJsZS50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFDQTs7Ozs7Ozs7Ozs7Ozs7O0dBZUc7QUFJSCxNQUFNLENBQUMsTUFBTSxJQUFJLEdBQWU7SUFDOUI7UUFDRSxVQUFVLEVBQUUsV0FBVztRQUN2QixVQUFVLEVBQUUsWUFBWTtRQUN4QixRQUFRLEVBQUUsRUFBRTtRQUNaLE9BQU8sRUFBRTtZQUNQO2dCQUNFLFFBQVEsRUFBRSxhQUFhO2dCQUN2QixNQUFNLEVBQUUsWUFBWTtnQkFDcEIsTUFBTSxFQUFFLFFBQVE7YUFDakI7WUFDRDtnQkFDRSxRQUFRLEVBQUUsdUJBQXVCO2dCQUNqQyxNQUFNLEVBQUUsb0JBQW9CO2dCQUM1QixNQUFNLEVBQUUsTUFBTTthQUNmO1lBQ0Q7Z0JBQ0UsUUFBUSxFQUFFLFdBQVc7Z0JBQ3JCLE1BQU0sRUFBRSxVQUFVO2dCQUNsQixNQUFNLEVBQUUsT0FBTzthQUNoQjtZQUNEO2dCQUNFLFFBQVEsRUFBRSxhQUFhO2dCQUN2QixNQUFNLEVBQUUsWUFBWTtnQkFDcEIsTUFBTSxFQUFFLE9BQU87YUFDaEI7U0FDRjtLQUNGO0lBQ0Q7UUFDRSxVQUFVLEVBQUUsYUFBYTtRQUN6QixVQUFVLEVBQUUsWUFBWTtRQUN4QixRQUFRLEVBQUUsRUFBRTtRQUNaLE9BQU8sRUFBRTtZQUNQO2dCQUNFLFFBQVEsRUFBRSxhQUFhO2dCQUN2QixNQUFNLEVBQUUsWUFBWTtnQkFDcEIsTUFBTSxFQUFFLFFBQVE7YUFDakI7WUFDRDtnQkFDRSxRQUFRLEVBQUUsdUJBQXVCO2dCQUNqQyxNQUFNLEVBQUUsb0JBQW9CO2dCQUM1QixNQUFNLEVBQUUsTUFBTTthQUNmO1lBQ0Q7Z0JBQ0UsUUFBUSxFQUFFLFdBQVc7Z0JBQ3JCLE1BQU0sRUFBRSxVQUFV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RSxDQUFDO2dCQUNWLE1BQU0sRUFBRSxNQUFNO2dCQUNkLE1BQU0sRUFBRSxRQUFRO2FBQ2pCO1lBQ0Q7Z0JBQ0UsT0FBTyxFQUFFLENBQUM7Z0JBQ1YsTUFBTSxFQUFFLGNBQWM7Z0JBQ3RCLE1BQU0sRUFBRSxRQUFRO2FBQ2pCO1NBQ0Y7UUFDRCxPQUFPLEVBQUU7WUFDUDtnQkFDRSxRQUFRLEVBQUUsS0FBSztnQkFDZixNQUFNLEVBQUUsS0FBSztnQkFDYixNQUFNLEVBQUUsT0FBTztnQkFDZixjQUFjLEVBQUUsSUFBSTthQUNyQjtZQUNEO2dCQUNFLFFBQVEsRUFBRSxNQUFNO2dCQUNoQixNQUFNLEVBQUUsTUFBTTtnQkFDZCxNQUFNLEVBQUUsT0FBTztnQkFDZixjQUFjLEVBQUUsSUFBSTthQUNyQjtTQUNGO0tBQ0Y7SUFDRDtRQUNFLFVBQVUsRUFBRSxpQkFBaUI7UUFDN0IsVUFBVSxFQUFFLFlBQVk7UUFDeEIsUUFBUSxFQUFFO1lBQ1I7Z0JBQ0UsT0FBTyxFQUFFLENBQUM7Z0JBQ1YsTUFBTSxFQUFFLGFBQWE7Z0JBQ3JCLE1BQU0sRUFBRSxRQUFRO2FBQ2pCO1NBQ0Y7S0FDRjtJQUNEO1FBQ0UsVUFBVSxFQUFFLG1CQUFtQjtRQUMvQixVQUFVLEVBQUUsWUFBWTtRQUN4QixRQUFRLEVBQUU7WUFDUjtnQkFDRSxPQUFPLEVBQUUsQ0FBQztnQkFDVixNQUFNLEVBQUUsYUFBYTtnQkFDckIsTUFBTSxFQUFFLFFBQVE7YUFDakI7U0FDRjtLQUNGO0NBQ0YsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbIlxuLyoqXG4gKiBAbGljZW5zZVxuICogQ29weXJpZ2h0IDIwMjIgR29vZ2xlIExMQy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC5cbiAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSBcIkxpY2Vuc2VcIik7XG4gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuXG4gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXRcbiAqXG4gKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjBcbiAqXG4gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlXG4gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiBcIkFTIElTXCIgQkFTSVMsXG4gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC5cbiAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmRcbiAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLlxuICogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbiAqL1xuXG5pbXBvcnQge09wTWFwcGVyfSBmcm9tICcuLi90eXBlcyc7XG5cbmV4cG9ydCBjb25zdCBqc29uOiBPcE1hcHBlcltdID0gW1xuICB7XG4gICAgJ3RmT3BOYW1lJzogJ0hhc2hUYWJsZScsXG4gICAgJ2NhdGVnb3J5JzogJ2hhc2hfdGFibGUnLFxuICAgICdpbnB1dHMnOiBbXSxcbiAgICAnYXR0cnMnOiBbXG4gICAgICB7XG4gICAgICAgICd0Zk5hbWUnOiAnc2hhcmVkX25hbWUnLFxuICAgICAgICAnbmFtZSc6ICdzaGFyZWROYW1lJyxcbiAgICAgICAgJ3R5cGUnOiAnc3RyaW5nJ1xuICAgICAgfSxcbiAgICAgIHtcbiAgICAgICAgJ3RmTmFtZSc6ICd1c2Vfbm9kZV9uYW1lX3NoYXJpbmcnLFxuICAgICAgICAnbmFtZSc6ICd1c2VOb2RlTmFtZVNoYXJpbmcnLFxuICAgICAgICAndHlwZSc6ICdib29sJ1xuICAgICAgfSxcbiAgICAgIHtcbiAgICAgICAgJ3RmTmFtZSc6ICdrZXlfZHR5cGUnLFxuICAgICAgICAnbmFtZSc6ICdrZXlEVHlwZScsXG4gICAgICAgICd0eXBlJzogJ2R0eXBlJ1xuICAgICAgfSxcbiAgICAgIHtcbiAgICAgICAgJ3RmTmFtZSc6ICd2YWx1ZV9kdHlwZScsXG4gICAgICAgICduYW1lJzogJ3ZhbHVlRFR5cGUnLFxuICAgICAgICAndHlwZSc6ICdkdHlwZSdcbiAgICAgIH1cbiAgICBdXG4gIH0sXG4gIHtcbiAgICAndGZPcE5hbWUnOiAnSGFzaFRhYmxlVjInLFxuICAgICdjYXRlZ29yeSc6ICdoYXNoX3RhYmxlJyxcbiAgICAnaW5wdXRzJzogW10sXG4gICAgJ2F0dHJzJzogW1xuICAgICAge1xuICAgICAgICAndGZOYW1lJzogJ3NoYXJlZF9uYW1lJyxcbiAgICAgICAgJ25hbWUnOiAnc2hhcmVkTmFtZScsXG4gICAgICAgICd0eXBlJzogJ3N0cmluZydcbiAgICAgIH0sXG4gICAgICB7XG4gICAgICAgICd0Zk5hbWUnOiAndXNlX25vZGVfbmFtZV9zaGFyaW5nJyxcbiAgICAgICAgJ25hbWUnOiAndXNlTm9kZU5hbWVTaGFyaW5nJyxcbiAgICAgICAgJ3R5cGUnOiAnYm9vbCdcbiAgICAgIH0sXG4gICAgICB7XG4gICAgICAgICd0Zk5hbWUnOiAna2V5X2R0eXBlJyxcbiAgICAgICAgJ25hbWUnOiAna2V5RFR5cGUnLFxuICAgICAgICAndHlwZSc6ICdkdHlwZSdcbiAgICAgIH0sXG4gICAgICB7XG4gICAgICAgICd0Zk5hbWUnOiAndmFsdWVfZHR5cGUnLFxuICAgICAgICAnbmFtZSc6ICd2YWx1ZURUeXBlJyxcbiAgICAgICAgJ3R5cGUnOiAnZHR5cGUnXG4gICAgICB9XG4gICAgXVxuICB9LFxuICB7XG4gICAgJ3RmT3BOYW1lJzogJ0xvb2t1cFRhYmxlSW1wb3J0JyxcbiAgICAnY2F0ZWdvcnknOiAnaGFzaF90YWJsZScsXG4gICAgJ2lucHV0cyc6IFtcbiAgICAgIHtcbiAgICAgICAgJ3N0YXJ0JzogMCxcbiAgICAgICAgJ25hbWUnOiAndGFibGVIYW5kbGUnLFxuICAgICAgICAndHlwZSc6ICd0ZW5zb3InXG4gICAgICB9LFxuICAgICAge1xuICAgICAgICAnc3RhcnQnOiAxLFxuICAgICAgICAnbmFtZSc6ICdrZXlzJyxcbiAgICAgICAgJ3R5cGUnOiAndGVuc29yJ1xuICAgICAgfSxcbiAgICAgIHtcbiAgICAgICAgJ3N0YXJ0JzogMixcbiAgICAgICAgJ25hbWUnOiAndmFsdWVzJyxcbiAgICAgICAgJ3R5cGUnOiAndGVuc29yJ1xuICAgICAgfVxuICAgIF0sXG4gICAgJ2F0dHJzJzogW1xuICAgICAge1xuICAgICAgICAndGZOYW1lJzogJ1RpbicsXG4gICAgICAgICduYW1lJzogJ3RJbicsXG4gICAgICAgICd0eXBlJzogJ2R0eXBlJyxcbiAgICAgICAgJ25vdFN1cHBvcnRlZCc6IHRydWVcbiAgICAgIH0sXG4gICAgICB7XG4gICAgICAgICd0Zk5hbWUnOiAnVG91dCcsXG4gICAgICAgICduYW1lJzogJ3RPdXQnLFxuICAgICAgICAndHlwZSc6ICdkdHlwZScsXG4gICAgICAgICdub3RTdXBwb3J0ZWQnOiB0cnVlXG4gICAgICB9XG4gICAgXVxuICB9LFxuICB7XG4gICAgJ3RmT3BOYW1lJzogJ0xvb2t1cFRhYmxlSW1wb3J0VjInLFxuICAgICdjYXRlZ29yeSc6ICdoYXNoX3RhYmxlJyxcbiAgICAnaW5wdXRzJzogW1xuICAgICAge1xuICAgICAgICAnc3RhcnQnOiAwLFxuICAgICAgICAnbmFtZSc6ICd0YWJsZUhhbmRsZScsXG4gICAgICAgICd0eXBlJzogJ3RlbnNvcidcbiAgICAgIH0sXG4gICAgICB7XG4gICAgICAgICdzdGFydCc6IDEsXG4gICAgICAgICduYW1lJzogJ2tleXMnLFxuICAgICAgICAndHlwZSc6ICd0ZW5zb3InXG4gICAgICB9LFxuICAgICAge1xuICAgICAgICAnc3RhcnQnOiAyLFxuICAgICAgICAnbmFtZSc6ICd2YWx1ZXMnLFxuICAgICAgICAndHlwZSc6ICd0ZW5zb3InXG4gICAgICB9XG4gICAgXSxcbiAgICAnYXR0cnMnOiBbXG4gICAgICB7XG4gICAgICAgICd0Zk5hbWUnOiAnVGluJyxcbiAgICAgICAgJ25hbWUnOiAndEluJyxcbiAgICAgICAgJ3R5cGUnOiAnZHR5cGUnLFxuICAgICAgICAnbm90U3VwcG9ydGVkJzogdHJ1ZVxuICAgICAgfSxcbiAgICAgIHtcbiAgICAgICAgJ3RmTmFtZSc6ICdUb3V0JyxcbiAgICAgICAgJ25hbWUnOiAndE91dCcsXG4gICAgICAgICd0eXBlJzogJ2R0eXBlJyxcbiAgICAgICAgJ25vdFN1cHBvcnRlZCc6IHRydWVcbiAgICAgIH1cbiAgICBdXG4gIH0sXG4gIHtcbiAgICAndGZPcE5hbWUnOiAnTG9va3VwVGFibGVGaW5kJyxcbiAgICAnY2F0ZWdvcnknOiAnaGFzaF90YWJsZScsXG4gICAgJ2lucHV0cyc6IFtcbiAgICAgIHtcbiAgICAgICAgJ3N0YXJ0JzogMCxcbiAgICAgICAgJ25hbWUnOiAndGFibGVIYW5kbGUnLFxuICAgICAgICAndHlwZSc6ICd0ZW5zb3InXG4gICAgICB9LFxuICAgICAge1xuICAgICAgICAnc3RhcnQnOiAxLFxuICAgICAgICAnbmFtZSc6ICdrZXlzJyxcbiAgICAgICAgJ3R5cGUnOiAndGVuc29yJ1xuICAgICAgfSxcbiAgICAgIHtcbiAgICAgICAgJ3N0YXJ0JzogMixcbiAgICAgICAgJ25hbWUnOiAnZGVmYXVsdFZhbHVlJyxcbiAgICAgICAgJ3R5cGUnOiAndGVuc29yJ1xuICAgICAgfVxuICAgIF0sXG4gICAgJ2F0dHJzJzogW1xuICAgICAge1xuICAgICAgICAndGZOYW1lJzogJ1RpbicsXG4gICAgICAgICduYW1lJzogJ3RJbicsXG4gICAgICAgICd0eXBlJzogJ2R0eXBlJyxcbiAgICAgICAgJ25vdFN1cHBvcnRlZCc6IHRydWVcbiAgICAgIH0sXG4gICAgICB7XG4gICAgICAgICd0Zk5hbWUnOiAnVG91dCcsXG4gICAgICAgICduYW1lJzogJ3RPdXQnLFxuICAgICAgICAndHlwZSc6ICdkdHlwZScsXG4gICAgICAgICdub3RTdXBwb3J0ZWQnOiB0cnVlXG4gICAgICB9XG4gICAgXVxuICB9LFxuICB7XG4gICAgJ3RmT3BOYW1lJzogJ0xvb2t1cFRhYmxlRmluZFYyJyxcbiAgICAnY2F0ZWdvcnknOiAnaGFzaF90YWJsZScsXG4gICAgJ2lucHV0cyc6IFtcbiAgICAgIHtcbiAgICAgICAgJ3N0YXJ0JzogMCxcbiAgICAgICAgJ25hbWUnOiAndGFibGVIYW5kbGUnLFxuICAgICAgICAndHlwZSc6ICd0ZW5zb3InXG4gICAgICB9LFxuICAgICAge1xuICAgICAgICAnc3RhcnQnOiAxLFxuICAgICAgICAnbmFtZSc6ICdrZXlzJyxcbiAgICAgICAgJ3R5cGUnOiAndGVuc29yJ1xuICAgICAgfSxcbiAgICAgIHtcbiAgICAgICAgJ3N0YXJ0JzogMixcbiAgICAgICAgJ25hbWUnOiAnZGVmYXVsdFZhbHVlJyxcbiAgICAgICAgJ3R5cGUnOiAndGVuc29yJ1xuICAgICAgfVxuICAgIF0sXG4gICAgJ2F0dHJzJzogW1xuICAgICAge1xuICAgICAgICAndGZOYW1lJzogJ1RpbicsXG4gICAgICAgICduYW1lJzogJ3RJbicsXG4gICAgICAgICd0eXBlJzogJ2R0eXBlJyxcbiAgICAgICAgJ25vdFN1cHBvcnRlZCc6IHRydWVcbiAgICAgIH0sXG4gICAgICB7XG4gICAgICAgICd0Zk5hbWUnOiAnVG91dCcsXG4gICAgICAgICduYW1lJzogJ3RPdXQnLFxuICAgICAgICAndHlwZSc6ICdkdHlwZScsXG4gICAgICAgICdub3RTdXBwb3J0ZWQnOiB0cnVlXG4gICAgICB9XG4gICAgXVxuICB9LFxuICB7XG4gICAgJ3RmT3BOYW1lJzogJ0xvb2t1cFRhYmxlU2l6ZScsXG4gICAgJ2NhdGVnb3J5JzogJ2hhc2hfdGFibGUnLFxuICAgICdpbnB1dHMnOiBbXG4gICAgICB7XG4gICAgICAgICdzdGFydCc6IDAsXG4gICAgICAgICduYW1lJzogJ3RhYmxlSGFuZGxlJyxcbiAgICAgICAgJ3R5cGUnOiAndGVuc29yJ1xuICAgICAgfVxuICAgIF1cbiAgfSxcbiAge1xuICAgICd0Zk9wTmFtZSc6ICdMb29rdXBUYWJsZVNpemVWMicsXG4gICAgJ2NhdGVnb3J5JzogJ2hhc2hfdGFibGUnLFxuICAgICdpbnB1dHMnOiBbXG4gICAgICB7XG4gICAgICAgICdzdGFydCc6IDAsXG4gICAgICAgICduYW1lJzogJ3RhYmxlSGFuZGxlJyxcbiAgICAgICAgJ3R5cGUnOiAndGVuc29yJ1xuICAgICAgfVxuICAgIF1cbiAgfVxuXTtcbiJdfQ==","/**\n * @license\n * Copyright 2022 Google LLC. All Rights Reserved.\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n * =============================================================================\n */\nexport const json = [\n {\n 'tfOpName': 'ResizeBilinear',\n 'category': 'image',\n 'inputs': [\n {\n 'start': 0,\n 'name': 'images',\n 'type': 'tensor'\n },\n {\n 'start': 1,\n 'name': 'size',\n 'type': 'number[]'\n }\n ],\n 'attrs': [\n {\n 'tfName': 'align_corners',\n 'name': 'alignCorners',\n 'type': 'bool'\n },\n {\n 'tfName': 'half_pixel_centers',\n 'name': 'halfPixelCenters',\n 'type': 'bool'\n },\n {\n 'tfName': 'T',\n 'name': 'dtype',\n 'type': 'dtype',\n 'notSupported': true\n }\n ]\n },\n {\n 'tfOpName': 'ResizeNearestNeighbor',\n 'category': 'image',\n 'inputs': [\n {\n 'start': 0,\n 'name': 'images',\n 'type': 'tensor'\n },\n {\n 'start': 1,\n 'name': 'size',\n 'type': 'number[]'\n }\n ],\n 'attrs': [\n {\n 'tfName': 'align_corners',\n 'name': 'alignCorners',\n 'type': 'bool'\n },\n {\n 'tfName': 'half_pixel_centers',\n 'name': 'halfPixelCenters',\n 'type': 'bool'\n },\n {\n 'tfName': 'T',\n 'name': 'dtype',\n 'type': 'dtype',\n 'notSupported': true\n }\n ]\n },\n {\n 'tfOpName': 'CropAndResize',\n 'category': 'image',\n 'inputs': [\n {\n 'start': 0,\n 'name': 'image',\n 'type': 'tensor'\n },\n {\n 'start': 1,\n 'name': 'boxes',\n 'type': 'tensor'\n },\n {\n 'start': 2,\n 'name': 'boxInd',\n 'type': 'tensor'\n },\n {\n 'start': 3,\n 'name': 'cropSize',\n 'type': 'number[]'\n }\n ],\n 'attrs': [\n {\n 'tfName': 'method',\n 'name': 'method',\n 'type': 'string'\n },\n {\n 'tfName': 'extrapolation_value',\n 'name': 'extrapolationValue',\n 'type': 'number'\n }\n ]\n },\n {\n 'tfOpName': 'ImageProjectiveTransformV3',\n 'category': 'image',\n 'inputs': [\n {\n 'start': 0,\n 'name': 'images',\n 'type': 'tensor'\n },\n {\n 'start': 1,\n 'name': 'transforms',\n 'type': 'tensor'\n },\n {\n 'start': 2,\n 'name': 'outputShape',\n 'type': 'number[]'\n },\n {\n 'start': 3,\n 'name': 'fillValue',\n 'type': 'number'\n }\n ],\n 'attrs': [\n {\n 'tfName': 'interpolation',\n 'name': 'interpolation',\n 'type': 'string'\n },\n {\n 'tfName': 'fill_mode',\n 'name': 'fillMode',\n 'type': 'string'\n }\n ]\n }\n];\n//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW1hZ2UuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi8uLi8uLi90ZmpzLWNvbnZlcnRlci9zcmMvb3BlcmF0aW9ucy9vcF9saXN0L2ltYWdlLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUNBOzs7Ozs7Ozs7Ozs7Ozs7R0FlRztBQUlILE1BQU0sQ0FBQyxNQUFNLElBQUksR0FBZTtJQUM5QjtRQUNFLFVBQVUsRUFBRSxnQkFBZ0I7UUFDNUIsVUFBVSxFQUFFLE9BQU87UUFDbkIsUUFBUSxFQUFFO1lBQ1I7Z0JBQ0UsT0FBTyxFQUFFLENBQUM7Z0JBQ1YsTUFBTSxFQUFFLFFBQVE7Z0JBQ2hCLE1BQU0sRUFBRSxRQUFRO2FBQ2pCO1lBQ0Q7Z0JBQ0UsT0FBTyxFQUFFLENBQUM7Z0JBQ1YsTUFBTSxFQUFFLE1BQU07Z0JBQ2QsTUFBTSxFQUFFLFVBQVU7YUFDbkI7U0FDRjtRQUNELE9BQU8sRUFBRTtZQUNQO2dCQUNFLFFBQVEsRUFBRSxlQUFlO2dCQUN6QixNQUFNLEVBQUUsY0FBYztnQkFDdEIsTUFBTSxFQUFFLE1BQU07YUFDZjtZQUNEO2dCQUNFLFFBQVEsRUFBRSxvQkFBb0I7Z0JBQzlCLE1BQU0sRUFBRSxrQkFBa0I7Z0JBQzFCLE1BQU0sRUFBRSxNQUFNO2FBQ2Y7WUFDRDtnQkFDRSxRQUFRLEVBQUUsR0FBRztnQkFDYixNQUFNLEVBQUUsT0FBTztnQkFDZixNQUFNLEVBQUUsT0FBTztnQkFDZixjQUFjLEVBQUUsSUFBSTthQUNyQjtTQUNGO0tBQ0Y7SUFDRDtRQUNFLFVBQVUsRUFBRSx1QkFBdUI7UUFDbkMsVUFBVSxFQUFFLE9BQU87UUFDbkIsUUFBUSxFQUFFO1lBQ1I7Z0JBQ0UsT0FBTyxFQUFFLENBQUM7Z0JBQ1YsTUFBTSxFQUFFLFFBQVE7Z0JBQ2hCLE1BQU0sRUFBRSxRQUFRO2FBQ2pCO1lBQ0Q7Z0JBQ0UsT0FBTyxFQUFFLENBQUM7Z0JBQ1YsTUFBTSxFQUFFLE1BQU07Z0JBQ2QsTUFBTSxFQUFFLFVBQVU7YUFDbkI7U0FDRjtRQUNELE9BQU8sRUFBRTtZQUNQO2dCQUNFLFFBQVEsRUFBRSxlQUFlO2dCQUN6QixNQUFNLEVBQUUsY0FBYztnQkFDdEIsTUFBTSxFQUFFLE1BQU07YUFDZjtZQUNEO2dCQUNFLFFBQVEsRUFBRSxvQkFBb0I7Z0JBQzlCLE1BQU0sRUFBRSxrQkFBa0I7Z0JBQzFCLE1BQU0sRUFBRSxNQUFNO2FBQ2Y7WUFDRDtnQkFDRSxRQUFRLEVBQUUsR0FBRztnQkFDYixNQUFNLEVBQUUsT0FBTztnQkFDZixNQUFNLEVBQUUsT0FBTztnQkFDZixjQUFjLEVBQUUsSUFBSTthQUNyQjtTQUNGO0tBQ0Y7SUFDRDtRQUNFLFVBQVUsRUFBRSxlQUFlO1FBQzNCLFVBQVUsRUFBRSxPQUFPO1FBQ25CLFFBQVEsRUFBRTtZQUNSO2dCQUNFLE9BQU8sRUFBRSxDQUFDO2dCQUNWLE1BQU0sRUFBRSxPQUFPO2dCQUNmLE1BQU0sRUFBRSxRQUFRO2FBQ2pCO1lBQ0Q7Z0JBQ0UsT0FBTyxFQUFFLENBQUM7Z0JBQ1YsTUFBTSxFQUFFLE9BQU87Z0JBQ2YsTUFBTSxFQUFFLFFBQVE7YUFDakI7WUFDRDtnQkFDRSxPQUFPLEVBQUUsQ0FBQztnQkFDVixNQUFNLEVBQUUsUUFBUTtnQkFDaEIsTUFBTSxFQUFFLFFBQVE7YUFDakI7WUFDRDtnQkFDRSxPQUFPLEVBQUUsQ0FBQztnQkFDVixNQUFNLEVBQUUsVUFBVTtnQkFDbEIsTUFBTSxFQUFFLFVBQVU7YUFDbkI7U0FDRjtRQUNELE9BQU8sRUFBRTtZQUNQO2dCQUNFLFFBQVEsRUFBRSxRQUFRO2dCQUNsQixNQUFNLEVBQUUsUUFBUTtnQkFDaEIsTUFBTSxFQUFFLFFBQVE7YUFDakI7WUFDRDtnQkFDRSxRQUFRLEVBQUUscUJBQXFCO2dCQUMvQixNQUFNLEVBQUUsb0JBQW9CO2dCQUM1QixNQUFNLEVBQUUsUUFBUTthQUNqQjtTQUNGO0tBQ0Y7SUFDRDtRQUNFLFVBQVUsRUFBRSw0QkFBNEI7UUFDeEMsVUFBVSxFQUFFLE9BQU87UUFDbkIsUUFBUSxFQUFFO1lBQ1I7Z0JBQ0UsT0FBTyxFQUFFLENBQUM7Z0JBQ1YsTUFBTSxFQUFFLFFBQVE7Z0JBQ2hCLE1BQU0sRUFBRSxRQUFRO2FBQ2pCO1lBQ0Q7Z0JBQ0UsT0FBTyxFQUFFLENBQUM7Z0JBQ1YsTUFBTSxFQUFFLFlBQVk7Z0JBQ3BCLE1BQU0sRUFBRSxRQUFRO2FBQ2pCO1lBQ0Q7Z0JBQ0UsT0FBTyxFQUFFLENBQUM7Z0JBQ1YsTUFBTSxFQUFFLGFBQWE7Z0JBQ3JCLE1BQU0sRUFBRSxVQUFVO2FBQ25CO1lBQ0Q7Z0JBQ0UsT0FBTyxFQUFFLENBQUM7Z0JBQ1YsTUFBTSxFQUFFLFdBQVc7Z0JBQ25CLE1BQU0sRUFBRSxRQUFRO2FBQ2pCO1NBQ0Y7UUFDRCxPQUFPLEVBQUU7WUFDUDtnQkFDRSxRQUFRLEVBQUUsZUFBZTtnQkFDekIsTUFBTSxFQUFFLGVBQWU7Z0JBQ3ZCLE1BQU0sRUFBRSxRQUFRO2FBQ2pCO1lBQ0Q7Z0JBQ0UsUUFBUSxFQUFFLFdBQVc7Z0JBQ3JCLE1BQU0sRUFBRSxVQUFVO2dCQUNsQixNQUFNLEVBQUUsUUFBUTthQUNqQjtTQUNGO0tBQ0Y7Q0FDRixDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiXG4vKipcbiAqIEBsaWNlbnNlXG4gKiBDb3B5cmlnaHQgMjAyMiBHb29nbGUgTExDLiBBbGwgUmlnaHRzIFJlc2VydmVkLlxuICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlIFwiTGljZW5zZVwiKTtcbiAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS5cbiAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdFxuICpcbiAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMFxuICpcbiAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmVcbiAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuIFwiQVMgSVNcIiBCQVNJUyxcbiAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLlxuICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZFxuICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuXG4gKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuICovXG5cbmltcG9ydCB7T3BNYXBwZXJ9IGZyb20gJy4uL3R5cGVzJztcblxuZXhwb3J0IGNvbnN0IGpzb246IE9wTWFwcGVyW10gPSBbXG4gIHtcbiAgICAndGZPcE5hbWUnOiAnUmVzaXplQmlsaW5lYXInLFxuICAgICdjYXRlZ29yeSc6ICdpbWFnZScsXG4gICAgJ2lucHV0cyc6IFtcbiAgICAgIHtcbiAgICAgICAgJ3N0YXJ0JzogMCxcbiAgICAgICAgJ25hbWUnOiAnaW1hZ2VzJyxcbiAgICAgICAgJ3R5cGUnOiAndGVuc29yJ1xuICAgICAgfSxcbiAgICAgIHtcbiAgICAgICAgJ3N0YXJ0JzogMSxcbiAgICAgICAgJ25hbWUnOiAnc2l6ZScsXG4gICAgICAgICd0eXBlJzogJ251bWJlcltdJ1xuICAgICAgfVxuICAgIF0sXG4gICAgJ2F0dHJzJzogW1xuICAgICAge1xuICAgICAgICAndGZOYW1lJzogJ2FsaWduX2Nvcm5lcnMnLFxuICAgICAgICAnbmFtZSc6ICdhbGlnbkNvcm5lcnMnLFxuICAgICAgICAndHlwZSc6ICdib29sJ1xuICAgICAgfSxcbiAgICAgIHtcbiAgICAgICAgJ3RmTmFtZSc6ICdoYWxmX3BpeGVsX2NlbnRlcnMnLFxuICAgICAgICAnbmFtZSc6ICdoYWxmUGl4ZWxDZW50ZXJzJyxcbiAgICAgICAgJ3R5cGUnOiAnYm9vbCdcbiAgICAgIH0sXG4gICAgICB7XG4gICAgICAgICd0Zk5hbWUnOiAnVCcsXG4gICAgICAgICduYW1lJzogJ2R0eXBlJyxcbiAgICAgICAgJ3R5cGUnOiAnZHR5cGUnLFxuICAgICAgICAnbm90U3VwcG9ydGVkJzogdHJ1ZVxuICAgICAgfVxuICAgIF1cbiAgfSxcbiAge1xuICAgICd0Zk9wTmFtZSc6ICdSZXNpemVOZWFyZXN0TmVpZ2hib3InLFxuICAgICdjYXRlZ29yeSc6ICdpbWFnZScsXG4gICAgJ2lucHV0cyc6IFtcbiAgICAgIHtcbiAgICAgICAgJ3N0YXJ0JzogMCxcbiAgICAgICAgJ25hbWUnOiAnaW1hZ2VzJyxcbiAgICAgICAgJ3R5cGUnOiAndGVuc29yJ1xuICAgICAgfSxcbiAgICAgIHtcbiAgICAgICAgJ3N0YXJ0JzogMSxcbiAgICAgICAgJ25hbWUnOiAnc2l6ZScsXG4gICAgICAgICd0eXBlJzogJ251bWJlcltdJ1xuICAgICAgfVxuICAgIF0sXG4gICAgJ2F0dHJzJzogW1xuICAgICAge1xuICAgICAgICAndGZOYW1lJzogJ2FsaWduX2Nvcm5lcnMnLFxuICAgICAgICAnbmFtZSc6ICdhbGlnbkNvcm5lcnMnLFxuICAgICAgICAndHlwZSc6ICdib29sJ1xuICAgICAgfSxcbiAgICAgIHtcbiAgICAgICAgJ3RmTmFtZSc6ICdoYWxmX3BpeGVsX2NlbnRlcnMnLFxuICAgICAgICAnbmFtZSc6ICdoYWxmUGl4ZWxDZW50ZXJzJyxcbiAgICAgICAgJ3R5cGUnOiAnYm9vbCdcbiAgICAgIH0sXG4gICAgICB7XG4gICAgICAgICd0Zk5hbWUnOiAnVCcsXG4gICAgICAgICduYW1lJzogJ2R0eXBlJyxcbiAgICAgICAgJ3R5cGUnOiAnZHR5cGUnLFxuICAgICAgICAnbm90U3VwcG9ydGVkJzogdHJ1ZVxuICAgICAgfVxuICAgIF1cbiAgfSxcbiAge1xuICAgICd0Zk9wTmFtZSc6ICdDcm9wQW5kUmVzaXplJyxcbiAgICAnY2F0ZWdvcnknOiAnaW1hZ2UnLFxuICAgICdpbnB1dHMnOiBbXG4gICAgICB7XG4gICAgICAgICdzdGFydCc6IDAsXG4gICAgICAgICduYW1lJzogJ2ltYWdlJyxcbiAgICAgICAgJ3R5cGUnOiAndGVuc29yJ1xuICAgICAgfSxcbiAgICAgIHtcbiAgICAgICAgJ3N0YXJ0JzogMSxcbiAgICAgICAgJ25hbWUnOiAnYm94ZXMnLFxuICAgICAgICAndHlwZSc6ICd0ZW5zb3InXG4gICAgICB9LFxuICAgICAge1xuICAgICAgICAnc3RhcnQnOiAyLFxuICAgICAgICAnbmFtZSc6ICdib3hJbmQnLFxuICAgICAgICAndHlwZSc6ICd0ZW5zb3InXG4gICAgICB9LFxuICAgICAge1xuICAgICAgICAnc3RhcnQnOiAzLFxuICAgICAgICAnbmFtZSc6ICdjcm9wU2l6ZScsXG4gICAgICAgICd0eXBlJzogJ251bWJlcltdJ1xuICAgICAgfVxuICAgIF0sXG4gICAgJ2F0dHJzJzogW1xuICAgICAge1xuICAgICAgICAndGZOYW1lJzogJ21ldGhvZCcsXG4gICAgICAgICduYW1lJzogJ21ldGhvZCcsXG4gICAgICAgICd0eXBlJzogJ3N0cmluZydcbiAgICAgIH0sXG4gICAgICB7XG4gICAgICAgICd0Zk5hbWUnOiAnZXh0cmFwb2xhdGlvbl92YWx1ZScsXG4gICAgICAgICduYW1lJzogJ2V4dHJhcG9sYXRpb25WYWx1ZScsXG4gICAgICAgICd0eXBlJzogJ251bWJlcidcbiAgICAgIH1cbiAgICBdXG4gIH0sXG4gIHtcbiAgICAndGZPcE5hbWUnOiAnSW1hZ2VQcm9qZWN0aXZlVHJhbnNmb3JtVjMnLFxuICAgICdjYXRlZ29yeSc6ICdpbWFnZScsXG4gICAgJ2lucHV0cyc6IFtcbiAgICAgIHtcbiAgICAgICAgJ3N0YXJ0JzogMCxcbiAgICAgICAgJ25hbWUnOiAnaW1hZ2VzJyxcbiAgICAgICAgJ3R5cGUnOiAndGVuc29yJ1xuICAgICAgfSxcbiAgICAgIHtcbiAgICAgICAgJ3N0YXJ0JzogMSxcbiAgICAgICAgJ25hbWUnOiAndHJhbnNmb3JtcycsXG4gICAgICAgICd0eXBlJzogJ3RlbnNvcidcbiAgICAgIH0sXG4gICAgICB7XG4gICAgICAgICdzdGFydCc6IDIsXG4gICAgICAgICduYW1lJzogJ291dHB1dFNoYXBlJyxcbiAgICAgICAgJ3R5cGUnOiAnbnVtYmVyW10nXG4gICAgICB9LFxuICAgICAge1xuICAgICAgICAnc3RhcnQnOiAzLFxuICAgICAgICAnbmFtZSc6ICdmaWxsVmFsdWUnLFxuICAgICAgICAndHlwZSc6ICdudW1iZXInXG4gICAgICB9XG4gICAgXSxcbiAgICAnYXR0cnMnOiBbXG4gICAgICB7XG4gICAgICAgICd0Zk5hbWUnOiAnaW50ZXJwb2xhdGlvbicsXG4gICAgICAgICduYW1lJzogJ2ludGVycG9sYXRpb24nLFxuICAgICAgICAndHlwZSc6ICdzdHJpbmcnXG4gICAgICB9LFxuICAgICAge1xuICAgICAgICAndGZOYW1lJzogJ2ZpbGxfbW9kZScsXG4gICAgICAgICduYW1lJzogJ2ZpbGxNb2RlJyxcbiAgICAgICAgJ3R5cGUnOiAnc3RyaW5nJ1xuICAgICAgfVxuICAgIF1cbiAgfVxuXTtcbiJdfQ==","/**\n * @license\n * Copyright 2022 Google LLC. All Rights Reserved.\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n * =============================================================================\n */\nexport const json = [\n {\n 'tfOpName': 'Equal',\n 'category': 'logical',\n 'inputs': [\n {\n 'start': 0,\n 'name': 'a',\n 'type': 'tensor'\n },\n {\n 'start': 1,\n 'name': 'b',\n 'type': 'tensor'\n }\n ],\n 'attrs': [\n {\n 'tfName': 'T',\n 'name': 'dtype',\n 'type': 'dtype',\n 'notSupported': true\n }\n ]\n },\n {\n 'tfOpName': 'NotEqual',\n 'category': 'logical',\n 'inputs': [\n {\n 'start': 0,\n 'name': 'a',\n 'type': 'tensor'\n },\n {\n 'start': 1,\n 'name': 'b',\n 'type': 'tensor'\n }\n ],\n 'attrs': [\n {\n 'tfName': 'T',\n 'name': 'dtype',\n 'type': 'dtype',\n 'notSupported': true\n }\n ]\n },\n {\n 'tfOpName': 'Greater',\n 'category': 'logical',\n 'inputs': [\n {\n 'start': 0,\n 'name': 'a',\n 'type': 'tensor'\n },\n {\n 'start': 1,\n 'name': 'b',\n 'type': 'tensor'\n }\n ],\n 'attrs': [\n {\n 'tfName': 'T',\n 'name': 'dtype',\n 'type': 'dtype',\n 'notSupported': true\n }\n ]\n },\n {\n 'tfOpName': 'GreaterEqual',\n 'category': 'logical',\n 'inputs': [\n {\n 'start': 0,\n 'name': 'a',\n 'type': 'tensor'\n },\n {\n 'start': 1,\n 'name': 'b',\n 'type': 'tensor'\n }\n ],\n 'attrs': [\n {\n 'tfName': 'T',\n 'name': 'dtype',\n 'type': 'dtype',\n 'notSupported': true\n }\n ]\n },\n {\n 'tfOpName': 'Less',\n 'category': 'logical',\n 'inputs': [\n {\n 'start': 0,\n 'name': 'a',\n 'type': 'tensor'\n },\n {\n 'start': 1,\n 'name': 'b',\n 'type': 'tensor'\n }\n ],\n 'attrs': [\n {\n 'tfName': 'T',\n 'name': 'dtype',\n 'type': 'dtype',\n 'notSupported': true\n }\n ]\n },\n {\n 'tfOpName': 'LessEqual',\n 'category': 'logical',\n 'inputs': [\n {\n 'start': 0,\n 'name': 'a',\n 'type': 'tensor'\n },\n {\n 'start': 1,\n 'name': 'b',\n 'type': 'tensor'\n }\n ],\n 'attrs': [\n {\n 'tfName': 'T',\n 'name': 'dtype',\n 'type': 'dtype',\n 'notSupported': true\n }\n ]\n },\n {\n 'tfOpName': 'LogicalAnd',\n 'category': 'logical',\n 'inputs': [\n {\n 'start': 0,\n 'name': 'a',\n 'type': 'tensor'\n },\n {\n 'start': 1,\n 'name': 'b',\n 'type': 'tensor'\n }\n ],\n 'attrs': [\n {\n 'tfName': 'T',\n 'name': 'dtype',\n 'type': 'dtype',\n 'notSupported': true\n }\n ]\n },\n {\n 'tfOpName': 'LogicalNot',\n 'category': 'logical',\n 'inputs': [\n {\n 'start': 0,\n 'name': 'a',\n 'type': 'tensor'\n }\n ],\n 'attrs': [\n {\n 'tfName': 'T',\n 'name': 'dtype',\n 'type': 'dtype',\n 'notSupported': true\n }\n ]\n },\n {\n 'tfOpName': 'LogicalOr',\n 'category': 'logical',\n 'inputs': [\n {\n 'start': 0,\n 'name': 'a',\n 'type': 'tensor'\n },\n {\n 'start': 1,\n 'name': 'b',\n 'type': 'tensor'\n }\n ],\n 'attrs': [\n {\n 'tfName': 'T',\n 'name': 'dtype',\n 'type': 'dtype',\n 'notSupported': true\n }\n ]\n },\n {\n 'tfOpName': 'Select',\n 'category': 'logical',\n 'inputs': [\n {\n 'start': 0,\n 'name': 'condition',\n 'type': 'tensor'\n },\n {\n 'start': 1,\n 'name': 'a',\n 'type': 'tensor'\n },\n {\n 'start': 2,\n 'name': 'b',\n 'type': 'tensor'\n }\n ],\n 'attrs': [\n {\n 'tfName': 'T',\n 'name': 'dtype',\n 'type': 'dtype',\n 'notSupported': true\n }\n ]\n },\n {\n 'tfOpName': 'SelectV2',\n 'category': 'logical',\n 'inputs': [\n {\n 'start': 0,\n 'name': 'condition',\n 'type': 'tensor'\n },\n {\n 'start': 1,\n 'name': 'a',\n 'type': 'tensor'\n },\n {\n 'start': 2,\n 'name': 'b',\n 'type': 'tensor'\n }\n ],\n 'attrs': [\n {\n 'tfName': 'T',\n 'name': 'dtype',\n 'type': 'dtype',\n 'notSupported': true\n }\n ]\n }\n];\n//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibG9naWNhbC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uLy4uLy4uL3RmanMtY29udmVydGVyL3NyYy9vcGVyYXRpb25zL29wX2xpc3QvbG9naWNhbC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFDQTs7Ozs7Ozs7Ozs7Ozs7O0dBZUc7QUFJSCxNQUFNLENBQUMsTUFBTSxJQUFJLEdBQWU7SUFDOUI7UUFDRSxVQUFVLEVBQUUsT0FBTztRQUNuQixVQUFVLEVBQUUsU0FBUztRQUNyQixRQUFRLEVBQUU7WUFDUjtnQkFDRSxPQUFPLEVBQUUsQ0FBQztnQkFDVixNQUFNLEVBQUUsR0FBRztnQkFDWCxNQUFNLEVBQUUsUUFBUTthQUNqQjtZQUNEO2dCQUNFLE9BQU8sRUFBRSxDQUFDO2dCQUNWLE1BQU0sRUFBRSxHQUFHO2dCQUNYLE1BQU0sRUFBRSxRQUFRO2FBQ2pCO1NBQ0Y7UUFDRCxPQUFPLEVBQUU7WUFDUDtnQkFDRSxRQUFRLEVBQUUsR0FBRztnQkFDYixNQUFNLEVBQUUsT0FBTztnQkFDZixNQUFNLEVBQUUsT0FBTztnQkFDZixjQUFjLEVBQUUsSUFBSTthQUNyQjtTQUNGO0tBQ0Y7SUFDRDtRQUNFLFVBQVUsRUFBRSxVQUFVO1FBQ3RCLFVBQVUsRUFBRSxTQUFTO1FBQ3JCLFFBQVEsRUFBRTtZQUNSO2dCQUNFLE9BQU8sRUFBRSxDQUFDO2dCQUNWLE1BQU0sRUFBRSxHQUFHO2dCQUNYLE1BQU0sRUFBRSxRQUFRO2FBQ2pCO1lBQ0Q7Z0JBQ0UsT0FBTyxFQUFFLENBQUM7Z0JBQ1YsTUFBTSxFQUFFLEdBQUc7Z0JBQ1gsTUFBTSxFQUFFLFFBQVE7YUFDakI7U0FDRjtRQUNELE9BQU8sRUFBRTtZQUNQO2dCQUNFLFFBQVEsRUFBRSxHQUFHO2dCQUNiLE1BQU0sRUFBRSxPQUFPO2dCQUNmLE1BQU0sRUFBRSxPQUFPO2dCQUNmLGNBQWMsRUFBRSxJQUFJO2FBQ3JCO1NBQ0Y7S0FDRjtJQUNEO1FBQ0UsVUFBVSxFQUFF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QUUsU0FBUztRQUNyQixRQUFRLEVBQUU7WUFDUjtnQkFDRSxPQUFPLEVBQUUsQ0FBQztnQkFDVixNQUFNLEVBQUUsV0FBVztnQkFDbkIsTUFBTSxFQUFFLFFBQVE7YUFDakI7WUFDRDtnQkFDRSxPQUFPLEVBQUUsQ0FBQztnQkFDVixNQUFNLEVBQUUsR0FBRztnQkFDWCxNQUFNLEVBQUUsUUFBUTthQUNqQjtZQUNEO2dCQUNFLE9BQU8sRUFBRSxDQUFDO2dCQUNWLE1BQU0sRUFBRSxHQUFHO2dCQUNYLE1BQU0sRUFBRSxRQUFRO2FBQ2pCO1NBQ0Y7UUFDRCxPQUFPLEVBQUU7WUFDUDtnQkFDRSxRQUFRLEVBQUUsR0FBRztnQkFDYixNQUFNLEVBQUUsT0FBTztnQkFDZixNQUFNLEVBQUUsT0FBTztnQkFDZixjQUFjLEVBQUUsSUFBSTthQUNyQjtTQUNGO0tBQ0Y7Q0FDRixDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiXG4vKipcbiAqIEBsaWNlbnNlXG4gKiBDb3B5cmlnaHQgMjAyMiBHb29nbGUgTExDLiBBbGwgUmlnaHRzIFJlc2VydmVkLlxuICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlIFwiTGljZW5zZVwiKTtcbiAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS5cbiAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdFxuICpcbiAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMFxuICpcbiAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmVcbiAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuIFwiQVMgSVNcIiBCQVNJUyxcbiAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLlxuICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZFxuICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuXG4gKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuICovXG5cbmltcG9ydCB7T3BNYXBwZXJ9IGZyb20gJy4uL3R5cGVzJztcblxuZXhwb3J0IGNvbnN0IGpzb246IE9wTWFwcGVyW10gPSBbXG4gIHtcbiAgICAndGZPcE5hbWUnOiAnRXF1YWwnLFxuICAgICdjYXRlZ29yeSc6ICdsb2dpY2FsJyxcbiAgICAnaW5wdXRzJzogW1xuICAgICAge1xuICAgICAgICAnc3RhcnQnOiAwLFxuICAgICAgICAnbmFtZSc6ICdhJyxcbiAgICAgICAgJ3R5cGUnOiAndGVuc29yJ1xuICAgICAgfSxcbiAgICAgIHtcbiAgICAgICAgJ3N0YXJ0JzogMSxcbiAgICAgICAgJ25hbWUnOiAnYicsXG4gICAgICAgICd0eXBlJzogJ3RlbnNvcidcbiAgICAgIH1cbiAgICBdLFxuICAgICdhdHRycyc6IFtcbiAgICAgIHtcbiAgICAgICAgJ3RmTmFtZSc6ICdUJyxcbiAgICAgICAgJ25hbWUnOiAnZHR5cGUnLFxuICAgICAgICAndHlwZSc6ICdkdHlwZScsXG4gICAgICAgICdub3RTdXBwb3J0ZWQnOiB0cnVlXG4gICAgICB9XG4gICAgXVxuICB9LFxuICB7XG4gICAgJ3RmT3BOYW1lJzogJ05vdEVxdWFsJyxcbiAgICAnY2F0ZWdvcnknOiAnbG9naWNhbCcsXG4gICAgJ2lucHV0cyc6IFtcbiAgICAgIHtcbiAgICAgICAgJ3N0YXJ0JzogMCxcbiAgICAgICAgJ25hbWUnOiAnYScsXG4gICAgICAgICd0eXBlJzogJ3RlbnNvcidcbiAgICAgIH0sXG4gICAgICB7XG4gICAgICAgICdzdGFydCc6IDEsXG4gICAgICAgICduYW1lJzogJ2InLFxuICAgICAgICAndHlwZSc6ICd0ZW5zb3InXG4gICAgICB9XG4gICAgXSxcbiAgICAnYXR0cnMnOiBbXG4gICAgICB7XG4gICAgICAgICd0Zk5hbWUnOiAnVCcsXG4gICAgICAgICduYW1lJzogJ2R0eXBlJyxcbiAgICAgICAgJ3R5cGUnOiAnZHR5cGUnLFxuICAgICAgICAnbm90U3VwcG9ydGVkJzogdHJ1ZVxuICAgICAgfVxuICAgIF1cbiAgfSxcbiAge1xuICAgICd0Zk9wTmFtZSc6ICdHcmVhdGVyJyxcbiAgICAnY2F0ZWdvcnknOiAnbG9naWNhbCcsXG4gICAgJ2lucHV0cyc6IFtcbiAgICAgIHtcbiAgICAgICAgJ3N0YXJ0JzogMCxcbiAgICAgICAgJ25hbWUnOiAnYScsXG4gICAgICAgICd0eXBlJzogJ3RlbnNvcidcbiAgICAgIH0sXG4gICAgICB7XG4gICAgICAgICdzdGFydCc6IDEsXG4gICAgICAgICduYW1lJzogJ2InLFxuICAgICAgICAndHlwZSc6ICd0ZW5zb3InXG4gICAgICB9XG4gICAgXSxcbiAgICAnYXR0cnMnOiBbXG4gICAgICB7XG4gICAgICAgICd0Zk5hbWUnOiAnVCcsXG4gICAgICAgICduYW1lJzogJ2R0eXBlJyxcbiAgICAgICAgJ3R5cGUnOiAnZHR5cGUnLFxuICAgICAgICAnbm90U3VwcG9ydGVkJzogdHJ1ZVxuICAgICAgfVxuICAgIF1cbiAgfSxcbiAge1xuICAgICd0Zk9wTmFtZSc6ICdHcmVhdGVyRXF1YWwnLFxuICAgICdjYXRlZ29yeSc6ICdsb2dpY2FsJyxcbiAgICAnaW5wdXRzJzogW1xuICAgICAge1xuICAgICAgICAnc3RhcnQnOiAwLFxuICAgICAgICAnbmFtZSc6ICdhJyxcbiAgICAgICAgJ3R5cGUnOiAndGVuc29yJ1xuICAgICAgfSxcbiAgICAgIHtcbiAgICAgICAgJ3N0YXJ0JzogMSxcbiAgICAgICAgJ25hbWUnOiAnYicsXG4gICAgICAgICd0eXBlJzogJ3RlbnNvcidcbiAgICAgIH1cbiAgICBdLFxuICAgICdhdHRycyc6IFtcbiAgICAgIHtcbiAgICAgICAgJ3RmTmFtZSc6ICdUJyxcbiAgICAgICAgJ25hbWUnOiAnZHR5cGUnLFxuICAgICAgICAndHlwZSc6ICdkdHlwZScsXG4gICAgICAgICdub3RTdXBwb3J0ZWQnOiB0cnVlXG4gICAgICB9XG4gICAgXVxuICB9LFxuICB7XG4gICAgJ3RmT3BOYW1lJzogJ0xlc3MnLFxuICAgICdjYXRlZ29yeSc6ICdsb2dpY2FsJyxcbiAgICAnaW5wdXRzJzogW1xuICAgICAge1xuICAgICAgICAnc3RhcnQnOiAwLFxuICAgICAgICAnbmFtZSc6ICdhJyxcbiAgICAgICAgJ3R5cGUnOiAndGVuc29yJ1xuICAgICAgfSxcbiAgICAgIHtcbiAgICAgICAgJ3N0YXJ0JzogMSxcbiAgICAgICAgJ25hbWUnOiAnYicsXG4gICAgICAgICd0eXBlJzogJ3RlbnNvcidcbiAgICAgIH1cbiAgICBdLFxuICAgICdhdHRycyc6IFtcbiAgICAgIHtcbiAgICAgICAgJ3RmTmFtZSc6ICdUJyxcbiAgICAgICAgJ25hbWUnOiAnZHR5cGUnLFxuICAgICAgICAndHlwZSc6ICdkdHlwZScsXG4gICAgICAgICdub3RTdXBwb3J0ZWQnOiB0cnVlXG4gICAgICB9XG4gICAgXVxuICB9LFxuICB7XG4gICAgJ3RmT3BOYW1lJzogJ0xlc3NFcXVhbCcsXG4gICAgJ2NhdGVnb3J5JzogJ2xvZ2ljYWwnLFxuICAgICdpbnB1dHMnOiBbXG4gICAgICB7XG4gICAgICAgICdzdGFydCc6IDAsXG4gICAgICAgICduYW1lJzogJ2EnLFxuICAgICAgICAndHlwZSc6ICd0ZW5zb3InXG4gICAgICB9LFxuICAgICAge1xuICAgICAgICAnc3RhcnQnOiAxLFxuICAgICAgICAnbmFtZSc6ICdiJyxcbiAgICAgICAgJ3R5cGUnOiAndGVuc29yJ1xuICAgICAgfVxuICAgIF0sXG4gICAgJ2F0dHJzJzogW1xuICAgICAge1xuICAgICAgICAndGZOYW1lJzogJ1QnLFxuICAgICAgICAnbmFtZSc6ICdkdHlwZScsXG4gICAgICAgICd0eXBlJzogJ2R0eXBlJyxcbiAgICAgICAgJ25vdFN1cHBvcnRlZCc6IHRydWVcbiAgICAgIH1cbiAgICBdXG4gIH0sXG4gIHtcbiAgICAndGZPcE5hbWUnOiAnTG9naWNhbEFuZCcsXG4gICAgJ2NhdGVnb3J5JzogJ2xvZ2ljYWwnLFxuICAgICdpbnB1dHMnOiBbXG4gICAgICB7XG4gICAgICAgICdzdGFydCc6IDAsXG4gICAgICAgICduYW1lJzogJ2EnLFxuICAgICAgICAndHlwZSc6ICd0ZW5zb3InXG4gICAgICB9LFxuICAgICAge1xuICAgICAgICAnc3RhcnQnOiAxLFxuICAgICAgICAnbmFtZSc6ICdiJyxcbiAgICAgICAgJ3R5cGUnOiAndGVuc29yJ1xuICAgICAgfVxuICAgIF0sXG4gICAgJ2F0dHJzJzogW1xuICAgICAge1xuICAgICAgICAndGZOYW1lJzogJ1QnLFxuICAgICAgICAnbmFtZSc6ICdkdHlwZScsXG4gICAgICAgICd0eXBlJzogJ2R0eXBlJyxcbiAgICAgICAgJ25vdFN1cHBvcnRlZCc6IHRydWVcbiAgICAgIH1cbiAgICBdXG4gIH0sXG4gIHtcbiAgICAndGZPcE5hbWUnOiAnTG9naWNhbE5vdCcsXG4gICAgJ2NhdGVnb3J5JzogJ2xvZ2ljYWwnLFxuICAgICdpbnB1dHMnOiBbXG4gICAgICB7XG4gICAgICAgICdzdGFydCc6IDAsXG4gICAgICAgICduYW1lJzogJ2EnLFxuICAgICAgICAndHlwZSc6ICd0ZW5zb3InXG4gICAgICB9XG4gICAgXSxcbiAgICAnYXR0cnMnOiBbXG4gICAgICB7XG4gICAgICAgICd0Zk5hbWUnOiAnVCcsXG4gICAgICAgICduYW1lJzogJ2R0eXBlJyxcbiAgICAgICAgJ3R5cGUnOiAnZHR5cGUnLFxuICAgICAgICAnbm90U3VwcG9ydGVkJzogdHJ1ZVxuICAgICAgfVxuICAgIF1cbiAgfSxcbiAge1xuICAgICd0Zk9wTmFtZSc6ICdMb2dpY2FsT3InLFxuICAgICdjYXRlZ29yeSc6ICdsb2dpY2FsJyxcbiAgICAnaW5wdXRzJzogW1xuICAgICAge1xuICAgICAgICAnc3RhcnQnOiAwLFxuICAgICAgICAnbmFtZSc6ICdhJyxcbiAgICAgICAgJ3R5cGUnOiAndGVuc29yJ1xuICAgICAgfSxcbiAgICAgIHtcbiAgICAgICAgJ3N0YXJ0JzogMSxcbiAgICAgICAgJ25hbWUnOiAnYicsXG4gICAgICAgICd0eXBlJzogJ3RlbnNvcidcbiAgICAgIH1cbiAgICBdLFxuICAgICdhdHRycyc6IFtcbiAgICAgIHtcbiAgICAgICAgJ3RmTmFtZSc6ICdUJyxcbiAgICAgICAgJ25hbWUnOiAnZHR5cGUnLFxuICAgICAgICAndHlwZSc6ICdkdHlwZScsXG4gICAgICAgICdub3RTdXBwb3J0ZWQnOiB0cnVlXG4gICAgICB9XG4gICAgXVxuICB9LFxuICB7XG4gICAgJ3RmT3BOYW1lJzogJ1NlbGVjdCcsXG4gICAgJ2NhdGVnb3J5JzogJ2xvZ2ljYWwnLFxuICAgICdpbnB1dHMnOiBbXG4gICAgICB7XG4gICAgICAgICdzdGFydCc6IDAsXG4gICAgICAgICduYW1lJzogJ2NvbmRpdGlvbicsXG4gICAgICAgICd0eXBlJzogJ3RlbnNvcidcbiAgICAgIH0sXG4gICAgICB7XG4gICAgICAgICdzdGFydCc6IDEsXG4gICAgICAgICduYW1lJzogJ2EnLFxuICAgICAgICAndHlwZSc6ICd0ZW5zb3InXG4gICAgICB9LFxuICAgICAge1xuICAgICAgICAnc3RhcnQnOiAyLFxuICAgICAgICAnbmFtZSc6ICdiJyxcbiAgICAgICAgJ3R5cGUnOiAndGVuc29yJ1xuICAgICAgfVxuICAgIF0sXG4gICAgJ2F0dHJzJzogW1xuICAgICAge1xuICAgICAgICAndGZOYW1lJzogJ1QnLFxuICAgICAgICAnbmFtZSc6ICdkdHlwZScsXG4gICAgICAgICd0eXBlJzogJ2R0eXBlJyxcbiAgICAgICAgJ25vdFN1cHBvcnRlZCc6IHRydWVcbiAgICAgIH1cbiAgICBdXG4gIH0sXG4gIHtcbiAgICAndGZPcE5hbWUnOiAnU2VsZWN0VjInLFxuICAgICdjYXRlZ29yeSc6ICdsb2dpY2FsJyxcbiAgICAnaW5wdXRzJzogW1xuICAgICAge1xuICAgICAgICAnc3RhcnQnOiAwLFxuICAgICAgICAnbmFtZSc6ICdjb25kaXRpb24nLFxuICAgICAgICAndHlwZSc6ICd0ZW5zb3InXG4gICAgICB9LFxuICAgICAge1xuICAgICAgICAnc3RhcnQnOiAxLFxuICAgICAgICAnbmFtZSc6ICdhJyxcbiAgICAgICAgJ3R5cGUnOiAndGVuc29yJ1xuICAgICAgfSxcbiAgICAgIHtcbiAgICAgICAgJ3N0YXJ0JzogMixcbiAgICAgICAgJ25hbWUnOiAnYicsXG4gICAgICAgICd0eXBlJzogJ3RlbnNvcidcbiAgICAgIH1cbiAgICBdLFxuICAgICdhdHRycyc6IFtcbiAgICAgIHtcbiAgICAgICAgJ3RmTmFtZSc6ICdUJyxcbiAgICAgICAgJ25hbWUnOiAnZHR5cGUnLFxuICAgICAgICAndHlwZSc6ICdkdHlwZScsXG4gICAgICAgICdub3RTdXBwb3J0ZWQnOiB0cnVlXG4gICAgICB9XG4gICAgXVxuICB9XG5dO1xuIl19","/**\n * @license\n * Copyright 2022 Google LLC. All Rights Reserved.\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n * =============================================================================\n */\nexport const json = [\n {\n 'tfOpName': '_FusedMatMul',\n 'category': 'matrices',\n 'inputs': [\n {\n 'start': 0,\n 'name': 'a',\n 'type': 'tensor'\n },\n {\n 'start': 1,\n 'name': 'b',\n 'type': 'tensor'\n },\n {\n 'start': 2,\n 'end': 0,\n 'name': 'args',\n 'type': 'tensors'\n }\n ],\n 'attrs': [\n {\n 'tfName': 'num_args',\n 'name': 'numArgs',\n 'type': 'number'\n },\n {\n 'tfName': 'fused_ops',\n 'name': 'fusedOps',\n 'type': 'string[]',\n 'defaultValue': []\n },\n {\n 'tfName': 'epsilon',\n 'name': 'epsilon',\n 'type': 'number',\n 'defaultValue': 0.0001\n },\n {\n 'tfName': 'transpose_a',\n 'name': 'transposeA',\n 'type': 'bool',\n 'defaultValue': false\n },\n {\n 'tfName': 'transpose_b',\n 'name': 'transposeB',\n 'type': 'bool',\n 'defaultValue': false\n },\n {\n 'tfName': 'leakyrelu_alpha',\n 'name': 'leakyreluAlpha',\n 'type': 'number',\n 'defaultValue': 0.2\n },\n {\n 'tfName': 'T',\n 'name': 'dtype',\n 'type': 'dtype',\n 'notSupported': true\n }\n ]\n },\n {\n 'tfOpName': 'MatMul',\n 'category': 'matrices',\n 'inputs': [\n {\n 'start': 0,\n 'name': 'a',\n 'type': 'tensor'\n },\n {\n 'start': 1,\n 'name': 'b',\n 'type': 'tensor'\n }\n ],\n 'attrs': [\n {\n 'tfName': 'transpose_a',\n 'name': 'transposeA',\n 'type': 'bool',\n 'defaultValue': false\n },\n {\n 'tfName': 'transpose_b',\n 'name': 'transposeB',\n 'type': 'bool',\n 'defaultValue': false\n },\n {\n 'tfName': 'T',\n 'name': 'dtype',\n 'type': 'dtype',\n 'notSupported': true\n }\n ]\n },\n {\n 'tfOpName': 'BatchMatMul',\n 'category': 'matrices',\n 'inputs': [\n {\n 'start': 0,\n 'name': 'a',\n 'type': 'tensor'\n },\n {\n 'start': 1,\n 'name': 'b',\n 'type': 'tensor'\n }\n ],\n 'attrs': [\n {\n 'tfName': 'adj_x',\n 'name': 'transposeA',\n 'type': 'bool',\n 'defaultValue': false\n },\n {\n 'tfName': 'adj_y',\n 'name': 'transposeB',\n 'type': 'bool',\n 'defaultValue': false\n },\n {\n 'tfName': 'T',\n 'name': 'dtype',\n 'type': 'dtype',\n 'notSupported': true\n }\n ]\n },\n {\n 'tfOpName': 'BatchMatMulV2',\n 'category': 'matrices',\n 'inputs': [\n {\n 'start': 0,\n 'name': 'a',\n 'type': 'tensor'\n },\n {\n 'start': 1,\n 'name': 'b',\n 'type': 'tensor'\n }\n ],\n 'attrs': [\n {\n 'tfName': 'adj_x',\n 'name': 'transposeA',\n 'type': 'bool',\n 'defaultValue': false\n },\n {\n 'tfName': 'adj_y',\n 'name': 'transposeB',\n 'type': 'bool',\n 'defaultValue': false\n },\n {\n 'tfName': 'T',\n 'name': 'dtype',\n 'type': 'dtype',\n 'notSupported': true\n }\n ]\n },\n {\n 'tfOpName': 'Transpose',\n 'category': 'matrices',\n 'inputs': [\n {\n 'start': 0,\n 'name': 'x',\n 'type': 'tensor'\n },\n {\n 'start': 1,\n 'name': 'perm',\n 'type': 'number[]'\n }\n ],\n 'attrs': [\n {\n 'tfName': 'T',\n 'name': 'dtype',\n 'type': 'dtype',\n 'notSupported': true\n }\n ]\n },\n {\n 'tfOpName': 'Einsum',\n 'category': 'matrices',\n 'inputs': [\n {\n 'start': 0,\n 'end': 0,\n 'name': 'tensors',\n 'type': 'tensors'\n }\n ],\n 'attrs': [\n {\n 'tfName': 'equation',\n 'name': 'equation',\n 'type': 'string'\n },\n {\n 'tfName': 'N',\n 'name': 'n',\n 'type': 'number',\n 'defaultValue': 2\n },\n {\n 'tfName': 'T',\n 'name': 'dtype',\n 'type': 'dtype'\n }\n ]\n }\n];\n//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibWF0cmljZXMuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi8uLi8uLi90ZmpzLWNvbnZlcnRlci9zcmMvb3BlcmF0aW9ucy9vcF9saXN0L21hdHJpY2VzLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUNBOzs7Ozs7Ozs7Ozs7Ozs7R0FlRztBQUlILE1BQU0sQ0FBQyxNQUFNLElBQUksR0FBZTtJQUM5QjtRQUNFLFVBQVUsRUFBRSxjQUFjO1FBQzFCLFVBQVUsRUFBRSxVQUFVO1FBQ3RCLFFBQVEsRUFBRTtZQUNSO2dCQUNFLE9BQU8sRUFBRSxDQUFDO2dCQUNWLE1BQU0sRUFBRSxHQUFHO2dCQUNYLE1BQU0sRUFBRSxRQUFRO2FBQ2pCO1lBQ0Q7Z0JBQ0UsT0FBTyxFQUFFLENBQUM7Z0JBQ1YsTUFBTSxFQUFFLEdBQUc7Z0JBQ1gsTUFBTSxFQUFFLFFBQVE7YUFDakI7WUFDRDtnQkFDRSxPQUFPLEVBQUUsQ0FBQztnQkFDVixLQUFLLEVBQUUsQ0FBQztnQkFDUixNQUFNLEVBQUUsTUFBTTtnQkFDZCxNQUFNLEVBQUUsU0FBUzthQUNsQjtTQUNGO1FBQ0QsT0FBTyxFQUFFO1lBQ1A7Z0JBQ0UsUUFBUSxFQUFFLFVBQVU7Z0JBQ3BCLE1BQU0sRUFBRSxTQUFTO2dCQUNqQixNQUFNLEVBQUUsUUFBUTthQUNqQjtZQUNEO2dCQUNFLFFBQVEsRUFBRSxXQUFXO2dCQUNyQixNQUFNLEVBQUUsVUFBVTtnQkFDbEIsTUFBTSxFQUFFLFVBQVU7Z0JBQ2xCLGNBQWMsRUFBRSxFQUFFO2FBQ25CO1lBQ0Q7Z0JBQ0UsUUFBUSxFQUFFLFNBQVM7Z0JBQ25CLE1BQU0sRUFBRSxTQUFTO2dCQUNqQixNQUFNLEVBQUUsUUFBUTtnQkFDaEIsY0FBYyxFQUFFLE1BQU07YUFDdkI7WUFDRDtnQkFDRSxRQUFRLEVBQUUsYUFBYTtnQkFDdkIsTUFBTSxFQUFFLFlBQVk7Z0JBQ3BCLE1BQU0sRUFBRSxNQUFNO2dCQUNkLGNBQWMsRUFBRSxLQUFL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KipcbiAqIEBsaWNlbnNlXG4gKiBDb3B5cmlnaHQgMjAyMiBHb29nbGUgTExDLiBBbGwgUmlnaHRzIFJlc2VydmVkLlxuICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlIFwiTGljZW5zZVwiKTtcbiAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS5cbiAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdFxuICpcbiAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMFxuICpcbiAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmVcbiAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuIFwiQVMgSVNcIiBCQVNJUyxcbiAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLlxuICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZFxuICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuXG4gKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuICovXG5cbmltcG9ydCB7T3BNYXBwZXJ9IGZyb20gJy4uL3R5cGVzJztcblxuZXhwb3J0IGNvbnN0IGpzb246IE9wTWFwcGVyW10gPSBbXG4gIHtcbiAgICAndGZPcE5hbWUnOiAnX0Z1c2VkTWF0TXVsJyxcbiAgICAnY2F0ZWdvcnknOiAnbWF0cmljZXMnLFxuICAgICdpbnB1dHMnOiBbXG4gICAgICB7XG4gICAgICAgICdzdGFydCc6IDAsXG4gICAgICAgICduYW1lJzogJ2EnLFxuICAgICAgICAndHlwZSc6ICd0ZW5zb3InXG4gICAgICB9LFxuICAgICAge1xuICAgICAgICAnc3RhcnQnOiAxLFxuICAgICAgICAnbmFtZSc6ICdiJyxcbiAgICAgICAgJ3R5cGUnOiAndGVuc29yJ1xuICAgICAgfSxcbiAgICAgIHtcbiAgICAgICAgJ3N0YXJ0JzogMixcbiAgICAgICAgJ2VuZCc6IDAsXG4gICAgICAgICduYW1lJzogJ2FyZ3MnLFxuICAgICAgICAndHlwZSc6ICd0ZW5zb3JzJ1xuICAgICAgfVxuICAgIF0sXG4gICAgJ2F0dHJzJzogW1xuICAgICAge1xuICAgICAgICAndGZOYW1lJzogJ251bV9hcmdzJyxcbiAgICAgICAgJ25hbWUnOiAnbnVtQXJncycsXG4gICAgICAgICd0eXBlJzogJ251bWJlcidcbiAgICAgIH0sXG4gICAgICB7XG4gICAgICAgICd0Zk5hbWUnOiAnZnVzZWRfb3BzJyxcbiAgICAgICAgJ25hbWUnOiAnZnVzZWRPcHMnLFxuICAgICAgICAndHlwZSc6ICdzdHJpbmdbXScsXG4gICAgICAgICdkZWZhdWx0VmFsdWUnOiBbXVxuICAgICAgfSxcbiAgICAgIHtcbiAgICAgICAgJ3RmTmFtZSc6ICdlcHNpbG9uJyxcbiAgICAgICAgJ25hbWUnOiAnZXBzaWxvbicsXG4gICAgICAgICd0eXBlJzogJ251bWJlcicsXG4gICAgICAgICdkZWZhdWx0VmFsdWUnOiAwLjAwMDFcbiAgICAgIH0sXG4gICAgICB7XG4gICAgICAgICd0Zk5hbWUnOiAndHJhbnNwb3NlX2EnLFxuICAgICAgICAnbmFtZSc6ICd0cmFuc3Bvc2VBJyxcbiAgICAgICAgJ3R5cGUnOiAnYm9vbCcsXG4gICAgICAgICdkZWZhdWx0VmFsdWUnOiBmYWxzZVxuICAgICAgfSxcbiAgICAgIHtcbiAgICAgICAgJ3RmTmFtZSc6ICd0cmFuc3Bvc2VfYicsXG4gICAgICAgICduYW1lJzogJ3RyYW5zcG9zZUInLFxuICAgICAgICAndHlwZSc6ICdib29sJyxcbiAgICAgICAgJ2RlZmF1bHRWYWx1ZSc6IGZhbHNlXG4gICAgICB9LFxuICAgICAge1xuICAgICAgICAndGZOYW1lJzogJ2xlYWt5cmVsdV9hbHBoYScsXG4gICAgICAgICduYW1lJzogJ2xlYWt5cmVsdUFscGhhJyxcbiAgICAgICAgJ3R5cGUnOiAnbnVtYmVyJyxcbiAgICAgICAgJ2RlZmF1bHRWYWx1ZSc6IDAuMlxuICAgICAgfSxcbiAgICAgIHtcbiAgICAgICAgJ3RmTmFtZSc6ICdUJyxcbiAgICAgICAgJ25hbWUnOiAnZHR5cGUnLFxuICAgICAgICAndHlwZSc6ICdkdHlwZScsXG4gICAgICAgICdub3RTdXBwb3J0ZWQnOiB0cnVlXG4gICAgICB9XG4gICAgXVxuICB9LFxuICB7XG4gICAgJ3RmT3BOYW1lJzogJ01hdE11bCcsXG4gICAgJ2NhdGVnb3J5JzogJ21hdHJpY2VzJyxcbiAgICAnaW5wdXRzJzogW1xuICAgICAge1xuICAgICAgICAnc3RhcnQnOiAwLFxuICAgICAgICAnbmFtZSc6ICdhJyxcbiAgICAgICAgJ3R5cGUnOiAndGVuc29yJ1xuICAgICAgfSxcbiAgICAgIHtcbiAgICAgICAgJ3N0YXJ0JzogMSxcbiAgICAgICAgJ25hbWUnOiAnYicsXG4gICAgICAgICd0eXBlJzogJ3RlbnNvcidcbiAgICAgIH1cbiAgICBdLFxuICAgICdhdHRycyc6IFtcbiAgICAgIHtcbiAgICAgICAgJ3RmTmFtZSc6ICd0cmFuc3Bvc2VfYScsXG4gICAgICAgICduYW1lJzogJ3RyYW5zcG9zZUEnLFxuICAgICAgICAndHlwZSc6ICdib29sJyxcbiAgICAgICAgJ2RlZmF1bHRWYWx1ZSc6IGZhbHNlXG4gICAgICB9LFxuICAgICAge1xuICAgICAgICAndGZOYW1lJzogJ3RyYW5zcG9zZV9iJyxcbiAgICAgICAgJ25hbWUnOiAndHJhbnNwb3NlQicsXG4gICAgICAgICd0eXBlJzogJ2Jvb2wnLFxuICAgICAgICAnZGVmYXVsdFZhbHVlJzogZmFsc2VcbiAgICAgIH0sXG4gICAgICB7XG4gICAgICAgICd0Zk5hbWUnOiAnVCcsXG4gICAgICAgICduYW1lJzogJ2R0eXBlJyxcbiAgICAgICAgJ3R5cGUnOiAnZHR5cGUnLFxuICAgICAgICAnbm90U3VwcG9ydGVkJzogdHJ1ZVxuICAgICAgfVxuICAgIF1cbiAgfSxcbiAge1xuICAgICd0Zk9wTmFtZSc6ICdCYXRjaE1hdE11bCcsXG4gICAgJ2NhdGVnb3J5JzogJ21hdHJpY2VzJyxcbiAgICAnaW5wdXRzJzogW1xuICAgICAge1xuICAgICAgICAnc3RhcnQnOiAwLFxuICAgICAgICAnbmFtZSc6ICdhJyxcbiAgICAgICAgJ3R5cGUnOiAndGVuc29yJ1xuICAgICAgfSxcbiAgICAgIHtcbiAgICAgICAgJ3N0YXJ0JzogMSxcbiAgICAgICAgJ25hbWUnOiAnYicsXG4gICAgICAgICd0eXBlJzogJ3RlbnNvcidcbiAgICAgIH1cbiAgICBdLFxuICAgICdhdHRycyc6IFtcbiAgICAgIHtcbiAgICAgICAgJ3RmTmFtZSc6ICdhZGpfeCcsXG4gICAgICAgICduYW1lJzogJ3RyYW5zcG9zZUEnLFxuICAgICAgICAndHlwZSc6ICdib29sJyxcbiAgICAgICAgJ2RlZmF1bHRWYWx1ZSc6IGZhbHNlXG4gICAgICB9LFxuICAgICAge1xuICAgICAgICAndGZOYW1lJzogJ2Fkal95JyxcbiAgICAgICAgJ25hbWUnOiAndHJhbnNwb3NlQicsXG4gICAgICAgICd0eXBlJzogJ2Jvb2wnLFxuICAgICAgICAnZGVmYXVsdFZhbHVlJzogZmFsc2VcbiAgICAgIH0sXG4gICAgICB7XG4gICAgICAgICd0Zk5hbWUnOiAnVCcsXG4gICAgICAgICduYW1lJzogJ2R0eXBlJyxcbiAgICAgICAgJ3R5cGUnOiAnZHR5cGUnLFxuICAgICAgICAnbm90U3VwcG9ydGVkJzogdHJ1ZVxuICAgICAgfVxuICAgIF1cbiAgfSxcbiAge1xuICAgICd0Zk9wTmFtZSc6ICdCYXRjaE1hdE11bFYyJyxcbiAgICAnY2F0ZWdvcnknOiAnbWF0cmljZXMnLFxuICAgICdpbnB1dHMnOiBbXG4gICAgICB7XG4gICAgICAgICdzdGFydCc6IDAsXG4gICAgICAgICduYW1lJzogJ2EnLFxuICAgICAgICAndHlwZSc6ICd0ZW5zb3InXG4gICAgICB9LFxuICAgICAge1xuICAgICAgICAnc3RhcnQnOiAxLFxuICAgICAgICAnbmFtZSc6ICdiJyxcbiAgICAgICAgJ3R5cGUnOiAndGVuc29yJ1xuICAgICAgfVxuICAgIF0sXG4gICAgJ2F0dHJzJzogW1xuICAgICAge1xuICAgICAgICAndGZOYW1lJzogJ2Fkal94JyxcbiAgICAgICAgJ25hbWUnOiAndHJhbnNwb3NlQScsXG4gICAgICAgICd0eXBlJzogJ2Jvb2wnLFxuICAgICAgICAnZGVmYXVsdFZhbHVlJzogZmFsc2VcbiAgICAgIH0sXG4gICAgICB7XG4gICAgICAgICd0Zk5hbWUnOiAnYWRqX3knLFxuICAgICAgICAnbmFtZSc6ICd0cmFuc3Bvc2VCJyxcbiAgICAgICAgJ3R5cGUnOiAnYm9vbCcsXG4gICAgICAgICdkZWZhdWx0VmFsdWUnOiBmYWxzZVxuICAgICAgfSxcbiAgICAgIHtcbiAgICAgICAgJ3RmTmFtZSc6ICdUJyxcbiAgICAgICAgJ25hbWUnOiAnZHR5cGUnLFxuICAgICAgICAndHlwZSc6ICdkdHlwZScsXG4gICAgICAgICdub3RTdXBwb3J0ZWQnOiB0cnVlXG4gICAgICB9XG4gICAgXVxuICB9LFxuICB7XG4gICAgJ3RmT3BOYW1lJzogJ1RyYW5zcG9zZScsXG4gICAgJ2NhdGVnb3J5JzogJ21hdHJpY2VzJyxcbiAgICAnaW5wdXRzJzogW1xuICAgICAge1xuICAgICAgICAnc3RhcnQnOiAwLFxuICAgICAgICAnbmFtZSc6ICd4JyxcbiAgICAgICAgJ3R5cGUnOiAndGVuc29yJ1xuICAgICAgfSxcbiAgICAgIHtcbiAgICAgICAgJ3N0YXJ0JzogMSxcbiAgICAgICAgJ25hbWUnOiAncGVybScsXG4gICAgICAgICd0eXBlJzogJ251bWJlcltdJ1xuICAgICAgfVxuICAgIF0sXG4gICAgJ2F0dHJzJzogW1xuICAgICAge1xuICAgICAgICAndGZOYW1lJzogJ1QnLFxuICAgICAgICAnbmFtZSc6ICdkdHlwZScsXG4gICAgICAgICd0eXBlJzogJ2R0eXBlJyxcbiAgICAgICAgJ25vdFN1cHBvcnRlZCc6IHRydWVcbiAgICAgIH1cbiAgICBdXG4gIH0sXG4gIHtcbiAgICAndGZPcE5hbWUnOiAnRWluc3VtJyxcbiAgICAnY2F0ZWdvcnknOiAnbWF0cmljZXMnLFxuICAgICdpbnB1dHMnOiBbXG4gICAgICB7XG4gICAgICAgICdzdGFydCc6IDAsXG4gICAgICAgICdlbmQnOiAwLFxuICAgICAgICAnbmFtZSc6ICd0ZW5zb3JzJyxcbiAgICAgICAgJ3R5cGUnOiAndGVuc29ycydcbiAgICAgIH1cbiAgICBdLFxuICAgICdhdHRycyc6IFtcbiAgICAgIHtcbiAgICAgICAgJ3RmTmFtZSc6ICdlcXVhdGlvbicsXG4gICAgICAgICduYW1lJzogJ2VxdWF0aW9uJyxcbiAgICAgICAgJ3R5cGUnOiAnc3RyaW5nJ1xuICAgICAgfSxcbiAgICAgIHtcbiAgICAgICAgJ3RmTmFtZSc6ICdOJyxcbiAgICAgICAgJ25hbWUnOiAnbicsXG4gICAgICAgICd0eXBlJzogJ251bWJlcicsXG4gICAgICAgICdkZWZhdWx0VmFsdWUnOiAyXG4gICAgICB9LFxuICAgICAge1xuICAgICAgICAndGZOYW1lJzogJ1QnLFxuICAgICAgICAnbmFtZSc6ICdkdHlwZScsXG4gICAgICAgICd0eXBlJzogJ2R0eXBlJ1xuICAgICAgfVxuICAgIF1cbiAgfVxuXVxuO1xuIl19","/**\n * @license\n * Copyright 2022 Google LLC. All Rights Reserved.\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n * =============================================================================\n */\nexport const json = [\n {\n 'tfOpName': 'EuclideanNorm',\n 'category': 'normalization',\n 'inputs': [\n {\n 'start': 0,\n 'name': 'x',\n 'type': 'tensor'\n },\n {\n 'start': 1,\n 'name': 'axis',\n 'type': 'number[]'\n }\n ],\n 'attrs': [\n {\n 'tfName': 'keep_dims',\n 'name': 'keepDims',\n 'type': 'bool',\n 'defaultValue': false\n }\n ]\n },\n {\n 'tfOpName': 'FusedBatchNorm',\n 'category': 'normalization',\n 'inputs': [\n {\n 'start': 0,\n 'name': 'x',\n 'type': 'tensor'\n },\n {\n 'start': 1,\n 'name': 'scale',\n 'type': 'tensor'\n },\n {\n 'start': 2,\n 'name': 'offset',\n 'type': 'tensor'\n },\n {\n 'start': 3,\n 'name': 'mean',\n 'type': 'tensor'\n },\n {\n 'start': 4,\n 'name': 'variance',\n 'type': 'tensor'\n }\n ],\n 'attrs': [\n {\n 'tfName': 'epsilon',\n 'name': 'epsilon',\n 'type': 'number',\n 'defaultValue': 0.001\n },\n {\n 'tfName': 'data_format',\n 'name': 'dataFormat',\n 'type': 'string',\n 'notSupported': true\n }\n ]\n },\n {\n 'tfOpName': 'FusedBatchNormV2',\n 'category': 'normalization',\n 'inputs': [\n {\n 'start': 0,\n 'name': 'x',\n 'type': 'tensor'\n },\n {\n 'start': 1,\n 'name': 'scale',\n 'type': 'tensor'\n },\n {\n 'start': 2,\n 'name': 'offset',\n 'type': 'tensor'\n },\n {\n 'start': 3,\n 'name': 'mean',\n 'type': 'tensor'\n },\n {\n 'start': 4,\n 'name': 'variance',\n 'type': 'tensor'\n }\n ],\n 'attrs': [\n {\n 'tfName': 'epsilon',\n 'name': 'epsilon',\n 'type': 'number',\n 'defaultValue': 0.001\n },\n {\n 'tfName': 'data_format',\n 'name': 'dataFormat',\n 'type': 'string',\n 'notSupported': true\n }\n ]\n },\n {\n 'tfOpName': 'FusedBatchNormV3',\n 'category': 'normalization',\n 'inputs': [\n {\n 'start': 0,\n 'name': 'x',\n 'type': 'tensor'\n },\n {\n 'start': 1,\n 'name': 'scale',\n 'type': 'tensor'\n },\n {\n 'start': 2,\n 'name': 'offset',\n 'type': 'tensor'\n },\n {\n 'start': 3,\n 'name': 'mean',\n 'type': 'tensor'\n },\n {\n 'start': 4,\n 'name': 'variance',\n 'type': 'tensor'\n }\n ],\n 'attrs': [\n {\n 'tfName': 'epsilon',\n 'name': 'epsilon',\n 'type': 'number',\n 'defaultValue': 0.001\n },\n {\n 'tfName': 'data_format',\n 'name': 'dataFormat',\n 'type': 'string',\n 'notSupported': true\n }\n ]\n },\n {\n 'tfOpName': 'LRN',\n 'category': 'normalization',\n 'inputs': [\n {\n 'start': 0,\n 'name': 'x',\n 'type': 'tensor'\n }\n ],\n 'attrs': [\n {\n 'tfName': 'depth_radius',\n 'name': 'radius',\n 'type': 'number',\n 'defaultValue': 5\n },\n {\n 'tfName': 'bias',\n 'name': 'bias',\n 'type': 'number',\n 'defaultValue': 1\n },\n {\n 'tfName': 'alpha',\n 'name': 'alpha',\n 'type': 'number',\n 'defaultValue': 1\n },\n {\n 'tfName': 'beta',\n 'name': 'beta',\n 'type': 'number',\n 'defaultValue': 0.5\n }\n ]\n },\n {\n 'tfOpName': 'Softmax',\n 'category': 'normalization',\n 'inputs': [\n {\n 'start': 0,\n 'name': 'x',\n 'type': 'tensor'\n }\n ]\n },\n {\n 'tfOpName': 'LogSoftmax',\n 'category': 'normalization',\n 'inputs': [\n {\n 'start': 0,\n 'name': 'x',\n 'type': 'tensor'\n }\n ]\n },\n {\n 'tfOpName': 'SparseToDense',\n 'category': 'normalization',\n 'inputs': [\n {\n 'start': 0,\n 'name': 'sparseIndices',\n 'type': 'tensor'\n },\n {\n 'start': 1,\n 'name': 'outputShape',\n 'type': 'number[]'\n },\n {\n 'start': 2,\n 'name': 'sparseValues',\n 'type': 'tensor'\n },\n {\n 'start': 3,\n 'name': 'defaultValue',\n 'type': 'tensor'\n }\n ],\n 'attrs': [\n {\n 'tfName': 'validate_indices',\n 'name': 'validateIndices',\n 'type': 'bool',\n 'defaultValue': true,\n 'notSupported': true\n }\n ]\n }\n];\n//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibm9ybWFsaXphdGlvbi5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uLy4uLy4uL3RmanMtY29udmVydGVyL3NyYy9vcGVyYXRpb25zL29wX2xpc3Qvbm9ybWFsaXphdGlvbi50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFDQTs7Ozs7Ozs7Ozs7Ozs7O0dBZUc7QUFJSCxNQUFNLENBQUMsTUFBTSxJQUFJLEdBQWU7SUFDOUI7UUFDRSxVQUFVLEVBQUUsZUFBZTtRQUMzQixVQUFVLEVBQUUsZUFBZTtRQUMzQixRQUFRLEVBQUU7WUFDUjtnQkFDRSxPQUFPLEVBQUUsQ0FBQztnQkFDVixNQUFNLEVBQUUsR0FBRztnQkFDWCxNQUFNLEVBQUUsUUFBUTthQUNqQjtZQUNEO2dCQUNFLE9BQU8sRUFBRSxDQUFDO2dCQUNWLE1BQU0sRUFBRSxNQUFNO2dCQUNkLE1BQU0sRUFBRSxVQUFVO2FBQ25CO1NBQ0Y7UUFDRCxPQUFPLEVBQUU7WUFDUDtnQkFDRSxRQUFRLEVBQUUsV0FBVztnQkFDckIsTUFBTSxFQUFFLFVBQVU7Z0JBQ2xCLE1BQU0sRUFBRSxNQUFNO2dCQUNkLGNBQWMsRUFBRSxLQUFLO2FBQ3RCO1NBQ0Y7S0FDRjtJQUNEO1FBQ0UsVUFBVSxFQUFFLGdCQUFnQjtRQUM1QixVQUFVLEVBQUUsZUFBZTtRQUMzQixRQUFRLEVBQUU7WUFDUjtnQkFDRSxPQUFPLEVBQUUsQ0FBQztnQkFDVixNQUFNLEVBQUUsR0FBRztnQkFDWCxNQUFNLEVBQUUsUUFBUTthQUNqQjtZQUNEO2dCQUNFLE9BQU8sRUFBRSxDQUFDO2dCQUNWLE1BQU0sRUFBRSxPQUFPO2dCQUNmLE1BQU0sRUFBRSxRQUFRO2FBQ2pCO1lBQ0Q7Z0JBQ0UsT0FBTyxFQUFFLENBQUM7Z0JBQ1YsTUFBTSxFQUFFLFFBQVE7Z0JBQ2hCLE1BQU0sRUFBRSxRQUFRO2FBQ2pCO1lBQ0Q7Z0JBQ0UsT0FBTyxFQUFFLENBQUM7Z0JBQ1YsTUFBTSxFQUFFLE1BQU07Z0JBQ2Qs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QUNuQjtZQUNEO2dCQUNFLE9BQU8sRUFBRSxDQUFDO2dCQUNWLE1BQU0sRUFBRSxjQUFjO2dCQUN0QixNQUFNLEVBQUUsUUFBUTthQUNqQjtZQUNEO2dCQUNFLE9BQU8sRUFBRSxDQUFDO2dCQUNWLE1BQU0sRUFBRSxjQUFjO2dCQUN0QixNQUFNLEVBQUUsUUFBUTthQUNqQjtTQUNGO1FBQ0QsT0FBTyxFQUFFO1lBQ1A7Z0JBQ0UsUUFBUSxFQUFFLGtCQUFrQjtnQkFDNUIsTUFBTSxFQUFFLGlCQUFpQjtnQkFDekIsTUFBTSxFQUFFLE1BQU07Z0JBQ2QsY0FBYyxFQUFFLElBQUk7Z0JBQ3BCLGNBQWMsRUFBRSxJQUFJO2FBQ3JCO1NBQ0Y7S0FDRjtDQUNGLENBQ0EiLCJzb3VyY2VzQ29udGVudCI6WyJcbi8qKlxuICogQGxpY2Vuc2VcbiAqIENvcHlyaWdodCAyMDIyIEdvb2dsZSBMTEMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuXG4gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgXCJMaWNlbnNlXCIpO1xuICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLlxuICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0XG4gKlxuICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wXG4gKlxuICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZVxuICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gXCJBUyBJU1wiIEJBU0lTLFxuICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuXG4gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kXG4gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS5cbiAqID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4gKi9cblxuaW1wb3J0IHtPcE1hcHBlcn0gZnJvbSAnLi4vdHlwZXMnO1xuXG5leHBvcnQgY29uc3QganNvbjogT3BNYXBwZXJbXSA9IFtcbiAge1xuICAgICd0Zk9wTmFtZSc6ICdFdWNsaWRlYW5Ob3JtJyxcbiAgICAnY2F0ZWdvcnknOiAnbm9ybWFsaXphdGlvbicsXG4gICAgJ2lucHV0cyc6IFtcbiAgICAgIHtcbiAgICAgICAgJ3N0YXJ0JzogMCxcbiAgICAgICAgJ25hbWUnOiAneCcsXG4gICAgICAgICd0eXBlJzogJ3RlbnNvcidcbiAgICAgIH0sXG4gICAgICB7XG4gICAgICAgICdzdGFydCc6IDEsXG4gICAgICAgICduYW1lJzogJ2F4aXMnLFxuICAgICAgICAndHlwZSc6ICdudW1iZXJbXSdcbiAgICAgIH1cbiAgICBdLFxuICAgICdhdHRycyc6IFtcbiAgICAgIHtcbiAgICAgICAgJ3RmTmFtZSc6ICdrZWVwX2RpbXMnLFxuICAgICAgICAnbmFtZSc6ICdrZWVwRGltcycsXG4gICAgICAgICd0eXBlJzogJ2Jvb2wnLFxuICAgICAgICAnZGVmYXVsdFZhbHVlJzogZmFsc2VcbiAgICAgIH1cbiAgICBdXG4gIH0sXG4gIHtcbiAgICAndGZPcE5hbWUnOiAnRnVzZWRCYXRjaE5vcm0nLFxuICAgICdjYXRlZ29yeSc6ICdub3JtYWxpemF0aW9uJyxcbiAgICAnaW5wdXRzJzogW1xuICAgICAge1xuICAgICAgICAnc3RhcnQnOiAwLFxuICAgICAgICAnbmFtZSc6ICd4JyxcbiAgICAgICAgJ3R5cGUnOiAndGVuc29yJ1xuICAgICAgfSxcbiAgICAgIHtcbiAgICAgICAgJ3N0YXJ0JzogMSxcbiAgICAgICAgJ25hbWUnOiAnc2NhbGUnLFxuICAgICAgICAndHlwZSc6ICd0ZW5zb3InXG4gICAgICB9LFxuICAgICAge1xuICAgICAgICAnc3RhcnQnOiAyLFxuICAgICAgICAnbmFtZSc6ICdvZmZzZXQnLFxuICAgICAgICAndHlwZSc6ICd0ZW5zb3InXG4gICAgICB9LFxuICAgICAge1xuICAgICAgICAnc3RhcnQnOiAzLFxuICAgICAgICAnbmFtZSc6ICdtZWFuJyxcbiAgICAgICAgJ3R5cGUnOiAndGVuc29yJ1xuICAgICAgfSxcbiAgICAgIHtcbiAgICAgICAgJ3N0YXJ0JzogNCxcbiAgICAgICAgJ25hbWUnOiAndmFyaWFuY2UnLFxuICAgICAgICAndHlwZSc6ICd0ZW5zb3InXG4gICAgICB9XG4gICAgXSxcbiAgICAnYXR0cnMnOiBbXG4gICAgICB7XG4gICAgICAgICd0Zk5hbWUnOiAnZXBzaWxvbicsXG4gICAgICAgICduYW1lJzogJ2Vwc2lsb24nLFxuICAgICAgICAndHlwZSc6ICdudW1iZXInLFxuICAgICAgICAnZGVmYXVsdFZhbHVlJzogMC4wMDFcbiAgICAgIH0sXG4gICAgICB7XG4gICAgICAgICd0Zk5hbWUnOiAnZGF0YV9mb3JtYXQnLFxuICAgICAgICAnbmFtZSc6ICdkYXRhRm9ybWF0JyxcbiAgICAgICAgJ3R5cGUnOiAnc3RyaW5nJyxcbiAgICAgICAgJ25vdFN1cHBvcnRlZCc6IHRydWVcbiAgICAgIH1cbiAgICBdXG4gIH0sXG4gIHtcbiAgICAndGZPcE5hbWUnOiAnRnVzZWRCYXRjaE5vcm1WMicsXG4gICAgJ2NhdGVnb3J5JzogJ25vcm1hbGl6YXRpb24nLFxuICAgICdpbnB1dHMnOiBbXG4gICAgICB7XG4gICAgICAgICdzdGFydCc6IDAsXG4gICAgICAgICduYW1lJzogJ3gnLFxuICAgICAgICAndHlwZSc6ICd0ZW5zb3InXG4gICAgICB9LFxuICAgICAge1xuICAgICAgICAnc3RhcnQnOiAxLFxuICAgICAgICAnbmFtZSc6ICdzY2FsZScsXG4gICAgICAgICd0eXBlJzogJ3RlbnNvcidcbiAgICAgIH0sXG4gICAgICB7XG4gICAgICAgICdzdGFydCc6IDIsXG4gICAgICAgICduYW1lJzogJ29mZnNldCcsXG4gICAgICAgICd0eXBlJzogJ3RlbnNvcidcbiAgICAgIH0sXG4gICAgICB7XG4gICAgICAgICdzdGFydCc6IDMsXG4gICAgICAgICduYW1lJzogJ21lYW4nLFxuICAgICAgICAndHlwZSc6ICd0ZW5zb3InXG4gICAgICB9LFxuICAgICAge1xuICAgICAgICAnc3RhcnQnOiA0LFxuICAgICAgICAnbmFtZSc6ICd2YXJpYW5jZScsXG4gICAgICAgICd0eXBlJzogJ3RlbnNvcidcbiAgICAgIH1cbiAgICBdLFxuICAgICdhdHRycyc6IFtcbiAgICAgIHtcbiAgICAgICAgJ3RmTmFtZSc6ICdlcHNpbG9uJyxcbiAgICAgICAgJ25hbWUnOiAnZXBzaWxvbicsXG4gICAgICAgICd0eXBlJzogJ251bWJlcicsXG4gICAgICAgICdkZWZhdWx0VmFsdWUnOiAwLjAwMVxuICAgICAgfSxcbiAgICAgIHtcbiAgICAgICAgJ3RmTmFtZSc6ICdkYXRhX2Zvcm1hdCcsXG4gICAgICAgICduYW1lJzogJ2RhdGFGb3JtYXQnLFxuICAgICAgICAndHlwZSc6ICdzdHJpbmcnLFxuICAgICAgICAnbm90U3VwcG9ydGVkJzogdHJ1ZVxuICAgICAgfVxuICAgIF1cbiAgfSxcbiAge1xuICAgICd0Zk9wTmFtZSc6ICdGdXNlZEJhdGNoTm9ybVYzJyxcbiAgICAnY2F0ZWdvcnknOiAnbm9ybWFsaXphdGlvbicsXG4gICAgJ2lucHV0cyc6IFtcbiAgICAgIHtcbiAgICAgICAgJ3N0YXJ0JzogMCxcbiAgICAgICAgJ25hbWUnOiAneCcsXG4gICAgICAgICd0eXBlJzogJ3RlbnNvcidcbiAgICAgIH0sXG4gICAgICB7XG4gICAgICAgICdzdGFydCc6IDEsXG4gICAgICAgICduYW1lJzogJ3NjYWxlJyxcbiAgICAgICAgJ3R5cGUnOiAndGVuc29yJ1xuICAgICAgfSxcbiAgICAgIHtcbiAgICAgICAgJ3N0YXJ0JzogMixcbiAgICAgICAgJ25hbWUnOiAnb2Zmc2V0JyxcbiAgICAgICAgJ3R5cGUnOiAndGVuc29yJ1xuICAgICAgfSxcbiAgICAgIHtcbiAgICAgICAgJ3N0YXJ0JzogMyxcbiAgICAgICAgJ25hbWUnOiAnbWVhbicsXG4gICAgICAgICd0eXBlJzogJ3RlbnNvcidcbiAgICAgIH0sXG4gICAgICB7XG4gICAgICAgICdzdGFydCc6IDQsXG4gICAgICAgICduYW1lJzogJ3ZhcmlhbmNlJyxcbiAgICAgICAgJ3R5cGUnOiAndGVuc29yJ1xuICAgICAgfVxuICAgIF0sXG4gICAgJ2F0dHJzJzogW1xuICAgICAge1xuICAgICAgICAndGZOYW1lJzogJ2Vwc2lsb24nLFxuICAgICAgICAnbmFtZSc6ICdlcHNpbG9uJyxcbiAgICAgICAgJ3R5cGUnOiAnbnVtYmVyJyxcbiAgICAgICAgJ2RlZmF1bHRWYWx1ZSc6IDAuMDAxXG4gICAgICB9LFxuICAgICAge1xuICAgICAgICAndGZOYW1lJzogJ2RhdGFfZm9ybWF0JyxcbiAgICAgICAgJ25hbWUnOiAnZGF0YUZvcm1hdCcsXG4gICAgICAgICd0eXBlJzogJ3N0cmluZycsXG4gICAgICAgICdub3RTdXBwb3J0ZWQnOiB0cnVlXG4gICAgICB9XG4gICAgXVxuICB9LFxuICB7XG4gICAgJ3RmT3BOYW1lJzogJ0xSTicsXG4gICAgJ2NhdGVnb3J5JzogJ25vcm1hbGl6YXRpb24nLFxuICAgICdpbnB1dHMnOiBbXG4gICAgICB7XG4gICAgICAgICdzdGFydCc6IDAsXG4gICAgICAgICduYW1lJzogJ3gnLFxuICAgICAgICAndHlwZSc6ICd0ZW5zb3InXG4gICAgICB9XG4gICAgXSxcbiAgICAnYXR0cnMnOiBbXG4gICAgICB7XG4gICAgICAgICd0Zk5hbWUnOiAnZGVwdGhfcmFkaXVzJyxcbiAgICAgICAgJ25hbWUnOiAncmFkaXVzJyxcbiAgICAgICAgJ3R5cGUnOiAnbnVtYmVyJyxcbiAgICAgICAgJ2RlZmF1bHRWYWx1ZSc6IDVcbiAgICAgIH0sXG4gICAgICB7XG4gICAgICAgICd0Zk5hbWUnOiAnYmlhcycsXG4gICAgICAgICduYW1lJzogJ2JpYXMnLFxuICAgICAgICAndHlwZSc6ICdudW1iZXInLFxuICAgICAgICAnZGVmYXVsdFZhbHVlJzogMVxuICAgICAgfSxcbiAgICAgIHtcbiAgICAgICAgJ3RmTmFtZSc6ICdhbHBoYScsXG4gICAgICAgICduYW1lJzogJ2FscGhhJyxcbiAgICAgICAgJ3R5cGUnOiAnbnVtYmVyJyxcbiAgICAgICAgJ2RlZmF1bHRWYWx1ZSc6IDFcbiAgICAgIH0sXG4gICAgICB7XG4gICAgICAgICd0Zk5hbWUnOiAnYmV0YScsXG4gICAgICAgICduYW1lJzogJ2JldGEnLFxuICAgICAgICAndHlwZSc6ICdudW1iZXInLFxuICAgICAgICAnZGVmYXVsdFZhbHVlJzogMC41XG4gICAgICB9XG4gICAgXVxuICB9LFxuICB7XG4gICAgJ3RmT3BOYW1lJzogJ1NvZnRtYXgnLFxuICAgICdjYXRlZ29yeSc6ICdub3JtYWxpemF0aW9uJyxcbiAgICAnaW5wdXRzJzogW1xuICAgICAge1xuICAgICAgICAnc3RhcnQnOiAwLFxuICAgICAgICAnbmFtZSc6ICd4JyxcbiAgICAgICAgJ3R5cGUnOiAndGVuc29yJ1xuICAgICAgfVxuICAgIF1cbiAgfSxcbiAge1xuICAgICd0Zk9wTmFtZSc6ICdMb2dTb2Z0bWF4JyxcbiAgICAnY2F0ZWdvcnknOiAnbm9ybWFsaXphdGlvbicsXG4gICAgJ2lucHV0cyc6IFtcbiAgICAgIHtcbiAgICAgICAgJ3N0YXJ0JzogMCxcbiAgICAgICAgJ25hbWUnOiAneCcsXG4gICAgICAgICd0eXBlJzogJ3RlbnNvcidcbiAgICAgIH1cbiAgICBdXG4gIH0sXG4gIHtcbiAgICAndGZPcE5hbWUnOiAnU3BhcnNlVG9EZW5zZScsXG4gICAgJ2NhdGVnb3J5JzogJ25vcm1hbGl6YXRpb24nLFxuICAgICdpbnB1dHMnOiBbXG4gICAgICB7XG4gICAgICAgICdzdGFydCc6IDAsXG4gICAgICAgICduYW1lJzogJ3NwYXJzZUluZGljZXMnLFxuICAgICAgICAndHlwZSc6ICd0ZW5zb3InXG4gICAgICB9LFxuICAgICAge1xuICAgICAgICAnc3RhcnQnOiAxLFxuICAgICAgICAnbmFtZSc6ICdvdXRwdXRTaGFwZScsXG4gICAgICAgICd0eXBlJzogJ251bWJlcltdJ1xuICAgICAgfSxcbiAgICAgIHtcbiAgICAgICAgJ3N0YXJ0JzogMixcbiAgICAgICAgJ25hbWUnOiAnc3BhcnNlVmFsdWVzJyxcbiAgICAgICAgJ3R5cGUnOiAndGVuc29yJ1xuICAgICAgfSxcbiAgICAgIHtcbiAgICAgICAgJ3N0YXJ0JzogMyxcbiAgICAgICAgJ25hbWUnOiAnZGVmYXVsdFZhbHVlJyxcbiAgICAgICAgJ3R5cGUnOiAndGVuc29yJ1xuICAgICAgfVxuICAgIF0sXG4gICAgJ2F0dHJzJzogW1xuICAgICAge1xuICAgICAgICAndGZOYW1lJzogJ3ZhbGlkYXRlX2luZGljZXMnLFxuICAgICAgICAnbmFtZSc6ICd2YWxpZGF0ZUluZGljZXMnLFxuICAgICAgICAndHlwZSc6ICdib29sJyxcbiAgICAgICAgJ2RlZmF1bHRWYWx1ZSc6IHRydWUsXG4gICAgICAgICdub3RTdXBwb3J0ZWQnOiB0cnVlXG4gICAgICB9XG4gICAgXVxuICB9XG5dXG47XG4iXX0=","/**\n * @license\n * Copyright 2022 Google LLC. All Rights Reserved.\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n * =============================================================================\n */\nexport const json = [\n {\n 'tfOpName': 'Bincount',\n 'category': 'reduction',\n 'inputs': [\n {\n 'start': 0,\n 'name': 'x',\n 'type': 'tensor'\n },\n {\n 'start': 1,\n 'name': 'size',\n 'type': 'number'\n },\n {\n 'start': 2,\n 'name': 'weights',\n 'type': 'tensor'\n }\n ]\n },\n {\n 'tfOpName': 'DenseBincount',\n 'category': 'reduction',\n 'inputs': [\n {\n 'start': 0,\n 'name': 'x',\n 'type': 'tensor'\n },\n {\n 'start': 1,\n 'name': 'size',\n 'type': 'number'\n },\n {\n 'start': 2,\n 'name': 'weights',\n 'type': 'tensor'\n }\n ],\n 'attrs': [\n {\n 'tfName': 'binary_output',\n 'name': 'binaryOutput',\n 'type': 'bool'\n }\n ]\n },\n {\n 'tfOpName': 'Max',\n 'category': 'reduction',\n 'inputs': [\n {\n 'start': 0,\n 'name': 'x',\n 'type': 'tensor'\n },\n {\n 'start': 1,\n 'name': 'axis',\n 'type': 'number[]'\n }\n ],\n 'attrs': [\n {\n 'tfName': 'keep_dims',\n 'name': 'keepDims',\n 'type': 'bool'\n }\n ]\n },\n {\n 'tfOpName': 'Mean',\n 'category': 'reduction',\n 'inputs': [\n {\n 'start': 0,\n 'name': 'x',\n 'type': 'tensor'\n },\n {\n 'start': 1,\n 'name': 'axis',\n 'type': 'number[]'\n }\n ],\n 'attrs': [\n {\n 'tfName': 'keep_dims',\n 'name': 'keepDims',\n 'type': 'bool'\n }\n ]\n },\n {\n 'tfOpName': 'Min',\n 'category': 'reduction',\n 'inputs': [\n {\n 'start': 0,\n 'name': 'x',\n 'type': 'tensor'\n },\n {\n 'start': 1,\n 'name': 'axis',\n 'type': 'number[]'\n }\n ],\n 'attrs': [\n {\n 'tfName': 'keep_dims',\n 'name': 'keepDims',\n 'type': 'bool'\n }\n ]\n },\n {\n 'tfOpName': 'Sum',\n 'category': 'reduction',\n 'inputs': [\n {\n 'start': 0,\n 'name': 'x',\n 'type': 'tensor'\n },\n {\n 'start': 1,\n 'name': 'axis',\n 'type': 'number[]'\n }\n ],\n 'attrs': [\n {\n 'tfName': 'keep_dims',\n 'name': 'keepDims',\n 'type': 'bool'\n }\n ]\n },\n {\n 'tfOpName': 'All',\n 'category': 'reduction',\n 'inputs': [\n {\n 'start': 0,\n 'name': 'x',\n 'type': 'tensor'\n },\n {\n 'start': 1,\n 'name': 'axis',\n 'type': 'number[]'\n }\n ],\n 'attrs': [\n {\n 'tfName': 'keep_dims',\n 'name': 'keepDims',\n 'type': 'bool'\n }\n ]\n },\n {\n 'tfOpName': 'Any',\n 'category': 'reduction',\n 'inputs': [\n {\n 'start': 0,\n 'name': 'x',\n 'type': 'tensor'\n },\n {\n 'start': 1,\n 'name': 'axis',\n 'type': 'number[]'\n }\n ],\n 'attrs': [\n {\n 'tfName': 'keep_dims',\n 'name': 'keepDims',\n 'type': 'bool'\n }\n ]\n },\n {\n 'tfOpName': 'ArgMax',\n 'category': 'reduction',\n 'inputs': [\n {\n 'start': 0,\n 'name': 'x',\n 'type': 'tensor'\n },\n {\n 'start': 1,\n 'name': 'axis',\n 'type': 'number'\n }\n ]\n },\n {\n 'tfOpName': 'ArgMin',\n 'category': 'reduction',\n 'inputs': [\n {\n 'start': 0,\n 'name': 'x',\n 'type': 'tensor'\n },\n {\n 'start': 1,\n 'name': 'axis',\n 'type': 'number'\n }\n ]\n },\n {\n 'tfOpName': 'Prod',\n 'category': 'reduction',\n 'inputs': [\n {\n 'start': 0,\n 'name': 'x',\n 'type': 'tensor'\n },\n {\n 'start': 1,\n 'name': 'axis',\n 'type': 'number[]'\n }\n ],\n 'attrs': [\n {\n 'tfName': 'keep_dims',\n 'name': 'keepDims',\n 'type': 'bool'\n }\n ]\n },\n {\n 'tfOpName': 'Cumprod',\n 'category': 'reduction',\n 'inputs': [\n {\n 'start': 0,\n 'name': 'x',\n 'type': 'tensor'\n },\n {\n 'start': 1,\n 'name': 'axis',\n 'type': 'number'\n }\n ],\n 'attrs': [\n {\n 'tfName': 'exclusive',\n 'name': 'exclusive',\n 'type': 'bool'\n },\n {\n 'tfName': 'reverse',\n 'name': 'reverse',\n 'type': 'bool'\n }\n ]\n },\n {\n 'tfOpName': 'Cumsum',\n 'category': 'reduction',\n 'inputs': [\n {\n 'start': 0,\n 'name': 'x',\n 'type': 'tensor'\n },\n {\n 'start': 1,\n 'name': 'axis',\n 'type': 'number'\n }\n ],\n 'attrs': [\n {\n 'tfName': 'exclusive',\n 'name': 'exclusive',\n 'type': 'bool'\n },\n {\n 'tfName': 'reverse',\n 'name': 'reverse',\n 'type': 'bool'\n }\n ]\n }\n];\n//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicmVkdWN0aW9uLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vLi4vLi4vdGZqcy1jb252ZXJ0ZXIvc3JjL29wZXJhdGlvbnMvb3BfbGlzdC9yZWR1Y3Rpb24udHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQ0E7Ozs7Ozs7Ozs7Ozs7OztHQWVHO0FBSUgsTUFBTSxDQUFDLE1BQU0sSUFBSSxHQUFlO0lBQzlCO1FBQ0UsVUFBVSxFQUFFLFVBQVU7UUFDdEIsVUFBVSxFQUFFLFdBQVc7UUFDdkIsUUFBUSxFQUFFO1lBQ1I7Z0JBQ0UsT0FBTyxFQUFFLENBQUM7Z0JBQ1YsTUFBTSxFQUFFLEdBQUc7Z0JBQ1gsTUFBTSxFQUFFLFFBQVE7YUFDakI7WUFDRDtnQkFDRSxPQUFPLEVBQUUsQ0FBQztnQkFDVixNQUFNLEVBQUUsTUFBTTtnQkFDZCxNQUFNLEVBQUUsUUFBUTthQUNqQjtZQUNEO2dCQUNFLE9BQU8sRUFBRSxDQUFDO2dCQUNWLE1BQU0sRUFBRSxTQUFTO2dCQUNqQixNQUFNLEVBQUUsUUFBUTthQUNqQjtTQUNGO0tBQ0Y7SUFDRDtRQUNFLFVBQVUsRUFBRSxlQUFlO1FBQzNCLFVBQVUsRUFBRSxXQUFXO1FBQ3ZCLFFBQVEsRUFBRTtZQUNSO2dCQUNFLE9BQU8sRUFBRSxDQUFDO2dCQUNWLE1BQU0sRUFBRSxHQUFHO2dCQUNYLE1BQU0sRUFBRSxRQUFRO2FBQ2pCO1lBQ0Q7Z0JBQ0UsT0FBTyxFQUFFLENBQUM7Z0JBQ1YsTUFBTSxFQUFFLE1BQU07Z0JBQ2QsTUFBTSxFQUFFLFFBQVE7YUFDakI7WUFDRDtnQkFDRSxPQUFPLEVBQUUsQ0FBQztnQkFDVixNQUFNLEVBQUUsU0FBUztnQkFDakIsTUFBTSxFQUFFLFFBQVE7YUFDakI7U0FDRjtRQUNELE9BQU8sRUFBRTtZQUNQO2dCQUNFLFFBQVEsRUFBRSxlQUFlO2dCQUN6QixNQUFNLEVBQUUsY0FBYztnQkFDdEIsTUFBTSxFQUFFLE1BQU07YUFDZjtTQUNGO0tBQ0Y7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USxFQUFFO1lBQ1I7Z0JBQ0UsT0FBTyxFQUFFLENBQUM7Z0JBQ1YsTUFBTSxFQUFFLEdBQUc7Z0JBQ1gsTUFBTSxFQUFFLFFBQVE7YUFDakI7WUFDRDtnQkFDRSxPQUFPLEVBQUUsQ0FBQztnQkFDVixNQUFNLEVBQUUsTUFBTTtnQkFDZCxNQUFNLEVBQUUsUUFBUTthQUNqQjtTQUNGO1FBQ0QsT0FBTyxFQUFFO1lBQ1A7Z0JBQ0UsUUFBUSxFQUFFLFdBQVc7Z0JBQ3JCLE1BQU0sRUFBRSxXQUFXO2dCQUNuQixNQUFNLEVBQUUsTUFBTTthQUNmO1lBQ0Q7Z0JBQ0UsUUFBUSxFQUFFLFNBQVM7Z0JBQ25CLE1BQU0sRUFBRSxTQUFTO2dCQUNqQixNQUFNLEVBQUUsTUFBTTthQUNmO1NBQ0Y7S0FDRjtJQUNEO1FBQ0UsVUFBVSxFQUFFLFFBQVE7UUFDcEIsVUFBVSxFQUFFLFdBQVc7UUFDdkIsUUFBUSxFQUFFO1lBQ1I7Z0JBQ0UsT0FBTyxFQUFFLENBQUM7Z0JBQ1YsTUFBTSxFQUFFLEdBQUc7Z0JBQ1gsTUFBTSxFQUFFLFFBQVE7YUFDakI7WUFDRDtnQkFDRSxPQUFPLEVBQUUsQ0FBQztnQkFDVixNQUFNLEVBQUUsTUFBTTtnQkFDZCxNQUFNLEVBQUUsUUFBUTthQUNqQjtTQUNGO1FBQ0QsT0FBTyxFQUFFO1lBQ1A7Z0JBQ0UsUUFBUSxFQUFFLFdBQVc7Z0JBQ3JCLE1BQU0sRUFBRSxXQUFXO2dCQUNuQixNQUFNLEVBQUUsTUFBTTthQUNmO1lBQ0Q7Z0JBQ0UsUUFBUSxFQUFFLFNBQVM7Z0JBQ25CLE1BQU0sRUFBRSxTQUFTO2dCQUNqQixNQUFNLEVBQUUsTUFBTTthQUNmO1NBQ0Y7S0FDRjtDQUNGLENBQ0EiLCJzb3VyY2VzQ29udGVudCI6WyJcbi8qKlxuICogQGxpY2Vuc2VcbiAqIENvcHlyaWdodCAyMDIyIEdvb2dsZSBMTEMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuXG4gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgXCJMaWNlbnNlXCIpO1xuICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLlxuICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0XG4gKlxuICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wXG4gKlxuICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZVxuICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gXCJBUyBJU1wiIEJBU0lTLFxuICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuXG4gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kXG4gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS5cbiAqID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4gKi9cblxuaW1wb3J0IHtPcE1hcHBlcn0gZnJvbSAnLi4vdHlwZXMnO1xuXG5leHBvcnQgY29uc3QganNvbjogT3BNYXBwZXJbXSA9IFtcbiAge1xuICAgICd0Zk9wTmFtZSc6ICdCaW5jb3VudCcsXG4gICAgJ2NhdGVnb3J5JzogJ3JlZHVjdGlvbicsXG4gICAgJ2lucHV0cyc6IFtcbiAgICAgIHtcbiAgICAgICAgJ3N0YXJ0JzogMCxcbiAgICAgICAgJ25hbWUnOiAneCcsXG4gICAgICAgICd0eXBlJzogJ3RlbnNvcidcbiAgICAgIH0sXG4gICAgICB7XG4gICAgICAgICdzdGFydCc6IDEsXG4gICAgICAgICduYW1lJzogJ3NpemUnLFxuICAgICAgICAndHlwZSc6ICdudW1iZXInXG4gICAgICB9LFxuICAgICAge1xuICAgICAgICAnc3RhcnQnOiAyLFxuICAgICAgICAnbmFtZSc6ICd3ZWlnaHRzJyxcbiAgICAgICAgJ3R5cGUnOiAndGVuc29yJ1xuICAgICAgfVxuICAgIF1cbiAgfSxcbiAge1xuICAgICd0Zk9wTmFtZSc6ICdEZW5zZUJpbmNvdW50JyxcbiAgICAnY2F0ZWdvcnknOiAncmVkdWN0aW9uJyxcbiAgICAnaW5wdXRzJzogW1xuICAgICAge1xuICAgICAgICAnc3RhcnQnOiAwLFxuICAgICAgICAnbmFtZSc6ICd4JyxcbiAgICAgICAgJ3R5cGUnOiAndGVuc29yJ1xuICAgICAgfSxcbiAgICAgIHtcbiAgICAgICAgJ3N0YXJ0JzogMSxcbiAgICAgICAgJ25hbWUnOiAnc2l6ZScsXG4gICAgICAgICd0eXBlJzogJ251bWJlcidcbiAgICAgIH0sXG4gICAgICB7XG4gICAgICAgICdzdGFydCc6IDIsXG4gICAgICAgICduYW1lJzogJ3dlaWdodHMnLFxuICAgICAgICAndHlwZSc6ICd0ZW5zb3InXG4gICAgICB9XG4gICAgXSxcbiAgICAnYXR0cnMnOiBbXG4gICAgICB7XG4gICAgICAgICd0Zk5hbWUnOiAnYmluYXJ5X291dHB1dCcsXG4gICAgICAgICduYW1lJzogJ2JpbmFyeU91dHB1dCcsXG4gICAgICAgICd0eXBlJzogJ2Jvb2wnXG4gICAgICB9XG4gICAgXVxuICB9LFxuICB7XG4gICAgJ3RmT3BOYW1lJzogJ01heCcsXG4gICAgJ2NhdGVnb3J5JzogJ3JlZHVjdGlvbicsXG4gICAgJ2lucHV0cyc6IFtcbiAgICAgIHtcbiAgICAgICAgJ3N0YXJ0JzogMCxcbiAgICAgICAgJ25hbWUnOiAneCcsXG4gICAgICAgICd0eXBlJzogJ3RlbnNvcidcbiAgICAgIH0sXG4gICAgICB7XG4gICAgICAgICdzdGFydCc6IDEsXG4gICAgICAgICduYW1lJzogJ2F4aXMnLFxuICAgICAgICAndHlwZSc6ICdudW1iZXJbXSdcbiAgICAgIH1cbiAgICBdLFxuICAgICdhdHRycyc6IFtcbiAgICAgIHtcbiAgICAgICAgJ3RmTmFtZSc6ICdrZWVwX2RpbXMnLFxuICAgICAgICAnbmFtZSc6ICdrZWVwRGltcycsXG4gICAgICAgICd0eXBlJzogJ2Jvb2wnXG4gICAgICB9XG4gICAgXVxuICB9LFxuICB7XG4gICAgJ3RmT3BOYW1lJzogJ01lYW4nLFxuICAgICdjYXRlZ29yeSc6ICdyZWR1Y3Rpb24nLFxuICAgICdpbnB1dHMnOiBbXG4gICAgICB7XG4gICAgICAgICdzdGFydCc6IDAsXG4gICAgICAgICduYW1lJzogJ3gnLFxuICAgICAgICAndHlwZSc6ICd0ZW5zb3InXG4gICAgICB9LFxuICAgICAge1xuICAgICAgICAnc3RhcnQnOiAxLFxuICAgICAgICAnbmFtZSc6ICdheGlzJyxcbiAgICAgICAgJ3R5cGUnOiAnbnVtYmVyW10nXG4gICAgICB9XG4gICAgXSxcbiAgICAnYXR0cnMnOiBbXG4gICAgICB7XG4gICAgICAgICd0Zk5hbWUnOiAna2VlcF9kaW1zJyxcbiAgICAgICAgJ25hbWUnOiAna2VlcERpbXMnLFxuICAgICAgICAndHlwZSc6ICdib29sJ1xuICAgICAgfVxuICAgIF1cbiAgfSxcbiAge1xuICAgICd0Zk9wTmFtZSc6ICdNaW4nLFxuICAgICdjYXRlZ29yeSc6ICdyZWR1Y3Rpb24nLFxuICAgICdpbnB1dHMnOiBbXG4gICAgICB7XG4gICAgICAgICdzdGFydCc6IDAsXG4gICAgICAgICduYW1lJzogJ3gnLFxuICAgICAgICAndHlwZSc6ICd0ZW5zb3InXG4gICAgICB9LFxuICAgICAge1xuICAgICAgICAnc3RhcnQnOiAxLFxuICAgICAgICAnbmFtZSc6ICdheGlzJyxcbiAgICAgICAgJ3R5cGUnOiAnbnVtYmVyW10nXG4gICAgICB9XG4gICAgXSxcbiAgICAnYXR0cnMnOiBbXG4gICAgICB7XG4gICAgICAgICd0Zk5hbWUnOiAna2VlcF9kaW1zJyxcbiAgICAgICAgJ25hbWUnOiAna2VlcERpbXMnLFxuICAgICAgICAndHlwZSc6ICdib29sJ1xuICAgICAgfVxuICAgIF1cbiAgfSxcbiAge1xuICAgICd0Zk9wTmFtZSc6ICdTdW0nLFxuICAgICdjYXRlZ29yeSc6ICdyZWR1Y3Rpb24nLFxuICAgICdpbnB1dHMnOiBbXG4gICAgICB7XG4gICAgICAgICdzdGFydCc6IDAsXG4gICAgICAgICduYW1lJzogJ3gnLFxuICAgICAgICAndHlwZSc6ICd0ZW5zb3InXG4gICAgICB9LFxuICAgICAge1xuICAgICAgICAnc3RhcnQnOiAxLFxuICAgICAgICAnbmFtZSc6ICdheGlzJyxcbiAgICAgICAgJ3R5cGUnOiAnbnVtYmVyW10nXG4gICAgICB9XG4gICAgXSxcbiAgICAnYXR0cnMnOiBbXG4gICAgICB7XG4gICAgICAgICd0Zk5hbWUnOiAna2VlcF9kaW1zJyxcbiAgICAgICAgJ25hbWUnOiAna2VlcERpbXMnLFxuICAgICAgICAndHlwZSc6ICdib29sJ1xuICAgICAgfVxuICAgIF1cbiAgfSxcbiAge1xuICAgICd0Zk9wTmFtZSc6ICdBbGwnLFxuICAgICdjYXRlZ29yeSc6ICdyZWR1Y3Rpb24nLFxuICAgICdpbnB1dHMnOiBbXG4gICAgICB7XG4gICAgICAgICdzdGFydCc6IDAsXG4gICAgICAgICduYW1lJzogJ3gnLFxuICAgICAgICAndHlwZSc6ICd0ZW5zb3InXG4gICAgICB9LFxuICAgICAge1xuICAgICAgICAnc3RhcnQnOiAxLFxuICAgICAgICAnbmFtZSc6ICdheGlzJyxcbiAgICAgICAgJ3R5cGUnOiAnbnVtYmVyW10nXG4gICAgICB9XG4gICAgXSxcbiAgICAnYXR0cnMnOiBbXG4gICAgICB7XG4gICAgICAgICd0Zk5hbWUnOiAna2VlcF9kaW1zJyxcbiAgICAgICAgJ25hbWUnOiAna2VlcERpbXMnLFxuICAgICAgICAndHlwZSc6ICdib29sJ1xuICAgICAgfVxuICAgIF1cbiAgfSxcbiAge1xuICAgICd0Zk9wTmFtZSc6ICdBbnknLFxuICAgICdjYXRlZ29yeSc6ICdyZWR1Y3Rpb24nLFxuICAgICdpbnB1dHMnOiBbXG4gICAgICB7XG4gICAgICAgICdzdGFydCc6IDAsXG4gICAgICAgICduYW1lJzogJ3gnLFxuICAgICAgICAndHlwZSc6ICd0ZW5zb3InXG4gICAgICB9LFxuICAgICAge1xuICAgICAgICAnc3RhcnQnOiAxLFxuICAgICAgICAnbmFtZSc6ICdheGlzJyxcbiAgICAgICAgJ3R5cGUnOiAnbnVtYmVyW10nXG4gICAgICB9XG4gICAgXSxcbiAgICAnYXR0cnMnOiBbXG4gICAgICB7XG4gICAgICAgICd0Zk5hbWUnOiAna2VlcF9kaW1zJyxcbiAgICAgICAgJ25hbWUnOiAna2VlcERpbXMnLFxuICAgICAgICAndHlwZSc6ICdib29sJ1xuICAgICAgfVxuICAgIF1cbiAgfSxcbiAge1xuICAgICd0Zk9wTmFtZSc6ICdBcmdNYXgnLFxuICAgICdjYXRlZ29yeSc6ICdyZWR1Y3Rpb24nLFxuICAgICdpbnB1dHMnOiBbXG4gICAgICB7XG4gICAgICAgICdzdGFydCc6IDAsXG4gICAgICAgICduYW1lJzogJ3gnLFxuICAgICAgICAndHlwZSc6ICd0ZW5zb3InXG4gICAgICB9LFxuICAgICAge1xuICAgICAgICAnc3RhcnQnOiAxLFxuICAgICAgICAnbmFtZSc6ICdheGlzJyxcbiAgICAgICAgJ3R5cGUnOiAnbnVtYmVyJ1xuICAgICAgfVxuICAgIF1cbiAgfSxcbiAge1xuICAgICd0Zk9wTmFtZSc6ICdBcmdNaW4nLFxuICAgICdjYXRlZ29yeSc6ICdyZWR1Y3Rpb24nLFxuICAgICdpbnB1dHMnOiBbXG4gICAgICB7XG4gICAgICAgICdzdGFydCc6IDAsXG4gICAgICAgICduYW1lJzogJ3gnLFxuICAgICAgICAndHlwZSc6ICd0ZW5zb3InXG4gICAgICB9LFxuICAgICAge1xuICAgICAgICAnc3RhcnQnOiAxLFxuICAgICAgICAnbmFtZSc6ICdheGlzJyxcbiAgICAgICAgJ3R5cGUnOiAnbnVtYmVyJ1xuICAgICAgfVxuICAgIF1cbiAgfSxcbiAge1xuICAgICd0Zk9wTmFtZSc6ICdQcm9kJyxcbiAgICAnY2F0ZWdvcnknOiAncmVkdWN0aW9uJyxcbiAgICAnaW5wdXRzJzogW1xuICAgICAge1xuICAgICAgICAnc3RhcnQnOiAwLFxuICAgICAgICAnbmFtZSc6ICd4JyxcbiAgICAgICAgJ3R5cGUnOiAndGVuc29yJ1xuICAgICAgfSxcbiAgICAgIHtcbiAgICAgICAgJ3N0YXJ0JzogMSxcbiAgICAgICAgJ25hbWUnOiAnYXhpcycsXG4gICAgICAgICd0eXBlJzogJ251bWJlcltdJ1xuICAgICAgfVxuICAgIF0sXG4gICAgJ2F0dHJzJzogW1xuICAgICAge1xuICAgICAgICAndGZOYW1lJzogJ2tlZXBfZGltcycsXG4gICAgICAgICduYW1lJzogJ2tlZXBEaW1zJyxcbiAgICAgICAgJ3R5cGUnOiAnYm9vbCdcbiAgICAgIH1cbiAgICBdXG4gIH0sXG4gIHtcbiAgICAndGZPcE5hbWUnOiAnQ3VtcHJvZCcsXG4gICAgJ2NhdGVnb3J5JzogJ3JlZHVjdGlvbicsXG4gICAgJ2lucHV0cyc6IFtcbiAgICAgIHtcbiAgICAgICAgJ3N0YXJ0JzogMCxcbiAgICAgICAgJ25hbWUnOiAneCcsXG4gICAgICAgICd0eXBlJzogJ3RlbnNvcidcbiAgICAgIH0sXG4gICAgICB7XG4gICAgICAgICdzdGFydCc6IDEsXG4gICAgICAgICduYW1lJzogJ2F4aXMnLFxuICAgICAgICAndHlwZSc6ICdudW1iZXInXG4gICAgICB9XG4gICAgXSxcbiAgICAnYXR0cnMnOiBbXG4gICAgICB7XG4gICAgICAgICd0Zk5hbWUnOiAnZXhjbHVzaXZlJyxcbiAgICAgICAgJ25hbWUnOiAnZXhjbHVzaXZlJyxcbiAgICAgICAgJ3R5cGUnOiAnYm9vbCdcbiAgICAgIH0sXG4gICAgICB7XG4gICAgICAgICd0Zk5hbWUnOiAncmV2ZXJzZScsXG4gICAgICAgICduYW1lJzogJ3JldmVyc2UnLFxuICAgICAgICAndHlwZSc6ICdib29sJ1xuICAgICAgfVxuICAgIF1cbiAgfSxcbiAge1xuICAgICd0Zk9wTmFtZSc6ICdDdW1zdW0nLFxuICAgICdjYXRlZ29yeSc6ICdyZWR1Y3Rpb24nLFxuICAgICdpbnB1dHMnOiBbXG4gICAgICB7XG4gICAgICAgICdzdGFydCc6IDAsXG4gICAgICAgICduYW1lJzogJ3gnLFxuICAgICAgICAndHlwZSc6ICd0ZW5zb3InXG4gICAgICB9LFxuICAgICAge1xuICAgICAgICAnc3RhcnQnOiAxLFxuICAgICAgICAnbmFtZSc6ICdheGlzJyxcbiAgICAgICAgJ3R5cGUnOiAnbnVtYmVyJ1xuICAgICAgfVxuICAgIF0sXG4gICAgJ2F0dHJzJzogW1xuICAgICAge1xuICAgICAgICAndGZOYW1lJzogJ2V4Y2x1c2l2ZScsXG4gICAgICAgICduYW1lJzogJ2V4Y2x1c2l2ZScsXG4gICAgICAgICd0eXBlJzogJ2Jvb2wnXG4gICAgICB9LFxuICAgICAge1xuICAgICAgICAndGZOYW1lJzogJ3JldmVyc2UnLFxuICAgICAgICAnbmFtZSc6ICdyZXZlcnNlJyxcbiAgICAgICAgJ3R5cGUnOiAnYm9vbCdcbiAgICAgIH1cbiAgICBdXG4gIH1cbl1cbjtcbiJdfQ==","/**\n * @license\n * Copyright 2022 Google LLC. All Rights Reserved.\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n * =============================================================================\n */\nexport const json = [\n {\n 'tfOpName': 'ConcatV2',\n 'category': 'slice_join',\n 'inputs': [\n {\n 'start': 0,\n 'end': -1,\n 'name': 'tensors',\n 'type': 'tensors'\n },\n {\n 'start': -1,\n 'name': 'axis',\n 'type': 'number'\n }\n ],\n 'attrs': [\n {\n 'tfName': 'N',\n 'name': 'n',\n 'type': 'number',\n 'defaultValue': 2\n }\n ]\n },\n {\n 'tfOpName': 'Concat',\n 'category': 'slice_join',\n 'inputs': [\n {\n 'start': 1,\n 'end': 0,\n 'name': 'tensors',\n 'type': 'tensors'\n },\n {\n 'start': 0,\n 'name': 'axis',\n 'type': 'number'\n }\n ],\n 'attrs': [\n {\n 'tfName': 'N',\n 'name': 'n',\n 'type': 'number',\n 'defaultValue': 2\n }\n ]\n },\n {\n 'tfOpName': 'GatherV2',\n 'category': 'slice_join',\n 'inputs': [\n {\n 'start': 0,\n 'name': 'x',\n 'type': 'tensor'\n },\n {\n 'start': 1,\n 'name': 'indices',\n 'type': 'tensor'\n },\n {\n 'start': 2,\n 'name': 'axis',\n 'type': 'number',\n 'defaultValue': 0\n }\n ],\n 'attrs': [\n {\n 'tfName': 'batch_dims',\n 'name': 'batchDims',\n 'type': 'number',\n 'defaultValue': 0\n }\n ]\n },\n {\n 'tfOpName': 'Gather',\n 'category': 'slice_join',\n 'inputs': [\n {\n 'start': 0,\n 'name': 'x',\n 'type': 'tensor'\n },\n {\n 'start': 1,\n 'name': 'indices',\n 'type': 'tensor'\n }\n ],\n 'attrs': [\n {\n 'tfName': 'validate_indices',\n 'name': 'validateIndices',\n 'type': 'bool',\n 'notSupported': true\n }\n ]\n },\n {\n 'tfOpName': 'Reverse',\n 'category': 'slice_join',\n 'inputs': [\n {\n 'start': 0,\n 'name': 'x',\n 'type': 'tensor'\n },\n {\n 'start': 1,\n 'name': 'dims',\n 'type': 'bool[]'\n }\n ]\n },\n {\n 'tfOpName': 'ReverseV2',\n 'category': 'slice_join',\n 'inputs': [\n {\n 'start': 0,\n 'name': 'x',\n 'type': 'tensor'\n },\n {\n 'start': 1,\n 'name': 'axis',\n 'type': 'number[]'\n }\n ]\n },\n {\n 'tfOpName': 'Slice',\n 'category': 'slice_join',\n 'inputs': [\n {\n 'start': 0,\n 'name': 'x',\n 'type': 'tensor'\n },\n {\n 'start': 1,\n 'name': 'begin',\n 'type': 'number[]'\n },\n {\n 'start': 2,\n 'name': 'size',\n 'type': 'number[]'\n }\n ]\n },\n {\n 'tfOpName': 'StridedSlice',\n 'category': 'slice_join',\n 'inputs': [\n {\n 'start': 0,\n 'name': 'x',\n 'type': 'tensor'\n },\n {\n 'start': 1,\n 'name': 'begin',\n 'type': 'number[]'\n },\n {\n 'start': 2,\n 'name': 'end',\n 'type': 'number[]'\n },\n {\n 'start': 3,\n 'name': 'strides',\n 'type': 'number[]'\n }\n ],\n 'attrs': [\n {\n 'tfName': 'begin_mask',\n 'name': 'beginMask',\n 'type': 'number',\n 'defaultValue': 0\n },\n {\n 'tfName': 'end_mask',\n 'name': 'endMask',\n 'type': 'number',\n 'defaultValue': 0\n },\n {\n 'tfName': 'new_axis_mask',\n 'name': 'newAxisMask',\n 'type': 'number',\n 'defaultValue': 0\n },\n {\n 'tfName': 'ellipsis_mask',\n 'name': 'ellipsisMask',\n 'type': 'number',\n 'defaultValue': 0\n },\n {\n 'tfName': 'shrink_axis_mask',\n 'name': 'shrinkAxisMask',\n 'type': 'number',\n 'defaultValue': 0\n }\n ]\n },\n {\n 'tfOpName': 'Pack',\n 'category': 'slice_join',\n 'inputs': [\n {\n 'start': 0,\n 'end': 0,\n 'name': 'tensors',\n 'type': 'tensors'\n }\n ],\n 'attrs': [\n {\n 'tfName': 'axis',\n 'name': 'axis',\n 'type': 'number',\n 'defaultValue': 0\n }\n ]\n },\n {\n 'tfOpName': 'Unpack',\n 'category': 'slice_join',\n 'inputs': [\n {\n 'start': 0,\n 'name': 'tensor',\n 'type': 'tensor'\n }\n ],\n 'attrs': [\n {\n 'tfName': 'axis',\n 'name': 'axis',\n 'type': 'number',\n 'defaultValue': 0\n },\n {\n 'tfName': 'num',\n 'name': 'num',\n 'type': 'number',\n 'defaultValue': 0,\n 'notSupported': true\n }\n ]\n },\n {\n 'tfOpName': 'Tile',\n 'category': 'slice_join',\n 'inputs': [\n {\n 'start': 0,\n 'name': 'x',\n 'type': 'tensor'\n },\n {\n 'start': 1,\n 'name': 'reps',\n 'type': 'number[]'\n }\n ]\n },\n {\n 'tfOpName': 'Split',\n 'category': 'slice_join',\n 'inputs': [\n {\n 'start': 0,\n 'name': 'axis',\n 'type': 'number',\n 'defaultValue': 0\n },\n {\n 'start': 1,\n 'name': 'x',\n 'type': 'tensor'\n }\n ],\n 'attrs': [\n {\n 'tfName': 'num_split',\n 'name': 'numOrSizeSplits',\n 'type': 'number',\n 'defaultValue': 1\n }\n ]\n },\n {\n 'tfOpName': 'SplitV',\n 'category': 'slice_join',\n 'inputs': [\n {\n 'start': 0,\n 'name': 'x',\n 'type': 'tensor'\n },\n {\n 'start': 1,\n 'name': 'numOrSizeSplits',\n 'type': 'number[]'\n },\n {\n 'start': 2,\n 'name': 'axis',\n 'type': 'number',\n 'defaultValue': 0\n }\n ]\n },\n {\n 'tfOpName': 'ScatterNd',\n 'category': 'slice_join',\n 'inputs': [\n {\n 'start': 0,\n 'name': 'indices',\n 'type': 'tensor'\n },\n {\n 'start': 1,\n 'name': 'values',\n 'type': 'tensor'\n },\n {\n 'start': 2,\n 'name': 'shape',\n 'type': 'number[]'\n }\n ]\n },\n {\n 'tfOpName': 'GatherNd',\n 'category': 'slice_join',\n 'inputs': [\n {\n 'start': 0,\n 'name': 'x',\n 'type': 'tensor'\n },\n {\n 'start': 1,\n 'name': 'indices',\n 'type': 'tensor'\n }\n ]\n },\n {\n 'tfOpName': 'SparseToDense',\n 'category': 'slice_join',\n 'inputs': [\n {\n 'start': 0,\n 'name': 'sparseIndices',\n 'type': 'tensor'\n },\n {\n 'start': 1,\n 'name': 'outputShape',\n 'type': 'number[]'\n },\n {\n 'start': 2,\n 'name': 'sparseValues',\n 'type': 'tensor'\n },\n {\n 'start': 3,\n 'name': 'defaultValue',\n 'type': 'tensor'\n }\n ],\n 'attrs': [\n {\n 'tfName': 'validate_indices',\n 'name': 'validateIndices',\n 'type': 'bool',\n 'defaultValue': false,\n 'notSupported': true\n }\n ]\n }\n];\n//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic2xpY2Vfam9pbi5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uLy4uLy4uL3RmanMtY29udmVydGVyL3NyYy9vcGVyYXRpb25zL29wX2xpc3Qvc2xpY2Vfam9pbi50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFDQTs7Ozs7Ozs7Ozs7Ozs7O0dBZUc7QUFJSCxNQUFNLENBQUMsTUFBTSxJQUFJLEdBQWU7SUFDOUI7UUFDRSxVQUFVLEVBQUUsVUFBVTtRQUN0QixVQUFVLEVBQUUsWUFBWTtRQUN4QixRQUFRLEVBQUU7WUFDUjtnQkFDRSxPQUFPLEVBQUUsQ0FBQztnQkFDVixLQUFLLEVBQUUsQ0FBQyxDQUFDO2dCQUNULE1BQU0sRUFBRSxTQUFTO2dCQUNqQixNQUFNLEVBQUUsU0FBUzthQUNsQjtZQUNEO2dCQUNFLE9BQU8sRUFBRSxDQUFDLENBQUM7Z0JBQ1gsTUFBTSxFQUFFLE1BQU07Z0JBQ2QsTUFBTSxFQUFFLFFBQVE7YUFDakI7U0FDRjtRQUNELE9BQU8sRUFBRTtZQUNQO2dCQUNFLFFBQVEsRUFBRSxHQUFHO2dCQUNiLE1BQU0sRUFBRSxHQUFHO2dCQUNYLE1BQU0sRUFBRSxRQUFRO2dCQUNoQixjQUFjLEVBQUUsQ0FBQzthQUNsQjtTQUNGO0tBQ0Y7SUFDRDtRQUNFLFVBQVUsRUFBRSxRQUFRO1FBQ3BCLFVBQVUsRUFBRSxZQUFZO1FBQ3hCLFFBQVEsRUFBRTtZQUNSO2dCQUNFLE9BQU8sRUFBRSxDQUFDO2dCQUNWLEtBQUssRUFBRSxDQUFDO2dCQUNSLE1BQU0sRUFBRSxTQUFTO2dCQUNqQixNQUFNLEVBQUUsU0FBUzthQUNsQjtZQUNEO2dCQUNFLE9BQU8sRUFBRSxDQUFDO2dCQUNWLE1BQU0sRUFBRSxNQUFNO2dCQUNkLE1BQU0sRUFBRSxRQUFRO2FBQ2pCO1NBQ0Y7UUFDRCxPQUFPLEVBQUU7WUFDUDtnQkFDRSxRQUFRLEVBQUUsR0FBRztnQkFDYixNQUFNLEVBQUUsR0FBRztnQkFDWCxNQUFNLEVBQUUs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LFFBQVE7YUFDakI7U0FDRjtLQUNGO0lBQ0Q7UUFDRSxVQUFVLEVBQUUsZUFBZTtRQUMzQixVQUFVLEVBQUUsWUFBWTtRQUN4QixRQUFRLEVBQUU7WUFDUjtnQkFDRSxPQUFPLEVBQUUsQ0FBQztnQkFDVixNQUFNLEVBQUUsZUFBZTtnQkFDdkIsTUFBTSxFQUFFLFFBQVE7YUFDakI7WUFDRDtnQkFDRSxPQUFPLEVBQUUsQ0FBQztnQkFDVixNQUFNLEVBQUUsYUFBYTtnQkFDckIsTUFBTSxFQUFFLFVBQVU7YUFDbkI7WUFDRDtnQkFDRSxPQUFPLEVBQUUsQ0FBQztnQkFDVixNQUFNLEVBQUUsY0FBYztnQkFDdEIsTUFBTSxFQUFFLFFBQVE7YUFDakI7WUFDRDtnQkFDRSxPQUFPLEVBQUUsQ0FBQztnQkFDVixNQUFNLEVBQUUsY0FBYztnQkFDdEIsTUFBTSxFQUFFLFFBQVE7YUFDakI7U0FDRjtRQUNELE9BQU8sRUFBRTtZQUNQO2dCQUNFLFFBQVEsRUFBRSxrQkFBa0I7Z0JBQzVCLE1BQU0sRUFBRSxpQkFBaUI7Z0JBQ3pCLE1BQU0sRUFBRSxNQUFNO2dCQUNkLGNBQWMsRUFBRSxLQUFLO2dCQUNyQixjQUFjLEVBQUUsSUFBSTthQUNyQjtTQUNGO0tBQ0Y7Q0FDRixDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiXG4vKipcbiAqIEBsaWNlbnNlXG4gKiBDb3B5cmlnaHQgMjAyMiBHb29nbGUgTExDLiBBbGwgUmlnaHRzIFJlc2VydmVkLlxuICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlIFwiTGljZW5zZVwiKTtcbiAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS5cbiAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdFxuICpcbiAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMFxuICpcbiAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmVcbiAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuIFwiQVMgSVNcIiBCQVNJUyxcbiAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLlxuICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZFxuICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuXG4gKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuICovXG5cbmltcG9ydCB7T3BNYXBwZXJ9IGZyb20gJy4uL3R5cGVzJztcblxuZXhwb3J0IGNvbnN0IGpzb246IE9wTWFwcGVyW10gPSBbXG4gIHtcbiAgICAndGZPcE5hbWUnOiAnQ29uY2F0VjInLFxuICAgICdjYXRlZ29yeSc6ICdzbGljZV9qb2luJyxcbiAgICAnaW5wdXRzJzogW1xuICAgICAge1xuICAgICAgICAnc3RhcnQnOiAwLFxuICAgICAgICAnZW5kJzogLTEsXG4gICAgICAgICduYW1lJzogJ3RlbnNvcnMnLFxuICAgICAgICAndHlwZSc6ICd0ZW5zb3JzJ1xuICAgICAgfSxcbiAgICAgIHtcbiAgICAgICAgJ3N0YXJ0JzogLTEsXG4gICAgICAgICduYW1lJzogJ2F4aXMnLFxuICAgICAgICAndHlwZSc6ICdudW1iZXInXG4gICAgICB9XG4gICAgXSxcbiAgICAnYXR0cnMnOiBbXG4gICAgICB7XG4gICAgICAgICd0Zk5hbWUnOiAnTicsXG4gICAgICAgICduYW1lJzogJ24nLFxuICAgICAgICAndHlwZSc6ICdudW1iZXInLFxuICAgICAgICAnZGVmYXVsdFZhbHVlJzogMlxuICAgICAgfVxuICAgIF1cbiAgfSxcbiAge1xuICAgICd0Zk9wTmFtZSc6ICdDb25jYXQnLFxuICAgICdjYXRlZ29yeSc6ICdzbGljZV9qb2luJyxcbiAgICAnaW5wdXRzJzogW1xuICAgICAge1xuICAgICAgICAnc3RhcnQnOiAxLFxuICAgICAgICAnZW5kJzogMCxcbiAgICAgICAgJ25hbWUnOiAndGVuc29ycycsXG4gICAgICAgICd0eXBlJzogJ3RlbnNvcnMnXG4gICAgICB9LFxuICAgICAge1xuICAgICAgICAnc3RhcnQnOiAwLFxuICAgICAgICAnbmFtZSc6ICdheGlzJyxcbiAgICAgICAgJ3R5cGUnOiAnbnVtYmVyJ1xuICAgICAgfVxuICAgIF0sXG4gICAgJ2F0dHJzJzogW1xuICAgICAge1xuICAgICAgICAndGZOYW1lJzogJ04nLFxuICAgICAgICAnbmFtZSc6ICduJyxcbiAgICAgICAgJ3R5cGUnOiAnbnVtYmVyJyxcbiAgICAgICAgJ2RlZmF1bHRWYWx1ZSc6IDJcbiAgICAgIH1cbiAgICBdXG4gIH0sXG4gIHtcbiAgICAndGZPcE5hbWUnOiAnR2F0aGVyVjInLFxuICAgICdjYXRlZ29yeSc6ICdzbGljZV9qb2luJyxcbiAgICAnaW5wdXRzJzogW1xuICAgICAge1xuICAgICAgICAnc3RhcnQnOiAwLFxuICAgICAgICAnbmFtZSc6ICd4JyxcbiAgICAgICAgJ3R5cGUnOiAndGVuc29yJ1xuICAgICAgfSxcbiAgICAgIHtcbiAgICAgICAgJ3N0YXJ0JzogMSxcbiAgICAgICAgJ25hbWUnOiAnaW5kaWNlcycsXG4gICAgICAgICd0eXBlJzogJ3RlbnNvcidcbiAgICAgIH0sXG4gICAgICB7XG4gICAgICAgICdzdGFydCc6IDIsXG4gICAgICAgICduYW1lJzogJ2F4aXMnLFxuICAgICAgICAndHlwZSc6ICdudW1iZXInLFxuICAgICAgICAnZGVmYXVsdFZhbHVlJzogMFxuICAgICAgfVxuICAgIF0sXG4gICAgJ2F0dHJzJzogW1xuICAgICAge1xuICAgICAgICAndGZOYW1lJzogJ2JhdGNoX2RpbXMnLFxuICAgICAgICAnbmFtZSc6ICdiYXRjaERpbXMnLFxuICAgICAgICAndHlwZSc6ICdudW1iZXInLFxuICAgICAgICAnZGVmYXVsdFZhbHVlJzogMFxuICAgICAgfVxuICAgIF1cbiAgfSxcbiAge1xuICAgICd0Zk9wTmFtZSc6ICdHYXRoZXInLFxuICAgICdjYXRlZ29yeSc6ICdzbGljZV9qb2luJyxcbiAgICAnaW5wdXRzJzogW1xuICAgICAge1xuICAgICAgICAnc3RhcnQnOiAwLFxuICAgICAgICAnbmFtZSc6ICd4JyxcbiAgICAgICAgJ3R5cGUnOiAndGVuc29yJ1xuICAgICAgfSxcbiAgICAgIHtcbiAgICAgICAgJ3N0YXJ0JzogMSxcbiAgICAgICAgJ25hbWUnOiAnaW5kaWNlcycsXG4gICAgICAgICd0eXBlJzogJ3RlbnNvcidcbiAgICAgIH1cbiAgICBdLFxuICAgICdhdHRycyc6IFtcbiAgICAgIHtcbiAgICAgICAgJ3RmTmFtZSc6ICd2YWxpZGF0ZV9pbmRpY2VzJyxcbiAgICAgICAgJ25hbWUnOiAndmFsaWRhdGVJbmRpY2VzJyxcbiAgICAgICAgJ3R5cGUnOiAnYm9vbCcsXG4gICAgICAgICdub3RTdXBwb3J0ZWQnOiB0cnVlXG4gICAgICB9XG4gICAgXVxuICB9LFxuICB7XG4gICAgJ3RmT3BOYW1lJzogJ1JldmVyc2UnLFxuICAgICdjYXRlZ29yeSc6ICdzbGljZV9qb2luJyxcbiAgICAnaW5wdXRzJzogW1xuICAgICAge1xuICAgICAgICAnc3RhcnQnOiAwLFxuICAgICAgICAnbmFtZSc6ICd4JyxcbiAgICAgICAgJ3R5cGUnOiAndGVuc29yJ1xuICAgICAgfSxcbiAgICAgIHtcbiAgICAgICAgJ3N0YXJ0JzogMSxcbiAgICAgICAgJ25hbWUnOiAnZGltcycsXG4gICAgICAgICd0eXBlJzogJ2Jvb2xbXSdcbiAgICAgIH1cbiAgICBdXG4gIH0sXG4gIHtcbiAgICAndGZPcE5hbWUnOiAnUmV2ZXJzZVYyJyxcbiAgICAnY2F0ZWdvcnknOiAnc2xpY2Vfam9pbicsXG4gICAgJ2lucHV0cyc6IFtcbiAgICAgIHtcbiAgICAgICAgJ3N0YXJ0JzogMCxcbiAgICAgICAgJ25hbWUnOiAneCcsXG4gICAgICAgICd0eXBlJzogJ3RlbnNvcidcbiAgICAgIH0sXG4gICAgICB7XG4gICAgICAgICdzdGFydCc6IDEsXG4gICAgICAgICduYW1lJzogJ2F4aXMnLFxuICAgICAgICAndHlwZSc6ICdudW1iZXJbXSdcbiAgICAgIH1cbiAgICBdXG4gIH0sXG4gIHtcbiAgICAndGZPcE5hbWUnOiAnU2xpY2UnLFxuICAgICdjYXRlZ29yeSc6ICdzbGljZV9qb2luJyxcbiAgICAnaW5wdXRzJzogW1xuICAgICAge1xuICAgICAgICAnc3RhcnQnOiAwLFxuICAgICAgICAnbmFtZSc6ICd4JyxcbiAgICAgICAgJ3R5cGUnOiAndGVuc29yJ1xuICAgICAgfSxcbiAgICAgIHtcbiAgICAgICAgJ3N0YXJ0JzogMSxcbiAgICAgICAgJ25hbWUnOiAnYmVnaW4nLFxuICAgICAgICAndHlwZSc6ICdudW1iZXJbXSdcbiAgICAgIH0sXG4gICAgICB7XG4gICAgICAgICdzdGFydCc6IDIsXG4gICAgICAgICduYW1lJzogJ3NpemUnLFxuICAgICAgICAndHlwZSc6ICdudW1iZXJbXSdcbiAgICAgIH1cbiAgICBdXG4gIH0sXG4gIHtcbiAgICAndGZPcE5hbWUnOiAnU3RyaWRlZFNsaWNlJyxcbiAgICAnY2F0ZWdvcnknOiAnc2xpY2Vfam9pbicsXG4gICAgJ2lucHV0cyc6IFtcbiAgICAgIHtcbiAgICAgICAgJ3N0YXJ0JzogMCxcbiAgICAgICAgJ25hbWUnOiAneCcsXG4gICAgICAgICd0eXBlJzogJ3RlbnNvcidcbiAgICAgIH0sXG4gICAgICB7XG4gICAgICAgICdzdGFydCc6IDEsXG4gICAgICAgICduYW1lJzogJ2JlZ2luJyxcbiAgICAgICAgJ3R5cGUnOiAnbnVtYmVyW10nXG4gICAgICB9LFxuICAgICAge1xuICAgICAgICAnc3RhcnQnOiAyLFxuICAgICAgICAnbmFtZSc6ICdlbmQnLFxuICAgICAgICAndHlwZSc6ICdudW1iZXJbXSdcbiAgICAgIH0sXG4gICAgICB7XG4gICAgICAgICdzdGFydCc6IDMsXG4gICAgICAgICduYW1lJzogJ3N0cmlkZXMnLFxuICAgICAgICAndHlwZSc6ICdudW1iZXJbXSdcbiAgICAgIH1cbiAgICBdLFxuICAgICdhdHRycyc6IFtcbiAgICAgIHtcbiAgICAgICAgJ3RmTmFtZSc6ICdiZWdpbl9tYXNrJyxcbiAgICAgICAgJ25hbWUnOiAnYmVnaW5NYXNrJyxcbiAgICAgICAgJ3R5cGUnOiAnbnVtYmVyJyxcbiAgICAgICAgJ2RlZmF1bHRWYWx1ZSc6IDBcbiAgICAgIH0sXG4gICAgICB7XG4gICAgICAgICd0Zk5hbWUnOiAnZW5kX21hc2snLFxuICAgICAgICAnbmFtZSc6ICdlbmRNYXNrJyxcbiAgICAgICAgJ3R5cGUnOiAnbnVtYmVyJyxcbiAgICAgICAgJ2RlZmF1bHRWYWx1ZSc6IDBcbiAgICAgIH0sXG4gICAgICB7XG4gICAgICAgICd0Zk5hbWUnOiAnbmV3X2F4aXNfbWFzaycsXG4gICAgICAgICduYW1lJzogJ25ld0F4aXNNYXNrJyxcbiAgICAgICAgJ3R5cGUnOiAnbnVtYmVyJyxcbiAgICAgICAgJ2RlZmF1bHRWYWx1ZSc6IDBcbiAgICAgIH0sXG4gICAgICB7XG4gICAgICAgICd0Zk5hbWUnOiAnZWxsaXBzaXNfbWFzaycsXG4gICAgICAgICduYW1lJzogJ2VsbGlwc2lzTWFzaycsXG4gICAgICAgICd0eXBlJzogJ251bWJlcicsXG4gICAgICAgICdkZWZhdWx0VmFsdWUnOiAwXG4gICAgICB9LFxuICAgICAge1xuICAgICAgICAndGZOYW1lJzogJ3Nocmlua19heGlzX21hc2snLFxuICAgICAgICAnbmFtZSc6ICdzaHJpbmtBeGlzTWFzaycsXG4gICAgICAgICd0eXBlJzogJ251bWJlcicsXG4gICAgICAgICdkZWZhdWx0VmFsdWUnOiAwXG4gICAgICB9XG4gICAgXVxuICB9LFxuICB7XG4gICAgJ3RmT3BOYW1lJzogJ1BhY2snLFxuICAgICdjYXRlZ29yeSc6ICdzbGljZV9qb2luJyxcbiAgICAnaW5wdXRzJzogW1xuICAgICAge1xuICAgICAgICAnc3RhcnQnOiAwLFxuICAgICAgICAnZW5kJzogMCxcbiAgICAgICAgJ25hbWUnOiAndGVuc29ycycsXG4gICAgICAgICd0eXBlJzogJ3RlbnNvcnMnXG4gICAgICB9XG4gICAgXSxcbiAgICAnYXR0cnMnOiBbXG4gICAgICB7XG4gICAgICAgICd0Zk5hbWUnOiAnYXhpcycsXG4gICAgICAgICduYW1lJzogJ2F4aXMnLFxuICAgICAgICAndHlwZSc6ICdudW1iZXInLFxuICAgICAgICAnZGVmYXVsdFZhbHVlJzogMFxuICAgICAgfVxuICAgIF1cbiAgfSxcbiAge1xuICAgICd0Zk9wTmFtZSc6ICdVbnBhY2snLFxuICAgICdjYXRlZ29yeSc6ICdzbGljZV9qb2luJyxcbiAgICAnaW5wdXRzJzogW1xuICAgICAge1xuICAgICAgICAnc3RhcnQnOiAwLFxuICAgICAgICAnbmFtZSc6ICd0ZW5zb3InLFxuICAgICAgICAndHlwZSc6ICd0ZW5zb3InXG4gICAgICB9XG4gICAgXSxcbiAgICAnYXR0cnMnOiBbXG4gICAgICB7XG4gICAgICAgICd0Zk5hbWUnOiAnYXhpcycsXG4gICAgICAgICduYW1lJzogJ2F4aXMnLFxuICAgICAgICAndHlwZSc6ICdudW1iZXInLFxuICAgICAgICAnZGVmYXVsdFZhbHVlJzogMFxuICAgICAgfSxcbiAgICAgIHtcbiAgICAgICAgJ3RmTmFtZSc6ICdudW0nLFxuICAgICAgICAnbmFtZSc6ICdudW0nLFxuICAgICAgICAndHlwZSc6ICdudW1iZXInLFxuICAgICAgICAnZGVmYXVsdFZhbHVlJzogMCxcbiAgICAgICAgJ25vdFN1cHBvcnRlZCc6IHRydWVcbiAgICAgIH1cbiAgICBdXG4gIH0sXG4gIHtcbiAgICAndGZPcE5hbWUnOiAnVGlsZScsXG4gICAgJ2NhdGVnb3J5JzogJ3NsaWNlX2pvaW4nLFxuICAgICdpbnB1dHMnOiBbXG4gICAgICB7XG4gICAgICAgICdzdGFydCc6IDAsXG4gICAgICAgICduYW1lJzogJ3gnLFxuICAgICAgICAndHlwZSc6ICd0ZW5zb3InXG4gICAgICB9LFxuICAgICAge1xuICAgICAgICAnc3RhcnQnOiAxLFxuICAgICAgICAnbmFtZSc6ICdyZXBzJyxcbiAgICAgICAgJ3R5cGUnOiAnbnVtYmVyW10nXG4gICAgICB9XG4gICAgXVxuICB9LFxuICB7XG4gICAgJ3RmT3BOYW1lJzogJ1NwbGl0JyxcbiAgICAnY2F0ZWdvcnknOiAnc2xpY2Vfam9pbicsXG4gICAgJ2lucHV0cyc6IFtcbiAgICAgIHtcbiAgICAgICAgJ3N0YXJ0JzogMCxcbiAgICAgICAgJ25hbWUnOiAnYXhpcycsXG4gICAgICAgICd0eXBlJzogJ251bWJlcicsXG4gICAgICAgICdkZWZhdWx0VmFsdWUnOiAwXG4gICAgICB9LFxuICAgICAge1xuICAgICAgICAnc3RhcnQnOiAxLFxuICAgICAgICAnbmFtZSc6ICd4JyxcbiAgICAgICAgJ3R5cGUnOiAndGVuc29yJ1xuICAgICAgfVxuICAgIF0sXG4gICAgJ2F0dHJzJzogW1xuICAgICAge1xuICAgICAgICAndGZOYW1lJzogJ251bV9zcGxpdCcsXG4gICAgICAgICduYW1lJzogJ251bU9yU2l6ZVNwbGl0cycsXG4gICAgICAgICd0eXBlJzogJ251bWJlcicsXG4gICAgICAgICdkZWZhdWx0VmFsdWUnOiAxXG4gICAgICB9XG4gICAgXVxuICB9LFxuICB7XG4gICAgJ3RmT3BOYW1lJzogJ1NwbGl0VicsXG4gICAgJ2NhdGVnb3J5JzogJ3NsaWNlX2pvaW4nLFxuICAgICdpbnB1dHMnOiBbXG4gICAgICB7XG4gICAgICAgICdzdGFydCc6IDAsXG4gICAgICAgICduYW1lJzogJ3gnLFxuICAgICAgICAndHlwZSc6ICd0ZW5zb3InXG4gICAgICB9LFxuICAgICAge1xuICAgICAgICAnc3RhcnQnOiAxLFxuICAgICAgICAnbmFtZSc6ICdudW1PclNpemVTcGxpdHMnLFxuICAgICAgICAndHlwZSc6ICdudW1iZXJbXSdcbiAgICAgIH0sXG4gICAgICB7XG4gICAgICAgICdzdGFydCc6IDIsXG4gICAgICAgICduYW1lJzogJ2F4aXMnLFxuICAgICAgICAndHlwZSc6ICdudW1iZXInLFxuICAgICAgICAnZGVmYXVsdFZhbHVlJzogMFxuICAgICAgfVxuICAgIF1cbiAgfSxcbiAge1xuICAgICd0Zk9wTmFtZSc6ICdTY2F0dGVyTmQnLFxuICAgICdjYXRlZ29yeSc6ICdzbGljZV9qb2luJyxcbiAgICAnaW5wdXRzJzogW1xuICAgICAge1xuICAgICAgICAnc3RhcnQnOiAwLFxuICAgICAgICAnbmFtZSc6ICdpbmRpY2VzJyxcbiAgICAgICAgJ3R5cGUnOiAndGVuc29yJ1xuICAgICAgfSxcbiAgICAgIHtcbiAgICAgICAgJ3N0YXJ0JzogMSxcbiAgICAgICAgJ25hbWUnOiAndmFsdWVzJyxcbiAgICAgICAgJ3R5cGUnOiAndGVuc29yJ1xuICAgICAgfSxcbiAgICAgIHtcbiAgICAgICAgJ3N0YXJ0JzogMixcbiAgICAgICAgJ25hbWUnOiAnc2hhcGUnLFxuICAgICAgICAndHlwZSc6ICdudW1iZXJbXSdcbiAgICAgIH1cbiAgICBdXG4gIH0sXG4gIHtcbiAgICAndGZPcE5hbWUnOiAnR2F0aGVyTmQnLFxuICAgICdjYXRlZ29yeSc6ICdzbGljZV9qb2luJyxcbiAgICAnaW5wdXRzJzogW1xuICAgICAge1xuICAgICAgICAnc3RhcnQnOiAwLFxuICAgICAgICAnbmFtZSc6ICd4JyxcbiAgICAgICAgJ3R5cGUnOiAndGVuc29yJ1xuICAgICAgfSxcbiAgICAgIHtcbiAgICAgICAgJ3N0YXJ0JzogMSxcbiAgICAgICAgJ25hbWUnOiAnaW5kaWNlcycsXG4gICAgICAgICd0eXBlJzogJ3RlbnNvcidcbiAgICAgIH1cbiAgICBdXG4gIH0sXG4gIHtcbiAgICAndGZPcE5hbWUnOiAnU3BhcnNlVG9EZW5zZScsXG4gICAgJ2NhdGVnb3J5JzogJ3NsaWNlX2pvaW4nLFxuICAgICdpbnB1dHMnOiBbXG4gICAgICB7XG4gICAgICAgICdzdGFydCc6IDAsXG4gICAgICAgICduYW1lJzogJ3NwYXJzZUluZGljZXMnLFxuICAgICAgICAndHlwZSc6ICd0ZW5zb3InXG4gICAgICB9LFxuICAgICAge1xuICAgICAgICAnc3RhcnQnOiAxLFxuICAgICAgICAnbmFtZSc6ICdvdXRwdXRTaGFwZScsXG4gICAgICAgICd0eXBlJzogJ251bWJlcltdJ1xuICAgICAgfSxcbiAgICAgIHtcbiAgICAgICAgJ3N0YXJ0JzogMixcbiAgICAgICAgJ25hbWUnOiAnc3BhcnNlVmFsdWVzJyxcbiAgICAgICAgJ3R5cGUnOiAndGVuc29yJ1xuICAgICAgfSxcbiAgICAgIHtcbiAgICAgICAgJ3N0YXJ0JzogMyxcbiAgICAgICAgJ25hbWUnOiAnZGVmYXVsdFZhbHVlJyxcbiAgICAgICAgJ3R5cGUnOiAndGVuc29yJ1xuICAgICAgfVxuICAgIF0sXG4gICAgJ2F0dHJzJzogW1xuICAgICAge1xuICAgICAgICAndGZOYW1lJzogJ3ZhbGlkYXRlX2luZGljZXMnLFxuICAgICAgICAnbmFtZSc6ICd2YWxpZGF0ZUluZGljZXMnLFxuICAgICAgICAndHlwZSc6ICdib29sJyxcbiAgICAgICAgJ2RlZmF1bHRWYWx1ZSc6IGZhbHNlLFxuICAgICAgICAnbm90U3VwcG9ydGVkJzogdHJ1ZVxuICAgICAgfVxuICAgIF1cbiAgfVxuXTtcbiJdfQ==","/**\n * @license\n * Copyright 2022 Google LLC. All Rights Reserved.\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n * =============================================================================\n */\nexport const json = [\n {\n 'tfOpName': 'SparseFillEmptyRows',\n 'category': 'sparse',\n 'inputs': [\n {\n 'start': 0,\n 'name': 'indices',\n 'type': 'tensor'\n },\n {\n 'start': 1,\n 'name': 'values',\n 'type': 'tensor'\n },\n {\n 'start': 2,\n 'name': 'denseShape',\n 'type': 'tensor'\n },\n {\n 'start': 3,\n 'name': 'defaultValue',\n 'type': 'tensor'\n }\n ]\n },\n {\n 'tfOpName': 'SparseReshape',\n 'category': 'sparse',\n 'inputs': [\n {\n 'start': 0,\n 'name': 'inputIndices',\n 'type': 'tensor'\n },\n {\n 'start': 1,\n 'name': 'inputShape',\n 'type': 'tensor'\n },\n {\n 'start': 2,\n 'name': 'newShape',\n 'type': 'tensor'\n }\n ],\n 'attrs': [\n {\n 'tfName': 'T',\n 'name': 'dtype',\n 'type': 'dtype',\n 'notSupported': true\n }\n ]\n },\n {\n 'tfOpName': 'SparseSegmentMean',\n 'category': 'sparse',\n 'inputs': [\n {\n 'start': 0,\n 'name': 'data',\n 'type': 'tensor'\n },\n {\n 'start': 1,\n 'name': 'indices',\n 'type': 'tensor'\n },\n {\n 'start': 2,\n 'name': 'segmentIds',\n 'type': 'tensor'\n }\n ]\n },\n {\n 'tfOpName': 'SparseSegmentSum',\n 'category': 'sparse',\n 'inputs': [\n {\n 'start': 0,\n 'name': 'data',\n 'type': 'tensor'\n },\n {\n 'start': 1,\n 'name': 'indices',\n 'type': 'tensor'\n },\n {\n 'start': 2,\n 'name': 'segmentIds',\n 'type': 'tensor'\n }\n ]\n }\n];\n//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic3BhcnNlLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vLi4vLi4vdGZqcy1jb252ZXJ0ZXIvc3JjL29wZXJhdGlvbnMvb3BfbGlzdC9zcGFyc2UudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQ0E7Ozs7Ozs7Ozs7Ozs7OztHQWVHO0FBSUgsTUFBTSxDQUFDLE1BQU0sSUFBSSxHQUFlO0lBQzlCO1FBQ0UsVUFBVSxFQUFFLHFCQUFxQjtRQUNqQyxVQUFVLEVBQUUsUUFBUTtRQUNwQixRQUFRLEVBQUU7WUFDUjtnQkFDRSxPQUFPLEVBQUUsQ0FBQztnQkFDVixNQUFNLEVBQUUsU0FBUztnQkFDakIsTUFBTSxFQUFFLFFBQVE7YUFDakI7WUFDRDtnQkFDRSxPQUFPLEVBQUUsQ0FBQztnQkFDVixNQUFNLEVBQUUsUUFBUTtnQkFDaEIsTUFBTSxFQUFFLFFBQVE7YUFDakI7WUFDRDtnQkFDRSxPQUFPLEVBQUUsQ0FBQztnQkFDVixNQUFNLEVBQUUsWUFBWTtnQkFDcEIsTUFBTSxFQUFFLFFBQVE7YUFDakI7WUFDRDtnQkFDRSxPQUFPLEVBQUUsQ0FBQztnQkFDVixNQUFNLEVBQUUsY0FBYztnQkFDdEIsTUFBTSxFQUFFLFFBQVE7YUFDakI7U0FDRjtLQUNGO0lBQ0Q7UUFDRSxVQUFVLEVBQUUsZUFBZTtRQUMzQixVQUFVLEVBQUUsUUFBUTtRQUNwQixRQUFRLEVBQUU7WUFDUjtnQkFDRSxPQUFPLEVBQUUsQ0FBQztnQkFDVixNQUFNLEVBQUUsY0FBYztnQkFDdEIsTUFBTSxFQUFFLFFBQVE7YUFDakI7WUFDRDtnQkFDRSxPQUFPLEVBQUUsQ0FBQztnQkFDVixNQUFNLEVBQUUsWUFBWTtnQkFDcEIsTUFBTSxFQUFFLFFBQVE7YUFDakI7WUFDRDtnQkFDRSxPQUFPLEVBQUUsQ0FBQztnQkFDVixNQUFNLEVBQUUsVUFBVTtnQkFDbEIsTUFBTSxFQUFFLFFBQVE7YUFDakI7U0FDRjtRQUNELE9BQU8sRUFBRTtZQUNQO2dCQUNFLFFBQVEsRUFBRSxHQUFHO2dCQUNiLE1BQU0sRUFBRSxPQUFPO2dCQUNmLE1BQU0sRUFBRSxPQUFPO2dCQUNmLGNBQWMsRUFBRSxJQUFJO2FBQ3JCO1NBQ0Y7S0FDRjtJQUNEO1FBQ0UsVUFBVSxFQUFFLG1CQUFtQjtRQUMvQixVQUFVLEVBQUUsUUFBUTtRQUNwQixRQUFRLEVBQUU7WUFDUjtnQkFDRSxPQUFPLEVBQUUsQ0FBQztnQkFDVixNQUFNLEVBQUUsTUFBTTtnQkFDZCxNQUFNLEVBQUUsUUFBUTthQUNqQjtZQUNEO2dCQUNFLE9BQU8sRUFBRSxDQUFDO2dCQUNWLE1BQU0sRUFBRSxTQUFTO2dCQUNqQixNQUFNLEVBQUUsUUFBUTthQUNqQjtZQUNEO2dCQUNFLE9BQU8sRUFBRSxDQUFDO2dCQUNWLE1BQU0sRUFBRSxZQUFZO2dCQUNwQixNQUFNLEVBQUUsUUFBUTthQUNqQjtTQUNGO0tBQ0Y7SUFDRDtRQUNFLFVBQVUsRUFBRSxrQkFBa0I7UUFDOUIsVUFBVSxFQUFFLFFBQVE7UUFDcEIsUUFBUSxFQUFFO1lBQ1I7Z0JBQ0UsT0FBTyxFQUFFLENBQUM7Z0JBQ1YsTUFBTSxFQUFFLE1BQU07Z0JBQ2QsTUFBTSxFQUFFLFFBQVE7YUFDakI7WUFDRDtnQkFDRSxPQUFPLEVBQUUsQ0FBQztnQkFDVixNQUFNLEVBQUUsU0FBUztnQkFDakIsTUFBTSxFQUFFLFFBQVE7YUFDakI7WUFDRDtnQkFDRSxPQUFPLEVBQUUsQ0FBQztnQkFDVixNQUFNLEVBQUUsWUFBWTtnQkFDcEIsTUFBTSxFQUFFLFFBQVE7YUFDakI7U0FDRjtLQUNGO0NBQ0YsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbIlxuLyoqXG4gKiBAbGljZW5zZVxuICogQ29weXJpZ2h0IDIwMjIgR29vZ2xlIExMQy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC5cbiAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSBcIkxpY2Vuc2VcIik7XG4gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuXG4gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXRcbiAqXG4gKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjBcbiAqXG4gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlXG4gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiBcIkFTIElTXCIgQkFTSVMsXG4gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC5cbiAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmRcbiAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLlxuICogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbiAqL1xuXG5pbXBvcnQge09wTWFwcGVyfSBmcm9tICcuLi90eXBlcyc7XG5cbmV4cG9ydCBjb25zdCBqc29uOiBPcE1hcHBlcltdID0gW1xuICB7XG4gICAgJ3RmT3BOYW1lJzogJ1NwYXJzZUZpbGxFbXB0eVJvd3MnLFxuICAgICdjYXRlZ29yeSc6ICdzcGFyc2UnLFxuICAgICdpbnB1dHMnOiBbXG4gICAgICB7XG4gICAgICAgICdzdGFydCc6IDAsXG4gICAgICAgICduYW1lJzogJ2luZGljZXMnLFxuICAgICAgICAndHlwZSc6ICd0ZW5zb3InXG4gICAgICB9LFxuICAgICAge1xuICAgICAgICAnc3RhcnQnOiAxLFxuICAgICAgICAnbmFtZSc6ICd2YWx1ZXMnLFxuICAgICAgICAndHlwZSc6ICd0ZW5zb3InXG4gICAgICB9LFxuICAgICAge1xuICAgICAgICAnc3RhcnQnOiAyLFxuICAgICAgICAnbmFtZSc6ICdkZW5zZVNoYXBlJyxcbiAgICAgICAgJ3R5cGUnOiAndGVuc29yJ1xuICAgICAgfSxcbiAgICAgIHtcbiAgICAgICAgJ3N0YXJ0JzogMyxcbiAgICAgICAgJ25hbWUnOiAnZGVmYXVsdFZhbHVlJyxcbiAgICAgICAgJ3R5cGUnOiAndGVuc29yJ1xuICAgICAgfVxuICAgIF1cbiAgfSxcbiAge1xuICAgICd0Zk9wTmFtZSc6ICdTcGFyc2VSZXNoYXBlJyxcbiAgICAnY2F0ZWdvcnknOiAnc3BhcnNlJyxcbiAgICAnaW5wdXRzJzogW1xuICAgICAge1xuICAgICAgICAnc3RhcnQnOiAwLFxuICAgICAgICAnbmFtZSc6ICdpbnB1dEluZGljZXMnLFxuICAgICAgICAndHlwZSc6ICd0ZW5zb3InXG4gICAgICB9LFxuICAgICAge1xuICAgICAgICAnc3RhcnQnOiAxLFxuICAgICAgICAnbmFtZSc6ICdpbnB1dFNoYXBlJyxcbiAgICAgICAgJ3R5cGUnOiAndGVuc29yJ1xuICAgICAgfSxcbiAgICAgIHtcbiAgICAgICAgJ3N0YXJ0JzogMixcbiAgICAgICAgJ25hbWUnOiAnbmV3U2hhcGUnLFxuICAgICAgICAndHlwZSc6ICd0ZW5zb3InXG4gICAgICB9XG4gICAgXSxcbiAgICAnYXR0cnMnOiBbXG4gICAgICB7XG4gICAgICAgICd0Zk5hbWUnOiAnVCcsXG4gICAgICAgICduYW1lJzogJ2R0eXBlJyxcbiAgICAgICAgJ3R5cGUnOiAnZHR5cGUnLFxuICAgICAgICAnbm90U3VwcG9ydGVkJzogdHJ1ZVxuICAgICAgfVxuICAgIF1cbiAgfSxcbiAge1xuICAgICd0Zk9wTmFtZSc6ICdTcGFyc2VTZWdtZW50TWVhbicsXG4gICAgJ2NhdGVnb3J5JzogJ3NwYXJzZScsXG4gICAgJ2lucHV0cyc6IFtcbiAgICAgIHtcbiAgICAgICAgJ3N0YXJ0JzogMCxcbiAgICAgICAgJ25hbWUnOiAnZGF0YScsXG4gICAgICAgICd0eXBlJzogJ3RlbnNvcidcbiAgICAgIH0sXG4gICAgICB7XG4gICAgICAgICdzdGFydCc6IDEsXG4gICAgICAgICduYW1lJzogJ2luZGljZXMnLFxuICAgICAgICAndHlwZSc6ICd0ZW5zb3InXG4gICAgICB9LFxuICAgICAge1xuICAgICAgICAnc3RhcnQnOiAyLFxuICAgICAgICAnbmFtZSc6ICdzZWdtZW50SWRzJyxcbiAgICAgICAgJ3R5cGUnOiAndGVuc29yJ1xuICAgICAgfVxuICAgIF1cbiAgfSxcbiAge1xuICAgICd0Zk9wTmFtZSc6ICdTcGFyc2VTZWdtZW50U3VtJyxcbiAgICAnY2F0ZWdvcnknOiAnc3BhcnNlJyxcbiAgICAnaW5wdXRzJzogW1xuICAgICAge1xuICAgICAgICAnc3RhcnQnOiAwLFxuICAgICAgICAnbmFtZSc6ICdkYXRhJyxcbiAgICAgICAgJ3R5cGUnOiAndGVuc29yJ1xuICAgICAgfSxcbiAgICAgIHtcbiAgICAgICAgJ3N0YXJ0JzogMSxcbiAgICAgICAgJ25hbWUnOiAnaW5kaWNlcycsXG4gICAgICAgICd0eXBlJzogJ3RlbnNvcidcbiAgICAgIH0sXG4gICAgICB7XG4gICAgICAgICdzdGFydCc6IDIsXG4gICAgICAgICduYW1lJzogJ3NlZ21lbnRJZHMnLFxuICAgICAgICAndHlwZSc6ICd0ZW5zb3InXG4gICAgICB9XG4gICAgXVxuICB9XG5dO1xuIl19","/**\n * @license\n * Copyright 2022 Google LLC. All Rights Reserved.\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n * =============================================================================\n */\nexport const json = [\n {\n 'tfOpName': 'FFT',\n 'category': 'spectral',\n 'inputs': [\n {\n 'start': 0,\n 'name': 'x',\n 'type': 'tensor'\n }\n ]\n },\n {\n 'tfOpName': 'IFFT',\n 'category': 'spectral',\n 'inputs': [\n {\n 'start': 0,\n 'name': 'x',\n 'type': 'tensor'\n }\n ]\n },\n {\n 'tfOpName': 'RFFT',\n 'category': 'spectral',\n 'inputs': [\n {\n 'start': 0,\n 'name': 'x',\n 'type': 'tensor'\n },\n {\n 'start': 1,\n 'name': 'fft_length',\n 'type': 'number',\n 'notSupported': true\n }\n ]\n },\n {\n 'tfOpName': 'IRFFT',\n 'category': 'spectral',\n 'inputs': [\n {\n 'start': 0,\n 'name': 'x',\n 'type': 'tensor'\n },\n {\n 'start': 1,\n 'name': 'fft_length',\n 'type': 'number',\n 'notSupported': true\n }\n ]\n }\n];\n//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic3BlY3RyYWwuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi8uLi8uLi90ZmpzLWNvbnZlcnRlci9zcmMvb3BlcmF0aW9ucy9vcF9saXN0L3NwZWN0cmFsLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUNBOzs7Ozs7Ozs7Ozs7Ozs7R0FlRztBQUlILE1BQU0sQ0FBQyxNQUFNLElBQUksR0FBZTtJQUM5QjtRQUNFLFVBQVUsRUFBRSxLQUFLO1FBQ2pCLFVBQVUsRUFBRSxVQUFVO1FBQ3RCLFFBQVEsRUFBRTtZQUNSO2dCQUNFLE9BQU8sRUFBRSxDQUFDO2dCQUNWLE1BQU0sRUFBRSxHQUFHO2dCQUNYLE1BQU0sRUFBRSxRQUFRO2FBQ2pCO1NBQ0Y7S0FDRjtJQUNEO1FBQ0UsVUFBVSxFQUFFLE1BQU07UUFDbEIsVUFBVSxFQUFFLFVBQVU7UUFDdEIsUUFBUSxFQUFFO1lBQ1I7Z0JBQ0UsT0FBTyxFQUFFLENBQUM7Z0JBQ1YsTUFBTSxFQUFFLEdBQUc7Z0JBQ1gsTUFBTSxFQUFFLFFBQVE7YUFDakI7U0FDRjtLQUNGO0lBQ0Q7UUFDRSxVQUFVLEVBQUUsTUFBTTtRQUNsQixVQUFVLEVBQUUsVUFBVTtRQUN0QixRQUFRLEVBQUU7WUFDUjtnQkFDRSxPQUFPLEVBQUUsQ0FBQztnQkFDVixNQUFNLEVBQUUsR0FBRztnQkFDWCxNQUFNLEVBQUUsUUFBUTthQUNqQjtZQUNEO2dCQUNFLE9BQU8sRUFBRSxDQUFDO2dCQUNWLE1BQU0sRUFBRSxZQUFZO2dCQUNwQixNQUFNLEVBQUUsUUFBUTtnQkFDaEIsY0FBYyxFQUFFLElBQUk7YUFDckI7U0FDRjtLQUNGO0lBQ0Q7UUFDRSxVQUFVLEVBQUUsT0FBTztRQUNuQixVQUFVLEVBQUUsVUFBVTtRQUN0QixRQUFRLEVBQUU7WUFDUjtnQkFDRSxPQUFPLEVBQUUsQ0FBQztnQkFDVixNQUFNLEVBQUUsR0FBRztnQkFDWCxNQUFNLEVBQUUsUUFBUTthQUNqQjtZQUNEO2dCQUNFLE9BQU8sRUFBRSxDQUFDO2dCQUNWLE1BQU0sRUFBRSxZQUFZO2dCQUNwQixNQUFNLEVBQUUsUUFBUTtnQkFDaEIsY0FBYyxFQUFFLElBQUk7YUFDckI7U0FDRjtLQUNGO0NBQ0YsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbIlxuLyoqXG4gKiBAbGljZW5zZVxuICogQ29weXJpZ2h0IDIwMjIgR29vZ2xlIExMQy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC5cbiAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSBcIkxpY2Vuc2VcIik7XG4gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuXG4gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXRcbiAqXG4gKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjBcbiAqXG4gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlXG4gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiBcIkFTIElTXCIgQkFTSVMsXG4gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC5cbiAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmRcbiAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLlxuICogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbiAqL1xuXG5pbXBvcnQge09wTWFwcGVyfSBmcm9tICcuLi90eXBlcyc7XG5cbmV4cG9ydCBjb25zdCBqc29uOiBPcE1hcHBlcltdID0gW1xuICB7XG4gICAgJ3RmT3BOYW1lJzogJ0ZGVCcsXG4gICAgJ2NhdGVnb3J5JzogJ3NwZWN0cmFsJyxcbiAgICAnaW5wdXRzJzogW1xuICAgICAge1xuICAgICAgICAnc3RhcnQnOiAwLFxuICAgICAgICAnbmFtZSc6ICd4JyxcbiAgICAgICAgJ3R5cGUnOiAndGVuc29yJ1xuICAgICAgfVxuICAgIF1cbiAgfSxcbiAge1xuICAgICd0Zk9wTmFtZSc6ICdJRkZUJyxcbiAgICAnY2F0ZWdvcnknOiAnc3BlY3RyYWwnLFxuICAgICdpbnB1dHMnOiBbXG4gICAgICB7XG4gICAgICAgICdzdGFydCc6IDAsXG4gICAgICAgICduYW1lJzogJ3gnLFxuICAgICAgICAndHlwZSc6ICd0ZW5zb3InXG4gICAgICB9XG4gICAgXVxuICB9LFxuICB7XG4gICAgJ3RmT3BOYW1lJzogJ1JGRlQnLFxuICAgICdjYXRlZ29yeSc6ICdzcGVjdHJhbCcsXG4gICAgJ2lucHV0cyc6IFtcbiAgICAgIHtcbiAgICAgICAgJ3N0YXJ0JzogMCxcbiAgICAgICAgJ25hbWUnOiAneCcsXG4gICAgICAgICd0eXBlJzogJ3RlbnNvcidcbiAgICAgIH0sXG4gICAgICB7XG4gICAgICAgICdzdGFydCc6IDEsXG4gICAgICAgICduYW1lJzogJ2ZmdF9sZW5ndGgnLFxuICAgICAgICAndHlwZSc6ICdudW1iZXInLFxuICAgICAgICAnbm90U3VwcG9ydGVkJzogdHJ1ZVxuICAgICAgfVxuICAgIF1cbiAgfSxcbiAge1xuICAgICd0Zk9wTmFtZSc6ICdJUkZGVCcsXG4gICAgJ2NhdGVnb3J5JzogJ3NwZWN0cmFsJyxcbiAgICAnaW5wdXRzJzogW1xuICAgICAge1xuICAgICAgICAnc3RhcnQnOiAwLFxuICAgICAgICAnbmFtZSc6ICd4JyxcbiAgICAgICAgJ3R5cGUnOiAndGVuc29yJ1xuICAgICAgfSxcbiAgICAgIHtcbiAgICAgICAgJ3N0YXJ0JzogMSxcbiAgICAgICAgJ25hbWUnOiAnZmZ0X2xlbmd0aCcsXG4gICAgICAgICd0eXBlJzogJ251bWJlcicsXG4gICAgICAgICdub3RTdXBwb3J0ZWQnOiB0cnVlXG4gICAgICB9XG4gICAgXVxuICB9XG5dO1xuIl19","/**\n * @license\n * Copyright 2022 Google LLC. All Rights Reserved.\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n * =============================================================================\n */\nexport const json = [\n {\n 'tfOpName': 'StringNGrams',\n 'category': 'string',\n 'inputs': [\n {\n 'start': 0,\n 'name': 'data',\n 'type': 'tensor'\n },\n {\n 'start': 1,\n 'name': 'dataSplits',\n 'type': 'tensor'\n }\n ],\n 'attrs': [\n {\n 'tfName': 'separator',\n 'name': 'separator',\n 'type': 'string'\n },\n {\n 'tfName': 'ngram_widths',\n 'name': 'nGramWidths',\n 'type': 'number[]'\n },\n {\n 'tfName': 'left_pad',\n 'name': 'leftPad',\n 'type': 'string'\n },\n {\n 'tfName': 'right_pad',\n 'name': 'rightPad',\n 'type': 'string'\n },\n {\n 'tfName': 'pad_width',\n 'name': 'padWidth',\n 'type': 'number'\n },\n {\n 'tfName': 'preserve_short_sequences',\n 'name': 'preserveShortSequences',\n 'type': 'bool'\n }\n ],\n 'outputs': [\n 'ngrams',\n 'ngrams_splits'\n ]\n },\n {\n 'tfOpName': 'StringSplit',\n 'category': 'string',\n 'inputs': [\n {\n 'start': 0,\n 'name': 'input',\n 'type': 'tensor'\n },\n {\n 'start': 1,\n 'name': 'delimiter',\n 'type': 'tensor'\n }\n ],\n 'attrs': [\n {\n 'tfName': 'skip_empty',\n 'name': 'skipEmpty',\n 'type': 'bool'\n }\n ],\n 'outputs': [\n 'indices',\n 'values',\n 'shape'\n ]\n },\n {\n 'tfOpName': 'StringToHashBucketFast',\n 'category': 'string',\n 'inputs': [\n {\n 'start': 0,\n 'name': 'input',\n 'type': 'tensor'\n }\n ],\n 'attrs': [\n {\n 'tfName': 'num_buckets',\n 'name': 'numBuckets',\n 'type': 'number'\n }\n ]\n }\n];\n//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic3RyaW5nLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vLi4vLi4vdGZqcy1jb252ZXJ0ZXIvc3JjL29wZXJhdGlvbnMvb3BfbGlzdC9zdHJpbmcudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQ0E7Ozs7Ozs7Ozs7Ozs7OztHQWVHO0FBSUgsTUFBTSxDQUFDLE1BQU0sSUFBSSxHQUFlO0lBQzlCO1FBQ0UsVUFBVSxFQUFFLGNBQWM7UUFDMUIsVUFBVSxFQUFFLFFBQVE7UUFDcEIsUUFBUSxFQUFFO1lBQ1I7Z0JBQ0UsT0FBTyxFQUFFLENBQUM7Z0JBQ1YsTUFBTSxFQUFFLE1BQU07Z0JBQ2QsTUFBTSxFQUFFLFFBQVE7YUFDakI7WUFDRDtnQkFDRSxPQUFPLEVBQUUsQ0FBQztnQkFDVixNQUFNLEVBQUUsWUFBWTtnQkFDcEIsTUFBTSxFQUFFLFFBQVE7YUFDakI7U0FDRjtRQUNELE9BQU8sRUFBRTtZQUNQO2dCQUNFLFFBQVEsRUFBRSxXQUFXO2dCQUNyQixNQUFNLEVBQUUsV0FBVztnQkFDbkIsTUFBTSxFQUFFLFFBQVE7YUFDakI7WUFDRDtnQkFDRSxRQUFRLEVBQUUsY0FBYztnQkFDeEIsTUFBTSxFQUFFLGFBQWE7Z0JBQ3JCLE1BQU0sRUFBRSxVQUFVO2FBQ25CO1lBQ0Q7Z0JBQ0UsUUFBUSxFQUFFLFVBQVU7Z0JBQ3BCLE1BQU0sRUFBRSxTQUFTO2dCQUNqQixNQUFNLEVBQUUsUUFBUTthQUNqQjtZQUNEO2dCQUNFLFFBQVEsRUFBRSxXQUFXO2dCQUNyQixNQUFNLEVBQUUsVUFBVTtnQkFDbEIsTUFBTSxFQUFFLFFBQVE7YUFDakI7WUFDRDtnQkFDRSxRQUFRLEVBQUUsV0FBVztnQkFDckIsTUFBTSxFQUFFLFVBQVU7Z0JBQ2xCLE1BQU0sRUFBRSxRQUFRO2FBQ2pCO1lBQ0Q7Z0JBQ0UsUUFBUSxFQUFFLDBCQUEwQjtnQkFDcEMsTUFBTSxFQUFFLHdCQUF3QjtnQkFDaEMsTUFBTSxFQUFFLE1BQU07YUFDZjtTQUNGO1FBQ0QsU0FBUyxFQUFFO1lBQ1QsUUFBUTtZQUNSLGVBQWU7U0FDaEI7S0FDRjtJQUNEO1FBQ0UsVUFBVSxFQUFFLGFBQWE7UUFDekIsVUFBVSxFQUFFLFFBQVE7UUFDcEIsUUFBUSxFQUFFO1lBQ1I7Z0JBQ0UsT0FBTyxFQUFFLENBQUM7Z0JBQ1YsTUFBTSxFQUFFLE9BQU87Z0JBQ2YsTUFBTSxFQUFFLFFBQVE7YUFDakI7WUFDRDtnQkFDRSxPQUFPLEVBQUUsQ0FBQztnQkFDVixNQUFNLEVBQUUsV0FBVztnQkFDbkIsTUFBTSxFQUFFLFFBQVE7YUFDakI7U0FDRjtRQUNELE9BQU8sRUFBRTtZQUNQO2dCQUNFLFFBQVEsRUFBRSxZQUFZO2dCQUN0QixNQUFNLEVBQUUsV0FBVztnQkFDbkIsTUFBTSxFQUFFLE1BQU07YUFDZjtTQUNGO1FBQ0QsU0FBUyxFQUFFO1lBQ1QsU0FBUztZQUNULFFBQVE7WUFDUixPQUFPO1NBQ1I7S0FDRjtJQUNEO1FBQ0UsVUFBVSxFQUFFLHdCQUF3QjtRQUNwQyxVQUFVLEVBQUUsUUFBUTtRQUNwQixRQUFRLEVBQUU7WUFDUjtnQkFDRSxPQUFPLEVBQUUsQ0FBQztnQkFDVixNQUFNLEVBQUUsT0FBTztnQkFDZixNQUFNLEVBQUUsUUFBUTthQUNqQjtTQUNGO1FBQ0QsT0FBTyxFQUFFO1lBQ1A7Z0JBQ0UsUUFBUSxFQUFFLGFBQWE7Z0JBQ3ZCLE1BQU0sRUFBRSxZQUFZO2dCQUNwQixNQUFNLEVBQUUsUUFBUTthQUNqQjtTQUNGO0tBQ0Y7Q0FDRixDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiXG4vKipcbiAqIEBsaWNlbnNlXG4gKiBDb3B5cmlnaHQgMjAyMiBHb29nbGUgTExDLiBBbGwgUmlnaHRzIFJlc2VydmVkLlxuICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlIFwiTGljZW5zZVwiKTtcbiAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS5cbiAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdFxuICpcbiAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMFxuICpcbiAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmVcbiAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuIFwiQVMgSVNcIiBCQVNJUyxcbiAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLlxuICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZFxuICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuXG4gKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuICovXG5cbmltcG9ydCB7T3BNYXBwZXJ9IGZyb20gJy4uL3R5cGVzJztcblxuZXhwb3J0IGNvbnN0IGpzb246IE9wTWFwcGVyW10gPSBbXG4gIHtcbiAgICAndGZPcE5hbWUnOiAnU3RyaW5nTkdyYW1zJyxcbiAgICAnY2F0ZWdvcnknOiAnc3RyaW5nJyxcbiAgICAnaW5wdXRzJzogW1xuICAgICAge1xuICAgICAgICAnc3RhcnQnOiAwLFxuICAgICAgICAnbmFtZSc6ICdkYXRhJyxcbiAgICAgICAgJ3R5cGUnOiAndGVuc29yJ1xuICAgICAgfSxcbiAgICAgIHtcbiAgICAgICAgJ3N0YXJ0JzogMSxcbiAgICAgICAgJ25hbWUnOiAnZGF0YVNwbGl0cycsXG4gICAgICAgICd0eXBlJzogJ3RlbnNvcidcbiAgICAgIH1cbiAgICBdLFxuICAgICdhdHRycyc6IFtcbiAgICAgIHtcbiAgICAgICAgJ3RmTmFtZSc6ICdzZXBhcmF0b3InLFxuICAgICAgICAnbmFtZSc6ICdzZXBhcmF0b3InLFxuICAgICAgICAndHlwZSc6ICdzdHJpbmcnXG4gICAgICB9LFxuICAgICAge1xuICAgICAgICAndGZOYW1lJzogJ25ncmFtX3dpZHRocycsXG4gICAgICAgICduYW1lJzogJ25HcmFtV2lkdGhzJyxcbiAgICAgICAgJ3R5cGUnOiAnbnVtYmVyW10nXG4gICAgICB9LFxuICAgICAge1xuICAgICAgICAndGZOYW1lJzogJ2xlZnRfcGFkJyxcbiAgICAgICAgJ25hbWUnOiAnbGVmdFBhZCcsXG4gICAgICAgICd0eXBlJzogJ3N0cmluZydcbiAgICAgIH0sXG4gICAgICB7XG4gICAgICAgICd0Zk5hbWUnOiAncmlnaHRfcGFkJyxcbiAgICAgICAgJ25hbWUnOiAncmlnaHRQYWQnLFxuICAgICAgICAndHlwZSc6ICdzdHJpbmcnXG4gICAgICB9LFxuICAgICAge1xuICAgICAgICAndGZOYW1lJzogJ3BhZF93aWR0aCcsXG4gICAgICAgICduYW1lJzogJ3BhZFdpZHRoJyxcbiAgICAgICAgJ3R5cGUnOiAnbnVtYmVyJ1xuICAgICAgfSxcbiAgICAgIHtcbiAgICAgICAgJ3RmTmFtZSc6ICdwcmVzZXJ2ZV9zaG9ydF9zZXF1ZW5jZXMnLFxuICAgICAgICAnbmFtZSc6ICdwcmVzZXJ2ZVNob3J0U2VxdWVuY2VzJyxcbiAgICAgICAgJ3R5cGUnOiAnYm9vbCdcbiAgICAgIH1cbiAgICBdLFxuICAgICdvdXRwdXRzJzogW1xuICAgICAgJ25ncmFtcycsXG4gICAgICAnbmdyYW1zX3NwbGl0cydcbiAgICBdXG4gIH0sXG4gIHtcbiAgICAndGZPcE5hbWUnOiAnU3RyaW5nU3BsaXQnLFxuICAgICdjYXRlZ29yeSc6ICdzdHJpbmcnLFxuICAgICdpbnB1dHMnOiBbXG4gICAgICB7XG4gICAgICAgICdzdGFydCc6IDAsXG4gICAgICAgICduYW1lJzogJ2lucHV0JyxcbiAgICAgICAgJ3R5cGUnOiAndGVuc29yJ1xuICAgICAgfSxcbiAgICAgIHtcbiAgICAgICAgJ3N0YXJ0JzogMSxcbiAgICAgICAgJ25hbWUnOiAnZGVsaW1pdGVyJyxcbiAgICAgICAgJ3R5cGUnOiAndGVuc29yJ1xuICAgICAgfVxuICAgIF0sXG4gICAgJ2F0dHJzJzogW1xuICAgICAge1xuICAgICAgICAndGZOYW1lJzogJ3NraXBfZW1wdHknLFxuICAgICAgICAnbmFtZSc6ICdza2lwRW1wdHknLFxuICAgICAgICAndHlwZSc6ICdib29sJ1xuICAgICAgfVxuICAgIF0sXG4gICAgJ291dHB1dHMnOiBbXG4gICAgICAnaW5kaWNlcycsXG4gICAgICAndmFsdWVzJyxcbiAgICAgICdzaGFwZSdcbiAgICBdXG4gIH0sXG4gIHtcbiAgICAndGZPcE5hbWUnOiAnU3RyaW5nVG9IYXNoQnVja2V0RmFzdCcsXG4gICAgJ2NhdGVnb3J5JzogJ3N0cmluZycsXG4gICAgJ2lucHV0cyc6IFtcbiAgICAgIHtcbiAgICAgICAgJ3N0YXJ0JzogMCxcbiAgICAgICAgJ25hbWUnOiAnaW5wdXQnLFxuICAgICAgICAndHlwZSc6ICd0ZW5zb3InXG4gICAgICB9XG4gICAgXSxcbiAgICAnYXR0cnMnOiBbXG4gICAgICB7XG4gICAgICAgICd0Zk5hbWUnOiAnbnVtX2J1Y2tldHMnLFxuICAgICAgICAnbmFtZSc6ICdudW1CdWNrZXRzJyxcbiAgICAgICAgJ3R5cGUnOiAnbnVtYmVyJ1xuICAgICAgfVxuICAgIF1cbiAgfVxuXTtcbiJdfQ==","/**\n * @license\n * Copyright 2022 Google LLC. All Rights Reserved.\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n * =============================================================================\n */\nexport const json = [\n {\n 'tfOpName': 'Cast',\n 'category': 'transformation',\n 'inputs': [\n {\n 'start': 0,\n 'name': 'x',\n 'type': 'tensor'\n }\n ],\n 'attrs': [\n {\n 'tfName': 'SrcT',\n 'name': 'sdtype',\n 'type': 'dtype',\n 'notSupported': true\n },\n {\n 'tfName': 'DstT',\n 'name': 'dtype',\n 'type': 'dtype'\n }\n ]\n },\n {\n 'tfOpName': 'ExpandDims',\n 'category': 'transformation',\n 'inputs': [\n {\n 'start': 0,\n 'name': 'x',\n 'type': 'tensor'\n },\n {\n 'start': 1,\n 'name': 'axis',\n 'type': 'number'\n }\n ]\n },\n {\n 'tfOpName': 'MirrorPad',\n 'category': 'transformation',\n 'inputs': [\n {\n 'start': 0,\n 'name': 'x',\n 'type': 'tensor'\n },\n {\n 'start': 1,\n 'name': 'padding',\n 'type': 'number[]'\n }\n ],\n 'attrs': [\n {\n 'tfName': 'mode',\n 'name': 'mode',\n 'type': 'string'\n }\n ]\n },\n {\n 'tfOpName': 'Pad',\n 'category': 'transformation',\n 'inputs': [\n {\n 'start': 0,\n 'name': 'x',\n 'type': 'tensor'\n },\n {\n 'start': 1,\n 'name': 'padding',\n 'type': 'number[]'\n }\n ],\n 'attrs': [\n {\n 'tfName': 'constant_value',\n 'name': 'constantValue',\n 'type': 'number',\n 'defaultValue': 0\n }\n ]\n },\n {\n 'tfOpName': 'PadV2',\n 'category': 'transformation',\n 'inputs': [\n {\n 'start': 0,\n 'name': 'x',\n 'type': 'tensor'\n },\n {\n 'start': 1,\n 'name': 'padding',\n 'type': 'number[]'\n },\n {\n 'start': 2,\n 'name': 'constantValue',\n 'type': 'number',\n 'defaultValue': 0\n }\n ]\n },\n {\n 'tfOpName': 'Reshape',\n 'category': 'transformation',\n 'inputs': [\n {\n 'start': 0,\n 'name': 'x',\n 'type': 'tensor'\n },\n {\n 'start': 1,\n 'name': 'shape',\n 'type': 'number[]'\n }\n ]\n },\n {\n 'tfOpName': 'Squeeze',\n 'category': 'transformation',\n 'inputs': [\n {\n 'start': 0,\n 'name': 'x',\n 'type': 'tensor'\n }\n ],\n 'attrs': [\n {\n 'tfName': 'axis',\n 'tfDeprecatedName': 'squeeze_dims',\n 'name': 'axis',\n 'type': 'number[]'\n }\n ]\n },\n {\n 'tfOpName': 'SpaceToBatchND',\n 'category': 'transformation',\n 'inputs': [\n {\n 'start': 0,\n 'name': 'x',\n 'type': 'tensor'\n },\n {\n 'start': 1,\n 'name': 'blockShape',\n 'type': 'number[]'\n },\n {\n 'start': 2,\n 'name': 'paddings',\n 'type': 'number[]'\n }\n ]\n },\n {\n 'tfOpName': 'BatchToSpaceND',\n 'category': 'transformation',\n 'inputs': [\n {\n 'start': 0,\n 'name': 'x',\n 'type': 'tensor'\n },\n {\n 'start': 1,\n 'name': 'blockShape',\n 'type': 'number[]'\n },\n {\n 'start': 2,\n 'name': 'crops',\n 'type': 'number[]'\n }\n ]\n },\n {\n 'tfOpName': 'DepthToSpace',\n 'category': 'transformation',\n 'inputs': [\n {\n 'start': 0,\n 'name': 'x',\n 'type': 'tensor'\n }\n ],\n 'attrs': [\n {\n 'tfName': 'block_size',\n 'name': 'blockSize',\n 'type': 'number'\n },\n {\n 'tfName': 'data_format',\n 'name': 'dataFormat',\n 'type': 'string'\n }\n ]\n },\n {\n 'tfOpName': 'BroadcastTo',\n 'category': 'transformation',\n 'inputs': [\n {\n 'start': 0,\n 'name': 'x',\n 'type': 'tensor'\n },\n {\n 'start': 1,\n 'name': 'shape',\n 'type': 'number[]'\n }\n ],\n 'attrs': []\n },\n {\n 'tfOpName': 'BroadcastArgs',\n 'category': 'transformation',\n 'inputs': [\n {\n 'start': 0,\n 'name': 's0',\n 'type': 'tensor'\n },\n {\n 'start': 1,\n 'name': 's1',\n 'type': 'tensor'\n }\n ],\n 'attrs': []\n }\n];\n//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidHJhbnNmb3JtYXRpb24uanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi8uLi8uLi90ZmpzLWNvbnZlcnRlci9zcmMvb3BlcmF0aW9ucy9vcF9saXN0L3RyYW5zZm9ybWF0aW9uLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUNBOzs7Ozs7Ozs7Ozs7Ozs7R0FlRztBQUlILE1BQU0sQ0FBQyxNQUFNLElBQUksR0FBZTtJQUM5QjtRQUNFLFVBQVUsRUFBRSxNQUFNO1FBQ2xCLFVBQVUsRUFBRSxnQkFBZ0I7UUFDNUIsUUFBUSxFQUFFO1lBQ1I7Z0JBQ0UsT0FBTyxFQUFFLENBQUM7Z0JBQ1YsTUFBTSxFQUFFLEdBQUc7Z0JBQ1gsTUFBTSxFQUFFLFFBQVE7YUFDakI7U0FDRjtRQUNELE9BQU8sRUFBRTtZQUNQO2dCQUNFLFFBQVEsRUFBRSxNQUFNO2dCQUNoQixNQUFNLEVBQUUsUUFBUTtnQkFDaEIsTUFBTSxFQUFFLE9BQU87Z0JBQ2YsY0FBYyxFQUFFLElBQUk7YUFDckI7WUFDRDtnQkFDRSxRQUFRLEVBQUUsTUFBTTtnQkFDaEIsTUFBTSxFQUFFLE9BQU87Z0JBQ2YsTUFBTSxFQUFFLE9BQU87YUFDaEI7U0FDRjtLQUNGO0lBQ0Q7UUFDRSxVQUFVLEVBQUUsWUFBWTtRQUN4QixVQUFVLEVBQUUsZ0JBQWdCO1FBQzVCLFFBQVEsRUFBRTtZQUNSO2dCQUNFLE9BQU8sRUFBRSxDQUFDO2dCQUNWLE1BQU0sRUFBRSxHQUFHO2dCQUNYLE1BQU0sRUFBRSxRQUFRO2FBQ2pCO1lBQ0Q7Z0JBQ0UsT0FBTyxFQUFFLENBQUM7Z0JBQ1YsTUFBTSxFQUFFLE1BQU07Z0JBQ2QsTUFBTSxFQUFFLFFBQVE7YUFDakI7U0FDRjtLQUNGO0lBQ0Q7UUFDRSxVQUFVLEVBQUUsV0FBVztRQUN2QixVQUFVLEVBQUUsZ0JBQWdCO1FBQzVCLFFBQVEsRUFBRTtZQUNSO2dCQUNFLE9BQU8sRUFBRSxDQUFDO2dCQUNWLE1BQU0sRUFBRSxHQUFHO2dC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QUk7Z0JBQ1osTUFBTSxFQUFFLFFBQVE7YUFDakI7U0FDRjtRQUNELE9BQU8sRUFBRSxFQUFFO0tBQ1o7Q0FDRixDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiXG4vKipcbiAqIEBsaWNlbnNlXG4gKiBDb3B5cmlnaHQgMjAyMiBHb29nbGUgTExDLiBBbGwgUmlnaHRzIFJlc2VydmVkLlxuICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlIFwiTGljZW5zZVwiKTtcbiAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS5cbiAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdFxuICpcbiAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMFxuICpcbiAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmVcbiAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuIFwiQVMgSVNcIiBCQVNJUyxcbiAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLlxuICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZFxuICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuXG4gKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuICovXG5cbmltcG9ydCB7T3BNYXBwZXJ9IGZyb20gJy4uL3R5cGVzJztcblxuZXhwb3J0IGNvbnN0IGpzb246IE9wTWFwcGVyW10gPSBbXG4gIHtcbiAgICAndGZPcE5hbWUnOiAnQ2FzdCcsXG4gICAgJ2NhdGVnb3J5JzogJ3RyYW5zZm9ybWF0aW9uJyxcbiAgICAnaW5wdXRzJzogW1xuICAgICAge1xuICAgICAgICAnc3RhcnQnOiAwLFxuICAgICAgICAnbmFtZSc6ICd4JyxcbiAgICAgICAgJ3R5cGUnOiAndGVuc29yJ1xuICAgICAgfVxuICAgIF0sXG4gICAgJ2F0dHJzJzogW1xuICAgICAge1xuICAgICAgICAndGZOYW1lJzogJ1NyY1QnLFxuICAgICAgICAnbmFtZSc6ICdzZHR5cGUnLFxuICAgICAgICAndHlwZSc6ICdkdHlwZScsXG4gICAgICAgICdub3RTdXBwb3J0ZWQnOiB0cnVlXG4gICAgICB9LFxuICAgICAge1xuICAgICAgICAndGZOYW1lJzogJ0RzdFQnLFxuICAgICAgICAnbmFtZSc6ICdkdHlwZScsXG4gICAgICAgICd0eXBlJzogJ2R0eXBlJ1xuICAgICAgfVxuICAgIF1cbiAgfSxcbiAge1xuICAgICd0Zk9wTmFtZSc6ICdFeHBhbmREaW1zJyxcbiAgICAnY2F0ZWdvcnknOiAndHJhbnNmb3JtYXRpb24nLFxuICAgICdpbnB1dHMnOiBbXG4gICAgICB7XG4gICAgICAgICdzdGFydCc6IDAsXG4gICAgICAgICduYW1lJzogJ3gnLFxuICAgICAgICAndHlwZSc6ICd0ZW5zb3InXG4gICAgICB9LFxuICAgICAge1xuICAgICAgICAnc3RhcnQnOiAxLFxuICAgICAgICAnbmFtZSc6ICdheGlzJyxcbiAgICAgICAgJ3R5cGUnOiAnbnVtYmVyJ1xuICAgICAgfVxuICAgIF1cbiAgfSxcbiAge1xuICAgICd0Zk9wTmFtZSc6ICdNaXJyb3JQYWQnLFxuICAgICdjYXRlZ29yeSc6ICd0cmFuc2Zvcm1hdGlvbicsXG4gICAgJ2lucHV0cyc6IFtcbiAgICAgIHtcbiAgICAgICAgJ3N0YXJ0JzogMCxcbiAgICAgICAgJ25hbWUnOiAneCcsXG4gICAgICAgICd0eXBlJzogJ3RlbnNvcidcbiAgICAgIH0sXG4gICAgICB7XG4gICAgICAgICdzdGFydCc6IDEsXG4gICAgICAgICduYW1lJzogJ3BhZGRpbmcnLFxuICAgICAgICAndHlwZSc6ICdudW1iZXJbXSdcbiAgICAgIH1cbiAgICBdLFxuICAgICdhdHRycyc6IFtcbiAgICAgIHtcbiAgICAgICAgJ3RmTmFtZSc6ICdtb2RlJyxcbiAgICAgICAgJ25hbWUnOiAnbW9kZScsXG4gICAgICAgICd0eXBlJzogJ3N0cmluZydcbiAgICAgIH1cbiAgICBdXG4gIH0sXG4gIHtcbiAgICAndGZPcE5hbWUnOiAnUGFkJyxcbiAgICAnY2F0ZWdvcnknOiAndHJhbnNmb3JtYXRpb24nLFxuICAgICdpbnB1dHMnOiBbXG4gICAgICB7XG4gICAgICAgICdzdGFydCc6IDAsXG4gICAgICAgICduYW1lJzogJ3gnLFxuICAgICAgICAndHlwZSc6ICd0ZW5zb3InXG4gICAgICB9LFxuICAgICAge1xuICAgICAgICAnc3RhcnQnOiAxLFxuICAgICAgICAnbmFtZSc6ICdwYWRkaW5nJyxcbiAgICAgICAgJ3R5cGUnOiAnbnVtYmVyW10nXG4gICAgICB9XG4gICAgXSxcbiAgICAnYXR0cnMnOiBbXG4gICAgICB7XG4gICAgICAgICd0Zk5hbWUnOiAnY29uc3RhbnRfdmFsdWUnLFxuICAgICAgICAnbmFtZSc6ICdjb25zdGFudFZhbHVlJyxcbiAgICAgICAgJ3R5cGUnOiAnbnVtYmVyJyxcbiAgICAgICAgJ2RlZmF1bHRWYWx1ZSc6IDBcbiAgICAgIH1cbiAgICBdXG4gIH0sXG4gIHtcbiAgICAndGZPcE5hbWUnOiAnUGFkVjInLFxuICAgICdjYXRlZ29yeSc6ICd0cmFuc2Zvcm1hdGlvbicsXG4gICAgJ2lucHV0cyc6IFtcbiAgICAgIHtcbiAgICAgICAgJ3N0YXJ0JzogMCxcbiAgICAgICAgJ25hbWUnOiAneCcsXG4gICAgICAgICd0eXBlJzogJ3RlbnNvcidcbiAgICAgIH0sXG4gICAgICB7XG4gICAgICAgICdzdGFydCc6IDEsXG4gICAgICAgICduYW1lJzogJ3BhZGRpbmcnLFxuICAgICAgICAndHlwZSc6ICdudW1iZXJbXSdcbiAgICAgIH0sXG4gICAgICB7XG4gICAgICAgICdzdGFydCc6IDIsXG4gICAgICAgICduYW1lJzogJ2NvbnN0YW50VmFsdWUnLFxuICAgICAgICAndHlwZSc6ICdudW1iZXInLFxuICAgICAgICAnZGVmYXVsdFZhbHVlJzogMFxuICAgICAgfVxuICAgIF1cbiAgfSxcbiAge1xuICAgICd0Zk9wTmFtZSc6ICdSZXNoYXBlJyxcbiAgICAnY2F0ZWdvcnknOiAndHJhbnNmb3JtYXRpb24nLFxuICAgICdpbnB1dHMnOiBbXG4gICAgICB7XG4gICAgICAgICdzdGFydCc6IDAsXG4gICAgICAgICduYW1lJzogJ3gnLFxuICAgICAgICAndHlwZSc6ICd0ZW5zb3InXG4gICAgICB9LFxuICAgICAge1xuICAgICAgICAnc3RhcnQnOiAxLFxuICAgICAgICAnbmFtZSc6ICdzaGFwZScsXG4gICAgICAgICd0eXBlJzogJ251bWJlcltdJ1xuICAgICAgfVxuICAgIF1cbiAgfSxcbiAge1xuICAgICd0Zk9wTmFtZSc6ICdTcXVlZXplJyxcbiAgICAnY2F0ZWdvcnknOiAndHJhbnNmb3JtYXRpb24nLFxuICAgICdpbnB1dHMnOiBbXG4gICAgICB7XG4gICAgICAgICdzdGFydCc6IDAsXG4gICAgICAgICduYW1lJzogJ3gnLFxuICAgICAgICAndHlwZSc6ICd0ZW5zb3InXG4gICAgICB9XG4gICAgXSxcbiAgICAnYXR0cnMnOiBbXG4gICAgICB7XG4gICAgICAgICd0Zk5hbWUnOiAnYXhpcycsXG4gICAgICAgICd0ZkRlcHJlY2F0ZWROYW1lJzogJ3NxdWVlemVfZGltcycsXG4gICAgICAgICduYW1lJzogJ2F4aXMnLFxuICAgICAgICAndHlwZSc6ICdudW1iZXJbXSdcbiAgICAgIH1cbiAgICBdXG4gIH0sXG4gIHtcbiAgICAndGZPcE5hbWUnOiAnU3BhY2VUb0JhdGNoTkQnLFxuICAgICdjYXRlZ29yeSc6ICd0cmFuc2Zvcm1hdGlvbicsXG4gICAgJ2lucHV0cyc6IFtcbiAgICAgIHtcbiAgICAgICAgJ3N0YXJ0JzogMCxcbiAgICAgICAgJ25hbWUnOiAneCcsXG4gICAgICAgICd0eXBlJzogJ3RlbnNvcidcbiAgICAgIH0sXG4gICAgICB7XG4gICAgICAgICdzdGFydCc6IDEsXG4gICAgICAgICduYW1lJzogJ2Jsb2NrU2hhcGUnLFxuICAgICAgICAndHlwZSc6ICdudW1iZXJbXSdcbiAgICAgIH0sXG4gICAgICB7XG4gICAgICAgICdzdGFydCc6IDIsXG4gICAgICAgICduYW1lJzogJ3BhZGRpbmdzJyxcbiAgICAgICAgJ3R5cGUnOiAnbnVtYmVyW10nXG4gICAgICB9XG4gICAgXVxuICB9LFxuICB7XG4gICAgJ3RmT3BOYW1lJzogJ0JhdGNoVG9TcGFjZU5EJyxcbiAgICAnY2F0ZWdvcnknOiAndHJhbnNmb3JtYXRpb24nLFxuICAgICdpbnB1dHMnOiBbXG4gICAgICB7XG4gICAgICAgICdzdGFydCc6IDAsXG4gICAgICAgICduYW1lJzogJ3gnLFxuICAgICAgICAndHlwZSc6ICd0ZW5zb3InXG4gICAgICB9LFxuICAgICAge1xuICAgICAgICAnc3RhcnQnOiAxLFxuICAgICAgICAnbmFtZSc6ICdibG9ja1NoYXBlJyxcbiAgICAgICAgJ3R5cGUnOiAnbnVtYmVyW10nXG4gICAgICB9LFxuICAgICAge1xuICAgICAgICAnc3RhcnQnOiAyLFxuICAgICAgICAnbmFtZSc6ICdjcm9wcycsXG4gICAgICAgICd0eXBlJzogJ251bWJlcltdJ1xuICAgICAgfVxuICAgIF1cbiAgfSxcbiAge1xuICAgICd0Zk9wTmFtZSc6ICdEZXB0aFRvU3BhY2UnLFxuICAgICdjYXRlZ29yeSc6ICd0cmFuc2Zvcm1hdGlvbicsXG4gICAgJ2lucHV0cyc6IFtcbiAgICAgIHtcbiAgICAgICAgJ3N0YXJ0JzogMCxcbiAgICAgICAgJ25hbWUnOiAneCcsXG4gICAgICAgICd0eXBlJzogJ3RlbnNvcidcbiAgICAgIH1cbiAgICBdLFxuICAgICdhdHRycyc6IFtcbiAgICAgIHtcbiAgICAgICAgJ3RmTmFtZSc6ICdibG9ja19zaXplJyxcbiAgICAgICAgJ25hbWUnOiAnYmxvY2tTaXplJyxcbiAgICAgICAgJ3R5cGUnOiAnbnVtYmVyJ1xuICAgICAgfSxcbiAgICAgIHtcbiAgICAgICAgJ3RmTmFtZSc6ICdkYXRhX2Zvcm1hdCcsXG4gICAgICAgICduYW1lJzogJ2RhdGFGb3JtYXQnLFxuICAgICAgICAndHlwZSc6ICdzdHJpbmcnXG4gICAgICB9XG4gICAgXVxuICB9LFxuICB7XG4gICAgJ3RmT3BOYW1lJzogJ0Jyb2FkY2FzdFRvJyxcbiAgICAnY2F0ZWdvcnknOiAndHJhbnNmb3JtYXRpb24nLFxuICAgICdpbnB1dHMnOiBbXG4gICAgICB7XG4gICAgICAgICdzdGFydCc6IDAsXG4gICAgICAgICduYW1lJzogJ3gnLFxuICAgICAgICAndHlwZSc6ICd0ZW5zb3InXG4gICAgICB9LFxuICAgICAge1xuICAgICAgICAnc3RhcnQnOiAxLFxuICAgICAgICAnbmFtZSc6ICdzaGFwZScsXG4gICAgICAgICd0eXBlJzogJ251bWJlcltdJ1xuICAgICAgfVxuICAgIF0sXG4gICAgJ2F0dHJzJzogW11cbiAgfSxcbiAge1xuICAgICd0Zk9wTmFtZSc6ICdCcm9hZGNhc3RBcmdzJyxcbiAgICAnY2F0ZWdvcnknOiAndHJhbnNmb3JtYXRpb24nLFxuICAgICdpbnB1dHMnOiBbXG4gICAgICB7XG4gICAgICAgICdzdGFydCc6IDAsXG4gICAgICAgICduYW1lJzogJ3MwJyxcbiAgICAgICAgJ3R5cGUnOiAndGVuc29yJ1xuICAgICAgfSxcbiAgICAgIHtcbiAgICAgICAgJ3N0YXJ0JzogMSxcbiAgICAgICAgJ25hbWUnOiAnczEnLFxuICAgICAgICAndHlwZSc6ICd0ZW5zb3InXG4gICAgICB9XG4gICAgXSxcbiAgICAnYXR0cnMnOiBbXVxuICB9XG5dO1xuIl19","/**\n * @license\n * Copyright 2018 Google LLC. All Rights Reserved.\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n * =============================================================================\n */\nimport { env } from '@tensorflow/tfjs-core';\nimport * as tensorflow from '../data/compiled_api';\nimport { getRegisteredOp } from './custom_op/register';\nimport { getNodeNameAndIndex } from './executors/utils';\nimport * as arithmetic from './op_list/arithmetic';\nimport * as basicMath from './op_list/basic_math';\nimport * as control from './op_list/control';\nimport * as convolution from './op_list/convolution';\nimport * as creation from './op_list/creation';\nimport * as dynamic from './op_list/dynamic';\nimport * as evaluation from './op_list/evaluation';\nimport * as graph from './op_list/graph';\nimport * as hashTable from './op_list/hash_table';\nimport * as image from './op_list/image';\nimport * as logical from './op_list/logical';\nimport * as matrices from './op_list/matrices';\nimport * as normalization from './op_list/normalization';\nimport * as reduction from './op_list/reduction';\nimport * as sliceJoin from './op_list/slice_join';\nimport * as sparse from './op_list/sparse';\nimport * as spectral from './op_list/spectral';\nimport * as string from './op_list/string';\nimport * as transformation from './op_list/transformation';\nexport class OperationMapper {\n // Singleton instance for the mapper\n static get Instance() {\n return this._instance || (this._instance = new this());\n }\n // Loads the op mapping from the JSON file.\n constructor() {\n const ops = [\n arithmetic, basicMath, control, convolution, creation, dynamic,\n evaluation, graph, hashTable, image, logical, matrices, normalization,\n reduction, sliceJoin, sparse, spectral, string, transformation\n ];\n const mappersJson = [].concat(...ops.map(op => op.json));\n this.opMappers = mappersJson.reduce((map, mapper) => {\n map[mapper.tfOpName] = mapper;\n return map;\n }, {});\n }\n // Converts the model inference graph from Tensorflow GraphDef to local\n // representation for TensorFlow.js API\n transformGraph(graph, signature = {}) {\n const tfNodes = graph.node;\n const placeholders = [];\n const weights = [];\n const initNodes = [];\n const nodes = tfNodes.reduce((map, node) => {\n map[node.name] = this.mapNode(node);\n if (node.op.startsWith('Placeholder')) {\n placeholders.push(map[node.name]);\n }\n else if (node.op === 'Const') {\n weights.push(map[node.name]);\n }\n else if (node.input == null || node.input.length === 0) {\n initNodes.push(map[node.name]);\n }\n return map;\n }, {});\n let inputs = [];\n const outputs = [];\n let inputNodeNameToKey = {};\n let outputNodeNameToKey = {};\n if (signature != null) {\n inputNodeNameToKey = this.mapSignatureEntries(signature.inputs);\n outputNodeNameToKey = this.mapSignatureEntries(signature.outputs);\n }\n const allNodes = Object.keys(nodes);\n allNodes.forEach(key => {\n const node = nodes[key];\n node.inputNames.forEach((name, index) => {\n const [nodeName, , outputName] = getNodeNameAndIndex(name);\n const inputNode = nodes[nodeName];\n if (inputNode.outputs != null) {\n const outputIndex = inputNode.outputs.indexOf(outputName);\n if (outputIndex !== -1) {\n const inputName = `${nodeName}:${outputIndex}`;\n // update the input name to use the mapped output index directly.\n node.inputNames[index] = inputName;\n }\n }\n node.inputs.push(inputNode);\n inputNode.children.push(node);\n });\n });\n // if signature has not outputs set, add any node that does not have\n // outputs.\n if (Object.keys(outputNodeNameToKey).length === 0) {\n allNodes.forEach(key => {\n const node = nodes[key];\n if (node.children.length === 0) {\n outputs.push(node);\n }\n });\n }\n else {\n Object.keys(outputNodeNameToKey).forEach(name => {\n const [nodeName,] = getNodeNameAndIndex(name);\n const node = nodes[nodeName];\n if (node != null) {\n node.signatureKey = outputNodeNameToKey[name];\n outputs.push(node);\n }\n });\n }\n if (Object.keys(inputNodeNameToKey).length > 0) {\n Object.keys(inputNodeNameToKey).forEach(name => {\n const [nodeName,] = getNodeNameAndIndex(name);\n const node = nodes[nodeName];\n if (node) {\n node.signatureKey = inputNodeNameToKey[name];\n inputs.push(node);\n }\n });\n }\n else {\n inputs = placeholders;\n }\n let functions = {};\n if (graph.library != null && graph.library.function != null) {\n functions = graph.library.function.reduce((functions, func) => {\n functions[func.signature.name] = this.mapFunction(func);\n return functions;\n }, {});\n }\n const result = { nodes, inputs, outputs, weights, placeholders, signature, functions };\n if (initNodes.length > 0) {\n result.initNodes = initNodes;\n }\n return result;\n }\n mapSignatureEntries(entries) {\n return Object.keys(entries || {})\n .reduce((prev, curr) => {\n prev[entries[curr].name] = curr;\n return prev;\n }, {});\n }\n mapNode(node) {\n // Unsupported ops will cause an error at run-time (not parse time), since\n // they may not be used by the actual execution subgraph.\n const mapper = getRegisteredOp(node.op) || this.opMappers[node.op] || {};\n if (node.attr == null) {\n node.attr = {};\n }\n const newNode = {\n name: node.name,\n op: node.op,\n category: mapper.category,\n inputNames: (node.input ||\n []).map(input => input.startsWith('^') ? input.slice(1) : input),\n inputs: [],\n children: [],\n inputParams: {},\n attrParams: {},\n rawAttrs: node.attr,\n outputs: mapper.outputs\n };\n if (mapper.inputs != null) {\n newNode.inputParams =\n mapper.inputs.reduce((map, param) => {\n map[param.name] = {\n type: param.type,\n inputIndexStart: param.start,\n inputIndexEnd: param.end\n };\n return map;\n }, {});\n }\n if (mapper.attrs != null) {\n newNode.attrParams =\n mapper.attrs.reduce((map, param) => {\n const type = param.type;\n let value = undefined;\n switch (param.type) {\n case 'string':\n value = getStringParam(node.attr, param.tfName, param.defaultValue);\n if (value === undefined && !!param.tfDeprecatedName) {\n value = getStringParam(node.attr, param.tfDeprecatedName, param.defaultValue);\n }\n break;\n case 'string[]':\n value = getStringArrayParam(node.attr, param.tfName, param.defaultValue);\n if (value === undefined && !!param.tfDeprecatedName) {\n value = getStringArrayParam(node.attr, param.tfDeprecatedName, param.defaultValue);\n }\n break;\n case 'number':\n value = getNumberParam(node.attr, param.tfName, (param.defaultValue || 0));\n if (value === undefined && !!param.tfDeprecatedName) {\n value = getNumberParam(node.attr, param.tfDeprecatedName, param.defaultValue);\n }\n break;\n case 'number[]':\n value = getNumericArrayParam(node.attr, param.tfName, param.defaultValue);\n if (value === undefined && !!param.tfDeprecatedName) {\n value = getNumericArrayParam(node.attr, param.tfDeprecatedName, param.defaultValue);\n }\n break;\n case 'bool':\n value = getBoolParam(node.attr, param.tfName, param.defaultValue);\n if (value === undefined && !!param.tfDeprecatedName) {\n value = getBoolParam(node.attr, param.tfDeprecatedName, param.defaultValue);\n }\n break;\n case 'bool[]':\n value = getBoolArrayParam(node.attr, param.tfName, param.defaultValue);\n if (value === undefined && !!param.tfDeprecatedName) {\n value = getBoolArrayParam(node.attr, param.tfDeprecatedName, param.defaultValue);\n }\n break;\n case 'shape':\n value = getTensorShapeParam(node.attr, param.tfName, param.defaultValue);\n if (value === undefined && !!param.tfDeprecatedName) {\n value = getTensorShapeParam(node.attr, param.tfDeprecatedName, param.defaultValue);\n }\n break;\n case 'shape[]':\n value = getTensorShapeArrayParam(node.attr, param.tfName, param.defaultValue);\n if (value === undefined && !!param.tfDeprecatedName) {\n value = getTensorShapeArrayParam(node.attr, param.tfDeprecatedName, param.defaultValue);\n }\n break;\n case 'dtype':\n value = getDtypeParam(node.attr, param.tfName, param.defaultValue);\n if (value === undefined && !!param.tfDeprecatedName) {\n value = getDtypeParam(node.attr, param.tfDeprecatedName, param.defaultValue);\n }\n break;\n case 'dtype[]':\n value = getDtypeArrayParam(node.attr, param.tfName, param.defaultValue);\n if (value === undefined && !!param.tfDeprecatedName) {\n value = getDtypeArrayParam(node.attr, param.tfDeprecatedName, param.defaultValue);\n }\n break;\n case 'func':\n value = getFuncParam(node.attr, param.tfName, param.defaultValue);\n if (value === undefined && !!param.tfDeprecatedName) {\n value = getFuncParam(node.attr, param.tfDeprecatedName, param.defaultValue);\n }\n break;\n case 'tensor':\n case 'tensors':\n break;\n default:\n throw new Error(`Unsupported param type: ${param.type} for op: ${node.op}`);\n }\n map[param.name] = { value, type };\n return map;\n }, {});\n }\n return newNode;\n }\n // map the TFunctionDef to TFJS graph object\n mapFunction(functionDef) {\n const tfNodes = functionDef.nodeDef;\n const placeholders = [];\n const weights = [];\n let nodes = {};\n if (tfNodes != null) {\n nodes = tfNodes.reduce((map, node) => {\n map[node.name] = this.mapNode(node);\n if (node.op === 'Const') {\n weights.push(map[node.name]);\n }\n return map;\n }, {});\n }\n const inputs = [];\n const outputs = [];\n functionDef.signature.inputArg.forEach(arg => {\n const [nodeName,] = getNodeNameAndIndex(arg.name);\n const node = {\n name: nodeName,\n op: 'Placeholder',\n inputs: [],\n inputNames: [],\n category: 'graph',\n inputParams: {},\n attrParams: { dtype: { value: parseDtypeParam(arg.type), type: 'dtype' } },\n children: []\n };\n node.signatureKey = arg.name;\n inputs.push(node);\n nodes[nodeName] = node;\n });\n const allNodes = Object.keys(nodes);\n allNodes.forEach(key => {\n const node = nodes[key];\n node.inputNames.forEach((name, index) => {\n const [nodeName, , outputName] = getNodeNameAndIndex(name);\n const inputNode = nodes[nodeName];\n if (inputNode.outputs != null) {\n const outputIndex = inputNode.outputs.indexOf(outputName);\n if (outputIndex !== -1) {\n const inputName = `${nodeName}:${outputIndex}`;\n // update the input name to use the mapped output index directly.\n node.inputNames[index] = inputName;\n }\n }\n node.inputs.push(inputNode);\n inputNode.children.push(node);\n });\n });\n const returnNodeMap = functionDef.ret;\n functionDef.signature.outputArg.forEach(output => {\n const [nodeName, index] = getNodeNameAndIndex(returnNodeMap[output.name]);\n const node = nodes[nodeName];\n if (node != null) {\n node.defaultOutput = index;\n outputs.push(node);\n }\n });\n const signature = this.mapArgsToSignature(functionDef);\n return { nodes, inputs, outputs, weights, placeholders, signature };\n }\n mapArgsToSignature(functionDef) {\n return {\n methodName: functionDef.signature.name,\n inputs: functionDef.signature.inputArg.reduce((map, arg) => {\n map[arg.name] = this.mapArgToTensorInfo(arg);\n return map;\n }, {}),\n outputs: functionDef.signature.outputArg.reduce((map, arg) => {\n map[arg.name] = this.mapArgToTensorInfo(arg, functionDef.ret);\n return map;\n }, {}),\n };\n }\n mapArgToTensorInfo(arg, nameMap) {\n let name = arg.name;\n if (nameMap != null) {\n name = nameMap[name];\n }\n return { name, dtype: arg.type };\n }\n}\nexport function decodeBase64(text) {\n const global = env().global;\n if (typeof global.atob !== 'undefined') {\n return global.atob(text);\n }\n else if (typeof Buffer !== 'undefined') {\n return new Buffer(text, 'base64').toString();\n }\n else {\n throw new Error('Unable to decode base64 in this environment. ' +\n 'Missing built-in atob() or Buffer()');\n }\n}\nexport function parseStringParam(s, keepCase) {\n const value = Array.isArray(s) ? String.fromCharCode.apply(null, s) : decodeBase64(s);\n return keepCase ? value : value.toLowerCase();\n}\nexport function getStringParam(attrs, name, def, keepCase = false) {\n const param = attrs[name];\n if (param != null) {\n return parseStringParam(param.s, keepCase);\n }\n return def;\n}\nexport function getBoolParam(attrs, name, def) {\n const param = attrs[name];\n return param ? param.b : def;\n}\nexport function getNumberParam(attrs, name, def) {\n const param = attrs[name] || {};\n const value = param['i'] != null ? param['i'] : (param['f'] != null ? param['f'] : def);\n return (typeof value === 'number') ? value : parseInt(value, 10);\n}\nexport function parseDtypeParam(value) {\n if (typeof (value) === 'string') {\n // tslint:disable-next-line:no-any\n value = tensorflow.DataType[value];\n }\n switch (value) {\n case tensorflow.DataType.DT_FLOAT:\n case tensorflow.DataType.DT_HALF:\n return 'float32';\n case tensorflow.DataType.DT_INT32:\n case tensorflow.DataType.DT_INT64:\n case tensorflow.DataType.DT_INT8:\n case tensorflow.DataType.DT_UINT8:\n return 'int32';\n case tensorflow.DataType.DT_BOOL:\n return 'bool';\n case tensorflow.DataType.DT_DOUBLE:\n return 'float32';\n case tensorflow.DataType.DT_STRING:\n return 'string';\n default:\n // Unknown dtype error will happen at runtime (instead of parse time),\n // since these nodes might not be used by the actual subgraph execution.\n return null;\n }\n}\nexport function getFuncParam(attrs, name, def) {\n const param = attrs[name];\n if (param && param.func) {\n return param.func.name;\n }\n return def;\n}\nexport function getDtypeParam(attrs, name, def) {\n const param = attrs[name];\n if (param && param.type) {\n return parseDtypeParam(param.type);\n }\n return def;\n}\nexport function getDtypeArrayParam(attrs, name, def) {\n const param = attrs[name];\n if (param && param.list && param.list.type) {\n return param.list.type.map(v => parseDtypeParam(v));\n }\n return def;\n}\nexport function parseTensorShapeParam(shape) {\n if (shape.unknownRank) {\n return undefined;\n }\n if (shape.dim != null) {\n return shape.dim.map(dim => (typeof dim.size === 'number') ? dim.size : parseInt(dim.size, 10));\n }\n return [];\n}\nexport function getTensorShapeParam(attrs, name, def) {\n const param = attrs[name];\n if (param && param.shape) {\n return parseTensorShapeParam(param.shape);\n }\n return def;\n}\nexport function getNumericArrayParam(attrs, name, def) {\n const param = attrs[name];\n if (param) {\n return ((param.list.f && param.list.f.length ? param.list.f :\n param.list.i) ||\n [])\n .map(v => (typeof v === 'number') ? v : parseInt(v, 10));\n }\n return def;\n}\nexport function getStringArrayParam(attrs, name, def, keepCase = false) {\n const param = attrs[name];\n if (param && param.list && param.list.s) {\n return param.list.s.map((v) => {\n return parseStringParam(v, keepCase);\n });\n }\n return def;\n}\nexport function getTensorShapeArrayParam(attrs, name, def) {\n const param = attrs[name];\n if (param && param.list && param.list.shape) {\n return param.list.shape.map((v) => {\n return parseTensorShapeParam(v);\n });\n }\n return def;\n}\nexport function getBoolArrayParam(attrs, name, def) {\n const param = attrs[name];\n if (param && param.list && param.list.b) {\n return param.list.b;\n }\n return def;\n}\n//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoib3BlcmF0aW9uX21hcHBlci5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uLy4uL3RmanMtY29udmVydGVyL3NyYy9vcGVyYXRpb25zL29wZXJhdGlvbl9tYXBwZXIudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUE7Ozs7Ozs7Ozs7Ozs7OztHQWVHO0FBRUgsT0FBTyxFQUFXLEdBQUcsRUFBQyxNQUFNLHVCQUF1QixDQUFDO0FBRXBELE9BQU8sS0FBSyxVQUFVLE1BQU0sc0JBQXNCLENBQUM7QUFFbkQsT0FBTyxFQUFDLGVBQWUsRUFBQyxNQUFNLHNCQUFzQixDQUFDO0FBQ3JELE9BQU8sRUFBQyxtQkFBbUIsRUFBQyxNQUFNLG1CQUFtQixDQUFDO0FBQ3RELE9BQU8sS0FBSyxVQUFVLE1BQU0sc0JBQXNCLENBQUM7QUFDbkQsT0FBTyxLQUFLLFNBQVMsTUFBTSxzQkFBc0IsQ0FBQztBQUNsRCxPQUFPLEtBQUssT0FBTyxNQUFNLG1CQUFtQixDQUFDO0FBQzdDLE9BQU8sS0FBSyxXQUFXLE1BQU0sdUJBQXVCLENBQUM7QUFDckQsT0FBTyxLQUFLLFFBQVEsTUFBTSxvQkFBb0IsQ0FBQztBQUMvQyxPQUFPLEtBQUssT0FBTyxNQUFNLG1CQUFtQixDQUFDO0FBQzdDLE9BQU8sS0FBSyxVQUFVLE1BQU0sc0JBQXNCLENBQUM7QUFDbkQsT0FBTyxLQUFLLEtBQUssTUFBTSxpQkFBaUIsQ0FBQztBQUN6QyxPQUFPLEtBQUssU0FBUyxNQUFNLHNCQUFzQixDQUFDO0FBQ2xELE9BQU8sS0FBSyxLQUFLLE1BQU0saUJBQWlCLENBQUM7QUFDekMsT0FBTyxLQUFLLE9BQU8sTUFBTSxtQkFBbUIsQ0FBQztBQUM3QyxPQUFPLEtBQUssUUFBUSxNQUFNLG9CQUFvQixDQUFDO0FBQy9DLE9BQU8sS0FBSyxhQUFhLE1BQU0seUJBQXlCLENBQUM7QUFDekQsT0FBTyxLQUFLLFNBQVMsTUFBTSxxQkFBcUIsQ0FBQztBQUNqRCxPQUFPLEtB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M0MsT0FBTyxLQUFLLENBQUMsSUFBSSxDQUFDLEtBQUssQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLEVBQUUsRUFBRTtZQUNoQyxPQUFPLHFCQUFxQixDQUFDLENBQUMsQ0FBQyxDQUFDO1FBQ2xDLENBQUMsQ0FBQyxDQUFDO0tBQ0o7SUFDRCxPQUFPLEdBQUcsQ0FBQztBQUNiLENBQUM7QUFFRCxNQUFNLFVBQVUsaUJBQWlCLENBQzdCLEtBQTZDLEVBQUUsSUFBWSxFQUMzRCxHQUFjO0lBQ2hCLE1BQU0sS0FBSyxHQUFHLEtBQUssQ0FBQyxJQUFJLENBQUMsQ0FBQztJQUMxQixJQUFJLEtBQUssSUFBSSxLQUFLLENBQUMsSUFBSSxJQUFJLEtBQUssQ0FBQyxJQUFJLENBQUMsQ0FBQyxFQUFFO1FBQ3ZDLE9BQU8sS0FBSyxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUM7S0FDckI7SUFDRCxPQUFPLEdBQUcsQ0FBQztBQUNiLENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyIvKipcbiAqIEBsaWNlbnNlXG4gKiBDb3B5cmlnaHQgMjAxOCBHb29nbGUgTExDLiBBbGwgUmlnaHRzIFJlc2VydmVkLlxuICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlIFwiTGljZW5zZVwiKTtcbiAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS5cbiAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdFxuICpcbiAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMFxuICpcbiAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmVcbiAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuIFwiQVMgSVNcIiBCQVNJUyxcbiAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLlxuICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZFxuICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuXG4gKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuICovXG5cbmltcG9ydCB7RGF0YVR5cGUsIGVudn0gZnJvbSAnQHRlbnNvcmZsb3cvdGZqcy1jb3JlJztcblxuaW1wb3J0ICogYXMgdGVuc29yZmxvdyBmcm9tICcuLi9kYXRhL2NvbXBpbGVkX2FwaSc7XG5cbmltcG9ydCB7Z2V0UmVnaXN0ZXJlZE9wfSBmcm9tICcuL2N1c3RvbV9vcC9yZWdpc3Rlcic7XG5pbXBvcnQge2dldE5vZGVOYW1lQW5kSW5kZXh9IGZyb20gJy4vZXhlY3V0b3JzL3V0aWxzJztcbmltcG9ydCAqIGFzIGFyaXRobWV0aWMgZnJvbSAnLi9vcF9saXN0L2FyaXRobWV0aWMnO1xuaW1wb3J0ICogYXMgYmFzaWNNYXRoIGZyb20gJy4vb3BfbGlzdC9iYXNpY19tYXRoJztcbmltcG9ydCAqIGFzIGNvbnRyb2wgZnJvbSAnLi9vcF9saXN0L2NvbnRyb2wnO1xuaW1wb3J0ICogYXMgY29udm9sdXRpb24gZnJvbSAnLi9vcF9saXN0L2NvbnZvbHV0aW9uJztcbmltcG9ydCAqIGFzIGNyZWF0aW9uIGZyb20gJy4vb3BfbGlzdC9jcmVhdGlvbic7XG5pbXBvcnQgKiBhcyBkeW5hbWljIGZyb20gJy4vb3BfbGlzdC9keW5hbWljJztcbmltcG9ydCAqIGFzIGV2YWx1YXRpb24gZnJvbSAnLi9vcF9saXN0L2V2YWx1YXRpb24nO1xuaW1wb3J0ICogYXMgZ3JhcGggZnJvbSAnLi9vcF9saXN0L2dyYXBoJztcbmltcG9ydCAqIGFzIGhhc2hUYWJsZSBmcm9tICcuL29wX2xpc3QvaGFzaF90YWJsZSc7XG5pbXBvcnQgKiBhcyBpbWFnZSBmcm9tICcuL29wX2xpc3QvaW1hZ2UnO1xuaW1wb3J0ICogYXMgbG9naWNhbCBmcm9tICcuL29wX2xpc3QvbG9naWNhbCc7XG5pbXBvcnQgKiBhcyBtYXRyaWNlcyBmcm9tICcuL29wX2xpc3QvbWF0cmljZXMnO1xuaW1wb3J0ICogYXMgbm9ybWFsaXphdGlvbiBmcm9tICcuL29wX2xpc3Qvbm9ybWFsaXphdGlvbic7XG5pbXBvcnQgKiBhcyByZWR1Y3Rpb24gZnJvbSAnLi9vcF9saXN0L3JlZHVjdGlvbic7XG5pbXBvcnQgKiBhcyBzbGljZUpvaW4gZnJvbSAnLi9vcF9saXN0L3NsaWNlX2pvaW4nO1xuaW1wb3J0ICogYXMgc3BhcnNlIGZyb20gJy4vb3BfbGlzdC9zcGFyc2UnO1xuaW1wb3J0ICogYXMgc3BlY3RyYWwgZnJvbSAnLi9vcF9saXN0L3NwZWN0cmFsJztcbmltcG9ydCAqIGFzIHN0cmluZyBmcm9tICcuL29wX2xpc3Qvc3RyaW5nJztcbmltcG9ydCAqIGFzIHRyYW5zZm9ybWF0aW9uIGZyb20gJy4vb3BfbGlzdC90cmFuc2Zvcm1hdGlvbic7XG5pbXBvcnQge0dyYXBoLCBJbnB1dFBhcmFtVmFsdWUsIE5vZGUsIE9wTWFwcGVyLCBQYXJhbVZhbHVlfSBmcm9tICcuL3R5cGVzJztcblxuZXhwb3J0IGNsYXNzIE9wZXJhdGlvbk1hcHBlciB7XG4gIHByaXZhdGUgc3RhdGljIF9pbnN0YW5jZTogT3BlcmF0aW9uTWFwcGVyO1xuXG4gIHByaXZhdGUgb3BNYXBwZXJzOiB7W2tleTogc3RyaW5nXTogT3BNYXBwZXJ9O1xuXG4gIC8vIFNpbmdsZXRvbiBpbnN0YW5jZSBmb3IgdGhlIG1hcHBlclxuICBwdWJsaWMgc3RhdGljIGdldCBJbnN0YW5jZSgpIHtcbiAgICByZXR1cm4gdGhpcy5faW5zdGFuY2UgfHwgKHRoaXMuX2luc3RhbmNlID0gbmV3IHRoaXMoKSk7XG4gIH1cblxuICAvLyBMb2FkcyB0aGUgb3AgbWFwcGluZyBmcm9tIHRoZSBKU09OIGZpbGUuXG4gIHByaXZhdGUgY29uc3RydWN0b3IoKSB7XG4gICAgY29uc3Qgb3BzID0gW1xuICAgICAgYXJpdGhtZXRpYywgYmFzaWNNYXRoLCBjb250cm9sLCBjb252b2x1dGlvbiwgY3JlYXRpb24sIGR5bmFtaWMsXG4gICAgICBldmFsdWF0aW9uLCBncmFwaCwgaGFzaFRhYmxlLCBpbWFnZSwgbG9naWNhbCwgbWF0cmljZXMsIG5vcm1hbGl6YXRpb24sXG4gICAgICByZWR1Y3Rpb24sIHNsaWNlSm9pbiwgc3BhcnNlLCBzcGVjdHJhbCwgc3RyaW5nLCB0cmFuc2Zvcm1hdGlvblxuICAgIF07XG4gICAgY29uc3QgbWFwcGVyc0pzb246IE9wTWFwcGVyW10gPSBbXS5jb25jYXQoLi4ub3BzLm1hcChvcCA9PiBvcC5qc29uKSk7XG5cbiAgICB0aGlzLm9wTWFwcGVycyA9IG1hcHBlcnNKc29uLnJlZHVjZTx7W2tleTogc3RyaW5nXTogT3BNYXBwZXJ9PihcbiAgICAgICAgKG1hcCwgbWFwcGVyOiBPcE1hcHBlcikgPT4ge1xuICAgICAgICAgIG1hcFttYXBwZXIudGZPcE5hbWVdID0gbWFwcGVyO1xuICAgICAgICAgIHJldHVybiBtYXA7XG4gICAgICAgIH0sXG4gICAgICAgIHt9KTtcbiAgfVxuXG4gIC8vIENvbnZlcnRzIHRoZSBtb2RlbCBpbmZlcmVuY2UgZ3JhcGggZnJvbSBUZW5zb3JmbG93IEdyYXBoRGVmIHRvIGxvY2FsXG4gIC8vIHJlcHJlc2VudGF0aW9uIGZvciBUZW5zb3JGbG93LmpzIEFQSVxuICB0cmFuc2Zvcm1HcmFwaChcbiAgICAgIGdyYXBoOiB0ZW5zb3JmbG93LklHcmFwaERlZixcbiAgICAgIHNpZ25hdHVyZTogdGVuc29yZmxvdy5JU2lnbmF0dXJlRGVmID0ge30pOiBHcmFwaCB7XG4gICAgY29uc3QgdGZOb2RlcyA9IGdyYXBoLm5vZGU7XG4gICAgY29uc3QgcGxhY2Vob2xkZXJzOiBOb2RlW10gPSBbXTtcbiAgICBjb25zdCB3ZWlnaHRzOiBOb2RlW10gPSBbXTtcbiAgICBjb25zdCBpbml0Tm9kZXM6IE5vZGVbXSA9IFtdO1xuICAgIGNvbnN0IG5vZGVzID0gdGZOb2Rlcy5yZWR1Y2U8e1trZXk6IHN0cmluZ106IE5vZGV9PigobWFwLCBub2RlKSA9PiB7XG4gICAgICBtYXBbbm9kZS5uYW1lXSA9IHRoaXMubWFwTm9kZShub2RlKTtcbiAgICAgIGlmIChub2RlLm9wLnN0YXJ0c1dpdGgoJ1BsYWNlaG9sZGVyJykpIHtcbiAgICAgICAgcGxhY2Vob2xkZXJzLnB1c2gobWFwW25vZGUubmFtZV0pO1xuICAgICAgfSBlbHNlIGlmIChub2RlLm9wID09PSAnQ29uc3QnKSB7XG4gICAgICAgIHdlaWdodHMucHVzaChtYXBbbm9kZS5uYW1lXSk7XG4gICAgICB9IGVsc2UgaWYgKG5vZGUuaW5wdXQgPT0gbnVsbCB8fCBub2RlLmlucHV0Lmxlbmd0aCA9PT0gMCkge1xuICAgICAgICBpbml0Tm9kZXMucHVzaChtYXBbbm9kZS5uYW1lXSk7XG4gICAgICB9XG4gICAgICByZXR1cm4gbWFwO1xuICAgIH0sIHt9KTtcblxuICAgIGxldCBpbnB1dHM6IE5vZGVbXSA9IFtdO1xuICAgIGNvbnN0IG91dHB1dHM6IE5vZGVbXSA9IFtdO1xuICAgIGxldCBpbnB1dE5vZGVOYW1lVG9LZXk6IHtba2V5OiBzdHJpbmddOiBzdHJpbmd9ID0ge307XG4gICAgbGV0IG91dHB1dE5vZGVOYW1lVG9LZXk6IHtba2V5OiBzdHJpbmddOiBzdHJpbmd9ID0ge307XG4gICAgaWYgKHNpZ25hdHVyZSAhPSBudWxsKSB7XG4gICAgICBpbnB1dE5vZGVOYW1lVG9LZXkgPSB0aGlzLm1hcFNpZ25hdHVyZUVudHJpZXMoc2lnbmF0dXJlLmlucHV0cyk7XG4gICAgICBvdXRwdXROb2RlTmFtZVRvS2V5ID0gdGhpcy5tYXBTaWduYXR1cmVFbnRyaWVzKHNpZ25hdHVyZS5vdXRwdXRzKTtcbiAgICB9XG4gICAgY29uc3QgYWxsTm9kZXMgPSBPYmplY3Qua2V5cyhub2Rlcyk7XG4gICAgYWxsTm9kZXMuZm9yRWFjaChrZXkgPT4ge1xuICAgICAgY29uc3Qgbm9kZSA9IG5vZGVzW2tleV07XG4gICAgICBub2RlLmlucHV0TmFtZXMuZm9yRWFjaCgobmFtZSwgaW5kZXgpID0+IHtcbiAgICAgICAgY29uc3QgW25vZGVOYW1lLCAsIG91dHB1dE5hbWVdID0gZ2V0Tm9kZU5hbWVBbmRJbmRleChuYW1lKTtcbiAgICAgICAgY29uc3QgaW5wdXROb2RlID0gbm9kZXNbbm9kZU5hbWVdO1xuICAgICAgICBpZiAoaW5wdXROb2RlLm91dHB1dHMgIT0gbnVsbCkge1xuICAgICAgICAgIGNvbnN0IG91dHB1dEluZGV4ID0gaW5wdXROb2RlLm91dHB1dHMuaW5kZXhPZihvdXRwdXROYW1lKTtcbiAgICAgICAgICBpZiAob3V0cHV0SW5kZXggIT09IC0xKSB7XG4gICAgICAgICAgICBjb25zdCBpbnB1dE5hbWUgPSBgJHtub2RlTmFtZX06JHtvdXRwdXRJbmRleH1gO1xuICAgICAgICAgICAgLy8gdXBkYXRlIHRoZSBpbnB1dCBuYW1lIHRvIHVzZSB0aGUgbWFwcGVkIG91dHB1dCBpbmRleCBkaXJlY3RseS5cbiAgICAgICAgICAgIG5vZGUuaW5wdXROYW1lc1tpbmRleF0gPSBpbnB1dE5hbWU7XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIG5vZGUuaW5wdXRzLnB1c2goaW5wdXROb2RlKTtcbiAgICAgICAgaW5wdXROb2RlLmNoaWxkcmVuLnB1c2gobm9kZSk7XG4gICAgICB9KTtcbiAgICB9KTtcblxuICAgIC8vIGlmIHNpZ25hdHVyZSBoYXMgbm90IG91dHB1dHMgc2V0LCBhZGQgYW55IG5vZGUgdGhhdCBkb2VzIG5vdCBoYXZlXG4gICAgLy8gb3V0cHV0cy5cbiAgICBpZiAoT2JqZWN0LmtleXMob3V0cHV0Tm9kZU5hbWVUb0tleSkubGVuZ3RoID09PSAwKSB7XG4gICAgICBhbGxOb2Rlcy5mb3JFYWNoKGtleSA9PiB7XG4gICAgICAgIGNvbnN0IG5vZGUgPSBub2Rlc1trZXldO1xuICAgICAgICBpZiAobm9kZS5jaGlsZHJlbi5sZW5ndGggPT09IDApIHtcbiAgICAgICAgICBvdXRwdXRzLnB1c2gobm9kZSk7XG4gICAgICAgIH1cbiAgICAgIH0pO1xuICAgIH0gZWxzZSB7XG4gICAgICBPYmplY3Qua2V5cyhvdXRwdXROb2RlTmFtZVRvS2V5KS5mb3JFYWNoKG5hbWUgPT4ge1xuICAgICAgICBjb25zdCBbbm9kZU5hbWUsIF0gPSBnZXROb2RlTmFtZUFuZEluZGV4KG5hbWUpO1xuICAgICAgICBjb25zdCBub2RlID0gbm9kZXNbbm9kZU5hbWVdO1xuICAgICAgICBpZiAobm9kZSAhPSBudWxsKSB7XG4gICAgICAgICAgbm9kZS5zaWduYXR1cmVLZXkgPSBvdXRwdXROb2RlTmFtZVRvS2V5W25hbWVdO1xuICAgICAgICAgIG91dHB1dHMucHVzaChub2RlKTtcbiAgICAgICAgfVxuICAgICAgfSk7XG4gICAgfVxuXG4gICAgaWYgKE9iamVjdC5rZXlzKGlucHV0Tm9kZU5hbWVUb0tleSkubGVuZ3RoID4gMCkge1xuICAgICAgT2JqZWN0LmtleXMoaW5wdXROb2RlTmFtZVRvS2V5KS5mb3JFYWNoKG5hbWUgPT4ge1xuICAgICAgICBjb25zdCBbbm9kZU5hbWUsIF0gPSBnZXROb2RlTmFtZUFuZEluZGV4KG5hbWUpO1xuICAgICAgICBjb25zdCBub2RlID0gbm9kZXNbbm9kZU5hbWVdO1xuICAgICAgICBpZiAobm9kZSkge1xuICAgICAgICAgIG5vZGUuc2lnbmF0dXJlS2V5ID0gaW5wdXROb2RlTmFtZVRvS2V5W25hbWVdO1xuICAgICAgICAgIGlucHV0cy5wdXNoKG5vZGUpO1xuICAgICAgICB9XG4gICAgICB9KTtcbiAgICB9IGVsc2Uge1xuICAgICAgaW5wdXRzID0gcGxhY2Vob2xkZXJzO1xuICAgIH1cblxuICAgIGxldCBmdW5jdGlvbnMgPSB7fTtcbiAgICBpZiAoZ3JhcGgubGlicmFyeSAhPSBudWxsICYmIGdyYXBoLmxpYnJhcnkuZnVuY3Rpb24gIT0gbnVsbCkge1xuICAgICAgZnVuY3Rpb25zID0gZ3JhcGgubGlicmFyeS5mdW5jdGlvbi5yZWR1Y2UoKGZ1bmN0aW9ucywgZnVuYykgPT4ge1xuICAgICAgICBmdW5jdGlvbnNbZnVuYy5zaWduYXR1cmUubmFtZV0gPSB0aGlzLm1hcEZ1bmN0aW9uKGZ1bmMpO1xuICAgICAgICByZXR1cm4gZnVuY3Rpb25zO1xuICAgICAgfSwge30gYXMge1trZXk6IHN0cmluZ106IEdyYXBofSk7XG4gICAgfVxuXG4gICAgY29uc3QgcmVzdWx0OiBHcmFwaCA9XG4gICAgICAgIHtub2RlcywgaW5wdXRzLCBvdXRwdXRzLCB3ZWlnaHRzLCBwbGFjZWhvbGRlcnMsIHNpZ25hdHVyZSwgZnVuY3Rpb25zfTtcblxuICAgIGlmIChpbml0Tm9kZXMubGVuZ3RoID4gMCkge1xuICAgICAgcmVzdWx0LmluaXROb2RlcyA9IGluaXROb2RlcztcbiAgICB9XG5cbiAgICByZXR1cm4gcmVzdWx0O1xuICB9XG5cbiAgcHJpdmF0ZSBtYXBTaWduYXR1cmVFbnRyaWVzKGVudHJpZXM6IHtbazogc3RyaW5nXTogdGVuc29yZmxvdy5JVGVuc29ySW5mb30pIHtcbiAgICByZXR1cm4gT2JqZWN0LmtleXMoZW50cmllcyB8fCB7fSlcbiAgICAgICAgLnJlZHVjZTx7W2tleTogc3RyaW5nXTogc3RyaW5nfT4oKHByZXYsIGN1cnIpID0+IHtcbiAgICAgICAgICBwcmV2W2VudHJpZXNbY3Vycl0ubmFtZV0gPSBjdXJyO1xuICAgICAgICAgIHJldHVybiBwcmV2O1xuICAgICAgICB9LCB7fSk7XG4gIH1cblxuICBwcml2YXRlIG1hcE5vZGUobm9kZTogdGVuc29yZmxvdy5JTm9kZURlZik6IE5vZGUge1xuICAgIC8vIFVuc3VwcG9ydGVkIG9wcyB3aWxsIGNhdXNlIGFuIGVycm9yIGF0IHJ1bi10aW1lIChub3QgcGFyc2UgdGltZSksIHNpbmNlXG4gICAgLy8gdGhleSBtYXkgbm90IGJlIHVzZWQgYnkgdGhlIGFjdHVhbCBleGVjdXRpb24gc3ViZ3JhcGguXG4gICAgY29uc3QgbWFwcGVyID1cbiAgICAgICAgZ2V0UmVnaXN0ZXJlZE9wKG5vZGUub3ApIHx8IHRoaXMub3BNYXBwZXJzW25vZGUub3BdIHx8IHt9IGFzIE9wTWFwcGVyO1xuICAgIGlmIChub2RlLmF0dHIgPT0gbnVsbCkge1xuICAgICAgbm9kZS5hdHRyID0ge307XG4gICAgfVxuXG4gICAgY29uc3QgbmV3Tm9kZTogTm9kZSA9IHtcbiAgICAgIG5hbWU6IG5vZGUubmFtZSxcbiAgICAgIG9wOiBub2RlLm9wLFxuICAgICAgY2F0ZWdvcnk6IG1hcHBlci5jYXRlZ29yeSxcbiAgICAgIGlucHV0TmFtZXM6XG4gICAgICAgICAgKG5vZGUuaW5wdXQgfHxcbiAgICAgICAgICAgW10pLm1hcChpbnB1dCA9PiBpbnB1dC5zdGFydHNXaXRoKCdeJykgPyBpbnB1dC5zbGljZSgxKSA6IGlucHV0KSxcbiAgICAgIGlucHV0czogW10sXG4gICAgICBjaGlsZHJlbjogW10sXG4gICAgICBpbnB1dFBhcmFtczoge30sXG4gICAgICBhdHRyUGFyYW1zOiB7fSxcbiAgICAgIHJhd0F0dHJzOiBub2RlLmF0dHIsXG4gICAgICBvdXRwdXRzOiBtYXBwZXIub3V0cHV0c1xuICAgIH07XG5cbiAgICBpZiAobWFwcGVyLmlucHV0cyAhPSBudWxsKSB7XG4gICAgICBuZXdOb2RlLmlucHV0UGFyYW1zID1cbiAgICAgICAgICBtYXBwZXIuaW5wdXRzLnJlZHVjZTx7W2tleTogc3RyaW5nXTogSW5wdXRQYXJhbVZhbHVlfT4oXG4gICAgICAgICAgICAgIChtYXAsIHBhcmFtKSA9PiB7XG4gICAgICAgICAgICAgICAgbWFwW3BhcmFtLm5hbWVdID0ge1xuICAgICAgICAgICAgICAgICAgdHlwZTogcGFyYW0udHlwZSxcbiAgICAgICAgICAgICAgICAgIGlucHV0SW5kZXhTdGFydDogcGFyYW0uc3RhcnQsXG4gICAgICAgICAgICAgICAgICBpbnB1dEluZGV4RW5kOiBwYXJhbS5lbmRcbiAgICAgICAgICAgICAgICB9O1xuICAgICAgICAgICAgICAgIHJldHVybiBtYXA7XG4gICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAgIHt9KTtcbiAgICB9XG4gICAgaWYgKG1hcHBlci5hdHRycyAhPSBudWxsKSB7XG4gICAgICBuZXdOb2RlLmF0dHJQYXJhbXMgPVxuICAgICAgICAgIG1hcHBlci5hdHRycy5yZWR1Y2U8e1trZXk6IHN0cmluZ106IFBhcmFtVmFsdWV9PigobWFwLCBwYXJhbSkgPT4ge1xuICAgICAgICAgICAgY29uc3QgdHlwZSA9IHBhcmFtLnR5cGU7XG4gICAgICAgICAgICBsZXQgdmFsdWUgPSB1bmRlZmluZWQ7XG4gICAgICAgICAgICBzd2l0Y2ggKHBhcmFtLnR5cGUpIHtcbiAgICAgICAgICAgICAgY2FzZSAnc3RyaW5nJzpcbiAgICAgICAgICAgICAgICB2YWx1ZSA9IGdldFN0cmluZ1BhcmFtKFxuICAgICAgICAgICAgICAgICAgICBub2RlLmF0dHIsIHBhcmFtLnRmTmFtZSwgcGFyYW0uZGVmYXVsdFZhbHVlIGFzIHN0cmluZyk7XG5cbiAgICAgICAgICAgICAgICBpZiAodmFsdWUgPT09IHVuZGVmaW5lZCAmJiAhIXBhcmFtLnRmRGVwcmVjYXRlZE5hbWUpIHtcbiAgICAgICAgICAgICAgICAgIHZhbHVlID0gZ2V0U3RyaW5nUGFyYW0oXG4gICAgICAgICAgICAgICAgICAgICAgbm9kZS5hdHRyLCBwYXJhbS50ZkRlcHJlY2F0ZWROYW1lLFxuICAgICAgICAgICAgICAgICAgICAgIHBhcmFtLmRlZmF1bHRWYWx1ZSBhcyBzdHJpbmcpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgICAgY2FzZSAnc3RyaW5nW10nOlxuICAgICAgICAgICAgICAgIHZhbHVlID0gZ2V0U3RyaW5nQXJyYXlQYXJhbShcbiAgICAgICAgICAgICAgICAgICAgbm9kZS5hdHRyLCBwYXJhbS50Zk5hbWUsIHBhcmFtLmRlZmF1bHRWYWx1ZSBhcyBzdHJpbmdbXSk7XG5cbiAgICAgICAgICAgICAgICBpZiAodmFsdWUgPT09IHVuZGVmaW5lZCAmJiAhIXBhcmFtLnRmRGVwcmVjYXRlZE5hbWUpIHtcbiAgICAgICAgICAgICAgICAgIHZhbHVlID0gZ2V0U3RyaW5nQXJyYXlQYXJhbShcbiAgICAgICAgICAgICAgICAgICAgICBub2RlLmF0dHIsIHBhcmFtLnRmRGVwcmVjYXRlZE5hbWUsXG4gICAgICAgICAgICAgICAgICAgICAgcGFyYW0uZGVmYXVsdFZhbHVlIGFzIHN0cmluZ1tdKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICAgIGNhc2UgJ251bWJlcic6XG4gICAgICAgICAgICAgICAgdmFsdWUgPSBnZXROdW1iZXJQYXJhbShcbiAgICAgICAgICAgICAgICAgICAgbm9kZS5hdHRyLCBwYXJhbS50Zk5hbWUsXG4gICAgICAgICAgICAgICAgICAgIChwYXJhbS5kZWZhdWx0VmFsdWUgfHwgMCkgYXMgbnVtYmVyKTtcbiAgICAgICAgICAgICAgICBpZiAodmFsdWUgPT09IHVuZGVmaW5lZCAmJiAhIXBhcmFtLnRmRGVwcmVjYXRlZE5hbWUpIHtcbiAgICAgICAgICAgICAgICAgIHZhbHVlID0gZ2V0TnVtYmVyUGFyYW0oXG4gICAgICAgICAgICAgICAgICAgICAgbm9kZS5hdHRyLCBwYXJhbS50ZkRlcHJlY2F0ZWROYW1lLFxuICAgICAgICAgICAgICAgICAgICAgIHBhcmFtLmRlZmF1bHRWYWx1ZSBhcyBudW1iZXIpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgICAgY2FzZSAnbnVtYmVyW10nOlxuICAgICAgICAgICAgICAgIHZhbHVlID0gZ2V0TnVtZXJpY0FycmF5UGFyYW0oXG4gICAgICAgICAgICAgICAgICAgIG5vZGUuYXR0ciwgcGFyYW0udGZOYW1lLCBwYXJhbS5kZWZhdWx0VmFsdWUgYXMgbnVtYmVyW10pO1xuICAgICAgICAgICAgICAgIGlmICh2YWx1ZSA9PT0gdW5kZWZpbmVkICYmICEhcGFyYW0udGZEZXByZWNhdGVkTmFtZSkge1xuICAgICAgICAgICAgICAgICAgdmFsdWUgPSBnZXROdW1lcmljQXJyYXlQYXJhbShcbiAgICAgICAgICAgICAgICAgICAgICBub2RlLmF0dHIsIHBhcmFtLnRmRGVwcmVjYXRlZE5hbWUsXG4gICAgICAgICAgICAgICAgICAgICAgcGFyYW0uZGVmYXVsdFZhbHVlIGFzIG51bWJlcltdKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICAgIGNhc2UgJ2Jvb2wnOlxuICAgICAgICAgICAgICAgIHZhbHVlID0gZ2V0Qm9vbFBhcmFtKFxuICAgICAgICAgICAgICAgICAgICBub2RlLmF0dHIsIHBhcmFtLnRmTmFtZSwgcGFyYW0uZGVmYXVsdFZhbHVlIGFzIGJvb2xlYW4pO1xuICAgICAgICAgICAgICAgIGlmICh2YWx1ZSA9PT0gdW5kZWZpbmVkICYmICEhcGFyYW0udGZEZXByZWNhdGVkTmFtZSkge1xuICAgICAgICAgICAgICAgICAgdmFsdWUgPSBnZXRCb29sUGFyYW0oXG4gICAgICAgICAgICAgICAgICAgICAgbm9kZS5hdHRyLCBwYXJhbS50ZkRlcHJlY2F0ZWROYW1lLFxuICAgICAgICAgICAgICAgICAgICAgIHBhcmFtLmRlZmF1bHRWYWx1ZSBhcyBib29sZWFuKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICAgIGNhc2UgJ2Jvb2xbXSc6XG4gICAgICAgICAgICAgICAgdmFsdWUgPSBnZXRCb29sQXJyYXlQYXJhbShcbiAgICAgICAgICAgICAgICAgICAgbm9kZS5hdHRyLCBwYXJhbS50Zk5hbWUsIHBhcmFtLmRlZmF1bHRWYWx1ZSBhcyBib29sZWFuW10pO1xuICAgICAgICAgICAgICAgIGlmICh2YWx1ZSA9PT0gdW5kZWZpbmVkICYmICEhcGFyYW0udGZEZXByZWNhdGVkTmFtZSkge1xuICAgICAgICAgICAgICAgICAgdmFsdWUgPSBnZXRCb29sQXJyYXlQYXJhbShcbiAgICAgICAgICAgICAgICAgICAgICBub2RlLmF0dHIsIHBhcmFtLnRmRGVwcmVjYXRlZE5hbWUsXG4gICAgICAgICAgICAgICAgICAgICAgcGFyYW0uZGVmYXVsdFZhbHVlIGFzIGJvb2xlYW5bXSk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgICBjYXNlICdzaGFwZSc6XG4gICAgICAgICAgICAgICAgdmFsdWUgPSBnZXRUZW5zb3JTaGFwZVBhcmFtKFxuICAgICAgICAgICAgICAgICAgICBub2RlLmF0dHIsIHBhcmFtLnRmTmFtZSwgcGFyYW0uZGVmYXVsdFZhbHVlIGFzIG51bWJlcltdKTtcbiAgICAgICAgICAgICAgICBpZiAodmFsdWUgPT09IHVuZGVmaW5lZCAmJiAhIXBhcmFtLnRmRGVwcmVjYXRlZE5hbWUpIHtcbiAgICAgICAgICAgICAgICAgIHZhbHVlID0gZ2V0VGVuc29yU2hhcGVQYXJhbShcbiAgICAgICAgICAgICAgICAgICAgICBub2RlLmF0dHIsIHBhcmFtLnRmRGVwcmVjYXRlZE5hbWUsXG4gICAgICAgICAgICAgICAgICAgICAgcGFyYW0uZGVmYXVsdFZhbHVlIGFzIG51bWJlcltdKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICAgIGNhc2UgJ3NoYXBlW10nOlxuICAgICAgICAgICAgICAgIHZhbHVlID0gZ2V0VGVuc29yU2hhcGVBcnJheVBhcmFtKFxuICAgICAgICAgICAgICAgICAgICBub2RlLmF0dHIsIHBhcmFtLnRmTmFtZSwgcGFyYW0uZGVmYXVsdFZhbHVlIGFzIG51bWJlcltdW10pO1xuICAgICAgICAgICAgICAgIGlmICh2YWx1ZSA9PT0gdW5kZWZpbmVkICYmICEhcGFyYW0udGZEZXByZWNhdGVkTmFtZSkge1xuICAgICAgICAgICAgICAgICAgdmFsdWUgPSBnZXRUZW5zb3JTaGFwZUFycmF5UGFyYW0oXG4gICAgICAgICAgICAgICAgICAgICAgbm9kZS5hdHRyLCBwYXJhbS50ZkRlcHJlY2F0ZWROYW1lLFxuICAgICAgICAgICAgICAgICAgICAgIHBhcmFtLmRlZmF1bHRWYWx1ZSBhcyBudW1iZXJbXVtdKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICAgIGNhc2UgJ2R0eXBlJzpcbiAgICAgICAgICAgICAgICB2YWx1ZSA9IGdldER0eXBlUGFyYW0oXG4gICAgICAgICAgICAgICAgICAgIG5vZGUuYXR0ciwgcGFyYW0udGZOYW1lLCBwYXJhbS5kZWZhdWx0VmFsdWUgYXMgRGF0YVR5cGUpO1xuICAgICAgICAgICAgICAgIGlmICh2YWx1ZSA9PT0gdW5kZWZpbmVkICYmICEhcGFyYW0udGZEZXByZWNhdGVkTmFtZSkge1xuICAgICAgICAgICAgICAgICAgdmFsdWUgPSBnZXREdHlwZVBhcmFtKFxuICAgICAgICAgICAgICAgICAgICAgIG5vZGUuYXR0ciwgcGFyYW0udGZEZXByZWNhdGVkTmFtZSxcbiAgICAgICAgICAgICAgICAgICAgICBwYXJhbS5kZWZhdWx0VmFsdWUgYXMgRGF0YVR5cGUpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgICAgY2FzZSAnZHR5cGVbXSc6XG4gICAgICAgICAgICAgICAgdmFsdWUgPSBnZXREdHlwZUFycmF5UGFyYW0oXG4gICAgICAgICAgICAgICAgICAgIG5vZGUuYXR0ciwgcGFyYW0udGZOYW1lLCBwYXJhbS5kZWZhdWx0VmFsdWUgYXMgRGF0YVR5cGVbXSk7XG4gICAgICAgICAgICAgICAgaWYgKHZhbHVlID09PSB1bmRlZmluZWQgJiYgISFwYXJhbS50ZkRlcHJlY2F0ZWROYW1lKSB7XG4gICAgICAgICAgICAgICAgICB2YWx1ZSA9IGdldER0eXBlQXJyYXlQYXJhbShcbiAgICAgICAgICAgICAgICAgICAgICBub2RlLmF0dHIsIHBhcmFtLnRmRGVwcmVjYXRlZE5hbWUsXG4gICAgICAgICAgICAgICAgICAgICAgcGFyYW0uZGVmYXVsdFZhbHVlIGFzIERhdGFUeXBlW10pO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgICAgY2FzZSAnZnVuYyc6XG4gICAgICAgICAgICAgICAgdmFsdWUgPSBnZXRGdW5jUGFyYW0oXG4gICAgICAgICAgICAgICAgICAgIG5vZGUuYXR0ciwgcGFyYW0udGZOYW1lLCBwYXJhbS5kZWZhdWx0VmFsdWUgYXMgc3RyaW5nKTtcbiAgICAgICAgICAgICAgICBpZiAodmFsdWUgPT09IHVuZGVmaW5lZCAmJiAhIXBhcmFtLnRmRGVwcmVjYXRlZE5hbWUpIHtcbiAgICAgICAgICAgICAgICAgIHZhbHVlID0gZ2V0RnVuY1BhcmFtKFxuICAgICAgICAgICAgICAgICAgICAgIG5vZGUuYXR0ciwgcGFyYW0udGZEZXByZWNhdGVkTmFtZSxcbiAgICAgICAgICAgICAgICAgICAgICBwYXJhbS5kZWZhdWx0VmFsdWUgYXMgc3RyaW5nKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICAgIGNhc2UgJ3RlbnNvcic6XG4gICAgICAgICAgICAgIGNhc2UgJ3RlbnNvcnMnOlxuICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgICBkZWZhdWx0OlxuICAgICAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcihcbiAgICAgICAgICAgICAgICAgICAgYFVuc3VwcG9ydGVkIHBhcmFtIHR5cGU6ICR7cGFyYW0udHlwZX0gZm9yIG9wOiAke25vZGUub3B9YCk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBtYXBbcGFyYW0ubmFtZV0gPSB7dmFsdWUsIHR5cGV9O1xuICAgICAgICAgICAgcmV0dXJuIG1hcDtcbiAgICAgICAgICB9LCB7fSk7XG4gICAgfVxuICAgIHJldHVybiBuZXdOb2RlO1xuICB9XG5cbiAgLy8gbWFwIHRoZSBURnVuY3Rpb25EZWYgdG8gVEZKUyBncmFwaCBvYmplY3RcbiAgcHJpdmF0ZSBtYXBGdW5jdGlvbihmdW5jdGlvbkRlZjogdGVuc29yZmxvdy5JRnVuY3Rpb25EZWYpOiBHcmFwaCB7XG4gICAgY29uc3QgdGZOb2RlcyA9IGZ1bmN0aW9uRGVmLm5vZGVEZWY7XG4gICAgY29uc3QgcGxhY2Vob2xkZXJzOiBOb2RlW10gPSBbXTtcbiAgICBjb25zdCB3ZWlnaHRzOiBOb2RlW10gPSBbXTtcbiAgICBsZXQgbm9kZXM6IHtba2V5OiBzdHJpbmddOiBOb2RlfSA9IHt9O1xuICAgIGlmICh0Zk5vZGVzICE9IG51bGwpIHtcbiAgICAgIG5vZGVzID0gdGZOb2Rlcy5yZWR1Y2U8e1trZXk6IHN0cmluZ106IE5vZGV9PigobWFwLCBub2RlKSA9PiB7XG4gICAgICAgIG1hcFtub2RlLm5hbWVdID0gdGhpcy5tYXBOb2RlKG5vZGUpO1xuICAgICAgICBpZiAobm9kZS5vcCA9PT0gJ0NvbnN0Jykge1xuICAgICAgICAgIHdlaWdodHMucHVzaChtYXBbbm9kZS5uYW1lXSk7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIG1hcDtcbiAgICAgIH0sIHt9KTtcbiAgICB9XG4gICAgY29uc3QgaW5wdXRzOiBOb2RlW10gPSBbXTtcbiAgICBjb25zdCBvdXRwdXRzOiBOb2RlW10gPSBbXTtcblxuICAgIGZ1bmN0aW9uRGVmLnNpZ25hdHVyZS5pbnB1dEFyZy5mb3JFYWNoKGFyZyA9PiB7XG4gICAgICBjb25zdCBbbm9kZU5hbWUsIF0gPSBnZXROb2RlTmFtZUFuZEluZGV4KGFyZy5uYW1lKTtcbiAgICAgIGNvbnN0IG5vZGU6IE5vZGUgPSB7XG4gICAgICAgIG5hbWU6IG5vZGVOYW1lLFxuICAgICAgICBvcDogJ1BsYWNlaG9sZGVyJyxcbiAgICAgICAgaW5wdXRzOiBbXSxcbiAgICAgICAgaW5wdXROYW1lczogW10sXG4gICAgICAgIGNhdGVnb3J5OiAnZ3JhcGgnLFxuICAgICAgICBpbnB1dFBhcmFtczoge30sXG4gICAgICAgIGF0dHJQYXJhbXM6IHtkdHlwZToge3ZhbHVlOiBwYXJzZUR0eXBlUGFyYW0oYXJnLnR5cGUpLCB0eXBlOiAnZHR5cGUnfX0sXG4gICAgICAgIGNoaWxkcmVuOiBbXVxuICAgICAgfTtcbiAgICAgIG5vZGUuc2lnbmF0dXJlS2V5ID0gYXJnLm5hbWU7XG4gICAgICBpbnB1dHMucHVzaChub2RlKTtcbiAgICAgIG5vZGVzW25vZGVOYW1lXSA9IG5vZGU7XG4gICAgfSk7XG5cbiAgICBjb25zdCBhbGxOb2RlcyA9IE9iamVjdC5rZXlzKG5vZGVzKTtcbiAgICBhbGxOb2Rlcy5mb3JFYWNoKGtleSA9PiB7XG4gICAgICBjb25zdCBub2RlID0gbm9kZXNba2V5XTtcbiAgICAgIG5vZGUuaW5wdXROYW1lcy5mb3JFYWNoKChuYW1lLCBpbmRleCkgPT4ge1xuICAgICAgICBjb25zdCBbbm9kZU5hbWUsICwgb3V0cHV0TmFtZV0gPSBnZXROb2RlTmFtZUFuZEluZGV4KG5hbWUpO1xuICAgICAgICBjb25zdCBpbnB1dE5vZGUgPSBub2Rlc1tub2RlTmFtZV07XG4gICAgICAgIGlmIChpbnB1dE5vZGUub3V0cHV0cyAhPSBudWxsKSB7XG4gICAgICAgICAgY29uc3Qgb3V0cHV0SW5kZXggPSBpbnB1dE5vZGUub3V0cHV0cy5pbmRleE9mKG91dHB1dE5hbWUpO1xuICAgICAgICAgIGlmIChvdXRwdXRJbmRleCAhPT0gLTEpIHtcbiAgICAgICAgICAgIGNvbnN0IGlucHV0TmFtZSA9IGAke25vZGVOYW1lfToke291dHB1dEluZGV4fWA7XG4gICAgICAgICAgICAvLyB1cGRhdGUgdGhlIGlucHV0IG5hbWUgdG8gdXNlIHRoZSBtYXBwZWQgb3V0cHV0IGluZGV4IGRpcmVjdGx5LlxuICAgICAgICAgICAgbm9kZS5pbnB1dE5hbWVzW2luZGV4XSA9IGlucHV0TmFtZTtcbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgbm9kZS5pbnB1dHMucHVzaChpbnB1dE5vZGUpO1xuICAgICAgICBpbnB1dE5vZGUuY2hpbGRyZW4ucHVzaChub2RlKTtcbiAgICAgIH0pO1xuICAgIH0pO1xuXG4gICAgY29uc3QgcmV0dXJuTm9kZU1hcCA9IGZ1bmN0aW9uRGVmLnJldDtcblxuICAgIGZ1bmN0aW9uRGVmLnNpZ25hdHVyZS5vdXRwdXRBcmcuZm9yRWFjaChvdXRwdXQgPT4ge1xuICAgICAgY29uc3QgW25vZGVOYW1lLCBpbmRleF0gPSBnZXROb2RlTmFtZUFuZEluZGV4KHJldHVybk5vZGVNYXBbb3V0cHV0Lm5hbWVdKTtcbiAgICAgIGNvbnN0IG5vZGUgPSBub2Rlc1tub2RlTmFtZV07XG4gICAgICBpZiAobm9kZSAhPSBudWxsKSB7XG4gICAgICAgIG5vZGUuZGVmYXVsdE91dHB1dCA9IGluZGV4O1xuICAgICAgICBvdXRwdXRzLnB1c2gobm9kZSk7XG4gICAgICB9XG4gICAgfSk7XG5cbiAgICBjb25zdCBzaWduYXR1cmUgPSB0aGlzLm1hcEFyZ3NUb1NpZ25hdHVyZShmdW5jdGlvbkRlZik7XG4gICAgcmV0dXJuIHtub2RlcywgaW5wdXRzLCBvdXRwdXRzLCB3ZWlnaHRzLCBwbGFjZWhvbGRlcnMsIHNpZ25hdHVyZX07XG4gIH1cblxuICBwcml2YXRlIG1hcEFyZ3NUb1NpZ25hdHVyZShmdW5jdGlvbkRlZjogdGVuc29yZmxvdy5JRnVuY3Rpb25EZWYpOlxuICAgICAgdGVuc29yZmxvdy5JU2lnbmF0dXJlRGVmIHtcbiAgICByZXR1cm4ge1xuICAgICAgbWV0aG9kTmFtZTogZnVuY3Rpb25EZWYuc2lnbmF0dXJlLm5hbWUsXG4gICAgICBpbnB1dHM6IGZ1bmN0aW9uRGVmLnNpZ25hdHVyZS5pbnB1dEFyZy5yZWR1Y2UoXG4gICAgICAgICAgKG1hcCwgYXJnKSA9PiB7XG4gICAgICAgICAgICBtYXBbYXJnLm5hbWVdID0gdGhpcy5tYXBBcmdUb1RlbnNvckluZm8oYXJnKTtcbiAgICAgICAgICAgIHJldHVybiBtYXA7XG4gICAgICAgICAgfSxcbiAgICAgICAgICB7fSBhcyB7W2tleTogc3RyaW5nXTogdGVuc29yZmxvdy5JVGVuc29ySW5mb30pLFxuICAgICAgb3V0cHV0czogZnVuY3Rpb25EZWYuc2lnbmF0dXJlLm91dHB1dEFyZy5yZWR1Y2UoXG4gICAgICAgICAgKG1hcCwgYXJnKSA9PiB7XG4gICAgICAgICAgICBtYXBbYXJnLm5hbWVdID0gdGhpcy5tYXBBcmdUb1RlbnNvckluZm8oYXJnLCBmdW5jdGlvbkRlZi5yZXQpO1xuICAgICAgICAgICAgcmV0dXJuIG1hcDtcbiAgICAgICAgICB9LFxuICAgICAgICAgIHt9IGFzIHtba2V5OiBzdHJpbmddOiB0ZW5zb3JmbG93LklUZW5zb3JJbmZvfSksXG4gICAgfTtcbiAgfVxuXG4gIHByaXZhdGUgbWFwQXJnVG9UZW5zb3JJbmZvKFxuICAgICAgYXJnOiB0ZW5zb3JmbG93Lk9wRGVmLklBcmdEZWYsXG4gICAgICBuYW1lTWFwPzoge1trZXk6IHN0cmluZ106IHN0cmluZ30pOiB0ZW5zb3JmbG93LklUZW5zb3JJbmZvIHtcbiAgICBsZXQgbmFtZSA9IGFyZy5uYW1lO1xuICAgIGlmIChuYW1lTWFwICE9IG51bGwpIHtcbiAgICAgIG5hbWUgPSBuYW1lTWFwW25hbWVdO1xuICAgIH1cbiAgICByZXR1cm4ge25hbWUsIGR0eXBlOiBhcmcudHlwZX07XG4gIH1cbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGRlY29kZUJhc2U2NCh0ZXh0OiBzdHJpbmcpOiBzdHJpbmcge1xuICBjb25zdCBnbG9iYWwgPSBlbnYoKS5nbG9iYWw7XG4gIGlmICh0eXBlb2YgZ2xvYmFsLmF0b2IgIT09ICd1bmRlZmluZWQnKSB7XG4gICAgcmV0dXJuIGdsb2JhbC5hdG9iKHRleHQpO1xuICB9IGVsc2UgaWYgKHR5cGVvZiBCdWZmZXIgIT09ICd1bmRlZmluZWQnKSB7XG4gICAgcmV0dXJuIG5ldyBCdWZmZXIodGV4dCwgJ2Jhc2U2NCcpLnRvU3RyaW5nKCk7XG4gIH0gZWxzZSB7XG4gICAgdGhyb3cgbmV3IEVycm9yKFxuICAgICAgICAnVW5hYmxlIHRvIGRlY29kZSBiYXNlNjQgaW4gdGhpcyBlbnZpcm9ubWVudC4gJyArXG4gICAgICAgICdNaXNzaW5nIGJ1aWx0LWluIGF0b2IoKSBvciBCdWZmZXIoKScpO1xuICB9XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBwYXJzZVN0cmluZ1BhcmFtKHM6IFtdfHN0cmluZywga2VlcENhc2U6IGJvb2xlYW4pOiBzdHJpbmcge1xuICBjb25zdCB2YWx1ZSA9XG4gICAgICBBcnJheS5pc0FycmF5KHMpID8gU3RyaW5nLmZyb21DaGFyQ29kZS5hcHBseShudWxsLCBzKSA6IGRlY29kZUJhc2U2NChzKTtcbiAgcmV0dXJuIGtlZXBDYXNlID8gdmFsdWUgOiB2YWx1ZS50b0xvd2VyQ2FzZSgpO1xufVxuXG5leHBvcnQgZnVuY3Rpb24gZ2V0U3RyaW5nUGFyYW0oXG4gICAgYXR0cnM6IHtba2V5OiBzdHJpbmddOiB0ZW5zb3JmbG93LklBdHRyVmFsdWV9LCBuYW1lOiBzdHJpbmcsIGRlZjogc3RyaW5nLFxuICAgIGtlZXBDYXNlID0gZmFsc2UpOiBzdHJpbmcge1xuICBjb25zdCBwYXJhbSA9IGF0dHJzW25hbWVdO1xuICBpZiAocGFyYW0gIT0gbnVsbCkge1xuICAgIHJldHVybiBwYXJzZVN0cmluZ1BhcmFtKHBhcmFtLnMsIGtlZXBDYXNlKTtcbiAgfVxuICByZXR1cm4gZGVmO1xufVxuXG5leHBvcnQgZnVuY3Rpb24gZ2V0Qm9vbFBhcmFtKFxuICAgIGF0dHJzOiB7W2tleTogc3RyaW5nXTogdGVuc29yZmxvdy5JQXR0clZhbHVlfSwgbmFtZTogc3RyaW5nLFxuICAgIGRlZjogYm9vbGVhbik6IGJvb2xlYW4ge1xuICBjb25zdCBwYXJhbSA9IGF0dHJzW25hbWVdO1xuICByZXR1cm4gcGFyYW0gPyBwYXJhbS5iIDogZGVmO1xufVxuXG5leHBvcnQgZnVuY3Rpb24gZ2V0TnVtYmVyUGFyYW0oXG4gICAgYXR0cnM6IHtba2V5OiBzdHJpbmddOiB0ZW5zb3JmbG93LklBdHRyVmFsdWV9LCBuYW1lOiBzdHJpbmcsXG4gICAgZGVmOiBudW1iZXIpOiBudW1iZXIge1xuICBjb25zdCBwYXJhbSA9IGF0dHJzW25hbWVdIHx8IHt9O1xuICBjb25zdCB2YWx1ZSA9XG4gICAgICBwYXJhbVsnaSddICE9IG51bGwgPyBwYXJhbVsnaSddIDogKHBhcmFtWydmJ10gIT0gbnVsbCA/IHBhcmFtWydmJ10gOiBkZWYpO1xuICByZXR1cm4gKHR5cGVvZiB2YWx1ZSA9PT0gJ251bWJlcicpID8gdmFsdWUgOiBwYXJzZUludCh2YWx1ZSwgMTApO1xufVxuXG5leHBvcnQgZnVuY3Rpb24gcGFyc2VEdHlwZVBhcmFtKHZhbHVlOiBzdHJpbmd8dGVuc29yZmxvdy5EYXRhVHlwZSk6IERhdGFUeXBlIHtcbiAgaWYgKHR5cGVvZiAodmFsdWUpID09PSAnc3RyaW5nJykge1xuICAgIC8vIHRzbGludDpkaXNhYmxlLW5leHQtbGluZTpuby1hbnlcbiAgICB2YWx1ZSA9IHRlbnNvcmZsb3cuRGF0YVR5cGVbdmFsdWUgYXMgYW55XTtcbiAgfVxuICBzd2l0Y2ggKHZhbHVlKSB7XG4gICAgY2FzZSB0ZW5zb3JmbG93LkRhdGFUeXBlLkRUX0ZMT0FUOlxuICAgIGNhc2UgdGVuc29yZmxvdy5EYXRhVHlwZS5EVF9IQUxGOlxuICAgICAgcmV0dXJuICdmbG9hdDMyJztcbiAgICBjYXNlIHRlbnNvcmZsb3cuRGF0YVR5cGUuRFRfSU5UMzI6XG4gICAgY2FzZSB0ZW5zb3JmbG93LkRhdGFUeXBlLkRUX0lOVDY0OlxuICAgIGNhc2UgdGVuc29yZmxvdy5EYXRhVHlwZS5EVF9JTlQ4OlxuICAgIGNhc2UgdGVuc29yZmxvdy5EYXRhVHlwZS5EVF9VSU5UODpcbiAgICAgIHJldHVybiAnaW50MzInO1xuICAgIGNhc2UgdGVuc29yZmxvdy5EYXRhVHlwZS5EVF9CT09MOlxuICAgICAgcmV0dXJuICdib29sJztcbiAgICBjYXNlIHRlbnNvcmZsb3cuRGF0YVR5cGUuRFRfRE9VQkxFOlxuICAgICAgcmV0dXJuICdmbG9hdDMyJztcbiAgICBjYXNlIHRlbnNvcmZsb3cuRGF0YVR5cGUuRFRfU1RSSU5HOlxuICAgICAgcmV0dXJuICdzdHJpbmcnO1xuICAgIGRlZmF1bHQ6XG4gICAgICAvLyBVbmtub3duIGR0eXBlIGVycm9yIHdpbGwgaGFwcGVuIGF0IHJ1bnRpbWUgKGluc3RlYWQgb2YgcGFyc2UgdGltZSksXG4gICAgICAvLyBzaW5jZSB0aGVzZSBub2RlcyBtaWdodCBub3QgYmUgdXNlZCBieSB0aGUgYWN0dWFsIHN1YmdyYXBoIGV4ZWN1dGlvbi5cbiAgICAgIHJldHVybiBudWxsO1xuICB9XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBnZXRGdW5jUGFyYW0oXG4gICAgYXR0cnM6IHtba2V5OiBzdHJpbmddOiB0ZW5zb3JmbG93LklBdHRyVmFsdWV9LCBuYW1lOiBzdHJpbmcsXG4gICAgZGVmOiBzdHJpbmcpOiBzdHJpbmcge1xuICBjb25zdCBwYXJhbSA9IGF0dHJzW25hbWVdO1xuICBpZiAocGFyYW0gJiYgcGFyYW0uZnVuYykge1xuICAgIHJldHVybiBwYXJhbS5mdW5jLm5hbWU7XG4gIH1cbiAgcmV0dXJuIGRlZjtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGdldER0eXBlUGFyYW0oXG4gICAgYXR0cnM6IHtba2V5OiBzdHJpbmddOiB0ZW5zb3JmbG93LklBdHRyVmFsdWV9LCBuYW1lOiBzdHJpbmcsXG4gICAgZGVmOiBEYXRhVHlwZSk6IERhdGFUeXBlIHtcbiAgY29uc3QgcGFyYW0gPSBhdHRyc1tuYW1lXTtcbiAgaWYgKHBhcmFtICYmIHBhcmFtLnR5cGUpIHtcbiAgICByZXR1cm4gcGFyc2VEdHlwZVBhcmFtKHBhcmFtLnR5cGUpO1xuICB9XG4gIHJldHVybiBkZWY7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBnZXREdHlwZUFycmF5UGFyYW0oXG4gICAgYXR0cnM6IHtba2V5OiBzdHJpbmddOiB0ZW5zb3JmbG93LklBdHRyVmFsdWV9LCBuYW1lOiBzdHJpbmcsXG4gICAgZGVmOiBEYXRhVHlwZVtdKTogRGF0YVR5cGVbXSB7XG4gIGNvbnN0IHBhcmFtID0gYXR0cnNbbmFtZV07XG4gIGlmIChwYXJhbSAmJiBwYXJhbS5saXN0ICYmIHBhcmFtLmxpc3QudHlwZSkge1xuICAgIHJldHVybiBwYXJhbS5saXN0LnR5cGUubWFwKHYgPT4gcGFyc2VEdHlwZVBhcmFtKHYpKTtcbiAgfVxuICByZXR1cm4gZGVmO1xufVxuXG5leHBvcnQgZnVuY3Rpb24gcGFyc2VUZW5zb3JTaGFwZVBhcmFtKHNoYXBlOiB0ZW5zb3JmbG93LklUZW5zb3JTaGFwZSk6IG51bWJlcltdfFxuICAgIHVuZGVmaW5lZCB7XG4gIGlmIChzaGFwZS51bmtub3duUmFuaykge1xuICAgIHJldHVybiB1bmRlZmluZWQ7XG4gIH1cbiAgaWYgKHNoYXBlLmRpbSAhPSBudWxsKSB7XG4gICAgcmV0dXJuIHNoYXBlLmRpbS5tYXAoXG4gICAgICAgIGRpbSA9PlxuICAgICAgICAgICAgKHR5cGVvZiBkaW0uc2l6ZSA9PT0gJ251bWJlcicpID8gZGltLnNpemUgOiBwYXJzZUludChkaW0uc2l6ZSwgMTApKTtcbiAgfVxuICByZXR1cm4gW107XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBnZXRUZW5zb3JTaGFwZVBhcmFtKFxuICAgIGF0dHJzOiB7W2tleTogc3RyaW5nXTogdGVuc29yZmxvdy5JQXR0clZhbHVlfSwgbmFtZTogc3RyaW5nLFxuICAgIGRlZj86IG51bWJlcltdKTogbnVtYmVyW118dW5kZWZpbmVkIHtcbiAgY29uc3QgcGFyYW0gPSBhdHRyc1tuYW1lXTtcbiAgaWYgKHBhcmFtICYmIHBhcmFtLnNoYXBlKSB7XG4gICAgcmV0dXJuIHBhcnNlVGVuc29yU2hhcGVQYXJhbShwYXJhbS5zaGFwZSk7XG4gIH1cbiAgcmV0dXJuIGRlZjtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGdldE51bWVyaWNBcnJheVBhcmFtKFxuICAgIGF0dHJzOiB7W2tleTogc3RyaW5nXTogdGVuc29yZmxvdy5JQXR0clZhbHVlfSwgbmFtZTogc3RyaW5nLFxuICAgIGRlZjogbnVtYmVyW10pOiBudW1iZXJbXSB7XG4gIGNvbnN0IHBhcmFtID0gYXR0cnNbbmFtZV07XG4gIGlmIChwYXJhbSkge1xuICAgIHJldHVybiAoKHBhcmFtLmxpc3QuZiAmJiBwYXJhbS5saXN0LmYubGVuZ3RoID8gcGFyYW0ubGlzdC5mIDpcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBhcmFtLmxpc3QuaSkgfHxcbiAgICAgICAgICAgIFtdKVxuICAgICAgICAubWFwKHYgPT4gKHR5cGVvZiB2ID09PSAnbnVtYmVyJykgPyB2IDogcGFyc2VJbnQodiwgMTApKTtcbiAgfVxuICByZXR1cm4gZGVmO1xufVxuXG5leHBvcnQgZnVuY3Rpb24gZ2V0U3RyaW5nQXJyYXlQYXJhbShcbiAgICBhdHRyczoge1trZXk6IHN0cmluZ106IHRlbnNvcmZsb3cuSUF0dHJWYWx1ZX0sIG5hbWU6IHN0cmluZywgZGVmOiBzdHJpbmdbXSxcbiAgICBrZWVwQ2FzZSA9IGZhbHNlKTogc3RyaW5nW10ge1xuICBjb25zdCBwYXJhbSA9IGF0dHJzW25hbWVdO1xuICBpZiAocGFyYW0gJiYgcGFyYW0ubGlzdCAmJiBwYXJhbS5saXN0LnMpIHtcbiAgICByZXR1cm4gcGFyYW0ubGlzdC5zLm1hcCgodikgPT4ge1xuICAgICAgcmV0dXJuIHBhcnNlU3RyaW5nUGFyYW0odiwga2VlcENhc2UpO1xuICAgIH0pO1xuICB9XG4gIHJldHVybiBkZWY7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBnZXRUZW5zb3JTaGFwZUFycmF5UGFyYW0oXG4gICAgYXR0cnM6IHtba2V5OiBzdHJpbmddOiB0ZW5zb3JmbG93LklBdHRyVmFsdWV9LCBuYW1lOiBzdHJpbmcsXG4gICAgZGVmOiBudW1iZXJbXVtdKTogbnVtYmVyW11bXSB7XG4gIGNvbnN0IHBhcmFtID0gYXR0cnNbbmFtZV07XG4gIGlmIChwYXJhbSAmJiBwYXJhbS5saXN0ICYmIHBhcmFtLmxpc3Quc2hhcGUpIHtcbiAgICByZXR1cm4gcGFyYW0ubGlzdC5zaGFwZS5tYXAoKHYpID0+IHtcbiAgICAgIHJldHVybiBwYXJzZVRlbnNvclNoYXBlUGFyYW0odik7XG4gICAgfSk7XG4gIH1cbiAgcmV0dXJuIGRlZjtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGdldEJvb2xBcnJheVBhcmFtKFxuICAgIGF0dHJzOiB7W2tleTogc3RyaW5nXTogdGVuc29yZmxvdy5JQXR0clZhbHVlfSwgbmFtZTogc3RyaW5nLFxuICAgIGRlZjogYm9vbGVhbltdKTogYm9vbGVhbltdIHtcbiAgY29uc3QgcGFyYW0gPSBhdHRyc1tuYW1lXTtcbiAgaWYgKHBhcmFtICYmIHBhcmFtLmxpc3QgJiYgcGFyYW0ubGlzdC5iKSB7XG4gICAgcmV0dXJuIHBhcmFtLmxpc3QuYjtcbiAgfVxuICByZXR1cm4gZGVmO1xufVxuIl19","/**\n * @license\n * Copyright 2019 Google LLC. All Rights Reserved.\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n * =============================================================================\n */\nimport { getTensor } from '../executors/utils';\nimport { getBoolArrayParam, getBoolParam, getDtypeArrayParam, getDtypeParam, getNumberParam, getNumericArrayParam, getStringArrayParam, getStringParam, getTensorShapeArrayParam, getTensorShapeParam } from '../operation_mapper';\n/**\n * Helper class for lookup inputs and params for nodes in the model graph.\n */\nexport class NodeValueImpl {\n constructor(node, tensorMap, context) {\n this.node = node;\n this.tensorMap = tensorMap;\n this.context = context;\n this.inputs = [];\n this.attrs = {};\n this.inputs = node.inputNames.map(name => this.getInput(name));\n if (node.rawAttrs != null) {\n this.attrs = Object.keys(node.rawAttrs)\n .reduce((attrs, key) => {\n attrs[key] = this.getAttr(key);\n return attrs;\n }, {});\n }\n }\n /**\n * Return the value of the attribute or input param.\n * @param name String: name of attribute or input param.\n */\n getInput(name) {\n return getTensor(name, this.tensorMap, this.context);\n }\n /**\n * Return the value of the attribute or input param.\n * @param name String: name of attribute or input param.\n */\n getAttr(name, defaultValue) {\n const value = this.node.rawAttrs[name];\n if (value.tensor != null) {\n return getTensor(name, this.tensorMap, this.context);\n }\n if (value.i != null || value.f != null) {\n return getNumberParam(this.node.rawAttrs, name, defaultValue);\n }\n if (value.s != null) {\n return getStringParam(this.node.rawAttrs, name, defaultValue);\n }\n if (value.b != null) {\n return getBoolParam(this.node.rawAttrs, name, defaultValue);\n }\n if (value.shape != null) {\n return getTensorShapeParam(this.node.rawAttrs, name, defaultValue);\n }\n if (value.type != null) {\n return getDtypeParam(this.node.rawAttrs, name, defaultValue);\n }\n if (value.list != null) {\n if (value.list.i != null || value.list.f != null) {\n return getNumericArrayParam(this.node.rawAttrs, name, defaultValue);\n }\n if (value.list.s != null) {\n return getStringArrayParam(this.node.rawAttrs, name, defaultValue);\n }\n if (value.list.shape != null) {\n return getTensorShapeArrayParam(this.node.rawAttrs, name, defaultValue);\n }\n if (value.list.b != null) {\n return getBoolArrayParam(this.node.rawAttrs, name, defaultValue);\n }\n if (value.list.type != null) {\n return getDtypeArrayParam(this.node.rawAttrs, name, defaultValue);\n }\n }\n return defaultValue;\n }\n}\n//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibm9kZV92YWx1ZV9pbXBsLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vLi4vLi4vdGZqcy1jb252ZXJ0ZXIvc3JjL29wZXJhdGlvbnMvY3VzdG9tX29wL25vZGVfdmFsdWVfaW1wbC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQTs7Ozs7Ozs7Ozs7Ozs7O0dBZUc7QUFNSCxPQUFPLEVBQUMsU0FBUyxFQUFDLE1BQU0sb0JBQW9CLENBQUM7QUFDN0MsT0FBTyxFQUFDLGlCQUFpQixFQUFFLFlBQVksRUFBRSxrQkFBa0IsRUFBRSxhQUFhLEVBQUUsY0FBYyxFQUFFLG9CQUFvQixFQUFFLG1CQUFtQixFQUFFLGNBQWMsRUFBRSx3QkFBd0IsRUFBRSxtQkFBbUIsRUFBQyxNQUFNLHFCQUFxQixDQUFDO0FBR2pPOztHQUVHO0FBQ0gsTUFBTSxPQUFPLGFBQWE7SUFHeEIsWUFDWSxJQUFVLEVBQVUsU0FBMEIsRUFDOUMsT0FBeUI7UUFEekIsU0FBSSxHQUFKLElBQUksQ0FBTTtRQUFVLGNBQVMsR0FBVCxTQUFTLENBQWlCO1FBQzlDLFlBQU8sR0FBUCxPQUFPLENBQWtCO1FBSnJCLFdBQU0sR0FBYSxFQUFFLENBQUM7UUFDdEIsVUFBSyxHQUErQixFQUFFLENBQUM7UUFJckQsSUFBSSxDQUFDLE1BQU0sR0FBRyxJQUFJLENBQUMsVUFBVSxDQUFDLEdBQUcsQ0FBQyxJQUFJLENBQUMsRUFBRSxDQUFDLElBQUksQ0FBQyxRQUFRLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQztRQUMvRCxJQUFJLElBQUksQ0FBQyxRQUFRLElBQUksSUFBSSxFQUFFO1lBQ3pCLElBQUksQ0FBQyxLQUFLLEdBQUcsTUFBTSxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsUUFBUSxDQUFDO2lCQUNyQixNQUFNLENBQUMsQ0FBQyxLQUFpQyxFQUFFLEdBQUcsRUFBRSxFQUFFO2dCQUNqRCxLQUFLLENBQUMsR0FBRyxDQUFDLEdBQUcsSUFBSSxDQUFD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SSxDQUFDLElBQUksQ0FBQyxRQUFRLEVBQUUsSUFBSSxFQUFFLFlBQTBCLENBQUMsQ0FBQzthQUMzRDtTQUNGO1FBRUQsT0FBTyxZQUFZLENBQUM7SUFDdEIsQ0FBQztDQUNGIiwic291cmNlc0NvbnRlbnQiOlsiLyoqXG4gKiBAbGljZW5zZVxuICogQ29weXJpZ2h0IDIwMTkgR29vZ2xlIExMQy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC5cbiAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSBcIkxpY2Vuc2VcIik7XG4gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuXG4gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXRcbiAqXG4gKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjBcbiAqXG4gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlXG4gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiBcIkFTIElTXCIgQkFTSVMsXG4gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC5cbiAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmRcbiAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLlxuICogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbiAqL1xuXG5pbXBvcnQge0RhdGFUeXBlLCBUZW5zb3J9IGZyb20gJ0B0ZW5zb3JmbG93L3RmanMtY29yZSc7XG5cbmltcG9ydCB7TmFtZWRUZW5zb3JzTWFwfSBmcm9tICcuLi8uLi9kYXRhL3R5cGVzJztcbmltcG9ydCB7RXhlY3V0aW9uQ29udGV4dH0gZnJvbSAnLi4vLi4vZXhlY3V0b3IvZXhlY3V0aW9uX2NvbnRleHQnO1xuaW1wb3J0IHtnZXRUZW5zb3J9IGZyb20gJy4uL2V4ZWN1dG9ycy91dGlscyc7XG5pbXBvcnQge2dldEJvb2xBcnJheVBhcmFtLCBnZXRCb29sUGFyYW0sIGdldER0eXBlQXJyYXlQYXJhbSwgZ2V0RHR5cGVQYXJhbSwgZ2V0TnVtYmVyUGFyYW0sIGdldE51bWVyaWNBcnJheVBhcmFtLCBnZXRTdHJpbmdBcnJheVBhcmFtLCBnZXRTdHJpbmdQYXJhbSwgZ2V0VGVuc29yU2hhcGVBcnJheVBhcmFtLCBnZXRUZW5zb3JTaGFwZVBhcmFtfSBmcm9tICcuLi9vcGVyYXRpb25fbWFwcGVyJztcbmltcG9ydCB7R3JhcGhOb2RlLCBOb2RlLCBWYWx1ZVR5cGV9IGZyb20gJy4uL3R5cGVzJztcblxuLyoqXG4gKiBIZWxwZXIgY2xhc3MgZm9yIGxvb2t1cCBpbnB1dHMgYW5kIHBhcmFtcyBmb3Igbm9kZXMgaW4gdGhlIG1vZGVsIGdyYXBoLlxuICovXG5leHBvcnQgY2xhc3MgTm9kZVZhbHVlSW1wbCBpbXBsZW1lbnRzIEdyYXBoTm9kZSB7XG4gIHB1YmxpYyByZWFkb25seSBpbnB1dHM6IFRlbnNvcltdID0gW107XG4gIHB1YmxpYyByZWFkb25seSBhdHRyczoge1trZXk6IHN0cmluZ106IFZhbHVlVHlwZX0gPSB7fTtcbiAgY29uc3RydWN0b3IoXG4gICAgICBwcml2YXRlIG5vZGU6IE5vZGUsIHByaXZhdGUgdGVuc29yTWFwOiBOYW1lZFRlbnNvcnNNYXAsXG4gICAgICBwcml2YXRlIGNvbnRleHQ6IEV4ZWN1dGlvbkNvbnRleHQpIHtcbiAgICB0aGlzLmlucHV0cyA9IG5vZGUuaW5wdXROYW1lcy5tYXAobmFtZSA9PiB0aGlzLmdldElucHV0KG5hbWUpKTtcbiAgICBpZiAobm9kZS5yYXdBdHRycyAhPSBudWxsKSB7XG4gICAgICB0aGlzLmF0dHJzID0gT2JqZWN0LmtleXMobm9kZS5yYXdBdHRycylcbiAgICAgICAgICAgICAgICAgICAgICAgLnJlZHVjZSgoYXR0cnM6IHtba2V5OiBzdHJpbmddOiBWYWx1ZVR5cGV9LCBrZXkpID0+IHtcbiAgICAgICAgICAgICAgICAgICAgICAgICBhdHRyc1trZXldID0gdGhpcy5nZXRBdHRyKGtleSk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGF0dHJzO1xuICAgICAgICAgICAgICAgICAgICAgICB9LCB7fSk7XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIFJldHVybiB0aGUgdmFsdWUgb2YgdGhlIGF0dHJpYnV0ZSBvciBpbnB1dCBwYXJhbS5cbiAgICogQHBhcmFtIG5hbWUgU3RyaW5nOiBuYW1lIG9mIGF0dHJpYnV0ZSBvciBpbnB1dCBwYXJhbS5cbiAgICovXG4gIHByaXZhdGUgZ2V0SW5wdXQobmFtZTogc3RyaW5nKTogVGVuc29yIHtcbiAgICByZXR1cm4gZ2V0VGVuc29yKG5hbWUsIHRoaXMudGVuc29yTWFwLCB0aGlzLmNvbnRleHQpO1xuICB9XG5cbiAgLyoqXG4gICAqIFJldHVybiB0aGUgdmFsdWUgb2YgdGhlIGF0dHJpYnV0ZSBvciBpbnB1dCBwYXJhbS5cbiAgICogQHBhcmFtIG5hbWUgU3RyaW5nOiBuYW1lIG9mIGF0dHJpYnV0ZSBvciBpbnB1dCBwYXJhbS5cbiAgICovXG4gIHByaXZhdGUgZ2V0QXR0cihuYW1lOiBzdHJpbmcsIGRlZmF1bHRWYWx1ZT86IFZhbHVlVHlwZSk6IFZhbHVlVHlwZSB7XG4gICAgY29uc3QgdmFsdWUgPSB0aGlzLm5vZGUucmF3QXR0cnNbbmFtZV07XG4gICAgaWYgKHZhbHVlLnRlbnNvciAhPSBudWxsKSB7XG4gICAgICByZXR1cm4gZ2V0VGVuc29yKG5hbWUsIHRoaXMudGVuc29yTWFwLCB0aGlzLmNvbnRleHQpO1xuICAgIH1cbiAgICBpZiAodmFsdWUuaSAhPSBudWxsIHx8IHZhbHVlLmYgIT0gbnVsbCkge1xuICAgICAgcmV0dXJuIGdldE51bWJlclBhcmFtKHRoaXMubm9kZS5yYXdBdHRycywgbmFtZSwgZGVmYXVsdFZhbHVlIGFzIG51bWJlcik7XG4gICAgfVxuICAgIGlmICh2YWx1ZS5zICE9IG51bGwpIHtcbiAgICAgIHJldHVybiBnZXRTdHJpbmdQYXJhbSh0aGlzLm5vZGUucmF3QXR0cnMsIG5hbWUsIGRlZmF1bHRWYWx1ZSBhcyBzdHJpbmcpO1xuICAgIH1cbiAgICBpZiAodmFsdWUuYiAhPSBudWxsKSB7XG4gICAgICByZXR1cm4gZ2V0Qm9vbFBhcmFtKHRoaXMubm9kZS5yYXdBdHRycywgbmFtZSwgZGVmYXVsdFZhbHVlIGFzIGJvb2xlYW4pO1xuICAgIH1cbiAgICBpZiAodmFsdWUuc2hhcGUgIT0gbnVsbCkge1xuICAgICAgcmV0dXJuIGdldFRlbnNvclNoYXBlUGFyYW0oXG4gICAgICAgICAgdGhpcy5ub2RlLnJhd0F0dHJzLCBuYW1lLCBkZWZhdWx0VmFsdWUgYXMgbnVtYmVyW10pO1xuICAgIH1cbiAgICBpZiAodmFsdWUudHlwZSAhPSBudWxsKSB7XG4gICAgICByZXR1cm4gZ2V0RHR5cGVQYXJhbSh0aGlzLm5vZGUucmF3QXR0cnMsIG5hbWUsIGRlZmF1bHRWYWx1ZSBhcyBEYXRhVHlwZSk7XG4gICAgfVxuICAgIGlmICh2YWx1ZS5saXN0ICE9IG51bGwpIHtcbiAgICAgIGlmICh2YWx1ZS5saXN0LmkgIT0gbnVsbCB8fCB2YWx1ZS5saXN0LmYgIT0gbnVsbCkge1xuICAgICAgICByZXR1cm4gZ2V0TnVtZXJpY0FycmF5UGFyYW0oXG4gICAgICAgICAgICB0aGlzLm5vZGUucmF3QXR0cnMsIG5hbWUsIGRlZmF1bHRWYWx1ZSBhcyBudW1iZXJbXSk7XG4gICAgICB9XG4gICAgICBpZiAodmFsdWUubGlzdC5zICE9IG51bGwpIHtcbiAgICAgICAgcmV0dXJuIGdldFN0cmluZ0FycmF5UGFyYW0oXG4gICAgICAgICAgICB0aGlzLm5vZGUucmF3QXR0cnMsIG5hbWUsIGRlZmF1bHRWYWx1ZSBhcyBzdHJpbmdbXSk7XG4gICAgICB9XG4gICAgICBpZiAodmFsdWUubGlzdC5zaGFwZSAhPSBudWxsKSB7XG4gICAgICAgIHJldHVybiBnZXRUZW5zb3JTaGFwZUFycmF5UGFyYW0oXG4gICAgICAgICAgICB0aGlzLm5vZGUucmF3QXR0cnMsIG5hbWUsIGRlZmF1bHRWYWx1ZSBhcyBudW1iZXJbXVtdKTtcbiAgICAgIH1cbiAgICAgIGlmICh2YWx1ZS5saXN0LmIgIT0gbnVsbCkge1xuICAgICAgICByZXR1cm4gZ2V0Qm9vbEFycmF5UGFyYW0oXG4gICAgICAgICAgICB0aGlzLm5vZGUucmF3QXR0cnMsIG5hbWUsIGRlZmF1bHRWYWx1ZSBhcyBib29sZWFuW10pO1xuICAgICAgfVxuICAgICAgaWYgKHZhbHVlLmxpc3QudHlwZSAhPSBudWxsKSB7XG4gICAgICAgIHJldHVybiBnZXREdHlwZUFycmF5UGFyYW0oXG4gICAgICAgICAgICB0aGlzLm5vZGUucmF3QXR0cnMsIG5hbWUsIGRlZmF1bHRWYWx1ZSBhcyBEYXRhVHlwZVtdKTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICByZXR1cm4gZGVmYXVsdFZhbHVlO1xuICB9XG59XG4iXX0=","/**\n * @license\n * Copyright 2020 Google LLC. All Rights Reserved.\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n * =============================================================================\n */\n/**\n * This differs from util.assertShapesMatch in that it allows values of\n * negative one, an undefined size of a dimensinon, in a shape to match\n * anything.\n */\nimport { util } from '@tensorflow/tfjs-core';\n/**\n * Used by TensorList and TensorArray to verify if elementShape matches, support\n * negative value as the dim shape.\n * @param shapeA\n * @param shapeB\n * @param errorMessagePrefix\n */\nexport function assertShapesMatchAllowUndefinedSize(shapeA, shapeB, errorMessagePrefix = '') {\n // constant shape means unknown rank\n if (typeof shapeA === 'number' || typeof shapeB === 'number') {\n return;\n }\n util.assert(shapeA.length === shapeB.length, () => errorMessagePrefix + ` Shapes ${shapeA} and ${shapeB} must match`);\n for (let i = 0; i < shapeA.length; i++) {\n const dim0 = shapeA[i];\n const dim1 = shapeB[i];\n util.assert(dim0 < 0 || dim1 < 0 || dim0 === dim1, () => errorMessagePrefix + ` Shapes ${shapeA} and ${shapeB} must match`);\n }\n}\nexport function fullDefinedShape(elementShape) {\n if (typeof elementShape === 'number' || elementShape.some(dim => dim < 0)) {\n return false;\n }\n return true;\n}\n/**\n * Generate the output element shape from the list elementShape, list tensors\n * and input param.\n * @param listElementShape\n * @param tensors\n * @param elementShape\n */\nexport function inferElementShape(listElementShape, tensors, elementShape) {\n let partialShape = mergeElementShape(listElementShape, elementShape);\n const notfullDefinedShape = !fullDefinedShape(partialShape);\n if (notfullDefinedShape && tensors.length === 0) {\n throw new Error(`Tried to calculate elements of an empty list` +\n ` with non-fully-defined elementShape: ${partialShape}`);\n }\n if (notfullDefinedShape) {\n tensors.forEach(tensor => {\n partialShape = mergeElementShape(tensor.shape, partialShape);\n });\n }\n if (!fullDefinedShape(partialShape)) {\n throw new Error(`Non-fully-defined elementShape: ${partialShape}`);\n }\n return partialShape;\n}\nexport function mergeElementShape(elementShapeA, elementShapeB) {\n if (typeof elementShapeA === 'number') {\n return elementShapeB;\n }\n if (typeof elementShapeB === 'number') {\n return elementShapeA;\n }\n if (elementShapeA.length !== elementShapeB.length) {\n throw new Error(`Incompatible ranks during merge: ${elementShapeA} vs. ${elementShapeB}`);\n }\n const result = [];\n for (let i = 0; i < elementShapeA.length; ++i) {\n const dim0 = elementShapeA[i];\n const dim1 = elementShapeB[i];\n if (dim0 >= 0 && dim1 >= 0 && dim0 !== dim1) {\n throw new Error(`Incompatible shape during merge: ${elementShapeA} vs. ${elementShapeB}`);\n }\n result[i] = dim0 >= 0 ? dim0 : dim1;\n }\n return result;\n}\n//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidGVuc29yX3V0aWxzLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vLi4vdGZqcy1jb252ZXJ0ZXIvc3JjL2V4ZWN1dG9yL3RlbnNvcl91dGlscy50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFDQTs7Ozs7Ozs7Ozs7Ozs7O0dBZUc7QUFDSDs7OztHQUlHO0FBRUgsT0FBTyxFQUFTLElBQUksRUFBQyxNQUFNLHVCQUF1QixDQUFDO0FBRW5EOzs7Ozs7R0FNRztBQUNILE1BQU0sVUFBVSxtQ0FBbUMsQ0FDL0MsTUFBdUIsRUFBRSxNQUF1QixFQUNoRCxrQkFBa0IsR0FBRyxFQUFFO0lBQ3pCLG9DQUFvQztJQUNwQyxJQUFJLE9BQU8sTUFBTSxLQUFLLFFBQVEsSUFBSSxPQUFPLE1BQU0sS0FBSyxRQUFRLEVBQUU7UUFDNUQsT0FBTztLQUNSO0lBQ0QsSUFBSSxDQUFDLE1BQU0sQ0FDUCxNQUFNLENBQUMsTUFBTSxLQUFLLE1BQU0sQ0FBQyxNQUFNLEVBQy9CLEdBQUcsRUFBRSxDQUFDLGtCQUFrQixHQUFHLFdBQVcsTUFBTSxRQUFRLE1BQU0sYUFBYSxDQUFDLENBQUM7SUFDN0UsS0FBSyxJQUFJLENBQUMsR0FBRyxDQUFDLEVBQUUsQ0FBQyxHQUFHLE1BQU0sQ0FBQyxNQUFNLEVBQUUsQ0FBQyxFQUFFLEVBQUU7UUFDdEMsTUFBTSxJQUFJLEdBQUcsTUFBTSxDQUFDLENBQUMsQ0FBQyxDQUFDO1FBQ3ZCLE1BQU0sSUFBSSxHQUFHLE1BQU0sQ0FBQyxDQUFDLENBQUMsQ0FBQztRQUN2QixJQUFJLENBQUMsTUFBTSxDQUNQLElBQUksR0FBRyxDQUFDLElBQUksSUFBSSxHQUFHLENBQUMsSUFBSSxJQUFJLEtBQUssSUFBSSxFQUNyQyxHQUFHLEVBQUUsQ0FDRCxrQkFBa0IsR0FBRyxXQUFXLE1BQU0sUUFBUSxNQUFNLGFBQWEsQ0FBQyxDQUFDO0tBQzVFO0FBQ0gsQ0FBQztBQUVELE1BQU0sVUFBVSxnQkFBZ0IsQ0FBQyxZQUE2QjtJQUM1RCxJQUFJLE9BQU8sWUFBWSxLQUFLLFFBQVEsSUFBSSxZQUFZLENBQUMsSUFBSSxDQUFDLEdBQUcsQ0FBQyxFQUFFLENBQUMsR0FBRyxHQUFHLENBQUMsQ0FBQyxFQUFFO1FBQ3pFLE9BQU8sS0FBSyxDQUFDO0tBQ2Q7SUFDRCxPQUFPLElBQUksQ0FBQztBQUNkLENBQUM7QUFDRDs7Ozs7O0dBTUc7QUFDSCxNQUFNLFVBQVUsaUJBQWlCLENBQzdCLGdCQUFpQyxFQUFFLE9BQWlCLEVBQ3BELFlBQTZCO0lBQy9CLElBQUksWUFBWSxHQUFHLGlCQUFpQixDQUFDLGdCQUFnQixFQUFFLFlBQVksQ0FBQyxDQUFDO0lBQ3JFLE1BQU0sbUJBQW1CLEdBQUcsQ0FBQyxnQkFBZ0IsQ0FBQyxZQUFZLENBQUMsQ0FBQztJQUM1RCxJQUFJLG1CQUFtQixJQUFJLE9BQU8sQ0FBQyxNQUFNLEtBQUssQ0FBQyxFQUFFO1FBQy9DLE1BQU0sSUFBSSxLQUFLLENBQ1gsOENBQThDO1lBQzlDLHlDQUF5QyxZQUFZLEVBQUUsQ0FBQyxDQUFDO0tBQzlEO0lBQ0QsSUFBSSxtQkFBbUIsRUFBRTtRQUN2QixPQUFPLENBQUMsT0FBTyxDQUFDLE1BQU0sQ0FBQyxFQUFFO1lBQ3ZCLFlBQVksR0FBRyxpQkFBaUIsQ0FBQyxNQUFNLENBQUMsS0FBSyxFQUFFLFlBQVksQ0FBQyxDQUFDO1FBQy9ELENBQUMsQ0FBQyxDQUFDO0tBQ0o7SUFDRCxJQUFJLENBQUMsZ0JBQWdCLENBQUMsWUFBWSxDQUFDLEVBQUU7UUFDbkMsTUFBTSxJQUFJLEtBQUssQ0FBQyxtQ0FBbUMsWUFBWSxFQUFFLENBQUMsQ0FBQztLQUNwRTtJQUNELE9BQU8sWUFBd0IsQ0FBQztBQUNsQyxDQUFDO0FBRUQsTUFBTSxVQUFVLGlCQUFpQixDQUM3QixhQUE4QixFQUFFLGFBQThCO0lBRWhFLElBQUksT0FBTyxhQUFhLEtBQUssUUFBUSxFQUFFO1FBQ3JDLE9BQU8sYUFBYSxDQUFDO0tBQ3RCO0lBQ0QsSUFBSSxPQUFPLGFBQWEsS0FBSyxRQUFRLEVBQUU7UUFDckMsT0FBTyxhQUFhLENBQUM7S0FDdEI7SUFFRCxJQUFJLGFBQWEsQ0FBQyxNQUFNLEtBQUssYUFBYSxDQUFDLE1BQU0sRUFBRTtRQUNqRCxNQUFNLElBQUksS0FBSyxDQUFDLG9DQUFvQyxhQUFhLFFBQzdELGFBQWEsRUFBRSxDQUFDLENBQUM7S0FDdEI7SUFFRCxNQUFNLE1BQU0sR0FBYSxFQUFFLENBQUM7SUFDNUIsS0FBSyxJQUFJLENBQUMsR0FBRyxDQUFDLEVBQUUsQ0FBQyxHQUFHLGFBQWEsQ0FBQyxNQUFNLEVBQUUsRUFBRSxDQUFDLEVBQUU7UUFDN0MsTUFBTSxJQUFJLEdBQUcsYUFBYSxDQUFDLENBQUMsQ0FBQyxDQUFDO1FBQzlCLE1BQU0sSUFBSSxHQUFHLGFBQWEsQ0FBQyxDQUFDLENBQUMsQ0FBQztRQUM5QixJQUFJLElBQUksSUFBSSxDQUFDLElBQUksSUFBSSxJQUFJLENBQUMsSUFBSSxJQUFJLEtBQUssSUFBSSxFQUFFO1lBQzNDLE1BQU0sSUFBSSxLQUFLLENBQUMsb0NBQW9DLGFBQWEsUUFDN0QsYUFBYSxFQUFFLENBQUMsQ0FBQztTQUN0QjtRQUNELE1BQU0sQ0FBQyxDQUFDLENBQUMsR0FBRyxJQUFJLElBQUksQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQztLQUNyQztJQUNELE9BQU8sTUFBTSxDQUFDO0FBQ2hCLENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyJcbi8qKlxuICogQGxpY2Vuc2VcbiAqIENvcHlyaWdodCAyMDIwIEdvb2dsZSBMTEMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuXG4gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgXCJMaWNlbnNlXCIpO1xuICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLlxuICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0XG4gKlxuICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wXG4gKlxuICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZVxuICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gXCJBUyBJU1wiIEJBU0lTLFxuICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuXG4gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kXG4gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS5cbiAqID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4gKi9cbi8qKlxuICogVGhpcyBkaWZmZXJzIGZyb20gdXRpbC5hc3NlcnRTaGFwZXNNYXRjaCBpbiB0aGF0IGl0IGFsbG93cyB2YWx1ZXMgb2ZcbiAqIG5lZ2F0aXZlIG9uZSwgYW4gdW5kZWZpbmVkIHNpemUgb2YgYSBkaW1lbnNpbm9uLCBpbiBhIHNoYXBlIHRvIG1hdGNoXG4gKiBhbnl0aGluZy5cbiAqL1xuXG5pbXBvcnQge1RlbnNvciwgdXRpbH0gZnJvbSAnQHRlbnNvcmZsb3cvdGZqcy1jb3JlJztcblxuLyoqXG4gKiBVc2VkIGJ5IFRlbnNvckxpc3QgYW5kIFRlbnNvckFycmF5IHRvIHZlcmlmeSBpZiBlbGVtZW50U2hhcGUgbWF0Y2hlcywgc3VwcG9ydFxuICogbmVnYXRpdmUgdmFsdWUgYXMgdGhlIGRpbSBzaGFwZS5cbiAqIEBwYXJhbSBzaGFwZUFcbiAqIEBwYXJhbSBzaGFwZUJcbiAqIEBwYXJhbSBlcnJvck1lc3NhZ2VQcmVmaXhcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGFzc2VydFNoYXBlc01hdGNoQWxsb3dVbmRlZmluZWRTaXplKFxuICAgIHNoYXBlQTogbnVtYmVyfG51bWJlcltdLCBzaGFwZUI6IG51bWJlcnxudW1iZXJbXSxcbiAgICBlcnJvck1lc3NhZ2VQcmVmaXggPSAnJyk6IHZvaWQge1xuICAvLyBjb25zdGFudCBzaGFwZSBtZWFucyB1bmtub3duIHJhbmtcbiAgaWYgKHR5cGVvZiBzaGFwZUEgPT09ICdudW1iZXInIHx8IHR5cGVvZiBzaGFwZUIgPT09ICdudW1iZXInKSB7XG4gICAgcmV0dXJuO1xuICB9XG4gIHV0aWwuYXNzZXJ0KFxuICAgICAgc2hhcGVBLmxlbmd0aCA9PT0gc2hhcGVCLmxlbmd0aCxcbiAgICAgICgpID0+IGVycm9yTWVzc2FnZVByZWZpeCArIGAgU2hhcGVzICR7c2hhcGVBfSBhbmQgJHtzaGFwZUJ9IG11c3QgbWF0Y2hgKTtcbiAgZm9yIChsZXQgaSA9IDA7IGkgPCBzaGFwZUEubGVuZ3RoOyBpKyspIHtcbiAgICBjb25zdCBkaW0wID0gc2hhcGVBW2ldO1xuICAgIGNvbnN0IGRpbTEgPSBzaGFwZUJbaV07XG4gICAgdXRpbC5hc3NlcnQoXG4gICAgICAgIGRpbTAgPCAwIHx8IGRpbTEgPCAwIHx8IGRpbTAgPT09IGRpbTEsXG4gICAgICAgICgpID0+XG4gICAgICAgICAgICBlcnJvck1lc3NhZ2VQcmVmaXggKyBgIFNoYXBlcyAke3NoYXBlQX0gYW5kICR7c2hhcGVCfSBtdXN0IG1hdGNoYCk7XG4gIH1cbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGZ1bGxEZWZpbmVkU2hhcGUoZWxlbWVudFNoYXBlOiBudW1iZXJ8bnVtYmVyW10pOiBib29sZWFuIHtcbiAgaWYgKHR5cGVvZiBlbGVtZW50U2hhcGUgPT09ICdudW1iZXInIHx8IGVsZW1lbnRTaGFwZS5zb21lKGRpbSA9PiBkaW0gPCAwKSkge1xuICAgIHJldHVybiBmYWxzZTtcbiAgfVxuICByZXR1cm4gdHJ1ZTtcbn1cbi8qKlxuICogR2VuZXJhdGUgdGhlIG91dHB1dCBlbGVtZW50IHNoYXBlIGZyb20gdGhlIGxpc3QgZWxlbWVudFNoYXBlLCBsaXN0IHRlbnNvcnNcbiAqIGFuZCBpbnB1dCBwYXJhbS5cbiAqIEBwYXJhbSBsaXN0RWxlbWVudFNoYXBlXG4gKiBAcGFyYW0gdGVuc29yc1xuICogQHBhcmFtIGVsZW1lbnRTaGFwZVxuICovXG5leHBvcnQgZnVuY3Rpb24gaW5mZXJFbGVtZW50U2hhcGUoXG4gICAgbGlzdEVsZW1lbnRTaGFwZTogbnVtYmVyfG51bWJlcltdLCB0ZW5zb3JzOiBUZW5zb3JbXSxcbiAgICBlbGVtZW50U2hhcGU6IG51bWJlcnxudW1iZXJbXSk6IG51bWJlcltdIHtcbiAgbGV0IHBhcnRpYWxTaGFwZSA9IG1lcmdlRWxlbWVudFNoYXBlKGxpc3RFbGVtZW50U2hhcGUsIGVsZW1lbnRTaGFwZSk7XG4gIGNvbnN0IG5vdGZ1bGxEZWZpbmVkU2hhcGUgPSAhZnVsbERlZmluZWRTaGFwZShwYXJ0aWFsU2hhcGUpO1xuICBpZiAobm90ZnVsbERlZmluZWRTaGFwZSAmJiB0ZW5zb3JzLmxlbmd0aCA9PT0gMCkge1xuICAgIHRocm93IG5ldyBFcnJvcihcbiAgICAgICAgYFRyaWVkIHRvIGNhbGN1bGF0ZSBlbGVtZW50cyBvZiBhbiBlbXB0eSBsaXN0YCArXG4gICAgICAgIGAgd2l0aCBub24tZnVsbHktZGVmaW5lZCBlbGVtZW50U2hhcGU6ICR7cGFydGlhbFNoYXBlfWApO1xuICB9XG4gIGlmIChub3RmdWxsRGVmaW5lZFNoYXBlKSB7XG4gICAgdGVuc29ycy5mb3JFYWNoKHRlbnNvciA9PiB7XG4gICAgICBwYXJ0aWFsU2hhcGUgPSBtZXJnZUVsZW1lbnRTaGFwZSh0ZW5zb3Iuc2hhcGUsIHBhcnRpYWxTaGFwZSk7XG4gICAgfSk7XG4gIH1cbiAgaWYgKCFmdWxsRGVmaW5lZFNoYXBlKHBhcnRpYWxTaGFwZSkpIHtcbiAgICB0aHJvdyBuZXcgRXJyb3IoYE5vbi1mdWxseS1kZWZpbmVkIGVsZW1lbnRTaGFwZTogJHtwYXJ0aWFsU2hhcGV9YCk7XG4gIH1cbiAgcmV0dXJuIHBhcnRpYWxTaGFwZSBhcyBudW1iZXJbXTtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIG1lcmdlRWxlbWVudFNoYXBlKFxuICAgIGVsZW1lbnRTaGFwZUE6IG51bWJlcnxudW1iZXJbXSwgZWxlbWVudFNoYXBlQjogbnVtYmVyfG51bWJlcltdKTogbnVtYmVyfFxuICAgIG51bWJlcltdIHtcbiAgaWYgKHR5cGVvZiBlbGVtZW50U2hhcGVBID09PSAnbnVtYmVyJykge1xuICAgIHJldHVybiBlbGVtZW50U2hhcGVCO1xuICB9XG4gIGlmICh0eXBlb2YgZWxlbWVudFNoYXBlQiA9PT0gJ251bWJlcicpIHtcbiAgICByZXR1cm4gZWxlbWVudFNoYXBlQTtcbiAgfVxuXG4gIGlmIChlbGVtZW50U2hhcGVBLmxlbmd0aCAhPT0gZWxlbWVudFNoYXBlQi5sZW5ndGgpIHtcbiAgICB0aHJvdyBuZXcgRXJyb3IoYEluY29tcGF0aWJsZSByYW5rcyBkdXJpbmcgbWVyZ2U6ICR7ZWxlbWVudFNoYXBlQX0gdnMuICR7XG4gICAgICAgIGVsZW1lbnRTaGFwZUJ9YCk7XG4gIH1cblxuICBjb25zdCByZXN1bHQ6IG51bWJlcltdID0gW107XG4gIGZvciAobGV0IGkgPSAwOyBpIDwgZWxlbWVudFNoYXBlQS5sZW5ndGg7ICsraSkge1xuICAgIGNvbnN0IGRpbTAgPSBlbGVtZW50U2hhcGVBW2ldO1xuICAgIGNvbnN0IGRpbTEgPSBlbGVtZW50U2hhcGVCW2ldO1xuICAgIGlmIChkaW0wID49IDAgJiYgZGltMSA+PSAwICYmIGRpbTAgIT09IGRpbTEpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcihgSW5jb21wYXRpYmxlIHNoYXBlIGR1cmluZyBtZXJnZTogJHtlbGVtZW50U2hhcGVBfSB2cy4gJHtcbiAgICAgICAgICBlbGVtZW50U2hhcGVCfWApO1xuICAgIH1cbiAgICByZXN1bHRbaV0gPSBkaW0wID49IDAgPyBkaW0wIDogZGltMTtcbiAgfVxuICByZXR1cm4gcmVzdWx0O1xufVxuIl19","/**\n * @license\n * Copyright 2018 Google LLC. All Rights Reserved.\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n * =============================================================================\n */\nimport { concat, keep, reshape, scalar, slice, stack, tensor, tidy, unstack } from '@tensorflow/tfjs-core';\nimport { assertShapesMatchAllowUndefinedSize } from './tensor_utils';\n/**\n * The TensorArray object keeps an array of Tensors. It\n * allows reading from the array and writing to the array.\n */\nexport class TensorArray {\n constructor(name, dtype, maxSize, elementShape, identicalElementShapes, dynamicSize, clearAfterRead) {\n this.name = name;\n this.dtype = dtype;\n this.maxSize = maxSize;\n this.elementShape = elementShape;\n this.identicalElementShapes = identicalElementShapes;\n this.dynamicSize = dynamicSize;\n this.clearAfterRead = clearAfterRead;\n this.tensors = [];\n this.closed_ = false;\n this.idTensor = scalar(0);\n keep(this.idTensor);\n }\n get id() {\n return this.idTensor.id;\n }\n get closed() {\n return this.closed_;\n }\n /**\n * Dispose the tensors and idTensor and mark the TensoryArray as closed.\n */\n clearAndClose(keepIds) {\n this.tensors.forEach(tensor => {\n if (keepIds == null || !keepIds.has(tensor.tensor.id)) {\n tensor.tensor.dispose();\n }\n });\n this.tensors = [];\n this.closed_ = true;\n this.idTensor.dispose();\n }\n size() {\n return this.tensors.length;\n }\n /**\n * Read the value at location index in the TensorArray.\n * @param index Number the index to read from.\n */\n read(index) {\n if (this.closed_) {\n throw new Error(`TensorArray ${this.name} has already been closed.`);\n }\n if (index < 0 || index >= this.size()) {\n throw new Error(`Tried to read from index ${index}, but array size is: ${this.size()}`);\n }\n const tensorWithState = this.tensors[index];\n if (tensorWithState.cleared) {\n throw new Error(`TensorArray ${this.name}: Could not read index ${index} twice because it was cleared after a previous read ` +\n `(perhaps try setting clear_after_read = false?).`);\n }\n if (this.clearAfterRead) {\n tensorWithState.cleared = true;\n }\n tensorWithState.read = true;\n return tensorWithState.tensor;\n }\n /**\n * Helper method to read multiple tensors from the specified indices.\n */\n readMany(indices) {\n return indices.map(index => this.read(index));\n }\n /**\n * Write value into the index of the TensorArray.\n * @param index number the index to write to.\n * @param tensor\n */\n write(index, tensor) {\n if (this.closed_) {\n throw new Error(`TensorArray ${this.name} has already been closed.`);\n }\n if (index < 0 || !this.dynamicSize && index >= this.maxSize) {\n throw new Error(`Tried to write to index ${index}, but array is not resizeable and size is: ${this.maxSize}`);\n }\n const t = this.tensors[index] || {};\n if (tensor.dtype !== this.dtype) {\n throw new Error(`TensorArray ${this.name}: Could not write to TensorArray index ${index},\n because the value dtype is ${tensor.dtype}, but TensorArray dtype is ${this.dtype}.`);\n }\n // Set the shape for the first time write to unknow shape tensor array\n if (this.size() === 0 &&\n (this.elementShape == null || this.elementShape.length === 0)) {\n this.elementShape = tensor.shape;\n }\n assertShapesMatchAllowUndefinedSize(this.elementShape, tensor.shape, `TensorArray ${this.name}: Could not write to TensorArray index ${index}.`);\n if (t.read) {\n throw new Error(`TensorArray ${this.name}: Could not write to TensorArray index ${index}, because it has already been read.`);\n }\n if (t.written) {\n throw new Error(`TensorArray ${this.name}: Could not write to TensorArray index ${index}, because it has already been written.`);\n }\n t.tensor = tensor;\n keep(tensor);\n t.written = true;\n this.tensors[index] = t;\n }\n /**\n * Helper method to write multiple tensors to the specified indices.\n */\n writeMany(indices, tensors) {\n if (indices.length !== tensors.length) {\n throw new Error(`TensorArray ${this.name}: could not write multiple tensors,` +\n `because the index size: ${indices.length} is not the same as tensors size: ${tensors.length}.`);\n }\n indices.forEach((i, index) => this.write(i, tensors[index]));\n }\n /**\n * Return selected values in the TensorArray as a packed Tensor. All of\n * selected values must have been written and their shapes must all match.\n * @param [indices] number[] Optional. Taking values in [0, max_value). If the\n * TensorArray is not dynamic, max_value=size(). If not specified returns\n * all tensors in the original order.\n * @param [dtype]\n */\n gather(indices, dtype) {\n if (!!dtype && dtype !== this.dtype) {\n throw new Error(`TensorArray dtype is ${this.dtype} but gather requested dtype ${dtype}`);\n }\n if (!indices) {\n indices = [];\n for (let i = 0; i < this.size(); i++) {\n indices.push(i);\n }\n }\n else {\n indices = indices.slice(0, this.size());\n }\n if (indices.length === 0) {\n return tensor([], [0].concat(this.elementShape));\n }\n // Read all the PersistentTensors into a vector to keep track of\n // their memory.\n const tensors = this.readMany(indices);\n assertShapesMatchAllowUndefinedSize(this.elementShape, tensors[0].shape, 'TensorArray shape mismatch: ');\n return stack(tensors, 0);\n }\n /**\n * Return the values in the TensorArray as a concatenated Tensor.\n */\n concat(dtype) {\n if (!!dtype && dtype !== this.dtype) {\n throw new Error(`TensorArray dtype is ${this.dtype} but concat requested dtype ${dtype}`);\n }\n if (this.size() === 0) {\n return tensor([], [0].concat(this.elementShape));\n }\n const indices = [];\n for (let i = 0; i < this.size(); i++) {\n indices.push(i);\n }\n // Collect all the tensors from the tensors array.\n const tensors = this.readMany(indices);\n assertShapesMatchAllowUndefinedSize(this.elementShape, tensors[0].shape, `TensorArray shape mismatch: tensor array shape (${this.elementShape}) vs first tensor shape (${tensors[0].shape})`);\n return concat(tensors, 0);\n }\n /**\n * Scatter the values of a Tensor in specific indices of a TensorArray.\n * @param indices nummber[] values in [0, max_value). If the\n * TensorArray is not dynamic, max_value=size().\n * @param tensor Tensor input tensor.\n */\n scatter(indices, tensor) {\n if (tensor.dtype !== this.dtype) {\n throw new Error(`TensorArray dtype is ${this.dtype} but tensor has dtype ${tensor.dtype}`);\n }\n if (indices.length !== tensor.shape[0]) {\n throw new Error(`Expected len(indices) == tensor.shape[0], but saw: ${indices.length} vs. ${tensor.shape[0]}`);\n }\n const maxIndex = Math.max(...indices);\n if (!this.dynamicSize && maxIndex >= this.maxSize) {\n throw new Error(`Max index must be < array size (${maxIndex} vs. ${this.maxSize})`);\n }\n this.writeMany(indices, unstack(tensor, 0));\n }\n /**\n * Split the values of a Tensor into the TensorArray.\n * @param length number[] with the lengths to use when splitting value along\n * its first dimension.\n * @param tensor Tensor, the tensor to split.\n */\n split(length, tensor) {\n if (tensor.dtype !== this.dtype) {\n throw new Error(`TensorArray dtype is ${this.dtype} but tensor has dtype ${tensor.dtype}`);\n }\n let totalLength = 0;\n const cumulativeLengths = length.map(len => {\n totalLength += len;\n return totalLength;\n });\n if (totalLength !== tensor.shape[0]) {\n throw new Error(`Expected sum of lengths to be equal to\n tensor.shape[0], but sum of lengths is\n ${totalLength}, and tensor's shape is: ${tensor.shape}`);\n }\n if (!this.dynamicSize && length.length !== this.maxSize) {\n throw new Error(`TensorArray's size is not equal to the size of lengths (${this.maxSize} vs. ${length.length}), ` +\n 'and the TensorArray is not marked as dynamically resizeable');\n }\n const elementPerRow = totalLength === 0 ? 0 : tensor.size / totalLength;\n const tensors = [];\n tidy(() => {\n tensor = reshape(tensor, [1, totalLength, elementPerRow]);\n for (let i = 0; i < length.length; ++i) {\n const previousLength = (i === 0) ? 0 : cumulativeLengths[i - 1];\n const indices = [0, previousLength, 0];\n const sizes = [1, length[i], elementPerRow];\n tensors[i] = reshape(slice(tensor, indices, sizes), this.elementShape);\n }\n return tensors;\n });\n const indices = [];\n for (let i = 0; i < length.length; i++) {\n indices[i] = i;\n }\n this.writeMany(indices, tensors);\n }\n}\n//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidGVuc29yX2FycmF5LmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vLi4vdGZqcy1jb252ZXJ0ZXIvc3JjL2V4ZWN1dG9yL3RlbnNvcl9hcnJheS50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQTs7Ozs7Ozs7Ozs7Ozs7O0dBZUc7QUFFSCxPQUFPLEVBQUMsTUFBTSxFQUFZLElBQUksRUFBRSxPQUFPLEVBQUUsTUFBTSxFQUFFLEtBQUssRUFBRSxLQUFLLEVBQVUsTUFBTSxFQUFFLElBQUksRUFBRSxPQUFPLEVBQUMsTUFBTSx1QkFBdUIsQ0FBQztBQUUzSCxPQUFPLEVBQUMsbUNBQW1DLEVBQUMsTUFBTSxnQkFBZ0IsQ0FBQztBQVFuRTs7O0dBR0c7QUFDSCxNQUFNLE9BQU8sV0FBVztJQUl0QixZQUNhLElBQVksRUFBVyxLQUFlLEVBQVUsT0FBZSxFQUNoRSxZQUFzQixFQUFXLHNCQUErQixFQUMvRCxXQUFvQixFQUFXLGNBQXVCO1FBRnRELFNBQUksR0FBSixJQUFJLENBQVE7UUFBVyxVQUFLLEdBQUwsS0FBSyxDQUFVO1FBQVUsWUFBTyxHQUFQLE9BQU8sQ0FBUTtRQUNoRSxpQkFBWSxHQUFaLFlBQVksQ0FBVTtRQUFXLDJCQUFzQixHQUF0QixzQkFBc0IsQ0FBUztRQUMvRCxnQkFBVyxHQUFYLFdBQVcsQ0FBUztRQUFXLG1CQUFjLEdBQWQsY0FBYyxDQUFTO1FBTjNELFlBQU8sR0FBc0IsRUFBRSxDQUFDO1FBQ2hDLFlBQU8sR0FBRyxLQUFLLENBQUM7UUFNdEIsSUFBSSxDQUFDLFFBQVEsR0FBRyxNQUFNLENBQUMsQ0FBQyxDQUFDLENBQUM7UUFDMUIsSUFBSSxDQUFDLElBQUksQ0FBQyxRQUFRLENBQUMsQ0FBQztJQUN0QixDQUFDO0lBRUQsSUFBSSxFQUFFO1FBQ0osT0FBTyxJQUFJLENBQUMsUUFBUSxDQUFDLEVBQUUsQ0FBQztJQUMxQixDQUFDO0lBRUQsSUFBSSxNQUFNO1FBQ1IsT0FBTyxJQUFJLENBQUMsT0FBTyxDQUFDO0lBQ3RCLENBQUM7SUFFRDs7T0FFRztJQUNILGFBQWEsQ0FBQyxPQUFxQjtRQUNqQyxJQUFJLENBQUMsT0FBTyxDQUFDLE9BQU8sQ0FBQyxNQUFNLENBQUMsRUFBRTtZQUM1QixJQUFJLE9BQU8sSUFBSSxJQUFJLElBQUksQ0FBQyxPQUFPLENBQUMsR0FBRyxDQUFDLE1BQU0sQ0FBQyxNQUFNLENBQUMsRUFBRSxDQUFDLEVBQUU7Z0JBQ3JELE1BQU0sQ0FBQyxNQUFNLENBQUMsT0FBTyxFQUFFLENBQUM7YUFDekI7UUFDSCxDQUFDLENBQUMsQ0FBQztRQUNILElBQUksQ0FBQyxPQUFPLEdBQUcsRUFBRSxDQUFDO1FBQ2xCLElBQUksQ0FBQyxPQUFPLEdBQUcsSUFBSSxDQUFDO1FBQ3BCLElBQUksQ0FBQyxRQUFRLENBQUMsT0FBTyxFQUFFLENBQUM7SUFDMUIsQ0FBQztJQUVELElBQUk7UUFDRixPQUFPLElBQUksQ0FBQyxPQUFPLENBQUMsTUFBTSxDQUFDO0lBQzdCLENBQUM7SUFFRDs7O09BR0c7SUFDSCxJQUFJLENBQUMsS0FBYTtRQUNoQixJQUFJLElBQUksQ0FBQyxPQUFPLEVBQUU7WUFDaEIsTUFBTSxJQUFJLEtBQUssQ0FBQyxlQUFlLElBQUksQ0FBQyxJQUFJLDJCQUEyQixDQUFDLENBQUM7U0FDdEU7UUFFRCxJQUFJLEtBQUssR0FBRyxDQUFDLElBQUksS0FBSyxJQUFJLElBQUksQ0FBQyxJQUFJLEVBQUUsRUFBRTtZQUNyQyxNQUFNLElBQUksS0FBSyxDQUFDLDRCQUE0QixLQUFLLHdCQUM3QyxJQUFJLENBQUMsSUFBSSxFQUFFLEVBQUUsQ0FBQyxDQUFDO1NBQ3BCO1FBRUQsTUFBTSxlQUFlLEdBQUcsSUFBSSxDQUFDLE9BQU8sQ0FBQyxLQUFLLENBQUMsQ0FBQztRQUM1QyxJQUFJLGVBQWUsQ0FBQyxPQUFPLEVBQUU7WUFDM0IsTUFBTSxJQUFJLEtBQUssQ0FDWCxlQUFlLElBQUksQ0FBQyxJQUFJLDBCQUNwQixLQUFLLHNEQUFzRDtnQkFDL0Qsa0RBQWtELENBQUMsQ0FBQztTQUN6RDtRQUVELElBQUksSUFBSSxDQUFDLGNBQWMsRUFBRTtZQUN2QixlQUFlLENBQUMsT0FBTyxHQUFHLElBQUksQ0FBQztTQUNoQztRQUVELGVBQWUsQ0FBQyxJQUFJLEdBQUcsSUFBSSxDQUFDO1FBQzVCLE9BQU8sZUFBZSxDQUFDLE1BQU0sQ0FBQztJQUNoQyxDQUFDO0lBRUQ7O09BRUc7SUFDSCxRQUFRLENBQUMsT0FBaUI7UUFDeEIsT0FBTyxPQUFPLENBQUMsR0FBRyxDQUFDLEtBQUssQ0FBQyxFQUFFLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDO0lBQ2hELENBQUM7SUFFRDs7OztPQUlHO0lBQ0gsS0FBSyxDQUFDLEtBQWEsRUFBRSxNQUFjO1FBQ2pDLElBQUksSUFBSSxDQUFDLE9BQU8sRUFBRTtZQUNoQixNQUFNLElBQUksS0FBSyxDQUFDLGVBQWUsSUFBSSxDQUFDLElBQUksMkJBQTJCLENBQUMsQ0FBQztTQUN0RTtRQUVELElBQUksS0FBSyxHQUFHLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxXQUFXLElBQUksS0FBSyxJQUFJLElBQUksQ0FBQyxPQUFPLEVBQUU7WUFDM0QsTUFBTSxJQUFJLEtBQUssQ0FBQywyQkFDWixLQUFLLDhDQUE4QyxJQUFJLENBQUMsT0FBTyxFQUFFLENBQUMsQ0FBQztTQUN4RTtRQUVELE1BQU0sQ0FBQyxHQUFHLElBQUksQ0FBQyxPQUFPLENBQUMsS0FBSyxDQUFDLElBQUksRUFBRSxDQUFDO1FBRXBDLElBQUksTUFBTSxDQUFDLEtBQUssS0FBSyxJQUFJLENBQUMsS0FBSyxFQUFFO1lBQy9CLE1BQU0sSUFBSSxLQUFLLENBQUMsZUFDWixJQUFJLENBQUMsSUFBSSwwQ0FBMEMsS0FBSzt1Q0FFeEQsTUFBTSxDQUFDLEtBQUssOEJBQThCLElBQUksQ0FBQyxLQUFLLEdBQUcsQ0FBQyxDQUFDO1NBQzlEO1FBRUQsc0VBQXNFO1FBQ3RFLElBQUksSUFBSSxDQUFDLElBQUksRUFBRSxLQUFLLENBQUM7WUFDakIsQ0FBQyxJQUFJLENBQUMsWUFBWSxJQUFJLElBQUksSUFBSSxJQUFJLENBQUMsWUFBWSxDQUFDLE1BQU0sS0FBSyxDQUFDLENBQUMsRUFBRTtZQUNqRSxJQUFJLENBQUMsWUFBWSxHQUFHLE1BQU0sQ0FBQyxLQUFLLENBQUM7U0FDbEM7UUFFRCxtQ0FBbUMsQ0FDL0IsSUFBSSxDQUFDLFlBQVksRUFBRSxNQUFNLENBQUMsS0FBSyxFQUMvQixlQUFlLElBQUksQ0FBQyxJQUFJLDBDQUNwQixLQUFLLEdBQUcsQ0FBQyxDQUFDO1FBRWxCLElBQUksQ0FBQyxDQUFDLElBQUksRUFBRTtZQUNWLE1BQU0sSUFBSSxLQUFLLENBQ1gsZUFBZSxJQUFJLENBQUMsSUFBSSwwQ0FDcEIsS0FBSyxxQ0FBcUMsQ0FBQyxDQUFDO1NBQ3JEO1FBRUQsSUFBSSxDQUFDLENBQUMsT0FBTyxFQUFFO1lBQ2IsTUFBTSxJQUFJLEtBQUssQ0FDWCxlQUFlLElBQUksQ0FBQyxJQUFJLDBDQUNwQixLQUFLLHdDQUF3QyxDQUFDLENBQUM7U0FDeEQ7UUFFRCxDQUFDLENBQUMsTUFBTSxHQUFHLE1BQU0sQ0FBQztRQUNsQixJQUFJLENBQUMsTUFBTSxDQUFDLENBQUM7UUFDYixDQUFDLENBQUMsT0FBTyxHQUFHLElBQUksQ0FBQztRQUVqQixJQUFJLENBQUMsT0FBTyxDQUFDLEtBQUssQ0FBQyxHQUFHLENBQUMsQ0FBQztJQUMxQixDQUFDO0lBRUQ7O09BRUc7SUFDSCxTQUFTLENBQUMsT0FBaUIsRUFBRSxPQUFpQjtRQUM1QyxJQUFJLE9BQU8sQ0FBQyxNQUFNLEtBQUssT0FBTyxDQUFDLE1BQU0sRUFBRTtZQUNyQyxNQUFNLElBQUksS0FBSyxDQUNYLGVBQWUsSUFBSSxDQUFDLElBQUkscUNBQXFDO2dCQUM3RCwyQkFDSSxPQUFPLENBQUMsTUFBTSxxQ0FDZCxPQUFPLENBQUMsTUFBTSxHQUFHLENBQUMsQ0FBQztTQUM1QjtRQUVELE9BQU8sQ0FBQyxPQUFPLENBQUMsQ0FBQyxDQUFDLEVBQUUsS0FBSyxFQUFFLEVBQUUsQ0FBQyxJQUFJLENBQUMsS0FBSyxDQUFDLENBQUMsRUFBRSxPQUFPLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQyxDQUFDO0lBQy9ELENBQUM7SUFFRDs7Ozs7OztPQU9HO0lBQ0gsTUFBTSxDQUFDLE9BQWtCLEVBQUUsS0FBZ0I7UUFDekMsSUFBSSxDQUFDLENBQUMsS0FBSyxJQUFJLEtBQUssS0FBSyxJQUFJLENBQUMsS0FBSyxFQUFFO1lBQ25DLE1BQU0sSUFBSSxLQUFLLENBQUMsd0JBQ1osSUFBSSxDQUFDLEtBQUssK0JBQStCLEtBQUssRUFBRSxDQUFDLENBQUM7U0FDdkQ7UUFFRCxJQUFJLENBQUMsT0FBTyxFQUFFO1lBQ1osT0FBTyxHQUFHLEVBQUUsQ0FBQztZQUNiLEtBQUssSUFBSSxDQUFDLEdBQUcsQ0FBQyxFQUFFLENBQUMsR0FBRyxJQUFJLENBQUMsSUFBSSxFQUFFLEVBQUUsQ0FBQyxFQUFFLEVBQUU7Z0JBQ3BDLE9BQU8sQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUM7YUFDakI7U0FDRjthQUFNO1lBQ0wsT0FBTyxHQUFHLE9BQU8sQ0FBQyxLQUFLLENBQUMsQ0FBQyxFQUFFLElBQUksQ0FBQyxJQUFJLEVBQUUsQ0FBQyxDQUFDO1NBQ3pDO1FBRUQsSUFBSSxPQUFPLENBQUMsTUFBTSxLQUFLLENBQUMsRUFBRTtZQUN4QixPQUFPLE1BQU0sQ0FBQyxFQUFFLEVBQUUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxNQUFNLENBQUMsSUFBSSxDQUFDLFlBQVksQ0FBQyxDQUFDLENBQUM7U0FDbEQ7UUFFRCxnRUFBZ0U7UUFDaEUsZ0JBQWdCO1FBQ2hCLE1BQU0sT0FBTyxHQUFHLElBQUksQ0FBQyxRQUFRLENBQUMsT0FBTyxDQUFDLENBQUM7UUFFdkMsbUNBQW1DLENBQy9CLElBQUksQ0FBQyxZQUFZLEVBQUUsT0FBTyxDQUFDLENBQUMsQ0FBQyxDQUFDLEtBQUssRUFBRSw4QkFBOEIsQ0FBQyxDQUFDO1FBRXpFLE9BQU8sS0FBSyxDQUFDLE9BQU8sRUFBRSxDQUFDLENBQUMsQ0FBQztJQUMzQixDQUFDO0lBRUQ7O09BRUc7SUFDSCxNQUFNLENBQUMsS0FBZ0I7UUFDckIsSUFBSSxDQUFDLENBQUMsS0FBSyxJQUFJLEtBQUssS0FBSyxJQUFJLENBQUMsS0FBSyxFQUFFO1lBQ25DLE1BQU0sSUFBSSxLQUFLLENBQUMsd0JBQ1osSUFBSSxDQUFDLEtBQUssK0JBQStCLEtBQUssRUFBRSxDQUFDLENBQUM7U0FDdkQ7UUFFRCxJQUFJLElBQUksQ0FBQyxJQUFJLEVBQUUsS0FBSyxDQUFDLEVBQUU7WUFDckIsT0FBTyxNQUFNLENBQUMsRUFBRSxFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUMsTUFBTSxDQUFDLElBQUksQ0FBQyxZQUFZLENBQUMsQ0FBQyxDQUFDO1NBQ2xEO1FBRUQsTUFBTSxPQUFPLEdBQUcsRUFBRSxDQUFDO1FBQ25CLEtBQUssSUFBSSxDQUFDLEdBQUcsQ0FBQyxFQUFFLENBQUMsR0FBRyxJQUFJLENBQUMsSUFBSSxFQUFFLEVBQUUsQ0FBQyxFQUFFLEVBQUU7WUFDcEMsT0FBTyxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsQ0FBQztTQUNqQjtRQUNELGtEQUFrRDtRQUNsRCxNQUFNLE9BQU8sR0FBRyxJQUFJLENBQUMsUUFBUSxDQUFDLE9BQU8sQ0FBQyxDQUFDO1FBRXZDLG1DQUFtQyxDQUMvQixJQUFJLENBQUMsWUFBWSxFQUFFLE9BQU8sQ0FBQyxDQUFDLENBQUMsQ0FBQyxLQUFLLEVBQ25DLG1EQUNJLElBQUksQ0FBQyxZQUFZLDRCQUE0QixPQUFPLENBQUMsQ0FBQyxDQUFDLENBQUMsS0FBSyxHQUFHLENBQUMsQ0FBQztRQUUxRSxPQUFPLE1BQU0sQ0FBQyxPQUFPLEVBQUUsQ0FBQyxDQUFDLENBQUM7SUFDNUIsQ0FBQztJQUVEOzs7OztPQUtHO0lBQ0gsT0FBTyxDQUFDLE9BQWlCLEVBQUUsTUFBYztRQUN2QyxJQUFJLE1BQU0sQ0FBQyxLQUFLLEtBQUssSUFBSSxDQUFDLEtBQUssRUFBRTtZQUMvQixNQUFNLElBQUksS0FBSyxDQUFDLHdCQUNaLElBQUksQ0FBQyxLQUFLLHlCQUF5QixNQUFNLENBQUMsS0FBSyxFQUFFLENBQUMsQ0FBQztTQUN4RDtRQUVELElBQUksT0FBTyxDQUFDLE1BQU0sS0FBSyxNQUFNLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQyxFQUFFO1lBQ3RDLE1BQU0sSUFBSSxLQUFLLENBQUMsc0RBQ1osT0FBTyxDQUFDLE1BQU0sUUFBUSxNQUFNLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQztTQUM5QztRQUVELE1BQU0sUUFBUSxHQUFHLElBQUksQ0FBQyxHQUFHLENBQUMsR0FBRyxPQUFPLENBQUMsQ0FBQztRQUV0QyxJQUFJLENBQUMsSUFBSSxDQUFDLFdBQVcsSUFBSSxRQUFRLElBQUksSUFBSSxDQUFDLE9BQU8sRUFBRTtZQUNqRCxNQUFNLElBQUksS0FBSyxDQUNYLG1DQUFtQyxRQUFRLFNBQVMsSUFBSSxDQUFDLE9BQU8sR0FBRyxDQUFDLENBQUM7U0FDMUU7UUFFRCxJQUFJLENBQUMsU0FBUyxDQUFDLE9BQU8sRUFBRSxPQUFPLENBQUMsTUFBTSxFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUM7SUFDOUMsQ0FBQztJQUVEOzs7OztPQUtHO0lBQ0gsS0FBSyxDQUFDLE1BQWdCLEVBQUUsTUFBYztRQUNwQyxJQUFJLE1BQU0sQ0FBQyxLQUFLLEtBQUssSUFBSSxDQUFDLEtBQUssRUFBRTtZQUMvQixNQUFNLElBQUksS0FBSyxDQUFDLHdCQUNaLElBQUksQ0FBQyxLQUFLLHlCQUF5QixNQUFNLENBQUMsS0FBSyxFQUFFLENBQUMsQ0FBQztTQUN4RDtRQUNELElBQUksV0FBVyxHQUFHLENBQUMsQ0FBQztRQUNwQixNQUFNLGlCQUFpQixHQUFHLE1BQU0sQ0FBQyxHQUFHLENBQUMsR0FBRyxDQUFDLEVBQUU7WUFDekMsV0FBVyxJQUFJLEdBQUcsQ0FBQztZQUNuQixPQUFPLFdBQVcsQ0FBQztRQUNyQixDQUFDLENBQUMsQ0FBQztRQUVILElBQUksV0FBVyxLQUFLLE1BQU0sQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDLEVBQUU7WUFDbkMsTUFBTSxJQUFJLEtBQUssQ0FBQzs7VUFFWixXQUFXLDRCQUE0QixNQUFNLENBQUMsS0FBSyxFQUFFLENBQUMsQ0FBQztTQUM1RDtRQUVELElBQUksQ0FBQyxJQUFJLENBQUMsV0FBVyxJQUFJLE1BQU0sQ0FBQyxNQUFNLEtBQUssSUFBSSxDQUFDLE9BQU8sRUFBRTtZQUN2RCxNQUFNLElBQUksS0FBSyxDQUNYLDJEQUNJLElBQUksQ0FBQyxPQUFPLFFBQVEsTUFBTSxDQUFDLE1BQU0sS0FBSztnQkFDMUMsNkRBQTZELENBQUMsQ0FBQztTQUNwRTtRQUVELE1BQU0sYUFBYSxHQUFHLFdBQVcsS0FBSyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsTUFBTSxDQUFDLElBQUksR0FBRyxXQUFXLENBQUM7UUFDeEUsTUFBTSxPQUFPLEdBQWEsRUFBRSxDQUFDO1FBQzdCLElBQUksQ0FBQyxHQUFHLEVBQUU7WUFDUixNQUFNLEdBQUcsT0FBTyxDQUFDLE1BQU0sRUFBRSxDQUFDLENBQUMsRUFBRSxXQUFXLEVBQUUsYUFBYSxDQUFDLENBQUMsQ0FBQztZQUMxRCxLQUFLLElBQUksQ0FBQyxHQUFHLENBQUMsRUFBRSxDQUFDLEdBQUcsTUFBTSxDQUFDLE1BQU0sRUFBRSxFQUFFLENBQUMsRUFBRTtnQkFDdEMsTUFBTSxjQUFjLEdBQUcsQ0FBQyxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsaUJBQWlCLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDO2dCQUNoRSxNQUFNLE9BQU8sR0FBRyxDQUFDLENBQUMsRUFBRSxjQUFjLEVBQUUsQ0FBQyxDQUFDLENBQUM7Z0JBQ3ZDLE1BQU0sS0FBSyxHQUFHLENBQUMsQ0FBQyxFQUFFLE1BQU0sQ0FBQyxDQUFDLENBQUMsRUFBRSxhQUFhLENBQUMsQ0FBQztnQkFDNUMsT0FBTyxDQUFDLENBQUMsQ0FBQyxHQUFHLE9BQU8sQ0FBQyxLQUFLLENBQUMsTUFBTSxFQUFFLE9BQU8sRUFBRSxLQUFLLENBQUMsRUFBRSxJQUFJLENBQUMsWUFBWSxDQUFDLENBQUM7YUFDeEU7WUFDRCxPQUFPLE9BQU8sQ0FBQztRQUNqQixDQUFDLENBQUMsQ0FBQztRQUNILE1BQU0sT0FBTyxHQUFHLEVBQUUsQ0FBQztRQUNuQixLQUFLLElBQUksQ0FBQyxHQUFHLENBQUMsRUFBRSxDQUFDLEdBQUcsTUFBTSxDQUFDLE1BQU0sRUFBRSxDQUFDLEVBQUUsRUFBRTtZQUN0QyxPQUFPLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDO1NBQ2hCO1FBQ0QsSUFBSSxDQUFDLFNBQVMsQ0FBQyxPQUFPLEVBQUUsT0FBTyxDQUFDLENBQUM7SUFDbkMsQ0FBQztDQUNGIiwic291cmNlc0NvbnRlbnQiOlsiLyoqXG4gKiBAbGljZW5zZVxuICogQ29weXJpZ2h0IDIwMTggR29vZ2xlIExMQy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC5cbiAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSBcIkxpY2Vuc2VcIik7XG4gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuXG4gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXRcbiAqXG4gKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjBcbiAqXG4gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlXG4gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiBcIkFTIElTXCIgQkFTSVMsXG4gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC5cbiAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmRcbiAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLlxuICogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbiAqL1xuXG5pbXBvcnQge2NvbmNhdCwgRGF0YVR5cGUsIGtlZXAsIHJlc2hhcGUsIHNjYWxhciwgc2xpY2UsIHN0YWNrLCBUZW5zb3IsIHRlbnNvciwgdGlkeSwgdW5zdGFja30gZnJvbSAnQHRlbnNvcmZsb3cvdGZqcy1jb3JlJztcblxuaW1wb3J0IHthc3NlcnRTaGFwZXNNYXRjaEFsbG93VW5kZWZpbmVkU2l6ZX0gZnJvbSAnLi90ZW5zb3JfdXRpbHMnO1xuXG5leHBvcnQgaW50ZXJmYWNlIFRlbnNvcldpdGhTdGF0ZSB7XG4gIHRlbnNvcj86IFRlbnNvcjtcbiAgd3JpdHRlbj86IGJvb2xlYW47XG4gIHJlYWQ/OiBib29sZWFuO1xuICBjbGVhcmVkPzogYm9vbGVhbjtcbn1cbi8qKlxuICogVGhlIFRlbnNvckFycmF5IG9iamVjdCBrZWVwcyBhbiBhcnJheSBvZiBUZW5zb3JzLiAgSXRcbiAqIGFsbG93cyByZWFkaW5nIGZyb20gdGhlIGFycmF5IGFuZCB3cml0aW5nIHRvIHRoZSBhcnJheS5cbiAqL1xuZXhwb3J0IGNsYXNzIFRlbnNvckFycmF5IHtcbiAgcHJpdmF0ZSB0ZW5zb3JzOiBUZW5zb3JXaXRoU3RhdGVbXSA9IFtdO1xuICBwcml2YXRlIGNsb3NlZF8gPSBmYWxzZTtcbiAgcmVhZG9ubHkgaWRUZW5zb3I6IFRlbnNvcjtcbiAgY29uc3RydWN0b3IoXG4gICAgICByZWFkb25seSBuYW1lOiBzdHJpbmcsIHJlYWRvbmx5IGR0eXBlOiBEYXRhVHlwZSwgcHJpdmF0ZSBtYXhTaXplOiBudW1iZXIsXG4gICAgICBwcml2YXRlIGVsZW1lbnRTaGFwZTogbnVtYmVyW10sIHJlYWRvbmx5IGlkZW50aWNhbEVsZW1lbnRTaGFwZXM6IGJvb2xlYW4sXG4gICAgICByZWFkb25seSBkeW5hbWljU2l6ZTogYm9vbGVhbiwgcmVhZG9ubHkgY2xlYXJBZnRlclJlYWQ6IGJvb2xlYW4pIHtcbiAgICB0aGlzLmlkVGVuc29yID0gc2NhbGFyKDApO1xuICAgIGtlZXAodGhpcy5pZFRlbnNvcik7XG4gIH1cblxuICBnZXQgaWQoKSB7XG4gICAgcmV0dXJuIHRoaXMuaWRUZW5zb3IuaWQ7XG4gIH1cblxuICBnZXQgY2xvc2VkKCkge1xuICAgIHJldHVybiB0aGlzLmNsb3NlZF87XG4gIH1cblxuICAvKipcbiAgICogRGlzcG9zZSB0aGUgdGVuc29ycyBhbmQgaWRUZW5zb3IgYW5kIG1hcmsgdGhlIFRlbnNvcnlBcnJheSBhcyBjbG9zZWQuXG4gICAqL1xuICBjbGVhckFuZENsb3NlKGtlZXBJZHM/OiBTZXQ8bnVtYmVyPikge1xuICAgIHRoaXMudGVuc29ycy5mb3JFYWNoKHRlbnNvciA9PiB7XG4gICAgICBpZiAoa2VlcElkcyA9PSBudWxsIHx8ICFrZWVwSWRzLmhhcyh0ZW5zb3IudGVuc29yLmlkKSkge1xuICAgICAgICB0ZW5zb3IudGVuc29yLmRpc3Bvc2UoKTtcbiAgICAgIH1cbiAgICB9KTtcbiAgICB0aGlzLnRlbnNvcnMgPSBbXTtcbiAgICB0aGlzLmNsb3NlZF8gPSB0cnVlO1xuICAgIHRoaXMuaWRUZW5zb3IuZGlzcG9zZSgpO1xuICB9XG5cbiAgc2l6ZSgpOiBudW1iZXIge1xuICAgIHJldHVybiB0aGlzLnRlbnNvcnMubGVuZ3RoO1xuICB9XG5cbiAgLyoqXG4gICAqIFJlYWQgdGhlIHZhbHVlIGF0IGxvY2F0aW9uIGluZGV4IGluIHRoZSBUZW5zb3JBcnJheS5cbiAgICogQHBhcmFtIGluZGV4IE51bWJlciB0aGUgaW5kZXggdG8gcmVhZCBmcm9tLlxuICAgKi9cbiAgcmVhZChpbmRleDogbnVtYmVyKTogVGVuc29yIHtcbiAgICBpZiAodGhpcy5jbG9zZWRfKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoYFRlbnNvckFycmF5ICR7dGhpcy5uYW1lfSBoYXMgYWxyZWFkeSBiZWVuIGNsb3NlZC5gKTtcbiAgICB9XG5cbiAgICBpZiAoaW5kZXggPCAwIHx8IGluZGV4ID49IHRoaXMuc2l6ZSgpKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoYFRyaWVkIHRvIHJlYWQgZnJvbSBpbmRleCAke2luZGV4fSwgYnV0IGFycmF5IHNpemUgaXM6ICR7XG4gICAgICAgICAgdGhpcy5zaXplKCl9YCk7XG4gICAgfVxuXG4gICAgY29uc3QgdGVuc29yV2l0aFN0YXRlID0gdGhpcy50ZW5zb3JzW2luZGV4XTtcbiAgICBpZiAodGVuc29yV2l0aFN0YXRlLmNsZWFyZWQpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcihcbiAgICAgICAgICBgVGVuc29yQXJyYXkgJHt0aGlzLm5hbWV9OiBDb3VsZCBub3QgcmVhZCBpbmRleCAke1xuICAgICAgICAgICAgICBpbmRleH0gdHdpY2UgYmVjYXVzZSBpdCB3YXMgY2xlYXJlZCBhZnRlciBhIHByZXZpb3VzIHJlYWQgYCArXG4gICAgICAgICAgYChwZXJoYXBzIHRyeSBzZXR0aW5nIGNsZWFyX2FmdGVyX3JlYWQgPSBmYWxzZT8pLmApO1xuICAgIH1cblxuICAgIGlmICh0aGlzLmNsZWFyQWZ0ZXJSZWFkKSB7XG4gICAgICB0ZW5zb3JXaXRoU3RhdGUuY2xlYXJlZCA9IHRydWU7XG4gICAgfVxuXG4gICAgdGVuc29yV2l0aFN0YXRlLnJlYWQgPSB0cnVlO1xuICAgIHJldHVybiB0ZW5zb3JXaXRoU3RhdGUudGVuc29yO1xuICB9XG5cbiAgLyoqXG4gICAqIEhlbHBlciBtZXRob2QgdG8gcmVhZCBtdWx0aXBsZSB0ZW5zb3JzIGZyb20gdGhlIHNwZWNpZmllZCBpbmRpY2VzLlxuICAgKi9cbiAgcmVhZE1hbnkoaW5kaWNlczogbnVtYmVyW10pOiBUZW5zb3JbXSB7XG4gICAgcmV0dXJuIGluZGljZXMubWFwKGluZGV4ID0+IHRoaXMucmVhZChpbmRleCkpO1xuICB9XG5cbiAgLyoqXG4gICAqIFdyaXRlIHZhbHVlIGludG8gdGhlIGluZGV4IG9mIHRoZSBUZW5zb3JBcnJheS5cbiAgICogQHBhcmFtIGluZGV4IG51bWJlciB0aGUgaW5kZXggdG8gd3JpdGUgdG8uXG4gICAqIEBwYXJhbSB0ZW5zb3JcbiAgICovXG4gIHdyaXRlKGluZGV4OiBudW1iZXIsIHRlbnNvcjogVGVuc29yKSB7XG4gICAgaWYgKHRoaXMuY2xvc2VkXykge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKGBUZW5zb3JBcnJheSAke3RoaXMubmFtZX0gaGFzIGFscmVhZHkgYmVlbiBjbG9zZWQuYCk7XG4gICAgfVxuXG4gICAgaWYgKGluZGV4IDwgMCB8fCAhdGhpcy5keW5hbWljU2l6ZSAmJiBpbmRleCA+PSB0aGlzLm1heFNpemUpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcihgVHJpZWQgdG8gd3JpdGUgdG8gaW5kZXggJHtcbiAgICAgICAgICBpbmRleH0sIGJ1dCBhcnJheSBpcyBub3QgcmVzaXplYWJsZSBhbmQgc2l6ZSBpczogJHt0aGlzLm1heFNpemV9YCk7XG4gICAgfVxuXG4gICAgY29uc3QgdCA9IHRoaXMudGVuc29yc1tpbmRleF0gfHwge307XG5cbiAgICBpZiAodGVuc29yLmR0eXBlICE9PSB0aGlzLmR0eXBlKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoYFRlbnNvckFycmF5ICR7XG4gICAgICAgICAgdGhpcy5uYW1lfTogQ291bGQgbm90IHdyaXRlIHRvIFRlbnNvckFycmF5IGluZGV4ICR7aW5kZXh9LFxuICAgICAgICAgIGJlY2F1c2UgdGhlIHZhbHVlIGR0eXBlIGlzICR7XG4gICAgICAgICAgdGVuc29yLmR0eXBlfSwgYnV0IFRlbnNvckFycmF5IGR0eXBlIGlzICR7dGhpcy5kdHlwZX0uYCk7XG4gICAgfVxuXG4gICAgLy8gU2V0IHRoZSBzaGFwZSBmb3IgdGhlIGZpcnN0IHRpbWUgd3JpdGUgdG8gdW5rbm93IHNoYXBlIHRlbnNvciBhcnJheVxuICAgIGlmICh0aGlzLnNpemUoKSA9PT0gMCAmJlxuICAgICAgICAodGhpcy5lbGVtZW50U2hhcGUgPT0gbnVsbCB8fCB0aGlzLmVsZW1lbnRTaGFwZS5sZW5ndGggPT09IDApKSB7XG4gICAgICB0aGlzLmVsZW1lbnRTaGFwZSA9IHRlbnNvci5zaGFwZTtcbiAgICB9XG5cbiAgICBhc3NlcnRTaGFwZXNNYXRjaEFsbG93VW5kZWZpbmVkU2l6ZShcbiAgICAgICAgdGhpcy5lbGVtZW50U2hhcGUsIHRlbnNvci5zaGFwZSxcbiAgICAgICAgYFRlbnNvckFycmF5ICR7dGhpcy5uYW1lfTogQ291bGQgbm90IHdyaXRlIHRvIFRlbnNvckFycmF5IGluZGV4ICR7XG4gICAgICAgICAgICBpbmRleH0uYCk7XG5cbiAgICBpZiAodC5yZWFkKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoXG4gICAgICAgICAgYFRlbnNvckFycmF5ICR7dGhpcy5uYW1lfTogQ291bGQgbm90IHdyaXRlIHRvIFRlbnNvckFycmF5IGluZGV4ICR7XG4gICAgICAgICAgICAgIGluZGV4fSwgYmVjYXVzZSBpdCBoYXMgYWxyZWFkeSBiZWVuIHJlYWQuYCk7XG4gICAgfVxuXG4gICAgaWYgKHQud3JpdHRlbikge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKFxuICAgICAgICAgIGBUZW5zb3JBcnJheSAke3RoaXMubmFtZX06IENvdWxkIG5vdCB3cml0ZSB0byBUZW5zb3JBcnJheSBpbmRleCAke1xuICAgICAgICAgICAgICBpbmRleH0sIGJlY2F1c2UgaXQgaGFzIGFscmVhZHkgYmVlbiB3cml0dGVuLmApO1xuICAgIH1cblxuICAgIHQudGVuc29yID0gdGVuc29yO1xuICAgIGtlZXAodGVuc29yKTtcbiAgICB0LndyaXR0ZW4gPSB0cnVlO1xuXG4gICAgdGhpcy50ZW5zb3JzW2luZGV4XSA9IHQ7XG4gIH1cblxuICAvKipcbiAgICogSGVscGVyIG1ldGhvZCB0byB3cml0ZSBtdWx0aXBsZSB0ZW5zb3JzIHRvIHRoZSBzcGVjaWZpZWQgaW5kaWNlcy5cbiAgICovXG4gIHdyaXRlTWFueShpbmRpY2VzOiBudW1iZXJbXSwgdGVuc29yczogVGVuc29yW10pIHtcbiAgICBpZiAoaW5kaWNlcy5sZW5ndGggIT09IHRlbnNvcnMubGVuZ3RoKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoXG4gICAgICAgICAgYFRlbnNvckFycmF5ICR7dGhpcy5uYW1lfTogY291bGQgbm90IHdyaXRlIG11bHRpcGxlIHRlbnNvcnMsYCArXG4gICAgICAgICAgYGJlY2F1c2UgdGhlIGluZGV4IHNpemU6ICR7XG4gICAgICAgICAgICAgIGluZGljZXMubGVuZ3RofSBpcyBub3QgdGhlIHNhbWUgYXMgdGVuc29ycyBzaXplOiAke1xuICAgICAgICAgICAgICB0ZW5zb3JzLmxlbmd0aH0uYCk7XG4gICAgfVxuXG4gICAgaW5kaWNlcy5mb3JFYWNoKChpLCBpbmRleCkgPT4gdGhpcy53cml0ZShpLCB0ZW5zb3JzW2luZGV4XSkpO1xuICB9XG5cbiAgLyoqXG4gICAqIFJldHVybiBzZWxlY3RlZCB2YWx1ZXMgaW4gdGhlIFRlbnNvckFycmF5IGFzIGEgcGFja2VkIFRlbnNvci4gQWxsIG9mXG4gICAqIHNlbGVjdGVkIHZhbHVlcyBtdXN0IGhhdmUgYmVlbiB3cml0dGVuIGFuZCB0aGVpciBzaGFwZXMgbXVzdCBhbGwgbWF0Y2guXG4gICAqIEBwYXJhbSBbaW5kaWNlc10gbnVtYmVyW10gT3B0aW9uYWwuIFRha2luZyB2YWx1ZXMgaW4gWzAsIG1heF92YWx1ZSkuIElmIHRoZVxuICAgKiAgICBUZW5zb3JBcnJheSBpcyBub3QgZHluYW1pYywgbWF4X3ZhbHVlPXNpemUoKS4gSWYgbm90IHNwZWNpZmllZCByZXR1cm5zXG4gICAqICAgIGFsbCB0ZW5zb3JzIGluIHRoZSBvcmlnaW5hbCBvcmRlci5cbiAgICogQHBhcmFtIFtkdHlwZV1cbiAgICovXG4gIGdhdGhlcihpbmRpY2VzPzogbnVtYmVyW10sIGR0eXBlPzogRGF0YVR5cGUpOiBUZW5zb3Ige1xuICAgIGlmICghIWR0eXBlICYmIGR0eXBlICE9PSB0aGlzLmR0eXBlKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoYFRlbnNvckFycmF5IGR0eXBlIGlzICR7XG4gICAgICAgICAgdGhpcy5kdHlwZX0gYnV0IGdhdGhlciByZXF1ZXN0ZWQgZHR5cGUgJHtkdHlwZX1gKTtcbiAgICB9XG5cbiAgICBpZiAoIWluZGljZXMpIHtcbiAgICAgIGluZGljZXMgPSBbXTtcbiAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgdGhpcy5zaXplKCk7IGkrKykge1xuICAgICAgICBpbmRpY2VzLnB1c2goaSk7XG4gICAgICB9XG4gICAgfSBlbHNlIHtcbiAgICAgIGluZGljZXMgPSBpbmRpY2VzLnNsaWNlKDAsIHRoaXMuc2l6ZSgpKTtcbiAgICB9XG5cbiAgICBpZiAoaW5kaWNlcy5sZW5ndGggPT09IDApIHtcbiAgICAgIHJldHVybiB0ZW5zb3IoW10sIFswXS5jb25jYXQodGhpcy5lbGVtZW50U2hhcGUpKTtcbiAgICB9XG5cbiAgICAvLyBSZWFkIGFsbCB0aGUgUGVyc2lzdGVudFRlbnNvcnMgaW50byBhIHZlY3RvciB0byBrZWVwIHRyYWNrIG9mXG4gICAgLy8gdGhlaXIgbWVtb3J5LlxuICAgIGNvbnN0IHRlbnNvcnMgPSB0aGlzLnJlYWRNYW55KGluZGljZXMpO1xuXG4gICAgYXNzZXJ0U2hhcGVzTWF0Y2hBbGxvd1VuZGVmaW5lZFNpemUoXG4gICAgICAgIHRoaXMuZWxlbWVudFNoYXBlLCB0ZW5zb3JzWzBdLnNoYXBlLCAnVGVuc29yQXJyYXkgc2hhcGUgbWlzbWF0Y2g6ICcpO1xuXG4gICAgcmV0dXJuIHN0YWNrKHRlbnNvcnMsIDApO1xuICB9XG5cbiAgLyoqXG4gICAqIFJldHVybiB0aGUgdmFsdWVzIGluIHRoZSBUZW5zb3JBcnJheSBhcyBhIGNvbmNhdGVuYXRlZCBUZW5zb3IuXG4gICAqL1xuICBjb25jYXQoZHR5cGU/OiBEYXRhVHlwZSk6IFRlbnNvciB7XG4gICAgaWYgKCEhZHR5cGUgJiYgZHR5cGUgIT09IHRoaXMuZHR5cGUpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcihgVGVuc29yQXJyYXkgZHR5cGUgaXMgJHtcbiAgICAgICAgICB0aGlzLmR0eXBlfSBidXQgY29uY2F0IHJlcXVlc3RlZCBkdHlwZSAke2R0eXBlfWApO1xuICAgIH1cblxuICAgIGlmICh0aGlzLnNpemUoKSA9PT0gMCkge1xuICAgICAgcmV0dXJuIHRlbnNvcihbXSwgWzBdLmNvbmNhdCh0aGlzLmVsZW1lbnRTaGFwZSkpO1xuICAgIH1cblxuICAgIGNvbnN0IGluZGljZXMgPSBbXTtcbiAgICBmb3IgKGxldCBpID0gMDsgaSA8IHRoaXMuc2l6ZSgpOyBpKyspIHtcbiAgICAgIGluZGljZXMucHVzaChpKTtcbiAgICB9XG4gICAgLy8gQ29sbGVjdCBhbGwgdGhlIHRlbnNvcnMgZnJvbSB0aGUgdGVuc29ycyBhcnJheS5cbiAgICBjb25zdCB0ZW5zb3JzID0gdGhpcy5yZWFkTWFueShpbmRpY2VzKTtcblxuICAgIGFzc2VydFNoYXBlc01hdGNoQWxsb3dVbmRlZmluZWRTaXplKFxuICAgICAgICB0aGlzLmVsZW1lbnRTaGFwZSwgdGVuc29yc1swXS5zaGFwZSxcbiAgICAgICAgYFRlbnNvckFycmF5IHNoYXBlIG1pc21hdGNoOiB0ZW5zb3IgYXJyYXkgc2hhcGUgKCR7XG4gICAgICAgICAgICB0aGlzLmVsZW1lbnRTaGFwZX0pIHZzIGZpcnN0IHRlbnNvciBzaGFwZSAoJHt0ZW5zb3JzWzBdLnNoYXBlfSlgKTtcblxuICAgIHJldHVybiBjb25jYXQodGVuc29ycywgMCk7XG4gIH1cblxuICAvKipcbiAgICogU2NhdHRlciB0aGUgdmFsdWVzIG9mIGEgVGVuc29yIGluIHNwZWNpZmljIGluZGljZXMgb2YgYSBUZW5zb3JBcnJheS5cbiAgICogQHBhcmFtIGluZGljZXMgbnVtbWJlcltdIHZhbHVlcyBpbiBbMCwgbWF4X3ZhbHVlKS4gSWYgdGhlXG4gICAqICAgIFRlbnNvckFycmF5IGlzIG5vdCBkeW5hbWljLCBtYXhfdmFsdWU9c2l6ZSgpLlxuICAgKiBAcGFyYW0gdGVuc29yIFRlbnNvciBpbnB1dCB0ZW5zb3IuXG4gICAqL1xuICBzY2F0dGVyKGluZGljZXM6IG51bWJlcltdLCB0ZW5zb3I6IFRlbnNvcikge1xuICAgIGlmICh0ZW5zb3IuZHR5cGUgIT09IHRoaXMuZHR5cGUpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcihgVGVuc29yQXJyYXkgZHR5cGUgaXMgJHtcbiAgICAgICAgICB0aGlzLmR0eXBlfSBidXQgdGVuc29yIGhhcyBkdHlwZSAke3RlbnNvci5kdHlwZX1gKTtcbiAgICB9XG5cbiAgICBpZiAoaW5kaWNlcy5sZW5ndGggIT09IHRlbnNvci5zaGFwZVswXSkge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKGBFeHBlY3RlZCBsZW4oaW5kaWNlcykgPT0gdGVuc29yLnNoYXBlWzBdLCBidXQgc2F3OiAke1xuICAgICAgICAgIGluZGljZXMubGVuZ3RofSB2cy4gJHt0ZW5zb3Iuc2hhcGVbMF19YCk7XG4gICAgfVxuXG4gICAgY29uc3QgbWF4SW5kZXggPSBNYXRoLm1heCguLi5pbmRpY2VzKTtcblxuICAgIGlmICghdGhpcy5keW5hbWljU2l6ZSAmJiBtYXhJbmRleCA+PSB0aGlzLm1heFNpemUpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcihcbiAgICAgICAgICBgTWF4IGluZGV4IG11c3QgYmUgPCBhcnJheSBzaXplICgke21heEluZGV4fSAgdnMuICR7dGhpcy5tYXhTaXplfSlgKTtcbiAgICB9XG5cbiAgICB0aGlzLndyaXRlTWFueShpbmRpY2VzLCB1bnN0YWNrKHRlbnNvciwgMCkpO1xuICB9XG5cbiAgLyoqXG4gICAqIFNwbGl0IHRoZSB2YWx1ZXMgb2YgYSBUZW5zb3IgaW50byB0aGUgVGVuc29yQXJyYXkuXG4gICAqIEBwYXJhbSBsZW5ndGggbnVtYmVyW10gd2l0aCB0aGUgbGVuZ3RocyB0byB1c2Ugd2hlbiBzcGxpdHRpbmcgdmFsdWUgYWxvbmdcbiAgICogICAgaXRzIGZpcnN0IGRpbWVuc2lvbi5cbiAgICogQHBhcmFtIHRlbnNvciBUZW5zb3IsIHRoZSB0ZW5zb3IgdG8gc3BsaXQuXG4gICAqL1xuICBzcGxpdChsZW5ndGg6IG51bWJlcltdLCB0ZW5zb3I6IFRlbnNvcikge1xuICAgIGlmICh0ZW5zb3IuZHR5cGUgIT09IHRoaXMuZHR5cGUpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcihgVGVuc29yQXJyYXkgZHR5cGUgaXMgJHtcbiAgICAgICAgICB0aGlzLmR0eXBlfSBidXQgdGVuc29yIGhhcyBkdHlwZSAke3RlbnNvci5kdHlwZX1gKTtcbiAgICB9XG4gICAgbGV0IHRvdGFsTGVuZ3RoID0gMDtcbiAgICBjb25zdCBjdW11bGF0aXZlTGVuZ3RocyA9IGxlbmd0aC5tYXAobGVuID0+IHtcbiAgICAgIHRvdGFsTGVuZ3RoICs9IGxlbjtcbiAgICAgIHJldHVybiB0b3RhbExlbmd0aDtcbiAgICB9KTtcblxuICAgIGlmICh0b3RhbExlbmd0aCAhPT0gdGVuc29yLnNoYXBlWzBdKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoYEV4cGVjdGVkIHN1bSBvZiBsZW5ndGhzIHRvIGJlIGVxdWFsIHRvXG4gICAgICAgICAgdGVuc29yLnNoYXBlWzBdLCBidXQgc3VtIG9mIGxlbmd0aHMgaXNcbiAgICAgICAgJHt0b3RhbExlbmd0aH0sIGFuZCB0ZW5zb3IncyBzaGFwZSBpczogJHt0ZW5zb3Iuc2hhcGV9YCk7XG4gICAgfVxuXG4gICAgaWYgKCF0aGlzLmR5bmFtaWNTaXplICYmIGxlbmd0aC5sZW5ndGggIT09IHRoaXMubWF4U2l6ZSkge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKFxuICAgICAgICAgIGBUZW5zb3JBcnJheSdzIHNpemUgaXMgbm90IGVxdWFsIHRvIHRoZSBzaXplIG9mIGxlbmd0aHMgKCR7XG4gICAgICAgICAgICAgIHRoaXMubWF4U2l6ZX0gdnMuICR7bGVuZ3RoLmxlbmd0aH0pLCBgICtcbiAgICAgICAgICAnYW5kIHRoZSBUZW5zb3JBcnJheSBpcyBub3QgbWFya2VkIGFzIGR5bmFtaWNhbGx5IHJlc2l6ZWFibGUnKTtcbiAgICB9XG5cbiAgICBjb25zdCBlbGVtZW50UGVyUm93ID0gdG90YWxMZW5ndGggPT09IDAgPyAwIDogdGVuc29yLnNpemUgLyB0b3RhbExlbmd0aDtcbiAgICBjb25zdCB0ZW5zb3JzOiBUZW5zb3JbXSA9IFtdO1xuICAgIHRpZHkoKCkgPT4ge1xuICAgICAgdGVuc29yID0gcmVzaGFwZSh0ZW5zb3IsIFsxLCB0b3RhbExlbmd0aCwgZWxlbWVudFBlclJvd10pO1xuICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCBsZW5ndGgubGVuZ3RoOyArK2kpIHtcbiAgICAgICAgY29uc3QgcHJldmlvdXNMZW5ndGggPSAoaSA9PT0gMCkgPyAwIDogY3VtdWxhdGl2ZUxlbmd0aHNbaSAtIDFdO1xuICAgICAgICBjb25zdCBpbmRpY2VzID0gWzAsIHByZXZpb3VzTGVuZ3RoLCAwXTtcbiAgICAgICAgY29uc3Qgc2l6ZXMgPSBbMSwgbGVuZ3RoW2ldLCBlbGVtZW50UGVyUm93XTtcbiAgICAgICAgdGVuc29yc1tpXSA9IHJlc2hhcGUoc2xpY2UodGVuc29yLCBpbmRpY2VzLCBzaXplcyksIHRoaXMuZWxlbWVudFNoYXBlKTtcbiAgICAgIH1cbiAgICAgIHJldHVybiB0ZW5zb3JzO1xuICAgIH0pO1xuICAgIGNvbnN0IGluZGljZXMgPSBbXTtcbiAgICBmb3IgKGxldCBpID0gMDsgaSA8IGxlbmd0aC5sZW5ndGg7IGkrKykge1xuICAgICAgaW5kaWNlc1tpXSA9IGk7XG4gICAgfVxuICAgIHRoaXMud3JpdGVNYW55KGluZGljZXMsIHRlbnNvcnMpO1xuICB9XG59XG4iXX0=","/**\n * @license\n * Copyright 2020 Google LLC. All Rights Reserved.\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n * =============================================================================\n */\nimport { concat, keep, reshape, scalar, slice, stack, tensor, tidy, unstack } from '@tensorflow/tfjs-core';\nimport { assertShapesMatchAllowUndefinedSize, inferElementShape, mergeElementShape } from './tensor_utils';\n/**\n * TensorList stores a container of `tf.Tensor` objects, which are accessible\n * via tensors field.\n *\n * In order to get a copy of the underlying list, use the copy method:\n * ```\n * TensorList b = a.copy();\n * b.tensors().pushBack(t); // This does not modify a.tensors().\n * ```\n *\n * Note that this is not a deep copy: the memory locations of the underlying\n * tensors will still point to the same locations of the corresponding tensors\n * in the original.\n */\nexport class TensorList {\n /**\n *\n * @param tensors list of tensors\n * @param elementShape shape of each tensor, this can be a single number (any\n * shape is allowed) or partial shape (dim = -1).\n * @param elementDtype data type of each tensor\n * @param maxNumElements The maximum allowed size of `tensors`. Defaults to -1\n * meaning that the size of `tensors` is unbounded.\n */\n constructor(tensors, elementShape, elementDtype, maxNumElements = -1) {\n this.tensors = tensors;\n this.elementShape = elementShape;\n this.elementDtype = elementDtype;\n if (tensors != null) {\n tensors.forEach(tensor => {\n if (elementDtype !== tensor.dtype) {\n throw new Error(`Invalid data types; op elements ${elementDtype}, but list elements ${tensor.dtype}`);\n }\n assertShapesMatchAllowUndefinedSize(elementShape, tensor.shape, 'TensorList shape mismatch: ');\n keep(tensor);\n });\n }\n this.idTensor = scalar(0);\n this.maxNumElements = maxNumElements;\n keep(this.idTensor);\n }\n get id() {\n return this.idTensor.id;\n }\n /**\n * Get a new TensorList containing a copy of the underlying tensor container.\n */\n copy() {\n return new TensorList([...this.tensors], this.elementShape, this.elementDtype);\n }\n /**\n * Dispose the tensors and idTensor and clear the tensor list.\n */\n clearAndClose(keepIds) {\n this.tensors.forEach(tensor => {\n if (keepIds == null || !keepIds.has(tensor.id)) {\n tensor.dispose();\n }\n });\n this.tensors.length = 0;\n this.idTensor.dispose();\n }\n /**\n * The size of the tensors in the tensor list.\n */\n size() {\n return this.tensors.length;\n }\n /**\n * Return a tensor that stacks a list of rank-R tf.Tensors into one rank-(R+1)\n * tf.Tensor.\n * @param elementShape shape of each tensor\n * @param elementDtype data type of each tensor\n * @param numElements the number of elements to stack\n */\n stack(elementShape, elementDtype, numElements = -1) {\n if (elementDtype !== this.elementDtype) {\n throw new Error(`Invalid data types; op elements ${elementDtype}, but list elements ${this.elementDtype}`);\n }\n if (numElements !== -1 && this.tensors.length !== numElements) {\n throw new Error(`Operation expected a list with ${numElements} elements but got a list with ${this.tensors.length} elements.`);\n }\n assertShapesMatchAllowUndefinedSize(elementShape, this.elementShape, 'TensorList shape mismatch: ');\n const outputElementShape = inferElementShape(this.elementShape, this.tensors, elementShape);\n return tidy(() => {\n const reshapedTensors = this.tensors.map(tensor => reshape(tensor, outputElementShape));\n return stack(reshapedTensors, 0);\n });\n }\n /**\n * Pop a tensor from the end of the list.\n * @param elementShape shape of the tensor\n * @param elementDtype data type of the tensor\n */\n popBack(elementShape, elementDtype) {\n if (elementDtype !== this.elementDtype) {\n throw new Error(`Invalid data types; op elements ${elementDtype}, but list elements ${this.elementDtype}`);\n }\n if (this.size() === 0) {\n throw new Error('Trying to pop from an empty list.');\n }\n const outputElementShape = inferElementShape(this.elementShape, this.tensors, elementShape);\n const tensor = this.tensors.pop();\n tensor.kept = false;\n assertShapesMatchAllowUndefinedSize(tensor.shape, elementShape, 'TensorList shape mismatch: ');\n return reshape(tensor, outputElementShape);\n }\n /**\n * Push a tensor to the end of the list.\n * @param tensor Tensor to be pushed.\n */\n pushBack(tensor) {\n if (tensor.dtype !== this.elementDtype) {\n throw new Error(`Invalid data types; op elements ${tensor.dtype}, but list elements ${this.elementDtype}`);\n }\n assertShapesMatchAllowUndefinedSize(tensor.shape, this.elementShape, 'TensorList shape mismatch: ');\n if (this.maxNumElements === this.size()) {\n throw new Error(`Trying to push element into a full list.`);\n }\n keep(tensor);\n this.tensors.push(tensor);\n }\n /**\n * Update the size of the list.\n * @param size the new size of the list.\n */\n resize(size) {\n if (size < 0) {\n throw new Error(`TensorListResize expects size to be non-negative. Got: ${size}`);\n }\n if (this.maxNumElements !== -1 && size > this.maxNumElements) {\n throw new Error(`TensorListResize input size ${size} is greater maxNumElement ${this.maxNumElements}.`);\n }\n const destTensorList = new TensorList([], this.elementShape, this.elementDtype, this.maxNumElements);\n destTensorList.tensors.length = size;\n for (let i = 0; i < Math.min(this.tensors.length, size); ++i) {\n destTensorList.tensors[i] = this.tensors[i];\n }\n return destTensorList;\n }\n /**\n * Retrieve the element at the provided index\n * @param elementShape shape of the tensor\n * @param elementDtype dtype of the tensor\n * @param elementIndex index of the tensor\n */\n getItem(elementIndex, elementShape, elementDtype) {\n if (elementDtype !== this.elementDtype) {\n throw new Error(`Invalid data types; op elements ${elementDtype}, but list elements ${this.elementDtype}`);\n }\n if (elementIndex < 0 || elementIndex > this.tensors.length) {\n throw new Error(`Trying to access element ${elementIndex} in a list with ${this.tensors.length} elements.`);\n }\n if (this.tensors[elementIndex] == null) {\n throw new Error(`element at index ${elementIndex} is null.`);\n }\n assertShapesMatchAllowUndefinedSize(this.tensors[elementIndex].shape, elementShape, 'TensorList shape mismatch: ');\n const outputElementShape = inferElementShape(this.elementShape, this.tensors, elementShape);\n return reshape(this.tensors[elementIndex], outputElementShape);\n }\n /**\n * Set the tensor at the index\n * @param elementIndex index of the tensor\n * @param tensor the tensor to be inserted into the list\n */\n setItem(elementIndex, tensor) {\n if (tensor.dtype !== this.elementDtype) {\n throw new Error(`Invalid data types; op elements ${tensor.dtype}, but list elements ${this.elementDtype}`);\n }\n if (elementIndex < 0 ||\n this.maxNumElements !== -1 && elementIndex >= this.maxNumElements) {\n throw new Error(`Trying to set element ${elementIndex} in a list with max ${this.maxNumElements} elements.`);\n }\n assertShapesMatchAllowUndefinedSize(this.elementShape, tensor.shape, 'TensorList shape mismatch: ');\n keep(tensor);\n // dispose the previous value if it is replacing.\n if (this.tensors[elementIndex] != null) {\n this.tensors[elementIndex].kept = false;\n }\n this.tensors[elementIndex] = tensor;\n }\n /**\n * Return selected values in the TensorList as a stacked Tensor. All of\n * selected values must have been written and their shapes must all match.\n * @param indices indices of tensors to gather\n * @param elementDtype output tensor dtype\n * @param elementShape output tensor element shape\n */\n gather(indices, elementDtype, elementShape) {\n if (elementDtype !== this.elementDtype) {\n throw new Error(`Invalid data types; op elements ${elementDtype}, but list elements ${this.elementDtype}`);\n }\n assertShapesMatchAllowUndefinedSize(this.elementShape, elementShape, 'TensorList shape mismatch: ');\n // When indices is greater than the size of the list, indices beyond the\n // size of the list are ignored.\n indices = indices.slice(0, this.size());\n const outputElementShape = inferElementShape(this.elementShape, this.tensors, elementShape);\n if (indices.length === 0) {\n return tensor([], [0].concat(outputElementShape));\n }\n return tidy(() => {\n const tensors = indices.map(i => reshape(this.tensors[i], outputElementShape));\n return stack(tensors, 0);\n });\n }\n /**\n * Return the values in the TensorList as a concatenated Tensor.\n * @param elementDtype output tensor dtype\n * @param elementShape output tensor element shape\n */\n concat(elementDtype, elementShape) {\n if (!!elementDtype && elementDtype !== this.elementDtype) {\n throw new Error(`TensorList dtype is ${this.elementDtype} but concat requested dtype ${elementDtype}`);\n }\n assertShapesMatchAllowUndefinedSize(this.elementShape, elementShape, 'TensorList shape mismatch: ');\n const outputElementShape = inferElementShape(this.elementShape, this.tensors, elementShape);\n if (this.size() === 0) {\n return tensor([], [0].concat(outputElementShape));\n }\n return tidy(() => {\n const tensors = this.tensors.map(t => reshape(t, outputElementShape));\n return concat(tensors, 0);\n });\n }\n}\n/**\n * Creates a TensorList which, when stacked, has the value of tensor.\n * @param tensor from tensor\n * @param elementShape output tensor element shape\n */\nexport function fromTensor(tensor, elementShape, elementDtype) {\n const dtype = tensor.dtype;\n if (tensor.shape.length < 1) {\n throw new Error(`Tensor must be at least a vector, but saw shape: ${tensor.shape}`);\n }\n if (tensor.dtype !== elementDtype) {\n throw new Error(`Invalid data types; op elements ${tensor.dtype}, but list elements ${elementDtype}`);\n }\n const tensorElementShape = tensor.shape.slice(1);\n assertShapesMatchAllowUndefinedSize(tensorElementShape, elementShape, 'TensorList shape mismatch: ');\n const tensorList = unstack(tensor);\n return new TensorList(tensorList, elementShape, dtype);\n}\n/**\n * Return a TensorList of the given size with empty elements.\n * @param elementShape the shape of the future elements of the list\n * @param elementDtype the desired type of elements in the list\n * @param numElements the number of elements to reserve\n * @param maxNumElements the maximum number of elements in th list\n */\nexport function reserve(elementShape, elementDtype, numElements, maxNumElements) {\n return new TensorList([], elementShape, elementDtype, maxNumElements);\n}\n/**\n * Put tensors at specific indices of a stacked tensor into a TensorList.\n * @param indices list of indices on how to scatter the tensor.\n * @param tensor input tensor.\n * @param elementShape the shape of the future elements of the list\n * @param numElements the number of elements to scatter\n */\nexport function scatter(tensor, indices, elementShape, numElements) {\n if (indices.length !== tensor.shape[0]) {\n throw new Error(`Expected len(indices) == tensor.shape[0], but saw: ${indices.length} vs. ${tensor.shape[0]}`);\n }\n const maxIndex = Math.max(...indices);\n if (numElements != null && numElements !== -1 && maxIndex >= numElements) {\n throw new Error(`Max index must be < array size (${maxIndex} vs. ${numElements})`);\n }\n const list = new TensorList([], elementShape, tensor.dtype, numElements);\n const tensors = unstack(tensor, 0);\n indices.forEach((value, index) => {\n list.setItem(value, tensors[index]);\n });\n return list;\n}\n/**\n * Split the values of a Tensor into a TensorList.\n * @param length the lengths to use when splitting value along\n * its first dimension.\n * @param tensor the tensor to split.\n * @param elementShape the shape of the future elements of the list\n */\nexport function split(tensor, length, elementShape) {\n let totalLength = 0;\n const cumulativeLengths = length.map(len => {\n totalLength += len;\n return totalLength;\n });\n if (totalLength !== tensor.shape[0]) {\n throw new Error(`Expected sum of lengths to be equal to\n tensor.shape[0], but sum of lengths is\n ${totalLength}, and tensor's shape is: ${tensor.shape}`);\n }\n const shapeWithoutFirstDim = tensor.shape.slice(1);\n const outputElementShape = mergeElementShape(shapeWithoutFirstDim, elementShape);\n const elementPerRow = totalLength === 0 ? 0 : tensor.size / totalLength;\n const tensors = tidy(() => {\n const tensors = [];\n tensor = reshape(tensor, [1, totalLength, elementPerRow]);\n for (let i = 0; i < length.length; ++i) {\n const previousLength = (i === 0) ? 0 : cumulativeLengths[i - 1];\n const indices = [0, previousLength, 0];\n const sizes = [1, length[i], elementPerRow];\n tensors[i] = reshape(slice(tensor, indices, sizes), outputElementShape);\n }\n tensor.dispose();\n return tensors;\n });\n const list = new TensorList([], elementShape, tensor.dtype, length.length);\n for (let i = 0; i < tensors.length; i++) {\n list.setItem(i, tensors[i]);\n }\n return list;\n}\n//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidGVuc29yX2xpc3QuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi8uLi90ZmpzLWNvbnZlcnRlci9zcmMvZXhlY3V0b3IvdGVuc29yX2xpc3QudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUE7Ozs7Ozs7Ozs7Ozs7OztHQWVHO0FBRUgsT0FBTyxFQUFDLE1BQU0sRUFBWSxJQUFJLEVBQUUsT0FBTyxFQUFFLE1BQU0sRUFBRSxLQUFLLEVBQUUsS0FBSyxFQUFVLE1BQU0sRUFBRSxJQUFJLEVBQUUsT0FBTyxFQUFDLE1BQU0sdUJBQXVCLENBQUM7QUFFM0gsT0FBTyxFQUFDLG1DQUFtQyxFQUFFLGlCQUFpQixFQUFFLGlCQUFpQixFQUFDLE1BQU0sZ0JBQWdCLENBQUM7QUFFekc7Ozs7Ozs7Ozs7Ozs7R0FhRztBQUVILE1BQU0sT0FBTyxVQUFVO0lBT3JCOzs7Ozs7OztPQVFHO0lBQ0gsWUFDYSxPQUFpQixFQUFXLFlBQTZCLEVBQ3pELFlBQXNCLEVBQUUsY0FBYyxHQUFHLENBQUMsQ0FBQztRQUQzQyxZQUFPLEdBQVAsT0FBTyxDQUFVO1FBQVcsaUJBQVksR0FBWixZQUFZLENBQWlCO1FBQ3pELGlCQUFZLEdBQVosWUFBWSxDQUFVO1FBQ2pDLElBQUksT0FBTyxJQUFJLElBQUksRUFBRTtZQUNuQixPQUFPLENBQUMsT0FBTyxDQUFDLE1BQU0sQ0FBQyxFQUFFO2dCQUN2QixJQUFJLFlBQVksS0FBSyxNQUFNLENBQUMsS0FBSyxFQUFFO29CQUNqQyxNQUFNLElBQUksS0FBSyxDQUFDLG1DQUNaLFlBQVksdUJBQXVCLE1BQU0sQ0FBQyxLQUFLLEVBQUUsQ0FBQyxDQUFDO2lCQUN4RDtnQkFDRCxtQ0FBbUMsQ0FDL0IsWUFBWSxFQUFFLE1BQU0sQ0FBQyxLQUFLLEVBQUUsNkJBQTZCLENBQUMsQ0FBQztnQkFFL0QsSUFBSSxDQUFDLE1BQU0sQ0FBQyxDQUFDO1lBQ2YsQ0FBQyxDQUFDLENBQUM7U0FDSjtRQUNELElBQUks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SUFBSSxDQUFDLE9BQU8sQ0FBQyxDQUFDLEVBQUUsT0FBTyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUM7S0FDN0I7SUFDRCxPQUFPLElBQUksQ0FBQztBQUNkLENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyIvKipcbiAqIEBsaWNlbnNlXG4gKiBDb3B5cmlnaHQgMjAyMCBHb29nbGUgTExDLiBBbGwgUmlnaHRzIFJlc2VydmVkLlxuICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlIFwiTGljZW5zZVwiKTtcbiAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS5cbiAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdFxuICpcbiAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMFxuICpcbiAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmVcbiAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuIFwiQVMgSVNcIiBCQVNJUyxcbiAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLlxuICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZFxuICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuXG4gKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuICovXG5cbmltcG9ydCB7Y29uY2F0LCBEYXRhVHlwZSwga2VlcCwgcmVzaGFwZSwgc2NhbGFyLCBzbGljZSwgc3RhY2ssIFRlbnNvciwgdGVuc29yLCB0aWR5LCB1bnN0YWNrfSBmcm9tICdAdGVuc29yZmxvdy90ZmpzLWNvcmUnO1xuXG5pbXBvcnQge2Fzc2VydFNoYXBlc01hdGNoQWxsb3dVbmRlZmluZWRTaXplLCBpbmZlckVsZW1lbnRTaGFwZSwgbWVyZ2VFbGVtZW50U2hhcGV9IGZyb20gJy4vdGVuc29yX3V0aWxzJztcblxuLyoqXG4gKiBUZW5zb3JMaXN0IHN0b3JlcyBhIGNvbnRhaW5lciBvZiBgdGYuVGVuc29yYCBvYmplY3RzLCB3aGljaCBhcmUgYWNjZXNzaWJsZVxuICogdmlhIHRlbnNvcnMgZmllbGQuXG4gKlxuICogSW4gb3JkZXIgdG8gZ2V0IGEgY29weSBvZiB0aGUgdW5kZXJseWluZyBsaXN0LCB1c2UgdGhlIGNvcHkgbWV0aG9kOlxuICogYGBgXG4gKiAgICBUZW5zb3JMaXN0IGIgPSBhLmNvcHkoKTtcbiAqICAgIGIudGVuc29ycygpLnB1c2hCYWNrKHQpOyAgLy8gVGhpcyBkb2VzIG5vdCBtb2RpZnkgYS50ZW5zb3JzKCkuXG4gKiBgYGBcbiAqXG4gKiBOb3RlIHRoYXQgdGhpcyBpcyBub3QgYSBkZWVwIGNvcHk6IHRoZSBtZW1vcnkgbG9jYXRpb25zIG9mIHRoZSB1bmRlcmx5aW5nXG4gKiB0ZW5zb3JzIHdpbGwgc3RpbGwgcG9pbnQgdG8gdGhlIHNhbWUgbG9jYXRpb25zIG9mIHRoZSBjb3JyZXNwb25kaW5nIHRlbnNvcnNcbiAqIGluIHRoZSBvcmlnaW5hbC5cbiAqL1xuXG5leHBvcnQgY2xhc3MgVGVuc29yTGlzdCB7XG4gIHJlYWRvbmx5IGlkVGVuc29yOiBUZW5zb3I7XG4gIG1heE51bUVsZW1lbnRzOiBudW1iZXI7XG5cbiAgZ2V0IGlkKCkge1xuICAgIHJldHVybiB0aGlzLmlkVGVuc29yLmlkO1xuICB9XG4gIC8qKlxuICAgKlxuICAgKiBAcGFyYW0gdGVuc29ycyBsaXN0IG9mIHRlbnNvcnNcbiAgICogQHBhcmFtIGVsZW1lbnRTaGFwZSBzaGFwZSBvZiBlYWNoIHRlbnNvciwgdGhpcyBjYW4gYmUgYSBzaW5nbGUgbnVtYmVyIChhbnlcbiAgICogc2hhcGUgaXMgYWxsb3dlZCkgb3IgcGFydGlhbCBzaGFwZSAoZGltID0gLTEpLlxuICAgKiBAcGFyYW0gZWxlbWVudER0eXBlIGRhdGEgdHlwZSBvZiBlYWNoIHRlbnNvclxuICAgKiBAcGFyYW0gbWF4TnVtRWxlbWVudHMgVGhlIG1heGltdW0gYWxsb3dlZCBzaXplIG9mIGB0ZW5zb3JzYC4gRGVmYXVsdHMgdG8gLTFcbiAgICogICBtZWFuaW5nIHRoYXQgdGhlIHNpemUgb2YgYHRlbnNvcnNgIGlzIHVuYm91bmRlZC5cbiAgICovXG4gIGNvbnN0cnVjdG9yKFxuICAgICAgcmVhZG9ubHkgdGVuc29yczogVGVuc29yW10sIHJlYWRvbmx5IGVsZW1lbnRTaGFwZTogbnVtYmVyfG51bWJlcltdLFxuICAgICAgcmVhZG9ubHkgZWxlbWVudER0eXBlOiBEYXRhVHlwZSwgbWF4TnVtRWxlbWVudHMgPSAtMSkge1xuICAgIGlmICh0ZW5zb3JzICE9IG51bGwpIHtcbiAgICAgIHRlbnNvcnMuZm9yRWFjaCh0ZW5zb3IgPT4ge1xuICAgICAgICBpZiAoZWxlbWVudER0eXBlICE9PSB0ZW5zb3IuZHR5cGUpIHtcbiAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoYEludmFsaWQgZGF0YSB0eXBlczsgb3AgZWxlbWVudHMgJHtcbiAgICAgICAgICAgICAgZWxlbWVudER0eXBlfSwgYnV0IGxpc3QgZWxlbWVudHMgJHt0ZW5zb3IuZHR5cGV9YCk7XG4gICAgICAgIH1cbiAgICAgICAgYXNzZXJ0U2hhcGVzTWF0Y2hBbGxvd1VuZGVmaW5lZFNpemUoXG4gICAgICAgICAgICBlbGVtZW50U2hhcGUsIHRlbnNvci5zaGFwZSwgJ1RlbnNvckxpc3Qgc2hhcGUgbWlzbWF0Y2g6ICcpO1xuXG4gICAgICAgIGtlZXAodGVuc29yKTtcbiAgICAgIH0pO1xuICAgIH1cbiAgICB0aGlzLmlkVGVuc29yID0gc2NhbGFyKDApO1xuICAgIHRoaXMubWF4TnVtRWxlbWVudHMgPSBtYXhOdW1FbGVtZW50cztcbiAgICBrZWVwKHRoaXMuaWRUZW5zb3IpO1xuICB9XG5cbiAgLyoqXG4gICAqIEdldCBhIG5ldyBUZW5zb3JMaXN0IGNvbnRhaW5pbmcgYSBjb3B5IG9mIHRoZSB1bmRlcmx5aW5nIHRlbnNvciBjb250YWluZXIuXG4gICAqL1xuICBjb3B5KCk6IFRlbnNvckxpc3Qge1xuICAgIHJldHVybiBuZXcgVGVuc29yTGlzdChcbiAgICAgICAgWy4uLnRoaXMudGVuc29yc10sIHRoaXMuZWxlbWVudFNoYXBlLCB0aGlzLmVsZW1lbnREdHlwZSk7XG4gIH1cblxuICAvKipcbiAgICogRGlzcG9zZSB0aGUgdGVuc29ycyBhbmQgaWRUZW5zb3IgYW5kIGNsZWFyIHRoZSB0ZW5zb3IgbGlzdC5cbiAgICovXG4gIGNsZWFyQW5kQ2xvc2Uoa2VlcElkcz86IFNldDxudW1iZXI+KSB7XG4gICAgdGhpcy50ZW5zb3JzLmZvckVhY2godGVuc29yID0+IHtcbiAgICAgIGlmIChrZWVwSWRzID09IG51bGwgfHwgIWtlZXBJZHMuaGFzKHRlbnNvci5pZCkpIHtcbiAgICAgICAgdGVuc29yLmRpc3Bvc2UoKTtcbiAgICAgIH1cbiAgICB9KTtcbiAgICB0aGlzLnRlbnNvcnMubGVuZ3RoID0gMDtcbiAgICB0aGlzLmlkVGVuc29yLmRpc3Bvc2UoKTtcbiAgfVxuICAvKipcbiAgICogVGhlIHNpemUgb2YgdGhlIHRlbnNvcnMgaW4gdGhlIHRlbnNvciBsaXN0LlxuICAgKi9cbiAgc2l6ZSgpIHtcbiAgICByZXR1cm4gdGhpcy50ZW5zb3JzLmxlbmd0aDtcbiAgfVxuXG4gIC8qKlxuICAgKiBSZXR1cm4gYSB0ZW5zb3IgdGhhdCBzdGFja3MgYSBsaXN0IG9mIHJhbmstUiB0Zi5UZW5zb3JzIGludG8gb25lIHJhbmstKFIrMSlcbiAgICogdGYuVGVuc29yLlxuICAgKiBAcGFyYW0gZWxlbWVudFNoYXBlIHNoYXBlIG9mIGVhY2ggdGVuc29yXG4gICAqIEBwYXJhbSBlbGVtZW50RHR5cGUgZGF0YSB0eXBlIG9mIGVhY2ggdGVuc29yXG4gICAqIEBwYXJhbSBudW1FbGVtZW50cyB0aGUgbnVtYmVyIG9mIGVsZW1lbnRzIHRvIHN0YWNrXG4gICAqL1xuICBzdGFjayhlbGVtZW50U2hhcGU6IG51bWJlcltdLCBlbGVtZW50RHR5cGU6IERhdGFUeXBlLCBudW1FbGVtZW50cyA9IC0xKTpcbiAgICAgIFRlbnNvciB7XG4gICAgaWYgKGVsZW1lbnREdHlwZSAhPT0gdGhpcy5lbGVtZW50RHR5cGUpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcihgSW52YWxpZCBkYXRhIHR5cGVzOyBvcCBlbGVtZW50cyAke1xuICAgICAgICAgIGVsZW1lbnREdHlwZX0sIGJ1dCBsaXN0IGVsZW1lbnRzICR7dGhpcy5lbGVtZW50RHR5cGV9YCk7XG4gICAgfVxuICAgIGlmIChudW1FbGVtZW50cyAhPT0gLTEgJiYgdGhpcy50ZW5zb3JzLmxlbmd0aCAhPT0gbnVtRWxlbWVudHMpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcihgT3BlcmF0aW9uIGV4cGVjdGVkIGEgbGlzdCB3aXRoICR7XG4gICAgICAgICAgbnVtRWxlbWVudHN9IGVsZW1lbnRzIGJ1dCBnb3QgYSBsaXN0IHdpdGggJHtcbiAgICAgICAgICB0aGlzLnRlbnNvcnMubGVuZ3RofSBlbGVtZW50cy5gKTtcbiAgICB9XG4gICAgYXNzZXJ0U2hhcGVzTWF0Y2hBbGxvd1VuZGVmaW5lZFNpemUoXG4gICAgICAgIGVsZW1lbnRTaGFwZSwgdGhpcy5lbGVtZW50U2hhcGUsICdUZW5zb3JMaXN0IHNoYXBlIG1pc21hdGNoOiAnKTtcbiAgICBjb25zdCBvdXRwdXRFbGVtZW50U2hhcGUgPVxuICAgICAgICBpbmZlckVsZW1lbnRTaGFwZSh0aGlzLmVsZW1lbnRTaGFwZSwgdGhpcy50ZW5zb3JzLCBlbGVtZW50U2hhcGUpO1xuICAgIHJldHVybiB0aWR5KCgpID0+IHtcbiAgICAgIGNvbnN0IHJlc2hhcGVkVGVuc29ycyA9XG4gICAgICAgICAgdGhpcy50ZW5zb3JzLm1hcCh0ZW5zb3IgPT4gcmVzaGFwZSh0ZW5zb3IsIG91dHB1dEVsZW1lbnRTaGFwZSkpO1xuICAgICAgcmV0dXJuIHN0YWNrKHJlc2hhcGVkVGVuc29ycywgMCk7XG4gICAgfSk7XG4gIH1cblxuICAvKipcbiAgICogUG9wIGEgdGVuc29yIGZyb20gdGhlIGVuZCBvZiB0aGUgbGlzdC5cbiAgICogQHBhcmFtIGVsZW1lbnRTaGFwZSBzaGFwZSBvZiB0aGUgdGVuc29yXG4gICAqIEBwYXJhbSBlbGVtZW50RHR5cGUgZGF0YSB0eXBlIG9mIHRoZSB0ZW5zb3JcbiAgICovXG4gIHBvcEJhY2soZWxlbWVudFNoYXBlOiBudW1iZXJbXSwgZWxlbWVudER0eXBlOiBEYXRhVHlwZSk6IFRlbnNvciB7XG4gICAgaWYgKGVsZW1lbnREdHlwZSAhPT0gdGhpcy5lbGVtZW50RHR5cGUpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcihgSW52YWxpZCBkYXRhIHR5cGVzOyBvcCBlbGVtZW50cyAke1xuICAgICAgICAgIGVsZW1lbnREdHlwZX0sIGJ1dCBsaXN0IGVsZW1lbnRzICR7dGhpcy5lbGVtZW50RHR5cGV9YCk7XG4gICAgfVxuXG4gICAgaWYgKHRoaXMuc2l6ZSgpID09PSAwKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoJ1RyeWluZyB0byBwb3AgZnJvbSBhbiBlbXB0eSBsaXN0LicpO1xuICAgIH1cbiAgICBjb25zdCBvdXRwdXRFbGVtZW50U2hhcGUgPVxuICAgICAgICBpbmZlckVsZW1lbnRTaGFwZSh0aGlzLmVsZW1lbnRTaGFwZSwgdGhpcy50ZW5zb3JzLCBlbGVtZW50U2hhcGUpO1xuICAgIGNvbnN0IHRlbnNvciA9IHRoaXMudGVuc29ycy5wb3AoKTtcbiAgICB0ZW5zb3Iua2VwdCA9IGZhbHNlO1xuXG4gICAgYXNzZXJ0U2hhcGVzTWF0Y2hBbGxvd1VuZGVmaW5lZFNpemUoXG4gICAgICAgIHRlbnNvci5zaGFwZSwgZWxlbWVudFNoYXBlLCAnVGVuc29yTGlzdCBzaGFwZSBtaXNtYXRjaDogJyk7XG5cbiAgICByZXR1cm4gcmVzaGFwZSh0ZW5zb3IsIG91dHB1dEVsZW1lbnRTaGFwZSk7XG4gIH1cblxuICAvKipcbiAgICogUHVzaCBhIHRlbnNvciB0byB0aGUgZW5kIG9mIHRoZSBsaXN0LlxuICAgKiBAcGFyYW0gdGVuc29yIFRlbnNvciB0byBiZSBwdXNoZWQuXG4gICAqL1xuICBwdXNoQmFjayh0ZW5zb3I6IFRlbnNvcikge1xuICAgIGlmICh0ZW5zb3IuZHR5cGUgIT09IHRoaXMuZWxlbWVudER0eXBlKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoYEludmFsaWQgZGF0YSB0eXBlczsgb3AgZWxlbWVudHMgJHtcbiAgICAgICAgICB0ZW5zb3IuZHR5cGV9LCBidXQgbGlzdCBlbGVtZW50cyAke3RoaXMuZWxlbWVudER0eXBlfWApO1xuICAgIH1cblxuICAgIGFzc2VydFNoYXBlc01hdGNoQWxsb3dVbmRlZmluZWRTaXplKFxuICAgICAgICB0ZW5zb3Iuc2hhcGUsIHRoaXMuZWxlbWVudFNoYXBlLCAnVGVuc29yTGlzdCBzaGFwZSBtaXNtYXRjaDogJyk7XG5cbiAgICBpZiAodGhpcy5tYXhOdW1FbGVtZW50cyA9PT0gdGhpcy5zaXplKCkpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcihgVHJ5aW5nIHRvIHB1c2ggZWxlbWVudCBpbnRvIGEgZnVsbCBsaXN0LmApO1xuICAgIH1cbiAgICBrZWVwKHRlbnNvcik7XG4gICAgdGhpcy50ZW5zb3JzLnB1c2godGVuc29yKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBVcGRhdGUgdGhlIHNpemUgb2YgdGhlIGxpc3QuXG4gICAqIEBwYXJhbSBzaXplIHRoZSBuZXcgc2l6ZSBvZiB0aGUgbGlzdC5cbiAgICovXG4gIHJlc2l6ZShzaXplOiBudW1iZXIpIHtcbiAgICBpZiAoc2l6ZSA8IDApIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcihcbiAgICAgICAgICBgVGVuc29yTGlzdFJlc2l6ZSBleHBlY3RzIHNpemUgdG8gYmUgbm9uLW5lZ2F0aXZlLiBHb3Q6ICR7c2l6ZX1gKTtcbiAgICB9XG5cbiAgICBpZiAodGhpcy5tYXhOdW1FbGVtZW50cyAhPT0gLTEgJiYgc2l6ZSA+IHRoaXMubWF4TnVtRWxlbWVudHMpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcihgVGVuc29yTGlzdFJlc2l6ZSBpbnB1dCBzaXplICR7XG4gICAgICAgICAgc2l6ZX0gaXMgZ3JlYXRlciBtYXhOdW1FbGVtZW50ICR7dGhpcy5tYXhOdW1FbGVtZW50c30uYCk7XG4gICAgfVxuXG4gICAgY29uc3QgZGVzdFRlbnNvckxpc3Q6IFRlbnNvckxpc3QgPSBuZXcgVGVuc29yTGlzdChcbiAgICAgICAgW10sIHRoaXMuZWxlbWVudFNoYXBlLCB0aGlzLmVsZW1lbnREdHlwZSwgdGhpcy5tYXhOdW1FbGVtZW50cyk7XG4gICAgZGVzdFRlbnNvckxpc3QudGVuc29ycy5sZW5ndGggPSBzaXplO1xuICAgIGZvciAobGV0IGkgPSAwOyBpIDwgTWF0aC5taW4odGhpcy50ZW5zb3JzLmxlbmd0aCwgc2l6ZSk7ICsraSkge1xuICAgICAgZGVzdFRlbnNvckxpc3QudGVuc29yc1tpXSA9IHRoaXMudGVuc29yc1tpXTtcbiAgICB9XG4gICAgcmV0dXJuIGRlc3RUZW5zb3JMaXN0O1xuICB9XG5cbiAgLyoqXG4gICAqIFJldHJpZXZlIHRoZSBlbGVtZW50IGF0IHRoZSBwcm92aWRlZCBpbmRleFxuICAgKiBAcGFyYW0gZWxlbWVudFNoYXBlIHNoYXBlIG9mIHRoZSB0ZW5zb3JcbiAgICogQHBhcmFtIGVsZW1lbnREdHlwZSBkdHlwZSBvZiB0aGUgdGVuc29yXG4gICAqIEBwYXJhbSBlbGVtZW50SW5kZXggaW5kZXggb2YgdGhlIHRlbnNvclxuICAgKi9cbiAgZ2V0SXRlbShlbGVtZW50SW5kZXg6IG51bWJlciwgZWxlbWVudFNoYXBlOiBudW1iZXJbXSwgZWxlbWVudER0eXBlOiBEYXRhVHlwZSk6XG4gICAgICBUZW5zb3Ige1xuICAgIGlmIChlbGVtZW50RHR5cGUgIT09IHRoaXMuZWxlbWVudER0eXBlKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoYEludmFsaWQgZGF0YSB0eXBlczsgb3AgZWxlbWVudHMgJHtcbiAgICAgICAgICBlbGVtZW50RHR5cGV9LCBidXQgbGlzdCBlbGVtZW50cyAke3RoaXMuZWxlbWVudER0eXBlfWApO1xuICAgIH1cbiAgICBpZiAoZWxlbWVudEluZGV4IDwgMCB8fCBlbGVtZW50SW5kZXggPiB0aGlzLnRlbnNvcnMubGVuZ3RoKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoYFRyeWluZyB0byBhY2Nlc3MgZWxlbWVudCAke1xuICAgICAgICAgIGVsZW1lbnRJbmRleH0gaW4gYSBsaXN0IHdpdGggJHt0aGlzLnRlbnNvcnMubGVuZ3RofSBlbGVtZW50cy5gKTtcbiAgICB9XG5cbiAgICBpZiAodGhpcy50ZW5zb3JzW2VsZW1lbnRJbmRleF0gPT0gbnVsbCkge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKGBlbGVtZW50IGF0IGluZGV4ICR7ZWxlbWVudEluZGV4fSBpcyBudWxsLmApO1xuICAgIH1cblxuICAgIGFzc2VydFNoYXBlc01hdGNoQWxsb3dVbmRlZmluZWRTaXplKFxuICAgICAgICB0aGlzLnRlbnNvcnNbZWxlbWVudEluZGV4XS5zaGFwZSwgZWxlbWVudFNoYXBlLFxuICAgICAgICAnVGVuc29yTGlzdCBzaGFwZSBtaXNtYXRjaDogJyk7XG4gICAgY29uc3Qgb3V0cHV0RWxlbWVudFNoYXBlID1cbiAgICAgICAgaW5mZXJFbGVtZW50U2hhcGUodGhpcy5lbGVtZW50U2hhcGUsIHRoaXMudGVuc29ycywgZWxlbWVudFNoYXBlKTtcbiAgICByZXR1cm4gcmVzaGFwZSh0aGlzLnRlbnNvcnNbZWxlbWVudEluZGV4XSwgb3V0cHV0RWxlbWVudFNoYXBlKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBTZXQgdGhlIHRlbnNvciBhdCB0aGUgaW5kZXhcbiAgICogQHBhcmFtIGVsZW1lbnRJbmRleCBpbmRleCBvZiB0aGUgdGVuc29yXG4gICAqIEBwYXJhbSB0ZW5zb3IgdGhlIHRlbnNvciB0byBiZSBpbnNlcnRlZCBpbnRvIHRoZSBsaXN0XG4gICAqL1xuICBzZXRJdGVtKGVsZW1lbnRJbmRleDogbnVtYmVyLCB0ZW5zb3I6IFRlbnNvcikge1xuICAgIGlmICh0ZW5zb3IuZHR5cGUgIT09IHRoaXMuZWxlbWVudER0eXBlKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoYEludmFsaWQgZGF0YSB0eXBlczsgb3AgZWxlbWVudHMgJHtcbiAgICAgICAgICB0ZW5zb3IuZHR5cGV9LCBidXQgbGlzdCBlbGVtZW50cyAke3RoaXMuZWxlbWVudER0eXBlfWApO1xuICAgIH1cblxuICAgIGlmIChlbGVtZW50SW5kZXggPCAwIHx8XG4gICAgICAgIHRoaXMubWF4TnVtRWxlbWVudHMgIT09IC0xICYmIGVsZW1lbnRJbmRleCA+PSB0aGlzLm1heE51bUVsZW1lbnRzKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoYFRyeWluZyB0byBzZXQgZWxlbWVudCAke1xuICAgICAgICAgIGVsZW1lbnRJbmRleH0gaW4gYSBsaXN0IHdpdGggbWF4ICR7dGhpcy5tYXhOdW1FbGVtZW50c30gZWxlbWVudHMuYCk7XG4gICAgfVxuXG4gICAgYXNzZXJ0U2hhcGVzTWF0Y2hBbGxvd1VuZGVmaW5lZFNpemUoXG4gICAgICAgIHRoaXMuZWxlbWVudFNoYXBlLCB0ZW5zb3Iuc2hhcGUsICdUZW5zb3JMaXN0IHNoYXBlIG1pc21hdGNoOiAnKTtcbiAgICBrZWVwKHRlbnNvcik7XG5cbiAgICAvLyBkaXNwb3NlIHRoZSBwcmV2aW91cyB2YWx1ZSBpZiBpdCBpcyByZXBsYWNpbmcuXG4gICAgaWYgKHRoaXMudGVuc29yc1tlbGVtZW50SW5kZXhdICE9IG51bGwpIHtcbiAgICAgIHRoaXMudGVuc29yc1tlbGVtZW50SW5kZXhdLmtlcHQgPSBmYWxzZTtcbiAgICB9XG5cbiAgICB0aGlzLnRlbnNvcnNbZWxlbWVudEluZGV4XSA9IHRlbnNvcjtcbiAgfVxuXG4gIC8qKlxuICAgKiBSZXR1cm4gc2VsZWN0ZWQgdmFsdWVzIGluIHRoZSBUZW5zb3JMaXN0IGFzIGEgc3RhY2tlZCBUZW5zb3IuIEFsbCBvZlxuICAgKiBzZWxlY3RlZCB2YWx1ZXMgbXVzdCBoYXZlIGJlZW4gd3JpdHRlbiBhbmQgdGhlaXIgc2hhcGVzIG11c3QgYWxsIG1hdGNoLlxuICAgKiBAcGFyYW0gaW5kaWNlcyBpbmRpY2VzIG9mIHRlbnNvcnMgdG8gZ2F0aGVyXG4gICAqIEBwYXJhbSBlbGVtZW50RHR5cGUgb3V0cHV0IHRlbnNvciBkdHlwZVxuICAgKiBAcGFyYW0gZWxlbWVudFNoYXBlIG91dHB1dCB0ZW5zb3IgZWxlbWVudCBzaGFwZVxuICAgKi9cbiAgZ2F0aGVyKGluZGljZXM6IG51bWJlcltdLCBlbGVtZW50RHR5cGU6IERhdGFUeXBlLCBlbGVtZW50U2hhcGU6IG51bWJlcltdKTpcbiAgICAgIFRlbnNvciB7XG4gICAgaWYgKGVsZW1lbnREdHlwZSAhPT0gdGhpcy5lbGVtZW50RHR5cGUpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcihgSW52YWxpZCBkYXRhIHR5cGVzOyBvcCBlbGVtZW50cyAke1xuICAgICAgICAgIGVsZW1lbnREdHlwZX0sIGJ1dCBsaXN0IGVsZW1lbnRzICR7dGhpcy5lbGVtZW50RHR5cGV9YCk7XG4gICAgfVxuXG4gICAgYXNzZXJ0U2hhcGVzTWF0Y2hBbGxvd1VuZGVmaW5lZFNpemUoXG4gICAgICAgIHRoaXMuZWxlbWVudFNoYXBlLCBlbGVtZW50U2hhcGUsICdUZW5zb3JMaXN0IHNoYXBlIG1pc21hdGNoOiAnKTtcblxuICAgIC8vIFdoZW4gaW5kaWNlcyBpcyBncmVhdGVyIHRoYW4gdGhlIHNpemUgb2YgdGhlIGxpc3QsIGluZGljZXMgYmV5b25kIHRoZVxuICAgIC8vIHNpemUgb2YgdGhlIGxpc3QgYXJlIGlnbm9yZWQuXG4gICAgaW5kaWNlcyA9IGluZGljZXMuc2xpY2UoMCwgdGhpcy5zaXplKCkpO1xuICAgIGNvbnN0IG91dHB1dEVsZW1lbnRTaGFwZSA9XG4gICAgICAgIGluZmVyRWxlbWVudFNoYXBlKHRoaXMuZWxlbWVudFNoYXBlLCB0aGlzLnRlbnNvcnMsIGVsZW1lbnRTaGFwZSk7XG4gICAgaWYgKGluZGljZXMubGVuZ3RoID09PSAwKSB7XG4gICAgICByZXR1cm4gdGVuc29yKFtdLCBbMF0uY29uY2F0KG91dHB1dEVsZW1lbnRTaGFwZSkpO1xuICAgIH1cblxuICAgIHJldHVybiB0aWR5KCgpID0+IHtcbiAgICAgIGNvbnN0IHRlbnNvcnMgPVxuICAgICAgICAgIGluZGljZXMubWFwKGkgPT4gcmVzaGFwZSh0aGlzLnRlbnNvcnNbaV0sIG91dHB1dEVsZW1lbnRTaGFwZSkpO1xuICAgICAgcmV0dXJuIHN0YWNrKHRlbnNvcnMsIDApO1xuICAgIH0pO1xuICB9XG5cbiAgLyoqXG4gICAqIFJldHVybiB0aGUgdmFsdWVzIGluIHRoZSBUZW5zb3JMaXN0IGFzIGEgY29uY2F0ZW5hdGVkIFRlbnNvci5cbiAgICogQHBhcmFtIGVsZW1lbnREdHlwZSBvdXRwdXQgdGVuc29yIGR0eXBlXG4gICAqIEBwYXJhbSBlbGVtZW50U2hhcGUgb3V0cHV0IHRlbnNvciBlbGVtZW50IHNoYXBlXG4gICAqL1xuICBjb25jYXQoZWxlbWVudER0eXBlOiBEYXRhVHlwZSwgZWxlbWVudFNoYXBlOiBudW1iZXJbXSk6IFRlbnNvciB7XG4gICAgaWYgKCEhZWxlbWVudER0eXBlICYmIGVsZW1lbnREdHlwZSAhPT0gdGhpcy5lbGVtZW50RHR5cGUpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcihgVGVuc29yTGlzdCBkdHlwZSBpcyAke1xuICAgICAgICAgIHRoaXMuZWxlbWVudER0eXBlfSBidXQgY29uY2F0IHJlcXVlc3RlZCBkdHlwZSAke2VsZW1lbnREdHlwZX1gKTtcbiAgICB9XG5cbiAgICBhc3NlcnRTaGFwZXNNYXRjaEFsbG93VW5kZWZpbmVkU2l6ZShcbiAgICAgICAgdGhpcy5lbGVtZW50U2hhcGUsIGVsZW1lbnRTaGFwZSwgJ1RlbnNvckxpc3Qgc2hhcGUgbWlzbWF0Y2g6ICcpO1xuICAgIGNvbnN0IG91dHB1dEVsZW1lbnRTaGFwZSA9XG4gICAgICAgIGluZmVyRWxlbWVudFNoYXBlKHRoaXMuZWxlbWVudFNoYXBlLCB0aGlzLnRlbnNvcnMsIGVsZW1lbnRTaGFwZSk7XG5cbiAgICBpZiAodGhpcy5zaXplKCkgPT09IDApIHtcbiAgICAgIHJldHVybiB0ZW5zb3IoW10sIFswXS5jb25jYXQob3V0cHV0RWxlbWVudFNoYXBlKSk7XG4gICAgfVxuICAgIHJldHVybiB0aWR5KCgpID0+IHtcbiAgICAgIGNvbnN0IHRlbnNvcnMgPSB0aGlzLnRlbnNvcnMubWFwKHQgPT4gcmVzaGFwZSh0LCBvdXRwdXRFbGVtZW50U2hhcGUpKTtcbiAgICAgIHJldHVybiBjb25jYXQodGVuc29ycywgMCk7XG4gICAgfSk7XG4gIH1cbn1cblxuLyoqXG4gKiBDcmVhdGVzIGEgVGVuc29yTGlzdCB3aGljaCwgd2hlbiBzdGFja2VkLCBoYXMgdGhlIHZhbHVlIG9mIHRlbnNvci5cbiAqIEBwYXJhbSB0ZW5zb3IgZnJvbSB0ZW5zb3JcbiAqIEBwYXJhbSBlbGVtZW50U2hhcGUgb3V0cHV0IHRlbnNvciBlbGVtZW50IHNoYXBlXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBmcm9tVGVuc29yKFxuICAgIHRlbnNvcjogVGVuc29yLCBlbGVtZW50U2hhcGU6IG51bWJlcltdLCBlbGVtZW50RHR5cGU6IERhdGFUeXBlKSB7XG4gIGNvbnN0IGR0eXBlID0gdGVuc29yLmR0eXBlO1xuICBpZiAodGVuc29yLnNoYXBlLmxlbmd0aCA8IDEpIHtcbiAgICB0aHJvdyBuZXcgRXJyb3IoXG4gICAgICAgIGBUZW5zb3IgbXVzdCBiZSBhdCBsZWFzdCBhIHZlY3RvciwgYnV0IHNhdyBzaGFwZTogJHt0ZW5zb3Iuc2hhcGV9YCk7XG4gIH1cbiAgaWYgKHRlbnNvci5kdHlwZSAhPT0gZWxlbWVudER0eXBlKSB7XG4gICAgdGhyb3cgbmV3IEVycm9yKGBJbnZhbGlkIGRhdGEgdHlwZXM7IG9wIGVsZW1lbnRzICR7XG4gICAgICAgIHRlbnNvci5kdHlwZX0sIGJ1dCBsaXN0IGVsZW1lbnRzICR7ZWxlbWVudER0eXBlfWApO1xuICB9XG4gIGNvbnN0IHRlbnNvckVsZW1lbnRTaGFwZSA9IHRlbnNvci5zaGFwZS5zbGljZSgxKTtcbiAgYXNzZXJ0U2hhcGVzTWF0Y2hBbGxvd1VuZGVmaW5lZFNpemUoXG4gICAgICB0ZW5zb3JFbGVtZW50U2hhcGUsIGVsZW1lbnRTaGFwZSwgJ1RlbnNvckxpc3Qgc2hhcGUgbWlzbWF0Y2g6ICcpO1xuICBjb25zdCB0ZW5zb3JMaXN0OiBUZW5zb3JbXSA9IHVuc3RhY2sodGVuc29yKTtcbiAgcmV0dXJuIG5ldyBUZW5zb3JMaXN0KHRlbnNvckxpc3QsIGVsZW1lbnRTaGFwZSwgZHR5cGUpO1xufVxuXG4vKipcbiAqIFJldHVybiBhIFRlbnNvckxpc3Qgb2YgdGhlIGdpdmVuIHNpemUgd2l0aCBlbXB0eSBlbGVtZW50cy5cbiAqIEBwYXJhbSBlbGVtZW50U2hhcGUgdGhlIHNoYXBlIG9mIHRoZSBmdXR1cmUgZWxlbWVudHMgb2YgdGhlIGxpc3RcbiAqIEBwYXJhbSBlbGVtZW50RHR5cGUgdGhlIGRlc2lyZWQgdHlwZSBvZiBlbGVtZW50cyBpbiB0aGUgbGlzdFxuICogQHBhcmFtIG51bUVsZW1lbnRzIHRoZSBudW1iZXIgb2YgZWxlbWVudHMgdG8gcmVzZXJ2ZVxuICogQHBhcmFtIG1heE51bUVsZW1lbnRzIHRoZSBtYXhpbXVtIG51bWJlciBvZiBlbGVtZW50cyBpbiB0aCBsaXN0XG4gKi9cbmV4cG9ydCBmdW5jdGlvbiByZXNlcnZlKFxuICAgIGVsZW1lbnRTaGFwZTogbnVtYmVyW10sIGVsZW1lbnREdHlwZTogRGF0YVR5cGUsIG51bUVsZW1lbnRzOiBudW1iZXIsXG4gICAgbWF4TnVtRWxlbWVudHM6IG51bWJlcikge1xuICByZXR1cm4gbmV3IFRlbnNvckxpc3QoW10sIGVsZW1lbnRTaGFwZSwgZWxlbWVudER0eXBlLCBtYXhOdW1FbGVtZW50cyk7XG59XG5cbi8qKlxuICogUHV0IHRlbnNvcnMgYXQgc3BlY2lmaWMgaW5kaWNlcyBvZiBhIHN0YWNrZWQgdGVuc29yIGludG8gYSBUZW5zb3JMaXN0LlxuICogQHBhcmFtIGluZGljZXMgbGlzdCBvZiBpbmRpY2VzIG9uIGhvdyB0byBzY2F0dGVyIHRoZSB0ZW5zb3IuXG4gKiBAcGFyYW0gdGVuc29yIGlucHV0IHRlbnNvci5cbiAqIEBwYXJhbSBlbGVtZW50U2hhcGUgdGhlIHNoYXBlIG9mIHRoZSBmdXR1cmUgZWxlbWVudHMgb2YgdGhlIGxpc3RcbiAqIEBwYXJhbSBudW1FbGVtZW50cyB0aGUgbnVtYmVyIG9mIGVsZW1lbnRzIHRvIHNjYXR0ZXJcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHNjYXR0ZXIoXG4gICAgdGVuc29yOiBUZW5zb3IsIGluZGljZXM6IG51bWJlcltdLCBlbGVtZW50U2hhcGU6IG51bWJlcltdLFxuICAgIG51bUVsZW1lbnRzPzogbnVtYmVyKTogVGVuc29yTGlzdCB7XG4gIGlmIChpbmRpY2VzLmxlbmd0aCAhPT0gdGVuc29yLnNoYXBlWzBdKSB7XG4gICAgdGhyb3cgbmV3IEVycm9yKGBFeHBlY3RlZCBsZW4oaW5kaWNlcykgPT0gdGVuc29yLnNoYXBlWzBdLCBidXQgc2F3OiAke1xuICAgICAgICBpbmRpY2VzLmxlbmd0aH0gdnMuICR7dGVuc29yLnNoYXBlWzBdfWApO1xuICB9XG5cbiAgY29uc3QgbWF4SW5kZXggPSBNYXRoLm1heCguLi5pbmRpY2VzKTtcblxuICBpZiAobnVtRWxlbWVudHMgIT0gbnVsbCAmJiBudW1FbGVtZW50cyAhPT0gLTEgJiYgbWF4SW5kZXggPj0gbnVtRWxlbWVudHMpIHtcbiAgICB0aHJvdyBuZXcgRXJyb3IoXG4gICAgICAgIGBNYXggaW5kZXggbXVzdCBiZSA8IGFycmF5IHNpemUgKCR7bWF4SW5kZXh9ICB2cy4gJHtudW1FbGVtZW50c30pYCk7XG4gIH1cblxuICBjb25zdCBsaXN0ID0gbmV3IFRlbnNvckxpc3QoW10sIGVsZW1lbnRTaGFwZSwgdGVuc29yLmR0eXBlLCBudW1FbGVtZW50cyk7XG4gIGNvbnN0IHRlbnNvcnMgPSB1bnN0YWNrKHRlbnNvciwgMCk7XG4gIGluZGljZXMuZm9yRWFjaCgodmFsdWUsIGluZGV4KSA9PiB7XG4gICAgbGlzdC5zZXRJdGVtKHZhbHVlLCB0ZW5zb3JzW2luZGV4XSk7XG4gIH0pO1xuICByZXR1cm4gbGlzdDtcbn1cblxuLyoqXG4gKiBTcGxpdCB0aGUgdmFsdWVzIG9mIGEgVGVuc29yIGludG8gYSBUZW5zb3JMaXN0LlxuICogQHBhcmFtIGxlbmd0aCB0aGUgbGVuZ3RocyB0byB1c2Ugd2hlbiBzcGxpdHRpbmcgdmFsdWUgYWxvbmdcbiAqICAgIGl0cyBmaXJzdCBkaW1lbnNpb24uXG4gKiBAcGFyYW0gdGVuc29yIHRoZSB0ZW5zb3IgdG8gc3BsaXQuXG4gKiBAcGFyYW0gZWxlbWVudFNoYXBlIHRoZSBzaGFwZSBvZiB0aGUgZnV0dXJlIGVsZW1lbnRzIG9mIHRoZSBsaXN0XG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBzcGxpdChcbiAgICB0ZW5zb3I6IFRlbnNvciwgbGVuZ3RoOiBudW1iZXJbXSwgZWxlbWVudFNoYXBlOiBudW1iZXJbXSkge1xuICBsZXQgdG90YWxMZW5ndGggPSAwO1xuICBjb25zdCBjdW11bGF0aXZlTGVuZ3RocyA9IGxlbmd0aC5tYXAobGVuID0+IHtcbiAgICB0b3RhbExlbmd0aCArPSBsZW47XG4gICAgcmV0dXJuIHRvdGFsTGVuZ3RoO1xuICB9KTtcblxuICBpZiAodG90YWxMZW5ndGggIT09IHRlbnNvci5zaGFwZVswXSkge1xuICAgIHRocm93IG5ldyBFcnJvcihgRXhwZWN0ZWQgc3VtIG9mIGxlbmd0aHMgdG8gYmUgZXF1YWwgdG9cbiAgICAgICAgICB0ZW5zb3Iuc2hhcGVbMF0sIGJ1dCBzdW0gb2YgbGVuZ3RocyBpc1xuICAgICAgICAke3RvdGFsTGVuZ3RofSwgYW5kIHRlbnNvcidzIHNoYXBlIGlzOiAke3RlbnNvci5zaGFwZX1gKTtcbiAgfVxuXG4gIGNvbnN0IHNoYXBlV2l0aG91dEZpcnN0RGltID0gdGVuc29yLnNoYXBlLnNsaWNlKDEpO1xuICBjb25zdCBvdXRwdXRFbGVtZW50U2hhcGUgPVxuICAgICAgbWVyZ2VFbGVtZW50U2hhcGUoc2hhcGVXaXRob3V0Rmlyc3REaW0sIGVsZW1lbnRTaGFwZSk7XG4gIGNvbnN0IGVsZW1lbnRQZXJSb3cgPSB0b3RhbExlbmd0aCA9PT0gMCA/IDAgOiB0ZW5zb3Iuc2l6ZSAvIHRvdGFsTGVuZ3RoO1xuICBjb25zdCB0ZW5zb3JzOiBUZW5zb3JbXSA9IHRpZHkoKCkgPT4ge1xuICAgIGNvbnN0IHRlbnNvcnMgPSBbXTtcbiAgICB0ZW5zb3IgPSByZXNoYXBlKHRlbnNvciwgWzEsIHRvdGFsTGVuZ3RoLCBlbGVtZW50UGVyUm93XSk7XG4gICAgZm9yIChsZXQgaSA9IDA7IGkgPCBsZW5ndGgubGVuZ3RoOyArK2kpIHtcbiAgICAgIGNvbnN0IHByZXZpb3VzTGVuZ3RoID0gKGkgPT09IDApID8gMCA6IGN1bXVsYXRpdmVMZW5ndGhzW2kgLSAxXTtcbiAgICAgIGNvbnN0IGluZGljZXMgPSBbMCwgcHJldmlvdXNMZW5ndGgsIDBdO1xuICAgICAgY29uc3Qgc2l6ZXMgPSBbMSwgbGVuZ3RoW2ldLCBlbGVtZW50UGVyUm93XTtcbiAgICAgIHRlbnNvcnNbaV0gPSByZXNoYXBlKFxuICAgICAgICAgIHNsaWNlKHRlbnNvciwgaW5kaWNlcywgc2l6ZXMpLCBvdXRwdXRFbGVtZW50U2hhcGUgYXMgbnVtYmVyW10pO1xuICAgIH1cbiAgICB0ZW5zb3IuZGlzcG9zZSgpO1xuICAgIHJldHVybiB0ZW5zb3JzO1xuICB9KTtcblxuICBjb25zdCBsaXN0ID0gbmV3IFRlbnNvckxpc3QoW10sIGVsZW1lbnRTaGFwZSwgdGVuc29yLmR0eXBlLCBsZW5ndGgubGVuZ3RoKTtcblxuICBmb3IgKGxldCBpID0gMDsgaSA8IHRlbnNvcnMubGVuZ3RoOyBpKyspIHtcbiAgICBsaXN0LnNldEl0ZW0oaSwgdGVuc29yc1tpXSk7XG4gIH1cbiAgcmV0dXJuIGxpc3Q7XG59XG4iXX0=","/**\n * @license\n * Copyright 2018 Google LLC. All Rights Reserved.\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n * =============================================================================\n */\nimport { scalar } from '@tensorflow/tfjs-core';\nimport { TensorArray } from '../../executor/tensor_array';\nimport { fromTensor, reserve, scatter, split } from '../../executor/tensor_list';\nimport { cloneTensor, getParamValue, getTensor } from './utils';\nexport const executeOp = async (node, tensorMap, context) => {\n switch (node.op) {\n case 'If':\n case 'StatelessIf': {\n const thenFunc = getParamValue('thenBranch', node, tensorMap, context);\n const elseFunc = getParamValue('elseBranch', node, tensorMap, context);\n const cond = getParamValue('cond', node, tensorMap, context);\n const args = getParamValue('args', node, tensorMap, context);\n const condValue = await cond.data();\n if (condValue[0]) {\n return context.functionMap[thenFunc].executeFunctionAsync(args, context.tensorArrayMap, context.tensorListMap);\n }\n else {\n return context.functionMap[elseFunc].executeFunctionAsync(args, context.tensorArrayMap, context.tensorListMap);\n }\n }\n case 'While':\n case 'StatelessWhile': {\n const bodyFunc = getParamValue('body', node, tensorMap, context);\n const condFunc = getParamValue('cond', node, tensorMap, context);\n const args = getParamValue('args', node, tensorMap, context);\n // Calculate the condition of the loop\n const condResult = (await context.functionMap[condFunc].executeFunctionAsync(args, context.tensorArrayMap, context.tensorListMap));\n const argIds = args.map(tensor => tensor.id);\n let condValue = await condResult[0].data();\n // Dispose the intermediate tensors for condition function\n condResult.forEach(tensor => {\n if (!tensor.kept && argIds.indexOf(tensor.id) === -1) {\n tensor.dispose();\n }\n });\n let result = args;\n while (condValue[0]) {\n // Record the previous result for intermediate tensor tracking\n const origResult = result;\n // Execution the body of the loop\n result = await context.functionMap[bodyFunc].executeFunctionAsync(result, context.tensorArrayMap, context.tensorListMap);\n const resultIds = result.map(tensor => tensor.id);\n // Dispose the intermediate tensor for body function that is not global\n // kept, not input/output of the body function\n origResult.forEach(tensor => {\n if (!tensor.kept && argIds.indexOf(tensor.id) === -1 &&\n resultIds.indexOf(tensor.id) === -1) {\n tensor.dispose();\n }\n });\n // Recalcuate the condition of the loop using the latest results.\n const condResult = (await context.functionMap[condFunc].executeFunctionAsync(result, context.tensorArrayMap, context.tensorListMap));\n condValue = await condResult[0].data();\n // Dispose the intermediate tensors for condition function\n condResult.forEach(tensor => {\n if (!tensor.kept && argIds.indexOf(tensor.id) === -1 &&\n resultIds.indexOf(tensor.id) === -1) {\n tensor.dispose();\n }\n });\n }\n return result;\n }\n case 'LoopCond': {\n const pred = getParamValue('pred', node, tensorMap, context);\n return [cloneTensor(pred)];\n }\n case 'Switch': {\n const pred = getParamValue('pred', node, tensorMap, context);\n let data = getParamValue('data', node, tensorMap, context);\n if (!data.kept) {\n data = cloneTensor(data);\n }\n // Outputs nodes :0 => false, :1 => true\n return (await pred.data())[0] ? [undefined, data] : [data, undefined];\n }\n case 'Merge': {\n const inputName = node.inputNames.find(name => getTensor(name, tensorMap, context) !== undefined);\n if (inputName) {\n const data = getTensor(inputName, tensorMap, context);\n return [cloneTensor(data)];\n }\n return undefined;\n }\n case 'Enter': {\n const frameId = getParamValue('frameName', node, tensorMap, context);\n const data = getParamValue('tensor', node, tensorMap, context);\n context.enterFrame(frameId);\n return [cloneTensor(data)];\n }\n case 'Exit': {\n const data = getParamValue('tensor', node, tensorMap, context);\n context.exitFrame();\n return [cloneTensor(data)];\n }\n case 'NextIteration': {\n const data = getParamValue('tensor', node, tensorMap, context);\n context.nextIteration();\n return [cloneTensor(data)];\n }\n case 'TensorArrayV3': {\n const size = getParamValue('size', node, tensorMap, context);\n const dtype = getParamValue('dtype', node, tensorMap, context);\n const elementShape = getParamValue('elementShape', node, tensorMap, context);\n const dynamicSize = getParamValue('dynamicSize', node, tensorMap, context);\n const clearAfterRead = getParamValue('clearAfterRead', node, tensorMap, context);\n const identicalElementShapes = getParamValue('identicalElementShapes', node, tensorMap, context);\n const name = getParamValue('name', node, tensorMap, context);\n const tensorArray = new TensorArray(name, dtype, size, elementShape, identicalElementShapes, dynamicSize, clearAfterRead);\n context.addTensorArray(tensorArray);\n return [tensorArray.idTensor, scalar(1.0)];\n }\n case 'TensorArrayWriteV3': {\n const id = getParamValue('tensorArrayId', node, tensorMap, context);\n const index = getParamValue('index', node, tensorMap, context);\n const writeTensor = getParamValue('tensor', node, tensorMap, context);\n const writeTensorArray = context.getTensorArray(id.id);\n writeTensorArray.write(index, writeTensor);\n return [writeTensorArray.idTensor];\n }\n case 'TensorArrayReadV3': {\n const readId = getParamValue('tensorArrayId', node, tensorMap, context);\n const readIndex = getParamValue('index', node, tensorMap, context);\n const readTensorArray = context.getTensorArray(readId.id);\n return [readTensorArray.read(readIndex)];\n }\n case 'TensorArrayGatherV3': {\n const gatherId = getParamValue('tensorArrayId', node, tensorMap, context);\n const gatherIndices = getParamValue('indices', node, tensorMap, context);\n const gatherDtype = getParamValue('dtype', node, tensorMap, context);\n const gatherTensorArray = context.getTensorArray(gatherId.id);\n return [gatherTensorArray.gather(gatherIndices, gatherDtype)];\n }\n case 'TensorArrayScatterV3': {\n const scatterId = getParamValue('tensorArrayId', node, tensorMap, context);\n const scatterIndices = getParamValue('indices', node, tensorMap, context);\n const scatterTensor = getParamValue('tensor', node, tensorMap, context);\n const scatterTensorArray = context.getTensorArray(scatterId.id);\n scatterTensorArray.scatter(scatterIndices, scatterTensor);\n return [scatterTensorArray.idTensor];\n }\n case 'TensorArrayConcatV3': {\n const concatId = getParamValue('tensorArrayId', node, tensorMap, context);\n const concatTensorArray = context.getTensorArray(concatId.id);\n const concatDtype = getParamValue('dtype', node, tensorMap, context);\n return [concatTensorArray.concat(concatDtype)];\n }\n case 'TensorArraySplitV3': {\n const splitId = getParamValue('tensorArrayId', node, tensorMap, context);\n const splitTensor = getParamValue('tensor', node, tensorMap, context);\n const lengths = getParamValue('lengths', node, tensorMap, context);\n const splitTensorArray = context.getTensorArray(splitId.id);\n splitTensorArray.split(lengths, splitTensor);\n return [splitTensorArray.idTensor];\n }\n case 'TensorArraySizeV3': {\n const sizeId = getParamValue('tensorArrayId', node, tensorMap, context);\n const sizeTensorArray = context.getTensorArray(sizeId.id);\n return [scalar(sizeTensorArray.size(), 'int32')];\n }\n case 'TensorArrayCloseV3': {\n const closeId = getParamValue('tensorArrayId', node, tensorMap, context);\n const closeTensorArray = context.getTensorArray(closeId.id);\n closeTensorArray.clearAndClose();\n return [closeTensorArray.idTensor];\n }\n case 'TensorListSetItem': {\n const idTensor = getParamValue('tensorListId', node, tensorMap, context);\n const index = getParamValue('index', node, tensorMap, context);\n const writeTensor = getParamValue('tensor', node, tensorMap, context);\n const tensorList = context.getTensorList(idTensor.id);\n tensorList.setItem(index, writeTensor);\n return [tensorList.idTensor];\n }\n case 'TensorListGetItem': {\n const idTensor = getParamValue('tensorListId', node, tensorMap, context);\n const readIndex = getParamValue('index', node, tensorMap, context);\n const elementShape = getParamValue('elementShape', node, tensorMap, context);\n const elementDType = getParamValue('elementDType', node, tensorMap, context);\n const tensorList = context.getTensorList(idTensor.id);\n return [tensorList.getItem(readIndex, elementShape, elementDType)];\n }\n case 'TensorListScatterV2':\n case 'TensorListScatter': {\n const scatterIndices = getParamValue('indices', node, tensorMap, context);\n const scatterTensor = getParamValue('tensor', node, tensorMap, context);\n const elementShape = getParamValue('elementShape', node, tensorMap, context);\n const numElements = getParamValue('numElements', node, tensorMap, context);\n const tensorList = scatter(scatterTensor, scatterIndices, elementShape, numElements);\n context.addTensorList(tensorList);\n return [tensorList.idTensor];\n }\n case 'TensorListReserve':\n case 'EmptyTensorList': {\n const elementShape = getParamValue('elementShape', node, tensorMap, context);\n const elementDtype = getParamValue('elementDType', node, tensorMap, context);\n let numElementsParam;\n if (node.op === 'TensorListReserve') {\n numElementsParam = 'numElements';\n }\n else {\n numElementsParam = 'maxNumElements';\n }\n const numElements = getParamValue(numElementsParam, node, tensorMap, context);\n const maxNumElements = node.op === 'TensorListReserve' ? -1 : numElements;\n const tensorList = reserve(elementShape, elementDtype, numElements, maxNumElements);\n context.addTensorList(tensorList);\n return [tensorList.idTensor];\n }\n case 'TensorListGather': {\n const gatherId = getParamValue('tensorListId', node, tensorMap, context);\n const gatherIndices = getParamValue('indices', node, tensorMap, context);\n const elementShape = getParamValue('elementShape', node, tensorMap, context);\n const elementDtype = getParamValue('elementDType', node, tensorMap, context);\n const tensorList = context.getTensorList(gatherId.id);\n return [tensorList.gather(gatherIndices, elementDtype, elementShape)];\n }\n case 'TensorListStack': {\n const idTensor = getParamValue('tensorListId', node, tensorMap, context);\n const elementShape = getParamValue('elementShape', node, tensorMap, context);\n const elementDtype = getParamValue('elementDType', node, tensorMap, context);\n const numElements = getParamValue('numElements', node, tensorMap, context);\n const tensorList = context.getTensorList(idTensor.id);\n return [tensorList.stack(elementShape, elementDtype, numElements)];\n }\n case 'TensorListFromTensor': {\n const tensor = getParamValue('tensor', node, tensorMap, context);\n const elementShape = getParamValue('elementShape', node, tensorMap, context);\n const elementDtype = getParamValue('elementDType', node, tensorMap, context);\n const tensorList = fromTensor(tensor, elementShape, elementDtype);\n context.addTensorList(tensorList);\n return [tensorList.idTensor];\n }\n case 'TensorListConcat':\n case 'TensorListConcatV2': {\n const concatId = getParamValue('tensorListId', node, tensorMap, context);\n const tensorList = context.getTensorList(concatId.id);\n const concatDtype = getParamValue('dtype', node, tensorMap, context);\n const elementShape = getParamValue('elementShape', node, tensorMap, context);\n return [tensorList.concat(concatDtype, elementShape)];\n }\n case 'TensorListPushBack': {\n const idTensor = getParamValue('tensorListId', node, tensorMap, context);\n const writeTensor = getParamValue('tensor', node, tensorMap, context);\n const tensorList = context.getTensorList(idTensor.id);\n tensorList.pushBack(writeTensor);\n return [tensorList.idTensor];\n }\n case 'TensorListPopBack': {\n const idTensor = getParamValue('tensorListId', node, tensorMap, context);\n const elementShape = getParamValue('elementShape', node, tensorMap, context);\n const elementDType = getParamValue('elementDType', node, tensorMap, context);\n const tensorList = context.getTensorList(idTensor.id);\n return [tensorList.popBack(elementShape, elementDType)];\n }\n case 'TensorListSplit': {\n const splitTensor = getParamValue('tensor', node, tensorMap, context);\n const elementShape = getParamValue('elementShape', node, tensorMap, context);\n const lengths = getParamValue('lengths', node, tensorMap, context);\n const tensorList = split(splitTensor, lengths, elementShape);\n context.addTensorList(tensorList);\n return [tensorList.idTensor];\n }\n case 'TensorListLength': {\n const idTensor = getParamValue('tensorListId', node, tensorMap, context);\n const tensorList = context.getTensorList(idTensor.id);\n return [scalar(tensorList.size(), 'int32')];\n }\n case 'TensorListResize': {\n const idTensor = getParamValue('tensorListId', node, tensorMap, context);\n const size = getParamValue('size', node, tensorMap, context);\n const srcTensorList = context.getTensorList(idTensor.id);\n const destTensorList = srcTensorList.resize(size);\n context.addTensorList(destTensorList);\n return [destTensorList.idTensor];\n }\n default:\n throw TypeError(`Node type ${node.op} is not implemented`);\n }\n};\nexport const CATEGORY = 'control';\n//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY29udHJvbF9leGVjdXRvci5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uLy4uLy4uL3RmanMtY29udmVydGVyL3NyYy9vcGVyYXRpb25zL2V4ZWN1dG9ycy9jb250cm9sX2V4ZWN1dG9yLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBOzs7Ozs7Ozs7Ozs7Ozs7R0FlRztBQUVILE9BQU8sRUFBVyxNQUFNLEVBQVMsTUFBTSx1QkFBdUIsQ0FBQztBQUkvRCxPQUFPLEVBQUMsV0FBVyxFQUFDLE1BQU0sNkJBQTZCLENBQUM7QUFDeEQsT0FBTyxFQUFDLFVBQVUsRUFBRSxPQUFPLEVBQUUsT0FBTyxFQUFFLEtBQUssRUFBQyxNQUFNLDRCQUE0QixDQUFDO0FBRy9FLE9BQU8sRUFBQyxXQUFXLEVBQUUsYUFBYSxFQUFFLFNBQVMsRUFBQyxNQUFNLFNBQVMsQ0FBQztBQUU5RCxNQUFNLENBQUMsTUFBTSxTQUFTLEdBQTRCLEtBQUssRUFDbkQsSUFBVSxFQUFFLFNBQTBCLEVBQ3RDLE9BQXlCLEVBQXFCLEVBQUU7SUFDbEQsUUFBUSxJQUFJLENBQUMsRUFBRSxFQUFFO1FBQ2YsS0FBSyxJQUFJLENBQUM7UUFDVixLQUFLLGFBQWEsQ0FBQyxDQUFDO1lBQ2xCLE1BQU0sUUFBUSxHQUNWLGFBQWEsQ0FBQyxZQUFZLEVBQUUsSUFBSSxFQUFFLFNBQVMsRUFBRSxPQUFPLENBQVcsQ0FBQztZQUNwRSxNQUFNLFFBQVEsR0FDVixhQUFhLENBQUMsWUFBWSxFQUFFLElBQUksRUFBRSxTQUFTLEVBQUUsT0FBTyxDQUFXLENBQUM7WUFDcEUsTUFBTSxJQUFJLEdBQUcsYUFBYSxDQUFDLE1BQU0sRUFBRSxJQUFJLEVBQUUsU0FBUyxFQUFFLE9BQU8sQ0FBVyxDQUFDO1lBQ3ZFLE1BQU0sSUFBSSxHQUFHLGFBQWEsQ0FBQyxNQUFNLEVBQUUsSUFBSSxFQUFFLFNBQVMsRUFBRSxPQUFPLENBQWEsQ0FBQztZQUN6RSxNQUFNLFNBQVMsR0FB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LEVBQUUsRUFBRSxPQUFPLENBQUMsQ0FBQyxDQUFDO1NBQzdDO1FBQ0QsS0FBSyxrQkFBa0IsQ0FBQyxDQUFDO1lBQ3ZCLE1BQU0sUUFBUSxHQUNWLGFBQWEsQ0FBQyxjQUFjLEVBQUUsSUFBSSxFQUFFLFNBQVMsRUFBRSxPQUFPLENBQVcsQ0FBQztZQUN0RSxNQUFNLElBQUksR0FBRyxhQUFhLENBQUMsTUFBTSxFQUFFLElBQUksRUFBRSxTQUFTLEVBQUUsT0FBTyxDQUFXLENBQUM7WUFFdkUsTUFBTSxhQUFhLEdBQUcsT0FBTyxDQUFDLGFBQWEsQ0FBQyxRQUFRLENBQUMsRUFBRSxDQUFDLENBQUM7WUFDekQsTUFBTSxjQUFjLEdBQUcsYUFBYSxDQUFDLE1BQU0sQ0FBQyxJQUFJLENBQUMsQ0FBQztZQUNsRCxPQUFPLENBQUMsYUFBYSxDQUFDLGNBQWMsQ0FBQyxDQUFDO1lBQ3RDLE9BQU8sQ0FBQyxjQUFjLENBQUMsUUFBUSxDQUFDLENBQUM7U0FDbEM7UUFDRDtZQUNFLE1BQU0sU0FBUyxDQUFDLGFBQWEsSUFBSSxDQUFDLEVBQUUscUJBQXFCLENBQUMsQ0FBQztLQUM5RDtBQUNILENBQUMsQ0FBQztBQUVGLE1BQU0sQ0FBQyxNQUFNLFFBQVEsR0FBRyxTQUFTLENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyIvKipcbiAqIEBsaWNlbnNlXG4gKiBDb3B5cmlnaHQgMjAxOCBHb29nbGUgTExDLiBBbGwgUmlnaHRzIFJlc2VydmVkLlxuICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlIFwiTGljZW5zZVwiKTtcbiAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS5cbiAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdFxuICpcbiAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMFxuICpcbiAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmVcbiAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuIFwiQVMgSVNcIiBCQVNJUyxcbiAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLlxuICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZFxuICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuXG4gKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuICovXG5cbmltcG9ydCB7RGF0YVR5cGUsIHNjYWxhciwgVGVuc29yfSBmcm9tICdAdGVuc29yZmxvdy90ZmpzLWNvcmUnO1xuXG5pbXBvcnQge05hbWVkVGVuc29yc01hcH0gZnJvbSAnLi4vLi4vZGF0YS90eXBlcyc7XG5pbXBvcnQge0V4ZWN1dGlvbkNvbnRleHR9IGZyb20gJy4uLy4uL2V4ZWN1dG9yL2V4ZWN1dGlvbl9jb250ZXh0JztcbmltcG9ydCB7VGVuc29yQXJyYXl9IGZyb20gJy4uLy4uL2V4ZWN1dG9yL3RlbnNvcl9hcnJheSc7XG5pbXBvcnQge2Zyb21UZW5zb3IsIHJlc2VydmUsIHNjYXR0ZXIsIHNwbGl0fSBmcm9tICcuLi8uLi9leGVjdXRvci90ZW5zb3JfbGlzdCc7XG5pbXBvcnQge0ludGVybmFsT3BBc3luY0V4ZWN1dG9yLCBOb2RlfSBmcm9tICcuLi90eXBlcyc7XG5cbmltcG9ydCB7Y2xvbmVUZW5zb3IsIGdldFBhcmFtVmFsdWUsIGdldFRlbnNvcn0gZnJvbSAnLi91dGlscyc7XG5cbmV4cG9ydCBjb25zdCBleGVjdXRlT3A6IEludGVybmFsT3BBc3luY0V4ZWN1dG9yID0gYXN5bmMoXG4gICAgbm9kZTogTm9kZSwgdGVuc29yTWFwOiBOYW1lZFRlbnNvcnNNYXAsXG4gICAgY29udGV4dDogRXhlY3V0aW9uQ29udGV4dCk6IFByb21pc2U8VGVuc29yW10+ID0+IHtcbiAgc3dpdGNoIChub2RlLm9wKSB7XG4gICAgY2FzZSAnSWYnOlxuICAgIGNhc2UgJ1N0YXRlbGVzc0lmJzoge1xuICAgICAgY29uc3QgdGhlbkZ1bmMgPVxuICAgICAgICAgIGdldFBhcmFtVmFsdWUoJ3RoZW5CcmFuY2gnLCBub2RlLCB0ZW5zb3JNYXAsIGNvbnRleHQpIGFzIHN0cmluZztcbiAgICAgIGNvbnN0IGVsc2VGdW5jID1cbiAgICAgICAgICBnZXRQYXJhbVZhbHVlKCdlbHNlQnJhbmNoJywgbm9kZSwgdGVuc29yTWFwLCBjb250ZXh0KSBhcyBzdHJpbmc7XG4gICAgICBjb25zdCBjb25kID0gZ2V0UGFyYW1WYWx1ZSgnY29uZCcsIG5vZGUsIHRlbnNvck1hcCwgY29udGV4dCkgYXMgVGVuc29yO1xuICAgICAgY29uc3QgYXJncyA9IGdldFBhcmFtVmFsdWUoJ2FyZ3MnLCBub2RlLCB0ZW5zb3JNYXAsIGNvbnRleHQpIGFzIFRlbnNvcltdO1xuICAgICAgY29uc3QgY29uZFZhbHVlID0gYXdhaXQgY29uZC5kYXRhKCk7XG4gICAgICBpZiAoY29uZFZhbHVlWzBdKSB7XG4gICAgICAgIHJldHVybiBjb250ZXh0LmZ1bmN0aW9uTWFwW3RoZW5GdW5jXS5leGVjdXRlRnVuY3Rpb25Bc3luYyhcbiAgICAgICAgICAgIGFyZ3MsIGNvbnRleHQudGVuc29yQXJyYXlNYXAsIGNvbnRleHQudGVuc29yTGlzdE1hcCk7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICByZXR1cm4gY29udGV4dC5mdW5jdGlvbk1hcFtlbHNlRnVuY10uZXhlY3V0ZUZ1bmN0aW9uQXN5bmMoXG4gICAgICAgICAgICBhcmdzLCBjb250ZXh0LnRlbnNvckFycmF5TWFwLCBjb250ZXh0LnRlbnNvckxpc3RNYXApO1xuICAgICAgfVxuICAgIH1cbiAgICBjYXNlICdXaGlsZSc6XG4gICAgY2FzZSAnU3RhdGVsZXNzV2hpbGUnOiB7XG4gICAgICBjb25zdCBib2R5RnVuYyA9XG4gICAgICAgICAgZ2V0UGFyYW1WYWx1ZSgnYm9keScsIG5vZGUsIHRlbnNvck1hcCwgY29udGV4dCkgYXMgc3RyaW5nO1xuICAgICAgY29uc3QgY29uZEZ1bmMgPVxuICAgICAgICAgIGdldFBhcmFtVmFsdWUoJ2NvbmQnLCBub2RlLCB0ZW5zb3JNYXAsIGNvbnRleHQpIGFzIHN0cmluZztcbiAgICAgIGNvbnN0IGFyZ3MgPSBnZXRQYXJhbVZhbHVlKCdhcmdzJywgbm9kZSwgdGVuc29yTWFwLCBjb250ZXh0KSBhcyBUZW5zb3JbXTtcblxuICAgICAgLy8gQ2FsY3VsYXRlIHRoZSBjb25kaXRpb24gb2YgdGhlIGxvb3BcbiAgICAgIGNvbnN0IGNvbmRSZXN1bHQgPVxuICAgICAgICAgIChhd2FpdCBjb250ZXh0LmZ1bmN0aW9uTWFwW2NvbmRGdW5jXS5leGVjdXRlRnVuY3Rpb25Bc3luYyhcbiAgICAgICAgICAgICAgYXJncywgY29udGV4dC50ZW5zb3JBcnJheU1hcCwgY29udGV4dC50ZW5zb3JMaXN0TWFwKSk7XG4gICAgICBjb25zdCBhcmdJZHMgPSBhcmdzLm1hcCh0ZW5zb3IgPT4gdGVuc29yLmlkKTtcbiAgICAgIGxldCBjb25kVmFsdWUgPSBhd2FpdCBjb25kUmVzdWx0WzBdLmRhdGEoKTtcbiAgICAgIC8vIERpc3Bvc2UgdGhlIGludGVybWVkaWF0ZSB0ZW5zb3JzIGZvciBjb25kaXRpb24gZnVuY3Rpb25cbiAgICAgIGNvbmRSZXN1bHQuZm9yRWFjaCh0ZW5zb3IgPT4ge1xuICAgICAgICBpZiAoIXRlbnNvci5rZXB0ICYmIGFyZ0lkcy5pbmRleE9mKHRlbnNvci5pZCkgPT09IC0xKSB7XG4gICAgICAgICAgdGVuc29yLmRpc3Bvc2UoKTtcbiAgICAgICAgfVxuICAgICAgfSk7XG5cbiAgICAgIGxldCByZXN1bHQ6IFRlbnNvcltdID0gYXJncztcblxuICAgICAgd2hpbGUgKGNvbmRWYWx1ZVswXSkge1xuICAgICAgICAvLyBSZWNvcmQgdGhlIHByZXZpb3VzIHJlc3VsdCBmb3IgaW50ZXJtZWRpYXRlIHRlbnNvciB0cmFja2luZ1xuICAgICAgICBjb25zdCBvcmlnUmVzdWx0ID0gcmVzdWx0O1xuICAgICAgICAvLyBFeGVjdXRpb24gdGhlIGJvZHkgb2YgdGhlIGxvb3BcbiAgICAgICAgcmVzdWx0ID0gYXdhaXQgY29udGV4dC5mdW5jdGlvbk1hcFtib2R5RnVuY10uZXhlY3V0ZUZ1bmN0aW9uQXN5bmMoXG4gICAgICAgICAgICByZXN1bHQsIGNvbnRleHQudGVuc29yQXJyYXlNYXAsIGNvbnRleHQudGVuc29yTGlzdE1hcCk7XG4gICAgICAgIGNvbnN0IHJlc3VsdElkcyA9IHJlc3VsdC5tYXAodGVuc29yID0+IHRlbnNvci5pZCk7XG5cbiAgICAgICAgLy8gRGlzcG9zZSB0aGUgaW50ZXJtZWRpYXRlIHRlbnNvciBmb3IgYm9keSBmdW5jdGlvbiB0aGF0IGlzIG5vdCBnbG9iYWxcbiAgICAgICAgLy8ga2VwdCwgbm90IGlucHV0L291dHB1dCBvZiB0aGUgYm9keSBmdW5jdGlvblxuICAgICAgICBvcmlnUmVzdWx0LmZvckVhY2godGVuc29yID0+IHtcbiAgICAgICAgICBpZiAoIXRlbnNvci5rZXB0ICYmIGFyZ0lkcy5pbmRleE9mKHRlbnNvci5pZCkgPT09IC0xICYmXG4gICAgICAgICAgICAgIHJlc3VsdElkcy5pbmRleE9mKHRlbnNvci5pZCkgPT09IC0xKSB7XG4gICAgICAgICAgICB0ZW5zb3IuZGlzcG9zZSgpO1xuICAgICAgICAgIH1cbiAgICAgICAgfSk7XG5cbiAgICAgICAgLy8gUmVjYWxjdWF0ZSB0aGUgY29uZGl0aW9uIG9mIHRoZSBsb29wIHVzaW5nIHRoZSBsYXRlc3QgcmVzdWx0cy5cbiAgICAgICAgY29uc3QgY29uZFJlc3VsdCA9XG4gICAgICAgICAgICAoYXdhaXQgY29udGV4dC5mdW5jdGlvbk1hcFtjb25kRnVuY10uZXhlY3V0ZUZ1bmN0aW9uQXN5bmMoXG4gICAgICAgICAgICAgICAgcmVzdWx0LCBjb250ZXh0LnRlbnNvckFycmF5TWFwLCBjb250ZXh0LnRlbnNvckxpc3RNYXApKTtcbiAgICAgICAgY29uZFZhbHVlID0gYXdhaXQgY29uZFJlc3VsdFswXS5kYXRhKCk7XG4gICAgICAgIC8vIERpc3Bvc2UgdGhlIGludGVybWVkaWF0ZSB0ZW5zb3JzIGZvciBjb25kaXRpb24gZnVuY3Rpb25cbiAgICAgICAgY29uZFJlc3VsdC5mb3JFYWNoKHRlbnNvciA9PiB7XG4gICAgICAgICAgaWYgKCF0ZW5zb3Iua2VwdCAmJiBhcmdJZHMuaW5kZXhPZih0ZW5zb3IuaWQpID09PSAtMSAmJlxuICAgICAgICAgICAgICByZXN1bHRJZHMuaW5kZXhPZih0ZW5zb3IuaWQpID09PSAtMSkge1xuICAgICAgICAgICAgdGVuc29yLmRpc3Bvc2UoKTtcbiAgICAgICAgICB9XG4gICAgICAgIH0pO1xuICAgICAgfVxuICAgICAgcmV0dXJuIHJlc3VsdDtcbiAgICB9XG4gICAgY2FzZSAnTG9vcENvbmQnOiB7XG4gICAgICBjb25zdCBwcmVkID0gZ2V0UGFyYW1WYWx1ZSgncHJlZCcsIG5vZGUsIHRlbnNvck1hcCwgY29udGV4dCkgYXMgVGVuc29yO1xuICAgICAgcmV0dXJuIFtjbG9uZVRlbnNvcihwcmVkKV07XG4gICAgfVxuICAgIGNhc2UgJ1N3aXRjaCc6IHtcbiAgICAgIGNvbnN0IHByZWQgPSBnZXRQYXJhbVZhbHVlKCdwcmVkJywgbm9kZSwgdGVuc29yTWFwLCBjb250ZXh0KSBhcyBUZW5zb3I7XG4gICAgICBsZXQgZGF0YSA9IGdldFBhcmFtVmFsdWUoJ2RhdGEnLCBub2RlLCB0ZW5zb3JNYXAsIGNvbnRleHQpIGFzIFRlbnNvcjtcbiAgICAgIGlmICghZGF0YS5rZXB0KSB7XG4gICAgICAgIGRhdGEgPSBjbG9uZVRlbnNvcihkYXRhKTtcbiAgICAgIH1cbiAgICAgIC8vIE91dHB1dHMgbm9kZXMgOjAgPT4gZmFsc2UsIDoxID0+IHRydWVcbiAgICAgIHJldHVybiAoYXdhaXQgcHJlZC5kYXRhKCkpWzBdID8gW3VuZGVmaW5lZCwgZGF0YV0gOiBbZGF0YSwgdW5kZWZpbmVkXTtcbiAgICB9XG4gICAgY2FzZSAnTWVyZ2UnOiB7XG4gICAgICBjb25zdCBpbnB1dE5hbWUgPSBub2RlLmlucHV0TmFtZXMuZmluZChcbiAgICAgICAgICBuYW1lID0+IGdldFRlbnNvcihuYW1lLCB0ZW5zb3JNYXAsIGNvbnRleHQpICE9PSB1bmRlZmluZWQpO1xuICAgICAgaWYgKGlucHV0TmFtZSkge1xuICAgICAgICBjb25zdCBkYXRhID0gZ2V0VGVuc29yKGlucHV0TmFtZSwgdGVuc29yTWFwLCBjb250ZXh0KTtcbiAgICAgICAgcmV0dXJuIFtjbG9uZVRlbnNvcihkYXRhKV07XG4gICAgICB9XG4gICAgICByZXR1cm4gdW5kZWZpbmVkO1xuICAgIH1cbiAgICBjYXNlICdFbnRlcic6IHtcbiAgICAgIGNvbnN0IGZyYW1lSWQgPVxuICAgICAgICAgIGdldFBhcmFtVmFsdWUoJ2ZyYW1lTmFtZScsIG5vZGUsIHRlbnNvck1hcCwgY29udGV4dCkgYXMgc3RyaW5nO1xuICAgICAgY29uc3QgZGF0YSA9IGdldFBhcmFtVmFsdWUoJ3RlbnNvcicsIG5vZGUsIHRlbnNvck1hcCwgY29udGV4dCkgYXMgVGVuc29yO1xuICAgICAgY29udGV4dC5lbnRlckZyYW1lKGZyYW1lSWQpO1xuICAgICAgcmV0dXJuIFtjbG9uZVRlbnNvcihkYXRhKV07XG4gICAgfVxuICAgIGNhc2UgJ0V4aXQnOiB7XG4gICAgICBjb25zdCBkYXRhID0gZ2V0UGFyYW1WYWx1ZSgndGVuc29yJywgbm9kZSwgdGVuc29yTWFwLCBjb250ZXh0KSBhcyBUZW5zb3I7XG4gICAgICBjb250ZXh0LmV4aXRGcmFtZSgpO1xuICAgICAgcmV0dXJuIFtjbG9uZVRlbnNvcihkYXRhKV07XG4gICAgfVxuICAgIGNhc2UgJ05leHRJdGVyYXRpb24nOiB7XG4gICAgICBjb25zdCBkYXRhID0gZ2V0UGFyYW1WYWx1ZSgndGVuc29yJywgbm9kZSwgdGVuc29yTWFwLCBjb250ZXh0KSBhcyBUZW5zb3I7XG4gICAgICBjb250ZXh0Lm5leHRJdGVyYXRpb24oKTtcbiAgICAgIHJldHVybiBbY2xvbmVUZW5zb3IoZGF0YSldO1xuICAgIH1cbiAgICBjYXNlICdUZW5zb3JBcnJheVYzJzoge1xuICAgICAgY29uc3Qgc2l6ZSA9IGdldFBhcmFtVmFsdWUoJ3NpemUnLCBub2RlLCB0ZW5zb3JNYXAsIGNvbnRleHQpIGFzIG51bWJlcjtcbiAgICAgIGNvbnN0IGR0eXBlID1cbiAgICAgICAgICBnZXRQYXJhbVZhbHVlKCdkdHlwZScsIG5vZGUsIHRlbnNvck1hcCwgY29udGV4dCkgYXMgRGF0YVR5cGU7XG4gICAgICBjb25zdCBlbGVtZW50U2hhcGUgPVxuICAgICAgICAgIGdldFBhcmFtVmFsdWUoJ2VsZW1lbnRTaGFwZScsIG5vZGUsIHRlbnNvck1hcCwgY29udGV4dCkgYXMgbnVtYmVyW107XG4gICAgICBjb25zdCBkeW5hbWljU2l6ZSA9XG4gICAgICAgICAgZ2V0UGFyYW1WYWx1ZSgnZHluYW1pY1NpemUnLCBub2RlLCB0ZW5zb3JNYXAsIGNvbnRleHQpIGFzIGJvb2xlYW47XG4gICAgICBjb25zdCBjbGVhckFmdGVyUmVhZCA9XG4gICAgICAgICAgZ2V0UGFyYW1WYWx1ZSgnY2xlYXJBZnRlclJlYWQnLCBub2RlLCB0ZW5zb3JNYXAsIGNvbnRleHQpIGFzIGJvb2xlYW47XG4gICAgICBjb25zdCBpZGVudGljYWxFbGVtZW50U2hhcGVzID1cbiAgICAgICAgICBnZXRQYXJhbVZhbHVlKCdpZGVudGljYWxFbGVtZW50U2hhcGVzJywgbm9kZSwgdGVuc29yTWFwLCBjb250ZXh0KSBhc1xuICAgICAgICAgIGJvb2xlYW47XG4gICAgICBjb25zdCBuYW1lID0gZ2V0UGFyYW1WYWx1ZSgnbmFtZScsIG5vZGUsIHRlbnNvck1hcCwgY29udGV4dCkgYXMgc3RyaW5nO1xuICAgICAgY29uc3QgdGVuc29yQXJyYXkgPSBuZXcgVGVuc29yQXJyYXkoXG4gICAgICAgICAgbmFtZSwgZHR5cGUsIHNpemUsIGVsZW1lbnRTaGFwZSwgaWRlbnRpY2FsRWxlbWVudFNoYXBlcywgZHluYW1pY1NpemUsXG4gICAgICAgICAgY2xlYXJBZnRlclJlYWQpO1xuICAgICAgY29udGV4dC5hZGRUZW5zb3JBcnJheSh0ZW5zb3JBcnJheSk7XG4gICAgICByZXR1cm4gW3RlbnNvckFycmF5LmlkVGVuc29yLCBzY2FsYXIoMS4wKV07XG4gICAgfVxuICAgIGNhc2UgJ1RlbnNvckFycmF5V3JpdGVWMyc6IHtcbiAgICAgIGNvbnN0IGlkID1cbiAgICAgICAgICBnZXRQYXJhbVZhbHVlKCd0ZW5zb3JBcnJheUlkJywgbm9kZSwgdGVuc29yTWFwLCBjb250ZXh0KSBhcyBUZW5zb3I7XG4gICAgICBjb25zdCBpbmRleCA9IGdldFBhcmFtVmFsdWUoJ2luZGV4Jywgbm9kZSwgdGVuc29yTWFwLCBjb250ZXh0KSBhcyBudW1iZXI7XG4gICAgICBjb25zdCB3cml0ZVRlbnNvciA9XG4gICAgICAgICAgZ2V0UGFyYW1WYWx1ZSgndGVuc29yJywgbm9kZSwgdGVuc29yTWFwLCBjb250ZXh0KSBhcyBUZW5zb3I7XG4gICAgICBjb25zdCB3cml0ZVRlbnNvckFycmF5ID0gY29udGV4dC5nZXRUZW5zb3JBcnJheShpZC5pZCk7XG4gICAgICB3cml0ZVRlbnNvckFycmF5LndyaXRlKGluZGV4LCB3cml0ZVRlbnNvcik7XG4gICAgICByZXR1cm4gW3dyaXRlVGVuc29yQXJyYXkuaWRUZW5zb3JdO1xuICAgIH1cbiAgICBjYXNlICdUZW5zb3JBcnJheVJlYWRWMyc6IHtcbiAgICAgIGNvbnN0IHJlYWRJZCA9XG4gICAgICAgICAgZ2V0UGFyYW1WYWx1ZSgndGVuc29yQXJyYXlJZCcsIG5vZGUsIHRlbnNvck1hcCwgY29udGV4dCkgYXMgVGVuc29yO1xuICAgICAgY29uc3QgcmVhZEluZGV4ID1cbiAgICAgICAgICBnZXRQYXJhbVZhbHVlKCdpbmRleCcsIG5vZGUsIHRlbnNvck1hcCwgY29udGV4dCkgYXMgbnVtYmVyO1xuICAgICAgY29uc3QgcmVhZFRlbnNvckFycmF5ID0gY29udGV4dC5nZXRUZW5zb3JBcnJheShyZWFkSWQuaWQpO1xuICAgICAgcmV0dXJuIFtyZWFkVGVuc29yQXJyYXkucmVhZChyZWFkSW5kZXgpXTtcbiAgICB9XG4gICAgY2FzZSAnVGVuc29yQXJyYXlHYXRoZXJWMyc6IHtcbiAgICAgIGNvbnN0IGdhdGhlcklkID1cbiAgICAgICAgICBnZXRQYXJhbVZhbHVlKCd0ZW5zb3JBcnJheUlkJywgbm9kZSwgdGVuc29yTWFwLCBjb250ZXh0KSBhcyBUZW5zb3I7XG4gICAgICBjb25zdCBnYXRoZXJJbmRpY2VzID1cbiAgICAgICAgICBnZXRQYXJhbVZhbHVlKCdpbmRpY2VzJywgbm9kZSwgdGVuc29yTWFwLCBjb250ZXh0KSBhcyBudW1iZXJbXTtcbiAgICAgIGNvbnN0IGdhdGhlckR0eXBlID1cbiAgICAgICAgICBnZXRQYXJhbVZhbHVlKCdkdHlwZScsIG5vZGUsIHRlbnNvck1hcCwgY29udGV4dCkgYXMgRGF0YVR5cGU7XG4gICAgICBjb25zdCBnYXRoZXJUZW5zb3JBcnJheSA9IGNvbnRleHQuZ2V0VGVuc29yQXJyYXkoZ2F0aGVySWQuaWQpO1xuICAgICAgcmV0dXJuIFtnYXRoZXJUZW5zb3JBcnJheS5nYXRoZXIoZ2F0aGVySW5kaWNlcywgZ2F0aGVyRHR5cGUpXTtcbiAgICB9XG4gICAgY2FzZSAnVGVuc29yQXJyYXlTY2F0dGVyVjMnOiB7XG4gICAgICBjb25zdCBzY2F0dGVySWQgPVxuICAgICAgICAgIGdldFBhcmFtVmFsdWUoJ3RlbnNvckFycmF5SWQnLCBub2RlLCB0ZW5zb3JNYXAsIGNvbnRleHQpIGFzIFRlbnNvcjtcbiAgICAgIGNvbnN0IHNjYXR0ZXJJbmRpY2VzID1cbiAgICAgICAgICBnZXRQYXJhbVZhbHVlKCdpbmRpY2VzJywgbm9kZSwgdGVuc29yTWFwLCBjb250ZXh0KSBhcyBudW1iZXJbXTtcbiAgICAgIGNvbnN0IHNjYXR0ZXJUZW5zb3IgPVxuICAgICAgICAgIGdldFBhcmFtVmFsdWUoJ3RlbnNvcicsIG5vZGUsIHRlbnNvck1hcCwgY29udGV4dCkgYXMgVGVuc29yO1xuICAgICAgY29uc3Qgc2NhdHRlclRlbnNvckFycmF5ID0gY29udGV4dC5nZXRUZW5zb3JBcnJheShzY2F0dGVySWQuaWQpO1xuICAgICAgc2NhdHRlclRlbnNvckFycmF5LnNjYXR0ZXIoc2NhdHRlckluZGljZXMsIHNjYXR0ZXJUZW5zb3IpO1xuICAgICAgcmV0dXJuIFtzY2F0dGVyVGVuc29yQXJyYXkuaWRUZW5zb3JdO1xuICAgIH1cbiAgICBjYXNlICdUZW5zb3JBcnJheUNvbmNhdFYzJzoge1xuICAgICAgY29uc3QgY29uY2F0SWQgPVxuICAgICAgICAgIGdldFBhcmFtVmFsdWUoJ3RlbnNvckFycmF5SWQnLCBub2RlLCB0ZW5zb3JNYXAsIGNvbnRleHQpIGFzIFRlbnNvcjtcbiAgICAgIGNvbnN0IGNvbmNhdFRlbnNvckFycmF5ID0gY29udGV4dC5nZXRUZW5zb3JBcnJheShjb25jYXRJZC5pZCk7XG4gICAgICBjb25zdCBjb25jYXREdHlwZSA9XG4gICAgICAgICAgZ2V0UGFyYW1WYWx1ZSgnZHR5cGUnLCBub2RlLCB0ZW5zb3JNYXAsIGNvbnRleHQpIGFzIERhdGFUeXBlO1xuICAgICAgcmV0dXJuIFtjb25jYXRUZW5zb3JBcnJheS5jb25jYXQoY29uY2F0RHR5cGUpXTtcbiAgICB9XG4gICAgY2FzZSAnVGVuc29yQXJyYXlTcGxpdFYzJzoge1xuICAgICAgY29uc3Qgc3BsaXRJZCA9XG4gICAgICAgICAgZ2V0UGFyYW1WYWx1ZSgndGVuc29yQXJyYXlJZCcsIG5vZGUsIHRlbnNvck1hcCwgY29udGV4dCkgYXMgVGVuc29yO1xuICAgICAgY29uc3Qgc3BsaXRUZW5zb3IgPVxuICAgICAgICAgIGdldFBhcmFtVmFsdWUoJ3RlbnNvcicsIG5vZGUsIHRlbnNvck1hcCwgY29udGV4dCkgYXMgVGVuc29yO1xuICAgICAgY29uc3QgbGVuZ3RocyA9XG4gICAgICAgICAgZ2V0UGFyYW1WYWx1ZSgnbGVuZ3RocycsIG5vZGUsIHRlbnNvck1hcCwgY29udGV4dCkgYXMgbnVtYmVyW107XG4gICAgICBjb25zdCBzcGxpdFRlbnNvckFycmF5ID0gY29udGV4dC5nZXRUZW5zb3JBcnJheShzcGxpdElkLmlkKTtcbiAgICAgIHNwbGl0VGVuc29yQXJyYXkuc3BsaXQobGVuZ3Rocywgc3BsaXRUZW5zb3IpO1xuICAgICAgcmV0dXJuIFtzcGxpdFRlbnNvckFycmF5LmlkVGVuc29yXTtcbiAgICB9XG4gICAgY2FzZSAnVGVuc29yQXJyYXlTaXplVjMnOiB7XG4gICAgICBjb25zdCBzaXplSWQgPVxuICAgICAgICAgIGdldFBhcmFtVmFsdWUoJ3RlbnNvckFycmF5SWQnLCBub2RlLCB0ZW5zb3JNYXAsIGNvbnRleHQpIGFzIFRlbnNvcjtcbiAgICAgIGNvbnN0IHNpemVUZW5zb3JBcnJheSA9IGNvbnRleHQuZ2V0VGVuc29yQXJyYXkoc2l6ZUlkLmlkKTtcbiAgICAgIHJldHVybiBbc2NhbGFyKHNpemVUZW5zb3JBcnJheS5zaXplKCksICdpbnQzMicpXTtcbiAgICB9XG4gICAgY2FzZSAnVGVuc29yQXJyYXlDbG9zZVYzJzoge1xuICAgICAgY29uc3QgY2xvc2VJZCA9XG4gICAgICAgICAgZ2V0UGFyYW1WYWx1ZSgndGVuc29yQXJyYXlJZCcsIG5vZGUsIHRlbnNvck1hcCwgY29udGV4dCkgYXMgVGVuc29yO1xuICAgICAgY29uc3QgY2xvc2VUZW5zb3JBcnJheSA9IGNvbnRleHQuZ2V0VGVuc29yQXJyYXkoY2xvc2VJZC5pZCk7XG4gICAgICBjbG9zZVRlbnNvckFycmF5LmNsZWFyQW5kQ2xvc2UoKTtcbiAgICAgIHJldHVybiBbY2xvc2VUZW5zb3JBcnJheS5pZFRlbnNvcl07XG4gICAgfVxuICAgIGNhc2UgJ1RlbnNvckxpc3RTZXRJdGVtJzoge1xuICAgICAgY29uc3QgaWRUZW5zb3IgPVxuICAgICAgICAgIGdldFBhcmFtVmFsdWUoJ3RlbnNvckxpc3RJZCcsIG5vZGUsIHRlbnNvck1hcCwgY29udGV4dCkgYXMgVGVuc29yO1xuICAgICAgY29uc3QgaW5kZXggPSBnZXRQYXJhbVZhbHVlKCdpbmRleCcsIG5vZGUsIHRlbnNvck1hcCwgY29udGV4dCkgYXMgbnVtYmVyO1xuICAgICAgY29uc3Qgd3JpdGVUZW5zb3IgPVxuICAgICAgICAgIGdldFBhcmFtVmFsdWUoJ3RlbnNvcicsIG5vZGUsIHRlbnNvck1hcCwgY29udGV4dCkgYXMgVGVuc29yO1xuICAgICAgY29uc3QgdGVuc29yTGlzdCA9IGNvbnRleHQuZ2V0VGVuc29yTGlzdChpZFRlbnNvci5pZCk7XG4gICAgICB0ZW5zb3JMaXN0LnNldEl0ZW0oaW5kZXgsIHdyaXRlVGVuc29yKTtcbiAgICAgIHJldHVybiBbdGVuc29yTGlzdC5pZFRlbnNvcl07XG4gICAgfVxuICAgIGNhc2UgJ1RlbnNvckxpc3RHZXRJdGVtJzoge1xuICAgICAgY29uc3QgaWRUZW5zb3IgPVxuICAgICAgICAgIGdldFBhcmFtVmFsdWUoJ3RlbnNvckxpc3RJZCcsIG5vZGUsIHRlbnNvck1hcCwgY29udGV4dCkgYXMgVGVuc29yO1xuICAgICAgY29uc3QgcmVhZEluZGV4ID1cbiAgICAgICAgICBnZXRQYXJhbVZhbHVlKCdpbmRleCcsIG5vZGUsIHRlbnNvck1hcCwgY29udGV4dCkgYXMgbnVtYmVyO1xuICAgICAgY29uc3QgZWxlbWVudFNoYXBlID1cbiAgICAgICAgICBnZXRQYXJhbVZhbHVlKCdlbGVtZW50U2hhcGUnLCBub2RlLCB0ZW5zb3JNYXAsIGNvbnRleHQpIGFzIG51bWJlcltdO1xuXG4gICAgICBjb25zdCBlbGVtZW50RFR5cGUgPVxuICAgICAgICAgIGdldFBhcmFtVmFsdWUoJ2VsZW1lbnREVHlwZScsIG5vZGUsIHRlbnNvck1hcCwgY29udGV4dCkgYXMgRGF0YVR5cGU7XG4gICAgICBjb25zdCB0ZW5zb3JMaXN0ID0gY29udGV4dC5nZXRUZW5zb3JMaXN0KGlkVGVuc29yLmlkKTtcbiAgICAgIHJldHVybiBbdGVuc29yTGlzdC5nZXRJdGVtKHJlYWRJbmRleCwgZWxlbWVudFNoYXBlLCBlbGVtZW50RFR5cGUpXTtcbiAgICB9XG4gICAgY2FzZSAnVGVuc29yTGlzdFNjYXR0ZXJWMic6XG4gICAgY2FzZSAnVGVuc29yTGlzdFNjYXR0ZXInOiB7XG4gICAgICBjb25zdCBzY2F0dGVySW5kaWNlcyA9XG4gICAgICAgICAgZ2V0UGFyYW1WYWx1ZSgnaW5kaWNlcycsIG5vZGUsIHRlbnNvck1hcCwgY29udGV4dCkgYXMgbnVtYmVyW107XG4gICAgICBjb25zdCBzY2F0dGVyVGVuc29yID1cbiAgICAgICAgICBnZXRQYXJhbVZhbHVlKCd0ZW5zb3InLCBub2RlLCB0ZW5zb3JNYXAsIGNvbnRleHQpIGFzIFRlbnNvcjtcbiAgICAgIGNvbnN0IGVsZW1lbnRTaGFwZSA9XG4gICAgICAgICAgZ2V0UGFyYW1WYWx1ZSgnZWxlbWVudFNoYXBlJywgbm9kZSwgdGVuc29yTWFwLCBjb250ZXh0KSBhcyBudW1iZXJbXTtcbiAgICAgIGNvbnN0IG51bUVsZW1lbnRzID1cbiAgICAgICAgICBnZXRQYXJhbVZhbHVlKCdudW1FbGVtZW50cycsIG5vZGUsIHRlbnNvck1hcCwgY29udGV4dCkgYXMgbnVtYmVyO1xuICAgICAgY29uc3QgdGVuc29yTGlzdCA9XG4gICAgICAgICAgc2NhdHRlcihzY2F0dGVyVGVuc29yLCBzY2F0dGVySW5kaWNlcywgZWxlbWVudFNoYXBlLCBudW1FbGVtZW50cyk7XG4gICAgICBjb250ZXh0LmFkZFRlbnNvckxpc3QodGVuc29yTGlzdCk7XG4gICAgICByZXR1cm4gW3RlbnNvckxpc3QuaWRUZW5zb3JdO1xuICAgIH1cbiAgICBjYXNlICdUZW5zb3JMaXN0UmVzZXJ2ZSc6XG4gICAgY2FzZSAnRW1wdHlUZW5zb3JMaXN0Jzoge1xuICAgICAgY29uc3QgZWxlbWVudFNoYXBlID1cbiAgICAgICAgICBnZXRQYXJhbVZhbHVlKCdlbGVtZW50U2hhcGUnLCBub2RlLCB0ZW5zb3JNYXAsIGNvbnRleHQpIGFzIG51bWJlcltdO1xuICAgICAgY29uc3QgZWxlbWVudER0eXBlID1cbiAgICAgICAgICBnZXRQYXJhbVZhbHVlKCdlbGVtZW50RFR5cGUnLCBub2RlLCB0ZW5zb3JNYXAsIGNvbnRleHQpIGFzIERhdGFUeXBlO1xuICAgICAgbGV0IG51bUVsZW1lbnRzUGFyYW07XG5cbiAgICAgIGlmIChub2RlLm9wID09PSAnVGVuc29yTGlzdFJlc2VydmUnKSB7XG4gICAgICAgIG51bUVsZW1lbnRzUGFyYW0gPSAnbnVtRWxlbWVudHMnO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgbnVtRWxlbWVudHNQYXJhbSA9ICdtYXhOdW1FbGVtZW50cyc7XG4gICAgICB9XG5cbiAgICAgIGNvbnN0IG51bUVsZW1lbnRzID1cbiAgICAgICAgICBnZXRQYXJhbVZhbHVlKG51bUVsZW1lbnRzUGFyYW0sIG5vZGUsIHRlbnNvck1hcCwgY29udGV4dCkgYXMgbnVtYmVyO1xuICAgICAgY29uc3QgbWF4TnVtRWxlbWVudHMgPSBub2RlLm9wID09PSAnVGVuc29yTGlzdFJlc2VydmUnID8gLTEgOiBudW1FbGVtZW50cztcbiAgICAgIGNvbnN0IHRlbnNvckxpc3QgPVxuICAgICAgICAgIHJlc2VydmUoZWxlbWVudFNoYXBlLCBlbGVtZW50RHR5cGUsIG51bUVsZW1lbnRzLCBtYXhOdW1FbGVtZW50cyk7XG4gICAgICBjb250ZXh0LmFkZFRlbnNvckxpc3QodGVuc29yTGlzdCk7XG4gICAgICByZXR1cm4gW3RlbnNvckxpc3QuaWRUZW5zb3JdO1xuICAgIH1cbiAgICBjYXNlICdUZW5zb3JMaXN0R2F0aGVyJzoge1xuICAgICAgY29uc3QgZ2F0aGVySWQgPVxuICAgICAgICAgIGdldFBhcmFtVmFsdWUoJ3RlbnNvckxpc3RJZCcsIG5vZGUsIHRlbnNvck1hcCwgY29udGV4dCkgYXMgVGVuc29yO1xuICAgICAgY29uc3QgZ2F0aGVySW5kaWNlcyA9XG4gICAgICAgICAgZ2V0UGFyYW1WYWx1ZSgnaW5kaWNlcycsIG5vZGUsIHRlbnNvck1hcCwgY29udGV4dCkgYXMgbnVtYmVyW107XG4gICAgICBjb25zdCBlbGVtZW50U2hhcGUgPVxuICAgICAgICAgIGdldFBhcmFtVmFsdWUoJ2VsZW1lbnRTaGFwZScsIG5vZGUsIHRlbnNvck1hcCwgY29udGV4dCkgYXMgbnVtYmVyW107XG4gICAgICBjb25zdCBlbGVtZW50RHR5cGUgPVxuICAgICAgICAgIGdldFBhcmFtVmFsdWUoJ2VsZW1lbnREVHlwZScsIG5vZGUsIHRlbnNvck1hcCwgY29udGV4dCkgYXMgRGF0YVR5cGU7XG4gICAgICBjb25zdCB0ZW5zb3JMaXN0ID0gY29udGV4dC5nZXRUZW5zb3JMaXN0KGdhdGhlcklkLmlkKTtcbiAgICAgIHJldHVybiBbdGVuc29yTGlzdC5nYXRoZXIoZ2F0aGVySW5kaWNlcywgZWxlbWVudER0eXBlLCBlbGVtZW50U2hhcGUpXTtcbiAgICB9XG4gICAgY2FzZSAnVGVuc29yTGlzdFN0YWNrJzoge1xuICAgICAgY29uc3QgaWRUZW5zb3IgPVxuICAgICAgICAgIGdldFBhcmFtVmFsdWUoJ3RlbnNvckxpc3RJZCcsIG5vZGUsIHRlbnNvck1hcCwgY29udGV4dCkgYXMgVGVuc29yO1xuICAgICAgY29uc3QgZWxlbWVudFNoYXBlID1cbiAgICAgICAgICBnZXRQYXJhbVZhbHVlKCdlbGVtZW50U2hhcGUnLCBub2RlLCB0ZW5zb3JNYXAsIGNvbnRleHQpIGFzIG51bWJlcltdO1xuICAgICAgY29uc3QgZWxlbWVudER0eXBlID1cbiAgICAgICAgICBnZXRQYXJhbVZhbHVlKCdlbGVtZW50RFR5cGUnLCBub2RlLCB0ZW5zb3JNYXAsIGNvbnRleHQpIGFzIERhdGFUeXBlO1xuICAgICAgY29uc3QgbnVtRWxlbWVudHMgPVxuICAgICAgICAgIGdldFBhcmFtVmFsdWUoJ251bUVsZW1lbnRzJywgbm9kZSwgdGVuc29yTWFwLCBjb250ZXh0KSBhcyBudW1iZXI7XG4gICAgICBjb25zdCB0ZW5zb3JMaXN0ID0gY29udGV4dC5nZXRUZW5zb3JMaXN0KGlkVGVuc29yLmlkKTtcbiAgICAgIHJldHVybiBbdGVuc29yTGlzdC5zdGFjayhlbGVtZW50U2hhcGUsIGVsZW1lbnREdHlwZSwgbnVtRWxlbWVudHMpXTtcbiAgICB9XG4gICAgY2FzZSAnVGVuc29yTGlzdEZyb21UZW5zb3InOiB7XG4gICAgICBjb25zdCB0ZW5zb3IgPVxuICAgICAgICAgIGdldFBhcmFtVmFsdWUoJ3RlbnNvcicsIG5vZGUsIHRlbnNvck1hcCwgY29udGV4dCkgYXMgVGVuc29yO1xuICAgICAgY29uc3QgZWxlbWVudFNoYXBlID1cbiAgICAgICAgICBnZXRQYXJhbVZhbHVlKCdlbGVtZW50U2hhcGUnLCBub2RlLCB0ZW5zb3JNYXAsIGNvbnRleHQpIGFzIG51bWJlcltdO1xuICAgICAgY29uc3QgZWxlbWVudER0eXBlID1cbiAgICAgICAgICBnZXRQYXJhbVZhbHVlKCdlbGVtZW50RFR5cGUnLCBub2RlLCB0ZW5zb3JNYXAsIGNvbnRleHQpIGFzIERhdGFUeXBlO1xuICAgICAgY29uc3QgdGVuc29yTGlzdCA9IGZyb21UZW5zb3IodGVuc29yLCBlbGVtZW50U2hhcGUsIGVsZW1lbnREdHlwZSk7XG4gICAgICBjb250ZXh0LmFkZFRlbnNvckxpc3QodGVuc29yTGlzdCk7XG4gICAgICByZXR1cm4gW3RlbnNvckxpc3QuaWRUZW5zb3JdO1xuICAgIH1cbiAgICBjYXNlICdUZW5zb3JMaXN0Q29uY2F0JzpcbiAgICBjYXNlICdUZW5zb3JMaXN0Q29uY2F0VjInOiB7XG4gICAgICBjb25zdCBjb25jYXRJZCA9XG4gICAgICAgICAgZ2V0UGFyYW1WYWx1ZSgndGVuc29yTGlzdElkJywgbm9kZSwgdGVuc29yTWFwLCBjb250ZXh0KSBhcyBUZW5zb3I7XG4gICAgICBjb25zdCB0ZW5zb3JMaXN0ID0gY29udGV4dC5nZXRUZW5zb3JMaXN0KGNvbmNhdElkLmlkKTtcbiAgICAgIGNvbnN0IGNvbmNhdER0eXBlID1cbiAgICAgICAgICBnZXRQYXJhbVZhbHVlKCdkdHlwZScsIG5vZGUsIHRlbnNvck1hcCwgY29udGV4dCkgYXMgRGF0YVR5cGU7XG4gICAgICBjb25zdCBlbGVtZW50U2hhcGUgPVxuICAgICAgICAgIGdldFBhcmFtVmFsdWUoJ2VsZW1lbnRTaGFwZScsIG5vZGUsIHRlbnNvck1hcCwgY29udGV4dCkgYXMgbnVtYmVyW107XG4gICAgICByZXR1cm4gW3RlbnNvckxpc3QuY29uY2F0KGNvbmNhdER0eXBlLCBlbGVtZW50U2hhcGUpXTtcbiAgICB9XG4gICAgY2FzZSAnVGVuc29yTGlzdFB1c2hCYWNrJzoge1xuICAgICAgY29uc3QgaWRUZW5zb3IgPVxuICAgICAgICAgIGdldFBhcmFtVmFsdWUoJ3RlbnNvckxpc3RJZCcsIG5vZGUsIHRlbnNvck1hcCwgY29udGV4dCkgYXMgVGVuc29yO1xuICAgICAgY29uc3Qgd3JpdGVUZW5zb3IgPVxuICAgICAgICAgIGdldFBhcmFtVmFsdWUoJ3RlbnNvcicsIG5vZGUsIHRlbnNvck1hcCwgY29udGV4dCkgYXMgVGVuc29yO1xuICAgICAgY29uc3QgdGVuc29yTGlzdCA9IGNvbnRleHQuZ2V0VGVuc29yTGlzdChpZFRlbnNvci5pZCk7XG4gICAgICB0ZW5zb3JMaXN0LnB1c2hCYWNrKHdyaXRlVGVuc29yKTtcbiAgICAgIHJldHVybiBbdGVuc29yTGlzdC5pZFRlbnNvcl07XG4gICAgfVxuICAgIGNhc2UgJ1RlbnNvckxpc3RQb3BCYWNrJzoge1xuICAgICAgY29uc3QgaWRUZW5zb3IgPVxuICAgICAgICAgIGdldFBhcmFtVmFsdWUoJ3RlbnNvckxpc3RJZCcsIG5vZGUsIHRlbnNvck1hcCwgY29udGV4dCkgYXMgVGVuc29yO1xuICAgICAgY29uc3QgZWxlbWVudFNoYXBlID1cbiAgICAgICAgICBnZXRQYXJhbVZhbHVlKCdlbGVtZW50U2hhcGUnLCBub2RlLCB0ZW5zb3JNYXAsIGNvbnRleHQpIGFzIG51bWJlcltdO1xuICAgICAgY29uc3QgZWxlbWVudERUeXBlID1cbiAgICAgICAgICBnZXRQYXJhbVZhbHVlKCdlbGVtZW50RFR5cGUnLCBub2RlLCB0ZW5zb3JNYXAsIGNvbnRleHQpIGFzIERhdGFUeXBlO1xuICAgICAgY29uc3QgdGVuc29yTGlzdCA9IGNvbnRleHQuZ2V0VGVuc29yTGlzdChpZFRlbnNvci5pZCk7XG4gICAgICByZXR1cm4gW3RlbnNvckxpc3QucG9wQmFjayhlbGVtZW50U2hhcGUsIGVsZW1lbnREVHlwZSldO1xuICAgIH1cbiAgICBjYXNlICdUZW5zb3JMaXN0U3BsaXQnOiB7XG4gICAgICBjb25zdCBzcGxpdFRlbnNvciA9XG4gICAgICAgICAgZ2V0UGFyYW1WYWx1ZSgndGVuc29yJywgbm9kZSwgdGVuc29yTWFwLCBjb250ZXh0KSBhcyBUZW5zb3I7XG4gICAgICBjb25zdCBlbGVtZW50U2hhcGUgPVxuICAgICAgICAgIGdldFBhcmFtVmFsdWUoJ2VsZW1lbnRTaGFwZScsIG5vZGUsIHRlbnNvck1hcCwgY29udGV4dCkgYXMgbnVtYmVyW107XG4gICAgICBjb25zdCBsZW5ndGhzID1cbiAgICAgICAgICBnZXRQYXJhbVZhbHVlKCdsZW5ndGhzJywgbm9kZSwgdGVuc29yTWFwLCBjb250ZXh0KSBhcyBudW1iZXJbXTtcblxuICAgICAgY29uc3QgdGVuc29yTGlzdCA9IHNwbGl0KHNwbGl0VGVuc29yLCBsZW5ndGhzLCBlbGVtZW50U2hhcGUpO1xuICAgICAgY29udGV4dC5hZGRUZW5zb3JMaXN0KHRlbnNvckxpc3QpO1xuICAgICAgcmV0dXJuIFt0ZW5zb3JMaXN0LmlkVGVuc29yXTtcbiAgICB9XG4gICAgY2FzZSAnVGVuc29yTGlzdExlbmd0aCc6IHtcbiAgICAgIGNvbnN0IGlkVGVuc29yID1cbiAgICAgICAgICBnZXRQYXJhbVZhbHVlKCd0ZW5zb3JMaXN0SWQnLCBub2RlLCB0ZW5zb3JNYXAsIGNvbnRleHQpIGFzIFRlbnNvcjtcbiAgICAgIGNvbnN0IHRlbnNvckxpc3QgPSBjb250ZXh0LmdldFRlbnNvckxpc3QoaWRUZW5zb3IuaWQpO1xuICAgICAgcmV0dXJuIFtzY2FsYXIodGVuc29yTGlzdC5zaXplKCksICdpbnQzMicpXTtcbiAgICB9XG4gICAgY2FzZSAnVGVuc29yTGlzdFJlc2l6ZSc6IHtcbiAgICAgIGNvbnN0IGlkVGVuc29yID1cbiAgICAgICAgICBnZXRQYXJhbVZhbHVlKCd0ZW5zb3JMaXN0SWQnLCBub2RlLCB0ZW5zb3JNYXAsIGNvbnRleHQpIGFzIFRlbnNvcjtcbiAgICAgIGNvbnN0IHNpemUgPSBnZXRQYXJhbVZhbHVlKCdzaXplJywgbm9kZSwgdGVuc29yTWFwLCBjb250ZXh0KSBhcyBudW1iZXI7XG5cbiAgICAgIGNvbnN0IHNyY1RlbnNvckxpc3QgPSBjb250ZXh0LmdldFRlbnNvckxpc3QoaWRUZW5zb3IuaWQpO1xuICAgICAgY29uc3QgZGVzdFRlbnNvckxpc3QgPSBzcmNUZW5zb3JMaXN0LnJlc2l6ZShzaXplKTtcbiAgICAgIGNvbnRleHQuYWRkVGVuc29yTGlzdChkZXN0VGVuc29yTGlzdCk7XG4gICAgICByZXR1cm4gW2Rlc3RUZW5zb3JMaXN0LmlkVGVuc29yXTtcbiAgICB9XG4gICAgZGVmYXVsdDpcbiAgICAgIHRocm93IFR5cGVFcnJvcihgTm9kZSB0eXBlICR7bm9kZS5vcH0gaXMgbm90IGltcGxlbWVudGVkYCk7XG4gIH1cbn07XG5cbmV4cG9ydCBjb25zdCBDQVRFR09SWSA9ICdjb250cm9sJztcbiJdfQ==","/**\n * @license\n * Copyright 2018 Google LLC. All Rights Reserved.\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n * =============================================================================\n */\n// tslint:disable-next-line: no-imports-from-dist\nimport * as tfOps from '@tensorflow/tfjs-core/dist/ops/ops_for_converter';\nimport { getPadding, getParamValue } from './utils';\nfunction fusedConvAndDepthWiseParams(node, tensorMap, context) {\n const [extraOp, activationFunc] = getParamValue('fusedOps', node, tensorMap, context);\n const isBiasAdd = extraOp === 'biasadd';\n const noBiasAdd = !isBiasAdd;\n const isPrelu = activationFunc === 'prelu';\n const isBatchNorm = extraOp === 'fusedbatchnorm';\n const numArgs = getParamValue('numArgs', node, tensorMap, context);\n if (isBiasAdd) {\n if (isPrelu && numArgs !== 2) {\n throw new Error('FusedConv2d and DepthwiseConv2d with BiasAdd and Prelu ' +\n 'must have two extra arguments: bias and alpha.');\n }\n if (!isPrelu && isBiasAdd && numArgs !== 1) {\n throw new Error('FusedConv2d and DepthwiseConv2d with BiasAdd must have ' +\n 'one extra argument: bias.');\n }\n }\n if (isBatchNorm) {\n throw new Error('FusedConv2d and DepthwiseConv2d with FusedBatchNorm is not supported');\n }\n const stride = getParamValue('strides', node, tensorMap, context);\n const pad = getPadding(node, tensorMap, context);\n const dataFormat = getParamValue('dataFormat', node, tensorMap, context)\n .toUpperCase();\n const dilations = getParamValue('dilations', node, tensorMap, context);\n let [biasArg, preluArg] = getParamValue('args', node, tensorMap, context);\n if (noBiasAdd) {\n preluArg = biasArg;\n biasArg = undefined;\n }\n const leakyreluAlpha = getParamValue('leakyreluAlpha', node, tensorMap, context);\n return {\n stride,\n pad,\n dataFormat,\n dilations,\n biasArg,\n preluArg,\n activationFunc,\n leakyreluAlpha\n };\n}\nexport const executeOp = (node, tensorMap, context, ops = tfOps) => {\n switch (node.op) {\n case 'Conv1D': {\n const stride = getParamValue('stride', node, tensorMap, context);\n const pad = getParamValue('pad', node, tensorMap, context);\n const dataFormat = getParamValue('dataFormat', node, tensorMap, context)\n .toUpperCase();\n const dilation = getParamValue('dilation', node, tensorMap, context);\n return [ops.conv1d(getParamValue('x', node, tensorMap, context), getParamValue('filter', node, tensorMap, context), stride, pad, dataFormat, dilation)];\n }\n case 'Conv2D': {\n const stride = getParamValue('strides', node, tensorMap, context);\n const pad = getPadding(node, tensorMap, context);\n const dataFormat = getParamValue('dataFormat', node, tensorMap, context)\n .toUpperCase();\n const dilations = getParamValue('dilations', node, tensorMap, context);\n return [ops.conv2d(getParamValue('x', node, tensorMap, context), getParamValue('filter', node, tensorMap, context), [stride[1], stride[2]], pad, dataFormat, [dilations[1], dilations[2]])];\n }\n case '_FusedConv2D': {\n const { stride, pad, dataFormat, dilations, biasArg, preluArg, activationFunc, leakyreluAlpha } = fusedConvAndDepthWiseParams(node, tensorMap, context);\n return [ops.fused.conv2d({\n x: getParamValue('x', node, tensorMap, context),\n filter: getParamValue('filter', node, tensorMap, context),\n strides: [stride[1], stride[2]],\n pad: pad,\n dataFormat: dataFormat,\n dilations: [dilations[1], dilations[2]],\n bias: biasArg,\n activation: activationFunc,\n preluActivationWeights: preluArg,\n leakyreluAlpha\n })];\n }\n case 'FusedDepthwiseConv2dNative': {\n const { stride, pad, dataFormat, dilations, biasArg, preluArg, activationFunc, leakyreluAlpha, } = fusedConvAndDepthWiseParams(node, tensorMap, context);\n return [ops.fused.depthwiseConv2d({\n x: getParamValue('x', node, tensorMap, context),\n filter: getParamValue('filter', node, tensorMap, context),\n strides: [stride[1], stride[2]],\n pad: pad,\n dataFormat: dataFormat,\n dilations: [dilations[1], dilations[2]],\n bias: biasArg,\n activation: activationFunc,\n preluActivationWeights: preluArg,\n leakyreluAlpha\n })];\n }\n case 'Conv2DBackpropInput':\n case 'Conv2dTranspose': {\n const shape = getParamValue('outputShape', node, tensorMap, context);\n const stride = getParamValue('strides', node, tensorMap, context);\n const pad = getPadding(node, tensorMap, context);\n return [ops.conv2dTranspose(getParamValue('x', node, tensorMap, context), getParamValue('filter', node, tensorMap, context), shape, [stride[1], stride[2]], pad)];\n }\n case 'DepthwiseConv2dNative':\n case 'DepthwiseConv2d': {\n const stride = getParamValue('strides', node, tensorMap, context);\n const pad = getPadding(node, tensorMap, context);\n const dilations = getParamValue('dilations', node, tensorMap, context);\n const dataFormat = getParamValue('dataFormat', node, tensorMap, context)\n .toUpperCase();\n return [ops.depthwiseConv2d(getParamValue('input', node, tensorMap, context), getParamValue('filter', node, tensorMap, context), [stride[1], stride[2]], pad, dataFormat, [dilations[1], dilations[2]])];\n }\n case 'Conv3D': {\n const stride = getParamValue('strides', node, tensorMap, context);\n const pad = getParamValue('pad', node, tensorMap, context);\n const dataFormat = getParamValue('dataFormat', node, tensorMap, context)\n .toUpperCase();\n const dilations = getParamValue('dilations', node, tensorMap, context);\n return [ops.conv3d(getParamValue('x', node, tensorMap, context), getParamValue('filter', node, tensorMap, context), [stride[1], stride[2], stride[3]], pad, dataFormat, [dilations[1], dilations[2], dilations[3]])];\n }\n case 'AvgPool': {\n const stride = getParamValue('strides', node, tensorMap, context);\n const pad = getParamValue('pad', node, tensorMap, context);\n const kernelSize = getParamValue('kernelSize', node, tensorMap, context);\n return [ops.avgPool(getParamValue('x', node, tensorMap, context), [kernelSize[1], kernelSize[2]], [stride[1], stride[2]], pad)];\n }\n case 'MaxPool': {\n const stride = getParamValue('strides', node, tensorMap, context);\n const pad = getParamValue('pad', node, tensorMap, context);\n const kernelSize = getParamValue('kernelSize', node, tensorMap, context);\n return [ops.maxPool(getParamValue('x', node, tensorMap, context), [kernelSize[1], kernelSize[2]], [stride[1], stride[2]], pad)];\n }\n case 'MaxPoolWithArgmax': {\n const stride = getParamValue('strides', node, tensorMap, context);\n const pad = getParamValue('pad', node, tensorMap, context);\n const kernelSize = getParamValue('kernelSize', node, tensorMap, context);\n const includeBatchInIndex = getParamValue('includeBatchInIndex', node, tensorMap, context);\n const { result, indexes } = ops.maxPoolWithArgmax(getParamValue('x', node, tensorMap, context), [kernelSize[1], kernelSize[2]], [stride[1], stride[2]], pad, includeBatchInIndex);\n return [result, indexes];\n }\n case 'AvgPool3D': {\n const stride = getParamValue('strides', node, tensorMap, context);\n const pad = getParamValue('pad', node, tensorMap, context);\n const kernelSize = getParamValue('kernelSize', node, tensorMap, context);\n return [ops.avgPool3d(getParamValue('x', node, tensorMap, context), [kernelSize[1], kernelSize[2], kernelSize[3]], [stride[1], stride[2], stride[3]], pad)];\n }\n case 'MaxPool3D': {\n const stride = getParamValue('strides', node, tensorMap, context);\n const pad = getParamValue('pad', node, tensorMap, context);\n const kernelSize = getParamValue('kernelSize', node, tensorMap, context);\n return [ops.maxPool3d(getParamValue('x', node, tensorMap, context), [kernelSize[1], kernelSize[2], kernelSize[3]], [stride[1], stride[2], stride[3]], pad)];\n }\n case 'Dilation2D': {\n const strides = getParamValue('strides', node, tensorMap, context);\n const pad = getParamValue('pad', node, tensorMap, context);\n const dilations = getParamValue('dilations', node, tensorMap, context);\n // strides: [1, stride_height, stride_width, 1].\n const strideHeight = strides[1];\n const strideWidth = strides[2];\n // dilations: [1, dilation_height, dilation_width, 1].\n const dilationHeight = dilations[1];\n const dilationWidth = dilations[2];\n return [ops.dilation2d(getParamValue('x', node, tensorMap, context), getParamValue('filter', node, tensorMap, context), [strideHeight, strideWidth], pad, [dilationHeight, dilationWidth], 'NHWC' /* dataFormat */)];\n }\n default:\n throw TypeError(`Node type ${node.op} is not implemented`);\n }\n};\nexport const CATEGORY = 'convolution';\n//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY29udm9sdXRpb25fZXhlY3V0b3IuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi8uLi8uLi90ZmpzLWNvbnZlcnRlci9zcmMvb3BlcmF0aW9ucy9leGVjdXRvcnMvY29udm9sdXRpb25fZXhlY3V0b3IudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUE7Ozs7Ozs7Ozs7Ozs7OztHQWVHO0FBR0gsaURBQWlEO0FBQ2pELE9BQU8sS0FBSyxLQUFLLE1BQU0sa0RBQWtELENBQUM7QUFNMUUsT0FBTyxFQUFDLFVBQVUsRUFBRSxhQUFhLEVBQUMsTUFBTSxTQUFTLENBQUM7QUFFbEQsU0FBUywyQkFBMkIsQ0FDaEMsSUFBVSxFQUFFLFNBQTBCLEVBQUUsT0FBeUI7SUFDbkUsTUFBTSxDQUFDLE9BQU8sRUFBRSxjQUFjLENBQUMsR0FDMUIsYUFBYSxDQUFDLFVBQVUsRUFBRSxJQUFJLEVBQUUsU0FBUyxFQUFFLE9BQU8sQ0FBYyxDQUFDO0lBRXRFLE1BQU0sU0FBUyxHQUFHLE9BQU8sS0FBSyxTQUFTLENBQUM7SUFDeEMsTUFBTSxTQUFTLEdBQUcsQ0FBQyxTQUFTLENBQUM7SUFDN0IsTUFBTSxPQUFPLEdBQUcsY0FBYyxLQUFLLE9BQU8sQ0FBQztJQUMzQyxNQUFNLFdBQVcsR0FBRyxPQUFPLEtBQUssZ0JBQWdCLENBQUM7SUFFakQsTUFBTSxPQUFPLEdBQ1IsYUFBYSxDQUFDLFNBQVMsRUFBRSxJQUFJLEVBQUUsU0FBUyxFQUFFLE9BQU8sQ0FBWSxDQUFDO0lBQ25FLElBQUksU0FBUyxFQUFFO1FBQ2IsSUFBSSxPQUFPLElBQUksT0FBTyxLQUFLLENBQUMsRUFBRTtZQUM1QixNQUFNLElBQUksS0FBSyxDQUNYLHlEQUF5RDtnQkFDekQsZ0RBQWdELENBQUMsQ0FBQztTQUN2RDtRQUNELElBQUksQ0FBQyxPQUFPLElBQUksU0FBUyxJQUFJLE9BQU8sS0FBSyxDQUFDLEVBQUU7WUFDMUMsTUFBTSxJQUFJLEtBQUssQ0FDWCx5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T0FBTyxDQUFhLENBQUM7WUFDbkUsTUFBTSxHQUFHLEdBQUcsYUFBYSxDQUFDLEtBQUssRUFBRSxJQUFJLEVBQUUsU0FBUyxFQUFFLE9BQU8sQ0FBQyxDQUFDO1lBQzNELE1BQU0sU0FBUyxHQUNYLGFBQWEsQ0FBQyxXQUFXLEVBQUUsSUFBSSxFQUFFLFNBQVMsRUFBRSxPQUFPLENBQWEsQ0FBQztZQUVyRSxnREFBZ0Q7WUFDaEQsTUFBTSxZQUFZLEdBQUcsT0FBTyxDQUFDLENBQUMsQ0FBQyxDQUFDO1lBQ2hDLE1BQU0sV0FBVyxHQUFHLE9BQU8sQ0FBQyxDQUFDLENBQUMsQ0FBQztZQUUvQixzREFBc0Q7WUFDdEQsTUFBTSxjQUFjLEdBQUcsU0FBUyxDQUFDLENBQUMsQ0FBQyxDQUFDO1lBQ3BDLE1BQU0sYUFBYSxHQUFHLFNBQVMsQ0FBQyxDQUFDLENBQUMsQ0FBQztZQUVuQyxPQUFPLENBQUMsR0FBRyxDQUFDLFVBQVUsQ0FDbEIsYUFBYSxDQUFDLEdBQUcsRUFBRSxJQUFJLEVBQUUsU0FBUyxFQUFFLE9BQU8sQ0FDL0IsRUFDWixhQUFhLENBQUMsUUFBUSxFQUFFLElBQUksRUFBRSxTQUFTLEVBQUUsT0FBTyxDQUFhLEVBQzdELENBQUMsWUFBWSxFQUFFLFdBQVcsQ0FBQyxFQUFFLEdBQXVCLEVBQ3BELENBQUMsY0FBYyxFQUFFLGFBQWEsQ0FBQyxFQUFFLE1BQU0sQ0FBQyxnQkFBZ0IsQ0FBQyxDQUFDLENBQUM7U0FDaEU7UUFFRDtZQUNFLE1BQU0sU0FBUyxDQUFDLGFBQWEsSUFBSSxDQUFDLEVBQUUscUJBQXFCLENBQUMsQ0FBQztLQUM5RDtBQUNILENBQUMsQ0FBQztBQUVOLE1BQU0sQ0FBQyxNQUFNLFFBQVEsR0FBRyxhQUFhLENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyIvKipcbiAqIEBsaWNlbnNlXG4gKiBDb3B5cmlnaHQgMjAxOCBHb29nbGUgTExDLiBBbGwgUmlnaHRzIFJlc2VydmVkLlxuICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlIFwiTGljZW5zZVwiKTtcbiAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS5cbiAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdFxuICpcbiAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMFxuICpcbiAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmVcbiAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuIFwiQVMgSVNcIiBCQVNJUyxcbiAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLlxuICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZFxuICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuXG4gKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuICovXG5cbmltcG9ydCB7UmFuaywgVGVuc29yLCBUZW5zb3IzRCwgVGVuc29yNEQsIFRlbnNvcjVEfSBmcm9tICdAdGVuc29yZmxvdy90ZmpzLWNvcmUnO1xuLy8gdHNsaW50OmRpc2FibGUtbmV4dC1saW5lOiBuby1pbXBvcnRzLWZyb20tZGlzdFxuaW1wb3J0ICogYXMgdGZPcHMgZnJvbSAnQHRlbnNvcmZsb3cvdGZqcy1jb3JlL2Rpc3Qvb3BzL29wc19mb3JfY29udmVydGVyJztcblxuaW1wb3J0IHtOYW1lZFRlbnNvcnNNYXB9IGZyb20gJy4uLy4uL2RhdGEvdHlwZXMnO1xuaW1wb3J0IHtFeGVjdXRpb25Db250ZXh0fSBmcm9tICcuLi8uLi9leGVjdXRvci9leGVjdXRpb25fY29udGV4dCc7XG5pbXBvcnQge0ludGVybmFsT3BFeGVjdXRvciwgTm9kZX0gZnJvbSAnLi4vdHlwZXMnO1xuXG5pbXBvcnQge2dldFBhZGRpbmcsIGdldFBhcmFtVmFsdWV9IGZyb20gJy4vdXRpbHMnO1xuXG5mdW5jdGlvbiBmdXNlZENvbnZBbmREZXB0aFdpc2VQYXJhbXMoXG4gICAgbm9kZTogTm9kZSwgdGVuc29yTWFwOiBOYW1lZFRlbnNvcnNNYXAsIGNvbnRleHQ6IEV4ZWN1dGlvbkNvbnRleHQpIHtcbiAgY29uc3QgW2V4dHJhT3AsIGFjdGl2YXRpb25GdW5jXSA9XG4gICAgICAoZ2V0UGFyYW1WYWx1ZSgnZnVzZWRPcHMnLCBub2RlLCB0ZW5zb3JNYXAsIGNvbnRleHQpIGFzIHN0cmluZ1tdKTtcblxuICBjb25zdCBpc0JpYXNBZGQgPSBleHRyYU9wID09PSAnYmlhc2FkZCc7XG4gIGNvbnN0IG5vQmlhc0FkZCA9ICFpc0JpYXNBZGQ7XG4gIGNvbnN0IGlzUHJlbHUgPSBhY3RpdmF0aW9uRnVuYyA9PT0gJ3ByZWx1JztcbiAgY29uc3QgaXNCYXRjaE5vcm0gPSBleHRyYU9wID09PSAnZnVzZWRiYXRjaG5vcm0nO1xuXG4gIGNvbnN0IG51bUFyZ3MgPVxuICAgICAgKGdldFBhcmFtVmFsdWUoJ251bUFyZ3MnLCBub2RlLCB0ZW5zb3JNYXAsIGNvbnRleHQpIGFzIG51bWJlcik7XG4gIGlmIChpc0JpYXNBZGQpIHtcbiAgICBpZiAoaXNQcmVsdSAmJiBudW1BcmdzICE9PSAyKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoXG4gICAgICAgICAgJ0Z1c2VkQ29udjJkIGFuZCBEZXB0aHdpc2VDb252MmQgd2l0aCBCaWFzQWRkIGFuZCBQcmVsdSAnICtcbiAgICAgICAgICAnbXVzdCBoYXZlIHR3byBleHRyYSBhcmd1bWVudHM6IGJpYXMgYW5kIGFscGhhLicpO1xuICAgIH1cbiAgICBpZiAoIWlzUHJlbHUgJiYgaXNCaWFzQWRkICYmIG51bUFyZ3MgIT09IDEpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcihcbiAgICAgICAgICAnRnVzZWRDb252MmQgYW5kIERlcHRod2lzZUNvbnYyZCB3aXRoIEJpYXNBZGQgbXVzdCBoYXZlICcgK1xuICAgICAgICAgICdvbmUgZXh0cmEgYXJndW1lbnQ6IGJpYXMuJyk7XG4gICAgfVxuICB9XG4gIGlmIChpc0JhdGNoTm9ybSkge1xuICAgIHRocm93IG5ldyBFcnJvcihcbiAgICAgICAgJ0Z1c2VkQ29udjJkIGFuZCBEZXB0aHdpc2VDb252MmQgd2l0aCBGdXNlZEJhdGNoTm9ybSBpcyBub3Qgc3VwcG9ydGVkJyk7XG4gIH1cbiAgY29uc3Qgc3RyaWRlID0gZ2V0UGFyYW1WYWx1ZSgnc3RyaWRlcycsIG5vZGUsIHRlbnNvck1hcCwgY29udGV4dCkgYXMgbnVtYmVyW107XG4gIGNvbnN0IHBhZCA9IGdldFBhZGRpbmcobm9kZSwgdGVuc29yTWFwLCBjb250ZXh0KTtcbiAgY29uc3QgZGF0YUZvcm1hdCA9XG4gICAgICAoZ2V0UGFyYW1WYWx1ZSgnZGF0YUZvcm1hdCcsIG5vZGUsIHRlbnNvck1hcCwgY29udGV4dCkgYXMgc3RyaW5nKVxuICAgICAgICAgIC50b1VwcGVyQ2FzZSgpO1xuICBjb25zdCBkaWxhdGlvbnMgPVxuICAgICAgZ2V0UGFyYW1WYWx1ZSgnZGlsYXRpb25zJywgbm9kZSwgdGVuc29yTWFwLCBjb250ZXh0KSBhcyBudW1iZXJbXTtcbiAgbGV0IFtiaWFzQXJnLCBwcmVsdUFyZ10gPVxuICAgICAgZ2V0UGFyYW1WYWx1ZSgnYXJncycsIG5vZGUsIHRlbnNvck1hcCwgY29udGV4dCkgYXMgVGVuc29yW107XG4gIGlmIChub0JpYXNBZGQpIHtcbiAgICBwcmVsdUFyZyA9IGJpYXNBcmc7XG4gICAgYmlhc0FyZyA9IHVuZGVmaW5lZDtcbiAgfVxuICBjb25zdCBsZWFreXJlbHVBbHBoYSA9XG4gICAgICBnZXRQYXJhbVZhbHVlKCdsZWFreXJlbHVBbHBoYScsIG5vZGUsIHRlbnNvck1hcCwgY29udGV4dCkgYXMgbnVtYmVyO1xuXG4gIHJldHVybiB7XG4gICAgc3RyaWRlLFxuICAgIHBhZCxcbiAgICBkYXRhRm9ybWF0LFxuICAgIGRpbGF0aW9ucyxcbiAgICBiaWFzQXJnLFxuICAgIHByZWx1QXJnLFxuICAgIGFjdGl2YXRpb25GdW5jLFxuICAgIGxlYWt5cmVsdUFscGhhXG4gIH07XG59XG5cbmV4cG9ydCBjb25zdCBleGVjdXRlT3A6IEludGVybmFsT3BFeGVjdXRvciA9XG4gICAgKG5vZGU6IE5vZGUsIHRlbnNvck1hcDogTmFtZWRUZW5zb3JzTWFwLFxuICAgICBjb250ZXh0OiBFeGVjdXRpb25Db250ZXh0LCBvcHMgPSB0Zk9wcyk6IFRlbnNvcltdID0+IHtcbiAgICAgIHN3aXRjaCAobm9kZS5vcCkge1xuICAgICAgICBjYXNlICdDb252MUQnOiB7XG4gICAgICAgICAgY29uc3Qgc3RyaWRlID1cbiAgICAgICAgICAgICAgZ2V0UGFyYW1WYWx1ZSgnc3RyaWRlJywgbm9kZSwgdGVuc29yTWFwLCBjb250ZXh0KSBhcyBudW1iZXI7XG4gICAgICAgICAgY29uc3QgcGFkID0gZ2V0UGFyYW1WYWx1ZSgncGFkJywgbm9kZSwgdGVuc29yTWFwLCBjb250ZXh0KTtcbiAgICAgICAgICBjb25zdCBkYXRhRm9ybWF0ID1cbiAgICAgICAgICAgICAgKGdldFBhcmFtVmFsdWUoJ2RhdGFGb3JtYXQnLCBub2RlLCB0ZW5zb3JNYXAsIGNvbnRleHQpIGFzIHN0cmluZylcbiAgICAgICAgICAgICAgICAgIC50b1VwcGVyQ2FzZSgpO1xuICAgICAgICAgIGNvbnN0IGRpbGF0aW9uID1cbiAgICAgICAgICAgICAgZ2V0UGFyYW1WYWx1ZSgnZGlsYXRpb24nLCBub2RlLCB0ZW5zb3JNYXAsIGNvbnRleHQpIGFzIG51bWJlcjtcbiAgICAgICAgICByZXR1cm4gW29wcy5jb252MWQoXG4gICAgICAgICAgICAgIGdldFBhcmFtVmFsdWUoJ3gnLCBub2RlLCB0ZW5zb3JNYXAsIGNvbnRleHQpIGFzIFRlbnNvcjNELFxuICAgICAgICAgICAgICBnZXRQYXJhbVZhbHVlKCdmaWx0ZXInLCBub2RlLCB0ZW5zb3JNYXAsIGNvbnRleHQpIGFzIFRlbnNvcjNELFxuICAgICAgICAgICAgICBzdHJpZGUsIHBhZCBhcyAndmFsaWQnIHwgJ3NhbWUnLCBkYXRhRm9ybWF0IGFzICdOV0MnIHwgJ05DVycsXG4gICAgICAgICAgICAgIGRpbGF0aW9uKV07XG4gICAgICAgIH1cbiAgICAgICAgY2FzZSAnQ29udjJEJzoge1xuICAgICAgICAgIGNvbnN0IHN0cmlkZSA9XG4gICAgICAgICAgICAgIGdldFBhcmFtVmFsdWUoJ3N0cmlkZXMnLCBub2RlLCB0ZW5zb3JNYXAsIGNvbnRleHQpIGFzIG51bWJlcltdO1xuICAgICAgICAgIGNvbnN0IHBhZCA9IGdldFBhZGRpbmcobm9kZSwgdGVuc29yTWFwLCBjb250ZXh0KTtcbiAgICAgICAgICBjb25zdCBkYXRhRm9ybWF0ID1cbiAgICAgICAgICAgICAgKGdldFBhcmFtVmFsdWUoJ2RhdGFGb3JtYXQnLCBub2RlLCB0ZW5zb3JNYXAsIGNvbnRleHQpIGFzIHN0cmluZylcbiAgICAgICAgICAgICAgICAgIC50b1VwcGVyQ2FzZSgpO1xuICAgICAgICAgIGNvbnN0IGRpbGF0aW9ucyA9XG4gICAgICAgICAgICAgIGdldFBhcmFtVmFsdWUoJ2RpbGF0aW9ucycsIG5vZGUsIHRlbnNvck1hcCwgY29udGV4dCkgYXMgbnVtYmVyW107XG4gICAgICAgICAgcmV0dXJuIFtvcHMuY29udjJkKFxuICAgICAgICAgICAgICBnZXRQYXJhbVZhbHVlKCd4Jywgbm9kZSwgdGVuc29yTWFwLCBjb250ZXh0KSBhcyBUZW5zb3IzRCB8XG4gICAgICAgICAgICAgICAgICBUZW5zb3I0RCxcbiAgICAgICAgICAgICAgZ2V0UGFyYW1WYWx1ZSgnZmlsdGVyJywgbm9kZSwgdGVuc29yTWFwLCBjb250ZXh0KSBhcyBUZW5zb3I0RCxcbiAgICAgICAgICAgICAgW3N0cmlkZVsxXSwgc3RyaWRlWzJdXSwgcGFkIGFzICd2YWxpZCcgfCAnc2FtZScsXG4gICAgICAgICAgICAgIGRhdGFGb3JtYXQgYXMgJ05IV0MnIHwgJ05DSFcnLCBbZGlsYXRpb25zWzFdLCBkaWxhdGlvbnNbMl1dKV07XG4gICAgICAgIH1cbiAgICAgICAgY2FzZSAnX0Z1c2VkQ29udjJEJzoge1xuICAgICAgICAgIGNvbnN0IHtcbiAgICAgICAgICAgIHN0cmlkZSxcbiAgICAgICAgICAgIHBhZCxcbiAgICAgICAgICAgIGRhdGFGb3JtYXQsXG4gICAgICAgICAgICBkaWxhdGlvbnMsXG4gICAgICAgICAgICBiaWFzQXJnLFxuICAgICAgICAgICAgcHJlbHVBcmcsXG4gICAgICAgICAgICBhY3RpdmF0aW9uRnVuYyxcbiAgICAgICAgICAgIGxlYWt5cmVsdUFscGhhXG4gICAgICAgICAgfSA9IGZ1c2VkQ29udkFuZERlcHRoV2lzZVBhcmFtcyhub2RlLCB0ZW5zb3JNYXAsIGNvbnRleHQpO1xuXG4gICAgICAgICAgcmV0dXJuIFtvcHMuZnVzZWQuY29udjJkKHtcbiAgICAgICAgICAgIHg6IGdldFBhcmFtVmFsdWUoJ3gnLCBub2RlLCB0ZW5zb3JNYXAsIGNvbnRleHQpIGFzIFRlbnNvcjNEIHxcbiAgICAgICAgICAgICAgICBUZW5zb3I0RCxcbiAgICAgICAgICAgIGZpbHRlcjogZ2V0UGFyYW1WYWx1ZSgnZmlsdGVyJywgbm9kZSwgdGVuc29yTWFwLCBjb250ZXh0KSBhc1xuICAgICAgICAgICAgICAgIFRlbnNvcjRELFxuICAgICAgICAgICAgc3RyaWRlczogW3N0cmlkZVsxXSwgc3RyaWRlWzJdXSxcbiAgICAgICAgICAgIHBhZDogcGFkIGFzICd2YWxpZCcgfCAnc2FtZScsXG4gICAgICAgICAgICBkYXRhRm9ybWF0OiBkYXRhRm9ybWF0IGFzICdOSFdDJyB8ICdOQ0hXJyxcbiAgICAgICAgICAgIGRpbGF0aW9uczogW2RpbGF0aW9uc1sxXSwgZGlsYXRpb25zWzJdXSxcbiAgICAgICAgICAgIGJpYXM6IGJpYXNBcmcsXG4gICAgICAgICAgICBhY3RpdmF0aW9uOiBhY3RpdmF0aW9uRnVuYyBhcyB0Zk9wcy5mdXNlZC5BY3RpdmF0aW9uLFxuICAgICAgICAgICAgcHJlbHVBY3RpdmF0aW9uV2VpZ2h0czogcHJlbHVBcmcsXG4gICAgICAgICAgICBsZWFreXJlbHVBbHBoYVxuICAgICAgICAgIH0pXTtcbiAgICAgICAgfVxuXG4gICAgICAgIGNhc2UgJ0Z1c2VkRGVwdGh3aXNlQ29udjJkTmF0aXZlJzoge1xuICAgICAgICAgIGNvbnN0IHtcbiAgICAgICAgICAgIHN0cmlkZSxcbiAgICAgICAgICAgIHBhZCxcbiAgICAgICAgICAgIGRhdGFGb3JtYXQsXG4gICAgICAgICAgICBkaWxhdGlvbnMsXG4gICAgICAgICAgICBiaWFzQXJnLFxuICAgICAgICAgICAgcHJlbHVBcmcsXG4gICAgICAgICAgICBhY3RpdmF0aW9uRnVuYyxcbiAgICAgICAgICAgIGxlYWt5cmVsdUFscGhhLFxuICAgICAgICAgIH0gPSBmdXNlZENvbnZBbmREZXB0aFdpc2VQYXJhbXMobm9kZSwgdGVuc29yTWFwLCBjb250ZXh0KTtcblxuICAgICAgICAgIHJldHVybiBbb3BzLmZ1c2VkLmRlcHRod2lzZUNvbnYyZCh7XG4gICAgICAgICAgICB4OiBnZXRQYXJhbVZhbHVlKCd4Jywgbm9kZSwgdGVuc29yTWFwLCBjb250ZXh0KSBhcyBUZW5zb3IzRCB8XG4gICAgICAgICAgICAgICAgVGVuc29yNEQsXG4gICAgICAgICAgICBmaWx0ZXI6IGdldFBhcmFtVmFsdWUoJ2ZpbHRlcicsIG5vZGUsIHRlbnNvck1hcCwgY29udGV4dCkgYXNcbiAgICAgICAgICAgICAgICBUZW5zb3I0RCxcbiAgICAgICAgICAgIHN0cmlkZXM6IFtzdHJpZGVbMV0sIHN0cmlkZVsyXV0sXG4gICAgICAgICAgICBwYWQ6IHBhZCBhcyAndmFsaWQnIHwgJ3NhbWUnLFxuICAgICAgICAgICAgZGF0YUZvcm1hdDogZGF0YUZvcm1hdCBhcyAnTkhXQycgfCAnTkNIVycsXG4gICAgICAgICAgICBkaWxhdGlvbnM6IFtkaWxhdGlvbnNbMV0sIGRpbGF0aW9uc1syXV0sXG4gICAgICAgICAgICBiaWFzOiBiaWFzQXJnLFxuICAgICAgICAgICAgYWN0aXZhdGlvbjogYWN0aXZhdGlvbkZ1bmMgYXMgdGZPcHMuZnVzZWQuQWN0aXZhdGlvbixcbiAgICAgICAgICAgIHByZWx1QWN0aXZhdGlvbldlaWdodHM6IHByZWx1QXJnLFxuICAgICAgICAgICAgbGVha3lyZWx1QWxwaGFcbiAgICAgICAgICB9KV07XG4gICAgICAgIH1cbiAgICAgICAgY2FzZSAnQ29udjJEQmFja3Byb3BJbnB1dCc6XG4gICAgICAgIGNhc2UgJ0NvbnYyZFRyYW5zcG9zZSc6IHtcbiAgICAgICAgICBjb25zdCBzaGFwZSA9IGdldFBhcmFtVmFsdWUoXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgJ291dHB1dFNoYXBlJywgbm9kZSwgdGVuc29yTWFwLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnRleHQpIGFzIFtudW1iZXIsIG51bWJlciwgbnVtYmVyXSB8XG4gICAgICAgICAgICAgIFtudW1iZXIsIG51bWJlciwgbnVtYmVyLCBudW1iZXJdO1xuICAgICAgICAgIGNvbnN0IHN0cmlkZSA9XG4gICAgICAgICAgICAgIGdldFBhcmFtVmFsdWUoJ3N0cmlkZXMnLCBub2RlLCB0ZW5zb3JNYXAsIGNvbnRleHQpIGFzIG51bWJlcltdO1xuICAgICAgICAgIGNvbnN0IHBhZCA9IGdldFBhZGRpbmcobm9kZSwgdGVuc29yTWFwLCBjb250ZXh0KTtcbiAgICAgICAgICByZXR1cm4gW29wcy5jb252MmRUcmFuc3Bvc2UoXG4gICAgICAgICAgICAgIGdldFBhcmFtVmFsdWUoJ3gnLCBub2RlLCB0ZW5zb3JNYXAsIGNvbnRleHQpIGFzIFRlbnNvcjNEIHxcbiAgICAgICAgICAgICAgICAgIFRlbnNvcjRELFxuICAgICAgICAgICAgICBnZXRQYXJhbVZhbHVlKCdmaWx0ZXInLCBub2RlLCB0ZW5zb3JNYXAsIGNvbnRleHQpIGFzIFRlbnNvcjRELFxuICAgICAgICAgICAgICBzaGFwZSwgW3N0cmlkZVsxXSwgc3RyaWRlWzJdXSwgcGFkIGFzICd2YWxpZCcgfCAnc2FtZScpXTtcbiAgICAgICAgfVxuICAgICAgICBjYXNlICdEZXB0aHdpc2VDb252MmROYXRpdmUnOlxuICAgICAgICBjYXNlICdEZXB0aHdpc2VDb252MmQnOiB7XG4gICAgICAgICAgY29uc3Qgc3RyaWRlID1cbiAgICAgICAgICAgICAgZ2V0UGFyYW1WYWx1ZSgnc3RyaWRlcycsIG5vZGUsIHRlbnNvck1hcCwgY29udGV4dCkgYXMgbnVtYmVyW107XG4gICAgICAgICAgY29uc3QgcGFkID0gZ2V0UGFkZGluZyhub2RlLCB0ZW5zb3JNYXAsIGNvbnRleHQpO1xuICAgICAgICAgIGNvbnN0IGRpbGF0aW9ucyA9XG4gICAgICAgICAgICAgIGdldFBhcmFtVmFsdWUoJ2RpbGF0aW9ucycsIG5vZGUsIHRlbnNvck1hcCwgY29udGV4dCkgYXMgbnVtYmVyW107XG4gICAgICAgICAgY29uc3QgZGF0YUZvcm1hdCA9XG4gICAgICAgICAgICAgIChnZXRQYXJhbVZhbHVlKCdkYXRhRm9ybWF0Jywgbm9kZSwgdGVuc29yTWFwLCBjb250ZXh0KSBhcyBzdHJpbmcpXG4gICAgICAgICAgICAgICAgICAudG9VcHBlckNhc2UoKTtcblxuICAgICAgICAgIHJldHVybiBbb3BzLmRlcHRod2lzZUNvbnYyZChcbiAgICAgICAgICAgICAgZ2V0UGFyYW1WYWx1ZSgnaW5wdXQnLCBub2RlLCB0ZW5zb3JNYXAsIGNvbnRleHQpIGFzIFRlbnNvcjNEIHxcbiAgICAgICAgICAgICAgICAgIFRlbnNvcjRELFxuICAgICAgICAgICAgICBnZXRQYXJhbVZhbHVlKCdmaWx0ZXInLCBub2RlLCB0ZW5zb3JNYXAsIGNvbnRleHQpIGFzIFRlbnNvcjRELFxuICAgICAgICAgICAgICBbc3RyaWRlWzFdLCBzdHJpZGVbMl1dLCBwYWQgYXMgJ3ZhbGlkJyB8ICdzYW1lJyxcbiAgICAgICAgICAgICAgZGF0YUZvcm1hdCBhcyAnTkhXQycgfCAnTkNIVycsIFtkaWxhdGlvbnNbMV0sIGRpbGF0aW9uc1syXV0pXTtcbiAgICAgICAgfVxuICAgICAgICBjYXNlICdDb252M0QnOiB7XG4gICAgICAgICAgY29uc3Qgc3RyaWRlID1cbiAgICAgICAgICAgICAgZ2V0UGFyYW1WYWx1ZSgnc3RyaWRlcycsIG5vZGUsIHRlbnNvck1hcCwgY29udGV4dCkgYXMgbnVtYmVyW107XG4gICAgICAgICAgY29uc3QgcGFkID0gZ2V0UGFyYW1WYWx1ZSgncGFkJywgbm9kZSwgdGVuc29yTWFwLCBjb250ZXh0KTtcbiAgICAgICAgICBjb25zdCBkYXRhRm9ybWF0ID1cbiAgICAgICAgICAgICAgKGdldFBhcmFtVmFsdWUoJ2RhdGFGb3JtYXQnLCBub2RlLCB0ZW5zb3JNYXAsIGNvbnRleHQpIGFzIHN0cmluZylcbiAgICAgICAgICAgICAgICAgIC50b1VwcGVyQ2FzZSgpO1xuICAgICAgICAgIGNvbnN0IGRpbGF0aW9ucyA9XG4gICAgICAgICAgICAgIGdldFBhcmFtVmFsdWUoJ2RpbGF0aW9ucycsIG5vZGUsIHRlbnNvck1hcCwgY29udGV4dCkgYXMgbnVtYmVyW107XG4gICAgICAgICAgcmV0dXJuIFtvcHMuY29udjNkKFxuICAgICAgICAgICAgICBnZXRQYXJhbVZhbHVlKCd4Jywgbm9kZSwgdGVuc29yTWFwLCBjb250ZXh0KSBhcyBUZW5zb3I0RCB8XG4gICAgICAgICAgICAgICAgICBUZW5zb3I8UmFuay5SNT4sXG4gICAgICAgICAgICAgIGdldFBhcmFtVmFsdWUoJ2ZpbHRlcicsIG5vZGUsIHRlbnNvck1hcCwgY29udGV4dCkgYXNcbiAgICAgICAgICAgICAgICAgIFRlbnNvcjxSYW5rLlI1PixcbiAgICAgICAgICAgICAgW3N0cmlkZVsxXSwgc3RyaWRlWzJdLCBzdHJpZGVbM11dLCBwYWQgYXMgJ3ZhbGlkJyB8ICdzYW1lJyxcbiAgICAgICAgICAgICAgZGF0YUZvcm1hdCBhcyAnTkRIV0MnIHwgJ05DREhXJyxcbiAgICAgICAgICAgICAgW2RpbGF0aW9uc1sxXSwgZGlsYXRpb25zWzJdLCBkaWxhdGlvbnNbM11dKV07XG4gICAgICAgIH1cbiAgICAgICAgY2FzZSAnQXZnUG9vbCc6IHtcbiAgICAgICAgICBjb25zdCBzdHJpZGUgPVxuICAgICAgICAgICAgICBnZXRQYXJhbVZhbHVlKCdzdHJpZGVzJywgbm9kZSwgdGVuc29yTWFwLCBjb250ZXh0KSBhcyBudW1iZXJbXTtcbiAgICAgICAgICBjb25zdCBwYWQgPSBnZXRQYXJhbVZhbHVlKCdwYWQnLCBub2RlLCB0ZW5zb3JNYXAsIGNvbnRleHQpO1xuICAgICAgICAgIGNvbnN0IGtlcm5lbFNpemUgPVxuICAgICAgICAgICAgICBnZXRQYXJhbVZhbHVlKCdrZXJuZWxTaXplJywgbm9kZSwgdGVuc29yTWFwLCBjb250ZXh0KSBhcyBudW1iZXJbXTtcblxuICAgICAgICAgIHJldHVybiBbb3BzLmF2Z1Bvb2woXG4gICAgICAgICAgICAgIGdldFBhcmFtVmFsdWUoJ3gnLCBub2RlLCB0ZW5zb3JNYXAsIGNvbnRleHQpIGFzIFRlbnNvcjNEIHxcbiAgICAgICAgICAgICAgICAgIFRlbnNvcjRELFxuICAgICAgICAgICAgICBba2VybmVsU2l6ZVsxXSwga2VybmVsU2l6ZVsyXV0sIFtzdHJpZGVbMV0sIHN0cmlkZVsyXV0sXG4gICAgICAgICAgICAgIHBhZCBhcyAndmFsaWQnIHwgJ3NhbWUnKV07XG4gICAgICAgIH1cbiAgICAgICAgY2FzZSAnTWF4UG9vbCc6IHtcbiAgICAgICAgICBjb25zdCBzdHJpZGUgPVxuICAgICAgICAgICAgICBnZXRQYXJhbVZhbHVlKCdzdHJpZGVzJywgbm9kZSwgdGVuc29yTWFwLCBjb250ZXh0KSBhcyBudW1iZXJbXTtcbiAgICAgICAgICBjb25zdCBwYWQgPSBnZXRQYXJhbVZhbHVlKCdwYWQnLCBub2RlLCB0ZW5zb3JNYXAsIGNvbnRleHQpO1xuICAgICAgICAgIGNvbnN0IGtlcm5lbFNpemUgPVxuICAgICAgICAgICAgICBnZXRQYXJhbVZhbHVlKCdrZXJuZWxTaXplJywgbm9kZSwgdGVuc29yTWFwLCBjb250ZXh0KSBhcyBudW1iZXJbXTtcblxuICAgICAgICAgIHJldHVybiBbb3BzLm1heFBvb2woXG4gICAgICAgICAgICAgIGdldFBhcmFtVmFsdWUoJ3gnLCBub2RlLCB0ZW5zb3JNYXAsIGNvbnRleHQpIGFzIFRlbnNvcjNEIHxcbiAgICAgICAgICAgICAgICAgIFRlbnNvcjRELFxuICAgICAgICAgICAgICBba2VybmVsU2l6ZVsxXSwga2VybmVsU2l6ZVsyXV0sIFtzdHJpZGVbMV0sIHN0cmlkZVsyXV0sXG4gICAgICAgICAgICAgIHBhZCBhcyAndmFsaWQnIHwgJ3NhbWUnKV07XG4gICAgICAgIH1cbiAgICAgICAgY2FzZSAnTWF4UG9vbFdpdGhBcmdtYXgnOiB7XG4gICAgICAgICAgY29uc3Qgc3RyaWRlID1cbiAgICAgICAgICAgICAgZ2V0UGFyYW1WYWx1ZSgnc3RyaWRlcycsIG5vZGUsIHRlbnNvck1hcCwgY29udGV4dCkgYXMgbnVtYmVyW107XG4gICAgICAgICAgY29uc3QgcGFkID0gZ2V0UGFyYW1WYWx1ZSgncGFkJywgbm9kZSwgdGVuc29yTWFwLCBjb250ZXh0KTtcbiAgICAgICAgICBjb25zdCBrZXJuZWxTaXplID1cbiAgICAgICAgICAgICAgZ2V0UGFyYW1WYWx1ZSgna2VybmVsU2l6ZScsIG5vZGUsIHRlbnNvck1hcCwgY29udGV4dCkgYXMgbnVtYmVyW107XG4gICAgICAgICAgY29uc3QgaW5jbHVkZUJhdGNoSW5JbmRleCA9XG4gICAgICAgICAgICAgIGdldFBhcmFtVmFsdWUoJ2luY2x1ZGVCYXRjaEluSW5kZXgnLCBub2RlLCB0ZW5zb3JNYXAsIGNvbnRleHQpIGFzXG4gICAgICAgICAgICAgIGJvb2xlYW47XG4gICAgICAgICAgY29uc3Qge3Jlc3VsdCwgaW5kZXhlc30gPSBvcHMubWF4UG9vbFdpdGhBcmdtYXgoXG4gICAgICAgICAgICAgIGdldFBhcmFtVmFsdWUoJ3gnLCBub2RlLCB0ZW5zb3JNYXAsIGNvbnRleHQpIGFzIFRlbnNvcjRELFxuICAgICAgICAgICAgICBba2VybmVsU2l6ZVsxXSwga2VybmVsU2l6ZVsyXV0sIFtzdHJpZGVbMV0sIHN0cmlkZVsyXV0sXG4gICAgICAgICAgICAgIHBhZCBhcyAndmFsaWQnIHwgJ3NhbWUnLCBpbmNsdWRlQmF0Y2hJbkluZGV4KTtcbiAgICAgICAgICByZXR1cm4gW3Jlc3VsdCwgaW5kZXhlc107XG4gICAgICAgIH1cbiAgICAgICAgY2FzZSAnQXZnUG9vbDNEJzoge1xuICAgICAgICAgIGNvbnN0IHN0cmlkZSA9XG4gICAgICAgICAgICAgIGdldFBhcmFtVmFsdWUoJ3N0cmlkZXMnLCBub2RlLCB0ZW5zb3JNYXAsIGNvbnRleHQpIGFzIG51bWJlcltdO1xuICAgICAgICAgIGNvbnN0IHBhZCA9IGdldFBhcmFtVmFsdWUoJ3BhZCcsIG5vZGUsIHRlbnNvck1hcCwgY29udGV4dCk7XG4gICAgICAgICAgY29uc3Qga2VybmVsU2l6ZSA9XG4gICAgICAgICAgICAgIGdldFBhcmFtVmFsdWUoJ2tlcm5lbFNpemUnLCBub2RlLCB0ZW5zb3JNYXAsIGNvbnRleHQpIGFzIG51bWJlcltdO1xuXG4gICAgICAgICAgcmV0dXJuIFtvcHMuYXZnUG9vbDNkKFxuICAgICAgICAgICAgICBnZXRQYXJhbVZhbHVlKCd4Jywgbm9kZSwgdGVuc29yTWFwLCBjb250ZXh0KSBhcyBUZW5zb3I1RCxcbiAgICAgICAgICAgICAgW2tlcm5lbFNpemVbMV0sIGtlcm5lbFNpemVbMl0sIGtlcm5lbFNpemVbM11dLFxuICAgICAgICAgICAgICBbc3RyaWRlWzFdLCBzdHJpZGVbMl0sIHN0cmlkZVszXV0sIHBhZCBhcyAndmFsaWQnIHwgJ3NhbWUnKV07XG4gICAgICAgIH1cblxuICAgICAgICBjYXNlICdNYXhQb29sM0QnOiB7XG4gICAgICAgICAgY29uc3Qgc3RyaWRlID1cbiAgICAgICAgICAgICAgZ2V0UGFyYW1WYWx1ZSgnc3RyaWRlcycsIG5vZGUsIHRlbnNvck1hcCwgY29udGV4dCkgYXMgbnVtYmVyW107XG4gICAgICAgICAgY29uc3QgcGFkID0gZ2V0UGFyYW1WYWx1ZSgncGFkJywgbm9kZSwgdGVuc29yTWFwLCBjb250ZXh0KTtcbiAgICAgICAgICBjb25zdCBrZXJuZWxTaXplID1cbiAgICAgICAgICAgICAgZ2V0UGFyYW1WYWx1ZSgna2VybmVsU2l6ZScsIG5vZGUsIHRlbnNvck1hcCwgY29udGV4dCkgYXMgbnVtYmVyW107XG5cbiAgICAgICAgICByZXR1cm4gW29wcy5tYXhQb29sM2QoXG4gICAgICAgICAgICAgIGdldFBhcmFtVmFsdWUoJ3gnLCBub2RlLCB0ZW5zb3JNYXAsIGNvbnRleHQpIGFzIFRlbnNvcjVELFxuICAgICAgICAgICAgICBba2VybmVsU2l6ZVsxXSwga2VybmVsU2l6ZVsyXSwga2VybmVsU2l6ZVszXV0sXG4gICAgICAgICAgICAgIFtzdHJpZGVbMV0sIHN0cmlkZVsyXSwgc3RyaWRlWzNdXSwgcGFkIGFzICd2YWxpZCcgfCAnc2FtZScpXTtcbiAgICAgICAgfVxuXG4gICAgICAgIGNhc2UgJ0RpbGF0aW9uMkQnOiB7XG4gICAgICAgICAgY29uc3Qgc3RyaWRlcyA9XG4gICAgICAgICAgICAgIGdldFBhcmFtVmFsdWUoJ3N0cmlkZXMnLCBub2RlLCB0ZW5zb3JNYXAsIGNvbnRleHQpIGFzIG51bWJlcltdO1xuICAgICAgICAgIGNvbnN0IHBhZCA9IGdldFBhcmFtVmFsdWUoJ3BhZCcsIG5vZGUsIHRlbnNvck1hcCwgY29udGV4dCk7XG4gICAgICAgICAgY29uc3QgZGlsYXRpb25zID1cbiAgICAgICAgICAgICAgZ2V0UGFyYW1WYWx1ZSgnZGlsYXRpb25zJywgbm9kZSwgdGVuc29yTWFwLCBjb250ZXh0KSBhcyBudW1iZXJbXTtcblxuICAgICAgICAgIC8vIHN0cmlkZXM6IFsxLCBzdHJpZGVfaGVpZ2h0LCBzdHJpZGVfd2lkdGgsIDFdLlxuICAgICAgICAgIGNvbnN0IHN0cmlkZUhlaWdodCA9IHN0cmlkZXNbMV07XG4gICAgICAgICAgY29uc3Qgc3RyaWRlV2lkdGggPSBzdHJpZGVzWzJdO1xuXG4gICAgICAgICAgLy8gZGlsYXRpb25zOiBbMSwgZGlsYXRpb25faGVpZ2h0LCBkaWxhdGlvbl93aWR0aCwgMV0uXG4gICAgICAgICAgY29uc3QgZGlsYXRpb25IZWlnaHQgPSBkaWxhdGlvbnNbMV07XG4gICAgICAgICAgY29uc3QgZGlsYXRpb25XaWR0aCA9IGRpbGF0aW9uc1syXTtcblxuICAgICAgICAgIHJldHVybiBbb3BzLmRpbGF0aW9uMmQoXG4gICAgICAgICAgICAgIGdldFBhcmFtVmFsdWUoJ3gnLCBub2RlLCB0ZW5zb3JNYXAsIGNvbnRleHQpIGFzIFRlbnNvcjNEIHxcbiAgICAgICAgICAgICAgICAgIFRlbnNvcjRELFxuICAgICAgICAgICAgICBnZXRQYXJhbVZhbHVlKCdmaWx0ZXInLCBub2RlLCB0ZW5zb3JNYXAsIGNvbnRleHQpIGFzIFRlbnNvcjNELFxuICAgICAgICAgICAgICBbc3RyaWRlSGVpZ2h0LCBzdHJpZGVXaWR0aF0sIHBhZCBhcyAndmFsaWQnIHwgJ3NhbWUnLFxuICAgICAgICAgICAgICBbZGlsYXRpb25IZWlnaHQsIGRpbGF0aW9uV2lkdGhdLCAnTkhXQycgLyogZGF0YUZvcm1hdCAqLyldO1xuICAgICAgICB9XG5cbiAgICAgICAgZGVmYXVsdDpcbiAgICAgICAgICB0aHJvdyBUeXBlRXJyb3IoYE5vZGUgdHlwZSAke25vZGUub3B9IGlzIG5vdCBpbXBsZW1lbnRlZGApO1xuICAgICAgfVxuICAgIH07XG5cbmV4cG9ydCBjb25zdCBDQVRFR09SWSA9ICdjb252b2x1dGlvbic7XG4iXX0=","/**\n * @license\n * Copyright 2018 Google LLC. All Rights Reserved.\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n * =============================================================================\n */\n// tslint:disable-next-line: no-imports-from-dist\nimport * as tfOps from '@tensorflow/tfjs-core/dist/ops/ops_for_converter';\nimport { getParamValue } from './utils';\nfunction nmsParams(node, tensorMap, context) {\n const boxes = getParamValue('boxes', node, tensorMap, context);\n const scores = getParamValue('scores', node, tensorMap, context);\n const maxOutputSize = getParamValue('maxOutputSize', node, tensorMap, context);\n const iouThreshold = getParamValue('iouThreshold', node, tensorMap, context);\n const scoreThreshold = getParamValue('scoreThreshold', node, tensorMap, context);\n const softNmsSigma = getParamValue('softNmsSigma', node, tensorMap, context);\n return {\n boxes,\n scores,\n maxOutputSize,\n iouThreshold,\n scoreThreshold,\n softNmsSigma\n };\n}\nexport const executeOp = async (node, tensorMap, context, resourceManager, ops = tfOps) => {\n switch (node.op) {\n case 'NonMaxSuppressionV5': {\n const { boxes, scores, maxOutputSize, iouThreshold, scoreThreshold, softNmsSigma } = nmsParams(node, tensorMap, context);\n const result = await ops.image.nonMaxSuppressionWithScoreAsync(boxes, scores, maxOutputSize, iouThreshold, scoreThreshold, softNmsSigma);\n return [result.selectedIndices, result.selectedScores];\n }\n case 'NonMaxSuppressionV4': {\n const { boxes, scores, maxOutputSize, iouThreshold, scoreThreshold } = nmsParams(node, tensorMap, context);\n const padToMaxOutputSize = getParamValue('padToMaxOutputSize', node, tensorMap, context);\n const result = await ops.image.nonMaxSuppressionPaddedAsync(boxes, scores, maxOutputSize, iouThreshold, scoreThreshold, padToMaxOutputSize);\n return [result.selectedIndices, result.validOutputs];\n }\n case 'NonMaxSuppressionV3':\n case 'NonMaxSuppressionV2': {\n const { boxes, scores, maxOutputSize, iouThreshold, scoreThreshold } = nmsParams(node, tensorMap, context);\n return [await ops.image.nonMaxSuppressionAsync(boxes, scores, maxOutputSize, iouThreshold, scoreThreshold)];\n }\n case 'Where': {\n const condition = ops.cast(getParamValue('condition', node, tensorMap, context), 'bool');\n const result = [await ops.whereAsync(condition)];\n condition.dispose();\n return result;\n }\n case 'ListDiff': {\n return ops.setdiff1dAsync(getParamValue('x', node, tensorMap, context), getParamValue('y', node, tensorMap, context));\n }\n default:\n throw TypeError(`Node type ${node.op} is not implemented`);\n }\n};\nexport const CATEGORY = 'dynamic';\n//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZHluYW1pY19leGVjdXRvci5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uLy4uLy4uL3RmanMtY29udmVydGVyL3NyYy9vcGVyYXRpb25zL2V4ZWN1dG9ycy9keW5hbWljX2V4ZWN1dG9yLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBOzs7Ozs7Ozs7Ozs7Ozs7R0FlRztBQUdILGlEQUFpRDtBQUNqRCxPQUFPLEtBQUssS0FBSyxNQUFNLGtEQUFrRCxDQUFDO0FBTzFFLE9BQU8sRUFBQyxhQUFhLEVBQUMsTUFBTSxTQUFTLENBQUM7QUFFdEMsU0FBUyxTQUFTLENBQ2QsSUFBVSxFQUFFLFNBQTBCLEVBQUUsT0FBeUI7SUFDbkUsTUFBTSxLQUFLLEdBQUcsYUFBYSxDQUFDLE9BQU8sRUFBRSxJQUFJLEVBQUUsU0FBUyxFQUFFLE9BQU8sQ0FBVyxDQUFDO0lBQ3pFLE1BQU0sTUFBTSxHQUFHLGFBQWEsQ0FBQyxRQUFRLEVBQUUsSUFBSSxFQUFFLFNBQVMsRUFBRSxPQUFPLENBQVcsQ0FBQztJQUMzRSxNQUFNLGFBQWEsR0FDZixhQUFhLENBQUMsZUFBZSxFQUFFLElBQUksRUFBRSxTQUFTLEVBQUUsT0FBTyxDQUFXLENBQUM7SUFDdkUsTUFBTSxZQUFZLEdBQ2QsYUFBYSxDQUFDLGNBQWMsRUFBRSxJQUFJLEVBQUUsU0FBUyxFQUFFLE9BQU8sQ0FBVyxDQUFDO0lBQ3RFLE1BQU0sY0FBYyxHQUNoQixhQUFhLENBQUMsZ0JBQWdCLEVBQUUsSUFBSSxFQUFFLFNBQVMsRUFBRSxPQUFPLENBQVcsQ0FBQztJQUN4RSxNQUFNLFlBQVksR0FDZCxhQUFhLENBQUMsY0FBYyxFQUFFLElBQUksRUFBRSxTQUFTLEVBQUUsT0FBTyxDQUFXLENBQUM7SUFFdEUsT0FBTztRQUNMLEtBQUs7UUFDTCxNQUFNO1FBQ04sYUFBYTtRQUNiLFlBQVk7UUFDWixjQUFjO1FBQ2QsWUFBWTtLQUNiLENBQUM7QUFDSixDQUFDO0FBRUQsTUFBTSxD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eXJpZ2h0IDIwMTggR29vZ2xlIExMQy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC5cbiAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSBcIkxpY2Vuc2VcIik7XG4gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuXG4gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXRcbiAqXG4gKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjBcbiAqXG4gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlXG4gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiBcIkFTIElTXCIgQkFTSVMsXG4gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC5cbiAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmRcbiAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLlxuICogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbiAqL1xuXG5pbXBvcnQge1RlbnNvciwgVGVuc29yMUQsIFRlbnNvcjJEfSBmcm9tICdAdGVuc29yZmxvdy90ZmpzLWNvcmUnO1xuLy8gdHNsaW50OmRpc2FibGUtbmV4dC1saW5lOiBuby1pbXBvcnRzLWZyb20tZGlzdFxuaW1wb3J0ICogYXMgdGZPcHMgZnJvbSAnQHRlbnNvcmZsb3cvdGZqcy1jb3JlL2Rpc3Qvb3BzL29wc19mb3JfY29udmVydGVyJztcblxuaW1wb3J0IHtOYW1lZFRlbnNvcnNNYXB9IGZyb20gJy4uLy4uL2RhdGEvdHlwZXMnO1xuaW1wb3J0IHtFeGVjdXRpb25Db250ZXh0fSBmcm9tICcuLi8uLi9leGVjdXRvci9leGVjdXRpb25fY29udGV4dCc7XG5pbXBvcnQgeyBSZXNvdXJjZU1hbmFnZXIgfSBmcm9tICcuLi8uLi9leGVjdXRvci9yZXNvdXJjZV9tYW5hZ2VyJztcbmltcG9ydCB7SW50ZXJuYWxPcEFzeW5jRXhlY3V0b3IsIE5vZGV9IGZyb20gJy4uL3R5cGVzJztcblxuaW1wb3J0IHtnZXRQYXJhbVZhbHVlfSBmcm9tICcuL3V0aWxzJztcblxuZnVuY3Rpb24gbm1zUGFyYW1zKFxuICAgIG5vZGU6IE5vZGUsIHRlbnNvck1hcDogTmFtZWRUZW5zb3JzTWFwLCBjb250ZXh0OiBFeGVjdXRpb25Db250ZXh0KSB7XG4gIGNvbnN0IGJveGVzID0gZ2V0UGFyYW1WYWx1ZSgnYm94ZXMnLCBub2RlLCB0ZW5zb3JNYXAsIGNvbnRleHQpIGFzIFRlbnNvcjtcbiAgY29uc3Qgc2NvcmVzID0gZ2V0UGFyYW1WYWx1ZSgnc2NvcmVzJywgbm9kZSwgdGVuc29yTWFwLCBjb250ZXh0KSBhcyBUZW5zb3I7XG4gIGNvbnN0IG1heE91dHB1dFNpemUgPVxuICAgICAgZ2V0UGFyYW1WYWx1ZSgnbWF4T3V0cHV0U2l6ZScsIG5vZGUsIHRlbnNvck1hcCwgY29udGV4dCkgYXMgbnVtYmVyO1xuICBjb25zdCBpb3VUaHJlc2hvbGQgPVxuICAgICAgZ2V0UGFyYW1WYWx1ZSgnaW91VGhyZXNob2xkJywgbm9kZSwgdGVuc29yTWFwLCBjb250ZXh0KSBhcyBudW1iZXI7XG4gIGNvbnN0IHNjb3JlVGhyZXNob2xkID1cbiAgICAgIGdldFBhcmFtVmFsdWUoJ3Njb3JlVGhyZXNob2xkJywgbm9kZSwgdGVuc29yTWFwLCBjb250ZXh0KSBhcyBudW1iZXI7XG4gIGNvbnN0IHNvZnRObXNTaWdtYSA9XG4gICAgICBnZXRQYXJhbVZhbHVlKCdzb2Z0Tm1zU2lnbWEnLCBub2RlLCB0ZW5zb3JNYXAsIGNvbnRleHQpIGFzIG51bWJlcjtcblxuICByZXR1cm4ge1xuICAgIGJveGVzLFxuICAgIHNjb3JlcyxcbiAgICBtYXhPdXRwdXRTaXplLFxuICAgIGlvdVRocmVzaG9sZCxcbiAgICBzY29yZVRocmVzaG9sZCxcbiAgICBzb2Z0Tm1zU2lnbWFcbiAgfTtcbn1cblxuZXhwb3J0IGNvbnN0IGV4ZWN1dGVPcDogSW50ZXJuYWxPcEFzeW5jRXhlY3V0b3IgPSBhc3luYyhcbiAgICBub2RlOiBOb2RlLCB0ZW5zb3JNYXA6IE5hbWVkVGVuc29yc01hcCxcbiAgICBjb250ZXh0OiBFeGVjdXRpb25Db250ZXh0LCByZXNvdXJjZU1hbmFnZXI6IFJlc291cmNlTWFuYWdlcixcbiAgICBvcHMgPSB0Zk9wcyk6IFByb21pc2U8VGVuc29yW10+ID0+IHtcbiAgc3dpdGNoIChub2RlLm9wKSB7XG4gICAgY2FzZSAnTm9uTWF4U3VwcHJlc3Npb25WNSc6IHtcbiAgICAgIGNvbnN0IHtcbiAgICAgICAgYm94ZXMsXG4gICAgICAgIHNjb3JlcyxcbiAgICAgICAgbWF4T3V0cHV0U2l6ZSxcbiAgICAgICAgaW91VGhyZXNob2xkLFxuICAgICAgICBzY29yZVRocmVzaG9sZCxcbiAgICAgICAgc29mdE5tc1NpZ21hXG4gICAgICB9ID0gbm1zUGFyYW1zKG5vZGUsIHRlbnNvck1hcCwgY29udGV4dCk7XG5cbiAgICAgIGNvbnN0IHJlc3VsdCA9IGF3YWl0IG9wcy5pbWFnZS5ub25NYXhTdXBwcmVzc2lvbldpdGhTY29yZUFzeW5jKFxuICAgICAgICAgIGJveGVzIGFzIFRlbnNvcjJELCBzY29yZXMgYXMgVGVuc29yMUQsIG1heE91dHB1dFNpemUsIGlvdVRocmVzaG9sZCxcbiAgICAgICAgICBzY29yZVRocmVzaG9sZCwgc29mdE5tc1NpZ21hKTtcblxuICAgICAgcmV0dXJuIFtyZXN1bHQuc2VsZWN0ZWRJbmRpY2VzLCByZXN1bHQuc2VsZWN0ZWRTY29yZXNdO1xuICAgIH1cbiAgICBjYXNlICdOb25NYXhTdXBwcmVzc2lvblY0Jzoge1xuICAgICAgY29uc3Qge2JveGVzLCBzY29yZXMsIG1heE91dHB1dFNpemUsIGlvdVRocmVzaG9sZCwgc2NvcmVUaHJlc2hvbGR9ID1cbiAgICAgICAgICBubXNQYXJhbXMobm9kZSwgdGVuc29yTWFwLCBjb250ZXh0KTtcblxuICAgICAgY29uc3QgcGFkVG9NYXhPdXRwdXRTaXplID1cbiAgICAgICAgICBnZXRQYXJhbVZhbHVlKCdwYWRUb01heE91dHB1dFNpemUnLCBub2RlLCB0ZW5zb3JNYXAsIGNvbnRleHQpIGFzXG4gICAgICAgICAgYm9vbGVhbjtcblxuICAgICAgY29uc3QgcmVzdWx0ID0gYXdhaXQgb3BzLmltYWdlLm5vbk1heFN1cHByZXNzaW9uUGFkZGVkQXN5bmMoXG4gICAgICAgICAgYm94ZXMgYXMgVGVuc29yMkQsIHNjb3JlcyBhcyBUZW5zb3IxRCwgbWF4T3V0cHV0U2l6ZSwgaW91VGhyZXNob2xkLFxuICAgICAgICAgIHNjb3JlVGhyZXNob2xkLCBwYWRUb01heE91dHB1dFNpemUpO1xuXG4gICAgICByZXR1cm4gW3Jlc3VsdC5zZWxlY3RlZEluZGljZXMsIHJlc3VsdC52YWxpZE91dHB1dHNdO1xuICAgIH1cbiAgICBjYXNlICdOb25NYXhTdXBwcmVzc2lvblYzJzpcbiAgICBjYXNlICdOb25NYXhTdXBwcmVzc2lvblYyJzoge1xuICAgICAgY29uc3Qge2JveGVzLCBzY29yZXMsIG1heE91dHB1dFNpemUsIGlvdVRocmVzaG9sZCwgc2NvcmVUaHJlc2hvbGR9ID1cbiAgICAgICAgICBubXNQYXJhbXMobm9kZSwgdGVuc29yTWFwLCBjb250ZXh0KTtcblxuICAgICAgcmV0dXJuIFthd2FpdCBvcHMuaW1hZ2Uubm9uTWF4U3VwcHJlc3Npb25Bc3luYyhcbiAgICAgICAgICBib3hlcyBhcyBUZW5zb3IyRCwgc2NvcmVzIGFzIFRlbnNvcjFELCBtYXhPdXRwdXRTaXplLCBpb3VUaHJlc2hvbGQsXG4gICAgICAgICAgc2NvcmVUaHJlc2hvbGQpXTtcbiAgICB9XG4gICAgY2FzZSAnV2hlcmUnOiB7XG4gICAgICBjb25zdCBjb25kaXRpb24gPSBvcHMuY2FzdChcbiAgICAgICAgICAoZ2V0UGFyYW1WYWx1ZSgnY29uZGl0aW9uJywgbm9kZSwgdGVuc29yTWFwLCBjb250ZXh0KSBhcyBUZW5zb3IpLFxuICAgICAgICAgICdib29sJyk7XG4gICAgICBjb25zdCByZXN1bHQgPSBbYXdhaXQgb3BzLndoZXJlQXN5bmMoY29uZGl0aW9uKV07XG4gICAgICBjb25kaXRpb24uZGlzcG9zZSgpO1xuICAgICAgcmV0dXJuIHJlc3VsdDtcbiAgICB9XG4gICAgY2FzZSAnTGlzdERpZmYnOiB7XG4gICAgICByZXR1cm4gb3BzLnNldGRpZmYxZEFzeW5jKFxuICAgICAgICAgIGdldFBhcmFtVmFsdWUoJ3gnLCBub2RlLCB0ZW5zb3JNYXAsIGNvbnRleHQpIGFzIFRlbnNvcixcbiAgICAgICAgICBnZXRQYXJhbVZhbHVlKCd5Jywgbm9kZSwgdGVuc29yTWFwLCBjb250ZXh0KSBhcyBUZW5zb3IpO1xuICAgIH1cbiAgICBkZWZhdWx0OlxuICAgICAgdGhyb3cgVHlwZUVycm9yKGBOb2RlIHR5cGUgJHtub2RlLm9wfSBpcyBub3QgaW1wbGVtZW50ZWRgKTtcbiAgfVxufTtcblxuZXhwb3J0IGNvbnN0IENBVEVHT1JZID0gJ2R5bmFtaWMnO1xuIl19","/**\n * @license\n * Copyright 2020 Google LLC. All Rights Reserved.\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n * =============================================================================\n */\nimport { keep, scalar, stack, tidy, unstack, util } from '@tensorflow/tfjs-core';\n// tslint:disable-next-line: no-imports-from-dist\nimport * as tfOps from '@tensorflow/tfjs-core/dist/ops/ops_for_converter';\n/**\n * Hashtable contains a set of tensors, which can be accessed by key.\n */\nexport class HashTable {\n /**\n * Constructor of HashTable. Creates a hash table.\n *\n * @param keyDType `dtype` of the table keys.\n * @param valueDType `dtype` of the table values.\n */\n constructor(keyDType, valueDType) {\n this.keyDType = keyDType;\n this.valueDType = valueDType;\n this.handle = scalar(0);\n // tslint:disable-next-line: no-any\n this.tensorMap = new Map();\n keep(this.handle);\n }\n get id() {\n return this.handle.id;\n }\n /**\n * Dispose the tensors and handle and clear the hashtable.\n */\n clearAndClose() {\n this.tensorMap.forEach(value => value.dispose());\n this.tensorMap.clear();\n this.handle.dispose();\n }\n /**\n * The number of items in the hash table.\n */\n size() {\n return this.tensorMap.size;\n }\n /**\n * The number of items in the hash table as a rank-0 tensor.\n */\n tensorSize() {\n return tfOps.scalar(this.size(), 'int32');\n }\n /**\n * Replaces the contents of the table with the specified keys and values.\n * @param keys Keys to store in the hashtable.\n * @param values Values to store in the hashtable.\n */\n async import(keys, values) {\n this.checkKeyAndValueTensor(keys, values);\n // We only store the primitive values of the keys, this allows lookup\n // to be O(1).\n const $keys = await keys.data();\n // Clear the hashTable before inserting new values.\n this.tensorMap.forEach(value => value.dispose());\n this.tensorMap.clear();\n return tidy(() => {\n const $values = unstack(values);\n const keysLength = $keys.length;\n const valuesLength = $values.length;\n util.assert(keysLength === valuesLength, () => `The number of elements doesn't match, keys has ` +\n `${keysLength} elements, the values has ${valuesLength} ` +\n `elements.`);\n for (let i = 0; i < keysLength; i++) {\n const key = $keys[i];\n const value = $values[i];\n keep(value);\n this.tensorMap.set(key, value);\n }\n return this.handle;\n });\n }\n /**\n * Looks up keys in a hash table, outputs the corresponding values.\n *\n * Performs batch lookups, for every element in the key tensor, `find`\n * stacks the corresponding value into the return tensor.\n *\n * If an element is not present in the table, the given `defaultValue` is\n * used.\n *\n * @param keys Keys to look up. Must have the same type as the keys of the\n * table.\n * @param defaultValue The scalar `defaultValue` is the value output for keys\n * not present in the table. It must also be of the same type as the\n * table values.\n */\n async find(keys, defaultValue) {\n this.checkKeyAndValueTensor(keys, defaultValue);\n const $keys = await keys.data();\n return tidy(() => {\n const result = [];\n for (let i = 0; i < $keys.length; i++) {\n const key = $keys[i];\n const value = this.findWithDefault(key, defaultValue);\n result.push(value);\n }\n return stack(result);\n });\n }\n // tslint:disable-next-line: no-any\n findWithDefault(key, defaultValue) {\n const result = this.tensorMap.get(key);\n return result != null ? result : defaultValue;\n }\n checkKeyAndValueTensor(key, value) {\n if (key.dtype !== this.keyDType) {\n throw new Error(`Expect key dtype ${this.keyDType}, but got ` +\n `${key.dtype}`);\n }\n if (value.dtype !== this.valueDType) {\n throw new Error(`Expect value dtype ${this.valueDType}, but got ` +\n `${value.dtype}`);\n }\n }\n}\n//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaGFzaF90YWJsZS5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uLy4uL3RmanMtY29udmVydGVyL3NyYy9leGVjdXRvci9oYXNoX3RhYmxlLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBOzs7Ozs7Ozs7Ozs7Ozs7R0FlRztBQUNILE9BQU8sRUFBVyxJQUFJLEVBQUUsTUFBTSxFQUFFLEtBQUssRUFBVSxJQUFJLEVBQUUsT0FBTyxFQUFFLElBQUksRUFBQyxNQUFNLHVCQUF1QixDQUFDO0FBQ2pHLGlEQUFpRDtBQUNqRCxPQUFPLEtBQUssS0FBSyxNQUFNLGtEQUFrRCxDQUFDO0FBRTFFOztHQUVHO0FBQ0gsTUFBTSxPQUFPLFNBQVM7SUFVcEI7Ozs7O09BS0c7SUFDSCxZQUFxQixRQUFrQixFQUFXLFVBQW9CO1FBQWpELGFBQVEsR0FBUixRQUFRLENBQVU7UUFBVyxlQUFVLEdBQVYsVUFBVSxDQUFVO1FBQ3BFLElBQUksQ0FBQyxNQUFNLEdBQUcsTUFBTSxDQUFDLENBQUMsQ0FBQyxDQUFDO1FBQ3hCLG1DQUFtQztRQUNuQyxJQUFJLENBQUMsU0FBUyxHQUFHLElBQUksR0FBRyxFQUFlLENBQUM7UUFFeEMsSUFBSSxDQUFDLElBQUksQ0FBQyxNQUFNLENBQUMsQ0FBQztJQUNwQixDQUFDO0lBaEJELElBQUksRUFBRTtRQUNKLE9BQU8sSUFBSSxDQUFDLE1BQU0sQ0FBQyxFQUFFLENBQUM7SUFDeEIsQ0FBQztJQWdCRDs7T0FFRztJQUNILGFBQWE7UUFDWCxJQUFJLENBQUMsU0FBUyxDQUFDLE9BQU8sQ0FBQyxLQUFLLENBQUMsRUFBRSxDQUFDLEtBQUssQ0FBQyxPQUFPLEVBQUUsQ0FBQyxDQUFDO1FBQ2pELElBQUksQ0FBQyxTQUFTLENBQUMsS0FBSyxFQUFFLENBQUM7UUFDdkIsSUFBSSxDQUFDLE1BQU0sQ0FBQyxPQUFPLEVBQUUsQ0FBQztJQUN4QixDQUFDO0lBRUQ7O09BRUc7SUFDSCxJQUFJO1FBQ0YsT0FB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QUM7SUFFTyxzQkFBc0IsQ0FBQyxHQUFXLEVBQUUsS0FBYTtRQUN2RCxJQUFJLEdBQUcsQ0FBQyxLQUFLLEtBQUssSUFBSSxDQUFDLFFBQVEsRUFBRTtZQUMvQixNQUFNLElBQUksS0FBSyxDQUNYLG9CQUFvQixJQUFJLENBQUMsUUFBUSxZQUFZO2dCQUM3QyxHQUFHLEdBQUcsQ0FBQyxLQUFLLEVBQUUsQ0FBQyxDQUFDO1NBQ3JCO1FBRUQsSUFBSSxLQUFLLENBQUMsS0FBSyxLQUFLLElBQUksQ0FBQyxVQUFVLEVBQUU7WUFDbkMsTUFBTSxJQUFJLEtBQUssQ0FDWCxzQkFBc0IsSUFBSSxDQUFDLFVBQVUsWUFBWTtnQkFDakQsR0FBRyxLQUFLLENBQUMsS0FBSyxFQUFFLENBQUMsQ0FBQztTQUN2QjtJQUNILENBQUM7Q0FDRiIsInNvdXJjZXNDb250ZW50IjpbIi8qKlxuICogQGxpY2Vuc2VcbiAqIENvcHlyaWdodCAyMDIwIEdvb2dsZSBMTEMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuXG4gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgXCJMaWNlbnNlXCIpO1xuICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLlxuICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0XG4gKlxuICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wXG4gKlxuICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZVxuICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gXCJBUyBJU1wiIEJBU0lTLFxuICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuXG4gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kXG4gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS5cbiAqID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4gKi9cbmltcG9ydCB7RGF0YVR5cGUsIGtlZXAsIHNjYWxhciwgc3RhY2ssIFRlbnNvciwgdGlkeSwgdW5zdGFjaywgdXRpbH0gZnJvbSAnQHRlbnNvcmZsb3cvdGZqcy1jb3JlJztcbi8vIHRzbGludDpkaXNhYmxlLW5leHQtbGluZTogbm8taW1wb3J0cy1mcm9tLWRpc3RcbmltcG9ydCAqIGFzIHRmT3BzIGZyb20gJ0B0ZW5zb3JmbG93L3RmanMtY29yZS9kaXN0L29wcy9vcHNfZm9yX2NvbnZlcnRlcic7XG5cbi8qKlxuICogSGFzaHRhYmxlIGNvbnRhaW5zIGEgc2V0IG9mIHRlbnNvcnMsIHdoaWNoIGNhbiBiZSBhY2Nlc3NlZCBieSBrZXkuXG4gKi9cbmV4cG9ydCBjbGFzcyBIYXNoVGFibGUge1xuICByZWFkb25seSBoYW5kbGU6IFRlbnNvcjtcblxuICAvLyB0c2xpbnQ6ZGlzYWJsZS1uZXh0LWxpbmU6IG5vLWFueVxuICBwcml2YXRlIHRlbnNvck1hcDogTWFwPGFueSwgVGVuc29yPjtcblxuICBnZXQgaWQoKSB7XG4gICAgcmV0dXJuIHRoaXMuaGFuZGxlLmlkO1xuICB9XG5cbiAgLyoqXG4gICAqIENvbnN0cnVjdG9yIG9mIEhhc2hUYWJsZS4gQ3JlYXRlcyBhIGhhc2ggdGFibGUuXG4gICAqXG4gICAqIEBwYXJhbSBrZXlEVHlwZSBgZHR5cGVgIG9mIHRoZSB0YWJsZSBrZXlzLlxuICAgKiBAcGFyYW0gdmFsdWVEVHlwZSBgZHR5cGVgIG9mIHRoZSB0YWJsZSB2YWx1ZXMuXG4gICAqL1xuICBjb25zdHJ1Y3RvcihyZWFkb25seSBrZXlEVHlwZTogRGF0YVR5cGUsIHJlYWRvbmx5IHZhbHVlRFR5cGU6IERhdGFUeXBlKSB7XG4gICAgdGhpcy5oYW5kbGUgPSBzY2FsYXIoMCk7XG4gICAgLy8gdHNsaW50OmRpc2FibGUtbmV4dC1saW5lOiBuby1hbnlcbiAgICB0aGlzLnRlbnNvck1hcCA9IG5ldyBNYXA8YW55LCBUZW5zb3I+KCk7XG5cbiAgICBrZWVwKHRoaXMuaGFuZGxlKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBEaXNwb3NlIHRoZSB0ZW5zb3JzIGFuZCBoYW5kbGUgYW5kIGNsZWFyIHRoZSBoYXNodGFibGUuXG4gICAqL1xuICBjbGVhckFuZENsb3NlKCkge1xuICAgIHRoaXMudGVuc29yTWFwLmZvckVhY2godmFsdWUgPT4gdmFsdWUuZGlzcG9zZSgpKTtcbiAgICB0aGlzLnRlbnNvck1hcC5jbGVhcigpO1xuICAgIHRoaXMuaGFuZGxlLmRpc3Bvc2UoKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBUaGUgbnVtYmVyIG9mIGl0ZW1zIGluIHRoZSBoYXNoIHRhYmxlLlxuICAgKi9cbiAgc2l6ZSgpOiBudW1iZXIge1xuICAgIHJldHVybiB0aGlzLnRlbnNvck1hcC5zaXplO1xuICB9XG5cbiAgLyoqXG4gICAqIFRoZSBudW1iZXIgb2YgaXRlbXMgaW4gdGhlIGhhc2ggdGFibGUgYXMgYSByYW5rLTAgdGVuc29yLlxuICAgKi9cbiAgdGVuc29yU2l6ZSgpOiBUZW5zb3Ige1xuICAgIHJldHVybiB0Zk9wcy5zY2FsYXIodGhpcy5zaXplKCksICdpbnQzMicpO1xuICB9XG5cbiAgLyoqXG4gICAqIFJlcGxhY2VzIHRoZSBjb250ZW50cyBvZiB0aGUgdGFibGUgd2l0aCB0aGUgc3BlY2lmaWVkIGtleXMgYW5kIHZhbHVlcy5cbiAgICogQHBhcmFtIGtleXMgS2V5cyB0byBzdG9yZSBpbiB0aGUgaGFzaHRhYmxlLlxuICAgKiBAcGFyYW0gdmFsdWVzIFZhbHVlcyB0byBzdG9yZSBpbiB0aGUgaGFzaHRhYmxlLlxuICAgKi9cbiAgYXN5bmMgaW1wb3J0KGtleXM6IFRlbnNvciwgdmFsdWVzOiBUZW5zb3IpOiBQcm9taXNlPFRlbnNvcj4ge1xuICAgIHRoaXMuY2hlY2tLZXlBbmRWYWx1ZVRlbnNvcihrZXlzLCB2YWx1ZXMpO1xuXG4gICAgLy8gV2Ugb25seSBzdG9yZSB0aGUgcHJpbWl0aXZlIHZhbHVlcyBvZiB0aGUga2V5cywgdGhpcyBhbGxvd3MgbG9va3VwXG4gICAgLy8gdG8gYmUgTygxKS5cbiAgICBjb25zdCAka2V5cyA9IGF3YWl0IGtleXMuZGF0YSgpO1xuXG4gICAgLy8gQ2xlYXIgdGhlIGhhc2hUYWJsZSBiZWZvcmUgaW5zZXJ0aW5nIG5ldyB2YWx1ZXMuXG4gICAgdGhpcy50ZW5zb3JNYXAuZm9yRWFjaCh2YWx1ZSA9PiB2YWx1ZS5kaXNwb3NlKCkpO1xuICAgIHRoaXMudGVuc29yTWFwLmNsZWFyKCk7XG5cbiAgICByZXR1cm4gdGlkeSgoKSA9PiB7XG4gICAgICBjb25zdCAkdmFsdWVzID0gdW5zdGFjayh2YWx1ZXMpO1xuXG4gICAgICBjb25zdCBrZXlzTGVuZ3RoID0gJGtleXMubGVuZ3RoO1xuICAgICAgY29uc3QgdmFsdWVzTGVuZ3RoID0gJHZhbHVlcy5sZW5ndGg7XG5cbiAgICAgIHV0aWwuYXNzZXJ0KFxuICAgICAgICAgIGtleXNMZW5ndGggPT09IHZhbHVlc0xlbmd0aCxcbiAgICAgICAgICAoKSA9PiBgVGhlIG51bWJlciBvZiBlbGVtZW50cyBkb2Vzbid0IG1hdGNoLCBrZXlzIGhhcyBgICtcbiAgICAgICAgICAgICAgYCR7a2V5c0xlbmd0aH0gZWxlbWVudHMsIHRoZSB2YWx1ZXMgaGFzICR7dmFsdWVzTGVuZ3RofSBgICtcbiAgICAgICAgICAgICAgYGVsZW1lbnRzLmApO1xuXG4gICAgICBmb3IgKGxldCBpID0gMDsgaSA8IGtleXNMZW5ndGg7IGkrKykge1xuICAgICAgICBjb25zdCBrZXkgPSAka2V5c1tpXTtcbiAgICAgICAgY29uc3QgdmFsdWUgPSAkdmFsdWVzW2ldO1xuXG4gICAgICAgIGtlZXAodmFsdWUpO1xuICAgICAgICB0aGlzLnRlbnNvck1hcC5zZXQoa2V5LCB2YWx1ZSk7XG4gICAgICB9XG5cbiAgICAgIHJldHVybiB0aGlzLmhhbmRsZTtcbiAgICB9KTtcbiAgfVxuXG4gIC8qKlxuICAgKiBMb29rcyB1cCBrZXlzIGluIGEgaGFzaCB0YWJsZSwgb3V0cHV0cyB0aGUgY29ycmVzcG9uZGluZyB2YWx1ZXMuXG4gICAqXG4gICAqIFBlcmZvcm1zIGJhdGNoIGxvb2t1cHMsIGZvciBldmVyeSBlbGVtZW50IGluIHRoZSBrZXkgdGVuc29yLCBgZmluZGBcbiAgICogc3RhY2tzIHRoZSBjb3JyZXNwb25kaW5nIHZhbHVlIGludG8gdGhlIHJldHVybiB0ZW5zb3IuXG4gICAqXG4gICAqIElmIGFuIGVsZW1lbnQgaXMgbm90IHByZXNlbnQgaW4gdGhlIHRhYmxlLCB0aGUgZ2l2ZW4gYGRlZmF1bHRWYWx1ZWAgaXNcbiAgICogdXNlZC5cbiAgICpcbiAgICogQHBhcmFtIGtleXMgS2V5cyB0byBsb29rIHVwLiBNdXN0IGhhdmUgdGhlIHNhbWUgdHlwZSBhcyB0aGUga2V5cyBvZiB0aGVcbiAgICogICAgIHRhYmxlLlxuICAgKiBAcGFyYW0gZGVmYXVsdFZhbHVlIFRoZSBzY2FsYXIgYGRlZmF1bHRWYWx1ZWAgaXMgdGhlIHZhbHVlIG91dHB1dCBmb3Iga2V5c1xuICAgKiAgICAgbm90IHByZXNlbnQgaW4gdGhlIHRhYmxlLiBJdCBtdXN0IGFsc28gYmUgb2YgdGhlIHNhbWUgdHlwZSBhcyB0aGVcbiAgICogICAgIHRhYmxlIHZhbHVlcy5cbiAgICovXG4gIGFzeW5jIGZpbmQoa2V5czogVGVuc29yLCBkZWZhdWx0VmFsdWU6IFRlbnNvcik6IFByb21pc2U8VGVuc29yPiB7XG4gICAgdGhpcy5jaGVja0tleUFuZFZhbHVlVGVuc29yKGtleXMsIGRlZmF1bHRWYWx1ZSk7XG5cbiAgICBjb25zdCAka2V5cyA9IGF3YWl0IGtleXMuZGF0YSgpO1xuXG4gICAgcmV0dXJuIHRpZHkoKCkgPT4ge1xuICAgICAgY29uc3QgcmVzdWx0OiBUZW5zb3JbXSA9IFtdO1xuXG4gICAgICBmb3IgKGxldCBpID0gMDsgaSA8ICRrZXlzLmxlbmd0aDsgaSsrKSB7XG4gICAgICAgIGNvbnN0IGtleSA9ICRrZXlzW2ldO1xuXG4gICAgICAgIGNvbnN0IHZhbHVlID0gdGhpcy5maW5kV2l0aERlZmF1bHQoa2V5LCBkZWZhdWx0VmFsdWUpO1xuICAgICAgICByZXN1bHQucHVzaCh2YWx1ZSk7XG4gICAgICB9XG5cbiAgICAgIHJldHVybiBzdGFjayhyZXN1bHQpO1xuICAgIH0pO1xuICB9XG5cbiAgLy8gdHNsaW50OmRpc2FibGUtbmV4dC1saW5lOiBuby1hbnlcbiAgcHJpdmF0ZSBmaW5kV2l0aERlZmF1bHQoa2V5OiBhbnksIGRlZmF1bHRWYWx1ZTogVGVuc29yKTogVGVuc29yIHtcbiAgICBjb25zdCByZXN1bHQgPSB0aGlzLnRlbnNvck1hcC5nZXQoa2V5KTtcblxuICAgIHJldHVybiByZXN1bHQgIT0gbnVsbCA/IHJlc3VsdCA6IGRlZmF1bHRWYWx1ZTtcbiAgfVxuXG4gIHByaXZhdGUgY2hlY2tLZXlBbmRWYWx1ZVRlbnNvcihrZXk6IFRlbnNvciwgdmFsdWU6IFRlbnNvcikge1xuICAgIGlmIChrZXkuZHR5cGUgIT09IHRoaXMua2V5RFR5cGUpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcihcbiAgICAgICAgICBgRXhwZWN0IGtleSBkdHlwZSAke3RoaXMua2V5RFR5cGV9LCBidXQgZ290IGAgK1xuICAgICAgICAgIGAke2tleS5kdHlwZX1gKTtcbiAgICB9XG5cbiAgICBpZiAodmFsdWUuZHR5cGUgIT09IHRoaXMudmFsdWVEVHlwZSkge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKFxuICAgICAgICAgIGBFeHBlY3QgdmFsdWUgZHR5cGUgJHt0aGlzLnZhbHVlRFR5cGV9LCBidXQgZ290IGAgK1xuICAgICAgICAgIGAke3ZhbHVlLmR0eXBlfWApO1xuICAgIH1cbiAgfVxufVxuIl19","/**\n * @license\n * Copyright 2018 Google LLC. All Rights Reserved.\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n * =============================================================================\n */\nimport * as tfc from '@tensorflow/tfjs-core';\nimport { NodeValueImpl } from './custom_op/node_value_impl';\nimport { getRegisteredOp } from './custom_op/register';\nimport * as arithmetic from './executors/arithmetic_executor';\nimport * as basicMath from './executors/basic_math_executor';\nimport * as control from './executors/control_executor';\nimport * as convolution from './executors/convolution_executor';\nimport * as creation from './executors/creation_executor';\nimport * as dynamic from './executors/dynamic_executor';\nimport * as evaluation from './executors/evaluation_executor';\nimport * as graph from './executors/graph_executor';\nimport * as hashTable from './executors/hash_table_executor';\nimport * as image from './executors/image_executor';\nimport * as logical from './executors/logical_executor';\nimport * as matrices from './executors/matrices_executor';\nimport * as normalization from './executors/normalization_executor';\nimport * as reduction from './executors/reduction_executor';\nimport * as sliceJoin from './executors/slice_join_executor';\nimport * as sparse from './executors/sparse_executor';\nimport * as spectral from './executors/spectral_executor';\nimport * as string from './executors/string_executor';\nimport * as transformation from './executors/transformation_executor';\n/**\n * Executes the op defined by the node object.\n * @param node\n * @param tensorMap contains tensors for executed nodes and weights\n * @param context contains tensors and information for running the current node.\n * @param resourceManager Optional. Contains global resources of the model.\n */\nexport function executeOp(node, tensorMap, context, resourceManager, tidy = tfc.tidy) {\n const value = ((node, tensorMap, context) => {\n switch (node.category) {\n case 'arithmetic':\n return tidy(() => arithmetic.executeOp(node, tensorMap, context));\n case 'basic_math':\n return tidy(() => basicMath.executeOp(node, tensorMap, context));\n case 'control':\n return control.executeOp(node, tensorMap, context);\n case 'convolution':\n return tidy(() => convolution.executeOp(node, tensorMap, context));\n case 'creation':\n return tidy(() => creation.executeOp(node, tensorMap, context));\n case 'dynamic':\n return dynamic.executeOp(node, tensorMap, context);\n case 'evaluation':\n return tidy(() => evaluation.executeOp(node, tensorMap, context));\n case 'image':\n return tidy(() => image.executeOp(node, tensorMap, context));\n case 'graph':\n return tidy(() => graph.executeOp(node, tensorMap, context));\n case 'logical':\n return tidy(() => logical.executeOp(node, tensorMap, context));\n case 'matrices':\n return tidy(() => matrices.executeOp(node, tensorMap, context));\n case 'normalization':\n return tidy(() => normalization.executeOp(node, tensorMap, context));\n case 'reduction':\n return tidy(() => reduction.executeOp(node, tensorMap, context));\n case 'slice_join':\n return tidy(() => sliceJoin.executeOp(node, tensorMap, context));\n case 'sparse':\n return tidy(() => sparse.executeOp(node, tensorMap, context));\n case 'spectral':\n return tidy(() => spectral.executeOp(node, tensorMap, context));\n case 'string':\n return tidy(() => string.executeOp(node, tensorMap, context));\n case 'transformation':\n return tidy(() => transformation.executeOp(node, tensorMap, context));\n case 'hash_table':\n return hashTable.executeOp(node, tensorMap, context, resourceManager);\n case 'custom':\n const opMapper = getRegisteredOp(node.op);\n if (opMapper && opMapper.customExecutor) {\n return opMapper.customExecutor(new NodeValueImpl(node, tensorMap, context));\n }\n else {\n throw TypeError(`Custom op ${node.op} is not registered.`);\n }\n default:\n throw TypeError(`Unknown op '${node.op}'. File an issue at ` +\n `https://github.com/tensorflow/tfjs/issues so we can add it` +\n `, or register a custom execution with tf.registerOp()`);\n }\n })(node, tensorMap, context);\n if (tfc.util.isPromise(value)) {\n return value.then((data) => [].concat(data));\n }\n return [].concat(value);\n}\n//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoib3BlcmF0aW9uX2V4ZWN1dG9yLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vLi4vdGZqcy1jb252ZXJ0ZXIvc3JjL29wZXJhdGlvbnMvb3BlcmF0aW9uX2V4ZWN1dG9yLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBOzs7Ozs7Ozs7Ozs7Ozs7R0FlRztBQUVILE9BQU8sS0FBSyxHQUFHLE1BQU0sdUJBQXVCLENBQUM7QUFNN0MsT0FBTyxFQUFDLGFBQWEsRUFBQyxNQUFNLDZCQUE2QixDQUFDO0FBQzFELE9BQU8sRUFBQyxlQUFlLEVBQUMsTUFBTSxzQkFBc0IsQ0FBQztBQUNyRCxPQUFPLEtBQUssVUFBVSxNQUFNLGlDQUFpQyxDQUFDO0FBQzlELE9BQU8sS0FBSyxTQUFTLE1BQU0saUNBQWlDLENBQUM7QUFDN0QsT0FBTyxLQUFLLE9BQU8sTUFBTSw4QkFBOEIsQ0FBQztBQUN4RCxPQUFPLEtBQUssV0FBVyxNQUFNLGtDQUFrQyxDQUFDO0FBQ2hFLE9BQU8sS0FBSyxRQUFRLE1BQU0sK0JBQStCLENBQUM7QUFDMUQsT0FBTyxLQUFLLE9BQU8sTUFBTSw4QkFBOEIsQ0FBQztBQUN4RCxPQUFPLEtBQUssVUFBVSxNQUFNLGlDQUFpQyxDQUFDO0FBQzlELE9BQU8sS0FBSyxLQUFLLE1BQU0sNEJBQTRCLENBQUM7QUFDcEQsT0FBTyxLQUFLLFNBQVMsTUFBTSxpQ0FBaUMsQ0FBQztBQUM3RCxPQUFPLEtBQUssS0FBSyxNQUFNLDRCQUE0QixDQUFDO0FBQ3BELE9BQU8sS0FBSyxPQUFPLE1BQU0sOEJBQThCLENBQUM7QUFDeEQsT0FBTyxLQUFLLFFBQVEsTUFBTSwrQkFBK0IsQ0FBQztBQUMxRCxPQUFPLEtBQUssYUFBYSxNQUFNLG9DQUFvQyxDQUFDO0FBQ3BFLE9BQU8sS0FBSyxTQUFTLE1BQU0sZ0NBQWdDLENBQUM7QUFDNUQsT0FBTyxLQUFLLFNBQVMsTUFBTSxpQ0FBaUMsQ0FBQztBQUM3RCxPQUFPLEtBQUssTUFBTSxNQUFNLDZCQUE2QixDQUFDO0FBQ3RELE9BQU8sS0FBSyxRQUFRLE1BQU0sK0JBQStCLENBQUM7QUFDMUQsT0FBTyxLQUFLLE1BQU0sTUFBTSw2QkFBNkIsQ0FBQztBQUN0RCxPQUFPLEtBQUssY0FBYyxNQUFNLHFDQUFxQyxDQUFDO0FBR3RFOzs7Ozs7R0FNRztBQUNILE1BQU0sVUFBVSxTQUFTLENBQ3JCLElBQVUsRUFBRSxTQUEwQixFQUFFLE9BQXlCLEVBQ2pFLGVBQWlDLEVBQUUsSUFBSSxHQUFHLEdBQUcsQ0FBQyxJQUFJO0lBRXBELE1BQU0sS0FBSyxHQUNQLENBQUMsQ0FBQyxJQUFVLEVBQUUsU0FBMEIsRUFBRSxPQUF5QixFQUFFLEVBQUU7UUFDckUsUUFBUSxJQUFJLENBQUMsUUFBUSxFQUFFO1lBQ3JCLEtBQUssWUFBWTtnQkFDZixPQUFPLElBQUksQ0FBQyxHQUFHLEVBQUUsQ0FBQyxVQUFVLENBQUMsU0FBUyxDQUFDLElBQUksRUFBRSxTQUFTLEVBQUUsT0FBTyxDQUFDLENBQUMsQ0FBQztZQUNwRSxLQUFLLFlBQVk7Z0JBQ2YsT0FBTyxJQUFJLENBQUMsR0FBRyxFQUFFLENBQUMsU0FBUyxDQUFDLFNBQVMsQ0FBQyxJQUFJLEVBQUUsU0FBUyxFQUFFLE9BQU8sQ0FBQyxDQUFDLENBQUM7WUFDbkUsS0FBSyxTQUFTO2dCQUNaLE9BQU8sT0FBTyxDQUFDLFNBQVMsQ0FBQyxJQUFJLEVBQUUsU0FBUyxFQUFFLE9BQU8sQ0FBQyxDQUFDO1lBQ3JELEtBQUssYUFBYTtnQkFDaEIsT0FBTyxJQUFJLENBQUMsR0FBRyxFQUFFLENBQUMsV0FBVyxDQUFDLFNBQVMsQ0FBQyxJQUFJLEVBQUUsU0FBUyxFQUFFLE9BQU8sQ0FBQyxDQUFDLENBQUM7WUFDckUsS0FBSyxVQUFVO2dCQUNiLE9BQU8sSUFBSSxDQUFDLEdBQUcsRUFBRSxDQUFDLFFBQVEsQ0FBQyxTQUFTLENBQUMsSUFBSSxFQUFFLFNBQVMsRUFBRSxPQUFPLENBQUMsQ0FBQyxDQUFDO1lBQ2xFLEtBQUssU0FBUztnQkFDWixPQUFPLE9BQU8sQ0FBQyxTQUFTLENBQUMsSUFBSSxFQUFFLFNBQVMsRUFBRSxPQUFPLENBQUMsQ0FBQztZQUNyRCxLQUFLLFlBQVk7Z0JBQ2YsT0FBTyxJQUFJLENBQUMsR0FBRyxFQUFFLENBQUMsVUFBVSxDQUFDLFNBQVMsQ0FBQyxJQUFJLEVBQUUsU0FBUyxFQUFFLE9BQU8sQ0FBQyxDQUFDLENBQUM7WUFDcEUsS0FBSyxPQUFPO2dCQUNWLE9BQU8sSUFBSSxDQUFDLEdBQUcsRUFBRSxDQUFDLEtBQUssQ0FBQyxTQUFTLENBQUMsSUFBSSxFQUFFLFNBQVMsRUFBRSxPQUFPLENBQUMsQ0FBQyxDQUFDO1lBQy9ELEtBQUssT0FBTztnQkFDVixPQUFPLElBQUksQ0FBQyxHQUFHLEVBQUUsQ0FBQyxLQUFLLENBQUMsU0FBUyxDQUFDLElBQUksRUFBRSxTQUFTLEVBQUUsT0FBTyxDQUFDLENBQUMsQ0FBQztZQUMvRCxLQUFLLFNBQVM7Z0JBQ1osT0FBTyxJQUFJLENBQUMsR0FBRyxFQUFFLENBQUMsT0FBTyxDQUFDLFNBQVMsQ0FBQyxJQUFJLEVBQUUsU0FBUyxFQUFFLE9BQU8sQ0FBQyxDQUFDLENBQUM7WUFDakUsS0FBSyxVQUFVO2dCQUNiLE9BQU8sSUFBSSxDQUFDLEdBQUcsRUFBRSxDQUFDLFFBQVEsQ0FBQyxTQUFTLENBQUMsSUFBSSxFQUFFLFNBQVMsRUFBRSxPQUFPLENBQUMsQ0FBQyxDQUFDO1lBQ2xFLEtBQUssZUFBZTtnQkFDbEIsT0FBTyxJQUFJLENBQ1AsR0FBRyxFQUFFLENBQUMsYUFBYSxDQUFDLFNBQVMsQ0FBQyxJQUFJLEVBQUUsU0FBUyxFQUFFLE9BQU8sQ0FBQyxDQUFDLENBQUM7WUFDL0QsS0FBSyxXQUFXO2dCQUNkLE9BQU8sSUFBSSxDQUFDLEdBQUcsRUFBRSxDQUFDLFNBQVMsQ0FBQyxTQUFTLENBQUMsSUFBSSxFQUFFLFNBQVMsRUFBRSxPQUFPLENBQUMsQ0FBQyxDQUFDO1lBQ25FLEtBQUssWUFBWTtnQkFDZixPQUFPLElBQUksQ0FBQyxHQUFHLEVBQUUsQ0FBQyxTQUFTLENBQUMsU0FBUyxDQUFDLElBQUksRUFBRSxTQUFTLEVBQUUsT0FBTyxDQUFDLENBQUMsQ0FBQztZQUNuRSxLQUFLLFFBQVE7Z0JBQ1gsT0FBTyxJQUFJLENBQUMsR0FBRyxFQUFFLENBQUMsTUFBTSxDQUFDLFNBQVMsQ0FBQyxJQUFJLEVBQUUsU0FBUyxFQUFFLE9BQU8sQ0FBQyxDQUFDLENBQUM7WUFDaEUsS0FBSyxVQUFVO2dCQUNiLE9BQU8sSUFBSSxDQUFDLEdBQUcsRUFBRSxDQUFDLFFBQVEsQ0FBQyxTQUFTLENBQUMsSUFBSSxFQUFFLFNBQVMsRUFBRSxPQUFPLENBQUMsQ0FBQyxDQUFDO1lBQ2xFLEtBQUssUUFBUTtnQkFDWCxPQUFPLElBQUksQ0FBQyxHQUFHLEVBQUUsQ0FBQyxNQUFNLENBQUMsU0FBUyxDQUFDLElBQUksRUFBRSxTQUFTLEVBQUUsT0FBTyxDQUFDLENBQUMsQ0FBQztZQUNoRSxLQUFLLGdCQUFnQjtnQkFDbkIsT0FBTyxJQUFJLENBQ1AsR0FBRyxFQUFFLENBQUMsY0FBYyxDQUFDLFNBQVMsQ0FBQyxJQUFJLEVBQUUsU0FBUyxFQUFFLE9BQU8sQ0FBQyxDQUFDLENBQUM7WUFDaEUsS0FBSyxZQUFZO2dCQUNmLE9BQU8sU0FBUyxDQUFDLFNBQVMsQ0FDdEIsSUFBSSxFQUFFLFNBQVMsRUFBRSxPQUFPLEVBQUUsZUFBZSxDQUFDLENBQUM7WUFDakQsS0FBSyxRQUFRO2dCQUNYLE1BQU0sUUFBUSxHQUFHLGVBQWUsQ0FBQyxJQUFJLENBQUMsRUFBRSxDQUFDLENBQUM7Z0JBQzFDLElBQUksUUFBUSxJQUFJLFFBQVEsQ0FBQyxjQUFjLEVBQUU7b0JBQ3ZDLE9BQU8sUUFBUSxDQUFDLGNBQWMsQ0FDMUIsSUFBSSxhQUFhLENBQUMsSUFBSSxFQUFFLFNBQVMsRUFBRSxPQUFPLENBQUMsQ0FBQyxDQUFDO2lCQUNsRDtxQkFBTTtvQkFDTCxNQUFNLFNBQVMsQ0FBQyxhQUFhLElBQUksQ0FBQyxFQUFFLHFCQUFxQixDQUFDLENBQUM7aUJBQzVEO1lBQ0g7Z0JBQ0UsTUFBTSxTQUFTLENBQ1gsZUFBZSxJQUFJLENBQUMsRUFBRSxzQkFBc0I7b0JBQzVDLDREQUE0RDtvQkFDNUQsdURBQXVELENBQUMsQ0FBQztTQUNoRTtJQUNILENBQUMsQ0FBQyxDQUFDLElBQUksRUFBRSxTQUFTLEVBQUUsT0FBTyxDQUFDLENBQUM7SUFDakMsSUFBSSxHQUFHLENBQUMsSUFBSSxDQUFDLFNBQVMsQ0FBQyxLQUFLLENBQUMsRUFBRTtRQUM3QixPQUFPLEtBQUssQ0FBQyxJQUFJLENBQUMsQ0FBQyxJQUFJLEVBQUUsRUFBRSxDQUFDLEVBQUUsQ0FBQyxNQUFNLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQztLQUM5QztJQUNELE9BQU8sRUFBRSxDQUFDLE1BQU0sQ0FBQyxLQUFLLENBQUMsQ0FBQztBQUMxQixDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiLyoqXG4gKiBAbGljZW5zZVxuICogQ29weXJpZ2h0IDIwMTggR29vZ2xlIExMQy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC5cbiAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSBcIkxpY2Vuc2VcIik7XG4gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuXG4gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXRcbiAqXG4gKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjBcbiAqXG4gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlXG4gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiBcIkFTIElTXCIgQkFTSVMsXG4gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC5cbiAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmRcbiAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLlxuICogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbiAqL1xuXG5pbXBvcnQgKiBhcyB0ZmMgZnJvbSAnQHRlbnNvcmZsb3cvdGZqcy1jb3JlJztcblxuaW1wb3J0IHtOYW1lZFRlbnNvcnNNYXB9IGZyb20gJy4uL2RhdGEvdHlwZXMnO1xuaW1wb3J0IHtFeGVjdXRpb25Db250ZXh0fSBmcm9tICcuLi9leGVjdXRvci9leGVjdXRpb25fY29udGV4dCc7XG5pbXBvcnQge1Jlc291cmNlTWFuYWdlcn0gZnJvbSAnLi4vZXhlY3V0b3IvcmVzb3VyY2VfbWFuYWdlcic7XG5cbmltcG9ydCB7Tm9kZVZhbHVlSW1wbH0gZnJvbSAnLi9jdXN0b21fb3Avbm9kZV92YWx1ZV9pbXBsJztcbmltcG9ydCB7Z2V0UmVnaXN0ZXJlZE9wfSBmcm9tICcuL2N1c3RvbV9vcC9yZWdpc3Rlcic7XG5pbXBvcnQgKiBhcyBhcml0aG1ldGljIGZyb20gJy4vZXhlY3V0b3JzL2FyaXRobWV0aWNfZXhlY3V0b3InO1xuaW1wb3J0ICogYXMgYmFzaWNNYXRoIGZyb20gJy4vZXhlY3V0b3JzL2Jhc2ljX21hdGhfZXhlY3V0b3InO1xuaW1wb3J0ICogYXMgY29udHJvbCBmcm9tICcuL2V4ZWN1dG9ycy9jb250cm9sX2V4ZWN1dG9yJztcbmltcG9ydCAqIGFzIGNvbnZvbHV0aW9uIGZyb20gJy4vZXhlY3V0b3JzL2NvbnZvbHV0aW9uX2V4ZWN1dG9yJztcbmltcG9ydCAqIGFzIGNyZWF0aW9uIGZyb20gJy4vZXhlY3V0b3JzL2NyZWF0aW9uX2V4ZWN1dG9yJztcbmltcG9ydCAqIGFzIGR5bmFtaWMgZnJvbSAnLi9leGVjdXRvcnMvZHluYW1pY19leGVjdXRvcic7XG5pbXBvcnQgKiBhcyBldmFsdWF0aW9uIGZyb20gJy4vZXhlY3V0b3JzL2V2YWx1YXRpb25fZXhlY3V0b3InO1xuaW1wb3J0ICogYXMgZ3JhcGggZnJvbSAnLi9leGVjdXRvcnMvZ3JhcGhfZXhlY3V0b3InO1xuaW1wb3J0ICogYXMgaGFzaFRhYmxlIGZyb20gJy4vZXhlY3V0b3JzL2hhc2hfdGFibGVfZXhlY3V0b3InO1xuaW1wb3J0ICogYXMgaW1hZ2UgZnJvbSAnLi9leGVjdXRvcnMvaW1hZ2VfZXhlY3V0b3InO1xuaW1wb3J0ICogYXMgbG9naWNhbCBmcm9tICcuL2V4ZWN1dG9ycy9sb2dpY2FsX2V4ZWN1dG9yJztcbmltcG9ydCAqIGFzIG1hdHJpY2VzIGZyb20gJy4vZXhlY3V0b3JzL21hdHJpY2VzX2V4ZWN1dG9yJztcbmltcG9ydCAqIGFzIG5vcm1hbGl6YXRpb24gZnJvbSAnLi9leGVjdXRvcnMvbm9ybWFsaXphdGlvbl9leGVjdXRvcic7XG5pbXBvcnQgKiBhcyByZWR1Y3Rpb24gZnJvbSAnLi9leGVjdXRvcnMvcmVkdWN0aW9uX2V4ZWN1dG9yJztcbmltcG9ydCAqIGFzIHNsaWNlSm9pbiBmcm9tICcuL2V4ZWN1dG9ycy9zbGljZV9qb2luX2V4ZWN1dG9yJztcbmltcG9ydCAqIGFzIHNwYXJzZSBmcm9tICcuL2V4ZWN1dG9ycy9zcGFyc2VfZXhlY3V0b3InO1xuaW1wb3J0ICogYXMgc3BlY3RyYWwgZnJvbSAnLi9leGVjdXRvcnMvc3BlY3RyYWxfZXhlY3V0b3InO1xuaW1wb3J0ICogYXMgc3RyaW5nIGZyb20gJy4vZXhlY3V0b3JzL3N0cmluZ19leGVjdXRvcic7XG5pbXBvcnQgKiBhcyB0cmFuc2Zvcm1hdGlvbiBmcm9tICcuL2V4ZWN1dG9ycy90cmFuc2Zvcm1hdGlvbl9leGVjdXRvcic7XG5pbXBvcnQge05vZGV9IGZyb20gJy4vdHlwZXMnO1xuXG4vKipcbiAqIEV4ZWN1dGVzIHRoZSBvcCBkZWZpbmVkIGJ5IHRoZSBub2RlIG9iamVjdC5cbiAqIEBwYXJhbSBub2RlXG4gKiBAcGFyYW0gdGVuc29yTWFwIGNvbnRhaW5zIHRlbnNvcnMgZm9yIGV4ZWN1dGVkIG5vZGVzIGFuZCB3ZWlnaHRzXG4gKiBAcGFyYW0gY29udGV4dCBjb250YWlucyB0ZW5zb3JzIGFuZCBpbmZvcm1hdGlvbiBmb3IgcnVubmluZyB0aGUgY3VycmVudCBub2RlLlxuICogQHBhcmFtIHJlc291cmNlTWFuYWdlciBPcHRpb25hbC4gQ29udGFpbnMgZ2xvYmFsIHJlc291cmNlcyBvZiB0aGUgbW9kZWwuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBleGVjdXRlT3AoXG4gICAgbm9kZTogTm9kZSwgdGVuc29yTWFwOiBOYW1lZFRlbnNvcnNNYXAsIGNvbnRleHQ6IEV4ZWN1dGlvbkNvbnRleHQsXG4gICAgcmVzb3VyY2VNYW5hZ2VyPzogUmVzb3VyY2VNYW5hZ2VyLCB0aWR5ID0gdGZjLnRpZHkpOiB0ZmMuVGVuc29yW118XG4gICAgUHJvbWlzZTx0ZmMuVGVuc29yW10+IHtcbiAgY29uc3QgdmFsdWUgPVxuICAgICAgKChub2RlOiBOb2RlLCB0ZW5zb3JNYXA6IE5hbWVkVGVuc29yc01hcCwgY29udGV4dDogRXhlY3V0aW9uQ29udGV4dCkgPT4ge1xuICAgICAgICBzd2l0Y2ggKG5vZGUuY2F0ZWdvcnkpIHtcbiAgICAgICAgICBjYXNlICdhcml0aG1ldGljJzpcbiAgICAgICAgICAgIHJldHVybiB0aWR5KCgpID0+IGFyaXRobWV0aWMuZXhlY3V0ZU9wKG5vZGUsIHRlbnNvck1hcCwgY29udGV4dCkpO1xuICAgICAgICAgIGNhc2UgJ2Jhc2ljX21hdGgnOlxuICAgICAgICAgICAgcmV0dXJuIHRpZHkoKCkgPT4gYmFzaWNNYXRoLmV4ZWN1dGVPcChub2RlLCB0ZW5zb3JNYXAsIGNvbnRleHQpKTtcbiAgICAgICAgICBjYXNlICdjb250cm9sJzpcbiAgICAgICAgICAgIHJldHVybiBjb250cm9sLmV4ZWN1dGVPcChub2RlLCB0ZW5zb3JNYXAsIGNvbnRleHQpO1xuICAgICAgICAgIGNhc2UgJ2NvbnZvbHV0aW9uJzpcbiAgICAgICAgICAgIHJldHVybiB0aWR5KCgpID0+IGNvbnZvbHV0aW9uLmV4ZWN1dGVPcChub2RlLCB0ZW5zb3JNYXAsIGNvbnRleHQpKTtcbiAgICAgICAgICBjYXNlICdjcmVhdGlvbic6XG4gICAgICAgICAgICByZXR1cm4gdGlkeSgoKSA9PiBjcmVhdGlvbi5leGVjdXRlT3Aobm9kZSwgdGVuc29yTWFwLCBjb250ZXh0KSk7XG4gICAgICAgICAgY2FzZSAnZHluYW1pYyc6XG4gICAgICAgICAgICByZXR1cm4gZHluYW1pYy5leGVjdXRlT3Aobm9kZSwgdGVuc29yTWFwLCBjb250ZXh0KTtcbiAgICAgICAgICBjYXNlICdldmFsdWF0aW9uJzpcbiAgICAgICAgICAgIHJldHVybiB0aWR5KCgpID0+IGV2YWx1YXRpb24uZXhlY3V0ZU9wKG5vZGUsIHRlbnNvck1hcCwgY29udGV4dCkpO1xuICAgICAgICAgIGNhc2UgJ2ltYWdlJzpcbiAgICAgICAgICAgIHJldHVybiB0aWR5KCgpID0+IGltYWdlLmV4ZWN1dGVPcChub2RlLCB0ZW5zb3JNYXAsIGNvbnRleHQpKTtcbiAgICAgICAgICBjYXNlICdncmFwaCc6XG4gICAgICAgICAgICByZXR1cm4gdGlkeSgoKSA9PiBncmFwaC5leGVjdXRlT3Aobm9kZSwgdGVuc29yTWFwLCBjb250ZXh0KSk7XG4gICAgICAgICAgY2FzZSAnbG9naWNhbCc6XG4gICAgICAgICAgICByZXR1cm4gdGlkeSgoKSA9PiBsb2dpY2FsLmV4ZWN1dGVPcChub2RlLCB0ZW5zb3JNYXAsIGNvbnRleHQpKTtcbiAgICAgICAgICBjYXNlICdtYXRyaWNlcyc6XG4gICAgICAgICAgICByZXR1cm4gdGlkeSgoKSA9PiBtYXRyaWNlcy5leGVjdXRlT3Aobm9kZSwgdGVuc29yTWFwLCBjb250ZXh0KSk7XG4gICAgICAgICAgY2FzZSAnbm9ybWFsaXphdGlvbic6XG4gICAgICAgICAgICByZXR1cm4gdGlkeShcbiAgICAgICAgICAgICAgICAoKSA9PiBub3JtYWxpemF0aW9uLmV4ZWN1dGVPcChub2RlLCB0ZW5zb3JNYXAsIGNvbnRleHQpKTtcbiAgICAgICAgICBjYXNlICdyZWR1Y3Rpb24nOlxuICAgICAgICAgICAgcmV0dXJuIHRpZHkoKCkgPT4gcmVkdWN0aW9uLmV4ZWN1dGVPcChub2RlLCB0ZW5zb3JNYXAsIGNvbnRleHQpKTtcbiAgICAgICAgICBjYXNlICdzbGljZV9qb2luJzpcbiAgICAgICAgICAgIHJldHVybiB0aWR5KCgpID0+IHNsaWNlSm9pbi5leGVjdXRlT3Aobm9kZSwgdGVuc29yTWFwLCBjb250ZXh0KSk7XG4gICAgICAgICAgY2FzZSAnc3BhcnNlJzpcbiAgICAgICAgICAgIHJldHVybiB0aWR5KCgpID0+IHNwYXJzZS5leGVjdXRlT3Aobm9kZSwgdGVuc29yTWFwLCBjb250ZXh0KSk7XG4gICAgICAgICAgY2FzZSAnc3BlY3RyYWwnOlxuICAgICAgICAgICAgcmV0dXJuIHRpZHkoKCkgPT4gc3BlY3RyYWwuZXhlY3V0ZU9wKG5vZGUsIHRlbnNvck1hcCwgY29udGV4dCkpO1xuICAgICAgICAgIGNhc2UgJ3N0cmluZyc6XG4gICAgICAgICAgICByZXR1cm4gdGlkeSgoKSA9PiBzdHJpbmcuZXhlY3V0ZU9wKG5vZGUsIHRlbnNvck1hcCwgY29udGV4dCkpO1xuICAgICAgICAgIGNhc2UgJ3RyYW5zZm9ybWF0aW9uJzpcbiAgICAgICAgICAgIHJldHVybiB0aWR5KFxuICAgICAgICAgICAgICAgICgpID0+IHRyYW5zZm9ybWF0aW9uLmV4ZWN1dGVPcChub2RlLCB0ZW5zb3JNYXAsIGNvbnRleHQpKTtcbiAgICAgICAgICBjYXNlICdoYXNoX3RhYmxlJzpcbiAgICAgICAgICAgIHJldHVybiBoYXNoVGFibGUuZXhlY3V0ZU9wKFxuICAgICAgICAgICAgICAgIG5vZGUsIHRlbnNvck1hcCwgY29udGV4dCwgcmVzb3VyY2VNYW5hZ2VyKTtcbiAgICAgICAgICBjYXNlICdjdXN0b20nOlxuICAgICAgICAgICAgY29uc3Qgb3BNYXBwZXIgPSBnZXRSZWdpc3RlcmVkT3Aobm9kZS5vcCk7XG4gICAgICAgICAgICBpZiAob3BNYXBwZXIgJiYgb3BNYXBwZXIuY3VzdG9tRXhlY3V0b3IpIHtcbiAgICAgICAgICAgICAgcmV0dXJuIG9wTWFwcGVyLmN1c3RvbUV4ZWN1dG9yKFxuICAgICAgICAgICAgICAgICAgbmV3IE5vZGVWYWx1ZUltcGwobm9kZSwgdGVuc29yTWFwLCBjb250ZXh0KSk7XG4gICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICB0aHJvdyBUeXBlRXJyb3IoYEN1c3RvbSBvcCAke25vZGUub3B9IGlzIG5vdCByZWdpc3RlcmVkLmApO1xuICAgICAgICAgICAgfVxuICAgICAgICAgIGRlZmF1bHQ6XG4gICAgICAgICAgICB0aHJvdyBUeXBlRXJyb3IoXG4gICAgICAgICAgICAgICAgYFVua25vd24gb3AgJyR7bm9kZS5vcH0nLiBGaWxlIGFuIGlzc3VlIGF0IGAgK1xuICAgICAgICAgICAgICAgIGBodHRwczovL2dpdGh1Yi5jb20vdGVuc29yZmxvdy90ZmpzL2lzc3VlcyBzbyB3ZSBjYW4gYWRkIGl0YCArXG4gICAgICAgICAgICAgICAgYCwgb3IgcmVnaXN0ZXIgYSBjdXN0b20gZXhlY3V0aW9uIHdpdGggdGYucmVnaXN0ZXJPcCgpYCk7XG4gICAgICAgIH1cbiAgICAgIH0pKG5vZGUsIHRlbnNvck1hcCwgY29udGV4dCk7XG4gIGlmICh0ZmMudXRpbC5pc1Byb21pc2UodmFsdWUpKSB7XG4gICAgcmV0dXJuIHZhbHVlLnRoZW4oKGRhdGEpID0+IFtdLmNvbmNhdChkYXRhKSk7XG4gIH1cbiAgcmV0dXJuIFtdLmNvbmNhdCh2YWx1ZSk7XG59XG4iXX0=","/**\n * @license\n * Copyright 2018 Google LLC. All Rights Reserved.\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n * =============================================================================\n */\n// tslint:disable-next-line: no-imports-from-dist\nimport * as tfOps from '@tensorflow/tfjs-core/dist/ops/ops_for_converter';\nimport { getParamValue } from './utils';\nexport const executeOp = (node, tensorMap, context, ops = tfOps) => {\n switch (node.op) {\n case 'BiasAdd':\n case 'AddV2':\n case 'Add': {\n return [ops.add(getParamValue('a', node, tensorMap, context), getParamValue('b', node, tensorMap, context))];\n }\n case 'AddN': {\n return [ops.addN(getParamValue('tensors', node, tensorMap, context))];\n }\n case 'FloorMod':\n case 'Mod':\n return [ops.mod(getParamValue('a', node, tensorMap, context), getParamValue('b', node, tensorMap, context))];\n case 'Mul':\n return [ops.mul(getParamValue('a', node, tensorMap, context), getParamValue('b', node, tensorMap, context))];\n case 'RealDiv':\n case 'Div': {\n return [ops.div(getParamValue('a', node, tensorMap, context), getParamValue('b', node, tensorMap, context))];\n }\n case 'DivNoNan': {\n return [ops.divNoNan(getParamValue('a', node, tensorMap, context), getParamValue('b', node, tensorMap, context))];\n }\n case 'FloorDiv': {\n return [ops.floorDiv(getParamValue('a', node, tensorMap, context), getParamValue('b', node, tensorMap, context))];\n }\n case 'Sub': {\n return [ops.sub(getParamValue('a', node, tensorMap, context), getParamValue('b', node, tensorMap, context))];\n }\n case 'Minimum': {\n return [ops.minimum(getParamValue('a', node, tensorMap, context), getParamValue('b', node, tensorMap, context))];\n }\n case 'Maximum': {\n return [ops.maximum(getParamValue('a', node, tensorMap, context), getParamValue('b', node, tensorMap, context))];\n }\n case 'Pow': {\n return [ops.pow(getParamValue('a', node, tensorMap, context), getParamValue('b', node, tensorMap, context))];\n }\n case 'SquaredDifference': {\n return [ops.squaredDifference(getParamValue('a', node, tensorMap, context), getParamValue('b', node, tensorMap, context))];\n }\n default:\n throw TypeError(`Node type ${node.op} is not implemented`);\n }\n};\nexport const CATEGORY = 'arithmetic';\n//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYXJpdGhtZXRpY19leGVjdXRvci5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uLy4uLy4uL3RmanMtY29udmVydGVyL3NyYy9vcGVyYXRpb25zL2V4ZWN1dG9ycy9hcml0aG1ldGljX2V4ZWN1dG9yLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBOzs7Ozs7Ozs7Ozs7Ozs7R0FlRztBQUdILGlEQUFpRDtBQUNqRCxPQUFPLEtBQUssS0FBSyxNQUFNLGtEQUFrRCxDQUFDO0FBTTFFLE9BQU8sRUFBQyxhQUFhLEVBQUMsTUFBTSxTQUFTLENBQUM7QUFFdEMsTUFBTSxDQUFDLE1BQU0sU0FBUyxHQUNsQixDQUFDLElBQVUsRUFBRSxTQUEwQixFQUN0QyxPQUF5QixFQUFFLEdBQUcsR0FBRyxLQUFLLEVBQVksRUFBRTtJQUNuRCxRQUFRLElBQUksQ0FBQyxFQUFFLEVBQUU7UUFDZixLQUFLLFNBQVMsQ0FBQztRQUNmLEtBQUssT0FBTyxDQUFDO1FBQ2IsS0FBSyxLQUFLLENBQUMsQ0FBQztZQUNWLE9BQU8sQ0FBQyxHQUFHLENBQUMsR0FBRyxDQUNWLGFBQWEsQ0FBQyxHQUFHLEVBQUUsSUFBSSxFQUFFLFNBQVMsRUFBRSxPQUFPLENBQVksRUFDeEQsYUFBYSxDQUFDLEdBQUcsRUFBRSxJQUFJLEVBQUUsU0FBUyxFQUFFLE9BQU8sQ0FBVyxDQUFDLENBQUMsQ0FBQztTQUM5RDtRQUNELEtBQUssTUFBTSxDQUFDLENBQUM7WUFDWCxPQUFPLENBQUMsR0FBRyxDQUFDLElBQUksQ0FDWixhQUFhLENBQUMsU0FBUyxFQUFFLElBQUksRUFBRSxTQUFTLEVBQUUsT0FBTyxDQUFjLENBQUMsQ0FBQyxDQUFDO1NBQ3ZFO1FBQ0QsS0FBSyxVQUFVLENBQUM7UUFDaEIsS0FBSyxLQUFLO1lBQ1IsT0FBTyxDQUFDLEdBQUcsQ0FBQyxHQUFHLENBQ1gsYUFBYSxDQUFDLEdBQUcsRUFBRSxJQUFJLEVBQUUsU0FBUyxFQUFFLE9BQU8sQ0FB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SUFBSSxDQUFDLEVBQUUscUJBQXFCLENBQUMsQ0FBQztLQUM5RDtBQUNILENBQUMsQ0FBQztBQUVOLE1BQU0sQ0FBQyxNQUFNLFFBQVEsR0FBRyxZQUFZLENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyIvKipcbiAqIEBsaWNlbnNlXG4gKiBDb3B5cmlnaHQgMjAxOCBHb29nbGUgTExDLiBBbGwgUmlnaHRzIFJlc2VydmVkLlxuICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlIFwiTGljZW5zZVwiKTtcbiAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS5cbiAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdFxuICpcbiAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMFxuICpcbiAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmVcbiAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuIFwiQVMgSVNcIiBCQVNJUyxcbiAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLlxuICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZFxuICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuXG4gKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuICovXG5cbmltcG9ydCB7VGVuc29yfSBmcm9tICdAdGVuc29yZmxvdy90ZmpzLWNvcmUnO1xuLy8gdHNsaW50OmRpc2FibGUtbmV4dC1saW5lOiBuby1pbXBvcnRzLWZyb20tZGlzdFxuaW1wb3J0ICogYXMgdGZPcHMgZnJvbSAnQHRlbnNvcmZsb3cvdGZqcy1jb3JlL2Rpc3Qvb3BzL29wc19mb3JfY29udmVydGVyJztcblxuaW1wb3J0IHtOYW1lZFRlbnNvcnNNYXB9IGZyb20gJy4uLy4uL2RhdGEvdHlwZXMnO1xuaW1wb3J0IHtFeGVjdXRpb25Db250ZXh0fSBmcm9tICcuLi8uLi9leGVjdXRvci9leGVjdXRpb25fY29udGV4dCc7XG5pbXBvcnQge0ludGVybmFsT3BFeGVjdXRvciwgTm9kZX0gZnJvbSAnLi4vdHlwZXMnO1xuXG5pbXBvcnQge2dldFBhcmFtVmFsdWV9IGZyb20gJy4vdXRpbHMnO1xuXG5leHBvcnQgY29uc3QgZXhlY3V0ZU9wOiBJbnRlcm5hbE9wRXhlY3V0b3IgPVxuICAgIChub2RlOiBOb2RlLCB0ZW5zb3JNYXA6IE5hbWVkVGVuc29yc01hcCxcbiAgICAgY29udGV4dDogRXhlY3V0aW9uQ29udGV4dCwgb3BzID0gdGZPcHMpOiBUZW5zb3JbXSA9PiB7XG4gICAgICBzd2l0Y2ggKG5vZGUub3ApIHtcbiAgICAgICAgY2FzZSAnQmlhc0FkZCc6XG4gICAgICAgIGNhc2UgJ0FkZFYyJzpcbiAgICAgICAgY2FzZSAnQWRkJzoge1xuICAgICAgICAgIHJldHVybiBbb3BzLmFkZChcbiAgICAgICAgICAgICAgKGdldFBhcmFtVmFsdWUoJ2EnLCBub2RlLCB0ZW5zb3JNYXAsIGNvbnRleHQpIGFzIFRlbnNvciksXG4gICAgICAgICAgICAgIGdldFBhcmFtVmFsdWUoJ2InLCBub2RlLCB0ZW5zb3JNYXAsIGNvbnRleHQpIGFzIFRlbnNvcildO1xuICAgICAgICB9XG4gICAgICAgIGNhc2UgJ0FkZE4nOiB7XG4gICAgICAgICAgcmV0dXJuIFtvcHMuYWRkTigoXG4gICAgICAgICAgICAgIGdldFBhcmFtVmFsdWUoJ3RlbnNvcnMnLCBub2RlLCB0ZW5zb3JNYXAsIGNvbnRleHQpIGFzIFRlbnNvcltdKSldO1xuICAgICAgICB9XG4gICAgICAgIGNhc2UgJ0Zsb29yTW9kJzpcbiAgICAgICAgY2FzZSAnTW9kJzpcbiAgICAgICAgICByZXR1cm4gW29wcy5tb2QoXG4gICAgICAgICAgICAgIGdldFBhcmFtVmFsdWUoJ2EnLCBub2RlLCB0ZW5zb3JNYXAsIGNvbnRleHQpIGFzIFRlbnNvcixcbiAgICAgICAgICAgICAgZ2V0UGFyYW1WYWx1ZSgnYicsIG5vZGUsIHRlbnNvck1hcCwgY29udGV4dCkgYXMgVGVuc29yKV07XG4gICAgICAgIGNhc2UgJ011bCc6XG4gICAgICAgICAgcmV0dXJuIFtvcHMubXVsKFxuICAgICAgICAgICAgICBnZXRQYXJhbVZhbHVlKCdhJywgbm9kZSwgdGVuc29yTWFwLCBjb250ZXh0KSBhcyBUZW5zb3IsXG4gICAgICAgICAgICAgIGdldFBhcmFtVmFsdWUoJ2InLCBub2RlLCB0ZW5zb3JNYXAsIGNvbnRleHQpIGFzIFRlbnNvcildO1xuICAgICAgICBjYXNlICdSZWFsRGl2JzpcbiAgICAgICAgY2FzZSAnRGl2Jzoge1xuICAgICAgICAgIHJldHVybiBbb3BzLmRpdihcbiAgICAgICAgICAgICAgZ2V0UGFyYW1WYWx1ZSgnYScsIG5vZGUsIHRlbnNvck1hcCwgY29udGV4dCkgYXMgVGVuc29yLFxuICAgICAgICAgICAgICBnZXRQYXJhbVZhbHVlKCdiJywgbm9kZSwgdGVuc29yTWFwLCBjb250ZXh0KSBhcyBUZW5zb3IpXTtcbiAgICAgICAgfVxuICAgICAgICBjYXNlICdEaXZOb05hbic6IHtcbiAgICAgICAgICByZXR1cm4gW29wcy5kaXZOb05hbihcbiAgICAgICAgICAgICAgZ2V0UGFyYW1WYWx1ZSgnYScsIG5vZGUsIHRlbnNvck1hcCwgY29udGV4dCkgYXMgVGVuc29yLFxuICAgICAgICAgICAgICBnZXRQYXJhbVZhbHVlKCdiJywgbm9kZSwgdGVuc29yTWFwLCBjb250ZXh0KSBhcyBUZW5zb3IpXTtcbiAgICAgICAgfVxuICAgICAgICBjYXNlICdGbG9vckRpdic6IHtcbiAgICAgICAgICByZXR1cm4gW29wcy5mbG9vckRpdihcbiAgICAgICAgICAgICAgZ2V0UGFyYW1WYWx1ZSgnYScsIG5vZGUsIHRlbnNvck1hcCwgY29udGV4dCkgYXMgVGVuc29yLFxuICAgICAgICAgICAgICBnZXRQYXJhbVZhbHVlKCdiJywgbm9kZSwgdGVuc29yTWFwLCBjb250ZXh0KSBhcyBUZW5zb3IpXTtcbiAgICAgICAgfVxuICAgICAgICBjYXNlICdTdWInOiB7XG4gICAgICAgICAgcmV0dXJuIFtvcHMuc3ViKFxuICAgICAgICAgICAgICBnZXRQYXJhbVZhbHVlKCdhJywgbm9kZSwgdGVuc29yTWFwLCBjb250ZXh0KSBhcyBUZW5zb3IsXG4gICAgICAgICAgICAgIGdldFBhcmFtVmFsdWUoJ2InLCBub2RlLCB0ZW5zb3JNYXAsIGNvbnRleHQpIGFzIFRlbnNvcildO1xuICAgICAgICB9XG4gICAgICAgIGNhc2UgJ01pbmltdW0nOiB7XG4gICAgICAgICAgcmV0dXJuIFtvcHMubWluaW11bShcbiAgICAgICAgICAgICAgZ2V0UGFyYW1WYWx1ZSgnYScsIG5vZGUsIHRlbnNvck1hcCwgY29udGV4dCkgYXMgVGVuc29yLFxuICAgICAgICAgICAgICBnZXRQYXJhbVZhbHVlKCdiJywgbm9kZSwgdGVuc29yTWFwLCBjb250ZXh0KSBhcyBUZW5zb3IpXTtcbiAgICAgICAgfVxuICAgICAgICBjYXNlICdNYXhpbXVtJzoge1xuICAgICAgICAgIHJldHVybiBbb3BzLm1heGltdW0oXG4gICAgICAgICAgICAgIGdldFBhcmFtVmFsdWUoJ2EnLCBub2RlLCB0ZW5zb3JNYXAsIGNvbnRleHQpIGFzIFRlbnNvcixcbiAgICAgICAgICAgICAgZ2V0UGFyYW1WYWx1ZSgnYicsIG5vZGUsIHRlbnNvck1hcCwgY29udGV4dCkgYXMgVGVuc29yKV07XG4gICAgICAgIH1cbiAgICAgICAgY2FzZSAnUG93Jzoge1xuICAgICAgICAgIHJldHVybiBbb3BzLnBvdyhcbiAgICAgICAgICAgICAgZ2V0UGFyYW1WYWx1ZSgnYScsIG5vZGUsIHRlbnNvck1hcCwgY29udGV4dCkgYXMgVGVuc29yLFxuICAgICAgICAgICAgICBnZXRQYXJhbVZhbHVlKCdiJywgbm9kZSwgdGVuc29yTWFwLCBjb250ZXh0KSBhcyBUZW5zb3IpXTtcbiAgICAgICAgfVxuICAgICAgICBjYXNlICdTcXVhcmVkRGlmZmVyZW5jZSc6IHtcbiAgICAgICAgICByZXR1cm4gW29wcy5zcXVhcmVkRGlmZmVyZW5jZShcbiAgICAgICAgICAgICAgZ2V0UGFyYW1WYWx1ZSgnYScsIG5vZGUsIHRlbnNvck1hcCwgY29udGV4dCkgYXMgVGVuc29yLFxuICAgICAgICAgICAgICBnZXRQYXJhbVZhbHVlKCdiJywgbm9kZSwgdGVuc29yTWFwLCBjb250ZXh0KSBhcyBUZW5zb3IpXTtcbiAgICAgICAgfVxuICAgICAgICBkZWZhdWx0OlxuICAgICAgICAgIHRocm93IFR5cGVFcnJvcihgTm9kZSB0eXBlICR7bm9kZS5vcH0gaXMgbm90IGltcGxlbWVudGVkYCk7XG4gICAgICB9XG4gICAgfTtcblxuZXhwb3J0IGNvbnN0IENBVEVHT1JZID0gJ2FyaXRobWV0aWMnO1xuIl19","/**\n * @license\n * Copyright 2018 Google LLC. All Rights Reserved.\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n * =============================================================================\n */\n// tslint:disable-next-line: no-imports-from-dist\nimport * as tfOps from '@tensorflow/tfjs-core/dist/ops/ops_for_converter';\nimport { getParamValue, getTensor } from './utils';\nexport const executeOp = (node, tensorMap, context, ops = tfOps) => {\n switch (node.op) {\n case 'Abs':\n case 'ComplexAbs':\n return [ops.abs(getParamValue('x', node, tensorMap, context))];\n case 'Acos':\n return [ops.acos(getParamValue('x', node, tensorMap, context))];\n case 'Acosh':\n return [ops.acosh(getParamValue('x', node, tensorMap, context))];\n case 'Asin':\n return [ops.asin(getParamValue('x', node, tensorMap, context))];\n case 'Asinh':\n return [ops.asinh(getParamValue('x', node, tensorMap, context))];\n case 'Atan':\n return [ops.atan(getParamValue('x', node, tensorMap, context))];\n case 'Atan2':\n return [ops.atan2(getParamValue('x', node, tensorMap, context), getParamValue('y', node, tensorMap, context))];\n case 'Atanh':\n return [ops.atanh(getParamValue('x', node, tensorMap, context))];\n case 'Ceil':\n return [ops.ceil(getParamValue('x', node, tensorMap, context))];\n case 'Complex':\n return [ops.complex(getParamValue('real', node, tensorMap, context), getParamValue('imag', node, tensorMap, context))];\n case 'Cos':\n return [ops.cos(getParamValue('x', node, tensorMap, context))];\n case 'Cosh':\n return [ops.cosh(getParamValue('x', node, tensorMap, context))];\n case 'Elu':\n return [ops.elu(getParamValue('x', node, tensorMap, context))];\n case 'Erf':\n return [ops.erf(getParamValue('x', node, tensorMap, context))];\n case 'Exp':\n return [ops.exp(getParamValue('x', node, tensorMap, context))];\n case 'Expm1': {\n return [ops.expm1(getParamValue('x', node, tensorMap, context))];\n }\n case 'Floor':\n return [ops.floor(getParamValue('x', node, tensorMap, context))];\n case 'Log':\n return [ops.log(getParamValue('x', node, tensorMap, context))];\n case 'Log1p': {\n return [ops.log1p(getParamValue('x', node, tensorMap, context))];\n }\n case 'Imag':\n return [ops.imag(getParamValue('x', node, tensorMap, context))];\n case 'Neg':\n return [ops.neg(getParamValue('x', node, tensorMap, context))];\n case 'Reciprocal': {\n return [ops.reciprocal(getParamValue('x', node, tensorMap, context))];\n }\n case 'Real':\n return [ops.real(getParamValue('x', node, tensorMap, context))];\n case 'Relu':\n return [ops.relu(getParamValue('x', node, tensorMap, context))];\n case 'Round': {\n return [ops.round(getParamValue('x', node, tensorMap, context))];\n }\n case 'Selu':\n return [ops.selu(getParamValue('x', node, tensorMap, context))];\n case 'Sigmoid':\n return [ops.sigmoid(getParamValue('x', node, tensorMap, context))];\n case 'Sin':\n return [ops.sin(getParamValue('x', node, tensorMap, context))];\n case 'Sign': {\n return [ops.sign(getParamValue('x', node, tensorMap, context))];\n }\n case 'Sinh': {\n return [ops.sinh(getParamValue('x', node, tensorMap, context))];\n }\n case 'Softplus': {\n return [ops.softplus(getParamValue('x', node, tensorMap, context))];\n }\n case 'Sqrt': {\n return [ops.sqrt(getParamValue('x', node, tensorMap, context))];\n }\n case 'Square': {\n return [ops.square(getParamValue('x', node, tensorMap, context))];\n }\n case 'Tanh': {\n return [ops.tanh(getParamValue('x', node, tensorMap, context))];\n }\n case 'Tan':\n return [ops.tan(getParamValue('x', node, tensorMap, context))];\n case 'ClipByValue':\n return [ops.clipByValue(getParamValue('x', node, tensorMap, context), getParamValue('clipValueMin', node, tensorMap, context), getParamValue('clipValueMax', node, tensorMap, context))];\n case 'Relu6':\n return [ops.relu6(getParamValue('x', node, tensorMap, context))];\n case 'Rsqrt':\n return [ops.rsqrt(getTensor(node.inputNames[0], tensorMap, context))];\n case 'Prod':\n return [ops.prod(getParamValue('x', node, tensorMap, context), getParamValue('axes', node, tensorMap, context))];\n case 'LeakyRelu':\n return [ops.leakyRelu(getParamValue('x', node, tensorMap, context), getParamValue('alpha', node, tensorMap, context))];\n case 'Prelu':\n return [ops.prelu(getParamValue('x', node, tensorMap, context), getParamValue('alpha', node, tensorMap, context))];\n case 'IsNan':\n return [ops.isNaN(getTensor(node.inputNames[0], tensorMap, context))];\n default:\n throw TypeError(`Node type ${node.op} is not implemented`);\n }\n};\nexport const CATEGORY = 'basic_math';\n//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYmFzaWNfbWF0aF9leGVjdXRvci5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uLy4uLy4uL3RmanMtY29udmVydGVyL3NyYy9vcGVyYXRpb25zL2V4ZWN1dG9ycy9iYXNpY19tYXRoX2V4ZWN1dG9yLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBOzs7Ozs7Ozs7Ozs7Ozs7R0FlRztBQUdILGlEQUFpRDtBQUNqRCxPQUFPLEtBQUssS0FBSyxNQUFNLGtEQUFrRCxDQUFDO0FBTTFFLE9BQU8sRUFBQyxhQUFhLEVBQUUsU0FBUyxFQUFDLE1BQU0sU0FBUyxDQUFDO0FBRWpELE1BQU0sQ0FBQyxNQUFNLFNBQVMsR0FDbEIsQ0FBQyxJQUFVLEVBQUUsU0FBMEIsRUFDdEMsT0FBeUIsRUFBRSxHQUFHLEdBQUcsS0FBSyxFQUFZLEVBQUU7SUFDbkQsUUFBUSxJQUFJLENBQUMsRUFBRSxFQUFFO1FBQ2YsS0FBSyxLQUFLLENBQUM7UUFDWCxLQUFLLFlBQVk7WUFDZixPQUFPLENBQUMsR0FBRyxDQUFDLEdBQUcsQ0FDWCxhQUFhLENBQUMsR0FBRyxFQUFFLElBQUksRUFBRSxTQUFTLEVBQUUsT0FBTyxDQUFXLENBQUMsQ0FBQyxDQUFDO1FBQy9ELEtBQUssTUFBTTtZQUNULE9BQU8sQ0FBQyxHQUFHLENBQUMsSUFBSSxDQUNaLGFBQWEsQ0FBQyxHQUFHLEVBQUUsSUFBSSxFQUFFLFNBQVMsRUFBRSxPQUFPLENBQVcsQ0FBQyxDQUFDLENBQUM7UUFDL0QsS0FBSyxPQUFPO1lBQ1YsT0FBTyxDQUFDLEdBQUcsQ0FBQyxLQUFLLENBQ2IsYUFBYSxDQUFDLEdBQUcsRUFBRSxJQUFJLEVBQUUsU0FBUyxFQUFFLE9BQU8sQ0FBVyxDQUFDLENBQUMsQ0FBQztRQUMvRCxLQUFLLE1BQU07WUFDVCxPQUFPLENBQUMsR0FBRyxDQUFDLElBQUksQ0FDWixhQUFhLENBQUMsR0FBRyxFQUFFLElBQUksRUFBRSxTQUFTLEVBQUUsT0FBTyxDQUFX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RSxPQUFPLENBQWEsQ0FBQyxDQUFDLENBQUM7UUFDcEUsS0FBSyxXQUFXO1lBQ2QsT0FBTyxDQUFDLEdBQUcsQ0FBQyxTQUFTLENBQ2pCLGFBQWEsQ0FBQyxHQUFHLEVBQUUsSUFBSSxFQUFFLFNBQVMsRUFBRSxPQUFPLENBQVcsRUFDdEQsYUFBYSxDQUFDLE9BQU8sRUFBRSxJQUFJLEVBQUUsU0FBUyxFQUFFLE9BQU8sQ0FBVyxDQUFDLENBQUMsQ0FBQztRQUNuRSxLQUFLLE9BQU87WUFDVixPQUFPLENBQUMsR0FBRyxDQUFDLEtBQUssQ0FDYixhQUFhLENBQUMsR0FBRyxFQUFFLElBQUksRUFBRSxTQUFTLEVBQUUsT0FBTyxDQUFXLEVBQ3RELGFBQWEsQ0FBQyxPQUFPLEVBQUUsSUFBSSxFQUFFLFNBQVMsRUFBRSxPQUFPLENBQVcsQ0FBQyxDQUFDLENBQUM7UUFDbkUsS0FBSyxPQUFPO1lBQ1YsT0FBTyxDQUFDLEdBQUcsQ0FBQyxLQUFLLENBQ2IsU0FBUyxDQUFDLElBQUksQ0FBQyxVQUFVLENBQUMsQ0FBQyxDQUFDLEVBQUUsU0FBUyxFQUFFLE9BQU8sQ0FBQyxDQUFDLENBQUMsQ0FBQztRQUMxRDtZQUNFLE1BQU0sU0FBUyxDQUFDLGFBQWEsSUFBSSxDQUFDLEVBQUUscUJBQXFCLENBQUMsQ0FBQztLQUM5RDtBQUNILENBQUMsQ0FBQztBQUVOLE1BQU0sQ0FBQyxNQUFNLFFBQVEsR0FBRyxZQUFZLENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyIvKipcbiAqIEBsaWNlbnNlXG4gKiBDb3B5cmlnaHQgMjAxOCBHb29nbGUgTExDLiBBbGwgUmlnaHRzIFJlc2VydmVkLlxuICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlIFwiTGljZW5zZVwiKTtcbiAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS5cbiAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdFxuICpcbiAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMFxuICpcbiAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmVcbiAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuIFwiQVMgSVNcIiBCQVNJUyxcbiAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLlxuICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZFxuICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuXG4gKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuICovXG5cbmltcG9ydCB7VGVuc29yfSBmcm9tICdAdGVuc29yZmxvdy90ZmpzLWNvcmUnO1xuLy8gdHNsaW50OmRpc2FibGUtbmV4dC1saW5lOiBuby1pbXBvcnRzLWZyb20tZGlzdFxuaW1wb3J0ICogYXMgdGZPcHMgZnJvbSAnQHRlbnNvcmZsb3cvdGZqcy1jb3JlL2Rpc3Qvb3BzL29wc19mb3JfY29udmVydGVyJztcblxuaW1wb3J0IHtOYW1lZFRlbnNvcnNNYXB9IGZyb20gJy4uLy4uL2RhdGEvdHlwZXMnO1xuaW1wb3J0IHtFeGVjdXRpb25Db250ZXh0fSBmcm9tICcuLi8uLi9leGVjdXRvci9leGVjdXRpb25fY29udGV4dCc7XG5pbXBvcnQge0ludGVybmFsT3BFeGVjdXRvciwgTm9kZX0gZnJvbSAnLi4vdHlwZXMnO1xuXG5pbXBvcnQge2dldFBhcmFtVmFsdWUsIGdldFRlbnNvcn0gZnJvbSAnLi91dGlscyc7XG5cbmV4cG9ydCBjb25zdCBleGVjdXRlT3A6IEludGVybmFsT3BFeGVjdXRvciA9XG4gICAgKG5vZGU6IE5vZGUsIHRlbnNvck1hcDogTmFtZWRUZW5zb3JzTWFwLFxuICAgICBjb250ZXh0OiBFeGVjdXRpb25Db250ZXh0LCBvcHMgPSB0Zk9wcyk6IFRlbnNvcltdID0+IHtcbiAgICAgIHN3aXRjaCAobm9kZS5vcCkge1xuICAgICAgICBjYXNlICdBYnMnOlxuICAgICAgICBjYXNlICdDb21wbGV4QWJzJzpcbiAgICAgICAgICByZXR1cm4gW29wcy5hYnMoXG4gICAgICAgICAgICAgIGdldFBhcmFtVmFsdWUoJ3gnLCBub2RlLCB0ZW5zb3JNYXAsIGNvbnRleHQpIGFzIFRlbnNvcildO1xuICAgICAgICBjYXNlICdBY29zJzpcbiAgICAgICAgICByZXR1cm4gW29wcy5hY29zKFxuICAgICAgICAgICAgICBnZXRQYXJhbVZhbHVlKCd4Jywgbm9kZSwgdGVuc29yTWFwLCBjb250ZXh0KSBhcyBUZW5zb3IpXTtcbiAgICAgICAgY2FzZSAnQWNvc2gnOlxuICAgICAgICAgIHJldHVybiBbb3BzLmFjb3NoKFxuICAgICAgICAgICAgICBnZXRQYXJhbVZhbHVlKCd4Jywgbm9kZSwgdGVuc29yTWFwLCBjb250ZXh0KSBhcyBUZW5zb3IpXTtcbiAgICAgICAgY2FzZSAnQXNpbic6XG4gICAgICAgICAgcmV0dXJuIFtvcHMuYXNpbihcbiAgICAgICAgICAgICAgZ2V0UGFyYW1WYWx1ZSgneCcsIG5vZGUsIHRlbnNvck1hcCwgY29udGV4dCkgYXMgVGVuc29yKV07XG4gICAgICAgIGNhc2UgJ0FzaW5oJzpcbiAgICAgICAgICByZXR1cm4gW29wcy5hc2luaChcbiAgICAgICAgICAgICAgZ2V0UGFyYW1WYWx1ZSgneCcsIG5vZGUsIHRlbnNvck1hcCwgY29udGV4dCkgYXMgVGVuc29yKV07XG4gICAgICAgIGNhc2UgJ0F0YW4nOlxuICAgICAgICAgIHJldHVybiBbb3BzLmF0YW4oXG4gICAgICAgICAgICAgIGdldFBhcmFtVmFsdWUoJ3gnLCBub2RlLCB0ZW5zb3JNYXAsIGNvbnRleHQpIGFzIFRlbnNvcildO1xuICAgICAgICBjYXNlICdBdGFuMic6XG4gICAgICAgICAgcmV0dXJuIFtvcHMuYXRhbjIoXG4gICAgICAgICAgICAgIGdldFBhcmFtVmFsdWUoJ3gnLCBub2RlLCB0ZW5zb3JNYXAsIGNvbnRleHQpIGFzIFRlbnNvcixcbiAgICAgICAgICAgICAgZ2V0UGFyYW1WYWx1ZSgneScsIG5vZGUsIHRlbnNvck1hcCwgY29udGV4dCkgYXMgVGVuc29yKV07XG4gICAgICAgIGNhc2UgJ0F0YW5oJzpcbiAgICAgICAgICByZXR1cm4gW29wcy5hdGFuaChcbiAgICAgICAgICAgICAgZ2V0UGFyYW1WYWx1ZSgneCcsIG5vZGUsIHRlbnNvck1hcCwgY29udGV4dCkgYXMgVGVuc29yKV07XG4gICAgICAgIGNhc2UgJ0NlaWwnOlxuICAgICAgICAgIHJldHVybiBbb3BzLmNlaWwoXG4gICAgICAgICAgICAgIGdldFBhcmFtVmFsdWUoJ3gnLCBub2RlLCB0ZW5zb3JNYXAsIGNvbnRleHQpIGFzIFRlbnNvcildO1xuICAgICAgICBjYXNlICdDb21wbGV4JzpcbiAgICAgICAgICByZXR1cm4gW29wcy5jb21wbGV4KFxuICAgICAgICAgICAgICBnZXRQYXJhbVZhbHVlKCdyZWFsJywgbm9kZSwgdGVuc29yTWFwLCBjb250ZXh0KSBhcyBUZW5zb3IsXG4gICAgICAgICAgICAgIGdldFBhcmFtVmFsdWUoJ2ltYWcnLCBub2RlLCB0ZW5zb3JNYXAsIGNvbnRleHQpIGFzIFRlbnNvcildO1xuICAgICAgICBjYXNlICdDb3MnOlxuICAgICAgICAgIHJldHVybiBbb3BzLmNvcyhcbiAgICAgICAgICAgICAgZ2V0UGFyYW1WYWx1ZSgneCcsIG5vZGUsIHRlbnNvck1hcCwgY29udGV4dCkgYXMgVGVuc29yKV07XG4gICAgICAgIGNhc2UgJ0Nvc2gnOlxuICAgICAgICAgIHJldHVybiBbb3BzLmNvc2goXG4gICAgICAgICAgICAgIGdldFBhcmFtVmFsdWUoJ3gnLCBub2RlLCB0ZW5zb3JNYXAsIGNvbnRleHQpIGFzIFRlbnNvcildO1xuICAgICAgICBjYXNlICdFbHUnOlxuICAgICAgICAgIHJldHVybiBbb3BzLmVsdShcbiAgICAgICAgICAgICAgZ2V0UGFyYW1WYWx1ZSgneCcsIG5vZGUsIHRlbnNvck1hcCwgY29udGV4dCkgYXMgVGVuc29yKV07XG4gICAgICAgIGNhc2UgJ0VyZic6XG4gICAgICAgICAgcmV0dXJuIFtvcHMuZXJmKFxuICAgICAgICAgICAgICBnZXRQYXJhbVZhbHVlKCd4Jywgbm9kZSwgdGVuc29yTWFwLCBjb250ZXh0KSBhcyBUZW5zb3IpXTtcbiAgICAgICAgY2FzZSAnRXhwJzpcbiAgICAgICAgICByZXR1cm4gW29wcy5leHAoXG4gICAgICAgICAgICAgIGdldFBhcmFtVmFsdWUoJ3gnLCBub2RlLCB0ZW5zb3JNYXAsIGNvbnRleHQpIGFzIFRlbnNvcildO1xuICAgICAgICBjYXNlICdFeHBtMSc6IHtcbiAgICAgICAgICByZXR1cm4gW29wcy5leHBtMShcbiAgICAgICAgICAgICAgZ2V0UGFyYW1WYWx1ZSgneCcsIG5vZGUsIHRlbnNvck1hcCwgY29udGV4dCkgYXMgVGVuc29yKV07XG4gICAgICAgIH1cbiAgICAgICAgY2FzZSAnRmxvb3InOlxuICAgICAgICAgIHJldHVybiBbb3BzLmZsb29yKFxuICAgICAgICAgICAgICBnZXRQYXJhbVZhbHVlKCd4Jywgbm9kZSwgdGVuc29yTWFwLCBjb250ZXh0KSBhcyBUZW5zb3IpXTtcbiAgICAgICAgY2FzZSAnTG9nJzpcbiAgICAgICAgICByZXR1cm4gW29wcy5sb2coXG4gICAgICAgICAgICAgIGdldFBhcmFtVmFsdWUoJ3gnLCBub2RlLCB0ZW5zb3JNYXAsIGNvbnRleHQpIGFzIFRlbnNvcildO1xuICAgICAgICBjYXNlICdMb2cxcCc6IHtcbiAgICAgICAgICByZXR1cm4gW29wcy5sb2cxcChcbiAgICAgICAgICAgICAgZ2V0UGFyYW1WYWx1ZSgneCcsIG5vZGUsIHRlbnNvck1hcCwgY29udGV4dCkgYXMgVGVuc29yKV07XG4gICAgICAgIH1cbiAgICAgICAgY2FzZSAnSW1hZyc6XG4gICAgICAgICAgcmV0dXJuIFtvcHMuaW1hZyhcbiAgICAgICAgICAgICAgZ2V0UGFyYW1WYWx1ZSgneCcsIG5vZGUsIHRlbnNvck1hcCwgY29udGV4dCkgYXMgVGVuc29yKV07XG5cbiAgICAgICAgY2FzZSAnTmVnJzpcbiAgICAgICAgICByZXR1cm4gW29wcy5uZWcoXG4gICAgICAgICAgICAgIGdldFBhcmFtVmFsdWUoJ3gnLCBub2RlLCB0ZW5zb3JNYXAsIGNvbnRleHQpIGFzIFRlbnNvcildO1xuICAgICAgICBjYXNlICdSZWNpcHJvY2FsJzoge1xuICAgICAgICAgIHJldHVybiBbb3BzLnJlY2lwcm9jYWwoXG4gICAgICAgICAgICAgIGdldFBhcmFtVmFsdWUoJ3gnLCBub2RlLCB0ZW5zb3JNYXAsIGNvbnRleHQpIGFzIFRlbnNvcildO1xuICAgICAgICB9XG4gICAgICAgIGNhc2UgJ1JlYWwnOlxuICAgICAgICAgIHJldHVybiBbb3BzLnJlYWwoXG4gICAgICAgICAgICAgIGdldFBhcmFtVmFsdWUoJ3gnLCBub2RlLCB0ZW5zb3JNYXAsIGNvbnRleHQpIGFzIFRlbnNvcildO1xuICAgICAgICBjYXNlICdSZWx1JzpcbiAgICAgICAgICByZXR1cm4gW29wcy5yZWx1KFxuICAgICAgICAgICAgICBnZXRQYXJhbVZhbHVlKCd4Jywgbm9kZSwgdGVuc29yTWFwLCBjb250ZXh0KSBhcyBUZW5zb3IpXTtcbiAgICAgICAgY2FzZSAnUm91bmQnOiB7XG4gICAgICAgICAgcmV0dXJuIFtvcHMucm91bmQoXG4gICAgICAgICAgICAgIGdldFBhcmFtVmFsdWUoJ3gnLCBub2RlLCB0ZW5zb3JNYXAsIGNvbnRleHQpIGFzIFRlbnNvcildO1xuICAgICAgICB9XG4gICAgICAgIGNhc2UgJ1NlbHUnOlxuICAgICAgICAgIHJldHVybiBbb3BzLnNlbHUoXG4gICAgICAgICAgICAgIGdldFBhcmFtVmFsdWUoJ3gnLCBub2RlLCB0ZW5zb3JNYXAsIGNvbnRleHQpIGFzIFRlbnNvcildO1xuICAgICAgICBjYXNlICdTaWdtb2lkJzpcbiAgICAgICAgICByZXR1cm4gW29wcy5zaWdtb2lkKFxuICAgICAgICAgICAgICBnZXRQYXJhbVZhbHVlKCd4Jywgbm9kZSwgdGVuc29yTWFwLCBjb250ZXh0KSBhcyBUZW5zb3IpXTtcbiAgICAgICAgY2FzZSAnU2luJzpcbiAgICAgICAgICByZXR1cm4gW29wcy5zaW4oXG4gICAgICAgICAgICAgIGdldFBhcmFtVmFsdWUoJ3gnLCBub2RlLCB0ZW5zb3JNYXAsIGNvbnRleHQpIGFzIFRlbnNvcildO1xuICAgICAgICBjYXNlICdTaWduJzoge1xuICAgICAgICAgIHJldHVybiBbb3BzLnNpZ24oXG4gICAgICAgICAgICAgIGdldFBhcmFtVmFsdWUoJ3gnLCBub2RlLCB0ZW5zb3JNYXAsIGNvbnRleHQpIGFzIFRlbnNvcildO1xuICAgICAgICB9XG4gICAgICAgIGNhc2UgJ1NpbmgnOiB7XG4gICAgICAgICAgcmV0dXJuIFtvcHMuc2luaChcbiAgICAgICAgICAgICAgZ2V0UGFyYW1WYWx1ZSgneCcsIG5vZGUsIHRlbnNvck1hcCwgY29udGV4dCkgYXMgVGVuc29yKV07XG4gICAgICAgIH1cbiAgICAgICAgY2FzZSAnU29mdHBsdXMnOiB7XG4gICAgICAgICAgcmV0dXJuIFtvcHMuc29mdHBsdXMoXG4gICAgICAgICAgICAgIGdldFBhcmFtVmFsdWUoJ3gnLCBub2RlLCB0ZW5zb3JNYXAsIGNvbnRleHQpIGFzIFRlbnNvcildO1xuICAgICAgICB9XG4gICAgICAgIGNhc2UgJ1NxcnQnOiB7XG4gICAgICAgICAgcmV0dXJuIFtvcHMuc3FydChcbiAgICAgICAgICAgICAgZ2V0UGFyYW1WYWx1ZSgneCcsIG5vZGUsIHRlbnNvck1hcCwgY29udGV4dCkgYXMgVGVuc29yKV07XG4gICAgICAgIH1cbiAgICAgICAgY2FzZSAnU3F1YXJlJzoge1xuICAgICAgICAgIHJldHVybiBbb3BzLnNxdWFyZShcbiAgICAgICAgICAgICAgZ2V0UGFyYW1WYWx1ZSgneCcsIG5vZGUsIHRlbnNvck1hcCwgY29udGV4dCkgYXMgVGVuc29yKV07XG4gICAgICAgIH1cbiAgICAgICAgY2FzZSAnVGFuaCc6IHtcbiAgICAgICAgICByZXR1cm4gW29wcy50YW5oKFxuICAgICAgICAgICAgICBnZXRQYXJhbVZhbHVlKCd4Jywgbm9kZSwgdGVuc29yTWFwLCBjb250ZXh0KSBhcyBUZW5zb3IpXTtcbiAgICAgICAgfVxuICAgICAgICBjYXNlICdUYW4nOlxuICAgICAgICAgIHJldHVybiBbb3BzLnRhbihcbiAgICAgICAgICAgICAgZ2V0UGFyYW1WYWx1ZSgneCcsIG5vZGUsIHRlbnNvck1hcCwgY29udGV4dCkgYXMgVGVuc29yKV07XG4gICAgICAgIGNhc2UgJ0NsaXBCeVZhbHVlJzpcbiAgICAgICAgICByZXR1cm4gW29wcy5jbGlwQnlWYWx1ZShcbiAgICAgICAgICAgICAgZ2V0UGFyYW1WYWx1ZSgneCcsIG5vZGUsIHRlbnNvck1hcCwgY29udGV4dCkgYXMgVGVuc29yLFxuICAgICAgICAgICAgICBnZXRQYXJhbVZhbHVlKCdjbGlwVmFsdWVNaW4nLCBub2RlLCB0ZW5zb3JNYXAsIGNvbnRleHQpIGFzIG51bWJlcixcbiAgICAgICAgICAgICAgZ2V0UGFyYW1WYWx1ZSgnY2xpcFZhbHVlTWF4Jywgbm9kZSwgdGVuc29yTWFwLCBjb250ZXh0KSBhc1xuICAgICAgICAgICAgICAgICAgbnVtYmVyKV07XG4gICAgICAgIGNhc2UgJ1JlbHU2JzpcbiAgICAgICAgICByZXR1cm4gW29wcy5yZWx1NihcbiAgICAgICAgICAgICAgZ2V0UGFyYW1WYWx1ZSgneCcsIG5vZGUsIHRlbnNvck1hcCwgY29udGV4dCkgYXMgVGVuc29yKV07XG4gICAgICAgIGNhc2UgJ1JzcXJ0JzpcbiAgICAgICAgICByZXR1cm4gW29wcy5yc3FydChcbiAgICAgICAgICAgICAgZ2V0VGVuc29yKG5vZGUuaW5wdXROYW1lc1swXSwgdGVuc29yTWFwLCBjb250ZXh0KSldO1xuICAgICAgICBjYXNlICdQcm9kJzpcbiAgICAgICAgICByZXR1cm4gW29wcy5wcm9kKFxuICAgICAgICAgICAgICBnZXRQYXJhbVZhbHVlKCd4Jywgbm9kZSwgdGVuc29yTWFwLCBjb250ZXh0KSBhcyBUZW5zb3IsXG4gICAgICAgICAgICAgIGdldFBhcmFtVmFsdWUoJ2F4ZXMnLCBub2RlLCB0ZW5zb3JNYXAsIGNvbnRleHQpIGFzIG51bWJlcltdKV07XG4gICAgICAgIGNhc2UgJ0xlYWt5UmVsdSc6XG4gICAgICAgICAgcmV0dXJuIFtvcHMubGVha3lSZWx1KFxuICAgICAgICAgICAgICBnZXRQYXJhbVZhbHVlKCd4Jywgbm9kZSwgdGVuc29yTWFwLCBjb250ZXh0KSBhcyBUZW5zb3IsXG4gICAgICAgICAgICAgIGdldFBhcmFtVmFsdWUoJ2FscGhhJywgbm9kZSwgdGVuc29yTWFwLCBjb250ZXh0KSBhcyBudW1iZXIpXTtcbiAgICAgICAgY2FzZSAnUHJlbHUnOlxuICAgICAgICAgIHJldHVybiBbb3BzLnByZWx1KFxuICAgICAgICAgICAgICBnZXRQYXJhbVZhbHVlKCd4Jywgbm9kZSwgdGVuc29yTWFwLCBjb250ZXh0KSBhcyBUZW5zb3IsXG4gICAgICAgICAgICAgIGdldFBhcmFtVmFsdWUoJ2FscGhhJywgbm9kZSwgdGVuc29yTWFwLCBjb250ZXh0KSBhcyBUZW5zb3IpXTtcbiAgICAgICAgY2FzZSAnSXNOYW4nOlxuICAgICAgICAgIHJldHVybiBbb3BzLmlzTmFOKFxuICAgICAgICAgICAgICBnZXRUZW5zb3Iobm9kZS5pbnB1dE5hbWVzWzBdLCB0ZW5zb3JNYXAsIGNvbnRleHQpKV07XG4gICAgICAgIGRlZmF1bHQ6XG4gICAgICAgICAgdGhyb3cgVHlwZUVycm9yKGBOb2RlIHR5cGUgJHtub2RlLm9wfSBpcyBub3QgaW1wbGVtZW50ZWRgKTtcbiAgICAgIH1cbiAgICB9O1xuXG5leHBvcnQgY29uc3QgQ0FURUdPUlkgPSAnYmFzaWNfbWF0aCc7XG4iXX0=","/**\n * @license\n * Copyright 2018 Google LLC. All Rights Reserved.\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n * =============================================================================\n */\n// tslint:disable-next-line: no-imports-from-dist\nimport * as tfOps from '@tensorflow/tfjs-core/dist/ops/ops_for_converter';\nimport { getParamValue } from './utils';\nexport const executeOp = (node, tensorMap, context, ops = tfOps) => {\n switch (node.op) {\n case 'Fill': {\n const shape = getParamValue('shape', node, tensorMap, context);\n const dtype = getParamValue('dtype', node, tensorMap, context);\n const value = getParamValue('value', node, tensorMap, context);\n return [ops.fill(shape, value, dtype)];\n }\n case 'LinSpace': {\n const start = getParamValue('start', node, tensorMap, context);\n const stop = getParamValue('stop', node, tensorMap, context);\n const num = getParamValue('num', node, tensorMap, context);\n return [ops.linspace(start, stop, num)];\n }\n case 'Multinomial': {\n const logits = getParamValue('logits', node, tensorMap, context);\n const numSamples = getParamValue('numSamples', node, tensorMap, context);\n const seed = getParamValue('seed', node, tensorMap, context);\n return [ops.multinomial(logits, numSamples, seed)];\n }\n case 'OneHot': {\n const indices = getParamValue('indices', node, tensorMap, context);\n const depth = getParamValue('depth', node, tensorMap, context);\n const onValue = getParamValue('onValue', node, tensorMap, context);\n const offValue = getParamValue('offValue', node, tensorMap, context);\n const dtype = getParamValue('dtype', node, tensorMap, context);\n return [ops.oneHot(indices, depth, onValue, offValue, dtype)];\n }\n case 'Ones': {\n return [ops.ones(getParamValue('shape', node, tensorMap, context), getParamValue('dtype', node, tensorMap, context))];\n }\n case 'OnesLike': {\n return [ops.onesLike(getParamValue('x', node, tensorMap, context))];\n }\n case 'RandomStandardNormal': {\n return [ops.randomStandardNormal(getParamValue('shape', node, tensorMap, context), getParamValue('dtype', node, tensorMap, context), getParamValue('seed', node, tensorMap, context))];\n }\n case 'RandomUniform': {\n return [ops.randomUniform(\n // tslint:disable-next-line:no-any\n getParamValue('shape', node, tensorMap, context), getParamValue('minval', node, tensorMap, context), getParamValue('maxval', node, tensorMap, context), getParamValue('dtype', node, tensorMap, context))];\n }\n case 'Range': {\n const start = getParamValue('start', node, tensorMap, context);\n const stop = getParamValue('stop', node, tensorMap, context);\n const step = getParamValue('step', node, tensorMap, context);\n return [ops.range(start, stop, step, getParamValue('dtype', node, tensorMap, context))];\n }\n case 'TruncatedNormal': {\n const shape = getParamValue('shape', node, tensorMap, context);\n const mean = getParamValue('mean', node, tensorMap, context);\n const stdDev = getParamValue('stdDev', node, tensorMap, context);\n const seed = getParamValue('seed', node, tensorMap, context);\n return [ops.truncatedNormal(shape, mean, stdDev, getParamValue('dtype', node, tensorMap, context), seed)];\n }\n case 'Zeros': {\n return [ops.zeros(getParamValue('shape', node, tensorMap, context), getParamValue('dtype', node, tensorMap, context))];\n }\n case 'ZerosLike': {\n return [ops.zerosLike(getParamValue('x', node, tensorMap, context))];\n }\n default:\n throw TypeError(`Node type ${node.op} is not implemented`);\n }\n};\nexport const CATEGORY = 'creation';\n//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY3JlYXRpb25fZXhlY3V0b3IuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi8uLi8uLi90ZmpzLWNvbnZlcnRlci9zcmMvb3BlcmF0aW9ucy9leGVjdXRvcnMvY3JlYXRpb25fZXhlY3V0b3IudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUE7Ozs7Ozs7Ozs7Ozs7OztHQWVHO0FBR0gsaURBQWlEO0FBQ2pELE9BQU8sS0FBSyxLQUFLLE1BQU0sa0RBQWtELENBQUM7QUFNMUUsT0FBTyxFQUFDLGFBQWEsRUFBQyxNQUFNLFNBQVMsQ0FBQztBQUV0QyxNQUFNLENBQUMsTUFBTSxTQUFTLEdBQ2xCLENBQUMsSUFBVSxFQUFFLFNBQTBCLEVBQUUsT0FBeUIsRUFDakUsR0FBRyxHQUFHLEtBQUssRUFBWSxFQUFFO0lBQ3hCLFFBQVEsSUFBSSxDQUFDLEVBQUUsRUFBRTtRQUNmLEtBQUssTUFBTSxDQUFDLENBQUM7WUFDWCxNQUFNLEtBQUssR0FDUCxhQUFhLENBQUMsT0FBTyxFQUFFLElBQUksRUFBRSxTQUFTLEVBQUUsT0FBTyxDQUFhLENBQUM7WUFDakUsTUFBTSxLQUFLLEdBQ1AsYUFBYSxDQUFDLE9BQU8sRUFBRSxJQUFJLEVBQUUsU0FBUyxFQUFFLE9BQU8sQ0FBYSxDQUFDO1lBQ2pFLE1BQU0sS0FBSyxHQUNQLGFBQWEsQ0FBQyxPQUFPLEVBQUUsSUFBSSxFQUFFLFNBQVMsRUFBRSxPQUFPLENBQVcsQ0FBQztZQUMvRCxPQUFPLENBQUMsR0FBRyxDQUFDLElBQUksQ0FBQyxLQUFLLEVBQUUsS0FBSyxFQUFFLEtBQUssQ0FBQyxDQUFDLENBQUM7U0FDeEM7UUFDRCxLQUFLLFVBQVUsQ0FBQyxDQUFDO1lBQ2YsTUFBTSxLQUFLLEdBQ1AsYUFBYSxDQUFDLE9BQU8sRUFBRSxJQUFJLEVBQUUsU0FBUyxFQUFFLE9BQU8sQ0FBVyxDQUFDO1lBQy9ELE1BQU0sSUFBSSxHQUNOLGFBQWEsQ0FBQyxNQUFNLEVBQUUsSUFBSSxF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QixhQUFhLENBQUMsT0FBTyxFQUFFLElBQUksRUFBRSxTQUFTLEVBQUUsT0FBTyxDQUNwQyxFQUNYLElBQUksQ0FBQyxDQUFDLENBQUM7U0FDWjtRQUNELEtBQUssT0FBTyxDQUFDLENBQUM7WUFDWixPQUFPLENBQUMsR0FBRyxDQUFDLEtBQUssQ0FDYixhQUFhLENBQUMsT0FBTyxFQUFFLElBQUksRUFBRSxTQUFTLEVBQUUsT0FBTyxDQUFhLEVBQzVELGFBQWEsQ0FBQyxPQUFPLEVBQUUsSUFBSSxFQUFFLFNBQVMsRUFBRSxPQUFPLENBQWEsQ0FBQyxDQUFDLENBQUM7U0FDcEU7UUFDRCxLQUFLLFdBQVcsQ0FBQyxDQUFDO1lBQ2hCLE9BQU8sQ0FBQyxHQUFHLENBQUMsU0FBUyxDQUNqQixhQUFhLENBQUMsR0FBRyxFQUFFLElBQUksRUFBRSxTQUFTLEVBQUUsT0FBTyxDQUFXLENBQUMsQ0FBQyxDQUFDO1NBQzlEO1FBQ0Q7WUFDRSxNQUFNLFNBQVMsQ0FBQyxhQUFhLElBQUksQ0FBQyxFQUFFLHFCQUFxQixDQUFDLENBQUM7S0FDOUQ7QUFDSCxDQUFDLENBQUM7QUFFTixNQUFNLENBQUMsTUFBTSxRQUFRLEdBQUcsVUFBVSxDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiLyoqXG4gKiBAbGljZW5zZVxuICogQ29weXJpZ2h0IDIwMTggR29vZ2xlIExMQy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC5cbiAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSBcIkxpY2Vuc2VcIik7XG4gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuXG4gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXRcbiAqXG4gKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjBcbiAqXG4gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlXG4gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiBcIkFTIElTXCIgQkFTSVMsXG4gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC5cbiAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmRcbiAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLlxuICogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbiAqL1xuXG5pbXBvcnQge0RhdGFUeXBlLCBUZW5zb3IsIFRlbnNvcjFEfSBmcm9tICdAdGVuc29yZmxvdy90ZmpzLWNvcmUnO1xuLy8gdHNsaW50OmRpc2FibGUtbmV4dC1saW5lOiBuby1pbXBvcnRzLWZyb20tZGlzdFxuaW1wb3J0ICogYXMgdGZPcHMgZnJvbSAnQHRlbnNvcmZsb3cvdGZqcy1jb3JlL2Rpc3Qvb3BzL29wc19mb3JfY29udmVydGVyJztcblxuaW1wb3J0IHtOYW1lZFRlbnNvcnNNYXB9IGZyb20gJy4uLy4uL2RhdGEvdHlwZXMnO1xuaW1wb3J0IHtFeGVjdXRpb25Db250ZXh0fSBmcm9tICcuLi8uLi9leGVjdXRvci9leGVjdXRpb25fY29udGV4dCc7XG5pbXBvcnQge0ludGVybmFsT3BFeGVjdXRvciwgTm9kZX0gZnJvbSAnLi4vdHlwZXMnO1xuXG5pbXBvcnQge2dldFBhcmFtVmFsdWV9IGZyb20gJy4vdXRpbHMnO1xuXG5leHBvcnQgY29uc3QgZXhlY3V0ZU9wOiBJbnRlcm5hbE9wRXhlY3V0b3IgPVxuICAgIChub2RlOiBOb2RlLCB0ZW5zb3JNYXA6IE5hbWVkVGVuc29yc01hcCwgY29udGV4dDogRXhlY3V0aW9uQ29udGV4dCxcbiAgICAgb3BzID0gdGZPcHMpOiBUZW5zb3JbXSA9PiB7XG4gICAgICBzd2l0Y2ggKG5vZGUub3ApIHtcbiAgICAgICAgY2FzZSAnRmlsbCc6IHtcbiAgICAgICAgICBjb25zdCBzaGFwZSA9XG4gICAgICAgICAgICAgIGdldFBhcmFtVmFsdWUoJ3NoYXBlJywgbm9kZSwgdGVuc29yTWFwLCBjb250ZXh0KSBhcyBudW1iZXJbXTtcbiAgICAgICAgICBjb25zdCBkdHlwZSA9XG4gICAgICAgICAgICAgIGdldFBhcmFtVmFsdWUoJ2R0eXBlJywgbm9kZSwgdGVuc29yTWFwLCBjb250ZXh0KSBhcyBEYXRhVHlwZTtcbiAgICAgICAgICBjb25zdCB2YWx1ZSA9XG4gICAgICAgICAgICAgIGdldFBhcmFtVmFsdWUoJ3ZhbHVlJywgbm9kZSwgdGVuc29yTWFwLCBjb250ZXh0KSBhcyBudW1iZXI7XG4gICAgICAgICAgcmV0dXJuIFtvcHMuZmlsbChzaGFwZSwgdmFsdWUsIGR0eXBlKV07XG4gICAgICAgIH1cbiAgICAgICAgY2FzZSAnTGluU3BhY2UnOiB7XG4gICAgICAgICAgY29uc3Qgc3RhcnQgPVxuICAgICAgICAgICAgICBnZXRQYXJhbVZhbHVlKCdzdGFydCcsIG5vZGUsIHRlbnNvck1hcCwgY29udGV4dCkgYXMgbnVtYmVyO1xuICAgICAgICAgIGNvbnN0IHN0b3AgPVxuICAgICAgICAgICAgICBnZXRQYXJhbVZhbHVlKCdzdG9wJywgbm9kZSwgdGVuc29yTWFwLCBjb250ZXh0KSBhcyBudW1iZXI7XG4gICAgICAgICAgY29uc3QgbnVtID0gZ2V0UGFyYW1WYWx1ZSgnbnVtJywgbm9kZSwgdGVuc29yTWFwLCBjb250ZXh0KSBhcyBudW1iZXI7XG4gICAgICAgICAgcmV0dXJuIFtvcHMubGluc3BhY2Uoc3RhcnQsIHN0b3AsIG51bSldO1xuICAgICAgICB9XG4gICAgICAgIGNhc2UgJ011bHRpbm9taWFsJzoge1xuICAgICAgICAgIGNvbnN0IGxvZ2l0cyA9XG4gICAgICAgICAgICAgIGdldFBhcmFtVmFsdWUoJ2xvZ2l0cycsIG5vZGUsIHRlbnNvck1hcCwgY29udGV4dCkgYXMgVGVuc29yMUQ7XG4gICAgICAgICAgY29uc3QgbnVtU2FtcGxlcyA9XG4gICAgICAgICAgICAgIGdldFBhcmFtVmFsdWUoJ251bVNhbXBsZXMnLCBub2RlLCB0ZW5zb3JNYXAsIGNvbnRleHQpIGFzIG51bWJlcjtcbiAgICAgICAgICBjb25zdCBzZWVkID1cbiAgICAgICAgICAgICAgZ2V0UGFyYW1WYWx1ZSgnc2VlZCcsIG5vZGUsIHRlbnNvck1hcCwgY29udGV4dCkgYXMgbnVtYmVyO1xuICAgICAgICAgIHJldHVybiBbb3BzLm11bHRpbm9taWFsKGxvZ2l0cywgbnVtU2FtcGxlcywgc2VlZCldO1xuICAgICAgICB9XG4gICAgICAgIGNhc2UgJ09uZUhvdCc6IHtcbiAgICAgICAgICBjb25zdCBpbmRpY2VzID1cbiAgICAgICAgICAgICAgZ2V0UGFyYW1WYWx1ZSgnaW5kaWNlcycsIG5vZGUsIHRlbnNvck1hcCwgY29udGV4dCkgYXMgVGVuc29yMUQ7XG4gICAgICAgICAgY29uc3QgZGVwdGggPVxuICAgICAgICAgICAgICBnZXRQYXJhbVZhbHVlKCdkZXB0aCcsIG5vZGUsIHRlbnNvck1hcCwgY29udGV4dCkgYXMgbnVtYmVyO1xuICAgICAgICAgIGNvbnN0IG9uVmFsdWUgPVxuICAgICAgICAgICAgICBnZXRQYXJhbVZhbHVlKCdvblZhbHVlJywgbm9kZSwgdGVuc29yTWFwLCBjb250ZXh0KSBhcyBudW1iZXI7XG4gICAgICAgICAgY29uc3Qgb2ZmVmFsdWUgPVxuICAgICAgICAgICAgICBnZXRQYXJhbVZhbHVlKCdvZmZWYWx1ZScsIG5vZGUsIHRlbnNvck1hcCwgY29udGV4dCkgYXMgbnVtYmVyO1xuICAgICAgICAgIGNvbnN0IGR0eXBlID1cbiAgICAgICAgICAgICAgZ2V0UGFyYW1WYWx1ZSgnZHR5cGUnLCBub2RlLCB0ZW5zb3JNYXAsIGNvbnRleHQpIGFzIERhdGFUeXBlO1xuICAgICAgICAgIHJldHVybiBbb3BzLm9uZUhvdChpbmRpY2VzLCBkZXB0aCwgb25WYWx1ZSwgb2ZmVmFsdWUsIGR0eXBlKV07XG4gICAgICAgIH1cbiAgICAgICAgY2FzZSAnT25lcyc6IHtcbiAgICAgICAgICByZXR1cm4gW29wcy5vbmVzKFxuICAgICAgICAgICAgICBnZXRQYXJhbVZhbHVlKCdzaGFwZScsIG5vZGUsIHRlbnNvck1hcCwgY29udGV4dCkgYXMgbnVtYmVyW10sXG4gICAgICAgICAgICAgIGdldFBhcmFtVmFsdWUoJ2R0eXBlJywgbm9kZSwgdGVuc29yTWFwLCBjb250ZXh0KSBhcyBEYXRhVHlwZSldO1xuICAgICAgICB9XG4gICAgICAgIGNhc2UgJ09uZXNMaWtlJzoge1xuICAgICAgICAgIHJldHVybiBbb3BzLm9uZXNMaWtlKFxuICAgICAgICAgICAgICBnZXRQYXJhbVZhbHVlKCd4Jywgbm9kZSwgdGVuc29yTWFwLCBjb250ZXh0KSBhcyBUZW5zb3IpXTtcbiAgICAgICAgfVxuICAgICAgICBjYXNlICdSYW5kb21TdGFuZGFyZE5vcm1hbCc6IHtcbiAgICAgICAgICByZXR1cm4gW29wcy5yYW5kb21TdGFuZGFyZE5vcm1hbChcbiAgICAgICAgICAgICAgZ2V0UGFyYW1WYWx1ZSgnc2hhcGUnLCBub2RlLCB0ZW5zb3JNYXAsIGNvbnRleHQpIGFzIG51bWJlcltdLFxuICAgICAgICAgICAgICBnZXRQYXJhbVZhbHVlKCdkdHlwZScsIG5vZGUsIHRlbnNvck1hcCwgY29udGV4dCkgYXMgJ2Zsb2F0MzInIHxcbiAgICAgICAgICAgICAgICAgICdpbnQzMicsXG4gICAgICAgICAgICAgIGdldFBhcmFtVmFsdWUoJ3NlZWQnLCBub2RlLCB0ZW5zb3JNYXAsIGNvbnRleHQpIGFzIG51bWJlcildO1xuICAgICAgICB9XG4gICAgICAgIGNhc2UgJ1JhbmRvbVVuaWZvcm0nOiB7XG4gICAgICAgICAgcmV0dXJuIFtvcHMucmFuZG9tVW5pZm9ybShcbiAgICAgICAgICAgICAgLy8gdHNsaW50OmRpc2FibGUtbmV4dC1saW5lOm5vLWFueVxuICAgICAgICAgICAgICBnZXRQYXJhbVZhbHVlKCdzaGFwZScsIG5vZGUsIHRlbnNvck1hcCwgY29udGV4dCkgYXMgYW55LFxuICAgICAgICAgICAgICBnZXRQYXJhbVZhbHVlKCdtaW52YWwnLCBub2RlLCB0ZW5zb3JNYXAsIGNvbnRleHQpIGFzIG51bWJlcixcbiAgICAgICAgICAgICAgZ2V0UGFyYW1WYWx1ZSgnbWF4dmFsJywgbm9kZSwgdGVuc29yTWFwLCBjb250ZXh0KSBhcyBudW1iZXIsXG4gICAgICAgICAgICAgIGdldFBhcmFtVmFsdWUoJ2R0eXBlJywgbm9kZSwgdGVuc29yTWFwLCBjb250ZXh0KSBhcyBEYXRhVHlwZSldO1xuICAgICAgICB9XG4gICAgICAgIGNhc2UgJ1JhbmdlJzoge1xuICAgICAgICAgIGNvbnN0IHN0YXJ0ID1cbiAgICAgICAgICAgICAgZ2V0UGFyYW1WYWx1ZSgnc3RhcnQnLCBub2RlLCB0ZW5zb3JNYXAsIGNvbnRleHQpIGFzIG51bWJlcjtcbiAgICAgICAgICBjb25zdCBzdG9wID1cbiAgICAgICAgICAgICAgZ2V0UGFyYW1WYWx1ZSgnc3RvcCcsIG5vZGUsIHRlbnNvck1hcCwgY29udGV4dCkgYXMgbnVtYmVyO1xuICAgICAgICAgIGNvbnN0IHN0ZXAgPVxuICAgICAgICAgICAgICBnZXRQYXJhbVZhbHVlKCdzdGVwJywgbm9kZSwgdGVuc29yTWFwLCBjb250ZXh0KSBhcyBudW1iZXI7XG4gICAgICAgICAgcmV0dXJuIFtvcHMucmFuZ2UoXG4gICAgICAgICAgICAgIHN0YXJ0LCBzdG9wLCBzdGVwLFxuICAgICAgICAgICAgICBnZXRQYXJhbVZhbHVlKCdkdHlwZScsIG5vZGUsIHRlbnNvck1hcCwgY29udGV4dCkgYXMgJ2Zsb2F0MzInIHxcbiAgICAgICAgICAgICAgICAgICdpbnQzMicpXTtcbiAgICAgICAgfVxuICAgICAgICBjYXNlICdUcnVuY2F0ZWROb3JtYWwnOiB7XG4gICAgICAgICAgY29uc3Qgc2hhcGUgPVxuICAgICAgICAgICAgICBnZXRQYXJhbVZhbHVlKCdzaGFwZScsIG5vZGUsIHRlbnNvck1hcCwgY29udGV4dCkgYXMgbnVtYmVyW107XG4gICAgICAgICAgY29uc3QgbWVhbiA9XG4gICAgICAgICAgICAgIGdldFBhcmFtVmFsdWUoJ21lYW4nLCBub2RlLCB0ZW5zb3JNYXAsIGNvbnRleHQpIGFzIG51bWJlcjtcbiAgICAgICAgICBjb25zdCBzdGREZXYgPVxuICAgICAgICAgICAgICBnZXRQYXJhbVZhbHVlKCdzdGREZXYnLCBub2RlLCB0ZW5zb3JNYXAsIGNvbnRleHQpIGFzIG51bWJlcjtcbiAgICAgICAgICBjb25zdCBzZWVkID1cbiAgICAgICAgICAgICAgZ2V0UGFyYW1WYWx1ZSgnc2VlZCcsIG5vZGUsIHRlbnNvck1hcCwgY29udGV4dCkgYXMgbnVtYmVyO1xuICAgICAgICAgIHJldHVybiBbb3BzLnRydW5jYXRlZE5vcm1hbChcbiAgICAgICAgICAgICAgc2hhcGUsIG1lYW4sIHN0ZERldixcbiAgICAgICAgICAgICAgZ2V0UGFyYW1WYWx1ZSgnZHR5cGUnLCBub2RlLCB0ZW5zb3JNYXAsIGNvbnRleHQpIGFzICdmbG9hdDMyJyB8XG4gICAgICAgICAgICAgICAgICAnaW50MzInLFxuICAgICAgICAgICAgICBzZWVkKV07XG4gICAgICAgIH1cbiAgICAgICAgY2FzZSAnWmVyb3MnOiB7XG4gICAgICAgICAgcmV0dXJuIFtvcHMuemVyb3MoXG4gICAgICAgICAgICAgIGdldFBhcmFtVmFsdWUoJ3NoYXBlJywgbm9kZSwgdGVuc29yTWFwLCBjb250ZXh0KSBhcyBudW1iZXJbXSxcbiAgICAgICAgICAgICAgZ2V0UGFyYW1WYWx1ZSgnZHR5cGUnLCBub2RlLCB0ZW5zb3JNYXAsIGNvbnRleHQpIGFzIERhdGFUeXBlKV07XG4gICAgICAgIH1cbiAgICAgICAgY2FzZSAnWmVyb3NMaWtlJzoge1xuICAgICAgICAgIHJldHVybiBbb3BzLnplcm9zTGlrZShcbiAgICAgICAgICAgICAgZ2V0UGFyYW1WYWx1ZSgneCcsIG5vZGUsIHRlbnNvck1hcCwgY29udGV4dCkgYXMgVGVuc29yKV07XG4gICAgICAgIH1cbiAgICAgICAgZGVmYXVsdDpcbiAgICAgICAgICB0aHJvdyBUeXBlRXJyb3IoYE5vZGUgdHlwZSAke25vZGUub3B9IGlzIG5vdCBpbXBsZW1lbnRlZGApO1xuICAgICAgfVxuICAgIH07XG5cbmV4cG9ydCBjb25zdCBDQVRFR09SWSA9ICdjcmVhdGlvbic7XG4iXX0=","/**\n * @license\n * Copyright 2018 Google LLC. All Rights Reserved.\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n * =============================================================================\n */\n// tslint:disable-next-line: no-imports-from-dist\nimport * as tfOps from '@tensorflow/tfjs-core/dist/ops/ops_for_converter';\nimport { getParamValue } from './utils';\nexport const executeOp = (node, tensorMap, context, ops = tfOps) => {\n switch (node.op) {\n case 'LowerBound': {\n const sortedSequence = getParamValue('sortedSequence', node, tensorMap, context);\n const values = getParamValue('values', node, tensorMap, context);\n return [ops.lowerBound(sortedSequence, values)];\n }\n case 'TopKV2': {\n const x = getParamValue('x', node, tensorMap, context);\n const k = getParamValue('k', node, tensorMap, context);\n const sorted = getParamValue('sorted', node, tensorMap, context);\n const result = ops.topk(x, k, sorted);\n return [result.values, result.indices];\n }\n case 'UpperBound': {\n const sortedSequence = getParamValue('sortedSequence', node, tensorMap, context);\n const values = getParamValue('values', node, tensorMap, context);\n return [ops.upperBound(sortedSequence, values)];\n }\n case 'Unique': {\n const x = getParamValue('x', node, tensorMap, context);\n const result = ops.unique(x);\n return [result.values, result.indices];\n }\n case 'UniqueV2': {\n const x = getParamValue('x', node, tensorMap, context);\n const axis = getParamValue('axis', node, tensorMap, context);\n const result = ops.unique(x, axis);\n return [result.values, result.indices];\n }\n default:\n throw TypeError(`Node type ${node.op} is not implemented`);\n }\n};\nexport const CATEGORY = 'evaluation';\n//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZXZhbHVhdGlvbl9leGVjdXRvci5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uLy4uLy4uL3RmanMtY29udmVydGVyL3NyYy9vcGVyYXRpb25zL2V4ZWN1dG9ycy9ldmFsdWF0aW9uX2V4ZWN1dG9yLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBOzs7Ozs7Ozs7Ozs7Ozs7R0FlRztBQUdILGlEQUFpRDtBQUNqRCxPQUFPLEtBQUssS0FBSyxNQUFNLGtEQUFrRCxDQUFDO0FBTTFFLE9BQU8sRUFBQyxhQUFhLEVBQUMsTUFBTSxTQUFTLENBQUM7QUFFdEMsTUFBTSxDQUFDLE1BQU0sU0FBUyxHQUNsQixDQUFDLElBQVUsRUFBRSxTQUEwQixFQUFFLE9BQXlCLEVBQ2pFLEdBQUcsR0FBRyxLQUFLLEVBQ0MsRUFBRTtJQUNULFFBQVEsSUFBSSxDQUFDLEVBQUUsRUFBRTtRQUNmLEtBQUssWUFBWSxDQUFDLENBQUM7WUFDakIsTUFBTSxjQUFjLEdBQ2hCLGFBQWEsQ0FBQyxnQkFBZ0IsRUFBRSxJQUFJLEVBQUUsU0FBUyxFQUFFLE9BQU8sQ0FDbEQsQ0FBQztZQUNYLE1BQU0sTUFBTSxHQUNSLGFBQWEsQ0FBQyxRQUFRLEVBQUUsSUFBSSxFQUFFLFNBQVMsRUFBRSxPQUFPLENBQVcsQ0FBQztZQUNoRSxPQUFPLENBQUMsR0FBRyxDQUFDLFVBQVUsQ0FBQyxjQUFjLEVBQUUsTUFBTSxDQUFDLENBQUMsQ0FBQztTQUNqRDtRQUNELEtBQUssUUFBUSxDQUFDLENBQUM7WUFDYixNQUFNLENBQUMsR0FBRyxhQUFhLENBQUMsR0FBRyxFQUFFLElBQUksRUFBRSxTQUFTLEVBQUUsT0FBTyxDQUFXLENBQUM7WUFDakUsTUFBTSxDQUFDLEdBQUcsYUFBYSxDQUFDLEdBQUcsRUFBRSxJQUFJLEVBQUUsU0FBUyxFQUFFLE9BQU8sQ0FBVyxDQUFDO1lBQ2pFLE1BQU0sTUFBTSxHQUNSLGFBQWEsQ0FBQyxRQUFRLEVBQUUsSUFBSSxFQUFFLFNBQVMsRUFBRSxPQUFPLENBQVksQ0FBQztZQUNqRSxNQUFNLE1BQU0sR0FBRyxHQUFHLENBQUMsSUFBSSxDQUFDLENBQUMsRUFBRSxDQUFDLEVBQUUsTUFBTSxDQUFDLENBQUM7WUFDdEMsT0FBTyxDQUFDLE1BQU0sQ0FBQyxNQUFNLEVBQUUsTUFBTSxDQUFDLE9BQU8sQ0FBQyxDQUFDO1NBQ3hDO1FBQ0QsS0FBSyxZQUFZLENBQUMsQ0FBQztZQUNqQixNQUFNLGNBQWMsR0FDaEIsYUFBYSxDQUFDLGdCQUFnQixFQUFFLElBQUksRUFBRSxTQUFTLEVBQUUsT0FBTyxDQUNsRCxDQUFDO1lBQ1gsTUFBTSxNQUFNLEdBQ1IsYUFBYSxDQUFDLFFBQVEsRUFBRSxJQUFJLEVBQUUsU0FBUyxFQUFFLE9BQU8sQ0FBVyxDQUFDO1lBQ2hFLE9BQU8sQ0FBQyxHQUFHLENBQUMsVUFBVSxDQUFDLGNBQWMsRUFBRSxNQUFNLENBQUMsQ0FBQyxDQUFDO1NBQ2pEO1FBQ0QsS0FBSyxRQUFRLENBQUMsQ0FBQztZQUNiLE1BQU0sQ0FBQyxHQUFHLGFBQWEsQ0FBQyxHQUFHLEVBQUUsSUFBSSxFQUFFLFNBQVMsRUFBRSxPQUFPLENBQVcsQ0FBQztZQUNqRSxNQUFNLE1BQU0sR0FBRyxHQUFHLENBQUMsTUFBTSxDQUFDLENBQUMsQ0FBQyxDQUFDO1lBQzdCLE9BQU8sQ0FBQyxNQUFNLENBQUMsTUFBTSxFQUFFLE1BQU0sQ0FBQyxPQUFPLENBQUMsQ0FBQztTQUN4QztRQUNELEtBQUssVUFBVSxDQUFDLENBQUM7WUFDZixNQUFNLENBQUMsR0FBRyxhQUFhLENBQUMsR0FBRyxFQUFFLElBQUksRUFBRSxTQUFTLEVBQUUsT0FBTyxDQUFXLENBQUM7WUFDakUsTUFBTSxJQUFJLEdBQ04sYUFBYSxDQUFDLE1BQU0sRUFBRSxJQUFJLEVBQUUsU0FBUyxFQUFFLE9BQU8sQ0FBVyxDQUFDO1lBQzlELE1BQU0sTUFBTSxHQUFHLEdBQUcsQ0FBQyxNQUFNLENBQUMsQ0FBQyxFQUFFLElBQUksQ0FBQyxDQUFDO1lBQ25DLE9BQU8sQ0FBQyxNQUFNLENBQUMsTUFBTSxFQUFFLE1BQU0sQ0FBQyxPQUFPLENBQUMsQ0FBQztTQUN4QztRQUNEO1lBQ0UsTUFBTSxTQUFTLENBQUMsYUFBYSxJQUFJLENBQUMsRUFBRSxxQkFBcUIsQ0FBQyxDQUFDO0tBQzlEO0FBQ0gsQ0FBQyxDQUFDO0FBRVYsTUFBTSxDQUFDLE1BQU0sUUFBUSxHQUFHLFlBQVksQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbIi8qKlxuICogQGxpY2Vuc2VcbiAqIENvcHlyaWdodCAyMDE4IEdvb2dsZSBMTEMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuXG4gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgXCJMaWNlbnNlXCIpO1xuICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLlxuICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0XG4gKlxuICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wXG4gKlxuICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZVxuICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gXCJBUyBJU1wiIEJBU0lTLFxuICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuXG4gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kXG4gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS5cbiAqID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4gKi9cblxuaW1wb3J0IHtUZW5zb3J9IGZyb20gJ0B0ZW5zb3JmbG93L3RmanMtY29yZSc7XG4vLyB0c2xpbnQ6ZGlzYWJsZS1uZXh0LWxpbmU6IG5vLWltcG9ydHMtZnJvbS1kaXN0XG5pbXBvcnQgKiBhcyB0Zk9wcyBmcm9tICdAdGVuc29yZmxvdy90ZmpzLWNvcmUvZGlzdC9vcHMvb3BzX2Zvcl9jb252ZXJ0ZXInO1xuXG5pbXBvcnQge05hbWVkVGVuc29yc01hcH0gZnJvbSAnLi4vLi4vZGF0YS90eXBlcyc7XG5pbXBvcnQge0V4ZWN1dGlvbkNvbnRleHR9IGZyb20gJy4uLy4uL2V4ZWN1dG9yL2V4ZWN1dGlvbl9jb250ZXh0JztcbmltcG9ydCB7SW50ZXJuYWxPcEV4ZWN1dG9yLCBOb2RlfSBmcm9tICcuLi90eXBlcyc7XG5cbmltcG9ydCB7Z2V0UGFyYW1WYWx1ZX0gZnJvbSAnLi91dGlscyc7XG5cbmV4cG9ydCBjb25zdCBleGVjdXRlT3A6IEludGVybmFsT3BFeGVjdXRvciA9XG4gICAgKG5vZGU6IE5vZGUsIHRlbnNvck1hcDogTmFtZWRUZW5zb3JzTWFwLCBjb250ZXh0OiBFeGVjdXRpb25Db250ZXh0LFxuICAgICBvcHMgPSB0Zk9wcyk6XG4gICAgICAgIFRlbnNvcltdID0+IHtcbiAgICAgICAgICBzd2l0Y2ggKG5vZGUub3ApIHtcbiAgICAgICAgICAgIGNhc2UgJ0xvd2VyQm91bmQnOiB7XG4gICAgICAgICAgICAgIGNvbnN0IHNvcnRlZFNlcXVlbmNlID1cbiAgICAgICAgICAgICAgICAgIGdldFBhcmFtVmFsdWUoJ3NvcnRlZFNlcXVlbmNlJywgbm9kZSwgdGVuc29yTWFwLCBjb250ZXh0KSBhc1xuICAgICAgICAgICAgICAgICAgVGVuc29yO1xuICAgICAgICAgICAgICBjb25zdCB2YWx1ZXMgPVxuICAgICAgICAgICAgICAgICAgZ2V0UGFyYW1WYWx1ZSgndmFsdWVzJywgbm9kZSwgdGVuc29yTWFwLCBjb250ZXh0KSBhcyBUZW5zb3I7XG4gICAgICAgICAgICAgIHJldHVybiBbb3BzLmxvd2VyQm91bmQoc29ydGVkU2VxdWVuY2UsIHZhbHVlcyldO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgY2FzZSAnVG9wS1YyJzoge1xuICAgICAgICAgICAgICBjb25zdCB4ID0gZ2V0UGFyYW1WYWx1ZSgneCcsIG5vZGUsIHRlbnNvck1hcCwgY29udGV4dCkgYXMgVGVuc29yO1xuICAgICAgICAgICAgICBjb25zdCBrID0gZ2V0UGFyYW1WYWx1ZSgnaycsIG5vZGUsIHRlbnNvck1hcCwgY29udGV4dCkgYXMgbnVtYmVyO1xuICAgICAgICAgICAgICBjb25zdCBzb3J0ZWQgPVxuICAgICAgICAgICAgICAgICAgZ2V0UGFyYW1WYWx1ZSgnc29ydGVkJywgbm9kZSwgdGVuc29yTWFwLCBjb250ZXh0KSBhcyBib29sZWFuO1xuICAgICAgICAgICAgICBjb25zdCByZXN1bHQgPSBvcHMudG9wayh4LCBrLCBzb3J0ZWQpO1xuICAgICAgICAgICAgICByZXR1cm4gW3Jlc3VsdC52YWx1ZXMsIHJlc3VsdC5pbmRpY2VzXTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGNhc2UgJ1VwcGVyQm91bmQnOiB7XG4gICAgICAgICAgICAgIGNvbnN0IHNvcnRlZFNlcXVlbmNlID1cbiAgICAgICAgICAgICAgICAgIGdldFBhcmFtVmFsdWUoJ3NvcnRlZFNlcXVlbmNlJywgbm9kZSwgdGVuc29yTWFwLCBjb250ZXh0KSBhc1xuICAgICAgICAgICAgICAgICAgVGVuc29yO1xuICAgICAgICAgICAgICBjb25zdCB2YWx1ZXMgPVxuICAgICAgICAgICAgICAgICAgZ2V0UGFyYW1WYWx1ZSgndmFsdWVzJywgbm9kZSwgdGVuc29yTWFwLCBjb250ZXh0KSBhcyBUZW5zb3I7XG4gICAgICAgICAgICAgIHJldHVybiBbb3BzLnVwcGVyQm91bmQoc29ydGVkU2VxdWVuY2UsIHZhbHVlcyldO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgY2FzZSAnVW5pcXVlJzoge1xuICAgICAgICAgICAgICBjb25zdCB4ID0gZ2V0UGFyYW1WYWx1ZSgneCcsIG5vZGUsIHRlbnNvck1hcCwgY29udGV4dCkgYXMgVGVuc29yO1xuICAgICAgICAgICAgICBjb25zdCByZXN1bHQgPSBvcHMudW5pcXVlKHgpO1xuICAgICAgICAgICAgICByZXR1cm4gW3Jlc3VsdC52YWx1ZXMsIHJlc3VsdC5pbmRpY2VzXTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGNhc2UgJ1VuaXF1ZVYyJzoge1xuICAgICAgICAgICAgICBjb25zdCB4ID0gZ2V0UGFyYW1WYWx1ZSgneCcsIG5vZGUsIHRlbnNvck1hcCwgY29udGV4dCkgYXMgVGVuc29yO1xuICAgICAgICAgICAgICBjb25zdCBheGlzID1cbiAgICAgICAgICAgICAgICAgIGdldFBhcmFtVmFsdWUoJ2F4aXMnLCBub2RlLCB0ZW5zb3JNYXAsIGNvbnRleHQpIGFzIG51bWJlcjtcbiAgICAgICAgICAgICAgY29uc3QgcmVzdWx0ID0gb3BzLnVuaXF1ZSh4LCBheGlzKTtcbiAgICAgICAgICAgICAgcmV0dXJuIFtyZXN1bHQudmFsdWVzLCByZXN1bHQuaW5kaWNlc107XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBkZWZhdWx0OlxuICAgICAgICAgICAgICB0aHJvdyBUeXBlRXJyb3IoYE5vZGUgdHlwZSAke25vZGUub3B9IGlzIG5vdCBpbXBsZW1lbnRlZGApO1xuICAgICAgICAgIH1cbiAgICAgICAgfTtcblxuZXhwb3J0IGNvbnN0IENBVEVHT1JZID0gJ2V2YWx1YXRpb24nO1xuIl19","/**\n * @license\n * Copyright 2018 Google LLC. All Rights Reserved.\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n * =============================================================================\n */\n// tslint:disable-next-line: no-imports-from-dist\nimport * as tfOps from '@tensorflow/tfjs-core/dist/ops/ops_for_converter';\nimport { getParamValue } from './utils';\nexport const executeOp = (node, tensorMap, context, ops = tfOps) => {\n switch (node.op) {\n case 'ResizeBilinear': {\n const images = getParamValue('images', node, tensorMap, context);\n const size = getParamValue('size', node, tensorMap, context);\n const alignCorners = getParamValue('alignCorners', node, tensorMap, context);\n const halfPixelCenters = getParamValue('halfPixelCenters', node, tensorMap, context);\n return [ops.image.resizeBilinear(images, [size[0], size[1]], alignCorners, halfPixelCenters)];\n }\n case 'ResizeNearestNeighbor': {\n const images = getParamValue('images', node, tensorMap, context);\n const size = getParamValue('size', node, tensorMap, context);\n const alignCorners = getParamValue('alignCorners', node, tensorMap, context);\n const halfPixelCenters = getParamValue('halfPixelCenters', node, tensorMap, context);\n return [ops.image.resizeNearestNeighbor(images, [size[0], size[1]], alignCorners, halfPixelCenters)];\n }\n case 'CropAndResize': {\n const image = getParamValue('image', node, tensorMap, context);\n const boxes = getParamValue('boxes', node, tensorMap, context);\n const boxInd = getParamValue('boxInd', node, tensorMap, context);\n const cropSize = getParamValue('cropSize', node, tensorMap, context);\n const method = getParamValue('method', node, tensorMap, context);\n const extrapolationValue = getParamValue('extrapolationValue', node, tensorMap, context);\n return [ops.image.cropAndResize(image, boxes, boxInd, cropSize, method, extrapolationValue)];\n }\n case 'ImageProjectiveTransformV3': {\n const images = getParamValue('images', node, tensorMap, context);\n const transforms = getParamValue('transforms', node, tensorMap, context);\n const outputShape = getParamValue('outputShape', node, tensorMap, context);\n const fillValue = getParamValue('fillValue', node, tensorMap, context);\n const interpolation = getParamValue('interpolation', node, tensorMap, context);\n const fillMode = getParamValue('fillMode', node, tensorMap, context);\n return [ops.image.transform(images, transforms, interpolation.toLowerCase(), fillMode.toLowerCase(), fillValue, outputShape)];\n }\n default:\n throw TypeError(`Node type ${node.op} is not implemented`);\n }\n};\nexport const CATEGORY = 'image';\n//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW1hZ2VfZXhlY3V0b3IuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi8uLi8uLi90ZmpzLWNvbnZlcnRlci9zcmMvb3BlcmF0aW9ucy9leGVjdXRvcnMvaW1hZ2VfZXhlY3V0b3IudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUE7Ozs7Ozs7Ozs7Ozs7OztHQWVHO0FBR0gsaURBQWlEO0FBQ2pELE9BQU8sS0FBSyxLQUFLLE1BQU0sa0RBQWtELENBQUM7QUFNMUUsT0FBTyxFQUFDLGFBQWEsRUFBQyxNQUFNLFNBQVMsQ0FBQztBQUV0QyxNQUFNLENBQUMsTUFBTSxTQUFTLEdBQ2xCLENBQUMsSUFBVSxFQUFFLFNBQTBCLEVBQ3RDLE9BQXlCLEVBQUUsR0FBRyxHQUFHLEtBQUssRUFBWSxFQUFFO0lBQ25ELFFBQVEsSUFBSSxDQUFDLEVBQUUsRUFBRTtRQUNmLEtBQUssZ0JBQWdCLENBQUMsQ0FBQztZQUNyQixNQUFNLE1BQU0sR0FDUixhQUFhLENBQUMsUUFBUSxFQUFFLElBQUksRUFBRSxTQUFTLEVBQUUsT0FBTyxDQUFXLENBQUM7WUFDaEUsTUFBTSxJQUFJLEdBQ04sYUFBYSxDQUFDLE1BQU0sRUFBRSxJQUFJLEVBQUUsU0FBUyxFQUFFLE9BQU8sQ0FBYSxDQUFDO1lBQ2hFLE1BQU0sWUFBWSxHQUNkLGFBQWEsQ0FBQyxjQUFjLEVBQUUsSUFBSSxFQUFFLFNBQVMsRUFBRSxPQUFPLENBQy9DLENBQUM7WUFDWixNQUFNLGdCQUFnQixHQUNsQixhQUFhLENBQUMsa0JBQWtCLEVBQUUsSUFBSSxFQUFFLFNBQVMsRUFBRSxPQUFPLENBQ25ELENBQUM7WUFDWixPQUFPLENBQUMsR0FBRyxDQUFDLEtBQUssQ0FBQyxjQUFjLENBQzVCLE1BQTZCLEVBQUUsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLEVBQUUsSUFBSSxDQUFDLENBQUMsQ0FBQyxDQUFDLEVBQUUsWUFBWSxFQUMvRCxnQkFBZ0IsQ0FBQyxDQUFDLENBQUM7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QUFDLEVBQUUscUJBQXFCLENBQUMsQ0FBQztLQUM5RDtBQUNILENBQUMsQ0FBQztBQUVOLE1BQU0sQ0FBQyxNQUFNLFFBQVEsR0FBRyxPQUFPLENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyIvKipcbiAqIEBsaWNlbnNlXG4gKiBDb3B5cmlnaHQgMjAxOCBHb29nbGUgTExDLiBBbGwgUmlnaHRzIFJlc2VydmVkLlxuICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlIFwiTGljZW5zZVwiKTtcbiAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS5cbiAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdFxuICpcbiAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMFxuICpcbiAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmVcbiAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuIFwiQVMgSVNcIiBCQVNJUyxcbiAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLlxuICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZFxuICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuXG4gKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuICovXG5cbmltcG9ydCB7VGVuc29yLCBUZW5zb3IxRCwgVGVuc29yMkQsIFRlbnNvcjNELCBUZW5zb3I0RH0gZnJvbSAnQHRlbnNvcmZsb3cvdGZqcy1jb3JlJztcbi8vIHRzbGludDpkaXNhYmxlLW5leHQtbGluZTogbm8taW1wb3J0cy1mcm9tLWRpc3RcbmltcG9ydCAqIGFzIHRmT3BzIGZyb20gJ0B0ZW5zb3JmbG93L3RmanMtY29yZS9kaXN0L29wcy9vcHNfZm9yX2NvbnZlcnRlcic7XG5cbmltcG9ydCB7TmFtZWRUZW5zb3JzTWFwfSBmcm9tICcuLi8uLi9kYXRhL3R5cGVzJztcbmltcG9ydCB7RXhlY3V0aW9uQ29udGV4dH0gZnJvbSAnLi4vLi4vZXhlY3V0b3IvZXhlY3V0aW9uX2NvbnRleHQnO1xuaW1wb3J0IHtJbnRlcm5hbE9wRXhlY3V0b3IsIE5vZGV9IGZyb20gJy4uL3R5cGVzJztcblxuaW1wb3J0IHtnZXRQYXJhbVZhbHVlfSBmcm9tICcuL3V0aWxzJztcblxuZXhwb3J0IGNvbnN0IGV4ZWN1dGVPcDogSW50ZXJuYWxPcEV4ZWN1dG9yID1cbiAgICAobm9kZTogTm9kZSwgdGVuc29yTWFwOiBOYW1lZFRlbnNvcnNNYXAsXG4gICAgIGNvbnRleHQ6IEV4ZWN1dGlvbkNvbnRleHQsIG9wcyA9IHRmT3BzKTogVGVuc29yW10gPT4ge1xuICAgICAgc3dpdGNoIChub2RlLm9wKSB7XG4gICAgICAgIGNhc2UgJ1Jlc2l6ZUJpbGluZWFyJzoge1xuICAgICAgICAgIGNvbnN0IGltYWdlcyA9XG4gICAgICAgICAgICAgIGdldFBhcmFtVmFsdWUoJ2ltYWdlcycsIG5vZGUsIHRlbnNvck1hcCwgY29udGV4dCkgYXMgVGVuc29yO1xuICAgICAgICAgIGNvbnN0IHNpemUgPVxuICAgICAgICAgICAgICBnZXRQYXJhbVZhbHVlKCdzaXplJywgbm9kZSwgdGVuc29yTWFwLCBjb250ZXh0KSBhcyBudW1iZXJbXTtcbiAgICAgICAgICBjb25zdCBhbGlnbkNvcm5lcnMgPVxuICAgICAgICAgICAgICBnZXRQYXJhbVZhbHVlKCdhbGlnbkNvcm5lcnMnLCBub2RlLCB0ZW5zb3JNYXAsIGNvbnRleHQpIGFzXG4gICAgICAgICAgICAgIGJvb2xlYW47XG4gICAgICAgICAgY29uc3QgaGFsZlBpeGVsQ2VudGVycyA9XG4gICAgICAgICAgICAgIGdldFBhcmFtVmFsdWUoJ2hhbGZQaXhlbENlbnRlcnMnLCBub2RlLCB0ZW5zb3JNYXAsIGNvbnRleHQpIGFzXG4gICAgICAgICAgICAgIGJvb2xlYW47XG4gICAgICAgICAgcmV0dXJuIFtvcHMuaW1hZ2UucmVzaXplQmlsaW5lYXIoXG4gICAgICAgICAgICAgIGltYWdlcyBhcyBUZW5zb3IzRCB8IFRlbnNvcjRELCBbc2l6ZVswXSwgc2l6ZVsxXV0sIGFsaWduQ29ybmVycyxcbiAgICAgICAgICAgICAgaGFsZlBpeGVsQ2VudGVycyldO1xuICAgICAgICB9XG4gICAgICAgIGNhc2UgJ1Jlc2l6ZU5lYXJlc3ROZWlnaGJvcic6IHtcbiAgICAgICAgICBjb25zdCBpbWFnZXMgPVxuICAgICAgICAgICAgICBnZXRQYXJhbVZhbHVlKCdpbWFnZXMnLCBub2RlLCB0ZW5zb3JNYXAsIGNvbnRleHQpIGFzIFRlbnNvcjtcbiAgICAgICAgICBjb25zdCBzaXplID1cbiAgICAgICAgICAgICAgZ2V0UGFyYW1WYWx1ZSgnc2l6ZScsIG5vZGUsIHRlbnNvck1hcCwgY29udGV4dCkgYXMgbnVtYmVyW107XG4gICAgICAgICAgY29uc3QgYWxpZ25Db3JuZXJzID1cbiAgICAgICAgICAgICAgZ2V0UGFyYW1WYWx1ZSgnYWxpZ25Db3JuZXJzJywgbm9kZSwgdGVuc29yTWFwLCBjb250ZXh0KSBhc1xuICAgICAgICAgICAgICBib29sZWFuO1xuICAgICAgICAgIGNvbnN0IGhhbGZQaXhlbENlbnRlcnMgPVxuICAgICAgICAgICAgICBnZXRQYXJhbVZhbHVlKCdoYWxmUGl4ZWxDZW50ZXJzJywgbm9kZSwgdGVuc29yTWFwLCBjb250ZXh0KSBhc1xuICAgICAgICAgICAgICBib29sZWFuO1xuICAgICAgICAgIHJldHVybiBbb3BzLmltYWdlLnJlc2l6ZU5lYXJlc3ROZWlnaGJvcihcbiAgICAgICAgICAgICAgaW1hZ2VzIGFzIFRlbnNvcjNEIHwgVGVuc29yNEQsIFtzaXplWzBdLCBzaXplWzFdXSwgYWxpZ25Db3JuZXJzLFxuICAgICAgICAgICAgICBoYWxmUGl4ZWxDZW50ZXJzKV07XG4gICAgICAgIH1cbiAgICAgICAgY2FzZSAnQ3JvcEFuZFJlc2l6ZSc6IHtcbiAgICAgICAgICBjb25zdCBpbWFnZSA9XG4gICAgICAgICAgICAgIGdldFBhcmFtVmFsdWUoJ2ltYWdlJywgbm9kZSwgdGVuc29yTWFwLCBjb250ZXh0KSBhcyBUZW5zb3I7XG4gICAgICAgICAgY29uc3QgYm94ZXMgPVxuICAgICAgICAgICAgICBnZXRQYXJhbVZhbHVlKCdib3hlcycsIG5vZGUsIHRlbnNvck1hcCwgY29udGV4dCkgYXMgVGVuc29yO1xuICAgICAgICAgIGNvbnN0IGJveEluZCA9XG4gICAgICAgICAgICAgIGdldFBhcmFtVmFsdWUoJ2JveEluZCcsIG5vZGUsIHRlbnNvck1hcCwgY29udGV4dCkgYXMgVGVuc29yO1xuICAgICAgICAgIGNvbnN0IGNyb3BTaXplID1cbiAgICAgICAgICAgICAgZ2V0UGFyYW1WYWx1ZSgnY3JvcFNpemUnLCBub2RlLCB0ZW5zb3JNYXAsIGNvbnRleHQpIGFzIG51bWJlcltdO1xuICAgICAgICAgIGNvbnN0IG1ldGhvZCA9XG4gICAgICAgICAgICAgIGdldFBhcmFtVmFsdWUoJ21ldGhvZCcsIG5vZGUsIHRlbnNvck1hcCwgY29udGV4dCkgYXMgc3RyaW5nO1xuICAgICAgICAgIGNvbnN0IGV4dHJhcG9sYXRpb25WYWx1ZSA9XG4gICAgICAgICAgICAgIGdldFBhcmFtVmFsdWUoJ2V4dHJhcG9sYXRpb25WYWx1ZScsIG5vZGUsIHRlbnNvck1hcCwgY29udGV4dCkgYXNcbiAgICAgICAgICAgICAgbnVtYmVyO1xuICAgICAgICAgIHJldHVybiBbb3BzLmltYWdlLmNyb3BBbmRSZXNpemUoXG4gICAgICAgICAgICAgIGltYWdlIGFzIFRlbnNvcjRELCBib3hlcyBhcyBUZW5zb3IyRCwgYm94SW5kIGFzIFRlbnNvcjFELFxuICAgICAgICAgICAgICBjcm9wU2l6ZSBhcyBbbnVtYmVyLCBudW1iZXJdLCBtZXRob2QgYXMgJ2JpbGluZWFyJyB8ICduZWFyZXN0JyxcbiAgICAgICAgICAgICAgZXh0cmFwb2xhdGlvblZhbHVlKV07XG4gICAgICAgIH1cbiAgICAgICAgY2FzZSAnSW1hZ2VQcm9qZWN0aXZlVHJhbnNmb3JtVjMnOiB7XG4gICAgICAgICAgY29uc3QgaW1hZ2VzID1cbiAgICAgICAgICAgICAgZ2V0UGFyYW1WYWx1ZSgnaW1hZ2VzJywgbm9kZSwgdGVuc29yTWFwLCBjb250ZXh0KSBhcyBUZW5zb3I7XG4gICAgICAgICAgY29uc3QgdHJhbnNmb3JtcyA9XG4gICAgICAgICAgICAgIGdldFBhcmFtVmFsdWUoJ3RyYW5zZm9ybXMnLCBub2RlLCB0ZW5zb3JNYXAsIGNvbnRleHQpIGFzIFRlbnNvcjtcbiAgICAgICAgICBjb25zdCBvdXRwdXRTaGFwZSA9XG4gICAgICAgICAgICAgIGdldFBhcmFtVmFsdWUoJ291dHB1dFNoYXBlJywgbm9kZSwgdGVuc29yTWFwLCBjb250ZXh0KSBhc1xuICAgICAgICAgICAgICBudW1iZXJbXTtcbiAgICAgICAgICBjb25zdCBmaWxsVmFsdWUgPVxuICAgICAgICAgICAgICBnZXRQYXJhbVZhbHVlKCdmaWxsVmFsdWUnLCBub2RlLCB0ZW5zb3JNYXAsIGNvbnRleHQpIGFzIG51bWJlcjtcbiAgICAgICAgICBjb25zdCBpbnRlcnBvbGF0aW9uID1cbiAgICAgICAgICAgICAgZ2V0UGFyYW1WYWx1ZSgnaW50ZXJwb2xhdGlvbicsIG5vZGUsIHRlbnNvck1hcCwgY29udGV4dCkgYXNcbiAgICAgICAgICAgICAgc3RyaW5nO1xuICAgICAgICAgIGNvbnN0IGZpbGxNb2RlID1cbiAgICAgICAgICAgICAgZ2V0UGFyYW1WYWx1ZSgnZmlsbE1vZGUnLCBub2RlLCB0ZW5zb3JNYXAsIGNvbnRleHQpIGFzIHN0cmluZztcbiAgICAgICAgICByZXR1cm4gW29wcy5pbWFnZS50cmFuc2Zvcm0oXG4gICAgICAgICAgICAgIGltYWdlcyBhcyBUZW5zb3I0RCxcbiAgICAgICAgICAgICAgdHJhbnNmb3JtcyBhcyBUZW5zb3IyRCxcbiAgICAgICAgICAgICAgaW50ZXJwb2xhdGlvbi50b0xvd2VyQ2FzZSgpIGFzICdiaWxpbmVhcicgfCAnbmVhcmVzdCcsXG4gICAgICAgICAgICAgIGZpbGxNb2RlLnRvTG93ZXJDYXNlKCkgYXMgJ2NvbnN0YW50JyB8ICdyZWZsZWN0JyB8ICd3cmFwJyB8ICduZWFyZXN0JyxcbiAgICAgICAgICAgICAgZmlsbFZhbHVlLFxuICAgICAgICAgICAgICBvdXRwdXRTaGFwZSBhcyBbbnVtYmVyLCBudW1iZXJdKV07XG4gICAgICAgIH1cbiAgICAgICAgZGVmYXVsdDpcbiAgICAgICAgICB0aHJvdyBUeXBlRXJyb3IoYE5vZGUgdHlwZSAke25vZGUub3B9IGlzIG5vdCBpbXBsZW1lbnRlZGApO1xuICAgICAgfVxuICAgIH07XG5cbmV4cG9ydCBjb25zdCBDQVRFR09SWSA9ICdpbWFnZSc7XG4iXX0=","/**\n * @license\n * Copyright 2018 Google LLC. All Rights Reserved.\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n * =============================================================================\n */\n// tslint:disable-next-line: no-imports-from-dist\nimport * as tfOps from '@tensorflow/tfjs-core/dist/ops/ops_for_converter';\nimport { cloneTensor, getParamValue, getTensor } from './utils';\nexport const executeOp = (node, tensorMap, context, ops = tfOps) => {\n switch (node.op) {\n case 'Const': {\n return tensorMap[node.name];\n }\n case 'PlaceholderWithDefault':\n const def = getParamValue('default', node, tensorMap, context);\n return [getTensor(node.name, tensorMap, context) || def];\n case 'Placeholder':\n return [getTensor(node.name, tensorMap, context)];\n case 'Identity':\n case 'StopGradient':\n case 'FakeQuantWithMinMaxVars': { // This op is currently ignored.\n const data = getParamValue('x', node, tensorMap, context);\n return [cloneTensor(data)];\n }\n case 'IdentityN':\n return getParamValue('x', node, tensorMap, context)\n .map((t) => cloneTensor(t));\n case 'Snapshot':\n const snapshot = getParamValue('x', node, tensorMap, context);\n return [cloneTensor(snapshot)];\n case 'Shape':\n return [ops.tensor1d(getParamValue('x', node, tensorMap, context).shape, 'int32')];\n case 'ShapeN':\n return getParamValue('x', node, tensorMap, context)\n .map((t) => ops.tensor1d(t.shape));\n case 'Size':\n return [ops.scalar(getParamValue('x', node, tensorMap, context).size, 'int32')];\n case 'Rank':\n return [ops.scalar(getParamValue('x', node, tensorMap, context).rank, 'int32')];\n case 'NoOp':\n return [ops.scalar(1)];\n case 'Print':\n const input = getParamValue('x', node, tensorMap, context);\n const data = getParamValue('data', node, tensorMap, context);\n const message = getParamValue('message', node, tensorMap, context);\n const summarize = getParamValue('summarize', node, tensorMap, context);\n console.warn('The graph has a tf.print() operation,' +\n 'usually used for debugging, which slows down performance.');\n console.log(message);\n for (let i = 0; i < data.length; i++) {\n console.log(Array.prototype.slice.call(data[i].dataSync())\n .slice(0, summarize));\n }\n return [input];\n default:\n throw TypeError(`Node type ${node.op} is not implemented`);\n }\n};\nexport const CATEGORY = 'graph';\n//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZ3JhcGhfZXhlY3V0b3IuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi8uLi8uLi90ZmpzLWNvbnZlcnRlci9zcmMvb3BlcmF0aW9ucy9leGVjdXRvcnMvZ3JhcGhfZXhlY3V0b3IudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUE7Ozs7Ozs7Ozs7Ozs7OztHQWVHO0FBR0gsaURBQWlEO0FBQ2pELE9BQU8sS0FBSyxLQUFLLE1BQU0sa0RBQWtELENBQUM7QUFNMUUsT0FBTyxFQUFDLFdBQVcsRUFBRSxhQUFhLEVBQUUsU0FBUyxFQUFDLE1BQU0sU0FBUyxDQUFDO0FBRTlELE1BQU0sQ0FBQyxNQUFNLFNBQVMsR0FDbEIsQ0FBQyxJQUFVLEVBQUUsU0FBMEIsRUFDdEMsT0FBeUIsRUFBRSxHQUFHLEdBQUcsS0FBSyxFQUFZLEVBQUU7SUFDbkQsUUFBUSxJQUFJLENBQUMsRUFBRSxFQUFFO1FBQ2YsS0FBSyxPQUFPLENBQUMsQ0FBQztZQUNaLE9BQU8sU0FBUyxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsQ0FBQztTQUM3QjtRQUNELEtBQUssd0JBQXdCO1lBQzNCLE1BQU0sR0FBRyxHQUNMLGFBQWEsQ0FBQyxTQUFTLEVBQUUsSUFBSSxFQUFFLFNBQVMsRUFBRSxPQUFPLENBQVcsQ0FBQztZQUNqRSxPQUFPLENBQUMsU0FBUyxDQUFDLElBQUksQ0FBQyxJQUFJLEVBQUUsU0FBUyxFQUFFLE9BQU8sQ0FBQyxJQUFJLEdBQUcsQ0FBQyxDQUFDO1FBQzNELEtBQUssYUFBYTtZQUNoQixPQUFPLENBQUMsU0FBUyxDQUFDLElBQUksQ0FBQyxJQUFJLEVBQUUsU0FBUyxFQUFFLE9BQU8sQ0FBQyxDQUFDLENBQUM7UUFDcEQsS0FBSyxVQUFVLENBQUM7UUFDaEIsS0FBSyxjQUFjLENBQUM7UUFDcEIsS0FBSyx5QkFBeUIsQ0FBQyxDQUFDLEVBQUcsZ0NBQWdDO1lBQ2pFLE1BQU0sSUFBSSxHQUFHLGFBQWEsQ0FBQyxHQUFHLEVB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LE1BQU0sQ0FBQyxNQUFNLFFBQVEsR0FBRyxPQUFPLENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyIvKipcbiAqIEBsaWNlbnNlXG4gKiBDb3B5cmlnaHQgMjAxOCBHb29nbGUgTExDLiBBbGwgUmlnaHRzIFJlc2VydmVkLlxuICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlIFwiTGljZW5zZVwiKTtcbiAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS5cbiAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdFxuICpcbiAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMFxuICpcbiAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmVcbiAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuIFwiQVMgSVNcIiBCQVNJUyxcbiAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLlxuICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZFxuICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuXG4gKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuICovXG5cbmltcG9ydCB7VGVuc29yfSBmcm9tICdAdGVuc29yZmxvdy90ZmpzLWNvcmUnO1xuLy8gdHNsaW50OmRpc2FibGUtbmV4dC1saW5lOiBuby1pbXBvcnRzLWZyb20tZGlzdFxuaW1wb3J0ICogYXMgdGZPcHMgZnJvbSAnQHRlbnNvcmZsb3cvdGZqcy1jb3JlL2Rpc3Qvb3BzL29wc19mb3JfY29udmVydGVyJztcblxuaW1wb3J0IHtOYW1lZFRlbnNvcnNNYXB9IGZyb20gJy4uLy4uL2RhdGEvdHlwZXMnO1xuaW1wb3J0IHtFeGVjdXRpb25Db250ZXh0fSBmcm9tICcuLi8uLi9leGVjdXRvci9leGVjdXRpb25fY29udGV4dCc7XG5pbXBvcnQge0ludGVybmFsT3BFeGVjdXRvciwgTm9kZX0gZnJvbSAnLi4vdHlwZXMnO1xuXG5pbXBvcnQge2Nsb25lVGVuc29yLCBnZXRQYXJhbVZhbHVlLCBnZXRUZW5zb3J9IGZyb20gJy4vdXRpbHMnO1xuXG5leHBvcnQgY29uc3QgZXhlY3V0ZU9wOiBJbnRlcm5hbE9wRXhlY3V0b3IgPVxuICAgIChub2RlOiBOb2RlLCB0ZW5zb3JNYXA6IE5hbWVkVGVuc29yc01hcCxcbiAgICAgY29udGV4dDogRXhlY3V0aW9uQ29udGV4dCwgb3BzID0gdGZPcHMpOiBUZW5zb3JbXSA9PiB7XG4gICAgICBzd2l0Y2ggKG5vZGUub3ApIHtcbiAgICAgICAgY2FzZSAnQ29uc3QnOiB7XG4gICAgICAgICAgcmV0dXJuIHRlbnNvck1hcFtub2RlLm5hbWVdO1xuICAgICAgICB9XG4gICAgICAgIGNhc2UgJ1BsYWNlaG9sZGVyV2l0aERlZmF1bHQnOlxuICAgICAgICAgIGNvbnN0IGRlZiA9XG4gICAgICAgICAgICAgIGdldFBhcmFtVmFsdWUoJ2RlZmF1bHQnLCBub2RlLCB0ZW5zb3JNYXAsIGNvbnRleHQpIGFzIFRlbnNvcjtcbiAgICAgICAgICByZXR1cm4gW2dldFRlbnNvcihub2RlLm5hbWUsIHRlbnNvck1hcCwgY29udGV4dCkgfHwgZGVmXTtcbiAgICAgICAgY2FzZSAnUGxhY2Vob2xkZXInOlxuICAgICAgICAgIHJldHVybiBbZ2V0VGVuc29yKG5vZGUubmFtZSwgdGVuc29yTWFwLCBjb250ZXh0KV07XG4gICAgICAgIGNhc2UgJ0lkZW50aXR5JzpcbiAgICAgICAgY2FzZSAnU3RvcEdyYWRpZW50JzpcbiAgICAgICAgY2FzZSAnRmFrZVF1YW50V2l0aE1pbk1heFZhcnMnOiB7ICAvLyBUaGlzIG9wIGlzIGN1cnJlbnRseSBpZ25vcmVkLlxuICAgICAgICAgIGNvbnN0IGRhdGEgPSBnZXRQYXJhbVZhbHVlKCd4Jywgbm9kZSwgdGVuc29yTWFwLCBjb250ZXh0KSBhcyBUZW5zb3I7XG4gICAgICAgICAgcmV0dXJuIFtjbG9uZVRlbnNvcihkYXRhKV07XG4gICAgICAgIH1cbiAgICAgICAgY2FzZSAnSWRlbnRpdHlOJzpcbiAgICAgICAgICByZXR1cm4gKGdldFBhcmFtVmFsdWUoJ3gnLCBub2RlLCB0ZW5zb3JNYXAsIGNvbnRleHQpIGFzIFRlbnNvcltdKVxuICAgICAgICAgICAgICAubWFwKCh0OiBUZW5zb3IpID0+IGNsb25lVGVuc29yKHQpKTtcbiAgICAgICAgY2FzZSAnU25hcHNob3QnOlxuICAgICAgICAgIGNvbnN0IHNuYXBzaG90ID1cbiAgICAgICAgICAgICAgKGdldFBhcmFtVmFsdWUoJ3gnLCBub2RlLCB0ZW5zb3JNYXAsIGNvbnRleHQpIGFzIFRlbnNvcik7XG4gICAgICAgICAgcmV0dXJuIFtjbG9uZVRlbnNvcihzbmFwc2hvdCldO1xuICAgICAgICBjYXNlICdTaGFwZSc6XG4gICAgICAgICAgcmV0dXJuIFtvcHMudGVuc29yMWQoXG4gICAgICAgICAgICAgIChnZXRQYXJhbVZhbHVlKCd4Jywgbm9kZSwgdGVuc29yTWFwLCBjb250ZXh0KSBhcyBUZW5zb3IpLnNoYXBlLFxuICAgICAgICAgICAgICAnaW50MzInKV07XG4gICAgICAgIGNhc2UgJ1NoYXBlTic6XG4gICAgICAgICAgcmV0dXJuIChnZXRQYXJhbVZhbHVlKCd4Jywgbm9kZSwgdGVuc29yTWFwLCBjb250ZXh0KSBhcyBUZW5zb3JbXSlcbiAgICAgICAgICAgICAgLm1hcCgodDogVGVuc29yKSA9PiBvcHMudGVuc29yMWQodC5zaGFwZSkpO1xuICAgICAgICBjYXNlICdTaXplJzpcbiAgICAgICAgICByZXR1cm4gW29wcy5zY2FsYXIoXG4gICAgICAgICAgICAgIChnZXRQYXJhbVZhbHVlKCd4Jywgbm9kZSwgdGVuc29yTWFwLCBjb250ZXh0KSBhcyBUZW5zb3IpLnNpemUsXG4gICAgICAgICAgICAgICdpbnQzMicpXTtcbiAgICAgICAgY2FzZSAnUmFuayc6XG4gICAgICAgICAgcmV0dXJuIFtvcHMuc2NhbGFyKFxuICAgICAgICAgICAgICAoZ2V0UGFyYW1WYWx1ZSgneCcsIG5vZGUsIHRlbnNvck1hcCwgY29udGV4dCkgYXMgVGVuc29yKS5yYW5rLFxuICAgICAgICAgICAgICAnaW50MzInKV07XG4gICAgICAgIGNhc2UgJ05vT3AnOlxuICAgICAgICAgIHJldHVybiBbb3BzLnNjYWxhcigxKV07XG4gICAgICAgIGNhc2UgJ1ByaW50JzpcbiAgICAgICAgICBjb25zdCBpbnB1dCA9IGdldFBhcmFtVmFsdWUoJ3gnLCBub2RlLCB0ZW5zb3JNYXAsIGNvbnRleHQpIGFzIFRlbnNvcjtcbiAgICAgICAgICBjb25zdCBkYXRhID1cbiAgICAgICAgICAgICAgZ2V0UGFyYW1WYWx1ZSgnZGF0YScsIG5vZGUsIHRlbnNvck1hcCwgY29udGV4dCkgYXMgVGVuc29yW107XG4gICAgICAgICAgY29uc3QgbWVzc2FnZSA9XG4gICAgICAgICAgICAgIGdldFBhcmFtVmFsdWUoJ21lc3NhZ2UnLCBub2RlLCB0ZW5zb3JNYXAsIGNvbnRleHQpIGFzIHN0cmluZztcbiAgICAgICAgICBjb25zdCBzdW1tYXJpemUgPVxuICAgICAgICAgICAgICBnZXRQYXJhbVZhbHVlKCdzdW1tYXJpemUnLCBub2RlLCB0ZW5zb3JNYXAsIGNvbnRleHQpIGFzIG51bWJlcjtcbiAgICAgICAgICBjb25zb2xlLndhcm4oXG4gICAgICAgICAgICAgICdUaGUgZ3JhcGggaGFzIGEgdGYucHJpbnQoKSBvcGVyYXRpb24sJyArXG4gICAgICAgICAgICAgICd1c3VhbGx5IHVzZWQgZm9yIGRlYnVnZ2luZywgd2hpY2ggc2xvd3MgZG93biBwZXJmb3JtYW5jZS4nKTtcbiAgICAgICAgICBjb25zb2xlLmxvZyhtZXNzYWdlKTtcbiAgICAgICAgICBmb3IgKGxldCBpID0gMDsgaSA8IGRhdGEubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgICAgIGNvbnNvbGUubG9nKEFycmF5LnByb3RvdHlwZS5zbGljZS5jYWxsKGRhdGFbaV0uZGF0YVN5bmMoKSlcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAuc2xpY2UoMCwgc3VtbWFyaXplKSk7XG4gICAgICAgICAgfVxuICAgICAgICAgIHJldHVybiBbaW5wdXRdO1xuXG4gICAgICAgIGRlZmF1bHQ6XG4gICAgICAgICAgdGhyb3cgVHlwZUVycm9yKGBOb2RlIHR5cGUgJHtub2RlLm9wfSBpcyBub3QgaW1wbGVtZW50ZWRgKTtcbiAgICAgIH1cbiAgICB9O1xuXG5leHBvcnQgY29uc3QgQ0FURUdPUlkgPSAnZ3JhcGgnO1xuIl19","/**\n * @license\n * Copyright 2018 Google LLC. All Rights Reserved.\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n * =============================================================================\n */\n// tslint:disable-next-line: no-imports-from-dist\nimport * as tfOps from '@tensorflow/tfjs-core/dist/ops/ops_for_converter';\nimport { getParamValue } from './utils';\nexport const executeOp = (node, tensorMap, context, ops = tfOps) => {\n switch (node.op) {\n case 'Equal': {\n return [ops.equal(getParamValue('a', node, tensorMap, context), getParamValue('b', node, tensorMap, context))];\n }\n case 'NotEqual': {\n return [ops.notEqual(getParamValue('a', node, tensorMap, context), getParamValue('b', node, tensorMap, context))];\n }\n case 'Greater': {\n return [ops.greater(getParamValue('a', node, tensorMap, context), getParamValue('b', node, tensorMap, context))];\n }\n case 'GreaterEqual': {\n return [ops.greaterEqual(getParamValue('a', node, tensorMap, context), getParamValue('b', node, tensorMap, context))];\n }\n case 'Less': {\n return [ops.less(getParamValue('a', node, tensorMap, context), getParamValue('b', node, tensorMap, context))];\n }\n case 'LessEqual': {\n return [ops.lessEqual(getParamValue('a', node, tensorMap, context), getParamValue('b', node, tensorMap, context))];\n }\n case 'LogicalAnd': {\n return [ops.logicalAnd(getParamValue('a', node, tensorMap, context), getParamValue('b', node, tensorMap, context))];\n }\n case 'LogicalNot': {\n return [ops.logicalNot(getParamValue('a', node, tensorMap, context))];\n }\n case 'LogicalOr': {\n return [ops.logicalOr(getParamValue('a', node, tensorMap, context), getParamValue('b', node, tensorMap, context))];\n }\n case 'Select':\n case 'SelectV2': {\n return [ops.where(getParamValue('condition', node, tensorMap, context), getParamValue('a', node, tensorMap, context), getParamValue('b', node, tensorMap, context))];\n }\n default:\n throw TypeError(`Node type ${node.op} is not implemented`);\n }\n};\nexport const CATEGORY = 'logical';\n//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibG9naWNhbF9leGVjdXRvci5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uLy4uLy4uL3RmanMtY29udmVydGVyL3NyYy9vcGVyYXRpb25zL2V4ZWN1dG9ycy9sb2dpY2FsX2V4ZWN1dG9yLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBOzs7Ozs7Ozs7Ozs7Ozs7R0FlRztBQUdILGlEQUFpRDtBQUNqRCxPQUFPLEtBQUssS0FBSyxNQUFNLGtEQUFrRCxDQUFDO0FBTTFFLE9BQU8sRUFBQyxhQUFhLEVBQUMsTUFBTSxTQUFTLENBQUM7QUFFdEMsTUFBTSxDQUFDLE1BQU0sU0FBUyxHQUNsQixDQUFDLElBQVUsRUFBRSxTQUEwQixFQUN0QyxPQUF5QixFQUFFLEdBQUcsR0FBRyxLQUFLLEVBQVksRUFBRTtJQUNuRCxRQUFRLElBQUksQ0FBQyxFQUFFLEVBQUU7UUFDZixLQUFLLE9BQU8sQ0FBQyxDQUFDO1lBQ1osT0FBTyxDQUFDLEdBQUcsQ0FBQyxLQUFLLENBQ2IsYUFBYSxDQUFDLEdBQUcsRUFBRSxJQUFJLEVBQUUsU0FBUyxFQUFFLE9BQU8sQ0FBVyxFQUN0RCxhQUFhLENBQUMsR0FBRyxFQUFFLElBQUksRUFBRSxTQUFTLEVBQUUsT0FBTyxDQUFXLENBQUMsQ0FBQyxDQUFDO1NBQzlEO1FBQ0QsS0FBSyxVQUFVLENBQUMsQ0FBQztZQUNmLE9BQU8sQ0FBQyxHQUFHLENBQUMsUUFBUSxDQUNoQixhQUFhLENBQUMsR0FBRyxFQUFFLElBQUksRUFBRSxTQUFTLEVBQUUsT0FBTyxDQUFXLEVBQ3RELGFBQWEsQ0FBQyxHQUFHLEVBQUUsSUFBSSxFQUFFLFNBQVMsRUFBRSxPQUFPLENBQVcsQ0FBQyxDQUFDLENBQUM7U0FDOUQ7UUFDRCxLQUFLLFNBQVMsQ0FBQyxDQUFDO1lBQ2QsT0FBTyxDQUFDLEdBQUcsQ0FBQyxPQUFPLENBQ2YsYUFBYSxDQUFDLEdBQUcsRUFBRSxJQUFJLEVBQUUsU0FBUyxFQUFFLE9BQU8sQ0FBVyxFQUN0RCxhQUFhLENBQUMsR0FBRyxFQUFFLElBQUksRUFBRSxTQUFTLEVBQUUsT0FBTyxDQUFXLENBQUMsQ0FBQyxDQUFDO1NBQzlEO1FBQ0QsS0FBSyxjQUFjLENBQUMsQ0FBQztZQUNuQixPQUFPLENBQUMsR0FBRyxDQUFDLFlBQVksQ0FDcEIsYUFBYSxDQUFDLEdBQUcsRUFBRSxJQUFJLEVBQUUsU0FBUyxFQUFFLE9BQU8sQ0FBVyxFQUN0RCxhQUFhLENBQUMsR0FBRyxFQUFFLElBQUksRUFBRSxTQUFTLEVBQUUsT0FBTyxDQUFXLENBQUMsQ0FBQyxDQUFDO1NBQzlEO1FBQ0QsS0FBSyxNQUFNLENBQUMsQ0FBQztZQUNYLE9BQU8sQ0FBQyxHQUFHLENBQUMsSUFBSSxDQUNaLGFBQWEsQ0FBQyxHQUFHLEVBQUUsSUFBSSxFQUFFLFNBQVMsRUFBRSxPQUFPLENBQVcsRUFDdEQsYUFBYSxDQUFDLEdBQUcsRUFBRSxJQUFJLEVBQUUsU0FBUyxFQUFFLE9BQU8sQ0FBVyxDQUFDLENBQUMsQ0FBQztTQUM5RDtRQUNELEtBQUssV0FBVyxDQUFDLENBQUM7WUFDaEIsT0FBTyxDQUFDLEdBQUcsQ0FBQyxTQUFTLENBQ2pCLGFBQWEsQ0FBQyxHQUFHLEVBQUUsSUFBSSxFQUFFLFNBQVMsRUFBRSxPQUFPLENBQVcsRUFDdEQsYUFBYSxDQUFDLEdBQUcsRUFBRSxJQUFJLEVBQUUsU0FBUyxFQUFFLE9BQU8sQ0FBVyxDQUFDLENBQUMsQ0FBQztTQUM5RDtRQUNELEtBQUssWUFBWSxDQUFDLENBQUM7WUFDakIsT0FBTyxDQUFDLEdBQUcsQ0FBQyxVQUFVLENBQ2xCLGFBQWEsQ0FBQyxHQUFHLEVBQUUsSUFBSSxFQUFFLFNBQVMsRUFBRSxPQUFPLENBQVcsRUFDdEQsYUFBYSxDQUFDLEdBQUcsRUFBRSxJQUFJLEVBQUUsU0FBUyxFQUFFLE9BQU8sQ0FBVyxDQUFDLENBQUMsQ0FBQztTQUM5RDtRQUNELEtBQUssWUFBWSxDQUFDLENBQUM7WUFDakIsT0FBTyxDQUFDLEdBQUcsQ0FBQyxVQUFVLENBQ2xCLGFBQWEsQ0FBQyxHQUFHLEVBQUUsSUFBSSxFQUFFLFNBQVMsRUFBRSxPQUFPLENBQVcsQ0FBQyxDQUFDLENBQUM7U0FDOUQ7UUFDRCxLQUFLLFdBQVcsQ0FBQyxDQUFDO1lBQ2hCLE9BQU8sQ0FBQyxHQUFHLENBQUMsU0FBUyxDQUNqQixhQUFhLENBQUMsR0FBRyxFQUFFLElBQUksRUFBRSxTQUFTLEVBQUUsT0FBTyxDQUFXLEVBQ3RELGFBQWEsQ0FBQyxHQUFHLEVBQUUsSUFBSSxFQUFFLFNBQVMsRUFBRSxPQUFPLENBQVcsQ0FBQyxDQUFDLENBQUM7U0FDOUQ7UUFDRCxLQUFLLFFBQVEsQ0FBQztRQUNkLEtBQUssVUFBVSxDQUFDLENBQUM7WUFDZixPQUFPLENBQUMsR0FBRyxDQUFDLEtBQUssQ0FDYixhQUFhLENBQUMsV0FBVyxFQUFFLElBQUksRUFBRSxTQUFTLEVBQUUsT0FBTyxDQUFXLEVBQzlELGFBQWEsQ0FBQyxHQUFHLEVBQUUsSUFBSSxFQUFFLFNBQVMsRUFBRSxPQUFPLENBQVcsRUFDdEQsYUFBYSxDQUFDLEdBQUcsRUFBRSxJQUFJLEVBQUUsU0FBUyxFQUFFLE9BQU8sQ0FBVyxDQUFDLENBQUMsQ0FBQztTQUM5RDtRQUNEO1lBQ0UsTUFBTSxTQUFTLENBQUMsYUFBYSxJQUFJLENBQUMsRUFBRSxxQkFBcUIsQ0FBQyxDQUFDO0tBQzlEO0FBQ0gsQ0FBQyxDQUFDO0FBRU4sTUFBTSxDQUFDLE1BQU0sUUFBUSxHQUFHLFNBQVMsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbIi8qKlxuICogQGxpY2Vuc2VcbiAqIENvcHlyaWdodCAyMDE4IEdvb2dsZSBMTEMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuXG4gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgXCJMaWNlbnNlXCIpO1xuICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLlxuICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0XG4gKlxuICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wXG4gKlxuICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZVxuICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gXCJBUyBJU1wiIEJBU0lTLFxuICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuXG4gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kXG4gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS5cbiAqID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4gKi9cblxuaW1wb3J0IHtUZW5zb3J9IGZyb20gJ0B0ZW5zb3JmbG93L3RmanMtY29yZSc7XG4vLyB0c2xpbnQ6ZGlzYWJsZS1uZXh0LWxpbmU6IG5vLWltcG9ydHMtZnJvbS1kaXN0XG5pbXBvcnQgKiBhcyB0Zk9wcyBmcm9tICdAdGVuc29yZmxvdy90ZmpzLWNvcmUvZGlzdC9vcHMvb3BzX2Zvcl9jb252ZXJ0ZXInO1xuXG5pbXBvcnQge05hbWVkVGVuc29yc01hcH0gZnJvbSAnLi4vLi4vZGF0YS90eXBlcyc7XG5pbXBvcnQge0V4ZWN1dGlvbkNvbnRleHR9IGZyb20gJy4uLy4uL2V4ZWN1dG9yL2V4ZWN1dGlvbl9jb250ZXh0JztcbmltcG9ydCB7SW50ZXJuYWxPcEV4ZWN1dG9yLCBOb2RlfSBmcm9tICcuLi90eXBlcyc7XG5cbmltcG9ydCB7Z2V0UGFyYW1WYWx1ZX0gZnJvbSAnLi91dGlscyc7XG5cbmV4cG9ydCBjb25zdCBleGVjdXRlT3A6IEludGVybmFsT3BFeGVjdXRvciA9XG4gICAgKG5vZGU6IE5vZGUsIHRlbnNvck1hcDogTmFtZWRUZW5zb3JzTWFwLFxuICAgICBjb250ZXh0OiBFeGVjdXRpb25Db250ZXh0LCBvcHMgPSB0Zk9wcyk6IFRlbnNvcltdID0+IHtcbiAgICAgIHN3aXRjaCAobm9kZS5vcCkge1xuICAgICAgICBjYXNlICdFcXVhbCc6IHtcbiAgICAgICAgICByZXR1cm4gW29wcy5lcXVhbChcbiAgICAgICAgICAgICAgZ2V0UGFyYW1WYWx1ZSgnYScsIG5vZGUsIHRlbnNvck1hcCwgY29udGV4dCkgYXMgVGVuc29yLFxuICAgICAgICAgICAgICBnZXRQYXJhbVZhbHVlKCdiJywgbm9kZSwgdGVuc29yTWFwLCBjb250ZXh0KSBhcyBUZW5zb3IpXTtcbiAgICAgICAgfVxuICAgICAgICBjYXNlICdOb3RFcXVhbCc6IHtcbiAgICAgICAgICByZXR1cm4gW29wcy5ub3RFcXVhbChcbiAgICAgICAgICAgICAgZ2V0UGFyYW1WYWx1ZSgnYScsIG5vZGUsIHRlbnNvck1hcCwgY29udGV4dCkgYXMgVGVuc29yLFxuICAgICAgICAgICAgICBnZXRQYXJhbVZhbHVlKCdiJywgbm9kZSwgdGVuc29yTWFwLCBjb250ZXh0KSBhcyBUZW5zb3IpXTtcbiAgICAgICAgfVxuICAgICAgICBjYXNlICdHcmVhdGVyJzoge1xuICAgICAgICAgIHJldHVybiBbb3BzLmdyZWF0ZXIoXG4gICAgICAgICAgICAgIGdldFBhcmFtVmFsdWUoJ2EnLCBub2RlLCB0ZW5zb3JNYXAsIGNvbnRleHQpIGFzIFRlbnNvcixcbiAgICAgICAgICAgICAgZ2V0UGFyYW1WYWx1ZSgnYicsIG5vZGUsIHRlbnNvck1hcCwgY29udGV4dCkgYXMgVGVuc29yKV07XG4gICAgICAgIH1cbiAgICAgICAgY2FzZSAnR3JlYXRlckVxdWFsJzoge1xuICAgICAgICAgIHJldHVybiBbb3BzLmdyZWF0ZXJFcXVhbChcbiAgICAgICAgICAgICAgZ2V0UGFyYW1WYWx1ZSgnYScsIG5vZGUsIHRlbnNvck1hcCwgY29udGV4dCkgYXMgVGVuc29yLFxuICAgICAgICAgICAgICBnZXRQYXJhbVZhbHVlKCdiJywgbm9kZSwgdGVuc29yTWFwLCBjb250ZXh0KSBhcyBUZW5zb3IpXTtcbiAgICAgICAgfVxuICAgICAgICBjYXNlICdMZXNzJzoge1xuICAgICAgICAgIHJldHVybiBbb3BzLmxlc3MoXG4gICAgICAgICAgICAgIGdldFBhcmFtVmFsdWUoJ2EnLCBub2RlLCB0ZW5zb3JNYXAsIGNvbnRleHQpIGFzIFRlbnNvcixcbiAgICAgICAgICAgICAgZ2V0UGFyYW1WYWx1ZSgnYicsIG5vZGUsIHRlbnNvck1hcCwgY29udGV4dCkgYXMgVGVuc29yKV07XG4gICAgICAgIH1cbiAgICAgICAgY2FzZSAnTGVzc0VxdWFsJzoge1xuICAgICAgICAgIHJldHVybiBbb3BzLmxlc3NFcXVhbChcbiAgICAgICAgICAgICAgZ2V0UGFyYW1WYWx1ZSgnYScsIG5vZGUsIHRlbnNvck1hcCwgY29udGV4dCkgYXMgVGVuc29yLFxuICAgICAgICAgICAgICBnZXRQYXJhbVZhbHVlKCdiJywgbm9kZSwgdGVuc29yTWFwLCBjb250ZXh0KSBhcyBUZW5zb3IpXTtcbiAgICAgICAgfVxuICAgICAgICBjYXNlICdMb2dpY2FsQW5kJzoge1xuICAgICAgICAgIHJldHVybiBbb3BzLmxvZ2ljYWxBbmQoXG4gICAgICAgICAgICAgIGdldFBhcmFtVmFsdWUoJ2EnLCBub2RlLCB0ZW5zb3JNYXAsIGNvbnRleHQpIGFzIFRlbnNvcixcbiAgICAgICAgICAgICAgZ2V0UGFyYW1WYWx1ZSgnYicsIG5vZGUsIHRlbnNvck1hcCwgY29udGV4dCkgYXMgVGVuc29yKV07XG4gICAgICAgIH1cbiAgICAgICAgY2FzZSAnTG9naWNhbE5vdCc6IHtcbiAgICAgICAgICByZXR1cm4gW29wcy5sb2dpY2FsTm90KFxuICAgICAgICAgICAgICBnZXRQYXJhbVZhbHVlKCdhJywgbm9kZSwgdGVuc29yTWFwLCBjb250ZXh0KSBhcyBUZW5zb3IpXTtcbiAgICAgICAgfVxuICAgICAgICBjYXNlICdMb2dpY2FsT3InOiB7XG4gICAgICAgICAgcmV0dXJuIFtvcHMubG9naWNhbE9yKFxuICAgICAgICAgICAgICBnZXRQYXJhbVZhbHVlKCdhJywgbm9kZSwgdGVuc29yTWFwLCBjb250ZXh0KSBhcyBUZW5zb3IsXG4gICAgICAgICAgICAgIGdldFBhcmFtVmFsdWUoJ2InLCBub2RlLCB0ZW5zb3JNYXAsIGNvbnRleHQpIGFzIFRlbnNvcildO1xuICAgICAgICB9XG4gICAgICAgIGNhc2UgJ1NlbGVjdCc6XG4gICAgICAgIGNhc2UgJ1NlbGVjdFYyJzoge1xuICAgICAgICAgIHJldHVybiBbb3BzLndoZXJlKFxuICAgICAgICAgICAgICBnZXRQYXJhbVZhbHVlKCdjb25kaXRpb24nLCBub2RlLCB0ZW5zb3JNYXAsIGNvbnRleHQpIGFzIFRlbnNvcixcbiAgICAgICAgICAgICAgZ2V0UGFyYW1WYWx1ZSgnYScsIG5vZGUsIHRlbnNvck1hcCwgY29udGV4dCkgYXMgVGVuc29yLFxuICAgICAgICAgICAgICBnZXRQYXJhbVZhbHVlKCdiJywgbm9kZSwgdGVuc29yTWFwLCBjb250ZXh0KSBhcyBUZW5zb3IpXTtcbiAgICAgICAgfVxuICAgICAgICBkZWZhdWx0OlxuICAgICAgICAgIHRocm93IFR5cGVFcnJvcihgTm9kZSB0eXBlICR7bm9kZS5vcH0gaXMgbm90IGltcGxlbWVudGVkYCk7XG4gICAgICB9XG4gICAgfTtcblxuZXhwb3J0IGNvbnN0IENBVEVHT1JZID0gJ2xvZ2ljYWwnO1xuIl19","/**\n * @license\n * Copyright 2018 Google LLC. All Rights Reserved.\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n * =============================================================================\n */\n// tslint:disable-next-line: no-imports-from-dist\nimport * as tfOps from '@tensorflow/tfjs-core/dist/ops/ops_for_converter';\nimport { getParamValue } from './utils';\nexport const executeOp = (node, tensorMap, context, ops = tfOps) => {\n switch (node.op) {\n case 'BatchMatMul':\n case 'BatchMatMulV2':\n case 'MatMul':\n return [ops.matMul(getParamValue('a', node, tensorMap, context), getParamValue('b', node, tensorMap, context), getParamValue('transposeA', node, tensorMap, context), getParamValue('transposeB', node, tensorMap, context))];\n case 'Einsum':\n return [ops.einsum(getParamValue('equation', node, tensorMap, context), ...getParamValue('tensors', node, tensorMap, context))];\n case 'Transpose':\n return [ops.transpose(getParamValue('x', node, tensorMap, context), getParamValue('perm', node, tensorMap, context))];\n case '_FusedMatMul':\n const [extraOp, activationFunc] = getParamValue('fusedOps', node, tensorMap, context);\n const isBiasAdd = extraOp === 'biasadd';\n const isPrelu = activationFunc === 'prelu';\n const numArgs = getParamValue('numArgs', node, tensorMap, context);\n const leakyreluAlpha = getParamValue('leakyreluAlpha', node, tensorMap, context);\n if (isBiasAdd) {\n if (isPrelu && numArgs !== 2) {\n throw new Error('Fused MatMul with BiasAdd and Prelu must have two ' +\n 'extra arguments: bias and alpha.');\n }\n if (!isPrelu && numArgs !== 1) {\n throw new Error('Fused MatMul with BiasAdd must have one extra argument: bias.');\n }\n }\n const [biasArg, preluArg] = getParamValue('args', node, tensorMap, context);\n return [ops.fused.matMul({\n a: getParamValue('a', node, tensorMap, context),\n b: getParamValue('b', node, tensorMap, context),\n transposeA: getParamValue('transposeA', node, tensorMap, context),\n transposeB: getParamValue('transposeB', node, tensorMap, context),\n bias: biasArg,\n activation: activationFunc,\n preluActivationWeights: preluArg,\n leakyreluAlpha\n })];\n default:\n throw TypeError(`Node type ${node.op} is not implemented`);\n }\n};\nexport const CATEGORY = 'matrices';\n//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibWF0cmljZXNfZXhlY3V0b3IuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi8uLi8uLi90ZmpzLWNvbnZlcnRlci9zcmMvb3BlcmF0aW9ucy9leGVjdXRvcnMvbWF0cmljZXNfZXhlY3V0b3IudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUE7Ozs7Ozs7Ozs7Ozs7OztHQWVHO0FBR0gsaURBQWlEO0FBQ2pELE9BQU8sS0FBSyxLQUFLLE1BQU0sa0RBQWtELENBQUM7QUFNMUUsT0FBTyxFQUFDLGFBQWEsRUFBQyxNQUFNLFNBQVMsQ0FBQztBQUV0QyxNQUFNLENBQUMsTUFBTSxTQUFTLEdBQ2xCLENBQUMsSUFBVSxFQUFFLFNBQTBCLEVBQ3RDLE9BQXlCLEVBQUUsR0FBRyxHQUFHLEtBQUssRUFBWSxFQUFFO0lBQ25ELFFBQVEsSUFBSSxDQUFDLEVBQUUsRUFBRTtRQUNmLEtBQUssYUFBYSxDQUFDO1FBQ25CLEtBQUssZUFBZSxDQUFDO1FBQ3JCLEtBQUssUUFBUTtZQUNYLE9BQU8sQ0FBQyxHQUFHLENBQUMsTUFBTSxDQUNkLGFBQWEsQ0FBQyxHQUFHLEVBQUUsSUFBSSxFQUFFLFNBQVMsRUFBRSxPQUFPLENBQWEsRUFDeEQsYUFBYSxDQUFDLEdBQUcsRUFBRSxJQUFJLEVBQUUsU0FBUyxFQUFFLE9BQU8sQ0FBYSxFQUN4RCxhQUFhLENBQUMsWUFBWSxFQUFFLElBQUksRUFBRSxTQUFTLEVBQUUsT0FBTyxDQUFZLEVBQ2hFLGFBQWEsQ0FBQyxZQUFZLEVBQUUsSUFBSSxFQUFFLFNBQVMsRUFBRSxPQUFPLENBQ3pDLENBQUMsQ0FBQyxDQUFDO1FBRXBCLEtBQUssUUFBUTtZQUNYLE9BQU8sQ0FBQyxHQUFHLENBQUMsTUFBTSxDQUNkLGFBQWEsQ0FBQyxVQUFVLEVBQUUsSUFBSSxFQUFFLFNBQVMsRUFBRSxPQUFPLENBQVcsRUFDN0QsR0FBRyxhQUFhLENBQUMsU0FBUyxFQUFFLElBQUksRUFBRSxTQUFTLEVBQUUsT0FBTyxDQUN4QyxDQUFDLENBQUMsQ0FBQztRQUVyQixLQUFLLFdBQVc7WUFDZCxPQUFPLENBQUMsR0FBRyxDQUFDLFNBQVMsQ0FDakIsYUFBYSxDQUFDLEdBQUcsRUFBRSxJQUFJLEVBQUUsU0FBUyxFQUFFLE9BQU8sQ0FBVyxFQUN0RCxhQUFhLENBQUMsTUFBTSxFQUFFLElBQUksRUFBRSxTQUFTLEVBQUUsT0FBTyxDQUFhLENBQUMsQ0FBQyxDQUFDO1FBRXBFLEtBQUssY0FBYztZQUNqQixNQUFNLENBQUMsT0FBTyxFQUFFLGNBQWMsQ0FBQyxHQUMxQixhQUFhLENBQUMsVUFBVSxFQUFFLElBQUksRUFBRSxTQUFTLEVBQUUsT0FBTyxDQUFjLENBQUM7WUFFdEUsTUFBTSxTQUFTLEdBQUcsT0FBTyxLQUFLLFNBQVMsQ0FBQztZQUN4QyxNQUFNLE9BQU8sR0FBRyxjQUFjLEtBQUssT0FBTyxDQUFDO1lBRTNDLE1BQU0sT0FBTyxHQUNSLGFBQWEsQ0FBQyxTQUFTLEVBQUUsSUFBSSxFQUFFLFNBQVMsRUFBRSxPQUFPLENBQVksQ0FBQztZQUNuRSxNQUFNLGNBQWMsR0FDaEIsYUFBYSxDQUFDLGdCQUFnQixFQUFFLElBQUksRUFBRSxTQUFTLEVBQUUsT0FBTyxDQUNsRCxDQUFDO1lBRVgsSUFBSSxTQUFTLEVBQUU7Z0JBQ2IsSUFBSSxPQUFPLElBQUksT0FBTyxLQUFLLENBQUMsRUFBRTtvQkFDNUIsTUFBTSxJQUFJLEtBQUssQ0FDWCxvREFBb0Q7d0JBQ3BELGtDQUFrQyxDQUFDLENBQUM7aUJBQ3pDO2dCQUNELElBQUksQ0FBQyxPQUFPLElBQUksT0FBTyxLQUFLLENBQUMsRUFBRTtvQkFDN0IsTUFBTSxJQUFJLEtBQUssQ0FDWCwrREFBK0QsQ0FBQyxDQUFDO2lCQUN0RTthQUNGO1lBQ0QsTUFBTSxDQUFDLE9BQU8sRUFBRSxRQUFRLENBQUMsR0FDckIsYUFBYSxDQUFDLE1BQU0sRUFBRSxJQUFJLEVBQUUsU0FBUyxFQUFFLE9BQU8sQ0FBYSxDQUFDO1lBQ2hFLE9BQU8sQ0FBQyxHQUFHLENBQUMsS0FBSyxDQUFDLE1BQU0sQ0FBQztvQkFDdkIsQ0FBQyxFQUFFLGFBQWEsQ0FBQyxHQUFHLEVBQUUsSUFBSSxFQUFFLFNBQVMsRUFBRSxPQUFPLENBQWE7b0JBQzNELENBQUMsRUFBRSxhQUFhLENBQUMsR0FBRyxFQUFFLElBQUksRUFBRSxTQUFTLEVBQUUsT0FBTyxDQUFhO29CQUMzRCxVQUFVLEVBQUUsYUFBYSxDQUFDLFlBQVksRUFBRSxJQUFJLEVBQUUsU0FBUyxFQUFFLE9BQU8sQ0FDckQ7b0JBQ1gsVUFBVSxFQUFFLGFBQWEsQ0FBQyxZQUFZLEVBQUUsSUFBSSxFQUFFLFNBQVMsRUFBRSxPQUFPLENBQ3JEO29CQUNYLElBQUksRUFBRSxPQUFPO29CQUNiLFVBQVUsRUFBRSxjQUF3QztvQkFDcEQsc0JBQXNCLEVBQUUsUUFBUTtvQkFDaEMsY0FBYztpQkFDZixDQUFDLENBQUMsQ0FBQztRQUVOO1lBQ0UsTUFBTSxTQUFTLENBQUMsYUFBYSxJQUFJLENBQUMsRUFBRSxxQkFBcUIsQ0FBQyxDQUFDO0tBQzlEO0FBQ0gsQ0FBQyxDQUFDO0FBRU4sTUFBTSxDQUFDLE1BQU0sUUFBUSxHQUFHLFVBQVUsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbIi8qKlxuICogQGxpY2Vuc2VcbiAqIENvcHlyaWdodCAyMDE4IEdvb2dsZSBMTEMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuXG4gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgXCJMaWNlbnNlXCIpO1xuICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLlxuICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0XG4gKlxuICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wXG4gKlxuICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZVxuICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gXCJBUyBJU1wiIEJBU0lTLFxuICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuXG4gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kXG4gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS5cbiAqID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4gKi9cblxuaW1wb3J0IHtUZW5zb3IsIFRlbnNvcjJEfSBmcm9tICdAdGVuc29yZmxvdy90ZmpzLWNvcmUnO1xuLy8gdHNsaW50OmRpc2FibGUtbmV4dC1saW5lOiBuby1pbXBvcnRzLWZyb20tZGlzdFxuaW1wb3J0ICogYXMgdGZPcHMgZnJvbSAnQHRlbnNvcmZsb3cvdGZqcy1jb3JlL2Rpc3Qvb3BzL29wc19mb3JfY29udmVydGVyJztcblxuaW1wb3J0IHtOYW1lZFRlbnNvcnNNYXB9IGZyb20gJy4uLy4uL2RhdGEvdHlwZXMnO1xuaW1wb3J0IHtFeGVjdXRpb25Db250ZXh0fSBmcm9tICcuLi8uLi9leGVjdXRvci9leGVjdXRpb25fY29udGV4dCc7XG5pbXBvcnQge0ludGVybmFsT3BFeGVjdXRvciwgTm9kZX0gZnJvbSAnLi4vdHlwZXMnO1xuXG5pbXBvcnQge2dldFBhcmFtVmFsdWV9IGZyb20gJy4vdXRpbHMnO1xuXG5leHBvcnQgY29uc3QgZXhlY3V0ZU9wOiBJbnRlcm5hbE9wRXhlY3V0b3IgPVxuICAgIChub2RlOiBOb2RlLCB0ZW5zb3JNYXA6IE5hbWVkVGVuc29yc01hcCxcbiAgICAgY29udGV4dDogRXhlY3V0aW9uQ29udGV4dCwgb3BzID0gdGZPcHMpOiBUZW5zb3JbXSA9PiB7XG4gICAgICBzd2l0Y2ggKG5vZGUub3ApIHtcbiAgICAgICAgY2FzZSAnQmF0Y2hNYXRNdWwnOlxuICAgICAgICBjYXNlICdCYXRjaE1hdE11bFYyJzpcbiAgICAgICAgY2FzZSAnTWF0TXVsJzpcbiAgICAgICAgICByZXR1cm4gW29wcy5tYXRNdWwoXG4gICAgICAgICAgICAgIGdldFBhcmFtVmFsdWUoJ2EnLCBub2RlLCB0ZW5zb3JNYXAsIGNvbnRleHQpIGFzIFRlbnNvcjJELFxuICAgICAgICAgICAgICBnZXRQYXJhbVZhbHVlKCdiJywgbm9kZSwgdGVuc29yTWFwLCBjb250ZXh0KSBhcyBUZW5zb3IyRCxcbiAgICAgICAgICAgICAgZ2V0UGFyYW1WYWx1ZSgndHJhbnNwb3NlQScsIG5vZGUsIHRlbnNvck1hcCwgY29udGV4dCkgYXMgYm9vbGVhbixcbiAgICAgICAgICAgICAgZ2V0UGFyYW1WYWx1ZSgndHJhbnNwb3NlQicsIG5vZGUsIHRlbnNvck1hcCwgY29udGV4dCkgYXNcbiAgICAgICAgICAgICAgICAgIGJvb2xlYW4pXTtcblxuICAgICAgICBjYXNlICdFaW5zdW0nOlxuICAgICAgICAgIHJldHVybiBbb3BzLmVpbnN1bShcbiAgICAgICAgICAgICAgZ2V0UGFyYW1WYWx1ZSgnZXF1YXRpb24nLCBub2RlLCB0ZW5zb3JNYXAsIGNvbnRleHQpIGFzIHN0cmluZyxcbiAgICAgICAgICAgICAgLi4uZ2V0UGFyYW1WYWx1ZSgndGVuc29ycycsIG5vZGUsIHRlbnNvck1hcCwgY29udGV4dCkgYXNcbiAgICAgICAgICAgICAgICAgIFRlbnNvcltdKV07XG5cbiAgICAgICAgY2FzZSAnVHJhbnNwb3NlJzpcbiAgICAgICAgICByZXR1cm4gW29wcy50cmFuc3Bvc2UoXG4gICAgICAgICAgICAgIGdldFBhcmFtVmFsdWUoJ3gnLCBub2RlLCB0ZW5zb3JNYXAsIGNvbnRleHQpIGFzIFRlbnNvcixcbiAgICAgICAgICAgICAgZ2V0UGFyYW1WYWx1ZSgncGVybScsIG5vZGUsIHRlbnNvck1hcCwgY29udGV4dCkgYXMgbnVtYmVyW10pXTtcblxuICAgICAgICBjYXNlICdfRnVzZWRNYXRNdWwnOlxuICAgICAgICAgIGNvbnN0IFtleHRyYU9wLCBhY3RpdmF0aW9uRnVuY10gPVxuICAgICAgICAgICAgICAoZ2V0UGFyYW1WYWx1ZSgnZnVzZWRPcHMnLCBub2RlLCB0ZW5zb3JNYXAsIGNvbnRleHQpIGFzIHN0cmluZ1tdKTtcblxuICAgICAgICAgIGNvbnN0IGlzQmlhc0FkZCA9IGV4dHJhT3AgPT09ICdiaWFzYWRkJztcbiAgICAgICAgICBjb25zdCBpc1ByZWx1ID0gYWN0aXZhdGlvbkZ1bmMgPT09ICdwcmVsdSc7XG5cbiAgICAgICAgICBjb25zdCBudW1BcmdzID1cbiAgICAgICAgICAgICAgKGdldFBhcmFtVmFsdWUoJ251bUFyZ3MnLCBub2RlLCB0ZW5zb3JNYXAsIGNvbnRleHQpIGFzIG51bWJlcik7XG4gICAgICAgICAgY29uc3QgbGVha3lyZWx1QWxwaGEgPVxuICAgICAgICAgICAgICBnZXRQYXJhbVZhbHVlKCdsZWFreXJlbHVBbHBoYScsIG5vZGUsIHRlbnNvck1hcCwgY29udGV4dCkgYXNcbiAgICAgICAgICAgICAgbnVtYmVyO1xuXG4gICAgICAgICAgaWYgKGlzQmlhc0FkZCkge1xuICAgICAgICAgICAgaWYgKGlzUHJlbHUgJiYgbnVtQXJncyAhPT0gMikge1xuICAgICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoXG4gICAgICAgICAgICAgICAgICAnRnVzZWQgTWF0TXVsIHdpdGggQmlhc0FkZCBhbmQgUHJlbHUgbXVzdCBoYXZlIHR3byAnICtcbiAgICAgICAgICAgICAgICAgICdleHRyYSBhcmd1bWVudHM6IGJpYXMgYW5kIGFscGhhLicpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgaWYgKCFpc1ByZWx1ICYmIG51bUFyZ3MgIT09IDEpIHtcbiAgICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKFxuICAgICAgICAgICAgICAgICAgJ0Z1c2VkIE1hdE11bCB3aXRoIEJpYXNBZGQgbXVzdCBoYXZlIG9uZSBleHRyYSBhcmd1bWVudDogYmlhcy4nKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9XG4gICAgICAgICAgY29uc3QgW2JpYXNBcmcsIHByZWx1QXJnXSA9XG4gICAgICAgICAgICAgIGdldFBhcmFtVmFsdWUoJ2FyZ3MnLCBub2RlLCB0ZW5zb3JNYXAsIGNvbnRleHQpIGFzIFRlbnNvcltdO1xuICAgICAgICAgIHJldHVybiBbb3BzLmZ1c2VkLm1hdE11bCh7XG4gICAgICAgICAgICBhOiBnZXRQYXJhbVZhbHVlKCdhJywgbm9kZSwgdGVuc29yTWFwLCBjb250ZXh0KSBhcyBUZW5zb3IyRCxcbiAgICAgICAgICAgIGI6IGdldFBhcmFtVmFsdWUoJ2InLCBub2RlLCB0ZW5zb3JNYXAsIGNvbnRleHQpIGFzIFRlbnNvcjJELFxuICAgICAgICAgICAgdHJhbnNwb3NlQTogZ2V0UGFyYW1WYWx1ZSgndHJhbnNwb3NlQScsIG5vZGUsIHRlbnNvck1hcCwgY29udGV4dCkgYXNcbiAgICAgICAgICAgICAgICBib29sZWFuLFxuICAgICAgICAgICAgdHJhbnNwb3NlQjogZ2V0UGFyYW1WYWx1ZSgndHJhbnNwb3NlQicsIG5vZGUsIHRlbnNvck1hcCwgY29udGV4dCkgYXNcbiAgICAgICAgICAgICAgICBib29sZWFuLFxuICAgICAgICAgICAgYmlhczogYmlhc0FyZyxcbiAgICAgICAgICAgIGFjdGl2YXRpb246IGFjdGl2YXRpb25GdW5jIGFzIHRmT3BzLmZ1c2VkLkFjdGl2YXRpb24sXG4gICAgICAgICAgICBwcmVsdUFjdGl2YXRpb25XZWlnaHRzOiBwcmVsdUFyZyxcbiAgICAgICAgICAgIGxlYWt5cmVsdUFscGhhXG4gICAgICAgICAgfSldO1xuXG4gICAgICAgIGRlZmF1bHQ6XG4gICAgICAgICAgdGhyb3cgVHlwZUVycm9yKGBOb2RlIHR5cGUgJHtub2RlLm9wfSBpcyBub3QgaW1wbGVtZW50ZWRgKTtcbiAgICAgIH1cbiAgICB9O1xuXG5leHBvcnQgY29uc3QgQ0FURUdPUlkgPSAnbWF0cmljZXMnO1xuIl19","/**\n * @license\n * Copyright 2018 Google LLC. All Rights Reserved.\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n * =============================================================================\n */\n// tslint:disable-next-line: no-imports-from-dist\nimport * as tfOps from '@tensorflow/tfjs-core/dist/ops/ops_for_converter';\nimport { getParamValue } from './utils';\nexport const executeOp = (node, tensorMap, context, ops = tfOps) => {\n switch (node.op) {\n case 'EuclideanNorm':\n return [ops.euclideanNorm(getParamValue('x', node, tensorMap, context), getParamValue('axis', node, tensorMap, context), getParamValue('keepDims', node, tensorMap, context))];\n case 'FusedBatchNorm':\n case 'FusedBatchNormV2': {\n return [ops.batchNorm(getParamValue('x', node, tensorMap, context), getParamValue('mean', node, tensorMap, context), getParamValue('variance', node, tensorMap, context), getParamValue('offset', node, tensorMap, context), getParamValue('scale', node, tensorMap, context), getParamValue('epsilon', node, tensorMap, context))];\n }\n case 'FusedBatchNormV3': {\n return [ops.batchNorm(getParamValue('x', node, tensorMap, context), getParamValue('mean', node, tensorMap, context), getParamValue('variance', node, tensorMap, context), getParamValue('offset', node, tensorMap, context), getParamValue('scale', node, tensorMap, context), getParamValue('epsilon', node, tensorMap, context))];\n }\n case 'LRN': {\n return [ops.localResponseNormalization(getParamValue('x', node, tensorMap, context), getParamValue('radius', node, tensorMap, context), getParamValue('bias', node, tensorMap, context), getParamValue('alpha', node, tensorMap, context), getParamValue('beta', node, tensorMap, context))];\n }\n case 'Softmax': {\n return [ops.softmax(getParamValue('x', node, tensorMap, context))];\n }\n case 'LogSoftmax': {\n return [ops.logSoftmax(getParamValue('x', node, tensorMap, context))];\n }\n case 'SparseToDense': {\n return [ops.sparseToDense(getParamValue('sparseIndices', node, tensorMap, context), getParamValue('outputShape', node, tensorMap, context), getParamValue('sparseValues', node, tensorMap, context), getParamValue('defaultValue', node, tensorMap, context))];\n }\n default:\n throw TypeError(`Node type ${node.op} is not implemented`);\n }\n};\nexport const CATEGORY = 'normalization';\n//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibm9ybWFsaXphdGlvbl9leGVjdXRvci5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uLy4uLy4uL3RmanMtY29udmVydGVyL3NyYy9vcGVyYXRpb25zL2V4ZWN1dG9ycy9ub3JtYWxpemF0aW9uX2V4ZWN1dG9yLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBOzs7Ozs7Ozs7Ozs7Ozs7R0FlRztBQUdILGlEQUFpRDtBQUNqRCxPQUFPLEtBQUssS0FBSyxNQUFNLGtEQUFrRCxDQUFDO0FBTTFFLE9BQU8sRUFBQyxhQUFhLEVBQUMsTUFBTSxTQUFTLENBQUM7QUFFdEMsTUFBTSxDQUFDLE1BQU0sU0FBUyxHQUNsQixDQUFDLElBQVUsRUFBRSxTQUEwQixFQUN0QyxPQUF5QixFQUFFLEdBQUcsR0FBRyxLQUFLLEVBQVksRUFBRTtJQUNuRCxRQUFRLElBQUksQ0FBQyxFQUFFLEVBQUU7UUFDZixLQUFLLGVBQWU7WUFDbEIsT0FBTyxDQUFDLEdBQUcsQ0FBQyxhQUFhLENBQ3JCLGFBQWEsQ0FBQyxHQUFHLEVBQUUsSUFBSSxFQUFFLFNBQVMsRUFBRSxPQUFPLENBQVcsRUFDdEQsYUFBYSxDQUFDLE1BQU0sRUFBRSxJQUFJLEVBQUUsU0FBUyxFQUFFLE9BQU8sQ0FBYSxFQUMzRCxhQUFhLENBQUMsVUFBVSxFQUFFLElBQUksRUFBRSxTQUFTLEVBQUUsT0FBTyxDQUFZLENBQUMsQ0FBQyxDQUFDO1FBQ3ZFLEtBQUssZ0JBQWdCLENBQUM7UUFDdEIsS0FBSyxrQkFBa0IsQ0FBQyxDQUFDO1lBQ3ZCLE9BQU8sQ0FBQyxHQUFHLENBQUMsU0FBUyxDQUNqQixhQUFhLENBQUMsR0FBRyxFQUFFLElBQUksRUFBRSxTQUFTLEVBQUUsT0FBTyxDQUFXLEVBQ3RELGFBQWEsQ0FBQyxNQUFNLEVBQUUsSUFBSSxFQUFFLFNBQVMsRUFBRSxPQUFPLENBQVcsRUFDekQsYUFBYSxDQUFDLFVBQVUsRUFBRSxJQUFJLEVBQUUsU0FBUyxFQUFFLE9BQU8sQ0FBVyxFQUM3RCxhQUFhLENBQUMsUUFBUSxFQUFFLElBQUksRUFBRSxTQUFTLEVBQUUsT0FBTyxDQUFXLEVBQzNELGFBQWEsQ0FBQyxPQUFPLEVBQUUsSUFBSSxFQUFFLFNBQVMsRUFBRSxPQUFPLENBQVcsRUFDMUQsYUFBYSxDQUFDLFNBQVMsRUFBRSxJQUFJLEVBQUUsU0FBUyxFQUFFLE9BQU8sQ0FBVyxDQUFDLENBQUMsQ0FBQztTQUNwRTtRQUNELEtBQUssa0JBQWtCLENBQUMsQ0FBQztZQUN2QixPQUFPLENBQUMsR0FBRyxDQUFDLFNBQVMsQ0FDakIsYUFBYSxDQUFDLEdBQUcsRUFBRSxJQUFJLEVBQUUsU0FBUyxFQUFFLE9BQU8sQ0FBVyxFQUN0RCxhQUFhLENBQUMsTUFBTSxFQUFFLElBQUksRUFBRSxTQUFTLEVBQUUsT0FBTyxDQUFXLEVBQ3pELGFBQWEsQ0FBQyxVQUFVLEVBQUUsSUFBSSxFQUFFLFNBQVMsRUFBRSxPQUFPLENBQVcsRUFDN0QsYUFBYSxDQUFDLFFBQVEsRUFBRSxJQUFJLEVBQUUsU0FBUyxFQUFFLE9BQU8sQ0FBVyxFQUMzRCxhQUFhLENBQUMsT0FBTyxFQUFFLElBQUksRUFBRSxTQUFTLEVBQUUsT0FBTyxDQUFXLEVBQzFELGFBQWEsQ0FBQyxTQUFTLEVBQUUsSUFBSSxFQUFFLFNBQVMsRUFBRSxPQUFPLENBQVcsQ0FBQyxDQUFDLENBQUM7U0FDcEU7UUFDRCxLQUFLLEtBQUssQ0FBQyxDQUFDO1lBQ1YsT0FBTyxDQUFDLEdBQUcsQ0FBQywwQkFBMEIsQ0FDbEMsYUFBYSxDQUFDLEdBQUcsRUFBRSxJQUFJLEVBQUUsU0FBUyxFQUFFLE9BQU8sQ0FDL0IsRUFDWixhQUFhLENBQUMsUUFBUSxFQUFFLElBQUksRUFBRSxTQUFTLEVBQUUsT0FBTyxDQUFXLEVBQzNELGFBQWEsQ0FBQyxNQUFNLEVBQUUsSUFBSSxFQUFFLFNBQVMsRUFBRSxPQUFPLENBQVcsRUFDekQsYUFBYSxDQUFDLE9BQU8sRUFBRSxJQUFJLEVBQUUsU0FBUyxFQUFFLE9BQU8sQ0FBVyxFQUMxRCxhQUFhLENBQUMsTUFBTSxFQUFFLElBQUksRUFBRSxTQUFTLEVBQUUsT0FBTyxDQUFXLENBQUMsQ0FBQyxDQUFDO1NBQ2pFO1FBQ0QsS0FBSyxTQUFTLENBQUMsQ0FBQztZQUNkLE9BQU8sQ0FBQyxHQUFHLENBQUMsT0FBTyxDQUNmLGFBQWEsQ0FBQyxHQUFHLEVBQUUsSUFBSSxFQUFFLFNBQVMsRUFBRSxPQUFPLENBQVcsQ0FBQyxDQUFDLENBQUM7U0FDOUQ7UUFDRCxLQUFLLFlBQVksQ0FBQyxDQUFDO1lBQ2pCLE9BQU8sQ0FBQyxHQUFHLENBQUMsVUFBVSxDQUNsQixhQUFhLENBQUMsR0FBRyxFQUFFLElBQUksRUFBRSxTQUFTLEVBQUUsT0FBTyxDQUFXLENBQUMsQ0FBQyxDQUFDO1NBQzlEO1FBQ0QsS0FBSyxlQUFlLENBQUMsQ0FBQztZQUNwQixPQUFPLENBQUMsR0FBRyxDQUFDLGFBQWEsQ0FDckIsYUFBYSxDQUFDLGVBQWUsRUFBRSxJQUFJLEVBQUUsU0FBUyxFQUFFLE9BQU8sQ0FDN0MsRUFDVixhQUFhLENBQUMsYUFBYSxFQUFFLElBQUksRUFBRSxTQUFTLEVBQUUsT0FBTyxDQUFXLEVBQ2hFLGFBQWEsQ0FBQyxjQUFjLEVBQUUsSUFBSSxFQUFFLFNBQVMsRUFBRSxPQUFPLENBQzFDLEVBQ1osYUFBYSxDQUFDLGNBQWMsRUFBRSxJQUFJLEVBQUUsU0FBUyxFQUFFLE9BQU8sQ0FDNUMsQ0FBQyxDQUFDLENBQUM7U0FDbEI7UUFDRDtZQUNFLE1BQU0sU0FBUyxDQUFDLGFBQWEsSUFBSSxDQUFDLEVBQUUscUJBQXFCLENBQUMsQ0FBQztLQUM5RDtBQUNILENBQUMsQ0FBQztBQUVOLE1BQU0sQ0FBQyxNQUFNLFFBQVEsR0FBRyxlQUFlLENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyIvKipcbiAqIEBsaWNlbnNlXG4gKiBDb3B5cmlnaHQgMjAxOCBHb29nbGUgTExDLiBBbGwgUmlnaHRzIFJlc2VydmVkLlxuICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlIFwiTGljZW5zZVwiKTtcbiAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS5cbiAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdFxuICpcbiAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMFxuICpcbiAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmVcbiAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuIFwiQVMgSVNcIiBCQVNJUyxcbiAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLlxuICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZFxuICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuXG4gKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuICovXG5cbmltcG9ydCB7U2NhbGFyLCBUZW5zb3IsIFRlbnNvcjNELCBUZW5zb3I0RH0gZnJvbSAnQHRlbnNvcmZsb3cvdGZqcy1jb3JlJztcbi8vIHRzbGludDpkaXNhYmxlLW5leHQtbGluZTogbm8taW1wb3J0cy1mcm9tLWRpc3RcbmltcG9ydCAqIGFzIHRmT3BzIGZyb20gJ0B0ZW5zb3JmbG93L3RmanMtY29yZS9kaXN0L29wcy9vcHNfZm9yX2NvbnZlcnRlcic7XG5cbmltcG9ydCB7TmFtZWRUZW5zb3JzTWFwfSBmcm9tICcuLi8uLi9kYXRhL3R5cGVzJztcbmltcG9ydCB7RXhlY3V0aW9uQ29udGV4dH0gZnJvbSAnLi4vLi4vZXhlY3V0b3IvZXhlY3V0aW9uX2NvbnRleHQnO1xuaW1wb3J0IHtJbnRlcm5hbE9wRXhlY3V0b3IsIE5vZGV9IGZyb20gJy4uL3R5cGVzJztcblxuaW1wb3J0IHtnZXRQYXJhbVZhbHVlfSBmcm9tICcuL3V0aWxzJztcblxuZXhwb3J0IGNvbnN0IGV4ZWN1dGVPcDogSW50ZXJuYWxPcEV4ZWN1dG9yID1cbiAgICAobm9kZTogTm9kZSwgdGVuc29yTWFwOiBOYW1lZFRlbnNvcnNNYXAsXG4gICAgIGNvbnRleHQ6IEV4ZWN1dGlvbkNvbnRleHQsIG9wcyA9IHRmT3BzKTogVGVuc29yW10gPT4ge1xuICAgICAgc3dpdGNoIChub2RlLm9wKSB7XG4gICAgICAgIGNhc2UgJ0V1Y2xpZGVhbk5vcm0nOlxuICAgICAgICAgIHJldHVybiBbb3BzLmV1Y2xpZGVhbk5vcm0oXG4gICAgICAgICAgICAgIGdldFBhcmFtVmFsdWUoJ3gnLCBub2RlLCB0ZW5zb3JNYXAsIGNvbnRleHQpIGFzIFRlbnNvcixcbiAgICAgICAgICAgICAgZ2V0UGFyYW1WYWx1ZSgnYXhpcycsIG5vZGUsIHRlbnNvck1hcCwgY29udGV4dCkgYXMgbnVtYmVyW10sXG4gICAgICAgICAgICAgIGdldFBhcmFtVmFsdWUoJ2tlZXBEaW1zJywgbm9kZSwgdGVuc29yTWFwLCBjb250ZXh0KSBhcyBib29sZWFuKV07XG4gICAgICAgIGNhc2UgJ0Z1c2VkQmF0Y2hOb3JtJzpcbiAgICAgICAgY2FzZSAnRnVzZWRCYXRjaE5vcm1WMic6IHtcbiAgICAgICAgICByZXR1cm4gW29wcy5iYXRjaE5vcm0oXG4gICAgICAgICAgICAgIGdldFBhcmFtVmFsdWUoJ3gnLCBub2RlLCB0ZW5zb3JNYXAsIGNvbnRleHQpIGFzIFRlbnNvcixcbiAgICAgICAgICAgICAgZ2V0UGFyYW1WYWx1ZSgnbWVhbicsIG5vZGUsIHRlbnNvck1hcCwgY29udGV4dCkgYXMgVGVuc29yLFxuICAgICAgICAgICAgICBnZXRQYXJhbVZhbHVlKCd2YXJpYW5jZScsIG5vZGUsIHRlbnNvck1hcCwgY29udGV4dCkgYXMgVGVuc29yLFxuICAgICAgICAgICAgICBnZXRQYXJhbVZhbHVlKCdvZmZzZXQnLCBub2RlLCB0ZW5zb3JNYXAsIGNvbnRleHQpIGFzIFRlbnNvcixcbiAgICAgICAgICAgICAgZ2V0UGFyYW1WYWx1ZSgnc2NhbGUnLCBub2RlLCB0ZW5zb3JNYXAsIGNvbnRleHQpIGFzIFRlbnNvcixcbiAgICAgICAgICAgICAgZ2V0UGFyYW1WYWx1ZSgnZXBzaWxvbicsIG5vZGUsIHRlbnNvck1hcCwgY29udGV4dCkgYXMgbnVtYmVyKV07XG4gICAgICAgIH1cbiAgICAgICAgY2FzZSAnRnVzZWRCYXRjaE5vcm1WMyc6IHtcbiAgICAgICAgICByZXR1cm4gW29wcy5iYXRjaE5vcm0oXG4gICAgICAgICAgICAgIGdldFBhcmFtVmFsdWUoJ3gnLCBub2RlLCB0ZW5zb3JNYXAsIGNvbnRleHQpIGFzIFRlbnNvcixcbiAgICAgICAgICAgICAgZ2V0UGFyYW1WYWx1ZSgnbWVhbicsIG5vZGUsIHRlbnNvck1hcCwgY29udGV4dCkgYXMgVGVuc29yLFxuICAgICAgICAgICAgICBnZXRQYXJhbVZhbHVlKCd2YXJpYW5jZScsIG5vZGUsIHRlbnNvck1hcCwgY29udGV4dCkgYXMgVGVuc29yLFxuICAgICAgICAgICAgICBnZXRQYXJhbVZhbHVlKCdvZmZzZXQnLCBub2RlLCB0ZW5zb3JNYXAsIGNvbnRleHQpIGFzIFRlbnNvcixcbiAgICAgICAgICAgICAgZ2V0UGFyYW1WYWx1ZSgnc2NhbGUnLCBub2RlLCB0ZW5zb3JNYXAsIGNvbnRleHQpIGFzIFRlbnNvcixcbiAgICAgICAgICAgICAgZ2V0UGFyYW1WYWx1ZSgnZXBzaWxvbicsIG5vZGUsIHRlbnNvck1hcCwgY29udGV4dCkgYXMgbnVtYmVyKV07XG4gICAgICAgIH1cbiAgICAgICAgY2FzZSAnTFJOJzoge1xuICAgICAgICAgIHJldHVybiBbb3BzLmxvY2FsUmVzcG9uc2VOb3JtYWxpemF0aW9uKFxuICAgICAgICAgICAgICBnZXRQYXJhbVZhbHVlKCd4Jywgbm9kZSwgdGVuc29yTWFwLCBjb250ZXh0KSBhcyBUZW5zb3IzRCB8XG4gICAgICAgICAgICAgICAgICBUZW5zb3I0RCxcbiAgICAgICAgICAgICAgZ2V0UGFyYW1WYWx1ZSgncmFkaXVzJywgbm9kZSwgdGVuc29yTWFwLCBjb250ZXh0KSBhcyBudW1iZXIsXG4gICAgICAgICAgICAgIGdldFBhcmFtVmFsdWUoJ2JpYXMnLCBub2RlLCB0ZW5zb3JNYXAsIGNvbnRleHQpIGFzIG51bWJlcixcbiAgICAgICAgICAgICAgZ2V0UGFyYW1WYWx1ZSgnYWxwaGEnLCBub2RlLCB0ZW5zb3JNYXAsIGNvbnRleHQpIGFzIG51bWJlcixcbiAgICAgICAgICAgICAgZ2V0UGFyYW1WYWx1ZSgnYmV0YScsIG5vZGUsIHRlbnNvck1hcCwgY29udGV4dCkgYXMgbnVtYmVyKV07XG4gICAgICAgIH1cbiAgICAgICAgY2FzZSAnU29mdG1heCc6IHtcbiAgICAgICAgICByZXR1cm4gW29wcy5zb2Z0bWF4KFxuICAgICAgICAgICAgICBnZXRQYXJhbVZhbHVlKCd4Jywgbm9kZSwgdGVuc29yTWFwLCBjb250ZXh0KSBhcyBUZW5zb3IpXTtcbiAgICAgICAgfVxuICAgICAgICBjYXNlICdMb2dTb2Z0bWF4Jzoge1xuICAgICAgICAgIHJldHVybiBbb3BzLmxvZ1NvZnRtYXgoXG4gICAgICAgICAgICAgIGdldFBhcmFtVmFsdWUoJ3gnLCBub2RlLCB0ZW5zb3JNYXAsIGNvbnRleHQpIGFzIFRlbnNvcildO1xuICAgICAgICB9XG4gICAgICAgIGNhc2UgJ1NwYXJzZVRvRGVuc2UnOiB7XG4gICAgICAgICAgcmV0dXJuIFtvcHMuc3BhcnNlVG9EZW5zZShcbiAgICAgICAgICAgICAgZ2V0UGFyYW1WYWx1ZSgnc3BhcnNlSW5kaWNlcycsIG5vZGUsIHRlbnNvck1hcCwgY29udGV4dCkgYXNcbiAgICAgICAgICAgICAgICAgIFRlbnNvcixcbiAgICAgICAgICAgICAgZ2V0UGFyYW1WYWx1ZSgnb3V0cHV0U2hhcGUnLCBub2RlLCB0ZW5zb3JNYXAsIGNvbnRleHQpIGFzIFRlbnNvcixcbiAgICAgICAgICAgICAgZ2V0UGFyYW1WYWx1ZSgnc3BhcnNlVmFsdWVzJywgbm9kZSwgdGVuc29yTWFwLCBjb250ZXh0KSBhc1xuICAgICAgICAgICAgICAgICAgbnVtYmVyW10sXG4gICAgICAgICAgICAgIGdldFBhcmFtVmFsdWUoJ2RlZmF1bHRWYWx1ZScsIG5vZGUsIHRlbnNvck1hcCwgY29udGV4dCkgYXNcbiAgICAgICAgICAgICAgICAgIFNjYWxhcildO1xuICAgICAgICB9XG4gICAgICAgIGRlZmF1bHQ6XG4gICAgICAgICAgdGhyb3cgVHlwZUVycm9yKGBOb2RlIHR5cGUgJHtub2RlLm9wfSBpcyBub3QgaW1wbGVtZW50ZWRgKTtcbiAgICAgIH1cbiAgICB9O1xuXG5leHBvcnQgY29uc3QgQ0FURUdPUlkgPSAnbm9ybWFsaXphdGlvbic7XG4iXX0=","/**\n * @license\n * Copyright 2018 Google LLC. All Rights Reserved.\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n * =============================================================================\n */\n// tslint:disable-next-line: no-imports-from-dist\nimport * as tfOps from '@tensorflow/tfjs-core/dist/ops/ops_for_converter';\nimport { getParamValue } from './utils';\nexport const executeOp = (node, tensorMap, context, ops = tfOps) => {\n switch (node.op) {\n case 'Max': {\n const axis = getParamValue('axis', node, tensorMap, context);\n const keepDims = getParamValue('keepDims', node, tensorMap, context);\n return [ops.max(getParamValue('x', node, tensorMap, context), axis, keepDims)];\n }\n case 'Mean': {\n const axis = getParamValue('axis', node, tensorMap, context);\n const keepDims = getParamValue('keepDims', node, tensorMap, context);\n return [ops.mean(getParamValue('x', node, tensorMap, context), axis, keepDims)];\n }\n case 'Min': {\n const axis = getParamValue('axis', node, tensorMap, context);\n const keepDims = getParamValue('keepDims', node, tensorMap, context);\n return [ops.min(getParamValue('x', node, tensorMap, context), axis, keepDims)];\n }\n case 'Sum': {\n const axis = getParamValue('axis', node, tensorMap, context);\n const keepDims = getParamValue('keepDims', node, tensorMap, context);\n return [ops.sum(getParamValue('x', node, tensorMap, context), axis, keepDims)];\n }\n case 'All': {\n const axis = getParamValue('axis', node, tensorMap, context);\n const keepDims = getParamValue('keepDims', node, tensorMap, context);\n return [ops.all(getParamValue('x', node, tensorMap, context), axis, keepDims)];\n }\n case 'Any': {\n const axis = getParamValue('axis', node, tensorMap, context);\n const keepDims = getParamValue('keepDims', node, tensorMap, context);\n return [ops.any(getParamValue('x', node, tensorMap, context), axis, keepDims)];\n }\n case 'ArgMax': {\n const axis = getParamValue('axis', node, tensorMap, context);\n return [ops.argMax(getParamValue('x', node, tensorMap, context), axis)];\n }\n case 'ArgMin': {\n const axis = getParamValue('axis', node, tensorMap, context);\n return [ops.argMin(getParamValue('x', node, tensorMap, context), axis)];\n }\n case 'Prod': {\n const axis = getParamValue('axis', node, tensorMap, context);\n const keepDims = getParamValue('keepDims', node, tensorMap, context);\n return [ops.prod(getParamValue('x', node, tensorMap, context), axis, keepDims)];\n }\n case 'Cumprod': {\n const axis = getParamValue('axis', node, tensorMap, context);\n const exclusive = getParamValue('exclusive', node, tensorMap, context);\n const reverse = getParamValue('reverse', node, tensorMap, context);\n return [ops.cumprod(getParamValue('x', node, tensorMap, context), axis, exclusive, reverse)];\n }\n case 'Cumsum': {\n const axis = getParamValue('axis', node, tensorMap, context);\n const exclusive = getParamValue('exclusive', node, tensorMap, context);\n const reverse = getParamValue('reverse', node, tensorMap, context);\n return [ops.cumsum(getParamValue('x', node, tensorMap, context), axis, exclusive, reverse)];\n }\n case 'Bincount':\n const x = getParamValue('x', node, tensorMap, context);\n const weights = getParamValue('weights', node, tensorMap, context);\n const size = getParamValue('size', node, tensorMap, context);\n return [ops.bincount(x, weights, size)];\n case 'DenseBincount': {\n const x = getParamValue('x', node, tensorMap, context);\n const weights = getParamValue('weights', node, tensorMap, context);\n const size = getParamValue('size', node, tensorMap, context);\n const binaryOutput = getParamValue('binaryOutput', node, tensorMap, context);\n return [ops.denseBincount(x, weights, size, binaryOutput)];\n }\n default:\n throw TypeError(`Node type ${node.op} is not implemented`);\n }\n};\nexport const CATEGORY = 'reduction';\n//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicmVkdWN0aW9uX2V4ZWN1dG9yLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vLi4vLi4vdGZqcy1jb252ZXJ0ZXIvc3JjL29wZXJhdGlvbnMvZXhlY3V0b3JzL3JlZHVjdGlvbl9leGVjdXRvci50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQTs7Ozs7Ozs7Ozs7Ozs7O0dBZUc7QUFHSCxpREFBaUQ7QUFDakQsT0FBTyxLQUFLLEtBQUssTUFBTSxrREFBa0QsQ0FBQztBQU0xRSxPQUFPLEVBQUMsYUFBYSxFQUFDLE1BQU0sU0FBUyxDQUFDO0FBRXRDLE1BQU0sQ0FBQyxNQUFNLFNBQVMsR0FDbEIsQ0FBQyxJQUFVLEVBQUUsU0FBMEIsRUFDdEMsT0FBeUIsRUFBRSxHQUFHLEdBQUcsS0FBSyxFQUFZLEVBQUU7SUFDbkQsUUFBUSxJQUFJLENBQUMsRUFBRSxFQUFFO1FBQ2YsS0FBSyxLQUFLLENBQUMsQ0FBQztZQUNWLE1BQU0sSUFBSSxHQUNOLGFBQWEsQ0FBQyxNQUFNLEVBQUUsSUFBSSxFQUFFLFNBQVMsRUFBRSxPQUFPLENBQWEsQ0FBQztZQUNoRSxNQUFNLFFBQVEsR0FDVixhQUFhLENBQUMsVUFBVSxFQUFFLElBQUksRUFBRSxTQUFTLEVBQUUsT0FBTyxDQUFZLENBQUM7WUFDbkUsT0FBTyxDQUFDLEdBQUcsQ0FBQyxHQUFHLENBQ1gsYUFBYSxDQUFDLEdBQUcsRUFBRSxJQUFJLEVBQUUsU0FBUyxFQUFFLE9BQU8sQ0FBVyxFQUFFLElBQUksRUFDNUQsUUFBUSxDQUFDLENBQUMsQ0FBQztTQUNoQjtRQUNELEtBQUssTUFBTSxDQUFDLENBQUM7WUFDWCxNQUFNLElBQUksR0FDTixhQUFhLENBQUMsTUFBTSxFQUFFLElBQUksRUFBRSxTQUFTLEVBQUUsT0FBTyxDQUFhLENBQUM7WUFDaEUsTUFBTSxRQUFRLEdBQ1YsYUFBYSxDQUFDLFVBQVUsRUFBRSxJQUFJLEVBQUUsU0FBUyxFQUFFLE9BQU8sQ0FBWSxDQUFDO1lBQ25FLE9BQU8sQ0FBQyxHQUFHLENBQUMsSUFBSSxDQUNaLGFBQWEsQ0FBQyxHQUFHLEVBQUUsSUFBSSxFQUFFLFNBQVMsRUFBRSxPQUFPLENBQVcsRUFBRSxJQUFJLEVBQzVELFFBQVEsQ0FBQyxDQUFDLENBQUM7U0FDaEI7UUFDRCxLQUFLLEtBQUssQ0FBQyxDQUFDO1lBQ1YsTUFBTSxJQUFJLEdBQ04sYUFBYSxDQUFDLE1BQU0sRUFBRSxJQUFJLEVBQUUsU0FBUyxFQUFFLE9BQU8sQ0FBYSxDQUFDO1lBQ2hFLE1BQU0sUUFBUSxHQUNWLGFBQWEsQ0FBQyxVQUFVLEVBQUUsSUFBSSxFQUFFLFNBQVMsRUFBRSxPQUFPLENBQVksQ0FBQztZQUNuRSxPQUFPLENBQUMsR0FBRyxDQUFDLEdBQUcsQ0FDWCxhQUFhLENBQUMsR0FBRyxFQUFFLElBQUksRUFBRSxTQUFTLEVBQUUsT0FBTyxDQUFXLEVBQUUsSUFBSSxFQUM1RCxRQUFRLENBQUMsQ0FBQyxDQUFDO1NBQ2hCO1FBQ0QsS0FBSyxLQUFLLENBQUMsQ0FBQztZQUNWLE1BQU0sSUFBSSxHQUNOLGFBQWEsQ0FBQyxNQUFNLEVBQUUsSUFBSSxFQUFFLFNBQVMsRUFBRSxPQUFPLENBQWEsQ0FBQztZQUNoRSxNQUFNLFFBQVEsR0FDVixhQUFhLENBQUMsVUFBVSxFQUFFLElBQUksRUFBRSxTQUFTLEVBQUUsT0FBTyxDQUFZLENBQUM7WUFDbkUsT0FBTyxDQUFDLEdBQUcsQ0FBQyxHQUFHLENBQ1gsYUFBYSxDQUFDLEdBQUcsRUFBRSxJQUFJLEVBQUUsU0FBUyxFQUFFLE9BQU8sQ0FBVyxFQUFFLElBQUksRUFDNUQsUUFBUSxDQUFDLENBQUMsQ0FBQztTQUNoQjtRQUNELEtBQUssS0FBSyxDQUFDLENBQUM7WUFDVixNQUFNLElBQUksR0FDTixhQUFhLENBQUMsTUFBTSxFQUFFLElBQUksRUFBRSxTQUFTLEVBQUUsT0FBTyxDQUFhLENBQUM7WUFDaEUsTUFBTSxRQUFRLEdBQ1YsYUFBYSxDQUFDLFVBQVUsRUFBRSxJQUFJLEVBQUUsU0FBUyxFQUFFLE9BQU8sQ0FBWSxDQUFDO1lBQ25FLE9BQU8sQ0FBQyxHQUFHLENBQUMsR0FBRyxDQUNYLGFBQWEsQ0FBQyxHQUFHLEVBQUUsSUFBSSxFQUFFLFNBQVMsRUFBRSxPQUFPLENBQVcsRUFBRSxJQUFJLEVBQzVELFFBQVEsQ0FBQyxDQUFDLENBQUM7U0FDaEI7UUFDRCxLQUFLLEtBQUssQ0FBQyxDQUFDO1lBQ1YsTUFBTSxJQUFJLEdBQ04sYUFBYSxDQUFDLE1BQU0sRUFBRSxJQUFJLEVBQUUsU0FBUyxFQUFFLE9BQU8sQ0FBYSxDQUFDO1lBQ2hFLE1BQU0sUUFBUSxHQUNWLGFBQWEsQ0FBQyxVQUFVLEVBQUUsSUFBSSxFQUFFLFNBQVMsRUFBRSxPQUFPLENBQVksQ0FBQztZQUNuRSxPQUFPLENBQUMsR0FBRyxDQUFDLEdBQUcsQ0FDWCxhQUFhLENBQUMsR0FBRyxFQUFFLElBQUksRUFBRSxTQUFTLEVBQUUsT0FBTyxDQUFXLEVBQUUsSUFBSSxFQUM1RCxRQUFRLENBQUMsQ0FBQyxDQUFDO1NBQ2hCO1FBQ0QsS0FBSyxRQUFRLENBQUMsQ0FBQztZQUNiLE1BQU0sSUFBSSxHQUNOLGFBQWEsQ0FBQyxNQUFNLEVBQUUsSUFBSSxFQUFFLFNBQVMsRUFBRSxPQUFPLENBQVcsQ0FBQztZQUM5RCxPQUFPLENBQUMsR0FBRyxDQUFDLE1BQU0sQ0FDZCxhQUFhLENBQUMsR0FBRyxFQUFFLElBQUksRUFBRSxTQUFTLEVBQUUsT0FBTyxDQUFXLEVBQUUsSUFBSSxDQUFDLENBQUMsQ0FBQztTQUNwRTtRQUNELEtBQUssUUFBUSxDQUFDLENBQUM7WUFDYixNQUFNLElBQUksR0FDTixhQUFhLENBQUMsTUFBTSxFQUFFLElBQUksRUFBRSxTQUFTLEVBQUUsT0FBTyxDQUFXLENBQUM7WUFDOUQsT0FBTyxDQUFDLEdBQUcsQ0FBQyxNQUFNLENBQ2QsYUFBYSxDQUFDLEdBQUcsRUFBRSxJQUFJLEVBQUUsU0FBUyxFQUFFLE9BQU8sQ0FBVyxFQUFFLElBQUksQ0FBQyxDQUFDLENBQUM7U0FDcEU7UUFDRCxLQUFLLE1BQU0sQ0FBQyxDQUFDO1lBQ1gsTUFBTSxJQUFJLEdBQ04sYUFBYSxDQUFDLE1BQU0sRUFBRSxJQUFJLEVBQUUsU0FBUyxFQUFFLE9BQU8sQ0FBYSxDQUFDO1lBQ2hFLE1BQU0sUUFBUSxHQUNWLGFBQWEsQ0FBQyxVQUFVLEVBQUUsSUFBSSxFQUFFLFNBQVMsRUFBRSxPQUFPLENBQVksQ0FBQztZQUNuRSxPQUFPLENBQUMsR0FBRyxDQUFDLElBQUksQ0FDWixhQUFhLENBQUMsR0FBRyxFQUFFLElBQUksRUFBRSxTQUFTLEVBQUUsT0FBTyxDQUFXLEVBQUUsSUFBSSxFQUM1RCxRQUFRLENBQUMsQ0FBQyxDQUFDO1NBQ2hCO1FBQ0QsS0FBSyxTQUFTLENBQUMsQ0FBQztZQUNkLE1BQU0sSUFBSSxHQUNOLGFBQWEsQ0FBQyxNQUFNLEVBQUUsSUFBSSxFQUFFLFNBQVMsRUFBRSxPQUFPLENBQVcsQ0FBQztZQUM5RCxNQUFNLFNBQVMsR0FDWCxhQUFhLENBQUMsV0FBVyxFQUFFLElBQUksRUFBRSxTQUFTLEVBQUUsT0FBTyxDQUFZLENBQUM7WUFDcEUsTUFBTSxPQUFPLEdBQ1QsYUFBYSxDQUFDLFNBQVMsRUFBRSxJQUFJLEVBQUUsU0FBUyxFQUFFLE9BQU8sQ0FBWSxDQUFDO1lBQ2xFLE9BQU8sQ0FBQyxHQUFHLENBQUMsT0FBTyxDQUNmLGFBQWEsQ0FBQyxHQUFHLEVBQUUsSUFBSSxFQUFFLFNBQVMsRUFBRSxPQUFPLENBQVcsRUFBRSxJQUFJLEVBQzVELFNBQVMsRUFBRSxPQUFPLENBQUMsQ0FBQyxDQUFDO1NBQzFCO1FBQ0QsS0FBSyxRQUFRLENBQUMsQ0FBQztZQUNiLE1BQU0sSUFBSSxHQUNOLGFBQWEsQ0FBQyxNQUFNLEVBQUUsSUFBSSxFQUFFLFNBQVMsRUFBRSxPQUFPLENBQVcsQ0FBQztZQUM5RCxNQUFNLFNBQVMsR0FDWCxhQUFhLENBQUMsV0FBVyxFQUFFLElBQUksRUFBRSxTQUFTLEVBQUUsT0FBTyxDQUFZLENBQUM7WUFDcEUsTUFBTSxPQUFPLEdBQ1QsYUFBYSxDQUFDLFNBQVMsRUFBRSxJQUFJLEVBQUUsU0FBUyxFQUFFLE9BQU8sQ0FBWSxDQUFDO1lBQ2xFLE9BQU8sQ0FBQyxHQUFHLENBQUMsTUFBTSxDQUNkLGFBQWEsQ0FBQyxHQUFHLEVBQUUsSUFBSSxFQUFFLFNBQVMsRUFBRSxPQUFPLENBQVcsRUFBRSxJQUFJLEVBQzVELFNBQVMsRUFBRSxPQUFPLENBQUMsQ0FBQyxDQUFDO1NBQzFCO1FBQ0QsS0FBSyxVQUFVO1lBQ2IsTUFBTSxDQUFDLEdBQUcsYUFBYSxDQUFDLEdBQUcsRUFBRSxJQUFJLEVBQUUsU0FBUyxFQUFFLE9BQU8sQ0FBYSxDQUFDO1lBQ25FLE1BQU0sT0FBTyxHQUNULGFBQWEsQ0FBQyxTQUFTLEVBQUUsSUFBSSxFQUFFLFNBQVMsRUFBRSxPQUFPLENBQWEsQ0FBQztZQUNuRSxNQUFNLElBQUksR0FDTixhQUFhLENBQUMsTUFBTSxFQUFFLElBQUksRUFBRSxTQUFTLEVBQUUsT0FBTyxDQUFXLENBQUM7WUFFOUQsT0FBTyxDQUFDLEdBQUcsQ0FBQyxRQUFRLENBQUMsQ0FBQyxFQUFFLE9BQU8sRUFBRSxJQUFJLENBQUMsQ0FBQyxDQUFDO1FBQzFDLEtBQUssZUFBZSxDQUFDLENBQUM7WUFDcEIsTUFBTSxDQUFDLEdBQUcsYUFBYSxDQUFDLEdBQUcsRUFBRSxJQUFJLEVBQUUsU0FBUyxFQUFFLE9BQU8sQ0FDekMsQ0FBQztZQUNiLE1BQU0sT0FBTyxHQUNULGFBQWEsQ0FBQyxTQUFTLEVBQUUsSUFBSSxFQUFFLFNBQVMsRUFBRSxPQUFPLENBQ3pDLENBQUM7WUFDYixNQUFNLElBQUksR0FDTixhQUFhLENBQUMsTUFBTSxFQUFFLElBQUksRUFBRSxTQUFTLEVBQUUsT0FBTyxDQUFXLENBQUM7WUFFOUQsTUFBTSxZQUFZLEdBQ2QsYUFBYSxDQUFDLGNBQWMsRUFBRSxJQUFJLEVBQUUsU0FBUyxFQUFFLE9BQU8sQ0FDL0MsQ0FBQztZQUVaLE9BQU8sQ0FBQyxHQUFHLENBQUMsYUFBYSxDQUFDLENBQUMsRUFBRSxPQUFPLEVBQUUsSUFBSSxFQUFFLFlBQVksQ0FBQyxDQUFDLENBQUM7U0FDNUQ7UUFDRDtZQUNFLE1BQU0sU0FBUyxDQUFDLGFBQWEsSUFBSSxDQUFDLEVBQUUscUJBQXFCLENBQUMsQ0FBQztLQUM5RDtBQUNILENBQUMsQ0FBQztBQUVOLE1BQU0sQ0FBQyxNQUFNLFFBQVEsR0FBRyxXQUFXLENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyIvKipcbiAqIEBsaWNlbnNlXG4gKiBDb3B5cmlnaHQgMjAxOCBHb29nbGUgTExDLiBBbGwgUmlnaHRzIFJlc2VydmVkLlxuICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlIFwiTGljZW5zZVwiKTtcbiAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS5cbiAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdFxuICpcbiAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMFxuICpcbiAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmVcbiAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuIFwiQVMgSVNcIiBCQVNJUyxcbiAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLlxuICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZFxuICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuXG4gKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuICovXG5cbmltcG9ydCB7VGVuc29yLCBUZW5zb3IxRCwgVGVuc29yMkR9IGZyb20gJ0B0ZW5zb3JmbG93L3RmanMtY29yZSc7XG4vLyB0c2xpbnQ6ZGlzYWJsZS1uZXh0LWxpbmU6IG5vLWltcG9ydHMtZnJvbS1kaXN0XG5pbXBvcnQgKiBhcyB0Zk9wcyBmcm9tICdAdGVuc29yZmxvdy90ZmpzLWNvcmUvZGlzdC9vcHMvb3BzX2Zvcl9jb252ZXJ0ZXInO1xuXG5pbXBvcnQge05hbWVkVGVuc29yc01hcH0gZnJvbSAnLi4vLi4vZGF0YS90eXBlcyc7XG5pbXBvcnQge0V4ZWN1dGlvbkNvbnRleHR9IGZyb20gJy4uLy4uL2V4ZWN1dG9yL2V4ZWN1dGlvbl9jb250ZXh0JztcbmltcG9ydCB7SW50ZXJuYWxPcEV4ZWN1dG9yLCBOb2RlfSBmcm9tICcuLi90eXBlcyc7XG5cbmltcG9ydCB7Z2V0UGFyYW1WYWx1ZX0gZnJvbSAnLi91dGlscyc7XG5cbmV4cG9ydCBjb25zdCBleGVjdXRlT3A6IEludGVybmFsT3BFeGVjdXRvciA9XG4gICAgKG5vZGU6IE5vZGUsIHRlbnNvck1hcDogTmFtZWRUZW5zb3JzTWFwLFxuICAgICBjb250ZXh0OiBFeGVjdXRpb25Db250ZXh0LCBvcHMgPSB0Zk9wcyk6IFRlbnNvcltdID0+IHtcbiAgICAgIHN3aXRjaCAobm9kZS5vcCkge1xuICAgICAgICBjYXNlICdNYXgnOiB7XG4gICAgICAgICAgY29uc3QgYXhpcyA9XG4gICAgICAgICAgICAgIGdldFBhcmFtVmFsdWUoJ2F4aXMnLCBub2RlLCB0ZW5zb3JNYXAsIGNvbnRleHQpIGFzIG51bWJlcltdO1xuICAgICAgICAgIGNvbnN0IGtlZXBEaW1zID1cbiAgICAgICAgICAgICAgZ2V0UGFyYW1WYWx1ZSgna2VlcERpbXMnLCBub2RlLCB0ZW5zb3JNYXAsIGNvbnRleHQpIGFzIGJvb2xlYW47XG4gICAgICAgICAgcmV0dXJuIFtvcHMubWF4KFxuICAgICAgICAgICAgICBnZXRQYXJhbVZhbHVlKCd4Jywgbm9kZSwgdGVuc29yTWFwLCBjb250ZXh0KSBhcyBUZW5zb3IsIGF4aXMsXG4gICAgICAgICAgICAgIGtlZXBEaW1zKV07XG4gICAgICAgIH1cbiAgICAgICAgY2FzZSAnTWVhbic6IHtcbiAgICAgICAgICBjb25zdCBheGlzID1cbiAgICAgICAgICAgICAgZ2V0UGFyYW1WYWx1ZSgnYXhpcycsIG5vZGUsIHRlbnNvck1hcCwgY29udGV4dCkgYXMgbnVtYmVyW107XG4gICAgICAgICAgY29uc3Qga2VlcERpbXMgPVxuICAgICAgICAgICAgICBnZXRQYXJhbVZhbHVlKCdrZWVwRGltcycsIG5vZGUsIHRlbnNvck1hcCwgY29udGV4dCkgYXMgYm9vbGVhbjtcbiAgICAgICAgICByZXR1cm4gW29wcy5tZWFuKFxuICAgICAgICAgICAgICBnZXRQYXJhbVZhbHVlKCd4Jywgbm9kZSwgdGVuc29yTWFwLCBjb250ZXh0KSBhcyBUZW5zb3IsIGF4aXMsXG4gICAgICAgICAgICAgIGtlZXBEaW1zKV07XG4gICAgICAgIH1cbiAgICAgICAgY2FzZSAnTWluJzoge1xuICAgICAgICAgIGNvbnN0IGF4aXMgPVxuICAgICAgICAgICAgICBnZXRQYXJhbVZhbHVlKCdheGlzJywgbm9kZSwgdGVuc29yTWFwLCBjb250ZXh0KSBhcyBudW1iZXJbXTtcbiAgICAgICAgICBjb25zdCBrZWVwRGltcyA9XG4gICAgICAgICAgICAgIGdldFBhcmFtVmFsdWUoJ2tlZXBEaW1zJywgbm9kZSwgdGVuc29yTWFwLCBjb250ZXh0KSBhcyBib29sZWFuO1xuICAgICAgICAgIHJldHVybiBbb3BzLm1pbihcbiAgICAgICAgICAgICAgZ2V0UGFyYW1WYWx1ZSgneCcsIG5vZGUsIHRlbnNvck1hcCwgY29udGV4dCkgYXMgVGVuc29yLCBheGlzLFxuICAgICAgICAgICAgICBrZWVwRGltcyldO1xuICAgICAgICB9XG4gICAgICAgIGNhc2UgJ1N1bSc6IHtcbiAgICAgICAgICBjb25zdCBheGlzID1cbiAgICAgICAgICAgICAgZ2V0UGFyYW1WYWx1ZSgnYXhpcycsIG5vZGUsIHRlbnNvck1hcCwgY29udGV4dCkgYXMgbnVtYmVyW107XG4gICAgICAgICAgY29uc3Qga2VlcERpbXMgPVxuICAgICAgICAgICAgICBnZXRQYXJhbVZhbHVlKCdrZWVwRGltcycsIG5vZGUsIHRlbnNvck1hcCwgY29udGV4dCkgYXMgYm9vbGVhbjtcbiAgICAgICAgICByZXR1cm4gW29wcy5zdW0oXG4gICAgICAgICAgICAgIGdldFBhcmFtVmFsdWUoJ3gnLCBub2RlLCB0ZW5zb3JNYXAsIGNvbnRleHQpIGFzIFRlbnNvciwgYXhpcyxcbiAgICAgICAgICAgICAga2VlcERpbXMpXTtcbiAgICAgICAgfVxuICAgICAgICBjYXNlICdBbGwnOiB7XG4gICAgICAgICAgY29uc3QgYXhpcyA9XG4gICAgICAgICAgICAgIGdldFBhcmFtVmFsdWUoJ2F4aXMnLCBub2RlLCB0ZW5zb3JNYXAsIGNvbnRleHQpIGFzIG51bWJlcltdO1xuICAgICAgICAgIGNvbnN0IGtlZXBEaW1zID1cbiAgICAgICAgICAgICAgZ2V0UGFyYW1WYWx1ZSgna2VlcERpbXMnLCBub2RlLCB0ZW5zb3JNYXAsIGNvbnRleHQpIGFzIGJvb2xlYW47XG4gICAgICAgICAgcmV0dXJuIFtvcHMuYWxsKFxuICAgICAgICAgICAgICBnZXRQYXJhbVZhbHVlKCd4Jywgbm9kZSwgdGVuc29yTWFwLCBjb250ZXh0KSBhcyBUZW5zb3IsIGF4aXMsXG4gICAgICAgICAgICAgIGtlZXBEaW1zKV07XG4gICAgICAgIH1cbiAgICAgICAgY2FzZSAnQW55Jzoge1xuICAgICAgICAgIGNvbnN0IGF4aXMgPVxuICAgICAgICAgICAgICBnZXRQYXJhbVZhbHVlKCdheGlzJywgbm9kZSwgdGVuc29yTWFwLCBjb250ZXh0KSBhcyBudW1iZXJbXTtcbiAgICAgICAgICBjb25zdCBrZWVwRGltcyA9XG4gICAgICAgICAgICAgIGdldFBhcmFtVmFsdWUoJ2tlZXBEaW1zJywgbm9kZSwgdGVuc29yTWFwLCBjb250ZXh0KSBhcyBib29sZWFuO1xuICAgICAgICAgIHJldHVybiBbb3BzLmFueShcbiAgICAgICAgICAgICAgZ2V0UGFyYW1WYWx1ZSgneCcsIG5vZGUsIHRlbnNvck1hcCwgY29udGV4dCkgYXMgVGVuc29yLCBheGlzLFxuICAgICAgICAgICAgICBrZWVwRGltcyldO1xuICAgICAgICB9XG4gICAgICAgIGNhc2UgJ0FyZ01heCc6IHtcbiAgICAgICAgICBjb25zdCBheGlzID1cbiAgICAgICAgICAgICAgZ2V0UGFyYW1WYWx1ZSgnYXhpcycsIG5vZGUsIHRlbnNvck1hcCwgY29udGV4dCkgYXMgbnVtYmVyO1xuICAgICAgICAgIHJldHVybiBbb3BzLmFyZ01heChcbiAgICAgICAgICAgICAgZ2V0UGFyYW1WYWx1ZSgneCcsIG5vZGUsIHRlbnNvck1hcCwgY29udGV4dCkgYXMgVGVuc29yLCBheGlzKV07XG4gICAgICAgIH1cbiAgICAgICAgY2FzZSAnQXJnTWluJzoge1xuICAgICAgICAgIGNvbnN0IGF4aXMgPVxuICAgICAgICAgICAgICBnZXRQYXJhbVZhbHVlKCdheGlzJywgbm9kZSwgdGVuc29yTWFwLCBjb250ZXh0KSBhcyBudW1iZXI7XG4gICAgICAgICAgcmV0dXJuIFtvcHMuYXJnTWluKFxuICAgICAgICAgICAgICBnZXRQYXJhbVZhbHVlKCd4Jywgbm9kZSwgdGVuc29yTWFwLCBjb250ZXh0KSBhcyBUZW5zb3IsIGF4aXMpXTtcbiAgICAgICAgfVxuICAgICAgICBjYXNlICdQcm9kJzoge1xuICAgICAgICAgIGNvbnN0IGF4aXMgPVxuICAgICAgICAgICAgICBnZXRQYXJhbVZhbHVlKCdheGlzJywgbm9kZSwgdGVuc29yTWFwLCBjb250ZXh0KSBhcyBudW1iZXJbXTtcbiAgICAgICAgICBjb25zdCBrZWVwRGltcyA9XG4gICAgICAgICAgICAgIGdldFBhcmFtVmFsdWUoJ2tlZXBEaW1zJywgbm9kZSwgdGVuc29yTWFwLCBjb250ZXh0KSBhcyBib29sZWFuO1xuICAgICAgICAgIHJldHVybiBbb3BzLnByb2QoXG4gICAgICAgICAgICAgIGdldFBhcmFtVmFsdWUoJ3gnLCBub2RlLCB0ZW5zb3JNYXAsIGNvbnRleHQpIGFzIFRlbnNvciwgYXhpcyxcbiAgICAgICAgICAgICAga2VlcERpbXMpXTtcbiAgICAgICAgfVxuICAgICAgICBjYXNlICdDdW1wcm9kJzoge1xuICAgICAgICAgIGNvbnN0IGF4aXMgPVxuICAgICAgICAgICAgICBnZXRQYXJhbVZhbHVlKCdheGlzJywgbm9kZSwgdGVuc29yTWFwLCBjb250ZXh0KSBhcyBudW1iZXI7XG4gICAgICAgICAgY29uc3QgZXhjbHVzaXZlID1cbiAgICAgICAgICAgICAgZ2V0UGFyYW1WYWx1ZSgnZXhjbHVzaXZlJywgbm9kZSwgdGVuc29yTWFwLCBjb250ZXh0KSBhcyBib29sZWFuO1xuICAgICAgICAgIGNvbnN0IHJldmVyc2UgPVxuICAgICAgICAgICAgICBnZXRQYXJhbVZhbHVlKCdyZXZlcnNlJywgbm9kZSwgdGVuc29yTWFwLCBjb250ZXh0KSBhcyBib29sZWFuO1xuICAgICAgICAgIHJldHVybiBbb3BzLmN1bXByb2QoXG4gICAgICAgICAgICAgIGdldFBhcmFtVmFsdWUoJ3gnLCBub2RlLCB0ZW5zb3JNYXAsIGNvbnRleHQpIGFzIFRlbnNvciwgYXhpcyxcbiAgICAgICAgICAgICAgZXhjbHVzaXZlLCByZXZlcnNlKV07XG4gICAgICAgIH1cbiAgICAgICAgY2FzZSAnQ3Vtc3VtJzoge1xuICAgICAgICAgIGNvbnN0IGF4aXMgPVxuICAgICAgICAgICAgICBnZXRQYXJhbVZhbHVlKCdheGlzJywgbm9kZSwgdGVuc29yTWFwLCBjb250ZXh0KSBhcyBudW1iZXI7XG4gICAgICAgICAgY29uc3QgZXhjbHVzaXZlID1cbiAgICAgICAgICAgICAgZ2V0UGFyYW1WYWx1ZSgnZXhjbHVzaXZlJywgbm9kZSwgdGVuc29yTWFwLCBjb250ZXh0KSBhcyBib29sZWFuO1xuICAgICAgICAgIGNvbnN0IHJldmVyc2UgPVxuICAgICAgICAgICAgICBnZXRQYXJhbVZhbHVlKCdyZXZlcnNlJywgbm9kZSwgdGVuc29yTWFwLCBjb250ZXh0KSBhcyBib29sZWFuO1xuICAgICAgICAgIHJldHVybiBbb3BzLmN1bXN1bShcbiAgICAgICAgICAgICAgZ2V0UGFyYW1WYWx1ZSgneCcsIG5vZGUsIHRlbnNvck1hcCwgY29udGV4dCkgYXMgVGVuc29yLCBheGlzLFxuICAgICAgICAgICAgICBleGNsdXNpdmUsIHJldmVyc2UpXTtcbiAgICAgICAgfVxuICAgICAgICBjYXNlICdCaW5jb3VudCc6XG4gICAgICAgICAgY29uc3QgeCA9IGdldFBhcmFtVmFsdWUoJ3gnLCBub2RlLCB0ZW5zb3JNYXAsIGNvbnRleHQpIGFzIFRlbnNvcjFEO1xuICAgICAgICAgIGNvbnN0IHdlaWdodHMgPVxuICAgICAgICAgICAgICBnZXRQYXJhbVZhbHVlKCd3ZWlnaHRzJywgbm9kZSwgdGVuc29yTWFwLCBjb250ZXh0KSBhcyBUZW5zb3IxRDtcbiAgICAgICAgICBjb25zdCBzaXplID1cbiAgICAgICAgICAgICAgZ2V0UGFyYW1WYWx1ZSgnc2l6ZScsIG5vZGUsIHRlbnNvck1hcCwgY29udGV4dCkgYXMgbnVtYmVyO1xuXG4gICAgICAgICAgcmV0dXJuIFtvcHMuYmluY291bnQoeCwgd2VpZ2h0cywgc2l6ZSldO1xuICAgICAgICBjYXNlICdEZW5zZUJpbmNvdW50Jzoge1xuICAgICAgICAgIGNvbnN0IHggPSBnZXRQYXJhbVZhbHVlKCd4Jywgbm9kZSwgdGVuc29yTWFwLCBjb250ZXh0KSBhcyBUZW5zb3IxRCB8XG4gICAgICAgICAgICAgIFRlbnNvcjJEO1xuICAgICAgICAgIGNvbnN0IHdlaWdodHMgPVxuICAgICAgICAgICAgICBnZXRQYXJhbVZhbHVlKCd3ZWlnaHRzJywgbm9kZSwgdGVuc29yTWFwLCBjb250ZXh0KSBhcyBUZW5zb3IxRCB8XG4gICAgICAgICAgICAgIFRlbnNvcjJEO1xuICAgICAgICAgIGNvbnN0IHNpemUgPVxuICAgICAgICAgICAgICBnZXRQYXJhbVZhbHVlKCdzaXplJywgbm9kZSwgdGVuc29yTWFwLCBjb250ZXh0KSBhcyBudW1iZXI7XG5cbiAgICAgICAgICBjb25zdCBiaW5hcnlPdXRwdXQgPVxuICAgICAgICAgICAgICBnZXRQYXJhbVZhbHVlKCdiaW5hcnlPdXRwdXQnLCBub2RlLCB0ZW5zb3JNYXAsIGNvbnRleHQpIGFzXG4gICAgICAgICAgICAgIGJvb2xlYW47XG5cbiAgICAgICAgICByZXR1cm4gW29wcy5kZW5zZUJpbmNvdW50KHgsIHdlaWdodHMsIHNpemUsIGJpbmFyeU91dHB1dCldO1xuICAgICAgICB9XG4gICAgICAgIGRlZmF1bHQ6XG4gICAgICAgICAgdGhyb3cgVHlwZUVycm9yKGBOb2RlIHR5cGUgJHtub2RlLm9wfSBpcyBub3QgaW1wbGVtZW50ZWRgKTtcbiAgICAgIH1cbiAgICB9O1xuXG5leHBvcnQgY29uc3QgQ0FURUdPUlkgPSAncmVkdWN0aW9uJztcbiJdfQ==","/**\n * @license\n * Copyright 2018 Google LLC. All Rights Reserved.\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n * =============================================================================\n */\nimport { tidy, util } from '@tensorflow/tfjs-core';\n// tslint:disable-next-line: no-imports-from-dist\nimport * as tfOps from '@tensorflow/tfjs-core/dist/ops/ops_for_converter';\nimport { getParamValue } from './utils';\nexport const executeOp = (node, tensorMap, context, ops = tfOps) => {\n switch (node.op) {\n case 'ConcatV2':\n case 'Concat': {\n const n = getParamValue('n', node, tensorMap, context);\n const axis = getParamValue('axis', node, tensorMap, context);\n let inputs = getParamValue('tensors', node, tensorMap, context);\n inputs = inputs.slice(0, n);\n return [ops.concat(inputs, axis)];\n }\n case 'Gather': {\n const input = getParamValue('x', node, tensorMap, context);\n const indices = getParamValue('indices', node, tensorMap, context);\n return [ops.gather(input, ops.cast(indices, 'int32'), 0)];\n }\n case 'GatherV2': {\n const axis = getParamValue('axis', node, tensorMap, context);\n const batchDims = getParamValue('batchDims', node, tensorMap, context);\n const input = getParamValue('x', node, tensorMap, context);\n const indices = getParamValue('indices', node, tensorMap, context);\n return [ops.gather(input, ops.cast(indices, 'int32'), axis, batchDims)];\n }\n case 'Reverse': {\n const dims = getParamValue('dims', node, tensorMap, context);\n const axis = [];\n for (let i = 0; i < dims.length; i++) {\n if (dims[i]) {\n axis.push(i);\n }\n }\n const input = getParamValue('x', node, tensorMap, context);\n return [ops.reverse(input, axis)];\n }\n case 'ReverseV2': {\n const axis = getParamValue('axis', node, tensorMap, context);\n const input = getParamValue('x', node, tensorMap, context);\n return [ops.reverse(input, axis)];\n }\n case 'Slice': {\n // tslint:disable-next-line:no-any\n const begin = getParamValue('begin', node, tensorMap, context);\n // tslint:disable-next-line:no-any\n const size = getParamValue('size', node, tensorMap, context);\n return [ops.slice(getParamValue('x', node, tensorMap, context), begin, size)];\n }\n case 'StridedSlice': {\n const begin = getParamValue('begin', node, tensorMap, context);\n const end = getParamValue('end', node, tensorMap, context);\n const strides = getParamValue('strides', node, tensorMap, context);\n const beginMask = getParamValue('beginMask', node, tensorMap, context);\n const endMask = getParamValue('endMask', node, tensorMap, context);\n const ellipsisMask = getParamValue('ellipsisMask', node, tensorMap, context);\n const newAxisMask = getParamValue('newAxisMask', node, tensorMap, context);\n const shrinkAxisMask = getParamValue('shrinkAxisMask', node, tensorMap, context);\n const tensor = getParamValue('x', node, tensorMap, context);\n return [ops.stridedSlice(tensor, begin, end, strides, beginMask, endMask, ellipsisMask, newAxisMask, shrinkAxisMask)];\n }\n case 'Pack': {\n return tidy(() => {\n const axis = getParamValue('axis', node, tensorMap, context);\n const tensors = getParamValue('tensors', node, tensorMap, context);\n // Reshape the tensors to the first tensor's shape if they don't\n // match.\n const shape = tensors[0].shape;\n const squeezedShape = ops.squeeze(tensors[0]).shape;\n const mapped = tensors.map(tensor => {\n const sameShape = util.arraysEqual(tensor.shape, shape);\n if (!sameShape &&\n !util.arraysEqual(ops.squeeze(tensor).shape, squeezedShape)) {\n throw new Error('the input tensors shape does not match');\n }\n return sameShape ? tensor : ops.reshape(tensor, shape);\n });\n return [ops.stack(mapped, axis)];\n });\n }\n case 'Unpack': {\n const axis = getParamValue('axis', node, tensorMap, context);\n const tensor = getParamValue('tensor', node, tensorMap, context);\n return ops.unstack(tensor, axis);\n }\n case 'Tile': {\n const reps = getParamValue('reps', node, tensorMap, context);\n return [ops.tile(getParamValue('x', node, tensorMap, context), reps)];\n }\n case 'Split':\n case 'SplitV': {\n const axis = getParamValue('axis', node, tensorMap, context);\n const numOrSizeSplits = getParamValue('numOrSizeSplits', node, tensorMap, context);\n const tensor = getParamValue('x', node, tensorMap, context);\n return ops.split(tensor, numOrSizeSplits, axis);\n }\n case 'ScatterNd': {\n const indices = getParamValue('indices', node, tensorMap, context);\n const values = getParamValue('values', node, tensorMap, context);\n const shape = getParamValue('shape', node, tensorMap, context);\n return [ops.scatterND(indices, values, shape)];\n }\n case 'GatherNd': {\n const x = getParamValue('x', node, tensorMap, context);\n const indices = getParamValue('indices', node, tensorMap, context);\n return [ops.gatherND(x, indices)];\n }\n case 'SparseToDense': {\n const indices = getParamValue('sparseIndices', node, tensorMap, context);\n const shape = getParamValue('outputShape', node, tensorMap, context);\n const sparseValues = getParamValue('sparseValues', node, tensorMap, context);\n const defaultValue = getParamValue('defaultValue', node, tensorMap, context);\n return [ops.sparseToDense(indices, sparseValues, shape, sparseValues.dtype === defaultValue.dtype ?\n defaultValue :\n ops.cast(defaultValue, sparseValues.dtype))];\n }\n default:\n throw TypeError(`Node type ${node.op} is not implemented`);\n }\n};\nexport const CATEGORY = 'slice_join';\n//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic2xpY2Vfam9pbl9leGVjdXRvci5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uLy4uLy4uL3RmanMtY29udmVydGVyL3NyYy9vcGVyYXRpb25zL2V4ZWN1dG9ycy9zbGljZV9qb2luX2V4ZWN1dG9yLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBOzs7Ozs7Ozs7Ozs7Ozs7R0FlRztBQUVILE9BQU8sRUFBMkIsSUFBSSxFQUFFLElBQUksRUFBQyxNQUFNLHVCQUF1QixDQUFDO0FBQzNFLGlEQUFpRDtBQUNqRCxPQUFPLEtBQUssS0FBSyxNQUFNLGtEQUFrRCxDQUFDO0FBTTFFLE9BQU8sRUFBQyxhQUFhLEVBQUMsTUFBTSxTQUFTLENBQUM7QUFFdEMsTUFBTSxDQUFDLE1BQU0sU0FBUyxHQUNsQixDQUFDLElBQVUsRUFBRSxTQUEwQixFQUN0QyxPQUF5QixFQUFFLEdBQUcsR0FBRyxLQUFLLEVBQVksRUFBRTtJQUNuRCxRQUFRLElBQUksQ0FBQyxFQUFFLEVBQUU7UUFDZixLQUFLLFVBQVUsQ0FBQztRQUNoQixLQUFLLFFBQVEsQ0FBQyxDQUFDO1lBQ2IsTUFBTSxDQUFDLEdBQUcsYUFBYSxDQUFDLEdBQUcsRUFBRSxJQUFJLEVBQUUsU0FBUyxFQUFFLE9BQU8sQ0FBVyxDQUFDO1lBQ2pFLE1BQU0sSUFBSSxHQUNOLGFBQWEsQ0FBQyxNQUFNLEVBQUUsSUFBSSxFQUFFLFNBQVMsRUFBRSxPQUFPLENBQVcsQ0FBQztZQUM5RCxJQUFJLE1BQU0sR0FDTixhQUFhLENBQUMsU0FBUyxFQUFFLElBQUksRUFBRSxTQUFTLEVBQUUsT0FBTyxDQUFhLENBQUM7WUFDbkUsTUFBTSxHQUFHLE1BQU0sQ0FBQyxLQUFLLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDO1lBQzVCLE9BQU8sQ0FBQyxHQUFHLENBQUMsTUFBTSxDQUFDLE1BQU0sRUFBRSxJQUFJLENBQUMsQ0FBQyxDQUFDO1NBQ25DO1FBQ0QsS0FBSyxRQUFRLENB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QUMsQ0FBQyxDQUFDO1NBQ3REO1FBQ0Q7WUFDRSxNQUFNLFNBQVMsQ0FBQyxhQUFhLElBQUksQ0FBQyxFQUFFLHFCQUFxQixDQUFDLENBQUM7S0FDOUQ7QUFDSCxDQUFDLENBQUM7QUFFTixNQUFNLENBQUMsTUFBTSxRQUFRLEdBQUcsWUFBWSxDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiLyoqXG4gKiBAbGljZW5zZVxuICogQ29weXJpZ2h0IDIwMTggR29vZ2xlIExMQy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC5cbiAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSBcIkxpY2Vuc2VcIik7XG4gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuXG4gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXRcbiAqXG4gKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjBcbiAqXG4gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlXG4gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiBcIkFTIElTXCIgQkFTSVMsXG4gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC5cbiAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmRcbiAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLlxuICogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbiAqL1xuXG5pbXBvcnQge1NjYWxhciwgVGVuc29yLCBUZW5zb3IxRCwgdGlkeSwgdXRpbH0gZnJvbSAnQHRlbnNvcmZsb3cvdGZqcy1jb3JlJztcbi8vIHRzbGludDpkaXNhYmxlLW5leHQtbGluZTogbm8taW1wb3J0cy1mcm9tLWRpc3RcbmltcG9ydCAqIGFzIHRmT3BzIGZyb20gJ0B0ZW5zb3JmbG93L3RmanMtY29yZS9kaXN0L29wcy9vcHNfZm9yX2NvbnZlcnRlcic7XG5cbmltcG9ydCB7TmFtZWRUZW5zb3JzTWFwfSBmcm9tICcuLi8uLi9kYXRhL3R5cGVzJztcbmltcG9ydCB7RXhlY3V0aW9uQ29udGV4dH0gZnJvbSAnLi4vLi4vZXhlY3V0b3IvZXhlY3V0aW9uX2NvbnRleHQnO1xuaW1wb3J0IHtJbnRlcm5hbE9wRXhlY3V0b3IsIE5vZGV9IGZyb20gJy4uL3R5cGVzJztcblxuaW1wb3J0IHtnZXRQYXJhbVZhbHVlfSBmcm9tICcuL3V0aWxzJztcblxuZXhwb3J0IGNvbnN0IGV4ZWN1dGVPcDogSW50ZXJuYWxPcEV4ZWN1dG9yID1cbiAgICAobm9kZTogTm9kZSwgdGVuc29yTWFwOiBOYW1lZFRlbnNvcnNNYXAsXG4gICAgIGNvbnRleHQ6IEV4ZWN1dGlvbkNvbnRleHQsIG9wcyA9IHRmT3BzKTogVGVuc29yW10gPT4ge1xuICAgICAgc3dpdGNoIChub2RlLm9wKSB7XG4gICAgICAgIGNhc2UgJ0NvbmNhdFYyJzpcbiAgICAgICAgY2FzZSAnQ29uY2F0Jzoge1xuICAgICAgICAgIGNvbnN0IG4gPSBnZXRQYXJhbVZhbHVlKCduJywgbm9kZSwgdGVuc29yTWFwLCBjb250ZXh0KSBhcyBudW1iZXI7XG4gICAgICAgICAgY29uc3QgYXhpcyA9XG4gICAgICAgICAgICAgIGdldFBhcmFtVmFsdWUoJ2F4aXMnLCBub2RlLCB0ZW5zb3JNYXAsIGNvbnRleHQpIGFzIG51bWJlcjtcbiAgICAgICAgICBsZXQgaW5wdXRzID1cbiAgICAgICAgICAgICAgZ2V0UGFyYW1WYWx1ZSgndGVuc29ycycsIG5vZGUsIHRlbnNvck1hcCwgY29udGV4dCkgYXMgVGVuc29yW107XG4gICAgICAgICAgaW5wdXRzID0gaW5wdXRzLnNsaWNlKDAsIG4pO1xuICAgICAgICAgIHJldHVybiBbb3BzLmNvbmNhdChpbnB1dHMsIGF4aXMpXTtcbiAgICAgICAgfVxuICAgICAgICBjYXNlICdHYXRoZXInOiB7XG4gICAgICAgICAgY29uc3QgaW5wdXQgPSBnZXRQYXJhbVZhbHVlKCd4Jywgbm9kZSwgdGVuc29yTWFwLCBjb250ZXh0KSBhcyBUZW5zb3I7XG4gICAgICAgICAgY29uc3QgaW5kaWNlcyA9XG4gICAgICAgICAgICAgIGdldFBhcmFtVmFsdWUoJ2luZGljZXMnLCBub2RlLCB0ZW5zb3JNYXAsIGNvbnRleHQpIGFzIFRlbnNvcjFEO1xuICAgICAgICAgIHJldHVybiBbb3BzLmdhdGhlcihpbnB1dCwgb3BzLmNhc3QoaW5kaWNlcywgJ2ludDMyJyksIDApXTtcbiAgICAgICAgfVxuICAgICAgICBjYXNlICdHYXRoZXJWMic6IHtcbiAgICAgICAgICBjb25zdCBheGlzID1cbiAgICAgICAgICAgICAgZ2V0UGFyYW1WYWx1ZSgnYXhpcycsIG5vZGUsIHRlbnNvck1hcCwgY29udGV4dCkgYXMgbnVtYmVyO1xuICAgICAgICAgIGNvbnN0IGJhdGNoRGltcyA9XG4gICAgICAgICAgICAgIGdldFBhcmFtVmFsdWUoJ2JhdGNoRGltcycsIG5vZGUsIHRlbnNvck1hcCwgY29udGV4dCkgYXMgbnVtYmVyO1xuICAgICAgICAgIGNvbnN0IGlucHV0ID0gZ2V0UGFyYW1WYWx1ZSgneCcsIG5vZGUsIHRlbnNvck1hcCwgY29udGV4dCkgYXMgVGVuc29yO1xuICAgICAgICAgIGNvbnN0IGluZGljZXMgPVxuICAgICAgICAgICAgICBnZXRQYXJhbVZhbHVlKCdpbmRpY2VzJywgbm9kZSwgdGVuc29yTWFwLCBjb250ZXh0KSBhcyBUZW5zb3IxRDtcbiAgICAgICAgICByZXR1cm4gW29wcy5nYXRoZXIoXG4gICAgICAgICAgICAgIGlucHV0LCBvcHMuY2FzdChpbmRpY2VzLCAnaW50MzInKSwgYXhpcywgYmF0Y2hEaW1zKV07XG4gICAgICAgIH1cbiAgICAgICAgY2FzZSAnUmV2ZXJzZSc6IHtcbiAgICAgICAgICBjb25zdCBkaW1zID1cbiAgICAgICAgICAgICAgZ2V0UGFyYW1WYWx1ZSgnZGltcycsIG5vZGUsIHRlbnNvck1hcCwgY29udGV4dCkgYXMgYm9vbGVhbltdO1xuICAgICAgICAgIGNvbnN0IGF4aXMgPSBbXTtcbiAgICAgICAgICBmb3IgKGxldCBpID0gMDsgaSA8IGRpbXMubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgICAgIGlmIChkaW1zW2ldKSB7XG4gICAgICAgICAgICAgIGF4aXMucHVzaChpKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9XG4gICAgICAgICAgY29uc3QgaW5wdXQgPSBnZXRQYXJhbVZhbHVlKCd4Jywgbm9kZSwgdGVuc29yTWFwLCBjb250ZXh0KSBhcyBUZW5zb3I7XG4gICAgICAgICAgcmV0dXJuIFtvcHMucmV2ZXJzZShpbnB1dCwgYXhpcyldO1xuICAgICAgICB9XG4gICAgICAgIGNhc2UgJ1JldmVyc2VWMic6IHtcbiAgICAgICAgICBjb25zdCBheGlzID1cbiAgICAgICAgICAgICAgZ2V0UGFyYW1WYWx1ZSgnYXhpcycsIG5vZGUsIHRlbnNvck1hcCwgY29udGV4dCkgYXMgbnVtYmVyW107XG4gICAgICAgICAgY29uc3QgaW5wdXQgPSBnZXRQYXJhbVZhbHVlKCd4Jywgbm9kZSwgdGVuc29yTWFwLCBjb250ZXh0KSBhcyBUZW5zb3I7XG4gICAgICAgICAgcmV0dXJuIFtvcHMucmV2ZXJzZShpbnB1dCwgYXhpcyldO1xuICAgICAgICB9XG4gICAgICAgIGNhc2UgJ1NsaWNlJzoge1xuICAgICAgICAgIC8vIHRzbGludDpkaXNhYmxlLW5leHQtbGluZTpuby1hbnlcbiAgICAgICAgICBjb25zdCBiZWdpbiA9IGdldFBhcmFtVmFsdWUoJ2JlZ2luJywgbm9kZSwgdGVuc29yTWFwLCBjb250ZXh0KSBhcyBhbnk7XG4gICAgICAgICAgLy8gdHNsaW50OmRpc2FibGUtbmV4dC1saW5lOm5vLWFueVxuICAgICAgICAgIGNvbnN0IHNpemUgPSBnZXRQYXJhbVZhbHVlKCdzaXplJywgbm9kZSwgdGVuc29yTWFwLCBjb250ZXh0KSBhcyBhbnk7XG4gICAgICAgICAgcmV0dXJuIFtvcHMuc2xpY2UoXG4gICAgICAgICAgICAgIGdldFBhcmFtVmFsdWUoJ3gnLCBub2RlLCB0ZW5zb3JNYXAsIGNvbnRleHQpIGFzIFRlbnNvciwgYmVnaW4sXG4gICAgICAgICAgICAgIHNpemUpXTtcbiAgICAgICAgfVxuICAgICAgICBjYXNlICdTdHJpZGVkU2xpY2UnOiB7XG4gICAgICAgICAgY29uc3QgYmVnaW4gPVxuICAgICAgICAgICAgICBnZXRQYXJhbVZhbHVlKCdiZWdpbicsIG5vZGUsIHRlbnNvck1hcCwgY29udGV4dCkgYXMgbnVtYmVyW107XG4gICAgICAgICAgY29uc3QgZW5kID1cbiAgICAgICAgICAgICAgZ2V0UGFyYW1WYWx1ZSgnZW5kJywgbm9kZSwgdGVuc29yTWFwLCBjb250ZXh0KSBhcyBudW1iZXJbXTtcbiAgICAgICAgICBjb25zdCBzdHJpZGVzID1cbiAgICAgICAgICAgICAgZ2V0UGFyYW1WYWx1ZSgnc3RyaWRlcycsIG5vZGUsIHRlbnNvck1hcCwgY29udGV4dCkgYXMgbnVtYmVyW107XG4gICAgICAgICAgY29uc3QgYmVnaW5NYXNrID1cbiAgICAgICAgICAgICAgZ2V0UGFyYW1WYWx1ZSgnYmVnaW5NYXNrJywgbm9kZSwgdGVuc29yTWFwLCBjb250ZXh0KSBhcyBudW1iZXI7XG4gICAgICAgICAgY29uc3QgZW5kTWFzayA9XG4gICAgICAgICAgICAgIGdldFBhcmFtVmFsdWUoJ2VuZE1hc2snLCBub2RlLCB0ZW5zb3JNYXAsIGNvbnRleHQpIGFzIG51bWJlcjtcbiAgICAgICAgICBjb25zdCBlbGxpcHNpc01hc2sgPVxuICAgICAgICAgICAgICBnZXRQYXJhbVZhbHVlKCdlbGxpcHNpc01hc2snLCBub2RlLCB0ZW5zb3JNYXAsIGNvbnRleHQpIGFzIG51bWJlcjtcbiAgICAgICAgICBjb25zdCBuZXdBeGlzTWFzayA9XG4gICAgICAgICAgICAgIGdldFBhcmFtVmFsdWUoJ25ld0F4aXNNYXNrJywgbm9kZSwgdGVuc29yTWFwLCBjb250ZXh0KSBhcyBudW1iZXI7XG4gICAgICAgICAgY29uc3Qgc2hyaW5rQXhpc01hc2sgPVxuICAgICAgICAgICAgICBnZXRQYXJhbVZhbHVlKCdzaHJpbmtBeGlzTWFzaycsIG5vZGUsIHRlbnNvck1hcCwgY29udGV4dCkgYXNcbiAgICAgICAgICAgICAgbnVtYmVyO1xuICAgICAgICAgIGNvbnN0IHRlbnNvciA9IGdldFBhcmFtVmFsdWUoJ3gnLCBub2RlLCB0ZW5zb3JNYXAsIGNvbnRleHQpIGFzIFRlbnNvcjtcblxuICAgICAgICAgIHJldHVybiBbb3BzLnN0cmlkZWRTbGljZShcbiAgICAgICAgICAgICAgdGVuc29yLCBiZWdpbiwgZW5kLCBzdHJpZGVzLCBiZWdpbk1hc2ssIGVuZE1hc2ssIGVsbGlwc2lzTWFzayxcbiAgICAgICAgICAgICAgbmV3QXhpc01hc2ssIHNocmlua0F4aXNNYXNrKV07XG4gICAgICAgIH1cbiAgICAgICAgY2FzZSAnUGFjayc6IHtcbiAgICAgICAgICByZXR1cm4gdGlkeSgoKSA9PiB7XG4gICAgICAgICAgICBjb25zdCBheGlzID1cbiAgICAgICAgICAgICAgICBnZXRQYXJhbVZhbHVlKCdheGlzJywgbm9kZSwgdGVuc29yTWFwLCBjb250ZXh0KSBhcyBudW1iZXI7XG4gICAgICAgICAgICBjb25zdCB0ZW5zb3JzID1cbiAgICAgICAgICAgICAgICBnZXRQYXJhbVZhbHVlKCd0ZW5zb3JzJywgbm9kZSwgdGVuc29yTWFwLCBjb250ZXh0KSBhcyBUZW5zb3JbXTtcbiAgICAgICAgICAgIC8vIFJlc2hhcGUgdGhlIHRlbnNvcnMgdG8gdGhlIGZpcnN0IHRlbnNvcidzIHNoYXBlIGlmIHRoZXkgZG9uJ3RcbiAgICAgICAgICAgIC8vIG1hdGNoLlxuICAgICAgICAgICAgY29uc3Qgc2hhcGUgPSB0ZW5zb3JzWzBdLnNoYXBlO1xuICAgICAgICAgICAgY29uc3Qgc3F1ZWV6ZWRTaGFwZSA9IG9wcy5zcXVlZXplKHRlbnNvcnNbMF0pLnNoYXBlO1xuICAgICAgICAgICAgY29uc3QgbWFwcGVkID0gdGVuc29ycy5tYXAodGVuc29yID0+IHtcbiAgICAgICAgICAgICAgY29uc3Qgc2FtZVNoYXBlID0gdXRpbC5hcnJheXNFcXVhbCh0ZW5zb3Iuc2hhcGUsIHNoYXBlKTtcbiAgICAgICAgICAgICAgaWYgKCFzYW1lU2hhcGUgJiZcbiAgICAgICAgICAgICAgICAgICF1dGlsLmFycmF5c0VxdWFsKFxuICAgICAgICAgICAgICAgICAgICAgIG9wcy5zcXVlZXplKHRlbnNvcikuc2hhcGUsIHNxdWVlemVkU2hhcGUpKSB7XG4gICAgICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKCd0aGUgaW5wdXQgdGVuc29ycyBzaGFwZSBkb2VzIG5vdCBtYXRjaCcpO1xuICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgIHJldHVybiBzYW1lU2hhcGUgPyB0ZW5zb3IgOiBvcHMucmVzaGFwZSh0ZW5zb3IsIHNoYXBlKTtcbiAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgcmV0dXJuIFtvcHMuc3RhY2sobWFwcGVkLCBheGlzKV07XG4gICAgICAgICAgfSk7XG4gICAgICAgIH1cbiAgICAgICAgY2FzZSAnVW5wYWNrJzoge1xuICAgICAgICAgIGNvbnN0IGF4aXMgPVxuICAgICAgICAgICAgICBnZXRQYXJhbVZhbHVlKCdheGlzJywgbm9kZSwgdGVuc29yTWFwLCBjb250ZXh0KSBhcyBudW1iZXI7XG4gICAgICAgICAgY29uc3QgdGVuc29yID1cbiAgICAgICAgICAgICAgZ2V0UGFyYW1WYWx1ZSgndGVuc29yJywgbm9kZSwgdGVuc29yTWFwLCBjb250ZXh0KSBhcyBUZW5zb3I7XG4gICAgICAgICAgcmV0dXJuIG9wcy51bnN0YWNrKHRlbnNvciwgYXhpcyk7XG4gICAgICAgIH1cbiAgICAgICAgY2FzZSAnVGlsZSc6IHtcbiAgICAgICAgICBjb25zdCByZXBzID1cbiAgICAgICAgICAgICAgZ2V0UGFyYW1WYWx1ZSgncmVwcycsIG5vZGUsIHRlbnNvck1hcCwgY29udGV4dCkgYXMgbnVtYmVyW107XG4gICAgICAgICAgcmV0dXJuIFtvcHMudGlsZShcbiAgICAgICAgICAgICAgZ2V0UGFyYW1WYWx1ZSgneCcsIG5vZGUsIHRlbnNvck1hcCwgY29udGV4dCkgYXMgVGVuc29yLCByZXBzKV07XG4gICAgICAgIH1cbiAgICAgICAgY2FzZSAnU3BsaXQnOlxuICAgICAgICBjYXNlICdTcGxpdFYnOiB7XG4gICAgICAgICAgY29uc3QgYXhpcyA9XG4gICAgICAgICAgICAgIGdldFBhcmFtVmFsdWUoJ2F4aXMnLCBub2RlLCB0ZW5zb3JNYXAsIGNvbnRleHQpIGFzIG51bWJlcjtcbiAgICAgICAgICBjb25zdCBudW1PclNpemVTcGxpdHMgPVxuICAgICAgICAgICAgICBnZXRQYXJhbVZhbHVlKCdudW1PclNpemVTcGxpdHMnLCBub2RlLCB0ZW5zb3JNYXAsIGNvbnRleHQpIGFzXG4gICAgICAgICAgICAgICAgICBudW1iZXIgfFxuICAgICAgICAgICAgICBudW1iZXJbXTtcbiAgICAgICAgICBjb25zdCB0ZW5zb3IgPSBnZXRQYXJhbVZhbHVlKCd4Jywgbm9kZSwgdGVuc29yTWFwLCBjb250ZXh0KSBhcyBUZW5zb3I7XG5cbiAgICAgICAgICByZXR1cm4gb3BzLnNwbGl0KHRlbnNvciwgbnVtT3JTaXplU3BsaXRzLCBheGlzKTtcbiAgICAgICAgfVxuICAgICAgICBjYXNlICdTY2F0dGVyTmQnOiB7XG4gICAgICAgICAgY29uc3QgaW5kaWNlcyA9XG4gICAgICAgICAgICAgIGdldFBhcmFtVmFsdWUoJ2luZGljZXMnLCBub2RlLCB0ZW5zb3JNYXAsIGNvbnRleHQpIGFzIFRlbnNvcjtcbiAgICAgICAgICBjb25zdCB2YWx1ZXMgPVxuICAgICAgICAgICAgICBnZXRQYXJhbVZhbHVlKCd2YWx1ZXMnLCBub2RlLCB0ZW5zb3JNYXAsIGNvbnRleHQpIGFzIFRlbnNvcjtcbiAgICAgICAgICBjb25zdCBzaGFwZSA9XG4gICAgICAgICAgICAgIGdldFBhcmFtVmFsdWUoJ3NoYXBlJywgbm9kZSwgdGVuc29yTWFwLCBjb250ZXh0KSBhcyBudW1iZXJbXTtcbiAgICAgICAgICByZXR1cm4gW29wcy5zY2F0dGVyTkQoaW5kaWNlcywgdmFsdWVzLCBzaGFwZSldO1xuICAgICAgICB9XG4gICAgICAgIGNhc2UgJ0dhdGhlck5kJzoge1xuICAgICAgICAgIGNvbnN0IHggPSBnZXRQYXJhbVZhbHVlKCd4Jywgbm9kZSwgdGVuc29yTWFwLCBjb250ZXh0KSBhcyBUZW5zb3I7XG4gICAgICAgICAgY29uc3QgaW5kaWNlcyA9XG4gICAgICAgICAgICAgIGdldFBhcmFtVmFsdWUoJ2luZGljZXMnLCBub2RlLCB0ZW5zb3JNYXAsIGNvbnRleHQpIGFzIFRlbnNvcjtcbiAgICAgICAgICByZXR1cm4gW29wcy5nYXRoZXJORCh4LCBpbmRpY2VzKV07XG4gICAgICAgIH1cbiAgICAgICAgY2FzZSAnU3BhcnNlVG9EZW5zZSc6IHtcbiAgICAgICAgICBjb25zdCBpbmRpY2VzID1cbiAgICAgICAgICAgICAgZ2V0UGFyYW1WYWx1ZSgnc3BhcnNlSW5kaWNlcycsIG5vZGUsIHRlbnNvck1hcCwgY29udGV4dCkgYXNcbiAgICAgICAgICAgICAgVGVuc29yO1xuICAgICAgICAgIGNvbnN0IHNoYXBlID1cbiAgICAgICAgICAgICAgZ2V0UGFyYW1WYWx1ZSgnb3V0cHV0U2hhcGUnLCBub2RlLCB0ZW5zb3JNYXAsIGNvbnRleHQpIGFzXG4gICAgICAgICAgICAgIG51bWJlcltdO1xuICAgICAgICAgIGNvbnN0IHNwYXJzZVZhbHVlcyA9XG4gICAgICAgICAgICAgIGdldFBhcmFtVmFsdWUoJ3NwYXJzZVZhbHVlcycsIG5vZGUsIHRlbnNvck1hcCwgY29udGV4dCkgYXMgVGVuc29yO1xuICAgICAgICAgIGNvbnN0IGRlZmF1bHRWYWx1ZSA9XG4gICAgICAgICAgICAgIGdldFBhcmFtVmFsdWUoJ2RlZmF1bHRWYWx1ZScsIG5vZGUsIHRlbnNvck1hcCwgY29udGV4dCkgYXMgU2NhbGFyO1xuICAgICAgICAgIHJldHVybiBbb3BzLnNwYXJzZVRvRGVuc2UoXG4gICAgICAgICAgICAgIGluZGljZXMsIHNwYXJzZVZhbHVlcywgc2hhcGUsXG4gICAgICAgICAgICAgIHNwYXJzZVZhbHVlcy5kdHlwZSA9PT0gZGVmYXVsdFZhbHVlLmR0eXBlID9cbiAgICAgICAgICAgICAgICAgIGRlZmF1bHRWYWx1ZSA6XG4gICAgICAgICAgICAgICAgICBvcHMuY2FzdChkZWZhdWx0VmFsdWUsIHNwYXJzZVZhbHVlcy5kdHlwZSkpXTtcbiAgICAgICAgfVxuICAgICAgICBkZWZhdWx0OlxuICAgICAgICAgIHRocm93IFR5cGVFcnJvcihgTm9kZSB0eXBlICR7bm9kZS5vcH0gaXMgbm90IGltcGxlbWVudGVkYCk7XG4gICAgICB9XG4gICAgfTtcblxuZXhwb3J0IGNvbnN0IENBVEVHT1JZID0gJ3NsaWNlX2pvaW4nO1xuIl19","/**\n * @license\n * Copyright 2021 Google LLC. All Rights Reserved.\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n * =============================================================================\n */\n// tslint:disable-next-line: no-imports-from-dist\nimport * as tfOps from '@tensorflow/tfjs-core/dist/ops/ops_for_converter';\nimport { getParamValue } from './utils';\nexport const executeOp = (node, tensorMap, context, ops = tfOps) => {\n switch (node.op) {\n case 'SparseFillEmptyRows': {\n const { outputIndices, outputValues, emptyRowIndicator, reverseIndexMap } = ops.sparse.sparseFillEmptyRows(getParamValue('indices', node, tensorMap, context), getParamValue('values', node, tensorMap, context), getParamValue('denseShape', node, tensorMap, context), getParamValue('defaultValue', node, tensorMap, context));\n return [\n outputIndices, outputValues, emptyRowIndicator, reverseIndexMap\n ];\n }\n case 'SparseReshape': {\n const { outputIndices, outputShape } = ops.sparse.sparseReshape(getParamValue('inputIndices', node, tensorMap, context), getParamValue('inputShape', node, tensorMap, context), getParamValue('newShape', node, tensorMap, context));\n return [outputIndices, outputShape];\n }\n case 'SparseSegmentMean': {\n const outputData = ops.sparse.sparseSegmentMean(getParamValue('data', node, tensorMap, context), getParamValue('indices', node, tensorMap, context), getParamValue('segmentIds', node, tensorMap, context));\n return [outputData];\n }\n case 'SparseSegmentSum': {\n const outputData = ops.sparse.sparseSegmentSum(getParamValue('data', node, tensorMap, context), getParamValue('indices', node, tensorMap, context), getParamValue('segmentIds', node, tensorMap, context));\n return [outputData];\n }\n default:\n throw TypeError(`Node type ${node.op} is not implemented`);\n }\n};\nexport const CATEGORY = 'sparse';\n//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic3BhcnNlX2V4ZWN1dG9yLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vLi4vLi4vdGZqcy1jb252ZXJ0ZXIvc3JjL29wZXJhdGlvbnMvZXhlY3V0b3JzL3NwYXJzZV9leGVjdXRvci50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQTs7Ozs7Ozs7Ozs7Ozs7O0dBZUc7QUFHSCxpREFBaUQ7QUFDakQsT0FBTyxLQUFLLEtBQUssTUFBTSxrREFBa0QsQ0FBQztBQU0xRSxPQUFPLEVBQUMsYUFBYSxFQUFDLE1BQU0sU0FBUyxDQUFDO0FBRXRDLE1BQU0sQ0FBQyxNQUFNLFNBQVMsR0FDbEIsQ0FBQyxJQUFVLEVBQUUsU0FBMEIsRUFDdEMsT0FBeUIsRUFBRSxHQUFHLEdBQUcsS0FBSyxFQUFZLEVBQUU7SUFDbkQsUUFBUSxJQUFJLENBQUMsRUFBRSxFQUFFO1FBQ2YsS0FBSyxxQkFBcUIsQ0FBQyxDQUFDO1lBQzFCLE1BQU0sRUFDSixhQUFhLEVBQ2IsWUFBWSxFQUNaLGlCQUFpQixFQUNqQixlQUFlLEVBQ2hCLEdBQ0csR0FBRyxDQUFDLE1BQU0sQ0FBQyxtQkFBbUIsQ0FDMUIsYUFBYSxDQUFDLFNBQVMsRUFBRSxJQUFJLEVBQUUsU0FBUyxFQUFFLE9BQU8sQ0FDckMsRUFDWixhQUFhLENBQUMsUUFBUSxFQUFFLElBQUksRUFBRSxTQUFTLEVBQUUsT0FBTyxDQUFhLEVBQzdELGFBQWEsQ0FBQyxZQUFZLEVBQUUsSUFBSSxFQUFFLFNBQVMsRUFBRSxPQUFPLENBQ3hDLEVBQ1osYUFBYSxDQUFDLGNBQWMsRUFBRSxJQUFJLEVBQUUsU0FBUyxFQUFFLE9BQU8sQ0FDNUMsQ0FBQyxDQUFDO1lBQ3BCLE9BQU87Z0JBQ0wsYUFBYSxFQUFFLFlBQVksRUFBRSxpQkFBaUIsRUFBRSxlQUFlO2FBQ2hFLENBQUM7U0FDSDtRQUNELEtBQUssZUFBZSxDQUFDLENBQUM7WUFDcEIsTUFBTSxFQUFDLGFBQWEsRUFBRSxXQUFXLEVBQUMsR0FBRyxHQUFHLENBQUMsTUFBTSxDQUFDLGFBQWEsQ0FDekQsYUFBYSxDQUFDLGNBQWMsRUFBRSxJQUFJLEVBQUUsU0FBUyxFQUFFLE9BQU8sQ0FDMUMsRUFDWixhQUFhLENBQUMsWUFBWSxFQUFFLElBQUksRUFBRSxTQUFTLEVBQUUsT0FBTyxDQUFhLEVBQ2pFLGFBQWEsQ0FBQyxVQUFVLEVBQUUsSUFBSSxFQUFFLFNBQVMsRUFBRSxPQUFPLENBQWEsQ0FBQyxDQUFDO1lBQ3JFLE9BQU8sQ0FBQyxhQUFhLEVBQUUsV0FBVyxDQUFDLENBQUM7U0FDckM7UUFDRCxLQUFLLG1CQUFtQixDQUFDLENBQUM7WUFDeEIsTUFBTSxVQUFVLEdBQUcsR0FBRyxDQUFDLE1BQU0sQ0FBQyxpQkFBaUIsQ0FDM0MsYUFBYSxDQUFDLE1BQU0sRUFBRSxJQUFJLEVBQUUsU0FBUyxFQUFFLE9BQU8sQ0FBVyxFQUN6RCxhQUFhLENBQUMsU0FBUyxFQUFFLElBQUksRUFBRSxTQUFTLEVBQUUsT0FBTyxDQUFhLEVBQzlELGFBQWEsQ0FBQyxZQUFZLEVBQUUsSUFBSSxFQUFFLFNBQVMsRUFBRSxPQUFPLENBQ3hDLENBQUMsQ0FBQztZQUNsQixPQUFPLENBQUMsVUFBVSxDQUFDLENBQUM7U0FDckI7UUFDRCxLQUFLLGtCQUFrQixDQUFDLENBQUM7WUFDdkIsTUFBTSxVQUFVLEdBQUcsR0FBRyxDQUFDLE1BQU0sQ0FBQyxnQkFBZ0IsQ0FDMUMsYUFBYSxDQUFDLE1BQU0sRUFBRSxJQUFJLEVBQUUsU0FBUyxFQUFFLE9BQU8sQ0FBVyxFQUN6RCxhQUFhLENBQUMsU0FBUyxFQUFFLElBQUksRUFBRSxTQUFTLEVBQUUsT0FBTyxDQUFhLEVBQzlELGFBQWEsQ0FBQyxZQUFZLEVBQUUsSUFBSSxFQUFFLFNBQVMsRUFBRSxPQUFPLENBQ3hDLENBQUMsQ0FBQztZQUNsQixPQUFPLENBQUMsVUFBVSxDQUFDLENBQUM7U0FDckI7UUFDRDtZQUNFLE1BQU0sU0FBUyxDQUFDLGFBQWEsSUFBSSxDQUFDLEVBQUUscUJBQXFCLENBQUMsQ0FBQztLQUM5RDtBQUNILENBQUMsQ0FBQztBQUVOLE1BQU0sQ0FBQyxNQUFNLFFBQVEsR0FBRyxRQUFRLENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyIvKipcbiAqIEBsaWNlbnNlXG4gKiBDb3B5cmlnaHQgMjAyMSBHb29nbGUgTExDLiBBbGwgUmlnaHRzIFJlc2VydmVkLlxuICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlIFwiTGljZW5zZVwiKTtcbiAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS5cbiAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdFxuICpcbiAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMFxuICpcbiAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmVcbiAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuIFwiQVMgSVNcIiBCQVNJUyxcbiAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLlxuICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZFxuICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuXG4gKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuICovXG5cbmltcG9ydCB7U2NhbGFyLCBUZW5zb3IsIFRlbnNvcjFELCBUZW5zb3IyRH0gZnJvbSAnQHRlbnNvcmZsb3cvdGZqcy1jb3JlJztcbi8vIHRzbGludDpkaXNhYmxlLW5leHQtbGluZTogbm8taW1wb3J0cy1mcm9tLWRpc3RcbmltcG9ydCAqIGFzIHRmT3BzIGZyb20gJ0B0ZW5zb3JmbG93L3RmanMtY29yZS9kaXN0L29wcy9vcHNfZm9yX2NvbnZlcnRlcic7XG5cbmltcG9ydCB7TmFtZWRUZW5zb3JzTWFwfSBmcm9tICcuLi8uLi9kYXRhL3R5cGVzJztcbmltcG9ydCB7RXhlY3V0aW9uQ29udGV4dH0gZnJvbSAnLi4vLi4vZXhlY3V0b3IvZXhlY3V0aW9uX2NvbnRleHQnO1xuaW1wb3J0IHtJbnRlcm5hbE9wRXhlY3V0b3IsIE5vZGV9IGZyb20gJy4uL3R5cGVzJztcblxuaW1wb3J0IHtnZXRQYXJhbVZhbHVlfSBmcm9tICcuL3V0aWxzJztcblxuZXhwb3J0IGNvbnN0IGV4ZWN1dGVPcDogSW50ZXJuYWxPcEV4ZWN1dG9yID1cbiAgICAobm9kZTogTm9kZSwgdGVuc29yTWFwOiBOYW1lZFRlbnNvcnNNYXAsXG4gICAgIGNvbnRleHQ6IEV4ZWN1dGlvbkNvbnRleHQsIG9wcyA9IHRmT3BzKTogVGVuc29yW10gPT4ge1xuICAgICAgc3dpdGNoIChub2RlLm9wKSB7XG4gICAgICAgIGNhc2UgJ1NwYXJzZUZpbGxFbXB0eVJvd3MnOiB7XG4gICAgICAgICAgY29uc3Qge1xuICAgICAgICAgICAgb3V0cHV0SW5kaWNlcyxcbiAgICAgICAgICAgIG91dHB1dFZhbHVlcyxcbiAgICAgICAgICAgIGVtcHR5Um93SW5kaWNhdG9yLFxuICAgICAgICAgICAgcmV2ZXJzZUluZGV4TWFwXG4gICAgICAgICAgfSA9XG4gICAgICAgICAgICAgIG9wcy5zcGFyc2Uuc3BhcnNlRmlsbEVtcHR5Um93cyhcbiAgICAgICAgICAgICAgICAgIGdldFBhcmFtVmFsdWUoJ2luZGljZXMnLCBub2RlLCB0ZW5zb3JNYXAsIGNvbnRleHQpIGFzXG4gICAgICAgICAgICAgICAgICAgICAgVGVuc29yMkQsXG4gICAgICAgICAgICAgICAgICBnZXRQYXJhbVZhbHVlKCd2YWx1ZXMnLCBub2RlLCB0ZW5zb3JNYXAsIGNvbnRleHQpIGFzIFRlbnNvcjFELFxuICAgICAgICAgICAgICAgICAgZ2V0UGFyYW1WYWx1ZSgnZGVuc2VTaGFwZScsIG5vZGUsIHRlbnNvck1hcCwgY29udGV4dCkgYXNcbiAgICAgICAgICAgICAgICAgICAgICBUZW5zb3IxRCxcbiAgICAgICAgICAgICAgICAgIGdldFBhcmFtVmFsdWUoJ2RlZmF1bHRWYWx1ZScsIG5vZGUsIHRlbnNvck1hcCwgY29udGV4dCkgYXNcbiAgICAgICAgICAgICAgICAgICAgICBTY2FsYXIpO1xuICAgICAgICAgIHJldHVybiBbXG4gICAgICAgICAgICBvdXRwdXRJbmRpY2VzLCBvdXRwdXRWYWx1ZXMsIGVtcHR5Um93SW5kaWNhdG9yLCByZXZlcnNlSW5kZXhNYXBcbiAgICAgICAgICBdO1xuICAgICAgICB9XG4gICAgICAgIGNhc2UgJ1NwYXJzZVJlc2hhcGUnOiB7XG4gICAgICAgICAgY29uc3Qge291dHB1dEluZGljZXMsIG91dHB1dFNoYXBlfSA9IG9wcy5zcGFyc2Uuc3BhcnNlUmVzaGFwZShcbiAgICAgICAgICAgICAgZ2V0UGFyYW1WYWx1ZSgnaW5wdXRJbmRpY2VzJywgbm9kZSwgdGVuc29yTWFwLCBjb250ZXh0KSBhc1xuICAgICAgICAgICAgICAgICAgVGVuc29yMkQsXG4gICAgICAgICAgICAgIGdldFBhcmFtVmFsdWUoJ2lucHV0U2hhcGUnLCBub2RlLCB0ZW5zb3JNYXAsIGNvbnRleHQpIGFzIFRlbnNvcjFELFxuICAgICAgICAgICAgICBnZXRQYXJhbVZhbHVlKCduZXdTaGFwZScsIG5vZGUsIHRlbnNvck1hcCwgY29udGV4dCkgYXMgVGVuc29yMUQpO1xuICAgICAgICAgIHJldHVybiBbb3V0cHV0SW5kaWNlcywgb3V0cHV0U2hhcGVdO1xuICAgICAgICB9XG4gICAgICAgIGNhc2UgJ1NwYXJzZVNlZ21lbnRNZWFuJzoge1xuICAgICAgICAgIGNvbnN0IG91dHB1dERhdGEgPSBvcHMuc3BhcnNlLnNwYXJzZVNlZ21lbnRNZWFuKFxuICAgICAgICAgICAgICBnZXRQYXJhbVZhbHVlKCdkYXRhJywgbm9kZSwgdGVuc29yTWFwLCBjb250ZXh0KSBhcyBUZW5zb3IsXG4gICAgICAgICAgICAgIGdldFBhcmFtVmFsdWUoJ2luZGljZXMnLCBub2RlLCB0ZW5zb3JNYXAsIGNvbnRleHQpIGFzIFRlbnNvcjFELFxuICAgICAgICAgICAgICBnZXRQYXJhbVZhbHVlKCdzZWdtZW50SWRzJywgbm9kZSwgdGVuc29yTWFwLCBjb250ZXh0KSBhc1xuICAgICAgICAgICAgICAgICAgVGVuc29yMUQpO1xuICAgICAgICAgIHJldHVybiBbb3V0cHV0RGF0YV07XG4gICAgICAgIH1cbiAgICAgICAgY2FzZSAnU3BhcnNlU2VnbWVudFN1bSc6IHtcbiAgICAgICAgICBjb25zdCBvdXRwdXREYXRhID0gb3BzLnNwYXJzZS5zcGFyc2VTZWdtZW50U3VtKFxuICAgICAgICAgICAgICBnZXRQYXJhbVZhbHVlKCdkYXRhJywgbm9kZSwgdGVuc29yTWFwLCBjb250ZXh0KSBhcyBUZW5zb3IsXG4gICAgICAgICAgICAgIGdldFBhcmFtVmFsdWUoJ2luZGljZXMnLCBub2RlLCB0ZW5zb3JNYXAsIGNvbnRleHQpIGFzIFRlbnNvcjFELFxuICAgICAgICAgICAgICBnZXRQYXJhbVZhbHVlKCdzZWdtZW50SWRzJywgbm9kZSwgdGVuc29yTWFwLCBjb250ZXh0KSBhc1xuICAgICAgICAgICAgICAgICAgVGVuc29yMUQpO1xuICAgICAgICAgIHJldHVybiBbb3V0cHV0RGF0YV07XG4gICAgICAgIH1cbiAgICAgICAgZGVmYXVsdDpcbiAgICAgICAgICB0aHJvdyBUeXBlRXJyb3IoYE5vZGUgdHlwZSAke25vZGUub3B9IGlzIG5vdCBpbXBsZW1lbnRlZGApO1xuICAgICAgfVxuICAgIH07XG5cbmV4cG9ydCBjb25zdCBDQVRFR09SWSA9ICdzcGFyc2UnO1xuIl19","/**\n * @license\n * Copyright 2018 Google LLC. All Rights Reserved.\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n * =============================================================================\n */\n// tslint:disable-next-line: no-imports-from-dist\nimport * as tfOps from '@tensorflow/tfjs-core/dist/ops/ops_for_converter';\nimport { getParamValue } from './utils';\nexport const executeOp = (node, tensorMap, context, ops = tfOps) => {\n switch (node.op) {\n case 'FFT': {\n return [ops.fft(getParamValue('x', node, tensorMap, context))];\n }\n case 'IFFT': {\n return [ops.ifft(getParamValue('x', node, tensorMap, context))];\n }\n case 'RFFT': {\n return [ops.rfft(getParamValue('x', node, tensorMap, context))];\n }\n case 'IRFFT': {\n return [ops.irfft(getParamValue('x', node, tensorMap, context))];\n }\n default:\n throw TypeError(`Node type ${node.op} is not implemented`);\n }\n};\nexport const CATEGORY = 'spectral';\n//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic3BlY3RyYWxfZXhlY3V0b3IuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi8uLi8uLi90ZmpzLWNvbnZlcnRlci9zcmMvb3BlcmF0aW9ucy9leGVjdXRvcnMvc3BlY3RyYWxfZXhlY3V0b3IudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUE7Ozs7Ozs7Ozs7Ozs7OztHQWVHO0FBR0gsaURBQWlEO0FBQ2pELE9BQU8sS0FBSyxLQUFLLE1BQU0sa0RBQWtELENBQUM7QUFNMUUsT0FBTyxFQUFDLGFBQWEsRUFBQyxNQUFNLFNBQVMsQ0FBQztBQUV0QyxNQUFNLENBQUMsTUFBTSxTQUFTLEdBQ2xCLENBQUMsSUFBVSxFQUFFLFNBQTBCLEVBQUUsT0FBeUIsRUFDakUsR0FBRyxHQUFHLEtBQUssRUFBWSxFQUFFO0lBQ3BCLFFBQVEsSUFBSSxDQUFDLEVBQUUsRUFBRTtRQUNmLEtBQUssS0FBSyxDQUFDLENBQUM7WUFDVixPQUFPLENBQUMsR0FBRyxDQUFDLEdBQUcsQ0FDWCxhQUFhLENBQUMsR0FBRyxFQUFFLElBQUksRUFBRSxTQUFTLEVBQUUsT0FBTyxDQUFXLENBQUMsQ0FBQyxDQUFDO1NBQzlEO1FBQ0QsS0FBSyxNQUFNLENBQUMsQ0FBQztZQUNYLE9BQU8sQ0FBQyxHQUFHLENBQUMsSUFBSSxDQUNaLGFBQWEsQ0FBQyxHQUFHLEVBQUUsSUFBSSxFQUFFLFNBQVMsRUFBRSxPQUFPLENBQVcsQ0FBQyxDQUFDLENBQUM7U0FDOUQ7UUFDRCxLQUFLLE1BQU0sQ0FBQyxDQUFDO1lBQ1gsT0FBTyxDQUFDLEdBQUcsQ0FBQyxJQUFJLENBQ1osYUFBYSxDQUFDLEdBQUcsRUFBRSxJQUFJLEVBQUUsU0FBUyxFQUFFLE9BQU8sQ0FBVyxDQUFDLENBQUMsQ0FBQztTQUM5RDtRQUNELEtBQUssT0FBTyxDQUFDLENBQUM7WUFDWixPQUFPLENBQUMsR0FBRyxDQUFDLEtBQUssQ0FDYixhQUFhLENBQUMsR0FBRyxFQUFFLElBQUksRUFBRSxTQUFTLEVBQUUsT0FBTyxDQUFXLENBQUMsQ0FBQyxDQUFDO1NBQzlEO1FBQ0Q7WUFDRSxNQUFNLFNBQVMsQ0FBQyxhQUFhLElBQUksQ0FBQyxFQUFFLHFCQUFxQixDQUFDLENBQUM7S0FDOUQ7QUFDSCxDQUFDLENBQUM7QUFFVixNQUFNLENBQUMsTUFBTSxRQUFRLEdBQUcsVUFBVSxDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiLyoqXG4gKiBAbGljZW5zZVxuICogQ29weXJpZ2h0IDIwMTggR29vZ2xlIExMQy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC5cbiAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSBcIkxpY2Vuc2VcIik7XG4gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuXG4gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXRcbiAqXG4gKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjBcbiAqXG4gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlXG4gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiBcIkFTIElTXCIgQkFTSVMsXG4gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC5cbiAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmRcbiAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLlxuICogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbiAqL1xuXG5pbXBvcnQge1RlbnNvcn0gZnJvbSAnQHRlbnNvcmZsb3cvdGZqcy1jb3JlJztcbi8vIHRzbGludDpkaXNhYmxlLW5leHQtbGluZTogbm8taW1wb3J0cy1mcm9tLWRpc3RcbmltcG9ydCAqIGFzIHRmT3BzIGZyb20gJ0B0ZW5zb3JmbG93L3RmanMtY29yZS9kaXN0L29wcy9vcHNfZm9yX2NvbnZlcnRlcic7XG5cbmltcG9ydCB7TmFtZWRUZW5zb3JzTWFwfSBmcm9tICcuLi8uLi9kYXRhL3R5cGVzJztcbmltcG9ydCB7RXhlY3V0aW9uQ29udGV4dH0gZnJvbSAnLi4vLi4vZXhlY3V0b3IvZXhlY3V0aW9uX2NvbnRleHQnO1xuaW1wb3J0IHtJbnRlcm5hbE9wRXhlY3V0b3IsIE5vZGV9IGZyb20gJy4uL3R5cGVzJztcblxuaW1wb3J0IHtnZXRQYXJhbVZhbHVlfSBmcm9tICcuL3V0aWxzJztcblxuZXhwb3J0IGNvbnN0IGV4ZWN1dGVPcDogSW50ZXJuYWxPcEV4ZWN1dG9yID1cbiAgICAobm9kZTogTm9kZSwgdGVuc29yTWFwOiBOYW1lZFRlbnNvcnNNYXAsIGNvbnRleHQ6IEV4ZWN1dGlvbkNvbnRleHQsXG4gICAgIG9wcyA9IHRmT3BzKTogVGVuc29yW10gPT4ge1xuICAgICAgICAgIHN3aXRjaCAobm9kZS5vcCkge1xuICAgICAgICAgICAgY2FzZSAnRkZUJzoge1xuICAgICAgICAgICAgICByZXR1cm4gW29wcy5mZnQoXG4gICAgICAgICAgICAgICAgICBnZXRQYXJhbVZhbHVlKCd4Jywgbm9kZSwgdGVuc29yTWFwLCBjb250ZXh0KSBhcyBUZW5zb3IpXTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGNhc2UgJ0lGRlQnOiB7XG4gICAgICAgICAgICAgIHJldHVybiBbb3BzLmlmZnQoXG4gICAgICAgICAgICAgICAgICBnZXRQYXJhbVZhbHVlKCd4Jywgbm9kZSwgdGVuc29yTWFwLCBjb250ZXh0KSBhcyBUZW5zb3IpXTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGNhc2UgJ1JGRlQnOiB7XG4gICAgICAgICAgICAgIHJldHVybiBbb3BzLnJmZnQoXG4gICAgICAgICAgICAgICAgICBnZXRQYXJhbVZhbHVlKCd4Jywgbm9kZSwgdGVuc29yTWFwLCBjb250ZXh0KSBhcyBUZW5zb3IpXTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGNhc2UgJ0lSRkZUJzoge1xuICAgICAgICAgICAgICByZXR1cm4gW29wcy5pcmZmdChcbiAgICAgICAgICAgICAgICAgIGdldFBhcmFtVmFsdWUoJ3gnLCBub2RlLCB0ZW5zb3JNYXAsIGNvbnRleHQpIGFzIFRlbnNvcildO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgZGVmYXVsdDpcbiAgICAgICAgICAgICAgdGhyb3cgVHlwZUVycm9yKGBOb2RlIHR5cGUgJHtub2RlLm9wfSBpcyBub3QgaW1wbGVtZW50ZWRgKTtcbiAgICAgICAgICB9XG4gICAgICAgIH07XG5cbmV4cG9ydCBjb25zdCBDQVRFR09SWSA9ICdzcGVjdHJhbCc7XG4iXX0=","/**\n * @license\n * Copyright 2021 Google LLC. All Rights Reserved.\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n * =============================================================================\n */\n// tslint:disable-next-line: no-imports-from-dist\nimport * as tfOps from '@tensorflow/tfjs-core/dist/ops/ops_for_converter';\nimport { getParamValue } from './utils';\nexport const executeOp = (node, tensorMap, context, ops = tfOps) => {\n switch (node.op) {\n case 'StringNGrams': {\n const { nGrams, nGramsSplits } = ops.string.stringNGrams(getParamValue('data', node, tensorMap, context), getParamValue('dataSplits', node, tensorMap, context), getParamValue('separator', node, tensorMap, context), getParamValue('nGramWidths', node, tensorMap, context), getParamValue('leftPad', node, tensorMap, context), getParamValue('rightPad', node, tensorMap, context), getParamValue('padWidth', node, tensorMap, context), getParamValue('preserveShortSequences', node, tensorMap, context));\n return [nGrams, nGramsSplits];\n }\n case 'StringSplit': {\n const { indices, values, shape } = ops.string.stringSplit(getParamValue('input', node, tensorMap, context), getParamValue('delimiter', node, tensorMap, context), getParamValue('skipEmpty', node, tensorMap, context));\n return [indices, values, shape];\n }\n case 'StringToHashBucketFast': {\n const output = ops.string.stringToHashBucketFast(getParamValue('input', node, tensorMap, context), getParamValue('numBuckets', node, tensorMap, context));\n return [output];\n }\n default:\n throw TypeError(`Node type ${node.op} is not implemented`);\n }\n};\nexport const CATEGORY = 'string';\n//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic3RyaW5nX2V4ZWN1dG9yLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vLi4vLi4vdGZqcy1jb252ZXJ0ZXIvc3JjL29wZXJhdGlvbnMvZXhlY3V0b3JzL3N0cmluZ19leGVjdXRvci50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQTs7Ozs7Ozs7Ozs7Ozs7O0dBZUc7QUFHSCxpREFBaUQ7QUFDakQsT0FBTyxLQUFLLEtBQUssTUFBTSxrREFBa0QsQ0FBQztBQU0xRSxPQUFPLEVBQUMsYUFBYSxFQUFDLE1BQU0sU0FBUyxDQUFDO0FBRXRDLE1BQU0sQ0FBQyxNQUFNLFNBQVMsR0FDbEIsQ0FBQyxJQUFVLEVBQUUsU0FBMEIsRUFDdEMsT0FBeUIsRUFBRSxHQUFHLEdBQUcsS0FBSyxFQUFZLEVBQUU7SUFDbkQsUUFBUSxJQUFJLENBQUMsRUFBRSxFQUFFO1FBQ2YsS0FBSyxjQUFjLENBQUMsQ0FBQztZQUNuQixNQUFNLEVBQUMsTUFBTSxFQUFFLFlBQVksRUFBQyxHQUFHLEdBQUcsQ0FBQyxNQUFNLENBQUMsWUFBWSxDQUNsRCxhQUFhLENBQUMsTUFBTSxFQUFFLElBQUksRUFBRSxTQUFTLEVBQUUsT0FBTyxDQUFhLEVBQzNELGFBQWEsQ0FBQyxZQUFZLEVBQUUsSUFBSSxFQUFFLFNBQVMsRUFBRSxPQUFPLENBQVcsRUFDL0QsYUFBYSxDQUFDLFdBQVcsRUFBRSxJQUFJLEVBQUUsU0FBUyxFQUFFLE9BQU8sQ0FBVyxFQUM5RCxhQUFhLENBQUMsYUFBYSxFQUFFLElBQUksRUFBRSxTQUFTLEVBQUUsT0FBTyxDQUN6QyxFQUNaLGFBQWEsQ0FBQyxTQUFTLEVBQUUsSUFBSSxFQUFFLFNBQVMsRUFBRSxPQUFPLENBQVcsRUFDNUQsYUFBYSxDQUFDLFVBQVUsRUFBRSxJQUFJLEVBQUUsU0FBUyxFQUFFLE9BQU8sQ0FBVyxFQUM3RCxhQUFhLENBQUMsVUFBVSxFQUFFLElBQUksRUFBRSxTQUFTLEVBQUUsT0FBTyxDQUFXLEVBQzdELGFBQWEsQ0FDVCx3QkFBd0IsRUFBRSxJQUFJLEVBQUUsU0FBUyxFQUFFLE9BQU8sQ0FDM0MsQ0FBQyxDQUFDO1lBQ2pCLE9BQU8sQ0FBQyxNQUFNLEVBQUUsWUFBWSxDQUFDLENBQUM7U0FDL0I7UUFDRCxLQUFLLGFBQWEsQ0FBQyxDQUFDO1lBQ2xCLE1BQU0sRUFBQyxPQUFPLEVBQUUsTUFBTSxFQUFFLEtBQUssRUFBQyxHQUFHLEdBQUcsQ0FBQyxNQUFNLENBQUMsV0FBVyxDQUNuRCxhQUFhLENBQUMsT0FBTyxFQUFFLElBQUksRUFBRSxTQUFTLEVBQUUsT0FBTyxDQUFhLEVBQzVELGFBQWEsQ0FBQyxXQUFXLEVBQUUsSUFBSSxFQUFFLFNBQVMsRUFBRSxPQUFPLENBQVcsRUFDOUQsYUFBYSxDQUFDLFdBQVcsRUFBRSxJQUFJLEVBQUUsU0FBUyxFQUFFLE9BQU8sQ0FBWSxDQUFDLENBQUM7WUFDckUsT0FBTyxDQUFDLE9BQU8sRUFBRSxNQUFNLEVBQUUsS0FBSyxDQUFDLENBQUM7U0FDakM7UUFDRCxLQUFLLHdCQUF3QixDQUFDLENBQUM7WUFDN0IsTUFBTSxNQUFNLEdBQUcsR0FBRyxDQUFDLE1BQU0sQ0FBQyxzQkFBc0IsQ0FDNUMsYUFBYSxDQUFDLE9BQU8sRUFBRSxJQUFJLEVBQUUsU0FBUyxFQUFFLE9BQU8sQ0FBVyxFQUMxRCxhQUFhLENBQUMsWUFBWSxFQUFFLElBQUksRUFBRSxTQUFTLEVBQUUsT0FBTyxDQUFXLENBQUMsQ0FBQztZQUNyRSxPQUFPLENBQUMsTUFBTSxDQUFDLENBQUM7U0FDakI7UUFDRDtZQUNFLE1BQU0sU0FBUyxDQUFDLGFBQWEsSUFBSSxDQUFDLEVBQUUscUJBQXFCLENBQUMsQ0FBQztLQUM5RDtBQUNILENBQUMsQ0FBQztBQUVOLE1BQU0sQ0FBQyxNQUFNLFFBQVEsR0FBRyxRQUFRLENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyIvKipcbiAqIEBsaWNlbnNlXG4gKiBDb3B5cmlnaHQgMjAyMSBHb29nbGUgTExDLiBBbGwgUmlnaHRzIFJlc2VydmVkLlxuICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlIFwiTGljZW5zZVwiKTtcbiAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS5cbiAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdFxuICpcbiAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMFxuICpcbiAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmVcbiAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuIFwiQVMgSVNcIiBCQVNJUyxcbiAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLlxuICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZFxuICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuXG4gKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuICovXG5cbmltcG9ydCB7U2NhbGFyLCBUZW5zb3IsIFRlbnNvcjFEfSBmcm9tICdAdGVuc29yZmxvdy90ZmpzLWNvcmUnO1xuLy8gdHNsaW50OmRpc2FibGUtbmV4dC1saW5lOiBuby1pbXBvcnRzLWZyb20tZGlzdFxuaW1wb3J0ICogYXMgdGZPcHMgZnJvbSAnQHRlbnNvcmZsb3cvdGZqcy1jb3JlL2Rpc3Qvb3BzL29wc19mb3JfY29udmVydGVyJztcblxuaW1wb3J0IHtOYW1lZFRlbnNvcnNNYXB9IGZyb20gJy4uLy4uL2RhdGEvdHlwZXMnO1xuaW1wb3J0IHtFeGVjdXRpb25Db250ZXh0fSBmcm9tICcuLi8uLi9leGVjdXRvci9leGVjdXRpb25fY29udGV4dCc7XG5pbXBvcnQge0ludGVybmFsT3BFeGVjdXRvciwgTm9kZX0gZnJvbSAnLi4vdHlwZXMnO1xuXG5pbXBvcnQge2dldFBhcmFtVmFsdWV9IGZyb20gJy4vdXRpbHMnO1xuXG5leHBvcnQgY29uc3QgZXhlY3V0ZU9wOiBJbnRlcm5hbE9wRXhlY3V0b3IgPVxuICAgIChub2RlOiBOb2RlLCB0ZW5zb3JNYXA6IE5hbWVkVGVuc29yc01hcCxcbiAgICAgY29udGV4dDogRXhlY3V0aW9uQ29udGV4dCwgb3BzID0gdGZPcHMpOiBUZW5zb3JbXSA9PiB7XG4gICAgICBzd2l0Y2ggKG5vZGUub3ApIHtcbiAgICAgICAgY2FzZSAnU3RyaW5nTkdyYW1zJzoge1xuICAgICAgICAgIGNvbnN0IHtuR3JhbXMsIG5HcmFtc1NwbGl0c30gPSBvcHMuc3RyaW5nLnN0cmluZ05HcmFtcyhcbiAgICAgICAgICAgICAgZ2V0UGFyYW1WYWx1ZSgnZGF0YScsIG5vZGUsIHRlbnNvck1hcCwgY29udGV4dCkgYXMgVGVuc29yMUQsXG4gICAgICAgICAgICAgIGdldFBhcmFtVmFsdWUoJ2RhdGFTcGxpdHMnLCBub2RlLCB0ZW5zb3JNYXAsIGNvbnRleHQpIGFzIFRlbnNvcixcbiAgICAgICAgICAgICAgZ2V0UGFyYW1WYWx1ZSgnc2VwYXJhdG9yJywgbm9kZSwgdGVuc29yTWFwLCBjb250ZXh0KSBhcyBzdHJpbmcsXG4gICAgICAgICAgICAgIGdldFBhcmFtVmFsdWUoJ25HcmFtV2lkdGhzJywgbm9kZSwgdGVuc29yTWFwLCBjb250ZXh0KSBhc1xuICAgICAgICAgICAgICAgICAgbnVtYmVyW10sXG4gICAgICAgICAgICAgIGdldFBhcmFtVmFsdWUoJ2xlZnRQYWQnLCBub2RlLCB0ZW5zb3JNYXAsIGNvbnRleHQpIGFzIHN0cmluZyxcbiAgICAgICAgICAgICAgZ2V0UGFyYW1WYWx1ZSgncmlnaHRQYWQnLCBub2RlLCB0ZW5zb3JNYXAsIGNvbnRleHQpIGFzIHN0cmluZyxcbiAgICAgICAgICAgICAgZ2V0UGFyYW1WYWx1ZSgncGFkV2lkdGgnLCBub2RlLCB0ZW5zb3JNYXAsIGNvbnRleHQpIGFzIG51bWJlcixcbiAgICAgICAgICAgICAgZ2V0UGFyYW1WYWx1ZShcbiAgICAgICAgICAgICAgICAgICdwcmVzZXJ2ZVNob3J0U2VxdWVuY2VzJywgbm9kZSwgdGVuc29yTWFwLCBjb250ZXh0KSBhc1xuICAgICAgICAgICAgICAgICAgYm9vbGVhbik7XG4gICAgICAgICAgcmV0dXJuIFtuR3JhbXMsIG5HcmFtc1NwbGl0c107XG4gICAgICAgIH1cbiAgICAgICAgY2FzZSAnU3RyaW5nU3BsaXQnOiB7XG4gICAgICAgICAgY29uc3Qge2luZGljZXMsIHZhbHVlcywgc2hhcGV9ID0gb3BzLnN0cmluZy5zdHJpbmdTcGxpdChcbiAgICAgICAgICAgICAgZ2V0UGFyYW1WYWx1ZSgnaW5wdXQnLCBub2RlLCB0ZW5zb3JNYXAsIGNvbnRleHQpIGFzIFRlbnNvcjFELFxuICAgICAgICAgICAgICBnZXRQYXJhbVZhbHVlKCdkZWxpbWl0ZXInLCBub2RlLCB0ZW5zb3JNYXAsIGNvbnRleHQpIGFzIFNjYWxhcixcbiAgICAgICAgICAgICAgZ2V0UGFyYW1WYWx1ZSgnc2tpcEVtcHR5Jywgbm9kZSwgdGVuc29yTWFwLCBjb250ZXh0KSBhcyBib29sZWFuKTtcbiAgICAgICAgICByZXR1cm4gW2luZGljZXMsIHZhbHVlcywgc2hhcGVdO1xuICAgICAgICB9XG4gICAgICAgIGNhc2UgJ1N0cmluZ1RvSGFzaEJ1Y2tldEZhc3QnOiB7XG4gICAgICAgICAgY29uc3Qgb3V0cHV0ID0gb3BzLnN0cmluZy5zdHJpbmdUb0hhc2hCdWNrZXRGYXN0KFxuICAgICAgICAgICAgICBnZXRQYXJhbVZhbHVlKCdpbnB1dCcsIG5vZGUsIHRlbnNvck1hcCwgY29udGV4dCkgYXMgVGVuc29yLFxuICAgICAgICAgICAgICBnZXRQYXJhbVZhbHVlKCdudW1CdWNrZXRzJywgbm9kZSwgdGVuc29yTWFwLCBjb250ZXh0KSBhcyBudW1iZXIpO1xuICAgICAgICAgIHJldHVybiBbb3V0cHV0XTtcbiAgICAgICAgfVxuICAgICAgICBkZWZhdWx0OlxuICAgICAgICAgIHRocm93IFR5cGVFcnJvcihgTm9kZSB0eXBlICR7bm9kZS5vcH0gaXMgbm90IGltcGxlbWVudGVkYCk7XG4gICAgICB9XG4gICAgfTtcblxuZXhwb3J0IGNvbnN0IENBVEVHT1JZID0gJ3N0cmluZyc7XG4iXX0=","/**\n * @license\n * Copyright 2018 Google LLC. All Rights Reserved.\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n * =============================================================================\n */\n// tslint:disable-next-line: no-imports-from-dist\nimport * as tfOps from '@tensorflow/tfjs-core/dist/ops/ops_for_converter';\nimport { getParamValue } from './utils';\nexport const executeOp = (node, tensorMap, context, ops = tfOps) => {\n switch (node.op) {\n case 'Cast': {\n return [ops.cast(getParamValue('x', node, tensorMap, context), getParamValue('dtype', node, tensorMap, context))];\n }\n case 'ExpandDims': {\n const axis = getParamValue('axis', node, tensorMap, context);\n return [ops.expandDims(getParamValue('x', node, tensorMap, context), axis)];\n }\n case 'Squeeze': {\n const axis = getParamValue('axis', node, tensorMap, context);\n return [ops.squeeze(getParamValue('x', node, tensorMap, context), axis)];\n }\n case 'Reshape': {\n return [ops.reshape(getParamValue('x', node, tensorMap, context), getParamValue('shape', node, tensorMap, context))];\n }\n case 'MirrorPad': {\n return [ops.mirrorPad(getParamValue('x', node, tensorMap, context), getParamValue('padding', node, tensorMap, context), getParamValue('mode', node, tensorMap, context))];\n }\n case 'PadV2':\n case 'Pad': {\n return [ops.pad(getParamValue('x', node, tensorMap, context), getParamValue('padding', node, tensorMap, context), getParamValue('constantValue', node, tensorMap, context))];\n }\n case 'SpaceToBatchND': {\n const blockShape = getParamValue('blockShape', node, tensorMap, context);\n const paddings = getParamValue('paddings', node, tensorMap, context);\n return [ops.spaceToBatchND(getParamValue('x', node, tensorMap, context), blockShape, paddings)];\n }\n case 'BatchToSpaceND': {\n const blockShape = getParamValue('blockShape', node, tensorMap, context);\n const crops = getParamValue('crops', node, tensorMap, context);\n return [ops.batchToSpaceND(getParamValue('x', node, tensorMap, context), blockShape, crops)];\n }\n case 'DepthToSpace': {\n const blockSize = getParamValue('blockSize', node, tensorMap, context);\n const dataFormat = getParamValue('dataFormat', node, tensorMap, context).toUpperCase();\n return [ops.depthToSpace(getParamValue('x', node, tensorMap, context), blockSize, dataFormat)];\n }\n case 'BroadcastTo': {\n return [ops.broadcastTo(getParamValue('x', node, tensorMap, context), getParamValue('shape', node, tensorMap, context))];\n }\n case 'BroadcastArgs': {\n return [ops.broadcastArgs(getParamValue('s0', node, tensorMap, context), getParamValue('s1', node, tensorMap, context))];\n }\n default:\n throw TypeError(`Node type ${node.op} is not implemented`);\n }\n};\nexport const CATEGORY = 'transformation';\n//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidHJhbnNmb3JtYXRpb25fZXhlY3V0b3IuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi8uLi8uLi90ZmpzLWNvbnZlcnRlci9zcmMvb3BlcmF0aW9ucy9leGVjdXRvcnMvdHJhbnNmb3JtYXRpb25fZXhlY3V0b3IudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUE7Ozs7Ozs7Ozs7Ozs7OztHQWVHO0FBR0gsaURBQWlEO0FBQ2pELE9BQU8sS0FBSyxLQUFLLE1BQU0sa0RBQWtELENBQUM7QUFNMUUsT0FBTyxFQUFDLGFBQWEsRUFBQyxNQUFNLFNBQVMsQ0FBQztBQUV0QyxNQUFNLENBQUMsTUFBTSxTQUFTLEdBQ2xCLENBQUMsSUFBVSxFQUFFLFNBQTBCLEVBQ3RDLE9BQXlCLEVBQUUsR0FBRyxHQUFHLEtBQUssRUFBWSxFQUFFO0lBQ25ELFFBQVEsSUFBSSxDQUFDLEVBQUUsRUFBRTtRQUNmLEtBQUssTUFBTSxDQUFDLENBQUM7WUFDWCxPQUFPLENBQUMsR0FBRyxDQUFDLElBQUksQ0FDWixhQUFhLENBQUMsR0FBRyxFQUFFLElBQUksRUFBRSxTQUFTLEVBQUUsT0FBTyxDQUFXLEVBQ3RELGFBQWEsQ0FBQyxPQUFPLEVBQUUsSUFBSSxFQUFFLFNBQVMsRUFBRSxPQUFPLENBQ3pCLENBQUMsQ0FBQyxDQUFDO1NBQzlCO1FBQ0QsS0FBSyxZQUFZLENBQUMsQ0FBQztZQUNqQixNQUFNLElBQUksR0FDTixhQUFhLENBQUMsTUFBTSxFQUFFLElBQUksRUFBRSxTQUFTLEVBQUUsT0FBTyxDQUFXLENBQUM7WUFDOUQsT0FBTyxDQUFDLEdBQUcsQ0FBQyxVQUFVLENBQ2xCLGFBQWEsQ0FBQyxHQUFHLEVBQUUsSUFBSSxFQUFFLFNBQVMsRUFBRSxPQUFPLENBQVcsRUFBRSxJQUFJLENBQUMsQ0FBQyxDQUFDO1NBQ3BFO1FBQ0QsS0FBSyxTQUFTLENBQUMsQ0FBQztZQUNkLE1BQU0sSUFBSSxHQUNOLGFBQWEsQ0FBQyxNQUFNLEVB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LGFBQWEsQ0FBQyxDQUFDO1lBQ2xCLE9BQU8sQ0FBQyxHQUFHLENBQUMsV0FBVyxDQUNuQixhQUFhLENBQUMsR0FBRyxFQUFFLElBQUksRUFBRSxTQUFTLEVBQUUsT0FBTyxDQUFXLEVBQ3RELGFBQWEsQ0FBQyxPQUFPLEVBQUUsSUFBSSxFQUFFLFNBQVMsRUFBRSxPQUFPLENBQWEsQ0FBQyxDQUFDLENBQUM7U0FDcEU7UUFDRCxLQUFLLGVBQWUsQ0FBQyxDQUFDO1lBQ3BCLE9BQU8sQ0FBQyxHQUFHLENBQUMsYUFBYSxDQUNyQixhQUFhLENBQUMsSUFBSSxFQUFFLElBQUksRUFBRSxTQUFTLEVBQUUsT0FBTyxDQUFXLEVBQ3ZELGFBQWEsQ0FBQyxJQUFJLEVBQUUsSUFBSSxFQUFFLFNBQVMsRUFBRSxPQUFPLENBQVcsQ0FBQyxDQUFDLENBQUM7U0FDL0Q7UUFDRDtZQUNFLE1BQU0sU0FBUyxDQUFDLGFBQWEsSUFBSSxDQUFDLEVBQUUscUJBQXFCLENBQUMsQ0FBQztLQUM5RDtBQUNILENBQUMsQ0FBQztBQUVOLE1BQU0sQ0FBQyxNQUFNLFFBQVEsR0FBRyxnQkFBZ0IsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbIi8qKlxuICogQGxpY2Vuc2VcbiAqIENvcHlyaWdodCAyMDE4IEdvb2dsZSBMTEMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuXG4gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgXCJMaWNlbnNlXCIpO1xuICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLlxuICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0XG4gKlxuICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wXG4gKlxuICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZVxuICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gXCJBUyBJU1wiIEJBU0lTLFxuICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuXG4gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kXG4gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS5cbiAqID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4gKi9cblxuaW1wb3J0IHtUZW5zb3IsIFRlbnNvcjREfSBmcm9tICdAdGVuc29yZmxvdy90ZmpzLWNvcmUnO1xuLy8gdHNsaW50OmRpc2FibGUtbmV4dC1saW5lOiBuby1pbXBvcnRzLWZyb20tZGlzdFxuaW1wb3J0ICogYXMgdGZPcHMgZnJvbSAnQHRlbnNvcmZsb3cvdGZqcy1jb3JlL2Rpc3Qvb3BzL29wc19mb3JfY29udmVydGVyJztcblxuaW1wb3J0IHtOYW1lZFRlbnNvcnNNYXB9IGZyb20gJy4uLy4uL2RhdGEvdHlwZXMnO1xuaW1wb3J0IHtFeGVjdXRpb25Db250ZXh0fSBmcm9tICcuLi8uLi9leGVjdXRvci9leGVjdXRpb25fY29udGV4dCc7XG5pbXBvcnQge0ludGVybmFsT3BFeGVjdXRvciwgTm9kZX0gZnJvbSAnLi4vdHlwZXMnO1xuXG5pbXBvcnQge2dldFBhcmFtVmFsdWV9IGZyb20gJy4vdXRpbHMnO1xuXG5leHBvcnQgY29uc3QgZXhlY3V0ZU9wOiBJbnRlcm5hbE9wRXhlY3V0b3IgPVxuICAgIChub2RlOiBOb2RlLCB0ZW5zb3JNYXA6IE5hbWVkVGVuc29yc01hcCxcbiAgICAgY29udGV4dDogRXhlY3V0aW9uQ29udGV4dCwgb3BzID0gdGZPcHMpOiBUZW5zb3JbXSA9PiB7XG4gICAgICBzd2l0Y2ggKG5vZGUub3ApIHtcbiAgICAgICAgY2FzZSAnQ2FzdCc6IHtcbiAgICAgICAgICByZXR1cm4gW29wcy5jYXN0KFxuICAgICAgICAgICAgICBnZXRQYXJhbVZhbHVlKCd4Jywgbm9kZSwgdGVuc29yTWFwLCBjb250ZXh0KSBhcyBUZW5zb3IsXG4gICAgICAgICAgICAgIGdldFBhcmFtVmFsdWUoJ2R0eXBlJywgbm9kZSwgdGVuc29yTWFwLCBjb250ZXh0KSBhcyAnaW50MzInIHxcbiAgICAgICAgICAgICAgICAgICdmbG9hdDMyJyB8ICdib29sJyldO1xuICAgICAgICB9XG4gICAgICAgIGNhc2UgJ0V4cGFuZERpbXMnOiB7XG4gICAgICAgICAgY29uc3QgYXhpcyA9XG4gICAgICAgICAgICAgIGdldFBhcmFtVmFsdWUoJ2F4aXMnLCBub2RlLCB0ZW5zb3JNYXAsIGNvbnRleHQpIGFzIG51bWJlcjtcbiAgICAgICAgICByZXR1cm4gW29wcy5leHBhbmREaW1zKFxuICAgICAgICAgICAgICBnZXRQYXJhbVZhbHVlKCd4Jywgbm9kZSwgdGVuc29yTWFwLCBjb250ZXh0KSBhcyBUZW5zb3IsIGF4aXMpXTtcbiAgICAgICAgfVxuICAgICAgICBjYXNlICdTcXVlZXplJzoge1xuICAgICAgICAgIGNvbnN0IGF4aXMgPVxuICAgICAgICAgICAgICBnZXRQYXJhbVZhbHVlKCdheGlzJywgbm9kZSwgdGVuc29yTWFwLCBjb250ZXh0KSBhcyBudW1iZXJbXTtcbiAgICAgICAgICByZXR1cm4gW29wcy5zcXVlZXplKFxuICAgICAgICAgICAgICBnZXRQYXJhbVZhbHVlKCd4Jywgbm9kZSwgdGVuc29yTWFwLCBjb250ZXh0KSBhcyBUZW5zb3IsIGF4aXMpXTtcbiAgICAgICAgfVxuXG4gICAgICAgIGNhc2UgJ1Jlc2hhcGUnOiB7XG4gICAgICAgICAgcmV0dXJuIFtvcHMucmVzaGFwZShcbiAgICAgICAgICAgICAgZ2V0UGFyYW1WYWx1ZSgneCcsIG5vZGUsIHRlbnNvck1hcCwgY29udGV4dCkgYXMgVGVuc29yLFxuICAgICAgICAgICAgICBnZXRQYXJhbVZhbHVlKCdzaGFwZScsIG5vZGUsIHRlbnNvck1hcCwgY29udGV4dCkgYXMgbnVtYmVyW10pXTtcbiAgICAgICAgfVxuICAgICAgICBjYXNlICdNaXJyb3JQYWQnOiB7XG4gICAgICAgICAgcmV0dXJuIFtvcHMubWlycm9yUGFkKFxuICAgICAgICAgICAgICBnZXRQYXJhbVZhbHVlKCd4Jywgbm9kZSwgdGVuc29yTWFwLCBjb250ZXh0KSBhcyBUZW5zb3IsXG4gICAgICAgICAgICAgIGdldFBhcmFtVmFsdWUoJ3BhZGRpbmcnLCBub2RlLCB0ZW5zb3JNYXAsIGNvbnRleHQpIGFzXG4gICAgICAgICAgICAgICAgICBBcnJheTxbbnVtYmVyLCBudW1iZXJdPixcbiAgICAgICAgICAgICAgZ2V0UGFyYW1WYWx1ZSgnbW9kZScsIG5vZGUsIHRlbnNvck1hcCwgY29udGV4dCkgYXMgJ3JlZmxlY3QnIHxcbiAgICAgICAgICAgICAgICAgICdzeW1tZXRyaWMnKV07XG4gICAgICAgIH1cbiAgICAgICAgY2FzZSAnUGFkVjInOlxuICAgICAgICBjYXNlICdQYWQnOiB7XG4gICAgICAgICAgcmV0dXJuIFtvcHMucGFkKFxuICAgICAgICAgICAgICBnZXRQYXJhbVZhbHVlKCd4Jywgbm9kZSwgdGVuc29yTWFwLCBjb250ZXh0KSBhcyBUZW5zb3IsXG4gICAgICAgICAgICAgIGdldFBhcmFtVmFsdWUoJ3BhZGRpbmcnLCBub2RlLCB0ZW5zb3JNYXAsIGNvbnRleHQpIGFzXG4gICAgICAgICAgICAgICAgICBBcnJheTxbbnVtYmVyLCBudW1iZXJdPixcbiAgICAgICAgICAgICAgZ2V0UGFyYW1WYWx1ZSgnY29uc3RhbnRWYWx1ZScsIG5vZGUsIHRlbnNvck1hcCwgY29udGV4dCkgYXNcbiAgICAgICAgICAgICAgICAgIG51bWJlcildO1xuICAgICAgICB9XG4gICAgICAgIGNhc2UgJ1NwYWNlVG9CYXRjaE5EJzoge1xuICAgICAgICAgIGNvbnN0IGJsb2NrU2hhcGUgPVxuICAgICAgICAgICAgICBnZXRQYXJhbVZhbHVlKCdibG9ja1NoYXBlJywgbm9kZSwgdGVuc29yTWFwLCBjb250ZXh0KSBhcyBudW1iZXJbXTtcbiAgICAgICAgICBjb25zdCBwYWRkaW5ncyA9XG4gICAgICAgICAgICAgIGdldFBhcmFtVmFsdWUoJ3BhZGRpbmdzJywgbm9kZSwgdGVuc29yTWFwLCBjb250ZXh0KSBhcyBudW1iZXJbXVtdO1xuICAgICAgICAgIHJldHVybiBbb3BzLnNwYWNlVG9CYXRjaE5EKFxuICAgICAgICAgICAgICBnZXRQYXJhbVZhbHVlKCd4Jywgbm9kZSwgdGVuc29yTWFwLCBjb250ZXh0KSBhcyBUZW5zb3IsXG4gICAgICAgICAgICAgIGJsb2NrU2hhcGUsIHBhZGRpbmdzKV07XG4gICAgICAgIH1cbiAgICAgICAgY2FzZSAnQmF0Y2hUb1NwYWNlTkQnOiB7XG4gICAgICAgICAgY29uc3QgYmxvY2tTaGFwZSA9XG4gICAgICAgICAgICAgIGdldFBhcmFtVmFsdWUoJ2Jsb2NrU2hhcGUnLCBub2RlLCB0ZW5zb3JNYXAsIGNvbnRleHQpIGFzIG51bWJlcltdO1xuICAgICAgICAgIGNvbnN0IGNyb3BzID1cbiAgICAgICAgICAgICAgZ2V0UGFyYW1WYWx1ZSgnY3JvcHMnLCBub2RlLCB0ZW5zb3JNYXAsIGNvbnRleHQpIGFzIG51bWJlcltdW107XG4gICAgICAgICAgcmV0dXJuIFtvcHMuYmF0Y2hUb1NwYWNlTkQoXG4gICAgICAgICAgICAgIGdldFBhcmFtVmFsdWUoJ3gnLCBub2RlLCB0ZW5zb3JNYXAsIGNvbnRleHQpIGFzIFRlbnNvcixcbiAgICAgICAgICAgICAgYmxvY2tTaGFwZSwgY3JvcHMpXTtcbiAgICAgICAgfVxuICAgICAgICBjYXNlICdEZXB0aFRvU3BhY2UnOiB7XG4gICAgICAgICAgY29uc3QgYmxvY2tTaXplID1cbiAgICAgICAgICAgICAgZ2V0UGFyYW1WYWx1ZSgnYmxvY2tTaXplJywgbm9kZSwgdGVuc29yTWFwLCBjb250ZXh0KSBhcyBudW1iZXI7XG4gICAgICAgICAgY29uc3QgZGF0YUZvcm1hdCA9XG4gICAgICAgICAgICAgIChnZXRQYXJhbVZhbHVlKCdkYXRhRm9ybWF0Jywgbm9kZSwgdGVuc29yTWFwLCBjb250ZXh0KSBhc1xuICAgICAgICAgICAgICAgc3RyaW5nKS50b1VwcGVyQ2FzZSgpIGFzICdOSFdDJyB8XG4gICAgICAgICAgICAgICdOQ0hXJztcbiAgICAgICAgICByZXR1cm4gW29wcy5kZXB0aFRvU3BhY2UoXG4gICAgICAgICAgICAgIGdldFBhcmFtVmFsdWUoJ3gnLCBub2RlLCB0ZW5zb3JNYXAsIGNvbnRleHQpIGFzIFRlbnNvcjRELFxuICAgICAgICAgICAgICBibG9ja1NpemUsIGRhdGFGb3JtYXQpXTtcbiAgICAgICAgfVxuICAgICAgICBjYXNlICdCcm9hZGNhc3RUbyc6IHtcbiAgICAgICAgICByZXR1cm4gW29wcy5icm9hZGNhc3RUbyhcbiAgICAgICAgICAgICAgZ2V0UGFyYW1WYWx1ZSgneCcsIG5vZGUsIHRlbnNvck1hcCwgY29udGV4dCkgYXMgVGVuc29yLFxuICAgICAgICAgICAgICBnZXRQYXJhbVZhbHVlKCdzaGFwZScsIG5vZGUsIHRlbnNvck1hcCwgY29udGV4dCkgYXMgbnVtYmVyW10pXTtcbiAgICAgICAgfVxuICAgICAgICBjYXNlICdCcm9hZGNhc3RBcmdzJzoge1xuICAgICAgICAgIHJldHVybiBbb3BzLmJyb2FkY2FzdEFyZ3MoXG4gICAgICAgICAgICAgIGdldFBhcmFtVmFsdWUoJ3MwJywgbm9kZSwgdGVuc29yTWFwLCBjb250ZXh0KSBhcyBUZW5zb3IsXG4gICAgICAgICAgICAgIGdldFBhcmFtVmFsdWUoJ3MxJywgbm9kZSwgdGVuc29yTWFwLCBjb250ZXh0KSBhcyBUZW5zb3IpXTtcbiAgICAgICAgfVxuICAgICAgICBkZWZhdWx0OlxuICAgICAgICAgIHRocm93IFR5cGVFcnJvcihgTm9kZSB0eXBlICR7bm9kZS5vcH0gaXMgbm90IGltcGxlbWVudGVkYCk7XG4gICAgICB9XG4gICAgfTtcblxuZXhwb3J0IGNvbnN0IENBVEVHT1JZID0gJ3RyYW5zZm9ybWF0aW9uJztcbiJdfQ==","/**\n * @license\n * Copyright 2020 Google LLC. All Rights Reserved.\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n * =============================================================================\n */\nimport { HashTable } from '../../executor/hash_table';\nimport { getParamValue } from './utils';\nexport const executeOp = async (node, tensorMap, context, resourceManager) => {\n switch (node.op) {\n case 'HashTable':\n case 'HashTableV2': {\n const keyDType = getParamValue('keyDType', node, tensorMap, context);\n const valueDType = getParamValue('valueDType', node, tensorMap, context);\n const hashTable = new HashTable(keyDType, valueDType);\n resourceManager.addHashTable(node.name, hashTable);\n return [hashTable.handle];\n }\n case 'LookupTableImport':\n case 'LookupTableImportV2': {\n const handle = getParamValue('tableHandle', node, tensorMap, context, resourceManager);\n const keys = getParamValue('keys', node, tensorMap, context);\n const values = getParamValue('values', node, tensorMap, context);\n const hashTable = resourceManager.getHashTableById(handle.id);\n return [await hashTable.import(keys, values)];\n }\n case 'LookupTableFind':\n case 'LookupTableFindV2': {\n const handle = getParamValue('tableHandle', node, tensorMap, context, resourceManager);\n const keys = getParamValue('keys', node, tensorMap, context);\n const defaultValue = getParamValue('defaultValue', node, tensorMap, context);\n const hashTable = resourceManager.getHashTableById(handle.id);\n return [await hashTable.find(keys, defaultValue)];\n }\n case 'LookupTableSize':\n case 'LookupTableSizeV2': {\n const handle = getParamValue('tableHandle', node, tensorMap, context, resourceManager);\n const hashTable = resourceManager.getHashTableById(handle.id);\n return [hashTable.tensorSize()];\n }\n default:\n throw TypeError(`Node type ${node.op} is not implemented`);\n }\n};\nexport const CATEGORY = 'hash_table';\n//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaGFzaF90YWJsZV9leGVjdXRvci5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uLy4uLy4uL3RmanMtY29udmVydGVyL3NyYy9vcGVyYXRpb25zL2V4ZWN1dG9ycy9oYXNoX3RhYmxlX2V4ZWN1dG9yLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBOzs7Ozs7Ozs7Ozs7Ozs7R0FlRztBQU1ILE9BQU8sRUFBQyxTQUFTLEVBQUMsTUFBTSwyQkFBMkIsQ0FBQztBQUlwRCxPQUFPLEVBQUMsYUFBYSxFQUFDLE1BQU0sU0FBUyxDQUFDO0FBRXRDLE1BQU0sQ0FBQyxNQUFNLFNBQVMsR0FBNEIsS0FBSyxFQUNuRCxJQUFVLEVBQUUsU0FBMEIsRUFBRSxPQUF5QixFQUNqRSxlQUFnQyxFQUFxQixFQUFFO0lBQ3pELFFBQVEsSUFBSSxDQUFDLEVBQUUsRUFBRTtRQUNmLEtBQUssV0FBVyxDQUFDO1FBQ2pCLEtBQUssYUFBYSxDQUFDLENBQUM7WUFDbEIsTUFBTSxRQUFRLEdBQ1YsYUFBYSxDQUFDLFVBQVUsRUFBRSxJQUFJLEVBQUUsU0FBUyxFQUFFLE9BQU8sQ0FBYSxDQUFDO1lBQ3BFLE1BQU0sVUFBVSxHQUNaLGFBQWEsQ0FBQyxZQUFZLEVBQUUsSUFBSSxFQUFFLFNBQVMsRUFBRSxPQUFPLENBQWEsQ0FBQztZQUV0RSxNQUFNLFNBQVMsR0FBRyxJQUFJLFNBQVMsQ0FBQyxRQUFRLEVBQUUsVUFBVSxDQUFDLENBQUM7WUFDdEQsZUFBZSxDQUFDLFlBQVksQ0FBQyxJQUFJLENBQUMsSUFBSSxFQUFFLFNBQVMsQ0FBQyxDQUFDO1lBQ25ELE9BQU8sQ0FBQyxTQUFTLENBQUMsTUFBTSxDQUFDLENBQUM7U0FDM0I7UUFDRCxLQUFLLG1CQUFtQixDQUFDO1FBQ3pCLEtBQUsscUJBQXFCLENBQUMsQ0FBQztZQUMxQixNQUFNLE1BQU0sR0FBRyxhQUFhLENBQ1QsYUFBYSxFQUFFLElBQUksRUFBRSxTQUFTLEVBQUUsT0FBTyxFQUN2QyxlQUFlLENBQVcsQ0FBQztZQUM5QyxNQUFNLElBQUksR0FBRyxhQUFhLENBQUMsTUFBTSxFQUFFLElBQUksRUFBRSxTQUFTLEVBQUUsT0FBTyxDQUFXLENBQUM7WUFDdkUsTUFBTSxNQUFNLEdBQ1IsYUFBYSxDQUFDLFFBQVEsRUFBRSxJQUFJLEVBQUUsU0FBUyxFQUFFLE9BQU8sQ0FBVyxDQUFDO1lBRWhFLE1BQU0sU0FBUyxHQUFHLGVBQWUsQ0FBQyxnQkFBZ0IsQ0FBQyxNQUFNLENBQUMsRUFBRSxDQUFDLENBQUM7WUFFOUQsT0FBTyxDQUFDLE1BQU0sU0FBUyxDQUFDLE1BQU0sQ0FBQyxJQUFJLEVBQUUsTUFBTSxDQUFDLENBQUMsQ0FBQztTQUMvQztRQUNELEtBQUssaUJBQWlCLENBQUM7UUFDdkIsS0FBSyxtQkFBbUIsQ0FBQyxDQUFDO1lBQ3hCLE1BQU0sTUFBTSxHQUFHLGFBQWEsQ0FDVCxhQUFhLEVBQUUsSUFBSSxFQUFFLFNBQVMsRUFBRSxPQUFPLEVBQ3ZDLGVBQWUsQ0FBVyxDQUFDO1lBQzlDLE1BQU0sSUFBSSxHQUFHLGFBQWEsQ0FBQyxNQUFNLEVBQUUsSUFBSSxFQUFFLFNBQVMsRUFBRSxPQUFPLENBQVcsQ0FBQztZQUN2RSxNQUFNLFlBQVksR0FDZCxhQUFhLENBQUMsY0FBYyxFQUFFLElBQUksRUFBRSxTQUFTLEVBQUUsT0FBTyxDQUFXLENBQUM7WUFFdEUsTUFBTSxTQUFTLEdBQUcsZUFBZSxDQUFDLGdCQUFnQixDQUFDLE1BQU0sQ0FBQyxFQUFFLENBQUMsQ0FBQztZQUM5RCxPQUFPLENBQUMsTUFBTSxTQUFTLENBQUMsSUFBSSxDQUFDLElBQUksRUFBRSxZQUFZLENBQUMsQ0FBQyxDQUFDO1NBQ25EO1FBQ0QsS0FBSyxpQkFBaUIsQ0FBQztRQUN2QixLQUFLLG1CQUFtQixDQUFDLENBQUM7WUFDeEIsTUFBTSxNQUFNLEdBQUcsYUFBYSxDQUNULGFBQWEsRUFBRSxJQUFJLEVBQUUsU0FBUyxFQUFFLE9BQU8sRUFDdkMsZUFBZSxDQUFXLENBQUM7WUFFOUMsTUFBTSxTQUFTLEdBQUcsZUFBZSxDQUFDLGdCQUFnQixDQUFDLE1BQU0sQ0FBQyxFQUFFLENBQUMsQ0FBQztZQUM5RCxPQUFPLENBQUMsU0FBUyxDQUFDLFVBQVUsRUFBRSxDQUFDLENBQUM7U0FDakM7UUFDRDtZQUNFLE1BQU0sU0FBUyxDQUFDLGFBQWEsSUFBSSxDQUFDLEVBQUUscUJBQXFCLENBQUMsQ0FBQztLQUM5RDtBQUNILENBQUMsQ0FBQztBQUVGLE1BQU0sQ0FBQyxNQUFNLFFBQVEsR0FBRyxZQUFZLENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyIvKipcbiAqIEBsaWNlbnNlXG4gKiBDb3B5cmlnaHQgMjAyMCBHb29nbGUgTExDLiBBbGwgUmlnaHRzIFJlc2VydmVkLlxuICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlIFwiTGljZW5zZVwiKTtcbiAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS5cbiAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdFxuICpcbiAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMFxuICpcbiAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmVcbiAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuIFwiQVMgSVNcIiBCQVNJUyxcbiAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLlxuICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZFxuICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuXG4gKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuICovXG5cbmltcG9ydCB7RGF0YVR5cGUsIFRlbnNvcn0gZnJvbSAnQHRlbnNvcmZsb3cvdGZqcy1jb3JlJztcblxuaW1wb3J0IHtOYW1lZFRlbnNvcnNNYXB9IGZyb20gJy4uLy4uL2RhdGEvdHlwZXMnO1xuaW1wb3J0IHtFeGVjdXRpb25Db250ZXh0fSBmcm9tICcuLi8uLi9leGVjdXRvci9leGVjdXRpb25fY29udGV4dCc7XG5pbXBvcnQge0hhc2hUYWJsZX0gZnJvbSAnLi4vLi4vZXhlY3V0b3IvaGFzaF90YWJsZSc7XG5pbXBvcnQge1Jlc291cmNlTWFuYWdlcn0gZnJvbSAnLi4vLi4vZXhlY3V0b3IvcmVzb3VyY2VfbWFuYWdlcic7XG5pbXBvcnQge0ludGVybmFsT3BBc3luY0V4ZWN1dG9yLCBOb2RlfSBmcm9tICcuLi90eXBlcyc7XG5cbmltcG9ydCB7Z2V0UGFyYW1WYWx1ZX0gZnJvbSAnLi91dGlscyc7XG5cbmV4cG9ydCBjb25zdCBleGVjdXRlT3A6IEludGVybmFsT3BBc3luY0V4ZWN1dG9yID0gYXN5bmMoXG4gICAgbm9kZTogTm9kZSwgdGVuc29yTWFwOiBOYW1lZFRlbnNvcnNNYXAsIGNvbnRleHQ6IEV4ZWN1dGlvbkNvbnRleHQsXG4gICAgcmVzb3VyY2VNYW5hZ2VyOiBSZXNvdXJjZU1hbmFnZXIpOiBQcm9taXNlPFRlbnNvcltdPiA9PiB7XG4gIHN3aXRjaCAobm9kZS5vcCkge1xuICAgIGNhc2UgJ0hhc2hUYWJsZSc6XG4gICAgY2FzZSAnSGFzaFRhYmxlVjInOiB7XG4gICAgICBjb25zdCBrZXlEVHlwZSA9XG4gICAgICAgICAgZ2V0UGFyYW1WYWx1ZSgna2V5RFR5cGUnLCBub2RlLCB0ZW5zb3JNYXAsIGNvbnRleHQpIGFzIERhdGFUeXBlO1xuICAgICAgY29uc3QgdmFsdWVEVHlwZSA9XG4gICAgICAgICAgZ2V0UGFyYW1WYWx1ZSgndmFsdWVEVHlwZScsIG5vZGUsIHRlbnNvck1hcCwgY29udGV4dCkgYXMgRGF0YVR5cGU7XG5cbiAgICAgIGNvbnN0IGhhc2hUYWJsZSA9IG5ldyBIYXNoVGFibGUoa2V5RFR5cGUsIHZhbHVlRFR5cGUpO1xuICAgICAgcmVzb3VyY2VNYW5hZ2VyLmFkZEhhc2hUYWJsZShub2RlLm5hbWUsIGhhc2hUYWJsZSk7XG4gICAgICByZXR1cm4gW2hhc2hUYWJsZS5oYW5kbGVdO1xuICAgIH1cbiAgICBjYXNlICdMb29rdXBUYWJsZUltcG9ydCc6XG4gICAgY2FzZSAnTG9va3VwVGFibGVJbXBvcnRWMic6IHtcbiAgICAgIGNvbnN0IGhhbmRsZSA9IGdldFBhcmFtVmFsdWUoXG4gICAgICAgICAgICAgICAgICAgICAgICAgJ3RhYmxlSGFuZGxlJywgbm9kZSwgdGVuc29yTWFwLCBjb250ZXh0LFxuICAgICAgICAgICAgICAgICAgICAgICAgIHJlc291cmNlTWFuYWdlcikgYXMgVGVuc29yO1xuICAgICAgY29uc3Qga2V5cyA9IGdldFBhcmFtVmFsdWUoJ2tleXMnLCBub2RlLCB0ZW5zb3JNYXAsIGNvbnRleHQpIGFzIFRlbnNvcjtcbiAgICAgIGNvbnN0IHZhbHVlcyA9XG4gICAgICAgICAgZ2V0UGFyYW1WYWx1ZSgndmFsdWVzJywgbm9kZSwgdGVuc29yTWFwLCBjb250ZXh0KSBhcyBUZW5zb3I7XG5cbiAgICAgIGNvbnN0IGhhc2hUYWJsZSA9IHJlc291cmNlTWFuYWdlci5nZXRIYXNoVGFibGVCeUlkKGhhbmRsZS5pZCk7XG5cbiAgICAgIHJldHVybiBbYXdhaXQgaGFzaFRhYmxlLmltcG9ydChrZXlzLCB2YWx1ZXMpXTtcbiAgICB9XG4gICAgY2FzZSAnTG9va3VwVGFibGVGaW5kJzpcbiAgICBjYXNlICdMb29rdXBUYWJsZUZpbmRWMic6IHtcbiAgICAgIGNvbnN0IGhhbmRsZSA9IGdldFBhcmFtVmFsdWUoXG4gICAgICAgICAgICAgICAgICAgICAgICAgJ3RhYmxlSGFuZGxlJywgbm9kZSwgdGVuc29yTWFwLCBjb250ZXh0LFxuICAgICAgICAgICAgICAgICAgICAgICAgIHJlc291cmNlTWFuYWdlcikgYXMgVGVuc29yO1xuICAgICAgY29uc3Qga2V5cyA9IGdldFBhcmFtVmFsdWUoJ2tleXMnLCBub2RlLCB0ZW5zb3JNYXAsIGNvbnRleHQpIGFzIFRlbnNvcjtcbiAgICAgIGNvbnN0IGRlZmF1bHRWYWx1ZSA9XG4gICAgICAgICAgZ2V0UGFyYW1WYWx1ZSgnZGVmYXVsdFZhbHVlJywgbm9kZSwgdGVuc29yTWFwLCBjb250ZXh0KSBhcyBUZW5zb3I7XG5cbiAgICAgIGNvbnN0IGhhc2hUYWJsZSA9IHJlc291cmNlTWFuYWdlci5nZXRIYXNoVGFibGVCeUlkKGhhbmRsZS5pZCk7XG4gICAgICByZXR1cm4gW2F3YWl0IGhhc2hUYWJsZS5maW5kKGtleXMsIGRlZmF1bHRWYWx1ZSldO1xuICAgIH1cbiAgICBjYXNlICdMb29rdXBUYWJsZVNpemUnOlxuICAgIGNhc2UgJ0xvb2t1cFRhYmxlU2l6ZVYyJzoge1xuICAgICAgY29uc3QgaGFuZGxlID0gZ2V0UGFyYW1WYWx1ZShcbiAgICAgICAgICAgICAgICAgICAgICAgICAndGFibGVIYW5kbGUnLCBub2RlLCB0ZW5zb3JNYXAsIGNvbnRleHQsXG4gICAgICAgICAgICAgICAgICAgICAgICAgcmVzb3VyY2VNYW5hZ2VyKSBhcyBUZW5zb3I7XG5cbiAgICAgIGNvbnN0IGhhc2hUYWJsZSA9IHJlc291cmNlTWFuYWdlci5nZXRIYXNoVGFibGVCeUlkKGhhbmRsZS5pZCk7XG4gICAgICByZXR1cm4gW2hhc2hUYWJsZS50ZW5zb3JTaXplKCldO1xuICAgIH1cbiAgICBkZWZhdWx0OlxuICAgICAgdGhyb3cgVHlwZUVycm9yKGBOb2RlIHR5cGUgJHtub2RlLm9wfSBpcyBub3QgaW1wbGVtZW50ZWRgKTtcbiAgfVxufTtcblxuZXhwb3J0IGNvbnN0IENBVEVHT1JZID0gJ2hhc2hfdGFibGUnO1xuIl19","/**\n * ExecutionContext captures the runtime environment of the node. It keeps\n * track of the current frame and iteration for the control flow ops.\n *\n * For example, typical Dynamic RNN model may contain loops, for which\n * TensorFlow will generate graphs with Enter/Exit nodes to control the\n * current execution frame, and NextIteration Nodes for iteration id increment.\n * For model with branch logic, TensorFLow will generate Switch/Merge ops.\n */\nexport class ExecutionContext {\n constructor(weightMap = {}, tensorArrayMap = {}, tensorListMap = {}, functionMap = {}) {\n this.weightMap = weightMap;\n this.tensorArrayMap = tensorArrayMap;\n this.tensorListMap = tensorListMap;\n this.functionMap = functionMap;\n this.rootContext = { id: 0, frameName: '', iterationId: 0 };\n this.contexts = [this.rootContext];\n this.lastId = 0;\n this.generateCurrentContextIds();\n }\n newFrame(id, frameName) {\n return { id, frameName, iterationId: 0 };\n }\n /**\n * Set the current context\n * @param contexts: ExecutionContextInfo[] the current path of execution\n * frames\n */\n set currentContext(contexts) {\n if (this.contexts !== contexts) {\n this.contexts = contexts;\n this.generateCurrentContextIds();\n }\n }\n get currentContext() {\n return this.contexts;\n }\n /**\n * Returns the current context in string format.\n */\n get currentContextId() {\n return this._currentContextIds[0];\n }\n /**\n * Returns the current context and all parent contexts in string format.\n * This allow access to the nodes in the current and parent frames.\n */\n get currentContextIds() {\n return this._currentContextIds;\n }\n generateCurrentContextIds() {\n const names = [];\n for (let i = 0; i < this.contexts.length - 1; i++) {\n const contexts = this.contexts.slice(0, this.contexts.length - i);\n names.push(this.contextIdforContexts(contexts));\n }\n names.push('');\n this._currentContextIds = names;\n }\n contextIdforContexts(contexts) {\n return contexts ?\n contexts\n .map(context => (context.id === 0 && context.iterationId === 0) ?\n '' :\n `${context.frameName}-${context.iterationId}`)\n .join('/') :\n '';\n }\n /**\n * Enter a new frame, a new context is pushed on the current context list.\n * @param frameId new frame id\n */\n enterFrame(frameId) {\n if (this.contexts) {\n this.lastId++;\n this.contexts = this.contexts.slice();\n this.contexts.push(this.newFrame(this.lastId, frameId));\n this._currentContextIds.unshift(this.contextIdforContexts(this.contexts));\n }\n }\n /**\n * Exit the current frame, the last context is removed from the current\n * context list.\n */\n exitFrame() {\n if (this.contexts && this.contexts.length > 1) {\n this.contexts = this.contexts.slice();\n this.contexts.splice(-1);\n this.currentContextIds.shift();\n }\n else {\n throw new Error('Cannot exit frame, the context is empty');\n }\n }\n /**\n * Enter the next iteration of a loop, the iteration id of last context is\n * increased.\n */\n nextIteration() {\n if (this.contexts && this.contexts.length > 0) {\n this.contexts = this.contexts.slice();\n this.lastId++;\n const context = Object.assign({}, this.contexts[this.contexts.length - 1]);\n context.iterationId += 1;\n context.id = this.lastId;\n this.contexts.splice(-1, 1, context);\n this._currentContextIds.splice(0, 1, this.contextIdforContexts(this.contexts));\n }\n else {\n throw new Error('Cannot increase frame iteration, the context is empty');\n }\n }\n getWeight(name) {\n return this.weightMap[name];\n }\n addTensorArray(tensorArray) {\n this.tensorArrayMap[tensorArray.id] = tensorArray;\n }\n getTensorArray(id) {\n return this.tensorArrayMap[id];\n }\n addTensorList(tensorList) {\n this.tensorListMap[tensorList.id] = tensorList;\n }\n getTensorList(id) {\n return this.tensorListMap[id];\n }\n dispose(keepIds) {\n for (const key in this.tensorArrayMap) {\n this.tensorArrayMap[key].clearAndClose(keepIds);\n }\n for (const key in this.tensorListMap) {\n this.tensorListMap[key].clearAndClose(keepIds);\n }\n }\n}\n//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZXhlY3V0aW9uX2NvbnRleHQuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi8uLi90ZmpzLWNvbnZlcnRlci9zcmMvZXhlY3V0b3IvZXhlY3V0aW9uX2NvbnRleHQudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBK0JBOzs7Ozs7OztHQVFHO0FBQ0gsTUFBTSxPQUFPLGdCQUFnQjtJQU0zQixZQUNhLFlBQTZCLEVBQUUsRUFDL0IsaUJBQWlDLEVBQUUsRUFDbkMsZ0JBQStCLEVBQUUsRUFDakMsY0FBaUQsRUFBRTtRQUhuRCxjQUFTLEdBQVQsU0FBUyxDQUFzQjtRQUMvQixtQkFBYyxHQUFkLGNBQWMsQ0FBcUI7UUFDbkMsa0JBQWEsR0FBYixhQUFhLENBQW9CO1FBQ2pDLGdCQUFXLEdBQVgsV0FBVyxDQUF3QztRQVR4RCxnQkFBVyxHQUFHLEVBQUMsRUFBRSxFQUFFLENBQUMsRUFBRSxTQUFTLEVBQUUsRUFBRSxFQUFFLFdBQVcsRUFBRSxDQUFDLEVBQUMsQ0FBQztRQUNyRCxhQUFRLEdBQTJCLENBQUMsSUFBSSxDQUFDLFdBQVcsQ0FBQyxDQUFDO1FBQ3RELFdBQU0sR0FBRyxDQUFDLENBQUM7UUFRakIsSUFBSSxDQUFDLHlCQUF5QixFQUFFLENBQUM7SUFDbkMsQ0FBQztJQUVPLFFBQVEsQ0FBQyxFQUFVLEVBQUUsU0FBaUI7UUFDNUMsT0FBTyxFQUFDLEVBQUUsRUFBRSxTQUFTLEVBQUUsV0FBVyxFQUFFLENBQUMsRUFBQyxDQUFDO0lBQ3pDLENBQUM7SUFFRDs7OztPQUlHO0lBQ0gsSUFBSSxjQUFjLENBQUMsUUFBZ0M7UUFDakQsSUFBSSxJQUFJLENBQUMsUUFBUSxLQUFLLFFBQVEsRUFBRTtZQUM5QixJQUFJLENBQUMsUUFBUSxHQUFHLFFBQVEsQ0FBQztZQUN6QixJQUFJLENBQUMseUJBQXlCLEVBQUUsQ0FBQztTQUNsQztJQUNILENBQUM7SUFFRCxJQUFJLGNBQWM7UUFDaEIsT0FBTyxJQUFJLENBQUMsUUFB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QUFFO1lBQ3JDLElBQUksQ0FBQyxjQUFjLENBQUMsR0FBRyxDQUFDLENBQUMsYUFBYSxDQUFDLE9BQU8sQ0FBQyxDQUFDO1NBQ2pEO1FBRUQsS0FBSyxNQUFNLEdBQUcsSUFBSSxJQUFJLENBQUMsYUFBYSxFQUFFO1lBQ3BDLElBQUksQ0FBQyxhQUFhLENBQUMsR0FBRyxDQUFDLENBQUMsYUFBYSxDQUFDLE9BQU8sQ0FBQyxDQUFDO1NBQ2hEO0lBQ0gsQ0FBQztDQUNGIiwic291cmNlc0NvbnRlbnQiOlsiLyoqXG4gKiBAbGljZW5zZVxuICogQ29weXJpZ2h0IDIwMTggR29vZ2xlIExMQy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC5cbiAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSBcIkxpY2Vuc2VcIik7XG4gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuXG4gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXRcbiAqXG4gKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjBcbiAqXG4gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlXG4gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiBcIkFTIElTXCIgQkFTSVMsXG4gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC5cbiAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmRcbiAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLlxuICogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbiAqL1xuaW1wb3J0IHtUZW5zb3J9IGZyb20gJ0B0ZW5zb3JmbG93L3RmanMtY29yZSc7XG5cbmltcG9ydCB7TmFtZWRUZW5zb3JzTWFwLCBUZW5zb3JBcnJheU1hcCwgVGVuc29yTGlzdE1hcH0gZnJvbSAnLi4vZGF0YS90eXBlcyc7XG5cbmltcG9ydCB7VGVuc29yQXJyYXl9IGZyb20gJy4vdGVuc29yX2FycmF5JztcbmltcG9ydCB7VGVuc29yTGlzdH0gZnJvbSAnLi90ZW5zb3JfbGlzdCc7XG5pbXBvcnQge0Z1bmN0aW9uRXhlY3V0b3J9IGZyb20gJy4vdHlwZXMnO1xuXG5leHBvcnQgaW50ZXJmYWNlIEV4ZWN1dGlvbkNvbnRleHRJbmZvIHtcbiAgaWQ6IG51bWJlcjsgICAgICAgICAgIC8vIHRoZSB1bmlxdWUgaWQgb2YgdGhlIGNvbnRleHQgaW5mb1xuICBmcmFtZU5hbWU6IHN0cmluZzsgICAgLy8gVGhlIGZyYW1lIG5hbWUgb2YgdGhlIGxvb3AsIHRoaXMgY29tZXMgZnJvbVxuICAgICAgICAgICAgICAgICAgICAgICAgLy8gdGhlIFRlbnNvckZsb3cgTm9kZURlZi5cbiAgaXRlcmF0aW9uSWQ6IG51bWJlcjsgIC8vIFRoZSBpdGVyYXRpb24gaWQgb2YgdGhlIGxvb3Bcbn1cblxuLyoqXG4gKiBFeGVjdXRpb25Db250ZXh0IGNhcHR1cmVzIHRoZSBydW50aW1lIGVudmlyb25tZW50IG9mIHRoZSBub2RlLiBJdCBrZWVwc1xuICogdHJhY2sgb2YgdGhlIGN1cnJlbnQgZnJhbWUgYW5kIGl0ZXJhdGlvbiBmb3IgdGhlIGNvbnRyb2wgZmxvdyBvcHMuXG4gKlxuICogRm9yIGV4YW1wbGUsIHR5cGljYWwgRHluYW1pYyBSTk4gbW9kZWwgbWF5IGNvbnRhaW4gbG9vcHMsIGZvciB3aGljaFxuICogVGVuc29yRmxvdyB3aWxsIGdlbmVyYXRlIGdyYXBocyB3aXRoIEVudGVyL0V4aXQgbm9kZXMgdG8gY29udHJvbCB0aGVcbiAqIGN1cnJlbnQgZXhlY3V0aW9uIGZyYW1lLCBhbmQgTmV4dEl0ZXJhdGlvbiBOb2RlcyBmb3IgaXRlcmF0aW9uIGlkIGluY3JlbWVudC5cbiAqIEZvciBtb2RlbCB3aXRoIGJyYW5jaCBsb2dpYywgVGVuc29yRkxvdyB3aWxsIGdlbmVyYXRlIFN3aXRjaC9NZXJnZSBvcHMuXG4gKi9cbmV4cG9ydCBjbGFzcyBFeGVjdXRpb25Db250ZXh0IHtcbiAgcHJpdmF0ZSByb290Q29udGV4dCA9IHtpZDogMCwgZnJhbWVOYW1lOiAnJywgaXRlcmF0aW9uSWQ6IDB9O1xuICBwcml2YXRlIGNvbnRleHRzOiBFeGVjdXRpb25Db250ZXh0SW5mb1tdID0gW3RoaXMucm9vdENvbnRleHRdO1xuICBwcml2YXRlIGxhc3RJZCA9IDA7XG4gIHByaXZhdGUgX2N1cnJlbnRDb250ZXh0SWRzOiBzdHJpbmdbXTtcblxuICBjb25zdHJ1Y3RvcihcbiAgICAgIHJlYWRvbmx5IHdlaWdodE1hcDogTmFtZWRUZW5zb3JzTWFwID0ge30sXG4gICAgICByZWFkb25seSB0ZW5zb3JBcnJheU1hcDogVGVuc29yQXJyYXlNYXAgPSB7fSxcbiAgICAgIHJlYWRvbmx5IHRlbnNvckxpc3RNYXA6IFRlbnNvckxpc3RNYXAgPSB7fSxcbiAgICAgIHJlYWRvbmx5IGZ1bmN0aW9uTWFwOiB7W2tleTogc3RyaW5nXTogRnVuY3Rpb25FeGVjdXRvcn0gPSB7fSkge1xuICAgIHRoaXMuZ2VuZXJhdGVDdXJyZW50Q29udGV4dElkcygpO1xuICB9XG5cbiAgcHJpdmF0ZSBuZXdGcmFtZShpZDogbnVtYmVyLCBmcmFtZU5hbWU6IHN0cmluZykge1xuICAgIHJldHVybiB7aWQsIGZyYW1lTmFtZSwgaXRlcmF0aW9uSWQ6IDB9O1xuICB9XG5cbiAgLyoqXG4gICAqIFNldCB0aGUgY3VycmVudCBjb250ZXh0XG4gICAqIEBwYXJhbSBjb250ZXh0czogRXhlY3V0aW9uQ29udGV4dEluZm9bXSB0aGUgY3VycmVudCBwYXRoIG9mIGV4ZWN1dGlvblxuICAgKiBmcmFtZXNcbiAgICovXG4gIHNldCBjdXJyZW50Q29udGV4dChjb250ZXh0czogRXhlY3V0aW9uQ29udGV4dEluZm9bXSkge1xuICAgIGlmICh0aGlzLmNvbnRleHRzICE9PSBjb250ZXh0cykge1xuICAgICAgdGhpcy5jb250ZXh0cyA9IGNvbnRleHRzO1xuICAgICAgdGhpcy5nZW5lcmF0ZUN1cnJlbnRDb250ZXh0SWRzKCk7XG4gICAgfVxuICB9XG5cbiAgZ2V0IGN1cnJlbnRDb250ZXh0KCk6IEV4ZWN1dGlvbkNvbnRleHRJbmZvW10ge1xuICAgIHJldHVybiB0aGlzLmNvbnRleHRzO1xuICB9XG5cbiAgLyoqXG4gICAqIFJldHVybnMgdGhlIGN1cnJlbnQgY29udGV4dCBpbiBzdHJpbmcgZm9ybWF0LlxuICAgKi9cbiAgZ2V0IGN1cnJlbnRDb250ZXh0SWQoKTogc3RyaW5nIHtcbiAgICByZXR1cm4gdGhpcy5fY3VycmVudENvbnRleHRJZHNbMF07XG4gIH1cblxuICAvKipcbiAgICogUmV0dXJucyB0aGUgY3VycmVudCBjb250ZXh0IGFuZCBhbGwgcGFyZW50IGNvbnRleHRzIGluIHN0cmluZyBmb3JtYXQuXG4gICAqIFRoaXMgYWxsb3cgYWNjZXNzIHRvIHRoZSBub2RlcyBpbiB0aGUgY3VycmVudCBhbmQgcGFyZW50IGZyYW1lcy5cbiAgICovXG4gIGdldCBjdXJyZW50Q29udGV4dElkcygpOiBzdHJpbmdbXSB7XG4gICAgcmV0dXJuIHRoaXMuX2N1cnJlbnRDb250ZXh0SWRzO1xuICB9XG5cbiAgcHJpdmF0ZSBnZW5lcmF0ZUN1cnJlbnRDb250ZXh0SWRzKCkge1xuICAgIGNvbnN0IG5hbWVzID0gW107XG4gICAgZm9yIChsZXQgaSA9IDA7IGkgPCB0aGlzLmNvbnRleHRzLmxlbmd0aCAtIDE7IGkrKykge1xuICAgICAgY29uc3QgY29udGV4dHMgPSB0aGlzLmNvbnRleHRzLnNsaWNlKDAsIHRoaXMuY29udGV4dHMubGVuZ3RoIC0gaSk7XG4gICAgICBuYW1lcy5wdXNoKHRoaXMuY29udGV4dElkZm9yQ29udGV4dHMoY29udGV4dHMpKTtcbiAgICB9XG4gICAgbmFtZXMucHVzaCgnJyk7XG4gICAgdGhpcy5fY3VycmVudENvbnRleHRJZHMgPSBuYW1lcztcbiAgfVxuXG4gIHByaXZhdGUgY29udGV4dElkZm9yQ29udGV4dHMoY29udGV4dHM6IEV4ZWN1dGlvbkNvbnRleHRJbmZvW10pIHtcbiAgICByZXR1cm4gY29udGV4dHMgP1xuICAgICAgICBjb250ZXh0c1xuICAgICAgICAgICAgLm1hcChcbiAgICAgICAgICAgICAgICBjb250ZXh0ID0+IChjb250ZXh0LmlkID09PSAwICYmIGNvbnRleHQuaXRlcmF0aW9uSWQgPT09IDApID9cbiAgICAgICAgICAgICAgICAgICAgJycgOlxuICAgICAgICAgICAgICAgICAgICBgJHtjb250ZXh0LmZyYW1lTmFtZX0tJHtjb250ZXh0Lml0ZXJhdGlvbklkfWApXG4gICAgICAgICAgICAuam9pbignLycpIDpcbiAgICAgICAgJyc7XG4gIH1cblxuICAvKipcbiAgICogRW50ZXIgYSBuZXcgZnJhbWUsIGEgbmV3IGNvbnRleHQgaXMgcHVzaGVkIG9uIHRoZSBjdXJyZW50IGNvbnRleHQgbGlzdC5cbiAgICogQHBhcmFtIGZyYW1lSWQgbmV3IGZyYW1lIGlkXG4gICAqL1xuICBlbnRlckZyYW1lKGZyYW1lSWQ6IHN0cmluZykge1xuICAgIGlmICh0aGlzLmNvbnRleHRzKSB7XG4gICAgICB0aGlzLmxhc3RJZCsrO1xuICAgICAgdGhpcy5jb250ZXh0cyA9IHRoaXMuY29udGV4dHMuc2xpY2UoKTtcbiAgICAgIHRoaXMuY29udGV4dHMucHVzaCh0aGlzLm5ld0ZyYW1lKHRoaXMubGFzdElkLCBmcmFtZUlkKSk7XG4gICAgICB0aGlzLl9jdXJyZW50Q29udGV4dElkcy51bnNoaWZ0KHRoaXMuY29udGV4dElkZm9yQ29udGV4dHModGhpcy5jb250ZXh0cykpO1xuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBFeGl0IHRoZSBjdXJyZW50IGZyYW1lLCB0aGUgbGFzdCBjb250ZXh0IGlzIHJlbW92ZWQgZnJvbSB0aGUgY3VycmVudFxuICAgKiBjb250ZXh0IGxpc3QuXG4gICAqL1xuICBleGl0RnJhbWUoKSB7XG4gICAgaWYgKHRoaXMuY29udGV4dHMgJiYgdGhpcy5jb250ZXh0cy5sZW5ndGggPiAxKSB7XG4gICAgICB0aGlzLmNvbnRleHRzID0gdGhpcy5jb250ZXh0cy5zbGljZSgpO1xuICAgICAgdGhpcy5jb250ZXh0cy5zcGxpY2UoLTEpO1xuICAgICAgdGhpcy5jdXJyZW50Q29udGV4dElkcy5zaGlmdCgpO1xuICAgIH0gZWxzZSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoJ0Nhbm5vdCBleGl0IGZyYW1lLCB0aGUgY29udGV4dCBpcyBlbXB0eScpO1xuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBFbnRlciB0aGUgbmV4dCBpdGVyYXRpb24gb2YgYSBsb29wLCB0aGUgaXRlcmF0aW9uIGlkIG9mIGxhc3QgY29udGV4dCBpc1xuICAgKiBpbmNyZWFzZWQuXG4gICAqL1xuICBuZXh0SXRlcmF0aW9uKCkge1xuICAgIGlmICh0aGlzLmNvbnRleHRzICYmIHRoaXMuY29udGV4dHMubGVuZ3RoID4gMCkge1xuICAgICAgdGhpcy5jb250ZXh0cyA9IHRoaXMuY29udGV4dHMuc2xpY2UoKTtcbiAgICAgIHRoaXMubGFzdElkKys7XG4gICAgICBjb25zdCBjb250ZXh0ID1cbiAgICAgICAgICBPYmplY3QuYXNzaWduKHt9LCB0aGlzLmNvbnRleHRzW3RoaXMuY29udGV4dHMubGVuZ3RoIC0gMV0pO1xuICAgICAgY29udGV4dC5pdGVyYXRpb25JZCArPSAxO1xuICAgICAgY29udGV4dC5pZCA9IHRoaXMubGFzdElkO1xuICAgICAgdGhpcy5jb250ZXh0cy5zcGxpY2UoLTEsIDEsIGNvbnRleHQpO1xuICAgICAgdGhpcy5fY3VycmVudENvbnRleHRJZHMuc3BsaWNlKFxuICAgICAgICAgIDAsIDEsIHRoaXMuY29udGV4dElkZm9yQ29udGV4dHModGhpcy5jb250ZXh0cykpO1xuICAgIH0gZWxzZSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoJ0Nhbm5vdCBpbmNyZWFzZSBmcmFtZSBpdGVyYXRpb24sIHRoZSBjb250ZXh0IGlzIGVtcHR5Jyk7XG4gICAgfVxuICB9XG5cbiAgZ2V0V2VpZ2h0KG5hbWU6IHN0cmluZyk6IFRlbnNvcltdIHtcbiAgICByZXR1cm4gdGhpcy53ZWlnaHRNYXBbbmFtZV07XG4gIH1cblxuICBhZGRUZW5zb3JBcnJheSh0ZW5zb3JBcnJheTogVGVuc29yQXJyYXkpIHtcbiAgICB0aGlzLnRlbnNvckFycmF5TWFwW3RlbnNvckFycmF5LmlkXSA9IHRlbnNvckFycmF5O1xuICB9XG5cbiAgZ2V0VGVuc29yQXJyYXkoaWQ6IG51bWJlcik6IFRlbnNvckFycmF5IHtcbiAgICByZXR1cm4gdGhpcy50ZW5zb3JBcnJheU1hcFtpZF07XG4gIH1cblxuICBhZGRUZW5zb3JMaXN0KHRlbnNvckxpc3Q6IFRlbnNvckxpc3QpIHtcbiAgICB0aGlzLnRlbnNvckxpc3RNYXBbdGVuc29yTGlzdC5pZF0gPSB0ZW5zb3JMaXN0O1xuICB9XG5cbiAgZ2V0VGVuc29yTGlzdChpZDogbnVtYmVyKTogVGVuc29yTGlzdCB7XG4gICAgcmV0dXJuIHRoaXMudGVuc29yTGlzdE1hcFtpZF07XG4gIH1cblxuICBkaXNwb3NlKGtlZXBJZHM6IFNldDxudW1iZXI+KSB7XG4gICAgZm9yIChjb25zdCBrZXkgaW4gdGhpcy50ZW5zb3JBcnJheU1hcCkge1xuICAgICAgdGhpcy50ZW5zb3JBcnJheU1hcFtrZXldLmNsZWFyQW5kQ2xvc2Uoa2VlcElkcyk7XG4gICAgfVxuXG4gICAgZm9yIChjb25zdCBrZXkgaW4gdGhpcy50ZW5zb3JMaXN0TWFwKSB7XG4gICAgICB0aGlzLnRlbnNvckxpc3RNYXBba2V5XS5jbGVhckFuZENsb3NlKGtlZXBJZHMpO1xuICAgIH1cbiAgfVxufVxuIl19","/**\n * @license\n * Copyright 2019 Google LLC. All Rights Reserved.\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n * =============================================================================\n */\nimport { parseNodeName } from '../operations/executors/utils';\n/**\n * Given graph inputs and desired outputs, find the minimal set of nodes\n * to execute in order to compute the outputs. In addition return other useful\n * info such:\n * - Missing inputs needed to compute the output.\n * - Whether the subgraph contains dynamic ops (control flow, dynamic shape).\n * - Alternative inputs in order to avoid async (dynamic op) execution.\n */\nexport function getExecutionSubgraph(inputs, outputs, weightMap, initNodes) {\n const usedNodes = new Set();\n const missingInputs = [];\n let dynamicNode = null;\n let syncInputs = null;\n // Start with the outputs, going backwards and find all the nodes that are\n // needed to compute those outputs.\n const seen = new Set();\n const inputNodeNames = Object.keys(inputs).map(name => parseNodeName(name)[0]);\n let initNodeNames = [];\n if (initNodes != null) {\n initNodeNames = initNodes.map(node => parseNodeName(node.name)[0]);\n }\n const frontier = [...outputs];\n while (frontier.length > 0) {\n const node = frontier.pop();\n if (isControlFlow(node) || isDynamicShape(node) || isHashTable(node)) {\n if (dynamicNode == null) {\n dynamicNode = node;\n syncInputs = dynamicNode.children.map(child => child.name)\n .filter(name => usedNodes.has(name));\n }\n }\n usedNodes.add(node.name);\n // Weights are dead end since we already have their values.\n if (weightMap[node.name] != null) {\n continue;\n }\n // This node is a dead end since it's one of the user-provided inputs.\n if (inputNodeNames.indexOf(node.name) !== -1) {\n continue;\n }\n // This node is a dead end since it doesn't have any inputs.\n if (initNodeNames.indexOf(node.name) !== -1) {\n continue;\n }\n if (node.inputs.length === 0) {\n missingInputs.push(node.name);\n continue;\n }\n node.inputs.forEach(input => {\n // Don't add to the frontier if it is already there.\n if (seen.has(input.name)) {\n return;\n }\n seen.add(input.name);\n frontier.push(input);\n });\n }\n return { inputs, outputs, usedNodes, missingInputs, dynamicNode, syncInputs };\n}\n/**\n * Given the execution info, return a list of nodes in topological order that\n * need to be executed to compute the output.\n */\nexport function getNodesInTopologicalOrder(graph, weightMap, executionInfo) {\n const { usedNodes, inputs } = executionInfo;\n const frontier = [];\n const inputNodes = Object.keys(inputs)\n .map(name => parseNodeName(name)[0])\n .map(name => graph.nodes[name]);\n const initNodes = graph.initNodes;\n inputNodes.forEach(input => {\n if (usedNodes.has(input.name)) {\n frontier.push(input);\n }\n });\n graph.weights.forEach(weight => {\n if (usedNodes.has(weight.name)) {\n frontier.push(weight);\n }\n });\n if (initNodes != null) {\n initNodes.forEach(node => {\n if (usedNodes.has(node.name)) {\n frontier.push(node);\n }\n });\n }\n const seen = new Set();\n const orderedNodes = [];\n while (frontier.length > 0) {\n const node = frontier.pop();\n seen.add(node.name);\n if (!weightMap[node.name]) {\n orderedNodes.push(node);\n }\n node.children.forEach(child => {\n if (!seen.has(child.name) && usedNodes.has(child.name) &&\n child.inputs.every(input => seen.has(input.name))) {\n frontier.push(child);\n }\n });\n }\n return orderedNodes;\n}\nconst CONTROL_FLOW_OPS = [\n 'Switch', 'Merge', 'Enter', 'Exit', 'NextIteration', 'StatelessIf',\n 'StatelessWhile', 'if', 'While'\n];\nconst DYNAMIC_SHAPE_OPS = [\n 'NonMaxSuppressionV2', 'NonMaxSuppressionV3', 'NonMaxSuppressionV5', 'Where'\n];\nconst HASH_TABLE_OPS = [\n 'HashTable', 'HashTableV2', 'LookupTableImport', 'LookupTableImportV2',\n 'LookupTableFind', 'LookupTableFindV2', 'LookupTableSize', 'LookupTableSizeV2'\n];\nexport function isControlFlow(node) {\n return CONTROL_FLOW_OPS.indexOf(node.op) >= 0;\n}\nexport function isDynamicShape(node) {\n return DYNAMIC_SHAPE_OPS.indexOf(node.op) >= 0;\n}\nexport function isHashTable(node) {\n return HASH_TABLE_OPS.indexOf(node.op) >= 0;\n}\n//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibW9kZWxfYW5hbHlzaXMuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi8uLi90ZmpzLWNvbnZlcnRlci9zcmMvZXhlY3V0b3IvbW9kZWxfYW5hbHlzaXMudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUE7Ozs7Ozs7Ozs7Ozs7OztHQWVHO0FBS0gsT0FBTyxFQUFDLGFBQWEsRUFBQyxNQUFNLCtCQUErQixDQUFDO0FBWTVEOzs7Ozs7O0dBT0c7QUFDSCxNQUFNLFVBQVUsb0JBQW9CLENBQ2hDLE1BQXNCLEVBQUUsT0FBZSxFQUFFLFNBQTBCLEVBQ25FLFNBQWtCO0lBQ3BCLE1BQU0sU0FBUyxHQUFHLElBQUksR0FBRyxFQUFVLENBQUM7SUFDcEMsTUFBTSxhQUFhLEdBQWEsRUFBRSxDQUFDO0lBQ25DLElBQUksV0FBVyxHQUFTLElBQUksQ0FBQztJQUM3QixJQUFJLFVBQVUsR0FBYSxJQUFJLENBQUM7SUFFaEMsMEVBQTBFO0lBQzFFLG1DQUFtQztJQUNuQyxNQUFNLElBQUksR0FBRyxJQUFJLEdBQUcsRUFBVSxDQUFDO0lBQy9CLE1BQU0sY0FBYyxHQUNoQixNQUFNLENBQUMsSUFBSSxDQUFDLE1BQU0sQ0FBQyxDQUFDLEdBQUcsQ0FBQyxJQUFJLENBQUMsRUFBRSxDQUFDLGFBQWEsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDO0lBRTVELElBQUksYUFBYSxHQUFhLEVBQUUsQ0FBQztJQUNqQyxJQUFJLFNBQVMsSUFBSSxJQUFJLEVBQUU7UUFDckIsYUFBYSxHQUFHLFNBQVMsQ0FBQyxHQUFHLENBQUMsSUFBSSxDQUFDLEVBQUUsQ0FBQyxhQUFhLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUM7S0FDcEU7SUFFRCxNQUFNLFFBQVEsR0FBRyxDQUFDLEdBQUcsT0FBTyxDQUFDLENBQUM7SUFDOUIsT0FBTyxRQUFRLENBQUMsTUFBTSxHQUFHLENBQUMs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O2FBQ3RCO1FBQ0gsQ0FBQyxDQUFDLENBQUM7S0FDSjtJQUNELE9BQU8sWUFBWSxDQUFDO0FBQ3RCLENBQUM7QUFFRCxNQUFNLGdCQUFnQixHQUFHO0lBQ3ZCLFFBQVEsRUFBRSxPQUFPLEVBQUUsT0FBTyxFQUFFLE1BQU0sRUFBRSxlQUFlLEVBQUUsYUFBYTtJQUNsRSxnQkFBZ0IsRUFBRSxJQUFJLEVBQUUsT0FBTztDQUNoQyxDQUFDO0FBQ0YsTUFBTSxpQkFBaUIsR0FBRztJQUN4QixxQkFBcUIsRUFBRSxxQkFBcUIsRUFBRSxxQkFBcUIsRUFBRSxPQUFPO0NBQzdFLENBQUM7QUFDRixNQUFNLGNBQWMsR0FBRztJQUNyQixXQUFXLEVBQUUsYUFBYSxFQUFFLG1CQUFtQixFQUFFLHFCQUFxQjtJQUN0RSxpQkFBaUIsRUFBRSxtQkFBbUIsRUFBRSxpQkFBaUIsRUFBRSxtQkFBbUI7Q0FDL0UsQ0FBQztBQUVGLE1BQU0sVUFBVSxhQUFhLENBQUMsSUFBVTtJQUN0QyxPQUFPLGdCQUFnQixDQUFDLE9BQU8sQ0FBQyxJQUFJLENBQUMsRUFBRSxDQUFDLElBQUksQ0FBQyxDQUFDO0FBQ2hELENBQUM7QUFFRCxNQUFNLFVBQVUsY0FBYyxDQUFDLElBQVU7SUFDdkMsT0FBTyxpQkFBaUIsQ0FBQyxPQUFPLENBQUMsSUFBSSxDQUFDLEVBQUUsQ0FBQyxJQUFJLENBQUMsQ0FBQztBQUNqRCxDQUFDO0FBRUQsTUFBTSxVQUFVLFdBQVcsQ0FBQyxJQUFVO0lBQ3BDLE9BQU8sY0FBYyxDQUFDLE9BQU8sQ0FBQyxJQUFJLENBQUMsRUFBRSxDQUFDLElBQUksQ0FBQyxDQUFDO0FBQzlDLENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyIvKipcbiAqIEBsaWNlbnNlXG4gKiBDb3B5cmlnaHQgMjAxOSBHb29nbGUgTExDLiBBbGwgUmlnaHRzIFJlc2VydmVkLlxuICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlIFwiTGljZW5zZVwiKTtcbiAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS5cbiAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdFxuICpcbiAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMFxuICpcbiAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmVcbiAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuIFwiQVMgSVNcIiBCQVNJUyxcbiAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLlxuICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZFxuICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuXG4gKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuICovXG5cbmltcG9ydCB7TmFtZWRUZW5zb3JNYXB9IGZyb20gJ0B0ZW5zb3JmbG93L3RmanMtY29yZSc7XG5cbmltcG9ydCB7TmFtZWRUZW5zb3JzTWFwfSBmcm9tICcuLi9kYXRhL3R5cGVzJztcbmltcG9ydCB7cGFyc2VOb2RlTmFtZX0gZnJvbSAnLi4vb3BlcmF0aW9ucy9leGVjdXRvcnMvdXRpbHMnO1xuaW1wb3J0IHtHcmFwaCwgTm9kZX0gZnJvbSAnLi4vb3BlcmF0aW9ucy90eXBlcyc7XG5cbmV4cG9ydCBpbnRlcmZhY2UgRXhlY3V0aW9uSW5mbyB7XG4gIGlucHV0czogTmFtZWRUZW5zb3JNYXA7XG4gIG91dHB1dHM6IE5vZGVbXTtcbiAgdXNlZE5vZGVzOiBTZXQ8c3RyaW5nPjtcbiAgbWlzc2luZ0lucHV0czogc3RyaW5nW107XG4gIGR5bmFtaWNOb2RlOiBOb2RlO1xuICBzeW5jSW5wdXRzOiBzdHJpbmdbXTtcbn1cblxuLyoqXG4gKiBHaXZlbiBncmFwaCBpbnB1dHMgYW5kIGRlc2lyZWQgb3V0cHV0cywgZmluZCB0aGUgbWluaW1hbCBzZXQgb2Ygbm9kZXNcbiAqIHRvIGV4ZWN1dGUgaW4gb3JkZXIgdG8gY29tcHV0ZSB0aGUgb3V0cHV0cy4gSW4gYWRkaXRpb24gcmV0dXJuIG90aGVyIHVzZWZ1bFxuICogaW5mbyBzdWNoOlxuICogLSBNaXNzaW5nIGlucHV0cyBuZWVkZWQgdG8gY29tcHV0ZSB0aGUgb3V0cHV0LlxuICogLSBXaGV0aGVyIHRoZSBzdWJncmFwaCBjb250YWlucyBkeW5hbWljIG9wcyAoY29udHJvbCBmbG93LCBkeW5hbWljIHNoYXBlKS5cbiAqIC0gQWx0ZXJuYXRpdmUgaW5wdXRzIGluIG9yZGVyIHRvIGF2b2lkIGFzeW5jIChkeW5hbWljIG9wKSBleGVjdXRpb24uXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBnZXRFeGVjdXRpb25TdWJncmFwaChcbiAgICBpbnB1dHM6IE5hbWVkVGVuc29yTWFwLCBvdXRwdXRzOiBOb2RlW10sIHdlaWdodE1hcDogTmFtZWRUZW5zb3JzTWFwLFxuICAgIGluaXROb2Rlcz86IE5vZGVbXSk6IEV4ZWN1dGlvbkluZm8ge1xuICBjb25zdCB1c2VkTm9kZXMgPSBuZXcgU2V0PHN0cmluZz4oKTtcbiAgY29uc3QgbWlzc2luZ0lucHV0czogc3RyaW5nW10gPSBbXTtcbiAgbGV0IGR5bmFtaWNOb2RlOiBOb2RlID0gbnVsbDtcbiAgbGV0IHN5bmNJbnB1dHM6IHN0cmluZ1tdID0gbnVsbDtcblxuICAvLyBTdGFydCB3aXRoIHRoZSBvdXRwdXRzLCBnb2luZyBiYWNrd2FyZHMgYW5kIGZpbmQgYWxsIHRoZSBub2RlcyB0aGF0IGFyZVxuICAvLyBuZWVkZWQgdG8gY29tcHV0ZSB0aG9zZSBvdXRwdXRzLlxuICBjb25zdCBzZWVuID0gbmV3IFNldDxzdHJpbmc+KCk7XG4gIGNvbnN0IGlucHV0Tm9kZU5hbWVzID1cbiAgICAgIE9iamVjdC5rZXlzKGlucHV0cykubWFwKG5hbWUgPT4gcGFyc2VOb2RlTmFtZShuYW1lKVswXSk7XG5cbiAgbGV0IGluaXROb2RlTmFtZXM6IHN0cmluZ1tdID0gW107XG4gIGlmIChpbml0Tm9kZXMgIT0gbnVsbCkge1xuICAgIGluaXROb2RlTmFtZXMgPSBpbml0Tm9kZXMubWFwKG5vZGUgPT4gcGFyc2VOb2RlTmFtZShub2RlLm5hbWUpWzBdKTtcbiAgfVxuXG4gIGNvbnN0IGZyb250aWVyID0gWy4uLm91dHB1dHNdO1xuICB3aGlsZSAoZnJvbnRpZXIubGVuZ3RoID4gMCkge1xuICAgIGNvbnN0IG5vZGUgPSBmcm9udGllci5wb3AoKTtcbiAgICBpZiAoaXNDb250cm9sRmxvdyhub2RlKSB8fCBpc0R5bmFtaWNTaGFwZShub2RlKSB8fCBpc0hhc2hUYWJsZShub2RlKSkge1xuICAgICAgaWYgKGR5bmFtaWNOb2RlID09IG51bGwpIHtcbiAgICAgICAgZHluYW1pY05vZGUgPSBub2RlO1xuICAgICAgICBzeW5jSW5wdXRzID0gZHluYW1pY05vZGUuY2hpbGRyZW4ubWFwKGNoaWxkID0+IGNoaWxkLm5hbWUpXG4gICAgICAgICAgICAgICAgICAgICAgICAgLmZpbHRlcihuYW1lID0+IHVzZWROb2Rlcy5oYXMobmFtZSkpO1xuICAgICAgfVxuICAgIH1cbiAgICB1c2VkTm9kZXMuYWRkKG5vZGUubmFtZSk7XG5cbiAgICAvLyBXZWlnaHRzIGFyZSBkZWFkIGVuZCBzaW5jZSB3ZSBhbHJlYWR5IGhhdmUgdGhlaXIgdmFsdWVzLlxuICAgIGlmICh3ZWlnaHRNYXBbbm9kZS5uYW1lXSAhPSBudWxsKSB7XG4gICAgICBjb250aW51ZTtcbiAgICB9XG4gICAgLy8gVGhpcyBub2RlIGlzIGEgZGVhZCBlbmQgc2luY2UgaXQncyBvbmUgb2YgdGhlIHVzZXItcHJvdmlkZWQgaW5wdXRzLlxuICAgIGlmIChpbnB1dE5vZGVOYW1lcy5pbmRleE9mKG5vZGUubmFtZSkgIT09IC0xKSB7XG4gICAgICBjb250aW51ZTtcbiAgICB9XG4gICAgLy8gVGhpcyBub2RlIGlzIGEgZGVhZCBlbmQgc2luY2UgaXQgZG9lc24ndCBoYXZlIGFueSBpbnB1dHMuXG4gICAgaWYgKGluaXROb2RlTmFtZXMuaW5kZXhPZihub2RlLm5hbWUpICE9PSAtMSkge1xuICAgICAgY29udGludWU7XG4gICAgfVxuICAgIGlmIChub2RlLmlucHV0cy5sZW5ndGggPT09IDApIHtcbiAgICAgIG1pc3NpbmdJbnB1dHMucHVzaChub2RlLm5hbWUpO1xuICAgICAgY29udGludWU7XG4gICAgfVxuICAgIG5vZGUuaW5wdXRzLmZvckVhY2goaW5wdXQgPT4ge1xuICAgICAgLy8gRG9uJ3QgYWRkIHRvIHRoZSBmcm9udGllciBpZiBpdCBpcyBhbHJlYWR5IHRoZXJlLlxuICAgICAgaWYgKHNlZW4uaGFzKGlucHV0Lm5hbWUpKSB7XG4gICAgICAgIHJldHVybjtcbiAgICAgIH1cbiAgICAgIHNlZW4uYWRkKGlucHV0Lm5hbWUpO1xuICAgICAgZnJvbnRpZXIucHVzaChpbnB1dCk7XG4gICAgfSk7XG4gIH1cbiAgcmV0dXJuIHtpbnB1dHMsIG91dHB1dHMsIHVzZWROb2RlcywgbWlzc2luZ0lucHV0cywgZHluYW1pY05vZGUsIHN5bmNJbnB1dHN9O1xufVxuXG4vKipcbiAqIEdpdmVuIHRoZSBleGVjdXRpb24gaW5mbywgcmV0dXJuIGEgbGlzdCBvZiBub2RlcyBpbiB0b3BvbG9naWNhbCBvcmRlciB0aGF0XG4gKiBuZWVkIHRvIGJlIGV4ZWN1dGVkIHRvIGNvbXB1dGUgdGhlIG91dHB1dC5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGdldE5vZGVzSW5Ub3BvbG9naWNhbE9yZGVyKFxuICAgIGdyYXBoOiBHcmFwaCwgd2VpZ2h0TWFwOiBOYW1lZFRlbnNvcnNNYXAsXG4gICAgZXhlY3V0aW9uSW5mbzogRXhlY3V0aW9uSW5mbyk6IE5vZGVbXSB7XG4gIGNvbnN0IHt1c2VkTm9kZXMsIGlucHV0c30gPSBleGVjdXRpb25JbmZvO1xuICBjb25zdCBmcm9udGllcjogTm9kZVtdID0gW107XG4gIGNvbnN0IGlucHV0Tm9kZXMgPSBPYmplY3Qua2V5cyhpbnB1dHMpXG4gICAgICAgICAgICAgICAgICAgICAgICAgLm1hcChuYW1lID0+IHBhcnNlTm9kZU5hbWUobmFtZSlbMF0pXG4gICAgICAgICAgICAgICAgICAgICAgICAgLm1hcChuYW1lID0+IGdyYXBoLm5vZGVzW25hbWVdKTtcbiAgY29uc3QgaW5pdE5vZGVzID0gZ3JhcGguaW5pdE5vZGVzO1xuXG4gIGlucHV0Tm9kZXMuZm9yRWFjaChpbnB1dCA9PiB7XG4gICAgaWYgKHVzZWROb2Rlcy5oYXMoaW5wdXQubmFtZSkpIHtcbiAgICAgIGZyb250aWVyLnB1c2goaW5wdXQpO1xuICAgIH1cbiAgfSk7XG4gIGdyYXBoLndlaWdodHMuZm9yRWFjaCh3ZWlnaHQgPT4ge1xuICAgIGlmICh1c2VkTm9kZXMuaGFzKHdlaWdodC5uYW1lKSkge1xuICAgICAgZnJvbnRpZXIucHVzaCh3ZWlnaHQpO1xuICAgIH1cbiAgfSk7XG4gIGlmIChpbml0Tm9kZXMgIT0gbnVsbCkge1xuICAgIGluaXROb2Rlcy5mb3JFYWNoKG5vZGUgPT4ge1xuICAgICAgaWYgKHVzZWROb2Rlcy5oYXMobm9kZS5uYW1lKSkge1xuICAgICAgICBmcm9udGllci5wdXNoKG5vZGUpO1xuICAgICAgfVxuICAgIH0pO1xuICB9XG4gIGNvbnN0IHNlZW4gPSBuZXcgU2V0PHN0cmluZz4oKTtcbiAgY29uc3Qgb3JkZXJlZE5vZGVzOiBOb2RlW10gPSBbXTtcbiAgd2hpbGUgKGZyb250aWVyLmxlbmd0aCA+IDApIHtcbiAgICBjb25zdCBub2RlID0gZnJvbnRpZXIucG9wKCk7XG4gICAgc2Vlbi5hZGQobm9kZS5uYW1lKTtcbiAgICBpZiAoIXdlaWdodE1hcFtub2RlLm5hbWVdKSB7XG4gICAgICBvcmRlcmVkTm9kZXMucHVzaChub2RlKTtcbiAgICB9XG4gICAgbm9kZS5jaGlsZHJlbi5mb3JFYWNoKGNoaWxkID0+IHtcbiAgICAgIGlmICghc2Vlbi5oYXMoY2hpbGQubmFtZSkgJiYgdXNlZE5vZGVzLmhhcyhjaGlsZC5uYW1lKSAmJlxuICAgICAgICAgIGNoaWxkLmlucHV0cy5ldmVyeShpbnB1dCA9PiBzZWVuLmhhcyhpbnB1dC5uYW1lKSkpIHtcbiAgICAgICAgZnJvbnRpZXIucHVzaChjaGlsZCk7XG4gICAgICB9XG4gICAgfSk7XG4gIH1cbiAgcmV0dXJuIG9yZGVyZWROb2Rlcztcbn1cblxuY29uc3QgQ09OVFJPTF9GTE9XX09QUyA9IFtcbiAgJ1N3aXRjaCcsICdNZXJnZScsICdFbnRlcicsICdFeGl0JywgJ05leHRJdGVyYXRpb24nLCAnU3RhdGVsZXNzSWYnLFxuICAnU3RhdGVsZXNzV2hpbGUnLCAnaWYnLCAnV2hpbGUnXG5dO1xuY29uc3QgRFlOQU1JQ19TSEFQRV9PUFMgPSBbXG4gICdOb25NYXhTdXBwcmVzc2lvblYyJywgJ05vbk1heFN1cHByZXNzaW9uVjMnLCAnTm9uTWF4U3VwcHJlc3Npb25WNScsICdXaGVyZSdcbl07XG5jb25zdCBIQVNIX1RBQkxFX09QUyA9IFtcbiAgJ0hhc2hUYWJsZScsICdIYXNoVGFibGVWMicsICdMb29rdXBUYWJsZUltcG9ydCcsICdMb29rdXBUYWJsZUltcG9ydFYyJyxcbiAgJ0xvb2t1cFRhYmxlRmluZCcsICdMb29rdXBUYWJsZUZpbmRWMicsICdMb29rdXBUYWJsZVNpemUnLCAnTG9va3VwVGFibGVTaXplVjInXG5dO1xuXG5leHBvcnQgZnVuY3Rpb24gaXNDb250cm9sRmxvdyhub2RlOiBOb2RlKSB7XG4gIHJldHVybiBDT05UUk9MX0ZMT1dfT1BTLmluZGV4T2Yobm9kZS5vcCkgPj0gMDtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGlzRHluYW1pY1NoYXBlKG5vZGU6IE5vZGUpIHtcbiAgcmV0dXJuIERZTkFNSUNfU0hBUEVfT1BTLmluZGV4T2Yobm9kZS5vcCkgPj0gMDtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGlzSGFzaFRhYmxlKG5vZGU6IE5vZGUpIHtcbiAgcmV0dXJuIEhBU0hfVEFCTEVfT1BTLmluZGV4T2Yobm9kZS5vcCkgPj0gMDtcbn1cbiJdfQ==","/**\n * @license\n * Copyright 2018 Google LLC. All Rights Reserved.\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n * =============================================================================\n */\nimport { env, tidy, util } from '@tensorflow/tfjs-core';\nimport { getNodeNameAndIndex, getParamValue, getTensor, getTensorsForCurrentContenxt, parseNodeName } from '../operations/executors/utils';\nimport { executeOp } from '../operations/operation_executor';\nimport { ExecutionContext } from './execution_context';\nimport { getExecutionSubgraph, getNodesInTopologicalOrder, isControlFlow } from './model_analysis';\nexport class GraphExecutor {\n /**\n *\n * @param graph Graph the model or function graph to be executed.\n * @param parent When building function exector you need to set the parent\n * executor. Since the weights and function executor maps are set at parant\n * level, that function executor can access the function maps and weight maps\n * through the parent.\n */\n constructor(graph, parent) {\n this.graph = graph;\n this.parent = parent;\n this.compiledMap = new Map();\n this._weightMap = {};\n this.SEPERATOR = ',';\n this._functions = {};\n this._functionExecutorMap = {};\n this.intermediateTensors = {};\n this.keepTensorForDebug = false;\n this._outputs = graph.outputs;\n this._inputs = graph.inputs;\n this._initNodes = graph.initNodes;\n this._signature = graph.signature;\n this._functions = graph.functions;\n // create sub-graph executors\n if (graph.functions != null) {\n Object.keys(graph.functions).forEach(name => {\n this._functionExecutorMap[name] =\n new GraphExecutor(graph.functions[name], this);\n });\n }\n }\n get weightIds() {\n return this.parent ? this.parent.weightIds : this._weightIds;\n }\n get functionExecutorMap() {\n return this.parent ? this.parent.functionExecutorMap :\n this._functionExecutorMap;\n }\n get weightMap() {\n return this.parent ? this.parent.weightMap : this._weightMap;\n }\n set weightMap(weightMap) {\n const weightIds = Object.keys(weightMap).map(key => weightMap[key].map(tensor => tensor.id));\n this._weightIds = [].concat(...weightIds);\n this._weightMap = weightMap;\n }\n /**\n * Set `ResourceManager` shared by executors of a model.\n * @param resourceManager: `ResourceManager` of the `GraphModel`.\n */\n set resourceManager(resourceManager) {\n this._resourceManager = resourceManager;\n }\n get inputs() {\n return this._inputs.map(node => {\n return {\n name: node.name,\n shape: node.attrParams['shape'] ?\n node.attrParams['shape'].value :\n undefined,\n dtype: node.attrParams['dtype'] ?\n node.attrParams['dtype'].value :\n undefined\n };\n });\n }\n get outputs() {\n return this._outputs.map(node => {\n return {\n name: node.name,\n shape: node.attrParams['shape'] ?\n node.attrParams['shape'].value :\n undefined,\n dtype: node.attrParams['dtype'] ?\n node.attrParams['dtype'].value :\n undefined\n };\n });\n }\n get inputNodes() {\n return this._inputs.map(node => node.signatureKey || node.name);\n }\n get outputNodes() {\n return this._outputs.map((node) => {\n const name = node.signatureKey || node.name;\n return node.defaultOutput ? (`${name}:${node.defaultOutput}`) : name;\n });\n }\n get functions() {\n return Object.keys(this._functions).reduce((map, key) => {\n map[key] = this._functions[key].signature;\n return map;\n }, {});\n }\n getCompilationKey(inputs, outputs) {\n const sortedInputs = inputs.map(node => node.name).sort();\n const sortedOutputs = outputs.map(node => node.name).sort();\n return sortedInputs.join(this.SEPERATOR) + '--' +\n sortedOutputs.join(this.SEPERATOR);\n }\n /**\n * Compiles the inference graph and returns the minimal set of nodes that are\n * required for execution, in the correct execution order.\n */\n compile(inputs, outputs) {\n const executionInfo = getExecutionSubgraph(inputs, outputs, this.weightMap, this._initNodes);\n const { missingInputs, dynamicNode, syncInputs } = executionInfo;\n if (dynamicNode != null) {\n throw new Error(`This execution contains the node '${dynamicNode.name}', which has ` +\n `the dynamic op '${dynamicNode.op}'. Please use ` +\n `model.executeAsync() instead. Alternatively, to avoid the ` +\n `dynamic ops, specify the inputs [${syncInputs}]`);\n }\n if (missingInputs.length > 0) {\n const outNames = outputs.map(n => n.name);\n const inNames = Object.keys(inputs);\n throw new Error(`Cannot compute the outputs [${outNames}] from the provided inputs ` +\n `[${inNames}]. Missing the following inputs: [${missingInputs}]`);\n }\n return getNodesInTopologicalOrder(this.graph, this.weightMap, executionInfo);\n }\n /**\n * Executes the inference for given input tensors.\n * @param inputs Tensor map for the model inputs, keyed by the input node\n * names.\n * @param outputs Optional. output node name from the Tensorflow model, if\n * no outputs are specified, the default outputs of the model would be used.\n * You can inspect intermediate nodes of the model by adding them to the\n * outputs array.\n */\n execute(inputs, outputs) {\n inputs = this.mapInputs(inputs);\n const names = Object.keys(inputs).sort();\n this.checkInputs(inputs);\n this.checkInputShapeAndType(inputs);\n outputs = this.mapOutputs(outputs);\n this.checkOutputs(outputs);\n const inputNodes = names.map(name => this.graph.nodes[parseNodeName(name)[0]]);\n const outputNodeNames = outputs.map(name => parseNodeName(name)[0]);\n let outputNodes = outputNodeNames.map(name => this.graph.nodes[name]);\n this.resetIntermediateTensors();\n // If no outputs are specified, then use the default outputs of the model.\n if (outputNodes.length === 0) {\n outputNodes = this._outputs;\n }\n const compilationKey = this.getCompilationKey(inputNodes, outputNodes);\n // Do nothing if the compiled graph cache contains the input.\n let orderedNodes = this.compiledMap.get(compilationKey);\n if (orderedNodes == null) {\n orderedNodes = this.compile(inputs, outputNodes);\n this.compiledMap.set(compilationKey, orderedNodes);\n }\n const tensorArrayMap = {};\n const tensorListMap = {};\n return tidy(() => {\n const context = new ExecutionContext(this.weightMap, tensorArrayMap, tensorListMap, this.functionExecutorMap);\n const tensorsMap = Object.assign({}, this.weightMap);\n Object.keys(inputs).forEach(name => {\n const [nodeName, index] = parseNodeName(name);\n const tensors = [];\n tensors[index] = inputs[name];\n tensorsMap[nodeName] = tensors;\n });\n const tensorsToKeep = this.getFrozenTensorIds(tensorsMap);\n const intermediateTensorConsumerCount = {};\n for (let i = 0; i < orderedNodes.length; i++) {\n const node = orderedNodes[i];\n if (!tensorsMap[node.name]) {\n const tensors = executeOp(node, tensorsMap, context, this._resourceManager);\n if (util.isPromise(tensors)) {\n throw new Error(`The execution of the op '${node.op}' returned a promise. ` +\n `Please use model.executeAsync() instead.`);\n }\n tensorsMap[node.name] = tensors;\n this.checkTensorForDisposal(node.name, node, tensorsMap, context, tensorsToKeep, outputNodeNames, intermediateTensorConsumerCount);\n }\n }\n // dispose the context for the root executor\n if (this.parent == null) {\n context.dispose(tensorsToKeep);\n }\n return outputs.map(name => getTensor(name, tensorsMap, context));\n });\n }\n getFrozenTensorIds(tensorMap) {\n const ids = [].concat.apply([], Object.keys(tensorMap)\n .map(key => tensorMap[key])\n .map(tensors => tensors.map(tensor => tensor.id)));\n return new Set(ids);\n }\n checkTensorForDisposal(nodeName, node, tensorMap, context, tensorsToKeep, outputNames, intermediateTensorConsumerCount) {\n // Skip output nodes and any control flow nodes, since its dependency is\n // tricky to track correctly.\n if (node.category === 'control' || outputNames.indexOf(nodeName) !== -1) {\n return;\n }\n tensorMap[nodeName].forEach(tensor => {\n if (tensor != null) {\n intermediateTensorConsumerCount[tensor.id] =\n (intermediateTensorConsumerCount[tensor.id] || 0) +\n node.children.length;\n }\n });\n node.inputs.forEach(input => {\n // Skip any control flow nodes, since its dependency is tricky to track\n // correctly.\n if (input.category !== 'control') {\n const tensors = getTensorsForCurrentContenxt(input.name, tensorMap, context);\n if (tensors != null) {\n tensors.forEach(tensor => {\n if (tensor && !tensor.kept && !tensorsToKeep.has(tensor.id)) {\n const count = intermediateTensorConsumerCount[tensor.id];\n if (count === 1) {\n if (!this.keepTensorForDebug) {\n tensor.dispose();\n }\n else {\n const [nodeName, index] = getNodeNameAndIndex(node.name, context);\n if (this.intermediateTensors[nodeName]) {\n this.intermediateTensors[nodeName][index] = tensor;\n }\n else {\n this.intermediateTensors[nodeName] = [];\n this.intermediateTensors[nodeName][index] = tensor;\n }\n }\n delete intermediateTensorConsumerCount[tensor.id];\n }\n else if (count != null) {\n // only intermediate nodes has count set, inputs and weights are\n // not.\n intermediateTensorConsumerCount[tensor.id]--;\n }\n }\n });\n }\n }\n });\n }\n /**\n * Executes the inference for given input tensors in Async fashion.\n * @param inputs Tensor map for the model inputs, keyed by the input node\n * names.\n * @param outputs output node name from the Tensorflow model, if no outputs\n * are specified, the default outputs of the model would be used. You can\n * inspect intermediate nodes of the model by adding them to the outputs\n * array.\n */\n async executeAsync(inputs, outputs) {\n return this._executeAsync(inputs, outputs);\n }\n disposeIntermediateTensors() {\n if (!this.intermediateTensors) {\n return;\n }\n Object.keys(this.intermediateTensors)\n .forEach(key => this.intermediateTensors[key].forEach(tensor => tensor.dispose()));\n this.disposeTensorsMap();\n }\n disposeTensorsMap() {\n if (!this.tensorsMap) {\n return;\n }\n Object.keys(this.tensorsMap).forEach(key => {\n const tensorArray = this.tensorsMap[key];\n tensorArray.forEach(tensor => {\n if (tensor && !tensor.kept && !tensor.isDisposed &&\n !this.keepIds.has(tensor.id)) {\n tensor.dispose();\n }\n });\n });\n }\n getIntermediateTensors() {\n return this.tensorsMap;\n }\n resetIntermediateTensors() {\n for (const key in this.intermediateTensors) {\n this.intermediateTensors[key].forEach(tensor => tensor.dispose());\n delete this.intermediateTensors[key];\n }\n }\n /**\n * Executes the inference for given input tensors in Async fashion.\n * @param inputs Tensor map for the model inputs, keyed by the input node\n * names.\n * @param outputs Optional. output node name from the Tensorflow model,\n * if no outputs are specified, the default outputs of the model would be\n * used. You can inspect intermediate nodes of the model by adding them to the\n * outputs array.\n * @param isFunctionExecution Optional. Flag for executing a function.\n * @param tensorArrayMap Optional, global TensorArray map by id. Used for\n * function execution.\n * @param tensorArrayMap Optinal global TensorList map by id. Used for\n * function execution.\n */\n async _executeAsync(inputs, outputs, isFunctionExecution = false, tensorArrayMap = {}, tensorListMap = {}) {\n if (!isFunctionExecution) {\n inputs = this.mapInputs(inputs);\n this.checkInputs(inputs);\n this.checkInputShapeAndType(inputs);\n outputs = this.mapOutputs(outputs);\n this.checkOutputs(outputs);\n }\n // For model debug.\n try {\n this.keepTensorForDebug = env().getBool('KEEP_INTERMEDIATE_TENSORS');\n }\n catch (e) {\n console.warn(e.message);\n }\n this.resetIntermediateTensors();\n const context = new ExecutionContext(this.weightMap, tensorArrayMap, tensorListMap, this.functionExecutorMap);\n // Graph with control flow op requires runtime evaluation of the execution\n // order, while without control flow the execution order is pre-determined\n // in the compile method.\n this.tensorsMap = await this.executeWithControlFlow(inputs, context, outputs, isFunctionExecution);\n const results = outputs.map(name => getTensor(name, this.tensorsMap, context));\n // dispose all the intermediate tensors\n const outputIds = results.map(t => t.id);\n const inputIds = Object.keys(inputs).map(name => inputs[name].id);\n this.keepIds =\n new Set([...outputIds, ...inputIds, ...this.weightIds]);\n if (!this.keepTensorForDebug) {\n this.disposeTensorsMap();\n }\n // dispose the context for the root executor\n if (this.parent == null) {\n context.dispose(this.keepIds);\n }\n return results;\n }\n async executeFunctionAsync(inputs, tensorArrayMap, tensorListMap) {\n const mappedInputs = inputs.reduce((map, tensor, index) => {\n map[this.inputs[index].name] = tensor;\n return map;\n }, {});\n return this._executeAsync(mappedInputs, this.outputNodes, true, tensorArrayMap, tensorListMap);\n }\n /**\n * When there are control flow nodes in the graph, the graph execution use\n * ExecutionContext to keep track of the frames and loop iterators.\n * @param inputs placeholder tensors for the graph.\n * @param context the execution context object for current execution.\n * @param outputNames Optional. output node name from the Tensorflow model,\n * if no outputs are specified, the default outputs of the model would be\n * used. You can inspect intermediate nodes of the model by adding them to the\n * outputs array.\n * @param isFunctionExecution Flag for executing a function.\n */\n async executeWithControlFlow(inputs, context, outputNames, isFunctionExecution) {\n const names = Object.keys(inputs);\n const inputNodes = names.map(name => this.graph.nodes[parseNodeName(name)[0]]);\n const outputNodeNames = outputNames.map(name => parseNodeName(name)[0]);\n let outputNodes = outputNodeNames.map(name => this.graph.nodes[name]);\n // If no outputs are specified, then use the default outputs of the model.\n if (outputNodes.length === 0) {\n outputNodes = this._outputs;\n }\n const { usedNodes, missingInputs, dynamicNode, syncInputs } = getExecutionSubgraph(inputs, outputNodes, this.weightMap, this._initNodes);\n // First nodes to execute include inputNodes, weights, and initNodes.\n const stack = [\n ...inputNodes, ...this.graph.weights, ...(this._initNodes || [])\n ].map(node => {\n return { node, contexts: context.currentContext };\n });\n const tensorsMap = Object.assign({}, this.weightMap);\n Object.keys(inputs).forEach(name => {\n const [nodeName, index] = parseNodeName(name);\n const tensors = [];\n tensors[index] = inputs[name];\n tensorsMap[nodeName] = tensors;\n });\n const intermediateTensorConsumerCount = {};\n const tensorsToKeep = this.getFrozenTensorIds(tensorsMap);\n const added = {};\n while (stack.length > 0) {\n const promises = this.processStack(inputNodes, stack, context, tensorsMap, added, tensorsToKeep, outputNodeNames, intermediateTensorConsumerCount, usedNodes);\n await Promise.all(promises);\n }\n if (dynamicNode == null && !isFunctionExecution) {\n console.warn(`This model execution did not contain any nodes with control flow ` +\n `or dynamic output shapes. You can use model.execute() instead.`);\n }\n const missingOutputs = outputNodes\n .filter(node => !isControlFlow(node) &&\n !getTensor(node.name, tensorsMap, context))\n .map(node => node.name);\n if (missingOutputs.length > 0) {\n let alternativeMsg = '';\n if (dynamicNode != null) {\n alternativeMsg =\n `Alternatively, to avoid the dynamic ops, use model.execute() ` +\n `and specify the inputs [${syncInputs}]`;\n }\n throw new Error(`Cannot compute the outputs [${missingOutputs}] from the provided ` +\n `inputs [${names}]. Consider providing the following inputs: ` +\n `[${missingInputs}]. ${alternativeMsg}`);\n }\n return tensorsMap;\n }\n processStack(inputNodes, stack, context, tensorMap, added, tensorsToKeep, outputNames, intermediateTensorConsumerCount, usedNodes) {\n const promises = [];\n while (stack.length > 0) {\n const item = stack.pop();\n context.currentContext = item.contexts;\n let nodeName = '';\n // The tensor of the Enter op with isConstant set should be set\n // in the parent scope, so it will be available as constant for the\n // whole loop.\n if (item.node.op === 'Enter' &&\n getParamValue('isConstant', item.node, tensorMap, context)) {\n [nodeName] = getNodeNameAndIndex(item.node.name, context);\n }\n // only process nodes that are not in the tensorMap yet, this include\n // inputNodes and internal initNodes.\n if (tensorMap[item.node.name] == null) {\n const tensors = executeOp(item.node, tensorMap, context, this._resourceManager);\n if (!nodeName) {\n [nodeName] = getNodeNameAndIndex(item.node.name, context);\n }\n const currentContext = context.currentContext;\n if (util.isPromise(tensors)) {\n promises.push(tensors.then(t => {\n tensorMap[nodeName] = t;\n context.currentContext = currentContext;\n this.checkTensorForDisposal(nodeName, item.node, tensorMap, context, tensorsToKeep, outputNames, intermediateTensorConsumerCount);\n this.processChildNodes(item.node, stack, context, tensorMap, added, usedNodes);\n return t;\n }));\n }\n else {\n tensorMap[nodeName] = tensors;\n this.checkTensorForDisposal(nodeName, item.node, tensorMap, context, tensorsToKeep, outputNames, intermediateTensorConsumerCount);\n this.processChildNodes(item.node, stack, context, tensorMap, added, usedNodes);\n }\n }\n else {\n this.processChildNodes(item.node, stack, context, tensorMap, added, usedNodes);\n }\n }\n return promises;\n }\n processChildNodes(node, stack, context, tensorMap, added, usedNodes) {\n node.children.forEach((childNode) => {\n const [nodeName,] = getNodeNameAndIndex(childNode.name, context);\n if (added[nodeName] || !usedNodes.has(childNode.name)) {\n return;\n }\n // Merge op can be pushed if any of its inputs has value.\n if (childNode.op === 'Merge') {\n if (childNode.inputNames.some(name => {\n return !!getTensor(name, tensorMap, context);\n })) {\n added[nodeName] = true;\n stack.push({ contexts: context.currentContext, node: childNode });\n }\n }\n else // Otherwise all inputs must to have value.\n if (childNode.inputNames.every(name => {\n return !!getTensor(name, tensorMap, context);\n })) {\n added[nodeName] = true;\n stack.push({ contexts: context.currentContext, node: childNode });\n }\n });\n }\n /**\n * Releases the memory used by the weight tensors.\n */\n dispose() {\n Object.keys(this.weightMap)\n .forEach(key => this.weightMap[key].forEach(tensor => tensor.dispose()));\n }\n checkInputShapeAndType(inputs) {\n Object.keys(inputs).forEach(name => {\n const input = inputs[name];\n const [nodeName,] = parseNodeName(name);\n const node = this.graph.nodes[nodeName];\n if (node.attrParams['shape'] && node.attrParams['shape'].value) {\n const shape = node.attrParams['shape'].value;\n const match = shape.length === input.shape.length &&\n input.shape.every((dim, index) => shape[index] === -1 || shape[index] === dim);\n util.assert(match, () => `The shape of dict['${node.name}'] provided in ` +\n `model.execute(dict) must be [${shape}], but was ` +\n `[${input.shape}]`);\n }\n if (node.attrParams['dtype'] && node.attrParams['dtype'].value) {\n util.assert(input.dtype === node.attrParams['dtype'].value, () => `The dtype of dict['${node.name}'] provided in ` +\n `model.execute(dict) must be ` +\n `${node.attrParams['dtype'].value}, but was ${input.dtype}`);\n }\n });\n }\n mapInputs(inputs) {\n const result = {};\n for (const inputName in inputs) {\n if (this._signature != null && this._signature.inputs != null &&\n this._signature.inputs[inputName] != null) {\n const tensor = this._signature.inputs[inputName];\n result[tensor.name] = inputs[inputName];\n }\n else {\n result[inputName] = inputs[inputName];\n }\n }\n return result;\n }\n checkInputs(inputs) {\n const notInGraph = Object.keys(inputs).filter(name => {\n const [nodeName] = parseNodeName(name);\n return this.graph.nodes[nodeName] == null;\n });\n if (notInGraph.length > 0) {\n throw new Error(`The dict provided in model.execute(dict) has ` +\n `keys: [${notInGraph}] that are not part of graph`);\n }\n }\n mapOutputs(outputs) {\n return outputs.map(name => {\n if (this._signature != null && this._signature.outputs != null &&\n this._signature.outputs[name] != null) {\n const tensor = this._signature.outputs[name];\n return tensor.name;\n }\n return name;\n }, {});\n }\n checkOutputs(outputs) {\n outputs.forEach(name => {\n const [normalizedName] = parseNodeName(name);\n if (!this.graph.nodes[normalizedName]) {\n throw new Error(`The output '${name}' is not found in the graph`);\n }\n });\n }\n}\n//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZ3JhcGhfZXhlY3V0b3IuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi8uLi90ZmpzLWNvbnZlcnRlci9zcmMvZXhlY3V0b3IvZ3JhcGhfZXhlY3V0b3IudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUE7Ozs7Ozs7Ozs7Ozs7OztHQWVHO0FBRUgsT0FBTyxFQUFXLEdBQUcsRUFBMEIsSUFBSSxFQUFFLElBQUksRUFBQyxNQUFNLHVCQUF1QixDQUFDO0FBSXhGLE9BQU8sRUFBQyxtQkFBbUIsRUFBRSxhQUFhLEVBQUUsU0FBUyxFQUFFLDRCQUE0QixFQUFFLGFBQWEsRUFBQyxNQUFNLCtCQUErQixDQUFDO0FBQ3pJLE9BQU8sRUFBQyxTQUFTLEVBQUMsTUFBTSxrQ0FBa0MsQ0FBQztBQUczRCxPQUFPLEVBQUMsZ0JBQWdCLEVBQXVCLE1BQU0scUJBQXFCLENBQUM7QUFDM0UsT0FBTyxFQUFDLG9CQUFvQixFQUFFLDBCQUEwQixFQUFFLGFBQWEsRUFBQyxNQUFNLGtCQUFrQixDQUFDO0FBU2pHLE1BQU0sT0FBTyxhQUFhO0lBMkZ4Qjs7Ozs7OztPQU9HO0lBQ0gsWUFBb0IsS0FBWSxFQUFVLE1BQXNCO1FBQTVDLFVBQUssR0FBTCxLQUFLLENBQU87UUFBVSxXQUFNLEdBQU4sTUFBTSxDQUFnQjtRQWxHeEQsZ0JBQVcsR0FBd0IsSUFBSSxHQUFHLEVBQUUsQ0FBQztRQUM3QyxlQUFVLEdBQW9CLEVBQUUsQ0FBQztRQU1qQyxjQUFTLEdBQUcsR0FBRyxDQUFDO1FBQ2hCLGVBQVUsR0FBMkIsRUFBRSxDQUFDO1FBQ3hDLHlCQUFvQixHQUFzQyxFQUFFLENBQUM7UUFFN0Qsd0JBQW1CLEdBQW9CLEVBQUUsQ0FBQztRQUcxQyx1QkFBa0IsR0FBRyxLQUFLLENBQUM7UUFxRmpDLElBQUksQ0FBQyxRQUFRLEdBQUcsS0FBSyxDQUFDLE9BQU8sQ0FBQztRQUM5QixJQUFJLENBQUMsT0FBTyxHQUFHLEtBQUssQ0FBQyxNQUFNLENB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QUM7Z0JBQzdDLE9BQU8sTUFBTSxDQUFDLElBQUksQ0FBQzthQUNwQjtZQUNELE9BQU8sSUFBSSxDQUFDO1FBQ2QsQ0FBQyxFQUFFLEVBQUUsQ0FBQyxDQUFDO0lBQ1QsQ0FBQztJQUVPLFlBQVksQ0FBQyxPQUFpQjtRQUNwQyxPQUFPLENBQUMsT0FBTyxDQUFDLElBQUksQ0FBQyxFQUFFO1lBQ3JCLE1BQU0sQ0FBQyxjQUFjLENBQUMsR0FBRyxhQUFhLENBQUMsSUFBSSxDQUFDLENBQUM7WUFDN0MsSUFBSSxDQUFDLElBQUksQ0FBQyxLQUFLLENBQUMsS0FBSyxDQUFDLGNBQWMsQ0FBQyxFQUFFO2dCQUNyQyxNQUFNLElBQUksS0FBSyxDQUFDLGVBQWUsSUFBSSw2QkFBNkIsQ0FBQyxDQUFDO2FBQ25FO1FBQ0gsQ0FBQyxDQUFDLENBQUM7SUFDTCxDQUFDO0NBQ0YiLCJzb3VyY2VzQ29udGVudCI6WyIvKipcbiAqIEBsaWNlbnNlXG4gKiBDb3B5cmlnaHQgMjAxOCBHb29nbGUgTExDLiBBbGwgUmlnaHRzIFJlc2VydmVkLlxuICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlIFwiTGljZW5zZVwiKTtcbiAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS5cbiAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdFxuICpcbiAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMFxuICpcbiAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmVcbiAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuIFwiQVMgSVNcIiBCQVNJUyxcbiAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLlxuICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZFxuICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuXG4gKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuICovXG5cbmltcG9ydCB7RGF0YVR5cGUsIGVudiwgTmFtZWRUZW5zb3JNYXAsIFRlbnNvciwgdGlkeSwgdXRpbH0gZnJvbSAnQHRlbnNvcmZsb3cvdGZqcy1jb3JlJztcblxuaW1wb3J0IHtJU2lnbmF0dXJlRGVmfSBmcm9tICcuLi9kYXRhL2NvbXBpbGVkX2FwaSc7XG5pbXBvcnQge05hbWVkVGVuc29yc01hcCwgVGVuc29yQXJyYXlNYXAsIFRlbnNvckluZm8sIFRlbnNvckxpc3RNYXB9IGZyb20gJy4uL2RhdGEvdHlwZXMnO1xuaW1wb3J0IHtnZXROb2RlTmFtZUFuZEluZGV4LCBnZXRQYXJhbVZhbHVlLCBnZXRUZW5zb3IsIGdldFRlbnNvcnNGb3JDdXJyZW50Q29udGVueHQsIHBhcnNlTm9kZU5hbWV9IGZyb20gJy4uL29wZXJhdGlvbnMvZXhlY3V0b3JzL3V0aWxzJztcbmltcG9ydCB7ZXhlY3V0ZU9wfSBmcm9tICcuLi9vcGVyYXRpb25zL29wZXJhdGlvbl9leGVjdXRvcic7XG5pbXBvcnQge0dyYXBoLCBOb2RlfSBmcm9tICcuLi9vcGVyYXRpb25zL3R5cGVzJztcblxuaW1wb3J0IHtFeGVjdXRpb25Db250ZXh0LCBFeGVjdXRpb25Db250ZXh0SW5mb30gZnJvbSAnLi9leGVjdXRpb25fY29udGV4dCc7XG5pbXBvcnQge2dldEV4ZWN1dGlvblN1YmdyYXBoLCBnZXROb2Rlc0luVG9wb2xvZ2ljYWxPcmRlciwgaXNDb250cm9sRmxvd30gZnJvbSAnLi9tb2RlbF9hbmFseXNpcyc7XG5pbXBvcnQge1Jlc291cmNlTWFuYWdlcn0gZnJvbSAnLi9yZXNvdXJjZV9tYW5hZ2VyJztcbmltcG9ydCB7RnVuY3Rpb25FeGVjdXRvcn0gZnJvbSAnLi90eXBlcyc7XG5cbmludGVyZmFjZSBOb2RlV2l0aENvbnRleHRzIHtcbiAgY29udGV4dHM6IEV4ZWN1dGlvbkNvbnRleHRJbmZvW107XG4gIG5vZGU6IE5vZGU7XG59XG5cbmV4cG9ydCBjbGFzcyBHcmFwaEV4ZWN1dG9yIGltcGxlbWVudHMgRnVuY3Rpb25FeGVjdXRvciB7XG4gIHByaXZhdGUgY29tcGlsZWRNYXA6IE1hcDxzdHJpbmcsIE5vZGVbXT4gPSBuZXcgTWFwKCk7XG4gIHByaXZhdGUgX3dlaWdodE1hcDogTmFtZWRUZW5zb3JzTWFwID0ge307XG4gIHByaXZhdGUgX3dlaWdodElkczogbnVtYmVyW107XG4gIHByaXZhdGUgX3NpZ25hdHVyZTogSVNpZ25hdHVyZURlZjtcbiAgcHJpdmF0ZSBfaW5wdXRzOiBOb2RlW107XG4gIHByaXZhdGUgX291dHB1dHM6IE5vZGVbXTtcbiAgcHJpdmF0ZSBfaW5pdE5vZGVzOiBOb2RlW107ICAvLyBJbnRlcm5hbCBpbml0IG5vZGVzIHRvIHN0YXJ0IGluaXRpYWxpemF0aW9uLlxuICBwcml2YXRlIFNFUEVSQVRPUiA9ICcsJztcbiAgcHJpdmF0ZSBfZnVuY3Rpb25zOiB7W2tleTogc3RyaW5nXTogR3JhcGh9ID0ge307XG4gIHByaXZhdGUgX2Z1bmN0aW9uRXhlY3V0b3JNYXA6IHtba2V5OiBzdHJpbmddOiBGdW5jdGlvbkV4ZWN1dG9yfSA9IHt9O1xuICBwcml2YXRlIF9yZXNvdXJjZU1hbmFnZXI6IFJlc291cmNlTWFuYWdlcjtcbiAgcHJpdmF0ZSBpbnRlcm1lZGlhdGVUZW5zb3JzOiBOYW1lZFRlbnNvcnNNYXAgPSB7fTtcbiAgcHJpdmF0ZSBrZWVwSWRzOiBTZXQ8bnVtYmVyPjtcbiAgcHJpdmF0ZSB0ZW5zb3JzTWFwOiBOYW1lZFRlbnNvcnNNYXA7XG4gIHByaXZhdGUga2VlcFRlbnNvckZvckRlYnVnID0gZmFsc2U7XG5cbiAgZ2V0IHdlaWdodElkcygpOiBudW1iZXJbXSB7XG4gICAgcmV0dXJuIHRoaXMucGFyZW50ID8gdGhpcy5wYXJlbnQud2VpZ2h0SWRzIDogdGhpcy5fd2VpZ2h0SWRzO1xuICB9XG5cbiAgZ2V0IGZ1bmN0aW9uRXhlY3V0b3JNYXAoKToge1trZXk6IHN0cmluZ106IEZ1bmN0aW9uRXhlY3V0b3J9IHtcbiAgICByZXR1cm4gdGhpcy5wYXJlbnQgPyB0aGlzLnBhcmVudC5mdW5jdGlvbkV4ZWN1dG9yTWFwIDpcbiAgICAgICAgICAgICAgICAgICAgICAgICB0aGlzLl9mdW5jdGlvbkV4ZWN1dG9yTWFwO1xuICB9XG5cbiAgZ2V0IHdlaWdodE1hcCgpOiBOYW1lZFRlbnNvcnNNYXAge1xuICAgIHJldHVybiB0aGlzLnBhcmVudCA/IHRoaXMucGFyZW50LndlaWdodE1hcCA6IHRoaXMuX3dlaWdodE1hcDtcbiAgfVxuXG4gIHNldCB3ZWlnaHRNYXAod2VpZ2h0TWFwOiBOYW1lZFRlbnNvcnNNYXApIHtcbiAgICBjb25zdCB3ZWlnaHRJZHMgPSBPYmplY3Qua2V5cyh3ZWlnaHRNYXApLm1hcChcbiAgICAgICAga2V5ID0+IHdlaWdodE1hcFtrZXldLm1hcCh0ZW5zb3IgPT4gdGVuc29yLmlkKSk7XG4gICAgdGhpcy5fd2VpZ2h0SWRzID0gW10uY29uY2F0KC4uLndlaWdodElkcyk7XG4gICAgdGhpcy5fd2VpZ2h0TWFwID0gd2VpZ2h0TWFwO1xuICB9XG5cbiAgLyoqXG4gICAqIFNldCBgUmVzb3VyY2VNYW5hZ2VyYCBzaGFyZWQgYnkgZXhlY3V0b3JzIG9mIGEgbW9kZWwuXG4gICAqIEBwYXJhbSByZXNvdXJjZU1hbmFnZXI6IGBSZXNvdXJjZU1hbmFnZXJgIG9mIHRoZSBgR3JhcGhNb2RlbGAuXG4gICAqL1xuICBzZXQgcmVzb3VyY2VNYW5hZ2VyKHJlc291cmNlTWFuYWdlcjogUmVzb3VyY2VNYW5hZ2VyKSB7XG4gICAgdGhpcy5fcmVzb3VyY2VNYW5hZ2VyID0gcmVzb3VyY2VNYW5hZ2VyO1xuICB9XG5cbiAgZ2V0IGlucHV0cygpOiBUZW5zb3JJbmZvW10ge1xuICAgIHJldHVybiB0aGlzLl9pbnB1dHMubWFwKG5vZGUgPT4ge1xuICAgICAgcmV0dXJuIHtcbiAgICAgICAgbmFtZTogbm9kZS5uYW1lLFxuICAgICAgICBzaGFwZTogbm9kZS5hdHRyUGFyYW1zWydzaGFwZSddID9cbiAgICAgICAgICAgIG5vZGUuYXR0clBhcmFtc1snc2hhcGUnXS52YWx1ZSBhcyBudW1iZXJbXSA6XG4gICAgICAgICAgICB1bmRlZmluZWQsXG4gICAgICAgIGR0eXBlOiBub2RlLmF0dHJQYXJhbXNbJ2R0eXBlJ10gP1xuICAgICAgICAgICAgbm9kZS5hdHRyUGFyYW1zWydkdHlwZSddLnZhbHVlIGFzIERhdGFUeXBlIDpcbiAgICAgICAgICAgIHVuZGVmaW5lZFxuICAgICAgfTtcbiAgICB9KTtcbiAgfVxuXG4gIGdldCBvdXRwdXRzKCk6IFRlbnNvckluZm9bXSB7XG4gICAgcmV0dXJuIHRoaXMuX291dHB1dHMubWFwKG5vZGUgPT4ge1xuICAgICAgcmV0dXJuIHtcbiAgICAgICAgbmFtZTogbm9kZS5uYW1lLFxuICAgICAgICBzaGFwZTogbm9kZS5hdHRyUGFyYW1zWydzaGFwZSddID9cbiAgICAgICAgICAgIG5vZGUuYXR0clBhcmFtc1snc2hhcGUnXS52YWx1ZSBhcyBudW1iZXJbXSA6XG4gICAgICAgICAgICB1bmRlZmluZWQsXG4gICAgICAgIGR0eXBlOiBub2RlLmF0dHJQYXJhbXNbJ2R0eXBlJ10gP1xuICAgICAgICAgICAgbm9kZS5hdHRyUGFyYW1zWydkdHlwZSddLnZhbHVlIGFzIERhdGFUeXBlIDpcbiAgICAgICAgICAgIHVuZGVmaW5lZFxuICAgICAgfTtcbiAgICB9KTtcbiAgfVxuXG4gIGdldCBpbnB1dE5vZGVzKCk6IHN0cmluZ1tdIHtcbiAgICByZXR1cm4gdGhpcy5faW5wdXRzLm1hcChub2RlID0+IG5vZGUuc2lnbmF0dXJlS2V5IHx8IG5vZGUubmFtZSk7XG4gIH1cblxuICBnZXQgb3V0cHV0Tm9kZXMoKTogc3RyaW5nW10ge1xuICAgIHJldHVybiB0aGlzLl9vdXRwdXRzLm1hcCgobm9kZSkgPT4ge1xuICAgICAgY29uc3QgbmFtZSA9IG5vZGUuc2lnbmF0dXJlS2V5IHx8IG5vZGUubmFtZTtcbiAgICAgIHJldHVybiBub2RlLmRlZmF1bHRPdXRwdXQgPyAoYCR7bmFtZX06JHtub2RlLmRlZmF1bHRPdXRwdXR9YCkgOiBuYW1lO1xuICAgIH0pO1xuICB9XG5cbiAgZ2V0IGZ1bmN0aW9ucygpOiB7W2tleTogc3RyaW5nXTogSVNpZ25hdHVyZURlZn0ge1xuICAgIHJldHVybiBPYmplY3Qua2V5cyh0aGlzLl9mdW5jdGlvbnMpLnJlZHVjZSgobWFwLCBrZXkpID0+IHtcbiAgICAgIG1hcFtrZXldID0gdGhpcy5fZnVuY3Rpb25zW2tleV0uc2lnbmF0dXJlO1xuICAgICAgcmV0dXJuIG1hcDtcbiAgICB9LCB7fSBhcyB7W2tleTogc3RyaW5nXTogSVNpZ25hdHVyZURlZn0pO1xuICB9XG5cbiAgLyoqXG4gICAqXG4gICAqIEBwYXJhbSBncmFwaCBHcmFwaCB0aGUgbW9kZWwgb3IgZnVuY3Rpb24gZ3JhcGggdG8gYmUgZXhlY3V0ZWQuXG4gICAqIEBwYXJhbSBwYXJlbnQgV2hlbiBidWlsZGluZyBmdW5jdGlvbiBleGVjdG9yIHlvdSBuZWVkIHRvIHNldCB0aGUgcGFyZW50XG4gICAqIGV4ZWN1dG9yLiBTaW5jZSB0aGUgd2VpZ2h0cyBhbmQgZnVuY3Rpb24gZXhlY3V0b3IgbWFwcyBhcmUgc2V0IGF0IHBhcmFudFxuICAgKiBsZXZlbCwgdGhhdCBmdW5jdGlvbiBleGVjdXRvciBjYW4gYWNjZXNzIHRoZSBmdW5jdGlvbiBtYXBzIGFuZCB3ZWlnaHQgbWFwc1xuICAgKiB0aHJvdWdoIHRoZSBwYXJlbnQuXG4gICAqL1xuICBjb25zdHJ1Y3Rvcihwcml2YXRlIGdyYXBoOiBHcmFwaCwgcHJpdmF0ZSBwYXJlbnQ/OiBHcmFwaEV4ZWN1dG9yKSB7XG4gICAgdGhpcy5fb3V0cHV0cyA9IGdyYXBoLm91dHB1dHM7XG4gICAgdGhpcy5faW5wdXRzID0gZ3JhcGguaW5wdXRzO1xuICAgIHRoaXMuX2luaXROb2RlcyA9IGdyYXBoLmluaXROb2RlcztcbiAgICB0aGlzLl9zaWduYXR1cmUgPSBncmFwaC5zaWduYXR1cmU7XG4gICAgdGhpcy5fZnVuY3Rpb25zID0gZ3JhcGguZnVuY3Rpb25zO1xuICAgIC8vIGNyZWF0ZSBzdWItZ3JhcGggZXhlY3V0b3JzXG4gICAgaWYgKGdyYXBoLmZ1bmN0aW9ucyAhPSBudWxsKSB7XG4gICAgICBPYmplY3Qua2V5cyhncmFwaC5mdW5jdGlvbnMpLmZvckVhY2gobmFtZSA9PiB7XG4gICAgICAgIHRoaXMuX2Z1bmN0aW9uRXhlY3V0b3JNYXBbbmFtZV0gPVxuICAgICAgICAgICAgbmV3IEdyYXBoRXhlY3V0b3IoZ3JhcGguZnVuY3Rpb25zW25hbWVdLCB0aGlzKTtcbiAgICAgIH0pO1xuICAgIH1cbiAgfVxuXG4gIHByaXZhdGUgZ2V0Q29tcGlsYXRpb25LZXkoaW5wdXRzOiBOb2RlW10sIG91dHB1dHM6IE5vZGVbXSk6IHN0cmluZyB7XG4gICAgY29uc3Qgc29ydGVkSW5wdXRzID0gaW5wdXRzLm1hcChub2RlID0+IG5vZGUubmFtZSkuc29ydCgpO1xuICAgIGNvbnN0IHNvcnRlZE91dHB1dHMgPSBvdXRwdXRzLm1hcChub2RlID0+IG5vZGUubmFtZSkuc29ydCgpO1xuICAgIHJldHVybiBzb3J0ZWRJbnB1dHMuam9pbih0aGlzLlNFUEVSQVRPUikgKyAnLS0nICtcbiAgICAgICAgc29ydGVkT3V0cHV0cy5qb2luKHRoaXMuU0VQRVJBVE9SKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBDb21waWxlcyB0aGUgaW5mZXJlbmNlIGdyYXBoIGFuZCByZXR1cm5zIHRoZSBtaW5pbWFsIHNldCBvZiBub2RlcyB0aGF0IGFyZVxuICAgKiByZXF1aXJlZCBmb3IgZXhlY3V0aW9uLCBpbiB0aGUgY29ycmVjdCBleGVjdXRpb24gb3JkZXIuXG4gICAqL1xuICBwcml2YXRlIGNvbXBpbGUoaW5wdXRzOiBOYW1lZFRlbnNvck1hcCwgb3V0cHV0czogTm9kZVtdKTogTm9kZVtdIHtcbiAgICBjb25zdCBleGVjdXRpb25JbmZvID1cbiAgICAgICAgZ2V0RXhlY3V0aW9uU3ViZ3JhcGgoaW5wdXRzLCBvdXRwdXRzLCB0aGlzLndlaWdodE1hcCwgdGhpcy5faW5pdE5vZGVzKTtcbiAgICBjb25zdCB7bWlzc2luZ0lucHV0cywgZHluYW1pY05vZGUsIHN5bmNJbnB1dHN9ID0gZXhlY3V0aW9uSW5mbztcbiAgICBpZiAoZHluYW1pY05vZGUgIT0gbnVsbCkge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKFxuICAgICAgICAgIGBUaGlzIGV4ZWN1dGlvbiBjb250YWlucyB0aGUgbm9kZSAnJHtkeW5hbWljTm9kZS5uYW1lfScsIHdoaWNoIGhhcyBgICtcbiAgICAgICAgICBgdGhlIGR5bmFtaWMgb3AgJyR7ZHluYW1pY05vZGUub3B9Jy4gUGxlYXNlIHVzZSBgICtcbiAgICAgICAgICBgbW9kZWwuZXhlY3V0ZUFzeW5jKCkgaW5zdGVhZC4gQWx0ZXJuYXRpdmVseSwgdG8gYXZvaWQgdGhlIGAgK1xuICAgICAgICAgIGBkeW5hbWljIG9wcywgc3BlY2lmeSB0aGUgaW5wdXRzIFske3N5bmNJbnB1dHN9XWApO1xuICAgIH1cblxuICAgIGlmIChtaXNzaW5nSW5wdXRzLmxlbmd0aCA+IDApIHtcbiAgICAgIGNvbnN0IG91dE5hbWVzID0gb3V0cHV0cy5tYXAobiA9PiBuLm5hbWUpO1xuICAgICAgY29uc3QgaW5OYW1lcyA9IE9iamVjdC5rZXlzKGlucHV0cyk7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoXG4gICAgICAgICAgYENhbm5vdCBjb21wdXRlIHRoZSBvdXRwdXRzIFske291dE5hbWVzfV0gZnJvbSB0aGUgcHJvdmlkZWQgaW5wdXRzIGAgK1xuICAgICAgICAgIGBbJHtpbk5hbWVzfV0uIE1pc3NpbmcgdGhlIGZvbGxvd2luZyBpbnB1dHM6IFske21pc3NpbmdJbnB1dHN9XWApO1xuICAgIH1cblxuICAgIHJldHVybiBnZXROb2Rlc0luVG9wb2xvZ2ljYWxPcmRlcihcbiAgICAgICAgdGhpcy5ncmFwaCwgdGhpcy53ZWlnaHRNYXAsIGV4ZWN1dGlvbkluZm8pO1xuICB9XG5cbiAgLyoqXG4gICAqIEV4ZWN1dGVzIHRoZSBpbmZlcmVuY2UgZm9yIGdpdmVuIGlucHV0IHRlbnNvcnMuXG4gICAqIEBwYXJhbSBpbnB1dHMgVGVuc29yIG1hcCBmb3IgdGhlIG1vZGVsIGlucHV0cywga2V5ZWQgYnkgdGhlIGlucHV0IG5vZGVcbiAgICogbmFtZXMuXG4gICAqIEBwYXJhbSBvdXRwdXRzIE9wdGlvbmFsLiBvdXRwdXQgbm9kZSBuYW1lIGZyb20gdGhlIFRlbnNvcmZsb3cgbW9kZWwsIGlmXG4gICAqIG5vIG91dHB1dHMgYXJlIHNwZWNpZmllZCwgdGhlIGRlZmF1bHQgb3V0cHV0cyBvZiB0aGUgbW9kZWwgd291bGQgYmUgdXNlZC5cbiAgICogWW91IGNhbiBpbnNwZWN0IGludGVybWVkaWF0ZSBub2RlcyBvZiB0aGUgbW9kZWwgYnkgYWRkaW5nIHRoZW0gdG8gdGhlXG4gICAqIG91dHB1dHMgYXJyYXkuXG4gICAqL1xuICBleGVjdXRlKGlucHV0czogTmFtZWRUZW5zb3JNYXAsIG91dHB1dHM/OiBzdHJpbmdbXSk6IFRlbnNvcltdIHtcbiAgICBpbnB1dHMgPSB0aGlzLm1hcElucHV0cyhpbnB1dHMpO1xuICAgIGNvbnN0IG5hbWVzID0gT2JqZWN0LmtleXMoaW5wdXRzKS5zb3J0KCk7XG4gICAgdGhpcy5jaGVja0lucHV0cyhpbnB1dHMpO1xuICAgIHRoaXMuY2hlY2tJbnB1dFNoYXBlQW5kVHlwZShpbnB1dHMpO1xuICAgIG91dHB1dHMgPSB0aGlzLm1hcE91dHB1dHMob3V0cHV0cyk7XG4gICAgdGhpcy5jaGVja091dHB1dHMob3V0cHV0cyk7XG4gICAgY29uc3QgaW5wdXROb2RlcyA9XG4gICAgICAgIG5hbWVzLm1hcChuYW1lID0+IHRoaXMuZ3JhcGgubm9kZXNbcGFyc2VOb2RlTmFtZShuYW1lKVswXV0pO1xuICAgIGNvbnN0IG91dHB1dE5vZGVOYW1lcyA9IG91dHB1dHMubWFwKG5hbWUgPT4gcGFyc2VOb2RlTmFtZShuYW1lKVswXSk7XG4gICAgbGV0IG91dHB1dE5vZGVzID0gb3V0cHV0Tm9kZU5hbWVzLm1hcChuYW1lID0+IHRoaXMuZ3JhcGgubm9kZXNbbmFtZV0pO1xuICAgIHRoaXMucmVzZXRJbnRlcm1lZGlhdGVUZW5zb3JzKCk7XG4gICAgLy8gSWYgbm8gb3V0cHV0cyBhcmUgc3BlY2lmaWVkLCB0aGVuIHVzZSB0aGUgZGVmYXVsdCBvdXRwdXRzIG9mIHRoZSBtb2RlbC5cbiAgICBpZiAob3V0cHV0Tm9kZXMubGVuZ3RoID09PSAwKSB7XG4gICAgICBvdXRwdXROb2RlcyA9IHRoaXMuX291dHB1dHM7XG4gICAgfVxuXG4gICAgY29uc3QgY29tcGlsYXRpb25LZXkgPSB0aGlzLmdldENvbXBpbGF0aW9uS2V5KGlucHV0Tm9kZXMsIG91dHB1dE5vZGVzKTtcblxuICAgIC8vIERvIG5vdGhpbmcgaWYgdGhlIGNvbXBpbGVkIGdyYXBoIGNhY2hlIGNvbnRhaW5zIHRoZSBpbnB1dC5cbiAgICBsZXQgb3JkZXJlZE5vZGVzID0gdGhpcy5jb21waWxlZE1hcC5nZXQoY29tcGlsYXRpb25LZXkpO1xuICAgIGlmIChvcmRlcmVkTm9kZXMgPT0gbnVsbCkge1xuICAgICAgb3JkZXJlZE5vZGVzID0gdGhpcy5jb21waWxlKGlucHV0cywgb3V0cHV0Tm9kZXMpO1xuICAgICAgdGhpcy5jb21waWxlZE1hcC5zZXQoY29tcGlsYXRpb25LZXksIG9yZGVyZWROb2Rlcyk7XG4gICAgfVxuXG4gICAgY29uc3QgdGVuc29yQXJyYXlNYXA6IFRlbnNvckFycmF5TWFwID0ge307XG4gICAgY29uc3QgdGVuc29yTGlzdE1hcDogVGVuc29yTGlzdE1hcCA9IHt9O1xuXG4gICAgcmV0dXJuIHRpZHkoKCkgPT4ge1xuICAgICAgY29uc3QgY29udGV4dCA9IG5ldyBFeGVjdXRpb25Db250ZXh0KFxuICAgICAgICAgIHRoaXMud2VpZ2h0TWFwLCB0ZW5zb3JBcnJheU1hcCwgdGVuc29yTGlzdE1hcCxcbiAgICAgICAgICB0aGlzLmZ1bmN0aW9uRXhlY3V0b3JNYXApO1xuICAgICAgY29uc3QgdGVuc29yc01hcDogTmFtZWRUZW5zb3JzTWFwID0gey4uLnRoaXMud2VpZ2h0TWFwfTtcblxuICAgICAgT2JqZWN0LmtleXMoaW5wdXRzKS5mb3JFYWNoKG5hbWUgPT4ge1xuICAgICAgICBjb25zdCBbbm9kZU5hbWUsIGluZGV4XSA9IHBhcnNlTm9kZU5hbWUobmFtZSk7XG4gICAgICAgIGNvbnN0IHRlbnNvcnM6IFRlbnNvcltdID0gW107XG4gICAgICAgIHRlbnNvcnNbaW5kZXhdID0gaW5wdXRzW25hbWVdO1xuICAgICAgICB0ZW5zb3JzTWFwW25vZGVOYW1lXSA9IHRlbnNvcnM7XG4gICAgICB9KTtcblxuICAgICAgY29uc3QgdGVuc29yc1RvS2VlcCA9IHRoaXMuZ2V0RnJvemVuVGVuc29ySWRzKHRlbnNvcnNNYXApO1xuICAgICAgY29uc3QgaW50ZXJtZWRpYXRlVGVuc29yQ29uc3VtZXJDb3VudDoge1trZXk6IG51bWJlcl06IG51bWJlcn0gPSB7fTtcbiAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgb3JkZXJlZE5vZGVzLmxlbmd0aDsgaSsrKSB7XG4gICAgICAgIGNvbnN0IG5vZGUgPSBvcmRlcmVkTm9kZXNbaV07XG4gICAgICAgIGlmICghdGVuc29yc01hcFtub2RlLm5hbWVdKSB7XG4gICAgICAgICAgY29uc3QgdGVuc29ycyA9XG4gICAgICAgICAgICAgIGV4ZWN1dGVPcChub2RlLCB0ZW5zb3JzTWFwLCBjb250ZXh0LCB0aGlzLl9yZXNvdXJjZU1hbmFnZXIpIGFzXG4gICAgICAgICAgICAgIFRlbnNvcltdO1xuICAgICAgICAgIGlmICh1dGlsLmlzUHJvbWlzZSh0ZW5zb3JzKSkge1xuICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKFxuICAgICAgICAgICAgICAgIGBUaGUgZXhlY3V0aW9uIG9mIHRoZSBvcCAnJHtub2RlLm9wfScgcmV0dXJuZWQgYSBwcm9taXNlLiBgICtcbiAgICAgICAgICAgICAgICBgUGxlYXNlIHVzZSBtb2RlbC5leGVjdXRlQXN5bmMoKSBpbnN0ZWFkLmApO1xuICAgICAgICAgIH1cbiAgICAgICAgICB0ZW5zb3JzTWFwW25vZGUubmFtZV0gPSB0ZW5zb3JzO1xuICAgICAgICAgIHRoaXMuY2hlY2tUZW5zb3JGb3JEaXNwb3NhbChcbiAgICAgICAgICAgICAgbm9kZS5uYW1lLCBub2RlLCB0ZW5zb3JzTWFwLCBjb250ZXh0LCB0ZW5zb3JzVG9LZWVwLFxuICAgICAgICAgICAgICBvdXRwdXROb2RlTmFtZXMsIGludGVybWVkaWF0ZVRlbnNvckNvbnN1bWVyQ291bnQpO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgICAvLyBkaXNwb3NlIHRoZSBjb250ZXh0IGZvciB0aGUgcm9vdCBleGVjdXRvclxuICAgICAgaWYgKHRoaXMucGFyZW50ID09IG51bGwpIHtcbiAgICAgICAgY29udGV4dC5kaXNwb3NlKHRlbnNvcnNUb0tlZXApO1xuICAgICAgfVxuICAgICAgcmV0dXJuIG91dHB1dHMubWFwKG5hbWUgPT4gZ2V0VGVuc29yKG5hbWUsIHRlbnNvcnNNYXAsIGNvbnRleHQpKTtcbiAgICB9KTtcbiAgfVxuXG4gIHByaXZhdGUgZ2V0RnJvemVuVGVuc29ySWRzKHRlbnNvck1hcDogTmFtZWRUZW5zb3JzTWFwKTogU2V0PG51bWJlcj4ge1xuICAgIGNvbnN0IGlkcyA9IFtdLmNvbmNhdC5hcHBseShcbiAgICAgICAgW10sXG4gICAgICAgIE9iamVjdC5rZXlzKHRlbnNvck1hcClcbiAgICAgICAgICAgIC5tYXAoa2V5ID0+IHRlbnNvck1hcFtrZXldKVxuICAgICAgICAgICAgLm1hcCh0ZW5zb3JzID0+IHRlbnNvcnMubWFwKHRlbnNvciA9PiB0ZW5zb3IuaWQpKSk7XG4gICAgcmV0dXJuIG5ldyBTZXQoaWRzKTtcbiAgfVxuICBwcml2YXRlIGNoZWNrVGVuc29yRm9yRGlzcG9zYWwoXG4gICAgICBub2RlTmFtZTogc3RyaW5nLCBub2RlOiBOb2RlLCB0ZW5zb3JNYXA6IE5hbWVkVGVuc29yc01hcCxcbiAgICAgIGNvbnRleHQ6IEV4ZWN1dGlvbkNvbnRleHQsIHRlbnNvcnNUb0tlZXA6IFNldDxudW1iZXI+LFxuICAgICAgb3V0cHV0TmFtZXM6IHN0cmluZ1tdLFxuICAgICAgaW50ZXJtZWRpYXRlVGVuc29yQ29uc3VtZXJDb3VudDoge1trZXk6IHN0cmluZ106IG51bWJlcn0pIHtcbiAgICAvLyBTa2lwIG91dHB1dCBub2RlcyBhbmQgYW55IGNvbnRyb2wgZmxvdyBub2Rlcywgc2luY2UgaXRzIGRlcGVuZGVuY3kgaXNcbiAgICAvLyB0cmlja3kgdG8gdHJhY2sgY29ycmVjdGx5LlxuICAgIGlmIChub2RlLmNhdGVnb3J5ID09PSAnY29udHJvbCcgfHwgb3V0cHV0TmFtZXMuaW5kZXhPZihub2RlTmFtZSkgIT09IC0xKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgdGVuc29yTWFwW25vZGVOYW1lXS5mb3JFYWNoKHRlbnNvciA9PiB7XG4gICAgICBpZiAodGVuc29yICE9IG51bGwpIHtcbiAgICAgICAgaW50ZXJtZWRpYXRlVGVuc29yQ29uc3VtZXJDb3VudFt0ZW5zb3IuaWRdID1cbiAgICAgICAgICAgIChpbnRlcm1lZGlhdGVUZW5zb3JDb25zdW1lckNvdW50W3RlbnNvci5pZF0gfHwgMCkgK1xuICAgICAgICAgICAgbm9kZS5jaGlsZHJlbi5sZW5ndGg7XG4gICAgICB9XG4gICAgfSk7XG4gICAgbm9kZS5pbnB1dHMuZm9yRWFjaChpbnB1dCA9PiB7XG4gICAgICAvLyBTa2lwIGFueSBjb250cm9sIGZsb3cgbm9kZXMsIHNpbmNlIGl0cyBkZXBlbmRlbmN5IGlzIHRyaWNreSB0byB0cmFja1xuICAgICAgLy8gY29ycmVjdGx5LlxuICAgICAgaWYgKGlucHV0LmNhdGVnb3J5ICE9PSAnY29udHJvbCcpIHtcbiAgICAgICAgY29uc3QgdGVuc29ycyA9XG4gICAgICAgICAgICBnZXRUZW5zb3JzRm9yQ3VycmVudENvbnRlbnh0KGlucHV0Lm5hbWUsIHRlbnNvck1hcCwgY29udGV4dCk7XG4gICAgICAgIGlmICh0ZW5zb3JzICE9IG51bGwpIHtcbiAgICAgICAgICB0ZW5zb3JzLmZvckVhY2godGVuc29yID0+IHtcbiAgICAgICAgICAgIGlmICh0ZW5zb3IgJiYgIXRlbnNvci5rZXB0ICYmICF0ZW5zb3JzVG9LZWVwLmhhcyh0ZW5zb3IuaWQpKSB7XG4gICAgICAgICAgICAgIGNvbnN0IGNvdW50ID0gaW50ZXJtZWRpYXRlVGVuc29yQ29uc3VtZXJDb3VudFt0ZW5zb3IuaWRdO1xuICAgICAgICAgICAgICBpZiAoY291bnQgPT09IDEpIHtcbiAgICAgICAgICAgICAgICBpZiAoIXRoaXMua2VlcFRlbnNvckZvckRlYnVnKSB7XG4gICAgICAgICAgICAgICAgICB0ZW5zb3IuZGlzcG9zZSgpO1xuICAgICAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgICBjb25zdCBbbm9kZU5hbWUsIGluZGV4XSA9XG4gICAgICAgICAgICAgICAgICAgICAgZ2V0Tm9kZU5hbWVBbmRJbmRleChub2RlLm5hbWUsIGNvbnRleHQpO1xuICAgICAgICAgICAgICAgICAgaWYgKHRoaXMuaW50ZXJtZWRpYXRlVGVuc29yc1tub2RlTmFtZV0pIHtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5pbnRlcm1lZGlhdGVUZW5zb3JzW25vZGVOYW1lXVtpbmRleF0gPSB0ZW5zb3I7XG4gICAgICAgICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICB0aGlzLmludGVybWVkaWF0ZVRlbnNvcnNbbm9kZU5hbWVdID0gW107XG4gICAgICAgICAgICAgICAgICAgIHRoaXMuaW50ZXJtZWRpYXRlVGVuc29yc1tub2RlTmFtZV1baW5kZXhdID0gdGVuc29yO1xuICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBkZWxldGUgaW50ZXJtZWRpYXRlVGVuc29yQ29uc3VtZXJDb3VudFt0ZW5zb3IuaWRdO1xuICAgICAgICAgICAgICB9IGVsc2UgaWYgKGNvdW50ICE9IG51bGwpIHtcbiAgICAgICAgICAgICAgICAvLyBvbmx5IGludGVybWVkaWF0ZSBub2RlcyBoYXMgY291bnQgc2V0LCBpbnB1dHMgYW5kIHdlaWdodHMgYXJlXG4gICAgICAgICAgICAgICAgLy8gbm90LlxuICAgICAgICAgICAgICAgIGludGVybWVkaWF0ZVRlbnNvckNvbnN1bWVyQ291bnRbdGVuc29yLmlkXS0tO1xuICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgICAgfSk7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9KTtcbiAgfVxuXG4gIC8qKlxuICAgKiBFeGVjdXRlcyB0aGUgaW5mZXJlbmNlIGZvciBnaXZlbiBpbnB1dCB0ZW5zb3JzIGluIEFzeW5jIGZhc2hpb24uXG4gICAqIEBwYXJhbSBpbnB1dHMgVGVuc29yIG1hcCBmb3IgdGhlIG1vZGVsIGlucHV0cywga2V5ZWQgYnkgdGhlIGlucHV0IG5vZGVcbiAgICogbmFtZXMuXG4gICAqIEBwYXJhbSBvdXRwdXRzIG91dHB1dCBub2RlIG5hbWUgZnJvbSB0aGUgVGVuc29yZmxvdyBtb2RlbCwgaWYgbm8gb3V0cHV0c1xuICAgKiBhcmUgc3BlY2lmaWVkLCB0aGUgZGVmYXVsdCBvdXRwdXRzIG9mIHRoZSBtb2RlbCB3b3VsZCBiZSB1c2VkLiBZb3UgY2FuXG4gICAqIGluc3BlY3QgaW50ZXJtZWRpYXRlIG5vZGVzIG9mIHRoZSBtb2RlbCBieSBhZGRpbmcgdGhlbSB0byB0aGUgb3V0cHV0c1xuICAgKiBhcnJheS5cbiAgICovXG4gIGFzeW5jIGV4ZWN1dGVBc3luYyhpbnB1dHM6IE5hbWVkVGVuc29yTWFwLCBvdXRwdXRzPzogc3RyaW5nW10pOlxuICAgICAgUHJvbWlzZTxUZW5zb3JbXT4ge1xuICAgIHJldHVybiB0aGlzLl9leGVjdXRlQXN5bmMoaW5wdXRzLCBvdXRwdXRzKTtcbiAgfVxuXG4gIGRpc3Bvc2VJbnRlcm1lZGlhdGVUZW5zb3JzKCkge1xuICAgIGlmICghdGhpcy5pbnRlcm1lZGlhdGVUZW5zb3JzKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIE9iamVjdC5rZXlzKHRoaXMuaW50ZXJtZWRpYXRlVGVuc29ycylcbiAgICAgICAgLmZvckVhY2goXG4gICAgICAgICAgICBrZXkgPT4gdGhpcy5pbnRlcm1lZGlhdGVUZW5zb3JzW2tleV0uZm9yRWFjaChcbiAgICAgICAgICAgICAgICB0ZW5zb3IgPT4gdGVuc29yLmRpc3Bvc2UoKSkpO1xuICAgIHRoaXMuZGlzcG9zZVRlbnNvcnNNYXAoKTtcbiAgfVxuXG4gIHByaXZhdGUgZGlzcG9zZVRlbnNvcnNNYXAoKSB7XG4gICAgaWYgKCF0aGlzLnRlbnNvcnNNYXApIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgT2JqZWN0LmtleXModGhpcy50ZW5zb3JzTWFwKS5mb3JFYWNoKGtleSA9PiB7XG4gICAgICBjb25zdCB0ZW5zb3JBcnJheSA9IHRoaXMudGVuc29yc01hcFtrZXldO1xuICAgICAgdGVuc29yQXJyYXkuZm9yRWFjaCh0ZW5zb3IgPT4ge1xuICAgICAgICBpZiAodGVuc29yICYmICF0ZW5zb3Iua2VwdCAmJiAhdGVuc29yLmlzRGlzcG9zZWQgJiZcbiAgICAgICAgICAgICF0aGlzLmtlZXBJZHMuaGFzKHRlbnNvci5pZCkpIHtcbiAgICAgICAgICB0ZW5zb3IuZGlzcG9zZSgpO1xuICAgICAgICB9XG4gICAgICB9KTtcbiAgICB9KTtcbiAgfVxuXG4gIGdldEludGVybWVkaWF0ZVRlbnNvcnMoKTogTmFtZWRUZW5zb3JzTWFwIHtcbiAgICByZXR1cm4gdGhpcy50ZW5zb3JzTWFwO1xuICB9XG5cbiAgcHJpdmF0ZSByZXNldEludGVybWVkaWF0ZVRlbnNvcnMoKSB7XG4gICAgZm9yIChjb25zdCBrZXkgaW4gdGhpcy5pbnRlcm1lZGlhdGVUZW5zb3JzKSB7XG4gICAgICB0aGlzLmludGVybWVkaWF0ZVRlbnNvcnNba2V5XS5mb3JFYWNoKHRlbnNvciA9PiB0ZW5zb3IuZGlzcG9zZSgpKTtcbiAgICAgIGRlbGV0ZSB0aGlzLmludGVybWVkaWF0ZVRlbnNvcnNba2V5XTtcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogRXhlY3V0ZXMgdGhlIGluZmVyZW5jZSBmb3IgZ2l2ZW4gaW5wdXQgdGVuc29ycyBpbiBBc3luYyBmYXNoaW9uLlxuICAgKiBAcGFyYW0gaW5wdXRzIFRlbnNvciBtYXAgZm9yIHRoZSBtb2RlbCBpbnB1dHMsIGtleWVkIGJ5IHRoZSBpbnB1dCBub2RlXG4gICAqIG5hbWVzLlxuICAgKiBAcGFyYW0gb3V0cHV0cyBPcHRpb25hbC4gb3V0cHV0IG5vZGUgbmFtZSBmcm9tIHRoZSBUZW5zb3JmbG93IG1vZGVsLFxuICAgKiBpZiBubyBvdXRwdXRzIGFyZSBzcGVjaWZpZWQsIHRoZSBkZWZhdWx0IG91dHB1dHMgb2YgdGhlIG1vZGVsIHdvdWxkIGJlXG4gICAqIHVzZWQuIFlvdSBjYW4gaW5zcGVjdCBpbnRlcm1lZGlhdGUgbm9kZXMgb2YgdGhlIG1vZGVsIGJ5IGFkZGluZyB0aGVtIHRvIHRoZVxuICAgKiBvdXRwdXRzIGFycmF5LlxuICAgKiBAcGFyYW0gaXNGdW5jdGlvbkV4ZWN1dGlvbiBPcHRpb25hbC4gRmxhZyBmb3IgZXhlY3V0aW5nIGEgZnVuY3Rpb24uXG4gICAqIEBwYXJhbSB0ZW5zb3JBcnJheU1hcCBPcHRpb25hbCwgZ2xvYmFsIFRlbnNvckFycmF5IG1hcCBieSBpZC4gVXNlZCBmb3JcbiAgICogZnVuY3Rpb24gZXhlY3V0aW9uLlxuICAgKiBAcGFyYW0gdGVuc29yQXJyYXlNYXAgT3B0aW5hbCBnbG9iYWwgVGVuc29yTGlzdCBtYXAgYnkgaWQuIFVzZWQgZm9yXG4gICAqIGZ1bmN0aW9uIGV4ZWN1dGlvbi5cbiAgICovXG4gIHByaXZhdGUgYXN5bmMgX2V4ZWN1dGVBc3luYyhcbiAgICAgIGlucHV0czogTmFtZWRUZW5zb3JNYXAsIG91dHB1dHM/OiBzdHJpbmdbXSwgaXNGdW5jdGlvbkV4ZWN1dGlvbiA9IGZhbHNlLFxuICAgICAgdGVuc29yQXJyYXlNYXA6IFRlbnNvckFycmF5TWFwID0ge30sXG4gICAgICB0ZW5zb3JMaXN0TWFwOiBUZW5zb3JMaXN0TWFwID0ge30pOiBQcm9taXNlPFRlbnNvcltdPiB7XG4gICAgaWYgKCFpc0Z1bmN0aW9uRXhlY3V0aW9uKSB7XG4gICAgICBpbnB1dHMgPSB0aGlzLm1hcElucHV0cyhpbnB1dHMpO1xuICAgICAgdGhpcy5jaGVja0lucHV0cyhpbnB1dHMpO1xuICAgICAgdGhpcy5jaGVja0lucHV0U2hhcGVBbmRUeXBlKGlucHV0cyk7XG4gICAgICBvdXRwdXRzID0gdGhpcy5tYXBPdXRwdXRzKG91dHB1dHMpO1xuICAgICAgdGhpcy5jaGVja091dHB1dHMob3V0cHV0cyk7XG4gICAgfVxuXG4gICAgLy8gRm9yIG1vZGVsIGRlYnVnLlxuICAgIHRyeSB7XG4gICAgICB0aGlzLmtlZXBUZW5zb3JGb3JEZWJ1ZyA9IGVudigpLmdldEJvb2woJ0tFRVBfSU5URVJNRURJQVRFX1RFTlNPUlMnKTtcbiAgICB9IGNhdGNoIChlKSB7XG4gICAgICBjb25zb2xlLndhcm4oZS5tZXNzYWdlKTtcbiAgICB9XG4gICAgdGhpcy5yZXNldEludGVybWVkaWF0ZVRlbnNvcnMoKTtcblxuICAgIGNvbnN0IGNvbnRleHQgPSBuZXcgRXhlY3V0aW9uQ29udGV4dChcbiAgICAgICAgdGhpcy53ZWlnaHRNYXAsIHRlbnNvckFycmF5TWFwLCB0ZW5zb3JMaXN0TWFwLFxuICAgICAgICB0aGlzLmZ1bmN0aW9uRXhlY3V0b3JNYXApO1xuXG4gICAgLy8gR3JhcGggd2l0aCBjb250cm9sIGZsb3cgb3AgcmVxdWlyZXMgcnVudGltZSBldmFsdWF0aW9uIG9mIHRoZSBleGVjdXRpb25cbiAgICAvLyBvcmRlciwgd2hpbGUgd2l0aG91dCBjb250cm9sIGZsb3cgdGhlIGV4ZWN1dGlvbiBvcmRlciBpcyBwcmUtZGV0ZXJtaW5lZFxuICAgIC8vIGluIHRoZSBjb21waWxlIG1ldGhvZC5cbiAgICB0aGlzLnRlbnNvcnNNYXAgPSBhd2FpdCB0aGlzLmV4ZWN1dGVXaXRoQ29udHJvbEZsb3coXG4gICAgICAgIGlucHV0cywgY29udGV4dCwgb3V0cHV0cywgaXNGdW5jdGlvbkV4ZWN1dGlvbik7XG4gICAgY29uc3QgcmVzdWx0cyA9XG4gICAgICAgIG91dHB1dHMubWFwKG5hbWUgPT4gZ2V0VGVuc29yKG5hbWUsIHRoaXMudGVuc29yc01hcCwgY29udGV4dCkpO1xuXG4gICAgLy8gZGlzcG9zZSBhbGwgdGhlIGludGVybWVkaWF0ZSB0ZW5zb3JzXG4gICAgY29uc3Qgb3V0cHV0SWRzID0gcmVzdWx0cy5tYXAodCA9PiB0LmlkKTtcbiAgICBjb25zdCBpbnB1dElkcyA9IE9iamVjdC5rZXlzKGlucHV0cykubWFwKG5hbWUgPT4gaW5wdXRzW25hbWVdLmlkKTtcbiAgICB0aGlzLmtlZXBJZHMgPVxuICAgICAgICBuZXcgU2V0PG51bWJlcj4oWy4uLm91dHB1dElkcywgLi4uaW5wdXRJZHMsIC4uLnRoaXMud2VpZ2h0SWRzXSk7XG4gICAgaWYgKCF0aGlzLmtlZXBUZW5zb3JGb3JEZWJ1Zykge1xuICAgICAgdGhpcy5kaXNwb3NlVGVuc29yc01hcCgpO1xuICAgIH1cblxuICAgIC8vIGRpc3Bvc2UgdGhlIGNvbnRleHQgZm9yIHRoZSByb290IGV4ZWN1dG9yXG4gICAgaWYgKHRoaXMucGFyZW50ID09IG51bGwpIHtcbiAgICAgIGNvbnRleHQuZGlzcG9zZSh0aGlzLmtlZXBJZHMpO1xuICAgIH1cblxuICAgIHJldHVybiByZXN1bHRzO1xuICB9XG5cbiAgYXN5bmMgZXhlY3V0ZUZ1bmN0aW9uQXN5bmMoXG4gICAgICBpbnB1dHM6IFRlbnNvcltdLCB0ZW5zb3JBcnJheU1hcDogVGVuc29yQXJyYXlNYXAsXG4gICAgICB0ZW5zb3JMaXN0TWFwOiBUZW5zb3JMaXN0TWFwKTogUHJvbWlzZTxUZW5zb3JbXT4ge1xuICAgIGNvbnN0IG1hcHBlZElucHV0cyA9IGlucHV0cy5yZWR1Y2UoKG1hcCwgdGVuc29yLCBpbmRleCkgPT4ge1xuICAgICAgbWFwW3RoaXMuaW5wdXRzW2luZGV4XS5uYW1lXSA9IHRlbnNvcjtcbiAgICAgIHJldHVybiBtYXA7XG4gICAgfSwge30gYXMgTmFtZWRUZW5zb3JNYXApO1xuXG4gICAgcmV0dXJuIHRoaXMuX2V4ZWN1dGVBc3luYyhcbiAgICAgICAgbWFwcGVkSW5wdXRzLCB0aGlzLm91dHB1dE5vZGVzLCB0cnVlLCB0ZW5zb3JBcnJheU1hcCwgdGVuc29yTGlzdE1hcCk7XG4gIH1cblxuICAvKipcbiAgICogV2hlbiB0aGVyZSBhcmUgY29udHJvbCBmbG93IG5vZGVzIGluIHRoZSBncmFwaCwgdGhlIGdyYXBoIGV4ZWN1dGlvbiB1c2VcbiAgICogRXhlY3V0aW9uQ29udGV4dCB0byBrZWVwIHRyYWNrIG9mIHRoZSBmcmFtZXMgYW5kIGxvb3AgaXRlcmF0b3JzLlxuICAgKiBAcGFyYW0gaW5wdXRzIHBsYWNlaG9sZGVyIHRlbnNvcnMgZm9yIHRoZSBncmFwaC5cbiAgICogQHBhcmFtIGNvbnRleHQgdGhlIGV4ZWN1dGlvbiBjb250ZXh0IG9iamVjdCBmb3IgY3VycmVudCBleGVjdXRpb24uXG4gICAqIEBwYXJhbSBvdXRwdXROYW1lcyBPcHRpb25hbC4gb3V0cHV0IG5vZGUgbmFtZSBmcm9tIHRoZSBUZW5zb3JmbG93IG1vZGVsLFxuICAgKiBpZiBubyBvdXRwdXRzIGFyZSBzcGVjaWZpZWQsIHRoZSBkZWZhdWx0IG91dHB1dHMgb2YgdGhlIG1vZGVsIHdvdWxkIGJlXG4gICAqIHVzZWQuIFlvdSBjYW4gaW5zcGVjdCBpbnRlcm1lZGlhdGUgbm9kZXMgb2YgdGhlIG1vZGVsIGJ5IGFkZGluZyB0aGVtIHRvIHRoZVxuICAgKiBvdXRwdXRzIGFycmF5LlxuICAgKiBAcGFyYW0gaXNGdW5jdGlvbkV4ZWN1dGlvbiBGbGFnIGZvciBleGVjdXRpbmcgYSBmdW5jdGlvbi5cbiAgICovXG4gIHByaXZhdGUgYXN5bmMgZXhlY3V0ZVdpdGhDb250cm9sRmxvdyhcbiAgICAgIGlucHV0czogTmFtZWRUZW5zb3JNYXAsIGNvbnRleHQ6IEV4ZWN1dGlvbkNvbnRleHQsIG91dHB1dE5hbWVzPzogc3RyaW5nW10sXG4gICAgICBpc0Z1bmN0aW9uRXhlY3V0aW9uPzogYm9vbGVhbik6IFByb21pc2U8TmFtZWRUZW5zb3JzTWFwPiB7XG4gICAgY29uc3QgbmFtZXMgPSBPYmplY3Qua2V5cyhpbnB1dHMpO1xuICAgIGNvbnN0IGlucHV0Tm9kZXMgPVxuICAgICAgICBuYW1lcy5tYXAobmFtZSA9PiB0aGlzLmdyYXBoLm5vZGVzW3BhcnNlTm9kZU5hbWUobmFtZSlbMF1dKTtcbiAgICBjb25zdCBvdXRwdXROb2RlTmFtZXMgPSBvdXRwdXROYW1lcy5tYXAobmFtZSA9PiBwYXJzZU5vZGVOYW1lKG5hbWUpWzBdKTtcbiAgICBsZXQgb3V0cHV0Tm9kZXMgPSBvdXRwdXROb2RlTmFtZXMubWFwKG5hbWUgPT4gdGhpcy5ncmFwaC5ub2Rlc1tuYW1lXSk7XG5cbiAgICAvLyBJZiBubyBvdXRwdXRzIGFyZSBzcGVjaWZpZWQsIHRoZW4gdXNlIHRoZSBkZWZhdWx0IG91dHB1dHMgb2YgdGhlIG1vZGVsLlxuICAgIGlmIChvdXRwdXROb2Rlcy5sZW5ndGggPT09IDApIHtcbiAgICAgIG91dHB1dE5vZGVzID0gdGhpcy5fb3V0cHV0cztcbiAgICB9XG5cbiAgICBjb25zdCB7dXNlZE5vZGVzLCBtaXNzaW5nSW5wdXRzLCBkeW5hbWljTm9kZSwgc3luY0lucHV0c30gPVxuICAgICAgICBnZXRFeGVjdXRpb25TdWJncmFwaChcbiAgICAgICAgICAgIGlucHV0cywgb3V0cHV0Tm9kZXMsIHRoaXMud2VpZ2h0TWFwLCB0aGlzLl9pbml0Tm9kZXMpO1xuXG4gICAgLy8gRmlyc3Qgbm9kZXMgdG8gZXhlY3V0ZSBpbmNsdWRlIGlucHV0Tm9kZXMsIHdlaWdodHMsIGFuZCBpbml0Tm9kZXMuXG4gICAgY29uc3Qgc3RhY2s6IE5vZGVXaXRoQ29udGV4dHNbXSA9IFtcbiAgICAgIC4uLmlucHV0Tm9kZXMsIC4uLnRoaXMuZ3JhcGgud2VpZ2h0cywgLi4uKHRoaXMuX2luaXROb2RlcyB8fCBbXSlcbiAgICBdLm1hcChub2RlID0+IHtcbiAgICAgIHJldHVybiB7bm9kZSwgY29udGV4dHM6IGNvbnRleHQuY3VycmVudENvbnRleHR9O1xuICAgIH0pO1xuICAgIGNvbnN0IHRlbnNvcnNNYXA6IE5hbWVkVGVuc29yc01hcCA9IHsuLi50aGlzLndlaWdodE1hcH07XG4gICAgT2JqZWN0LmtleXMoaW5wdXRzKS5mb3JFYWNoKG5hbWUgPT4ge1xuICAgICAgY29uc3QgW25vZGVOYW1lLCBpbmRleF0gPSBwYXJzZU5vZGVOYW1lKG5hbWUpO1xuICAgICAgY29uc3QgdGVuc29yczogVGVuc29yW10gPSBbXTtcbiAgICAgIHRlbnNvcnNbaW5kZXhdID0gaW5wdXRzW25hbWVdO1xuICAgICAgdGVuc29yc01hcFtub2RlTmFtZV0gPSB0ZW5zb3JzO1xuICAgIH0pO1xuICAgIGNvbnN0IGludGVybWVkaWF0ZVRlbnNvckNvbnN1bWVyQ291bnQ6IHtba2V5OiBudW1iZXJdOiBudW1iZXJ9ID0ge307XG4gICAgY29uc3QgdGVuc29yc1RvS2VlcCA9IHRoaXMuZ2V0RnJvemVuVGVuc29ySWRzKHRlbnNvcnNNYXApO1xuICAgIGNvbnN0IGFkZGVkOiB7W2tleTogc3RyaW5nXTogYm9vbGVhbn0gPSB7fTtcbiAgICB3aGlsZSAoc3RhY2subGVuZ3RoID4gMCkge1xuICAgICAgY29uc3QgcHJvbWlzZXMgPSB0aGlzLnByb2Nlc3NTdGFjayhcbiAgICAgICAgICBpbnB1dE5vZGVzLCBzdGFjaywgY29udGV4dCwgdGVuc29yc01hcCwgYWRkZWQsIHRlbnNvcnNUb0tlZXAsXG4gICAgICAgICAgb3V0cHV0Tm9kZU5hbWVzLCBpbnRlcm1lZGlhdGVUZW5zb3JDb25zdW1lckNvdW50LCB1c2VkTm9kZXMpO1xuICAgICAgYXdhaXQgUHJvbWlzZS5hbGwocHJvbWlzZXMpO1xuICAgIH1cbiAgICBpZiAoZHluYW1pY05vZGUgPT0gbnVsbCAmJiAhaXNGdW5jdGlvbkV4ZWN1dGlvbikge1xuICAgICAgY29uc29sZS53YXJuKFxuICAgICAgICAgIGBUaGlzIG1vZGVsIGV4ZWN1dGlvbiBkaWQgbm90IGNvbnRhaW4gYW55IG5vZGVzIHdpdGggY29udHJvbCBmbG93IGAgK1xuICAgICAgICAgIGBvciBkeW5hbWljIG91dHB1dCBzaGFwZXMuIFlvdSBjYW4gdXNlIG1vZGVsLmV4ZWN1dGUoKSBpbnN0ZWFkLmApO1xuICAgIH1cbiAgICBjb25zdCBtaXNzaW5nT3V0cHV0cyA9XG4gICAgICAgIG91dHB1dE5vZGVzXG4gICAgICAgICAgICAuZmlsdGVyKFxuICAgICAgICAgICAgICAgIG5vZGUgPT4gIWlzQ29udHJvbEZsb3cobm9kZSkgJiZcbiAgICAgICAgICAgICAgICAgICAgIWdldFRlbnNvcihub2RlLm5hbWUsIHRlbnNvcnNNYXAsIGNvbnRleHQpKVxuICAgICAgICAgICAgLm1hcChub2RlID0+IG5vZGUubmFtZSk7XG4gICAgaWYgKG1pc3NpbmdPdXRwdXRzLmxlbmd0aCA+IDApIHtcbiAgICAgIGxldCBhbHRlcm5hdGl2ZU1zZyA9ICcnO1xuICAgICAgaWYgKGR5bmFtaWNOb2RlICE9IG51bGwpIHtcbiAgICAgICAgYWx0ZXJuYXRpdmVNc2cgPVxuICAgICAgICAgICAgYEFsdGVybmF0aXZlbHksIHRvIGF2b2lkIHRoZSBkeW5hbWljIG9wcywgdXNlIG1vZGVsLmV4ZWN1dGUoKSBgICtcbiAgICAgICAgICAgIGBhbmQgc3BlY2lmeSB0aGUgaW5wdXRzIFske3N5bmNJbnB1dHN9XWA7XG4gICAgICB9XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoXG4gICAgICAgICAgYENhbm5vdCBjb21wdXRlIHRoZSBvdXRwdXRzIFske21pc3NpbmdPdXRwdXRzfV0gZnJvbSB0aGUgcHJvdmlkZWQgYCArXG4gICAgICAgICAgYGlucHV0cyBbJHtuYW1lc31dLiBDb25zaWRlciBwcm92aWRpbmcgdGhlIGZvbGxvd2luZyBpbnB1dHM6IGAgK1xuICAgICAgICAgIGBbJHttaXNzaW5nSW5wdXRzfV0uICR7YWx0ZXJuYXRpdmVNc2d9YCk7XG4gICAgfVxuICAgIHJldHVybiB0ZW5zb3JzTWFwO1xuICB9XG5cbiAgcHJpdmF0ZSBwcm9jZXNzU3RhY2soXG4gICAgICBpbnB1dE5vZGVzOiBOb2RlW10sIHN0YWNrOiBOb2RlV2l0aENvbnRleHRzW10sIGNvbnRleHQ6IEV4ZWN1dGlvbkNvbnRleHQsXG4gICAgICB0ZW5zb3JNYXA6IE5hbWVkVGVuc29yc01hcCwgYWRkZWQ6IHtba2V5OiBzdHJpbmddOiBib29sZWFufSxcbiAgICAgIHRlbnNvcnNUb0tlZXA6IFNldDxudW1iZXI+LCBvdXRwdXROYW1lczogc3RyaW5nW10sXG4gICAgICBpbnRlcm1lZGlhdGVUZW5zb3JDb25zdW1lckNvdW50OiB7W2tleTogbnVtYmVyXTogbnVtYmVyfSxcbiAgICAgIHVzZWROb2RlczogU2V0PHN0cmluZz4pIHtcbiAgICBjb25zdCBwcm9taXNlczogQXJyYXk8UHJvbWlzZTxUZW5zb3JbXT4+ID0gW107XG4gICAgd2hpbGUgKHN0YWNrLmxlbmd0aCA+IDApIHtcbiAgICAgIGNvbnN0IGl0ZW0gPSBzdGFjay5wb3AoKTtcbiAgICAgIGNvbnRleHQuY3VycmVudENvbnRleHQgPSBpdGVtLmNvbnRleHRzO1xuICAgICAgbGV0IG5vZGVOYW1lID0gJyc7XG4gICAgICAvLyBUaGUgdGVuc29yIG9mIHRoZSBFbnRlciBvcCB3aXRoIGlzQ29uc3RhbnQgc2V0IHNob3VsZCBiZSBzZXRcbiAgICAgIC8vIGluIHRoZSBwYXJlbnQgc2NvcGUsIHNvIGl0IHdpbGwgYmUgYXZhaWxhYmxlIGFzIGNvbnN0YW50IGZvciB0aGVcbiAgICAgIC8vIHdob2xlIGxvb3AuXG4gICAgICBpZiAoaXRlbS5ub2RlLm9wID09PSAnRW50ZXInICYmXG4gICAgICAgICAgZ2V0UGFyYW1WYWx1ZSgnaXNDb25zdGFudCcsIGl0ZW0ubm9kZSwgdGVuc29yTWFwLCBjb250ZXh0KSkge1xuICAgICAgICBbbm9kZU5hbWVdID0gZ2V0Tm9kZU5hbWVBbmRJbmRleChpdGVtLm5vZGUubmFtZSwgY29udGV4dCk7XG4gICAgICB9XG5cbiAgICAgIC8vIG9ubHkgcHJvY2VzcyBub2RlcyB0aGF0IGFyZSBub3QgaW4gdGhlIHRlbnNvck1hcCB5ZXQsIHRoaXMgaW5jbHVkZVxuICAgICAgLy8gaW5wdXROb2RlcyBhbmQgaW50ZXJuYWwgaW5pdE5vZGVzLlxuICAgICAgaWYgKHRlbnNvck1hcFtpdGVtLm5vZGUubmFtZV0gPT0gbnVsbCkge1xuICAgICAgICBjb25zdCB0ZW5zb3JzID1cbiAgICAgICAgICAgIGV4ZWN1dGVPcChpdGVtLm5vZGUsIHRlbnNvck1hcCwgY29udGV4dCwgdGhpcy5fcmVzb3VyY2VNYW5hZ2VyKTtcbiAgICAgICAgaWYgKCFub2RlTmFtZSkge1xuICAgICAgICAgIFtub2RlTmFtZV0gPSBnZXROb2RlTmFtZUFuZEluZGV4KGl0ZW0ubm9kZS5uYW1lLCBjb250ZXh0KTtcbiAgICAgICAgfVxuICAgICAgICBjb25zdCBjdXJyZW50Q29udGV4dCA9IGNvbnRleHQuY3VycmVudENvbnRleHQ7XG4gICAgICAgIGlmICh1dGlsLmlzUHJvbWlzZSh0ZW5zb3JzKSkge1xuICAgICAgICAgIHByb21pc2VzLnB1c2godGVuc29ycy50aGVuKHQgPT4ge1xuICAgICAgICAgICAgdGVuc29yTWFwW25vZGVOYW1lXSA9IHQ7XG4gICAgICAgICAgICBjb250ZXh0LmN1cnJlbnRDb250ZXh0ID0gY3VycmVudENvbnRleHQ7XG4gICAgICAgICAgICB0aGlzLmNoZWNrVGVuc29yRm9yRGlzcG9zYWwoXG4gICAgICAgICAgICAgICAgbm9kZU5hbWUsIGl0ZW0ubm9kZSwgdGVuc29yTWFwLCBjb250ZXh0LCB0ZW5zb3JzVG9LZWVwLFxuICAgICAgICAgICAgICAgIG91dHB1dE5hbWVzLCBpbnRlcm1lZGlhdGVUZW5zb3JDb25zdW1lckNvdW50KTtcbiAgICAgICAgICAgIHRoaXMucHJvY2Vzc0NoaWxkTm9kZXMoXG4gICAgICAgICAgICAgICAgaXRlbS5ub2RlLCBzdGFjaywgY29udGV4dCwgdGVuc29yTWFwLCBhZGRlZCwgdXNlZE5vZGVzKTtcbiAgICAgICAgICAgIHJldHVybiB0O1xuICAgICAgICAgIH0pKTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICB0ZW5zb3JNYXBbbm9kZU5hbWVdID0gdGVuc29ycztcbiAgICAgICAgICB0aGlzLmNoZWNrVGVuc29yRm9yRGlzcG9zYWwoXG4gICAgICAgICAgICAgIG5vZGVOYW1lLCBpdGVtLm5vZGUsIHRlbnNvck1hcCwgY29udGV4dCwgdGVuc29yc1RvS2VlcCxcbiAgICAgICAgICAgICAgb3V0cHV0TmFtZXMsIGludGVybWVkaWF0ZVRlbnNvckNvbnN1bWVyQ291bnQpO1xuICAgICAgICAgIHRoaXMucHJvY2Vzc0NoaWxkTm9kZXMoXG4gICAgICAgICAgICAgIGl0ZW0ubm9kZSwgc3RhY2ssIGNvbnRleHQsIHRlbnNvck1hcCwgYWRkZWQsIHVzZWROb2Rlcyk7XG4gICAgICAgIH1cbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHRoaXMucHJvY2Vzc0NoaWxkTm9kZXMoXG4gICAgICAgICAgICBpdGVtLm5vZGUsIHN0YWNrLCBjb250ZXh0LCB0ZW5zb3JNYXAsIGFkZGVkLCB1c2VkTm9kZXMpO1xuICAgICAgfVxuICAgIH1cbiAgICByZXR1cm4gcHJvbWlzZXM7XG4gIH1cblxuICBwcml2YXRlIHByb2Nlc3NDaGlsZE5vZGVzKFxuICAgICAgbm9kZTogTm9kZSwgc3RhY2s6IE5vZGVXaXRoQ29udGV4dHNbXSwgY29udGV4dDogRXhlY3V0aW9uQ29udGV4dCxcbiAgICAgIHRlbnNvck1hcDogTmFtZWRUZW5zb3JzTWFwLCBhZGRlZDoge1trZXk6IHN0cmluZ106IGJvb2xlYW59LFxuICAgICAgdXNlZE5vZGVzOiBTZXQ8c3RyaW5nPikge1xuICAgIG5vZGUuY2hpbGRyZW4uZm9yRWFjaCgoY2hpbGROb2RlKSA9PiB7XG4gICAgICBjb25zdCBbbm9kZU5hbWUsIF0gPSBnZXROb2RlTmFtZUFuZEluZGV4KGNoaWxkTm9kZS5uYW1lLCBjb250ZXh0KTtcbiAgICAgIGlmIChhZGRlZFtub2RlTmFtZV0gfHwgIXVzZWROb2Rlcy5oYXMoY2hpbGROb2RlLm5hbWUpKSB7XG4gICAgICAgIHJldHVybjtcbiAgICAgIH1cbiAgICAgIC8vIE1lcmdlIG9wIGNhbiBiZSBwdXNoZWQgaWYgYW55IG9mIGl0cyBpbnB1dHMgaGFzIHZhbHVlLlxuICAgICAgaWYgKGNoaWxkTm9kZS5vcCA9PT0gJ01lcmdlJykge1xuICAgICAgICBpZiAoY2hpbGROb2RlLmlucHV0TmFtZXMuc29tZShuYW1lID0+IHtcbiAgICAgICAgICAgICAgcmV0dXJuICEhZ2V0VGVuc29yKG5hbWUsIHRlbnNvck1hcCwgY29udGV4dCk7XG4gICAgICAgICAgICB9KSkge1xuICAgICAgICAgIGFkZGVkW25vZGVOYW1lXSA9IHRydWU7XG4gICAgICAgICAgc3RhY2sucHVzaCh7Y29udGV4dHM6IGNvbnRleHQuY3VycmVudENvbnRleHQsIG5vZGU6IGNoaWxkTm9kZX0pO1xuICAgICAgICB9XG4gICAgICB9IGVsc2UgIC8vIE90aGVyd2lzZSBhbGwgaW5wdXRzIG11c3QgdG8gaGF2ZSB2YWx1ZS5cbiAgICAgICAgICBpZiAoY2hpbGROb2RlLmlucHV0TmFtZXMuZXZlcnkobmFtZSA9PiB7XG4gICAgICAgICAgICAgICAgcmV0dXJuICEhZ2V0VGVuc29yKG5hbWUsIHRlbnNvck1hcCwgY29udGV4dCk7XG4gICAgICAgICAgICAgIH0pKSB7XG4gICAgICAgIGFkZGVkW25vZGVOYW1lXSA9IHRydWU7XG4gICAgICAgIHN0YWNrLnB1c2goe2NvbnRleHRzOiBjb250ZXh0LmN1cnJlbnRDb250ZXh0LCBub2RlOiBjaGlsZE5vZGV9KTtcbiAgICAgIH1cbiAgICB9KTtcbiAgfVxuXG4gIC8qKlxuICAgKiBSZWxlYXNlcyB0aGUgbWVtb3J5IHVzZWQgYnkgdGhlIHdlaWdodCB0ZW5zb3JzLlxuICAgKi9cbiAgZGlzcG9zZSgpIHtcbiAgICBPYmplY3Qua2V5cyh0aGlzLndlaWdodE1hcClcbiAgICAgICAgLmZvckVhY2goXG4gICAgICAgICAgICBrZXkgPT4gdGhpcy53ZWlnaHRNYXBba2V5XS5mb3JFYWNoKHRlbnNvciA9PiB0ZW5zb3IuZGlzcG9zZSgpKSk7XG4gIH1cblxuICBwcml2YXRlIGNoZWNrSW5wdXRTaGFwZUFuZFR5cGUoaW5wdXRzOiBOYW1lZFRlbnNvck1hcCkge1xuICAgIE9iamVjdC5rZXlzKGlucHV0cykuZm9yRWFjaChuYW1lID0+IHtcbiAgICAgIGNvbnN0IGlucHV0ID0gaW5wdXRzW25hbWVdO1xuICAgICAgY29uc3QgW25vZGVOYW1lLCBdID0gcGFyc2VOb2RlTmFtZShuYW1lKTtcbiAgICAgIGNvbnN0IG5vZGUgPSB0aGlzLmdyYXBoLm5vZGVzW25vZGVOYW1lXTtcbiAgICAgIGlmIChub2RlLmF0dHJQYXJhbXNbJ3NoYXBlJ10gJiYgbm9kZS5hdHRyUGFyYW1zWydzaGFwZSddLnZhbHVlKSB7XG4gICAgICAgIGNvbnN0IHNoYXBlID0gbm9kZS5hdHRyUGFyYW1zWydzaGFwZSddLnZhbHVlIGFzIG51bWJlcltdO1xuICAgICAgICBjb25zdCBtYXRjaCA9IHNoYXBlLmxlbmd0aCA9PT0gaW5wdXQuc2hhcGUubGVuZ3RoICYmXG4gICAgICAgICAgICBpbnB1dC5zaGFwZS5ldmVyeShcbiAgICAgICAgICAgICAgICAoZGltLCBpbmRleCkgPT4gc2hhcGVbaW5kZXhdID09PSAtMSB8fCBzaGFwZVtpbmRleF0gPT09IGRpbSk7XG4gICAgICAgIHV0aWwuYXNzZXJ0KFxuICAgICAgICAgICAgbWF0Y2gsXG4gICAgICAgICAgICAoKSA9PiBgVGhlIHNoYXBlIG9mIGRpY3RbJyR7bm9kZS5uYW1lfSddIHByb3ZpZGVkIGluIGAgK1xuICAgICAgICAgICAgICAgIGBtb2RlbC5leGVjdXRlKGRpY3QpIG11c3QgYmUgWyR7c2hhcGV9XSwgYnV0IHdhcyBgICtcbiAgICAgICAgICAgICAgICBgWyR7aW5wdXQuc2hhcGV9XWApO1xuICAgICAgfVxuICAgICAgaWYgKG5vZGUuYXR0clBhcmFtc1snZHR5cGUnXSAmJiBub2RlLmF0dHJQYXJhbXNbJ2R0eXBlJ10udmFsdWUpIHtcbiAgICAgICAgdXRpbC5hc3NlcnQoXG4gICAgICAgICAgICBpbnB1dC5kdHlwZSA9PT0gbm9kZS5hdHRyUGFyYW1zWydkdHlwZSddLnZhbHVlIGFzIHN0cmluZyxcbiAgICAgICAgICAgICgpID0+IGBUaGUgZHR5cGUgb2YgZGljdFsnJHtub2RlLm5hbWV9J10gcHJvdmlkZWQgaW4gYCArXG4gICAgICAgICAgICAgICAgYG1vZGVsLmV4ZWN1dGUoZGljdCkgbXVzdCBiZSBgICtcbiAgICAgICAgICAgICAgICBgJHtub2RlLmF0dHJQYXJhbXNbJ2R0eXBlJ10udmFsdWV9LCBidXQgd2FzICR7aW5wdXQuZHR5cGV9YCk7XG4gICAgICB9XG4gICAgfSk7XG4gIH1cblxuICBwcml2YXRlIG1hcElucHV0cyhpbnB1dHM6IE5hbWVkVGVuc29yTWFwKSB7XG4gICAgY29uc3QgcmVzdWx0OiBOYW1lZFRlbnNvck1hcCA9IHt9O1xuICAgIGZvciAoY29uc3QgaW5wdXROYW1lIGluIGlucHV0cykge1xuICAgICAgaWYgKHRoaXMuX3NpZ25hdHVyZSAhPSBudWxsICYmIHRoaXMuX3NpZ25hdHVyZS5pbnB1dHMgIT0gbnVsbCAmJlxuICAgICAgICAgIHRoaXMuX3NpZ25hdHVyZS5pbnB1dHNbaW5wdXROYW1lXSAhPSBudWxsKSB7XG4gICAgICAgIGNvbnN0IHRlbnNvciA9IHRoaXMuX3NpZ25hdHVyZS5pbnB1dHNbaW5wdXROYW1lXTtcbiAgICAgICAgcmVzdWx0W3RlbnNvci5uYW1lXSA9IGlucHV0c1tpbnB1dE5hbWVdO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgcmVzdWx0W2lucHV0TmFtZV0gPSBpbnB1dHNbaW5wdXROYW1lXTtcbiAgICAgIH1cbiAgICB9XG4gICAgcmV0dXJuIHJlc3VsdDtcbiAgfVxuXG4gIHByaXZhdGUgY2hlY2tJbnB1dHMoaW5wdXRzOiBOYW1lZFRlbnNvck1hcCkge1xuICAgIGNvbnN0IG5vdEluR3JhcGggPSBPYmplY3Qua2V5cyhpbnB1dHMpLmZpbHRlcihuYW1lID0+IHtcbiAgICAgIGNvbnN0IFtub2RlTmFtZV0gPSBwYXJzZU5vZGVOYW1lKG5hbWUpO1xuICAgICAgcmV0dXJuIHRoaXMuZ3JhcGgubm9kZXNbbm9kZU5hbWVdID09IG51bGw7XG4gICAgfSk7XG4gICAgaWYgKG5vdEluR3JhcGgubGVuZ3RoID4gMCkge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKFxuICAgICAgICAgIGBUaGUgZGljdCBwcm92aWRlZCBpbiBtb2RlbC5leGVjdXRlKGRpY3QpIGhhcyBgICtcbiAgICAgICAgICBga2V5czogWyR7bm90SW5HcmFwaH1dIHRoYXQgYXJlIG5vdCBwYXJ0IG9mIGdyYXBoYCk7XG4gICAgfVxuICB9XG5cbiAgcHJpdmF0ZSBtYXBPdXRwdXRzKG91dHB1dHM6IHN0cmluZ1tdKSB7XG4gICAgcmV0dXJuIG91dHB1dHMubWFwKG5hbWUgPT4ge1xuICAgICAgaWYgKHRoaXMuX3NpZ25hdHVyZSAhPSBudWxsICYmIHRoaXMuX3NpZ25hdHVyZS5vdXRwdXRzICE9IG51bGwgJiZcbiAgICAgICAgICB0aGlzLl9zaWduYXR1cmUub3V0cHV0c1tuYW1lXSAhPSBudWxsKSB7XG4gICAgICAgIGNvbnN0IHRlbnNvciA9IHRoaXMuX3NpZ25hdHVyZS5vdXRwdXRzW25hbWVdO1xuICAgICAgICByZXR1cm4gdGVuc29yLm5hbWU7XG4gICAgICB9XG4gICAgICByZXR1cm4gbmFtZTtcbiAgICB9LCB7fSk7XG4gIH1cblxuICBwcml2YXRlIGNoZWNrT3V0cHV0cyhvdXRwdXRzOiBzdHJpbmdbXSk6IHZvaWQge1xuICAgIG91dHB1dHMuZm9yRWFjaChuYW1lID0+IHtcbiAgICAgIGNvbnN0IFtub3JtYWxpemVkTmFtZV0gPSBwYXJzZU5vZGVOYW1lKG5hbWUpO1xuICAgICAgaWYgKCF0aGlzLmdyYXBoLm5vZGVzW25vcm1hbGl6ZWROYW1lXSkge1xuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoYFRoZSBvdXRwdXQgJyR7bmFtZX0nIGlzIG5vdCBmb3VuZCBpbiB0aGUgZ3JhcGhgKTtcbiAgICAgIH1cbiAgICB9KTtcbiAgfVxufVxuIl19","/**\n * Contains global resources of a model.\n */\nexport class ResourceManager {\n constructor(hashTableNameToHandle = {}, hashTableMap = {}) {\n this.hashTableNameToHandle = hashTableNameToHandle;\n this.hashTableMap = hashTableMap;\n }\n /**\n * Register a `HashTable` in the resource manager.\n *\n * The `HashTable` can be retrieved by `resourceManager.getHashTableById`,\n * where id is the table handle tensor's id.\n *\n * @param name Op node name that creates the `HashTable`.\n * @param hashTable The `HashTable` to be added to resource manager.\n */\n addHashTable(name, hashTable) {\n this.hashTableNameToHandle[name] = hashTable.handle;\n this.hashTableMap[hashTable.id] = hashTable;\n }\n /**\n * Get the table handle by node name.\n * @param name Op node name that creates the `HashTable`. This name is also\n * used in the inputs list of lookup and import `HashTable` ops.\n */\n getHashTableHandleByName(name) {\n return this.hashTableNameToHandle[name];\n }\n /**\n * Get the actual `HashTable` by its handle tensor's id.\n * @param id The id of the handle tensor.\n */\n getHashTableById(id) {\n return this.hashTableMap[id];\n }\n /**\n * Dispose `ResourceManager`, including its hashTables and tensors in them.\n */\n dispose() {\n for (const key in this.hashTableMap) {\n this.hashTableMap[key].clearAndClose();\n delete this.hashTableMap[key];\n }\n for (const name in this.hashTableNameToHandle) {\n this.hashTableNameToHandle[name].dispose();\n delete this.hashTableNameToHandle[name];\n }\n }\n}\n//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicmVzb3VyY2VfbWFuYWdlci5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uLy4uL3RmanMtY29udmVydGVyL3NyYy9leGVjdXRvci9yZXNvdXJjZV9tYW5hZ2VyLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQW1CQTs7R0FFRztBQUNILE1BQU0sT0FBTyxlQUFlO0lBQzFCLFlBQ2Esd0JBQXdDLEVBQUUsRUFDMUMsZUFBNkIsRUFBRTtRQUQvQiwwQkFBcUIsR0FBckIscUJBQXFCLENBQXFCO1FBQzFDLGlCQUFZLEdBQVosWUFBWSxDQUFtQjtJQUFHLENBQUM7SUFFaEQ7Ozs7Ozs7O09BUUc7SUFDSCxZQUFZLENBQUMsSUFBWSxFQUFFLFNBQW9CO1FBQzdDLElBQUksQ0FBQyxxQkFBcUIsQ0FBQyxJQUFJLENBQUMsR0FBRyxTQUFTLENBQUMsTUFBTSxDQUFDO1FBQ3BELElBQUksQ0FBQyxZQUFZLENBQUMsU0FBUyxDQUFDLEVBQUUsQ0FBQyxHQUFHLFNBQVMsQ0FBQztJQUM5QyxDQUFDO0lBRUQ7Ozs7T0FJRztJQUNILHdCQUF3QixDQUFDLElBQVk7UUFDbkMsT0FBTyxJQUFJLENBQUMscUJBQXFCLENBQUMsSUFBSSxDQUFDLENBQUM7SUFDMUMsQ0FBQztJQUVEOzs7T0FHRztJQUNILGdCQUFnQixDQUFDLEVBQVU7UUFDekIsT0FBTyxJQUFJLENBQUMsWUFBWSxDQUFDLEVBQUUsQ0FBQyxDQUFDO0lBQy9CLENBQUM7SUFFRDs7T0FFRztJQUNILE9BQU87UUFDTCxLQUFLLE1BQU0sR0FBRyxJQUFJLElBQUksQ0FBQyxZQUFZLEVBQUU7WUFDbkMsSUFBSSxDQUFDLFlBQVksQ0FBQyxHQUFHLENBQUMsQ0FBQyxhQUFhLEVBQUUsQ0FBQztZQUN2QyxPQUFPLElBQUksQ0FBQyxZQUFZLENBQUMsR0FBRyxDQUFDLENBQUM7U0FDL0I7UUFFRCxLQUFLLE1BQU0sSUFBSSxJQUFJLElBQUksQ0FBQyxxQkFBcUIsRUFBRTtZQUM3QyxJQUFJLENBQUMscUJBQXFCLENBQUMsSUFBSSxDQUFDLENBQUMsT0FBTyxFQUFFLENBQUM7WUFDM0MsT0FBTyxJQUFJLENBQUMscUJBQXFCLENBQUMsSUFBSSxDQUFDLENBQUM7U0FDekM7SUFDSCxDQUFDO0NBQ0YiLCJzb3VyY2VzQ29udGVudCI6WyIvKipcbiAqIEBsaWNlbnNlXG4gKiBDb3B5cmlnaHQgMjAyMCBHb29nbGUgTExDLiBBbGwgUmlnaHRzIFJlc2VydmVkLlxuICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlIFwiTGljZW5zZVwiKTtcbiAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS5cbiAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdFxuICpcbiAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMFxuICpcbiAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmVcbiAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuIFwiQVMgSVNcIiBCQVNJUyxcbiAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLlxuICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZFxuICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuXG4gKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuICovXG5pbXBvcnQge0hhc2hUYWJsZU1hcCwgTmFtZWRUZW5zb3JNYXB9IGZyb20gJy4uL2RhdGEvdHlwZXMnO1xuaW1wb3J0IHtIYXNoVGFibGV9IGZyb20gJy4vaGFzaF90YWJsZSc7XG5cbi8qKlxuICogQ29udGFpbnMgZ2xvYmFsIHJlc291cmNlcyBvZiBhIG1vZGVsLlxuICovXG5leHBvcnQgY2xhc3MgUmVzb3VyY2VNYW5hZ2VyIHtcbiAgY29uc3RydWN0b3IoXG4gICAgICByZWFkb25seSBoYXNoVGFibGVOYW1lVG9IYW5kbGU6IE5hbWVkVGVuc29yTWFwID0ge30sXG4gICAgICByZWFkb25seSBoYXNoVGFibGVNYXA6IEhhc2hUYWJsZU1hcCA9IHt9KSB7fVxuXG4gIC8qKlxuICAgKiBSZWdpc3RlciBhIGBIYXNoVGFibGVgIGluIHRoZSByZXNvdXJjZSBtYW5hZ2VyLlxuICAgKlxuICAgKiBUaGUgYEhhc2hUYWJsZWAgY2FuIGJlIHJldHJpZXZlZCBieSBgcmVzb3VyY2VNYW5hZ2VyLmdldEhhc2hUYWJsZUJ5SWRgLFxuICAgKiB3aGVyZSBpZCBpcyB0aGUgdGFibGUgaGFuZGxlIHRlbnNvcidzIGlkLlxuICAgKlxuICAgKiBAcGFyYW0gbmFtZSBPcCBub2RlIG5hbWUgdGhhdCBjcmVhdGVzIHRoZSBgSGFzaFRhYmxlYC5cbiAgICogQHBhcmFtIGhhc2hUYWJsZSBUaGUgYEhhc2hUYWJsZWAgdG8gYmUgYWRkZWQgdG8gcmVzb3VyY2UgbWFuYWdlci5cbiAgICovXG4gIGFkZEhhc2hUYWJsZShuYW1lOiBzdHJpbmcsIGhhc2hUYWJsZTogSGFzaFRhYmxlKSB7XG4gICAgdGhpcy5oYXNoVGFibGVOYW1lVG9IYW5kbGVbbmFtZV0gPSBoYXNoVGFibGUuaGFuZGxlO1xuICAgIHRoaXMuaGFzaFRhYmxlTWFwW2hhc2hUYWJsZS5pZF0gPSBoYXNoVGFibGU7XG4gIH1cblxuICAvKipcbiAgICogR2V0IHRoZSB0YWJsZSBoYW5kbGUgYnkgbm9kZSBuYW1lLlxuICAgKiBAcGFyYW0gbmFtZSBPcCBub2RlIG5hbWUgdGhhdCBjcmVhdGVzIHRoZSBgSGFzaFRhYmxlYC4gVGhpcyBuYW1lIGlzIGFsc29cbiAgICogICAgIHVzZWQgaW4gdGhlIGlucHV0cyBsaXN0IG9mIGxvb2t1cCBhbmQgaW1wb3J0IGBIYXNoVGFibGVgIG9wcy5cbiAgICovXG4gIGdldEhhc2hUYWJsZUhhbmRsZUJ5TmFtZShuYW1lOiBzdHJpbmcpIHtcbiAgICByZXR1cm4gdGhpcy5oYXNoVGFibGVOYW1lVG9IYW5kbGVbbmFtZV07XG4gIH1cblxuICAvKipcbiAgICogR2V0IHRoZSBhY3R1YWwgYEhhc2hUYWJsZWAgYnkgaXRzIGhhbmRsZSB0ZW5zb3IncyBpZC5cbiAgICogQHBhcmFtIGlkIFRoZSBpZCBvZiB0aGUgaGFuZGxlIHRlbnNvci5cbiAgICovXG4gIGdldEhhc2hUYWJsZUJ5SWQoaWQ6IG51bWJlcik6IEhhc2hUYWJsZSB7XG4gICAgcmV0dXJuIHRoaXMuaGFzaFRhYmxlTWFwW2lkXTtcbiAgfVxuXG4gIC8qKlxuICAgKiBEaXNwb3NlIGBSZXNvdXJjZU1hbmFnZXJgLCBpbmNsdWRpbmcgaXRzIGhhc2hUYWJsZXMgYW5kIHRlbnNvcnMgaW4gdGhlbS5cbiAgICovXG4gIGRpc3Bvc2UoKSB7XG4gICAgZm9yIChjb25zdCBrZXkgaW4gdGhpcy5oYXNoVGFibGVNYXApIHtcbiAgICAgIHRoaXMuaGFzaFRhYmxlTWFwW2tleV0uY2xlYXJBbmRDbG9zZSgpO1xuICAgICAgZGVsZXRlIHRoaXMuaGFzaFRhYmxlTWFwW2tleV07XG4gICAgfVxuXG4gICAgZm9yIChjb25zdCBuYW1lIGluIHRoaXMuaGFzaFRhYmxlTmFtZVRvSGFuZGxlKSB7XG4gICAgICB0aGlzLmhhc2hUYWJsZU5hbWVUb0hhbmRsZVtuYW1lXS5kaXNwb3NlKCk7XG4gICAgICBkZWxldGUgdGhpcy5oYXNoVGFibGVOYW1lVG9IYW5kbGVbbmFtZV07XG4gICAgfVxuICB9XG59XG4iXX0=","/**\n * @license\n * Copyright 2018 Google LLC. All Rights Reserved.\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n * =============================================================================\n */\nimport { io, Tensor, util } from '@tensorflow/tfjs-core';\nimport { OperationMapper } from '../operations/operation_mapper';\nimport { GraphExecutor } from './graph_executor';\nimport { ResourceManager } from './resource_manager';\nexport const TFHUB_SEARCH_PARAM = '?tfjs-format=file';\nexport const DEFAULT_MODEL_NAME = 'model.json';\n/**\n * A `tf.GraphModel` is a directed, acyclic graph built from a\n * SavedModel GraphDef and allows inference execution.\n *\n * A `tf.GraphModel` can only be created by loading from a model converted from\n * a [TensorFlow SavedModel](https://www.tensorflow.org/guide/saved_model) using\n * the command line converter tool and loaded via `tf.loadGraphModel`.\n *\n * @doc {heading: 'Models', subheading: 'Classes'}\n */\nexport class GraphModel {\n /**\n * @param modelUrl url for the model, or an `io.IOHandler`.\n * @param weightManifestUrl url for the weight file generated by\n * scripts/convert.py script.\n * @param requestOption options for Request, which allows to send credentials\n * and custom headers.\n * @param onProgress Optional, progress callback function, fired periodically\n * before the load is completed.\n */\n constructor(modelUrl, loadOptions = {}, tfio = io) {\n this.modelUrl = modelUrl;\n this.loadOptions = loadOptions;\n this.version = 'n/a';\n this.io = tfio;\n if (loadOptions == null) {\n this.loadOptions = {};\n }\n this.resourceManager = new ResourceManager();\n }\n // Returns the version information for the tensorflow model GraphDef.\n get modelVersion() {\n return this.version;\n }\n get inputNodes() {\n return this.executor.inputNodes;\n }\n get outputNodes() {\n return this.executor.outputNodes;\n }\n get inputs() {\n return this.executor.inputs;\n }\n get outputs() {\n return this.executor.outputs;\n }\n get weights() {\n return this.executor.weightMap;\n }\n get metadata() {\n return this.artifacts.userDefinedMetadata;\n }\n get modelSignature() {\n return this.signature;\n }\n get modelStructuredOutputKeys() {\n return this.structuredOutputKeys;\n }\n findIOHandler() {\n const path = this.modelUrl;\n if (path.load != null) {\n // Path is an IO Handler.\n this.handler = path;\n }\n else if (this.loadOptions.requestInit != null) {\n this.handler = this.io.browserHTTPRequest(path, this.loadOptions);\n }\n else {\n const handlers = this.io.getLoadHandlers(path, this.loadOptions);\n if (handlers.length === 0) {\n // For backward compatibility: if no load handler can be found,\n // assume it is a relative http path.\n handlers.push(this.io.browserHTTPRequest(path, this.loadOptions));\n }\n else if (handlers.length > 1) {\n throw new Error(`Found more than one (${handlers.length}) load handlers for ` +\n `URL '${[path]}'`);\n }\n this.handler = handlers[0];\n }\n }\n /**\n * Loads the model and weight files, construct the in memory weight map and\n * compile the inference graph.\n */\n load() {\n this.findIOHandler();\n if (this.handler.load == null) {\n throw new Error('Cannot proceed with model loading because the IOHandler provided ' +\n 'does not have the `load` method implemented.');\n }\n const loadResult = this.handler.load();\n if (util.isPromise(loadResult)) {\n return loadResult.then(artifacts => this.loadSync(artifacts));\n }\n return this.loadSync(loadResult);\n }\n /**\n * Synchronously construct the in memory weight map and\n * compile the inference graph. Also initialize hashtable if any.\n *\n * @doc {heading: 'Models', subheading: 'Classes', ignoreCI: true}\n */\n loadSync(artifacts) {\n this.artifacts = artifacts;\n const graph = this.artifacts.modelTopology;\n let signature = this.artifacts.signature;\n if (this.artifacts.userDefinedMetadata != null) {\n const metadata = this.artifacts.userDefinedMetadata;\n if (metadata.signature != null) {\n signature = metadata.signature;\n }\n if (metadata.structuredOutputKeys != null) {\n this.structuredOutputKeys = metadata.structuredOutputKeys;\n }\n }\n this.signature = signature;\n this.version = `${graph.versions.producer}.${graph.versions.minConsumer}`;\n const weightMap = this.io.decodeWeights(this.artifacts.weightData, this.artifacts.weightSpecs);\n this.executor = new GraphExecutor(OperationMapper.Instance.transformGraph(graph, this.signature));\n this.executor.weightMap = this.convertTensorMapToTensorsMap(weightMap);\n // Attach a model-level resourceManager to each executor to share resources,\n // such as `HashTable`.\n this.executor.resourceManager = this.resourceManager;\n if (artifacts.modelInitializer != null &&\n artifacts.modelInitializer.node != null) {\n const initializer = OperationMapper.Instance.transformGraph(artifacts.modelInitializer);\n this.initializer = new GraphExecutor(initializer);\n this.initializer.weightMap = this.executor.weightMap;\n // Attach a model-level resourceManager to the initializer, the\n // hashTables created from when executing the initializer will be stored\n // in the resourceManager.\n this.initializer.resourceManager = this.resourceManager;\n this.initializer.executeAsync({}, []);\n }\n return true;\n }\n /**\n * Save the configuration and/or weights of the GraphModel.\n *\n * An `IOHandler` is an object that has a `save` method of the proper\n * signature defined. The `save` method manages the storing or\n * transmission of serialized data (\"artifacts\") that represent the\n * model's topology and weights onto or via a specific medium, such as\n * file downloads, local storage, IndexedDB in the web browser and HTTP\n * requests to a server. TensorFlow.js provides `IOHandler`\n * implementations for a number of frequently used saving mediums, such as\n * `tf.io.browserDownloads` and `tf.io.browserLocalStorage`. See `tf.io`\n * for more details.\n *\n * This method also allows you to refer to certain types of `IOHandler`s\n * as URL-like string shortcuts, such as 'localstorage://' and\n * 'indexeddb://'.\n *\n * Example 1: Save `model`'s topology and weights to browser [local\n * storage](https://developer.mozilla.org/en-US/docs/Web/API/Window/localStorage);\n * then load it back.\n *\n * ```js\n * const modelUrl =\n * 'https://storage.googleapis.com/tfjs-models/savedmodel/mobilenet_v2_1.0_224/model.json';\n * const model = await tf.loadGraphModel(modelUrl);\n * const zeros = tf.zeros([1, 224, 224, 3]);\n * model.predict(zeros).print();\n *\n * const saveResults = await model.save('localstorage://my-model-1');\n *\n * const loadedModel = await tf.loadGraphModel('localstorage://my-model-1');\n * console.log('Prediction from loaded model:');\n * model.predict(zeros).print();\n * ```\n *\n * @param handlerOrURL An instance of `IOHandler` or a URL-like,\n * scheme-based string shortcut for `IOHandler`.\n * @param config Options for saving the model.\n * @returns A `Promise` of `SaveResult`, which summarizes the result of\n * the saving, such as byte sizes of the saved artifacts for the model's\n * topology and weight values.\n *\n * @doc {heading: 'Models', subheading: 'Classes', ignoreCI: true}\n */\n async save(handlerOrURL, config) {\n if (typeof handlerOrURL === 'string') {\n const handlers = this.io.getSaveHandlers(handlerOrURL);\n if (handlers.length === 0) {\n throw new Error(`Cannot find any save handlers for URL '${handlerOrURL}'`);\n }\n else if (handlers.length > 1) {\n throw new Error(`Found more than one (${handlers.length}) save handlers for ` +\n `URL '${handlerOrURL}'`);\n }\n handlerOrURL = handlers[0];\n }\n if (handlerOrURL.save == null) {\n throw new Error('GraphModel.save() cannot proceed because the IOHandler ' +\n 'provided does not have the `save` attribute defined.');\n }\n return handlerOrURL.save(this.artifacts);\n }\n /**\n * Execute the inference for the input tensors.\n *\n * @param input The input tensors, when there is single input for the model,\n * inputs param should be a `tf.Tensor`. For models with mutliple inputs,\n * inputs params should be in either `tf.Tensor`[] if the input order is\n * fixed, or otherwise NamedTensorMap format.\n *\n * For model with multiple inputs, we recommend you use NamedTensorMap as the\n * input type, if you use `tf.Tensor`[], the order of the array needs to\n * follow the\n * order of inputNodes array. @see {@link GraphModel.inputNodes}\n *\n * You can also feed any intermediate nodes using the NamedTensorMap as the\n * input type. For example, given the graph\n * InputNode => Intermediate => OutputNode,\n * you can execute the subgraph Intermediate => OutputNode by calling\n * model.execute('IntermediateNode' : tf.tensor(...));\n *\n * This is useful for models that uses tf.dynamic_rnn, where the intermediate\n * state needs to be fed manually.\n *\n * For batch inference execution, the tensors for each input need to be\n * concatenated together. For example with mobilenet, the required input shape\n * is [1, 244, 244, 3], which represents the [batch, height, width, channel].\n * If we are provide a batched data of 100 images, the input tensor should be\n * in the shape of [100, 244, 244, 3].\n *\n * @param config Prediction configuration for specifying the batch size.\n * Currently the batch size option is ignored for graph model.\n *\n * @returns Inference result tensors. If the model is converted and it\n * originally had structured_outputs in tensorflow, then a NamedTensorMap\n * will be returned matching the structured_outputs. If no structured_outputs\n * are present, the output will be single `tf.Tensor` if the model has single\n * output node, otherwise Tensor[].\n *\n * @doc {heading: 'Models', subheading: 'Classes'}\n */\n predict(inputs, config) {\n const outputTensors = this.execute(inputs, this.outputNodes);\n if (this.structuredOutputKeys) {\n const outputTensorsArray = outputTensors instanceof Tensor ? [outputTensors] : outputTensors;\n const outputTensorMap = {};\n outputTensorsArray.forEach((outputTensor, i) => outputTensorMap[this.structuredOutputKeys[i]] =\n outputTensor);\n return outputTensorMap;\n }\n return outputTensors;\n }\n normalizeInputs(inputs) {\n if (!(inputs instanceof Tensor) && !Array.isArray(inputs)) {\n // The input is already a NamedTensorMap.\n return inputs;\n }\n inputs = Array.isArray(inputs) ? inputs : [inputs];\n if (inputs.length !== this.inputNodes.length) {\n throw new Error('Input tensor count mismatch,' +\n `the graph model has ${this.inputNodes.length} placeholders, ` +\n `while there are ${inputs.length} input tensors.`);\n }\n return this.inputNodes.reduce((map, inputName, i) => {\n map[inputName] = inputs[i];\n return map;\n }, {});\n }\n normalizeOutputs(outputs) {\n outputs = outputs || this.outputNodes;\n return !Array.isArray(outputs) ? [outputs] : outputs;\n }\n /**\n * Executes inference for the model for given input tensors.\n * @param inputs tensor, tensor array or tensor map of the inputs for the\n * model, keyed by the input node names.\n * @param outputs output node name from the TensorFlow model, if no\n * outputs are specified, the default outputs of the model would be used.\n * You can inspect intermediate nodes of the model by adding them to the\n * outputs array.\n *\n * @returns A single tensor if provided with a single output or no outputs\n * are provided and there is only one default output, otherwise return a\n * tensor array. The order of the tensor array is the same as the outputs\n * if provided, otherwise the order of outputNodes attribute of the model.\n *\n * @doc {heading: 'Models', subheading: 'Classes'}\n */\n execute(inputs, outputs) {\n inputs = this.normalizeInputs(inputs);\n outputs = this.normalizeOutputs(outputs);\n const result = this.executor.execute(inputs, outputs);\n return result.length > 1 ? result : result[0];\n }\n /**\n * Executes inference for the model for given input tensors in async\n * fashion, use this method when your model contains control flow ops.\n * @param inputs tensor, tensor array or tensor map of the inputs for the\n * model, keyed by the input node names.\n * @param outputs output node name from the TensorFlow model, if no outputs\n * are specified, the default outputs of the model would be used. You can\n * inspect intermediate nodes of the model by adding them to the outputs\n * array.\n *\n * @returns A Promise of single tensor if provided with a single output or\n * no outputs are provided and there is only one default output, otherwise\n * return a tensor map.\n *\n * @doc {heading: 'Models', subheading: 'Classes'}\n */\n async executeAsync(inputs, outputs) {\n inputs = this.normalizeInputs(inputs);\n outputs = this.normalizeOutputs(outputs);\n const result = await this.executor.executeAsync(inputs, outputs);\n return result.length > 1 ? result : result[0];\n }\n /**\n * Get intermediate tensors for model debugging mode (flag\n * KEEP_INTERMEDIATE_TENSORS is true).\n *\n * @doc {heading: 'Models', subheading: 'Classes'}\n */\n getIntermediateTensors() {\n return this.executor.getIntermediateTensors();\n }\n /**\n * Dispose intermediate tensors for model debugging mode (flag\n * KEEP_INTERMEDIATE_TENSORS is true).\n *\n * @doc {heading: 'Models', subheading: 'Classes'}\n */\n disposeIntermediateTensors() {\n this.executor.disposeIntermediateTensors();\n }\n convertTensorMapToTensorsMap(map) {\n return Object.keys(map).reduce((newMap, key) => {\n newMap[key] = [map[key]];\n return newMap;\n }, {});\n }\n /**\n * Releases the memory used by the weight tensors and resourceManager.\n *\n * @doc {heading: 'Models', subheading: 'Classes'}\n */\n dispose() {\n this.executor.dispose();\n if (this.initializer) {\n this.initializer.dispose();\n }\n this.resourceManager.dispose();\n }\n}\n/**\n * Load a graph model given a URL to the model definition.\n *\n * Example of loading MobileNetV2 from a URL and making a prediction with a\n * zeros input:\n *\n * ```js\n * const modelUrl =\n * 'https://storage.googleapis.com/tfjs-models/savedmodel/mobilenet_v2_1.0_224/model.json';\n * const model = await tf.loadGraphModel(modelUrl);\n * const zeros = tf.zeros([1, 224, 224, 3]);\n * model.predict(zeros).print();\n * ```\n *\n * Example of loading MobileNetV2 from a TF Hub URL and making a prediction\n * with a zeros input:\n *\n * ```js\n * const modelUrl =\n * 'https://tfhub.dev/google/imagenet/mobilenet_v2_140_224/classification/2';\n * const model = await tf.loadGraphModel(modelUrl, {fromTFHub: true});\n * const zeros = tf.zeros([1, 224, 224, 3]);\n * model.predict(zeros).print();\n * ```\n * @param modelUrl The url or an `io.IOHandler` that loads the model.\n * @param options Options for the HTTP request, which allows to send\n * credentials\n * and custom headers.\n *\n * @doc {heading: 'Models', subheading: 'Loading'}\n */\nexport async function loadGraphModel(modelUrl, options = {}, tfio = io) {\n if (modelUrl == null) {\n throw new Error('modelUrl in loadGraphModel() cannot be null. Please provide a url ' +\n 'or an IOHandler that loads the model');\n }\n if (options == null) {\n options = {};\n }\n if (options.fromTFHub && typeof modelUrl === 'string') {\n modelUrl = getTFHubUrl(modelUrl);\n }\n const model = new GraphModel(modelUrl, options, tfio);\n await model.load();\n return model;\n}\n/**\n * Load a graph model given a synchronous IO handler with a 'load' method.\n *\n * @param modelSource The `io.IOHandlerSync` that loads the model, or the\n * `io.ModelArtifacts` that encode the model, or a tuple of\n * `[io.ModelJSON, ArrayBuffer]` of which the first element encodes the\n * model and the second contains the weights.\n *\n * @doc {heading: 'Models', subheading: 'Loading'}\n */\nexport function loadGraphModelSync(modelSource) {\n if (modelSource == null) {\n throw new Error('modelUrl in loadGraphModelSync() cannot be null. Please provide ' +\n 'model artifacts or an IOHandler that loads the model');\n }\n let ioHandler;\n if (modelSource instanceof Array) {\n const [modelJSON, weights] = modelSource;\n if (!modelJSON) {\n throw new Error('modelJSON must be the first element of the array');\n }\n if (!weights || !(weights instanceof ArrayBuffer)) {\n throw new Error('An ArrayBuffer of weights must be the second element of'\n + ' the array');\n }\n if (!('modelTopology' in modelJSON)) {\n throw new Error('Model JSON is missing \\'modelTopology\\'');\n }\n if (!('weightsManifest' in modelJSON)) {\n throw new Error('Model JSON is missing \\'weightsManifest\\'');\n }\n const weightSpecs = io.getWeightSpecs(modelJSON.weightsManifest);\n const modelArtifacts = io.getModelArtifactsForJSONSync(modelJSON, weightSpecs, weights);\n ioHandler = io.fromMemorySync(modelArtifacts);\n }\n else if ('load' in modelSource) {\n // Then modelSource is already an IOHandlerSync.\n ioHandler = modelSource;\n }\n else if ('modelTopology' in modelSource && 'weightSpecs' in modelSource\n && 'weightData' in modelSource) {\n // modelSource is of type ModelArtifacts.\n ioHandler = io.fromMemorySync(modelSource);\n }\n else {\n throw new Error('Unknown model format');\n }\n const model = new GraphModel(ioHandler);\n model.load();\n return model;\n}\nfunction getTFHubUrl(modelUrl) {\n if (!modelUrl.endsWith('/')) {\n modelUrl = (modelUrl) + '/';\n }\n return `${modelUrl}${DEFAULT_MODEL_NAME}${TFHUB_SEARCH_PARAM}`;\n}\n//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZ3JhcGhfbW9kZWwuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi8uLi90ZmpzLWNvbnZlcnRlci9zcmMvZXhlY3V0b3IvZ3JhcGhfbW9kZWwudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUE7Ozs7Ozs7Ozs7Ozs7OztHQWVHO0FBRUgsT0FBTyxFQUFpQixFQUFFLEVBQXNDLE1BQU0sRUFBRSxJQUFJLEVBQUMsTUFBTSx1QkFBdUIsQ0FBQztBQUkzRyxPQUFPLEVBQUMsZUFBZSxFQUFDLE1BQU0sZ0NBQWdDLENBQUM7QUFFL0QsT0FBTyxFQUFDLGFBQWEsRUFBQyxNQUFNLGtCQUFrQixDQUFDO0FBQy9DLE9BQU8sRUFBQyxlQUFlLEVBQUMsTUFBTSxvQkFBb0IsQ0FBQztBQUVuRCxNQUFNLENBQUMsTUFBTSxrQkFBa0IsR0FBRyxtQkFBbUIsQ0FBQztBQUN0RCxNQUFNLENBQUMsTUFBTSxrQkFBa0IsR0FBRyxZQUFZLENBQUM7QUFJL0M7Ozs7Ozs7OztHQVNHO0FBQ0gsTUFBTSxPQUFPLFVBQVU7SUFpRHJCOzs7Ozs7OztPQVFHO0lBQ0gsWUFDWSxRQUFrQixFQUFVLGNBQThCLEVBQUUsRUFDcEUsSUFBSSxHQUFHLEVBQUU7UUFERCxhQUFRLEdBQVIsUUFBUSxDQUFVO1FBQVUsZ0JBQVcsR0FBWCxXQUFXLENBQXFCO1FBeERoRSxZQUFPLEdBQUcsS0FBSyxDQUFDO1FBMER0QixJQUFJLENBQUMsRUFBRSxHQUFHLElBQUksQ0FBQztRQUNmLElBQUksV0FBVyxJQUFJLElBQUksRUFBRTtZQUN2QixJQUFJLENBQUMsV0FBVyxHQUFHLEVBQUUsQ0FBQztTQUN2QjtRQUNELElBQUksQ0FBQyxlQUFlLEdBQUcsSUFBSSxlQUFlLEVBQUUsQ0FBQztJQUMvQyxDQUFDO0lBdERELHFFQUFxRTtJQUNyRSxJQUFJLFlBQVk7UUFDZCxPQUFPLElBQUksQ0FBQyxPQUFPLENBQUM7SUFDdEIsQ0FBQztJQUVELElBQUksVUFBVTtRQUNa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LENBQUMsSUFBSSxFQUFFLENBQUM7SUFDYixPQUFPLEtBQUssQ0FBQztBQUNmLENBQUM7QUFFRCxTQUFTLFdBQVcsQ0FBQyxRQUFnQjtJQUNuQyxJQUFJLENBQUMsUUFBUSxDQUFDLFFBQVEsQ0FBQyxHQUFHLENBQUMsRUFBRTtRQUMzQixRQUFRLEdBQUcsQ0FBQyxRQUFRLENBQUMsR0FBRyxHQUFHLENBQUM7S0FDN0I7SUFDRCxPQUFPLEdBQUcsUUFBUSxHQUFHLGtCQUFrQixHQUFHLGtCQUFrQixFQUFFLENBQUM7QUFDakUsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbIi8qKlxuICogQGxpY2Vuc2VcbiAqIENvcHlyaWdodCAyMDE4IEdvb2dsZSBMTEMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuXG4gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgXCJMaWNlbnNlXCIpO1xuICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLlxuICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0XG4gKlxuICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wXG4gKlxuICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZVxuICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gXCJBUyBJU1wiIEJBU0lTLFxuICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuXG4gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kXG4gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS5cbiAqID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4gKi9cblxuaW1wb3J0IHtJbmZlcmVuY2VNb2RlbCwgaW8sIE1vZGVsUHJlZGljdENvbmZpZywgTmFtZWRUZW5zb3JNYXAsIFRlbnNvciwgdXRpbH0gZnJvbSAnQHRlbnNvcmZsb3cvdGZqcy1jb3JlJztcblxuaW1wb3J0ICogYXMgdGVuc29yZmxvdyBmcm9tICcuLi9kYXRhL2NvbXBpbGVkX2FwaSc7XG5pbXBvcnQge05hbWVkVGVuc29yc01hcCwgVGVuc29ySW5mb30gZnJvbSAnLi4vZGF0YS90eXBlcyc7XG5pbXBvcnQge09wZXJhdGlvbk1hcHBlcn0gZnJvbSAnLi4vb3BlcmF0aW9ucy9vcGVyYXRpb25fbWFwcGVyJztcblxuaW1wb3J0IHtHcmFwaEV4ZWN1dG9yfSBmcm9tICcuL2dyYXBoX2V4ZWN1dG9yJztcbmltcG9ydCB7UmVzb3VyY2VNYW5hZ2VyfSBmcm9tICcuL3Jlc291cmNlX21hbmFnZXInO1xuXG5leHBvcnQgY29uc3QgVEZIVUJfU0VBUkNIX1BBUkFNID0gJz90ZmpzLWZvcm1hdD1maWxlJztcbmV4cG9ydCBjb25zdCBERUZBVUxUX01PREVMX05BTUUgPSAnbW9kZWwuanNvbic7XG50eXBlIFVybCA9IHN0cmluZ3xpby5JT0hhbmRsZXJ8aW8uSU9IYW5kbGVyU3luYztcbnR5cGUgVXJsSU9IYW5kbGVyPFQgZXh0ZW5kcyBVcmw+ID0gVCBleHRlbmRzIHN0cmluZyA/IGlvLklPSGFuZGxlciA6IFQ7XG5cbi8qKlxuICogQSBgdGYuR3JhcGhNb2RlbGAgaXMgYSBkaXJlY3RlZCwgYWN5Y2xpYyBncmFwaCBidWlsdCBmcm9tIGFcbiAqIFNhdmVkTW9kZWwgR3JhcGhEZWYgYW5kIGFsbG93cyBpbmZlcmVuY2UgZXhlY3V0aW9uLlxuICpcbiAqIEEgYHRmLkdyYXBoTW9kZWxgIGNhbiBvbmx5IGJlIGNyZWF0ZWQgYnkgbG9hZGluZyBmcm9tIGEgbW9kZWwgY29udmVydGVkIGZyb21cbiAqIGEgW1RlbnNvckZsb3cgU2F2ZWRNb2RlbF0oaHR0cHM6Ly93d3cudGVuc29yZmxvdy5vcmcvZ3VpZGUvc2F2ZWRfbW9kZWwpIHVzaW5nXG4gKiB0aGUgY29tbWFuZCBsaW5lIGNvbnZlcnRlciB0b29sIGFuZCBsb2FkZWQgdmlhIGB0Zi5sb2FkR3JhcGhNb2RlbGAuXG4gKlxuICogQGRvYyB7aGVhZGluZzogJ01vZGVscycsIHN1YmhlYWRpbmc6ICdDbGFzc2VzJ31cbiAqL1xuZXhwb3J0IGNsYXNzIEdyYXBoTW9kZWw8TW9kZWxVUkwgZXh0ZW5kcyBVcmwgPSBzdHJpbmcgfCBpby5JT0hhbmRsZXI+IGltcGxlbWVudHNcbiAgICBJbmZlcmVuY2VNb2RlbCB7XG4gIHByaXZhdGUgZXhlY3V0b3I6IEdyYXBoRXhlY3V0b3I7XG4gIHByaXZhdGUgdmVyc2lvbiA9ICduL2EnO1xuICBwcml2YXRlIGhhbmRsZXI6IFVybElPSGFuZGxlcjxNb2RlbFVSTD47XG4gIHByaXZhdGUgYXJ0aWZhY3RzOiBpby5Nb2RlbEFydGlmYWN0cztcbiAgcHJpdmF0ZSBpbml0aWFsaXplcjogR3JhcGhFeGVjdXRvcjtcbiAgcHJpdmF0ZSByZXNvdXJjZU1hbmFnZXI6IFJlc291cmNlTWFuYWdlcjtcbiAgcHJpdmF0ZSBzaWduYXR1cmU6IHRlbnNvcmZsb3cuSVNpZ25hdHVyZURlZjtcbiAgcHJpdmF0ZSBzdHJ1Y3R1cmVkT3V0cHV0S2V5czogc3RyaW5nW107XG4gIHByaXZhdGUgcmVhZG9ubHkgaW86IHR5cGVvZiBpbztcblxuICAvLyBSZXR1cm5zIHRoZSB2ZXJzaW9uIGluZm9ybWF0aW9uIGZvciB0aGUgdGVuc29yZmxvdyBtb2RlbCBHcmFwaERlZi5cbiAgZ2V0IG1vZGVsVmVyc2lvbigpOiBzdHJpbmcge1xuICAgIHJldHVybiB0aGlzLnZlcnNpb247XG4gIH1cblxuICBnZXQgaW5wdXROb2RlcygpOiBzdHJpbmdbXSB7XG4gICAgcmV0dXJuIHRoaXMuZXhlY3V0b3IuaW5wdXROb2RlcztcbiAgfVxuXG4gIGdldCBvdXRwdXROb2RlcygpOiBzdHJpbmdbXSB7XG4gICAgcmV0dXJuIHRoaXMuZXhlY3V0b3Iub3V0cHV0Tm9kZXM7XG4gIH1cblxuICBnZXQgaW5wdXRzKCk6IFRlbnNvckluZm9bXSB7XG4gICAgcmV0dXJuIHRoaXMuZXhlY3V0b3IuaW5wdXRzO1xuICB9XG5cbiAgZ2V0IG91dHB1dHMoKTogVGVuc29ySW5mb1tdIHtcbiAgICByZXR1cm4gdGhpcy5leGVjdXRvci5vdXRwdXRzO1xuICB9XG5cbiAgZ2V0IHdlaWdodHMoKTogTmFtZWRUZW5zb3JzTWFwIHtcbiAgICByZXR1cm4gdGhpcy5leGVjdXRvci53ZWlnaHRNYXA7XG4gIH1cblxuICBnZXQgbWV0YWRhdGEoKToge30ge1xuICAgIHJldHVybiB0aGlzLmFydGlmYWN0cy51c2VyRGVmaW5lZE1ldGFkYXRhO1xuICB9XG5cbiAgZ2V0IG1vZGVsU2lnbmF0dXJlKCk6IHt9IHtcbiAgICByZXR1cm4gdGhpcy5zaWduYXR1cmU7XG4gIH1cblxuICBnZXQgbW9kZWxTdHJ1Y3R1cmVkT3V0cHV0S2V5cygpOiB7fSB7XG4gICAgcmV0dXJuIHRoaXMuc3RydWN0dXJlZE91dHB1dEtleXM7XG4gIH1cblxuICAvKipcbiAgICogQHBhcmFtIG1vZGVsVXJsIHVybCBmb3IgdGhlIG1vZGVsLCBvciBhbiBgaW8uSU9IYW5kbGVyYC5cbiAgICogQHBhcmFtIHdlaWdodE1hbmlmZXN0VXJsIHVybCBmb3IgdGhlIHdlaWdodCBmaWxlIGdlbmVyYXRlZCBieVxuICAgKiBzY3JpcHRzL2NvbnZlcnQucHkgc2NyaXB0LlxuICAgKiBAcGFyYW0gcmVxdWVzdE9wdGlvbiBvcHRpb25zIGZvciBSZXF1ZXN0LCB3aGljaCBhbGxvd3MgdG8gc2VuZCBjcmVkZW50aWFsc1xuICAgKiBhbmQgY3VzdG9tIGhlYWRlcnMuXG4gICAqIEBwYXJhbSBvblByb2dyZXNzIE9wdGlvbmFsLCBwcm9ncmVzcyBjYWxsYmFjayBmdW5jdGlvbiwgZmlyZWQgcGVyaW9kaWNhbGx5XG4gICAqIGJlZm9yZSB0aGUgbG9hZCBpcyBjb21wbGV0ZWQuXG4gICAqL1xuICBjb25zdHJ1Y3RvcihcbiAgICAgIHByaXZhdGUgbW9kZWxVcmw6IE1vZGVsVVJMLCBwcml2YXRlIGxvYWRPcHRpb25zOiBpby5Mb2FkT3B0aW9ucyA9IHt9LFxuICAgICAgdGZpbyA9IGlvKSB7XG4gICAgdGhpcy5pbyA9IHRmaW87XG4gICAgaWYgKGxvYWRPcHRpb25zID09IG51bGwpIHtcbiAgICAgIHRoaXMubG9hZE9wdGlvbnMgPSB7fTtcbiAgICB9XG4gICAgdGhpcy5yZXNvdXJjZU1hbmFnZXIgPSBuZXcgUmVzb3VyY2VNYW5hZ2VyKCk7XG4gIH1cblxuICBwcml2YXRlIGZpbmRJT0hhbmRsZXIoKSB7XG4gICAgdHlwZSBJT0hhbmRsZXIgPSBVcmxJT0hhbmRsZXI8TW9kZWxVUkw+O1xuICAgIGNvbnN0IHBhdGggPSB0aGlzLm1vZGVsVXJsO1xuICAgIGlmICgocGF0aCBhcyBpby5JT0hhbmRsZXIpLmxvYWQgIT0gbnVsbCkge1xuICAgICAgLy8gUGF0aCBpcyBhbiBJTyBIYW5kbGVyLlxuICAgICAgdGhpcy5oYW5kbGVyID0gcGF0aCBhcyBJT0hhbmRsZXI7XG4gICAgfSBlbHNlIGlmICh0aGlzLmxvYWRPcHRpb25zLnJlcXVlc3RJbml0ICE9IG51bGwpIHtcbiAgICAgIHRoaXMuaGFuZGxlciA9IHRoaXMuaW8uYnJvd3NlckhUVFBSZXF1ZXN0KFxuICAgICAgICAgICAgICAgICAgICAgICAgIHBhdGggYXMgc3RyaW5nLCB0aGlzLmxvYWRPcHRpb25zKSBhcyBJT0hhbmRsZXI7XG4gICAgfSBlbHNlIHtcbiAgICAgIGNvbnN0IGhhbmRsZXJzID1cbiAgICAgICAgICB0aGlzLmlvLmdldExvYWRIYW5kbGVycyhwYXRoIGFzIHN0cmluZywgdGhpcy5sb2FkT3B0aW9ucyk7XG4gICAgICBpZiAoaGFuZGxlcnMubGVuZ3RoID09PSAwKSB7XG4gICAgICAgIC8vIEZvciBiYWNrd2FyZCBjb21wYXRpYmlsaXR5OiBpZiBubyBsb2FkIGhhbmRsZXIgY2FuIGJlIGZvdW5kLFxuICAgICAgICAvLyBhc3N1bWUgaXQgaXMgYSByZWxhdGl2ZSBodHRwIHBhdGguXG4gICAgICAgIGhhbmRsZXJzLnB1c2goXG4gICAgICAgICAgICB0aGlzLmlvLmJyb3dzZXJIVFRQUmVxdWVzdChwYXRoIGFzIHN0cmluZywgdGhpcy5sb2FkT3B0aW9ucykpO1xuICAgICAgfSBlbHNlIGlmIChoYW5kbGVycy5sZW5ndGggPiAxKSB7XG4gICAgICAgIHRocm93IG5ldyBFcnJvcihcbiAgICAgICAgICAgIGBGb3VuZCBtb3JlIHRoYW4gb25lICgke2hhbmRsZXJzLmxlbmd0aH0pIGxvYWQgaGFuZGxlcnMgZm9yIGAgK1xuICAgICAgICAgICAgYFVSTCAnJHtbcGF0aF19J2ApO1xuICAgICAgfVxuICAgICAgdGhpcy5oYW5kbGVyID0gaGFuZGxlcnNbMF0gYXMgSU9IYW5kbGVyO1xuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBMb2FkcyB0aGUgbW9kZWwgYW5kIHdlaWdodCBmaWxlcywgY29uc3RydWN0IHRoZSBpbiBtZW1vcnkgd2VpZ2h0IG1hcCBhbmRcbiAgICogY29tcGlsZSB0aGUgaW5mZXJlbmNlIGdyYXBoLlxuICAgKi9cbiAgbG9hZCgpOiBVcmxJT0hhbmRsZXI8TW9kZWxVUkw+IGV4dGVuZHMgaW8uSU9IYW5kbGVyU3luYz8gYm9vbGVhbjpcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFByb21pc2U8Ym9vbGVhbj4ge1xuICAgIHR5cGUgSU9IYW5kbGVyID0gVXJsSU9IYW5kbGVyPE1vZGVsVVJMPjtcbiAgICB0aGlzLmZpbmRJT0hhbmRsZXIoKTtcbiAgICBpZiAodGhpcy5oYW5kbGVyLmxvYWQgPT0gbnVsbCkge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKFxuICAgICAgICAgICdDYW5ub3QgcHJvY2VlZCB3aXRoIG1vZGVsIGxvYWRpbmcgYmVjYXVzZSB0aGUgSU9IYW5kbGVyIHByb3ZpZGVkICcgK1xuICAgICAgICAgICdkb2VzIG5vdCBoYXZlIHRoZSBgbG9hZGAgbWV0aG9kIGltcGxlbWVudGVkLicpO1xuICAgIH1cblxuICAgIHR5cGUgUmVzdWx0ID1cbiAgICAgICAgSU9IYW5kbGVyIGV4dGVuZHMgaW8uSU9IYW5kbGVyU3luYyA/IGJvb2xlYW4gOiBQcm9taXNlPGJvb2xlYW4+O1xuXG4gICAgY29uc3QgbG9hZFJlc3VsdCA9IHRoaXMuaGFuZGxlci5sb2FkKCkgYXMgUmV0dXJuVHlwZTxJT0hhbmRsZXJbJ2xvYWQnXT47XG4gICAgaWYgKHV0aWwuaXNQcm9taXNlKGxvYWRSZXN1bHQpKSB7XG4gICAgICByZXR1cm4gbG9hZFJlc3VsdC50aGVuKGFydGlmYWN0cyA9PiB0aGlzLmxvYWRTeW5jKGFydGlmYWN0cykpIGFzIFJlc3VsdDtcbiAgICB9XG5cbiAgICByZXR1cm4gdGhpcy5sb2FkU3luYyhsb2FkUmVzdWx0KSBhcyBSZXN1bHQ7XG4gIH1cblxuICAvKipcbiAgICogU3luY2hyb25vdXNseSBjb25zdHJ1Y3QgdGhlIGluIG1lbW9yeSB3ZWlnaHQgbWFwIGFuZFxuICAgKiBjb21waWxlIHRoZSBpbmZlcmVuY2UgZ3JhcGguIEFsc28gaW5pdGlhbGl6ZSBoYXNodGFibGUgaWYgYW55LlxuICAgKlxuICAgKiBAZG9jIHtoZWFkaW5nOiAnTW9kZWxzJywgc3ViaGVhZGluZzogJ0NsYXNzZXMnLCBpZ25vcmVDSTogdHJ1ZX1cbiAgICovXG4gIGxvYWRTeW5jKGFydGlmYWN0czogaW8uTW9kZWxBcnRpZmFjdHMpIHtcbiAgICB0aGlzLmFydGlmYWN0cyA9IGFydGlmYWN0cztcbiAgICBjb25zdCBncmFwaCA9IHRoaXMuYXJ0aWZhY3RzLm1vZGVsVG9wb2xvZ3kgYXMgdGVuc29yZmxvdy5JR3JhcGhEZWY7XG5cbiAgICBsZXQgc2lnbmF0dXJlID0gdGhpcy5hcnRpZmFjdHMuc2lnbmF0dXJlO1xuICAgIGlmICh0aGlzLmFydGlmYWN0cy51c2VyRGVmaW5lZE1ldGFkYXRhICE9IG51bGwpIHtcbiAgICAgIGNvbnN0IG1ldGFkYXRhID0gdGhpcy5hcnRpZmFjdHMudXNlckRlZmluZWRNZXRhZGF0YTtcbiAgICAgIGlmIChtZXRhZGF0YS5zaWduYXR1cmUgIT0gbnVsbCkge1xuICAgICAgICBzaWduYXR1cmUgPSBtZXRhZGF0YS5zaWduYXR1cmU7XG4gICAgICB9XG5cbiAgICAgIGlmIChtZXRhZGF0YS5zdHJ1Y3R1cmVkT3V0cHV0S2V5cyAhPSBudWxsKSB7XG4gICAgICAgIHRoaXMuc3RydWN0dXJlZE91dHB1dEtleXMgPSBtZXRhZGF0YS5zdHJ1Y3R1cmVkT3V0cHV0S2V5cyBhcyBzdHJpbmdbXTtcbiAgICAgIH1cbiAgICB9XG4gICAgdGhpcy5zaWduYXR1cmUgPSBzaWduYXR1cmU7XG5cbiAgICB0aGlzLnZlcnNpb24gPSBgJHtncmFwaC52ZXJzaW9ucy5wcm9kdWNlcn0uJHtncmFwaC52ZXJzaW9ucy5taW5Db25zdW1lcn1gO1xuICAgIGNvbnN0IHdlaWdodE1hcCA9IHRoaXMuaW8uZGVjb2RlV2VpZ2h0cyhcbiAgICAgICAgdGhpcy5hcnRpZmFjdHMud2VpZ2h0RGF0YSwgdGhpcy5hcnRpZmFjdHMud2VpZ2h0U3BlY3MpO1xuICAgIHRoaXMuZXhlY3V0b3IgPSBuZXcgR3JhcGhFeGVjdXRvcihcbiAgICAgICAgT3BlcmF0aW9uTWFwcGVyLkluc3RhbmNlLnRyYW5zZm9ybUdyYXBoKGdyYXBoLCB0aGlzLnNpZ25hdHVyZSkpO1xuICAgIHRoaXMuZXhlY3V0b3Iud2VpZ2h0TWFwID0gdGhpcy5jb252ZXJ0VGVuc29yTWFwVG9UZW5zb3JzTWFwKHdlaWdodE1hcCk7XG4gICAgLy8gQXR0YWNoIGEgbW9kZWwtbGV2ZWwgcmVzb3VyY2VNYW5hZ2VyIHRvIGVhY2ggZXhlY3V0b3IgdG8gc2hhcmUgcmVzb3VyY2VzLFxuICAgIC8vIHN1Y2ggYXMgYEhhc2hUYWJsZWAuXG4gICAgdGhpcy5leGVjdXRvci5yZXNvdXJjZU1hbmFnZXIgPSB0aGlzLnJlc291cmNlTWFuYWdlcjtcblxuICAgIGlmIChhcnRpZmFjdHMubW9kZWxJbml0aWFsaXplciAhPSBudWxsICYmXG4gICAgICAgIChhcnRpZmFjdHMubW9kZWxJbml0aWFsaXplciBhcyB0ZW5zb3JmbG93LklHcmFwaERlZikubm9kZSAhPSBudWxsKSB7XG4gICAgICBjb25zdCBpbml0aWFsaXplciA9XG4gICAgICAgICAgT3BlcmF0aW9uTWFwcGVyLkluc3RhbmNlLnRyYW5zZm9ybUdyYXBoKGFydGlmYWN0cy5tb2RlbEluaXRpYWxpemVyKTtcbiAgICAgIHRoaXMuaW5pdGlhbGl6ZXIgPSBuZXcgR3JhcGhFeGVjdXRvcihpbml0aWFsaXplcik7XG4gICAgICB0aGlzLmluaXRpYWxpemVyLndlaWdodE1hcCA9IHRoaXMuZXhlY3V0b3Iud2VpZ2h0TWFwO1xuICAgICAgLy8gQXR0YWNoIGEgbW9kZWwtbGV2ZWwgcmVzb3VyY2VNYW5hZ2VyIHRvIHRoZSBpbml0aWFsaXplciwgdGhlXG4gICAgICAvLyBoYXNoVGFibGVzIGNyZWF0ZWQgZnJvbSB3aGVuIGV4ZWN1dGluZyB0aGUgaW5pdGlhbGl6ZXIgd2lsbCBiZSBzdG9yZWRcbiAgICAgIC8vIGluIHRoZSByZXNvdXJjZU1hbmFnZXIuXG4gICAgICB0aGlzLmluaXRpYWxpemVyLnJlc291cmNlTWFuYWdlciA9IHRoaXMucmVzb3VyY2VNYW5hZ2VyO1xuICAgICAgdGhpcy5pbml0aWFsaXplci5leGVjdXRlQXN5bmMoe30sIFtdKTtcbiAgICB9XG5cbiAgICByZXR1cm4gdHJ1ZTtcbiAgfVxuXG4gIC8qKlxuICAgKiBTYXZlIHRoZSBjb25maWd1cmF0aW9uIGFuZC9vciB3ZWlnaHRzIG9mIHRoZSBHcmFwaE1vZGVsLlxuICAgKlxuICAgKiBBbiBgSU9IYW5kbGVyYCBpcyBhbiBvYmplY3QgdGhhdCBoYXMgYSBgc2F2ZWAgbWV0aG9kIG9mIHRoZSBwcm9wZXJcbiAgICogc2lnbmF0dXJlIGRlZmluZWQuIFRoZSBgc2F2ZWAgbWV0aG9kIG1hbmFnZXMgdGhlIHN0b3Jpbmcgb3JcbiAgICogdHJhbnNtaXNzaW9uIG9mIHNlcmlhbGl6ZWQgZGF0YSAoXCJhcnRpZmFjdHNcIikgdGhhdCByZXByZXNlbnQgdGhlXG4gICAqIG1vZGVsJ3MgdG9wb2xvZ3kgYW5kIHdlaWdodHMgb250byBvciB2aWEgYSBzcGVjaWZpYyBtZWRpdW0sIHN1Y2ggYXNcbiAgICogZmlsZSBkb3dubG9hZHMsIGxvY2FsIHN0b3JhZ2UsIEluZGV4ZWREQiBpbiB0aGUgd2ViIGJyb3dzZXIgYW5kIEhUVFBcbiAgICogcmVxdWVzdHMgdG8gYSBzZXJ2ZXIuIFRlbnNvckZsb3cuanMgcHJvdmlkZXMgYElPSGFuZGxlcmBcbiAgICogaW1wbGVtZW50YXRpb25zIGZvciBhIG51bWJlciBvZiBmcmVxdWVudGx5IHVzZWQgc2F2aW5nIG1lZGl1bXMsIHN1Y2ggYXNcbiAgICogYHRmLmlvLmJyb3dzZXJEb3dubG9hZHNgIGFuZCBgdGYuaW8uYnJvd3NlckxvY2FsU3RvcmFnZWAuIFNlZSBgdGYuaW9gXG4gICAqIGZvciBtb3JlIGRldGFpbHMuXG4gICAqXG4gICAqIFRoaXMgbWV0aG9kIGFsc28gYWxsb3dzIHlvdSB0byByZWZlciB0byBjZXJ0YWluIHR5cGVzIG9mIGBJT0hhbmRsZXJgc1xuICAgKiBhcyBVUkwtbGlrZSBzdHJpbmcgc2hvcnRjdXRzLCBzdWNoIGFzICdsb2NhbHN0b3JhZ2U6Ly8nIGFuZFxuICAgKiAnaW5kZXhlZGRiOi8vJy5cbiAgICpcbiAgICogRXhhbXBsZSAxOiBTYXZlIGBtb2RlbGAncyB0b3BvbG9neSBhbmQgd2VpZ2h0cyB0byBicm93c2VyIFtsb2NhbFxuICAgKiBzdG9yYWdlXShodHRwczovL2RldmVsb3Blci5tb3ppbGxhLm9yZy9lbi1VUy9kb2NzL1dlYi9BUEkvV2luZG93L2xvY2FsU3RvcmFnZSk7XG4gICAqIHRoZW4gbG9hZCBpdCBiYWNrLlxuICAgKlxuICAgKiBgYGBqc1xuICAgKiBjb25zdCBtb2RlbFVybCA9XG4gICAqICAgICdodHRwczovL3N0b3JhZ2UuZ29vZ2xlYXBpcy5jb20vdGZqcy1tb2RlbHMvc2F2ZWRtb2RlbC9tb2JpbGVuZXRfdjJfMS4wXzIyNC9tb2RlbC5qc29uJztcbiAgICogY29uc3QgbW9kZWwgPSBhd2FpdCB0Zi5sb2FkR3JhcGhNb2RlbChtb2RlbFVybCk7XG4gICAqIGNvbnN0IHplcm9zID0gdGYuemVyb3MoWzEsIDIyNCwgMjI0LCAzXSk7XG4gICAqIG1vZGVsLnByZWRpY3QoemVyb3MpLnByaW50KCk7XG4gICAqXG4gICAqIGNvbnN0IHNhdmVSZXN1bHRzID0gYXdhaXQgbW9kZWwuc2F2ZSgnbG9jYWxzdG9yYWdlOi8vbXktbW9kZWwtMScpO1xuICAgKlxuICAgKiBjb25zdCBsb2FkZWRNb2RlbCA9IGF3YWl0IHRmLmxvYWRHcmFwaE1vZGVsKCdsb2NhbHN0b3JhZ2U6Ly9teS1tb2RlbC0xJyk7XG4gICAqIGNvbnNvbGUubG9nKCdQcmVkaWN0aW9uIGZyb20gbG9hZGVkIG1vZGVsOicpO1xuICAgKiBtb2RlbC5wcmVkaWN0KHplcm9zKS5wcmludCgpO1xuICAgKiBgYGBcbiAgICpcbiAgICogQHBhcmFtIGhhbmRsZXJPclVSTCBBbiBpbnN0YW5jZSBvZiBgSU9IYW5kbGVyYCBvciBhIFVSTC1saWtlLFxuICAgKiBzY2hlbWUtYmFzZWQgc3RyaW5nIHNob3J0Y3V0IGZvciBgSU9IYW5kbGVyYC5cbiAgICogQHBhcmFtIGNvbmZpZyBPcHRpb25zIGZvciBzYXZpbmcgdGhlIG1vZGVsLlxuICAgKiBAcmV0dXJucyBBIGBQcm9taXNlYCBvZiBgU2F2ZVJlc3VsdGAsIHdoaWNoIHN1bW1hcml6ZXMgdGhlIHJlc3VsdCBvZlxuICAgKiB0aGUgc2F2aW5nLCBzdWNoIGFzIGJ5dGUgc2l6ZXMgb2YgdGhlIHNhdmVkIGFydGlmYWN0cyBmb3IgdGhlIG1vZGVsJ3NcbiAgICogICB0b3BvbG9neSBhbmQgd2VpZ2h0IHZhbHVlcy5cbiAgICpcbiAgICogQGRvYyB7aGVhZGluZzogJ01vZGVscycsIHN1YmhlYWRpbmc6ICdDbGFzc2VzJywgaWdub3JlQ0k6IHRydWV9XG4gICAqL1xuICBhc3luYyBzYXZlKGhhbmRsZXJPclVSTDogaW8uSU9IYW5kbGVyfHN0cmluZywgY29uZmlnPzogaW8uU2F2ZUNvbmZpZyk6XG4gICAgICBQcm9taXNlPGlvLlNhdmVSZXN1bHQ+IHtcbiAgICBpZiAodHlwZW9mIGhhbmRsZXJPclVSTCA9PT0gJ3N0cmluZycpIHtcbiAgICAgIGNvbnN0IGhhbmRsZXJzID0gdGhpcy5pby5nZXRTYXZlSGFuZGxlcnMoaGFuZGxlck9yVVJMKTtcbiAgICAgIGlmIChoYW5kbGVycy5sZW5ndGggPT09IDApIHtcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKFxuICAgICAgICAgICAgYENhbm5vdCBmaW5kIGFueSBzYXZlIGhhbmRsZXJzIGZvciBVUkwgJyR7aGFuZGxlck9yVVJMfSdgKTtcbiAgICAgIH0gZWxzZSBpZiAoaGFuZGxlcnMubGVuZ3RoID4gMSkge1xuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoXG4gICAgICAgICAgICBgRm91bmQgbW9yZSB0aGFuIG9uZSAoJHtoYW5kbGVycy5sZW5ndGh9KSBzYXZlIGhhbmRsZXJzIGZvciBgICtcbiAgICAgICAgICAgIGBVUkwgJyR7aGFuZGxlck9yVVJMfSdgKTtcbiAgICAgIH1cbiAgICAgIGhhbmRsZXJPclVSTCA9IGhhbmRsZXJzWzBdO1xuICAgIH1cbiAgICBpZiAoaGFuZGxlck9yVVJMLnNhdmUgPT0gbnVsbCkge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKFxuICAgICAgICAgICdHcmFwaE1vZGVsLnNhdmUoKSBjYW5ub3QgcHJvY2VlZCBiZWNhdXNlIHRoZSBJT0hhbmRsZXIgJyArXG4gICAgICAgICAgJ3Byb3ZpZGVkIGRvZXMgbm90IGhhdmUgdGhlIGBzYXZlYCBhdHRyaWJ1dGUgZGVmaW5lZC4nKTtcbiAgICB9XG5cbiAgICByZXR1cm4gaGFuZGxlck9yVVJMLnNhdmUodGhpcy5hcnRpZmFjdHMpO1xuICB9XG5cbiAgLyoqXG4gICAqIEV4ZWN1dGUgdGhlIGluZmVyZW5jZSBmb3IgdGhlIGlucHV0IHRlbnNvcnMuXG4gICAqXG4gICAqIEBwYXJhbSBpbnB1dCBUaGUgaW5wdXQgdGVuc29ycywgd2hlbiB0aGVyZSBpcyBzaW5nbGUgaW5wdXQgZm9yIHRoZSBtb2RlbCxcbiAgICogaW5wdXRzIHBhcmFtIHNob3VsZCBiZSBhIGB0Zi5UZW5zb3JgLiBGb3IgbW9kZWxzIHdpdGggbXV0bGlwbGUgaW5wdXRzLFxuICAgKiBpbnB1dHMgcGFyYW1zIHNob3VsZCBiZSBpbiBlaXRoZXIgYHRmLlRlbnNvcmBbXSBpZiB0aGUgaW5wdXQgb3JkZXIgaXNcbiAgICogZml4ZWQsIG9yIG90aGVyd2lzZSBOYW1lZFRlbnNvck1hcCBmb3JtYXQuXG4gICAqXG4gICAqIEZvciBtb2RlbCB3aXRoIG11bHRpcGxlIGlucHV0cywgd2UgcmVjb21tZW5kIHlvdSB1c2UgTmFtZWRUZW5zb3JNYXAgYXMgdGhlXG4gICAqIGlucHV0IHR5cGUsIGlmIHlvdSB1c2UgYHRmLlRlbnNvcmBbXSwgdGhlIG9yZGVyIG9mIHRoZSBhcnJheSBuZWVkcyB0b1xuICAgKiBmb2xsb3cgdGhlXG4gICAqIG9yZGVyIG9mIGlucHV0Tm9kZXMgYXJyYXkuIEBzZWUge0BsaW5rIEdyYXBoTW9kZWwuaW5wdXROb2Rlc31cbiAgICpcbiAgICogWW91IGNhbiBhbHNvIGZlZWQgYW55IGludGVybWVkaWF0ZSBub2RlcyB1c2luZyB0aGUgTmFtZWRUZW5zb3JNYXAgYXMgdGhlXG4gICAqIGlucHV0IHR5cGUuIEZvciBleGFtcGxlLCBnaXZlbiB0aGUgZ3JhcGhcbiAgICogICAgSW5wdXROb2RlID0+IEludGVybWVkaWF0ZSA9PiBPdXRwdXROb2RlLFxuICAgKiB5b3UgY2FuIGV4ZWN1dGUgdGhlIHN1YmdyYXBoIEludGVybWVkaWF0ZSA9PiBPdXRwdXROb2RlIGJ5IGNhbGxpbmdcbiAgICogICAgbW9kZWwuZXhlY3V0ZSgnSW50ZXJtZWRpYXRlTm9kZScgOiB0Zi50ZW5zb3IoLi4uKSk7XG4gICAqXG4gICAqIFRoaXMgaXMgdXNlZnVsIGZvciBtb2RlbHMgdGhhdCB1c2VzIHRmLmR5bmFtaWNfcm5uLCB3aGVyZSB0aGUgaW50ZXJtZWRpYXRlXG4gICAqIHN0YXRlIG5lZWRzIHRvIGJlIGZlZCBtYW51YWxseS5cbiAgICpcbiAgICogRm9yIGJhdGNoIGluZmVyZW5jZSBleGVjdXRpb24sIHRoZSB0ZW5zb3JzIGZvciBlYWNoIGlucHV0IG5lZWQgdG8gYmVcbiAgICogY29uY2F0ZW5hdGVkIHRvZ2V0aGVyLiBGb3IgZXhhbXBsZSB3aXRoIG1vYmlsZW5ldCwgdGhlIHJlcXVpcmVkIGlucHV0IHNoYXBlXG4gICAqIGlzIFsxLCAyNDQsIDI0NCwgM10sIHdoaWNoIHJlcHJlc2VudHMgdGhlIFtiYXRjaCwgaGVpZ2h0LCB3aWR0aCwgY2hhbm5lbF0uXG4gICAqIElmIHdlIGFyZSBwcm92aWRlIGEgYmF0Y2hlZCBkYXRhIG9mIDEwMCBpbWFnZXMsIHRoZSBpbnB1dCB0ZW5zb3Igc2hvdWxkIGJlXG4gICAqIGluIHRoZSBzaGFwZSBvZiBbMTAwLCAyNDQsIDI0NCwgM10uXG4gICAqXG4gICAqIEBwYXJhbSBjb25maWcgUHJlZGljdGlvbiBjb25maWd1cmF0aW9uIGZvciBzcGVjaWZ5aW5nIHRoZSBiYXRjaCBzaXplLlxuICAgKiBDdXJyZW50bHkgdGhlIGJhdGNoIHNpemUgb3B0aW9uIGlzIGlnbm9yZWQgZm9yIGdyYXBoIG1vZGVsLlxuICAgKlxuICAgKiBAcmV0dXJucyBJbmZlcmVuY2UgcmVzdWx0IHRlbnNvcnMuIElmIHRoZSBtb2RlbCBpcyBjb252ZXJ0ZWQgYW5kIGl0XG4gICAqIG9yaWdpbmFsbHkgaGFkIHN0cnVjdHVyZWRfb3V0cHV0cyBpbiB0ZW5zb3JmbG93LCB0aGVuIGEgTmFtZWRUZW5zb3JNYXBcbiAgICogd2lsbCBiZSByZXR1cm5lZCBtYXRjaGluZyB0aGUgc3RydWN0dXJlZF9vdXRwdXRzLiBJZiBubyBzdHJ1Y3R1cmVkX291dHB1dHNcbiAgICogYXJlIHByZXNlbnQsIHRoZSBvdXRwdXQgd2lsbCBiZSBzaW5nbGUgYHRmLlRlbnNvcmAgaWYgdGhlIG1vZGVsIGhhcyBzaW5nbGVcbiAgICogb3V0cHV0IG5vZGUsIG90aGVyd2lzZSBUZW5zb3JbXS5cbiAgICpcbiAgICogQGRvYyB7aGVhZGluZzogJ01vZGVscycsIHN1YmhlYWRpbmc6ICdDbGFzc2VzJ31cbiAgICovXG4gIHByZWRpY3QoaW5wdXRzOiBUZW5zb3J8VGVuc29yW118TmFtZWRUZW5zb3JNYXAsIGNvbmZpZz86IE1vZGVsUHJlZGljdENvbmZpZyk6XG4gICAgICBUZW5zb3J8VGVuc29yW118TmFtZWRUZW5zb3JNYXAge1xuICAgIGNvbnN0IG91dHB1dFRlbnNvcnMgPSB0aGlzLmV4ZWN1dGUoaW5wdXRzLCB0aGlzLm91dHB1dE5vZGVzKTtcbiAgICBpZiAodGhpcy5zdHJ1Y3R1cmVkT3V0cHV0S2V5cykge1xuICAgICAgY29uc3Qgb3V0cHV0VGVuc29yc0FycmF5ID1cbiAgICAgICAgICBvdXRwdXRUZW5zb3JzIGluc3RhbmNlb2YgVGVuc29yID8gW291dHB1dFRlbnNvcnNdIDogb3V0cHV0VGVuc29ycztcbiAgICAgIGNvbnN0IG91dHB1dFRlbnNvck1hcDogTmFtZWRUZW5zb3JNYXAgPSB7fTtcblxuICAgICAgb3V0cHV0VGVuc29yc0FycmF5LmZvckVhY2goXG4gICAgICAgICAgKG91dHB1dFRlbnNvciwgaSkgPT4gb3V0cHV0VGVuc29yTWFwW3RoaXMuc3RydWN0dXJlZE91dHB1dEtleXNbaV1dID1cbiAgICAgICAgICAgICAgb3V0cHV0VGVuc29yKTtcblxuICAgICAgcmV0dXJuIG91dHB1dFRlbnNvck1hcDtcbiAgICB9XG4gICAgcmV0dXJuIG91dHB1dFRlbnNvcnM7XG4gIH1cblxuICBwcml2YXRlIG5vcm1hbGl6ZUlucHV0cyhpbnB1dHM6IFRlbnNvcnxUZW5zb3JbXXxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgTmFtZWRUZW5zb3JNYXApOiBOYW1lZFRlbnNvck1hcCB7XG4gICAgaWYgKCEoaW5wdXRzIGluc3RhbmNlb2YgVGVuc29yKSAmJiAhQXJyYXkuaXNBcnJheShpbnB1dHMpKSB7XG4gICAgICAvLyBUaGUgaW5wdXQgaXMgYWxyZWFkeSBhIE5hbWVkVGVuc29yTWFwLlxuICAgICAgcmV0dXJuIGlucHV0cztcbiAgICB9XG4gICAgaW5wdXRzID0gQXJyYXkuaXNBcnJheShpbnB1dHMpID8gaW5wdXRzIDogW2lucHV0c107XG4gICAgaWYgKGlucHV0cy5sZW5ndGggIT09IHRoaXMuaW5wdXROb2Rlcy5sZW5ndGgpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcihcbiAgICAgICAgICAnSW5wdXQgdGVuc29yIGNvdW50IG1pc21hdGNoLCcgK1xuICAgICAgICAgIGB0aGUgZ3JhcGggbW9kZWwgaGFzICR7dGhpcy5pbnB1dE5vZGVzLmxlbmd0aH0gcGxhY2Vob2xkZXJzLCBgICtcbiAgICAgICAgICBgd2hpbGUgdGhlcmUgYXJlICR7aW5wdXRzLmxlbmd0aH0gaW5wdXQgdGVuc29ycy5gKTtcbiAgICB9XG4gICAgcmV0dXJuIHRoaXMuaW5wdXROb2Rlcy5yZWR1Y2UoKG1hcCwgaW5wdXROYW1lLCBpKSA9PiB7XG4gICAgICBtYXBbaW5wdXROYW1lXSA9IChpbnB1dHMgYXMgVGVuc29yW10pW2ldO1xuICAgICAgcmV0dXJuIG1hcDtcbiAgICB9LCB7fSBhcyBOYW1lZFRlbnNvck1hcCk7XG4gIH1cblxuICBwcml2YXRlIG5vcm1hbGl6ZU91dHB1dHMob3V0cHV0czogc3RyaW5nfHN0cmluZ1tdKTogc3RyaW5nW10ge1xuICAgIG91dHB1dHMgPSBvdXRwdXRzIHx8IHRoaXMub3V0cHV0Tm9kZXM7XG4gICAgcmV0dXJuICFBcnJheS5pc0FycmF5KG91dHB1dHMpID8gW291dHB1dHNdIDogb3V0cHV0cztcbiAgfVxuXG4gIC8qKlxuICAgKiBFeGVjdXRlcyBpbmZlcmVuY2UgZm9yIHRoZSBtb2RlbCBmb3IgZ2l2ZW4gaW5wdXQgdGVuc29ycy5cbiAgICogQHBhcmFtIGlucHV0cyB0ZW5zb3IsIHRlbnNvciBhcnJheSBvciB0ZW5zb3IgbWFwIG9mIHRoZSBpbnB1dHMgZm9yIHRoZVxuICAgKiBtb2RlbCwga2V5ZWQgYnkgdGhlIGlucHV0IG5vZGUgbmFtZXMuXG4gICAqIEBwYXJhbSBvdXRwdXRzIG91dHB1dCBub2RlIG5hbWUgZnJvbSB0aGUgVGVuc29yRmxvdyBtb2RlbCwgaWYgbm9cbiAgICogb3V0cHV0cyBhcmUgc3BlY2lmaWVkLCB0aGUgZGVmYXVsdCBvdXRwdXRzIG9mIHRoZSBtb2RlbCB3b3VsZCBiZSB1c2VkLlxuICAgKiBZb3UgY2FuIGluc3BlY3QgaW50ZXJtZWRpYXRlIG5vZGVzIG9mIHRoZSBtb2RlbCBieSBhZGRpbmcgdGhlbSB0byB0aGVcbiAgICogb3V0cHV0cyBhcnJheS5cbiAgICpcbiAgICogQHJldHVybnMgQSBzaW5nbGUgdGVuc29yIGlmIHByb3ZpZGVkIHdpdGggYSBzaW5nbGUgb3V0cHV0IG9yIG5vIG91dHB1dHNcbiAgICogYXJlIHByb3ZpZGVkIGFuZCB0aGVyZSBpcyBvbmx5IG9uZSBkZWZhdWx0IG91dHB1dCwgb3RoZXJ3aXNlIHJldHVybiBhXG4gICAqIHRlbnNvciBhcnJheS4gVGhlIG9yZGVyIG9mIHRoZSB0ZW5zb3IgYXJyYXkgaXMgdGhlIHNhbWUgYXMgdGhlIG91dHB1dHNcbiAgICogaWYgcHJvdmlkZWQsIG90aGVyd2lzZSB0aGUgb3JkZXIgb2Ygb3V0cHV0Tm9kZXMgYXR0cmlidXRlIG9mIHRoZSBtb2RlbC5cbiAgICpcbiAgICogQGRvYyB7aGVhZGluZzogJ01vZGVscycsIHN1YmhlYWRpbmc6ICdDbGFzc2VzJ31cbiAgICovXG4gIGV4ZWN1dGUoaW5wdXRzOiBUZW5zb3J8VGVuc29yW118TmFtZWRUZW5zb3JNYXAsIG91dHB1dHM/OiBzdHJpbmd8c3RyaW5nW10pOlxuICAgICAgVGVuc29yfFRlbnNvcltdIHtcbiAgICBpbnB1dHMgPSB0aGlzLm5vcm1hbGl6ZUlucHV0cyhpbnB1dHMpO1xuICAgIG91dHB1dHMgPSB0aGlzLm5vcm1hbGl6ZU91dHB1dHMob3V0cHV0cyk7XG4gICAgY29uc3QgcmVzdWx0ID0gdGhpcy5leGVjdXRvci5leGVjdXRlKGlucHV0cywgb3V0cHV0cyk7XG4gICAgcmV0dXJuIHJlc3VsdC5sZW5ndGggPiAxID8gcmVzdWx0IDogcmVzdWx0WzBdO1xuICB9XG4gIC8qKlxuICAgKiBFeGVjdXRlcyBpbmZlcmVuY2UgZm9yIHRoZSBtb2RlbCBmb3IgZ2l2ZW4gaW5wdXQgdGVuc29ycyBpbiBhc3luY1xuICAgKiBmYXNoaW9uLCB1c2UgdGhpcyBtZXRob2Qgd2hlbiB5b3VyIG1vZGVsIGNvbnRhaW5zIGNvbnRyb2wgZmxvdyBvcHMuXG4gICAqIEBwYXJhbSBpbnB1dHMgdGVuc29yLCB0ZW5zb3IgYXJyYXkgb3IgdGVuc29yIG1hcCBvZiB0aGUgaW5wdXRzIGZvciB0aGVcbiAgICogbW9kZWwsIGtleWVkIGJ5IHRoZSBpbnB1dCBub2RlIG5hbWVzLlxuICAgKiBAcGFyYW0gb3V0cHV0cyBvdXRwdXQgbm9kZSBuYW1lIGZyb20gdGhlIFRlbnNvckZsb3cgbW9kZWwsIGlmIG5vIG91dHB1dHNcbiAgICogYXJlIHNwZWNpZmllZCwgdGhlIGRlZmF1bHQgb3V0cHV0cyBvZiB0aGUgbW9kZWwgd291bGQgYmUgdXNlZC4gWW91IGNhblxuICAgKiBpbnNwZWN0IGludGVybWVkaWF0ZSBub2RlcyBvZiB0aGUgbW9kZWwgYnkgYWRkaW5nIHRoZW0gdG8gdGhlIG91dHB1dHNcbiAgICogYXJyYXkuXG4gICAqXG4gICAqIEByZXR1cm5zIEEgUHJvbWlzZSBvZiBzaW5nbGUgdGVuc29yIGlmIHByb3ZpZGVkIHdpdGggYSBzaW5nbGUgb3V0cHV0IG9yXG4gICAqIG5vIG91dHB1dHMgYXJlIHByb3ZpZGVkIGFuZCB0aGVyZSBpcyBvbmx5IG9uZSBkZWZhdWx0IG91dHB1dCwgb3RoZXJ3aXNlXG4gICAqIHJldHVybiBhIHRlbnNvciBtYXAuXG4gICAqXG4gICAqIEBkb2Mge2hlYWRpbmc6ICdNb2RlbHMnLCBzdWJoZWFkaW5nOiAnQ2xhc3Nlcyd9XG4gICAqL1xuICBhc3luYyBleGVjdXRlQXN5bmMoXG4gICAgICBpbnB1dHM6IFRlbnNvcnxUZW5zb3JbXXxOYW1lZFRlbnNvck1hcCxcbiAgICAgIG91dHB1dHM/OiBzdHJpbmd8c3RyaW5nW10pOiBQcm9taXNlPFRlbnNvcnxUZW5zb3JbXT4ge1xuICAgIGlucHV0cyA9IHRoaXMubm9ybWFsaXplSW5wdXRzKGlucHV0cyk7XG4gICAgb3V0cHV0cyA9IHRoaXMubm9ybWFsaXplT3V0cHV0cyhvdXRwdXRzKTtcbiAgICBjb25zdCByZXN1bHQgPSBhd2FpdCB0aGlzLmV4ZWN1dG9yLmV4ZWN1dGVBc3luYyhpbnB1dHMsIG91dHB1dHMpO1xuICAgIHJldHVybiByZXN1bHQubGVuZ3RoID4gMSA/IHJlc3VsdCA6IHJlc3VsdFswXTtcbiAgfVxuXG4gIC8qKlxuICAgKiBHZXQgaW50ZXJtZWRpYXRlIHRlbnNvcnMgZm9yIG1vZGVsIGRlYnVnZ2luZyBtb2RlIChmbGFnXG4gICAqIEtFRVBfSU5URVJNRURJQVRFX1RFTlNPUlMgaXMgdHJ1ZSkuXG4gICAqXG4gICAqIEBkb2Mge2hlYWRpbmc6ICdNb2RlbHMnLCBzdWJoZWFkaW5nOiAnQ2xhc3Nlcyd9XG4gICAqL1xuICBnZXRJbnRlcm1lZGlhdGVUZW5zb3JzKCk6IE5hbWVkVGVuc29yc01hcCB7XG4gICAgcmV0dXJuIHRoaXMuZXhlY3V0b3IuZ2V0SW50ZXJtZWRpYXRlVGVuc29ycygpO1xuICB9XG5cbiAgLyoqXG4gICAqIERpc3Bvc2UgaW50ZXJtZWRpYXRlIHRlbnNvcnMgZm9yIG1vZGVsIGRlYnVnZ2luZyBtb2RlIChmbGFnXG4gICAqIEtFRVBfSU5URVJNRURJQVRFX1RFTlNPUlMgaXMgdHJ1ZSkuXG4gICAqXG4gICAqIEBkb2Mge2hlYWRpbmc6ICdNb2RlbHMnLCBzdWJoZWFkaW5nOiAnQ2xhc3Nlcyd9XG4gICAqL1xuICBkaXNwb3NlSW50ZXJtZWRpYXRlVGVuc29ycygpIHtcbiAgICB0aGlzLmV4ZWN1dG9yLmRpc3Bvc2VJbnRlcm1lZGlhdGVUZW5zb3JzKCk7XG4gIH1cblxuICBwcml2YXRlIGNvbnZlcnRUZW5zb3JNYXBUb1RlbnNvcnNNYXAobWFwOiBOYW1lZFRlbnNvck1hcCk6IE5hbWVkVGVuc29yc01hcCB7XG4gICAgcmV0dXJuIE9iamVjdC5rZXlzKG1hcCkucmVkdWNlKChuZXdNYXA6IE5hbWVkVGVuc29yc01hcCwga2V5KSA9PiB7XG4gICAgICBuZXdNYXBba2V5XSA9IFttYXBba2V5XV07XG4gICAgICByZXR1cm4gbmV3TWFwO1xuICAgIH0sIHt9KTtcbiAgfVxuXG4gIC8qKlxuICAgKiBSZWxlYXNlcyB0aGUgbWVtb3J5IHVzZWQgYnkgdGhlIHdlaWdodCB0ZW5zb3JzIGFuZCByZXNvdXJjZU1hbmFnZXIuXG4gICAqXG4gICAqIEBkb2Mge2hlYWRpbmc6ICdNb2RlbHMnLCBzdWJoZWFkaW5nOiAnQ2xhc3Nlcyd9XG4gICAqL1xuICBkaXNwb3NlKCkge1xuICAgIHRoaXMuZXhlY3V0b3IuZGlzcG9zZSgpO1xuXG4gICAgaWYgKHRoaXMuaW5pdGlhbGl6ZXIpIHtcbiAgICAgIHRoaXMuaW5pdGlhbGl6ZXIuZGlzcG9zZSgpO1xuICAgIH1cblxuICAgIHRoaXMucmVzb3VyY2VNYW5hZ2VyLmRpc3Bvc2UoKTtcbiAgfVxufVxuXG4vKipcbiAqIExvYWQgYSBncmFwaCBtb2RlbCBnaXZlbiBhIFVSTCB0byB0aGUgbW9kZWwgZGVmaW5pdGlvbi5cbiAqXG4gKiBFeGFtcGxlIG9mIGxvYWRpbmcgTW9iaWxlTmV0VjIgZnJvbSBhIFVSTCBhbmQgbWFraW5nIGEgcHJlZGljdGlvbiB3aXRoIGFcbiAqIHplcm9zIGlucHV0OlxuICpcbiAqIGBgYGpzXG4gKiBjb25zdCBtb2RlbFVybCA9XG4gKiAgICAnaHR0cHM6Ly9zdG9yYWdlLmdvb2dsZWFwaXMuY29tL3RmanMtbW9kZWxzL3NhdmVkbW9kZWwvbW9iaWxlbmV0X3YyXzEuMF8yMjQvbW9kZWwuanNvbic7XG4gKiBjb25zdCBtb2RlbCA9IGF3YWl0IHRmLmxvYWRHcmFwaE1vZGVsKG1vZGVsVXJsKTtcbiAqIGNvbnN0IHplcm9zID0gdGYuemVyb3MoWzEsIDIyNCwgMjI0LCAzXSk7XG4gKiBtb2RlbC5wcmVkaWN0KHplcm9zKS5wcmludCgpO1xuICogYGBgXG4gKlxuICogRXhhbXBsZSBvZiBsb2FkaW5nIE1vYmlsZU5ldFYyIGZyb20gYSBURiBIdWIgVVJMIGFuZCBtYWtpbmcgYSBwcmVkaWN0aW9uXG4gKiB3aXRoIGEgemVyb3MgaW5wdXQ6XG4gKlxuICogYGBganNcbiAqIGNvbnN0IG1vZGVsVXJsID1cbiAqICAgICdodHRwczovL3RmaHViLmRldi9nb29nbGUvaW1hZ2VuZXQvbW9iaWxlbmV0X3YyXzE0MF8yMjQvY2xhc3NpZmljYXRpb24vMic7XG4gKiBjb25zdCBtb2RlbCA9IGF3YWl0IHRmLmxvYWRHcmFwaE1vZGVsKG1vZGVsVXJsLCB7ZnJvbVRGSHViOiB0cnVlfSk7XG4gKiBjb25zdCB6ZXJvcyA9IHRmLnplcm9zKFsxLCAyMjQsIDIyNCwgM10pO1xuICogbW9kZWwucHJlZGljdCh6ZXJvcykucHJpbnQoKTtcbiAqIGBgYFxuICogQHBhcmFtIG1vZGVsVXJsIFRoZSB1cmwgb3IgYW4gYGlvLklPSGFuZGxlcmAgdGhhdCBsb2FkcyB0aGUgbW9kZWwuXG4gKiBAcGFyYW0gb3B0aW9ucyBPcHRpb25zIGZvciB0aGUgSFRUUCByZXF1ZXN0LCB3aGljaCBhbGxvd3MgdG8gc2VuZFxuICogICAgIGNyZWRlbnRpYWxzXG4gKiAgICBhbmQgY3VzdG9tIGhlYWRlcnMuXG4gKlxuICogQGRvYyB7aGVhZGluZzogJ01vZGVscycsIHN1YmhlYWRpbmc6ICdMb2FkaW5nJ31cbiAqL1xuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIGxvYWRHcmFwaE1vZGVsKFxuICAgIG1vZGVsVXJsOiBzdHJpbmd8aW8uSU9IYW5kbGVyLCBvcHRpb25zOiBpby5Mb2FkT3B0aW9ucyA9IHt9LFxuICAgIHRmaW8gPSBpbyk6IFByb21pc2U8R3JhcGhNb2RlbD4ge1xuICBpZiAobW9kZWxVcmwgPT0gbnVsbCkge1xuICAgIHRocm93IG5ldyBFcnJvcihcbiAgICAgICAgJ21vZGVsVXJsIGluIGxvYWRHcmFwaE1vZGVsKCkgY2Fubm90IGJlIG51bGwuIFBsZWFzZSBwcm92aWRlIGEgdXJsICcgK1xuICAgICAgICAnb3IgYW4gSU9IYW5kbGVyIHRoYXQgbG9hZHMgdGhlIG1vZGVsJyk7XG4gIH1cbiAgaWYgKG9wdGlvbnMgPT0gbnVsbCkge1xuICAgIG9wdGlvbnMgPSB7fTtcbiAgfVxuXG4gIGlmIChvcHRpb25zLmZyb21URkh1YiAmJiB0eXBlb2YgbW9kZWxVcmwgPT09ICdzdHJpbmcnKSB7XG4gICAgbW9kZWxVcmwgPSBnZXRURkh1YlVybChtb2RlbFVybCk7XG4gIH1cbiAgY29uc3QgbW9kZWwgPSBuZXcgR3JhcGhNb2RlbChtb2RlbFVybCwgb3B0aW9ucywgdGZpbyk7XG4gIGF3YWl0IG1vZGVsLmxvYWQoKTtcbiAgcmV0dXJuIG1vZGVsO1xufVxuXG4vKipcbiAqIExvYWQgYSBncmFwaCBtb2RlbCBnaXZlbiBhIHN5bmNocm9ub3VzIElPIGhhbmRsZXIgd2l0aCBhICdsb2FkJyBtZXRob2QuXG4gKlxuICogQHBhcmFtIG1vZGVsU291cmNlIFRoZSBgaW8uSU9IYW5kbGVyU3luY2AgdGhhdCBsb2FkcyB0aGUgbW9kZWwsIG9yIHRoZVxuICogICAgIGBpby5Nb2RlbEFydGlmYWN0c2AgdGhhdCBlbmNvZGUgdGhlIG1vZGVsLCBvciBhIHR1cGxlIG9mXG4gKiAgICAgYFtpby5Nb2RlbEpTT04sIEFycmF5QnVmZmVyXWAgb2Ygd2hpY2ggdGhlIGZpcnN0IGVsZW1lbnQgZW5jb2RlcyB0aGVcbiAqICAgICAgbW9kZWwgYW5kIHRoZSBzZWNvbmQgY29udGFpbnMgdGhlIHdlaWdodHMuXG4gKlxuICogQGRvYyB7aGVhZGluZzogJ01vZGVscycsIHN1YmhlYWRpbmc6ICdMb2FkaW5nJ31cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGxvYWRHcmFwaE1vZGVsU3luYyhtb2RlbFNvdXJjZTogaW8uSU9IYW5kbGVyU3luY1xuICB8IGlvLk1vZGVsQXJ0aWZhY3RzIHwgW2lvLk1vZGVsSlNPTiwgLyogV2VpZ2h0cyAqLyBBcnJheUJ1ZmZlcl0pOlxuICBHcmFwaE1vZGVsPGlvLklPSGFuZGxlclN5bmM+IHtcblxuICBpZiAobW9kZWxTb3VyY2UgPT0gbnVsbCkge1xuICAgIHRocm93IG5ldyBFcnJvcihcbiAgICAgICAgJ21vZGVsVXJsIGluIGxvYWRHcmFwaE1vZGVsU3luYygpIGNhbm5vdCBiZSBudWxsLiBQbGVhc2UgcHJvdmlkZSAnICtcbiAgICAgICAgJ21vZGVsIGFydGlmYWN0cyBvciBhbiBJT0hhbmRsZXIgdGhhdCBsb2FkcyB0aGUgbW9kZWwnKTtcbiAgfVxuXG4gIGxldCBpb0hhbmRsZXI6IGlvLklPSGFuZGxlclN5bmM7XG4gIGlmIChtb2RlbFNvdXJjZSBpbnN0YW5jZW9mIEFycmF5KSB7XG4gICAgY29uc3QgW21vZGVsSlNPTiwgd2VpZ2h0c10gPSBtb2RlbFNvdXJjZTtcbiAgICBpZiAoIW1vZGVsSlNPTikge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKCdtb2RlbEpTT04gbXVzdCBiZSB0aGUgZmlyc3QgZWxlbWVudCBvZiB0aGUgYXJyYXknKTtcbiAgICB9XG4gICAgaWYgKCF3ZWlnaHRzIHx8ICEod2VpZ2h0cyBpbnN0YW5jZW9mIEFycmF5QnVmZmVyKSkge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKCdBbiBBcnJheUJ1ZmZlciBvZiB3ZWlnaHRzIG11c3QgYmUgdGhlIHNlY29uZCBlbGVtZW50IG9mJ1xuICAgICAgICAgICAgICAgICAgICAgICsgJyB0aGUgYXJyYXknKTtcbiAgICB9XG4gICAgaWYgKCEoJ21vZGVsVG9wb2xvZ3knIGluIG1vZGVsSlNPTikpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcignTW9kZWwgSlNPTiBpcyBtaXNzaW5nIFxcJ21vZGVsVG9wb2xvZ3lcXCcnKTtcbiAgICB9XG4gICAgaWYgKCEoJ3dlaWdodHNNYW5pZmVzdCcgaW4gbW9kZWxKU09OKSkge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKCdNb2RlbCBKU09OIGlzIG1pc3NpbmcgXFwnd2VpZ2h0c01hbmlmZXN0XFwnJyk7XG4gICAgfVxuXG4gICAgY29uc3Qgd2VpZ2h0U3BlY3MgPSBpby5nZXRXZWlnaHRTcGVjcyhtb2RlbEpTT04ud2VpZ2h0c01hbmlmZXN0KTtcbiAgICBjb25zdCBtb2RlbEFydGlmYWN0cyA9IGlvLmdldE1vZGVsQXJ0aWZhY3RzRm9ySlNPTlN5bmMobW9kZWxKU09OLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB3ZWlnaHRTcGVjcyxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgd2VpZ2h0cyk7XG4gICAgaW9IYW5kbGVyID0gaW8uZnJvbU1lbW9yeVN5bmMobW9kZWxBcnRpZmFjdHMpO1xuICB9IGVsc2UgaWYgKCdsb2FkJyBpbiBtb2RlbFNvdXJjZSkge1xuICAgIC8vIFRoZW4gbW9kZWxTb3VyY2UgaXMgYWxyZWFkeSBhbiBJT0hhbmRsZXJTeW5jLlxuICAgIGlvSGFuZGxlciA9IG1vZGVsU291cmNlO1xuICB9IGVsc2UgaWYgKCdtb2RlbFRvcG9sb2d5JyBpbiBtb2RlbFNvdXJjZSAmJiAnd2VpZ2h0U3BlY3MnIGluIG1vZGVsU291cmNlXG4gICAgICAmJiAnd2VpZ2h0RGF0YScgaW4gbW9kZWxTb3VyY2UpIHtcbiAgICAvLyBtb2RlbFNvdXJjZSBpcyBvZiB0eXBlIE1vZGVsQXJ0aWZhY3RzLlxuICAgIGlvSGFuZGxlciA9IGlvLmZyb21NZW1vcnlTeW5jKG1vZGVsU291cmNlKTtcbiAgfSBlbHNlIHtcbiAgICB0aHJvdyBuZXcgRXJyb3IoJ1Vua25vd24gbW9kZWwgZm9ybWF0Jyk7XG4gIH1cblxuICBjb25zdCBtb2RlbCA9IG5ldyBHcmFwaE1vZGVsKGlvSGFuZGxlcik7XG4gIG1vZGVsLmxvYWQoKTtcbiAgcmV0dXJuIG1vZGVsO1xufVxuXG5mdW5jdGlvbiBnZXRURkh1YlVybChtb2RlbFVybDogc3RyaW5nKTogc3RyaW5nIHtcbiAgaWYgKCFtb2RlbFVybC5lbmRzV2l0aCgnLycpKSB7XG4gICAgbW9kZWxVcmwgPSAobW9kZWxVcmwpICsgJy8nO1xuICB9XG4gIHJldHVybiBgJHttb2RlbFVybH0ke0RFRkFVTFRfTU9ERUxfTkFNRX0ke1RGSFVCX1NFQVJDSF9QQVJBTX1gO1xufVxuIl19","/** @license See the LICENSE file. */\n// This code is auto-generated, do not modify this file!\nconst version = '3.21.0';\nexport { version };\n//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidmVyc2lvbi5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uL3RmanMtY29udmVydGVyL3NyYy92ZXJzaW9uLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLHFDQUFxQztBQUVyQyx3REFBd0Q7QUFDeEQsTUFBTSxPQUFPLEdBQUcsUUFBUSxDQUFDO0FBQ3pCLE9BQU8sRUFBQyxPQUFPLEVBQUMsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbIi8qKiBAbGljZW5zZSBTZWUgdGhlIExJQ0VOU0UgZmlsZS4gKi9cblxuLy8gVGhpcyBjb2RlIGlzIGF1dG8tZ2VuZXJhdGVkLCBkbyBub3QgbW9kaWZ5IHRoaXMgZmlsZSFcbmNvbnN0IHZlcnNpb24gPSAnMy4yMS4wJztcbmV4cG9ydCB7dmVyc2lvbn07XG4iXX0=","/**\n * @license\n * Copyright 2020 Google LLC. All Rights Reserved.\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n * =============================================================================\n */\nexport const EPSILON_FLOAT32 = 1e-7;\nexport const EPSILON_FLOAT16 = 1e-4;\n/** Convenient class for storing tensor-related data. */\nexport class DataStorage {\n constructor(backend, dataMover) {\n this.backend = backend;\n this.dataMover = dataMover;\n this.data = new WeakMap();\n this.dataIdsCount = 0;\n }\n get(dataId) {\n if (!this.data.has(dataId)) {\n this.dataMover.moveData(this.backend, dataId);\n }\n return this.data.get(dataId);\n }\n set(dataId, value) {\n this.dataIdsCount++;\n this.data.set(dataId, value);\n }\n has(dataId) {\n return this.data.has(dataId);\n }\n delete(dataId) {\n this.dataIdsCount--;\n return this.data.delete(dataId);\n }\n numDataIds() {\n return this.dataIdsCount;\n }\n}\n/**\n * The interface that defines the kernels that should be implemented when\n * adding a new backend. New backends don't need to implement every one of the\n * methods, this can be done gradually (throw an error for unimplemented\n * methods).\n */\nexport class KernelBackend {\n refCount(dataId) {\n return notYetImplemented('refCount');\n }\n incRef(dataId) {\n return notYetImplemented('incRef');\n }\n timerAvailable() {\n return true;\n }\n time(f) {\n return notYetImplemented('time');\n }\n read(dataId) {\n return notYetImplemented('read');\n }\n readSync(dataId) {\n return notYetImplemented('readSync');\n }\n readToGPU(dataId, options) {\n return notYetImplemented('readToGPU');\n }\n numDataIds() {\n return notYetImplemented('numDataIds');\n }\n disposeData(dataId, force) {\n return notYetImplemented('disposeData');\n }\n write(values, shape, dtype) {\n return notYetImplemented('write');\n }\n move(dataId, values, shape, dtype, refCount) {\n return notYetImplemented('move');\n }\n memory() {\n return notYetImplemented('memory');\n }\n /** Returns the highest precision for floats in bits (e.g. 16 or 32) */\n floatPrecision() {\n return notYetImplemented('floatPrecision');\n }\n /** Returns the smallest representable number. */\n epsilon() {\n return this.floatPrecision() === 32 ? EPSILON_FLOAT32 : EPSILON_FLOAT16;\n }\n dispose() {\n return notYetImplemented('dispose');\n }\n}\nfunction notYetImplemented(kernelName) {\n throw new Error(`'${kernelName}' not yet implemented or not found in the registry. ` +\n `This kernel may not be supported by the tfjs backend you have chosen`);\n}\n//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYmFja2VuZC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uLy4uL3RmanMtY29yZS9zcmMvYmFja2VuZHMvYmFja2VuZC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQTs7Ozs7Ozs7Ozs7Ozs7O0dBZUc7QUFLSCxNQUFNLENBQUMsTUFBTSxlQUFlLEdBQUcsSUFBSSxDQUFDO0FBQ3BDLE1BQU0sQ0FBQyxNQUFNLGVBQWUsR0FBRyxJQUFJLENBQUM7QUF1QnBDLHdEQUF3RDtBQUN4RCxNQUFNLE9BQU8sV0FBVztJQUl0QixZQUFvQixPQUFzQixFQUFVLFNBQW9CO1FBQXBELFlBQU8sR0FBUCxPQUFPLENBQWU7UUFBVSxjQUFTLEdBQVQsU0FBUyxDQUFXO1FBSGhFLFNBQUksR0FBRyxJQUFJLE9BQU8sRUFBYSxDQUFDO1FBQ2hDLGlCQUFZLEdBQUcsQ0FBQyxDQUFDO0lBRWtELENBQUM7SUFFNUUsR0FBRyxDQUFDLE1BQWM7UUFDaEIsSUFBSSxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsR0FBRyxDQUFDLE1BQU0sQ0FBQyxFQUFFO1lBQzFCLElBQUksQ0FBQyxTQUFTLENBQUMsUUFBUSxDQUFDLElBQUksQ0FBQyxPQUFPLEVBQUUsTUFBTSxDQUFDLENBQUM7U0FDL0M7UUFDRCxPQUFPLElBQUksQ0FBQyxJQUFJLENBQUMsR0FBRyxDQUFDLE1BQU0sQ0FBQyxDQUFDO0lBQy9CLENBQUM7SUFFRCxHQUFHLENBQUMsTUFBYyxFQUFFLEtBQVE7UUFDMUIsSUFBSSxDQUFDLFlBQVksRUFBRSxDQUFDO1FBQ3BCLElBQUksQ0FBQyxJQUFJLENBQUMsR0FBRyxDQUFDLE1BQU0sRUFBRSxLQUFLLENBQUMsQ0FBQztJQUMvQixDQUFDO0lBRUQsR0FBRyxDQUFDLE1BQWM7UUFDaEIsT0FBTyxJQUFJLENBQUMsSUFBSSxDQUFDLEdBQUcsQ0FBQyxNQUFNLENBQUMsQ0FBQztJQUMvQixDQUFDO0lBRUQsTUFBTSxDQUFDLE1BQWM7UUFDbkIsSUFBSSxDQUFDLFlBQVksRUFBRSxDQUFDO1FBQ3BCLE9BQU8sSUFBSSxDQUFDLElBQUksQ0FBQyxNQUFNLENBQUMsTUFBTSxDQUFDLENBQUM7SUFDbEMsQ0FBQztJQUVELFVBQVU7UUFDUixPQUFPLElBQUksQ0FBQyxZQUFZLENBQUM7SUFDM0IsQ0FBQztDQUNGO0FBaUJEOzs7OztHQUtHO0FBQ0gsTUFBTSxPQUFPLGFBQWE7SUFDeEIsUUFBUSxDQUFDLE1BQWM7UUFDckIsT0FBTyxpQkFBaUIsQ0FBQyxVQUFVLENBQUMsQ0FBQztJQUN2QyxDQUFDO0lBQ0QsTUFBTSxDQUFDLE1BQWM7UUFDbkIsT0FBTyxpQkFBaUIsQ0FBQyxRQUFRLENBQUMsQ0FBQztJQUNyQyxDQUFDO0lBQ0QsY0FBYztRQUNaLE9BQU8sSUFBSSxDQUFDO0lBQ2QsQ0FBQztJQUNELElBQUksQ0FBQyxDQUFhO1FBQ2hCLE9BQU8saUJBQWlCLENBQUMsTUFBTSxDQUFDLENBQUM7SUFDbkMsQ0FBQztJQUNELElBQUksQ0FBQyxNQUFjO1FBQ2pCLE9BQU8saUJBQWlCLENBQUMsTUFBTSxDQUFDLENBQUM7SUFDbkMsQ0FBQztJQUNELFFBQVEsQ0FBQyxNQUFjO1FBQ3JCLE9BQU8saUJBQWlCLENBQUMsVUFBVSxDQUFDLENBQUM7SUFDdkMsQ0FBQztJQUNELFNBQVMsQ0FBQyxNQUFjLEVBQUUsT0FBMEI7UUFDbEQsT0FBTyxpQkFBaUIsQ0FBQyxXQUFXLENBQUMsQ0FBQztJQUN4QyxDQUFDO0lBQ0QsVUFBVTtRQUNSLE9BQU8saUJBQWlCLENBQUMsWUFBWSxDQUFDLENBQUM7SUFDekMsQ0FBQztJQUNELFdBQVcsQ0FBQyxNQUFjLEVBQUUsS0FBZTtRQUN6QyxPQUFPLGlCQUFpQixDQUFDLGFBQWEsQ0FBQyxDQUFDO0lBQzFDLENBQUM7SUFDRCxLQUFLLENBQUMsTUFBcUIsRUFBRSxLQUFlLEVBQUUsS0FBZTtRQUMzRCxPQUFPLGlCQUFpQixDQUFDLE9BQU8sQ0FBQyxDQUFDO0lBQ3BDLENBQUM7SUFDRCxJQUFJLENBQ0EsTUFBYyxFQUFFLE1BQXFCLEVBQUUsS0FBZSxFQUFFLEtBQWUsRUFDdkUsUUFBZ0I7UUFDbEIsT0FBTyxpQkFBaUIsQ0FBQyxNQUFNLENBQUMsQ0FBQztJQUNuQyxDQUFDO0lBQ0QsTUFBTTtRQUNKLE9BQU8saUJBQWlCLENBQUMsUUFBUSxDQUFDLENBQUM7SUFDckMsQ0FBQztJQUNELHVFQUF1RTtJQUN2RSxjQUFjO1FBQ1osT0FBTyxpQkFBaUIsQ0FBQyxnQkFBZ0IsQ0FBQyxDQUFDO0lBQzdDLENBQUM7SUFDRCxrREFBa0Q7SUFDbEQsT0FBTztRQUNMLE9BQU8sSUFBSSxDQUFDLGNBQWMsRUFBRSxLQUFLLEVBQUUsQ0FBQyxDQUFDLENBQUMsZUFBZSxDQUFDLENBQUMsQ0FBQyxlQUFlLENBQUM7SUFDMUUsQ0FBQztJQUNELE9BQU87UUFDTCxPQUFPLGlCQUFpQixDQUFDLFNBQVMsQ0FBQyxDQUFDO0lBQ3RDLENBQUM7Q0FDRjtBQUVELFNBQVMsaUJBQWlCLENBQUMsVUFBa0I7SUFDM0MsTUFBTSxJQUFJLEtBQUssQ0FDWCxJQUFJLFVBQVUsc0RBQXNEO1FBQ3BFLHNFQUFzRSxDQUFDLENBQUM7QUFDOUUsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbIi8qKlxuICogQGxpY2Vuc2VcbiAqIENvcHlyaWdodCAyMDIwIEdvb2dsZSBMTEMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuXG4gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgXCJMaWNlbnNlXCIpO1xuICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLlxuICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0XG4gKlxuICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wXG4gKlxuICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZVxuICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gXCJBUyBJU1wiIEJBU0lTLFxuICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuXG4gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kXG4gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS5cbiAqID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4gKi9cblxuaW1wb3J0IHtCYWNrZW5kLCBEYXRhSWQsIERhdGFUb0dQVU9wdGlvbnMsIEdQVURhdGF9IGZyb20gJy4uL3RlbnNvcic7XG5pbXBvcnQge0JhY2tlbmRWYWx1ZXMsIERhdGFUeXBlfSBmcm9tICcuLi90eXBlcyc7XG5cbmV4cG9ydCBjb25zdCBFUFNJTE9OX0ZMT0FUMzIgPSAxZS03O1xuZXhwb3J0IGNvbnN0IEVQU0lMT05fRkxPQVQxNiA9IDFlLTQ7XG5cbi8vIFJlcXVpcmVkIGluZm9ybWF0aW9uIGZvciBhbGwgYmFja2VuZHMuXG5leHBvcnQgaW50ZXJmYWNlIEJhY2tlbmRUaW1pbmdJbmZvIHtcbiAga2VybmVsTXM6IG51bWJlcnx7ZXJyb3I6IHN0cmluZ307XG4gIGdldEV4dHJhUHJvZmlsZUluZm8/KCk6IHN0cmluZzsgIC8vIGEgZmllbGQgZm9yIGFkZGl0aW9uYWwgdGltaW5nIGluZm9ybWF0aW9uXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGUuZy4gcGFja2luZyAvIHVucGFja2luZyBmb3IgV2ViR0wgYmFja2VuZFxufVxuXG5leHBvcnQgaW50ZXJmYWNlIFRlbnNvclN0b3JhZ2Uge1xuICByZWFkKGRhdGFJZDogRGF0YUlkKTogUHJvbWlzZTxCYWNrZW5kVmFsdWVzPjtcbiAgcmVhZFN5bmMoZGF0YUlkOiBEYXRhSWQpOiBCYWNrZW5kVmFsdWVzO1xuICBkaXNwb3NlRGF0YShkYXRhSWQ6IERhdGFJZCwgZm9yY2U/OiBib29sZWFuKTogYm9vbGVhbjtcbiAgd3JpdGUodmFsdWVzOiBCYWNrZW5kVmFsdWVzLCBzaGFwZTogbnVtYmVyW10sIGR0eXBlOiBEYXRhVHlwZSk6IERhdGFJZDtcbiAgbW92ZShcbiAgICAgIGRhdGFJZDogRGF0YUlkLCB2YWx1ZXM6IEJhY2tlbmRWYWx1ZXMsIHNoYXBlOiBudW1iZXJbXSwgZHR5cGU6IERhdGFUeXBlLFxuICAgICAgcmVmQ291bnQ6IG51bWJlcik6IHZvaWQ7XG4gIG1lbW9yeSgpOiB7dW5yZWxpYWJsZTogYm9vbGVhbjt9OyAgLy8gQmFja2VuZC1zcGVjaWZpYyBpbmZvcm1hdGlvbi5cbiAgLyoqIFJldHVybnMgbnVtYmVyIG9mIGRhdGEgaWRzIGN1cnJlbnRseSBpbiB0aGUgc3RvcmFnZS4gKi9cbiAgbnVtRGF0YUlkcygpOiBudW1iZXI7XG4gIHJlZkNvdW50KGRhdGFJZDogRGF0YUlkKTogbnVtYmVyO1xufVxuXG4vKiogQ29udmVuaWVudCBjbGFzcyBmb3Igc3RvcmluZyB0ZW5zb3ItcmVsYXRlZCBkYXRhLiAqL1xuZXhwb3J0IGNsYXNzIERhdGFTdG9yYWdlPFQ+IHtcbiAgcHJpdmF0ZSBkYXRhID0gbmV3IFdlYWtNYXA8RGF0YUlkLCBUPigpO1xuICBwcml2YXRlIGRhdGFJZHNDb3VudCA9IDA7XG5cbiAgY29uc3RydWN0b3IocHJpdmF0ZSBiYWNrZW5kOiBLZXJuZWxCYWNrZW5kLCBwcml2YXRlIGRhdGFNb3ZlcjogRGF0YU1vdmVyKSB7fVxuXG4gIGdldChkYXRhSWQ6IERhdGFJZCkge1xuICAgIGlmICghdGhpcy5kYXRhLmhhcyhkYXRhSWQpKSB7XG4gICAgICB0aGlzLmRhdGFNb3Zlci5tb3ZlRGF0YSh0aGlzLmJhY2tlbmQsIGRhdGFJZCk7XG4gICAgfVxuICAgIHJldHVybiB0aGlzLmRhdGEuZ2V0KGRhdGFJZCk7XG4gIH1cblxuICBzZXQoZGF0YUlkOiBEYXRhSWQsIHZhbHVlOiBUKTogdm9pZCB7XG4gICAgdGhpcy5kYXRhSWRzQ291bnQrKztcbiAgICB0aGlzLmRhdGEuc2V0KGRhdGFJZCwgdmFsdWUpO1xuICB9XG5cbiAgaGFzKGRhdGFJZDogRGF0YUlkKTogYm9vbGVhbiB7XG4gICAgcmV0dXJuIHRoaXMuZGF0YS5oYXMoZGF0YUlkKTtcbiAgfVxuXG4gIGRlbGV0ZShkYXRhSWQ6IERhdGFJZCk6IGJvb2xlYW4ge1xuICAgIHRoaXMuZGF0YUlkc0NvdW50LS07XG4gICAgcmV0dXJuIHRoaXMuZGF0YS5kZWxldGUoZGF0YUlkKTtcbiAgfVxuXG4gIG51bURhdGFJZHMoKTogbnVtYmVyIHtcbiAgICByZXR1cm4gdGhpcy5kYXRhSWRzQ291bnQ7XG4gIH1cbn1cblxuZXhwb3J0IGludGVyZmFjZSBEYXRhTW92ZXIge1xuICAvKipcbiAgICogVG8gYmUgY2FsbGVkIGJ5IGJhY2tlbmRzIHdoZW5ldmVyIHRoZXkgc2VlIGEgZGF0YUlkIHRoYXQgdGhleSBkb24ndCBvd24uXG4gICAqIFVwb24gY2FsbGluZyB0aGlzIG1ldGhvZCwgdGhlIG1vdmVyIHdpbGwgZmV0Y2ggdGhlIHRlbnNvciBmcm9tIGFub3RoZXJcbiAgICogYmFja2VuZCBhbmQgcmVnaXN0ZXIgaXQgd2l0aCB0aGUgY3VycmVudCBhY3RpdmUgYmFja2VuZC5cbiAgICovXG4gIG1vdmVEYXRhKGJhY2tlbmQ6IEtlcm5lbEJhY2tlbmQsIGRhdGFJZDogRGF0YUlkKTogdm9pZDtcbn1cblxuZXhwb3J0IGludGVyZmFjZSBCYWNrZW5kVGltZXIge1xuICAvLyBjaGVjayBpZiBiYWNrZW5kIHRpbWVyIGlzIGF2YWlsYWJsZVxuICB0aW1lckF2YWlsYWJsZSgpOiBib29sZWFuO1xuICB0aW1lKGY6ICgpID0+IHZvaWQpOiBQcm9taXNlPEJhY2tlbmRUaW1pbmdJbmZvPjtcbn1cblxuLyoqXG4gKiBUaGUgaW50ZXJmYWNlIHRoYXQgZGVmaW5lcyB0aGUga2VybmVscyB0aGF0IHNob3VsZCBiZSBpbXBsZW1lbnRlZCB3aGVuXG4gKiBhZGRpbmcgYSBuZXcgYmFja2VuZC4gTmV3IGJhY2tlbmRzIGRvbid0IG5lZWQgdG8gaW1wbGVtZW50IGV2ZXJ5IG9uZSBvZiB0aGVcbiAqIG1ldGhvZHMsIHRoaXMgY2FuIGJlIGRvbmUgZ3JhZHVhbGx5ICh0aHJvdyBhbiBlcnJvciBmb3IgdW5pbXBsZW1lbnRlZFxuICogbWV0aG9kcykuXG4gKi9cbmV4cG9ydCBjbGFzcyBLZXJuZWxCYWNrZW5kIGltcGxlbWVudHMgVGVuc29yU3RvcmFnZSwgQmFja2VuZCwgQmFja2VuZFRpbWVyIHtcbiAgcmVmQ291bnQoZGF0YUlkOiBEYXRhSWQpOiBudW1iZXIge1xuICAgIHJldHVybiBub3RZZXRJbXBsZW1lbnRlZCgncmVmQ291bnQnKTtcbiAgfVxuICBpbmNSZWYoZGF0YUlkOiBEYXRhSWQpOiB2b2lkIHtcbiAgICByZXR1cm4gbm90WWV0SW1wbGVtZW50ZWQoJ2luY1JlZicpO1xuICB9XG4gIHRpbWVyQXZhaWxhYmxlKCk6IGJvb2xlYW4ge1xuICAgIHJldHVybiB0cnVlO1xuICB9XG4gIHRpbWUoZjogKCkgPT4gdm9pZCk6IFByb21pc2U8QmFja2VuZFRpbWluZ0luZm8+IHtcbiAgICByZXR1cm4gbm90WWV0SW1wbGVtZW50ZWQoJ3RpbWUnKTtcbiAgfVxuICByZWFkKGRhdGFJZDogb2JqZWN0KTogUHJvbWlzZTxCYWNrZW5kVmFsdWVzPiB7XG4gICAgcmV0dXJuIG5vdFlldEltcGxlbWVudGVkKCdyZWFkJyk7XG4gIH1cbiAgcmVhZFN5bmMoZGF0YUlkOiBvYmplY3QpOiBCYWNrZW5kVmFsdWVzIHtcbiAgICByZXR1cm4gbm90WWV0SW1wbGVtZW50ZWQoJ3JlYWRTeW5jJyk7XG4gIH1cbiAgcmVhZFRvR1BVKGRhdGFJZDogb2JqZWN0LCBvcHRpb25zPzogRGF0YVRvR1BVT3B0aW9ucyk6IEdQVURhdGEge1xuICAgIHJldHVybiBub3RZZXRJbXBsZW1lbnRlZCgncmVhZFRvR1BVJyk7XG4gIH1cbiAgbnVtRGF0YUlkcygpOiBudW1iZXIge1xuICAgIHJldHVybiBub3RZZXRJbXBsZW1lbnRlZCgnbnVtRGF0YUlkcycpO1xuICB9XG4gIGRpc3Bvc2VEYXRhKGRhdGFJZDogb2JqZWN0LCBmb3JjZT86IGJvb2xlYW4pOiBib29sZWFuIHtcbiAgICByZXR1cm4gbm90WWV0SW1wbGVtZW50ZWQoJ2Rpc3Bvc2VEYXRhJyk7XG4gIH1cbiAgd3JpdGUodmFsdWVzOiBCYWNrZW5kVmFsdWVzLCBzaGFwZTogbnVtYmVyW10sIGR0eXBlOiBEYXRhVHlwZSk6IERhdGFJZCB7XG4gICAgcmV0dXJuIG5vdFlldEltcGxlbWVudGVkKCd3cml0ZScpO1xuICB9XG4gIG1vdmUoXG4gICAgICBkYXRhSWQ6IERhdGFJZCwgdmFsdWVzOiBCYWNrZW5kVmFsdWVzLCBzaGFwZTogbnVtYmVyW10sIGR0eXBlOiBEYXRhVHlwZSxcbiAgICAgIHJlZkNvdW50OiBudW1iZXIpOiB2b2lkIHtcbiAgICByZXR1cm4gbm90WWV0SW1wbGVtZW50ZWQoJ21vdmUnKTtcbiAgfVxuICBtZW1vcnkoKToge3VucmVsaWFibGU6IGJvb2xlYW47IHJlYXNvbnM/OiBzdHJpbmdbXX0ge1xuICAgIHJldHVybiBub3RZZXRJbXBsZW1lbnRlZCgnbWVtb3J5Jyk7XG4gIH1cbiAgLyoqIFJldHVybnMgdGhlIGhpZ2hlc3QgcHJlY2lzaW9uIGZvciBmbG9hdHMgaW4gYml0cyAoZS5nLiAxNiBvciAzMikgKi9cbiAgZmxvYXRQcmVjaXNpb24oKTogMTZ8MzIge1xuICAgIHJldHVybiBub3RZZXRJbXBsZW1lbnRlZCgnZmxvYXRQcmVjaXNpb24nKTtcbiAgfVxuICAvKiogUmV0dXJucyB0aGUgc21hbGxlc3QgcmVwcmVzZW50YWJsZSBudW1iZXIuICAqL1xuICBlcHNpbG9uKCk6IG51bWJlciB7XG4gICAgcmV0dXJuIHRoaXMuZmxvYXRQcmVjaXNpb24oKSA9PT0gMzIgPyBFUFNJTE9OX0ZMT0FUMzIgOiBFUFNJTE9OX0ZMT0FUMTY7XG4gIH1cbiAgZGlzcG9zZSgpOiB2b2lkIHtcbiAgICByZXR1cm4gbm90WWV0SW1wbGVtZW50ZWQoJ2Rpc3Bvc2UnKTtcbiAgfVxufVxuXG5mdW5jdGlvbiBub3RZZXRJbXBsZW1lbnRlZChrZXJuZWxOYW1lOiBzdHJpbmcpOiBuZXZlciB7XG4gIHRocm93IG5ldyBFcnJvcihcbiAgICAgIGAnJHtrZXJuZWxOYW1lfScgbm90IHlldCBpbXBsZW1lbnRlZCBvciBub3QgZm91bmQgaW4gdGhlIHJlZ2lzdHJ5LiBgICtcbiAgICAgIGBUaGlzIGtlcm5lbCBtYXkgbm90IGJlIHN1cHBvcnRlZCBieSB0aGUgdGZqcyBiYWNrZW5kIHlvdSBoYXZlIGNob3NlbmApO1xufVxuIl19","/**\n * @license\n * Copyright 2019 Google LLC. All Rights Reserved.\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n * =============================================================================\n */\n/**\n * Inserts a value into a sorted array. This method allows duplicate, meaning it\n * allows inserting duplicate value, in which case, the element will be inserted\n * at the lowest index of the value.\n * @param arr The array to modify.\n * @param element The element to insert.\n * @param comparator Optional. If no comparator is specified, elements are\n * compared using array_util.defaultComparator, which is suitable for Strings\n * and Numbers in ascending arrays. If the array contains multiple instances of\n * the target value, the left-most instance will be returned. To provide a\n * comparator, it should take 2 arguments to compare and return a negative,\n * zero, or a positive number.\n */\nexport function binaryInsert(arr, element, comparator) {\n const index = binarySearch(arr, element, comparator);\n const insertionPoint = index < 0 ? -(index + 1) : index;\n arr.splice(insertionPoint, 0, element);\n}\n/**\n * Searches the array for the target using binary search, returns the index\n * of the found element, or position to insert if element not found. If no\n * comparator is specified, elements are compared using array_\n * util.defaultComparator, which is suitable for Strings and Numbers in\n * ascending arrays. If the array contains multiple instances of the target\n * value, the left-most instance will be returned.\n * @param arr The array to be searched in.\n * @param target The target to be searched for.\n * @param comparator Should take 2 arguments to compare and return a negative,\n * zero, or a positive number.\n * @return Lowest index of the target value if found, otherwise the insertion\n * point where the target should be inserted, in the form of\n * (-insertionPoint - 1).\n */\nexport function binarySearch(arr, target, comparator) {\n return binarySearch_(arr, target, comparator || defaultComparator);\n}\n/**\n * Compares its two arguments for order.\n * @param a The first element to be compared.\n * @param b The second element to be compared.\n * @return A negative number, zero, or a positive number as the first\n * argument is less than, equal to, or greater than the second.\n */\nfunction defaultComparator(a, b) {\n return a > b ? 1 : a < b ? -1 : 0;\n}\nfunction binarySearch_(arr, target, comparator) {\n let left = 0;\n let right = arr.length;\n let middle = 0;\n let found = false;\n while (left < right) {\n middle = left + ((right - left) >>> 1);\n const compareResult = comparator(target, arr[middle]);\n if (compareResult > 0) {\n left = middle + 1;\n }\n else {\n right = middle;\n // If compareResult is 0, the value is found. We record it is found,\n // and then keep looking because there may be duplicate.\n found = !compareResult;\n }\n }\n return found ? left : -left - 1;\n}\n//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibm9uX21heF9zdXBwcmVzc2lvbl91dGlsLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vLi4vdGZqcy1jb3JlL3NyYy9iYWNrZW5kcy9ub25fbWF4X3N1cHByZXNzaW9uX3V0aWwudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUE7Ozs7Ozs7Ozs7Ozs7OztHQWVHO0FBRUg7Ozs7Ozs7Ozs7OztHQVlHO0FBQ0gsTUFBTSxVQUFVLFlBQVksQ0FDeEIsR0FBUSxFQUFFLE9BQVUsRUFBRSxVQUFtQztJQUMzRCxNQUFNLEtBQUssR0FBRyxZQUFZLENBQUMsR0FBRyxFQUFFLE9BQU8sRUFBRSxVQUFVLENBQUMsQ0FBQztJQUNyRCxNQUFNLGNBQWMsR0FBRyxLQUFLLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsS0FBSyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxLQUFLLENBQUM7SUFDeEQsR0FBRyxDQUFDLE1BQU0sQ0FBQyxjQUFjLEVBQUUsQ0FBQyxFQUFFLE9BQU8sQ0FBQyxDQUFDO0FBQ3pDLENBQUM7QUFFRDs7Ozs7Ozs7Ozs7Ozs7R0FjRztBQUNILE1BQU0sVUFBVSxZQUFZLENBQ3hCLEdBQVEsRUFBRSxNQUFTLEVBQUUsVUFBbUM7SUFDMUQsT0FBTyxhQUFhLENBQUMsR0FBRyxFQUFFLE1BQU0sRUFBRSxVQUFVLElBQUksaUJBQWlCLENBQUMsQ0FBQztBQUNyRSxDQUFDO0FBRUQ7Ozs7OztHQU1HO0FBQ0gsU0FBUyxpQkFBaUIsQ0FBSSxDQUFJLEVBQUUsQ0FBSTtJQUN0QyxPQUFPLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQztBQUNwQyxDQUFDO0FBRUQsU0FBUyxhQUFhLENBQ2xCLEdBQVEsRUFBRSxNQUFTLEVBQUUsVUFBa0M7SUFDekQsSUFBSSxJQUFJLEdBQUcsQ0FBQyxDQUFDO0lBQ2IsSUFBSSxLQUFLLEdBQUcsR0FBRyxDQUFDLE1BQU0sQ0FBQztJQUN2QixJQUFJLE1BQU0sR0FBRyxDQUFDLENBQUM7SUFDZixJQUFJLEtBQUssR0FBRyxLQUFLLENBQUM7SUFDbEIsT0FBTyxJQUFJLEdBQUcsS0FBSyxFQUFFO1FBQ25CLE1BQU0sR0FBRyxJQUFJLEdBQUcsQ0FBQyxDQUFDLEtBQUssR0FBRyxJQUFJLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQztRQUN2QyxNQUFNLGFBQWEsR0FBRyxVQUFVLENBQUMsTUFBTSxFQUFFLEdBQUcsQ0FBQyxNQUFNLENBQUMsQ0FBQyxDQUFDO1FBQ3RELElBQUksYUFBYSxHQUFHLENBQUMsRUFBRTtZQUNyQixJQUFJLEdBQUcsTUFBTSxHQUFHLENBQUMsQ0FBQztTQUNuQjthQUFNO1lBQ0wsS0FBSyxHQUFHLE1BQU0sQ0FBQztZQUNmLG9FQUFvRTtZQUNwRSx3REFBd0Q7WUFDeEQsS0FBSyxHQUFHLENBQUMsYUFBYSxDQUFDO1NBQ3hCO0tBQ0Y7SUFFRCxPQUFPLEtBQUssQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksR0FBRyxDQUFDLENBQUM7QUFDbEMsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbIi8qKlxuICogQGxpY2Vuc2VcbiAqIENvcHlyaWdodCAyMDE5IEdvb2dsZSBMTEMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuXG4gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgXCJMaWNlbnNlXCIpO1xuICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLlxuICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0XG4gKlxuICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wXG4gKlxuICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZVxuICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gXCJBUyBJU1wiIEJBU0lTLFxuICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuXG4gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kXG4gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS5cbiAqID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4gKi9cblxuLyoqXG4gKiBJbnNlcnRzIGEgdmFsdWUgaW50byBhIHNvcnRlZCBhcnJheS4gVGhpcyBtZXRob2QgYWxsb3dzIGR1cGxpY2F0ZSwgbWVhbmluZyBpdFxuICogYWxsb3dzIGluc2VydGluZyBkdXBsaWNhdGUgdmFsdWUsIGluIHdoaWNoIGNhc2UsIHRoZSBlbGVtZW50IHdpbGwgYmUgaW5zZXJ0ZWRcbiAqIGF0IHRoZSBsb3dlc3QgaW5kZXggb2YgdGhlIHZhbHVlLlxuICogQHBhcmFtIGFyciBUaGUgYXJyYXkgdG8gbW9kaWZ5LlxuICogQHBhcmFtIGVsZW1lbnQgVGhlIGVsZW1lbnQgdG8gaW5zZXJ0LlxuICogQHBhcmFtIGNvbXBhcmF0b3IgT3B0aW9uYWwuIElmIG5vIGNvbXBhcmF0b3IgaXMgc3BlY2lmaWVkLCBlbGVtZW50cyBhcmVcbiAqIGNvbXBhcmVkIHVzaW5nIGFycmF5X3V0aWwuZGVmYXVsdENvbXBhcmF0b3IsIHdoaWNoIGlzIHN1aXRhYmxlIGZvciBTdHJpbmdzXG4gKiBhbmQgTnVtYmVycyBpbiBhc2NlbmRpbmcgYXJyYXlzLiBJZiB0aGUgYXJyYXkgY29udGFpbnMgbXVsdGlwbGUgaW5zdGFuY2VzIG9mXG4gKiB0aGUgdGFyZ2V0IHZhbHVlLCB0aGUgbGVmdC1tb3N0IGluc3RhbmNlIHdpbGwgYmUgcmV0dXJuZWQuIFRvIHByb3ZpZGUgYVxuICogY29tcGFyYXRvciwgaXQgc2hvdWxkIHRha2UgMiBhcmd1bWVudHMgdG8gY29tcGFyZSBhbmQgcmV0dXJuIGEgbmVnYXRpdmUsXG4gKiB6ZXJvLCBvciBhIHBvc2l0aXZlIG51bWJlci5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGJpbmFyeUluc2VydDxUPihcbiAgICBhcnI6IFRbXSwgZWxlbWVudDogVCwgY29tcGFyYXRvcj86IChhOiBULCBiOiBUKSA9PiBudW1iZXIpIHtcbiAgY29uc3QgaW5kZXggPSBiaW5hcnlTZWFyY2goYXJyLCBlbGVtZW50LCBjb21wYXJhdG9yKTtcbiAgY29uc3QgaW5zZXJ0aW9uUG9pbnQgPSBpbmRleCA8IDAgPyAtKGluZGV4ICsgMSkgOiBpbmRleDtcbiAgYXJyLnNwbGljZShpbnNlcnRpb25Qb2ludCwgMCwgZWxlbWVudCk7XG59XG5cbi8qKlxuICogU2VhcmNoZXMgdGhlIGFycmF5IGZvciB0aGUgdGFyZ2V0IHVzaW5nIGJpbmFyeSBzZWFyY2gsIHJldHVybnMgdGhlIGluZGV4XG4gKiBvZiB0aGUgZm91bmQgZWxlbWVudCwgb3IgcG9zaXRpb24gdG8gaW5zZXJ0IGlmIGVsZW1lbnQgbm90IGZvdW5kLiBJZiBub1xuICogY29tcGFyYXRvciBpcyBzcGVjaWZpZWQsIGVsZW1lbnRzIGFyZSBjb21wYXJlZCB1c2luZyBhcnJheV9cbiAqIHV0aWwuZGVmYXVsdENvbXBhcmF0b3IsIHdoaWNoIGlzIHN1aXRhYmxlIGZvciBTdHJpbmdzIGFuZCBOdW1iZXJzIGluXG4gKiBhc2NlbmRpbmcgYXJyYXlzLiBJZiB0aGUgYXJyYXkgY29udGFpbnMgbXVsdGlwbGUgaW5zdGFuY2VzIG9mIHRoZSB0YXJnZXRcbiAqIHZhbHVlLCB0aGUgbGVmdC1tb3N0IGluc3RhbmNlIHdpbGwgYmUgcmV0dXJuZWQuXG4gKiBAcGFyYW0gYXJyIFRoZSBhcnJheSB0byBiZSBzZWFyY2hlZCBpbi5cbiAqIEBwYXJhbSB0YXJnZXQgVGhlIHRhcmdldCB0byBiZSBzZWFyY2hlZCBmb3IuXG4gKiBAcGFyYW0gY29tcGFyYXRvciBTaG91bGQgdGFrZSAyIGFyZ3VtZW50cyB0byBjb21wYXJlIGFuZCByZXR1cm4gYSBuZWdhdGl2ZSxcbiAqICAgIHplcm8sIG9yIGEgcG9zaXRpdmUgbnVtYmVyLlxuICogQHJldHVybiBMb3dlc3QgaW5kZXggb2YgdGhlIHRhcmdldCB2YWx1ZSBpZiBmb3VuZCwgb3RoZXJ3aXNlIHRoZSBpbnNlcnRpb25cbiAqICAgIHBvaW50IHdoZXJlIHRoZSB0YXJnZXQgc2hvdWxkIGJlIGluc2VydGVkLCBpbiB0aGUgZm9ybSBvZlxuICogICAgKC1pbnNlcnRpb25Qb2ludCAtIDEpLlxuICovXG5leHBvcnQgZnVuY3Rpb24gYmluYXJ5U2VhcmNoPFQ+KFxuICAgIGFycjogVFtdLCB0YXJnZXQ6IFQsIGNvbXBhcmF0b3I/OiAoYTogVCwgYjogVCkgPT4gbnVtYmVyKSB7XG4gIHJldHVybiBiaW5hcnlTZWFyY2hfKGFyciwgdGFyZ2V0LCBjb21wYXJhdG9yIHx8IGRlZmF1bHRDb21wYXJhdG9yKTtcbn1cblxuLyoqXG4gKiBDb21wYXJlcyBpdHMgdHdvIGFyZ3VtZW50cyBmb3Igb3JkZXIuXG4gKiBAcGFyYW0gYSBUaGUgZmlyc3QgZWxlbWVudCB0byBiZSBjb21wYXJlZC5cbiAqIEBwYXJhbSBiIFRoZSBzZWNvbmQgZWxlbWVudCB0byBiZSBjb21wYXJlZC5cbiAqIEByZXR1cm4gQSBuZWdhdGl2ZSBudW1iZXIsIHplcm8sIG9yIGEgcG9zaXRpdmUgbnVtYmVyIGFzIHRoZSBmaXJzdFxuICogICAgIGFyZ3VtZW50IGlzIGxlc3MgdGhhbiwgZXF1YWwgdG8sIG9yIGdyZWF0ZXIgdGhhbiB0aGUgc2Vjb25kLlxuICovXG5mdW5jdGlvbiBkZWZhdWx0Q29tcGFyYXRvcjxUPihhOiBULCBiOiBUKTogbnVtYmVyIHtcbiAgcmV0dXJuIGEgPiBiID8gMSA6IGEgPCBiID8gLTEgOiAwO1xufVxuXG5mdW5jdGlvbiBiaW5hcnlTZWFyY2hfPFQ+KFxuICAgIGFycjogVFtdLCB0YXJnZXQ6IFQsIGNvbXBhcmF0b3I6IChhOiBULCBiOiBUKSA9PiBudW1iZXIpIHtcbiAgbGV0IGxlZnQgPSAwO1xuICBsZXQgcmlnaHQgPSBhcnIubGVuZ3RoO1xuICBsZXQgbWlkZGxlID0gMDtcbiAgbGV0IGZvdW5kID0gZmFsc2U7XG4gIHdoaWxlIChsZWZ0IDwgcmlnaHQpIHtcbiAgICBtaWRkbGUgPSBsZWZ0ICsgKChyaWdodCAtIGxlZnQpID4+PiAxKTtcbiAgICBjb25zdCBjb21wYXJlUmVzdWx0ID0gY29tcGFyYXRvcih0YXJnZXQsIGFyclttaWRkbGVdKTtcbiAgICBpZiAoY29tcGFyZVJlc3VsdCA+IDApIHtcbiAgICAgIGxlZnQgPSBtaWRkbGUgKyAxO1xuICAgIH0gZWxzZSB7XG4gICAgICByaWdodCA9IG1pZGRsZTtcbiAgICAgIC8vIElmIGNvbXBhcmVSZXN1bHQgaXMgMCwgdGhlIHZhbHVlIGlzIGZvdW5kLiBXZSByZWNvcmQgaXQgaXMgZm91bmQsXG4gICAgICAvLyBhbmQgdGhlbiBrZWVwIGxvb2tpbmcgYmVjYXVzZSB0aGVyZSBtYXkgYmUgZHVwbGljYXRlLlxuICAgICAgZm91bmQgPSAhY29tcGFyZVJlc3VsdDtcbiAgICB9XG4gIH1cblxuICByZXR1cm4gZm91bmQgPyBsZWZ0IDogLWxlZnQgLSAxO1xufVxuIl19","/**\n * @license\n * Copyright 2020 Google LLC. All Rights Reserved.\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n * =============================================================================\n */\nimport { binaryInsert } from './non_max_suppression_util';\nexport function nonMaxSuppressionV3Impl(boxes, scores, maxOutputSize, iouThreshold, scoreThreshold) {\n return nonMaxSuppressionImpl_(boxes, scores, maxOutputSize, iouThreshold, scoreThreshold, 0 /* softNmsSigma */);\n}\nexport function nonMaxSuppressionV4Impl(boxes, scores, maxOutputSize, iouThreshold, scoreThreshold, padToMaxOutputSize) {\n return nonMaxSuppressionImpl_(boxes, scores, maxOutputSize, iouThreshold, scoreThreshold, 0 /* softNmsSigma */, false /* returnScoresTensor */, padToMaxOutputSize /* padToMaxOutputSize */, true\n /* returnValidOutputs */ );\n}\nexport function nonMaxSuppressionV5Impl(boxes, scores, maxOutputSize, iouThreshold, scoreThreshold, softNmsSigma) {\n return nonMaxSuppressionImpl_(boxes, scores, maxOutputSize, iouThreshold, scoreThreshold, softNmsSigma, true /* returnScoresTensor */);\n}\nfunction nonMaxSuppressionImpl_(boxes, scores, maxOutputSize, iouThreshold, scoreThreshold, softNmsSigma, returnScoresTensor = false, padToMaxOutputSize = false, returnValidOutputs = false) {\n // The list is sorted in ascending order, so that we can always pop the\n // candidate with the largest score in O(1) time.\n const candidates = [];\n for (let i = 0; i < scores.length; i++) {\n if (scores[i] > scoreThreshold) {\n candidates.push({ score: scores[i], boxIndex: i, suppressBeginIndex: 0 });\n }\n }\n candidates.sort(ascendingComparator);\n // If softNmsSigma is 0, the outcome of this algorithm is exactly same as\n // before.\n const scale = softNmsSigma > 0 ? (-0.5 / softNmsSigma) : 0.0;\n const selectedIndices = [];\n const selectedScores = [];\n while (selectedIndices.length < maxOutputSize && candidates.length > 0) {\n const candidate = candidates.pop();\n const { score: originalScore, boxIndex, suppressBeginIndex } = candidate;\n if (originalScore < scoreThreshold) {\n break;\n }\n // Overlapping boxes are likely to have similar scores, therefore we\n // iterate through the previously selected boxes backwards in order to\n // see if candidate's score should be suppressed. We use\n // suppressBeginIndex to track and ensure a candidate can be suppressed\n // by a selected box no more than once. Also, if the overlap exceeds\n // iouThreshold, we simply ignore the candidate.\n let ignoreCandidate = false;\n for (let j = selectedIndices.length - 1; j >= suppressBeginIndex; --j) {\n const iou = intersectionOverUnion(boxes, boxIndex, selectedIndices[j]);\n if (iou >= iouThreshold) {\n ignoreCandidate = true;\n break;\n }\n candidate.score =\n candidate.score * suppressWeight(iouThreshold, scale, iou);\n if (candidate.score <= scoreThreshold) {\n break;\n }\n }\n // At this point, if `candidate.score` has not dropped below\n // `scoreThreshold`, then we know that we went through all of the\n // previous selections and can safely update `suppressBeginIndex` to the\n // end of the selected array. Then we can re-insert the candidate with\n // the updated score and suppressBeginIndex back in the candidate list.\n // If on the other hand, `candidate.score` has dropped below the score\n // threshold, we will not add it back to the candidates list.\n candidate.suppressBeginIndex = selectedIndices.length;\n if (!ignoreCandidate) {\n // Candidate has passed all the tests, and is not suppressed, so\n // select the candidate.\n if (candidate.score === originalScore) {\n selectedIndices.push(boxIndex);\n selectedScores.push(candidate.score);\n }\n else if (candidate.score > scoreThreshold) {\n // Candidate's score is suppressed but is still high enough to be\n // considered, so add back to the candidates list.\n binaryInsert(candidates, candidate, ascendingComparator);\n }\n }\n }\n // NonMaxSuppressionV4 feature: padding output to maxOutputSize.\n const validOutputs = selectedIndices.length;\n const elemsToPad = maxOutputSize - validOutputs;\n if (padToMaxOutputSize && elemsToPad > 0) {\n selectedIndices.push(...new Array(elemsToPad).fill(0));\n selectedScores.push(...new Array(elemsToPad).fill(0.0));\n }\n const result = { selectedIndices };\n if (returnScoresTensor) {\n result['selectedScores'] = selectedScores;\n }\n if (returnValidOutputs) {\n result['validOutputs'] = validOutputs;\n }\n return result;\n}\nfunction intersectionOverUnion(boxes, i, j) {\n const iCoord = boxes.subarray(i * 4, i * 4 + 4);\n const jCoord = boxes.subarray(j * 4, j * 4 + 4);\n const yminI = Math.min(iCoord[0], iCoord[2]);\n const xminI = Math.min(iCoord[1], iCoord[3]);\n const ymaxI = Math.max(iCoord[0], iCoord[2]);\n const xmaxI = Math.max(iCoord[1], iCoord[3]);\n const yminJ = Math.min(jCoord[0], jCoord[2]);\n const xminJ = Math.min(jCoord[1], jCoord[3]);\n const ymaxJ = Math.max(jCoord[0], jCoord[2]);\n const xmaxJ = Math.max(jCoord[1], jCoord[3]);\n const areaI = (ymaxI - yminI) * (xmaxI - xminI);\n const areaJ = (ymaxJ - yminJ) * (xmaxJ - xminJ);\n if (areaI <= 0 || areaJ <= 0) {\n return 0.0;\n }\n const intersectionYmin = Math.max(yminI, yminJ);\n const intersectionXmin = Math.max(xminI, xminJ);\n const intersectionYmax = Math.min(ymaxI, ymaxJ);\n const intersectionXmax = Math.min(xmaxI, xmaxJ);\n const intersectionArea = Math.max(intersectionYmax - intersectionYmin, 0.0) *\n Math.max(intersectionXmax - intersectionXmin, 0.0);\n return intersectionArea / (areaI + areaJ - intersectionArea);\n}\n// A Gaussian penalty function, this method always returns values in [0, 1].\n// The weight is a function of similarity, the more overlap two boxes are, the\n// smaller the weight is, meaning highly overlapping boxe will be significantly\n// penalized. On the other hand, a non-overlapping box will not be penalized.\nfunction suppressWeight(iouThreshold, scale, iou) {\n const weight = Math.exp(scale * iou * iou);\n return iou <= iouThreshold ? weight : 0.0;\n}\nfunction ascendingComparator(c1, c2) {\n // For objects with same scores, we make the object with the larger index go\n // first. In an array that pops from the end, this means that the object with\n // the smaller index will be popped first. This ensures the same output as\n // the TensorFlow python version.\n return (c1.score - c2.score) ||\n ((c1.score === c2.score) && (c2.boxIndex - c1.boxIndex));\n}\n//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibm9uX21heF9zdXBwcmVzc2lvbl9pbXBsLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vLi4vdGZqcy1jb3JlL3NyYy9iYWNrZW5kcy9ub25fbWF4X3N1cHByZXNzaW9uX2ltcGwudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUE7Ozs7Ozs7Ozs7Ozs7OztHQWVHO0FBR0gsT0FBTyxFQUFDLFlBQVksRUFBQyxNQUFNLDRCQUE0QixDQUFDO0FBaUJ4RCxNQUFNLFVBQVUsdUJBQXVCLENBQ25DLEtBQWlCLEVBQUUsTUFBa0IsRUFBRSxhQUFxQixFQUM1RCxZQUFvQixFQUFFLGNBQXNCO0lBQzlDLE9BQU8sc0JBQXNCLENBQ3pCLEtBQUssRUFBRSxNQUFNLEVBQUUsYUFBYSxFQUFFLFlBQVksRUFBRSxjQUFjLEVBQzFELENBQUMsQ0FBQyxrQkFBa0IsQ0FBQyxDQUFDO0FBQzVCLENBQUM7QUFFRCxNQUFNLFVBQVUsdUJBQXVCLENBQ25DLEtBQWlCLEVBQUUsTUFBa0IsRUFBRSxhQUFxQixFQUM1RCxZQUFvQixFQUFFLGNBQXNCLEVBQzVDLGtCQUEyQjtJQUM3QixPQUFPLHNCQUFzQixDQUN6QixLQUFLLEVBQUUsTUFBTSxFQUFFLGFBQWEsRUFBRSxZQUFZLEVBQUUsY0FBYyxFQUMxRCxDQUFDLENBQUMsa0JBQWtCLEVBQUUsS0FBSyxDQUFDLHdCQUF3QixFQUNwRCxrQkFBa0IsQ0FBQyx3QkFBd0IsRUFBRSxJQUFJO0lBQ2pELHdCQUF3QixFQUFDLENBQUM7QUFDaEMsQ0FBQztBQUVELE1BQU0sVUFBVSx1QkFBdUIsQ0FDbkMsS0FBaUIsRUFBRSxNQUFrQixFQUFFLGFBQXFCLEVBQzVELFlBQW9CLEVBQUUsY0FBc0IsRUFDNUMsWUFBb0I7SUFDdEIsT0FBTyxzQkFBc0IsQ0FDekIsS0FBSyxFQUFFLE1BQU0sRUFBRSxhQUFhLEVBQUUsWUFBWSxFQUFFLGNBQWMsRUFBRSxZQUFZLEVBQ3hFLElBQUksQ0FBQyx3QkFBd0Is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QUcsQ0FBQyxDQUFDLENBQUM7SUFDaEQsTUFBTSxLQUFLLEdBQUcsSUFBSSxDQUFDLEdBQUcsQ0FBQyxNQUFNLENBQUMsQ0FBQyxDQUFDLEVBQUUsTUFBTSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUM7SUFDN0MsTUFBTSxLQUFLLEdBQUcsSUFBSSxDQUFDLEdBQUcsQ0FBQyxNQUFNLENBQUMsQ0FBQyxDQUFDLEVBQUUsTUFBTSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUM7SUFDN0MsTUFBTSxLQUFLLEdBQUcsSUFBSSxDQUFDLEdBQUcsQ0FBQyxNQUFNLENBQUMsQ0FBQyxDQUFDLEVBQUUsTUFBTSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUM7SUFDN0MsTUFBTSxLQUFLLEdBQUcsSUFBSSxDQUFDLEdBQUcsQ0FBQyxNQUFNLENBQUMsQ0FBQyxDQUFDLEVBQUUsTUFBTSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUM7SUFDN0MsTUFBTSxLQUFLLEdBQUcsSUFBSSxDQUFDLEdBQUcsQ0FBQyxNQUFNLENBQUMsQ0FBQyxDQUFDLEVBQUUsTUFBTSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUM7SUFDN0MsTUFBTSxLQUFLLEdBQUcsSUFBSSxDQUFDLEdBQUcsQ0FBQyxNQUFNLENBQUMsQ0FBQyxDQUFDLEVBQUUsTUFBTSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUM7SUFDN0MsTUFBTSxLQUFLLEdBQUcsSUFBSSxDQUFDLEdBQUcsQ0FBQyxNQUFNLENBQUMsQ0FBQyxDQUFDLEVBQUUsTUFBTSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUM7SUFDN0MsTUFBTSxLQUFLLEdBQUcsSUFBSSxDQUFDLEdBQUcsQ0FBQyxNQUFNLENBQUMsQ0FBQyxDQUFDLEVBQUUsTUFBTSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUM7SUFDN0MsTUFBTSxLQUFLLEdBQUcsQ0FBQyxLQUFLLEdBQUcsS0FBSyxDQUFDLEdBQUcsQ0FBQyxLQUFLLEdBQUcsS0FBSyxDQUFDLENBQUM7SUFDaEQsTUFBTSxLQUFLLEdBQUcsQ0FBQyxLQUFLLEdBQUcsS0FBSyxDQUFDLEdBQUcsQ0FBQyxLQUFLLEdBQUcsS0FBSyxDQUFDLENBQUM7SUFDaEQsSUFBSSxLQUFLLElBQUksQ0FBQyxJQUFJLEtBQUssSUFBSSxDQUFDLEVBQUU7UUFDNUIsT0FBTyxHQUFHLENBQUM7S0FDWjtJQUNELE1BQU0sZ0JBQWdCLEdBQUcsSUFBSSxDQUFDLEdBQUcsQ0FBQyxLQUFLLEVBQUUsS0FBSyxDQUFDLENBQUM7SUFDaEQsTUFBTSxnQkFBZ0IsR0FBRyxJQUFJLENBQUMsR0FBRyxDQUFDLEtBQUssRUFBRSxLQUFLLENBQUMsQ0FBQztJQUNoRCxNQUFNLGdCQUFnQixHQUFHLElBQUksQ0FBQyxHQUFHLENBQUMsS0FBSyxFQUFFLEtBQUssQ0FBQyxDQUFDO0lBQ2hELE1BQU0sZ0JBQWdCLEdBQUcsSUFBSSxDQUFDLEdBQUcsQ0FBQyxLQUFLLEVBQUUsS0FBSyxDQUFDLENBQUM7SUFDaEQsTUFBTSxnQkFBZ0IsR0FBRyxJQUFJLENBQUMsR0FBRyxDQUFDLGdCQUFnQixHQUFHLGdCQUFnQixFQUFFLEdBQUcsQ0FBQztRQUN2RSxJQUFJLENBQUMsR0FBRyxDQUFDLGdCQUFnQixHQUFHLGdCQUFnQixFQUFFLEdBQUcsQ0FBQyxDQUFDO0lBQ3ZELE9BQU8sZ0JBQWdCLEdBQUcsQ0FBQyxLQUFLLEdBQUcsS0FBSyxHQUFHLGdCQUFnQixDQUFDLENBQUM7QUFDL0QsQ0FBQztBQUVELDRFQUE0RTtBQUM1RSw4RUFBOEU7QUFDOUUsK0VBQStFO0FBQy9FLDZFQUE2RTtBQUM3RSxTQUFTLGNBQWMsQ0FBQyxZQUFvQixFQUFFLEtBQWEsRUFBRSxHQUFXO0lBQ3RFLE1BQU0sTUFBTSxHQUFHLElBQUksQ0FBQyxHQUFHLENBQUMsS0FBSyxHQUFHLEdBQUcsR0FBRyxHQUFHLENBQUMsQ0FBQztJQUMzQyxPQUFPLEdBQUcsSUFBSSxZQUFZLENBQUMsQ0FBQyxDQUFDLE1BQU0sQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDO0FBQzVDLENBQUM7QUFFRCxTQUFTLG1CQUFtQixDQUFDLEVBQWEsRUFBRSxFQUFhO0lBQ3ZELDRFQUE0RTtJQUM1RSw2RUFBNkU7SUFDN0UsMEVBQTBFO0lBQzFFLGlDQUFpQztJQUNqQyxPQUFPLENBQUMsRUFBRSxDQUFDLEtBQUssR0FBRyxFQUFFLENBQUMsS0FBSyxDQUFDO1FBQ3hCLENBQUMsQ0FBQyxFQUFFLENBQUMsS0FBSyxLQUFLLEVBQUUsQ0FBQyxLQUFLLENBQUMsSUFBSSxDQUFDLEVBQUUsQ0FBQyxRQUFRLEdBQUcsRUFBRSxDQUFDLFFBQVEsQ0FBQyxDQUFDLENBQUM7QUFDL0QsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbIi8qKlxuICogQGxpY2Vuc2VcbiAqIENvcHlyaWdodCAyMDIwIEdvb2dsZSBMTEMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuXG4gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgXCJMaWNlbnNlXCIpO1xuICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLlxuICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0XG4gKlxuICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wXG4gKlxuICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZVxuICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gXCJBUyBJU1wiIEJBU0lTLFxuICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuXG4gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kXG4gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS5cbiAqID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4gKi9cblxuaW1wb3J0IHtUeXBlZEFycmF5fSBmcm9tICcuLi90eXBlcyc7XG5pbXBvcnQge2JpbmFyeUluc2VydH0gZnJvbSAnLi9ub25fbWF4X3N1cHByZXNzaW9uX3V0aWwnO1xuXG4vKipcbiAqIEltcGxlbWVudGF0aW9uIG9mIHRoZSBOb25NYXhTdXBwcmVzc2lvbiBrZXJuZWwgc2hhcmVkIGJldHdlZW4gd2ViZ2wgYW5kIGNwdS5cbiAqL1xuaW50ZXJmYWNlIENhbmRpZGF0ZSB7XG4gIHNjb3JlOiBudW1iZXI7XG4gIGJveEluZGV4OiBudW1iZXI7XG4gIHN1cHByZXNzQmVnaW5JbmRleDogbnVtYmVyO1xufVxuXG5pbnRlcmZhY2UgTm9uTWF4U3VwcHJlc3Npb25SZXN1bHQge1xuICBzZWxlY3RlZEluZGljZXM6IG51bWJlcltdO1xuICBzZWxlY3RlZFNjb3Jlcz86IG51bWJlcltdO1xuICB2YWxpZE91dHB1dHM/OiBudW1iZXI7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBub25NYXhTdXBwcmVzc2lvblYzSW1wbChcbiAgICBib3hlczogVHlwZWRBcnJheSwgc2NvcmVzOiBUeXBlZEFycmF5LCBtYXhPdXRwdXRTaXplOiBudW1iZXIsXG4gICAgaW91VGhyZXNob2xkOiBudW1iZXIsIHNjb3JlVGhyZXNob2xkOiBudW1iZXIpOiBOb25NYXhTdXBwcmVzc2lvblJlc3VsdCB7XG4gIHJldHVybiBub25NYXhTdXBwcmVzc2lvbkltcGxfKFxuICAgICAgYm94ZXMsIHNjb3JlcywgbWF4T3V0cHV0U2l6ZSwgaW91VGhyZXNob2xkLCBzY29yZVRocmVzaG9sZCxcbiAgICAgIDAgLyogc29mdE5tc1NpZ21hICovKTtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIG5vbk1heFN1cHByZXNzaW9uVjRJbXBsKFxuICAgIGJveGVzOiBUeXBlZEFycmF5LCBzY29yZXM6IFR5cGVkQXJyYXksIG1heE91dHB1dFNpemU6IG51bWJlcixcbiAgICBpb3VUaHJlc2hvbGQ6IG51bWJlciwgc2NvcmVUaHJlc2hvbGQ6IG51bWJlcixcbiAgICBwYWRUb01heE91dHB1dFNpemU6IGJvb2xlYW4pOiBOb25NYXhTdXBwcmVzc2lvblJlc3VsdCB7XG4gIHJldHVybiBub25NYXhTdXBwcmVzc2lvbkltcGxfKFxuICAgICAgYm94ZXMsIHNjb3JlcywgbWF4T3V0cHV0U2l6ZSwgaW91VGhyZXNob2xkLCBzY29yZVRocmVzaG9sZCxcbiAgICAgIDAgLyogc29mdE5tc1NpZ21hICovLCBmYWxzZSAvKiByZXR1cm5TY29yZXNUZW5zb3IgKi8sXG4gICAgICBwYWRUb01heE91dHB1dFNpemUgLyogcGFkVG9NYXhPdXRwdXRTaXplICovLCB0cnVlXG4gICAgICAvKiByZXR1cm5WYWxpZE91dHB1dHMgKi8pO1xufVxuXG5leHBvcnQgZnVuY3Rpb24gbm9uTWF4U3VwcHJlc3Npb25WNUltcGwoXG4gICAgYm94ZXM6IFR5cGVkQXJyYXksIHNjb3JlczogVHlwZWRBcnJheSwgbWF4T3V0cHV0U2l6ZTogbnVtYmVyLFxuICAgIGlvdVRocmVzaG9sZDogbnVtYmVyLCBzY29yZVRocmVzaG9sZDogbnVtYmVyLFxuICAgIHNvZnRObXNTaWdtYTogbnVtYmVyKTogTm9uTWF4U3VwcHJlc3Npb25SZXN1bHQge1xuICByZXR1cm4gbm9uTWF4U3VwcHJlc3Npb25JbXBsXyhcbiAgICAgIGJveGVzLCBzY29yZXMsIG1heE91dHB1dFNpemUsIGlvdVRocmVzaG9sZCwgc2NvcmVUaHJlc2hvbGQsIHNvZnRObXNTaWdtYSxcbiAgICAgIHRydWUgLyogcmV0dXJuU2NvcmVzVGVuc29yICovKTtcbn1cblxuZnVuY3Rpb24gbm9uTWF4U3VwcHJlc3Npb25JbXBsXyhcbiAgICBib3hlczogVHlwZWRBcnJheSwgc2NvcmVzOiBUeXBlZEFycmF5LCBtYXhPdXRwdXRTaXplOiBudW1iZXIsXG4gICAgaW91VGhyZXNob2xkOiBudW1iZXIsIHNjb3JlVGhyZXNob2xkOiBudW1iZXIsIHNvZnRObXNTaWdtYTogbnVtYmVyLFxuICAgIHJldHVyblNjb3Jlc1RlbnNvciA9IGZhbHNlLCBwYWRUb01heE91dHB1dFNpemUgPSBmYWxzZSxcbiAgICByZXR1cm5WYWxpZE91dHB1dHMgPSBmYWxzZSk6IE5vbk1heFN1cHByZXNzaW9uUmVzdWx0IHtcbiAgLy8gVGhlIGxpc3QgaXMgc29ydGVkIGluIGFzY2VuZGluZyBvcmRlciwgc28gdGhhdCB3ZSBjYW4gYWx3YXlzIHBvcCB0aGVcbiAgLy8gY2FuZGlkYXRlIHdpdGggdGhlIGxhcmdlc3Qgc2NvcmUgaW4gTygxKSB0aW1lLlxuICBjb25zdCBjYW5kaWRhdGVzID0gW107XG5cbiAgZm9yIChsZXQgaSA9IDA7IGkgPCBzY29yZXMubGVuZ3RoOyBpKyspIHtcbiAgICBpZiAoc2NvcmVzW2ldID4gc2NvcmVUaHJlc2hvbGQpIHtcbiAgICAgIGNhbmRpZGF0ZXMucHVzaCh7c2NvcmU6IHNjb3Jlc1tpXSwgYm94SW5kZXg6IGksIHN1cHByZXNzQmVnaW5JbmRleDogMH0pO1xuICAgIH1cbiAgfVxuXG4gIGNhbmRpZGF0ZXMuc29ydChhc2NlbmRpbmdDb21wYXJhdG9yKTtcblxuICAvLyBJZiBzb2Z0Tm1zU2lnbWEgaXMgMCwgdGhlIG91dGNvbWUgb2YgdGhpcyBhbGdvcml0aG0gaXMgZXhhY3RseSBzYW1lIGFzXG4gIC8vIGJlZm9yZS5cbiAgY29uc3Qgc2NhbGUgPSBzb2Z0Tm1zU2lnbWEgPiAwID8gKC0wLjUgLyBzb2Z0Tm1zU2lnbWEpIDogMC4wO1xuXG4gIGNvbnN0IHNlbGVjdGVkSW5kaWNlczogbnVtYmVyW10gPSBbXTtcbiAgY29uc3Qgc2VsZWN0ZWRTY29yZXM6IG51bWJlcltdID0gW107XG5cbiAgd2hpbGUgKHNlbGVjdGVkSW5kaWNlcy5sZW5ndGggPCBtYXhPdXRwdXRTaXplICYmIGNhbmRpZGF0ZXMubGVuZ3RoID4gMCkge1xuICAgIGNvbnN0IGNhbmRpZGF0ZSA9IGNhbmRpZGF0ZXMucG9wKCk7XG4gICAgY29uc3Qge3Njb3JlOiBvcmlnaW5hbFNjb3JlLCBib3hJbmRleCwgc3VwcHJlc3NCZWdpbkluZGV4fSA9IGNhbmRpZGF0ZTtcblxuICAgIGlmIChvcmlnaW5hbFNjb3JlIDwgc2NvcmVUaHJlc2hvbGQpIHtcbiAgICAgIGJyZWFrO1xuICAgIH1cblxuICAgIC8vIE92ZXJsYXBwaW5nIGJveGVzIGFyZSBsaWtlbHkgdG8gaGF2ZSBzaW1pbGFyIHNjb3JlcywgdGhlcmVmb3JlIHdlXG4gICAgLy8gaXRlcmF0ZSB0aHJvdWdoIHRoZSBwcmV2aW91c2x5IHNlbGVjdGVkIGJveGVzIGJhY2t3YXJkcyBpbiBvcmRlciB0b1xuICAgIC8vIHNlZSBpZiBjYW5kaWRhdGUncyBzY29yZSBzaG91bGQgYmUgc3VwcHJlc3NlZC4gV2UgdXNlXG4gICAgLy8gc3VwcHJlc3NCZWdpbkluZGV4IHRvIHRyYWNrIGFuZCBlbnN1cmUgYSBjYW5kaWRhdGUgY2FuIGJlIHN1cHByZXNzZWRcbiAgICAvLyBieSBhIHNlbGVjdGVkIGJveCBubyBtb3JlIHRoYW4gb25jZS4gQWxzbywgaWYgdGhlIG92ZXJsYXAgZXhjZWVkc1xuICAgIC8vIGlvdVRocmVzaG9sZCwgd2Ugc2ltcGx5IGlnbm9yZSB0aGUgY2FuZGlkYXRlLlxuICAgIGxldCBpZ25vcmVDYW5kaWRhdGUgPSBmYWxzZTtcbiAgICBmb3IgKGxldCBqID0gc2VsZWN0ZWRJbmRpY2VzLmxlbmd0aCAtIDE7IGogPj0gc3VwcHJlc3NCZWdpbkluZGV4OyAtLWopIHtcbiAgICAgIGNvbnN0IGlvdSA9IGludGVyc2VjdGlvbk92ZXJVbmlvbihib3hlcywgYm94SW5kZXgsIHNlbGVjdGVkSW5kaWNlc1tqXSk7XG5cbiAgICAgIGlmIChpb3UgPj0gaW91VGhyZXNob2xkKSB7XG4gICAgICAgIGlnbm9yZUNhbmRpZGF0ZSA9IHRydWU7XG4gICAgICAgIGJyZWFrO1xuICAgICAgfVxuXG4gICAgICBjYW5kaWRhdGUuc2NvcmUgPVxuICAgICAgICAgIGNhbmRpZGF0ZS5zY29yZSAqIHN1cHByZXNzV2VpZ2h0KGlvdVRocmVzaG9sZCwgc2NhbGUsIGlvdSk7XG5cbiAgICAgIGlmIChjYW5kaWRhdGUuc2NvcmUgPD0gc2NvcmVUaHJlc2hvbGQpIHtcbiAgICAgICAgYnJlYWs7XG4gICAgICB9XG4gICAgfVxuXG4gICAgLy8gQXQgdGhpcyBwb2ludCwgaWYgYGNhbmRpZGF0ZS5zY29yZWAgaGFzIG5vdCBkcm9wcGVkIGJlbG93XG4gICAgLy8gYHNjb3JlVGhyZXNob2xkYCwgdGhlbiB3ZSBrbm93IHRoYXQgd2Ugd2VudCB0aHJvdWdoIGFsbCBvZiB0aGVcbiAgICAvLyBwcmV2aW91cyBzZWxlY3Rpb25zIGFuZCBjYW4gc2FmZWx5IHVwZGF0ZSBgc3VwcHJlc3NCZWdpbkluZGV4YCB0byB0aGVcbiAgICAvLyBlbmQgb2YgdGhlIHNlbGVjdGVkIGFycmF5LiBUaGVuIHdlIGNhbiByZS1pbnNlcnQgdGhlIGNhbmRpZGF0ZSB3aXRoXG4gICAgLy8gdGhlIHVwZGF0ZWQgc2NvcmUgYW5kIHN1cHByZXNzQmVnaW5JbmRleCBiYWNrIGluIHRoZSBjYW5kaWRhdGUgbGlzdC5cbiAgICAvLyBJZiBvbiB0aGUgb3RoZXIgaGFuZCwgYGNhbmRpZGF0ZS5zY29yZWAgaGFzIGRyb3BwZWQgYmVsb3cgdGhlIHNjb3JlXG4gICAgLy8gdGhyZXNob2xkLCB3ZSB3aWxsIG5vdCBhZGQgaXQgYmFjayB0byB0aGUgY2FuZGlkYXRlcyBsaXN0LlxuICAgIGNhbmRpZGF0ZS5zdXBwcmVzc0JlZ2luSW5kZXggPSBzZWxlY3RlZEluZGljZXMubGVuZ3RoO1xuXG4gICAgaWYgKCFpZ25vcmVDYW5kaWRhdGUpIHtcbiAgICAgIC8vIENhbmRpZGF0ZSBoYXMgcGFzc2VkIGFsbCB0aGUgdGVzdHMsIGFuZCBpcyBub3Qgc3VwcHJlc3NlZCwgc29cbiAgICAgIC8vIHNlbGVjdCB0aGUgY2FuZGlkYXRlLlxuICAgICAgaWYgKGNhbmRpZGF0ZS5zY29yZSA9PT0gb3JpZ2luYWxTY29yZSkge1xuICAgICAgICBzZWxlY3RlZEluZGljZXMucHVzaChib3hJbmRleCk7XG4gICAgICAgIHNlbGVjdGVkU2NvcmVzLnB1c2goY2FuZGlkYXRlLnNjb3JlKTtcbiAgICAgIH0gZWxzZSBpZiAoY2FuZGlkYXRlLnNjb3JlID4gc2NvcmVUaHJlc2hvbGQpIHtcbiAgICAgICAgLy8gQ2FuZGlkYXRlJ3Mgc2NvcmUgaXMgc3VwcHJlc3NlZCBidXQgaXMgc3RpbGwgaGlnaCBlbm91Z2ggdG8gYmVcbiAgICAgICAgLy8gY29uc2lkZXJlZCwgc28gYWRkIGJhY2sgdG8gdGhlIGNhbmRpZGF0ZXMgbGlzdC5cbiAgICAgICAgYmluYXJ5SW5zZXJ0KGNhbmRpZGF0ZXMsIGNhbmRpZGF0ZSwgYXNjZW5kaW5nQ29tcGFyYXRvcik7XG4gICAgICB9XG4gICAgfVxuICB9XG5cbiAgLy8gTm9uTWF4U3VwcHJlc3Npb25WNCBmZWF0dXJlOiBwYWRkaW5nIG91dHB1dCB0byBtYXhPdXRwdXRTaXplLlxuICBjb25zdCB2YWxpZE91dHB1dHMgPSBzZWxlY3RlZEluZGljZXMubGVuZ3RoO1xuICBjb25zdCBlbGVtc1RvUGFkID0gbWF4T3V0cHV0U2l6ZSAtIHZhbGlkT3V0cHV0cztcblxuICBpZiAocGFkVG9NYXhPdXRwdXRTaXplICYmIGVsZW1zVG9QYWQgPiAwKSB7XG4gICAgc2VsZWN0ZWRJbmRpY2VzLnB1c2goLi4ubmV3IEFycmF5KGVsZW1zVG9QYWQpLmZpbGwoMCkpO1xuICAgIHNlbGVjdGVkU2NvcmVzLnB1c2goLi4ubmV3IEFycmF5KGVsZW1zVG9QYWQpLmZpbGwoMC4wKSk7XG4gIH1cblxuICBjb25zdCByZXN1bHQ6IE5vbk1heFN1cHByZXNzaW9uUmVzdWx0ID0ge3NlbGVjdGVkSW5kaWNlc307XG5cbiAgaWYgKHJldHVyblNjb3Jlc1RlbnNvcikge1xuICAgIHJlc3VsdFsnc2VsZWN0ZWRTY29yZXMnXSA9IHNlbGVjdGVkU2NvcmVzO1xuICB9XG5cbiAgaWYgKHJldHVyblZhbGlkT3V0cHV0cykge1xuICAgIHJlc3VsdFsndmFsaWRPdXRwdXRzJ10gPSB2YWxpZE91dHB1dHM7XG4gIH1cblxuICByZXR1cm4gcmVzdWx0O1xufVxuXG5mdW5jdGlvbiBpbnRlcnNlY3Rpb25PdmVyVW5pb24oYm94ZXM6IFR5cGVkQXJyYXksIGk6IG51bWJlciwgajogbnVtYmVyKSB7XG4gIGNvbnN0IGlDb29yZCA9IGJveGVzLnN1YmFycmF5KGkgKiA0LCBpICogNCArIDQpO1xuICBjb25zdCBqQ29vcmQgPSBib3hlcy5zdWJhcnJheShqICogNCwgaiAqIDQgKyA0KTtcbiAgY29uc3QgeW1pbkkgPSBNYXRoLm1pbihpQ29vcmRbMF0sIGlDb29yZFsyXSk7XG4gIGNvbnN0IHhtaW5JID0gTWF0aC5taW4oaUNvb3JkWzFdLCBpQ29vcmRbM10pO1xuICBjb25zdCB5bWF4SSA9IE1hdGgubWF4KGlDb29yZFswXSwgaUNvb3JkWzJdKTtcbiAgY29uc3QgeG1heEkgPSBNYXRoLm1heChpQ29vcmRbMV0sIGlDb29yZFszXSk7XG4gIGNvbnN0IHltaW5KID0gTWF0aC5taW4oakNvb3JkWzBdLCBqQ29vcmRbMl0pO1xuICBjb25zdCB4bWluSiA9IE1hdGgubWluKGpDb29yZFsxXSwgakNvb3JkWzNdKTtcbiAgY29uc3QgeW1heEogPSBNYXRoLm1heChqQ29vcmRbMF0sIGpDb29yZFsyXSk7XG4gIGNvbnN0IHhtYXhKID0gTWF0aC5tYXgoakNvb3JkWzFdLCBqQ29vcmRbM10pO1xuICBjb25zdCBhcmVhSSA9ICh5bWF4SSAtIHltaW5JKSAqICh4bWF4SSAtIHhtaW5JKTtcbiAgY29uc3QgYXJlYUogPSAoeW1heEogLSB5bWluSikgKiAoeG1heEogLSB4bWluSik7XG4gIGlmIChhcmVhSSA8PSAwIHx8IGFyZWFKIDw9IDApIHtcbiAgICByZXR1cm4gMC4wO1xuICB9XG4gIGNvbnN0IGludGVyc2VjdGlvblltaW4gPSBNYXRoLm1heCh5bWluSSwgeW1pbkopO1xuICBjb25zdCBpbnRlcnNlY3Rpb25YbWluID0gTWF0aC5tYXgoeG1pbkksIHhtaW5KKTtcbiAgY29uc3QgaW50ZXJzZWN0aW9uWW1heCA9IE1hdGgubWluKHltYXhJLCB5bWF4Sik7XG4gIGNvbnN0IGludGVyc2VjdGlvblhtYXggPSBNYXRoLm1pbih4bWF4SSwgeG1heEopO1xuICBjb25zdCBpbnRlcnNlY3Rpb25BcmVhID0gTWF0aC5tYXgoaW50ZXJzZWN0aW9uWW1heCAtIGludGVyc2VjdGlvblltaW4sIDAuMCkgKlxuICAgICAgTWF0aC5tYXgoaW50ZXJzZWN0aW9uWG1heCAtIGludGVyc2VjdGlvblhtaW4sIDAuMCk7XG4gIHJldHVybiBpbnRlcnNlY3Rpb25BcmVhIC8gKGFyZWFJICsgYXJlYUogLSBpbnRlcnNlY3Rpb25BcmVhKTtcbn1cblxuLy8gQSBHYXVzc2lhbiBwZW5hbHR5IGZ1bmN0aW9uLCB0aGlzIG1ldGhvZCBhbHdheXMgcmV0dXJucyB2YWx1ZXMgaW4gWzAsIDFdLlxuLy8gVGhlIHdlaWdodCBpcyBhIGZ1bmN0aW9uIG9mIHNpbWlsYXJpdHksIHRoZSBtb3JlIG92ZXJsYXAgdHdvIGJveGVzIGFyZSwgdGhlXG4vLyBzbWFsbGVyIHRoZSB3ZWlnaHQgaXMsIG1lYW5pbmcgaGlnaGx5IG92ZXJsYXBwaW5nIGJveGUgd2lsbCBiZSBzaWduaWZpY2FudGx5XG4vLyBwZW5hbGl6ZWQuIE9uIHRoZSBvdGhlciBoYW5kLCBhIG5vbi1vdmVybGFwcGluZyBib3ggd2lsbCBub3QgYmUgcGVuYWxpemVkLlxuZnVuY3Rpb24gc3VwcHJlc3NXZWlnaHQoaW91VGhyZXNob2xkOiBudW1iZXIsIHNjYWxlOiBudW1iZXIsIGlvdTogbnVtYmVyKSB7XG4gIGNvbnN0IHdlaWdodCA9IE1hdGguZXhwKHNjYWxlICogaW91ICogaW91KTtcbiAgcmV0dXJuIGlvdSA8PSBpb3VUaHJlc2hvbGQgPyB3ZWlnaHQgOiAwLjA7XG59XG5cbmZ1bmN0aW9uIGFzY2VuZGluZ0NvbXBhcmF0b3IoYzE6IENhbmRpZGF0ZSwgYzI6IENhbmRpZGF0ZSkge1xuICAvLyBGb3Igb2JqZWN0cyB3aXRoIHNhbWUgc2NvcmVzLCB3ZSBtYWtlIHRoZSBvYmplY3Qgd2l0aCB0aGUgbGFyZ2VyIGluZGV4IGdvXG4gIC8vIGZpcnN0LiBJbiBhbiBhcnJheSB0aGF0IHBvcHMgZnJvbSB0aGUgZW5kLCB0aGlzIG1lYW5zIHRoYXQgdGhlIG9iamVjdCB3aXRoXG4gIC8vIHRoZSBzbWFsbGVyIGluZGV4IHdpbGwgYmUgcG9wcGVkIGZpcnN0LiBUaGlzIGVuc3VyZXMgdGhlIHNhbWUgb3V0cHV0IGFzXG4gIC8vIHRoZSBUZW5zb3JGbG93IHB5dGhvbiB2ZXJzaW9uLlxuICByZXR1cm4gKGMxLnNjb3JlIC0gYzIuc2NvcmUpIHx8XG4gICAgICAoKGMxLnNjb3JlID09PSBjMi5zY29yZSkgJiYgKGMyLmJveEluZGV4IC0gYzEuYm94SW5kZXgpKTtcbn1cbiJdfQ==","/**\n * @license\n * Copyright 2018 Google LLC. All Rights Reserved.\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n * =============================================================================\n */\n/** An implementation of the Where kernel shared between cpu and webgl */\nimport { buffer } from '../ops/buffer';\nexport function whereImpl(condShape, condVals) {\n const indices = [];\n for (let i = 0; i < condVals.length; i++) {\n if (condVals[i]) {\n indices.push(i);\n }\n }\n const inBuffer = buffer(condShape, 'int32');\n const out = buffer([indices.length, condShape.length], 'int32');\n for (let i = 0; i < indices.length; i++) {\n const loc = inBuffer.indexToLoc(indices[i]);\n const offset = i * condShape.length;\n out.values.set(loc, offset);\n }\n return out.toTensor();\n}\n//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoid2hlcmVfaW1wbC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uLy4uL3RmanMtY29yZS9zcmMvYmFja2VuZHMvd2hlcmVfaW1wbC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQTs7Ozs7Ozs7Ozs7Ozs7O0dBZUc7QUFFSCx5RUFBeUU7QUFFekUsT0FBTyxFQUFDLE1BQU0sRUFBQyxNQUFNLGVBQWUsQ0FBQztBQUlyQyxNQUFNLFVBQVUsU0FBUyxDQUFDLFNBQW1CLEVBQUUsUUFBb0I7SUFDakUsTUFBTSxPQUFPLEdBQUcsRUFBRSxDQUFDO0lBQ25CLEtBQUssSUFBSSxDQUFDLEdBQUcsQ0FBQyxFQUFFLENBQUMsR0FBRyxRQUFRLENBQUMsTUFBTSxFQUFFLENBQUMsRUFBRSxFQUFFO1FBQ3hDLElBQUksUUFBUSxDQUFDLENBQUMsQ0FBQyxFQUFFO1lBQ2YsT0FBTyxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsQ0FBQztTQUNqQjtLQUNGO0lBRUQsTUFBTSxRQUFRLEdBQUcsTUFBTSxDQUFDLFNBQVMsRUFBRSxPQUFPLENBQUMsQ0FBQztJQUU1QyxNQUFNLEdBQUcsR0FBRyxNQUFNLENBQUMsQ0FBQyxPQUFPLENBQUMsTUFBTSxFQUFFLFNBQVMsQ0FBQyxNQUFNLENBQUMsRUFBRSxPQUFPLENBQUMsQ0FBQztJQUNoRSxLQUFLLElBQUksQ0FBQyxHQUFHLENBQUMsRUFBRSxDQUFDLEdBQUcsT0FBTyxDQUFDLE1BQU0sRUFBRSxDQUFDLEVBQUUsRUFBRTtRQUN2QyxNQUFNLEdBQUcsR0FBRyxRQUFRLENBQUMsVUFBVSxDQUFDLE9BQU8sQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDO1FBQzVDLE1BQU0sTUFBTSxHQUFHLENBQUMsR0FBRyxTQUFTLENBQUMsTUFBTSxDQUFDO1FBQ3BDLEdBQUcsQ0FBQyxNQUFNLENBQUMsR0FBRyxDQUFDLEdBQUcsRUFBRSxNQUFNLENBQUMsQ0FBQztLQUM3QjtJQUNELE9BQU8sR0FBRyxDQUFDLFFBQVEsRUFBYyxDQUFDO0FBQ3BDLENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyIvKipcbiAqIEBsaWNlbnNlXG4gKiBDb3B5cmlnaHQgMjAxOCBHb29nbGUgTExDLiBBbGwgUmlnaHRzIFJlc2VydmVkLlxuICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlIFwiTGljZW5zZVwiKTtcbiAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS5cbiAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdFxuICpcbiAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMFxuICpcbiAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmVcbiAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuIFwiQVMgSVNcIiBCQVNJUyxcbiAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLlxuICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZFxuICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuXG4gKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuICovXG5cbi8qKiBBbiBpbXBsZW1lbnRhdGlvbiBvZiB0aGUgV2hlcmUga2VybmVsIHNoYXJlZCBiZXR3ZWVuIGNwdSBhbmQgd2ViZ2wgKi9cblxuaW1wb3J0IHtidWZmZXJ9IGZyb20gJy4uL29wcy9idWZmZXInO1xuaW1wb3J0IHtUZW5zb3IyRH0gZnJvbSAnLi4vdGVuc29yJztcbmltcG9ydCB7VHlwZWRBcnJheX0gZnJvbSAnLi4vdHlwZXMnO1xuXG5leHBvcnQgZnVuY3Rpb24gd2hlcmVJbXBsKGNvbmRTaGFwZTogbnVtYmVyW10sIGNvbmRWYWxzOiBUeXBlZEFycmF5KTogVGVuc29yMkQge1xuICBjb25zdCBpbmRpY2VzID0gW107XG4gIGZvciAobGV0IGkgPSAwOyBpIDwgY29uZFZhbHMubGVuZ3RoOyBpKyspIHtcbiAgICBpZiAoY29uZFZhbHNbaV0pIHtcbiAgICAgIGluZGljZXMucHVzaChpKTtcbiAgICB9XG4gIH1cblxuICBjb25zdCBpbkJ1ZmZlciA9IGJ1ZmZlcihjb25kU2hhcGUsICdpbnQzMicpO1xuXG4gIGNvbnN0IG91dCA9IGJ1ZmZlcihbaW5kaWNlcy5sZW5ndGgsIGNvbmRTaGFwZS5sZW5ndGhdLCAnaW50MzInKTtcbiAgZm9yIChsZXQgaSA9IDA7IGkgPCBpbmRpY2VzLmxlbmd0aDsgaSsrKSB7XG4gICAgY29uc3QgbG9jID0gaW5CdWZmZXIuaW5kZXhUb0xvYyhpbmRpY2VzW2ldKTtcbiAgICBjb25zdCBvZmZzZXQgPSBpICogY29uZFNoYXBlLmxlbmd0aDtcbiAgICBvdXQudmFsdWVzLnNldChsb2MsIG9mZnNldCk7XG4gIH1cbiAgcmV0dXJuIG91dC50b1RlbnNvcigpIGFzIFRlbnNvcjJEO1xufVxuIl19","/**\n * @license\n * Copyright 2018 Google LLC. All Rights Reserved.\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n * =============================================================================\n */\nimport { env } from './environment';\nimport * as util from './util';\nexport class Profiler {\n constructor(backendTimer, logger) {\n this.backendTimer = backendTimer;\n this.logger = logger;\n if (logger == null) {\n this.logger = new Logger();\n }\n }\n profileKernel(kernelName, inputs, f) {\n let outputs;\n const holdResultWrapperFn = () => {\n outputs = f();\n };\n let timer;\n const start = util.now();\n if (this.backendTimer.timerAvailable()) {\n timer = this.backendTimer.time(holdResultWrapperFn);\n }\n else {\n holdResultWrapperFn();\n for (const output of outputs) {\n output.dataSync();\n }\n timer = Promise.resolve({ kernelMs: util.now() - start });\n }\n if (env().getBool('CHECK_COMPUTATION_FOR_ERRORS')) {\n for (let i = 0; i < outputs.length; i++) {\n const output = outputs[i];\n // Dangling promise here because we don't want to propagate up\n // asynchronicity.\n output.data().then(tensorVals => {\n checkComputationForErrors(tensorVals, output.dtype, kernelName);\n });\n }\n }\n const kernelProfile = {\n kernelName,\n outputs,\n inputs,\n timeMs: timer.then(timing => timing.kernelMs),\n extraInfo: timer.then(timing => timing.getExtraProfileInfo != null ?\n timing.getExtraProfileInfo() :\n '')\n };\n return kernelProfile;\n }\n logKernelProfile(kernelProfile) {\n const { kernelName, outputs, timeMs, inputs, extraInfo } = kernelProfile;\n outputs.forEach(result => {\n Promise.all([result.data(), timeMs, extraInfo]).then(valueContainer => {\n this.logger.logKernelProfile(kernelName, result, valueContainer[0], valueContainer[1], inputs, valueContainer[2]);\n });\n });\n }\n}\nexport function checkComputationForErrors(vals, dtype, kernelName) {\n if (dtype !== 'float32') {\n // Only floating point computations will generate NaN values\n return false;\n }\n for (let i = 0; i < vals.length; i++) {\n const num = vals[i];\n if (isNaN(num) || !isFinite(num)) {\n // Throwing custom exception so behavior is testable.\n console.warn(`Found ${num} in the result of '${kernelName}'`);\n return true;\n }\n }\n return false;\n}\nexport class Logger {\n logKernelProfile(name, result, vals, timeMs, inputs, extraInfo) {\n const time = typeof timeMs === 'number' ? util.rightPad(`${timeMs}ms`, 9) :\n timeMs['error'];\n const paddedName = util.rightPad(name, 25);\n const rank = result.rank;\n const size = result.size;\n const shape = util.rightPad(result.shape.toString(), 14);\n let inputShapesDescription = '';\n for (const name in inputs) {\n const input = inputs[name];\n if (input != null) {\n // The input might be a non-tensor (e.g HTMLImageElement), in which case\n // we claim the output shape as input shape.\n const inputShape = input.shape || result.shape;\n const inputRank = inputShape.length;\n inputShapesDescription +=\n `${name}: ${inputRank}D ${inputRank > 0 ? inputShape : ''} `;\n }\n }\n console.log(`%c${paddedName}\\t%c${time}\\t%c${rank}D ${shape}\\t%c${size}\\t%c${inputShapesDescription}\\t%c${extraInfo}`, 'font-weight:bold', 'color:red', 'color:blue', 'color: orange', 'color: green', 'color: steelblue');\n }\n}\n//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicHJvZmlsZXIuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi90ZmpzLWNvcmUvc3JjL3Byb2ZpbGVyLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBOzs7Ozs7Ozs7Ozs7Ozs7R0FlRztBQUdILE9BQU8sRUFBQyxHQUFHLEVBQUMsTUFBTSxlQUFlLENBQUM7QUFJbEMsT0FBTyxLQUFLLElBQUksTUFBTSxRQUFRLENBQUM7QUFVL0IsTUFBTSxPQUFPLFFBQVE7SUFDbkIsWUFBb0IsWUFBMEIsRUFBVSxNQUFlO1FBQW5ELGlCQUFZLEdBQVosWUFBWSxDQUFjO1FBQVUsV0FBTSxHQUFOLE1BQU0sQ0FBUztRQUNyRSxJQUFJLE1BQU0sSUFBSSxJQUFJLEVBQUU7WUFDbEIsSUFBSSxDQUFDLE1BQU0sR0FBRyxJQUFJLE1BQU0sRUFBRSxDQUFDO1NBQzVCO0lBQ0gsQ0FBQztJQUVELGFBQWEsQ0FBQyxVQUFrQixFQUFFLE1BQXNCLEVBQUUsQ0FBaUI7UUFFekUsSUFBSSxPQUFpQixDQUFDO1FBQ3RCLE1BQU0sbUJBQW1CLEdBQUcsR0FBRyxFQUFFO1lBQy9CLE9BQU8sR0FBRyxDQUFDLEVBQUUsQ0FBQztRQUNoQixDQUFDLENBQUM7UUFDRixJQUFJLEtBQWlDLENBQUM7UUFDdEMsTUFBTSxLQUFLLEdBQUcsSUFBSSxDQUFDLEdBQUcsRUFBRSxDQUFDO1FBQ3pCLElBQUksSUFBSSxDQUFDLFlBQVksQ0FBQyxjQUFjLEVBQUUsRUFBRTtZQUN0QyxLQUFLLEdBQUcsSUFBSSxDQUFDLFlBQVksQ0FBQyxJQUFJLENBQUMsbUJBQW1CLENBQUMsQ0FBQztTQUNyRDthQUFNO1lBQ0wsbUJBQW1CLEVBQUUsQ0FBQztZQUN0QixLQUFLLE1BQU0sTUFBTSxJQUFJLE9BQU8sRUFBRTtnQkFDNUIsTUFBTSxDQUFDLFFBQVEsRUFBRSxDQUFDO2FBQ25CO1lBQ0QsS0FBSyxHQUFHLE9BQU8sQ0FBQyxPQUFPLENBQUMsRUFBQyxRQUFRLEVBQUUs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Q0FBQyxDQUFDO0lBQzFDLENBQUM7Q0FDRiIsInNvdXJjZXNDb250ZW50IjpbIi8qKlxuICogQGxpY2Vuc2VcbiAqIENvcHlyaWdodCAyMDE4IEdvb2dsZSBMTEMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuXG4gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgXCJMaWNlbnNlXCIpO1xuICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLlxuICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0XG4gKlxuICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wXG4gKlxuICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZVxuICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gXCJBUyBJU1wiIEJBU0lTLFxuICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuXG4gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kXG4gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS5cbiAqID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4gKi9cblxuaW1wb3J0IHtCYWNrZW5kVGltZXIsIEJhY2tlbmRUaW1pbmdJbmZvfSBmcm9tICcuL2JhY2tlbmRzL2JhY2tlbmQnO1xuaW1wb3J0IHtlbnZ9IGZyb20gJy4vZW52aXJvbm1lbnQnO1xuaW1wb3J0IHtUZW5zb3J9IGZyb20gJy4vdGVuc29yJztcbmltcG9ydCB7TmFtZWRUZW5zb3JNYXB9IGZyb20gJy4vdGVuc29yX3R5cGVzJztcbmltcG9ydCB7RGF0YVR5cGUsIERhdGFUeXBlTWFwLCBUeXBlZEFycmF5fSBmcm9tICcuL3R5cGVzJztcbmltcG9ydCAqIGFzIHV0aWwgZnJvbSAnLi91dGlsJztcblxuZXhwb3J0IHR5cGUgS2VybmVsUHJvZmlsZSA9IHtcbiAga2VybmVsTmFtZTogc3RyaW5nLFxuICBvdXRwdXRzOiBUZW5zb3JbXSxcbiAgaW5wdXRzOiBOYW1lZFRlbnNvck1hcCxcbiAgdGltZU1zOiBQcm9taXNlPG51bWJlcnx7ZXJyb3I6IHN0cmluZ30+LFxuICBleHRyYUluZm86IFByb21pc2U8c3RyaW5nPlxufTtcblxuZXhwb3J0IGNsYXNzIFByb2ZpbGVyIHtcbiAgY29uc3RydWN0b3IocHJpdmF0ZSBiYWNrZW5kVGltZXI6IEJhY2tlbmRUaW1lciwgcHJpdmF0ZSBsb2dnZXI/OiBMb2dnZXIpIHtcbiAgICBpZiAobG9nZ2VyID09IG51bGwpIHtcbiAgICAgIHRoaXMubG9nZ2VyID0gbmV3IExvZ2dlcigpO1xuICAgIH1cbiAgfVxuXG4gIHByb2ZpbGVLZXJuZWwoa2VybmVsTmFtZTogc3RyaW5nLCBpbnB1dHM6IE5hbWVkVGVuc29yTWFwLCBmOiAoKSA9PiBUZW5zb3JbXSk6XG4gICAgICBLZXJuZWxQcm9maWxlIHtcbiAgICBsZXQgb3V0cHV0czogVGVuc29yW107XG4gICAgY29uc3QgaG9sZFJlc3VsdFdyYXBwZXJGbiA9ICgpID0+IHtcbiAgICAgIG91dHB1dHMgPSBmKCk7XG4gICAgfTtcbiAgICBsZXQgdGltZXI6IFByb21pc2U8QmFja2VuZFRpbWluZ0luZm8+O1xuICAgIGNvbnN0IHN0YXJ0ID0gdXRpbC5ub3coKTtcbiAgICBpZiAodGhpcy5iYWNrZW5kVGltZXIudGltZXJBdmFpbGFibGUoKSkge1xuICAgICAgdGltZXIgPSB0aGlzLmJhY2tlbmRUaW1lci50aW1lKGhvbGRSZXN1bHRXcmFwcGVyRm4pO1xuICAgIH0gZWxzZSB7XG4gICAgICBob2xkUmVzdWx0V3JhcHBlckZuKCk7XG4gICAgICBmb3IgKGNvbnN0IG91dHB1dCBvZiBvdXRwdXRzKSB7XG4gICAgICAgIG91dHB1dC5kYXRhU3luYygpO1xuICAgICAgfVxuICAgICAgdGltZXIgPSBQcm9taXNlLnJlc29sdmUoe2tlcm5lbE1zOiB1dGlsLm5vdygpIC0gc3RhcnR9KTtcbiAgICB9XG4gICAgaWYgKGVudigpLmdldEJvb2woJ0NIRUNLX0NPTVBVVEFUSU9OX0ZPUl9FUlJPUlMnKSkge1xuICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCBvdXRwdXRzLmxlbmd0aDsgaSsrKSB7XG4gICAgICAgIGNvbnN0IG91dHB1dCA9IG91dHB1dHNbaV07XG4gICAgICAgIC8vIERhbmdsaW5nIHByb21pc2UgaGVyZSBiZWNhdXNlIHdlIGRvbid0IHdhbnQgdG8gcHJvcGFnYXRlIHVwXG4gICAgICAgIC8vIGFzeW5jaHJvbmljaXR5LlxuICAgICAgICBvdXRwdXQuZGF0YSgpLnRoZW4odGVuc29yVmFscyA9PiB7XG4gICAgICAgICAgY2hlY2tDb21wdXRhdGlvbkZvckVycm9ycyh0ZW5zb3JWYWxzLCBvdXRwdXQuZHR5cGUsIGtlcm5lbE5hbWUpO1xuICAgICAgICB9KTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICBjb25zdCBrZXJuZWxQcm9maWxlID0ge1xuICAgICAga2VybmVsTmFtZSxcbiAgICAgIG91dHB1dHMsXG4gICAgICBpbnB1dHMsXG4gICAgICB0aW1lTXM6IHRpbWVyLnRoZW4odGltaW5nID0+IHRpbWluZy5rZXJuZWxNcyksXG4gICAgICBleHRyYUluZm86IHRpbWVyLnRoZW4oXG4gICAgICAgICAgdGltaW5nID0+IHRpbWluZy5nZXRFeHRyYVByb2ZpbGVJbmZvICE9IG51bGwgP1xuICAgICAgICAgICAgICB0aW1pbmcuZ2V0RXh0cmFQcm9maWxlSW5mbygpIDpcbiAgICAgICAgICAgICAgJycpXG4gICAgfTtcbiAgICByZXR1cm4ga2VybmVsUHJvZmlsZTtcbiAgfVxuXG4gIGxvZ0tlcm5lbFByb2ZpbGUoa2VybmVsUHJvZmlsZTogS2VybmVsUHJvZmlsZSk6IHZvaWQge1xuICAgIGNvbnN0IHtrZXJuZWxOYW1lLCBvdXRwdXRzLCB0aW1lTXMsIGlucHV0cywgZXh0cmFJbmZvfSA9IGtlcm5lbFByb2ZpbGU7XG5cbiAgICBvdXRwdXRzLmZvckVhY2gocmVzdWx0ID0+IHtcbiAgICAgIFByb21pc2UuYWxsKFtyZXN1bHQuZGF0YSgpLCB0aW1lTXMsIGV4dHJhSW5mb10pLnRoZW4odmFsdWVDb250YWluZXIgPT4ge1xuICAgICAgICB0aGlzLmxvZ2dlci5sb2dLZXJuZWxQcm9maWxlKFxuICAgICAgICAgICAga2VybmVsTmFtZSwgcmVzdWx0LCB2YWx1ZUNvbnRhaW5lclswXSwgdmFsdWVDb250YWluZXJbMV0sIGlucHV0cyxcbiAgICAgICAgICAgIHZhbHVlQ29udGFpbmVyWzJdKTtcbiAgICAgIH0pO1xuICAgIH0pO1xuICB9XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBjaGVja0NvbXB1dGF0aW9uRm9yRXJyb3JzPEQgZXh0ZW5kcyBEYXRhVHlwZT4oXG4gICAgdmFsczogRGF0YVR5cGVNYXBbRF0sIGR0eXBlOiBELCBrZXJuZWxOYW1lOiBzdHJpbmcpOiBib29sZWFuIHtcbiAgaWYgKGR0eXBlICE9PSAnZmxvYXQzMicpIHtcbiAgICAvLyBPbmx5IGZsb2F0aW5nIHBvaW50IGNvbXB1dGF0aW9ucyB3aWxsIGdlbmVyYXRlIE5hTiB2YWx1ZXNcbiAgICByZXR1cm4gZmFsc2U7XG4gIH1cbiAgZm9yIChsZXQgaSA9IDA7IGkgPCB2YWxzLmxlbmd0aDsgaSsrKSB7XG4gICAgY29uc3QgbnVtID0gdmFsc1tpXSBhcyBudW1iZXI7XG4gICAgaWYgKGlzTmFOKG51bSkgfHwgIWlzRmluaXRlKG51bSkpIHtcbiAgICAgIC8vIFRocm93aW5nIGN1c3RvbSBleGNlcHRpb24gc28gYmVoYXZpb3IgaXMgdGVzdGFibGUuXG4gICAgICBjb25zb2xlLndhcm4oYEZvdW5kICR7bnVtfSBpbiB0aGUgcmVzdWx0IG9mICcke2tlcm5lbE5hbWV9J2ApO1xuICAgICAgcmV0dXJuIHRydWU7XG4gICAgfVxuICB9XG4gIHJldHVybiBmYWxzZTtcbn1cblxuZXhwb3J0IGNsYXNzIExvZ2dlciB7XG4gIGxvZ0tlcm5lbFByb2ZpbGUoXG4gICAgICBuYW1lOiBzdHJpbmcsIHJlc3VsdDogVGVuc29yLCB2YWxzOiBUeXBlZEFycmF5LFxuICAgICAgdGltZU1zOiBudW1iZXJ8e2Vycm9yOiBzdHJpbmd9LCBpbnB1dHM6IE5hbWVkVGVuc29yTWFwLFxuICAgICAgZXh0cmFJbmZvPzogc3RyaW5nKSB7XG4gICAgY29uc3QgdGltZSA9IHR5cGVvZiB0aW1lTXMgPT09ICdudW1iZXInID8gdXRpbC5yaWdodFBhZChgJHt0aW1lTXN9bXNgLCA5KSA6XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGltZU1zWydlcnJvciddO1xuICAgIGNvbnN0IHBhZGRlZE5hbWUgPSB1dGlsLnJpZ2h0UGFkKG5hbWUsIDI1KTtcbiAgICBjb25zdCByYW5rID0gcmVzdWx0LnJhbms7XG4gICAgY29uc3Qgc2l6ZSA9IHJlc3VsdC5zaXplO1xuICAgIGNvbnN0IHNoYXBlID0gdXRpbC5yaWdodFBhZChyZXN1bHQuc2hhcGUudG9TdHJpbmcoKSwgMTQpO1xuICAgIGxldCBpbnB1dFNoYXBlc0Rlc2NyaXB0aW9uID0gJyc7XG5cbiAgICBmb3IgKGNvbnN0IG5hbWUgaW4gaW5wdXRzKSB7XG4gICAgICBjb25zdCBpbnB1dCA9IGlucHV0c1tuYW1lXTtcbiAgICAgIGlmIChpbnB1dCAhPSBudWxsKSB7XG4gICAgICAgIC8vIFRoZSBpbnB1dCBtaWdodCBiZSBhIG5vbi10ZW5zb3IgKGUuZyBIVE1MSW1hZ2VFbGVtZW50KSwgaW4gd2hpY2ggY2FzZVxuICAgICAgICAvLyB3ZSBjbGFpbSB0aGUgb3V0cHV0IHNoYXBlIGFzIGlucHV0IHNoYXBlLlxuICAgICAgICBjb25zdCBpbnB1dFNoYXBlID0gaW5wdXQuc2hhcGUgfHwgcmVzdWx0LnNoYXBlO1xuICAgICAgICBjb25zdCBpbnB1dFJhbmsgPSBpbnB1dFNoYXBlLmxlbmd0aDtcbiAgICAgICAgaW5wdXRTaGFwZXNEZXNjcmlwdGlvbiArPVxuICAgICAgICAgICAgYCR7bmFtZX06ICR7aW5wdXRSYW5rfUQgJHtpbnB1dFJhbmsgPiAwID8gaW5wdXRTaGFwZSA6ICcnfSBgO1xuICAgICAgfVxuICAgIH1cblxuICAgIGNvbnNvbGUubG9nKFxuICAgICAgICBgJWMke3BhZGRlZE5hbWV9XFx0JWMke3RpbWV9XFx0JWMke3Jhbmt9RCAke3NoYXBlfVxcdCVjJHtzaXplfVxcdCVjJHtcbiAgICAgICAgICAgIGlucHV0U2hhcGVzRGVzY3JpcHRpb259XFx0JWMke2V4dHJhSW5mb31gLFxuICAgICAgICAnZm9udC13ZWlnaHQ6Ym9sZCcsICdjb2xvcjpyZWQnLCAnY29sb3I6Ymx1ZScsICdjb2xvcjogb3JhbmdlJyxcbiAgICAgICAgJ2NvbG9yOiBncmVlbicsICdjb2xvcjogc3RlZWxibHVlJyk7XG4gIH1cbn1cbiJdfQ==","/**\n * @license\n * Copyright 2018 Google LLC. All Rights Reserved.\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n * =============================================================================\n */\nimport { KernelBackend } from './backends/backend';\nimport { Environment, setEnvironmentGlobal } from './environment';\nimport { getGlobalNamespace } from './global_util';\nimport { Add, Cast, Identity } from './kernel_names';\nimport { getGradient, getKernel, getKernelsForBackend } from './kernel_registry';\nimport * as log from './log';\nimport { Profiler } from './profiler';\nimport { backpropagateGradients, getFilteredNodesXToY } from './tape';\nimport { setTensorTracker, Tensor, Variable } from './tensor';\nimport { getTensorsInContainer } from './tensor_util';\nimport * as util from './util';\nimport { bytesFromStringArray, makeOnesTypedArray, now, sizeFromShape } from './util';\nfunction isRegisteredKernelInvocation(kernelInvocation) {\n return kernelInvocation.kernelName != null;\n}\nclass EngineState {\n constructor() {\n // Public since optimizers will use it.\n this.registeredVariables = {};\n this.nextTapeNodeId = 0;\n this.numBytes = 0;\n this.numTensors = 0;\n this.numStringTensors = 0;\n this.numDataBuffers = 0;\n // Number of nested tf.grad() statements when computing higher-order\n // gradients. E.g. `1` for first-order gradients and `2` for second-order\n // gradients. Used to track if the tape should be removed after a backprop.\n this.gradientDepth = 0;\n // Number of nested kernel calls. When kernel depth is greater than 1, we turn\n // off the tape.\n this.kernelDepth = 0;\n this.scopeStack = [];\n /**\n * Keeps track of the number of data moves during a kernel execution. We\n * maintain a stack since kernels can call other kernels, recursively.\n */\n this.numDataMovesStack = [];\n this.nextScopeId = 0;\n this.tensorInfo = new WeakMap();\n this.profiling = false;\n this.activeProfile = {\n newBytes: 0,\n newTensors: 0,\n peakBytes: 0,\n kernels: [],\n result: null,\n get kernelNames() {\n return Array.from(new Set(this.kernels.map(k => k.name)));\n }\n };\n }\n dispose() {\n for (const variableName in this.registeredVariables) {\n this.registeredVariables[variableName].dispose();\n }\n }\n}\nexport class Engine {\n constructor(ENV) {\n this.ENV = ENV;\n this.registry = {};\n this.registryFactory = {};\n this.pendingBackendInitId = 0;\n this.state = new EngineState();\n }\n async ready() {\n if (this.pendingBackendInit != null) {\n return this.pendingBackendInit.then(() => { });\n }\n if (this.backendInstance != null) {\n return;\n }\n const sortedBackends = this.getSortedBackends();\n for (let i = 0; i < sortedBackends.length; i++) {\n const backendName = sortedBackends[i];\n const success = await this.initializeBackend(backendName).success;\n if (success) {\n await this.setBackend(backendName);\n return;\n }\n }\n throw new Error(`Could not initialize any backends, all backend initializations ` +\n `failed.`);\n }\n get backend() {\n if (this.pendingBackendInit != null) {\n throw new Error(`Backend '${this.backendName}' has not yet been initialized. Make ` +\n `sure to await tf.ready() or await tf.setBackend() before calling ` +\n `other methods`);\n }\n if (this.backendInstance == null) {\n const { name, asyncInit } = this.initializeBackendsAndReturnBest();\n if (asyncInit) {\n throw new Error(`The highest priority backend '${name}' has not yet been ` +\n `initialized. Make sure to await tf.ready() or ` +\n `await tf.setBackend() before calling other methods`);\n }\n this.setBackend(name);\n }\n return this.backendInstance;\n }\n backendNames() {\n return Object.keys(this.registryFactory);\n }\n findBackend(backendName) {\n if (!(backendName in this.registry)) {\n // If the backend hasn't been initialized but we have a registry entry for\n // it, initialize it and return it.\n if (backendName in this.registryFactory) {\n const { asyncInit } = this.initializeBackend(backendName);\n if (asyncInit) {\n // Backend is not ready yet.\n return null;\n }\n }\n else {\n return null;\n }\n }\n return this.registry[backendName];\n }\n findBackendFactory(backendName) {\n if (!(backendName in this.registryFactory)) {\n return null;\n }\n return this.registryFactory[backendName].factory;\n }\n registerBackend(backendName, factory, priority = 1) {\n if (backendName in this.registryFactory) {\n log.warn(`${backendName} backend was already registered. ` +\n `Reusing existing backend factory.`);\n return false;\n }\n this.registryFactory[backendName] = { factory, priority };\n return true;\n }\n async setBackend(backendName) {\n if (this.registryFactory[backendName] == null) {\n throw new Error(`Backend name '${backendName}' not found in registry`);\n }\n this.backendName = backendName;\n if (this.registry[backendName] == null) {\n this.backendInstance = null;\n const { success, asyncInit } = this.initializeBackend(backendName);\n const result = asyncInit ? await success : success;\n if (!result) {\n return false;\n }\n }\n this.backendInstance = this.registry[backendName];\n this.setupRegisteredKernels();\n // Reset the profiler.\n this.profiler = new Profiler(this.backendInstance);\n return true;\n }\n setupRegisteredKernels() {\n const kernels = getKernelsForBackend(this.backendName);\n kernels.forEach(kernel => {\n if (kernel.setupFunc != null) {\n kernel.setupFunc(this.backendInstance);\n }\n });\n }\n disposeRegisteredKernels(backendName) {\n const kernels = getKernelsForBackend(backendName);\n kernels.forEach(kernel => {\n if (kernel.disposeFunc != null) {\n kernel.disposeFunc(this.registry[backendName]);\n }\n });\n }\n /**\n * Initializes a backend by looking up the backend name in the factory\n * registry and calling the factory method. Returns a boolean representing\n * whether the initialization of the backend suceeded. Throws an error if\n * there is no backend in the factory registry.\n */\n initializeBackend(backendName) {\n const registryFactoryEntry = this.registryFactory[backendName];\n if (registryFactoryEntry == null) {\n throw new Error(`Cannot initialize backend ${backendName}, no registration found.`);\n }\n try {\n const backend = registryFactoryEntry.factory();\n /* Test if the factory returns a promise.\n Done in a more liberal way than\n previous 'Promise.resolve(backend)===backend'\n as we needed to account for custom Promise\n implementations (e.g. Angular) */\n if (backend && !(backend instanceof KernelBackend) &&\n typeof backend.then === 'function') {\n const promiseId = ++this.pendingBackendInitId;\n const success = backend\n .then(backendInstance => {\n // Outdated promise. Another backend was set in the meantime.\n if (promiseId < this.pendingBackendInitId) {\n return false;\n }\n this.registry[backendName] = backendInstance;\n this.pendingBackendInit = null;\n return true;\n })\n .catch(err => {\n // Outdated promise. Another backend was set in the meantime.\n if (promiseId < this.pendingBackendInitId) {\n return false;\n }\n this.pendingBackendInit = null;\n log.warn(`Initialization of backend ${backendName} failed`);\n log.warn(err.stack || err.message);\n return false;\n });\n this.pendingBackendInit = success;\n return { success, asyncInit: true };\n }\n else {\n this.registry[backendName] = backend;\n return { success: true, asyncInit: false };\n }\n }\n catch (err) {\n log.warn(`Initialization of backend ${backendName} failed`);\n log.warn(err.stack || err.message);\n return { success: false, asyncInit: false };\n }\n }\n removeBackend(backendName) {\n if (!(backendName in this.registryFactory)) {\n throw new Error(`${backendName} backend not found in registry`);\n }\n if (this.backendName === backendName && this.pendingBackendInit != null) {\n // There is a pending promise of the backend we want to remove. Make it\n // obsolete.\n this.pendingBackendInitId++;\n }\n if (backendName in this.registry) {\n this.disposeRegisteredKernels(backendName);\n this.registry[backendName].dispose();\n delete this.registry[backendName];\n }\n delete this.registryFactory[backendName];\n // Unset the backend if it is active.\n if (this.backendName === backendName) {\n this.pendingBackendInit = null;\n this.backendName = null;\n this.backendInstance = null;\n }\n }\n getSortedBackends() {\n if (Object.keys(this.registryFactory).length === 0) {\n throw new Error('No backend found in registry.');\n }\n return Object.keys(this.registryFactory).sort((a, b) => {\n // Highest priority comes first.\n return this.registryFactory[b].priority -\n this.registryFactory[a].priority;\n });\n }\n initializeBackendsAndReturnBest() {\n const sortedBackends = this.getSortedBackends();\n for (let i = 0; i < sortedBackends.length; i++) {\n const backendName = sortedBackends[i];\n const { success, asyncInit } = this.initializeBackend(backendName);\n if (asyncInit || success) {\n return { name: backendName, asyncInit };\n }\n }\n throw new Error(`Could not initialize any backends, all backend initializations ` +\n `failed.`);\n }\n moveData(backend, dataId) {\n const info = this.state.tensorInfo.get(dataId);\n const srcBackend = info.backend;\n const values = this.readSync(dataId);\n const refCount = srcBackend.refCount(dataId);\n // Delete the tensor from the old backend and move it to the new\n // backend.\n srcBackend.disposeData(dataId, true);\n info.backend = backend;\n backend.move(dataId, values, info.shape, info.dtype, refCount);\n if (this.shouldCheckForMemLeaks()) {\n // Track the number of moves during a kernel execution to correctly\n // detect memory leaks.\n this.state.numDataMovesStack[this.state.numDataMovesStack.length - 1]++;\n }\n }\n tidy(nameOrFn, fn) {\n let name = null;\n if (fn == null) {\n // Called with only 1 argument.\n if (typeof nameOrFn !== 'function') {\n throw new Error('Please provide a function to tidy()');\n }\n fn = nameOrFn;\n }\n else {\n // Called with 2 arguments.\n if (typeof nameOrFn !== 'string' && !(nameOrFn instanceof String)) {\n throw new Error('When calling with two arguments, the first argument ' +\n 'to tidy() must be a string');\n }\n if (typeof fn !== 'function') {\n throw new Error('When calling with two arguments, the 2nd argument ' +\n 'to tidy() must be a function');\n }\n name = nameOrFn;\n // TODO(nsthorat,smilkov): Do operation logging and performance\n // profiling.\n }\n let result;\n return this.scopedRun(() => this.startScope(name), () => this.endScope(result), () => {\n result = fn();\n if (result instanceof Promise) {\n console.error('Cannot return a Promise inside of tidy.');\n }\n return result;\n });\n }\n scopedRun(start, end, f) {\n start();\n try {\n const res = f();\n end();\n return res;\n }\n catch (ex) {\n end();\n throw ex;\n }\n }\n nextTensorId() {\n return Engine.nextTensorId++;\n }\n nextVariableId() {\n return Engine.nextVariableId++;\n }\n /**\n * This method is called instead of the public-facing tensor.clone() when\n * saving a tensor for backwards pass. It makes sure to add the clone\n * operation to the tape regardless of being called inside a kernel\n * execution.\n */\n clone(x) {\n const y = ENGINE.runKernel(Identity, { x });\n const inputs = { x };\n const grad = (dy) => ({\n x: () => {\n const dtype = 'float32';\n const gradInputs = { x: dy };\n const attrs = { dtype };\n return ENGINE.runKernel(Cast, gradInputs, \n // tslint:disable-next-line: no-unnecessary-type-assertion\n attrs);\n }\n });\n const saved = [];\n this.addTapeNode(this.state.activeScope.name, inputs, [y], grad, saved, {});\n return y;\n }\n /**\n * Execute a kernel with the given name and return the output tensor.\n *\n * @param kernelName The name of the kernel to execute.\n * @param inputs A map of input names to tensors.\n * @param attrs A map of attribute names to their values. An attribute is a\n * primitive (non-tensor) input to the kernel.\n * @param inputsToSave A list of tensors, inputs to save for the backprop\n * computation.\n * @param outputsToSave A list of booleans, specifying which output to save\n * for the backprop computation. These are booleans since the output\n * tensors are not visible to the user.\n */\n runKernel(kernelName, inputs, attrs) {\n if (this.backendName == null) {\n // backend has not been initialized yet (backend initialization is lazy\n // can be deferred until an op/ kernel is run).\n // The below getter has side effects that will try to initialize the\n // backend and set properties like this.backendName\n // tslint:disable-next-line: no-unused-expression\n this.backend;\n }\n const hasKernel = getKernel(kernelName, this.backendName) != null;\n if (!hasKernel) {\n throw new Error(`Kernel '${kernelName}' not registered for backend '${this.backendName}'`);\n }\n return this.runKernelFunc({ kernelName, inputs, attrs });\n }\n shouldCheckForMemLeaks() {\n return this.ENV.getBool('IS_TEST');\n }\n checkKernelForMemLeak(kernelName, numDataIdsBefore, outInfos) {\n const numDataIdsAfter = this.backend.numDataIds();\n // Count the number of data ids associated with the result of the kernel.\n let numOutputDataIds = 0;\n outInfos.forEach(info => {\n // Complex numbers allocate 3 data ids, one for 'real', one for\n // 'imaginary', and one for the container that holds the former two.\n numOutputDataIds += (info.dtype === 'complex64' ? 3 : 1);\n });\n // Account for the number of moves during kernel execution. A \"data move\"\n // can happen in the middle of a kernel execution, placing a new (key,value)\n // pair in the data storage. Since data moves have net zero effect (we\n // always remove the data from the old backend), we have to cancel them out\n // when detecting memory leaks.\n const numMoves = this.state.numDataMovesStack[this.state.numDataMovesStack.length - 1];\n const dataIdsLeaked = numDataIdsAfter - numDataIdsBefore - numOutputDataIds - numMoves;\n if (dataIdsLeaked > 0) {\n throw new Error(`Backend '${this.backendName}' has an internal memory leak ` +\n `(${dataIdsLeaked} data ids) after running '${kernelName}'`);\n }\n }\n /**\n * Internal helper method to execute a kernel Func\n *\n * Use `runKernel` to execute kernels from outside of engine.\n */\n runKernelFunc(kernelParams) {\n let outputs;\n let saved = [];\n const isTapeOn = this.isTapeOn();\n const startingBytecount = this.state.numBytes;\n const startingNumTensors = this.state.numTensors;\n if (this.shouldCheckForMemLeaks()) {\n this.state.numDataMovesStack.push(0);\n }\n let kernelFunc;\n if (this.backendName == null) {\n // backend has not been initialized yet (backend initialization is lazy\n // can be deferred until an op/ kernel is run).\n // The below getter has side effects that will try to initialize the\n // backend and set properties like this.backendName\n // tslint:disable-next-line: no-unused-expression\n this.backend;\n }\n let out;\n const kernelOrScopeName = isRegisteredKernelInvocation(kernelParams) ?\n kernelParams.kernelName :\n this.state.activeScope != null ? this.state.activeScope.name : '';\n // Create the kernelFunc from either a registered kernel OR passed in\n // forward/backward functions (used by custom grad). In this context a\n // kernelFunc wraps a kernel implementation with some bookkeeping.\n if (isRegisteredKernelInvocation(kernelParams)) {\n const { kernelName, inputs, attrs } = kernelParams;\n if (this.backendName == null) {\n // backend has not been initialized yet (backend initialization is lazy\n // can be deferred until an op/ kernel is run).\n // The below getter has side effects that will try to initialize the\n // backend and set properties like this.backendName\n // tslint:disable-next-line: no-unused-expression\n this.backend;\n }\n const kernel = getKernel(kernelName, this.backendName);\n util.assert(kernel != null, () => `Cannot find registered kernel '${kernelName}' for backend '${this.backendName}'`);\n kernelFunc = () => {\n const numDataIdsBefore = this.backend.numDataIds();\n out = kernel.kernelFunc({ inputs, attrs, backend: this.backend });\n const outInfos = Array.isArray(out) ? out : [out];\n if (this.shouldCheckForMemLeaks()) {\n this.checkKernelForMemLeak(kernelName, numDataIdsBefore, outInfos);\n }\n const outTensors = outInfos.map((outInfo) => {\n // todo (yassogba) remove this option (Tensor) when node backend\n // methods have been modularized and they all return tensorInfo.\n // TensorInfos do not have a rank attribute.\n if (outInfo.rank != null) {\n return outInfo;\n }\n return this.makeTensorFromTensorInfo(outInfo);\n });\n // Save any required inputs and outputs.\n // Do not save unless we are recording to the tape. Otherwise it would\n // cause a mem leak since there would be no backprop for these tensors\n // (which would otherwise dispose them).\n if (isTapeOn) {\n const tensorsToSave = this.getTensorsForGradient(kernelName, inputs, outTensors);\n saved = this.saveTensorsForBackwardMode(tensorsToSave);\n }\n return outTensors;\n };\n }\n else {\n const { forwardFunc } = kernelParams;\n // Running a customGrad op.\n const saveFunc = (tensors) => {\n // Do not save unless we are recording to the tape. Otherwise it would\n // cause a mem leak since we would never run backprop, which disposes\n // the kept tensors.\n if (!isTapeOn) {\n return;\n }\n saved = tensors.map(tensor => this.keep(this.clone(tensor)));\n };\n kernelFunc = () => {\n const numDataIdsBefore = this.backend.numDataIds();\n out = this.tidy(() => forwardFunc(this.backend, saveFunc));\n const outs = (Array.isArray(out) ? out : [out]);\n if (this.shouldCheckForMemLeaks()) {\n // Scope name is used to print a more helpful error message if needed.\n this.checkKernelForMemLeak(kernelOrScopeName, numDataIdsBefore, outs);\n }\n return outs;\n };\n }\n //\n // Run the kernelFunc. Optionally profiling it.\n //\n const { inputs, attrs } = kernelParams;\n const backwardsFunc = isRegisteredKernelInvocation(kernelParams) ?\n null :\n kernelParams.backwardsFunc;\n let kernelProfile;\n this.scopedRun(\n // Stop recording to a tape when running a kernel.\n () => this.state.kernelDepth++, () => this.state.kernelDepth--, () => {\n if (!this.ENV.getBool('DEBUG') && !this.state.profiling) {\n outputs = kernelFunc();\n }\n else {\n kernelProfile = this.profiler.profileKernel(kernelOrScopeName, inputs, () => kernelFunc());\n if (this.ENV.getBool('DEBUG')) {\n this.profiler.logKernelProfile(kernelProfile);\n }\n outputs = kernelProfile.outputs;\n }\n });\n if (isTapeOn) {\n this.addTapeNode(kernelOrScopeName, inputs, outputs, backwardsFunc, saved, attrs);\n }\n if (this.state.profiling) {\n this.state.activeProfile.kernels.push({\n name: kernelOrScopeName,\n bytesAdded: this.state.numBytes - startingBytecount,\n totalBytesSnapshot: this.state.numBytes,\n tensorsAdded: this.state.numTensors - startingNumTensors,\n totalTensorsSnapshot: this.state.numTensors,\n inputShapes: Object.keys(inputs).map(key => inputs[key] != null ? inputs[key].shape : null),\n outputShapes: outputs.map(item => item.shape),\n kernelTimeMs: kernelProfile.timeMs,\n extraInfo: kernelProfile.extraInfo\n });\n }\n return (Array.isArray(out) ? outputs : outputs[0]);\n }\n /**\n * Saves tensors used in forward mode for use in backward mode.\n *\n * @param tensors the list of tensors to save.\n */\n saveTensorsForBackwardMode(tensors) {\n const saved = tensors.map(tensor => this.keep(this.clone(tensor)));\n return saved;\n }\n /**\n * Returns a list of tensors to save for a given gradient calculation.\n *\n * @param kernelName name of kernel to look up gradient for.\n * @param inputs a map of input tensors.\n * @param outputs an array of output tensors from forward mode of kernel.\n */\n getTensorsForGradient(kernelName, inputs, outputs) {\n const gradConfig = getGradient(kernelName);\n if (gradConfig != null) {\n const inputsToSave = gradConfig.inputsToSave || [];\n const outputsToSave = gradConfig.outputsToSave || [];\n // If saveAllInputs is true, all inputs will be saved. Otherwise, inputs\n // specified in inputsToSave will be saved.\n let inputTensorsToSave;\n if (gradConfig.saveAllInputs) {\n util.assert(Array.isArray(inputs), () => 'saveAllInputs is true, expected inputs to be an array.');\n inputTensorsToSave = Object.keys(inputs).map((key) => inputs[key]);\n }\n else {\n inputTensorsToSave = inputsToSave.map((inputName) => inputs[inputName]);\n }\n const outputTensorsToSave = outputs.filter((_, i) => outputsToSave[i]);\n return inputTensorsToSave.concat(outputTensorsToSave);\n }\n // We return an empty list rather than throw an error because the kernel we\n // are looking up may not actually be relevant to backproping through the\n // overall function\n //\n // See 'does not error if irrelevant (pruned) ops are missing grads' test\n // in gradients_test.ts for an example.\n return [];\n }\n /**\n * Internal method used by public APIs for tensor creation. Makes a new\n * tensor with the provided shape, dtype and values. It always\n * creates a new data id and writes the values to the underlying backend.\n */\n makeTensor(values, shape, dtype, backend) {\n if (values == null) {\n throw new Error('Values passed to engine.makeTensor() are null');\n }\n dtype = dtype || 'float32';\n backend = backend || this.backend;\n let backendVals = values;\n if (dtype === 'string' && util.isString(values[0])) {\n backendVals = values.map(d => util.encodeString(d));\n }\n const dataId = backend.write(backendVals, shape, dtype);\n const t = new Tensor(shape, dtype, dataId, this.nextTensorId());\n this.trackTensor(t, backend);\n // Count bytes for string tensors.\n if (dtype === 'string') {\n const info = this.state.tensorInfo.get(dataId);\n const newBytes = bytesFromStringArray(backendVals);\n this.state.numBytes += newBytes - info.bytes;\n info.bytes = newBytes;\n }\n return t;\n }\n /**\n * Internal method used by backends. Makes a new tensor\n * that is a wrapper around an existing data id. It doesn't create\n * a new data id, only increments the ref count used in memory tracking.\n * @deprecated\n */\n makeTensorFromDataId(dataId, shape, dtype, backend) {\n dtype = dtype || 'float32';\n const tensorInfo = { dataId, shape, dtype };\n return this.makeTensorFromTensorInfo(tensorInfo, backend);\n }\n /**\n * Internal method used by backends. Makes a new tensor that is a wrapper\n * around an existing data id in TensorInfo. It doesn't create a new data id,\n * only increments the ref count used in memory tracking.\n */\n makeTensorFromTensorInfo(tensorInfo, backend) {\n const { dataId, shape, dtype } = tensorInfo;\n const t = new Tensor(shape, dtype, dataId, this.nextTensorId());\n this.trackTensor(t, backend);\n return t;\n }\n makeVariable(initialValue, trainable = true, name, dtype) {\n name = name || this.nextVariableId().toString();\n if (dtype != null && dtype !== initialValue.dtype) {\n initialValue = initialValue.cast(dtype);\n }\n const v = new Variable(initialValue, trainable, name, this.nextTensorId());\n if (this.state.registeredVariables[v.name] != null) {\n throw new Error(`Variable with name ${v.name} was already registered`);\n }\n this.state.registeredVariables[v.name] = v;\n this.incRef(v, this.backend);\n return v;\n }\n trackTensor(a, backend) {\n this.state.numTensors++;\n if (a.dtype === 'string') {\n this.state.numStringTensors++;\n }\n // Bytes for complex numbers are counted by their components. Bytes for\n // string tensors are counted when writing values.\n let bytes = 0;\n if (a.dtype !== 'complex64' && a.dtype !== 'string') {\n bytes = a.size * util.bytesPerElement(a.dtype);\n }\n this.state.numBytes += bytes;\n if (!this.state.tensorInfo.has(a.dataId)) {\n this.state.numDataBuffers++;\n this.state.tensorInfo.set(a.dataId, {\n backend: backend || this.backend,\n dtype: a.dtype,\n shape: a.shape,\n bytes\n });\n }\n if (!(a instanceof Variable)) {\n this.track(a);\n }\n }\n // Track the tensor by dataId and increase the refCount for the dataId in the\n // backend.\n // TODO(pyu10055): This is currently used by makeVariable method, to increase\n // refCount on the backend for the dataId. It can potentially be replaced with\n // Identity op indead of calling backend directly.\n incRef(a, backend) {\n this.trackTensor(a, backend);\n this.backend.incRef(a.dataId);\n }\n removeDataId(dataId, backend) {\n if (this.state.tensorInfo.has(dataId) &&\n this.state.tensorInfo.get(dataId).backend === backend) {\n this.state.tensorInfo.delete(dataId);\n this.state.numDataBuffers--;\n }\n }\n disposeTensor(a) {\n if (!this.state.tensorInfo.has(a.dataId)) {\n return;\n }\n const info = this.state.tensorInfo.get(a.dataId);\n this.state.numTensors--;\n if (a.dtype === 'string') {\n this.state.numStringTensors--;\n this.state.numBytes -= info.bytes;\n }\n // Don't count bytes for complex numbers as they are counted by their\n // components.\n if (a.dtype !== 'complex64' && a.dtype !== 'string') {\n const bytes = a.size * util.bytesPerElement(a.dtype);\n this.state.numBytes -= bytes;\n }\n // Remove the reference to dataId if backend dispose the data successfully\n if (info.backend.disposeData(a.dataId)) {\n this.removeDataId(a.dataId, info.backend);\n }\n // TODO(nsthorat): Construct an error and save the stack trace for\n // debugging when in debug mode. Creating a stack trace is too expensive\n // to do unconditionally.\n }\n disposeVariables() {\n for (const varName in this.state.registeredVariables) {\n const v = this.state.registeredVariables[varName];\n this.disposeVariable(v);\n }\n }\n disposeVariable(v) {\n this.disposeTensor(v);\n if (this.state.registeredVariables[v.name] != null) {\n delete this.state.registeredVariables[v.name];\n }\n }\n memory() {\n const info = this.backend.memory();\n info.numTensors = this.state.numTensors;\n info.numDataBuffers = this.state.numDataBuffers;\n info.numBytes = this.state.numBytes;\n if (this.state.numStringTensors > 0) {\n info.unreliable = true;\n if (info.reasons == null) {\n info.reasons = [];\n }\n info.reasons.push('Memory usage by string tensors is approximate ' +\n '(2 bytes per character)');\n }\n return info;\n }\n async profile(query) {\n this.state.profiling = true;\n const startBytes = this.state.numBytes;\n const startNumTensors = this.state.numTensors;\n this.state.activeProfile.kernels = [];\n this.state.activeProfile.result = await query();\n this.state.profiling = false;\n this.state.activeProfile.peakBytes = Math.max(...this.state.activeProfile.kernels.map(d => d.totalBytesSnapshot));\n this.state.activeProfile.newBytes = this.state.numBytes - startBytes;\n this.state.activeProfile.newTensors =\n this.state.numTensors - startNumTensors;\n for (const kernel of this.state.activeProfile.kernels) {\n kernel.kernelTimeMs = await kernel.kernelTimeMs;\n kernel.extraInfo = await kernel.extraInfo;\n }\n return this.state.activeProfile;\n }\n isTapeOn() {\n return this.state.gradientDepth > 0 && this.state.kernelDepth === 0;\n }\n addTapeNode(kernelName, inputs, outputs, gradientsFunc, saved, attrs) {\n const tapeNode = { id: this.state.nextTapeNodeId++, kernelName, inputs, outputs, saved };\n const gradConfig = getGradient(kernelName);\n if (gradConfig != null) {\n gradientsFunc = gradConfig.gradFunc;\n }\n if (gradientsFunc != null) {\n tapeNode.gradient = (dys) => {\n // TODO(smilkov): To optimize back-prop, pass dys that are not used in\n // the backprop graph to the user as null instead of zeros\n dys = dys.map((dy, i) => {\n if (dy == null) {\n const output = outputs[i];\n const vals = util.makeZerosTypedArray(output.size, output.dtype);\n return this.makeTensor(vals, output.shape, output.dtype);\n }\n return dy;\n });\n // Grad functions of ops with single outputs expect a dy, while ops\n // with multiple outputs expect dys (array of dy).\n return gradientsFunc(dys.length > 1 ? dys : dys[0], saved, attrs);\n };\n }\n this.state.activeTape.push(tapeNode);\n }\n keep(result) {\n result.kept = true;\n return result;\n }\n startTape() {\n if (this.state.gradientDepth === 0) {\n this.state.activeTape = [];\n }\n this.state.gradientDepth++;\n }\n endTape() {\n this.state.gradientDepth--;\n }\n /**\n * Start a scope. Use this with endScope() to achieve the same functionality\n * as scope() without the need for a function closure.\n */\n startScope(name) {\n const scopeInfo = {\n track: [],\n name: 'unnamed scope',\n id: this.state.nextScopeId++\n };\n if (name) {\n scopeInfo.name = name;\n }\n this.state.scopeStack.push(scopeInfo);\n this.state.activeScope = scopeInfo;\n }\n /**\n * End a scope. Use this with startScope() to achieve the same functionality\n * as scope() without the need for a function closure.\n */\n endScope(result) {\n const tensorsToTrackInParent = getTensorsInContainer(result);\n const tensorsToTrackInParentSet = new Set(tensorsToTrackInParent.map(t => t.id));\n // Dispose the arrays tracked in this scope.\n for (let i = 0; i < this.state.activeScope.track.length; i++) {\n const tensor = this.state.activeScope.track[i];\n if (!tensor.kept && !tensorsToTrackInParentSet.has(tensor.id)) {\n tensor.dispose();\n }\n }\n const oldScope = this.state.scopeStack.pop();\n this.state.activeScope = this.state.scopeStack.length === 0 ?\n null :\n this.state.scopeStack[this.state.scopeStack.length - 1];\n // Track the current result in the parent scope.\n tensorsToTrackInParent.forEach(tensor => {\n // Only track the tensor if was allocated in the inner scope and is not\n // globally kept.\n if (!tensor.kept && tensor.scopeId === oldScope.id) {\n this.track(tensor);\n }\n });\n }\n /**\n * Returns gradients of `f` with respect to each of the `xs`. The gradients\n * returned are of the same length as `xs`, but some might be null if `f`\n * was not a function of that `x`. It also takes optional dy to multiply the\n * gradient, which defaults to `1`.\n */\n gradients(f, xs, dy, allowNoGradients = false) {\n util.assert(xs.length > 0, () => 'gradients() received an empty list of xs.');\n if (dy != null && dy.dtype !== 'float32') {\n throw new Error(`dy must have 'float32' dtype, but has '${dy.dtype}'`);\n }\n const y = this.scopedRun(() => this.startTape(), () => this.endTape(), () => this.tidy('forward', f));\n util.assert(y instanceof Tensor, () => 'The result y returned by f() must be a tensor.');\n // Filter out the nodes that don't connect x => y.\n const filteredTape = getFilteredNodesXToY(this.state.activeTape, xs, y);\n if (!allowNoGradients && filteredTape.length === 0 && xs.length > 0) {\n throw new Error('Cannot compute gradient of y=f(x) with respect to x. Make sure ' +\n 'that the f you passed encloses all operations that lead from x ' +\n 'to y.');\n }\n return this.tidy('backward', () => {\n const accumulatedGradientMap = {};\n accumulatedGradientMap[y.id] = (dy == null) ? ones(y.shape) : dy;\n // Backprop gradients through the filtered nodes.\n backpropagateGradients(accumulatedGradientMap, filteredTape, \n // Pass the tidy function to avoid circular dep with `tape.ts`.\n f => this.tidy(f), \n // Pass an add function to avoide a circular dep with `tape.ts`.\n add);\n const grads = xs.map(x => accumulatedGradientMap[x.id]);\n if (this.state.gradientDepth === 0) {\n // This means that we are not computing higher-order gradients\n // and can clean up the tape.\n this.state.activeTape.forEach(node => {\n for (const tensor of node.saved) {\n tensor.dispose();\n }\n });\n this.state.activeTape = null;\n }\n return { value: y, grads };\n });\n }\n customGrad(f) {\n util.assert(util.isFunction(f), () => 'The f passed in customGrad(f) must be a function.');\n return (...inputs) => {\n util.assert(inputs.every(t => t instanceof Tensor), () => 'The args passed in customGrad(f)(x1, x2,...) must all be ' +\n 'tensors');\n let res;\n const inputMap = {};\n inputs.forEach((input, i) => {\n inputMap[i] = input;\n });\n const forwardFunc = (_, save) => {\n res = f(...[...inputs, save]);\n util.assert(res.value instanceof Tensor, () => 'The function f passed in customGrad(f) must return an ' +\n 'object where `obj.value` is a tensor');\n util.assert(util.isFunction(res.gradFunc), () => 'The function f passed in customGrad(f) must return an ' +\n 'object where `obj.gradFunc` is a function.');\n return res.value;\n };\n const backwardsFunc = (dy, saved) => {\n const gradRes = res.gradFunc(dy, saved);\n const grads = Array.isArray(gradRes) ? gradRes : [gradRes];\n util.assert(grads.length === inputs.length, () => 'The function f passed in customGrad(f) must return an ' +\n 'object where `obj.gradFunc` is a function that returns ' +\n 'the same number of tensors as inputs passed to f(...).');\n util.assert(grads.every(t => t instanceof Tensor), () => 'The function f passed in customGrad(f) must return an ' +\n 'object where `obj.gradFunc` is a function that returns ' +\n 'a list of only tensors.');\n const gradMap = {};\n grads.forEach((grad, i) => {\n gradMap[i] = () => grad;\n });\n return gradMap;\n };\n return this.runKernelFunc({\n forwardFunc,\n backwardsFunc,\n inputs: inputMap,\n });\n };\n }\n readSync(dataId) {\n // Route the read to the correct backend.\n const info = this.state.tensorInfo.get(dataId);\n return info.backend.readSync(dataId);\n }\n read(dataId) {\n // Route the read to the correct backend.\n const info = this.state.tensorInfo.get(dataId);\n return info.backend.read(dataId);\n }\n readToGPU(dataId, options) {\n // Route the read to the correct backend.\n const info = this.state.tensorInfo.get(dataId);\n return info.backend.readToGPU(dataId, options);\n }\n async time(query) {\n const start = now();\n const timingInfo = await this.backend.time(query);\n timingInfo.wallMs = now() - start;\n return timingInfo;\n }\n /**\n * Tracks a Tensor in the current scope to be automatically cleaned up\n * when the current scope ends, and returns the value.\n *\n * @param result The Tensor to track in the current scope.\n */\n track(result) {\n if (this.state.activeScope != null) {\n result.scopeId = this.state.activeScope.id;\n this.state.activeScope.track.push(result);\n }\n return result;\n }\n get registeredVariables() {\n return this.state.registeredVariables;\n }\n /**\n * Resets the engine state. Removes all backends but does not remove\n * registered backend factories.\n */\n reset() {\n // Make any pending promise obsolete.\n this.pendingBackendInitId++;\n this.state.dispose();\n this.ENV.reset();\n this.state = new EngineState();\n for (const backendName in this.registry) {\n this.disposeRegisteredKernels(backendName);\n this.registry[backendName].dispose();\n delete this.registry[backendName];\n }\n this.backendName = null;\n this.backendInstance = null;\n this.pendingBackendInit = null;\n }\n}\nEngine.nextTensorId = 0;\nEngine.nextVariableId = 0;\nfunction ones(shape) {\n const values = makeOnesTypedArray(sizeFromShape(shape), 'float32');\n return ENGINE.makeTensor(values, shape, 'float32');\n}\nexport function getOrMakeEngine() {\n const ns = getGlobalNamespace();\n if (ns._tfengine == null) {\n const environment = new Environment(ns);\n ns._tfengine = new Engine(environment);\n }\n setEnvironmentGlobal(ns._tfengine.ENV);\n // Tell the current tensor interface that the global engine is responsible\n // for tracking.\n setTensorTracker(() => ns._tfengine);\n return ns._tfengine;\n}\nexport const ENGINE = getOrMakeEngine();\n/**\n * A implementation of the add op for use within engine and tape.\n *\n * This allows us to avoid a circular dependency between add.ts and engine.\n * It is exported to be available in tape tests.\n */\nexport function add(a, b) {\n // We duplicate Add here to avoid a circular dependency with add.ts.\n const inputs = { a, b };\n return ENGINE.runKernel(Add, inputs);\n}\n//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZW5naW5lLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vdGZqcy1jb3JlL3NyYy9lbmdpbmUudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUE7Ozs7Ozs7Ozs7Ozs7OztHQWVHO0FBRUgsT0FBTyxFQUErQixhQUFhLEVBQUMsTUFBTSxvQkFBb0IsQ0FBQztBQUMvRSxPQUFPLEVBQUMsV0FBVyxFQUFFLG9CQUFvQixFQUFDLE1BQU0sZUFBZSxDQUFDO0FBQ2hFLE9BQU8sRUFBQyxrQkFBa0IsRUFBQyxNQUFNLGVBQWUsQ0FBQztBQUNqRCxPQUFPLEVBQUMsR0FBRyxFQUFFLElBQUksRUFBRSxRQUFRLEVBQUMsTUFBTSxnQkFBZ0IsQ0FBQztBQUNuRCxPQUFPLEVBQUMsV0FBVyxFQUFFLFNBQVMsRUFBRSxvQkFBb0IsRUFBcUMsTUFBTSxtQkFBbUIsQ0FBQztBQUNuSCxPQUFPLEtBQUssR0FBRyxNQUFNLE9BQU8sQ0FBQztBQUM3QixPQUFPLEVBQWdCLFFBQVEsRUFBQyxNQUFNLFlBQVksQ0FBQztBQUNuRCxPQUFPLEVBQUMsc0JBQXNCLEVBQUUsb0JBQW9CLEVBQVcsTUFBTSxRQUFRLENBQUM7QUFDOUUsT0FBTyxFQUFvQyxnQkFBZ0IsRUFBRSxNQUFNLEVBQWlCLFFBQVEsRUFBQyxNQUFNLFVBQVUsQ0FBQztBQUU5RyxPQUFPLEVBQUMscUJBQXFCLEVBQUMsTUFBTSxlQUFlLENBQUM7QUFFcEQsT0FBTyxLQUFLLElBQUksTUFBTSxRQUFRLENBQUM7QUFDL0IsT0FBTyxFQUFDLG9CQUFvQixFQUFFLGtCQUFrQixFQUFFLEdBQUcsRUFBRSxhQUFhLEVBQUMsTUFBTSxRQUFRLENBQUM7QUF1RXBGLFNBQVMsNEJBQTRCLENBRWpDLGdCQUNnQztJQUVsQyxPQUFRLGdCQUFrRCxDQUFDLFVBQVUsSUFBSSxJQUFJLENBQUM7QUFDaEYsQ0FBQztBQUVELE1BQU0sV0FBVztJQUFqQjtRQUNFLHVDQUF1QztRQUN2Qyx3QkFBbUIs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eEJwQyxTQUFTLElBQUksQ0FBQyxLQUFlO0lBQzNCLE1BQU0sTUFBTSxHQUFHLGtCQUFrQixDQUFDLGFBQWEsQ0FBQyxLQUFLLENBQUMsRUFBRSxTQUFTLENBQUMsQ0FBQztJQUNuRSxPQUFPLE1BQU0sQ0FBQyxVQUFVLENBQUMsTUFBTSxFQUFFLEtBQUssRUFBRSxTQUFTLENBQUMsQ0FBQztBQUNyRCxDQUFDO0FBRUQsTUFBTSxVQUFVLGVBQWU7SUFDN0IsTUFBTSxFQUFFLEdBQUcsa0JBQWtCLEVBQStCLENBQUM7SUFDN0QsSUFBSSxFQUFFLENBQUMsU0FBUyxJQUFJLElBQUksRUFBRTtRQUN4QixNQUFNLFdBQVcsR0FBRyxJQUFJLFdBQVcsQ0FBQyxFQUFFLENBQUMsQ0FBQztRQUN4QyxFQUFFLENBQUMsU0FBUyxHQUFHLElBQUksTUFBTSxDQUFDLFdBQVcsQ0FBQyxDQUFDO0tBQ3hDO0lBQ0Qsb0JBQW9CLENBQUMsRUFBRSxDQUFDLFNBQVMsQ0FBQyxHQUFHLENBQUMsQ0FBQztJQUV2QywwRUFBMEU7SUFDMUUsZ0JBQWdCO0lBQ2hCLGdCQUFnQixDQUFDLEdBQUcsRUFBRSxDQUFDLEVBQUUsQ0FBQyxTQUFTLENBQUMsQ0FBQztJQUNyQyxPQUFPLEVBQUUsQ0FBQyxTQUFTLENBQUM7QUFDdEIsQ0FBQztBQUVELE1BQU0sQ0FBQyxNQUFNLE1BQU0sR0FBRyxlQUFlLEVBQUUsQ0FBQztBQUV4Qzs7Ozs7R0FLRztBQUNILE1BQU0sVUFBVSxHQUFHLENBQUMsQ0FBUyxFQUFFLENBQVM7SUFDdEMsb0VBQW9FO0lBQ3BFLE1BQU0sTUFBTSxHQUFHLEVBQUMsQ0FBQyxFQUFFLENBQUMsRUFBQyxDQUFDO0lBQ3RCLE9BQU8sTUFBTSxDQUFDLFNBQVMsQ0FBQyxHQUFHLEVBQUUsTUFBOEIsQ0FBQyxDQUFDO0FBQy9ELENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyIvKipcbiAqIEBsaWNlbnNlXG4gKiBDb3B5cmlnaHQgMjAxOCBHb29nbGUgTExDLiBBbGwgUmlnaHRzIFJlc2VydmVkLlxuICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlIFwiTGljZW5zZVwiKTtcbiAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS5cbiAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdFxuICpcbiAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMFxuICpcbiAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmVcbiAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuIFwiQVMgSVNcIiBCQVNJUyxcbiAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLlxuICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZFxuICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuXG4gKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuICovXG5cbmltcG9ydCB7QmFja2VuZFRpbWluZ0luZm8sIERhdGFNb3ZlciwgS2VybmVsQmFja2VuZH0gZnJvbSAnLi9iYWNrZW5kcy9iYWNrZW5kJztcbmltcG9ydCB7RW52aXJvbm1lbnQsIHNldEVudmlyb25tZW50R2xvYmFsfSBmcm9tICcuL2Vudmlyb25tZW50JztcbmltcG9ydCB7Z2V0R2xvYmFsTmFtZXNwYWNlfSBmcm9tICcuL2dsb2JhbF91dGlsJztcbmltcG9ydCB7QWRkLCBDYXN0LCBJZGVudGl0eX0gZnJvbSAnLi9rZXJuZWxfbmFtZXMnO1xuaW1wb3J0IHtnZXRHcmFkaWVudCwgZ2V0S2VybmVsLCBnZXRLZXJuZWxzRm9yQmFja2VuZCwgR3JhZEZ1bmMsIE5hbWVkQXR0ck1hcCwgVGVuc29ySW5mb30gZnJvbSAnLi9rZXJuZWxfcmVnaXN0cnknO1xuaW1wb3J0ICogYXMgbG9nIGZyb20gJy4vbG9nJztcbmltcG9ydCB7S2VybmVsUHJvZmlsZSwgUHJvZmlsZXJ9IGZyb20gJy4vcHJvZmlsZXInO1xuaW1wb3J0IHtiYWNrcHJvcGFnYXRlR3JhZGllbnRzLCBnZXRGaWx0ZXJlZE5vZGVzWFRvWSwgVGFwZU5vZGV9IGZyb20gJy4vdGFwZSc7XG5pbXBvcnQge0RhdGFJZCwgRGF0YVRvR1BVT3B0aW9ucywgR1BVRGF0YSwgc2V0VGVuc29yVHJhY2tlciwgVGVuc29yLCBUZW5zb3JUcmFja2VyLCBWYXJpYWJsZX0gZnJvbSAnLi90ZW5zb3InO1xuaW1wb3J0IHtHcmFkU2F2ZUZ1bmMsIE5hbWVkVGVuc29yTWFwLCBOYW1lZFZhcmlhYmxlTWFwLCBUZW5zb3JDb250YWluZXJ9IGZyb20gJy4vdGVuc29yX3R5cGVzJztcbmltcG9ydCB7Z2V0VGVuc29yc0luQ29udGFpbmVyfSBmcm9tICcuL3RlbnNvcl91dGlsJztcbmltcG9ydCB7QmFja2VuZFZhbHVlcywgRGF0YVR5cGUsIERhdGFWYWx1ZXN9IGZyb20gJy4vdHlwZXMnO1xuaW1wb3J0ICogYXMgdXRpbCBmcm9tICcuL3V0aWwnO1xuaW1wb3J0IHtieXRlc0Zyb21TdHJpbmdBcnJheSwgbWFrZU9uZXNUeXBlZEFycmF5LCBub3csIHNpemVGcm9tU2hhcGV9IGZyb20gJy4vdXRpbCc7XG5cbi8qKlxuICogQSBmdW5jdGlvbiB0aGF0IGNvbXB1dGVzIGFuIG91dHB1dC4gVGhlIHNhdmUgZnVuY3Rpb24gaXMgZm9yIHNhdmluZyB0ZW5zb3JzXG4gKiBjb21wdXRlZCBpbiB0aGUgZm9yd2FyZCBwYXNzLCB0aGF0IHdlIG5lZWQgaW4gdGhlIGJhY2t3YXJkIHBhc3MuXG4gKi9cbmV4cG9ydCB0eXBlIEZvcndhcmRGdW5jPFQ+ID0gKGJhY2tlbmQ6IEtlcm5lbEJhY2tlbmQsIHNhdmU/OiBHcmFkU2F2ZUZ1bmMpID0+IFQ7XG5cbi8qKlxuICogQGRvY2FsaWFzIChhOiBUZW5zb3IsIGI6IFRlbnNvciwuLi4sIHNhdmU/OiBGdW5jdGlvbikgPT4ge1xuICogICB2YWx1ZTogVGVuc29yLFxuICogICBncmFkRnVuYzogKGR5OiBUZW5zb3IsIHNhdmVkPzogTmFtZWRUZW5zb3JNYXApID0+IFRlbnNvciB8IFRlbnNvcltdXG4gKiB9XG4gKi9cbmV4cG9ydCB0eXBlIEN1c3RvbUdyYWRpZW50RnVuYzxUIGV4dGVuZHMgVGVuc29yPiA9XG4gICAgKC4uLmlucHV0czogQXJyYXk8VGVuc29yfEdyYWRTYXZlRnVuYz4pID0+IHtcbiAgICAgIHZhbHVlOiBUO1xuICAgICAgZ3JhZEZ1bmM6IChkeTogVCwgc2F2ZWQ6IFRlbnNvcltdKSA9PiBUZW5zb3IgfCBUZW5zb3JbXTtcbiAgICB9O1xuXG5leHBvcnQgdHlwZSBNZW1vcnlJbmZvID0ge1xuICBudW1UZW5zb3JzOiBudW1iZXI7IG51bURhdGFCdWZmZXJzOiBudW1iZXI7IG51bUJ5dGVzOiBudW1iZXI7XG4gIHVucmVsaWFibGU/OiBib29sZWFuOyByZWFzb25zOiBzdHJpbmdbXTtcbn07XG5cbnR5cGUgS2VybmVsSW5mbyA9IHtcbiAgbmFtZTogc3RyaW5nOyBieXRlc0FkZGVkOiBudW1iZXI7IHRvdGFsQnl0ZXNTbmFwc2hvdDogbnVtYmVyO1xuICB0ZW5zb3JzQWRkZWQ6IG51bWJlcjtcbiAgdG90YWxUZW5zb3JzU25hcHNob3Q6IG51bWJlcjtcbiAgaW5wdXRTaGFwZXM6IG51bWJlcltdW107XG4gIG91dHB1dFNoYXBlczogbnVtYmVyW11bXTtcbiAga2VybmVsVGltZU1zOiBudW1iZXIgfCB7ZXJyb3I6IHN0cmluZ30gfCBQcm9taXNlPG51bWJlcnx7ZXJyb3I6IHN0cmluZ30+O1xuICBleHRyYUluZm86IHN0cmluZyB8IFByb21pc2U8c3RyaW5nPjtcbn07XG5cbmV4cG9ydCB0eXBlIFByb2ZpbGVJbmZvID0ge1xuICBuZXdCeXRlczogbnVtYmVyOyBuZXdUZW5zb3JzOiBudW1iZXI7IHBlYWtCeXRlczogbnVtYmVyO1xuICBrZXJuZWxzOiBLZXJuZWxJbmZvW107XG4gIHJlc3VsdDogVGVuc29yQ29udGFpbmVyO1xuICBrZXJuZWxOYW1lczogc3RyaW5nW107XG59O1xuXG5leHBvcnQgaW50ZXJmYWNlIFRpbWluZ0luZm8gZXh0ZW5kcyBCYWNrZW5kVGltaW5nSW5mbyB7XG4gIHdhbGxNczogbnVtYmVyO1xufVxuXG4vKiogQGRvY2FsaWFzIEZ1bmN0aW9uICovXG5leHBvcnQgdHlwZSBTY29wZUZuPFQgZXh0ZW5kcyBUZW5zb3JDb250YWluZXI+ID0gKCkgPT4gVDtcblxuaW50ZXJmYWNlIFNjb3BlU3RhdGUge1xuICB0cmFjazogVGVuc29yW107XG4gIG5hbWU6IHN0cmluZztcbiAgaWQ6IG51bWJlcjtcbn1cblxuaW50ZXJmYWNlIFJlZ2lzdGVyZWRLZXJuZWxJbnZvY2F0aW9uPEkgZXh0ZW5kcyBOYW1lZFRlbnNvck1hcD4ge1xuICBrZXJuZWxOYW1lOiBzdHJpbmc7XG4gIGlucHV0czogSTtcbiAgYXR0cnM/OiBOYW1lZEF0dHJNYXA7XG59XG5cbmludGVyZmFjZSBDdXN0b21HcmFkS2VybmVsSW52b2NhdGlvbjxUIGV4dGVuZHMgVGVuc29yfFRlbnNvcltdLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBJIGV4dGVuZHMgTmFtZWRUZW5zb3JNYXA+IHtcbiAgZm9yd2FyZEZ1bmM6IEZvcndhcmRGdW5jPFQ+O1xuICBiYWNrd2FyZHNGdW5jOiAoZHk6IFQsIHNhdmVkOiBUZW5zb3JbXSkgPT4ge1xuICAgIFtQIGluIGtleW9mIEldOiAoKSA9PiBJW1BdXG4gIH07XG4gIGlucHV0czogSTtcbiAgYXR0cnM/OiBOYW1lZEF0dHJNYXA7XG59XG5cbmZ1bmN0aW9uIGlzUmVnaXN0ZXJlZEtlcm5lbEludm9jYXRpb248VCBleHRlbmRzIFRlbnNvcnxUZW5zb3JbXSxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEkgZXh0ZW5kcyBOYW1lZFRlbnNvck1hcD4oXG4gICAga2VybmVsSW52b2NhdGlvbjogUmVnaXN0ZXJlZEtlcm5lbEludm9jYXRpb248ST58XG4gICAgQ3VzdG9tR3JhZEtlcm5lbEludm9jYXRpb248VCwgST4pOlxuICAgIGtlcm5lbEludm9jYXRpb24gaXMgUmVnaXN0ZXJlZEtlcm5lbEludm9jYXRpb248ST4ge1xuICByZXR1cm4gKGtlcm5lbEludm9jYXRpb24gYXMgUmVnaXN0ZXJlZEtlcm5lbEludm9jYXRpb248ST4pLmtlcm5lbE5hbWUgIT0gbnVsbDtcbn1cblxuY2xhc3MgRW5naW5lU3RhdGUge1xuICAvLyBQdWJsaWMgc2luY2Ugb3B0aW1pemVycyB3aWxsIHVzZSBpdC5cbiAgcmVnaXN0ZXJlZFZhcmlhYmxlczogTmFtZWRWYXJpYWJsZU1hcCA9IHt9O1xuXG4gIG5leHRUYXBlTm9kZUlkID0gMDtcbiAgbnVtQnl0ZXMgPSAwO1xuICBudW1UZW5zb3JzID0gMDtcbiAgbnVtU3RyaW5nVGVuc29ycyA9IDA7XG4gIG51bURhdGFCdWZmZXJzID0gMDtcblxuICBhY3RpdmVUYXBlOiBUYXBlTm9kZVtdO1xuICAvLyBOdW1iZXIgb2YgbmVzdGVkIHRmLmdyYWQoKSBzdGF0ZW1lbnRzIHdoZW4gY29tcHV0aW5nIGhpZ2hlci1vcmRlclxuICAvLyBncmFkaWVudHMuIEUuZy4gYDFgIGZvciBmaXJzdC1vcmRlciBncmFkaWVudHMgYW5kIGAyYCBmb3Igc2Vjb25kLW9yZGVyXG4gIC8vIGdyYWRpZW50cy4gVXNlZCB0byB0cmFjayBpZiB0aGUgdGFwZSBzaG91bGQgYmUgcmVtb3ZlZCBhZnRlciBhIGJhY2twcm9wLlxuICBncmFkaWVudERlcHRoID0gMDtcbiAgLy8gTnVtYmVyIG9mIG5lc3RlZCBrZXJuZWwgY2FsbHMuIFdoZW4ga2VybmVsIGRlcHRoIGlzIGdyZWF0ZXIgdGhhbiAxLCB3ZSB0dXJuXG4gIC8vIG9mZiB0aGUgdGFwZS5cbiAga2VybmVsRGVwdGggPSAwO1xuXG4gIC8vIEtlZXAgVGVuc29ycyB0aGF0IHBhcmFsbGVsIHRoZSB0YXBlcy5cbiAgYWN0aXZlU2NvcGU6IFNjb3BlU3RhdGU7XG4gIHNjb3BlU3RhY2s6IFNjb3BlU3RhdGVbXSA9IFtdO1xuICAvKipcbiAgICogS2VlcHMgdHJhY2sgb2YgdGhlIG51bWJlciBvZiBkYXRhIG1vdmVzIGR1cmluZyBhIGtlcm5lbCBleGVjdXRpb24uIFdlXG4gICAqIG1haW50YWluIGEgc3RhY2sgc2luY2Uga2VybmVscyBjYW4gY2FsbCBvdGhlciBrZXJuZWxzLCByZWN1cnNpdmVseS5cbiAgICovXG4gIG51bURhdGFNb3Zlc1N0YWNrOiBudW1iZXJbXSA9IFtdO1xuICBuZXh0U2NvcGVJZCA9IDA7XG5cbiAgdGVuc29ySW5mbyA9IG5ldyBXZWFrTWFwPERhdGFJZCwge1xuICAgIGJhY2tlbmQ6IEtlcm5lbEJhY2tlbmQsXG4gICAgYnl0ZXM6IG51bWJlcixcbiAgICBkdHlwZTogRGF0YVR5cGUsXG4gICAgc2hhcGU6IG51bWJlcltdXG4gIH0+KCk7XG5cbiAgcHJvZmlsaW5nID0gZmFsc2U7XG4gIGFjdGl2ZVByb2ZpbGU6IFByb2ZpbGVJbmZvID0ge1xuICAgIG5ld0J5dGVzOiAwLFxuICAgIG5ld1RlbnNvcnM6IDAsXG4gICAgcGVha0J5dGVzOiAwLFxuICAgIGtlcm5lbHM6IFtdLFxuICAgIHJlc3VsdDogbnVsbCxcbiAgICBnZXQga2VybmVsTmFtZXMoKTpcbiAgICAgICAgc3RyaW5nW10ge1xuICAgICAgICAgIHJldHVybiBBcnJheS5mcm9tKG5ldyBTZXQodGhpcy5rZXJuZWxzLm1hcChrID0+IGsubmFtZSkpKTtcbiAgICAgICAgfVxuICB9O1xuXG4gIGRpc3Bvc2UoKSB7XG4gICAgZm9yIChjb25zdCB2YXJpYWJsZU5hbWUgaW4gdGhpcy5yZWdpc3RlcmVkVmFyaWFibGVzKSB7XG4gICAgICB0aGlzLnJlZ2lzdGVyZWRWYXJpYWJsZXNbdmFyaWFibGVOYW1lXS5kaXNwb3NlKCk7XG4gICAgfVxuICB9XG59XG5cbmV4cG9ydCBjbGFzcyBFbmdpbmUgaW1wbGVtZW50cyBUZW5zb3JUcmFja2VyLCBEYXRhTW92ZXIge1xuICBzdGF0ZTogRW5naW5lU3RhdGU7XG4gIGJhY2tlbmROYW1lOiBzdHJpbmc7XG4gIHJlZ2lzdHJ5OiB7W2lkOiBzdHJpbmddOiBLZXJuZWxCYWNrZW5kfSA9IHt9O1xuICByZWdpc3RyeUZhY3Rvcnk6IHtcbiAgICBbaWQ6IHN0cmluZ106IHtcbiAgICAgIGZhY3Rvcnk6ICgpID0+IEtlcm5lbEJhY2tlbmQgfCBQcm9taXNlPEtlcm5lbEJhY2tlbmQ+LFxuICAgICAgcHJpb3JpdHk6IG51bWJlclxuICAgIH1cbiAgfSA9IHt9O1xuXG4gIHByaXZhdGUgcHJvZmlsZXI6IFByb2ZpbGVyO1xuICBwcml2YXRlIGJhY2tlbmRJbnN0YW5jZTogS2VybmVsQmFja2VuZDtcbiAgcHJpdmF0ZSBwZW5kaW5nQmFja2VuZEluaXQ6IFByb21pc2U8Ym9vbGVhbj47XG4gIHByaXZhdGUgcGVuZGluZ0JhY2tlbmRJbml0SWQgPSAwO1xuXG4gIGNvbnN0cnVjdG9yKHB1YmxpYyBFTlY6IEVudmlyb25tZW50KSB7XG4gICAgdGhpcy5zdGF0ZSA9IG5ldyBFbmdpbmVTdGF0ZSgpO1xuICB9XG5cbiAgYXN5bmMgcmVhZHkoKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgaWYgKHRoaXMucGVuZGluZ0JhY2tlbmRJbml0ICE9IG51bGwpIHtcbiAgICAgIHJldHVybiB0aGlzLnBlbmRpbmdCYWNrZW5kSW5pdC50aGVuKCgpID0+IHt9KTtcbiAgICB9XG4gICAgaWYgKHRoaXMuYmFja2VuZEluc3RhbmNlICE9IG51bGwpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgY29uc3Qgc29ydGVkQmFja2VuZHMgPSB0aGlzLmdldFNvcnRlZEJhY2tlbmRzKCk7XG5cbiAgICBmb3IgKGxldCBpID0gMDsgaSA8IHNvcnRlZEJhY2tlbmRzLmxlbmd0aDsgaSsrKSB7XG4gICAgICBjb25zdCBiYWNrZW5kTmFtZSA9IHNvcnRlZEJhY2tlbmRzW2ldO1xuICAgICAgY29uc3Qgc3VjY2VzcyA9IGF3YWl0IHRoaXMuaW5pdGlhbGl6ZUJhY2tlbmQoYmFja2VuZE5hbWUpLnN1Y2Nlc3M7XG4gICAgICBpZiAoc3VjY2Vzcykge1xuICAgICAgICBhd2FpdCB0aGlzLnNldEJhY2tlbmQoYmFja2VuZE5hbWUpO1xuICAgICAgICByZXR1cm47XG4gICAgICB9XG4gICAgfVxuXG4gICAgdGhyb3cgbmV3IEVycm9yKFxuICAgICAgICBgQ291bGQgbm90IGluaXRpYWxpemUgYW55IGJhY2tlbmRzLCBhbGwgYmFja2VuZCBpbml0aWFsaXphdGlvbnMgYCArXG4gICAgICAgIGBmYWlsZWQuYCk7XG4gIH1cblxuICBnZXQgYmFja2VuZCgpOiBLZXJuZWxCYWNrZW5kIHtcbiAgICBpZiAodGhpcy5wZW5kaW5nQmFja2VuZEluaXQgIT0gbnVsbCkge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKFxuICAgICAgICAgIGBCYWNrZW5kICcke3RoaXMuYmFja2VuZE5hbWV9JyBoYXMgbm90IHlldCBiZWVuIGluaXRpYWxpemVkLiBNYWtlIGAgK1xuICAgICAgICAgIGBzdXJlIHRvIGF3YWl0IHRmLnJlYWR5KCkgb3IgYXdhaXQgdGYuc2V0QmFja2VuZCgpIGJlZm9yZSBjYWxsaW5nIGAgK1xuICAgICAgICAgIGBvdGhlciBtZXRob2RzYCk7XG4gICAgfVxuICAgIGlmICh0aGlzLmJhY2tlbmRJbnN0YW5jZSA9PSBudWxsKSB7XG4gICAgICBjb25zdCB7bmFtZSwgYXN5bmNJbml0fSA9IHRoaXMuaW5pdGlhbGl6ZUJhY2tlbmRzQW5kUmV0dXJuQmVzdCgpO1xuICAgICAgaWYgKGFzeW5jSW5pdCkge1xuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoXG4gICAgICAgICAgICBgVGhlIGhpZ2hlc3QgcHJpb3JpdHkgYmFja2VuZCAnJHtuYW1lfScgaGFzIG5vdCB5ZXQgYmVlbiBgICtcbiAgICAgICAgICAgIGBpbml0aWFsaXplZC4gTWFrZSBzdXJlIHRvIGF3YWl0IHRmLnJlYWR5KCkgb3IgYCArXG4gICAgICAgICAgICBgYXdhaXQgdGYuc2V0QmFja2VuZCgpIGJlZm9yZSBjYWxsaW5nIG90aGVyIG1ldGhvZHNgKTtcbiAgICAgIH1cbiAgICAgIHRoaXMuc2V0QmFja2VuZChuYW1lKTtcbiAgICB9XG4gICAgcmV0dXJuIHRoaXMuYmFja2VuZEluc3RhbmNlO1xuICB9XG5cbiAgYmFja2VuZE5hbWVzKCk6IHN0cmluZ1tdIHtcbiAgICByZXR1cm4gT2JqZWN0LmtleXModGhpcy5yZWdpc3RyeUZhY3RvcnkpO1xuICB9XG5cbiAgZmluZEJhY2tlbmQoYmFja2VuZE5hbWU6IHN0cmluZyk6IEtlcm5lbEJhY2tlbmQge1xuICAgIGlmICghKGJhY2tlbmROYW1lIGluIHRoaXMucmVnaXN0cnkpKSB7XG4gICAgICAvLyBJZiB0aGUgYmFja2VuZCBoYXNuJ3QgYmVlbiBpbml0aWFsaXplZCBidXQgd2UgaGF2ZSBhIHJlZ2lzdHJ5IGVudHJ5IGZvclxuICAgICAgLy8gaXQsIGluaXRpYWxpemUgaXQgYW5kIHJldHVybiBpdC5cbiAgICAgIGlmIChiYWNrZW5kTmFtZSBpbiB0aGlzLnJlZ2lzdHJ5RmFjdG9yeSkge1xuICAgICAgICBjb25zdCB7YXN5bmNJbml0fSA9IHRoaXMuaW5pdGlhbGl6ZUJhY2tlbmQoYmFja2VuZE5hbWUpO1xuICAgICAgICBpZiAoYXN5bmNJbml0KSB7XG4gICAgICAgICAgLy8gQmFja2VuZCBpcyBub3QgcmVhZHkgeWV0LlxuICAgICAgICAgIHJldHVybiBudWxsO1xuICAgICAgICB9XG4gICAgICB9IGVsc2Uge1xuICAgICAgICByZXR1cm4gbnVsbDtcbiAgICAgIH1cbiAgICB9XG4gICAgcmV0dXJuIHRoaXMucmVnaXN0cnlbYmFja2VuZE5hbWVdO1xuICB9XG5cbiAgZmluZEJhY2tlbmRGYWN0b3J5KGJhY2tlbmROYW1lOiBzdHJpbmcpOlxuICAgICAgKCkgPT4gS2VybmVsQmFja2VuZCB8IFByb21pc2U8S2VybmVsQmFja2VuZD4ge1xuICAgIGlmICghKGJhY2tlbmROYW1lIGluIHRoaXMucmVnaXN0cnlGYWN0b3J5KSkge1xuICAgICAgcmV0dXJuIG51bGw7XG4gICAgfVxuICAgIHJldHVybiB0aGlzLnJlZ2lzdHJ5RmFjdG9yeVtiYWNrZW5kTmFtZV0uZmFjdG9yeTtcbiAgfVxuXG4gIHJlZ2lzdGVyQmFja2VuZChcbiAgICAgIGJhY2tlbmROYW1lOiBzdHJpbmcsXG4gICAgICBmYWN0b3J5OiAoKSA9PiBLZXJuZWxCYWNrZW5kIHwgUHJvbWlzZTxLZXJuZWxCYWNrZW5kPixcbiAgICAgIHByaW9yaXR5ID0gMSk6IGJvb2xlYW4ge1xuICAgIGlmIChiYWNrZW5kTmFtZSBpbiB0aGlzLnJlZ2lzdHJ5RmFjdG9yeSkge1xuICAgICAgbG9nLndhcm4oXG4gICAgICAgICAgYCR7YmFja2VuZE5hbWV9IGJhY2tlbmQgd2FzIGFscmVhZHkgcmVnaXN0ZXJlZC4gYCArXG4gICAgICAgICAgYFJldXNpbmcgZXhpc3RpbmcgYmFja2VuZCBmYWN0b3J5LmApO1xuICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH1cbiAgICB0aGlzLnJlZ2lzdHJ5RmFjdG9yeVtiYWNrZW5kTmFtZV0gPSB7ZmFjdG9yeSwgcHJpb3JpdHl9O1xuICAgIHJldHVybiB0cnVlO1xuICB9XG5cbiAgYXN5bmMgc2V0QmFja2VuZChiYWNrZW5kTmFtZTogc3RyaW5nKTogUHJvbWlzZTxib29sZWFuPiB7XG4gICAgaWYgKHRoaXMucmVnaXN0cnlGYWN0b3J5W2JhY2tlbmROYW1lXSA9PSBudWxsKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoYEJhY2tlbmQgbmFtZSAnJHtiYWNrZW5kTmFtZX0nIG5vdCBmb3VuZCBpbiByZWdpc3RyeWApO1xuICAgIH1cbiAgICB0aGlzLmJhY2tlbmROYW1lID0gYmFja2VuZE5hbWU7XG4gICAgaWYgKHRoaXMucmVnaXN0cnlbYmFja2VuZE5hbWVdID09IG51bGwpIHtcbiAgICAgIHRoaXMuYmFja2VuZEluc3RhbmNlID0gbnVsbDtcbiAgICAgIGNvbnN0IHtzdWNjZXNzLCBhc3luY0luaXR9ID0gdGhpcy5pbml0aWFsaXplQmFja2VuZChiYWNrZW5kTmFtZSk7XG4gICAgICBjb25zdCByZXN1bHQgPSBhc3luY0luaXQgPyBhd2FpdCBzdWNjZXNzIDogc3VjY2VzcztcbiAgICAgIGlmICghcmVzdWx0KSB7XG4gICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgIH1cbiAgICB9XG4gICAgdGhpcy5iYWNrZW5kSW5zdGFuY2UgPSB0aGlzLnJlZ2lzdHJ5W2JhY2tlbmROYW1lXTtcbiAgICB0aGlzLnNldHVwUmVnaXN0ZXJlZEtlcm5lbHMoKTtcbiAgICAvLyBSZXNldCB0aGUgcHJvZmlsZXIuXG4gICAgdGhpcy5wcm9maWxlciA9IG5ldyBQcm9maWxlcih0aGlzLmJhY2tlbmRJbnN0YW5jZSk7XG5cbiAgICByZXR1cm4gdHJ1ZTtcbiAgfVxuXG4gIHByaXZhdGUgc2V0dXBSZWdpc3RlcmVkS2VybmVscygpOiB2b2lkIHtcbiAgICBjb25zdCBrZXJuZWxzID0gZ2V0S2VybmVsc0ZvckJhY2tlbmQodGhpcy5iYWNrZW5kTmFtZSk7XG4gICAga2VybmVscy5mb3JFYWNoKGtlcm5lbCA9PiB7XG4gICAgICBpZiAoa2VybmVsLnNldHVwRnVuYyAhPSBudWxsKSB7XG4gICAgICAgIGtlcm5lbC5zZXR1cEZ1bmModGhpcy5iYWNrZW5kSW5zdGFuY2UpO1xuICAgICAgfVxuICAgIH0pO1xuICB9XG5cbiAgcHJpdmF0ZSBkaXNwb3NlUmVnaXN0ZXJlZEtlcm5lbHMoYmFja2VuZE5hbWU6IHN0cmluZyk6IHZvaWQge1xuICAgIGNvbnN0IGtlcm5lbHMgPSBnZXRLZXJuZWxzRm9yQmFja2VuZChiYWNrZW5kTmFtZSk7XG4gICAga2VybmVscy5mb3JFYWNoKGtlcm5lbCA9PiB7XG4gICAgICBpZiAoa2VybmVsLmRpc3Bvc2VGdW5jICE9IG51bGwpIHtcbiAgICAgICAga2VybmVsLmRpc3Bvc2VGdW5jKHRoaXMucmVnaXN0cnlbYmFja2VuZE5hbWVdKTtcbiAgICAgIH1cbiAgICB9KTtcbiAgfVxuXG4gIC8qKlxuICAgKiBJbml0aWFsaXplcyBhIGJhY2tlbmQgYnkgbG9va2luZyB1cCB0aGUgYmFja2VuZCBuYW1lIGluIHRoZSBmYWN0b3J5XG4gICAqIHJlZ2lzdHJ5IGFuZCBjYWxsaW5nIHRoZSBmYWN0b3J5IG1ldGhvZC4gUmV0dXJucyBhIGJvb2xlYW4gcmVwcmVzZW50aW5nXG4gICAqIHdoZXRoZXIgdGhlIGluaXRpYWxpemF0aW9uIG9mIHRoZSBiYWNrZW5kIHN1Y2VlZGVkLiBUaHJvd3MgYW4gZXJyb3IgaWZcbiAgICogdGhlcmUgaXMgbm8gYmFja2VuZCBpbiB0aGUgZmFjdG9yeSByZWdpc3RyeS5cbiAgICovXG4gIHByaXZhdGUgaW5pdGlhbGl6ZUJhY2tlbmQoYmFja2VuZE5hbWU6IHN0cmluZyk6XG4gICAgICB7c3VjY2VzczogYm9vbGVhbnxQcm9taXNlPGJvb2xlYW4+LCBhc3luY0luaXQ6IGJvb2xlYW59IHtcbiAgICBjb25zdCByZWdpc3RyeUZhY3RvcnlFbnRyeSA9IHRoaXMucmVnaXN0cnlGYWN0b3J5W2JhY2tlbmROYW1lXTtcbiAgICBpZiAocmVnaXN0cnlGYWN0b3J5RW50cnkgPT0gbnVsbCkge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKFxuICAgICAgICAgIGBDYW5ub3QgaW5pdGlhbGl6ZSBiYWNrZW5kICR7YmFja2VuZE5hbWV9LCBubyByZWdpc3RyYXRpb24gZm91bmQuYCk7XG4gICAgfVxuXG4gICAgdHJ5IHtcbiAgICAgIGNvbnN0IGJhY2tlbmQgPSByZWdpc3RyeUZhY3RvcnlFbnRyeS5mYWN0b3J5KCk7XG4gICAgICAvKiBUZXN0IGlmIHRoZSBmYWN0b3J5IHJldHVybnMgYSBwcm9taXNlLlxuICAgICAgRG9uZSBpbiBhIG1vcmUgbGliZXJhbCB3YXkgdGhhblxuICAgICAgcHJldmlvdXMgJ1Byb21pc2UucmVzb2x2ZShiYWNrZW5kKT09PWJhY2tlbmQnXG4gICAgICBhcyB3ZSBuZWVkZWQgdG8gYWNjb3VudCBmb3IgY3VzdG9tIFByb21pc2VcbiAgICAgIGltcGxlbWVudGF0aW9ucyAoZS5nLiBBbmd1bGFyKSAqL1xuICAgICAgaWYgKGJhY2tlbmQgJiYgIShiYWNrZW5kIGluc3RhbmNlb2YgS2VybmVsQmFja2VuZCkgJiZcbiAgICAgICAgICB0eXBlb2YgYmFja2VuZC50aGVuID09PSAnZnVuY3Rpb24nKSB7XG4gICAgICAgIGNvbnN0IHByb21pc2VJZCA9ICsrdGhpcy5wZW5kaW5nQmFja2VuZEluaXRJZDtcbiAgICAgICAgY29uc3Qgc3VjY2VzcyA9XG4gICAgICAgICAgICBiYWNrZW5kXG4gICAgICAgICAgICAgICAgLnRoZW4oYmFja2VuZEluc3RhbmNlID0+IHtcbiAgICAgICAgICAgICAgICAgIC8vIE91dGRhdGVkIHByb21pc2UuIEFub3RoZXIgYmFja2VuZCB3YXMgc2V0IGluIHRoZSBtZWFudGltZS5cbiAgICAgICAgICAgICAgICAgIGlmIChwcm9taXNlSWQgPCB0aGlzLnBlbmRpbmdCYWNrZW5kSW5pdElkKSB7XG4gICAgICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgIHRoaXMucmVnaXN0cnlbYmFja2VuZE5hbWVdID0gYmFja2VuZEluc3RhbmNlO1xuICAgICAgICAgICAgICAgICAgdGhpcy5wZW5kaW5nQmFja2VuZEluaXQgPSBudWxsO1xuICAgICAgICAgICAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgICAgICAgICAgICAgfSlcbiAgICAgICAgICAgICAgICAuY2F0Y2goZXJyID0+IHtcbiAgICAgICAgICAgICAgICAgIC8vIE91dGRhdGVkIHByb21pc2UuIEFub3RoZXIgYmFja2VuZCB3YXMgc2V0IGluIHRoZSBtZWFudGltZS5cbiAgICAgICAgICAgICAgICAgIGlmIChwcm9taXNlSWQgPCB0aGlzLnBlbmRpbmdCYWNrZW5kSW5pdElkKSB7XG4gICAgICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgIHRoaXMucGVuZGluZ0JhY2tlbmRJbml0ID0gbnVsbDtcbiAgICAgICAgICAgICAgICAgIGxvZy53YXJuKGBJbml0aWFsaXphdGlvbiBvZiBiYWNrZW5kICR7YmFja2VuZE5hbWV9IGZhaWxlZGApO1xuICAgICAgICAgICAgICAgICAgbG9nLndhcm4oZXJyLnN0YWNrIHx8IGVyci5tZXNzYWdlKTtcbiAgICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgdGhpcy5wZW5kaW5nQmFja2VuZEluaXQgPSBzdWNjZXNzO1xuICAgICAgICByZXR1cm4ge3N1Y2Nlc3MsIGFzeW5jSW5pdDogdHJ1ZX07XG4gICAgICB9IGVsc2Uge1xuICAgICAgICB0aGlzLnJlZ2lzdHJ5W2JhY2tlbmROYW1lXSA9IGJhY2tlbmQgYXMgS2VybmVsQmFja2VuZDtcbiAgICAgICAgcmV0dXJuIHtzdWNjZXNzOiB0cnVlLCBhc3luY0luaXQ6IGZhbHNlfTtcbiAgICAgIH1cbiAgICB9IGNhdGNoIChlcnIpIHtcbiAgICAgIGxvZy53YXJuKGBJbml0aWFsaXphdGlvbiBvZiBiYWNrZW5kICR7YmFja2VuZE5hbWV9IGZhaWxlZGApO1xuICAgICAgbG9nLndhcm4oZXJyLnN0YWNrIHx8IGVyci5tZXNzYWdlKTtcbiAgICAgIHJldHVybiB7c3VjY2VzczogZmFsc2UsIGFzeW5jSW5pdDogZmFsc2V9O1xuICAgIH1cbiAgfVxuXG4gIHJlbW92ZUJhY2tlbmQoYmFja2VuZE5hbWU6IHN0cmluZyk6IHZvaWQge1xuICAgIGlmICghKGJhY2tlbmROYW1lIGluIHRoaXMucmVnaXN0cnlGYWN0b3J5KSkge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKGAke2JhY2tlbmROYW1lfSBiYWNrZW5kIG5vdCBmb3VuZCBpbiByZWdpc3RyeWApO1xuICAgIH1cbiAgICBpZiAodGhpcy5iYWNrZW5kTmFtZSA9PT0gYmFja2VuZE5hbWUgJiYgdGhpcy5wZW5kaW5nQmFja2VuZEluaXQgIT0gbnVsbCkge1xuICAgICAgLy8gVGhlcmUgaXMgYSBwZW5kaW5nIHByb21pc2Ugb2YgdGhlIGJhY2tlbmQgd2Ugd2FudCB0byByZW1vdmUuIE1ha2UgaXRcbiAgICAgIC8vIG9ic29sZXRlLlxuICAgICAgdGhpcy5wZW5kaW5nQmFja2VuZEluaXRJZCsrO1xuICAgIH1cblxuICAgIGlmIChiYWNrZW5kTmFtZSBpbiB0aGlzLnJlZ2lzdHJ5KSB7XG4gICAgICB0aGlzLmRpc3Bvc2VSZWdpc3RlcmVkS2VybmVscyhiYWNrZW5kTmFtZSk7XG4gICAgICB0aGlzLnJlZ2lzdHJ5W2JhY2tlbmROYW1lXS5kaXNwb3NlKCk7XG4gICAgICBkZWxldGUgdGhpcy5yZWdpc3RyeVtiYWNrZW5kTmFtZV07XG4gICAgfVxuXG4gICAgZGVsZXRlIHRoaXMucmVnaXN0cnlGYWN0b3J5W2JhY2tlbmROYW1lXTtcblxuICAgIC8vIFVuc2V0IHRoZSBiYWNrZW5kIGlmIGl0IGlzIGFjdGl2ZS5cbiAgICBpZiAodGhpcy5iYWNrZW5kTmFtZSA9PT0gYmFja2VuZE5hbWUpIHtcbiAgICAgIHRoaXMucGVuZGluZ0JhY2tlbmRJbml0ID0gbnVsbDtcbiAgICAgIHRoaXMuYmFja2VuZE5hbWUgPSBudWxsO1xuICAgICAgdGhpcy5iYWNrZW5kSW5zdGFuY2UgPSBudWxsO1xuICAgIH1cbiAgfVxuXG4gIHByaXZhdGUgZ2V0U29ydGVkQmFja2VuZHMoKTogc3RyaW5nW10ge1xuICAgIGlmIChPYmplY3Qua2V5cyh0aGlzLnJlZ2lzdHJ5RmFjdG9yeSkubGVuZ3RoID09PSAwKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoJ05vIGJhY2tlbmQgZm91bmQgaW4gcmVnaXN0cnkuJyk7XG4gICAgfVxuICAgIHJldHVybiBPYmplY3Qua2V5cyh0aGlzLnJlZ2lzdHJ5RmFjdG9yeSkuc29ydCgoYTogc3RyaW5nLCBiOiBzdHJpbmcpID0+IHtcbiAgICAgIC8vIEhpZ2hlc3QgcHJpb3JpdHkgY29tZXMgZmlyc3QuXG4gICAgICByZXR1cm4gdGhpcy5yZWdpc3RyeUZhY3RvcnlbYl0ucHJpb3JpdHkgLVxuICAgICAgICAgIHRoaXMucmVnaXN0cnlGYWN0b3J5W2FdLnByaW9yaXR5O1xuICAgIH0pO1xuICB9XG5cbiAgcHJpdmF0ZSBpbml0aWFsaXplQmFja2VuZHNBbmRSZXR1cm5CZXN0KCk6XG4gICAgICB7bmFtZTogc3RyaW5nLCBhc3luY0luaXQ6IGJvb2xlYW59IHtcbiAgICBjb25zdCBzb3J0ZWRCYWNrZW5kcyA9IHRoaXMuZ2V0U29ydGVkQmFja2VuZHMoKTtcblxuICAgIGZvciAobGV0IGkgPSAwOyBpIDwgc29ydGVkQmFja2VuZHMubGVuZ3RoOyBpKyspIHtcbiAgICAgIGNvbnN0IGJhY2tlbmROYW1lID0gc29ydGVkQmFja2VuZHNbaV07XG4gICAgICBjb25zdCB7c3VjY2VzcywgYXN5bmNJbml0fSA9IHRoaXMuaW5pdGlhbGl6ZUJhY2tlbmQoYmFja2VuZE5hbWUpO1xuICAgICAgaWYgKGFzeW5jSW5pdCB8fCBzdWNjZXNzKSB7XG4gICAgICAgIHJldHVybiB7bmFtZTogYmFja2VuZE5hbWUsIGFzeW5jSW5pdH07XG4gICAgICB9XG4gICAgfVxuICAgIHRocm93IG5ldyBFcnJvcihcbiAgICAgICAgYENvdWxkIG5vdCBpbml0aWFsaXplIGFueSBiYWNrZW5kcywgYWxsIGJhY2tlbmQgaW5pdGlhbGl6YXRpb25zIGAgK1xuICAgICAgICBgZmFpbGVkLmApO1xuICB9XG5cbiAgbW92ZURhdGEoYmFja2VuZDogS2VybmVsQmFja2VuZCwgZGF0YUlkOiBEYXRhSWQpIHtcbiAgICBjb25zdCBpbmZvID0gdGhpcy5zdGF0ZS50ZW5zb3JJbmZvLmdldChkYXRhSWQpO1xuICAgIGNvbnN0IHNyY0JhY2tlbmQgPSBpbmZvLmJhY2tlbmQ7XG4gICAgY29uc3QgdmFsdWVzID0gdGhpcy5yZWFkU3luYyhkYXRhSWQpO1xuICAgIGNvbnN0IHJlZkNvdW50ID0gc3JjQmFja2VuZC5yZWZDb3VudChkYXRhSWQpO1xuICAgIC8vIERlbGV0ZSB0aGUgdGVuc29yIGZyb20gdGhlIG9sZCBiYWNrZW5kIGFuZCBtb3ZlIGl0IHRvIHRoZSBuZXdcbiAgICAvLyBiYWNrZW5kLlxuICAgIHNyY0JhY2tlbmQuZGlzcG9zZURhdGEoZGF0YUlkLCB0cnVlKTtcbiAgICBpbmZvLmJhY2tlbmQgPSBiYWNrZW5kO1xuICAgIGJhY2tlbmQubW92ZShkYXRhSWQsIHZhbHVlcywgaW5mby5zaGFwZSwgaW5mby5kdHlwZSwgcmVmQ291bnQpO1xuICAgIGlmICh0aGlzLnNob3VsZENoZWNrRm9yTWVtTGVha3MoKSkge1xuICAgICAgLy8gVHJhY2sgdGhlIG51bWJlciBvZiBtb3ZlcyBkdXJpbmcgYSBrZXJuZWwgZXhlY3V0aW9uIHRvIGNvcnJlY3RseVxuICAgICAgLy8gZGV0ZWN0IG1lbW9yeSBsZWFrcy5cbiAgICAgIHRoaXMuc3RhdGUubnVtRGF0YU1vdmVzU3RhY2tbdGhpcy5zdGF0ZS5udW1EYXRhTW92ZXNTdGFjay5sZW5ndGggLSAxXSsrO1xuICAgIH1cbiAgfVxuXG4gIHRpZHk8VCBleHRlbmRzIFRlbnNvckNvbnRhaW5lcj4obmFtZU9yRm46IHN0cmluZ3xTY29wZUZuPFQ+LCBmbj86IFNjb3BlRm48VD4pOlxuICAgICAgVCB7XG4gICAgbGV0IG5hbWU6IHN0cmluZyA9IG51bGw7XG4gICAgaWYgKGZuID09IG51bGwpIHtcbiAgICAgIC8vIENhbGxlZCB3aXRoIG9ubHkgMSBhcmd1bWVudC5cbiAgICAgIGlmICh0eXBlb2YgbmFtZU9yRm4gIT09ICdmdW5jdGlvbicpIHtcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKCdQbGVhc2UgcHJvdmlkZSBhIGZ1bmN0aW9uIHRvIHRpZHkoKScpO1xuICAgICAgfVxuICAgICAgZm4gPSBuYW1lT3JGbjtcbiAgICB9IGVsc2Uge1xuICAgICAgLy8gQ2FsbGVkIHdpdGggMiBhcmd1bWVudHMuXG4gICAgICBpZiAodHlwZW9mIG5hbWVPckZuICE9PSAnc3RyaW5nJyAmJiAhKG5hbWVPckZuIGluc3RhbmNlb2YgU3RyaW5nKSkge1xuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoXG4gICAgICAgICAgICAnV2hlbiBjYWxsaW5nIHdpdGggdHdvIGFyZ3VtZW50cywgdGhlIGZpcnN0IGFyZ3VtZW50ICcgK1xuICAgICAgICAgICAgJ3RvIHRpZHkoKSBtdXN0IGJlIGEgc3RyaW5nJyk7XG4gICAgICB9XG4gICAgICBpZiAodHlwZW9mIGZuICE9PSAnZnVuY3Rpb24nKSB7XG4gICAgICAgIHRocm93IG5ldyBFcnJvcihcbiAgICAgICAgICAgICdXaGVuIGNhbGxpbmcgd2l0aCB0d28gYXJndW1lbnRzLCB0aGUgMm5kIGFyZ3VtZW50ICcgK1xuICAgICAgICAgICAgJ3RvIHRpZHkoKSBtdXN0IGJlIGEgZnVuY3Rpb24nKTtcbiAgICAgIH1cbiAgICAgIG5hbWUgPSBuYW1lT3JGbiBhcyBzdHJpbmc7XG4gICAgICAvLyBUT0RPKG5zdGhvcmF0LHNtaWxrb3YpOiBEbyBvcGVyYXRpb24gbG9nZ2luZyBhbmQgcGVyZm9ybWFuY2VcbiAgICAgIC8vIHByb2ZpbGluZy5cbiAgICB9XG4gICAgbGV0IHJlc3VsdDogVDtcbiAgICByZXR1cm4gdGhpcy5zY29wZWRSdW4oXG4gICAgICAgICgpID0+IHRoaXMuc3RhcnRTY29wZShuYW1lKSwgKCkgPT4gdGhpcy5lbmRTY29wZShyZXN1bHQpLCAoKSA9PiB7XG4gICAgICAgICAgcmVzdWx0ID0gZm4oKTtcbiAgICAgICAgICBpZiAocmVzdWx0IGluc3RhbmNlb2YgUHJvbWlzZSkge1xuICAgICAgICAgICAgY29uc29sZS5lcnJvcignQ2Fubm90IHJldHVybiBhIFByb21pc2UgaW5zaWRlIG9mIHRpZHkuJyk7XG4gICAgICAgICAgfVxuICAgICAgICAgIHJldHVybiByZXN1bHQ7XG4gICAgICAgIH0pO1xuICB9XG5cbiAgcHJpdmF0ZSBzY29wZWRSdW48VD4oc3RhcnQ6ICgpID0+IHZvaWQsIGVuZDogKCkgPT4gdm9pZCwgZjogKCkgPT4gVCk6IFQge1xuICAgIHN0YXJ0KCk7XG4gICAgdHJ5IHtcbiAgICAgIGNvbnN0IHJlcyA9IGYoKTtcbiAgICAgIGVuZCgpO1xuICAgICAgcmV0dXJuIHJlcztcbiAgICB9IGNhdGNoIChleCkge1xuICAgICAgZW5kKCk7XG4gICAgICB0aHJvdyBleDtcbiAgICB9XG4gIH1cblxuICBwcml2YXRlIHN0YXRpYyBuZXh0VGVuc29ySWQgPSAwO1xuICBwcml2YXRlIG5leHRUZW5zb3JJZCgpOiBudW1iZXIge1xuICAgIHJldHVybiBFbmdpbmUubmV4dFRlbnNvcklkKys7XG4gIH1cblxuICBwcml2YXRlIHN0YXRpYyBuZXh0VmFyaWFibGVJZCA9IDA7XG4gIHByaXZhdGUgbmV4dFZhcmlhYmxlSWQoKTogbnVtYmVyIHtcbiAgICByZXR1cm4gRW5naW5lLm5leHRWYXJpYWJsZUlkKys7XG4gIH1cblxuICAvKipcbiAgICogVGhpcyBtZXRob2QgaXMgY2FsbGVkIGluc3RlYWQgb2YgdGhlIHB1YmxpYy1mYWNpbmcgdGVuc29yLmNsb25lKCkgd2hlblxuICAgKiBzYXZpbmcgYSB0ZW5zb3IgZm9yIGJhY2t3YXJkcyBwYXNzLiBJdCBtYWtlcyBzdXJlIHRvIGFkZCB0aGUgY2xvbmVcbiAgICogb3BlcmF0aW9uIHRvIHRoZSB0YXBlIHJlZ2FyZGxlc3Mgb2YgYmVpbmcgY2FsbGVkIGluc2lkZSBhIGtlcm5lbFxuICAgKiBleGVjdXRpb24uXG4gICAqL1xuICBwcml2YXRlIGNsb25lKHg6IFRlbnNvcik6IFRlbnNvciB7XG4gICAgY29uc3QgeTogVGVuc29yID0gRU5HSU5FLnJ1bktlcm5lbChJZGVudGl0eSwge3h9IGFzIHt9IGFzIE5hbWVkVGVuc29yTWFwKTtcbiAgICBjb25zdCBpbnB1dHMgPSB7eH07XG4gICAgY29uc3QgZ3JhZCA9IChkeTogVGVuc29yKSA9PiAoe1xuICAgICAgeDogKCkgPT4ge1xuICAgICAgICBjb25zdCBkdHlwZSA9ICdmbG9hdDMyJztcbiAgICAgICAgY29uc3QgZ3JhZElucHV0cyA9IHt4OiBkeX07XG4gICAgICAgIGNvbnN0IGF0dHJzID0ge2R0eXBlfTtcblxuICAgICAgICByZXR1cm4gRU5HSU5FLnJ1bktlcm5lbChcbiAgICAgICAgICAgICAgICAgICBDYXN0LCBncmFkSW5wdXRzIGFzIHt9IGFzIE5hbWVkVGVuc29yTWFwLFxuICAgICAgICAgICAgICAgICAgIC8vIHRzbGludDpkaXNhYmxlLW5leHQtbGluZTogbm8tdW5uZWNlc3NhcnktdHlwZS1hc3NlcnRpb25cbiAgICAgICAgICAgICAgICAgICBhdHRycyBhcyB7fSBhcyBOYW1lZEF0dHJNYXApIGFzIFRlbnNvcjtcbiAgICAgIH1cbiAgICB9KTtcbiAgICBjb25zdCBzYXZlZDogVGVuc29yW10gPSBbXTtcbiAgICB0aGlzLmFkZFRhcGVOb2RlKHRoaXMuc3RhdGUuYWN0aXZlU2NvcGUubmFtZSwgaW5wdXRzLCBbeV0sIGdyYWQsIHNhdmVkLCB7fSk7XG4gICAgcmV0dXJuIHk7XG4gIH1cblxuICAvKipcbiAgICogRXhlY3V0ZSBhIGtlcm5lbCB3aXRoIHRoZSBnaXZlbiBuYW1lIGFuZCByZXR1cm4gdGhlIG91dHB1dCB0ZW5zb3IuXG4gICAqXG4gICAqIEBwYXJhbSBrZXJuZWxOYW1lIFRoZSBuYW1lIG9mIHRoZSBrZXJuZWwgdG8gZXhlY3V0ZS5cbiAgICogQHBhcmFtIGlucHV0cyBBIG1hcCBvZiBpbnB1dCBuYW1lcyB0byB0ZW5zb3JzLlxuICAgKiBAcGFyYW0gYXR0cnMgQSBtYXAgb2YgYXR0cmlidXRlIG5hbWVzIHRvIHRoZWlyIHZhbHVlcy4gQW4gYXR0cmlidXRlIGlzIGFcbiAgICogICAgIHByaW1pdGl2ZSAobm9uLXRlbnNvcikgaW5wdXQgdG8gdGhlIGtlcm5lbC5cbiAgICogQHBhcmFtIGlucHV0c1RvU2F2ZSBBIGxpc3Qgb2YgdGVuc29ycywgaW5wdXRzIHRvIHNhdmUgZm9yIHRoZSBiYWNrcHJvcFxuICAgKiAgICAgY29tcHV0YXRpb24uXG4gICAqIEBwYXJhbSBvdXRwdXRzVG9TYXZlIEEgbGlzdCBvZiBib29sZWFucywgc3BlY2lmeWluZyB3aGljaCBvdXRwdXQgdG8gc2F2ZVxuICAgKiAgICAgZm9yIHRoZSBiYWNrcHJvcCBjb21wdXRhdGlvbi4gVGhlc2UgYXJlIGJvb2xlYW5zIHNpbmNlIHRoZSBvdXRwdXRcbiAgICogdGVuc29ycyBhcmUgbm90IHZpc2libGUgdG8gdGhlIHVzZXIuXG4gICAqL1xuICBydW5LZXJuZWw8VCBleHRlbmRzIFRlbnNvcnxUZW5zb3JbXT4oXG4gICAgICBrZXJuZWxOYW1lOiBzdHJpbmcsIGlucHV0czogTmFtZWRUZW5zb3JNYXAsIGF0dHJzPzogTmFtZWRBdHRyTWFwKTogVCB7XG4gICAgaWYgKHRoaXMuYmFja2VuZE5hbWUgPT0gbnVsbCkge1xuICAgICAgLy8gYmFja2VuZCBoYXMgbm90IGJlZW4gaW5pdGlhbGl6ZWQgeWV0IChiYWNrZW5kIGluaXRpYWxpemF0aW9uIGlzIGxhenlcbiAgICAgIC8vIGNhbiBiZSBkZWZlcnJlZCB1bnRpbCBhbiBvcC8ga2VybmVsIGlzIHJ1bikuXG4gICAgICAvLyBUaGUgYmVsb3cgZ2V0dGVyIGhhcyBzaWRlIGVmZmVjdHMgdGhhdCB3aWxsIHRyeSB0byBpbml0aWFsaXplIHRoZVxuICAgICAgLy8gYmFja2VuZCBhbmQgc2V0IHByb3BlcnRpZXMgbGlrZSB0aGlzLmJhY2tlbmROYW1lXG4gICAgICAvLyB0c2xpbnQ6ZGlzYWJsZS1uZXh0LWxpbmU6IG5vLXVudXNlZC1leHByZXNzaW9uXG4gICAgICB0aGlzLmJhY2tlbmQ7XG4gICAgfVxuICAgIGNvbnN0IGhhc0tlcm5lbCA9IGdldEtlcm5lbChrZXJuZWxOYW1lLCB0aGlzLmJhY2tlbmROYW1lKSAhPSBudWxsO1xuICAgIGlmICghaGFzS2VybmVsKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoYEtlcm5lbCAnJHtrZXJuZWxOYW1lfScgbm90IHJlZ2lzdGVyZWQgZm9yIGJhY2tlbmQgJyR7XG4gICAgICAgICAgdGhpcy5iYWNrZW5kTmFtZX0nYCk7XG4gICAgfVxuICAgIHJldHVybiB0aGlzLnJ1bktlcm5lbEZ1bmMoe2tlcm5lbE5hbWUsIGlucHV0cywgYXR0cnN9KTtcbiAgfVxuXG4gIHByaXZhdGUgc2hvdWxkQ2hlY2tGb3JNZW1MZWFrcygpOiBib29sZWFuIHtcbiAgICByZXR1cm4gdGhpcy5FTlYuZ2V0Qm9vbCgnSVNfVEVTVCcpO1xuICB9XG5cbiAgcHJpdmF0ZSBjaGVja0tlcm5lbEZvck1lbUxlYWsoXG4gICAgICBrZXJuZWxOYW1lOiBzdHJpbmcsIG51bURhdGFJZHNCZWZvcmU6IG51bWJlcixcbiAgICAgIG91dEluZm9zOiBUZW5zb3JJbmZvW10pOiB2b2lkIHtcbiAgICBjb25zdCBudW1EYXRhSWRzQWZ0ZXIgPSB0aGlzLmJhY2tlbmQubnVtRGF0YUlkcygpO1xuXG4gICAgLy8gQ291bnQgdGhlIG51bWJlciBvZiBkYXRhIGlkcyBhc3NvY2lhdGVkIHdpdGggdGhlIHJlc3VsdCBvZiB0aGUga2VybmVsLlxuICAgIGxldCBudW1PdXRwdXREYXRhSWRzID0gMDtcbiAgICBvdXRJbmZvcy5mb3JFYWNoKGluZm8gPT4ge1xuICAgICAgLy8gQ29tcGxleCBudW1iZXJzIGFsbG9jYXRlIDMgZGF0YSBpZHMsIG9uZSBmb3IgJ3JlYWwnLCBvbmUgZm9yXG4gICAgICAvLyAnaW1hZ2luYXJ5JywgYW5kIG9uZSBmb3IgdGhlIGNvbnRhaW5lciB0aGF0IGhvbGRzIHRoZSBmb3JtZXIgdHdvLlxuICAgICAgbnVtT3V0cHV0RGF0YUlkcyArPSAoaW5mby5kdHlwZSA9PT0gJ2NvbXBsZXg2NCcgPyAzIDogMSk7XG4gICAgfSk7XG5cbiAgICAvLyBBY2NvdW50IGZvciB0aGUgbnVtYmVyIG9mIG1vdmVzIGR1cmluZyBrZXJuZWwgZXhlY3V0aW9uLiBBIFwiZGF0YSBtb3ZlXCJcbiAgICAvLyBjYW4gaGFwcGVuIGluIHRoZSBtaWRkbGUgb2YgYSBrZXJuZWwgZXhlY3V0aW9uLCBwbGFjaW5nIGEgbmV3IChrZXksdmFsdWUpXG4gICAgLy8gcGFpciBpbiB0aGUgZGF0YSBzdG9yYWdlLiBTaW5jZSBkYXRhIG1vdmVzIGhhdmUgbmV0IHplcm8gZWZmZWN0ICh3ZVxuICAgIC8vIGFsd2F5cyByZW1vdmUgdGhlIGRhdGEgZnJvbSB0aGUgb2xkIGJhY2tlbmQpLCB3ZSBoYXZlIHRvIGNhbmNlbCB0aGVtIG91dFxuICAgIC8vIHdoZW4gZGV0ZWN0aW5nIG1lbW9yeSBsZWFrcy5cbiAgICBjb25zdCBudW1Nb3ZlcyA9XG4gICAgICAgIHRoaXMuc3RhdGUubnVtRGF0YU1vdmVzU3RhY2tbdGhpcy5zdGF0ZS5udW1EYXRhTW92ZXNTdGFjay5sZW5ndGggLSAxXTtcbiAgICBjb25zdCBkYXRhSWRzTGVha2VkID1cbiAgICAgICAgbnVtRGF0YUlkc0FmdGVyIC0gbnVtRGF0YUlkc0JlZm9yZSAtIG51bU91dHB1dERhdGFJZHMgLSBudW1Nb3ZlcztcbiAgICBpZiAoZGF0YUlkc0xlYWtlZCA+IDApIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcihcbiAgICAgICAgICBgQmFja2VuZCAnJHt0aGlzLmJhY2tlbmROYW1lfScgaGFzIGFuIGludGVybmFsIG1lbW9yeSBsZWFrIGAgK1xuICAgICAgICAgIGAoJHtkYXRhSWRzTGVha2VkfSBkYXRhIGlkcykgYWZ0ZXIgcnVubmluZyAnJHtrZXJuZWxOYW1lfSdgKTtcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogSW50ZXJuYWwgaGVscGVyIG1ldGhvZCB0byBleGVjdXRlIGEga2VybmVsIEZ1bmNcbiAgICpcbiAgICogVXNlIGBydW5LZXJuZWxgIHRvIGV4ZWN1dGUga2VybmVscyBmcm9tIG91dHNpZGUgb2YgZW5naW5lLlxuICAgKi9cbiAgcHJpdmF0ZSBydW5LZXJuZWxGdW5jPFQgZXh0ZW5kcyBUZW5zb3J8VGVuc29yW10sIEkgZXh0ZW5kcyBOYW1lZFRlbnNvck1hcD4oXG4gICAgICBrZXJuZWxQYXJhbXM6IFJlZ2lzdGVyZWRLZXJuZWxJbnZvY2F0aW9uPEk+fFxuICAgICAgQ3VzdG9tR3JhZEtlcm5lbEludm9jYXRpb248VCwgST4pOiBUIHtcbiAgICBsZXQgb3V0cHV0czogVGVuc29yW107XG4gICAgbGV0IHNhdmVkOiBUZW5zb3JbXSA9IFtdO1xuICAgIGNvbnN0IGlzVGFwZU9uID0gdGhpcy5pc1RhcGVPbigpO1xuXG4gICAgY29uc3Qgc3RhcnRpbmdCeXRlY291bnQgPSB0aGlzLnN0YXRlLm51bUJ5dGVzO1xuICAgIGNvbnN0IHN0YXJ0aW5nTnVtVGVuc29ycyA9IHRoaXMuc3RhdGUubnVtVGVuc29ycztcblxuICAgIGlmICh0aGlzLnNob3VsZENoZWNrRm9yTWVtTGVha3MoKSkge1xuICAgICAgdGhpcy5zdGF0ZS5udW1EYXRhTW92ZXNTdGFjay5wdXNoKDApO1xuICAgIH1cblxuICAgIGxldCBrZXJuZWxGdW5jOiAoKSA9PiBUZW5zb3JbXTtcbiAgICBpZiAodGhpcy5iYWNrZW5kTmFtZSA9PSBudWxsKSB7XG4gICAgICAvLyBiYWNrZW5kIGhhcyBub3QgYmVlbiBpbml0aWFsaXplZCB5ZXQgKGJhY2tlbmQgaW5pdGlhbGl6YXRpb24gaXMgbGF6eVxuICAgICAgLy8gY2FuIGJlIGRlZmVycmVkIHVudGlsIGFuIG9wLyBrZXJuZWwgaXMgcnVuKS5cbiAgICAgIC8vIFRoZSBiZWxvdyBnZXR0ZXIgaGFzIHNpZGUgZWZmZWN0cyB0aGF0IHdpbGwgdHJ5IHRvIGluaXRpYWxpemUgdGhlXG4gICAgICAvLyBiYWNrZW5kIGFuZCBzZXQgcHJvcGVydGllcyBsaWtlIHRoaXMuYmFja2VuZE5hbWVcbiAgICAgIC8vIHRzbGludDpkaXNhYmxlLW5leHQtbGluZTogbm8tdW51c2VkLWV4cHJlc3Npb25cbiAgICAgIHRoaXMuYmFja2VuZDtcbiAgICB9XG5cbiAgICBsZXQgb3V0OiBUZW5zb3JJbmZvfFRlbnNvckluZm9bXTtcblxuICAgIGNvbnN0IGtlcm5lbE9yU2NvcGVOYW1lID0gaXNSZWdpc3RlcmVkS2VybmVsSW52b2NhdGlvbihrZXJuZWxQYXJhbXMpID9cbiAgICAgICAga2VybmVsUGFyYW1zLmtlcm5lbE5hbWUgOlxuICAgICAgICB0aGlzLnN0YXRlLmFjdGl2ZVNjb3BlICE9IG51bGwgPyB0aGlzLnN0YXRlLmFjdGl2ZVNjb3BlLm5hbWUgOiAnJztcblxuICAgIC8vIENyZWF0ZSB0aGUga2VybmVsRnVuYyBmcm9tIGVpdGhlciBhIHJlZ2lzdGVyZWQga2VybmVsIE9SIHBhc3NlZCBpblxuICAgIC8vIGZvcndhcmQvYmFja3dhcmQgZnVuY3Rpb25zICh1c2VkIGJ5IGN1c3RvbSBncmFkKS4gSW4gdGhpcyBjb250ZXh0IGFcbiAgICAvLyBrZXJuZWxGdW5jIHdyYXBzIGEga2VybmVsIGltcGxlbWVudGF0aW9uIHdpdGggc29tZSBib29ra2VlcGluZy5cblxuICAgIGlmIChpc1JlZ2lzdGVyZWRLZXJuZWxJbnZvY2F0aW9uKGtlcm5lbFBhcmFtcykpIHtcbiAgICAgIGNvbnN0IHtrZXJuZWxOYW1lLCBpbnB1dHMsIGF0dHJzfSA9IGtlcm5lbFBhcmFtcztcbiAgICAgIGlmICh0aGlzLmJhY2tlbmROYW1lID09IG51bGwpIHtcbiAgICAgICAgLy8gYmFja2VuZCBoYXMgbm90IGJlZW4gaW5pdGlhbGl6ZWQgeWV0IChiYWNrZW5kIGluaXRpYWxpemF0aW9uIGlzIGxhenlcbiAgICAgICAgLy8gY2FuIGJlIGRlZmVycmVkIHVudGlsIGFuIG9wLyBrZXJuZWwgaXMgcnVuKS5cbiAgICAgICAgLy8gVGhlIGJlbG93IGdldHRlciBoYXMgc2lkZSBlZmZlY3RzIHRoYXQgd2lsbCB0cnkgdG8gaW5pdGlhbGl6ZSB0aGVcbiAgICAgICAgLy8gYmFja2VuZCBhbmQgc2V0IHByb3BlcnRpZXMgbGlrZSB0aGlzLmJhY2tlbmROYW1lXG4gICAgICAgIC8vIHRzbGludDpkaXNhYmxlLW5leHQtbGluZTogbm8tdW51c2VkLWV4cHJlc3Npb25cbiAgICAgICAgdGhpcy5iYWNrZW5kO1xuICAgICAgfVxuICAgICAgY29uc3Qga2VybmVsID0gZ2V0S2VybmVsKGtlcm5lbE5hbWUsIHRoaXMuYmFja2VuZE5hbWUpO1xuICAgICAgdXRpbC5hc3NlcnQoXG4gICAgICAgICAga2VybmVsICE9IG51bGwsXG4gICAgICAgICAgKCkgPT4gYENhbm5vdCBmaW5kIHJlZ2lzdGVyZWQga2VybmVsICcke2tlcm5lbE5hbWV9JyBmb3IgYmFja2VuZCAnJHtcbiAgICAgICAgICAgICAgdGhpcy5iYWNrZW5kTmFtZX0nYCk7XG5cbiAgICAgIGtlcm5lbEZ1bmMgPSAoKSA9PiB7XG4gICAgICAgIGNvbnN0IG51bURhdGFJZHNCZWZvcmUgPSB0aGlzLmJhY2tlbmQubnVtRGF0YUlkcygpO1xuICAgICAgICBvdXQgPSBrZXJuZWwua2VybmVsRnVuYyh7aW5wdXRzLCBhdHRycywgYmFja2VuZDogdGhpcy5iYWNrZW5kfSk7XG4gICAgICAgIGNvbnN0IG91dEluZm9zID0gQXJyYXkuaXNBcnJheShvdXQpID8gb3V0IDogW291dF07XG4gICAgICAgIGlmICh0aGlzLnNob3VsZENoZWNrRm9yTWVtTGVha3MoKSkge1xuICAgICAgICAgIHRoaXMuY2hlY2tLZXJuZWxGb3JNZW1MZWFrKGtlcm5lbE5hbWUsIG51bURhdGFJZHNCZWZvcmUsIG91dEluZm9zKTtcbiAgICAgICAgfVxuXG4gICAgICAgIGNvbnN0IG91dFRlbnNvcnMgPSBvdXRJbmZvcy5tYXAoKG91dEluZm86IFRlbnNvckluZm98VGVuc29yKSA9PiB7XG4gICAgICAgICAgLy8gdG9kbyAoeWFzc29nYmEpIHJlbW92ZSB0aGlzIG9wdGlvbiAoVGVuc29yKSB3aGVuIG5vZGUgYmFja2VuZFxuICAgICAgICAgIC8vIG1ldGhvZHMgaGF2ZSBiZWVuIG1vZHVsYXJpemVkIGFuZCB0aGV5IGFsbCByZXR1cm4gdGVuc29ySW5mby5cbiAgICAgICAgICAvLyBUZW5zb3JJbmZvcyBkbyBub3QgaGF2ZSBhIHJhbmsgYXR0cmlidXRlLlxuICAgICAgICAgIGlmICgob3V0SW5mbyBhcyBUZW5zb3IpLnJhbmsgIT0gbnVsbCkge1xuICAgICAgICAgICAgcmV0dXJuIG91dEluZm8gYXMgVGVuc29yO1xuICAgICAgICAgIH1cbiAgICAgICAgICByZXR1cm4gdGhpcy5tYWtlVGVuc29yRnJvbVRlbnNvckluZm8ob3V0SW5mbyk7XG4gICAgICAgIH0pO1xuXG4gICAgICAgIC8vIFNhdmUgYW55IHJlcXVpcmVkIGlucHV0cyBhbmQgb3V0cHV0cy5cblxuICAgICAgICAvLyBEbyBub3Qgc2F2ZSB1bmxlc3Mgd2UgYXJlIHJlY29yZGluZyB0byB0aGUgdGFwZS4gT3RoZXJ3aXNlIGl0IHdvdWxkXG4gICAgICAgIC8vIGNhdXNlIGEgbWVtIGxlYWsgc2luY2UgdGhlcmUgd291bGQgYmUgbm8gYmFja3Byb3AgZm9yIHRoZXNlIHRlbnNvcnNcbiAgICAgICAgLy8gKHdoaWNoIHdvdWxkIG90aGVyd2lzZSBkaXNwb3NlIHRoZW0pLlxuICAgICAgICBpZiAoaXNUYXBlT24pIHtcbiAgICAgICAgICBjb25zdCB0ZW5zb3JzVG9TYXZlID1cbiAgICAgICAgICAgICAgdGhpcy5nZXRUZW5zb3JzRm9yR3JhZGllbnQoa2VybmVsTmFtZSwgaW5wdXRzLCBvdXRUZW5zb3JzKTtcbiAgICAgICAgICBzYXZlZCA9IHRoaXMuc2F2ZVRlbnNvcnNGb3JCYWNrd2FyZE1vZGUodGVuc29yc1RvU2F2ZSk7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIG91dFRlbnNvcnM7XG4gICAgICB9O1xuICAgIH0gZWxzZSB7XG4gICAgICBjb25zdCB7Zm9yd2FyZEZ1bmN9ID0ga2VybmVsUGFyYW1zO1xuICAgICAgLy8gUnVubmluZyBhIGN1c3RvbUdyYWQgb3AuXG4gICAgICBjb25zdCBzYXZlRnVuYzogR3JhZFNhdmVGdW5jID0gKHRlbnNvcnMpID0+IHtcbiAgICAgICAgLy8gRG8gbm90IHNhdmUgdW5sZXNzIHdlIGFyZSByZWNvcmRpbmcgdG8gdGhlIHRhcGUuIE90aGVyd2lzZSBpdCB3b3VsZFxuICAgICAgICAvLyBjYXVzZSBhIG1lbSBsZWFrIHNpbmNlIHdlIHdvdWxkIG5ldmVyIHJ1biBiYWNrcHJvcCwgd2hpY2ggZGlzcG9zZXNcbiAgICAgICAgLy8gdGhlIGtlcHQgdGVuc29ycy5cbiAgICAgICAgaWYgKCFpc1RhcGVPbikge1xuICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuICAgICAgICBzYXZlZCA9IHRlbnNvcnMubWFwKHRlbnNvciA9PiB0aGlzLmtlZXAodGhpcy5jbG9uZSh0ZW5zb3IpKSk7XG4gICAgICB9O1xuXG4gICAgICBrZXJuZWxGdW5jID0gKCkgPT4ge1xuICAgICAgICBjb25zdCBudW1EYXRhSWRzQmVmb3JlID0gdGhpcy5iYWNrZW5kLm51bURhdGFJZHMoKTtcbiAgICAgICAgb3V0ID0gdGhpcy50aWR5KCgpID0+IGZvcndhcmRGdW5jKHRoaXMuYmFja2VuZCwgc2F2ZUZ1bmMpKTtcbiAgICAgICAgY29uc3Qgb3V0cyA9IChBcnJheS5pc0FycmF5KG91dCkgPyBvdXQgOiBbb3V0XSkgYXMgVGVuc29yW107XG4gICAgICAgIGlmICh0aGlzLnNob3VsZENoZWNrRm9yTWVtTGVha3MoKSkge1xuICAgICAgICAgIC8vIFNjb3BlIG5hbWUgaXMgdXNlZCB0byBwcmludCBhIG1vcmUgaGVscGZ1bCBlcnJvciBtZXNzYWdlIGlmIG5lZWRlZC5cbiAgICAgICAgICB0aGlzLmNoZWNrS2VybmVsRm9yTWVtTGVhayhrZXJuZWxPclNjb3BlTmFtZSwgbnVtRGF0YUlkc0JlZm9yZSwgb3V0cyk7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIG91dHM7XG4gICAgICB9O1xuICAgIH1cblxuICAgIC8vXG4gICAgLy8gUnVuIHRoZSBrZXJuZWxGdW5jLiBPcHRpb25hbGx5IHByb2ZpbGluZyBpdC5cbiAgICAvL1xuICAgIGNvbnN0IHtpbnB1dHMsIGF0dHJzfSA9IGtlcm5lbFBhcmFtcztcbiAgICBjb25zdCBiYWNrd2FyZHNGdW5jID0gaXNSZWdpc3RlcmVkS2VybmVsSW52b2NhdGlvbihrZXJuZWxQYXJhbXMpID9cbiAgICAgICAgbnVsbCA6XG4gICAgICAgIGtlcm5lbFBhcmFtcy5iYWNrd2FyZHNGdW5jO1xuXG4gICAgbGV0IGtlcm5lbFByb2ZpbGU6IEtlcm5lbFByb2ZpbGU7XG4gICAgdGhpcy5zY29wZWRSdW4oXG4gICAgICAgIC8vIFN0b3AgcmVjb3JkaW5nIHRvIGEgdGFwZSB3aGVuIHJ1bm5pbmcgYSBrZXJuZWwuXG4gICAgICAgICgpID0+IHRoaXMuc3RhdGUua2VybmVsRGVwdGgrKywgKCkgPT4gdGhpcy5zdGF0ZS5rZXJuZWxEZXB0aC0tLCAoKSA9PiB7XG4gICAgICAgICAgaWYgKCF0aGlzLkVOVi5nZXRCb29sKCdERUJVRycpICYmICF0aGlzLnN0YXRlLnByb2ZpbGluZykge1xuICAgICAgICAgICAgb3V0cHV0cyA9IGtlcm5lbEZ1bmMoKTtcbiAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAga2VybmVsUHJvZmlsZSA9IHRoaXMucHJvZmlsZXIucHJvZmlsZUtlcm5lbChcbiAgICAgICAgICAgICAgICBrZXJuZWxPclNjb3BlTmFtZSwgaW5wdXRzLCAoKSA9PiBrZXJuZWxGdW5jKCkpO1xuICAgICAgICAgICAgaWYgKHRoaXMuRU5WLmdldEJvb2woJ0RFQlVHJykpIHtcbiAgICAgICAgICAgICAgdGhpcy5wcm9maWxlci5sb2dLZXJuZWxQcm9maWxlKGtlcm5lbFByb2ZpbGUpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgb3V0cHV0cyA9IGtlcm5lbFByb2ZpbGUub3V0cHV0cztcbiAgICAgICAgICB9XG4gICAgICAgIH0pO1xuXG4gICAgaWYgKGlzVGFwZU9uKSB7XG4gICAgICB0aGlzLmFkZFRhcGVOb2RlKFxuICAgICAgICAgIGtlcm5lbE9yU2NvcGVOYW1lLCBpbnB1dHMsIG91dHB1dHMsIGJhY2t3YXJkc0Z1bmMsIHNhdmVkLCBhdHRycyk7XG4gICAgfVxuXG4gICAgaWYgKHRoaXMuc3RhdGUucHJvZmlsaW5nKSB7XG4gICAgICB0aGlzLnN0YXRlLmFjdGl2ZVByb2ZpbGUua2VybmVscy5wdXNoKHtcbiAgICAgICAgbmFtZToga2VybmVsT3JTY29wZU5hbWUsXG4gICAgICAgIGJ5dGVzQWRkZWQ6IHRoaXMuc3RhdGUubnVtQnl0ZXMgLSBzdGFydGluZ0J5dGVjb3VudCxcbiAgICAgICAgdG90YWxCeXRlc1NuYXBzaG90OiB0aGlzLnN0YXRlLm51bUJ5dGVzLFxuICAgICAgICB0ZW5zb3JzQWRkZWQ6IHRoaXMuc3RhdGUubnVtVGVuc29ycyAtIHN0YXJ0aW5nTnVtVGVuc29ycyxcbiAgICAgICAgdG90YWxUZW5zb3JzU25hcHNob3Q6IHRoaXMuc3RhdGUubnVtVGVuc29ycyxcbiAgICAgICAgaW5wdXRTaGFwZXM6IE9iamVjdC5rZXlzKGlucHV0cykubWFwKFxuICAgICAgICAgICAga2V5ID0+IGlucHV0c1trZXldICE9IG51bGwgPyBpbnB1dHNba2V5XS5zaGFwZSA6IG51bGwpLFxuICAgICAgICBvdXRwdXRTaGFwZXM6IG91dHB1dHMubWFwKGl0ZW0gPT4gaXRlbS5zaGFwZSksXG4gICAgICAgIGtlcm5lbFRpbWVNczoga2VybmVsUHJvZmlsZS50aW1lTXMsXG4gICAgICAgIGV4dHJhSW5mbzoga2VybmVsUHJvZmlsZS5leHRyYUluZm9cbiAgICAgIH0pO1xuICAgIH1cbiAgICByZXR1cm4gKEFycmF5LmlzQXJyYXkob3V0KSA/IG91dHB1dHMgOiBvdXRwdXRzWzBdKSBhcyBUO1xuICB9XG5cbiAgLyoqXG4gICAqIFNhdmVzIHRlbnNvcnMgdXNlZCBpbiBmb3J3YXJkIG1vZGUgZm9yIHVzZSBpbiBiYWNrd2FyZCBtb2RlLlxuICAgKlxuICAgKiBAcGFyYW0gdGVuc29ycyB0aGUgbGlzdCBvZiB0ZW5zb3JzIHRvIHNhdmUuXG4gICAqL1xuICBwcml2YXRlIHNhdmVUZW5zb3JzRm9yQmFja3dhcmRNb2RlKHRlbnNvcnM6IFRlbnNvcltdKTogVGVuc29yW10ge1xuICAgIGNvbnN0IHNhdmVkID0gdGVuc29ycy5tYXAodGVuc29yID0+IHRoaXMua2VlcCh0aGlzLmNsb25lKHRlbnNvcikpKTtcbiAgICByZXR1cm4gc2F2ZWQ7XG4gIH1cblxuICAvKipcbiAgICogUmV0dXJucyBhIGxpc3Qgb2YgdGVuc29ycyB0byBzYXZlIGZvciBhIGdpdmVuIGdyYWRpZW50IGNhbGN1bGF0aW9uLlxuICAgKlxuICAgKiBAcGFyYW0ga2VybmVsTmFtZSBuYW1lIG9mIGtlcm5lbCB0byBsb29rIHVwIGdyYWRpZW50IGZvci5cbiAgICogQHBhcmFtIGlucHV0cyBhIG1hcCBvZiBpbnB1dCB0ZW5zb3JzLlxuICAgKiBAcGFyYW0gb3V0cHV0cyBhbiBhcnJheSBvZiBvdXRwdXQgdGVuc29ycyBmcm9tIGZvcndhcmQgbW9kZSBvZiBrZXJuZWwuXG4gICAqL1xuICBwcml2YXRlIGdldFRlbnNvcnNGb3JHcmFkaWVudChcbiAgICAgIGtlcm5lbE5hbWU6IHN0cmluZywgaW5wdXRzOiBOYW1lZFRlbnNvck1hcCxcbiAgICAgIG91dHB1dHM6IFRlbnNvcltdKTogVGVuc29yW118bnVsbCB7XG4gICAgY29uc3QgZ3JhZENvbmZpZyA9IGdldEdyYWRpZW50KGtlcm5lbE5hbWUpO1xuICAgIGlmIChncmFkQ29uZmlnICE9IG51bGwpIHtcbiAgICAgIGNvbnN0IGlucHV0c1RvU2F2ZTogc3RyaW5nW10gPSBncmFkQ29uZmlnLmlucHV0c1RvU2F2ZSB8fCBbXTtcbiAgICAgIGNvbnN0IG91dHB1dHNUb1NhdmU6IGJvb2xlYW5bXSA9IGdyYWRDb25maWcub3V0cHV0c1RvU2F2ZSB8fCBbXTtcblxuICAgICAgLy8gSWYgc2F2ZUFsbElucHV0cyBpcyB0cnVlLCBhbGwgaW5wdXRzIHdpbGwgYmUgc2F2ZWQuIE90aGVyd2lzZSwgaW5wdXRzXG4gICAgICAvLyBzcGVjaWZpZWQgaW4gaW5wdXRzVG9TYXZlIHdpbGwgYmUgc2F2ZWQuXG4gICAgICBsZXQgaW5wdXRUZW5zb3JzVG9TYXZlOiBUZW5zb3JbXTtcbiAgICAgIGlmIChncmFkQ29uZmlnLnNhdmVBbGxJbnB1dHMpIHtcbiAgICAgICAgdXRpbC5hc3NlcnQoXG4gICAgICAgICAgICBBcnJheS5pc0FycmF5KGlucHV0cyksXG4gICAgICAgICAgICAoKSA9PiAnc2F2ZUFsbElucHV0cyBpcyB0cnVlLCBleHBlY3RlZCBpbnB1dHMgdG8gYmUgYW4gYXJyYXkuJyk7XG5cbiAgICAgICAgaW5wdXRUZW5zb3JzVG9TYXZlID0gT2JqZWN0LmtleXMoaW5wdXRzKS5tYXAoKGtleSkgPT4gaW5wdXRzW2tleV0pO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgaW5wdXRUZW5zb3JzVG9TYXZlID0gaW5wdXRzVG9TYXZlLm1hcCgoaW5wdXROYW1lKSA9PiBpbnB1dHNbaW5wdXROYW1lXSk7XG4gICAgICB9XG5cbiAgICAgIGNvbnN0IG91dHB1dFRlbnNvcnNUb1NhdmU6IFRlbnNvcltdID1cbiAgICAgICAgICBvdXRwdXRzLmZpbHRlcigoXywgaSkgPT4gb3V0cHV0c1RvU2F2ZVtpXSk7XG5cbiAgICAgIHJldHVybiBpbnB1dFRlbnNvcnNUb1NhdmUuY29uY2F0KG91dHB1dFRlbnNvcnNUb1NhdmUpO1xuICAgIH1cbiAgICAvLyBXZSByZXR1cm4gYW4gZW1wdHkgbGlzdCByYXRoZXIgdGhhbiB0aHJvdyBhbiBlcnJvciBiZWNhdXNlIHRoZSBrZXJuZWwgd2VcbiAgICAvLyBhcmUgbG9va2luZyB1cCBtYXkgbm90IGFjdHVhbGx5IGJlIHJlbGV2YW50IHRvIGJhY2twcm9waW5nIHRocm91Z2ggdGhlXG4gICAgLy8gb3ZlcmFsbCBmdW5jdGlvblxuICAgIC8vXG4gICAgLy8gU2VlICdkb2VzIG5vdCBlcnJvciBpZiBpcnJlbGV2YW50IChwcnVuZWQpIG9wcyBhcmUgbWlzc2luZyBncmFkcycgdGVzdFxuICAgIC8vIGluIGdyYWRpZW50c190ZXN0LnRzIGZvciBhbiBleGFtcGxlLlxuICAgIHJldHVybiBbXTtcbiAgfVxuXG4gIC8qKlxuICAgKiBJbnRlcm5hbCBtZXRob2QgdXNlZCBieSBwdWJsaWMgQVBJcyBmb3IgdGVuc29yIGNyZWF0aW9uLiBNYWtlcyBhIG5ld1xuICAgKiB0ZW5zb3Igd2l0aCB0aGUgcHJvdmlkZWQgc2hhcGUsIGR0eXBlIGFuZCB2YWx1ZXMuIEl0IGFsd2F5c1xuICAgKiBjcmVhdGVzIGEgbmV3IGRhdGEgaWQgYW5kIHdyaXRlcyB0aGUgdmFsdWVzIHRvIHRoZSB1bmRlcmx5aW5nIGJhY2tlbmQuXG4gICAqL1xuICBtYWtlVGVuc29yKFxuICAgICAgdmFsdWVzOiBEYXRhVmFsdWVzLCBzaGFwZTogbnVtYmVyW10sIGR0eXBlOiBEYXRhVHlwZSxcbiAgICAgIGJhY2tlbmQ/OiBLZXJuZWxCYWNrZW5kKTogVGVuc29yIHtcbiAgICBpZiAodmFsdWVzID09IG51bGwpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcignVmFsdWVzIHBhc3NlZCB0byBlbmdpbmUubWFrZVRlbnNvcigpIGFyZSBudWxsJyk7XG4gICAgfVxuICAgIGR0eXBlID0gZHR5cGUgfHwgJ2Zsb2F0MzInO1xuICAgIGJhY2tlbmQgPSBiYWNrZW5kIHx8IHRoaXMuYmFja2VuZDtcbiAgICBsZXQgYmFja2VuZFZhbHMgPSB2YWx1ZXMgYXMgQmFja2VuZFZhbHVlcztcbiAgICBpZiAoZHR5cGUgPT09ICdzdHJpbmcnICYmIHV0aWwuaXNTdHJpbmcodmFsdWVzWzBdKSkge1xuICAgICAgYmFja2VuZFZhbHMgPSAodmFsdWVzIGFzIHN0cmluZ1tdKS5tYXAoZCA9PiB1dGlsLmVuY29kZVN0cmluZyhkKSk7XG4gICAgfVxuICAgIGNvbnN0IGRhdGFJZCA9IGJhY2tlbmQud3JpdGUoYmFja2VuZFZhbHMsIHNoYXBlLCBkdHlwZSk7XG4gICAgY29uc3QgdCA9IG5ldyBUZW5zb3Ioc2hhcGUsIGR0eXBlLCBkYXRhSWQsIHRoaXMubmV4dFRlbnNvcklkKCkpO1xuICAgIHRoaXMudHJhY2tUZW5zb3IodCwgYmFja2VuZCk7XG5cbiAgICAvLyBDb3VudCBieXRlcyBmb3Igc3RyaW5nIHRlbnNvcnMuXG4gICAgaWYgKGR0eXBlID09PSAnc3RyaW5nJykge1xuICAgICAgY29uc3QgaW5mbyA9IHRoaXMuc3RhdGUudGVuc29ySW5mby5nZXQoZGF0YUlkKTtcbiAgICAgIGNvbnN0IG5ld0J5dGVzID0gYnl0ZXNGcm9tU3RyaW5nQXJyYXkoYmFja2VuZFZhbHMgYXMgVWludDhBcnJheVtdKTtcbiAgICAgIHRoaXMuc3RhdGUubnVtQnl0ZXMgKz0gbmV3Qnl0ZXMgLSBpbmZvLmJ5dGVzO1xuICAgICAgaW5mby5ieXRlcyA9IG5ld0J5dGVzO1xuICAgIH1cbiAgICByZXR1cm4gdDtcbiAgfVxuXG4gIC8qKlxuICAgKiBJbnRlcm5hbCBtZXRob2QgdXNlZCBieSBiYWNrZW5kcy4gTWFrZXMgYSBuZXcgdGVuc29yXG4gICAqIHRoYXQgaXMgYSB3cmFwcGVyIGFyb3VuZCBhbiBleGlzdGluZyBkYXRhIGlkLiBJdCBkb2Vzbid0IGNyZWF0ZVxuICAgKiBhIG5ldyBkYXRhIGlkLCBvbmx5IGluY3JlbWVudHMgdGhlIHJlZiBjb3VudCB1c2VkIGluIG1lbW9yeSB0cmFja2luZy5cbiAgICogQGRlcHJlY2F0ZWRcbiAgICovXG4gIG1ha2VUZW5zb3JGcm9tRGF0YUlkKFxuICAgIGRhdGFJZDogRGF0YUlkLCBzaGFwZTogbnVtYmVyW10sIGR0eXBlOiBEYXRhVHlwZSxcbiAgICBiYWNrZW5kPzogS2VybmVsQmFja2VuZCk6IFRlbnNvciB7XG4gICAgZHR5cGUgPSBkdHlwZSB8fCAnZmxvYXQzMic7XG4gICAgY29uc3QgdGVuc29ySW5mbzogVGVuc29ySW5mbyA9IHtkYXRhSWQsIHNoYXBlLCBkdHlwZX07XG4gICAgcmV0dXJuIHRoaXMubWFrZVRlbnNvckZyb21UZW5zb3JJbmZvKHRlbnNvckluZm8sIGJhY2tlbmQpO1xuICB9XG5cbiAgLyoqXG4gICAqIEludGVybmFsIG1ldGhvZCB1c2VkIGJ5IGJhY2tlbmRzLiBNYWtlcyBhIG5ldyB0ZW5zb3IgdGhhdCBpcyBhIHdyYXBwZXJcbiAgICogYXJvdW5kIGFuIGV4aXN0aW5nIGRhdGEgaWQgaW4gVGVuc29ySW5mby4gSXQgZG9lc24ndCBjcmVhdGUgYSBuZXcgZGF0YSBpZCxcbiAgICogb25seSBpbmNyZW1lbnRzIHRoZSByZWYgY291bnQgdXNlZCBpbiBtZW1vcnkgdHJhY2tpbmcuXG4gICAqL1xuICBtYWtlVGVuc29yRnJvbVRlbnNvckluZm8odGVuc29ySW5mbzogVGVuc29ySW5mbywgYmFja2VuZD86IEtlcm5lbEJhY2tlbmQpOlxuICAgICAgVGVuc29yIHtcbiAgICBjb25zdCB7ZGF0YUlkLCBzaGFwZSwgZHR5cGV9ID0gdGVuc29ySW5mbztcbiAgICBjb25zdCB0ID0gbmV3IFRlbnNvcihzaGFwZSwgZHR5cGUsIGRhdGFJZCwgdGhpcy5uZXh0VGVuc29ySWQoKSk7XG4gICAgdGhpcy50cmFja1RlbnNvcih0LCBiYWNrZW5kKTtcbiAgICByZXR1cm4gdDtcbiAgfVxuXG4gIG1ha2VWYXJpYWJsZShcbiAgICAgIGluaXRpYWxWYWx1ZTogVGVuc29yLCB0cmFpbmFibGUgPSB0cnVlLCBuYW1lPzogc3RyaW5nLFxuICAgICAgZHR5cGU/OiBEYXRhVHlwZSk6IFZhcmlhYmxlIHtcbiAgICBuYW1lID0gbmFtZSB8fCB0aGlzLm5leHRWYXJpYWJsZUlkKCkudG9TdHJpbmcoKTtcbiAgICBpZiAoZHR5cGUgIT0gbnVsbCAmJiBkdHlwZSAhPT0gaW5pdGlhbFZhbHVlLmR0eXBlKSB7XG4gICAgICBpbml0aWFsVmFsdWUgPSBpbml0aWFsVmFsdWUuY2FzdChkdHlwZSk7XG4gICAgfVxuICAgIGNvbnN0IHYgPSBuZXcgVmFyaWFibGUoaW5pdGlhbFZhbHVlLCB0cmFpbmFibGUsIG5hbWUsIHRoaXMubmV4dFRlbnNvcklkKCkpO1xuICAgIGlmICh0aGlzLnN0YXRlLnJlZ2lzdGVyZWRWYXJpYWJsZXNbdi5uYW1lXSAhPSBudWxsKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoYFZhcmlhYmxlIHdpdGggbmFtZSAke3YubmFtZX0gd2FzIGFscmVhZHkgcmVnaXN0ZXJlZGApO1xuICAgIH1cbiAgICB0aGlzLnN0YXRlLnJlZ2lzdGVyZWRWYXJpYWJsZXNbdi5uYW1lXSA9IHY7XG4gICAgdGhpcy5pbmNSZWYodiwgdGhpcy5iYWNrZW5kKTtcbiAgICByZXR1cm4gdjtcbiAgfVxuXG4gIHRyYWNrVGVuc29yKGE6IFRlbnNvciwgYmFja2VuZDogS2VybmVsQmFja2VuZCk6IHZvaWQge1xuICAgIHRoaXMuc3RhdGUubnVtVGVuc29ycysrO1xuICAgIGlmIChhLmR0eXBlID09PSAnc3RyaW5nJykge1xuICAgICAgdGhpcy5zdGF0ZS5udW1TdHJpbmdUZW5zb3JzKys7XG4gICAgfVxuICAgIC8vIEJ5dGVzIGZvciBjb21wbGV4IG51bWJlcnMgYXJlIGNvdW50ZWQgYnkgdGhlaXIgY29tcG9uZW50cy4gQnl0ZXMgZm9yXG4gICAgLy8gc3RyaW5nIHRlbnNvcnMgYXJlIGNvdW50ZWQgd2hlbiB3cml0aW5nIHZhbHVlcy5cbiAgICBsZXQgYnl0ZXMgPSAwO1xuICAgIGlmIChhLmR0eXBlICE9PSAnY29tcGxleDY0JyAmJiBhLmR0eXBlICE9PSAnc3RyaW5nJykge1xuICAgICAgYnl0ZXMgPSBhLnNpemUgKiB1dGlsLmJ5dGVzUGVyRWxlbWVudChhLmR0eXBlKTtcbiAgICB9XG4gICAgdGhpcy5zdGF0ZS5udW1CeXRlcyArPSBieXRlcztcblxuICAgIGlmICghdGhpcy5zdGF0ZS50ZW5zb3JJbmZvLmhhcyhhLmRhdGFJZCkpIHtcbiAgICAgIHRoaXMuc3RhdGUubnVtRGF0YUJ1ZmZlcnMrKztcbiAgICAgIHRoaXMuc3RhdGUudGVuc29ySW5mby5zZXQoYS5kYXRhSWQsIHtcbiAgICAgICAgYmFja2VuZDogYmFja2VuZCB8fCB0aGlzLmJhY2tlbmQsXG4gICAgICAgIGR0eXBlOiBhLmR0eXBlLFxuICAgICAgICBzaGFwZTogYS5zaGFwZSxcbiAgICAgICAgYnl0ZXNcbiAgICAgIH0pO1xuICAgIH1cblxuICAgIGlmICghKGEgaW5zdGFuY2VvZiBWYXJpYWJsZSkpIHtcbiAgICAgIHRoaXMudHJhY2soYSk7XG4gICAgfVxuICB9XG5cbiAgLy8gVHJhY2sgdGhlIHRlbnNvciBieSBkYXRhSWQgYW5kIGluY3JlYXNlIHRoZSByZWZDb3VudCBmb3IgdGhlIGRhdGFJZCBpbiB0aGVcbiAgLy8gYmFja2VuZC5cbiAgLy8gVE9ETyhweXUxMDA1NSk6IFRoaXMgaXMgY3VycmVudGx5IHVzZWQgYnkgbWFrZVZhcmlhYmxlIG1ldGhvZCwgdG8gaW5jcmVhc2VcbiAgLy8gcmVmQ291bnQgb24gdGhlIGJhY2tlbmQgZm9yIHRoZSBkYXRhSWQuIEl0IGNhbiBwb3RlbnRpYWxseSBiZSByZXBsYWNlZCB3aXRoXG4gIC8vIElkZW50aXR5IG9wIGluZGVhZCBvZiBjYWxsaW5nIGJhY2tlbmQgZGlyZWN0bHkuXG4gIGluY1JlZihhOiBUZW5zb3IsIGJhY2tlbmQ6IEtlcm5lbEJhY2tlbmQpOiB2b2lkIHtcbiAgICB0aGlzLnRyYWNrVGVuc29yKGEsIGJhY2tlbmQpO1xuICAgIHRoaXMuYmFja2VuZC5pbmNSZWYoYS5kYXRhSWQpO1xuICB9XG5cbiAgcmVtb3ZlRGF0YUlkKGRhdGFJZDogRGF0YUlkLCBiYWNrZW5kOiBLZXJuZWxCYWNrZW5kKSB7XG4gICAgaWYgKHRoaXMuc3RhdGUudGVuc29ySW5mby5oYXMoZGF0YUlkKSAmJlxuICAgICAgICB0aGlzLnN0YXRlLnRlbnNvckluZm8uZ2V0KGRhdGFJZCkuYmFja2VuZCA9PT0gYmFja2VuZCkge1xuICAgICAgdGhpcy5zdGF0ZS50ZW5zb3JJbmZvLmRlbGV0ZShkYXRhSWQpO1xuICAgICAgdGhpcy5zdGF0ZS5udW1EYXRhQnVmZmVycy0tO1xuICAgIH1cbiAgfVxuICBkaXNwb3NlVGVuc29yKGE6IFRlbnNvcik6IHZvaWQge1xuICAgIGlmICghdGhpcy5zdGF0ZS50ZW5zb3JJbmZvLmhhcyhhLmRhdGFJZCkpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgY29uc3QgaW5mbyA9IHRoaXMuc3RhdGUudGVuc29ySW5mby5nZXQoYS5kYXRhSWQpO1xuXG4gICAgdGhpcy5zdGF0ZS5udW1UZW5zb3JzLS07XG4gICAgaWYgKGEuZHR5cGUgPT09ICdzdHJpbmcnKSB7XG4gICAgICB0aGlzLnN0YXRlLm51bVN0cmluZ1RlbnNvcnMtLTtcbiAgICAgIHRoaXMuc3RhdGUubnVtQnl0ZXMgLT0gaW5mby5ieXRlcztcbiAgICB9XG4gICAgLy8gRG9uJ3QgY291bnQgYnl0ZXMgZm9yIGNvbXBsZXggbnVtYmVycyBhcyB0aGV5IGFyZSBjb3VudGVkIGJ5IHRoZWlyXG4gICAgLy8gY29tcG9uZW50cy5cbiAgICBpZiAoYS5kdHlwZSAhPT0gJ2NvbXBsZXg2NCcgJiYgYS5kdHlwZSAhPT0gJ3N0cmluZycpIHtcbiAgICAgIGNvbnN0IGJ5dGVzID0gYS5zaXplICogdXRpbC5ieXRlc1BlckVsZW1lbnQoYS5kdHlwZSk7XG4gICAgICB0aGlzLnN0YXRlLm51bUJ5dGVzIC09IGJ5dGVzO1xuICAgIH1cblxuICAgIC8vIFJlbW92ZSB0aGUgcmVmZXJlbmNlIHRvIGRhdGFJZCBpZiBiYWNrZW5kIGRpc3Bvc2UgdGhlIGRhdGEgc3VjY2Vzc2Z1bGx5XG4gICAgaWYgKGluZm8uYmFja2VuZC5kaXNwb3NlRGF0YShhLmRhdGFJZCkpIHtcbiAgICAgIHRoaXMucmVtb3ZlRGF0YUlkKGEuZGF0YUlkLCBpbmZvLmJhY2tlbmQpO1xuICAgIH1cblxuICAgIC8vIFRPRE8obnN0aG9yYXQpOiBDb25zdHJ1Y3QgYW4gZXJyb3IgYW5kIHNhdmUgdGhlIHN0YWNrIHRyYWNlIGZvclxuICAgIC8vIGRlYnVnZ2luZyB3aGVuIGluIGRlYnVnIG1vZGUuIENyZWF0aW5nIGEgc3RhY2sgdHJhY2UgaXMgdG9vIGV4cGVuc2l2ZVxuICAgIC8vIHRvIGRvIHVuY29uZGl0aW9uYWxseS5cbiAgfVxuXG4gIGRpc3Bvc2VWYXJpYWJsZXMoKTogdm9pZCB7XG4gICAgZm9yIChjb25zdCB2YXJOYW1lIGluIHRoaXMuc3RhdGUucmVnaXN0ZXJlZFZhcmlhYmxlcykge1xuICAgICAgY29uc3QgdiA9IHRoaXMuc3RhdGUucmVnaXN0ZXJlZFZhcmlhYmxlc1t2YXJOYW1lXTtcbiAgICAgIHRoaXMuZGlzcG9zZVZhcmlhYmxlKHYpO1xuICAgIH1cbiAgfVxuXG4gIGRpc3Bvc2VWYXJpYWJsZSh2OiBWYXJpYWJsZSk6IHZvaWQge1xuICAgIHRoaXMuZGlzcG9zZVRlbnNvcih2KTtcbiAgICBpZiAodGhpcy5zdGF0ZS5yZWdpc3RlcmVkVmFyaWFibGVzW3YubmFtZV0gIT0gbnVsbCkge1xuICAgICAgZGVsZXRlIHRoaXMuc3RhdGUucmVnaXN0ZXJlZFZhcmlhYmxlc1t2Lm5hbWVdO1xuICAgIH1cbiAgfVxuXG4gIG1lbW9yeSgpOiBNZW1vcnlJbmZvIHtcbiAgICBjb25zdCBpbmZvID0gdGhpcy5iYWNrZW5kLm1lbW9yeSgpIGFzIE1lbW9yeUluZm87XG4gICAgaW5mby5udW1UZW5zb3JzID0gdGhpcy5zdGF0ZS5udW1UZW5zb3JzO1xuICAgIGluZm8ubnVtRGF0YUJ1ZmZlcnMgPSB0aGlzLnN0YXRlLm51bURhdGFCdWZmZXJzO1xuICAgIGluZm8ubnVtQnl0ZXMgPSB0aGlzLnN0YXRlLm51bUJ5dGVzO1xuICAgIGlmICh0aGlzLnN0YXRlLm51bVN0cmluZ1RlbnNvcnMgPiAwKSB7XG4gICAgICBpbmZvLnVucmVsaWFibGUgPSB0cnVlO1xuICAgICAgaWYgKGluZm8ucmVhc29ucyA9PSBudWxsKSB7XG4gICAgICAgIGluZm8ucmVhc29ucyA9IFtdO1xuICAgICAgfVxuICAgICAgaW5mby5yZWFzb25zLnB1c2goXG4gICAgICAgICAgJ01lbW9yeSB1c2FnZSBieSBzdHJpbmcgdGVuc29ycyBpcyBhcHByb3hpbWF0ZSAnICtcbiAgICAgICAgICAnKDIgYnl0ZXMgcGVyIGNoYXJhY3RlciknKTtcbiAgICB9XG4gICAgcmV0dXJuIGluZm87XG4gIH1cblxuICBhc3luYyBwcm9maWxlKHF1ZXJ5OiAoKSA9PiAoVGVuc29yQ29udGFpbmVyIHwgUHJvbWlzZTxUZW5zb3JDb250YWluZXI+KSk6XG4gICAgICBQcm9taXNlPFByb2ZpbGVJbmZvPiB7XG4gICAgdGhpcy5zdGF0ZS5wcm9maWxpbmcgPSB0cnVlO1xuXG4gICAgY29uc3Qgc3RhcnRCeXRlcyA9IHRoaXMuc3RhdGUubnVtQnl0ZXM7XG4gICAgY29uc3Qgc3RhcnROdW1UZW5zb3JzID0gdGhpcy5zdGF0ZS5udW1UZW5zb3JzO1xuXG4gICAgdGhpcy5zdGF0ZS5hY3RpdmVQcm9maWxlLmtlcm5lbHMgPSBbXTtcbiAgICB0aGlzLnN0YXRlLmFjdGl2ZVByb2ZpbGUucmVzdWx0ID0gYXdhaXQgcXVlcnkoKTtcblxuICAgIHRoaXMuc3RhdGUucHJvZmlsaW5nID0gZmFsc2U7XG5cbiAgICB0aGlzLnN0YXRlLmFjdGl2ZVByb2ZpbGUucGVha0J5dGVzID0gTWF0aC5tYXgoXG4gICAgICAgIC4uLnRoaXMuc3RhdGUuYWN0aXZlUHJvZmlsZS5rZXJuZWxzLm1hcChkID0+IGQudG90YWxCeXRlc1NuYXBzaG90KSk7XG4gICAgdGhpcy5zdGF0ZS5hY3RpdmVQcm9maWxlLm5ld0J5dGVzID0gdGhpcy5zdGF0ZS5udW1CeXRlcyAtIHN0YXJ0Qnl0ZXM7XG4gICAgdGhpcy5zdGF0ZS5hY3RpdmVQcm9maWxlLm5ld1RlbnNvcnMgPVxuICAgICAgICB0aGlzLnN0YXRlLm51bVRlbnNvcnMgLSBzdGFydE51bVRlbnNvcnM7XG4gICAgZm9yIChjb25zdCBrZXJuZWwgb2YgdGhpcy5zdGF0ZS5hY3RpdmVQcm9maWxlLmtlcm5lbHMpIHtcbiAgICAgIGtlcm5lbC5rZXJuZWxUaW1lTXMgPSBhd2FpdCBrZXJuZWwua2VybmVsVGltZU1zO1xuICAgICAga2VybmVsLmV4dHJhSW5mbyA9IGF3YWl0IGtlcm5lbC5leHRyYUluZm87XG4gICAgfVxuICAgIHJldHVybiB0aGlzLnN0YXRlLmFjdGl2ZVByb2ZpbGU7XG4gIH1cblxuICBpc1RhcGVPbigpOiBib29sZWFuIHtcbiAgICByZXR1cm4gdGhpcy5zdGF0ZS5ncmFkaWVudERlcHRoID4gMCAmJiB0aGlzLnN0YXRlLmtlcm5lbERlcHRoID09PSAwO1xuICB9XG5cbiAgcHJpdmF0ZSBhZGRUYXBlTm9kZShcbiAgICAgIGtlcm5lbE5hbWU6IHN0cmluZywgaW5wdXRzOiBOYW1lZFRlbnNvck1hcCwgb3V0cHV0czogVGVuc29yW10sXG4gICAgICBncmFkaWVudHNGdW5jOiBHcmFkRnVuYywgc2F2ZWQ6IFRlbnNvcltdLCBhdHRyczogTmFtZWRBdHRyTWFwKTogdm9pZCB7XG4gICAgY29uc3QgdGFwZU5vZGU6IFRhcGVOb2RlID1cbiAgICAgICAge2lkOiB0aGlzLnN0YXRlLm5leHRUYXBlTm9kZUlkKyssIGtlcm5lbE5hbWUsIGlucHV0cywgb3V0cHV0cywgc2F2ZWR9O1xuXG4gICAgY29uc3QgZ3JhZENvbmZpZyA9IGdldEdyYWRpZW50KGtlcm5lbE5hbWUpO1xuICAgIGlmIChncmFkQ29uZmlnICE9IG51bGwpIHtcbiAgICAgIGdyYWRpZW50c0Z1bmMgPSBncmFkQ29uZmlnLmdyYWRGdW5jO1xuICAgIH1cbiAgICBpZiAoZ3JhZGllbnRzRnVuYyAhPSBudWxsKSB7XG4gICAgICB0YXBlTm9kZS5ncmFkaWVudCA9IChkeXM6IFRlbnNvcltdKSA9PiB7XG4gICAgICAgIC8vIFRPRE8oc21pbGtvdik6IFRvIG9wdGltaXplIGJhY2stcHJvcCwgcGFzcyBkeXMgdGhhdCBhcmUgbm90IHVzZWQgaW5cbiAgICAgICAgLy8gdGhlIGJhY2twcm9wIGdyYXBoIHRvIHRoZSB1c2VyIGFzIG51bGwgaW5zdGVhZCBvZiB6ZXJvc1xuICAgICAgICBkeXMgPSBkeXMubWFwKChkeSwgaSkgPT4ge1xuICAgICAgICAgIGlmIChkeSA9PSBudWxsKSB7XG4gICAgICAgICAgICBjb25zdCBvdXRwdXQgPSBvdXRwdXRzW2ldO1xuICAgICAgICAgICAgY29uc3QgdmFscyA9IHV0aWwubWFrZVplcm9zVHlwZWRBcnJheShvdXRwdXQuc2l6ZSwgb3V0cHV0LmR0eXBlKTtcbiAgICAgICAgICAgIHJldHVybiB0aGlzLm1ha2VUZW5zb3IodmFscywgb3V0cHV0LnNoYXBlLCBvdXRwdXQuZHR5cGUpO1xuICAgICAgICAgIH1cbiAgICAgICAgICByZXR1cm4gZHk7XG4gICAgICAgIH0pO1xuICAgICAgICAvLyBHcmFkIGZ1bmN0aW9ucyBvZiBvcHMgd2l0aCBzaW5nbGUgb3V0cHV0cyBleHBlY3QgYSBkeSwgd2hpbGUgb3BzXG4gICAgICAgIC8vIHdpdGggbXVsdGlwbGUgb3V0cHV0cyBleHBlY3QgZHlzIChhcnJheSBvZiBkeSkuXG4gICAgICAgIHJldHVybiBncmFkaWVudHNGdW5jKGR5cy5sZW5ndGggPiAxID8gZHlzIDogZHlzWzBdLCBzYXZlZCwgYXR0cnMpO1xuICAgICAgfTtcbiAgICB9XG4gICAgdGhpcy5zdGF0ZS5hY3RpdmVUYXBlLnB1c2godGFwZU5vZGUpO1xuICB9XG5cbiAga2VlcDxUIGV4dGVuZHMgVGVuc29yPihyZXN1bHQ6IFQpOiBUIHtcbiAgICByZXN1bHQua2VwdCA9IHRydWU7XG4gICAgcmV0dXJuIHJlc3VsdDtcbiAgfVxuXG4gIHByaXZhdGUgc3RhcnRUYXBlKCkge1xuICAgIGlmICh0aGlzLnN0YXRlLmdyYWRpZW50RGVwdGggPT09IDApIHtcbiAgICAgIHRoaXMuc3RhdGUuYWN0aXZlVGFwZSA9IFtdO1xuICAgIH1cbiAgICB0aGlzLnN0YXRlLmdyYWRpZW50RGVwdGgrKztcbiAgfVxuXG4gIHByaXZhdGUgZW5kVGFwZSgpIHtcbiAgICB0aGlzLnN0YXRlLmdyYWRpZW50RGVwdGgtLTtcbiAgfVxuXG4gIC8qKlxuICAgKiBTdGFydCBhIHNjb3BlLiBVc2UgdGhpcyB3aXRoIGVuZFNjb3BlKCkgdG8gYWNoaWV2ZSB0aGUgc2FtZSBmdW5jdGlvbmFsaXR5XG4gICAqIGFzIHNjb3BlKCkgd2l0aG91dCB0aGUgbmVlZCBmb3IgYSBmdW5jdGlvbiBjbG9zdXJlLlxuICAgKi9cbiAgc3RhcnRTY29wZShuYW1lPzogc3RyaW5nKSB7XG4gICAgY29uc3Qgc2NvcGVJbmZvOiBTY29wZVN0YXRlID0ge1xuICAgICAgdHJhY2s6IFtdLFxuICAgICAgbmFtZTogJ3VubmFtZWQgc2NvcGUnLFxuICAgICAgaWQ6IHRoaXMuc3RhdGUubmV4dFNjb3BlSWQrK1xuICAgIH07XG4gICAgaWYgKG5hbWUpIHtcbiAgICAgIHNjb3BlSW5mby5uYW1lID0gbmFtZTtcbiAgICB9XG4gICAgdGhpcy5zdGF0ZS5zY29wZVN0YWNrLnB1c2goc2NvcGVJbmZvKTtcbiAgICB0aGlzLnN0YXRlLmFjdGl2ZVNjb3BlID0gc2NvcGVJbmZvO1xuICB9XG5cbiAgLyoqXG4gICAqIEVuZCBhIHNjb3BlLiBVc2UgdGhpcyB3aXRoIHN0YXJ0U2NvcGUoKSB0byBhY2hpZXZlIHRoZSBzYW1lIGZ1bmN0aW9uYWxpdHlcbiAgICogYXMgc2NvcGUoKSB3aXRob3V0IHRoZSBuZWVkIGZvciBhIGZ1bmN0aW9uIGNsb3N1cmUuXG4gICAqL1xuICBlbmRTY29wZShyZXN1bHQ/OiBUZW5zb3JDb250YWluZXIpIHtcbiAgICBjb25zdCB0ZW5zb3JzVG9UcmFja0luUGFyZW50ID0gZ2V0VGVuc29yc0luQ29udGFpbmVyKHJlc3VsdCk7XG4gICAgY29uc3QgdGVuc29yc1RvVHJhY2tJblBhcmVudFNldCA9XG4gICAgICAgIG5ldyBTZXQodGVuc29yc1RvVHJhY2tJblBhcmVudC5tYXAodCA9PiB0LmlkKSk7XG5cbiAgICAvLyBEaXNwb3NlIHRoZSBhcnJheXMgdHJhY2tlZCBpbiB0aGlzIHNjb3BlLlxuICAgIGZvciAobGV0IGkgPSAwOyBpIDwgdGhpcy5zdGF0ZS5hY3RpdmVTY29wZS50cmFjay5sZW5ndGg7IGkrKykge1xuICAgICAgY29uc3QgdGVuc29yID0gdGhpcy5zdGF0ZS5hY3RpdmVTY29wZS50cmFja1tpXTtcbiAgICAgIGlmICghdGVuc29yLmtlcHQgJiYgIXRlbnNvcnNUb1RyYWNrSW5QYXJlbnRTZXQuaGFzKHRlbnNvci5pZCkpIHtcbiAgICAgICAgdGVuc29yLmRpc3Bvc2UoKTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICBjb25zdCBvbGRTY29wZSA9IHRoaXMuc3RhdGUuc2NvcGVTdGFjay5wb3AoKTtcbiAgICB0aGlzLnN0YXRlLmFjdGl2ZVNjb3BlID0gdGhpcy5zdGF0ZS5zY29wZVN0YWNrLmxlbmd0aCA9PT0gMCA/XG4gICAgICAgIG51bGwgOlxuICAgICAgICB0aGlzLnN0YXRlLnNjb3BlU3RhY2tbdGhpcy5zdGF0ZS5zY29wZVN0YWNrLmxlbmd0aCAtIDFdO1xuXG4gICAgLy8gVHJhY2sgdGhlIGN1cnJlbnQgcmVzdWx0IGluIHRoZSBwYXJlbnQgc2NvcGUuXG4gICAgdGVuc29yc1RvVHJhY2tJblBhcmVudC5mb3JFYWNoKHRlbnNvciA9PiB7XG4gICAgICAvLyBPbmx5IHRyYWNrIHRoZSB0ZW5zb3IgaWYgd2FzIGFsbG9jYXRlZCBpbiB0aGUgaW5uZXIgc2NvcGUgYW5kIGlzIG5vdFxuICAgICAgLy8gZ2xvYmFsbHkga2VwdC5cbiAgICAgIGlmICghdGVuc29yLmtlcHQgJiYgdGVuc29yLnNjb3BlSWQgPT09IG9sZFNjb3BlLmlkKSB7XG4gICAgICAgIHRoaXMudHJhY2sodGVuc29yKTtcbiAgICAgIH1cbiAgICB9KTtcbiAgfVxuXG4gIC8qKlxuICAgKiBSZXR1cm5zIGdyYWRpZW50cyBvZiBgZmAgd2l0aCByZXNwZWN0IHRvIGVhY2ggb2YgdGhlIGB4c2AuIFRoZSBncmFkaWVudHNcbiAgICogcmV0dXJuZWQgYXJlIG9mIHRoZSBzYW1lIGxlbmd0aCBhcyBgeHNgLCBidXQgc29tZSBtaWdodCBiZSBudWxsIGlmIGBmYFxuICAgKiB3YXMgbm90IGEgZnVuY3Rpb24gb2YgdGhhdCBgeGAuIEl0IGFsc28gdGFrZXMgb3B0aW9uYWwgZHkgdG8gbXVsdGlwbHkgdGhlXG4gICAqIGdyYWRpZW50LCB3aGljaCBkZWZhdWx0cyB0byBgMWAuXG4gICAqL1xuICBncmFkaWVudHM8VCBleHRlbmRzIFRlbnNvcj4oXG4gICAgICBmOiAoKSA9PiBULCB4czogVGVuc29yW10sIGR5PzogVCxcbiAgICAgIGFsbG93Tm9HcmFkaWVudHMgPSBmYWxzZSk6IHt2YWx1ZTogVCwgZ3JhZHM6IFRlbnNvcltdfSB7XG4gICAgdXRpbC5hc3NlcnQoXG4gICAgICAgIHhzLmxlbmd0aCA+IDAsICgpID0+ICdncmFkaWVudHMoKSByZWNlaXZlZCBhbiBlbXB0eSBsaXN0IG9mIHhzLicpO1xuICAgIGlmIChkeSAhPSBudWxsICYmIGR5LmR0eXBlICE9PSAnZmxvYXQzMicpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcihgZHkgbXVzdCBoYXZlICdmbG9hdDMyJyBkdHlwZSwgYnV0IGhhcyAnJHtkeS5kdHlwZX0nYCk7XG4gICAgfVxuXG4gICAgY29uc3QgeSA9IHRoaXMuc2NvcGVkUnVuKFxuICAgICAgICAoKSA9PiB0aGlzLnN0YXJ0VGFwZSgpLCAoKSA9PiB0aGlzLmVuZFRhcGUoKSxcbiAgICAgICAgKCkgPT4gdGhpcy50aWR5KCdmb3J3YXJkJywgZikpO1xuXG4gICAgdXRpbC5hc3NlcnQoXG4gICAgICAgIHkgaW5zdGFuY2VvZiBUZW5zb3IsXG4gICAgICAgICgpID0+ICdUaGUgcmVzdWx0IHkgcmV0dXJuZWQgYnkgZigpIG11c3QgYmUgYSB0ZW5zb3IuJyk7XG4gICAgLy8gRmlsdGVyIG91dCB0aGUgbm9kZXMgdGhhdCBkb24ndCBjb25uZWN0IHggPT4geS5cbiAgICBjb25zdCBmaWx0ZXJlZFRhcGUgPSBnZXRGaWx0ZXJlZE5vZGVzWFRvWSh0aGlzLnN0YXRlLmFjdGl2ZVRhcGUsIHhzLCB5KTtcbiAgICBpZiAoIWFsbG93Tm9HcmFkaWVudHMgJiYgZmlsdGVyZWRUYXBlLmxlbmd0aCA9PT0gMCAmJiB4cy5sZW5ndGggPiAwKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoXG4gICAgICAgICAgJ0Nhbm5vdCBjb21wdXRlIGdyYWRpZW50IG9mIHk9Zih4KSB3aXRoIHJlc3BlY3QgdG8geC4gTWFrZSBzdXJlICcgK1xuICAgICAgICAgICd0aGF0IHRoZSBmIHlvdSBwYXNzZWQgZW5jbG9zZXMgYWxsIG9wZXJhdGlvbnMgdGhhdCBsZWFkIGZyb20geCAnICtcbiAgICAgICAgICAndG8geS4nKTtcbiAgICB9XG5cbiAgICByZXR1cm4gdGhpcy50aWR5KCdiYWNrd2FyZCcsICgpID0+IHtcbiAgICAgIGNvbnN0IGFjY3VtdWxhdGVkR3JhZGllbnRNYXA6IHtbdGVuc29ySWQ6IG51bWJlcl06IFRlbnNvcn0gPSB7fTtcbiAgICAgIGFjY3VtdWxhdGVkR3JhZGllbnRNYXBbeS5pZF0gPSAoZHkgPT0gbnVsbCkgPyBvbmVzKHkuc2hhcGUpIDogZHk7XG5cbiAgICAgIC8vIEJhY2twcm9wIGdyYWRpZW50cyB0aHJvdWdoIHRoZSBmaWx0ZXJlZCBub2Rlcy5cbiAgICAgIGJhY2twcm9wYWdhdGVHcmFkaWVudHMoXG4gICAgICAgICAgYWNjdW11bGF0ZWRHcmFkaWVudE1hcCwgZmlsdGVyZWRUYXBlLFxuICAgICAgICAgIC8vIFBhc3MgdGhlIHRpZHkgZnVuY3Rpb24gdG8gYXZvaWQgY2lyY3VsYXIgZGVwIHdpdGggYHRhcGUudHNgLlxuICAgICAgICAgIGYgPT4gdGhpcy50aWR5KGYgYXMgU2NvcGVGbjxUZW5zb3I+KSxcbiAgICAgICAgICAvLyBQYXNzIGFuIGFkZCBmdW5jdGlvbiB0byBhdm9pZGUgYSBjaXJjdWxhciBkZXAgd2l0aCBgdGFwZS50c2AuXG4gICAgICAgICAgYWRkKTtcbiAgICAgIGNvbnN0IGdyYWRzID0geHMubWFwKHggPT4gYWNjdW11bGF0ZWRHcmFkaWVudE1hcFt4LmlkXSk7XG5cbiAgICAgIGlmICh0aGlzLnN0YXRlLmdyYWRpZW50RGVwdGggPT09IDApIHtcbiAgICAgICAgLy8gVGhpcyBtZWFucyB0aGF0IHdlIGFyZSBub3QgY29tcHV0aW5nIGhpZ2hlci1vcmRlciBncmFkaWVudHNcbiAgICAgICAgLy8gYW5kIGNhbiBjbGVhbiB1cCB0aGUgdGFwZS5cbiAgICAgICAgdGhpcy5zdGF0ZS5hY3RpdmVUYXBlLmZvckVhY2gobm9kZSA9PiB7XG4gICAgICAgICAgZm9yIChjb25zdCB0ZW5zb3Igb2Ygbm9kZS5zYXZlZCkge1xuICAgICAgICAgICAgdGVuc29yLmRpc3Bvc2UoKTtcbiAgICAgICAgICB9XG4gICAgICAgIH0pO1xuICAgICAgICB0aGlzLnN0YXRlLmFjdGl2ZVRhcGUgPSBudWxsO1xuICAgICAgfVxuICAgICAgcmV0dXJuIHt2YWx1ZTogeSwgZ3JhZHN9O1xuICAgIH0pO1xuICB9XG5cbiAgY3VzdG9tR3JhZDxUIGV4dGVuZHMgVGVuc29yPihmOiBDdXN0b21HcmFkaWVudEZ1bmM8VD4pOlxuICAgICAgKC4uLmFyZ3M6IEFycmF5PFRlbnNvcnxHcmFkU2F2ZUZ1bmM+KSA9PiBUIHtcbiAgICB1dGlsLmFzc2VydChcbiAgICAgICAgdXRpbC5pc0Z1bmN0aW9uKGYpLFxuICAgICAgICAoKSA9PiAnVGhlIGYgcGFzc2VkIGluIGN1c3RvbUdyYWQoZikgbXVzdCBiZSBhIGZ1bmN0aW9uLicpO1xuICAgIHJldHVybiAoLi4uaW5wdXRzOiBUZW5zb3JbXSk6IFQgPT4ge1xuICAgICAgdXRpbC5hc3NlcnQoXG4gICAgICAgICAgaW5wdXRzLmV2ZXJ5KHQgPT4gdCBpbnN0YW5jZW9mIFRlbnNvciksXG4gICAgICAgICAgKCkgPT4gJ1RoZSBhcmdzIHBhc3NlZCBpbiBjdXN0b21HcmFkKGYpKHgxLCB4MiwuLi4pIG11c3QgYWxsIGJlICcgK1xuICAgICAgICAgICAgICAndGVuc29ycycpO1xuXG4gICAgICBsZXQgcmVzOiB7XG4gICAgICAgIHZhbHVlOiBULFxuICAgICAgICBncmFkRnVuYzogKGR5OiBULCBzYXZlZDogVGVuc29yW10pID0+IFRlbnNvciB8IFRlbnNvcltdLFxuICAgICAgfTtcbiAgICAgIGNvbnN0IGlucHV0TWFwOiBOYW1lZFRlbnNvck1hcCA9IHt9O1xuICAgICAgaW5wdXRzLmZvckVhY2goKGlucHV0LCBpKSA9PiB7XG4gICAgICAgIGlucHV0TWFwW2ldID0gaW5wdXQ7XG4gICAgICB9KTtcblxuICAgICAgY29uc3QgZm9yd2FyZEZ1bmM6IEZvcndhcmRGdW5jPFQ+ID0gKF8sIHNhdmUpID0+IHtcbiAgICAgICAgcmVzID0gZiguLi5bLi4uaW5wdXRzLCBzYXZlXSk7XG4gICAgICAgIHV0aWwuYXNzZXJ0KFxuICAgICAgICAgICAgcmVzLnZhbHVlIGluc3RhbmNlb2YgVGVuc29yLFxuICAgICAgICAgICAgKCkgPT4gJ1RoZSBmdW5jdGlvbiBmIHBhc3NlZCBpbiBjdXN0b21HcmFkKGYpIG11c3QgcmV0dXJuIGFuICcgK1xuICAgICAgICAgICAgICAgICdvYmplY3Qgd2hlcmUgYG9iai52YWx1ZWAgaXMgYSB0ZW5zb3InKTtcbiAgICAgICAgdXRpbC5hc3NlcnQoXG4gICAgICAgICAgICB1dGlsLmlzRnVuY3Rpb24ocmVzLmdyYWRGdW5jKSxcbiAgICAgICAgICAgICgpID0+ICdUaGUgZnVuY3Rpb24gZiBwYXNzZWQgaW4gY3VzdG9tR3JhZChmKSBtdXN0IHJldHVybiBhbiAnICtcbiAgICAgICAgICAgICAgICAnb2JqZWN0IHdoZXJlIGBvYmouZ3JhZEZ1bmNgIGlzIGEgZnVuY3Rpb24uJyk7XG4gICAgICAgIHJldHVybiByZXMudmFsdWU7XG4gICAgICB9O1xuXG4gICAgICBjb25zdCBiYWNrd2FyZHNGdW5jID0gKGR5OiBULCBzYXZlZDogVGVuc29yW10pID0+IHtcbiAgICAgICAgY29uc3QgZ3JhZFJlcyA9IHJlcy5ncmFkRnVuYyhkeSwgc2F2ZWQpO1xuICAgICAgICBjb25zdCBncmFkczogVGVuc29yW10gPSBBcnJheS5pc0FycmF5KGdyYWRSZXMpID8gZ3JhZFJlcyA6IFtncmFkUmVzXTtcbiAgICAgICAgdXRpbC5hc3NlcnQoXG4gICAgICAgICAgICBncmFkcy5sZW5ndGggPT09IGlucHV0cy5sZW5ndGgsXG4gICAgICAgICAgICAoKSA9PiAnVGhlIGZ1bmN0aW9uIGYgcGFzc2VkIGluIGN1c3RvbUdyYWQoZikgbXVzdCByZXR1cm4gYW4gJyArXG4gICAgICAgICAgICAgICAgJ29iamVjdCB3aGVyZSBgb2JqLmdyYWRGdW5jYCBpcyBhIGZ1bmN0aW9uIHRoYXQgcmV0dXJucyAnICtcbiAgICAgICAgICAgICAgICAndGhlIHNhbWUgbnVtYmVyIG9mIHRlbnNvcnMgYXMgaW5wdXRzIHBhc3NlZCB0byBmKC4uLikuJyk7XG4gICAgICAgIHV0aWwuYXNzZXJ0KFxuICAgICAgICAgICAgZ3JhZHMuZXZlcnkodCA9PiB0IGluc3RhbmNlb2YgVGVuc29yKSxcbiAgICAgICAgICAgICgpID0+ICdUaGUgZnVuY3Rpb24gZiBwYXNzZWQgaW4gY3VzdG9tR3JhZChmKSBtdXN0IHJldHVybiBhbiAnICtcbiAgICAgICAgICAgICAgICAnb2JqZWN0IHdoZXJlIGBvYmouZ3JhZEZ1bmNgIGlzIGEgZnVuY3Rpb24gdGhhdCByZXR1cm5zICcgK1xuICAgICAgICAgICAgICAgICdhIGxpc3Qgb2Ygb25seSB0ZW5zb3JzLicpO1xuICAgICAgICBjb25zdCBncmFkTWFwOiB7W2tleTogc3RyaW5nXTogKCkgPT4gVGVuc29yfSA9IHt9O1xuICAgICAgICBncmFkcy5mb3JFYWNoKChncmFkLCBpKSA9PiB7XG4gICAgICAgICAgZ3JhZE1hcFtpXSA9ICgpID0+IGdyYWQ7XG4gICAgICAgIH0pO1xuICAgICAgICByZXR1cm4gZ3JhZE1hcDtcbiAgICAgIH07XG5cbiAgICAgIHJldHVybiB0aGlzLnJ1bktlcm5lbEZ1bmMoe1xuICAgICAgICBmb3J3YXJkRnVuYyxcbiAgICAgICAgYmFja3dhcmRzRnVuYyxcbiAgICAgICAgaW5wdXRzOiBpbnB1dE1hcCxcbiAgICAgIH0pO1xuICAgIH07XG4gIH1cblxuICByZWFkU3luYyhkYXRhSWQ6IERhdGFJZCk6IEJhY2tlbmRWYWx1ZXMge1xuICAgIC8vIFJvdXRlIHRoZSByZWFkIHRvIHRoZSBjb3JyZWN0IGJhY2tlbmQuXG4gICAgY29uc3QgaW5mbyA9IHRoaXMuc3RhdGUudGVuc29ySW5mby5nZXQoZGF0YUlkKTtcbiAgICByZXR1cm4gaW5mby5iYWNrZW5kLnJlYWRTeW5jKGRhdGFJZCk7XG4gIH1cbiAgcmVhZChkYXRhSWQ6IERhdGFJZCk6IFByb21pc2U8QmFja2VuZFZhbHVlcz4ge1xuICAgIC8vIFJvdXRlIHRoZSByZWFkIHRvIHRoZSBjb3JyZWN0IGJhY2tlbmQuXG4gICAgY29uc3QgaW5mbyA9IHRoaXMuc3RhdGUudGVuc29ySW5mby5nZXQoZGF0YUlkKTtcbiAgICByZXR1cm4gaW5mby5iYWNrZW5kLnJlYWQoZGF0YUlkKTtcbiAgfVxuXG4gIHJlYWRUb0dQVShkYXRhSWQ6IERhdGFJZCwgb3B0aW9ucz86IERhdGFUb0dQVU9wdGlvbnMpOiBHUFVEYXRhIHtcbiAgICAvLyBSb3V0ZSB0aGUgcmVhZCB0byB0aGUgY29ycmVjdCBiYWNrZW5kLlxuICAgIGNvbnN0IGluZm8gPSB0aGlzLnN0YXRlLnRlbnNvckluZm8uZ2V0KGRhdGFJZCk7XG4gICAgcmV0dXJuIGluZm8uYmFja2VuZC5yZWFkVG9HUFUoZGF0YUlkLCBvcHRpb25zKTtcbiAgfVxuXG4gIGFzeW5jIHRpbWUocXVlcnk6ICgpID0+IHZvaWQpOiBQcm9taXNlPFRpbWluZ0luZm8+IHtcbiAgICBjb25zdCBzdGFydCA9IG5vdygpO1xuICAgIGNvbnN0IHRpbWluZ0luZm8gPSBhd2FpdCB0aGlzLmJhY2tlbmQudGltZShxdWVyeSkgYXMgVGltaW5nSW5mbztcbiAgICB0aW1pbmdJbmZvLndhbGxNcyA9IG5vdygpIC0gc3RhcnQ7XG4gICAgcmV0dXJuIHRpbWluZ0luZm87XG4gIH1cblxuICAvKipcbiAgICogVHJhY2tzIGEgVGVuc29yIGluIHRoZSBjdXJyZW50IHNjb3BlIHRvIGJlIGF1dG9tYXRpY2FsbHkgY2xlYW5lZCB1cFxuICAgKiB3aGVuIHRoZSBjdXJyZW50IHNjb3BlIGVuZHMsIGFuZCByZXR1cm5zIHRoZSB2YWx1ZS5cbiAgICpcbiAgICogQHBhcmFtIHJlc3VsdCBUaGUgVGVuc29yIHRvIHRyYWNrIGluIHRoZSBjdXJyZW50IHNjb3BlLlxuICAgKi9cbiAgcHJpdmF0ZSB0cmFjazxUIGV4dGVuZHMgVGVuc29yPihyZXN1bHQ6IFQpOiBUIHtcbiAgICBpZiAodGhpcy5zdGF0ZS5hY3RpdmVTY29wZSAhPSBudWxsKSB7XG4gICAgICByZXN1bHQuc2NvcGVJZCA9IHRoaXMuc3RhdGUuYWN0aXZlU2NvcGUuaWQ7XG4gICAgICB0aGlzLnN0YXRlLmFjdGl2ZVNjb3BlLnRyYWNrLnB1c2gocmVzdWx0KTtcbiAgICB9XG5cbiAgICByZXR1cm4gcmVzdWx0O1xuICB9XG5cbiAgZ2V0IHJlZ2lzdGVyZWRWYXJpYWJsZXMoKTogTmFtZWRWYXJpYWJsZU1hcCB7XG4gICAgcmV0dXJuIHRoaXMuc3RhdGUucmVnaXN0ZXJlZFZhcmlhYmxlcztcbiAgfVxuXG4gIC8qKlxuICAgKiBSZXNldHMgdGhlIGVuZ2luZSBzdGF0ZS4gUmVtb3ZlcyBhbGwgYmFja2VuZHMgYnV0IGRvZXMgbm90IHJlbW92ZVxuICAgKiByZWdpc3RlcmVkIGJhY2tlbmQgZmFjdG9yaWVzLlxuICAgKi9cbiAgcmVzZXQoKTogdm9pZCB7XG4gICAgLy8gTWFrZSBhbnkgcGVuZGluZyBwcm9taXNlIG9ic29sZXRlLlxuICAgIHRoaXMucGVuZGluZ0JhY2tlbmRJbml0SWQrKztcblxuICAgIHRoaXMuc3RhdGUuZGlzcG9zZSgpO1xuICAgIHRoaXMuRU5WLnJlc2V0KCk7XG4gICAgdGhpcy5zdGF0ZSA9IG5ldyBFbmdpbmVTdGF0ZSgpO1xuXG4gICAgZm9yIChjb25zdCBiYWNrZW5kTmFtZSBpbiB0aGlzLnJlZ2lzdHJ5KSB7XG4gICAgICB0aGlzLmRpc3Bvc2VSZWdpc3RlcmVkS2VybmVscyhiYWNrZW5kTmFtZSk7XG4gICAgICB0aGlzLnJlZ2lzdHJ5W2JhY2tlbmROYW1lXS5kaXNwb3NlKCk7XG4gICAgICBkZWxldGUgdGhpcy5yZWdpc3RyeVtiYWNrZW5kTmFtZV07XG4gICAgfVxuICAgIHRoaXMuYmFja2VuZE5hbWUgPSBudWxsO1xuICAgIHRoaXMuYmFja2VuZEluc3RhbmNlID0gbnVsbDtcbiAgICB0aGlzLnBlbmRpbmdCYWNrZW5kSW5pdCA9IG51bGw7XG4gIH1cbn1cblxuZnVuY3Rpb24gb25lcyhzaGFwZTogbnVtYmVyW10pOiBUZW5zb3Ige1xuICBjb25zdCB2YWx1ZXMgPSBtYWtlT25lc1R5cGVkQXJyYXkoc2l6ZUZyb21TaGFwZShzaGFwZSksICdmbG9hdDMyJyk7XG4gIHJldHVybiBFTkdJTkUubWFrZVRlbnNvcih2YWx1ZXMsIHNoYXBlLCAnZmxvYXQzMicpO1xufVxuXG5leHBvcnQgZnVuY3Rpb24gZ2V0T3JNYWtlRW5naW5lKCk6IEVuZ2luZSB7XG4gIGNvbnN0IG5zID0gZ2V0R2xvYmFsTmFtZXNwYWNlKCkgYXMge30gYXMge190ZmVuZ2luZTogRW5naW5lfTtcbiAgaWYgKG5zLl90ZmVuZ2luZSA9PSBudWxsKSB7XG4gICAgY29uc3QgZW52aXJvbm1lbnQgPSBuZXcgRW52aXJvbm1lbnQobnMpO1xuICAgIG5zLl90ZmVuZ2luZSA9IG5ldyBFbmdpbmUoZW52aXJvbm1lbnQpO1xuICB9XG4gIHNldEVudmlyb25tZW50R2xvYmFsKG5zLl90ZmVuZ2luZS5FTlYpO1xuXG4gIC8vIFRlbGwgdGhlIGN1cnJlbnQgdGVuc29yIGludGVyZmFjZSB0aGF0IHRoZSBnbG9iYWwgZW5naW5lIGlzIHJlc3BvbnNpYmxlXG4gIC8vIGZvciB0cmFja2luZy5cbiAgc2V0VGVuc29yVHJhY2tlcigoKSA9PiBucy5fdGZlbmdpbmUpO1xuICByZXR1cm4gbnMuX3RmZW5naW5lO1xufVxuXG5leHBvcnQgY29uc3QgRU5HSU5FID0gZ2V0T3JNYWtlRW5naW5lKCk7XG5cbi8qKlxuICogQSBpbXBsZW1lbnRhdGlvbiBvZiB0aGUgYWRkIG9wIGZvciB1c2Ugd2l0aGluIGVuZ2luZSBhbmQgdGFwZS5cbiAqXG4gKiBUaGlzIGFsbG93cyB1cyB0byBhdm9pZCBhIGNpcmN1bGFyIGRlcGVuZGVuY3kgYmV0d2VlbiBhZGQudHMgYW5kIGVuZ2luZS5cbiAqIEl0IGlzIGV4cG9ydGVkIHRvIGJlIGF2YWlsYWJsZSBpbiB0YXBlIHRlc3RzLlxuICovXG5leHBvcnQgZnVuY3Rpb24gYWRkKGE6IFRlbnNvciwgYjogVGVuc29yKTogVGVuc29yIHtcbiAgLy8gV2UgZHVwbGljYXRlIEFkZCBoZXJlIHRvIGF2b2lkIGEgY2lyY3VsYXIgZGVwZW5kZW5jeSB3aXRoIGFkZC50cy5cbiAgY29uc3QgaW5wdXRzID0ge2EsIGJ9O1xuICByZXR1cm4gRU5HSU5FLnJ1bktlcm5lbChBZGQsIGlucHV0cyBhcyB7fSBhcyBOYW1lZFRlbnNvck1hcCk7XG59XG4iXX0=","/**\n * @license\n * Copyright 2017 Google LLC. All Rights Reserved.\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n * =============================================================================\n */\nimport * as util from './util';\n/**\n * Computes a list of TapeNodes that connect x to y, filtering everything else\n * out and preserving the order of the original tape elements.\n *\n * @param tape The tape elements to filter.\n * @param xs The input Tensors.\n * @param y The output Tensor.\n */\nexport function getFilteredNodesXToY(tape, xs, y) {\n // Forward pass to compute all the nodes and Tensors that are transitively a\n // function of x.\n const tensorsFromX = {};\n const nodesFromX = {};\n for (let i = 0; i < xs.length; i++) {\n tensorsFromX[xs[i].id] = true;\n }\n for (let i = 0; i < tape.length; i++) {\n const node = tape[i];\n const nodeInputs = node.inputs;\n for (const inputName in nodeInputs) {\n const input = nodeInputs[inputName];\n let anyInputFromX = false;\n for (let j = 0; j < xs.length; j++) {\n if (tensorsFromX[input.id]) {\n node.outputs.forEach(output => tensorsFromX[output.id] = true);\n anyInputFromX = true;\n nodesFromX[node.id] = true;\n break;\n }\n }\n if (anyInputFromX) {\n break;\n }\n }\n }\n // Backward pass to find all of the nodes and Tensors that lead to y.\n const tensorsLeadToY = {};\n tensorsLeadToY[y.id] = true;\n const nodesToY = {};\n for (let i = tape.length - 1; i >= 0; i--) {\n const node = tape[i];\n const nodeInputs = node.inputs;\n // If any of the outputs lead to y, mark all of the inputs as leading to y.\n for (let j = 0; j < node.outputs.length; j++) {\n if (tensorsLeadToY[node.outputs[j].id]) {\n for (const inputName in nodeInputs) {\n tensorsLeadToY[nodeInputs[inputName].id] = true;\n nodesToY[node.id] = true;\n }\n break;\n }\n }\n }\n // Return the paths that come from x and lead to y.\n const filteredTape = [];\n for (let i = 0; i < tape.length; i++) {\n const node = tape[i];\n if (nodesFromX[node.id] && nodesToY[node.id]) {\n // Prune the inputs from the node that aren't a function of x.\n const prunedInputs = {};\n for (const inputName in node.inputs) {\n const nodeInput = node.inputs[inputName];\n if (tensorsFromX[nodeInput.id]) {\n prunedInputs[inputName] = nodeInput;\n }\n }\n // Copy the node and overwrite inputsAndArgs to the pruned version.\n const prunedNode = Object.assign({}, node);\n prunedNode.inputs = prunedInputs;\n prunedNode.outputs = node.outputs;\n filteredTape.push(prunedNode);\n }\n }\n return filteredTape;\n}\n/**\n * Backpropagate gradients through the filtered TapeNodes.\n *\n * @param tensorAccumulatedGradientMap A map of Tensor to its gradient. This map\n * is mutated by this method.\n * @param filteredTape The filtered TapeNodes to backprop through.\n */\nexport function backpropagateGradients(tensorAccumulatedGradientMap, filteredTape, tidy, add) {\n // Walk the tape backward and keep a map of Tensor to its gradient.\n for (let i = filteredTape.length - 1; i >= 0; i--) {\n const node = filteredTape[i];\n const dys = [];\n node.outputs.forEach(o => {\n const gradTensor = tensorAccumulatedGradientMap[o.id];\n if (gradTensor != null) {\n dys.push(gradTensor);\n }\n else {\n // This particular output is not in the back-propagation subgraph, so it\n // does not affect the final output, thus we put null for its dy.\n dys.push(null);\n }\n });\n if (node.gradient == null) {\n throw new Error(`Cannot compute gradient: gradient function not found ` +\n `for ${node.kernelName}.`);\n }\n // Backprop dy through this node and accumulate gradients over the inputs.\n const inputGradients = node.gradient(dys);\n for (const inputName in node.inputs) {\n if (!(inputName in inputGradients)) {\n throw new Error(`Cannot backprop through input ${inputName}. ` +\n `Available gradients found: ${Object.keys(inputGradients)}.`);\n }\n // Call the gradient function.\n const dx = tidy(() => inputGradients[inputName]());\n if (dx.dtype !== 'float32') {\n throw new Error(`Error in gradient for op ${node.kernelName}. The gradient of input ` +\n `${inputName} must have 'float32' dtype, but has '${dx.dtype}'`);\n }\n const x = node.inputs[inputName];\n if (!util.arraysEqual(dx.shape, x.shape)) {\n throw new Error(`Error in gradient for op ${node.kernelName}. The gradient of input ` +\n `'${inputName}' has shape '${dx.shape}', which does not match ` +\n `the shape of the input '${x.shape}'`);\n }\n if (tensorAccumulatedGradientMap[x.id] == null) {\n tensorAccumulatedGradientMap[x.id] = dx;\n }\n else {\n const curGradient = tensorAccumulatedGradientMap[x.id];\n tensorAccumulatedGradientMap[x.id] = add(curGradient, dx);\n curGradient.dispose();\n }\n }\n }\n}\n//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidGFwZS5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uL3RmanMtY29yZS9zcmMvdGFwZS50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQTs7Ozs7Ozs7Ozs7Ozs7O0dBZUc7QUFJSCxPQUFPLEtBQUssSUFBSSxNQUFNLFFBQVEsQ0FBQztBQWdCL0I7Ozs7Ozs7R0FPRztBQUNILE1BQU0sVUFBVSxvQkFBb0IsQ0FDaEMsSUFBZ0IsRUFBRSxFQUFZLEVBQUUsQ0FBUztJQUMzQyw0RUFBNEU7SUFDNUUsaUJBQWlCO0lBQ2pCLE1BQU0sWUFBWSxHQUFrQyxFQUFFLENBQUM7SUFDdkQsTUFBTSxVQUFVLEdBQWdDLEVBQUUsQ0FBQztJQUNuRCxLQUFLLElBQUksQ0FBQyxHQUFHLENBQUMsRUFBRSxDQUFDLEdBQUcsRUFBRSxDQUFDLE1BQU0sRUFBRSxDQUFDLEVBQUUsRUFBRTtRQUNsQyxZQUFZLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxHQUFHLElBQUksQ0FBQztLQUMvQjtJQUVELEtBQUssSUFBSSxDQUFDLEdBQUcsQ0FBQyxFQUFFLENBQUMsR0FBRyxJQUFJLENBQUMsTUFBTSxFQUFFLENBQUMsRUFBRSxFQUFFO1FBQ3BDLE1BQU0sSUFBSSxHQUFHLElBQUksQ0FBQyxDQUFDLENBQUMsQ0FBQztRQUNyQixNQUFNLFVBQVUsR0FBRyxJQUFJLENBQUMsTUFBTSxDQUFDO1FBQy9CLEtBQUssTUFBTSxTQUFTLElBQUksVUFBVSxFQUFFO1lBQ2xDLE1BQU0sS0FBSyxHQUFHLFVBQVUsQ0FBQyxTQUFTLENBQUMsQ0FBQztZQUVwQyxJQUFJLGFBQWEsR0FBRyxLQUFLLENBQUM7WUFDMUIsS0FBSyxJQUFJLENBQUMsR0FBRyxDQUFDLEVBQUUsQ0FBQyxHQUFHLEVBQUUsQ0FBQyxNQUFNLEVBQUUsQ0FBQyxFQUFFLEVBQUU7Z0JBQ2xDLElBQUksWUFBWSxDQUFDLEtBQUssQ0FBQyxFQUFFLENBQUMsRUFB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QUMsQ0FBQztZQUNuRCxJQUFJLEVBQUUsQ0FBQyxLQUFLLEtBQUssU0FBUyxFQUFFO2dCQUMxQixNQUFNLElBQUksS0FBSyxDQUNYLDRCQUNJLElBQUksQ0FBQyxVQUFVLDBCQUEwQjtvQkFDN0MsR0FBRyxTQUFTLHdDQUF3QyxFQUFFLENBQUMsS0FBSyxHQUFHLENBQUMsQ0FBQzthQUN0RTtZQUNELE1BQU0sQ0FBQyxHQUFHLElBQUksQ0FBQyxNQUFNLENBQUMsU0FBUyxDQUFDLENBQUM7WUFDakMsSUFBSSxDQUFDLElBQUksQ0FBQyxXQUFXLENBQUMsRUFBRSxDQUFDLEtBQUssRUFBRSxDQUFDLENBQUMsS0FBSyxDQUFDLEVBQUU7Z0JBQ3hDLE1BQU0sSUFBSSxLQUFLLENBQ1gsNEJBQ0ksSUFBSSxDQUFDLFVBQVUsMEJBQTBCO29CQUM3QyxJQUFJLFNBQVMsZ0JBQWdCLEVBQUUsQ0FBQyxLQUFLLDBCQUEwQjtvQkFDL0QsMkJBQTJCLENBQUMsQ0FBQyxLQUFLLEdBQUcsQ0FBQyxDQUFDO2FBQzVDO1lBRUQsSUFBSSw0QkFBNEIsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLElBQUksSUFBSSxFQUFFO2dCQUM5Qyw0QkFBNEIsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLEdBQUcsRUFBRSxDQUFDO2FBQ3pDO2lCQUFNO2dCQUNMLE1BQU0sV0FBVyxHQUFHLDRCQUE0QixDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQztnQkFDdkQsNEJBQTRCLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxHQUFHLEdBQUcsQ0FBQyxXQUFXLEVBQUUsRUFBRSxDQUFDLENBQUM7Z0JBQzFELFdBQVcsQ0FBQyxPQUFPLEVBQUUsQ0FBQzthQUN2QjtTQUNGO0tBQ0Y7QUFDSCxDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiLyoqXG4gKiBAbGljZW5zZVxuICogQ29weXJpZ2h0IDIwMTcgR29vZ2xlIExMQy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC5cbiAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSBcIkxpY2Vuc2VcIik7XG4gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuXG4gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXRcbiAqXG4gKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjBcbiAqXG4gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlXG4gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiBcIkFTIElTXCIgQkFTSVMsXG4gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC5cbiAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmRcbiAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLlxuICogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbiAqL1xuXG5pbXBvcnQge1RlbnNvcn0gZnJvbSAnLi90ZW5zb3InO1xuaW1wb3J0IHtOYW1lZFRlbnNvck1hcH0gZnJvbSAnLi90ZW5zb3JfdHlwZXMnO1xuaW1wb3J0ICogYXMgdXRpbCBmcm9tICcuL3V0aWwnO1xuXG5leHBvcnQgaW50ZXJmYWNlIFRhcGVOb2RlIHtcbiAgaWQ6IG51bWJlcjtcbiAga2VybmVsTmFtZTogc3RyaW5nO1xuICBvdXRwdXRzOiBUZW5zb3JbXTtcbiAgaW5wdXRzOiBOYW1lZFRlbnNvck1hcDtcbiAgLy8gT3B0aW9uYWwgcGFyYW1zLCBkZWZpbmVkIG9ubHkgZm9yIG9wcyB3aXRoIGdyYWRpZW50IGltcGwuXG4gIGdyYWRpZW50PzogKGR5czogVGVuc29yW10pID0+IE5hbWVkR3JhZGllbnRNYXA7XG4gIHNhdmVkPzogVGVuc29yW107XG59XG5cbmV4cG9ydCB0eXBlIE5hbWVkR3JhZGllbnRNYXAgPSB7XG4gIFtpbnB1dE5hbWU6IHN0cmluZ106ICgpID0+IFRlbnNvcjtcbn07XG5cbi8qKlxuICogQ29tcHV0ZXMgYSBsaXN0IG9mIFRhcGVOb2RlcyB0aGF0IGNvbm5lY3QgeCB0byB5LCBmaWx0ZXJpbmcgZXZlcnl0aGluZyBlbHNlXG4gKiBvdXQgYW5kIHByZXNlcnZpbmcgdGhlIG9yZGVyIG9mIHRoZSBvcmlnaW5hbCB0YXBlIGVsZW1lbnRzLlxuICpcbiAqIEBwYXJhbSB0YXBlIFRoZSB0YXBlIGVsZW1lbnRzIHRvIGZpbHRlci5cbiAqIEBwYXJhbSB4cyBUaGUgaW5wdXQgVGVuc29ycy5cbiAqIEBwYXJhbSB5IFRoZSBvdXRwdXQgVGVuc29yLlxuICovXG5leHBvcnQgZnVuY3Rpb24gZ2V0RmlsdGVyZWROb2Rlc1hUb1koXG4gICAgdGFwZTogVGFwZU5vZGVbXSwgeHM6IFRlbnNvcltdLCB5OiBUZW5zb3IpOiBUYXBlTm9kZVtdIHtcbiAgLy8gRm9yd2FyZCBwYXNzIHRvIGNvbXB1dGUgYWxsIHRoZSBub2RlcyBhbmQgVGVuc29ycyB0aGF0IGFyZSB0cmFuc2l0aXZlbHkgYVxuICAvLyBmdW5jdGlvbiBvZiB4LlxuICBjb25zdCB0ZW5zb3JzRnJvbVg6IHtbdGVuc29ySWQ6IG51bWJlcl06IGJvb2xlYW59ID0ge307XG4gIGNvbnN0IG5vZGVzRnJvbVg6IHtbbm9kZUlkOiBudW1iZXJdOiBib29sZWFufSA9IHt9O1xuICBmb3IgKGxldCBpID0gMDsgaSA8IHhzLmxlbmd0aDsgaSsrKSB7XG4gICAgdGVuc29yc0Zyb21YW3hzW2ldLmlkXSA9IHRydWU7XG4gIH1cblxuICBmb3IgKGxldCBpID0gMDsgaSA8IHRhcGUubGVuZ3RoOyBpKyspIHtcbiAgICBjb25zdCBub2RlID0gdGFwZVtpXTtcbiAgICBjb25zdCBub2RlSW5wdXRzID0gbm9kZS5pbnB1dHM7XG4gICAgZm9yIChjb25zdCBpbnB1dE5hbWUgaW4gbm9kZUlucHV0cykge1xuICAgICAgY29uc3QgaW5wdXQgPSBub2RlSW5wdXRzW2lucHV0TmFtZV07XG5cbiAgICAgIGxldCBhbnlJbnB1dEZyb21YID0gZmFsc2U7XG4gICAgICBmb3IgKGxldCBqID0gMDsgaiA8IHhzLmxlbmd0aDsgaisrKSB7XG4gICAgICAgIGlmICh0ZW5zb3JzRnJvbVhbaW5wdXQuaWRdKSB7XG4gICAgICAgICAgbm9kZS5vdXRwdXRzLmZvckVhY2gob3V0cHV0ID0+IHRlbnNvcnNGcm9tWFtvdXRwdXQuaWRdID0gdHJ1ZSk7XG4gICAgICAgICAgYW55SW5wdXRGcm9tWCA9IHRydWU7XG4gICAgICAgICAgbm9kZXNGcm9tWFtub2RlLmlkXSA9IHRydWU7XG4gICAgICAgICAgYnJlYWs7XG4gICAgICAgIH1cbiAgICAgIH1cblxuICAgICAgaWYgKGFueUlucHV0RnJvbVgpIHtcbiAgICAgICAgYnJlYWs7XG4gICAgICB9XG4gICAgfVxuICB9XG5cbiAgLy8gQmFja3dhcmQgcGFzcyB0byBmaW5kIGFsbCBvZiB0aGUgbm9kZXMgYW5kIFRlbnNvcnMgdGhhdCBsZWFkIHRvIHkuXG4gIGNvbnN0IHRlbnNvcnNMZWFkVG9ZOiB7W3RlbnNvcklkOiBudW1iZXJdOiBib29sZWFufSA9IHt9O1xuICB0ZW5zb3JzTGVhZFRvWVt5LmlkXSA9IHRydWU7XG4gIGNvbnN0IG5vZGVzVG9ZOiB7W25vZGVJZDogbnVtYmVyXTogYm9vbGVhbn0gPSB7fTtcblxuICBmb3IgKGxldCBpID0gdGFwZS5sZW5ndGggLSAxOyBpID49IDA7IGktLSkge1xuICAgIGNvbnN0IG5vZGUgPSB0YXBlW2ldO1xuICAgIGNvbnN0IG5vZGVJbnB1dHMgPSBub2RlLmlucHV0cztcblxuICAgIC8vIElmIGFueSBvZiB0aGUgb3V0cHV0cyBsZWFkIHRvIHksIG1hcmsgYWxsIG9mIHRoZSBpbnB1dHMgYXMgbGVhZGluZyB0byB5LlxuICAgIGZvciAobGV0IGogPSAwOyBqIDwgbm9kZS5vdXRwdXRzLmxlbmd0aDsgaisrKSB7XG4gICAgICBpZiAodGVuc29yc0xlYWRUb1lbbm9kZS5vdXRwdXRzW2pdLmlkXSkge1xuICAgICAgICBmb3IgKGNvbnN0IGlucHV0TmFtZSBpbiBub2RlSW5wdXRzKSB7XG4gICAgICAgICAgdGVuc29yc0xlYWRUb1lbbm9kZUlucHV0c1tpbnB1dE5hbWVdLmlkXSA9IHRydWU7XG4gICAgICAgICAgbm9kZXNUb1lbbm9kZS5pZF0gPSB0cnVlO1xuICAgICAgICB9XG4gICAgICAgIGJyZWFrO1xuICAgICAgfVxuICAgIH1cbiAgfVxuXG4gIC8vIFJldHVybiB0aGUgcGF0aHMgdGhhdCBjb21lIGZyb20geCBhbmQgbGVhZCB0byB5LlxuICBjb25zdCBmaWx0ZXJlZFRhcGU6IFRhcGVOb2RlW10gPSBbXTtcbiAgZm9yIChsZXQgaSA9IDA7IGkgPCB0YXBlLmxlbmd0aDsgaSsrKSB7XG4gICAgY29uc3Qgbm9kZSA9IHRhcGVbaV07XG5cbiAgICBpZiAobm9kZXNGcm9tWFtub2RlLmlkXSAmJiBub2Rlc1RvWVtub2RlLmlkXSkge1xuICAgICAgLy8gUHJ1bmUgdGhlIGlucHV0cyBmcm9tIHRoZSBub2RlIHRoYXQgYXJlbid0IGEgZnVuY3Rpb24gb2YgeC5cbiAgICAgIGNvbnN0IHBydW5lZElucHV0czoge1tpbnB1dE5hbWU6IHN0cmluZ106IFRlbnNvcn0gPSB7fTtcbiAgICAgIGZvciAoY29uc3QgaW5wdXROYW1lIGluIG5vZGUuaW5wdXRzKSB7XG4gICAgICAgIGNvbnN0IG5vZGVJbnB1dCA9IG5vZGUuaW5wdXRzW2lucHV0TmFtZV07XG4gICAgICAgIGlmICh0ZW5zb3JzRnJvbVhbbm9kZUlucHV0LmlkXSkge1xuICAgICAgICAgIHBydW5lZElucHV0c1tpbnB1dE5hbWVdID0gbm9kZUlucHV0O1xuICAgICAgICB9XG4gICAgICB9XG5cbiAgICAgIC8vIENvcHkgdGhlIG5vZGUgYW5kIG92ZXJ3cml0ZSBpbnB1dHNBbmRBcmdzIHRvIHRoZSBwcnVuZWQgdmVyc2lvbi5cbiAgICAgIGNvbnN0IHBydW5lZE5vZGUgPSBPYmplY3QuYXNzaWduKHt9LCBub2RlKTtcbiAgICAgIHBydW5lZE5vZGUuaW5wdXRzID0gcHJ1bmVkSW5wdXRzO1xuICAgICAgcHJ1bmVkTm9kZS5vdXRwdXRzID0gbm9kZS5vdXRwdXRzO1xuXG4gICAgICBmaWx0ZXJlZFRhcGUucHVzaChwcnVuZWROb2RlKTtcbiAgICB9XG4gIH1cblxuICByZXR1cm4gZmlsdGVyZWRUYXBlO1xufVxuXG4vKipcbiAqIEJhY2twcm9wYWdhdGUgZ3JhZGllbnRzIHRocm91Z2ggdGhlIGZpbHRlcmVkIFRhcGVOb2Rlcy5cbiAqXG4gKiBAcGFyYW0gdGVuc29yQWNjdW11bGF0ZWRHcmFkaWVudE1hcCBBIG1hcCBvZiBUZW5zb3IgdG8gaXRzIGdyYWRpZW50LiBUaGlzIG1hcFxuICogaXMgbXV0YXRlZCBieSB0aGlzIG1ldGhvZC5cbiAqIEBwYXJhbSBmaWx0ZXJlZFRhcGUgVGhlIGZpbHRlcmVkIFRhcGVOb2RlcyB0byBiYWNrcHJvcCB0aHJvdWdoLlxuICovXG5leHBvcnQgZnVuY3Rpb24gYmFja3Byb3BhZ2F0ZUdyYWRpZW50cyhcbiAgICB0ZW5zb3JBY2N1bXVsYXRlZEdyYWRpZW50TWFwOiB7W3RlbnNvcklkOiBudW1iZXJdOiBUZW5zb3J9LFxuICAgIGZpbHRlcmVkVGFwZTogVGFwZU5vZGVbXSwgdGlkeTogKGY6IEZ1bmN0aW9uKSA9PiBUZW5zb3IsXG4gICAgYWRkOiAoYTogVGVuc29yLCBiOiBUZW5zb3IpID0+IFRlbnNvcikge1xuICAvLyBXYWxrIHRoZSB0YXBlIGJhY2t3YXJkIGFuZCBrZWVwIGEgbWFwIG9mIFRlbnNvciB0byBpdHMgZ3JhZGllbnQuXG4gIGZvciAobGV0IGkgPSBmaWx0ZXJlZFRhcGUubGVuZ3RoIC0gMTsgaSA+PSAwOyBpLS0pIHtcbiAgICBjb25zdCBub2RlID0gZmlsdGVyZWRUYXBlW2ldO1xuXG4gICAgY29uc3QgZHlzOiBUZW5zb3JbXSA9IFtdO1xuICAgIG5vZGUub3V0cHV0cy5mb3JFYWNoKG8gPT4ge1xuICAgICAgY29uc3QgZ3JhZFRlbnNvciA9IHRlbnNvckFjY3VtdWxhdGVkR3JhZGllbnRNYXBbby5pZF07XG4gICAgICBpZiAoZ3JhZFRlbnNvciAhPSBudWxsKSB7XG4gICAgICAgIGR5cy5wdXNoKGdyYWRUZW5zb3IpO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgLy8gVGhpcyBwYXJ0aWN1bGFyIG91dHB1dCBpcyBub3QgaW4gdGhlIGJhY2stcHJvcGFnYXRpb24gc3ViZ3JhcGgsIHNvIGl0XG4gICAgICAgIC8vIGRvZXMgbm90IGFmZmVjdCB0aGUgZmluYWwgb3V0cHV0LCB0aHVzIHdlIHB1dCBudWxsIGZvciBpdHMgZHkuXG4gICAgICAgIGR5cy5wdXNoKG51bGwpO1xuICAgICAgfVxuICAgIH0pO1xuXG4gICAgaWYgKG5vZGUuZ3JhZGllbnQgPT0gbnVsbCkge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKFxuICAgICAgICAgIGBDYW5ub3QgY29tcHV0ZSBncmFkaWVudDogZ3JhZGllbnQgZnVuY3Rpb24gbm90IGZvdW5kIGAgK1xuICAgICAgICAgIGBmb3IgJHtub2RlLmtlcm5lbE5hbWV9LmApO1xuICAgIH1cblxuICAgIC8vIEJhY2twcm9wIGR5IHRocm91Z2ggdGhpcyBub2RlIGFuZCBhY2N1bXVsYXRlIGdyYWRpZW50cyBvdmVyIHRoZSBpbnB1dHMuXG4gICAgY29uc3QgaW5wdXRHcmFkaWVudHMgPSBub2RlLmdyYWRpZW50KGR5cyk7XG5cbiAgICBmb3IgKGNvbnN0IGlucHV0TmFtZSBpbiBub2RlLmlucHV0cykge1xuICAgICAgaWYgKCEoaW5wdXROYW1lIGluIGlucHV0R3JhZGllbnRzKSkge1xuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoXG4gICAgICAgICAgICBgQ2Fubm90IGJhY2twcm9wIHRocm91Z2ggaW5wdXQgJHtpbnB1dE5hbWV9LiBgICtcbiAgICAgICAgICAgIGBBdmFpbGFibGUgZ3JhZGllbnRzIGZvdW5kOiAke09iamVjdC5rZXlzKGlucHV0R3JhZGllbnRzKX0uYCk7XG4gICAgICB9XG5cbiAgICAgIC8vIENhbGwgdGhlIGdyYWRpZW50IGZ1bmN0aW9uLlxuICAgICAgY29uc3QgZHggPSB0aWR5KCgpID0+IGlucHV0R3JhZGllbnRzW2lucHV0TmFtZV0oKSk7XG4gICAgICBpZiAoZHguZHR5cGUgIT09ICdmbG9hdDMyJykge1xuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoXG4gICAgICAgICAgICBgRXJyb3IgaW4gZ3JhZGllbnQgZm9yIG9wICR7XG4gICAgICAgICAgICAgICAgbm9kZS5rZXJuZWxOYW1lfS4gVGhlIGdyYWRpZW50IG9mIGlucHV0IGAgK1xuICAgICAgICAgICAgYCR7aW5wdXROYW1lfSBtdXN0IGhhdmUgJ2Zsb2F0MzInIGR0eXBlLCBidXQgaGFzICcke2R4LmR0eXBlfSdgKTtcbiAgICAgIH1cbiAgICAgIGNvbnN0IHggPSBub2RlLmlucHV0c1tpbnB1dE5hbWVdO1xuICAgICAgaWYgKCF1dGlsLmFycmF5c0VxdWFsKGR4LnNoYXBlLCB4LnNoYXBlKSkge1xuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoXG4gICAgICAgICAgICBgRXJyb3IgaW4gZ3JhZGllbnQgZm9yIG9wICR7XG4gICAgICAgICAgICAgICAgbm9kZS5rZXJuZWxOYW1lfS4gVGhlIGdyYWRpZW50IG9mIGlucHV0IGAgK1xuICAgICAgICAgICAgYCcke2lucHV0TmFtZX0nIGhhcyBzaGFwZSAnJHtkeC5zaGFwZX0nLCB3aGljaCBkb2VzIG5vdCBtYXRjaCBgICtcbiAgICAgICAgICAgIGB0aGUgc2hhcGUgb2YgdGhlIGlucHV0ICcke3guc2hhcGV9J2ApO1xuICAgICAgfVxuXG4gICAgICBpZiAodGVuc29yQWNjdW11bGF0ZWRHcmFkaWVudE1hcFt4LmlkXSA9PSBudWxsKSB7XG4gICAgICAgIHRlbnNvckFjY3VtdWxhdGVkR3JhZGllbnRNYXBbeC5pZF0gPSBkeDtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIGNvbnN0IGN1ckdyYWRpZW50ID0gdGVuc29yQWNjdW11bGF0ZWRHcmFkaWVudE1hcFt4LmlkXTtcbiAgICAgICAgdGVuc29yQWNjdW11bGF0ZWRHcmFkaWVudE1hcFt4LmlkXSA9IGFkZChjdXJHcmFkaWVudCwgZHgpO1xuICAgICAgICBjdXJHcmFkaWVudC5kaXNwb3NlKCk7XG4gICAgICB9XG4gICAgfVxuICB9XG59XG4iXX0=","/**\n * @license\n * Copyright 2017 Google LLC. All Rights Reserved.\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n * =============================================================================\n */\nimport { isPromise } from './util_base';\n// Expects flags from URL in the format ?tfjsflags=FLAG1:1,FLAG2:true.\nconst TENSORFLOWJS_FLAGS_PREFIX = 'tfjsflags';\n/**\n * The environment contains evaluated flags as well as the registered platform.\n * This is always used as a global singleton and can be retrieved with\n * `tf.env()`.\n *\n * @doc {heading: 'Environment'}\n */\nexport class Environment {\n // tslint:disable-next-line: no-any\n constructor(global) {\n this.global = global;\n this.flags = {};\n this.flagRegistry = {};\n this.urlFlags = {};\n // Jasmine spies on this in 'environment_test.ts'\n this.getQueryParams = getQueryParams;\n this.populateURLFlags();\n }\n setPlatform(platformName, platform) {\n if (this.platform != null) {\n if (!(env().getBool('IS_TEST') || env().getBool('PROD'))) {\n console.warn(`Platform ${this.platformName} has already been set. ` +\n `Overwriting the platform with ${platformName}.`);\n }\n }\n this.platformName = platformName;\n this.platform = platform;\n }\n registerFlag(flagName, evaluationFn, setHook) {\n this.flagRegistry[flagName] = { evaluationFn, setHook };\n // Override the flag value from the URL. This has to happen here because\n // the environment is initialized before flags get registered.\n if (this.urlFlags[flagName] != null) {\n const flagValue = this.urlFlags[flagName];\n if (!(env().getBool('IS_TEST') || env().getBool('PROD'))) {\n console.warn(`Setting feature override from URL ${flagName}: ${flagValue}.`);\n }\n this.set(flagName, flagValue);\n }\n }\n async getAsync(flagName) {\n if (flagName in this.flags) {\n return this.flags[flagName];\n }\n this.flags[flagName] = await this.evaluateFlag(flagName);\n return this.flags[flagName];\n }\n get(flagName) {\n if (flagName in this.flags) {\n return this.flags[flagName];\n }\n const flagValue = this.evaluateFlag(flagName);\n if (isPromise(flagValue)) {\n throw new Error(`Flag ${flagName} cannot be synchronously evaluated. ` +\n `Please use getAsync() instead.`);\n }\n this.flags[flagName] = flagValue;\n return this.flags[flagName];\n }\n getNumber(flagName) {\n return this.get(flagName);\n }\n getBool(flagName) {\n return this.get(flagName);\n }\n getFlags() {\n return this.flags;\n }\n // For backwards compatibility.\n get features() {\n return this.flags;\n }\n set(flagName, value) {\n if (this.flagRegistry[flagName] == null) {\n throw new Error(`Cannot set flag ${flagName} as it has not been registered.`);\n }\n this.flags[flagName] = value;\n if (this.flagRegistry[flagName].setHook != null) {\n this.flagRegistry[flagName].setHook(value);\n }\n }\n evaluateFlag(flagName) {\n if (this.flagRegistry[flagName] == null) {\n throw new Error(`Cannot evaluate flag '${flagName}': no evaluation function found.`);\n }\n return this.flagRegistry[flagName].evaluationFn();\n }\n setFlags(flags) {\n this.flags = Object.assign({}, flags);\n }\n reset() {\n this.flags = {};\n this.urlFlags = {};\n this.populateURLFlags();\n }\n populateURLFlags() {\n if (typeof this.global === 'undefined' ||\n typeof this.global.location === 'undefined' ||\n typeof this.global.location.search === 'undefined') {\n return;\n }\n const urlParams = this.getQueryParams(this.global.location.search);\n if (TENSORFLOWJS_FLAGS_PREFIX in urlParams) {\n const keyValues = urlParams[TENSORFLOWJS_FLAGS_PREFIX].split(',');\n keyValues.forEach(keyValue => {\n const [key, value] = keyValue.split(':');\n this.urlFlags[key] = parseValue(key, value);\n });\n }\n }\n}\nexport function getQueryParams(queryString) {\n const params = {};\n queryString.replace(/[?&]([^=?&]+)(?:=([^&]*))?/g, (s, ...t) => {\n decodeParam(params, t[0], t[1]);\n return t.join('=');\n });\n return params;\n}\nfunction decodeParam(params, name, value) {\n params[decodeURIComponent(name)] = decodeURIComponent(value || '');\n}\nfunction parseValue(flagName, value) {\n value = value.toLowerCase();\n if (value === 'true' || value === 'false') {\n return value === 'true';\n }\n else if (`${+value}` === value) {\n return +value;\n }\n throw new Error(`Could not parse value flag value ${value} for flag ${flagName}.`);\n}\n/**\n * Returns the current environment (a global singleton).\n *\n * The environment object contains the evaluated feature values as well as the\n * active platform.\n *\n * @doc {heading: 'Environment'}\n */\nexport function env() {\n return ENV;\n}\nexport let ENV = null;\nexport function setEnvironmentGlobal(environment) {\n ENV = environment;\n}\n//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZW52aXJvbm1lbnQuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi90ZmpzLWNvcmUvc3JjL2Vudmlyb25tZW50LnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBOzs7Ozs7Ozs7Ozs7Ozs7R0FlRztBQUdILE9BQU8sRUFBQyxTQUFTLEVBQUMsTUFBTSxhQUFhLENBQUM7QUFFdEMsc0VBQXNFO0FBQ3RFLE1BQU0seUJBQXlCLEdBQUcsV0FBVyxDQUFDO0FBWTlDOzs7Ozs7R0FNRztBQUNILE1BQU0sT0FBTyxXQUFXO0lBWXRCLG1DQUFtQztJQUNuQyxZQUFtQixNQUFXO1FBQVgsV0FBTSxHQUFOLE1BQU0sQ0FBSztRQVp0QixVQUFLLEdBQVUsRUFBRSxDQUFDO1FBQ2xCLGlCQUFZLEdBQTRDLEVBQUUsQ0FBQztRQUUzRCxhQUFRLEdBQVUsRUFBRSxDQUFDO1FBSzdCLGlEQUFpRDtRQUNqRCxtQkFBYyxHQUFHLGNBQWMsQ0FBQztRQUk5QixJQUFJLENBQUMsZ0JBQWdCLEVBQUUsQ0FBQztJQUMxQixDQUFDO0lBRUQsV0FBVyxDQUFDLFlBQW9CLEVBQUUsUUFBa0I7UUFDbEQsSUFBSSxJQUFJLENBQUMsUUFBUSxJQUFJLElBQUksRUFBRTtZQUN6QixJQUFJLENBQUMsQ0FBQyxHQUFHLEVBQUUsQ0FBQyxPQUFPLENBQUMsU0FBUyxDQUFDLElBQUksR0FBRyxFQUFFLENBQUMsT0FBTyxDQUFDLE1BQU0sQ0FBQyxDQUFDLEVBQUU7Z0JBQ3hELE9BQU8sQ0FBQyxJQUFJLENBQ1IsWUFBWSxJQUFJLENBQUMsWUFBWSx5QkFBeUI7b0JBQ3RELGlDQUFpQyxZQUFZLEdBQUcsQ0FBQyxDQUFDO2FBQ3ZEO1NBQ0Y7UUFDRCxJQUFJLENBQUMsWUFBWSxHQUFHLFlBQVksQ0FBQztRQUNqQyxJQUFJLENBQUMsUUFBUSxHQUFHLFFBQVEsQ0FBQztJQUMzQixDQUFDO0lBRUQsWUFBWSxDQUNSLFFBQWdCLEVBQUUsWUFBOEIsRUFDaEQsT0FB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O0FBRUQsTUFBTSxDQUFDLElBQUksR0FBRyxHQUFnQixJQUFJLENBQUM7QUFDbkMsTUFBTSxVQUFVLG9CQUFvQixDQUFDLFdBQXdCO0lBQzNELEdBQUcsR0FBRyxXQUFXLENBQUM7QUFDcEIsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbIi8qKlxuICogQGxpY2Vuc2VcbiAqIENvcHlyaWdodCAyMDE3IEdvb2dsZSBMTEMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuXG4gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgXCJMaWNlbnNlXCIpO1xuICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLlxuICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0XG4gKlxuICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wXG4gKlxuICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZVxuICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gXCJBUyBJU1wiIEJBU0lTLFxuICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuXG4gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kXG4gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS5cbiAqID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4gKi9cblxuaW1wb3J0IHtQbGF0Zm9ybX0gZnJvbSAnLi9wbGF0Zm9ybXMvcGxhdGZvcm0nO1xuaW1wb3J0IHtpc1Byb21pc2V9IGZyb20gJy4vdXRpbF9iYXNlJztcblxuLy8gRXhwZWN0cyBmbGFncyBmcm9tIFVSTCBpbiB0aGUgZm9ybWF0ID90ZmpzZmxhZ3M9RkxBRzE6MSxGTEFHMjp0cnVlLlxuY29uc3QgVEVOU09SRkxPV0pTX0ZMQUdTX1BSRUZJWCA9ICd0ZmpzZmxhZ3MnO1xuXG50eXBlIEZsYWdWYWx1ZSA9IG51bWJlcnxib29sZWFuO1xudHlwZSBGbGFnRXZhbHVhdGlvbkZuID0gKCgpID0+IEZsYWdWYWx1ZSl8KCgpID0+IFByb21pc2U8RmxhZ1ZhbHVlPik7XG5leHBvcnQgdHlwZSBGbGFncyA9IHtcbiAgW2ZlYXR1cmVOYW1lOiBzdHJpbmddOiBGbGFnVmFsdWVcbn07XG5leHBvcnQgdHlwZSBGbGFnUmVnaXN0cnlFbnRyeSA9IHtcbiAgZXZhbHVhdGlvbkZuOiBGbGFnRXZhbHVhdGlvbkZuO1xuICBzZXRIb29rPzogKHZhbHVlOiBGbGFnVmFsdWUpID0+IHZvaWQ7XG59O1xuXG4vKipcbiAqIFRoZSBlbnZpcm9ubWVudCBjb250YWlucyBldmFsdWF0ZWQgZmxhZ3MgYXMgd2VsbCBhcyB0aGUgcmVnaXN0ZXJlZCBwbGF0Zm9ybS5cbiAqIFRoaXMgaXMgYWx3YXlzIHVzZWQgYXMgYSBnbG9iYWwgc2luZ2xldG9uIGFuZCBjYW4gYmUgcmV0cmlldmVkIHdpdGhcbiAqIGB0Zi5lbnYoKWAuXG4gKlxuICogQGRvYyB7aGVhZGluZzogJ0Vudmlyb25tZW50J31cbiAqL1xuZXhwb3J0IGNsYXNzIEVudmlyb25tZW50IHtcbiAgcHJpdmF0ZSBmbGFnczogRmxhZ3MgPSB7fTtcbiAgcHJpdmF0ZSBmbGFnUmVnaXN0cnk6IHtbZmxhZ05hbWU6IHN0cmluZ106IEZsYWdSZWdpc3RyeUVudHJ5fSA9IHt9O1xuXG4gIHByaXZhdGUgdXJsRmxhZ3M6IEZsYWdzID0ge307XG5cbiAgcGxhdGZvcm1OYW1lOiBzdHJpbmc7XG4gIHBsYXRmb3JtOiBQbGF0Zm9ybTtcblxuICAvLyBKYXNtaW5lIHNwaWVzIG9uIHRoaXMgaW4gJ2Vudmlyb25tZW50X3Rlc3QudHMnXG4gIGdldFF1ZXJ5UGFyYW1zID0gZ2V0UXVlcnlQYXJhbXM7XG5cbiAgLy8gdHNsaW50OmRpc2FibGUtbmV4dC1saW5lOiBuby1hbnlcbiAgY29uc3RydWN0b3IocHVibGljIGdsb2JhbDogYW55KSB7XG4gICAgdGhpcy5wb3B1bGF0ZVVSTEZsYWdzKCk7XG4gIH1cblxuICBzZXRQbGF0Zm9ybShwbGF0Zm9ybU5hbWU6IHN0cmluZywgcGxhdGZvcm06IFBsYXRmb3JtKSB7XG4gICAgaWYgKHRoaXMucGxhdGZvcm0gIT0gbnVsbCkge1xuICAgICAgaWYgKCEoZW52KCkuZ2V0Qm9vbCgnSVNfVEVTVCcpIHx8IGVudigpLmdldEJvb2woJ1BST0QnKSkpIHtcbiAgICAgICAgY29uc29sZS53YXJuKFxuICAgICAgICAgICAgYFBsYXRmb3JtICR7dGhpcy5wbGF0Zm9ybU5hbWV9IGhhcyBhbHJlYWR5IGJlZW4gc2V0LiBgICtcbiAgICAgICAgICAgIGBPdmVyd3JpdGluZyB0aGUgcGxhdGZvcm0gd2l0aCAke3BsYXRmb3JtTmFtZX0uYCk7XG4gICAgICB9XG4gICAgfVxuICAgIHRoaXMucGxhdGZvcm1OYW1lID0gcGxhdGZvcm1OYW1lO1xuICAgIHRoaXMucGxhdGZvcm0gPSBwbGF0Zm9ybTtcbiAgfVxuXG4gIHJlZ2lzdGVyRmxhZyhcbiAgICAgIGZsYWdOYW1lOiBzdHJpbmcsIGV2YWx1YXRpb25GbjogRmxhZ0V2YWx1YXRpb25GbixcbiAgICAgIHNldEhvb2s/OiAodmFsdWU6IEZsYWdWYWx1ZSkgPT4gdm9pZCkge1xuICAgIHRoaXMuZmxhZ1JlZ2lzdHJ5W2ZsYWdOYW1lXSA9IHtldmFsdWF0aW9uRm4sIHNldEhvb2t9O1xuXG4gICAgLy8gT3ZlcnJpZGUgdGhlIGZsYWcgdmFsdWUgZnJvbSB0aGUgVVJMLiBUaGlzIGhhcyB0byBoYXBwZW4gaGVyZSBiZWNhdXNlXG4gICAgLy8gdGhlIGVudmlyb25tZW50IGlzIGluaXRpYWxpemVkIGJlZm9yZSBmbGFncyBnZXQgcmVnaXN0ZXJlZC5cbiAgICBpZiAodGhpcy51cmxGbGFnc1tmbGFnTmFtZV0gIT0gbnVsbCkge1xuICAgICAgY29uc3QgZmxhZ1ZhbHVlID0gdGhpcy51cmxGbGFnc1tmbGFnTmFtZV07XG4gICAgICBpZiAoIShlbnYoKS5nZXRCb29sKCdJU19URVNUJykgfHwgZW52KCkuZ2V0Qm9vbCgnUFJPRCcpKSkge1xuICAgICAgICBjb25zb2xlLndhcm4oXG4gICAgICAgICAgICBgU2V0dGluZyBmZWF0dXJlIG92ZXJyaWRlIGZyb20gVVJMICR7ZmxhZ05hbWV9OiAke2ZsYWdWYWx1ZX0uYCk7XG4gICAgICB9XG4gICAgICB0aGlzLnNldChmbGFnTmFtZSwgZmxhZ1ZhbHVlKTtcbiAgICB9XG4gIH1cblxuICBhc3luYyBnZXRBc3luYyhmbGFnTmFtZTogc3RyaW5nKTogUHJvbWlzZTxGbGFnVmFsdWU+IHtcbiAgICBpZiAoZmxhZ05hbWUgaW4gdGhpcy5mbGFncykge1xuICAgICAgcmV0dXJuIHRoaXMuZmxhZ3NbZmxhZ05hbWVdO1xuICAgIH1cblxuICAgIHRoaXMuZmxhZ3NbZmxhZ05hbWVdID0gYXdhaXQgdGhpcy5ldmFsdWF0ZUZsYWcoZmxhZ05hbWUpO1xuICAgIHJldHVybiB0aGlzLmZsYWdzW2ZsYWdOYW1lXTtcbiAgfVxuXG4gIGdldChmbGFnTmFtZTogc3RyaW5nKTogRmxhZ1ZhbHVlIHtcbiAgICBpZiAoZmxhZ05hbWUgaW4gdGhpcy5mbGFncykge1xuICAgICAgcmV0dXJuIHRoaXMuZmxhZ3NbZmxhZ05hbWVdO1xuICAgIH1cblxuICAgIGNvbnN0IGZsYWdWYWx1ZSA9IHRoaXMuZXZhbHVhdGVGbGFnKGZsYWdOYW1lKTtcbiAgICBpZiAoaXNQcm9taXNlKGZsYWdWYWx1ZSkpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcihcbiAgICAgICAgICBgRmxhZyAke2ZsYWdOYW1lfSBjYW5ub3QgYmUgc3luY2hyb25vdXNseSBldmFsdWF0ZWQuIGAgK1xuICAgICAgICAgIGBQbGVhc2UgdXNlIGdldEFzeW5jKCkgaW5zdGVhZC5gKTtcbiAgICB9XG5cbiAgICB0aGlzLmZsYWdzW2ZsYWdOYW1lXSA9IGZsYWdWYWx1ZTtcbiAgICByZXR1cm4gdGhpcy5mbGFnc1tmbGFnTmFtZV07XG4gIH1cblxuICBnZXROdW1iZXIoZmxhZ05hbWU6IHN0cmluZyk6IG51bWJlciB7XG4gICAgcmV0dXJuIHRoaXMuZ2V0KGZsYWdOYW1lKSBhcyBudW1iZXI7XG4gIH1cblxuICBnZXRCb29sKGZsYWdOYW1lOiBzdHJpbmcpOiBib29sZWFuIHtcbiAgICByZXR1cm4gdGhpcy5nZXQoZmxhZ05hbWUpIGFzIGJvb2xlYW47XG4gIH1cblxuICBnZXRGbGFncygpOiBGbGFncyB7XG4gICAgcmV0dXJuIHRoaXMuZmxhZ3M7XG4gIH1cbiAgLy8gRm9yIGJhY2t3YXJkcyBjb21wYXRpYmlsaXR5LlxuICBnZXQgZmVhdHVyZXMoKTogRmxhZ3Mge1xuICAgIHJldHVybiB0aGlzLmZsYWdzO1xuICB9XG5cbiAgc2V0KGZsYWdOYW1lOiBzdHJpbmcsIHZhbHVlOiBGbGFnVmFsdWUpOiB2b2lkIHtcbiAgICBpZiAodGhpcy5mbGFnUmVnaXN0cnlbZmxhZ05hbWVdID09IG51bGwpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcihcbiAgICAgICAgICBgQ2Fubm90IHNldCBmbGFnICR7ZmxhZ05hbWV9IGFzIGl0IGhhcyBub3QgYmVlbiByZWdpc3RlcmVkLmApO1xuICAgIH1cbiAgICB0aGlzLmZsYWdzW2ZsYWdOYW1lXSA9IHZhbHVlO1xuICAgIGlmICh0aGlzLmZsYWdSZWdpc3RyeVtmbGFnTmFtZV0uc2V0SG9vayAhPSBudWxsKSB7XG4gICAgICB0aGlzLmZsYWdSZWdpc3RyeVtmbGFnTmFtZV0uc2V0SG9vayh2YWx1ZSk7XG4gICAgfVxuICB9XG5cbiAgcHJpdmF0ZSBldmFsdWF0ZUZsYWcoZmxhZ05hbWU6IHN0cmluZyk6IEZsYWdWYWx1ZXxQcm9taXNlPEZsYWdWYWx1ZT4ge1xuICAgIGlmICh0aGlzLmZsYWdSZWdpc3RyeVtmbGFnTmFtZV0gPT0gbnVsbCkge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKFxuICAgICAgICAgIGBDYW5ub3QgZXZhbHVhdGUgZmxhZyAnJHtmbGFnTmFtZX0nOiBubyBldmFsdWF0aW9uIGZ1bmN0aW9uIGZvdW5kLmApO1xuICAgIH1cbiAgICByZXR1cm4gdGhpcy5mbGFnUmVnaXN0cnlbZmxhZ05hbWVdLmV2YWx1YXRpb25GbigpO1xuICB9XG5cbiAgc2V0RmxhZ3MoZmxhZ3M6IEZsYWdzKSB7XG4gICAgdGhpcy5mbGFncyA9IE9iamVjdC5hc3NpZ24oe30sIGZsYWdzKTtcbiAgfVxuXG4gIHJlc2V0KCkge1xuICAgIHRoaXMuZmxhZ3MgPSB7fTtcbiAgICB0aGlzLnVybEZsYWdzID0ge307XG4gICAgdGhpcy5wb3B1bGF0ZVVSTEZsYWdzKCk7XG4gIH1cblxuICBwcml2YXRlIHBvcHVsYXRlVVJMRmxhZ3MoKTogdm9pZCB7XG4gICAgaWYgKHR5cGVvZiB0aGlzLmdsb2JhbCA9PT0gJ3VuZGVmaW5lZCcgfHxcbiAgICAgICAgdHlwZW9mIHRoaXMuZ2xvYmFsLmxvY2F0aW9uID09PSAndW5kZWZpbmVkJyB8fFxuICAgICAgICB0eXBlb2YgdGhpcy5nbG9iYWwubG9jYXRpb24uc2VhcmNoID09PSAndW5kZWZpbmVkJykge1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIGNvbnN0IHVybFBhcmFtcyA9IHRoaXMuZ2V0UXVlcnlQYXJhbXModGhpcy5nbG9iYWwubG9jYXRpb24uc2VhcmNoKTtcbiAgICBpZiAoVEVOU09SRkxPV0pTX0ZMQUdTX1BSRUZJWCBpbiB1cmxQYXJhbXMpIHtcbiAgICAgIGNvbnN0IGtleVZhbHVlcyA9IHVybFBhcmFtc1tURU5TT1JGTE9XSlNfRkxBR1NfUFJFRklYXS5zcGxpdCgnLCcpO1xuICAgICAga2V5VmFsdWVzLmZvckVhY2goa2V5VmFsdWUgPT4ge1xuICAgICAgICBjb25zdCBba2V5LCB2YWx1ZV0gPSBrZXlWYWx1ZS5zcGxpdCgnOicpIGFzIFtzdHJpbmcsIHN0cmluZ107XG4gICAgICAgIHRoaXMudXJsRmxhZ3Nba2V5XSA9IHBhcnNlVmFsdWUoa2V5LCB2YWx1ZSk7XG4gICAgICB9KTtcbiAgICB9XG4gIH1cbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGdldFF1ZXJ5UGFyYW1zKHF1ZXJ5U3RyaW5nOiBzdHJpbmcpOiB7W2tleTogc3RyaW5nXTogc3RyaW5nfSB7XG4gIGNvbnN0IHBhcmFtcyA9IHt9O1xuICBxdWVyeVN0cmluZy5yZXBsYWNlKC9bPyZdKFtePT8mXSspKD86PShbXiZdKikpPy9nLCAocywgLi4udCkgPT4ge1xuICAgIGRlY29kZVBhcmFtKHBhcmFtcywgdFswXSwgdFsxXSk7XG4gICAgcmV0dXJuIHQuam9pbignPScpO1xuICB9KTtcbiAgcmV0dXJuIHBhcmFtcztcbn1cblxuZnVuY3Rpb24gZGVjb2RlUGFyYW0oXG4gICAgcGFyYW1zOiB7W2tleTogc3RyaW5nXTogc3RyaW5nfSwgbmFtZTogc3RyaW5nLCB2YWx1ZT86IHN0cmluZykge1xuICBwYXJhbXNbZGVjb2RlVVJJQ29tcG9uZW50KG5hbWUpXSA9IGRlY29kZVVSSUNvbXBvbmVudCh2YWx1ZSB8fCAnJyk7XG59XG5cbmZ1bmN0aW9uIHBhcnNlVmFsdWUoZmxhZ05hbWU6IHN0cmluZywgdmFsdWU6IHN0cmluZyk6IEZsYWdWYWx1ZSB7XG4gIHZhbHVlID0gdmFsdWUudG9Mb3dlckNhc2UoKTtcbiAgaWYgKHZhbHVlID09PSAndHJ1ZScgfHwgdmFsdWUgPT09ICdmYWxzZScpIHtcbiAgICByZXR1cm4gdmFsdWUgPT09ICd0cnVlJztcbiAgfSBlbHNlIGlmIChgJHsrIHZhbHVlfWAgPT09IHZhbHVlKSB7XG4gICAgcmV0dXJuICt2YWx1ZTtcbiAgfVxuICB0aHJvdyBuZXcgRXJyb3IoXG4gICAgICBgQ291bGQgbm90IHBhcnNlIHZhbHVlIGZsYWcgdmFsdWUgJHt2YWx1ZX0gZm9yIGZsYWcgJHtmbGFnTmFtZX0uYCk7XG59XG5cbi8qKlxuICogUmV0dXJucyB0aGUgY3VycmVudCBlbnZpcm9ubWVudCAoYSBnbG9iYWwgc2luZ2xldG9uKS5cbiAqXG4gKiBUaGUgZW52aXJvbm1lbnQgb2JqZWN0IGNvbnRhaW5zIHRoZSBldmFsdWF0ZWQgZmVhdHVyZSB2YWx1ZXMgYXMgd2VsbCBhcyB0aGVcbiAqIGFjdGl2ZSBwbGF0Zm9ybS5cbiAqXG4gKiBAZG9jIHtoZWFkaW5nOiAnRW52aXJvbm1lbnQnfVxuICovXG5leHBvcnQgZnVuY3Rpb24gZW52KCkge1xuICByZXR1cm4gRU5WO1xufVxuXG5leHBvcnQgbGV0IEVOVjogRW52aXJvbm1lbnQgPSBudWxsO1xuZXhwb3J0IGZ1bmN0aW9uIHNldEVudmlyb25tZW50R2xvYmFsKGVudmlyb25tZW50OiBFbnZpcm9ubWVudCkge1xuICBFTlYgPSBlbnZpcm9ubWVudDtcbn1cbiJdfQ==","/**\n * @license\n * Copyright 2020 Google LLC. All Rights Reserved.\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n * =============================================================================\n */\n// Note that the identifier globalNameSpace is scoped to this module, but will\n// always resolve to the same global object regardless of how the module is\n// resolved.\n// tslint:disable-next-line:no-any\nlet globalNameSpace;\n// tslint:disable-next-line:no-any\nexport function getGlobalNamespace() {\n if (globalNameSpace == null) {\n // tslint:disable-next-line:no-any\n let ns;\n if (typeof (window) !== 'undefined') {\n ns = window;\n }\n else if (typeof (global) !== 'undefined') {\n ns = global;\n }\n else if (typeof (process) !== 'undefined') {\n ns = process;\n }\n else if (typeof (self) !== 'undefined') {\n ns = self;\n }\n else {\n throw new Error('Could not find a global object');\n }\n globalNameSpace = ns;\n }\n return globalNameSpace;\n}\n// tslint:disable-next-line:no-any\nfunction getGlobalMap() {\n const ns = getGlobalNamespace();\n if (ns._tfGlobals == null) {\n ns._tfGlobals = new Map();\n }\n return ns._tfGlobals;\n}\n/**\n * Returns a globally accessible 'singleton' object.\n *\n * @param key the name of the object\n * @param init a function to initialize to initialize this object\n * the first time it is fetched.\n */\nexport function getGlobal(key, init) {\n const globalMap = getGlobalMap();\n if (globalMap.has(key)) {\n return globalMap.get(key);\n }\n else {\n const singleton = init();\n globalMap.set(key, singleton);\n return globalMap.get(key);\n }\n}\n//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZ2xvYmFsX3V0aWwuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi90ZmpzLWNvcmUvc3JjL2dsb2JhbF91dGlsLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBOzs7Ozs7Ozs7Ozs7Ozs7R0FlRztBQUVILDhFQUE4RTtBQUM5RSwyRUFBMkU7QUFDM0UsWUFBWTtBQUNaLGtDQUFrQztBQUNsQyxJQUFJLGVBQStDLENBQUM7QUFDcEQsa0NBQWtDO0FBQ2xDLE1BQU0sVUFBVSxrQkFBa0I7SUFDaEMsSUFBSSxlQUFlLElBQUksSUFBSSxFQUFFO1FBQzNCLGtDQUFrQztRQUNsQyxJQUFJLEVBQU8sQ0FBQztRQUNaLElBQUksT0FBTyxDQUFDLE1BQU0sQ0FBQyxLQUFLLFdBQVcsRUFBRTtZQUNuQyxFQUFFLEdBQUcsTUFBTSxDQUFDO1NBQ2I7YUFBTSxJQUFJLE9BQU8sQ0FBQyxNQUFNLENBQUMsS0FBSyxXQUFXLEVBQUU7WUFDMUMsRUFBRSxHQUFHLE1BQU0sQ0FBQztTQUNiO2FBQU0sSUFBSSxPQUFPLENBQUMsT0FBTyxDQUFDLEtBQUssV0FBVyxFQUFFO1lBQzNDLEVBQUUsR0FBRyxPQUFPLENBQUM7U0FDZDthQUFNLElBQUksT0FBTyxDQUFDLElBQUksQ0FBQyxLQUFLLFdBQVcsRUFBRTtZQUN4QyxFQUFFLEdBQUcsSUFBSSxDQUFDO1NBQ1g7YUFBTTtZQUNMLE1BQU0sSUFBSSxLQUFLLENBQUMsZ0NBQWdDLENBQUMsQ0FBQztTQUNuRDtRQUNELGVBQWUsR0FBRyxFQUFFLENBQUM7S0FDdEI7SUFDRCxPQUFPLGVBQWUsQ0FBQztBQUN6QixDQUFDO0FBRUQsa0NBQWtDO0FBQ2xDLFNBQVMsWUFBWTtJQUNuQixNQUFNLEVBQUUsR0FBRyxrQkFBa0IsRUFBRSxDQUFDO0lBQ2hDLElBQUksRUFBRSxDQUFDLFVBQVUsSUFBSSxJQUFJLEVBQUU7UUFDekIsRUFBRSxDQUFDLFVBQVUsR0FBRyxJQUFJLEdBQUcsRUFBRSxDQUFDO0tBQzNCO0lBQ0QsT0FBTyxFQUFFLENBQUMsVUFBVSxDQUFDO0FBQ3ZCLENBQUM7QUFFRDs7Ozs7O0dBTUc7QUFDSCxNQUFNLFVBQVUsU0FBUyxDQUFJLEdBQVcsRUFBRSxJQUFhO0lBQ3JELE1BQU0sU0FBUyxHQUFHLFlBQVksRUFBRSxDQUFDO0lBQ2pDLElBQUksU0FBUyxDQUFDLEdBQUcsQ0FBQyxHQUFHLENBQUMsRUFBRTtRQUN0QixPQUFPLFNBQVMsQ0FBQyxHQUFHLENBQUMsR0FBRyxDQUFDLENBQUM7S0FDM0I7U0FBTTtRQUNMLE1BQU0sU0FBUyxHQUFHLElBQUksRUFBRSxDQUFDO1FBQ3pCLFNBQVMsQ0FBQyxHQUFHLENBQUMsR0FBRyxFQUFFLFNBQVMsQ0FBQyxDQUFDO1FBQzlCLE9BQU8sU0FBUyxDQUFDLEdBQUcsQ0FBQyxHQUFHLENBQUMsQ0FBQztLQUMzQjtBQUNILENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyIvKipcbiAqIEBsaWNlbnNlXG4gKiBDb3B5cmlnaHQgMjAyMCBHb29nbGUgTExDLiBBbGwgUmlnaHRzIFJlc2VydmVkLlxuICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlIFwiTGljZW5zZVwiKTtcbiAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS5cbiAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdFxuICpcbiAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMFxuICpcbiAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmVcbiAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuIFwiQVMgSVNcIiBCQVNJUyxcbiAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLlxuICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZFxuICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuXG4gKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuICovXG5cbi8vIE5vdGUgdGhhdCB0aGUgaWRlbnRpZmllciBnbG9iYWxOYW1lU3BhY2UgaXMgc2NvcGVkIHRvIHRoaXMgbW9kdWxlLCBidXQgd2lsbFxuLy8gYWx3YXlzIHJlc29sdmUgdG8gdGhlIHNhbWUgZ2xvYmFsIG9iamVjdCByZWdhcmRsZXNzIG9mIGhvdyB0aGUgbW9kdWxlIGlzXG4vLyByZXNvbHZlZC5cbi8vIHRzbGludDpkaXNhYmxlLW5leHQtbGluZTpuby1hbnlcbmxldCBnbG9iYWxOYW1lU3BhY2U6IHtfdGZHbG9iYWxzOiBNYXA8c3RyaW5nLCBhbnk+fTtcbi8vIHRzbGludDpkaXNhYmxlLW5leHQtbGluZTpuby1hbnlcbmV4cG9ydCBmdW5jdGlvbiBnZXRHbG9iYWxOYW1lc3BhY2UoKToge190Zkdsb2JhbHM6IE1hcDxzdHJpbmcsIGFueT59IHtcbiAgaWYgKGdsb2JhbE5hbWVTcGFjZSA9PSBudWxsKSB7XG4gICAgLy8gdHNsaW50OmRpc2FibGUtbmV4dC1saW5lOm5vLWFueVxuICAgIGxldCBuczogYW55O1xuICAgIGlmICh0eXBlb2YgKHdpbmRvdykgIT09ICd1bmRlZmluZWQnKSB7XG4gICAgICBucyA9IHdpbmRvdztcbiAgICB9IGVsc2UgaWYgKHR5cGVvZiAoZ2xvYmFsKSAhPT0gJ3VuZGVmaW5lZCcpIHtcbiAgICAgIG5zID0gZ2xvYmFsO1xuICAgIH0gZWxzZSBpZiAodHlwZW9mIChwcm9jZXNzKSAhPT0gJ3VuZGVmaW5lZCcpIHtcbiAgICAgIG5zID0gcHJvY2VzcztcbiAgICB9IGVsc2UgaWYgKHR5cGVvZiAoc2VsZikgIT09ICd1bmRlZmluZWQnKSB7XG4gICAgICBucyA9IHNlbGY7XG4gICAgfSBlbHNlIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcignQ291bGQgbm90IGZpbmQgYSBnbG9iYWwgb2JqZWN0Jyk7XG4gICAgfVxuICAgIGdsb2JhbE5hbWVTcGFjZSA9IG5zO1xuICB9XG4gIHJldHVybiBnbG9iYWxOYW1lU3BhY2U7XG59XG5cbi8vIHRzbGludDpkaXNhYmxlLW5leHQtbGluZTpuby1hbnlcbmZ1bmN0aW9uIGdldEdsb2JhbE1hcCgpOiBNYXA8c3RyaW5nLCBhbnk+IHtcbiAgY29uc3QgbnMgPSBnZXRHbG9iYWxOYW1lc3BhY2UoKTtcbiAgaWYgKG5zLl90Zkdsb2JhbHMgPT0gbnVsbCkge1xuICAgIG5zLl90Zkdsb2JhbHMgPSBuZXcgTWFwKCk7XG4gIH1cbiAgcmV0dXJuIG5zLl90Zkdsb2JhbHM7XG59XG5cbi8qKlxuICogUmV0dXJucyBhIGdsb2JhbGx5IGFjY2Vzc2libGUgJ3NpbmdsZXRvbicgb2JqZWN0LlxuICpcbiAqIEBwYXJhbSBrZXkgdGhlIG5hbWUgb2YgdGhlIG9iamVjdFxuICogQHBhcmFtIGluaXQgYSBmdW5jdGlvbiB0byBpbml0aWFsaXplIHRvIGluaXRpYWxpemUgdGhpcyBvYmplY3RcbiAqICAgICAgICAgICAgIHRoZSBmaXJzdCB0aW1lIGl0IGlzIGZldGNoZWQuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBnZXRHbG9iYWw8VD4oa2V5OiBzdHJpbmcsIGluaXQ6ICgpID0+IFQpOiBUIHtcbiAgY29uc3QgZ2xvYmFsTWFwID0gZ2V0R2xvYmFsTWFwKCk7XG4gIGlmIChnbG9iYWxNYXAuaGFzKGtleSkpIHtcbiAgICByZXR1cm4gZ2xvYmFsTWFwLmdldChrZXkpO1xuICB9IGVsc2Uge1xuICAgIGNvbnN0IHNpbmdsZXRvbiA9IGluaXQoKTtcbiAgICBnbG9iYWxNYXAuc2V0KGtleSwgc2luZ2xldG9uKTtcbiAgICByZXR1cm4gZ2xvYmFsTWFwLmdldChrZXkpO1xuICB9XG59XG4iXX0=","/**\n * @license\n * Copyright 2018 Google LLC. All Rights Reserved.\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n * =============================================================================\n */\nimport { ENGINE } from './engine';\nimport { env } from './environment';\nimport { setDeprecationWarningFn } from './tensor';\nimport { getTensorsInContainer } from './tensor_util';\n/**\n * Enables production mode which disables correctness checks in favor of\n * performance.\n *\n * @doc {heading: 'Environment'}\n */\nexport function enableProdMode() {\n env().set('PROD', true);\n}\n/**\n * Enables debug mode which will log information about all executed kernels:\n * the elapsed time of the kernel execution, as well as the rank, shape, and\n * size of the output tensor.\n *\n * Debug mode will significantly slow down your application as it will\n * download the result of every operation to the CPU. This should not be used in\n * production. Debug mode does not affect the timing information of the kernel\n * execution as we do not measure download time in the kernel execution time.\n *\n * See also: `tf.profile`, `tf.memory`.\n *\n * @doc {heading: 'Environment'}\n */\nexport function enableDebugMode() {\n env().set('DEBUG', true);\n}\n/** Globally disables deprecation warnings */\nexport function disableDeprecationWarnings() {\n env().set('DEPRECATION_WARNINGS_ENABLED', false);\n console.warn(`TensorFlow.js deprecation warnings have been disabled.`);\n}\n/** Warn users about deprecated functionality. */\nexport function deprecationWarn(msg) {\n if (env().getBool('DEPRECATION_WARNINGS_ENABLED')) {\n console.warn(msg + ' You can disable deprecation warnings with ' +\n 'tf.disableDeprecationWarnings().');\n }\n}\nsetDeprecationWarningFn(deprecationWarn);\n/**\n * Dispose all variables kept in backend engine.\n *\n * @doc {heading: 'Environment'}\n */\nexport function disposeVariables() {\n ENGINE.disposeVariables();\n}\n/**\n * It returns the global engine that keeps track of all tensors and backends.\n *\n * @doc {heading: 'Environment'}\n */\nexport function engine() {\n return ENGINE;\n}\n/**\n * Returns memory info at the current time in the program. The result is an\n * object with the following properties:\n *\n * - `numBytes`: Number of bytes allocated (undisposed) at this time.\n * - `numTensors`: Number of unique tensors allocated.\n * - `numDataBuffers`: Number of unique data buffers allocated\n * (undisposed) at this time, which is ≤ the number of tensors\n * (e.g. `a.reshape(newShape)` makes a new Tensor that shares the same\n * data buffer with `a`).\n * - `unreliable`: True if the memory usage is unreliable. See `reasons` when\n * `unreliable` is true.\n * - `reasons`: `string[]`, reasons why the memory is unreliable, present if\n * `unreliable` is true.\n *\n * WebGL Properties:\n * - `numBytesInGPU`: Number of bytes allocated (undisposed) in the GPU only at\n * this time.\n *\n * @doc {heading: 'Performance', subheading: 'Memory'}\n */\nexport function memory() {\n return ENGINE.memory();\n}\n/**\n * Executes the provided function `f()` and returns a promise that resolves\n * with information about the function's memory use:\n * - `newBytes`: the number of new bytes allocated\n * - `newTensors`: the number of new tensors created\n * - `peakBytes`: the peak number of bytes allocated\n * - `kernels`: an array of objects for each kernel involved that reports\n * their input and output shapes, number of bytes used, and number of new\n * tensors created.\n * - `kernelNames`: an array of unique strings with just the names of the\n * kernels in the `kernels` array.\n *\n * ```js\n * const profile = await tf.profile(() => {\n * const x = tf.tensor1d([1, 2, 3]);\n * let x2 = x.square();\n * x2.dispose();\n * x2 = x.square();\n * x2.dispose();\n * return x;\n * });\n *\n * console.log(`newBytes: ${profile.newBytes}`);\n * console.log(`newTensors: ${profile.newTensors}`);\n * console.log(`byte usage over all kernels: ${profile.kernels.map(k =>\n * k.totalBytesSnapshot)}`);\n * ```\n *\n *\n * @doc {heading: 'Performance', subheading: 'Profile'}\n */\nexport function profile(f) {\n return ENGINE.profile(f);\n}\n/**\n * Executes the provided function `fn` and after it is executed, cleans up all\n * intermediate tensors allocated by `fn` except those returned by `fn`.\n * `fn` must not return a Promise (async functions not allowed). The returned\n * result can be a complex object.\n *\n * Using this method helps avoid memory leaks. In general, wrap calls to\n * operations in `tf.tidy` for automatic memory cleanup.\n *\n * NOTE: Variables do *not* get cleaned up when inside a tidy(). If you want to\n * dispose variables, please use `tf.disposeVariables` or call dispose()\n * directly on variables.\n *\n * ```js\n * // y = 2 ^ 2 + 1\n * const y = tf.tidy(() => {\n * // a, b, and one will be cleaned up when the tidy ends.\n * const one = tf.scalar(1);\n * const a = tf.scalar(2);\n * const b = a.square();\n *\n * console.log('numTensors (in tidy): ' + tf.memory().numTensors);\n *\n * // The value returned inside the tidy function will return\n * // through the tidy, in this case to the variable y.\n * return b.add(one);\n * });\n *\n * console.log('numTensors (outside tidy): ' + tf.memory().numTensors);\n * y.print();\n * ```\n *\n * @param nameOrFn The name of the closure, or the function to execute.\n * If a name is provided, the 2nd argument should be the function.\n * If debug mode is on, the timing and the memory usage of the function\n * will be tracked and displayed on the console using the provided name.\n * @param fn The function to execute.\n *\n * @doc {heading: 'Performance', subheading: 'Memory'}\n */\nexport function tidy(nameOrFn, fn) {\n return ENGINE.tidy(nameOrFn, fn);\n}\n/**\n * Disposes any `tf.Tensor`s found within the provided object.\n *\n * @param container an object that may be a `tf.Tensor` or may directly\n * contain `tf.Tensor`s, such as a `Tensor[]` or `{key: Tensor, ...}`. If\n * the object is not a `tf.Tensor` or does not contain `Tensors`, nothing\n * happens. In general it is safe to pass any object here, except that\n * `Promise`s are not supported.\n *\n * @doc {heading: 'Performance', subheading: 'Memory'}\n */\nexport function dispose(container) {\n const tensors = getTensorsInContainer(container);\n tensors.forEach(tensor => tensor.dispose());\n}\n/**\n * Keeps a `tf.Tensor` generated inside a `tf.tidy` from being disposed\n * automatically.\n *\n * ```js\n * let b;\n * const y = tf.tidy(() => {\n * const one = tf.scalar(1);\n * const a = tf.scalar(2);\n *\n * // b will not be cleaned up by the tidy. a and one will be cleaned up\n * // when the tidy ends.\n * b = tf.keep(a.square());\n *\n * console.log('numTensors (in tidy): ' + tf.memory().numTensors);\n *\n * // The value returned inside the tidy function will return\n * // through the tidy, in this case to the variable y.\n * return b.add(one);\n * });\n *\n * console.log('numTensors (outside tidy): ' + tf.memory().numTensors);\n * console.log('y:');\n * y.print();\n * console.log('b:');\n * b.print();\n * ```\n *\n * @param result The tensor to keep from being disposed.\n *\n * @doc {heading: 'Performance', subheading: 'Memory'}\n */\nexport function keep(result) {\n return ENGINE.keep(result);\n}\n/**\n * Executes `f()` and returns a promise that resolves with timing\n * information.\n *\n * The result is an object with the following properties:\n *\n * - `wallMs`: Wall execution time.\n * - `kernelMs`: Kernel execution time, ignoring data transfer. If using the\n * WebGL backend and the query timer extension is not available, this will\n * return an error object.\n * - On `WebGL` The following additional properties exist:\n * - `uploadWaitMs`: CPU blocking time on texture uploads.\n * - `downloadWaitMs`: CPU blocking time on texture downloads (readPixels).\n *\n * ```js\n * const x = tf.randomNormal([20, 20]);\n * const time = await tf.time(() => x.matMul(x));\n *\n * console.log(`kernelMs: ${time.kernelMs}, wallTimeMs: ${time.wallMs}`);\n * ```\n *\n * @param f The function to execute and time.\n *\n * @doc {heading: 'Performance', subheading: 'Timing'}\n */\nexport function time(f) {\n return ENGINE.time(f);\n}\n/**\n * Sets the backend (cpu, webgl, wasm, etc) responsible for creating tensors and\n * executing operations on those tensors. Returns a promise that resolves\n * to a boolean if the backend initialization was successful.\n *\n * Note this disposes the current backend, if any, as well as any tensors\n * associated with it. A new backend is initialized, even if it is of the\n * same type as the previous one.\n *\n * @param backendName The name of the backend. Currently supports\n * `'webgl'|'cpu'` in the browser, `'tensorflow'` under node.js\n * (requires tfjs-node), and `'wasm'` (requires tfjs-backend-wasm).\n *\n * @doc {heading: 'Backends'}\n */\nexport function setBackend(backendName) {\n return ENGINE.setBackend(backendName);\n}\n/**\n * Returns a promise that resolves when the currently selected backend (or the\n * highest priority one) has initialized. Await this promise when you are using\n * a backend that has async initialization.\n *\n * @doc {heading: 'Backends'}\n */\nexport function ready() {\n return ENGINE.ready();\n}\n/**\n * Returns the current backend name (cpu, webgl, etc). The backend is\n * responsible for creating tensors and executing operations on those tensors.\n *\n * @doc {heading: 'Backends'}\n */\nexport function getBackend() {\n return ENGINE.backendName;\n}\n/**\n * Removes a backend and the registered factory.\n *\n * @doc {heading: 'Backends'}\n */\nexport function removeBackend(name) {\n ENGINE.removeBackend(name);\n}\n/**\n * Finds the backend registered under the provided name. Returns null if the\n * name is not in the registry, or the registration hasn't finished yet.\n */\nexport function findBackend(name) {\n return ENGINE.findBackend(name);\n}\n/**\n * Finds the backend factory registered under the provided name. Returns a\n * function that produces a new backend when called. Returns null if the name\n * is not in the registry.\n */\nexport function findBackendFactory(name) {\n return ENGINE.findBackendFactory(name);\n}\n/**\n * Registers a global backend. The registration should happen when importing\n * a module file (e.g. when importing `backend_webgl.ts`), and is used for\n * modular builds (e.g. custom tfjs bundle with only webgl support).\n *\n * @param factory The backend factory function. When called, it should\n * return a backend instance, or a promise of an instance.\n * @param priority The priority of the backend (higher = more important).\n * In case multiple backends are registered, the priority is used to find\n * the best backend. Defaults to 1.\n * @return False if there is already a registered backend under this name, true\n * if not.\n *\n * @doc {heading: 'Backends'}\n */\nexport function registerBackend(name, factory, priority = 1) {\n return ENGINE.registerBackend(name, factory, priority);\n}\n/**\n * Gets the current backend. If no backends have been initialized, this will\n * attempt to initialize the best backend. Will throw an error if the highest\n * priority backend has async initialization, in which case you should call\n * 'await tf.ready()' before running other code.\n *\n * @doc {heading: 'Backends'}\n */\nexport function backend() {\n return ENGINE.backend;\n}\n/**\n * Sets the global platform.\n *\n * @param platformName The name of this platform.\n * @param platform A platform implementation.\n */\nexport function setPlatform(platformName, platform) {\n env().setPlatform(platformName, platform);\n}\n//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZ2xvYmFscy5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uL3RmanMtY29yZS9zcmMvZ2xvYmFscy50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQTs7Ozs7Ozs7Ozs7Ozs7O0dBZUc7QUFHSCxPQUFPLEVBQUMsTUFBTSxFQUF1RCxNQUFNLFVBQVUsQ0FBQztBQUN0RixPQUFPLEVBQUMsR0FBRyxFQUFDLE1BQU0sZUFBZSxDQUFDO0FBR2xDLE9BQU8sRUFBQyx1QkFBdUIsRUFBUyxNQUFNLFVBQVUsQ0FBQztBQUV6RCxPQUFPLEVBQUMscUJBQXFCLEVBQUMsTUFBTSxlQUFlLENBQUM7QUFFcEQ7Ozs7O0dBS0c7QUFDSCxNQUFNLFVBQVUsY0FBYztJQUM1QixHQUFHLEVBQUUsQ0FBQyxHQUFHLENBQUMsTUFBTSxFQUFFLElBQUksQ0FBQyxDQUFDO0FBQzFCLENBQUM7QUFFRDs7Ozs7Ozs7Ozs7OztHQWFHO0FBQ0gsTUFBTSxVQUFVLGVBQWU7SUFDN0IsR0FBRyxFQUFFLENBQUMsR0FBRyxDQUFDLE9BQU8sRUFBRSxJQUFJLENBQUMsQ0FBQztBQUMzQixDQUFDO0FBRUQsNkNBQTZDO0FBQzdDLE1BQU0sVUFBVSwwQkFBMEI7SUFDeEMsR0FBRyxFQUFFLENBQUMsR0FBRyxDQUFDLDhCQUE4QixFQUFFLEtBQUssQ0FBQyxDQUFDO0lBQ2pELE9BQU8sQ0FBQyxJQUFJLENBQUMsd0RBQXdELENBQUMsQ0FBQztBQUN6RSxDQUFDO0FBRUQsaURBQWlEO0FBQ2pELE1BQU0sVUFBVSxlQUFlLENBQUMsR0FBVztJQUN6QyxJQUFJLEdBQUcsRUFBRSxDQUFDLE9BQU8sQ0FBQyw4QkFBOEIsQ0FBQyxFQUFFO1FBQ2pELE9BQU8sQ0FBQyxJQUFJLENBQ1IsR0FBRyxHQUFHLDZDQUE2QztZQUNuRCxrQ0FBa0MsQ0FBQyxDQUFDO0tBQ3pDO0FBQ0gsQ0FBQztBQUNELHVCQUF1QixDQUFDLGVBQWUsQ0FBQyxDQUFDO0FBRXpDOzs7O0dBSUc7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LEVBQUUsUUFBa0I7SUFDbEUsR0FBRyxFQUFFLENBQUMsV0FBVyxDQUFDLFlBQVksRUFBRSxRQUFRLENBQUMsQ0FBQztBQUM1QyxDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiLyoqXG4gKiBAbGljZW5zZVxuICogQ29weXJpZ2h0IDIwMTggR29vZ2xlIExMQy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC5cbiAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSBcIkxpY2Vuc2VcIik7XG4gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuXG4gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXRcbiAqXG4gKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjBcbiAqXG4gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlXG4gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiBcIkFTIElTXCIgQkFTSVMsXG4gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC5cbiAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmRcbiAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLlxuICogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbiAqL1xuXG5pbXBvcnQge0tlcm5lbEJhY2tlbmR9IGZyb20gJy4vYmFja2VuZHMvYmFja2VuZCc7XG5pbXBvcnQge0VOR0lORSwgRW5naW5lLCBNZW1vcnlJbmZvLCBQcm9maWxlSW5mbywgU2NvcGVGbiwgVGltaW5nSW5mb30gZnJvbSAnLi9lbmdpbmUnO1xuaW1wb3J0IHtlbnZ9IGZyb20gJy4vZW52aXJvbm1lbnQnO1xuXG5pbXBvcnQge1BsYXRmb3JtfSBmcm9tICcuL3BsYXRmb3Jtcy9wbGF0Zm9ybSc7XG5pbXBvcnQge3NldERlcHJlY2F0aW9uV2FybmluZ0ZuLCBUZW5zb3J9IGZyb20gJy4vdGVuc29yJztcbmltcG9ydCB7VGVuc29yQ29udGFpbmVyfSBmcm9tICcuL3RlbnNvcl90eXBlcyc7XG5pbXBvcnQge2dldFRlbnNvcnNJbkNvbnRhaW5lcn0gZnJvbSAnLi90ZW5zb3JfdXRpbCc7XG5cbi8qKlxuICogRW5hYmxlcyBwcm9kdWN0aW9uIG1vZGUgd2hpY2ggZGlzYWJsZXMgY29ycmVjdG5lc3MgY2hlY2tzIGluIGZhdm9yIG9mXG4gKiBwZXJmb3JtYW5jZS5cbiAqXG4gKiBAZG9jIHtoZWFkaW5nOiAnRW52aXJvbm1lbnQnfVxuICovXG5leHBvcnQgZnVuY3Rpb24gZW5hYmxlUHJvZE1vZGUoKTogdm9pZCB7XG4gIGVudigpLnNldCgnUFJPRCcsIHRydWUpO1xufVxuXG4vKipcbiAqIEVuYWJsZXMgZGVidWcgbW9kZSB3aGljaCB3aWxsIGxvZyBpbmZvcm1hdGlvbiBhYm91dCBhbGwgZXhlY3V0ZWQga2VybmVsczpcbiAqIHRoZSBlbGFwc2VkIHRpbWUgb2YgdGhlIGtlcm5lbCBleGVjdXRpb24sIGFzIHdlbGwgYXMgdGhlIHJhbmssIHNoYXBlLCBhbmRcbiAqIHNpemUgb2YgdGhlIG91dHB1dCB0ZW5zb3IuXG4gKlxuICogRGVidWcgbW9kZSB3aWxsIHNpZ25pZmljYW50bHkgc2xvdyBkb3duIHlvdXIgYXBwbGljYXRpb24gYXMgaXQgd2lsbFxuICogZG93bmxvYWQgdGhlIHJlc3VsdCBvZiBldmVyeSBvcGVyYXRpb24gdG8gdGhlIENQVS4gVGhpcyBzaG91bGQgbm90IGJlIHVzZWQgaW5cbiAqIHByb2R1Y3Rpb24uIERlYnVnIG1vZGUgZG9lcyBub3QgYWZmZWN0IHRoZSB0aW1pbmcgaW5mb3JtYXRpb24gb2YgdGhlIGtlcm5lbFxuICogZXhlY3V0aW9uIGFzIHdlIGRvIG5vdCBtZWFzdXJlIGRvd25sb2FkIHRpbWUgaW4gdGhlIGtlcm5lbCBleGVjdXRpb24gdGltZS5cbiAqXG4gKiBTZWUgYWxzbzogYHRmLnByb2ZpbGVgLCBgdGYubWVtb3J5YC5cbiAqXG4gKiBAZG9jIHtoZWFkaW5nOiAnRW52aXJvbm1lbnQnfVxuICovXG5leHBvcnQgZnVuY3Rpb24gZW5hYmxlRGVidWdNb2RlKCk6IHZvaWQge1xuICBlbnYoKS5zZXQoJ0RFQlVHJywgdHJ1ZSk7XG59XG5cbi8qKiBHbG9iYWxseSBkaXNhYmxlcyBkZXByZWNhdGlvbiB3YXJuaW5ncyAqL1xuZXhwb3J0IGZ1bmN0aW9uIGRpc2FibGVEZXByZWNhdGlvbldhcm5pbmdzKCk6IHZvaWQge1xuICBlbnYoKS5zZXQoJ0RFUFJFQ0FUSU9OX1dBUk5JTkdTX0VOQUJMRUQnLCBmYWxzZSk7XG4gIGNvbnNvbGUud2FybihgVGVuc29yRmxvdy5qcyBkZXByZWNhdGlvbiB3YXJuaW5ncyBoYXZlIGJlZW4gZGlzYWJsZWQuYCk7XG59XG5cbi8qKiBXYXJuIHVzZXJzIGFib3V0IGRlcHJlY2F0ZWQgZnVuY3Rpb25hbGl0eS4gKi9cbmV4cG9ydCBmdW5jdGlvbiBkZXByZWNhdGlvbldhcm4obXNnOiBzdHJpbmcpIHtcbiAgaWYgKGVudigpLmdldEJvb2woJ0RFUFJFQ0FUSU9OX1dBUk5JTkdTX0VOQUJMRUQnKSkge1xuICAgIGNvbnNvbGUud2FybihcbiAgICAgICAgbXNnICsgJyBZb3UgY2FuIGRpc2FibGUgZGVwcmVjYXRpb24gd2FybmluZ3Mgd2l0aCAnICtcbiAgICAgICAgJ3RmLmRpc2FibGVEZXByZWNhdGlvbldhcm5pbmdzKCkuJyk7XG4gIH1cbn1cbnNldERlcHJlY2F0aW9uV2FybmluZ0ZuKGRlcHJlY2F0aW9uV2Fybik7XG5cbi8qKlxuICogRGlzcG9zZSBhbGwgdmFyaWFibGVzIGtlcHQgaW4gYmFja2VuZCBlbmdpbmUuXG4gKlxuICogQGRvYyB7aGVhZGluZzogJ0Vudmlyb25tZW50J31cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGRpc3Bvc2VWYXJpYWJsZXMoKTogdm9pZCB7XG4gIEVOR0lORS5kaXNwb3NlVmFyaWFibGVzKCk7XG59XG5cbi8qKlxuICogSXQgcmV0dXJucyB0aGUgZ2xvYmFsIGVuZ2luZSB0aGF0IGtlZXBzIHRyYWNrIG9mIGFsbCB0ZW5zb3JzIGFuZCBiYWNrZW5kcy5cbiAqXG4gKiBAZG9jIHtoZWFkaW5nOiAnRW52aXJvbm1lbnQnfVxuICovXG5leHBvcnQgZnVuY3Rpb24gZW5naW5lKCk6IEVuZ2luZSB7XG4gIHJldHVybiBFTkdJTkU7XG59XG5cbi8qKlxuICogUmV0dXJucyBtZW1vcnkgaW5mbyBhdCB0aGUgY3VycmVudCB0aW1lIGluIHRoZSBwcm9ncmFtLiBUaGUgcmVzdWx0IGlzIGFuXG4gKiBvYmplY3Qgd2l0aCB0aGUgZm9sbG93aW5nIHByb3BlcnRpZXM6XG4gKlxuICogLSBgbnVtQnl0ZXNgOiBOdW1iZXIgb2YgYnl0ZXMgYWxsb2NhdGVkICh1bmRpc3Bvc2VkKSBhdCB0aGlzIHRpbWUuXG4gKiAtIGBudW1UZW5zb3JzYDogTnVtYmVyIG9mIHVuaXF1ZSB0ZW5zb3JzIGFsbG9jYXRlZC5cbiAqIC0gYG51bURhdGFCdWZmZXJzYDogTnVtYmVyIG9mIHVuaXF1ZSBkYXRhIGJ1ZmZlcnMgYWxsb2NhdGVkXG4gKiAgICh1bmRpc3Bvc2VkKSBhdCB0aGlzIHRpbWUsIHdoaWNoIGlzIOKJpCB0aGUgbnVtYmVyIG9mIHRlbnNvcnNcbiAqICAgKGUuZy4gYGEucmVzaGFwZShuZXdTaGFwZSlgIG1ha2VzIGEgbmV3IFRlbnNvciB0aGF0IHNoYXJlcyB0aGUgc2FtZVxuICogICBkYXRhIGJ1ZmZlciB3aXRoIGBhYCkuXG4gKiAtIGB1bnJlbGlhYmxlYDogVHJ1ZSBpZiB0aGUgbWVtb3J5IHVzYWdlIGlzIHVucmVsaWFibGUuIFNlZSBgcmVhc29uc2Agd2hlblxuICogICAgYHVucmVsaWFibGVgIGlzIHRydWUuXG4gKiAtIGByZWFzb25zYDogYHN0cmluZ1tdYCwgcmVhc29ucyB3aHkgdGhlIG1lbW9yeSBpcyB1bnJlbGlhYmxlLCBwcmVzZW50IGlmXG4gKiAgICBgdW5yZWxpYWJsZWAgaXMgdHJ1ZS5cbiAqXG4gKiBXZWJHTCBQcm9wZXJ0aWVzOlxuICogLSBgbnVtQnl0ZXNJbkdQVWA6IE51bWJlciBvZiBieXRlcyBhbGxvY2F0ZWQgKHVuZGlzcG9zZWQpIGluIHRoZSBHUFUgb25seSBhdFxuICogICAgIHRoaXMgdGltZS5cbiAqXG4gKiBAZG9jIHtoZWFkaW5nOiAnUGVyZm9ybWFuY2UnLCBzdWJoZWFkaW5nOiAnTWVtb3J5J31cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIG1lbW9yeSgpOiBNZW1vcnlJbmZvIHtcbiAgcmV0dXJuIEVOR0lORS5tZW1vcnkoKTtcbn1cblxuLyoqXG4gKiBFeGVjdXRlcyB0aGUgcHJvdmlkZWQgZnVuY3Rpb24gYGYoKWAgYW5kIHJldHVybnMgYSBwcm9taXNlIHRoYXQgcmVzb2x2ZXNcbiAqIHdpdGggaW5mb3JtYXRpb24gYWJvdXQgdGhlIGZ1bmN0aW9uJ3MgbWVtb3J5IHVzZTpcbiAqIC0gYG5ld0J5dGVzYDogdGhlIG51bWJlciBvZiBuZXcgYnl0ZXMgYWxsb2NhdGVkXG4gKiAtIGBuZXdUZW5zb3JzYDogdGhlIG51bWJlciBvZiBuZXcgdGVuc29ycyBjcmVhdGVkXG4gKiAtIGBwZWFrQnl0ZXNgOiB0aGUgcGVhayBudW1iZXIgb2YgYnl0ZXMgYWxsb2NhdGVkXG4gKiAtIGBrZXJuZWxzYDogYW4gYXJyYXkgb2Ygb2JqZWN0cyBmb3IgZWFjaCBrZXJuZWwgaW52b2x2ZWQgdGhhdCByZXBvcnRzXG4gKiB0aGVpciBpbnB1dCBhbmQgb3V0cHV0IHNoYXBlcywgbnVtYmVyIG9mIGJ5dGVzIHVzZWQsIGFuZCBudW1iZXIgb2YgbmV3XG4gKiB0ZW5zb3JzIGNyZWF0ZWQuXG4gKiAtIGBrZXJuZWxOYW1lc2A6IGFuIGFycmF5IG9mIHVuaXF1ZSBzdHJpbmdzIHdpdGgganVzdCB0aGUgbmFtZXMgb2YgdGhlXG4gKiBrZXJuZWxzIGluIHRoZSBga2VybmVsc2AgYXJyYXkuXG4gKlxuICogYGBganNcbiAqIGNvbnN0IHByb2ZpbGUgPSBhd2FpdCB0Zi5wcm9maWxlKCgpID0+IHtcbiAqICAgY29uc3QgeCA9IHRmLnRlbnNvcjFkKFsxLCAyLCAzXSk7XG4gKiAgIGxldCB4MiA9IHguc3F1YXJlKCk7XG4gKiAgIHgyLmRpc3Bvc2UoKTtcbiAqICAgeDIgPSB4LnNxdWFyZSgpO1xuICogICB4Mi5kaXNwb3NlKCk7XG4gKiAgIHJldHVybiB4O1xuICogfSk7XG4gKlxuICogY29uc29sZS5sb2coYG5ld0J5dGVzOiAke3Byb2ZpbGUubmV3Qnl0ZXN9YCk7XG4gKiBjb25zb2xlLmxvZyhgbmV3VGVuc29yczogJHtwcm9maWxlLm5ld1RlbnNvcnN9YCk7XG4gKiBjb25zb2xlLmxvZyhgYnl0ZSB1c2FnZSBvdmVyIGFsbCBrZXJuZWxzOiAke3Byb2ZpbGUua2VybmVscy5tYXAoayA9PlxuICogay50b3RhbEJ5dGVzU25hcHNob3QpfWApO1xuICogYGBgXG4gKlxuICpcbiAqIEBkb2Mge2hlYWRpbmc6ICdQZXJmb3JtYW5jZScsIHN1YmhlYWRpbmc6ICdQcm9maWxlJ31cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHByb2ZpbGUoZjogKCkgPT4gKFRlbnNvckNvbnRhaW5lciB8IFByb21pc2U8VGVuc29yQ29udGFpbmVyPikpOlxuICAgIFByb21pc2U8UHJvZmlsZUluZm8+IHtcbiAgcmV0dXJuIEVOR0lORS5wcm9maWxlKGYpO1xufVxuXG4vKipcbiAqIEV4ZWN1dGVzIHRoZSBwcm92aWRlZCBmdW5jdGlvbiBgZm5gIGFuZCBhZnRlciBpdCBpcyBleGVjdXRlZCwgY2xlYW5zIHVwIGFsbFxuICogaW50ZXJtZWRpYXRlIHRlbnNvcnMgYWxsb2NhdGVkIGJ5IGBmbmAgZXhjZXB0IHRob3NlIHJldHVybmVkIGJ5IGBmbmAuXG4gKiBgZm5gIG11c3Qgbm90IHJldHVybiBhIFByb21pc2UgKGFzeW5jIGZ1bmN0aW9ucyBub3QgYWxsb3dlZCkuIFRoZSByZXR1cm5lZFxuICogcmVzdWx0IGNhbiBiZSBhIGNvbXBsZXggb2JqZWN0LlxuICpcbiAqIFVzaW5nIHRoaXMgbWV0aG9kIGhlbHBzIGF2b2lkIG1lbW9yeSBsZWFrcy4gSW4gZ2VuZXJhbCwgd3JhcCBjYWxscyB0b1xuICogb3BlcmF0aW9ucyBpbiBgdGYudGlkeWAgZm9yIGF1dG9tYXRpYyBtZW1vcnkgY2xlYW51cC5cbiAqXG4gKiBOT1RFOiBWYXJpYWJsZXMgZG8gKm5vdCogZ2V0IGNsZWFuZWQgdXAgd2hlbiBpbnNpZGUgYSB0aWR5KCkuIElmIHlvdSB3YW50IHRvXG4gKiBkaXNwb3NlIHZhcmlhYmxlcywgcGxlYXNlIHVzZSBgdGYuZGlzcG9zZVZhcmlhYmxlc2Agb3IgY2FsbCBkaXNwb3NlKClcbiAqIGRpcmVjdGx5IG9uIHZhcmlhYmxlcy5cbiAqXG4gKiBgYGBqc1xuICogLy8geSA9IDIgXiAyICsgMVxuICogY29uc3QgeSA9IHRmLnRpZHkoKCkgPT4ge1xuICogICAvLyBhLCBiLCBhbmQgb25lIHdpbGwgYmUgY2xlYW5lZCB1cCB3aGVuIHRoZSB0aWR5IGVuZHMuXG4gKiAgIGNvbnN0IG9uZSA9IHRmLnNjYWxhcigxKTtcbiAqICAgY29uc3QgYSA9IHRmLnNjYWxhcigyKTtcbiAqICAgY29uc3QgYiA9IGEuc3F1YXJlKCk7XG4gKlxuICogICBjb25zb2xlLmxvZygnbnVtVGVuc29ycyAoaW4gdGlkeSk6ICcgKyB0Zi5tZW1vcnkoKS5udW1UZW5zb3JzKTtcbiAqXG4gKiAgIC8vIFRoZSB2YWx1ZSByZXR1cm5lZCBpbnNpZGUgdGhlIHRpZHkgZnVuY3Rpb24gd2lsbCByZXR1cm5cbiAqICAgLy8gdGhyb3VnaCB0aGUgdGlkeSwgaW4gdGhpcyBjYXNlIHRvIHRoZSB2YXJpYWJsZSB5LlxuICogICByZXR1cm4gYi5hZGQob25lKTtcbiAqIH0pO1xuICpcbiAqIGNvbnNvbGUubG9nKCdudW1UZW5zb3JzIChvdXRzaWRlIHRpZHkpOiAnICsgdGYubWVtb3J5KCkubnVtVGVuc29ycyk7XG4gKiB5LnByaW50KCk7XG4gKiBgYGBcbiAqXG4gKiBAcGFyYW0gbmFtZU9yRm4gVGhlIG5hbWUgb2YgdGhlIGNsb3N1cmUsIG9yIHRoZSBmdW5jdGlvbiB0byBleGVjdXRlLlxuICogICAgIElmIGEgbmFtZSBpcyBwcm92aWRlZCwgdGhlIDJuZCBhcmd1bWVudCBzaG91bGQgYmUgdGhlIGZ1bmN0aW9uLlxuICogICAgIElmIGRlYnVnIG1vZGUgaXMgb24sIHRoZSB0aW1pbmcgYW5kIHRoZSBtZW1vcnkgdXNhZ2Ugb2YgdGhlIGZ1bmN0aW9uXG4gKiAgICAgd2lsbCBiZSB0cmFja2VkIGFuZCBkaXNwbGF5ZWQgb24gdGhlIGNvbnNvbGUgdXNpbmcgdGhlIHByb3ZpZGVkIG5hbWUuXG4gKiBAcGFyYW0gZm4gVGhlIGZ1bmN0aW9uIHRvIGV4ZWN1dGUuXG4gKlxuICogQGRvYyB7aGVhZGluZzogJ1BlcmZvcm1hbmNlJywgc3ViaGVhZGluZzogJ01lbW9yeSd9XG4gKi9cbmV4cG9ydCBmdW5jdGlvbiB0aWR5PFQgZXh0ZW5kcyBUZW5zb3JDb250YWluZXI+KFxuICAgIG5hbWVPckZuOiBzdHJpbmd8U2NvcGVGbjxUPiwgZm4/OiBTY29wZUZuPFQ+KTogVCB7XG4gIHJldHVybiBFTkdJTkUudGlkeShuYW1lT3JGbiwgZm4pO1xufVxuXG4vKipcbiAqIERpc3Bvc2VzIGFueSBgdGYuVGVuc29yYHMgZm91bmQgd2l0aGluIHRoZSBwcm92aWRlZCBvYmplY3QuXG4gKlxuICogQHBhcmFtIGNvbnRhaW5lciBhbiBvYmplY3QgdGhhdCBtYXkgYmUgYSBgdGYuVGVuc29yYCBvciBtYXkgZGlyZWN0bHlcbiAqICAgICBjb250YWluIGB0Zi5UZW5zb3Jgcywgc3VjaCBhcyBhIGBUZW5zb3JbXWAgb3IgYHtrZXk6IFRlbnNvciwgLi4ufWAuIElmXG4gKiAgICAgdGhlIG9iamVjdCBpcyBub3QgYSBgdGYuVGVuc29yYCBvciBkb2VzIG5vdCBjb250YWluIGBUZW5zb3JzYCwgbm90aGluZ1xuICogICAgIGhhcHBlbnMuIEluIGdlbmVyYWwgaXQgaXMgc2FmZSB0byBwYXNzIGFueSBvYmplY3QgaGVyZSwgZXhjZXB0IHRoYXRcbiAqICAgICBgUHJvbWlzZWBzIGFyZSBub3Qgc3VwcG9ydGVkLlxuICpcbiAqIEBkb2Mge2hlYWRpbmc6ICdQZXJmb3JtYW5jZScsIHN1YmhlYWRpbmc6ICdNZW1vcnknfVxuICovXG5leHBvcnQgZnVuY3Rpb24gZGlzcG9zZShjb250YWluZXI6IFRlbnNvckNvbnRhaW5lcikge1xuICBjb25zdCB0ZW5zb3JzID0gZ2V0VGVuc29yc0luQ29udGFpbmVyKGNvbnRhaW5lcik7XG4gIHRlbnNvcnMuZm9yRWFjaCh0ZW5zb3IgPT4gdGVuc29yLmRpc3Bvc2UoKSk7XG59XG5cbi8qKlxuICogS2VlcHMgYSBgdGYuVGVuc29yYCBnZW5lcmF0ZWQgaW5zaWRlIGEgYHRmLnRpZHlgIGZyb20gYmVpbmcgZGlzcG9zZWRcbiAqIGF1dG9tYXRpY2FsbHkuXG4gKlxuICogYGBganNcbiAqIGxldCBiO1xuICogY29uc3QgeSA9IHRmLnRpZHkoKCkgPT4ge1xuICogICBjb25zdCBvbmUgPSB0Zi5zY2FsYXIoMSk7XG4gKiAgIGNvbnN0IGEgPSB0Zi5zY2FsYXIoMik7XG4gKlxuICogICAvLyBiIHdpbGwgbm90IGJlIGNsZWFuZWQgdXAgYnkgdGhlIHRpZHkuIGEgYW5kIG9uZSB3aWxsIGJlIGNsZWFuZWQgdXBcbiAqICAgLy8gd2hlbiB0aGUgdGlkeSBlbmRzLlxuICogICBiID0gdGYua2VlcChhLnNxdWFyZSgpKTtcbiAqXG4gKiAgIGNvbnNvbGUubG9nKCdudW1UZW5zb3JzIChpbiB0aWR5KTogJyArIHRmLm1lbW9yeSgpLm51bVRlbnNvcnMpO1xuICpcbiAqICAgLy8gVGhlIHZhbHVlIHJldHVybmVkIGluc2lkZSB0aGUgdGlkeSBmdW5jdGlvbiB3aWxsIHJldHVyblxuICogICAvLyB0aHJvdWdoIHRoZSB0aWR5LCBpbiB0aGlzIGNhc2UgdG8gdGhlIHZhcmlhYmxlIHkuXG4gKiAgIHJldHVybiBiLmFkZChvbmUpO1xuICogfSk7XG4gKlxuICogY29uc29sZS5sb2coJ251bVRlbnNvcnMgKG91dHNpZGUgdGlkeSk6ICcgKyB0Zi5tZW1vcnkoKS5udW1UZW5zb3JzKTtcbiAqIGNvbnNvbGUubG9nKCd5OicpO1xuICogeS5wcmludCgpO1xuICogY29uc29sZS5sb2coJ2I6Jyk7XG4gKiBiLnByaW50KCk7XG4gKiBgYGBcbiAqXG4gKiBAcGFyYW0gcmVzdWx0IFRoZSB0ZW5zb3IgdG8ga2VlcCBmcm9tIGJlaW5nIGRpc3Bvc2VkLlxuICpcbiAqIEBkb2Mge2hlYWRpbmc6ICdQZXJmb3JtYW5jZScsIHN1YmhlYWRpbmc6ICdNZW1vcnknfVxuICovXG5leHBvcnQgZnVuY3Rpb24ga2VlcDxUIGV4dGVuZHMgVGVuc29yPihyZXN1bHQ6IFQpOiBUIHtcbiAgcmV0dXJuIEVOR0lORS5rZWVwKHJlc3VsdCk7XG59XG5cbi8qKlxuICogRXhlY3V0ZXMgYGYoKWAgYW5kIHJldHVybnMgYSBwcm9taXNlIHRoYXQgcmVzb2x2ZXMgd2l0aCB0aW1pbmdcbiAqIGluZm9ybWF0aW9uLlxuICpcbiAqIFRoZSByZXN1bHQgaXMgYW4gb2JqZWN0IHdpdGggdGhlIGZvbGxvd2luZyBwcm9wZXJ0aWVzOlxuICpcbiAqIC0gYHdhbGxNc2A6IFdhbGwgZXhlY3V0aW9uIHRpbWUuXG4gKiAtIGBrZXJuZWxNc2A6IEtlcm5lbCBleGVjdXRpb24gdGltZSwgaWdub3JpbmcgZGF0YSB0cmFuc2Zlci4gSWYgdXNpbmcgdGhlXG4gKiBXZWJHTCBiYWNrZW5kIGFuZCB0aGUgcXVlcnkgdGltZXIgZXh0ZW5zaW9uIGlzIG5vdCBhdmFpbGFibGUsIHRoaXMgd2lsbFxuICogcmV0dXJuIGFuIGVycm9yIG9iamVjdC5cbiAqIC0gT24gYFdlYkdMYCBUaGUgZm9sbG93aW5nIGFkZGl0aW9uYWwgcHJvcGVydGllcyBleGlzdDpcbiAqICAgLSBgdXBsb2FkV2FpdE1zYDogQ1BVIGJsb2NraW5nIHRpbWUgb24gdGV4dHVyZSB1cGxvYWRzLlxuICogICAtIGBkb3dubG9hZFdhaXRNc2A6IENQVSBibG9ja2luZyB0aW1lIG9uIHRleHR1cmUgZG93bmxvYWRzIChyZWFkUGl4ZWxzKS5cbiAqXG4gKiBgYGBqc1xuICogY29uc3QgeCA9IHRmLnJhbmRvbU5vcm1hbChbMjAsIDIwXSk7XG4gKiBjb25zdCB0aW1lID0gYXdhaXQgdGYudGltZSgoKSA9PiB4Lm1hdE11bCh4KSk7XG4gKlxuICogY29uc29sZS5sb2coYGtlcm5lbE1zOiAke3RpbWUua2VybmVsTXN9LCB3YWxsVGltZU1zOiAke3RpbWUud2FsbE1zfWApO1xuICogYGBgXG4gKlxuICogQHBhcmFtIGYgVGhlIGZ1bmN0aW9uIHRvIGV4ZWN1dGUgYW5kIHRpbWUuXG4gKlxuICogQGRvYyB7aGVhZGluZzogJ1BlcmZvcm1hbmNlJywgc3ViaGVhZGluZzogJ1RpbWluZyd9XG4gKi9cbmV4cG9ydCBmdW5jdGlvbiB0aW1lKGY6ICgpID0+IHZvaWQpOiBQcm9taXNlPFRpbWluZ0luZm8+IHtcbiAgcmV0dXJuIEVOR0lORS50aW1lKGYpO1xufVxuXG4vKipcbiAqIFNldHMgdGhlIGJhY2tlbmQgKGNwdSwgd2ViZ2wsIHdhc20sIGV0YykgcmVzcG9uc2libGUgZm9yIGNyZWF0aW5nIHRlbnNvcnMgYW5kXG4gKiBleGVjdXRpbmcgb3BlcmF0aW9ucyBvbiB0aG9zZSB0ZW5zb3JzLiBSZXR1cm5zIGEgcHJvbWlzZSB0aGF0IHJlc29sdmVzXG4gKiB0byBhIGJvb2xlYW4gaWYgdGhlIGJhY2tlbmQgaW5pdGlhbGl6YXRpb24gd2FzIHN1Y2Nlc3NmdWwuXG4gKlxuICogTm90ZSB0aGlzIGRpc3Bvc2VzIHRoZSBjdXJyZW50IGJhY2tlbmQsIGlmIGFueSwgYXMgd2VsbCBhcyBhbnkgdGVuc29yc1xuICogYXNzb2NpYXRlZCB3aXRoIGl0LiBBIG5ldyBiYWNrZW5kIGlzIGluaXRpYWxpemVkLCBldmVuIGlmIGl0IGlzIG9mIHRoZVxuICogc2FtZSB0eXBlIGFzIHRoZSBwcmV2aW91cyBvbmUuXG4gKlxuICogQHBhcmFtIGJhY2tlbmROYW1lIFRoZSBuYW1lIG9mIHRoZSBiYWNrZW5kLiBDdXJyZW50bHkgc3VwcG9ydHNcbiAqICAgICBgJ3dlYmdsJ3wnY3B1J2AgaW4gdGhlIGJyb3dzZXIsIGAndGVuc29yZmxvdydgIHVuZGVyIG5vZGUuanNcbiAqICAgICAocmVxdWlyZXMgdGZqcy1ub2RlKSwgYW5kIGAnd2FzbSdgIChyZXF1aXJlcyB0ZmpzLWJhY2tlbmQtd2FzbSkuXG4gKlxuICogQGRvYyB7aGVhZGluZzogJ0JhY2tlbmRzJ31cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHNldEJhY2tlbmQoYmFja2VuZE5hbWU6IHN0cmluZyk6IFByb21pc2U8Ym9vbGVhbj4ge1xuICByZXR1cm4gRU5HSU5FLnNldEJhY2tlbmQoYmFja2VuZE5hbWUpO1xufVxuXG4vKipcbiAqIFJldHVybnMgYSBwcm9taXNlIHRoYXQgcmVzb2x2ZXMgd2hlbiB0aGUgY3VycmVudGx5IHNlbGVjdGVkIGJhY2tlbmQgKG9yIHRoZVxuICogaGlnaGVzdCBwcmlvcml0eSBvbmUpIGhhcyBpbml0aWFsaXplZC4gQXdhaXQgdGhpcyBwcm9taXNlIHdoZW4geW91IGFyZSB1c2luZ1xuICogYSBiYWNrZW5kIHRoYXQgaGFzIGFzeW5jIGluaXRpYWxpemF0aW9uLlxuICpcbiAqIEBkb2Mge2hlYWRpbmc6ICdCYWNrZW5kcyd9XG4gKi9cbmV4cG9ydCBmdW5jdGlvbiByZWFkeSgpOiBQcm9taXNlPHZvaWQ+IHtcbiAgcmV0dXJuIEVOR0lORS5yZWFkeSgpO1xufVxuXG4vKipcbiAqIFJldHVybnMgdGhlIGN1cnJlbnQgYmFja2VuZCBuYW1lIChjcHUsIHdlYmdsLCBldGMpLiBUaGUgYmFja2VuZCBpc1xuICogcmVzcG9uc2libGUgZm9yIGNyZWF0aW5nIHRlbnNvcnMgYW5kIGV4ZWN1dGluZyBvcGVyYXRpb25zIG9uIHRob3NlIHRlbnNvcnMuXG4gKlxuICogQGRvYyB7aGVhZGluZzogJ0JhY2tlbmRzJ31cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGdldEJhY2tlbmQoKTogc3RyaW5nIHtcbiAgcmV0dXJuIEVOR0lORS5iYWNrZW5kTmFtZTtcbn1cblxuLyoqXG4gKiBSZW1vdmVzIGEgYmFja2VuZCBhbmQgdGhlIHJlZ2lzdGVyZWQgZmFjdG9yeS5cbiAqXG4gKiBAZG9jIHtoZWFkaW5nOiAnQmFja2VuZHMnfVxuICovXG5leHBvcnQgZnVuY3Rpb24gcmVtb3ZlQmFja2VuZChuYW1lOiBzdHJpbmcpOiB2b2lkIHtcbiAgRU5HSU5FLnJlbW92ZUJhY2tlbmQobmFtZSk7XG59XG5cbi8qKlxuICogRmluZHMgdGhlIGJhY2tlbmQgcmVnaXN0ZXJlZCB1bmRlciB0aGUgcHJvdmlkZWQgbmFtZS4gUmV0dXJucyBudWxsIGlmIHRoZVxuICogbmFtZSBpcyBub3QgaW4gdGhlIHJlZ2lzdHJ5LCBvciB0aGUgcmVnaXN0cmF0aW9uIGhhc24ndCBmaW5pc2hlZCB5ZXQuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBmaW5kQmFja2VuZChuYW1lOiBzdHJpbmcpOiBLZXJuZWxCYWNrZW5kIHtcbiAgcmV0dXJuIEVOR0lORS5maW5kQmFja2VuZChuYW1lKTtcbn1cblxuLyoqXG4gKiBGaW5kcyB0aGUgYmFja2VuZCBmYWN0b3J5IHJlZ2lzdGVyZWQgdW5kZXIgdGhlIHByb3ZpZGVkIG5hbWUuIFJldHVybnMgYVxuICogZnVuY3Rpb24gdGhhdCBwcm9kdWNlcyBhIG5ldyBiYWNrZW5kIHdoZW4gY2FsbGVkLiBSZXR1cm5zIG51bGwgaWYgdGhlIG5hbWVcbiAqIGlzIG5vdCBpbiB0aGUgcmVnaXN0cnkuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBmaW5kQmFja2VuZEZhY3RvcnkobmFtZTogc3RyaW5nKTogKCkgPT5cbiAgICBLZXJuZWxCYWNrZW5kIHwgUHJvbWlzZTxLZXJuZWxCYWNrZW5kPiB7XG4gIHJldHVybiBFTkdJTkUuZmluZEJhY2tlbmRGYWN0b3J5KG5hbWUpO1xufVxuXG4vKipcbiAqIFJlZ2lzdGVycyBhIGdsb2JhbCBiYWNrZW5kLiBUaGUgcmVnaXN0cmF0aW9uIHNob3VsZCBoYXBwZW4gd2hlbiBpbXBvcnRpbmdcbiAqIGEgbW9kdWxlIGZpbGUgKGUuZy4gd2hlbiBpbXBvcnRpbmcgYGJhY2tlbmRfd2ViZ2wudHNgKSwgYW5kIGlzIHVzZWQgZm9yXG4gKiBtb2R1bGFyIGJ1aWxkcyAoZS5nLiBjdXN0b20gdGZqcyBidW5kbGUgd2l0aCBvbmx5IHdlYmdsIHN1cHBvcnQpLlxuICpcbiAqIEBwYXJhbSBmYWN0b3J5IFRoZSBiYWNrZW5kIGZhY3RvcnkgZnVuY3Rpb24uIFdoZW4gY2FsbGVkLCBpdCBzaG91bGRcbiAqIHJldHVybiBhIGJhY2tlbmQgaW5zdGFuY2UsIG9yIGEgcHJvbWlzZSBvZiBhbiBpbnN0YW5jZS5cbiAqIEBwYXJhbSBwcmlvcml0eSBUaGUgcHJpb3JpdHkgb2YgdGhlIGJhY2tlbmQgKGhpZ2hlciA9IG1vcmUgaW1wb3J0YW50KS5cbiAqICAgICBJbiBjYXNlIG11bHRpcGxlIGJhY2tlbmRzIGFyZSByZWdpc3RlcmVkLCB0aGUgcHJpb3JpdHkgaXMgdXNlZCB0byBmaW5kXG4gKiAgICAgdGhlIGJlc3QgYmFja2VuZC4gRGVmYXVsdHMgdG8gMS5cbiAqIEByZXR1cm4gRmFsc2UgaWYgdGhlcmUgaXMgYWxyZWFkeSBhIHJlZ2lzdGVyZWQgYmFja2VuZCB1bmRlciB0aGlzIG5hbWUsIHRydWVcbiAqICAgICBpZiBub3QuXG4gKlxuICogQGRvYyB7aGVhZGluZzogJ0JhY2tlbmRzJ31cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHJlZ2lzdGVyQmFja2VuZChcbiAgICBuYW1lOiBzdHJpbmcsIGZhY3Rvcnk6ICgpID0+IEtlcm5lbEJhY2tlbmQgfCBQcm9taXNlPEtlcm5lbEJhY2tlbmQ+LFxuICAgIHByaW9yaXR5ID0gMSk6IGJvb2xlYW4ge1xuICByZXR1cm4gRU5HSU5FLnJlZ2lzdGVyQmFja2VuZChuYW1lLCBmYWN0b3J5LCBwcmlvcml0eSk7XG59XG5cbi8qKlxuICogR2V0cyB0aGUgY3VycmVudCBiYWNrZW5kLiBJZiBubyBiYWNrZW5kcyBoYXZlIGJlZW4gaW5pdGlhbGl6ZWQsIHRoaXMgd2lsbFxuICogYXR0ZW1wdCB0byBpbml0aWFsaXplIHRoZSBiZXN0IGJhY2tlbmQuIFdpbGwgdGhyb3cgYW4gZXJyb3IgaWYgdGhlIGhpZ2hlc3RcbiAqIHByaW9yaXR5IGJhY2tlbmQgaGFzIGFzeW5jIGluaXRpYWxpemF0aW9uLCBpbiB3aGljaCBjYXNlIHlvdSBzaG91bGQgY2FsbFxuICogJ2F3YWl0IHRmLnJlYWR5KCknIGJlZm9yZSBydW5uaW5nIG90aGVyIGNvZGUuXG4gKlxuICogQGRvYyB7aGVhZGluZzogJ0JhY2tlbmRzJ31cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGJhY2tlbmQoKTogS2VybmVsQmFja2VuZCB7XG4gIHJldHVybiBFTkdJTkUuYmFja2VuZDtcbn1cblxuLyoqXG4gKiBTZXRzIHRoZSBnbG9iYWwgcGxhdGZvcm0uXG4gKlxuICogQHBhcmFtIHBsYXRmb3JtTmFtZSBUaGUgbmFtZSBvZiB0aGlzIHBsYXRmb3JtLlxuICogQHBhcmFtIHBsYXRmb3JtIEEgcGxhdGZvcm0gaW1wbGVtZW50YXRpb24uXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBzZXRQbGF0Zm9ybShwbGF0Zm9ybU5hbWU6IHN0cmluZywgcGxhdGZvcm06IFBsYXRmb3JtKSB7XG4gIGVudigpLnNldFBsYXRmb3JtKHBsYXRmb3JtTmFtZSwgcGxhdGZvcm0pO1xufVxuIl19","/**\n * @license\n * Copyright 2018 Google LLC. All Rights Reserved.\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n * =============================================================================\n */\nimport { ENGINE } from './engine';\nimport { Tensor, Variable } from './tensor';\nimport { convertToTensor, convertToTensorArray } from './tensor_util_env';\nimport * as util from './util';\n/**\n * Provided `f(x)`, returns another function `g(x, dy?)`, which gives the\n * gradient of `f(x)` with respect to `x`.\n *\n * If `dy` is provided, the gradient of `f(x).mul(dy).sum()` with respect to\n * `x` is computed instead. `f(x)` must take a single tensor `x` and return a\n * single tensor `y`. If `f()` takes multiple inputs, use `tf.grads` instead.\n *\n * ```js\n * // f(x) = x ^ 2\n * const f = x => x.square();\n * // f'(x) = 2x\n * const g = tf.grad(f);\n *\n * const x = tf.tensor1d([2, 3]);\n * g(x).print();\n * ```\n *\n * ```js\n * // f(x) = x ^ 3\n * const f = x => x.pow(tf.scalar(3, 'int32'));\n * // f'(x) = 3x ^ 2\n * const g = tf.grad(f);\n * // f''(x) = 6x\n * const gg = tf.grad(g);\n *\n * const x = tf.tensor1d([2, 3]);\n * gg(x).print();\n * ```\n *\n * @param f The function f(x), to compute gradient for.\n *\n * @doc {heading: 'Training', subheading: 'Gradients'}\n */\nfunction grad(f) {\n util.assert(util.isFunction(f), () => 'The f passed in grad(f) must be a function');\n return (x, dy) => {\n // x can be of any dtype, thus null as the last argument.\n const $x = convertToTensor(x, 'x', 'tf.grad', 'string_or_numeric');\n const $dy = (dy != null) ? convertToTensor(dy, 'dy', 'tf.grad') : null;\n return ENGINE.tidy(() => {\n const { value, grads } = ENGINE.gradients(() => f($x), [$x], $dy);\n if ($dy != null) {\n util.assertShapesMatch(value.shape, $dy.shape, 'The shape of dy passed in grad(f)(x, dy) must match the shape ' +\n 'returned by f(x)');\n }\n checkGrads(grads);\n return grads[0];\n });\n };\n}\n/**\n * Provided `f(x1, x2,...)`, returns another function `g([x1, x2,...], dy?)`,\n * which gives an array of gradients of `f()` with respect to each input\n * [`x1`,`x2`,...].\n *\n * If `dy` is passed when calling `g()`, the gradient of\n * `f(x1,...).mul(dy).sum()` with respect to each input is computed instead.\n * The provided `f` must take one or more tensors and return a single tensor\n * `y`. If `f()` takes a single input, we recommend using `tf.grad` instead.\n *\n * ```js\n * // f(a, b) = a * b\n * const f = (a, b) => a.mul(b);\n * // df / da = b, df / db = a\n * const g = tf.grads(f);\n *\n * const a = tf.tensor1d([2, 3]);\n * const b = tf.tensor1d([-2, -3]);\n * const [da, db] = g([a, b]);\n * console.log('da');\n * da.print();\n * console.log('db');\n * db.print();\n * ```\n *\n * @param f The function `f(x1, x2,...)` to compute gradients for.\n *\n * @doc {heading: 'Training', subheading: 'Gradients'}\n */\nfunction grads(f) {\n util.assert(util.isFunction(f), () => 'The f passed in grads(f) must be a function');\n return (args, dy) => {\n util.assert(Array.isArray(args), () => 'The args passed in grads(f)(args) must be an array ' +\n 'of `Tensor`s or `TensorLike`s');\n // args can be of any dtype, thus null as the last argument.\n const $args = convertToTensorArray(args, 'args', 'tf.grads', 'string_or_numeric');\n const $dy = (dy != null) ? convertToTensor(dy, 'dy', 'tf.grads') : null;\n return ENGINE.tidy(() => {\n const { value, grads } = ENGINE.gradients(() => f(...$args), $args, $dy);\n if ($dy != null) {\n util.assertShapesMatch(value.shape, $dy.shape, 'The shape of dy passed in grads(f)([x1,...], dy) must ' +\n 'match the shape returned by f([x1,...])');\n }\n checkGrads(grads);\n return grads;\n });\n };\n}\n/**\n * Like `tf.grad`, but also returns the value of `f()`. Useful when `f()`\n * returns a metric you want to show.\n *\n * The result is a rich object with the following properties:\n * - grad: The gradient of `f(x)` w.r.t. `x` (result of `tf.grad`).\n * - value: The value returned by `f(x)`.\n *\n * ```js\n * // f(x) = x ^ 2\n * const f = x => x.square();\n * // f'(x) = 2x\n * const g = tf.valueAndGrad(f);\n *\n * const x = tf.tensor1d([2, 3]);\n * const {value, grad} = g(x);\n *\n * console.log('value');\n * value.print();\n * console.log('grad');\n * grad.print();\n * ```\n *\n * @doc {heading: 'Training', subheading: 'Gradients'}\n */\nfunction valueAndGrad(f) {\n util.assert(util.isFunction(f), () => 'The f passed in valueAndGrad(f) must be a function');\n return (x, dy) => {\n util.assert(x instanceof Tensor, () => 'The x passed in valueAndGrad(f)(x) must be a tensor');\n util.assert(dy == null || dy instanceof Tensor, () => 'The dy passed in valueAndGrad(f)(x, dy) must be a tensor');\n const { grads, value } = ENGINE.gradients(() => f(x), [x], dy);\n checkGrads(grads);\n return { grad: grads[0], value };\n };\n}\n/**\n * Like `tf.grads`, but returns also the value of `f()`. Useful when `f()`\n * returns a metric you want to show.\n *\n * The result is a rich object with the following properties:\n * - grads: The gradients of `f()` w.r.t. each input (result of `tf.grads`).\n * - value: The value returned by `f(x)`.\n *\n * ```js\n * // f(a, b) = a * b\n * const f = (a, b) => a.mul(b);\n * // df/da = b, df/db = a\n * const g = tf.valueAndGrads(f);\n *\n * const a = tf.tensor1d([2, 3]);\n * const b = tf.tensor1d([-2, -3]);\n * const {value, grads} = g([a, b]);\n *\n * const [da, db] = grads;\n *\n * console.log('value');\n * value.print();\n *\n * console.log('da');\n * da.print();\n * console.log('db');\n * db.print();\n * ```\n *\n * @doc {heading: 'Training', subheading: 'Gradients'}\n */\nfunction valueAndGrads(f) {\n util.assert(util.isFunction(f), () => 'The f passed in valueAndGrads(f) must be a function');\n return (args, dy) => {\n util.assert(Array.isArray(args) && args.every(arg => arg instanceof Tensor), () => 'The args passed in valueAndGrads(f)(args) must be array of ' +\n 'tensors');\n util.assert(dy == null || dy instanceof Tensor, () => 'The dy passed in valueAndGrads(f)(args, dy) must be a tensor');\n const res = ENGINE.gradients(() => f(...args), args, dy);\n if (dy != null) {\n util.assertShapesMatch(res.value.shape, dy.shape, 'The shape of dy passed in valueAndGrads(f)([x1,...], dy) must ' +\n 'match the shape returned by f([x1,...])');\n }\n checkGrads(res.grads);\n return res;\n };\n}\n/**\n * Computes and returns the gradient of f(x) with respect to the list of\n * trainable variables provided by `varList`. If no list is provided, it\n * defaults to all trainable variables.\n *\n * ```js\n * const a = tf.variable(tf.tensor1d([3, 4]));\n * const b = tf.variable(tf.tensor1d([5, 6]));\n * const x = tf.tensor1d([1, 2]);\n *\n * // f(a, b) = a * x ^ 2 + b * x\n * const f = () => a.mul(x.square()).add(b.mul(x)).sum();\n * // df/da = x ^ 2, df/db = x\n * const {value, grads} = tf.variableGrads(f);\n *\n * Object.keys(grads).forEach(varName => grads[varName].print());\n * ```\n *\n * @param f The function to execute. f() should return a scalar.\n * @param varList The list of variables to compute the gradients with respect\n * to. Defaults to all trainable variables.\n * @returns An object with the following keys and values:\n * - `value`: The value of the function `f`.\n * - `grads`: A map from the names of the variables to the gradients.\n * If the `varList` argument is provided explicitly and contains a subset of\n * non-trainable variables, this map in the return value will contain keys\n * that map the names of the non-trainable variables to `null`.\n *\n * @doc {heading: 'Training', subheading: 'Gradients'}\n */\nfunction variableGrads(f, varList) {\n util.assert(util.isFunction(f), () => 'The f passed in variableGrads(f) must be a function');\n util.assert(varList == null ||\n Array.isArray(varList) && varList.every(v => v instanceof Variable), () => 'The varList passed in variableGrads(f, varList) must be an array ' +\n 'of variables');\n const specifiedVarList = varList != null;\n if (!specifiedVarList) {\n // Get all of the trainable variables.\n varList = [];\n for (const varName in ENGINE.registeredVariables) {\n varList.push(ENGINE.registeredVariables[varName]);\n }\n }\n const specifiedNonTrainable = specifiedVarList ? varList.filter(variable => !variable.trainable) : null;\n // Prune non-trainable variables.\n const originalVarCount = varList.length;\n varList = varList.filter(variable => variable.trainable);\n util.assert(varList.length > 0, () => `variableGrads() expects at least one of the input variables to ` +\n `be trainable, but none of the ${originalVarCount} variables is ` +\n `trainable.`);\n const allowNoGradients = true;\n const { value, grads } = ENGINE.gradients(f, varList, null, allowNoGradients);\n util.assert(grads.some(g => g != null), () => 'Cannot find a connection between any variable and the result of ' +\n 'the loss function y=f(x). Please make sure the operations that ' +\n 'use variables are inside the function f passed to minimize().');\n util.assert(value.rank === 0, () => `The f passed in variableGrads(f) must return a scalar, but it ` +\n `returned a rank-${value.rank} tensor`);\n const namedGrads = {};\n varList.forEach((v, i) => {\n if (grads[i] != null) {\n namedGrads[v.name] = grads[i];\n }\n });\n if (specifiedNonTrainable != null) {\n // If varList is explicitly provided and contains non-trainable values,\n // add them to the returned gradients with `null` values.\n specifiedNonTrainable.forEach(v => namedGrads[v.name] = null);\n }\n return { value, grads: namedGrads };\n}\n/**\n * Overrides the gradient computation of a function `f`.\n *\n * Takes a function\n * `f(...inputs, save) => {value: Tensor, gradFunc: (dy, saved) => Tensor[]}`\n * and returns another function `g(...inputs)` which takes the same inputs as\n * `f`. When called, `g` returns `f().value`. In backward mode, custom gradients\n * with respect to each input of `f` are computed using `f().gradFunc`.\n *\n * The `save` function passed to `f` should be used for saving tensors needed\n * in the gradient. And the `saved` passed to the `gradFunc` is a\n * `NamedTensorMap`, which contains those saved tensors.\n *\n * ```js\n * const customOp = tf.customGrad((x, save) => {\n * // Save x to make sure it's available later for the gradient.\n * save([x]);\n * // Override gradient of our custom x ^ 2 op to be dy * abs(x);\n * return {\n * value: x.square(),\n * // Note `saved.x` which points to the `x` we saved earlier.\n * gradFunc: (dy, saved) => [dy.mul(saved[0].abs())]\n * };\n * });\n *\n * const x = tf.tensor1d([-1, -2, 3]);\n * const dx = tf.grad(x => customOp(x));\n *\n * console.log(`f(x):`);\n * customOp(x).print();\n * console.log(`f'(x):`);\n * dx(x).print();\n * ```\n *\n * @param f The function to evaluate in forward mode, which should return\n * `{value: Tensor, gradFunc: (dy, saved) => Tensor[]}`, where `gradFunc`\n * returns the custom gradients of `f` with respect to its inputs.\n *\n * @doc {heading: 'Training', subheading: 'Gradients'}\n */\nfunction customGrad(f) {\n return ENGINE.customGrad(f);\n}\nfunction checkGrads(grads) {\n const numNullGradients = grads.filter(g => g == null).length;\n if (numNullGradients > 0) {\n throw new Error(`Cannot compute gradient of y=f(x) with respect to x. Make sure that\n the f you passed encloses all operations that lead from x to y.`);\n }\n}\nexport { customGrad, variableGrads, valueAndGrad, valueAndGrads, grad, grads, };\n//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZ3JhZGllbnRzLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vdGZqcy1jb3JlL3NyYy9ncmFkaWVudHMudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUE7Ozs7Ozs7Ozs7Ozs7OztHQWVHO0FBRUgsT0FBTyxFQUFxQixNQUFNLEVBQUMsTUFBTSxVQUFVLENBQUM7QUFDcEQsT0FBTyxFQUFTLE1BQU0sRUFBRSxRQUFRLEVBQUMsTUFBTSxVQUFVLENBQUM7QUFFbEQsT0FBTyxFQUFDLGVBQWUsRUFBRSxvQkFBb0IsRUFBQyxNQUFNLG1CQUFtQixDQUFDO0FBRXhFLE9BQU8sS0FBSyxJQUFJLE1BQU0sUUFBUSxDQUFDO0FBRS9COzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7R0FpQ0c7QUFDSCxTQUFTLElBQUksQ0FBQyxDQUF3QjtJQUVwQyxJQUFJLENBQUMsTUFBTSxDQUNQLElBQUksQ0FBQyxVQUFVLENBQUMsQ0FBQyxDQUFDLEVBQUUsR0FBRyxFQUFFLENBQUMsNENBQTRDLENBQUMsQ0FBQztJQUM1RSxPQUFPLENBQUMsQ0FBb0IsRUFBRSxFQUFzQixFQUFVLEVBQUU7UUFDOUQseURBQXlEO1FBQ3pELE1BQU0sRUFBRSxHQUFHLGVBQWUsQ0FBQyxDQUFDLEVBQUUsR0FBRyxFQUFFLFNBQVMsRUFBRSxtQkFBbUIsQ0FBQyxDQUFDO1FBQ25FLE1BQU0sR0FBRyxHQUNMLENBQUMsRUFBRSxJQUFJLElBQUksQ0FBQyxDQUFDLENBQUMsQ0FBQyxlQUFlLENBQUMsRUFBRSxFQUFFLElBQUksRUFBRSxTQUFTLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDO1FBQy9ELE9BQU8sTUFBTSxDQUFDLElBQUksQ0FBQyxHQUFHLEVBQUU7WUFDdEIsTUFBTSxFQUFDLEtBQUssRUFBRSxLQUFLLEVBQUMsR0FBRyxNQUFNLENBQUMsU0FBUyxDQUFDLEdBQUcsRUFBRSxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsRUFB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LEVBQUMsQ0FBQztBQUNwQyxDQUFDO0FBRUQ7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7OztHQXVDRztBQUNILFNBQVMsVUFBVSxDQUFtQixDQUF3QjtJQUU1RCxPQUFPLE1BQU0sQ0FBQyxVQUFVLENBQUMsQ0FBQyxDQUFDLENBQUM7QUFDOUIsQ0FBQztBQUVELFNBQVMsVUFBVSxDQUFDLEtBQWU7SUFDakMsTUFBTSxnQkFBZ0IsR0FBRyxLQUFLLENBQUMsTUFBTSxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxJQUFJLElBQUksQ0FBQyxDQUFDLE1BQU0sQ0FBQztJQUM3RCxJQUFJLGdCQUFnQixHQUFHLENBQUMsRUFBRTtRQUN4QixNQUFNLElBQUksS0FBSyxDQUNYO29FQUM0RCxDQUFDLENBQUM7S0FDbkU7QUFDSCxDQUFDO0FBRUQsT0FBTyxFQUNMLFVBQVUsRUFDVixhQUFhLEVBQ2IsWUFBWSxFQUNaLGFBQWEsRUFDYixJQUFJLEVBQ0osS0FBSyxHQUNOLENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyIvKipcbiAqIEBsaWNlbnNlXG4gKiBDb3B5cmlnaHQgMjAxOCBHb29nbGUgTExDLiBBbGwgUmlnaHRzIFJlc2VydmVkLlxuICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlIFwiTGljZW5zZVwiKTtcbiAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS5cbiAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdFxuICpcbiAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMFxuICpcbiAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmVcbiAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuIFwiQVMgSVNcIiBCQVNJUyxcbiAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLlxuICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZFxuICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuXG4gKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuICovXG5cbmltcG9ydCB7Q3VzdG9tR3JhZGllbnRGdW5jLCBFTkdJTkV9IGZyb20gJy4vZW5naW5lJztcbmltcG9ydCB7U2NhbGFyLCBUZW5zb3IsIFZhcmlhYmxlfSBmcm9tICcuL3RlbnNvcic7XG5pbXBvcnQge05hbWVkVGVuc29yTWFwfSBmcm9tICcuL3RlbnNvcl90eXBlcyc7XG5pbXBvcnQge2NvbnZlcnRUb1RlbnNvciwgY29udmVydFRvVGVuc29yQXJyYXl9IGZyb20gJy4vdGVuc29yX3V0aWxfZW52JztcbmltcG9ydCB7VGVuc29yTGlrZX0gZnJvbSAnLi90eXBlcyc7XG5pbXBvcnQgKiBhcyB1dGlsIGZyb20gJy4vdXRpbCc7XG5cbi8qKlxuICogUHJvdmlkZWQgYGYoeClgLCByZXR1cm5zIGFub3RoZXIgZnVuY3Rpb24gYGcoeCwgZHk/KWAsIHdoaWNoIGdpdmVzIHRoZVxuICogZ3JhZGllbnQgb2YgYGYoeClgIHdpdGggcmVzcGVjdCB0byBgeGAuXG4gKlxuICogSWYgYGR5YCBpcyBwcm92aWRlZCwgdGhlIGdyYWRpZW50IG9mIGBmKHgpLm11bChkeSkuc3VtKClgIHdpdGggcmVzcGVjdCB0b1xuICogYHhgIGlzIGNvbXB1dGVkIGluc3RlYWQuIGBmKHgpYCBtdXN0IHRha2UgYSBzaW5nbGUgdGVuc29yIGB4YCBhbmQgcmV0dXJuIGFcbiAqIHNpbmdsZSB0ZW5zb3IgYHlgLiBJZiBgZigpYCB0YWtlcyBtdWx0aXBsZSBpbnB1dHMsIHVzZSBgdGYuZ3JhZHNgIGluc3RlYWQuXG4gKlxuICogYGBganNcbiAqIC8vIGYoeCkgPSB4IF4gMlxuICogY29uc3QgZiA9IHggPT4geC5zcXVhcmUoKTtcbiAqIC8vIGYnKHgpID0gMnhcbiAqIGNvbnN0IGcgPSB0Zi5ncmFkKGYpO1xuICpcbiAqIGNvbnN0IHggPSB0Zi50ZW5zb3IxZChbMiwgM10pO1xuICogZyh4KS5wcmludCgpO1xuICogYGBgXG4gKlxuICogYGBganNcbiAqIC8vIGYoeCkgPSB4IF4gM1xuICogY29uc3QgZiA9IHggPT4geC5wb3codGYuc2NhbGFyKDMsICdpbnQzMicpKTtcbiAqIC8vIGYnKHgpID0gM3ggXiAyXG4gKiBjb25zdCBnID0gdGYuZ3JhZChmKTtcbiAqIC8vIGYnJyh4KSA9IDZ4XG4gKiBjb25zdCBnZyA9IHRmLmdyYWQoZyk7XG4gKlxuICogY29uc3QgeCA9IHRmLnRlbnNvcjFkKFsyLCAzXSk7XG4gKiBnZyh4KS5wcmludCgpO1xuICogYGBgXG4gKlxuICogQHBhcmFtIGYgVGhlIGZ1bmN0aW9uIGYoeCksIHRvIGNvbXB1dGUgZ3JhZGllbnQgZm9yLlxuICpcbiAqIEBkb2Mge2hlYWRpbmc6ICdUcmFpbmluZycsIHN1YmhlYWRpbmc6ICdHcmFkaWVudHMnfVxuICovXG5mdW5jdGlvbiBncmFkKGY6ICh4OiBUZW5zb3IpID0+IFRlbnNvcik6IChcbiAgICB4OiBUZW5zb3JMaWtlfFRlbnNvciwgZHk/OiBUZW5zb3JMaWtlfFRlbnNvcikgPT4gVGVuc29yIHtcbiAgdXRpbC5hc3NlcnQoXG4gICAgICB1dGlsLmlzRnVuY3Rpb24oZiksICgpID0+ICdUaGUgZiBwYXNzZWQgaW4gZ3JhZChmKSBtdXN0IGJlIGEgZnVuY3Rpb24nKTtcbiAgcmV0dXJuICh4OiBUZW5zb3JMaWtlfFRlbnNvciwgZHk/OiBUZW5zb3JMaWtlfFRlbnNvcik6IFRlbnNvciA9PiB7XG4gICAgLy8geCBjYW4gYmUgb2YgYW55IGR0eXBlLCB0aHVzIG51bGwgYXMgdGhlIGxhc3QgYXJndW1lbnQuXG4gICAgY29uc3QgJHggPSBjb252ZXJ0VG9UZW5zb3IoeCwgJ3gnLCAndGYuZ3JhZCcsICdzdHJpbmdfb3JfbnVtZXJpYycpO1xuICAgIGNvbnN0ICRkeTogVGVuc29yID1cbiAgICAgICAgKGR5ICE9IG51bGwpID8gY29udmVydFRvVGVuc29yKGR5LCAnZHknLCAndGYuZ3JhZCcpIDogbnVsbDtcbiAgICByZXR1cm4gRU5HSU5FLnRpZHkoKCkgPT4ge1xuICAgICAgY29uc3Qge3ZhbHVlLCBncmFkc30gPSBFTkdJTkUuZ3JhZGllbnRzKCgpID0+IGYoJHgpLCBbJHhdLCAkZHkpO1xuICAgICAgaWYgKCRkeSAhPSBudWxsKSB7XG4gICAgICAgIHV0aWwuYXNzZXJ0U2hhcGVzTWF0Y2goXG4gICAgICAgICAgICB2YWx1ZS5zaGFwZSwgJGR5LnNoYXBlLFxuICAgICAgICAgICAgJ1RoZSBzaGFwZSBvZiBkeSBwYXNzZWQgaW4gZ3JhZChmKSh4LCBkeSkgbXVzdCBtYXRjaCB0aGUgc2hhcGUgJyArXG4gICAgICAgICAgICAgICAgJ3JldHVybmVkIGJ5IGYoeCknKTtcbiAgICAgIH1cbiAgICAgIGNoZWNrR3JhZHMoZ3JhZHMpO1xuICAgICAgcmV0dXJuIGdyYWRzWzBdO1xuICAgIH0pO1xuICB9O1xufVxuXG4vKipcbiAqIFByb3ZpZGVkIGBmKHgxLCB4MiwuLi4pYCwgcmV0dXJucyBhbm90aGVyIGZ1bmN0aW9uIGBnKFt4MSwgeDIsLi4uXSwgZHk/KWAsXG4gKiB3aGljaCBnaXZlcyBhbiBhcnJheSBvZiBncmFkaWVudHMgb2YgYGYoKWAgd2l0aCByZXNwZWN0IHRvIGVhY2ggaW5wdXRcbiAqIFtgeDFgLGB4MmAsLi4uXS5cbiAqXG4gKiBJZiBgZHlgIGlzIHBhc3NlZCB3aGVuIGNhbGxpbmcgYGcoKWAsIHRoZSBncmFkaWVudCBvZlxuICogYGYoeDEsLi4uKS5tdWwoZHkpLnN1bSgpYCB3aXRoIHJlc3BlY3QgdG8gZWFjaCBpbnB1dCBpcyBjb21wdXRlZCBpbnN0ZWFkLlxuICogVGhlIHByb3ZpZGVkIGBmYCBtdXN0IHRha2Ugb25lIG9yIG1vcmUgdGVuc29ycyBhbmQgcmV0dXJuIGEgc2luZ2xlIHRlbnNvclxuICogYHlgLiBJZiBgZigpYCB0YWtlcyBhIHNpbmdsZSBpbnB1dCwgd2UgcmVjb21tZW5kIHVzaW5nIGB0Zi5ncmFkYCBpbnN0ZWFkLlxuICpcbiAqIGBgYGpzXG4gKiAvLyBmKGEsIGIpID0gYSAqIGJcbiAqIGNvbnN0IGYgPSAoYSwgYikgPT4gYS5tdWwoYik7XG4gKiAvLyBkZiAvIGRhID0gYiwgZGYgLyBkYiA9IGFcbiAqIGNvbnN0IGcgPSB0Zi5ncmFkcyhmKTtcbiAqXG4gKiBjb25zdCBhID0gdGYudGVuc29yMWQoWzIsIDNdKTtcbiAqIGNvbnN0IGIgPSB0Zi50ZW5zb3IxZChbLTIsIC0zXSk7XG4gKiBjb25zdCBbZGEsIGRiXSA9IGcoW2EsIGJdKTtcbiAqIGNvbnNvbGUubG9nKCdkYScpO1xuICogZGEucHJpbnQoKTtcbiAqIGNvbnNvbGUubG9nKCdkYicpO1xuICogZGIucHJpbnQoKTtcbiAqIGBgYFxuICpcbiAqIEBwYXJhbSBmIFRoZSBmdW5jdGlvbiBgZih4MSwgeDIsLi4uKWAgdG8gY29tcHV0ZSBncmFkaWVudHMgZm9yLlxuICpcbiAqIEBkb2Mge2hlYWRpbmc6ICdUcmFpbmluZycsIHN1YmhlYWRpbmc6ICdHcmFkaWVudHMnfVxuICovXG5mdW5jdGlvbiBncmFkcyhmOiAoLi4uYXJnczogVGVuc29yW10pID0+IFRlbnNvcik6IChcbiAgICBhcmdzOiBBcnJheTxUZW5zb3J8VGVuc29yTGlrZT4sIGR5PzogVGVuc29yfFRlbnNvckxpa2UpID0+IFRlbnNvcltdIHtcbiAgdXRpbC5hc3NlcnQoXG4gICAgICB1dGlsLmlzRnVuY3Rpb24oZiksICgpID0+ICdUaGUgZiBwYXNzZWQgaW4gZ3JhZHMoZikgbXVzdCBiZSBhIGZ1bmN0aW9uJyk7XG4gIHJldHVybiAoYXJnczogQXJyYXk8VGVuc29yfFRlbnNvckxpa2U+LCBkeT86IFRlbnNvcnxUZW5zb3JMaWtlKTogVGVuc29yW10gPT4ge1xuICAgIHV0aWwuYXNzZXJ0KFxuICAgICAgICBBcnJheS5pc0FycmF5KGFyZ3MpLFxuICAgICAgICAoKSA9PiAnVGhlIGFyZ3MgcGFzc2VkIGluIGdyYWRzKGYpKGFyZ3MpIG11c3QgYmUgYW4gYXJyYXkgJyArXG4gICAgICAgICAgICAnb2YgYFRlbnNvcmBzIG9yIGBUZW5zb3JMaWtlYHMnKTtcbiAgICAvLyBhcmdzIGNhbiBiZSBvZiBhbnkgZHR5cGUsIHRodXMgbnVsbCBhcyB0aGUgbGFzdCBhcmd1bWVudC5cbiAgICBjb25zdCAkYXJncyA9XG4gICAgICAgIGNvbnZlcnRUb1RlbnNvckFycmF5KGFyZ3MsICdhcmdzJywgJ3RmLmdyYWRzJywgJ3N0cmluZ19vcl9udW1lcmljJyk7XG4gICAgY29uc3QgJGR5OiBUZW5zb3IgPVxuICAgICAgICAoZHkgIT0gbnVsbCkgPyBjb252ZXJ0VG9UZW5zb3IoZHksICdkeScsICd0Zi5ncmFkcycpIDogbnVsbDtcbiAgICByZXR1cm4gRU5HSU5FLnRpZHkoKCkgPT4ge1xuICAgICAgY29uc3Qge3ZhbHVlLCBncmFkc30gPSBFTkdJTkUuZ3JhZGllbnRzKCgpID0+IGYoLi4uJGFyZ3MpLCAkYXJncywgJGR5KTtcbiAgICAgIGlmICgkZHkgIT0gbnVsbCkge1xuICAgICAgICB1dGlsLmFzc2VydFNoYXBlc01hdGNoKFxuICAgICAgICAgICAgdmFsdWUuc2hhcGUsICRkeS5zaGFwZSxcbiAgICAgICAgICAgICdUaGUgc2hhcGUgb2YgZHkgcGFzc2VkIGluIGdyYWRzKGYpKFt4MSwuLi5dLCBkeSkgbXVzdCAnICtcbiAgICAgICAgICAgICAgICAnbWF0Y2ggdGhlIHNoYXBlIHJldHVybmVkIGJ5IGYoW3gxLC4uLl0pJyk7XG4gICAgICB9XG4gICAgICBjaGVja0dyYWRzKGdyYWRzKTtcbiAgICAgIHJldHVybiBncmFkcztcbiAgICB9KTtcbiAgfTtcbn1cblxuLyoqXG4gKiBMaWtlIGB0Zi5ncmFkYCwgYnV0IGFsc28gcmV0dXJucyB0aGUgdmFsdWUgb2YgYGYoKWAuIFVzZWZ1bCB3aGVuIGBmKClgXG4gKiByZXR1cm5zIGEgbWV0cmljIHlvdSB3YW50IHRvIHNob3cuXG4gKlxuICogVGhlIHJlc3VsdCBpcyBhIHJpY2ggb2JqZWN0IHdpdGggdGhlIGZvbGxvd2luZyBwcm9wZXJ0aWVzOlxuICogLSBncmFkOiBUaGUgZ3JhZGllbnQgb2YgYGYoeClgIHcuci50LiBgeGAgKHJlc3VsdCBvZiBgdGYuZ3JhZGApLlxuICogLSB2YWx1ZTogVGhlIHZhbHVlIHJldHVybmVkIGJ5IGBmKHgpYC5cbiAqXG4gKiBgYGBqc1xuICogLy8gZih4KSA9IHggXiAyXG4gKiBjb25zdCBmID0geCA9PiB4LnNxdWFyZSgpO1xuICogLy8gZicoeCkgPSAyeFxuICogY29uc3QgZyA9IHRmLnZhbHVlQW5kR3JhZChmKTtcbiAqXG4gKiBjb25zdCB4ID0gdGYudGVuc29yMWQoWzIsIDNdKTtcbiAqIGNvbnN0IHt2YWx1ZSwgZ3JhZH0gPSBnKHgpO1xuICpcbiAqIGNvbnNvbGUubG9nKCd2YWx1ZScpO1xuICogdmFsdWUucHJpbnQoKTtcbiAqIGNvbnNvbGUubG9nKCdncmFkJyk7XG4gKiBncmFkLnByaW50KCk7XG4gKiBgYGBcbiAqXG4gKiBAZG9jIHtoZWFkaW5nOiAnVHJhaW5pbmcnLCBzdWJoZWFkaW5nOiAnR3JhZGllbnRzJ31cbiAqL1xuZnVuY3Rpb24gdmFsdWVBbmRHcmFkPEkgZXh0ZW5kcyBUZW5zb3IsIE8gZXh0ZW5kcyBUZW5zb3I+KGY6ICh4OiBJKSA9PiBPKTogKFxuICAgIHg6IEksIGR5PzogTykgPT4ge1xuICB2YWx1ZTogTztcbiAgZ3JhZDogSTtcbn0ge1xuICB1dGlsLmFzc2VydChcbiAgICAgIHV0aWwuaXNGdW5jdGlvbihmKSxcbiAgICAgICgpID0+ICdUaGUgZiBwYXNzZWQgaW4gdmFsdWVBbmRHcmFkKGYpIG11c3QgYmUgYSBmdW5jdGlvbicpO1xuICByZXR1cm4gKHg6IEksIGR5PzogTykgPT4ge1xuICAgIHV0aWwuYXNzZXJ0KFxuICAgICAgICB4IGluc3RhbmNlb2YgVGVuc29yLFxuICAgICAgICAoKSA9PiAnVGhlIHggcGFzc2VkIGluIHZhbHVlQW5kR3JhZChmKSh4KSBtdXN0IGJlIGEgdGVuc29yJyk7XG4gICAgdXRpbC5hc3NlcnQoXG4gICAgICAgIGR5ID09IG51bGwgfHwgZHkgaW5zdGFuY2VvZiBUZW5zb3IsXG4gICAgICAgICgpID0+ICdUaGUgZHkgcGFzc2VkIGluIHZhbHVlQW5kR3JhZChmKSh4LCBkeSkgbXVzdCBiZSBhIHRlbnNvcicpO1xuICAgIGNvbnN0IHtncmFkcywgdmFsdWV9ID0gRU5HSU5FLmdyYWRpZW50cygoKSA9PiBmKHgpLCBbeF0sIGR5KTtcbiAgICBjaGVja0dyYWRzKGdyYWRzKTtcbiAgICByZXR1cm4ge2dyYWQ6IGdyYWRzWzBdIGFzIEksIHZhbHVlfTtcbiAgfTtcbn1cblxuLyoqXG4gKiBMaWtlIGB0Zi5ncmFkc2AsIGJ1dCByZXR1cm5zIGFsc28gdGhlIHZhbHVlIG9mIGBmKClgLiBVc2VmdWwgd2hlbiBgZigpYFxuICogcmV0dXJucyBhIG1ldHJpYyB5b3Ugd2FudCB0byBzaG93LlxuICpcbiAqIFRoZSByZXN1bHQgaXMgYSByaWNoIG9iamVjdCB3aXRoIHRoZSBmb2xsb3dpbmcgcHJvcGVydGllczpcbiAqIC0gZ3JhZHM6IFRoZSBncmFkaWVudHMgb2YgYGYoKWAgdy5yLnQuIGVhY2ggaW5wdXQgKHJlc3VsdCBvZiBgdGYuZ3JhZHNgKS5cbiAqIC0gdmFsdWU6IFRoZSB2YWx1ZSByZXR1cm5lZCBieSBgZih4KWAuXG4gKlxuICogYGBganNcbiAqIC8vIGYoYSwgYikgPSBhICogYlxuICogY29uc3QgZiA9IChhLCBiKSA9PiBhLm11bChiKTtcbiAqIC8vIGRmL2RhID0gYiwgZGYvZGIgPSBhXG4gKiBjb25zdCBnID0gdGYudmFsdWVBbmRHcmFkcyhmKTtcbiAqXG4gKiBjb25zdCBhID0gdGYudGVuc29yMWQoWzIsIDNdKTtcbiAqIGNvbnN0IGIgPSB0Zi50ZW5zb3IxZChbLTIsIC0zXSk7XG4gKiBjb25zdCB7dmFsdWUsIGdyYWRzfSA9IGcoW2EsIGJdKTtcbiAqXG4gKiBjb25zdCBbZGEsIGRiXSA9IGdyYWRzO1xuICpcbiAqIGNvbnNvbGUubG9nKCd2YWx1ZScpO1xuICogdmFsdWUucHJpbnQoKTtcbiAqXG4gKiBjb25zb2xlLmxvZygnZGEnKTtcbiAqIGRhLnByaW50KCk7XG4gKiBjb25zb2xlLmxvZygnZGInKTtcbiAqIGRiLnByaW50KCk7XG4gKiBgYGBcbiAqXG4gKiBAZG9jIHtoZWFkaW5nOiAnVHJhaW5pbmcnLCBzdWJoZWFkaW5nOiAnR3JhZGllbnRzJ31cbiAqL1xuZnVuY3Rpb24gdmFsdWVBbmRHcmFkczxPIGV4dGVuZHMgVGVuc29yPihmOiAoLi4uYXJnczogVGVuc29yW10pID0+IE8pOiAoXG4gICAgYXJnczogVGVuc29yW10sIGR5PzogTykgPT4ge1xuICBncmFkczogVGVuc29yW107XG4gIHZhbHVlOiBPO1xufSB7XG4gIHV0aWwuYXNzZXJ0KFxuICAgICAgdXRpbC5pc0Z1bmN0aW9uKGYpLFxuICAgICAgKCkgPT4gJ1RoZSBmIHBhc3NlZCBpbiB2YWx1ZUFuZEdyYWRzKGYpIG11c3QgYmUgYSBmdW5jdGlvbicpO1xuICByZXR1cm4gKGFyZ3M6IFRlbnNvcltdLCBkeT86IE8pID0+IHtcbiAgICB1dGlsLmFzc2VydChcbiAgICAgICAgQXJyYXkuaXNBcnJheShhcmdzKSAmJiBhcmdzLmV2ZXJ5KGFyZyA9PiBhcmcgaW5zdGFuY2VvZiBUZW5zb3IpLFxuICAgICAgICAoKSA9PiAnVGhlIGFyZ3MgcGFzc2VkIGluIHZhbHVlQW5kR3JhZHMoZikoYXJncykgbXVzdCBiZSBhcnJheSBvZiAnICtcbiAgICAgICAgICAgICd0ZW5zb3JzJyk7XG4gICAgdXRpbC5hc3NlcnQoXG4gICAgICAgIGR5ID09IG51bGwgfHwgZHkgaW5zdGFuY2VvZiBUZW5zb3IsXG4gICAgICAgICgpID0+ICdUaGUgZHkgcGFzc2VkIGluIHZhbHVlQW5kR3JhZHMoZikoYXJncywgZHkpIG11c3QgYmUgYSB0ZW5zb3InKTtcbiAgICBjb25zdCByZXMgPSBFTkdJTkUuZ3JhZGllbnRzKCgpID0+IGYoLi4uYXJncyksIGFyZ3MsIGR5KTtcbiAgICBpZiAoZHkgIT0gbnVsbCkge1xuICAgICAgdXRpbC5hc3NlcnRTaGFwZXNNYXRjaChcbiAgICAgICAgICByZXMudmFsdWUuc2hhcGUsIGR5LnNoYXBlLFxuICAgICAgICAgICdUaGUgc2hhcGUgb2YgZHkgcGFzc2VkIGluIHZhbHVlQW5kR3JhZHMoZikoW3gxLC4uLl0sIGR5KSBtdXN0ICcgK1xuICAgICAgICAgICAgICAnbWF0Y2ggdGhlIHNoYXBlIHJldHVybmVkIGJ5IGYoW3gxLC4uLl0pJyk7XG4gICAgfVxuICAgIGNoZWNrR3JhZHMocmVzLmdyYWRzKTtcbiAgICByZXR1cm4gcmVzO1xuICB9O1xufVxuXG4vKipcbiAqIENvbXB1dGVzIGFuZCByZXR1cm5zIHRoZSBncmFkaWVudCBvZiBmKHgpIHdpdGggcmVzcGVjdCB0byB0aGUgbGlzdCBvZlxuICogdHJhaW5hYmxlIHZhcmlhYmxlcyBwcm92aWRlZCBieSBgdmFyTGlzdGAuIElmIG5vIGxpc3QgaXMgcHJvdmlkZWQsIGl0XG4gKiBkZWZhdWx0cyB0byBhbGwgdHJhaW5hYmxlIHZhcmlhYmxlcy5cbiAqXG4gKiBgYGBqc1xuICogY29uc3QgYSA9IHRmLnZhcmlhYmxlKHRmLnRlbnNvcjFkKFszLCA0XSkpO1xuICogY29uc3QgYiA9IHRmLnZhcmlhYmxlKHRmLnRlbnNvcjFkKFs1LCA2XSkpO1xuICogY29uc3QgeCA9IHRmLnRlbnNvcjFkKFsxLCAyXSk7XG4gKlxuICogLy8gZihhLCBiKSA9IGEgKiB4IF4gMiArIGIgKiB4XG4gKiBjb25zdCBmID0gKCkgPT4gYS5tdWwoeC5zcXVhcmUoKSkuYWRkKGIubXVsKHgpKS5zdW0oKTtcbiAqIC8vIGRmL2RhID0geCBeIDIsIGRmL2RiID0geFxuICogY29uc3Qge3ZhbHVlLCBncmFkc30gPSB0Zi52YXJpYWJsZUdyYWRzKGYpO1xuICpcbiAqIE9iamVjdC5rZXlzKGdyYWRzKS5mb3JFYWNoKHZhck5hbWUgPT4gZ3JhZHNbdmFyTmFtZV0ucHJpbnQoKSk7XG4gKiBgYGBcbiAqXG4gKiBAcGFyYW0gZiBUaGUgZnVuY3Rpb24gdG8gZXhlY3V0ZS4gZigpIHNob3VsZCByZXR1cm4gYSBzY2FsYXIuXG4gKiBAcGFyYW0gdmFyTGlzdCBUaGUgbGlzdCBvZiB2YXJpYWJsZXMgdG8gY29tcHV0ZSB0aGUgZ3JhZGllbnRzIHdpdGggcmVzcGVjdFxuICogICAgIHRvLiBEZWZhdWx0cyB0byBhbGwgdHJhaW5hYmxlIHZhcmlhYmxlcy5cbiAqIEByZXR1cm5zIEFuIG9iamVjdCB3aXRoIHRoZSBmb2xsb3dpbmcga2V5cyBhbmQgdmFsdWVzOlxuICogICAtIGB2YWx1ZWA6IFRoZSB2YWx1ZSBvZiB0aGUgZnVuY3Rpb24gYGZgLlxuICogICAtIGBncmFkc2A6IEEgbWFwIGZyb20gdGhlIG5hbWVzIG9mIHRoZSB2YXJpYWJsZXMgdG8gdGhlIGdyYWRpZW50cy5cbiAqICAgICBJZiB0aGUgYHZhckxpc3RgIGFyZ3VtZW50IGlzIHByb3ZpZGVkIGV4cGxpY2l0bHkgYW5kIGNvbnRhaW5zIGEgc3Vic2V0IG9mXG4gKiAgICAgbm9uLXRyYWluYWJsZSB2YXJpYWJsZXMsIHRoaXMgbWFwIGluIHRoZSByZXR1cm4gdmFsdWUgd2lsbCBjb250YWluIGtleXNcbiAqICAgICB0aGF0IG1hcCB0aGUgbmFtZXMgb2YgdGhlIG5vbi10cmFpbmFibGUgdmFyaWFibGVzIHRvIGBudWxsYC5cbiAqXG4gKiBAZG9jIHtoZWFkaW5nOiAnVHJhaW5pbmcnLCBzdWJoZWFkaW5nOiAnR3JhZGllbnRzJ31cbiAqL1xuZnVuY3Rpb24gdmFyaWFibGVHcmFkcyhmOiAoKSA9PiBTY2FsYXIsIHZhckxpc3Q/OiBWYXJpYWJsZVtdKTpcbiAgICB7dmFsdWU6IFNjYWxhciwgZ3JhZHM6IE5hbWVkVGVuc29yTWFwfSB7XG4gIHV0aWwuYXNzZXJ0KFxuICAgICAgdXRpbC5pc0Z1bmN0aW9uKGYpLFxuICAgICAgKCkgPT4gJ1RoZSBmIHBhc3NlZCBpbiB2YXJpYWJsZUdyYWRzKGYpIG11c3QgYmUgYSBmdW5jdGlvbicpO1xuICB1dGlsLmFzc2VydChcbiAgICAgIHZhckxpc3QgPT0gbnVsbCB8fFxuICAgICAgICAgIEFycmF5LmlzQXJyYXkodmFyTGlzdCkgJiYgdmFyTGlzdC5ldmVyeSh2ID0+IHYgaW5zdGFuY2VvZiBWYXJpYWJsZSksXG4gICAgICAoKSA9PlxuICAgICAgICAgICdUaGUgdmFyTGlzdCBwYXNzZWQgaW4gdmFyaWFibGVHcmFkcyhmLCB2YXJMaXN0KSBtdXN0IGJlIGFuIGFycmF5ICcgK1xuICAgICAgICAgICdvZiB2YXJpYWJsZXMnKTtcblxuICBjb25zdCBzcGVjaWZpZWRWYXJMaXN0ID0gdmFyTGlzdCAhPSBudWxsO1xuICBpZiAoIXNwZWNpZmllZFZhckxpc3QpIHtcbiAgICAvLyBHZXQgYWxsIG9mIHRoZSB0cmFpbmFibGUgdmFyaWFibGVzLlxuICAgIHZhckxpc3QgPSBbXTtcbiAgICBmb3IgKGNvbnN0IHZhck5hbWUgaW4gRU5HSU5FLnJlZ2lzdGVyZWRWYXJpYWJsZXMpIHtcbiAgICAgIHZhckxpc3QucHVzaChFTkdJTkUucmVnaXN0ZXJlZFZhcmlhYmxlc1t2YXJOYW1lXSk7XG4gICAgfVxuICB9XG5cbiAgY29uc3Qgc3BlY2lmaWVkTm9uVHJhaW5hYmxlOiBWYXJpYWJsZVtdID1cbiAgICAgIHNwZWNpZmllZFZhckxpc3QgPyB2YXJMaXN0LmZpbHRlcih2YXJpYWJsZSA9PiAhdmFyaWFibGUudHJhaW5hYmxlKSA6IG51bGw7XG5cbiAgLy8gUHJ1bmUgbm9uLXRyYWluYWJsZSB2YXJpYWJsZXMuXG4gIGNvbnN0IG9yaWdpbmFsVmFyQ291bnQgPSB2YXJMaXN0Lmxlbmd0aDtcbiAgdmFyTGlzdCA9IHZhckxpc3QuZmlsdGVyKHZhcmlhYmxlID0+IHZhcmlhYmxlLnRyYWluYWJsZSk7XG4gIHV0aWwuYXNzZXJ0KFxuICAgICAgdmFyTGlzdC5sZW5ndGggPiAwLFxuICAgICAgKCkgPT4gYHZhcmlhYmxlR3JhZHMoKSBleHBlY3RzIGF0IGxlYXN0IG9uZSBvZiB0aGUgaW5wdXQgdmFyaWFibGVzIHRvIGAgK1xuICAgICAgICAgIGBiZSB0cmFpbmFibGUsIGJ1dCBub25lIG9mIHRoZSAke29yaWdpbmFsVmFyQ291bnR9IHZhcmlhYmxlcyBpcyBgICtcbiAgICAgICAgICBgdHJhaW5hYmxlLmApO1xuXG4gIGNvbnN0IGFsbG93Tm9HcmFkaWVudHMgPSB0cnVlO1xuICBjb25zdCB7dmFsdWUsIGdyYWRzfSA9IEVOR0lORS5ncmFkaWVudHMoZiwgdmFyTGlzdCwgbnVsbCwgYWxsb3dOb0dyYWRpZW50cyk7XG5cbiAgdXRpbC5hc3NlcnQoXG4gICAgICBncmFkcy5zb21lKGcgPT4gZyAhPSBudWxsKSxcbiAgICAgICgpID0+ICdDYW5ub3QgZmluZCBhIGNvbm5lY3Rpb24gYmV0d2VlbiBhbnkgdmFyaWFibGUgYW5kIHRoZSByZXN1bHQgb2YgJyArXG4gICAgICAgICAgJ3RoZSBsb3NzIGZ1bmN0aW9uIHk9Zih4KS4gUGxlYXNlIG1ha2Ugc3VyZSB0aGUgb3BlcmF0aW9ucyB0aGF0ICcgK1xuICAgICAgICAgICd1c2UgdmFyaWFibGVzIGFyZSBpbnNpZGUgdGhlIGZ1bmN0aW9uIGYgcGFzc2VkIHRvIG1pbmltaXplKCkuJyk7XG4gIHV0aWwuYXNzZXJ0KFxuICAgICAgdmFsdWUucmFuayA9PT0gMCxcbiAgICAgICgpID0+IGBUaGUgZiBwYXNzZWQgaW4gdmFyaWFibGVHcmFkcyhmKSBtdXN0IHJldHVybiBhIHNjYWxhciwgYnV0IGl0IGAgK1xuICAgICAgICAgIGByZXR1cm5lZCBhIHJhbmstJHt2YWx1ZS5yYW5rfSB0ZW5zb3JgKTtcblxuICBjb25zdCBuYW1lZEdyYWRzOiBOYW1lZFRlbnNvck1hcCA9IHt9O1xuICB2YXJMaXN0LmZvckVhY2goKHYsIGkpID0+IHtcbiAgICBpZiAoZ3JhZHNbaV0gIT0gbnVsbCkge1xuICAgICAgbmFtZWRHcmFkc1t2Lm5hbWVdID0gZ3JhZHNbaV07XG4gICAgfVxuICB9KTtcbiAgaWYgKHNwZWNpZmllZE5vblRyYWluYWJsZSAhPSBudWxsKSB7XG4gICAgLy8gSWYgdmFyTGlzdCBpcyBleHBsaWNpdGx5IHByb3ZpZGVkIGFuZCBjb250YWlucyBub24tdHJhaW5hYmxlIHZhbHVlcyxcbiAgICAvLyBhZGQgdGhlbSB0byB0aGUgcmV0dXJuZWQgZ3JhZGllbnRzIHdpdGggYG51bGxgIHZhbHVlcy5cbiAgICBzcGVjaWZpZWROb25UcmFpbmFibGUuZm9yRWFjaCh2ID0+IG5hbWVkR3JhZHNbdi5uYW1lXSA9IG51bGwpO1xuICB9XG4gIHJldHVybiB7dmFsdWUsIGdyYWRzOiBuYW1lZEdyYWRzfTtcbn1cblxuLyoqXG4gKiBPdmVycmlkZXMgdGhlIGdyYWRpZW50IGNvbXB1dGF0aW9uIG9mIGEgZnVuY3Rpb24gYGZgLlxuICpcbiAqIFRha2VzIGEgZnVuY3Rpb25cbiAqIGBmKC4uLmlucHV0cywgc2F2ZSkgPT4ge3ZhbHVlOiBUZW5zb3IsIGdyYWRGdW5jOiAoZHksIHNhdmVkKSA9PiBUZW5zb3JbXX1gXG4gKiBhbmQgcmV0dXJucyBhbm90aGVyIGZ1bmN0aW9uIGBnKC4uLmlucHV0cylgIHdoaWNoIHRha2VzIHRoZSBzYW1lIGlucHV0cyBhc1xuICogYGZgLiBXaGVuIGNhbGxlZCwgYGdgIHJldHVybnMgYGYoKS52YWx1ZWAuIEluIGJhY2t3YXJkIG1vZGUsIGN1c3RvbSBncmFkaWVudHNcbiAqIHdpdGggcmVzcGVjdCB0byBlYWNoIGlucHV0IG9mIGBmYCBhcmUgY29tcHV0ZWQgdXNpbmcgYGYoKS5ncmFkRnVuY2AuXG4gKlxuICogVGhlIGBzYXZlYCBmdW5jdGlvbiBwYXNzZWQgdG8gYGZgIHNob3VsZCBiZSB1c2VkIGZvciBzYXZpbmcgdGVuc29ycyBuZWVkZWRcbiAqIGluIHRoZSBncmFkaWVudC4gQW5kIHRoZSBgc2F2ZWRgIHBhc3NlZCB0byB0aGUgYGdyYWRGdW5jYCBpcyBhXG4gKiBgTmFtZWRUZW5zb3JNYXBgLCB3aGljaCBjb250YWlucyB0aG9zZSBzYXZlZCB0ZW5zb3JzLlxuICpcbiAqIGBgYGpzXG4gKiBjb25zdCBjdXN0b21PcCA9IHRmLmN1c3RvbUdyYWQoKHgsIHNhdmUpID0+IHtcbiAqICAgLy8gU2F2ZSB4IHRvIG1ha2Ugc3VyZSBpdCdzIGF2YWlsYWJsZSBsYXRlciBmb3IgdGhlIGdyYWRpZW50LlxuICogICBzYXZlKFt4XSk7XG4gKiAgIC8vIE92ZXJyaWRlIGdyYWRpZW50IG9mIG91ciBjdXN0b20geCBeIDIgb3AgdG8gYmUgZHkgKiBhYnMoeCk7XG4gKiAgIHJldHVybiB7XG4gKiAgICAgdmFsdWU6IHguc3F1YXJlKCksXG4gKiAgICAgLy8gTm90ZSBgc2F2ZWQueGAgd2hpY2ggcG9pbnRzIHRvIHRoZSBgeGAgd2Ugc2F2ZWQgZWFybGllci5cbiAqICAgICBncmFkRnVuYzogKGR5LCBzYXZlZCkgPT4gW2R5Lm11bChzYXZlZFswXS5hYnMoKSldXG4gKiAgIH07XG4gKiB9KTtcbiAqXG4gKiBjb25zdCB4ID0gdGYudGVuc29yMWQoWy0xLCAtMiwgM10pO1xuICogY29uc3QgZHggPSB0Zi5ncmFkKHggPT4gY3VzdG9tT3AoeCkpO1xuICpcbiAqIGNvbnNvbGUubG9nKGBmKHgpOmApO1xuICogY3VzdG9tT3AoeCkucHJpbnQoKTtcbiAqIGNvbnNvbGUubG9nKGBmJyh4KTpgKTtcbiAqIGR4KHgpLnByaW50KCk7XG4gKiBgYGBcbiAqXG4gKiBAcGFyYW0gZiBUaGUgZnVuY3Rpb24gdG8gZXZhbHVhdGUgaW4gZm9yd2FyZCBtb2RlLCB3aGljaCBzaG91bGQgcmV0dXJuXG4gKiAgICAgYHt2YWx1ZTogVGVuc29yLCBncmFkRnVuYzogKGR5LCBzYXZlZCkgPT4gVGVuc29yW119YCwgd2hlcmUgYGdyYWRGdW5jYFxuICogICAgIHJldHVybnMgdGhlIGN1c3RvbSBncmFkaWVudHMgb2YgYGZgIHdpdGggcmVzcGVjdCB0byBpdHMgaW5wdXRzLlxuICpcbiAqIEBkb2Mge2hlYWRpbmc6ICdUcmFpbmluZycsIHN1YmhlYWRpbmc6ICdHcmFkaWVudHMnfVxuICovXG5mdW5jdGlvbiBjdXN0b21HcmFkPFQgZXh0ZW5kcyBUZW5zb3I+KGY6IEN1c3RvbUdyYWRpZW50RnVuYzxUPik6XG4gICAgKC4uLmFyZ3M6IFRlbnNvcltdKSA9PiBUIHtcbiAgcmV0dXJuIEVOR0lORS5jdXN0b21HcmFkKGYpO1xufVxuXG5mdW5jdGlvbiBjaGVja0dyYWRzKGdyYWRzOiBUZW5zb3JbXSkge1xuICBjb25zdCBudW1OdWxsR3JhZGllbnRzID0gZ3JhZHMuZmlsdGVyKGcgPT4gZyA9PSBudWxsKS5sZW5ndGg7XG4gIGlmIChudW1OdWxsR3JhZGllbnRzID4gMCkge1xuICAgIHRocm93IG5ldyBFcnJvcihcbiAgICAgICAgYENhbm5vdCBjb21wdXRlIGdyYWRpZW50IG9mIHk9Zih4KSB3aXRoIHJlc3BlY3QgdG8geC4gTWFrZSBzdXJlIHRoYXRcbiAgICB0aGUgZiB5b3UgcGFzc2VkIGVuY2xvc2VzIGFsbCBvcGVyYXRpb25zIHRoYXQgbGVhZCBmcm9tIHggdG8geS5gKTtcbiAgfVxufVxuXG5leHBvcnQge1xuICBjdXN0b21HcmFkLFxuICB2YXJpYWJsZUdyYWRzLFxuICB2YWx1ZUFuZEdyYWQsXG4gIHZhbHVlQW5kR3JhZHMsXG4gIGdyYWQsXG4gIGdyYWRzLFxufTtcbiJdfQ==","/**\n * @license\n * Copyright 2017 Google LLC. All Rights Reserved.\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n * =============================================================================\n */\n// tslint:disable-next-line:no-any\nfunction _isNavigatorDefined() {\n return typeof navigator !== 'undefined' && navigator != null;\n}\nlet isMobileMockValue;\nexport function mockIsMobile(value) {\n isMobileMockValue = value;\n}\nexport function isMobile(nav) {\n if (isMobileMockValue !== undefined) {\n return isMobileMockValue;\n }\n if (nav || _isNavigatorDefined()) {\n if (!nav) {\n nav = navigator;\n }\n if (nav.product === 'ReactNative') {\n return true;\n }\n const a = nav.userAgent || nav.vendor ||\n // tslint:disable-next-line:no-any\n (typeof window !== 'undefined' ? window.opera : '');\n // Use `navigator.userAgentData.mobile` as fallback.\n if (!a) {\n // tslint:disable-next-line:no-any\n const navAny = nav;\n return navAny.userAgentData && navAny.userAgentData.mobile;\n }\n // tslint:disable-next-line:max-line-length\n return /(android|bb\\d+|meego).+mobile|avantgo|bada\\/|blackberry|blazer|compal|elaine|fennec|hiptop|iemobile|ip(hone|od)|iris|kindle|lge |maemo|midp|mmp|mobile.+firefox|netfront|opera m(ob|in)i|palm( os)?|phone|p(ixi|re)\\/|plucker|pocket|psp|series(4|6)0|symbian|treo|up\\.(browser|link)|vodafone|wap|windows ce|xda|xiino/i\n .test(a) ||\n // tslint:disable-next-line:max-line-length\n /1207|6310|6590|3gso|4thp|50[1-6]i|770s|802s|a wa|abac|ac(er|oo|s\\-)|ai(ko|rn)|al(av|ca|co)|amoi|an(ex|ny|yw)|aptu|ar(ch|go)|as(te|us)|attw|au(di|\\-m|r |s )|avan|be(ck|ll|nq)|bi(lb|rd)|bl(ac|az)|br(e|v)w|bumb|bw\\-(n|u)|c55\\/|capi|ccwa|cdm\\-|cell|chtm|cldc|cmd\\-|co(mp|nd)|craw|da(it|ll|ng)|dbte|dc\\-s|devi|dica|dmob|do(c|p)o|ds(12|\\-d)|el(49|ai)|em(l2|ul)|er(ic|k0)|esl8|ez([4-7]0|os|wa|ze)|fetc|fly(\\-|_)|g1 u|g560|gene|gf\\-5|g\\-mo|go(\\.w|od)|gr(ad|un)|haie|hcit|hd\\-(m|p|t)|hei\\-|hi(pt|ta)|hp( i|ip)|hs\\-c|ht(c(\\-| |_|a|g|p|s|t)|tp)|hu(aw|tc)|i\\-(20|go|ma)|i230|iac( |\\-|\\/)|ibro|idea|ig01|ikom|im1k|inno|ipaq|iris|ja(t|v)a|jbro|jemu|jigs|kddi|keji|kgt( |\\/)|klon|kpt |kwc\\-|kyo(c|k)|le(no|xi)|lg( g|\\/(k|l|u)|50|54|\\-[a-w])|libw|lynx|m1\\-w|m3ga|m50\\/|ma(te|ui|xo)|mc(01|21|ca)|m\\-cr|me(rc|ri)|mi(o8|oa|ts)|mmef|mo(01|02|bi|de|do|t(\\-| |o|v)|zz)|mt(50|p1|v )|mwbp|mywa|n10[0-2]|n20[2-3]|n30(0|2)|n50(0|2|5)|n7(0(0|1)|10)|ne((c|m)\\-|on|tf|wf|wg|wt)|nok(6|i)|nzph|o2im|op(ti|wv)|oran|owg1|p800|pan(a|d|t)|pdxg|pg(13|\\-([1-8]|c))|phil|pire|pl(ay|uc)|pn\\-2|po(ck|rt|se)|prox|psio|pt\\-g|qa\\-a|qc(07|12|21|32|60|\\-[2-7]|i\\-)|qtek|r380|r600|raks|rim9|ro(ve|zo)|s55\\/|sa(ge|ma|mm|ms|ny|va)|sc(01|h\\-|oo|p\\-)|sdk\\/|se(c(\\-|0|1)|47|mc|nd|ri)|sgh\\-|shar|sie(\\-|m)|sk\\-0|sl(45|id)|sm(al|ar|b3|it|t5)|so(ft|ny)|sp(01|h\\-|v\\-|v )|sy(01|mb)|t2(18|50)|t6(00|10|18)|ta(gt|lk)|tcl\\-|tdg\\-|tel(i|m)|tim\\-|t\\-mo|to(pl|sh)|ts(70|m\\-|m3|m5)|tx\\-9|up(\\.b|g1|si)|utst|v400|v750|veri|vi(rg|te)|vk(40|5[0-3]|\\-v)|vm40|voda|vulc|vx(52|53|60|61|70|80|81|83|85|98)|w3c(\\-| )|webc|whit|wi(g |nc|nw)|wmlb|wonu|x700|yas\\-|your|zeto|zte\\-/i\n .test(a.substr(0, 4));\n }\n return false;\n}\nexport function isBrowser() {\n return (typeof window !== 'undefined' && window.document != null) ||\n //@ts-ignore\n (typeof WorkerGlobalScope !== 'undefined');\n}\n//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZGV2aWNlX3V0aWwuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi90ZmpzLWNvcmUvc3JjL2RldmljZV91dGlsLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBOzs7Ozs7Ozs7Ozs7Ozs7R0FlRztBQUVILGtDQUFrQztBQUNsQyxTQUFTLG1CQUFtQjtJQUMxQixPQUFPLE9BQU8sU0FBUyxLQUFLLFdBQVcsSUFBSSxTQUFTLElBQUksSUFBSSxDQUFDO0FBQy9ELENBQUM7QUFFRCxJQUFJLGlCQUFvQyxDQUFDO0FBRXpDLE1BQU0sVUFBVSxZQUFZLENBQUMsS0FBd0I7SUFDbkQsaUJBQWlCLEdBQUcsS0FBSyxDQUFDO0FBQzVCLENBQUM7QUFFRCxNQUFNLFVBQVUsUUFBUSxDQUFDLEdBQWU7SUFDdEMsSUFBSSxpQkFBaUIsS0FBSyxTQUFTLEVBQUU7UUFDbkMsT0FBTyxpQkFBaUIsQ0FBQztLQUMxQjtJQUNELElBQUksR0FBRyxJQUFJLG1CQUFtQixFQUFFLEVBQUU7UUFDaEMsSUFBSSxDQUFDLEdBQUcsRUFBRTtZQUNSLEdBQUcsR0FBRyxTQUFTLENBQUM7U0FDakI7UUFDRCxJQUFJLEdBQUcsQ0FBQyxPQUFPLEtBQUssYUFBYSxFQUFFO1lBQ2pDLE9BQU8sSUFBSSxDQUFDO1NBQ2I7UUFFRCxNQUFNLENBQUMsR0FBRyxHQUFHLENBQUMsU0FBUyxJQUFJLEdBQUcsQ0FBQyxNQUFNO1lBQ2pDLGtDQUFrQztZQUNsQyxDQUFDLE9BQU8sTUFBTSxLQUFLLFdBQVcsQ0FBQyxDQUFDLENBQUUsTUFBYyxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUM7UUFDakUsb0RBQW9EO1FBQ3BELElBQUksQ0FBQyxDQUFDLEVBQUU7WUFDTixrQ0FBa0M7WUFDbEMsTUFBTSxNQUFNLEdBQUcsR0FBVSxDQUFDO1lBQzFCLE9BQU8sTUFBTSxDQUFDLGFBQWEsSUFBSSxNQUFNLENBQUMsYUFBYSxDQUFDLE1BQU0sQ0FBQztTQUM1RDtRQUNELDJDQUEyQztRQUMzQyxPQUFPLDBUQUEwVDthQUNyVCxJQUFJLENBQUMsQ0FBQyxDQUFDO1lBQ2YsMkNBQTJDO1lBQzNDLHlrREFBeWtEO2lCQUNwa0QsSUFBSSxDQUFDLENBQUMsQ0FBQyxNQUFNLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUM7S0FDL0I7SUFDRCxPQUFPLEtBQUssQ0FBQztBQUNmLENBQUM7QUFFRCxNQUFNLFVBQVUsU0FBUztJQUN2QixPQUFPLENBQUMsT0FBTyxNQUFNLEtBQUssV0FBVyxJQUFJLE1BQU0sQ0FBQyxRQUFRLElBQUksSUFBSSxDQUFDO1FBQzdELFlBQVk7UUFDWixDQUFDLE9BQU8saUJBQWlCLEtBQUssV0FBVyxDQUFDLENBQUM7QUFDakQsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbIi8qKlxuICogQGxpY2Vuc2VcbiAqIENvcHlyaWdodCAyMDE3IEdvb2dsZSBMTEMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuXG4gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgXCJMaWNlbnNlXCIpO1xuICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLlxuICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0XG4gKlxuICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wXG4gKlxuICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZVxuICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gXCJBUyBJU1wiIEJBU0lTLFxuICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuXG4gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kXG4gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS5cbiAqID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4gKi9cblxuLy8gdHNsaW50OmRpc2FibGUtbmV4dC1saW5lOm5vLWFueVxuZnVuY3Rpb24gX2lzTmF2aWdhdG9yRGVmaW5lZCgpOiBib29sZWFuIHtcbiAgcmV0dXJuIHR5cGVvZiBuYXZpZ2F0b3IgIT09ICd1bmRlZmluZWQnICYmIG5hdmlnYXRvciAhPSBudWxsO1xufVxuXG5sZXQgaXNNb2JpbGVNb2NrVmFsdWU6IGJvb2xlYW58dW5kZWZpbmVkO1xuXG5leHBvcnQgZnVuY3Rpb24gbW9ja0lzTW9iaWxlKHZhbHVlOiBib29sZWFufHVuZGVmaW5lZCkge1xuICBpc01vYmlsZU1vY2tWYWx1ZSA9IHZhbHVlO1xufVxuXG5leHBvcnQgZnVuY3Rpb24gaXNNb2JpbGUobmF2PzogTmF2aWdhdG9yKTogYm9vbGVhbiB7XG4gIGlmIChpc01vYmlsZU1vY2tWYWx1ZSAhPT0gdW5kZWZpbmVkKSB7XG4gICAgcmV0dXJuIGlzTW9iaWxlTW9ja1ZhbHVlO1xuICB9XG4gIGlmIChuYXYgfHwgX2lzTmF2aWdhdG9yRGVmaW5lZCgpKSB7XG4gICAgaWYgKCFuYXYpIHtcbiAgICAgIG5hdiA9IG5hdmlnYXRvcjtcbiAgICB9XG4gICAgaWYgKG5hdi5wcm9kdWN0ID09PSAnUmVhY3ROYXRpdmUnKSB7XG4gICAgICByZXR1cm4gdHJ1ZTtcbiAgICB9XG5cbiAgICBjb25zdCBhID0gbmF2LnVzZXJBZ2VudCB8fCBuYXYudmVuZG9yIHx8XG4gICAgICAgIC8vIHRzbGludDpkaXNhYmxlLW5leHQtbGluZTpuby1hbnlcbiAgICAgICAgKHR5cGVvZiB3aW5kb3cgIT09ICd1bmRlZmluZWQnID8gKHdpbmRvdyBhcyBhbnkpLm9wZXJhIDogJycpO1xuICAgIC8vIFVzZSBgbmF2aWdhdG9yLnVzZXJBZ2VudERhdGEubW9iaWxlYCBhcyBmYWxsYmFjay5cbiAgICBpZiAoIWEpIHtcbiAgICAgIC8vIHRzbGludDpkaXNhYmxlLW5leHQtbGluZTpuby1hbnlcbiAgICAgIGNvbnN0IG5hdkFueSA9IG5hdiBhcyBhbnk7XG4gICAgICByZXR1cm4gbmF2QW55LnVzZXJBZ2VudERhdGEgJiYgbmF2QW55LnVzZXJBZ2VudERhdGEubW9iaWxlO1xuICAgIH1cbiAgICAvLyB0c2xpbnQ6ZGlzYWJsZS1uZXh0LWxpbmU6bWF4LWxpbmUtbGVuZ3RoXG4gICAgcmV0dXJuIC8oYW5kcm9pZHxiYlxcZCt8bWVlZ28pLittb2JpbGV8YXZhbnRnb3xiYWRhXFwvfGJsYWNrYmVycnl8YmxhemVyfGNvbXBhbHxlbGFpbmV8ZmVubmVjfGhpcHRvcHxpZW1vYmlsZXxpcChob25lfG9kKXxpcmlzfGtpbmRsZXxsZ2UgfG1hZW1vfG1pZHB8bW1wfG1vYmlsZS4rZmlyZWZveHxuZXRmcm9udHxvcGVyYSBtKG9ifGluKWl8cGFsbSggb3MpP3xwaG9uZXxwKGl4aXxyZSlcXC98cGx1Y2tlcnxwb2NrZXR8cHNwfHNlcmllcyg0fDYpMHxzeW1iaWFufHRyZW98dXBcXC4oYnJvd3NlcnxsaW5rKXx2b2RhZm9uZXx3YXB8d2luZG93cyBjZXx4ZGF8eGlpbm8vaVxuICAgICAgICAgICAgICAgLnRlc3QoYSkgfHxcbiAgICAgICAgLy8gdHNsaW50OmRpc2FibGUtbmV4dC1saW5lOm1heC1saW5lLWxlbmd0aFxuICAgICAgICAvMTIwN3w2MzEwfDY1OTB8M2dzb3w0dGhwfDUwWzEtNl1pfDc3MHN8ODAyc3xhIHdhfGFiYWN8YWMoZXJ8b298c1xcLSl8YWkoa298cm4pfGFsKGF2fGNhfGNvKXxhbW9pfGFuKGV4fG55fHl3KXxhcHR1fGFyKGNofGdvKXxhcyh0ZXx1cyl8YXR0d3xhdShkaXxcXC1tfHIgfHMgKXxhdmFufGJlKGNrfGxsfG5xKXxiaShsYnxyZCl8YmwoYWN8YXopfGJyKGV8dil3fGJ1bWJ8YndcXC0obnx1KXxjNTVcXC98Y2FwaXxjY3dhfGNkbVxcLXxjZWxsfGNodG18Y2xkY3xjbWRcXC18Y28obXB8bmQpfGNyYXd8ZGEoaXR8bGx8bmcpfGRidGV8ZGNcXC1zfGRldml8ZGljYXxkbW9ifGRvKGN8cClvfGRzKDEyfFxcLWQpfGVsKDQ5fGFpKXxlbShsMnx1bCl8ZXIoaWN8azApfGVzbDh8ZXooWzQtN10wfG9zfHdhfHplKXxmZXRjfGZseShcXC18Xyl8ZzEgdXxnNTYwfGdlbmV8Z2ZcXC01fGdcXC1tb3xnbyhcXC53fG9kKXxncihhZHx1bil8aGFpZXxoY2l0fGhkXFwtKG18cHx0KXxoZWlcXC18aGkocHR8dGEpfGhwKCBpfGlwKXxoc1xcLWN8aHQoYyhcXC18IHxffGF8Z3xwfHN8dCl8dHApfGh1KGF3fHRjKXxpXFwtKDIwfGdvfG1hKXxpMjMwfGlhYyggfFxcLXxcXC8pfGlicm98aWRlYXxpZzAxfGlrb218aW0xa3xpbm5vfGlwYXF8aXJpc3xqYSh0fHYpYXxqYnJvfGplbXV8amlnc3xrZGRpfGtlaml8a2d0KCB8XFwvKXxrbG9ufGtwdCB8a3djXFwtfGt5byhjfGspfGxlKG5vfHhpKXxsZyggZ3xcXC8oa3xsfHUpfDUwfDU0fFxcLVthLXddKXxsaWJ3fGx5bnh8bTFcXC13fG0zZ2F8bTUwXFwvfG1hKHRlfHVpfHhvKXxtYygwMXwyMXxjYSl8bVxcLWNyfG1lKHJjfHJpKXxtaShvOHxvYXx0cyl8bW1lZnxtbygwMXwwMnxiaXxkZXxkb3x0KFxcLXwgfG98dil8enopfG10KDUwfHAxfHYgKXxtd2JwfG15d2F8bjEwWzAtMl18bjIwWzItM118bjMwKDB8Mil8bjUwKDB8Mnw1KXxuNygwKDB8MSl8MTApfG5lKChjfG0pXFwtfG9ufHRmfHdmfHdnfHd0KXxub2soNnxpKXxuenBofG8yaW18b3AodGl8d3YpfG9yYW58b3dnMXxwODAwfHBhbihhfGR8dCl8cGR4Z3xwZygxM3xcXC0oWzEtOF18YykpfHBoaWx8cGlyZXxwbChheXx1Yyl8cG5cXC0yfHBvKGNrfHJ0fHNlKXxwcm94fHBzaW98cHRcXC1nfHFhXFwtYXxxYygwN3wxMnwyMXwzMnw2MHxcXC1bMi03XXxpXFwtKXxxdGVrfHIzODB8cjYwMHxyYWtzfHJpbTl8cm8odmV8em8pfHM1NVxcL3xzYShnZXxtYXxtbXxtc3xueXx2YSl8c2MoMDF8aFxcLXxvb3xwXFwtKXxzZGtcXC98c2UoYyhcXC18MHwxKXw0N3xtY3xuZHxyaSl8c2doXFwtfHNoYXJ8c2llKFxcLXxtKXxza1xcLTB8c2woNDV8aWQpfHNtKGFsfGFyfGIzfGl0fHQ1KXxzbyhmdHxueSl8c3AoMDF8aFxcLXx2XFwtfHYgKXxzeSgwMXxtYil8dDIoMTh8NTApfHQ2KDAwfDEwfDE4KXx0YShndHxsayl8dGNsXFwtfHRkZ1xcLXx0ZWwoaXxtKXx0aW1cXC18dFxcLW1vfHRvKHBsfHNoKXx0cyg3MHxtXFwtfG0zfG01KXx0eFxcLTl8dXAoXFwuYnxnMXxzaSl8dXRzdHx2NDAwfHY3NTB8dmVyaXx2aShyZ3x0ZSl8dmsoNDB8NVswLTNdfFxcLXYpfHZtNDB8dm9kYXx2dWxjfHZ4KDUyfDUzfDYwfDYxfDcwfDgwfDgxfDgzfDg1fDk4KXx3M2MoXFwtfCApfHdlYmN8d2hpdHx3aShnIHxuY3xudyl8d21sYnx3b251fHg3MDB8eWFzXFwtfHlvdXJ8emV0b3x6dGVcXC0vaVxuICAgICAgICAgICAgLnRlc3QoYS5zdWJzdHIoMCwgNCkpO1xuICB9XG4gIHJldHVybiBmYWxzZTtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGlzQnJvd3NlcigpOiBib29sZWFuIHtcbiAgcmV0dXJuICh0eXBlb2Ygd2luZG93ICE9PSAndW5kZWZpbmVkJyAmJiB3aW5kb3cuZG9jdW1lbnQgIT0gbnVsbCkgfHxcbiAgICAgIC8vQHRzLWlnbm9yZVxuICAgICAgKHR5cGVvZiBXb3JrZXJHbG9iYWxTY29wZSAhPT0gJ3VuZGVmaW5lZCcpO1xufVxuIl19","/**\n * @license\n * Copyright 2019 Google LLC. All Rights Reserved.\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n * =============================================================================\n */\nimport './engine';\nimport * as device_util from './device_util';\nimport { env } from './environment';\nconst ENV = env();\n/**\n * This file contains environment-related flag registrations.\n */\n/** Whether to enable debug mode. */\nENV.registerFlag('DEBUG', () => false, debugValue => {\n if (debugValue) {\n console.warn('Debugging mode is ON. The output of every math call will ' +\n 'be downloaded to CPU and checked for NaNs. ' +\n 'This significantly impacts performance.');\n }\n});\n/** Whether we are in a browser (as versus, say, node.js) environment. */\nENV.registerFlag('IS_BROWSER', () => device_util.isBrowser());\n/** Whether we are in a browser (as versus, say, node.js) environment. */\nENV.registerFlag('IS_NODE', () => (typeof process !== 'undefined') &&\n (typeof process.versions !== 'undefined') &&\n (typeof process.versions.node !== 'undefined'));\n/** Whether this browser is Chrome. */\nENV.registerFlag('IS_CHROME', () => typeof navigator !== 'undefined' && navigator != null &&\n navigator.userAgent != null && /Chrome/.test(navigator.userAgent) &&\n /Google Inc/.test(navigator.vendor));\n/**\n * True when the environment is \"production\" where we disable safety checks\n * to gain performance.\n */\nENV.registerFlag('PROD', () => false);\n/**\n * Whether to do sanity checks when inferring a shape from user-provided\n * values, used when creating a new tensor.\n */\nENV.registerFlag('TENSORLIKE_CHECK_SHAPE_CONSISTENCY', () => ENV.getBool('DEBUG'));\n/** Whether deprecation warnings are enabled. */\nENV.registerFlag('DEPRECATION_WARNINGS_ENABLED', () => true);\n/** True if running unit tests. */\nENV.registerFlag('IS_TEST', () => false);\n/** Whether to check computation result for errors. */\nENV.registerFlag('CHECK_COMPUTATION_FOR_ERRORS', () => true);\n/** Whether the backend needs to wrap input to imageBitmap. */\nENV.registerFlag('WRAP_TO_IMAGEBITMAP', () => false);\n/** Experimental flag, whether enter compile only phase. */\nENV.registerFlag('ENGINE_COMPILE_ONLY', () => false);\n/** Whether to enable canvas2d willReadFrequently for GPU backends */\nENV.registerFlag('CANVAS2D_WILL_READ_FREQUENTLY_FOR_GPU', () => false);\n/** Whether to use setTimeoutCustom */\nENV.registerFlag('USE_SETTIMEOUTCUSTOM', () => false);\n//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZmxhZ3MuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi90ZmpzLWNvcmUvc3JjL2ZsYWdzLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBOzs7Ozs7Ozs7Ozs7Ozs7R0FlRztBQUNILE9BQU8sVUFBVSxDQUFDO0FBRWxCLE9BQU8sS0FBSyxXQUFXLE1BQU0sZUFBZSxDQUFDO0FBQzdDLE9BQU8sRUFBQyxHQUFHLEVBQUMsTUFBTSxlQUFlLENBQUM7QUFFbEMsTUFBTSxHQUFHLEdBQUcsR0FBRyxFQUFFLENBQUM7QUFFbEI7O0dBRUc7QUFFSCxvQ0FBb0M7QUFDcEMsR0FBRyxDQUFDLFlBQVksQ0FBQyxPQUFPLEVBQUUsR0FBRyxFQUFFLENBQUMsS0FBSyxFQUFFLFVBQVUsQ0FBQyxFQUFFO0lBQ2xELElBQUksVUFBVSxFQUFFO1FBQ2QsT0FBTyxDQUFDLElBQUksQ0FDUiwyREFBMkQ7WUFDM0QsNkNBQTZDO1lBQzdDLHlDQUF5QyxDQUFDLENBQUM7S0FDaEQ7QUFDSCxDQUFDLENBQUMsQ0FBQztBQUVILHlFQUF5RTtBQUN6RSxHQUFHLENBQUMsWUFBWSxDQUFDLFlBQVksRUFBRSxHQUFHLEVBQUUsQ0FBQyxXQUFXLENBQUMsU0FBUyxFQUFFLENBQUMsQ0FBQztBQUU5RCx5RUFBeUU7QUFDekUsR0FBRyxDQUFDLFlBQVksQ0FDWixTQUFTLEVBQ1QsR0FBRyxFQUFFLENBQUMsQ0FBQyxPQUFPLE9BQU8sS0FBSyxXQUFXLENBQUM7SUFDbEMsQ0FBQyxPQUFPLE9BQU8sQ0FBQyxRQUFRLEtBQUssV0FBVyxDQUFDO0lBQ3pDLENBQUMsT0FBTyxPQUFPLENBQUMsUUFBUSxDQUFDLElBQUksS0FBSyxXQUFXLENBQUMsQ0FBQyxDQUFDO0FBRXhELHNDQUFzQztBQUN0QyxHQUFHLENBQUMsWUFBWSxDQUNaLFdBQVcsRUFDWCxHQUFHLEVBQUUsQ0FBQyxPQUFPLFNBQVMsS0FBSyxXQUFXLElBQUksU0FBUyxJQUFJLElBQUk7SUFDdkQsU0FBUyxDQUFDLFNBQVMsSUFBSSxJQUFJLElBQUksUUFBUSxDQUFDLElBQUksQ0FBQyxTQUFTLENBQUMsU0FBUyxDQUFDO0lBQ2pFLFlBQVksQ0FBQyxJQUFJLENBQUMsU0FBUyxDQUFDLE1BQU0sQ0FBQyxDQUFDLENBQUM7QUFFN0M7OztHQUdHO0FBQ0gsR0FBRyxDQUFDLFlBQVksQ0FBQyxNQUFNLEVBQUUsR0FBRyxFQUFFLENBQUMsS0FBSyxDQUFDLENBQUM7QUFFdEM7OztHQUdHO0FBQ0gsR0FBRyxDQUFDLFlBQVksQ0FDWixvQ0FBb0MsRUFBRSxHQUFHLEVBQUUsQ0FBQyxHQUFHLENBQUMsT0FBTyxDQUFDLE9BQU8sQ0FBQyxDQUFDLENBQUM7QUFFdEUsZ0RBQWdEO0FBQ2hELEdBQUcsQ0FBQyxZQUFZLENBQUMsOEJBQThCLEVBQUUsR0FBRyxFQUFFLENBQUMsSUFBSSxDQUFDLENBQUM7QUFFN0Qsa0NBQWtDO0FBQ2xDLEdBQUcsQ0FBQyxZQUFZLENBQUMsU0FBUyxFQUFFLEdBQUcsRUFBRSxDQUFDLEtBQUssQ0FBQyxDQUFDO0FBRXpDLHNEQUFzRDtBQUN0RCxHQUFHLENBQUMsWUFBWSxDQUFDLDhCQUE4QixFQUFFLEdBQUcsRUFBRSxDQUFDLElBQUksQ0FBQyxDQUFDO0FBRTdELDhEQUE4RDtBQUM5RCxHQUFHLENBQUMsWUFBWSxDQUFDLHFCQUFxQixFQUFFLEdBQUcsRUFBRSxDQUFDLEtBQUssQ0FBQyxDQUFDO0FBRXJELDJEQUEyRDtBQUMzRCxHQUFHLENBQUMsWUFBWSxDQUFDLHFCQUFxQixFQUFFLEdBQUcsRUFBRSxDQUFDLEtBQUssQ0FBQyxDQUFDO0FBRXJELHFFQUFxRTtBQUNyRSxHQUFHLENBQUMsWUFBWSxDQUFDLHVDQUF1QyxFQUFFLEdBQUcsRUFBRSxDQUFDLEtBQUssQ0FBQyxDQUFDO0FBRXZFLHNDQUFzQztBQUN0QyxHQUFHLENBQUMsWUFBWSxDQUFDLHNCQUFzQixFQUFFLEdBQUcsRUFBRSxDQUFDLEtBQUssQ0FBQyxDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiLyoqXG4gKiBAbGljZW5zZVxuICogQ29weXJpZ2h0IDIwMTkgR29vZ2xlIExMQy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC5cbiAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSBcIkxpY2Vuc2VcIik7XG4gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuXG4gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXRcbiAqXG4gKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjBcbiAqXG4gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlXG4gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiBcIkFTIElTXCIgQkFTSVMsXG4gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC5cbiAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmRcbiAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLlxuICogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbiAqL1xuaW1wb3J0ICcuL2VuZ2luZSc7XG5cbmltcG9ydCAqIGFzIGRldmljZV91dGlsIGZyb20gJy4vZGV2aWNlX3V0aWwnO1xuaW1wb3J0IHtlbnZ9IGZyb20gJy4vZW52aXJvbm1lbnQnO1xuXG5jb25zdCBFTlYgPSBlbnYoKTtcblxuLyoqXG4gKiBUaGlzIGZpbGUgY29udGFpbnMgZW52aXJvbm1lbnQtcmVsYXRlZCBmbGFnIHJlZ2lzdHJhdGlvbnMuXG4gKi9cblxuLyoqIFdoZXRoZXIgdG8gZW5hYmxlIGRlYnVnIG1vZGUuICovXG5FTlYucmVnaXN0ZXJGbGFnKCdERUJVRycsICgpID0+IGZhbHNlLCBkZWJ1Z1ZhbHVlID0+IHtcbiAgaWYgKGRlYnVnVmFsdWUpIHtcbiAgICBjb25zb2xlLndhcm4oXG4gICAgICAgICdEZWJ1Z2dpbmcgbW9kZSBpcyBPTi4gVGhlIG91dHB1dCBvZiBldmVyeSBtYXRoIGNhbGwgd2lsbCAnICtcbiAgICAgICAgJ2JlIGRvd25sb2FkZWQgdG8gQ1BVIGFuZCBjaGVja2VkIGZvciBOYU5zLiAnICtcbiAgICAgICAgJ1RoaXMgc2lnbmlmaWNhbnRseSBpbXBhY3RzIHBlcmZvcm1hbmNlLicpO1xuICB9XG59KTtcblxuLyoqIFdoZXRoZXIgd2UgYXJlIGluIGEgYnJvd3NlciAoYXMgdmVyc3VzLCBzYXksIG5vZGUuanMpIGVudmlyb25tZW50LiAqL1xuRU5WLnJlZ2lzdGVyRmxhZygnSVNfQlJPV1NFUicsICgpID0+IGRldmljZV91dGlsLmlzQnJvd3NlcigpKTtcblxuLyoqIFdoZXRoZXIgd2UgYXJlIGluIGEgYnJvd3NlciAoYXMgdmVyc3VzLCBzYXksIG5vZGUuanMpIGVudmlyb25tZW50LiAqL1xuRU5WLnJlZ2lzdGVyRmxhZyhcbiAgICAnSVNfTk9ERScsXG4gICAgKCkgPT4gKHR5cGVvZiBwcm9jZXNzICE9PSAndW5kZWZpbmVkJykgJiZcbiAgICAgICAgKHR5cGVvZiBwcm9jZXNzLnZlcnNpb25zICE9PSAndW5kZWZpbmVkJykgJiZcbiAgICAgICAgKHR5cGVvZiBwcm9jZXNzLnZlcnNpb25zLm5vZGUgIT09ICd1bmRlZmluZWQnKSk7XG5cbi8qKiBXaGV0aGVyIHRoaXMgYnJvd3NlciBpcyBDaHJvbWUuICovXG5FTlYucmVnaXN0ZXJGbGFnKFxuICAgICdJU19DSFJPTUUnLFxuICAgICgpID0+IHR5cGVvZiBuYXZpZ2F0b3IgIT09ICd1bmRlZmluZWQnICYmIG5hdmlnYXRvciAhPSBudWxsICYmXG4gICAgICAgIG5hdmlnYXRvci51c2VyQWdlbnQgIT0gbnVsbCAmJiAvQ2hyb21lLy50ZXN0KG5hdmlnYXRvci51c2VyQWdlbnQpICYmXG4gICAgICAgIC9Hb29nbGUgSW5jLy50ZXN0KG5hdmlnYXRvci52ZW5kb3IpKTtcblxuLyoqXG4gKiBUcnVlIHdoZW4gdGhlIGVudmlyb25tZW50IGlzIFwicHJvZHVjdGlvblwiIHdoZXJlIHdlIGRpc2FibGUgc2FmZXR5IGNoZWNrc1xuICogdG8gZ2FpbiBwZXJmb3JtYW5jZS5cbiAqL1xuRU5WLnJlZ2lzdGVyRmxhZygnUFJPRCcsICgpID0+IGZhbHNlKTtcblxuLyoqXG4gKiBXaGV0aGVyIHRvIGRvIHNhbml0eSBjaGVja3Mgd2hlbiBpbmZlcnJpbmcgYSBzaGFwZSBmcm9tIHVzZXItcHJvdmlkZWRcbiAqIHZhbHVlcywgdXNlZCB3aGVuIGNyZWF0aW5nIGEgbmV3IHRlbnNvci5cbiAqL1xuRU5WLnJlZ2lzdGVyRmxhZyhcbiAgICAnVEVOU09STElLRV9DSEVDS19TSEFQRV9DT05TSVNURU5DWScsICgpID0+IEVOVi5nZXRCb29sKCdERUJVRycpKTtcblxuLyoqIFdoZXRoZXIgZGVwcmVjYXRpb24gd2FybmluZ3MgYXJlIGVuYWJsZWQuICovXG5FTlYucmVnaXN0ZXJGbGFnKCdERVBSRUNBVElPTl9XQVJOSU5HU19FTkFCTEVEJywgKCkgPT4gdHJ1ZSk7XG5cbi8qKiBUcnVlIGlmIHJ1bm5pbmcgdW5pdCB0ZXN0cy4gKi9cbkVOVi5yZWdpc3RlckZsYWcoJ0lTX1RFU1QnLCAoKSA9PiBmYWxzZSk7XG5cbi8qKiBXaGV0aGVyIHRvIGNoZWNrIGNvbXB1dGF0aW9uIHJlc3VsdCBmb3IgZXJyb3JzLiAqL1xuRU5WLnJlZ2lzdGVyRmxhZygnQ0hFQ0tfQ09NUFVUQVRJT05fRk9SX0VSUk9SUycsICgpID0+IHRydWUpO1xuXG4vKiogV2hldGhlciB0aGUgYmFja2VuZCBuZWVkcyB0byB3cmFwIGlucHV0IHRvIGltYWdlQml0bWFwLiAqL1xuRU5WLnJlZ2lzdGVyRmxhZygnV1JBUF9UT19JTUFHRUJJVE1BUCcsICgpID0+IGZhbHNlKTtcblxuLyoqIEV4cGVyaW1lbnRhbCBmbGFnLCB3aGV0aGVyIGVudGVyIGNvbXBpbGUgb25seSBwaGFzZS4gKi9cbkVOVi5yZWdpc3RlckZsYWcoJ0VOR0lORV9DT01QSUxFX09OTFknLCAoKSA9PiBmYWxzZSk7XG5cbi8qKiBXaGV0aGVyIHRvIGVuYWJsZSBjYW52YXMyZCB3aWxsUmVhZEZyZXF1ZW50bHkgZm9yIEdQVSBiYWNrZW5kcyAqL1xuRU5WLnJlZ2lzdGVyRmxhZygnQ0FOVkFTMkRfV0lMTF9SRUFEX0ZSRVFVRU5UTFlfRk9SX0dQVScsICgpID0+IGZhbHNlKTtcblxuLyoqIFdoZXRoZXIgdG8gdXNlIHNldFRpbWVvdXRDdXN0b20gKi9cbkVOVi5yZWdpc3RlckZsYWcoJ1VTRV9TRVRUSU1FT1VUQ1VTVE9NJywgKCkgPT4gZmFsc2UpO1xuIl19","/**\n * @license\n * Copyright 2018 Google LLC. All Rights Reserved.\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n * =============================================================================\n */\n/* Type definitions for exporting and importing of models. */\n/**\n * A map from Tensor dtype to number of bytes per element of the Tensor.\n */\nexport const DTYPE_VALUE_SIZE_MAP = {\n 'float32': 4,\n 'float16': 2,\n 'int32': 4,\n 'uint16': 2,\n 'uint8': 1,\n 'bool': 1,\n 'complex64': 8\n};\n//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidHlwZXMuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi8uLi90ZmpzLWNvcmUvc3JjL2lvL3R5cGVzLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBOzs7Ozs7Ozs7Ozs7Ozs7R0FlRztBQUVILDZEQUE2RDtBQUU3RDs7R0FFRztBQUNILE1BQU0sQ0FBQyxNQUFNLG9CQUFvQixHQUE4QjtJQUM3RCxTQUFTLEVBQUUsQ0FBQztJQUNaLFNBQVMsRUFBRSxDQUFDO0lBQ1osT0FBTyxFQUFFLENBQUM7SUFDVixRQUFRLEVBQUUsQ0FBQztJQUNYLE9BQU8sRUFBRSxDQUFDO0lBQ1YsTUFBTSxFQUFFLENBQUM7SUFDVCxXQUFXLEVBQUUsQ0FBQztDQUNmLENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyIvKipcbiAqIEBsaWNlbnNlXG4gKiBDb3B5cmlnaHQgMjAxOCBHb29nbGUgTExDLiBBbGwgUmlnaHRzIFJlc2VydmVkLlxuICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlIFwiTGljZW5zZVwiKTtcbiAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS5cbiAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdFxuICpcbiAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMFxuICpcbiAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmVcbiAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuIFwiQVMgSVNcIiBCQVNJUyxcbiAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLlxuICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZFxuICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuXG4gKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuICovXG5cbi8qIFR5cGUgZGVmaW5pdGlvbnMgZm9yIGV4cG9ydGluZyBhbmQgaW1wb3J0aW5nIG9mIG1vZGVscy4gKi9cblxuLyoqXG4gKiBBIG1hcCBmcm9tIFRlbnNvciBkdHlwZSB0byBudW1iZXIgb2YgYnl0ZXMgcGVyIGVsZW1lbnQgb2YgdGhlIFRlbnNvci5cbiAqL1xuZXhwb3J0IGNvbnN0IERUWVBFX1ZBTFVFX1NJWkVfTUFQOiB7W2R0eXBlOiBzdHJpbmddOiBudW1iZXJ9ID0ge1xuICAnZmxvYXQzMic6IDQsXG4gICdmbG9hdDE2JzogMixcbiAgJ2ludDMyJzogNCxcbiAgJ3VpbnQxNic6IDIsXG4gICd1aW50OCc6IDEsXG4gICdib29sJzogMSxcbiAgJ2NvbXBsZXg2NCc6IDhcbn07XG5cbi8qKlxuICogQSB3ZWlnaHQgbWFuaWZlc3QuXG4gKlxuICogVGhlIHdlaWdodCBtYW5pZmVzdCBjb25zaXN0cyBvZiBhbiBvcmRlcmVkIGxpc3Qgb2Ygd2VpZ2h0LW1hbmlmZXN0IGdyb3Vwcy5cbiAqIEVhY2ggd2VpZ2h0LW1hbmlmZXN0IGdyb3VwIChcImdyb3VwXCIgZm9yIHNob3J0IGhlcmVhZnRlcikgY29uc2lzdHMgb2YgYVxuICogbnVtYmVyIG9mIHdlaWdodCB2YWx1ZXMgc3RvcmVkIGluIGEgbnVtYmVyIG9mIHBhdGhzLlxuICogU2VlIHRoZSBkb2N1bWVudGF0aW9uIG9mIGBXZWlnaHRNYW5pZmVzdEdyb3VwQ29uZmlnYCBiZWxvdyBmb3IgbW9yZSBkZXRhaWxzLlxuICovXG5leHBvcnQgZGVjbGFyZSB0eXBlIFdlaWdodHNNYW5pZmVzdENvbmZpZyA9IFdlaWdodHNNYW5pZmVzdEdyb3VwQ29uZmlnW107XG5cbi8qKlxuICogQSB3ZWlnaHQtbWFuaWZlc3QgZ3JvdXAuXG4gKlxuICogQ29uc2lzdHMgb2YgYW4gb3JkZXJlZCBsaXN0IG9mIHdlaWdodCB2YWx1ZXMgZW5jb2RlZCBpbiBiaW5hcnkgZm9ybWF0LFxuICogc3RvcmVkIGluIGFuIG9yZGVyZWQgbGlzdCBvZiBwYXRocy5cbiAqL1xuZXhwb3J0IGRlY2xhcmUgaW50ZXJmYWNlIFdlaWdodHNNYW5pZmVzdEdyb3VwQ29uZmlnIHtcbiAgLyoqXG4gICAqIEFuIG9yZGVyZWQgbGlzdCBvZiBwYXRocy5cbiAgICpcbiAgICogUGF0aHMgYXJlIGludGVudGlvbmFsbHkgYWJzdHJhY3QgaW4gb3JkZXIgdG8gYmUgZ2VuZXJhbC4gRm9yIGV4YW1wbGUsIHRoZXlcbiAgICogY2FuIGJlIHJlbGF0aXZlIFVSTCBwYXRocyBvciByZWxhdGl2ZSBwYXRocyBvbiB0aGUgZmlsZSBzeXN0ZW0uXG4gICAqL1xuICBwYXRoczogc3RyaW5nW107XG5cbiAgLyoqXG4gICAqIFNwZWNpZmljYXRpb25zIG9mIHRoZSB3ZWlnaHRzIHN0b3JlZCBpbiB0aGUgcGF0aHMuXG4gICAqL1xuICB3ZWlnaHRzOiBXZWlnaHRzTWFuaWZlc3RFbnRyeVtdO1xufVxuXG4vKipcbiAqIEdyb3VwIHRvIHdoaWNoIHRoZSB3ZWlnaHQgYmVsb25ncy5cbiAqXG4gKiAtICdvcHRpbWl6ZXInOiBXZWlnaHQgZnJvbSBhIHN0YXRlZnVsIG9wdGltaXplci5cbiAqL1xuZXhwb3J0IHR5cGUgV2VpZ2h0R3JvdXAgPSAnbW9kZWwnfCdvcHRpbWl6ZXInO1xuXG4vKipcbiAqIEFuIGVudHJ5IGluIHRoZSB3ZWlnaHQgbWFuaWZlc3QuXG4gKlxuICogVGhlIGVudHJ5IGNvbnRhaW5zIHNwZWNpZmljYXRpb24gb2YgYSB3ZWlnaHQuXG4gKi9cbmV4cG9ydCBkZWNsYXJlIGludGVyZmFjZSBXZWlnaHRzTWFuaWZlc3RFbnRyeSB7XG4gIC8qKlxuICAgKiBOYW1lIG9mIHRoZSB3ZWlnaHQsIGUuZy4sICdEZW5zZV8xL2JpYXMnXG4gICAqL1xuICBuYW1lOiBzdHJpbmc7XG5cbiAgLyoqXG4gICAqIFNoYXBlIG9mIHRoZSB3ZWlnaHQuXG4gICAqL1xuICBzaGFwZTogbnVtYmVyW107XG5cbiAgLyoqXG4gICAqIERhdGEgdHlwZSBvZiB0aGUgd2VpZ2h0LlxuICAgKi9cbiAgZHR5cGU6ICdmbG9hdDMyJ3wnaW50MzInfCdib29sJ3wnc3RyaW5nJ3wnY29tcGxleDY0JztcblxuICAvKipcbiAgICogVHlwZSBvZiB0aGUgd2VpZ2h0LlxuICAgKlxuICAgKiBPcHRpb25hbC5cbiAgICpcbiAgICogVGhlIHZhbHVlICdvcHRpbWl6ZXInIGluZGljYXRlcyB0aGUgd2VpZ2h0IGJlbG9uZ3MgdG8gYW4gb3B0aW1pemVyXG4gICAqIChpLmUuLCB1c2VkIG9ubHkgZHVyaW5nIG1vZGVsIHRyYWluaW5nIGFuZCBub3QgZHVyaW5nIGluZmVyZW5jZSkuXG4gICAqL1xuICBncm91cD86IFdlaWdodEdyb3VwO1xuXG4gIC8qKlxuICAgKiBJbmZvcm1hdGlvbiBmb3IgZGVxdWFudGl6YXRpb24gb2YgdGhlIHdlaWdodC5cbiAgICovXG4gIHF1YW50aXphdGlvbj86IHtcbiAgICBzY2FsZT86IG51bWJlciwgIC8vIFRoZSBzY2FsaW5nIGNvbnN0YW50IHRvIG11bHRpcGx5IGJ5LlxuICAgIG1pbj86IG51bWJlciwgICAgLy8gVGhlIChwb3NzaWJseSBudWRnZWQpIG1pbmltdW0gd2VpZ2h0IHRvIGFkZC5cbiAgICAgICBkdHlwZTogJ3VpbnQxNid8J3VpbnQ4J3wnZmxvYXQxNicgIC8vIFRoZSBkdHlwZSBvZiB0aGUgcXVhbnRpemVkIHdlaWdodHMuXG4gIH07XG59XG5cbi8qKlxuICogT3B0aW9ucyBmb3Igc2F2aW5nIGEgbW9kZWwuXG4gKiBAaW5uYW1lc3BhY2UgaW9cbiAqL1xuZXhwb3J0IGludGVyZmFjZSBTYXZlQ29uZmlnIHtcbiAgLyoqXG4gICAqIFdoZXRoZXIgdG8gc2F2ZSBvbmx5IHRoZSB0cmFpbmFibGUgd2VpZ2h0cyBvZiB0aGUgbW9kZWwsIGlnbm9yaW5nIHRoZVxuICAgKiBub24tdHJhaW5hYmxlIG9uZXMuXG4gICAqL1xuICB0cmFpbmFibGVPbmx5PzogYm9vbGVhbjtcblxuICAvKipcbiAgICogV2hldGhlciB0aGUgb3B0aW1pemVyIHdpbGwgYmUgc2F2ZWQgKGlmIGV4aXN0cykuXG4gICAqXG4gICAqIERlZmF1bHQ6IGBmYWxzZWAuXG4gICAqL1xuICBpbmNsdWRlT3B0aW1pemVyPzogYm9vbGVhbjtcbn1cblxuLyoqXG4gKiBSZXN1bHQgb2YgYSBzYXZpbmcgb3BlcmF0aW9uLlxuICovXG5leHBvcnQgaW50ZXJmYWNlIFNhdmVSZXN1bHQge1xuICAvKipcbiAgICogSW5mb3JtYXRpb24gYWJvdXQgdGhlIG1vZGVsIGFydGlmYWN0cyBzYXZlZC5cbiAgICovXG4gIG1vZGVsQXJ0aWZhY3RzSW5mbzogTW9kZWxBcnRpZmFjdHNJbmZvO1xuXG4gIC8qKlxuICAgKiBIVFRQIHJlc3BvbnNlcyBmcm9tIHRoZSBzZXJ2ZXIgdGhhdCBoYW5kbGVkIHRoZSBtb2RlbC1zYXZpbmcgcmVxdWVzdCAoaWZcbiAgICogYW55KS4gVGhpcyBpcyBhcHBsaWNhYmxlIG9ubHkgdG8gc2VydmVyLWJhc2VkIHNhdmluZyByb3V0ZXMuXG4gICAqL1xuICByZXNwb25zZXM/OiBSZXNwb25zZVtdO1xuXG4gIC8qKlxuICAgKiBFcnJvciBtZXNzYWdlcyBhbmQgcmVsYXRlZCBkYXRhIChpZiBhbnkpLlxuICAgKi9cbiAgZXJyb3JzPzogQXJyYXk8e318c3RyaW5nPjtcbn1cblxuZXhwb3J0IGRlY2xhcmUgaW50ZXJmYWNlIE1vZGVsQXJ0aWZhY3RzSW5mbyB7XG4gIC8qKlxuICAgKiBUaW1lc3RhbXAgZm9yIHdoZW4gdGhlIG1vZGVsIGlzIHNhdmVkLlxuICAgKi9cbiAgZGF0ZVNhdmVkOiBEYXRlO1xuXG4gIC8qKlxuICAgKiBUT0RPIChjYWlzLHlhc3NvZ2JhKSBjb25zaWRlciByZW1vdmluZyBHcmFwaERlZiBhcyBHcmFwaERlZnMgbm93XG4gICAqIGNvbWUgaW4gYSBKU09OIGZvcm1hdCBhbmQgbm9uZSBvZiBvdXIgSU9IYW5kbGVycyBzdXBwb3J0IGEgbm9uIGpzb25cbiAgICogZm9ybWF0LiBXZSBjb3VsZCBjb25kZXIgcmVwbGFjaW5nIHRoaXMgd2l0aCAnQmluYXJ5JyBpZiB3ZSB3YW50IHRvXG4gICAqIGFsbG93IGZ1dHVyZSBoYW5kbGVycyB0byBzYXZlIHRvIG5vbiBqc29uIGZvcm1hdHMgKHRob3VnaCB0aGV5IHdpbGxcbiAgICogcHJvYmFibHkgd2FudCBtb3JlIGluZm9ybWF0aW9uIHRoYW4gJ0JpbmFyeScpLlxuICAgKiBUeXBlIG9mIHRoZSBtb2RlbCB0b3BvbG9neVxuICAgKlxuICAgKiBUeXBlIG9mIHRoZSBtb2RlbCB0b3BvbG9neVxuICAgKlxuICAgKiBQb3NzaWJsZSB2YWx1ZXM6XG4gICAqICAgLSBKU09OOiBKU09OIGNvbmZpZyAoaHVtYW4tcmVhZGFibGUsIGUuZy4sIEtlcmFzIEpTT04pLlxuICAgKiAgIC0gR3JhcGhEZWY6IFRlbnNvckZsb3dcbiAgICogICAgIFtHcmFwaERlZl0oaHR0cHM6Ly93d3cudGVuc29yZmxvdy5vcmcvZXh0ZW5kL3Rvb2xfZGV2ZWxvcGVycy8jZ3JhcGhkZWYpXG4gICAqICAgICBwcm90b2NvbCBidWZmZXIgKGJpbmFyeSkuXG4gICAqL1xuICBtb2RlbFRvcG9sb2d5VHlwZTogJ0pTT04nfCdHcmFwaERlZic7XG5cbiAgLyoqXG4gICAqIFNpemUgb2YgbW9kZWwgdG9wb2xvZ3kgKEtlcmFzIEpTT04gb3IgR3JhcGhEZWYpLCBpbiBieXRlcy5cbiAgICovXG4gIG1vZGVsVG9wb2xvZ3lCeXRlcz86IG51bWJlcjtcblxuICAvKipcbiAgICogU2l6ZSBvZiB3ZWlnaHQgc3BlY2lmaWNhdGlvbiBvciBtYW5pZmVzdCwgaW4gYnl0ZXMuXG4gICAqL1xuICB3ZWlnaHRTcGVjc0J5dGVzPzogbnVtYmVyO1xuXG4gIC8qKlxuICAgKiBTaXplIG9mIHdlaWdodCB2YWx1ZSBkYXRhLCBpbiBieXRlcy5cbiAgICovXG4gIHdlaWdodERhdGFCeXRlcz86IG51bWJlcjtcbn1cblxuLyoqIE1vZGVsIHRyYWluaW5nIGNvbmZpZ3VyYXRpb24uICovXG5leHBvcnQgZGVjbGFyZSBpbnRlcmZhY2UgVHJhaW5pbmdDb25maWcge1xuICAvLyBUT0RPKGNhaXMpOiBUaWdodGVuIHRoZSB0eXBpbmcgb25jZSBrZXJhcyBzcGVjIGlzIGF2YWlsYWJsZSB0byB0ZmpzLWNvcmUuXG4gIC8vIFNlZVxuICAvLyB0c2xpbnQ6ZGlzYWJsZS1uZXh0LWxpbmU6bWF4LWxpbmUtbGVuZ3RoXG4gIC8vIGh0dHBzOi8vZ2l0aHViLmNvbS90ZW5zb3JmbG93L3RmanMtbGF5ZXJzL2Jsb2IvbWFzdGVyL3NyYy9rZXJhc19mb3JtYXQvdHJhaW5pbmdfY29uZmlnLnRzXG4gIC8qKiBPcHRpbWl6ZXIgdXNlZCBmb3IgdGhlIG1vZGVsIHRyYWluaW5nLiAqL1xuICBvcHRpbWl6ZXJfY29uZmlnOiB7fTtcblxuICAvLyBUT0RPKGNhaXMpOiBUaWdodGVuIHRoZSB0eXBpbmcgb25jZSBrZXJhcyBzcGVjIGlzIGF2YWlsYWJsZSB0byB0ZmpzLWNvcmUuXG4gIC8qKiBMb3NzIGZ1bmN0aW9uKHMpIGZvciB0aGUgbW9kZWwncyBvdXRwdXQocykuICovXG4gIGxvc3M6IHN0cmluZ3xzdHJpbmdbXXx7W2tleTogc3RyaW5nXTogc3RyaW5nfTtcblxuICAvLyBUT0RPKGNhaXMpOiBUaWdodGVuIHRoZSB0eXBpbmcgb25jZSBrZXJhcyBzcGVjIGlzIGF2YWlsYWJsZSB0byB0ZmpzLWNvcmUuXG4gIC8qKiBNZXRyaWMgZnVuY3Rpb24ocykgZm9yIHRoZSBtb2RlbCdzIG91dHB1dChzKS4gKi9cbiAgbWV0cmljcz86IHN0cmluZ1tdfHtba2V5OiBzdHJpbmddOiBzdHJpbmd9O1xuXG4gIC8vIFRPRE8oY2Fpcyk6IFRpZ2h0ZW4gdGhlIHR5cGluZyBvbmNlIGtlcmFzIHNwZWMgaXMgYXZhaWxhYmxlIHRvIHRmanMtY29yZS5cbiAgd2VpZ2h0ZWRfbWV0cmljcz86IHN0cmluZ1tdO1xuXG4gIC8vIFRPRE8oY2Fpcyk6IFRpZ2h0ZW4gdGhlIHR5cGluZyBvbmNlIGtlcmFzIHNwZWMgaXMgYXZhaWxhYmxlIHRvIHRmanMtY29yZS5cbiAgc2FtcGxlX3dlaWdodF9tb2RlPzogc3RyaW5nO1xuXG4gIGxvc3Nfd2VpZ2h0cz86IG51bWJlcltdfHtba2V5OiBzdHJpbmddOiBudW1iZXJ9O1xufVxuXG4vKipcbiAqIFRoZSBzZXJpYWxpemVkIGFydGlmYWN0cyBvZiBhIG1vZGVsLCBpbmNsdWRpbmcgdG9wb2xvZ3kgYW5kIHdlaWdodHMuXG4gKlxuICogVGhlIGBtb2RlbFRvcG9sb2d5YCwgYHRyYWluaW5nQ29uZmlnYCwgYHdlaWdodFNwZWNzYCBhbmQgYHdlaWdodERhdGFgIGZpZWxkc1xuICogb2YgdGhpcyBpbnRlcmZhY2UgYXJlIG9wdGlvbmFsLCBpbiBvcmRlciB0byBzdXBwb3J0IHRvcG9sb2d5LSBvciB3ZWlnaHRzLW9ubHlcbiAqIHNhdmluZyBhbmQgbG9hZGluZy5cbiAqXG4gKiBOb3RlIHRoaXMgaW50ZXJmYWNlIGlzIHVzZWQgaW50ZXJuYWxseSBpbiBJT0hhbmRsZXJzLiAgRm9yIHRoZSBmaWxlIGZvcm1hdFxuICogd3JpdHRlbiB0byBkaXNrIGFzIGBtb2RlbC5qc29uYCwgc2VlIGBNb2RlbEpTT05gLlxuICovXG5leHBvcnQgZGVjbGFyZSBpbnRlcmZhY2UgTW9kZWxBcnRpZmFjdHMge1xuICAvKipcbiAgICogTW9kZWwgdG9wb2xvZ3kuXG4gICAqXG4gICAqIEZvciBLZXJhcy1zdHlsZSBgdGYuTW9kZWxgcywgdGhpcyBpcyBhIEpTT04gb2JqZWN0LlxuICAgKiBGb3IgVGVuc29yRmxvdy1zdHlsZSBtb2RlbHMgKGUuZy4sIGBTYXZlZE1vZGVsYCksIHRoaXMgaXMgdGhlIEpTT05cbiAgICogZW5jb2Rpbmcgb2YgdGhlIGBHcmFwaERlZmAgcHJvdG9jb2wgYnVmZmVyLlxuICAgKi9cbiAgbW9kZWxUb3BvbG9neT86IHt9fEFycmF5QnVmZmVyO1xuXG4gIC8qKlxuICAgKiBTZXJpYWxpemVkIGNvbmZpZ3VyYXRpb24gZm9yIHRoZSBtb2RlbCdzIHRyYWluaW5nLlxuICAgKi9cbiAgdHJhaW5pbmdDb25maWc/OiBUcmFpbmluZ0NvbmZpZztcblxuICAvKipcbiAgICogV2VpZ2h0IHNwZWNpZmljYXRpb25zLlxuICAgKlxuICAgKiBUaGlzIGNvcnJlc3BvbmRzIHRvIHRoZSB3ZWlnaHRzRGF0YSBiZWxvdy5cbiAgICovXG4gIHdlaWdodFNwZWNzPzogV2VpZ2h0c01hbmlmZXN0RW50cnlbXTtcblxuICAvKipcbiAgICogQmluYXJ5IGJ1ZmZlciBmb3IgYWxsIHdlaWdodCB2YWx1ZXMgY29uY2F0ZW5hdGVkIGluIHRoZSBvcmRlciBzcGVjaWZpZWRcbiAgICogYnkgYHdlaWdodFNwZWNzYC5cbiAgICovXG4gIHdlaWdodERhdGE/OiBBcnJheUJ1ZmZlcjtcblxuICAvKipcbiAgICogSGFyZC1jb2RlZCBmb3JtYXQgbmFtZSBmb3IgbW9kZWxzIHNhdmVkIGZyb20gVGVuc29yRmxvdy5qcyBvciBjb252ZXJ0ZWRcbiAgICogYnkgVGVuc29yRmxvdy5qcyBDb252ZXJ0ZXIuXG4gICAqL1xuICBmb3JtYXQ/OiBzdHJpbmc7XG5cbiAgLyoqXG4gICAqIFdoYXQgbGlicmFyeSBpcyByZXNwb25zaWJsZSBmb3Igb3JpZ2luYWxseSBnZW5lcmF0aW5nIHRoaXMgYXJ0aWZhY3QuXG4gICAqXG4gICAqIFVzZWQgZm9yIGRlYnVnZ2luZyBwdXJwb3Nlcy4gRS5nLiwgJ1RlbnNvckZsb3cuanMgdjEuMC4wJy5cbiAgICovXG4gIGdlbmVyYXRlZEJ5Pzogc3RyaW5nO1xuXG4gIC8qKlxuICAgKiBXaGF0IGxpYnJhcnkgb3IgdG9vbCBpcyByZXNwb25zaWJsZSBmb3IgY29udmVydGluZyB0aGUgb3JpZ2luYWwgbW9kZWxcbiAgICogdG8gdGhpcyBmb3JtYXQsIGFwcGxpY2FibGUgb25seSBpZiB0aGUgbW9kZWwgaXMgb3V0cHV0IGJ5IGEgY29udmVydGVyLlxuICAgKlxuICAgKiBVc2VkIGZvciBkZWJ1Z2dpbmcgcHVycG9zZXMuICBFLmcuLCAnVGVuc29yRmxvdy5qcyBDb252ZXJ0ZXIgdjEuMC4wJy5cbiAgICpcbiAgICogQSB2YWx1ZSBvZiBgbnVsbGAgbWVhbnMgdGhlIG1vZGVsIGFydGlmYWN0cyBhcmUgZ2VuZXJhdGVkIHdpdGhvdXQgYW55XG4gICAqIGNvbnZlcnNpb24gcHJvY2VzcyAoZS5nLiwgc2F2ZWQgZGlyZWN0bHkgZnJvbSBhIFRlbnNvckZsb3cuanNcbiAgICogYHRmLkxheWVyc01vZGVsYCBpbnN0YW5jZS4pXG4gICAqL1xuICBjb252ZXJ0ZWRCeT86IHN0cmluZ3xudWxsO1xuXG4gIC8qKlxuICAgKiBJbnB1dHMgYW5kIG91dHB1dHMgc2lnbmF0dXJlIGZvciBzYXZlZCBtb2RlbC5cbiAgICovXG4gIHNpZ25hdHVyZT86IHt9O1xuXG4gIC8qKlxuICAgKiBVc2VyLWRlZmluZWQgbWV0YWRhdGEgYWJvdXQgdGhlIG1vZGVsLlxuICAgKi9cbiAgdXNlckRlZmluZWRNZXRhZGF0YT86IHtba2V5OiBzdHJpbmddOiB7fX07XG5cbiAgLyoqXG4gICAqIEluaXRpYWxpemVyIGZvciB0aGUgbW9kZWwuXG4gICAqL1xuICBtb2RlbEluaXRpYWxpemVyPzoge307XG59XG5cbi8qKlxuICogVGhlIG9uLWRpc2sgZm9ybWF0IG9mIHRoZSBgbW9kZWwuanNvbmAgZmlsZS5cbiAqXG4gKiBURi5qcyAxLjAgYWx3YXlzIHBvcHVsYXRlcyB0aGUgb3B0aW9uYWwgZmllbGRzIHdoZW4gd3JpdGluZyBtb2RlbC5qc29uLlxuICogUHJpb3IgdmVyc2lvbnMgZGlkIG5vdCBwcm92aWRlIHRob3NlIGZpZWxkcy5cbiAqL1xuZXhwb3J0IGRlY2xhcmUgaW50ZXJmYWNlIE1vZGVsSlNPTiB7XG4gIC8qKlxuICAgKiBNb2RlbCB0b3BvbG9neS5cbiAgICpcbiAgICogRm9yIEtlcmFzLXN0eWxlIGB0Zi5Nb2RlbGBzLCB0aGlzIGlzIGEgSlNPTiBvYmplY3QuXG4gICAqIEZvciBUZW5zb3JGbG93LXN0eWxlIG1vZGVscyAoZS5nLiwgYFNhdmVkTW9kZWxgKSwgdGhpcyBpcyB0aGUgSlNPTlxuICAgKiBlbmNvZGluZyBvZiB0aGUgYEdyYXBoRGVmYCBwcm90b2NvbCBidWZmZXIuXG4gICAqL1xuICBtb2RlbFRvcG9sb2d5OiB7fTtcblxuICAvKiogTW9kZWwgdHJhaW5pbmcgY29uZmlndXJhdGlvbi4gKi9cbiAgdHJhaW5pbmdDb25maWc/OiBUcmFpbmluZ0NvbmZpZztcblxuICAvKipcbiAgICogV2VpZ2h0cyBtYW5pZmVzdC5cbiAgICpcbiAgICogVGhlIHdlaWdodHMgbWFuaWZlc3QgY29uc2lzdHMgb2YgYW4gb3JkZXJlZCBsaXN0IG9mIHdlaWdodC1tYW5pZmVzdFxuICAgKiBncm91cHMuIEVhY2ggd2VpZ2h0LW1hbmlmZXN0IGdyb3VwIGNvbnNpc3RzIG9mIGEgbnVtYmVyIG9mIHdlaWdodCB2YWx1ZXNcbiAgICogc3RvcmVkIGluIGEgbnVtYmVyIG9mIHBhdGhzLiBTZWUgdGhlIGRvY3VtZW50YXRpb24gb2ZcbiAgICogYFdlaWdodHNNYW5pZmVzdENvbmZpZ2AgZm9yIG1vcmUgZGV0YWlscy5cbiAgICovXG4gIHdlaWdodHNNYW5pZmVzdDogV2VpZ2h0c01hbmlmZXN0Q29uZmlnO1xuXG4gIC8qKlxuICAgKiBIYXJkLWNvZGVkIGZvcm1hdCBuYW1lIGZvciBtb2RlbHMgc2F2ZWQgZnJvbSBUZW5zb3JGbG93LmpzIG9yIGNvbnZlcnRlZFxuICAgKiBieSBUZW5zb3JGbG93LmpzIENvbnZlcnRlci5cbiAgICovXG4gIGZvcm1hdD86IHN0cmluZztcblxuICAvKipcbiAgICogV2hhdCBsaWJyYXJ5IGlzIHJlc3BvbnNpYmxlIGZvciBvcmlnaW5hbGx5IGdlbmVyYXRpbmcgdGhpcyBhcnRpZmFjdC5cbiAgICpcbiAgICogVXNlZCBmb3IgZGVidWdnaW5nIHB1cnBvc2VzLiBFLmcuLCAnVGVuc29yRmxvdy5qcyB2MS4wLjAnLlxuICAgKi9cbiAgZ2VuZXJhdGVkQnk/OiBzdHJpbmc7XG5cbiAgLyoqXG4gICAqIFdoYXQgbGlicmFyeSBvciB0b29sIGlzIHJlc3BvbnNpYmxlIGZvciBjb252ZXJ0aW5nIHRoZSBvcmlnaW5hbCBtb2RlbFxuICAgKiB0byB0aGlzIGZvcm1hdCwgYXBwbGljYWJsZSBvbmx5IGlmIHRoZSBtb2RlbCBpcyBvdXRwdXQgYnkgYSBjb252ZXJ0ZXIuXG4gICAqXG4gICAqIFVzZWQgZm9yIGRlYnVnZ2luZyBwdXJwb3Nlcy4gIEUuZy4sICdUZW5zb3JGbG93LmpzIENvbnZlcnRlciB2MS4wLjAnLlxuICAgKlxuICAgKiBBIHZhbHVlIG9mIGBudWxsYCBtZWFucyB0aGUgbW9kZWwgYXJ0aWZhY3RzIGFyZSBnZW5lcmF0ZWQgd2l0aG91dCBhbnlcbiAgICogY29udmVyc2lvbiBwcm9jZXNzIChlLmcuLCBzYXZlZCBkaXJlY3RseSBmcm9tIGEgVGVuc29yRmxvdy5qc1xuICAgKiBgdGYuTGF5ZXJzTW9kZWxgIGluc3RhbmNlLilcbiAgICovXG4gIGNvbnZlcnRlZEJ5Pzogc3RyaW5nfG51bGw7XG5cbiAgLyoqXG4gICAqIElucHV0cyBhbmQgb3V0cHV0cyBzaWduYXR1cmUgZm9yIHNhdmVkIG1vZGVsLlxuICAgKi9cbiAgc2lnbmF0dXJlPzoge307XG5cbiAgLyoqXG4gICAqIFVzZXItZGVmaW5lZCBtZXRhZGF0YSBhYm91dCB0aGUgbW9kZWwuXG4gICAqL1xuICB1c2VyRGVmaW5lZE1ldGFkYXRhPzoge1trZXk6IHN0cmluZ106IHt9fTtcblxuICAvKipcbiAgICogSW5pdGlhbGl6ZXIgZm9yIHRoZSBtb2RlbC5cbiAgICovXG4gIG1vZGVsSW5pdGlhbGl6ZXI/OiB7fTtcbn1cblxuLyoqXG4gKiBUeXBlIGRlZmluaXRpb24gZm9yIGhhbmRsZXJzIG9mIGxvYWRpbmcgb3BlcmF0aW9ucy5cbiAqL1xuZXhwb3J0IHR5cGUgTG9hZEhhbmRsZXIgPSAoKSA9PiBQcm9taXNlPE1vZGVsQXJ0aWZhY3RzPjtcblxuLyoqXG4gKiBUeXBlIGRlZmluaXRpb24gZm9yIGhhbmRsZXJzIG9mIHNhdmluZyBvcGVyYXRpb25zLlxuICovXG5leHBvcnQgdHlwZSBTYXZlSGFuZGxlciA9IChtb2RlbEFydGlmYWN0OiBNb2RlbEFydGlmYWN0cykgPT5cbiAgICBQcm9taXNlPFNhdmVSZXN1bHQ+O1xuXG4vKipcbiAqIEludGVyZmFjZSBmb3IgYSBtb2RlbCBpbXBvcnQvZXhwb3J0IGhhbmRsZXIuXG4gKlxuICogVGhlIGBzYXZlYCBhbmQgYGxvYWRgIGhhbmRsZXJzIGFyZSBib3RoIG9wdGlvbmFsLCBpbiBvcmRlciB0byBhbGxvdyBoYW5kbGVyc1xuICogdGhhdCBzdXBwb3J0IG9ubHkgc2F2aW5nIG9yIGxvYWRpbmcuXG4gKi9cbi8vIHRzbGludDpkaXNhYmxlLW5leHQtbGluZTppbnRlcmZhY2UtbmFtZVxuZXhwb3J0IGludGVyZmFjZSBJT0hhbmRsZXIge1xuICBzYXZlPzogU2F2ZUhhbmRsZXI7XG4gIGxvYWQ/OiBMb2FkSGFuZGxlcjtcbn1cblxuLyoqXG4gKiBUeXBlIGRlZmluaXRpb24gZm9yIGhhbmRsZXJzIG9mIHN5bmNocm9ub3VzIGxvYWRpbmcgb3BlcmF0aW9ucy5cbiAqL1xuZXhwb3J0IHR5cGUgTG9hZEhhbmRsZXJTeW5jID0gKCkgPT4gTW9kZWxBcnRpZmFjdHM7XG5cbi8qKlxuICogVHlwZSBkZWZpbml0aW9uIGZvciBoYW5kbGVycyBvZiBzeW5jaHJvbm91cyBzYXZpbmcgb3BlcmF0aW9ucy5cbiAqL1xuZXhwb3J0IHR5cGUgU2F2ZUhhbmRsZXJTeW5jID0gKG1vZGVsQXJ0aWZhY3Q6IE1vZGVsQXJ0aWZhY3RzKSA9PiBTYXZlUmVzdWx0O1xuXG4vKipcbiAqIEludGVyZmFjZSBmb3IgYSBzeW5jaHJvbm91cyBtb2RlbCBpbXBvcnQvZXhwb3J0IGhhbmRsZXIuXG4gKlxuICogVGhlIGBzYXZlYCBhbmQgYGxvYWRgIGhhbmRsZXJzIGFyZSBib3RoIG9wdGlvbmFsLCBpbiBvcmRlciB0byBhbGxvdyBoYW5kbGVyc1xuICogdGhhdCBzdXBwb3J0IG9ubHkgc2F2aW5nIG9yIGxvYWRpbmcuXG4gKi9cbi8vIHRzbGludDpkaXNhYmxlLW5leHQtbGluZTppbnRlcmZhY2UtbmFtZVxuZXhwb3J0IHR5cGUgSU9IYW5kbGVyU3luYyA9IHtcbiAgc2F2ZT86IFNhdmVIYW5kbGVyU3luYztcbiAgbG9hZD86IExvYWRIYW5kbGVyU3luYztcbn07XG5cbi8qKlxuICogQW4gaW50ZXJmYWNlIGZvciB0aGUgbWFuYWdlciBvZiBhIG1vZGVsIHN0b3JlLlxuICpcbiAqIEEgbW9kZWwgc3RvcmUgaXMgZGVmaW5lZCBhcyBhIHN0b3JhZ2UgbWVkaXVtIG9uIHdoaWNoIG11bHRpcGxlIG1vZGVscyBjYW5cbiAqIGJlIHN0b3JlZC4gRWFjaCBzdG9yZWQgbW9kZWwgaGFzIGEgdW5pcXVlIGBwYXRoYCBhcyBpdHMgaWRlbnRpZmllci5cbiAqIEEgYE1vZGVsU3RvcmVNYW5hZ2VyYCBmb3IgdGhlIHN0b3JlIGFsbG93cyBhY3Rpb25zIGluY2x1ZGluZ1xuICpcbiAqIC0gTGlzdGluZyB0aGUgbW9kZWxzIHN0b3JlZCBpbiB0aGUgc3RvcmUuXG4gKiAtIERlbGV0aW5nIGEgbW9kZWwgZnJvbSB0aGUgc3RvcmUuXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgTW9kZWxTdG9yZU1hbmFnZXIge1xuICAvKipcbiAgICogTGlzdCBhbGwgbW9kZWxzIGluIHRoZSBtb2RlbCBzdG9yZS5cbiAgICpcbiAgICogQHJldHVybnMgQSBkaWN0aW9uYXJ5IG1hcHBpbmcgcGF0aHMgb2YgZXhpc3RpbmcgbW9kZWxzIHRvIHRoZWlyXG4gICAqICAgbW9kZWwgYXJ0aWZhY3RzIGluZm8uIE1vZGVsIGFydGlmYWN0cyBpbmZvIGluY2x1ZGUgdHlwZSBvZiB0aGUgbW9kZWwnc1xuICAgKiAgIHRvcG9sb2d5LCBieXRlIHNpemVzIG9mIHRoZSB0b3BvbG9neSwgd2VpZ2h0cywgZXRjLlxuICAgKi9cbiAgbGlzdE1vZGVscygpOiBQcm9taXNlPHtbcGF0aDogc3RyaW5nXTogTW9kZWxBcnRpZmFjdHNJbmZvfT47XG5cbiAgLyoqXG4gICAqIFJlbW92ZSBhIG1vZGVsIHNwZWNpZmllZCBieSBgcGF0aGAuXG4gICAqXG4gICAqIEBwYXJhbSBwYXRoXG4gICAqIEByZXR1cm5zIE1vZGVsQXJ0aWZhY3RzSW5mbyBvZiB0aGUgZGVsZXRlZCBtb2RlbCAoaWYgYW5kIG9ubHkgaWYgZGVsZXRpb25cbiAgICogICBpcyBzdWNjZXNzZnVsKS5cbiAgICogQHRocm93cyBFcnJvciBpZiBkZWxldGlvbiBmYWlscywgZS5nLiwgaWYgbm8gbW9kZWwgZXhpc3RzIGF0IGBwYXRoYC5cbiAgICovXG4gIHJlbW92ZU1vZGVsKHBhdGg6IHN0cmluZyk6IFByb21pc2U8TW9kZWxBcnRpZmFjdHNJbmZvPjtcbn1cblxuLyoqXG4gKiBDYWxsYmFjayBmb3IgdGhlIHByb2dyZXNzIG9mIGEgbG9uZy1ydW5uaW5nIGFjdGlvbiBzdWNoIGFzIGFuIEhUVFBcbiAqIHJlcXVlc3QgZm9yIGEgbGFyZ2UgYmluYXJ5IG9iamVjdC5cbiAqXG4gKiBgZnJhY3Rpb25gIHNob3VsZCBiZSBhIG51bWJlciBpbiB0aGUgWzAsIDFdIGludGVydmFsLCBpbmRpY2F0aW5nIGhvd1xuICogbXVjaCBvZiB0aGUgYWN0aW9uIGhhcyBjb21wbGV0ZWQuXG4gKi9cbmV4cG9ydCB0eXBlIE9uUHJvZ3Jlc3NDYWxsYmFjayA9IChmcmFjdGlvbjogbnVtYmVyKSA9PiB2b2lkO1xuXG4vKiogQGlubmFtZXNwYWNlIGlvICovXG5leHBvcnQgaW50ZXJmYWNlIExvYWRPcHRpb25zIHtcbiAgLyoqXG4gICAqIFJlcXVlc3RJbml0IChvcHRpb25zKSBmb3IgSFRUUCByZXF1ZXN0cy5cbiAgICpcbiAgICogRm9yIGRldGFpbGVkIGluZm9ybWF0aW9uIG9uIHRoZSBzdXBwb3J0ZWQgZmllbGRzLCBzZWVcbiAgICogW2h0dHBzOi8vZGV2ZWxvcGVyLm1vemlsbGEub3JnL2VuLVVTL2RvY3MvV2ViL0FQSS9SZXF1ZXN0L1JlcXVlc3RdKFxuICAgKiAgICAgaHR0cHM6Ly9kZXZlbG9wZXIubW96aWxsYS5vcmcvZW4tVVMvZG9jcy9XZWIvQVBJL1JlcXVlc3QvUmVxdWVzdClcbiAgICovXG4gIHJlcXVlc3RJbml0PzogUmVxdWVzdEluaXQ7XG5cbiAgLyoqXG4gICAqIFByb2dyZXNzIGNhbGxiYWNrLlxuICAgKi9cbiAgb25Qcm9ncmVzcz86IE9uUHJvZ3Jlc3NDYWxsYmFjaztcblxuICAvKipcbiAgICogQSBmdW5jdGlvbiB1c2VkIHRvIG92ZXJyaWRlIHRoZSBgd2luZG93LmZldGNoYCBmdW5jdGlvbi5cbiAgICovXG4gIGZldGNoRnVuYz86IEZ1bmN0aW9uO1xuXG4gIC8qKlxuICAgKiBTdHJpY3QgbG9hZGluZyBtb2RlbDogd2hldGhlciBleHRyYW5lb3VzIHdlaWdodHMgb3IgbWlzc2luZ1xuICAgKiB3ZWlnaHRzIHNob3VsZCB0cmlnZ2VyIGFuIGBFcnJvcmAuXG4gICAqXG4gICAqIElmIGB0cnVlYCwgcmVxdWlyZSB0aGF0IHRoZSBwcm92aWRlZCB3ZWlnaHRzIGV4YWN0bHkgbWF0Y2ggdGhvc2VcbiAgICogcmVxdWlyZWQgYnkgdGhlIGxheWVycy4gYGZhbHNlYCBtZWFucyB0aGF0IGJvdGggZXh0cmEgd2VpZ2h0c1xuICAgKiBhbmQgbWlzc2luZyB3ZWlnaHRzIHdpbGwgYmUgc2lsZW50bHkgaWdub3JlZC5cbiAgICpcbiAgICogRGVmYXVsdDogYHRydWVgLlxuICAgKi9cbiAgc3RyaWN0PzogYm9vbGVhbjtcblxuICAvKipcbiAgICogUGF0aCBwcmVmaXggZm9yIHdlaWdodCBmaWxlcywgYnkgZGVmYXVsdCB0aGlzIGlzIGNhbGN1bGF0ZWQgZnJvbSB0aGVcbiAgICogcGF0aCBvZiB0aGUgbW9kZWwgSlNPTiBmaWxlLlxuICAgKlxuICAgKiBGb3IgaW5zdGFuY2UsIGlmIHRoZSBwYXRoIHRvIHRoZSBtb2RlbCBKU09OIGZpbGUgaXNcbiAgICogYGh0dHA6Ly9sb2NhbGhvc3QvZm9vL21vZGVsLmpzb25gLCB0aGVuIHRoZSBkZWZhdWx0IHBhdGggcHJlZml4IHdpbGwgYmVcbiAgICogYGh0dHA6Ly9sb2NhbGhvc3QvZm9vL2AuIElmIGEgd2VpZ2h0IGZpbGUgaGFzIHRoZSBwYXRoIHZhbHVlXG4gICAqIGBncm91cDEtc2hhcmQxb2YyYCBpbiB0aGUgd2VpZ2h0IG1hbmlmZXN0LCB0aGVuIHRoZSB3ZWlnaHQgZmlsZSB3aWxsIGJlXG4gICAqIGxvYWRlZCBmcm9tIGBodHRwOi8vbG9jYWxob3N0L2Zvby9ncm91cDEtc2hhcmQxb2YyYCBieSBkZWZhdWx0LiBIb3dldmVyLFxuICAgKiBpZiB5b3UgcHJvdmlkZSBhIGB3ZWlnaHRQYXRoUHJlZml4YCB2YWx1ZSBvZlxuICAgKiBgaHR0cDovL2xvY2FsaG9zdC9mb28vYWx0LXdlaWdodHNgLCB0aGVuIHRoZSB3ZWlnaHQgZmlsZSB3aWxsIGJlIGxvYWRlZFxuICAgKiBmcm9tIHRoZSBwYXRoIGBodHRwOi8vbG9jYWxob3N0L2Zvby9hbHQtd2VpZ2h0cy9ncm91cDEtc2hhcmQxb2YyYCBpbnN0ZWFkLlxuICAgKi9cbiAgd2VpZ2h0UGF0aFByZWZpeD86IHN0cmluZztcblxuICAvKipcbiAgICogV2hldGhlciB0aGUgbW9kdWxlIG9yIG1vZGVsIGlzIHRvIGJlIGxvYWRlZCBmcm9tIFRGIEh1Yi5cbiAgICpcbiAgICogU2V0dGluZyB0aGlzIHRvIGB0cnVlYCBhbGxvd3MgcGFzc2luZyBhIFRGLUh1YiBtb2R1bGUgVVJMLCBvbWl0dGluZyB0aGVcbiAgICogc3RhbmRhcmQgbW9kZWwgZmlsZSBuYW1lIGFuZCB0aGUgcXVlcnkgcGFyYW1ldGVycy5cbiAgICpcbiAgICogRGVmYXVsdDogYGZhbHNlYC5cbiAgICovXG4gIGZyb21URkh1Yj86IGJvb2xlYW47XG5cbiAgLyoqXG4gICAqIEFuIGFzeW5jIGZ1bmN0aW9uIHRvIGNvbnZlcnQgd2VpZ2h0IGZpbGUgbmFtZSB0byBVUkwuIFRoZSB3ZWlnaHQgZmlsZVxuICAgKiBuYW1lcyBhcmUgc3RvcmVkIGluIG1vZGVsLmpzb24ncyB3ZWlnaHRzTWFuaWZlc3QucGF0aHMgZmllbGQuIEJ5IGRlZmF1bHQgd2VcbiAgICogY29uc2lkZXIgd2VpZ2h0IGZpbGVzIGFyZSBjb2xvY2F0ZWQgd2l0aCB0aGUgbW9kZWwuanNvbiBmaWxlLiBGb3IgZXhhbXBsZTpcbiAgICogICAgIG1vZGVsLmpzb24gVVJMOiBodHRwczovL3d3dy5nb29nbGUuY29tL21vZGVscy8xL21vZGVsLmpzb25cbiAgICogICAgIGdyb3VwMS1zaGFyZDFvZjEuYmluIHVybDpcbiAgICogICAgICAgIGh0dHBzOi8vd3d3Lmdvb2dsZS5jb20vbW9kZWxzLzEvZ3JvdXAxLXNoYXJkMW9mMS5iaW5cbiAgICpcbiAgICogV2l0aCB0aGlzIGZ1bmMgeW91IGNhbiBjb252ZXJ0IHRoZSB3ZWlnaHQgZmlsZSBuYW1lIHRvIGFueSBVUkwuXG4gICAqL1xuICB3ZWlnaHRVcmxDb252ZXJ0ZXI/OiAod2VpZ2h0RmlsZU5hbWU6IHN0cmluZykgPT4gUHJvbWlzZTxzdHJpbmc+O1xufVxuXG4vKipcbiAqIEFkZGl0aW9uYWwgb3B0aW9ucyBmb3IgUGxhdGZvcm0uZmV0Y2hcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBSZXF1ZXN0RGV0YWlscyB7XG4gIC8qKlxuICAgKiBJcyB0aGlzIHJlcXVlc3QgZm9yIGEgYmluYXJ5IGZpbGUgKGFzIG9wcG9zZWQgdG8gYSBqc29uIGZpbGUpXG4gICAqL1xuICBpc0JpbmFyeT86IGJvb2xlYW47XG59XG4iXX0=","/**\n * @license\n * Copyright 2018 Google LLC. All Rights Reserved.\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n * =============================================================================\n */\nimport { complex } from '../ops/complex';\nimport { tensor } from '../ops/tensor';\nimport { sizeFromShape } from '../util';\nimport { DTYPE_VALUE_SIZE_MAP } from './types';\n/** Number of bytes reserved for the length of the string. (32bit integer). */\nconst NUM_BYTES_STRING_LENGTH = 4;\n/**\n * Encode a map from names to weight values as an ArrayBuffer, along with an\n * `Array` of `WeightsManifestEntry` as specification of the encoded weights.\n *\n * This function does not perform sharding.\n *\n * This function is the reverse of `decodeWeights`.\n *\n * @param tensors A map (\"dict\") from names to tensors.\n * @param group Group to which the weights belong (optional).\n * @returns A `Promise` of\n * - A flat `ArrayBuffer` with all the binary values of the `Tensor`s\n * concatenated.\n * - An `Array` of `WeightManifestEntry`s, carrying information including\n * tensor names, `dtype`s and shapes.\n * @throws Error: on unsupported tensor `dtype`.\n */\nexport async function encodeWeights(tensors, group) {\n // TODO(adarob, cais): Support quantization.\n const specs = [];\n const dataPromises = [];\n const names = Array.isArray(tensors) ?\n tensors.map(tensor => tensor.name) :\n Object.keys(tensors);\n for (let i = 0; i < names.length; ++i) {\n const name = names[i];\n const t = Array.isArray(tensors) ? tensors[i].tensor : tensors[name];\n if (t.dtype !== 'float32' && t.dtype !== 'int32' && t.dtype !== 'bool' &&\n t.dtype !== 'string' && t.dtype !== 'complex64') {\n throw new Error(`Unsupported dtype in weight '${name}': ${t.dtype}`);\n }\n const spec = { name, shape: t.shape, dtype: t.dtype };\n if (t.dtype === 'string') {\n const utf8bytes = new Promise(async (resolve) => {\n const vals = await t.bytes();\n const totalNumBytes = vals.reduce((p, c) => p + c.length, 0) +\n NUM_BYTES_STRING_LENGTH * vals.length;\n const bytes = new Uint8Array(totalNumBytes);\n let offset = 0;\n for (let i = 0; i < vals.length; i++) {\n const val = vals[i];\n const bytesOfLength = new Uint8Array(new Uint32Array([val.length]).buffer);\n bytes.set(bytesOfLength, offset);\n offset += NUM_BYTES_STRING_LENGTH;\n bytes.set(val, offset);\n offset += val.length;\n }\n resolve(bytes);\n });\n dataPromises.push(utf8bytes);\n }\n else {\n dataPromises.push(t.data());\n }\n if (group != null) {\n spec.group = group;\n }\n specs.push(spec);\n }\n const tensorValues = await Promise.all(dataPromises);\n return { data: concatenateTypedArrays(tensorValues), specs };\n}\n/**\n * Decode flat ArrayBuffer as weights.\n *\n * This function does not handle sharding.\n *\n * This function is the reverse of `encodeWeights`.\n *\n * @param buffer A flat ArrayBuffer carrying the binary values of the tensors\n * concatenated in the order specified in `specs`.\n * @param specs Specifications of the names, dtypes and shapes of the tensors\n * whose value are encoded by `buffer`.\n * @return A map from tensor name to tensor value, with the names corresponding\n * to names in `specs`.\n * @throws Error, if any of the tensors has unsupported dtype.\n */\nexport function decodeWeights(buffer, specs) {\n // TODO(adarob, cais): Support quantization.\n const out = {};\n let float16Decode;\n let offset = 0;\n for (const spec of specs) {\n const name = spec.name;\n const dtype = spec.dtype;\n const shape = spec.shape;\n const size = sizeFromShape(shape);\n let values;\n if ('quantization' in spec) {\n const quantization = spec.quantization;\n if (quantization.dtype === 'uint8' || quantization.dtype === 'uint16') {\n if (!('min' in quantization && 'scale' in quantization)) {\n throw new Error(`Weight ${spec.name} with quantization ${quantization.dtype} ` +\n `doesn't have corresponding metadata min and scale.`);\n }\n }\n else if (quantization.dtype === 'float16') {\n if (dtype !== 'float32') {\n throw new Error(`Weight ${spec.name} is quantized with ${quantization.dtype} ` +\n `which only supports weights of type float32 not ${dtype}.`);\n }\n }\n else {\n throw new Error(`Weight ${spec.name} has unknown ` +\n `quantization dtype ${quantization.dtype}. ` +\n `Supported quantization dtypes are: ` +\n `'uint8', 'uint16', and 'float16'.`);\n }\n const quantizationSizeFactor = DTYPE_VALUE_SIZE_MAP[quantization.dtype];\n const byteBuffer = buffer.slice(offset, offset + size * quantizationSizeFactor);\n const quantizedArray = (quantization.dtype === 'uint8') ?\n new Uint8Array(byteBuffer) :\n new Uint16Array(byteBuffer);\n if (dtype === 'float32') {\n if (quantization.dtype === 'uint8' || quantization.dtype === 'uint16') {\n values = new Float32Array(quantizedArray.length);\n for (let i = 0; i < quantizedArray.length; i++) {\n const v = quantizedArray[i];\n values[i] = v * quantization.scale + quantization.min;\n }\n }\n else if (quantization.dtype === 'float16') {\n if (float16Decode === undefined) {\n float16Decode = getFloat16Decoder();\n }\n values = float16Decode(quantizedArray);\n }\n else {\n throw new Error(`Unsupported quantization type ${quantization.dtype} ` +\n `for weight type float32.`);\n }\n }\n else if (dtype === 'int32') {\n if (quantization.dtype !== 'uint8' && quantization.dtype !== 'uint16') {\n throw new Error(`Unsupported quantization type ${quantization.dtype} ` +\n `for weight type int32.`);\n }\n values = new Int32Array(quantizedArray.length);\n for (let i = 0; i < quantizedArray.length; i++) {\n const v = quantizedArray[i];\n values[i] = Math.round(v * quantization.scale + quantization.min);\n }\n }\n else {\n throw new Error(`Unsupported dtype in weight '${name}': ${dtype}`);\n }\n offset += size * quantizationSizeFactor;\n }\n else if (dtype === 'string') {\n const size = sizeFromShape(spec.shape);\n values = [];\n for (let i = 0; i < size; i++) {\n const byteLength = new Uint32Array(buffer.slice(offset, offset + NUM_BYTES_STRING_LENGTH))[0];\n offset += NUM_BYTES_STRING_LENGTH;\n const bytes = new Uint8Array(buffer.slice(offset, offset + byteLength));\n values.push(bytes);\n offset += byteLength;\n }\n }\n else {\n const dtypeFactor = DTYPE_VALUE_SIZE_MAP[dtype];\n const byteBuffer = buffer.slice(offset, offset + size * dtypeFactor);\n if (dtype === 'float32') {\n values = new Float32Array(byteBuffer);\n }\n else if (dtype === 'int32') {\n values = new Int32Array(byteBuffer);\n }\n else if (dtype === 'bool') {\n values = new Uint8Array(byteBuffer);\n }\n else if (dtype === 'complex64') {\n values = new Float32Array(byteBuffer);\n const real = new Float32Array(values.length / 2);\n const image = new Float32Array(values.length / 2);\n for (let i = 0; i < real.length; i++) {\n real[i] = values[i * 2];\n image[i] = values[i * 2 + 1];\n }\n const realTensor = tensor(real, shape, 'float32');\n const imageTensor = tensor(image, shape, 'float32');\n out[name] = complex(realTensor, imageTensor);\n realTensor.dispose();\n imageTensor.dispose();\n }\n else {\n throw new Error(`Unsupported dtype in weight '${name}': ${dtype}`);\n }\n offset += size * dtypeFactor;\n }\n if (dtype !== 'complex64') {\n out[name] = tensor(values, shape, dtype);\n }\n }\n return out;\n}\n/**\n * Concatenate TypedArrays into an ArrayBuffer.\n */\nexport function concatenateTypedArrays(xs) {\n // TODO(adarob, cais): Support quantization.\n if (xs === null) {\n throw new Error(`Invalid input value: ${JSON.stringify(xs)}`);\n }\n let totalByteLength = 0;\n // `normalizedXs` is here for this reason: a `TypedArray`'s `buffer'\n // can have a different byte length from that of the `TypedArray` itself,\n // for example, when the `TypedArray` is created from an offset in an\n // `ArrayBuffer`. `normliazedXs` holds `TypedArray`s whose `buffer`s match\n // the `TypedArray` in byte length. If an element of `xs` does not show\n // this property, a new `TypedArray` that satisfy this property will be\n // constructed and pushed into `normalizedXs`.\n const normalizedXs = [];\n xs.forEach((x) => {\n totalByteLength += x.byteLength;\n // tslint:disable:no-any\n normalizedXs.push(x.byteLength === x.buffer.byteLength ? x :\n new x.constructor(x));\n if (!(x instanceof Float32Array || x instanceof Int32Array ||\n x instanceof Uint8Array)) {\n throw new Error(`Unsupported TypedArray subtype: ${x.constructor.name}`);\n }\n // tslint:enable:no-any\n });\n const y = new Uint8Array(totalByteLength);\n let offset = 0;\n normalizedXs.forEach((x) => {\n y.set(new Uint8Array(x.buffer), offset);\n offset += x.byteLength;\n });\n return y.buffer;\n}\n// Use Buffer on Node.js instead of Blob/atob/btoa\nconst useNodeBuffer = typeof Buffer !== 'undefined' &&\n (typeof Blob === 'undefined' || typeof atob === 'undefined' ||\n typeof btoa === 'undefined');\n/**\n * Calculate the byte length of a JavaScript string.\n *\n * Note that a JavaScript string can contain wide characters, therefore the\n * length of the string is not necessarily equal to the byte length.\n *\n * @param str Input string.\n * @returns Byte length.\n */\nexport function stringByteLength(str) {\n if (useNodeBuffer) {\n return Buffer.byteLength(str);\n }\n return new Blob([str]).size;\n}\n/**\n * Encode an ArrayBuffer as a base64 encoded string.\n *\n * @param buffer `ArrayBuffer` to be converted.\n * @returns A string that base64-encodes `buffer`.\n */\nexport function arrayBufferToBase64String(buffer) {\n if (useNodeBuffer) {\n return Buffer.from(buffer).toString('base64');\n }\n const buf = new Uint8Array(buffer);\n let s = '';\n for (let i = 0, l = buf.length; i < l; i++) {\n s += String.fromCharCode(buf[i]);\n }\n return btoa(s);\n}\n/**\n * Decode a base64 string as an ArrayBuffer.\n *\n * @param str Base64 string.\n * @returns Decoded `ArrayBuffer`.\n */\nexport function base64StringToArrayBuffer(str) {\n if (useNodeBuffer) {\n const buf = Buffer.from(str, 'base64');\n return buf.buffer.slice(buf.byteOffset, buf.byteOffset + buf.byteLength);\n }\n const s = atob(str);\n const buffer = new Uint8Array(s.length);\n for (let i = 0; i < s.length; ++i) {\n buffer.set([s.charCodeAt(i)], i);\n }\n return buffer.buffer;\n}\n/**\n * Concatenate a number of ArrayBuffers into one.\n *\n * @param buffers A number of array buffers to concatenate.\n * @returns Result of concatenating `buffers` in order.\n */\nexport function concatenateArrayBuffers(buffers) {\n if (buffers.length === 1) {\n return buffers[0];\n }\n let totalByteLength = 0;\n buffers.forEach((buffer) => {\n totalByteLength += buffer.byteLength;\n });\n const temp = new Uint8Array(totalByteLength);\n let offset = 0;\n buffers.forEach((buffer) => {\n temp.set(new Uint8Array(buffer), offset);\n offset += buffer.byteLength;\n });\n return temp.buffer;\n}\n/**\n * Get the basename of a path.\n *\n * Behaves in a way analogous to Linux's basename command.\n *\n * @param path\n */\nexport function basename(path) {\n const SEPARATOR = '/';\n path = path.trim();\n while (path.endsWith(SEPARATOR)) {\n path = path.slice(0, path.length - 1);\n }\n const items = path.split(SEPARATOR);\n return items[items.length - 1];\n}\n/**\n * Create `ModelJSON` from `ModelArtifacts`.\n *\n * @param artifacts Model artifacts, describing the model and its weights.\n * @param manifest Weight manifest, describing where the weights of the\n * `ModelArtifacts` are stored, and some metadata about them.\n * @returns Object representing the `model.json` file describing the model\n * artifacts and weights\n */\nexport function getModelJSONForModelArtifacts(artifacts, manifest) {\n const result = {\n modelTopology: artifacts.modelTopology,\n format: artifacts.format,\n generatedBy: artifacts.generatedBy,\n convertedBy: artifacts.convertedBy,\n weightsManifest: manifest\n };\n if (artifacts.signature != null) {\n result.signature = artifacts.signature;\n }\n if (artifacts.userDefinedMetadata != null) {\n result.userDefinedMetadata = artifacts.userDefinedMetadata;\n }\n if (artifacts.modelInitializer != null) {\n result.modelInitializer = artifacts.modelInitializer;\n }\n if (artifacts.trainingConfig != null) {\n result.trainingConfig = artifacts.trainingConfig;\n }\n return result;\n}\n/**\n * Create `ModelArtifacts` from a JSON file and weights.\n *\n * @param modelJSON Object containing the parsed JSON of `model.json`\n * @param weightSpecs The list of WeightsManifestEntry for the model. Must be\n * passed if the modelJSON has a weightsManifest.\n * @param weightData An ArrayBuffer of weight data for the model corresponding\n * to the weights in weightSpecs. Must be passed if the modelJSON has a\n * weightsManifest.\n * @returns A Promise of the `ModelArtifacts`, as described by the JSON file.\n */\nexport function getModelArtifactsForJSONSync(modelJSON, weightSpecs, weightData) {\n const modelArtifacts = {\n modelTopology: modelJSON.modelTopology,\n format: modelJSON.format,\n generatedBy: modelJSON.generatedBy,\n convertedBy: modelJSON.convertedBy\n };\n if (modelJSON.trainingConfig != null) {\n modelArtifacts.trainingConfig = modelJSON.trainingConfig;\n }\n if (modelJSON.weightsManifest != null) {\n if (!weightSpecs) {\n throw new Error('modelJSON has weightsManifest but weightSpecs is null');\n }\n if (!weightData) {\n throw new Error('modelJSON has weightsManifest but weightData is null');\n }\n modelArtifacts.weightSpecs = weightSpecs;\n modelArtifacts.weightData = weightData;\n }\n if (modelJSON.signature != null) {\n modelArtifacts.signature = modelJSON.signature;\n }\n if (modelJSON.userDefinedMetadata != null) {\n modelArtifacts.userDefinedMetadata = modelJSON.userDefinedMetadata;\n }\n if (modelJSON.modelInitializer != null) {\n modelArtifacts.modelInitializer = modelJSON.modelInitializer;\n }\n return modelArtifacts;\n}\n/**\n * Create `ModelArtifacts` from a JSON file.\n *\n * @param modelJSON Object containing the parsed JSON of `model.json`\n * @param loadWeights Function that takes the JSON file's weights manifest,\n * reads weights from the listed path(s), and returns a Promise of the\n * weight manifest entries along with the weights data.\n * @returns A Promise of the `ModelArtifacts`, as described by the JSON file.\n */\nexport async function getModelArtifactsForJSON(modelJSON, loadWeights) {\n let weightSpecs;\n let weightData;\n if (modelJSON.weightsManifest != null) {\n [weightSpecs, weightData] = await loadWeights(modelJSON.weightsManifest);\n }\n return getModelArtifactsForJSONSync(modelJSON, weightSpecs, weightData);\n}\n/**\n * Populate ModelArtifactsInfo fields for a model with JSON topology.\n * @param modelArtifacts\n * @returns A ModelArtifactsInfo object.\n */\nexport function getModelArtifactsInfoForJSON(modelArtifacts) {\n if (modelArtifacts.modelTopology instanceof ArrayBuffer) {\n throw new Error('Expected JSON model topology, received ArrayBuffer.');\n }\n return {\n dateSaved: new Date(),\n modelTopologyType: 'JSON',\n modelTopologyBytes: modelArtifacts.modelTopology == null ?\n 0 :\n stringByteLength(JSON.stringify(modelArtifacts.modelTopology)),\n weightSpecsBytes: modelArtifacts.weightSpecs == null ?\n 0 :\n stringByteLength(JSON.stringify(modelArtifacts.weightSpecs)),\n weightDataBytes: modelArtifacts.weightData == null ?\n 0 :\n modelArtifacts.weightData.byteLength,\n };\n}\n/**\n * Concatenate the weights stored in a WeightsManifestConfig into a list of\n * WeightsManifestEntry\n *\n * @param weightsManifest The WeightsManifestConfig to extract weights from.\n * @returns A list of WeightsManifestEntry of the weights in the weightsManifest\n */\nexport function getWeightSpecs(weightsManifest) {\n const weightSpecs = [];\n for (const entry of weightsManifest) {\n weightSpecs.push(...entry.weights);\n }\n return weightSpecs;\n}\n/**\n * Computes mantisa table for casting Float16 to Float32\n * See http://www.fox-toolkit.org/ftp/fasthalffloatconversion.pdf\n *\n * @returns Uint32Array, 2048 mantissa lookup values.\n */\nfunction computeFloat16MantisaTable() {\n const convertMantissa = (i) => {\n let m = i << 13;\n let e = 0;\n while ((m & 0x00800000) === 0) {\n e -= 0x00800000;\n m <<= 1;\n }\n m &= ~0x00800000;\n e += 0x38800000;\n return m | e;\n };\n const mantisaTable = new Uint32Array(2048);\n mantisaTable[0] = 0;\n for (let i = 1; i < 1024; i++) {\n mantisaTable[i] = convertMantissa(i);\n }\n for (let i = 1024; i < 2048; i++) {\n mantisaTable[i] = 0x38000000 + ((i - 1024) << 13);\n }\n return mantisaTable;\n}\n/**\n * Computes exponent table for casting Float16 to Float32\n * See http://www.fox-toolkit.org/ftp/fasthalffloatconversion.pdf\n *\n * @returns Uint32Array, 64 exponent lookup values.\n */\nfunction computeFloat16ExponentTable() {\n const exponentTable = new Uint32Array(64);\n exponentTable[0] = 0;\n exponentTable[31] = 0x47800000;\n exponentTable[32] = 0x80000000;\n exponentTable[63] = 0xc7800000;\n for (let i = 1; i < 31; i++) {\n exponentTable[i] = i << 23;\n }\n for (let i = 33; i < 63; i++) {\n exponentTable[i] = 0x80000000 + ((i - 32) << 23);\n }\n return exponentTable;\n}\n/**\n * Computes offset table for casting Float16 to Float32\n * See http://www.fox-toolkit.org/ftp/fasthalffloatconversion.pdf\n *\n * @returns Uint32Array, 6d offset values.\n */\nfunction computeFloat16OffsetTable() {\n const offsetTable = new Uint32Array(64);\n for (let i = 0; i < 64; i++) {\n offsetTable[i] = 1024;\n }\n offsetTable[0] = offsetTable[32] = 0;\n return offsetTable;\n}\n/**\n * Retrieve a Float16 decoder which will decode a ByteArray of Float16 values\n * to a Float32Array.\n *\n * @returns Function (buffer: Uint16Array) => Float32Array which decodes\n * the Uint16Array of Float16 bytes to a Float32Array.\n */\nexport function getFloat16Decoder() {\n // Algorithm is based off of\n // http://www.fox-toolkit.org/ftp/fasthalffloatconversion.pdf\n // Cache lookup tables\n const mantisaTable = computeFloat16MantisaTable();\n const exponentTable = computeFloat16ExponentTable();\n const offsetTable = computeFloat16OffsetTable();\n return (quantizedArray) => {\n const buffer = new ArrayBuffer(4 * quantizedArray.length);\n const bufferUint32View = new Uint32Array(buffer);\n for (let index = 0; index < quantizedArray.length; index++) {\n const float16Bits = quantizedArray[index];\n const float32Bits = mantisaTable[offsetTable[float16Bits >> 10] + (float16Bits & 0x3ff)] +\n exponentTable[float16Bits >> 10];\n bufferUint32View[index] = float32Bits;\n }\n return new Float32Array(buffer);\n };\n}\n//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW9fdXRpbHMuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi8uLi90ZmpzLWNvcmUvc3JjL2lvL2lvX3V0aWxzLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBOzs7Ozs7Ozs7Ozs7Ozs7R0FlRztBQUVILE9BQU8sRUFBQyxPQUFPLEVBQUMsTUFBTSxnQkFBZ0IsQ0FBQztBQUN2QyxPQUFPLEVBQUMsTUFBTSxFQUFDLE1BQU0sZUFBZSxDQUFDO0FBR3JDLE9BQU8sRUFBQyxhQUFhLEVBQUMsTUFBTSxTQUFTLENBQUM7QUFFdEMsT0FBTyxFQUFDLG9CQUFvQixFQUEwRyxNQUFNLFNBQVMsQ0FBQztBQUV0Siw4RUFBOEU7QUFDOUUsTUFBTSx1QkFBdUIsR0FBRyxDQUFDLENBQUM7QUFFbEM7Ozs7Ozs7Ozs7Ozs7Ozs7R0FnQkc7QUFDSCxNQUFNLENBQUMsS0FBSyxVQUFVLGFBQWEsQ0FDL0IsT0FBcUMsRUFBRSxLQUFtQjtJQUU1RCw0Q0FBNEM7SUFDNUMsTUFBTSxLQUFLLEdBQTJCLEVBQUUsQ0FBQztJQUN6QyxNQUFNLFlBQVksR0FBK0IsRUFBRSxDQUFDO0lBRXBELE1BQU0sS0FBSyxHQUFhLEtBQUssQ0FBQyxPQUFPLENBQUMsT0FBTyxDQUFDLENBQUMsQ0FBQztRQUM1QyxPQUFPLENBQUMsR0FBRyxDQUFDLE1BQU0sQ0FBQyxFQUFFLENBQUMsTUFBTSxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUM7UUFDcEMsTUFBTSxDQUFDLElBQUksQ0FBQyxPQUFPLENBQUMsQ0FBQztJQUV6QixLQUFLLElBQUksQ0FBQyxHQUFHLENBQUMsRUFBRSxDQUFDLEdBQUcsS0FBSyxDQUFDLE1BQU0sRUFBRSxFQUFFLENBQUMsRUFBRTtRQUNyQyxNQUFNLElBQUksR0FBRyxLQUFLLENBQUMsQ0FBQyxDQUFDLENBQUM7UUFDdEIsTUFBTSxDQUFDLEdBQUcsS0FBSyxDQUFDLE9BQU8sQ0FBQyxPQUFPLENBQUMsQ0FBQyxDQUFDLENBQUMs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QUMsR0FBRyxXQUFXLENBQUM7U0FDdkM7UUFDRCxPQUFPLElBQUksWUFBWSxDQUFDLE1BQU0sQ0FBQyxDQUFDO0lBQ2xDLENBQUMsQ0FBQztBQUNKLENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyIvKipcbiAqIEBsaWNlbnNlXG4gKiBDb3B5cmlnaHQgMjAxOCBHb29nbGUgTExDLiBBbGwgUmlnaHRzIFJlc2VydmVkLlxuICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlIFwiTGljZW5zZVwiKTtcbiAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS5cbiAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdFxuICpcbiAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMFxuICpcbiAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmVcbiAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuIFwiQVMgSVNcIiBCQVNJUyxcbiAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLlxuICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZFxuICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuXG4gKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuICovXG5cbmltcG9ydCB7Y29tcGxleH0gZnJvbSAnLi4vb3BzL2NvbXBsZXgnO1xuaW1wb3J0IHt0ZW5zb3J9IGZyb20gJy4uL29wcy90ZW5zb3InO1xuaW1wb3J0IHtOYW1lZFRlbnNvciwgTmFtZWRUZW5zb3JNYXB9IGZyb20gJy4uL3RlbnNvcl90eXBlcyc7XG5pbXBvcnQge1R5cGVkQXJyYXl9IGZyb20gJy4uL3R5cGVzJztcbmltcG9ydCB7c2l6ZUZyb21TaGFwZX0gZnJvbSAnLi4vdXRpbCc7XG5cbmltcG9ydCB7RFRZUEVfVkFMVUVfU0laRV9NQVAsIE1vZGVsQXJ0aWZhY3RzLCBNb2RlbEFydGlmYWN0c0luZm8sIE1vZGVsSlNPTiwgV2VpZ2h0R3JvdXAsIFdlaWdodHNNYW5pZmVzdENvbmZpZywgV2VpZ2h0c01hbmlmZXN0RW50cnl9IGZyb20gJy4vdHlwZXMnO1xuXG4vKiogTnVtYmVyIG9mIGJ5dGVzIHJlc2VydmVkIGZvciB0aGUgbGVuZ3RoIG9mIHRoZSBzdHJpbmcuICgzMmJpdCBpbnRlZ2VyKS4gKi9cbmNvbnN0IE5VTV9CWVRFU19TVFJJTkdfTEVOR1RIID0gNDtcblxuLyoqXG4gKiBFbmNvZGUgYSBtYXAgZnJvbSBuYW1lcyB0byB3ZWlnaHQgdmFsdWVzIGFzIGFuIEFycmF5QnVmZmVyLCBhbG9uZyB3aXRoIGFuXG4gKiBgQXJyYXlgIG9mIGBXZWlnaHRzTWFuaWZlc3RFbnRyeWAgYXMgc3BlY2lmaWNhdGlvbiBvZiB0aGUgZW5jb2RlZCB3ZWlnaHRzLlxuICpcbiAqIFRoaXMgZnVuY3Rpb24gZG9lcyBub3QgcGVyZm9ybSBzaGFyZGluZy5cbiAqXG4gKiBUaGlzIGZ1bmN0aW9uIGlzIHRoZSByZXZlcnNlIG9mIGBkZWNvZGVXZWlnaHRzYC5cbiAqXG4gKiBAcGFyYW0gdGVuc29ycyBBIG1hcCAoXCJkaWN0XCIpIGZyb20gbmFtZXMgdG8gdGVuc29ycy5cbiAqIEBwYXJhbSBncm91cCBHcm91cCB0byB3aGljaCB0aGUgd2VpZ2h0cyBiZWxvbmcgKG9wdGlvbmFsKS5cbiAqIEByZXR1cm5zIEEgYFByb21pc2VgIG9mXG4gKiAgIC0gQSBmbGF0IGBBcnJheUJ1ZmZlcmAgd2l0aCBhbGwgdGhlIGJpbmFyeSB2YWx1ZXMgb2YgdGhlIGBUZW5zb3Jgc1xuICogICAgIGNvbmNhdGVuYXRlZC5cbiAqICAgLSBBbiBgQXJyYXlgIG9mIGBXZWlnaHRNYW5pZmVzdEVudHJ5YHMsIGNhcnJ5aW5nIGluZm9ybWF0aW9uIGluY2x1ZGluZ1xuICogICAgIHRlbnNvciBuYW1lcywgYGR0eXBlYHMgYW5kIHNoYXBlcy5cbiAqIEB0aHJvd3MgRXJyb3I6IG9uIHVuc3VwcG9ydGVkIHRlbnNvciBgZHR5cGVgLlxuICovXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gZW5jb2RlV2VpZ2h0cyhcbiAgICB0ZW5zb3JzOiBOYW1lZFRlbnNvck1hcHxOYW1lZFRlbnNvcltdLCBncm91cD86IFdlaWdodEdyb3VwKTpcbiAgICBQcm9taXNlPHtkYXRhOiBBcnJheUJ1ZmZlciwgc3BlY3M6IFdlaWdodHNNYW5pZmVzdEVudHJ5W119PiB7XG4gIC8vIFRPRE8oYWRhcm9iLCBjYWlzKTogU3VwcG9ydCBxdWFudGl6YXRpb24uXG4gIGNvbnN0IHNwZWNzOiBXZWlnaHRzTWFuaWZlc3RFbnRyeVtdID0gW107XG4gIGNvbnN0IGRhdGFQcm9taXNlczogQXJyYXk8UHJvbWlzZTxUeXBlZEFycmF5Pj4gPSBbXTtcblxuICBjb25zdCBuYW1lczogc3RyaW5nW10gPSBBcnJheS5pc0FycmF5KHRlbnNvcnMpID9cbiAgICAgIHRlbnNvcnMubWFwKHRlbnNvciA9PiB0ZW5zb3IubmFtZSkgOlxuICAgICAgT2JqZWN0LmtleXModGVuc29ycyk7XG5cbiAgZm9yIChsZXQgaSA9IDA7IGkgPCBuYW1lcy5sZW5ndGg7ICsraSkge1xuICAgIGNvbnN0IG5hbWUgPSBuYW1lc1tpXTtcbiAgICBjb25zdCB0ID0gQXJyYXkuaXNBcnJheSh0ZW5zb3JzKSA/IHRlbnNvcnNbaV0udGVuc29yIDogdGVuc29yc1tuYW1lXTtcbiAgICBpZiAodC5kdHlwZSAhPT0gJ2Zsb2F0MzInICYmIHQuZHR5cGUgIT09ICdpbnQzMicgJiYgdC5kdHlwZSAhPT0gJ2Jvb2wnICYmXG4gICAgICAgIHQuZHR5cGUgIT09ICdzdHJpbmcnICYmIHQuZHR5cGUgIT09ICdjb21wbGV4NjQnKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoYFVuc3VwcG9ydGVkIGR0eXBlIGluIHdlaWdodCAnJHtuYW1lfSc6ICR7dC5kdHlwZX1gKTtcbiAgICB9XG4gICAgY29uc3Qgc3BlYzogV2VpZ2h0c01hbmlmZXN0RW50cnkgPSB7bmFtZSwgc2hhcGU6IHQuc2hhcGUsIGR0eXBlOiB0LmR0eXBlfTtcbiAgICBpZiAodC5kdHlwZSA9PT0gJ3N0cmluZycpIHtcbiAgICAgIGNvbnN0IHV0ZjhieXRlcyA9IG5ldyBQcm9taXNlPFR5cGVkQXJyYXk+KGFzeW5jIHJlc29sdmUgPT4ge1xuICAgICAgICBjb25zdCB2YWxzID0gYXdhaXQgdC5ieXRlcygpIGFzIFVpbnQ4QXJyYXlbXTtcbiAgICAgICAgY29uc3QgdG90YWxOdW1CeXRlcyA9IHZhbHMucmVkdWNlKChwLCBjKSA9PiBwICsgYy5sZW5ndGgsIDApICtcbiAgICAgICAgICAgIE5VTV9CWVRFU19TVFJJTkdfTEVOR1RIICogdmFscy5sZW5ndGg7XG4gICAgICAgIGNvbnN0IGJ5dGVzID0gbmV3IFVpbnQ4QXJyYXkodG90YWxOdW1CeXRlcyk7XG4gICAgICAgIGxldCBvZmZzZXQgPSAwO1xuICAgICAgICBmb3IgKGxldCBpID0gMDsgaSA8IHZhbHMubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgICBjb25zdCB2YWwgPSB2YWxzW2ldO1xuICAgICAgICAgIGNvbnN0IGJ5dGVzT2ZMZW5ndGggPVxuICAgICAgICAgICAgICBuZXcgVWludDhBcnJheShuZXcgVWludDMyQXJyYXkoW3ZhbC5sZW5ndGhdKS5idWZmZXIpO1xuICAgICAgICAgIGJ5dGVzLnNldChieXRlc09mTGVuZ3RoLCBvZmZzZXQpO1xuICAgICAgICAgIG9mZnNldCArPSBOVU1fQllURVNfU1RSSU5HX0xFTkdUSDtcbiAgICAgICAgICBieXRlcy5zZXQodmFsLCBvZmZzZXQpO1xuICAgICAgICAgIG9mZnNldCArPSB2YWwubGVuZ3RoO1xuICAgICAgICB9XG4gICAgICAgIHJlc29sdmUoYnl0ZXMpO1xuICAgICAgfSk7XG4gICAgICBkYXRhUHJvbWlzZXMucHVzaCh1dGY4Ynl0ZXMpO1xuICAgIH0gZWxzZSB7XG4gICAgICBkYXRhUHJvbWlzZXMucHVzaCh0LmRhdGEoKSk7XG4gICAgfVxuICAgIGlmIChncm91cCAhPSBudWxsKSB7XG4gICAgICBzcGVjLmdyb3VwID0gZ3JvdXA7XG4gICAgfVxuICAgIHNwZWNzLnB1c2goc3BlYyk7XG4gIH1cblxuICBjb25zdCB0ZW5zb3JWYWx1ZXMgPSBhd2FpdCBQcm9taXNlLmFsbChkYXRhUHJvbWlzZXMpO1xuICByZXR1cm4ge2RhdGE6IGNvbmNhdGVuYXRlVHlwZWRBcnJheXModGVuc29yVmFsdWVzKSwgc3BlY3N9O1xufVxuXG4vKipcbiAqIERlY29kZSBmbGF0IEFycmF5QnVmZmVyIGFzIHdlaWdodHMuXG4gKlxuICogVGhpcyBmdW5jdGlvbiBkb2VzIG5vdCBoYW5kbGUgc2hhcmRpbmcuXG4gKlxuICogVGhpcyBmdW5jdGlvbiBpcyB0aGUgcmV2ZXJzZSBvZiBgZW5jb2RlV2VpZ2h0c2AuXG4gKlxuICogQHBhcmFtIGJ1ZmZlciBBIGZsYXQgQXJyYXlCdWZmZXIgY2FycnlpbmcgdGhlIGJpbmFyeSB2YWx1ZXMgb2YgdGhlIHRlbnNvcnNcbiAqICAgY29uY2F0ZW5hdGVkIGluIHRoZSBvcmRlciBzcGVjaWZpZWQgaW4gYHNwZWNzYC5cbiAqIEBwYXJhbSBzcGVjcyBTcGVjaWZpY2F0aW9ucyBvZiB0aGUgbmFtZXMsIGR0eXBlcyBhbmQgc2hhcGVzIG9mIHRoZSB0ZW5zb3JzXG4gKiAgIHdob3NlIHZhbHVlIGFyZSBlbmNvZGVkIGJ5IGBidWZmZXJgLlxuICogQHJldHVybiBBIG1hcCBmcm9tIHRlbnNvciBuYW1lIHRvIHRlbnNvciB2YWx1ZSwgd2l0aCB0aGUgbmFtZXMgY29ycmVzcG9uZGluZ1xuICogICB0byBuYW1lcyBpbiBgc3BlY3NgLlxuICogQHRocm93cyBFcnJvciwgaWYgYW55IG9mIHRoZSB0ZW5zb3JzIGhhcyB1bnN1cHBvcnRlZCBkdHlwZS5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGRlY29kZVdlaWdodHMoXG4gICAgYnVmZmVyOiBBcnJheUJ1ZmZlciwgc3BlY3M6IFdlaWdodHNNYW5pZmVzdEVudHJ5W10pOiBOYW1lZFRlbnNvck1hcCB7XG4gIC8vIFRPRE8oYWRhcm9iLCBjYWlzKTogU3VwcG9ydCBxdWFudGl6YXRpb24uXG4gIGNvbnN0IG91dDogTmFtZWRUZW5zb3JNYXAgPSB7fTtcbiAgbGV0IGZsb2F0MTZEZWNvZGU6IChidWZmZXI6IFVpbnQxNkFycmF5KSA9PiBGbG9hdDMyQXJyYXkgfCB1bmRlZmluZWQ7XG4gIGxldCBvZmZzZXQgPSAwO1xuICBmb3IgKGNvbnN0IHNwZWMgb2Ygc3BlY3MpIHtcbiAgICBjb25zdCBuYW1lID0gc3BlYy5uYW1lO1xuICAgIGNvbnN0IGR0eXBlID0gc3BlYy5kdHlwZTtcbiAgICBjb25zdCBzaGFwZSA9IHNwZWMuc2hhcGU7XG4gICAgY29uc3Qgc2l6ZSA9IHNpemVGcm9tU2hhcGUoc2hhcGUpO1xuICAgIGxldCB2YWx1ZXM6IFR5cGVkQXJyYXl8c3RyaW5nW118VWludDhBcnJheVtdO1xuXG4gICAgaWYgKCdxdWFudGl6YXRpb24nIGluIHNwZWMpIHtcbiAgICAgIGNvbnN0IHF1YW50aXphdGlvbiA9IHNwZWMucXVhbnRpemF0aW9uO1xuICAgICAgaWYgKHF1YW50aXphdGlvbi5kdHlwZSA9PT0gJ3VpbnQ4JyB8fCBxdWFudGl6YXRpb24uZHR5cGUgPT09ICd1aW50MTYnKSB7XG4gICAgICAgIGlmICghKCdtaW4nIGluIHF1YW50aXphdGlvbiAmJiAnc2NhbGUnIGluIHF1YW50aXphdGlvbikpIHtcbiAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoXG4gICAgICAgICAgICAgIGBXZWlnaHQgJHtzcGVjLm5hbWV9IHdpdGggcXVhbnRpemF0aW9uICR7cXVhbnRpemF0aW9uLmR0eXBlfSBgICtcbiAgICAgICAgICAgICAgYGRvZXNuJ3QgaGF2ZSBjb3JyZXNwb25kaW5nIG1ldGFkYXRhIG1pbiBhbmQgc2NhbGUuYCk7XG4gICAgICAgIH1cbiAgICAgIH0gZWxzZSBpZiAocXVhbnRpemF0aW9uLmR0eXBlID09PSAnZmxvYXQxNicpIHtcbiAgICAgICAgaWYgKGR0eXBlICE9PSAnZmxvYXQzMicpIHtcbiAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoXG4gICAgICAgICAgICAgIGBXZWlnaHQgJHtzcGVjLm5hbWV9IGlzIHF1YW50aXplZCB3aXRoICR7cXVhbnRpemF0aW9uLmR0eXBlfSBgICtcbiAgICAgICAgICAgICAgYHdoaWNoIG9ubHkgc3VwcG9ydHMgd2VpZ2h0cyBvZiB0eXBlIGZsb2F0MzIgbm90ICR7ZHR5cGV9LmApO1xuICAgICAgICB9XG4gICAgICB9IGVsc2Uge1xuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoXG4gICAgICAgICAgICBgV2VpZ2h0ICR7c3BlYy5uYW1lfSBoYXMgdW5rbm93biBgICtcbiAgICAgICAgICAgIGBxdWFudGl6YXRpb24gZHR5cGUgJHtxdWFudGl6YXRpb24uZHR5cGV9LiBgICtcbiAgICAgICAgICAgIGBTdXBwb3J0ZWQgcXVhbnRpemF0aW9uIGR0eXBlcyBhcmU6IGAgK1xuICAgICAgICAgICAgYCd1aW50OCcsICd1aW50MTYnLCBhbmQgJ2Zsb2F0MTYnLmApO1xuICAgICAgfVxuICAgICAgY29uc3QgcXVhbnRpemF0aW9uU2l6ZUZhY3RvciA9IERUWVBFX1ZBTFVFX1NJWkVfTUFQW3F1YW50aXphdGlvbi5kdHlwZV07XG4gICAgICBjb25zdCBieXRlQnVmZmVyID1cbiAgICAgICAgICBidWZmZXIuc2xpY2Uob2Zmc2V0LCBvZmZzZXQgKyBzaXplICogcXVhbnRpemF0aW9uU2l6ZUZhY3Rvcik7XG4gICAgICBjb25zdCBxdWFudGl6ZWRBcnJheSA9IChxdWFudGl6YXRpb24uZHR5cGUgPT09ICd1aW50OCcpID9cbiAgICAgICAgICBuZXcgVWludDhBcnJheShieXRlQnVmZmVyKSA6XG4gICAgICAgICAgbmV3IFVpbnQxNkFycmF5KGJ5dGVCdWZmZXIpO1xuICAgICAgaWYgKGR0eXBlID09PSAnZmxvYXQzMicpIHtcbiAgICAgICAgaWYgKHF1YW50aXphdGlvbi5kdHlwZSA9PT0gJ3VpbnQ4JyB8fCBxdWFudGl6YXRpb24uZHR5cGUgPT09ICd1aW50MTYnKSB7XG4gICAgICAgICAgdmFsdWVzID0gbmV3IEZsb2F0MzJBcnJheShxdWFudGl6ZWRBcnJheS5sZW5ndGgpO1xuICAgICAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgcXVhbnRpemVkQXJyYXkubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgICAgIGNvbnN0IHYgPSBxdWFudGl6ZWRBcnJheVtpXTtcbiAgICAgICAgICAgIHZhbHVlc1tpXSA9IHYgKiBxdWFudGl6YXRpb24uc2NhbGUgKyBxdWFudGl6YXRpb24ubWluO1xuICAgICAgICAgIH1cbiAgICAgICAgfSBlbHNlIGlmIChxdWFudGl6YXRpb24uZHR5cGUgPT09ICdmbG9hdDE2Jykge1xuICAgICAgICAgIGlmIChmbG9hdDE2RGVjb2RlID09PSB1bmRlZmluZWQpIHtcbiAgICAgICAgICAgIGZsb2F0MTZEZWNvZGUgPSBnZXRGbG9hdDE2RGVjb2RlcigpO1xuICAgICAgICAgIH1cbiAgICAgICAgICB2YWx1ZXMgPSBmbG9hdDE2RGVjb2RlKHF1YW50aXplZEFycmF5IGFzIFVpbnQxNkFycmF5KTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoXG4gICAgICAgICAgICAgIGBVbnN1cHBvcnRlZCBxdWFudGl6YXRpb24gdHlwZSAke3F1YW50aXphdGlvbi5kdHlwZX0gYCArXG4gICAgICAgICAgICAgIGBmb3Igd2VpZ2h0IHR5cGUgZmxvYXQzMi5gKTtcbiAgICAgICAgfVxuICAgICAgfSBlbHNlIGlmIChkdHlwZSA9PT0gJ2ludDMyJykge1xuICAgICAgICBpZiAocXVhbnRpemF0aW9uLmR0eXBlICE9PSAndWludDgnICYmIHF1YW50aXphdGlvbi5kdHlwZSAhPT0gJ3VpbnQxNicpIHtcbiAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoXG4gICAgICAgICAgICAgIGBVbnN1cHBvcnRlZCBxdWFudGl6YXRpb24gdHlwZSAke3F1YW50aXphdGlvbi5kdHlwZX0gYCArXG4gICAgICAgICAgICAgIGBmb3Igd2VpZ2h0IHR5cGUgaW50MzIuYCk7XG4gICAgICAgIH1cbiAgICAgICAgdmFsdWVzID0gbmV3IEludDMyQXJyYXkocXVhbnRpemVkQXJyYXkubGVuZ3RoKTtcbiAgICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCBxdWFudGl6ZWRBcnJheS5sZW5ndGg7IGkrKykge1xuICAgICAgICAgIGNvbnN0IHYgPSBxdWFudGl6ZWRBcnJheVtpXTtcbiAgICAgICAgICB2YWx1ZXNbaV0gPSBNYXRoLnJvdW5kKHYgKiBxdWFudGl6YXRpb24uc2NhbGUgKyBxdWFudGl6YXRpb24ubWluKTtcbiAgICAgICAgfVxuICAgICAgfSBlbHNlIHtcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKGBVbnN1cHBvcnRlZCBkdHlwZSBpbiB3ZWlnaHQgJyR7bmFtZX0nOiAke2R0eXBlfWApO1xuICAgICAgfVxuICAgICAgb2Zmc2V0ICs9IHNpemUgKiBxdWFudGl6YXRpb25TaXplRmFjdG9yO1xuICAgIH0gZWxzZSBpZiAoZHR5cGUgPT09ICdzdHJpbmcnKSB7XG4gICAgICBjb25zdCBzaXplID0gc2l6ZUZyb21TaGFwZShzcGVjLnNoYXBlKTtcbiAgICAgIHZhbHVlcyA9IFtdO1xuICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCBzaXplOyBpKyspIHtcbiAgICAgICAgY29uc3QgYnl0ZUxlbmd0aCA9IG5ldyBVaW50MzJBcnJheShcbiAgICAgICAgICAgIGJ1ZmZlci5zbGljZShvZmZzZXQsIG9mZnNldCArIE5VTV9CWVRFU19TVFJJTkdfTEVOR1RIKSlbMF07XG4gICAgICAgIG9mZnNldCArPSBOVU1fQllURVNfU1RSSU5HX0xFTkdUSDtcbiAgICAgICAgY29uc3QgYnl0ZXMgPSBuZXcgVWludDhBcnJheShidWZmZXIuc2xpY2Uob2Zmc2V0LCBvZmZzZXQgKyBieXRlTGVuZ3RoKSk7XG4gICAgICAgICh2YWx1ZXMgYXMgVWludDhBcnJheVtdKS5wdXNoKGJ5dGVzKTtcbiAgICAgICAgb2Zmc2V0ICs9IGJ5dGVMZW5ndGg7XG4gICAgICB9XG4gICAgfSBlbHNlIHtcbiAgICAgIGNvbnN0IGR0eXBlRmFjdG9yID0gRFRZUEVfVkFMVUVfU0laRV9NQVBbZHR5cGVdO1xuICAgICAgY29uc3QgYnl0ZUJ1ZmZlciA9IGJ1ZmZlci5zbGljZShvZmZzZXQsIG9mZnNldCArIHNpemUgKiBkdHlwZUZhY3Rvcik7XG5cbiAgICAgIGlmIChkdHlwZSA9PT0gJ2Zsb2F0MzInKSB7XG4gICAgICAgIHZhbHVlcyA9IG5ldyBGbG9hdDMyQXJyYXkoYnl0ZUJ1ZmZlcik7XG4gICAgICB9IGVsc2UgaWYgKGR0eXBlID09PSAnaW50MzInKSB7XG4gICAgICAgIHZhbHVlcyA9IG5ldyBJbnQzMkFycmF5KGJ5dGVCdWZmZXIpO1xuICAgICAgfSBlbHNlIGlmIChkdHlwZSA9PT0gJ2Jvb2wnKSB7XG4gICAgICAgIHZhbHVlcyA9IG5ldyBVaW50OEFycmF5KGJ5dGVCdWZmZXIpO1xuICAgICAgfSBlbHNlIGlmIChkdHlwZSA9PT0gJ2NvbXBsZXg2NCcpIHtcbiAgICAgICAgdmFsdWVzID0gbmV3IEZsb2F0MzJBcnJheShieXRlQnVmZmVyKTtcbiAgICAgICAgY29uc3QgcmVhbCA9IG5ldyBGbG9hdDMyQXJyYXkodmFsdWVzLmxlbmd0aCAvIDIpO1xuICAgICAgICBjb25zdCBpbWFnZSA9IG5ldyBGbG9hdDMyQXJyYXkodmFsdWVzLmxlbmd0aCAvIDIpO1xuICAgICAgICBmb3IgKGxldCBpID0gMDsgaSA8IHJlYWwubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgICByZWFsW2ldID0gdmFsdWVzW2kgKiAyXTtcbiAgICAgICAgICBpbWFnZVtpXSA9IHZhbHVlc1tpICogMiArIDFdO1xuICAgICAgICB9XG4gICAgICAgIGNvbnN0IHJlYWxUZW5zb3IgPSB0ZW5zb3IocmVhbCwgc2hhcGUsICdmbG9hdDMyJyk7XG4gICAgICAgIGNvbnN0IGltYWdlVGVuc29yID0gdGVuc29yKGltYWdlLCBzaGFwZSwgJ2Zsb2F0MzInKTtcbiAgICAgICAgb3V0W25hbWVdID0gY29tcGxleChyZWFsVGVuc29yLCBpbWFnZVRlbnNvcik7XG4gICAgICAgIHJlYWxUZW5zb3IuZGlzcG9zZSgpO1xuICAgICAgICBpbWFnZVRlbnNvci5kaXNwb3NlKCk7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoYFVuc3VwcG9ydGVkIGR0eXBlIGluIHdlaWdodCAnJHtuYW1lfSc6ICR7ZHR5cGV9YCk7XG4gICAgICB9XG4gICAgICBvZmZzZXQgKz0gc2l6ZSAqIGR0eXBlRmFjdG9yO1xuICAgIH1cbiAgICBpZiAoZHR5cGUgIT09ICdjb21wbGV4NjQnKSB7XG4gICAgICBvdXRbbmFtZV0gPSB0ZW5zb3IodmFsdWVzLCBzaGFwZSwgZHR5cGUpO1xuICAgIH1cbiAgfVxuICByZXR1cm4gb3V0O1xufVxuXG4vKipcbiAqIENvbmNhdGVuYXRlIFR5cGVkQXJyYXlzIGludG8gYW4gQXJyYXlCdWZmZXIuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBjb25jYXRlbmF0ZVR5cGVkQXJyYXlzKHhzOiBUeXBlZEFycmF5W10pOiBBcnJheUJ1ZmZlciB7XG4gIC8vIFRPRE8oYWRhcm9iLCBjYWlzKTogU3VwcG9ydCBxdWFudGl6YXRpb24uXG4gIGlmICh4cyA9PT0gbnVsbCkge1xuICAgIHRocm93IG5ldyBFcnJvcihgSW52YWxpZCBpbnB1dCB2YWx1ZTogJHtKU09OLnN0cmluZ2lmeSh4cyl9YCk7XG4gIH1cblxuICBsZXQgdG90YWxCeXRlTGVuZ3RoID0gMDtcblxuICAvLyBgbm9ybWFsaXplZFhzYCBpcyBoZXJlIGZvciB0aGlzIHJlYXNvbjogYSBgVHlwZWRBcnJheWAncyBgYnVmZmVyJ1xuICAvLyBjYW4gaGF2ZSBhIGRpZmZlcmVudCBieXRlIGxlbmd0aCBmcm9tIHRoYXQgb2YgdGhlIGBUeXBlZEFycmF5YCBpdHNlbGYsXG4gIC8vIGZvciBleGFtcGxlLCB3aGVuIHRoZSBgVHlwZWRBcnJheWAgaXMgY3JlYXRlZCBmcm9tIGFuIG9mZnNldCBpbiBhblxuICAvLyBgQXJyYXlCdWZmZXJgLiBgbm9ybWxpYXplZFhzYCBob2xkcyBgVHlwZWRBcnJheWBzIHdob3NlIGBidWZmZXJgcyBtYXRjaFxuICAvLyB0aGUgYFR5cGVkQXJyYXlgIGluIGJ5dGUgbGVuZ3RoLiBJZiBhbiBlbGVtZW50IG9mIGB4c2AgZG9lcyBub3Qgc2hvd1xuICAvLyB0aGlzIHByb3BlcnR5LCBhIG5ldyBgVHlwZWRBcnJheWAgdGhhdCBzYXRpc2Z5IHRoaXMgcHJvcGVydHkgd2lsbCBiZVxuICAvLyBjb25zdHJ1Y3RlZCBhbmQgcHVzaGVkIGludG8gYG5vcm1hbGl6ZWRYc2AuXG4gIGNvbnN0IG5vcm1hbGl6ZWRYczogVHlwZWRBcnJheVtdID0gW107XG4gIHhzLmZvckVhY2goKHg6IFR5cGVkQXJyYXkpID0+IHtcbiAgICB0b3RhbEJ5dGVMZW5ndGggKz0geC5ieXRlTGVuZ3RoO1xuICAgIC8vIHRzbGludDpkaXNhYmxlOm5vLWFueVxuICAgIG5vcm1hbGl6ZWRYcy5wdXNoKFxuICAgICAgICB4LmJ5dGVMZW5ndGggPT09IHguYnVmZmVyLmJ5dGVMZW5ndGggPyB4IDpcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbmV3ICh4LmNvbnN0cnVjdG9yIGFzIGFueSkoeCkpO1xuICAgIGlmICghKHggYXMgYW55IGluc3RhbmNlb2YgRmxvYXQzMkFycmF5IHx8IHggYXMgYW55IGluc3RhbmNlb2YgSW50MzJBcnJheSB8fFxuICAgICAgICAgIHggYXMgYW55IGluc3RhbmNlb2YgVWludDhBcnJheSkpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcihgVW5zdXBwb3J0ZWQgVHlwZWRBcnJheSBzdWJ0eXBlOiAke3guY29uc3RydWN0b3IubmFtZX1gKTtcbiAgICB9XG4gICAgLy8gdHNsaW50OmVuYWJsZTpuby1hbnlcbiAgfSk7XG5cbiAgY29uc3QgeSA9IG5ldyBVaW50OEFycmF5KHRvdGFsQnl0ZUxlbmd0aCk7XG4gIGxldCBvZmZzZXQgPSAwO1xuICBub3JtYWxpemVkWHMuZm9yRWFjaCgoeDogVHlwZWRBcnJheSkgPT4ge1xuICAgIHkuc2V0KG5ldyBVaW50OEFycmF5KHguYnVmZmVyKSwgb2Zmc2V0KTtcbiAgICBvZmZzZXQgKz0geC5ieXRlTGVuZ3RoO1xuICB9KTtcblxuICByZXR1cm4geS5idWZmZXI7XG59XG5cbi8vIFVzZSBCdWZmZXIgb24gTm9kZS5qcyBpbnN0ZWFkIG9mIEJsb2IvYXRvYi9idG9hXG5jb25zdCB1c2VOb2RlQnVmZmVyID0gdHlwZW9mIEJ1ZmZlciAhPT0gJ3VuZGVmaW5lZCcgJiZcbiAgICAodHlwZW9mIEJsb2IgPT09ICd1bmRlZmluZWQnIHx8IHR5cGVvZiBhdG9iID09PSAndW5kZWZpbmVkJyB8fFxuICAgICB0eXBlb2YgYnRvYSA9PT0gJ3VuZGVmaW5lZCcpO1xuXG4vKipcbiAqIENhbGN1bGF0ZSB0aGUgYnl0ZSBsZW5ndGggb2YgYSBKYXZhU2NyaXB0IHN0cmluZy5cbiAqXG4gKiBOb3RlIHRoYXQgYSBKYXZhU2NyaXB0IHN0cmluZyBjYW4gY29udGFpbiB3aWRlIGNoYXJhY3RlcnMsIHRoZXJlZm9yZSB0aGVcbiAqIGxlbmd0aCBvZiB0aGUgc3RyaW5nIGlzIG5vdCBuZWNlc3NhcmlseSBlcXVhbCB0byB0aGUgYnl0ZSBsZW5ndGguXG4gKlxuICogQHBhcmFtIHN0ciBJbnB1dCBzdHJpbmcuXG4gKiBAcmV0dXJucyBCeXRlIGxlbmd0aC5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHN0cmluZ0J5dGVMZW5ndGgoc3RyOiBzdHJpbmcpOiBudW1iZXIge1xuICBpZiAodXNlTm9kZUJ1ZmZlcikge1xuICAgIHJldHVybiBCdWZmZXIuYnl0ZUxlbmd0aChzdHIpO1xuICB9XG4gIHJldHVybiBuZXcgQmxvYihbc3RyXSkuc2l6ZTtcbn1cblxuLyoqXG4gKiBFbmNvZGUgYW4gQXJyYXlCdWZmZXIgYXMgYSBiYXNlNjQgZW5jb2RlZCBzdHJpbmcuXG4gKlxuICogQHBhcmFtIGJ1ZmZlciBgQXJyYXlCdWZmZXJgIHRvIGJlIGNvbnZlcnRlZC5cbiAqIEByZXR1cm5zIEEgc3RyaW5nIHRoYXQgYmFzZTY0LWVuY29kZXMgYGJ1ZmZlcmAuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBhcnJheUJ1ZmZlclRvQmFzZTY0U3RyaW5nKGJ1ZmZlcjogQXJyYXlCdWZmZXIpOiBzdHJpbmcge1xuICBpZiAodXNlTm9kZUJ1ZmZlcikge1xuICAgIHJldHVybiBCdWZmZXIuZnJvbShidWZmZXIpLnRvU3RyaW5nKCdiYXNlNjQnKTtcbiAgfVxuICBjb25zdCBidWYgPSBuZXcgVWludDhBcnJheShidWZmZXIpO1xuICBsZXQgcyA9ICcnO1xuICBmb3IgKGxldCBpID0gMCwgbCA9IGJ1Zi5sZW5ndGg7IGkgPCBsOyBpKyspIHtcbiAgICBzICs9IFN0cmluZy5mcm9tQ2hhckNvZGUoYnVmW2ldKTtcbiAgfVxuICByZXR1cm4gYnRvYShzKTtcbn1cblxuLyoqXG4gKiBEZWNvZGUgYSBiYXNlNjQgc3RyaW5nIGFzIGFuIEFycmF5QnVmZmVyLlxuICpcbiAqIEBwYXJhbSBzdHIgQmFzZTY0IHN0cmluZy5cbiAqIEByZXR1cm5zIERlY29kZWQgYEFycmF5QnVmZmVyYC5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGJhc2U2NFN0cmluZ1RvQXJyYXlCdWZmZXIoc3RyOiBzdHJpbmcpOiBBcnJheUJ1ZmZlciB7XG4gIGlmICh1c2VOb2RlQnVmZmVyKSB7XG4gICAgY29uc3QgYnVmID0gQnVmZmVyLmZyb20oc3RyLCAnYmFzZTY0Jyk7XG4gICAgcmV0dXJuIGJ1Zi5idWZmZXIuc2xpY2UoYnVmLmJ5dGVPZmZzZXQsIGJ1Zi5ieXRlT2Zmc2V0ICsgYnVmLmJ5dGVMZW5ndGgpO1xuICB9XG4gIGNvbnN0IHMgPSBhdG9iKHN0cik7XG4gIGNvbnN0IGJ1ZmZlciA9IG5ldyBVaW50OEFycmF5KHMubGVuZ3RoKTtcbiAgZm9yIChsZXQgaSA9IDA7IGkgPCBzLmxlbmd0aDsgKytpKSB7XG4gICAgYnVmZmVyLnNldChbcy5jaGFyQ29kZUF0KGkpXSwgaSk7XG4gIH1cbiAgcmV0dXJuIGJ1ZmZlci5idWZmZXI7XG59XG5cbi8qKlxuICogQ29uY2F0ZW5hdGUgYSBudW1iZXIgb2YgQXJyYXlCdWZmZXJzIGludG8gb25lLlxuICpcbiAqIEBwYXJhbSBidWZmZXJzIEEgbnVtYmVyIG9mIGFycmF5IGJ1ZmZlcnMgdG8gY29uY2F0ZW5hdGUuXG4gKiBAcmV0dXJucyBSZXN1bHQgb2YgY29uY2F0ZW5hdGluZyBgYnVmZmVyc2AgaW4gb3JkZXIuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBjb25jYXRlbmF0ZUFycmF5QnVmZmVycyhidWZmZXJzOiBBcnJheUJ1ZmZlcltdKTogQXJyYXlCdWZmZXIge1xuICBpZiAoYnVmZmVycy5sZW5ndGggPT09IDEpIHtcbiAgICByZXR1cm4gYnVmZmVyc1swXTtcbiAgfVxuXG4gIGxldCB0b3RhbEJ5dGVMZW5ndGggPSAwO1xuICBidWZmZXJzLmZvckVhY2goKGJ1ZmZlcjogQXJyYXlCdWZmZXIpID0+IHtcbiAgICB0b3RhbEJ5dGVMZW5ndGggKz0gYnVmZmVyLmJ5dGVMZW5ndGg7XG4gIH0pO1xuXG4gIGNvbnN0IHRlbXAgPSBuZXcgVWludDhBcnJheSh0b3RhbEJ5dGVMZW5ndGgpO1xuICBsZXQgb2Zmc2V0ID0gMDtcbiAgYnVmZmVycy5mb3JFYWNoKChidWZmZXI6IEFycmF5QnVmZmVyKSA9PiB7XG4gICAgdGVtcC5zZXQobmV3IFVpbnQ4QXJyYXkoYnVmZmVyKSwgb2Zmc2V0KTtcbiAgICBvZmZzZXQgKz0gYnVmZmVyLmJ5dGVMZW5ndGg7XG4gIH0pO1xuICByZXR1cm4gdGVtcC5idWZmZXI7XG59XG5cbi8qKlxuICogR2V0IHRoZSBiYXNlbmFtZSBvZiBhIHBhdGguXG4gKlxuICogQmVoYXZlcyBpbiBhIHdheSBhbmFsb2dvdXMgdG8gTGludXgncyBiYXNlbmFtZSBjb21tYW5kLlxuICpcbiAqIEBwYXJhbSBwYXRoXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBiYXNlbmFtZShwYXRoOiBzdHJpbmcpOiBzdHJpbmcge1xuICBjb25zdCBTRVBBUkFUT1IgPSAnLyc7XG4gIHBhdGggPSBwYXRoLnRyaW0oKTtcbiAgd2hpbGUgKHBhdGguZW5kc1dpdGgoU0VQQVJBVE9SKSkge1xuICAgIHBhdGggPSBwYXRoLnNsaWNlKDAsIHBhdGgubGVuZ3RoIC0gMSk7XG4gIH1cbiAgY29uc3QgaXRlbXMgPSBwYXRoLnNwbGl0KFNFUEFSQVRPUik7XG4gIHJldHVybiBpdGVtc1tpdGVtcy5sZW5ndGggLSAxXTtcbn1cblxuLyoqXG4gKiBDcmVhdGUgYE1vZGVsSlNPTmAgZnJvbSBgTW9kZWxBcnRpZmFjdHNgLlxuICpcbiAqIEBwYXJhbSBhcnRpZmFjdHMgTW9kZWwgYXJ0aWZhY3RzLCBkZXNjcmliaW5nIHRoZSBtb2RlbCBhbmQgaXRzIHdlaWdodHMuXG4gKiBAcGFyYW0gbWFuaWZlc3QgV2VpZ2h0IG1hbmlmZXN0LCBkZXNjcmliaW5nIHdoZXJlIHRoZSB3ZWlnaHRzIG9mIHRoZVxuICogICAgIGBNb2RlbEFydGlmYWN0c2AgYXJlIHN0b3JlZCwgYW5kIHNvbWUgbWV0YWRhdGEgYWJvdXQgdGhlbS5cbiAqIEByZXR1cm5zIE9iamVjdCByZXByZXNlbnRpbmcgdGhlIGBtb2RlbC5qc29uYCBmaWxlIGRlc2NyaWJpbmcgdGhlIG1vZGVsXG4gKiAgICAgYXJ0aWZhY3RzIGFuZCB3ZWlnaHRzXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBnZXRNb2RlbEpTT05Gb3JNb2RlbEFydGlmYWN0cyhcbiAgICBhcnRpZmFjdHM6IE1vZGVsQXJ0aWZhY3RzLCBtYW5pZmVzdDogV2VpZ2h0c01hbmlmZXN0Q29uZmlnKTogTW9kZWxKU09OIHtcbiAgY29uc3QgcmVzdWx0OiBNb2RlbEpTT04gPSB7XG4gICAgbW9kZWxUb3BvbG9neTogYXJ0aWZhY3RzLm1vZGVsVG9wb2xvZ3ksXG4gICAgZm9ybWF0OiBhcnRpZmFjdHMuZm9ybWF0LFxuICAgIGdlbmVyYXRlZEJ5OiBhcnRpZmFjdHMuZ2VuZXJhdGVkQnksXG4gICAgY29udmVydGVkQnk6IGFydGlmYWN0cy5jb252ZXJ0ZWRCeSxcbiAgICB3ZWlnaHRzTWFuaWZlc3Q6IG1hbmlmZXN0XG4gIH07XG4gIGlmIChhcnRpZmFjdHMuc2lnbmF0dXJlICE9IG51bGwpIHtcbiAgICByZXN1bHQuc2lnbmF0dXJlID0gYXJ0aWZhY3RzLnNpZ25hdHVyZTtcbiAgfVxuICBpZiAoYXJ0aWZhY3RzLnVzZXJEZWZpbmVkTWV0YWRhdGEgIT0gbnVsbCkge1xuICAgIHJlc3VsdC51c2VyRGVmaW5lZE1ldGFkYXRhID0gYXJ0aWZhY3RzLnVzZXJEZWZpbmVkTWV0YWRhdGE7XG4gIH1cbiAgaWYgKGFydGlmYWN0cy5tb2RlbEluaXRpYWxpemVyICE9IG51bGwpIHtcbiAgICByZXN1bHQubW9kZWxJbml0aWFsaXplciA9IGFydGlmYWN0cy5tb2RlbEluaXRpYWxpemVyO1xuICB9XG4gIGlmIChhcnRpZmFjdHMudHJhaW5pbmdDb25maWcgIT0gbnVsbCkge1xuICAgIHJlc3VsdC50cmFpbmluZ0NvbmZpZyA9IGFydGlmYWN0cy50cmFpbmluZ0NvbmZpZztcbiAgfVxuICByZXR1cm4gcmVzdWx0O1xufVxuXG4vKipcbiAqIENyZWF0ZSBgTW9kZWxBcnRpZmFjdHNgIGZyb20gYSBKU09OIGZpbGUgYW5kIHdlaWdodHMuXG4gKlxuICogQHBhcmFtIG1vZGVsSlNPTiBPYmplY3QgY29udGFpbmluZyB0aGUgcGFyc2VkIEpTT04gb2YgYG1vZGVsLmpzb25gXG4gKiBAcGFyYW0gd2VpZ2h0U3BlY3MgVGhlIGxpc3Qgb2YgV2VpZ2h0c01hbmlmZXN0RW50cnkgZm9yIHRoZSBtb2RlbC4gTXVzdCBiZVxuICogICAgIHBhc3NlZCBpZiB0aGUgbW9kZWxKU09OIGhhcyBhIHdlaWdodHNNYW5pZmVzdC5cbiAqIEBwYXJhbSB3ZWlnaHREYXRhIEFuIEFycmF5QnVmZmVyIG9mIHdlaWdodCBkYXRhIGZvciB0aGUgbW9kZWwgY29ycmVzcG9uZGluZ1xuICogICAgIHRvIHRoZSB3ZWlnaHRzIGluIHdlaWdodFNwZWNzLiBNdXN0IGJlIHBhc3NlZCBpZiB0aGUgbW9kZWxKU09OIGhhcyBhXG4gKiAgICAgd2VpZ2h0c01hbmlmZXN0LlxuICogQHJldHVybnMgQSBQcm9taXNlIG9mIHRoZSBgTW9kZWxBcnRpZmFjdHNgLCBhcyBkZXNjcmliZWQgYnkgdGhlIEpTT04gZmlsZS5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGdldE1vZGVsQXJ0aWZhY3RzRm9ySlNPTlN5bmMoXG4gICAgbW9kZWxKU09OOiBNb2RlbEpTT04sIHdlaWdodFNwZWNzPzogV2VpZ2h0c01hbmlmZXN0RW50cnlbXSxcbiAgICB3ZWlnaHREYXRhPzogQXJyYXlCdWZmZXIpOiBNb2RlbEFydGlmYWN0cyB7XG5cbiAgY29uc3QgbW9kZWxBcnRpZmFjdHM6IE1vZGVsQXJ0aWZhY3RzID0ge1xuICAgIG1vZGVsVG9wb2xvZ3k6IG1vZGVsSlNPTi5tb2RlbFRvcG9sb2d5LFxuICAgIGZvcm1hdDogbW9kZWxKU09OLmZvcm1hdCxcbiAgICBnZW5lcmF0ZWRCeTogbW9kZWxKU09OLmdlbmVyYXRlZEJ5LFxuICAgIGNvbnZlcnRlZEJ5OiBtb2RlbEpTT04uY29udmVydGVkQnlcbiAgfTtcblxuICBpZiAobW9kZWxKU09OLnRyYWluaW5nQ29uZmlnICE9IG51bGwpIHtcbiAgICBtb2RlbEFydGlmYWN0cy50cmFpbmluZ0NvbmZpZyA9IG1vZGVsSlNPTi50cmFpbmluZ0NvbmZpZztcbiAgfVxuICBpZiAobW9kZWxKU09OLndlaWdodHNNYW5pZmVzdCAhPSBudWxsKSB7XG4gICAgaWYgKCF3ZWlnaHRTcGVjcykge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKCdtb2RlbEpTT04gaGFzIHdlaWdodHNNYW5pZmVzdCBidXQgd2VpZ2h0U3BlY3MgaXMgbnVsbCcpO1xuICAgIH1cbiAgICBpZiAoIXdlaWdodERhdGEpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcignbW9kZWxKU09OIGhhcyB3ZWlnaHRzTWFuaWZlc3QgYnV0IHdlaWdodERhdGEgaXMgbnVsbCcpO1xuICAgIH1cbiAgICBtb2RlbEFydGlmYWN0cy53ZWlnaHRTcGVjcyA9IHdlaWdodFNwZWNzO1xuICAgIG1vZGVsQXJ0aWZhY3RzLndlaWdodERhdGEgPSB3ZWlnaHREYXRhO1xuICB9XG4gIGlmIChtb2RlbEpTT04uc2lnbmF0dXJlICE9IG51bGwpIHtcbiAgICBtb2RlbEFydGlmYWN0cy5zaWduYXR1cmUgPSBtb2RlbEpTT04uc2lnbmF0dXJlO1xuICB9XG4gIGlmIChtb2RlbEpTT04udXNlckRlZmluZWRNZXRhZGF0YSAhPSBudWxsKSB7XG4gICAgbW9kZWxBcnRpZmFjdHMudXNlckRlZmluZWRNZXRhZGF0YSA9IG1vZGVsSlNPTi51c2VyRGVmaW5lZE1ldGFkYXRhO1xuICB9XG4gIGlmIChtb2RlbEpTT04ubW9kZWxJbml0aWFsaXplciAhPSBudWxsKSB7XG4gICAgbW9kZWxBcnRpZmFjdHMubW9kZWxJbml0aWFsaXplciA9IG1vZGVsSlNPTi5tb2RlbEluaXRpYWxpemVyO1xuICB9XG5cbiAgcmV0dXJuIG1vZGVsQXJ0aWZhY3RzO1xufVxuXG4vKipcbiAqIENyZWF0ZSBgTW9kZWxBcnRpZmFjdHNgIGZyb20gYSBKU09OIGZpbGUuXG4gKlxuICogQHBhcmFtIG1vZGVsSlNPTiBPYmplY3QgY29udGFpbmluZyB0aGUgcGFyc2VkIEpTT04gb2YgYG1vZGVsLmpzb25gXG4gKiBAcGFyYW0gbG9hZFdlaWdodHMgRnVuY3Rpb24gdGhhdCB0YWtlcyB0aGUgSlNPTiBmaWxlJ3Mgd2VpZ2h0cyBtYW5pZmVzdCxcbiAqICAgICByZWFkcyB3ZWlnaHRzIGZyb20gdGhlIGxpc3RlZCBwYXRoKHMpLCBhbmQgcmV0dXJucyBhIFByb21pc2Ugb2YgdGhlXG4gKiAgICAgd2VpZ2h0IG1hbmlmZXN0IGVudHJpZXMgYWxvbmcgd2l0aCB0aGUgd2VpZ2h0cyBkYXRhLlxuICogQHJldHVybnMgQSBQcm9taXNlIG9mIHRoZSBgTW9kZWxBcnRpZmFjdHNgLCBhcyBkZXNjcmliZWQgYnkgdGhlIEpTT04gZmlsZS5cbiAqL1xuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIGdldE1vZGVsQXJ0aWZhY3RzRm9ySlNPTihcbiAgICBtb2RlbEpTT046IE1vZGVsSlNPTixcbiAgICBsb2FkV2VpZ2h0czogKHdlaWdodHNNYW5pZmVzdDogV2VpZ2h0c01hbmlmZXN0Q29uZmlnKSA9PiBQcm9taXNlPFtcbiAgICAgIC8qIHdlaWdodFNwZWNzICovIFdlaWdodHNNYW5pZmVzdEVudHJ5W10sIC8qIHdlaWdodERhdGEgKi8gQXJyYXlCdWZmZXJcbiAgICBdPik6IFByb21pc2U8TW9kZWxBcnRpZmFjdHM+IHtcbiAgbGV0IHdlaWdodFNwZWNzOiBXZWlnaHRzTWFuaWZlc3RFbnRyeVtdIHwgdW5kZWZpbmVkO1xuICBsZXQgd2VpZ2h0RGF0YTogQXJyYXlCdWZmZXIgfCB1bmRlZmluZWQ7XG5cbiAgaWYgKG1vZGVsSlNPTi53ZWlnaHRzTWFuaWZlc3QgIT0gbnVsbCkge1xuICAgIFt3ZWlnaHRTcGVjcywgd2VpZ2h0RGF0YV0gPSBhd2FpdCBsb2FkV2VpZ2h0cyhtb2RlbEpTT04ud2VpZ2h0c01hbmlmZXN0KTtcbiAgfVxuXG4gIHJldHVybiBnZXRNb2RlbEFydGlmYWN0c0ZvckpTT05TeW5jKG1vZGVsSlNPTiwgd2VpZ2h0U3BlY3MsIHdlaWdodERhdGEpO1xufVxuXG4vKipcbiAqIFBvcHVsYXRlIE1vZGVsQXJ0aWZhY3RzSW5mbyBmaWVsZHMgZm9yIGEgbW9kZWwgd2l0aCBKU09OIHRvcG9sb2d5LlxuICogQHBhcmFtIG1vZGVsQXJ0aWZhY3RzXG4gKiBAcmV0dXJucyBBIE1vZGVsQXJ0aWZhY3RzSW5mbyBvYmplY3QuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBnZXRNb2RlbEFydGlmYWN0c0luZm9Gb3JKU09OKG1vZGVsQXJ0aWZhY3RzOiBNb2RlbEFydGlmYWN0cyk6XG4gICAgTW9kZWxBcnRpZmFjdHNJbmZvIHtcbiAgaWYgKG1vZGVsQXJ0aWZhY3RzLm1vZGVsVG9wb2xvZ3kgaW5zdGFuY2VvZiBBcnJheUJ1ZmZlcikge1xuICAgIHRocm93IG5ldyBFcnJvcignRXhwZWN0ZWQgSlNPTiBtb2RlbCB0b3BvbG9neSwgcmVjZWl2ZWQgQXJyYXlCdWZmZXIuJyk7XG4gIH1cblxuICByZXR1cm4ge1xuICAgIGRhdGVTYXZlZDogbmV3IERhdGUoKSxcbiAgICBtb2RlbFRvcG9sb2d5VHlwZTogJ0pTT04nLFxuICAgIG1vZGVsVG9wb2xvZ3lCeXRlczogbW9kZWxBcnRpZmFjdHMubW9kZWxUb3BvbG9neSA9PSBudWxsID9cbiAgICAgICAgMCA6XG4gICAgICAgIHN0cmluZ0J5dGVMZW5ndGgoSlNPTi5zdHJpbmdpZnkobW9kZWxBcnRpZmFjdHMubW9kZWxUb3BvbG9neSkpLFxuICAgIHdlaWdodFNwZWNzQnl0ZXM6IG1vZGVsQXJ0aWZhY3RzLndlaWdodFNwZWNzID09IG51bGwgP1xuICAgICAgICAwIDpcbiAgICAgICAgc3RyaW5nQnl0ZUxlbmd0aChKU09OLnN0cmluZ2lmeShtb2RlbEFydGlmYWN0cy53ZWlnaHRTcGVjcykpLFxuICAgIHdlaWdodERhdGFCeXRlczogbW9kZWxBcnRpZmFjdHMud2VpZ2h0RGF0YSA9PSBudWxsID9cbiAgICAgICAgMCA6XG4gICAgICAgIG1vZGVsQXJ0aWZhY3RzLndlaWdodERhdGEuYnl0ZUxlbmd0aCxcbiAgfTtcbn1cblxuLyoqXG4gKiBDb25jYXRlbmF0ZSB0aGUgd2VpZ2h0cyBzdG9yZWQgaW4gYSBXZWlnaHRzTWFuaWZlc3RDb25maWcgaW50byBhIGxpc3Qgb2ZcbiAqIFdlaWdodHNNYW5pZmVzdEVudHJ5XG4gKlxuICogQHBhcmFtIHdlaWdodHNNYW5pZmVzdCBUaGUgV2VpZ2h0c01hbmlmZXN0Q29uZmlnIHRvIGV4dHJhY3Qgd2VpZ2h0cyBmcm9tLlxuICogQHJldHVybnMgQSBsaXN0IG9mIFdlaWdodHNNYW5pZmVzdEVudHJ5IG9mIHRoZSB3ZWlnaHRzIGluIHRoZSB3ZWlnaHRzTWFuaWZlc3RcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGdldFdlaWdodFNwZWNzKHdlaWdodHNNYW5pZmVzdDogV2VpZ2h0c01hbmlmZXN0Q29uZmlnKTpcbiAgICBXZWlnaHRzTWFuaWZlc3RFbnRyeVtdIHtcbiAgY29uc3Qgd2VpZ2h0U3BlY3M6IFdlaWdodHNNYW5pZmVzdEVudHJ5W10gPSBbXTtcbiAgZm9yIChjb25zdCBlbnRyeSBvZiB3ZWlnaHRzTWFuaWZlc3QpIHtcbiAgICB3ZWlnaHRTcGVjcy5wdXNoKC4uLmVudHJ5LndlaWdodHMpO1xuICB9XG4gIHJldHVybiB3ZWlnaHRTcGVjcztcbn1cblxuLyoqXG4gKiBDb21wdXRlcyBtYW50aXNhIHRhYmxlIGZvciBjYXN0aW5nIEZsb2F0MTYgdG8gRmxvYXQzMlxuICogU2VlIGh0dHA6Ly93d3cuZm94LXRvb2xraXQub3JnL2Z0cC9mYXN0aGFsZmZsb2F0Y29udmVyc2lvbi5wZGZcbiAqXG4gKiBAcmV0dXJucyBVaW50MzJBcnJheSwgMjA0OCBtYW50aXNzYSBsb29rdXAgdmFsdWVzLlxuICovXG5mdW5jdGlvbiBjb21wdXRlRmxvYXQxNk1hbnRpc2FUYWJsZSgpOiBVaW50MzJBcnJheSB7XG4gIGNvbnN0IGNvbnZlcnRNYW50aXNzYSA9IChpOiBudW1iZXIpOiBudW1iZXIgPT4ge1xuICAgIGxldCBtID0gaSA8PCAxMztcbiAgICBsZXQgZSA9IDA7XG5cbiAgICB3aGlsZSAoKG0gJiAweDAwODAwMDAwKSA9PT0gMCkge1xuICAgICAgZSAtPSAweDAwODAwMDAwO1xuICAgICAgbSA8PD0gMTtcbiAgICB9XG4gICAgbSAmPSB+MHgwMDgwMDAwMDtcbiAgICBlICs9IDB4Mzg4MDAwMDA7XG5cbiAgICByZXR1cm4gbSB8IGU7XG4gIH07XG5cbiAgY29uc3QgbWFudGlzYVRhYmxlID0gbmV3IFVpbnQzMkFycmF5KDIwNDgpO1xuXG4gIG1hbnRpc2FUYWJsZVswXSA9IDA7XG4gIGZvciAobGV0IGkgPSAxOyBpIDwgMTAyNDsgaSsrKSB7XG4gICAgbWFudGlzYVRhYmxlW2ldID0gY29udmVydE1hbnRpc3NhKGkpO1xuICB9XG4gIGZvciAobGV0IGkgPSAxMDI0OyBpIDwgMjA0ODsgaSsrKSB7XG4gICAgbWFudGlzYVRhYmxlW2ldID0gMHgzODAwMDAwMCArICgoaSAtIDEwMjQpIDw8IDEzKTtcbiAgfVxuXG4gIHJldHVybiBtYW50aXNhVGFibGU7XG59XG5cbi8qKlxuICogQ29tcHV0ZXMgZXhwb25lbnQgdGFibGUgZm9yIGNhc3RpbmcgRmxvYXQxNiB0byBGbG9hdDMyXG4gKiBTZWUgaHR0cDovL3d3dy5mb3gtdG9vbGtpdC5vcmcvZnRwL2Zhc3RoYWxmZmxvYXRjb252ZXJzaW9uLnBkZlxuICpcbiAqIEByZXR1cm5zIFVpbnQzMkFycmF5LCA2NCBleHBvbmVudCBsb29rdXAgdmFsdWVzLlxuICovXG5mdW5jdGlvbiBjb21wdXRlRmxvYXQxNkV4cG9uZW50VGFibGUoKTogVWludDMyQXJyYXkge1xuICBjb25zdCBleHBvbmVudFRhYmxlID0gbmV3IFVpbnQzMkFycmF5KDY0KTtcblxuICBleHBvbmVudFRhYmxlWzBdID0gMDtcbiAgZXhwb25lbnRUYWJsZVszMV0gPSAweDQ3ODAwMDAwO1xuICBleHBvbmVudFRhYmxlWzMyXSA9IDB4ODAwMDAwMDA7XG4gIGV4cG9uZW50VGFibGVbNjNdID0gMHhjNzgwMDAwMDtcbiAgZm9yIChsZXQgaSA9IDE7IGkgPCAzMTsgaSsrKSB7XG4gICAgZXhwb25lbnRUYWJsZVtpXSA9IGkgPDwgMjM7XG4gIH1cbiAgZm9yIChsZXQgaSA9IDMzOyBpIDwgNjM7IGkrKykge1xuICAgIGV4cG9uZW50VGFibGVbaV0gPSAweDgwMDAwMDAwICsgKChpIC0gMzIpIDw8IDIzKTtcbiAgfVxuXG4gIHJldHVybiBleHBvbmVudFRhYmxlO1xufVxuXG4vKipcbiAqIENvbXB1dGVzIG9mZnNldCB0YWJsZSBmb3IgY2FzdGluZyBGbG9hdDE2IHRvIEZsb2F0MzJcbiAqIFNlZSBodHRwOi8vd3d3LmZveC10b29sa2l0Lm9yZy9mdHAvZmFzdGhhbGZmbG9hdGNvbnZlcnNpb24ucGRmXG4gKlxuICogQHJldHVybnMgVWludDMyQXJyYXksIDZkIG9mZnNldCB2YWx1ZXMuXG4gKi9cbmZ1bmN0aW9uIGNvbXB1dGVGbG9hdDE2T2Zmc2V0VGFibGUoKTogVWludDMyQXJyYXkge1xuICBjb25zdCBvZmZzZXRUYWJsZSA9IG5ldyBVaW50MzJBcnJheSg2NCk7XG5cbiAgZm9yIChsZXQgaSA9IDA7IGkgPCA2NDsgaSsrKSB7XG4gICAgb2Zmc2V0VGFibGVbaV0gPSAxMDI0O1xuICB9XG4gIG9mZnNldFRhYmxlWzBdID0gb2Zmc2V0VGFibGVbMzJdID0gMDtcblxuICByZXR1cm4gb2Zmc2V0VGFibGU7XG59XG5cbi8qKlxuICogUmV0cmlldmUgYSBGbG9hdDE2IGRlY29kZXIgd2hpY2ggd2lsbCBkZWNvZGUgYSBCeXRlQXJyYXkgb2YgRmxvYXQxNiB2YWx1ZXNcbiAqIHRvIGEgRmxvYXQzMkFycmF5LlxuICpcbiAqIEByZXR1cm5zIEZ1bmN0aW9uIChidWZmZXI6IFVpbnQxNkFycmF5KSA9PiBGbG9hdDMyQXJyYXkgd2hpY2ggZGVjb2Rlc1xuICogICAgICAgICAgdGhlIFVpbnQxNkFycmF5IG9mIEZsb2F0MTYgYnl0ZXMgdG8gYSBGbG9hdDMyQXJyYXkuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBnZXRGbG9hdDE2RGVjb2RlcigpOiAoYnVmZmVyOiBVaW50MTZBcnJheSkgPT4gRmxvYXQzMkFycmF5IHtcbiAgLy8gQWxnb3JpdGhtIGlzIGJhc2VkIG9mZiBvZlxuICAvLyBodHRwOi8vd3d3LmZveC10b29sa2l0Lm9yZy9mdHAvZmFzdGhhbGZmbG9hdGNvbnZlcnNpb24ucGRmXG5cbiAgLy8gQ2FjaGUgbG9va3VwIHRhYmxlc1xuICBjb25zdCBtYW50aXNhVGFibGUgPSBjb21wdXRlRmxvYXQxNk1hbnRpc2FUYWJsZSgpO1xuICBjb25zdCBleHBvbmVudFRhYmxlID0gY29tcHV0ZUZsb2F0MTZFeHBvbmVudFRhYmxlKCk7XG4gIGNvbnN0IG9mZnNldFRhYmxlID0gY29tcHV0ZUZsb2F0MTZPZmZzZXRUYWJsZSgpO1xuXG4gIHJldHVybiAocXVhbnRpemVkQXJyYXk6IFVpbnQxNkFycmF5KSA9PiB7XG4gICAgY29uc3QgYnVmZmVyID0gbmV3IEFycmF5QnVmZmVyKDQgKiBxdWFudGl6ZWRBcnJheS5sZW5ndGgpO1xuICAgIGNvbnN0IGJ1ZmZlclVpbnQzMlZpZXcgPSBuZXcgVWludDMyQXJyYXkoYnVmZmVyKTtcbiAgICBmb3IgKGxldCBpbmRleCA9IDA7IGluZGV4IDwgcXVhbnRpemVkQXJyYXkubGVuZ3RoOyBpbmRleCsrKSB7XG4gICAgICBjb25zdCBmbG9hdDE2Qml0cyA9IHF1YW50aXplZEFycmF5W2luZGV4XTtcbiAgICAgIGNvbnN0IGZsb2F0MzJCaXRzID1cbiAgICAgICAgICBtYW50aXNhVGFibGVbb2Zmc2V0VGFibGVbZmxvYXQxNkJpdHMgPj4gMTBdICsgKGZsb2F0MTZCaXRzICYgMHgzZmYpXSArXG4gICAgICAgICAgZXhwb25lbnRUYWJsZVtmbG9hdDE2Qml0cyA+PiAxMF07XG4gICAgICBidWZmZXJVaW50MzJWaWV3W2luZGV4XSA9IGZsb2F0MzJCaXRzO1xuICAgIH1cbiAgICByZXR1cm4gbmV3IEZsb2F0MzJBcnJheShidWZmZXIpO1xuICB9O1xufVxuIl19","/**\n * @license\n * Copyright 2018 Google LLC. All Rights Reserved.\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n * =============================================================================\n */\nexport class IORouterRegistry {\n constructor() {\n this.saveRouters = [];\n this.loadRouters = [];\n }\n static getInstance() {\n if (IORouterRegistry.instance == null) {\n IORouterRegistry.instance = new IORouterRegistry();\n }\n return IORouterRegistry.instance;\n }\n /**\n * Register a save-handler router.\n *\n * @param saveRouter A function that maps a URL-like string onto an instance\n * of `IOHandler` with the `save` method defined or `null`.\n */\n static registerSaveRouter(saveRouter) {\n IORouterRegistry.getInstance().saveRouters.push(saveRouter);\n }\n /**\n * Register a load-handler router.\n *\n * @param loadRouter A function that maps a URL-like string onto an instance\n * of `IOHandler` with the `load` method defined or `null`.\n */\n static registerLoadRouter(loadRouter) {\n IORouterRegistry.getInstance().loadRouters.push(loadRouter);\n }\n /**\n * Look up IOHandler for saving, given a URL-like string.\n *\n * @param url\n * @returns If only one match is found, an instance of IOHandler with the\n * `save` method defined. If no match is found, `null`.\n * @throws Error, if more than one match is found.\n */\n static getSaveHandlers(url) {\n return IORouterRegistry.getHandlers(url, 'save');\n }\n /**\n * Look up IOHandler for loading, given a URL-like string.\n *\n * @param url\n * @param loadOptions Optional, custom load options.\n * @returns All valid handlers for `url`, given the currently registered\n * handler routers.\n */\n static getLoadHandlers(url, loadOptions) {\n return IORouterRegistry.getHandlers(url, 'load', loadOptions);\n }\n static getHandlers(url, handlerType, loadOptions) {\n const validHandlers = [];\n const routers = handlerType === 'load' ?\n IORouterRegistry.getInstance().loadRouters :\n IORouterRegistry.getInstance().saveRouters;\n routers.forEach(router => {\n const handler = router(url, loadOptions);\n if (handler !== null) {\n validHandlers.push(handler);\n }\n });\n return validHandlers;\n }\n}\nexport const registerSaveRouter = (loudRouter) => IORouterRegistry.registerSaveRouter(loudRouter);\nexport const registerLoadRouter = (loudRouter) => IORouterRegistry.registerLoadRouter(loudRouter);\nexport const getSaveHandlers = (url) => IORouterRegistry.getSaveHandlers(url);\nexport const getLoadHandlers = (url, loadOptions) => IORouterRegistry.getLoadHandlers(url, loadOptions);\n//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicm91dGVyX3JlZ2lzdHJ5LmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vLi4vdGZqcy1jb3JlL3NyYy9pby9yb3V0ZXJfcmVnaXN0cnkudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUE7Ozs7Ozs7Ozs7Ozs7OztHQWVHO0FBT0gsTUFBTSxPQUFPLGdCQUFnQjtJQU8zQjtRQUNFLElBQUksQ0FBQyxXQUFXLEdBQUcsRUFBRSxDQUFDO1FBQ3RCLElBQUksQ0FBQyxXQUFXLEdBQUcsRUFBRSxDQUFDO0lBQ3hCLENBQUM7SUFFTyxNQUFNLENBQUMsV0FBVztRQUN4QixJQUFJLGdCQUFnQixDQUFDLFFBQVEsSUFBSSxJQUFJLEVBQUU7WUFDckMsZ0JBQWdCLENBQUMsUUFBUSxHQUFHLElBQUksZ0JBQWdCLEVBQUUsQ0FBQztTQUNwRDtRQUNELE9BQU8sZ0JBQWdCLENBQUMsUUFBUSxDQUFDO0lBQ25DLENBQUM7SUFFRDs7Ozs7T0FLRztJQUNILE1BQU0sQ0FBQyxrQkFBa0IsQ0FBQyxVQUFvQjtRQUM1QyxnQkFBZ0IsQ0FBQyxXQUFXLEVBQUUsQ0FBQyxXQUFXLENBQUMsSUFBSSxDQUFDLFVBQVUsQ0FBQyxDQUFDO0lBQzlELENBQUM7SUFFRDs7Ozs7T0FLRztJQUNILE1BQU0sQ0FBQyxrQkFBa0IsQ0FBQyxVQUFvQjtRQUM1QyxnQkFBZ0IsQ0FBQyxXQUFXLEVBQUUsQ0FBQyxXQUFXLENBQUMsSUFBSSxDQUFDLFVBQVUsQ0FBQyxDQUFDO0lBQzlELENBQUM7SUFFRDs7Ozs7OztPQU9HO0lBQ0gsTUFBTSxDQUFDLGVBQWUsQ0FBQyxHQUFvQjtRQUN6QyxPQUFPLGdCQUFnQixDQUFDLFdBQVcsQ0FBQyxHQUFHLEVBQUUsTUFBTSxDQUFDLENBQUM7SUFDbkQsQ0FBQztJQUVEOzs7Ozs7O09BT0c7SUFDSCxNQUFNLENBQUMsZUFBZSxDQUFDLEdBQW9CLEVBQUUsV0FBeUI7UUFFcEUsT0FBTyxnQkFBZ0IsQ0FBQyxXQUFXLENBQUMsR0FBRyxFQUFFLE1BQU0sRUFBRSxXQUFXLENBQUMsQ0FBQztJQUNoRSxDQUFDO0lBRU8sTUFBTSxDQUFDLFdBQVcsQ0FDdEIsR0FBb0IsRUFBRSxXQUEwQixFQUNoRCxXQUF5QjtRQUMzQixNQUFNLGFBQWEsR0FBZ0IsRUFBRSxDQUFDO1FBQ3RDLE1BQU0sT0FBTyxHQUFHLFdBQVcsS0FBSyxNQUFNLENBQUMsQ0FBQztZQUNwQyxnQkFBZ0IsQ0FBQyxXQUFXLEVBQUUsQ0FBQyxXQUFXLENBQUMsQ0FBQztZQUM1QyxnQkFBZ0IsQ0FBQyxXQUFXLEVBQUUsQ0FBQyxXQUFXLENBQUM7UUFDL0MsT0FBTyxDQUFDLE9BQU8sQ0FBQyxNQUFNLENBQUMsRUFBRTtZQUN2QixNQUFNLE9BQU8sR0FBRyxNQUFNLENBQUMsR0FBRyxFQUFFLFdBQVcsQ0FBQyxDQUFDO1lBQ3pDLElBQUksT0FBTyxLQUFLLElBQUksRUFBRTtnQkFDcEIsYUFBYSxDQUFDLElBQUksQ0FBQyxPQUFPLENBQUMsQ0FBQzthQUM3QjtRQUNILENBQUMsQ0FBQyxDQUFDO1FBQ0gsT0FBTyxhQUFhLENBQUM7SUFDdkIsQ0FBQztDQUNGO0FBRUQsTUFBTSxDQUFDLE1BQU0sa0JBQWtCLEdBQUcsQ0FBQyxVQUFvQixFQUFFLEVBQUUsQ0FDdkQsZ0JBQWdCLENBQUMsa0JBQWtCLENBQUMsVUFBVSxDQUFDLENBQUM7QUFDcEQsTUFBTSxDQUFDLE1BQU0sa0JBQWtCLEdBQUcsQ0FBQyxVQUFvQixFQUFFLEVBQUUsQ0FDdkQsZ0JBQWdCLENBQUMsa0JBQWtCLENBQUMsVUFBVSxDQUFDLENBQUM7QUFDcEQsTUFBTSxDQUFDLE1BQU0sZUFBZSxHQUFHLENBQUMsR0FBb0IsRUFBRSxFQUFFLENBQ3BELGdCQUFnQixDQUFDLGVBQWUsQ0FBQyxHQUFHLENBQUMsQ0FBQztBQUMxQyxNQUFNLENBQUMsTUFBTSxlQUFlLEdBQ3hCLENBQUMsR0FBb0IsRUFBRSxXQUF5QixFQUFFLEVBQUUsQ0FDaEQsZ0JBQWdCLENBQUMsZUFBZSxDQUFDLEdBQUcsRUFBRSxXQUFXLENBQUMsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbIi8qKlxuICogQGxpY2Vuc2VcbiAqIENvcHlyaWdodCAyMDE4IEdvb2dsZSBMTEMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuXG4gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgXCJMaWNlbnNlXCIpO1xuICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLlxuICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0XG4gKlxuICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wXG4gKlxuICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZVxuICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gXCJBUyBJU1wiIEJBU0lTLFxuICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuXG4gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kXG4gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS5cbiAqID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4gKi9cblxuaW1wb3J0IHtJT0hhbmRsZXIsIExvYWRPcHRpb25zfSBmcm9tICcuL3R5cGVzJztcblxuZXhwb3J0IHR5cGUgSU9Sb3V0ZXIgPSAodXJsOiBzdHJpbmd8c3RyaW5nW10sIGxvYWRPcHRpb25zPzogTG9hZE9wdGlvbnMpID0+XG4gICAgSU9IYW5kbGVyO1xuXG5leHBvcnQgY2xhc3MgSU9Sb3V0ZXJSZWdpc3RyeSB7XG4gIC8vIFNpbmdsZXRvbiBpbnN0YW5jZS5cbiAgcHJpdmF0ZSBzdGF0aWMgaW5zdGFuY2U6IElPUm91dGVyUmVnaXN0cnk7XG5cbiAgcHJpdmF0ZSBzYXZlUm91dGVyczogSU9Sb3V0ZXJbXTtcbiAgcHJpdmF0ZSBsb2FkUm91dGVyczogSU9Sb3V0ZXJbXTtcblxuICBwcml2YXRlIGNvbnN0cnVjdG9yKCkge1xuICAgIHRoaXMuc2F2ZVJvdXRlcnMgPSBbXTtcbiAgICB0aGlzLmxvYWRSb3V0ZXJzID0gW107XG4gIH1cblxuICBwcml2YXRlIHN0YXRpYyBnZXRJbnN0YW5jZSgpOiBJT1JvdXRlclJlZ2lzdHJ5IHtcbiAgICBpZiAoSU9Sb3V0ZXJSZWdpc3RyeS5pbnN0YW5jZSA9PSBudWxsKSB7XG4gICAgICBJT1JvdXRlclJlZ2lzdHJ5Lmluc3RhbmNlID0gbmV3IElPUm91dGVyUmVnaXN0cnkoKTtcbiAgICB9XG4gICAgcmV0dXJuIElPUm91dGVyUmVnaXN0cnkuaW5zdGFuY2U7XG4gIH1cblxuICAvKipcbiAgICogUmVnaXN0ZXIgYSBzYXZlLWhhbmRsZXIgcm91dGVyLlxuICAgKlxuICAgKiBAcGFyYW0gc2F2ZVJvdXRlciBBIGZ1bmN0aW9uIHRoYXQgbWFwcyBhIFVSTC1saWtlIHN0cmluZyBvbnRvIGFuIGluc3RhbmNlXG4gICAqIG9mIGBJT0hhbmRsZXJgIHdpdGggdGhlIGBzYXZlYCBtZXRob2QgZGVmaW5lZCBvciBgbnVsbGAuXG4gICAqL1xuICBzdGF0aWMgcmVnaXN0ZXJTYXZlUm91dGVyKHNhdmVSb3V0ZXI6IElPUm91dGVyKSB7XG4gICAgSU9Sb3V0ZXJSZWdpc3RyeS5nZXRJbnN0YW5jZSgpLnNhdmVSb3V0ZXJzLnB1c2goc2F2ZVJvdXRlcik7XG4gIH1cblxuICAvKipcbiAgICogUmVnaXN0ZXIgYSBsb2FkLWhhbmRsZXIgcm91dGVyLlxuICAgKlxuICAgKiBAcGFyYW0gbG9hZFJvdXRlciBBIGZ1bmN0aW9uIHRoYXQgbWFwcyBhIFVSTC1saWtlIHN0cmluZyBvbnRvIGFuIGluc3RhbmNlXG4gICAqIG9mIGBJT0hhbmRsZXJgIHdpdGggdGhlIGBsb2FkYCBtZXRob2QgZGVmaW5lZCBvciBgbnVsbGAuXG4gICAqL1xuICBzdGF0aWMgcmVnaXN0ZXJMb2FkUm91dGVyKGxvYWRSb3V0ZXI6IElPUm91dGVyKSB7XG4gICAgSU9Sb3V0ZXJSZWdpc3RyeS5nZXRJbnN0YW5jZSgpLmxvYWRSb3V0ZXJzLnB1c2gobG9hZFJvdXRlcik7XG4gIH1cblxuICAvKipcbiAgICogTG9vayB1cCBJT0hhbmRsZXIgZm9yIHNhdmluZywgZ2l2ZW4gYSBVUkwtbGlrZSBzdHJpbmcuXG4gICAqXG4gICAqIEBwYXJhbSB1cmxcbiAgICogQHJldHVybnMgSWYgb25seSBvbmUgbWF0Y2ggaXMgZm91bmQsIGFuIGluc3RhbmNlIG9mIElPSGFuZGxlciB3aXRoIHRoZVxuICAgKiBgc2F2ZWAgbWV0aG9kIGRlZmluZWQuIElmIG5vIG1hdGNoIGlzIGZvdW5kLCBgbnVsbGAuXG4gICAqIEB0aHJvd3MgRXJyb3IsIGlmIG1vcmUgdGhhbiBvbmUgbWF0Y2ggaXMgZm91bmQuXG4gICAqL1xuICBzdGF0aWMgZ2V0U2F2ZUhhbmRsZXJzKHVybDogc3RyaW5nfHN0cmluZ1tdKTogSU9IYW5kbGVyW10ge1xuICAgIHJldHVybiBJT1JvdXRlclJlZ2lzdHJ5LmdldEhhbmRsZXJzKHVybCwgJ3NhdmUnKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBMb29rIHVwIElPSGFuZGxlciBmb3IgbG9hZGluZywgZ2l2ZW4gYSBVUkwtbGlrZSBzdHJpbmcuXG4gICAqXG4gICAqIEBwYXJhbSB1cmxcbiAgICogQHBhcmFtIGxvYWRPcHRpb25zIE9wdGlvbmFsLCBjdXN0b20gbG9hZCBvcHRpb25zLlxuICAgKiBAcmV0dXJucyBBbGwgdmFsaWQgaGFuZGxlcnMgZm9yIGB1cmxgLCBnaXZlbiB0aGUgY3VycmVudGx5IHJlZ2lzdGVyZWRcbiAgICogICBoYW5kbGVyIHJvdXRlcnMuXG4gICAqL1xuICBzdGF0aWMgZ2V0TG9hZEhhbmRsZXJzKHVybDogc3RyaW5nfHN0cmluZ1tdLCBsb2FkT3B0aW9ucz86IExvYWRPcHRpb25zKTpcbiAgICAgIElPSGFuZGxlcltdIHtcbiAgICByZXR1cm4gSU9Sb3V0ZXJSZWdpc3RyeS5nZXRIYW5kbGVycyh1cmwsICdsb2FkJywgbG9hZE9wdGlvbnMpO1xuICB9XG5cbiAgcHJpdmF0ZSBzdGF0aWMgZ2V0SGFuZGxlcnMoXG4gICAgICB1cmw6IHN0cmluZ3xzdHJpbmdbXSwgaGFuZGxlclR5cGU6ICdzYXZlJ3wnbG9hZCcsXG4gICAgICBsb2FkT3B0aW9ucz86IExvYWRPcHRpb25zKTogSU9IYW5kbGVyW10ge1xuICAgIGNvbnN0IHZhbGlkSGFuZGxlcnM6IElPSGFuZGxlcltdID0gW107XG4gICAgY29uc3Qgcm91dGVycyA9IGhhbmRsZXJUeXBlID09PSAnbG9hZCcgP1xuICAgICAgICBJT1JvdXRlclJlZ2lzdHJ5LmdldEluc3RhbmNlKCkubG9hZFJvdXRlcnMgOlxuICAgICAgICBJT1JvdXRlclJlZ2lzdHJ5LmdldEluc3RhbmNlKCkuc2F2ZVJvdXRlcnM7XG4gICAgcm91dGVycy5mb3JFYWNoKHJvdXRlciA9PiB7XG4gICAgICBjb25zdCBoYW5kbGVyID0gcm91dGVyKHVybCwgbG9hZE9wdGlvbnMpO1xuICAgICAgaWYgKGhhbmRsZXIgIT09IG51bGwpIHtcbiAgICAgICAgdmFsaWRIYW5kbGVycy5wdXNoKGhhbmRsZXIpO1xuICAgICAgfVxuICAgIH0pO1xuICAgIHJldHVybiB2YWxpZEhhbmRsZXJzO1xuICB9XG59XG5cbmV4cG9ydCBjb25zdCByZWdpc3RlclNhdmVSb3V0ZXIgPSAobG91ZFJvdXRlcjogSU9Sb3V0ZXIpID0+XG4gICAgSU9Sb3V0ZXJSZWdpc3RyeS5yZWdpc3RlclNhdmVSb3V0ZXIobG91ZFJvdXRlcik7XG5leHBvcnQgY29uc3QgcmVnaXN0ZXJMb2FkUm91dGVyID0gKGxvdWRSb3V0ZXI6IElPUm91dGVyKSA9PlxuICAgIElPUm91dGVyUmVnaXN0cnkucmVnaXN0ZXJMb2FkUm91dGVyKGxvdWRSb3V0ZXIpO1xuZXhwb3J0IGNvbnN0IGdldFNhdmVIYW5kbGVycyA9ICh1cmw6IHN0cmluZ3xzdHJpbmdbXSkgPT5cbiAgICBJT1JvdXRlclJlZ2lzdHJ5LmdldFNhdmVIYW5kbGVycyh1cmwpO1xuZXhwb3J0IGNvbnN0IGdldExvYWRIYW5kbGVycyA9XG4gICAgKHVybDogc3RyaW5nfHN0cmluZ1tdLCBsb2FkT3B0aW9ucz86IExvYWRPcHRpb25zKSA9PlxuICAgICAgICBJT1JvdXRlclJlZ2lzdHJ5LmdldExvYWRIYW5kbGVycyh1cmwsIGxvYWRPcHRpb25zKTtcbiJdfQ==","/**\n * @license\n * Copyright 2018 Google LLC. All Rights Reserved.\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n * =============================================================================\n */\nimport '../flags';\nimport { env } from '../environment';\nimport { getModelArtifactsInfoForJSON } from './io_utils';\nimport { IORouterRegistry } from './router_registry';\nconst DATABASE_NAME = 'tensorflowjs';\nconst DATABASE_VERSION = 1;\n// Model data and ModelArtifactsInfo (metadata) are stored in two separate\n// stores for efficient access of the list of stored models and their metadata.\n// 1. The object store for model data: topology, weights and weight manifests.\nconst MODEL_STORE_NAME = 'models_store';\n// 2. The object store for ModelArtifactsInfo, including meta-information such\n// as the type of topology (JSON vs binary), byte size of the topology, byte\n// size of the weights, etc.\nconst INFO_STORE_NAME = 'model_info_store';\n/**\n * Delete the entire database for tensorflow.js, including the models store.\n */\nexport async function deleteDatabase() {\n const idbFactory = getIndexedDBFactory();\n return new Promise((resolve, reject) => {\n const deleteRequest = idbFactory.deleteDatabase(DATABASE_NAME);\n deleteRequest.onsuccess = () => resolve();\n deleteRequest.onerror = error => reject(error);\n });\n}\nfunction getIndexedDBFactory() {\n if (!env().getBool('IS_BROWSER')) {\n // TODO(cais): Add more info about what IOHandler subtypes are available.\n // Maybe point to a doc page on the web and/or automatically determine\n // the available IOHandlers and print them in the error message.\n throw new Error('Failed to obtain IndexedDB factory because the current environment' +\n 'is not a web browser.');\n }\n // tslint:disable-next-line:no-any\n const theWindow = typeof window === 'undefined' ? self : window;\n const factory = theWindow.indexedDB || theWindow.mozIndexedDB ||\n theWindow.webkitIndexedDB || theWindow.msIndexedDB ||\n theWindow.shimIndexedDB;\n if (factory == null) {\n throw new Error('The current browser does not appear to support IndexedDB.');\n }\n return factory;\n}\nfunction setUpDatabase(openRequest) {\n const db = openRequest.result;\n db.createObjectStore(MODEL_STORE_NAME, { keyPath: 'modelPath' });\n db.createObjectStore(INFO_STORE_NAME, { keyPath: 'modelPath' });\n}\n/**\n * IOHandler subclass: Browser IndexedDB.\n *\n * See the doc string of `browserIndexedDB` for more details.\n */\nexport class BrowserIndexedDB {\n constructor(modelPath) {\n this.indexedDB = getIndexedDBFactory();\n if (modelPath == null || !modelPath) {\n throw new Error('For IndexedDB, modelPath must not be null, undefined or empty.');\n }\n this.modelPath = modelPath;\n }\n async save(modelArtifacts) {\n // TODO(cais): Support saving GraphDef models.\n if (modelArtifacts.modelTopology instanceof ArrayBuffer) {\n throw new Error('BrowserLocalStorage.save() does not support saving model topology ' +\n 'in binary formats yet.');\n }\n return this.databaseAction(this.modelPath, modelArtifacts);\n }\n async load() {\n return this.databaseAction(this.modelPath);\n }\n /**\n * Perform database action to put model artifacts into or read model artifacts\n * from IndexedDB object store.\n *\n * Whether the action is put or get depends on whether `modelArtifacts` is\n * specified. If it is specified, the action will be put; otherwise the action\n * will be get.\n *\n * @param modelPath A unique string path for the model.\n * @param modelArtifacts If specified, it will be the model artifacts to be\n * stored in IndexedDB.\n * @returns A `Promise` of `SaveResult`, if the action is put, or a `Promise`\n * of `ModelArtifacts`, if the action is get.\n */\n databaseAction(modelPath, modelArtifacts) {\n return new Promise((resolve, reject) => {\n const openRequest = this.indexedDB.open(DATABASE_NAME, DATABASE_VERSION);\n openRequest.onupgradeneeded = () => setUpDatabase(openRequest);\n openRequest.onsuccess = () => {\n const db = openRequest.result;\n if (modelArtifacts == null) {\n // Read model out from object store.\n const modelTx = db.transaction(MODEL_STORE_NAME, 'readonly');\n const modelStore = modelTx.objectStore(MODEL_STORE_NAME);\n const getRequest = modelStore.get(this.modelPath);\n getRequest.onsuccess = () => {\n if (getRequest.result == null) {\n db.close();\n return reject(new Error(`Cannot find model with path '${this.modelPath}' ` +\n `in IndexedDB.`));\n }\n else {\n resolve(getRequest.result.modelArtifacts);\n }\n };\n getRequest.onerror = error => {\n db.close();\n return reject(getRequest.error);\n };\n modelTx.oncomplete = () => db.close();\n }\n else {\n // Put model into object store.\n const modelArtifactsInfo = getModelArtifactsInfoForJSON(modelArtifacts);\n // First, put ModelArtifactsInfo into info store.\n const infoTx = db.transaction(INFO_STORE_NAME, 'readwrite');\n let infoStore = infoTx.objectStore(INFO_STORE_NAME);\n const putInfoRequest = infoStore.put({ modelPath: this.modelPath, modelArtifactsInfo });\n let modelTx;\n putInfoRequest.onsuccess = () => {\n // Second, put model data into model store.\n modelTx = db.transaction(MODEL_STORE_NAME, 'readwrite');\n const modelStore = modelTx.objectStore(MODEL_STORE_NAME);\n const putModelRequest = modelStore.put({\n modelPath: this.modelPath,\n modelArtifacts,\n modelArtifactsInfo\n });\n putModelRequest.onsuccess = () => resolve({ modelArtifactsInfo });\n putModelRequest.onerror = error => {\n // If the put-model request fails, roll back the info entry as\n // well.\n infoStore = infoTx.objectStore(INFO_STORE_NAME);\n const deleteInfoRequest = infoStore.delete(this.modelPath);\n deleteInfoRequest.onsuccess = () => {\n db.close();\n return reject(putModelRequest.error);\n };\n deleteInfoRequest.onerror = error => {\n db.close();\n return reject(putModelRequest.error);\n };\n };\n };\n putInfoRequest.onerror = error => {\n db.close();\n return reject(putInfoRequest.error);\n };\n infoTx.oncomplete = () => {\n if (modelTx == null) {\n db.close();\n }\n else {\n modelTx.oncomplete = () => db.close();\n }\n };\n }\n };\n openRequest.onerror = error => reject(openRequest.error);\n });\n }\n}\nBrowserIndexedDB.URL_SCHEME = 'indexeddb://';\nexport const indexedDBRouter = (url) => {\n if (!env().getBool('IS_BROWSER')) {\n return null;\n }\n else {\n if (!Array.isArray(url) && url.startsWith(BrowserIndexedDB.URL_SCHEME)) {\n return browserIndexedDB(url.slice(BrowserIndexedDB.URL_SCHEME.length));\n }\n else {\n return null;\n }\n }\n};\nIORouterRegistry.registerSaveRouter(indexedDBRouter);\nIORouterRegistry.registerLoadRouter(indexedDBRouter);\n/**\n * Creates a browser IndexedDB IOHandler for saving and loading models.\n *\n * ```js\n * const model = tf.sequential();\n * model.add(\n * tf.layers.dense({units: 1, inputShape: [100], activation: 'sigmoid'}));\n *\n * const saveResult = await model.save('indexeddb://MyModel'));\n * console.log(saveResult);\n * ```\n *\n * @param modelPath A unique identifier for the model to be saved. Must be a\n * non-empty string.\n * @returns An instance of `BrowserIndexedDB` (sublcass of `IOHandler`),\n * which can be used with, e.g., `tf.Model.save`.\n */\nexport function browserIndexedDB(modelPath) {\n return new BrowserIndexedDB(modelPath);\n}\nfunction maybeStripScheme(key) {\n return key.startsWith(BrowserIndexedDB.URL_SCHEME) ?\n key.slice(BrowserIndexedDB.URL_SCHEME.length) :\n key;\n}\nexport class BrowserIndexedDBManager {\n constructor() {\n this.indexedDB = getIndexedDBFactory();\n }\n async listModels() {\n return new Promise((resolve, reject) => {\n const openRequest = this.indexedDB.open(DATABASE_NAME, DATABASE_VERSION);\n openRequest.onupgradeneeded = () => setUpDatabase(openRequest);\n openRequest.onsuccess = () => {\n const db = openRequest.result;\n const tx = db.transaction(INFO_STORE_NAME, 'readonly');\n const store = tx.objectStore(INFO_STORE_NAME);\n // tslint:disable:max-line-length\n // Need to cast `store` as `any` here because TypeScript's DOM\n // library does not have the `getAll()` method even though the\n // method is supported in the latest version of most mainstream\n // browsers:\n // https://developer.mozilla.org/en-US/docs/Web/API/IDBObjectStore/getAll\n // tslint:enable:max-line-length\n // tslint:disable-next-line:no-any\n const getAllInfoRequest = store.getAll();\n getAllInfoRequest.onsuccess = () => {\n const out = {};\n for (const item of getAllInfoRequest.result) {\n out[item.modelPath] = item.modelArtifactsInfo;\n }\n resolve(out);\n };\n getAllInfoRequest.onerror = error => {\n db.close();\n return reject(getAllInfoRequest.error);\n };\n tx.oncomplete = () => db.close();\n };\n openRequest.onerror = error => reject(openRequest.error);\n });\n }\n async removeModel(path) {\n path = maybeStripScheme(path);\n return new Promise((resolve, reject) => {\n const openRequest = this.indexedDB.open(DATABASE_NAME, DATABASE_VERSION);\n openRequest.onupgradeneeded = () => setUpDatabase(openRequest);\n openRequest.onsuccess = () => {\n const db = openRequest.result;\n const infoTx = db.transaction(INFO_STORE_NAME, 'readwrite');\n const infoStore = infoTx.objectStore(INFO_STORE_NAME);\n const getInfoRequest = infoStore.get(path);\n let modelTx;\n getInfoRequest.onsuccess = () => {\n if (getInfoRequest.result == null) {\n db.close();\n return reject(new Error(`Cannot find model with path '${path}' ` +\n `in IndexedDB.`));\n }\n else {\n // First, delete the entry in the info store.\n const deleteInfoRequest = infoStore.delete(path);\n const deleteModelData = () => {\n // Second, delete the entry in the model store.\n modelTx = db.transaction(MODEL_STORE_NAME, 'readwrite');\n const modelStore = modelTx.objectStore(MODEL_STORE_NAME);\n const deleteModelRequest = modelStore.delete(path);\n deleteModelRequest.onsuccess = () => resolve(getInfoRequest.result.modelArtifactsInfo);\n deleteModelRequest.onerror = error => reject(getInfoRequest.error);\n };\n // Proceed with deleting model data regardless of whether deletion\n // of info data succeeds or not.\n deleteInfoRequest.onsuccess = deleteModelData;\n deleteInfoRequest.onerror = error => {\n deleteModelData();\n db.close();\n return reject(getInfoRequest.error);\n };\n }\n };\n getInfoRequest.onerror = error => {\n db.close();\n return reject(getInfoRequest.error);\n };\n infoTx.oncomplete = () => {\n if (modelTx == null) {\n db.close();\n }\n else {\n modelTx.oncomplete = () => db.close();\n }\n };\n };\n openRequest.onerror = error => reject(openRequest.error);\n });\n }\n}\n//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW5kZXhlZF9kYi5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uLy4uL3RmanMtY29yZS9zcmMvaW8vaW5kZXhlZF9kYi50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQTs7Ozs7Ozs7Ozs7Ozs7O0dBZUc7QUFFSCxPQUFPLFVBQVUsQ0FBQztBQUVsQixPQUFPLEVBQUMsR0FBRyxFQUFDLE1BQU0sZ0JBQWdCLENBQUM7QUFFbkMsT0FBTyxFQUFDLDRCQUE0QixFQUFDLE1BQU0sWUFBWSxDQUFDO0FBQ3hELE9BQU8sRUFBVyxnQkFBZ0IsRUFBQyxNQUFNLG1CQUFtQixDQUFDO0FBRzdELE1BQU0sYUFBYSxHQUFHLGNBQWMsQ0FBQztBQUNyQyxNQUFNLGdCQUFnQixHQUFHLENBQUMsQ0FBQztBQUUzQiwwRUFBMEU7QUFDMUUsK0VBQStFO0FBQy9FLDhFQUE4RTtBQUM5RSxNQUFNLGdCQUFnQixHQUFHLGNBQWMsQ0FBQztBQUN4Qyw4RUFBOEU7QUFDOUUsK0VBQStFO0FBQy9FLCtCQUErQjtBQUMvQixNQUFNLGVBQWUsR0FBRyxrQkFBa0IsQ0FBQztBQUUzQzs7R0FFRztBQUNILE1BQU0sQ0FBQyxLQUFLLFVBQVUsY0FBYztJQUNsQyxNQUFNLFVBQVUsR0FBRyxtQkFBbUIsRUFBRSxDQUFDO0lBRXpDLE9BQU8sSUFBSSxPQUFPLENBQU8sQ0FBQyxPQUFPLEVBQUUsTUFBTSxFQUFFLEVBQUU7UUFDM0MsTUFBTSxhQUFhLEdBQUcsVUFBVSxDQUFDLGNBQWMsQ0FBQyxhQUFhLENBQUMsQ0FBQztRQUMvRCxhQUFhLENBQUMsU0FBUyxHQUFHLEdBQUcsRUFBRSxDQUFDLE9BQU8sRUFBRSxDQUFDO1FBQzFDLGFBQWEsQ0FBQyxPQUFPLEdBQUcsS0FBSyxDQUFDLEVBQUUsQ0FBQyxNQUFNLENBQUMsS0FBSyxDQUFDLENBQUM7SUFDakQsQ0FBQyxDQUFDLENBQUM7QUFDTCxDQUFDO0FBRUQsU0FBUyxtQkFBbUI7SUFDMUIsSUFBSSxD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QUMsRUFBRSxDQUNqQyxNQUFNLENBQUMsY0FBYyxDQUFDLEtBQUssQ0FBQyxDQUFDO3dCQUNuQyxDQUFDLENBQUM7d0JBQ0Ysa0VBQWtFO3dCQUNsRSxnQ0FBZ0M7d0JBQ2hDLGlCQUFpQixDQUFDLFNBQVMsR0FBRyxlQUFlLENBQUM7d0JBQzlDLGlCQUFpQixDQUFDLE9BQU8sR0FBRyxLQUFLLENBQUMsRUFBRTs0QkFDbEMsZUFBZSxFQUFFLENBQUM7NEJBQ2xCLEVBQUUsQ0FBQyxLQUFLLEVBQUUsQ0FBQzs0QkFDWCxPQUFPLE1BQU0sQ0FBQyxjQUFjLENBQUMsS0FBSyxDQUFDLENBQUM7d0JBQ3RDLENBQUMsQ0FBQztxQkFDSDtnQkFDSCxDQUFDLENBQUM7Z0JBQ0YsY0FBYyxDQUFDLE9BQU8sR0FBRyxLQUFLLENBQUMsRUFBRTtvQkFDL0IsRUFBRSxDQUFDLEtBQUssRUFBRSxDQUFDO29CQUNYLE9BQU8sTUFBTSxDQUFDLGNBQWMsQ0FBQyxLQUFLLENBQUMsQ0FBQztnQkFDdEMsQ0FBQyxDQUFDO2dCQUVGLE1BQU0sQ0FBQyxVQUFVLEdBQUcsR0FBRyxFQUFFO29CQUN2QixJQUFJLE9BQU8sSUFBSSxJQUFJLEVBQUU7d0JBQ25CLEVBQUUsQ0FBQyxLQUFLLEVBQUUsQ0FBQztxQkFDWjt5QkFBTTt3QkFDTCxPQUFPLENBQUMsVUFBVSxHQUFHLEdBQUcsRUFBRSxDQUFDLEVBQUUsQ0FBQyxLQUFLLEVBQUUsQ0FBQztxQkFDdkM7Z0JBQ0gsQ0FBQyxDQUFDO1lBQ0osQ0FBQyxDQUFDO1lBQ0YsV0FBVyxDQUFDLE9BQU8sR0FBRyxLQUFLLENBQUMsRUFBRSxDQUFDLE1BQU0sQ0FBQyxXQUFXLENBQUMsS0FBSyxDQUFDLENBQUM7UUFDM0QsQ0FBQyxDQUFDLENBQUM7SUFDTCxDQUFDO0NBQ0YiLCJzb3VyY2VzQ29udGVudCI6WyIvKipcbiAqIEBsaWNlbnNlXG4gKiBDb3B5cmlnaHQgMjAxOCBHb29nbGUgTExDLiBBbGwgUmlnaHRzIFJlc2VydmVkLlxuICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlIFwiTGljZW5zZVwiKTtcbiAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS5cbiAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdFxuICpcbiAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMFxuICpcbiAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmVcbiAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuIFwiQVMgSVNcIiBCQVNJUyxcbiAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLlxuICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZFxuICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuXG4gKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuICovXG5cbmltcG9ydCAnLi4vZmxhZ3MnO1xuXG5pbXBvcnQge2Vudn0gZnJvbSAnLi4vZW52aXJvbm1lbnQnO1xuXG5pbXBvcnQge2dldE1vZGVsQXJ0aWZhY3RzSW5mb0ZvckpTT059IGZyb20gJy4vaW9fdXRpbHMnO1xuaW1wb3J0IHtJT1JvdXRlciwgSU9Sb3V0ZXJSZWdpc3RyeX0gZnJvbSAnLi9yb3V0ZXJfcmVnaXN0cnknO1xuaW1wb3J0IHtJT0hhbmRsZXIsIE1vZGVsQXJ0aWZhY3RzLCBNb2RlbEFydGlmYWN0c0luZm8sIE1vZGVsU3RvcmVNYW5hZ2VyLCBTYXZlUmVzdWx0fSBmcm9tICcuL3R5cGVzJztcblxuY29uc3QgREFUQUJBU0VfTkFNRSA9ICd0ZW5zb3JmbG93anMnO1xuY29uc3QgREFUQUJBU0VfVkVSU0lPTiA9IDE7XG5cbi8vIE1vZGVsIGRhdGEgYW5kIE1vZGVsQXJ0aWZhY3RzSW5mbyAobWV0YWRhdGEpIGFyZSBzdG9yZWQgaW4gdHdvIHNlcGFyYXRlXG4vLyBzdG9yZXMgZm9yIGVmZmljaWVudCBhY2Nlc3Mgb2YgdGhlIGxpc3Qgb2Ygc3RvcmVkIG1vZGVscyBhbmQgdGhlaXIgbWV0YWRhdGEuXG4vLyAxLiBUaGUgb2JqZWN0IHN0b3JlIGZvciBtb2RlbCBkYXRhOiB0b3BvbG9neSwgd2VpZ2h0cyBhbmQgd2VpZ2h0IG1hbmlmZXN0cy5cbmNvbnN0IE1PREVMX1NUT1JFX05BTUUgPSAnbW9kZWxzX3N0b3JlJztcbi8vIDIuIFRoZSBvYmplY3Qgc3RvcmUgZm9yIE1vZGVsQXJ0aWZhY3RzSW5mbywgaW5jbHVkaW5nIG1ldGEtaW5mb3JtYXRpb24gc3VjaFxuLy8gICAgYXMgdGhlIHR5cGUgb2YgdG9wb2xvZ3kgKEpTT04gdnMgYmluYXJ5KSwgYnl0ZSBzaXplIG9mIHRoZSB0b3BvbG9neSwgYnl0ZVxuLy8gICAgc2l6ZSBvZiB0aGUgd2VpZ2h0cywgZXRjLlxuY29uc3QgSU5GT19TVE9SRV9OQU1FID0gJ21vZGVsX2luZm9fc3RvcmUnO1xuXG4vKipcbiAqIERlbGV0ZSB0aGUgZW50aXJlIGRhdGFiYXNlIGZvciB0ZW5zb3JmbG93LmpzLCBpbmNsdWRpbmcgdGhlIG1vZGVscyBzdG9yZS5cbiAqL1xuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIGRlbGV0ZURhdGFiYXNlKCk6IFByb21pc2U8dm9pZD4ge1xuICBjb25zdCBpZGJGYWN0b3J5ID0gZ2V0SW5kZXhlZERCRmFjdG9yeSgpO1xuXG4gIHJldHVybiBuZXcgUHJvbWlzZTx2b2lkPigocmVzb2x2ZSwgcmVqZWN0KSA9PiB7XG4gICAgY29uc3QgZGVsZXRlUmVxdWVzdCA9IGlkYkZhY3RvcnkuZGVsZXRlRGF0YWJhc2UoREFUQUJBU0VfTkFNRSk7XG4gICAgZGVsZXRlUmVxdWVzdC5vbnN1Y2Nlc3MgPSAoKSA9PiByZXNvbHZlKCk7XG4gICAgZGVsZXRlUmVxdWVzdC5vbmVycm9yID0gZXJyb3IgPT4gcmVqZWN0KGVycm9yKTtcbiAgfSk7XG59XG5cbmZ1bmN0aW9uIGdldEluZGV4ZWREQkZhY3RvcnkoKTogSURCRmFjdG9yeSB7XG4gIGlmICghZW52KCkuZ2V0Qm9vbCgnSVNfQlJPV1NFUicpKSB7XG4gICAgLy8gVE9ETyhjYWlzKTogQWRkIG1vcmUgaW5mbyBhYm91dCB3aGF0IElPSGFuZGxlciBzdWJ0eXBlcyBhcmUgYXZhaWxhYmxlLlxuICAgIC8vICAgTWF5YmUgcG9pbnQgdG8gYSBkb2MgcGFnZSBvbiB0aGUgd2ViIGFuZC9vciBhdXRvbWF0aWNhbGx5IGRldGVybWluZVxuICAgIC8vICAgdGhlIGF2YWlsYWJsZSBJT0hhbmRsZXJzIGFuZCBwcmludCB0aGVtIGluIHRoZSBlcnJvciBtZXNzYWdlLlxuICAgIHRocm93IG5ldyBFcnJvcihcbiAgICAgICAgJ0ZhaWxlZCB0byBvYnRhaW4gSW5kZXhlZERCIGZhY3RvcnkgYmVjYXVzZSB0aGUgY3VycmVudCBlbnZpcm9ubWVudCcgK1xuICAgICAgICAnaXMgbm90IGEgd2ViIGJyb3dzZXIuJyk7XG4gIH1cbiAgLy8gdHNsaW50OmRpc2FibGUtbmV4dC1saW5lOm5vLWFueVxuICBjb25zdCB0aGVXaW5kb3c6IGFueSA9IHR5cGVvZiB3aW5kb3cgPT09ICd1bmRlZmluZWQnID8gc2VsZiA6IHdpbmRvdztcbiAgY29uc3QgZmFjdG9yeSA9IHRoZVdpbmRvdy5pbmRleGVkREIgfHwgdGhlV2luZG93Lm1vekluZGV4ZWREQiB8fFxuICAgICAgdGhlV2luZG93LndlYmtpdEluZGV4ZWREQiB8fCB0aGVXaW5kb3cubXNJbmRleGVkREIgfHxcbiAgICAgIHRoZVdpbmRvdy5zaGltSW5kZXhlZERCO1xuICBpZiAoZmFjdG9yeSA9PSBudWxsKSB7XG4gICAgdGhyb3cgbmV3IEVycm9yKFxuICAgICAgICAnVGhlIGN1cnJlbnQgYnJvd3NlciBkb2VzIG5vdCBhcHBlYXIgdG8gc3VwcG9ydCBJbmRleGVkREIuJyk7XG4gIH1cbiAgcmV0dXJuIGZhY3Rvcnk7XG59XG5cbmZ1bmN0aW9uIHNldFVwRGF0YWJhc2Uob3BlblJlcXVlc3Q6IElEQlJlcXVlc3QpIHtcbiAgY29uc3QgZGIgPSBvcGVuUmVxdWVzdC5yZXN1bHQgYXMgSURCRGF0YWJhc2U7XG4gIGRiLmNyZWF0ZU9iamVjdFN0b3JlKE1PREVMX1NUT1JFX05BTUUsIHtrZXlQYXRoOiAnbW9kZWxQYXRoJ30pO1xuICBkYi5jcmVhdGVPYmplY3RTdG9yZShJTkZPX1NUT1JFX05BTUUsIHtrZXlQYXRoOiAnbW9kZWxQYXRoJ30pO1xufVxuXG4vKipcbiAqIElPSGFuZGxlciBzdWJjbGFzczogQnJvd3NlciBJbmRleGVkREIuXG4gKlxuICogU2VlIHRoZSBkb2Mgc3RyaW5nIG9mIGBicm93c2VySW5kZXhlZERCYCBmb3IgbW9yZSBkZXRhaWxzLlxuICovXG5leHBvcnQgY2xhc3MgQnJvd3NlckluZGV4ZWREQiBpbXBsZW1lbnRzIElPSGFuZGxlciB7XG4gIHByb3RlY3RlZCByZWFkb25seSBpbmRleGVkREI6IElEQkZhY3Rvcnk7XG4gIHByb3RlY3RlZCByZWFkb25seSBtb2RlbFBhdGg6IHN0cmluZztcblxuICBzdGF0aWMgcmVhZG9ubHkgVVJMX1NDSEVNRSA9ICdpbmRleGVkZGI6Ly8nO1xuXG4gIGNvbnN0cnVjdG9yKG1vZGVsUGF0aDogc3RyaW5nKSB7XG4gICAgdGhpcy5pbmRleGVkREIgPSBnZXRJbmRleGVkREJGYWN0b3J5KCk7XG5cbiAgICBpZiAobW9kZWxQYXRoID09IG51bGwgfHwgIW1vZGVsUGF0aCkge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKFxuICAgICAgICAgICdGb3IgSW5kZXhlZERCLCBtb2RlbFBhdGggbXVzdCBub3QgYmUgbnVsbCwgdW5kZWZpbmVkIG9yIGVtcHR5LicpO1xuICAgIH1cbiAgICB0aGlzLm1vZGVsUGF0aCA9IG1vZGVsUGF0aDtcbiAgfVxuXG4gIGFzeW5jIHNhdmUobW9kZWxBcnRpZmFjdHM6IE1vZGVsQXJ0aWZhY3RzKTogUHJvbWlzZTxTYXZlUmVzdWx0PiB7XG4gICAgLy8gVE9ETyhjYWlzKTogU3VwcG9ydCBzYXZpbmcgR3JhcGhEZWYgbW9kZWxzLlxuICAgIGlmIChtb2RlbEFydGlmYWN0cy5tb2RlbFRvcG9sb2d5IGluc3RhbmNlb2YgQXJyYXlCdWZmZXIpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcihcbiAgICAgICAgICAnQnJvd3NlckxvY2FsU3RvcmFnZS5zYXZlKCkgZG9lcyBub3Qgc3VwcG9ydCBzYXZpbmcgbW9kZWwgdG9wb2xvZ3kgJyArXG4gICAgICAgICAgJ2luIGJpbmFyeSBmb3JtYXRzIHlldC4nKTtcbiAgICB9XG5cbiAgICByZXR1cm4gdGhpcy5kYXRhYmFzZUFjdGlvbih0aGlzLm1vZGVsUGF0aCwgbW9kZWxBcnRpZmFjdHMpIGFzXG4gICAgICAgIFByb21pc2U8U2F2ZVJlc3VsdD47XG4gIH1cblxuICBhc3luYyBsb2FkKCk6IFByb21pc2U8TW9kZWxBcnRpZmFjdHM+IHtcbiAgICByZXR1cm4gdGhpcy5kYXRhYmFzZUFjdGlvbih0aGlzLm1vZGVsUGF0aCkgYXMgUHJvbWlzZTxNb2RlbEFydGlmYWN0cz47XG4gIH1cblxuICAvKipcbiAgICogUGVyZm9ybSBkYXRhYmFzZSBhY3Rpb24gdG8gcHV0IG1vZGVsIGFydGlmYWN0cyBpbnRvIG9yIHJlYWQgbW9kZWwgYXJ0aWZhY3RzXG4gICAqIGZyb20gSW5kZXhlZERCIG9iamVjdCBzdG9yZS5cbiAgICpcbiAgICogV2hldGhlciB0aGUgYWN0aW9uIGlzIHB1dCBvciBnZXQgZGVwZW5kcyBvbiB3aGV0aGVyIGBtb2RlbEFydGlmYWN0c2AgaXNcbiAgICogc3BlY2lmaWVkLiBJZiBpdCBpcyBzcGVjaWZpZWQsIHRoZSBhY3Rpb24gd2lsbCBiZSBwdXQ7IG90aGVyd2lzZSB0aGUgYWN0aW9uXG4gICAqIHdpbGwgYmUgZ2V0LlxuICAgKlxuICAgKiBAcGFyYW0gbW9kZWxQYXRoIEEgdW5pcXVlIHN0cmluZyBwYXRoIGZvciB0aGUgbW9kZWwuXG4gICAqIEBwYXJhbSBtb2RlbEFydGlmYWN0cyBJZiBzcGVjaWZpZWQsIGl0IHdpbGwgYmUgdGhlIG1vZGVsIGFydGlmYWN0cyB0byBiZVxuICAgKiAgIHN0b3JlZCBpbiBJbmRleGVkREIuXG4gICAqIEByZXR1cm5zIEEgYFByb21pc2VgIG9mIGBTYXZlUmVzdWx0YCwgaWYgdGhlIGFjdGlvbiBpcyBwdXQsIG9yIGEgYFByb21pc2VgXG4gICAqICAgb2YgYE1vZGVsQXJ0aWZhY3RzYCwgaWYgdGhlIGFjdGlvbiBpcyBnZXQuXG4gICAqL1xuICBwcml2YXRlIGRhdGFiYXNlQWN0aW9uKG1vZGVsUGF0aDogc3RyaW5nLCBtb2RlbEFydGlmYWN0cz86IE1vZGVsQXJ0aWZhY3RzKTpcbiAgICAgIFByb21pc2U8TW9kZWxBcnRpZmFjdHN8U2F2ZVJlc3VsdD4ge1xuICAgIHJldHVybiBuZXcgUHJvbWlzZTxNb2RlbEFydGlmYWN0c3xTYXZlUmVzdWx0PigocmVzb2x2ZSwgcmVqZWN0KSA9PiB7XG4gICAgICBjb25zdCBvcGVuUmVxdWVzdCA9IHRoaXMuaW5kZXhlZERCLm9wZW4oREFUQUJBU0VfTkFNRSwgREFUQUJBU0VfVkVSU0lPTik7XG4gICAgICBvcGVuUmVxdWVzdC5vbnVwZ3JhZGVuZWVkZWQgPSAoKSA9PiBzZXRVcERhdGFiYXNlKG9wZW5SZXF1ZXN0KTtcblxuICAgICAgb3BlblJlcXVlc3Qub25zdWNjZXNzID0gKCkgPT4ge1xuICAgICAgICBjb25zdCBkYiA9IG9wZW5SZXF1ZXN0LnJlc3VsdDtcblxuICAgICAgICBpZiAobW9kZWxBcnRpZmFjdHMgPT0gbnVsbCkge1xuICAgICAgICAgIC8vIFJlYWQgbW9kZWwgb3V0IGZyb20gb2JqZWN0IHN0b3JlLlxuICAgICAgICAgIGNvbnN0IG1vZGVsVHggPSBkYi50cmFuc2FjdGlvbihNT0RFTF9TVE9SRV9OQU1FLCAncmVhZG9ubHknKTtcbiAgICAgICAgICBjb25zdCBtb2RlbFN0b3JlID0gbW9kZWxUeC5vYmplY3RTdG9yZShNT0RFTF9TVE9SRV9OQU1FKTtcbiAgICAgICAgICBjb25zdCBnZXRSZXF1ZXN0ID0gbW9kZWxTdG9yZS5nZXQodGhpcy5tb2RlbFBhdGgpO1xuICAgICAgICAgIGdldFJlcXVlc3Qub25zdWNjZXNzID0gKCkgPT4ge1xuICAgICAgICAgICAgaWYgKGdldFJlcXVlc3QucmVzdWx0ID09IG51bGwpIHtcbiAgICAgICAgICAgICAgZGIuY2xvc2UoKTtcbiAgICAgICAgICAgICAgcmV0dXJuIHJlamVjdChuZXcgRXJyb3IoXG4gICAgICAgICAgICAgICAgICBgQ2Fubm90IGZpbmQgbW9kZWwgd2l0aCBwYXRoICcke3RoaXMubW9kZWxQYXRofScgYCArXG4gICAgICAgICAgICAgICAgICBgaW4gSW5kZXhlZERCLmApKTtcbiAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgIHJlc29sdmUoZ2V0UmVxdWVzdC5yZXN1bHQubW9kZWxBcnRpZmFjdHMpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgIH07XG4gICAgICAgICAgZ2V0UmVxdWVzdC5vbmVycm9yID0gZXJyb3IgPT4ge1xuICAgICAgICAgICAgZGIuY2xvc2UoKTtcbiAgICAgICAgICAgIHJldHVybiByZWplY3QoZ2V0UmVxdWVzdC5lcnJvcik7XG4gICAgICAgICAgfTtcbiAgICAgICAgICBtb2RlbFR4Lm9uY29tcGxldGUgPSAoKSA9PiBkYi5jbG9zZSgpO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIC8vIFB1dCBtb2RlbCBpbnRvIG9iamVjdCBzdG9yZS5cbiAgICAgICAgICBjb25zdCBtb2RlbEFydGlmYWN0c0luZm86IE1vZGVsQXJ0aWZhY3RzSW5mbyA9XG4gICAgICAgICAgICAgIGdldE1vZGVsQXJ0aWZhY3RzSW5mb0ZvckpTT04obW9kZWxBcnRpZmFjdHMpO1xuICAgICAgICAgIC8vIEZpcnN0LCBwdXQgTW9kZWxBcnRpZmFjdHNJbmZvIGludG8gaW5mbyBzdG9yZS5cbiAgICAgICAgICBjb25zdCBpbmZvVHggPSBkYi50cmFuc2FjdGlvbihJTkZPX1NUT1JFX05BTUUsICdyZWFkd3JpdGUnKTtcbiAgICAgICAgICBsZXQgaW5mb1N0b3JlID0gaW5mb1R4Lm9iamVjdFN0b3JlKElORk9fU1RPUkVfTkFNRSk7XG4gICAgICAgICAgY29uc3QgcHV0SW5mb1JlcXVlc3QgPVxuICAgICAgICAgICAgICBpbmZvU3RvcmUucHV0KHttb2RlbFBhdGg6IHRoaXMubW9kZWxQYXRoLCBtb2RlbEFydGlmYWN0c0luZm99KTtcbiAgICAgICAgICBsZXQgbW9kZWxUeDogSURCVHJhbnNhY3Rpb247XG4gICAgICAgICAgcHV0SW5mb1JlcXVlc3Qub25zdWNjZXNzID0gKCkgPT4ge1xuICAgICAgICAgICAgLy8gU2Vjb25kLCBwdXQgbW9kZWwgZGF0YSBpbnRvIG1vZGVsIHN0b3JlLlxuICAgICAgICAgICAgbW9kZWxUeCA9IGRiLnRyYW5zYWN0aW9uKE1PREVMX1NUT1JFX05BTUUsICdyZWFkd3JpdGUnKTtcbiAgICAgICAgICAgIGNvbnN0IG1vZGVsU3RvcmUgPSBtb2RlbFR4Lm9iamVjdFN0b3JlKE1PREVMX1NUT1JFX05BTUUpO1xuICAgICAgICAgICAgY29uc3QgcHV0TW9kZWxSZXF1ZXN0ID0gbW9kZWxTdG9yZS5wdXQoe1xuICAgICAgICAgICAgICBtb2RlbFBhdGg6IHRoaXMubW9kZWxQYXRoLFxuICAgICAgICAgICAgICBtb2RlbEFydGlmYWN0cyxcbiAgICAgICAgICAgICAgbW9kZWxBcnRpZmFjdHNJbmZvXG4gICAgICAgICAgICB9KTtcbiAgICAgICAgICAgIHB1dE1vZGVsUmVxdWVzdC5vbnN1Y2Nlc3MgPSAoKSA9PiByZXNvbHZlKHttb2RlbEFydGlmYWN0c0luZm99KTtcbiAgICAgICAgICAgIHB1dE1vZGVsUmVxdWVzdC5vbmVycm9yID0gZXJyb3IgPT4ge1xuICAgICAgICAgICAgICAvLyBJZiB0aGUgcHV0LW1vZGVsIHJlcXVlc3QgZmFpbHMsIHJvbGwgYmFjayB0aGUgaW5mbyBlbnRyeSBhc1xuICAgICAgICAgICAgICAvLyB3ZWxsLlxuICAgICAgICAgICAgICBpbmZvU3RvcmUgPSBpbmZvVHgub2JqZWN0U3RvcmUoSU5GT19TVE9SRV9OQU1FKTtcbiAgICAgICAgICAgICAgY29uc3QgZGVsZXRlSW5mb1JlcXVlc3QgPSBpbmZvU3RvcmUuZGVsZXRlKHRoaXMubW9kZWxQYXRoKTtcbiAgICAgICAgICAgICAgZGVsZXRlSW5mb1JlcXVlc3Qub25zdWNjZXNzID0gKCkgPT4ge1xuICAgICAgICAgICAgICAgIGRiLmNsb3NlKCk7XG4gICAgICAgICAgICAgICAgcmV0dXJuIHJlamVjdChwdXRNb2RlbFJlcXVlc3QuZXJyb3IpO1xuICAgICAgICAgICAgICB9O1xuICAgICAgICAgICAgICBkZWxldGVJbmZvUmVxdWVzdC5vbmVycm9yID0gZXJyb3IgPT4ge1xuICAgICAgICAgICAgICAgIGRiLmNsb3NlKCk7XG4gICAgICAgICAgICAgICAgcmV0dXJuIHJlamVjdChwdXRNb2RlbFJlcXVlc3QuZXJyb3IpO1xuICAgICAgICAgICAgICB9O1xuICAgICAgICAgICAgfTtcbiAgICAgICAgICB9O1xuICAgICAgICAgIHB1dEluZm9SZXF1ZXN0Lm9uZXJyb3IgPSBlcnJvciA9PiB7XG4gICAgICAgICAgICBkYi5jbG9zZSgpO1xuICAgICAgICAgICAgcmV0dXJuIHJlamVjdChwdXRJbmZvUmVxdWVzdC5lcnJvcik7XG4gICAgICAgICAgfTtcbiAgICAgICAgICBpbmZvVHgub25jb21wbGV0ZSA9ICgpID0+IHtcbiAgICAgICAgICAgIGlmIChtb2RlbFR4ID09IG51bGwpIHtcbiAgICAgICAgICAgICAgZGIuY2xvc2UoKTtcbiAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgIG1vZGVsVHgub25jb21wbGV0ZSA9ICgpID0+IGRiLmNsb3NlKCk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgfTtcbiAgICAgICAgfVxuICAgICAgfTtcbiAgICAgIG9wZW5SZXF1ZXN0Lm9uZXJyb3IgPSBlcnJvciA9PiByZWplY3Qob3BlblJlcXVlc3QuZXJyb3IpO1xuICAgIH0pO1xuICB9XG59XG5cbmV4cG9ydCBjb25zdCBpbmRleGVkREJSb3V0ZXI6IElPUm91dGVyID0gKHVybDogc3RyaW5nfHN0cmluZ1tdKSA9PiB7XG4gIGlmICghZW52KCkuZ2V0Qm9vbCgnSVNfQlJPV1NFUicpKSB7XG4gICAgcmV0dXJuIG51bGw7XG4gIH0gZWxzZSB7XG4gICAgaWYgKCFBcnJheS5pc0FycmF5KHVybCkgJiYgdXJsLnN0YXJ0c1dpdGgoQnJvd3NlckluZGV4ZWREQi5VUkxfU0NIRU1FKSkge1xuICAgICAgcmV0dXJuIGJyb3dzZXJJbmRleGVkREIodXJsLnNsaWNlKEJyb3dzZXJJbmRleGVkREIuVVJMX1NDSEVNRS5sZW5ndGgpKTtcbiAgICB9IGVsc2Uge1xuICAgICAgcmV0dXJuIG51bGw7XG4gICAgfVxuICB9XG59O1xuSU9Sb3V0ZXJSZWdpc3RyeS5yZWdpc3RlclNhdmVSb3V0ZXIoaW5kZXhlZERCUm91dGVyKTtcbklPUm91dGVyUmVnaXN0cnkucmVnaXN0ZXJMb2FkUm91dGVyKGluZGV4ZWREQlJvdXRlcik7XG5cbi8qKlxuICogQ3JlYXRlcyBhIGJyb3dzZXIgSW5kZXhlZERCIElPSGFuZGxlciBmb3Igc2F2aW5nIGFuZCBsb2FkaW5nIG1vZGVscy5cbiAqXG4gKiBgYGBqc1xuICogY29uc3QgbW9kZWwgPSB0Zi5zZXF1ZW50aWFsKCk7XG4gKiBtb2RlbC5hZGQoXG4gKiAgICAgdGYubGF5ZXJzLmRlbnNlKHt1bml0czogMSwgaW5wdXRTaGFwZTogWzEwMF0sIGFjdGl2YXRpb246ICdzaWdtb2lkJ30pKTtcbiAqXG4gKiBjb25zdCBzYXZlUmVzdWx0ID0gYXdhaXQgbW9kZWwuc2F2ZSgnaW5kZXhlZGRiOi8vTXlNb2RlbCcpKTtcbiAqIGNvbnNvbGUubG9nKHNhdmVSZXN1bHQpO1xuICogYGBgXG4gKlxuICogQHBhcmFtIG1vZGVsUGF0aCBBIHVuaXF1ZSBpZGVudGlmaWVyIGZvciB0aGUgbW9kZWwgdG8gYmUgc2F2ZWQuIE11c3QgYmUgYVxuICogICBub24tZW1wdHkgc3RyaW5nLlxuICogQHJldHVybnMgQW4gaW5zdGFuY2Ugb2YgYEJyb3dzZXJJbmRleGVkREJgIChzdWJsY2FzcyBvZiBgSU9IYW5kbGVyYCksXG4gKiAgIHdoaWNoIGNhbiBiZSB1c2VkIHdpdGgsIGUuZy4sIGB0Zi5Nb2RlbC5zYXZlYC5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGJyb3dzZXJJbmRleGVkREIobW9kZWxQYXRoOiBzdHJpbmcpOiBJT0hhbmRsZXIge1xuICByZXR1cm4gbmV3IEJyb3dzZXJJbmRleGVkREIobW9kZWxQYXRoKTtcbn1cblxuZnVuY3Rpb24gbWF5YmVTdHJpcFNjaGVtZShrZXk6IHN0cmluZykge1xuICByZXR1cm4ga2V5LnN0YXJ0c1dpdGgoQnJvd3NlckluZGV4ZWREQi5VUkxfU0NIRU1FKSA/XG4gICAgICBrZXkuc2xpY2UoQnJvd3NlckluZGV4ZWREQi5VUkxfU0NIRU1FLmxlbmd0aCkgOlxuICAgICAga2V5O1xufVxuXG5leHBvcnQgY2xhc3MgQnJvd3NlckluZGV4ZWREQk1hbmFnZXIgaW1wbGVtZW50cyBNb2RlbFN0b3JlTWFuYWdlciB7XG4gIHByaXZhdGUgaW5kZXhlZERCOiBJREJGYWN0b3J5O1xuXG4gIGNvbnN0cnVjdG9yKCkge1xuICAgIHRoaXMuaW5kZXhlZERCID0gZ2V0SW5kZXhlZERCRmFjdG9yeSgpO1xuICB9XG5cbiAgYXN5bmMgbGlzdE1vZGVscygpOiBQcm9taXNlPHtbcGF0aDogc3RyaW5nXTogTW9kZWxBcnRpZmFjdHNJbmZvfT4ge1xuICAgIHJldHVybiBuZXcgUHJvbWlzZTx7W3BhdGg6IHN0cmluZ106IE1vZGVsQXJ0aWZhY3RzSW5mb30+KFxuICAgICAgICAocmVzb2x2ZSwgcmVqZWN0KSA9PiB7XG4gICAgICAgICAgY29uc3Qgb3BlblJlcXVlc3QgPVxuICAgICAgICAgICAgICB0aGlzLmluZGV4ZWREQi5vcGVuKERBVEFCQVNFX05BTUUsIERBVEFCQVNFX1ZFUlNJT04pO1xuICAgICAgICAgIG9wZW5SZXF1ZXN0Lm9udXBncmFkZW5lZWRlZCA9ICgpID0+IHNldFVwRGF0YWJhc2Uob3BlblJlcXVlc3QpO1xuXG4gICAgICAgICAgb3BlblJlcXVlc3Qub25zdWNjZXNzID0gKCkgPT4ge1xuICAgICAgICAgICAgY29uc3QgZGIgPSBvcGVuUmVxdWVzdC5yZXN1bHQ7XG4gICAgICAgICAgICBjb25zdCB0eCA9IGRiLnRyYW5zYWN0aW9uKElORk9fU1RPUkVfTkFNRSwgJ3JlYWRvbmx5Jyk7XG4gICAgICAgICAgICBjb25zdCBzdG9yZSA9IHR4Lm9iamVjdFN0b3JlKElORk9fU1RPUkVfTkFNRSk7XG4gICAgICAgICAgICAvLyB0c2xpbnQ6ZGlzYWJsZTptYXgtbGluZS1sZW5ndGhcbiAgICAgICAgICAgIC8vIE5lZWQgdG8gY2FzdCBgc3RvcmVgIGFzIGBhbnlgIGhlcmUgYmVjYXVzZSBUeXBlU2NyaXB0J3MgRE9NXG4gICAgICAgICAgICAvLyBsaWJyYXJ5IGRvZXMgbm90IGhhdmUgdGhlIGBnZXRBbGwoKWAgbWV0aG9kIGV2ZW4gdGhvdWdoIHRoZVxuICAgICAgICAgICAgLy8gbWV0aG9kIGlzIHN1cHBvcnRlZCBpbiB0aGUgbGF0ZXN0IHZlcnNpb24gb2YgbW9zdCBtYWluc3RyZWFtXG4gICAgICAgICAgICAvLyBicm93c2VyczpcbiAgICAgICAgICAgIC8vIGh0dHBzOi8vZGV2ZWxvcGVyLm1vemlsbGEub3JnL2VuLVVTL2RvY3MvV2ViL0FQSS9JREJPYmplY3RTdG9yZS9nZXRBbGxcbiAgICAgICAgICAgIC8vIHRzbGludDplbmFibGU6bWF4LWxpbmUtbGVuZ3RoXG4gICAgICAgICAgICAvLyB0c2xpbnQ6ZGlzYWJsZS1uZXh0LWxpbmU6bm8tYW55XG4gICAgICAgICAgICBjb25zdCBnZXRBbGxJbmZvUmVxdWVzdCA9IChzdG9yZSBhcyBhbnkpLmdldEFsbCgpIGFzIElEQlJlcXVlc3Q7XG4gICAgICAgICAgICBnZXRBbGxJbmZvUmVxdWVzdC5vbnN1Y2Nlc3MgPSAoKSA9PiB7XG4gICAgICAgICAgICAgIGNvbnN0IG91dDoge1twYXRoOiBzdHJpbmddOiBNb2RlbEFydGlmYWN0c0luZm99ID0ge307XG4gICAgICAgICAgICAgIGZvciAoY29uc3QgaXRlbSBvZiBnZXRBbGxJbmZvUmVxdWVzdC5yZXN1bHQpIHtcbiAgICAgICAgICAgICAgICBvdXRbaXRlbS5tb2RlbFBhdGhdID0gaXRlbS5tb2RlbEFydGlmYWN0c0luZm87XG4gICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgcmVzb2x2ZShvdXQpO1xuICAgICAgICAgICAgfTtcbiAgICAgICAgICAgIGdldEFsbEluZm9SZXF1ZXN0Lm9uZXJyb3IgPSBlcnJvciA9PiB7XG4gICAgICAgICAgICAgIGRiLmNsb3NlKCk7XG4gICAgICAgICAgICAgIHJldHVybiByZWplY3QoZ2V0QWxsSW5mb1JlcXVlc3QuZXJyb3IpO1xuICAgICAgICAgICAgfTtcbiAgICAgICAgICAgIHR4Lm9uY29tcGxldGUgPSAoKSA9PiBkYi5jbG9zZSgpO1xuICAgICAgICAgIH07XG4gICAgICAgICAgb3BlblJlcXVlc3Qub25lcnJvciA9IGVycm9yID0+IHJlamVjdChvcGVuUmVxdWVzdC5lcnJvcik7XG4gICAgICAgIH0pO1xuICB9XG5cbiAgYXN5bmMgcmVtb3ZlTW9kZWwocGF0aDogc3RyaW5nKTogUHJvbWlzZTxNb2RlbEFydGlmYWN0c0luZm8+IHtcbiAgICBwYXRoID0gbWF5YmVTdHJpcFNjaGVtZShwYXRoKTtcbiAgICByZXR1cm4gbmV3IFByb21pc2U8TW9kZWxBcnRpZmFjdHNJbmZvPigocmVzb2x2ZSwgcmVqZWN0KSA9PiB7XG4gICAgICBjb25zdCBvcGVuUmVxdWVzdCA9IHRoaXMuaW5kZXhlZERCLm9wZW4oREFUQUJBU0VfTkFNRSwgREFUQUJBU0VfVkVSU0lPTik7XG4gICAgICBvcGVuUmVxdWVzdC5vbnVwZ3JhZGVuZWVkZWQgPSAoKSA9PiBzZXRVcERhdGFiYXNlKG9wZW5SZXF1ZXN0KTtcblxuICAgICAgb3BlblJlcXVlc3Qub25zdWNjZXNzID0gKCkgPT4ge1xuICAgICAgICBjb25zdCBkYiA9IG9wZW5SZXF1ZXN0LnJlc3VsdDtcbiAgICAgICAgY29uc3QgaW5mb1R4ID0gZGIudHJhbnNhY3Rpb24oSU5GT19TVE9SRV9OQU1FLCAncmVhZHdyaXRlJyk7XG4gICAgICAgIGNvbnN0IGluZm9TdG9yZSA9IGluZm9UeC5vYmplY3RTdG9yZShJTkZPX1NUT1JFX05BTUUpO1xuXG4gICAgICAgIGNvbnN0IGdldEluZm9SZXF1ZXN0ID0gaW5mb1N0b3JlLmdldChwYXRoKTtcbiAgICAgICAgbGV0IG1vZGVsVHg6IElEQlRyYW5zYWN0aW9uO1xuICAgICAgICBnZXRJbmZvUmVxdWVzdC5vbnN1Y2Nlc3MgPSAoKSA9PiB7XG4gICAgICAgICAgaWYgKGdldEluZm9SZXF1ZXN0LnJlc3VsdCA9PSBudWxsKSB7XG4gICAgICAgICAgICBkYi5jbG9zZSgpO1xuICAgICAgICAgICAgcmV0dXJuIHJlamVjdChuZXcgRXJyb3IoXG4gICAgICAgICAgICAgICAgYENhbm5vdCBmaW5kIG1vZGVsIHdpdGggcGF0aCAnJHtwYXRofScgYCArXG4gICAgICAgICAgICAgICAgYGluIEluZGV4ZWREQi5gKSk7XG4gICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIC8vIEZpcnN0LCBkZWxldGUgdGhlIGVudHJ5IGluIHRoZSBpbmZvIHN0b3JlLlxuICAgICAgICAgICAgY29uc3QgZGVsZXRlSW5mb1JlcXVlc3QgPSBpbmZvU3RvcmUuZGVsZXRlKHBhdGgpO1xuICAgICAgICAgICAgY29uc3QgZGVsZXRlTW9kZWxEYXRhID0gKCkgPT4ge1xuICAgICAgICAgICAgICAvLyBTZWNvbmQsIGRlbGV0ZSB0aGUgZW50cnkgaW4gdGhlIG1vZGVsIHN0b3JlLlxuICAgICAgICAgICAgICBtb2RlbFR4ID0gZGIudHJhbnNhY3Rpb24oTU9ERUxfU1RPUkVfTkFNRSwgJ3JlYWR3cml0ZScpO1xuICAgICAgICAgICAgICBjb25zdCBtb2RlbFN0b3JlID0gbW9kZWxUeC5vYmplY3RTdG9yZShNT0RFTF9TVE9SRV9OQU1FKTtcbiAgICAgICAgICAgICAgY29uc3QgZGVsZXRlTW9kZWxSZXF1ZXN0ID0gbW9kZWxTdG9yZS5kZWxldGUocGF0aCk7XG4gICAgICAgICAgICAgIGRlbGV0ZU1vZGVsUmVxdWVzdC5vbnN1Y2Nlc3MgPSAoKSA9PlxuICAgICAgICAgICAgICAgICAgcmVzb2x2ZShnZXRJbmZvUmVxdWVzdC5yZXN1bHQubW9kZWxBcnRpZmFjdHNJbmZvKTtcbiAgICAgICAgICAgICAgZGVsZXRlTW9kZWxSZXF1ZXN0Lm9uZXJyb3IgPSBlcnJvciA9PlxuICAgICAgICAgICAgICAgICAgcmVqZWN0KGdldEluZm9SZXF1ZXN0LmVycm9yKTtcbiAgICAgICAgICAgIH07XG4gICAgICAgICAgICAvLyBQcm9jZWVkIHdpdGggZGVsZXRpbmcgbW9kZWwgZGF0YSByZWdhcmRsZXNzIG9mIHdoZXRoZXIgZGVsZXRpb25cbiAgICAgICAgICAgIC8vIG9mIGluZm8gZGF0YSBzdWNjZWVkcyBvciBub3QuXG4gICAgICAgICAgICBkZWxldGVJbmZvUmVxdWVzdC5vbnN1Y2Nlc3MgPSBkZWxldGVNb2RlbERhdGE7XG4gICAgICAgICAgICBkZWxldGVJbmZvUmVxdWVzdC5vbmVycm9yID0gZXJyb3IgPT4ge1xuICAgICAgICAgICAgICBkZWxldGVNb2RlbERhdGEoKTtcbiAgICAgICAgICAgICAgZGIuY2xvc2UoKTtcbiAgICAgICAgICAgICAgcmV0dXJuIHJlamVjdChnZXRJbmZvUmVxdWVzdC5lcnJvcik7XG4gICAgICAgICAgICB9O1xuICAgICAgICAgIH1cbiAgICAgICAgfTtcbiAgICAgICAgZ2V0SW5mb1JlcXVlc3Qub25lcnJvciA9IGVycm9yID0+IHtcbiAgICAgICAgICBkYi5jbG9zZSgpO1xuICAgICAgICAgIHJldHVybiByZWplY3QoZ2V0SW5mb1JlcXVlc3QuZXJyb3IpO1xuICAgICAgICB9O1xuXG4gICAgICAgIGluZm9UeC5vbmNvbXBsZXRlID0gKCkgPT4ge1xuICAgICAgICAgIGlmIChtb2RlbFR4ID09IG51bGwpIHtcbiAgICAgICAgICAgIGRiLmNsb3NlKCk7XG4gICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIG1vZGVsVHgub25jb21wbGV0ZSA9ICgpID0+IGRiLmNsb3NlKCk7XG4gICAgICAgICAgfVxuICAgICAgICB9O1xuICAgICAgfTtcbiAgICAgIG9wZW5SZXF1ZXN0Lm9uZXJyb3IgPSBlcnJvciA9PiByZWplY3Qob3BlblJlcXVlc3QuZXJyb3IpO1xuICAgIH0pO1xuICB9XG59XG4iXX0=","/**\n * @license\n * Copyright 2018 Google LLC. All Rights Reserved.\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n * =============================================================================\n */\nimport '../flags';\nimport { env } from '../environment';\nimport { assert } from '../util';\nimport { arrayBufferToBase64String, base64StringToArrayBuffer, getModelArtifactsInfoForJSON } from './io_utils';\nimport { IORouterRegistry } from './router_registry';\nconst PATH_SEPARATOR = '/';\nconst PATH_PREFIX = 'tensorflowjs_models';\nconst INFO_SUFFIX = 'info';\nconst MODEL_TOPOLOGY_SUFFIX = 'model_topology';\nconst WEIGHT_SPECS_SUFFIX = 'weight_specs';\nconst WEIGHT_DATA_SUFFIX = 'weight_data';\nconst MODEL_METADATA_SUFFIX = 'model_metadata';\n/**\n * Purge all tensorflow.js-saved model artifacts from local storage.\n *\n * @returns Paths of the models purged.\n */\nexport function purgeLocalStorageArtifacts() {\n if (!env().getBool('IS_BROWSER') || typeof window === 'undefined' ||\n typeof window.localStorage === 'undefined') {\n throw new Error('purgeLocalStorageModels() cannot proceed because local storage is ' +\n 'unavailable in the current environment.');\n }\n const LS = window.localStorage;\n const purgedModelPaths = [];\n for (let i = 0; i < LS.length; ++i) {\n const key = LS.key(i);\n const prefix = PATH_PREFIX + PATH_SEPARATOR;\n if (key.startsWith(prefix) && key.length > prefix.length) {\n LS.removeItem(key);\n const modelName = getModelPathFromKey(key);\n if (purgedModelPaths.indexOf(modelName) === -1) {\n purgedModelPaths.push(modelName);\n }\n }\n }\n return purgedModelPaths;\n}\nfunction getModelKeys(path) {\n return {\n info: [PATH_PREFIX, path, INFO_SUFFIX].join(PATH_SEPARATOR),\n topology: [PATH_PREFIX, path, MODEL_TOPOLOGY_SUFFIX].join(PATH_SEPARATOR),\n weightSpecs: [PATH_PREFIX, path, WEIGHT_SPECS_SUFFIX].join(PATH_SEPARATOR),\n weightData: [PATH_PREFIX, path, WEIGHT_DATA_SUFFIX].join(PATH_SEPARATOR),\n modelMetadata: [PATH_PREFIX, path, MODEL_METADATA_SUFFIX].join(PATH_SEPARATOR)\n };\n}\nfunction removeItems(keys) {\n for (const key of Object.values(keys)) {\n window.localStorage.removeItem(key);\n }\n}\n/**\n * Get model path from a local-storage key.\n *\n * E.g., 'tensorflowjs_models/my/model/1/info' --> 'my/model/1'\n *\n * @param key\n */\nfunction getModelPathFromKey(key) {\n const items = key.split(PATH_SEPARATOR);\n if (items.length < 3) {\n throw new Error(`Invalid key format: ${key}`);\n }\n return items.slice(1, items.length - 1).join(PATH_SEPARATOR);\n}\nfunction maybeStripScheme(key) {\n return key.startsWith(BrowserLocalStorage.URL_SCHEME) ?\n key.slice(BrowserLocalStorage.URL_SCHEME.length) :\n key;\n}\n/**\n * IOHandler subclass: Browser Local Storage.\n *\n * See the doc string to `browserLocalStorage` for more details.\n */\nexport class BrowserLocalStorage {\n constructor(modelPath) {\n if (!env().getBool('IS_BROWSER') || typeof window === 'undefined' ||\n typeof window.localStorage === 'undefined') {\n // TODO(cais): Add more info about what IOHandler subtypes are\n // available.\n // Maybe point to a doc page on the web and/or automatically determine\n // the available IOHandlers and print them in the error message.\n throw new Error('The current environment does not support local storage.');\n }\n this.LS = window.localStorage;\n if (modelPath == null || !modelPath) {\n throw new Error('For local storage, modelPath must not be null, undefined or empty.');\n }\n this.modelPath = modelPath;\n this.keys = getModelKeys(this.modelPath);\n }\n /**\n * Save model artifacts to browser local storage.\n *\n * See the documentation to `browserLocalStorage` for details on the saved\n * artifacts.\n *\n * @param modelArtifacts The model artifacts to be stored.\n * @returns An instance of SaveResult.\n */\n async save(modelArtifacts) {\n if (modelArtifacts.modelTopology instanceof ArrayBuffer) {\n throw new Error('BrowserLocalStorage.save() does not support saving model topology ' +\n 'in binary formats yet.');\n }\n else {\n const topology = JSON.stringify(modelArtifacts.modelTopology);\n const weightSpecs = JSON.stringify(modelArtifacts.weightSpecs);\n const modelArtifactsInfo = getModelArtifactsInfoForJSON(modelArtifacts);\n try {\n this.LS.setItem(this.keys.info, JSON.stringify(modelArtifactsInfo));\n this.LS.setItem(this.keys.topology, topology);\n this.LS.setItem(this.keys.weightSpecs, weightSpecs);\n this.LS.setItem(this.keys.weightData, arrayBufferToBase64String(modelArtifacts.weightData));\n // Note that JSON.stringify doesn't write out keys that have undefined\n // values, so for some keys, we set undefined instead of a null-ish\n // value.\n const metadata = {\n format: modelArtifacts.format,\n generatedBy: modelArtifacts.generatedBy,\n convertedBy: modelArtifacts.convertedBy,\n signature: modelArtifacts.signature != null ?\n modelArtifacts.signature :\n undefined,\n userDefinedMetadata: modelArtifacts.userDefinedMetadata != null ?\n modelArtifacts.userDefinedMetadata :\n undefined,\n modelInitializer: modelArtifacts.modelInitializer != null ?\n modelArtifacts.modelInitializer :\n undefined,\n trainingConfig: modelArtifacts.trainingConfig != null ?\n modelArtifacts.trainingConfig :\n undefined\n };\n this.LS.setItem(this.keys.modelMetadata, JSON.stringify(metadata));\n return { modelArtifactsInfo };\n }\n catch (err) {\n // If saving failed, clean up all items saved so far.\n removeItems(this.keys);\n throw new Error(`Failed to save model '${this.modelPath}' to local storage: ` +\n `size quota being exceeded is a possible cause of this failure: ` +\n `modelTopologyBytes=${modelArtifactsInfo.modelTopologyBytes}, ` +\n `weightSpecsBytes=${modelArtifactsInfo.weightSpecsBytes}, ` +\n `weightDataBytes=${modelArtifactsInfo.weightDataBytes}.`);\n }\n }\n }\n /**\n * Load a model from local storage.\n *\n * See the documentation to `browserLocalStorage` for details on the saved\n * artifacts.\n *\n * @returns The loaded model (if loading succeeds).\n */\n async load() {\n const info = JSON.parse(this.LS.getItem(this.keys.info));\n if (info == null) {\n throw new Error(`In local storage, there is no model with name '${this.modelPath}'`);\n }\n if (info.modelTopologyType !== 'JSON') {\n throw new Error('BrowserLocalStorage does not support loading non-JSON model ' +\n 'topology yet.');\n }\n const out = {};\n // Load topology.\n const topology = JSON.parse(this.LS.getItem(this.keys.topology));\n if (topology == null) {\n throw new Error(`In local storage, the topology of model '${this.modelPath}' ` +\n `is missing.`);\n }\n out.modelTopology = topology;\n // Load weight specs.\n const weightSpecs = JSON.parse(this.LS.getItem(this.keys.weightSpecs));\n if (weightSpecs == null) {\n throw new Error(`In local storage, the weight specs of model '${this.modelPath}' ` +\n `are missing.`);\n }\n out.weightSpecs = weightSpecs;\n // Load meta-data fields.\n const metadataString = this.LS.getItem(this.keys.modelMetadata);\n if (metadataString != null) {\n const metadata = JSON.parse(metadataString);\n out.format = metadata.format;\n out.generatedBy = metadata.generatedBy;\n out.convertedBy = metadata.convertedBy;\n if (metadata.signature != null) {\n out.signature = metadata.signature;\n }\n if (metadata.userDefinedMetadata != null) {\n out.userDefinedMetadata = metadata.userDefinedMetadata;\n }\n if (metadata.modelInitializer != null) {\n out.modelInitializer = metadata.modelInitializer;\n }\n if (metadata.trainingConfig != null) {\n out.trainingConfig = metadata.trainingConfig;\n }\n }\n // Load weight data.\n const weightDataBase64 = this.LS.getItem(this.keys.weightData);\n if (weightDataBase64 == null) {\n throw new Error(`In local storage, the binary weight values of model ` +\n `'${this.modelPath}' are missing.`);\n }\n out.weightData = base64StringToArrayBuffer(weightDataBase64);\n return out;\n }\n}\nBrowserLocalStorage.URL_SCHEME = 'localstorage://';\nexport const localStorageRouter = (url) => {\n if (!env().getBool('IS_BROWSER')) {\n return null;\n }\n else {\n if (!Array.isArray(url) && url.startsWith(BrowserLocalStorage.URL_SCHEME)) {\n return browserLocalStorage(url.slice(BrowserLocalStorage.URL_SCHEME.length));\n }\n else {\n return null;\n }\n }\n};\nIORouterRegistry.registerSaveRouter(localStorageRouter);\nIORouterRegistry.registerLoadRouter(localStorageRouter);\n/**\n * Factory function for local storage IOHandler.\n *\n * This `IOHandler` supports both `save` and `load`.\n *\n * For each model's saved artifacts, four items are saved to local storage.\n * - `${PATH_SEPARATOR}/${modelPath}/info`: Contains meta-info about the\n * model, such as date saved, type of the topology, size in bytes, etc.\n * - `${PATH_SEPARATOR}/${modelPath}/topology`: Model topology. For Keras-\n * style models, this is a stringized JSON.\n * - `${PATH_SEPARATOR}/${modelPath}/weight_specs`: Weight specs of the\n * model, can be used to decode the saved binary weight values (see\n * item below).\n * - `${PATH_SEPARATOR}/${modelPath}/weight_data`: Concatenated binary\n * weight values, stored as a base64-encoded string.\n *\n * Saving may throw an `Error` if the total size of the artifacts exceed the\n * browser-specific quota.\n *\n * @param modelPath A unique identifier for the model to be saved. Must be a\n * non-empty string.\n * @returns An instance of `IOHandler`, which can be used with, e.g.,\n * `tf.Model.save`.\n */\nexport function browserLocalStorage(modelPath) {\n return new BrowserLocalStorage(modelPath);\n}\nexport class BrowserLocalStorageManager {\n constructor() {\n assert(env().getBool('IS_BROWSER'), () => 'Current environment is not a web browser');\n assert(typeof window === 'undefined' ||\n typeof window.localStorage !== 'undefined', () => 'Current browser does not appear to support localStorage');\n this.LS = window.localStorage;\n }\n async listModels() {\n const out = {};\n const prefix = PATH_PREFIX + PATH_SEPARATOR;\n const suffix = PATH_SEPARATOR + INFO_SUFFIX;\n for (let i = 0; i < this.LS.length; ++i) {\n const key = this.LS.key(i);\n if (key.startsWith(prefix) && key.endsWith(suffix)) {\n const modelPath = getModelPathFromKey(key);\n out[modelPath] = JSON.parse(this.LS.getItem(key));\n }\n }\n return out;\n }\n async removeModel(path) {\n path = maybeStripScheme(path);\n const keys = getModelKeys(path);\n if (this.LS.getItem(keys.info) == null) {\n throw new Error(`Cannot find model at path '${path}'`);\n }\n const info = JSON.parse(this.LS.getItem(keys.info));\n removeItems(keys);\n return info;\n }\n}\n//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibG9jYWxfc3RvcmFnZS5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uLy4uL3RmanMtY29yZS9zcmMvaW8vbG9jYWxfc3RvcmFnZS50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQTs7Ozs7Ozs7Ozs7Ozs7O0dBZUc7QUFFSCxPQUFPLFVBQVUsQ0FBQztBQUNsQixPQUFPLEVBQUMsR0FBRyxFQUFDLE1BQU0sZ0JBQWdCLENBQUM7QUFFbkMsT0FBTyxFQUFDLE1BQU0sRUFBQyxNQUFNLFNBQVMsQ0FBQztBQUMvQixPQUFPLEVBQUMseUJBQXlCLEVBQUUseUJBQXlCLEVBQUUsNEJBQTRCLEVBQUMsTUFBTSxZQUFZLENBQUM7QUFDOUcsT0FBTyxFQUFXLGdCQUFnQixFQUFDLE1BQU0sbUJBQW1CLENBQUM7QUFHN0QsTUFBTSxjQUFjLEdBQUcsR0FBRyxDQUFDO0FBQzNCLE1BQU0sV0FBVyxHQUFHLHFCQUFxQixDQUFDO0FBQzFDLE1BQU0sV0FBVyxHQUFHLE1BQU0sQ0FBQztBQUMzQixNQUFNLHFCQUFxQixHQUFHLGdCQUFnQixDQUFDO0FBQy9DLE1BQU0sbUJBQW1CLEdBQUcsY0FBYyxDQUFDO0FBQzNDLE1BQU0sa0JBQWtCLEdBQUcsYUFBYSxDQUFDO0FBQ3pDLE1BQU0scUJBQXFCLEdBQUcsZ0JBQWdCLENBQUM7QUFFL0M7Ozs7R0FJRztBQUNILE1BQU0sVUFBVSwwQkFBMEI7SUFDeEMsSUFBSSxDQUFDLEdBQUcsRUFBRSxDQUFDLE9BQU8sQ0FBQyxZQUFZLENBQUMsSUFBSSxPQUFPLE1BQU0sS0FBSyxXQUFXO1FBQzdELE9BQU8sTUFBTSxDQUFDLFlBQVksS0FBSyxXQUFXLEVBQUU7UUFDOUMsTUFBTSxJQUFJLEtBQUssQ0FDWCxvRUFBb0U7WUFDcEUseUNBQXlDLENBQUMsQ0FBQztLQUNoRDtJQUNELE1BQU0sRUFBRSxHQUFHLE1BQU0sQ0FBQyxZQUFZLENBQUM7SUFDL0IsTUFBTSxnQkFBZ0IsR0FBYSxFQUFFLENB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Q0FBQyxDQUF1QixDQUFDO2FBQ3pFO1NBQ0Y7UUFDRCxPQUFPLEdBQUcsQ0FBQztJQUNiLENBQUM7SUFFRCxLQUFLLENBQUMsV0FBVyxDQUFDLElBQVk7UUFDNUIsSUFBSSxHQUFHLGdCQUFnQixDQUFDLElBQUksQ0FBQyxDQUFDO1FBQzlCLE1BQU0sSUFBSSxHQUFHLFlBQVksQ0FBQyxJQUFJLENBQUMsQ0FBQztRQUNoQyxJQUFJLElBQUksQ0FBQyxFQUFFLENBQUMsT0FBTyxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsSUFBSSxJQUFJLEVBQUU7WUFDdEMsTUFBTSxJQUFJLEtBQUssQ0FBQyw4QkFBOEIsSUFBSSxHQUFHLENBQUMsQ0FBQztTQUN4RDtRQUNELE1BQU0sSUFBSSxHQUFHLElBQUksQ0FBQyxLQUFLLENBQUMsSUFBSSxDQUFDLEVBQUUsQ0FBQyxPQUFPLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxDQUF1QixDQUFDO1FBQzFFLFdBQVcsQ0FBQyxJQUFJLENBQUMsQ0FBQztRQUNsQixPQUFPLElBQUksQ0FBQztJQUNkLENBQUM7Q0FDRiIsInNvdXJjZXNDb250ZW50IjpbIi8qKlxuICogQGxpY2Vuc2VcbiAqIENvcHlyaWdodCAyMDE4IEdvb2dsZSBMTEMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuXG4gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgXCJMaWNlbnNlXCIpO1xuICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLlxuICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0XG4gKlxuICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wXG4gKlxuICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZVxuICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gXCJBUyBJU1wiIEJBU0lTLFxuICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuXG4gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kXG4gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS5cbiAqID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4gKi9cblxuaW1wb3J0ICcuLi9mbGFncyc7XG5pbXBvcnQge2Vudn0gZnJvbSAnLi4vZW52aXJvbm1lbnQnO1xuXG5pbXBvcnQge2Fzc2VydH0gZnJvbSAnLi4vdXRpbCc7XG5pbXBvcnQge2FycmF5QnVmZmVyVG9CYXNlNjRTdHJpbmcsIGJhc2U2NFN0cmluZ1RvQXJyYXlCdWZmZXIsIGdldE1vZGVsQXJ0aWZhY3RzSW5mb0ZvckpTT059IGZyb20gJy4vaW9fdXRpbHMnO1xuaW1wb3J0IHtJT1JvdXRlciwgSU9Sb3V0ZXJSZWdpc3RyeX0gZnJvbSAnLi9yb3V0ZXJfcmVnaXN0cnknO1xuaW1wb3J0IHtJT0hhbmRsZXIsIE1vZGVsQXJ0aWZhY3RzLCBNb2RlbEFydGlmYWN0c0luZm8sIE1vZGVsSlNPTiwgTW9kZWxTdG9yZU1hbmFnZXIsIFNhdmVSZXN1bHR9IGZyb20gJy4vdHlwZXMnO1xuXG5jb25zdCBQQVRIX1NFUEFSQVRPUiA9ICcvJztcbmNvbnN0IFBBVEhfUFJFRklYID0gJ3RlbnNvcmZsb3dqc19tb2RlbHMnO1xuY29uc3QgSU5GT19TVUZGSVggPSAnaW5mbyc7XG5jb25zdCBNT0RFTF9UT1BPTE9HWV9TVUZGSVggPSAnbW9kZWxfdG9wb2xvZ3knO1xuY29uc3QgV0VJR0hUX1NQRUNTX1NVRkZJWCA9ICd3ZWlnaHRfc3BlY3MnO1xuY29uc3QgV0VJR0hUX0RBVEFfU1VGRklYID0gJ3dlaWdodF9kYXRhJztcbmNvbnN0IE1PREVMX01FVEFEQVRBX1NVRkZJWCA9ICdtb2RlbF9tZXRhZGF0YSc7XG5cbi8qKlxuICogUHVyZ2UgYWxsIHRlbnNvcmZsb3cuanMtc2F2ZWQgbW9kZWwgYXJ0aWZhY3RzIGZyb20gbG9jYWwgc3RvcmFnZS5cbiAqXG4gKiBAcmV0dXJucyBQYXRocyBvZiB0aGUgbW9kZWxzIHB1cmdlZC5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHB1cmdlTG9jYWxTdG9yYWdlQXJ0aWZhY3RzKCk6IHN0cmluZ1tdIHtcbiAgaWYgKCFlbnYoKS5nZXRCb29sKCdJU19CUk9XU0VSJykgfHwgdHlwZW9mIHdpbmRvdyA9PT0gJ3VuZGVmaW5lZCcgfHxcbiAgICAgIHR5cGVvZiB3aW5kb3cubG9jYWxTdG9yYWdlID09PSAndW5kZWZpbmVkJykge1xuICAgIHRocm93IG5ldyBFcnJvcihcbiAgICAgICAgJ3B1cmdlTG9jYWxTdG9yYWdlTW9kZWxzKCkgY2Fubm90IHByb2NlZWQgYmVjYXVzZSBsb2NhbCBzdG9yYWdlIGlzICcgK1xuICAgICAgICAndW5hdmFpbGFibGUgaW4gdGhlIGN1cnJlbnQgZW52aXJvbm1lbnQuJyk7XG4gIH1cbiAgY29uc3QgTFMgPSB3aW5kb3cubG9jYWxTdG9yYWdlO1xuICBjb25zdCBwdXJnZWRNb2RlbFBhdGhzOiBzdHJpbmdbXSA9IFtdO1xuICBmb3IgKGxldCBpID0gMDsgaSA8IExTLmxlbmd0aDsgKytpKSB7XG4gICAgY29uc3Qga2V5ID0gTFMua2V5KGkpO1xuICAgIGNvbnN0IHByZWZpeCA9IFBBVEhfUFJFRklYICsgUEFUSF9TRVBBUkFUT1I7XG4gICAgaWYgKGtleS5zdGFydHNXaXRoKHByZWZpeCkgJiYga2V5Lmxlbmd0aCA+IHByZWZpeC5sZW5ndGgpIHtcbiAgICAgIExTLnJlbW92ZUl0ZW0oa2V5KTtcbiAgICAgIGNvbnN0IG1vZGVsTmFtZSA9IGdldE1vZGVsUGF0aEZyb21LZXkoa2V5KTtcbiAgICAgIGlmIChwdXJnZWRNb2RlbFBhdGhzLmluZGV4T2YobW9kZWxOYW1lKSA9PT0gLTEpIHtcbiAgICAgICAgcHVyZ2VkTW9kZWxQYXRocy5wdXNoKG1vZGVsTmFtZSk7XG4gICAgICB9XG4gICAgfVxuICB9XG4gIHJldHVybiBwdXJnZWRNb2RlbFBhdGhzO1xufVxuXG50eXBlIExvY2FsU3RvcmFnZUtleXMgPSB7XG4gIC8qKiBLZXkgb2YgdGhlIGxvY2FsU3RvcmFnZSBlbnRyeSBzdG9yaW5nIGBNb2RlbEFydGlmYWN0c0luZm9gLiAqL1xuICBpbmZvOiBzdHJpbmcsXG4gIC8qKlxuICAgKiBLZXkgb2YgdGhlIGxvY2FsU3RvcmFnZSBlbnRyeSBzdG9yaW5nIHRoZSAnbW9kZWxUb3BvbG9neScga2V5IG9mXG4gICAqIGBtb2RlbC5qc29uYFxuICAgKi9cbiAgdG9wb2xvZ3k6IHN0cmluZyxcbiAgLyoqXG4gICAqIEtleSBvZiB0aGUgbG9jYWxTdG9yYWdlIGVudHJ5IHN0b3JpbmcgdGhlIGB3ZWlnaHRzTWFuaWZlc3Qud2VpZ2h0c2AgZW50cmllc1xuICAgKiBvZiBgbW9kZWwuanNvbmBcbiAgICovXG4gIHdlaWdodFNwZWNzOiBzdHJpbmcsXG4gIC8qKiBLZXkgb2YgdGhlIGxvY2FsU3RvcmFnZSBlbnRyeSBzdG9yaW5nIHRoZSB3ZWlnaHQgZGF0YSBpbiBCYXNlNjQgKi9cbiAgd2VpZ2h0RGF0YTogc3RyaW5nLFxuICAvKipcbiAgICogS2V5IG9mIHRoZSBsb2NhbFN0b3JhZ2UgZW50cnkgc3RvcmluZyB0aGUgcmVtYWluaW5nIGZpZWxkcyBvZiBgbW9kZWwuanNvbmBcbiAgICogQHNlZSB7QGxpbmsgTW9kZWxNZXRhZGF0YX1cbiAgICovXG4gIG1vZGVsTWV0YWRhdGE6IHN0cmluZyxcbn07XG5cbnR5cGUgTW9kZWxNZXRhZGF0YSA9IE9taXQ8TW9kZWxKU09OLCAnbW9kZWxUb3BvbG9neSd8J3dlaWdodHNNYW5pZmVzdCc+O1xuXG5mdW5jdGlvbiBnZXRNb2RlbEtleXMocGF0aDogc3RyaW5nKTogTG9jYWxTdG9yYWdlS2V5cyB7XG4gIHJldHVybiB7XG4gICAgaW5mbzogW1BBVEhfUFJFRklYLCBwYXRoLCBJTkZPX1NVRkZJWF0uam9pbihQQVRIX1NFUEFSQVRPUiksXG4gICAgdG9wb2xvZ3k6IFtQQVRIX1BSRUZJWCwgcGF0aCwgTU9ERUxfVE9QT0xPR1lfU1VGRklYXS5qb2luKFBBVEhfU0VQQVJBVE9SKSxcbiAgICB3ZWlnaHRTcGVjczogW1BBVEhfUFJFRklYLCBwYXRoLCBXRUlHSFRfU1BFQ1NfU1VGRklYXS5qb2luKFBBVEhfU0VQQVJBVE9SKSxcbiAgICB3ZWlnaHREYXRhOiBbUEFUSF9QUkVGSVgsIHBhdGgsIFdFSUdIVF9EQVRBX1NVRkZJWF0uam9pbihQQVRIX1NFUEFSQVRPUiksXG4gICAgbW9kZWxNZXRhZGF0YTpcbiAgICAgICAgW1BBVEhfUFJFRklYLCBwYXRoLCBNT0RFTF9NRVRBREFUQV9TVUZGSVhdLmpvaW4oUEFUSF9TRVBBUkFUT1IpXG4gIH07XG59XG5cbmZ1bmN0aW9uIHJlbW92ZUl0ZW1zKGtleXM6IExvY2FsU3RvcmFnZUtleXMpOiB2b2lkIHtcbiAgZm9yIChjb25zdCBrZXkgb2YgT2JqZWN0LnZhbHVlcyhrZXlzKSkge1xuICAgIHdpbmRvdy5sb2NhbFN0b3JhZ2UucmVtb3ZlSXRlbShrZXkpO1xuICB9XG59XG5cbi8qKlxuICogR2V0IG1vZGVsIHBhdGggZnJvbSBhIGxvY2FsLXN0b3JhZ2Uga2V5LlxuICpcbiAqIEUuZy4sICd0ZW5zb3JmbG93anNfbW9kZWxzL215L21vZGVsLzEvaW5mbycgLS0+ICdteS9tb2RlbC8xJ1xuICpcbiAqIEBwYXJhbSBrZXlcbiAqL1xuZnVuY3Rpb24gZ2V0TW9kZWxQYXRoRnJvbUtleShrZXk6IHN0cmluZykge1xuICBjb25zdCBpdGVtcyA9IGtleS5zcGxpdChQQVRIX1NFUEFSQVRPUik7XG4gIGlmIChpdGVtcy5sZW5ndGggPCAzKSB7XG4gICAgdGhyb3cgbmV3IEVycm9yKGBJbnZhbGlkIGtleSBmb3JtYXQ6ICR7a2V5fWApO1xuICB9XG4gIHJldHVybiBpdGVtcy5zbGljZSgxLCBpdGVtcy5sZW5ndGggLSAxKS5qb2luKFBBVEhfU0VQQVJBVE9SKTtcbn1cblxuZnVuY3Rpb24gbWF5YmVTdHJpcFNjaGVtZShrZXk6IHN0cmluZykge1xuICByZXR1cm4ga2V5LnN0YXJ0c1dpdGgoQnJvd3NlckxvY2FsU3RvcmFnZS5VUkxfU0NIRU1FKSA/XG4gICAgICBrZXkuc2xpY2UoQnJvd3NlckxvY2FsU3RvcmFnZS5VUkxfU0NIRU1FLmxlbmd0aCkgOlxuICAgICAga2V5O1xufVxuXG4vKipcbiAqIElPSGFuZGxlciBzdWJjbGFzczogQnJvd3NlciBMb2NhbCBTdG9yYWdlLlxuICpcbiAqIFNlZSB0aGUgZG9jIHN0cmluZyB0byBgYnJvd3NlckxvY2FsU3RvcmFnZWAgZm9yIG1vcmUgZGV0YWlscy5cbiAqL1xuZXhwb3J0IGNsYXNzIEJyb3dzZXJMb2NhbFN0b3JhZ2UgaW1wbGVtZW50cyBJT0hhbmRsZXIge1xuICBwcm90ZWN0ZWQgcmVhZG9ubHkgTFM6IFN0b3JhZ2U7XG4gIHByb3RlY3RlZCByZWFkb25seSBtb2RlbFBhdGg6IHN0cmluZztcbiAgcHJvdGVjdGVkIHJlYWRvbmx5IGtleXM6IExvY2FsU3RvcmFnZUtleXM7XG5cbiAgc3RhdGljIHJlYWRvbmx5IFVSTF9TQ0hFTUUgPSAnbG9jYWxzdG9yYWdlOi8vJztcblxuICBjb25zdHJ1Y3Rvcihtb2RlbFBhdGg6IHN0cmluZykge1xuICAgIGlmICghZW52KCkuZ2V0Qm9vbCgnSVNfQlJPV1NFUicpIHx8IHR5cGVvZiB3aW5kb3cgPT09ICd1bmRlZmluZWQnIHx8XG4gICAgICAgIHR5cGVvZiB3aW5kb3cubG9jYWxTdG9yYWdlID09PSAndW5kZWZpbmVkJykge1xuICAgICAgLy8gVE9ETyhjYWlzKTogQWRkIG1vcmUgaW5mbyBhYm91dCB3aGF0IElPSGFuZGxlciBzdWJ0eXBlcyBhcmVcbiAgICAgIC8vIGF2YWlsYWJsZS5cbiAgICAgIC8vICAgTWF5YmUgcG9pbnQgdG8gYSBkb2MgcGFnZSBvbiB0aGUgd2ViIGFuZC9vciBhdXRvbWF0aWNhbGx5IGRldGVybWluZVxuICAgICAgLy8gICB0aGUgYXZhaWxhYmxlIElPSGFuZGxlcnMgYW5kIHByaW50IHRoZW0gaW4gdGhlIGVycm9yIG1lc3NhZ2UuXG4gICAgICB0aHJvdyBuZXcgRXJyb3IoXG4gICAgICAgICAgJ1RoZSBjdXJyZW50IGVudmlyb25tZW50IGRvZXMgbm90IHN1cHBvcnQgbG9jYWwgc3RvcmFnZS4nKTtcbiAgICB9XG4gICAgdGhpcy5MUyA9IHdpbmRvdy5sb2NhbFN0b3JhZ2U7XG5cbiAgICBpZiAobW9kZWxQYXRoID09IG51bGwgfHwgIW1vZGVsUGF0aCkge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKFxuICAgICAgICAgICdGb3IgbG9jYWwgc3RvcmFnZSwgbW9kZWxQYXRoIG11c3Qgbm90IGJlIG51bGwsIHVuZGVmaW5lZCBvciBlbXB0eS4nKTtcbiAgICB9XG4gICAgdGhpcy5tb2RlbFBhdGggPSBtb2RlbFBhdGg7XG4gICAgdGhpcy5rZXlzID0gZ2V0TW9kZWxLZXlzKHRoaXMubW9kZWxQYXRoKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBTYXZlIG1vZGVsIGFydGlmYWN0cyB0byBicm93c2VyIGxvY2FsIHN0b3JhZ2UuXG4gICAqXG4gICAqIFNlZSB0aGUgZG9jdW1lbnRhdGlvbiB0byBgYnJvd3NlckxvY2FsU3RvcmFnZWAgZm9yIGRldGFpbHMgb24gdGhlIHNhdmVkXG4gICAqIGFydGlmYWN0cy5cbiAgICpcbiAgICogQHBhcmFtIG1vZGVsQXJ0aWZhY3RzIFRoZSBtb2RlbCBhcnRpZmFjdHMgdG8gYmUgc3RvcmVkLlxuICAgKiBAcmV0dXJucyBBbiBpbnN0YW5jZSBvZiBTYXZlUmVzdWx0LlxuICAgKi9cbiAgYXN5bmMgc2F2ZShtb2RlbEFydGlmYWN0czogTW9kZWxBcnRpZmFjdHMpOiBQcm9taXNlPFNhdmVSZXN1bHQ+IHtcbiAgICBpZiAobW9kZWxBcnRpZmFjdHMubW9kZWxUb3BvbG9neSBpbnN0YW5jZW9mIEFycmF5QnVmZmVyKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoXG4gICAgICAgICAgJ0Jyb3dzZXJMb2NhbFN0b3JhZ2Uuc2F2ZSgpIGRvZXMgbm90IHN1cHBvcnQgc2F2aW5nIG1vZGVsIHRvcG9sb2d5ICcgK1xuICAgICAgICAgICdpbiBiaW5hcnkgZm9ybWF0cyB5ZXQuJyk7XG4gICAgfSBlbHNlIHtcbiAgICAgIGNvbnN0IHRvcG9sb2d5ID0gSlNPTi5zdHJpbmdpZnkobW9kZWxBcnRpZmFjdHMubW9kZWxUb3BvbG9neSk7XG4gICAgICBjb25zdCB3ZWlnaHRTcGVjcyA9IEpTT04uc3RyaW5naWZ5KG1vZGVsQXJ0aWZhY3RzLndlaWdodFNwZWNzKTtcblxuICAgICAgY29uc3QgbW9kZWxBcnRpZmFjdHNJbmZvOiBNb2RlbEFydGlmYWN0c0luZm8gPVxuICAgICAgICAgIGdldE1vZGVsQXJ0aWZhY3RzSW5mb0ZvckpTT04obW9kZWxBcnRpZmFjdHMpO1xuXG4gICAgICB0cnkge1xuICAgICAgICB0aGlzLkxTLnNldEl0ZW0odGhpcy5rZXlzLmluZm8sIEpTT04uc3RyaW5naWZ5KG1vZGVsQXJ0aWZhY3RzSW5mbykpO1xuICAgICAgICB0aGlzLkxTLnNldEl0ZW0odGhpcy5rZXlzLnRvcG9sb2d5LCB0b3BvbG9neSk7XG4gICAgICAgIHRoaXMuTFMuc2V0SXRlbSh0aGlzLmtleXMud2VpZ2h0U3BlY3MsIHdlaWdodFNwZWNzKTtcbiAgICAgICAgdGhpcy5MUy5zZXRJdGVtKFxuICAgICAgICAgICAgdGhpcy5rZXlzLndlaWdodERhdGEsXG4gICAgICAgICAgICBhcnJheUJ1ZmZlclRvQmFzZTY0U3RyaW5nKG1vZGVsQXJ0aWZhY3RzLndlaWdodERhdGEpKTtcblxuICAgICAgICAvLyBOb3RlIHRoYXQgSlNPTi5zdHJpbmdpZnkgZG9lc24ndCB3cml0ZSBvdXQga2V5cyB0aGF0IGhhdmUgdW5kZWZpbmVkXG4gICAgICAgIC8vIHZhbHVlcywgc28gZm9yIHNvbWUga2V5cywgd2Ugc2V0IHVuZGVmaW5lZCBpbnN0ZWFkIG9mIGEgbnVsbC1pc2hcbiAgICAgICAgLy8gdmFsdWUuXG4gICAgICAgIGNvbnN0IG1ldGFkYXRhOiBSZXF1aXJlZDxNb2RlbE1ldGFkYXRhPiA9IHtcbiAgICAgICAgICBmb3JtYXQ6IG1vZGVsQXJ0aWZhY3RzLmZvcm1hdCxcbiAgICAgICAgICBnZW5lcmF0ZWRCeTogbW9kZWxBcnRpZmFjdHMuZ2VuZXJhdGVkQnksXG4gICAgICAgICAgY29udmVydGVkQnk6IG1vZGVsQXJ0aWZhY3RzLmNvbnZlcnRlZEJ5LFxuICAgICAgICAgIHNpZ25hdHVyZTogbW9kZWxBcnRpZmFjdHMuc2lnbmF0dXJlICE9IG51bGwgP1xuICAgICAgICAgICAgICBtb2RlbEFydGlmYWN0cy5zaWduYXR1cmUgOlxuICAgICAgICAgICAgICB1bmRlZmluZWQsXG4gICAgICAgICAgdXNlckRlZmluZWRNZXRhZGF0YTogbW9kZWxBcnRpZmFjdHMudXNlckRlZmluZWRNZXRhZGF0YSAhPSBudWxsID9cbiAgICAgICAgICAgICAgbW9kZWxBcnRpZmFjdHMudXNlckRlZmluZWRNZXRhZGF0YSA6XG4gICAgICAgICAgICAgIHVuZGVmaW5lZCxcbiAgICAgICAgICBtb2RlbEluaXRpYWxpemVyOiBtb2RlbEFydGlmYWN0cy5tb2RlbEluaXRpYWxpemVyICE9IG51bGwgP1xuICAgICAgICAgICAgICBtb2RlbEFydGlmYWN0cy5tb2RlbEluaXRpYWxpemVyIDpcbiAgICAgICAgICAgICAgdW5kZWZpbmVkLFxuICAgICAgICAgIHRyYWluaW5nQ29uZmlnOiBtb2RlbEFydGlmYWN0cy50cmFpbmluZ0NvbmZpZyAhPSBudWxsID9cbiAgICAgICAgICAgICAgbW9kZWxBcnRpZmFjdHMudHJhaW5pbmdDb25maWcgOlxuICAgICAgICAgICAgICB1bmRlZmluZWRcbiAgICAgICAgfTtcbiAgICAgICAgdGhpcy5MUy5zZXRJdGVtKHRoaXMua2V5cy5tb2RlbE1ldGFkYXRhLCBKU09OLnN0cmluZ2lmeShtZXRhZGF0YSkpO1xuXG4gICAgICAgIHJldHVybiB7bW9kZWxBcnRpZmFjdHNJbmZvfTtcbiAgICAgIH0gY2F0Y2ggKGVycikge1xuICAgICAgICAvLyBJZiBzYXZpbmcgZmFpbGVkLCBjbGVhbiB1cCBhbGwgaXRlbXMgc2F2ZWQgc28gZmFyLlxuICAgICAgICByZW1vdmVJdGVtcyh0aGlzLmtleXMpO1xuXG4gICAgICAgIHRocm93IG5ldyBFcnJvcihcbiAgICAgICAgICAgIGBGYWlsZWQgdG8gc2F2ZSBtb2RlbCAnJHt0aGlzLm1vZGVsUGF0aH0nIHRvIGxvY2FsIHN0b3JhZ2U6IGAgK1xuICAgICAgICAgICAgYHNpemUgcXVvdGEgYmVpbmcgZXhjZWVkZWQgaXMgYSBwb3NzaWJsZSBjYXVzZSBvZiB0aGlzIGZhaWx1cmU6IGAgK1xuICAgICAgICAgICAgYG1vZGVsVG9wb2xvZ3lCeXRlcz0ke21vZGVsQXJ0aWZhY3RzSW5mby5tb2RlbFRvcG9sb2d5Qnl0ZXN9LCBgICtcbiAgICAgICAgICAgIGB3ZWlnaHRTcGVjc0J5dGVzPSR7bW9kZWxBcnRpZmFjdHNJbmZvLndlaWdodFNwZWNzQnl0ZXN9LCBgICtcbiAgICAgICAgICAgIGB3ZWlnaHREYXRhQnl0ZXM9JHttb2RlbEFydGlmYWN0c0luZm8ud2VpZ2h0RGF0YUJ5dGVzfS5gKTtcbiAgICAgIH1cbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogTG9hZCBhIG1vZGVsIGZyb20gbG9jYWwgc3RvcmFnZS5cbiAgICpcbiAgICogU2VlIHRoZSBkb2N1bWVudGF0aW9uIHRvIGBicm93c2VyTG9jYWxTdG9yYWdlYCBmb3IgZGV0YWlscyBvbiB0aGUgc2F2ZWRcbiAgICogYXJ0aWZhY3RzLlxuICAgKlxuICAgKiBAcmV0dXJucyBUaGUgbG9hZGVkIG1vZGVsIChpZiBsb2FkaW5nIHN1Y2NlZWRzKS5cbiAgICovXG4gIGFzeW5jIGxvYWQoKTogUHJvbWlzZTxNb2RlbEFydGlmYWN0cz4ge1xuICAgIGNvbnN0IGluZm8gPVxuICAgICAgICBKU09OLnBhcnNlKHRoaXMuTFMuZ2V0SXRlbSh0aGlzLmtleXMuaW5mbykpIGFzIE1vZGVsQXJ0aWZhY3RzSW5mbztcbiAgICBpZiAoaW5mbyA9PSBudWxsKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoXG4gICAgICAgICAgYEluIGxvY2FsIHN0b3JhZ2UsIHRoZXJlIGlzIG5vIG1vZGVsIHdpdGggbmFtZSAnJHt0aGlzLm1vZGVsUGF0aH0nYCk7XG4gICAgfVxuXG4gICAgaWYgKGluZm8ubW9kZWxUb3BvbG9neVR5cGUgIT09ICdKU09OJykge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKFxuICAgICAgICAgICdCcm93c2VyTG9jYWxTdG9yYWdlIGRvZXMgbm90IHN1cHBvcnQgbG9hZGluZyBub24tSlNPTiBtb2RlbCAnICtcbiAgICAgICAgICAndG9wb2xvZ3kgeWV0LicpO1xuICAgIH1cblxuICAgIGNvbnN0IG91dDogTW9kZWxBcnRpZmFjdHMgPSB7fTtcblxuICAgIC8vIExvYWQgdG9wb2xvZ3kuXG4gICAgY29uc3QgdG9wb2xvZ3kgPSBKU09OLnBhcnNlKHRoaXMuTFMuZ2V0SXRlbSh0aGlzLmtleXMudG9wb2xvZ3kpKTtcbiAgICBpZiAodG9wb2xvZ3kgPT0gbnVsbCkge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKFxuICAgICAgICAgIGBJbiBsb2NhbCBzdG9yYWdlLCB0aGUgdG9wb2xvZ3kgb2YgbW9kZWwgJyR7dGhpcy5tb2RlbFBhdGh9JyBgICtcbiAgICAgICAgICBgaXMgbWlzc2luZy5gKTtcbiAgICB9XG4gICAgb3V0Lm1vZGVsVG9wb2xvZ3kgPSB0b3BvbG9neTtcblxuICAgIC8vIExvYWQgd2VpZ2h0IHNwZWNzLlxuICAgIGNvbnN0IHdlaWdodFNwZWNzID0gSlNPTi5wYXJzZSh0aGlzLkxTLmdldEl0ZW0odGhpcy5rZXlzLndlaWdodFNwZWNzKSk7XG4gICAgaWYgKHdlaWdodFNwZWNzID09IG51bGwpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcihcbiAgICAgICAgICBgSW4gbG9jYWwgc3RvcmFnZSwgdGhlIHdlaWdodCBzcGVjcyBvZiBtb2RlbCAnJHt0aGlzLm1vZGVsUGF0aH0nIGAgK1xuICAgICAgICAgIGBhcmUgbWlzc2luZy5gKTtcbiAgICB9XG4gICAgb3V0LndlaWdodFNwZWNzID0gd2VpZ2h0U3BlY3M7XG5cbiAgICAvLyBMb2FkIG1ldGEtZGF0YSBmaWVsZHMuXG4gICAgY29uc3QgbWV0YWRhdGFTdHJpbmcgPSB0aGlzLkxTLmdldEl0ZW0odGhpcy5rZXlzLm1vZGVsTWV0YWRhdGEpO1xuICAgIGlmIChtZXRhZGF0YVN0cmluZyAhPSBudWxsKSB7XG4gICAgICBjb25zdCBtZXRhZGF0YSA9IEpTT04ucGFyc2UobWV0YWRhdGFTdHJpbmcpIGFzIE1vZGVsTWV0YWRhdGE7XG4gICAgICBvdXQuZm9ybWF0ID0gbWV0YWRhdGEuZm9ybWF0O1xuICAgICAgb3V0LmdlbmVyYXRlZEJ5ID0gbWV0YWRhdGEuZ2VuZXJhdGVkQnk7XG4gICAgICBvdXQuY29udmVydGVkQnkgPSBtZXRhZGF0YS5jb252ZXJ0ZWRCeTtcbiAgICAgIGlmIChtZXRhZGF0YS5zaWduYXR1cmUgIT0gbnVsbCkge1xuICAgICAgICBvdXQuc2lnbmF0dXJlID0gbWV0YWRhdGEuc2lnbmF0dXJlO1xuICAgICAgfVxuICAgICAgaWYgKG1ldGFkYXRhLnVzZXJEZWZpbmVkTWV0YWRhdGEgIT0gbnVsbCkge1xuICAgICAgICBvdXQudXNlckRlZmluZWRNZXRhZGF0YSA9IG1ldGFkYXRhLnVzZXJEZWZpbmVkTWV0YWRhdGE7XG4gICAgICB9XG4gICAgICBpZiAobWV0YWRhdGEubW9kZWxJbml0aWFsaXplciAhPSBudWxsKSB7XG4gICAgICAgIG91dC5tb2RlbEluaXRpYWxpemVyID0gbWV0YWRhdGEubW9kZWxJbml0aWFsaXplcjtcbiAgICAgIH1cbiAgICAgIGlmIChtZXRhZGF0YS50cmFpbmluZ0NvbmZpZyAhPSBudWxsKSB7XG4gICAgICAgIG91dC50cmFpbmluZ0NvbmZpZyA9IG1ldGFkYXRhLnRyYWluaW5nQ29uZmlnO1xuICAgICAgfVxuICAgIH1cblxuICAgIC8vIExvYWQgd2VpZ2h0IGRhdGEuXG4gICAgY29uc3Qgd2VpZ2h0RGF0YUJhc2U2NCA9IHRoaXMuTFMuZ2V0SXRlbSh0aGlzLmtleXMud2VpZ2h0RGF0YSk7XG4gICAgaWYgKHdlaWdodERhdGFCYXNlNjQgPT0gbnVsbCkge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKFxuICAgICAgICAgIGBJbiBsb2NhbCBzdG9yYWdlLCB0aGUgYmluYXJ5IHdlaWdodCB2YWx1ZXMgb2YgbW9kZWwgYCArXG4gICAgICAgICAgYCcke3RoaXMubW9kZWxQYXRofScgYXJlIG1pc3NpbmcuYCk7XG4gICAgfVxuICAgIG91dC53ZWlnaHREYXRhID0gYmFzZTY0U3RyaW5nVG9BcnJheUJ1ZmZlcih3ZWlnaHREYXRhQmFzZTY0KTtcblxuICAgIHJldHVybiBvdXQ7XG4gIH1cbn1cblxuZXhwb3J0IGNvbnN0IGxvY2FsU3RvcmFnZVJvdXRlcjogSU9Sb3V0ZXIgPSAodXJsOiBzdHJpbmd8c3RyaW5nW10pID0+IHtcbiAgaWYgKCFlbnYoKS5nZXRCb29sKCdJU19CUk9XU0VSJykpIHtcbiAgICByZXR1cm4gbnVsbDtcbiAgfSBlbHNlIHtcbiAgICBpZiAoIUFycmF5LmlzQXJyYXkodXJsKSAmJiB1cmwuc3RhcnRzV2l0aChCcm93c2VyTG9jYWxTdG9yYWdlLlVSTF9TQ0hFTUUpKSB7XG4gICAgICByZXR1cm4gYnJvd3NlckxvY2FsU3RvcmFnZShcbiAgICAgICAgICB1cmwuc2xpY2UoQnJvd3NlckxvY2FsU3RvcmFnZS5VUkxfU0NIRU1FLmxlbmd0aCkpO1xuICAgIH0gZWxzZSB7XG4gICAgICByZXR1cm4gbnVsbDtcbiAgICB9XG4gIH1cbn07XG5JT1JvdXRlclJlZ2lzdHJ5LnJlZ2lzdGVyU2F2ZVJvdXRlcihsb2NhbFN0b3JhZ2VSb3V0ZXIpO1xuSU9Sb3V0ZXJSZWdpc3RyeS5yZWdpc3RlckxvYWRSb3V0ZXIobG9jYWxTdG9yYWdlUm91dGVyKTtcblxuLyoqXG4gKiBGYWN0b3J5IGZ1bmN0aW9uIGZvciBsb2NhbCBzdG9yYWdlIElPSGFuZGxlci5cbiAqXG4gKiBUaGlzIGBJT0hhbmRsZXJgIHN1cHBvcnRzIGJvdGggYHNhdmVgIGFuZCBgbG9hZGAuXG4gKlxuICogRm9yIGVhY2ggbW9kZWwncyBzYXZlZCBhcnRpZmFjdHMsIGZvdXIgaXRlbXMgYXJlIHNhdmVkIHRvIGxvY2FsIHN0b3JhZ2UuXG4gKiAgIC0gYCR7UEFUSF9TRVBBUkFUT1J9LyR7bW9kZWxQYXRofS9pbmZvYDogQ29udGFpbnMgbWV0YS1pbmZvIGFib3V0IHRoZVxuICogICAgIG1vZGVsLCBzdWNoIGFzIGRhdGUgc2F2ZWQsIHR5cGUgb2YgdGhlIHRvcG9sb2d5LCBzaXplIGluIGJ5dGVzLCBldGMuXG4gKiAgIC0gYCR7UEFUSF9TRVBBUkFUT1J9LyR7bW9kZWxQYXRofS90b3BvbG9neWA6IE1vZGVsIHRvcG9sb2d5LiBGb3IgS2VyYXMtXG4gKiAgICAgc3R5bGUgbW9kZWxzLCB0aGlzIGlzIGEgc3RyaW5naXplZCBKU09OLlxuICogICAtIGAke1BBVEhfU0VQQVJBVE9SfS8ke21vZGVsUGF0aH0vd2VpZ2h0X3NwZWNzYDogV2VpZ2h0IHNwZWNzIG9mIHRoZVxuICogICAgIG1vZGVsLCBjYW4gYmUgdXNlZCB0byBkZWNvZGUgdGhlIHNhdmVkIGJpbmFyeSB3ZWlnaHQgdmFsdWVzIChzZWVcbiAqICAgICBpdGVtIGJlbG93KS5cbiAqICAgLSBgJHtQQVRIX1NFUEFSQVRPUn0vJHttb2RlbFBhdGh9L3dlaWdodF9kYXRhYDogQ29uY2F0ZW5hdGVkIGJpbmFyeVxuICogICAgIHdlaWdodCB2YWx1ZXMsIHN0b3JlZCBhcyBhIGJhc2U2NC1lbmNvZGVkIHN0cmluZy5cbiAqXG4gKiBTYXZpbmcgbWF5IHRocm93IGFuIGBFcnJvcmAgaWYgdGhlIHRvdGFsIHNpemUgb2YgdGhlIGFydGlmYWN0cyBleGNlZWQgdGhlXG4gKiBicm93c2VyLXNwZWNpZmljIHF1b3RhLlxuICpcbiAqIEBwYXJhbSBtb2RlbFBhdGggQSB1bmlxdWUgaWRlbnRpZmllciBmb3IgdGhlIG1vZGVsIHRvIGJlIHNhdmVkLiBNdXN0IGJlIGFcbiAqICAgbm9uLWVtcHR5IHN0cmluZy5cbiAqIEByZXR1cm5zIEFuIGluc3RhbmNlIG9mIGBJT0hhbmRsZXJgLCB3aGljaCBjYW4gYmUgdXNlZCB3aXRoLCBlLmcuLFxuICogICBgdGYuTW9kZWwuc2F2ZWAuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBicm93c2VyTG9jYWxTdG9yYWdlKG1vZGVsUGF0aDogc3RyaW5nKTogSU9IYW5kbGVyIHtcbiAgcmV0dXJuIG5ldyBCcm93c2VyTG9jYWxTdG9yYWdlKG1vZGVsUGF0aCk7XG59XG5cbmV4cG9ydCBjbGFzcyBCcm93c2VyTG9jYWxTdG9yYWdlTWFuYWdlciBpbXBsZW1lbnRzIE1vZGVsU3RvcmVNYW5hZ2VyIHtcbiAgcHJpdmF0ZSByZWFkb25seSBMUzogU3RvcmFnZTtcblxuICBjb25zdHJ1Y3RvcigpIHtcbiAgICBhc3NlcnQoXG4gICAgICAgIGVudigpLmdldEJvb2woJ0lTX0JST1dTRVInKSxcbiAgICAgICAgKCkgPT4gJ0N1cnJlbnQgZW52aXJvbm1lbnQgaXMgbm90IGEgd2ViIGJyb3dzZXInKTtcbiAgICBhc3NlcnQoXG4gICAgICAgIHR5cGVvZiB3aW5kb3cgPT09ICd1bmRlZmluZWQnIHx8XG4gICAgICAgICAgICB0eXBlb2Ygd2luZG93LmxvY2FsU3RvcmFnZSAhPT0gJ3VuZGVmaW5lZCcsXG4gICAgICAgICgpID0+ICdDdXJyZW50IGJyb3dzZXIgZG9lcyBub3QgYXBwZWFyIHRvIHN1cHBvcnQgbG9jYWxTdG9yYWdlJyk7XG4gICAgdGhpcy5MUyA9IHdpbmRvdy5sb2NhbFN0b3JhZ2U7XG4gIH1cblxuICBhc3luYyBsaXN0TW9kZWxzKCk6IFByb21pc2U8e1twYXRoOiBzdHJpbmddOiBNb2RlbEFydGlmYWN0c0luZm99PiB7XG4gICAgY29uc3Qgb3V0OiB7W3BhdGg6IHN0cmluZ106IE1vZGVsQXJ0aWZhY3RzSW5mb30gPSB7fTtcbiAgICBjb25zdCBwcmVmaXggPSBQQVRIX1BSRUZJWCArIFBBVEhfU0VQQVJBVE9SO1xuICAgIGNvbnN0IHN1ZmZpeCA9IFBBVEhfU0VQQVJBVE9SICsgSU5GT19TVUZGSVg7XG4gICAgZm9yIChsZXQgaSA9IDA7IGkgPCB0aGlzLkxTLmxlbmd0aDsgKytpKSB7XG4gICAgICBjb25zdCBrZXkgPSB0aGlzLkxTLmtleShpKTtcbiAgICAgIGlmIChrZXkuc3RhcnRzV2l0aChwcmVmaXgpICYmIGtleS5lbmRzV2l0aChzdWZmaXgpKSB7XG4gICAgICAgIGNvbnN0IG1vZGVsUGF0aCA9IGdldE1vZGVsUGF0aEZyb21LZXkoa2V5KTtcbiAgICAgICAgb3V0W21vZGVsUGF0aF0gPSBKU09OLnBhcnNlKHRoaXMuTFMuZ2V0SXRlbShrZXkpKSBhcyBNb2RlbEFydGlmYWN0c0luZm87XG4gICAgICB9XG4gICAgfVxuICAgIHJldHVybiBvdXQ7XG4gIH1cblxuICBhc3luYyByZW1vdmVNb2RlbChwYXRoOiBzdHJpbmcpOiBQcm9taXNlPE1vZGVsQXJ0aWZhY3RzSW5mbz4ge1xuICAgIHBhdGggPSBtYXliZVN0cmlwU2NoZW1lKHBhdGgpO1xuICAgIGNvbnN0IGtleXMgPSBnZXRNb2RlbEtleXMocGF0aCk7XG4gICAgaWYgKHRoaXMuTFMuZ2V0SXRlbShrZXlzLmluZm8pID09IG51bGwpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcihgQ2Fubm90IGZpbmQgbW9kZWwgYXQgcGF0aCAnJHtwYXRofSdgKTtcbiAgICB9XG4gICAgY29uc3QgaW5mbyA9IEpTT04ucGFyc2UodGhpcy5MUy5nZXRJdGVtKGtleXMuaW5mbykpIGFzIE1vZGVsQXJ0aWZhY3RzSW5mbztcbiAgICByZW1vdmVJdGVtcyhrZXlzKTtcbiAgICByZXR1cm4gaW5mbztcbiAgfVxufVxuIl19","/**\n * @license\n * Copyright 2018 Google LLC. All Rights Reserved.\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n * =============================================================================\n */\n/**\n * Classes and functions for model management across multiple storage mediums.\n *\n * Supported client actions:\n * - Listing models on all registered storage mediums.\n * - Remove model by URL from any registered storage mediums, by using URL\n * string.\n * - Moving or copying model from one path to another in the same medium or from\n * one medium to another, by using URL strings.\n */\nimport { assert } from '../util';\nimport { IORouterRegistry } from './router_registry';\nconst URL_SCHEME_SUFFIX = '://';\nexport class ModelStoreManagerRegistry {\n constructor() {\n this.managers = {};\n }\n static getInstance() {\n if (ModelStoreManagerRegistry.instance == null) {\n ModelStoreManagerRegistry.instance = new ModelStoreManagerRegistry();\n }\n return ModelStoreManagerRegistry.instance;\n }\n /**\n * Register a save-handler router.\n *\n * @param saveRouter A function that maps a URL-like string onto an instance\n * of `IOHandler` with the `save` method defined or `null`.\n */\n static registerManager(scheme, manager) {\n assert(scheme != null, () => 'scheme must not be undefined or null.');\n if (scheme.endsWith(URL_SCHEME_SUFFIX)) {\n scheme = scheme.slice(0, scheme.indexOf(URL_SCHEME_SUFFIX));\n }\n assert(scheme.length > 0, () => 'scheme must not be an empty string.');\n const registry = ModelStoreManagerRegistry.getInstance();\n assert(registry.managers[scheme] == null, () => `A model store manager is already registered for scheme '${scheme}'.`);\n registry.managers[scheme] = manager;\n }\n static getManager(scheme) {\n const manager = ModelStoreManagerRegistry.getInstance().managers[scheme];\n if (manager == null) {\n throw new Error(`Cannot find model manager for scheme '${scheme}'`);\n }\n return manager;\n }\n static getSchemes() {\n return Object.keys(ModelStoreManagerRegistry.getInstance().managers);\n }\n}\n/**\n * Helper method for parsing a URL string into a scheme and a path.\n *\n * @param url E.g., 'localstorage://my-model'\n * @returns A dictionary with two fields: scheme and path.\n * Scheme: e.g., 'localstorage' in the example above.\n * Path: e.g., 'my-model' in the example above.\n */\nfunction parseURL(url) {\n if (url.indexOf(URL_SCHEME_SUFFIX) === -1) {\n throw new Error(`The url string provided does not contain a scheme. ` +\n `Supported schemes are: ` +\n `${ModelStoreManagerRegistry.getSchemes().join(',')}`);\n }\n return {\n scheme: url.split(URL_SCHEME_SUFFIX)[0],\n path: url.split(URL_SCHEME_SUFFIX)[1],\n };\n}\nasync function cloneModelInternal(sourceURL, destURL, deleteSource = false) {\n assert(sourceURL !== destURL, () => `Old path and new path are the same: '${sourceURL}'`);\n const loadHandlers = IORouterRegistry.getLoadHandlers(sourceURL);\n assert(loadHandlers.length > 0, () => `Copying failed because no load handler is found for source URL ${sourceURL}.`);\n assert(loadHandlers.length < 2, () => `Copying failed because more than one (${loadHandlers.length}) ` +\n `load handlers for source URL ${sourceURL}.`);\n const loadHandler = loadHandlers[0];\n const saveHandlers = IORouterRegistry.getSaveHandlers(destURL);\n assert(saveHandlers.length > 0, () => `Copying failed because no save handler is found for destination ` +\n `URL ${destURL}.`);\n assert(saveHandlers.length < 2, () => `Copying failed because more than one (${loadHandlers.length}) ` +\n `save handlers for destination URL ${destURL}.`);\n const saveHandler = saveHandlers[0];\n const sourceScheme = parseURL(sourceURL).scheme;\n const sourcePath = parseURL(sourceURL).path;\n const sameMedium = sourceScheme === parseURL(sourceURL).scheme;\n const modelArtifacts = await loadHandler.load();\n // If moving within the same storage medium, remove the old model as soon as\n // the loading is done. Without doing this, it is possible that the combined\n // size of the two models will cause the cloning to fail.\n if (deleteSource && sameMedium) {\n await ModelStoreManagerRegistry.getManager(sourceScheme)\n .removeModel(sourcePath);\n }\n const saveResult = await saveHandler.save(modelArtifacts);\n // If moving between mediums, the deletion is done after the save succeeds.\n // This guards against the case in which saving to the destination medium\n // fails.\n if (deleteSource && !sameMedium) {\n await ModelStoreManagerRegistry.getManager(sourceScheme)\n .removeModel(sourcePath);\n }\n return saveResult.modelArtifactsInfo;\n}\n/**\n * List all models stored in registered storage mediums.\n *\n * For a web browser environment, the registered mediums are Local Storage and\n * IndexedDB.\n *\n * ```js\n * // First create and save a model.\n * const model = tf.sequential();\n * model.add(tf.layers.dense(\n * {units: 1, inputShape: [10], activation: 'sigmoid'}));\n * await model.save('localstorage://demo/management/model1');\n *\n * // Then list existing models.\n * console.log(JSON.stringify(await tf.io.listModels()));\n *\n * // Delete the model.\n * await tf.io.removeModel('localstorage://demo/management/model1');\n *\n * // List models again.\n * console.log(JSON.stringify(await tf.io.listModels()));\n * ```\n *\n * @returns A `Promise` of a dictionary mapping URLs of existing models to\n * their model artifacts info. URLs include medium-specific schemes, e.g.,\n * 'indexeddb://my/model/1'. Model artifacts info include type of the\n * model's topology, byte sizes of the topology, weights, etc.\n *\n * @doc {\n * heading: 'Models',\n * subheading: 'Management',\n * namespace: 'io',\n * ignoreCI: true\n * }\n */\nasync function listModels() {\n const schemes = ModelStoreManagerRegistry.getSchemes();\n const out = {};\n for (const scheme of schemes) {\n const schemeOut = await ModelStoreManagerRegistry.getManager(scheme).listModels();\n for (const path in schemeOut) {\n const url = scheme + URL_SCHEME_SUFFIX + path;\n out[url] = schemeOut[path];\n }\n }\n return out;\n}\n/**\n * Remove a model specified by URL from a registered storage medium.\n *\n * ```js\n * // First create and save a model.\n * const model = tf.sequential();\n * model.add(tf.layers.dense(\n * {units: 1, inputShape: [10], activation: 'sigmoid'}));\n * await model.save('localstorage://demo/management/model1');\n *\n * // Then list existing models.\n * console.log(JSON.stringify(await tf.io.listModels()));\n *\n * // Delete the model.\n * await tf.io.removeModel('localstorage://demo/management/model1');\n *\n * // List models again.\n * console.log(JSON.stringify(await tf.io.listModels()));\n * ```\n *\n * @param url A URL to a stored model, with a scheme prefix, e.g.,\n * 'localstorage://my-model-1', 'indexeddb://my/model/2'.\n * @returns ModelArtifactsInfo of the deleted model (if and only if deletion\n * is successful).\n * @throws Error if deletion fails, e.g., if no model exists at `path`.\n *\n * @doc {\n * heading: 'Models',\n * subheading: 'Management',\n * namespace: 'io',\n * ignoreCI: true\n * }\n */\nasync function removeModel(url) {\n const schemeAndPath = parseURL(url);\n const manager = ModelStoreManagerRegistry.getManager(schemeAndPath.scheme);\n return manager.removeModel(schemeAndPath.path);\n}\n/**\n * Copy a model from one URL to another.\n *\n * This function supports:\n *\n * 1. Copying within a storage medium, e.g.,\n * `tf.io.copyModel('localstorage://model-1', 'localstorage://model-2')`\n * 2. Copying between two storage mediums, e.g.,\n * `tf.io.copyModel('localstorage://model-1', 'indexeddb://model-1')`\n *\n * ```js\n * // First create and save a model.\n * const model = tf.sequential();\n * model.add(tf.layers.dense(\n * {units: 1, inputShape: [10], activation: 'sigmoid'}));\n * await model.save('localstorage://demo/management/model1');\n *\n * // Then list existing models.\n * console.log(JSON.stringify(await tf.io.listModels()));\n *\n * // Copy the model, from Local Storage to IndexedDB.\n * await tf.io.copyModel(\n * 'localstorage://demo/management/model1',\n * 'indexeddb://demo/management/model1');\n *\n * // List models again.\n * console.log(JSON.stringify(await tf.io.listModels()));\n *\n * // Remove both models.\n * await tf.io.removeModel('localstorage://demo/management/model1');\n * await tf.io.removeModel('indexeddb://demo/management/model1');\n * ```\n *\n * @param sourceURL Source URL of copying.\n * @param destURL Destination URL of copying.\n * @returns ModelArtifactsInfo of the copied model (if and only if copying\n * is successful).\n * @throws Error if copying fails, e.g., if no model exists at `sourceURL`, or\n * if `oldPath` and `newPath` are identical.\n *\n * @doc {\n * heading: 'Models',\n * subheading: 'Management',\n * namespace: 'io',\n * ignoreCI: true\n * }\n */\nasync function copyModel(sourceURL, destURL) {\n const deleteSource = false;\n return cloneModelInternal(sourceURL, destURL, deleteSource);\n}\n/**\n * Move a model from one URL to another.\n *\n * This function supports:\n *\n * 1. Moving within a storage medium, e.g.,\n * `tf.io.moveModel('localstorage://model-1', 'localstorage://model-2')`\n * 2. Moving between two storage mediums, e.g.,\n * `tf.io.moveModel('localstorage://model-1', 'indexeddb://model-1')`\n *\n * ```js\n * // First create and save a model.\n * const model = tf.sequential();\n * model.add(tf.layers.dense(\n * {units: 1, inputShape: [10], activation: 'sigmoid'}));\n * await model.save('localstorage://demo/management/model1');\n *\n * // Then list existing models.\n * console.log(JSON.stringify(await tf.io.listModels()));\n *\n * // Move the model, from Local Storage to IndexedDB.\n * await tf.io.moveModel(\n * 'localstorage://demo/management/model1',\n * 'indexeddb://demo/management/model1');\n *\n * // List models again.\n * console.log(JSON.stringify(await tf.io.listModels()));\n *\n * // Remove the moved model.\n * await tf.io.removeModel('indexeddb://demo/management/model1');\n * ```\n *\n * @param sourceURL Source URL of moving.\n * @param destURL Destination URL of moving.\n * @returns ModelArtifactsInfo of the copied model (if and only if copying\n * is successful).\n * @throws Error if moving fails, e.g., if no model exists at `sourceURL`, or\n * if `oldPath` and `newPath` are identical.\n *\n * @doc {\n * heading: 'Models',\n * subheading: 'Management',\n * namespace: 'io',\n * ignoreCI: true\n * }\n */\nasync function moveModel(sourceURL, destURL) {\n const deleteSource = true;\n return cloneModelInternal(sourceURL, destURL, deleteSource);\n}\nexport { moveModel, copyModel, removeModel, listModels };\n//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibW9kZWxfbWFuYWdlbWVudC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uLy4uL3RmanMtY29yZS9zcmMvaW8vbW9kZWxfbWFuYWdlbWVudC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQTs7Ozs7Ozs7Ozs7Ozs7O0dBZUc7QUFFSDs7Ozs7Ozs7O0dBU0c7QUFFSCxPQUFPLEVBQUMsTUFBTSxFQUFDLE1BQU0sU0FBUyxDQUFDO0FBRS9CLE9BQU8sRUFBQyxnQkFBZ0IsRUFBQyxNQUFNLG1CQUFtQixDQUFDO0FBR25ELE1BQU0saUJBQWlCLEdBQUcsS0FBSyxDQUFDO0FBRWhDLE1BQU0sT0FBTyx5QkFBeUI7SUFNcEM7UUFDRSxJQUFJLENBQUMsUUFBUSxHQUFHLEVBQUUsQ0FBQztJQUNyQixDQUFDO0lBRU8sTUFBTSxDQUFDLFdBQVc7UUFDeEIsSUFBSSx5QkFBeUIsQ0FBQyxRQUFRLElBQUksSUFBSSxFQUFFO1lBQzlDLHlCQUF5QixDQUFDLFFBQVEsR0FBRyxJQUFJLHlCQUF5QixFQUFFLENBQUM7U0FDdEU7UUFDRCxPQUFPLHlCQUF5QixDQUFDLFFBQVEsQ0FBQztJQUM1QyxDQUFDO0lBRUQ7Ozs7O09BS0c7SUFDSCxNQUFNLENBQUMsZUFBZSxDQUFDLE1BQWMsRUFBRSxPQUEwQjtRQUMvRCxNQUFNLENBQUMsTUFBTSxJQUFJLElBQUksRUFBRSxHQUFHLEVBQUUsQ0FBQyx1Q0FBdUMsQ0FBQyxDQUFDO1FBQ3RFLElBQUksTUFBTSxDQUFDLFFBQVEsQ0FBQyxpQkFBaUIsQ0FBQyxFQUFFO1lBQ3RDLE1BQU0sR0FBRyxNQUFNLENBQUMsS0FBSyxDQUFDLENBQUMsRUFBRSxNQUFNLENBQUMsT0FBTyxDQUFDLGlCQUFpQixDQUFDLENBQUMsQ0FBQztTQUM3RDtRQUNELE1BQU0sQ0FBQyxNQUFNLENBQUMsTUFBTSxHQUFHLENBQUMsRUFBRSxHQUFHLEVBQUUsQ0FBQyxxQ0FBcUMsQ0FBQyxDQUFDO1FBQ3ZFLE1BQU0s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R0FBRyxDQUFDLEdBQUcsU0FBUyxDQUFDLElBQUksQ0FBQyxDQUFDO1NBQzVCO0tBQ0Y7SUFDRCxPQUFPLEdBQUcsQ0FBQztBQUNiLENBQUM7QUFFRDs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7R0FnQ0c7QUFDSCxLQUFLLFVBQVUsV0FBVyxDQUFDLEdBQVc7SUFDcEMsTUFBTSxhQUFhLEdBQUcsUUFBUSxDQUFDLEdBQUcsQ0FBQyxDQUFDO0lBQ3BDLE1BQU0sT0FBTyxHQUFHLHlCQUF5QixDQUFDLFVBQVUsQ0FBQyxhQUFhLENBQUMsTUFBTSxDQUFDLENBQUM7SUFDM0UsT0FBTyxPQUFPLENBQUMsV0FBVyxDQUFDLGFBQWEsQ0FBQyxJQUFJLENBQUMsQ0FBQztBQUNqRCxDQUFDO0FBRUQ7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7R0E4Q0c7QUFDSCxLQUFLLFVBQVUsU0FBUyxDQUNwQixTQUFpQixFQUFFLE9BQWU7SUFDcEMsTUFBTSxZQUFZLEdBQUcsS0FBSyxDQUFDO0lBQzNCLE9BQU8sa0JBQWtCLENBQUMsU0FBUyxFQUFFLE9BQU8sRUFBRSxZQUFZLENBQUMsQ0FBQztBQUM5RCxDQUFDO0FBRUQ7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7OztHQTZDRztBQUNILEtBQUssVUFBVSxTQUFTLENBQ3BCLFNBQWlCLEVBQUUsT0FBZTtJQUNwQyxNQUFNLFlBQVksR0FBRyxJQUFJLENBQUM7SUFDMUIsT0FBTyxrQkFBa0IsQ0FBQyxTQUFTLEVBQUUsT0FBTyxFQUFFLFlBQVksQ0FBQyxDQUFDO0FBQzlELENBQUM7QUFFRCxPQUFPLEVBQUMsU0FBUyxFQUFFLFNBQVMsRUFBRSxXQUFXLEVBQUUsVUFBVSxFQUFDLENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyIvKipcbiAqIEBsaWNlbnNlXG4gKiBDb3B5cmlnaHQgMjAxOCBHb29nbGUgTExDLiBBbGwgUmlnaHRzIFJlc2VydmVkLlxuICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlIFwiTGljZW5zZVwiKTtcbiAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS5cbiAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdFxuICpcbiAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMFxuICpcbiAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmVcbiAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuIFwiQVMgSVNcIiBCQVNJUyxcbiAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLlxuICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZFxuICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuXG4gKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuICovXG5cbi8qKlxuICogQ2xhc3NlcyBhbmQgZnVuY3Rpb25zIGZvciBtb2RlbCBtYW5hZ2VtZW50IGFjcm9zcyBtdWx0aXBsZSBzdG9yYWdlIG1lZGl1bXMuXG4gKlxuICogU3VwcG9ydGVkIGNsaWVudCBhY3Rpb25zOlxuICogLSBMaXN0aW5nIG1vZGVscyBvbiBhbGwgcmVnaXN0ZXJlZCBzdG9yYWdlIG1lZGl1bXMuXG4gKiAtIFJlbW92ZSBtb2RlbCBieSBVUkwgZnJvbSBhbnkgcmVnaXN0ZXJlZCBzdG9yYWdlIG1lZGl1bXMsIGJ5IHVzaW5nIFVSTFxuICogICBzdHJpbmcuXG4gKiAtIE1vdmluZyBvciBjb3B5aW5nIG1vZGVsIGZyb20gb25lIHBhdGggdG8gYW5vdGhlciBpbiB0aGUgc2FtZSBtZWRpdW0gb3IgZnJvbVxuICogICBvbmUgbWVkaXVtIHRvIGFub3RoZXIsIGJ5IHVzaW5nIFVSTCBzdHJpbmdzLlxuICovXG5cbmltcG9ydCB7YXNzZXJ0fSBmcm9tICcuLi91dGlsJztcblxuaW1wb3J0IHtJT1JvdXRlclJlZ2lzdHJ5fSBmcm9tICcuL3JvdXRlcl9yZWdpc3RyeSc7XG5pbXBvcnQge01vZGVsQXJ0aWZhY3RzSW5mbywgTW9kZWxTdG9yZU1hbmFnZXJ9IGZyb20gJy4vdHlwZXMnO1xuXG5jb25zdCBVUkxfU0NIRU1FX1NVRkZJWCA9ICc6Ly8nO1xuXG5leHBvcnQgY2xhc3MgTW9kZWxTdG9yZU1hbmFnZXJSZWdpc3RyeSB7XG4gIC8vIFNpbmdsZXRvbiBpbnN0YW5jZS5cbiAgcHJpdmF0ZSBzdGF0aWMgaW5zdGFuY2U6IE1vZGVsU3RvcmVNYW5hZ2VyUmVnaXN0cnk7XG5cbiAgcHJpdmF0ZSBtYW5hZ2Vyczoge1tzY2hlbWU6IHN0cmluZ106IE1vZGVsU3RvcmVNYW5hZ2VyfTtcblxuICBwcml2YXRlIGNvbnN0cnVjdG9yKCkge1xuICAgIHRoaXMubWFuYWdlcnMgPSB7fTtcbiAgfVxuXG4gIHByaXZhdGUgc3RhdGljIGdldEluc3RhbmNlKCk6IE1vZGVsU3RvcmVNYW5hZ2VyUmVnaXN0cnkge1xuICAgIGlmIChNb2RlbFN0b3JlTWFuYWdlclJlZ2lzdHJ5Lmluc3RhbmNlID09IG51bGwpIHtcbiAgICAgIE1vZGVsU3RvcmVNYW5hZ2VyUmVnaXN0cnkuaW5zdGFuY2UgPSBuZXcgTW9kZWxTdG9yZU1hbmFnZXJSZWdpc3RyeSgpO1xuICAgIH1cbiAgICByZXR1cm4gTW9kZWxTdG9yZU1hbmFnZXJSZWdpc3RyeS5pbnN0YW5jZTtcbiAgfVxuXG4gIC8qKlxuICAgKiBSZWdpc3RlciBhIHNhdmUtaGFuZGxlciByb3V0ZXIuXG4gICAqXG4gICAqIEBwYXJhbSBzYXZlUm91dGVyIEEgZnVuY3Rpb24gdGhhdCBtYXBzIGEgVVJMLWxpa2Ugc3RyaW5nIG9udG8gYW4gaW5zdGFuY2VcbiAgICogb2YgYElPSGFuZGxlcmAgd2l0aCB0aGUgYHNhdmVgIG1ldGhvZCBkZWZpbmVkIG9yIGBudWxsYC5cbiAgICovXG4gIHN0YXRpYyByZWdpc3Rlck1hbmFnZXIoc2NoZW1lOiBzdHJpbmcsIG1hbmFnZXI6IE1vZGVsU3RvcmVNYW5hZ2VyKSB7XG4gICAgYXNzZXJ0KHNjaGVtZSAhPSBudWxsLCAoKSA9PiAnc2NoZW1lIG11c3Qgbm90IGJlIHVuZGVmaW5lZCBvciBudWxsLicpO1xuICAgIGlmIChzY2hlbWUuZW5kc1dpdGgoVVJMX1NDSEVNRV9TVUZGSVgpKSB7XG4gICAgICBzY2hlbWUgPSBzY2hlbWUuc2xpY2UoMCwgc2NoZW1lLmluZGV4T2YoVVJMX1NDSEVNRV9TVUZGSVgpKTtcbiAgICB9XG4gICAgYXNzZXJ0KHNjaGVtZS5sZW5ndGggPiAwLCAoKSA9PiAnc2NoZW1lIG11c3Qgbm90IGJlIGFuIGVtcHR5IHN0cmluZy4nKTtcbiAgICBjb25zdCByZWdpc3RyeSA9IE1vZGVsU3RvcmVNYW5hZ2VyUmVnaXN0cnkuZ2V0SW5zdGFuY2UoKTtcbiAgICBhc3NlcnQoXG4gICAgICAgIHJlZ2lzdHJ5Lm1hbmFnZXJzW3NjaGVtZV0gPT0gbnVsbCxcbiAgICAgICAgKCkgPT4gYEEgbW9kZWwgc3RvcmUgbWFuYWdlciBpcyBhbHJlYWR5IHJlZ2lzdGVyZWQgZm9yIHNjaGVtZSAnJHtcbiAgICAgICAgICAgIHNjaGVtZX0nLmApO1xuICAgIHJlZ2lzdHJ5Lm1hbmFnZXJzW3NjaGVtZV0gPSBtYW5hZ2VyO1xuICB9XG5cbiAgc3RhdGljIGdldE1hbmFnZXIoc2NoZW1lOiBzdHJpbmcpOiBNb2RlbFN0b3JlTWFuYWdlciB7XG4gICAgY29uc3QgbWFuYWdlciA9IE1vZGVsU3RvcmVNYW5hZ2VyUmVnaXN0cnkuZ2V0SW5zdGFuY2UoKS5tYW5hZ2Vyc1tzY2hlbWVdO1xuICAgIGlmIChtYW5hZ2VyID09IG51bGwpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcihgQ2Fubm90IGZpbmQgbW9kZWwgbWFuYWdlciBmb3Igc2NoZW1lICcke3NjaGVtZX0nYCk7XG4gICAgfVxuICAgIHJldHVybiBtYW5hZ2VyO1xuICB9XG5cbiAgc3RhdGljIGdldFNjaGVtZXMoKTogc3RyaW5nW10ge1xuICAgIHJldHVybiBPYmplY3Qua2V5cyhNb2RlbFN0b3JlTWFuYWdlclJlZ2lzdHJ5LmdldEluc3RhbmNlKCkubWFuYWdlcnMpO1xuICB9XG59XG5cbi8qKlxuICogSGVscGVyIG1ldGhvZCBmb3IgcGFyc2luZyBhIFVSTCBzdHJpbmcgaW50byBhIHNjaGVtZSBhbmQgYSBwYXRoLlxuICpcbiAqIEBwYXJhbSB1cmwgRS5nLiwgJ2xvY2Fsc3RvcmFnZTovL215LW1vZGVsJ1xuICogQHJldHVybnMgQSBkaWN0aW9uYXJ5IHdpdGggdHdvIGZpZWxkczogc2NoZW1lIGFuZCBwYXRoLlxuICogICBTY2hlbWU6IGUuZy4sICdsb2NhbHN0b3JhZ2UnIGluIHRoZSBleGFtcGxlIGFib3ZlLlxuICogICBQYXRoOiBlLmcuLCAnbXktbW9kZWwnIGluIHRoZSBleGFtcGxlIGFib3ZlLlxuICovXG5mdW5jdGlvbiBwYXJzZVVSTCh1cmw6IHN0cmluZyk6IHtzY2hlbWU6IHN0cmluZywgcGF0aDogc3RyaW5nfSB7XG4gIGlmICh1cmwuaW5kZXhPZihVUkxfU0NIRU1FX1NVRkZJWCkgPT09IC0xKSB7XG4gICAgdGhyb3cgbmV3IEVycm9yKFxuICAgICAgICBgVGhlIHVybCBzdHJpbmcgcHJvdmlkZWQgZG9lcyBub3QgY29udGFpbiBhIHNjaGVtZS4gYCArXG4gICAgICAgIGBTdXBwb3J0ZWQgc2NoZW1lcyBhcmU6IGAgK1xuICAgICAgICBgJHtNb2RlbFN0b3JlTWFuYWdlclJlZ2lzdHJ5LmdldFNjaGVtZXMoKS5qb2luKCcsJyl9YCk7XG4gIH1cbiAgcmV0dXJuIHtcbiAgICBzY2hlbWU6IHVybC5zcGxpdChVUkxfU0NIRU1FX1NVRkZJWClbMF0sXG4gICAgcGF0aDogdXJsLnNwbGl0KFVSTF9TQ0hFTUVfU1VGRklYKVsxXSxcbiAgfTtcbn1cblxuYXN5bmMgZnVuY3Rpb24gY2xvbmVNb2RlbEludGVybmFsKFxuICAgIHNvdXJjZVVSTDogc3RyaW5nLCBkZXN0VVJMOiBzdHJpbmcsXG4gICAgZGVsZXRlU291cmNlID0gZmFsc2UpOiBQcm9taXNlPE1vZGVsQXJ0aWZhY3RzSW5mbz4ge1xuICBhc3NlcnQoXG4gICAgICBzb3VyY2VVUkwgIT09IGRlc3RVUkwsXG4gICAgICAoKSA9PiBgT2xkIHBhdGggYW5kIG5ldyBwYXRoIGFyZSB0aGUgc2FtZTogJyR7c291cmNlVVJMfSdgKTtcblxuICBjb25zdCBsb2FkSGFuZGxlcnMgPSBJT1JvdXRlclJlZ2lzdHJ5LmdldExvYWRIYW5kbGVycyhzb3VyY2VVUkwpO1xuICBhc3NlcnQoXG4gICAgICBsb2FkSGFuZGxlcnMubGVuZ3RoID4gMCxcbiAgICAgICgpID0+IGBDb3B5aW5nIGZhaWxlZCBiZWNhdXNlIG5vIGxvYWQgaGFuZGxlciBpcyBmb3VuZCBmb3Igc291cmNlIFVSTCAke1xuICAgICAgICAgIHNvdXJjZVVSTH0uYCk7XG4gIGFzc2VydChcbiAgICAgIGxvYWRIYW5kbGVycy5sZW5ndGggPCAyLFxuICAgICAgKCkgPT4gYENvcHlpbmcgZmFpbGVkIGJlY2F1c2UgbW9yZSB0aGFuIG9uZSAoJHtsb2FkSGFuZGxlcnMubGVuZ3RofSkgYCArXG4gICAgICAgICAgYGxvYWQgaGFuZGxlcnMgZm9yIHNvdXJjZSBVUkwgJHtzb3VyY2VVUkx9LmApO1xuICBjb25zdCBsb2FkSGFuZGxlciA9IGxvYWRIYW5kbGVyc1swXTtcblxuICBjb25zdCBzYXZlSGFuZGxlcnMgPSBJT1JvdXRlclJlZ2lzdHJ5LmdldFNhdmVIYW5kbGVycyhkZXN0VVJMKTtcbiAgYXNzZXJ0KFxuICAgICAgc2F2ZUhhbmRsZXJzLmxlbmd0aCA+IDAsXG4gICAgICAoKSA9PiBgQ29weWluZyBmYWlsZWQgYmVjYXVzZSBubyBzYXZlIGhhbmRsZXIgaXMgZm91bmQgZm9yIGRlc3RpbmF0aW9uIGAgK1xuICAgICAgICAgIGBVUkwgJHtkZXN0VVJMfS5gKTtcbiAgYXNzZXJ0KFxuICAgICAgc2F2ZUhhbmRsZXJzLmxlbmd0aCA8IDIsXG4gICAgICAoKSA9PiBgQ29weWluZyBmYWlsZWQgYmVjYXVzZSBtb3JlIHRoYW4gb25lICgke2xvYWRIYW5kbGVycy5sZW5ndGh9KSBgICtcbiAgICAgICAgICBgc2F2ZSBoYW5kbGVycyBmb3IgZGVzdGluYXRpb24gVVJMICR7ZGVzdFVSTH0uYCk7XG4gIGNvbnN0IHNhdmVIYW5kbGVyID0gc2F2ZUhhbmRsZXJzWzBdO1xuXG4gIGNvbnN0IHNvdXJjZVNjaGVtZSA9IHBhcnNlVVJMKHNvdXJjZVVSTCkuc2NoZW1lO1xuICBjb25zdCBzb3VyY2VQYXRoID0gcGFyc2VVUkwoc291cmNlVVJMKS5wYXRoO1xuICBjb25zdCBzYW1lTWVkaXVtID0gc291cmNlU2NoZW1lID09PSBwYXJzZVVSTChzb3VyY2VVUkwpLnNjaGVtZTtcblxuICBjb25zdCBtb2RlbEFydGlmYWN0cyA9IGF3YWl0IGxvYWRIYW5kbGVyLmxvYWQoKTtcblxuICAvLyBJZiBtb3Zpbmcgd2l0aGluIHRoZSBzYW1lIHN0b3JhZ2UgbWVkaXVtLCByZW1vdmUgdGhlIG9sZCBtb2RlbCBhcyBzb29uIGFzXG4gIC8vIHRoZSBsb2FkaW5nIGlzIGRvbmUuIFdpdGhvdXQgZG9pbmcgdGhpcywgaXQgaXMgcG9zc2libGUgdGhhdCB0aGUgY29tYmluZWRcbiAgLy8gc2l6ZSBvZiB0aGUgdHdvIG1vZGVscyB3aWxsIGNhdXNlIHRoZSBjbG9uaW5nIHRvIGZhaWwuXG4gIGlmIChkZWxldGVTb3VyY2UgJiYgc2FtZU1lZGl1bSkge1xuICAgIGF3YWl0IE1vZGVsU3RvcmVNYW5hZ2VyUmVnaXN0cnkuZ2V0TWFuYWdlcihzb3VyY2VTY2hlbWUpXG4gICAgICAgIC5yZW1vdmVNb2RlbChzb3VyY2VQYXRoKTtcbiAgfVxuXG4gIGNvbnN0IHNhdmVSZXN1bHQgPSBhd2FpdCBzYXZlSGFuZGxlci5zYXZlKG1vZGVsQXJ0aWZhY3RzKTtcblxuICAvLyBJZiBtb3ZpbmcgYmV0d2VlbiBtZWRpdW1zLCB0aGUgZGVsZXRpb24gaXMgZG9uZSBhZnRlciB0aGUgc2F2ZSBzdWNjZWVkcy5cbiAgLy8gVGhpcyBndWFyZHMgYWdhaW5zdCB0aGUgY2FzZSBpbiB3aGljaCBzYXZpbmcgdG8gdGhlIGRlc3RpbmF0aW9uIG1lZGl1bVxuICAvLyBmYWlscy5cbiAgaWYgKGRlbGV0ZVNvdXJjZSAmJiAhc2FtZU1lZGl1bSkge1xuICAgIGF3YWl0IE1vZGVsU3RvcmVNYW5hZ2VyUmVnaXN0cnkuZ2V0TWFuYWdlcihzb3VyY2VTY2hlbWUpXG4gICAgICAgIC5yZW1vdmVNb2RlbChzb3VyY2VQYXRoKTtcbiAgfVxuXG4gIHJldHVybiBzYXZlUmVzdWx0Lm1vZGVsQXJ0aWZhY3RzSW5mbztcbn1cblxuLyoqXG4gKiBMaXN0IGFsbCBtb2RlbHMgc3RvcmVkIGluIHJlZ2lzdGVyZWQgc3RvcmFnZSBtZWRpdW1zLlxuICpcbiAqIEZvciBhIHdlYiBicm93c2VyIGVudmlyb25tZW50LCB0aGUgcmVnaXN0ZXJlZCBtZWRpdW1zIGFyZSBMb2NhbCBTdG9yYWdlIGFuZFxuICogSW5kZXhlZERCLlxuICpcbiAqIGBgYGpzXG4gKiAvLyBGaXJzdCBjcmVhdGUgYW5kIHNhdmUgYSBtb2RlbC5cbiAqIGNvbnN0IG1vZGVsID0gdGYuc2VxdWVudGlhbCgpO1xuICogbW9kZWwuYWRkKHRmLmxheWVycy5kZW5zZShcbiAqICAgICB7dW5pdHM6IDEsIGlucHV0U2hhcGU6IFsxMF0sIGFjdGl2YXRpb246ICdzaWdtb2lkJ30pKTtcbiAqIGF3YWl0IG1vZGVsLnNhdmUoJ2xvY2Fsc3RvcmFnZTovL2RlbW8vbWFuYWdlbWVudC9tb2RlbDEnKTtcbiAqXG4gKiAvLyBUaGVuIGxpc3QgZXhpc3RpbmcgbW9kZWxzLlxuICogY29uc29sZS5sb2coSlNPTi5zdHJpbmdpZnkoYXdhaXQgdGYuaW8ubGlzdE1vZGVscygpKSk7XG4gKlxuICogLy8gRGVsZXRlIHRoZSBtb2RlbC5cbiAqIGF3YWl0IHRmLmlvLnJlbW92ZU1vZGVsKCdsb2NhbHN0b3JhZ2U6Ly9kZW1vL21hbmFnZW1lbnQvbW9kZWwxJyk7XG4gKlxuICogLy8gTGlzdCBtb2RlbHMgYWdhaW4uXG4gKiBjb25zb2xlLmxvZyhKU09OLnN0cmluZ2lmeShhd2FpdCB0Zi5pby5saXN0TW9kZWxzKCkpKTtcbiAqIGBgYFxuICpcbiAqIEByZXR1cm5zIEEgYFByb21pc2VgIG9mIGEgZGljdGlvbmFyeSBtYXBwaW5nIFVSTHMgb2YgZXhpc3RpbmcgbW9kZWxzIHRvXG4gKiB0aGVpciBtb2RlbCBhcnRpZmFjdHMgaW5mby4gVVJMcyBpbmNsdWRlIG1lZGl1bS1zcGVjaWZpYyBzY2hlbWVzLCBlLmcuLFxuICogICAnaW5kZXhlZGRiOi8vbXkvbW9kZWwvMScuIE1vZGVsIGFydGlmYWN0cyBpbmZvIGluY2x1ZGUgdHlwZSBvZiB0aGVcbiAqIG1vZGVsJ3MgdG9wb2xvZ3ksIGJ5dGUgc2l6ZXMgb2YgdGhlIHRvcG9sb2d5LCB3ZWlnaHRzLCBldGMuXG4gKlxuICogQGRvYyB7XG4gKiAgIGhlYWRpbmc6ICdNb2RlbHMnLFxuICogICBzdWJoZWFkaW5nOiAnTWFuYWdlbWVudCcsXG4gKiAgIG5hbWVzcGFjZTogJ2lvJyxcbiAqICAgaWdub3JlQ0k6IHRydWVcbiAqIH1cbiAqL1xuYXN5bmMgZnVuY3Rpb24gbGlzdE1vZGVscygpOiBQcm9taXNlPHtbdXJsOiBzdHJpbmddOiBNb2RlbEFydGlmYWN0c0luZm99PiB7XG4gIGNvbnN0IHNjaGVtZXMgPSBNb2RlbFN0b3JlTWFuYWdlclJlZ2lzdHJ5LmdldFNjaGVtZXMoKTtcbiAgY29uc3Qgb3V0OiB7W3VybDogc3RyaW5nXTogTW9kZWxBcnRpZmFjdHNJbmZvfSA9IHt9O1xuICBmb3IgKGNvbnN0IHNjaGVtZSBvZiBzY2hlbWVzKSB7XG4gICAgY29uc3Qgc2NoZW1lT3V0ID1cbiAgICAgICAgYXdhaXQgTW9kZWxTdG9yZU1hbmFnZXJSZWdpc3RyeS5nZXRNYW5hZ2VyKHNjaGVtZSkubGlzdE1vZGVscygpO1xuICAgIGZvciAoY29uc3QgcGF0aCBpbiBzY2hlbWVPdXQpIHtcbiAgICAgIGNvbnN0IHVybCA9IHNjaGVtZSArIFVSTF9TQ0hFTUVfU1VGRklYICsgcGF0aDtcbiAgICAgIG91dFt1cmxdID0gc2NoZW1lT3V0W3BhdGhdO1xuICAgIH1cbiAgfVxuICByZXR1cm4gb3V0O1xufVxuXG4vKipcbiAqIFJlbW92ZSBhIG1vZGVsIHNwZWNpZmllZCBieSBVUkwgZnJvbSBhIHJlZ2lzdGVyZWQgc3RvcmFnZSBtZWRpdW0uXG4gKlxuICogYGBganNcbiAqIC8vIEZpcnN0IGNyZWF0ZSBhbmQgc2F2ZSBhIG1vZGVsLlxuICogY29uc3QgbW9kZWwgPSB0Zi5zZXF1ZW50aWFsKCk7XG4gKiBtb2RlbC5hZGQodGYubGF5ZXJzLmRlbnNlKFxuICogICAgIHt1bml0czogMSwgaW5wdXRTaGFwZTogWzEwXSwgYWN0aXZhdGlvbjogJ3NpZ21vaWQnfSkpO1xuICogYXdhaXQgbW9kZWwuc2F2ZSgnbG9jYWxzdG9yYWdlOi8vZGVtby9tYW5hZ2VtZW50L21vZGVsMScpO1xuICpcbiAqIC8vIFRoZW4gbGlzdCBleGlzdGluZyBtb2RlbHMuXG4gKiBjb25zb2xlLmxvZyhKU09OLnN0cmluZ2lmeShhd2FpdCB0Zi5pby5saXN0TW9kZWxzKCkpKTtcbiAqXG4gKiAvLyBEZWxldGUgdGhlIG1vZGVsLlxuICogYXdhaXQgdGYuaW8ucmVtb3ZlTW9kZWwoJ2xvY2Fsc3RvcmFnZTovL2RlbW8vbWFuYWdlbWVudC9tb2RlbDEnKTtcbiAqXG4gKiAvLyBMaXN0IG1vZGVscyBhZ2Fpbi5cbiAqIGNvbnNvbGUubG9nKEpTT04uc3RyaW5naWZ5KGF3YWl0IHRmLmlvLmxpc3RNb2RlbHMoKSkpO1xuICogYGBgXG4gKlxuICogQHBhcmFtIHVybCBBIFVSTCB0byBhIHN0b3JlZCBtb2RlbCwgd2l0aCBhIHNjaGVtZSBwcmVmaXgsIGUuZy4sXG4gKiAgICdsb2NhbHN0b3JhZ2U6Ly9teS1tb2RlbC0xJywgJ2luZGV4ZWRkYjovL215L21vZGVsLzInLlxuICogQHJldHVybnMgTW9kZWxBcnRpZmFjdHNJbmZvIG9mIHRoZSBkZWxldGVkIG1vZGVsIChpZiBhbmQgb25seSBpZiBkZWxldGlvblxuICogICBpcyBzdWNjZXNzZnVsKS5cbiAqIEB0aHJvd3MgRXJyb3IgaWYgZGVsZXRpb24gZmFpbHMsIGUuZy4sIGlmIG5vIG1vZGVsIGV4aXN0cyBhdCBgcGF0aGAuXG4gKlxuICogQGRvYyB7XG4gKiAgIGhlYWRpbmc6ICdNb2RlbHMnLFxuICogICBzdWJoZWFkaW5nOiAnTWFuYWdlbWVudCcsXG4gKiAgIG5hbWVzcGFjZTogJ2lvJyxcbiAqICAgaWdub3JlQ0k6IHRydWVcbiAqIH1cbiAqL1xuYXN5bmMgZnVuY3Rpb24gcmVtb3ZlTW9kZWwodXJsOiBzdHJpbmcpOiBQcm9taXNlPE1vZGVsQXJ0aWZhY3RzSW5mbz4ge1xuICBjb25zdCBzY2hlbWVBbmRQYXRoID0gcGFyc2VVUkwodXJsKTtcbiAgY29uc3QgbWFuYWdlciA9IE1vZGVsU3RvcmVNYW5hZ2VyUmVnaXN0cnkuZ2V0TWFuYWdlcihzY2hlbWVBbmRQYXRoLnNjaGVtZSk7XG4gIHJldHVybiBtYW5hZ2VyLnJlbW92ZU1vZGVsKHNjaGVtZUFuZFBhdGgucGF0aCk7XG59XG5cbi8qKlxuICogQ29weSBhIG1vZGVsIGZyb20gb25lIFVSTCB0byBhbm90aGVyLlxuICpcbiAqIFRoaXMgZnVuY3Rpb24gc3VwcG9ydHM6XG4gKlxuICogMS4gQ29weWluZyB3aXRoaW4gYSBzdG9yYWdlIG1lZGl1bSwgZS5nLixcbiAqICAgIGB0Zi5pby5jb3B5TW9kZWwoJ2xvY2Fsc3RvcmFnZTovL21vZGVsLTEnLCAnbG9jYWxzdG9yYWdlOi8vbW9kZWwtMicpYFxuICogMi4gQ29weWluZyBiZXR3ZWVuIHR3byBzdG9yYWdlIG1lZGl1bXMsIGUuZy4sXG4gKiAgICBgdGYuaW8uY29weU1vZGVsKCdsb2NhbHN0b3JhZ2U6Ly9tb2RlbC0xJywgJ2luZGV4ZWRkYjovL21vZGVsLTEnKWBcbiAqXG4gKiBgYGBqc1xuICogLy8gRmlyc3QgY3JlYXRlIGFuZCBzYXZlIGEgbW9kZWwuXG4gKiBjb25zdCBtb2RlbCA9IHRmLnNlcXVlbnRpYWwoKTtcbiAqIG1vZGVsLmFkZCh0Zi5sYXllcnMuZGVuc2UoXG4gKiAgICAge3VuaXRzOiAxLCBpbnB1dFNoYXBlOiBbMTBdLCBhY3RpdmF0aW9uOiAnc2lnbW9pZCd9KSk7XG4gKiBhd2FpdCBtb2RlbC5zYXZlKCdsb2NhbHN0b3JhZ2U6Ly9kZW1vL21hbmFnZW1lbnQvbW9kZWwxJyk7XG4gKlxuICogLy8gVGhlbiBsaXN0IGV4aXN0aW5nIG1vZGVscy5cbiAqIGNvbnNvbGUubG9nKEpTT04uc3RyaW5naWZ5KGF3YWl0IHRmLmlvLmxpc3RNb2RlbHMoKSkpO1xuICpcbiAqIC8vIENvcHkgdGhlIG1vZGVsLCBmcm9tIExvY2FsIFN0b3JhZ2UgdG8gSW5kZXhlZERCLlxuICogYXdhaXQgdGYuaW8uY29weU1vZGVsKFxuICogICAgICdsb2NhbHN0b3JhZ2U6Ly9kZW1vL21hbmFnZW1lbnQvbW9kZWwxJyxcbiAqICAgICAnaW5kZXhlZGRiOi8vZGVtby9tYW5hZ2VtZW50L21vZGVsMScpO1xuICpcbiAqIC8vIExpc3QgbW9kZWxzIGFnYWluLlxuICogY29uc29sZS5sb2coSlNPTi5zdHJpbmdpZnkoYXdhaXQgdGYuaW8ubGlzdE1vZGVscygpKSk7XG4gKlxuICogLy8gUmVtb3ZlIGJvdGggbW9kZWxzLlxuICogYXdhaXQgdGYuaW8ucmVtb3ZlTW9kZWwoJ2xvY2Fsc3RvcmFnZTovL2RlbW8vbWFuYWdlbWVudC9tb2RlbDEnKTtcbiAqIGF3YWl0IHRmLmlvLnJlbW92ZU1vZGVsKCdpbmRleGVkZGI6Ly9kZW1vL21hbmFnZW1lbnQvbW9kZWwxJyk7XG4gKiBgYGBcbiAqXG4gKiBAcGFyYW0gc291cmNlVVJMIFNvdXJjZSBVUkwgb2YgY29weWluZy5cbiAqIEBwYXJhbSBkZXN0VVJMIERlc3RpbmF0aW9uIFVSTCBvZiBjb3B5aW5nLlxuICogQHJldHVybnMgTW9kZWxBcnRpZmFjdHNJbmZvIG9mIHRoZSBjb3BpZWQgbW9kZWwgKGlmIGFuZCBvbmx5IGlmIGNvcHlpbmdcbiAqICAgaXMgc3VjY2Vzc2Z1bCkuXG4gKiBAdGhyb3dzIEVycm9yIGlmIGNvcHlpbmcgZmFpbHMsIGUuZy4sIGlmIG5vIG1vZGVsIGV4aXN0cyBhdCBgc291cmNlVVJMYCwgb3JcbiAqICAgaWYgYG9sZFBhdGhgIGFuZCBgbmV3UGF0aGAgYXJlIGlkZW50aWNhbC5cbiAqXG4gKiBAZG9jIHtcbiAqICAgaGVhZGluZzogJ01vZGVscycsXG4gKiAgIHN1YmhlYWRpbmc6ICdNYW5hZ2VtZW50JyxcbiAqICAgbmFtZXNwYWNlOiAnaW8nLFxuICogICBpZ25vcmVDSTogdHJ1ZVxuICogfVxuICovXG5hc3luYyBmdW5jdGlvbiBjb3B5TW9kZWwoXG4gICAgc291cmNlVVJMOiBzdHJpbmcsIGRlc3RVUkw6IHN0cmluZyk6IFByb21pc2U8TW9kZWxBcnRpZmFjdHNJbmZvPiB7XG4gIGNvbnN0IGRlbGV0ZVNvdXJjZSA9IGZhbHNlO1xuICByZXR1cm4gY2xvbmVNb2RlbEludGVybmFsKHNvdXJjZVVSTCwgZGVzdFVSTCwgZGVsZXRlU291cmNlKTtcbn1cblxuLyoqXG4gKiBNb3ZlIGEgbW9kZWwgZnJvbSBvbmUgVVJMIHRvIGFub3RoZXIuXG4gKlxuICogVGhpcyBmdW5jdGlvbiBzdXBwb3J0czpcbiAqXG4gKiAxLiBNb3Zpbmcgd2l0aGluIGEgc3RvcmFnZSBtZWRpdW0sIGUuZy4sXG4gKiAgICBgdGYuaW8ubW92ZU1vZGVsKCdsb2NhbHN0b3JhZ2U6Ly9tb2RlbC0xJywgJ2xvY2Fsc3RvcmFnZTovL21vZGVsLTInKWBcbiAqIDIuIE1vdmluZyBiZXR3ZWVuIHR3byBzdG9yYWdlIG1lZGl1bXMsIGUuZy4sXG4gKiAgICBgdGYuaW8ubW92ZU1vZGVsKCdsb2NhbHN0b3JhZ2U6Ly9tb2RlbC0xJywgJ2luZGV4ZWRkYjovL21vZGVsLTEnKWBcbiAqXG4gKiBgYGBqc1xuICogLy8gRmlyc3QgY3JlYXRlIGFuZCBzYXZlIGEgbW9kZWwuXG4gKiBjb25zdCBtb2RlbCA9IHRmLnNlcXVlbnRpYWwoKTtcbiAqIG1vZGVsLmFkZCh0Zi5sYXllcnMuZGVuc2UoXG4gKiAgICAge3VuaXRzOiAxLCBpbnB1dFNoYXBlOiBbMTBdLCBhY3RpdmF0aW9uOiAnc2lnbW9pZCd9KSk7XG4gKiBhd2FpdCBtb2RlbC5zYXZlKCdsb2NhbHN0b3JhZ2U6Ly9kZW1vL21hbmFnZW1lbnQvbW9kZWwxJyk7XG4gKlxuICogLy8gVGhlbiBsaXN0IGV4aXN0aW5nIG1vZGVscy5cbiAqIGNvbnNvbGUubG9nKEpTT04uc3RyaW5naWZ5KGF3YWl0IHRmLmlvLmxpc3RNb2RlbHMoKSkpO1xuICpcbiAqIC8vIE1vdmUgdGhlIG1vZGVsLCBmcm9tIExvY2FsIFN0b3JhZ2UgdG8gSW5kZXhlZERCLlxuICogYXdhaXQgdGYuaW8ubW92ZU1vZGVsKFxuICogICAgICdsb2NhbHN0b3JhZ2U6Ly9kZW1vL21hbmFnZW1lbnQvbW9kZWwxJyxcbiAqICAgICAnaW5kZXhlZGRiOi8vZGVtby9tYW5hZ2VtZW50L21vZGVsMScpO1xuICpcbiAqIC8vIExpc3QgbW9kZWxzIGFnYWluLlxuICogY29uc29sZS5sb2coSlNPTi5zdHJpbmdpZnkoYXdhaXQgdGYuaW8ubGlzdE1vZGVscygpKSk7XG4gKlxuICogLy8gUmVtb3ZlIHRoZSBtb3ZlZCBtb2RlbC5cbiAqIGF3YWl0IHRmLmlvLnJlbW92ZU1vZGVsKCdpbmRleGVkZGI6Ly9kZW1vL21hbmFnZW1lbnQvbW9kZWwxJyk7XG4gKiBgYGBcbiAqXG4gKiBAcGFyYW0gc291cmNlVVJMIFNvdXJjZSBVUkwgb2YgbW92aW5nLlxuICogQHBhcmFtIGRlc3RVUkwgRGVzdGluYXRpb24gVVJMIG9mIG1vdmluZy5cbiAqIEByZXR1cm5zIE1vZGVsQXJ0aWZhY3RzSW5mbyBvZiB0aGUgY29waWVkIG1vZGVsIChpZiBhbmQgb25seSBpZiBjb3B5aW5nXG4gKiAgIGlzIHN1Y2Nlc3NmdWwpLlxuICogQHRocm93cyBFcnJvciBpZiBtb3ZpbmcgZmFpbHMsIGUuZy4sIGlmIG5vIG1vZGVsIGV4aXN0cyBhdCBgc291cmNlVVJMYCwgb3JcbiAqICAgaWYgYG9sZFBhdGhgIGFuZCBgbmV3UGF0aGAgYXJlIGlkZW50aWNhbC5cbiAqXG4gKiBAZG9jIHtcbiAqICAgaGVhZGluZzogJ01vZGVscycsXG4gKiAgIHN1YmhlYWRpbmc6ICdNYW5hZ2VtZW50JyxcbiAqICAgbmFtZXNwYWNlOiAnaW8nLFxuICogICBpZ25vcmVDSTogdHJ1ZVxuICogfVxuICovXG5hc3luYyBmdW5jdGlvbiBtb3ZlTW9kZWwoXG4gICAgc291cmNlVVJMOiBzdHJpbmcsIGRlc3RVUkw6IHN0cmluZyk6IFByb21pc2U8TW9kZWxBcnRpZmFjdHNJbmZvPiB7XG4gIGNvbnN0IGRlbGV0ZVNvdXJjZSA9IHRydWU7XG4gIHJldHVybiBjbG9uZU1vZGVsSW50ZXJuYWwoc291cmNlVVJMLCBkZXN0VVJMLCBkZWxldGVTb3VyY2UpO1xufVxuXG5leHBvcnQge21vdmVNb2RlbCwgY29weU1vZGVsLCByZW1vdmVNb2RlbCwgbGlzdE1vZGVsc307XG4iXX0=","/**\n * @license\n * Copyright 2019 Google LLC. All Rights Reserved.\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n * =============================================================================\n */\nimport '../flags';\nimport { env } from '../environment';\nimport { BrowserIndexedDB, BrowserIndexedDBManager } from '../io/indexed_db';\nimport { BrowserLocalStorage, BrowserLocalStorageManager } from '../io/local_storage';\nimport { ModelStoreManagerRegistry } from '../io/model_management';\nexport class PlatformBrowser {\n constructor() {\n // For setTimeoutCustom\n this.messageName = 'setTimeoutCustom';\n this.functionRefs = [];\n this.handledMessageCount = 0;\n this.hasEventListener = false;\n }\n fetch(path, init) {\n return fetch(path, init);\n }\n now() {\n return performance.now();\n }\n encode(text, encoding) {\n if (encoding !== 'utf-8' && encoding !== 'utf8') {\n throw new Error(`Browser's encoder only supports utf-8, but got ${encoding}`);\n }\n if (this.textEncoder == null) {\n this.textEncoder = new TextEncoder();\n }\n return this.textEncoder.encode(text);\n }\n decode(bytes, encoding) {\n return new TextDecoder(encoding).decode(bytes);\n }\n // If the setTimeout nesting level is greater than 5 and timeout is less\n // than 4ms, timeout will be clamped to 4ms, which hurts the perf.\n // Interleaving window.postMessage and setTimeout will trick the browser and\n // avoid the clamp.\n setTimeoutCustom(functionRef, delay) {\n if (!window || !env().getBool('USE_SETTIMEOUTCUSTOM')) {\n setTimeout(functionRef, delay);\n return;\n }\n this.functionRefs.push(functionRef);\n setTimeout(() => {\n window.postMessage({ name: this.messageName, index: this.functionRefs.length - 1 }, '*');\n }, delay);\n if (!this.hasEventListener) {\n this.hasEventListener = true;\n window.addEventListener('message', (event) => {\n if (event.source === window && event.data.name === this.messageName) {\n event.stopPropagation();\n const functionRef = this.functionRefs[event.data.index];\n functionRef();\n this.handledMessageCount++;\n if (this.handledMessageCount === this.functionRefs.length) {\n this.functionRefs = [];\n this.handledMessageCount = 0;\n }\n }\n }, true);\n }\n }\n}\nif (env().get('IS_BROWSER')) {\n env().setPlatform('browser', new PlatformBrowser());\n // Register LocalStorage IOHandler\n try {\n ModelStoreManagerRegistry.registerManager(BrowserLocalStorage.URL_SCHEME, new BrowserLocalStorageManager());\n }\n catch (err) {\n }\n // Register IndexedDB IOHandler\n try {\n ModelStoreManagerRegistry.registerManager(BrowserIndexedDB.URL_SCHEME, new BrowserIndexedDBManager());\n }\n catch (err) {\n }\n}\n//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicGxhdGZvcm1fYnJvd3Nlci5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uLy4uL3RmanMtY29yZS9zcmMvcGxhdGZvcm1zL3BsYXRmb3JtX2Jyb3dzZXIudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUE7Ozs7Ozs7Ozs7Ozs7OztHQWVHO0FBRUgsT0FBTyxVQUFVLENBQUM7QUFFbEIsT0FBTyxFQUFDLEdBQUcsRUFBQyxNQUFNLGdCQUFnQixDQUFDO0FBQ25DLE9BQU8sRUFBQyxnQkFBZ0IsRUFBRSx1QkFBdUIsRUFBQyxNQUFNLGtCQUFrQixDQUFDO0FBQzNFLE9BQU8sRUFBQyxtQkFBbUIsRUFBRSwwQkFBMEIsRUFBQyxNQUFNLHFCQUFxQixDQUFDO0FBQ3BGLE9BQU8sRUFBQyx5QkFBeUIsRUFBQyxNQUFNLHdCQUF3QixDQUFDO0FBSWpFLE1BQU0sT0FBTyxlQUFlO0lBQTVCO1FBS0UsdUJBQXVCO1FBQ2YsZ0JBQVcsR0FBRyxrQkFBa0IsQ0FBQztRQUNqQyxpQkFBWSxHQUFlLEVBQUUsQ0FBQztRQUM5Qix3QkFBbUIsR0FBRyxDQUFDLENBQUM7UUFDeEIscUJBQWdCLEdBQUcsS0FBSyxDQUFDO0lBd0RuQyxDQUFDO0lBdERDLEtBQUssQ0FBQyxJQUFZLEVBQUUsSUFBa0I7UUFDcEMsT0FBTyxLQUFLLENBQUMsSUFBSSxFQUFFLElBQUksQ0FBQyxDQUFDO0lBQzNCLENBQUM7SUFFRCxHQUFHO1FBQ0QsT0FBTyxXQUFXLENBQUMsR0FBRyxFQUFFLENBQUM7SUFDM0IsQ0FBQztJQUVELE1BQU0sQ0FBQyxJQUFZLEVBQUUsUUFBZ0I7UUFDbkMsSUFBSSxRQUFRLEtBQUssT0FBTyxJQUFJLFFBQVEsS0FBSyxNQUFNLEVBQUU7WUFDL0MsTUFBTSxJQUFJLEtBQUssQ0FDWCxrREFBa0QsUUFBUSxFQUFFLENBQUMsQ0FBQztTQUNuRTtRQUNELElBQUksSUFBSSxDQUFDLFdBQVcsSUFBSSxJQUFJLEVBQUU7WUFDNUIsSUFBSSxDQUFDLFdBQVcsR0FBRyxJQUFJLFdBQVcsRUFBRSxDQUFDO1NBQ3RDO1FBQ0QsT0FBTyxJQUFJLENBQUMsV0FBVyxDQUFDLE1BQU0sQ0FBQyxJQUFJLENBQUMsQ0FBQztJQUN2QyxDQUFDO0lBQ0QsTUFBTSxDQUFDLEtBQWlCLEVBQUUsUUFBZ0I7UUFDeEMsT0FBTyxJQUFJLFdBQVcsQ0FBQyxRQUFRLENBQUMsQ0FBQyxNQUFNLENBQUMsS0FBSyxDQUFDLENBQUM7SUFDakQsQ0FBQztJQUVELHdFQUF3RTtJQUN4RSxrRUFBa0U7SUFDbEUsNEVBQTRFO0lBQzVFLG1CQUFtQjtJQUNuQixnQkFBZ0IsQ0FBQyxXQUFxQixFQUFFLEtBQWE7UUFDbkQsSUFBSSxDQUFDLE1BQU0sSUFBSSxDQUFDLEdBQUcsRUFBRSxDQUFDLE9BQU8sQ0FBQyxzQkFBc0IsQ0FBQyxFQUFFO1lBQ3JELFVBQVUsQ0FBQyxXQUFXLEVBQUUsS0FBSyxDQUFDLENBQUM7WUFDL0IsT0FBTztTQUNSO1FBRUQsSUFBSSxDQUFDLFlBQVksQ0FBQyxJQUFJLENBQUMsV0FBVyxDQUFDLENBQUM7UUFDcEMsVUFBVSxDQUFDLEdBQUcsRUFBRTtZQUNkLE1BQU0sQ0FBQyxXQUFXLENBQ2QsRUFBQyxJQUFJLEVBQUUsSUFBSSxDQUFDLFdBQVcsRUFBRSxLQUFLLEVBQUUsSUFBSSxDQUFDLFlBQVksQ0FBQyxNQUFNLEdBQUcsQ0FBQyxFQUFDLEVBQUUsR0FBRyxDQUFDLENBQUM7UUFDMUUsQ0FBQyxFQUFFLEtBQUssQ0FBQyxDQUFDO1FBRVYsSUFBSSxDQUFDLElBQUksQ0FBQyxnQkFBZ0IsRUFBRTtZQUMxQixJQUFJLENBQUMsZ0JBQWdCLEdBQUcsSUFBSSxDQUFDO1lBQzdCLE1BQU0sQ0FBQyxnQkFBZ0IsQ0FBQyxTQUFTLEVBQUUsQ0FBQyxLQUFtQixFQUFFLEVBQUU7Z0JBQ3pELElBQUksS0FBSyxDQUFDLE1BQU0sS0FBSyxNQUFNLElBQUksS0FBSyxDQUFDLElBQUksQ0FBQyxJQUFJLEtBQUssSUFBSSxDQUFDLFdBQVcsRUFBRTtvQkFDbkUsS0FBSyxDQUFDLGVBQWUsRUFBRSxDQUFDO29CQUN4QixNQUFNLFdBQVcsR0FBRyxJQUFJLENBQUMsWUFBWSxDQUFDLEtBQUssQ0FBQyxJQUFJLENBQUMsS0FBSyxDQUFDLENBQUM7b0JBQ3hELFdBQVcsRUFBRSxDQUFDO29CQUNkLElBQUksQ0FBQyxtQkFBbUIsRUFBRSxDQUFDO29CQUMzQixJQUFJLElBQUksQ0FBQyxtQkFBbUIsS0FBSyxJQUFJLENBQUMsWUFBWSxDQUFDLE1BQU0sRUFBRTt3QkFDekQsSUFBSSxDQUFDLFlBQVksR0FBRyxFQUFFLENBQUM7d0JBQ3ZCLElBQUksQ0FBQyxtQkFBbUIsR0FBRyxDQUFDLENBQUM7cUJBQzlCO2lCQUNGO1lBQ0gsQ0FBQyxFQUFFLElBQUksQ0FBQyxDQUFDO1NBQ1Y7SUFDSCxDQUFDO0NBQ0Y7QUFFRCxJQUFJLEdBQUcsRUFBRSxDQUFDLEdBQUcsQ0FBQyxZQUFZLENBQUMsRUFBRTtJQUMzQixHQUFHLEVBQUUsQ0FBQyxXQUFXLENBQUMsU0FBUyxFQUFFLElBQUksZUFBZSxFQUFFLENBQUMsQ0FBQztJQUVwRCxrQ0FBa0M7SUFDbEMsSUFBSTtRQUNGLHlCQUF5QixDQUFDLGVBQWUsQ0FDckMsbUJBQW1CLENBQUMsVUFBVSxFQUFFLElBQUksMEJBQTBCLEVBQUUsQ0FBQyxDQUFDO0tBQ3ZFO0lBQUMsT0FBTyxHQUFHLEVBQUU7S0FDYjtJQUVELCtCQUErQjtJQUMvQixJQUFJO1FBQ0YseUJBQXlCLENBQUMsZUFBZSxDQUNyQyxnQkFBZ0IsQ0FBQyxVQUFVLEVBQUUsSUFBSSx1QkFBdUIsRUFBRSxDQUFDLENBQUM7S0FDakU7SUFBQyxPQUFPLEdBQUcsRUFBRTtLQUNiO0NBQ0YiLCJzb3VyY2VzQ29udGVudCI6WyIvKipcbiAqIEBsaWNlbnNlXG4gKiBDb3B5cmlnaHQgMjAxOSBHb29nbGUgTExDLiBBbGwgUmlnaHRzIFJlc2VydmVkLlxuICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlIFwiTGljZW5zZVwiKTtcbiAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS5cbiAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdFxuICpcbiAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMFxuICpcbiAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmVcbiAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuIFwiQVMgSVNcIiBCQVNJUyxcbiAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLlxuICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZFxuICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuXG4gKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuICovXG5cbmltcG9ydCAnLi4vZmxhZ3MnO1xuXG5pbXBvcnQge2Vudn0gZnJvbSAnLi4vZW52aXJvbm1lbnQnO1xuaW1wb3J0IHtCcm93c2VySW5kZXhlZERCLCBCcm93c2VySW5kZXhlZERCTWFuYWdlcn0gZnJvbSAnLi4vaW8vaW5kZXhlZF9kYic7XG5pbXBvcnQge0Jyb3dzZXJMb2NhbFN0b3JhZ2UsIEJyb3dzZXJMb2NhbFN0b3JhZ2VNYW5hZ2VyfSBmcm9tICcuLi9pby9sb2NhbF9zdG9yYWdlJztcbmltcG9ydCB7TW9kZWxTdG9yZU1hbmFnZXJSZWdpc3RyeX0gZnJvbSAnLi4vaW8vbW9kZWxfbWFuYWdlbWVudCc7XG5cbmltcG9ydCB7UGxhdGZvcm19IGZyb20gJy4vcGxhdGZvcm0nO1xuXG5leHBvcnQgY2xhc3MgUGxhdGZvcm1Ccm93c2VyIGltcGxlbWVudHMgUGxhdGZvcm0ge1xuICAvLyBBY2NvcmRpbmcgdG8gdGhlIHNwZWMsIHRoZSBidWlsdC1pbiBlbmNvZGVyIGNhbiBkbyBvbmx5IFVURi04IGVuY29kaW5nLlxuICAvLyBodHRwczovL2RldmVsb3Blci5tb3ppbGxhLm9yZy9lbi1VUy9kb2NzL1dlYi9BUEkvVGV4dEVuY29kZXIvVGV4dEVuY29kZXJcbiAgcHJpdmF0ZSB0ZXh0RW5jb2RlcjogVGV4dEVuY29kZXI7XG5cbiAgLy8gRm9yIHNldFRpbWVvdXRDdXN0b21cbiAgcHJpdmF0ZSBtZXNzYWdlTmFtZSA9ICdzZXRUaW1lb3V0Q3VzdG9tJztcbiAgcHJpdmF0ZSBmdW5jdGlvblJlZnM6IEZ1bmN0aW9uW10gPSBbXTtcbiAgcHJpdmF0ZSBoYW5kbGVkTWVzc2FnZUNvdW50ID0gMDtcbiAgcHJpdmF0ZSBoYXNFdmVudExpc3RlbmVyID0gZmFsc2U7XG5cbiAgZmV0Y2gocGF0aDogc3RyaW5nLCBpbml0PzogUmVxdWVzdEluaXQpOiBQcm9taXNlPFJlc3BvbnNlPiB7XG4gICAgcmV0dXJuIGZldGNoKHBhdGgsIGluaXQpO1xuICB9XG5cbiAgbm93KCk6IG51bWJlciB7XG4gICAgcmV0dXJuIHBlcmZvcm1hbmNlLm5vdygpO1xuICB9XG5cbiAgZW5jb2RlKHRleHQ6IHN0cmluZywgZW5jb2Rpbmc6IHN0cmluZyk6IFVpbnQ4QXJyYXkge1xuICAgIGlmIChlbmNvZGluZyAhPT0gJ3V0Zi04JyAmJiBlbmNvZGluZyAhPT0gJ3V0ZjgnKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoXG4gICAgICAgICAgYEJyb3dzZXIncyBlbmNvZGVyIG9ubHkgc3VwcG9ydHMgdXRmLTgsIGJ1dCBnb3QgJHtlbmNvZGluZ31gKTtcbiAgICB9XG4gICAgaWYgKHRoaXMudGV4dEVuY29kZXIgPT0gbnVsbCkge1xuICAgICAgdGhpcy50ZXh0RW5jb2RlciA9IG5ldyBUZXh0RW5jb2RlcigpO1xuICAgIH1cbiAgICByZXR1cm4gdGhpcy50ZXh0RW5jb2Rlci5lbmNvZGUodGV4dCk7XG4gIH1cbiAgZGVjb2RlKGJ5dGVzOiBVaW50OEFycmF5LCBlbmNvZGluZzogc3RyaW5nKTogc3RyaW5nIHtcbiAgICByZXR1cm4gbmV3IFRleHREZWNvZGVyKGVuY29kaW5nKS5kZWNvZGUoYnl0ZXMpO1xuICB9XG5cbiAgLy8gSWYgdGhlIHNldFRpbWVvdXQgbmVzdGluZyBsZXZlbCBpcyBncmVhdGVyIHRoYW4gNSBhbmQgdGltZW91dCBpcyBsZXNzXG4gIC8vIHRoYW4gNG1zLCB0aW1lb3V0IHdpbGwgYmUgY2xhbXBlZCB0byA0bXMsIHdoaWNoIGh1cnRzIHRoZSBwZXJmLlxuICAvLyBJbnRlcmxlYXZpbmcgd2luZG93LnBvc3RNZXNzYWdlIGFuZCBzZXRUaW1lb3V0IHdpbGwgdHJpY2sgdGhlIGJyb3dzZXIgYW5kXG4gIC8vIGF2b2lkIHRoZSBjbGFtcC5cbiAgc2V0VGltZW91dEN1c3RvbShmdW5jdGlvblJlZjogRnVuY3Rpb24sIGRlbGF5OiBudW1iZXIpOiB2b2lkIHtcbiAgICBpZiAoIXdpbmRvdyB8fCAhZW52KCkuZ2V0Qm9vbCgnVVNFX1NFVFRJTUVPVVRDVVNUT00nKSkge1xuICAgICAgc2V0VGltZW91dChmdW5jdGlvblJlZiwgZGVsYXkpO1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIHRoaXMuZnVuY3Rpb25SZWZzLnB1c2goZnVuY3Rpb25SZWYpO1xuICAgIHNldFRpbWVvdXQoKCkgPT4ge1xuICAgICAgd2luZG93LnBvc3RNZXNzYWdlKFxuICAgICAgICAgIHtuYW1lOiB0aGlzLm1lc3NhZ2VOYW1lLCBpbmRleDogdGhpcy5mdW5jdGlvblJlZnMubGVuZ3RoIC0gMX0sICcqJyk7XG4gICAgfSwgZGVsYXkpO1xuXG4gICAgaWYgKCF0aGlzLmhhc0V2ZW50TGlzdGVuZXIpIHtcbiAgICAgIHRoaXMuaGFzRXZlbnRMaXN0ZW5lciA9IHRydWU7XG4gICAgICB3aW5kb3cuYWRkRXZlbnRMaXN0ZW5lcignbWVzc2FnZScsIChldmVudDogTWVzc2FnZUV2ZW50KSA9PiB7XG4gICAgICAgIGlmIChldmVudC5zb3VyY2UgPT09IHdpbmRvdyAmJiBldmVudC5kYXRhLm5hbWUgPT09IHRoaXMubWVzc2FnZU5hbWUpIHtcbiAgICAgICAgICBldmVudC5zdG9wUHJvcGFnYXRpb24oKTtcbiAgICAgICAgICBjb25zdCBmdW5jdGlvblJlZiA9IHRoaXMuZnVuY3Rpb25SZWZzW2V2ZW50LmRhdGEuaW5kZXhdO1xuICAgICAgICAgIGZ1bmN0aW9uUmVmKCk7XG4gICAgICAgICAgdGhpcy5oYW5kbGVkTWVzc2FnZUNvdW50Kys7XG4gICAgICAgICAgaWYgKHRoaXMuaGFuZGxlZE1lc3NhZ2VDb3VudCA9PT0gdGhpcy5mdW5jdGlvblJlZnMubGVuZ3RoKSB7XG4gICAgICAgICAgICB0aGlzLmZ1bmN0aW9uUmVmcyA9IFtdO1xuICAgICAgICAgICAgdGhpcy5oYW5kbGVkTWVzc2FnZUNvdW50ID0gMDtcbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgIH0sIHRydWUpO1xuICAgIH1cbiAgfVxufVxuXG5pZiAoZW52KCkuZ2V0KCdJU19CUk9XU0VSJykpIHtcbiAgZW52KCkuc2V0UGxhdGZvcm0oJ2Jyb3dzZXInLCBuZXcgUGxhdGZvcm1Ccm93c2VyKCkpO1xuXG4gIC8vIFJlZ2lzdGVyIExvY2FsU3RvcmFnZSBJT0hhbmRsZXJcbiAgdHJ5IHtcbiAgICBNb2RlbFN0b3JlTWFuYWdlclJlZ2lzdHJ5LnJlZ2lzdGVyTWFuYWdlcihcbiAgICAgICAgQnJvd3NlckxvY2FsU3RvcmFnZS5VUkxfU0NIRU1FLCBuZXcgQnJvd3NlckxvY2FsU3RvcmFnZU1hbmFnZXIoKSk7XG4gIH0gY2F0Y2ggKGVycikge1xuICB9XG5cbiAgLy8gUmVnaXN0ZXIgSW5kZXhlZERCIElPSGFuZGxlclxuICB0cnkge1xuICAgIE1vZGVsU3RvcmVNYW5hZ2VyUmVnaXN0cnkucmVnaXN0ZXJNYW5hZ2VyKFxuICAgICAgICBCcm93c2VySW5kZXhlZERCLlVSTF9TQ0hFTUUsIG5ldyBCcm93c2VySW5kZXhlZERCTWFuYWdlcigpKTtcbiAgfSBjYXRjaCAoZXJyKSB7XG4gIH1cbn1cbiJdfQ==","/**\n * @license\n * Copyright 2019 Google LLC. All Rights Reserved.\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n * =============================================================================\n */\nimport { env } from '../environment';\n// We are wrapping this within an object so it can be stubbed by Jasmine.\nexport const getNodeFetch = {\n // tslint:disable-next-line:no-require-imports\n importFetch: () => require('node-fetch')\n};\nlet systemFetch;\n// These getters and setters are for testing so we don't export a mutable\n// variable.\nexport function resetSystemFetch() {\n systemFetch = null;\n}\nexport function setSystemFetch(fetchFn) {\n systemFetch = fetchFn;\n}\nexport function getSystemFetch() {\n return systemFetch;\n}\nexport class PlatformNode {\n constructor() {\n // tslint:disable-next-line:no-require-imports\n this.util = require('util');\n // According to the spec, the built-in encoder can do only UTF-8 encoding.\n // https://developer.mozilla.org/en-US/docs/Web/API/TextEncoder/TextEncoder\n this.textEncoder = new this.util.TextEncoder();\n }\n fetch(path, requestInits) {\n if (env().global.fetch != null) {\n return env().global.fetch(path, requestInits);\n }\n if (systemFetch == null) {\n systemFetch = getNodeFetch.importFetch();\n }\n return systemFetch(path, requestInits);\n }\n now() {\n const time = process.hrtime();\n return time[0] * 1000 + time[1] / 1000000;\n }\n encode(text, encoding) {\n if (encoding !== 'utf-8' && encoding !== 'utf8') {\n throw new Error(`Node built-in encoder only supports utf-8, but got ${encoding}`);\n }\n return this.textEncoder.encode(text);\n }\n decode(bytes, encoding) {\n if (bytes.length === 0) {\n return '';\n }\n return new this.util.TextDecoder(encoding).decode(bytes);\n }\n}\nif (env().get('IS_NODE') && !env().get('IS_BROWSER')) {\n env().setPlatform('node', new PlatformNode());\n}\n//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicGxhdGZvcm1fbm9kZS5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uLy4uL3RmanMtY29yZS9zcmMvcGxhdGZvcm1zL3BsYXRmb3JtX25vZGUudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUE7Ozs7Ozs7Ozs7Ozs7OztHQWVHO0FBQ0gsT0FBTyxFQUFDLEdBQUcsRUFBQyxNQUFNLGdCQUFnQixDQUFDO0FBR25DLHlFQUF5RTtBQUN6RSxNQUFNLENBQUMsTUFBTSxZQUFZLEdBQUc7SUFDMUIsOENBQThDO0lBQzlDLFdBQVcsRUFBRSxHQUFHLEVBQUUsQ0FBQyxPQUFPLENBQUMsWUFBWSxDQUFDO0NBQ3pDLENBQUM7QUFHRixJQUFJLFdBQW9CLENBQUM7QUFDekIseUVBQXlFO0FBQ3pFLFlBQVk7QUFDWixNQUFNLFVBQVUsZ0JBQWdCO0lBQzlCLFdBQVcsR0FBRyxJQUFJLENBQUM7QUFDckIsQ0FBQztBQUNELE1BQU0sVUFBVSxjQUFjLENBQUMsT0FBZ0I7SUFDN0MsV0FBVyxHQUFHLE9BQU8sQ0FBQztBQUN4QixDQUFDO0FBQ0QsTUFBTSxVQUFVLGNBQWM7SUFDNUIsT0FBTyxXQUFXLENBQUM7QUFDckIsQ0FBQztBQUVELE1BQU0sT0FBTyxZQUFZO0lBS3ZCO1FBQ0UsOENBQThDO1FBQzlDLElBQUksQ0FBQyxJQUFJLEdBQUcsT0FBTyxDQUFDLE1BQU0sQ0FBQyxDQUFDO1FBQzVCLDBFQUEwRTtRQUMxRSwyRUFBMkU7UUFDM0UsSUFBSSxDQUFDLFdBQVcsR0FBRyxJQUFJLElBQUksQ0FBQyxJQUFJLENBQUMsV0FBVyxFQUFFLENBQUM7SUFDakQsQ0FBQztJQUVELEtBQUssQ0FBQyxJQUFZLEVBQUUsWUFBMEI7UUFDNUMsSUFBSSxHQUFHLEVBQUUsQ0FBQyxNQUFNLENBQUMsS0FBSyxJQUFJLElBQUksRUFBRTtZQUM5QixPQUFPLEdBQUcsRUFBRSxDQUFDLE1BQU0sQ0FBQyxLQUFLLENBQUMsSUFBSSxFQUFFLFlBQVksQ0FBQyxDQUFDO1NBQy9DO1FBRUQsSUFBSSxXQUFXLElBQUksSUFBSSxFQUFFO1lBQ3ZCLFdBQVcsR0FBRyxZQUFZLENBQUMsV0FBVyxFQUFFLENBQUM7U0FDMUM7UUFDRCxPQUFPLFdBQVcsQ0FBQyxJQUFJLEVBQUUsWUFBWSxDQUFDLENBQUM7SUFDekMsQ0FBQztJQUVELEdBQUc7UUFDRCxNQUFNLElBQUksR0FBRyxPQUFPLENBQUMsTUFBTSxFQUFFLENBQUM7UUFDOUIsT0FBTyxJQUFJLENBQUMsQ0FBQyxDQUFDLEdBQUcsSUFBSSxHQUFHLElBQUksQ0FBQyxDQUFDLENBQUMsR0FBRyxPQUFPLENBQUM7SUFDNUMsQ0FBQztJQUVELE1BQU0sQ0FBQyxJQUFZLEVBQUUsUUFBZ0I7UUFDbkMsSUFBSSxRQUFRLEtBQUssT0FBTyxJQUFJLFFBQVEsS0FBSyxNQUFNLEVBQUU7WUFDL0MsTUFBTSxJQUFJLEtBQUssQ0FDWCxzREFBc0QsUUFBUSxFQUFFLENBQUMsQ0FBQztTQUN2RTtRQUNELE9BQU8sSUFBSSxDQUFDLFdBQVcsQ0FBQyxNQUFNLENBQUMsSUFBSSxDQUFDLENBQUM7SUFDdkMsQ0FBQztJQUNELE1BQU0sQ0FBQyxLQUFpQixFQUFFLFFBQWdCO1FBQ3hDLElBQUksS0FBSyxDQUFDLE1BQU0sS0FBSyxDQUFDLEVBQUU7WUFDdEIsT0FBTyxFQUFFLENBQUM7U0FDWDtRQUNELE9BQU8sSUFBSSxJQUFJLENBQUMsSUFBSSxDQUFDLFdBQVcsQ0FBQyxRQUFRLENBQUMsQ0FBQyxNQUFNLENBQUMsS0FBSyxDQUFDLENBQUM7SUFDM0QsQ0FBQztDQUNGO0FBRUQsSUFBSSxHQUFHLEVBQUUsQ0FBQyxHQUFHLENBQUMsU0FBUyxDQUFDLElBQUksQ0FBQyxHQUFHLEVBQUUsQ0FBQyxHQUFHLENBQUMsWUFBWSxDQUFDLEVBQUU7SUFDcEQsR0FBRyxFQUFFLENBQUMsV0FBVyxDQUFDLE1BQU0sRUFBRSxJQUFJLFlBQVksRUFBRSxDQUFDLENBQUM7Q0FDL0MiLCJzb3VyY2VzQ29udGVudCI6WyIvKipcbiAqIEBsaWNlbnNlXG4gKiBDb3B5cmlnaHQgMjAxOSBHb29nbGUgTExDLiBBbGwgUmlnaHRzIFJlc2VydmVkLlxuICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlIFwiTGljZW5zZVwiKTtcbiAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS5cbiAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdFxuICpcbiAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMFxuICpcbiAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmVcbiAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuIFwiQVMgSVNcIiBCQVNJUyxcbiAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLlxuICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZFxuICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuXG4gKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuICovXG5pbXBvcnQge2Vudn0gZnJvbSAnLi4vZW52aXJvbm1lbnQnO1xuaW1wb3J0IHtQbGF0Zm9ybX0gZnJvbSAnLi9wbGF0Zm9ybSc7XG5cbi8vIFdlIGFyZSB3cmFwcGluZyB0aGlzIHdpdGhpbiBhbiBvYmplY3Qgc28gaXQgY2FuIGJlIHN0dWJiZWQgYnkgSmFzbWluZS5cbmV4cG9ydCBjb25zdCBnZXROb2RlRmV0Y2ggPSB7XG4gIC8vIHRzbGludDpkaXNhYmxlLW5leHQtbGluZTpuby1yZXF1aXJlLWltcG9ydHNcbiAgaW1wb3J0RmV0Y2g6ICgpID0+IHJlcXVpcmUoJ25vZGUtZmV0Y2gnKVxufTtcblxudHlwZSBGZXRjaEZuID0gKHVybDogc3RyaW5nLCBpbml0PzogUmVxdWVzdEluaXQpID0+IFByb21pc2U8UmVzcG9uc2U+O1xubGV0IHN5c3RlbUZldGNoOiBGZXRjaEZuO1xuLy8gVGhlc2UgZ2V0dGVycyBhbmQgc2V0dGVycyBhcmUgZm9yIHRlc3Rpbmcgc28gd2UgZG9uJ3QgZXhwb3J0IGEgbXV0YWJsZVxuLy8gdmFyaWFibGUuXG5leHBvcnQgZnVuY3Rpb24gcmVzZXRTeXN0ZW1GZXRjaCgpIHtcbiAgc3lzdGVtRmV0Y2ggPSBudWxsO1xufVxuZXhwb3J0IGZ1bmN0aW9uIHNldFN5c3RlbUZldGNoKGZldGNoRm46IEZldGNoRm4pIHtcbiAgc3lzdGVtRmV0Y2ggPSBmZXRjaEZuO1xufVxuZXhwb3J0IGZ1bmN0aW9uIGdldFN5c3RlbUZldGNoKCk6IEZldGNoRm4ge1xuICByZXR1cm4gc3lzdGVtRmV0Y2g7XG59XG5cbmV4cG9ydCBjbGFzcyBQbGF0Zm9ybU5vZGUgaW1wbGVtZW50cyBQbGF0Zm9ybSB7XG4gIHByaXZhdGUgdGV4dEVuY29kZXI6IFRleHRFbmNvZGVyO1xuICAvLyB0c2xpbnQ6ZGlzYWJsZS1uZXh0LWxpbmU6bm8tYW55XG4gIHV0aWw6IGFueTtcblxuICBjb25zdHJ1Y3RvcigpIHtcbiAgICAvLyB0c2xpbnQ6ZGlzYWJsZS1uZXh0LWxpbmU6bm8tcmVxdWlyZS1pbXBvcnRzXG4gICAgdGhpcy51dGlsID0gcmVxdWlyZSgndXRpbCcpO1xuICAgIC8vIEFjY29yZGluZyB0byB0aGUgc3BlYywgdGhlIGJ1aWx0LWluIGVuY29kZXIgY2FuIGRvIG9ubHkgVVRGLTggZW5jb2RpbmcuXG4gICAgLy8gaHR0cHM6Ly9kZXZlbG9wZXIubW96aWxsYS5vcmcvZW4tVVMvZG9jcy9XZWIvQVBJL1RleHRFbmNvZGVyL1RleHRFbmNvZGVyXG4gICAgdGhpcy50ZXh0RW5jb2RlciA9IG5ldyB0aGlzLnV0aWwuVGV4dEVuY29kZXIoKTtcbiAgfVxuXG4gIGZldGNoKHBhdGg6IHN0cmluZywgcmVxdWVzdEluaXRzPzogUmVxdWVzdEluaXQpOiBQcm9taXNlPFJlc3BvbnNlPiB7XG4gICAgaWYgKGVudigpLmdsb2JhbC5mZXRjaCAhPSBudWxsKSB7XG4gICAgICByZXR1cm4gZW52KCkuZ2xvYmFsLmZldGNoKHBhdGgsIHJlcXVlc3RJbml0cyk7XG4gICAgfVxuXG4gICAgaWYgKHN5c3RlbUZldGNoID09IG51bGwpIHtcbiAgICAgIHN5c3RlbUZldGNoID0gZ2V0Tm9kZUZldGNoLmltcG9ydEZldGNoKCk7XG4gICAgfVxuICAgIHJldHVybiBzeXN0ZW1GZXRjaChwYXRoLCByZXF1ZXN0SW5pdHMpO1xuICB9XG5cbiAgbm93KCk6IG51bWJlciB7XG4gICAgY29uc3QgdGltZSA9IHByb2Nlc3MuaHJ0aW1lKCk7XG4gICAgcmV0dXJuIHRpbWVbMF0gKiAxMDAwICsgdGltZVsxXSAvIDEwMDAwMDA7XG4gIH1cblxuICBlbmNvZGUodGV4dDogc3RyaW5nLCBlbmNvZGluZzogc3RyaW5nKTogVWludDhBcnJheSB7XG4gICAgaWYgKGVuY29kaW5nICE9PSAndXRmLTgnICYmIGVuY29kaW5nICE9PSAndXRmOCcpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcihcbiAgICAgICAgICBgTm9kZSBidWlsdC1pbiBlbmNvZGVyIG9ubHkgc3VwcG9ydHMgdXRmLTgsIGJ1dCBnb3QgJHtlbmNvZGluZ31gKTtcbiAgICB9XG4gICAgcmV0dXJuIHRoaXMudGV4dEVuY29kZXIuZW5jb2RlKHRleHQpO1xuICB9XG4gIGRlY29kZShieXRlczogVWludDhBcnJheSwgZW5jb2Rpbmc6IHN0cmluZyk6IHN0cmluZyB7XG4gICAgaWYgKGJ5dGVzLmxlbmd0aCA9PT0gMCkge1xuICAgICAgcmV0dXJuICcnO1xuICAgIH1cbiAgICByZXR1cm4gbmV3IHRoaXMudXRpbC5UZXh0RGVjb2RlcihlbmNvZGluZykuZGVjb2RlKGJ5dGVzKTtcbiAgfVxufVxuXG5pZiAoZW52KCkuZ2V0KCdJU19OT0RFJykgJiYgIWVudigpLmdldCgnSVNfQlJPV1NFUicpKSB7XG4gIGVudigpLnNldFBsYXRmb3JtKCdub2RlJywgbmV3IFBsYXRmb3JtTm9kZSgpKTtcbn1cbiJdfQ==","/**\n * @license\n * Copyright 2020 Google Inc. All Rights Reserved.\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n * =============================================================================\n */\n// Required side effectful code for tfjs-core\n// Set up Engine and ENV\nimport { getOrMakeEngine } from './engine';\ngetOrMakeEngine();\n// Register backend-agnostic flags.\nimport './flags';\n// Register platforms\nimport './platforms/platform_browser';\nimport './platforms/platform_node';\n// Set up OpHandler\nimport { buffer } from './ops/buffer';\nimport { cast } from './ops/cast';\nimport { clone } from './ops/clone';\nimport { print } from './ops/print';\nimport { setOpHandler } from './tensor';\nconst opHandler = {\n buffer,\n cast,\n clone,\n print\n};\nsetOpHandler(opHandler);\n//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYmFzZV9zaWRlX2VmZmVjdHMuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi90ZmpzLWNvcmUvc3JjL2Jhc2Vfc2lkZV9lZmZlY3RzLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBOzs7Ozs7Ozs7Ozs7Ozs7R0FlRztBQUVILDZDQUE2QztBQUU3Qyx3QkFBd0I7QUFDeEIsT0FBTyxFQUFDLGVBQWUsRUFBQyxNQUFNLFVBQVUsQ0FBQztBQUN6QyxlQUFlLEVBQUUsQ0FBQztBQUVsQixtQ0FBbUM7QUFDbkMsT0FBTyxTQUFTLENBQUM7QUFDakIscUJBQXFCO0FBQ3JCLE9BQU8sOEJBQThCLENBQUM7QUFDdEMsT0FBTywyQkFBMkIsQ0FBQztBQUVuQyxtQkFBbUI7QUFDbkIsT0FBTyxFQUFDLE1BQU0sRUFBQyxNQUFNLGNBQWMsQ0FBQztBQUNwQyxPQUFPLEVBQUMsSUFBSSxFQUFDLE1BQU0sWUFBWSxDQUFDO0FBQ2hDLE9BQU8sRUFBQyxLQUFLLEVBQUMsTUFBTSxhQUFhLENBQUM7QUFDbEMsT0FBTyxFQUFDLEtBQUssRUFBQyxNQUFNLGFBQWEsQ0FBQztBQUNsQyxPQUFPLEVBQVksWUFBWSxFQUFDLE1BQU0sVUFBVSxDQUFDO0FBQ2pELE1BQU0sU0FBUyxHQUFjO0lBQzNCLE1BQU07SUFDTixJQUFJO0lBQ0osS0FBSztJQUNMLEtBQUs7Q0FDTixDQUFDO0FBQ0YsWUFBWSxDQUFDLFNBQVMsQ0FBQyxDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiLyoqXG4gKiBAbGljZW5zZVxuICogQ29weXJpZ2h0IDIwMjAgR29vZ2xlIEluYy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC5cbiAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSBcIkxpY2Vuc2VcIik7XG4gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuXG4gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXRcbiAqXG4gKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjBcbiAqXG4gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlXG4gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiBcIkFTIElTXCIgQkFTSVMsXG4gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC5cbiAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmRcbiAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLlxuICogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbiAqL1xuXG4vLyBSZXF1aXJlZCBzaWRlIGVmZmVjdGZ1bCBjb2RlIGZvciB0ZmpzLWNvcmVcblxuLy8gU2V0IHVwIEVuZ2luZSBhbmQgRU5WXG5pbXBvcnQge2dldE9yTWFrZUVuZ2luZX0gZnJvbSAnLi9lbmdpbmUnO1xuZ2V0T3JNYWtlRW5naW5lKCk7XG5cbi8vIFJlZ2lzdGVyIGJhY2tlbmQtYWdub3N0aWMgZmxhZ3MuXG5pbXBvcnQgJy4vZmxhZ3MnO1xuLy8gUmVnaXN0ZXIgcGxhdGZvcm1zXG5pbXBvcnQgJy4vcGxhdGZvcm1zL3BsYXRmb3JtX2Jyb3dzZXInO1xuaW1wb3J0ICcuL3BsYXRmb3Jtcy9wbGF0Zm9ybV9ub2RlJztcblxuLy8gU2V0IHVwIE9wSGFuZGxlclxuaW1wb3J0IHtidWZmZXJ9IGZyb20gJy4vb3BzL2J1ZmZlcic7XG5pbXBvcnQge2Nhc3R9IGZyb20gJy4vb3BzL2Nhc3QnO1xuaW1wb3J0IHtjbG9uZX0gZnJvbSAnLi9vcHMvY2xvbmUnO1xuaW1wb3J0IHtwcmludH0gZnJvbSAnLi9vcHMvcHJpbnQnO1xuaW1wb3J0IHtPcEhhbmRsZXIsIHNldE9wSGFuZGxlcn0gZnJvbSAnLi90ZW5zb3InO1xuY29uc3Qgb3BIYW5kbGVyOiBPcEhhbmRsZXIgPSB7XG4gIGJ1ZmZlcixcbiAgY2FzdCxcbiAgY2xvbmUsXG4gIHByaW50XG59O1xuc2V0T3BIYW5kbGVyKG9wSGFuZGxlcik7XG4iXX0=","/**\n * @license\n * Copyright 2018 Google LLC. All Rights Reserved.\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n * =============================================================================\n */\n/**\n * IOHandlers related to files, such as browser-triggered file downloads,\n * user-selected files in browser.\n */\nimport '../flags';\nimport { env } from '../environment';\nimport { basename, concatenateArrayBuffers, getModelArtifactsForJSON, getModelArtifactsInfoForJSON, getModelJSONForModelArtifacts } from './io_utils';\nimport { IORouterRegistry } from './router_registry';\nconst DEFAULT_FILE_NAME_PREFIX = 'model';\nconst DEFAULT_JSON_EXTENSION_NAME = '.json';\nconst DEFAULT_WEIGHT_DATA_EXTENSION_NAME = '.weights.bin';\nfunction defer(f) {\n return new Promise(resolve => setTimeout(resolve)).then(f);\n}\nexport class BrowserDownloads {\n constructor(fileNamePrefix) {\n if (!env().getBool('IS_BROWSER')) {\n // TODO(cais): Provide info on what IOHandlers are available under the\n // current environment.\n throw new Error('browserDownloads() cannot proceed because the current environment ' +\n 'is not a browser.');\n }\n if (fileNamePrefix.startsWith(BrowserDownloads.URL_SCHEME)) {\n fileNamePrefix = fileNamePrefix.slice(BrowserDownloads.URL_SCHEME.length);\n }\n if (fileNamePrefix == null || fileNamePrefix.length === 0) {\n fileNamePrefix = DEFAULT_FILE_NAME_PREFIX;\n }\n this.modelJsonFileName = fileNamePrefix + DEFAULT_JSON_EXTENSION_NAME;\n this.weightDataFileName =\n fileNamePrefix + DEFAULT_WEIGHT_DATA_EXTENSION_NAME;\n }\n async save(modelArtifacts) {\n if (typeof (document) === 'undefined') {\n throw new Error('Browser downloads are not supported in ' +\n 'this environment since `document` is not present');\n }\n const weightsURL = window.URL.createObjectURL(new Blob([modelArtifacts.weightData], { type: 'application/octet-stream' }));\n if (modelArtifacts.modelTopology instanceof ArrayBuffer) {\n throw new Error('BrowserDownloads.save() does not support saving model topology ' +\n 'in binary formats yet.');\n }\n else {\n const weightsManifest = [{\n paths: ['./' + this.weightDataFileName],\n weights: modelArtifacts.weightSpecs\n }];\n const modelJSON = getModelJSONForModelArtifacts(modelArtifacts, weightsManifest);\n const modelJsonURL = window.URL.createObjectURL(new Blob([JSON.stringify(modelJSON)], { type: 'application/json' }));\n // If anchor elements are not provided, create them without attaching them\n // to parents, so that the downloaded file names can be controlled.\n const jsonAnchor = this.modelJsonAnchor == null ?\n document.createElement('a') :\n this.modelJsonAnchor;\n jsonAnchor.download = this.modelJsonFileName;\n jsonAnchor.href = modelJsonURL;\n // Trigger downloads by evoking a click event on the download anchors.\n // When multiple downloads are started synchronously, Firefox will only\n // save the last one.\n await defer(() => jsonAnchor.dispatchEvent(new MouseEvent('click')));\n if (modelArtifacts.weightData != null) {\n const weightDataAnchor = this.weightDataAnchor == null ?\n document.createElement('a') :\n this.weightDataAnchor;\n weightDataAnchor.download = this.weightDataFileName;\n weightDataAnchor.href = weightsURL;\n await defer(() => weightDataAnchor.dispatchEvent(new MouseEvent('click')));\n }\n return { modelArtifactsInfo: getModelArtifactsInfoForJSON(modelArtifacts) };\n }\n }\n}\nBrowserDownloads.URL_SCHEME = 'downloads://';\nclass BrowserFiles {\n constructor(files) {\n if (files == null || files.length < 1) {\n throw new Error(`When calling browserFiles, at least 1 file is required, ` +\n `but received ${files}`);\n }\n this.jsonFile = files[0];\n this.weightsFiles = files.slice(1);\n }\n async load() {\n return new Promise((resolve, reject) => {\n const jsonReader = new FileReader();\n jsonReader.onload = (event) => {\n // tslint:disable-next-line:no-any\n const modelJSON = JSON.parse(event.target.result);\n const modelTopology = modelJSON.modelTopology;\n if (modelTopology == null) {\n reject(new Error(`modelTopology field is missing from file ${this.jsonFile.name}`));\n return;\n }\n const weightsManifest = modelJSON.weightsManifest;\n if (weightsManifest == null) {\n reject(new Error(`weightManifest field is missing from file ${this.jsonFile.name}`));\n return;\n }\n if (this.weightsFiles.length === 0) {\n resolve({ modelTopology });\n return;\n }\n const modelArtifactsPromise = getModelArtifactsForJSON(modelJSON, (weightsManifest) => this.loadWeights(weightsManifest));\n resolve(modelArtifactsPromise);\n };\n jsonReader.onerror = error => reject(`Failed to read model topology and weights manifest JSON ` +\n `from file '${this.jsonFile.name}'. BrowserFiles supports loading ` +\n `Keras-style tf.Model artifacts only.`);\n jsonReader.readAsText(this.jsonFile);\n });\n }\n loadWeights(weightsManifest) {\n const weightSpecs = [];\n const paths = [];\n for (const entry of weightsManifest) {\n weightSpecs.push(...entry.weights);\n paths.push(...entry.paths);\n }\n const pathToFile = this.checkManifestAndWeightFiles(weightsManifest);\n const promises = paths.map(path => this.loadWeightsFile(path, pathToFile[path]));\n return Promise.all(promises).then(buffers => [weightSpecs, concatenateArrayBuffers(buffers)]);\n }\n loadWeightsFile(path, file) {\n return new Promise((resolve, reject) => {\n const weightFileReader = new FileReader();\n weightFileReader.onload = (event) => {\n // tslint:disable-next-line:no-any\n const weightData = event.target.result;\n resolve(weightData);\n };\n weightFileReader.onerror = error => reject(`Failed to weights data from file of path '${path}'.`);\n weightFileReader.readAsArrayBuffer(file);\n });\n }\n /**\n * Check the compatibility between weights manifest and weight files.\n */\n checkManifestAndWeightFiles(manifest) {\n const basenames = [];\n const fileNames = this.weightsFiles.map(file => basename(file.name));\n const pathToFile = {};\n for (const group of manifest) {\n group.paths.forEach(path => {\n const pathBasename = basename(path);\n if (basenames.indexOf(pathBasename) !== -1) {\n throw new Error(`Duplicate file basename found in weights manifest: ` +\n `'${pathBasename}'`);\n }\n basenames.push(pathBasename);\n if (fileNames.indexOf(pathBasename) === -1) {\n throw new Error(`Weight file with basename '${pathBasename}' is not provided.`);\n }\n else {\n pathToFile[path] = this.weightsFiles[fileNames.indexOf(pathBasename)];\n }\n });\n }\n if (basenames.length !== this.weightsFiles.length) {\n throw new Error(`Mismatch in the number of files in weights manifest ` +\n `(${basenames.length}) and the number of weight files provided ` +\n `(${this.weightsFiles.length}).`);\n }\n return pathToFile;\n }\n}\nexport const browserDownloadsRouter = (url) => {\n if (!env().getBool('IS_BROWSER')) {\n return null;\n }\n else {\n if (!Array.isArray(url) && url.startsWith(BrowserDownloads.URL_SCHEME)) {\n return browserDownloads(url.slice(BrowserDownloads.URL_SCHEME.length));\n }\n else {\n return null;\n }\n }\n};\nIORouterRegistry.registerSaveRouter(browserDownloadsRouter);\n/**\n * Creates an IOHandler that triggers file downloads from the browser.\n *\n * The returned `IOHandler` instance can be used as model exporting methods such\n * as `tf.Model.save` and supports only saving.\n *\n * ```js\n * const model = tf.sequential();\n * model.add(tf.layers.dense(\n * {units: 1, inputShape: [10], activation: 'sigmoid'}));\n * const saveResult = await model.save('downloads://mymodel');\n * // This will trigger downloading of two files:\n * // 'mymodel.json' and 'mymodel.weights.bin'.\n * console.log(saveResult);\n * ```\n *\n * @param fileNamePrefix Prefix name of the files to be downloaded. For use with\n * `tf.Model`, `fileNamePrefix` should follow either of the following two\n * formats:\n * 1. `null` or `undefined`, in which case the default file\n * names will be used:\n * - 'model.json' for the JSON file containing the model topology and\n * weights manifest.\n * - 'model.weights.bin' for the binary file containing the binary weight\n * values.\n * 2. A single string or an Array of a single string, as the file name prefix.\n * For example, if `'foo'` is provided, the downloaded JSON\n * file and binary weights file will be named 'foo.json' and\n * 'foo.weights.bin', respectively.\n * @param config Additional configuration for triggering downloads.\n * @returns An instance of `BrowserDownloads` `IOHandler`.\n *\n * @doc {\n * heading: 'Models',\n * subheading: 'Loading',\n * namespace: 'io',\n * ignoreCI: true\n * }\n */\nexport function browserDownloads(fileNamePrefix = 'model') {\n return new BrowserDownloads(fileNamePrefix);\n}\n/**\n * Creates an IOHandler that loads model artifacts from user-selected files.\n *\n * This method can be used for loading from files such as user-selected files\n * in the browser.\n * When used in conjunction with `tf.loadLayersModel`, an instance of\n * `tf.LayersModel` (Keras-style) can be constructed from the loaded artifacts.\n *\n * ```js\n * // Note: This code snippet won't run properly without the actual file input\n * // elements in the HTML DOM.\n *\n * // Suppose there are two HTML file input (``)\n * // elements.\n * const uploadJSONInput = document.getElementById('upload-json');\n * const uploadWeightsInput = document.getElementById('upload-weights');\n * const model = await tf.loadLayersModel(tf.io.browserFiles(\n * [uploadJSONInput.files[0], uploadWeightsInput.files[0]]));\n * ```\n *\n * @param files `File`s to load from. Currently, this function supports only\n * loading from files that contain Keras-style models (i.e., `tf.Model`s), for\n * which an `Array` of `File`s is expected (in that order):\n * - A JSON file containing the model topology and weight manifest.\n * - Optionally, one or more binary files containing the binary weights.\n * These files must have names that match the paths in the `weightsManifest`\n * contained by the aforementioned JSON file, or errors will be thrown\n * during loading. These weights files have the same format as the ones\n * generated by `tensorflowjs_converter` that comes with the `tensorflowjs`\n * Python PIP package. If no weights files are provided, only the model\n * topology will be loaded from the JSON file above.\n * @returns An instance of `Files` `IOHandler`.\n *\n * @doc {\n * heading: 'Models',\n * subheading: 'Loading',\n * namespace: 'io',\n * ignoreCI: true\n * }\n */\nexport function browserFiles(files) {\n return new BrowserFiles(files);\n}\n//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYnJvd3Nlcl9maWxlcy5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uLy4uL3RmanMtY29yZS9zcmMvaW8vYnJvd3Nlcl9maWxlcy50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQTs7Ozs7Ozs7Ozs7Ozs7O0dBZUc7QUFFSDs7O0dBR0c7QUFFSCxPQUFPLFVBQVUsQ0FBQztBQUNsQixPQUFPLEVBQUMsR0FBRyxFQUFDLE1BQU0sZ0JBQWdCLENBQUM7QUFFbkMsT0FBTyxFQUFDLFFBQVEsRUFBRSx1QkFBdUIsRUFBRSx3QkFBd0IsRUFBRSw0QkFBNEIsRUFBRSw2QkFBNkIsRUFBQyxNQUFNLFlBQVksQ0FBQztBQUNwSixPQUFPLEVBQVcsZ0JBQWdCLEVBQUMsTUFBTSxtQkFBbUIsQ0FBQztBQUc3RCxNQUFNLHdCQUF3QixHQUFHLE9BQU8sQ0FBQztBQUN6QyxNQUFNLDJCQUEyQixHQUFHLE9BQU8sQ0FBQztBQUM1QyxNQUFNLGtDQUFrQyxHQUFHLGNBQWMsQ0FBQztBQUUxRCxTQUFTLEtBQUssQ0FBSSxDQUFVO0lBQzFCLE9BQU8sSUFBSSxPQUFPLENBQUMsT0FBTyxDQUFDLEVBQUUsQ0FBQyxVQUFVLENBQUMsT0FBTyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUM7QUFDN0QsQ0FBQztBQUVELE1BQU0sT0FBTyxnQkFBZ0I7SUFRM0IsWUFBWSxjQUF1QjtRQUNqQyxJQUFJLENBQUMsR0FBRyxFQUFFLENBQUMsT0FBTyxDQUFDLFlBQVksQ0FBQyxFQUFFO1lBQ2hDLHNFQUFzRTtZQUN0RSx5QkFBeUI7WUFDekIsTUFBTSxJQUFJLEtBQUssQ0FDWCxvRUFBb0U7Z0JBQ3BFLG1CQUFtQixDQUFDLENBQUM7U0FDMUI7UUFFRCxJQUFJLGNBQWMsQ0FBQyxVQUFVLENBQUMsZ0JBQWdCLENBQUMsVUFBVSxDQUFDLEVBQUU7WUFDMUQsY0FBYyxHQUFHLGNBQWMsQ0FBQyxLQUFLLENBQUMsZ0JBQWdCLENB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VUFBVSxDQUFDLGdCQUFnQixDQUFDLFVBQVUsQ0FBQyxFQUFFO1lBQ3RFLE9BQU8sZ0JBQWdCLENBQUMsR0FBRyxDQUFDLEtBQUssQ0FBQyxnQkFBZ0IsQ0FBQyxVQUFVLENBQUMsTUFBTSxDQUFDLENBQUMsQ0FBQztTQUN4RTthQUFNO1lBQ0wsT0FBTyxJQUFJLENBQUM7U0FDYjtLQUNGO0FBQ0gsQ0FBQyxDQUFDO0FBQ0YsZ0JBQWdCLENBQUMsa0JBQWtCLENBQUMsc0JBQXNCLENBQUMsQ0FBQztBQUU1RDs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7R0FzQ0c7QUFDSCxNQUFNLFVBQVUsZ0JBQWdCLENBQUMsY0FBYyxHQUFHLE9BQU87SUFDdkQsT0FBTyxJQUFJLGdCQUFnQixDQUFDLGNBQWMsQ0FBQyxDQUFDO0FBQzlDLENBQUM7QUFFRDs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7O0dBdUNHO0FBQ0gsTUFBTSxVQUFVLFlBQVksQ0FBQyxLQUFhO0lBQ3hDLE9BQU8sSUFBSSxZQUFZLENBQUMsS0FBSyxDQUFDLENBQUM7QUFDakMsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbIi8qKlxuICogQGxpY2Vuc2VcbiAqIENvcHlyaWdodCAyMDE4IEdvb2dsZSBMTEMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuXG4gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgXCJMaWNlbnNlXCIpO1xuICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLlxuICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0XG4gKlxuICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wXG4gKlxuICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZVxuICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gXCJBUyBJU1wiIEJBU0lTLFxuICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuXG4gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kXG4gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS5cbiAqID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4gKi9cblxuLyoqXG4gKiBJT0hhbmRsZXJzIHJlbGF0ZWQgdG8gZmlsZXMsIHN1Y2ggYXMgYnJvd3Nlci10cmlnZ2VyZWQgZmlsZSBkb3dubG9hZHMsXG4gKiB1c2VyLXNlbGVjdGVkIGZpbGVzIGluIGJyb3dzZXIuXG4gKi9cblxuaW1wb3J0ICcuLi9mbGFncyc7XG5pbXBvcnQge2Vudn0gZnJvbSAnLi4vZW52aXJvbm1lbnQnO1xuXG5pbXBvcnQge2Jhc2VuYW1lLCBjb25jYXRlbmF0ZUFycmF5QnVmZmVycywgZ2V0TW9kZWxBcnRpZmFjdHNGb3JKU09OLCBnZXRNb2RlbEFydGlmYWN0c0luZm9Gb3JKU09OLCBnZXRNb2RlbEpTT05Gb3JNb2RlbEFydGlmYWN0c30gZnJvbSAnLi9pb191dGlscyc7XG5pbXBvcnQge0lPUm91dGVyLCBJT1JvdXRlclJlZ2lzdHJ5fSBmcm9tICcuL3JvdXRlcl9yZWdpc3RyeSc7XG5pbXBvcnQge0lPSGFuZGxlciwgTW9kZWxBcnRpZmFjdHMsIE1vZGVsSlNPTiwgU2F2ZVJlc3VsdCwgV2VpZ2h0c01hbmlmZXN0Q29uZmlnLCBXZWlnaHRzTWFuaWZlc3RFbnRyeX0gZnJvbSAnLi90eXBlcyc7XG5cbmNvbnN0IERFRkFVTFRfRklMRV9OQU1FX1BSRUZJWCA9ICdtb2RlbCc7XG5jb25zdCBERUZBVUxUX0pTT05fRVhURU5TSU9OX05BTUUgPSAnLmpzb24nO1xuY29uc3QgREVGQVVMVF9XRUlHSFRfREFUQV9FWFRFTlNJT05fTkFNRSA9ICcud2VpZ2h0cy5iaW4nO1xuXG5mdW5jdGlvbiBkZWZlcjxUPihmOiAoKSA9PiBUKTogUHJvbWlzZTxUPiB7XG4gIHJldHVybiBuZXcgUHJvbWlzZShyZXNvbHZlID0+IHNldFRpbWVvdXQocmVzb2x2ZSkpLnRoZW4oZik7XG59XG5cbmV4cG9ydCBjbGFzcyBCcm93c2VyRG93bmxvYWRzIGltcGxlbWVudHMgSU9IYW5kbGVyIHtcbiAgcHJpdmF0ZSByZWFkb25seSBtb2RlbEpzb25GaWxlTmFtZTogc3RyaW5nO1xuICBwcml2YXRlIHJlYWRvbmx5IHdlaWdodERhdGFGaWxlTmFtZTogc3RyaW5nO1xuICBwcml2YXRlIHJlYWRvbmx5IG1vZGVsSnNvbkFuY2hvcjogSFRNTEFuY2hvckVsZW1lbnQ7XG4gIHByaXZhdGUgcmVhZG9ubHkgd2VpZ2h0RGF0YUFuY2hvcjogSFRNTEFuY2hvckVsZW1lbnQ7XG5cbiAgc3RhdGljIHJlYWRvbmx5IFVSTF9TQ0hFTUUgPSAnZG93bmxvYWRzOi8vJztcblxuICBjb25zdHJ1Y3RvcihmaWxlTmFtZVByZWZpeD86IHN0cmluZykge1xuICAgIGlmICghZW52KCkuZ2V0Qm9vbCgnSVNfQlJPV1NFUicpKSB7XG4gICAgICAvLyBUT0RPKGNhaXMpOiBQcm92aWRlIGluZm8gb24gd2hhdCBJT0hhbmRsZXJzIGFyZSBhdmFpbGFibGUgdW5kZXIgdGhlXG4gICAgICAvLyAgIGN1cnJlbnQgZW52aXJvbm1lbnQuXG4gICAgICB0aHJvdyBuZXcgRXJyb3IoXG4gICAgICAgICAgJ2Jyb3dzZXJEb3dubG9hZHMoKSBjYW5ub3QgcHJvY2VlZCBiZWNhdXNlIHRoZSBjdXJyZW50IGVudmlyb25tZW50ICcgK1xuICAgICAgICAgICdpcyBub3QgYSBicm93c2VyLicpO1xuICAgIH1cblxuICAgIGlmIChmaWxlTmFtZVByZWZpeC5zdGFydHNXaXRoKEJyb3dzZXJEb3dubG9hZHMuVVJMX1NDSEVNRSkpIHtcbiAgICAgIGZpbGVOYW1lUHJlZml4ID0gZmlsZU5hbWVQcmVmaXguc2xpY2UoQnJvd3NlckRvd25sb2Fkcy5VUkxfU0NIRU1FLmxlbmd0aCk7XG4gICAgfVxuICAgIGlmIChmaWxlTmFtZVByZWZpeCA9PSBudWxsIHx8IGZpbGVOYW1lUHJlZml4Lmxlbmd0aCA9PT0gMCkge1xuICAgICAgZmlsZU5hbWVQcmVmaXggPSBERUZBVUxUX0ZJTEVfTkFNRV9QUkVGSVg7XG4gICAgfVxuXG4gICAgdGhpcy5tb2RlbEpzb25GaWxlTmFtZSA9IGZpbGVOYW1lUHJlZml4ICsgREVGQVVMVF9KU09OX0VYVEVOU0lPTl9OQU1FO1xuICAgIHRoaXMud2VpZ2h0RGF0YUZpbGVOYW1lID1cbiAgICAgICAgZmlsZU5hbWVQcmVmaXggKyBERUZBVUxUX1dFSUdIVF9EQVRBX0VYVEVOU0lPTl9OQU1FO1xuICB9XG5cbiAgYXN5bmMgc2F2ZShtb2RlbEFydGlmYWN0czogTW9kZWxBcnRpZmFjdHMpOiBQcm9taXNlPFNhdmVSZXN1bHQ+IHtcbiAgICBpZiAodHlwZW9mIChkb2N1bWVudCkgPT09ICd1bmRlZmluZWQnKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoXG4gICAgICAgICAgJ0Jyb3dzZXIgZG93bmxvYWRzIGFyZSBub3Qgc3VwcG9ydGVkIGluICcgK1xuICAgICAgICAgICd0aGlzIGVudmlyb25tZW50IHNpbmNlIGBkb2N1bWVudGAgaXMgbm90IHByZXNlbnQnKTtcbiAgICB9XG4gICAgY29uc3Qgd2VpZ2h0c1VSTCA9IHdpbmRvdy5VUkwuY3JlYXRlT2JqZWN0VVJMKG5ldyBCbG9iKFxuICAgICAgICBbbW9kZWxBcnRpZmFjdHMud2VpZ2h0RGF0YV0sIHt0eXBlOiAnYXBwbGljYXRpb24vb2N0ZXQtc3RyZWFtJ30pKTtcblxuICAgIGlmIChtb2RlbEFydGlmYWN0cy5tb2RlbFRvcG9sb2d5IGluc3RhbmNlb2YgQXJyYXlCdWZmZXIpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcihcbiAgICAgICAgICAnQnJvd3NlckRvd25sb2Fkcy5zYXZlKCkgZG9lcyBub3Qgc3VwcG9ydCBzYXZpbmcgbW9kZWwgdG9wb2xvZ3kgJyArXG4gICAgICAgICAgJ2luIGJpbmFyeSBmb3JtYXRzIHlldC4nKTtcbiAgICB9IGVsc2Uge1xuICAgICAgY29uc3Qgd2VpZ2h0c01hbmlmZXN0OiBXZWlnaHRzTWFuaWZlc3RDb25maWcgPSBbe1xuICAgICAgICBwYXRoczogWycuLycgKyB0aGlzLndlaWdodERhdGFGaWxlTmFtZV0sXG4gICAgICAgIHdlaWdodHM6IG1vZGVsQXJ0aWZhY3RzLndlaWdodFNwZWNzXG4gICAgICB9XTtcbiAgICAgIGNvbnN0IG1vZGVsSlNPTjogTW9kZWxKU09OID1cbiAgICAgICAgICBnZXRNb2RlbEpTT05Gb3JNb2RlbEFydGlmYWN0cyhtb2RlbEFydGlmYWN0cywgd2VpZ2h0c01hbmlmZXN0KTtcblxuICAgICAgY29uc3QgbW9kZWxKc29uVVJMID0gd2luZG93LlVSTC5jcmVhdGVPYmplY3RVUkwoXG4gICAgICAgICAgbmV3IEJsb2IoW0pTT04uc3RyaW5naWZ5KG1vZGVsSlNPTildLCB7dHlwZTogJ2FwcGxpY2F0aW9uL2pzb24nfSkpO1xuXG4gICAgICAvLyBJZiBhbmNob3IgZWxlbWVudHMgYXJlIG5vdCBwcm92aWRlZCwgY3JlYXRlIHRoZW0gd2l0aG91dCBhdHRhY2hpbmcgdGhlbVxuICAgICAgLy8gdG8gcGFyZW50cywgc28gdGhhdCB0aGUgZG93bmxvYWRlZCBmaWxlIG5hbWVzIGNhbiBiZSBjb250cm9sbGVkLlxuICAgICAgY29uc3QganNvbkFuY2hvciA9IHRoaXMubW9kZWxKc29uQW5jaG9yID09IG51bGwgP1xuICAgICAgICAgIGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ2EnKSA6XG4gICAgICAgICAgdGhpcy5tb2RlbEpzb25BbmNob3I7XG4gICAgICBqc29uQW5jaG9yLmRvd25sb2FkID0gdGhpcy5tb2RlbEpzb25GaWxlTmFtZTtcbiAgICAgIGpzb25BbmNob3IuaHJlZiA9IG1vZGVsSnNvblVSTDtcbiAgICAgIC8vIFRyaWdnZXIgZG93bmxvYWRzIGJ5IGV2b2tpbmcgYSBjbGljayBldmVudCBvbiB0aGUgZG93bmxvYWQgYW5jaG9ycy5cbiAgICAgIC8vIFdoZW4gbXVsdGlwbGUgZG93bmxvYWRzIGFyZSBzdGFydGVkIHN5bmNocm9ub3VzbHksIEZpcmVmb3ggd2lsbCBvbmx5XG4gICAgICAvLyBzYXZlIHRoZSBsYXN0IG9uZS5cbiAgICAgIGF3YWl0IGRlZmVyKCgpID0+IGpzb25BbmNob3IuZGlzcGF0Y2hFdmVudChuZXcgTW91c2VFdmVudCgnY2xpY2snKSkpO1xuXG4gICAgICBpZiAobW9kZWxBcnRpZmFjdHMud2VpZ2h0RGF0YSAhPSBudWxsKSB7XG4gICAgICAgIGNvbnN0IHdlaWdodERhdGFBbmNob3IgPSB0aGlzLndlaWdodERhdGFBbmNob3IgPT0gbnVsbCA/XG4gICAgICAgICAgICBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCdhJykgOlxuICAgICAgICAgICAgdGhpcy53ZWlnaHREYXRhQW5jaG9yO1xuICAgICAgICB3ZWlnaHREYXRhQW5jaG9yLmRvd25sb2FkID0gdGhpcy53ZWlnaHREYXRhRmlsZU5hbWU7XG4gICAgICAgIHdlaWdodERhdGFBbmNob3IuaHJlZiA9IHdlaWdodHNVUkw7XG4gICAgICAgIGF3YWl0IGRlZmVyKFxuICAgICAgICAgICAgKCkgPT4gd2VpZ2h0RGF0YUFuY2hvci5kaXNwYXRjaEV2ZW50KG5ldyBNb3VzZUV2ZW50KCdjbGljaycpKSk7XG4gICAgICB9XG5cbiAgICAgIHJldHVybiB7bW9kZWxBcnRpZmFjdHNJbmZvOiBnZXRNb2RlbEFydGlmYWN0c0luZm9Gb3JKU09OKG1vZGVsQXJ0aWZhY3RzKX07XG4gICAgfVxuICB9XG59XG5cbmNsYXNzIEJyb3dzZXJGaWxlcyBpbXBsZW1lbnRzIElPSGFuZGxlciB7XG4gIHByaXZhdGUgcmVhZG9ubHkganNvbkZpbGU6IEZpbGU7XG4gIHByaXZhdGUgcmVhZG9ubHkgd2VpZ2h0c0ZpbGVzOiBGaWxlW107XG5cbiAgY29uc3RydWN0b3IoZmlsZXM6IEZpbGVbXSkge1xuICAgIGlmIChmaWxlcyA9PSBudWxsIHx8IGZpbGVzLmxlbmd0aCA8IDEpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcihcbiAgICAgICAgICBgV2hlbiBjYWxsaW5nIGJyb3dzZXJGaWxlcywgYXQgbGVhc3QgMSBmaWxlIGlzIHJlcXVpcmVkLCBgICtcbiAgICAgICAgICBgYnV0IHJlY2VpdmVkICR7ZmlsZXN9YCk7XG4gICAgfVxuICAgIHRoaXMuanNvbkZpbGUgPSBmaWxlc1swXTtcbiAgICB0aGlzLndlaWdodHNGaWxlcyA9IGZpbGVzLnNsaWNlKDEpO1xuICB9XG5cbiAgYXN5bmMgbG9hZCgpOiBQcm9taXNlPE1vZGVsQXJ0aWZhY3RzPiB7XG4gICAgcmV0dXJuIG5ldyBQcm9taXNlKChyZXNvbHZlLCByZWplY3QpID0+IHtcbiAgICAgIGNvbnN0IGpzb25SZWFkZXIgPSBuZXcgRmlsZVJlYWRlcigpO1xuICAgICAganNvblJlYWRlci5vbmxvYWQgPSAoZXZlbnQ6IEV2ZW50KSA9PiB7XG4gICAgICAgIC8vIHRzbGludDpkaXNhYmxlLW5leHQtbGluZTpuby1hbnlcbiAgICAgICAgY29uc3QgbW9kZWxKU09OID0gSlNPTi5wYXJzZSgoZXZlbnQudGFyZ2V0IGFzIGFueSkucmVzdWx0KSBhcyBNb2RlbEpTT047XG5cbiAgICAgICAgY29uc3QgbW9kZWxUb3BvbG9neSA9IG1vZGVsSlNPTi5tb2RlbFRvcG9sb2d5O1xuICAgICAgICBpZiAobW9kZWxUb3BvbG9neSA9PSBudWxsKSB7XG4gICAgICAgICAgcmVqZWN0KG5ldyBFcnJvcihgbW9kZWxUb3BvbG9neSBmaWVsZCBpcyBtaXNzaW5nIGZyb20gZmlsZSAke1xuICAgICAgICAgICAgICB0aGlzLmpzb25GaWxlLm5hbWV9YCkpO1xuICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuXG4gICAgICAgIGNvbnN0IHdlaWdodHNNYW5pZmVzdCA9IG1vZGVsSlNPTi53ZWlnaHRzTWFuaWZlc3Q7XG4gICAgICAgIGlmICh3ZWlnaHRzTWFuaWZlc3QgPT0gbnVsbCkge1xuICAgICAgICAgIHJlamVjdChuZXcgRXJyb3IoYHdlaWdodE1hbmlmZXN0IGZpZWxkIGlzIG1pc3NpbmcgZnJvbSBmaWxlICR7XG4gICAgICAgICAgICAgIHRoaXMuanNvbkZpbGUubmFtZX1gKSk7XG4gICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG5cbiAgICAgICAgaWYgKHRoaXMud2VpZ2h0c0ZpbGVzLmxlbmd0aCA9PT0gMCkge1xuICAgICAgICAgIHJlc29sdmUoe21vZGVsVG9wb2xvZ3l9KTtcbiAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cblxuICAgICAgICBjb25zdCBtb2RlbEFydGlmYWN0c1Byb21pc2UgPSBnZXRNb2RlbEFydGlmYWN0c0ZvckpTT04oXG4gICAgICAgICAgICBtb2RlbEpTT04sICh3ZWlnaHRzTWFuaWZlc3QpID0+IHRoaXMubG9hZFdlaWdodHMod2VpZ2h0c01hbmlmZXN0KSk7XG4gICAgICAgIHJlc29sdmUobW9kZWxBcnRpZmFjdHNQcm9taXNlKTtcbiAgICAgIH07XG5cbiAgICAgIGpzb25SZWFkZXIub25lcnJvciA9IGVycm9yID0+IHJlamVjdChcbiAgICAgICAgICBgRmFpbGVkIHRvIHJlYWQgbW9kZWwgdG9wb2xvZ3kgYW5kIHdlaWdodHMgbWFuaWZlc3QgSlNPTiBgICtcbiAgICAgICAgICBgZnJvbSBmaWxlICcke3RoaXMuanNvbkZpbGUubmFtZX0nLiBCcm93c2VyRmlsZXMgc3VwcG9ydHMgbG9hZGluZyBgICtcbiAgICAgICAgICBgS2VyYXMtc3R5bGUgdGYuTW9kZWwgYXJ0aWZhY3RzIG9ubHkuYCk7XG4gICAgICBqc29uUmVhZGVyLnJlYWRBc1RleHQodGhpcy5qc29uRmlsZSk7XG4gICAgfSk7XG4gIH1cblxuICBwcml2YXRlIGxvYWRXZWlnaHRzKHdlaWdodHNNYW5pZmVzdDogV2VpZ2h0c01hbmlmZXN0Q29uZmlnKTogUHJvbWlzZTxbXG4gICAgLyogd2VpZ2h0U3BlY3MgKi8gV2VpZ2h0c01hbmlmZXN0RW50cnlbXSwgLyogd2VpZ2h0RGF0YSAqLyBBcnJheUJ1ZmZlclxuICBdPiB7XG4gICAgY29uc3Qgd2VpZ2h0U3BlY3M6IFdlaWdodHNNYW5pZmVzdEVudHJ5W10gPSBbXTtcbiAgICBjb25zdCBwYXRoczogc3RyaW5nW10gPSBbXTtcbiAgICBmb3IgKGNvbnN0IGVudHJ5IG9mIHdlaWdodHNNYW5pZmVzdCkge1xuICAgICAgd2VpZ2h0U3BlY3MucHVzaCguLi5lbnRyeS53ZWlnaHRzKTtcbiAgICAgIHBhdGhzLnB1c2goLi4uZW50cnkucGF0aHMpO1xuICAgIH1cblxuICAgIGNvbnN0IHBhdGhUb0ZpbGU6IHtbcGF0aDogc3RyaW5nXTogRmlsZX0gPVxuICAgICAgICB0aGlzLmNoZWNrTWFuaWZlc3RBbmRXZWlnaHRGaWxlcyh3ZWlnaHRzTWFuaWZlc3QpO1xuXG4gICAgY29uc3QgcHJvbWlzZXM6IEFycmF5PFByb21pc2U8QXJyYXlCdWZmZXI+PiA9XG4gICAgICAgIHBhdGhzLm1hcChwYXRoID0+IHRoaXMubG9hZFdlaWdodHNGaWxlKHBhdGgsIHBhdGhUb0ZpbGVbcGF0aF0pKTtcblxuICAgIHJldHVybiBQcm9taXNlLmFsbChwcm9taXNlcykudGhlbihcbiAgICAgICAgYnVmZmVycyA9PiBbd2VpZ2h0U3BlY3MsIGNvbmNhdGVuYXRlQXJyYXlCdWZmZXJzKGJ1ZmZlcnMpXSk7XG4gIH1cblxuICBwcml2YXRlIGxvYWRXZWlnaHRzRmlsZShwYXRoOiBzdHJpbmcsIGZpbGU6IEZpbGUpOiBQcm9taXNlPEFycmF5QnVmZmVyPiB7XG4gICAgcmV0dXJuIG5ldyBQcm9taXNlKChyZXNvbHZlLCByZWplY3QpID0+IHtcbiAgICAgIGNvbnN0IHdlaWdodEZpbGVSZWFkZXIgPSBuZXcgRmlsZVJlYWRlcigpO1xuICAgICAgd2VpZ2h0RmlsZVJlYWRlci5vbmxvYWQgPSAoZXZlbnQ6IEV2ZW50KSA9PiB7XG4gICAgICAgIC8vIHRzbGludDpkaXNhYmxlLW5leHQtbGluZTpuby1hbnlcbiAgICAgICAgY29uc3Qgd2VpZ2h0RGF0YSA9IChldmVudC50YXJnZXQgYXMgYW55KS5yZXN1bHQgYXMgQXJyYXlCdWZmZXI7XG4gICAgICAgIHJlc29sdmUod2VpZ2h0RGF0YSk7XG4gICAgICB9O1xuICAgICAgd2VpZ2h0RmlsZVJlYWRlci5vbmVycm9yID0gZXJyb3IgPT5cbiAgICAgICAgICByZWplY3QoYEZhaWxlZCB0byB3ZWlnaHRzIGRhdGEgZnJvbSBmaWxlIG9mIHBhdGggJyR7cGF0aH0nLmApO1xuICAgICAgd2VpZ2h0RmlsZVJlYWRlci5yZWFkQXNBcnJheUJ1ZmZlcihmaWxlKTtcbiAgICB9KTtcbiAgfVxuXG4gIC8qKlxuICAgKiBDaGVjayB0aGUgY29tcGF0aWJpbGl0eSBiZXR3ZWVuIHdlaWdodHMgbWFuaWZlc3QgYW5kIHdlaWdodCBmaWxlcy5cbiAgICovXG4gIHByaXZhdGUgY2hlY2tNYW5pZmVzdEFuZFdlaWdodEZpbGVzKG1hbmlmZXN0OiBXZWlnaHRzTWFuaWZlc3RDb25maWcpOlxuICAgICAge1twYXRoOiBzdHJpbmddOiBGaWxlfSB7XG4gICAgY29uc3QgYmFzZW5hbWVzOiBzdHJpbmdbXSA9IFtdO1xuICAgIGNvbnN0IGZpbGVOYW1lcyA9IHRoaXMud2VpZ2h0c0ZpbGVzLm1hcChmaWxlID0+IGJhc2VuYW1lKGZpbGUubmFtZSkpO1xuICAgIGNvbnN0IHBhdGhUb0ZpbGU6IHtbcGF0aDogc3RyaW5nXTogRmlsZX0gPSB7fTtcbiAgICBmb3IgKGNvbnN0IGdyb3VwIG9mIG1hbmlmZXN0KSB7XG4gICAgICBncm91cC5wYXRocy5mb3JFYWNoKHBhdGggPT4ge1xuICAgICAgICBjb25zdCBwYXRoQmFzZW5hbWUgPSBiYXNlbmFtZShwYXRoKTtcbiAgICAgICAgaWYgKGJhc2VuYW1lcy5pbmRleE9mKHBhdGhCYXNlbmFtZSkgIT09IC0xKSB7XG4gICAgICAgICAgdGhyb3cgbmV3IEVycm9yKFxuICAgICAgICAgICAgICBgRHVwbGljYXRlIGZpbGUgYmFzZW5hbWUgZm91bmQgaW4gd2VpZ2h0cyBtYW5pZmVzdDogYCArXG4gICAgICAgICAgICAgIGAnJHtwYXRoQmFzZW5hbWV9J2ApO1xuICAgICAgICB9XG4gICAgICAgIGJhc2VuYW1lcy5wdXNoKHBhdGhCYXNlbmFtZSk7XG4gICAgICAgIGlmIChmaWxlTmFtZXMuaW5kZXhPZihwYXRoQmFzZW5hbWUpID09PSAtMSkge1xuICAgICAgICAgIHRocm93IG5ldyBFcnJvcihcbiAgICAgICAgICAgICAgYFdlaWdodCBmaWxlIHdpdGggYmFzZW5hbWUgJyR7cGF0aEJhc2VuYW1lfScgaXMgbm90IHByb3ZpZGVkLmApO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIHBhdGhUb0ZpbGVbcGF0aF0gPSB0aGlzLndlaWdodHNGaWxlc1tmaWxlTmFtZXMuaW5kZXhPZihwYXRoQmFzZW5hbWUpXTtcbiAgICAgICAgfVxuICAgICAgfSk7XG4gICAgfVxuXG4gICAgaWYgKGJhc2VuYW1lcy5sZW5ndGggIT09IHRoaXMud2VpZ2h0c0ZpbGVzLmxlbmd0aCkge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKFxuICAgICAgICAgIGBNaXNtYXRjaCBpbiB0aGUgbnVtYmVyIG9mIGZpbGVzIGluIHdlaWdodHMgbWFuaWZlc3QgYCArXG4gICAgICAgICAgYCgke2Jhc2VuYW1lcy5sZW5ndGh9KSBhbmQgdGhlIG51bWJlciBvZiB3ZWlnaHQgZmlsZXMgcHJvdmlkZWQgYCArXG4gICAgICAgICAgYCgke3RoaXMud2VpZ2h0c0ZpbGVzLmxlbmd0aH0pLmApO1xuICAgIH1cbiAgICByZXR1cm4gcGF0aFRvRmlsZTtcbiAgfVxufVxuXG5leHBvcnQgY29uc3QgYnJvd3NlckRvd25sb2Fkc1JvdXRlcjogSU9Sb3V0ZXIgPSAodXJsOiBzdHJpbmd8c3RyaW5nW10pID0+IHtcbiAgaWYgKCFlbnYoKS5nZXRCb29sKCdJU19CUk9XU0VSJykpIHtcbiAgICByZXR1cm4gbnVsbDtcbiAgfSBlbHNlIHtcbiAgICBpZiAoIUFycmF5LmlzQXJyYXkodXJsKSAmJiB1cmwuc3RhcnRzV2l0aChCcm93c2VyRG93bmxvYWRzLlVSTF9TQ0hFTUUpKSB7XG4gICAgICByZXR1cm4gYnJvd3NlckRvd25sb2Fkcyh1cmwuc2xpY2UoQnJvd3NlckRvd25sb2Fkcy5VUkxfU0NIRU1FLmxlbmd0aCkpO1xuICAgIH0gZWxzZSB7XG4gICAgICByZXR1cm4gbnVsbDtcbiAgICB9XG4gIH1cbn07XG5JT1JvdXRlclJlZ2lzdHJ5LnJlZ2lzdGVyU2F2ZVJvdXRlcihicm93c2VyRG93bmxvYWRzUm91dGVyKTtcblxuLyoqXG4gKiBDcmVhdGVzIGFuIElPSGFuZGxlciB0aGF0IHRyaWdnZXJzIGZpbGUgZG93bmxvYWRzIGZyb20gdGhlIGJyb3dzZXIuXG4gKlxuICogVGhlIHJldHVybmVkIGBJT0hhbmRsZXJgIGluc3RhbmNlIGNhbiBiZSB1c2VkIGFzIG1vZGVsIGV4cG9ydGluZyBtZXRob2RzIHN1Y2hcbiAqIGFzIGB0Zi5Nb2RlbC5zYXZlYCBhbmQgc3VwcG9ydHMgb25seSBzYXZpbmcuXG4gKlxuICogYGBganNcbiAqIGNvbnN0IG1vZGVsID0gdGYuc2VxdWVudGlhbCgpO1xuICogbW9kZWwuYWRkKHRmLmxheWVycy5kZW5zZShcbiAqICAgICB7dW5pdHM6IDEsIGlucHV0U2hhcGU6IFsxMF0sIGFjdGl2YXRpb246ICdzaWdtb2lkJ30pKTtcbiAqIGNvbnN0IHNhdmVSZXN1bHQgPSBhd2FpdCBtb2RlbC5zYXZlKCdkb3dubG9hZHM6Ly9teW1vZGVsJyk7XG4gKiAvLyBUaGlzIHdpbGwgdHJpZ2dlciBkb3dubG9hZGluZyBvZiB0d28gZmlsZXM6XG4gKiAvLyAgICdteW1vZGVsLmpzb24nIGFuZCAnbXltb2RlbC53ZWlnaHRzLmJpbicuXG4gKiBjb25zb2xlLmxvZyhzYXZlUmVzdWx0KTtcbiAqIGBgYFxuICpcbiAqIEBwYXJhbSBmaWxlTmFtZVByZWZpeCBQcmVmaXggbmFtZSBvZiB0aGUgZmlsZXMgdG8gYmUgZG93bmxvYWRlZC4gRm9yIHVzZSB3aXRoXG4gKiAgIGB0Zi5Nb2RlbGAsIGBmaWxlTmFtZVByZWZpeGAgc2hvdWxkIGZvbGxvdyBlaXRoZXIgb2YgdGhlIGZvbGxvd2luZyB0d29cbiAqICAgZm9ybWF0czpcbiAqICAgMS4gYG51bGxgIG9yIGB1bmRlZmluZWRgLCBpbiB3aGljaCBjYXNlIHRoZSBkZWZhdWx0IGZpbGVcbiAqICAgICAgbmFtZXMgd2lsbCBiZSB1c2VkOlxuICogICAgICAtICdtb2RlbC5qc29uJyBmb3IgdGhlIEpTT04gZmlsZSBjb250YWluaW5nIHRoZSBtb2RlbCB0b3BvbG9neSBhbmRcbiAqICAgICAgICB3ZWlnaHRzIG1hbmlmZXN0LlxuICogICAgICAtICdtb2RlbC53ZWlnaHRzLmJpbicgZm9yIHRoZSBiaW5hcnkgZmlsZSBjb250YWluaW5nIHRoZSBiaW5hcnkgd2VpZ2h0XG4gKiAgICAgICAgdmFsdWVzLlxuICogICAyLiBBIHNpbmdsZSBzdHJpbmcgb3IgYW4gQXJyYXkgb2YgYSBzaW5nbGUgc3RyaW5nLCBhcyB0aGUgZmlsZSBuYW1lIHByZWZpeC5cbiAqICAgICAgRm9yIGV4YW1wbGUsIGlmIGAnZm9vJ2AgaXMgcHJvdmlkZWQsIHRoZSBkb3dubG9hZGVkIEpTT05cbiAqICAgICAgZmlsZSBhbmQgYmluYXJ5IHdlaWdodHMgZmlsZSB3aWxsIGJlIG5hbWVkICdmb28uanNvbicgYW5kXG4gKiAgICAgICdmb28ud2VpZ2h0cy5iaW4nLCByZXNwZWN0aXZlbHkuXG4gKiBAcGFyYW0gY29uZmlnIEFkZGl0aW9uYWwgY29uZmlndXJhdGlvbiBmb3IgdHJpZ2dlcmluZyBkb3dubG9hZHMuXG4gKiBAcmV0dXJucyBBbiBpbnN0YW5jZSBvZiBgQnJvd3NlckRvd25sb2Fkc2AgYElPSGFuZGxlcmAuXG4gKlxuICogQGRvYyB7XG4gKiAgIGhlYWRpbmc6ICdNb2RlbHMnLFxuICogICBzdWJoZWFkaW5nOiAnTG9hZGluZycsXG4gKiAgIG5hbWVzcGFjZTogJ2lvJyxcbiAqICAgaWdub3JlQ0k6IHRydWVcbiAqIH1cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGJyb3dzZXJEb3dubG9hZHMoZmlsZU5hbWVQcmVmaXggPSAnbW9kZWwnKTogSU9IYW5kbGVyIHtcbiAgcmV0dXJuIG5ldyBCcm93c2VyRG93bmxvYWRzKGZpbGVOYW1lUHJlZml4KTtcbn1cblxuLyoqXG4gKiBDcmVhdGVzIGFuIElPSGFuZGxlciB0aGF0IGxvYWRzIG1vZGVsIGFydGlmYWN0cyBmcm9tIHVzZXItc2VsZWN0ZWQgZmlsZXMuXG4gKlxuICogVGhpcyBtZXRob2QgY2FuIGJlIHVzZWQgZm9yIGxvYWRpbmcgZnJvbSBmaWxlcyBzdWNoIGFzIHVzZXItc2VsZWN0ZWQgZmlsZXNcbiAqIGluIHRoZSBicm93c2VyLlxuICogV2hlbiB1c2VkIGluIGNvbmp1bmN0aW9uIHdpdGggYHRmLmxvYWRMYXllcnNNb2RlbGAsIGFuIGluc3RhbmNlIG9mXG4gKiBgdGYuTGF5ZXJzTW9kZWxgIChLZXJhcy1zdHlsZSkgY2FuIGJlIGNvbnN0cnVjdGVkIGZyb20gdGhlIGxvYWRlZCBhcnRpZmFjdHMuXG4gKlxuICogYGBganNcbiAqIC8vIE5vdGU6IFRoaXMgY29kZSBzbmlwcGV0IHdvbid0IHJ1biBwcm9wZXJseSB3aXRob3V0IHRoZSBhY3R1YWwgZmlsZSBpbnB1dFxuICogLy8gICBlbGVtZW50cyBpbiB0aGUgSFRNTCBET00uXG4gKlxuICogLy8gU3VwcG9zZSB0aGVyZSBhcmUgdHdvIEhUTUwgZmlsZSBpbnB1dCAoYDxpbnB1dCB0eXBlPVwiZmlsZVwiIC4uLj5gKVxuICogLy8gZWxlbWVudHMuXG4gKiBjb25zdCB1cGxvYWRKU09OSW5wdXQgPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgndXBsb2FkLWpzb24nKTtcbiAqIGNvbnN0IHVwbG9hZFdlaWdodHNJbnB1dCA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCd1cGxvYWQtd2VpZ2h0cycpO1xuICogY29uc3QgbW9kZWwgPSBhd2FpdCB0Zi5sb2FkTGF5ZXJzTW9kZWwodGYuaW8uYnJvd3NlckZpbGVzKFxuICogICAgIFt1cGxvYWRKU09OSW5wdXQuZmlsZXNbMF0sIHVwbG9hZFdlaWdodHNJbnB1dC5maWxlc1swXV0pKTtcbiAqIGBgYFxuICpcbiAqIEBwYXJhbSBmaWxlcyBgRmlsZWBzIHRvIGxvYWQgZnJvbS4gQ3VycmVudGx5LCB0aGlzIGZ1bmN0aW9uIHN1cHBvcnRzIG9ubHlcbiAqICAgbG9hZGluZyBmcm9tIGZpbGVzIHRoYXQgY29udGFpbiBLZXJhcy1zdHlsZSBtb2RlbHMgKGkuZS4sIGB0Zi5Nb2RlbGBzKSwgZm9yXG4gKiAgIHdoaWNoIGFuIGBBcnJheWAgb2YgYEZpbGVgcyBpcyBleHBlY3RlZCAoaW4gdGhhdCBvcmRlcik6XG4gKiAgIC0gQSBKU09OIGZpbGUgY29udGFpbmluZyB0aGUgbW9kZWwgdG9wb2xvZ3kgYW5kIHdlaWdodCBtYW5pZmVzdC5cbiAqICAgLSBPcHRpb25hbGx5LCBvbmUgb3IgbW9yZSBiaW5hcnkgZmlsZXMgY29udGFpbmluZyB0aGUgYmluYXJ5IHdlaWdodHMuXG4gKiAgICAgVGhlc2UgZmlsZXMgbXVzdCBoYXZlIG5hbWVzIHRoYXQgbWF0Y2ggdGhlIHBhdGhzIGluIHRoZSBgd2VpZ2h0c01hbmlmZXN0YFxuICogICAgIGNvbnRhaW5lZCBieSB0aGUgYWZvcmVtZW50aW9uZWQgSlNPTiBmaWxlLCBvciBlcnJvcnMgd2lsbCBiZSB0aHJvd25cbiAqICAgICBkdXJpbmcgbG9hZGluZy4gVGhlc2Ugd2VpZ2h0cyBmaWxlcyBoYXZlIHRoZSBzYW1lIGZvcm1hdCBhcyB0aGUgb25lc1xuICogICAgIGdlbmVyYXRlZCBieSBgdGVuc29yZmxvd2pzX2NvbnZlcnRlcmAgdGhhdCBjb21lcyB3aXRoIHRoZSBgdGVuc29yZmxvd2pzYFxuICogICAgIFB5dGhvbiBQSVAgcGFja2FnZS4gSWYgbm8gd2VpZ2h0cyBmaWxlcyBhcmUgcHJvdmlkZWQsIG9ubHkgdGhlIG1vZGVsXG4gKiAgICAgdG9wb2xvZ3kgd2lsbCBiZSBsb2FkZWQgZnJvbSB0aGUgSlNPTiBmaWxlIGFib3ZlLlxuICogQHJldHVybnMgQW4gaW5zdGFuY2Ugb2YgYEZpbGVzYCBgSU9IYW5kbGVyYC5cbiAqXG4gKiBAZG9jIHtcbiAqICAgaGVhZGluZzogJ01vZGVscycsXG4gKiAgIHN1YmhlYWRpbmc6ICdMb2FkaW5nJyxcbiAqICAgbmFtZXNwYWNlOiAnaW8nLFxuICogICBpZ25vcmVDSTogdHJ1ZVxuICogfVxuICovXG5leHBvcnQgZnVuY3Rpb24gYnJvd3NlckZpbGVzKGZpbGVzOiBGaWxlW10pOiBJT0hhbmRsZXIge1xuICByZXR1cm4gbmV3IEJyb3dzZXJGaWxlcyhmaWxlcyk7XG59XG4iXX0=","/**\n * @license\n * Copyright 2019 Google LLC. All Rights Reserved.\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n * =============================================================================\n */\nimport { assert } from '../util';\n/**\n * Monitor Promise.all progress, fire onProgress callback function.\n *\n * @param promises Promise list going to be monitored\n * @param onProgress Callback function. Fired when a promise resolved.\n * @param startFraction Optional fraction start. Default to 0.\n * @param endFraction Optional fraction end. Default to 1.\n */\nexport function monitorPromisesProgress(promises, onProgress, startFraction, endFraction) {\n checkPromises(promises);\n startFraction = startFraction == null ? 0 : startFraction;\n endFraction = endFraction == null ? 1 : endFraction;\n checkFraction(startFraction, endFraction);\n let resolvedPromise = 0;\n const registerMonitor = (promise) => {\n promise.then(value => {\n const fraction = startFraction +\n ++resolvedPromise / promises.length * (endFraction - startFraction);\n // pass fraction as parameter to callback function.\n onProgress(fraction);\n return value;\n });\n return promise;\n };\n function checkPromises(promises) {\n assert(promises != null && Array.isArray(promises) && promises.length > 0, () => 'promises must be a none empty array');\n }\n function checkFraction(startFraction, endFraction) {\n assert(startFraction >= 0 && startFraction <= 1, () => `Progress fraction must be in range [0, 1], but ` +\n `got startFraction ${startFraction}`);\n assert(endFraction >= 0 && endFraction <= 1, () => `Progress fraction must be in range [0, 1], but ` +\n `got endFraction ${endFraction}`);\n assert(endFraction >= startFraction, () => `startFraction must be no more than endFraction, but ` +\n `got startFraction ${startFraction} and endFraction ` +\n `${endFraction}`);\n }\n return Promise.all(promises.map(registerMonitor));\n}\n//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicHJvZ3Jlc3MuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi8uLi90ZmpzLWNvcmUvc3JjL2lvL3Byb2dyZXNzLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBOzs7Ozs7Ozs7Ozs7Ozs7R0FlRztBQUVILE9BQU8sRUFBQyxNQUFNLEVBQUMsTUFBTSxTQUFTLENBQUM7QUFJL0I7Ozs7Ozs7R0FPRztBQUNILE1BQU0sVUFBVSx1QkFBdUIsQ0FDbkMsUUFBaUMsRUFBRSxVQUE4QixFQUNqRSxhQUFzQixFQUFFLFdBQW9CO0lBQzlDLGFBQWEsQ0FBQyxRQUFRLENBQUMsQ0FBQztJQUN4QixhQUFhLEdBQUcsYUFBYSxJQUFJLElBQUksQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxhQUFhLENBQUM7SUFDMUQsV0FBVyxHQUFHLFdBQVcsSUFBSSxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsV0FBVyxDQUFDO0lBQ3BELGFBQWEsQ0FBQyxhQUFhLEVBQUUsV0FBVyxDQUFDLENBQUM7SUFDMUMsSUFBSSxlQUFlLEdBQUcsQ0FBQyxDQUFDO0lBRXhCLE1BQU0sZUFBZSxHQUFHLENBQUMsT0FBb0IsRUFBRSxFQUFFO1FBQy9DLE9BQU8sQ0FBQyxJQUFJLENBQUMsS0FBSyxDQUFDLEVBQUU7WUFDbkIsTUFBTSxRQUFRLEdBQUcsYUFBYTtnQkFDMUIsRUFBRSxlQUFlLEdBQUcsUUFBUSxDQUFDLE1BQU0sR0FBRyxDQUFDLFdBQVcsR0FBRyxhQUFhLENBQUMsQ0FBQztZQUN4RSxtREFBbUQ7WUFDbkQsVUFBVSxDQUFDLFFBQVEsQ0FBQyxDQUFDO1lBQ3JCLE9BQU8sS0FBSyxDQUFDO1FBQ2YsQ0FBQyxDQUFDLENBQUM7UUFDSCxPQUFPLE9BQU8sQ0FBQztJQUNqQixDQUFDLENBQUM7SUFFRixTQUFTLGFBQWEsQ0FBQyxRQUFpQztRQUN0RCxNQUFNLENBQ0YsUUFBUSxJQUFJLElBQUksSUFBSSxLQUFLLENBQUMsT0FBTyxDQUFDLFFBQVEsQ0FBQyxJQUFJLFFBQVEsQ0FBQyxNQUFNLEdBQUcsQ0FBQyxFQUNsRSxHQUFHLEVBQUUsQ0FBQyxxQ0FBcUMsQ0FBQyxDQUFDO0lBQ25ELENBQUM7SUFFRCxTQUFTLGFBQWEsQ0FBQyxhQUFxQixFQUFFLFdBQW1CO1FBQy9ELE1BQU0sQ0FDRixhQUFhLElBQUksQ0FBQyxJQUFJLGFBQWEsSUFBSSxDQUFDLEVBQ3hDLEdBQUcsRUFBRSxDQUFDLGlEQUFpRDtZQUNuRCxxQkFBcUIsYUFBYSxFQUFFLENBQUMsQ0FBQztRQUM5QyxNQUFNLENBQ0YsV0FBVyxJQUFJLENBQUMsSUFBSSxXQUFXLElBQUksQ0FBQyxFQUNwQyxHQUFHLEVBQUUsQ0FBQyxpREFBaUQ7WUFDbkQsbUJBQW1CLFdBQVcsRUFBRSxDQUFDLENBQUM7UUFDMUMsTUFBTSxDQUNGLFdBQVcsSUFBSSxhQUFhLEVBQzVCLEdBQUcsRUFBRSxDQUFDLHNEQUFzRDtZQUN4RCxxQkFBcUIsYUFBYSxtQkFBbUI7WUFDckQsR0FBRyxXQUFXLEVBQUUsQ0FBQyxDQUFDO0lBQzVCLENBQUM7SUFFRCxPQUFPLE9BQU8sQ0FBQyxHQUFHLENBQUMsUUFBUSxDQUFDLEdBQUcsQ0FBQyxlQUFlLENBQUMsQ0FBQyxDQUFDO0FBQ3BELENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyIvKipcbiAqIEBsaWNlbnNlXG4gKiBDb3B5cmlnaHQgMjAxOSBHb29nbGUgTExDLiBBbGwgUmlnaHRzIFJlc2VydmVkLlxuICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlIFwiTGljZW5zZVwiKTtcbiAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS5cbiAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdFxuICpcbiAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMFxuICpcbiAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmVcbiAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuIFwiQVMgSVNcIiBCQVNJUyxcbiAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLlxuICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZFxuICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuXG4gKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuICovXG5cbmltcG9ydCB7YXNzZXJ0fSBmcm9tICcuLi91dGlsJztcblxuaW1wb3J0IHtPblByb2dyZXNzQ2FsbGJhY2t9IGZyb20gJy4vdHlwZXMnO1xuXG4vKipcbiAqIE1vbml0b3IgUHJvbWlzZS5hbGwgcHJvZ3Jlc3MsIGZpcmUgb25Qcm9ncmVzcyBjYWxsYmFjayBmdW5jdGlvbi5cbiAqXG4gKiBAcGFyYW0gcHJvbWlzZXMgUHJvbWlzZSBsaXN0IGdvaW5nIHRvIGJlIG1vbml0b3JlZFxuICogQHBhcmFtIG9uUHJvZ3Jlc3MgQ2FsbGJhY2sgZnVuY3Rpb24uIEZpcmVkIHdoZW4gYSBwcm9taXNlIHJlc29sdmVkLlxuICogQHBhcmFtIHN0YXJ0RnJhY3Rpb24gT3B0aW9uYWwgZnJhY3Rpb24gc3RhcnQuIERlZmF1bHQgdG8gMC5cbiAqIEBwYXJhbSBlbmRGcmFjdGlvbiBPcHRpb25hbCBmcmFjdGlvbiBlbmQuIERlZmF1bHQgdG8gMS5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIG1vbml0b3JQcm9taXNlc1Byb2dyZXNzKFxuICAgIHByb21pc2VzOiBBcnJheTxQcm9taXNlPHt9fHZvaWQ+Piwgb25Qcm9ncmVzczogT25Qcm9ncmVzc0NhbGxiYWNrLFxuICAgIHN0YXJ0RnJhY3Rpb24/OiBudW1iZXIsIGVuZEZyYWN0aW9uPzogbnVtYmVyKSB7XG4gIGNoZWNrUHJvbWlzZXMocHJvbWlzZXMpO1xuICBzdGFydEZyYWN0aW9uID0gc3RhcnRGcmFjdGlvbiA9PSBudWxsID8gMCA6IHN0YXJ0RnJhY3Rpb247XG4gIGVuZEZyYWN0aW9uID0gZW5kRnJhY3Rpb24gPT0gbnVsbCA/IDEgOiBlbmRGcmFjdGlvbjtcbiAgY2hlY2tGcmFjdGlvbihzdGFydEZyYWN0aW9uLCBlbmRGcmFjdGlvbik7XG4gIGxldCByZXNvbHZlZFByb21pc2UgPSAwO1xuXG4gIGNvbnN0IHJlZ2lzdGVyTW9uaXRvciA9IChwcm9taXNlOiBQcm9taXNlPHt9PikgPT4ge1xuICAgIHByb21pc2UudGhlbih2YWx1ZSA9PiB7XG4gICAgICBjb25zdCBmcmFjdGlvbiA9IHN0YXJ0RnJhY3Rpb24gK1xuICAgICAgICAgICsrcmVzb2x2ZWRQcm9taXNlIC8gcHJvbWlzZXMubGVuZ3RoICogKGVuZEZyYWN0aW9uIC0gc3RhcnRGcmFjdGlvbik7XG4gICAgICAvLyBwYXNzIGZyYWN0aW9uIGFzIHBhcmFtZXRlciB0byBjYWxsYmFjayBmdW5jdGlvbi5cbiAgICAgIG9uUHJvZ3Jlc3MoZnJhY3Rpb24pO1xuICAgICAgcmV0dXJuIHZhbHVlO1xuICAgIH0pO1xuICAgIHJldHVybiBwcm9taXNlO1xuICB9O1xuXG4gIGZ1bmN0aW9uIGNoZWNrUHJvbWlzZXMocHJvbWlzZXM6IEFycmF5PFByb21pc2U8e318dm9pZD4+KTogdm9pZCB7XG4gICAgYXNzZXJ0KFxuICAgICAgICBwcm9taXNlcyAhPSBudWxsICYmIEFycmF5LmlzQXJyYXkocHJvbWlzZXMpICYmIHByb21pc2VzLmxlbmd0aCA+IDAsXG4gICAgICAgICgpID0+ICdwcm9taXNlcyBtdXN0IGJlIGEgbm9uZSBlbXB0eSBhcnJheScpO1xuICB9XG5cbiAgZnVuY3Rpb24gY2hlY2tGcmFjdGlvbihzdGFydEZyYWN0aW9uOiBudW1iZXIsIGVuZEZyYWN0aW9uOiBudW1iZXIpOiB2b2lkIHtcbiAgICBhc3NlcnQoXG4gICAgICAgIHN0YXJ0RnJhY3Rpb24gPj0gMCAmJiBzdGFydEZyYWN0aW9uIDw9IDEsXG4gICAgICAgICgpID0+IGBQcm9ncmVzcyBmcmFjdGlvbiBtdXN0IGJlIGluIHJhbmdlIFswLCAxXSwgYnV0IGAgK1xuICAgICAgICAgICAgYGdvdCBzdGFydEZyYWN0aW9uICR7c3RhcnRGcmFjdGlvbn1gKTtcbiAgICBhc3NlcnQoXG4gICAgICAgIGVuZEZyYWN0aW9uID49IDAgJiYgZW5kRnJhY3Rpb24gPD0gMSxcbiAgICAgICAgKCkgPT4gYFByb2dyZXNzIGZyYWN0aW9uIG11c3QgYmUgaW4gcmFuZ2UgWzAsIDFdLCBidXQgYCArXG4gICAgICAgICAgICBgZ290IGVuZEZyYWN0aW9uICR7ZW5kRnJhY3Rpb259YCk7XG4gICAgYXNzZXJ0KFxuICAgICAgICBlbmRGcmFjdGlvbiA+PSBzdGFydEZyYWN0aW9uLFxuICAgICAgICAoKSA9PiBgc3RhcnRGcmFjdGlvbiBtdXN0IGJlIG5vIG1vcmUgdGhhbiBlbmRGcmFjdGlvbiwgYnV0IGAgK1xuICAgICAgICAgICAgYGdvdCBzdGFydEZyYWN0aW9uICR7c3RhcnRGcmFjdGlvbn0gYW5kIGVuZEZyYWN0aW9uIGAgK1xuICAgICAgICAgICAgYCR7ZW5kRnJhY3Rpb259YCk7XG4gIH1cblxuICByZXR1cm4gUHJvbWlzZS5hbGwocHJvbWlzZXMubWFwKHJlZ2lzdGVyTW9uaXRvcikpO1xufVxuIl19","/**\n * @license\n * Copyright 2018 Google LLC. All Rights Reserved.\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n * =============================================================================\n */\nimport { env } from '../environment';\nimport * as util from '../util';\nimport { decodeWeights } from './io_utils';\nimport { monitorPromisesProgress } from './progress';\nimport { DTYPE_VALUE_SIZE_MAP } from './types';\n/**\n * Reads binary weights data from a number of URLs.\n *\n * @param fetchURLs URLs to send the HTTP requests at, using `fetch` calls.\n * @param requestOptions RequestInit (options) for the HTTP requests.\n * @param fetchFunc Optional overriding value for the `window.fetch` function.\n * @param onProgress Optional, progress callback function, fired periodically\n * before the load is completed.\n * @returns A `Promise` of an Array of `ArrayBuffer`. The Array has the same\n * length as `fetchURLs`.\n */\nexport async function loadWeightsAsArrayBuffer(fetchURLs, loadOptions) {\n if (loadOptions == null) {\n loadOptions = {};\n }\n const fetchFunc = loadOptions.fetchFunc == null ? env().platform.fetch :\n loadOptions.fetchFunc;\n // Create the requests for all of the weights in parallel.\n const requests = fetchURLs.map(fetchURL => fetchFunc(fetchURL, loadOptions.requestInit, { isBinary: true }));\n const fetchStartFraction = 0;\n const fetchEndFraction = 0.5;\n const responses = loadOptions.onProgress == null ?\n await Promise.all(requests) :\n await monitorPromisesProgress(requests, loadOptions.onProgress, fetchStartFraction, fetchEndFraction);\n const bufferPromises = responses.map(response => response.arrayBuffer());\n const bufferStartFraction = 0.5;\n const bufferEndFraction = 1;\n const buffers = loadOptions.onProgress == null ?\n await Promise.all(bufferPromises) :\n await monitorPromisesProgress(bufferPromises, loadOptions.onProgress, bufferStartFraction, bufferEndFraction);\n return buffers;\n}\n/**\n * Reads a weights manifest JSON configuration, fetches the weights and\n * returns them as `Tensor`s.\n *\n * @param manifest The weights manifest JSON.\n * @param filePathPrefix The path prefix for filenames given in the manifest.\n * Defaults to the empty string.\n * @param weightNames The names of the weights to be fetched.\n */\nexport async function loadWeights(manifest, filePathPrefix = '', weightNames, requestInit) {\n // TODO(nsthorat): Groups are currently fetched atomically. If you need a\n // single weight from a group, the whole group will be fetched. At a future\n // date, we should support fetching only the individual shards within a\n // group that are needed to reconstruct the requested weight.\n // TODO(cais): Use `decodeWeights` for implementation.\n const fetchWeights = (fetchUrls) => loadWeightsAsArrayBuffer(fetchUrls, { requestInit });\n const loadWeights = weightsLoaderFactory(fetchWeights);\n return loadWeights(manifest, filePathPrefix, weightNames);\n}\n/**\n * Creates a function, which reads a weights manifest JSON configuration,\n * fetches the weight files using the specified function and returns them as\n * `Tensor`s.\n *\n * ```js\n * // example for creating a nodejs weight loader, which reads the weight files\n * // from disk using fs.readFileSync\n *\n * import * as fs from 'fs'\n *\n * const fetchWeightsFromDisk = (filePaths: string[]) =>\n * filePaths.map(filePath => fs.readFileSync(filePath).buffer)\n *\n * const loadWeights = tf.io.weightsLoaderFactory(fetchWeightsFromDisk)\n *\n * const manifest = JSON.parse(\n * fs.readFileSync('./my_model-weights_manifest').toString()\n * )\n * const weightMap = await loadWeights(manifest, './')\n * ```\n * @param fetchWeightsFunction The function used for fetching the weight files.\n * @returns Weight loading function.\n */\nexport function weightsLoaderFactory(fetchWeightsFunction) {\n return async (manifest, filePathPrefix = '', weightNames) => {\n // Collect all the groups, weights, and their relative offsets to be\n // fetched.\n const groupIndicesToFetchMap = manifest.map(() => false);\n const groupWeightsToFetch = {};\n const weightsFound = weightNames != null ? weightNames.map(() => false) : [];\n const allManifestWeightNames = [];\n manifest.forEach((manifestGroupConfig, groupIndex) => {\n let groupOffset = 0;\n manifestGroupConfig.weights.forEach(weightsEntry => {\n const rawDtype = ('quantization' in weightsEntry) ?\n weightsEntry.quantization.dtype :\n weightsEntry.dtype;\n const weightsBytes = DTYPE_VALUE_SIZE_MAP[rawDtype] *\n util.sizeFromShape(weightsEntry.shape);\n const enqueueWeightsForFetchingFn = () => {\n groupIndicesToFetchMap[groupIndex] = true;\n if (groupWeightsToFetch[groupIndex] == null) {\n groupWeightsToFetch[groupIndex] = [];\n }\n groupWeightsToFetch[groupIndex].push({\n manifestEntry: weightsEntry,\n groupOffset,\n sizeBytes: weightsBytes\n });\n };\n if (weightNames != null) {\n weightNames.forEach((weightName, weightIndex) => {\n if (weightName === weightsEntry.name) {\n enqueueWeightsForFetchingFn();\n weightsFound[weightIndex] = true;\n }\n });\n }\n else {\n enqueueWeightsForFetchingFn();\n }\n allManifestWeightNames.push(weightsEntry.name);\n groupOffset += weightsBytes;\n });\n });\n if (!weightsFound.every(found => found)) {\n const weightsNotFound = weightNames.filter((_, i) => !weightsFound[i]);\n throw new Error(`Could not find weights in manifest with names: ` +\n `${weightsNotFound.join(', ')}. \\n` +\n `Manifest JSON has weights with names: ` +\n `${allManifestWeightNames.join(', ')}.`);\n }\n // Convert the one-hot boolean groupId => shouldFetch map to a list of group\n // IDs.\n const groupIndicesToFetch = groupIndicesToFetchMap.reduce((accumulator, shouldFetch, i) => {\n if (shouldFetch) {\n accumulator.push(i);\n }\n return accumulator;\n }, []);\n const fetchUrls = [];\n groupIndicesToFetch.forEach(i => {\n manifest[i].paths.forEach(filepath => {\n const fetchUrl = filePathPrefix +\n (!filePathPrefix.endsWith('/') ? '/' : '') + filepath;\n fetchUrls.push(fetchUrl);\n });\n });\n const buffers = await fetchWeightsFunction(fetchUrls);\n const weightsTensorMap = {};\n let bufferIndexOffset = 0;\n groupIndicesToFetch.forEach(i => {\n const numBuffers = manifest[i].paths.length;\n let groupBytes = 0;\n for (let i = 0; i < numBuffers; i++) {\n groupBytes += buffers[bufferIndexOffset + i].byteLength;\n }\n // Create a buffer for the whole group.\n const groupBuffer = new ArrayBuffer(groupBytes);\n const groupByteBuffer = new Uint8Array(groupBuffer);\n let groupBufferOffset = 0;\n for (let i = 0; i < numBuffers; i++) {\n const buffer = new Uint8Array(buffers[bufferIndexOffset + i]);\n groupByteBuffer.set(buffer, groupBufferOffset);\n groupBufferOffset += buffer.byteLength;\n }\n const weightsEntries = groupWeightsToFetch[i];\n weightsEntries.forEach(weightsEntry => {\n const byteBuffer = groupBuffer.slice(weightsEntry.groupOffset, weightsEntry.groupOffset + weightsEntry.sizeBytes);\n const nameToTensorMap = decodeWeights(byteBuffer, [weightsEntry.manifestEntry]);\n for (const name in nameToTensorMap) {\n weightsTensorMap[name] = nameToTensorMap[name];\n }\n });\n bufferIndexOffset += numBuffers;\n });\n return weightsTensorMap;\n };\n}\n//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoid2VpZ2h0c19sb2FkZXIuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi8uLi90ZmpzLWNvcmUvc3JjL2lvL3dlaWdodHNfbG9hZGVyLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBOzs7Ozs7Ozs7Ozs7Ozs7R0FlRztBQUVILE9BQU8sRUFBQyxHQUFHLEVBQUMsTUFBTSxnQkFBZ0IsQ0FBQztBQUduQyxPQUFPLEtBQUssSUFBSSxNQUFNLFNBQVMsQ0FBQztBQUNoQyxPQUFPLEVBQUMsYUFBYSxFQUFDLE1BQU0sWUFBWSxDQUFDO0FBQ3pDLE9BQU8sRUFBQyx1QkFBdUIsRUFBQyxNQUFNLFlBQVksQ0FBQztBQUNuRCxPQUFPLEVBQUMsb0JBQW9CLEVBQTJELE1BQU0sU0FBUyxDQUFDO0FBRXZHOzs7Ozs7Ozs7O0dBVUc7QUFDSCxNQUFNLENBQUMsS0FBSyxVQUFVLHdCQUF3QixDQUMxQyxTQUFtQixFQUFFLFdBQXlCO0lBQ2hELElBQUksV0FBVyxJQUFJLElBQUksRUFBRTtRQUN2QixXQUFXLEdBQUcsRUFBRSxDQUFDO0tBQ2xCO0lBRUQsTUFBTSxTQUFTLEdBQUcsV0FBVyxDQUFDLFNBQVMsSUFBSSxJQUFJLENBQUMsQ0FBQyxDQUFDLEdBQUcsRUFBRSxDQUFDLFFBQVEsQ0FBQyxLQUFLLENBQUMsQ0FBQztRQUN0QixXQUFXLENBQUMsU0FBUyxDQUFDO0lBRXhFLDBEQUEwRDtJQUMxRCxNQUFNLFFBQVEsR0FBRyxTQUFTLENBQUMsR0FBRyxDQUMxQixRQUFRLENBQUMsRUFBRSxDQUNQLFNBQVMsQ0FBQyxRQUFRLEVBQUUsV0FBVyxDQUFDLFdBQVcsRUFBRSxFQUFDLFFBQVEsRUFBRSxJQUFJLEVBQUMsQ0FBQyxDQUFDLENBQUM7SUFFeEUsTUFBTSxrQkFBa0IsR0FBRyxDQUFDLENBQUM7SUFDN0IsTUFBTSxnQkFBZ0IsR0FBRyxHQUFHLENBQUM7SUFFN0IsTUFBTSxTQUFTLEdBQUcsV0FBVyxDQUFDLFVBQVUsSUFB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QUMsQ0FBQztZQUVILGlCQUFpQixJQUFJLFVBQVUsQ0FBQztRQUNsQyxDQUFDLENBQUMsQ0FBQztRQUVILE9BQU8sZ0JBQWdCLENBQUM7SUFDMUIsQ0FBQyxDQUFDO0FBQ0osQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbIi8qKlxuICogQGxpY2Vuc2VcbiAqIENvcHlyaWdodCAyMDE4IEdvb2dsZSBMTEMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuXG4gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgXCJMaWNlbnNlXCIpO1xuICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLlxuICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0XG4gKlxuICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wXG4gKlxuICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZVxuICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gXCJBUyBJU1wiIEJBU0lTLFxuICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuXG4gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kXG4gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS5cbiAqID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4gKi9cblxuaW1wb3J0IHtlbnZ9IGZyb20gJy4uL2Vudmlyb25tZW50JztcblxuaW1wb3J0IHtOYW1lZFRlbnNvck1hcH0gZnJvbSAnLi4vdGVuc29yX3R5cGVzJztcbmltcG9ydCAqIGFzIHV0aWwgZnJvbSAnLi4vdXRpbCc7XG5pbXBvcnQge2RlY29kZVdlaWdodHN9IGZyb20gJy4vaW9fdXRpbHMnO1xuaW1wb3J0IHttb25pdG9yUHJvbWlzZXNQcm9ncmVzc30gZnJvbSAnLi9wcm9ncmVzcyc7XG5pbXBvcnQge0RUWVBFX1ZBTFVFX1NJWkVfTUFQLCBMb2FkT3B0aW9ucywgV2VpZ2h0c01hbmlmZXN0Q29uZmlnLCBXZWlnaHRzTWFuaWZlc3RFbnRyeX0gZnJvbSAnLi90eXBlcyc7XG5cbi8qKlxuICogUmVhZHMgYmluYXJ5IHdlaWdodHMgZGF0YSBmcm9tIGEgbnVtYmVyIG9mIFVSTHMuXG4gKlxuICogQHBhcmFtIGZldGNoVVJMcyBVUkxzIHRvIHNlbmQgdGhlIEhUVFAgcmVxdWVzdHMgYXQsIHVzaW5nIGBmZXRjaGAgY2FsbHMuXG4gKiBAcGFyYW0gcmVxdWVzdE9wdGlvbnMgUmVxdWVzdEluaXQgKG9wdGlvbnMpIGZvciB0aGUgSFRUUCByZXF1ZXN0cy5cbiAqIEBwYXJhbSBmZXRjaEZ1bmMgT3B0aW9uYWwgb3ZlcnJpZGluZyB2YWx1ZSBmb3IgdGhlIGB3aW5kb3cuZmV0Y2hgIGZ1bmN0aW9uLlxuICogQHBhcmFtIG9uUHJvZ3Jlc3MgT3B0aW9uYWwsIHByb2dyZXNzIGNhbGxiYWNrIGZ1bmN0aW9uLCBmaXJlZCBwZXJpb2RpY2FsbHlcbiAqICAgYmVmb3JlIHRoZSBsb2FkIGlzIGNvbXBsZXRlZC5cbiAqIEByZXR1cm5zIEEgYFByb21pc2VgIG9mIGFuIEFycmF5IG9mIGBBcnJheUJ1ZmZlcmAuIFRoZSBBcnJheSBoYXMgdGhlIHNhbWVcbiAqICAgbGVuZ3RoIGFzIGBmZXRjaFVSTHNgLlxuICovXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gbG9hZFdlaWdodHNBc0FycmF5QnVmZmVyKFxuICAgIGZldGNoVVJMczogc3RyaW5nW10sIGxvYWRPcHRpb25zPzogTG9hZE9wdGlvbnMpOiBQcm9taXNlPEFycmF5QnVmZmVyW10+IHtcbiAgaWYgKGxvYWRPcHRpb25zID09IG51bGwpIHtcbiAgICBsb2FkT3B0aW9ucyA9IHt9O1xuICB9XG5cbiAgY29uc3QgZmV0Y2hGdW5jID0gbG9hZE9wdGlvbnMuZmV0Y2hGdW5jID09IG51bGwgPyBlbnYoKS5wbGF0Zm9ybS5mZXRjaCA6XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbG9hZE9wdGlvbnMuZmV0Y2hGdW5jO1xuXG4gIC8vIENyZWF0ZSB0aGUgcmVxdWVzdHMgZm9yIGFsbCBvZiB0aGUgd2VpZ2h0cyBpbiBwYXJhbGxlbC5cbiAgY29uc3QgcmVxdWVzdHMgPSBmZXRjaFVSTHMubWFwKFxuICAgICAgZmV0Y2hVUkwgPT5cbiAgICAgICAgICBmZXRjaEZ1bmMoZmV0Y2hVUkwsIGxvYWRPcHRpb25zLnJlcXVlc3RJbml0LCB7aXNCaW5hcnk6IHRydWV9KSk7XG5cbiAgY29uc3QgZmV0Y2hTdGFydEZyYWN0aW9uID0gMDtcbiAgY29uc3QgZmV0Y2hFbmRGcmFjdGlvbiA9IDAuNTtcblxuICBjb25zdCByZXNwb25zZXMgPSBsb2FkT3B0aW9ucy5vblByb2dyZXNzID09IG51bGwgP1xuICAgICAgYXdhaXQgUHJvbWlzZS5hbGwocmVxdWVzdHMpIDpcbiAgICAgIGF3YWl0IG1vbml0b3JQcm9taXNlc1Byb2dyZXNzKFxuICAgICAgICAgIHJlcXVlc3RzLCBsb2FkT3B0aW9ucy5vblByb2dyZXNzLCBmZXRjaFN0YXJ0RnJhY3Rpb24sXG4gICAgICAgICAgZmV0Y2hFbmRGcmFjdGlvbik7XG5cbiAgY29uc3QgYnVmZmVyUHJvbWlzZXMgPSByZXNwb25zZXMubWFwKHJlc3BvbnNlID0+IHJlc3BvbnNlLmFycmF5QnVmZmVyKCkpO1xuXG4gIGNvbnN0IGJ1ZmZlclN0YXJ0RnJhY3Rpb24gPSAwLjU7XG4gIGNvbnN0IGJ1ZmZlckVuZEZyYWN0aW9uID0gMTtcblxuICBjb25zdCBidWZmZXJzID0gbG9hZE9wdGlvbnMub25Qcm9ncmVzcyA9PSBudWxsID9cbiAgICAgIGF3YWl0IFByb21pc2UuYWxsKGJ1ZmZlclByb21pc2VzKSA6XG4gICAgICBhd2FpdCBtb25pdG9yUHJvbWlzZXNQcm9ncmVzcyhcbiAgICAgICAgICBidWZmZXJQcm9taXNlcywgbG9hZE9wdGlvbnMub25Qcm9ncmVzcywgYnVmZmVyU3RhcnRGcmFjdGlvbixcbiAgICAgICAgICBidWZmZXJFbmRGcmFjdGlvbik7XG4gIHJldHVybiBidWZmZXJzO1xufVxuXG4vKipcbiAqIFJlYWRzIGEgd2VpZ2h0cyBtYW5pZmVzdCBKU09OIGNvbmZpZ3VyYXRpb24sIGZldGNoZXMgdGhlIHdlaWdodHMgYW5kXG4gKiByZXR1cm5zIHRoZW0gYXMgYFRlbnNvcmBzLlxuICpcbiAqIEBwYXJhbSBtYW5pZmVzdCBUaGUgd2VpZ2h0cyBtYW5pZmVzdCBKU09OLlxuICogQHBhcmFtIGZpbGVQYXRoUHJlZml4IFRoZSBwYXRoIHByZWZpeCBmb3IgZmlsZW5hbWVzIGdpdmVuIGluIHRoZSBtYW5pZmVzdC5cbiAqICAgICBEZWZhdWx0cyB0byB0aGUgZW1wdHkgc3RyaW5nLlxuICogQHBhcmFtIHdlaWdodE5hbWVzIFRoZSBuYW1lcyBvZiB0aGUgd2VpZ2h0cyB0byBiZSBmZXRjaGVkLlxuICovXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gbG9hZFdlaWdodHMoXG4gICAgbWFuaWZlc3Q6IFdlaWdodHNNYW5pZmVzdENvbmZpZywgZmlsZVBhdGhQcmVmaXggPSAnJyxcbiAgICB3ZWlnaHROYW1lcz86IHN0cmluZ1tdLFxuICAgIHJlcXVlc3RJbml0PzogUmVxdWVzdEluaXQpOiBQcm9taXNlPE5hbWVkVGVuc29yTWFwPiB7XG4gIC8vIFRPRE8obnN0aG9yYXQpOiBHcm91cHMgYXJlIGN1cnJlbnRseSBmZXRjaGVkIGF0b21pY2FsbHkuIElmIHlvdSBuZWVkIGFcbiAgLy8gc2luZ2xlIHdlaWdodCBmcm9tIGEgZ3JvdXAsIHRoZSB3aG9sZSBncm91cCB3aWxsIGJlIGZldGNoZWQuIEF0IGEgZnV0dXJlXG4gIC8vIGRhdGUsIHdlIHNob3VsZCBzdXBwb3J0IGZldGNoaW5nIG9ubHkgdGhlIGluZGl2aWR1YWwgc2hhcmRzIHdpdGhpbiBhXG4gIC8vIGdyb3VwIHRoYXQgYXJlIG5lZWRlZCB0byByZWNvbnN0cnVjdCB0aGUgcmVxdWVzdGVkIHdlaWdodC5cbiAgLy8gVE9ETyhjYWlzKTogVXNlIGBkZWNvZGVXZWlnaHRzYCBmb3IgaW1wbGVtZW50YXRpb24uXG5cbiAgY29uc3QgZmV0Y2hXZWlnaHRzID0gKGZldGNoVXJsczogc3RyaW5nW10pID0+XG4gICAgICBsb2FkV2VpZ2h0c0FzQXJyYXlCdWZmZXIoZmV0Y2hVcmxzLCB7cmVxdWVzdEluaXR9KTtcbiAgY29uc3QgbG9hZFdlaWdodHMgPSB3ZWlnaHRzTG9hZGVyRmFjdG9yeShmZXRjaFdlaWdodHMpO1xuXG4gIHJldHVybiBsb2FkV2VpZ2h0cyhtYW5pZmVzdCwgZmlsZVBhdGhQcmVmaXgsIHdlaWdodE5hbWVzKTtcbn1cblxuLyoqXG4gKiBDcmVhdGVzIGEgZnVuY3Rpb24sIHdoaWNoIHJlYWRzIGEgd2VpZ2h0cyBtYW5pZmVzdCBKU09OIGNvbmZpZ3VyYXRpb24sXG4gKiBmZXRjaGVzIHRoZSB3ZWlnaHQgZmlsZXMgdXNpbmcgdGhlIHNwZWNpZmllZCBmdW5jdGlvbiBhbmQgcmV0dXJucyB0aGVtIGFzXG4gKiBgVGVuc29yYHMuXG4gKlxuICogYGBganNcbiAqIC8vIGV4YW1wbGUgZm9yIGNyZWF0aW5nIGEgbm9kZWpzIHdlaWdodCBsb2FkZXIsIHdoaWNoIHJlYWRzIHRoZSB3ZWlnaHQgZmlsZXNcbiAqIC8vIGZyb20gZGlzayB1c2luZyBmcy5yZWFkRmlsZVN5bmNcbiAqXG4gKiBpbXBvcnQgKiBhcyBmcyBmcm9tICdmcydcbiAqXG4gKiBjb25zdCBmZXRjaFdlaWdodHNGcm9tRGlzayA9IChmaWxlUGF0aHM6IHN0cmluZ1tdKSA9PlxuICogICBmaWxlUGF0aHMubWFwKGZpbGVQYXRoID0+IGZzLnJlYWRGaWxlU3luYyhmaWxlUGF0aCkuYnVmZmVyKVxuICpcbiAqIGNvbnN0IGxvYWRXZWlnaHRzID0gdGYuaW8ud2VpZ2h0c0xvYWRlckZhY3RvcnkoZmV0Y2hXZWlnaHRzRnJvbURpc2spXG4gKlxuICogY29uc3QgbWFuaWZlc3QgPSBKU09OLnBhcnNlKFxuICogICBmcy5yZWFkRmlsZVN5bmMoJy4vbXlfbW9kZWwtd2VpZ2h0c19tYW5pZmVzdCcpLnRvU3RyaW5nKClcbiAqIClcbiAqIGNvbnN0IHdlaWdodE1hcCA9IGF3YWl0IGxvYWRXZWlnaHRzKG1hbmlmZXN0LCAnLi8nKVxuICogYGBgXG4gKiBAcGFyYW0gZmV0Y2hXZWlnaHRzRnVuY3Rpb24gVGhlIGZ1bmN0aW9uIHVzZWQgZm9yIGZldGNoaW5nIHRoZSB3ZWlnaHQgZmlsZXMuXG4gKiBAcmV0dXJucyBXZWlnaHQgbG9hZGluZyBmdW5jdGlvbi5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHdlaWdodHNMb2FkZXJGYWN0b3J5KFxuICAgIGZldGNoV2VpZ2h0c0Z1bmN0aW9uOiAoZmV0Y2hVcmxzOiBzdHJpbmdbXSkgPT4gUHJvbWlzZTxBcnJheUJ1ZmZlcltdPik6XG4gICAgKG1hbmlmZXN0OiBXZWlnaHRzTWFuaWZlc3RDb25maWcsIGZpbGVQYXRoUHJlZml4Pzogc3RyaW5nLFxuICAgICB3ZWlnaHROYW1lcz86IHN0cmluZ1tdKSA9PiBQcm9taXNlPE5hbWVkVGVuc29yTWFwPiB7XG4gIHJldHVybiBhc3luYyhcbiAgICAgICAgICAgICBtYW5pZmVzdDogV2VpZ2h0c01hbmlmZXN0Q29uZmlnLCBmaWxlUGF0aFByZWZpeCA9ICcnLFxuICAgICAgICAgICAgIHdlaWdodE5hbWVzPzogc3RyaW5nW10pOiBQcm9taXNlPE5hbWVkVGVuc29yTWFwPiA9PiB7XG4gICAgLy8gQ29sbGVjdCBhbGwgdGhlIGdyb3Vwcywgd2VpZ2h0cywgYW5kIHRoZWlyIHJlbGF0aXZlIG9mZnNldHMgdG8gYmVcbiAgICAvLyBmZXRjaGVkLlxuICAgIGNvbnN0IGdyb3VwSW5kaWNlc1RvRmV0Y2hNYXAgPSBtYW5pZmVzdC5tYXAoKCkgPT4gZmFsc2UpO1xuICAgIGNvbnN0IGdyb3VwV2VpZ2h0c1RvRmV0Y2g6IHtcbiAgICAgIFtncm91cDogbnVtYmVyXTogQXJyYXk8e1xuICAgICAgICBtYW5pZmVzdEVudHJ5OiBXZWlnaHRzTWFuaWZlc3RFbnRyeTsgZ3JvdXBPZmZzZXQ6IG51bWJlcjtcbiAgICAgICAgc2l6ZUJ5dGVzOiBudW1iZXI7XG4gICAgICB9PlxuICAgIH0gPSB7fTtcbiAgICBjb25zdCB3ZWlnaHRzRm91bmQgPVxuICAgICAgICB3ZWlnaHROYW1lcyAhPSBudWxsID8gd2VpZ2h0TmFtZXMubWFwKCgpID0+IGZhbHNlKSA6IFtdO1xuICAgIGNvbnN0IGFsbE1hbmlmZXN0V2VpZ2h0TmFtZXM6IHN0cmluZ1tdID0gW107XG4gICAgbWFuaWZlc3QuZm9yRWFjaCgobWFuaWZlc3RHcm91cENvbmZpZywgZ3JvdXBJbmRleCkgPT4ge1xuICAgICAgbGV0IGdyb3VwT2Zmc2V0ID0gMDtcbiAgICAgIG1hbmlmZXN0R3JvdXBDb25maWcud2VpZ2h0cy5mb3JFYWNoKHdlaWdodHNFbnRyeSA9PiB7XG4gICAgICAgIGNvbnN0IHJhd0R0eXBlID0gKCdxdWFudGl6YXRpb24nIGluIHdlaWdodHNFbnRyeSkgP1xuICAgICAgICAgICAgd2VpZ2h0c0VudHJ5LnF1YW50aXphdGlvbi5kdHlwZSA6XG4gICAgICAgICAgICB3ZWlnaHRzRW50cnkuZHR5cGU7XG5cbiAgICAgICAgY29uc3Qgd2VpZ2h0c0J5dGVzID0gRFRZUEVfVkFMVUVfU0laRV9NQVBbcmF3RHR5cGVdICpcbiAgICAgICAgICAgIHV0aWwuc2l6ZUZyb21TaGFwZSh3ZWlnaHRzRW50cnkuc2hhcGUpO1xuXG4gICAgICAgIGNvbnN0IGVucXVldWVXZWlnaHRzRm9yRmV0Y2hpbmdGbiA9ICgpID0+IHtcbiAgICAgICAgICBncm91cEluZGljZXNUb0ZldGNoTWFwW2dyb3VwSW5kZXhdID0gdHJ1ZTtcbiAgICAgICAgICBpZiAoZ3JvdXBXZWlnaHRzVG9GZXRjaFtncm91cEluZGV4XSA9PSBudWxsKSB7XG4gICAgICAgICAgICBncm91cFdlaWdodHNUb0ZldGNoW2dyb3VwSW5kZXhdID0gW107XG4gICAgICAgICAgfVxuXG4gICAgICAgICAgZ3JvdXBXZWlnaHRzVG9GZXRjaFtncm91cEluZGV4XS5wdXNoKHtcbiAgICAgICAgICAgIG1hbmlmZXN0RW50cnk6IHdlaWdodHNFbnRyeSxcbiAgICAgICAgICAgIGdyb3VwT2Zmc2V0LFxuICAgICAgICAgICAgc2l6ZUJ5dGVzOiB3ZWlnaHRzQnl0ZXNcbiAgICAgICAgICB9KTtcbiAgICAgICAgfTtcblxuICAgICAgICBpZiAod2VpZ2h0TmFtZXMgIT0gbnVsbCkge1xuICAgICAgICAgIHdlaWdodE5hbWVzLmZvckVhY2goKHdlaWdodE5hbWUsIHdlaWdodEluZGV4KSA9PiB7XG4gICAgICAgICAgICBpZiAod2VpZ2h0TmFtZSA9PT0gd2VpZ2h0c0VudHJ5Lm5hbWUpIHtcbiAgICAgICAgICAgICAgZW5xdWV1ZVdlaWdodHNGb3JGZXRjaGluZ0ZuKCk7XG4gICAgICAgICAgICAgIHdlaWdodHNGb3VuZFt3ZWlnaHRJbmRleF0gPSB0cnVlO1xuICAgICAgICAgICAgfVxuICAgICAgICAgIH0pO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIGVucXVldWVXZWlnaHRzRm9yRmV0Y2hpbmdGbigpO1xuICAgICAgICB9XG5cbiAgICAgICAgYWxsTWFuaWZlc3RXZWlnaHROYW1lcy5wdXNoKHdlaWdodHNFbnRyeS5uYW1lKTtcbiAgICAgICAgZ3JvdXBPZmZzZXQgKz0gd2VpZ2h0c0J5dGVzO1xuICAgICAgfSk7XG4gICAgfSk7XG5cbiAgICBpZiAoIXdlaWdodHNGb3VuZC5ldmVyeShmb3VuZCA9PiBmb3VuZCkpIHtcbiAgICAgIGNvbnN0IHdlaWdodHNOb3RGb3VuZCA9IHdlaWdodE5hbWVzLmZpbHRlcigoXywgaSkgPT4gIXdlaWdodHNGb3VuZFtpXSk7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoXG4gICAgICAgICAgYENvdWxkIG5vdCBmaW5kIHdlaWdodHMgaW4gbWFuaWZlc3Qgd2l0aCBuYW1lczogYCArXG4gICAgICAgICAgYCR7d2VpZ2h0c05vdEZvdW5kLmpvaW4oJywgJyl9LiBcXG5gICtcbiAgICAgICAgICBgTWFuaWZlc3QgSlNPTiBoYXMgd2VpZ2h0cyB3aXRoIG5hbWVzOiBgICtcbiAgICAgICAgICBgJHthbGxNYW5pZmVzdFdlaWdodE5hbWVzLmpvaW4oJywgJyl9LmApO1xuICAgIH1cblxuICAgIC8vIENvbnZlcnQgdGhlIG9uZS1ob3QgYm9vbGVhbiBncm91cElkID0+IHNob3VsZEZldGNoIG1hcCB0byBhIGxpc3Qgb2YgZ3JvdXBcbiAgICAvLyBJRHMuXG4gICAgY29uc3QgZ3JvdXBJbmRpY2VzVG9GZXRjaCA9XG4gICAgICAgIGdyb3VwSW5kaWNlc1RvRmV0Y2hNYXAucmVkdWNlKChhY2N1bXVsYXRvciwgc2hvdWxkRmV0Y2gsIGkpID0+IHtcbiAgICAgICAgICBpZiAoc2hvdWxkRmV0Y2gpIHtcbiAgICAgICAgICAgIGFjY3VtdWxhdG9yLnB1c2goaSk7XG4gICAgICAgICAgfVxuICAgICAgICAgIHJldHVybiBhY2N1bXVsYXRvcjtcbiAgICAgICAgfSwgW10pO1xuXG4gICAgY29uc3QgZmV0Y2hVcmxzOiBzdHJpbmdbXSA9IFtdO1xuICAgIGdyb3VwSW5kaWNlc1RvRmV0Y2guZm9yRWFjaChpID0+IHtcbiAgICAgIG1hbmlmZXN0W2ldLnBhdGhzLmZvckVhY2goZmlsZXBhdGggPT4ge1xuICAgICAgICBjb25zdCBmZXRjaFVybCA9IGZpbGVQYXRoUHJlZml4ICtcbiAgICAgICAgICAgICghZmlsZVBhdGhQcmVmaXguZW5kc1dpdGgoJy8nKSA/ICcvJyA6ICcnKSArIGZpbGVwYXRoO1xuICAgICAgICBmZXRjaFVybHMucHVzaChmZXRjaFVybCk7XG4gICAgICB9KTtcbiAgICB9KTtcbiAgICBjb25zdCBidWZmZXJzID0gYXdhaXQgZmV0Y2hXZWlnaHRzRnVuY3Rpb24oZmV0Y2hVcmxzKTtcblxuICAgIGNvbnN0IHdlaWdodHNUZW5zb3JNYXA6IE5hbWVkVGVuc29yTWFwID0ge307XG4gICAgbGV0IGJ1ZmZlckluZGV4T2Zmc2V0ID0gMDtcbiAgICBncm91cEluZGljZXNUb0ZldGNoLmZvckVhY2goaSA9PiB7XG4gICAgICBjb25zdCBudW1CdWZmZXJzID0gbWFuaWZlc3RbaV0ucGF0aHMubGVuZ3RoO1xuXG4gICAgICBsZXQgZ3JvdXBCeXRlcyA9IDA7XG4gICAgICBmb3IgKGxldCBpID0gMDsgaSA8IG51bUJ1ZmZlcnM7IGkrKykge1xuICAgICAgICBncm91cEJ5dGVzICs9IGJ1ZmZlcnNbYnVmZmVySW5kZXhPZmZzZXQgKyBpXS5ieXRlTGVuZ3RoO1xuICAgICAgfVxuXG4gICAgICAvLyBDcmVhdGUgYSBidWZmZXIgZm9yIHRoZSB3aG9sZSBncm91cC5cbiAgICAgIGNvbnN0IGdyb3VwQnVmZmVyID0gbmV3IEFycmF5QnVmZmVyKGdyb3VwQnl0ZXMpO1xuICAgICAgY29uc3QgZ3JvdXBCeXRlQnVmZmVyID0gbmV3IFVpbnQ4QXJyYXkoZ3JvdXBCdWZmZXIpO1xuICAgICAgbGV0IGdyb3VwQnVmZmVyT2Zmc2V0ID0gMDtcbiAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgbnVtQnVmZmVyczsgaSsrKSB7XG4gICAgICAgIGNvbnN0IGJ1ZmZlciA9IG5ldyBVaW50OEFycmF5KGJ1ZmZlcnNbYnVmZmVySW5kZXhPZmZzZXQgKyBpXSk7XG4gICAgICAgIGdyb3VwQnl0ZUJ1ZmZlci5zZXQoYnVmZmVyLCBncm91cEJ1ZmZlck9mZnNldCk7XG4gICAgICAgIGdyb3VwQnVmZmVyT2Zmc2V0ICs9IGJ1ZmZlci5ieXRlTGVuZ3RoO1xuICAgICAgfVxuXG4gICAgICBjb25zdCB3ZWlnaHRzRW50cmllcyA9IGdyb3VwV2VpZ2h0c1RvRmV0Y2hbaV07XG4gICAgICB3ZWlnaHRzRW50cmllcy5mb3JFYWNoKHdlaWdodHNFbnRyeSA9PiB7XG4gICAgICAgIGNvbnN0IGJ5dGVCdWZmZXIgPSBncm91cEJ1ZmZlci5zbGljZShcbiAgICAgICAgICAgIHdlaWdodHNFbnRyeS5ncm91cE9mZnNldCxcbiAgICAgICAgICAgIHdlaWdodHNFbnRyeS5ncm91cE9mZnNldCArIHdlaWdodHNFbnRyeS5zaXplQnl0ZXMpO1xuICAgICAgICBjb25zdCBuYW1lVG9UZW5zb3JNYXAgPVxuICAgICAgICAgICAgZGVjb2RlV2VpZ2h0cyhieXRlQnVmZmVyLCBbd2VpZ2h0c0VudHJ5Lm1hbmlmZXN0RW50cnldKTtcbiAgICAgICAgZm9yIChjb25zdCBuYW1lIGluIG5hbWVUb1RlbnNvck1hcCkge1xuICAgICAgICAgIHdlaWdodHNUZW5zb3JNYXBbbmFtZV0gPSBuYW1lVG9UZW5zb3JNYXBbbmFtZV07XG4gICAgICAgIH1cbiAgICAgIH0pO1xuXG4gICAgICBidWZmZXJJbmRleE9mZnNldCArPSBudW1CdWZmZXJzO1xuICAgIH0pO1xuXG4gICAgcmV0dXJuIHdlaWdodHNUZW5zb3JNYXA7XG4gIH07XG59XG4iXX0=","/**\n * @license\n * Copyright 2018 Google LLC. All Rights Reserved.\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n * =============================================================================\n */\n/**\n * IOHandler implementations based on HTTP requests in the web browser.\n *\n * Uses [`fetch`](https://developer.mozilla.org/en-US/docs/Web/API/Fetch_API).\n */\nimport { env } from '../environment';\nimport { assert } from '../util';\nimport { concatenateArrayBuffers, getModelArtifactsForJSON, getModelArtifactsInfoForJSON, getModelJSONForModelArtifacts, getWeightSpecs } from './io_utils';\nimport { IORouterRegistry } from './router_registry';\nimport { loadWeightsAsArrayBuffer } from './weights_loader';\nconst OCTET_STREAM_MIME_TYPE = 'application/octet-stream';\nconst JSON_TYPE = 'application/json';\nexport class HTTPRequest {\n constructor(path, loadOptions) {\n this.DEFAULT_METHOD = 'POST';\n if (loadOptions == null) {\n loadOptions = {};\n }\n this.weightPathPrefix = loadOptions.weightPathPrefix;\n this.onProgress = loadOptions.onProgress;\n this.weightUrlConverter = loadOptions.weightUrlConverter;\n if (loadOptions.fetchFunc != null) {\n assert(typeof loadOptions.fetchFunc === 'function', () => 'Must pass a function that matches the signature of ' +\n '`fetch` (see ' +\n 'https://developer.mozilla.org/en-US/docs/Web/API/Fetch_API)');\n this.fetch = loadOptions.fetchFunc;\n }\n else {\n this.fetch = env().platform.fetch;\n }\n assert(path != null && path.length > 0, () => 'URL path for http must not be null, undefined or ' +\n 'empty.');\n if (Array.isArray(path)) {\n assert(path.length === 2, () => 'URL paths for http must have a length of 2, ' +\n `(actual length is ${path.length}).`);\n }\n this.path = path;\n if (loadOptions.requestInit != null &&\n loadOptions.requestInit.body != null) {\n throw new Error('requestInit is expected to have no pre-existing body, but has one.');\n }\n this.requestInit = loadOptions.requestInit || {};\n }\n async save(modelArtifacts) {\n if (modelArtifacts.modelTopology instanceof ArrayBuffer) {\n throw new Error('BrowserHTTPRequest.save() does not support saving model topology ' +\n 'in binary formats yet.');\n }\n const init = Object.assign({ method: this.DEFAULT_METHOD }, this.requestInit);\n init.body = new FormData();\n const weightsManifest = [{\n paths: ['./model.weights.bin'],\n weights: modelArtifacts.weightSpecs,\n }];\n const modelTopologyAndWeightManifest = getModelJSONForModelArtifacts(modelArtifacts, weightsManifest);\n init.body.append('model.json', new Blob([JSON.stringify(modelTopologyAndWeightManifest)], { type: JSON_TYPE }), 'model.json');\n if (modelArtifacts.weightData != null) {\n init.body.append('model.weights.bin', new Blob([modelArtifacts.weightData], { type: OCTET_STREAM_MIME_TYPE }), 'model.weights.bin');\n }\n const response = await this.fetch(this.path, init);\n if (response.ok) {\n return {\n modelArtifactsInfo: getModelArtifactsInfoForJSON(modelArtifacts),\n responses: [response],\n };\n }\n else {\n throw new Error(`BrowserHTTPRequest.save() failed due to HTTP response status ` +\n `${response.status}.`);\n }\n }\n /**\n * Load model artifacts via HTTP request(s).\n *\n * See the documentation to `tf.io.http` for details on the saved\n * artifacts.\n *\n * @returns The loaded model artifacts (if loading succeeds).\n */\n async load() {\n const modelConfigRequest = await this.fetch(this.path, this.requestInit);\n if (!modelConfigRequest.ok) {\n throw new Error(`Request to ${this.path} failed with status code ` +\n `${modelConfigRequest.status}. Please verify this URL points to ` +\n `the model JSON of the model to load.`);\n }\n let modelJSON;\n try {\n modelJSON = await modelConfigRequest.json();\n }\n catch (e) {\n let message = `Failed to parse model JSON of response from ${this.path}.`;\n // TODO(nsthorat): Remove this after some time when we're comfortable that\n // .pb files are mostly gone.\n if (this.path.endsWith('.pb')) {\n message += ' Your path contains a .pb file extension. ' +\n 'Support for .pb models have been removed in TensorFlow.js 1.0 ' +\n 'in favor of .json models. You can re-convert your Python ' +\n 'TensorFlow model using the TensorFlow.js 1.0 conversion scripts ' +\n 'or you can convert your.pb models with the \\'pb2json\\'' +\n 'NPM script in the tensorflow/tfjs-converter repository.';\n }\n else {\n message += ' Please make sure the server is serving valid ' +\n 'JSON for this request.';\n }\n throw new Error(message);\n }\n // We do not allow both modelTopology and weightsManifest to be missing.\n const modelTopology = modelJSON.modelTopology;\n const weightsManifest = modelJSON.weightsManifest;\n if (modelTopology == null && weightsManifest == null) {\n throw new Error(`The JSON from HTTP path ${this.path} contains neither model ` +\n `topology or manifest for weights.`);\n }\n return getModelArtifactsForJSON(modelJSON, (weightsManifest) => this.loadWeights(weightsManifest));\n }\n async loadWeights(weightsManifest) {\n const weightPath = Array.isArray(this.path) ? this.path[1] : this.path;\n const [prefix, suffix] = parseUrl(weightPath);\n const pathPrefix = this.weightPathPrefix || prefix;\n const weightSpecs = getWeightSpecs(weightsManifest);\n const fetchURLs = [];\n const urlPromises = [];\n for (const weightsGroup of weightsManifest) {\n for (const path of weightsGroup.paths) {\n if (this.weightUrlConverter != null) {\n urlPromises.push(this.weightUrlConverter(path));\n }\n else {\n fetchURLs.push(pathPrefix + path + suffix);\n }\n }\n }\n if (this.weightUrlConverter) {\n fetchURLs.push(...await Promise.all(urlPromises));\n }\n const buffers = await loadWeightsAsArrayBuffer(fetchURLs, {\n requestInit: this.requestInit,\n fetchFunc: this.fetch,\n onProgress: this.onProgress\n });\n return [weightSpecs, concatenateArrayBuffers(buffers)];\n }\n}\nHTTPRequest.URL_SCHEME_REGEX = /^https?:\\/\\//;\n/**\n * Extract the prefix and suffix of the url, where the prefix is the path before\n * the last file, and suffix is the search params after the last file.\n * ```\n * const url = 'http://tfhub.dev/model/1/tensorflowjs_model.pb?tfjs-format=file'\n * [prefix, suffix] = parseUrl(url)\n * // prefix = 'http://tfhub.dev/model/1/'\n * // suffix = '?tfjs-format=file'\n * ```\n * @param url the model url to be parsed.\n */\nexport function parseUrl(url) {\n const lastSlash = url.lastIndexOf('/');\n const lastSearchParam = url.lastIndexOf('?');\n const prefix = url.substring(0, lastSlash);\n const suffix = lastSearchParam > lastSlash ? url.substring(lastSearchParam) : '';\n return [prefix + '/', suffix];\n}\nexport function isHTTPScheme(url) {\n return url.match(HTTPRequest.URL_SCHEME_REGEX) != null;\n}\nexport const httpRouter = (url, loadOptions) => {\n if (typeof fetch === 'undefined' &&\n (loadOptions == null || loadOptions.fetchFunc == null)) {\n // `http` uses `fetch` or `node-fetch`, if one wants to use it in\n // an environment that is not the browser or node they have to setup a\n // global fetch polyfill.\n return null;\n }\n else {\n let isHTTP = true;\n if (Array.isArray(url)) {\n isHTTP = url.every(urlItem => isHTTPScheme(urlItem));\n }\n else {\n isHTTP = isHTTPScheme(url);\n }\n if (isHTTP) {\n return http(url, loadOptions);\n }\n }\n return null;\n};\nIORouterRegistry.registerSaveRouter(httpRouter);\nIORouterRegistry.registerLoadRouter(httpRouter);\n/**\n * Creates an IOHandler subtype that sends model artifacts to HTTP server.\n *\n * An HTTP request of the `multipart/form-data` mime type will be sent to the\n * `path` URL. The form data includes artifacts that represent the topology\n * and/or weights of the model. In the case of Keras-style `tf.Model`, two\n * blobs (files) exist in form-data:\n * - A JSON file consisting of `modelTopology` and `weightsManifest`.\n * - A binary weights file consisting of the concatenated weight values.\n * These files are in the same format as the one generated by\n * [tfjs_converter](https://js.tensorflow.org/tutorials/import-keras.html).\n *\n * The following code snippet exemplifies the client-side code that uses this\n * function:\n *\n * ```js\n * const model = tf.sequential();\n * model.add(\n * tf.layers.dense({units: 1, inputShape: [100], activation: 'sigmoid'}));\n *\n * const saveResult = await model.save(tf.io.http(\n * 'http://model-server:5000/upload', {requestInit: {method: 'PUT'}}));\n * console.log(saveResult);\n * ```\n *\n * If the default `POST` method is to be used, without any custom parameters\n * such as headers, you can simply pass an HTTP or HTTPS URL to `model.save`:\n *\n * ```js\n * const saveResult = await model.save('http://model-server:5000/upload');\n * ```\n *\n * The following GitHub Gist\n * https://gist.github.com/dsmilkov/1b6046fd6132d7408d5257b0976f7864\n * implements a server based on [flask](https://github.com/pallets/flask) that\n * can receive the request. Upon receiving the model artifacts via the requst,\n * this particular server reconstitutes instances of [Keras\n * Models](https://keras.io/models/model/) in memory.\n *\n *\n * @param path A URL path to the model.\n * Can be an absolute HTTP path (e.g.,\n * 'http://localhost:8000/model-upload)') or a relative path (e.g.,\n * './model-upload').\n * @param requestInit Request configurations to be used when sending\n * HTTP request to server using `fetch`. It can contain fields such as\n * `method`, `credentials`, `headers`, `mode`, etc. See\n * https://developer.mozilla.org/en-US/docs/Web/API/Request/Request\n * for more information. `requestInit` must not have a body, because the\n * body will be set by TensorFlow.js. File blobs representing the model\n * topology (filename: 'model.json') and the weights of the model (filename:\n * 'model.weights.bin') will be appended to the body. If `requestInit` has a\n * `body`, an Error will be thrown.\n * @param loadOptions Optional configuration for the loading. It includes the\n * following fields:\n * - weightPathPrefix Optional, this specifies the path prefix for weight\n * files, by default this is calculated from the path param.\n * - fetchFunc Optional, custom `fetch` function. E.g., in Node.js,\n * the `fetch` from node-fetch can be used here.\n * - onProgress Optional, progress callback function, fired periodically\n * before the load is completed.\n * @returns An instance of `IOHandler`.\n *\n * @doc {\n * heading: 'Models',\n * subheading: 'Loading',\n * namespace: 'io',\n * ignoreCI: true\n * }\n */\nexport function http(path, loadOptions) {\n return new HTTPRequest(path, loadOptions);\n}\n/**\n * Deprecated. Use `tf.io.http`.\n * @param path\n * @param loadOptions\n */\nexport function browserHTTPRequest(path, loadOptions) {\n return http(path, loadOptions);\n}\n//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaHR0cC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uLy4uL3RmanMtY29yZS9zcmMvaW8vaHR0cC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQTs7Ozs7Ozs7Ozs7Ozs7O0dBZUc7QUFFSDs7OztHQUlHO0FBRUgsT0FBTyxFQUFDLEdBQUcsRUFBQyxNQUFNLGdCQUFnQixDQUFDO0FBRW5DLE9BQU8sRUFBQyxNQUFNLEVBQUMsTUFBTSxTQUFTLENBQUM7QUFDL0IsT0FBTyxFQUFDLHVCQUF1QixFQUFFLHdCQUF3QixFQUFFLDRCQUE0QixFQUFFLDZCQUE2QixFQUFFLGNBQWMsRUFBQyxNQUFNLFlBQVksQ0FBQztBQUMxSixPQUFPLEVBQVcsZ0JBQWdCLEVBQUMsTUFBTSxtQkFBbUIsQ0FBQztBQUU3RCxPQUFPLEVBQUMsd0JBQXdCLEVBQUMsTUFBTSxrQkFBa0IsQ0FBQztBQUUxRCxNQUFNLHNCQUFzQixHQUFHLDBCQUEwQixDQUFDO0FBQzFELE1BQU0sU0FBUyxHQUFHLGtCQUFrQixDQUFDO0FBQ3JDLE1BQU0sT0FBTyxXQUFXO0lBY3RCLFlBQVksSUFBWSxFQUFFLFdBQXlCO1FBUDFDLG1CQUFjLEdBQUcsTUFBTSxDQUFDO1FBUS9CLElBQUksV0FBVyxJQUFJLElBQUksRUFBRTtZQUN2QixXQUFXLEdBQUcsRUFBRSxDQUFDO1NBQ2xCO1FBQ0QsSUFBSSxDQUFDLGdCQUFnQixHQUFHLFdBQVcsQ0FBQyxnQkFBZ0IsQ0FBQztRQUNyRCxJQUFJLENBQUMsVUFBVSxHQUFHLFdBQVcsQ0FBQyxVQUFVLENBQUM7UUFDekMsSUFBSSxDQUFDLGtCQUFrQixHQUFHLFdBQVcsQ0FBQyxrQkFBa0IsQ0FBQztRQUV6RCxJQUFJLFdBQVcsQ0FBQyxTQUFTLElBQUksSUFBSSxFQUFFO1lBQ2pDLE1BQU0sQ0FDRixPQUFPLFdBQVcsQ0FBQyxTQUFTLEtBQUssVUFBVSxFQUMzQyxHQUFHLEVBQUUsQ0FBQyxxREFBcUQ7Z0JBQ3ZELGVB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b2dsZSBMTEMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuXG4gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgXCJMaWNlbnNlXCIpO1xuICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLlxuICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0XG4gKlxuICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wXG4gKlxuICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZVxuICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gXCJBUyBJU1wiIEJBU0lTLFxuICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuXG4gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kXG4gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS5cbiAqID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4gKi9cblxuLyoqXG4gKiBJT0hhbmRsZXIgaW1wbGVtZW50YXRpb25zIGJhc2VkIG9uIEhUVFAgcmVxdWVzdHMgaW4gdGhlIHdlYiBicm93c2VyLlxuICpcbiAqIFVzZXMgW2BmZXRjaGBdKGh0dHBzOi8vZGV2ZWxvcGVyLm1vemlsbGEub3JnL2VuLVVTL2RvY3MvV2ViL0FQSS9GZXRjaF9BUEkpLlxuICovXG5cbmltcG9ydCB7ZW52fSBmcm9tICcuLi9lbnZpcm9ubWVudCc7XG5cbmltcG9ydCB7YXNzZXJ0fSBmcm9tICcuLi91dGlsJztcbmltcG9ydCB7Y29uY2F0ZW5hdGVBcnJheUJ1ZmZlcnMsIGdldE1vZGVsQXJ0aWZhY3RzRm9ySlNPTiwgZ2V0TW9kZWxBcnRpZmFjdHNJbmZvRm9ySlNPTiwgZ2V0TW9kZWxKU09ORm9yTW9kZWxBcnRpZmFjdHMsIGdldFdlaWdodFNwZWNzfSBmcm9tICcuL2lvX3V0aWxzJztcbmltcG9ydCB7SU9Sb3V0ZXIsIElPUm91dGVyUmVnaXN0cnl9IGZyb20gJy4vcm91dGVyX3JlZ2lzdHJ5JztcbmltcG9ydCB7SU9IYW5kbGVyLCBMb2FkT3B0aW9ucywgTW9kZWxBcnRpZmFjdHMsIE1vZGVsSlNPTiwgT25Qcm9ncmVzc0NhbGxiYWNrLCBTYXZlUmVzdWx0LCBXZWlnaHRzTWFuaWZlc3RDb25maWcsIFdlaWdodHNNYW5pZmVzdEVudHJ5fSBmcm9tICcuL3R5cGVzJztcbmltcG9ydCB7bG9hZFdlaWdodHNBc0FycmF5QnVmZmVyfSBmcm9tICcuL3dlaWdodHNfbG9hZGVyJztcblxuY29uc3QgT0NURVRfU1RSRUFNX01JTUVfVFlQRSA9ICdhcHBsaWNhdGlvbi9vY3RldC1zdHJlYW0nO1xuY29uc3QgSlNPTl9UWVBFID0gJ2FwcGxpY2F0aW9uL2pzb24nO1xuZXhwb3J0IGNsYXNzIEhUVFBSZXF1ZXN0IGltcGxlbWVudHMgSU9IYW5kbGVyIHtcbiAgcHJvdGVjdGVkIHJlYWRvbmx5IHBhdGg6IHN0cmluZztcbiAgcHJvdGVjdGVkIHJlYWRvbmx5IHJlcXVlc3RJbml0OiBSZXF1ZXN0SW5pdDtcblxuICBwcml2YXRlIHJlYWRvbmx5IGZldGNoOiBGdW5jdGlvbjtcbiAgcHJpdmF0ZSByZWFkb25seSB3ZWlnaHRVcmxDb252ZXJ0ZXI6ICh3ZWlnaHROYW1lOiBzdHJpbmcpID0+IFByb21pc2U8c3RyaW5nPjtcblxuICByZWFkb25seSBERUZBVUxUX01FVEhPRCA9ICdQT1NUJztcblxuICBzdGF0aWMgcmVhZG9ubHkgVVJMX1NDSEVNRV9SRUdFWCA9IC9eaHR0cHM/OlxcL1xcLy87XG5cbiAgcHJpdmF0ZSByZWFkb25seSB3ZWlnaHRQYXRoUHJlZml4OiBzdHJpbmc7XG4gIHByaXZhdGUgcmVhZG9ubHkgb25Qcm9ncmVzczogT25Qcm9ncmVzc0NhbGxiYWNrO1xuXG4gIGNvbnN0cnVjdG9yKHBhdGg6IHN0cmluZywgbG9hZE9wdGlvbnM/OiBMb2FkT3B0aW9ucykge1xuICAgIGlmIChsb2FkT3B0aW9ucyA9PSBudWxsKSB7XG4gICAgICBsb2FkT3B0aW9ucyA9IHt9O1xuICAgIH1cbiAgICB0aGlzLndlaWdodFBhdGhQcmVmaXggPSBsb2FkT3B0aW9ucy53ZWlnaHRQYXRoUHJlZml4O1xuICAgIHRoaXMub25Qcm9ncmVzcyA9IGxvYWRPcHRpb25zLm9uUHJvZ3Jlc3M7XG4gICAgdGhpcy53ZWlnaHRVcmxDb252ZXJ0ZXIgPSBsb2FkT3B0aW9ucy53ZWlnaHRVcmxDb252ZXJ0ZXI7XG5cbiAgICBpZiAobG9hZE9wdGlvbnMuZmV0Y2hGdW5jICE9IG51bGwpIHtcbiAgICAgIGFzc2VydChcbiAgICAgICAgICB0eXBlb2YgbG9hZE9wdGlvbnMuZmV0Y2hGdW5jID09PSAnZnVuY3Rpb24nLFxuICAgICAgICAgICgpID0+ICdNdXN0IHBhc3MgYSBmdW5jdGlvbiB0aGF0IG1hdGNoZXMgdGhlIHNpZ25hdHVyZSBvZiAnICtcbiAgICAgICAgICAgICAgJ2BmZXRjaGAgKHNlZSAnICtcbiAgICAgICAgICAgICAgJ2h0dHBzOi8vZGV2ZWxvcGVyLm1vemlsbGEub3JnL2VuLVVTL2RvY3MvV2ViL0FQSS9GZXRjaF9BUEkpJyk7XG4gICAgICB0aGlzLmZldGNoID0gbG9hZE9wdGlvbnMuZmV0Y2hGdW5jO1xuICAgIH0gZWxzZSB7XG4gICAgICB0aGlzLmZldGNoID0gZW52KCkucGxhdGZvcm0uZmV0Y2g7XG4gICAgfVxuXG4gICAgYXNzZXJ0KFxuICAgICAgICBwYXRoICE9IG51bGwgJiYgcGF0aC5sZW5ndGggPiAwLFxuICAgICAgICAoKSA9PiAnVVJMIHBhdGggZm9yIGh0dHAgbXVzdCBub3QgYmUgbnVsbCwgdW5kZWZpbmVkIG9yICcgK1xuICAgICAgICAgICAgJ2VtcHR5LicpO1xuXG4gICAgaWYgKEFycmF5LmlzQXJyYXkocGF0aCkpIHtcbiAgICAgIGFzc2VydChcbiAgICAgICAgICBwYXRoLmxlbmd0aCA9PT0gMixcbiAgICAgICAgICAoKSA9PiAnVVJMIHBhdGhzIGZvciBodHRwIG11c3QgaGF2ZSBhIGxlbmd0aCBvZiAyLCAnICtcbiAgICAgICAgICAgICAgYChhY3R1YWwgbGVuZ3RoIGlzICR7cGF0aC5sZW5ndGh9KS5gKTtcbiAgICB9XG4gICAgdGhpcy5wYXRoID0gcGF0aDtcblxuICAgIGlmIChsb2FkT3B0aW9ucy5yZXF1ZXN0SW5pdCAhPSBudWxsICYmXG4gICAgICAgIGxvYWRPcHRpb25zLnJlcXVlc3RJbml0LmJvZHkgIT0gbnVsbCkge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKFxuICAgICAgICAgICdyZXF1ZXN0SW5pdCBpcyBleHBlY3RlZCB0byBoYXZlIG5vIHByZS1leGlzdGluZyBib2R5LCBidXQgaGFzIG9uZS4nKTtcbiAgICB9XG4gICAgdGhpcy5yZXF1ZXN0SW5pdCA9IGxvYWRPcHRpb25zLnJlcXVlc3RJbml0IHx8IHt9O1xuICB9XG5cbiAgYXN5bmMgc2F2ZShtb2RlbEFydGlmYWN0czogTW9kZWxBcnRpZmFjdHMpOiBQcm9taXNlPFNhdmVSZXN1bHQ+IHtcbiAgICBpZiAobW9kZWxBcnRpZmFjdHMubW9kZWxUb3BvbG9neSBpbnN0YW5jZW9mIEFycmF5QnVmZmVyKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoXG4gICAgICAgICAgJ0Jyb3dzZXJIVFRQUmVxdWVzdC5zYXZlKCkgZG9lcyBub3Qgc3VwcG9ydCBzYXZpbmcgbW9kZWwgdG9wb2xvZ3kgJyArXG4gICAgICAgICAgJ2luIGJpbmFyeSBmb3JtYXRzIHlldC4nKTtcbiAgICB9XG5cbiAgICBjb25zdCBpbml0ID0gT2JqZWN0LmFzc2lnbih7bWV0aG9kOiB0aGlzLkRFRkFVTFRfTUVUSE9EfSwgdGhpcy5yZXF1ZXN0SW5pdCk7XG4gICAgaW5pdC5ib2R5ID0gbmV3IEZvcm1EYXRhKCk7XG5cbiAgICBjb25zdCB3ZWlnaHRzTWFuaWZlc3Q6IFdlaWdodHNNYW5pZmVzdENvbmZpZyA9IFt7XG4gICAgICBwYXRoczogWycuL21vZGVsLndlaWdodHMuYmluJ10sXG4gICAgICB3ZWlnaHRzOiBtb2RlbEFydGlmYWN0cy53ZWlnaHRTcGVjcyxcbiAgICB9XTtcbiAgICBjb25zdCBtb2RlbFRvcG9sb2d5QW5kV2VpZ2h0TWFuaWZlc3Q6IE1vZGVsSlNPTiA9XG4gICAgICAgIGdldE1vZGVsSlNPTkZvck1vZGVsQXJ0aWZhY3RzKG1vZGVsQXJ0aWZhY3RzLCB3ZWlnaHRzTWFuaWZlc3QpO1xuXG4gICAgaW5pdC5ib2R5LmFwcGVuZChcbiAgICAgICAgJ21vZGVsLmpzb24nLFxuICAgICAgICBuZXcgQmxvYihcbiAgICAgICAgICAgIFtKU09OLnN0cmluZ2lmeShtb2RlbFRvcG9sb2d5QW5kV2VpZ2h0TWFuaWZlc3QpXSxcbiAgICAgICAgICAgIHt0eXBlOiBKU09OX1RZUEV9KSxcbiAgICAgICAgJ21vZGVsLmpzb24nKTtcblxuICAgIGlmIChtb2RlbEFydGlmYWN0cy53ZWlnaHREYXRhICE9IG51bGwpIHtcbiAgICAgIGluaXQuYm9keS5hcHBlbmQoXG4gICAgICAgICAgJ21vZGVsLndlaWdodHMuYmluJyxcbiAgICAgICAgICBuZXcgQmxvYihbbW9kZWxBcnRpZmFjdHMud2VpZ2h0RGF0YV0sIHt0eXBlOiBPQ1RFVF9TVFJFQU1fTUlNRV9UWVBFfSksXG4gICAgICAgICAgJ21vZGVsLndlaWdodHMuYmluJyk7XG4gICAgfVxuXG4gICAgY29uc3QgcmVzcG9uc2UgPSBhd2FpdCB0aGlzLmZldGNoKHRoaXMucGF0aCwgaW5pdCk7XG5cbiAgICBpZiAocmVzcG9uc2Uub2spIHtcbiAgICAgIHJldHVybiB7XG4gICAgICAgIG1vZGVsQXJ0aWZhY3RzSW5mbzogZ2V0TW9kZWxBcnRpZmFjdHNJbmZvRm9ySlNPTihtb2RlbEFydGlmYWN0cyksXG4gICAgICAgIHJlc3BvbnNlczogW3Jlc3BvbnNlXSxcbiAgICAgIH07XG4gICAgfSBlbHNlIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcihcbiAgICAgICAgICBgQnJvd3NlckhUVFBSZXF1ZXN0LnNhdmUoKSBmYWlsZWQgZHVlIHRvIEhUVFAgcmVzcG9uc2Ugc3RhdHVzIGAgK1xuICAgICAgICAgIGAke3Jlc3BvbnNlLnN0YXR1c30uYCk7XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIExvYWQgbW9kZWwgYXJ0aWZhY3RzIHZpYSBIVFRQIHJlcXVlc3QocykuXG4gICAqXG4gICAqIFNlZSB0aGUgZG9jdW1lbnRhdGlvbiB0byBgdGYuaW8uaHR0cGAgZm9yIGRldGFpbHMgb24gdGhlIHNhdmVkXG4gICAqIGFydGlmYWN0cy5cbiAgICpcbiAgICogQHJldHVybnMgVGhlIGxvYWRlZCBtb2RlbCBhcnRpZmFjdHMgKGlmIGxvYWRpbmcgc3VjY2VlZHMpLlxuICAgKi9cbiAgYXN5bmMgbG9hZCgpOiBQcm9taXNlPE1vZGVsQXJ0aWZhY3RzPiB7XG4gICAgY29uc3QgbW9kZWxDb25maWdSZXF1ZXN0ID0gYXdhaXQgdGhpcy5mZXRjaCh0aGlzLnBhdGgsIHRoaXMucmVxdWVzdEluaXQpO1xuXG4gICAgaWYgKCFtb2RlbENvbmZpZ1JlcXVlc3Qub2spIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcihcbiAgICAgICAgICBgUmVxdWVzdCB0byAke3RoaXMucGF0aH0gZmFpbGVkIHdpdGggc3RhdHVzIGNvZGUgYCArXG4gICAgICAgICAgYCR7bW9kZWxDb25maWdSZXF1ZXN0LnN0YXR1c30uIFBsZWFzZSB2ZXJpZnkgdGhpcyBVUkwgcG9pbnRzIHRvIGAgK1xuICAgICAgICAgIGB0aGUgbW9kZWwgSlNPTiBvZiB0aGUgbW9kZWwgdG8gbG9hZC5gKTtcbiAgICB9XG4gICAgbGV0IG1vZGVsSlNPTjogTW9kZWxKU09OO1xuICAgIHRyeSB7XG4gICAgICBtb2RlbEpTT04gPSBhd2FpdCBtb2RlbENvbmZpZ1JlcXVlc3QuanNvbigpO1xuICAgIH0gY2F0Y2ggKGUpIHtcbiAgICAgIGxldCBtZXNzYWdlID0gYEZhaWxlZCB0byBwYXJzZSBtb2RlbCBKU09OIG9mIHJlc3BvbnNlIGZyb20gJHt0aGlzLnBhdGh9LmA7XG4gICAgICAvLyBUT0RPKG5zdGhvcmF0KTogUmVtb3ZlIHRoaXMgYWZ0ZXIgc29tZSB0aW1lIHdoZW4gd2UncmUgY29tZm9ydGFibGUgdGhhdFxuICAgICAgLy8gLnBiIGZpbGVzIGFyZSBtb3N0bHkgZ29uZS5cbiAgICAgIGlmICh0aGlzLnBhdGguZW5kc1dpdGgoJy5wYicpKSB7XG4gICAgICAgIG1lc3NhZ2UgKz0gJyBZb3VyIHBhdGggY29udGFpbnMgYSAucGIgZmlsZSBleHRlbnNpb24uICcgK1xuICAgICAgICAgICAgJ1N1cHBvcnQgZm9yIC5wYiBtb2RlbHMgaGF2ZSBiZWVuIHJlbW92ZWQgaW4gVGVuc29yRmxvdy5qcyAxLjAgJyArXG4gICAgICAgICAgICAnaW4gZmF2b3Igb2YgLmpzb24gbW9kZWxzLiBZb3UgY2FuIHJlLWNvbnZlcnQgeW91ciBQeXRob24gJyArXG4gICAgICAgICAgICAnVGVuc29yRmxvdyBtb2RlbCB1c2luZyB0aGUgVGVuc29yRmxvdy5qcyAxLjAgY29udmVyc2lvbiBzY3JpcHRzICcgK1xuICAgICAgICAgICAgJ29yIHlvdSBjYW4gY29udmVydCB5b3VyLnBiIG1vZGVscyB3aXRoIHRoZSBcXCdwYjJqc29uXFwnJyArXG4gICAgICAgICAgICAnTlBNIHNjcmlwdCBpbiB0aGUgdGVuc29yZmxvdy90ZmpzLWNvbnZlcnRlciByZXBvc2l0b3J5Lic7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBtZXNzYWdlICs9ICcgUGxlYXNlIG1ha2Ugc3VyZSB0aGUgc2VydmVyIGlzIHNlcnZpbmcgdmFsaWQgJyArXG4gICAgICAgICAgICAnSlNPTiBmb3IgdGhpcyByZXF1ZXN0Lic7XG4gICAgICB9XG4gICAgICB0aHJvdyBuZXcgRXJyb3IobWVzc2FnZSk7XG4gICAgfVxuXG4gICAgLy8gV2UgZG8gbm90IGFsbG93IGJvdGggbW9kZWxUb3BvbG9neSBhbmQgd2VpZ2h0c01hbmlmZXN0IHRvIGJlIG1pc3NpbmcuXG4gICAgY29uc3QgbW9kZWxUb3BvbG9neSA9IG1vZGVsSlNPTi5tb2RlbFRvcG9sb2d5O1xuICAgIGNvbnN0IHdlaWdodHNNYW5pZmVzdCA9IG1vZGVsSlNPTi53ZWlnaHRzTWFuaWZlc3Q7XG4gICAgaWYgKG1vZGVsVG9wb2xvZ3kgPT0gbnVsbCAmJiB3ZWlnaHRzTWFuaWZlc3QgPT0gbnVsbCkge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKFxuICAgICAgICAgIGBUaGUgSlNPTiBmcm9tIEhUVFAgcGF0aCAke3RoaXMucGF0aH0gY29udGFpbnMgbmVpdGhlciBtb2RlbCBgICtcbiAgICAgICAgICBgdG9wb2xvZ3kgb3IgbWFuaWZlc3QgZm9yIHdlaWdodHMuYCk7XG4gICAgfVxuXG4gICAgcmV0dXJuIGdldE1vZGVsQXJ0aWZhY3RzRm9ySlNPTihcbiAgICAgICAgbW9kZWxKU09OLCAod2VpZ2h0c01hbmlmZXN0KSA9PiB0aGlzLmxvYWRXZWlnaHRzKHdlaWdodHNNYW5pZmVzdCkpO1xuICB9XG5cbiAgcHJpdmF0ZSBhc3luYyBsb2FkV2VpZ2h0cyh3ZWlnaHRzTWFuaWZlc3Q6IFdlaWdodHNNYW5pZmVzdENvbmZpZyk6XG4gICAgICBQcm9taXNlPFtXZWlnaHRzTWFuaWZlc3RFbnRyeVtdLCBBcnJheUJ1ZmZlcl0+IHtcbiAgICBjb25zdCB3ZWlnaHRQYXRoID0gQXJyYXkuaXNBcnJheSh0aGlzLnBhdGgpID8gdGhpcy5wYXRoWzFdIDogdGhpcy5wYXRoO1xuICAgIGNvbnN0IFtwcmVmaXgsIHN1ZmZpeF0gPSBwYXJzZVVybCh3ZWlnaHRQYXRoKTtcbiAgICBjb25zdCBwYXRoUHJlZml4ID0gdGhpcy53ZWlnaHRQYXRoUHJlZml4IHx8IHByZWZpeDtcblxuICAgIGNvbnN0IHdlaWdodFNwZWNzID0gZ2V0V2VpZ2h0U3BlY3Mod2VpZ2h0c01hbmlmZXN0KTtcblxuICAgIGNvbnN0IGZldGNoVVJMczogc3RyaW5nW10gPSBbXTtcbiAgICBjb25zdCB1cmxQcm9taXNlczogQXJyYXk8UHJvbWlzZTxzdHJpbmc+PiA9IFtdO1xuICAgIGZvciAoY29uc3Qgd2VpZ2h0c0dyb3VwIG9mIHdlaWdodHNNYW5pZmVzdCkge1xuICAgICAgZm9yIChjb25zdCBwYXRoIG9mIHdlaWdodHNHcm91cC5wYXRocykge1xuICAgICAgICBpZiAodGhpcy53ZWlnaHRVcmxDb252ZXJ0ZXIgIT0gbnVsbCkge1xuICAgICAgICAgIHVybFByb21pc2VzLnB1c2godGhpcy53ZWlnaHRVcmxDb252ZXJ0ZXIocGF0aCkpO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIGZldGNoVVJMcy5wdXNoKHBhdGhQcmVmaXggKyBwYXRoICsgc3VmZml4KTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH1cblxuICAgIGlmICh0aGlzLndlaWdodFVybENvbnZlcnRlcikge1xuICAgICAgZmV0Y2hVUkxzLnB1c2goLi4uYXdhaXQgUHJvbWlzZS5hbGwodXJsUHJvbWlzZXMpKTtcbiAgICB9XG5cbiAgICBjb25zdCBidWZmZXJzID0gYXdhaXQgbG9hZFdlaWdodHNBc0FycmF5QnVmZmVyKGZldGNoVVJMcywge1xuICAgICAgcmVxdWVzdEluaXQ6IHRoaXMucmVxdWVzdEluaXQsXG4gICAgICBmZXRjaEZ1bmM6IHRoaXMuZmV0Y2gsXG4gICAgICBvblByb2dyZXNzOiB0aGlzLm9uUHJvZ3Jlc3NcbiAgICB9KTtcbiAgICByZXR1cm4gW3dlaWdodFNwZWNzLCBjb25jYXRlbmF0ZUFycmF5QnVmZmVycyhidWZmZXJzKV07XG4gIH1cbn1cblxuLyoqXG4gKiBFeHRyYWN0IHRoZSBwcmVmaXggYW5kIHN1ZmZpeCBvZiB0aGUgdXJsLCB3aGVyZSB0aGUgcHJlZml4IGlzIHRoZSBwYXRoIGJlZm9yZVxuICogdGhlIGxhc3QgZmlsZSwgYW5kIHN1ZmZpeCBpcyB0aGUgc2VhcmNoIHBhcmFtcyBhZnRlciB0aGUgbGFzdCBmaWxlLlxuICogYGBgXG4gKiBjb25zdCB1cmwgPSAnaHR0cDovL3RmaHViLmRldi9tb2RlbC8xL3RlbnNvcmZsb3dqc19tb2RlbC5wYj90ZmpzLWZvcm1hdD1maWxlJ1xuICogW3ByZWZpeCwgc3VmZml4XSA9IHBhcnNlVXJsKHVybClcbiAqIC8vIHByZWZpeCA9ICdodHRwOi8vdGZodWIuZGV2L21vZGVsLzEvJ1xuICogLy8gc3VmZml4ID0gJz90ZmpzLWZvcm1hdD1maWxlJ1xuICogYGBgXG4gKiBAcGFyYW0gdXJsIHRoZSBtb2RlbCB1cmwgdG8gYmUgcGFyc2VkLlxuICovXG5leHBvcnQgZnVuY3Rpb24gcGFyc2VVcmwodXJsOiBzdHJpbmcpOiBbc3RyaW5nLCBzdHJpbmddIHtcbiAgY29uc3QgbGFzdFNsYXNoID0gdXJsLmxhc3RJbmRleE9mKCcvJyk7XG4gIGNvbnN0IGxhc3RTZWFyY2hQYXJhbSA9IHVybC5sYXN0SW5kZXhPZignPycpO1xuICBjb25zdCBwcmVmaXggPSB1cmwuc3Vic3RyaW5nKDAsIGxhc3RTbGFzaCk7XG4gIGNvbnN0IHN1ZmZpeCA9XG4gICAgICBsYXN0U2VhcmNoUGFyYW0gPiBsYXN0U2xhc2ggPyB1cmwuc3Vic3RyaW5nKGxhc3RTZWFyY2hQYXJhbSkgOiAnJztcbiAgcmV0dXJuIFtwcmVmaXggKyAnLycsIHN1ZmZpeF07XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBpc0hUVFBTY2hlbWUodXJsOiBzdHJpbmcpOiBib29sZWFuIHtcbiAgcmV0dXJuIHVybC5tYXRjaChIVFRQUmVxdWVzdC5VUkxfU0NIRU1FX1JFR0VYKSAhPSBudWxsO1xufVxuXG5leHBvcnQgY29uc3QgaHR0cFJvdXRlcjogSU9Sb3V0ZXIgPVxuICAgICh1cmw6IHN0cmluZywgbG9hZE9wdGlvbnM/OiBMb2FkT3B0aW9ucykgPT4ge1xuICAgICAgaWYgKHR5cGVvZiBmZXRjaCA9PT0gJ3VuZGVmaW5lZCcgJiZcbiAgICAgICAgICAobG9hZE9wdGlvbnMgPT0gbnVsbCB8fCBsb2FkT3B0aW9ucy5mZXRjaEZ1bmMgPT0gbnVsbCkpIHtcbiAgICAgICAgLy8gYGh0dHBgIHVzZXMgYGZldGNoYCBvciBgbm9kZS1mZXRjaGAsIGlmIG9uZSB3YW50cyB0byB1c2UgaXQgaW5cbiAgICAgICAgLy8gYW4gZW52aXJvbm1lbnQgdGhhdCBpcyBub3QgdGhlIGJyb3dzZXIgb3Igbm9kZSB0aGV5IGhhdmUgdG8gc2V0dXAgYVxuICAgICAgICAvLyBnbG9iYWwgZmV0Y2ggcG9seWZpbGwuXG4gICAgICAgIHJldHVybiBudWxsO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgbGV0IGlzSFRUUCA9IHRydWU7XG4gICAgICAgIGlmIChBcnJheS5pc0FycmF5KHVybCkpIHtcbiAgICAgICAgICBpc0hUVFAgPSB1cmwuZXZlcnkodXJsSXRlbSA9PiBpc0hUVFBTY2hlbWUodXJsSXRlbSkpO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIGlzSFRUUCA9IGlzSFRUUFNjaGVtZSh1cmwpO1xuICAgICAgICB9XG4gICAgICAgIGlmIChpc0hUVFApIHtcbiAgICAgICAgICByZXR1cm4gaHR0cCh1cmwsIGxvYWRPcHRpb25zKTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgICAgcmV0dXJuIG51bGw7XG4gICAgfTtcbklPUm91dGVyUmVnaXN0cnkucmVnaXN0ZXJTYXZlUm91dGVyKGh0dHBSb3V0ZXIpO1xuSU9Sb3V0ZXJSZWdpc3RyeS5yZWdpc3RlckxvYWRSb3V0ZXIoaHR0cFJvdXRlcik7XG5cbi8qKlxuICogQ3JlYXRlcyBhbiBJT0hhbmRsZXIgc3VidHlwZSB0aGF0IHNlbmRzIG1vZGVsIGFydGlmYWN0cyB0byBIVFRQIHNlcnZlci5cbiAqXG4gKiBBbiBIVFRQIHJlcXVlc3Qgb2YgdGhlIGBtdWx0aXBhcnQvZm9ybS1kYXRhYCBtaW1lIHR5cGUgd2lsbCBiZSBzZW50IHRvIHRoZVxuICogYHBhdGhgIFVSTC4gVGhlIGZvcm0gZGF0YSBpbmNsdWRlcyBhcnRpZmFjdHMgdGhhdCByZXByZXNlbnQgdGhlIHRvcG9sb2d5XG4gKiBhbmQvb3Igd2VpZ2h0cyBvZiB0aGUgbW9kZWwuIEluIHRoZSBjYXNlIG9mIEtlcmFzLXN0eWxlIGB0Zi5Nb2RlbGAsIHR3b1xuICogYmxvYnMgKGZpbGVzKSBleGlzdCBpbiBmb3JtLWRhdGE6XG4gKiAgIC0gQSBKU09OIGZpbGUgY29uc2lzdGluZyBvZiBgbW9kZWxUb3BvbG9neWAgYW5kIGB3ZWlnaHRzTWFuaWZlc3RgLlxuICogICAtIEEgYmluYXJ5IHdlaWdodHMgZmlsZSBjb25zaXN0aW5nIG9mIHRoZSBjb25jYXRlbmF0ZWQgd2VpZ2h0IHZhbHVlcy5cbiAqIFRoZXNlIGZpbGVzIGFyZSBpbiB0aGUgc2FtZSBmb3JtYXQgYXMgdGhlIG9uZSBnZW5lcmF0ZWQgYnlcbiAqIFt0ZmpzX2NvbnZlcnRlcl0oaHR0cHM6Ly9qcy50ZW5zb3JmbG93Lm9yZy90dXRvcmlhbHMvaW1wb3J0LWtlcmFzLmh0bWwpLlxuICpcbiAqIFRoZSBmb2xsb3dpbmcgY29kZSBzbmlwcGV0IGV4ZW1wbGlmaWVzIHRoZSBjbGllbnQtc2lkZSBjb2RlIHRoYXQgdXNlcyB0aGlzXG4gKiBmdW5jdGlvbjpcbiAqXG4gKiBgYGBqc1xuICogY29uc3QgbW9kZWwgPSB0Zi5zZXF1ZW50aWFsKCk7XG4gKiBtb2RlbC5hZGQoXG4gKiAgICAgdGYubGF5ZXJzLmRlbnNlKHt1bml0czogMSwgaW5wdXRTaGFwZTogWzEwMF0sIGFjdGl2YXRpb246ICdzaWdtb2lkJ30pKTtcbiAqXG4gKiBjb25zdCBzYXZlUmVzdWx0ID0gYXdhaXQgbW9kZWwuc2F2ZSh0Zi5pby5odHRwKFxuICogICAgICdodHRwOi8vbW9kZWwtc2VydmVyOjUwMDAvdXBsb2FkJywge3JlcXVlc3RJbml0OiB7bWV0aG9kOiAnUFVUJ319KSk7XG4gKiBjb25zb2xlLmxvZyhzYXZlUmVzdWx0KTtcbiAqIGBgYFxuICpcbiAqIElmIHRoZSBkZWZhdWx0IGBQT1NUYCBtZXRob2QgaXMgdG8gYmUgdXNlZCwgd2l0aG91dCBhbnkgY3VzdG9tIHBhcmFtZXRlcnNcbiAqIHN1Y2ggYXMgaGVhZGVycywgeW91IGNhbiBzaW1wbHkgcGFzcyBhbiBIVFRQIG9yIEhUVFBTIFVSTCB0byBgbW9kZWwuc2F2ZWA6XG4gKlxuICogYGBganNcbiAqIGNvbnN0IHNhdmVSZXN1bHQgPSBhd2FpdCBtb2RlbC5zYXZlKCdodHRwOi8vbW9kZWwtc2VydmVyOjUwMDAvdXBsb2FkJyk7XG4gKiBgYGBcbiAqXG4gKiBUaGUgZm9sbG93aW5nIEdpdEh1YiBHaXN0XG4gKiBodHRwczovL2dpc3QuZ2l0aHViLmNvbS9kc21pbGtvdi8xYjYwNDZmZDYxMzJkNzQwOGQ1MjU3YjA5NzZmNzg2NFxuICogaW1wbGVtZW50cyBhIHNlcnZlciBiYXNlZCBvbiBbZmxhc2tdKGh0dHBzOi8vZ2l0aHViLmNvbS9wYWxsZXRzL2ZsYXNrKSB0aGF0XG4gKiBjYW4gcmVjZWl2ZSB0aGUgcmVxdWVzdC4gVXBvbiByZWNlaXZpbmcgdGhlIG1vZGVsIGFydGlmYWN0cyB2aWEgdGhlIHJlcXVzdCxcbiAqIHRoaXMgcGFydGljdWxhciBzZXJ2ZXIgcmVjb25zdGl0dXRlcyBpbnN0YW5jZXMgb2YgW0tlcmFzXG4gKiBNb2RlbHNdKGh0dHBzOi8va2VyYXMuaW8vbW9kZWxzL21vZGVsLykgaW4gbWVtb3J5LlxuICpcbiAqXG4gKiBAcGFyYW0gcGF0aCBBIFVSTCBwYXRoIHRvIHRoZSBtb2RlbC5cbiAqICAgQ2FuIGJlIGFuIGFic29sdXRlIEhUVFAgcGF0aCAoZS5nLixcbiAqICAgJ2h0dHA6Ly9sb2NhbGhvc3Q6ODAwMC9tb2RlbC11cGxvYWQpJykgb3IgYSByZWxhdGl2ZSBwYXRoIChlLmcuLFxuICogICAnLi9tb2RlbC11cGxvYWQnKS5cbiAqIEBwYXJhbSByZXF1ZXN0SW5pdCBSZXF1ZXN0IGNvbmZpZ3VyYXRpb25zIHRvIGJlIHVzZWQgd2hlbiBzZW5kaW5nXG4gKiAgICBIVFRQIHJlcXVlc3QgdG8gc2VydmVyIHVzaW5nIGBmZXRjaGAuIEl0IGNhbiBjb250YWluIGZpZWxkcyBzdWNoIGFzXG4gKiAgICBgbWV0aG9kYCwgYGNyZWRlbnRpYWxzYCwgYGhlYWRlcnNgLCBgbW9kZWAsIGV0Yy4gU2VlXG4gKiAgICBodHRwczovL2RldmVsb3Blci5tb3ppbGxhLm9yZy9lbi1VUy9kb2NzL1dlYi9BUEkvUmVxdWVzdC9SZXF1ZXN0XG4gKiAgICBmb3IgbW9yZSBpbmZvcm1hdGlvbi4gYHJlcXVlc3RJbml0YCBtdXN0IG5vdCBoYXZlIGEgYm9keSwgYmVjYXVzZSB0aGVcbiAqIGJvZHkgd2lsbCBiZSBzZXQgYnkgVGVuc29yRmxvdy5qcy4gRmlsZSBibG9icyByZXByZXNlbnRpbmcgdGhlIG1vZGVsXG4gKiB0b3BvbG9neSAoZmlsZW5hbWU6ICdtb2RlbC5qc29uJykgYW5kIHRoZSB3ZWlnaHRzIG9mIHRoZSBtb2RlbCAoZmlsZW5hbWU6XG4gKiAnbW9kZWwud2VpZ2h0cy5iaW4nKSB3aWxsIGJlIGFwcGVuZGVkIHRvIHRoZSBib2R5LiBJZiBgcmVxdWVzdEluaXRgIGhhcyBhXG4gKiBgYm9keWAsIGFuIEVycm9yIHdpbGwgYmUgdGhyb3duLlxuICogQHBhcmFtIGxvYWRPcHRpb25zIE9wdGlvbmFsIGNvbmZpZ3VyYXRpb24gZm9yIHRoZSBsb2FkaW5nLiBJdCBpbmNsdWRlcyB0aGVcbiAqICAgZm9sbG93aW5nIGZpZWxkczpcbiAqICAgLSB3ZWlnaHRQYXRoUHJlZml4IE9wdGlvbmFsLCB0aGlzIHNwZWNpZmllcyB0aGUgcGF0aCBwcmVmaXggZm9yIHdlaWdodFxuICogICAgIGZpbGVzLCBieSBkZWZhdWx0IHRoaXMgaXMgY2FsY3VsYXRlZCBmcm9tIHRoZSBwYXRoIHBhcmFtLlxuICogICAtIGZldGNoRnVuYyBPcHRpb25hbCwgY3VzdG9tIGBmZXRjaGAgZnVuY3Rpb24uIEUuZy4sIGluIE5vZGUuanMsXG4gKiAgICAgdGhlIGBmZXRjaGAgZnJvbSBub2RlLWZldGNoIGNhbiBiZSB1c2VkIGhlcmUuXG4gKiAgIC0gb25Qcm9ncmVzcyBPcHRpb25hbCwgcHJvZ3Jlc3MgY2FsbGJhY2sgZnVuY3Rpb24sIGZpcmVkIHBlcmlvZGljYWxseVxuICogICAgIGJlZm9yZSB0aGUgbG9hZCBpcyBjb21wbGV0ZWQuXG4gKiBAcmV0dXJucyBBbiBpbnN0YW5jZSBvZiBgSU9IYW5kbGVyYC5cbiAqXG4gKiBAZG9jIHtcbiAqICAgaGVhZGluZzogJ01vZGVscycsXG4gKiAgIHN1YmhlYWRpbmc6ICdMb2FkaW5nJyxcbiAqICAgbmFtZXNwYWNlOiAnaW8nLFxuICogICBpZ25vcmVDSTogdHJ1ZVxuICogfVxuICovXG5leHBvcnQgZnVuY3Rpb24gaHR0cChwYXRoOiBzdHJpbmcsIGxvYWRPcHRpb25zPzogTG9hZE9wdGlvbnMpOiBJT0hhbmRsZXIge1xuICByZXR1cm4gbmV3IEhUVFBSZXF1ZXN0KHBhdGgsIGxvYWRPcHRpb25zKTtcbn1cblxuLyoqXG4gKiBEZXByZWNhdGVkLiBVc2UgYHRmLmlvLmh0dHBgLlxuICogQHBhcmFtIHBhdGhcbiAqIEBwYXJhbSBsb2FkT3B0aW9uc1xuICovXG5leHBvcnQgZnVuY3Rpb24gYnJvd3NlckhUVFBSZXF1ZXN0KFxuICAgIHBhdGg6IHN0cmluZywgbG9hZE9wdGlvbnM/OiBMb2FkT3B0aW9ucyk6IElPSGFuZGxlciB7XG4gIHJldHVybiBodHRwKHBhdGgsIGxvYWRPcHRpb25zKTtcbn1cbiJdfQ==","/**\n * @license\n * Copyright 2018 Google LLC. All Rights Reserved.\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n * =============================================================================\n */\nclass PassthroughLoader {\n constructor(modelArtifacts) {\n this.modelArtifacts = modelArtifacts;\n }\n load() {\n return this.modelArtifacts;\n }\n}\nclass PassthroughSaver {\n constructor(saveHandler) {\n this.saveHandler = saveHandler;\n }\n save(modelArtifacts) {\n return this.saveHandler(modelArtifacts);\n }\n}\nclass PassthroughAsync {\n constructor(handler) {\n if (handler.load) {\n this.load = () => Promise.resolve(handler.load());\n }\n if (handler.save) {\n this.save = (modelArtifacts) => Promise.resolve(handler.save(modelArtifacts));\n }\n }\n}\n/**\n * Creates an IOHandler that loads model artifacts from memory.\n *\n * When used in conjunction with `tf.loadLayersModel`, an instance of\n * `tf.LayersModel` (Keras-style) can be constructed from the loaded artifacts.\n *\n * ```js\n * const model = await tf.loadLayersModel(tf.io.fromMemory(\n * modelTopology, weightSpecs, weightData));\n * ```\n *\n * @param modelArtifacts a object containing model topology (i.e., parsed from\n * the JSON format).\n * @param weightSpecs An array of `WeightsManifestEntry` objects describing the\n * names, shapes, types, and quantization of the weight data. Optional.\n * @param weightData A single `ArrayBuffer` containing the weight data,\n * concatenated in the order described by the weightSpecs. Optional.\n * @param trainingConfig Model training configuration. Optional.\n *\n * @returns A passthrough `IOHandler` that simply loads the provided data.\n */\nexport function fromMemory(modelArtifacts, weightSpecs, weightData, trainingConfig) {\n const args = arguments;\n return new PassthroughAsync(fromMemorySync(...args));\n}\n/**\n * Creates an IOHandler that loads model artifacts from memory.\n *\n * When used in conjunction with `tf.loadLayersModel`, an instance of\n * `tf.LayersModel` (Keras-style) can be constructed from the loaded artifacts.\n *\n * ```js\n * const model = await tf.loadLayersModel(tf.io.fromMemory(\n * modelTopology, weightSpecs, weightData));\n * ```\n *\n * @param modelArtifacts a object containing model topology (i.e., parsed from\n * the JSON format).\n * @param weightSpecs An array of `WeightsManifestEntry` objects describing the\n * names, shapes, types, and quantization of the weight data. Optional.\n * @param weightData A single `ArrayBuffer` containing the weight data,\n * concatenated in the order described by the weightSpecs. Optional.\n * @param trainingConfig Model training configuration. Optional.\n *\n * @returns A passthrough `IOHandlerSync` that simply loads the provided data.\n */\nexport function fromMemorySync(modelArtifacts, weightSpecs, weightData, trainingConfig) {\n if (arguments.length === 1) {\n const isModelArtifacts = modelArtifacts.modelTopology != null ||\n modelArtifacts.weightSpecs != null;\n if (isModelArtifacts) {\n return new PassthroughLoader(modelArtifacts);\n }\n else {\n // Legacy support: with only modelTopology.\n // TODO(cais): Remove this deprecated API.\n console.warn('Please call tf.io.fromMemory() with only one argument. ' +\n 'The argument should be of type ModelArtifacts. ' +\n 'The multi-argument signature of tf.io.fromMemory() has been ' +\n 'deprecated and will be removed in a future release.');\n return new PassthroughLoader({ modelTopology: modelArtifacts });\n }\n }\n else {\n // Legacy support.\n // TODO(cais): Remove this deprecated API.\n console.warn('Please call tf.io.fromMemory() with only one argument. ' +\n 'The argument should be of type ModelArtifacts. ' +\n 'The multi-argument signature of tf.io.fromMemory() has been ' +\n 'deprecated and will be removed in a future release.');\n return new PassthroughLoader({\n modelTopology: modelArtifacts,\n weightSpecs,\n weightData,\n trainingConfig\n });\n }\n}\n/**\n * Creates an IOHandler that passes saved model artifacts to a callback.\n *\n * ```js\n * function handleSave(artifacts) {\n * // ... do something with the artifacts ...\n * return {modelArtifactsInfo: {...}, ...};\n * }\n *\n * const saveResult = model.save(tf.io.withSaveHandler(handleSave));\n * ```\n *\n * @param saveHandler A function that accepts a `ModelArtifacts` and returns a\n * promise that resolves to a `SaveResult`.\n */\nexport function withSaveHandler(saveHandler) {\n return new PassthroughSaver(saveHandler);\n}\n/**\n * Creates an IOHandlerSync that passes saved model artifacts to a callback.\n *\n * ```js\n * function handleSave(artifacts) {\n * // ... do something with the artifacts ...\n * return {modelArtifactsInfo: {...}, ...};\n * }\n *\n * const saveResult = model.save(tf.io.withSaveHandler(handleSave));\n * ```\n *\n * @param saveHandler A function that accepts a `ModelArtifacts` and returns a\n * `SaveResult`.\n */\nexport function withSaveHandlerSync(saveHandler) {\n return new PassthroughSaver(saveHandler);\n}\n//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicGFzc3Rocm91Z2guanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi8uLi90ZmpzLWNvcmUvc3JjL2lvL3Bhc3N0aHJvdWdoLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBOzs7Ozs7Ozs7Ozs7Ozs7R0FlRztBQVFILE1BQU0saUJBQWlCO0lBQ3JCLFlBQTZCLGNBQStCO1FBQS9CLG1CQUFjLEdBQWQsY0FBYyxDQUFpQjtJQUFHLENBQUM7SUFFaEUsSUFBSTtRQUNGLE9BQU8sSUFBSSxDQUFDLGNBQWMsQ0FBQztJQUM3QixDQUFDO0NBQ0Y7QUFFRCxNQUFNLGdCQUFnQjtJQUNwQixZQUNtQixXQUE2QztRQUE3QyxnQkFBVyxHQUFYLFdBQVcsQ0FBa0M7SUFBRyxDQUFDO0lBRXBFLElBQUksQ0FBQyxjQUE4QjtRQUNqQyxPQUFPLElBQUksQ0FBQyxXQUFXLENBQUMsY0FBYyxDQUFDLENBQUM7SUFDMUMsQ0FBQztDQUNGO0FBRUQsTUFBTSxnQkFBZ0I7SUFJcEIsWUFBWSxPQUFzQjtRQUNoQyxJQUFJLE9BQU8sQ0FBQyxJQUFJLEVBQUU7WUFDaEIsSUFBSSxDQUFDLElBQUksR0FBRyxHQUFHLEVBQUUsQ0FBQyxPQUFPLENBQUMsT0FBTyxDQUFDLE9BQU8sQ0FBQyxJQUFJLEVBQUUsQ0FBQyxDQUFDO1NBQ25EO1FBQ0QsSUFBSSxPQUFPLENBQUMsSUFBSSxFQUFFO1lBQ2hCLElBQUksQ0FBQyxJQUFJLEdBQUcsQ0FBQyxjQUE4QixFQUFFLEVBQUUsQ0FDN0MsT0FBTyxDQUFDLE9BQU8sQ0FBQyxPQUFPLENBQUMsSUFBSSxDQUFDLGNBQWMsQ0FBQyxDQUFDLENBQUM7U0FDakQ7SUFDSCxDQUFDO0NBQ0Y7QUFFRDs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7R0FvQkc7QUFDSCxNQUFNLFVBQVUsVUFBVSxDQUN0QixjQUFpQyxFQUFFLFdBQW9DLEVBQ3ZFLFVBQXdCLEVBQUUsY0FBK0I7SUFFM0QsTUFBTSxJQUFJLEdBQUcsU0FBcUQsQ0FBQztJQUNuRSxPQUFPLElBQUksZ0JBQWdCLENBQUMsY0FBYyxDQUFDLEdBQUcsSUFBSSxDQUFDLENBQUMsQ0FBQztBQUN2RCxDQUFDO0FBRUQ7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7O0dBb0JHO0FBQ0gsTUFBTSxVQUFVLGNBQWMsQ0FDMUIsY0FBaUMsRUFBRSxXQUFvQyxFQUN2RSxVQUF3QixFQUFFLGNBQStCO0lBQzNELElBQUksU0FBUyxDQUFDLE1BQU0sS0FBSyxDQUFDLEVBQUU7UUFDMUIsTUFBTSxnQkFBZ0IsR0FDakIsY0FBaUMsQ0FBQyxhQUFhLElBQUksSUFBSTtZQUN2RCxjQUFpQyxDQUFDLFdBQVcsSUFBSSxJQUFJLENBQUM7UUFDM0QsSUFBSSxnQkFBZ0IsRUFBRTtZQUNwQixPQUFPLElBQUksaUJBQWlCLENBQUMsY0FBZ0MsQ0FBQyxDQUFDO1NBQ2hFO2FBQU07WUFDTCwyQ0FBMkM7WUFDM0MsMENBQTBDO1lBQzFDLE9BQU8sQ0FBQyxJQUFJLENBQ1IseURBQXlEO2dCQUN6RCxpREFBaUQ7Z0JBQ2pELDhEQUE4RDtnQkFDOUQscURBQXFELENBQUMsQ0FBQztZQUMzRCxPQUFPLElBQUksaUJBQWlCLENBQUMsRUFBQyxhQUFhLEVBQUUsY0FBb0IsRUFBQyxDQUFDLENBQUM7U0FDckU7S0FDRjtTQUFNO1FBQ0wsa0JBQWtCO1FBQ2xCLDBDQUEwQztRQUMxQyxPQUFPLENBQUMsSUFBSSxDQUNSLHlEQUF5RDtZQUN6RCxpREFBaUQ7WUFDakQsOERBQThEO1lBQzlELHFEQUFxRCxDQUFDLENBQUM7UUFDM0QsT0FBTyxJQUFJLGlCQUFpQixDQUFDO1lBQzNCLGFBQWEsRUFBRSxjQUFvQjtZQUNuQyxXQUFXO1lBQ1gsVUFBVTtZQUNWLGNBQWM7U0FDZixDQUFDLENBQUM7S0FDSjtBQUNILENBQUM7QUFFRDs7Ozs7Ozs7Ozs7Ozs7R0FjRztBQUNILE1BQU0sVUFBVSxlQUFlLENBQzNCLFdBQ3VCO0lBQ3pCLE9BQU8sSUFBSSxnQkFBZ0IsQ0FBQyxXQUFXLENBQUMsQ0FBQztBQUMzQyxDQUFDO0FBRUQ7Ozs7Ozs7Ozs7Ozs7O0dBY0c7QUFDSCxNQUFNLFVBQVUsbUJBQW1CLENBQy9CLFdBQXNEO0lBQ3hELE9BQU8sSUFBSSxnQkFBZ0IsQ0FBYSxXQUFXLENBQUMsQ0FBQztBQUN2RCxDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiLyoqXG4gKiBAbGljZW5zZVxuICogQ29weXJpZ2h0IDIwMTggR29vZ2xlIExMQy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC5cbiAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSBcIkxpY2Vuc2VcIik7XG4gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuXG4gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXRcbiAqXG4gKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjBcbiAqXG4gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlXG4gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiBcIkFTIElTXCIgQkFTSVMsXG4gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC5cbiAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmRcbiAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLlxuICogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbiAqL1xuXG4vKipcbiAqIElPSGFuZGxlcnMgdGhhdCBwYXNzIHRocm91Z2ggdGhlIGluLW1lbW9yeSBNb2RlbEFydGlmYWN0cyBmb3JtYXQuXG4gKi9cblxuaW1wb3J0IHtJT0hhbmRsZXIsIElPSGFuZGxlclN5bmMsIExvYWRIYW5kbGVyLCBNb2RlbEFydGlmYWN0cywgU2F2ZUhhbmRsZXIsIFNhdmVSZXN1bHQsIFRyYWluaW5nQ29uZmlnLCBXZWlnaHRzTWFuaWZlc3RFbnRyeX0gZnJvbSAnLi90eXBlcyc7XG5cbmNsYXNzIFBhc3N0aHJvdWdoTG9hZGVyIGltcGxlbWVudHMgSU9IYW5kbGVyU3luYyB7XG4gIGNvbnN0cnVjdG9yKHByaXZhdGUgcmVhZG9ubHkgbW9kZWxBcnRpZmFjdHM/OiBNb2RlbEFydGlmYWN0cykge31cblxuICBsb2FkKCk6IE1vZGVsQXJ0aWZhY3RzIHtcbiAgICByZXR1cm4gdGhpcy5tb2RlbEFydGlmYWN0cztcbiAgfVxufVxuXG5jbGFzcyBQYXNzdGhyb3VnaFNhdmVyPFIgZXh0ZW5kcyBTYXZlUmVzdWx0IHwgUHJvbWlzZTxTYXZlUmVzdWx0Pj4ge1xuICBjb25zdHJ1Y3RvcihcbiAgICBwcml2YXRlIHJlYWRvbmx5IHNhdmVIYW5kbGVyOiAoYXJ0aWZhY3RzOiBNb2RlbEFydGlmYWN0cykgPT4gUikge31cblxuICBzYXZlKG1vZGVsQXJ0aWZhY3RzOiBNb2RlbEFydGlmYWN0cyk6IFIge1xuICAgIHJldHVybiB0aGlzLnNhdmVIYW5kbGVyKG1vZGVsQXJ0aWZhY3RzKTtcbiAgfVxufVxuXG5jbGFzcyBQYXNzdGhyb3VnaEFzeW5jIGltcGxlbWVudHMgSU9IYW5kbGVyIHtcbiAgbG9hZD86IExvYWRIYW5kbGVyO1xuICBzYXZlPzogU2F2ZUhhbmRsZXI7XG5cbiAgY29uc3RydWN0b3IoaGFuZGxlcjogSU9IYW5kbGVyU3luYykge1xuICAgIGlmIChoYW5kbGVyLmxvYWQpIHtcbiAgICAgIHRoaXMubG9hZCA9ICgpID0+IFByb21pc2UucmVzb2x2ZShoYW5kbGVyLmxvYWQoKSk7XG4gICAgfVxuICAgIGlmIChoYW5kbGVyLnNhdmUpIHtcbiAgICAgIHRoaXMuc2F2ZSA9IChtb2RlbEFydGlmYWN0czogTW9kZWxBcnRpZmFjdHMpID0+XG4gICAgICAgIFByb21pc2UucmVzb2x2ZShoYW5kbGVyLnNhdmUobW9kZWxBcnRpZmFjdHMpKTtcbiAgICB9XG4gIH1cbn1cblxuLyoqXG4gKiBDcmVhdGVzIGFuIElPSGFuZGxlciB0aGF0IGxvYWRzIG1vZGVsIGFydGlmYWN0cyBmcm9tIG1lbW9yeS5cbiAqXG4gKiBXaGVuIHVzZWQgaW4gY29uanVuY3Rpb24gd2l0aCBgdGYubG9hZExheWVyc01vZGVsYCwgYW4gaW5zdGFuY2Ugb2ZcbiAqIGB0Zi5MYXllcnNNb2RlbGAgKEtlcmFzLXN0eWxlKSBjYW4gYmUgY29uc3RydWN0ZWQgZnJvbSB0aGUgbG9hZGVkIGFydGlmYWN0cy5cbiAqXG4gKiBgYGBqc1xuICogY29uc3QgbW9kZWwgPSBhd2FpdCB0Zi5sb2FkTGF5ZXJzTW9kZWwodGYuaW8uZnJvbU1lbW9yeShcbiAqICAgICBtb2RlbFRvcG9sb2d5LCB3ZWlnaHRTcGVjcywgd2VpZ2h0RGF0YSkpO1xuICogYGBgXG4gKlxuICogQHBhcmFtIG1vZGVsQXJ0aWZhY3RzIGEgb2JqZWN0IGNvbnRhaW5pbmcgbW9kZWwgdG9wb2xvZ3kgKGkuZS4sIHBhcnNlZCBmcm9tXG4gKiAgIHRoZSBKU09OIGZvcm1hdCkuXG4gKiBAcGFyYW0gd2VpZ2h0U3BlY3MgQW4gYXJyYXkgb2YgYFdlaWdodHNNYW5pZmVzdEVudHJ5YCBvYmplY3RzIGRlc2NyaWJpbmcgdGhlXG4gKiAgIG5hbWVzLCBzaGFwZXMsIHR5cGVzLCBhbmQgcXVhbnRpemF0aW9uIG9mIHRoZSB3ZWlnaHQgZGF0YS4gT3B0aW9uYWwuXG4gKiBAcGFyYW0gd2VpZ2h0RGF0YSBBIHNpbmdsZSBgQXJyYXlCdWZmZXJgIGNvbnRhaW5pbmcgdGhlIHdlaWdodCBkYXRhLFxuICogICBjb25jYXRlbmF0ZWQgaW4gdGhlIG9yZGVyIGRlc2NyaWJlZCBieSB0aGUgd2VpZ2h0U3BlY3MuIE9wdGlvbmFsLlxuICogQHBhcmFtIHRyYWluaW5nQ29uZmlnIE1vZGVsIHRyYWluaW5nIGNvbmZpZ3VyYXRpb24uIE9wdGlvbmFsLlxuICpcbiAqIEByZXR1cm5zIEEgcGFzc3Rocm91Z2ggYElPSGFuZGxlcmAgdGhhdCBzaW1wbHkgbG9hZHMgdGhlIHByb3ZpZGVkIGRhdGEuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBmcm9tTWVtb3J5KFxuICAgIG1vZGVsQXJ0aWZhY3RzOiB7fXxNb2RlbEFydGlmYWN0cywgd2VpZ2h0U3BlY3M/OiBXZWlnaHRzTWFuaWZlc3RFbnRyeVtdLFxuICAgIHdlaWdodERhdGE/OiBBcnJheUJ1ZmZlciwgdHJhaW5pbmdDb25maWc/OiBUcmFpbmluZ0NvbmZpZyk6IElPSGFuZGxlciB7XG5cbiAgY29uc3QgYXJncyA9IGFyZ3VtZW50cyBhcyB1bmtub3duIGFzIFBhcmFtZXRlcnM8dHlwZW9mIGZyb21NZW1vcnk+O1xuICByZXR1cm4gbmV3IFBhc3N0aHJvdWdoQXN5bmMoZnJvbU1lbW9yeVN5bmMoLi4uYXJncykpO1xufVxuXG4vKipcbiAqIENyZWF0ZXMgYW4gSU9IYW5kbGVyIHRoYXQgbG9hZHMgbW9kZWwgYXJ0aWZhY3RzIGZyb20gbWVtb3J5LlxuICpcbiAqIFdoZW4gdXNlZCBpbiBjb25qdW5jdGlvbiB3aXRoIGB0Zi5sb2FkTGF5ZXJzTW9kZWxgLCBhbiBpbnN0YW5jZSBvZlxuICogYHRmLkxheWVyc01vZGVsYCAoS2VyYXMtc3R5bGUpIGNhbiBiZSBjb25zdHJ1Y3RlZCBmcm9tIHRoZSBsb2FkZWQgYXJ0aWZhY3RzLlxuICpcbiAqIGBgYGpzXG4gKiBjb25zdCBtb2RlbCA9IGF3YWl0IHRmLmxvYWRMYXllcnNNb2RlbCh0Zi5pby5mcm9tTWVtb3J5KFxuICogICAgIG1vZGVsVG9wb2xvZ3ksIHdlaWdodFNwZWNzLCB3ZWlnaHREYXRhKSk7XG4gKiBgYGBcbiAqXG4gKiBAcGFyYW0gbW9kZWxBcnRpZmFjdHMgYSBvYmplY3QgY29udGFpbmluZyBtb2RlbCB0b3BvbG9neSAoaS5lLiwgcGFyc2VkIGZyb21cbiAqICAgdGhlIEpTT04gZm9ybWF0KS5cbiAqIEBwYXJhbSB3ZWlnaHRTcGVjcyBBbiBhcnJheSBvZiBgV2VpZ2h0c01hbmlmZXN0RW50cnlgIG9iamVjdHMgZGVzY3JpYmluZyB0aGVcbiAqICAgbmFtZXMsIHNoYXBlcywgdHlwZXMsIGFuZCBxdWFudGl6YXRpb24gb2YgdGhlIHdlaWdodCBkYXRhLiBPcHRpb25hbC5cbiAqIEBwYXJhbSB3ZWlnaHREYXRhIEEgc2luZ2xlIGBBcnJheUJ1ZmZlcmAgY29udGFpbmluZyB0aGUgd2VpZ2h0IGRhdGEsXG4gKiAgIGNvbmNhdGVuYXRlZCBpbiB0aGUgb3JkZXIgZGVzY3JpYmVkIGJ5IHRoZSB3ZWlnaHRTcGVjcy4gT3B0aW9uYWwuXG4gKiBAcGFyYW0gdHJhaW5pbmdDb25maWcgTW9kZWwgdHJhaW5pbmcgY29uZmlndXJhdGlvbi4gT3B0aW9uYWwuXG4gKlxuICogQHJldHVybnMgQSBwYXNzdGhyb3VnaCBgSU9IYW5kbGVyU3luY2AgdGhhdCBzaW1wbHkgbG9hZHMgdGhlIHByb3ZpZGVkIGRhdGEuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBmcm9tTWVtb3J5U3luYyhcbiAgICBtb2RlbEFydGlmYWN0czoge318TW9kZWxBcnRpZmFjdHMsIHdlaWdodFNwZWNzPzogV2VpZ2h0c01hbmlmZXN0RW50cnlbXSxcbiAgICB3ZWlnaHREYXRhPzogQXJyYXlCdWZmZXIsIHRyYWluaW5nQ29uZmlnPzogVHJhaW5pbmdDb25maWcpOiBJT0hhbmRsZXJTeW5jIHtcbiAgaWYgKGFyZ3VtZW50cy5sZW5ndGggPT09IDEpIHtcbiAgICBjb25zdCBpc01vZGVsQXJ0aWZhY3RzID1cbiAgICAgICAgKG1vZGVsQXJ0aWZhY3RzIGFzIE1vZGVsQXJ0aWZhY3RzKS5tb2RlbFRvcG9sb2d5ICE9IG51bGwgfHxcbiAgICAgICAgKG1vZGVsQXJ0aWZhY3RzIGFzIE1vZGVsQXJ0aWZhY3RzKS53ZWlnaHRTcGVjcyAhPSBudWxsO1xuICAgIGlmIChpc01vZGVsQXJ0aWZhY3RzKSB7XG4gICAgICByZXR1cm4gbmV3IFBhc3N0aHJvdWdoTG9hZGVyKG1vZGVsQXJ0aWZhY3RzIGFzIE1vZGVsQXJ0aWZhY3RzKTtcbiAgICB9IGVsc2Uge1xuICAgICAgLy8gTGVnYWN5IHN1cHBvcnQ6IHdpdGggb25seSBtb2RlbFRvcG9sb2d5LlxuICAgICAgLy8gVE9ETyhjYWlzKTogUmVtb3ZlIHRoaXMgZGVwcmVjYXRlZCBBUEkuXG4gICAgICBjb25zb2xlLndhcm4oXG4gICAgICAgICAgJ1BsZWFzZSBjYWxsIHRmLmlvLmZyb21NZW1vcnkoKSB3aXRoIG9ubHkgb25lIGFyZ3VtZW50LiAnICtcbiAgICAgICAgICAnVGhlIGFyZ3VtZW50IHNob3VsZCBiZSBvZiB0eXBlIE1vZGVsQXJ0aWZhY3RzLiAnICtcbiAgICAgICAgICAnVGhlIG11bHRpLWFyZ3VtZW50IHNpZ25hdHVyZSBvZiB0Zi5pby5mcm9tTWVtb3J5KCkgaGFzIGJlZW4gJyArXG4gICAgICAgICAgJ2RlcHJlY2F0ZWQgYW5kIHdpbGwgYmUgcmVtb3ZlZCBpbiBhIGZ1dHVyZSByZWxlYXNlLicpO1xuICAgICAgcmV0dXJuIG5ldyBQYXNzdGhyb3VnaExvYWRlcih7bW9kZWxUb3BvbG9neTogbW9kZWxBcnRpZmFjdHMgYXMge319KTtcbiAgICB9XG4gIH0gZWxzZSB7XG4gICAgLy8gTGVnYWN5IHN1cHBvcnQuXG4gICAgLy8gVE9ETyhjYWlzKTogUmVtb3ZlIHRoaXMgZGVwcmVjYXRlZCBBUEkuXG4gICAgY29uc29sZS53YXJuKFxuICAgICAgICAnUGxlYXNlIGNhbGwgdGYuaW8uZnJvbU1lbW9yeSgpIHdpdGggb25seSBvbmUgYXJndW1lbnQuICcgK1xuICAgICAgICAnVGhlIGFyZ3VtZW50IHNob3VsZCBiZSBvZiB0eXBlIE1vZGVsQXJ0aWZhY3RzLiAnICtcbiAgICAgICAgJ1RoZSBtdWx0aS1hcmd1bWVudCBzaWduYXR1cmUgb2YgdGYuaW8uZnJvbU1lbW9yeSgpIGhhcyBiZWVuICcgK1xuICAgICAgICAnZGVwcmVjYXRlZCBhbmQgd2lsbCBiZSByZW1vdmVkIGluIGEgZnV0dXJlIHJlbGVhc2UuJyk7XG4gICAgcmV0dXJuIG5ldyBQYXNzdGhyb3VnaExvYWRlcih7XG4gICAgICBtb2RlbFRvcG9sb2d5OiBtb2RlbEFydGlmYWN0cyBhcyB7fSxcbiAgICAgIHdlaWdodFNwZWNzLFxuICAgICAgd2VpZ2h0RGF0YSxcbiAgICAgIHRyYWluaW5nQ29uZmlnXG4gICAgfSk7XG4gIH1cbn1cblxuLyoqXG4gKiBDcmVhdGVzIGFuIElPSGFuZGxlciB0aGF0IHBhc3NlcyBzYXZlZCBtb2RlbCBhcnRpZmFjdHMgdG8gYSBjYWxsYmFjay5cbiAqXG4gKiBgYGBqc1xuICogZnVuY3Rpb24gaGFuZGxlU2F2ZShhcnRpZmFjdHMpIHtcbiAqICAgLy8gLi4uIGRvIHNvbWV0aGluZyB3aXRoIHRoZSBhcnRpZmFjdHMgLi4uXG4gKiAgIHJldHVybiB7bW9kZWxBcnRpZmFjdHNJbmZvOiB7Li4ufSwgLi4ufTtcbiAqIH1cbiAqXG4gKiBjb25zdCBzYXZlUmVzdWx0ID0gbW9kZWwuc2F2ZSh0Zi5pby53aXRoU2F2ZUhhbmRsZXIoaGFuZGxlU2F2ZSkpO1xuICogYGBgXG4gKlxuICogQHBhcmFtIHNhdmVIYW5kbGVyIEEgZnVuY3Rpb24gdGhhdCBhY2NlcHRzIGEgYE1vZGVsQXJ0aWZhY3RzYCBhbmQgcmV0dXJucyBhXG4gKiAgICAgcHJvbWlzZSB0aGF0IHJlc29sdmVzIHRvIGEgYFNhdmVSZXN1bHRgLlxuICovXG5leHBvcnQgZnVuY3Rpb24gd2l0aFNhdmVIYW5kbGVyKFxuICAgIHNhdmVIYW5kbGVyOiAoYXJ0aWZhY3RzOiBNb2RlbEFydGlmYWN0cykgPT5cbiAgICAgICAgUHJvbWlzZTxTYXZlUmVzdWx0Pik6IElPSGFuZGxlciB7XG4gIHJldHVybiBuZXcgUGFzc3Rocm91Z2hTYXZlcihzYXZlSGFuZGxlcik7XG59XG5cbi8qKlxuICogQ3JlYXRlcyBhbiBJT0hhbmRsZXJTeW5jIHRoYXQgcGFzc2VzIHNhdmVkIG1vZGVsIGFydGlmYWN0cyB0byBhIGNhbGxiYWNrLlxuICpcbiAqIGBgYGpzXG4gKiBmdW5jdGlvbiBoYW5kbGVTYXZlKGFydGlmYWN0cykge1xuICogICAvLyAuLi4gZG8gc29tZXRoaW5nIHdpdGggdGhlIGFydGlmYWN0cyAuLi5cbiAqICAgcmV0dXJuIHttb2RlbEFydGlmYWN0c0luZm86IHsuLi59LCAuLi59O1xuICogfVxuICpcbiAqIGNvbnN0IHNhdmVSZXN1bHQgPSBtb2RlbC5zYXZlKHRmLmlvLndpdGhTYXZlSGFuZGxlcihoYW5kbGVTYXZlKSk7XG4gKiBgYGBcbiAqXG4gKiBAcGFyYW0gc2F2ZUhhbmRsZXIgQSBmdW5jdGlvbiB0aGF0IGFjY2VwdHMgYSBgTW9kZWxBcnRpZmFjdHNgIGFuZCByZXR1cm5zIGFcbiAqICAgICBgU2F2ZVJlc3VsdGAuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiB3aXRoU2F2ZUhhbmRsZXJTeW5jKFxuICAgIHNhdmVIYW5kbGVyOiAoYXJ0aWZhY3RzOiBNb2RlbEFydGlmYWN0cykgPT4gU2F2ZVJlc3VsdCk6IElPSGFuZGxlclN5bmMge1xuICByZXR1cm4gbmV3IFBhc3N0aHJvdWdoU2F2ZXI8U2F2ZVJlc3VsdD4oc2F2ZUhhbmRsZXIpO1xufVxuIl19","/**\n * @license\n * Copyright 2018 Google LLC. All Rights Reserved.\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n * =============================================================================\n */\nimport { convertToTensor } from '../tensor_util_env';\nimport * as util from '../util';\nimport { cast } from './cast';\nimport { matMul } from './mat_mul';\nimport { oneHot } from './one_hot';\nimport { op } from './operation';\nimport { transpose } from './transpose';\n/**\n * Computes the confusion matrix from true labels and predicted labels.\n *\n * ```js\n * const labels = tf.tensor1d([0, 1, 2, 1, 0], 'int32');\n * const predictions = tf.tensor1d([0, 2, 2, 1, 0], 'int32');\n * const numClasses = 3;\n * const out = tf.math.confusionMatrix(labels, predictions, numClasses);\n * out.print();\n * // Expected output matrix:\n * // [[2, 0, 0],\n * // [0, 1, 1],\n * // [0, 0, 1]]\n * ```\n *\n * @param labels The target labels, assumed to be 0-based integers\n * for the classes. The shape is `[numExamples]`, where\n * `numExamples` is the number of examples included.\n * @param predictions The predicted classes, assumed to be\n * 0-based integers for the classes. Must have the same shape as `labels`.\n * @param numClasses Number of all classes, as an integer.\n * Its value must be larger than the largest element in `labels` and\n * `predictions`.\n * @returns The confusion matrix as a int32-type 2D tensor. The value at\n * row `r` and column `c` is the number of times examples of actual class\n * `r` were predicted as class `c`.\n *\n * @doc {heading: 'Operations', subheading: 'Evaluation'}\n */\nexport function confusionMatrix_(labels, predictions, numClasses) {\n const $labels = convertToTensor(labels, 'labels', 'confusionMatrix');\n const $predictions = convertToTensor(predictions, 'predictions', 'confusionMatrix');\n util.assert(numClasses == null || numClasses > 0 && Number.isInteger(numClasses), () => `If provided, numClasses must be a positive integer, ` +\n `but got ${numClasses}`);\n util.assert($labels.rank === 1, () => `Expected the rank of labels to be 1, but got ${$labels.rank}`);\n util.assert($predictions.rank === 1, () => `Expected the rank of predictions to be 1, ` +\n `but got ${$predictions.rank}`);\n util.assert($labels.shape[0] === $predictions.shape[0], () => `Mismatch in the number of examples: ` +\n `${$labels.shape[0]} vs. ${$predictions.shape[0]}. ` +\n `Labels and predictions should have the same number of elements.`);\n util.assert(numClasses > 0 && Number.isInteger(numClasses), () => `numClasses is required to be a positive integer, but got ` +\n `${numClasses}`);\n // TODO(cais): In the future, if oneHot supports tensors inputs for\n // `numClasses`, `confusionMatrix` can make `numClasses` optional.\n const oneHotLabels = oneHot(cast($labels, 'int32'), numClasses);\n const oneHotPredictions = oneHot(cast($predictions, 'int32'), numClasses);\n const oneHotLabelsT = transpose(oneHotLabels);\n const product = matMul(oneHotLabelsT, oneHotPredictions);\n return cast(product, 'int32');\n}\nexport const confusionMatrix = op({ confusionMatrix_ });\n//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY29uZnVzaW9uX21hdHJpeC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uLy4uL3RmanMtY29yZS9zcmMvb3BzL2NvbmZ1c2lvbl9tYXRyaXgudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUE7Ozs7Ozs7Ozs7Ozs7OztHQWVHO0FBR0gsT0FBTyxFQUFDLGVBQWUsRUFBQyxNQUFNLG9CQUFvQixDQUFDO0FBRW5ELE9BQU8sS0FBSyxJQUFJLE1BQU0sU0FBUyxDQUFDO0FBRWhDLE9BQU8sRUFBQyxJQUFJLEVBQUMsTUFBTSxRQUFRLENBQUM7QUFDNUIsT0FBTyxFQUFDLE1BQU0sRUFBQyxNQUFNLFdBQVcsQ0FBQztBQUNqQyxPQUFPLEVBQUMsTUFBTSxFQUFDLE1BQU0sV0FBVyxDQUFDO0FBQ2pDLE9BQU8sRUFBQyxFQUFFLEVBQUMsTUFBTSxhQUFhLENBQUM7QUFDL0IsT0FBTyxFQUFDLFNBQVMsRUFBQyxNQUFNLGFBQWEsQ0FBQztBQUV0Qzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7OztHQTRCRztBQUNILE1BQU0sVUFBVSxnQkFBZ0IsQ0FDNUIsTUFBMkIsRUFBRSxXQUFnQyxFQUM3RCxVQUFrQjtJQUNwQixNQUFNLE9BQU8sR0FBRyxlQUFlLENBQUMsTUFBTSxFQUFFLFFBQVEsRUFBRSxpQkFBaUIsQ0FBQyxDQUFDO0lBQ3JFLE1BQU0sWUFBWSxHQUNkLGVBQWUsQ0FBQyxXQUFXLEVBQUUsYUFBYSxFQUFFLGlCQUFpQixDQUFDLENBQUM7SUFFbkUsSUFBSSxDQUFDLE1BQU0sQ0FDUCxVQUFVLElBQUksSUFBSSxJQUFJLFVBQVUsR0FBRyxDQUFDLElBQUksTUFBTSxDQUFDLFNBQVMsQ0FBQyxVQUFVLENBQUMsRUFDcEUsR0FBRyxFQUFFLENBQUMsc0RBQXNEO1FBQ3hELFdBQVcsVUFBVSxFQUFFLENBQUMsQ0FBQztJQUNqQyxJQUFJLENBQUMsTUFBTSxDQUNQLE9BQU8sQ0FBQyxJQUFJLEtBQUssQ0FBQyxFQUNsQixHQUFHLEVBQUUsQ0FBQyxnREFBZ0QsT0FBTyxDQUFDLElBQUksRUFBRSxDQUFDLENBQUM7SUFDMUUsSUFBSSxDQUFDLE1BQU0sQ0FDUCxZQUFZLENBQUMsSUFBSSxLQUFLLENBQUMsRUFDdkIsR0FBRyxFQUFFLENBQUMsNENBQTRDO1FBQzlDLFdBQVcsWUFBWSxDQUFDLElBQUksRUFBRSxDQUFDLENBQUM7SUFDeEMsSUFBSSxDQUFDLE1BQU0sQ0FDUCxPQUFPLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQyxLQUFLLFlBQVksQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDLEVBQzFDLEdBQUcsRUFBRSxDQUFDLHNDQUFzQztRQUN4QyxHQUFHLE9BQU8sQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDLFFBQVEsWUFBWSxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUMsSUFBSTtRQUNwRCxpRUFBaUUsQ0FBQyxDQUFDO0lBQzNFLElBQUksQ0FBQyxNQUFNLENBQ1AsVUFBVSxHQUFHLENBQUMsSUFBSSxNQUFNLENBQUMsU0FBUyxDQUFDLFVBQVUsQ0FBQyxFQUM5QyxHQUFHLEVBQUUsQ0FBQywyREFBMkQ7UUFDN0QsR0FBRyxVQUFVLEVBQUUsQ0FBQyxDQUFDO0lBQ3pCLG1FQUFtRTtJQUNuRSxvRUFBb0U7SUFFcEUsTUFBTSxZQUFZLEdBQUcsTUFBTSxDQUFDLElBQUksQ0FBQyxPQUFPLEVBQUUsT0FBTyxDQUFDLEVBQUUsVUFBVSxDQUFhLENBQUM7SUFDNUUsTUFBTSxpQkFBaUIsR0FDbkIsTUFBTSxDQUFDLElBQUksQ0FBQyxZQUFZLEVBQUUsT0FBTyxDQUFDLEVBQUUsVUFBVSxDQUFhLENBQUM7SUFDaEUsTUFBTSxhQUFhLEdBQWEsU0FBUyxDQUFDLFlBQVksQ0FBQyxDQUFDO0lBQ3hELE1BQU0sT0FBTyxHQUFhLE1BQU0sQ0FBQyxhQUFhLEVBQUUsaUJBQWlCLENBQUMsQ0FBQztJQUNuRSxPQUFPLElBQUksQ0FBQyxPQUFPLEVBQUUsT0FBTyxDQUFDLENBQUM7QUFDaEMsQ0FBQztBQUVELE1BQU0sQ0FBQyxNQUFNLGVBQWUsR0FBRyxFQUFFLENBQUMsRUFBQyxnQkFBZ0IsRUFBQyxDQUFDLENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyIvKipcbiAqIEBsaWNlbnNlXG4gKiBDb3B5cmlnaHQgMjAxOCBHb29nbGUgTExDLiBBbGwgUmlnaHRzIFJlc2VydmVkLlxuICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlIFwiTGljZW5zZVwiKTtcbiAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS5cbiAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdFxuICpcbiAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMFxuICpcbiAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmVcbiAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuIFwiQVMgSVNcIiBCQVNJUyxcbiAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLlxuICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZFxuICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuXG4gKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuICovXG5cbmltcG9ydCB7VGVuc29yMUQsIFRlbnNvcjJEfSBmcm9tICcuLi90ZW5zb3InO1xuaW1wb3J0IHtjb252ZXJ0VG9UZW5zb3J9IGZyb20gJy4uL3RlbnNvcl91dGlsX2Vudic7XG5pbXBvcnQge1RlbnNvckxpa2V9IGZyb20gJy4uL3R5cGVzJztcbmltcG9ydCAqIGFzIHV0aWwgZnJvbSAnLi4vdXRpbCc7XG5cbmltcG9ydCB7Y2FzdH0gZnJvbSAnLi9jYXN0JztcbmltcG9ydCB7bWF0TXVsfSBmcm9tICcuL21hdF9tdWwnO1xuaW1wb3J0IHtvbmVIb3R9IGZyb20gJy4vb25lX2hvdCc7XG5pbXBvcnQge29wfSBmcm9tICcuL29wZXJhdGlvbic7XG5pbXBvcnQge3RyYW5zcG9zZX0gZnJvbSAnLi90cmFuc3Bvc2UnO1xuXG4vKipcbiAqIENvbXB1dGVzIHRoZSBjb25mdXNpb24gbWF0cml4IGZyb20gdHJ1ZSBsYWJlbHMgYW5kIHByZWRpY3RlZCBsYWJlbHMuXG4gKlxuICogYGBganNcbiAqIGNvbnN0IGxhYmVscyA9IHRmLnRlbnNvcjFkKFswLCAxLCAyLCAxLCAwXSwgJ2ludDMyJyk7XG4gKiBjb25zdCBwcmVkaWN0aW9ucyA9IHRmLnRlbnNvcjFkKFswLCAyLCAyLCAxLCAwXSwgJ2ludDMyJyk7XG4gKiBjb25zdCBudW1DbGFzc2VzID0gMztcbiAqIGNvbnN0IG91dCA9IHRmLm1hdGguY29uZnVzaW9uTWF0cml4KGxhYmVscywgcHJlZGljdGlvbnMsIG51bUNsYXNzZXMpO1xuICogb3V0LnByaW50KCk7XG4gKiAvLyBFeHBlY3RlZCBvdXRwdXQgbWF0cml4OlxuICogLy8gW1syLCAwLCAwXSxcbiAqIC8vICBbMCwgMSwgMV0sXG4gKiAvLyAgWzAsIDAsIDFdXVxuICogYGBgXG4gKlxuICogQHBhcmFtIGxhYmVscyBUaGUgdGFyZ2V0IGxhYmVscywgYXNzdW1lZCB0byBiZSAwLWJhc2VkIGludGVnZXJzXG4gKiAgIGZvciB0aGUgY2xhc3Nlcy4gVGhlIHNoYXBlIGlzIGBbbnVtRXhhbXBsZXNdYCwgd2hlcmVcbiAqICAgYG51bUV4YW1wbGVzYCBpcyB0aGUgbnVtYmVyIG9mIGV4YW1wbGVzIGluY2x1ZGVkLlxuICogQHBhcmFtIHByZWRpY3Rpb25zIFRoZSBwcmVkaWN0ZWQgY2xhc3NlcywgYXNzdW1lZCB0byBiZVxuICogICAwLWJhc2VkIGludGVnZXJzIGZvciB0aGUgY2xhc3Nlcy4gTXVzdCBoYXZlIHRoZSBzYW1lIHNoYXBlIGFzIGBsYWJlbHNgLlxuICogQHBhcmFtIG51bUNsYXNzZXMgTnVtYmVyIG9mIGFsbCBjbGFzc2VzLCBhcyBhbiBpbnRlZ2VyLlxuICogICBJdHMgdmFsdWUgbXVzdCBiZSBsYXJnZXIgdGhhbiB0aGUgbGFyZ2VzdCBlbGVtZW50IGluIGBsYWJlbHNgIGFuZFxuICogICBgcHJlZGljdGlvbnNgLlxuICogQHJldHVybnMgVGhlIGNvbmZ1c2lvbiBtYXRyaXggYXMgYSBpbnQzMi10eXBlIDJEIHRlbnNvci4gVGhlIHZhbHVlIGF0XG4gKiAgIHJvdyBgcmAgYW5kIGNvbHVtbiBgY2AgaXMgdGhlIG51bWJlciBvZiB0aW1lcyBleGFtcGxlcyBvZiBhY3R1YWwgY2xhc3NcbiAqICAgYHJgIHdlcmUgcHJlZGljdGVkIGFzIGNsYXNzIGBjYC5cbiAqXG4gKiBAZG9jIHtoZWFkaW5nOiAnT3BlcmF0aW9ucycsIHN1YmhlYWRpbmc6ICdFdmFsdWF0aW9uJ31cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGNvbmZ1c2lvbk1hdHJpeF8oXG4gICAgbGFiZWxzOiBUZW5zb3IxRHxUZW5zb3JMaWtlLCBwcmVkaWN0aW9uczogVGVuc29yMUR8VGVuc29yTGlrZSxcbiAgICBudW1DbGFzc2VzOiBudW1iZXIpOiBUZW5zb3IyRCB7XG4gIGNvbnN0ICRsYWJlbHMgPSBjb252ZXJ0VG9UZW5zb3IobGFiZWxzLCAnbGFiZWxzJywgJ2NvbmZ1c2lvbk1hdHJpeCcpO1xuICBjb25zdCAkcHJlZGljdGlvbnMgPVxuICAgICAgY29udmVydFRvVGVuc29yKHByZWRpY3Rpb25zLCAncHJlZGljdGlvbnMnLCAnY29uZnVzaW9uTWF0cml4Jyk7XG5cbiAgdXRpbC5hc3NlcnQoXG4gICAgICBudW1DbGFzc2VzID09IG51bGwgfHwgbnVtQ2xhc3NlcyA+IDAgJiYgTnVtYmVyLmlzSW50ZWdlcihudW1DbGFzc2VzKSxcbiAgICAgICgpID0+IGBJZiBwcm92aWRlZCwgbnVtQ2xhc3NlcyBtdXN0IGJlIGEgcG9zaXRpdmUgaW50ZWdlciwgYCArXG4gICAgICAgICAgYGJ1dCBnb3QgJHtudW1DbGFzc2VzfWApO1xuICB1dGlsLmFzc2VydChcbiAgICAgICRsYWJlbHMucmFuayA9PT0gMSxcbiAgICAgICgpID0+IGBFeHBlY3RlZCB0aGUgcmFuayBvZiBsYWJlbHMgdG8gYmUgMSwgYnV0IGdvdCAkeyRsYWJlbHMucmFua31gKTtcbiAgdXRpbC5hc3NlcnQoXG4gICAgICAkcHJlZGljdGlvbnMucmFuayA9PT0gMSxcbiAgICAgICgpID0+IGBFeHBlY3RlZCB0aGUgcmFuayBvZiBwcmVkaWN0aW9ucyB0byBiZSAxLCBgICtcbiAgICAgICAgICBgYnV0IGdvdCAkeyRwcmVkaWN0aW9ucy5yYW5rfWApO1xuICB1dGlsLmFzc2VydChcbiAgICAgICRsYWJlbHMuc2hhcGVbMF0gPT09ICRwcmVkaWN0aW9ucy5zaGFwZVswXSxcbiAgICAgICgpID0+IGBNaXNtYXRjaCBpbiB0aGUgbnVtYmVyIG9mIGV4YW1wbGVzOiBgICtcbiAgICAgICAgICBgJHskbGFiZWxzLnNoYXBlWzBdfSB2cy4gJHskcHJlZGljdGlvbnMuc2hhcGVbMF19LiBgICtcbiAgICAgICAgICBgTGFiZWxzIGFuZCBwcmVkaWN0aW9ucyBzaG91bGQgaGF2ZSB0aGUgc2FtZSBudW1iZXIgb2YgZWxlbWVudHMuYCk7XG4gIHV0aWwuYXNzZXJ0KFxuICAgICAgbnVtQ2xhc3NlcyA+IDAgJiYgTnVtYmVyLmlzSW50ZWdlcihudW1DbGFzc2VzKSxcbiAgICAgICgpID0+IGBudW1DbGFzc2VzIGlzIHJlcXVpcmVkIHRvIGJlIGEgcG9zaXRpdmUgaW50ZWdlciwgYnV0IGdvdCBgICtcbiAgICAgICAgICBgJHtudW1DbGFzc2VzfWApO1xuICAvLyBUT0RPKGNhaXMpOiBJbiB0aGUgZnV0dXJlLCBpZiBvbmVIb3Qgc3VwcG9ydHMgdGVuc29ycyBpbnB1dHMgZm9yXG4gIC8vICAgYG51bUNsYXNzZXNgLCBgY29uZnVzaW9uTWF0cml4YCBjYW4gbWFrZSBgbnVtQ2xhc3Nlc2Agb3B0aW9uYWwuXG5cbiAgY29uc3Qgb25lSG90TGFiZWxzID0gb25lSG90KGNhc3QoJGxhYmVscywgJ2ludDMyJyksIG51bUNsYXNzZXMpIGFzIFRlbnNvcjJEO1xuICBjb25zdCBvbmVIb3RQcmVkaWN0aW9ucyA9XG4gICAgICBvbmVIb3QoY2FzdCgkcHJlZGljdGlvbnMsICdpbnQzMicpLCBudW1DbGFzc2VzKSBhcyBUZW5zb3IyRDtcbiAgY29uc3Qgb25lSG90TGFiZWxzVDogVGVuc29yMkQgPSB0cmFuc3Bvc2Uob25lSG90TGFiZWxzKTtcbiAgY29uc3QgcHJvZHVjdDogVGVuc29yMkQgPSBtYXRNdWwob25lSG90TGFiZWxzVCwgb25lSG90UHJlZGljdGlvbnMpO1xuICByZXR1cm4gY2FzdChwcm9kdWN0LCAnaW50MzInKTtcbn1cblxuZXhwb3J0IGNvbnN0IGNvbmZ1c2lvbk1hdHJpeCA9IG9wKHtjb25mdXNpb25NYXRyaXhffSk7XG4iXX0=","/**\n * @license\n * Copyright 2019 Google LLC. All Rights Reserved.\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n * =============================================================================\n */\nimport { ENGINE } from '../engine';\nimport { env } from '../environment';\nimport { FromPixels } from '../kernel_names';\nimport { getKernel } from '../kernel_registry';\nimport { Tensor } from '../tensor';\nimport { convertToTensor } from '../tensor_util_env';\nimport { cast } from './cast';\nimport { op } from './operation';\nimport { tensor3d } from './tensor3d';\nlet fromPixels2DContext;\n/**\n * Creates a `tf.Tensor` from an image.\n *\n * ```js\n * const image = new ImageData(1, 1);\n * image.data[0] = 100;\n * image.data[1] = 150;\n * image.data[2] = 200;\n * image.data[3] = 255;\n *\n * tf.browser.fromPixels(image).print();\n * ```\n *\n * @param pixels The input image to construct the tensor from. The\n * supported image types are all 4-channel. You can also pass in an image\n * object with following attributes:\n * `{data: Uint8Array; width: number; height: number}`\n * @param numChannels The number of channels of the output tensor. A\n * numChannels value less than 4 allows you to ignore channels. Defaults to\n * 3 (ignores alpha channel of input image).\n *\n * @returns A Tensor3D with the shape `[height, width, numChannels]`.\n *\n * Note: fromPixels can be lossy in some cases, same image may result in\n * slightly different tensor values, if rendered by different rendering\n * engines. This means that results from different browsers, or even same\n * browser with CPU and GPU rendering engines can be different. See discussion\n * in details:\n * https://github.com/tensorflow/tfjs/issues/5482\n *\n * @doc {heading: 'Browser', namespace: 'browser', ignoreCI: true}\n */\nfunction fromPixels_(pixels, numChannels = 3) {\n // Sanity checks.\n if (numChannels > 4) {\n throw new Error('Cannot construct Tensor with more than 4 channels from pixels.');\n }\n if (pixels == null) {\n throw new Error('pixels passed to tf.browser.fromPixels() can not be null');\n }\n let isPixelData = false;\n let isImageData = false;\n let isVideo = false;\n let isImage = false;\n let isCanvasLike = false;\n let isImageBitmap = false;\n if (pixels.data instanceof Uint8Array) {\n isPixelData = true;\n }\n else if (typeof (ImageData) !== 'undefined' && pixels instanceof ImageData) {\n isImageData = true;\n }\n else if (typeof (HTMLVideoElement) !== 'undefined' &&\n pixels instanceof HTMLVideoElement) {\n isVideo = true;\n }\n else if (typeof (HTMLImageElement) !== 'undefined' &&\n pixels instanceof HTMLImageElement) {\n isImage = true;\n // tslint:disable-next-line: no-any\n }\n else if (pixels.getContext != null) {\n isCanvasLike = true;\n }\n else if (typeof (ImageBitmap) !== 'undefined' && pixels instanceof ImageBitmap) {\n isImageBitmap = true;\n }\n else {\n throw new Error('pixels passed to tf.browser.fromPixels() must be either an ' +\n `HTMLVideoElement, HTMLImageElement, HTMLCanvasElement, ImageData ` +\n `in browser, or OffscreenCanvas, ImageData in webworker` +\n ` or {data: Uint32Array, width: number, height: number}, ` +\n `but was ${pixels.constructor.name}`);\n }\n // If the current backend has 'FromPixels' registered, it has a more\n // efficient way of handling pixel uploads, so we call that.\n const kernel = getKernel(FromPixels, ENGINE.backendName);\n if (kernel != null) {\n const inputs = { pixels };\n const attrs = { numChannels };\n return ENGINE.runKernel(FromPixels, inputs, attrs);\n }\n const [width, height] = isVideo ?\n [\n pixels.videoWidth,\n pixels.videoHeight\n ] :\n [pixels.width, pixels.height];\n let vals;\n if (isCanvasLike) {\n vals =\n // tslint:disable-next-line:no-any\n pixels.getContext('2d').getImageData(0, 0, width, height).data;\n }\n else if (isImageData || isPixelData) {\n vals = pixels.data;\n }\n else if (isImage || isVideo || isImageBitmap) {\n if (fromPixels2DContext == null) {\n if (typeof document === 'undefined') {\n if (typeof OffscreenCanvas !== 'undefined' &&\n typeof OffscreenCanvasRenderingContext2D !== 'undefined') {\n // @ts-ignore\n fromPixels2DContext = new OffscreenCanvas(1, 1).getContext('2d');\n }\n else {\n throw new Error('Cannot parse input in current context. ' +\n 'Reason: OffscreenCanvas Context2D rendering is not supported.');\n }\n }\n else {\n fromPixels2DContext =\n document.createElement('canvas').getContext('2d', { willReadFrequently: true });\n }\n }\n fromPixels2DContext.canvas.width = width;\n fromPixels2DContext.canvas.height = height;\n fromPixels2DContext.drawImage(pixels, 0, 0, width, height);\n vals = fromPixels2DContext.getImageData(0, 0, width, height).data;\n }\n let values;\n if (numChannels === 4) {\n values = new Int32Array(vals);\n }\n else {\n const numPixels = width * height;\n values = new Int32Array(numPixels * numChannels);\n for (let i = 0; i < numPixels; i++) {\n for (let channel = 0; channel < numChannels; ++channel) {\n values[i * numChannels + channel] = vals[i * 4 + channel];\n }\n }\n }\n const outShape = [height, width, numChannels];\n return tensor3d(values, outShape, 'int32');\n}\n// Helper functions for |fromPixelsAsync| to check whether the input can\n// be wrapped into imageBitmap.\nfunction isPixelData(pixels) {\n return (pixels != null) && (pixels.data instanceof Uint8Array);\n}\nfunction isImageBitmapFullySupported() {\n return typeof window !== 'undefined' &&\n typeof (ImageBitmap) !== 'undefined' &&\n window.hasOwnProperty('createImageBitmap');\n}\nfunction isNonEmptyPixels(pixels) {\n return pixels != null && pixels.width !== 0 && pixels.height !== 0;\n}\nfunction canWrapPixelsToImageBitmap(pixels) {\n return isImageBitmapFullySupported() && !(pixels instanceof ImageBitmap) &&\n isNonEmptyPixels(pixels) && !isPixelData(pixels);\n}\n/**\n * Creates a `tf.Tensor` from an image in async way.\n *\n * ```js\n * const image = new ImageData(1, 1);\n * image.data[0] = 100;\n * image.data[1] = 150;\n * image.data[2] = 200;\n * image.data[3] = 255;\n *\n * (await tf.browser.fromPixelsAsync(image)).print();\n * ```\n * This API is the async version of fromPixels. The API will first\n * check |WRAP_TO_IMAGEBITMAP| flag, and try to wrap the input to\n * imageBitmap if the flag is set to true.\n *\n * @param pixels The input image to construct the tensor from. The\n * supported image types are all 4-channel. You can also pass in an image\n * object with following attributes:\n * `{data: Uint8Array; width: number; height: number}`\n * @param numChannels The number of channels of the output tensor. A\n * numChannels value less than 4 allows you to ignore channels. Defaults to\n * 3 (ignores alpha channel of input image).\n *\n * @doc {heading: 'Browser', namespace: 'browser', ignoreCI: true}\n */\nexport async function fromPixelsAsync(pixels, numChannels = 3) {\n let inputs = null;\n // Check whether the backend needs to wrap |pixels| to imageBitmap and\n // whether |pixels| can be wrapped to imageBitmap.\n if (env().getBool('WRAP_TO_IMAGEBITMAP') &&\n canWrapPixelsToImageBitmap(pixels)) {\n // Force the imageBitmap creation to not do any premultiply alpha\n // ops.\n let imageBitmap;\n try {\n // wrap in try-catch block, because createImageBitmap may not work\n // properly in some browsers, e.g.\n // https://bugzilla.mozilla.org/show_bug.cgi?id=1335594\n // tslint:disable-next-line: no-any\n imageBitmap = await createImageBitmap(pixels, { premultiplyAlpha: 'none' });\n }\n catch (e) {\n imageBitmap = null;\n }\n // createImageBitmap will clip the source size.\n // In some cases, the input will have larger size than its content.\n // E.g. new Image(10, 10) but with 1 x 1 content. Using\n // createImageBitmap will clip the size from 10 x 10 to 1 x 1, which\n // is not correct. We should avoid wrapping such resouce to\n // imageBitmap.\n if (imageBitmap != null && imageBitmap.width === pixels.width &&\n imageBitmap.height === pixels.height) {\n inputs = imageBitmap;\n }\n else {\n inputs = pixels;\n }\n }\n else {\n inputs = pixels;\n }\n return fromPixels_(inputs, numChannels);\n}\n/**\n * Draws a `tf.Tensor` of pixel values to a byte array or optionally a\n * canvas.\n *\n * When the dtype of the input is 'float32', we assume values in the range\n * [0-1]. Otherwise, when input is 'int32', we assume values in the range\n * [0-255].\n *\n * Returns a promise that resolves when the canvas has been drawn to.\n *\n * @param img A rank-2 tensor with shape `[height, width]`, or a rank-3 tensor\n * of shape `[height, width, numChannels]`. If rank-2, draws grayscale. If\n * rank-3, must have depth of 1, 3 or 4. When depth of 1, draws\n * grayscale. When depth of 3, we draw with the first three components of\n * the depth dimension corresponding to r, g, b and alpha = 1. When depth of\n * 4, all four components of the depth dimension correspond to r, g, b, a.\n * @param canvas The canvas to draw to.\n *\n * @doc {heading: 'Browser', namespace: 'browser'}\n */\nexport async function toPixels(img, canvas) {\n let $img = convertToTensor(img, 'img', 'toPixels');\n if (!(img instanceof Tensor)) {\n // Assume int32 if user passed a native array.\n const originalImgTensor = $img;\n $img = cast(originalImgTensor, 'int32');\n originalImgTensor.dispose();\n }\n if ($img.rank !== 2 && $img.rank !== 3) {\n throw new Error(`toPixels only supports rank 2 or 3 tensors, got rank ${$img.rank}.`);\n }\n const [height, width] = $img.shape.slice(0, 2);\n const depth = $img.rank === 2 ? 1 : $img.shape[2];\n if (depth > 4 || depth === 2) {\n throw new Error(`toPixels only supports depth of size ` +\n `1, 3 or 4 but got ${depth}`);\n }\n if ($img.dtype !== 'float32' && $img.dtype !== 'int32') {\n throw new Error(`Unsupported type for toPixels: ${$img.dtype}.` +\n ` Please use float32 or int32 tensors.`);\n }\n const data = await $img.data();\n const multiplier = $img.dtype === 'float32' ? 255 : 1;\n const bytes = new Uint8ClampedArray(width * height * 4);\n for (let i = 0; i < height * width; ++i) {\n const rgba = [0, 0, 0, 255];\n for (let d = 0; d < depth; d++) {\n const value = data[i * depth + d];\n if ($img.dtype === 'float32') {\n if (value < 0 || value > 1) {\n throw new Error(`Tensor values for a float32 Tensor must be in the ` +\n `range [0 - 1] but encountered ${value}.`);\n }\n }\n else if ($img.dtype === 'int32') {\n if (value < 0 || value > 255) {\n throw new Error(`Tensor values for a int32 Tensor must be in the ` +\n `range [0 - 255] but encountered ${value}.`);\n }\n }\n if (depth === 1) {\n rgba[0] = value * multiplier;\n rgba[1] = value * multiplier;\n rgba[2] = value * multiplier;\n }\n else {\n rgba[d] = value * multiplier;\n }\n }\n const j = i * 4;\n bytes[j + 0] = Math.round(rgba[0]);\n bytes[j + 1] = Math.round(rgba[1]);\n bytes[j + 2] = Math.round(rgba[2]);\n bytes[j + 3] = Math.round(rgba[3]);\n }\n if (canvas != null) {\n canvas.width = width;\n canvas.height = height;\n const ctx = canvas.getContext('2d');\n const imageData = new ImageData(bytes, width, height);\n ctx.putImageData(imageData, 0, 0);\n }\n if ($img !== img) {\n $img.dispose();\n }\n return bytes;\n}\nexport const fromPixels = op({ fromPixels_ });\n//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYnJvd3Nlci5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uLy4uL3RmanMtY29yZS9zcmMvb3BzL2Jyb3dzZXIudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUE7Ozs7Ozs7Ozs7Ozs7OztHQWVHO0FBRUgsT0FBTyxFQUFDLE1BQU0sRUFBQyxNQUFNLFdBQVcsQ0FBQztBQUNqQyxPQUFPLEVBQUMsR0FBRyxFQUFDLE1BQU0sZ0JBQWdCLENBQUM7QUFDbkMsT0FBTyxFQUFDLFVBQVUsRUFBb0MsTUFBTSxpQkFBaUIsQ0FBQztBQUM5RSxPQUFPLEVBQUMsU0FBUyxFQUFlLE1BQU0sb0JBQW9CLENBQUM7QUFDM0QsT0FBTyxFQUFDLE1BQU0sRUFBcUIsTUFBTSxXQUFXLENBQUM7QUFFckQsT0FBTyxFQUFDLGVBQWUsRUFBQyxNQUFNLG9CQUFvQixDQUFDO0FBR25ELE9BQU8sRUFBQyxJQUFJLEVBQUMsTUFBTSxRQUFRLENBQUM7QUFDNUIsT0FBTyxFQUFDLEVBQUUsRUFBQyxNQUFNLGFBQWEsQ0FBQztBQUMvQixPQUFPLEVBQUMsUUFBUSxFQUFDLE1BQU0sWUFBWSxDQUFDO0FBRXBDLElBQUksbUJBQTZDLENBQUM7QUFFbEQ7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7R0ErQkc7QUFDSCxTQUFTLFdBQVcsQ0FDaEIsTUFDNEIsRUFDNUIsV0FBVyxHQUFHLENBQUM7SUFDakIsaUJBQWlCO0lBQ2pCLElBQUksV0FBVyxHQUFHLENBQUMsRUFBRTtRQUNuQixNQUFNLElBQUksS0FBSyxDQUNYLGdFQUFnRSxDQUFDLENBQUM7S0FDdkU7SUFDRCxJQUFJLE1BQU0sSUFBSSxJQUFJLEVBQUU7UUFDbEIsTUFBTSxJQUFJLEtBQUssQ0FBQywwREFBMEQsQ0FBQyxDQUFDO0tBQzdFO0lBQ0QsSUFBSSxXQUFXLEdBQUcsS0FBSyxDQUFDO0lBQ3hCLElBQUksV0FBVyxHQUFHLEtBQUssQ0FBQztJQUN4QixJQUFJLE9BQU8sR0FB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b250ZW50IjpbIi8qKlxuICogQGxpY2Vuc2VcbiAqIENvcHlyaWdodCAyMDE5IEdvb2dsZSBMTEMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuXG4gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgXCJMaWNlbnNlXCIpO1xuICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLlxuICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0XG4gKlxuICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wXG4gKlxuICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZVxuICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gXCJBUyBJU1wiIEJBU0lTLFxuICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuXG4gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kXG4gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS5cbiAqID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4gKi9cblxuaW1wb3J0IHtFTkdJTkV9IGZyb20gJy4uL2VuZ2luZSc7XG5pbXBvcnQge2Vudn0gZnJvbSAnLi4vZW52aXJvbm1lbnQnO1xuaW1wb3J0IHtGcm9tUGl4ZWxzLCBGcm9tUGl4ZWxzQXR0cnMsIEZyb21QaXhlbHNJbnB1dHN9IGZyb20gJy4uL2tlcm5lbF9uYW1lcyc7XG5pbXBvcnQge2dldEtlcm5lbCwgTmFtZWRBdHRyTWFwfSBmcm9tICcuLi9rZXJuZWxfcmVnaXN0cnknO1xuaW1wb3J0IHtUZW5zb3IsIFRlbnNvcjJELCBUZW5zb3IzRH0gZnJvbSAnLi4vdGVuc29yJztcbmltcG9ydCB7TmFtZWRUZW5zb3JNYXB9IGZyb20gJy4uL3RlbnNvcl90eXBlcyc7XG5pbXBvcnQge2NvbnZlcnRUb1RlbnNvcn0gZnJvbSAnLi4vdGVuc29yX3V0aWxfZW52JztcbmltcG9ydCB7UGl4ZWxEYXRhLCBUZW5zb3JMaWtlfSBmcm9tICcuLi90eXBlcyc7XG5cbmltcG9ydCB7Y2FzdH0gZnJvbSAnLi9jYXN0JztcbmltcG9ydCB7b3B9IGZyb20gJy4vb3BlcmF0aW9uJztcbmltcG9ydCB7dGVuc29yM2R9IGZyb20gJy4vdGVuc29yM2QnO1xuXG5sZXQgZnJvbVBpeGVsczJEQ29udGV4dDogQ2FudmFzUmVuZGVyaW5nQ29udGV4dDJEO1xuXG4vKipcbiAqIENyZWF0ZXMgYSBgdGYuVGVuc29yYCBmcm9tIGFuIGltYWdlLlxuICpcbiAqIGBgYGpzXG4gKiBjb25zdCBpbWFnZSA9IG5ldyBJbWFnZURhdGEoMSwgMSk7XG4gKiBpbWFnZS5kYXRhWzBdID0gMTAwO1xuICogaW1hZ2UuZGF0YVsxXSA9IDE1MDtcbiAqIGltYWdlLmRhdGFbMl0gPSAyMDA7XG4gKiBpbWFnZS5kYXRhWzNdID0gMjU1O1xuICpcbiAqIHRmLmJyb3dzZXIuZnJvbVBpeGVscyhpbWFnZSkucHJpbnQoKTtcbiAqIGBgYFxuICpcbiAqIEBwYXJhbSBwaXhlbHMgVGhlIGlucHV0IGltYWdlIHRvIGNvbnN0cnVjdCB0aGUgdGVuc29yIGZyb20uIFRoZVxuICogc3VwcG9ydGVkIGltYWdlIHR5cGVzIGFyZSBhbGwgNC1jaGFubmVsLiBZb3UgY2FuIGFsc28gcGFzcyBpbiBhbiBpbWFnZVxuICogb2JqZWN0IHdpdGggZm9sbG93aW5nIGF0dHJpYnV0ZXM6XG4gKiBge2RhdGE6IFVpbnQ4QXJyYXk7IHdpZHRoOiBudW1iZXI7IGhlaWdodDogbnVtYmVyfWBcbiAqIEBwYXJhbSBudW1DaGFubmVscyBUaGUgbnVtYmVyIG9mIGNoYW5uZWxzIG9mIHRoZSBvdXRwdXQgdGVuc29yLiBBXG4gKiBudW1DaGFubmVscyB2YWx1ZSBsZXNzIHRoYW4gNCBhbGxvd3MgeW91IHRvIGlnbm9yZSBjaGFubmVscy4gRGVmYXVsdHMgdG9cbiAqIDMgKGlnbm9yZXMgYWxwaGEgY2hhbm5lbCBvZiBpbnB1dCBpbWFnZSkuXG4gKlxuICogQHJldHVybnMgQSBUZW5zb3IzRCB3aXRoIHRoZSBzaGFwZSBgW2hlaWdodCwgd2lkdGgsIG51bUNoYW5uZWxzXWAuXG4gKlxuICogTm90ZTogZnJvbVBpeGVscyBjYW4gYmUgbG9zc3kgaW4gc29tZSBjYXNlcywgc2FtZSBpbWFnZSBtYXkgcmVzdWx0IGluXG4gKiBzbGlnaHRseSBkaWZmZXJlbnQgdGVuc29yIHZhbHVlcywgaWYgcmVuZGVyZWQgYnkgZGlmZmVyZW50IHJlbmRlcmluZ1xuICogZW5naW5lcy4gVGhpcyBtZWFucyB0aGF0IHJlc3VsdHMgZnJvbSBkaWZmZXJlbnQgYnJvd3NlcnMsIG9yIGV2ZW4gc2FtZVxuICogYnJvd3NlciB3aXRoIENQVSBhbmQgR1BVIHJlbmRlcmluZyBlbmdpbmVzIGNhbiBiZSBkaWZmZXJlbnQuIFNlZSBkaXNjdXNzaW9uXG4gKiBpbiBkZXRhaWxzOlxuICogaHR0cHM6Ly9naXRodWIuY29tL3RlbnNvcmZsb3cvdGZqcy9pc3N1ZXMvNTQ4MlxuICpcbiAqIEBkb2Mge2hlYWRpbmc6ICdCcm93c2VyJywgbmFtZXNwYWNlOiAnYnJvd3NlcicsIGlnbm9yZUNJOiB0cnVlfVxuICovXG5mdW5jdGlvbiBmcm9tUGl4ZWxzXyhcbiAgICBwaXhlbHM6IFBpeGVsRGF0YXxJbWFnZURhdGF8SFRNTEltYWdlRWxlbWVudHxIVE1MQ2FudmFzRWxlbWVudHxcbiAgICBIVE1MVmlkZW9FbGVtZW50fEltYWdlQml0bWFwLFxuICAgIG51bUNoYW5uZWxzID0gMyk6IFRlbnNvcjNEIHtcbiAgLy8gU2FuaXR5IGNoZWNrcy5cbiAgaWYgKG51bUNoYW5uZWxzID4gNCkge1xuICAgIHRocm93IG5ldyBFcnJvcihcbiAgICAgICAgJ0Nhbm5vdCBjb25zdHJ1Y3QgVGVuc29yIHdpdGggbW9yZSB0aGFuIDQgY2hhbm5lbHMgZnJvbSBwaXhlbHMuJyk7XG4gIH1cbiAgaWYgKHBpeGVscyA9PSBudWxsKSB7XG4gICAgdGhyb3cgbmV3IEVycm9yKCdwaXhlbHMgcGFzc2VkIHRvIHRmLmJyb3dzZXIuZnJvbVBpeGVscygpIGNhbiBub3QgYmUgbnVsbCcpO1xuICB9XG4gIGxldCBpc1BpeGVsRGF0YSA9IGZhbHNlO1xuICBsZXQgaXNJbWFnZURhdGEgPSBmYWxzZTtcbiAgbGV0IGlzVmlkZW8gPSBmYWxzZTtcbiAgbGV0IGlzSW1hZ2UgPSBmYWxzZTtcbiAgbGV0IGlzQ2FudmFzTGlrZSA9IGZhbHNlO1xuICBsZXQgaXNJbWFnZUJpdG1hcCA9IGZhbHNlO1xuICBpZiAoKHBpeGVscyBhcyBQaXhlbERhdGEpLmRhdGEgaW5zdGFuY2VvZiBVaW50OEFycmF5KSB7XG4gICAgaXNQaXhlbERhdGEgPSB0cnVlO1xuICB9IGVsc2UgaWYgKFxuICAgICAgdHlwZW9mIChJbWFnZURhdGEpICE9PSAndW5kZWZpbmVkJyAmJiBwaXhlbHMgaW5zdGFuY2VvZiBJbWFnZURhdGEpIHtcbiAgICBpc0ltYWdlRGF0YSA9IHRydWU7XG4gIH0gZWxzZSBpZiAoXG4gICAgICB0eXBlb2YgKEhUTUxWaWRlb0VsZW1lbnQpICE9PSAndW5kZWZpbmVkJyAmJlxuICAgICAgcGl4ZWxzIGluc3RhbmNlb2YgSFRNTFZpZGVvRWxlbWVudCkge1xuICAgIGlzVmlkZW8gPSB0cnVlO1xuICB9IGVsc2UgaWYgKFxuICAgICAgdHlwZW9mIChIVE1MSW1hZ2VFbGVtZW50KSAhPT0gJ3VuZGVmaW5lZCcgJiZcbiAgICAgIHBpeGVscyBpbnN0YW5jZW9mIEhUTUxJbWFnZUVsZW1lbnQpIHtcbiAgICBpc0ltYWdlID0gdHJ1ZTtcbiAgICAvLyB0c2xpbnQ6ZGlzYWJsZS1uZXh0LWxpbmU6IG5vLWFueVxuICB9IGVsc2UgaWYgKChwaXhlbHMgYXMgYW55KS5nZXRDb250ZXh0ICE9IG51bGwpIHtcbiAgICBpc0NhbnZhc0xpa2UgPSB0cnVlO1xuICB9IGVsc2UgaWYgKFxuICAgICAgdHlwZW9mIChJbWFnZUJpdG1hcCkgIT09ICd1bmRlZmluZWQnICYmIHBpeGVscyBpbnN0YW5jZW9mIEltYWdlQml0bWFwKSB7XG4gICAgaXNJbWFnZUJpdG1hcCA9IHRydWU7XG4gIH0gZWxzZSB7XG4gICAgdGhyb3cgbmV3IEVycm9yKFxuICAgICAgICAncGl4ZWxzIHBhc3NlZCB0byB0Zi5icm93c2VyLmZyb21QaXhlbHMoKSBtdXN0IGJlIGVpdGhlciBhbiAnICtcbiAgICAgICAgYEhUTUxWaWRlb0VsZW1lbnQsIEhUTUxJbWFnZUVsZW1lbnQsIEhUTUxDYW52YXNFbGVtZW50LCBJbWFnZURhdGEgYCArXG4gICAgICAgIGBpbiBicm93c2VyLCBvciBPZmZzY3JlZW5DYW52YXMsIEltYWdlRGF0YSBpbiB3ZWJ3b3JrZXJgICtcbiAgICAgICAgYCBvciB7ZGF0YTogVWludDMyQXJyYXksIHdpZHRoOiBudW1iZXIsIGhlaWdodDogbnVtYmVyfSwgYCArXG4gICAgICAgIGBidXQgd2FzICR7KHBpeGVscyBhcyB7fSkuY29uc3RydWN0b3IubmFtZX1gKTtcbiAgfVxuICAvLyBJZiB0aGUgY3VycmVudCBiYWNrZW5kIGhhcyAnRnJvbVBpeGVscycgcmVnaXN0ZXJlZCwgaXQgaGFzIGEgbW9yZVxuICAvLyBlZmZpY2llbnQgd2F5IG9mIGhhbmRsaW5nIHBpeGVsIHVwbG9hZHMsIHNvIHdlIGNhbGwgdGhhdC5cbiAgY29uc3Qga2VybmVsID0gZ2V0S2VybmVsKEZyb21QaXhlbHMsIEVOR0lORS5iYWNrZW5kTmFtZSk7XG4gIGlmIChrZXJuZWwgIT0gbnVsbCkge1xuICAgIGNvbnN0IGlucHV0czogRnJvbVBpeGVsc0lucHV0cyA9IHtwaXhlbHN9O1xuICAgIGNvbnN0IGF0dHJzOiBGcm9tUGl4ZWxzQXR0cnMgPSB7bnVtQ2hhbm5lbHN9O1xuICAgIHJldHVybiBFTkdJTkUucnVuS2VybmVsKFxuICAgICAgICBGcm9tUGl4ZWxzLCBpbnB1dHMgYXMge30gYXMgTmFtZWRUZW5zb3JNYXAsXG4gICAgICAgIGF0dHJzIGFzIHt9IGFzIE5hbWVkQXR0ck1hcCk7XG4gIH1cblxuICBjb25zdCBbd2lkdGgsIGhlaWdodF0gPSBpc1ZpZGVvID9cbiAgICAgIFtcbiAgICAgICAgKHBpeGVscyBhcyBIVE1MVmlkZW9FbGVtZW50KS52aWRlb1dpZHRoLFxuICAgICAgICAocGl4ZWxzIGFzIEhUTUxWaWRlb0VsZW1lbnQpLnZpZGVvSGVpZ2h0XG4gICAgICBdIDpcbiAgICAgIFtwaXhlbHMud2lkdGgsIHBpeGVscy5oZWlnaHRdO1xuICBsZXQgdmFsczogVWludDhDbGFtcGVkQXJyYXl8VWludDhBcnJheTtcblxuICBpZiAoaXNDYW52YXNMaWtlKSB7XG4gICAgdmFscyA9XG4gICAgICAgIC8vIHRzbGludDpkaXNhYmxlLW5leHQtbGluZTpuby1hbnlcbiAgICAgICAgKHBpeGVscyBhcyBhbnkpLmdldENvbnRleHQoJzJkJykuZ2V0SW1hZ2VEYXRhKDAsIDAsIHdpZHRoLCBoZWlnaHQpLmRhdGE7XG4gIH0gZWxzZSBpZiAoaXNJbWFnZURhdGEgfHwgaXNQaXhlbERhdGEpIHtcbiAgICB2YWxzID0gKHBpeGVscyBhcyBQaXhlbERhdGEgfCBJbWFnZURhdGEpLmRhdGE7XG4gIH0gZWxzZSBpZiAoaXNJbWFnZSB8fCBpc1ZpZGVvIHx8IGlzSW1hZ2VCaXRtYXApIHtcbiAgICBpZiAoZnJvbVBpeGVsczJEQ29udGV4dCA9PSBudWxsKSB7XG4gICAgICBpZiAodHlwZW9mIGRvY3VtZW50ID09PSAndW5kZWZpbmVkJykge1xuICAgICAgICBpZiAodHlwZW9mIE9mZnNjcmVlbkNhbnZhcyAhPT0gJ3VuZGVmaW5lZCcgJiZcbiAgICAgICAgICAgIHR5cGVvZiBPZmZzY3JlZW5DYW52YXNSZW5kZXJpbmdDb250ZXh0MkQgIT09ICd1bmRlZmluZWQnKSB7XG4gICAgICAgICAgLy8gQHRzLWlnbm9yZVxuICAgICAgICAgIGZyb21QaXhlbHMyRENvbnRleHQgPSBuZXcgT2Zmc2NyZWVuQ2FudmFzKDEsIDEpLmdldENvbnRleHQoJzJkJyk7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgdGhyb3cgbmV3IEVycm9yKFxuICAgICAgICAgICAgICAnQ2Fubm90IHBhcnNlIGlucHV0IGluIGN1cnJlbnQgY29udGV4dC4gJyArXG4gICAgICAgICAgICAgICdSZWFzb246IE9mZnNjcmVlbkNhbnZhcyBDb250ZXh0MkQgcmVuZGVyaW5nIGlzIG5vdCBzdXBwb3J0ZWQuJyk7XG4gICAgICAgIH1cbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIGZyb21QaXhlbHMyRENvbnRleHQgPVxuICAgICAgICAgICAgZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnY2FudmFzJykuZ2V0Q29udGV4dChcbiAgICAgICAgICAgICAgICAnMmQnLCB7d2lsbFJlYWRGcmVxdWVudGx5OiB0cnVlfSkgYXMgQ2FudmFzUmVuZGVyaW5nQ29udGV4dDJEO1xuICAgICAgfVxuICAgIH1cbiAgICBmcm9tUGl4ZWxzMkRDb250ZXh0LmNhbnZhcy53aWR0aCA9IHdpZHRoO1xuICAgIGZyb21QaXhlbHMyRENvbnRleHQuY2FudmFzLmhlaWdodCA9IGhlaWdodDtcbiAgICBmcm9tUGl4ZWxzMkRDb250ZXh0LmRyYXdJbWFnZShcbiAgICAgICAgcGl4ZWxzIGFzIEhUTUxWaWRlb0VsZW1lbnQsIDAsIDAsIHdpZHRoLCBoZWlnaHQpO1xuICAgIHZhbHMgPSBmcm9tUGl4ZWxzMkRDb250ZXh0LmdldEltYWdlRGF0YSgwLCAwLCB3aWR0aCwgaGVpZ2h0KS5kYXRhO1xuICB9XG4gIGxldCB2YWx1ZXM6IEludDMyQXJyYXk7XG4gIGlmIChudW1DaGFubmVscyA9PT0gNCkge1xuICAgIHZhbHVlcyA9IG5ldyBJbnQzMkFycmF5KHZhbHMpO1xuICB9IGVsc2Uge1xuICAgIGNvbnN0IG51bVBpeGVscyA9IHdpZHRoICogaGVpZ2h0O1xuICAgIHZhbHVlcyA9IG5ldyBJbnQzMkFycmF5KG51bVBpeGVscyAqIG51bUNoYW5uZWxzKTtcbiAgICBmb3IgKGxldCBpID0gMDsgaSA8IG51bVBpeGVsczsgaSsrKSB7XG4gICAgICBmb3IgKGxldCBjaGFubmVsID0gMDsgY2hhbm5lbCA8IG51bUNoYW5uZWxzOyArK2NoYW5uZWwpIHtcbiAgICAgICAgdmFsdWVzW2kgKiBudW1DaGFubmVscyArIGNoYW5uZWxdID0gdmFsc1tpICogNCArIGNoYW5uZWxdO1xuICAgICAgfVxuICAgIH1cbiAgfVxuICBjb25zdCBvdXRTaGFwZTogW251bWJlciwgbnVtYmVyLCBudW1iZXJdID0gW2hlaWdodCwgd2lkdGgsIG51bUNoYW5uZWxzXTtcbiAgcmV0dXJuIHRlbnNvcjNkKHZhbHVlcywgb3V0U2hhcGUsICdpbnQzMicpO1xufVxuXG4vLyBIZWxwZXIgZnVuY3Rpb25zIGZvciB8ZnJvbVBpeGVsc0FzeW5jfCB0byBjaGVjayB3aGV0aGVyIHRoZSBpbnB1dCBjYW5cbi8vIGJlIHdyYXBwZWQgaW50byBpbWFnZUJpdG1hcC5cbmZ1bmN0aW9uIGlzUGl4ZWxEYXRhKHBpeGVsczogUGl4ZWxEYXRhfEltYWdlRGF0YXxIVE1MSW1hZ2VFbGVtZW50fFxuICAgICAgICAgICAgICAgICAgICAgSFRNTENhbnZhc0VsZW1lbnR8SFRNTFZpZGVvRWxlbWVudHxcbiAgICAgICAgICAgICAgICAgICAgIEltYWdlQml0bWFwKTogcGl4ZWxzIGlzIFBpeGVsRGF0YSB7XG4gIHJldHVybiAocGl4ZWxzICE9IG51bGwpICYmICgocGl4ZWxzIGFzIFBpeGVsRGF0YSkuZGF0YSBpbnN0YW5jZW9mIFVpbnQ4QXJyYXkpO1xufVxuXG5mdW5jdGlvbiBpc0ltYWdlQml0bWFwRnVsbHlTdXBwb3J0ZWQoKSB7XG4gIHJldHVybiB0eXBlb2Ygd2luZG93ICE9PSAndW5kZWZpbmVkJyAmJlxuICAgICAgdHlwZW9mIChJbWFnZUJpdG1hcCkgIT09ICd1bmRlZmluZWQnICYmXG4gICAgICB3aW5kb3cuaGFzT3duUHJvcGVydHkoJ2NyZWF0ZUltYWdlQml0bWFwJyk7XG59XG5cbmZ1bmN0aW9uIGlzTm9uRW1wdHlQaXhlbHMocGl4ZWxzOiBQaXhlbERhdGF8SW1hZ2VEYXRhfEhUTUxJbWFnZUVsZW1lbnR8XG4gICAgICAgICAgICAgICAgICAgICAgICAgIEhUTUxDYW52YXNFbGVtZW50fEhUTUxWaWRlb0VsZW1lbnR8SW1hZ2VCaXRtYXApIHtcbiAgcmV0dXJuIHBpeGVscyAhPSBudWxsICYmIHBpeGVscy53aWR0aCAhPT0gMCAmJiBwaXhlbHMuaGVpZ2h0ICE9PSAwO1xufVxuXG5mdW5jdGlvbiBjYW5XcmFwUGl4ZWxzVG9JbWFnZUJpdG1hcChwaXhlbHM6IFBpeGVsRGF0YXxJbWFnZURhdGF8XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBIVE1MSW1hZ2VFbGVtZW50fEhUTUxDYW52YXNFbGVtZW50fFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSFRNTFZpZGVvRWxlbWVudHxJbWFnZUJpdG1hcCkge1xuICByZXR1cm4gaXNJbWFnZUJpdG1hcEZ1bGx5U3VwcG9ydGVkKCkgJiYgIShwaXhlbHMgaW5zdGFuY2VvZiBJbWFnZUJpdG1hcCkgJiZcbiAgICAgIGlzTm9uRW1wdHlQaXhlbHMocGl4ZWxzKSAmJiAhaXNQaXhlbERhdGEocGl4ZWxzKTtcbn1cblxuLyoqXG4gKiBDcmVhdGVzIGEgYHRmLlRlbnNvcmAgZnJvbSBhbiBpbWFnZSBpbiBhc3luYyB3YXkuXG4gKlxuICogYGBganNcbiAqIGNvbnN0IGltYWdlID0gbmV3IEltYWdlRGF0YSgxLCAxKTtcbiAqIGltYWdlLmRhdGFbMF0gPSAxMDA7XG4gKiBpbWFnZS5kYXRhWzFdID0gMTUwO1xuICogaW1hZ2UuZGF0YVsyXSA9IDIwMDtcbiAqIGltYWdlLmRhdGFbM10gPSAyNTU7XG4gKlxuICogKGF3YWl0IHRmLmJyb3dzZXIuZnJvbVBpeGVsc0FzeW5jKGltYWdlKSkucHJpbnQoKTtcbiAqIGBgYFxuICogVGhpcyBBUEkgaXMgdGhlIGFzeW5jIHZlcnNpb24gb2YgZnJvbVBpeGVscy4gVGhlIEFQSSB3aWxsIGZpcnN0XG4gKiBjaGVjayB8V1JBUF9UT19JTUFHRUJJVE1BUHwgZmxhZywgYW5kIHRyeSB0byB3cmFwIHRoZSBpbnB1dCB0b1xuICogaW1hZ2VCaXRtYXAgaWYgdGhlIGZsYWcgaXMgc2V0IHRvIHRydWUuXG4gKlxuICogQHBhcmFtIHBpeGVscyBUaGUgaW5wdXQgaW1hZ2UgdG8gY29uc3RydWN0IHRoZSB0ZW5zb3IgZnJvbS4gVGhlXG4gKiBzdXBwb3J0ZWQgaW1hZ2UgdHlwZXMgYXJlIGFsbCA0LWNoYW5uZWwuIFlvdSBjYW4gYWxzbyBwYXNzIGluIGFuIGltYWdlXG4gKiBvYmplY3Qgd2l0aCBmb2xsb3dpbmcgYXR0cmlidXRlczpcbiAqIGB7ZGF0YTogVWludDhBcnJheTsgd2lkdGg6IG51bWJlcjsgaGVpZ2h0OiBudW1iZXJ9YFxuICogQHBhcmFtIG51bUNoYW5uZWxzIFRoZSBudW1iZXIgb2YgY2hhbm5lbHMgb2YgdGhlIG91dHB1dCB0ZW5zb3IuIEFcbiAqIG51bUNoYW5uZWxzIHZhbHVlIGxlc3MgdGhhbiA0IGFsbG93cyB5b3UgdG8gaWdub3JlIGNoYW5uZWxzLiBEZWZhdWx0cyB0b1xuICogMyAoaWdub3JlcyBhbHBoYSBjaGFubmVsIG9mIGlucHV0IGltYWdlKS5cbiAqXG4gKiBAZG9jIHtoZWFkaW5nOiAnQnJvd3NlcicsIG5hbWVzcGFjZTogJ2Jyb3dzZXInLCBpZ25vcmVDSTogdHJ1ZX1cbiAqL1xuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIGZyb21QaXhlbHNBc3luYyhcbiAgICBwaXhlbHM6IFBpeGVsRGF0YXxJbWFnZURhdGF8SFRNTEltYWdlRWxlbWVudHxIVE1MQ2FudmFzRWxlbWVudHxcbiAgICBIVE1MVmlkZW9FbGVtZW50fEltYWdlQml0bWFwLFxuICAgIG51bUNoYW5uZWxzID0gMykge1xuICBsZXQgaW5wdXRzOiBQaXhlbERhdGF8SW1hZ2VEYXRhfEhUTUxJbWFnZUVsZW1lbnR8SFRNTENhbnZhc0VsZW1lbnR8XG4gICAgICBIVE1MVmlkZW9FbGVtZW50fEltYWdlQml0bWFwID0gbnVsbDtcblxuICAvLyBDaGVjayB3aGV0aGVyIHRoZSBiYWNrZW5kIG5lZWRzIHRvIHdyYXAgfHBpeGVsc3wgdG8gaW1hZ2VCaXRtYXAgYW5kXG4gIC8vIHdoZXRoZXIgfHBpeGVsc3wgY2FuIGJlIHdyYXBwZWQgdG8gaW1hZ2VCaXRtYXAuXG4gIGlmIChlbnYoKS5nZXRCb29sKCdXUkFQX1RPX0lNQUdFQklUTUFQJykgJiZcbiAgICAgIGNhbldyYXBQaXhlbHNUb0ltYWdlQml0bWFwKHBpeGVscykpIHtcbiAgICAvLyBGb3JjZSB0aGUgaW1hZ2VCaXRtYXAgY3JlYXRpb24gdG8gbm90IGRvIGFueSBwcmVtdWx0aXBseSBhbHBoYVxuICAgIC8vIG9wcy5cbiAgICBsZXQgaW1hZ2VCaXRtYXA7XG5cbiAgICB0cnkge1xuICAgICAgLy8gd3JhcCBpbiB0cnktY2F0Y2ggYmxvY2ssIGJlY2F1c2UgY3JlYXRlSW1hZ2VCaXRtYXAgbWF5IG5vdCB3b3JrXG4gICAgICAvLyBwcm9wZXJseSBpbiBzb21lIGJyb3dzZXJzLCBlLmcuXG4gICAgICAvLyBodHRwczovL2J1Z3ppbGxhLm1vemlsbGEub3JnL3Nob3dfYnVnLmNnaT9pZD0xMzM1NTk0XG4gICAgICAvLyB0c2xpbnQ6ZGlzYWJsZS1uZXh0LWxpbmU6IG5vLWFueVxuICAgICAgaW1hZ2VCaXRtYXAgPSBhd2FpdCAoY3JlYXRlSW1hZ2VCaXRtYXAgYXMgYW55KShcbiAgICAgICAgICBwaXhlbHMgYXMgSW1hZ2VCaXRtYXBTb3VyY2UsIHtwcmVtdWx0aXBseUFscGhhOiAnbm9uZSd9KTtcbiAgICB9IGNhdGNoIChlKSB7XG4gICAgICBpbWFnZUJpdG1hcCA9IG51bGw7XG4gICAgfVxuXG4gICAgLy8gY3JlYXRlSW1hZ2VCaXRtYXAgd2lsbCBjbGlwIHRoZSBzb3VyY2Ugc2l6ZS5cbiAgICAvLyBJbiBzb21lIGNhc2VzLCB0aGUgaW5wdXQgd2lsbCBoYXZlIGxhcmdlciBzaXplIHRoYW4gaXRzIGNvbnRlbnQuXG4gICAgLy8gRS5nLiBuZXcgSW1hZ2UoMTAsIDEwKSBidXQgd2l0aCAxIHggMSBjb250ZW50LiBVc2luZ1xuICAgIC8vIGNyZWF0ZUltYWdlQml0bWFwIHdpbGwgY2xpcCB0aGUgc2l6ZSBmcm9tIDEwIHggMTAgdG8gMSB4IDEsIHdoaWNoXG4gICAgLy8gaXMgbm90IGNvcnJlY3QuIFdlIHNob3VsZCBhdm9pZCB3cmFwcGluZyBzdWNoIHJlc291Y2UgdG9cbiAgICAvLyBpbWFnZUJpdG1hcC5cbiAgICBpZiAoaW1hZ2VCaXRtYXAgIT0gbnVsbCAmJiBpbWFnZUJpdG1hcC53aWR0aCA9PT0gcGl4ZWxzLndpZHRoICYmXG4gICAgICAgIGltYWdlQml0bWFwLmhlaWdodCA9PT0gcGl4ZWxzLmhlaWdodCkge1xuICAgICAgaW5wdXRzID0gaW1hZ2VCaXRtYXA7XG4gICAgfSBlbHNlIHtcbiAgICAgIGlucHV0cyA9IHBpeGVscztcbiAgICB9XG4gIH0gZWxzZSB7XG4gICAgaW5wdXRzID0gcGl4ZWxzO1xuICB9XG5cbiAgcmV0dXJuIGZyb21QaXhlbHNfKGlucHV0cywgbnVtQ2hhbm5lbHMpO1xufVxuXG4vKipcbiAqIERyYXdzIGEgYHRmLlRlbnNvcmAgb2YgcGl4ZWwgdmFsdWVzIHRvIGEgYnl0ZSBhcnJheSBvciBvcHRpb25hbGx5IGFcbiAqIGNhbnZhcy5cbiAqXG4gKiBXaGVuIHRoZSBkdHlwZSBvZiB0aGUgaW5wdXQgaXMgJ2Zsb2F0MzInLCB3ZSBhc3N1bWUgdmFsdWVzIGluIHRoZSByYW5nZVxuICogWzAtMV0uIE90aGVyd2lzZSwgd2hlbiBpbnB1dCBpcyAnaW50MzInLCB3ZSBhc3N1bWUgdmFsdWVzIGluIHRoZSByYW5nZVxuICogWzAtMjU1XS5cbiAqXG4gKiBSZXR1cm5zIGEgcHJvbWlzZSB0aGF0IHJlc29sdmVzIHdoZW4gdGhlIGNhbnZhcyBoYXMgYmVlbiBkcmF3biB0by5cbiAqXG4gKiBAcGFyYW0gaW1nIEEgcmFuay0yIHRlbnNvciB3aXRoIHNoYXBlIGBbaGVpZ2h0LCB3aWR0aF1gLCBvciBhIHJhbmstMyB0ZW5zb3JcbiAqIG9mIHNoYXBlIGBbaGVpZ2h0LCB3aWR0aCwgbnVtQ2hhbm5lbHNdYC4gSWYgcmFuay0yLCBkcmF3cyBncmF5c2NhbGUuIElmXG4gKiByYW5rLTMsIG11c3QgaGF2ZSBkZXB0aCBvZiAxLCAzIG9yIDQuIFdoZW4gZGVwdGggb2YgMSwgZHJhd3NcbiAqIGdyYXlzY2FsZS4gV2hlbiBkZXB0aCBvZiAzLCB3ZSBkcmF3IHdpdGggdGhlIGZpcnN0IHRocmVlIGNvbXBvbmVudHMgb2ZcbiAqIHRoZSBkZXB0aCBkaW1lbnNpb24gY29ycmVzcG9uZGluZyB0byByLCBnLCBiIGFuZCBhbHBoYSA9IDEuIFdoZW4gZGVwdGggb2ZcbiAqIDQsIGFsbCBmb3VyIGNvbXBvbmVudHMgb2YgdGhlIGRlcHRoIGRpbWVuc2lvbiBjb3JyZXNwb25kIHRvIHIsIGcsIGIsIGEuXG4gKiBAcGFyYW0gY2FudmFzIFRoZSBjYW52YXMgdG8gZHJhdyB0by5cbiAqXG4gKiBAZG9jIHtoZWFkaW5nOiAnQnJvd3NlcicsIG5hbWVzcGFjZTogJ2Jyb3dzZXInfVxuICovXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gdG9QaXhlbHMoXG4gICAgaW1nOiBUZW5zb3IyRHxUZW5zb3IzRHxUZW5zb3JMaWtlLFxuICAgIGNhbnZhcz86IEhUTUxDYW52YXNFbGVtZW50KTogUHJvbWlzZTxVaW50OENsYW1wZWRBcnJheT4ge1xuICBsZXQgJGltZyA9IGNvbnZlcnRUb1RlbnNvcihpbWcsICdpbWcnLCAndG9QaXhlbHMnKTtcbiAgaWYgKCEoaW1nIGluc3RhbmNlb2YgVGVuc29yKSkge1xuICAgIC8vIEFzc3VtZSBpbnQzMiBpZiB1c2VyIHBhc3NlZCBhIG5hdGl2ZSBhcnJheS5cbiAgICBjb25zdCBvcmlnaW5hbEltZ1RlbnNvciA9ICRpbWc7XG4gICAgJGltZyA9IGNhc3Qob3JpZ2luYWxJbWdUZW5zb3IsICdpbnQzMicpO1xuICAgIG9yaWdpbmFsSW1nVGVuc29yLmRpc3Bvc2UoKTtcbiAgfVxuICBpZiAoJGltZy5yYW5rICE9PSAyICYmICRpbWcucmFuayAhPT0gMykge1xuICAgIHRocm93IG5ldyBFcnJvcihcbiAgICAgICAgYHRvUGl4ZWxzIG9ubHkgc3VwcG9ydHMgcmFuayAyIG9yIDMgdGVuc29ycywgZ290IHJhbmsgJHskaW1nLnJhbmt9LmApO1xuICB9XG4gIGNvbnN0IFtoZWlnaHQsIHdpZHRoXSA9ICRpbWcuc2hhcGUuc2xpY2UoMCwgMik7XG4gIGNvbnN0IGRlcHRoID0gJGltZy5yYW5rID09PSAyID8gMSA6ICRpbWcuc2hhcGVbMl07XG5cbiAgaWYgKGRlcHRoID4gNCB8fCBkZXB0aCA9PT0gMikge1xuICAgIHRocm93IG5ldyBFcnJvcihcbiAgICAgICAgYHRvUGl4ZWxzIG9ubHkgc3VwcG9ydHMgZGVwdGggb2Ygc2l6ZSBgICtcbiAgICAgICAgYDEsIDMgb3IgNCBidXQgZ290ICR7ZGVwdGh9YCk7XG4gIH1cblxuICBpZiAoJGltZy5kdHlwZSAhPT0gJ2Zsb2F0MzInICYmICRpbWcuZHR5cGUgIT09ICdpbnQzMicpIHtcbiAgICB0aHJvdyBuZXcgRXJyb3IoXG4gICAgICAgIGBVbnN1cHBvcnRlZCB0eXBlIGZvciB0b1BpeGVsczogJHskaW1nLmR0eXBlfS5gICtcbiAgICAgICAgYCBQbGVhc2UgdXNlIGZsb2F0MzIgb3IgaW50MzIgdGVuc29ycy5gKTtcbiAgfVxuXG4gIGNvbnN0IGRhdGEgPSBhd2FpdCAkaW1nLmRhdGEoKTtcbiAgY29uc3QgbXVsdGlwbGllciA9ICRpbWcuZHR5cGUgPT09ICdmbG9hdDMyJyA/IDI1NSA6IDE7XG4gIGNvbnN0IGJ5dGVzID0gbmV3IFVpbnQ4Q2xhbXBlZEFycmF5KHdpZHRoICogaGVpZ2h0ICogNCk7XG5cbiAgZm9yIChsZXQgaSA9IDA7IGkgPCBoZWlnaHQgKiB3aWR0aDsgKytpKSB7XG4gICAgY29uc3QgcmdiYSA9IFswLCAwLCAwLCAyNTVdO1xuXG4gICAgZm9yIChsZXQgZCA9IDA7IGQgPCBkZXB0aDsgZCsrKSB7XG4gICAgICBjb25zdCB2YWx1ZSA9IGRhdGFbaSAqIGRlcHRoICsgZF07XG5cbiAgICAgIGlmICgkaW1nLmR0eXBlID09PSAnZmxvYXQzMicpIHtcbiAgICAgICAgaWYgKHZhbHVlIDwgMCB8fCB2YWx1ZSA+IDEpIHtcbiAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoXG4gICAgICAgICAgICAgIGBUZW5zb3IgdmFsdWVzIGZvciBhIGZsb2F0MzIgVGVuc29yIG11c3QgYmUgaW4gdGhlIGAgK1xuICAgICAgICAgICAgICBgcmFuZ2UgWzAgLSAxXSBidXQgZW5jb3VudGVyZWQgJHt2YWx1ZX0uYCk7XG4gICAgICAgIH1cbiAgICAgIH0gZWxzZSBpZiAoJGltZy5kdHlwZSA9PT0gJ2ludDMyJykge1xuICAgICAgICBpZiAodmFsdWUgPCAwIHx8IHZhbHVlID4gMjU1KSB7XG4gICAgICAgICAgdGhyb3cgbmV3IEVycm9yKFxuICAgICAgICAgICAgICBgVGVuc29yIHZhbHVlcyBmb3IgYSBpbnQzMiBUZW5zb3IgbXVzdCBiZSBpbiB0aGUgYCArXG4gICAgICAgICAgICAgIGByYW5nZSBbMCAtIDI1NV0gYnV0IGVuY291bnRlcmVkICR7dmFsdWV9LmApO1xuICAgICAgICB9XG4gICAgICB9XG5cbiAgICAgIGlmIChkZXB0aCA9PT0gMSkge1xuICAgICAgICByZ2JhWzBdID0gdmFsdWUgKiBtdWx0aXBsaWVyO1xuICAgICAgICByZ2JhWzFdID0gdmFsdWUgKiBtdWx0aXBsaWVyO1xuICAgICAgICByZ2JhWzJdID0gdmFsdWUgKiBtdWx0aXBsaWVyO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgcmdiYVtkXSA9IHZhbHVlICogbXVsdGlwbGllcjtcbiAgICAgIH1cbiAgICB9XG5cbiAgICBjb25zdCBqID0gaSAqIDQ7XG4gICAgYnl0ZXNbaiArIDBdID0gTWF0aC5yb3VuZChyZ2JhWzBdKTtcbiAgICBieXRlc1tqICsgMV0gPSBNYXRoLnJvdW5kKHJnYmFbMV0pO1xuICAgIGJ5dGVzW2ogKyAyXSA9IE1hdGgucm91bmQocmdiYVsyXSk7XG4gICAgYnl0ZXNbaiArIDNdID0gTWF0aC5yb3VuZChyZ2JhWzNdKTtcbiAgfVxuXG4gIGlmIChjYW52YXMgIT0gbnVsbCkge1xuICAgIGNhbnZhcy53aWR0aCA9IHdpZHRoO1xuICAgIGNhbnZhcy5oZWlnaHQgPSBoZWlnaHQ7XG4gICAgY29uc3QgY3R4ID0gY2FudmFzLmdldENvbnRleHQoJzJkJyk7XG4gICAgY29uc3QgaW1hZ2VEYXRhID0gbmV3IEltYWdlRGF0YShieXRlcywgd2lkdGgsIGhlaWdodCk7XG4gICAgY3R4LnB1dEltYWdlRGF0YShpbWFnZURhdGEsIDAsIDApO1xuICB9XG4gIGlmICgkaW1nICE9PSBpbWcpIHtcbiAgICAkaW1nLmRpc3Bvc2UoKTtcbiAgfVxuICByZXR1cm4gYnl0ZXM7XG59XG5cbmV4cG9ydCBjb25zdCBmcm9tUGl4ZWxzID0gb3Aoe2Zyb21QaXhlbHNffSk7XG4iXX0=","import { computeStrides, sizeFromShape } from '../util';\n/**\n * Validate gather nd inputs.\n *\n * @param tensor The tensor contains the source values.\n * @param indices The tensor contains the indices to slice the source.\n *\n * @returns [resultShape, numUpdates, sliceSize, strides]\n */\nexport function prepareAndValidate(tensor, indices) {\n const tensorRank = tensor.shape.length;\n const indicesRank = indices.shape.length;\n if (tensorRank < 1) {\n throw new Error('tf.gatherND() expects the input to be rank 1 or higher,' +\n ` but the rank was ${tensorRank}.`);\n }\n if (indicesRank < 1) {\n throw new Error('tf.gatherND() expects the indices to be rank 1 or higher,' +\n ` but the rank was ${indicesRank}.`);\n }\n if (indices.dtype !== 'int32') {\n throw new Error('tf.gatherND() expects the indices to be int32 type,' +\n ` but the dtype was ${indices.dtype}.`);\n }\n if (indices.shape[indicesRank - 1] > tensorRank) {\n throw new Error('index innermost dimension length must be <= tensor rank; saw: ' +\n `${indices.shape[indicesRank - 1]} vs. ${tensorRank}`);\n }\n if (sizeFromShape(tensor.shape) === 0) {\n throw new Error('Requested more than 0 entries, but input is empty.' +\n ` Input shape: ${tensor.shape}.`);\n }\n const indicesShape = indices.shape;\n const sliceRank = indicesShape[indicesShape.length - 1];\n // The result shape is\n // indices.shape[:-1] + params.shape[indices.shape[-1]:]\n let nResult = 1;\n for (let i = 0; i < indicesShape.length - 1; ++i) {\n nResult *= indicesShape[i];\n }\n const inputShape = tensor.shape;\n const resultShape = indicesShape.slice();\n resultShape.pop();\n let sliceSize = 1;\n for (let i = sliceRank; i < tensorRank; ++i) {\n sliceSize *= inputShape[i];\n resultShape.push(inputShape[i]);\n }\n const strides = [...computeStrides(tensor.shape).map(stride => stride / sliceSize),\n 1].slice(0, sliceRank);\n return [resultShape, nResult, sliceSize, strides];\n}\n//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZ2F0aGVyX25kX3V0aWwuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi8uLi90ZmpzLWNvcmUvc3JjL29wcy9nYXRoZXJfbmRfdXRpbC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFpQkEsT0FBTyxFQUFDLGNBQWMsRUFBRSxhQUFhLEVBQUMsTUFBTSxTQUFTLENBQUM7QUFFdEQ7Ozs7Ozs7R0FPRztBQUNILE1BQU0sVUFBVSxrQkFBa0IsQ0FBQyxNQUFrQixFQUFFLE9BQW1CO0lBRXhFLE1BQU0sVUFBVSxHQUFHLE1BQU0sQ0FBQyxLQUFLLENBQUMsTUFBTSxDQUFDO0lBQ3ZDLE1BQU0sV0FBVyxHQUFHLE9BQU8sQ0FBQyxLQUFLLENBQUMsTUFBTSxDQUFDO0lBQ3pDLElBQUksVUFBVSxHQUFHLENBQUMsRUFBRTtRQUNsQixNQUFNLElBQUksS0FBSyxDQUNYLHlEQUF5RDtZQUN6RCxxQkFBcUIsVUFBVSxHQUFHLENBQUMsQ0FBQztLQUN6QztJQUNELElBQUksV0FBVyxHQUFHLENBQUMsRUFBRTtRQUNuQixNQUFNLElBQUksS0FBSyxDQUNYLDJEQUEyRDtZQUMzRCxxQkFBcUIsV0FBVyxHQUFHLENBQUMsQ0FBQztLQUMxQztJQUNELElBQUksT0FBTyxDQUFDLEtBQUssS0FBSyxPQUFPLEVBQUU7UUFDN0IsTUFBTSxJQUFJLEtBQUssQ0FDWCxxREFBcUQ7WUFDckQsc0JBQXNCLE9BQU8sQ0FBQyxLQUFLLEdBQUcsQ0FBQyxDQUFDO0tBQzdDO0lBQ0QsSUFBSSxPQUFPLENBQUMsS0FBSyxDQUFDLFdBQVcsR0FBRyxDQUFDLENBQUMsR0FBRyxVQUFVLEVBQUU7UUFDL0MsTUFBTSxJQUFJLEtBQUssQ0FDWCxnRUFBZ0U7WUFDaEUsR0FBRyxPQUFPLENBQUMsS0FBSyxDQUFDLFdBQVcsR0FBRyxDQUFDLENBQUMsUUFBUSxVQUFVLEVBQUUsQ0FBQyxDQUFDO0tBQzVEO0lBRUQsSUFBSSxhQUFhLENBQUMsTUFBTSxDQUFDLEtBQUssQ0FBQyxLQUFLLENBQUMsRUFBRTtRQUNyQyxNQUFNLElBQUksS0FBSyxDQUNYLG9EQUFvRDtZQUNwRCxpQkFBaUIsTUFBTSxDQUFDLEtBQUssR0FBRyxDQUFDLENBQUM7S0FDdkM7SUFFRCxNQUFNLFlBQVksR0FBRyxPQUFPLENBQUMsS0FBSyxDQUFDO0lBQ25DLE1BQU0sU0FBUyxHQUFHLFlBQVksQ0FBQyxZQUFZLENBQUMsTUFBTSxHQUFHLENBQUMsQ0FBQyxDQUFDO0lBRXhELHNCQUFzQjtJQUN0QiwwREFBMEQ7SUFDMUQsSUFBSSxPQUFPLEdBQUcsQ0FBQyxDQUFDO0lBQ2hCLEtBQUssSUFBSSxDQUFDLEdBQUcsQ0FBQyxFQUFFLENBQUMsR0FBRyxZQUFZLENBQUMsTUFBTSxHQUFHLENBQUMsRUFBRSxFQUFFLENBQUMsRUFBRTtRQUNoRCxPQUFPLElBQUksWUFBWSxDQUFDLENBQUMsQ0FBQyxDQUFDO0tBQzVCO0lBRUQsTUFBTSxVQUFVLEdBQUcsTUFBTSxDQUFDLEtBQUssQ0FBQztJQUVoQyxNQUFNLFdBQVcsR0FBRyxZQUFZLENBQUMsS0FBSyxFQUFFLENBQUM7SUFDekMsV0FBVyxDQUFDLEdBQUcsRUFBRSxDQUFDO0lBRWxCLElBQUksU0FBUyxHQUFHLENBQUMsQ0FBQztJQUNsQixLQUFLLElBQUksQ0FBQyxHQUFHLFNBQVMsRUFBRSxDQUFDLEdBQUcsVUFBVSxFQUFFLEVBQUUsQ0FBQyxFQUFFO1FBQzNDLFNBQVMsSUFBSSxVQUFVLENBQUMsQ0FBQyxDQUFDLENBQUM7UUFDM0IsV0FBVyxDQUFDLElBQUksQ0FBQyxVQUFVLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQztLQUNqQztJQUVELE1BQU0sT0FBTyxHQUNULENBQUMsR0FBRyxjQUFjLENBQUMsTUFBTSxDQUFDLEtBQUssQ0FBQyxDQUFDLEdBQUcsQ0FBQyxNQUFNLENBQUMsRUFBRSxDQUFDLE1BQU0sR0FBRyxTQUFTLENBQUM7UUFDakUsQ0FBQyxDQUFDLENBQUMsS0FBSyxDQUFDLENBQUMsRUFBRSxTQUFTLENBQUMsQ0FBQztJQUU1QixPQUFPLENBQUMsV0FBVyxFQUFFLE9BQU8sRUFBRSxTQUFTLEVBQUUsT0FBTyxDQUFDLENBQUM7QUFDcEQsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbIi8qKlxuICogQGxpY2Vuc2VcbiAqIENvcHlyaWdodCAyMDE4IEdvb2dsZSBMTEMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuXG4gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgXCJMaWNlbnNlXCIpO1xuICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLlxuICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0XG4gKlxuICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wXG4gKlxuICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZVxuICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gXCJBUyBJU1wiIEJBU0lTLFxuICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuXG4gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kXG4gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS5cbiAqID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4gKi9cbmltcG9ydCB7VGVuc29ySW5mb30gZnJvbSAnLi4va2VybmVsX3JlZ2lzdHJ5JztcbmltcG9ydCB7Y29tcHV0ZVN0cmlkZXMsIHNpemVGcm9tU2hhcGV9IGZyb20gJy4uL3V0aWwnO1xuXG4vKipcbiAqIFZhbGlkYXRlIGdhdGhlciBuZCBpbnB1dHMuXG4gKlxuICogQHBhcmFtIHRlbnNvciBUaGUgdGVuc29yIGNvbnRhaW5zIHRoZSBzb3VyY2UgdmFsdWVzLlxuICogQHBhcmFtIGluZGljZXMgVGhlIHRlbnNvciBjb250YWlucyB0aGUgaW5kaWNlcyB0byBzbGljZSB0aGUgc291cmNlLlxuICpcbiAqIEByZXR1cm5zIFtyZXN1bHRTaGFwZSwgbnVtVXBkYXRlcywgc2xpY2VTaXplLCBzdHJpZGVzXVxuICovXG5leHBvcnQgZnVuY3Rpb24gcHJlcGFyZUFuZFZhbGlkYXRlKHRlbnNvcjogVGVuc29ySW5mbywgaW5kaWNlczogVGVuc29ySW5mbyk6XG4gICAgW251bWJlcltdLCBudW1iZXIsIG51bWJlciwgbnVtYmVyW11dIHtcbiAgY29uc3QgdGVuc29yUmFuayA9IHRlbnNvci5zaGFwZS5sZW5ndGg7XG4gIGNvbnN0IGluZGljZXNSYW5rID0gaW5kaWNlcy5zaGFwZS5sZW5ndGg7XG4gIGlmICh0ZW5zb3JSYW5rIDwgMSkge1xuICAgIHRocm93IG5ldyBFcnJvcihcbiAgICAgICAgJ3RmLmdhdGhlck5EKCkgZXhwZWN0cyB0aGUgaW5wdXQgdG8gYmUgcmFuayAxIG9yIGhpZ2hlciwnICtcbiAgICAgICAgYCBidXQgdGhlIHJhbmsgd2FzICR7dGVuc29yUmFua30uYCk7XG4gIH1cbiAgaWYgKGluZGljZXNSYW5rIDwgMSkge1xuICAgIHRocm93IG5ldyBFcnJvcihcbiAgICAgICAgJ3RmLmdhdGhlck5EKCkgZXhwZWN0cyB0aGUgaW5kaWNlcyB0byBiZSByYW5rIDEgb3IgaGlnaGVyLCcgK1xuICAgICAgICBgIGJ1dCB0aGUgcmFuayB3YXMgJHtpbmRpY2VzUmFua30uYCk7XG4gIH1cbiAgaWYgKGluZGljZXMuZHR5cGUgIT09ICdpbnQzMicpIHtcbiAgICB0aHJvdyBuZXcgRXJyb3IoXG4gICAgICAgICd0Zi5nYXRoZXJORCgpIGV4cGVjdHMgdGhlIGluZGljZXMgdG8gYmUgaW50MzIgdHlwZSwnICtcbiAgICAgICAgYCBidXQgdGhlIGR0eXBlIHdhcyAke2luZGljZXMuZHR5cGV9LmApO1xuICB9XG4gIGlmIChpbmRpY2VzLnNoYXBlW2luZGljZXNSYW5rIC0gMV0gPiB0ZW5zb3JSYW5rKSB7XG4gICAgdGhyb3cgbmV3IEVycm9yKFxuICAgICAgICAnaW5kZXggaW5uZXJtb3N0IGRpbWVuc2lvbiBsZW5ndGggbXVzdCBiZSA8PSB0ZW5zb3IgcmFuazsgc2F3OiAnICtcbiAgICAgICAgYCR7aW5kaWNlcy5zaGFwZVtpbmRpY2VzUmFuayAtIDFdfSB2cy4gJHt0ZW5zb3JSYW5rfWApO1xuICB9XG5cbiAgaWYgKHNpemVGcm9tU2hhcGUodGVuc29yLnNoYXBlKSA9PT0gMCkge1xuICAgIHRocm93IG5ldyBFcnJvcihcbiAgICAgICAgJ1JlcXVlc3RlZCBtb3JlIHRoYW4gMCBlbnRyaWVzLCBidXQgaW5wdXQgaXMgZW1wdHkuJyArXG4gICAgICAgIGAgSW5wdXQgc2hhcGU6ICR7dGVuc29yLnNoYXBlfS5gKTtcbiAgfVxuXG4gIGNvbnN0IGluZGljZXNTaGFwZSA9IGluZGljZXMuc2hhcGU7XG4gIGNvbnN0IHNsaWNlUmFuayA9IGluZGljZXNTaGFwZVtpbmRpY2VzU2hhcGUubGVuZ3RoIC0gMV07XG5cbiAgLy8gVGhlIHJlc3VsdCBzaGFwZSBpc1xuICAvLyAgIGluZGljZXMuc2hhcGVbOi0xXSArIHBhcmFtcy5zaGFwZVtpbmRpY2VzLnNoYXBlWy0xXTpdXG4gIGxldCBuUmVzdWx0ID0gMTtcbiAgZm9yIChsZXQgaSA9IDA7IGkgPCBpbmRpY2VzU2hhcGUubGVuZ3RoIC0gMTsgKytpKSB7XG4gICAgblJlc3VsdCAqPSBpbmRpY2VzU2hhcGVbaV07XG4gIH1cblxuICBjb25zdCBpbnB1dFNoYXBlID0gdGVuc29yLnNoYXBlO1xuXG4gIGNvbnN0IHJlc3VsdFNoYXBlID0gaW5kaWNlc1NoYXBlLnNsaWNlKCk7XG4gIHJlc3VsdFNoYXBlLnBvcCgpO1xuXG4gIGxldCBzbGljZVNpemUgPSAxO1xuICBmb3IgKGxldCBpID0gc2xpY2VSYW5rOyBpIDwgdGVuc29yUmFuazsgKytpKSB7XG4gICAgc2xpY2VTaXplICo9IGlucHV0U2hhcGVbaV07XG4gICAgcmVzdWx0U2hhcGUucHVzaChpbnB1dFNoYXBlW2ldKTtcbiAgfVxuXG4gIGNvbnN0IHN0cmlkZXMgPVxuICAgICAgWy4uLmNvbXB1dGVTdHJpZGVzKHRlbnNvci5zaGFwZSkubWFwKHN0cmlkZSA9PiBzdHJpZGUgLyBzbGljZVNpemUpLFxuICAgICAgIDFdLnNsaWNlKDAsIHNsaWNlUmFuayk7XG5cbiAgcmV0dXJuIFtyZXN1bHRTaGFwZSwgblJlc3VsdCwgc2xpY2VTaXplLCBzdHJpZGVzXTtcbn1cbiJdfQ==","/**\n * @license\n * Copyright 2018 Google LLC. All Rights Reserved.\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n * =============================================================================\n */\nimport { assert } from './util';\n/**\n * Serializable defines the serialization contract.\n *\n * TFJS requires serializable classes to return their className when asked\n * to avoid issues with minification.\n */\nexport class Serializable {\n /**\n * Return the class name for this class to use in serialization contexts.\n *\n * Generally speaking this will be the same thing that constructor.name\n * would have returned. However, the class name needs to be robust\n * against minification for serialization/deserialization to work properly.\n *\n * There's also places such as initializers.VarianceScaling, where\n * implementation details between different languages led to different\n * class hierarchies and a non-leaf node is used for serialization purposes.\n */\n getClassName() {\n return this.constructor\n .className;\n }\n /**\n * Creates an instance of T from a ConfigDict.\n *\n * This works for most descendants of serializable. A few need to\n * provide special handling.\n * @param cls A Constructor for the class to instantiate.\n * @param config The Configuration for the object.\n */\n /** @nocollapse */\n static fromConfig(cls, config) {\n return new cls(config);\n }\n}\n/**\n * Maps string keys to class constructors.\n *\n * Used during (de)serialization from the cross-language JSON format, which\n * requires the class name in the serialization format matches the class\n * names as used in Python, should it exist.\n */\nexport class SerializationMap {\n constructor() {\n this.classNameMap = {};\n }\n /**\n * Returns the singleton instance of the map.\n */\n static getMap() {\n if (SerializationMap.instance == null) {\n SerializationMap.instance = new SerializationMap();\n }\n return SerializationMap.instance;\n }\n /**\n * Registers the class as serializable.\n */\n static register(cls) {\n SerializationMap.getMap().classNameMap[cls.className] =\n [cls, cls.fromConfig];\n }\n}\n/**\n * Register a class with the serialization map of TensorFlow.js.\n *\n * This is often used for registering custom Layers, so they can be\n * serialized and deserialized.\n *\n * Example:\n *\n * ```js\n * class MyCustomLayer extends tf.layers.Layer {\n * static className = 'MyCustomLayer';\n *\n * constructor(config) {\n * super(config);\n * }\n * }\n * tf.serialization.registerClass(MyCustomLayer);\n * ```\n *\n * @param cls The class to be registered. It must have a public static member\n * called `className` defined and the value must be a non-empty string.\n *\n * @doc {heading: 'Models', subheading: 'Serialization', ignoreCI: true}\n */\nexport function registerClass(cls) {\n assert(cls.className != null, () => `Class being registered does not have the static className ` +\n `property defined.`);\n assert(typeof cls.className === 'string', () => `className is required to be a string, but got type ` +\n typeof cls.className);\n assert(cls.className.length > 0, () => `Class being registered has an empty-string as its className, ` +\n `which is disallowed.`);\n SerializationMap.register(cls);\n}\n//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic2VyaWFsaXphdGlvbi5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uL3RmanMtY29yZS9zcmMvc2VyaWFsaXphdGlvbi50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQTs7Ozs7Ozs7Ozs7Ozs7O0dBZUc7QUFFSCxPQUFPLEVBQUMsTUFBTSxFQUFDLE1BQU0sUUFBUSxDQUFDO0FBdUM5Qjs7Ozs7R0FLRztBQUNILE1BQU0sT0FBZ0IsWUFBWTtJQUNoQzs7Ozs7Ozs7OztPQVVHO0lBQ0gsWUFBWTtRQUNWLE9BQVEsSUFBSSxDQUFDLFdBQXFEO2FBQzdELFNBQVMsQ0FBQztJQUNqQixDQUFDO0lBT0Q7Ozs7Ozs7T0FPRztJQUNILGtCQUFrQjtJQUNsQixNQUFNLENBQUMsVUFBVSxDQUNiLEdBQStCLEVBQUUsTUFBa0I7UUFDckQsT0FBTyxJQUFJLEdBQUcsQ0FBQyxNQUFNLENBQUMsQ0FBQztJQUN6QixDQUFDO0NBQ0Y7QUFFRDs7Ozs7O0dBTUc7QUFDSCxNQUFNLE9BQU8sZ0JBQWdCO0lBTzNCO1FBQ0UsSUFBSSxDQUFDLFlBQVksR0FBRyxFQUFFLENBQUM7SUFDekIsQ0FBQztJQUVEOztPQUVHO0lBQ0gsTUFBTSxDQUFDLE1BQU07UUFDWCxJQUFJLGdCQUFnQixDQUFDLFFBQVEsSUFBSSxJQUFJLEVBQUU7WUFDckMsZ0JBQWdCLENBQUMsUUFBUSxHQUFHLElBQUksZ0JBQWdCLEVBQUUsQ0FBQztTQUNwRDtRQUNELE9BQU8sZ0JBQWdCLENBQUMsUUFBUSxDQUFDO0lBQ25DLENBQUM7SUFFRDs7T0FFRztJQUNILE1BQU0sQ0FBQyxRQUFRLENBQXlCLEdBQStCO1FBQ3JFLGdCQUFnQixDQUFDLE1BQU0sRUFBRSxDQUFDLFlBQVksQ0FBQyxHQUFHLENBQUMsU0FBUyxDQUFDO1lBQ2pELENBQUMsR0FBRyxFQUFFLEdBQUcsQ0FBQyxVQUFVLENBQUMsQ0FBQztJQUM1QixDQUFDO0NBQ0Y7QUFFRDs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7R0F1Qkc7QUFDSCxNQUFNLFVBQVUsYUFBYSxDQUN6QixHQUErQjtJQUNqQyxNQUFNLENBQ0YsR0FBRyxDQUFDLFNBQVMsSUFBSSxJQUFJLEVBQ3JCLEdBQUcsRUFBRSxDQUFDLDREQUE0RDtRQUM5RCxtQkFBbUIsQ0FBQyxDQUFDO0lBQzdCLE1BQU0sQ0FDRixPQUFPLEdBQUcsQ0FBQyxTQUFTLEtBQUssUUFBUSxFQUNqQyxHQUFHLEVBQUUsQ0FBQyxxREFBcUQ7UUFDdkQsT0FBTyxHQUFHLENBQUMsU0FBUyxDQUFDLENBQUM7SUFDOUIsTUFBTSxDQUNGLEdBQUcsQ0FBQyxTQUFTLENBQUMsTUFBTSxHQUFHLENBQUMsRUFDeEIsR0FBRyxFQUFFLENBQUMsK0RBQStEO1FBQ2pFLHNCQUFzQixDQUFDLENBQUM7SUFFaEMsZ0JBQWdCLENBQUMsUUFBUSxDQUFDLEdBQUcsQ0FBQyxDQUFDO0FBQ2pDLENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyIvKipcbiAqIEBsaWNlbnNlXG4gKiBDb3B5cmlnaHQgMjAxOCBHb29nbGUgTExDLiBBbGwgUmlnaHRzIFJlc2VydmVkLlxuICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlIFwiTGljZW5zZVwiKTtcbiAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS5cbiAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdFxuICpcbiAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMFxuICpcbiAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmVcbiAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuIFwiQVMgSVNcIiBCQVNJUyxcbiAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLlxuICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZFxuICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuXG4gKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuICovXG5cbmltcG9ydCB7YXNzZXJ0fSBmcm9tICcuL3V0aWwnO1xuXG4vKipcbiAqIFR5cGVzIHRvIHN1cHBvcnQgSlNPTi1lc3F1ZSBkYXRhIHN0cnVjdHVyZXMgaW50ZXJuYWxseS5cbiAqXG4gKiBJbnRlcm5hbGx5IENvbmZpZ0RpY3QncyB1c2UgY2FtZWxDYXNlIGtleXMgYW5kIHZhbHVlcyB3aGVyZSB0aGVcbiAqIHZhbHVlcyBhcmUgY2xhc3MgbmFtZXMgdG8gYmUgaW5zdGFudGlhdGVkLiAgT24gdGhlIHB5dGhvbiBzaWRlLCB0aGVzZVxuICogd2lsbCBiZSBzbmFrZV9jYXNlLiAgSW50ZXJuYWxseSB3ZSBhbGxvdyBFbnVtcyBpbnRvIHRoZSB2YWx1ZXMgZm9yIGJldHRlclxuICogdHlwZSBzYWZldHksIGJ1dCB0aGVzZSBuZWVkIHRvIGJlIGNvbnZlcnRlZCB0byByYXcgcHJpbWl0aXZlcyAodXN1YWxseVxuICogc3RyaW5ncykgZm9yIHJvdW5kLXRyaXBwaW5nIHdpdGggcHl0aG9uLlxuICpcbiAqIHRvQ29uZmlnIHJldHVybnMgdGhlIFRTLWZyaWVuZGx5IHJlcHJlc2VudGF0aW9uLiBtb2RlbC50b0pTT04oKSByZXR1cm5zXG4gKiB0aGUgcHl0aG9uaWMgdmVyc2lvbiBhcyB0aGF0J3MgdGhlIHBvcnRhYmxlIGZvcm1hdC4gIElmIHlvdSBuZWVkIHRvXG4gKiBweXRob24taWZ5IGEgbm9uLW1vZGVsIGxldmVsIHRvQ29uZmlnIG91dHB1dCwgeW91J2xsIG5lZWQgdG8gdXNlIGFcbiAqIGNvbnZlcnRUc1RvUHl0aG9uaWMgZnJvbSBzZXJpYWxpemF0aW9uX3V0aWxzIGluIC1MYXllcnMuXG4gKlxuICovXG5leHBvcnQgZGVjbGFyZSB0eXBlIENvbmZpZ0RpY3RWYWx1ZSA9XG4gICAgYm9vbGVhbiB8IG51bWJlciB8IHN0cmluZyB8IG51bGwgfCBDb25maWdEaWN0QXJyYXkgfCBDb25maWdEaWN0O1xuZXhwb3J0IGRlY2xhcmUgaW50ZXJmYWNlIENvbmZpZ0RpY3Qge1xuICBba2V5OiBzdHJpbmddOiBDb25maWdEaWN0VmFsdWU7XG59XG5leHBvcnQgZGVjbGFyZSBpbnRlcmZhY2UgQ29uZmlnRGljdEFycmF5IGV4dGVuZHMgQXJyYXk8Q29uZmlnRGljdFZhbHVlPiB7fVxuXG4vKipcbiAqIFR5cGUgdG8gcmVwcmVzZW50IHRoZSBjbGFzcy10eXBlIG9mIFNlcmlhbGl6YWJsZSBvYmplY3RzLlxuICpcbiAqIEllIHRoZSBjbGFzcyBwcm90b3R5cGUgd2l0aCBhY2Nlc3MgdG8gdGhlIGNvbnN0cnVjdG9yIGFuZCBhbnlcbiAqIHN0YXRpYyBtZW1iZXJzL21ldGhvZHMuIEluc3RhbmNlIG1ldGhvZHMgYXJlIG5vdCBsaXN0ZWQgaGVyZS5cbiAqXG4gKiBTb3VyY2UgZm9yIHRoaXMgaWRlYTogaHR0cHM6Ly9zdGFja292ZXJmbG93LmNvbS9hLzQzNjA3MjU1XG4gKi9cbmV4cG9ydCBkZWNsYXJlIHR5cGUgU2VyaWFsaXphYmxlQ29uc3RydWN0b3I8VCBleHRlbmRzIFNlcmlhbGl6YWJsZT4gPSB7XG4gIC8vIHRzbGludDpkaXNhYmxlLW5leHQtbGluZTpuby1hbnlcbiAgbmV3ICguLi5hcmdzOiBhbnlbXSk6IFQ7IGNsYXNzTmFtZTogc3RyaW5nOyBmcm9tQ29uZmlnOiBGcm9tQ29uZmlnTWV0aG9kPFQ+O1xufTtcbmV4cG9ydCBkZWNsYXJlIHR5cGUgRnJvbUNvbmZpZ01ldGhvZDxUIGV4dGVuZHMgU2VyaWFsaXphYmxlPiA9XG4gICAgKGNsczogU2VyaWFsaXphYmxlQ29uc3RydWN0b3I8VD4sIGNvbmZpZzogQ29uZmlnRGljdCkgPT4gVDtcblxuLyoqXG4gKiBTZXJpYWxpemFibGUgZGVmaW5lcyB0aGUgc2VyaWFsaXphdGlvbiBjb250cmFjdC5cbiAqXG4gKiBURkpTIHJlcXVpcmVzIHNlcmlhbGl6YWJsZSBjbGFzc2VzIHRvIHJldHVybiB0aGVpciBjbGFzc05hbWUgd2hlbiBhc2tlZFxuICogdG8gYXZvaWQgaXNzdWVzIHdpdGggbWluaWZpY2F0aW9uLlxuICovXG5leHBvcnQgYWJzdHJhY3QgY2xhc3MgU2VyaWFsaXphYmxlIHtcbiAgLyoqXG4gICAqIFJldHVybiB0aGUgY2xhc3MgbmFtZSBmb3IgdGhpcyBjbGFzcyB0byB1c2UgaW4gc2VyaWFsaXphdGlvbiBjb250ZXh0cy5cbiAgICpcbiAgICogR2VuZXJhbGx5IHNwZWFraW5nIHRoaXMgd2lsbCBiZSB0aGUgc2FtZSB0aGluZyB0aGF0IGNvbnN0cnVjdG9yLm5hbWVcbiAgICogd291bGQgaGF2ZSByZXR1cm5lZC4gIEhvd2V2ZXIsIHRoZSBjbGFzcyBuYW1lIG5lZWRzIHRvIGJlIHJvYnVzdFxuICAgKiBhZ2FpbnN0IG1pbmlmaWNhdGlvbiBmb3Igc2VyaWFsaXphdGlvbi9kZXNlcmlhbGl6YXRpb24gdG8gd29yayBwcm9wZXJseS5cbiAgICpcbiAgICogVGhlcmUncyBhbHNvIHBsYWNlcyBzdWNoIGFzIGluaXRpYWxpemVycy5WYXJpYW5jZVNjYWxpbmcsIHdoZXJlXG4gICAqIGltcGxlbWVudGF0aW9uIGRldGFpbHMgYmV0d2VlbiBkaWZmZXJlbnQgbGFuZ3VhZ2VzIGxlZCB0byBkaWZmZXJlbnRcbiAgICogY2xhc3MgaGllcmFyY2hpZXMgYW5kIGEgbm9uLWxlYWYgbm9kZSBpcyB1c2VkIGZvciBzZXJpYWxpemF0aW9uIHB1cnBvc2VzLlxuICAgKi9cbiAgZ2V0Q2xhc3NOYW1lKCk6IHN0cmluZyB7XG4gICAgcmV0dXJuICh0aGlzLmNvbnN0cnVjdG9yIGFzIFNlcmlhbGl6YWJsZUNvbnN0cnVjdG9yPFNlcmlhbGl6YWJsZT4pXG4gICAgICAgIC5jbGFzc05hbWU7XG4gIH1cblxuICAvKipcbiAgICogUmV0dXJuIGFsbCB0aGUgbm9uLXdlaWdodCBzdGF0ZSBuZWVkZWQgdG8gc2VyaWFsaXplIHRoaXMgb2JqZWN0LlxuICAgKi9cbiAgYWJzdHJhY3QgZ2V0Q29uZmlnKCk6IENvbmZpZ0RpY3Q7XG5cbiAgLyoqXG4gICAqIENyZWF0ZXMgYW4gaW5zdGFuY2Ugb2YgVCBmcm9tIGEgQ29uZmlnRGljdC5cbiAgICpcbiAgICogVGhpcyB3b3JrcyBmb3IgbW9zdCBkZXNjZW5kYW50cyBvZiBzZXJpYWxpemFibGUuICBBIGZldyBuZWVkIHRvXG4gICAqIHByb3ZpZGUgc3BlY2lhbCBoYW5kbGluZy5cbiAgICogQHBhcmFtIGNscyBBIENvbnN0cnVjdG9yIGZvciB0aGUgY2xhc3MgdG8gaW5zdGFudGlhdGUuXG4gICAqIEBwYXJhbSBjb25maWcgVGhlIENvbmZpZ3VyYXRpb24gZm9yIHRoZSBvYmplY3QuXG4gICAqL1xuICAvKiogQG5vY29sbGFwc2UgKi9cbiAgc3RhdGljIGZyb21Db25maWc8VCBleHRlbmRzIFNlcmlhbGl6YWJsZT4oXG4gICAgICBjbHM6IFNlcmlhbGl6YWJsZUNvbnN0cnVjdG9yPFQ+LCBjb25maWc6IENvbmZpZ0RpY3QpOiBUIHtcbiAgICByZXR1cm4gbmV3IGNscyhjb25maWcpO1xuICB9XG59XG5cbi8qKlxuICogTWFwcyBzdHJpbmcga2V5cyB0byBjbGFzcyBjb25zdHJ1Y3RvcnMuXG4gKlxuICogVXNlZCBkdXJpbmcgKGRlKXNlcmlhbGl6YXRpb24gZnJvbSB0aGUgY3Jvc3MtbGFuZ3VhZ2UgSlNPTiBmb3JtYXQsIHdoaWNoXG4gKiByZXF1aXJlcyB0aGUgY2xhc3MgbmFtZSBpbiB0aGUgc2VyaWFsaXphdGlvbiBmb3JtYXQgbWF0Y2hlcyB0aGUgY2xhc3NcbiAqIG5hbWVzIGFzIHVzZWQgaW4gUHl0aG9uLCBzaG91bGQgaXQgZXhpc3QuXG4gKi9cbmV4cG9ydCBjbGFzcyBTZXJpYWxpemF0aW9uTWFwIHtcbiAgcHJpdmF0ZSBzdGF0aWMgaW5zdGFuY2U6IFNlcmlhbGl6YXRpb25NYXA7XG4gIGNsYXNzTmFtZU1hcDoge1xuICAgIFtjbGFzc05hbWU6IHN0cmluZ106XG4gICAgICAgIFtTZXJpYWxpemFibGVDb25zdHJ1Y3RvcjxTZXJpYWxpemFibGU+LCBGcm9tQ29uZmlnTWV0aG9kPFNlcmlhbGl6YWJsZT5dXG4gIH07XG5cbiAgcHJpdmF0ZSBjb25zdHJ1Y3RvcigpIHtcbiAgICB0aGlzLmNsYXNzTmFtZU1hcCA9IHt9O1xuICB9XG5cbiAgLyoqXG4gICAqIFJldHVybnMgdGhlIHNpbmdsZXRvbiBpbnN0YW5jZSBvZiB0aGUgbWFwLlxuICAgKi9cbiAgc3RhdGljIGdldE1hcCgpOiBTZXJpYWxpemF0aW9uTWFwIHtcbiAgICBpZiAoU2VyaWFsaXphdGlvbk1hcC5pbnN0YW5jZSA9PSBudWxsKSB7XG4gICAgICBTZXJpYWxpemF0aW9uTWFwLmluc3RhbmNlID0gbmV3IFNlcmlhbGl6YXRpb25NYXAoKTtcbiAgICB9XG4gICAgcmV0dXJuIFNlcmlhbGl6YXRpb25NYXAuaW5zdGFuY2U7XG4gIH1cblxuICAvKipcbiAgICogUmVnaXN0ZXJzIHRoZSBjbGFzcyBhcyBzZXJpYWxpemFibGUuXG4gICAqL1xuICBzdGF0aWMgcmVnaXN0ZXI8VCBleHRlbmRzIFNlcmlhbGl6YWJsZT4oY2xzOiBTZXJpYWxpemFibGVDb25zdHJ1Y3RvcjxUPikge1xuICAgIFNlcmlhbGl6YXRpb25NYXAuZ2V0TWFwKCkuY2xhc3NOYW1lTWFwW2Nscy5jbGFzc05hbWVdID1cbiAgICAgICAgW2NscywgY2xzLmZyb21Db25maWddO1xuICB9XG59XG5cbi8qKlxuICogUmVnaXN0ZXIgYSBjbGFzcyB3aXRoIHRoZSBzZXJpYWxpemF0aW9uIG1hcCBvZiBUZW5zb3JGbG93LmpzLlxuICpcbiAqIFRoaXMgaXMgb2Z0ZW4gdXNlZCBmb3IgcmVnaXN0ZXJpbmcgY3VzdG9tIExheWVycywgc28gdGhleSBjYW4gYmVcbiAqIHNlcmlhbGl6ZWQgYW5kIGRlc2VyaWFsaXplZC5cbiAqXG4gKiBFeGFtcGxlOlxuICpcbiAqIGBgYGpzXG4gKiBjbGFzcyBNeUN1c3RvbUxheWVyIGV4dGVuZHMgdGYubGF5ZXJzLkxheWVyIHtcbiAqICAgc3RhdGljIGNsYXNzTmFtZSA9ICdNeUN1c3RvbUxheWVyJztcbiAqXG4gKiAgIGNvbnN0cnVjdG9yKGNvbmZpZykge1xuICogICAgIHN1cGVyKGNvbmZpZyk7XG4gKiAgIH1cbiAqIH1cbiAqIHRmLnNlcmlhbGl6YXRpb24ucmVnaXN0ZXJDbGFzcyhNeUN1c3RvbUxheWVyKTtcbiAqIGBgYFxuICpcbiAqIEBwYXJhbSBjbHMgVGhlIGNsYXNzIHRvIGJlIHJlZ2lzdGVyZWQuIEl0IG11c3QgaGF2ZSBhIHB1YmxpYyBzdGF0aWMgbWVtYmVyXG4gKiAgIGNhbGxlZCBgY2xhc3NOYW1lYCBkZWZpbmVkIGFuZCB0aGUgdmFsdWUgbXVzdCBiZSBhIG5vbi1lbXB0eSBzdHJpbmcuXG4gKlxuICogQGRvYyB7aGVhZGluZzogJ01vZGVscycsIHN1YmhlYWRpbmc6ICdTZXJpYWxpemF0aW9uJywgaWdub3JlQ0k6IHRydWV9XG4gKi9cbmV4cG9ydCBmdW5jdGlvbiByZWdpc3RlckNsYXNzPFQgZXh0ZW5kcyBTZXJpYWxpemFibGU+KFxuICAgIGNsczogU2VyaWFsaXphYmxlQ29uc3RydWN0b3I8VD4pIHtcbiAgYXNzZXJ0KFxuICAgICAgY2xzLmNsYXNzTmFtZSAhPSBudWxsLFxuICAgICAgKCkgPT4gYENsYXNzIGJlaW5nIHJlZ2lzdGVyZWQgZG9lcyBub3QgaGF2ZSB0aGUgc3RhdGljIGNsYXNzTmFtZSBgICtcbiAgICAgICAgICBgcHJvcGVydHkgZGVmaW5lZC5gKTtcbiAgYXNzZXJ0KFxuICAgICAgdHlwZW9mIGNscy5jbGFzc05hbWUgPT09ICdzdHJpbmcnLFxuICAgICAgKCkgPT4gYGNsYXNzTmFtZSBpcyByZXF1aXJlZCB0byBiZSBhIHN0cmluZywgYnV0IGdvdCB0eXBlIGAgK1xuICAgICAgICAgIHR5cGVvZiBjbHMuY2xhc3NOYW1lKTtcbiAgYXNzZXJ0KFxuICAgICAgY2xzLmNsYXNzTmFtZS5sZW5ndGggPiAwLFxuICAgICAgKCkgPT4gYENsYXNzIGJlaW5nIHJlZ2lzdGVyZWQgaGFzIGFuIGVtcHR5LXN0cmluZyBhcyBpdHMgY2xhc3NOYW1lLCBgICtcbiAgICAgICAgICBgd2hpY2ggaXMgZGlzYWxsb3dlZC5gKTtcblxuICBTZXJpYWxpemF0aW9uTWFwLnJlZ2lzdGVyKGNscyk7XG59XG4iXX0=","/**\n * @license\n * Copyright 2017 Google LLC. All Rights Reserved.\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n * =============================================================================\n */\nimport { ENGINE } from './engine';\nimport { inferShape } from './tensor_util_env';\nimport { arraysEqual, encodeString, flatten, isString, isTypedArray } from './util';\nconst TEST_EPSILON_FLOAT32 = 1e-3;\nexport const TEST_EPSILON_FLOAT16 = 1e-1;\nexport function expectArraysClose(actual, expected, epsilon) {\n if (epsilon == null) {\n epsilon = testEpsilon();\n }\n return expectArraysPredicate(actual, expected, (a, b) => areClose(a, b, epsilon));\n}\nexport function testEpsilon() {\n return ENGINE.backend.floatPrecision() === 32 ? TEST_EPSILON_FLOAT32 :\n TEST_EPSILON_FLOAT16;\n}\nfunction expectArraysPredicate(actual, expected, predicate) {\n let checkClassType = true;\n if (isTypedArray(actual) || isTypedArray(expected)) {\n checkClassType = false;\n }\n if (isTypedArray(actual) && isTypedArray(expected)) {\n checkClassType = true;\n }\n if (checkClassType) {\n const aType = actual.constructor.name;\n const bType = expected.constructor.name;\n if (aType !== bType) {\n throw new Error(`Arrays are of different type. Actual: ${aType}. ` +\n `Expected: ${bType}`);\n }\n }\n if (Array.isArray(actual) && Array.isArray(expected)) {\n const actualShape = inferShape(actual);\n const expectedShape = inferShape(expected);\n if (!arraysEqual(actualShape, expectedShape)) {\n throw new Error(`Arrays have different shapes. ` +\n `Actual: [${actualShape}]. Expected: [${expectedShape}]`);\n }\n }\n const actualFlat = isTypedArray(actual) ? actual : flatten(actual);\n const expectedFlat = isTypedArray(expected) ?\n expected :\n flatten(expected);\n if (actualFlat.length !== expectedFlat.length) {\n throw new Error(`Arrays have different lengths actual: ${actualFlat.length} vs ` +\n `expected: ${expectedFlat.length}.\\n` +\n `Actual: ${actualFlat}.\\n` +\n `Expected: ${expectedFlat}.`);\n }\n for (let i = 0; i < expectedFlat.length; ++i) {\n const a = actualFlat[i];\n const e = expectedFlat[i];\n if (!predicate(a, e)) {\n throw new Error(`Arrays differ: actual[${i}] = ${a}, expected[${i}] = ${e}.\\n` +\n `Actual: ${actualFlat}.\\n` +\n `Expected: ${expectedFlat}.`);\n }\n }\n if (typeof expect !== 'undefined') {\n expect().nothing();\n }\n}\nexport function expectPromiseToFail(fn, done) {\n fn().then(() => done.fail(), () => done());\n if (typeof expect !== 'undefined') {\n expect().nothing();\n }\n}\nexport function expectArraysEqual(actual, expected) {\n const exp = typeof expected === 'string' || typeof expected === 'number' ||\n typeof expected === 'boolean' ?\n [expected] :\n expected;\n if (isString(actual) || isString(actual[0]) ||\n isString(expected) || isString(expected[0])) {\n // tslint:disable-next-line: triple-equals\n return expectArraysPredicate(actual, exp, (a, b) => a == b);\n }\n return expectArraysPredicate(actual, expected, (a, b) => areClose(a, b, 0));\n}\nexport function expectNumbersClose(a, e, epsilon) {\n if (epsilon == null) {\n epsilon = testEpsilon();\n }\n if (!areClose(a, e, epsilon)) {\n throw new Error(`Numbers differ: actual === ${a}, expected === ${e}`);\n }\n if (typeof expect !== 'undefined') {\n expect().nothing();\n }\n}\nfunction areClose(a, e, epsilon) {\n if (!isFinite(a) && !isFinite(e)) {\n return true;\n }\n if (isNaN(a) || isNaN(e) || Math.abs(a - e) > epsilon) {\n return false;\n }\n return true;\n}\nexport function expectValuesInRange(actual, low, high) {\n for (let i = 0; i < actual.length; i++) {\n if (actual[i] < low || actual[i] > high) {\n throw new Error(`Value out of range:${actual[i]} low: ${low}, high: ${high}`);\n }\n }\n}\nexport function expectArrayBuffersEqual(actual, expected) {\n // Safari does not like comparing ArrayBuffers directly. Wrapping in\n // a Float32Array solves this issue.\n const actualArray = new Float32Array(actual);\n const expectedArray = new Float32Array(expected);\n if (actualArray.length !== expectedArray.length) {\n throw new Error('Expected ArrayBuffer to be of length ' +\n `${expectedArray.length}, but it was ${actualArray.length}`);\n }\n for (let i = 0; i < expectedArray.length; i++) {\n if (actualArray[i] !== expectedArray[i]) {\n throw new Error(`Expected ArrayBuffer value at ${i} to be ` +\n `${expectedArray[i]} but got ${actualArray[i]} instead`);\n }\n }\n}\n/** Encodes strings into utf-8 bytes. */\nexport function encodeStrings(a) {\n for (let i = 0; i < a.length; i++) {\n const val = a[i];\n if (Array.isArray(val)) {\n encodeStrings(val);\n }\n else {\n a[i] = encodeString(val);\n }\n }\n return a;\n}\n/** Creates an HTMLVideoElement with autoplay-friendly default settings. */\nexport function createVideoElement(source) {\n const video = document.createElement('video');\n if ('playsInline' in video) {\n // tslint:disable-next-line:no-any\n video.playsInline = true;\n }\n video.muted = true;\n video.loop = true;\n video.style.position = 'fixed';\n video.style.left = '0px';\n video.style.top = '0px';\n video.preload = 'auto';\n video.appendChild(source);\n return new Promise(resolve => {\n video.addEventListener('loadeddata', _ => resolve(video));\n video.load();\n });\n}\nexport async function play(video) {\n await video.play();\n if ('requestVideoFrameCallback' in video) {\n await new Promise(resolve => {\n // tslint:disable-next-line:no-any\n video.requestVideoFrameCallback(resolve);\n });\n }\n}\n//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidGVzdF91dGlsLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vdGZqcy1jb3JlL3NyYy90ZXN0X3V0aWwudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUE7Ozs7Ozs7Ozs7Ozs7OztHQWVHO0FBRUgsT0FBTyxFQUFDLE1BQU0sRUFBQyxNQUFNLFVBQVUsQ0FBQztBQUNoQyxPQUFPLEVBQUMsVUFBVSxFQUFDLE1BQU0sbUJBQW1CLENBQUM7QUFFN0MsT0FBTyxFQUFDLFdBQVcsRUFBRSxZQUFZLEVBQUUsT0FBTyxFQUFFLFFBQVEsRUFBRSxZQUFZLEVBQUMsTUFBTSxRQUFRLENBQUM7QUFFbEYsTUFBTSxvQkFBb0IsR0FBRyxJQUFJLENBQUM7QUFDbEMsTUFBTSxDQUFDLE1BQU0sb0JBQW9CLEdBQUcsSUFBSSxDQUFDO0FBRXpDLE1BQU0sVUFBVSxpQkFBaUIsQ0FDN0IsTUFBZ0QsRUFDaEQsUUFBa0QsRUFBRSxPQUFnQjtJQUN0RSxJQUFJLE9BQU8sSUFBSSxJQUFJLEVBQUU7UUFDbkIsT0FBTyxHQUFHLFdBQVcsRUFBRSxDQUFDO0tBQ3pCO0lBQ0QsT0FBTyxxQkFBcUIsQ0FDeEIsTUFBTSxFQUFFLFFBQVEsRUFBRSxDQUFDLENBQUMsRUFBRSxDQUFDLEVBQUUsRUFBRSxDQUFDLFFBQVEsQ0FBQyxDQUFXLEVBQUUsQ0FBVyxFQUFFLE9BQU8sQ0FBQyxDQUFDLENBQUM7QUFDL0UsQ0FBQztBQUVELE1BQU0sVUFBVSxXQUFXO0lBQ3pCLE9BQU8sTUFBTSxDQUFDLE9BQU8sQ0FBQyxjQUFjLEVBQUUsS0FBSyxFQUFFLENBQUMsQ0FBQyxDQUFDLG9CQUFvQixDQUFDLENBQUM7UUFDdEIsb0JBQW9CLENBQUM7QUFDdkUsQ0FBQztBQUVELFNBQVMscUJBQXFCLENBQzFCLE1BQWtCLEVBQUUsUUFBb0IsRUFDeEMsU0FBb0M7SUFDdEMsSUFBSSxjQUFjLEdBQUcsSUFBSSxDQUFDO0lBQzFCLElBQUksWUFBWSxDQUFDLE1BQU0s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QUFJLENBQUM7S0FDbkM7SUFDRCxLQUFLLENBQUMsS0FBSyxHQUFHLElBQUksQ0FBQztJQUNuQixLQUFLLENBQUMsSUFBSSxHQUFHLElBQUksQ0FBQztJQUNsQixLQUFLLENBQUMsS0FBSyxDQUFDLFFBQVEsR0FBRyxPQUFPLENBQUM7SUFDL0IsS0FBSyxDQUFDLEtBQUssQ0FBQyxJQUFJLEdBQUcsS0FBSyxDQUFDO0lBQ3pCLEtBQUssQ0FBQyxLQUFLLENBQUMsR0FBRyxHQUFHLEtBQUssQ0FBQztJQUV4QixLQUFLLENBQUMsT0FBTyxHQUFHLE1BQU0sQ0FBQztJQUN2QixLQUFLLENBQUMsV0FBVyxDQUFDLE1BQU0sQ0FBQyxDQUFDO0lBQzFCLE9BQU8sSUFBSSxPQUFPLENBQUMsT0FBTyxDQUFDLEVBQUU7UUFDM0IsS0FBSyxDQUFDLGdCQUFnQixDQUFDLFlBQVksRUFBRSxDQUFDLENBQUMsRUFBRSxDQUFDLE9BQU8sQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDO1FBQzFELEtBQUssQ0FBQyxJQUFJLEVBQUUsQ0FBQztJQUNmLENBQUMsQ0FBQyxDQUFDO0FBQ0wsQ0FBQztBQUVELE1BQU0sQ0FBQyxLQUFLLFVBQVUsSUFBSSxDQUFDLEtBQXVCO0lBQ2hELE1BQU0sS0FBSyxDQUFDLElBQUksRUFBRSxDQUFDO0lBQ25CLElBQUksMkJBQTJCLElBQUksS0FBSyxFQUFFO1FBQ3hDLE1BQU0sSUFBSSxPQUFPLENBQUMsT0FBTyxDQUFDLEVBQUU7WUFDMUIsa0NBQWtDO1lBQ2pDLEtBQWEsQ0FBQyx5QkFBeUIsQ0FBQyxPQUFPLENBQUMsQ0FBQztRQUNwRCxDQUFDLENBQUMsQ0FBQztLQUNKO0FBQ0gsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbIi8qKlxuICogQGxpY2Vuc2VcbiAqIENvcHlyaWdodCAyMDE3IEdvb2dsZSBMTEMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuXG4gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgXCJMaWNlbnNlXCIpO1xuICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLlxuICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0XG4gKlxuICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wXG4gKlxuICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZVxuICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gXCJBUyBJU1wiIEJBU0lTLFxuICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuXG4gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kXG4gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS5cbiAqID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4gKi9cblxuaW1wb3J0IHtFTkdJTkV9IGZyb20gJy4vZW5naW5lJztcbmltcG9ydCB7aW5mZXJTaGFwZX0gZnJvbSAnLi90ZW5zb3JfdXRpbF9lbnYnO1xuaW1wb3J0IHtSZWN1cnNpdmVBcnJheSwgVGVuc29yTGlrZSwgVHlwZWRBcnJheX0gZnJvbSAnLi90eXBlcyc7XG5pbXBvcnQge2FycmF5c0VxdWFsLCBlbmNvZGVTdHJpbmcsIGZsYXR0ZW4sIGlzU3RyaW5nLCBpc1R5cGVkQXJyYXl9IGZyb20gJy4vdXRpbCc7XG5cbmNvbnN0IFRFU1RfRVBTSUxPTl9GTE9BVDMyID0gMWUtMztcbmV4cG9ydCBjb25zdCBURVNUX0VQU0lMT05fRkxPQVQxNiA9IDFlLTE7XG5cbmV4cG9ydCBmdW5jdGlvbiBleHBlY3RBcnJheXNDbG9zZShcbiAgICBhY3R1YWw6IFR5cGVkQXJyYXl8bnVtYmVyfFJlY3Vyc2l2ZUFycmF5PG51bWJlcj4sXG4gICAgZXhwZWN0ZWQ6IFR5cGVkQXJyYXl8bnVtYmVyfFJlY3Vyc2l2ZUFycmF5PG51bWJlcj4sIGVwc2lsb24/OiBudW1iZXIpIHtcbiAgaWYgKGVwc2lsb24gPT0gbnVsbCkge1xuICAgIGVwc2lsb24gPSB0ZXN0RXBzaWxvbigpO1xuICB9XG4gIHJldHVybiBleHBlY3RBcnJheXNQcmVkaWNhdGUoXG4gICAgICBhY3R1YWwsIGV4cGVjdGVkLCAoYSwgYikgPT4gYXJlQ2xvc2UoYSBhcyBudW1iZXIsIGIgYXMgbnVtYmVyLCBlcHNpbG9uKSk7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiB0ZXN0RXBzaWxvbigpIHtcbiAgcmV0dXJuIEVOR0lORS5iYWNrZW5kLmZsb2F0UHJlY2lzaW9uKCkgPT09IDMyID8gVEVTVF9FUFNJTE9OX0ZMT0FUMzIgOlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBURVNUX0VQU0lMT05fRkxPQVQxNjtcbn1cblxuZnVuY3Rpb24gZXhwZWN0QXJyYXlzUHJlZGljYXRlKFxuICAgIGFjdHVhbDogVGVuc29yTGlrZSwgZXhwZWN0ZWQ6IFRlbnNvckxpa2UsXG4gICAgcHJlZGljYXRlOiAoYToge30sIGI6IHt9KSA9PiBib29sZWFuKSB7XG4gIGxldCBjaGVja0NsYXNzVHlwZSA9IHRydWU7XG4gIGlmIChpc1R5cGVkQXJyYXkoYWN0dWFsKSB8fCBpc1R5cGVkQXJyYXkoZXhwZWN0ZWQpKSB7XG4gICAgY2hlY2tDbGFzc1R5cGUgPSBmYWxzZTtcbiAgfVxuICBpZiAoaXNUeXBlZEFycmF5KGFjdHVhbCkgJiYgaXNUeXBlZEFycmF5KGV4cGVjdGVkKSkge1xuICAgIGNoZWNrQ2xhc3NUeXBlID0gdHJ1ZTtcbiAgfVxuICBpZiAoY2hlY2tDbGFzc1R5cGUpIHtcbiAgICBjb25zdCBhVHlwZSA9IGFjdHVhbC5jb25zdHJ1Y3Rvci5uYW1lO1xuICAgIGNvbnN0IGJUeXBlID0gZXhwZWN0ZWQuY29uc3RydWN0b3IubmFtZTtcblxuICAgIGlmIChhVHlwZSAhPT0gYlR5cGUpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcihcbiAgICAgICAgICBgQXJyYXlzIGFyZSBvZiBkaWZmZXJlbnQgdHlwZS4gQWN0dWFsOiAke2FUeXBlfS4gYCArXG4gICAgICAgICAgYEV4cGVjdGVkOiAke2JUeXBlfWApO1xuICAgIH1cbiAgfVxuXG4gIGlmIChBcnJheS5pc0FycmF5KGFjdHVhbCkgJiYgQXJyYXkuaXNBcnJheShleHBlY3RlZCkpIHtcbiAgICBjb25zdCBhY3R1YWxTaGFwZSA9IGluZmVyU2hhcGUoYWN0dWFsKTtcbiAgICBjb25zdCBleHBlY3RlZFNoYXBlID0gaW5mZXJTaGFwZShleHBlY3RlZCk7XG4gICAgaWYgKCFhcnJheXNFcXVhbChhY3R1YWxTaGFwZSwgZXhwZWN0ZWRTaGFwZSkpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcihcbiAgICAgICAgICBgQXJyYXlzIGhhdmUgZGlmZmVyZW50IHNoYXBlcy4gYCArXG4gICAgICAgICAgYEFjdHVhbDogWyR7YWN0dWFsU2hhcGV9XS4gRXhwZWN0ZWQ6IFske2V4cGVjdGVkU2hhcGV9XWApO1xuICAgIH1cbiAgfVxuXG4gIGNvbnN0IGFjdHVhbEZsYXQgPVxuICAgICAgaXNUeXBlZEFycmF5KGFjdHVhbCkgPyBhY3R1YWwgOiBmbGF0dGVuKGFjdHVhbCBhcyBSZWN1cnNpdmVBcnJheTxudW1iZXI+KTtcbiAgY29uc3QgZXhwZWN0ZWRGbGF0ID0gaXNUeXBlZEFycmF5KGV4cGVjdGVkKSA/XG4gICAgICBleHBlY3RlZCA6XG4gICAgICBmbGF0dGVuKGV4cGVjdGVkIGFzIFJlY3Vyc2l2ZUFycmF5PG51bWJlcj4pO1xuXG4gIGlmIChhY3R1YWxGbGF0Lmxlbmd0aCAhPT0gZXhwZWN0ZWRGbGF0Lmxlbmd0aCkge1xuICAgIHRocm93IG5ldyBFcnJvcihcbiAgICAgICAgYEFycmF5cyBoYXZlIGRpZmZlcmVudCBsZW5ndGhzIGFjdHVhbDogJHthY3R1YWxGbGF0Lmxlbmd0aH0gdnMgYCArXG4gICAgICAgIGBleHBlY3RlZDogJHtleHBlY3RlZEZsYXQubGVuZ3RofS5cXG5gICtcbiAgICAgICAgYEFjdHVhbDogICAke2FjdHVhbEZsYXR9LlxcbmAgK1xuICAgICAgICBgRXhwZWN0ZWQ6ICR7ZXhwZWN0ZWRGbGF0fS5gKTtcbiAgfVxuICBmb3IgKGxldCBpID0gMDsgaSA8IGV4cGVjdGVkRmxhdC5sZW5ndGg7ICsraSkge1xuICAgIGNvbnN0IGEgPSBhY3R1YWxGbGF0W2ldO1xuICAgIGNvbnN0IGUgPSBleHBlY3RlZEZsYXRbaV07XG5cbiAgICBpZiAoIXByZWRpY2F0ZShhLCBlKSkge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKFxuICAgICAgICAgIGBBcnJheXMgZGlmZmVyOiBhY3R1YWxbJHtpfV0gPSAke2F9LCBleHBlY3RlZFske2l9XSA9ICR7ZX0uXFxuYCArXG4gICAgICAgICAgYEFjdHVhbDogICAke2FjdHVhbEZsYXR9LlxcbmAgK1xuICAgICAgICAgIGBFeHBlY3RlZDogJHtleHBlY3RlZEZsYXR9LmApO1xuICAgIH1cbiAgfVxuICBpZiAodHlwZW9mIGV4cGVjdCAhPT0gJ3VuZGVmaW5lZCcpIHtcbiAgICBleHBlY3QoKS5ub3RoaW5nKCk7XG4gIH1cbn1cblxuZXhwb3J0IGludGVyZmFjZSBEb25lRm4ge1xuICAoKTogdm9pZDtcbiAgZmFpbDogKG1lc3NhZ2U/OiBFcnJvcnxzdHJpbmcpID0+IHZvaWQ7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBleHBlY3RQcm9taXNlVG9GYWlsKGZuOiAoKSA9PiBQcm9taXNlPHt9PiwgZG9uZTogRG9uZUZuKTogdm9pZCB7XG4gIGZuKCkudGhlbigoKSA9PiBkb25lLmZhaWwoKSwgKCkgPT4gZG9uZSgpKTtcbiAgaWYgKHR5cGVvZiBleHBlY3QgIT09ICd1bmRlZmluZWQnKSB7XG4gICAgZXhwZWN0KCkubm90aGluZygpO1xuICB9XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBleHBlY3RBcnJheXNFcXVhbChhY3R1YWw6IFRlbnNvckxpa2UsIGV4cGVjdGVkOiBUZW5zb3JMaWtlKSB7XG4gIGNvbnN0IGV4cCA9IHR5cGVvZiBleHBlY3RlZCA9PT0gJ3N0cmluZycgfHwgdHlwZW9mIGV4cGVjdGVkID09PSAnbnVtYmVyJyB8fFxuICAgICAgICAgIHR5cGVvZiBleHBlY3RlZCA9PT0gJ2Jvb2xlYW4nID9cbiAgICAgIFtleHBlY3RlZF0gYXMgbnVtYmVyW10gOlxuICAgICAgZXhwZWN0ZWQgYXMgbnVtYmVyW107XG4gIGlmIChpc1N0cmluZyhhY3R1YWwpIHx8IGlzU3RyaW5nKChhY3R1YWwgYXMgc3RyaW5nW10pWzBdKSB8fFxuICAgICAgaXNTdHJpbmcoZXhwZWN0ZWQpIHx8IGlzU3RyaW5nKChleHBlY3RlZCBhcyBzdHJpbmdbXSlbMF0pKSB7XG4gICAgLy8gdHNsaW50OmRpc2FibGUtbmV4dC1saW5lOiB0cmlwbGUtZXF1YWxzXG4gICAgcmV0dXJuIGV4cGVjdEFycmF5c1ByZWRpY2F0ZShhY3R1YWwsIGV4cCwgKGEsIGIpID0+IGEgPT0gYik7XG4gIH1cbiAgcmV0dXJuIGV4cGVjdEFycmF5c1ByZWRpY2F0ZShcbiAgICAgIGFjdHVhbCwgZXhwZWN0ZWQsIChhLCBiKSA9PiBhcmVDbG9zZShhIGFzIG51bWJlciwgYiBhcyBudW1iZXIsIDApKTtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGV4cGVjdE51bWJlcnNDbG9zZShhOiBudW1iZXIsIGU6IG51bWJlciwgZXBzaWxvbj86IG51bWJlcikge1xuICBpZiAoZXBzaWxvbiA9PSBudWxsKSB7XG4gICAgZXBzaWxvbiA9IHRlc3RFcHNpbG9uKCk7XG4gIH1cbiAgaWYgKCFhcmVDbG9zZShhLCBlLCBlcHNpbG9uKSkge1xuICAgIHRocm93IG5ldyBFcnJvcihgTnVtYmVycyBkaWZmZXI6IGFjdHVhbCA9PT0gJHthfSwgZXhwZWN0ZWQgPT09ICR7ZX1gKTtcbiAgfVxuICBpZiAodHlwZW9mIGV4cGVjdCAhPT0gJ3VuZGVmaW5lZCcpIHtcbiAgICBleHBlY3QoKS5ub3RoaW5nKCk7XG4gIH1cbn1cblxuZnVuY3Rpb24gYXJlQ2xvc2UoYTogbnVtYmVyLCBlOiBudW1iZXIsIGVwc2lsb246IG51bWJlcik6IGJvb2xlYW4ge1xuICBpZiAoIWlzRmluaXRlKGEpICYmICFpc0Zpbml0ZShlKSkge1xuICAgIHJldHVybiB0cnVlO1xuICB9XG4gIGlmIChpc05hTihhKSB8fCBpc05hTihlKSB8fCBNYXRoLmFicyhhIC0gZSkgPiBlcHNpbG9uKSB7XG4gICAgcmV0dXJuIGZhbHNlO1xuICB9XG4gIHJldHVybiB0cnVlO1xufVxuXG5leHBvcnQgZnVuY3Rpb24gZXhwZWN0VmFsdWVzSW5SYW5nZShcbiAgICBhY3R1YWw6IFR5cGVkQXJyYXl8bnVtYmVyW10sIGxvdzogbnVtYmVyLCBoaWdoOiBudW1iZXIpIHtcbiAgZm9yIChsZXQgaSA9IDA7IGkgPCBhY3R1YWwubGVuZ3RoOyBpKyspIHtcbiAgICBpZiAoYWN0dWFsW2ldIDwgbG93IHx8IGFjdHVhbFtpXSA+IGhpZ2gpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcihcbiAgICAgICAgICBgVmFsdWUgb3V0IG9mIHJhbmdlOiR7YWN0dWFsW2ldfSBsb3c6ICR7bG93fSwgaGlnaDogJHtoaWdofWApO1xuICAgIH1cbiAgfVxufVxuXG5leHBvcnQgZnVuY3Rpb24gZXhwZWN0QXJyYXlCdWZmZXJzRXF1YWwoXG4gICAgYWN0dWFsOiBBcnJheUJ1ZmZlciwgZXhwZWN0ZWQ6IEFycmF5QnVmZmVyKSB7XG4gIC8vIFNhZmFyaSBkb2VzIG5vdCBsaWtlIGNvbXBhcmluZyBBcnJheUJ1ZmZlcnMgZGlyZWN0bHkuIFdyYXBwaW5nIGluXG4gIC8vIGEgRmxvYXQzMkFycmF5IHNvbHZlcyB0aGlzIGlzc3VlLlxuICBjb25zdCBhY3R1YWxBcnJheSA9IG5ldyBGbG9hdDMyQXJyYXkoYWN0dWFsKTtcbiAgY29uc3QgZXhwZWN0ZWRBcnJheSA9IG5ldyBGbG9hdDMyQXJyYXkoZXhwZWN0ZWQpO1xuICBpZiAoYWN0dWFsQXJyYXkubGVuZ3RoICE9PSBleHBlY3RlZEFycmF5Lmxlbmd0aCkge1xuICAgIHRocm93IG5ldyBFcnJvcihcbiAgICAgICAgJ0V4cGVjdGVkIEFycmF5QnVmZmVyIHRvIGJlIG9mIGxlbmd0aCAnICtcbiAgICAgICAgYCR7ZXhwZWN0ZWRBcnJheS5sZW5ndGh9LCBidXQgaXQgd2FzICR7YWN0dWFsQXJyYXkubGVuZ3RofWApO1xuICB9XG5cbiAgZm9yIChsZXQgaSA9IDA7IGkgPCBleHBlY3RlZEFycmF5Lmxlbmd0aDsgaSsrKSB7XG4gICAgaWYgKGFjdHVhbEFycmF5W2ldICE9PSBleHBlY3RlZEFycmF5W2ldKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoXG4gICAgICAgICAgYEV4cGVjdGVkIEFycmF5QnVmZmVyIHZhbHVlIGF0ICR7aX0gdG8gYmUgYCArXG4gICAgICAgICAgYCR7ZXhwZWN0ZWRBcnJheVtpXX0gYnV0IGdvdCAke2FjdHVhbEFycmF5W2ldfSBpbnN0ZWFkYCk7XG4gICAgfVxuICB9XG59XG5cbi8qKiBFbmNvZGVzIHN0cmluZ3MgaW50byB1dGYtOCBieXRlcy4gKi9cbmV4cG9ydCBmdW5jdGlvbiBlbmNvZGVTdHJpbmdzKGE6IFJlY3Vyc2l2ZUFycmF5PHt9Pik6XG4gICAgUmVjdXJzaXZlQXJyYXk8VWludDhBcnJheT4ge1xuICBmb3IgKGxldCBpID0gMDsgaSA8IChhIGFzIEFycmF5PHt9PikubGVuZ3RoOyBpKyspIHtcbiAgICBjb25zdCB2YWwgPSBhW2ldO1xuICAgIGlmIChBcnJheS5pc0FycmF5KHZhbCkpIHtcbiAgICAgIGVuY29kZVN0cmluZ3ModmFsKTtcbiAgICB9IGVsc2Uge1xuICAgICAgYVtpXSA9IGVuY29kZVN0cmluZyh2YWwgYXMgc3RyaW5nKTtcbiAgICB9XG4gIH1cbiAgcmV0dXJuIGEgYXMgUmVjdXJzaXZlQXJyYXk8VWludDhBcnJheT47XG59XG5cbi8qKiBDcmVhdGVzIGFuIEhUTUxWaWRlb0VsZW1lbnQgd2l0aCBhdXRvcGxheS1mcmllbmRseSBkZWZhdWx0IHNldHRpbmdzLiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGNyZWF0ZVZpZGVvRWxlbWVudChzb3VyY2U6IEhUTUxTb3VyY2VFbGVtZW50KTpcbiAgICBQcm9taXNlPEhUTUxWaWRlb0VsZW1lbnQ+IHtcbiAgY29uc3QgdmlkZW8gPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCd2aWRlbycpO1xuICBpZiAoJ3BsYXlzSW5saW5lJyBpbiB2aWRlbykge1xuICAgIC8vIHRzbGludDpkaXNhYmxlLW5leHQtbGluZTpuby1hbnlcbiAgICAodmlkZW8gYXMgYW55KS5wbGF5c0lubGluZSA9IHRydWU7XG4gIH1cbiAgdmlkZW8ubXV0ZWQgPSB0cnVlO1xuICB2aWRlby5sb29wID0gdHJ1ZTtcbiAgdmlkZW8uc3R5bGUucG9zaXRpb24gPSAnZml4ZWQnO1xuICB2aWRlby5zdHlsZS5sZWZ0ID0gJzBweCc7XG4gIHZpZGVvLnN0eWxlLnRvcCA9ICcwcHgnO1xuXG4gIHZpZGVvLnByZWxvYWQgPSAnYXV0byc7XG4gIHZpZGVvLmFwcGVuZENoaWxkKHNvdXJjZSk7XG4gIHJldHVybiBuZXcgUHJvbWlzZShyZXNvbHZlID0+IHtcbiAgICB2aWRlby5hZGRFdmVudExpc3RlbmVyKCdsb2FkZWRkYXRhJywgXyA9PiByZXNvbHZlKHZpZGVvKSk7XG4gICAgdmlkZW8ubG9hZCgpO1xuICB9KTtcbn1cblxuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIHBsYXkodmlkZW86IEhUTUxWaWRlb0VsZW1lbnQpIHtcbiAgYXdhaXQgdmlkZW8ucGxheSgpO1xuICBpZiAoJ3JlcXVlc3RWaWRlb0ZyYW1lQ2FsbGJhY2snIGluIHZpZGVvKSB7XG4gICAgYXdhaXQgbmV3IFByb21pc2UocmVzb2x2ZSA9PiB7XG4gICAgICAvLyB0c2xpbnQ6ZGlzYWJsZS1uZXh0LWxpbmU6bm8tYW55XG4gICAgICAodmlkZW8gYXMgYW55KS5yZXF1ZXN0VmlkZW9GcmFtZUNhbGxiYWNrKHJlc29sdmUpO1xuICAgIH0pO1xuICB9XG59XG4iXX0=","/** @license See the LICENSE file. */\n// This code is auto-generated, do not modify this file!\nconst version = '3.21.0';\nexport { version };\n//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidmVyc2lvbi5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uL3RmanMtY29yZS9zcmMvdmVyc2lvbi50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxxQ0FBcUM7QUFFckMsd0RBQXdEO0FBQ3hELE1BQU0sT0FBTyxHQUFHLFFBQVEsQ0FBQztBQUN6QixPQUFPLEVBQUMsT0FBTyxFQUFDLENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyIvKiogQGxpY2Vuc2UgU2VlIHRoZSBMSUNFTlNFIGZpbGUuICovXG5cbi8vIFRoaXMgY29kZSBpcyBhdXRvLWdlbmVyYXRlZCwgZG8gbm90IG1vZGlmeSB0aGlzIGZpbGUhXG5jb25zdCB2ZXJzaW9uID0gJzMuMjEuMCc7XG5leHBvcnQge3ZlcnNpb259O1xuIl19","/**\n * @license\n * Copyright 2018 Google LLC. All Rights Reserved.\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n * =============================================================================\n */\nimport { dispose } from '../globals';\nimport { variableGrads } from '../gradients';\nimport { scalar } from '../ops/ops';\nimport { Serializable } from '../serialization';\n/** @doc {heading: 'Training', subheading: 'Classes', namespace: 'train'} */\nexport class Optimizer extends Serializable {\n /**\n * Executes `f()` and minimizes the scalar output of `f()` by computing\n * gradients of y with respect to the list of trainable variables provided by\n * `varList`. If no list is provided, it defaults to all trainable variables.\n *\n * @param f The function to execute and whose output to minimize.\n * @param returnCost Whether to return the scalar cost value produced by\n * executing `f()`.\n * @param varList An optional list of variables to update. If specified, only\n * the trainable variables in varList will be updated by minimize. Defaults to\n * all trainable variables.\n *\n * @doc {heading: 'Training', subheading: 'Optimizers'}\n */\n minimize(f, returnCost = false, varList) {\n const { value, grads } = this.computeGradients(f, varList);\n if (varList != null) {\n const gradArray = varList.map(v => ({ name: v.name, tensor: grads[v.name] }));\n this.applyGradients(gradArray);\n }\n else {\n this.applyGradients(grads);\n }\n // Dispose gradients.\n dispose(grads);\n if (returnCost) {\n return value;\n }\n else {\n value.dispose();\n return null;\n }\n }\n /**\n * The number of iterations that this optimizer instance has been invoked for.\n */\n get iterations() {\n if (this.iterations_ == null) {\n this.iterations_ = 0;\n }\n return this.iterations_;\n }\n incrementIterations() {\n this.iterations_ = this.iterations + 1;\n }\n /**\n * Executes f() and computes the gradient of the scalar output of f() with\n * respect to the list of trainable variables provided by `varList`. If no\n * list is provided, it defaults to all trainable variables.\n *\n * @param f The function to execute and whose output to use for computing\n * gradients with respect to variables.\n * @param varList An optional list of variables to compute gradients with\n * respect to. If specified, only the trainable variables in varList will have\n * gradients computed with respect to. Defaults to all trainable variables.\n *\n * @doc {heading: 'Training', subheading: 'Optimizers'}\n */\n computeGradients(f, varList) {\n return variableGrads(f, varList);\n }\n /**\n * Dispose the variables (if any) owned by this optimizer instance.\n */\n dispose() {\n if (this.iterations_ != null) {\n dispose(this.iterations_);\n }\n }\n async saveIterations() {\n if (this.iterations_ == null) {\n this.iterations_ = 0;\n }\n return {\n name: 'iter',\n // TODO(cais): Use 'int64' type when available.\n tensor: scalar(this.iterations_, 'int32')\n };\n }\n async getWeights() {\n throw new Error('getWeights() is not implemented for this optimizer yet.');\n }\n async setWeights(weightValues) {\n throw new Error(`setWeights() is not implemented for this optimizer class ` +\n `${this.getClassName()}`);\n }\n /**\n * Extract the first element of the weight values and set it\n * as the iterations counter variable of this instance of optimizer.\n *\n * @param weightValues\n * @returns Weight values with the first element consumed and excluded.\n */\n async extractIterations(weightValues) {\n this.iterations_ = (await weightValues[0].tensor.data())[0];\n return weightValues.slice(1);\n }\n}\nObject.defineProperty(Optimizer, Symbol.hasInstance, {\n value: (instance) => {\n return instance.minimize != null && instance.computeGradients != null &&\n instance.applyGradients != null;\n }\n});\n//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoib3B0aW1pemVyLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vLi4vdGZqcy1jb3JlL3NyYy9vcHRpbWl6ZXJzL29wdGltaXplci50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQTs7Ozs7Ozs7Ozs7Ozs7O0dBZUc7QUFFSCxPQUFPLEVBQUMsT0FBTyxFQUFDLE1BQU0sWUFBWSxDQUFDO0FBQ25DLE9BQU8sRUFBQyxhQUFhLEVBQUMsTUFBTSxjQUFjLENBQUM7QUFDM0MsT0FBTyxFQUFDLE1BQU0sRUFBQyxNQUFNLFlBQVksQ0FBQztBQUNsQyxPQUFPLEVBQUMsWUFBWSxFQUFDLE1BQU0sa0JBQWtCLENBQUM7QUFvQjlDLDRFQUE0RTtBQUM1RSxNQUFNLE9BQWdCLFNBQVUsU0FBUSxZQUFZO0lBR2xEOzs7Ozs7Ozs7Ozs7O09BYUc7SUFDSCxRQUFRLENBQUMsQ0FBZSxFQUFFLFVBQVUsR0FBRyxLQUFLLEVBQUUsT0FBb0I7UUFFaEUsTUFBTSxFQUFDLEtBQUssRUFBRSxLQUFLLEVBQUMsR0FBRyxJQUFJLENBQUMsZ0JBQWdCLENBQUMsQ0FBQyxFQUFFLE9BQU8sQ0FBQyxDQUFDO1FBRXpELElBQUksT0FBTyxJQUFJLElBQUksRUFBRTtZQUNuQixNQUFNLFNBQVMsR0FDWCxPQUFPLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxFQUFDLElBQUksRUFBRSxDQUFDLENBQUMsSUFBSSxFQUFFLE1BQU0sRUFBRSxLQUFLLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxFQUFDLENBQUMsQ0FBQyxDQUFDO1lBQzlELElBQUksQ0FBQyxjQUFjLENBQUMsU0FBUyxDQUFDLENBQUM7U0FDaEM7YUFBTTtZQUNMLElBQUksQ0FBQyxjQUFjLENBQUMsS0FBSyxDQUFDLENBQUM7U0FDNUI7UUFFRCxxQkFBcUI7UUFDckIsT0FBTyxDQUFDLEtBQUssQ0FBQyxDQUFDO1FBRWYsSUFBSSxVQUFVLEVBQUU7WUFDZCxPQUFPLEtBQUssQ0FBQztTQUNkO2FBQU07WUFDTCxLQUFLLENBQUMsT0FBTyxFQUFFLENBQUM7WUFDaEIsT0FBTyxJQUFJLENBQUM7U0FDYjtJQUNILENBQUM7SUFFRDs7T0FFRztJQUNILElBQUksVUFBVTtRQUNaLElBQUksSUFBSSxDQUFDLFdBQVcsSUFBSSxJQUFJLEVBQUU7WUFDNUIsSUFBSSxDQUFDLFdBQVcsR0FBRyxDQUFDLENBQUM7U0FDdEI7UUFDRCxPQUFPLElBQUksQ0FBQyxXQUFXLENBQUM7SUFDMUIsQ0FBQztJQUVTLG1CQUFtQjtRQUMzQixJQUFJLENBQUMsV0FBVyxHQUFHLElBQUksQ0FBQyxVQUFVLEdBQUcsQ0FBQyxDQUFDO0lBQ3pDLENBQUM7SUFFRDs7Ozs7Ozs7Ozs7O09BWUc7SUFDSCxnQkFBZ0IsQ0FBQyxDQUFlLEVBQUUsT0FBb0I7UUFFcEQsT0FBTyxhQUFhLENBQUMsQ0FBQyxFQUFFLE9BQU8sQ0FBQyxDQUFDO0lBQ25DLENBQUM7SUFZRDs7T0FFRztJQUNILE9BQU87UUFDTCxJQUFJLElBQUksQ0FBQyxXQUFXLElBQUksSUFBSSxFQUFFO1lBQzVCLE9BQU8sQ0FBQyxJQUFJLENBQUMsV0FBVyxDQUFDLENBQUM7U0FDM0I7SUFDSCxDQUFDO0lBRUQsS0FBSyxDQUFDLGNBQWM7UUFDbEIsSUFBSSxJQUFJLENBQUMsV0FBVyxJQUFJLElBQUksRUFBRTtZQUM1QixJQUFJLENBQUMsV0FBVyxHQUFHLENBQUMsQ0FBQztTQUN0QjtRQUNELE9BQU87WUFDTCxJQUFJLEVBQUUsTUFBTTtZQUNaLCtDQUErQztZQUMvQyxNQUFNLEVBQUUsTUFBTSxDQUFDLElBQUksQ0FBQyxXQUFXLEVBQUUsT0FBTyxDQUFDO1NBQzFDLENBQUM7SUFDSixDQUFDO0lBRUQsS0FBSyxDQUFDLFVBQVU7UUFDZCxNQUFNLElBQUksS0FBSyxDQUFDLHlEQUF5RCxDQUFDLENBQUM7SUFDN0UsQ0FBQztJQUVELEtBQUssQ0FBQyxVQUFVLENBQUMsWUFBMkI7UUFDMUMsTUFBTSxJQUFJLEtBQUssQ0FDWCwyREFBMkQ7WUFDM0QsR0FBRyxJQUFJLENBQUMsWUFBWSxFQUFFLEVBQUUsQ0FBQyxDQUFDO0lBQ2hDLENBQUM7SUFFRDs7Ozs7O09BTUc7SUFDTyxLQUFLLENBQUMsaUJBQWlCLENBQUMsWUFBMkI7UUFFM0QsSUFBSSxDQUFDLFdBQVcsR0FBRyxDQUFDLE1BQU0sWUFBWSxDQUFDLENBQUMsQ0FBQyxDQUFDLE1BQU0sQ0FBQyxJQUFJLEVBQUUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDO1FBQzVELE9BQU8sWUFBWSxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUMsQ0FBQztJQUMvQixDQUFDO0NBQ0Y7QUFFRCxNQUFNLENBQUMsY0FBYyxDQUFDLFNBQVMsRUFBRSxNQUFNLENBQUMsV0FBVyxFQUFFO0lBQ25ELEtBQUssRUFBRSxDQUFDLFFBQW1CLEVBQUUsRUFBRTtRQUM3QixPQUFPLFFBQVEsQ0FBQyxRQUFRLElBQUksSUFBSSxJQUFJLFFBQVEsQ0FBQyxnQkFBZ0IsSUFBSSxJQUFJO1lBQ2pFLFFBQVEsQ0FBQyxjQUFjLElBQUksSUFBSSxDQUFDO0lBQ3RDLENBQUM7Q0FDRixDQUFDLENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyIvKipcbiAqIEBsaWNlbnNlXG4gKiBDb3B5cmlnaHQgMjAxOCBHb29nbGUgTExDLiBBbGwgUmlnaHRzIFJlc2VydmVkLlxuICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlIFwiTGljZW5zZVwiKTtcbiAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS5cbiAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdFxuICpcbiAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMFxuICpcbiAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmVcbiAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuIFwiQVMgSVNcIiBCQVNJUyxcbiAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLlxuICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZFxuICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuXG4gKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuICovXG5cbmltcG9ydCB7ZGlzcG9zZX0gZnJvbSAnLi4vZ2xvYmFscyc7XG5pbXBvcnQge3ZhcmlhYmxlR3JhZHN9IGZyb20gJy4uL2dyYWRpZW50cyc7XG5pbXBvcnQge3NjYWxhcn0gZnJvbSAnLi4vb3BzL29wcyc7XG5pbXBvcnQge1NlcmlhbGl6YWJsZX0gZnJvbSAnLi4vc2VyaWFsaXphdGlvbic7XG5pbXBvcnQge1NjYWxhciwgVmFyaWFibGV9IGZyb20gJy4uL3RlbnNvcic7XG5pbXBvcnQge05hbWVkVGVuc29yLCBOYW1lZFRlbnNvck1hcH0gZnJvbSAnLi4vdGVuc29yX3R5cGVzJztcblxuLyoqXG4gKiBBIHZhcmlhYmxlIHRoYXQgYmVsb25ncyB0byBhbiBvcHRpbWl6ZXIuXG4gKlxuICogVGhlIGBvcmlnaW5hbE5hbWVgIGZpZWxkIGlzIHJlcXVpcmVkIGZvciBrZWVwaW5nIHRyYWNrIG9mIHRoZSBjYW5vbmljYWxcbiAqIG5hbWUgb2YgdGhlIHZhcmlhYmxlLCB3aGljaCBpcyB1c3VhbGx5IHRoZSBuYW1lIG9mIHRoZSBtb2RlbCB3ZWlnaHQgdGhhdFxuICogdGhlIHZhcmlhYmxlIGlzIHJlbGF0ZWQgdG8gcGx1cyBhIHN1ZmZpeCwgZS5nLiwgJ2RlbnNlMS9rZXJuZWwvbW9tZW50dW0nLlxuICogVGhlIG5hbWUgb2YgdGhlIGBWYXJpYWJsZWAgb2JqZWN0IGl0c2VsZiBjYW5ub3QgYmUgdXNlZCBkaXJlY3RseSBkdWUgdG9cbiAqIHBvc3NpYmxlIGRlZHVwbGljYXRpb246IEV2ZXJ5IGBWYXJpYWJsZWAgbXVzdCBoYXZlIGEgdW5pcXVlIG5hbWUgYnV0IG1vcmVcbiAqIHRoYW4gb25lIG9wdGltaXplciBvYmplY3RzIG9mIHRoZSBzYW1lIHR5cGUgbWF5IGJlIGNyZWF0ZWQgZm9yIHRoZSBzYW1lIG1vZGVsXG4gKiBvciB0aGUgc2FtZSBgVmFyaWFibGVgLlxuICovXG5leHBvcnQgaW50ZXJmYWNlIE9wdGltaXplclZhcmlhYmxlIHtcbiAgb3JpZ2luYWxOYW1lOiBzdHJpbmc7XG4gIHZhcmlhYmxlOiBWYXJpYWJsZTtcbn1cblxuLyoqIEBkb2Mge2hlYWRpbmc6ICdUcmFpbmluZycsIHN1YmhlYWRpbmc6ICdDbGFzc2VzJywgbmFtZXNwYWNlOiAndHJhaW4nfSAqL1xuZXhwb3J0IGFic3RyYWN0IGNsYXNzIE9wdGltaXplciBleHRlbmRzIFNlcmlhbGl6YWJsZSB7XG4gIHByb3RlY3RlZCBpdGVyYXRpb25zXzogbnVtYmVyO1xuXG4gIC8qKlxuICAgKiBFeGVjdXRlcyBgZigpYCBhbmQgbWluaW1pemVzIHRoZSBzY2FsYXIgb3V0cHV0IG9mIGBmKClgIGJ5IGNvbXB1dGluZ1xuICAgKiBncmFkaWVudHMgb2YgeSB3aXRoIHJlc3BlY3QgdG8gdGhlIGxpc3Qgb2YgdHJhaW5hYmxlIHZhcmlhYmxlcyBwcm92aWRlZCBieVxuICAgKiBgdmFyTGlzdGAuIElmIG5vIGxpc3QgaXMgcHJvdmlkZWQsIGl0IGRlZmF1bHRzIHRvIGFsbCB0cmFpbmFibGUgdmFyaWFibGVzLlxuICAgKlxuICAgKiBAcGFyYW0gZiBUaGUgZnVuY3Rpb24gdG8gZXhlY3V0ZSBhbmQgd2hvc2Ugb3V0cHV0IHRvIG1pbmltaXplLlxuICAgKiBAcGFyYW0gcmV0dXJuQ29zdCBXaGV0aGVyIHRvIHJldHVybiB0aGUgc2NhbGFyIGNvc3QgdmFsdWUgcHJvZHVjZWQgYnlcbiAgICogZXhlY3V0aW5nIGBmKClgLlxuICAgKiBAcGFyYW0gdmFyTGlzdCBBbiBvcHRpb25hbCBsaXN0IG9mIHZhcmlhYmxlcyB0byB1cGRhdGUuIElmIHNwZWNpZmllZCwgb25seVxuICAgKiB0aGUgdHJhaW5hYmxlIHZhcmlhYmxlcyBpbiB2YXJMaXN0IHdpbGwgYmUgdXBkYXRlZCBieSBtaW5pbWl6ZS4gRGVmYXVsdHMgdG9cbiAgICogYWxsIHRyYWluYWJsZSB2YXJpYWJsZXMuXG4gICAqXG4gICAqIEBkb2Mge2hlYWRpbmc6ICdUcmFpbmluZycsIHN1YmhlYWRpbmc6ICdPcHRpbWl6ZXJzJ31cbiAgICovXG4gIG1pbmltaXplKGY6ICgpID0+IFNjYWxhciwgcmV0dXJuQ29zdCA9IGZhbHNlLCB2YXJMaXN0PzogVmFyaWFibGVbXSk6IFNjYWxhclxuICAgICAgfG51bGwge1xuICAgIGNvbnN0IHt2YWx1ZSwgZ3JhZHN9ID0gdGhpcy5jb21wdXRlR3JhZGllbnRzKGYsIHZhckxpc3QpO1xuXG4gICAgaWYgKHZhckxpc3QgIT0gbnVsbCkge1xuICAgICAgY29uc3QgZ3JhZEFycmF5OiBOYW1lZFRlbnNvcltdID1cbiAgICAgICAgICB2YXJMaXN0Lm1hcCh2ID0+ICh7bmFtZTogdi5uYW1lLCB0ZW5zb3I6IGdyYWRzW3YubmFtZV19KSk7XG4gICAgICB0aGlzLmFwcGx5R3JhZGllbnRzKGdyYWRBcnJheSk7XG4gICAgfSBlbHNlIHtcbiAgICAgIHRoaXMuYXBwbHlHcmFkaWVudHMoZ3JhZHMpO1xuICAgIH1cblxuICAgIC8vIERpc3Bvc2UgZ3JhZGllbnRzLlxuICAgIGRpc3Bvc2UoZ3JhZHMpO1xuXG4gICAgaWYgKHJldHVybkNvc3QpIHtcbiAgICAgIHJldHVybiB2YWx1ZTtcbiAgICB9IGVsc2Uge1xuICAgICAgdmFsdWUuZGlzcG9zZSgpO1xuICAgICAgcmV0dXJuIG51bGw7XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIFRoZSBudW1iZXIgb2YgaXRlcmF0aW9ucyB0aGF0IHRoaXMgb3B0aW1pemVyIGluc3RhbmNlIGhhcyBiZWVuIGludm9rZWQgZm9yLlxuICAgKi9cbiAgZ2V0IGl0ZXJhdGlvbnMoKTogbnVtYmVyIHtcbiAgICBpZiAodGhpcy5pdGVyYXRpb25zXyA9PSBudWxsKSB7XG4gICAgICB0aGlzLml0ZXJhdGlvbnNfID0gMDtcbiAgICB9XG4gICAgcmV0dXJuIHRoaXMuaXRlcmF0aW9uc187XG4gIH1cblxuICBwcm90ZWN0ZWQgaW5jcmVtZW50SXRlcmF0aW9ucygpIHtcbiAgICB0aGlzLml0ZXJhdGlvbnNfID0gdGhpcy5pdGVyYXRpb25zICsgMTtcbiAgfVxuXG4gIC8qKlxuICAgKiBFeGVjdXRlcyBmKCkgYW5kIGNvbXB1dGVzIHRoZSBncmFkaWVudCBvZiB0aGUgc2NhbGFyIG91dHB1dCBvZiBmKCkgd2l0aFxuICAgKiByZXNwZWN0IHRvIHRoZSBsaXN0IG9mIHRyYWluYWJsZSB2YXJpYWJsZXMgcHJvdmlkZWQgYnkgYHZhckxpc3RgLiBJZiBub1xuICAgKiBsaXN0IGlzIHByb3ZpZGVkLCBpdCBkZWZhdWx0cyB0byBhbGwgdHJhaW5hYmxlIHZhcmlhYmxlcy5cbiAgICpcbiAgICogQHBhcmFtIGYgVGhlIGZ1bmN0aW9uIHRvIGV4ZWN1dGUgYW5kIHdob3NlIG91dHB1dCB0byB1c2UgZm9yIGNvbXB1dGluZ1xuICAgKiBncmFkaWVudHMgd2l0aCByZXNwZWN0IHRvIHZhcmlhYmxlcy5cbiAgICogQHBhcmFtIHZhckxpc3QgQW4gb3B0aW9uYWwgbGlzdCBvZiB2YXJpYWJsZXMgdG8gY29tcHV0ZSBncmFkaWVudHMgd2l0aFxuICAgKiByZXNwZWN0IHRvLiBJZiBzcGVjaWZpZWQsIG9ubHkgdGhlIHRyYWluYWJsZSB2YXJpYWJsZXMgaW4gdmFyTGlzdCB3aWxsIGhhdmVcbiAgICogZ3JhZGllbnRzIGNvbXB1dGVkIHdpdGggcmVzcGVjdCB0by4gRGVmYXVsdHMgdG8gYWxsIHRyYWluYWJsZSB2YXJpYWJsZXMuXG4gICAqXG4gICAqIEBkb2Mge2hlYWRpbmc6ICdUcmFpbmluZycsIHN1YmhlYWRpbmc6ICdPcHRpbWl6ZXJzJ31cbiAgICovXG4gIGNvbXB1dGVHcmFkaWVudHMoZjogKCkgPT4gU2NhbGFyLCB2YXJMaXN0PzogVmFyaWFibGVbXSk6XG4gICAgICB7dmFsdWU6IFNjYWxhciwgZ3JhZHM6IE5hbWVkVGVuc29yTWFwfSB7XG4gICAgcmV0dXJuIHZhcmlhYmxlR3JhZHMoZiwgdmFyTGlzdCk7XG4gIH1cblxuICAvKipcbiAgICogVXBkYXRlcyB2YXJpYWJsZXMgYnkgdXNpbmcgdGhlIGNvbXB1dGVkIGdyYWRpZW50cy5cbiAgICpcbiAgICogQHBhcmFtIHZhcmlhYmxlR3JhZGllbnRzIEEgbWFwcGluZyBvZiB2YXJpYWJsZSBuYW1lIHRvIGl0cyBncmFkaWVudCB2YWx1ZS5cbiAgICpcbiAgICogQGRvYyB7aGVhZGluZzogJ1RyYWluaW5nJywgc3ViaGVhZGluZzogJ09wdGltaXplcnMnfVxuICAgKi9cbiAgYWJzdHJhY3QgYXBwbHlHcmFkaWVudHModmFyaWFibGVHcmFkaWVudHM6IE5hbWVkVGVuc29yTWFwfFxuICAgICAgICAgICAgICAgICAgICAgICAgICBOYW1lZFRlbnNvcltdKTogdm9pZDtcblxuICAvKipcbiAgICogRGlzcG9zZSB0aGUgdmFyaWFibGVzIChpZiBhbnkpIG93bmVkIGJ5IHRoaXMgb3B0aW1pemVyIGluc3RhbmNlLlxuICAgKi9cbiAgZGlzcG9zZSgpOiB2b2lkIHtcbiAgICBpZiAodGhpcy5pdGVyYXRpb25zXyAhPSBudWxsKSB7XG4gICAgICBkaXNwb3NlKHRoaXMuaXRlcmF0aW9uc18pO1xuICAgIH1cbiAgfVxuXG4gIGFzeW5jIHNhdmVJdGVyYXRpb25zKCk6IFByb21pc2U8TmFtZWRUZW5zb3I+IHtcbiAgICBpZiAodGhpcy5pdGVyYXRpb25zXyA9PSBudWxsKSB7XG4gICAgICB0aGlzLml0ZXJhdGlvbnNfID0gMDtcbiAgICB9XG4gICAgcmV0dXJuIHtcbiAgICAgIG5hbWU6ICdpdGVyJywgIC8vIE5hbWVkIGZvciBQeXRob24gY29tcGF0aWJpbGl0eS5cbiAgICAgIC8vIFRPRE8oY2Fpcyk6IFVzZSAnaW50NjQnIHR5cGUgd2hlbiBhdmFpbGFibGUuXG4gICAgICB0ZW5zb3I6IHNjYWxhcih0aGlzLml0ZXJhdGlvbnNfLCAnaW50MzInKVxuICAgIH07XG4gIH1cblxuICBhc3luYyBnZXRXZWlnaHRzKCk6IFByb21pc2U8TmFtZWRUZW5zb3JbXT4ge1xuICAgIHRocm93IG5ldyBFcnJvcignZ2V0V2VpZ2h0cygpIGlzIG5vdCBpbXBsZW1lbnRlZCBmb3IgdGhpcyBvcHRpbWl6ZXIgeWV0LicpO1xuICB9XG5cbiAgYXN5bmMgc2V0V2VpZ2h0cyh3ZWlnaHRWYWx1ZXM6IE5hbWVkVGVuc29yW10pOiBQcm9taXNlPHZvaWQ+IHtcbiAgICB0aHJvdyBuZXcgRXJyb3IoXG4gICAgICAgIGBzZXRXZWlnaHRzKCkgaXMgbm90IGltcGxlbWVudGVkIGZvciB0aGlzIG9wdGltaXplciBjbGFzcyBgICtcbiAgICAgICAgYCR7dGhpcy5nZXRDbGFzc05hbWUoKX1gKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBFeHRyYWN0IHRoZSBmaXJzdCBlbGVtZW50IG9mIHRoZSB3ZWlnaHQgdmFsdWVzIGFuZCBzZXQgaXRcbiAgICogYXMgdGhlIGl0ZXJhdGlvbnMgY291bnRlciB2YXJpYWJsZSBvZiB0aGlzIGluc3RhbmNlIG9mIG9wdGltaXplci5cbiAgICpcbiAgICogQHBhcmFtIHdlaWdodFZhbHVlc1xuICAgKiBAcmV0dXJucyBXZWlnaHQgdmFsdWVzIHdpdGggdGhlIGZpcnN0IGVsZW1lbnQgY29uc3VtZWQgYW5kIGV4Y2x1ZGVkLlxuICAgKi9cbiAgcHJvdGVjdGVkIGFzeW5jIGV4dHJhY3RJdGVyYXRpb25zKHdlaWdodFZhbHVlczogTmFtZWRUZW5zb3JbXSk6XG4gICAgICBQcm9taXNlPE5hbWVkVGVuc29yW10+IHtcbiAgICB0aGlzLml0ZXJhdGlvbnNfID0gKGF3YWl0IHdlaWdodFZhbHVlc1swXS50ZW5zb3IuZGF0YSgpKVswXTtcbiAgICByZXR1cm4gd2VpZ2h0VmFsdWVzLnNsaWNlKDEpO1xuICB9XG59XG5cbk9iamVjdC5kZWZpbmVQcm9wZXJ0eShPcHRpbWl6ZXIsIFN5bWJvbC5oYXNJbnN0YW5jZSwge1xuICB2YWx1ZTogKGluc3RhbmNlOiBPcHRpbWl6ZXIpID0+IHtcbiAgICByZXR1cm4gaW5zdGFuY2UubWluaW1pemUgIT0gbnVsbCAmJiBpbnN0YW5jZS5jb21wdXRlR3JhZGllbnRzICE9IG51bGwgJiZcbiAgICAgICAgaW5zdGFuY2UuYXBwbHlHcmFkaWVudHMgIT0gbnVsbDtcbiAgfVxufSk7XG4iXX0=","/**\n * @license\n * Copyright 2018 Google LLC. All Rights Reserved.\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n * =============================================================================\n */\nimport { ENGINE } from '../engine';\nimport { dispose, tidy } from '../globals';\nimport { add } from '../ops/add';\nimport { div } from '../ops/div';\nimport { mul } from '../ops/mul';\nimport { sqrt } from '../ops/ops';\nimport { square } from '../ops/square';\nimport { zerosLike } from '../ops/zeros_like';\nimport { registerClass } from '../serialization';\nimport { Optimizer } from './optimizer';\n/** @doclink Optimizer */\nexport class AdadeltaOptimizer extends Optimizer {\n constructor(learningRate, rho, epsilon = null) {\n super();\n this.learningRate = learningRate;\n this.rho = rho;\n this.epsilon = epsilon;\n this.accumulatedGrads = [];\n this.accumulatedUpdates = [];\n if (epsilon == null) {\n this.epsilon = ENGINE.backend.epsilon();\n }\n }\n applyGradients(variableGradients) {\n const variableNames = Array.isArray(variableGradients) ?\n variableGradients.map(item => item.name) :\n Object.keys(variableGradients);\n variableNames.forEach((name, i) => {\n const value = ENGINE.registeredVariables[name];\n const trainable = false;\n if (this.accumulatedGrads[i] == null) {\n this.accumulatedGrads[i] = {\n originalName: `${name}/accum_grad`,\n variable: tidy(() => zerosLike(value).variable(trainable))\n };\n }\n if (this.accumulatedUpdates[i] == null) {\n this.accumulatedUpdates[i] = {\n originalName: `${name}/accum_var`,\n variable: tidy(() => zerosLike(value).variable(trainable))\n };\n }\n const gradient = Array.isArray(variableGradients) ?\n variableGradients[i].tensor :\n variableGradients[name];\n if (gradient == null) {\n return;\n }\n const accumulatedGrad = this.accumulatedGrads[i].variable;\n const accumulatedUpdate = this.accumulatedUpdates[i].variable;\n tidy(() => {\n const newAccumulatedGrad = add(mul(accumulatedGrad, this.rho), mul(square(gradient), 1 - this.rho));\n const updates = mul(div(sqrt(add(accumulatedUpdate, this.epsilon)), sqrt(add(accumulatedGrad, this.epsilon))), gradient);\n const newAccumulatedUpdate = add(mul(accumulatedUpdate, this.rho), mul(square(updates), 1 - this.rho));\n accumulatedGrad.assign(newAccumulatedGrad);\n accumulatedUpdate.assign(newAccumulatedUpdate);\n const newValue = add(mul(updates, -this.learningRate), value);\n value.assign(newValue);\n });\n });\n this.incrementIterations();\n }\n dispose() {\n if (this.accumulatedUpdates != null) {\n dispose(this.accumulatedGrads.map(v => v.variable));\n dispose(this.accumulatedUpdates.map(v => v.variable));\n }\n }\n async getWeights() {\n // Order matters for Python compatibility.\n const variables = [...this.accumulatedGrads, ...this.accumulatedUpdates];\n return [await this.saveIterations()].concat(variables.map(v => ({ name: v.originalName, tensor: v.variable })));\n }\n async setWeights(weightValues) {\n weightValues = await this.extractIterations(weightValues);\n const variableCount = weightValues.length / 2;\n const trainable = false;\n this.accumulatedGrads =\n weightValues.slice(0, variableCount).map(v => ({\n originalName: v.name,\n variable: v.tensor.variable(trainable)\n }));\n this.accumulatedUpdates =\n weightValues.slice(variableCount, variableCount * 2)\n .map(v => ({\n originalName: v.name,\n variable: v.tensor.variable(trainable)\n }));\n }\n getConfig() {\n return {\n 'learningRate': this.learningRate,\n 'rho': this.rho,\n 'epsilon': this.epsilon\n };\n }\n /** @nocollapse */\n static fromConfig(cls, config) {\n return new cls(config['learningRate'], config['rho'], config['epsilon']);\n }\n}\n/** @nocollapse */\nAdadeltaOptimizer.className = 'Adadelta'; // Name matters for Python compatibility.\nregisterClass(AdadeltaOptimizer);\n//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYWRhZGVsdGFfb3B0aW1pemVyLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vLi4vdGZqcy1jb3JlL3NyYy9vcHRpbWl6ZXJzL2FkYWRlbHRhX29wdGltaXplci50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQTs7Ozs7Ozs7Ozs7Ozs7O0dBZUc7QUFFSCxPQUFPLEVBQUMsTUFBTSxFQUFDLE1BQU0sV0FBVyxDQUFDO0FBQ2pDLE9BQU8sRUFBQyxPQUFPLEVBQUUsSUFBSSxFQUFDLE1BQU0sWUFBWSxDQUFDO0FBQ3pDLE9BQU8sRUFBQyxHQUFHLEVBQUMsTUFBTSxZQUFZLENBQUM7QUFDL0IsT0FBTyxFQUFDLEdBQUcsRUFBQyxNQUFNLFlBQVksQ0FBQztBQUMvQixPQUFPLEVBQUMsR0FBRyxFQUFDLE1BQU0sWUFBWSxDQUFDO0FBQy9CLE9BQU8sRUFBQyxJQUFJLEVBQUMsTUFBTSxZQUFZLENBQUM7QUFDaEMsT0FBTyxFQUFDLE1BQU0sRUFBQyxNQUFNLGVBQWUsQ0FBQztBQUNyQyxPQUFPLEVBQUMsU0FBUyxFQUFDLE1BQU0sbUJBQW1CLENBQUM7QUFDNUMsT0FBTyxFQUFhLGFBQWEsRUFBd0MsTUFBTSxrQkFBa0IsQ0FBQztBQUdsRyxPQUFPLEVBQUMsU0FBUyxFQUFvQixNQUFNLGFBQWEsQ0FBQztBQUV6RCx5QkFBeUI7QUFDekIsTUFBTSxPQUFPLGlCQUFrQixTQUFRLFNBQVM7SUFNOUMsWUFDYyxZQUFvQixFQUFZLEdBQVcsRUFDM0MsVUFBa0IsSUFBSTtRQUNsQyxLQUFLLEVBQUUsQ0FBQztRQUZJLGlCQUFZLEdBQVosWUFBWSxDQUFRO1FBQVksUUFBRyxHQUFILEdBQUcsQ0FBUTtRQUMzQyxZQUFPLEdBQVAsT0FBTyxDQUFlO1FBTDVCLHFCQUFnQixHQUF3QixFQUFFLENBQUM7UUFDM0MsdUJBQWtCLEdBQXdCLEVBQUUsQ0FBQztRQU9uRCxJQUFJLE9BQU8sSUFBSSxJQUFJLEVBQUU7WUFDbkIsSUFBSSxD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O0FBQ1gsMkJBQVMsR0FBRyxVQUFVLENBQUMsQ0FBRSx5Q0FBeUM7QUFvSDNFLGFBQWEsQ0FBQyxpQkFBaUIsQ0FBQyxDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiLyoqXG4gKiBAbGljZW5zZVxuICogQ29weXJpZ2h0IDIwMTggR29vZ2xlIExMQy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC5cbiAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSBcIkxpY2Vuc2VcIik7XG4gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuXG4gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXRcbiAqXG4gKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjBcbiAqXG4gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlXG4gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiBcIkFTIElTXCIgQkFTSVMsXG4gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC5cbiAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmRcbiAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLlxuICogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbiAqL1xuXG5pbXBvcnQge0VOR0lORX0gZnJvbSAnLi4vZW5naW5lJztcbmltcG9ydCB7ZGlzcG9zZSwgdGlkeX0gZnJvbSAnLi4vZ2xvYmFscyc7XG5pbXBvcnQge2FkZH0gZnJvbSAnLi4vb3BzL2FkZCc7XG5pbXBvcnQge2Rpdn0gZnJvbSAnLi4vb3BzL2Rpdic7XG5pbXBvcnQge211bH0gZnJvbSAnLi4vb3BzL211bCc7XG5pbXBvcnQge3NxcnR9IGZyb20gJy4uL29wcy9vcHMnO1xuaW1wb3J0IHtzcXVhcmV9IGZyb20gJy4uL29wcy9zcXVhcmUnO1xuaW1wb3J0IHt6ZXJvc0xpa2V9IGZyb20gJy4uL29wcy96ZXJvc19saWtlJztcbmltcG9ydCB7Q29uZmlnRGljdCwgcmVnaXN0ZXJDbGFzcywgU2VyaWFsaXphYmxlLCBTZXJpYWxpemFibGVDb25zdHJ1Y3Rvcn0gZnJvbSAnLi4vc2VyaWFsaXphdGlvbic7XG5pbXBvcnQge05hbWVkVGVuc29yLCBOYW1lZFZhcmlhYmxlTWFwfSBmcm9tICcuLi90ZW5zb3JfdHlwZXMnO1xuXG5pbXBvcnQge09wdGltaXplciwgT3B0aW1pemVyVmFyaWFibGV9IGZyb20gJy4vb3B0aW1pemVyJztcblxuLyoqIEBkb2NsaW5rIE9wdGltaXplciAqL1xuZXhwb3J0IGNsYXNzIEFkYWRlbHRhT3B0aW1pemVyIGV4dGVuZHMgT3B0aW1pemVyIHtcbiAgLyoqIEBub2NvbGxhcHNlICovXG4gIHN0YXRpYyBjbGFzc05hbWUgPSAnQWRhZGVsdGEnOyAgLy8gTmFtZSBtYXR0ZXJzIGZvciBQeXRob24gY29tcGF0aWJpbGl0eS5cbiAgcHJpdmF0ZSBhY2N1bXVsYXRlZEdyYWRzOiBPcHRpbWl6ZXJWYXJpYWJsZVtdID0gW107XG4gIHByaXZhdGUgYWNjdW11bGF0ZWRVcGRhdGVzOiBPcHRpbWl6ZXJWYXJpYWJsZVtdID0gW107XG5cbiAgY29uc3RydWN0b3IoXG4gICAgICBwcm90ZWN0ZWQgbGVhcm5pbmdSYXRlOiBudW1iZXIsIHByb3RlY3RlZCByaG86IG51bWJlcixcbiAgICAgIHByb3RlY3RlZCBlcHNpbG9uOiBudW1iZXIgPSBudWxsKSB7XG4gICAgc3VwZXIoKTtcblxuICAgIGlmIChlcHNpbG9uID09IG51bGwpIHtcbiAgICAgIHRoaXMuZXBzaWxvbiA9IEVOR0lORS5iYWNrZW5kLmVwc2lsb24oKTtcbiAgICB9XG4gIH1cblxuICBhcHBseUdyYWRpZW50cyh2YXJpYWJsZUdyYWRpZW50czogTmFtZWRWYXJpYWJsZU1hcHxOYW1lZFRlbnNvcltdKSB7XG4gICAgY29uc3QgdmFyaWFibGVOYW1lcyA9IEFycmF5LmlzQXJyYXkodmFyaWFibGVHcmFkaWVudHMpID9cbiAgICAgICAgdmFyaWFibGVHcmFkaWVudHMubWFwKGl0ZW0gPT4gaXRlbS5uYW1lKSA6XG4gICAgICAgIE9iamVjdC5rZXlzKHZhcmlhYmxlR3JhZGllbnRzKTtcblxuICAgIHZhcmlhYmxlTmFtZXMuZm9yRWFjaCgobmFtZSwgaSkgPT4ge1xuICAgICAgY29uc3QgdmFsdWUgPSBFTkdJTkUucmVnaXN0ZXJlZFZhcmlhYmxlc1tuYW1lXTtcbiAgICAgIGNvbnN0IHRyYWluYWJsZSA9IGZhbHNlO1xuICAgICAgaWYgKHRoaXMuYWNjdW11bGF0ZWRHcmFkc1tpXSA9PSBudWxsKSB7XG4gICAgICAgIHRoaXMuYWNjdW11bGF0ZWRHcmFkc1tpXSA9IHtcbiAgICAgICAgICBvcmlnaW5hbE5hbWU6IGAke25hbWV9L2FjY3VtX2dyYWRgLFxuICAgICAgICAgIHZhcmlhYmxlOiB0aWR5KCgpID0+IHplcm9zTGlrZSh2YWx1ZSkudmFyaWFibGUodHJhaW5hYmxlKSlcbiAgICAgICAgfTtcbiAgICAgIH1cbiAgICAgIGlmICh0aGlzLmFjY3VtdWxhdGVkVXBkYXRlc1tpXSA9PSBudWxsKSB7XG4gICAgICAgIHRoaXMuYWNjdW11bGF0ZWRVcGRhdGVzW2ldID0ge1xuICAgICAgICAgIG9yaWdpbmFsTmFtZTogYCR7bmFtZX0vYWNjdW1fdmFyYCxcbiAgICAgICAgICB2YXJpYWJsZTogdGlkeSgoKSA9PiB6ZXJvc0xpa2UodmFsdWUpLnZhcmlhYmxlKHRyYWluYWJsZSkpXG4gICAgICAgIH07XG4gICAgICB9XG5cbiAgICAgIGNvbnN0IGdyYWRpZW50ID0gQXJyYXkuaXNBcnJheSh2YXJpYWJsZUdyYWRpZW50cykgP1xuICAgICAgICAgIHZhcmlhYmxlR3JhZGllbnRzW2ldLnRlbnNvciA6XG4gICAgICAgICAgdmFyaWFibGVHcmFkaWVudHNbbmFtZV07XG4gICAgICBpZiAoZ3JhZGllbnQgPT0gbnVsbCkge1xuICAgICAgICByZXR1cm47XG4gICAgICB9XG5cbiAgICAgIGNvbnN0IGFjY3VtdWxhdGVkR3JhZCA9IHRoaXMuYWNjdW11bGF0ZWRHcmFkc1tpXS52YXJpYWJsZTtcbiAgICAgIGNvbnN0IGFjY3VtdWxhdGVkVXBkYXRlID0gdGhpcy5hY2N1bXVsYXRlZFVwZGF0ZXNbaV0udmFyaWFibGU7XG5cbiAgICAgIHRpZHkoKCkgPT4ge1xuICAgICAgICBjb25zdCBuZXdBY2N1bXVsYXRlZEdyYWQgPVxuICAgICAgICAgICAgYWRkKG11bChhY2N1bXVsYXRlZEdyYWQsIHRoaXMucmhvKSxcbiAgICAgICAgICAgICAgICBtdWwoc3F1YXJlKGdyYWRpZW50KSwgMSAtIHRoaXMucmhvKSk7XG5cbiAgICAgICAgY29uc3QgdXBkYXRlcyA9XG4gICAgICAgICAgICBtdWwoZGl2KHNxcnQoYWRkKGFjY3VtdWxhdGVkVXBkYXRlLCB0aGlzLmVwc2lsb24pKSxcbiAgICAgICAgICAgICAgICAgICAgc3FydChhZGQoYWNjdW11bGF0ZWRHcmFkLCB0aGlzLmVwc2lsb24pKSksXG4gICAgICAgICAgICAgICAgZ3JhZGllbnQpO1xuXG4gICAgICAgIGNvbnN0IG5ld0FjY3VtdWxhdGVkVXBkYXRlID1cbiAgICAgICAgICAgIGFkZChtdWwoYWNjdW11bGF0ZWRVcGRhdGUsIHRoaXMucmhvKSxcbiAgICAgICAgICAgICAgICBtdWwoc3F1YXJlKHVwZGF0ZXMpLCAxIC0gdGhpcy5yaG8pKTtcblxuICAgICAgICBhY2N1bXVsYXRlZEdyYWQuYXNzaWduKG5ld0FjY3VtdWxhdGVkR3JhZCk7XG4gICAgICAgIGFjY3VtdWxhdGVkVXBkYXRlLmFzc2lnbihuZXdBY2N1bXVsYXRlZFVwZGF0ZSk7XG5cbiAgICAgICAgY29uc3QgbmV3VmFsdWUgPSBhZGQobXVsKHVwZGF0ZXMsIC10aGlzLmxlYXJuaW5nUmF0ZSksIHZhbHVlKTtcbiAgICAgICAgdmFsdWUuYXNzaWduKG5ld1ZhbHVlKTtcbiAgICAgIH0pO1xuICAgIH0pO1xuICAgIHRoaXMuaW5jcmVtZW50SXRlcmF0aW9ucygpO1xuICB9XG5cbiAgZGlzcG9zZSgpOiB2b2lkIHtcbiAgICBpZiAodGhpcy5hY2N1bXVsYXRlZFVwZGF0ZXMgIT0gbnVsbCkge1xuICAgICAgZGlzcG9zZSh0aGlzLmFjY3VtdWxhdGVkR3JhZHMubWFwKHYgPT4gdi52YXJpYWJsZSkpO1xuICAgICAgZGlzcG9zZSh0aGlzLmFjY3VtdWxhdGVkVXBkYXRlcy5tYXAodiA9PiB2LnZhcmlhYmxlKSk7XG4gICAgfVxuICB9XG5cbiAgYXN5bmMgZ2V0V2VpZ2h0cygpOiBQcm9taXNlPE5hbWVkVGVuc29yW10+IHtcbiAgICAvLyBPcmRlciBtYXR0ZXJzIGZvciBQeXRob24gY29tcGF0aWJpbGl0eS5cbiAgICBjb25zdCB2YXJpYWJsZXM6IE9wdGltaXplclZhcmlhYmxlW10gPVxuICAgICAgICBbLi4udGhpcy5hY2N1bXVsYXRlZEdyYWRzLCAuLi50aGlzLmFjY3VtdWxhdGVkVXBkYXRlc107XG4gICAgcmV0dXJuIFthd2FpdCB0aGlzLnNhdmVJdGVyYXRpb25zKCldLmNvbmNhdChcbiAgICAgICAgdmFyaWFibGVzLm1hcCh2ID0+ICh7bmFtZTogdi5vcmlnaW5hbE5hbWUsIHRlbnNvcjogdi52YXJpYWJsZX0pKSk7XG4gIH1cblxuICBhc3luYyBzZXRXZWlnaHRzKHdlaWdodFZhbHVlczogTmFtZWRUZW5zb3JbXSk6IFByb21pc2U8dm9pZD4ge1xuICAgIHdlaWdodFZhbHVlcyA9IGF3YWl0IHRoaXMuZXh0cmFjdEl0ZXJhdGlvbnMod2VpZ2h0VmFsdWVzKTtcbiAgICBjb25zdCB2YXJpYWJsZUNvdW50ID0gd2VpZ2h0VmFsdWVzLmxlbmd0aCAvIDI7XG4gICAgY29uc3QgdHJhaW5hYmxlID0gZmFsc2U7XG4gICAgdGhpcy5hY2N1bXVsYXRlZEdyYWRzID1cbiAgICAgICAgd2VpZ2h0VmFsdWVzLnNsaWNlKDAsIHZhcmlhYmxlQ291bnQpLm1hcCh2ID0+ICh7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvcmlnaW5hbE5hbWU6IHYubmFtZSxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhcmlhYmxlOiB2LnRlbnNvci52YXJpYWJsZShcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0cmFpbmFibGUpXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSkpO1xuICAgIHRoaXMuYWNjdW11bGF0ZWRVcGRhdGVzID1cbiAgICAgICAgd2VpZ2h0VmFsdWVzLnNsaWNlKHZhcmlhYmxlQ291bnQsIHZhcmlhYmxlQ291bnQgKiAyKVxuICAgICAgICAgICAgLm1hcCh2ID0+ICh7XG4gICAgICAgICAgICAgICAgICAgb3JpZ2luYWxOYW1lOiB2Lm5hbWUsXG4gICAgICAgICAgICAgICAgICAgdmFyaWFibGU6IHYudGVuc29yLnZhcmlhYmxlKHRyYWluYWJsZSlcbiAgICAgICAgICAgICAgICAgfSkpO1xuICB9XG5cbiAgZ2V0Q29uZmlnKCk6IENvbmZpZ0RpY3Qge1xuICAgIHJldHVybiB7XG4gICAgICAnbGVhcm5pbmdSYXRlJzogdGhpcy5sZWFybmluZ1JhdGUsXG4gICAgICAncmhvJzogdGhpcy5yaG8sXG4gICAgICAnZXBzaWxvbic6IHRoaXMuZXBzaWxvblxuICAgIH07XG4gIH1cblxuICAvKiogQG5vY29sbGFwc2UgKi9cbiAgc3RhdGljIGZyb21Db25maWc8VCBleHRlbmRzIFNlcmlhbGl6YWJsZT4oXG4gICAgICBjbHM6IFNlcmlhbGl6YWJsZUNvbnN0cnVjdG9yPFQ+LCBjb25maWc6IENvbmZpZ0RpY3QpOiBUIHtcbiAgICByZXR1cm4gbmV3IGNscyhjb25maWdbJ2xlYXJuaW5nUmF0ZSddLCBjb25maWdbJ3JobyddLCBjb25maWdbJ2Vwc2lsb24nXSk7XG4gIH1cbn1cbnJlZ2lzdGVyQ2xhc3MoQWRhZGVsdGFPcHRpbWl6ZXIpO1xuIl19","/**\n * @license\n * Copyright 2018 Google LLC. All Rights Reserved.\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n * =============================================================================\n */\nimport { ENGINE } from '../engine';\nimport { dispose, tidy } from '../globals';\nimport { add } from '../ops/add';\nimport { div } from '../ops/div';\nimport { fill } from '../ops/fill';\nimport { mul } from '../ops/mul';\nimport { sqrt } from '../ops/sqrt';\nimport { square } from '../ops/square';\nimport { registerClass } from '../serialization';\nimport { Optimizer } from './optimizer';\n/** @doclink Optimizer */\nexport class AdagradOptimizer extends Optimizer {\n constructor(learningRate, initialAccumulatorValue = 0.1) {\n super();\n this.learningRate = learningRate;\n this.initialAccumulatorValue = initialAccumulatorValue;\n this.accumulatedGrads = [];\n }\n applyGradients(variableGradients) {\n const variableNames = Array.isArray(variableGradients) ?\n variableGradients.map(item => item.name) :\n Object.keys(variableGradients);\n variableNames.forEach((name, i) => {\n const value = ENGINE.registeredVariables[name];\n if (this.accumulatedGrads[i] == null) {\n const trainable = false;\n this.accumulatedGrads[i] = {\n originalName: `${name}/accumulator`,\n variable: tidy(() => fill(value.shape, this.initialAccumulatorValue)\n .variable(trainable))\n };\n }\n const gradient = Array.isArray(variableGradients) ?\n variableGradients[i].tensor :\n variableGradients[name];\n if (gradient == null) {\n return;\n }\n const accumulatedGrad = this.accumulatedGrads[i].variable;\n tidy(() => {\n const newAccumulatedGrad = add(accumulatedGrad, square(gradient));\n accumulatedGrad.assign(newAccumulatedGrad);\n const newValue = add(mul(div(gradient, sqrt(add(newAccumulatedGrad, ENGINE.backend.epsilon()))), -this.learningRate), value);\n value.assign(newValue);\n });\n });\n this.incrementIterations();\n }\n dispose() {\n if (this.accumulatedGrads != null) {\n dispose(this.accumulatedGrads.map(v => v.variable));\n }\n }\n async getWeights() {\n // Order matters for Python compatibility.\n return [await this.saveIterations()].concat(this.accumulatedGrads.map(v => ({ name: v.originalName, tensor: v.variable })));\n }\n async setWeights(weightValues) {\n weightValues = await this.extractIterations(weightValues);\n const trainable = false;\n this.accumulatedGrads = weightValues.map(v => ({ originalName: v.name, variable: v.tensor.variable(trainable) }));\n }\n getConfig() {\n return {\n 'learningRate': this.learningRate,\n 'initialAccumulatorValue': this.initialAccumulatorValue,\n };\n }\n /** @nocollapse */\n static fromConfig(cls, config) {\n return new cls(config['learningRate'], config['initialAccumulatorValue']);\n }\n}\n/** @nocollapse */\nAdagradOptimizer.className = 'Adagrad'; // Note: Name matters for Python compatibility.\nregisterClass(AdagradOptimizer);\n//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYWRhZ3JhZF9vcHRpbWl6ZXIuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi8uLi90ZmpzLWNvcmUvc3JjL29wdGltaXplcnMvYWRhZ3JhZF9vcHRpbWl6ZXIudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUE7Ozs7Ozs7Ozs7Ozs7OztHQWVHO0FBRUgsT0FBTyxFQUFDLE1BQU0sRUFBQyxNQUFNLFdBQVcsQ0FBQztBQUNqQyxPQUFPLEVBQUMsT0FBTyxFQUFFLElBQUksRUFBQyxNQUFNLFlBQVksQ0FBQztBQUN6QyxPQUFPLEVBQUMsR0FBRyxFQUFDLE1BQU0sWUFBWSxDQUFDO0FBQy9CLE9BQU8sRUFBQyxHQUFHLEVBQUMsTUFBTSxZQUFZLENBQUM7QUFDL0IsT0FBTyxFQUFDLElBQUksRUFBQyxNQUFNLGFBQWEsQ0FBQztBQUNqQyxPQUFPLEVBQUMsR0FBRyxFQUFDLE1BQU0sWUFBWSxDQUFDO0FBQy9CLE9BQU8sRUFBQyxJQUFJLEVBQUMsTUFBTSxhQUFhLENBQUM7QUFDakMsT0FBTyxFQUFDLE1BQU0sRUFBQyxNQUFNLGVBQWUsQ0FBQztBQUNyQyxPQUFPLEVBQWEsYUFBYSxFQUF3QyxNQUFNLGtCQUFrQixDQUFDO0FBR2xHLE9BQU8sRUFBQyxTQUFTLEVBQW9CLE1BQU0sYUFBYSxDQUFDO0FBRXpELHlCQUF5QjtBQUN6QixNQUFNLE9BQU8sZ0JBQWlCLFNBQVEsU0FBUztJQU03QyxZQUNjLFlBQW9CLEVBQVUsMEJBQTBCLEdBQUc7UUFDdkUsS0FBSyxFQUFFLENBQUM7UUFESSxpQkFBWSxHQUFaLFlBQVksQ0FBUTtRQUFVLDRCQUF1QixHQUF2Qix1QkFBdUIsQ0FBTTtRQUhqRSxxQkFBZ0IsR0FBd0IsRUFBRSxDQUFDO0lBS25ELENBQUM7SUFFRCxjQUFjLENBQUMsaUJBQWlEO1FBQzlELE1BQU0sYUFBYSxHQUFHLEtBQUssQ0FBQyxPQUFPLENBQUMsaUJBQWlCLENBQUMsQ0FBQyxDQUFDO1lBQ3BELGlCQUFp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QyxnQkFBZ0IsR0FBRyxZQUFZLENBQUMsR0FBRyxDQUNwQyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsRUFBQyxZQUFZLEVBQUUsQ0FBQyxDQUFDLElBQUksRUFBRSxRQUFRLEVBQUUsQ0FBQyxDQUFDLE1BQU0sQ0FBQyxRQUFRLENBQUMsU0FBUyxDQUFDLEVBQUMsQ0FBQyxDQUFDLENBQUM7SUFDN0UsQ0FBQztJQUVELFNBQVM7UUFDUCxPQUFPO1lBQ0wsY0FBYyxFQUFFLElBQUksQ0FBQyxZQUFZO1lBQ2pDLHlCQUF5QixFQUFFLElBQUksQ0FBQyx1QkFBdUI7U0FDeEQsQ0FBQztJQUNKLENBQUM7SUFFRCxrQkFBa0I7SUFDbEIsTUFBTSxDQUFDLFVBQVUsQ0FDYixHQUErQixFQUFFLE1BQWtCO1FBQ3JELE9BQU8sSUFBSSxHQUFHLENBQUMsTUFBTSxDQUFDLGNBQWMsQ0FBQyxFQUFFLE1BQU0sQ0FBQyx5QkFBeUIsQ0FBQyxDQUFDLENBQUM7SUFDNUUsQ0FBQzs7QUFqRkQsa0JBQWtCO0FBQ1gsMEJBQVMsR0FBRyxTQUFTLENBQUMsQ0FBRSwrQ0FBK0M7QUFrRmhGLGFBQWEsQ0FBQyxnQkFBZ0IsQ0FBQyxDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiLyoqXG4gKiBAbGljZW5zZVxuICogQ29weXJpZ2h0IDIwMTggR29vZ2xlIExMQy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC5cbiAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSBcIkxpY2Vuc2VcIik7XG4gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuXG4gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXRcbiAqXG4gKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjBcbiAqXG4gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlXG4gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiBcIkFTIElTXCIgQkFTSVMsXG4gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC5cbiAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmRcbiAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLlxuICogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbiAqL1xuXG5pbXBvcnQge0VOR0lORX0gZnJvbSAnLi4vZW5naW5lJztcbmltcG9ydCB7ZGlzcG9zZSwgdGlkeX0gZnJvbSAnLi4vZ2xvYmFscyc7XG5pbXBvcnQge2FkZH0gZnJvbSAnLi4vb3BzL2FkZCc7XG5pbXBvcnQge2Rpdn0gZnJvbSAnLi4vb3BzL2Rpdic7XG5pbXBvcnQge2ZpbGx9IGZyb20gJy4uL29wcy9maWxsJztcbmltcG9ydCB7bXVsfSBmcm9tICcuLi9vcHMvbXVsJztcbmltcG9ydCB7c3FydH0gZnJvbSAnLi4vb3BzL3NxcnQnO1xuaW1wb3J0IHtzcXVhcmV9IGZyb20gJy4uL29wcy9zcXVhcmUnO1xuaW1wb3J0IHtDb25maWdEaWN0LCByZWdpc3RlckNsYXNzLCBTZXJpYWxpemFibGUsIFNlcmlhbGl6YWJsZUNvbnN0cnVjdG9yfSBmcm9tICcuLi9zZXJpYWxpemF0aW9uJztcbmltcG9ydCB7TmFtZWRUZW5zb3IsIE5hbWVkVmFyaWFibGVNYXB9IGZyb20gJy4uL3RlbnNvcl90eXBlcyc7XG5cbmltcG9ydCB7T3B0aW1pemVyLCBPcHRpbWl6ZXJWYXJpYWJsZX0gZnJvbSAnLi9vcHRpbWl6ZXInO1xuXG4vKiogQGRvY2xpbmsgT3B0aW1pemVyICovXG5leHBvcnQgY2xhc3MgQWRhZ3JhZE9wdGltaXplciBleHRlbmRzIE9wdGltaXplciB7XG4gIC8qKiBAbm9jb2xsYXBzZSAqL1xuICBzdGF0aWMgY2xhc3NOYW1lID0gJ0FkYWdyYWQnOyAgLy8gTm90ZTogTmFtZSBtYXR0ZXJzIGZvciBQeXRob24gY29tcGF0aWJpbGl0eS5cblxuICBwcml2YXRlIGFjY3VtdWxhdGVkR3JhZHM6IE9wdGltaXplclZhcmlhYmxlW10gPSBbXTtcblxuICBjb25zdHJ1Y3RvcihcbiAgICAgIHByb3RlY3RlZCBsZWFybmluZ1JhdGU6IG51bWJlciwgcHJpdmF0ZSBpbml0aWFsQWNjdW11bGF0b3JWYWx1ZSA9IDAuMSkge1xuICAgIHN1cGVyKCk7XG4gIH1cblxuICBhcHBseUdyYWRpZW50cyh2YXJpYWJsZUdyYWRpZW50czogTmFtZWRWYXJpYWJsZU1hcHxOYW1lZFRlbnNvcltdKSB7XG4gICAgY29uc3QgdmFyaWFibGVOYW1lcyA9IEFycmF5LmlzQXJyYXkodmFyaWFibGVHcmFkaWVudHMpID9cbiAgICAgICAgdmFyaWFibGVHcmFkaWVudHMubWFwKGl0ZW0gPT4gaXRlbS5uYW1lKSA6XG4gICAgICAgIE9iamVjdC5rZXlzKHZhcmlhYmxlR3JhZGllbnRzKTtcblxuICAgIHZhcmlhYmxlTmFtZXMuZm9yRWFjaCgobmFtZSwgaSkgPT4ge1xuICAgICAgY29uc3QgdmFsdWUgPSBFTkdJTkUucmVnaXN0ZXJlZFZhcmlhYmxlc1tuYW1lXTtcbiAgICAgIGlmICh0aGlzLmFjY3VtdWxhdGVkR3JhZHNbaV0gPT0gbnVsbCkge1xuICAgICAgICBjb25zdCB0cmFpbmFibGUgPSBmYWxzZTtcbiAgICAgICAgdGhpcy5hY2N1bXVsYXRlZEdyYWRzW2ldID0ge1xuICAgICAgICAgIG9yaWdpbmFsTmFtZTogYCR7bmFtZX0vYWNjdW11bGF0b3JgLFxuICAgICAgICAgIHZhcmlhYmxlOiB0aWR5KFxuICAgICAgICAgICAgICAoKSA9PiBmaWxsKHZhbHVlLnNoYXBlLCB0aGlzLmluaXRpYWxBY2N1bXVsYXRvclZhbHVlKVxuICAgICAgICAgICAgICAgICAgICAgICAgLnZhcmlhYmxlKHRyYWluYWJsZSkpXG4gICAgICAgIH07XG4gICAgICB9XG5cbiAgICAgIGNvbnN0IGdyYWRpZW50ID0gQXJyYXkuaXNBcnJheSh2YXJpYWJsZUdyYWRpZW50cykgP1xuICAgICAgICAgIHZhcmlhYmxlR3JhZGllbnRzW2ldLnRlbnNvciA6XG4gICAgICAgICAgdmFyaWFibGVHcmFkaWVudHNbbmFtZV07XG4gICAgICBpZiAoZ3JhZGllbnQgPT0gbnVsbCkge1xuICAgICAgICByZXR1cm47XG4gICAgICB9XG5cbiAgICAgIGNvbnN0IGFjY3VtdWxhdGVkR3JhZCA9IHRoaXMuYWNjdW11bGF0ZWRHcmFkc1tpXS52YXJpYWJsZTtcblxuICAgICAgdGlkeSgoKSA9PiB7XG4gICAgICAgIGNvbnN0IG5ld0FjY3VtdWxhdGVkR3JhZCA9IGFkZChhY2N1bXVsYXRlZEdyYWQsIHNxdWFyZShncmFkaWVudCkpO1xuICAgICAgICBhY2N1bXVsYXRlZEdyYWQuYXNzaWduKG5ld0FjY3VtdWxhdGVkR3JhZCk7XG5cbiAgICAgICAgY29uc3QgbmV3VmFsdWUgPSBhZGQoXG4gICAgICAgICAgICBtdWwoZGl2KGdyYWRpZW50LFxuICAgICAgICAgICAgICAgICAgICBzcXJ0KGFkZChuZXdBY2N1bXVsYXRlZEdyYWQsIEVOR0lORS5iYWNrZW5kLmVwc2lsb24oKSkpKSxcbiAgICAgICAgICAgICAgICAtdGhpcy5sZWFybmluZ1JhdGUpLFxuICAgICAgICAgICAgdmFsdWUpO1xuICAgICAgICB2YWx1ZS5hc3NpZ24obmV3VmFsdWUpO1xuICAgICAgfSk7XG4gICAgfSk7XG4gICAgdGhpcy5pbmNyZW1lbnRJdGVyYXRpb25zKCk7XG4gIH1cblxuICBkaXNwb3NlKCk6IHZvaWQge1xuICAgIGlmICh0aGlzLmFjY3VtdWxhdGVkR3JhZHMgIT0gbnVsbCkge1xuICAgICAgZGlzcG9zZSh0aGlzLmFjY3VtdWxhdGVkR3JhZHMubWFwKHYgPT4gdi52YXJpYWJsZSkpO1xuICAgIH1cbiAgfVxuXG4gIGFzeW5jIGdldFdlaWdodHMoKTogUHJvbWlzZTxOYW1lZFRlbnNvcltdPiB7XG4gICAgLy8gT3JkZXIgbWF0dGVycyBmb3IgUHl0aG9uIGNvbXBhdGliaWxpdHkuXG4gICAgcmV0dXJuIFthd2FpdCB0aGlzLnNhdmVJdGVyYXRpb25zKCldLmNvbmNhdCh0aGlzLmFjY3VtdWxhdGVkR3JhZHMubWFwKFxuICAgICAgICB2ID0+ICh7bmFtZTogdi5vcmlnaW5hbE5hbWUsIHRlbnNvcjogdi52YXJpYWJsZX0pKSk7XG4gIH1cblxuICBhc3luYyBzZXRXZWlnaHRzKHdlaWdodFZhbHVlczogTmFtZWRUZW5zb3JbXSk6IFByb21pc2U8dm9pZD4ge1xuICAgIHdlaWdodFZhbHVlcyA9IGF3YWl0IHRoaXMuZXh0cmFjdEl0ZXJhdGlvbnMod2VpZ2h0VmFsdWVzKTtcbiAgICBjb25zdCB0cmFpbmFibGUgPSBmYWxzZTtcbiAgICB0aGlzLmFjY3VtdWxhdGVkR3JhZHMgPSB3ZWlnaHRWYWx1ZXMubWFwKFxuICAgICAgICB2ID0+ICh7b3JpZ2luYWxOYW1lOiB2Lm5hbWUsIHZhcmlhYmxlOiB2LnRlbnNvci52YXJpYWJsZSh0cmFpbmFibGUpfSkpO1xuICB9XG5cbiAgZ2V0Q29uZmlnKCk6IENvbmZpZ0RpY3Qge1xuICAgIHJldHVybiB7XG4gICAgICAnbGVhcm5pbmdSYXRlJzogdGhpcy5sZWFybmluZ1JhdGUsXG4gICAgICAnaW5pdGlhbEFjY3VtdWxhdG9yVmFsdWUnOiB0aGlzLmluaXRpYWxBY2N1bXVsYXRvclZhbHVlLFxuICAgIH07XG4gIH1cblxuICAvKiogQG5vY29sbGFwc2UgKi9cbiAgc3RhdGljIGZyb21Db25maWc8VCBleHRlbmRzIFNlcmlhbGl6YWJsZT4oXG4gICAgICBjbHM6IFNlcmlhbGl6YWJsZUNvbnN0cnVjdG9yPFQ+LCBjb25maWc6IENvbmZpZ0RpY3QpOiBUIHtcbiAgICByZXR1cm4gbmV3IGNscyhjb25maWdbJ2xlYXJuaW5nUmF0ZSddLCBjb25maWdbJ2luaXRpYWxBY2N1bXVsYXRvclZhbHVlJ10pO1xuICB9XG59XG5yZWdpc3RlckNsYXNzKEFkYWdyYWRPcHRpbWl6ZXIpO1xuIl19","/**\n * @license\n * Copyright 2018 Google LLC. All Rights Reserved.\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n * =============================================================================\n */\nimport { ENGINE } from '../engine';\nimport { dispose, tidy } from '../globals';\nimport { add } from '../ops/add';\nimport { div } from '../ops/div';\nimport { mul } from '../ops/mul';\nimport { pow } from '../ops/pow';\nimport { scalar } from '../ops/scalar';\nimport { sqrt } from '../ops/sqrt';\nimport { square } from '../ops/square';\nimport { sub } from '../ops/sub';\nimport { zerosLike } from '../ops/zeros_like';\nimport { registerClass } from '../serialization';\nimport { Optimizer } from './optimizer';\nexport class AdamOptimizer extends Optimizer {\n constructor(learningRate, beta1, beta2, epsilon = null) {\n super();\n this.learningRate = learningRate;\n this.beta1 = beta1;\n this.beta2 = beta2;\n this.epsilon = epsilon;\n this.accumulatedFirstMoment = [];\n this.accumulatedSecondMoment = [];\n tidy(() => {\n // accB* will be updated by batch.\n this.accBeta1 = scalar(beta1).variable();\n this.accBeta2 = scalar(beta2).variable();\n });\n if (epsilon == null) {\n this.epsilon = ENGINE.backend.epsilon();\n }\n }\n applyGradients(variableGradients) {\n const varNames = Array.isArray(variableGradients) ?\n variableGradients.map(v => v.name) :\n Object.keys(variableGradients);\n tidy(() => {\n const oneMinusAccBeta1 = sub(1, this.accBeta1);\n const oneMinusAccBeta2 = sub(1, this.accBeta2);\n varNames.forEach((name, i) => {\n const value = ENGINE.registeredVariables[name];\n const trainable = false;\n if (this.accumulatedFirstMoment[i] == null) {\n this.accumulatedFirstMoment[i] = {\n originalName: `${name}/m`,\n variable: tidy(() => zerosLike(value).variable(trainable))\n };\n }\n if (this.accumulatedSecondMoment[i] == null) {\n this.accumulatedSecondMoment[i] = {\n originalName: `${name}/v`,\n variable: tidy(() => zerosLike(value).variable(trainable))\n };\n }\n const gradient = Array.isArray(variableGradients) ?\n variableGradients[i].tensor :\n variableGradients[name];\n if (gradient == null) {\n return;\n }\n const firstMoment = this.accumulatedFirstMoment[i].variable;\n const secondMoment = this.accumulatedSecondMoment[i].variable;\n const newFirstMoment = add(mul(firstMoment, this.beta1), mul(gradient, 1 - this.beta1));\n const newSecondMoment = add(mul(secondMoment, this.beta2), mul(square(gradient), 1 - this.beta2));\n const biasCorrectedFirstMoment = div(newFirstMoment, oneMinusAccBeta1);\n const biasCorrectedSecondMoment = div(newSecondMoment, oneMinusAccBeta2);\n firstMoment.assign(newFirstMoment);\n secondMoment.assign(newSecondMoment);\n const newValue = add(mul(div(biasCorrectedFirstMoment, add(sqrt(biasCorrectedSecondMoment), this.epsilon)), -this.learningRate), value);\n value.assign(newValue);\n });\n this.accBeta1.assign(mul(this.accBeta1, this.beta1));\n this.accBeta2.assign(mul(this.accBeta2, this.beta2));\n });\n this.incrementIterations();\n }\n dispose() {\n this.accBeta1.dispose();\n this.accBeta2.dispose();\n if (this.accumulatedFirstMoment != null) {\n dispose(this.accumulatedFirstMoment.map(v => v.variable));\n }\n if (this.accumulatedSecondMoment != null) {\n dispose(this.accumulatedSecondMoment.map(v => v.variable));\n }\n }\n async getWeights() {\n // Order matters for Python compatibility.\n const variables = [...this.accumulatedFirstMoment, ...this.accumulatedSecondMoment];\n return [await this.saveIterations()].concat(variables.map(v => ({ name: v.originalName, tensor: v.variable })));\n }\n async setWeights(weightValues) {\n weightValues = await this.extractIterations(weightValues);\n tidy(() => {\n this.accBeta1.assign(pow(this.beta1, this.iterations_ + 1));\n this.accBeta2.assign(pow(this.beta2, this.iterations_ + 1));\n });\n const variableCount = weightValues.length / 2;\n const trainable = false;\n this.accumulatedFirstMoment =\n weightValues.slice(0, variableCount).map(v => ({\n originalName: v.name,\n variable: v.tensor.variable(trainable)\n }));\n this.accumulatedSecondMoment =\n weightValues.slice(variableCount, variableCount * 2)\n .map(v => ({\n originalName: v.name,\n variable: v.tensor.variable(trainable)\n }));\n }\n getConfig() {\n return {\n 'learningRate': this.learningRate,\n 'beta1': this.beta1,\n 'beta2': this.beta2,\n 'epsilon': this.epsilon,\n };\n }\n /** @nocollapse */\n static fromConfig(cls, config) {\n return new cls(config['learningRate'], config['beta1'], config['beta2'], config['epsilon']);\n }\n}\n/** @nocollapse */\nAdamOptimizer.className = 'Adam'; // Note: Name matters for Python compatibility.\nregisterClass(AdamOptimizer);\n//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYWRhbV9vcHRpbWl6ZXIuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi8uLi90ZmpzLWNvcmUvc3JjL29wdGltaXplcnMvYWRhbV9vcHRpbWl6ZXIudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUE7Ozs7Ozs7Ozs7Ozs7OztHQWVHO0FBRUgsT0FBTyxFQUFDLE1BQU0sRUFBQyxNQUFNLFdBQVcsQ0FBQztBQUNqQyxPQUFPLEVBQUMsT0FBTyxFQUFFLElBQUksRUFBQyxNQUFNLFlBQVksQ0FBQztBQUN6QyxPQUFPLEVBQUMsR0FBRyxFQUFDLE1BQU0sWUFBWSxDQUFDO0FBQy9CLE9BQU8sRUFBQyxHQUFHLEVBQUMsTUFBTSxZQUFZLENBQUM7QUFDL0IsT0FBTyxFQUFDLEdBQUcsRUFBQyxNQUFNLFlBQVksQ0FBQztBQUMvQixPQUFPLEVBQUMsR0FBRyxFQUFDLE1BQU0sWUFBWSxDQUFDO0FBQy9CLE9BQU8sRUFBQyxNQUFNLEVBQUMsTUFBTSxlQUFlLENBQUM7QUFDckMsT0FBTyxFQUFDLElBQUksRUFBQyxNQUFNLGFBQWEsQ0FBQztBQUNqQyxPQUFPLEVBQUMsTUFBTSxFQUFDLE1BQU0sZUFBZSxDQUFDO0FBQ3JDLE9BQU8sRUFBQyxHQUFHLEVBQUMsTUFBTSxZQUFZLENBQUM7QUFDL0IsT0FBTyxFQUFDLFNBQVMsRUFBQyxNQUFNLG1CQUFtQixDQUFDO0FBQzVDLE9BQU8sRUFBYSxhQUFhLEVBQXdDLE1BQU0sa0JBQWtCLENBQUM7QUFJbEcsT0FBTyxFQUFDLFNBQVMsRUFBb0IsTUFBTSxhQUFhLENBQUM7QUFFekQsTUFBTSxPQUFPLGFBQWMsU0FBUSxTQUFTO0lBUzFDLFlBQ2MsWUFBb0IsRUFBWSxLQUFhLEVBQzdDLEtBQWEsRUFBWSxVQUFrQixJQUFJO1FBQzNELEtBQUssRUFBRSxDQUFDO1FBRkksaUJBQVksR0FBWixZQUFZLENBQVE7UUFBWSxVQUFLLEdBQUwsS0FBSyxDQUFRO1FBQzdDLFVBQUssR0FBTCxL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Q2xCLE1BQU0sQ0FBQyxVQUFVLENBQ2IsR0FBK0IsRUFBRSxNQUFrQjtRQUNyRCxPQUFPLElBQUksR0FBRyxDQUNWLE1BQU0sQ0FBQyxjQUFjLENBQUMsRUFBRSxNQUFNLENBQUMsT0FBTyxDQUFDLEVBQUUsTUFBTSxDQUFDLE9BQU8sQ0FBQyxFQUN4RCxNQUFNLENBQUMsU0FBUyxDQUFDLENBQUMsQ0FBQztJQUN6QixDQUFDOztBQTlJRCxrQkFBa0I7QUFDWCx1QkFBUyxHQUFHLE1BQU0sQ0FBQyxDQUFFLCtDQUErQztBQStJN0UsYUFBYSxDQUFDLGFBQWEsQ0FBQyxDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiLyoqXG4gKiBAbGljZW5zZVxuICogQ29weXJpZ2h0IDIwMTggR29vZ2xlIExMQy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC5cbiAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSBcIkxpY2Vuc2VcIik7XG4gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuXG4gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXRcbiAqXG4gKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjBcbiAqXG4gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlXG4gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiBcIkFTIElTXCIgQkFTSVMsXG4gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC5cbiAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmRcbiAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLlxuICogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbiAqL1xuXG5pbXBvcnQge0VOR0lORX0gZnJvbSAnLi4vZW5naW5lJztcbmltcG9ydCB7ZGlzcG9zZSwgdGlkeX0gZnJvbSAnLi4vZ2xvYmFscyc7XG5pbXBvcnQge2FkZH0gZnJvbSAnLi4vb3BzL2FkZCc7XG5pbXBvcnQge2Rpdn0gZnJvbSAnLi4vb3BzL2Rpdic7XG5pbXBvcnQge211bH0gZnJvbSAnLi4vb3BzL211bCc7XG5pbXBvcnQge3Bvd30gZnJvbSAnLi4vb3BzL3Bvdyc7XG5pbXBvcnQge3NjYWxhcn0gZnJvbSAnLi4vb3BzL3NjYWxhcic7XG5pbXBvcnQge3NxcnR9IGZyb20gJy4uL29wcy9zcXJ0JztcbmltcG9ydCB7c3F1YXJlfSBmcm9tICcuLi9vcHMvc3F1YXJlJztcbmltcG9ydCB7c3VifSBmcm9tICcuLi9vcHMvc3ViJztcbmltcG9ydCB7emVyb3NMaWtlfSBmcm9tICcuLi9vcHMvemVyb3NfbGlrZSc7XG5pbXBvcnQge0NvbmZpZ0RpY3QsIHJlZ2lzdGVyQ2xhc3MsIFNlcmlhbGl6YWJsZSwgU2VyaWFsaXphYmxlQ29uc3RydWN0b3J9IGZyb20gJy4uL3NlcmlhbGl6YXRpb24nO1xuaW1wb3J0IHtWYXJpYWJsZX0gZnJvbSAnLi4vdGVuc29yJztcbmltcG9ydCB7TmFtZWRUZW5zb3IsIE5hbWVkVmFyaWFibGVNYXB9IGZyb20gJy4uL3RlbnNvcl90eXBlcyc7XG5cbmltcG9ydCB7T3B0aW1pemVyLCBPcHRpbWl6ZXJWYXJpYWJsZX0gZnJvbSAnLi9vcHRpbWl6ZXInO1xuXG5leHBvcnQgY2xhc3MgQWRhbU9wdGltaXplciBleHRlbmRzIE9wdGltaXplciB7XG4gIC8qKiBAbm9jb2xsYXBzZSAqL1xuICBzdGF0aWMgY2xhc3NOYW1lID0gJ0FkYW0nOyAgLy8gTm90ZTogTmFtZSBtYXR0ZXJzIGZvciBQeXRob24gY29tcGF0aWJpbGl0eS5cbiAgcHJpdmF0ZSBhY2NCZXRhMTogVmFyaWFibGU7XG4gIHByaXZhdGUgYWNjQmV0YTI6IFZhcmlhYmxlO1xuXG4gIHByaXZhdGUgYWNjdW11bGF0ZWRGaXJzdE1vbWVudDogT3B0aW1pemVyVmFyaWFibGVbXSA9IFtdO1xuICBwcml2YXRlIGFjY3VtdWxhdGVkU2Vjb25kTW9tZW50OiBPcHRpbWl6ZXJWYXJpYWJsZVtdID0gW107XG5cbiAgY29uc3RydWN0b3IoXG4gICAgICBwcm90ZWN0ZWQgbGVhcm5pbmdSYXRlOiBudW1iZXIsIHByb3RlY3RlZCBiZXRhMTogbnVtYmVyLFxuICAgICAgcHJvdGVjdGVkIGJldGEyOiBudW1iZXIsIHByb3RlY3RlZCBlcHNpbG9uOiBudW1iZXIgPSBudWxsKSB7XG4gICAgc3VwZXIoKTtcbiAgICB0aWR5KCgpID0+IHtcbiAgICAgIC8vIGFjY0IqIHdpbGwgYmUgdXBkYXRlZCBieSBiYXRjaC5cbiAgICAgIHRoaXMuYWNjQmV0YTEgPSBzY2FsYXIoYmV0YTEpLnZhcmlhYmxlKCk7XG4gICAgICB0aGlzLmFjY0JldGEyID0gc2NhbGFyKGJldGEyKS52YXJpYWJsZSgpO1xuICAgIH0pO1xuXG4gICAgaWYgKGVwc2lsb24gPT0gbnVsbCkge1xuICAgICAgdGhpcy5lcHNpbG9uID0gRU5HSU5FLmJhY2tlbmQuZXBzaWxvbigpO1xuICAgIH1cbiAgfVxuXG4gIGFwcGx5R3JhZGllbnRzKHZhcmlhYmxlR3JhZGllbnRzOiBOYW1lZFZhcmlhYmxlTWFwfE5hbWVkVGVuc29yW10pIHtcbiAgICBjb25zdCB2YXJOYW1lcyA9IEFycmF5LmlzQXJyYXkodmFyaWFibGVHcmFkaWVudHMpID9cbiAgICAgICAgdmFyaWFibGVHcmFkaWVudHMubWFwKHYgPT4gdi5uYW1lKSA6XG4gICAgICAgIE9iamVjdC5rZXlzKHZhcmlhYmxlR3JhZGllbnRzKTtcbiAgICB0aWR5KCgpID0+IHtcbiAgICAgIGNvbnN0IG9uZU1pbnVzQWNjQmV0YTEgPSBzdWIoMSwgdGhpcy5hY2NCZXRhMSk7XG4gICAgICBjb25zdCBvbmVNaW51c0FjY0JldGEyID0gc3ViKDEsIHRoaXMuYWNjQmV0YTIpO1xuXG4gICAgICB2YXJOYW1lcy5mb3JFYWNoKChuYW1lLCBpKSA9PiB7XG4gICAgICAgIGNvbnN0IHZhbHVlID0gRU5HSU5FLnJlZ2lzdGVyZWRWYXJpYWJsZXNbbmFtZV07XG4gICAgICAgIGNvbnN0IHRyYWluYWJsZSA9IGZhbHNlO1xuICAgICAgICBpZiAodGhpcy5hY2N1bXVsYXRlZEZpcnN0TW9tZW50W2ldID09IG51bGwpIHtcbiAgICAgICAgICB0aGlzLmFjY3VtdWxhdGVkRmlyc3RNb21lbnRbaV0gPSB7XG4gICAgICAgICAgICBvcmlnaW5hbE5hbWU6IGAke25hbWV9L21gLFxuICAgICAgICAgICAgdmFyaWFibGU6IHRpZHkoKCkgPT4gemVyb3NMaWtlKHZhbHVlKS52YXJpYWJsZSh0cmFpbmFibGUpKVxuICAgICAgICAgIH07XG4gICAgICAgIH1cbiAgICAgICAgaWYgKHRoaXMuYWNjdW11bGF0ZWRTZWNvbmRNb21lbnRbaV0gPT0gbnVsbCkge1xuICAgICAgICAgIHRoaXMuYWNjdW11bGF0ZWRTZWNvbmRNb21lbnRbaV0gPSB7XG4gICAgICAgICAgICBvcmlnaW5hbE5hbWU6IGAke25hbWV9L3ZgLFxuICAgICAgICAgICAgdmFyaWFibGU6IHRpZHkoKCkgPT4gemVyb3NMaWtlKHZhbHVlKS52YXJpYWJsZSh0cmFpbmFibGUpKVxuICAgICAgICAgIH07XG4gICAgICAgIH1cblxuICAgICAgICBjb25zdCBncmFkaWVudCA9IEFycmF5LmlzQXJyYXkodmFyaWFibGVHcmFkaWVudHMpID9cbiAgICAgICAgICAgIHZhcmlhYmxlR3JhZGllbnRzW2ldLnRlbnNvciA6XG4gICAgICAgICAgICB2YXJpYWJsZUdyYWRpZW50c1tuYW1lXTtcbiAgICAgICAgaWYgKGdyYWRpZW50ID09IG51bGwpIHtcbiAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cblxuICAgICAgICBjb25zdCBmaXJzdE1vbWVudCA9IHRoaXMuYWNjdW11bGF0ZWRGaXJzdE1vbWVudFtpXS52YXJpYWJsZTtcbiAgICAgICAgY29uc3Qgc2Vjb25kTW9tZW50ID0gdGhpcy5hY2N1bXVsYXRlZFNlY29uZE1vbWVudFtpXS52YXJpYWJsZTtcblxuICAgICAgICBjb25zdCBuZXdGaXJzdE1vbWVudCA9XG4gICAgICAgICAgICBhZGQobXVsKGZpcnN0TW9tZW50LCB0aGlzLmJldGExKSwgbXVsKGdyYWRpZW50LCAxIC0gdGhpcy5iZXRhMSkpO1xuICAgICAgICBjb25zdCBuZXdTZWNvbmRNb21lbnQgPVxuICAgICAgICAgICAgYWRkKG11bChzZWNvbmRNb21lbnQsIHRoaXMuYmV0YTIpLFxuICAgICAgICAgICAgICAgIG11bChzcXVhcmUoZ3JhZGllbnQpLCAxIC0gdGhpcy5iZXRhMikpO1xuXG4gICAgICAgIGNvbnN0IGJpYXNDb3JyZWN0ZWRGaXJzdE1vbWVudCA9IGRpdihuZXdGaXJzdE1vbWVudCwgb25lTWludXNBY2NCZXRhMSk7XG4gICAgICAgIGNvbnN0IGJpYXNDb3JyZWN0ZWRTZWNvbmRNb21lbnQgPVxuICAgICAgICAgICAgZGl2KG5ld1NlY29uZE1vbWVudCwgb25lTWludXNBY2NCZXRhMik7XG5cbiAgICAgICAgZmlyc3RNb21lbnQuYXNzaWduKG5ld0ZpcnN0TW9tZW50KTtcbiAgICAgICAgc2Vjb25kTW9tZW50LmFzc2lnbihuZXdTZWNvbmRNb21lbnQpO1xuXG4gICAgICAgIGNvbnN0IG5ld1ZhbHVlID1cbiAgICAgICAgICAgIGFkZChtdWwoZGl2KGJpYXNDb3JyZWN0ZWRGaXJzdE1vbWVudCxcbiAgICAgICAgICAgICAgICAgICAgICAgIGFkZChzcXJ0KGJpYXNDb3JyZWN0ZWRTZWNvbmRNb21lbnQpLCB0aGlzLmVwc2lsb24pKSxcbiAgICAgICAgICAgICAgICAgICAgLXRoaXMubGVhcm5pbmdSYXRlKSxcbiAgICAgICAgICAgICAgICB2YWx1ZSk7XG4gICAgICAgIHZhbHVlLmFzc2lnbihuZXdWYWx1ZSk7XG4gICAgICB9KTtcblxuICAgICAgdGhpcy5hY2NCZXRhMS5hc3NpZ24obXVsKHRoaXMuYWNjQmV0YTEsIHRoaXMuYmV0YTEpKTtcbiAgICAgIHRoaXMuYWNjQmV0YTIuYXNzaWduKG11bCh0aGlzLmFjY0JldGEyLCB0aGlzLmJldGEyKSk7XG4gICAgfSk7XG4gICAgdGhpcy5pbmNyZW1lbnRJdGVyYXRpb25zKCk7XG4gIH1cblxuICBkaXNwb3NlKCk6IHZvaWQge1xuICAgIHRoaXMuYWNjQmV0YTEuZGlzcG9zZSgpO1xuICAgIHRoaXMuYWNjQmV0YTIuZGlzcG9zZSgpO1xuXG4gICAgaWYgKHRoaXMuYWNjdW11bGF0ZWRGaXJzdE1vbWVudCAhPSBudWxsKSB7XG4gICAgICBkaXNwb3NlKHRoaXMuYWNjdW11bGF0ZWRGaXJzdE1vbWVudC5tYXAodiA9PiB2LnZhcmlhYmxlKSk7XG4gICAgfVxuICAgIGlmICh0aGlzLmFjY3VtdWxhdGVkU2Vjb25kTW9tZW50ICE9IG51bGwpIHtcbiAgICAgIGRpc3Bvc2UodGhpcy5hY2N1bXVsYXRlZFNlY29uZE1vbWVudC5tYXAodiA9PiB2LnZhcmlhYmxlKSk7XG4gICAgfVxuICB9XG5cbiAgYXN5bmMgZ2V0V2VpZ2h0cygpOiBQcm9taXNlPE5hbWVkVGVuc29yW10+IHtcbiAgICAvLyBPcmRlciBtYXR0ZXJzIGZvciBQeXRob24gY29tcGF0aWJpbGl0eS5cbiAgICBjb25zdCB2YXJpYWJsZXM6IE9wdGltaXplclZhcmlhYmxlW10gPVxuICAgICAgICBbLi4udGhpcy5hY2N1bXVsYXRlZEZpcnN0TW9tZW50LCAuLi50aGlzLmFjY3VtdWxhdGVkU2Vjb25kTW9tZW50XTtcbiAgICByZXR1cm4gW2F3YWl0IHRoaXMuc2F2ZUl0ZXJhdGlvbnMoKV0uY29uY2F0KFxuICAgICAgICB2YXJpYWJsZXMubWFwKHYgPT4gKHtuYW1lOiB2Lm9yaWdpbmFsTmFtZSwgdGVuc29yOiB2LnZhcmlhYmxlfSkpKTtcbiAgfVxuXG4gIGFzeW5jIHNldFdlaWdodHMod2VpZ2h0VmFsdWVzOiBOYW1lZFRlbnNvcltdKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgd2VpZ2h0VmFsdWVzID0gYXdhaXQgdGhpcy5leHRyYWN0SXRlcmF0aW9ucyh3ZWlnaHRWYWx1ZXMpO1xuICAgIHRpZHkoKCkgPT4ge1xuICAgICAgdGhpcy5hY2NCZXRhMS5hc3NpZ24ocG93KHRoaXMuYmV0YTEsIHRoaXMuaXRlcmF0aW9uc18gKyAxKSk7XG4gICAgICB0aGlzLmFjY0JldGEyLmFzc2lnbihwb3codGhpcy5iZXRhMiwgdGhpcy5pdGVyYXRpb25zXyArIDEpKTtcbiAgICB9KTtcblxuICAgIGNvbnN0IHZhcmlhYmxlQ291bnQgPSB3ZWlnaHRWYWx1ZXMubGVuZ3RoIC8gMjtcbiAgICBjb25zdCB0cmFpbmFibGUgPSBmYWxzZTtcbiAgICB0aGlzLmFjY3VtdWxhdGVkRmlyc3RNb21lbnQgPVxuICAgICAgICB3ZWlnaHRWYWx1ZXMuc2xpY2UoMCwgdmFyaWFibGVDb3VudCkubWFwKHYgPT4gKHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9yaWdpbmFsTmFtZTogdi5uYW1lLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFyaWFibGU6IHYudGVuc29yLnZhcmlhYmxlKFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRyYWluYWJsZSlcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9KSk7XG4gICAgdGhpcy5hY2N1bXVsYXRlZFNlY29uZE1vbWVudCA9XG4gICAgICAgIHdlaWdodFZhbHVlcy5zbGljZSh2YXJpYWJsZUNvdW50LCB2YXJpYWJsZUNvdW50ICogMilcbiAgICAgICAgICAgIC5tYXAodiA9PiAoe1xuICAgICAgICAgICAgICAgICAgIG9yaWdpbmFsTmFtZTogdi5uYW1lLFxuICAgICAgICAgICAgICAgICAgIHZhcmlhYmxlOiB2LnRlbnNvci52YXJpYWJsZSh0cmFpbmFibGUpXG4gICAgICAgICAgICAgICAgIH0pKTtcbiAgfVxuXG4gIGdldENvbmZpZygpOiBDb25maWdEaWN0IHtcbiAgICByZXR1cm4ge1xuICAgICAgJ2xlYXJuaW5nUmF0ZSc6IHRoaXMubGVhcm5pbmdSYXRlLFxuICAgICAgJ2JldGExJzogdGhpcy5iZXRhMSxcbiAgICAgICdiZXRhMic6IHRoaXMuYmV0YTIsXG4gICAgICAnZXBzaWxvbic6IHRoaXMuZXBzaWxvbixcbiAgICB9O1xuICB9XG5cbiAgLyoqIEBub2NvbGxhcHNlICovXG4gIHN0YXRpYyBmcm9tQ29uZmlnPFQgZXh0ZW5kcyBTZXJpYWxpemFibGU+KFxuICAgICAgY2xzOiBTZXJpYWxpemFibGVDb25zdHJ1Y3RvcjxUPiwgY29uZmlnOiBDb25maWdEaWN0KTogVCB7XG4gICAgcmV0dXJuIG5ldyBjbHMoXG4gICAgICAgIGNvbmZpZ1snbGVhcm5pbmdSYXRlJ10sIGNvbmZpZ1snYmV0YTEnXSwgY29uZmlnWydiZXRhMiddLFxuICAgICAgICBjb25maWdbJ2Vwc2lsb24nXSk7XG4gIH1cbn1cbnJlZ2lzdGVyQ2xhc3MoQWRhbU9wdGltaXplcik7XG4iXX0=","/**\n * @license\n * Copyright 2018 Google LLC. All Rights Reserved.\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n * =============================================================================\n */\nimport { ENGINE } from '../engine';\nimport { dispose, tidy } from '../globals';\nimport { abs } from '../ops/abs';\nimport { add } from '../ops/add';\nimport { div } from '../ops/div';\nimport { maximum } from '../ops/maximum';\nimport { mul } from '../ops/mul';\nimport { scalar } from '../ops/scalar';\nimport { sub } from '../ops/sub';\nimport { zerosLike } from '../ops/zeros_like';\nimport { registerClass } from '../serialization';\nimport { Optimizer } from './optimizer';\nexport class AdamaxOptimizer extends Optimizer {\n constructor(learningRate, beta1, beta2, epsilon = null, decay = 0.0) {\n super();\n this.learningRate = learningRate;\n this.beta1 = beta1;\n this.beta2 = beta2;\n this.epsilon = epsilon;\n this.decay = decay;\n this.accumulatedFirstMoment = [];\n this.accumulatedWeightedInfNorm = [];\n tidy(() => {\n this.iteration = scalar(0).variable();\n this.accBeta1 = scalar(beta1).variable();\n });\n if (epsilon == null) {\n this.epsilon = ENGINE.backend.epsilon();\n }\n }\n applyGradients(variableGradients) {\n const variableNames = Array.isArray(variableGradients) ?\n variableGradients.map(item => item.name) :\n Object.keys(variableGradients);\n tidy(() => {\n const oneMinusAccBeta1 = sub(1, this.accBeta1);\n const lr = div(-this.learningRate, add(mul(this.iteration, this.decay), 1));\n variableNames.forEach((name, i) => {\n const value = ENGINE.registeredVariables[name];\n const trainable = false;\n if (this.accumulatedFirstMoment[i] == null) {\n this.accumulatedFirstMoment[i] = {\n originalName: `${name}/m`,\n variable: zerosLike(value).variable(trainable)\n };\n }\n if (this.accumulatedWeightedInfNorm[i] == null) {\n this.accumulatedWeightedInfNorm[i] = {\n originalName: `${name}/v`,\n variable: zerosLike(value).variable(trainable)\n };\n }\n const gradient = Array.isArray(variableGradients) ?\n variableGradients[i].tensor :\n variableGradients[name];\n if (gradient == null) {\n return;\n }\n const firstMoment = this.accumulatedFirstMoment[i].variable;\n const weightedInfNorm = this.accumulatedWeightedInfNorm[i].variable;\n const newFirstMoment = add(mul(firstMoment, this.beta1), mul(gradient, 1 - this.beta1));\n const ut0 = mul(weightedInfNorm, this.beta2);\n const ut1 = abs(gradient);\n const newWeightedInfNorm = maximum(ut0, ut1);\n firstMoment.assign(newFirstMoment);\n weightedInfNorm.assign(newWeightedInfNorm);\n const newValue = add(mul(div(lr, oneMinusAccBeta1), div(newFirstMoment, add(newWeightedInfNorm, this.epsilon))), value);\n value.assign(newValue);\n });\n this.iteration.assign(add(this.iteration, 1));\n this.accBeta1.assign(mul(this.accBeta1, this.beta1));\n });\n this.incrementIterations();\n }\n dispose() {\n this.accBeta1.dispose();\n this.iteration.dispose();\n if (this.accumulatedFirstMoment != null) {\n dispose(this.accumulatedFirstMoment.map(v => v.variable));\n }\n if (this.accumulatedWeightedInfNorm != null) {\n dispose(this.accumulatedWeightedInfNorm.map(v => v.variable));\n }\n }\n async getWeights() {\n throw new Error('getWeights() is not implemented for Adamax yet.');\n }\n async setWeights(weightValues) {\n throw new Error('setWeights() is not implemented for Adamax yet.');\n }\n getConfig() {\n return {\n 'learningRate': this.learningRate,\n 'beta1': this.beta1,\n 'beta2': this.beta2,\n 'epsilon': this.epsilon,\n 'decay': this.decay\n };\n }\n /** @nocollapse */\n static fromConfig(cls, config) {\n return new cls(config['learningRate'], config['beta1'], config['beta2'], config['epsilon'], config['decay']);\n }\n}\n/** @nocollapse */\nAdamaxOptimizer.className = 'Adamax'; // Note: Name matters for Python compatbility.\nregisterClass(AdamaxOptimizer);\n//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYWRhbWF4X29wdGltaXplci5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uLy4uL3RmanMtY29yZS9zcmMvb3B0aW1pemVycy9hZGFtYXhfb3B0aW1pemVyLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBOzs7Ozs7Ozs7Ozs7Ozs7R0FlRztBQUVILE9BQU8sRUFBQyxNQUFNLEVBQUMsTUFBTSxXQUFXLENBQUM7QUFDakMsT0FBTyxFQUFDLE9BQU8sRUFBRSxJQUFJLEVBQUMsTUFBTSxZQUFZLENBQUM7QUFDekMsT0FBTyxFQUFDLEdBQUcsRUFBQyxNQUFNLFlBQVksQ0FBQztBQUMvQixPQUFPLEVBQUMsR0FBRyxFQUFDLE1BQU0sWUFBWSxDQUFDO0FBQy9CLE9BQU8sRUFBQyxHQUFHLEVBQUMsTUFBTSxZQUFZLENBQUM7QUFDL0IsT0FBTyxFQUFDLE9BQU8sRUFBQyxNQUFNLGdCQUFnQixDQUFDO0FBQ3ZDLE9BQU8sRUFBQyxHQUFHLEVBQUMsTUFBTSxZQUFZLENBQUM7QUFDL0IsT0FBTyxFQUFDLE1BQU0sRUFBQyxNQUFNLGVBQWUsQ0FBQztBQUNyQyxPQUFPLEVBQUMsR0FBRyxFQUFDLE1BQU0sWUFBWSxDQUFDO0FBQy9CLE9BQU8sRUFBQyxTQUFTLEVBQUMsTUFBTSxtQkFBbUIsQ0FBQztBQUM1QyxPQUFPLEVBQWEsYUFBYSxFQUF3QyxNQUFNLGtCQUFrQixDQUFDO0FBSWxHLE9BQU8sRUFBQyxTQUFTLEVBQW9CLE1BQU0sYUFBYSxDQUFDO0FBRXpELE1BQU0sT0FBTyxlQUFnQixTQUFRLFNBQVM7SUFTNUMsWUFDYyxZQUFvQixFQUFZLEtBQWEsRUFDN0MsS0FBYSxFQUFZLFVBQWtCLElBQUksRUFDL0MsUUFBUSxHQUFHO1FBQ3ZCLEtBQUssRUFBRSxDQUFDO1FBSEksaUJBQVksR0FBWixZQUFZLENBQVE7UUFBWSxVQUFLLEdBQUwsS0FBSyxDQUFRO1FBQzdDLFVBQUssR0FBTCxLQUFLLENBQVE7UUFBWSxZQUFP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eUJBQVMsR0FBRyxRQUFRLENBQUMsQ0FBRSw4Q0FBOEM7QUEwSDlFLGFBQWEsQ0FBQyxlQUFlLENBQUMsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbIi8qKlxuICogQGxpY2Vuc2VcbiAqIENvcHlyaWdodCAyMDE4IEdvb2dsZSBMTEMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuXG4gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgXCJMaWNlbnNlXCIpO1xuICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLlxuICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0XG4gKlxuICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wXG4gKlxuICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZVxuICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gXCJBUyBJU1wiIEJBU0lTLFxuICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuXG4gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kXG4gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS5cbiAqID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4gKi9cblxuaW1wb3J0IHtFTkdJTkV9IGZyb20gJy4uL2VuZ2luZSc7XG5pbXBvcnQge2Rpc3Bvc2UsIHRpZHl9IGZyb20gJy4uL2dsb2JhbHMnO1xuaW1wb3J0IHthYnN9IGZyb20gJy4uL29wcy9hYnMnO1xuaW1wb3J0IHthZGR9IGZyb20gJy4uL29wcy9hZGQnO1xuaW1wb3J0IHtkaXZ9IGZyb20gJy4uL29wcy9kaXYnO1xuaW1wb3J0IHttYXhpbXVtfSBmcm9tICcuLi9vcHMvbWF4aW11bSc7XG5pbXBvcnQge211bH0gZnJvbSAnLi4vb3BzL211bCc7XG5pbXBvcnQge3NjYWxhcn0gZnJvbSAnLi4vb3BzL3NjYWxhcic7XG5pbXBvcnQge3N1Yn0gZnJvbSAnLi4vb3BzL3N1Yic7XG5pbXBvcnQge3plcm9zTGlrZX0gZnJvbSAnLi4vb3BzL3plcm9zX2xpa2UnO1xuaW1wb3J0IHtDb25maWdEaWN0LCByZWdpc3RlckNsYXNzLCBTZXJpYWxpemFibGUsIFNlcmlhbGl6YWJsZUNvbnN0cnVjdG9yfSBmcm9tICcuLi9zZXJpYWxpemF0aW9uJztcbmltcG9ydCB7VmFyaWFibGV9IGZyb20gJy4uL3RlbnNvcic7XG5pbXBvcnQge05hbWVkVGVuc29yLCBOYW1lZFZhcmlhYmxlTWFwfSBmcm9tICcuLi90ZW5zb3JfdHlwZXMnO1xuXG5pbXBvcnQge09wdGltaXplciwgT3B0aW1pemVyVmFyaWFibGV9IGZyb20gJy4vb3B0aW1pemVyJztcblxuZXhwb3J0IGNsYXNzIEFkYW1heE9wdGltaXplciBleHRlbmRzIE9wdGltaXplciB7XG4gIC8qKiBAbm9jb2xsYXBzZSAqL1xuICBzdGF0aWMgY2xhc3NOYW1lID0gJ0FkYW1heCc7ICAvLyBOb3RlOiBOYW1lIG1hdHRlcnMgZm9yIFB5dGhvbiBjb21wYXRiaWxpdHkuXG4gIHByaXZhdGUgYWNjQmV0YTE6IFZhcmlhYmxlO1xuICBwcml2YXRlIGl0ZXJhdGlvbjogVmFyaWFibGU7XG5cbiAgcHJpdmF0ZSBhY2N1bXVsYXRlZEZpcnN0TW9tZW50OiBPcHRpbWl6ZXJWYXJpYWJsZVtdID0gW107XG4gIHByaXZhdGUgYWNjdW11bGF0ZWRXZWlnaHRlZEluZk5vcm06IE9wdGltaXplclZhcmlhYmxlW10gPSBbXTtcblxuICBjb25zdHJ1Y3RvcihcbiAgICAgIHByb3RlY3RlZCBsZWFybmluZ1JhdGU6IG51bWJlciwgcHJvdGVjdGVkIGJldGExOiBudW1iZXIsXG4gICAgICBwcm90ZWN0ZWQgYmV0YTI6IG51bWJlciwgcHJvdGVjdGVkIGVwc2lsb246IG51bWJlciA9IG51bGwsXG4gICAgICBwcm90ZWN0ZWQgZGVjYXkgPSAwLjApIHtcbiAgICBzdXBlcigpO1xuXG4gICAgdGlkeSgoKSA9PiB7XG4gICAgICB0aGlzLml0ZXJhdGlvbiA9IHNjYWxhcigwKS52YXJpYWJsZSgpO1xuICAgICAgdGhpcy5hY2NCZXRhMSA9IHNjYWxhcihiZXRhMSkudmFyaWFibGUoKTtcbiAgICB9KTtcblxuICAgIGlmIChlcHNpbG9uID09IG51bGwpIHtcbiAgICAgIHRoaXMuZXBzaWxvbiA9IEVOR0lORS5iYWNrZW5kLmVwc2lsb24oKTtcbiAgICB9XG4gIH1cblxuICBhcHBseUdyYWRpZW50cyh2YXJpYWJsZUdyYWRpZW50czogTmFtZWRWYXJpYWJsZU1hcHxOYW1lZFRlbnNvcltdKSB7XG4gICAgY29uc3QgdmFyaWFibGVOYW1lcyA9IEFycmF5LmlzQXJyYXkodmFyaWFibGVHcmFkaWVudHMpID9cbiAgICAgICAgdmFyaWFibGVHcmFkaWVudHMubWFwKGl0ZW0gPT4gaXRlbS5uYW1lKSA6XG4gICAgICAgIE9iamVjdC5rZXlzKHZhcmlhYmxlR3JhZGllbnRzKTtcblxuICAgIHRpZHkoKCkgPT4ge1xuICAgICAgY29uc3Qgb25lTWludXNBY2NCZXRhMSA9IHN1YigxLCB0aGlzLmFjY0JldGExKTtcbiAgICAgIGNvbnN0IGxyID1cbiAgICAgICAgICBkaXYoLXRoaXMubGVhcm5pbmdSYXRlLCBhZGQobXVsKHRoaXMuaXRlcmF0aW9uLCB0aGlzLmRlY2F5KSwgMSkpO1xuXG4gICAgICB2YXJpYWJsZU5hbWVzLmZvckVhY2goKG5hbWUsIGkpID0+IHtcbiAgICAgICAgY29uc3QgdmFsdWUgPSBFTkdJTkUucmVnaXN0ZXJlZFZhcmlhYmxlc1tuYW1lXTtcbiAgICAgICAgY29uc3QgdHJhaW5hYmxlID0gZmFsc2U7XG4gICAgICAgIGlmICh0aGlzLmFjY3VtdWxhdGVkRmlyc3RNb21lbnRbaV0gPT0gbnVsbCkge1xuICAgICAgICAgIHRoaXMuYWNjdW11bGF0ZWRGaXJzdE1vbWVudFtpXSA9IHtcbiAgICAgICAgICAgIG9yaWdpbmFsTmFtZTogYCR7bmFtZX0vbWAsXG4gICAgICAgICAgICB2YXJpYWJsZTogemVyb3NMaWtlKHZhbHVlKS52YXJpYWJsZSh0cmFpbmFibGUpXG4gICAgICAgICAgfTtcbiAgICAgICAgfVxuICAgICAgICBpZiAodGhpcy5hY2N1bXVsYXRlZFdlaWdodGVkSW5mTm9ybVtpXSA9PSBudWxsKSB7XG4gICAgICAgICAgdGhpcy5hY2N1bXVsYXRlZFdlaWdodGVkSW5mTm9ybVtpXSA9IHtcbiAgICAgICAgICAgIG9yaWdpbmFsTmFtZTogYCR7bmFtZX0vdmAsXG4gICAgICAgICAgICB2YXJpYWJsZTogemVyb3NMaWtlKHZhbHVlKS52YXJpYWJsZSh0cmFpbmFibGUpXG4gICAgICAgICAgfTtcbiAgICAgICAgfVxuXG4gICAgICAgIGNvbnN0IGdyYWRpZW50ID0gQXJyYXkuaXNBcnJheSh2YXJpYWJsZUdyYWRpZW50cykgP1xuICAgICAgICAgICAgdmFyaWFibGVHcmFkaWVudHNbaV0udGVuc29yIDpcbiAgICAgICAgICAgIHZhcmlhYmxlR3JhZGllbnRzW25hbWVdO1xuICAgICAgICBpZiAoZ3JhZGllbnQgPT0gbnVsbCkge1xuICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuXG4gICAgICAgIGNvbnN0IGZpcnN0TW9tZW50ID0gdGhpcy5hY2N1bXVsYXRlZEZpcnN0TW9tZW50W2ldLnZhcmlhYmxlO1xuICAgICAgICBjb25zdCB3ZWlnaHRlZEluZk5vcm0gPSB0aGlzLmFjY3VtdWxhdGVkV2VpZ2h0ZWRJbmZOb3JtW2ldLnZhcmlhYmxlO1xuXG4gICAgICAgIGNvbnN0IG5ld0ZpcnN0TW9tZW50ID1cbiAgICAgICAgICAgIGFkZChtdWwoZmlyc3RNb21lbnQsIHRoaXMuYmV0YTEpLCBtdWwoZ3JhZGllbnQsIDEgLSB0aGlzLmJldGExKSk7XG5cbiAgICAgICAgY29uc3QgdXQwID0gbXVsKHdlaWdodGVkSW5mTm9ybSwgdGhpcy5iZXRhMik7XG4gICAgICAgIGNvbnN0IHV0MSA9IGFicyhncmFkaWVudCk7XG5cbiAgICAgICAgY29uc3QgbmV3V2VpZ2h0ZWRJbmZOb3JtID0gbWF4aW11bSh1dDAsIHV0MSk7XG5cbiAgICAgICAgZmlyc3RNb21lbnQuYXNzaWduKG5ld0ZpcnN0TW9tZW50KTtcbiAgICAgICAgd2VpZ2h0ZWRJbmZOb3JtLmFzc2lnbihuZXdXZWlnaHRlZEluZk5vcm0pO1xuXG4gICAgICAgIGNvbnN0IG5ld1ZhbHVlID1cbiAgICAgICAgICAgIGFkZChtdWwoZGl2KGxyLCBvbmVNaW51c0FjY0JldGExKSxcbiAgICAgICAgICAgICAgICAgICAgZGl2KG5ld0ZpcnN0TW9tZW50LCBhZGQobmV3V2VpZ2h0ZWRJbmZOb3JtLCB0aGlzLmVwc2lsb24pKSksXG4gICAgICAgICAgICAgICAgdmFsdWUpO1xuXG4gICAgICAgIHZhbHVlLmFzc2lnbihuZXdWYWx1ZSk7XG4gICAgICB9KTtcblxuICAgICAgdGhpcy5pdGVyYXRpb24uYXNzaWduKGFkZCh0aGlzLml0ZXJhdGlvbiwgMSkpO1xuICAgICAgdGhpcy5hY2NCZXRhMS5hc3NpZ24obXVsKHRoaXMuYWNjQmV0YTEsIHRoaXMuYmV0YTEpKTtcbiAgICB9KTtcbiAgICB0aGlzLmluY3JlbWVudEl0ZXJhdGlvbnMoKTtcbiAgfVxuXG4gIGRpc3Bvc2UoKTogdm9pZCB7XG4gICAgdGhpcy5hY2NCZXRhMS5kaXNwb3NlKCk7XG4gICAgdGhpcy5pdGVyYXRpb24uZGlzcG9zZSgpO1xuXG4gICAgaWYgKHRoaXMuYWNjdW11bGF0ZWRGaXJzdE1vbWVudCAhPSBudWxsKSB7XG4gICAgICBkaXNwb3NlKHRoaXMuYWNjdW11bGF0ZWRGaXJzdE1vbWVudC5tYXAodiA9PiB2LnZhcmlhYmxlKSk7XG4gICAgfVxuICAgIGlmICh0aGlzLmFjY3VtdWxhdGVkV2VpZ2h0ZWRJbmZOb3JtICE9IG51bGwpIHtcbiAgICAgIGRpc3Bvc2UodGhpcy5hY2N1bXVsYXRlZFdlaWdodGVkSW5mTm9ybS5tYXAodiA9PiB2LnZhcmlhYmxlKSk7XG4gICAgfVxuICB9XG5cbiAgYXN5bmMgZ2V0V2VpZ2h0cygpOiBQcm9taXNlPE5hbWVkVGVuc29yW10+IHtcbiAgICB0aHJvdyBuZXcgRXJyb3IoJ2dldFdlaWdodHMoKSBpcyBub3QgaW1wbGVtZW50ZWQgZm9yIEFkYW1heCB5ZXQuJyk7XG4gIH1cblxuICBhc3luYyBzZXRXZWlnaHRzKHdlaWdodFZhbHVlczogTmFtZWRUZW5zb3JbXSk6IFByb21pc2U8dm9pZD4ge1xuICAgIHRocm93IG5ldyBFcnJvcignc2V0V2VpZ2h0cygpIGlzIG5vdCBpbXBsZW1lbnRlZCBmb3IgQWRhbWF4IHlldC4nKTtcbiAgfVxuXG4gIGdldENvbmZpZygpOiBDb25maWdEaWN0IHtcbiAgICByZXR1cm4ge1xuICAgICAgJ2xlYXJuaW5nUmF0ZSc6IHRoaXMubGVhcm5pbmdSYXRlLFxuICAgICAgJ2JldGExJzogdGhpcy5iZXRhMSxcbiAgICAgICdiZXRhMic6IHRoaXMuYmV0YTIsXG4gICAgICAnZXBzaWxvbic6IHRoaXMuZXBzaWxvbixcbiAgICAgICdkZWNheSc6IHRoaXMuZGVjYXlcbiAgICB9O1xuICB9XG5cbiAgLyoqIEBub2NvbGxhcHNlICovXG4gIHN0YXRpYyBmcm9tQ29uZmlnPFQgZXh0ZW5kcyBTZXJpYWxpemFibGU+KFxuICAgICAgY2xzOiBTZXJpYWxpemFibGVDb25zdHJ1Y3RvcjxUPiwgY29uZmlnOiBDb25maWdEaWN0KTogVCB7XG4gICAgcmV0dXJuIG5ldyBjbHMoXG4gICAgICAgIGNvbmZpZ1snbGVhcm5pbmdSYXRlJ10sIGNvbmZpZ1snYmV0YTEnXSwgY29uZmlnWydiZXRhMiddLFxuICAgICAgICBjb25maWdbJ2Vwc2lsb24nXSwgY29uZmlnWydkZWNheSddKTtcbiAgfVxufVxucmVnaXN0ZXJDbGFzcyhBZGFtYXhPcHRpbWl6ZXIpO1xuIl19","/**\n * @license\n * Copyright 2018 Google LLC. All Rights Reserved.\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n * =============================================================================\n */\nimport { ENGINE } from '../engine';\nimport { keep, tidy } from '../globals';\nimport { add } from '../ops/add';\nimport { mul } from '../ops/mul';\nimport { scalar } from '../ops/scalar';\nimport { registerClass } from '../serialization';\nimport { Optimizer } from './optimizer';\n/** @doclink Optimizer */\nexport class SGDOptimizer extends Optimizer {\n constructor(learningRate) {\n super();\n this.learningRate = learningRate;\n this.setLearningRate(learningRate);\n }\n applyGradients(variableGradients) {\n const varNames = Array.isArray(variableGradients) ?\n variableGradients.map(v => v.name) :\n Object.keys(variableGradients);\n varNames.forEach((name, i) => {\n const gradient = Array.isArray(variableGradients) ?\n variableGradients[i].tensor :\n variableGradients[name];\n if (gradient == null) {\n return;\n }\n const value = ENGINE.registeredVariables[name];\n tidy(() => {\n const newValue = add(mul(this.c, gradient), value);\n value.assign(newValue);\n });\n });\n this.incrementIterations();\n }\n /**\n * Sets the learning rate of the optimizer.\n */\n setLearningRate(learningRate) {\n this.learningRate = learningRate;\n if (this.c != null) {\n this.c.dispose();\n }\n this.c = keep(scalar(-learningRate));\n }\n dispose() {\n this.c.dispose();\n }\n async getWeights() {\n return [await this.saveIterations()];\n }\n async setWeights(weightValues) {\n weightValues = await this.extractIterations(weightValues);\n if (weightValues.length !== 0) {\n throw new Error('SGD optimizer does not have settable weights.');\n }\n }\n getConfig() {\n return { 'learningRate': this.learningRate };\n }\n /** @nocollapse */\n static fromConfig(cls, config) {\n return new cls(config['learningRate']);\n }\n}\n/** @nocollapse */\nSGDOptimizer.className = 'SGD'; // Note: Name matters for Python compatibility.\nregisterClass(SGDOptimizer);\n//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic2dkX29wdGltaXplci5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uLy4uL3RmanMtY29yZS9zcmMvb3B0aW1pemVycy9zZ2Rfb3B0aW1pemVyLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBOzs7Ozs7Ozs7Ozs7Ozs7R0FlRztBQUVILE9BQU8sRUFBQyxNQUFNLEVBQUMsTUFBTSxXQUFXLENBQUM7QUFDakMsT0FBTyxFQUFDLElBQUksRUFBRSxJQUFJLEVBQUMsTUFBTSxZQUFZLENBQUM7QUFDdEMsT0FBTyxFQUFDLEdBQUcsRUFBQyxNQUFNLFlBQVksQ0FBQztBQUMvQixPQUFPLEVBQUMsR0FBRyxFQUFDLE1BQU0sWUFBWSxDQUFDO0FBQy9CLE9BQU8sRUFBQyxNQUFNLEVBQUMsTUFBTSxlQUFlLENBQUM7QUFDckMsT0FBTyxFQUFhLGFBQWEsRUFBd0MsTUFBTSxrQkFBa0IsQ0FBQztBQUlsRyxPQUFPLEVBQUMsU0FBUyxFQUFDLE1BQU0sYUFBYSxDQUFDO0FBRXRDLHlCQUF5QjtBQUN6QixNQUFNLE9BQU8sWUFBYSxTQUFRLFNBQVM7SUFLekMsWUFBc0IsWUFBb0I7UUFDeEMsS0FBSyxFQUFFLENBQUM7UUFEWSxpQkFBWSxHQUFaLFlBQVksQ0FBUTtRQUV4QyxJQUFJLENBQUMsZUFBZSxDQUFDLFlBQVksQ0FBQyxDQUFDO0lBQ3JDLENBQUM7SUFFRCxjQUFjLENBQUMsaUJBQStDO1FBQzVELE1BQU0sUUFBUSxHQUFHLEtBQUssQ0FBQyxPQUFPLENBQUMsaUJBQWlCLENBQUMsQ0FBQyxDQUFDO1lBQy9DLGlCQUFpQixDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDO1lBQ3BDLE1BQU0sQ0FBQyxJQUFJLENBQUMsaUJBQWlCLENBQUMsQ0FBQztRQUNuQyxRQUFRLENBQUMsT0FBTyxDQUFDLENBQUMsSUFBSSxFQUFFLENBQUMsRUFBRSxFQUFFO1lBQzNCLE1BQU0sUUFBUSxHQUFHLEtBQUssQ0FBQyxPQUFPLENBQUMsaUJBQWlCLENBQUMsQ0FBQyxDQUFDO2dCQUMvQyxpQkFBaUIsQ0FBQyxDQUFDLENBQUMsQ0FBQyxNQUFNLENBQUMsQ0FBQztnQkFDN0IsaUJBQWlCLENBQUMsSUFBSSxDQUFDLENBQUM7WUFDNUIsSUFBSSxRQUFRLElBQUksSUFBSSxFQUFFO2dCQUNwQixPQUFPO2FBQ1I7WUFDRCxNQUFNLEtBQUssR0FBRyxNQUFNLENBQUMsbUJBQW1CLENBQUMsSUFBSSxDQUFDLENBQUM7WUFDL0MsSUFBSSxDQUFDLEdBQUcsRUFBRTtnQkFDUixNQUFNLFFBQVEsR0FBRyxHQUFHLENBQUMsR0FBRyxDQUFDLElBQUksQ0FBQyxDQUFDLEVBQUUsUUFBUSxDQUFDLEVBQUUsS0FBSyxDQUFDLENBQUM7Z0JBQ25ELEtBQUssQ0FBQyxNQUFNLENBQUMsUUFBUSxDQUFDLENBQUM7WUFDekIsQ0FBQyxDQUFDLENBQUM7UUFDTCxDQUFDLENBQUMsQ0FBQztRQUNILElBQUksQ0FBQyxtQkFBbUIsRUFBRSxDQUFDO0lBQzdCLENBQUM7SUFFRDs7T0FFRztJQUNILGVBQWUsQ0FBQyxZQUFvQjtRQUNsQyxJQUFJLENBQUMsWUFBWSxHQUFHLFlBQVksQ0FBQztRQUNqQyxJQUFJLElBQUksQ0FBQyxDQUFDLElBQUksSUFBSSxFQUFFO1lBQ2xCLElBQUksQ0FBQyxDQUFDLENBQUMsT0FBTyxFQUFFLENBQUM7U0FDbEI7UUFDRCxJQUFJLENBQUMsQ0FBQyxHQUFHLElBQUksQ0FBQyxNQUFNLENBQUMsQ0FBQyxZQUFZLENBQUMsQ0FBQyxDQUFDO0lBQ3ZDLENBQUM7SUFFRCxPQUFPO1FBQ0wsSUFBSSxDQUFDLENBQUMsQ0FBQyxPQUFPLEVBQUUsQ0FBQztJQUNuQixDQUFDO0lBRUQsS0FBSyxDQUFDLFVBQVU7UUFDZCxPQUFPLENBQUMsTUFBTSxJQUFJLENBQUMsY0FBYyxFQUFFLENBQUMsQ0FBQztJQUN2QyxDQUFDO0lBRUQsS0FBSyxDQUFDLFVBQVUsQ0FBQyxZQUEyQjtRQUMxQyxZQUFZLEdBQUcsTUFBTSxJQUFJLENBQUMsaUJBQWlCLENBQUMsWUFBWSxDQUFDLENBQUM7UUFDMUQsSUFBSSxZQUFZLENBQUMsTUFBTSxLQUFLLENBQUMsRUFBRTtZQUM3QixNQUFNLElBQUksS0FBSyxDQUFDLCtDQUErQyxDQUFDLENBQUM7U0FDbEU7SUFDSCxDQUFDO0lBRUQsU0FBUztRQUNQLE9BQU8sRUFBQyxjQUFjLEVBQUUsSUFBSSxDQUFDLFlBQVksRUFBQyxDQUFDO0lBQzdDLENBQUM7SUFFRCxrQkFBa0I7SUFDbEIsTUFBTSxDQUFDLFVBQVUsQ0FDYixHQUErQixFQUFFLE1BQWtCO1FBQ3JELE9BQU8sSUFBSSxHQUFHLENBQUMsTUFBTSxDQUFDLGNBQWMsQ0FBQyxDQUFDLENBQUM7SUFDekMsQ0FBQzs7QUEvREQsa0JBQWtCO0FBQ1gsc0JBQVMsR0FBRyxLQUFLLENBQUMsQ0FBRSwrQ0FBK0M7QUFnRTVFLGFBQWEsQ0FBQyxZQUFZLENBQUMsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbIi8qKlxuICogQGxpY2Vuc2VcbiAqIENvcHlyaWdodCAyMDE4IEdvb2dsZSBMTEMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuXG4gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgXCJMaWNlbnNlXCIpO1xuICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLlxuICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0XG4gKlxuICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wXG4gKlxuICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZVxuICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gXCJBUyBJU1wiIEJBU0lTLFxuICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuXG4gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kXG4gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS5cbiAqID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4gKi9cblxuaW1wb3J0IHtFTkdJTkV9IGZyb20gJy4uL2VuZ2luZSc7XG5pbXBvcnQge2tlZXAsIHRpZHl9IGZyb20gJy4uL2dsb2JhbHMnO1xuaW1wb3J0IHthZGR9IGZyb20gJy4uL29wcy9hZGQnO1xuaW1wb3J0IHttdWx9IGZyb20gJy4uL29wcy9tdWwnO1xuaW1wb3J0IHtzY2FsYXJ9IGZyb20gJy4uL29wcy9zY2FsYXInO1xuaW1wb3J0IHtDb25maWdEaWN0LCByZWdpc3RlckNsYXNzLCBTZXJpYWxpemFibGUsIFNlcmlhbGl6YWJsZUNvbnN0cnVjdG9yfSBmcm9tICcuLi9zZXJpYWxpemF0aW9uJztcbmltcG9ydCB7U2NhbGFyfSBmcm9tICcuLi90ZW5zb3InO1xuaW1wb3J0IHtOYW1lZFRlbnNvciwgTmFtZWRUZW5zb3JNYXB9IGZyb20gJy4uL3RlbnNvcl90eXBlcyc7XG5cbmltcG9ydCB7T3B0aW1pemVyfSBmcm9tICcuL29wdGltaXplcic7XG5cbi8qKiBAZG9jbGluayBPcHRpbWl6ZXIgKi9cbmV4cG9ydCBjbGFzcyBTR0RPcHRpbWl6ZXIgZXh0ZW5kcyBPcHRpbWl6ZXIge1xuICAvKiogQG5vY29sbGFwc2UgKi9cbiAgc3RhdGljIGNsYXNzTmFtZSA9ICdTR0QnOyAgLy8gTm90ZTogTmFtZSBtYXR0ZXJzIGZvciBQeXRob24gY29tcGF0aWJpbGl0eS5cbiAgcHJvdGVjdGVkIGM6IFNjYWxhcjtcblxuICBjb25zdHJ1Y3Rvcihwcm90ZWN0ZWQgbGVhcm5pbmdSYXRlOiBudW1iZXIpIHtcbiAgICBzdXBlcigpO1xuICAgIHRoaXMuc2V0TGVhcm5pbmdSYXRlKGxlYXJuaW5nUmF0ZSk7XG4gIH1cblxuICBhcHBseUdyYWRpZW50cyh2YXJpYWJsZUdyYWRpZW50czogTmFtZWRUZW5zb3JNYXB8TmFtZWRUZW5zb3JbXSkge1xuICAgIGNvbnN0IHZhck5hbWVzID0gQXJyYXkuaXNBcnJheSh2YXJpYWJsZUdyYWRpZW50cykgP1xuICAgICAgICB2YXJpYWJsZUdyYWRpZW50cy5tYXAodiA9PiB2Lm5hbWUpIDpcbiAgICAgICAgT2JqZWN0LmtleXModmFyaWFibGVHcmFkaWVudHMpO1xuICAgIHZhck5hbWVzLmZvckVhY2goKG5hbWUsIGkpID0+IHtcbiAgICAgIGNvbnN0IGdyYWRpZW50ID0gQXJyYXkuaXNBcnJheSh2YXJpYWJsZUdyYWRpZW50cykgP1xuICAgICAgICAgIHZhcmlhYmxlR3JhZGllbnRzW2ldLnRlbnNvciA6XG4gICAgICAgICAgdmFyaWFibGVHcmFkaWVudHNbbmFtZV07XG4gICAgICBpZiAoZ3JhZGllbnQgPT0gbnVsbCkge1xuICAgICAgICByZXR1cm47XG4gICAgICB9XG4gICAgICBjb25zdCB2YWx1ZSA9IEVOR0lORS5yZWdpc3RlcmVkVmFyaWFibGVzW25hbWVdO1xuICAgICAgdGlkeSgoKSA9PiB7XG4gICAgICAgIGNvbnN0IG5ld1ZhbHVlID0gYWRkKG11bCh0aGlzLmMsIGdyYWRpZW50KSwgdmFsdWUpO1xuICAgICAgICB2YWx1ZS5hc3NpZ24obmV3VmFsdWUpO1xuICAgICAgfSk7XG4gICAgfSk7XG4gICAgdGhpcy5pbmNyZW1lbnRJdGVyYXRpb25zKCk7XG4gIH1cblxuICAvKipcbiAgICogU2V0cyB0aGUgbGVhcm5pbmcgcmF0ZSBvZiB0aGUgb3B0aW1pemVyLlxuICAgKi9cbiAgc2V0TGVhcm5pbmdSYXRlKGxlYXJuaW5nUmF0ZTogbnVtYmVyKSB7XG4gICAgdGhpcy5sZWFybmluZ1JhdGUgPSBsZWFybmluZ1JhdGU7XG4gICAgaWYgKHRoaXMuYyAhPSBudWxsKSB7XG4gICAgICB0aGlzLmMuZGlzcG9zZSgpO1xuICAgIH1cbiAgICB0aGlzLmMgPSBrZWVwKHNjYWxhcigtbGVhcm5pbmdSYXRlKSk7XG4gIH1cblxuICBkaXNwb3NlKCkge1xuICAgIHRoaXMuYy5kaXNwb3NlKCk7XG4gIH1cblxuICBhc3luYyBnZXRXZWlnaHRzKCk6IFByb21pc2U8TmFtZWRUZW5zb3JbXT4ge1xuICAgIHJldHVybiBbYXdhaXQgdGhpcy5zYXZlSXRlcmF0aW9ucygpXTtcbiAgfVxuXG4gIGFzeW5jIHNldFdlaWdodHMod2VpZ2h0VmFsdWVzOiBOYW1lZFRlbnNvcltdKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgd2VpZ2h0VmFsdWVzID0gYXdhaXQgdGhpcy5leHRyYWN0SXRlcmF0aW9ucyh3ZWlnaHRWYWx1ZXMpO1xuICAgIGlmICh3ZWlnaHRWYWx1ZXMubGVuZ3RoICE9PSAwKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoJ1NHRCBvcHRpbWl6ZXIgZG9lcyBub3QgaGF2ZSBzZXR0YWJsZSB3ZWlnaHRzLicpO1xuICAgIH1cbiAgfVxuXG4gIGdldENvbmZpZygpOiBDb25maWdEaWN0IHtcbiAgICByZXR1cm4geydsZWFybmluZ1JhdGUnOiB0aGlzLmxlYXJuaW5nUmF0ZX07XG4gIH1cblxuICAvKiogQG5vY29sbGFwc2UgKi9cbiAgc3RhdGljIGZyb21Db25maWc8VCBleHRlbmRzIFNlcmlhbGl6YWJsZT4oXG4gICAgICBjbHM6IFNlcmlhbGl6YWJsZUNvbnN0cnVjdG9yPFQ+LCBjb25maWc6IENvbmZpZ0RpY3QpOiBUIHtcbiAgICByZXR1cm4gbmV3IGNscyhjb25maWdbJ2xlYXJuaW5nUmF0ZSddKTtcbiAgfVxufVxucmVnaXN0ZXJDbGFzcyhTR0RPcHRpbWl6ZXIpO1xuIl19","/**\n * @license\n * Copyright 2018 Google LLC. All Rights Reserved.\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n * =============================================================================\n */\nimport { ENGINE } from '../engine';\nimport { dispose, tidy } from '../globals';\nimport { add } from '../ops/add';\nimport { mul } from '../ops/mul';\nimport { scalar } from '../ops/scalar';\nimport { zerosLike } from '../ops/zeros_like';\nimport { registerClass } from '../serialization';\nimport { SGDOptimizer } from './sgd_optimizer';\n/** @doclink Optimizer */\nexport class MomentumOptimizer extends SGDOptimizer {\n constructor(learningRate, momentum, useNesterov = false) {\n super(learningRate);\n this.learningRate = learningRate;\n this.momentum = momentum;\n this.useNesterov = useNesterov;\n this.accumulations = [];\n this.m = scalar(this.momentum);\n }\n applyGradients(variableGradients) {\n const variableNames = Array.isArray(variableGradients) ?\n variableGradients.map(item => item.name) :\n Object.keys(variableGradients);\n variableNames.forEach((name, i) => {\n const value = ENGINE.registeredVariables[name];\n if (this.accumulations[i] == null) {\n const trainable = false;\n this.accumulations[i] = {\n originalName: `${name}/momentum`,\n variable: tidy(() => zerosLike(value).variable(trainable))\n };\n }\n const accumulation = this.accumulations[i].variable;\n const gradient = Array.isArray(variableGradients) ?\n variableGradients[i].tensor :\n variableGradients[name];\n if (gradient == null) {\n return;\n }\n tidy(() => {\n let newValue;\n const newAccumulation = add(mul(this.m, accumulation), gradient);\n if (this.useNesterov) {\n newValue = add(mul(this.c, add(gradient, mul(newAccumulation, this.m))), value);\n }\n else {\n newValue = add(mul(this.c, newAccumulation), value);\n }\n accumulation.assign(newAccumulation);\n value.assign(newValue);\n });\n });\n this.incrementIterations();\n }\n dispose() {\n this.m.dispose();\n if (this.accumulations != null) {\n dispose(this.accumulations.map(v => v.variable));\n }\n }\n /**\n * Sets the momentum of the optimizer.\n *\n * @param momentum\n */\n setMomentum(momentum) {\n this.momentum = momentum;\n }\n async getWeights() {\n // Order matters for Python compatibility.\n return [await this.saveIterations()].concat(this.accumulations.map(v => ({ name: v.originalName, tensor: v.variable })));\n }\n async setWeights(weightValues) {\n weightValues = await this.extractIterations(weightValues);\n const trainable = false;\n this.accumulations = weightValues.map(v => ({ originalName: v.name, variable: v.tensor.variable(trainable) }));\n }\n getConfig() {\n return {\n 'learningRate': this.learningRate,\n 'momentum': this.momentum,\n 'useNesterov': this.useNesterov\n };\n }\n /** @nocollapse */\n static fromConfig(cls, config) {\n return new cls(config['learningRate'], config['momentum'], config['useNesterov']);\n }\n}\n/** @nocollapse */\nMomentumOptimizer.className = 'Momentum'; // Name matters for Python compatibility.\nregisterClass(MomentumOptimizer);\n//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibW9tZW50dW1fb3B0aW1pemVyLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vLi4vdGZqcy1jb3JlL3NyYy9vcHRpbWl6ZXJzL21vbWVudHVtX29wdGltaXplci50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQTs7Ozs7Ozs7Ozs7Ozs7O0dBZUc7QUFFSCxPQUFPLEVBQUMsTUFBTSxFQUFDLE1BQU0sV0FBVyxDQUFDO0FBQ2pDLE9BQU8sRUFBQyxPQUFPLEVBQUUsSUFBSSxFQUFDLE1BQU0sWUFBWSxDQUFDO0FBQ3pDLE9BQU8sRUFBQyxHQUFHLEVBQUMsTUFBTSxZQUFZLENBQUM7QUFDL0IsT0FBTyxFQUFDLEdBQUcsRUFBQyxNQUFNLFlBQVksQ0FBQztBQUMvQixPQUFPLEVBQUMsTUFBTSxFQUFDLE1BQU0sZUFBZSxDQUFDO0FBQ3JDLE9BQU8sRUFBQyxTQUFTLEVBQUMsTUFBTSxtQkFBbUIsQ0FBQztBQUM1QyxPQUFPLEVBQWEsYUFBYSxFQUF3QyxNQUFNLGtCQUFrQixDQUFDO0FBS2xHLE9BQU8sRUFBQyxZQUFZLEVBQUMsTUFBTSxpQkFBaUIsQ0FBQztBQUU3Qyx5QkFBeUI7QUFDekIsTUFBTSxPQUFPLGlCQUFrQixTQUFRLFlBQVk7SUFNakQsWUFDYyxZQUFvQixFQUFVLFFBQWdCLEVBQ2hELGNBQWMsS0FBSztRQUM3QixLQUFLLENBQUMsWUFBWSxDQUFDLENBQUM7UUFGUixpQkFBWSxHQUFaLFlBQVksQ0FBUTtRQUFVLGFBQVEsR0FBUixRQUFRLENBQVE7UUFDaEQsZ0JBQVcsR0FBWCxXQUFXLENBQVE7UUFKdkIsa0JBQWEsR0FBd0IsRUFBRSxDQUFDO1FBTTlDLElBQUksQ0FBQyxDQUFDLEdBQUcsTUFBTSxDQUFDLElBQUksQ0FBQyxRQUFRLENBQUMsQ0FBQztJQUNqQyxDQUFDO0lBRUQsY0FBYyxDQUFDLGlCQUFpRDtRQUM5RCxNQUFNLGFBQWEsR0FBRyxLQUFLLENBQUMsT0FBTyxDQUFDLGlCQUFpQixD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QUMsRUFBQyxJQUFJLEVBQUUsQ0FBQyxDQUFDLFlBQVksRUFBRSxNQUFNLEVBQUUsQ0FBQyxDQUFDLFFBQVEsRUFBQyxDQUFDLENBQUMsQ0FBQyxDQUFDO0lBQzFELENBQUM7SUFFRCxLQUFLLENBQUMsVUFBVSxDQUFDLFlBQTJCO1FBQzFDLFlBQVksR0FBRyxNQUFNLElBQUksQ0FBQyxpQkFBaUIsQ0FBQyxZQUFZLENBQUMsQ0FBQztRQUMxRCxNQUFNLFNBQVMsR0FBRyxLQUFLLENBQUM7UUFDeEIsSUFBSSxDQUFDLGFBQWEsR0FBRyxZQUFZLENBQUMsR0FBRyxDQUNqQyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsRUFBQyxZQUFZLEVBQUUsQ0FBQyxDQUFDLElBQUksRUFBRSxRQUFRLEVBQUUsQ0FBQyxDQUFDLE1BQU0sQ0FBQyxRQUFRLENBQUMsU0FBUyxDQUFDLEVBQUMsQ0FBQyxDQUFDLENBQUM7SUFDN0UsQ0FBQztJQUVELFNBQVM7UUFDUCxPQUFPO1lBQ0wsY0FBYyxFQUFFLElBQUksQ0FBQyxZQUFZO1lBQ2pDLFVBQVUsRUFBRSxJQUFJLENBQUMsUUFBUTtZQUN6QixhQUFhLEVBQUUsSUFBSSxDQUFDLFdBQVc7U0FDaEMsQ0FBQztJQUNKLENBQUM7SUFFRCxrQkFBa0I7SUFDbEIsTUFBTSxDQUFDLFVBQVUsQ0FDYixHQUErQixFQUFFLE1BQWtCO1FBQ3JELE9BQU8sSUFBSSxHQUFHLENBQ1YsTUFBTSxDQUFDLGNBQWMsQ0FBQyxFQUFFLE1BQU0sQ0FBQyxVQUFVLENBQUMsRUFBRSxNQUFNLENBQUMsYUFBYSxDQUFDLENBQUMsQ0FBQztJQUN6RSxDQUFDOztBQTdGRCxrQkFBa0I7QUFDWCwyQkFBUyxHQUFHLFVBQVUsQ0FBQyxDQUFFLHlDQUF5QztBQThGM0UsYUFBYSxDQUFDLGlCQUFpQixDQUFDLENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyIvKipcbiAqIEBsaWNlbnNlXG4gKiBDb3B5cmlnaHQgMjAxOCBHb29nbGUgTExDLiBBbGwgUmlnaHRzIFJlc2VydmVkLlxuICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlIFwiTGljZW5zZVwiKTtcbiAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS5cbiAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdFxuICpcbiAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMFxuICpcbiAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmVcbiAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuIFwiQVMgSVNcIiBCQVNJUyxcbiAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLlxuICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZFxuICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuXG4gKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuICovXG5cbmltcG9ydCB7RU5HSU5FfSBmcm9tICcuLi9lbmdpbmUnO1xuaW1wb3J0IHtkaXNwb3NlLCB0aWR5fSBmcm9tICcuLi9nbG9iYWxzJztcbmltcG9ydCB7YWRkfSBmcm9tICcuLi9vcHMvYWRkJztcbmltcG9ydCB7bXVsfSBmcm9tICcuLi9vcHMvbXVsJztcbmltcG9ydCB7c2NhbGFyfSBmcm9tICcuLi9vcHMvc2NhbGFyJztcbmltcG9ydCB7emVyb3NMaWtlfSBmcm9tICcuLi9vcHMvemVyb3NfbGlrZSc7XG5pbXBvcnQge0NvbmZpZ0RpY3QsIHJlZ2lzdGVyQ2xhc3MsIFNlcmlhbGl6YWJsZSwgU2VyaWFsaXphYmxlQ29uc3RydWN0b3J9IGZyb20gJy4uL3NlcmlhbGl6YXRpb24nO1xuaW1wb3J0IHtTY2FsYXIsIFRlbnNvcn0gZnJvbSAnLi4vdGVuc29yJztcbmltcG9ydCB7TmFtZWRUZW5zb3IsIE5hbWVkVmFyaWFibGVNYXB9IGZyb20gJy4uL3RlbnNvcl90eXBlcyc7XG5cbmltcG9ydCB7T3B0aW1pemVyVmFyaWFibGV9IGZyb20gJy4vb3B0aW1pemVyJztcbmltcG9ydCB7U0dET3B0aW1pemVyfSBmcm9tICcuL3NnZF9vcHRpbWl6ZXInO1xuXG4vKiogQGRvY2xpbmsgT3B0aW1pemVyICovXG5leHBvcnQgY2xhc3MgTW9tZW50dW1PcHRpbWl6ZXIgZXh0ZW5kcyBTR0RPcHRpbWl6ZXIge1xuICAvKiogQG5vY29sbGFwc2UgKi9cbiAgc3RhdGljIGNsYXNzTmFtZSA9ICdNb21lbnR1bSc7ICAvLyBOYW1lIG1hdHRlcnMgZm9yIFB5dGhvbiBjb21wYXRpYmlsaXR5LlxuICBwcml2YXRlIG06IFNjYWxhcjtcbiAgcHJpdmF0ZSBhY2N1bXVsYXRpb25zOiBPcHRpbWl6ZXJWYXJpYWJsZVtdID0gW107XG5cbiAgY29uc3RydWN0b3IoXG4gICAgICBwcm90ZWN0ZWQgbGVhcm5pbmdSYXRlOiBudW1iZXIsIHByaXZhdGUgbW9tZW50dW06IG51bWJlcixcbiAgICAgIHByaXZhdGUgdXNlTmVzdGVyb3YgPSBmYWxzZSkge1xuICAgIHN1cGVyKGxlYXJuaW5nUmF0ZSk7XG4gICAgdGhpcy5tID0gc2NhbGFyKHRoaXMubW9tZW50dW0pO1xuICB9XG5cbiAgYXBwbHlHcmFkaWVudHModmFyaWFibGVHcmFkaWVudHM6IE5hbWVkVmFyaWFibGVNYXB8TmFtZWRUZW5zb3JbXSkge1xuICAgIGNvbnN0IHZhcmlhYmxlTmFtZXMgPSBBcnJheS5pc0FycmF5KHZhcmlhYmxlR3JhZGllbnRzKSA/XG4gICAgICAgIHZhcmlhYmxlR3JhZGllbnRzLm1hcChpdGVtID0+IGl0ZW0ubmFtZSkgOlxuICAgICAgICBPYmplY3Qua2V5cyh2YXJpYWJsZUdyYWRpZW50cyk7XG5cbiAgICB2YXJpYWJsZU5hbWVzLmZvckVhY2goKG5hbWUsIGkpID0+IHtcbiAgICAgIGNvbnN0IHZhbHVlID0gRU5HSU5FLnJlZ2lzdGVyZWRWYXJpYWJsZXNbbmFtZV07XG4gICAgICBpZiAodGhpcy5hY2N1bXVsYXRpb25zW2ldID09IG51bGwpIHtcbiAgICAgICAgY29uc3QgdHJhaW5hYmxlID0gZmFsc2U7XG4gICAgICAgIHRoaXMuYWNjdW11bGF0aW9uc1tpXSA9IHtcbiAgICAgICAgICBvcmlnaW5hbE5hbWU6IGAke25hbWV9L21vbWVudHVtYCxcbiAgICAgICAgICB2YXJpYWJsZTogdGlkeSgoKSA9PiB6ZXJvc0xpa2UodmFsdWUpLnZhcmlhYmxlKHRyYWluYWJsZSkpXG4gICAgICAgIH07XG4gICAgICB9XG5cbiAgICAgIGNvbnN0IGFjY3VtdWxhdGlvbiA9IHRoaXMuYWNjdW11bGF0aW9uc1tpXS52YXJpYWJsZTtcbiAgICAgIGNvbnN0IGdyYWRpZW50ID0gQXJyYXkuaXNBcnJheSh2YXJpYWJsZUdyYWRpZW50cykgP1xuICAgICAgICAgIHZhcmlhYmxlR3JhZGllbnRzW2ldLnRlbnNvciA6XG4gICAgICAgICAgdmFyaWFibGVHcmFkaWVudHNbbmFtZV07XG4gICAgICBpZiAoZ3JhZGllbnQgPT0gbnVsbCkge1xuICAgICAgICByZXR1cm47XG4gICAgICB9XG5cbiAgICAgIHRpZHkoKCkgPT4ge1xuICAgICAgICBsZXQgbmV3VmFsdWU6IFRlbnNvcjtcbiAgICAgICAgY29uc3QgbmV3QWNjdW11bGF0aW9uID0gYWRkKG11bCh0aGlzLm0sIGFjY3VtdWxhdGlvbiksIGdyYWRpZW50KTtcbiAgICAgICAgaWYgKHRoaXMudXNlTmVzdGVyb3YpIHtcbiAgICAgICAgICBuZXdWYWx1ZSA9IGFkZChcbiAgICAgICAgICAgICAgbXVsKHRoaXMuYywgYWRkKGdyYWRpZW50LCBtdWwobmV3QWNjdW11bGF0aW9uLCB0aGlzLm0pKSksIHZhbHVlKTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICBuZXdWYWx1ZSA9IGFkZChtdWwodGhpcy5jLCBuZXdBY2N1bXVsYXRpb24pLCB2YWx1ZSk7XG4gICAgICAgIH1cbiAgICAgICAgYWNjdW11bGF0aW9uLmFzc2lnbihuZXdBY2N1bXVsYXRpb24pO1xuICAgICAgICB2YWx1ZS5hc3NpZ24obmV3VmFsdWUpO1xuICAgICAgfSk7XG4gICAgfSk7XG4gICAgdGhpcy5pbmNyZW1lbnRJdGVyYXRpb25zKCk7XG4gIH1cblxuICBkaXNwb3NlKCk6IHZvaWQge1xuICAgIHRoaXMubS5kaXNwb3NlKCk7XG4gICAgaWYgKHRoaXMuYWNjdW11bGF0aW9ucyAhPSBudWxsKSB7XG4gICAgICBkaXNwb3NlKHRoaXMuYWNjdW11bGF0aW9ucy5tYXAodiA9PiB2LnZhcmlhYmxlKSk7XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIFNldHMgdGhlIG1vbWVudHVtIG9mIHRoZSBvcHRpbWl6ZXIuXG4gICAqXG4gICAqIEBwYXJhbSBtb21lbnR1bVxuICAgKi9cbiAgc2V0TW9tZW50dW0obW9tZW50dW06IG51bWJlcikge1xuICAgIHRoaXMubW9tZW50dW0gPSBtb21lbnR1bTtcbiAgfVxuXG4gIGFzeW5jIGdldFdlaWdodHMoKTogUHJvbWlzZTxOYW1lZFRlbnNvcltdPiB7XG4gICAgLy8gT3JkZXIgbWF0dGVycyBmb3IgUHl0aG9uIGNvbXBhdGliaWxpdHkuXG4gICAgcmV0dXJuIFthd2FpdCB0aGlzLnNhdmVJdGVyYXRpb25zKCldLmNvbmNhdCh0aGlzLmFjY3VtdWxhdGlvbnMubWFwKFxuICAgICAgICB2ID0+ICh7bmFtZTogdi5vcmlnaW5hbE5hbWUsIHRlbnNvcjogdi52YXJpYWJsZX0pKSk7XG4gIH1cblxuICBhc3luYyBzZXRXZWlnaHRzKHdlaWdodFZhbHVlczogTmFtZWRUZW5zb3JbXSk6IFByb21pc2U8dm9pZD4ge1xuICAgIHdlaWdodFZhbHVlcyA9IGF3YWl0IHRoaXMuZXh0cmFjdEl0ZXJhdGlvbnMod2VpZ2h0VmFsdWVzKTtcbiAgICBjb25zdCB0cmFpbmFibGUgPSBmYWxzZTtcbiAgICB0aGlzLmFjY3VtdWxhdGlvbnMgPSB3ZWlnaHRWYWx1ZXMubWFwKFxuICAgICAgICB2ID0+ICh7b3JpZ2luYWxOYW1lOiB2Lm5hbWUsIHZhcmlhYmxlOiB2LnRlbnNvci52YXJpYWJsZSh0cmFpbmFibGUpfSkpO1xuICB9XG5cbiAgZ2V0Q29uZmlnKCk6IENvbmZpZ0RpY3Qge1xuICAgIHJldHVybiB7XG4gICAgICAnbGVhcm5pbmdSYXRlJzogdGhpcy5sZWFybmluZ1JhdGUsXG4gICAgICAnbW9tZW50dW0nOiB0aGlzLm1vbWVudHVtLFxuICAgICAgJ3VzZU5lc3Rlcm92JzogdGhpcy51c2VOZXN0ZXJvdlxuICAgIH07XG4gIH1cblxuICAvKiogQG5vY29sbGFwc2UgKi9cbiAgc3RhdGljIGZyb21Db25maWc8VCBleHRlbmRzIFNlcmlhbGl6YWJsZT4oXG4gICAgICBjbHM6IFNlcmlhbGl6YWJsZUNvbnN0cnVjdG9yPFQ+LCBjb25maWc6IENvbmZpZ0RpY3QpOiBUIHtcbiAgICByZXR1cm4gbmV3IGNscyhcbiAgICAgICAgY29uZmlnWydsZWFybmluZ1JhdGUnXSwgY29uZmlnWydtb21lbnR1bSddLCBjb25maWdbJ3VzZU5lc3Rlcm92J10pO1xuICB9XG59XG5yZWdpc3RlckNsYXNzKE1vbWVudHVtT3B0aW1pemVyKTtcbiJdfQ==","/**\n * @license\n * Copyright 2018 Google LLC. All Rights Reserved.\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n * =============================================================================\n */\nimport { ENGINE } from '../engine';\nimport { dispose, tidy } from '../globals';\nimport { add } from '../ops/add';\nimport { div } from '../ops/div';\nimport { mul } from '../ops/mul';\nimport { sqrt } from '../ops/sqrt';\nimport { square } from '../ops/square';\nimport { sub } from '../ops/sub';\nimport { zerosLike } from '../ops/zeros_like';\nimport { registerClass } from '../serialization';\nimport { Optimizer } from './optimizer';\n/** @doclink Optimizer */\nexport class RMSPropOptimizer extends Optimizer {\n constructor(learningRate, decay = 0.9, momentum = 0.0, epsilon = null, centered = false) {\n super();\n this.learningRate = learningRate;\n this.decay = decay;\n this.momentum = momentum;\n this.epsilon = epsilon;\n this.accumulatedMeanSquares = [];\n this.accumulatedMoments = [];\n this.accumulatedMeanGrads = [];\n this.centered = centered;\n if (epsilon == null) {\n this.epsilon = ENGINE.backend.epsilon();\n }\n if (learningRate == null) {\n throw new Error(`learningRate for RMSPropOptimizer must be defined.`);\n }\n }\n applyGradients(variableGradients) {\n const variableNames = Array.isArray(variableGradients) ?\n variableGradients.map(item => item.name) :\n Object.keys(variableGradients);\n variableNames.forEach((name, i) => {\n const value = ENGINE.registeredVariables[name];\n const trainable = false;\n if (this.accumulatedMeanSquares[i] == null) {\n this.accumulatedMeanSquares[i] = {\n originalName: `${name}/rms`,\n variable: tidy(() => zerosLike(value).variable(trainable))\n };\n }\n if (this.accumulatedMoments[i] == null) {\n this.accumulatedMoments[i] = {\n originalName: `${name}/momentum`,\n variable: tidy(() => zerosLike(value).variable(trainable))\n };\n }\n if (this.accumulatedMeanGrads[i] == null && this.centered) {\n this.accumulatedMeanGrads[i] = {\n originalName: `${name}/mg`,\n variable: tidy(() => zerosLike(value).variable(trainable))\n };\n }\n const gradient = Array.isArray(variableGradients) ?\n variableGradients[i].tensor :\n variableGradients[name];\n if (gradient == null) {\n return;\n }\n const accumulatedMeanSquare = this.accumulatedMeanSquares[i].variable;\n const accumulatedMoments = this.accumulatedMoments[i].variable;\n tidy(() => {\n const newAccumulatedMeanSquare = add(mul(accumulatedMeanSquare, this.decay), mul(square(gradient), 1 - this.decay));\n if (this.centered) {\n const accumulatedMeanGrad = this.accumulatedMeanGrads[i].variable;\n // Centered gradient\n const newAccumulatedMeanGrad = add(mul(accumulatedMeanGrad, this.decay), mul(gradient, 1 - this.decay));\n const gradContribution = div(mul(gradient, this.learningRate), sqrt(sub(newAccumulatedMeanSquare, add(square(newAccumulatedMeanGrad), this.epsilon))));\n const newAccumulatedMoments = add(mul(accumulatedMoments, this.momentum), gradContribution);\n accumulatedMeanSquare.assign(newAccumulatedMeanSquare);\n accumulatedMeanGrad.assign(newAccumulatedMeanGrad);\n accumulatedMoments.assign(newAccumulatedMoments);\n const newValue = sub(value, newAccumulatedMoments);\n value.assign(newValue);\n }\n else {\n // Plain gradient\n const newAccumulatedMeanSquare = add(mul(accumulatedMeanSquare, this.decay), mul(square(gradient), 1 - this.decay));\n const newAccumulatedMoments = add(mul(accumulatedMoments, this.momentum), div(mul(gradient, this.learningRate), sqrt(add(newAccumulatedMeanSquare, this.epsilon))));\n accumulatedMeanSquare.assign(newAccumulatedMeanSquare);\n accumulatedMoments.assign(newAccumulatedMoments);\n const newValue = sub(value, newAccumulatedMoments);\n value.assign(newValue);\n }\n });\n });\n this.incrementIterations();\n }\n dispose() {\n if (this.accumulatedMeanSquares != null) {\n dispose(this.accumulatedMeanSquares.map(v => v.variable));\n }\n if (this.accumulatedMeanGrads != null && this.centered) {\n dispose(this.accumulatedMeanGrads.map(v => v.variable));\n }\n if (this.accumulatedMoments != null) {\n dispose(this.accumulatedMoments.map(v => v.variable));\n }\n }\n async getWeights() {\n // Order matters for Python compatibility.\n const variables = [...this.accumulatedMeanSquares, ...this.accumulatedMoments];\n if (this.centered) {\n variables.push(...this.accumulatedMeanGrads);\n }\n return [await this.saveIterations()].concat(variables.map(v => ({ name: v.originalName, tensor: v.variable })));\n }\n async setWeights(weightValues) {\n weightValues = await this.extractIterations(weightValues);\n const variableCount = this.centered ? weightValues.length / 3 : weightValues.length / 2;\n const trainable = false;\n this.accumulatedMeanSquares =\n weightValues.slice(0, variableCount).map(v => ({\n originalName: v.name,\n variable: v.tensor.variable(trainable)\n }));\n this.accumulatedMoments =\n weightValues.slice(variableCount, variableCount * 2)\n .map(v => ({\n originalName: v.name,\n variable: v.tensor.variable(trainable)\n }));\n if (this.centered) {\n this.accumulatedMeanGrads =\n weightValues.slice(variableCount * 2, variableCount * 3)\n .map(v => ({\n originalName: v.name,\n variable: v.tensor.variable(trainable)\n }));\n }\n }\n getConfig() {\n return {\n 'learningRate': this.learningRate,\n 'decay': this.decay,\n 'momentum': this.momentum,\n 'epsilon': this.epsilon,\n 'centered': this.centered\n };\n }\n /** @nocollapse */\n static fromConfig(cls, config) {\n return new cls(config['learningRate'], config['decay'], config['momentum'], config['epsilon'], config['centered']);\n }\n}\n/** @nocollapse */\nRMSPropOptimizer.className = 'RMSProp'; // Note: Name matters for Python compatibility.\nregisterClass(RMSPropOptimizer);\n//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicm1zcHJvcF9vcHRpbWl6ZXIuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi8uLi90ZmpzLWNvcmUvc3JjL29wdGltaXplcnMvcm1zcHJvcF9vcHRpbWl6ZXIudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUE7Ozs7Ozs7Ozs7Ozs7OztHQWVHO0FBRUgsT0FBTyxFQUFDLE1BQU0sRUFBQyxNQUFNLFdBQVcsQ0FBQztBQUNqQyxPQUFPLEVBQUMsT0FBTyxFQUFFLElBQUksRUFBQyxNQUFNLFlBQVksQ0FBQztBQUN6QyxPQUFPLEVBQUMsR0FBRyxFQUFDLE1BQU0sWUFBWSxDQUFDO0FBQy9CLE9BQU8sRUFBQyxHQUFHLEVBQUMsTUFBTSxZQUFZLENBQUM7QUFDL0IsT0FBTyxFQUFDLEdBQUcsRUFBQyxNQUFNLFlBQVksQ0FBQztBQUMvQixPQUFPLEVBQUMsSUFBSSxFQUFDLE1BQU0sYUFBYSxDQUFDO0FBQ2pDLE9BQU8sRUFBQyxNQUFNLEVBQUMsTUFBTSxlQUFlLENBQUM7QUFDckMsT0FBTyxFQUFDLEdBQUcsRUFBQyxNQUFNLFlBQVksQ0FBQztBQUMvQixPQUFPLEVBQUMsU0FBUyxFQUFDLE1BQU0sbUJBQW1CLENBQUM7QUFDNUMsT0FBTyxFQUFhLGFBQWEsRUFBd0MsTUFBTSxrQkFBa0IsQ0FBQztBQUdsRyxPQUFPLEVBQUMsU0FBUyxFQUFvQixNQUFNLGFBQWEsQ0FBQztBQUV6RCx5QkFBeUI7QUFDekIsTUFBTSxPQUFPLGdCQUFpQixTQUFRLFNBQVM7SUFTN0MsWUFDYyxZQUFvQixFQUFZLFFBQVEsR0FBRyxFQUMzQyxXQUFXLEdBQUcsRUFBWSxVQUFrQixJQUFJLEVBQzFELFFBQVEsR0FBRyxLQUFLO1FBQ2xCLEtBQUssRUFBRSxDQUFDO1FBSEksaUJBQVksR0FBWixZQUFZLENBQVE7UUFBWSxVQUFLLEdBQUwsS0FBSyxDQUFNO1FBQzNDLGFBQVEsR0FBUixRQUFRLENBQU07UUFBWSxZQUFPLEdBQVAsT0FBTyxD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QyxPQUFPO1lBQ3ZCLFVBQVUsRUFBRSxJQUFJLENBQUMsUUFBUTtTQUMxQixDQUFDO0lBQ0osQ0FBQztJQUVELGtCQUFrQjtJQUNsQixNQUFNLENBQUMsVUFBVSxDQUNiLEdBQStCLEVBQUUsTUFBa0I7UUFDckQsT0FBTyxJQUFJLEdBQUcsQ0FDVixNQUFNLENBQUMsY0FBYyxDQUFDLEVBQUUsTUFBTSxDQUFDLE9BQU8sQ0FBQyxFQUFFLE1BQU0sQ0FBQyxVQUFVLENBQUMsRUFDM0QsTUFBTSxDQUFDLFNBQVMsQ0FBQyxFQUFFLE1BQU0sQ0FBQyxVQUFVLENBQUMsQ0FBQyxDQUFDO0lBQzdDLENBQUM7O0FBOUtELGtCQUFrQjtBQUNYLDBCQUFTLEdBQUcsU0FBUyxDQUFDLENBQUUsK0NBQStDO0FBK0toRixhQUFhLENBQUMsZ0JBQWdCLENBQUMsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbIi8qKlxuICogQGxpY2Vuc2VcbiAqIENvcHlyaWdodCAyMDE4IEdvb2dsZSBMTEMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuXG4gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgXCJMaWNlbnNlXCIpO1xuICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLlxuICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0XG4gKlxuICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wXG4gKlxuICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZVxuICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gXCJBUyBJU1wiIEJBU0lTLFxuICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuXG4gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kXG4gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS5cbiAqID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4gKi9cblxuaW1wb3J0IHtFTkdJTkV9IGZyb20gJy4uL2VuZ2luZSc7XG5pbXBvcnQge2Rpc3Bvc2UsIHRpZHl9IGZyb20gJy4uL2dsb2JhbHMnO1xuaW1wb3J0IHthZGR9IGZyb20gJy4uL29wcy9hZGQnO1xuaW1wb3J0IHtkaXZ9IGZyb20gJy4uL29wcy9kaXYnO1xuaW1wb3J0IHttdWx9IGZyb20gJy4uL29wcy9tdWwnO1xuaW1wb3J0IHtzcXJ0fSBmcm9tICcuLi9vcHMvc3FydCc7XG5pbXBvcnQge3NxdWFyZX0gZnJvbSAnLi4vb3BzL3NxdWFyZSc7XG5pbXBvcnQge3N1Yn0gZnJvbSAnLi4vb3BzL3N1Yic7XG5pbXBvcnQge3plcm9zTGlrZX0gZnJvbSAnLi4vb3BzL3plcm9zX2xpa2UnO1xuaW1wb3J0IHtDb25maWdEaWN0LCByZWdpc3RlckNsYXNzLCBTZXJpYWxpemFibGUsIFNlcmlhbGl6YWJsZUNvbnN0cnVjdG9yfSBmcm9tICcuLi9zZXJpYWxpemF0aW9uJztcbmltcG9ydCB7TmFtZWRUZW5zb3IsIE5hbWVkVGVuc29yTWFwfSBmcm9tICcuLi90ZW5zb3JfdHlwZXMnO1xuXG5pbXBvcnQge09wdGltaXplciwgT3B0aW1pemVyVmFyaWFibGV9IGZyb20gJy4vb3B0aW1pemVyJztcblxuLyoqIEBkb2NsaW5rIE9wdGltaXplciAqL1xuZXhwb3J0IGNsYXNzIFJNU1Byb3BPcHRpbWl6ZXIgZXh0ZW5kcyBPcHRpbWl6ZXIge1xuICAvKiogQG5vY29sbGFwc2UgKi9cbiAgc3RhdGljIGNsYXNzTmFtZSA9ICdSTVNQcm9wJzsgIC8vIE5vdGU6IE5hbWUgbWF0dGVycyBmb3IgUHl0aG9uIGNvbXBhdGliaWxpdHkuXG4gIHByaXZhdGUgY2VudGVyZWQ6IGJvb2xlYW47XG5cbiAgcHJpdmF0ZSBhY2N1bXVsYXRlZE1lYW5TcXVhcmVzOiBPcHRpbWl6ZXJWYXJpYWJsZVtdID0gW107XG4gIHByaXZhdGUgYWNjdW11bGF0ZWRNb21lbnRzOiBPcHRpbWl6ZXJWYXJpYWJsZVtdID0gW107XG4gIHByaXZhdGUgYWNjdW11bGF0ZWRNZWFuR3JhZHM6IE9wdGltaXplclZhcmlhYmxlW10gPSBbXTtcblxuICBjb25zdHJ1Y3RvcihcbiAgICAgIHByb3RlY3RlZCBsZWFybmluZ1JhdGU6IG51bWJlciwgcHJvdGVjdGVkIGRlY2F5ID0gMC45LFxuICAgICAgcHJvdGVjdGVkIG1vbWVudHVtID0gMC4wLCBwcm90ZWN0ZWQgZXBzaWxvbjogbnVtYmVyID0gbnVsbCxcbiAgICAgIGNlbnRlcmVkID0gZmFsc2UpIHtcbiAgICBzdXBlcigpO1xuXG4gICAgdGhpcy5jZW50ZXJlZCA9IGNlbnRlcmVkO1xuXG4gICAgaWYgKGVwc2lsb24gPT0gbnVsbCkge1xuICAgICAgdGhpcy5lcHNpbG9uID0gRU5HSU5FLmJhY2tlbmQuZXBzaWxvbigpO1xuICAgIH1cbiAgICBpZiAobGVhcm5pbmdSYXRlID09IG51bGwpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcihgbGVhcm5pbmdSYXRlIGZvciBSTVNQcm9wT3B0aW1pemVyIG11c3QgYmUgZGVmaW5lZC5gKTtcbiAgICB9XG4gIH1cblxuICBhcHBseUdyYWRpZW50cyh2YXJpYWJsZUdyYWRpZW50czogTmFtZWRUZW5zb3JNYXB8TmFtZWRUZW5zb3JbXSkge1xuICAgIGNvbnN0IHZhcmlhYmxlTmFtZXMgPSBBcnJheS5pc0FycmF5KHZhcmlhYmxlR3JhZGllbnRzKSA/XG4gICAgICAgIHZhcmlhYmxlR3JhZGllbnRzLm1hcChpdGVtID0+IGl0ZW0ubmFtZSkgOlxuICAgICAgICBPYmplY3Qua2V5cyh2YXJpYWJsZUdyYWRpZW50cyk7XG5cbiAgICB2YXJpYWJsZU5hbWVzLmZvckVhY2goKG5hbWUsIGkpID0+IHtcbiAgICAgIGNvbnN0IHZhbHVlID0gRU5HSU5FLnJlZ2lzdGVyZWRWYXJpYWJsZXNbbmFtZV07XG4gICAgICBjb25zdCB0cmFpbmFibGUgPSBmYWxzZTtcbiAgICAgIGlmICh0aGlzLmFjY3VtdWxhdGVkTWVhblNxdWFyZXNbaV0gPT0gbnVsbCkge1xuICAgICAgICB0aGlzLmFjY3VtdWxhdGVkTWVhblNxdWFyZXNbaV0gPSB7XG4gICAgICAgICAgb3JpZ2luYWxOYW1lOiBgJHtuYW1lfS9ybXNgLFxuICAgICAgICAgIHZhcmlhYmxlOiB0aWR5KCgpID0+IHplcm9zTGlrZSh2YWx1ZSkudmFyaWFibGUodHJhaW5hYmxlKSlcbiAgICAgICAgfTtcbiAgICAgIH1cbiAgICAgIGlmICh0aGlzLmFjY3VtdWxhdGVkTW9tZW50c1tpXSA9PSBudWxsKSB7XG4gICAgICAgIHRoaXMuYWNjdW11bGF0ZWRNb21lbnRzW2ldID0ge1xuICAgICAgICAgIG9yaWdpbmFsTmFtZTogYCR7bmFtZX0vbW9tZW50dW1gLFxuICAgICAgICAgIHZhcmlhYmxlOiB0aWR5KCgpID0+IHplcm9zTGlrZSh2YWx1ZSkudmFyaWFibGUodHJhaW5hYmxlKSlcbiAgICAgICAgfTtcbiAgICAgIH1cbiAgICAgIGlmICh0aGlzLmFjY3VtdWxhdGVkTWVhbkdyYWRzW2ldID09IG51bGwgJiYgdGhpcy5jZW50ZXJlZCkge1xuICAgICAgICB0aGlzLmFjY3VtdWxhdGVkTWVhbkdyYWRzW2ldID0ge1xuICAgICAgICAgIG9yaWdpbmFsTmFtZTogYCR7bmFtZX0vbWdgLFxuICAgICAgICAgIHZhcmlhYmxlOiB0aWR5KCgpID0+IHplcm9zTGlrZSh2YWx1ZSkudmFyaWFibGUodHJhaW5hYmxlKSlcbiAgICAgICAgfTtcbiAgICAgIH1cblxuICAgICAgY29uc3QgZ3JhZGllbnQgPSBBcnJheS5pc0FycmF5KHZhcmlhYmxlR3JhZGllbnRzKSA/XG4gICAgICAgICAgdmFyaWFibGVHcmFkaWVudHNbaV0udGVuc29yIDpcbiAgICAgICAgICB2YXJpYWJsZUdyYWRpZW50c1tuYW1lXTtcbiAgICAgIGlmIChncmFkaWVudCA9PSBudWxsKSB7XG4gICAgICAgIHJldHVybjtcbiAgICAgIH1cblxuICAgICAgY29uc3QgYWNjdW11bGF0ZWRNZWFuU3F1YXJlID0gdGhpcy5hY2N1bXVsYXRlZE1lYW5TcXVhcmVzW2ldLnZhcmlhYmxlO1xuICAgICAgY29uc3QgYWNjdW11bGF0ZWRNb21lbnRzID0gdGhpcy5hY2N1bXVsYXRlZE1vbWVudHNbaV0udmFyaWFibGU7XG4gICAgICB0aWR5KCgpID0+IHtcbiAgICAgICAgY29uc3QgbmV3QWNjdW11bGF0ZWRNZWFuU3F1YXJlID1cbiAgICAgICAgICAgIGFkZChtdWwoYWNjdW11bGF0ZWRNZWFuU3F1YXJlLCB0aGlzLmRlY2F5KSxcbiAgICAgICAgICAgICAgICBtdWwoc3F1YXJlKGdyYWRpZW50KSwgMSAtIHRoaXMuZGVjYXkpKTtcblxuICAgICAgICBpZiAodGhpcy5jZW50ZXJlZCkge1xuICAgICAgICAgIGNvbnN0IGFjY3VtdWxhdGVkTWVhbkdyYWQgPSB0aGlzLmFjY3VtdWxhdGVkTWVhbkdyYWRzW2ldLnZhcmlhYmxlO1xuICAgICAgICAgIC8vIENlbnRlcmVkIGdyYWRpZW50XG4gICAgICAgICAgY29uc3QgbmV3QWNjdW11bGF0ZWRNZWFuR3JhZCA9XG4gICAgICAgICAgICAgIGFkZChtdWwoYWNjdW11bGF0ZWRNZWFuR3JhZCwgdGhpcy5kZWNheSksXG4gICAgICAgICAgICAgICAgICBtdWwoZ3JhZGllbnQsIDEgLSB0aGlzLmRlY2F5KSk7XG5cbiAgICAgICAgICBjb25zdCBncmFkQ29udHJpYnV0aW9uID1cbiAgICAgICAgICAgICAgZGl2KG11bChncmFkaWVudCwgdGhpcy5sZWFybmluZ1JhdGUpLFxuICAgICAgICAgICAgICAgICAgc3FydChcbiAgICAgICAgICAgICAgICAgICAgICBzdWIobmV3QWNjdW11bGF0ZWRNZWFuU3F1YXJlLFxuICAgICAgICAgICAgICAgICAgICAgICAgICBhZGQoc3F1YXJlKG5ld0FjY3VtdWxhdGVkTWVhbkdyYWQpLCB0aGlzLmVwc2lsb24pKSkpO1xuICAgICAgICAgIGNvbnN0IG5ld0FjY3VtdWxhdGVkTW9tZW50cyA9XG4gICAgICAgICAgICAgIGFkZChtdWwoYWNjdW11bGF0ZWRNb21lbnRzLCB0aGlzLm1vbWVudHVtKSwgZ3JhZENvbnRyaWJ1dGlvbik7XG5cbiAgICAgICAgICBhY2N1bXVsYXRlZE1lYW5TcXVhcmUuYXNzaWduKG5ld0FjY3VtdWxhdGVkTWVhblNxdWFyZSk7XG4gICAgICAgICAgYWNjdW11bGF0ZWRNZWFuR3JhZC5hc3NpZ24obmV3QWNjdW11bGF0ZWRNZWFuR3JhZCk7XG4gICAgICAgICAgYWNjdW11bGF0ZWRNb21lbnRzLmFzc2lnbihuZXdBY2N1bXVsYXRlZE1vbWVudHMpO1xuXG4gICAgICAgICAgY29uc3QgbmV3VmFsdWUgPSBzdWIodmFsdWUsIG5ld0FjY3VtdWxhdGVkTW9tZW50cyk7XG4gICAgICAgICAgdmFsdWUuYXNzaWduKG5ld1ZhbHVlKTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAvLyBQbGFpbiBncmFkaWVudFxuICAgICAgICAgIGNvbnN0IG5ld0FjY3VtdWxhdGVkTWVhblNxdWFyZSA9XG4gICAgICAgICAgICAgIGFkZChtdWwoYWNjdW11bGF0ZWRNZWFuU3F1YXJlLCB0aGlzLmRlY2F5KSxcbiAgICAgICAgICAgICAgICAgIG11bChzcXVhcmUoZ3JhZGllbnQpLCAxIC0gdGhpcy5kZWNheSkpO1xuXG4gICAgICAgICAgY29uc3QgbmV3QWNjdW11bGF0ZWRNb21lbnRzID1cbiAgICAgICAgICAgICAgYWRkKG11bChhY2N1bXVsYXRlZE1vbWVudHMsIHRoaXMubW9tZW50dW0pLFxuICAgICAgICAgICAgICAgICAgZGl2KG11bChncmFkaWVudCwgdGhpcy5sZWFybmluZ1JhdGUpLFxuICAgICAgICAgICAgICAgICAgICAgIHNxcnQoYWRkKG5ld0FjY3VtdWxhdGVkTWVhblNxdWFyZSwgdGhpcy5lcHNpbG9uKSkpKTtcblxuICAgICAgICAgIGFjY3VtdWxhdGVkTWVhblNxdWFyZS5hc3NpZ24obmV3QWNjdW11bGF0ZWRNZWFuU3F1YXJlKTtcbiAgICAgICAgICBhY2N1bXVsYXRlZE1vbWVudHMuYXNzaWduKG5ld0FjY3VtdWxhdGVkTW9tZW50cyk7XG5cbiAgICAgICAgICBjb25zdCBuZXdWYWx1ZSA9IHN1Yih2YWx1ZSwgbmV3QWNjdW11bGF0ZWRNb21lbnRzKTtcbiAgICAgICAgICB2YWx1ZS5hc3NpZ24obmV3VmFsdWUpO1xuICAgICAgICB9XG4gICAgICB9KTtcbiAgICB9KTtcbiAgICB0aGlzLmluY3JlbWVudEl0ZXJhdGlvbnMoKTtcbiAgfVxuXG4gIGRpc3Bvc2UoKTogdm9pZCB7XG4gICAgaWYgKHRoaXMuYWNjdW11bGF0ZWRNZWFuU3F1YXJlcyAhPSBudWxsKSB7XG4gICAgICBkaXNwb3NlKHRoaXMuYWNjdW11bGF0ZWRNZWFuU3F1YXJlcy5tYXAodiA9PiB2LnZhcmlhYmxlKSk7XG4gICAgfVxuICAgIGlmICh0aGlzLmFjY3VtdWxhdGVkTWVhbkdyYWRzICE9IG51bGwgJiYgdGhpcy5jZW50ZXJlZCkge1xuICAgICAgZGlzcG9zZSh0aGlzLmFjY3VtdWxhdGVkTWVhbkdyYWRzLm1hcCh2ID0+IHYudmFyaWFibGUpKTtcbiAgICB9XG4gICAgaWYgKHRoaXMuYWNjdW11bGF0ZWRNb21lbnRzICE9IG51bGwpIHtcbiAgICAgIGRpc3Bvc2UodGhpcy5hY2N1bXVsYXRlZE1vbWVudHMubWFwKHYgPT4gdi52YXJpYWJsZSkpO1xuICAgIH1cbiAgfVxuXG4gIGFzeW5jIGdldFdlaWdodHMoKTogUHJvbWlzZTxOYW1lZFRlbnNvcltdPiB7XG4gICAgLy8gT3JkZXIgbWF0dGVycyBmb3IgUHl0aG9uIGNvbXBhdGliaWxpdHkuXG4gICAgY29uc3QgdmFyaWFibGVzOiBPcHRpbWl6ZXJWYXJpYWJsZVtdID1cbiAgICAgICAgWy4uLnRoaXMuYWNjdW11bGF0ZWRNZWFuU3F1YXJlcywgLi4udGhpcy5hY2N1bXVsYXRlZE1vbWVudHNdO1xuICAgIGlmICh0aGlzLmNlbnRlcmVkKSB7XG4gICAgICB2YXJpYWJsZXMucHVzaCguLi50aGlzLmFjY3VtdWxhdGVkTWVhbkdyYWRzKTtcbiAgICB9XG4gICAgcmV0dXJuIFthd2FpdCB0aGlzLnNhdmVJdGVyYXRpb25zKCldLmNvbmNhdChcbiAgICAgICAgdmFyaWFibGVzLm1hcCh2ID0+ICh7bmFtZTogdi5vcmlnaW5hbE5hbWUsIHRlbnNvcjogdi52YXJpYWJsZX0pKSk7XG4gIH1cblxuICBhc3luYyBzZXRXZWlnaHRzKHdlaWdodFZhbHVlczogTmFtZWRUZW5zb3JbXSk6IFByb21pc2U8dm9pZD4ge1xuICAgIHdlaWdodFZhbHVlcyA9IGF3YWl0IHRoaXMuZXh0cmFjdEl0ZXJhdGlvbnMod2VpZ2h0VmFsdWVzKTtcbiAgICBjb25zdCB2YXJpYWJsZUNvdW50ID1cbiAgICAgICAgdGhpcy5jZW50ZXJlZCA/IHdlaWdodFZhbHVlcy5sZW5ndGggLyAzIDogd2VpZ2h0VmFsdWVzLmxlbmd0aCAvIDI7XG4gICAgY29uc3QgdHJhaW5hYmxlID0gZmFsc2U7XG4gICAgdGhpcy5hY2N1bXVsYXRlZE1lYW5TcXVhcmVzID1cbiAgICAgICAgd2VpZ2h0VmFsdWVzLnNsaWNlKDAsIHZhcmlhYmxlQ291bnQpLm1hcCh2ID0+ICh7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvcmlnaW5hbE5hbWU6IHYubmFtZSxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhcmlhYmxlOiB2LnRlbnNvci52YXJpYWJsZShcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0cmFpbmFibGUpXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSkpO1xuICAgIHRoaXMuYWNjdW11bGF0ZWRNb21lbnRzID1cbiAgICAgICAgd2VpZ2h0VmFsdWVzLnNsaWNlKHZhcmlhYmxlQ291bnQsIHZhcmlhYmxlQ291bnQgKiAyKVxuICAgICAgICAgICAgLm1hcCh2ID0+ICh7XG4gICAgICAgICAgICAgICAgICAgb3JpZ2luYWxOYW1lOiB2Lm5hbWUsXG4gICAgICAgICAgICAgICAgICAgdmFyaWFibGU6IHYudGVuc29yLnZhcmlhYmxlKHRyYWluYWJsZSlcbiAgICAgICAgICAgICAgICAgfSkpO1xuICAgIGlmICh0aGlzLmNlbnRlcmVkKSB7XG4gICAgICB0aGlzLmFjY3VtdWxhdGVkTWVhbkdyYWRzID1cbiAgICAgICAgICB3ZWlnaHRWYWx1ZXMuc2xpY2UodmFyaWFibGVDb3VudCAqIDIsIHZhcmlhYmxlQ291bnQgKiAzKVxuICAgICAgICAgICAgICAubWFwKHYgPT4gKHtcbiAgICAgICAgICAgICAgICAgICAgIG9yaWdpbmFsTmFtZTogdi5uYW1lLFxuICAgICAgICAgICAgICAgICAgICAgdmFyaWFibGU6IHYudGVuc29yLnZhcmlhYmxlKHRyYWluYWJsZSlcbiAgICAgICAgICAgICAgICAgICB9KSk7XG4gICAgfVxuICB9XG5cbiAgZ2V0Q29uZmlnKCk6IENvbmZpZ0RpY3Qge1xuICAgIHJldHVybiB7XG4gICAgICAnbGVhcm5pbmdSYXRlJzogdGhpcy5sZWFybmluZ1JhdGUsXG4gICAgICAnZGVjYXknOiB0aGlzLmRlY2F5LFxuICAgICAgJ21vbWVudHVtJzogdGhpcy5tb21lbnR1bSxcbiAgICAgICdlcHNpbG9uJzogdGhpcy5lcHNpbG9uLFxuICAgICAgJ2NlbnRlcmVkJzogdGhpcy5jZW50ZXJlZFxuICAgIH07XG4gIH1cblxuICAvKiogQG5vY29sbGFwc2UgKi9cbiAgc3RhdGljIGZyb21Db25maWc8VCBleHRlbmRzIFNlcmlhbGl6YWJsZT4oXG4gICAgICBjbHM6IFNlcmlhbGl6YWJsZUNvbnN0cnVjdG9yPFQ+LCBjb25maWc6IENvbmZpZ0RpY3QpOiBUIHtcbiAgICByZXR1cm4gbmV3IGNscyhcbiAgICAgICAgY29uZmlnWydsZWFybmluZ1JhdGUnXSwgY29uZmlnWydkZWNheSddLCBjb25maWdbJ21vbWVudHVtJ10sXG4gICAgICAgIGNvbmZpZ1snZXBzaWxvbiddLCBjb25maWdbJ2NlbnRlcmVkJ10pO1xuICB9XG59XG5yZWdpc3RlckNsYXNzKFJNU1Byb3BPcHRpbWl6ZXIpO1xuIl19","/**\n * @license\n * Copyright 2018 Google LLC. All Rights Reserved.\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n * =============================================================================\n */\nimport { AdadeltaOptimizer } from './adadelta_optimizer';\nimport { AdagradOptimizer } from './adagrad_optimizer';\nimport { AdamOptimizer } from './adam_optimizer';\nimport { AdamaxOptimizer } from './adamax_optimizer';\nimport { MomentumOptimizer } from './momentum_optimizer';\nimport { RMSPropOptimizer } from './rmsprop_optimizer';\nimport { SGDOptimizer } from './sgd_optimizer';\nexport class OptimizerConstructors {\n /**\n * Constructs a `tf.SGDOptimizer` that uses stochastic gradient descent.\n *\n * ```js\n * // Fit a quadratic function by learning the coefficients a, b, c.\n * const xs = tf.tensor1d([0, 1, 2, 3]);\n * const ys = tf.tensor1d([1.1, 5.9, 16.8, 33.9]);\n *\n * const a = tf.scalar(Math.random()).variable();\n * const b = tf.scalar(Math.random()).variable();\n * const c = tf.scalar(Math.random()).variable();\n *\n * // y = a * x^2 + b * x + c.\n * const f = x => a.mul(x.square()).add(b.mul(x)).add(c);\n * const loss = (pred, label) => pred.sub(label).square().mean();\n *\n * const learningRate = 0.01;\n * const optimizer = tf.train.sgd(learningRate);\n *\n * // Train the model.\n * for (let i = 0; i < 10; i++) {\n * optimizer.minimize(() => loss(f(xs), ys));\n * }\n *\n * // Make predictions.\n * console.log(\n * `a: ${a.dataSync()}, b: ${b.dataSync()}, c: ${c.dataSync()}`);\n * const preds = f(xs).dataSync();\n * preds.forEach((pred, i) => {\n * console.log(`x: ${i}, pred: ${pred}`);\n * });\n * ```\n *\n * @param learningRate The learning rate to use for the SGD algorithm.\n *\n * @doc {heading: 'Training', subheading: 'Optimizers', namespace: 'train'}\n */\n static sgd(learningRate) {\n return new SGDOptimizer(learningRate);\n }\n /**\n * Constructs a `tf.MomentumOptimizer` that uses momentum gradient\n * descent.\n *\n * See\n * [http://proceedings.mlr.press/v28/sutskever13.pdf](\n * http://proceedings.mlr.press/v28/sutskever13.pdf)\n *\n * @param learningRate The learning rate to use for the Momentum gradient\n * descent algorithm.\n * @param momentum The momentum to use for the momentum gradient descent\n * algorithm.\n *\n * @doc {heading: 'Training', subheading: 'Optimizers', namespace: 'train'}\n */\n static momentum(learningRate, momentum, useNesterov = false) {\n return new MomentumOptimizer(learningRate, momentum, useNesterov);\n }\n /**\n * Constructs a `tf.RMSPropOptimizer` that uses RMSProp gradient\n * descent. This implementation uses plain momentum and is not centered\n * version of RMSProp.\n *\n * See\n * [http://www.cs.toronto.edu/~tijmen/csc321/slides/lecture_slides_lec6.pdf](\n * http://www.cs.toronto.edu/~tijmen/csc321/slides/lecture_slides_lec6.pdf)\n *\n * @param learningRate The learning rate to use for the RMSProp gradient\n * descent algorithm.\n * @param decay The discounting factor for the history/coming gradient.\n * @param momentum The momentum to use for the RMSProp gradient descent\n * algorithm.\n * @param epsilon Small value to avoid zero denominator.\n * @param centered If true, gradients are normalized by the estimated\n * variance of the gradient.\n *\n * @doc {heading: 'Training', subheading: 'Optimizers', namespace: 'train'}\n */\n static rmsprop(learningRate, decay = .9, momentum = 0.0, epsilon = null, centered = false) {\n return new RMSPropOptimizer(learningRate, decay, momentum, epsilon, centered);\n }\n /**\n * Constructs a `tf.AdamOptimizer` that uses the Adam algorithm.\n * See [https://arxiv.org/abs/1412.6980](https://arxiv.org/abs/1412.6980)\n *\n * @param learningRate The learning rate to use for the Adam gradient\n * descent algorithm.\n * @param beta1 The exponential decay rate for the 1st moment estimates.\n * @param beta2 The exponential decay rate for the 2nd moment estimates.\n * @param epsilon A small constant for numerical stability.\n *\n * @doc {heading: 'Training', subheading: 'Optimizers', namespace: 'train'}\n */\n static adam(learningRate = 0.001, beta1 = 0.9, beta2 = 0.999, epsilon = null) {\n return new AdamOptimizer(learningRate, beta1, beta2, epsilon);\n }\n /**\n * Constructs a `tf.AdadeltaOptimizer` that uses the Adadelta algorithm.\n * See [https://arxiv.org/abs/1212.5701](https://arxiv.org/abs/1212.5701)\n *\n * @param learningRate The learning rate to use for the Adadelta gradient\n * descent algorithm.\n * @param rho The learning rate decay over each update.\n * @param epsilon A constant epsilon used to better condition the grad\n * update.\n *\n * @doc {heading: 'Training', subheading: 'Optimizers', namespace: 'train'}\n */\n static adadelta(learningRate = .001, rho = .95, epsilon = null) {\n return new AdadeltaOptimizer(learningRate, rho, epsilon);\n }\n /**\n * Constructs a `tf.AdamaxOptimizer` that uses the Adamax algorithm.\n * See [https://arxiv.org/abs/1412.6980](https://arxiv.org/abs/1412.6980)\n *\n * @param learningRate The learning rate to use for the Adamax gradient\n * descent algorithm.\n * @param beta1 The exponential decay rate for the 1st moment estimates.\n * @param beta2 The exponential decay rate for the 2nd moment estimates.\n * @param epsilon A small constant for numerical stability.\n * @param decay The learning rate decay over each update.\n *\n * @doc {heading: 'Training', subheading: 'Optimizers', namespace: 'train'}\n */\n static adamax(learningRate = 0.002, beta1 = 0.9, beta2 = 0.999, epsilon = null, decay = 0.0) {\n return new AdamaxOptimizer(learningRate, beta1, beta2, epsilon, decay);\n }\n /**\n * Constructs a `tf.AdagradOptimizer` that uses the Adagrad algorithm.\n * See\n * [http://www.jmlr.org/papers/volume12/duchi11a/duchi11a.pdf](\n * http://www.jmlr.org/papers/volume12/duchi11a/duchi11a.pdf)\n * or\n * [http://ruder.io/optimizing-gradient-descent/index.html#adagrad](\n * http://ruder.io/optimizing-gradient-descent/index.html#adagrad)\n *\n * @param learningRate The learning rate to use for the Adagrad gradient\n * descent algorithm.\n * @param initialAccumulatorValue Starting value for the accumulators, must be\n * positive.\n *\n * @doc {heading: 'Training', subheading: 'Optimizers', namespace: 'train'}\n */\n static adagrad(learningRate, initialAccumulatorValue = 0.1) {\n return new AdagradOptimizer(learningRate, initialAccumulatorValue);\n }\n}\n//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoib3B0aW1pemVyX2NvbnN0cnVjdG9ycy5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uLy4uL3RmanMtY29yZS9zcmMvb3B0aW1pemVycy9vcHRpbWl6ZXJfY29uc3RydWN0b3JzLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBOzs7Ozs7Ozs7Ozs7Ozs7R0FlRztBQUVILE9BQU8sRUFBQyxpQkFBaUIsRUFBQyxNQUFNLHNCQUFzQixDQUFDO0FBQ3ZELE9BQU8sRUFBQyxnQkFBZ0IsRUFBQyxNQUFNLHFCQUFxQixDQUFDO0FBQ3JELE9BQU8sRUFBQyxhQUFhLEVBQUMsTUFBTSxrQkFBa0IsQ0FBQztBQUMvQyxPQUFPLEVBQUMsZUFBZSxFQUFDLE1BQU0sb0JBQW9CLENBQUM7QUFDbkQsT0FBTyxFQUFDLGlCQUFpQixFQUFDLE1BQU0sc0JBQXNCLENBQUM7QUFDdkQsT0FBTyxFQUFDLGdCQUFnQixFQUFDLE1BQU0scUJBQXFCLENBQUM7QUFDckQsT0FBTyxFQUFDLFlBQVksRUFBQyxNQUFNLGlCQUFpQixDQUFDO0FBRTdDLE1BQU0sT0FBTyxxQkFBcUI7SUFDaEM7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7OztPQW9DRztJQUNILE1BQU0sQ0FBQyxHQUFHLENBQUMsWUFBb0I7UUFDN0IsT0FBTyxJQUFJLFlBQVksQ0FBQyxZQUFZLENBQUMsQ0FBQztJQUN4QyxDQUFDO0lBRUQ7Ozs7Ozs7Ozs7Ozs7O09BY0c7SUFDSCxNQUFNLENBQUMsUUFBUSxDQUFDLFlBQW9CLEVBQUUsUUFBZ0IsRUFBRSxXQUFXLEdBQUcsS0FBSztRQUV6RSxPQUFPLElBQUksaUJBQWlCLENBQUMsWUFBWSxFQUFFLFFBQVEsRUFBRSxXQUFXLENBQUMsQ0FBQztJQUNwRSxDQUFDO0lBRUQ7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7T0FtQkc7SUFDSCxNQUFNLENBQUMsT0FBTyxDQUNWLFlBQW9CLEVBQUUsS0FBSyxHQUFHLEVBQUUsRUFBRSxRQUFRLEdBQUcsR0FBRyxFQUFFLFVBQWtCLElBQUksRUFDeEUsUUFBUSxHQUFHLEtBQUs7UUFDbEIsT0FBTyxJQUFJLGdCQUFnQixDQUN2QixZQUFZLEVBQUUsS0FBSyxFQUFFLFFBQVEsRUFBRSxPQUFPLEVBQUUsUUFBUSxDQUFDLENBQUM7SUFDeEQsQ0FBQztJQUVEOzs7Ozs7Ozs7OztPQVdHO0lBQ0gsTUFBTSxDQUFDLElBQUksQ0FDUCxZQUFZLEdBQUcsS0FBSyxFQUFFLEtBQUssR0FBRyxHQUFHLEVBQUUsS0FBSyxHQUFHLEtBQUssRUFDaEQsVUFBa0IsSUFBSTtRQUN4QixPQUFPLElBQUksYUFBYSxDQUFDLFlBQVksRUFBRSxLQUFLLEVBQUUsS0FBSyxFQUFFLE9BQU8sQ0FBQyxDQUFDO0lBQ2hFLENBQUM7SUFFRDs7Ozs7Ozs7Ozs7T0FXRztJQUNILE1BQU0sQ0FBQyxRQUFRLENBQUMsWUFBWSxHQUFHLElBQUksRUFBRSxHQUFHLEdBQUcsR0FBRyxFQUFFLFVBQWtCLElBQUk7UUFFcEUsT0FBTyxJQUFJLGlCQUFpQixDQUFDLFlBQVksRUFBRSxHQUFHLEVBQUUsT0FBTyxDQUFDLENBQUM7SUFDM0QsQ0FBQztJQUVEOzs7Ozs7Ozs7Ozs7T0FZRztJQUNILE1BQU0sQ0FBQyxNQUFNLENBQ1QsWUFBWSxHQUFHLEtBQUssRUFBRSxLQUFLLEdBQUcsR0FBRyxFQUFFLEtBQUssR0FBRyxLQUFLLEVBQUUsVUFBa0IsSUFBSSxFQUN4RSxLQUFLLEdBQUcsR0FBRztRQUNiLE9BQU8sSUFBSSxlQUFlLENBQUMsWUFBWSxFQUFFLEtBQUssRUFBRSxLQUFLLEVBQUUsT0FBTyxFQUFFLEtBQUssQ0FBQyxDQUFDO0lBQ3pFLENBQUM7SUFFRDs7Ozs7Ozs7Ozs7Ozs7O09BZUc7SUFDSCxNQUFNLENBQUMsT0FBTyxDQUFDLFlBQW9CLEVBQUUsdUJBQXVCLEdBQUcsR0FBRztRQUVoRSxPQUFPLElBQUksZ0JBQWdCLENBQUMsWUFBWSxFQUFFLHVCQUF1QixDQUFDLENBQUM7SUFDckUsQ0FBQztDQUNGIiwic291cmNlc0NvbnRlbnQiOlsiLyoqXG4gKiBAbGljZW5zZVxuICogQ29weXJpZ2h0IDIwMTggR29vZ2xlIExMQy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC5cbiAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSBcIkxpY2Vuc2VcIik7XG4gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuXG4gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXRcbiAqXG4gKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjBcbiAqXG4gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlXG4gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiBcIkFTIElTXCIgQkFTSVMsXG4gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC5cbiAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmRcbiAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLlxuICogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbiAqL1xuXG5pbXBvcnQge0FkYWRlbHRhT3B0aW1pemVyfSBmcm9tICcuL2FkYWRlbHRhX29wdGltaXplcic7XG5pbXBvcnQge0FkYWdyYWRPcHRpbWl6ZXJ9IGZyb20gJy4vYWRhZ3JhZF9vcHRpbWl6ZXInO1xuaW1wb3J0IHtBZGFtT3B0aW1pemVyfSBmcm9tICcuL2FkYW1fb3B0aW1pemVyJztcbmltcG9ydCB7QWRhbWF4T3B0aW1pemVyfSBmcm9tICcuL2FkYW1heF9vcHRpbWl6ZXInO1xuaW1wb3J0IHtNb21lbnR1bU9wdGltaXplcn0gZnJvbSAnLi9tb21lbnR1bV9vcHRpbWl6ZXInO1xuaW1wb3J0IHtSTVNQcm9wT3B0aW1pemVyfSBmcm9tICcuL3Jtc3Byb3Bfb3B0aW1pemVyJztcbmltcG9ydCB7U0dET3B0aW1pemVyfSBmcm9tICcuL3NnZF9vcHRpbWl6ZXInO1xuXG5leHBvcnQgY2xhc3MgT3B0aW1pemVyQ29uc3RydWN0b3JzIHtcbiAgLyoqXG4gICAqIENvbnN0cnVjdHMgYSBgdGYuU0dET3B0aW1pemVyYCB0aGF0IHVzZXMgc3RvY2hhc3RpYyBncmFkaWVudCBkZXNjZW50LlxuICAgKlxuICAgKiBgYGBqc1xuICAgKiAvLyBGaXQgYSBxdWFkcmF0aWMgZnVuY3Rpb24gYnkgbGVhcm5pbmcgdGhlIGNvZWZmaWNpZW50cyBhLCBiLCBjLlxuICAgKiBjb25zdCB4cyA9IHRmLnRlbnNvcjFkKFswLCAxLCAyLCAzXSk7XG4gICAqIGNvbnN0IHlzID0gdGYudGVuc29yMWQoWzEuMSwgNS45LCAxNi44LCAzMy45XSk7XG4gICAqXG4gICAqIGNvbnN0IGEgPSB0Zi5zY2FsYXIoTWF0aC5yYW5kb20oKSkudmFyaWFibGUoKTtcbiAgICogY29uc3QgYiA9IHRmLnNjYWxhcihNYXRoLnJhbmRvbSgpKS52YXJpYWJsZSgpO1xuICAgKiBjb25zdCBjID0gdGYuc2NhbGFyKE1hdGgucmFuZG9tKCkpLnZhcmlhYmxlKCk7XG4gICAqXG4gICAqIC8vIHkgPSBhICogeF4yICsgYiAqIHggKyBjLlxuICAgKiBjb25zdCBmID0geCA9PiBhLm11bCh4LnNxdWFyZSgpKS5hZGQoYi5tdWwoeCkpLmFkZChjKTtcbiAgICogY29uc3QgbG9zcyA9IChwcmVkLCBsYWJlbCkgPT4gcHJlZC5zdWIobGFiZWwpLnNxdWFyZSgpLm1lYW4oKTtcbiAgICpcbiAgICogY29uc3QgbGVhcm5pbmdSYXRlID0gMC4wMTtcbiAgICogY29uc3Qgb3B0aW1pemVyID0gdGYudHJhaW4uc2dkKGxlYXJuaW5nUmF0ZSk7XG4gICAqXG4gICAqIC8vIFRyYWluIHRoZSBtb2RlbC5cbiAgICogZm9yIChsZXQgaSA9IDA7IGkgPCAxMDsgaSsrKSB7XG4gICAqICAgb3B0aW1pemVyLm1pbmltaXplKCgpID0+IGxvc3MoZih4cyksIHlzKSk7XG4gICAqIH1cbiAgICpcbiAgICogLy8gTWFrZSBwcmVkaWN0aW9ucy5cbiAgICogY29uc29sZS5sb2coXG4gICAqICAgICBgYTogJHthLmRhdGFTeW5jKCl9LCBiOiAke2IuZGF0YVN5bmMoKX0sIGM6ICR7Yy5kYXRhU3luYygpfWApO1xuICAgKiBjb25zdCBwcmVkcyA9IGYoeHMpLmRhdGFTeW5jKCk7XG4gICAqIHByZWRzLmZvckVhY2goKHByZWQsIGkpID0+IHtcbiAgICogICBjb25zb2xlLmxvZyhgeDogJHtpfSwgcHJlZDogJHtwcmVkfWApO1xuICAgKiB9KTtcbiAgICogYGBgXG4gICAqXG4gICAqIEBwYXJhbSBsZWFybmluZ1JhdGUgVGhlIGxlYXJuaW5nIHJhdGUgdG8gdXNlIGZvciB0aGUgU0dEIGFsZ29yaXRobS5cbiAgICpcbiAgICogQGRvYyB7aGVhZGluZzogJ1RyYWluaW5nJywgc3ViaGVhZGluZzogJ09wdGltaXplcnMnLCBuYW1lc3BhY2U6ICd0cmFpbid9XG4gICAqL1xuICBzdGF0aWMgc2dkKGxlYXJuaW5nUmF0ZTogbnVtYmVyKTogU0dET3B0aW1pemVyIHtcbiAgICByZXR1cm4gbmV3IFNHRE9wdGltaXplcihsZWFybmluZ1JhdGUpO1xuICB9XG5cbiAgLyoqXG4gICAqIENvbnN0cnVjdHMgYSBgdGYuTW9tZW50dW1PcHRpbWl6ZXJgIHRoYXQgdXNlcyBtb21lbnR1bSBncmFkaWVudFxuICAgKiBkZXNjZW50LlxuICAgKlxuICAgKiBTZWVcbiAgICogW2h0dHA6Ly9wcm9jZWVkaW5ncy5tbHIucHJlc3MvdjI4L3N1dHNrZXZlcjEzLnBkZl0oXG4gICAqIGh0dHA6Ly9wcm9jZWVkaW5ncy5tbHIucHJlc3MvdjI4L3N1dHNrZXZlcjEzLnBkZilcbiAgICpcbiAgICogQHBhcmFtIGxlYXJuaW5nUmF0ZSBUaGUgbGVhcm5pbmcgcmF0ZSB0byB1c2UgZm9yIHRoZSBNb21lbnR1bSBncmFkaWVudFxuICAgKiBkZXNjZW50IGFsZ29yaXRobS5cbiAgICogQHBhcmFtIG1vbWVudHVtIFRoZSBtb21lbnR1bSB0byB1c2UgZm9yIHRoZSBtb21lbnR1bSBncmFkaWVudCBkZXNjZW50XG4gICAqIGFsZ29yaXRobS5cbiAgICpcbiAgICogQGRvYyB7aGVhZGluZzogJ1RyYWluaW5nJywgc3ViaGVhZGluZzogJ09wdGltaXplcnMnLCBuYW1lc3BhY2U6ICd0cmFpbid9XG4gICAqL1xuICBzdGF0aWMgbW9tZW50dW0obGVhcm5pbmdSYXRlOiBudW1iZXIsIG1vbWVudHVtOiBudW1iZXIsIHVzZU5lc3Rlcm92ID0gZmFsc2UpOlxuICAgICAgTW9tZW50dW1PcHRpbWl6ZXIge1xuICAgIHJldHVybiBuZXcgTW9tZW50dW1PcHRpbWl6ZXIobGVhcm5pbmdSYXRlLCBtb21lbnR1bSwgdXNlTmVzdGVyb3YpO1xuICB9XG5cbiAgLyoqXG4gICAqIENvbnN0cnVjdHMgYSBgdGYuUk1TUHJvcE9wdGltaXplcmAgdGhhdCB1c2VzIFJNU1Byb3AgZ3JhZGllbnRcbiAgICogZGVzY2VudC4gVGhpcyBpbXBsZW1lbnRhdGlvbiB1c2VzIHBsYWluIG1vbWVudHVtIGFuZCBpcyBub3QgY2VudGVyZWRcbiAgICogdmVyc2lvbiBvZiBSTVNQcm9wLlxuICAgKlxuICAgKiBTZWVcbiAgICogW2h0dHA6Ly93d3cuY3MudG9yb250by5lZHUvfnRpam1lbi9jc2MzMjEvc2xpZGVzL2xlY3R1cmVfc2xpZGVzX2xlYzYucGRmXShcbiAgICogaHR0cDovL3d3dy5jcy50b3JvbnRvLmVkdS9+dGlqbWVuL2NzYzMyMS9zbGlkZXMvbGVjdHVyZV9zbGlkZXNfbGVjNi5wZGYpXG4gICAqXG4gICAqIEBwYXJhbSBsZWFybmluZ1JhdGUgVGhlIGxlYXJuaW5nIHJhdGUgdG8gdXNlIGZvciB0aGUgUk1TUHJvcCBncmFkaWVudFxuICAgKiBkZXNjZW50IGFsZ29yaXRobS5cbiAgICogQHBhcmFtIGRlY2F5IFRoZSBkaXNjb3VudGluZyBmYWN0b3IgZm9yIHRoZSBoaXN0b3J5L2NvbWluZyBncmFkaWVudC5cbiAgICogQHBhcmFtIG1vbWVudHVtIFRoZSBtb21lbnR1bSB0byB1c2UgZm9yIHRoZSBSTVNQcm9wIGdyYWRpZW50IGRlc2NlbnRcbiAgICogYWxnb3JpdGhtLlxuICAgKiBAcGFyYW0gZXBzaWxvbiBTbWFsbCB2YWx1ZSB0byBhdm9pZCB6ZXJvIGRlbm9taW5hdG9yLlxuICAgKiBAcGFyYW0gY2VudGVyZWQgSWYgdHJ1ZSwgZ3JhZGllbnRzIGFyZSBub3JtYWxpemVkIGJ5IHRoZSBlc3RpbWF0ZWRcbiAgICogdmFyaWFuY2Ugb2YgdGhlIGdyYWRpZW50LlxuICAgKlxuICAgKiBAZG9jIHtoZWFkaW5nOiAnVHJhaW5pbmcnLCBzdWJoZWFkaW5nOiAnT3B0aW1pemVycycsIG5hbWVzcGFjZTogJ3RyYWluJ31cbiAgICovXG4gIHN0YXRpYyBybXNwcm9wKFxuICAgICAgbGVhcm5pbmdSYXRlOiBudW1iZXIsIGRlY2F5ID0gLjksIG1vbWVudHVtID0gMC4wLCBlcHNpbG9uOiBudW1iZXIgPSBudWxsLFxuICAgICAgY2VudGVyZWQgPSBmYWxzZSk6IFJNU1Byb3BPcHRpbWl6ZXIge1xuICAgIHJldHVybiBuZXcgUk1TUHJvcE9wdGltaXplcihcbiAgICAgICAgbGVhcm5pbmdSYXRlLCBkZWNheSwgbW9tZW50dW0sIGVwc2lsb24sIGNlbnRlcmVkKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBDb25zdHJ1Y3RzIGEgYHRmLkFkYW1PcHRpbWl6ZXJgIHRoYXQgdXNlcyB0aGUgQWRhbSBhbGdvcml0aG0uXG4gICAqIFNlZSBbaHR0cHM6Ly9hcnhpdi5vcmcvYWJzLzE0MTIuNjk4MF0oaHR0cHM6Ly9hcnhpdi5vcmcvYWJzLzE0MTIuNjk4MClcbiAgICpcbiAgICogQHBhcmFtIGxlYXJuaW5nUmF0ZSBUaGUgbGVhcm5pbmcgcmF0ZSB0byB1c2UgZm9yIHRoZSBBZGFtIGdyYWRpZW50XG4gICAqIGRlc2NlbnQgYWxnb3JpdGhtLlxuICAgKiBAcGFyYW0gYmV0YTEgVGhlIGV4cG9uZW50aWFsIGRlY2F5IHJhdGUgZm9yIHRoZSAxc3QgbW9tZW50IGVzdGltYXRlcy5cbiAgICogQHBhcmFtIGJldGEyIFRoZSBleHBvbmVudGlhbCBkZWNheSByYXRlIGZvciB0aGUgMm5kIG1vbWVudCBlc3RpbWF0ZXMuXG4gICAqIEBwYXJhbSBlcHNpbG9uIEEgc21hbGwgY29uc3RhbnQgZm9yIG51bWVyaWNhbCBzdGFiaWxpdHkuXG4gICAqXG4gICAqIEBkb2Mge2hlYWRpbmc6ICdUcmFpbmluZycsIHN1YmhlYWRpbmc6ICdPcHRpbWl6ZXJzJywgbmFtZXNwYWNlOiAndHJhaW4nfVxuICAgKi9cbiAgc3RhdGljIGFkYW0oXG4gICAgICBsZWFybmluZ1JhdGUgPSAwLjAwMSwgYmV0YTEgPSAwLjksIGJldGEyID0gMC45OTksXG4gICAgICBlcHNpbG9uOiBudW1iZXIgPSBudWxsKTogQWRhbU9wdGltaXplciB7XG4gICAgcmV0dXJuIG5ldyBBZGFtT3B0aW1pemVyKGxlYXJuaW5nUmF0ZSwgYmV0YTEsIGJldGEyLCBlcHNpbG9uKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBDb25zdHJ1Y3RzIGEgYHRmLkFkYWRlbHRhT3B0aW1pemVyYCB0aGF0IHVzZXMgdGhlIEFkYWRlbHRhIGFsZ29yaXRobS5cbiAgICogU2VlIFtodHRwczovL2FyeGl2Lm9yZy9hYnMvMTIxMi41NzAxXShodHRwczovL2FyeGl2Lm9yZy9hYnMvMTIxMi41NzAxKVxuICAgKlxuICAgKiBAcGFyYW0gbGVhcm5pbmdSYXRlIFRoZSBsZWFybmluZyByYXRlIHRvIHVzZSBmb3IgdGhlIEFkYWRlbHRhIGdyYWRpZW50XG4gICAqIGRlc2NlbnQgYWxnb3JpdGhtLlxuICAgKiBAcGFyYW0gcmhvIFRoZSBsZWFybmluZyByYXRlIGRlY2F5IG92ZXIgZWFjaCB1cGRhdGUuXG4gICAqIEBwYXJhbSBlcHNpbG9uIEEgY29uc3RhbnQgZXBzaWxvbiB1c2VkIHRvIGJldHRlciBjb25kaXRpb24gdGhlIGdyYWRcbiAgICogdXBkYXRlLlxuICAgKlxuICAgKiBAZG9jIHtoZWFkaW5nOiAnVHJhaW5pbmcnLCBzdWJoZWFkaW5nOiAnT3B0aW1pemVycycsIG5hbWVzcGFjZTogJ3RyYWluJ31cbiAgICovXG4gIHN0YXRpYyBhZGFkZWx0YShsZWFybmluZ1JhdGUgPSAuMDAxLCByaG8gPSAuOTUsIGVwc2lsb246IG51bWJlciA9IG51bGwpOlxuICAgICAgQWRhZGVsdGFPcHRpbWl6ZXIge1xuICAgIHJldHVybiBuZXcgQWRhZGVsdGFPcHRpbWl6ZXIobGVhcm5pbmdSYXRlLCByaG8sIGVwc2lsb24pO1xuICB9XG5cbiAgLyoqXG4gICAqIENvbnN0cnVjdHMgYSBgdGYuQWRhbWF4T3B0aW1pemVyYCB0aGF0IHVzZXMgdGhlIEFkYW1heCBhbGdvcml0aG0uXG4gICAqIFNlZSBbaHR0cHM6Ly9hcnhpdi5vcmcvYWJzLzE0MTIuNjk4MF0oaHR0cHM6Ly9hcnhpdi5vcmcvYWJzLzE0MTIuNjk4MClcbiAgICpcbiAgICogQHBhcmFtIGxlYXJuaW5nUmF0ZSBUaGUgbGVhcm5pbmcgcmF0ZSB0byB1c2UgZm9yIHRoZSBBZGFtYXggZ3JhZGllbnRcbiAgICogZGVzY2VudCBhbGdvcml0aG0uXG4gICAqIEBwYXJhbSBiZXRhMSBUaGUgZXhwb25lbnRpYWwgZGVjYXkgcmF0ZSBmb3IgdGhlIDFzdCBtb21lbnQgZXN0aW1hdGVzLlxuICAgKiBAcGFyYW0gYmV0YTIgVGhlIGV4cG9uZW50aWFsIGRlY2F5IHJhdGUgZm9yIHRoZSAybmQgbW9tZW50IGVzdGltYXRlcy5cbiAgICogQHBhcmFtIGVwc2lsb24gQSBzbWFsbCBjb25zdGFudCBmb3IgbnVtZXJpY2FsIHN0YWJpbGl0eS5cbiAgICogQHBhcmFtIGRlY2F5IFRoZSBsZWFybmluZyByYXRlIGRlY2F5IG92ZXIgZWFjaCB1cGRhdGUuXG4gICAqXG4gICAqIEBkb2Mge2hlYWRpbmc6ICdUcmFpbmluZycsIHN1YmhlYWRpbmc6ICdPcHRpbWl6ZXJzJywgbmFtZXNwYWNlOiAndHJhaW4nfVxuICAgKi9cbiAgc3RhdGljIGFkYW1heChcbiAgICAgIGxlYXJuaW5nUmF0ZSA9IDAuMDAyLCBiZXRhMSA9IDAuOSwgYmV0YTIgPSAwLjk5OSwgZXBzaWxvbjogbnVtYmVyID0gbnVsbCxcbiAgICAgIGRlY2F5ID0gMC4wKTogQWRhbWF4T3B0aW1pemVyIHtcbiAgICByZXR1cm4gbmV3IEFkYW1heE9wdGltaXplcihsZWFybmluZ1JhdGUsIGJldGExLCBiZXRhMiwgZXBzaWxvbiwgZGVjYXkpO1xuICB9XG5cbiAgLyoqXG4gICAqIENvbnN0cnVjdHMgYSBgdGYuQWRhZ3JhZE9wdGltaXplcmAgdGhhdCB1c2VzIHRoZSBBZGFncmFkIGFsZ29yaXRobS5cbiAgICogU2VlXG4gICAqIFtodHRwOi8vd3d3LmptbHIub3JnL3BhcGVycy92b2x1bWUxMi9kdWNoaTExYS9kdWNoaTExYS5wZGZdKFxuICAgKiBodHRwOi8vd3d3LmptbHIub3JnL3BhcGVycy92b2x1bWUxMi9kdWNoaTExYS9kdWNoaTExYS5wZGYpXG4gICAqIG9yXG4gICAqIFtodHRwOi8vcnVkZXIuaW8vb3B0aW1pemluZy1ncmFkaWVudC1kZXNjZW50L2luZGV4Lmh0bWwjYWRhZ3JhZF0oXG4gICAqIGh0dHA6Ly9ydWRlci5pby9vcHRpbWl6aW5nLWdyYWRpZW50LWRlc2NlbnQvaW5kZXguaHRtbCNhZGFncmFkKVxuICAgKlxuICAgKiBAcGFyYW0gbGVhcm5pbmdSYXRlIFRoZSBsZWFybmluZyByYXRlIHRvIHVzZSBmb3IgdGhlIEFkYWdyYWQgZ3JhZGllbnRcbiAgICogZGVzY2VudCBhbGdvcml0aG0uXG4gICAqIEBwYXJhbSBpbml0aWFsQWNjdW11bGF0b3JWYWx1ZSBTdGFydGluZyB2YWx1ZSBmb3IgdGhlIGFjY3VtdWxhdG9ycywgbXVzdCBiZVxuICAgKiBwb3NpdGl2ZS5cbiAgICpcbiAgICogQGRvYyB7aGVhZGluZzogJ1RyYWluaW5nJywgc3ViaGVhZGluZzogJ09wdGltaXplcnMnLCBuYW1lc3BhY2U6ICd0cmFpbid9XG4gICAqL1xuICBzdGF0aWMgYWRhZ3JhZChsZWFybmluZ1JhdGU6IG51bWJlciwgaW5pdGlhbEFjY3VtdWxhdG9yVmFsdWUgPSAwLjEpOlxuICAgICAgQWRhZ3JhZE9wdGltaXplciB7XG4gICAgcmV0dXJuIG5ldyBBZGFncmFkT3B0aW1pemVyKGxlYXJuaW5nUmF0ZSwgaW5pdGlhbEFjY3VtdWxhdG9yVmFsdWUpO1xuICB9XG59XG4iXX0=","/**\n * @license\n * Copyright 2018 Google LLC. All Rights Reserved.\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n * =============================================================================\n */\n// So typings can propagate.\nimport { AdadeltaOptimizer } from './optimizers/adadelta_optimizer';\nimport { AdagradOptimizer } from './optimizers/adagrad_optimizer';\nimport { AdamOptimizer } from './optimizers/adam_optimizer';\nimport { AdamaxOptimizer } from './optimizers/adamax_optimizer';\nimport { MomentumOptimizer } from './optimizers/momentum_optimizer';\nimport { OptimizerConstructors } from './optimizers/optimizer_constructors';\nimport { RMSPropOptimizer } from './optimizers/rmsprop_optimizer';\nimport { SGDOptimizer } from './optimizers/sgd_optimizer';\n// tslint:disable-next-line:no-unused-expression\n[MomentumOptimizer, SGDOptimizer, AdadeltaOptimizer, AdagradOptimizer,\n RMSPropOptimizer, AdamaxOptimizer, AdamOptimizer];\nexport const train = {\n sgd: OptimizerConstructors.sgd,\n momentum: OptimizerConstructors.momentum,\n adadelta: OptimizerConstructors.adadelta,\n adagrad: OptimizerConstructors.adagrad,\n rmsprop: OptimizerConstructors.rmsprop,\n adamax: OptimizerConstructors.adamax,\n adam: OptimizerConstructors.adam\n};\n//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidHJhaW4uanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi90ZmpzLWNvcmUvc3JjL3RyYWluLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBOzs7Ozs7Ozs7Ozs7Ozs7R0FlRztBQUVILDRCQUE0QjtBQUM1QixPQUFPLEVBQUMsaUJBQWlCLEVBQUMsTUFBTSxpQ0FBaUMsQ0FBQztBQUNsRSxPQUFPLEVBQUMsZ0JBQWdCLEVBQUMsTUFBTSxnQ0FBZ0MsQ0FBQztBQUNoRSxPQUFPLEVBQUMsYUFBYSxFQUFDLE1BQU0sNkJBQTZCLENBQUM7QUFDMUQsT0FBTyxFQUFDLGVBQWUsRUFBQyxNQUFNLCtCQUErQixDQUFDO0FBQzlELE9BQU8sRUFBQyxpQkFBaUIsRUFBQyxNQUFNLGlDQUFpQyxDQUFDO0FBQ2xFLE9BQU8sRUFBQyxxQkFBcUIsRUFBQyxNQUFNLHFDQUFxQyxDQUFDO0FBQzFFLE9BQU8sRUFBQyxnQkFBZ0IsRUFBQyxNQUFNLGdDQUFnQyxDQUFDO0FBQ2hFLE9BQU8sRUFBQyxZQUFZLEVBQUMsTUFBTSw0QkFBNEIsQ0FBQztBQUV4RCxnREFBZ0Q7QUFDaEQsQ0FBQyxpQkFBaUIsRUFBRSxZQUFZLEVBQUUsaUJBQWlCLEVBQUUsZ0JBQWdCO0lBQ3BFLGdCQUFnQixFQUFFLGVBQWUsRUFBRSxhQUFhLENBQUMsQ0FBQztBQUVuRCxNQUFNLENBQUMsTUFBTSxLQUFLLEdBQUc7SUFDbkIsR0FBRyxFQUFFLHFCQUFxQixDQUFDLEdBQUc7SUFDOUIsUUFBUSxFQUFFLHFCQUFxQixDQUFDLFFBQVE7SUFDeEMsUUFBUSxFQUFFLHFCQUFxQixDQUFDLFFBQVE7SUFDeEMsT0FBTyxFQUFFLHFCQUFxQixDQUFDLE9BQU87SUFDdEMsT0FBTyxFQUFFLHFCQUFxQixDQUFDLE9BQU87SUFDdEMsTUFBTSxFQUFFLHFCQUFxQixDQUFDLE1BQU07SUFDcEMsSUFBSSxFQUFFLHFCQUFxQixDQUFDLElBQUk7Q0FDakMsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbIi8qKlxuICogQGxpY2Vuc2VcbiAqIENvcHlyaWdodCAyMDE4IEdvb2dsZSBMTEMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuXG4gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgXCJMaWNlbnNlXCIpO1xuICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLlxuICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0XG4gKlxuICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wXG4gKlxuICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZVxuICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gXCJBUyBJU1wiIEJBU0lTLFxuICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuXG4gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kXG4gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS5cbiAqID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4gKi9cblxuLy8gU28gdHlwaW5ncyBjYW4gcHJvcGFnYXRlLlxuaW1wb3J0IHtBZGFkZWx0YU9wdGltaXplcn0gZnJvbSAnLi9vcHRpbWl6ZXJzL2FkYWRlbHRhX29wdGltaXplcic7XG5pbXBvcnQge0FkYWdyYWRPcHRpbWl6ZXJ9IGZyb20gJy4vb3B0aW1pemVycy9hZGFncmFkX29wdGltaXplcic7XG5pbXBvcnQge0FkYW1PcHRpbWl6ZXJ9IGZyb20gJy4vb3B0aW1pemVycy9hZGFtX29wdGltaXplcic7XG5pbXBvcnQge0FkYW1heE9wdGltaXplcn0gZnJvbSAnLi9vcHRpbWl6ZXJzL2FkYW1heF9vcHRpbWl6ZXInO1xuaW1wb3J0IHtNb21lbnR1bU9wdGltaXplcn0gZnJvbSAnLi9vcHRpbWl6ZXJzL21vbWVudHVtX29wdGltaXplcic7XG5pbXBvcnQge09wdGltaXplckNvbnN0cnVjdG9yc30gZnJvbSAnLi9vcHRpbWl6ZXJzL29wdGltaXplcl9jb25zdHJ1Y3RvcnMnO1xuaW1wb3J0IHtSTVNQcm9wT3B0aW1pemVyfSBmcm9tICcuL29wdGltaXplcnMvcm1zcHJvcF9vcHRpbWl6ZXInO1xuaW1wb3J0IHtTR0RPcHRpbWl6ZXJ9IGZyb20gJy4vb3B0aW1pemVycy9zZ2Rfb3B0aW1pemVyJztcblxuLy8gdHNsaW50OmRpc2FibGUtbmV4dC1saW5lOm5vLXVudXNlZC1leHByZXNzaW9uXG5bTW9tZW50dW1PcHRpbWl6ZXIsIFNHRE9wdGltaXplciwgQWRhZGVsdGFPcHRpbWl6ZXIsIEFkYWdyYWRPcHRpbWl6ZXIsXG4gUk1TUHJvcE9wdGltaXplciwgQWRhbWF4T3B0aW1pemVyLCBBZGFtT3B0aW1pemVyXTtcblxuZXhwb3J0IGNvbnN0IHRyYWluID0ge1xuICBzZ2Q6IE9wdGltaXplckNvbnN0cnVjdG9ycy5zZ2QsXG4gIG1vbWVudHVtOiBPcHRpbWl6ZXJDb25zdHJ1Y3RvcnMubW9tZW50dW0sXG4gIGFkYWRlbHRhOiBPcHRpbWl6ZXJDb25zdHJ1Y3RvcnMuYWRhZGVsdGEsXG4gIGFkYWdyYWQ6IE9wdGltaXplckNvbnN0cnVjdG9ycy5hZGFncmFkLFxuICBybXNwcm9wOiBPcHRpbWl6ZXJDb25zdHJ1Y3RvcnMucm1zcHJvcCxcbiAgYWRhbWF4OiBPcHRpbWl6ZXJDb25zdHJ1Y3RvcnMuYWRhbWF4LFxuICBhZGFtOiBPcHRpbWl6ZXJDb25zdHJ1Y3RvcnMuYWRhbVxufTtcbiJdfQ==","/**\n * @license\n * Copyright 2017 Google LLC. All Rights Reserved.\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n * =============================================================================\n */\nconst delayCallback = (() => {\n if (typeof requestAnimationFrame !== 'undefined') {\n return requestAnimationFrame;\n }\n else if (typeof setImmediate !== 'undefined') {\n return setImmediate;\n }\n return (f) => f(); // no delays\n})();\n/**\n * Returns a promise that resolves when a requestAnimationFrame has completed.\n *\n * On Node.js this uses setImmediate instead of requestAnimationFrame.\n *\n * This is simply a sugar method so that users can do the following:\n * `await tf.nextFrame();`\n *\n * @doc {heading: 'Performance', subheading: 'Timing'}\n */\nfunction nextFrame() {\n return new Promise(resolve => delayCallback(() => resolve()));\n}\nexport { nextFrame };\n//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYnJvd3Nlcl91dGlsLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vdGZqcy1jb3JlL3NyYy9icm93c2VyX3V0aWwudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUE7Ozs7Ozs7Ozs7Ozs7OztHQWVHO0FBRUgsTUFBTSxhQUFhLEdBQWEsQ0FBQyxHQUFHLEVBQUU7SUFDcEMsSUFBSSxPQUFPLHFCQUFxQixLQUFLLFdBQVcsRUFBRTtRQUNoRCxPQUFPLHFCQUFxQixDQUFDO0tBQzlCO1NBQU0sSUFBSSxPQUFPLFlBQVksS0FBSyxXQUFXLEVBQUU7UUFDOUMsT0FBTyxZQUFZLENBQUM7S0FDckI7SUFDRCxPQUFPLENBQUMsQ0FBVyxFQUFFLEVBQUUsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFFLFlBQVk7QUFDNUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQztBQUVMOzs7Ozs7Ozs7R0FTRztBQUNILFNBQVMsU0FBUztJQUNoQixPQUFPLElBQUksT0FBTyxDQUFPLE9BQU8sQ0FBQyxFQUFFLENBQUMsYUFBYSxDQUFDLEdBQUcsRUFBRSxDQUFDLE9BQU8sRUFBRSxDQUFDLENBQUMsQ0FBQztBQUN0RSxDQUFDO0FBRUQsT0FBTyxFQUFDLFNBQVMsRUFBQyxDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiLyoqXG4gKiBAbGljZW5zZVxuICogQ29weXJpZ2h0IDIwMTcgR29vZ2xlIExMQy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC5cbiAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSBcIkxpY2Vuc2VcIik7XG4gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuXG4gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXRcbiAqXG4gKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjBcbiAqXG4gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlXG4gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiBcIkFTIElTXCIgQkFTSVMsXG4gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC5cbiAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmRcbiAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLlxuICogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbiAqL1xuXG5jb25zdCBkZWxheUNhbGxiYWNrOiBGdW5jdGlvbiA9ICgoKSA9PiB7XG4gIGlmICh0eXBlb2YgcmVxdWVzdEFuaW1hdGlvbkZyYW1lICE9PSAndW5kZWZpbmVkJykge1xuICAgIHJldHVybiByZXF1ZXN0QW5pbWF0aW9uRnJhbWU7XG4gIH0gZWxzZSBpZiAodHlwZW9mIHNldEltbWVkaWF0ZSAhPT0gJ3VuZGVmaW5lZCcpIHtcbiAgICByZXR1cm4gc2V0SW1tZWRpYXRlO1xuICB9XG4gIHJldHVybiAoZjogRnVuY3Rpb24pID0+IGYoKTsgIC8vIG5vIGRlbGF5c1xufSkoKTtcblxuLyoqXG4gKiBSZXR1cm5zIGEgcHJvbWlzZSB0aGF0IHJlc29sdmVzIHdoZW4gYSByZXF1ZXN0QW5pbWF0aW9uRnJhbWUgaGFzIGNvbXBsZXRlZC5cbiAqXG4gKiBPbiBOb2RlLmpzIHRoaXMgdXNlcyBzZXRJbW1lZGlhdGUgaW5zdGVhZCBvZiByZXF1ZXN0QW5pbWF0aW9uRnJhbWUuXG4gKlxuICogVGhpcyBpcyBzaW1wbHkgYSBzdWdhciBtZXRob2Qgc28gdGhhdCB1c2VycyBjYW4gZG8gdGhlIGZvbGxvd2luZzpcbiAqIGBhd2FpdCB0Zi5uZXh0RnJhbWUoKTtgXG4gKlxuICogQGRvYyB7aGVhZGluZzogJ1BlcmZvcm1hbmNlJywgc3ViaGVhZGluZzogJ1RpbWluZyd9XG4gKi9cbmZ1bmN0aW9uIG5leHRGcmFtZSgpOiBQcm9taXNlPHZvaWQ+IHtcbiAgcmV0dXJuIG5ldyBQcm9taXNlPHZvaWQ+KHJlc29sdmUgPT4gZGVsYXlDYWxsYmFjaygoKSA9PiByZXNvbHZlKCkpKTtcbn1cblxuZXhwb3J0IHtuZXh0RnJhbWV9O1xuIl19","/**\n * @license\n * Copyright 2017 Google LLC. All Rights Reserved.\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n * =============================================================================\n */\nimport * as util from '../util';\nexport function assertParamsConsistent(shapes, axis) {\n const rank = shapes[0].length;\n shapes.forEach((shape, i) => {\n util.assert(shape.length === rank, () => `Error in concat${rank}D: rank of tensors[${i}] must be the same ` +\n `as the rank of the rest (${rank})`);\n });\n util.assert(axis >= 0 && axis < rank, () => `Error in concat${rank}D: axis must be between 0 and ${rank - 1}.`);\n const firstShape = shapes[0];\n shapes.forEach((shape, i) => {\n for (let r = 0; r < rank; r++) {\n util.assert((r === axis) || (shape[r] === firstShape[r]), () => `Error in concat${rank}D: Shape of tensors[${i}] (${shape}) ` +\n `does not match the shape of the rest (${firstShape}) ` +\n `along the non-concatenated axis ${i}.`);\n }\n });\n}\nexport function computeOutShape(shapes, axis) {\n const outputShape = shapes[0].slice();\n for (let i = 1; i < shapes.length; i++) {\n outputShape[axis] += shapes[i][axis];\n }\n return outputShape;\n}\n//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY29uY2F0X3V0aWwuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi8uLi90ZmpzLWNvcmUvc3JjL29wcy9jb25jYXRfdXRpbC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQTs7Ozs7Ozs7Ozs7Ozs7O0dBZUc7QUFFSCxPQUFPLEtBQUssSUFBSSxNQUFNLFNBQVMsQ0FBQztBQUVoQyxNQUFNLFVBQVUsc0JBQXNCLENBQUMsTUFBa0IsRUFBRSxJQUFZO0lBQ3JFLE1BQU0sSUFBSSxHQUFHLE1BQU0sQ0FBQyxDQUFDLENBQUMsQ0FBQyxNQUFNLENBQUM7SUFDOUIsTUFBTSxDQUFDLE9BQU8sQ0FBQyxDQUFDLEtBQUssRUFBRSxDQUFDLEVBQUUsRUFBRTtRQUMxQixJQUFJLENBQUMsTUFBTSxDQUNQLEtBQUssQ0FBQyxNQUFNLEtBQUssSUFBSSxFQUNyQixHQUFHLEVBQUUsQ0FDRCxrQkFBa0IsSUFBSSxzQkFBc0IsQ0FBQyxxQkFBcUI7WUFDbEUsNEJBQTRCLElBQUksR0FBRyxDQUFDLENBQUM7SUFDL0MsQ0FBQyxDQUFDLENBQUM7SUFFSCxJQUFJLENBQUMsTUFBTSxDQUNQLElBQUksSUFBSSxDQUFDLElBQUksSUFBSSxHQUFHLElBQUksRUFDeEIsR0FBRyxFQUFFLENBQUMsa0JBQWtCLElBQUksaUNBQWlDLElBQUksR0FBRyxDQUFDLEdBQUcsQ0FBQyxDQUFDO0lBRTlFLE1BQU0sVUFBVSxHQUFHLE1BQU0sQ0FBQyxDQUFDLENBQUMsQ0FBQztJQUM3QixNQUFNLENBQUMsT0FBTyxDQUFDLENBQUMsS0FBSyxFQUFFLENBQUMsRUFBRSxFQUFFO1FBQzFCLEtBQUssSUFBSSxDQUFDLEdBQUcsQ0FBQyxFQUFFLENBQUMsR0FBRyxJQUFJLEVBQUUsQ0FBQyxFQUFFLEVBQUU7WUFDN0IsSUFBSSxDQUFDLE1BQU0sQ0FDUCxDQUFDLENBQUMsS0FBSyxJQUFJLENBQUMsSUFBSSxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUMsS0FBSyxVQUFVLENBQUMsQ0FBQyxDQUFDLENBQUMsRUFDNUMsR0FBRyxFQUFFLENBQUMsa0JBQWtCLElBQUksdUJBQXVCLENBQUMsTUFBTSxLQUFLLElBQUk7Z0JBQy9ELHlDQUF5QyxVQUFVLElBQUk7Z0JBQ3ZELG1DQUFtQyxDQUFDLEdBQUcsQ0FBQyxDQUFDO1NBQ2xEO0lBQ0gsQ0FBQyxDQUFDLENBQUM7QUFDTCxDQUFDO0FBRUQsTUFBTSxVQUFVLGVBQWUsQ0FBQyxNQUFrQixFQUFFLElBQVk7SUFDOUQsTUFBTSxXQUFXLEdBQUcsTUFBTSxDQUFDLENBQUMsQ0FBQyxDQUFDLEtBQUssRUFBRSxDQUFDO0lBQ3RDLEtBQUssSUFBSSxDQUFDLEdBQUcsQ0FBQyxFQUFFLENBQUMsR0FBRyxNQUFNLENBQUMsTUFBTSxFQUFFLENBQUMsRUFBRSxFQUFFO1FBQ3RDLFdBQVcsQ0FBQyxJQUFJLENBQUMsSUFBSSxNQUFNLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUM7S0FDdEM7SUFDRCxPQUFPLFdBQVcsQ0FBQztBQUNyQixDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiLyoqXG4gKiBAbGljZW5zZVxuICogQ29weXJpZ2h0IDIwMTcgR29vZ2xlIExMQy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC5cbiAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSBcIkxpY2Vuc2VcIik7XG4gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuXG4gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXRcbiAqXG4gKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjBcbiAqXG4gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlXG4gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiBcIkFTIElTXCIgQkFTSVMsXG4gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC5cbiAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmRcbiAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLlxuICogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbiAqL1xuXG5pbXBvcnQgKiBhcyB1dGlsIGZyb20gJy4uL3V0aWwnO1xuXG5leHBvcnQgZnVuY3Rpb24gYXNzZXJ0UGFyYW1zQ29uc2lzdGVudChzaGFwZXM6IG51bWJlcltdW10sIGF4aXM6IG51bWJlcikge1xuICBjb25zdCByYW5rID0gc2hhcGVzWzBdLmxlbmd0aDtcbiAgc2hhcGVzLmZvckVhY2goKHNoYXBlLCBpKSA9PiB7XG4gICAgdXRpbC5hc3NlcnQoXG4gICAgICAgIHNoYXBlLmxlbmd0aCA9PT0gcmFuayxcbiAgICAgICAgKCkgPT5cbiAgICAgICAgICAgIGBFcnJvciBpbiBjb25jYXQke3Jhbmt9RDogcmFuayBvZiB0ZW5zb3JzWyR7aX1dIG11c3QgYmUgdGhlIHNhbWUgYCArXG4gICAgICAgICAgICBgYXMgdGhlIHJhbmsgb2YgdGhlIHJlc3QgKCR7cmFua30pYCk7XG4gIH0pO1xuXG4gIHV0aWwuYXNzZXJ0KFxuICAgICAgYXhpcyA+PSAwICYmIGF4aXMgPCByYW5rLFxuICAgICAgKCkgPT4gYEVycm9yIGluIGNvbmNhdCR7cmFua31EOiBheGlzIG11c3QgYmUgYmV0d2VlbiAwIGFuZCAke3JhbmsgLSAxfS5gKTtcblxuICBjb25zdCBmaXJzdFNoYXBlID0gc2hhcGVzWzBdO1xuICBzaGFwZXMuZm9yRWFjaCgoc2hhcGUsIGkpID0+IHtcbiAgICBmb3IgKGxldCByID0gMDsgciA8IHJhbms7IHIrKykge1xuICAgICAgdXRpbC5hc3NlcnQoXG4gICAgICAgICAgKHIgPT09IGF4aXMpIHx8IChzaGFwZVtyXSA9PT0gZmlyc3RTaGFwZVtyXSksXG4gICAgICAgICAgKCkgPT4gYEVycm9yIGluIGNvbmNhdCR7cmFua31EOiBTaGFwZSBvZiB0ZW5zb3JzWyR7aX1dICgke3NoYXBlfSkgYCArXG4gICAgICAgICAgICAgIGBkb2VzIG5vdCBtYXRjaCB0aGUgc2hhcGUgb2YgdGhlIHJlc3QgKCR7Zmlyc3RTaGFwZX0pIGAgK1xuICAgICAgICAgICAgICBgYWxvbmcgdGhlIG5vbi1jb25jYXRlbmF0ZWQgYXhpcyAke2l9LmApO1xuICAgIH1cbiAgfSk7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBjb21wdXRlT3V0U2hhcGUoc2hhcGVzOiBudW1iZXJbXVtdLCBheGlzOiBudW1iZXIpOiBudW1iZXJbXSB7XG4gIGNvbnN0IG91dHB1dFNoYXBlID0gc2hhcGVzWzBdLnNsaWNlKCk7XG4gIGZvciAobGV0IGkgPSAxOyBpIDwgc2hhcGVzLmxlbmd0aDsgaSsrKSB7XG4gICAgb3V0cHV0U2hhcGVbYXhpc10gKz0gc2hhcGVzW2ldW2F4aXNdO1xuICB9XG4gIHJldHVybiBvdXRwdXRTaGFwZTtcbn1cbiJdfQ==","/**\n * @license\n * Copyright 2022 Google LLC. All Rights Reserved.\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n * =============================================================================\n */\nexport var RowPartitionType;\n(function (RowPartitionType) {\n RowPartitionType[RowPartitionType[\"FIRST_DIM_SIZE\"] = 0] = \"FIRST_DIM_SIZE\";\n RowPartitionType[RowPartitionType[\"VALUE_ROWIDS\"] = 1] = \"VALUE_ROWIDS\";\n RowPartitionType[RowPartitionType[\"ROW_LENGTHS\"] = 2] = \"ROW_LENGTHS\";\n RowPartitionType[RowPartitionType[\"ROW_SPLITS\"] = 3] = \"ROW_SPLITS\";\n RowPartitionType[RowPartitionType[\"ROW_LIMITS\"] = 4] = \"ROW_LIMITS\";\n RowPartitionType[RowPartitionType[\"ROW_STARTS\"] = 5] = \"ROW_STARTS\";\n})(RowPartitionType || (RowPartitionType = {}));\nexport function combineRaggedTensorToTensorShapes(raggedRank, shape, valueShape) {\n // Test for consistency of valueShape and shape specified.\n // If shape is unspecified and valueShape is specified, then copy\n // over the size from the valueShape dimension.\n let outputShape = new Array();\n if (valueShape == null && shape == null) {\n return outputShape;\n }\n if (shape == null) {\n // Here, value_shape must be of known size.\n while (outputShape.length < raggedRank + valueShape.length) {\n outputShape.push(-1);\n }\n }\n else {\n outputShape = shape.slice();\n }\n if (valueShape == null) {\n return outputShape;\n }\n // At this point, valueShape and output_shape have known ranks.\n if (raggedRank + valueShape.length !== outputShape.length) {\n throw new Error(`rt input.shape and shape=${shape} are incompatible: rt input.rank = ${raggedRank +\n valueShape.length}, but shape.rank = ${outputShape.length}`);\n }\n for (let i = 1; i < valueShape.length; ++i) {\n const valueDim = valueShape[i];\n const outputShapeDimIndex = outputShape[outputShape.length - valueShape.length + i];\n const outputShapeDim = outputShape[outputShapeDimIndex];\n if (valueDim >= 0) {\n if (outputShapeDim >= 0) {\n if (outputShapeDim !== valueDim) {\n throw new Error(`rt input.shape and shape=${shape} are incompatible: rt input.shape[${i + raggedRank}] = ${valueDim} but shape[${i + raggedRank}] = ${outputShapeDim}`);\n }\n }\n else {\n outputShape[outputShapeDimIndex] = valueDim;\n }\n }\n }\n return outputShape;\n}\nexport function getRowPartitionTypesHelper(rowPartitionTypeStrings) {\n const stringToType = {\n 'FIRST_DIM_SIZE': RowPartitionType.FIRST_DIM_SIZE,\n 'VALUE_ROWIDS': RowPartitionType.VALUE_ROWIDS,\n 'ROW_LENGTHS': RowPartitionType.ROW_LENGTHS,\n 'ROW_SPLITS': RowPartitionType.ROW_SPLITS,\n 'ROW_LIMITS': RowPartitionType.ROW_LIMITS,\n 'ROW_STARTS': RowPartitionType.ROW_STARTS\n };\n const result = [];\n for (const typeStr of rowPartitionTypeStrings) {\n if (typeStr in stringToType) {\n result.push(stringToType[typeStr]);\n }\n else {\n break;\n }\n }\n return result;\n}\nexport function getRaggedRank(rowPartitionTypes) {\n if (rowPartitionTypes.length === 0) {\n return 0;\n }\n if (rowPartitionTypes[0] === RowPartitionType.FIRST_DIM_SIZE) {\n return rowPartitionTypes.length - 1;\n }\n return rowPartitionTypes.length;\n}\nexport function validateDefaultValueShape(defaultValueShape, valueShape) {\n if (defaultValueShape == null || valueShape == null) {\n return;\n }\n const defaultNDims = defaultValueShape.length;\n const valuesNDims = valueShape.length;\n if (defaultNDims >= valuesNDims) {\n throw new Error(`defaultValue.shape=${defaultValueShape} and ragged tensor flatValues.shape=${valueShape}, are incompatible: defaultValue.rank = ${defaultNDims} must be less than ragged tensor input flatValues.rank = ${valuesNDims})`);\n }\n for (let i = 0; i < Math.min(defaultNDims, valuesNDims - 1); ++i) {\n const defaultDim = defaultValueShape[i];\n const valueDim = valueShape[i + 1];\n if (defaultDim >= 0 && valueDim >= 0 && defaultDim !== 1 &&\n defaultDim !== valueDim) {\n throw new Error(`defaultValue.shape=${defaultValueShape}, and ragged tensor input flatValues.shape=${valueShape} are incompatible: defaultValue.shape[${i - defaultValueShape.length}] = ${defaultDim} but ragged tensor input.flatValues.shape[${i - defaultValueShape.length}] = ${valueDim}`);\n }\n }\n}\n//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicmFnZ2VkX3RvX2RlbnNlX3V0aWwuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi8uLi90ZmpzLWNvcmUvc3JjL29wcy9yYWdnZWRfdG9fZGVuc2VfdXRpbC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQTs7Ozs7Ozs7Ozs7Ozs7O0dBZUc7QUFFSCxNQUFNLENBQU4sSUFBWSxnQkFPWDtBQVBELFdBQVksZ0JBQWdCO0lBQzFCLDJFQUFjLENBQUE7SUFDZCx1RUFBWSxDQUFBO0lBQ1oscUVBQVcsQ0FBQTtJQUNYLG1FQUFVLENBQUE7SUFDVixtRUFBVSxDQUFBO0lBQ1YsbUVBQVUsQ0FBQTtBQUNaLENBQUMsRUFQVyxnQkFBZ0IsS0FBaEIsZ0JBQWdCLFFBTzNCO0FBRUQsTUFBTSxVQUFVLGlDQUFpQyxDQUM3QyxVQUFrQixFQUFFLEtBQWUsRUFBRSxVQUFvQjtJQUMzRCwwREFBMEQ7SUFDMUQsaUVBQWlFO0lBQ2pFLCtDQUErQztJQUUvQyxJQUFJLFdBQVcsR0FBYSxJQUFJLEtBQUssRUFBRSxDQUFDO0lBQ3hDLElBQUksVUFBVSxJQUFJLElBQUksSUFBSSxLQUFLLElBQUksSUFBSSxFQUFFO1FBQ3ZDLE9BQU8sV0FBVyxDQUFDO0tBQ3BCO0lBRUQsSUFBSSxLQUFLLElBQUksSUFBSSxFQUFFO1FBQ2pCLDJDQUEyQztRQUMzQyxPQUFPLFdBQVcsQ0FBQyxNQUFNLEdBQUcsVUFBVSxHQUFHLFVBQVUsQ0FBQyxNQUFNLEVBQUU7WUFDMUQsV0FBVyxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDO1NBQ3RCO0tBQ0Y7U0FBTTtRQUNMLFdBQVcsR0FBRyxLQUFLLENBQUMsS0FBSyxFQUFFLENBQUM7S0FDN0I7SUFDRCxJQUFJLFVBQVUsSUFBSSxJQUFJLEVBQUU7UUFDdEIsT0FBTyxXQUFXLENBQUM7S0FDcEI7SUFDRCwrREFBK0Q7SUFDL0QsSUFBSSxVQUFVLEdBQUcsVUFBVSxDQUFDLE1BQU0sS0FBSyxX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QUMsRUFBRSxDQUFDLEdBQUcsSUFBSSxDQUFDLEdBQUcsQ0FBQyxZQUFZLEVBQUUsV0FBVyxHQUFHLENBQUMsQ0FBQyxFQUFFLEVBQUUsQ0FBQyxFQUFFO1FBQ2hFLE1BQU0sVUFBVSxHQUFHLGlCQUFpQixDQUFDLENBQUMsQ0FBQyxDQUFDO1FBQ3hDLE1BQU0sUUFBUSxHQUFHLFVBQVUsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUM7UUFDbkMsSUFBSSxVQUFVLElBQUksQ0FBQyxJQUFJLFFBQVEsSUFBSSxDQUFDLElBQUksVUFBVSxLQUFLLENBQUM7WUFDcEQsVUFBVSxLQUFLLFFBQVEsRUFBRTtZQUMzQixNQUFNLElBQUksS0FBSyxDQUFDLHNCQUNaLGlCQUFpQiw4Q0FDakIsVUFBVSx5Q0FDVixDQUFDLEdBQUcsaUJBQWlCLENBQUMsTUFBTSxPQUM1QixVQUFVLDZDQUNWLENBQUMsR0FBRyxpQkFBaUIsQ0FBQyxNQUFNLE9BQU8sUUFBUSxFQUFFLENBQUMsQ0FBQztTQUNwRDtLQUNGO0FBQ0gsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbIi8qKlxuICogQGxpY2Vuc2VcbiAqIENvcHlyaWdodCAyMDIyIEdvb2dsZSBMTEMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuXG4gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgXCJMaWNlbnNlXCIpO1xuICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLlxuICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0XG4gKlxuICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wXG4gKlxuICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZVxuICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gXCJBUyBJU1wiIEJBU0lTLFxuICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuXG4gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kXG4gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS5cbiAqID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4gKi9cblxuZXhwb3J0IGVudW0gUm93UGFydGl0aW9uVHlwZSB7XG4gIEZJUlNUX0RJTV9TSVpFLFxuICBWQUxVRV9ST1dJRFMsXG4gIFJPV19MRU5HVEhTLFxuICBST1dfU1BMSVRTLFxuICBST1dfTElNSVRTLFxuICBST1dfU1RBUlRTXG59XG5cbmV4cG9ydCBmdW5jdGlvbiBjb21iaW5lUmFnZ2VkVGVuc29yVG9UZW5zb3JTaGFwZXMoXG4gICAgcmFnZ2VkUmFuazogbnVtYmVyLCBzaGFwZTogbnVtYmVyW10sIHZhbHVlU2hhcGU6IG51bWJlcltdKSB7XG4gIC8vIFRlc3QgZm9yIGNvbnNpc3RlbmN5IG9mIHZhbHVlU2hhcGUgYW5kIHNoYXBlIHNwZWNpZmllZC5cbiAgLy8gSWYgc2hhcGUgaXMgdW5zcGVjaWZpZWQgYW5kIHZhbHVlU2hhcGUgaXMgc3BlY2lmaWVkLCB0aGVuIGNvcHlcbiAgLy8gb3ZlciB0aGUgc2l6ZSBmcm9tIHRoZSB2YWx1ZVNoYXBlIGRpbWVuc2lvbi5cblxuICBsZXQgb3V0cHV0U2hhcGU6IG51bWJlcltdID0gbmV3IEFycmF5KCk7XG4gIGlmICh2YWx1ZVNoYXBlID09IG51bGwgJiYgc2hhcGUgPT0gbnVsbCkge1xuICAgIHJldHVybiBvdXRwdXRTaGFwZTtcbiAgfVxuXG4gIGlmIChzaGFwZSA9PSBudWxsKSB7XG4gICAgLy8gSGVyZSwgdmFsdWVfc2hhcGUgbXVzdCBiZSBvZiBrbm93biBzaXplLlxuICAgIHdoaWxlIChvdXRwdXRTaGFwZS5sZW5ndGggPCByYWdnZWRSYW5rICsgdmFsdWVTaGFwZS5sZW5ndGgpIHtcbiAgICAgIG91dHB1dFNoYXBlLnB1c2goLTEpO1xuICAgIH1cbiAgfSBlbHNlIHtcbiAgICBvdXRwdXRTaGFwZSA9IHNoYXBlLnNsaWNlKCk7XG4gIH1cbiAgaWYgKHZhbHVlU2hhcGUgPT0gbnVsbCkge1xuICAgIHJldHVybiBvdXRwdXRTaGFwZTtcbiAgfVxuICAvLyBBdCB0aGlzIHBvaW50LCB2YWx1ZVNoYXBlIGFuZCBvdXRwdXRfc2hhcGUgaGF2ZSBrbm93biByYW5rcy5cbiAgaWYgKHJhZ2dlZFJhbmsgKyB2YWx1ZVNoYXBlLmxlbmd0aCAhPT0gb3V0cHV0U2hhcGUubGVuZ3RoKSB7XG4gICAgdGhyb3cgbmV3IEVycm9yKFxuICAgICAgICBgcnQgaW5wdXQuc2hhcGUgYW5kIHNoYXBlPSR7c2hhcGV9IGFyZSBpbmNvbXBhdGlibGU6IHJ0IGlucHV0LnJhbmsgPSAke1xuICAgICAgICAgICAgcmFnZ2VkUmFuayArXG4gICAgICAgICAgICB2YWx1ZVNoYXBlLmxlbmd0aH0sIGJ1dCBzaGFwZS5yYW5rID0gJHtvdXRwdXRTaGFwZS5sZW5ndGh9YCk7XG4gIH1cblxuICBmb3IgKGxldCBpID0gMTsgaSA8IHZhbHVlU2hhcGUubGVuZ3RoOyArK2kpIHtcbiAgICBjb25zdCB2YWx1ZURpbSA9IHZhbHVlU2hhcGVbaV07XG4gICAgY29uc3Qgb3V0cHV0U2hhcGVEaW1JbmRleCA9XG4gICAgICAgIG91dHB1dFNoYXBlW291dHB1dFNoYXBlLmxlbmd0aCAtIHZhbHVlU2hhcGUubGVuZ3RoICsgaV07XG4gICAgY29uc3Qgb3V0cHV0U2hhcGVEaW0gPSBvdXRwdXRTaGFwZVtvdXRwdXRTaGFwZURpbUluZGV4XTtcblxuICAgIGlmICh2YWx1ZURpbSA+PSAwKSB7XG4gICAgICBpZiAob3V0cHV0U2hhcGVEaW0gPj0gMCkge1xuICAgICAgICBpZiAob3V0cHV0U2hhcGVEaW0gIT09IHZhbHVlRGltKSB7XG4gICAgICAgICAgdGhyb3cgbmV3IEVycm9yKGBydCBpbnB1dC5zaGFwZSBhbmQgc2hhcGU9JHtcbiAgICAgICAgICAgICAgc2hhcGV9IGFyZSBpbmNvbXBhdGlibGU6IHJ0IGlucHV0LnNoYXBlWyR7aSArIHJhZ2dlZFJhbmt9XSA9ICR7XG4gICAgICAgICAgICAgIHZhbHVlRGltfSBidXQgc2hhcGVbJHtpICsgcmFnZ2VkUmFua31dID0gJHtvdXRwdXRTaGFwZURpbX1gKTtcbiAgICAgICAgfVxuICAgICAgfSBlbHNlIHtcbiAgICAgICAgb3V0cHV0U2hhcGVbb3V0cHV0U2hhcGVEaW1JbmRleF0gPSB2YWx1ZURpbTtcbiAgICAgIH1cbiAgICB9XG4gIH1cbiAgcmV0dXJuIG91dHB1dFNoYXBlO1xufVxuXG5leHBvcnQgZnVuY3Rpb24gZ2V0Um93UGFydGl0aW9uVHlwZXNIZWxwZXIocm93UGFydGl0aW9uVHlwZVN0cmluZ3M6IHN0cmluZ1tdKSB7XG4gIGNvbnN0IHN0cmluZ1RvVHlwZSA9IHtcbiAgICAnRklSU1RfRElNX1NJWkUnOiBSb3dQYXJ0aXRpb25UeXBlLkZJUlNUX0RJTV9TSVpFLFxuICAgICdWQUxVRV9ST1dJRFMnOiBSb3dQYXJ0aXRpb25UeXBlLlZBTFVFX1JPV0lEUyxcbiAgICAnUk9XX0xFTkdUSFMnOiBSb3dQYXJ0aXRpb25UeXBlLlJPV19MRU5HVEhTLFxuICAgICdST1dfU1BMSVRTJzogUm93UGFydGl0aW9uVHlwZS5ST1dfU1BMSVRTLFxuICAgICdST1dfTElNSVRTJzogUm93UGFydGl0aW9uVHlwZS5ST1dfTElNSVRTLFxuICAgICdST1dfU1RBUlRTJzogUm93UGFydGl0aW9uVHlwZS5ST1dfU1RBUlRTXG4gIH07XG5cbiAgY29uc3QgcmVzdWx0OiBSb3dQYXJ0aXRpb25UeXBlW10gPSBbXTtcbiAgZm9yIChjb25zdCB0eXBlU3RyIG9mIHJvd1BhcnRpdGlvblR5cGVTdHJpbmdzKSB7XG4gICAgaWYgKHR5cGVTdHIgaW4gc3RyaW5nVG9UeXBlKSB7XG4gICAgICByZXN1bHQucHVzaChzdHJpbmdUb1R5cGVbdHlwZVN0ciBhcyBrZXlvZiB0eXBlb2Ygc3RyaW5nVG9UeXBlXSk7XG4gICAgfSBlbHNlIHtcbiAgICAgIGJyZWFrO1xuICAgIH1cbiAgfVxuXG4gIHJldHVybiByZXN1bHQ7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBnZXRSYWdnZWRSYW5rKHJvd1BhcnRpdGlvblR5cGVzOiBSb3dQYXJ0aXRpb25UeXBlW10pIHtcbiAgaWYgKHJvd1BhcnRpdGlvblR5cGVzLmxlbmd0aCA9PT0gMCkge1xuICAgIHJldHVybiAwO1xuICB9XG4gIGlmIChyb3dQYXJ0aXRpb25UeXBlc1swXSA9PT0gUm93UGFydGl0aW9uVHlwZS5GSVJTVF9ESU1fU0laRSkge1xuICAgIHJldHVybiByb3dQYXJ0aXRpb25UeXBlcy5sZW5ndGggLSAxO1xuICB9XG4gIHJldHVybiByb3dQYXJ0aXRpb25UeXBlcy5sZW5ndGg7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiB2YWxpZGF0ZURlZmF1bHRWYWx1ZVNoYXBlKFxuICAgIGRlZmF1bHRWYWx1ZVNoYXBlOiBudW1iZXJbXSwgdmFsdWVTaGFwZTogbnVtYmVyW10pIHtcbiAgaWYgKGRlZmF1bHRWYWx1ZVNoYXBlID09IG51bGwgfHwgdmFsdWVTaGFwZSA9PSBudWxsKSB7XG4gICAgcmV0dXJuO1xuICB9XG5cbiAgY29uc3QgZGVmYXVsdE5EaW1zID0gZGVmYXVsdFZhbHVlU2hhcGUubGVuZ3RoO1xuICBjb25zdCB2YWx1ZXNORGltcyA9IHZhbHVlU2hhcGUubGVuZ3RoO1xuICBpZiAoZGVmYXVsdE5EaW1zID49IHZhbHVlc05EaW1zKSB7XG4gICAgdGhyb3cgbmV3IEVycm9yKGBkZWZhdWx0VmFsdWUuc2hhcGU9JHtcbiAgICAgICAgZGVmYXVsdFZhbHVlU2hhcGV9IGFuZCByYWdnZWQgdGVuc29yIGZsYXRWYWx1ZXMuc2hhcGU9JHtcbiAgICAgICAgdmFsdWVTaGFwZX0sIGFyZSBpbmNvbXBhdGlibGU6IGRlZmF1bHRWYWx1ZS5yYW5rID0gJHtcbiAgICAgICAgZGVmYXVsdE5EaW1zfSBtdXN0IGJlIGxlc3MgdGhhbiByYWdnZWQgdGVuc29yIGlucHV0IGZsYXRWYWx1ZXMucmFuayA9ICR7XG4gICAgICAgIHZhbHVlc05EaW1zfSlgKTtcbiAgfVxuICBmb3IgKGxldCBpID0gMDsgaSA8IE1hdGgubWluKGRlZmF1bHRORGltcywgdmFsdWVzTkRpbXMgLSAxKTsgKytpKSB7XG4gICAgY29uc3QgZGVmYXVsdERpbSA9IGRlZmF1bHRWYWx1ZVNoYXBlW2ldO1xuICAgIGNvbnN0IHZhbHVlRGltID0gdmFsdWVTaGFwZVtpICsgMV07XG4gICAgaWYgKGRlZmF1bHREaW0gPj0gMCAmJiB2YWx1ZURpbSA+PSAwICYmIGRlZmF1bHREaW0gIT09IDEgJiZcbiAgICAgICAgZGVmYXVsdERpbSAhPT0gdmFsdWVEaW0pIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcihgZGVmYXVsdFZhbHVlLnNoYXBlPSR7XG4gICAgICAgICAgZGVmYXVsdFZhbHVlU2hhcGV9LCBhbmQgcmFnZ2VkIHRlbnNvciBpbnB1dCBmbGF0VmFsdWVzLnNoYXBlPSR7XG4gICAgICAgICAgdmFsdWVTaGFwZX0gYXJlIGluY29tcGF0aWJsZTogZGVmYXVsdFZhbHVlLnNoYXBlWyR7XG4gICAgICAgICAgaSAtIGRlZmF1bHRWYWx1ZVNoYXBlLmxlbmd0aH1dID0gJHtcbiAgICAgICAgICBkZWZhdWx0RGltfSBidXQgcmFnZ2VkIHRlbnNvciBpbnB1dC5mbGF0VmFsdWVzLnNoYXBlWyR7XG4gICAgICAgICAgaSAtIGRlZmF1bHRWYWx1ZVNoYXBlLmxlbmd0aH1dID0gJHt2YWx1ZURpbX1gKTtcbiAgICB9XG4gIH1cbn1cbiJdfQ==","/**\n * @license\n * Copyright 2017 Google LLC. All Rights Reserved.\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n * =============================================================================\n */\n/**\n * Inputs of size above this threshold will be parallelized by calling multiple\n * shader programs.\n */\nimport { nearestDivisor } from '../util';\nexport const PARALLELIZE_THRESHOLD = 30;\nexport function computeOptimalWindowSize(inSize) {\n if (inSize <= PARALLELIZE_THRESHOLD) {\n return inSize;\n }\n return nearestDivisor(inSize, Math.floor(Math.sqrt(inSize)));\n}\n//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicmVkdWNlX3V0aWwuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi8uLi90ZmpzLWNvcmUvc3JjL29wcy9yZWR1Y2VfdXRpbC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQTs7Ozs7Ozs7Ozs7Ozs7O0dBZUc7QUFFSDs7O0dBR0c7QUFDSCxPQUFPLEVBQUMsY0FBYyxFQUFDLE1BQU0sU0FBUyxDQUFDO0FBRXZDLE1BQU0sQ0FBQyxNQUFNLHFCQUFxQixHQUFHLEVBQUUsQ0FBQztBQVN4QyxNQUFNLFVBQVUsd0JBQXdCLENBQUMsTUFBYztJQUNyRCxJQUFJLE1BQU0sSUFBSSxxQkFBcUIsRUFBRTtRQUNuQyxPQUFPLE1BQU0sQ0FBQztLQUNmO0lBQ0QsT0FBTyxjQUFjLENBQUMsTUFBTSxFQUFFLElBQUksQ0FBQyxLQUFLLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxNQUFNLENBQUMsQ0FBQyxDQUFDLENBQUM7QUFDL0QsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbIi8qKlxuICogQGxpY2Vuc2VcbiAqIENvcHlyaWdodCAyMDE3IEdvb2dsZSBMTEMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuXG4gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgXCJMaWNlbnNlXCIpO1xuICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLlxuICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0XG4gKlxuICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wXG4gKlxuICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZVxuICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gXCJBUyBJU1wiIEJBU0lTLFxuICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuXG4gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kXG4gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS5cbiAqID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4gKi9cblxuLyoqXG4gKiBJbnB1dHMgb2Ygc2l6ZSBhYm92ZSB0aGlzIHRocmVzaG9sZCB3aWxsIGJlIHBhcmFsbGVsaXplZCBieSBjYWxsaW5nIG11bHRpcGxlXG4gKiBzaGFkZXIgcHJvZ3JhbXMuXG4gKi9cbmltcG9ydCB7bmVhcmVzdERpdmlzb3J9IGZyb20gJy4uL3V0aWwnO1xuXG5leHBvcnQgY29uc3QgUEFSQUxMRUxJWkVfVEhSRVNIT0xEID0gMzA7XG5cbmV4cG9ydCBpbnRlcmZhY2UgUmVkdWNlSW5mbyB7XG4gIHdpbmRvd1NpemU6IG51bWJlcjtcbiAgYmF0Y2hTaXplOiBudW1iZXI7XG4gIGluU2l6ZTogbnVtYmVyO1xuICBvdXRTaXplOiBudW1iZXI7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBjb21wdXRlT3B0aW1hbFdpbmRvd1NpemUoaW5TaXplOiBudW1iZXIpOiBudW1iZXIge1xuICBpZiAoaW5TaXplIDw9IFBBUkFMTEVMSVpFX1RIUkVTSE9MRCkge1xuICAgIHJldHVybiBpblNpemU7XG4gIH1cbiAgcmV0dXJuIG5lYXJlc3REaXZpc29yKGluU2l6ZSwgTWF0aC5mbG9vcihNYXRoLnNxcnQoaW5TaXplKSkpO1xufVxuIl19","/**\n * @license\n * Copyright 2020 Google LLC. All Rights Reserved.\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n * =============================================================================\n */\n// Returns the image center in pixels.\nexport function getImageCenter(center, imageHeight, imageWidth) {\n const centerX = imageWidth * (typeof center === 'number' ? center : center[0]);\n const centerY = imageHeight * (typeof center === 'number' ? center : center[1]);\n return [centerX, centerY];\n}\n//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicm90YXRlX3V0aWwuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi8uLi90ZmpzLWNvcmUvc3JjL29wcy9yb3RhdGVfdXRpbC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQTs7Ozs7Ozs7Ozs7Ozs7O0dBZUc7QUFFSCxzQ0FBc0M7QUFDdEMsTUFBTSxVQUFVLGNBQWMsQ0FDMUIsTUFBK0IsRUFBRSxXQUFtQixFQUNwRCxVQUFrQjtJQUNwQixNQUFNLE9BQU8sR0FDVCxVQUFVLEdBQUcsQ0FBQyxPQUFPLE1BQU0sS0FBSyxRQUFRLENBQUMsQ0FBQyxDQUFDLE1BQU0sQ0FBQyxDQUFDLENBQUMsTUFBTSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUM7SUFDbkUsTUFBTSxPQUFPLEdBQ1QsV0FBVyxHQUFHLENBQUMsT0FBTyxNQUFNLEtBQUssUUFBUSxDQUFDLENBQUMsQ0FBQyxNQUFNLENBQUMsQ0FBQyxDQUFDLE1BQU0sQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDO0lBQ3BFLE9BQU8sQ0FBQyxPQUFPLEVBQUUsT0FBTyxDQUFDLENBQUM7QUFDNUIsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbIi8qKlxuICogQGxpY2Vuc2VcbiAqIENvcHlyaWdodCAyMDIwIEdvb2dsZSBMTEMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuXG4gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgXCJMaWNlbnNlXCIpO1xuICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLlxuICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0XG4gKlxuICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wXG4gKlxuICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZVxuICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gXCJBUyBJU1wiIEJBU0lTLFxuICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuXG4gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kXG4gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS5cbiAqID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4gKi9cblxuLy8gUmV0dXJucyB0aGUgaW1hZ2UgY2VudGVyIGluIHBpeGVscy5cbmV4cG9ydCBmdW5jdGlvbiBnZXRJbWFnZUNlbnRlcihcbiAgICBjZW50ZXI6IG51bWJlcnxbbnVtYmVyLCBudW1iZXJdLCBpbWFnZUhlaWdodDogbnVtYmVyLFxuICAgIGltYWdlV2lkdGg6IG51bWJlcik6IFtudW1iZXIsIG51bWJlcl0ge1xuICBjb25zdCBjZW50ZXJYID1cbiAgICAgIGltYWdlV2lkdGggKiAodHlwZW9mIGNlbnRlciA9PT0gJ251bWJlcicgPyBjZW50ZXIgOiBjZW50ZXJbMF0pO1xuICBjb25zdCBjZW50ZXJZID1cbiAgICAgIGltYWdlSGVpZ2h0ICogKHR5cGVvZiBjZW50ZXIgPT09ICdudW1iZXInID8gY2VudGVyIDogY2VudGVyWzFdKTtcbiAgcmV0dXJuIFtjZW50ZXJYLCBjZW50ZXJZXTtcbn1cbiJdfQ==","/**\n * @license\n * Copyright 2018 Google LLC. All Rights Reserved.\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n * =============================================================================\n */\n/**\n * Gets the new shape of the input Tensor after it's been reshaped\n * to:\n * [blockShape[0], ..., blockShape[M-1], batch / prod(blockShape),\n * inputShape[1], ..., inputShape[N-1]]\n *\n * See step 1: https://www.tensorflow.org/api_docs/python/tf/batch_to_space_nd\n */\nexport function getReshaped(inputShape, blockShape, prod, batchToSpace = true) {\n let reshaped = [];\n if (batchToSpace) {\n reshaped = reshaped.concat(blockShape.slice(0));\n reshaped.push(inputShape[0] / prod);\n reshaped = reshaped.concat(inputShape.slice(1));\n }\n else {\n reshaped = reshaped.concat(inputShape[0]);\n const spatialLength = blockShape.length;\n for (let i = 0; i < spatialLength; ++i) {\n reshaped =\n reshaped.concat([inputShape[i + 1] / blockShape[i], blockShape[i]]);\n }\n reshaped = reshaped.concat(inputShape.slice(spatialLength + 1));\n }\n return reshaped;\n}\n/**\n * Gets the permutation that will transpose the dimensions of the\n * reshaped tensor to shape:\n *\n * [batch / prod(block_shape),inputShape[1], blockShape[0], ...,\n * inputShape[M], blockShape[M-1],inputShape[M+1], ..., inputShape[N-1]]\n *\n * see step 2: https://www.tensorflow.org/api_docs/python/tf/batch_to_space_nd\n */\nexport function getPermuted(reshapedRank, blockShapeRank, batchToSpace = true) {\n const permuted = [];\n if (batchToSpace) {\n permuted.push(blockShapeRank);\n for (let i = blockShapeRank + 1; i < reshapedRank; ++i) {\n if (i <= 2 * blockShapeRank) {\n permuted.push(i);\n permuted.push(i - (blockShapeRank + 1));\n }\n else {\n permuted.push(i);\n }\n }\n }\n else {\n const permutedBeforeBatch = [];\n const permutedAfterBatch = [];\n for (let i = 1; i < reshapedRank; ++i) {\n if (i >= blockShapeRank * 2 + 1 || i % 2 === 1) {\n permutedAfterBatch.push(i);\n }\n else {\n permutedBeforeBatch.push(i);\n }\n }\n permuted.push(...permutedBeforeBatch);\n permuted.push(0);\n permuted.push(...permutedAfterBatch);\n }\n return permuted;\n}\n/**\n * Gets the shape of the reshaped and permuted input Tensor before any cropping\n * is applied. The new shape will be:\n *\n * [batch / prod(blockShape),inputShape[1] * blockShape[0], ...,\n * inputShape[M] * blockShape[M-1],inputShape[M+1], ..., inputShape[N-1]]\n *\n * See step 3: https://www.tensorflow.org/api_docs/python/tf/batch_to_space_nd\n */\nexport function getReshapedPermuted(inputShape, blockShape, prod, batchToSpace = true) {\n const reshapedPermuted = [];\n if (batchToSpace) {\n reshapedPermuted.push(inputShape[0] / prod);\n }\n else {\n reshapedPermuted.push(inputShape[0] * prod);\n }\n for (let i = 1; i < inputShape.length; ++i) {\n if (i <= blockShape.length) {\n if (batchToSpace) {\n reshapedPermuted.push(blockShape[i - 1] * inputShape[i]);\n }\n else {\n reshapedPermuted.push(inputShape[i] / blockShape[i - 1]);\n }\n }\n else {\n reshapedPermuted.push(inputShape[i]);\n }\n }\n return reshapedPermuted;\n}\n/**\n * Converts the crops argument into the beginning coordinates of a slice\n * operation.\n */\nexport function getSliceBeginCoords(crops, blockShape) {\n const sliceBeginCoords = [0];\n for (let i = 0; i < blockShape; ++i) {\n sliceBeginCoords.push(crops[i][0]);\n }\n return sliceBeginCoords;\n}\n/**\n * Converts the crops argument into the size of a slice operation. When\n * combined with getSliceBeginCoords this function allows the reshaped and\n * permuted Tensor to be cropped to its final output shape of:\n *\n * inputShape[1] * blockShape[0] - crops[0,0] - crops[0,1], ...,\n * inputShape[M] * blockShape[M-1] -crops[M-1,0] -\n * crops[M-1,1],inputShape[M+1], ..., inputShape[N-1]]\n *\n * See step 4: https://www.tensorflow.org/api_docs/python/tf/batch_to_space_nd\n */\nexport function getSliceSize(uncroppedShape, crops, blockShape) {\n const sliceSize = uncroppedShape.slice(0, 1);\n for (let i = 0; i < blockShape; ++i) {\n sliceSize.push(uncroppedShape[i + 1] - crops[i][0] - crops[i][1]);\n }\n return sliceSize;\n}\n//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYXJyYXlfb3BzX3V0aWwuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi8uLi90ZmpzLWNvcmUvc3JjL29wcy9hcnJheV9vcHNfdXRpbC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQTs7Ozs7Ozs7Ozs7Ozs7O0dBZUc7QUFFSDs7Ozs7OztHQU9HO0FBQ0gsTUFBTSxVQUFVLFdBQVcsQ0FDdkIsVUFBb0IsRUFBRSxVQUFvQixFQUFFLElBQVksRUFDeEQsWUFBWSxHQUFHLElBQUk7SUFDckIsSUFBSSxRQUFRLEdBQWEsRUFBRSxDQUFDO0lBQzVCLElBQUksWUFBWSxFQUFFO1FBQ2hCLFFBQVEsR0FBRyxRQUFRLENBQUMsTUFBTSxDQUFDLFVBQVUsQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQztRQUNoRCxRQUFRLENBQUMsSUFBSSxDQUFDLFVBQVUsQ0FBQyxDQUFDLENBQUMsR0FBRyxJQUFJLENBQUMsQ0FBQztRQUNwQyxRQUFRLEdBQUcsUUFBUSxDQUFDLE1BQU0sQ0FBQyxVQUFVLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUM7S0FDakQ7U0FBTTtRQUNMLFFBQVEsR0FBRyxRQUFRLENBQUMsTUFBTSxDQUFDLFVBQVUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDO1FBQzFDLE1BQU0sYUFBYSxHQUFHLFVBQVUsQ0FBQyxNQUFNLENBQUM7UUFDeEMsS0FBSyxJQUFJLENBQUMsR0FBRyxDQUFDLEVBQUUsQ0FBQyxHQUFHLGFBQWEsRUFBRSxFQUFFLENBQUMsRUFBRTtZQUN0QyxRQUFRO2dCQUNKLFFBQVEsQ0FBQyxNQUFNLENBQUMsQ0FBQyxVQUFVLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxHQUFHLFVBQVUsQ0FBQyxDQUFDLENBQUMsRUFBRSxVQUFVLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDO1NBQ3pFO1FBQ0QsUUFBUSxHQUFHLFFBQVEsQ0FBQyxNQUFNLENBQUMsVUFB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TyxnQkFBZ0IsQ0FBQztBQUMxQixDQUFDO0FBRUQ7OztHQUdHO0FBQ0gsTUFBTSxVQUFVLG1CQUFtQixDQUMvQixLQUFpQixFQUFFLFVBQWtCO0lBQ3ZDLE1BQU0sZ0JBQWdCLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQztJQUM3QixLQUFLLElBQUksQ0FBQyxHQUFHLENBQUMsRUFBRSxDQUFDLEdBQUcsVUFBVSxFQUFFLEVBQUUsQ0FBQyxFQUFFO1FBQ25DLGdCQUFnQixDQUFDLElBQUksQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQztLQUNwQztJQUNELE9BQU8sZ0JBQWdCLENBQUM7QUFDMUIsQ0FBQztBQUVEOzs7Ozs7Ozs7O0dBVUc7QUFDSCxNQUFNLFVBQVUsWUFBWSxDQUN4QixjQUF3QixFQUFFLEtBQWlCLEVBQUUsVUFBa0I7SUFDakUsTUFBTSxTQUFTLEdBQUcsY0FBYyxDQUFDLEtBQUssQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUM7SUFDN0MsS0FBSyxJQUFJLENBQUMsR0FBRyxDQUFDLEVBQUUsQ0FBQyxHQUFHLFVBQVUsRUFBRSxFQUFFLENBQUMsRUFBRTtRQUNuQyxTQUFTLENBQUMsSUFBSSxDQUFDLGNBQWMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLEdBQUcsS0FBSyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxHQUFHLEtBQUssQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDO0tBQ25FO0lBRUQsT0FBTyxTQUFTLENBQUM7QUFDbkIsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbIi8qKlxuICogQGxpY2Vuc2VcbiAqIENvcHlyaWdodCAyMDE4IEdvb2dsZSBMTEMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuXG4gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgXCJMaWNlbnNlXCIpO1xuICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLlxuICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0XG4gKlxuICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wXG4gKlxuICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZVxuICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gXCJBUyBJU1wiIEJBU0lTLFxuICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuXG4gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kXG4gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS5cbiAqID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4gKi9cblxuLyoqXG4gKiBHZXRzIHRoZSBuZXcgc2hhcGUgb2YgdGhlIGlucHV0IFRlbnNvciBhZnRlciBpdCdzIGJlZW4gcmVzaGFwZWRcbiAqIHRvOlxuICogW2Jsb2NrU2hhcGVbMF0sIC4uLiwgYmxvY2tTaGFwZVtNLTFdLCBiYXRjaCAvIHByb2QoYmxvY2tTaGFwZSksXG4gKiBpbnB1dFNoYXBlWzFdLCAuLi4sIGlucHV0U2hhcGVbTi0xXV1cbiAqXG4gKiBTZWUgc3RlcCAxOiBodHRwczovL3d3dy50ZW5zb3JmbG93Lm9yZy9hcGlfZG9jcy9weXRob24vdGYvYmF0Y2hfdG9fc3BhY2VfbmRcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGdldFJlc2hhcGVkKFxuICAgIGlucHV0U2hhcGU6IG51bWJlcltdLCBibG9ja1NoYXBlOiBudW1iZXJbXSwgcHJvZDogbnVtYmVyLFxuICAgIGJhdGNoVG9TcGFjZSA9IHRydWUpOiBudW1iZXJbXSB7XG4gIGxldCByZXNoYXBlZDogbnVtYmVyW10gPSBbXTtcbiAgaWYgKGJhdGNoVG9TcGFjZSkge1xuICAgIHJlc2hhcGVkID0gcmVzaGFwZWQuY29uY2F0KGJsb2NrU2hhcGUuc2xpY2UoMCkpO1xuICAgIHJlc2hhcGVkLnB1c2goaW5wdXRTaGFwZVswXSAvIHByb2QpO1xuICAgIHJlc2hhcGVkID0gcmVzaGFwZWQuY29uY2F0KGlucHV0U2hhcGUuc2xpY2UoMSkpO1xuICB9IGVsc2Uge1xuICAgIHJlc2hhcGVkID0gcmVzaGFwZWQuY29uY2F0KGlucHV0U2hhcGVbMF0pO1xuICAgIGNvbnN0IHNwYXRpYWxMZW5ndGggPSBibG9ja1NoYXBlLmxlbmd0aDtcbiAgICBmb3IgKGxldCBpID0gMDsgaSA8IHNwYXRpYWxMZW5ndGg7ICsraSkge1xuICAgICAgcmVzaGFwZWQgPVxuICAgICAgICAgIHJlc2hhcGVkLmNvbmNhdChbaW5wdXRTaGFwZVtpICsgMV0gLyBibG9ja1NoYXBlW2ldLCBibG9ja1NoYXBlW2ldXSk7XG4gICAgfVxuICAgIHJlc2hhcGVkID0gcmVzaGFwZWQuY29uY2F0KGlucHV0U2hhcGUuc2xpY2Uoc3BhdGlhbExlbmd0aCArIDEpKTtcbiAgfVxuICByZXR1cm4gcmVzaGFwZWQ7XG59XG5cbi8qKlxuICogR2V0cyB0aGUgcGVybXV0YXRpb24gdGhhdCB3aWxsIHRyYW5zcG9zZSB0aGUgZGltZW5zaW9ucyBvZiB0aGVcbiAqIHJlc2hhcGVkIHRlbnNvciB0byBzaGFwZTpcbiAqXG4gKiBbYmF0Y2ggLyBwcm9kKGJsb2NrX3NoYXBlKSxpbnB1dFNoYXBlWzFdLCBibG9ja1NoYXBlWzBdLCAuLi4sXG4gKiBpbnB1dFNoYXBlW01dLCBibG9ja1NoYXBlW00tMV0saW5wdXRTaGFwZVtNKzFdLCAuLi4sIGlucHV0U2hhcGVbTi0xXV1cbiAqXG4gKiBzZWUgc3RlcCAyOiBodHRwczovL3d3dy50ZW5zb3JmbG93Lm9yZy9hcGlfZG9jcy9weXRob24vdGYvYmF0Y2hfdG9fc3BhY2VfbmRcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGdldFBlcm11dGVkKFxuICAgIHJlc2hhcGVkUmFuazogbnVtYmVyLCBibG9ja1NoYXBlUmFuazogbnVtYmVyLFxuICAgIGJhdGNoVG9TcGFjZSA9IHRydWUpOiBudW1iZXJbXSB7XG4gIGNvbnN0IHBlcm11dGVkID0gW107XG4gIGlmIChiYXRjaFRvU3BhY2UpIHtcbiAgICBwZXJtdXRlZC5wdXNoKGJsb2NrU2hhcGVSYW5rKTtcbiAgICBmb3IgKGxldCBpID0gYmxvY2tTaGFwZVJhbmsgKyAxOyBpIDwgcmVzaGFwZWRSYW5rOyArK2kpIHtcbiAgICAgIGlmIChpIDw9IDIgKiBibG9ja1NoYXBlUmFuaykge1xuICAgICAgICBwZXJtdXRlZC5wdXNoKGkpO1xuICAgICAgICBwZXJtdXRlZC5wdXNoKGkgLSAoYmxvY2tTaGFwZVJhbmsgKyAxKSk7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBwZXJtdXRlZC5wdXNoKGkpO1xuICAgICAgfVxuICAgIH1cbiAgfSBlbHNlIHtcbiAgICBjb25zdCBwZXJtdXRlZEJlZm9yZUJhdGNoID0gW107XG4gICAgY29uc3QgcGVybXV0ZWRBZnRlckJhdGNoID0gW107XG4gICAgZm9yIChsZXQgaSA9IDE7IGkgPCByZXNoYXBlZFJhbms7ICsraSkge1xuICAgICAgaWYgKGkgPj0gYmxvY2tTaGFwZVJhbmsgKiAyICsgMSB8fCBpICUgMiA9PT0gMSkge1xuICAgICAgICBwZXJtdXRlZEFmdGVyQmF0Y2gucHVzaChpKTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHBlcm11dGVkQmVmb3JlQmF0Y2gucHVzaChpKTtcbiAgICAgIH1cbiAgICB9XG4gICAgcGVybXV0ZWQucHVzaCguLi5wZXJtdXRlZEJlZm9yZUJhdGNoKTtcbiAgICBwZXJtdXRlZC5wdXNoKDApO1xuICAgIHBlcm11dGVkLnB1c2goLi4ucGVybXV0ZWRBZnRlckJhdGNoKTtcbiAgfVxuICByZXR1cm4gcGVybXV0ZWQ7XG59XG5cbi8qKlxuICogR2V0cyB0aGUgc2hhcGUgb2YgdGhlIHJlc2hhcGVkIGFuZCBwZXJtdXRlZCBpbnB1dCBUZW5zb3IgYmVmb3JlIGFueSBjcm9wcGluZ1xuICogaXMgYXBwbGllZC4gIFRoZSBuZXcgc2hhcGUgd2lsbCBiZTpcbiAqXG4gKiBbYmF0Y2ggLyBwcm9kKGJsb2NrU2hhcGUpLGlucHV0U2hhcGVbMV0gKiBibG9ja1NoYXBlWzBdLCAuLi4sXG4gKiBpbnB1dFNoYXBlW01dICogYmxvY2tTaGFwZVtNLTFdLGlucHV0U2hhcGVbTSsxXSwgLi4uLCBpbnB1dFNoYXBlW04tMV1dXG4gKlxuICogU2VlIHN0ZXAgMzogaHR0cHM6Ly93d3cudGVuc29yZmxvdy5vcmcvYXBpX2RvY3MvcHl0aG9uL3RmL2JhdGNoX3RvX3NwYWNlX25kXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBnZXRSZXNoYXBlZFBlcm11dGVkKFxuICAgIGlucHV0U2hhcGU6IG51bWJlcltdLCBibG9ja1NoYXBlOiBudW1iZXJbXSwgcHJvZDogbnVtYmVyLFxuICAgIGJhdGNoVG9TcGFjZSA9IHRydWUpOiBudW1iZXJbXSB7XG4gIGNvbnN0IHJlc2hhcGVkUGVybXV0ZWQgPSBbXTtcblxuICBpZiAoYmF0Y2hUb1NwYWNlKSB7XG4gICAgcmVzaGFwZWRQZXJtdXRlZC5wdXNoKGlucHV0U2hhcGVbMF0gLyBwcm9kKTtcbiAgfSBlbHNlIHtcbiAgICByZXNoYXBlZFBlcm11dGVkLnB1c2goaW5wdXRTaGFwZVswXSAqIHByb2QpO1xuICB9XG5cbiAgZm9yIChsZXQgaSA9IDE7IGkgPCBpbnB1dFNoYXBlLmxlbmd0aDsgKytpKSB7XG4gICAgaWYgKGkgPD0gYmxvY2tTaGFwZS5sZW5ndGgpIHtcbiAgICAgIGlmIChiYXRjaFRvU3BhY2UpIHtcbiAgICAgICAgcmVzaGFwZWRQZXJtdXRlZC5wdXNoKGJsb2NrU2hhcGVbaSAtIDFdICogaW5wdXRTaGFwZVtpXSk7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICByZXNoYXBlZFBlcm11dGVkLnB1c2goaW5wdXRTaGFwZVtpXSAvIGJsb2NrU2hhcGVbaSAtIDFdKTtcbiAgICAgIH1cbiAgICB9IGVsc2Uge1xuICAgICAgcmVzaGFwZWRQZXJtdXRlZC5wdXNoKGlucHV0U2hhcGVbaV0pO1xuICAgIH1cbiAgfVxuXG4gIHJldHVybiByZXNoYXBlZFBlcm11dGVkO1xufVxuXG4vKipcbiAqIENvbnZlcnRzIHRoZSBjcm9wcyBhcmd1bWVudCBpbnRvIHRoZSBiZWdpbm5pbmcgY29vcmRpbmF0ZXMgb2YgYSBzbGljZVxuICogb3BlcmF0aW9uLlxuICovXG5leHBvcnQgZnVuY3Rpb24gZ2V0U2xpY2VCZWdpbkNvb3JkcyhcbiAgICBjcm9wczogbnVtYmVyW11bXSwgYmxvY2tTaGFwZTogbnVtYmVyKTogbnVtYmVyW10ge1xuICBjb25zdCBzbGljZUJlZ2luQ29vcmRzID0gWzBdO1xuICBmb3IgKGxldCBpID0gMDsgaSA8IGJsb2NrU2hhcGU7ICsraSkge1xuICAgIHNsaWNlQmVnaW5Db29yZHMucHVzaChjcm9wc1tpXVswXSk7XG4gIH1cbiAgcmV0dXJuIHNsaWNlQmVnaW5Db29yZHM7XG59XG5cbi8qKlxuICogQ29udmVydHMgdGhlIGNyb3BzIGFyZ3VtZW50IGludG8gdGhlIHNpemUgb2YgYSBzbGljZSBvcGVyYXRpb24uICBXaGVuXG4gKiBjb21iaW5lZCB3aXRoIGdldFNsaWNlQmVnaW5Db29yZHMgdGhpcyBmdW5jdGlvbiBhbGxvd3MgdGhlIHJlc2hhcGVkIGFuZFxuICogcGVybXV0ZWQgVGVuc29yIHRvIGJlIGNyb3BwZWQgdG8gaXRzIGZpbmFsIG91dHB1dCBzaGFwZSBvZjpcbiAqXG4gKiBpbnB1dFNoYXBlWzFdICogYmxvY2tTaGFwZVswXSAtIGNyb3BzWzAsMF0gLSBjcm9wc1swLDFdLCAuLi4sXG4gKiBpbnB1dFNoYXBlW01dICogYmxvY2tTaGFwZVtNLTFdIC1jcm9wc1tNLTEsMF0gLVxuICogY3JvcHNbTS0xLDFdLGlucHV0U2hhcGVbTSsxXSwgLi4uLCBpbnB1dFNoYXBlW04tMV1dXG4gKlxuICogU2VlIHN0ZXAgNDogaHR0cHM6Ly93d3cudGVuc29yZmxvdy5vcmcvYXBpX2RvY3MvcHl0aG9uL3RmL2JhdGNoX3RvX3NwYWNlX25kXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBnZXRTbGljZVNpemUoXG4gICAgdW5jcm9wcGVkU2hhcGU6IG51bWJlcltdLCBjcm9wczogbnVtYmVyW11bXSwgYmxvY2tTaGFwZTogbnVtYmVyKTogbnVtYmVyW10ge1xuICBjb25zdCBzbGljZVNpemUgPSB1bmNyb3BwZWRTaGFwZS5zbGljZSgwLCAxKTtcbiAgZm9yIChsZXQgaSA9IDA7IGkgPCBibG9ja1NoYXBlOyArK2kpIHtcbiAgICBzbGljZVNpemUucHVzaCh1bmNyb3BwZWRTaGFwZVtpICsgMV0gLSBjcm9wc1tpXVswXSAtIGNyb3BzW2ldWzFdKTtcbiAgfVxuXG4gIHJldHVybiBzbGljZVNpemU7XG59XG4iXX0=","/**\n * @license\n * Copyright 2018 Google LLC. All Rights Reserved.\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n * =============================================================================\n */\nexport const ERF_P = 0.3275911;\nexport const ERF_A1 = 0.254829592;\nexport const ERF_A2 = -0.284496736;\nexport const ERF_A3 = 1.421413741;\nexport const ERF_A4 = -1.453152027;\nexport const ERF_A5 = 1.061405429;\n//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZXJmX3V0aWwuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi8uLi90ZmpzLWNvcmUvc3JjL29wcy9lcmZfdXRpbC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQTs7Ozs7Ozs7Ozs7Ozs7O0dBZUc7QUFFSCxNQUFNLENBQUMsTUFBTSxLQUFLLEdBQUcsU0FBUyxDQUFDO0FBQy9CLE1BQU0sQ0FBQyxNQUFNLE1BQU0sR0FBRyxXQUFXLENBQUM7QUFDbEMsTUFBTSxDQUFDLE1BQU0sTUFBTSxHQUFHLENBQUMsV0FBVyxDQUFDO0FBQ25DLE1BQU0sQ0FBQyxNQUFNLE1BQU0sR0FBRyxXQUFXLENBQUM7QUFDbEMsTUFBTSxDQUFDLE1BQU0sTUFBTSxHQUFHLENBQUMsV0FBVyxDQUFDO0FBQ25DLE1BQU0sQ0FBQyxNQUFNLE1BQU0sR0FBRyxXQUFXLENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyIvKipcbiAqIEBsaWNlbnNlXG4gKiBDb3B5cmlnaHQgMjAxOCBHb29nbGUgTExDLiBBbGwgUmlnaHRzIFJlc2VydmVkLlxuICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlIFwiTGljZW5zZVwiKTtcbiAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS5cbiAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdFxuICpcbiAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMFxuICpcbiAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmVcbiAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuIFwiQVMgSVNcIiBCQVNJUyxcbiAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLlxuICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZFxuICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuXG4gKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuICovXG5cbmV4cG9ydCBjb25zdCBFUkZfUCA9IDAuMzI3NTkxMTtcbmV4cG9ydCBjb25zdCBFUkZfQTEgPSAwLjI1NDgyOTU5MjtcbmV4cG9ydCBjb25zdCBFUkZfQTIgPSAtMC4yODQ0OTY3MzY7XG5leHBvcnQgY29uc3QgRVJGX0EzID0gMS40MjE0MTM3NDE7XG5leHBvcnQgY29uc3QgRVJGX0E0ID0gLTEuNDUzMTUyMDI3O1xuZXhwb3J0IGNvbnN0IEVSRl9BNSA9IDEuMDYxNDA1NDI5O1xuIl19","/**\n * @license\n * Copyright 2018 Google LLC. All Rights Reserved.\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n * =============================================================================\n */\n/**\n * Merges real and imaginary Float32Arrays into a single complex Float32Array.\n *\n * The memory layout is interleaved as follows:\n * real: [r0, r1, r2]\n * imag: [i0, i1, i2]\n * complex: [r0, i0, r1, i1, r2, i2]\n *\n * This is the inverse of splitRealAndImagArrays.\n *\n * @param real The real values of the complex tensor values.\n * @param imag The imag values of the complex tensor values.\n * @returns A complex tensor as a Float32Array with merged values.\n */\nexport function mergeRealAndImagArrays(real, imag) {\n if (real.length !== imag.length) {\n throw new Error(`Cannot merge real and imag arrays of different lengths. real:` +\n `${real.length}, imag: ${imag.length}.`);\n }\n const result = new Float32Array(real.length * 2);\n for (let i = 0; i < result.length; i += 2) {\n result[i] = real[i / 2];\n result[i + 1] = imag[i / 2];\n }\n return result;\n}\n/**\n * Splits a complex Float32Array into real and imag parts.\n *\n * The memory layout is interleaved as follows:\n * complex: [r0, i0, r1, i1, r2, i2]\n * real: [r0, r1, r2]\n * imag: [i0, i1, i2]\n *\n * This is the inverse of mergeRealAndImagArrays.\n *\n * @param complex The complex tensor values.\n * @returns An object with real and imag Float32Array components of the complex\n * tensor.\n */\nexport function splitRealAndImagArrays(complex) {\n const real = new Float32Array(complex.length / 2);\n const imag = new Float32Array(complex.length / 2);\n for (let i = 0; i < complex.length; i += 2) {\n real[i / 2] = complex[i];\n imag[i / 2] = complex[i + 1];\n }\n return { real, imag };\n}\n/**\n * Extracts even indexed complex values in the given array.\n * @param complex The complex tensor values\n */\nexport function complexWithEvenIndex(complex) {\n const len = Math.ceil(complex.length / 4);\n const real = new Float32Array(len);\n const imag = new Float32Array(len);\n for (let i = 0; i < complex.length; i += 4) {\n real[Math.floor(i / 4)] = complex[i];\n imag[Math.floor(i / 4)] = complex[i + 1];\n }\n return { real, imag };\n}\n/**\n * Extracts odd indexed comple values in the given array.\n * @param complex The complex tensor values\n */\nexport function complexWithOddIndex(complex) {\n const len = Math.floor(complex.length / 4);\n const real = new Float32Array(len);\n const imag = new Float32Array(len);\n for (let i = 2; i < complex.length; i += 4) {\n real[Math.floor(i / 4)] = complex[i];\n imag[Math.floor(i / 4)] = complex[i + 1];\n }\n return { real, imag };\n}\n/**\n * Get the map representing a complex value in the given array.\n * @param complex The complex tensor values.\n * @param index An index of the target complex value.\n */\nexport function getComplexWithIndex(complex, index) {\n const real = complex[index * 2];\n const imag = complex[index * 2 + 1];\n return { real, imag };\n}\n/**\n * Insert a given complex value into the TypedArray.\n * @param data The array in which the complex value is inserted.\n * @param c The complex value to be inserted.\n * @param index An index of the target complex value.\n */\nexport function assignToTypedArray(data, real, imag, index) {\n data[index * 2] = real;\n data[index * 2 + 1] = imag;\n}\n/**\n * Make the list of exponent terms used by FFT.\n */\nexport function exponents(n, inverse) {\n const real = new Float32Array(n / 2);\n const imag = new Float32Array(n / 2);\n for (let i = 0; i < Math.ceil(n / 2); i++) {\n const x = (inverse ? 2 : -2) * Math.PI * (i / n);\n real[i] = Math.cos(x);\n imag[i] = Math.sin(x);\n }\n return { real, imag };\n}\n/**\n * Make the exponent term used by FFT.\n */\nexport function exponent(k, n, inverse) {\n const x = (inverse ? 2 : -2) * Math.PI * (k / n);\n const real = Math.cos(x);\n const imag = Math.sin(x);\n return { real, imag };\n}\n//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY29tcGxleF91dGlsLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vLi4vdGZqcy1jb3JlL3NyYy9iYWNrZW5kcy9jb21wbGV4X3V0aWwudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUE7Ozs7Ozs7Ozs7Ozs7OztHQWVHO0FBR0g7Ozs7Ozs7Ozs7Ozs7R0FhRztBQUNILE1BQU0sVUFBVSxzQkFBc0IsQ0FDbEMsSUFBa0IsRUFBRSxJQUFrQjtJQUN4QyxJQUFJLElBQUksQ0FBQyxNQUFNLEtBQUssSUFBSSxDQUFDLE1BQU0sRUFBRTtRQUMvQixNQUFNLElBQUksS0FBSyxDQUNYLCtEQUErRDtZQUMvRCxHQUFHLElBQUksQ0FBQyxNQUFNLFdBQVcsSUFBSSxDQUFDLE1BQU0sR0FBRyxDQUFDLENBQUM7S0FDOUM7SUFDRCxNQUFNLE1BQU0sR0FBRyxJQUFJLFlBQVksQ0FBQyxJQUFJLENBQUMsTUFBTSxHQUFHLENBQUMsQ0FBQyxDQUFDO0lBQ2pELEtBQUssSUFBSSxDQUFDLEdBQUcsQ0FBQyxFQUFFLENBQUMsR0FBRyxNQUFNLENBQUMsTUFBTSxFQUFFLENBQUMsSUFBSSxDQUFDLEVBQUU7UUFDekMsTUFBTSxDQUFDLENBQUMsQ0FBQyxHQUFHLElBQUksQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUM7UUFDeEIsTUFBTSxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsR0FBRyxJQUFJLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDO0tBQzdCO0lBQ0QsT0FBTyxNQUFNLENBQUM7QUFDaEIsQ0FBQztBQUVEOzs7Ozs7Ozs7Ozs7O0dBYUc7QUFDSCxNQUFNLFVBQVUsc0JBQXNCLENBQUMsT0FBcUI7SUFFMUQsTUFBTSxJQUFJLEdBQUcsSUFBSSxZQUFZLENBQUMsT0FBTyxDQUFDLE1BQU0sR0FBRyxDQUFDLENBQUMsQ0FBQztJQUNsRCxNQUFNLElBQUksR0FBRyxJQUFJLFlBQVksQ0FBQyxPQUFPLENBQUMsTUFB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LENBQUMsQ0FBQyxDQUFDO0lBQ3pCLE1BQU0sSUFBSSxHQUFHLElBQUksQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUM7SUFDekIsT0FBTyxFQUFDLElBQUksRUFBRSxJQUFJLEVBQUMsQ0FBQztBQUN0QixDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiLyoqXG4gKiBAbGljZW5zZVxuICogQ29weXJpZ2h0IDIwMTggR29vZ2xlIExMQy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC5cbiAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSBcIkxpY2Vuc2VcIik7XG4gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuXG4gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXRcbiAqXG4gKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjBcbiAqXG4gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlXG4gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiBcIkFTIElTXCIgQkFTSVMsXG4gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC5cbiAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmRcbiAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLlxuICogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbiAqL1xuXG5pbXBvcnQge1R5cGVkQXJyYXl9IGZyb20gJy4uL3R5cGVzJztcbi8qKlxuICogTWVyZ2VzIHJlYWwgYW5kIGltYWdpbmFyeSBGbG9hdDMyQXJyYXlzIGludG8gYSBzaW5nbGUgY29tcGxleCBGbG9hdDMyQXJyYXkuXG4gKlxuICogVGhlIG1lbW9yeSBsYXlvdXQgaXMgaW50ZXJsZWF2ZWQgYXMgZm9sbG93czpcbiAqIHJlYWw6IFtyMCwgcjEsIHIyXVxuICogaW1hZzogW2kwLCBpMSwgaTJdXG4gKiBjb21wbGV4OiBbcjAsIGkwLCByMSwgaTEsIHIyLCBpMl1cbiAqXG4gKiBUaGlzIGlzIHRoZSBpbnZlcnNlIG9mIHNwbGl0UmVhbEFuZEltYWdBcnJheXMuXG4gKlxuICogQHBhcmFtIHJlYWwgVGhlIHJlYWwgdmFsdWVzIG9mIHRoZSBjb21wbGV4IHRlbnNvciB2YWx1ZXMuXG4gKiBAcGFyYW0gaW1hZyBUaGUgaW1hZyB2YWx1ZXMgb2YgdGhlIGNvbXBsZXggdGVuc29yIHZhbHVlcy5cbiAqIEByZXR1cm5zIEEgY29tcGxleCB0ZW5zb3IgYXMgYSBGbG9hdDMyQXJyYXkgd2l0aCBtZXJnZWQgdmFsdWVzLlxuICovXG5leHBvcnQgZnVuY3Rpb24gbWVyZ2VSZWFsQW5kSW1hZ0FycmF5cyhcbiAgICByZWFsOiBGbG9hdDMyQXJyYXksIGltYWc6IEZsb2F0MzJBcnJheSk6IEZsb2F0MzJBcnJheSB7XG4gIGlmIChyZWFsLmxlbmd0aCAhPT0gaW1hZy5sZW5ndGgpIHtcbiAgICB0aHJvdyBuZXcgRXJyb3IoXG4gICAgICAgIGBDYW5ub3QgbWVyZ2UgcmVhbCBhbmQgaW1hZyBhcnJheXMgb2YgZGlmZmVyZW50IGxlbmd0aHMuIHJlYWw6YCArXG4gICAgICAgIGAke3JlYWwubGVuZ3RofSwgaW1hZzogJHtpbWFnLmxlbmd0aH0uYCk7XG4gIH1cbiAgY29uc3QgcmVzdWx0ID0gbmV3IEZsb2F0MzJBcnJheShyZWFsLmxlbmd0aCAqIDIpO1xuICBmb3IgKGxldCBpID0gMDsgaSA8IHJlc3VsdC5sZW5ndGg7IGkgKz0gMikge1xuICAgIHJlc3VsdFtpXSA9IHJlYWxbaSAvIDJdO1xuICAgIHJlc3VsdFtpICsgMV0gPSBpbWFnW2kgLyAyXTtcbiAgfVxuICByZXR1cm4gcmVzdWx0O1xufVxuXG4vKipcbiAqIFNwbGl0cyBhIGNvbXBsZXggRmxvYXQzMkFycmF5IGludG8gcmVhbCBhbmQgaW1hZyBwYXJ0cy5cbiAqXG4gKiBUaGUgbWVtb3J5IGxheW91dCBpcyBpbnRlcmxlYXZlZCBhcyBmb2xsb3dzOlxuICogY29tcGxleDogW3IwLCBpMCwgcjEsIGkxLCByMiwgaTJdXG4gKiByZWFsOiBbcjAsIHIxLCByMl1cbiAqIGltYWc6IFtpMCwgaTEsIGkyXVxuICpcbiAqIFRoaXMgaXMgdGhlIGludmVyc2Ugb2YgbWVyZ2VSZWFsQW5kSW1hZ0FycmF5cy5cbiAqXG4gKiBAcGFyYW0gY29tcGxleCBUaGUgY29tcGxleCB0ZW5zb3IgdmFsdWVzLlxuICogQHJldHVybnMgQW4gb2JqZWN0IHdpdGggcmVhbCBhbmQgaW1hZyBGbG9hdDMyQXJyYXkgY29tcG9uZW50cyBvZiB0aGUgY29tcGxleFxuICogICAgIHRlbnNvci5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHNwbGl0UmVhbEFuZEltYWdBcnJheXMoY29tcGxleDogRmxvYXQzMkFycmF5KTpcbiAgICB7cmVhbDogRmxvYXQzMkFycmF5LCBpbWFnOiBGbG9hdDMyQXJyYXl9IHtcbiAgY29uc3QgcmVhbCA9IG5ldyBGbG9hdDMyQXJyYXkoY29tcGxleC5sZW5ndGggLyAyKTtcbiAgY29uc3QgaW1hZyA9IG5ldyBGbG9hdDMyQXJyYXkoY29tcGxleC5sZW5ndGggLyAyKTtcbiAgZm9yIChsZXQgaSA9IDA7IGkgPCBjb21wbGV4Lmxlbmd0aDsgaSArPSAyKSB7XG4gICAgcmVhbFtpIC8gMl0gPSBjb21wbGV4W2ldO1xuICAgIGltYWdbaSAvIDJdID0gY29tcGxleFtpICsgMV07XG4gIH1cbiAgcmV0dXJuIHtyZWFsLCBpbWFnfTtcbn1cblxuLyoqXG4gKiBFeHRyYWN0cyBldmVuIGluZGV4ZWQgY29tcGxleCB2YWx1ZXMgaW4gdGhlIGdpdmVuIGFycmF5LlxuICogQHBhcmFtIGNvbXBsZXggVGhlIGNvbXBsZXggdGVuc29yIHZhbHVlc1xuICovXG5leHBvcnQgZnVuY3Rpb24gY29tcGxleFdpdGhFdmVuSW5kZXgoY29tcGxleDogRmxvYXQzMkFycmF5KTpcbiAgICB7cmVhbDogRmxvYXQzMkFycmF5LCBpbWFnOiBGbG9hdDMyQXJyYXl9IHtcbiAgY29uc3QgbGVuID0gTWF0aC5jZWlsKGNvbXBsZXgubGVuZ3RoIC8gNCk7XG4gIGNvbnN0IHJlYWwgPSBuZXcgRmxvYXQzMkFycmF5KGxlbik7XG4gIGNvbnN0IGltYWcgPSBuZXcgRmxvYXQzMkFycmF5KGxlbik7XG4gIGZvciAobGV0IGkgPSAwOyBpIDwgY29tcGxleC5sZW5ndGg7IGkgKz0gNCkge1xuICAgIHJlYWxbTWF0aC5mbG9vcihpIC8gNCldID0gY29tcGxleFtpXTtcbiAgICBpbWFnW01hdGguZmxvb3IoaSAvIDQpXSA9IGNvbXBsZXhbaSArIDFdO1xuICB9XG4gIHJldHVybiB7cmVhbCwgaW1hZ307XG59XG5cbi8qKlxuICogRXh0cmFjdHMgb2RkIGluZGV4ZWQgY29tcGxlIHZhbHVlcyBpbiB0aGUgZ2l2ZW4gYXJyYXkuXG4gKiBAcGFyYW0gY29tcGxleCBUaGUgY29tcGxleCB0ZW5zb3IgdmFsdWVzXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBjb21wbGV4V2l0aE9kZEluZGV4KGNvbXBsZXg6IEZsb2F0MzJBcnJheSk6XG4gICAge3JlYWw6IEZsb2F0MzJBcnJheSwgaW1hZzogRmxvYXQzMkFycmF5fSB7XG4gIGNvbnN0IGxlbiA9IE1hdGguZmxvb3IoY29tcGxleC5sZW5ndGggLyA0KTtcbiAgY29uc3QgcmVhbCA9IG5ldyBGbG9hdDMyQXJyYXkobGVuKTtcbiAgY29uc3QgaW1hZyA9IG5ldyBGbG9hdDMyQXJyYXkobGVuKTtcbiAgZm9yIChsZXQgaSA9IDI7IGkgPCBjb21wbGV4Lmxlbmd0aDsgaSArPSA0KSB7XG4gICAgcmVhbFtNYXRoLmZsb29yKGkgLyA0KV0gPSBjb21wbGV4W2ldO1xuICAgIGltYWdbTWF0aC5mbG9vcihpIC8gNCldID0gY29tcGxleFtpICsgMV07XG4gIH1cbiAgcmV0dXJuIHtyZWFsLCBpbWFnfTtcbn1cblxuLyoqXG4gKiBHZXQgdGhlIG1hcCByZXByZXNlbnRpbmcgYSBjb21wbGV4IHZhbHVlIGluIHRoZSBnaXZlbiBhcnJheS5cbiAqIEBwYXJhbSBjb21wbGV4IFRoZSBjb21wbGV4IHRlbnNvciB2YWx1ZXMuXG4gKiBAcGFyYW0gaW5kZXggQW4gaW5kZXggb2YgdGhlIHRhcmdldCBjb21wbGV4IHZhbHVlLlxuICovXG5leHBvcnQgZnVuY3Rpb24gZ2V0Q29tcGxleFdpdGhJbmRleChcbiAgICBjb21wbGV4OiBGbG9hdDMyQXJyYXksIGluZGV4OiBudW1iZXIpOiB7cmVhbDogbnVtYmVyLCBpbWFnOiBudW1iZXJ9IHtcbiAgY29uc3QgcmVhbCA9IGNvbXBsZXhbaW5kZXggKiAyXTtcbiAgY29uc3QgaW1hZyA9IGNvbXBsZXhbaW5kZXggKiAyICsgMV07XG4gIHJldHVybiB7cmVhbCwgaW1hZ307XG59XG5cbi8qKlxuICogSW5zZXJ0IGEgZ2l2ZW4gY29tcGxleCB2YWx1ZSBpbnRvIHRoZSBUeXBlZEFycmF5LlxuICogQHBhcmFtIGRhdGEgVGhlIGFycmF5IGluIHdoaWNoIHRoZSBjb21wbGV4IHZhbHVlIGlzIGluc2VydGVkLlxuICogQHBhcmFtIGMgVGhlIGNvbXBsZXggdmFsdWUgdG8gYmUgaW5zZXJ0ZWQuXG4gKiBAcGFyYW0gaW5kZXggQW4gaW5kZXggb2YgdGhlIHRhcmdldCBjb21wbGV4IHZhbHVlLlxuICovXG5leHBvcnQgZnVuY3Rpb24gYXNzaWduVG9UeXBlZEFycmF5KFxuICAgIGRhdGE6IFR5cGVkQXJyYXksIHJlYWw6IG51bWJlciwgaW1hZzogbnVtYmVyLCBpbmRleDogbnVtYmVyKSB7XG4gIGRhdGFbaW5kZXggKiAyXSA9IHJlYWw7XG4gIGRhdGFbaW5kZXggKiAyICsgMV0gPSBpbWFnO1xufVxuXG4vKipcbiAqIE1ha2UgdGhlIGxpc3Qgb2YgZXhwb25lbnQgdGVybXMgdXNlZCBieSBGRlQuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBleHBvbmVudHMoXG4gICAgbjogbnVtYmVyLCBpbnZlcnNlOiBib29sZWFuKToge3JlYWw6IEZsb2F0MzJBcnJheSwgaW1hZzogRmxvYXQzMkFycmF5fSB7XG4gIGNvbnN0IHJlYWwgPSBuZXcgRmxvYXQzMkFycmF5KG4gLyAyKTtcbiAgY29uc3QgaW1hZyA9IG5ldyBGbG9hdDMyQXJyYXkobiAvIDIpO1xuICBmb3IgKGxldCBpID0gMDsgaSA8IE1hdGguY2VpbChuIC8gMik7IGkrKykge1xuICAgIGNvbnN0IHggPSAoaW52ZXJzZSA/IDIgOiAtMikgKiBNYXRoLlBJICogKGkgLyBuKTtcbiAgICByZWFsW2ldID0gTWF0aC5jb3MoeCk7XG4gICAgaW1hZ1tpXSA9IE1hdGguc2luKHgpO1xuICB9XG4gIHJldHVybiB7cmVhbCwgaW1hZ307XG59XG5cbi8qKlxuICogTWFrZSB0aGUgZXhwb25lbnQgdGVybSB1c2VkIGJ5IEZGVC5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGV4cG9uZW50KFxuICAgIGs6IG51bWJlciwgbjogbnVtYmVyLCBpbnZlcnNlOiBib29sZWFuKToge3JlYWw6IG51bWJlciwgaW1hZzogbnVtYmVyfSB7XG4gIGNvbnN0IHggPSAoaW52ZXJzZSA/IDIgOiAtMikgKiBNYXRoLlBJICogKGsgLyBuKTtcbiAgY29uc3QgcmVhbCA9IE1hdGguY29zKHgpO1xuICBjb25zdCBpbWFnID0gTWF0aC5zaW4oeCk7XG4gIHJldHVybiB7cmVhbCwgaW1hZ307XG59XG4iXX0=","/**\n * @license\n * Copyright 2021 Google LLC. All Rights Reserved.\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n * =============================================================================\n */\nimport { assert } from '../util_base';\nconst ARROW = '->';\nconst ARROW_REGEX = /->/g;\nconst COMMA = ',';\nconst ELLIPSIS = '...';\n/**\n * Parse an equation for einsum.\n *\n * @param equation The einsum equation (e.g., \"ij,jk->ik\").\n * @param numTensors Number of tensors provided along with `equation`. Used to\n * check matching number of input tensors.\n * @returns An object consisting of the following fields:\n * - allDims: all dimension names as strings.\n * - summedDims: a list of all dimensions being summed over, as indices to\n * the elements of `allDims`.\n * - idDims: indices of the dimensions in each input tensor, as indices to\n * the elements of `allDims.\n */\nexport function decodeEinsumEquation(equation, numTensors) {\n equation = equation.replace(/\\s/g, ''); // Remove witespace in equation.\n const numArrows = (equation.length - equation.replace(ARROW_REGEX, '').length) /\n ARROW.length;\n if (numArrows < 1) {\n throw new Error('Equations without an arrow are not supported.');\n }\n else if (numArrows > 1) {\n throw new Error(`Equation must contain exactly one arrow (\"${ARROW}\").`);\n }\n const [inputString, outputString] = equation.split(ARROW);\n assert(inputString.indexOf(ELLIPSIS) === -1, () => `The ellipsis notation (\"${ELLIPSIS}\") is not supported yet.`);\n const inputTerms = inputString.split(COMMA);\n const numInputs = inputTerms.length;\n if (numTensors !== numInputs) {\n throw new Error(`Expected ${numInputs} input tensors, received ${numTensors}`);\n }\n if (numInputs > 2) {\n throw new Error('Support for more than 2 input tensors is not implemented yet.');\n }\n const allDims = [];\n for (let i = 0; i < outputString.length; ++i) {\n const dimName = outputString[i];\n if (!inputTerms.some(inputTerm => inputTerm.indexOf(dimName) !== -1)) {\n throw new Error(`Output subscripts contain the label ${dimName} ` +\n `not present in the input subscripts.`);\n }\n if (allDims.indexOf(dimName) === -1) {\n allDims.push(dimName);\n }\n }\n for (let i = 0; i < inputString.length; ++i) {\n const dimName = inputString[i];\n if (allDims.indexOf(dimName) === -1 && dimName !== COMMA) {\n allDims.push(dimName);\n }\n }\n const idDims = new Array(inputTerms.length);\n for (let i = 0; i < numInputs; ++i) {\n if (new Set(inputTerms[i].split('')).size !== inputTerms[i].length) {\n throw new Error(`Found duplicate axes in input component ${inputTerms[i]}. ` +\n `Support for duplicate axes in input is not implemented yet.`);\n }\n idDims[i] = [];\n for (let j = 0; j < inputTerms[i].length; ++j) {\n idDims[i].push(allDims.indexOf(inputTerms[i][j]));\n }\n }\n const numDims = allDims.length; // Number of unique dimensions.\n const numOutDims = outputString.length; // Number of output dimensions.\n const summedDims = []; // Dimensions being summed over.\n for (let i = numOutDims; i < numDims; ++i) {\n summedDims.push(i);\n }\n return { allDims, summedDims, idDims };\n}\n/**\n * Get the permutation for a given input tensor.\n *\n * @param nDims Total number of dimension of all tensors involved in the einsum\n * operation.\n * @param idDims Dimension indices involve in the tensor in question.\n * @returns An object consisting of the following fields:\n * - permutationIndices: Indices to permute the axes of the tensor with.\n * - expandDims: Indices to the dimension that need to be expanded from the\n * tensor after permutation.\n */\nexport function getEinsumPermutation(nDims, idDims) {\n let permutationIndices = new Array(nDims);\n permutationIndices.fill(-1);\n for (let i = 0; i < idDims.length; ++i) {\n permutationIndices[idDims[i]] = i;\n }\n const expandDims = [];\n for (let i = 0; i < nDims; ++i) {\n if (permutationIndices[i] === -1) {\n expandDims.push(i);\n }\n }\n permutationIndices = permutationIndices.filter(d => d !== -1);\n return { permutationIndices, expandDims };\n}\n/**\n * Checks that the dimension sizes from different input tensors match the\n * equation.\n */\nexport function checkEinsumDimSizes(nDims, idDims, tensors) {\n const dimSizes = new Array(nDims);\n for (let i = 0; i < tensors.length; ++i) {\n const shape = tensors[i].shape;\n for (let j = 0; j < idDims[i].length; ++j) {\n if (dimSizes[idDims[i][j]] === undefined) {\n dimSizes[idDims[i][j]] = shape[j];\n }\n else {\n assert(dimSizes[idDims[i][j]] === shape[j], () => `Expected dimension ${dimSizes[idDims[i][j]]} at axis ${j} ` +\n `of input shaped ${JSON.stringify(shape)}, ` +\n `but got dimension ${shape[j]}`);\n }\n }\n }\n}\n/**\n * Gets path of computation for einsum.\n *\n * @param summedDims indices to the dimensions being summed over.\n * @param idDims A look up table for the dimensions present in each input\n * tensor. Each consituent array contains indices for the dimensions in the\n * corresponding input tensor.\n *\n * @return A map with two fields:\n * - path: The path of computation, with each element indicating the dimension\n * being summed over after the element-wise multiplication in that step.\n * - steps: With the same length as `path`. Each element contains the indices\n * to the input tensors being used for element-wise multiplication in the\n * corresponding step.\n */\nexport function getEinsumComputePath(summedDims, idDims) {\n const path = summedDims;\n const steps = [];\n let nSteps = 0;\n if (summedDims.length === 0) {\n // Einsum that involes no summing: e.g., transpose and outer product.\n path.push(-1);\n }\n nSteps = summedDims.length + 1;\n for (let i = 0; i < nSteps; ++i) {\n steps.push([]);\n }\n const computedTermIndices = [];\n for (let i = 0; i < path.length; ++i) {\n const summedDim = path[i];\n const termIndices = findTermsWithDim(idDims, summedDim);\n for (const termIndex of termIndices) {\n if (computedTermIndices.indexOf(termIndex) === -1) {\n steps[i].push(termIndex);\n computedTermIndices.push(termIndex);\n }\n }\n }\n return { path, steps };\n}\n/** Determines if an axes permutation is the identity permutation. */\nexport function isIdentityPermutation(perm) {\n return perm.every((dim, index) => dim === index);\n}\nfunction findTermsWithDim(idDims, dim) {\n const termIndices = [];\n for (let i = 0; i < idDims.length; ++i) {\n if (idDims[i].length === 0 || idDims[i].indexOf(dim) !== -1 || dim === -1) {\n termIndices.push(i);\n }\n }\n return termIndices;\n}\n//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZWluc3VtX3V0aWwuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi8uLi90ZmpzLWNvcmUvc3JjL2JhY2tlbmRzL2VpbnN1bV91dGlsLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBOzs7Ozs7Ozs7Ozs7Ozs7R0FlRztBQVFILE9BQU8sRUFBQyxNQUFNLEVBQUMsTUFBTSxjQUFjLENBQUM7QUFFcEMsTUFBTSxLQUFLLEdBQUcsSUFBSSxDQUFDO0FBQ25CLE1BQU0sV0FBVyxHQUFHLEtBQUssQ0FBQztBQUMxQixNQUFNLEtBQUssR0FBRyxHQUFHLENBQUM7QUFDbEIsTUFBTSxRQUFRLEdBQUcsS0FBSyxDQUFDO0FBRXZCOzs7Ozs7Ozs7Ozs7R0FZRztBQUNILE1BQU0sVUFBVSxvQkFBb0IsQ0FBQyxRQUFnQixFQUFFLFVBQWtCO0lBS3ZFLFFBQVEsR0FBRyxRQUFRLENBQUMsT0FBTyxDQUFDLEtBQUssRUFBRSxFQUFFLENBQUMsQ0FBQyxDQUFFLGdDQUFnQztJQUN6RSxNQUFNLFNBQVMsR0FDWCxDQUFDLFFBQVEsQ0FBQyxNQUFNLEdBQUcsUUFBUSxDQUFDLE9BQU8sQ0FBQyxXQUFXLEVBQUUsRUFBRSxDQUFDLENBQUMsTUFBTSxDQUFDO1FBQzVELEtBQUssQ0FBQyxNQUFNLENBQUM7SUFDakIsSUFBSSxTQUFTLEdBQUcsQ0FBQyxFQUFFO1FBQ2pCLE1BQU0sSUFBSSxLQUFLLENBQUMsK0NBQStDLENBQUMsQ0FBQztLQUNsRTtTQUFNLElBQUksU0FBUyxHQUFHLENBQUMsRUFBRTtRQUN4QixNQUFNLElBQUksS0FBSyxDQUFDLDZDQUE2QyxLQUFLLEtBQUssQ0FBQyxDQUFDO0tBQzFFO0lBQ0QsTUFBTSxDQUFDLFdBQVcsRUFBRSxZQUFZLENBQUMsR0FBRyxRQUFRLENBQUMsS0FBSyxDQUFDLEtBQUssQ0FBQyxDQUFDO0lBQzFELE1BQU0sQ0FDRixXQUFXLENBQUMsT0FBTyxDQUFDLFFBQVEsQ0FBQyxLQUFLLENBQUMs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Q0FBQyxDQUFDO0FBQ25FLENBQUM7QUFFRCxTQUFTLGdCQUFnQixDQUFDLE1BQWtCLEVBQUUsR0FBVztJQUN2RCxNQUFNLFdBQVcsR0FBYSxFQUFFLENBQUM7SUFDakMsS0FBSyxJQUFJLENBQUMsR0FBRyxDQUFDLEVBQUUsQ0FBQyxHQUFHLE1BQU0sQ0FBQyxNQUFNLEVBQUUsRUFBRSxDQUFDLEVBQUU7UUFDdEMsSUFBSSxNQUFNLENBQUMsQ0FBQyxDQUFDLENBQUMsTUFBTSxLQUFLLENBQUMsSUFBSSxNQUFNLENBQUMsQ0FBQyxDQUFDLENBQUMsT0FBTyxDQUFDLEdBQUcsQ0FBQyxLQUFLLENBQUMsQ0FBQyxJQUFJLEdBQUcsS0FBSyxDQUFDLENBQUMsRUFBRTtZQUN6RSxXQUFXLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxDQUFDO1NBQ3JCO0tBQ0Y7SUFDRCxPQUFPLFdBQVcsQ0FBQztBQUNyQixDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiLyoqXG4gKiBAbGljZW5zZVxuICogQ29weXJpZ2h0IDIwMjEgR29vZ2xlIExMQy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC5cbiAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSBcIkxpY2Vuc2VcIik7XG4gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuXG4gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXRcbiAqXG4gKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjBcbiAqXG4gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlXG4gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiBcIkFTIElTXCIgQkFTSVMsXG4gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC5cbiAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmRcbiAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLlxuICogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbiAqL1xuXG4vKipcbiAqIFV0aWxpdHkgZnVuY3Rpb25zIGZvciBjb21wdXRpbmcgZWluc3VtICh0ZW5zb3IgY29udHJhY3Rpb24gYW5kIHN1bW1hdGlvblxuICogYmFzZWQgb24gRWluc3RlaW4gc3VtbWF0aW9uLilcbiAqL1xuXG5pbXBvcnQge1RlbnNvcn0gZnJvbSAnLi4vdGVuc29yJztcbmltcG9ydCB7YXNzZXJ0fSBmcm9tICcuLi91dGlsX2Jhc2UnO1xuXG5jb25zdCBBUlJPVyA9ICctPic7XG5jb25zdCBBUlJPV19SRUdFWCA9IC8tPi9nO1xuY29uc3QgQ09NTUEgPSAnLCc7XG5jb25zdCBFTExJUFNJUyA9ICcuLi4nO1xuXG4vKipcbiAqIFBhcnNlIGFuIGVxdWF0aW9uIGZvciBlaW5zdW0uXG4gKlxuICogQHBhcmFtIGVxdWF0aW9uIFRoZSBlaW5zdW0gZXF1YXRpb24gKGUuZy4sIFwiaWosamstPmlrXCIpLlxuICogQHBhcmFtIG51bVRlbnNvcnMgTnVtYmVyIG9mIHRlbnNvcnMgcHJvdmlkZWQgYWxvbmcgd2l0aCBgZXF1YXRpb25gLiBVc2VkIHRvXG4gKiAgIGNoZWNrIG1hdGNoaW5nIG51bWJlciBvZiBpbnB1dCB0ZW5zb3JzLlxuICogQHJldHVybnMgQW4gb2JqZWN0IGNvbnNpc3Rpbmcgb2YgdGhlIGZvbGxvd2luZyBmaWVsZHM6XG4gKiAgIC0gYWxsRGltczogYWxsIGRpbWVuc2lvbiBuYW1lcyBhcyBzdHJpbmdzLlxuICogICAtIHN1bW1lZERpbXM6IGEgbGlzdCBvZiBhbGwgZGltZW5zaW9ucyBiZWluZyBzdW1tZWQgb3ZlciwgYXMgaW5kaWNlcyB0b1xuICogICAgIHRoZSBlbGVtZW50cyBvZiBgYWxsRGltc2AuXG4gKiAgIC0gaWREaW1zOiBpbmRpY2VzIG9mIHRoZSBkaW1lbnNpb25zIGluIGVhY2ggaW5wdXQgdGVuc29yLCBhcyBpbmRpY2VzIHRvXG4gKiAgICAgdGhlIGVsZW1lbnRzIG9mIGBhbGxEaW1zLlxuICovXG5leHBvcnQgZnVuY3Rpb24gZGVjb2RlRWluc3VtRXF1YXRpb24oZXF1YXRpb246IHN0cmluZywgbnVtVGVuc29yczogbnVtYmVyKToge1xuICBhbGxEaW1zOiBzdHJpbmdbXSxcbiAgc3VtbWVkRGltczogbnVtYmVyW10sXG4gIGlkRGltczogbnVtYmVyW11bXSxcbn0ge1xuICBlcXVhdGlvbiA9IGVxdWF0aW9uLnJlcGxhY2UoL1xccy9nLCAnJyk7ICAvLyBSZW1vdmUgd2l0ZXNwYWNlIGluIGVxdWF0aW9uLlxuICBjb25zdCBudW1BcnJvd3MgPVxuICAgICAgKGVxdWF0aW9uLmxlbmd0aCAtIGVxdWF0aW9uLnJlcGxhY2UoQVJST1dfUkVHRVgsICcnKS5sZW5ndGgpIC9cbiAgICAgIEFSUk9XLmxlbmd0aDtcbiAgaWYgKG51bUFycm93cyA8IDEpIHtcbiAgICB0aHJvdyBuZXcgRXJyb3IoJ0VxdWF0aW9ucyB3aXRob3V0IGFuIGFycm93IGFyZSBub3Qgc3VwcG9ydGVkLicpO1xuICB9IGVsc2UgaWYgKG51bUFycm93cyA+IDEpIHtcbiAgICB0aHJvdyBuZXcgRXJyb3IoYEVxdWF0aW9uIG11c3QgY29udGFpbiBleGFjdGx5IG9uZSBhcnJvdyAoXCIke0FSUk9XfVwiKS5gKTtcbiAgfVxuICBjb25zdCBbaW5wdXRTdHJpbmcsIG91dHB1dFN0cmluZ10gPSBlcXVhdGlvbi5zcGxpdChBUlJPVyk7XG4gIGFzc2VydChcbiAgICAgIGlucHV0U3RyaW5nLmluZGV4T2YoRUxMSVBTSVMpID09PSAtMSxcbiAgICAgICgpID0+IGBUaGUgZWxsaXBzaXMgbm90YXRpb24gKFwiJHtFTExJUFNJU31cIikgaXMgbm90IHN1cHBvcnRlZCB5ZXQuYCk7XG4gIGNvbnN0IGlucHV0VGVybXMgPSBpbnB1dFN0cmluZy5zcGxpdChDT01NQSk7XG4gIGNvbnN0IG51bUlucHV0cyA9IGlucHV0VGVybXMubGVuZ3RoO1xuICBpZiAobnVtVGVuc29ycyAhPT0gbnVtSW5wdXRzKSB7XG4gICAgdGhyb3cgbmV3IEVycm9yKFxuICAgICAgICBgRXhwZWN0ZWQgJHtudW1JbnB1dHN9IGlucHV0IHRlbnNvcnMsIHJlY2VpdmVkICR7bnVtVGVuc29yc31gKTtcbiAgfVxuICBpZiAobnVtSW5wdXRzID4gMikge1xuICAgIHRocm93IG5ldyBFcnJvcihcbiAgICAgICAgJ1N1cHBvcnQgZm9yIG1vcmUgdGhhbiAyIGlucHV0IHRlbnNvcnMgaXMgbm90IGltcGxlbWVudGVkIHlldC4nKTtcbiAgfVxuXG4gIGNvbnN0IGFsbERpbXM6IHN0cmluZ1tdID0gW107XG4gIGZvciAobGV0IGkgPSAwOyBpIDwgb3V0cHV0U3RyaW5nLmxlbmd0aDsgKytpKSB7XG4gICAgY29uc3QgZGltTmFtZSA9IG91dHB1dFN0cmluZ1tpXTtcbiAgICBpZiAoIWlucHV0VGVybXMuc29tZShpbnB1dFRlcm0gPT4gaW5wdXRUZXJtLmluZGV4T2YoZGltTmFtZSkgIT09IC0xKSkge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKFxuICAgICAgICAgIGBPdXRwdXQgc3Vic2NyaXB0cyBjb250YWluIHRoZSBsYWJlbCAke2RpbU5hbWV9IGAgK1xuICAgICAgICAgIGBub3QgcHJlc2VudCBpbiB0aGUgaW5wdXQgc3Vic2NyaXB0cy5gKTtcbiAgICB9XG4gICAgaWYgKGFsbERpbXMuaW5kZXhPZihkaW1OYW1lKSA9PT0gLTEpIHtcbiAgICAgIGFsbERpbXMucHVzaChkaW1OYW1lKTtcbiAgICB9XG4gIH1cbiAgZm9yIChsZXQgaSA9IDA7IGkgPCBpbnB1dFN0cmluZy5sZW5ndGg7ICsraSkge1xuICAgIGNvbnN0IGRpbU5hbWUgPSBpbnB1dFN0cmluZ1tpXTtcbiAgICBpZiAoYWxsRGltcy5pbmRleE9mKGRpbU5hbWUpID09PSAtMSAmJiBkaW1OYW1lICE9PSBDT01NQSkge1xuICAgICAgYWxsRGltcy5wdXNoKGRpbU5hbWUpO1xuICAgIH1cbiAgfVxuXG4gIGNvbnN0IGlkRGltczogbnVtYmVyW11bXSA9IG5ldyBBcnJheTxudW1iZXJbXT4oaW5wdXRUZXJtcy5sZW5ndGgpO1xuICBmb3IgKGxldCBpID0gMDsgaSA8IG51bUlucHV0czsgKytpKSB7XG4gICAgaWYgKG5ldyBTZXQoaW5wdXRUZXJtc1tpXS5zcGxpdCgnJykpLnNpemUgIT09IGlucHV0VGVybXNbaV0ubGVuZ3RoKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoXG4gICAgICAgICAgYEZvdW5kIGR1cGxpY2F0ZSBheGVzIGluIGlucHV0IGNvbXBvbmVudCAke2lucHV0VGVybXNbaV19LiBgICtcbiAgICAgICAgICBgU3VwcG9ydCBmb3IgZHVwbGljYXRlIGF4ZXMgaW4gaW5wdXQgaXMgbm90IGltcGxlbWVudGVkIHlldC5gKTtcbiAgICB9XG4gICAgaWREaW1zW2ldID0gW107XG4gICAgZm9yIChsZXQgaiA9IDA7IGogPCBpbnB1dFRlcm1zW2ldLmxlbmd0aDsgKytqKSB7XG4gICAgICBpZERpbXNbaV0ucHVzaChhbGxEaW1zLmluZGV4T2YoaW5wdXRUZXJtc1tpXVtqXSkpO1xuICAgIH1cbiAgfVxuXG4gIGNvbnN0IG51bURpbXMgPSBhbGxEaW1zLmxlbmd0aDsgICAgICAgICAgLy8gTnVtYmVyIG9mIHVuaXF1ZSBkaW1lbnNpb25zLlxuICBjb25zdCBudW1PdXREaW1zID0gb3V0cHV0U3RyaW5nLmxlbmd0aDsgIC8vIE51bWJlciBvZiBvdXRwdXQgZGltZW5zaW9ucy5cbiAgY29uc3Qgc3VtbWVkRGltczogbnVtYmVyW10gPSBbXTsgICAgICAgICAvLyBEaW1lbnNpb25zIGJlaW5nIHN1bW1lZCBvdmVyLlxuICBmb3IgKGxldCBpID0gbnVtT3V0RGltczsgaSA8IG51bURpbXM7ICsraSkge1xuICAgIHN1bW1lZERpbXMucHVzaChpKTtcbiAgfVxuICByZXR1cm4ge2FsbERpbXMsIHN1bW1lZERpbXMsIGlkRGltc307XG59XG5cbi8qKlxuICogR2V0IHRoZSBwZXJtdXRhdGlvbiBmb3IgYSBnaXZlbiBpbnB1dCB0ZW5zb3IuXG4gKlxuICogQHBhcmFtIG5EaW1zIFRvdGFsIG51bWJlciBvZiBkaW1lbnNpb24gb2YgYWxsIHRlbnNvcnMgaW52b2x2ZWQgaW4gdGhlIGVpbnN1bVxuICogICBvcGVyYXRpb24uXG4gKiBAcGFyYW0gaWREaW1zIERpbWVuc2lvbiBpbmRpY2VzIGludm9sdmUgaW4gdGhlIHRlbnNvciBpbiBxdWVzdGlvbi5cbiAqIEByZXR1cm5zIEFuIG9iamVjdCBjb25zaXN0aW5nIG9mIHRoZSBmb2xsb3dpbmcgZmllbGRzOlxuICogICAtIHBlcm11dGF0aW9uSW5kaWNlczogSW5kaWNlcyB0byBwZXJtdXRlIHRoZSBheGVzIG9mIHRoZSB0ZW5zb3Igd2l0aC5cbiAqICAgLSBleHBhbmREaW1zOiBJbmRpY2VzIHRvIHRoZSBkaW1lbnNpb24gdGhhdCBuZWVkIHRvIGJlIGV4cGFuZGVkIGZyb20gdGhlXG4gKiAgICAgdGVuc29yIGFmdGVyIHBlcm11dGF0aW9uLlxuICovXG5leHBvcnQgZnVuY3Rpb24gZ2V0RWluc3VtUGVybXV0YXRpb24obkRpbXM6IG51bWJlciwgaWREaW1zOiBudW1iZXJbXSk6XG4gICAge3Blcm11dGF0aW9uSW5kaWNlczogbnVtYmVyW10sIGV4cGFuZERpbXM6IG51bWJlcltdfSB7XG4gIGxldCBwZXJtdXRhdGlvbkluZGljZXM6IG51bWJlcltdID0gbmV3IEFycmF5PG51bWJlcj4obkRpbXMpO1xuICBwZXJtdXRhdGlvbkluZGljZXMuZmlsbCgtMSk7XG4gIGZvciAobGV0IGkgPSAwOyBpIDwgaWREaW1zLmxlbmd0aDsgKytpKSB7XG4gICAgcGVybXV0YXRpb25JbmRpY2VzW2lkRGltc1tpXV0gPSBpO1xuICB9XG4gIGNvbnN0IGV4cGFuZERpbXM6IG51bWJlcltdID0gW107XG4gIGZvciAobGV0IGkgPSAwOyBpIDwgbkRpbXM7ICsraSkge1xuICAgIGlmIChwZXJtdXRhdGlvbkluZGljZXNbaV0gPT09IC0xKSB7XG4gICAgICBleHBhbmREaW1zLnB1c2goaSk7XG4gICAgfVxuICB9XG4gIHBlcm11dGF0aW9uSW5kaWNlcyA9IHBlcm11dGF0aW9uSW5kaWNlcy5maWx0ZXIoZCA9PiBkICE9PSAtMSk7XG4gIHJldHVybiB7cGVybXV0YXRpb25JbmRpY2VzLCBleHBhbmREaW1zfTtcbn1cblxuLyoqXG4gKiBDaGVja3MgdGhhdCB0aGUgZGltZW5zaW9uIHNpemVzIGZyb20gZGlmZmVyZW50IGlucHV0IHRlbnNvcnMgbWF0Y2ggdGhlXG4gKiBlcXVhdGlvbi5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGNoZWNrRWluc3VtRGltU2l6ZXMoXG4gICAgbkRpbXM6IG51bWJlciwgaWREaW1zOiBudW1iZXJbXVtdLCB0ZW5zb3JzOiBUZW5zb3JbXSkge1xuICBjb25zdCBkaW1TaXplczogbnVtYmVyW10gPSBuZXcgQXJyYXk8bnVtYmVyPihuRGltcyk7XG4gIGZvciAobGV0IGkgPSAwOyBpIDwgdGVuc29ycy5sZW5ndGg7ICsraSkge1xuICAgIGNvbnN0IHNoYXBlOiBudW1iZXJbXSA9IHRlbnNvcnNbaV0uc2hhcGU7XG4gICAgZm9yIChsZXQgaiA9IDA7IGogPCBpZERpbXNbaV0ubGVuZ3RoOyArK2opIHtcbiAgICAgIGlmIChkaW1TaXplc1tpZERpbXNbaV1bal1dID09PSB1bmRlZmluZWQpIHtcbiAgICAgICAgZGltU2l6ZXNbaWREaW1zW2ldW2pdXSA9IHNoYXBlW2pdO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgYXNzZXJ0KFxuICAgICAgICAgICAgZGltU2l6ZXNbaWREaW1zW2ldW2pdXSA9PT0gc2hhcGVbal0sXG4gICAgICAgICAgICAoKSA9PiBgRXhwZWN0ZWQgZGltZW5zaW9uICR7ZGltU2l6ZXNbaWREaW1zW2ldW2pdXX0gYXQgYXhpcyAke2p9IGAgK1xuICAgICAgICAgICAgICAgIGBvZiBpbnB1dCBzaGFwZWQgJHtKU09OLnN0cmluZ2lmeShzaGFwZSl9LCBgICtcbiAgICAgICAgICAgICAgICBgYnV0IGdvdCBkaW1lbnNpb24gJHtzaGFwZVtqXX1gKTtcbiAgICAgIH1cbiAgICB9XG4gIH1cbn1cblxuLyoqXG4gKiBHZXRzIHBhdGggb2YgY29tcHV0YXRpb24gZm9yIGVpbnN1bS5cbiAqXG4gKiBAcGFyYW0gc3VtbWVkRGltcyBpbmRpY2VzIHRvIHRoZSBkaW1lbnNpb25zIGJlaW5nIHN1bW1lZCBvdmVyLlxuICogQHBhcmFtIGlkRGltcyBBIGxvb2sgdXAgdGFibGUgZm9yIHRoZSBkaW1lbnNpb25zIHByZXNlbnQgaW4gZWFjaCBpbnB1dFxuICogICAgIHRlbnNvci4gRWFjaCBjb25zaXR1ZW50IGFycmF5IGNvbnRhaW5zIGluZGljZXMgZm9yIHRoZSBkaW1lbnNpb25zIGluIHRoZVxuICogICAgIGNvcnJlc3BvbmRpbmcgaW5wdXQgdGVuc29yLlxuICpcbiAqIEByZXR1cm4gQSBtYXAgd2l0aCB0d28gZmllbGRzOlxuICogICAtIHBhdGg6IFRoZSBwYXRoIG9mIGNvbXB1dGF0aW9uLCB3aXRoIGVhY2ggZWxlbWVudCBpbmRpY2F0aW5nIHRoZSBkaW1lbnNpb25cbiAqICAgICBiZWluZyBzdW1tZWQgb3ZlciBhZnRlciB0aGUgZWxlbWVudC13aXNlIG11bHRpcGxpY2F0aW9uIGluIHRoYXQgc3RlcC5cbiAqICAgLSBzdGVwczogV2l0aCB0aGUgc2FtZSBsZW5ndGggYXMgYHBhdGhgLiBFYWNoIGVsZW1lbnQgY29udGFpbnMgdGhlIGluZGljZXNcbiAqICAgICB0byB0aGUgaW5wdXQgdGVuc29ycyBiZWluZyB1c2VkIGZvciBlbGVtZW50LXdpc2UgbXVsdGlwbGljYXRpb24gaW4gdGhlXG4gKiAgICAgY29ycmVzcG9uZGluZyBzdGVwLlxuICovXG5leHBvcnQgZnVuY3Rpb24gZ2V0RWluc3VtQ29tcHV0ZVBhdGgoc3VtbWVkRGltczogbnVtYmVyW10sIGlkRGltczogbnVtYmVyW11bXSk6XG4gICAge3BhdGg6IG51bWJlcltdLCBzdGVwczogbnVtYmVyW11bXX0ge1xuICBjb25zdCBwYXRoOiBudW1iZXJbXSA9IHN1bW1lZERpbXM7XG4gIGNvbnN0IHN0ZXBzOiBudW1iZXJbXVtdID0gW107XG4gIGxldCBuU3RlcHMgPSAwO1xuICBpZiAoc3VtbWVkRGltcy5sZW5ndGggPT09IDApIHtcbiAgICAvLyBFaW5zdW0gdGhhdCBpbnZvbGVzIG5vIHN1bW1pbmc6IGUuZy4sIHRyYW5zcG9zZSBhbmQgb3V0ZXIgcHJvZHVjdC5cbiAgICBwYXRoLnB1c2goLTEpO1xuICB9XG4gIG5TdGVwcyA9IHN1bW1lZERpbXMubGVuZ3RoICsgMTtcbiAgZm9yIChsZXQgaSA9IDA7IGkgPCBuU3RlcHM7ICsraSkge1xuICAgIHN0ZXBzLnB1c2goW10pO1xuICB9XG4gIGNvbnN0IGNvbXB1dGVkVGVybUluZGljZXM6IG51bWJlcltdID0gW107XG4gIGZvciAobGV0IGkgPSAwOyBpIDwgcGF0aC5sZW5ndGg7ICsraSkge1xuICAgIGNvbnN0IHN1bW1lZERpbSA9IHBhdGhbaV07XG4gICAgY29uc3QgdGVybUluZGljZXMgPSBmaW5kVGVybXNXaXRoRGltKGlkRGltcywgc3VtbWVkRGltKTtcbiAgICBmb3IgKGNvbnN0IHRlcm1JbmRleCBvZiB0ZXJtSW5kaWNlcykge1xuICAgICAgaWYgKGNvbXB1dGVkVGVybUluZGljZXMuaW5kZXhPZih0ZXJtSW5kZXgpID09PSAtMSkge1xuICAgICAgICBzdGVwc1tpXS5wdXNoKHRlcm1JbmRleCk7XG4gICAgICAgIGNvbXB1dGVkVGVybUluZGljZXMucHVzaCh0ZXJtSW5kZXgpO1xuICAgICAgfVxuICAgIH1cbiAgfVxuICByZXR1cm4ge3BhdGgsIHN0ZXBzfTtcbn1cblxuLyoqIERldGVybWluZXMgaWYgYW4gYXhlcyBwZXJtdXRhdGlvbiBpcyB0aGUgaWRlbnRpdHkgcGVybXV0YXRpb24uICovXG5leHBvcnQgZnVuY3Rpb24gaXNJZGVudGl0eVBlcm11dGF0aW9uKHBlcm06IG51bWJlcltdKTogYm9vbGVhbiB7XG4gIHJldHVybiBwZXJtLmV2ZXJ5KChkaW06IG51bWJlciwgaW5kZXg6IG51bWJlcikgPT4gZGltID09PSBpbmRleCk7XG59XG5cbmZ1bmN0aW9uIGZpbmRUZXJtc1dpdGhEaW0oaWREaW1zOiBudW1iZXJbXVtdLCBkaW06IG51bWJlcik6IG51bWJlcltdIHtcbiAgY29uc3QgdGVybUluZGljZXM6IG51bWJlcltdID0gW107XG4gIGZvciAobGV0IGkgPSAwOyBpIDwgaWREaW1zLmxlbmd0aDsgKytpKSB7XG4gICAgaWYgKGlkRGltc1tpXS5sZW5ndGggPT09IDAgfHwgaWREaW1zW2ldLmluZGV4T2YoZGltKSAhPT0gLTEgfHwgZGltID09PSAtMSkge1xuICAgICAgdGVybUluZGljZXMucHVzaChpKTtcbiAgICB9XG4gIH1cbiAgcmV0dXJuIHRlcm1JbmRpY2VzO1xufVxuIl19","import { assert } from '../util';\n/**\n * Prepare the split size array. When the input is a number, the axis is evenly\n * divided among the split size. When the input contains the negative value, the\n * rest of the axis is allocated toward that.\n */\nexport function prepareSplitSize(x, numOrSizeSplits, axis = 0) {\n let splitSizes = [];\n if (typeof (numOrSizeSplits) === 'number') {\n assert(x.shape[axis] % numOrSizeSplits === 0, () => 'Number of splits must evenly divide the axis.');\n splitSizes =\n new Array(numOrSizeSplits).fill(x.shape[axis] / numOrSizeSplits);\n }\n else {\n const numOfNegs = numOrSizeSplits.reduce((count, value) => {\n if (value === -1) {\n count += 1;\n }\n return count;\n }, 0);\n assert(numOfNegs <= 1, () => 'There should be only one negative value in split array.');\n const negIndex = numOrSizeSplits.indexOf(-1);\n // Allow the number of split array to be -1, which indicates the rest\n // of dimension is allocated to that split.\n if (negIndex !== -1) {\n const total = numOrSizeSplits.reduce((a, b) => b > 0 ? a + b : a);\n numOrSizeSplits[negIndex] = x.shape[axis] - total;\n }\n assert(x.shape[axis] === numOrSizeSplits.reduce((a, b) => a + b), () => 'The sum of sizes must match the size of the axis dimension.');\n splitSizes = numOrSizeSplits;\n }\n return splitSizes;\n}\n//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic3BsaXRfdXRpbC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uLy4uL3RmanMtY29yZS9zcmMvb3BzL3NwbGl0X3V0aWwudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBa0JBLE9BQU8sRUFBQyxNQUFNLEVBQUMsTUFBTSxTQUFTLENBQUM7QUFFL0I7Ozs7R0FJRztBQUNILE1BQU0sVUFBVSxnQkFBZ0IsQ0FDNUIsQ0FBb0IsRUFBRSxlQUFnQyxFQUN0RCxJQUFJLEdBQUcsQ0FBQztJQUNWLElBQUksVUFBVSxHQUFHLEVBQUUsQ0FBQztJQUNwQixJQUFJLE9BQU8sQ0FBQyxlQUFlLENBQUMsS0FBSyxRQUFRLEVBQUU7UUFDekMsTUFBTSxDQUNGLENBQUMsQ0FBQyxLQUFLLENBQUMsSUFBSSxDQUFDLEdBQUcsZUFBZSxLQUFLLENBQUMsRUFDckMsR0FBRyxFQUFFLENBQUMsK0NBQStDLENBQUMsQ0FBQztRQUMzRCxVQUFVO1lBQ04sSUFBSSxLQUFLLENBQUMsZUFBZSxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxLQUFLLENBQUMsSUFBSSxDQUFDLEdBQUcsZUFBZSxDQUFDLENBQUM7S0FDdEU7U0FBTTtRQUNMLE1BQU0sU0FBUyxHQUFHLGVBQWUsQ0FBQyxNQUFNLENBQUMsQ0FBQyxLQUFLLEVBQUUsS0FBSyxFQUFFLEVBQUU7WUFDeEQsSUFBSSxLQUFLLEtBQUssQ0FBQyxDQUFDLEVBQUU7Z0JBQ2hCLEtBQUssSUFBSSxDQUFDLENBQUM7YUFDWjtZQUNELE9BQU8sS0FBSyxDQUFDO1FBQ2YsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDO1FBQ04sTUFBTSxDQUNGLFNBQVMsSUFBSSxDQUFDLEVBQ2QsR0FBRyxFQUFFLENBQUMseURBQXlELENBQUMsQ0FBQztRQUNyRSxNQUFNLFFBQVEsR0FBRyxlQUFlLENBQUMsT0FBTyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUM7UUFDN0MscUVBQXFFO1FBQ3JFLDJDQUEyQztRQUMzQyxJQUFJLFFBQVEsS0FBSyxDQUFDLENBQUMsRUFBRTtZQUNuQixNQUFNLEtBQUssR0FBRyxlQUFlLENBQUMsTUFBTSxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsRUFBRSxFQUFFLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUM7WUFDbEUsZUFBZSxDQUFDLFFBQVEsQ0FBQyxHQUFHLENBQUMsQ0FBQyxLQUFLLENBQUMsSUFBSSxDQUFDLEdBQUcsS0FBSyxDQUFDO1NBQ25EO1FBQ0QsTUFBTSxDQUNGLENBQUMsQ0FBQyxLQUFLLENBQUMsSUFBSSxDQUFDLEtBQUssZUFBZSxDQUFDLE1BQU0sQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLEVBQUUsRUFBRSxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsRUFDekQsR0FBRyxFQUFFLENBQUMsNkRBQTZELENBQUMsQ0FBQztRQUN6RSxVQUFVLEdBQUcsZUFBZSxDQUFDO0tBQzlCO0lBRUQsT0FBTyxVQUFVLENBQUM7QUFDcEIsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbIi8qKlxuICogQGxpY2Vuc2VcbiAqIENvcHlyaWdodCAyMDIwIEdvb2dsZSBMTEMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuXG4gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgXCJMaWNlbnNlXCIpO1xuICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLlxuICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0XG4gKlxuICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wXG4gKlxuICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZVxuICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gXCJBUyBJU1wiIEJBU0lTLFxuICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuXG4gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kXG4gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS5cbiAqID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4gKi9cbmltcG9ydCB7VGVuc29ySW5mb30gZnJvbSAnLi4va2VybmVsX3JlZ2lzdHJ5JztcbmltcG9ydCB7VGVuc29yfSBmcm9tICcuLi90ZW5zb3InO1xuaW1wb3J0IHthc3NlcnR9IGZyb20gJy4uL3V0aWwnO1xuXG4vKipcbiAqIFByZXBhcmUgdGhlIHNwbGl0IHNpemUgYXJyYXkuIFdoZW4gdGhlIGlucHV0IGlzIGEgbnVtYmVyLCB0aGUgYXhpcyBpcyBldmVubHlcbiAqIGRpdmlkZWQgYW1vbmcgdGhlIHNwbGl0IHNpemUuIFdoZW4gdGhlIGlucHV0IGNvbnRhaW5zIHRoZSBuZWdhdGl2ZSB2YWx1ZSwgdGhlXG4gKiByZXN0IG9mIHRoZSBheGlzIGlzIGFsbG9jYXRlZCB0b3dhcmQgdGhhdC5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHByZXBhcmVTcGxpdFNpemUoXG4gICAgeDogVGVuc29yfFRlbnNvckluZm8sIG51bU9yU2l6ZVNwbGl0czogbnVtYmVyW118bnVtYmVyLFxuICAgIGF4aXMgPSAwKTogbnVtYmVyW10ge1xuICBsZXQgc3BsaXRTaXplcyA9IFtdO1xuICBpZiAodHlwZW9mIChudW1PclNpemVTcGxpdHMpID09PSAnbnVtYmVyJykge1xuICAgIGFzc2VydChcbiAgICAgICAgeC5zaGFwZVtheGlzXSAlIG51bU9yU2l6ZVNwbGl0cyA9PT0gMCxcbiAgICAgICAgKCkgPT4gJ051bWJlciBvZiBzcGxpdHMgbXVzdCBldmVubHkgZGl2aWRlIHRoZSBheGlzLicpO1xuICAgIHNwbGl0U2l6ZXMgPVxuICAgICAgICBuZXcgQXJyYXkobnVtT3JTaXplU3BsaXRzKS5maWxsKHguc2hhcGVbYXhpc10gLyBudW1PclNpemVTcGxpdHMpO1xuICB9IGVsc2Uge1xuICAgIGNvbnN0IG51bU9mTmVncyA9IG51bU9yU2l6ZVNwbGl0cy5yZWR1Y2UoKGNvdW50LCB2YWx1ZSkgPT4ge1xuICAgICAgaWYgKHZhbHVlID09PSAtMSkge1xuICAgICAgICBjb3VudCArPSAxO1xuICAgICAgfVxuICAgICAgcmV0dXJuIGNvdW50O1xuICAgIH0sIDApO1xuICAgIGFzc2VydChcbiAgICAgICAgbnVtT2ZOZWdzIDw9IDEsXG4gICAgICAgICgpID0+ICdUaGVyZSBzaG91bGQgYmUgb25seSBvbmUgbmVnYXRpdmUgdmFsdWUgaW4gc3BsaXQgYXJyYXkuJyk7XG4gICAgY29uc3QgbmVnSW5kZXggPSBudW1PclNpemVTcGxpdHMuaW5kZXhPZigtMSk7XG4gICAgLy8gQWxsb3cgdGhlIG51bWJlciBvZiBzcGxpdCBhcnJheSB0byBiZSAtMSwgd2hpY2ggaW5kaWNhdGVzIHRoZSByZXN0XG4gICAgLy8gb2YgZGltZW5zaW9uIGlzIGFsbG9jYXRlZCB0byB0aGF0IHNwbGl0LlxuICAgIGlmIChuZWdJbmRleCAhPT0gLTEpIHtcbiAgICAgIGNvbnN0IHRvdGFsID0gbnVtT3JTaXplU3BsaXRzLnJlZHVjZSgoYSwgYikgPT4gYiA+IDAgPyBhICsgYiA6IGEpO1xuICAgICAgbnVtT3JTaXplU3BsaXRzW25lZ0luZGV4XSA9IHguc2hhcGVbYXhpc10gLSB0b3RhbDtcbiAgICB9XG4gICAgYXNzZXJ0KFxuICAgICAgICB4LnNoYXBlW2F4aXNdID09PSBudW1PclNpemVTcGxpdHMucmVkdWNlKChhLCBiKSA9PiBhICsgYiksXG4gICAgICAgICgpID0+ICdUaGUgc3VtIG9mIHNpemVzIG11c3QgbWF0Y2ggdGhlIHNpemUgb2YgdGhlIGF4aXMgZGltZW5zaW9uLicpO1xuICAgIHNwbGl0U2l6ZXMgPSBudW1PclNpemVTcGxpdHM7XG4gIH1cblxuICByZXR1cm4gc3BsaXRTaXplcztcbn1cbiJdfQ==","/**\n * @license\n * Copyright 2021 Google LLC. All Rights Reserved.\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n * =============================================================================\n */\n/**\n * Generates sparse fill empty rows indices, dense shape mismatch error message.\n *\n * @param indicesLength The first dimension of indices.\n */\nexport function getSparseFillEmptyRowsIndicesDenseShapeMismatch(indicesLength) {\n return `Received SparseTensor with denseShape[0] = 0 but\n indices.shape[0] = ${indicesLength}`;\n}\n/**\n * Generates sparse fill empty rows negative index error message.\n *\n * @param index The index with a negative value.\n * @param value The negative value.\n */\nexport function getSparseFillEmptyRowsNegativeIndexErrorMessage(index, value) {\n return `indices(${index}, 0) is invalid: ${value} < 0`;\n}\n/**\n * Generates sparse fill empty rows out of range index error message.\n *\n * @param index The index with an out of range value.\n * @param value The out of range value.\n * @param limit The upper limit for indices.\n */\nexport function getSparseFillEmptyRowsOutOfRangeIndexErrorMessage(index, value, limit) {\n return `indices(${index}, 0) is invalid: ${value} >= ${limit}`;\n}\n//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic3BhcnNlX2ZpbGxfZW1wdHlfcm93c191dGlsLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vLi4vLi4vdGZqcy1jb3JlL3NyYy9vcHMvc3BhcnNlL3NwYXJzZV9maWxsX2VtcHR5X3Jvd3NfdXRpbC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQTs7Ozs7Ozs7Ozs7Ozs7O0dBZUc7QUFFSDs7OztHQUlHO0FBQ0gsTUFBTSxVQUFVLCtDQUErQyxDQUMzRCxhQUFxQjtJQUN2QixPQUFPO3VCQUNjLGFBQWEsRUFBRSxDQUFDO0FBQ3ZDLENBQUM7QUFFRDs7Ozs7R0FLRztBQUNILE1BQU0sVUFBVSwrQ0FBK0MsQ0FDM0QsS0FBYSxFQUFFLEtBQWE7SUFDOUIsT0FBTyxXQUFXLEtBQUssb0JBQW9CLEtBQUssTUFBTSxDQUFDO0FBQ3pELENBQUM7QUFFRDs7Ozs7O0dBTUc7QUFDSCxNQUFNLFVBQVUsaURBQWlELENBQzdELEtBQWEsRUFBRSxLQUFhLEVBQUUsS0FBYTtJQUM3QyxPQUFPLFdBQVcsS0FBSyxvQkFBb0IsS0FBSyxPQUFPLEtBQUssRUFBRSxDQUFDO0FBQ2pFLENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyIvKipcbiAqIEBsaWNlbnNlXG4gKiBDb3B5cmlnaHQgMjAyMSBHb29nbGUgTExDLiBBbGwgUmlnaHRzIFJlc2VydmVkLlxuICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlIFwiTGljZW5zZVwiKTtcbiAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS5cbiAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdFxuICpcbiAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMFxuICpcbiAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmVcbiAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuIFwiQVMgSVNcIiBCQVNJUyxcbiAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLlxuICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZFxuICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuXG4gKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuICovXG5cbi8qKlxuICogR2VuZXJhdGVzIHNwYXJzZSBmaWxsIGVtcHR5IHJvd3MgaW5kaWNlcywgZGVuc2Ugc2hhcGUgbWlzbWF0Y2ggZXJyb3IgbWVzc2FnZS5cbiAqXG4gKiBAcGFyYW0gaW5kaWNlc0xlbmd0aCBUaGUgZmlyc3QgZGltZW5zaW9uIG9mIGluZGljZXMuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBnZXRTcGFyc2VGaWxsRW1wdHlSb3dzSW5kaWNlc0RlbnNlU2hhcGVNaXNtYXRjaChcbiAgICBpbmRpY2VzTGVuZ3RoOiBudW1iZXIpIHtcbiAgcmV0dXJuIGBSZWNlaXZlZCBTcGFyc2VUZW5zb3Igd2l0aCBkZW5zZVNoYXBlWzBdID0gMCBidXRcbiAgaW5kaWNlcy5zaGFwZVswXSA9ICR7aW5kaWNlc0xlbmd0aH1gO1xufVxuXG4vKipcbiAqIEdlbmVyYXRlcyBzcGFyc2UgZmlsbCBlbXB0eSByb3dzIG5lZ2F0aXZlIGluZGV4IGVycm9yIG1lc3NhZ2UuXG4gKlxuICogQHBhcmFtIGluZGV4IFRoZSBpbmRleCB3aXRoIGEgbmVnYXRpdmUgdmFsdWUuXG4gKiBAcGFyYW0gdmFsdWUgVGhlIG5lZ2F0aXZlIHZhbHVlLlxuICovXG5leHBvcnQgZnVuY3Rpb24gZ2V0U3BhcnNlRmlsbEVtcHR5Um93c05lZ2F0aXZlSW5kZXhFcnJvck1lc3NhZ2UoXG4gICAgaW5kZXg6IG51bWJlciwgdmFsdWU6IG51bWJlcikge1xuICByZXR1cm4gYGluZGljZXMoJHtpbmRleH0sIDApIGlzIGludmFsaWQ6ICR7dmFsdWV9IDwgMGA7XG59XG5cbi8qKlxuICogR2VuZXJhdGVzIHNwYXJzZSBmaWxsIGVtcHR5IHJvd3Mgb3V0IG9mIHJhbmdlIGluZGV4IGVycm9yIG1lc3NhZ2UuXG4gKlxuICogQHBhcmFtIGluZGV4IFRoZSBpbmRleCB3aXRoIGFuIG91dCBvZiByYW5nZSB2YWx1ZS5cbiAqIEBwYXJhbSB2YWx1ZSBUaGUgb3V0IG9mIHJhbmdlIHZhbHVlLlxuICogQHBhcmFtIGxpbWl0IFRoZSB1cHBlciBsaW1pdCBmb3IgaW5kaWNlcy5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGdldFNwYXJzZUZpbGxFbXB0eVJvd3NPdXRPZlJhbmdlSW5kZXhFcnJvck1lc3NhZ2UoXG4gICAgaW5kZXg6IG51bWJlciwgdmFsdWU6IG51bWJlciwgbGltaXQ6IG51bWJlcikge1xuICByZXR1cm4gYGluZGljZXMoJHtpbmRleH0sIDApIGlzIGludmFsaWQ6ICR7dmFsdWV9ID49ICR7bGltaXR9YDtcbn1cbiJdfQ==","/**\n * @license\n * Copyright 2021 Google LLC. All Rights Reserved.\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n * =============================================================================\n */\nimport { sizeFromShape } from '../../util';\n/**\n * Generates sparse reshape multiple negative 1 output dimension error message.\n *\n * @param dim1 The first dimension with a negative 1 value.\n * @param dim2 The second dimension with a negative 1 value.\n */\nexport function getSparseReshapeMultipleNegativeOneOutputDimErrorMessage(dim1, dim2) {\n return `only one output dimension may be -1, not both ${dim1} and ${dim2}`;\n}\n/**\n * Generates sparse reshape negative output dimension error message.\n *\n * @param dim The dimension with a negative value.\n * @param value The negative value.\n */\nexport function getSparseReshapeNegativeOutputDimErrorMessage(dim, value) {\n return `size ${dim} must be non-negative, not ${value}`;\n}\n/**\n * Generates sparse reshape empty tensor zero output dimension error message.\n *\n */\nexport function getSparseReshapeEmptyTensorZeroOutputDimErrorMessage() {\n return 'reshape cannot infer the missing input size for an empty tensor ' +\n 'unless all specified input sizes are non-zero';\n}\n/**\n * Generates sparse reshape input output multiple mismatch error message.\n *\n * @param inputShape the input shape.\n * @param outputShape the requested output shape.\n */\nexport function getSparseReshapeInputOutputMultipleErrorMessage(inputShape, outputShape) {\n const inputSize = sizeFromShape(inputShape);\n const outputSize = sizeFromShape(outputShape);\n return `Input to reshape is a SparseTensor with ${inputSize}\n dense values, but the requested shape requires a multiple of ${outputSize}. inputShape=${inputShape} outputShape= ${outputShape}`;\n}\n/**\n * Generates sparse reshape input output inequality error message.\n *\n * @param inputShape the input shape.\n * @param outputShape the requested output shape.\n */\nexport function getSparseReshapeInputOutputMismatchErrorMessage(inputShape, outputShape) {\n const inputSize = sizeFromShape(inputShape);\n const outputSize = sizeFromShape(outputShape);\n return `Input to reshape is a tensor with ${inputSize} dense values, but the requested shape has ${outputSize}. inputShape=${inputShape} outputShape=${outputShape}`;\n}\n//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic3BhcnNlX3Jlc2hhcGVfdXRpbC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uLy4uLy4uL3RmanMtY29yZS9zcmMvb3BzL3NwYXJzZS9zcGFyc2VfcmVzaGFwZV91dGlsLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBOzs7Ozs7Ozs7Ozs7Ozs7R0FlRztBQUNILE9BQU8sRUFBQyxhQUFhLEVBQUMsTUFBTSxZQUFZLENBQUM7QUFFekM7Ozs7O0dBS0c7QUFDSCxNQUFNLFVBQVUsd0RBQXdELENBQ3BFLElBQVksRUFBRSxJQUFZO0lBQzVCLE9BQU8saURBQWlELElBQUksUUFBUSxJQUFJLEVBQUUsQ0FBQztBQUM3RSxDQUFDO0FBRUQ7Ozs7O0dBS0c7QUFDSCxNQUFNLFVBQVUsNkNBQTZDLENBQ3pELEdBQVcsRUFBRSxLQUFhO0lBQzVCLE9BQU8sUUFBUSxHQUFHLDhCQUE4QixLQUFLLEVBQUUsQ0FBQztBQUMxRCxDQUFDO0FBRUQ7OztHQUdHO0FBQ0gsTUFBTSxVQUFVLG9EQUFvRDtJQUNsRSxPQUFPLGtFQUFrRTtRQUNyRSwrQ0FBK0MsQ0FBQztBQUN0RCxDQUFDO0FBRUQ7Ozs7O0dBS0c7QUFDSCxNQUFNLFVBQVUsK0NBQStDLENBQzNELFVBQW9CLEVBQUUsV0FBcUI7SUFDN0MsTUFBTSxTQUFTLEdBQUcsYUFBYSxDQUFDLFVBQVUsQ0FBQyxDQUFDO0lBQzVDLE1BQU0sVUFBVSxHQUFHLGFBQWEsQ0FBQyxXQUFXLENBQUMsQ0FBQztJQUM5QyxPQUFPLDJDQUEyQyxTQUFTO2lFQUV2RCxVQUFVLGdCQUFnQixVQUFVLGlCQUFpQixXQUFXLEVBQUUsQ0FBQztBQUN6RSxDQUFDO0FBRUQ7Ozs7O0dBS0c7QUFDSCxNQUFNLFVBQVUsK0NBQStDLENBQzNELFVBQW9CLEVBQUUsV0FBcUI7SUFDN0MsTUFBTSxTQUFTLEdBQUcsYUFBYSxDQUFDLFVBQVUsQ0FBQyxDQUFDO0lBQzVDLE1BQU0sVUFBVSxHQUFHLGFBQWEsQ0FBQyxXQUFXLENBQUMsQ0FBQztJQUM5QyxPQUFPLHFDQUNILFNBQVMsOENBQ1QsVUFBVSxnQkFBZ0IsVUFBVSxnQkFBZ0IsV0FBVyxFQUFFLENBQUM7QUFDeEUsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbIi8qKlxuICogQGxpY2Vuc2VcbiAqIENvcHlyaWdodCAyMDIxIEdvb2dsZSBMTEMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuXG4gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgXCJMaWNlbnNlXCIpO1xuICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLlxuICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0XG4gKlxuICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wXG4gKlxuICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZVxuICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gXCJBUyBJU1wiIEJBU0lTLFxuICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuXG4gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kXG4gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS5cbiAqID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4gKi9cbmltcG9ydCB7c2l6ZUZyb21TaGFwZX0gZnJvbSAnLi4vLi4vdXRpbCc7XG5cbi8qKlxuICogR2VuZXJhdGVzIHNwYXJzZSByZXNoYXBlIG11bHRpcGxlIG5lZ2F0aXZlIDEgb3V0cHV0IGRpbWVuc2lvbiBlcnJvciBtZXNzYWdlLlxuICpcbiAqIEBwYXJhbSBkaW0xIFRoZSBmaXJzdCBkaW1lbnNpb24gd2l0aCBhIG5lZ2F0aXZlIDEgdmFsdWUuXG4gKiBAcGFyYW0gZGltMiBUaGUgc2Vjb25kIGRpbWVuc2lvbiB3aXRoIGEgbmVnYXRpdmUgMSB2YWx1ZS5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGdldFNwYXJzZVJlc2hhcGVNdWx0aXBsZU5lZ2F0aXZlT25lT3V0cHV0RGltRXJyb3JNZXNzYWdlKFxuICAgIGRpbTE6IG51bWJlciwgZGltMjogbnVtYmVyKSB7XG4gIHJldHVybiBgb25seSBvbmUgb3V0cHV0IGRpbWVuc2lvbiBtYXkgYmUgLTEsIG5vdCBib3RoICR7ZGltMX0gYW5kICR7ZGltMn1gO1xufVxuXG4vKipcbiAqIEdlbmVyYXRlcyBzcGFyc2UgcmVzaGFwZSBuZWdhdGl2ZSBvdXRwdXQgZGltZW5zaW9uIGVycm9yIG1lc3NhZ2UuXG4gKlxuICogQHBhcmFtIGRpbSBUaGUgZGltZW5zaW9uIHdpdGggYSBuZWdhdGl2ZSB2YWx1ZS5cbiAqIEBwYXJhbSB2YWx1ZSBUaGUgbmVnYXRpdmUgdmFsdWUuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBnZXRTcGFyc2VSZXNoYXBlTmVnYXRpdmVPdXRwdXREaW1FcnJvck1lc3NhZ2UoXG4gICAgZGltOiBudW1iZXIsIHZhbHVlOiBudW1iZXIpIHtcbiAgcmV0dXJuIGBzaXplICR7ZGltfSBtdXN0IGJlIG5vbi1uZWdhdGl2ZSwgbm90ICR7dmFsdWV9YDtcbn1cblxuLyoqXG4gKiBHZW5lcmF0ZXMgc3BhcnNlIHJlc2hhcGUgZW1wdHkgdGVuc29yIHplcm8gb3V0cHV0IGRpbWVuc2lvbiBlcnJvciBtZXNzYWdlLlxuICpcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGdldFNwYXJzZVJlc2hhcGVFbXB0eVRlbnNvclplcm9PdXRwdXREaW1FcnJvck1lc3NhZ2UoKSB7XG4gIHJldHVybiAncmVzaGFwZSBjYW5ub3QgaW5mZXIgdGhlIG1pc3NpbmcgaW5wdXQgc2l6ZSBmb3IgYW4gZW1wdHkgdGVuc29yICcgK1xuICAgICAgJ3VubGVzcyBhbGwgc3BlY2lmaWVkIGlucHV0IHNpemVzIGFyZSBub24temVybyc7XG59XG5cbi8qKlxuICogR2VuZXJhdGVzIHNwYXJzZSByZXNoYXBlIGlucHV0IG91dHB1dCBtdWx0aXBsZSBtaXNtYXRjaCBlcnJvciBtZXNzYWdlLlxuICpcbiAqIEBwYXJhbSBpbnB1dFNoYXBlIHRoZSBpbnB1dCBzaGFwZS5cbiAqIEBwYXJhbSBvdXRwdXRTaGFwZSB0aGUgcmVxdWVzdGVkIG91dHB1dCBzaGFwZS5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGdldFNwYXJzZVJlc2hhcGVJbnB1dE91dHB1dE11bHRpcGxlRXJyb3JNZXNzYWdlKFxuICAgIGlucHV0U2hhcGU6IG51bWJlcltdLCBvdXRwdXRTaGFwZTogbnVtYmVyW10pIHtcbiAgY29uc3QgaW5wdXRTaXplID0gc2l6ZUZyb21TaGFwZShpbnB1dFNoYXBlKTtcbiAgY29uc3Qgb3V0cHV0U2l6ZSA9IHNpemVGcm9tU2hhcGUob3V0cHV0U2hhcGUpO1xuICByZXR1cm4gYElucHV0IHRvIHJlc2hhcGUgaXMgYSBTcGFyc2VUZW5zb3Igd2l0aCAke2lucHV0U2l6ZX1cbiAgZGVuc2UgdmFsdWVzLCBidXQgdGhlIHJlcXVlc3RlZCBzaGFwZSByZXF1aXJlcyBhIG11bHRpcGxlIG9mICR7XG4gICAgICBvdXRwdXRTaXplfS4gaW5wdXRTaGFwZT0ke2lucHV0U2hhcGV9IG91dHB1dFNoYXBlPSAke291dHB1dFNoYXBlfWA7XG59XG5cbi8qKlxuICogR2VuZXJhdGVzIHNwYXJzZSByZXNoYXBlIGlucHV0IG91dHB1dCBpbmVxdWFsaXR5IGVycm9yIG1lc3NhZ2UuXG4gKlxuICogQHBhcmFtIGlucHV0U2hhcGUgdGhlIGlucHV0IHNoYXBlLlxuICogQHBhcmFtIG91dHB1dFNoYXBlIHRoZSByZXF1ZXN0ZWQgb3V0cHV0IHNoYXBlLlxuICovXG5leHBvcnQgZnVuY3Rpb24gZ2V0U3BhcnNlUmVzaGFwZUlucHV0T3V0cHV0TWlzbWF0Y2hFcnJvck1lc3NhZ2UoXG4gICAgaW5wdXRTaGFwZTogbnVtYmVyW10sIG91dHB1dFNoYXBlOiBudW1iZXJbXSkge1xuICBjb25zdCBpbnB1dFNpemUgPSBzaXplRnJvbVNoYXBlKGlucHV0U2hhcGUpO1xuICBjb25zdCBvdXRwdXRTaXplID0gc2l6ZUZyb21TaGFwZShvdXRwdXRTaGFwZSk7XG4gIHJldHVybiBgSW5wdXQgdG8gcmVzaGFwZSBpcyBhIHRlbnNvciB3aXRoICR7XG4gICAgICBpbnB1dFNpemV9IGRlbnNlIHZhbHVlcywgYnV0IHRoZSByZXF1ZXN0ZWQgc2hhcGUgaGFzICR7XG4gICAgICBvdXRwdXRTaXplfS4gaW5wdXRTaGFwZT0ke2lucHV0U2hhcGV9IG91dHB1dFNoYXBlPSR7b3V0cHV0U2hhcGV9YDtcbn1cbiJdfQ==","/**\n * @license\n * Copyright 2021 Google LLC. All Rights Reserved.\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n * =============================================================================\n */\n/**\n * Generates sparse segment reduction negative segment ids error message.\n *\n */\nexport function getSparseSegmentReductionNegativeSegmentIdsErrorMessage() {\n return `segment ids must be >= 0`;\n}\n/**\n * Generates sparse segment reduction non increasing segment ids error message.\n *\n */\nexport function getSparseSegmentReductionNonIncreasingSegmentIdsErrorMessage() {\n return `segment ids are not increasing`;\n}\n/**\n * Generates sparse segment reduction segment id out of range error message.\n *\n * @param segmentId The segment id index that is out of range.\n * @param outputRows Upper bound of valid segment id values.\n */\nexport function getSparseSegmentReductionSegmentIdOutOfRangeErrorMessage(segmentId, outputRows) {\n return `Segment id ${segmentId} out of range [0, ${outputRows}), possibly because segmentIds input is not sorted.`;\n}\n/**\n * Generates sparse segment reduction input indice out of range error message.\n *\n * @param index The index that holds the out of range value.\n * @param indexValue The value that is out of range.\n * @param inputRows Upper bound of valid index values.\n */\nexport function getSparseSegmentReductionIndicesOutOfRangeErrorMessage(index, indexValue, inputRows) {\n return `Bad: indices[${index}] == ${indexValue} out of range [0, ${inputRows})`;\n}\n//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic3BhcnNlX3NlZ21lbnRfcmVkdWN0aW9uX3V0aWwuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi8uLi8uLi90ZmpzLWNvcmUvc3JjL29wcy9zcGFyc2Uvc3BhcnNlX3NlZ21lbnRfcmVkdWN0aW9uX3V0aWwudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUE7Ozs7Ozs7Ozs7Ozs7OztHQWVHO0FBRUg7OztHQUdHO0FBQ0gsTUFBTSxVQUFVLHVEQUF1RDtJQUNyRSxPQUFPLDBCQUEwQixDQUFDO0FBQ3BDLENBQUM7QUFFRDs7O0dBR0c7QUFDSCxNQUFNLFVBQVUsNERBQTREO0lBQzFFLE9BQU8sZ0NBQWdDLENBQUM7QUFDMUMsQ0FBQztBQUVEOzs7OztHQUtHO0FBQ0gsTUFBTSxVQUFVLHdEQUF3RCxDQUNwRSxTQUFpQixFQUFFLFVBQWtCO0lBQ3ZDLE9BQU8sY0FBYyxTQUFTLHFCQUMxQixVQUFVLHFEQUFxRCxDQUFDO0FBQ3RFLENBQUM7QUFFRDs7Ozs7O0dBTUc7QUFDSCxNQUFNLFVBQVUsc0RBQXNELENBQ2xFLEtBQWEsRUFBRSxVQUFrQixFQUFFLFNBQWlCO0lBQ3RELE9BQU8sZ0JBQWdCLEtBQUssUUFBUSxVQUFVLHFCQUMxQyxTQUFTLEdBQUcsQ0FBQztBQUNuQixDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiLyoqXG4gKiBAbGljZW5zZVxuICogQ29weXJpZ2h0IDIwMjEgR29vZ2xlIExMQy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC5cbiAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSBcIkxpY2Vuc2VcIik7XG4gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuXG4gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXRcbiAqXG4gKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjBcbiAqXG4gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlXG4gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiBcIkFTIElTXCIgQkFTSVMsXG4gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC5cbiAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmRcbiAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLlxuICogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbiAqL1xuXG4vKipcbiAqIEdlbmVyYXRlcyBzcGFyc2Ugc2VnbWVudCByZWR1Y3Rpb24gbmVnYXRpdmUgc2VnbWVudCBpZHMgZXJyb3IgbWVzc2FnZS5cbiAqXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBnZXRTcGFyc2VTZWdtZW50UmVkdWN0aW9uTmVnYXRpdmVTZWdtZW50SWRzRXJyb3JNZXNzYWdlKCkge1xuICByZXR1cm4gYHNlZ21lbnQgaWRzIG11c3QgYmUgPj0gMGA7XG59XG5cbi8qKlxuICogR2VuZXJhdGVzIHNwYXJzZSBzZWdtZW50IHJlZHVjdGlvbiBub24gaW5jcmVhc2luZyBzZWdtZW50IGlkcyBlcnJvciBtZXNzYWdlLlxuICpcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGdldFNwYXJzZVNlZ21lbnRSZWR1Y3Rpb25Ob25JbmNyZWFzaW5nU2VnbWVudElkc0Vycm9yTWVzc2FnZSgpIHtcbiAgcmV0dXJuIGBzZWdtZW50IGlkcyBhcmUgbm90IGluY3JlYXNpbmdgO1xufVxuXG4vKipcbiAqIEdlbmVyYXRlcyBzcGFyc2Ugc2VnbWVudCByZWR1Y3Rpb24gc2VnbWVudCBpZCBvdXQgb2YgcmFuZ2UgZXJyb3IgbWVzc2FnZS5cbiAqXG4gKiBAcGFyYW0gc2VnbWVudElkIFRoZSBzZWdtZW50IGlkIGluZGV4IHRoYXQgaXMgb3V0IG9mIHJhbmdlLlxuICogQHBhcmFtIG91dHB1dFJvd3MgVXBwZXIgYm91bmQgb2YgdmFsaWQgc2VnbWVudCBpZCB2YWx1ZXMuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBnZXRTcGFyc2VTZWdtZW50UmVkdWN0aW9uU2VnbWVudElkT3V0T2ZSYW5nZUVycm9yTWVzc2FnZShcbiAgICBzZWdtZW50SWQ6IG51bWJlciwgb3V0cHV0Um93czogbnVtYmVyKSB7XG4gIHJldHVybiBgU2VnbWVudCBpZCAke3NlZ21lbnRJZH0gb3V0IG9mIHJhbmdlIFswLCAke1xuICAgICAgb3V0cHV0Um93c30pLCBwb3NzaWJseSBiZWNhdXNlIHNlZ21lbnRJZHMgaW5wdXQgaXMgbm90IHNvcnRlZC5gO1xufVxuXG4vKipcbiAqIEdlbmVyYXRlcyBzcGFyc2Ugc2VnbWVudCByZWR1Y3Rpb24gaW5wdXQgaW5kaWNlIG91dCBvZiByYW5nZSBlcnJvciBtZXNzYWdlLlxuICpcbiAqIEBwYXJhbSBpbmRleCBUaGUgaW5kZXggdGhhdCBob2xkcyB0aGUgb3V0IG9mIHJhbmdlIHZhbHVlLlxuICogQHBhcmFtIGluZGV4VmFsdWUgVGhlIHZhbHVlIHRoYXQgaXMgb3V0IG9mIHJhbmdlLlxuICogQHBhcmFtIGlucHV0Um93cyBVcHBlciBib3VuZCBvZiB2YWxpZCBpbmRleCB2YWx1ZXMuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBnZXRTcGFyc2VTZWdtZW50UmVkdWN0aW9uSW5kaWNlc091dE9mUmFuZ2VFcnJvck1lc3NhZ2UoXG4gICAgaW5kZXg6IG51bWJlciwgaW5kZXhWYWx1ZTogbnVtYmVyLCBpbnB1dFJvd3M6IG51bWJlcikge1xuICByZXR1cm4gYEJhZDogaW5kaWNlc1ske2luZGV4fV0gPT0gJHtpbmRleFZhbHVlfSBvdXQgb2YgcmFuZ2UgWzAsICR7XG4gICAgICBpbnB1dFJvd3N9KWA7XG59XG4iXX0=","/**\n * @license\n * Copyright 2018 Google LLC. All Rights Reserved.\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n * =============================================================================\n */\nimport { nearestDivisor } from '../util';\nimport { PARALLELIZE_THRESHOLD } from './reduce_util';\nexport function segOpComputeOptimalWindowSize(inSize, numSegments) {\n let done = false;\n let res;\n if (inSize <= PARALLELIZE_THRESHOLD) {\n res = inSize;\n done = true;\n }\n else {\n res = nearestDivisor(inSize, Math.floor(Math.sqrt(inSize)));\n }\n while (!done) {\n if (res > numSegments || res === inSize) {\n done = true;\n }\n else {\n res = nearestDivisor(inSize, res + 1);\n }\n }\n return res;\n}\nexport function computeOutShape(aShape, axis, numSegments) {\n const outShape = [];\n const rank = aShape.length;\n for (let dim = 0; dim < rank; dim++) {\n if (dim !== axis) {\n outShape.push(aShape[dim]);\n }\n else {\n outShape.push(numSegments);\n }\n }\n return outShape;\n}\nexport function collectGatherOpShapeInfo(x, indices, axis, batchDims) {\n const indicesRank = indices.shape.length;\n const xRank = x.shape.length;\n if (batchDims !== 0) {\n if (batchDims < -indicesRank || batchDims > indicesRank) {\n throw new Error(`Expect batchDims in the range of [-${indicesRank}, ${indicesRank}], but got ${batchDims}`);\n }\n }\n if (batchDims < 0) {\n batchDims += indicesRank;\n }\n if (batchDims > xRank) {\n throw new Error(`batchDims (${batchDims}) must be less than rank(x) (\n ${xRank}).`);\n }\n if (axis < batchDims) {\n throw new Error(`batchDims (${batchDims}) must be less than or equal to axis (${axis}).`);\n }\n for (let i = 0; i < batchDims; ++i) {\n if (x.shape[i] !== indices.shape[i]) {\n throw new Error(`x.shape[${i}]: ${x.shape[i]} should be equal to indices.shape[${i}]: ${indices.shape[i]}.`);\n }\n }\n const dimSize = x.shape[axis];\n const outputShape = [];\n let batchSize = 1;\n let outerSize = 1;\n let sliceSize = 1;\n for (let i = 0; i < batchDims; ++i) {\n outputShape.push(x.shape[i]);\n batchSize *= x.shape[i];\n }\n for (let i = batchDims; i < axis; i++) {\n outputShape.push(x.shape[i]);\n outerSize *= x.shape[i];\n }\n for (let i = batchDims; i < indicesRank; i++) {\n outputShape.push(indices.shape[i]);\n }\n for (let i = axis + 1; i < xRank; i++) {\n outputShape.push(x.shape[i]);\n sliceSize *= x.shape[i];\n }\n return { batchSize, sliceSize, outerSize, dimSize, outputShape };\n}\n//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic2VnbWVudF91dGlsLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vLi4vdGZqcy1jb3JlL3NyYy9vcHMvc2VnbWVudF91dGlsLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBOzs7Ozs7Ozs7Ozs7Ozs7R0FlRztBQUdILE9BQU8sRUFBQyxjQUFjLEVBQUMsTUFBTSxTQUFTLENBQUM7QUFFdkMsT0FBTyxFQUFDLHFCQUFxQixFQUFDLE1BQU0sZUFBZSxDQUFDO0FBU3BELE1BQU0sVUFBVSw2QkFBNkIsQ0FDekMsTUFBYyxFQUFFLFdBQW1CO0lBQ3JDLElBQUksSUFBSSxHQUFHLEtBQUssQ0FBQztJQUNqQixJQUFJLEdBQUcsQ0FBQztJQUVSLElBQUksTUFBTSxJQUFJLHFCQUFxQixFQUFFO1FBQ25DLEdBQUcsR0FBRyxNQUFNLENBQUM7UUFDYixJQUFJLEdBQUcsSUFBSSxDQUFDO0tBQ2I7U0FBTTtRQUNMLEdBQUcsR0FBRyxjQUFjLENBQUMsTUFBTSxFQUFFLElBQUksQ0FBQyxLQUFLLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxNQUFNLENBQUMsQ0FBQyxDQUFDLENBQUM7S0FDN0Q7SUFFRCxPQUFPLENBQUMsSUFBSSxFQUFFO1FBQ1osSUFBSSxHQUFHLEdBQUcsV0FBVyxJQUFJLEdBQUcsS0FBSyxNQUFNLEVBQUU7WUFDdkMsSUFBSSxHQUFHLElBQUksQ0FBQztTQUNiO2FBQU07WUFDTCxHQUFHLEdBQUcsY0FBYyxDQUFDLE1BQU0sRUFBRSxHQUFHLEdBQUcsQ0FBQyxDQUFDLENBQUM7U0FDdkM7S0FDRjtJQUNELE9BQU8sR0FBRyxDQUFDO0FBQ2IsQ0FBQztBQUVELE1BQU0sVUFBVSxlQUFlLENBQzNCLE1BQWdCLEVBQUUsSUFBWSxFQUFFLFdBQW1CO0lBQ3JELE1BQU0sUUFBUSxHQUFHLEVBQUUsQ0FBQztJQUNwQixNQUFNLElBQUksR0FBRyxNQUFNLENBQUMsTUFBTSxDQUFDO0lBQzNCLEtBQUssSUFBSSxH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QUFLLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQztLQUNwQztJQUVELEtBQUssSUFBSSxDQUFDLEdBQUcsSUFBSSxHQUFHLENBQUMsRUFBRSxDQUFDLEdBQUcsS0FBSyxFQUFFLENBQUMsRUFBRSxFQUFFO1FBQ3JDLFdBQVcsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDO1FBQzdCLFNBQVMsSUFBSSxDQUFDLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQyxDQUFDO0tBQ3pCO0lBRUQsT0FBTyxFQUFDLFNBQVMsRUFBRSxTQUFTLEVBQUUsU0FBUyxFQUFFLE9BQU8sRUFBRSxXQUFXLEVBQUMsQ0FBQztBQUNqRSxDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiLyoqXG4gKiBAbGljZW5zZVxuICogQ29weXJpZ2h0IDIwMTggR29vZ2xlIExMQy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC5cbiAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSBcIkxpY2Vuc2VcIik7XG4gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuXG4gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXRcbiAqXG4gKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjBcbiAqXG4gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlXG4gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiBcIkFTIElTXCIgQkFTSVMsXG4gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC5cbiAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmRcbiAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLlxuICogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbiAqL1xuXG5pbXBvcnQge1RlbnNvckluZm99IGZyb20gJy4uL2tlcm5lbF9yZWdpc3RyeSc7XG5pbXBvcnQge25lYXJlc3REaXZpc29yfSBmcm9tICcuLi91dGlsJztcblxuaW1wb3J0IHtQQVJBTExFTElaRV9USFJFU0hPTER9IGZyb20gJy4vcmVkdWNlX3V0aWwnO1xuXG5leHBvcnQgaW50ZXJmYWNlIFNlZ09wSW5mbyB7XG4gIHdpbmRvd1NpemU6IG51bWJlcjtcbiAgYmF0Y2hTaXplOiBudW1iZXI7XG4gIGluU2l6ZTogbnVtYmVyO1xuICBudW1TZWdtZW50czogbnVtYmVyO1xufVxuXG5leHBvcnQgZnVuY3Rpb24gc2VnT3BDb21wdXRlT3B0aW1hbFdpbmRvd1NpemUoXG4gICAgaW5TaXplOiBudW1iZXIsIG51bVNlZ21lbnRzOiBudW1iZXIpOiBudW1iZXIge1xuICBsZXQgZG9uZSA9IGZhbHNlO1xuICBsZXQgcmVzO1xuXG4gIGlmIChpblNpemUgPD0gUEFSQUxMRUxJWkVfVEhSRVNIT0xEKSB7XG4gICAgcmVzID0gaW5TaXplO1xuICAgIGRvbmUgPSB0cnVlO1xuICB9IGVsc2Uge1xuICAgIHJlcyA9IG5lYXJlc3REaXZpc29yKGluU2l6ZSwgTWF0aC5mbG9vcihNYXRoLnNxcnQoaW5TaXplKSkpO1xuICB9XG5cbiAgd2hpbGUgKCFkb25lKSB7XG4gICAgaWYgKHJlcyA+IG51bVNlZ21lbnRzIHx8IHJlcyA9PT0gaW5TaXplKSB7XG4gICAgICBkb25lID0gdHJ1ZTtcbiAgICB9IGVsc2Uge1xuICAgICAgcmVzID0gbmVhcmVzdERpdmlzb3IoaW5TaXplLCByZXMgKyAxKTtcbiAgICB9XG4gIH1cbiAgcmV0dXJuIHJlcztcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGNvbXB1dGVPdXRTaGFwZShcbiAgICBhU2hhcGU6IG51bWJlcltdLCBheGlzOiBudW1iZXIsIG51bVNlZ21lbnRzOiBudW1iZXIpOiBudW1iZXJbXSB7XG4gIGNvbnN0IG91dFNoYXBlID0gW107XG4gIGNvbnN0IHJhbmsgPSBhU2hhcGUubGVuZ3RoO1xuICBmb3IgKGxldCBkaW0gPSAwOyBkaW0gPCByYW5rOyBkaW0rKykge1xuICAgIGlmIChkaW0gIT09IGF4aXMpIHtcbiAgICAgIG91dFNoYXBlLnB1c2goYVNoYXBlW2RpbV0pO1xuICAgIH0gZWxzZSB7XG4gICAgICBvdXRTaGFwZS5wdXNoKG51bVNlZ21lbnRzKTtcbiAgICB9XG4gIH1cbiAgcmV0dXJuIG91dFNoYXBlO1xufVxuXG5leHBvcnQgaW50ZXJmYWNlIEdhdGhlck9wU2hhcGVJbmZvIHtcbiAgYmF0Y2hTaXplOiBudW1iZXI7XG4gIHNsaWNlU2l6ZTogbnVtYmVyO1xuICBvdXRlclNpemU6IG51bWJlcjtcbiAgZGltU2l6ZTogbnVtYmVyO1xuICBvdXRwdXRTaGFwZTogbnVtYmVyW107XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBjb2xsZWN0R2F0aGVyT3BTaGFwZUluZm8oXG4gICAgeDogVGVuc29ySW5mbywgaW5kaWNlczogVGVuc29ySW5mbywgYXhpczogbnVtYmVyLFxuICAgIGJhdGNoRGltczogbnVtYmVyKTogR2F0aGVyT3BTaGFwZUluZm8ge1xuICBjb25zdCBpbmRpY2VzUmFuayA9IGluZGljZXMuc2hhcGUubGVuZ3RoO1xuICBjb25zdCB4UmFuayA9IHguc2hhcGUubGVuZ3RoO1xuXG4gIGlmIChiYXRjaERpbXMgIT09IDApIHtcbiAgICBpZiAoYmF0Y2hEaW1zIDwgLWluZGljZXNSYW5rIHx8IGJhdGNoRGltcyA+IGluZGljZXNSYW5rKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoYEV4cGVjdCBiYXRjaERpbXMgaW4gdGhlIHJhbmdlIG9mIFstJHtpbmRpY2VzUmFua30sICR7XG4gICAgICAgICAgaW5kaWNlc1Jhbmt9XSwgYnV0IGdvdCAke2JhdGNoRGltc31gKTtcbiAgICB9XG4gIH1cblxuICBpZiAoYmF0Y2hEaW1zIDwgMCkge1xuICAgIGJhdGNoRGltcyArPSBpbmRpY2VzUmFuaztcbiAgfVxuXG4gIGlmIChiYXRjaERpbXMgPiB4UmFuaykge1xuICAgIHRocm93IG5ldyBFcnJvcihgYmF0Y2hEaW1zICgke2JhdGNoRGltc30pIG11c3QgYmUgbGVzcyB0aGFuIHJhbmsoeCkgKFxuICAgICR7eFJhbmt9KS5gKTtcbiAgfVxuXG4gIGlmIChheGlzIDwgYmF0Y2hEaW1zKSB7XG4gICAgdGhyb3cgbmV3IEVycm9yKGBiYXRjaERpbXMgKCR7XG4gICAgICAgIGJhdGNoRGltc30pIG11c3QgYmUgbGVzcyB0aGFuIG9yIGVxdWFsIHRvIGF4aXMgKCR7YXhpc30pLmApO1xuICB9XG5cbiAgZm9yIChsZXQgaSA9IDA7IGkgPCBiYXRjaERpbXM7ICsraSkge1xuICAgIGlmICh4LnNoYXBlW2ldICE9PSBpbmRpY2VzLnNoYXBlW2ldKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoXG4gICAgICAgICAgYHguc2hhcGVbJHtpfV06ICR7eC5zaGFwZVtpXX0gc2hvdWxkIGJlIGVxdWFsIHRvIGluZGljZXMuc2hhcGVbJHtcbiAgICAgICAgICAgICAgaX1dOiAke2luZGljZXMuc2hhcGVbaV19LmApO1xuICAgIH1cbiAgfVxuICBjb25zdCBkaW1TaXplID0geC5zaGFwZVtheGlzXTtcblxuICBjb25zdCBvdXRwdXRTaGFwZTogbnVtYmVyW10gPSBbXTtcbiAgbGV0IGJhdGNoU2l6ZSA9IDE7XG4gIGxldCBvdXRlclNpemUgPSAxO1xuICBsZXQgc2xpY2VTaXplID0gMTtcblxuICBmb3IgKGxldCBpID0gMDsgaSA8IGJhdGNoRGltczsgKytpKSB7XG4gICAgb3V0cHV0U2hhcGUucHVzaCh4LnNoYXBlW2ldKTtcbiAgICBiYXRjaFNpemUgKj0geC5zaGFwZVtpXTtcbiAgfVxuXG4gIGZvciAobGV0IGkgPSBiYXRjaERpbXM7IGkgPCBheGlzOyBpKyspIHtcbiAgICBvdXRwdXRTaGFwZS5wdXNoKHguc2hhcGVbaV0pO1xuICAgIG91dGVyU2l6ZSAqPSB4LnNoYXBlW2ldO1xuICB9XG5cbiAgZm9yIChsZXQgaSA9IGJhdGNoRGltczsgaSA8IGluZGljZXNSYW5rOyBpKyspIHtcbiAgICBvdXRwdXRTaGFwZS5wdXNoKGluZGljZXMuc2hhcGVbaV0pO1xuICB9XG5cbiAgZm9yIChsZXQgaSA9IGF4aXMgKyAxOyBpIDwgeFJhbms7IGkrKykge1xuICAgIG91dHB1dFNoYXBlLnB1c2goeC5zaGFwZVtpXSk7XG4gICAgc2xpY2VTaXplICo9IHguc2hhcGVbaV07XG4gIH1cblxuICByZXR1cm4ge2JhdGNoU2l6ZSwgc2xpY2VTaXplLCBvdXRlclNpemUsIGRpbVNpemUsIG91dHB1dFNoYXBlfTtcbn1cbiJdfQ==","/**\n * @license\n * Copyright 2018 Google LLC. All Rights Reserved.\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n * =============================================================================\n */\nimport { decodeString, encodeString } from '../util';\n// Utilities needed by backend consumers of tf-core.\nexport * from '../ops/axis_util';\nexport * from '../ops/broadcast_util';\nexport * from '../ops/concat_util';\nexport * from '../ops/conv_util';\nexport * from '../ops/fused_util';\nexport * from '../ops/ragged_to_dense_util';\nexport * from '../ops/reduce_util';\nimport * as slice_util from '../ops/slice_util';\nexport { slice_util };\nexport { upcastType } from '../types';\nexport * from '../ops/rotate_util';\nexport * from '../ops/array_ops_util';\nexport * from '../ops/gather_nd_util';\nexport * from '../ops/scatter_nd_util';\nexport * from '../ops/selu_util';\nexport * from '../ops/fused_util';\nexport * from '../ops/erf_util';\nexport * from '../log';\nexport * from '../backends/complex_util';\nexport * from '../backends/einsum_util';\nexport * from '../ops/split_util';\nexport * from '../ops/sparse/sparse_fill_empty_rows_util';\nexport * from '../ops/sparse/sparse_reshape_util';\nexport * from '../ops/sparse/sparse_segment_reduction_util';\nimport * as segment_util from '../ops/segment_util';\nexport { segment_util };\nexport function fromUint8ToStringArray(vals) {\n try {\n // Decode the bytes into string.\n return vals.map(val => decodeString(val));\n }\n catch (err) {\n throw new Error(`Failed to decode encoded string bytes into utf-8, error: ${err}`);\n }\n}\nexport function fromStringArrayToUint8(strings) {\n return strings.map(s => encodeString(s));\n}\n//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYmFja2VuZF91dGlsLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vLi4vdGZqcy1jb3JlL3NyYy9iYWNrZW5kcy9iYWNrZW5kX3V0aWwudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUE7Ozs7Ozs7Ozs7Ozs7OztHQWVHO0FBRUgsT0FBTyxFQUFDLFlBQVksRUFBRSxZQUFZLEVBQUMsTUFBTSxTQUFTLENBQUM7QUFFbkQsb0RBQW9EO0FBQ3BELGNBQWMsa0JBQWtCLENBQUM7QUFDakMsY0FBYyx1QkFBdUIsQ0FBQztBQUN0QyxjQUFjLG9CQUFvQixDQUFDO0FBQ25DLGNBQWMsa0JBQWtCLENBQUM7QUFDakMsY0FBYyxtQkFBbUIsQ0FBQztBQUVsQyxjQUFjLDZCQUE2QixDQUFDO0FBQzVDLGNBQWMsb0JBQW9CLENBQUM7QUFFbkMsT0FBTyxLQUFLLFVBQVUsTUFBTSxtQkFBbUIsQ0FBQztBQUNoRCxPQUFPLEVBQUMsVUFBVSxFQUFDLENBQUM7QUFFcEIsT0FBTyxFQUE0QixVQUFVLEVBQVksTUFBTSxVQUFVLENBQUM7QUFFMUUsY0FBYyxvQkFBb0IsQ0FBQztBQUNuQyxjQUFjLHVCQUF1QixDQUFDO0FBQ3RDLGNBQWMsdUJBQXVCLENBQUM7QUFDdEMsY0FBYyx3QkFBd0IsQ0FBQztBQUN2QyxjQUFjLGtCQUFrQixDQUFDO0FBQ2pDLGNBQWMsbUJBQW1CLENBQUM7QUFDbEMsY0FBYyxpQkFBaUIsQ0FBQztBQUNoQyxjQUFjLFFBQVEsQ0FBQztBQUN2QixjQUFjLDBCQUEwQixDQUFDO0FBQ3pDLGNBQWMseUJBQXlCLENBQUM7QUFDeEMsY0FBYyxtQkFBbUIsQ0FBQztBQUNsQyxjQUFjLDJDQUEyQyxDQUFDO0FBQzFELGNBQWMsbUNBQW1DLENBQUM7QUFDbEQsY0FBYyw2Q0FBNkMsQ0FBQztBQUU1RCxPQUFPLEtBQUssWUFBWSxNQUFNLHFCQUFxQixDQUFDO0FBQ3BELE9BQU8sRUFBQyxZQUFZLEVBQUMsQ0FBQztBQUV0QixNQUFNLFVBQVUsc0JBQXNCLENBQUMsSUFBa0I7SUFDdkQsSUFBSTtRQUNGLGdDQUFnQztRQUNoQyxPQUFPLElBQUksQ0FBQyxHQUFHLENBQUMsR0FBRyxDQUFDLEVBQUUsQ0FBQyxZQUFZLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQztLQUMzQztJQUFDLE9BQU8sR0FBRyxFQUFFO1FBQ1osTUFBTSxJQUFJLEtBQUssQ0FDWCw0REFBNEQsR0FBRyxFQUFFLENBQUMsQ0FBQztLQUN4RTtBQUNILENBQUM7QUFFRCxNQUFNLFVBQVUsc0JBQXNCLENBQUMsT0FBaUI7SUFDdEQsT0FBTyxPQUFPLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsWUFBWSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUM7QUFDM0MsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbIi8qKlxuICogQGxpY2Vuc2VcbiAqIENvcHlyaWdodCAyMDE4IEdvb2dsZSBMTEMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuXG4gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgXCJMaWNlbnNlXCIpO1xuICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLlxuICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0XG4gKlxuICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wXG4gKlxuICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZVxuICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gXCJBUyBJU1wiIEJBU0lTLFxuICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuXG4gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kXG4gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS5cbiAqID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4gKi9cblxuaW1wb3J0IHtkZWNvZGVTdHJpbmcsIGVuY29kZVN0cmluZ30gZnJvbSAnLi4vdXRpbCc7XG5cbi8vIFV0aWxpdGllcyBuZWVkZWQgYnkgYmFja2VuZCBjb25zdW1lcnMgb2YgdGYtY29yZS5cbmV4cG9ydCAqIGZyb20gJy4uL29wcy9heGlzX3V0aWwnO1xuZXhwb3J0ICogZnJvbSAnLi4vb3BzL2Jyb2FkY2FzdF91dGlsJztcbmV4cG9ydCAqIGZyb20gJy4uL29wcy9jb25jYXRfdXRpbCc7XG5leHBvcnQgKiBmcm9tICcuLi9vcHMvY29udl91dGlsJztcbmV4cG9ydCAqIGZyb20gJy4uL29wcy9mdXNlZF91dGlsJztcbmV4cG9ydCAqIGZyb20gJy4uL29wcy9mdXNlZF90eXBlcyc7XG5leHBvcnQgKiBmcm9tICcuLi9vcHMvcmFnZ2VkX3RvX2RlbnNlX3V0aWwnO1xuZXhwb3J0ICogZnJvbSAnLi4vb3BzL3JlZHVjZV91dGlsJztcblxuaW1wb3J0ICogYXMgc2xpY2VfdXRpbCBmcm9tICcuLi9vcHMvc2xpY2VfdXRpbCc7XG5leHBvcnQge3NsaWNlX3V0aWx9O1xuXG5leHBvcnQge0JhY2tlbmRWYWx1ZXMsIFR5cGVkQXJyYXksIHVwY2FzdFR5cGUsIFBpeGVsRGF0YX0gZnJvbSAnLi4vdHlwZXMnO1xuZXhwb3J0IHtNZW1vcnlJbmZvLCBUaW1pbmdJbmZvfSBmcm9tICcuLi9lbmdpbmUnO1xuZXhwb3J0ICogZnJvbSAnLi4vb3BzL3JvdGF0ZV91dGlsJztcbmV4cG9ydCAqIGZyb20gJy4uL29wcy9hcnJheV9vcHNfdXRpbCc7XG5leHBvcnQgKiBmcm9tICcuLi9vcHMvZ2F0aGVyX25kX3V0aWwnO1xuZXhwb3J0ICogZnJvbSAnLi4vb3BzL3NjYXR0ZXJfbmRfdXRpbCc7XG5leHBvcnQgKiBmcm9tICcuLi9vcHMvc2VsdV91dGlsJztcbmV4cG9ydCAqIGZyb20gJy4uL29wcy9mdXNlZF91dGlsJztcbmV4cG9ydCAqIGZyb20gJy4uL29wcy9lcmZfdXRpbCc7XG5leHBvcnQgKiBmcm9tICcuLi9sb2cnO1xuZXhwb3J0ICogZnJvbSAnLi4vYmFja2VuZHMvY29tcGxleF91dGlsJztcbmV4cG9ydCAqIGZyb20gJy4uL2JhY2tlbmRzL2VpbnN1bV91dGlsJztcbmV4cG9ydCAqIGZyb20gJy4uL29wcy9zcGxpdF91dGlsJztcbmV4cG9ydCAqIGZyb20gJy4uL29wcy9zcGFyc2Uvc3BhcnNlX2ZpbGxfZW1wdHlfcm93c191dGlsJztcbmV4cG9ydCAqIGZyb20gJy4uL29wcy9zcGFyc2Uvc3BhcnNlX3Jlc2hhcGVfdXRpbCc7XG5leHBvcnQgKiBmcm9tICcuLi9vcHMvc3BhcnNlL3NwYXJzZV9zZWdtZW50X3JlZHVjdGlvbl91dGlsJztcblxuaW1wb3J0ICogYXMgc2VnbWVudF91dGlsIGZyb20gJy4uL29wcy9zZWdtZW50X3V0aWwnO1xuZXhwb3J0IHtzZWdtZW50X3V0aWx9O1xuXG5leHBvcnQgZnVuY3Rpb24gZnJvbVVpbnQ4VG9TdHJpbmdBcnJheSh2YWxzOiBVaW50OEFycmF5W10pIHtcbiAgdHJ5IHtcbiAgICAvLyBEZWNvZGUgdGhlIGJ5dGVzIGludG8gc3RyaW5nLlxuICAgIHJldHVybiB2YWxzLm1hcCh2YWwgPT4gZGVjb2RlU3RyaW5nKHZhbCkpO1xuICB9IGNhdGNoIChlcnIpIHtcbiAgICB0aHJvdyBuZXcgRXJyb3IoXG4gICAgICAgIGBGYWlsZWQgdG8gZGVjb2RlIGVuY29kZWQgc3RyaW5nIGJ5dGVzIGludG8gdXRmLTgsIGVycm9yOiAke2Vycn1gKTtcbiAgfVxufVxuXG5leHBvcnQgZnVuY3Rpb24gZnJvbVN0cmluZ0FycmF5VG9VaW50OChzdHJpbmdzOiBzdHJpbmdbXSkge1xuICByZXR1cm4gc3RyaW5ncy5tYXAocyA9PiBlbmNvZGVTdHJpbmcocykpO1xufVxuIl19","export const Abs = 'Abs';\nexport const Acos = 'Acos';\nexport const Acosh = 'Acosh';\nexport const Add = 'Add';\nexport const AddN = 'AddN';\nexport const All = 'All';\nexport const Any = 'Any';\nexport const ArgMax = 'ArgMax';\nexport const ArgMin = 'ArgMin';\nexport const Asin = 'Asin';\nexport const Asinh = 'Asinh';\nexport const Atan = 'Atan';\nexport const Atanh = 'Atanh';\nexport const Atan2 = 'Atan2';\nexport const AvgPool = 'AvgPool';\nexport const AvgPoolGrad = 'AvgPoolGrad';\nexport const AvgPool3D = 'AvgPool3D';\nexport const AvgPool3DGrad = 'AvgPool3DGrad';\nexport const BatchMatMul = 'BatchMatMul';\nexport const BatchToSpaceND = 'BatchToSpaceND';\nexport const Bincount = 'Bincount';\nexport const BroadcastTo = 'BroadcastTo';\nexport const BroadcastArgs = 'BroadcastArgs';\nexport const Cast = 'Cast';\nexport const Ceil = 'Ceil';\nexport const ClipByValue = 'ClipByValue';\nexport const Complex = 'Complex';\nexport const ComplexAbs = 'ComplexAbs';\nexport const Concat = 'Concat';\nexport const Conv2D = 'Conv2D';\nexport const Conv2DBackpropFilter = 'Conv2DBackpropFilter';\nexport const Conv2DBackpropInput = 'Conv2DBackpropInput';\nexport const Conv3D = 'Conv3D';\nexport const Conv3DBackpropFilterV2 = 'Conv3DBackpropFilterV2';\nexport const Conv3DBackpropInputV2 = 'Conv3DBackpropInputV2';\nexport const Cos = 'Cos';\nexport const Cosh = 'Cosh';\nexport const Cumprod = 'Cumprod';\nexport const Cumsum = 'Cumsum';\nexport const CropAndResize = 'CropAndResize';\nexport const DenseBincount = 'DenseBincount';\nexport const DepthToSpace = 'DepthToSpace';\nexport const DepthwiseConv2dNative = 'DepthwiseConv2dNative';\nexport const DepthwiseConv2dNativeBackpropFilter = 'DepthwiseConv2dNativeBackpropFilter';\nexport const DepthwiseConv2dNativeBackpropInput = 'DepthwiseConv2dNativeBackpropInput';\nexport const Diag = 'Diag';\nexport const Dilation2D = 'Dilation2D';\nexport const Dilation2DBackpropInput = 'Dilation2DBackpropInput';\nexport const Dilation2DBackpropFilter = 'Dilation2DBackpropFilter';\nexport const RealDiv = 'RealDiv';\nexport const Einsum = 'Einsum';\nexport const Elu = 'Elu';\nexport const EluGrad = 'EluGrad';\nexport const Erf = 'Erf';\nexport const Equal = 'Equal';\nexport const Exp = 'Exp';\nexport const ExpandDims = 'ExpandDims';\nexport const Expm1 = 'Expm1';\nexport const FFT = 'FFT';\nexport const Fill = 'Fill';\nexport const FlipLeftRight = 'FlipLeftRight';\nexport const Floor = 'Floor';\nexport const FloorDiv = 'FloorDiv';\nexport const FusedBatchNorm = 'FusedBatchNorm';\nexport const GatherV2 = 'GatherV2';\nexport const GatherNd = 'GatherNd';\nexport const Greater = 'Greater';\nexport const GreaterEqual = 'GreaterEqual';\nexport const Identity = 'Identity';\nexport const IFFT = 'IFFT';\nexport const Imag = 'Imag';\nexport const IsFinite = 'IsFinite';\nexport const IsInf = 'IsInf';\nexport const IsNan = 'IsNan';\nexport const LeakyRelu = 'LeakyRelu';\nexport const Less = 'Less';\nexport const LessEqual = 'LessEqual';\nexport const LinSpace = 'LinSpace';\nexport const Log = 'Log';\nexport const Log1p = 'Log1p';\nexport const LogicalAnd = 'LogicalAnd';\nexport const LogicalNot = 'LogicalNot';\nexport const LogicalOr = 'LogicalOr';\nexport const LogicalXor = 'LogicalXor';\nexport const LogSoftmax = 'LogSoftmax';\nexport const LowerBound = 'LowerBound';\nexport const LRN = 'LRN';\nexport const LRNGrad = 'LRNGrad';\nexport const Max = 'Max';\nexport const Maximum = 'Maximum';\nexport const MaxPool = 'MaxPool';\nexport const MaxPoolGrad = 'MaxPoolGrad';\nexport const MaxPool3D = 'MaxPool3D';\nexport const MaxPool3DGrad = 'MaxPool3DGrad';\nexport const MaxPoolWithArgmax = 'MaxPoolWithArgmax';\nexport const Mean = 'Mean';\nexport const Min = 'Min';\nexport const Minimum = 'Minimum';\nexport const MirrorPad = 'MirrorPad';\nexport const Mod = 'Mod';\nexport const Multinomial = 'Multinomial';\nexport const Multiply = 'Multiply';\nexport const Neg = 'Neg';\nexport const NotEqual = 'NotEqual';\nexport const NonMaxSuppressionV3 = 'NonMaxSuppressionV3';\nexport const NonMaxSuppressionV4 = 'NonMaxSuppressionV4';\nexport const NonMaxSuppressionV5 = 'NonMaxSuppressionV5';\nexport const OnesLike = 'OnesLike';\nexport const OneHot = 'OneHot';\nexport const Pack = 'Pack';\nexport const PadV2 = 'PadV2';\nexport const Pool = 'Pool';\nexport const Pow = 'Pow';\nexport const Prelu = 'Prelu';\nexport const Prod = 'Prod';\nexport const RaggedGather = 'RaggedGather';\nexport const RaggedTensorToTensor = 'RaggedTensorToTensor';\nexport const Range = 'Range';\nexport const Real = 'Real';\nexport const Reciprocal = 'Reciprocal';\nexport const Relu = 'Relu';\nexport const Reshape = 'Reshape';\nexport const ResizeNearestNeighbor = 'ResizeNearestNeighbor';\nexport const ResizeNearestNeighborGrad = 'ResizeNearestNeighborGrad';\nexport const ResizeBilinear = 'ResizeBilinear';\nexport const ResizeBilinearGrad = 'ResizeBilinearGrad';\nexport const Relu6 = 'Relu6';\nexport const Reverse = 'Reverse';\nexport const Round = 'Round';\nexport const Rsqrt = 'Rsqrt';\nexport const ScatterNd = 'ScatterNd';\nexport const SearchSorted = 'SearchSorted';\nexport const Select = 'Select';\nexport const Selu = 'Selu';\nexport const Slice = 'Slice';\nexport const Sin = 'Sin';\nexport const Sinh = 'Sinh';\nexport const Sign = 'Sign';\nexport const Sigmoid = 'Sigmoid';\nexport const Softplus = 'Softplus';\nexport const Sqrt = 'Sqrt';\nexport const Sum = 'Sum';\nexport const SpaceToBatchND = 'SpaceToBatchND';\nexport const SplitV = 'SplitV';\nexport const Softmax = 'Softmax';\nexport const SparseFillEmptyRows = 'SparseFillEmptyRows';\nexport const SparseReshape = 'SparseReshape';\nexport const SparseSegmentMean = 'SparseSegmentMean';\nexport const SparseSegmentSum = 'SparseSegmentSum';\nexport const SparseToDense = 'SparseToDense';\nexport const SquaredDifference = 'SquaredDifference';\nexport const Square = 'Square';\nexport const StridedSlice = 'StridedSlice';\nexport const StringNGrams = 'StringNGrams';\nexport const StringSplit = 'StringSplit';\nexport const StringToHashBucketFast = 'StringToHashBucketFast';\nexport const Sub = 'Sub';\nexport const Tan = 'Tan';\nexport const Tanh = 'Tanh';\nexport const Tile = 'Tile';\nexport const TopK = 'TopK';\nexport const Transform = 'Transform';\nexport const Transpose = 'Transpose';\nexport const Unique = 'Unique';\nexport const Unpack = 'Unpack';\nexport const UnsortedSegmentSum = 'UnsortedSegmentSum';\nexport const UpperBound = 'UpperBound';\nexport const ZerosLike = 'ZerosLike';\n/**\n * TensorFlow.js-only kernels\n */\nexport const Step = 'Step';\nexport const FromPixels = 'FromPixels';\nexport const RotateWithOffset = 'RotateWithOffset';\nexport const _FusedMatMul = '_FusedMatMul';\nexport const FusedConv2D = 'FusedConv2D';\nexport const FusedDepthwiseConv2D = 'FusedDepthwiseConv2D';\n//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoia2VybmVsX25hbWVzLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vdGZqcy1jb3JlL3NyYy9rZXJuZWxfbmFtZXMudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBeUJBLE1BQU0sQ0FBQyxNQUFNLEdBQUcsR0FBRyxLQUFLLENBQUM7QUFHekIsTUFBTSxDQUFDLE1BQU0sSUFBSSxHQUFHLE1BQU0sQ0FBQztBQUczQixNQUFNLENBQUMsTUFBTSxLQUFLLEdBQUcsT0FBTyxDQUFDO0FBRzdCLE1BQU0sQ0FBQyxNQUFNLEdBQUcsR0FBRyxLQUFLLENBQUM7QUFHekIsTUFBTSxDQUFDLE1BQU0sSUFBSSxHQUFHLE1BQU0sQ0FBQztBQUczQixNQUFNLENBQUMsTUFBTSxHQUFHLEdBQUcsS0FBSyxDQUFDO0FBT3pCLE1BQU0sQ0FBQyxNQUFNLEdBQUcsR0FBRyxLQUFLLENBQUM7QUFPekIsTUFBTSxDQUFDLE1BQU0sTUFBTSxHQUFHLFFBQVEsQ0FBQztBQU0vQixNQUFNLENBQUMsTUFBTSxNQUFNLEdBQUcsUUFBUSxDQUFDO0FBTS9CLE1BQU0sQ0FBQyxNQUFNLElBQUksR0FBRyxNQUFNLENBQUM7QUFHM0IsTUFBTSxDQUFDLE1BQU0sS0FBSyxHQUFHLE9BQU8sQ0FBQztBQUc3QixNQUFNLENBQUMsTUFBTSxJQUFJLEdBQUcsTUFBTSxDQUFDO0FBRzNCLE1BQU0sQ0FBQyxNQUFNLEtBQUssR0FBRyxPQUFPLENBQUM7QUFHN0IsTUFBTSxDQUFDLE1BQU0sS0FBSyxHQUFHLE9BQU8sQ0FBQztBQUc3QixNQUFNLENBQUMsTUFBTSxPQUFPLEdBQUcsU0FBUyxDQUFDO0FBU2pDLE1BQU0sQ0FBQyxNQUFNLFdBQVcsR0FBRyxhQUFhLENBQUM7QUFRekMsTUFBTSxDQUFDLE1BQU0sU0FBUyxHQUFHLFdBQVcsQ0FBQztBQVVyQyxNQUFNLENBQUMsTUFBTSxhQUFhLEdBQUcsZUFBZSxDQUFDO0FBUzdDLE1BQU0sQ0FBQyxNQUFNLFdBQVcs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QUFVLEdBQUcsWUFBWSxDQUFDO0FBU3ZDLE1BQU0sQ0FBQyxNQUFNLGdCQUFnQixHQUFHLGtCQUFrQixDQUFDO0FBUW5ELE1BQU0sQ0FBQyxNQUFNLFlBQVksR0FBRyxjQUFjLENBQUM7QUFnQjNDLE1BQU0sQ0FBQyxNQUFNLFdBQVcsR0FBRyxhQUFhLENBQUM7QUFpQnpDLE1BQU0sQ0FBQyxNQUFNLG9CQUFvQixHQUFHLHNCQUFzQixDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiLyoqXG4gKiBAbGljZW5zZVxuICogQ29weXJpZ2h0IDIwMjAgR29vZ2xlIExMQy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC5cbiAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSBcIkxpY2Vuc2VcIik7XG4gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuXG4gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXRcbiAqXG4gKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjBcbiAqXG4gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlXG4gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiBcIkFTIElTXCIgQkFTSVMsXG4gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC5cbiAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmRcbiAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLlxuICogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbiAqL1xuLy8gQWxsb3cgVXBwZXJDYW1lbENhc2UgdmFyaWFibGUgbmFtZXNcbi8vIHRzbGludDpkaXNhYmxlOiB2YXJpYWJsZS1uYW1lXG4vLyBVbmZvcnR1bmF0ZWx5IGp1c3QgZW5hYmxpbmcgUGFzY2FsQ2FzZSBwZXIgZmlsZSAodHNsaW50OmVuYWJsZTpcbi8vIGFsbG93LXBhc2NhbC1jYXNlKSBkb2Vzbid0IHdvcmsuXG5pbXBvcnQge05hbWVkVGVuc29ySW5mb01hcCwgVGVuc29ySW5mb30gZnJvbSAnLi9rZXJuZWxfcmVnaXN0cnknO1xuaW1wb3J0IHtFeHBsaWNpdFBhZGRpbmd9IGZyb20gJy4vb3BzL2NvbnZfdXRpbCc7XG5pbXBvcnQge0FjdGl2YXRpb259IGZyb20gJy4vb3BzL2Z1c2VkX3R5cGVzJztcbmltcG9ydCB7RGF0YVR5cGUsIFBpeGVsRGF0YX0gZnJvbSAnLi90eXBlcyc7XG5cbmV4cG9ydCBjb25zdCBBYnMgPSAnQWJzJztcbmV4cG9ydCB0eXBlIEFic0lucHV0cyA9IFVuYXJ5SW5wdXRzO1xuXG5leHBvcnQgY29uc3QgQWNvcyA9ICdBY29zJztcbmV4cG9ydCB0eXBlIEFjb3NJbnB1dHMgPSBVbmFyeUlucHV0cztcblxuZXhwb3J0IGNvbnN0IEFjb3NoID0gJ0Fjb3NoJztcbmV4cG9ydCB0eXBlIEFjb3NoSW5wdXRzID0gVW5hcnlJbnB1dHM7XG5cbmV4cG9ydCBjb25zdCBBZGQgPSAnQWRkJztcbmV4cG9ydCB0eXBlIEFkZElucHV0cyA9IEJpbmFyeUlucHV0cztcblxuZXhwb3J0IGNvbnN0IEFkZE4gPSAnQWRkTic7XG5leHBvcnQgdHlwZSBBZGROSW5wdXRzID0gVGVuc29ySW5mb1tdO1xuXG5leHBvcnQgY29uc3QgQWxsID0gJ0FsbCc7XG5leHBvcnQgdHlwZSBBbGxJbnB1dHMgPSBQaWNrPE5hbWVkVGVuc29ySW5mb01hcCwgJ3gnPjtcbmV4cG9ydCBpbnRlcmZhY2UgQWxsQXR0cnMge1xuICBheGlzOiBudW1iZXJ8bnVtYmVyW107XG4gIGtlZXBEaW1zOiBib29sZWFuO1xufVxuXG5leHBvcnQgY29uc3QgQW55ID0gJ0FueSc7XG5leHBvcnQgdHlwZSBBbnlJbnB1dHMgPSBQaWNrPE5hbWVkVGVuc29ySW5mb01hcCwgJ3gnPjtcbmV4cG9ydCBpbnRlcmZhY2UgQW55QXR0cnMge1xuICBheGlzOiBudW1iZXJ8bnVtYmVyW107XG4gIGtlZXBEaW1zOiBib29sZWFuO1xufVxuXG5leHBvcnQgY29uc3QgQXJnTWF4ID0gJ0FyZ01heCc7XG5leHBvcnQgdHlwZSBBcmdNYXhJbnB1dHMgPSBQaWNrPE5hbWVkVGVuc29ySW5mb01hcCwgJ3gnPjtcbmV4cG9ydCBpbnRlcmZhY2UgQXJnTWF4QXR0cnMge1xuICBheGlzOiBudW1iZXI7XG59XG5cbmV4cG9ydCBjb25zdCBBcmdNaW4gPSAnQXJnTWluJztcbmV4cG9ydCB0eXBlIEFyZ01pbklucHV0cyA9IFBpY2s8TmFtZWRUZW5zb3JJbmZvTWFwLCAneCc+O1xuZXhwb3J0IGludGVyZmFjZSBBcmdNaW5BdHRycyB7XG4gIGF4aXM6IG51bWJlcjtcbn1cblxuZXhwb3J0IGNvbnN0IEFzaW4gPSAnQXNpbic7XG5leHBvcnQgdHlwZSBBc2luSW5wdXRzID0gVW5hcnlJbnB1dHM7XG5cbmV4cG9ydCBjb25zdCBBc2luaCA9ICdBc2luaCc7XG5leHBvcnQgdHlwZSBBc2luaElucHV0cyA9IFVuYXJ5SW5wdXRzO1xuXG5leHBvcnQgY29uc3QgQXRhbiA9ICdBdGFuJztcbmV4cG9ydCB0eXBlIEF0YW5JbnB1dHMgPSBVbmFyeUlucHV0cztcblxuZXhwb3J0IGNvbnN0IEF0YW5oID0gJ0F0YW5oJztcbmV4cG9ydCB0eXBlIEF0YW5oSW5wdXRzID0gVW5hcnlJbnB1dHM7XG5cbmV4cG9ydCBjb25zdCBBdGFuMiA9ICdBdGFuMic7XG5leHBvcnQgdHlwZSBBdGFuMklucHV0cyA9IEJpbmFyeUlucHV0cztcblxuZXhwb3J0IGNvbnN0IEF2Z1Bvb2wgPSAnQXZnUG9vbCc7XG5leHBvcnQgdHlwZSBBdmdQb29sSW5wdXRzID0gUGljazxOYW1lZFRlbnNvckluZm9NYXAsICd4Jz47XG5leHBvcnQgaW50ZXJmYWNlIEF2Z1Bvb2xBdHRycyB7XG4gIGZpbHRlclNpemU6IFtudW1iZXIsIG51bWJlcl18bnVtYmVyO1xuICBzdHJpZGVzOiBbbnVtYmVyLCBudW1iZXJdfG51bWJlcjtcbiAgcGFkOiAndmFsaWQnfCdzYW1lJ3xudW1iZXJ8RXhwbGljaXRQYWRkaW5nO1xuICBkaW1Sb3VuZGluZ01vZGU/OiAnZmxvb3InfCdyb3VuZCd8J2NlaWwnO1xufVxuXG5leHBvcnQgY29uc3QgQXZnUG9vbEdyYWQgPSAnQXZnUG9vbEdyYWQnO1xuZXhwb3J0IHR5cGUgQXZnUG9vbEdyYWRJbnB1dHMgPSBQaWNrPE5hbWVkVGVuc29ySW5mb01hcCwgJ2R5J3wnaW5wdXQnPjtcbmV4cG9ydCBpbnRlcmZhY2UgQXZnUG9vbEdyYWRBdHRycyB7XG4gIGZpbHRlclNpemU6IFtudW1iZXIsIG51bWJlcl18bnVtYmVyO1xuICBzdHJpZGVzOiBbbnVtYmVyLCBudW1iZXJdfG51bWJlcjtcbiAgcGFkOiAndmFsaWQnfCdzYW1lJ3xudW1iZXJ8RXhwbGljaXRQYWRkaW5nO1xufVxuXG5leHBvcnQgY29uc3QgQXZnUG9vbDNEID0gJ0F2Z1Bvb2wzRCc7XG5leHBvcnQgdHlwZSBBdmdQb29sM0RJbnB1dHMgPSBQaWNrPE5hbWVkVGVuc29ySW5mb01hcCwgJ3gnPjtcbmV4cG9ydCBpbnRlcmZhY2UgQXZnUG9vbDNEQXR0cnMge1xuICBmaWx0ZXJTaXplOiBbbnVtYmVyLCBudW1iZXIsIG51bWJlcl18bnVtYmVyO1xuICBzdHJpZGVzOiBbbnVtYmVyLCBudW1iZXIsIG51bWJlcl18bnVtYmVyO1xuICBwYWQ6ICd2YWxpZCd8J3NhbWUnfG51bWJlcjtcbiAgZGltUm91bmRpbmdNb2RlPzogJ2Zsb29yJ3wncm91bmQnfCdjZWlsJztcbiAgZGF0YUZvcm1hdDogJ05ESFdDJ3wnTkNESFcnO1xufVxuXG5leHBvcnQgY29uc3QgQXZnUG9vbDNER3JhZCA9ICdBdmdQb29sM0RHcmFkJztcbmV4cG9ydCB0eXBlIEF2Z1Bvb2wzREdyYWRJbnB1dHMgPSBQaWNrPE5hbWVkVGVuc29ySW5mb01hcCwgJ2R5J3wnaW5wdXQnPjtcbmV4cG9ydCBpbnRlcmZhY2UgQXZnUG9vbDNER3JhZEF0dHJzIHtcbiAgZmlsdGVyU2l6ZTogW251bWJlciwgbnVtYmVyLCBudW1iZXJdfG51bWJlcjtcbiAgc3RyaWRlczogW251bWJlciwgbnVtYmVyLCBudW1iZXJdfG51bWJlcjtcbiAgcGFkOiAndmFsaWQnfCdzYW1lJ3xudW1iZXI7XG4gIGRpbVJvdW5kaW5nTW9kZT86ICdmbG9vcid8J3JvdW5kJ3wnY2VpbCc7XG59XG5cbmV4cG9ydCBjb25zdCBCYXRjaE1hdE11bCA9ICdCYXRjaE1hdE11bCc7XG5leHBvcnQgdHlwZSBCYXRjaE1hdE11bElucHV0cyA9IFBpY2s8TmFtZWRUZW5zb3JJbmZvTWFwLCAnYSd8J2InPjtcbmV4cG9ydCBpbnRlcmZhY2UgQmF0Y2hNYXRNdWxBdHRycyB7XG4gIHRyYW5zcG9zZUE6IGJvb2xlYW47XG4gIHRyYW5zcG9zZUI6IGJvb2xlYW47XG59XG5cbmV4cG9ydCBjb25zdCBCYXRjaFRvU3BhY2VORCA9ICdCYXRjaFRvU3BhY2VORCc7XG5leHBvcnQgdHlwZSBCYXRjaFRvU3BhY2VORElucHV0cyA9IFBpY2s8TmFtZWRUZW5zb3JJbmZvTWFwLCAneCc+O1xuZXhwb3J0IGludGVyZmFjZSBCYXRjaFRvU3BhY2VOREF0dHJzIHtcbiAgYmxvY2tTaGFwZTogbnVtYmVyW107XG4gIGNyb3BzOiBudW1iZXJbXVtdO1xufVxuXG5leHBvcnQgdHlwZSBCaW5hcnlJbnB1dHMgPSBQaWNrPE5hbWVkVGVuc29ySW5mb01hcCwgJ2EnfCdiJz47XG5cbmV4cG9ydCBjb25zdCBCaW5jb3VudCA9ICdCaW5jb3VudCc7XG5leHBvcnQgdHlwZSBCaW5jb3VudElucHV0cyA9IFBpY2s8TmFtZWRUZW5zb3JJbmZvTWFwLCAneCd8J3dlaWdodHMnPjtcbmV4cG9ydCBpbnRlcmZhY2UgQmluY291bnRBdHRycyB7XG4gIHNpemU6IG51bWJlcjtcbn1cblxuZXhwb3J0IGNvbnN0IEJyb2FkY2FzdFRvID0gJ0Jyb2FkY2FzdFRvJztcbmV4cG9ydCB0eXBlIEJyb2FkY2FzdFRvSW5wdXRzID0gUGljazxOYW1lZFRlbnNvckluZm9NYXAsICd4Jz47XG5leHBvcnQgaW50ZXJmYWNlIEJyb2FkQ2FzdFRvQXR0cnMge1xuICBzaGFwZTogbnVtYmVyW107XG4gIGlucHV0U2hhcGU6IG51bWJlcltdOyAgLy8gZm9yIGdyYWRpZW50XG59XG5cbmV4cG9ydCBjb25zdCBCcm9hZGNhc3RBcmdzID0gJ0Jyb2FkY2FzdEFyZ3MnO1xuZXhwb3J0IHR5cGUgQnJvYWRjYXN0QXJnc0lucHV0cyA9IFBpY2s8TmFtZWRUZW5zb3JJbmZvTWFwLCAnczAnfCdzMSc+O1xuXG5leHBvcnQgY29uc3QgQ2FzdCA9ICdDYXN0JztcbmV4cG9ydCB0eXBlIENhc3RJbnB1dHMgPSBVbmFyeUlucHV0cztcbmV4cG9ydCBpbnRlcmZhY2UgQ2FzdEF0dHJzIHtcbiAgZHR5cGU6IERhdGFUeXBlO1xufVxuXG5leHBvcnQgY29uc3QgQ2VpbCA9ICdDZWlsJztcbmV4cG9ydCB0eXBlIENlaWxJbnB1dHMgPSBVbmFyeUlucHV0cztcblxuZXhwb3J0IGNvbnN0IENsaXBCeVZhbHVlID0gJ0NsaXBCeVZhbHVlJztcbmV4cG9ydCB0eXBlIENsaXBCeVZhbHVlSW5wdXRzID0gVW5hcnlJbnB1dHM7XG5leHBvcnQgaW50ZXJmYWNlIENsaXBCeVZhbHVlQXR0cnMge1xuICBjbGlwVmFsdWVNaW46IG51bWJlcjtcbiAgY2xpcFZhbHVlTWF4OiBudW1iZXI7XG59XG5cbmV4cG9ydCBjb25zdCBDb21wbGV4ID0gJ0NvbXBsZXgnO1xuZXhwb3J0IHR5cGUgQ29tcGxleElucHV0cyA9IFBpY2s8TmFtZWRUZW5zb3JJbmZvTWFwLCAncmVhbCd8J2ltYWcnPjtcblxuZXhwb3J0IGNvbnN0IENvbXBsZXhBYnMgPSAnQ29tcGxleEFicyc7XG5leHBvcnQgdHlwZSBDb21wbGV4QWJzSW5wdXRzID0gVW5hcnlJbnB1dHM7XG5cbmV4cG9ydCBjb25zdCBDb25jYXQgPSAnQ29uY2F0JztcbmV4cG9ydCB0eXBlIENvbmNhdElucHV0cyA9IFRlbnNvckluZm9bXTtcbmV4cG9ydCBpbnRlcmZhY2UgQ29uY2F0QXR0cnMge1xuICBheGlzOiBudW1iZXI7XG59XG5cbmV4cG9ydCBjb25zdCBDb252MkQgPSAnQ29udjJEJztcbmV4cG9ydCB0eXBlIENvbnYyRElucHV0cyA9IFBpY2s8TmFtZWRUZW5zb3JJbmZvTWFwLCAneCd8J2ZpbHRlcic+O1xuZXhwb3J0IGludGVyZmFjZSBDb252MkRBdHRycyB7XG4gIHN0cmlkZXM6IFtudW1iZXIsIG51bWJlcl18bnVtYmVyO1xuICBwYWQ6ICd2YWxpZCd8J3NhbWUnfG51bWJlcnxFeHBsaWNpdFBhZGRpbmc7XG4gIGRhdGFGb3JtYXQ6ICdOSFdDJ3wnTkNIVyc7XG4gIGRpbGF0aW9uczogW251bWJlciwgbnVtYmVyXXxudW1iZXI7XG4gIGRpbVJvdW5kaW5nTW9kZT86ICdmbG9vcid8J3JvdW5kJ3wnY2VpbCc7XG59XG5cbmV4cG9ydCBjb25zdCBDb252MkRCYWNrcHJvcEZpbHRlciA9ICdDb252MkRCYWNrcHJvcEZpbHRlcic7XG5leHBvcnQgdHlwZSBDb252MkRCYWNrcHJvcEZpbHRlcklucHV0cyA9IFBpY2s8TmFtZWRUZW5zb3JJbmZvTWFwLCAneCd8J2R5Jz47XG5leHBvcnQgaW50ZXJmYWNlIENvbnYyREJhY2twcm9wRmlsdGVyQXR0cnMge1xuICBzdHJpZGVzOiBbbnVtYmVyLCBudW1iZXJdfG51bWJlcjtcbiAgcGFkOiAndmFsaWQnfCdzYW1lJ3xudW1iZXJ8RXhwbGljaXRQYWRkaW5nO1xuICBkYXRhRm9ybWF0OiAnTkhXQyd8J05DSFcnO1xuICBkaW1Sb3VuZGluZ01vZGU/OiAnZmxvb3InfCdyb3VuZCd8J2NlaWwnO1xuICBmaWx0ZXJTaGFwZTogW251bWJlciwgbnVtYmVyLCBudW1iZXIsIG51bWJlcl07XG59XG5cbmV4cG9ydCBjb25zdCBDb252MkRCYWNrcHJvcElucHV0ID0gJ0NvbnYyREJhY2twcm9wSW5wdXQnO1xuZXhwb3J0IHR5cGUgQ29udjJEQmFja3Byb3BJbnB1dElucHV0cyA9IFBpY2s8TmFtZWRUZW5zb3JJbmZvTWFwLCAnZHknfCdmaWx0ZXInPjtcbmV4cG9ydCBpbnRlcmZhY2UgQ29udjJEQmFja3Byb3BJbnB1dEF0dHJzIHtcbiAgc3RyaWRlczogW251bWJlciwgbnVtYmVyXXxudW1iZXI7XG4gIHBhZDogJ3ZhbGlkJ3wnc2FtZSd8bnVtYmVyfEV4cGxpY2l0UGFkZGluZztcbiAgZGF0YUZvcm1hdDogJ05IV0MnfCdOQ0hXJztcbiAgZGltUm91bmRpbmdNb2RlPzogJ2Zsb29yJ3wncm91bmQnfCdjZWlsJztcbiAgaW5wdXRTaGFwZTogW251bWJlciwgbnVtYmVyLCBudW1iZXIsIG51bWJlcl07XG59XG5cbmV4cG9ydCBjb25zdCBDb252M0QgPSAnQ29udjNEJztcbmV4cG9ydCB0eXBlIENvbnYzRElucHV0cyA9IFBpY2s8TmFtZWRUZW5zb3JJbmZvTWFwLCAneCd8J2ZpbHRlcic+O1xuZXhwb3J0IGludGVyZmFjZSBDb252M0RBdHRycyB7XG4gIHN0cmlkZXM6IFtudW1iZXIsIG51bWJlciwgbnVtYmVyXXxudW1iZXI7XG4gIHBhZDogJ3ZhbGlkJ3wnc2FtZSc7XG4gIGRhdGFGb3JtYXQ6ICdOREhXQyd8J05DREhXJztcbiAgZGlsYXRpb25zOiBbbnVtYmVyLCBudW1iZXIsIG51bWJlcl18bnVtYmVyO1xufVxuXG5leHBvcnQgY29uc3QgQ29udjNEQmFja3Byb3BGaWx0ZXJWMiA9ICdDb252M0RCYWNrcHJvcEZpbHRlclYyJztcbmV4cG9ydCB0eXBlIENvbnYzREJhY2twcm9wRmlsdGVyVjJJbnB1dHMgPSBQaWNrPE5hbWVkVGVuc29ySW5mb01hcCwgJ3gnfCdkeSc+O1xuXG5leHBvcnQgaW50ZXJmYWNlIENvbnYzREJhY2twcm9wRmlsdGVyVjJBdHRycyB7XG4gIHN0cmlkZXM6IFtudW1iZXIsIG51bWJlciwgbnVtYmVyXXxudW1iZXI7XG4gIHBhZDogJ3ZhbGlkJ3wnc2FtZSc7XG4gIGZpbHRlclNoYXBlOiBbbnVtYmVyLCBudW1iZXIsIG51bWJlciwgbnVtYmVyLCBudW1iZXJdO1xufVxuXG5leHBvcnQgY29uc3QgQ29udjNEQmFja3Byb3BJbnB1dFYyID0gJ0NvbnYzREJhY2twcm9wSW5wdXRWMic7XG5leHBvcnQgdHlwZSBDb252M0RCYWNrcHJvcElucHV0VjJJbnB1dHMgPVxuICAgIFBpY2s8TmFtZWRUZW5zb3JJbmZvTWFwLCAnZHknfCdmaWx0ZXInPjtcbmV4cG9ydCBpbnRlcmZhY2UgQ29udjNEQmFja3Byb3BJbnB1dFYyQXR0cnMge1xuICBzdHJpZGVzOiBbbnVtYmVyLCBudW1iZXIsIG51bWJlcl18bnVtYmVyO1xuICBwYWQ6ICd2YWxpZCd8J3NhbWUnO1xuICBpbnB1dFNoYXBlOiBbbnVtYmVyLCBudW1iZXIsIG51bWJlciwgbnVtYmVyLCBudW1iZXJdO1xufVxuXG5leHBvcnQgY29uc3QgQ29zID0gJ0Nvcyc7XG5leHBvcnQgdHlwZSBDb3NJbnB1dHMgPSBVbmFyeUlucHV0cztcblxuZXhwb3J0IGNvbnN0IENvc2ggPSAnQ29zaCc7XG5leHBvcnQgdHlwZSBDb3NoSW5wdXRzID0gVW5hcnlJbnB1dHM7XG5cbmV4cG9ydCBjb25zdCBDdW1wcm9kID0gJ0N1bXByb2QnO1xuZXhwb3J0IHR5cGUgQ3VtcHJvZElucHV0cyA9IFBpY2s8TmFtZWRUZW5zb3JJbmZvTWFwLCAneCc+O1xuZXhwb3J0IGludGVyZmFjZSBDdW1wcm9kQXR0cnMge1xuICBheGlzOiBudW1iZXI7XG4gIGV4Y2x1c2l2ZTogYm9vbGVhbjtcbiAgcmV2ZXJzZTogYm9vbGVhbjtcbn1cblxuZXhwb3J0IGNvbnN0IEN1bXN1bSA9ICdDdW1zdW0nO1xuZXhwb3J0IHR5cGUgQ3Vtc3VtSW5wdXRzID0gUGljazxOYW1lZFRlbnNvckluZm9NYXAsICd4Jz47XG5leHBvcnQgaW50ZXJmYWNlIEN1bXN1bUF0dHJzIHtcbiAgYXhpczogbnVtYmVyO1xuICBleGNsdXNpdmU6IGJvb2xlYW47XG4gIHJldmVyc2U6IGJvb2xlYW47XG59XG5cbmV4cG9ydCBjb25zdCBDcm9wQW5kUmVzaXplID0gJ0Nyb3BBbmRSZXNpemUnO1xuZXhwb3J0IHR5cGUgQ3JvcEFuZFJlc2l6ZUlucHV0cyA9XG4gICAgUGljazxOYW1lZFRlbnNvckluZm9NYXAsICdpbWFnZSd8J2JveGVzJ3wnYm94SW5kJz47XG5leHBvcnQgaW50ZXJmYWNlIENyb3BBbmRSZXNpemVBdHRycyB7XG4gIGNyb3BTaXplOiBbbnVtYmVyLCBudW1iZXJdO1xuICBtZXRob2Q6ICdiaWxpbmVhcid8J25lYXJlc3QnO1xuICBleHRyYXBvbGF0aW9uVmFsdWU6IG51bWJlcjtcbn1cblxuZXhwb3J0IGNvbnN0IERlbnNlQmluY291bnQgPSAnRGVuc2VCaW5jb3VudCc7XG5leHBvcnQgdHlwZSBEZW5zZUJpbmNvdW50SW5wdXRzID0gUGljazxOYW1lZFRlbnNvckluZm9NYXAsICd4J3wnd2VpZ2h0cyc+O1xuZXhwb3J0IGludGVyZmFjZSBEZW5zZUJpbmNvdW50QXR0cnMge1xuICBzaXplOiBudW1iZXI7XG4gIGJpbmFyeU91dHB1dD86IGJvb2xlYW47XG59XG5cbmV4cG9ydCBjb25zdCBEZXB0aFRvU3BhY2UgPSAnRGVwdGhUb1NwYWNlJztcbmV4cG9ydCB0eXBlIERlcHRoVG9TcGFjZUlucHV0cyA9IFBpY2s8TmFtZWRUZW5zb3JJbmZvTWFwLCAneCc+O1xuZXhwb3J0IGludGVyZmFjZSBEZXB0aFRvU3BhY2VBdHRycyB7XG4gIGJsb2NrU2l6ZTogbnVtYmVyO1xuICBkYXRhRm9ybWF0OiAnTkhXQyd8J05DSFcnO1xufVxuXG5leHBvcnQgY29uc3QgRGVwdGh3aXNlQ29udjJkTmF0aXZlID0gJ0RlcHRod2lzZUNvbnYyZE5hdGl2ZSc7XG5leHBvcnQgdHlwZSBEZXB0aHdpc2VDb252MmROYXRpdmVJbnB1dHMgPVxuICAgIFBpY2s8TmFtZWRUZW5zb3JJbmZvTWFwLCAneCd8J2ZpbHRlcic+O1xuZXhwb3J0IGludGVyZmFjZSBEZXB0aHdpc2VDb252MmROYXRpdmVBdHRycyB7XG4gIHN0cmlkZXM6IFtudW1iZXIsIG51bWJlcl18bnVtYmVyO1xuICBwYWQ6ICd2YWxpZCd8J3NhbWUnfG51bWJlcnxFeHBsaWNpdFBhZGRpbmc7XG4gIGRhdGFGb3JtYXQ6ICdOSFdDJ3wnTkNIVyc7XG4gIGRpbGF0aW9uczogW251bWJlciwgbnVtYmVyXXxudW1iZXI7XG4gIGRpbVJvdW5kaW5nTW9kZT86ICdmbG9vcid8J3JvdW5kJ3wnY2VpbCc7XG59XG5cbmV4cG9ydCBjb25zdCBEZXB0aHdpc2VDb252MmROYXRpdmVCYWNrcHJvcEZpbHRlciA9XG4gICAgJ0RlcHRod2lzZUNvbnYyZE5hdGl2ZUJhY2twcm9wRmlsdGVyJztcbmV4cG9ydCB0eXBlIERlcHRod2lzZUNvbnYyZE5hdGl2ZUJhY2twcm9wRmlsdGVySW5wdXRzID1cbiAgICBQaWNrPE5hbWVkVGVuc29ySW5mb01hcCwgJ3gnfCdkeSc+O1xuZXhwb3J0IGludGVyZmFjZSBEZXB0aHdpc2VDb252MmROYXRpdmVCYWNrcHJvcEZpbHRlckF0dHJzIHtcbiAgc3RyaWRlczogW251bWJlciwgbnVtYmVyXXxudW1iZXI7XG4gIGRpbGF0aW9uczogW251bWJlciwgbnVtYmVyXXxudW1iZXI7XG4gIHBhZDogJ3ZhbGlkJ3wnc2FtZSd8bnVtYmVyfEV4cGxpY2l0UGFkZGluZztcbiAgZGltUm91bmRpbmdNb2RlPzogJ2Zsb29yJ3wncm91bmQnfCdjZWlsJztcbiAgZmlsdGVyU2hhcGU6IFtudW1iZXIsIG51bWJlciwgbnVtYmVyLCBudW1iZXJdO1xufVxuXG5leHBvcnQgY29uc3QgRGVwdGh3aXNlQ29udjJkTmF0aXZlQmFja3Byb3BJbnB1dCA9XG4gICAgJ0RlcHRod2lzZUNvbnYyZE5hdGl2ZUJhY2twcm9wSW5wdXQnO1xuZXhwb3J0IHR5cGUgRGVwdGh3aXNlQ29udjJkTmF0aXZlQmFja3Byb3BJbnB1dElucHV0cyA9XG4gICAgUGljazxOYW1lZFRlbnNvckluZm9NYXAsICdkeSd8J2ZpbHRlcic+O1xuZXhwb3J0IGludGVyZmFjZSBEZXB0aHdpc2VDb252MmROYXRpdmVCYWNrcHJvcElucHV0QXR0cnMge1xuICBzdHJpZGVzOiBbbnVtYmVyLCBudW1iZXJdfG51bWJlcjtcbiAgZGlsYXRpb25zOiBbbnVtYmVyLCBudW1iZXJdfG51bWJlcjtcbiAgcGFkOiAndmFsaWQnfCdzYW1lJ3xudW1iZXJ8RXhwbGljaXRQYWRkaW5nO1xuICBkaW1Sb3VuZGluZ01vZGU/OiAnZmxvb3InfCdyb3VuZCd8J2NlaWwnO1xuICBpbnB1dFNoYXBlOiBbbnVtYmVyLCBudW1iZXIsIG51bWJlciwgbnVtYmVyXTtcbn1cblxuZXhwb3J0IGNvbnN0IERpYWcgPSAnRGlhZyc7XG5leHBvcnQgdHlwZSBEaWFnSW5wdXRzID0gUGljazxOYW1lZFRlbnNvckluZm9NYXAsICd4Jz47XG5cbmV4cG9ydCBjb25zdCBEaWxhdGlvbjJEID0gJ0RpbGF0aW9uMkQnO1xuZXhwb3J0IHR5cGUgRGlsYXRpb24yRElucHV0cyA9IFBpY2s8TmFtZWRUZW5zb3JJbmZvTWFwLCAneCd8J2ZpbHRlcic+O1xuZXhwb3J0IGludGVyZmFjZSBEaWxhdGlvbjJEQXR0cnMge1xuICBzdHJpZGVzOiBbbnVtYmVyLCBudW1iZXJdfG51bWJlcjtcbiAgcGFkOiAndmFsaWQnfCdzYW1lJ3xudW1iZXI7XG4gIGRpbGF0aW9uczogW251bWJlciwgbnVtYmVyXXxudW1iZXI7XG59XG5cbmV4cG9ydCBjb25zdCBEaWxhdGlvbjJEQmFja3Byb3BJbnB1dCA9ICdEaWxhdGlvbjJEQmFja3Byb3BJbnB1dCc7XG5leHBvcnQgdHlwZSBEaWxhdGlvbjJEQmFja3Byb3BJbnB1dElucHV0cyA9XG4gICAgUGljazxOYW1lZFRlbnNvckluZm9NYXAsICd4J3wnZmlsdGVyJ3wnZHknPjtcblxuZXhwb3J0IGNvbnN0IERpbGF0aW9uMkRCYWNrcHJvcEZpbHRlciA9ICdEaWxhdGlvbjJEQmFja3Byb3BGaWx0ZXInO1xuZXhwb3J0IHR5cGUgRGlsYXRpb24yREJhY2twcm9wRmlsdGVySW5wdXRzID1cbiAgICBQaWNrPE5hbWVkVGVuc29ySW5mb01hcCwgJ3gnfCdmaWx0ZXInfCdkeSc+O1xuXG5leHBvcnQgY29uc3QgUmVhbERpdiA9ICdSZWFsRGl2JztcbmV4cG9ydCB0eXBlIFJlYWxEaXZJbnB1dHMgPSBCaW5hcnlJbnB1dHM7XG5cbmV4cG9ydCBjb25zdCBFaW5zdW0gPSAnRWluc3VtJztcbmV4cG9ydCB0eXBlIEVpbnN1bUlucHV0cyA9IFRlbnNvckluZm9bXTtcbmV4cG9ydCBpbnRlcmZhY2UgRWluc3VtQXR0cnMge1xuICBlcXVhdGlvbjogc3RyaW5nO1xufVxuXG5leHBvcnQgY29uc3QgRWx1ID0gJ0VsdSc7XG5leHBvcnQgdHlwZSBFbHVJbnB1dHMgPSBQaWNrPE5hbWVkVGVuc29ySW5mb01hcCwgJ3gnPjtcblxuZXhwb3J0IGNvbnN0IEVsdUdyYWQgPSAnRWx1R3JhZCc7XG5leHBvcnQgdHlwZSBFbHVHcmFkSW5wdXRzID0gUGljazxOYW1lZFRlbnNvckluZm9NYXAsICdkeSd8J3knPjtcblxuZXhwb3J0IGNvbnN0IEVyZiA9ICdFcmYnO1xuZXhwb3J0IHR5cGUgRXJmSW5wdXRzID0gVW5hcnlJbnB1dHM7XG5cbmV4cG9ydCBjb25zdCBFcXVhbCA9ICdFcXVhbCc7XG5leHBvcnQgdHlwZSBFcXVhbElucHV0cyA9IEJpbmFyeUlucHV0cztcblxuZXhwb3J0IGNvbnN0IEV4cCA9ICdFeHAnO1xuZXhwb3J0IHR5cGUgRXhwSW5wdXRzID0gVW5hcnlJbnB1dHM7XG5cbmV4cG9ydCBjb25zdCBFeHBhbmREaW1zID0gJ0V4cGFuZERpbXMnO1xuZXhwb3J0IHR5cGUgRXhwYW5kRGltc0lucHV0cyA9IFBpY2s8TmFtZWRUZW5zb3JJbmZvTWFwLCAnaW5wdXQnPjtcbmV4cG9ydCBpbnRlcmZhY2UgRXhwYW5kRGltc0F0dHJzIHtcbiAgZGltOiBudW1iZXI7XG59XG5cbmV4cG9ydCBjb25zdCBFeHBtMSA9ICdFeHBtMSc7XG5leHBvcnQgdHlwZSBFeHBtMUlucHV0cyA9IFVuYXJ5SW5wdXRzO1xuXG5leHBvcnQgY29uc3QgRkZUID0gJ0ZGVCc7XG5leHBvcnQgdHlwZSBGRlRJbnB1dHMgPSBQaWNrPE5hbWVkVGVuc29ySW5mb01hcCwgJ2lucHV0Jz47XG5cbmV4cG9ydCBjb25zdCBGaWxsID0gJ0ZpbGwnO1xuZXhwb3J0IGludGVyZmFjZSBGaWxsQXR0cnMge1xuICBzaGFwZTogbnVtYmVyW107XG4gIHZhbHVlOiBudW1iZXJ8c3RyaW5nO1xuICBkdHlwZTogRGF0YVR5cGU7XG59XG5cbmV4cG9ydCBjb25zdCBGbGlwTGVmdFJpZ2h0ID0gJ0ZsaXBMZWZ0UmlnaHQnO1xuZXhwb3J0IHR5cGUgRmxpcExlZnRSaWdodElucHV0cyA9IFBpY2s8TmFtZWRUZW5zb3JJbmZvTWFwLCAnaW1hZ2UnPjtcblxuZXhwb3J0IGNvbnN0IEZsb29yID0gJ0Zsb29yJztcbmV4cG9ydCB0eXBlIEZsb29ySW5wdXRzID0gVW5hcnlJbnB1dHM7XG5cbmV4cG9ydCBjb25zdCBGbG9vckRpdiA9ICdGbG9vckRpdic7XG5leHBvcnQgdHlwZSBGbG9vckRpdklucHV0cyA9IEJpbmFyeUlucHV0cztcblxuZXhwb3J0IGNvbnN0IEZ1c2VkQmF0Y2hOb3JtID0gJ0Z1c2VkQmF0Y2hOb3JtJztcbmV4cG9ydCB0eXBlIEZ1c2VkQmF0Y2hOb3JtSW5wdXRzID1cbiAgICBQaWNrPE5hbWVkVGVuc29ySW5mb01hcCwgJ3gnfCdzY2FsZSd8J29mZnNldCd8J21lYW4nfCd2YXJpYW5jZSc+O1xuZXhwb3J0IGludGVyZmFjZSBGdXNlZEJhdGNoTm9ybUF0dHJzIHtcbiAgdmFyaWFuY2VFcHNpbG9uOiBudW1iZXI7XG59XG5cbmV4cG9ydCBjb25zdCBHYXRoZXJWMiA9ICdHYXRoZXJWMic7XG5leHBvcnQgdHlwZSBHYXRoZXJWMklucHV0cyA9IFBpY2s8TmFtZWRUZW5zb3JJbmZvTWFwLCAneCd8J2luZGljZXMnPjtcbmV4cG9ydCBpbnRlcmZhY2UgR2F0aGVyVjJBdHRycyB7XG4gIGF4aXM6IG51bWJlcjtcbiAgYmF0Y2hEaW1zOiBudW1iZXI7XG59XG5cbmV4cG9ydCBjb25zdCBHYXRoZXJOZCA9ICdHYXRoZXJOZCc7XG5leHBvcnQgdHlwZSBHYXRoZXJOZElucHV0cyA9IFBpY2s8TmFtZWRUZW5zb3JJbmZvTWFwLCAncGFyYW1zJ3wnaW5kaWNlcyc+O1xuXG5leHBvcnQgY29uc3QgR3JlYXRlciA9ICdHcmVhdGVyJztcbmV4cG9ydCB0eXBlIEdyZWF0ZXJJbnB1dHMgPSBCaW5hcnlJbnB1dHM7XG5cbmV4cG9ydCBjb25zdCBHcmVhdGVyRXF1YWwgPSAnR3JlYXRlckVxdWFsJztcbmV4cG9ydCB0eXBlIEdyZWF0ZXJFcXVhbElucHV0cyA9IEJpbmFyeUlucHV0cztcblxuZXhwb3J0IGNvbnN0IElkZW50aXR5ID0gJ0lkZW50aXR5JztcbmV4cG9ydCB0eXBlIElkZW50aXR5SW5wdXRzID0gUGljazxOYW1lZFRlbnNvckluZm9NYXAsICd4Jz47XG5cbmV4cG9ydCBjb25zdCBJRkZUID0gJ0lGRlQnO1xuZXhwb3J0IHR5cGUgSUZGVElucHV0cyA9IFBpY2s8TmFtZWRUZW5zb3JJbmZvTWFwLCAnaW5wdXQnPjtcblxuZXhwb3J0IGNvbnN0IEltYWcgPSAnSW1hZyc7XG5leHBvcnQgdHlwZSBJbWFnSW5wdXRzID0gUGljazxOYW1lZFRlbnNvckluZm9NYXAsICdpbnB1dCc+O1xuXG5leHBvcnQgY29uc3QgSXNGaW5pdGUgPSAnSXNGaW5pdGUnO1xuZXhwb3J0IHR5cGUgSXNGaW5pdGVJbnB1dHMgPSBVbmFyeUlucHV0cztcblxuZXhwb3J0IGNvbnN0IElzSW5mID0gJ0lzSW5mJztcbmV4cG9ydCB0eXBlIElzSW5mSW5wdXRzID0gVW5hcnlJbnB1dHM7XG5cbmV4cG9ydCBjb25zdCBJc05hbiA9ICdJc05hbic7XG5leHBvcnQgdHlwZSBJc05hbklucHV0cyA9IFVuYXJ5SW5wdXRzO1xuXG5leHBvcnQgY29uc3QgTGVha3lSZWx1ID0gJ0xlYWt5UmVsdSc7XG5leHBvcnQgdHlwZSBMZWFreVJlbHVJbnB1dHMgPSBQaWNrPE5hbWVkVGVuc29ySW5mb01hcCwgJ3gnPjtcbmV4cG9ydCBpbnRlcmZhY2UgTGVha3lSZWx1QXR0cnMge1xuICBhbHBoYTogbnVtYmVyO1xufVxuXG5leHBvcnQgY29uc3QgTGVzcyA9ICdMZXNzJztcbmV4cG9ydCB0eXBlIExlc3NJbnB1dHMgPSBCaW5hcnlJbnB1dHM7XG5cbmV4cG9ydCBjb25zdCBMZXNzRXF1YWwgPSAnTGVzc0VxdWFsJztcbmV4cG9ydCB0eXBlIExlc3NFcXVhbElucHV0cyA9IEJpbmFyeUlucHV0cztcblxuZXhwb3J0IGNvbnN0IExpblNwYWNlID0gJ0xpblNwYWNlJztcbmV4cG9ydCBpbnRlcmZhY2UgTGluU3BhY2VBdHRycyB7XG4gIHN0YXJ0OiBudW1iZXI7XG4gIHN0b3A6IG51bWJlcjtcbiAgbnVtOiBudW1iZXI7XG59XG5leHBvcnQgY29uc3QgTG9nID0gJ0xvZyc7XG5leHBvcnQgdHlwZSBMb2dJbnB1dHMgPSBVbmFyeUlucHV0cztcblxuZXhwb3J0IGNvbnN0IExvZzFwID0gJ0xvZzFwJztcbmV4cG9ydCB0eXBlIExvZzFwSW5wdXRzID0gVW5hcnlJbnB1dHM7XG5cbmV4cG9ydCBjb25zdCBMb2dpY2FsQW5kID0gJ0xvZ2ljYWxBbmQnO1xuZXhwb3J0IHR5cGUgTG9naWNhbEFuZElucHV0cyA9IEJpbmFyeUlucHV0cztcblxuZXhwb3J0IGNvbnN0IExvZ2ljYWxOb3QgPSAnTG9naWNhbE5vdCc7XG5leHBvcnQgdHlwZSBMb2dpY2FsTm90SW5wdXRzID0gUGljazxOYW1lZFRlbnNvckluZm9NYXAsICd4Jz47XG5cbmV4cG9ydCBjb25zdCBMb2dpY2FsT3IgPSAnTG9naWNhbE9yJztcbmV4cG9ydCB0eXBlIExvZ2ljYWxPcklucHV0cyA9IEJpbmFyeUlucHV0cztcblxuZXhwb3J0IGNvbnN0IExvZ2ljYWxYb3IgPSAnTG9naWNhbFhvcic7XG5leHBvcnQgdHlwZSBMb2dpY2FsWG9ySW5wdXRzID0gQmluYXJ5SW5wdXRzO1xuXG5leHBvcnQgY29uc3QgTG9nU29mdG1heCA9ICdMb2dTb2Z0bWF4JztcbmV4cG9ydCB0eXBlIExvZ1NvZnRtYXhJbnB1dHMgPSBQaWNrPE5hbWVkVGVuc29ySW5mb01hcCwgJ2xvZ2l0cyc+O1xuZXhwb3J0IGludGVyZmFjZSBMb2dTb2Z0bWF4QXR0cnMge1xuICBheGlzOiBudW1iZXI7XG59XG5cbmV4cG9ydCBjb25zdCBMb3dlckJvdW5kID0gJ0xvd2VyQm91bmQnO1xuZXhwb3J0IHR5cGUgTG93ZXJCb3VuZElucHV0cyA9XG4gICAgUGljazxOYW1lZFRlbnNvckluZm9NYXAsICdzb3J0ZWRTZXF1ZW5jZSd8J3ZhbHVlcyc+O1xuXG5leHBvcnQgY29uc3QgTFJOID0gJ0xSTic7XG5leHBvcnQgdHlwZSBMUk5JbnB1dHMgPSBQaWNrPE5hbWVkVGVuc29ySW5mb01hcCwgJ3gnPjtcbmV4cG9ydCBpbnRlcmZhY2UgTFJOQXR0cnMge1xuICBkZXB0aFJhZGl1czogbnVtYmVyO1xuICBiaWFzOiBudW1iZXI7XG4gIGFscGhhOiBudW1iZXI7XG4gIGJldGE6IG51bWJlcjtcbn1cblxuZXhwb3J0IGNvbnN0IExSTkdyYWQgPSAnTFJOR3JhZCc7XG5leHBvcnQgdHlwZSBMUk5HcmFkSW5wdXRzID0gUGljazxOYW1lZFRlbnNvckluZm9NYXAsICd4J3wneSd8J2R5Jz47XG5leHBvcnQgaW50ZXJmYWNlIExSTkdyYWRBdHRycyB7XG4gIGRlcHRoUmFkaXVzOiBudW1iZXI7XG4gIGJpYXM6IG51bWJlcjtcbiAgYWxwaGE6IG51bWJlcjtcbiAgYmV0YTogbnVtYmVyO1xufVxuXG5leHBvcnQgY29uc3QgTWF4ID0gJ01heCc7XG5leHBvcnQgdHlwZSBNYXhJbnB1dHMgPSBQaWNrPE5hbWVkVGVuc29ySW5mb01hcCwgJ3gnPjtcbmV4cG9ydCBpbnRlcmZhY2UgTWF4QXR0cnMge1xuICByZWR1Y3Rpb25JbmRpY2VzOiBudW1iZXJ8bnVtYmVyW107XG4gIGtlZXBEaW1zOiBib29sZWFuO1xufVxuXG5leHBvcnQgY29uc3QgTWF4aW11bSA9ICdNYXhpbXVtJztcbmV4cG9ydCB0eXBlIE1heGltdW1JbnB1dHMgPSBCaW5hcnlJbnB1dHM7XG5cbmV4cG9ydCBjb25zdCBNYXhQb29sID0gJ01heFBvb2wnO1xuZXhwb3J0IHR5cGUgTWF4UG9vbElucHV0cyA9IFBpY2s8TmFtZWRUZW5zb3JJbmZvTWFwLCAneCc+O1xuZXhwb3J0IGludGVyZmFjZSBNYXhQb29sQXR0cnMge1xuICBmaWx0ZXJTaXplOiBbbnVtYmVyLCBudW1iZXJdfG51bWJlcjtcbiAgc3RyaWRlczogW251bWJlciwgbnVtYmVyXXxudW1iZXI7XG4gIHBhZDogJ3ZhbGlkJ3wnc2FtZSd8bnVtYmVyfEV4cGxpY2l0UGFkZGluZztcbiAgZGltUm91bmRpbmdNb2RlPzogJ2Zsb29yJ3wncm91bmQnfCdjZWlsJztcbn1cblxuZXhwb3J0IGNvbnN0IE1heFBvb2xHcmFkID0gJ01heFBvb2xHcmFkJztcbmV4cG9ydCB0eXBlIE1heFBvb2xHcmFkSW5wdXRzID0gUGljazxOYW1lZFRlbnNvckluZm9NYXAsICdkeSd8J2lucHV0J3wnb3V0cHV0Jz47XG5leHBvcnQgaW50ZXJmYWNlIE1heFBvb2xHcmFkQXR0cnMge1xuICBmaWx0ZXJTaXplOiBbbnVtYmVyLCBudW1iZXJdfG51bWJlcjtcbiAgc3RyaWRlczogW251bWJlciwgbnVtYmVyXXxudW1iZXI7XG4gIHBhZDogJ3ZhbGlkJ3wnc2FtZSd8bnVtYmVyfEV4cGxpY2l0UGFkZGluZztcbiAgZGltUm91bmRpbmdNb2RlPzogJ2Zsb29yJ3wncm91bmQnfCdjZWlsJztcbn1cblxuZXhwb3J0IGNvbnN0IE1heFBvb2wzRCA9ICdNYXhQb29sM0QnO1xuZXhwb3J0IHR5cGUgTWF4UG9vbDNESW5wdXRzID0gUGljazxOYW1lZFRlbnNvckluZm9NYXAsICd4Jz47XG5leHBvcnQgaW50ZXJmYWNlIE1heFBvb2wzREF0dHJzIHtcbiAgZmlsdGVyU2l6ZTogW251bWJlciwgbnVtYmVyLCBudW1iZXJdfG51bWJlcjtcbiAgc3RyaWRlczogW251bWJlciwgbnVtYmVyLCBudW1iZXJdfG51bWJlcjtcbiAgcGFkOiAndmFsaWQnfCdzYW1lJ3xudW1iZXI7XG4gIGRhdGFGb3JtYXQ6ICdOREhXQyd8J05DREhXJztcbiAgZGltUm91bmRpbmdNb2RlPzogJ2Zsb29yJ3wncm91bmQnfCdjZWlsJztcbn1cblxuZXhwb3J0IGNvbnN0IE1heFBvb2wzREdyYWQgPSAnTWF4UG9vbDNER3JhZCc7XG5leHBvcnQgdHlwZSBNYXhQb29sM0RHcmFkSW5wdXRzID1cbiAgICBQaWNrPE5hbWVkVGVuc29ySW5mb01hcCwgJ2R5J3wnaW5wdXQnfCdvdXRwdXQnPjtcbmV4cG9ydCBpbnRlcmZhY2UgTWF4UG9vbDNER3JhZEF0dHJzIHtcbiAgZmlsdGVyU2l6ZTogW251bWJlciwgbnVtYmVyLCBudW1iZXJdfG51bWJlcjtcbiAgc3RyaWRlczogW251bWJlciwgbnVtYmVyLCBudW1iZXJdfG51bWJlcjtcbiAgcGFkOiAndmFsaWQnfCdzYW1lJ3xudW1iZXI7XG4gIGRpbVJvdW5kaW5nTW9kZT86ICdmbG9vcid8J3JvdW5kJ3wnY2VpbCc7XG59XG5cbmV4cG9ydCBjb25zdCBNYXhQb29sV2l0aEFyZ21heCA9ICdNYXhQb29sV2l0aEFyZ21heCc7XG5leHBvcnQgdHlwZSBNYXhQb29sV2l0aEFyZ21heElucHV0cyA9IFBpY2s8TmFtZWRUZW5zb3JJbmZvTWFwLCAneCc+O1xuZXhwb3J0IGludGVyZmFjZSBNYXhQb29sV2l0aEFyZ21heEF0dHJzIHtcbiAgZmlsdGVyU2l6ZTogW251bWJlciwgbnVtYmVyXXxudW1iZXI7XG4gIHN0cmlkZXM6IFtudW1iZXIsIG51bWJlcl18bnVtYmVyO1xuICBwYWQ6ICd2YWxpZCd8J3NhbWUnfG51bWJlcjtcbiAgaW5jbHVkZUJhdGNoSW5JbmRleDogYm9vbGVhbjtcbn1cblxuZXhwb3J0IGNvbnN0IE1lYW4gPSAnTWVhbic7XG5leHBvcnQgdHlwZSBNZWFuSW5wdXRzID0gUGljazxOYW1lZFRlbnNvckluZm9NYXAsICd4Jz47XG5leHBvcnQgaW50ZXJmYWNlIE1lYW5BdHRycyB7XG4gIGF4aXM6IG51bWJlcnxudW1iZXJbXTtcbiAga2VlcERpbXM6IGJvb2xlYW47XG59XG5cbmV4cG9ydCBjb25zdCBNaW4gPSAnTWluJztcbmV4cG9ydCB0eXBlIE1pbklucHV0cyA9IFBpY2s8TmFtZWRUZW5zb3JJbmZvTWFwLCAneCc+O1xuZXhwb3J0IGludGVyZmFjZSBNaW5BdHRycyB7XG4gIGF4aXM6IG51bWJlcnxudW1iZXJbXTtcbiAga2VlcERpbXM6IGJvb2xlYW47XG59XG5cbmV4cG9ydCBjb25zdCBNaW5pbXVtID0gJ01pbmltdW0nO1xuZXhwb3J0IHR5cGUgTWluaW11bUlucHV0cyA9IEJpbmFyeUlucHV0cztcblxuZXhwb3J0IGNvbnN0IE1pcnJvclBhZCA9ICdNaXJyb3JQYWQnO1xuZXhwb3J0IHR5cGUgTWlycm9yUGFkSW5wdXRzID0gUGljazxOYW1lZFRlbnNvckluZm9NYXAsICd4Jz47XG5leHBvcnQgaW50ZXJmYWNlIE1pcnJvclBhZEF0dHJzIHtcbiAgcGFkZGluZ3M6IEFycmF5PFtudW1iZXIsIG51bWJlcl0+O1xuICBtb2RlOiAncmVmbGVjdCd8J3N5bW1ldHJpYyc7XG59XG5cbmV4cG9ydCBjb25zdCBNb2QgPSAnTW9kJztcbmV4cG9ydCB0eXBlIE1vZElucHV0cyA9IEJpbmFyeUlucHV0cztcblxuZXhwb3J0IGNvbnN0IE11bHRpbm9taWFsID0gJ011bHRpbm9taWFsJztcbmV4cG9ydCB0eXBlIE11bHRpbm9taWFsSW5wdXRzID0gUGljazxOYW1lZFRlbnNvckluZm9NYXAsICdsb2dpdHMnPjtcbmV4cG9ydCBpbnRlcmZhY2UgTXVsdGlub21pYWxBdHRycyB7XG4gIG51bVNhbXBsZXM6IG51bWJlcjtcbiAgc2VlZDogbnVtYmVyO1xuICBub3JtYWxpemVkOiBib29sZWFuO1xufVxuXG5leHBvcnQgY29uc3QgTXVsdGlwbHkgPSAnTXVsdGlwbHknO1xuZXhwb3J0IHR5cGUgTXVsdGlwbHlJbnB1dHMgPSBCaW5hcnlJbnB1dHM7XG5cbmV4cG9ydCBjb25zdCBOZWcgPSAnTmVnJztcbmV4cG9ydCB0eXBlIE5lZ0lucHV0cyA9IFVuYXJ5SW5wdXRzO1xuXG5leHBvcnQgY29uc3QgTm90RXF1YWwgPSAnTm90RXF1YWwnO1xuZXhwb3J0IHR5cGUgTm90RXF1YWxJbnB1dHMgPSBCaW5hcnlJbnB1dHM7XG5cbmV4cG9ydCBjb25zdCBOb25NYXhTdXBwcmVzc2lvblYzID0gJ05vbk1heFN1cHByZXNzaW9uVjMnO1xuZXhwb3J0IHR5cGUgTm9uTWF4U3VwcHJlc3Npb25WM0lucHV0cyA9XG4gICAgUGljazxOYW1lZFRlbnNvckluZm9NYXAsICdib3hlcyd8J3Njb3Jlcyc+O1xuZXhwb3J0IGludGVyZmFjZSBOb25NYXhTdXBwcmVzc2lvblYzQXR0cnMge1xuICBtYXhPdXRwdXRTaXplOiBudW1iZXI7XG4gIGlvdVRocmVzaG9sZDogbnVtYmVyO1xuICBzY29yZVRocmVzaG9sZDogbnVtYmVyO1xufVxuXG5leHBvcnQgY29uc3QgTm9uTWF4U3VwcHJlc3Npb25WNCA9ICdOb25NYXhTdXBwcmVzc2lvblY0JztcbmV4cG9ydCB0eXBlIE5vbk1heFN1cHByZXNzaW9uVjRJbnB1dHMgPVxuICAgIFBpY2s8TmFtZWRUZW5zb3JJbmZvTWFwLCAnYm94ZXMnfCdzY29yZXMnPjtcbmV4cG9ydCBpbnRlcmZhY2UgTm9uTWF4U3VwcHJlc3Npb25WNEF0dHJzIHtcbiAgbWF4T3V0cHV0U2l6ZTogbnVtYmVyO1xuICBpb3VUaHJlc2hvbGQ6IG51bWJlcjtcbiAgc2NvcmVUaHJlc2hvbGQ6IG51bWJlcjtcbiAgcGFkVG9NYXhPdXRwdXRTaXplOiBib29sZWFuO1xufVxuXG5leHBvcnQgY29uc3QgTm9uTWF4U3VwcHJlc3Npb25WNSA9ICdOb25NYXhTdXBwcmVzc2lvblY1JztcbmV4cG9ydCB0eXBlIE5vbk1heFN1cHByZXNzaW9uVjVJbnB1dHMgPVxuICAgIFBpY2s8TmFtZWRUZW5zb3JJbmZvTWFwLCAnYm94ZXMnfCdzY29yZXMnPjtcbmV4cG9ydCBpbnRlcmZhY2UgTm9uTWF4U3VwcHJlc3Npb25WNUF0dHJzIHtcbiAgbWF4T3V0cHV0U2l6ZTogbnVtYmVyO1xuICBpb3VUaHJlc2hvbGQ6IG51bWJlcjtcbiAgc2NvcmVUaHJlc2hvbGQ6IG51bWJlcjtcbiAgc29mdE5tc1NpZ21hOiBudW1iZXI7XG59XG5cbmV4cG9ydCBjb25zdCBPbmVzTGlrZSA9ICdPbmVzTGlrZSc7XG5leHBvcnQgdHlwZSBPbmVzTGlrZUlucHV0cyA9IFVuYXJ5SW5wdXRzO1xuXG5leHBvcnQgY29uc3QgT25lSG90ID0gJ09uZUhvdCc7XG5leHBvcnQgdHlwZSBPbmVIb3RJbnB1dHMgPSBQaWNrPE5hbWVkVGVuc29ySW5mb01hcCwgJ2luZGljZXMnPjtcbmV4cG9ydCBpbnRlcmZhY2UgT25lSG90QXR0cnMge1xuICBkZXB0aDogbnVtYmVyO1xuICBvblZhbHVlOiBudW1iZXI7XG4gIG9mZlZhbHVlOiBudW1iZXI7XG4gIGR0eXBlOiBEYXRhVHlwZTtcbn1cblxuZXhwb3J0IGNvbnN0IFBhY2sgPSAnUGFjayc7XG5leHBvcnQgdHlwZSBQYWNrSW5wdXRzID0gVGVuc29ySW5mb1tdO1xuZXhwb3J0IGludGVyZmFjZSBQYWNrQXR0cnMge1xuICBheGlzOiBudW1iZXI7XG59XG5cbmV4cG9ydCBjb25zdCBQYWRWMiA9ICdQYWRWMic7XG5leHBvcnQgdHlwZSBQYWRWMklucHV0cyA9IFBpY2s8TmFtZWRUZW5zb3JJbmZvTWFwLCAneCc+O1xuZXhwb3J0IGludGVyZmFjZSBQYWRWMkF0dHJzIHtcbiAgcGFkZGluZ3M6IEFycmF5PFtudW1iZXIsIG51bWJlcl0+O1xuICBjb25zdGFudFZhbHVlOiBudW1iZXI7XG59XG5cbmV4cG9ydCBjb25zdCBQb29sID0gJ1Bvb2wnO1xuZXhwb3J0IHR5cGUgUG9vbElucHV0cyA9IFBpY2s8TmFtZWRUZW5zb3JJbmZvTWFwLCAnaW5wdXQnPjtcblxuZXhwb3J0IGNvbnN0IFBvdyA9ICdQb3cnO1xuZXhwb3J0IHR5cGUgUG93SW5wdXRzID0gQmluYXJ5SW5wdXRzO1xuXG5leHBvcnQgY29uc3QgUHJlbHUgPSAnUHJlbHUnO1xuZXhwb3J0IHR5cGUgUHJlbHVJbnB1dHMgPSBQaWNrPE5hbWVkVGVuc29ySW5mb01hcCwgJ3gnfCdhbHBoYSc+O1xuXG5leHBvcnQgY29uc3QgUHJvZCA9ICdQcm9kJztcbmV4cG9ydCB0eXBlIFByb2RJbnB1dHMgPSBQaWNrPE5hbWVkVGVuc29ySW5mb01hcCwgJ3gnPjtcbmV4cG9ydCBpbnRlcmZhY2UgUHJvZEF0dHJzIHtcbiAgYXhpczogbnVtYmVyfG51bWJlcltdO1xuICBrZWVwRGltczogYm9vbGVhbjtcbn1cblxuZXhwb3J0IGNvbnN0IFJhZ2dlZEdhdGhlciA9ICdSYWdnZWRHYXRoZXInO1xuZXhwb3J0IHR5cGUgUmFnZ2VkR2F0aGVySW5wdXRzID0ge1xuICBwYXJhbXNOZXN0ZWRTcGxpdHM6IFRlbnNvckluZm9bXVxufSZQaWNrPE5hbWVkVGVuc29ySW5mb01hcCwgJ3BhcmFtc0RlbnNlVmFsdWVzJ3wnaW5kaWNlcyc+O1xuZXhwb3J0IGludGVyZmFjZSBSYWdnZWRHYXRoZXJBdHRycyB7XG4gIG91dHB1dFJhZ2dlZFJhbms6IG51bWJlcjtcbn1cblxuZXhwb3J0IGNvbnN0IFJhZ2dlZFRlbnNvclRvVGVuc29yID0gJ1JhZ2dlZFRlbnNvclRvVGVuc29yJztcbmV4cG9ydCB0eXBlIFJhZ2dlZFRlbnNvclRvVGVuc29ySW5wdXRzID1cbiAgICBQaWNrPE5hbWVkVGVuc29ySW5mb01hcCwgJ3NoYXBlJ3wndmFsdWVzJ3wnZGVmYXVsdFZhbHVlJz4mXG4gICAge3Jvd1BhcnRpdGlvblRlbnNvcnM6IFRlbnNvckluZm9bXX07XG5leHBvcnQgaW50ZXJmYWNlIFJhZ2dlZFRlbnNvclRvVGVuc29yQXR0cnMge1xuICByb3dQYXJ0aXRpb25UeXBlczogc3RyaW5nW107XG59XG5cbmV4cG9ydCBjb25zdCBSYW5nZSA9ICdSYW5nZSc7XG5leHBvcnQgaW50ZXJmYWNlIFJhbmdlQXR0cnMge1xuICBzdGFydDogbnVtYmVyO1xuICBzdG9wOiBudW1iZXI7XG4gIHN0ZXA6IG51bWJlcjtcbiAgZHR5cGU6ICdmbG9hdDMyJ3wnaW50MzInO1xufVxuXG5leHBvcnQgY29uc3QgUmVhbCA9ICdSZWFsJztcbmV4cG9ydCB0eXBlIFJlYWxJbnB1dHMgPSBQaWNrPE5hbWVkVGVuc29ySW5mb01hcCwgJ2lucHV0Jz47XG5cbmV4cG9ydCBjb25zdCBSZWNpcHJvY2FsID0gJ1JlY2lwcm9jYWwnO1xuZXhwb3J0IHR5cGUgUmVjaXByb2NhbElucHV0cyA9IFVuYXJ5SW5wdXRzO1xuXG5leHBvcnQgY29uc3QgUmVsdSA9ICdSZWx1JztcbmV4cG9ydCB0eXBlIFJlbHVJbnB1dHMgPSBQaWNrPE5hbWVkVGVuc29ySW5mb01hcCwgJ3gnPjtcblxuZXhwb3J0IGNvbnN0IFJlc2hhcGUgPSAnUmVzaGFwZSc7XG5leHBvcnQgdHlwZSBSZXNoYXBlSW5wdXRzID0gUGljazxOYW1lZFRlbnNvckluZm9NYXAsICd4Jz47XG5leHBvcnQgaW50ZXJmYWNlIFJlc2hhcGVBdHRycyB7XG4gIHNoYXBlOiBudW1iZXJbXTtcbn1cblxuZXhwb3J0IGNvbnN0IFJlc2l6ZU5lYXJlc3ROZWlnaGJvciA9ICdSZXNpemVOZWFyZXN0TmVpZ2hib3InO1xuZXhwb3J0IHR5cGUgUmVzaXplTmVhcmVzdE5laWdoYm9ySW5wdXRzID0gUGljazxOYW1lZFRlbnNvckluZm9NYXAsICdpbWFnZXMnPjtcbmV4cG9ydCBpbnRlcmZhY2UgUmVzaXplTmVhcmVzdE5laWdoYm9yQXR0cnMge1xuICBhbGlnbkNvcm5lcnM6IGJvb2xlYW47XG4gIGhhbGZQaXhlbENlbnRlcnM6IGJvb2xlYW47XG4gIHNpemU6IFtudW1iZXIsIG51bWJlcl07XG59XG5cbmV4cG9ydCBjb25zdCBSZXNpemVOZWFyZXN0TmVpZ2hib3JHcmFkID0gJ1Jlc2l6ZU5lYXJlc3ROZWlnaGJvckdyYWQnO1xuZXhwb3J0IHR5cGUgUmVzaXplTmVhcmVzdE5laWdoYm9yR3JhZElucHV0cyA9XG4gICAgUGljazxOYW1lZFRlbnNvckluZm9NYXAsICdpbWFnZXMnfCdkeSc+O1xuZXhwb3J0IHR5cGUgUmVzaXplTmVhcmVzdE5laWdoYm9yR3JhZEF0dHJzID0gUmVzaXplTmVhcmVzdE5laWdoYm9yQXR0cnM7XG5cbmV4cG9ydCBjb25zdCBSZXNpemVCaWxpbmVhciA9ICdSZXNpemVCaWxpbmVhcic7XG5leHBvcnQgdHlwZSBSZXNpemVCaWxpbmVhcklucHV0cyA9IFBpY2s8TmFtZWRUZW5zb3JJbmZvTWFwLCAnaW1hZ2VzJz47XG5leHBvcnQgaW50ZXJmYWNlIFJlc2l6ZUJpbGluZWFyQXR0cnMge1xuICBhbGlnbkNvcm5lcnM6IGJvb2xlYW47XG4gIGhhbGZQaXhlbENlbnRlcnM6IGJvb2xlYW47XG4gIHNpemU6IFtudW1iZXIsIG51bWJlcl07XG59XG5cbmV4cG9ydCBjb25zdCBSZXNpemVCaWxpbmVhckdyYWQgPSAnUmVzaXplQmlsaW5lYXJHcmFkJztcbmV4cG9ydCB0eXBlIFJlc2l6ZUJpbGluZWFyR3JhZElucHV0cyA9IFBpY2s8TmFtZWRUZW5zb3JJbmZvTWFwLCAnaW1hZ2VzJ3wnZHknPjtcbmV4cG9ydCB0eXBlIFJlc2l6ZUJpbGluZWFyR3JhZEF0dHJzID0gUmVzaXplQmlsaW5lYXJBdHRycztcblxuZXhwb3J0IGNvbnN0IFJlbHU2ID0gJ1JlbHU2JztcbmV4cG9ydCB0eXBlIFJlbHU2SW5wdXRzID0gUGljazxOYW1lZFRlbnNvckluZm9NYXAsICd4Jz47XG5cbmV4cG9ydCBjb25zdCBSZXZlcnNlID0gJ1JldmVyc2UnO1xuZXhwb3J0IHR5cGUgUmV2ZXJzZUlucHV0cyA9IFBpY2s8TmFtZWRUZW5zb3JJbmZvTWFwLCAneCc+O1xuZXhwb3J0IGludGVyZmFjZSBSZXZlcnNlQXR0cnMge1xuICBkaW1zOiBudW1iZXJ8bnVtYmVyW107XG59XG5cbmV4cG9ydCBjb25zdCBSb3VuZCA9ICdSb3VuZCc7XG5leHBvcnQgdHlwZSBSb3VuZElucHV0cyA9IFVuYXJ5SW5wdXRzO1xuXG5leHBvcnQgY29uc3QgUnNxcnQgPSAnUnNxcnQnO1xuZXhwb3J0IHR5cGUgUnNxcnRJbnB1dHMgPSBVbmFyeUlucHV0cztcblxuZXhwb3J0IGNvbnN0IFNjYXR0ZXJOZCA9ICdTY2F0dGVyTmQnO1xuZXhwb3J0IHR5cGUgU2NhdHRlck5kSW5wdXRzID0gUGljazxOYW1lZFRlbnNvckluZm9NYXAsICdpbmRpY2VzJ3wndXBkYXRlcyc+O1xuZXhwb3J0IGludGVyZmFjZSBTY2F0dGVyTmRBdHRycyB7XG4gIHNoYXBlOiBudW1iZXJbXTtcbn1cblxuZXhwb3J0IGNvbnN0IFNlYXJjaFNvcnRlZCA9ICdTZWFyY2hTb3J0ZWQnO1xuZXhwb3J0IHR5cGUgU2VhcmNoU29ydGVkSW5wdXRzID1cbiAgICBQaWNrPE5hbWVkVGVuc29ySW5mb01hcCwgJ3NvcnRlZFNlcXVlbmNlJ3wndmFsdWVzJz47XG5leHBvcnQgaW50ZXJmYWNlIFNlYXJjaFNvcnRlZEF0dHJzIHtcbiAgc2lkZTogJ2xlZnQnfCdyaWdodCc7XG59XG5cbmV4cG9ydCBjb25zdCBTZWxlY3QgPSAnU2VsZWN0JztcbmV4cG9ydCB0eXBlIFNlbGVjdElucHV0cyA9IFBpY2s8TmFtZWRUZW5zb3JJbmZvTWFwLCAnY29uZGl0aW9uJ3wndCd8J2UnPjtcblxuZXhwb3J0IGNvbnN0IFNlbHUgPSAnU2VsdSc7XG5leHBvcnQgdHlwZSBTZWx1SW5wdXRzID0gUGljazxOYW1lZFRlbnNvckluZm9NYXAsICd4Jz47XG5cbmV4cG9ydCBjb25zdCBTbGljZSA9ICdTbGljZSc7XG5leHBvcnQgdHlwZSBTbGljZUlucHV0cyA9IFBpY2s8TmFtZWRUZW5zb3JJbmZvTWFwLCAneCc+O1xuZXhwb3J0IGludGVyZmFjZSBTbGljZUF0dHJzIHtcbiAgYmVnaW46IG51bWJlcnxudW1iZXJbXTtcbiAgc2l6ZTogbnVtYmVyfG51bWJlcltdO1xufVxuZXhwb3J0IGNvbnN0IFNpbiA9ICdTaW4nO1xuZXhwb3J0IHR5cGUgU2luSW5wdXRzID0gVW5hcnlJbnB1dHM7XG5cbmV4cG9ydCBjb25zdCBTaW5oID0gJ1NpbmgnO1xuZXhwb3J0IHR5cGUgU2luaElucHV0cyA9IFVuYXJ5SW5wdXRzO1xuXG5leHBvcnQgY29uc3QgU2lnbiA9ICdTaWduJztcbmV4cG9ydCB0eXBlIFNpZ25JbnB1dHMgPSBVbmFyeUlucHV0cztcblxuZXhwb3J0IGNvbnN0IFNpZ21vaWQgPSAnU2lnbW9pZCc7XG5leHBvcnQgdHlwZSBTaWdtb2lkSW5wdXRzID0gVW5hcnlJbnB1dHM7XG5cbmV4cG9ydCBjb25zdCBTb2Z0cGx1cyA9ICdTb2Z0cGx1cyc7XG5leHBvcnQgdHlwZSBTb2Z0cGx1c0lucHV0cyA9IFVuYXJ5SW5wdXRzO1xuXG5leHBvcnQgY29uc3QgU3FydCA9ICdTcXJ0JztcbmV4cG9ydCB0eXBlIFNxcnRJbnB1dHMgPSBVbmFyeUlucHV0cztcblxuZXhwb3J0IGNvbnN0IFN1bSA9ICdTdW0nO1xuZXhwb3J0IHR5cGUgU3VtSW5wdXRzID0gUGljazxOYW1lZFRlbnNvckluZm9NYXAsICd4Jz47XG5leHBvcnQgaW50ZXJmYWNlIFN1bUF0dHJzIHtcbiAgYXhpczogbnVtYmVyfG51bWJlcltdO1xuICBrZWVwRGltczogYm9vbGVhbjtcbn1cblxuZXhwb3J0IGNvbnN0IFNwYWNlVG9CYXRjaE5EID0gJ1NwYWNlVG9CYXRjaE5EJztcbmV4cG9ydCB0eXBlIFNwYWNlVG9CYXRjaE5ESW5wdXRzID0gUGljazxOYW1lZFRlbnNvckluZm9NYXAsICd4Jz47XG5leHBvcnQgaW50ZXJmYWNlIFNwYWNlVG9CYXRjaE5EQXR0cnMge1xuICBibG9ja1NoYXBlOiBudW1iZXJbXTtcbiAgcGFkZGluZ3M6IG51bWJlcltdW107XG59XG5cbmV4cG9ydCBjb25zdCBTcGxpdFYgPSAnU3BsaXRWJztcbmV4cG9ydCB0eXBlIFNwbGl0VklucHV0cyA9IFBpY2s8TmFtZWRUZW5zb3JJbmZvTWFwLCAneCc+O1xuZXhwb3J0IGludGVyZmFjZSBTcGxpdFZBdHRycyB7XG4gIG51bU9yU2l6ZVNwbGl0czogbnVtYmVyW118bnVtYmVyO1xuICBheGlzOiBudW1iZXI7XG59XG5cbmV4cG9ydCBjb25zdCBTb2Z0bWF4ID0gJ1NvZnRtYXgnO1xuZXhwb3J0IHR5cGUgU29mdG1heElucHV0cyA9IFBpY2s8TmFtZWRUZW5zb3JJbmZvTWFwLCAnbG9naXRzJz47XG5leHBvcnQgaW50ZXJmYWNlIFNvZnRtYXhBdHRycyB7XG4gIGRpbTogbnVtYmVyO1xufVxuXG5leHBvcnQgY29uc3QgU3BhcnNlRmlsbEVtcHR5Um93cyA9ICdTcGFyc2VGaWxsRW1wdHlSb3dzJztcbmV4cG9ydCB0eXBlIFNwYXJzZUZpbGxFbXB0eVJvd3NJbnB1dHMgPVxuICAgIFBpY2s8TmFtZWRUZW5zb3JJbmZvTWFwLCAnaW5kaWNlcyd8J3ZhbHVlcyd8J2RlbnNlU2hhcGUnfCdkZWZhdWx0VmFsdWUnPjtcblxuZXhwb3J0IGNvbnN0IFNwYXJzZVJlc2hhcGUgPSAnU3BhcnNlUmVzaGFwZSc7XG5leHBvcnQgdHlwZSBTcGFyc2VSZXNoYXBlSW5wdXRzID1cbiAgICBQaWNrPE5hbWVkVGVuc29ySW5mb01hcCwgJ2lucHV0SW5kaWNlcyd8J2lucHV0U2hhcGUnfCduZXdTaGFwZSc+O1xuXG5leHBvcnQgY29uc3QgU3BhcnNlU2VnbWVudE1lYW4gPSAnU3BhcnNlU2VnbWVudE1lYW4nO1xuZXhwb3J0IHR5cGUgU3BhcnNlU2VnbWVudE1lYW5JbnB1dHMgPVxuICAgIFBpY2s8TmFtZWRUZW5zb3JJbmZvTWFwLCAnZGF0YSd8J2luZGljZXMnfCdzZWdtZW50SWRzJz47XG5cbmV4cG9ydCBjb25zdCBTcGFyc2VTZWdtZW50U3VtID0gJ1NwYXJzZVNlZ21lbnRTdW0nO1xuZXhwb3J0IHR5cGUgU3BhcnNlU2VnbWVudFN1bUlucHV0cyA9XG4gICAgUGljazxOYW1lZFRlbnNvckluZm9NYXAsICdkYXRhJ3wnaW5kaWNlcyd8J3NlZ21lbnRJZHMnPjtcblxuZXhwb3J0IGNvbnN0IFNwYXJzZVRvRGVuc2UgPSAnU3BhcnNlVG9EZW5zZSc7XG5leHBvcnQgdHlwZSBTcGFyc2VUb0RlbnNlSW5wdXRzID1cbiAgICBQaWNrPE5hbWVkVGVuc29ySW5mb01hcCwgJ3NwYXJzZUluZGljZXMnfCdzcGFyc2VWYWx1ZXMnfCdkZWZhdWx0VmFsdWUnPjtcbmV4cG9ydCBpbnRlcmZhY2UgU3BhcnNlVG9EZW5zZUF0dHJzIHtcbiAgb3V0cHV0U2hhcGU6IG51bWJlcltdO1xufVxuXG5leHBvcnQgY29uc3QgU3F1YXJlZERpZmZlcmVuY2UgPSAnU3F1YXJlZERpZmZlcmVuY2UnO1xuZXhwb3J0IHR5cGUgU3F1YXJlZERpZmZlcmVuY2VJbnB1dHMgPSBCaW5hcnlJbnB1dHM7XG5cbmV4cG9ydCBjb25zdCBTcXVhcmUgPSAnU3F1YXJlJztcbmV4cG9ydCB0eXBlIFNxdWFyZUlucHV0cyA9IFBpY2s8TmFtZWRUZW5zb3JJbmZvTWFwLCAneCc+O1xuXG5leHBvcnQgY29uc3QgU3RyaWRlZFNsaWNlID0gJ1N0cmlkZWRTbGljZSc7XG5leHBvcnQgdHlwZSBTdHJpZGVkU2xpY2VJbnB1dHMgPSBQaWNrPE5hbWVkVGVuc29ySW5mb01hcCwgJ3gnPjtcbmV4cG9ydCBpbnRlcmZhY2UgU3RyaWRlZFNsaWNlQXR0cnMge1xuICBiZWdpbjogbnVtYmVyW107XG4gIGVuZDogbnVtYmVyW107XG4gIHN0cmlkZXM6IG51bWJlcltdO1xuICBiZWdpbk1hc2s6IG51bWJlcjtcbiAgZW5kTWFzazogbnVtYmVyO1xuICBlbGxpcHNpc01hc2s6IG51bWJlcjtcbiAgbmV3QXhpc01hc2s6IG51bWJlcjtcbiAgc2hyaW5rQXhpc01hc2s6IG51bWJlcjtcbn1cblxuZXhwb3J0IGNvbnN0IFN0cmluZ05HcmFtcyA9ICdTdHJpbmdOR3JhbXMnO1xuZXhwb3J0IHR5cGUgU3RyaW5nTkdyYW1zSW5wdXRzID0gUGljazxOYW1lZFRlbnNvckluZm9NYXAsICdkYXRhJ3wnZGF0YVNwbGl0cyc+O1xuZXhwb3J0IGludGVyZmFjZSBTdHJpbmdOR3JhbXNBdHRycyB7XG4gIHNlcGFyYXRvcjogc3RyaW5nO1xuICBuR3JhbVdpZHRoczogbnVtYmVyW107XG4gIGxlZnRQYWQ6IHN0cmluZztcbiAgcmlnaHRQYWQ6IHN0cmluZztcbiAgcGFkV2lkdGg6IG51bWJlcjtcbiAgcHJlc2VydmVTaG9ydFNlcXVlbmNlczogYm9vbGVhbjtcbn1cblxuZXhwb3J0IGNvbnN0IFN0cmluZ1NwbGl0ID0gJ1N0cmluZ1NwbGl0JztcbmV4cG9ydCB0eXBlIFN0cmluZ1NwbGl0SW5wdXRzID0gUGljazxOYW1lZFRlbnNvckluZm9NYXAsICdpbnB1dCd8J2RlbGltaXRlcic+O1xuZXhwb3J0IGludGVyZmFjZSBTdHJpbmdTcGxpdEF0dHJzIHtcbiAgc2tpcEVtcHR5OiBib29sZWFuO1xufVxuXG5leHBvcnQgY29uc3QgU3RyaW5nVG9IYXNoQnVja2V0RmFzdCA9ICdTdHJpbmdUb0hhc2hCdWNrZXRGYXN0JztcbmV4cG9ydCB0eXBlIFN0cmluZ1RvSGFzaEJ1Y2tldEZhc3RJbnB1dHMgPSBQaWNrPE5hbWVkVGVuc29ySW5mb01hcCwgJ2lucHV0Jz47XG5leHBvcnQgaW50ZXJmYWNlIFN0cmluZ1RvSGFzaEJ1Y2tldEZhc3RBdHRycyB7XG4gIG51bUJ1Y2tldHM6IG51bWJlcjtcbn1cblxuZXhwb3J0IGNvbnN0IFN1YiA9ICdTdWInO1xuZXhwb3J0IHR5cGUgU3ViSW5wdXRzID0gQmluYXJ5SW5wdXRzO1xuXG5leHBvcnQgY29uc3QgVGFuID0gJ1Rhbic7XG5leHBvcnQgdHlwZSBUYW5JbnB1dHMgPSBVbmFyeUlucHV0cztcblxuZXhwb3J0IGNvbnN0IFRhbmggPSAnVGFuaCc7XG5leHBvcnQgdHlwZSBUYW5oSW5wdXRzID0gVW5hcnlJbnB1dHM7XG5cbmV4cG9ydCBjb25zdCBUaWxlID0gJ1RpbGUnO1xuZXhwb3J0IHR5cGUgVGlsZUlucHV0cyA9IFBpY2s8TmFtZWRUZW5zb3JJbmZvTWFwLCAneCc+O1xuZXhwb3J0IGludGVyZmFjZSBUaWxlQXR0cnMge1xuICByZXBzOiBudW1iZXJbXTtcbn1cblxuZXhwb3J0IGNvbnN0IFRvcEsgPSAnVG9wSyc7XG5leHBvcnQgdHlwZSBUb3BLSW5wdXRzID0gUGljazxOYW1lZFRlbnNvckluZm9NYXAsICd4Jz47XG5leHBvcnQgaW50ZXJmYWNlIFRvcEtBdHRycyB7XG4gIGs6IG51bWJlcjtcbiAgc29ydGVkOiBib29sZWFuO1xufVxuXG5leHBvcnQgY29uc3QgVHJhbnNmb3JtID0gJ1RyYW5zZm9ybSc7XG5leHBvcnQgdHlwZSBUcmFuc2Zvcm1JbnB1dHMgPSBQaWNrPE5hbWVkVGVuc29ySW5mb01hcCwgJ2ltYWdlJ3wndHJhbnNmb3Jtcyc+O1xuZXhwb3J0IGludGVyZmFjZSBUcmFuc2Zvcm1BdHRycyB7XG4gIGludGVycG9sYXRpb246ICduZWFyZXN0J3wnYmlsaW5lYXInO1xuICBmaWxsTW9kZTogJ2NvbnN0YW50J3wncmVmbGVjdCd8J3dyYXAnfCduZWFyZXN0JztcbiAgZmlsbFZhbHVlOiBudW1iZXI7XG4gIG91dHB1dFNoYXBlPzogW251bWJlciwgbnVtYmVyXTtcbn1cblxuZXhwb3J0IGNvbnN0IFRyYW5zcG9zZSA9ICdUcmFuc3Bvc2UnO1xuZXhwb3J0IHR5cGUgVHJhbnNwb3NlSW5wdXRzID0gUGljazxOYW1lZFRlbnNvckluZm9NYXAsICd4Jz47XG5leHBvcnQgaW50ZXJmYWNlIFRyYW5zcG9zZUF0dHJzIHtcbiAgcGVybTogbnVtYmVyW107XG59XG5cbmV4cG9ydCBjb25zdCBVbmlxdWUgPSAnVW5pcXVlJztcbmV4cG9ydCB0eXBlIFVuaXF1ZUlucHV0cyA9IFBpY2s8TmFtZWRUZW5zb3JJbmZvTWFwLCAneCc+O1xuZXhwb3J0IGludGVyZmFjZSBVbmlxdWVBdHRycyB7XG4gIGF4aXM6IG51bWJlcjtcbn1cblxuZXhwb3J0IHR5cGUgVW5hcnlJbnB1dHMgPSBQaWNrPE5hbWVkVGVuc29ySW5mb01hcCwgJ3gnPjtcblxuZXhwb3J0IGNvbnN0IFVucGFjayA9ICdVbnBhY2snO1xuZXhwb3J0IHR5cGUgVW5wYWNrSW5wdXRzID0gUGljazxOYW1lZFRlbnNvckluZm9NYXAsICd2YWx1ZSc+O1xuZXhwb3J0IGludGVyZmFjZSBVbnBhY2tBdHRycyB7XG4gIGF4aXM6IG51bWJlcjtcbn1cblxuZXhwb3J0IGNvbnN0IFVuc29ydGVkU2VnbWVudFN1bSA9ICdVbnNvcnRlZFNlZ21lbnRTdW0nO1xuZXhwb3J0IHR5cGUgVW5zb3J0ZWRTZWdtZW50U3VtSW5wdXRzID1cbiAgICBQaWNrPE5hbWVkVGVuc29ySW5mb01hcCwgJ3gnfCdzZWdtZW50SWRzJz47XG5leHBvcnQgaW50ZXJmYWNlIFVuc29ydGVkU2VnbWVudFN1bUF0dHJzIHtcbiAgbnVtU2VnbWVudHM6IG51bWJlcjtcbn1cblxuZXhwb3J0IGNvbnN0IFVwcGVyQm91bmQgPSAnVXBwZXJCb3VuZCc7XG5leHBvcnQgdHlwZSBVcHBlckJvdW5kSW5wdXRzID1cbiAgICBQaWNrPE5hbWVkVGVuc29ySW5mb01hcCwgJ3NvcnRlZFNlcXVlbmNlJ3wndmFsdWVzJz47XG5cbmV4cG9ydCBjb25zdCBaZXJvc0xpa2UgPSAnWmVyb3NMaWtlJztcbmV4cG9ydCB0eXBlIFplcm9zTGlrZUlucHV0cyA9IFVuYXJ5SW5wdXRzO1xuXG4vKipcbiAqIFRlbnNvckZsb3cuanMtb25seSBrZXJuZWxzXG4gKi9cbmV4cG9ydCBjb25zdCBTdGVwID0gJ1N0ZXAnO1xuZXhwb3J0IHR5cGUgU3RlcElucHV0cyA9IFVuYXJ5SW5wdXRzO1xuZXhwb3J0IGludGVyZmFjZSBTdGVwQXR0cnMge1xuICBhbHBoYTogbnVtYmVyO1xufVxuXG5leHBvcnQgY29uc3QgRnJvbVBpeGVscyA9ICdGcm9tUGl4ZWxzJztcbmV4cG9ydCBpbnRlcmZhY2UgRnJvbVBpeGVsc0lucHV0cyB7XG4gIHBpeGVsczogUGl4ZWxEYXRhfEltYWdlRGF0YXxIVE1MSW1hZ2VFbGVtZW50fEhUTUxDYW52YXNFbGVtZW50fFxuICAgICAgSFRNTFZpZGVvRWxlbWVudHxJbWFnZUJpdG1hcDtcbn1cbmV4cG9ydCBpbnRlcmZhY2UgRnJvbVBpeGVsc0F0dHJzIHtcbiAgbnVtQ2hhbm5lbHM6IG51bWJlcjtcbn1cblxuZXhwb3J0IGNvbnN0IFJvdGF0ZVdpdGhPZmZzZXQgPSAnUm90YXRlV2l0aE9mZnNldCc7XG5leHBvcnQgdHlwZSBSb3RhdGVXaXRoT2Zmc2V0SW5wdXRzID0gUGljazxOYW1lZFRlbnNvckluZm9NYXAsICdpbWFnZSc+O1xuZXhwb3J0IGludGVyZmFjZSBSb3RhdGVXaXRoT2Zmc2V0QXR0cnMge1xuICByYWRpYW5zOiBudW1iZXI7XG4gIGZpbGxWYWx1ZTogbnVtYmVyfFtudW1iZXIsIG51bWJlciwgbnVtYmVyXTtcbiAgY2VudGVyOiBudW1iZXJ8W251bWJlciwgbnVtYmVyXTtcbn1cblxuZXhwb3J0IGNvbnN0IF9GdXNlZE1hdE11bCA9ICdfRnVzZWRNYXRNdWwnO1xuLy8gdHNsaW50OmRpc2FibGUtbmV4dC1saW5lOiBjbGFzcy1uYW1lXG5leHBvcnQgaW50ZXJmYWNlIF9GdXNlZE1hdE11bElucHV0cyBleHRlbmRzIE5hbWVkVGVuc29ySW5mb01hcCB7XG4gIGE6IFRlbnNvckluZm87XG4gIGI6IFRlbnNvckluZm87XG4gIGJpYXM/OiBUZW5zb3JJbmZvO1xuICBwcmVsdUFjdGl2YXRpb25XZWlnaHRzPzogVGVuc29ySW5mbztcbn1cbi8vIHRzbGludDpkaXNhYmxlLW5leHQtbGluZTogY2xhc3MtbmFtZVxuZXhwb3J0IGludGVyZmFjZSBfRnVzZWRNYXRNdWxBdHRycyB7XG4gIHRyYW5zcG9zZUE6IGJvb2xlYW47XG4gIHRyYW5zcG9zZUI6IGJvb2xlYW47XG4gIGFjdGl2YXRpb246IEFjdGl2YXRpb247XG4gIGxlYWt5cmVsdUFscGhhPzogbnVtYmVyO1xufVxuXG5leHBvcnQgY29uc3QgRnVzZWRDb252MkQgPSAnRnVzZWRDb252MkQnO1xuZXhwb3J0IGludGVyZmFjZSBGdXNlZENvbnYyRElucHV0cyBleHRlbmRzIE5hbWVkVGVuc29ySW5mb01hcCB7XG4gIHg6IFRlbnNvckluZm87XG4gIGZpbHRlcjogVGVuc29ySW5mbztcbiAgYmlhcz86IFRlbnNvckluZm87XG4gIHByZWx1QWN0aXZhdGlvbldlaWdodHM/OiBUZW5zb3JJbmZvO1xufVxuZXhwb3J0IGludGVyZmFjZSBGdXNlZENvbnYyREF0dHJzIHtcbiAgc3RyaWRlczogW251bWJlciwgbnVtYmVyXXxudW1iZXI7XG4gIHBhZDogJ3ZhbGlkJ3wnc2FtZSd8bnVtYmVyfEV4cGxpY2l0UGFkZGluZztcbiAgZGF0YUZvcm1hdDogJ05IV0MnfCdOQ0hXJztcbiAgZGlsYXRpb25zOiBbbnVtYmVyLCBudW1iZXJdfG51bWJlcjtcbiAgZGltUm91bmRpbmdNb2RlOiAnZmxvb3InfCdyb3VuZCd8J2NlaWwnO1xuICBhY3RpdmF0aW9uOiBBY3RpdmF0aW9uO1xuICBsZWFreXJlbHVBbHBoYT86IG51bWJlcjtcbn1cblxuZXhwb3J0IGNvbnN0IEZ1c2VkRGVwdGh3aXNlQ29udjJEID0gJ0Z1c2VkRGVwdGh3aXNlQ29udjJEJztcbmV4cG9ydCBpbnRlcmZhY2UgRnVzZWREZXB0aHdpc2VDb252MkRJbnB1dHMgZXh0ZW5kcyBOYW1lZFRlbnNvckluZm9NYXAge1xuICB4OiBUZW5zb3JJbmZvO1xuICBmaWx0ZXI6IFRlbnNvckluZm87XG4gIGJpYXM/OiBUZW5zb3JJbmZvO1xuICBwcmVsdUFjdGl2YXRpb25XZWlnaHRzPzogVGVuc29ySW5mbztcbn1cbmV4cG9ydCBpbnRlcmZhY2UgRnVzZWREZXB0aHdpc2VDb252MkRBdHRycyB7XG4gIHN0cmlkZXM6IFtudW1iZXIsIG51bWJlcl18bnVtYmVyO1xuICBwYWQ6ICd2YWxpZCd8J3NhbWUnfG51bWJlcnxFeHBsaWNpdFBhZGRpbmc7XG4gIGRhdGFGb3JtYXQ6ICdOSFdDJ3wnTkNIVyc7XG4gIGRpbGF0aW9uczogW251bWJlciwgbnVtYmVyXXxudW1iZXI7XG4gIGRpbVJvdW5kaW5nTW9kZTogJ2Zsb29yJ3wncm91bmQnfCdjZWlsJztcbiAgYWN0aXZhdGlvbjogQWN0aXZhdGlvbjtcbiAgbGVha3lyZWx1QWxwaGE/OiBudW1iZXI7XG59XG4iXX0=","/**\n * @license\n * Copyright 2019 Google LLC. All Rights Reserved.\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n * =============================================================================\n */\nimport { env } from './environment';\nimport { getGlobal } from './global_util';\nimport * as log from './log';\nconst kernelRegistry = getGlobal('kernelRegistry', () => new Map());\nconst gradRegistry = getGlobal('gradRegistry', () => new Map());\n/**\n * Returns the kernel function (code) associated with the provided names.\n *\n * @param kernelName The official name of the kernel.\n * @param backendName The official name of the backend.\n */\nexport function getKernel(kernelName, backendName) {\n const key = makeKey(kernelName, backendName);\n return kernelRegistry.get(key);\n}\n/**\n * Returns the registered gradient info associated with the provided kernel.\n * @param kernelName The official TF kernel name.\n */\nexport function getGradient(kernelName) {\n return gradRegistry.get(kernelName);\n}\nexport function getKernelsForBackend(backendName) {\n const it = kernelRegistry.entries();\n const result = [];\n while (true) {\n const { done, value } = it.next();\n if (done) {\n break;\n }\n const [key, config] = value;\n const [backend,] = key.split('_');\n if (backend === backendName) {\n result.push(config);\n }\n }\n return result;\n}\n/**\n * Registers the function (forward pass) for the kernel in a global registry.\n *\n * @param config A config object with the following properties:\n * - `kernelName` The official name of the kernel.\n * - `backendName` The official name of the backend.\n * - `kernelFunc` The function to run during the forward pass of the kernel.\n * - `setupFunc` Optional. Gets called once, after the backend initializes.\n * - `disposeFunc` Optional. Gets called once, right before the backend is\n * disposed.\n */\nexport function registerKernel(config) {\n const { kernelName, backendName } = config;\n const key = makeKey(kernelName, backendName);\n if (kernelRegistry.has(key)) {\n log.warn(`The kernel '${kernelName}' for backend ` +\n `'${backendName}' is already registered`);\n }\n kernelRegistry.set(key, config);\n}\n/**\n * Registers a gradient function for a given kernel in the global registry,\n * to be used during the back-propagation of that kernel.\n *\n * @param config An object with the following properties:\n * - `kernelName` The name of the kernel that the gradient function is for.\n * - `gradFunc` The function to run during back-propagation.\n */\nexport function registerGradient(config) {\n const { kernelName } = config;\n if (gradRegistry.has(kernelName)) {\n // TODO (yassogba) after 3.0 assess whether we need to keep this gated\n // to debug mode.\n if (env().getBool('DEBUG')) {\n log.warn(`Overriding the gradient for '${kernelName}'`);\n }\n }\n gradRegistry.set(kernelName, config);\n}\n/**\n * Removes the kernel function from the registry.\n *\n * @param kernelName The official name of the kernel.\n * @param backendName The official name of the backend.\n *\n */\nexport function unregisterKernel(kernelName, backendName) {\n const key = makeKey(kernelName, backendName);\n if (!kernelRegistry.has(key)) {\n throw new Error(`The kernel '${kernelName}' for backend ` +\n `'${backendName}' is not registered`);\n }\n kernelRegistry.delete(key);\n}\n/** Removes the registered gradient from the global registry. */\nexport function unregisterGradient(kernelName) {\n if (!gradRegistry.has(kernelName)) {\n throw new Error(`The gradient '${kernelName}' for backend is not registered`);\n }\n gradRegistry.delete(kernelName);\n}\n/**\n * Finds kernels that have already been registered to a backend and re-registers\n * them for a new backend. Useful for registering custom backends.\n * @param registeredBackendName Already registered backend.\n * @param newBackendName New backend.\n */\nexport function copyRegisteredKernels(registeredBackendName, newBackendName) {\n const kernels = getKernelsForBackend(registeredBackendName);\n kernels.forEach(kernelConfig => {\n const newKernelConfig = Object.assign({}, kernelConfig, { backendName: newBackendName });\n registerKernel(newKernelConfig);\n });\n}\nfunction makeKey(kernelName, backendName) {\n return `${backendName}_${kernelName}`;\n}\n//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoia2VybmVsX3JlZ2lzdHJ5LmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vdGZqcy1jb3JlL3NyYy9rZXJuZWxfcmVnaXN0cnkudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUE7Ozs7Ozs7Ozs7Ozs7OztHQWVHO0FBQ0gsT0FBTyxFQUFDLEdBQUcsRUFBQyxNQUFNLGVBQWUsQ0FBQztBQUNsQyxPQUFPLEVBQUMsU0FBUyxFQUFDLE1BQU0sZUFBZSxDQUFDO0FBQ3hDLE9BQU8sS0FBSyxHQUFHLE1BQU0sT0FBTyxDQUFDO0FBSzdCLE1BQU0sY0FBYyxHQUNoQixTQUFTLENBQUMsZ0JBQWdCLEVBQUUsR0FBRyxFQUFFLENBQUMsSUFBSSxHQUFHLEVBQXdCLENBQUMsQ0FBQztBQUN2RSxNQUFNLFlBQVksR0FDZCxTQUFTLENBQUMsY0FBYyxFQUFFLEdBQUcsRUFBRSxDQUFDLElBQUksR0FBRyxFQUFzQixDQUFDLENBQUM7QUE4RG5FOzs7OztHQUtHO0FBQ0gsTUFBTSxVQUFVLFNBQVMsQ0FDckIsVUFBa0IsRUFBRSxXQUFtQjtJQUN6QyxNQUFNLEdBQUcsR0FBRyxPQUFPLENBQUMsVUFBVSxFQUFFLFdBQVcsQ0FBQyxDQUFDO0lBQzdDLE9BQU8sY0FBYyxDQUFDLEdBQUcsQ0FBQyxHQUFHLENBQUMsQ0FBQztBQUNqQyxDQUFDO0FBRUQ7OztHQUdHO0FBQ0gsTUFBTSxVQUFVLFdBQVcsQ0FBQyxVQUFrQjtJQUM1QyxPQUFPLFlBQVksQ0FBQyxHQUFHLENBQUMsVUFBVSxDQUFDLENBQUM7QUFDdEMsQ0FBQztBQUVELE1BQU0sVUFBVSxvQkFBb0IsQ0FBQyxXQUFtQjtJQUN0RCxNQUFNLEVBQUUsR0FBRyxjQUFjLENBQUMsT0FBTyxFQUFFLENBQUM7SUFDcEMsTUFBTSxNQUFNLEdBQW1CLEVBQUUsQ0FBQztJQUVsQyxPQUFPLElBQUksRUFBRTtRQUNYLE1BQU0sRUFBQyxJQUFJLEVBQUUsS0FBSyxFQUFDLEdBQUcsRUFBRSxD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QU8sQ0FBQyxVQUFrQixFQUFFLFdBQW1CO0lBQ3RELE9BQU8sR0FBRyxXQUFXLElBQUksVUFBVSxFQUFFLENBQUM7QUFDeEMsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbIi8qKlxuICogQGxpY2Vuc2VcbiAqIENvcHlyaWdodCAyMDE5IEdvb2dsZSBMTEMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuXG4gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgXCJMaWNlbnNlXCIpO1xuICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLlxuICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0XG4gKlxuICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wXG4gKlxuICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZVxuICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gXCJBUyBJU1wiIEJBU0lTLFxuICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuXG4gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kXG4gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS5cbiAqID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4gKi9cbmltcG9ydCB7ZW52fSBmcm9tICcuL2Vudmlyb25tZW50JztcbmltcG9ydCB7Z2V0R2xvYmFsfSBmcm9tICcuL2dsb2JhbF91dGlsJztcbmltcG9ydCAqIGFzIGxvZyBmcm9tICcuL2xvZyc7XG5pbXBvcnQge05hbWVkR3JhZGllbnRNYXB9IGZyb20gJy4vdGFwZSc7XG5pbXBvcnQge1RlbnNvcn0gZnJvbSAnLi90ZW5zb3InO1xuaW1wb3J0IHtEYXRhVHlwZSwgUmVjdXJzaXZlQXJyYXl9IGZyb20gJy4vdHlwZXMnO1xuXG5jb25zdCBrZXJuZWxSZWdpc3RyeSA9XG4gICAgZ2V0R2xvYmFsKCdrZXJuZWxSZWdpc3RyeScsICgpID0+IG5ldyBNYXA8c3RyaW5nLCBLZXJuZWxDb25maWc+KCkpO1xuY29uc3QgZ3JhZFJlZ2lzdHJ5ID1cbiAgICBnZXRHbG9iYWwoJ2dyYWRSZWdpc3RyeScsICgpID0+IG5ldyBNYXA8c3RyaW5nLCBHcmFkQ29uZmlnPigpKTtcblxuZXhwb3J0IHR5cGUgRGF0YUlkID0gb2JqZWN0O1xuXG50eXBlIEF0dHJpYnV0ZVZhbHVlID1cbiAgICBudW1iZXJ8bnVtYmVyW118Ym9vbGVhbnxib29sZWFuW118c3RyaW5nfHN0cmluZ1tdfE5hbWVkQXR0ck1hcDtcblxuLyoqIFRoZXNlIGFyZSBleHRyYSBub24tdGVuc29yL3ByaW1pdGl2ZSBwYXJhbXMgcGFzc2VkIHRvIGtlcm5lbCBmdW5jdGlvbnMuICovXG5leHBvcnQgdHlwZSBBdHRyaWJ1dGUgPSBBdHRyaWJ1dGVWYWx1ZXxSZWN1cnNpdmVBcnJheTxBdHRyaWJ1dGVWYWx1ZT47XG5cbi8qKiBTcGVjaWZpZXMgdGhlIGNvZGUgdG8gcnVuIHdoZW4gZXhlY3V0aW5nIGEga2VybmVsLiAqL1xuZXhwb3J0IHR5cGUgS2VybmVsRnVuYyA9IChwYXJhbXM6IHtcbiAgaW5wdXRzOiBOYW1lZFRlbnNvckluZm9NYXAsXG4gIGJhY2tlbmQ6IHt9LFxuICBhdHRycz86IE5hbWVkQXR0ck1hcCxcbn0pID0+IFRlbnNvckluZm98VGVuc29ySW5mb1tdO1xuXG4vKiogVGhlIGZ1bmN0aW9uIHRvIHJ1biB3aGVuIGNvbXB1dGluZyBhIGdyYWRpZW50IGR1cmluZyBiYWNrcHJvcC4gKi9cbmV4cG9ydCB0eXBlIEdyYWRGdW5jID1cbiAgICAoZHk6IFRlbnNvcnxUZW5zb3JbXSwgc2F2ZWQ6IFRlbnNvcltdLCBhdHRyczogTmFtZWRBdHRyTWFwKSA9PlxuICAgICAgICBOYW1lZEdyYWRpZW50TWFwO1xuXG4vKiogRnVuY3Rpb24gdGhhdCBnZXRzIGNhbGxlZCBhZnRlciB0aGUgYmFja2VuZCBpbml0aWFsaXplcy4gKi9cbmV4cG9ydCB0eXBlIEtlcm5lbFNldHVwRnVuYyA9IChiYWNrZW5kOiB7fSkgPT4gdm9pZDtcbi8qKiBGdW5jdGlvbiB0aGF0IGdldHMgY2FsbGVkIHJpZ2h0IGJlZm9yZSB0aGUgYmFja2VuZCBpcyBkaXNwb3NlZC4gKi9cbmV4cG9ydCB0eXBlIEtlcm5lbERpc3Bvc2VGdW5jID0gS2VybmVsU2V0dXBGdW5jO1xuXG4vKiogQ29uZmlnIG9iamVjdCBmb3IgcmVnaXN0ZXJpbmcgYSBrZXJuZWwgaW4gdGhlIGdsb2JhbCByZWdpc3RyeS4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgS2VybmVsQ29uZmlnIHtcbiAga2VybmVsTmFtZTogc3RyaW5nO1xuICBiYWNrZW5kTmFtZTogc3RyaW5nO1xuICBrZXJuZWxGdW5jOiBLZXJuZWxGdW5jO1xuICBzZXR1cEZ1bmM/OiBLZXJuZWxTZXR1cEZ1bmM7XG4gIGRpc3Bvc2VGdW5jPzogS2VybmVsRGlzcG9zZUZ1bmM7XG59XG5cbi8qKiBDb25maWcgb2JqZWN0IGZvciByZWdpc3RlcmluZyBhIGdyYWRpZW50IGluIHRoZSBnbG9iYWwgcmVnaXN0cnkuICovXG5leHBvcnQgaW50ZXJmYWNlIEdyYWRDb25maWcge1xuICBrZXJuZWxOYW1lOiBzdHJpbmc7XG4gIGlucHV0c1RvU2F2ZT86IHN0cmluZ1tdO1xuICAvLyBXaGVuIHNhdmVBbGxJbnB1dHMgaXMgdHJ1ZSwgYWxsIGlucHV0cyB3aWxsIGJlIHNhdmVkLiBPbmx5IHVzZSB0aGlzIGZsYWdcbiAgLy8gaWYgaW5wdXRzIGlzIGFuIGFycmF5IG9mIFRlbnNvcnMuXG4gIHNhdmVBbGxJbnB1dHM/OiBib29sZWFuO1xuICBvdXRwdXRzVG9TYXZlPzogYm9vbGVhbltdO1xuICBncmFkRnVuYzogR3JhZEZ1bmM7XG59XG5cbi8qKiBIb2xkcyBtZXRhZGF0YSBmb3IgYSBnaXZlbiB0ZW5zb3IuICovXG5leHBvcnQgaW50ZXJmYWNlIFRlbnNvckluZm8ge1xuICBkYXRhSWQ6IERhdGFJZDtcbiAgc2hhcGU6IG51bWJlcltdO1xuICBkdHlwZTogRGF0YVR5cGU7XG59XG5cbmV4cG9ydCBpbnRlcmZhY2UgTmFtZWRUZW5zb3JJbmZvTWFwIHtcbiAgW25hbWU6IHN0cmluZ106IFRlbnNvckluZm98dW5kZWZpbmVkO1xufVxuXG5leHBvcnQgaW50ZXJmYWNlIE5hbWVkQXR0ck1hcCB7XG4gIFtuYW1lOiBzdHJpbmddOiBBdHRyaWJ1dGU7XG59XG5cbi8qKlxuICogUmV0dXJucyB0aGUga2VybmVsIGZ1bmN0aW9uIChjb2RlKSBhc3NvY2lhdGVkIHdpdGggdGhlIHByb3ZpZGVkIG5hbWVzLlxuICpcbiAqIEBwYXJhbSBrZXJuZWxOYW1lIFRoZSBvZmZpY2lhbCBuYW1lIG9mIHRoZSBrZXJuZWwuXG4gKiBAcGFyYW0gYmFja2VuZE5hbWUgVGhlIG9mZmljaWFsIG5hbWUgb2YgdGhlIGJhY2tlbmQuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBnZXRLZXJuZWwoXG4gICAga2VybmVsTmFtZTogc3RyaW5nLCBiYWNrZW5kTmFtZTogc3RyaW5nKTogS2VybmVsQ29uZmlnIHtcbiAgY29uc3Qga2V5ID0gbWFrZUtleShrZXJuZWxOYW1lLCBiYWNrZW5kTmFtZSk7XG4gIHJldHVybiBrZXJuZWxSZWdpc3RyeS5nZXQoa2V5KTtcbn1cblxuLyoqXG4gKiBSZXR1cm5zIHRoZSByZWdpc3RlcmVkIGdyYWRpZW50IGluZm8gYXNzb2NpYXRlZCB3aXRoIHRoZSBwcm92aWRlZCBrZXJuZWwuXG4gKiBAcGFyYW0ga2VybmVsTmFtZSBUaGUgb2ZmaWNpYWwgVEYga2VybmVsIG5hbWUuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBnZXRHcmFkaWVudChrZXJuZWxOYW1lOiBzdHJpbmcpOiBHcmFkQ29uZmlnIHtcbiAgcmV0dXJuIGdyYWRSZWdpc3RyeS5nZXQoa2VybmVsTmFtZSk7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBnZXRLZXJuZWxzRm9yQmFja2VuZChiYWNrZW5kTmFtZTogc3RyaW5nKTogS2VybmVsQ29uZmlnW10ge1xuICBjb25zdCBpdCA9IGtlcm5lbFJlZ2lzdHJ5LmVudHJpZXMoKTtcbiAgY29uc3QgcmVzdWx0OiBLZXJuZWxDb25maWdbXSA9IFtdO1xuXG4gIHdoaWxlICh0cnVlKSB7XG4gICAgY29uc3Qge2RvbmUsIHZhbHVlfSA9IGl0Lm5leHQoKTtcbiAgICBpZiAoZG9uZSkge1xuICAgICAgYnJlYWs7XG4gICAgfVxuICAgIGNvbnN0IFtrZXksIGNvbmZpZ10gPSB2YWx1ZTtcbiAgICBjb25zdCBbYmFja2VuZCwgXSA9IGtleS5zcGxpdCgnXycpO1xuICAgIGlmIChiYWNrZW5kID09PSBiYWNrZW5kTmFtZSkge1xuICAgICAgcmVzdWx0LnB1c2goY29uZmlnKTtcbiAgICB9XG4gIH1cbiAgcmV0dXJuIHJlc3VsdDtcbn1cblxuLyoqXG4gKiBSZWdpc3RlcnMgdGhlIGZ1bmN0aW9uIChmb3J3YXJkIHBhc3MpIGZvciB0aGUga2VybmVsIGluIGEgZ2xvYmFsIHJlZ2lzdHJ5LlxuICpcbiAqIEBwYXJhbSBjb25maWcgQSBjb25maWcgb2JqZWN0IHdpdGggdGhlIGZvbGxvd2luZyBwcm9wZXJ0aWVzOlxuICogLSBga2VybmVsTmFtZWAgVGhlIG9mZmljaWFsIG5hbWUgb2YgdGhlIGtlcm5lbC5cbiAqIC0gYGJhY2tlbmROYW1lYCBUaGUgb2ZmaWNpYWwgbmFtZSBvZiB0aGUgYmFja2VuZC5cbiAqIC0gYGtlcm5lbEZ1bmNgIFRoZSBmdW5jdGlvbiB0byBydW4gZHVyaW5nIHRoZSBmb3J3YXJkIHBhc3Mgb2YgdGhlIGtlcm5lbC5cbiAqIC0gYHNldHVwRnVuY2AgT3B0aW9uYWwuIEdldHMgY2FsbGVkIG9uY2UsIGFmdGVyIHRoZSBiYWNrZW5kIGluaXRpYWxpemVzLlxuICogLSBgZGlzcG9zZUZ1bmNgIE9wdGlvbmFsLiBHZXRzIGNhbGxlZCBvbmNlLCByaWdodCBiZWZvcmUgdGhlIGJhY2tlbmQgaXNcbiAqIGRpc3Bvc2VkLlxuICovXG5leHBvcnQgZnVuY3Rpb24gcmVnaXN0ZXJLZXJuZWwoY29uZmlnOiBLZXJuZWxDb25maWcpIHtcbiAgY29uc3Qge2tlcm5lbE5hbWUsIGJhY2tlbmROYW1lfSA9IGNvbmZpZztcbiAgY29uc3Qga2V5ID0gbWFrZUtleShrZXJuZWxOYW1lLCBiYWNrZW5kTmFtZSk7XG4gIGlmIChrZXJuZWxSZWdpc3RyeS5oYXMoa2V5KSkge1xuICAgIGxvZy53YXJuKFxuICAgICAgICBgVGhlIGtlcm5lbCAnJHtrZXJuZWxOYW1lfScgZm9yIGJhY2tlbmQgYCArXG4gICAgICAgIGAnJHtiYWNrZW5kTmFtZX0nIGlzIGFscmVhZHkgcmVnaXN0ZXJlZGApO1xuICB9XG4gIGtlcm5lbFJlZ2lzdHJ5LnNldChrZXksIGNvbmZpZyk7XG59XG5cbi8qKlxuICogUmVnaXN0ZXJzIGEgZ3JhZGllbnQgZnVuY3Rpb24gZm9yIGEgZ2l2ZW4ga2VybmVsIGluIHRoZSBnbG9iYWwgcmVnaXN0cnksXG4gKiB0byBiZSB1c2VkIGR1cmluZyB0aGUgYmFjay1wcm9wYWdhdGlvbiBvZiB0aGF0IGtlcm5lbC5cbiAqXG4gKiBAcGFyYW0gY29uZmlnIEFuIG9iamVjdCB3aXRoIHRoZSBmb2xsb3dpbmcgcHJvcGVydGllczpcbiAqIC0gYGtlcm5lbE5hbWVgIFRoZSBuYW1lIG9mIHRoZSBrZXJuZWwgdGhhdCB0aGUgZ3JhZGllbnQgZnVuY3Rpb24gaXMgZm9yLlxuICogLSBgZ3JhZEZ1bmNgIFRoZSBmdW5jdGlvbiB0byBydW4gZHVyaW5nIGJhY2stcHJvcGFnYXRpb24uXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiByZWdpc3RlckdyYWRpZW50KGNvbmZpZzogR3JhZENvbmZpZykge1xuICBjb25zdCB7a2VybmVsTmFtZX0gPSBjb25maWc7XG5cbiAgaWYgKGdyYWRSZWdpc3RyeS5oYXMoa2VybmVsTmFtZSkpIHtcbiAgICAvLyBUT0RPICh5YXNzb2diYSkgYWZ0ZXIgMy4wIGFzc2VzcyB3aGV0aGVyIHdlIG5lZWQgdG8ga2VlcCB0aGlzIGdhdGVkXG4gICAgLy8gdG8gZGVidWcgbW9kZS5cbiAgICBpZiAoZW52KCkuZ2V0Qm9vbCgnREVCVUcnKSkge1xuICAgICAgbG9nLndhcm4oYE92ZXJyaWRpbmcgdGhlIGdyYWRpZW50IGZvciAnJHtrZXJuZWxOYW1lfSdgKTtcbiAgICB9XG4gIH1cbiAgZ3JhZFJlZ2lzdHJ5LnNldChrZXJuZWxOYW1lLCBjb25maWcpO1xufVxuXG4vKipcbiAqIFJlbW92ZXMgdGhlIGtlcm5lbCBmdW5jdGlvbiBmcm9tIHRoZSByZWdpc3RyeS5cbiAqXG4gKiBAcGFyYW0ga2VybmVsTmFtZSBUaGUgb2ZmaWNpYWwgbmFtZSBvZiB0aGUga2VybmVsLlxuICogQHBhcmFtIGJhY2tlbmROYW1lIFRoZSBvZmZpY2lhbCBuYW1lIG9mIHRoZSBiYWNrZW5kLlxuICpcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHVucmVnaXN0ZXJLZXJuZWwoXG4gICAga2VybmVsTmFtZTogc3RyaW5nLCBiYWNrZW5kTmFtZTogc3RyaW5nKTogdm9pZCB7XG4gIGNvbnN0IGtleSA9IG1ha2VLZXkoa2VybmVsTmFtZSwgYmFja2VuZE5hbWUpO1xuICBpZiAoIWtlcm5lbFJlZ2lzdHJ5LmhhcyhrZXkpKSB7XG4gICAgdGhyb3cgbmV3IEVycm9yKFxuICAgICAgICBgVGhlIGtlcm5lbCAnJHtrZXJuZWxOYW1lfScgZm9yIGJhY2tlbmQgYCArXG4gICAgICAgIGAnJHtiYWNrZW5kTmFtZX0nIGlzIG5vdCByZWdpc3RlcmVkYCk7XG4gIH1cbiAga2VybmVsUmVnaXN0cnkuZGVsZXRlKGtleSk7XG59XG5cbi8qKiBSZW1vdmVzIHRoZSByZWdpc3RlcmVkIGdyYWRpZW50IGZyb20gdGhlIGdsb2JhbCByZWdpc3RyeS4gKi9cbmV4cG9ydCBmdW5jdGlvbiB1bnJlZ2lzdGVyR3JhZGllbnQoa2VybmVsTmFtZTogc3RyaW5nKTogdm9pZCB7XG4gIGlmICghZ3JhZFJlZ2lzdHJ5LmhhcyhrZXJuZWxOYW1lKSkge1xuICAgIHRocm93IG5ldyBFcnJvcihcbiAgICAgICAgYFRoZSBncmFkaWVudCAnJHtrZXJuZWxOYW1lfScgZm9yIGJhY2tlbmQgaXMgbm90IHJlZ2lzdGVyZWRgKTtcbiAgfVxuICBncmFkUmVnaXN0cnkuZGVsZXRlKGtlcm5lbE5hbWUpO1xufVxuXG4vKipcbiAqIEZpbmRzIGtlcm5lbHMgdGhhdCBoYXZlIGFscmVhZHkgYmVlbiByZWdpc3RlcmVkIHRvIGEgYmFja2VuZCBhbmQgcmUtcmVnaXN0ZXJzXG4gKiB0aGVtIGZvciBhIG5ldyBiYWNrZW5kLiBVc2VmdWwgZm9yIHJlZ2lzdGVyaW5nIGN1c3RvbSBiYWNrZW5kcy5cbiAqIEBwYXJhbSByZWdpc3RlcmVkQmFja2VuZE5hbWUgQWxyZWFkeSByZWdpc3RlcmVkIGJhY2tlbmQuXG4gKiBAcGFyYW0gbmV3QmFja2VuZE5hbWUgTmV3IGJhY2tlbmQuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBjb3B5UmVnaXN0ZXJlZEtlcm5lbHMoXG4gICAgcmVnaXN0ZXJlZEJhY2tlbmROYW1lOiBzdHJpbmcsIG5ld0JhY2tlbmROYW1lOiBzdHJpbmcpOiB2b2lkIHtcbiAgY29uc3Qga2VybmVscyA9IGdldEtlcm5lbHNGb3JCYWNrZW5kKHJlZ2lzdGVyZWRCYWNrZW5kTmFtZSk7XG4gIGtlcm5lbHMuZm9yRWFjaChrZXJuZWxDb25maWcgPT4ge1xuICAgIGNvbnN0IG5ld0tlcm5lbENvbmZpZyA9XG4gICAgICAgIE9iamVjdC5hc3NpZ24oe30sIGtlcm5lbENvbmZpZywge2JhY2tlbmROYW1lOiBuZXdCYWNrZW5kTmFtZX0pO1xuICAgIHJlZ2lzdGVyS2VybmVsKG5ld0tlcm5lbENvbmZpZyk7XG4gIH0pO1xufVxuXG5mdW5jdGlvbiBtYWtlS2V5KGtlcm5lbE5hbWU6IHN0cmluZywgYmFja2VuZE5hbWU6IHN0cmluZykge1xuICByZXR1cm4gYCR7YmFja2VuZE5hbWV9XyR7a2VybmVsTmFtZX1gO1xufVxuIl19","/**\n * @license\n * Copyright 2018 Google LLC. All Rights Reserved.\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n * =============================================================================\n */\nimport { env } from './environment';\nexport function warn(...msg) {\n if (!(env().getBool('IS_TEST') || env().getBool('PROD'))) {\n console.warn(...msg);\n }\n}\nexport function log(...msg) {\n if (!(env().getBool('IS_TEST') || env().getBool('PROD'))) {\n console.log(...msg);\n }\n}\n//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibG9nLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vdGZqcy1jb3JlL3NyYy9sb2cudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUE7Ozs7Ozs7Ozs7Ozs7OztHQWVHO0FBRUgsT0FBTyxFQUFDLEdBQUcsRUFBQyxNQUFNLGVBQWUsQ0FBQztBQUVsQyxNQUFNLFVBQVUsSUFBSSxDQUFDLEdBQUcsR0FBYztJQUNwQyxJQUFJLENBQUMsQ0FBQyxHQUFHLEVBQUUsQ0FBQyxPQUFPLENBQUMsU0FBUyxDQUFDLElBQUksR0FBRyxFQUFFLENBQUMsT0FBTyxDQUFDLE1BQU0sQ0FBQyxDQUFDLEVBQUU7UUFDeEQsT0FBTyxDQUFDLElBQUksQ0FBQyxHQUFHLEdBQUcsQ0FBQyxDQUFDO0tBQ3RCO0FBQ0gsQ0FBQztBQUVELE1BQU0sVUFBVSxHQUFHLENBQUMsR0FBRyxHQUFjO0lBQ25DLElBQUksQ0FBQyxDQUFDLEdBQUcsRUFBRSxDQUFDLE9BQU8sQ0FBQyxTQUFTLENBQUMsSUFBSSxHQUFHLEVBQUUsQ0FBQyxPQUFPLENBQUMsTUFBTSxDQUFDLENBQUMsRUFBRTtRQUN4RCxPQUFPLENBQUMsR0FBRyxDQUFDLEdBQUcsR0FBRyxDQUFDLENBQUM7S0FDckI7QUFDSCxDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiLyoqXG4gKiBAbGljZW5zZVxuICogQ29weXJpZ2h0IDIwMTggR29vZ2xlIExMQy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC5cbiAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSBcIkxpY2Vuc2VcIik7XG4gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuXG4gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXRcbiAqXG4gKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjBcbiAqXG4gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlXG4gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiBcIkFTIElTXCIgQkFTSVMsXG4gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC5cbiAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmRcbiAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLlxuICogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbiAqL1xuXG5pbXBvcnQge2Vudn0gZnJvbSAnLi9lbnZpcm9ubWVudCc7XG5cbmV4cG9ydCBmdW5jdGlvbiB3YXJuKC4uLm1zZzogQXJyYXk8e30+KTogdm9pZCB7XG4gIGlmICghKGVudigpLmdldEJvb2woJ0lTX1RFU1QnKSB8fCBlbnYoKS5nZXRCb29sKCdQUk9EJykpKSB7XG4gICAgY29uc29sZS53YXJuKC4uLm1zZyk7XG4gIH1cbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGxvZyguLi5tc2c6IEFycmF5PHt9Pik6IHZvaWQge1xuICBpZiAoIShlbnYoKS5nZXRCb29sKCdJU19URVNUJykgfHwgZW52KCkuZ2V0Qm9vbCgnUFJPRCcpKSkge1xuICAgIGNvbnNvbGUubG9nKC4uLm1zZyk7XG4gIH1cbn1cbiJdfQ==","/**\n * @license\n * Copyright 2018 Google LLC. All Rights Reserved.\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n * =============================================================================\n */\nimport { ENGINE } from '../engine';\nimport { Abs, ComplexAbs } from '../kernel_names';\nimport { convertToTensor } from '../tensor_util_env';\nimport { op } from './operation';\n/**\n * Computes absolute value element-wise: `abs(x)`\n *\n * ```js\n * const x = tf.tensor1d([-1, 2, -3, 4]);\n *\n * x.abs().print(); // or tf.abs(x)\n * ```\n * @param x The input `tf.Tensor`.\n *\n * @doc {heading: 'Operations', subheading: 'Basic math'}\n */\nfunction abs_(x) {\n const $x = convertToTensor(x, 'x', 'abs');\n if ($x.dtype === 'complex64') {\n const inputs = { x: $x };\n return ENGINE.runKernel(ComplexAbs, inputs);\n }\n else {\n const inputs = { x: $x };\n return ENGINE.runKernel(Abs, inputs);\n }\n}\nexport const abs = op({ abs_ });\n//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYWJzLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vLi4vdGZqcy1jb3JlL3NyYy9vcHMvYWJzLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBOzs7Ozs7Ozs7Ozs7Ozs7R0FlRztBQUVILE9BQU8sRUFBQyxNQUFNLEVBQUMsTUFBTSxXQUFXLENBQUM7QUFDakMsT0FBTyxFQUFDLEdBQUcsRUFBYSxVQUFVLEVBQW1CLE1BQU0saUJBQWlCLENBQUM7QUFHN0UsT0FBTyxFQUFDLGVBQWUsRUFBQyxNQUFNLG9CQUFvQixDQUFDO0FBR25ELE9BQU8sRUFBQyxFQUFFLEVBQUMsTUFBTSxhQUFhLENBQUM7QUFFL0I7Ozs7Ozs7Ozs7O0dBV0c7QUFDSCxTQUFTLElBQUksQ0FBbUIsQ0FBZTtJQUM3QyxNQUFNLEVBQUUsR0FBRyxlQUFlLENBQUMsQ0FBQyxFQUFFLEdBQUcsRUFBRSxLQUFLLENBQUMsQ0FBQztJQUUxQyxJQUFJLEVBQUUsQ0FBQyxLQUFLLEtBQUssV0FBVyxFQUFFO1FBQzVCLE1BQU0sTUFBTSxHQUFxQixFQUFDLENBQUMsRUFBRSxFQUFFLEVBQUMsQ0FBQztRQUN6QyxPQUFPLE1BQU0sQ0FBQyxTQUFTLENBQUMsVUFBVSxFQUFFLE1BQThCLENBQUMsQ0FBQztLQUNyRTtTQUFNO1FBQ0wsTUFBTSxNQUFNLEdBQWMsRUFBQyxDQUFDLEVBQUUsRUFBRSxFQUFDLENBQUM7UUFDbEMsT0FBTyxNQUFNLENBQUMsU0FBUyxDQUFDLEdBQUcsRUFBRSxNQUE4QixDQUFDLENBQUM7S0FDOUQ7QUFDSCxDQUFDO0FBRUQsTUFBTSxDQUFDLE1BQU0sR0FBRyxHQUFHLEVBQUUsQ0FBQyxFQUFDLElBQUksRUFBQyxDQUFDLENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyIvKipcbiAqIEBsaWNlbnNlXG4gKiBDb3B5cmlnaHQgMjAxOCBHb29nbGUgTExDLiBBbGwgUmlnaHRzIFJlc2VydmVkLlxuICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlIFwiTGljZW5zZVwiKTtcbiAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS5cbiAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdFxuICpcbiAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMFxuICpcbiAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmVcbiAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuIFwiQVMgSVNcIiBCQVNJUyxcbiAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLlxuICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZFxuICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuXG4gKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuICovXG5cbmltcG9ydCB7RU5HSU5FfSBmcm9tICcuLi9lbmdpbmUnO1xuaW1wb3J0IHtBYnMsIEFic0lucHV0cywgQ29tcGxleEFicywgQ29tcGxleEFic0lucHV0c30gZnJvbSAnLi4va2VybmVsX25hbWVzJztcbmltcG9ydCB7VGVuc29yfSBmcm9tICcuLi90ZW5zb3InO1xuaW1wb3J0IHtOYW1lZFRlbnNvck1hcH0gZnJvbSAnLi4vdGVuc29yX3R5cGVzJztcbmltcG9ydCB7Y29udmVydFRvVGVuc29yfSBmcm9tICcuLi90ZW5zb3JfdXRpbF9lbnYnO1xuaW1wb3J0IHtUZW5zb3JMaWtlfSBmcm9tICcuLi90eXBlcyc7XG5cbmltcG9ydCB7b3B9IGZyb20gJy4vb3BlcmF0aW9uJztcblxuLyoqXG4gKiBDb21wdXRlcyBhYnNvbHV0ZSB2YWx1ZSBlbGVtZW50LXdpc2U6IGBhYnMoeClgXG4gKlxuICogYGBganNcbiAqIGNvbnN0IHggPSB0Zi50ZW5zb3IxZChbLTEsIDIsIC0zLCA0XSk7XG4gKlxuICogeC5hYnMoKS5wcmludCgpOyAgLy8gb3IgdGYuYWJzKHgpXG4gKiBgYGBcbiAqIEBwYXJhbSB4IFRoZSBpbnB1dCBgdGYuVGVuc29yYC5cbiAqXG4gKiBAZG9jIHtoZWFkaW5nOiAnT3BlcmF0aW9ucycsIHN1YmhlYWRpbmc6ICdCYXNpYyBtYXRoJ31cbiAqL1xuZnVuY3Rpb24gYWJzXzxUIGV4dGVuZHMgVGVuc29yPih4OiBUfFRlbnNvckxpa2UpOiBUIHtcbiAgY29uc3QgJHggPSBjb252ZXJ0VG9UZW5zb3IoeCwgJ3gnLCAnYWJzJyk7XG5cbiAgaWYgKCR4LmR0eXBlID09PSAnY29tcGxleDY0Jykge1xuICAgIGNvbnN0IGlucHV0czogQ29tcGxleEFic0lucHV0cyA9IHt4OiAkeH07XG4gICAgcmV0dXJuIEVOR0lORS5ydW5LZXJuZWwoQ29tcGxleEFicywgaW5wdXRzIGFzIHt9IGFzIE5hbWVkVGVuc29yTWFwKTtcbiAgfSBlbHNlIHtcbiAgICBjb25zdCBpbnB1dHM6IEFic0lucHV0cyA9IHt4OiAkeH07XG4gICAgcmV0dXJuIEVOR0lORS5ydW5LZXJuZWwoQWJzLCBpbnB1dHMgYXMge30gYXMgTmFtZWRUZW5zb3JNYXApO1xuICB9XG59XG5cbmV4cG9ydCBjb25zdCBhYnMgPSBvcCh7YWJzX30pO1xuIl19","/**\n * @license\n * Copyright 2018 Google LLC. All Rights Reserved.\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n * =============================================================================\n */\nimport { ENGINE } from '../engine';\nimport { Acos } from '../kernel_names';\nimport { convertToTensor } from '../tensor_util_env';\nimport { op } from './operation';\n/**\n * Computes acos of the input `tf.Tensor` element-wise: `acos(x)`\n *\n * ```js\n * const x = tf.tensor1d([0, 1, -1, .7]);\n *\n * x.acos().print(); // or tf.acos(x)\n * ```\n * @param x The input tensor.\n * @doc {heading: 'Operations', subheading: 'Basic math'}\n */\nfunction acos_(x) {\n const $x = convertToTensor(x, 'x', 'acos');\n const inputs = { x: $x };\n return ENGINE.runKernel(Acos, inputs);\n}\nexport const acos = op({ acos_ });\n//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYWNvcy5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uLy4uL3RmanMtY29yZS9zcmMvb3BzL2Fjb3MudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUE7Ozs7Ozs7Ozs7Ozs7OztHQWVHO0FBQ0gsT0FBTyxFQUFDLE1BQU0sRUFBQyxNQUFNLFdBQVcsQ0FBQztBQUNqQyxPQUFPLEVBQUMsSUFBSSxFQUFhLE1BQU0saUJBQWlCLENBQUM7QUFHakQsT0FBTyxFQUFDLGVBQWUsRUFBQyxNQUFNLG9CQUFvQixDQUFDO0FBR25ELE9BQU8sRUFBQyxFQUFFLEVBQUMsTUFBTSxhQUFhLENBQUM7QUFFL0I7Ozs7Ozs7Ozs7R0FVRztBQUNILFNBQVMsS0FBSyxDQUFtQixDQUFlO0lBQzlDLE1BQU0sRUFBRSxHQUFHLGVBQWUsQ0FBQyxDQUFDLEVBQUUsR0FBRyxFQUFFLE1BQU0sQ0FBQyxDQUFDO0lBQzNDLE1BQU0sTUFBTSxHQUFlLEVBQUMsQ0FBQyxFQUFFLEVBQUUsRUFBQyxDQUFDO0lBRW5DLE9BQU8sTUFBTSxDQUFDLFNBQVMsQ0FBQyxJQUFJLEVBQUUsTUFBOEIsQ0FBQyxDQUFDO0FBQ2hFLENBQUM7QUFDRCxNQUFNLENBQUMsTUFBTSxJQUFJLEdBQUcsRUFBRSxDQUFDLEVBQUMsS0FBSyxFQUFDLENBQUMsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbIi8qKlxuICogQGxpY2Vuc2VcbiAqIENvcHlyaWdodCAyMDE4IEdvb2dsZSBMTEMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuXG4gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgXCJMaWNlbnNlXCIpO1xuICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLlxuICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0XG4gKlxuICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wXG4gKlxuICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZVxuICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gXCJBUyBJU1wiIEJBU0lTLFxuICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuXG4gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kXG4gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS5cbiAqID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4gKi9cbmltcG9ydCB7RU5HSU5FfSBmcm9tICcuLi9lbmdpbmUnO1xuaW1wb3J0IHtBY29zLCBBY29zSW5wdXRzfSBmcm9tICcuLi9rZXJuZWxfbmFtZXMnO1xuaW1wb3J0IHtUZW5zb3J9IGZyb20gJy4uL3RlbnNvcic7XG5pbXBvcnQge05hbWVkVGVuc29yTWFwfSBmcm9tICcuLi90ZW5zb3JfdHlwZXMnO1xuaW1wb3J0IHtjb252ZXJ0VG9UZW5zb3J9IGZyb20gJy4uL3RlbnNvcl91dGlsX2Vudic7XG5pbXBvcnQge1RlbnNvckxpa2V9IGZyb20gJy4uL3R5cGVzJztcblxuaW1wb3J0IHtvcH0gZnJvbSAnLi9vcGVyYXRpb24nO1xuXG4vKipcbiAqIENvbXB1dGVzIGFjb3Mgb2YgdGhlIGlucHV0IGB0Zi5UZW5zb3JgIGVsZW1lbnQtd2lzZTogYGFjb3MoeClgXG4gKlxuICogYGBganNcbiAqIGNvbnN0IHggPSB0Zi50ZW5zb3IxZChbMCwgMSwgLTEsIC43XSk7XG4gKlxuICogeC5hY29zKCkucHJpbnQoKTsgIC8vIG9yIHRmLmFjb3MoeClcbiAqIGBgYFxuICogQHBhcmFtIHggVGhlIGlucHV0IHRlbnNvci5cbiAqIEBkb2Mge2hlYWRpbmc6ICdPcGVyYXRpb25zJywgc3ViaGVhZGluZzogJ0Jhc2ljIG1hdGgnfVxuICovXG5mdW5jdGlvbiBhY29zXzxUIGV4dGVuZHMgVGVuc29yPih4OiBUfFRlbnNvckxpa2UpOiBUIHtcbiAgY29uc3QgJHggPSBjb252ZXJ0VG9UZW5zb3IoeCwgJ3gnLCAnYWNvcycpO1xuICBjb25zdCBpbnB1dHM6IEFjb3NJbnB1dHMgPSB7eDogJHh9O1xuXG4gIHJldHVybiBFTkdJTkUucnVuS2VybmVsKEFjb3MsIGlucHV0cyBhcyB7fSBhcyBOYW1lZFRlbnNvck1hcCk7XG59XG5leHBvcnQgY29uc3QgYWNvcyA9IG9wKHthY29zX30pO1xuIl19","/**\n * @license\n * Copyright 2018 Google LLC. All Rights Reserved.\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n * =============================================================================\n */\nimport { ENGINE } from '../engine';\nimport { Acosh } from '../kernel_names';\nimport { convertToTensor } from '../tensor_util_env';\nimport { op } from './operation';\n/**\n * Computes the inverse hyperbolic cos of the input `tf.Tensor` element-wise:\n * `acosh(x)`\n *\n * ```js\n * const x = tf.tensor1d([10, 1, 3, 5.7]);\n *\n * x.acosh().print(); // or tf.acosh(x)\n * ```\n * @param x The input tensor.\n *\n * @doc {heading: 'Operations', subheading: 'Basic math'}\n */\nfunction acosh_(x) {\n const $x = convertToTensor(x, 'x', 'acosh');\n const inputs = { x: $x };\n return ENGINE.runKernel(Acosh, inputs);\n}\nexport const acosh = op({ acosh_ });\n//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYWNvc2guanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi8uLi90ZmpzLWNvcmUvc3JjL29wcy9hY29zaC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQTs7Ozs7Ozs7Ozs7Ozs7O0dBZUc7QUFFSCxPQUFPLEVBQUMsTUFBTSxFQUFDLE1BQU0sV0FBVyxDQUFDO0FBQ2pDLE9BQU8sRUFBQyxLQUFLLEVBQWMsTUFBTSxpQkFBaUIsQ0FBQztBQUduRCxPQUFPLEVBQUMsZUFBZSxFQUFDLE1BQU0sb0JBQW9CLENBQUM7QUFHbkQsT0FBTyxFQUFDLEVBQUUsRUFBQyxNQUFNLGFBQWEsQ0FBQztBQUUvQjs7Ozs7Ozs7Ozs7O0dBWUc7QUFDSCxTQUFTLE1BQU0sQ0FBbUIsQ0FBZTtJQUMvQyxNQUFNLEVBQUUsR0FBRyxlQUFlLENBQUMsQ0FBQyxFQUFFLEdBQUcsRUFBRSxPQUFPLENBQUMsQ0FBQztJQUM1QyxNQUFNLE1BQU0sR0FBZ0IsRUFBQyxDQUFDLEVBQUUsRUFBRSxFQUFDLENBQUM7SUFFcEMsT0FBTyxNQUFNLENBQUMsU0FBUyxDQUFDLEtBQUssRUFBRSxNQUE4QixDQUFDLENBQUM7QUFDakUsQ0FBQztBQUNELE1BQU0sQ0FBQyxNQUFNLEtBQUssR0FBRyxFQUFFLENBQUMsRUFBQyxNQUFNLEVBQUMsQ0FBQyxDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiLyoqXG4gKiBAbGljZW5zZVxuICogQ29weXJpZ2h0IDIwMTggR29vZ2xlIExMQy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC5cbiAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSBcIkxpY2Vuc2VcIik7XG4gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuXG4gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXRcbiAqXG4gKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjBcbiAqXG4gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlXG4gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiBcIkFTIElTXCIgQkFTSVMsXG4gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC5cbiAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmRcbiAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLlxuICogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbiAqL1xuXG5pbXBvcnQge0VOR0lORX0gZnJvbSAnLi4vZW5naW5lJztcbmltcG9ydCB7QWNvc2gsIEFjb3NoSW5wdXRzfSBmcm9tICcuLi9rZXJuZWxfbmFtZXMnO1xuaW1wb3J0IHtUZW5zb3J9IGZyb20gJy4uL3RlbnNvcic7XG5pbXBvcnQge05hbWVkVGVuc29yTWFwfSBmcm9tICcuLi90ZW5zb3JfdHlwZXMnO1xuaW1wb3J0IHtjb252ZXJ0VG9UZW5zb3J9IGZyb20gJy4uL3RlbnNvcl91dGlsX2Vudic7XG5pbXBvcnQge1RlbnNvckxpa2V9IGZyb20gJy4uL3R5cGVzJztcblxuaW1wb3J0IHtvcH0gZnJvbSAnLi9vcGVyYXRpb24nO1xuXG4vKipcbiAqIENvbXB1dGVzIHRoZSBpbnZlcnNlIGh5cGVyYm9saWMgY29zIG9mIHRoZSBpbnB1dCBgdGYuVGVuc29yYCBlbGVtZW50LXdpc2U6XG4gKiBgYWNvc2goeClgXG4gKlxuICogYGBganNcbiAqIGNvbnN0IHggPSB0Zi50ZW5zb3IxZChbMTAsIDEsIDMsIDUuN10pO1xuICpcbiAqIHguYWNvc2goKS5wcmludCgpOyAgLy8gb3IgdGYuYWNvc2goeClcbiAqIGBgYFxuICogQHBhcmFtIHggVGhlIGlucHV0IHRlbnNvci5cbiAqXG4gKiBAZG9jIHtoZWFkaW5nOiAnT3BlcmF0aW9ucycsIHN1YmhlYWRpbmc6ICdCYXNpYyBtYXRoJ31cbiAqL1xuZnVuY3Rpb24gYWNvc2hfPFQgZXh0ZW5kcyBUZW5zb3I+KHg6IFR8VGVuc29yTGlrZSk6IFQge1xuICBjb25zdCAkeCA9IGNvbnZlcnRUb1RlbnNvcih4LCAneCcsICdhY29zaCcpO1xuICBjb25zdCBpbnB1dHM6IEFjb3NoSW5wdXRzID0ge3g6ICR4fTtcblxuICByZXR1cm4gRU5HSU5FLnJ1bktlcm5lbChBY29zaCwgaW5wdXRzIGFzIHt9IGFzIE5hbWVkVGVuc29yTWFwKTtcbn1cbmV4cG9ydCBjb25zdCBhY29zaCA9IG9wKHthY29zaF99KTtcbiJdfQ==","/**\n * @license\n * Copyright 2020 Google LLC. All Rights Reserved.\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n * =============================================================================\n */\nimport { ENGINE } from '../engine';\nimport { Add } from '../kernel_names';\nimport { makeTypesMatch } from '../tensor_util';\nimport { convertToTensor } from '../tensor_util_env';\nimport { op } from './operation';\n/**\n * Adds two `tf.Tensor`s element-wise, A + B. Supports broadcasting.\n *\n *\n * ```js\n * const a = tf.tensor1d([1, 2, 3, 4]);\n * const b = tf.tensor1d([10, 20, 30, 40]);\n *\n * a.add(b).print(); // or tf.add(a, b)\n * ```\n *\n * ```js\n * // Broadcast add a with b.\n * const a = tf.scalar(5);\n * const b = tf.tensor1d([10, 20, 30, 40]);\n *\n * a.add(b).print(); // or tf.add(a, b)\n * ```\n * @param a The first `tf.Tensor` to add.\n * @param b The second `tf.Tensor` to add. Must have the same type as `a`.\n *\n * @doc {heading: 'Operations', subheading: 'Arithmetic'}\n */\nfunction add_(a, b) {\n let $a = convertToTensor(a, 'a', 'add');\n let $b = convertToTensor(b, 'b', 'add');\n [$a, $b] = makeTypesMatch($a, $b);\n const inputs = { a: $a, b: $b };\n return ENGINE.runKernel(Add, inputs);\n}\nexport const add = op({ add_ });\n//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYWRkLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vLi4vdGZqcy1jb3JlL3NyYy9vcHMvYWRkLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBOzs7Ozs7Ozs7Ozs7Ozs7R0FlRztBQUNILE9BQU8sRUFBQyxNQUFNLEVBQUMsTUFBTSxXQUFXLENBQUM7QUFDakMsT0FBTyxFQUFDLEdBQUcsRUFBWSxNQUFNLGlCQUFpQixDQUFDO0FBRy9DLE9BQU8sRUFBQyxjQUFjLEVBQUMsTUFBTSxnQkFBZ0IsQ0FBQztBQUM5QyxPQUFPLEVBQUMsZUFBZSxFQUFDLE1BQU0sb0JBQW9CLENBQUM7QUFHbkQsT0FBTyxFQUFDLEVBQUUsRUFBQyxNQUFNLGFBQWEsQ0FBQztBQUUvQjs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7OztHQXNCRztBQUNILFNBQVMsSUFBSSxDQUFtQixDQUFvQixFQUFFLENBQW9CO0lBQ3hFLElBQUksRUFBRSxHQUFHLGVBQWUsQ0FBQyxDQUFDLEVBQUUsR0FBRyxFQUFFLEtBQUssQ0FBQyxDQUFDO0lBQ3hDLElBQUksRUFBRSxHQUFHLGVBQWUsQ0FBQyxDQUFDLEVBQUUsR0FBRyxFQUFFLEtBQUssQ0FBQyxDQUFDO0lBQ3hDLENBQUMsRUFBRSxFQUFFLEVBQUUsQ0FBQyxHQUFHLGNBQWMsQ0FBQyxFQUFFLEVBQUUsRUFBRSxDQUFDLENBQUM7SUFFbEMsTUFBTSxNQUFNLEdBQWMsRUFBQyxDQUFDLEVBQUUsRUFBRSxFQUFFLENBQUMsRUFBRSxFQUFFLEVBQUMsQ0FBQztJQUV6QyxPQUFPLE1BQU0sQ0FBQyxTQUFTLENBQUMsR0FBRyxFQUFFLE1BQThCLENBQUMsQ0FBQztBQUMvRCxDQUFDO0FBRUQsTUFBTSxDQUFDLE1BQU0sR0FBRyxHQUFHLEVBQUUsQ0FBQyxFQUFDLElBQUksRUFBQyxDQUFDLENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyIvKipcbiAqIEBsaWNlbnNlXG4gKiBDb3B5cmlnaHQgMjAyMCBHb29nbGUgTExDLiBBbGwgUmlnaHRzIFJlc2VydmVkLlxuICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlIFwiTGljZW5zZVwiKTtcbiAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS5cbiAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdFxuICpcbiAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMFxuICpcbiAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmVcbiAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuIFwiQVMgSVNcIiBCQVNJUyxcbiAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLlxuICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZFxuICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuXG4gKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuICovXG5pbXBvcnQge0VOR0lORX0gZnJvbSAnLi4vZW5naW5lJztcbmltcG9ydCB7QWRkLCBBZGRJbnB1dHN9IGZyb20gJy4uL2tlcm5lbF9uYW1lcyc7XG5pbXBvcnQge1RlbnNvcn0gZnJvbSAnLi4vdGVuc29yJztcbmltcG9ydCB7TmFtZWRUZW5zb3JNYXB9IGZyb20gJy4uL3RlbnNvcl90eXBlcyc7XG5pbXBvcnQge21ha2VUeXBlc01hdGNofSBmcm9tICcuLi90ZW5zb3JfdXRpbCc7XG5pbXBvcnQge2NvbnZlcnRUb1RlbnNvcn0gZnJvbSAnLi4vdGVuc29yX3V0aWxfZW52JztcbmltcG9ydCB7VGVuc29yTGlrZX0gZnJvbSAnLi4vdHlwZXMnO1xuXG5pbXBvcnQge29wfSBmcm9tICcuL29wZXJhdGlvbic7XG5cbi8qKlxuICogQWRkcyB0d28gYHRmLlRlbnNvcmBzIGVsZW1lbnQtd2lzZSwgQSArIEIuIFN1cHBvcnRzIGJyb2FkY2FzdGluZy5cbiAqXG4gKlxuICogYGBganNcbiAqIGNvbnN0IGEgPSB0Zi50ZW5zb3IxZChbMSwgMiwgMywgNF0pO1xuICogY29uc3QgYiA9IHRmLnRlbnNvcjFkKFsxMCwgMjAsIDMwLCA0MF0pO1xuICpcbiAqIGEuYWRkKGIpLnByaW50KCk7ICAvLyBvciB0Zi5hZGQoYSwgYilcbiAqIGBgYFxuICpcbiAqIGBgYGpzXG4gKiAvLyBCcm9hZGNhc3QgYWRkIGEgd2l0aCBiLlxuICogY29uc3QgYSA9IHRmLnNjYWxhcig1KTtcbiAqIGNvbnN0IGIgPSB0Zi50ZW5zb3IxZChbMTAsIDIwLCAzMCwgNDBdKTtcbiAqXG4gKiBhLmFkZChiKS5wcmludCgpOyAgLy8gb3IgdGYuYWRkKGEsIGIpXG4gKiBgYGBcbiAqIEBwYXJhbSBhIFRoZSBmaXJzdCBgdGYuVGVuc29yYCB0byBhZGQuXG4gKiBAcGFyYW0gYiBUaGUgc2Vjb25kIGB0Zi5UZW5zb3JgIHRvIGFkZC4gTXVzdCBoYXZlIHRoZSBzYW1lIHR5cGUgYXMgYGFgLlxuICpcbiAqIEBkb2Mge2hlYWRpbmc6ICdPcGVyYXRpb25zJywgc3ViaGVhZGluZzogJ0FyaXRobWV0aWMnfVxuICovXG5mdW5jdGlvbiBhZGRfPFQgZXh0ZW5kcyBUZW5zb3I+KGE6IFRlbnNvcnxUZW5zb3JMaWtlLCBiOiBUZW5zb3J8VGVuc29yTGlrZSk6IFQge1xuICBsZXQgJGEgPSBjb252ZXJ0VG9UZW5zb3IoYSwgJ2EnLCAnYWRkJyk7XG4gIGxldCAkYiA9IGNvbnZlcnRUb1RlbnNvcihiLCAnYicsICdhZGQnKTtcbiAgWyRhLCAkYl0gPSBtYWtlVHlwZXNNYXRjaCgkYSwgJGIpO1xuXG4gIGNvbnN0IGlucHV0czogQWRkSW5wdXRzID0ge2E6ICRhLCBiOiAkYn07XG5cbiAgcmV0dXJuIEVOR0lORS5ydW5LZXJuZWwoQWRkLCBpbnB1dHMgYXMge30gYXMgTmFtZWRUZW5zb3JNYXApO1xufVxuXG5leHBvcnQgY29uc3QgYWRkID0gb3Aoe2FkZF99KTtcbiJdfQ==","/**\n * @license\n * Copyright 2020 Google LLC. All Rights Reserved.\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n * =============================================================================\n */\nimport { ENGINE } from '../engine';\nimport { All } from '../kernel_names';\nimport { convertToTensor } from '../tensor_util_env';\nimport { op } from './operation';\n/**\n * Computes the logical and of elements across dimensions of a `tf.Tensor`.\n *\n * Reduces the input along the dimensions given in `axes`. Unless `keepDims`\n * is true, the rank of the `tf.Tensor` is reduced by 1 for each entry in\n * `axes`. If `keepDims` is true, the reduced dimensions are retained with\n * length 1. If `axes` has no entries, all dimensions are reduced, and a\n * `tf.Tensor` with a single element is returned.\n *\n * ```js\n * const x = tf.tensor1d([1, 1, 1], 'bool');\n *\n * x.all().print(); // or tf.all(x)\n * ```\n *\n * ```js\n * const x = tf.tensor2d([1, 1, 0, 0], [2, 2], 'bool');\n *\n * const axis = 1;\n * x.all(axis).print(); // or tf.all(x, axis)\n * ```\n *\n * @param x The input tensor. Must be of dtype bool.\n * @param axis The dimension(s) to reduce. By default it reduces\n * all dimensions.\n * @param keepDims If true, retains reduced dimensions with size 1.\n *\n * @doc {heading: 'Operations', subheading: 'Reduction'}\n */\nfunction all_(x, axis = null, keepDims = false) {\n const $x = convertToTensor(x, 'x', 'all', 'bool');\n const inputs = { x: $x };\n const attrs = { axis, keepDims };\n return ENGINE.runKernel(All, inputs, attrs);\n}\nexport const all = op({ all_ });\n//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYWxsLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vLi4vdGZqcy1jb3JlL3NyYy9vcHMvYWxsLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBOzs7Ozs7Ozs7Ozs7Ozs7R0FlRztBQUVILE9BQU8sRUFBQyxNQUFNLEVBQUMsTUFBTSxXQUFXLENBQUM7QUFDakMsT0FBTyxFQUFDLEdBQUcsRUFBc0IsTUFBTSxpQkFBaUIsQ0FBQztBQUl6RCxPQUFPLEVBQUMsZUFBZSxFQUFDLE1BQU0sb0JBQW9CLENBQUM7QUFHbkQsT0FBTyxFQUFDLEVBQUUsRUFBQyxNQUFNLGFBQWEsQ0FBQztBQUUvQjs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7OztHQTRCRztBQUNILFNBQVMsSUFBSSxDQUNULENBQW9CLEVBQUUsT0FBd0IsSUFBSSxFQUFFLFFBQVEsR0FBRyxLQUFLO0lBQ3RFLE1BQU0sRUFBRSxHQUFHLGVBQWUsQ0FBQyxDQUFDLEVBQUUsR0FBRyxFQUFFLEtBQUssRUFBRSxNQUFNLENBQUMsQ0FBQztJQUVsRCxNQUFNLE1BQU0sR0FBYyxFQUFDLENBQUMsRUFBRSxFQUFFLEVBQUMsQ0FBQztJQUNsQyxNQUFNLEtBQUssR0FBYSxFQUFDLElBQUksRUFBRSxRQUFRLEVBQUMsQ0FBQztJQUV6QyxPQUFPLE1BQU0sQ0FBQyxTQUFTLENBQ25CLEdBQUcsRUFBRSxNQUE4QixFQUFFLEtBQTJCLENBQUMsQ0FBQztBQUN4RSxDQUFDO0FBRUQsTUFBTSxDQUFDLE1BQU0sR0FBRyxHQUFHLEVBQUUsQ0FBQyxFQUFDLElBQUksRUFBQyxDQUFDLENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyIvKipcbiAqIEBsaWNlbnNlXG4gKiBDb3B5cmlnaHQgMjAyMCBHb29nbGUgTExDLiBBbGwgUmlnaHRzIFJlc2VydmVkLlxuICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlIFwiTGljZW5zZVwiKTtcbiAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS5cbiAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdFxuICpcbiAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMFxuICpcbiAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmVcbiAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuIFwiQVMgSVNcIiBCQVNJUyxcbiAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLlxuICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZFxuICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuXG4gKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuICovXG5cbmltcG9ydCB7RU5HSU5FfSBmcm9tICcuLi9lbmdpbmUnO1xuaW1wb3J0IHtBbGwsIEFsbEF0dHJzLCBBbGxJbnB1dHN9IGZyb20gJy4uL2tlcm5lbF9uYW1lcyc7XG5pbXBvcnQge05hbWVkQXR0ck1hcH0gZnJvbSAnLi4va2VybmVsX3JlZ2lzdHJ5JztcbmltcG9ydCB7VGVuc29yfSBmcm9tICcuLi90ZW5zb3InO1xuaW1wb3J0IHtOYW1lZFRlbnNvck1hcH0gZnJvbSAnLi4vdGVuc29yX3R5cGVzJztcbmltcG9ydCB7Y29udmVydFRvVGVuc29yfSBmcm9tICcuLi90ZW5zb3JfdXRpbF9lbnYnO1xuaW1wb3J0IHtUZW5zb3JMaWtlfSBmcm9tICcuLi90eXBlcyc7XG5cbmltcG9ydCB7b3B9IGZyb20gJy4vb3BlcmF0aW9uJztcblxuLyoqXG4gKiBDb21wdXRlcyB0aGUgbG9naWNhbCBhbmQgb2YgZWxlbWVudHMgYWNyb3NzIGRpbWVuc2lvbnMgb2YgYSBgdGYuVGVuc29yYC5cbiAqXG4gKiBSZWR1Y2VzIHRoZSBpbnB1dCBhbG9uZyB0aGUgZGltZW5zaW9ucyBnaXZlbiBpbiBgYXhlc2AuIFVubGVzcyBga2VlcERpbXNgXG4gKiBpcyB0cnVlLCB0aGUgcmFuayBvZiB0aGUgYHRmLlRlbnNvcmAgaXMgcmVkdWNlZCBieSAxIGZvciBlYWNoIGVudHJ5IGluXG4gKiBgYXhlc2AuIElmIGBrZWVwRGltc2AgaXMgdHJ1ZSwgdGhlIHJlZHVjZWQgZGltZW5zaW9ucyBhcmUgcmV0YWluZWQgd2l0aFxuICogbGVuZ3RoIDEuIElmIGBheGVzYCBoYXMgbm8gZW50cmllcywgYWxsIGRpbWVuc2lvbnMgYXJlIHJlZHVjZWQsIGFuZCBhXG4gKiBgdGYuVGVuc29yYCB3aXRoIGEgc2luZ2xlIGVsZW1lbnQgaXMgcmV0dXJuZWQuXG4gKlxuICogYGBganNcbiAqIGNvbnN0IHggPSB0Zi50ZW5zb3IxZChbMSwgMSwgMV0sICdib29sJyk7XG4gKlxuICogeC5hbGwoKS5wcmludCgpOyAgLy8gb3IgdGYuYWxsKHgpXG4gKiBgYGBcbiAqXG4gKiBgYGBqc1xuICogY29uc3QgeCA9IHRmLnRlbnNvcjJkKFsxLCAxLCAwLCAwXSwgWzIsIDJdLCAnYm9vbCcpO1xuICpcbiAqIGNvbnN0IGF4aXMgPSAxO1xuICogeC5hbGwoYXhpcykucHJpbnQoKTsgIC8vIG9yIHRmLmFsbCh4LCBheGlzKVxuICogYGBgXG4gKlxuICogQHBhcmFtIHggVGhlIGlucHV0IHRlbnNvci4gTXVzdCBiZSBvZiBkdHlwZSBib29sLlxuICogQHBhcmFtIGF4aXMgVGhlIGRpbWVuc2lvbihzKSB0byByZWR1Y2UuIEJ5IGRlZmF1bHQgaXQgcmVkdWNlc1xuICogICAgIGFsbCBkaW1lbnNpb25zLlxuICogQHBhcmFtIGtlZXBEaW1zIElmIHRydWUsIHJldGFpbnMgcmVkdWNlZCBkaW1lbnNpb25zIHdpdGggc2l6ZSAxLlxuICpcbiAqIEBkb2Mge2hlYWRpbmc6ICdPcGVyYXRpb25zJywgc3ViaGVhZGluZzogJ1JlZHVjdGlvbid9XG4gKi9cbmZ1bmN0aW9uIGFsbF88VCBleHRlbmRzIFRlbnNvcj4oXG4gICAgeDogVGVuc29yfFRlbnNvckxpa2UsIGF4aXM6IG51bWJlcnxudW1iZXJbXSA9IG51bGwsIGtlZXBEaW1zID0gZmFsc2UpOiBUIHtcbiAgY29uc3QgJHggPSBjb252ZXJ0VG9UZW5zb3IoeCwgJ3gnLCAnYWxsJywgJ2Jvb2wnKTtcblxuICBjb25zdCBpbnB1dHM6IEFsbElucHV0cyA9IHt4OiAkeH07XG4gIGNvbnN0IGF0dHJzOiBBbGxBdHRycyA9IHtheGlzLCBrZWVwRGltc307XG5cbiAgcmV0dXJuIEVOR0lORS5ydW5LZXJuZWwoXG4gICAgICBBbGwsIGlucHV0cyBhcyB7fSBhcyBOYW1lZFRlbnNvck1hcCwgYXR0cnMgYXMge30gYXMgTmFtZWRBdHRyTWFwKTtcbn1cblxuZXhwb3J0IGNvbnN0IGFsbCA9IG9wKHthbGxffSk7XG4iXX0=","/**\n * @license\n * Copyright 2020 Google LLC. All Rights Reserved.\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n * =============================================================================\n */\nimport { ENGINE } from '../engine';\nimport { Any } from '../kernel_names';\nimport { convertToTensor } from '../tensor_util_env';\nimport { op } from './operation';\n/**\n * Computes the logical or of elements across dimensions of a `tf.Tensor`.\n *\n * Reduces the input along the dimensions given in `axes`. Unless `keepDims`\n * is true, the rank of the `tf.Tensor` is reduced by 1 for each entry in\n * `axes`. If `keepDims` is true, the reduced dimensions are retained with\n * length 1. If `axes` has no entries, all dimensions are reduced, and a\n * `tf.Tensor` with a single element is returned.\n *\n * ```js\n * const x = tf.tensor1d([1, 1, 1], 'bool');\n *\n * x.any().print(); // or tf.any(x)\n * ```\n *\n * ```js\n * const x = tf.tensor2d([1, 1, 0, 0], [2, 2], 'bool');\n *\n * const axis = 1;\n * x.any(axis).print(); // or tf.any(x, axis)\n * ```\n *\n * @param x The input tensor. Must be of dtype bool.\n * @param axis The dimension(s) to reduce. By default it reduces\n * all dimensions.\n * @param keepDims If true, retains reduced dimensions with size 1.\n *\n * @doc {heading: 'Operations', subheading: 'Reduction'}\n */\nfunction any_(x, axis = null, keepDims = false) {\n const $x = convertToTensor(x, 'x', 'any', 'bool');\n const inputs = { x: $x };\n const attrs = { axis, keepDims };\n return ENGINE.runKernel(Any, inputs, attrs);\n}\n// tslint:disable-next-line:variable-name\nexport const any = op({ any_ });\n//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYW55LmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vLi4vdGZqcy1jb3JlL3NyYy9vcHMvYW55LnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBOzs7Ozs7Ozs7Ozs7Ozs7R0FlRztBQUVILE9BQU8sRUFBQyxNQUFNLEVBQUMsTUFBTSxXQUFXLENBQUM7QUFDakMsT0FBTyxFQUFDLEdBQUcsRUFBc0IsTUFBTSxpQkFBaUIsQ0FBQztBQUl6RCxPQUFPLEVBQUMsZUFBZSxFQUFDLE1BQU0sb0JBQW9CLENBQUM7QUFHbkQsT0FBTyxFQUFDLEVBQUUsRUFBQyxNQUFNLGFBQWEsQ0FBQztBQUUvQjs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7OztHQTRCRztBQUNILFNBQVMsSUFBSSxDQUNULENBQW9CLEVBQUUsT0FBd0IsSUFBSSxFQUFFLFFBQVEsR0FBRyxLQUFLO0lBQ3RFLE1BQU0sRUFBRSxHQUFHLGVBQWUsQ0FBQyxDQUFDLEVBQUUsR0FBRyxFQUFFLEtBQUssRUFBRSxNQUFNLENBQUMsQ0FBQztJQUVsRCxNQUFNLE1BQU0sR0FBYyxFQUFDLENBQUMsRUFBRSxFQUFFLEVBQUMsQ0FBQztJQUNsQyxNQUFNLEtBQUssR0FBYSxFQUFDLElBQUksRUFBRSxRQUFRLEVBQUMsQ0FBQztJQUV6QyxPQUFPLE1BQU0sQ0FBQyxTQUFTLENBQ25CLEdBQUcsRUFBRSxNQUE4QixFQUFFLEtBQTJCLENBQUMsQ0FBQztBQUN4RSxDQUFDO0FBRUQseUNBQXlDO0FBQ3pDLE1BQU0sQ0FBQyxNQUFNLEdBQUcsR0FBRyxFQUFFLENBQUMsRUFBQyxJQUFJLEVBQUMsQ0FBQyxDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiLyoqXG4gKiBAbGljZW5zZVxuICogQ29weXJpZ2h0IDIwMjAgR29vZ2xlIExMQy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC5cbiAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSBcIkxpY2Vuc2VcIik7XG4gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuXG4gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXRcbiAqXG4gKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjBcbiAqXG4gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlXG4gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiBcIkFTIElTXCIgQkFTSVMsXG4gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC5cbiAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmRcbiAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLlxuICogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbiAqL1xuXG5pbXBvcnQge0VOR0lORX0gZnJvbSAnLi4vZW5naW5lJztcbmltcG9ydCB7QW55LCBBbnlBdHRycywgQW55SW5wdXRzfSBmcm9tICcuLi9rZXJuZWxfbmFtZXMnO1xuaW1wb3J0IHtOYW1lZEF0dHJNYXB9IGZyb20gJy4uL2tlcm5lbF9yZWdpc3RyeSc7XG5pbXBvcnQge1RlbnNvcn0gZnJvbSAnLi4vdGVuc29yJztcbmltcG9ydCB7TmFtZWRUZW5zb3JNYXB9IGZyb20gJy4uL3RlbnNvcl90eXBlcyc7XG5pbXBvcnQge2NvbnZlcnRUb1RlbnNvcn0gZnJvbSAnLi4vdGVuc29yX3V0aWxfZW52JztcbmltcG9ydCB7VGVuc29yTGlrZX0gZnJvbSAnLi4vdHlwZXMnO1xuXG5pbXBvcnQge29wfSBmcm9tICcuL29wZXJhdGlvbic7XG5cbi8qKlxuICogQ29tcHV0ZXMgdGhlIGxvZ2ljYWwgb3Igb2YgZWxlbWVudHMgYWNyb3NzIGRpbWVuc2lvbnMgb2YgYSBgdGYuVGVuc29yYC5cbiAqXG4gKiBSZWR1Y2VzIHRoZSBpbnB1dCBhbG9uZyB0aGUgZGltZW5zaW9ucyBnaXZlbiBpbiBgYXhlc2AuIFVubGVzcyBga2VlcERpbXNgXG4gKiBpcyB0cnVlLCB0aGUgcmFuayBvZiB0aGUgYHRmLlRlbnNvcmAgaXMgcmVkdWNlZCBieSAxIGZvciBlYWNoIGVudHJ5IGluXG4gKiBgYXhlc2AuIElmIGBrZWVwRGltc2AgaXMgdHJ1ZSwgdGhlIHJlZHVjZWQgZGltZW5zaW9ucyBhcmUgcmV0YWluZWQgd2l0aFxuICogbGVuZ3RoIDEuIElmIGBheGVzYCBoYXMgbm8gZW50cmllcywgYWxsIGRpbWVuc2lvbnMgYXJlIHJlZHVjZWQsIGFuZCBhXG4gKiBgdGYuVGVuc29yYCB3aXRoIGEgc2luZ2xlIGVsZW1lbnQgaXMgcmV0dXJuZWQuXG4gKlxuICogYGBganNcbiAqIGNvbnN0IHggPSB0Zi50ZW5zb3IxZChbMSwgMSwgMV0sICdib29sJyk7XG4gKlxuICogeC5hbnkoKS5wcmludCgpOyAgLy8gb3IgdGYuYW55KHgpXG4gKiBgYGBcbiAqXG4gKiBgYGBqc1xuICogY29uc3QgeCA9IHRmLnRlbnNvcjJkKFsxLCAxLCAwLCAwXSwgWzIsIDJdLCAnYm9vbCcpO1xuICpcbiAqIGNvbnN0IGF4aXMgPSAxO1xuICogeC5hbnkoYXhpcykucHJpbnQoKTsgIC8vIG9yIHRmLmFueSh4LCBheGlzKVxuICogYGBgXG4gKlxuICogQHBhcmFtIHggVGhlIGlucHV0IHRlbnNvci4gTXVzdCBiZSBvZiBkdHlwZSBib29sLlxuICogQHBhcmFtIGF4aXMgVGhlIGRpbWVuc2lvbihzKSB0byByZWR1Y2UuIEJ5IGRlZmF1bHQgaXQgcmVkdWNlc1xuICogICAgIGFsbCBkaW1lbnNpb25zLlxuICogQHBhcmFtIGtlZXBEaW1zIElmIHRydWUsIHJldGFpbnMgcmVkdWNlZCBkaW1lbnNpb25zIHdpdGggc2l6ZSAxLlxuICpcbiAqIEBkb2Mge2hlYWRpbmc6ICdPcGVyYXRpb25zJywgc3ViaGVhZGluZzogJ1JlZHVjdGlvbid9XG4gKi9cbmZ1bmN0aW9uIGFueV88VCBleHRlbmRzIFRlbnNvcj4oXG4gICAgeDogVGVuc29yfFRlbnNvckxpa2UsIGF4aXM6IG51bWJlcnxudW1iZXJbXSA9IG51bGwsIGtlZXBEaW1zID0gZmFsc2UpOiBUIHtcbiAgY29uc3QgJHggPSBjb252ZXJ0VG9UZW5zb3IoeCwgJ3gnLCAnYW55JywgJ2Jvb2wnKTtcblxuICBjb25zdCBpbnB1dHM6IEFueUlucHV0cyA9IHt4OiAkeH07XG4gIGNvbnN0IGF0dHJzOiBBbnlBdHRycyA9IHtheGlzLCBrZWVwRGltc307XG5cbiAgcmV0dXJuIEVOR0lORS5ydW5LZXJuZWwoXG4gICAgICBBbnksIGlucHV0cyBhcyB7fSBhcyBOYW1lZFRlbnNvck1hcCwgYXR0cnMgYXMge30gYXMgTmFtZWRBdHRyTWFwKTtcbn1cblxuLy8gdHNsaW50OmRpc2FibGUtbmV4dC1saW5lOnZhcmlhYmxlLW5hbWVcbmV4cG9ydCBjb25zdCBhbnkgPSBvcCh7YW55X30pO1xuIl19","/**\n * @license\n * Copyright 2020 Google Inc. All Rights Reserved.\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n * =============================================================================\n */\nimport { ENGINE } from '../engine';\nimport { ArgMax } from '../kernel_names';\nimport { convertToTensor } from '../tensor_util_env';\nimport { op } from './operation';\n/**\n * Returns the indices of the maximum values along an `axis`.\n *\n * The result has the same shape as `input` with the dimension along `axis`\n * removed.\n *\n * ```js\n * const x = tf.tensor1d([1, 2, 3]);\n *\n * x.argMax().print(); // or tf.argMax(x)\n * ```\n *\n * ```js\n * const x = tf.tensor2d([1, 2, 4, 3], [2, 2]);\n *\n * const axis = 1;\n * x.argMax(axis).print(); // or tf.argMax(x, axis)\n * ```\n *\n * @param x The input tensor.\n * @param axis The dimension to reduce. Defaults to 0 (outer-most dimension).\n *\n * @doc {heading: 'Operations', subheading: 'Reduction'}\n */\nfunction argMax_(x, axis = 0) {\n const $x = convertToTensor(x, 'x', 'argMax');\n const inputs = { x: $x };\n const attrs = { axis };\n return ENGINE.runKernel(ArgMax, inputs, attrs);\n}\nexport const argMax = op({ argMax_ });\n//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYXJnX21heC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uLy4uL3RmanMtY29yZS9zcmMvb3BzL2FyZ19tYXgudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUE7Ozs7Ozs7Ozs7Ozs7OztHQWVHO0FBRUgsT0FBTyxFQUFDLE1BQU0sRUFBQyxNQUFNLFdBQVcsQ0FBQztBQUNqQyxPQUFPLEVBQUMsTUFBTSxFQUE0QixNQUFNLGlCQUFpQixDQUFDO0FBSWxFLE9BQU8sRUFBQyxlQUFlLEVBQUMsTUFBTSxvQkFBb0IsQ0FBQztBQUduRCxPQUFPLEVBQUMsRUFBRSxFQUFDLE1BQU0sYUFBYSxDQUFDO0FBRS9COzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7OztHQXVCRztBQUNILFNBQVMsT0FBTyxDQUFtQixDQUFvQixFQUFFLElBQUksR0FBRyxDQUFDO0lBQy9ELE1BQU0sRUFBRSxHQUFHLGVBQWUsQ0FBQyxDQUFDLEVBQUUsR0FBRyxFQUFFLFFBQVEsQ0FBQyxDQUFDO0lBRTdDLE1BQU0sTUFBTSxHQUFpQixFQUFDLENBQUMsRUFBRSxFQUFFLEVBQUMsQ0FBQztJQUNyQyxNQUFNLEtBQUssR0FBZ0IsRUFBQyxJQUFJLEVBQUMsQ0FBQztJQUVsQyxPQUFPLE1BQU0sQ0FBQyxTQUFTLENBQ25CLE1BQU0sRUFBRSxNQUE4QixFQUFFLEtBQTJCLENBQUMsQ0FBQztBQUMzRSxDQUFDO0FBRUQsTUFBTSxDQUFDLE1BQU0sTUFBTSxHQUFHLEVBQUUsQ0FBQyxFQUFDLE9BQU8sRUFBQyxDQUFDLENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyIvKipcbiAqIEBsaWNlbnNlXG4gKiBDb3B5cmlnaHQgMjAyMCBHb29nbGUgSW5jLiBBbGwgUmlnaHRzIFJlc2VydmVkLlxuICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlIFwiTGljZW5zZVwiKTtcbiAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS5cbiAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdFxuICpcbiAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMFxuICpcbiAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmVcbiAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuIFwiQVMgSVNcIiBCQVNJUyxcbiAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLlxuICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZFxuICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuXG4gKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuICovXG5cbmltcG9ydCB7RU5HSU5FfSBmcm9tICcuLi9lbmdpbmUnO1xuaW1wb3J0IHtBcmdNYXgsIEFyZ01heEF0dHJzLCBBcmdNYXhJbnB1dHN9IGZyb20gJy4uL2tlcm5lbF9uYW1lcyc7XG5pbXBvcnQge05hbWVkQXR0ck1hcH0gZnJvbSAnLi4va2VybmVsX3JlZ2lzdHJ5JztcbmltcG9ydCB7VGVuc29yfSBmcm9tICcuLi90ZW5zb3InO1xuaW1wb3J0IHtOYW1lZFRlbnNvck1hcH0gZnJvbSAnLi4vdGVuc29yX3R5cGVzJztcbmltcG9ydCB7Y29udmVydFRvVGVuc29yfSBmcm9tICcuLi90ZW5zb3JfdXRpbF9lbnYnO1xuaW1wb3J0IHtUZW5zb3JMaWtlfSBmcm9tICcuLi90eXBlcyc7XG5cbmltcG9ydCB7b3B9IGZyb20gJy4vb3BlcmF0aW9uJztcblxuLyoqXG4gKiBSZXR1cm5zIHRoZSBpbmRpY2VzIG9mIHRoZSBtYXhpbXVtIHZhbHVlcyBhbG9uZyBhbiBgYXhpc2AuXG4gKlxuICogVGhlIHJlc3VsdCBoYXMgdGhlIHNhbWUgc2hhcGUgYXMgYGlucHV0YCB3aXRoIHRoZSBkaW1lbnNpb24gYWxvbmcgYGF4aXNgXG4gKiByZW1vdmVkLlxuICpcbiAqIGBgYGpzXG4gKiBjb25zdCB4ID0gdGYudGVuc29yMWQoWzEsIDIsIDNdKTtcbiAqXG4gKiB4LmFyZ01heCgpLnByaW50KCk7ICAvLyBvciB0Zi5hcmdNYXgoeClcbiAqIGBgYFxuICpcbiAqIGBgYGpzXG4gKiBjb25zdCB4ID0gdGYudGVuc29yMmQoWzEsIDIsIDQsIDNdLCBbMiwgMl0pO1xuICpcbiAqIGNvbnN0IGF4aXMgPSAxO1xuICogeC5hcmdNYXgoYXhpcykucHJpbnQoKTsgIC8vIG9yIHRmLmFyZ01heCh4LCBheGlzKVxuICogYGBgXG4gKlxuICogQHBhcmFtIHggVGhlIGlucHV0IHRlbnNvci5cbiAqIEBwYXJhbSBheGlzIFRoZSBkaW1lbnNpb24gdG8gcmVkdWNlLiBEZWZhdWx0cyB0byAwIChvdXRlci1tb3N0IGRpbWVuc2lvbikuXG4gKlxuICogQGRvYyB7aGVhZGluZzogJ09wZXJhdGlvbnMnLCBzdWJoZWFkaW5nOiAnUmVkdWN0aW9uJ31cbiAqL1xuZnVuY3Rpb24gYXJnTWF4XzxUIGV4dGVuZHMgVGVuc29yPih4OiBUZW5zb3J8VGVuc29yTGlrZSwgYXhpcyA9IDApOiBUIHtcbiAgY29uc3QgJHggPSBjb252ZXJ0VG9UZW5zb3IoeCwgJ3gnLCAnYXJnTWF4Jyk7XG5cbiAgY29uc3QgaW5wdXRzOiBBcmdNYXhJbnB1dHMgPSB7eDogJHh9O1xuICBjb25zdCBhdHRyczogQXJnTWF4QXR0cnMgPSB7YXhpc307XG5cbiAgcmV0dXJuIEVOR0lORS5ydW5LZXJuZWwoXG4gICAgICBBcmdNYXgsIGlucHV0cyBhcyB7fSBhcyBOYW1lZFRlbnNvck1hcCwgYXR0cnMgYXMge30gYXMgTmFtZWRBdHRyTWFwKTtcbn1cblxuZXhwb3J0IGNvbnN0IGFyZ01heCA9IG9wKHthcmdNYXhffSk7XG4iXX0=","/**\n * @license\n * Copyright 2020 Google Inc. All Rights Reserved.\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n * =============================================================================\n */\nimport { ENGINE } from '../engine';\nimport { ArgMin } from '../kernel_names';\nimport { convertToTensor } from '../tensor_util_env';\nimport { op } from './operation';\n/**\n * Returns the indices of the minimum values along an `axis`.\n *\n * The result has the same shape as `input` with the dimension along `axis`\n * removed.\n *\n * ```js\n * const x = tf.tensor1d([1, 2, 3]);\n *\n * x.argMin().print(); // or tf.argMin(x)\n * ```\n *\n * ```js\n * const x = tf.tensor2d([1, 2, 4, 3], [2, 2]);\n *\n * const axis = 1;\n * x.argMin(axis).print(); // or tf.argMin(x, axis)\n * ```\n *\n * @param x The input tensor.\n * @param axis The dimension to reduce. Defaults to 0 (outer-most dimension).\n *\n * @doc {heading: 'Operations', subheading: 'Reduction'}\n */\nfunction argMin_(x, axis = 0) {\n const $x = convertToTensor(x, 'x', 'argMin');\n const inputs = { x: $x };\n const attrs = { axis };\n return ENGINE.runKernel(ArgMin, inputs, attrs);\n}\nexport const argMin = op({ argMin_ });\n//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYXJnX21pbi5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uLy4uL3RmanMtY29yZS9zcmMvb3BzL2FyZ19taW4udHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUE7Ozs7Ozs7Ozs7Ozs7OztHQWVHO0FBRUgsT0FBTyxFQUFDLE1BQU0sRUFBQyxNQUFNLFdBQVcsQ0FBQztBQUNqQyxPQUFPLEVBQUMsTUFBTSxFQUE0QixNQUFNLGlCQUFpQixDQUFDO0FBSWxFLE9BQU8sRUFBQyxlQUFlLEVBQUMsTUFBTSxvQkFBb0IsQ0FBQztBQUduRCxPQUFPLEVBQUMsRUFBRSxFQUFDLE1BQU0sYUFBYSxDQUFDO0FBRS9COzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7OztHQXVCRztBQUNILFNBQVMsT0FBTyxDQUFtQixDQUFvQixFQUFFLElBQUksR0FBRyxDQUFDO0lBQy9ELE1BQU0sRUFBRSxHQUFHLGVBQWUsQ0FBQyxDQUFDLEVBQUUsR0FBRyxFQUFFLFFBQVEsQ0FBQyxDQUFDO0lBRTdDLE1BQU0sTUFBTSxHQUFpQixFQUFDLENBQUMsRUFBRSxFQUFFLEVBQUMsQ0FBQztJQUNyQyxNQUFNLEtBQUssR0FBZ0IsRUFBQyxJQUFJLEVBQUMsQ0FBQztJQUVsQyxPQUFPLE1BQU0sQ0FBQyxTQUFTLENBQ25CLE1BQU0sRUFBRSxNQUE4QixFQUFFLEtBQTJCLENBQUMsQ0FBQztBQUMzRSxDQUFDO0FBRUQsTUFBTSxDQUFDLE1BQU0sTUFBTSxHQUFHLEVBQUUsQ0FBQyxFQUFDLE9BQU8sRUFBQyxDQUFDLENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyIvKipcbiAqIEBsaWNlbnNlXG4gKiBDb3B5cmlnaHQgMjAyMCBHb29nbGUgSW5jLiBBbGwgUmlnaHRzIFJlc2VydmVkLlxuICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlIFwiTGljZW5zZVwiKTtcbiAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS5cbiAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdFxuICpcbiAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMFxuICpcbiAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmVcbiAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuIFwiQVMgSVNcIiBCQVNJUyxcbiAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLlxuICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZFxuICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuXG4gKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuICovXG5cbmltcG9ydCB7RU5HSU5FfSBmcm9tICcuLi9lbmdpbmUnO1xuaW1wb3J0IHtBcmdNaW4sIEFyZ01pbkF0dHJzLCBBcmdNaW5JbnB1dHN9IGZyb20gJy4uL2tlcm5lbF9uYW1lcyc7XG5pbXBvcnQge05hbWVkQXR0ck1hcH0gZnJvbSAnLi4va2VybmVsX3JlZ2lzdHJ5JztcbmltcG9ydCB7VGVuc29yfSBmcm9tICcuLi90ZW5zb3InO1xuaW1wb3J0IHtOYW1lZFRlbnNvck1hcH0gZnJvbSAnLi4vdGVuc29yX3R5cGVzJztcbmltcG9ydCB7Y29udmVydFRvVGVuc29yfSBmcm9tICcuLi90ZW5zb3JfdXRpbF9lbnYnO1xuaW1wb3J0IHtUZW5zb3JMaWtlfSBmcm9tICcuLi90eXBlcyc7XG5cbmltcG9ydCB7b3B9IGZyb20gJy4vb3BlcmF0aW9uJztcblxuLyoqXG4gKiBSZXR1cm5zIHRoZSBpbmRpY2VzIG9mIHRoZSBtaW5pbXVtIHZhbHVlcyBhbG9uZyBhbiBgYXhpc2AuXG4gKlxuICogVGhlIHJlc3VsdCBoYXMgdGhlIHNhbWUgc2hhcGUgYXMgYGlucHV0YCB3aXRoIHRoZSBkaW1lbnNpb24gYWxvbmcgYGF4aXNgXG4gKiByZW1vdmVkLlxuICpcbiAqIGBgYGpzXG4gKiBjb25zdCB4ID0gdGYudGVuc29yMWQoWzEsIDIsIDNdKTtcbiAqXG4gKiB4LmFyZ01pbigpLnByaW50KCk7ICAvLyBvciB0Zi5hcmdNaW4oeClcbiAqIGBgYFxuICpcbiAqIGBgYGpzXG4gKiBjb25zdCB4ID0gdGYudGVuc29yMmQoWzEsIDIsIDQsIDNdLCBbMiwgMl0pO1xuICpcbiAqIGNvbnN0IGF4aXMgPSAxO1xuICogeC5hcmdNaW4oYXhpcykucHJpbnQoKTsgIC8vIG9yIHRmLmFyZ01pbih4LCBheGlzKVxuICogYGBgXG4gKlxuICogQHBhcmFtIHggVGhlIGlucHV0IHRlbnNvci5cbiAqIEBwYXJhbSBheGlzIFRoZSBkaW1lbnNpb24gdG8gcmVkdWNlLiBEZWZhdWx0cyB0byAwIChvdXRlci1tb3N0IGRpbWVuc2lvbikuXG4gKlxuICogQGRvYyB7aGVhZGluZzogJ09wZXJhdGlvbnMnLCBzdWJoZWFkaW5nOiAnUmVkdWN0aW9uJ31cbiAqL1xuZnVuY3Rpb24gYXJnTWluXzxUIGV4dGVuZHMgVGVuc29yPih4OiBUZW5zb3J8VGVuc29yTGlrZSwgYXhpcyA9IDApOiBUIHtcbiAgY29uc3QgJHggPSBjb252ZXJ0VG9UZW5zb3IoeCwgJ3gnLCAnYXJnTWluJyk7XG5cbiAgY29uc3QgaW5wdXRzOiBBcmdNaW5JbnB1dHMgPSB7eDogJHh9O1xuICBjb25zdCBhdHRyczogQXJnTWluQXR0cnMgPSB7YXhpc307XG5cbiAgcmV0dXJuIEVOR0lORS5ydW5LZXJuZWwoXG4gICAgICBBcmdNaW4sIGlucHV0cyBhcyB7fSBhcyBOYW1lZFRlbnNvck1hcCwgYXR0cnMgYXMge30gYXMgTmFtZWRBdHRyTWFwKTtcbn1cblxuZXhwb3J0IGNvbnN0IGFyZ01pbiA9IG9wKHthcmdNaW5ffSk7XG4iXX0=","/**\n * @license\n * Copyright 2018 Google LLC. All Rights Reserved.\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n * =============================================================================\n */\nimport { ENGINE } from '../engine';\nimport { Asin } from '../kernel_names';\nimport { convertToTensor } from '../tensor_util_env';\nimport { op } from './operation';\n/**\n * Computes asin of the input `tf.Tensor` element-wise: `asin(x)`\n *\n * ```js\n * const x = tf.tensor1d([0, 1, -1, .7]);\n *\n * x.asin().print(); // or tf.asin(x)\n * ```\n * @param x The input tensor.\n * @doc {heading: 'Operations', subheading: 'Basic math'}\n */\nfunction asin_(x) {\n const $x = convertToTensor(x, 'x', 'asin');\n const inputs = { x: $x };\n return ENGINE.runKernel(Asin, inputs);\n}\nexport const asin = op({ asin_ });\n//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYXNpbi5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uLy4uL3RmanMtY29yZS9zcmMvb3BzL2FzaW4udHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUE7Ozs7Ozs7Ozs7Ozs7OztHQWVHO0FBRUgsT0FBTyxFQUFDLE1BQU0sRUFBQyxNQUFNLFdBQVcsQ0FBQztBQUNqQyxPQUFPLEVBQUMsSUFBSSxFQUFhLE1BQU0saUJBQWlCLENBQUM7QUFHakQsT0FBTyxFQUFDLGVBQWUsRUFBQyxNQUFNLG9CQUFvQixDQUFDO0FBR25ELE9BQU8sRUFBQyxFQUFFLEVBQUMsTUFBTSxhQUFhLENBQUM7QUFFL0I7Ozs7Ozs7Ozs7R0FVRztBQUNILFNBQVMsS0FBSyxDQUFtQixDQUFlO0lBQzlDLE1BQU0sRUFBRSxHQUFHLGVBQWUsQ0FBQyxDQUFDLEVBQUUsR0FBRyxFQUFFLE1BQU0sQ0FBQyxDQUFDO0lBQzNDLE1BQU0sTUFBTSxHQUFlLEVBQUMsQ0FBQyxFQUFFLEVBQUUsRUFBQyxDQUFDO0lBRW5DLE9BQU8sTUFBTSxDQUFDLFNBQVMsQ0FBQyxJQUFJLEVBQUUsTUFBOEIsQ0FBQyxDQUFDO0FBQ2hFLENBQUM7QUFDRCxNQUFNLENBQUMsTUFBTSxJQUFJLEdBQUcsRUFBRSxDQUFDLEVBQUMsS0FBSyxFQUFDLENBQUMsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbIi8qKlxuICogQGxpY2Vuc2VcbiAqIENvcHlyaWdodCAyMDE4IEdvb2dsZSBMTEMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuXG4gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgXCJMaWNlbnNlXCIpO1xuICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLlxuICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0XG4gKlxuICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wXG4gKlxuICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZVxuICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gXCJBUyBJU1wiIEJBU0lTLFxuICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuXG4gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kXG4gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS5cbiAqID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4gKi9cblxuaW1wb3J0IHtFTkdJTkV9IGZyb20gJy4uL2VuZ2luZSc7XG5pbXBvcnQge0FzaW4sIEFzaW5JbnB1dHN9IGZyb20gJy4uL2tlcm5lbF9uYW1lcyc7XG5pbXBvcnQge1RlbnNvcn0gZnJvbSAnLi4vdGVuc29yJztcbmltcG9ydCB7TmFtZWRUZW5zb3JNYXB9IGZyb20gJy4uL3RlbnNvcl90eXBlcyc7XG5pbXBvcnQge2NvbnZlcnRUb1RlbnNvcn0gZnJvbSAnLi4vdGVuc29yX3V0aWxfZW52JztcbmltcG9ydCB7VGVuc29yTGlrZX0gZnJvbSAnLi4vdHlwZXMnO1xuXG5pbXBvcnQge29wfSBmcm9tICcuL29wZXJhdGlvbic7XG5cbi8qKlxuICogQ29tcHV0ZXMgYXNpbiBvZiB0aGUgaW5wdXQgYHRmLlRlbnNvcmAgZWxlbWVudC13aXNlOiBgYXNpbih4KWBcbiAqXG4gKiBgYGBqc1xuICogY29uc3QgeCA9IHRmLnRlbnNvcjFkKFswLCAxLCAtMSwgLjddKTtcbiAqXG4gKiB4LmFzaW4oKS5wcmludCgpOyAgLy8gb3IgdGYuYXNpbih4KVxuICogYGBgXG4gKiBAcGFyYW0geCBUaGUgaW5wdXQgdGVuc29yLlxuICogQGRvYyB7aGVhZGluZzogJ09wZXJhdGlvbnMnLCBzdWJoZWFkaW5nOiAnQmFzaWMgbWF0aCd9XG4gKi9cbmZ1bmN0aW9uIGFzaW5fPFQgZXh0ZW5kcyBUZW5zb3I+KHg6IFR8VGVuc29yTGlrZSk6IFQge1xuICBjb25zdCAkeCA9IGNvbnZlcnRUb1RlbnNvcih4LCAneCcsICdhc2luJyk7XG4gIGNvbnN0IGlucHV0czogQXNpbklucHV0cyA9IHt4OiAkeH07XG5cbiAgcmV0dXJuIEVOR0lORS5ydW5LZXJuZWwoQXNpbiwgaW5wdXRzIGFzIHt9IGFzIE5hbWVkVGVuc29yTWFwKTtcbn1cbmV4cG9ydCBjb25zdCBhc2luID0gb3Aoe2FzaW5ffSk7XG4iXX0=","/**\n * @license\n * Copyright 2018 Google LLC. All Rights Reserved.\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n * =============================================================================\n */\nimport { ENGINE } from '../engine';\nimport { Asinh } from '../kernel_names';\nimport { convertToTensor } from '../tensor_util_env';\nimport { op } from './operation';\n/**\n * Computes inverse hyperbolic sin of the input `tf.Tensor` element-wise:\n * `asinh(x)`\n *\n * ```js\n * const x = tf.tensor1d([0, 1, -1, .7]);\n *\n * x.asinh().print(); // or tf.asinh(x)\n * ```\n * @param x The input tensor.\n *\n * @doc {heading: 'Operations', subheading: 'Basic math'}\n */\nfunction asinh_(x) {\n const $x = convertToTensor(x, 'x', 'asinh');\n const inputs = { x: $x };\n return ENGINE.runKernel(Asinh, inputs);\n}\nexport const asinh = op({ asinh_ });\n//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYXNpbmguanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi8uLi90ZmpzLWNvcmUvc3JjL29wcy9hc2luaC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQTs7Ozs7Ozs7Ozs7Ozs7O0dBZUc7QUFFSCxPQUFPLEVBQUMsTUFBTSxFQUFDLE1BQU0sV0FBVyxDQUFDO0FBQ2pDLE9BQU8sRUFBQyxLQUFLLEVBQWMsTUFBTSxpQkFBaUIsQ0FBQztBQUduRCxPQUFPLEVBQUMsZUFBZSxFQUFDLE1BQU0sb0JBQW9CLENBQUM7QUFHbkQsT0FBTyxFQUFDLEVBQUUsRUFBQyxNQUFNLGFBQWEsQ0FBQztBQUUvQjs7Ozs7Ozs7Ozs7O0dBWUc7QUFDSCxTQUFTLE1BQU0sQ0FBbUIsQ0FBZTtJQUMvQyxNQUFNLEVBQUUsR0FBRyxlQUFlLENBQUMsQ0FBQyxFQUFFLEdBQUcsRUFBRSxPQUFPLENBQUMsQ0FBQztJQUU1QyxNQUFNLE1BQU0sR0FBZ0IsRUFBQyxDQUFDLEVBQUUsRUFBRSxFQUFDLENBQUM7SUFFcEMsT0FBTyxNQUFNLENBQUMsU0FBUyxDQUFDLEtBQUssRUFBRSxNQUE4QixDQUFDLENBQUM7QUFDakUsQ0FBQztBQUNELE1BQU0sQ0FBQyxNQUFNLEtBQUssR0FBRyxFQUFFLENBQUMsRUFBQyxNQUFNLEVBQUMsQ0FBQyxDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiLyoqXG4gKiBAbGljZW5zZVxuICogQ29weXJpZ2h0IDIwMTggR29vZ2xlIExMQy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC5cbiAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSBcIkxpY2Vuc2VcIik7XG4gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuXG4gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXRcbiAqXG4gKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjBcbiAqXG4gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlXG4gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiBcIkFTIElTXCIgQkFTSVMsXG4gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC5cbiAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmRcbiAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLlxuICogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbiAqL1xuXG5pbXBvcnQge0VOR0lORX0gZnJvbSAnLi4vZW5naW5lJztcbmltcG9ydCB7QXNpbmgsIEFzaW5oSW5wdXRzfSBmcm9tICcuLi9rZXJuZWxfbmFtZXMnO1xuaW1wb3J0IHtUZW5zb3J9IGZyb20gJy4uL3RlbnNvcic7XG5pbXBvcnQge05hbWVkVGVuc29yTWFwfSBmcm9tICcuLi90ZW5zb3JfdHlwZXMnO1xuaW1wb3J0IHtjb252ZXJ0VG9UZW5zb3J9IGZyb20gJy4uL3RlbnNvcl91dGlsX2Vudic7XG5pbXBvcnQge1RlbnNvckxpa2V9IGZyb20gJy4uL3R5cGVzJztcblxuaW1wb3J0IHtvcH0gZnJvbSAnLi9vcGVyYXRpb24nO1xuXG4vKipcbiAqIENvbXB1dGVzIGludmVyc2UgaHlwZXJib2xpYyBzaW4gb2YgdGhlIGlucHV0IGB0Zi5UZW5zb3JgIGVsZW1lbnQtd2lzZTpcbiAqIGBhc2luaCh4KWBcbiAqXG4gKiBgYGBqc1xuICogY29uc3QgeCA9IHRmLnRlbnNvcjFkKFswLCAxLCAtMSwgLjddKTtcbiAqXG4gKiB4LmFzaW5oKCkucHJpbnQoKTsgIC8vIG9yIHRmLmFzaW5oKHgpXG4gKiBgYGBcbiAqIEBwYXJhbSB4IFRoZSBpbnB1dCB0ZW5zb3IuXG4gKlxuICogQGRvYyB7aGVhZGluZzogJ09wZXJhdGlvbnMnLCBzdWJoZWFkaW5nOiAnQmFzaWMgbWF0aCd9XG4gKi9cbmZ1bmN0aW9uIGFzaW5oXzxUIGV4dGVuZHMgVGVuc29yPih4OiBUfFRlbnNvckxpa2UpOiBUIHtcbiAgY29uc3QgJHggPSBjb252ZXJ0VG9UZW5zb3IoeCwgJ3gnLCAnYXNpbmgnKTtcblxuICBjb25zdCBpbnB1dHM6IEFzaW5oSW5wdXRzID0ge3g6ICR4fTtcblxuICByZXR1cm4gRU5HSU5FLnJ1bktlcm5lbChBc2luaCwgaW5wdXRzIGFzIHt9IGFzIE5hbWVkVGVuc29yTWFwKTtcbn1cbmV4cG9ydCBjb25zdCBhc2luaCA9IG9wKHthc2luaF99KTtcbiJdfQ==","/**\n * @license\n * Copyright 2018 Google LLC. All Rights Reserved.\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n * =============================================================================\n */\nimport { ENGINE } from '../engine';\nimport { Atan } from '../kernel_names';\nimport { convertToTensor } from '../tensor_util_env';\nimport { op } from './operation';\n/**\n * Computes atan of the input `tf.Tensor` element-wise: `atan(x)`\n *\n * ```js\n * const x = tf.tensor1d([0, 1, -1, .7]);\n *\n * x.atan().print(); // or tf.atan(x)\n * ```\n * @param x The input tensor.\n *\n * @doc {heading: 'Operations', subheading: 'Basic math'}\n */\nfunction atan_(x) {\n const $x = convertToTensor(x, 'x', 'atan');\n const inputs = { x: $x };\n return ENGINE.runKernel(Atan, inputs);\n}\nexport const atan = op({ atan_ });\n//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYXRhbi5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uLy4uL3RmanMtY29yZS9zcmMvb3BzL2F0YW4udHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUE7Ozs7Ozs7Ozs7Ozs7OztHQWVHO0FBRUgsT0FBTyxFQUFDLE1BQU0sRUFBQyxNQUFNLFdBQVcsQ0FBQztBQUNqQyxPQUFPLEVBQUMsSUFBSSxFQUFhLE1BQU0saUJBQWlCLENBQUM7QUFHakQsT0FBTyxFQUFDLGVBQWUsRUFBQyxNQUFNLG9CQUFvQixDQUFDO0FBR25ELE9BQU8sRUFBQyxFQUFFLEVBQUMsTUFBTSxhQUFhLENBQUM7QUFFL0I7Ozs7Ozs7Ozs7O0dBV0c7QUFDSCxTQUFTLEtBQUssQ0FBbUIsQ0FBZTtJQUM5QyxNQUFNLEVBQUUsR0FBRyxlQUFlLENBQUMsQ0FBQyxFQUFFLEdBQUcsRUFBRSxNQUFNLENBQUMsQ0FBQztJQUUzQyxNQUFNLE1BQU0sR0FBZSxFQUFDLENBQUMsRUFBRSxFQUFFLEVBQUMsQ0FBQztJQUVuQyxPQUFPLE1BQU0sQ0FBQyxTQUFTLENBQUMsSUFBSSxFQUFFLE1BQThCLENBQUMsQ0FBQztBQUNoRSxDQUFDO0FBQ0QsTUFBTSxDQUFDLE1BQU0sSUFBSSxHQUFHLEVBQUUsQ0FBQyxFQUFDLEtBQUssRUFBQyxDQUFDLENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyIvKipcbiAqIEBsaWNlbnNlXG4gKiBDb3B5cmlnaHQgMjAxOCBHb29nbGUgTExDLiBBbGwgUmlnaHRzIFJlc2VydmVkLlxuICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlIFwiTGljZW5zZVwiKTtcbiAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS5cbiAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdFxuICpcbiAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMFxuICpcbiAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmVcbiAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuIFwiQVMgSVNcIiBCQVNJUyxcbiAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLlxuICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZFxuICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuXG4gKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuICovXG5cbmltcG9ydCB7RU5HSU5FfSBmcm9tICcuLi9lbmdpbmUnO1xuaW1wb3J0IHtBdGFuLCBBdGFuSW5wdXRzfSBmcm9tICcuLi9rZXJuZWxfbmFtZXMnO1xuaW1wb3J0IHtUZW5zb3J9IGZyb20gJy4uL3RlbnNvcic7XG5pbXBvcnQge05hbWVkVGVuc29yTWFwfSBmcm9tICcuLi90ZW5zb3JfdHlwZXMnO1xuaW1wb3J0IHtjb252ZXJ0VG9UZW5zb3J9IGZyb20gJy4uL3RlbnNvcl91dGlsX2Vudic7XG5pbXBvcnQge1RlbnNvckxpa2V9IGZyb20gJy4uL3R5cGVzJztcblxuaW1wb3J0IHtvcH0gZnJvbSAnLi9vcGVyYXRpb24nO1xuXG4vKipcbiAqIENvbXB1dGVzIGF0YW4gb2YgdGhlIGlucHV0IGB0Zi5UZW5zb3JgIGVsZW1lbnQtd2lzZTogYGF0YW4oeClgXG4gKlxuICogYGBganNcbiAqIGNvbnN0IHggPSB0Zi50ZW5zb3IxZChbMCwgMSwgLTEsIC43XSk7XG4gKlxuICogeC5hdGFuKCkucHJpbnQoKTsgIC8vIG9yIHRmLmF0YW4oeClcbiAqIGBgYFxuICogQHBhcmFtIHggVGhlIGlucHV0IHRlbnNvci5cbiAqXG4gKiBAZG9jIHtoZWFkaW5nOiAnT3BlcmF0aW9ucycsIHN1YmhlYWRpbmc6ICdCYXNpYyBtYXRoJ31cbiAqL1xuZnVuY3Rpb24gYXRhbl88VCBleHRlbmRzIFRlbnNvcj4oeDogVHxUZW5zb3JMaWtlKTogVCB7XG4gIGNvbnN0ICR4ID0gY29udmVydFRvVGVuc29yKHgsICd4JywgJ2F0YW4nKTtcblxuICBjb25zdCBpbnB1dHM6IEF0YW5JbnB1dHMgPSB7eDogJHh9O1xuXG4gIHJldHVybiBFTkdJTkUucnVuS2VybmVsKEF0YW4sIGlucHV0cyBhcyB7fSBhcyBOYW1lZFRlbnNvck1hcCk7XG59XG5leHBvcnQgY29uc3QgYXRhbiA9IG9wKHthdGFuX30pO1xuIl19","/**\n * @license\n * Copyright 2020 Google LLC. All Rights Reserved.\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n * =============================================================================\n */\nimport { ENGINE } from '../engine';\nimport { Atan2 } from '../kernel_names';\nimport { makeTypesMatch } from '../tensor_util';\nimport { convertToTensor } from '../tensor_util_env';\nimport { op } from './operation';\n/**\n * Computes arctangent of `tf.Tensor`s a / b element-wise: `atan2(a, b)`.\n * Supports broadcasting.\n *\n * ```js\n * const a = tf.tensor1d([1.0, 1.0, -1.0, .7]);\n * const b = tf.tensor1d([2.0, 13.0, 3.5, .21]);\n *\n * tf.atan2(a, b).print()\n * ```\n *\n * @param a The first tensor.\n * @param b The second tensor. Must have the same dtype as `a`.\n *\n * @doc {heading: 'Operations', subheading: 'Basic math'}\n */\nfunction atan2_(a, b) {\n let $a = convertToTensor(a, 'a', 'atan2');\n let $b = convertToTensor(b, 'b', 'atan2');\n [$a, $b] = makeTypesMatch($a, $b);\n const inputs = { a: $a, b: $b };\n return ENGINE.runKernel(Atan2, inputs);\n}\nexport const atan2 = op({ atan2_ });\n//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYXRhbjIuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi8uLi90ZmpzLWNvcmUvc3JjL29wcy9hdGFuMi50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQTs7Ozs7Ozs7Ozs7Ozs7O0dBZUc7QUFFSCxPQUFPLEVBQUMsTUFBTSxFQUFDLE1BQU0sV0FBVyxDQUFDO0FBQ2pDLE9BQU8sRUFBQyxLQUFLLEVBQWMsTUFBTSxpQkFBaUIsQ0FBQztBQUduRCxPQUFPLEVBQUMsY0FBYyxFQUFDLE1BQU0sZ0JBQWdCLENBQUM7QUFDOUMsT0FBTyxFQUFDLGVBQWUsRUFBQyxNQUFNLG9CQUFvQixDQUFDO0FBR25ELE9BQU8sRUFBQyxFQUFFLEVBQUMsTUFBTSxhQUFhLENBQUM7QUFFL0I7Ozs7Ozs7Ozs7Ozs7OztHQWVHO0FBQ0gsU0FBUyxNQUFNLENBQ1gsQ0FBb0IsRUFBRSxDQUFvQjtJQUM1QyxJQUFJLEVBQUUsR0FBRyxlQUFlLENBQUMsQ0FBQyxFQUFFLEdBQUcsRUFBRSxPQUFPLENBQUMsQ0FBQztJQUMxQyxJQUFJLEVBQUUsR0FBRyxlQUFlLENBQUMsQ0FBQyxFQUFFLEdBQUcsRUFBRSxPQUFPLENBQUMsQ0FBQztJQUMxQyxDQUFDLEVBQUUsRUFBRSxFQUFFLENBQUMsR0FBRyxjQUFjLENBQUMsRUFBRSxFQUFFLEVBQUUsQ0FBQyxDQUFDO0lBRWxDLE1BQU0sTUFBTSxHQUFnQixFQUFDLENBQUMsRUFBRSxFQUFFLEVBQUUsQ0FBQyxFQUFFLEVBQUUsRUFBQyxDQUFDO0lBRTNDLE9BQU8sTUFBTSxDQUFDLFNBQVMsQ0FBQyxLQUFLLEVBQUUsTUFBOEIsQ0FBQyxDQUFDO0FBQ2pFLENBQUM7QUFFRCxNQUFNLENBQUMsTUFBTSxLQUFLLEdBQUcsRUFBRSxDQUFDLEVBQUMsTUFBTSxFQUFDLENBQUMsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbIi8qKlxuICogQGxpY2Vuc2VcbiAqIENvcHlyaWdodCAyMDIwIEdvb2dsZSBMTEMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuXG4gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgXCJMaWNlbnNlXCIpO1xuICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLlxuICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0XG4gKlxuICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wXG4gKlxuICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZVxuICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gXCJBUyBJU1wiIEJBU0lTLFxuICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuXG4gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kXG4gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS5cbiAqID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4gKi9cblxuaW1wb3J0IHtFTkdJTkV9IGZyb20gJy4uL2VuZ2luZSc7XG5pbXBvcnQge0F0YW4yLCBBdGFuMklucHV0c30gZnJvbSAnLi4va2VybmVsX25hbWVzJztcbmltcG9ydCB7VGVuc29yfSBmcm9tICcuLi90ZW5zb3InO1xuaW1wb3J0IHtOYW1lZFRlbnNvck1hcH0gZnJvbSAnLi4vdGVuc29yX3R5cGVzJztcbmltcG9ydCB7bWFrZVR5cGVzTWF0Y2h9IGZyb20gJy4uL3RlbnNvcl91dGlsJztcbmltcG9ydCB7Y29udmVydFRvVGVuc29yfSBmcm9tICcuLi90ZW5zb3JfdXRpbF9lbnYnO1xuaW1wb3J0IHtUZW5zb3JMaWtlfSBmcm9tICcuLi90eXBlcyc7XG5cbmltcG9ydCB7b3B9IGZyb20gJy4vb3BlcmF0aW9uJztcblxuLyoqXG4gKiBDb21wdXRlcyBhcmN0YW5nZW50IG9mIGB0Zi5UZW5zb3JgcyBhIC8gYiBlbGVtZW50LXdpc2U6IGBhdGFuMihhLCBiKWAuXG4gKiBTdXBwb3J0cyBicm9hZGNhc3RpbmcuXG4gKlxuICogYGBganNcbiAqIGNvbnN0IGEgPSB0Zi50ZW5zb3IxZChbMS4wLCAxLjAsIC0xLjAsIC43XSk7XG4gKiBjb25zdCBiID0gdGYudGVuc29yMWQoWzIuMCwgMTMuMCwgMy41LCAuMjFdKTtcbiAqXG4gKiB0Zi5hdGFuMihhLCBiKS5wcmludCgpXG4gKiBgYGBcbiAqXG4gKiBAcGFyYW0gYSBUaGUgZmlyc3QgdGVuc29yLlxuICogQHBhcmFtIGIgVGhlIHNlY29uZCB0ZW5zb3IuIE11c3QgaGF2ZSB0aGUgc2FtZSBkdHlwZSBhcyBgYWAuXG4gKlxuICogQGRvYyB7aGVhZGluZzogJ09wZXJhdGlvbnMnLCBzdWJoZWFkaW5nOiAnQmFzaWMgbWF0aCd9XG4gKi9cbmZ1bmN0aW9uIGF0YW4yXzxUIGV4dGVuZHMgVGVuc29yPihcbiAgICBhOiBUZW5zb3J8VGVuc29yTGlrZSwgYjogVGVuc29yfFRlbnNvckxpa2UpOiBUIHtcbiAgbGV0ICRhID0gY29udmVydFRvVGVuc29yKGEsICdhJywgJ2F0YW4yJyk7XG4gIGxldCAkYiA9IGNvbnZlcnRUb1RlbnNvcihiLCAnYicsICdhdGFuMicpO1xuICBbJGEsICRiXSA9IG1ha2VUeXBlc01hdGNoKCRhLCAkYik7XG5cbiAgY29uc3QgaW5wdXRzOiBBdGFuMklucHV0cyA9IHthOiAkYSwgYjogJGJ9O1xuXG4gIHJldHVybiBFTkdJTkUucnVuS2VybmVsKEF0YW4yLCBpbnB1dHMgYXMge30gYXMgTmFtZWRUZW5zb3JNYXApO1xufVxuXG5leHBvcnQgY29uc3QgYXRhbjIgPSBvcCh7YXRhbjJffSk7XG4iXX0=","/**\n * @license\n * Copyright 2018 Google LLC. All Rights Reserved.\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n * =============================================================================\n */\nimport { ENGINE } from '../engine';\nimport { Atanh } from '../kernel_names';\nimport { convertToTensor } from '../tensor_util_env';\nimport { op } from './operation';\n/**\n * Computes inverse hyperbolic tan of the input `tf.Tensor` element-wise:\n * `atanh(x)`\n *\n * ```js\n * const x = tf.tensor1d([0, .1, -.1, .7]);\n *\n * x.atanh().print(); // or tf.atanh(x)\n * ```\n * @param x The input tensor.\n *\n * @doc {heading: 'Operations', subheading: 'Basic math'}\n */\nfunction atanh_(x) {\n const $x = convertToTensor(x, 'x', 'atanh');\n const inputs = { x: $x };\n return ENGINE.runKernel(Atanh, inputs);\n}\nexport const atanh = op({ atanh_ });\n//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYXRhbmguanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi8uLi90ZmpzLWNvcmUvc3JjL29wcy9hdGFuaC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQTs7Ozs7Ozs7Ozs7Ozs7O0dBZUc7QUFFSCxPQUFPLEVBQUMsTUFBTSxFQUFDLE1BQU0sV0FBVyxDQUFDO0FBQ2pDLE9BQU8sRUFBQyxLQUFLLEVBQWMsTUFBTSxpQkFBaUIsQ0FBQztBQUduRCxPQUFPLEVBQUMsZUFBZSxFQUFDLE1BQU0sb0JBQW9CLENBQUM7QUFHbkQsT0FBTyxFQUFDLEVBQUUsRUFBQyxNQUFNLGFBQWEsQ0FBQztBQUUvQjs7Ozs7Ozs7Ozs7O0dBWUc7QUFDSCxTQUFTLE1BQU0sQ0FBbUIsQ0FBZTtJQUMvQyxNQUFNLEVBQUUsR0FBRyxlQUFlLENBQUMsQ0FBQyxFQUFFLEdBQUcsRUFBRSxPQUFPLENBQUMsQ0FBQztJQUU1QyxNQUFNLE1BQU0sR0FBZ0IsRUFBQyxDQUFDLEVBQUUsRUFBRSxFQUFDLENBQUM7SUFFcEMsT0FBTyxNQUFNLENBQUMsU0FBUyxDQUFDLEtBQUssRUFBRSxNQUE4QixDQUFDLENBQUM7QUFDakUsQ0FBQztBQUNELE1BQU0sQ0FBQyxNQUFNLEtBQUssR0FBRyxFQUFFLENBQUMsRUFBQyxNQUFNLEVBQUMsQ0FBQyxDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiLyoqXG4gKiBAbGljZW5zZVxuICogQ29weXJpZ2h0IDIwMTggR29vZ2xlIExMQy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC5cbiAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSBcIkxpY2Vuc2VcIik7XG4gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuXG4gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXRcbiAqXG4gKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjBcbiAqXG4gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlXG4gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiBcIkFTIElTXCIgQkFTSVMsXG4gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC5cbiAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmRcbiAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLlxuICogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbiAqL1xuXG5pbXBvcnQge0VOR0lORX0gZnJvbSAnLi4vZW5naW5lJztcbmltcG9ydCB7QXRhbmgsIEF0YW5oSW5wdXRzfSBmcm9tICcuLi9rZXJuZWxfbmFtZXMnO1xuaW1wb3J0IHtUZW5zb3J9IGZyb20gJy4uL3RlbnNvcic7XG5pbXBvcnQge05hbWVkVGVuc29yTWFwfSBmcm9tICcuLi90ZW5zb3JfdHlwZXMnO1xuaW1wb3J0IHtjb252ZXJ0VG9UZW5zb3J9IGZyb20gJy4uL3RlbnNvcl91dGlsX2Vudic7XG5pbXBvcnQge1RlbnNvckxpa2V9IGZyb20gJy4uL3R5cGVzJztcblxuaW1wb3J0IHtvcH0gZnJvbSAnLi9vcGVyYXRpb24nO1xuXG4vKipcbiAqIENvbXB1dGVzIGludmVyc2UgaHlwZXJib2xpYyB0YW4gb2YgdGhlIGlucHV0IGB0Zi5UZW5zb3JgIGVsZW1lbnQtd2lzZTpcbiAqIGBhdGFuaCh4KWBcbiAqXG4gKiBgYGBqc1xuICogY29uc3QgeCA9IHRmLnRlbnNvcjFkKFswLCAuMSwgLS4xLCAuN10pO1xuICpcbiAqIHguYXRhbmgoKS5wcmludCgpOyAgLy8gb3IgdGYuYXRhbmgoeClcbiAqIGBgYFxuICogQHBhcmFtIHggVGhlIGlucHV0IHRlbnNvci5cbiAqXG4gKiBAZG9jIHtoZWFkaW5nOiAnT3BlcmF0aW9ucycsIHN1YmhlYWRpbmc6ICdCYXNpYyBtYXRoJ31cbiAqL1xuZnVuY3Rpb24gYXRhbmhfPFQgZXh0ZW5kcyBUZW5zb3I+KHg6IFR8VGVuc29yTGlrZSk6IFQge1xuICBjb25zdCAkeCA9IGNvbnZlcnRUb1RlbnNvcih4LCAneCcsICdhdGFuaCcpO1xuXG4gIGNvbnN0IGlucHV0czogQXRhbmhJbnB1dHMgPSB7eDogJHh9O1xuXG4gIHJldHVybiBFTkdJTkUucnVuS2VybmVsKEF0YW5oLCBpbnB1dHMgYXMge30gYXMgTmFtZWRUZW5zb3JNYXApO1xufVxuZXhwb3J0IGNvbnN0IGF0YW5oID0gb3Aoe2F0YW5oX30pO1xuIl19","/**\n * @license\n * Copyright 2020 Google LLC. All Rights Reserved.\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n * =============================================================================\n */\nimport { ENGINE } from '../engine';\nimport { AvgPool } from '../kernel_names';\nimport { convertToTensor } from '../tensor_util_env';\nimport * as util from '../util';\nimport { cast } from './cast';\nimport * as conv_util from './conv_util';\nimport { op } from './operation';\nimport { reshape } from './reshape';\n/**\n * Computes the 2D average pooling of an image.\n *\n * @param x The input tensor, of rank 4 or rank 3 of shape\n * `[batch, height, width, inChannels]`. If rank 3, batch of 1 is assumed.\n * @param filterSize The filter size: `[filterHeight, filterWidth]`. If\n * `filterSize` is a single number, then `filterHeight == filterWidth`.\n * @param strides The strides of the pooling: `[strideHeight, strideWidth]`. If\n * `strides` is a single number, then `strideHeight == strideWidth`.\n * @param pad The type of padding algorithm:\n * - `same` and stride 1: output will be of same size as input,\n * regardless of filter size.\n * - `valid`: output will be smaller than input if filter is larger\n * than 1x1.\n * - For more info, see this guide:\n * [https://www.tensorflow.org/api_docs/python/tf/nn/convolution](\n * https://www.tensorflow.org/api_docs/python/tf/nn/convolution)\n * @param dimRoundingMode A string from: 'ceil', 'round', 'floor'. If none is\n * provided, it will default to truncate.\n */\nfunction avgPool_(x, filterSize, strides, pad, dimRoundingMode) {\n const $x = convertToTensor(x, 'x', 'avgPool', 'float32');\n const dilations = 1;\n util.assert(conv_util.eitherStridesOrDilationsAreOne(strides, dilations), () => 'Error in avgPool: Either strides or dilations must be 1. ' +\n `Got strides ${strides} and dilations '${dilations}'`);\n let x4D = $x;\n let reshapedTo4D = false;\n if ($x.rank === 3) {\n reshapedTo4D = true;\n x4D = reshape($x, [1, $x.shape[0], $x.shape[1], $x.shape[2]]);\n }\n util.assert(x4D.rank === 4, () => `Error in avgPool: x must be rank 4 but got rank ${x4D.rank}.`);\n conv_util.checkPadOnDimRoundingMode('avgPool', pad, dimRoundingMode);\n const inputs = { x: x4D };\n const attrs = { filterSize, strides, pad, dimRoundingMode };\n // tslint:disable-next-line: no-unnecessary-type-assertion\n let res = ENGINE.runKernel(AvgPool, inputs, attrs);\n res = cast(res, $x.dtype);\n if (reshapedTo4D) {\n return reshape(res, [res.shape[1], res.shape[2], res.shape[3]]);\n }\n return res;\n}\nexport const avgPool = op({ avgPool_ });\n//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYXZnX3Bvb2wuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi8uLi90ZmpzLWNvcmUvc3JjL29wcy9hdmdfcG9vbC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQTs7Ozs7Ozs7Ozs7Ozs7O0dBZUc7QUFFSCxPQUFPLEVBQUMsTUFBTSxFQUFDLE1BQU0sV0FBVyxDQUFDO0FBQ2pDLE9BQU8sRUFBQyxPQUFPLEVBQThCLE1BQU0saUJBQWlCLENBQUM7QUFJckUsT0FBTyxFQUFDLGVBQWUsRUFBQyxNQUFNLG9CQUFvQixDQUFDO0FBRW5ELE9BQU8sS0FBSyxJQUFJLE1BQU0sU0FBUyxDQUFDO0FBRWhDLE9BQU8sRUFBQyxJQUFJLEVBQUMsTUFBTSxRQUFRLENBQUM7QUFDNUIsT0FBTyxLQUFLLFNBQVMsTUFBTSxhQUFhLENBQUM7QUFDekMsT0FBTyxFQUFDLEVBQUUsRUFBQyxNQUFNLGFBQWEsQ0FBQztBQUMvQixPQUFPLEVBQUMsT0FBTyxFQUFDLE1BQU0sV0FBVyxDQUFDO0FBRWxDOzs7Ozs7Ozs7Ozs7Ozs7Ozs7O0dBbUJHO0FBQ0gsU0FBUyxRQUFRLENBQ2IsQ0FBZSxFQUFFLFVBQW1DLEVBQ3BELE9BQWdDLEVBQ2hDLEdBQW9ELEVBQ3BELGVBQXdDO0lBQzFDLE1BQU0sRUFBRSxHQUFHLGVBQWUsQ0FBQyxDQUFDLEVBQUUsR0FBRyxFQUFFLFNBQVMsRUFBRSxTQUFTLENBQUMsQ0FBQztJQUN6RCxNQUFNLFNBQVMsR0FBRyxDQUFDLENBQUM7SUFFcEIsSUFBSSxDQUFDLE1BQU0sQ0FDUCxTQUFTLENBQUMsOEJBQThCLENBQUMsT0FBTyxFQUFFLFNBQVMsQ0FBQyxFQUM1RCxHQUFHLEVBQUUsQ0FBQywyREFBMkQ7UUFDN0QsZUFBZSxPQUFPLG1CQUFtQixTQUFTLEdBQUcsQ0FBQyxDQUFDO0lBRS9ELElBQUksR0FBRyxHQUFHLEVBQWMsQ0FBQztJQUN6QixJQUFJLFlBQVksR0FBRyxLQUFLLENBQUM7SUFDekIsSUFBSSxFQUFFLENBQUMsSUFBSSxLQUFLLENBQUMsRUFBRTtRQUNqQixZQUFZLEdBQUcsSUFBSSxDQUFDO1FBQ3BCLEdBQUcsR0FBRyxPQUFPLENBQUMsRUFBRSxFQUFFLENBQUMsQ0FBQyxFQUFFLEVBQUUsQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDLEVBQUUsRUFBRSxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUMsRUFBRSxFQUFFLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQztLQUMvRDtJQUVELElBQUksQ0FBQyxNQUFNLENBQ1AsR0FBRyxDQUFDLElBQUksS0FBSyxDQUFDLEVBQ2QsR0FBRyxFQUFFLENBQUMsbURBQW1ELEdBQUcsQ0FBQyxJQUFJLEdBQUcsQ0FBQyxDQUFDO0lBQzFFLFNBQVMsQ0FBQyx5QkFBeUIsQ0FBQyxTQUFTLEVBQUUsR0FBRyxFQUFFLGVBQWUsQ0FBQyxDQUFDO0lBQ3JFLE1BQU0sTUFBTSxHQUFrQixFQUFDLENBQUMsRUFBRSxHQUFHLEVBQUMsQ0FBQztJQUN2QyxNQUFNLEtBQUssR0FBaUIsRUFBQyxVQUFVLEVBQUUsT0FBTyxFQUFFLEdBQUcsRUFBRSxlQUFlLEVBQUMsQ0FBQztJQUV4RSwwREFBMEQ7SUFDMUQsSUFBSSxHQUFHLEdBQUcsTUFBTSxDQUFDLFNBQVMsQ0FDWixPQUFPLEVBQUUsTUFBOEIsRUFDdkMsS0FBMkIsQ0FBTSxDQUFDO0lBRWhELEdBQUcsR0FBRyxJQUFJLENBQUMsR0FBRyxFQUFFLEVBQUUsQ0FBQyxLQUFLLENBQUMsQ0FBQztJQUUxQixJQUFJLFlBQVksRUFBRTtRQUNoQixPQUFPLE9BQU8sQ0FBQyxHQUFHLEVBQUUsQ0FBQyxHQUFHLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQyxFQUFFLEdBQUcsQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDLEVBQUUsR0FBRyxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFNLENBQUM7S0FDdEU7SUFFRCxPQUFPLEdBQUcsQ0FBQztBQUNiLENBQUM7QUFFRCxNQUFNLENBQUMsTUFBTSxPQUFPLEdBQUcsRUFBRSxDQUFDLEVBQUMsUUFBUSxFQUFDLENBQUMsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbIi8qKlxuICogQGxpY2Vuc2VcbiAqIENvcHlyaWdodCAyMDIwIEdvb2dsZSBMTEMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuXG4gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgXCJMaWNlbnNlXCIpO1xuICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLlxuICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0XG4gKlxuICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wXG4gKlxuICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZVxuICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gXCJBUyBJU1wiIEJBU0lTLFxuICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuXG4gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kXG4gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS5cbiAqID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4gKi9cblxuaW1wb3J0IHtFTkdJTkV9IGZyb20gJy4uL2VuZ2luZSc7XG5pbXBvcnQge0F2Z1Bvb2wsIEF2Z1Bvb2xBdHRycywgQXZnUG9vbElucHV0c30gZnJvbSAnLi4va2VybmVsX25hbWVzJztcbmltcG9ydCB7TmFtZWRBdHRyTWFwfSBmcm9tICcuLi9rZXJuZWxfcmVnaXN0cnknO1xuaW1wb3J0IHtUZW5zb3IzRCwgVGVuc29yNER9IGZyb20gJy4uL3RlbnNvcic7XG5pbXBvcnQge05hbWVkVGVuc29yTWFwfSBmcm9tICcuLi90ZW5zb3JfdHlwZXMnO1xuaW1wb3J0IHtjb252ZXJ0VG9UZW5zb3J9IGZyb20gJy4uL3RlbnNvcl91dGlsX2Vudic7XG5pbXBvcnQge1RlbnNvckxpa2V9IGZyb20gJy4uL3R5cGVzJztcbmltcG9ydCAqIGFzIHV0aWwgZnJvbSAnLi4vdXRpbCc7XG5cbmltcG9ydCB7Y2FzdH0gZnJvbSAnLi9jYXN0JztcbmltcG9ydCAqIGFzIGNvbnZfdXRpbCBmcm9tICcuL2NvbnZfdXRpbCc7XG5pbXBvcnQge29wfSBmcm9tICcuL29wZXJhdGlvbic7XG5pbXBvcnQge3Jlc2hhcGV9IGZyb20gJy4vcmVzaGFwZSc7XG5cbi8qKlxuICogQ29tcHV0ZXMgdGhlIDJEIGF2ZXJhZ2UgcG9vbGluZyBvZiBhbiBpbWFnZS5cbiAqXG4gKiBAcGFyYW0geCBUaGUgaW5wdXQgdGVuc29yLCBvZiByYW5rIDQgb3IgcmFuayAzIG9mIHNoYXBlXG4gKiAgICAgYFtiYXRjaCwgaGVpZ2h0LCB3aWR0aCwgaW5DaGFubmVsc11gLiBJZiByYW5rIDMsIGJhdGNoIG9mIDEgaXMgYXNzdW1lZC5cbiAqIEBwYXJhbSBmaWx0ZXJTaXplIFRoZSBmaWx0ZXIgc2l6ZTogYFtmaWx0ZXJIZWlnaHQsIGZpbHRlcldpZHRoXWAuIElmXG4gKiAgICAgYGZpbHRlclNpemVgIGlzIGEgc2luZ2xlIG51bWJlciwgdGhlbiBgZmlsdGVySGVpZ2h0ID09IGZpbHRlcldpZHRoYC5cbiAqIEBwYXJhbSBzdHJpZGVzIFRoZSBzdHJpZGVzIG9mIHRoZSBwb29saW5nOiBgW3N0cmlkZUhlaWdodCwgc3RyaWRlV2lkdGhdYC4gSWZcbiAqICAgICBgc3RyaWRlc2AgaXMgYSBzaW5nbGUgbnVtYmVyLCB0aGVuIGBzdHJpZGVIZWlnaHQgPT0gc3RyaWRlV2lkdGhgLlxuICogQHBhcmFtIHBhZCBUaGUgdHlwZSBvZiBwYWRkaW5nIGFsZ29yaXRobTpcbiAqICAgIC0gYHNhbWVgIGFuZCBzdHJpZGUgMTogb3V0cHV0IHdpbGwgYmUgb2Ygc2FtZSBzaXplIGFzIGlucHV0LFxuICogICAgICAgcmVnYXJkbGVzcyBvZiBmaWx0ZXIgc2l6ZS5cbiAqICAgIC0gYHZhbGlkYDogb3V0cHV0IHdpbGwgYmUgc21hbGxlciB0aGFuIGlucHV0IGlmIGZpbHRlciBpcyBsYXJnZXJcbiAqICAgICAgIHRoYW4gMXgxLlxuICogICAgLSBGb3IgbW9yZSBpbmZvLCBzZWUgdGhpcyBndWlkZTpcbiAqICAgICBbaHR0cHM6Ly93d3cudGVuc29yZmxvdy5vcmcvYXBpX2RvY3MvcHl0aG9uL3RmL25uL2NvbnZvbHV0aW9uXShcbiAqICAgICAgICAgaHR0cHM6Ly93d3cudGVuc29yZmxvdy5vcmcvYXBpX2RvY3MvcHl0aG9uL3RmL25uL2NvbnZvbHV0aW9uKVxuICogQHBhcmFtIGRpbVJvdW5kaW5nTW9kZSBBIHN0cmluZyBmcm9tOiAnY2VpbCcsICdyb3VuZCcsICdmbG9vcicuIElmIG5vbmUgaXNcbiAqICAgICBwcm92aWRlZCwgaXQgd2lsbCBkZWZhdWx0IHRvIHRydW5jYXRlLlxuICovXG5mdW5jdGlvbiBhdmdQb29sXzxUIGV4dGVuZHMgVGVuc29yM0R8VGVuc29yNEQ+KFxuICAgIHg6IFR8VGVuc29yTGlrZSwgZmlsdGVyU2l6ZTogW251bWJlciwgbnVtYmVyXXxudW1iZXIsXG4gICAgc3RyaWRlczogW251bWJlciwgbnVtYmVyXXxudW1iZXIsXG4gICAgcGFkOiAndmFsaWQnfCdzYW1lJ3xudW1iZXJ8Y29udl91dGlsLkV4cGxpY2l0UGFkZGluZyxcbiAgICBkaW1Sb3VuZGluZ01vZGU/OiAnZmxvb3InfCdyb3VuZCd8J2NlaWwnKTogVCB7XG4gIGNvbnN0ICR4ID0gY29udmVydFRvVGVuc29yKHgsICd4JywgJ2F2Z1Bvb2wnLCAnZmxvYXQzMicpO1xuICBjb25zdCBkaWxhdGlvbnMgPSAxO1xuXG4gIHV0aWwuYXNzZXJ0KFxuICAgICAgY29udl91dGlsLmVpdGhlclN0cmlkZXNPckRpbGF0aW9uc0FyZU9uZShzdHJpZGVzLCBkaWxhdGlvbnMpLFxuICAgICAgKCkgPT4gJ0Vycm9yIGluIGF2Z1Bvb2w6IEVpdGhlciBzdHJpZGVzIG9yIGRpbGF0aW9ucyBtdXN0IGJlIDEuICcgK1xuICAgICAgICAgIGBHb3Qgc3RyaWRlcyAke3N0cmlkZXN9IGFuZCBkaWxhdGlvbnMgJyR7ZGlsYXRpb25zfSdgKTtcblxuICBsZXQgeDREID0gJHggYXMgVGVuc29yNEQ7XG4gIGxldCByZXNoYXBlZFRvNEQgPSBmYWxzZTtcbiAgaWYgKCR4LnJhbmsgPT09IDMpIHtcbiAgICByZXNoYXBlZFRvNEQgPSB0cnVlO1xuICAgIHg0RCA9IHJlc2hhcGUoJHgsIFsxLCAkeC5zaGFwZVswXSwgJHguc2hhcGVbMV0sICR4LnNoYXBlWzJdXSk7XG4gIH1cblxuICB1dGlsLmFzc2VydChcbiAgICAgIHg0RC5yYW5rID09PSA0LFxuICAgICAgKCkgPT4gYEVycm9yIGluIGF2Z1Bvb2w6IHggbXVzdCBiZSByYW5rIDQgYnV0IGdvdCByYW5rICR7eDRELnJhbmt9LmApO1xuICBjb252X3V0aWwuY2hlY2tQYWRPbkRpbVJvdW5kaW5nTW9kZSgnYXZnUG9vbCcsIHBhZCwgZGltUm91bmRpbmdNb2RlKTtcbiAgY29uc3QgaW5wdXRzOiBBdmdQb29sSW5wdXRzID0ge3g6IHg0RH07XG4gIGNvbnN0IGF0dHJzOiBBdmdQb29sQXR0cnMgPSB7ZmlsdGVyU2l6ZSwgc3RyaWRlcywgcGFkLCBkaW1Sb3VuZGluZ01vZGV9O1xuXG4gIC8vIHRzbGludDpkaXNhYmxlLW5leHQtbGluZTogbm8tdW5uZWNlc3NhcnktdHlwZS1hc3NlcnRpb25cbiAgbGV0IHJlcyA9IEVOR0lORS5ydW5LZXJuZWwoXG4gICAgICAgICAgICAgICAgQXZnUG9vbCwgaW5wdXRzIGFzIHt9IGFzIE5hbWVkVGVuc29yTWFwLFxuICAgICAgICAgICAgICAgIGF0dHJzIGFzIHt9IGFzIE5hbWVkQXR0ck1hcCkgYXMgVDtcblxuICByZXMgPSBjYXN0KHJlcywgJHguZHR5cGUpO1xuXG4gIGlmIChyZXNoYXBlZFRvNEQpIHtcbiAgICByZXR1cm4gcmVzaGFwZShyZXMsIFtyZXMuc2hhcGVbMV0sIHJlcy5zaGFwZVsyXSwgcmVzLnNoYXBlWzNdXSkgYXMgVDtcbiAgfVxuXG4gIHJldHVybiByZXM7XG59XG5cbmV4cG9ydCBjb25zdCBhdmdQb29sID0gb3Aoe2F2Z1Bvb2xffSk7XG4iXX0=","/**\n * @license\n * Copyright 2017 Google LLC. All Rights Reserved.\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n * =============================================================================\n */\nimport * as util from '../util';\n/**\n * Returns true if the axis specifies the inner most dimensions of the\n * array.\n */\nexport function axesAreInnerMostDims(axes, rank) {\n for (let i = 0; i < axes.length; ++i) {\n if (axes[axes.length - i - 1] !== rank - 1 - i) {\n return false;\n }\n }\n return true;\n}\nexport function combineLocations(outputLoc, reduceLoc, axes) {\n const rank = outputLoc.length + reduceLoc.length;\n const loc = [];\n let outIdx = 0;\n let reduceIdx = 0;\n for (let dim = 0; dim < rank; dim++) {\n if (axes.indexOf(dim) === -1) {\n loc.push(outputLoc[outIdx++]);\n }\n else {\n loc.push(reduceLoc[reduceIdx++]);\n }\n }\n return loc;\n}\nexport function computeOutAndReduceShapes(aShape, axes) {\n const outShape = [];\n const rank = aShape.length;\n for (let dim = 0; dim < rank; dim++) {\n if (axes.indexOf(dim) === -1) {\n outShape.push(aShape[dim]);\n }\n }\n const reduceShape = axes.map(dim => aShape[dim]);\n return [outShape, reduceShape];\n}\nexport function expandShapeToKeepDim(shape, axes) {\n const reduceSubShape = axes.map(x => 1);\n return combineLocations(shape, reduceSubShape, axes);\n}\nexport function assertAxesAreInnerMostDims(msg, axes, rank) {\n util.assert(axesAreInnerMostDims(axes, rank), () => `${msg} supports only inner-most axes for now. ` +\n `Got axes ${axes} and rank-${rank} input.`);\n}\n/**\n * Returns the axes permutation to be used with `tf.transpose`, if such\n * permutation is necessary. Otherwise it returns null. This method is used by\n * operations that operate only on inner-most axes.\n */\nexport function getAxesPermutation(axes, rank) {\n if (axesAreInnerMostDims(axes, rank)) {\n return null;\n }\n const result = [];\n for (let i = 0; i < rank; ++i) {\n if (axes.indexOf(i) === -1) {\n result.push(i);\n }\n }\n axes.forEach(axis => result.push(axis));\n return result;\n}\n/** Returns the axes permutation that undoes the original permutation. */\nexport function getUndoAxesPermutation(axes) {\n return axes.map((axis, i) => [i, axis])\n .sort((a, b) => a[1] - b[1])\n .map(x => x[0]);\n}\nexport function getInnerMostAxes(numAxes, rank) {\n const res = [];\n for (let i = rank - numAxes; i < rank; ++i) {\n res.push(i);\n }\n return res;\n}\n//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYXhpc191dGlsLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vLi4vdGZqcy1jb3JlL3NyYy9vcHMvYXhpc191dGlsLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBOzs7Ozs7Ozs7Ozs7Ozs7R0FlRztBQUVILE9BQU8sS0FBSyxJQUFJLE1BQU0sU0FBUyxDQUFDO0FBRWhDOzs7R0FHRztBQUNILE1BQU0sVUFBVSxvQkFBb0IsQ0FBQyxJQUFjLEVBQUUsSUFBWTtJQUMvRCxLQUFLLElBQUksQ0FBQyxHQUFHLENBQUMsRUFBRSxDQUFDLEdBQUcsSUFBSSxDQUFDLE1BQU0sRUFBRSxFQUFFLENBQUMsRUFBRTtRQUNwQyxJQUFJLElBQUksQ0FBQyxJQUFJLENBQUMsTUFBTSxHQUFHLENBQUMsR0FBRyxDQUFDLENBQUMsS0FBSyxJQUFJLEdBQUcsQ0FBQyxHQUFHLENBQUMsRUFBRTtZQUM5QyxPQUFPLEtBQUssQ0FBQztTQUNkO0tBQ0Y7SUFDRCxPQUFPLElBQUksQ0FBQztBQUNkLENBQUM7QUFFRCxNQUFNLFVBQVUsZ0JBQWdCLENBQzVCLFNBQW1CLEVBQUUsU0FBbUIsRUFBRSxJQUFjO0lBQzFELE1BQU0sSUFBSSxHQUFHLFNBQVMsQ0FBQyxNQUFNLEdBQUcsU0FBUyxDQUFDLE1BQU0sQ0FBQztJQUNqRCxNQUFNLEdBQUcsR0FBRyxFQUFFLENBQUM7SUFDZixJQUFJLE1BQU0sR0FBRyxDQUFDLENBQUM7SUFDZixJQUFJLFNBQVMsR0FBRyxDQUFDLENBQUM7SUFDaEIsS0FBSyxJQUFJLEdBQUcsR0FBRyxDQUFDLEVBQUUsR0FBRyxHQUFHLElBQUksRUFBRSxHQUFHLEVBQUUsRUFBRTtRQUNyQyxJQUFJLElBQUksQ0FBQyxPQUFPLENBQUMsR0FBRyxDQUFDLEtBQUssQ0FBQyxDQUFDLEVBQUU7WUFDNUIsR0FBRyxDQUFDLElBQUksQ0FBQyxTQUFTLENBQUMsTUFBTSxFQUFFLENBQUMsQ0FBQyxDQUFDO1NBQy9CO2FBQU07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QUN6QixLQUFLLElBQUksQ0FBQyxHQUFHLElBQUksR0FBRyxPQUFPLEVBQUUsQ0FBQyxHQUFHLElBQUksRUFBRSxFQUFFLENBQUMsRUFBRTtRQUMxQyxHQUFHLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxDQUFDO0tBQ2I7SUFDRCxPQUFPLEdBQUcsQ0FBQztBQUNiLENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyIvKipcbiAqIEBsaWNlbnNlXG4gKiBDb3B5cmlnaHQgMjAxNyBHb29nbGUgTExDLiBBbGwgUmlnaHRzIFJlc2VydmVkLlxuICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlIFwiTGljZW5zZVwiKTtcbiAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS5cbiAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdFxuICpcbiAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMFxuICpcbiAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmVcbiAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuIFwiQVMgSVNcIiBCQVNJUyxcbiAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLlxuICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZFxuICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuXG4gKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuICovXG5cbmltcG9ydCAqIGFzIHV0aWwgZnJvbSAnLi4vdXRpbCc7XG5cbi8qKlxuICogUmV0dXJucyB0cnVlIGlmIHRoZSBheGlzIHNwZWNpZmllcyB0aGUgaW5uZXIgbW9zdCBkaW1lbnNpb25zIG9mIHRoZVxuICogYXJyYXkuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBheGVzQXJlSW5uZXJNb3N0RGltcyhheGVzOiBudW1iZXJbXSwgcmFuazogbnVtYmVyKTogYm9vbGVhbiB7XG4gIGZvciAobGV0IGkgPSAwOyBpIDwgYXhlcy5sZW5ndGg7ICsraSkge1xuICAgIGlmIChheGVzW2F4ZXMubGVuZ3RoIC0gaSAtIDFdICE9PSByYW5rIC0gMSAtIGkpIHtcbiAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9XG4gIH1cbiAgcmV0dXJuIHRydWU7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBjb21iaW5lTG9jYXRpb25zKFxuICAgIG91dHB1dExvYzogbnVtYmVyW10sIHJlZHVjZUxvYzogbnVtYmVyW10sIGF4ZXM6IG51bWJlcltdKTogbnVtYmVyW10ge1xuICBjb25zdCByYW5rID0gb3V0cHV0TG9jLmxlbmd0aCArIHJlZHVjZUxvYy5sZW5ndGg7XG4gIGNvbnN0IGxvYyA9IFtdO1xuICBsZXQgb3V0SWR4ID0gMDtcbiAgbGV0IHJlZHVjZUlkeCA9IDA7XG4gIMKgIGZvciAobGV0IGRpbSA9IDA7IGRpbSA8IHJhbms7IGRpbSsrKSB7XG4gICAgaWYgKGF4ZXMuaW5kZXhPZihkaW0pID09PSAtMSkge1xuICAgICAgbG9jLnB1c2gob3V0cHV0TG9jW291dElkeCsrXSk7XG4gICAgfSBlbHNlIHtcbiAgICAgIGxvYy5wdXNoKHJlZHVjZUxvY1tyZWR1Y2VJZHgrK10pO1xuICAgIH1cbiAgfVxuICByZXR1cm4gbG9jO1xufVxuXG5leHBvcnQgZnVuY3Rpb24gY29tcHV0ZU91dEFuZFJlZHVjZVNoYXBlcyhcbiAgICBhU2hhcGU6IG51bWJlcltdLCBheGVzOiBudW1iZXJbXSk6IFtudW1iZXJbXSwgbnVtYmVyW11dIHtcbiAgY29uc3Qgb3V0U2hhcGUgPSBbXTtcbiAgY29uc3QgcmFuayA9IGFTaGFwZS5sZW5ndGg7XG4gIGZvciAobGV0IGRpbSA9IDA7IGRpbSA8IHJhbms7IGRpbSsrKSB7XG4gICAgaWYgKGF4ZXMuaW5kZXhPZihkaW0pID09PSAtMSkge1xuICAgICAgb3V0U2hhcGUucHVzaChhU2hhcGVbZGltXSk7XG4gICAgfVxuICB9XG4gIGNvbnN0IHJlZHVjZVNoYXBlID0gYXhlcy5tYXAoZGltID0+IGFTaGFwZVtkaW1dKTtcbiAgcmV0dXJuIFtvdXRTaGFwZSwgcmVkdWNlU2hhcGVdO1xufVxuXG5leHBvcnQgZnVuY3Rpb24gZXhwYW5kU2hhcGVUb0tlZXBEaW0oXG4gICAgc2hhcGU6IG51bWJlcltdLCBheGVzOiBudW1iZXJbXSk6IG51bWJlcltdIHtcbiAgY29uc3QgcmVkdWNlU3ViU2hhcGUgPSBheGVzLm1hcCh4ID0+IDEpO1xuICByZXR1cm4gY29tYmluZUxvY2F0aW9ucyhzaGFwZSwgcmVkdWNlU3ViU2hhcGUsIGF4ZXMpO1xufVxuXG5leHBvcnQgZnVuY3Rpb24gYXNzZXJ0QXhlc0FyZUlubmVyTW9zdERpbXMoXG4gICAgbXNnOiBzdHJpbmcsIGF4ZXM6IG51bWJlcltdLCByYW5rOiBudW1iZXIpOiB2b2lkIHtcbiAgdXRpbC5hc3NlcnQoXG4gICAgICBheGVzQXJlSW5uZXJNb3N0RGltcyhheGVzLCByYW5rKSxcbiAgICAgICgpID0+IGAke21zZ30gc3VwcG9ydHMgb25seSBpbm5lci1tb3N0IGF4ZXMgZm9yIG5vdy4gYCArXG4gICAgICAgICAgYEdvdCBheGVzICR7YXhlc30gYW5kIHJhbmstJHtyYW5rfSBpbnB1dC5gKTtcbn1cblxuLyoqXG4gKiBSZXR1cm5zIHRoZSBheGVzIHBlcm11dGF0aW9uIHRvIGJlIHVzZWQgd2l0aCBgdGYudHJhbnNwb3NlYCwgaWYgc3VjaFxuICogcGVybXV0YXRpb24gaXMgbmVjZXNzYXJ5LiBPdGhlcndpc2UgaXQgcmV0dXJucyBudWxsLiBUaGlzIG1ldGhvZCBpcyB1c2VkIGJ5XG4gKiBvcGVyYXRpb25zIHRoYXQgb3BlcmF0ZSBvbmx5IG9uIGlubmVyLW1vc3QgYXhlcy5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGdldEF4ZXNQZXJtdXRhdGlvbihheGVzOiBudW1iZXJbXSwgcmFuazogbnVtYmVyKTogbnVtYmVyW118XG4gICAgbnVsbCB7XG4gIGlmIChheGVzQXJlSW5uZXJNb3N0RGltcyhheGVzLCByYW5rKSkge1xuICAgIHJldHVybiBudWxsO1xuICB9XG4gIGNvbnN0IHJlc3VsdDogbnVtYmVyW10gPSBbXTtcbiAgZm9yIChsZXQgaSA9IDA7IGkgPCByYW5rOyArK2kpIHtcbiAgICBpZiAoYXhlcy5pbmRleE9mKGkpID09PSAtMSkge1xuICAgICAgcmVzdWx0LnB1c2goaSk7XG4gICAgfVxuICB9XG4gIGF4ZXMuZm9yRWFjaChheGlzID0+IHJlc3VsdC5wdXNoKGF4aXMpKTtcbiAgcmV0dXJuIHJlc3VsdDtcbn1cblxuLyoqIFJldHVybnMgdGhlIGF4ZXMgcGVybXV0YXRpb24gdGhhdCB1bmRvZXMgdGhlIG9yaWdpbmFsIHBlcm11dGF0aW9uLiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGdldFVuZG9BeGVzUGVybXV0YXRpb24oYXhlczogbnVtYmVyW10pOiBudW1iZXJbXSB7XG4gIHJldHVybiBheGVzLm1hcCgoYXhpcywgaSkgPT4gW2ksIGF4aXNdKVxuICAgICAgLnNvcnQoKGEsIGIpID0+IGFbMV0gLSBiWzFdKVxuICAgICAgLm1hcCh4ID0+IHhbMF0pO1xufVxuXG5leHBvcnQgZnVuY3Rpb24gZ2V0SW5uZXJNb3N0QXhlcyhudW1BeGVzOiBudW1iZXIsIHJhbms6IG51bWJlcik6IG51bWJlcltdIHtcbiAgY29uc3QgcmVzOiBudW1iZXJbXSA9IFtdO1xuICBmb3IgKGxldCBpID0gcmFuayAtIG51bUF4ZXM7IGkgPCByYW5rOyArK2kpIHtcbiAgICByZXMucHVzaChpKTtcbiAgfVxuICByZXR1cm4gcmVzO1xufVxuIl19","/**\n * @license\n * Copyright 2020 Google LLC. All Rights Reserved.\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n * =============================================================================\n */\nimport { ENGINE } from '../engine';\nimport { BatchToSpaceND } from '../kernel_names';\nimport { convertToTensor } from '../tensor_util_env';\nimport * as util from '../util';\nimport { op } from './operation';\n/**\n * This operation reshapes the \"batch\" dimension 0 into `M + 1` dimensions of\n * shape `blockShape + [batch]`, interleaves these blocks back into the grid\n * defined by the spatial dimensions `[1, ..., M]`, to obtain a result with\n * the same rank as the input. The spatial dimensions of this intermediate\n * result are then optionally cropped according to `crops` to produce the\n * output. This is the reverse of `tf.spaceToBatchND`. See below for a precise\n * description.\n *\n * ```js\n * const x = tf.tensor4d([1, 2, 3, 4], [4, 1, 1, 1]);\n * const blockShape = [2, 2];\n * const crops = [[0, 0], [0, 0]];\n *\n * x.batchToSpaceND(blockShape, crops).print();\n * ```\n *\n * @param x A `tf.Tensor`. N-D with `x.shape` = `[batch] + spatialShape +\n * remainingShape`, where spatialShape has `M` dimensions.\n * @param blockShape A 1-D array. Must have shape `[M]`, all values must\n * be >= 1.\n * @param crops A 2-D array. Must have shape `[M, 2]`, all values must be >= 0.\n * `crops[i] = [cropStart, cropEnd]` specifies the amount to crop from input\n * dimension `i + 1`, which corresponds to spatial dimension `i`. It is required\n * that `cropStart[i] + cropEnd[i] <= blockShape[i] * inputShape[i + 1]`\n *\n * This operation is equivalent to the following steps:\n *\n * 1. Reshape `x` to `reshaped` of shape: `[blockShape[0], ...,\n * blockShape[M-1], batch / prod(blockShape), x.shape[1], ...,\n * x.shape[N-1]]`\n *\n * 2. Permute dimensions of `reshaped` to produce `permuted` of shape `[batch /\n * prod(blockShape),x.shape[1], blockShape[0], ..., x.shape[M],\n * blockShape[M-1],x.shape[M+1], ..., x.shape[N-1]]`\n *\n * 3. Reshape `permuted` to produce `reshapedPermuted` of shape `[batch /\n * prod(blockShape),x.shape[1] * blockShape[0], ..., x.shape[M] *\n * blockShape[M-1],x.shape[M+1], ..., x.shape[N-1]]`\n *\n * 4. Crop the start and end of dimensions `[1, ..., M]` of `reshapedPermuted`\n * according to `crops` to produce the output of shape: `[batch /\n * prod(blockShape),x.shape[1] * blockShape[0] - crops[0,0] - crops[0,1],\n * ..., x.shape[M] * blockShape[M-1] - crops[M-1,0] -\n * crops[M-1,1],x.shape[M+1], ..., x.shape[N-1]]`\n *\n * @doc {heading: 'Tensors', subheading: 'Transformations'}\n */\nfunction batchToSpaceND_(x, blockShape, crops) {\n const $x = convertToTensor(x, 'x', 'batchToSpaceND');\n const prod = blockShape.reduce((a, b) => a * b);\n util.assert($x.rank >= 1 + blockShape.length, () => `input rank is ${$x.rank} but should be > than blockShape.length ${blockShape.length}`);\n util.assert(crops.length === blockShape.length, () => `crops.length is ${crops.length} but should be equal to blockShape.length ${blockShape.length}`);\n util.assert($x.shape[0] % prod === 0, () => `input tensor batch is ${$x.shape[0]} but is not divisible by the product of ` +\n `the elements of blockShape ${blockShape.join(' * ')} === ${prod}`);\n const inputs = { x: $x };\n const attrs = { blockShape, crops };\n return ENGINE.runKernel(BatchToSpaceND, inputs, attrs);\n}\nexport const batchToSpaceND = op({ batchToSpaceND_ });\n//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYmF0Y2hfdG9fc3BhY2VfbmQuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi8uLi90ZmpzLWNvcmUvc3JjL29wcy9iYXRjaF90b19zcGFjZV9uZC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQTs7Ozs7Ozs7Ozs7Ozs7O0dBZUc7QUFFSCxPQUFPLEVBQUMsTUFBTSxFQUFDLE1BQU0sV0FBVyxDQUFDO0FBQ2pDLE9BQU8sRUFBQyxjQUFjLEVBQTRDLE1BQU0saUJBQWlCLENBQUM7QUFJMUYsT0FBTyxFQUFDLGVBQWUsRUFBQyxNQUFNLG9CQUFvQixDQUFDO0FBRW5ELE9BQU8sS0FBSyxJQUFJLE1BQU0sU0FBUyxDQUFDO0FBRWhDLE9BQU8sRUFBQyxFQUFFLEVBQUMsTUFBTSxhQUFhLENBQUM7QUFFL0I7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7O0dBK0NHO0FBQ0gsU0FBUyxlQUFlLENBQ3BCLENBQWUsRUFBRSxVQUFvQixFQUFFLEtBQWlCO0lBQzFELE1BQU0sRUFBRSxHQUFHLGVBQWUsQ0FBQyxDQUFDLEVBQUUsR0FBRyxFQUFFLGdCQUFnQixDQUFDLENBQUM7SUFDckQsTUFBTSxJQUFJLEdBQUcsVUFBVSxDQUFDLE1BQU0sQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLEVBQUUsRUFBRSxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQztJQUVoRCxJQUFJLENBQUMsTUFBTSxDQUNQLEVBQUUsQ0FBQyxJQUFJLElBQUksQ0FBQyxHQUFHLFVBQVUsQ0FBQyxNQUFNLEVBQ2hDLEdBQUcsRUFBRSxDQUFDLGlCQUFpQixFQUFFLENBQUMsSUFBSSwyQ0FDMUIsVUFBVSxDQUFDLE1BQU0sRUFBRSxDQUFDLENBQUM7SUFFN0IsSUFBSSxDQUFDLE1BQU0sQ0FDUCxLQUFLLENBQUMsTUFBTSxLQUFLLFVBQVUsQ0FBQyxNQUFNLEVBQ2xDLEdBQUcsRUFBRSxDQUFDLG1CQUNGLEtBQUssQ0FBQyxNQUFNLDhDQUNaLFVBQVUsQ0FBQyxNQUFNLEVBQUUsQ0FBQyxDQUFDO0lBRTdCLElBQUksQ0FBQyxNQUFNLENBQ1AsRUFBRSxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUMsR0FBRyxJQUFJLEtBQUssQ0FBQyxFQUN4QixHQUFHLEVBQUUsQ0FBQyx5QkFDSSxFQUFFLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQywwQ0FBMEM7UUFDM0QsOEJBQThCLFVBQVUsQ0FBQyxJQUFJLENBQUMsS0FBSyxDQUFDLFFBQVEsSUFBSSxFQUFFLENBQUMsQ0FBQztJQUU1RSxNQUFNLE1BQU0sR0FBeUIsRUFBQyxDQUFDLEVBQUUsRUFBRSxFQUFDLENBQUM7SUFDN0MsTUFBTSxLQUFLLEdBQXdCLEVBQUMsVUFBVSxFQUFFLEtBQUssRUFBQyxDQUFDO0lBRXZELE9BQU8sTUFBTSxDQUFDLFNBQVMsQ0FDbkIsY0FBYyxFQUFFLE1BQThCLEVBQzlDLEtBQTJCLENBQUMsQ0FBQztBQUNuQyxDQUFDO0FBRUQsTUFBTSxDQUFDLE1BQU0sY0FBYyxHQUFHLEVBQUUsQ0FBQyxFQUFDLGVBQWUsRUFBQyxDQUFDLENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyIvKipcbiAqIEBsaWNlbnNlXG4gKiBDb3B5cmlnaHQgMjAyMCBHb29nbGUgTExDLiBBbGwgUmlnaHRzIFJlc2VydmVkLlxuICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlIFwiTGljZW5zZVwiKTtcbiAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS5cbiAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdFxuICpcbiAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMFxuICpcbiAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmVcbiAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuIFwiQVMgSVNcIiBCQVNJUyxcbiAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLlxuICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZFxuICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuXG4gKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuICovXG5cbmltcG9ydCB7RU5HSU5FfSBmcm9tICcuLi9lbmdpbmUnO1xuaW1wb3J0IHtCYXRjaFRvU3BhY2VORCwgQmF0Y2hUb1NwYWNlTkRBdHRycywgQmF0Y2hUb1NwYWNlTkRJbnB1dHN9IGZyb20gJy4uL2tlcm5lbF9uYW1lcyc7XG5pbXBvcnQge05hbWVkQXR0ck1hcH0gZnJvbSAnLi4va2VybmVsX3JlZ2lzdHJ5JztcbmltcG9ydCB7VGVuc29yfSBmcm9tICcuLi90ZW5zb3InO1xuaW1wb3J0IHtOYW1lZFRlbnNvck1hcH0gZnJvbSAnLi4vdGVuc29yX3R5cGVzJztcbmltcG9ydCB7Y29udmVydFRvVGVuc29yfSBmcm9tICcuLi90ZW5zb3JfdXRpbF9lbnYnO1xuaW1wb3J0IHtUZW5zb3JMaWtlfSBmcm9tICcuLi90eXBlcyc7XG5pbXBvcnQgKiBhcyB1dGlsIGZyb20gJy4uL3V0aWwnO1xuXG5pbXBvcnQge29wfSBmcm9tICcuL29wZXJhdGlvbic7XG5cbi8qKlxuICogVGhpcyBvcGVyYXRpb24gcmVzaGFwZXMgdGhlIFwiYmF0Y2hcIiBkaW1lbnNpb24gMCBpbnRvIGBNICsgMWAgZGltZW5zaW9ucyBvZlxuICogc2hhcGUgYGJsb2NrU2hhcGUgKyBbYmF0Y2hdYCwgaW50ZXJsZWF2ZXMgdGhlc2UgYmxvY2tzIGJhY2sgaW50byB0aGUgZ3JpZFxuICogZGVmaW5lZCBieSB0aGUgc3BhdGlhbCBkaW1lbnNpb25zIGBbMSwgLi4uLCBNXWAsIHRvIG9idGFpbiBhIHJlc3VsdCB3aXRoXG4gKiB0aGUgc2FtZSByYW5rIGFzIHRoZSBpbnB1dC4gVGhlIHNwYXRpYWwgZGltZW5zaW9ucyBvZiB0aGlzIGludGVybWVkaWF0ZVxuICogcmVzdWx0IGFyZSB0aGVuIG9wdGlvbmFsbHkgY3JvcHBlZCBhY2NvcmRpbmcgdG8gYGNyb3BzYCB0byBwcm9kdWNlIHRoZVxuICogb3V0cHV0LiBUaGlzIGlzIHRoZSByZXZlcnNlIG9mIGB0Zi5zcGFjZVRvQmF0Y2hORGAuIFNlZSBiZWxvdyBmb3IgYSBwcmVjaXNlXG4gKiBkZXNjcmlwdGlvbi5cbiAqXG4gKiBgYGBqc1xuICogY29uc3QgeCA9IHRmLnRlbnNvcjRkKFsxLCAyLCAzLCA0XSwgWzQsIDEsIDEsIDFdKTtcbiAqIGNvbnN0IGJsb2NrU2hhcGUgPSBbMiwgMl07XG4gKiBjb25zdCBjcm9wcyA9IFtbMCwgMF0sIFswLCAwXV07XG4gKlxuICogeC5iYXRjaFRvU3BhY2VORChibG9ja1NoYXBlLCBjcm9wcykucHJpbnQoKTtcbiAqIGBgYFxuICpcbiAqIEBwYXJhbSB4IEEgYHRmLlRlbnNvcmAuIE4tRCB3aXRoIGB4LnNoYXBlYCA9IGBbYmF0Y2hdICsgc3BhdGlhbFNoYXBlICtcbiAqIHJlbWFpbmluZ1NoYXBlYCwgd2hlcmUgc3BhdGlhbFNoYXBlIGhhcyBgTWAgZGltZW5zaW9ucy5cbiAqIEBwYXJhbSBibG9ja1NoYXBlIEEgMS1EIGFycmF5LiBNdXN0IGhhdmUgc2hhcGUgYFtNXWAsIGFsbCB2YWx1ZXMgbXVzdFxuICogYmUgPj0gMS5cbiAqIEBwYXJhbSBjcm9wcyBBIDItRCBhcnJheS4gIE11c3QgaGF2ZSBzaGFwZSBgW00sIDJdYCwgYWxsIHZhbHVlcyBtdXN0IGJlID49IDAuXG4gKiBgY3JvcHNbaV0gPSBbY3JvcFN0YXJ0LCBjcm9wRW5kXWAgc3BlY2lmaWVzIHRoZSBhbW91bnQgdG8gY3JvcCBmcm9tIGlucHV0XG4gKiBkaW1lbnNpb24gYGkgKyAxYCwgd2hpY2ggY29ycmVzcG9uZHMgdG8gc3BhdGlhbCBkaW1lbnNpb24gYGlgLiBJdCBpcyByZXF1aXJlZFxuICogdGhhdCBgY3JvcFN0YXJ0W2ldICsgY3JvcEVuZFtpXSA8PSBibG9ja1NoYXBlW2ldICogaW5wdXRTaGFwZVtpICsgMV1gXG4gKlxuICogVGhpcyBvcGVyYXRpb24gaXMgZXF1aXZhbGVudCB0byB0aGUgZm9sbG93aW5nIHN0ZXBzOlxuICpcbiAqIDEuIFJlc2hhcGUgYHhgIHRvIGByZXNoYXBlZGAgb2Ygc2hhcGU6IGBbYmxvY2tTaGFwZVswXSwgLi4uLFxuICogYmxvY2tTaGFwZVtNLTFdLCBiYXRjaCAvIHByb2QoYmxvY2tTaGFwZSksIHguc2hhcGVbMV0sIC4uLixcbiAqIHguc2hhcGVbTi0xXV1gXG4gKlxuICogMi4gUGVybXV0ZSBkaW1lbnNpb25zIG9mIGByZXNoYXBlZGAgdG8gcHJvZHVjZSBgcGVybXV0ZWRgIG9mIHNoYXBlIGBbYmF0Y2ggL1xuICogcHJvZChibG9ja1NoYXBlKSx4LnNoYXBlWzFdLCBibG9ja1NoYXBlWzBdLCAuLi4sIHguc2hhcGVbTV0sXG4gKiBibG9ja1NoYXBlW00tMV0seC5zaGFwZVtNKzFdLCAuLi4sIHguc2hhcGVbTi0xXV1gXG4gKlxuICogMy4gUmVzaGFwZSBgcGVybXV0ZWRgIHRvIHByb2R1Y2UgYHJlc2hhcGVkUGVybXV0ZWRgIG9mIHNoYXBlIGBbYmF0Y2ggL1xuICogcHJvZChibG9ja1NoYXBlKSx4LnNoYXBlWzFdICogYmxvY2tTaGFwZVswXSwgLi4uLCB4LnNoYXBlW01dICpcbiAqIGJsb2NrU2hhcGVbTS0xXSx4LnNoYXBlW00rMV0sIC4uLiwgeC5zaGFwZVtOLTFdXWBcbiAqXG4gKiA0LiBDcm9wIHRoZSBzdGFydCBhbmQgZW5kIG9mIGRpbWVuc2lvbnMgYFsxLCAuLi4sIE1dYCBvZiBgcmVzaGFwZWRQZXJtdXRlZGBcbiAqIGFjY29yZGluZyB0byBgY3JvcHNgIHRvIHByb2R1Y2UgdGhlIG91dHB1dCBvZiBzaGFwZTogYFtiYXRjaCAvXG4gKiBwcm9kKGJsb2NrU2hhcGUpLHguc2hhcGVbMV0gKiBibG9ja1NoYXBlWzBdIC0gY3JvcHNbMCwwXSAtIGNyb3BzWzAsMV0sXG4gKiAuLi4sIHguc2hhcGVbTV0gKiBibG9ja1NoYXBlW00tMV0gLSBjcm9wc1tNLTEsMF0gLVxuICogY3JvcHNbTS0xLDFdLHguc2hhcGVbTSsxXSwgLi4uLCB4LnNoYXBlW04tMV1dYFxuICpcbiAqIEBkb2Mge2hlYWRpbmc6ICdUZW5zb3JzJywgc3ViaGVhZGluZzogJ1RyYW5zZm9ybWF0aW9ucyd9XG4gKi9cbmZ1bmN0aW9uIGJhdGNoVG9TcGFjZU5EXzxUIGV4dGVuZHMgVGVuc29yPihcbiAgICB4OiBUfFRlbnNvckxpa2UsIGJsb2NrU2hhcGU6IG51bWJlcltdLCBjcm9wczogbnVtYmVyW11bXSk6IFQge1xuICBjb25zdCAkeCA9IGNvbnZlcnRUb1RlbnNvcih4LCAneCcsICdiYXRjaFRvU3BhY2VORCcpO1xuICBjb25zdCBwcm9kID0gYmxvY2tTaGFwZS5yZWR1Y2UoKGEsIGIpID0+IGEgKiBiKTtcblxuICB1dGlsLmFzc2VydChcbiAgICAgICR4LnJhbmsgPj0gMSArIGJsb2NrU2hhcGUubGVuZ3RoLFxuICAgICAgKCkgPT4gYGlucHV0IHJhbmsgaXMgJHskeC5yYW5rfSBidXQgc2hvdWxkIGJlID4gdGhhbiBibG9ja1NoYXBlLmxlbmd0aCAke1xuICAgICAgICAgIGJsb2NrU2hhcGUubGVuZ3RofWApO1xuXG4gIHV0aWwuYXNzZXJ0KFxuICAgICAgY3JvcHMubGVuZ3RoID09PSBibG9ja1NoYXBlLmxlbmd0aCxcbiAgICAgICgpID0+IGBjcm9wcy5sZW5ndGggaXMgJHtcbiAgICAgICAgICBjcm9wcy5sZW5ndGh9IGJ1dCBzaG91bGQgYmUgZXF1YWwgdG8gYmxvY2tTaGFwZS5sZW5ndGggICR7XG4gICAgICAgICAgYmxvY2tTaGFwZS5sZW5ndGh9YCk7XG5cbiAgdXRpbC5hc3NlcnQoXG4gICAgICAkeC5zaGFwZVswXSAlIHByb2QgPT09IDAsXG4gICAgICAoKSA9PiBgaW5wdXQgdGVuc29yIGJhdGNoIGlzICR7XG4gICAgICAgICAgICAgICAgJHguc2hhcGVbMF19IGJ1dCBpcyBub3QgZGl2aXNpYmxlIGJ5IHRoZSBwcm9kdWN0IG9mIGAgK1xuICAgICAgICAgIGB0aGUgZWxlbWVudHMgb2YgYmxvY2tTaGFwZSAke2Jsb2NrU2hhcGUuam9pbignICogJyl9ID09PSAke3Byb2R9YCk7XG5cbiAgY29uc3QgaW5wdXRzOiBCYXRjaFRvU3BhY2VORElucHV0cyA9IHt4OiAkeH07XG4gIGNvbnN0IGF0dHJzOiBCYXRjaFRvU3BhY2VOREF0dHJzID0ge2Jsb2NrU2hhcGUsIGNyb3BzfTtcblxuICByZXR1cm4gRU5HSU5FLnJ1bktlcm5lbChcbiAgICAgIEJhdGNoVG9TcGFjZU5ELCBpbnB1dHMgYXMge30gYXMgTmFtZWRUZW5zb3JNYXAsXG4gICAgICBhdHRycyBhcyB7fSBhcyBOYW1lZEF0dHJNYXApO1xufVxuXG5leHBvcnQgY29uc3QgYmF0Y2hUb1NwYWNlTkQgPSBvcCh7YmF0Y2hUb1NwYWNlTkRffSk7XG4iXX0=","/**\n * @license\n * Copyright 2020 Google LLC. All Rights Reserved.\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n * =============================================================================\n */\nimport { ENGINE } from '../engine';\nimport { FusedBatchNorm } from '../kernel_names';\nimport { convertToTensor } from '../tensor_util_env';\nimport * as util from '../util';\nimport { xAs4D } from './batchnorm_util';\nimport { op } from './operation';\nimport { reshape } from './reshape';\n/**\n * Batch normalization.\n *\n * As described in\n * [http://arxiv.org/abs/1502.03167](http://arxiv.org/abs/1502.03167).\n *\n * Mean, variance, scale, and offset can be of two shapes:\n * - The same shape as the input.\n * - In the common case, the depth dimension is the last dimension of x, so\n * the values would be a `tf.Tensor1D` of shape [depth].\n *\n * Also available are stricter rank-specific methods with the same signature\n * as this method that assert that parameters passed are of given rank\n * - `tf.batchNorm2d`\n * - `tf.batchNorm3d`\n * - `tf.batchNorm4d`\n *\n * @param x The input Tensor.\n * @param mean A mean Tensor.\n * @param variance A variance Tensor.\n * @param offset An offset Tensor.\n * @param scale A scale Tensor.\n * @param varianceEpsilon A small float number to avoid dividing by 0.\n *\n * @doc {heading: 'Operations', subheading: 'Normalization'}\n */\nfunction batchNorm_(x, mean, variance, offset, scale, varianceEpsilon) {\n if (varianceEpsilon == null) {\n varianceEpsilon = 0.001;\n }\n const $x = convertToTensor(x, 'x', 'batchNorm');\n const $mean = convertToTensor(mean, 'mean', 'batchNorm');\n const $variance = convertToTensor(variance, 'variance', 'batchNorm');\n let $scale;\n if (scale != null) {\n $scale = convertToTensor(scale, 'scale', 'batchNorm');\n }\n let $offset;\n if (offset != null) {\n $offset = convertToTensor(offset, 'offset', 'batchNorm');\n }\n util.assert($mean.rank === $variance.rank, () => 'Batch normalization gradient requires mean and variance to have ' +\n 'equal ranks.');\n util.assert($offset == null || $mean.rank === $offset.rank, () => 'Batch normalization gradient requires mean and offset to have ' +\n 'equal ranks.');\n util.assert($scale == null || $mean.rank === $scale.rank, () => 'Batch normalization gradient requires mean and scale to have ' +\n 'equal ranks.');\n const x4D = xAs4D($x);\n const inputs = {\n x: x4D,\n scale: $scale,\n offset: $offset,\n mean: $mean,\n variance: $variance\n };\n const attrs = { varianceEpsilon };\n // tslint:disable-next-line: no-unnecessary-type-assertion\n const res = ENGINE.runKernel(FusedBatchNorm, inputs, attrs);\n return reshape(res, $x.shape);\n}\nexport const batchNorm = op({ batchNorm_ });\n//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYmF0Y2hub3JtLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vLi4vdGZqcy1jb3JlL3NyYy9vcHMvYmF0Y2hub3JtLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBOzs7Ozs7Ozs7Ozs7Ozs7R0FlRztBQUVILE9BQU8sRUFBQyxNQUFNLEVBQUMsTUFBTSxXQUFXLENBQUM7QUFDakMsT0FBTyxFQUFDLGNBQWMsRUFBNEMsTUFBTSxpQkFBaUIsQ0FBQztBQUkxRixPQUFPLEVBQUMsZUFBZSxFQUFDLE1BQU0sb0JBQW9CLENBQUM7QUFFbkQsT0FBTyxLQUFLLElBQUksTUFBTSxTQUFTLENBQUM7QUFFaEMsT0FBTyxFQUFDLEtBQUssRUFBQyxNQUFNLGtCQUFrQixDQUFDO0FBQ3ZDLE9BQU8sRUFBQyxFQUFFLEVBQUMsTUFBTSxhQUFhLENBQUM7QUFDL0IsT0FBTyxFQUFDLE9BQU8sRUFBQyxNQUFNLFdBQVcsQ0FBQztBQUVsQzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7OztHQXlCRztBQUNILFNBQVMsVUFBVSxDQUNmLENBQXVCLEVBQUUsSUFBbUMsRUFDNUQsUUFBdUMsRUFDdkMsTUFBc0MsRUFDdEMsS0FBcUMsRUFDckMsZUFBd0I7SUFDMUIsSUFBSSxlQUFlLElBQUksSUFBSSxFQUFFO1FBQzNCLGVBQWUsR0FBRyxLQUFLLENBQUM7S0FDekI7SUFDRCxNQUFNLEVBQUUsR0FBRyxlQUFlLENBQUMsQ0FBQyxFQUFFLEdBQUcsRUFBRSxXQUFXLENBQUMsQ0FBQztJQUNoRCxNQUFNLEtBQUssR0FBRyxlQUFlLENBQUMsSUFBSSxFQUFFLE1BQU0sRUFBRSxXQUFXLENBQUMsQ0FBQztJQUN6RCxNQUFNLFNBQVMsR0FBRyxlQUFlLENBQUMsUUFBUSxFQUFFLFVBQVUsRUFBRSxXQUFXLENBQUMsQ0FBQztJQUNyRSxJQUFJLE1BQTBCLENBQUM7SUFDL0IsSUFBSSxLQUFLLElBQUksSUFBSSxFQUFFO1FBQ2pCLE1BQU0sR0FBRyxlQUFlLENBQUMsS0FBSyxFQUFFLE9BQU8sRUFBRSxXQUFXLENBQUMsQ0FBQztLQUN2RDtJQUNELElBQUksT0FBMkIsQ0FBQztJQUNoQyxJQUFJLE1BQU0sSUFBSSxJQUFJLEVBQUU7UUFDbEIsT0FBTyxHQUFHLGVBQWUsQ0FBQyxNQUFNLEVBQUUsUUFBUSxFQUFFLFdBQVcsQ0FBQyxDQUFDO0tBQzFEO0lBRUQsSUFBSSxDQUFDLE1BQU0sQ0FDUCxLQUFLLENBQUMsSUFBSSxLQUFLLFNBQVMsQ0FBQyxJQUFJLEVBQzdCLEdBQUcsRUFBRSxDQUFDLGtFQUFrRTtRQUNwRSxjQUFjLENBQUMsQ0FBQztJQUN4QixJQUFJLENBQUMsTUFBTSxDQUNQLE9BQU8sSUFBSSxJQUFJLElBQUksS0FBSyxDQUFDLElBQUksS0FBSyxPQUFPLENBQUMsSUFBSSxFQUM5QyxHQUFHLEVBQUUsQ0FBQyxnRUFBZ0U7UUFDbEUsY0FBYyxDQUFDLENBQUM7SUFDeEIsSUFBSSxDQUFDLE1BQU0sQ0FDUCxNQUFNLElBQUksSUFBSSxJQUFJLEtBQUssQ0FBQyxJQUFJLEtBQUssTUFBTSxDQUFDLElBQUksRUFDNUMsR0FBRyxFQUFFLENBQUMsK0RBQStEO1FBQ2pFLGNBQWMsQ0FBQyxDQUFDO0lBRXhCLE1BQU0sR0FBRyxHQUFhLEtBQUssQ0FBQyxFQUFFLENBQUMsQ0FBQztJQUVoQyxNQUFNLE1BQU0sR0FBeUI7UUFDbkMsQ0FBQyxFQUFFLEdBQUc7UUFDTixLQUFLLEVBQUUsTUFBTTtRQUNiLE1BQU0sRUFBRSxPQUFPO1FBQ2YsSUFBSSxFQUFFLEtBQUs7UUFDWCxRQUFRLEVBQUUsU0FBUztLQUNwQixDQUFDO0lBRUYsTUFBTSxLQUFLLEdBQXdCLEVBQUMsZUFBZSxFQUFDLENBQUM7SUFFckQsMERBQTBEO0lBQzFELE1BQU0sR0FBRyxHQUFHLE1BQU0sQ0FBQyxTQUFTLENBQ1osY0FBYyxFQUFFLE1BQThCLEVBQzlDLEtBQTJCLENBQWMsQ0FBQztJQUUxRCxPQUFPLE9BQU8sQ0FBQyxHQUFHLEVBQUUsRUFBRSxDQUFDLEtBQUssQ0FBQyxDQUFDO0FBQ2hDLENBQUM7QUFFRCxNQUFNLENBQUMsTUFBTSxTQUFTLEdBQUcsRUFBRSxDQUFDLEVBQUMsVUFBVSxFQUFDLENBQUMsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbIi8qKlxuICogQGxpY2Vuc2VcbiAqIENvcHlyaWdodCAyMDIwIEdvb2dsZSBMTEMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuXG4gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgXCJMaWNlbnNlXCIpO1xuICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLlxuICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0XG4gKlxuICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wXG4gKlxuICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZVxuICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gXCJBUyBJU1wiIEJBU0lTLFxuICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuXG4gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kXG4gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS5cbiAqID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4gKi9cblxuaW1wb3J0IHtFTkdJTkV9IGZyb20gJy4uL2VuZ2luZSc7XG5pbXBvcnQge0Z1c2VkQmF0Y2hOb3JtLCBGdXNlZEJhdGNoTm9ybUF0dHJzLCBGdXNlZEJhdGNoTm9ybUlucHV0c30gZnJvbSAnLi4va2VybmVsX25hbWVzJztcbmltcG9ydCB7TmFtZWRBdHRyTWFwfSBmcm9tICcuLi9rZXJuZWxfcmVnaXN0cnknO1xuaW1wb3J0IHtUZW5zb3IsIFRlbnNvcjFELCBUZW5zb3I0RH0gZnJvbSAnLi4vdGVuc29yJztcbmltcG9ydCB7TmFtZWRUZW5zb3JNYXB9IGZyb20gJy4uL3RlbnNvcl90eXBlcyc7XG5pbXBvcnQge2NvbnZlcnRUb1RlbnNvcn0gZnJvbSAnLi4vdGVuc29yX3V0aWxfZW52JztcbmltcG9ydCB7UmFuaywgVGVuc29yTGlrZX0gZnJvbSAnLi4vdHlwZXMnO1xuaW1wb3J0ICogYXMgdXRpbCBmcm9tICcuLi91dGlsJztcblxuaW1wb3J0IHt4QXM0RH0gZnJvbSAnLi9iYXRjaG5vcm1fdXRpbCc7XG5pbXBvcnQge29wfSBmcm9tICcuL29wZXJhdGlvbic7XG5pbXBvcnQge3Jlc2hhcGV9IGZyb20gJy4vcmVzaGFwZSc7XG5cbi8qKlxuICogQmF0Y2ggbm9ybWFsaXphdGlvbi5cbiAqXG4gKiBBcyBkZXNjcmliZWQgaW5cbiAqIFtodHRwOi8vYXJ4aXYub3JnL2Ficy8xNTAyLjAzMTY3XShodHRwOi8vYXJ4aXYub3JnL2Ficy8xNTAyLjAzMTY3KS5cbiAqXG4gKiBNZWFuLCB2YXJpYW5jZSwgc2NhbGUsIGFuZCBvZmZzZXQgY2FuIGJlIG9mIHR3byBzaGFwZXM6XG4gKiAgIC0gVGhlIHNhbWUgc2hhcGUgYXMgdGhlIGlucHV0LlxuICogICAtIEluIHRoZSBjb21tb24gY2FzZSwgdGhlIGRlcHRoIGRpbWVuc2lvbiBpcyB0aGUgbGFzdCBkaW1lbnNpb24gb2YgeCwgc29cbiAqICAgICB0aGUgdmFsdWVzIHdvdWxkIGJlIGEgYHRmLlRlbnNvcjFEYCBvZiBzaGFwZSBbZGVwdGhdLlxuICpcbiAqIEFsc28gYXZhaWxhYmxlIGFyZSBzdHJpY3RlciByYW5rLXNwZWNpZmljIG1ldGhvZHMgd2l0aCB0aGUgc2FtZSBzaWduYXR1cmVcbiAqIGFzIHRoaXMgbWV0aG9kIHRoYXQgYXNzZXJ0IHRoYXQgcGFyYW1ldGVycyBwYXNzZWQgYXJlIG9mIGdpdmVuIHJhbmtcbiAqICAgLSBgdGYuYmF0Y2hOb3JtMmRgXG4gKiAgIC0gYHRmLmJhdGNoTm9ybTNkYFxuICogICAtIGB0Zi5iYXRjaE5vcm00ZGBcbiAqXG4gKiBAcGFyYW0geCBUaGUgaW5wdXQgVGVuc29yLlxuICogQHBhcmFtIG1lYW4gQSBtZWFuIFRlbnNvci5cbiAqIEBwYXJhbSB2YXJpYW5jZSBBIHZhcmlhbmNlIFRlbnNvci5cbiAqIEBwYXJhbSBvZmZzZXQgQW4gb2Zmc2V0IFRlbnNvci5cbiAqIEBwYXJhbSBzY2FsZSBBIHNjYWxlIFRlbnNvci5cbiAqIEBwYXJhbSB2YXJpYW5jZUVwc2lsb24gQSBzbWFsbCBmbG9hdCBudW1iZXIgdG8gYXZvaWQgZGl2aWRpbmcgYnkgMC5cbiAqXG4gKiBAZG9jIHtoZWFkaW5nOiAnT3BlcmF0aW9ucycsIHN1YmhlYWRpbmc6ICdOb3JtYWxpemF0aW9uJ31cbiAqL1xuZnVuY3Rpb24gYmF0Y2hOb3JtXzxSIGV4dGVuZHMgUmFuaz4oXG4gICAgeDogVGVuc29yPFI+fFRlbnNvckxpa2UsIG1lYW46IFRlbnNvcjxSPnxUZW5zb3IxRHxUZW5zb3JMaWtlLFxuICAgIHZhcmlhbmNlOiBUZW5zb3I8Uj58VGVuc29yMUR8VGVuc29yTGlrZSxcbiAgICBvZmZzZXQ/OiBUZW5zb3I8Uj58VGVuc29yMUR8VGVuc29yTGlrZSxcbiAgICBzY2FsZT86IFRlbnNvcjxSPnxUZW5zb3IxRHxUZW5zb3JMaWtlLFxuICAgIHZhcmlhbmNlRXBzaWxvbj86IG51bWJlcik6IFRlbnNvcjxSPiB7XG4gIGlmICh2YXJpYW5jZUVwc2lsb24gPT0gbnVsbCkge1xuICAgIHZhcmlhbmNlRXBzaWxvbiA9IDAuMDAxO1xuICB9XG4gIGNvbnN0ICR4ID0gY29udmVydFRvVGVuc29yKHgsICd4JywgJ2JhdGNoTm9ybScpO1xuICBjb25zdCAkbWVhbiA9IGNvbnZlcnRUb1RlbnNvcihtZWFuLCAnbWVhbicsICdiYXRjaE5vcm0nKTtcbiAgY29uc3QgJHZhcmlhbmNlID0gY29udmVydFRvVGVuc29yKHZhcmlhbmNlLCAndmFyaWFuY2UnLCAnYmF0Y2hOb3JtJyk7XG4gIGxldCAkc2NhbGU6IFRlbnNvcjxSPnxUZW5zb3IxRDtcbiAgaWYgKHNjYWxlICE9IG51bGwpIHtcbiAgICAkc2NhbGUgPSBjb252ZXJ0VG9UZW5zb3Ioc2NhbGUsICdzY2FsZScsICdiYXRjaE5vcm0nKTtcbiAgfVxuICBsZXQgJG9mZnNldDogVGVuc29yPFI+fFRlbnNvcjFEO1xuICBpZiAob2Zmc2V0ICE9IG51bGwpIHtcbiAgICAkb2Zmc2V0ID0gY29udmVydFRvVGVuc29yKG9mZnNldCwgJ29mZnNldCcsICdiYXRjaE5vcm0nKTtcbiAgfVxuXG4gIHV0aWwuYXNzZXJ0KFxuICAgICAgJG1lYW4ucmFuayA9PT0gJHZhcmlhbmNlLnJhbmssXG4gICAgICAoKSA9PiAnQmF0Y2ggbm9ybWFsaXphdGlvbiBncmFkaWVudCByZXF1aXJlcyBtZWFuIGFuZCB2YXJpYW5jZSB0byBoYXZlICcgK1xuICAgICAgICAgICdlcXVhbCByYW5rcy4nKTtcbiAgdXRpbC5hc3NlcnQoXG4gICAgICAkb2Zmc2V0ID09IG51bGwgfHwgJG1lYW4ucmFuayA9PT0gJG9mZnNldC5yYW5rLFxuICAgICAgKCkgPT4gJ0JhdGNoIG5vcm1hbGl6YXRpb24gZ3JhZGllbnQgcmVxdWlyZXMgbWVhbiBhbmQgb2Zmc2V0IHRvIGhhdmUgJyArXG4gICAgICAgICAgJ2VxdWFsIHJhbmtzLicpO1xuICB1dGlsLmFzc2VydChcbiAgICAgICRzY2FsZSA9PSBudWxsIHx8ICRtZWFuLnJhbmsgPT09ICRzY2FsZS5yYW5rLFxuICAgICAgKCkgPT4gJ0JhdGNoIG5vcm1hbGl6YXRpb24gZ3JhZGllbnQgcmVxdWlyZXMgbWVhbiBhbmQgc2NhbGUgdG8gaGF2ZSAnICtcbiAgICAgICAgICAnZXF1YWwgcmFua3MuJyk7XG5cbiAgY29uc3QgeDREOiBUZW5zb3I0RCA9IHhBczREKCR4KTtcblxuICBjb25zdCBpbnB1dHM6IEZ1c2VkQmF0Y2hOb3JtSW5wdXRzID0ge1xuICAgIHg6IHg0RCxcbiAgICBzY2FsZTogJHNjYWxlLFxuICAgIG9mZnNldDogJG9mZnNldCxcbiAgICBtZWFuOiAkbWVhbixcbiAgICB2YXJpYW5jZTogJHZhcmlhbmNlXG4gIH07XG5cbiAgY29uc3QgYXR0cnM6IEZ1c2VkQmF0Y2hOb3JtQXR0cnMgPSB7dmFyaWFuY2VFcHNpbG9ufTtcblxuICAvLyB0c2xpbnQ6ZGlzYWJsZS1uZXh0LWxpbmU6IG5vLXVubmVjZXNzYXJ5LXR5cGUtYXNzZXJ0aW9uXG4gIGNvbnN0IHJlcyA9IEVOR0lORS5ydW5LZXJuZWwoXG4gICAgICAgICAgICAgICAgICBGdXNlZEJhdGNoTm9ybSwgaW5wdXRzIGFzIHt9IGFzIE5hbWVkVGVuc29yTWFwLFxuICAgICAgICAgICAgICAgICAgYXR0cnMgYXMge30gYXMgTmFtZWRBdHRyTWFwKSBhcyBUZW5zb3I8Uj47XG5cbiAgcmV0dXJuIHJlc2hhcGUocmVzLCAkeC5zaGFwZSk7XG59XG5cbmV4cG9ydCBjb25zdCBiYXRjaE5vcm0gPSBvcCh7YmF0Y2hOb3JtX30pO1xuIl19","import { reshape } from './reshape';\nexport function xAs4D(x) {\n let x4D;\n if (x.rank === 0 || x.rank === 1) {\n x4D = reshape(x, [1, 1, 1, x.size]);\n }\n else if (x.rank === 2) {\n x4D = reshape(x, [1, 1, x.shape[0], x.shape[1]]);\n }\n else if (x.rank === 3) {\n x4D = reshape(x, [1, x.shape[0], x.shape[1], x.shape[2]]);\n }\n else {\n x4D = x;\n }\n return x4D;\n}\n//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYmF0Y2hub3JtX3V0aWwuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi8uLi90ZmpzLWNvcmUvc3JjL29wcy9iYXRjaG5vcm1fdXRpbC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFrQkEsT0FBTyxFQUFDLE9BQU8sRUFBQyxNQUFNLFdBQVcsQ0FBQztBQUVsQyxNQUFNLFVBQVUsS0FBSyxDQUFpQixDQUFZO0lBQ2hELElBQUksR0FBYSxDQUFDO0lBQ2xCLElBQUksQ0FBQyxDQUFDLElBQUksS0FBSyxDQUFDLElBQUksQ0FBQyxDQUFDLElBQUksS0FBSyxDQUFDLEVBQUU7UUFDaEMsR0FBRyxHQUFHLE9BQU8sQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQztLQUNyQztTQUFNLElBQUksQ0FBQyxDQUFDLElBQUksS0FBSyxDQUFDLEVBQUU7UUFDdkIsR0FBRyxHQUFHLE9BQU8sQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUM7S0FDbEQ7U0FBTSxJQUFJLENBQUMsQ0FBQyxJQUFJLEtBQUssQ0FBQyxFQUFFO1FBQ3ZCLEdBQUcsR0FBRyxPQUFPLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQztLQUMzRDtTQUFNO1FBQ0wsR0FBRyxHQUFHLENBQWEsQ0FBQztLQUNyQjtJQUVELE9BQU8sR0FBRyxDQUFDO0FBQ2IsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbIi8qKlxuICogQGxpY2Vuc2VcbiAqIENvcHlyaWdodCAyMDIwIEdvb2dsZSBMTEMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuXG4gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgXCJMaWNlbnNlXCIpO1xuICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLlxuICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0XG4gKlxuICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wXG4gKlxuICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZVxuICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gXCJBUyBJU1wiIEJBU0lTLFxuICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuXG4gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kXG4gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS5cbiAqID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4gKi9cbmltcG9ydCB7VGVuc29yLCBUZW5zb3I0RH0gZnJvbSAnLi4vdGVuc29yJztcbmltcG9ydCB7UmFua30gZnJvbSAnLi4vdHlwZXMnO1xuaW1wb3J0IHtyZXNoYXBlfSBmcm9tICcuL3Jlc2hhcGUnO1xuXG5leHBvcnQgZnVuY3Rpb24geEFzNEQ8UiBleHRlbmRzIFJhbms+KHg6IFRlbnNvcjxSPikge1xuICBsZXQgeDREOiBUZW5zb3I0RDtcbiAgaWYgKHgucmFuayA9PT0gMCB8fCB4LnJhbmsgPT09IDEpIHtcbiAgICB4NEQgPSByZXNoYXBlKHgsIFsxLCAxLCAxLCB4LnNpemVdKTtcbiAgfSBlbHNlIGlmICh4LnJhbmsgPT09IDIpIHtcbiAgICB4NEQgPSByZXNoYXBlKHgsIFsxLCAxLCB4LnNoYXBlWzBdLCB4LnNoYXBlWzFdXSk7XG4gIH0gZWxzZSBpZiAoeC5yYW5rID09PSAzKSB7XG4gICAgeDREID0gcmVzaGFwZSh4LCBbMSwgeC5zaGFwZVswXSwgeC5zaGFwZVsxXSwgeC5zaGFwZVsyXV0pO1xuICB9IGVsc2Uge1xuICAgIHg0RCA9IHggYXMgVGVuc29yNEQ7XG4gIH1cblxuICByZXR1cm4geDREO1xufVxuIl19","/**\n * @license\n * Copyright 2020 Google LLC. All Rights Reserved.\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n * =============================================================================\n */\nimport { ENGINE } from '../engine';\nimport { Tile } from '../kernel_names';\nimport { convertToTensor } from '../tensor_util_env';\nimport { clone } from './clone';\nimport { op } from './operation';\nimport { reshape } from './reshape';\n/**\n * Broadcast an array to a compatible shape NumPy-style.\n *\n * The tensor's shape is compared to the broadcast shape from end to beginning.\n * Ones are prepended to the tensor's shape until it has the same length as\n * the broadcast shape. If input.shape[i]==shape[i], the (i+1)-th axis is\n * already broadcast-compatible. If input.shape[i]==1 and shape[i]==N, then\n * the input tensor is tiled N times along that axis (using tf.tile).\n *\n * @param input The tensor that is to be broadcasted.\n * @param shape The input is to be broadcast to this shape.\n *\n * @doc {heading: 'Tensors', subheading: 'Transformations'}\n */\nfunction broadcastTo_(x, shape) {\n let input = convertToTensor(x, 'broadcastTo', 'x');\n const xShape = input.shape;\n if (shape.some(d => !(d > 0) || d % 1 !== 0)) {\n throw new Error(`broadcastTo(): Invalid broadcast shape [${shape}].`);\n }\n if (shape.length < input.rank) {\n throw new Error(`broadcastTo(): shape.length=${shape.length} < input.rank=${input.rank}.`);\n }\n if (shape.length > input.rank) {\n const newShape = input.shape.slice();\n while (newShape.length < shape.length) {\n newShape.unshift(1);\n }\n input = reshape(input, newShape);\n }\n const inputShape = input.shape;\n const reps = Array.from(shape);\n for (let i = shape.length - 1; i >= 0; i--) {\n if (inputShape[i] === shape[i]) {\n reps[i] = 1;\n }\n else if (input.shape[i] !== 1) {\n throw new Error(`broadcastTo(): [${xShape}] cannot be broadcast to [${shape}].`);\n }\n }\n const axes = reps.map((n, i) => n > 1 ? i : -1).filter(i => i >= 0);\n if (axes.length === 0) {\n return clone(input);\n }\n // TODO call broadcastTo kernel directly once backends implement broadcstTo\n const inputs = { x: input };\n const attrs = { reps };\n return ENGINE.runKernel(Tile, inputs, attrs);\n}\nexport const broadcastTo = op({ broadcastTo_ });\n//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYnJvYWRjYXN0X3RvLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vLi4vdGZqcy1jb3JlL3NyYy9vcHMvYnJvYWRjYXN0X3RvLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBOzs7Ozs7Ozs7Ozs7Ozs7R0FlRztBQUVILE9BQU8sRUFBQyxNQUFNLEVBQUMsTUFBTSxXQUFXLENBQUM7QUFDakMsT0FBTyxFQUFDLElBQUksRUFBd0IsTUFBTSxpQkFBaUIsQ0FBQztBQUk1RCxPQUFPLEVBQUMsZUFBZSxFQUFDLE1BQU0sb0JBQW9CLENBQUM7QUFHbkQsT0FBTyxFQUFDLEtBQUssRUFBQyxNQUFNLFNBQVMsQ0FBQztBQUM5QixPQUFPLEVBQUMsRUFBRSxFQUFDLE1BQU0sYUFBYSxDQUFDO0FBQy9CLE9BQU8sRUFBQyxPQUFPLEVBQUMsTUFBTSxXQUFXLENBQUM7QUFFbEM7Ozs7Ozs7Ozs7Ozs7R0FhRztBQUNILFNBQVMsWUFBWSxDQUNqQixDQUFvQixFQUFFLEtBQWtCO0lBQzFDLElBQUksS0FBSyxHQUFHLGVBQWUsQ0FBQyxDQUFDLEVBQUUsYUFBYSxFQUFFLEdBQUcsQ0FBQyxDQUFDO0lBQ25ELE1BQU0sTUFBTSxHQUFHLEtBQUssQ0FBQyxLQUFLLENBQUM7SUFFM0IsSUFBSSxLQUFLLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsSUFBSSxDQUFDLEdBQUcsQ0FBQyxLQUFLLENBQUMsQ0FBQyxFQUFFO1FBQzVDLE1BQU0sSUFBSSxLQUFLLENBQUMsMkNBQTJDLEtBQUssSUFBSSxDQUFDLENBQUM7S0FDdkU7SUFFRCxJQUFJLEtBQUssQ0FBQyxNQUFNLEdBQUcsS0FBSyxDQUFDLElBQUksRUFBRTtRQUM3QixNQUFNLElBQUksS0FBSyxDQUFDLCtCQUErQixLQUFLLENBQUMsTUFBTSxpQkFDdkQsS0FBSyxDQUFDLElBQUksR0FBRyxDQUFDLENBQUM7S0FDcEI7SUFFRCxJQUFJLEtBQUssQ0FBQyxNQUFNLEdBQUcsS0FBSyxDQUFDLElBQUksRUFBRTtRQUM3QixNQUFNLFFBQVEsR0FBRyxLQUFLLENBQUMsS0FBSyxDQUFDLEtBQUssRUFBRSxDQUFDO1FBQ3JDLE9BQU8sUUFBUSxDQUFDLE1BQU0sR0FBRyxLQUFLLENBQUMsTUFBTSxFQUFFO1lBQ3JDLFFBQVEsQ0FBQyxPQUFPLENBQUMsQ0FBQyxDQUFDLENBQUM7U0FDckI7UUFDRCxLQUFLLEdBQUcsT0FBTyxDQUFDLEtBQUssRUFBRSxRQUFRLENBQUMsQ0FBQztLQUNsQztJQUVELE1BQU0sVUFBVSxHQUFHLEtBQUssQ0FBQyxLQUFLLENBQUM7SUFDL0IsTUFBTSxJQUFJLEdBQWEsS0FBSyxDQUFDLElBQUksQ0FBQyxLQUFLLENBQUMsQ0FBQztJQUN6QyxLQUFLLElBQUksQ0FBQyxHQUFHLEtBQUssQ0FBQyxNQUFNLEdBQUcsQ0FBQyxFQUFFLENBQUMsSUFBSSxDQUFDLEVBQUUsQ0FBQyxFQUFFLEVBQUU7UUFDMUMsSUFBSSxVQUFVLENBQUMsQ0FBQyxDQUFDLEtBQUssS0FBSyxDQUFDLENBQUMsQ0FBQyxFQUFFO1lBQzlCLElBQUksQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUM7U0FDYjthQUFNLElBQUksS0FBSyxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUMsS0FBSyxDQUFDLEVBQUU7WUFDL0IsTUFBTSxJQUFJLEtBQUssQ0FDWCxtQkFBbUIsTUFBTSw2QkFBNkIsS0FBSyxJQUFJLENBQUMsQ0FBQztTQUN0RTtLQUNGO0lBQ0QsTUFBTSxJQUFJLEdBQUcsSUFBSSxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLEVBQUUsRUFBRSxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxNQUFNLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUM7SUFFcEUsSUFBSSxJQUFJLENBQUMsTUFBTSxLQUFLLENBQUMsRUFBRTtRQUNyQixPQUFPLEtBQUssQ0FBQyxLQUFLLENBQWMsQ0FBQztLQUNsQztJQUVELDJFQUEyRTtJQUMzRSxNQUFNLE1BQU0sR0FBZSxFQUFDLENBQUMsRUFBRSxLQUFLLEVBQUMsQ0FBQztJQUN0QyxNQUFNLEtBQUssR0FBYyxFQUFDLElBQUksRUFBQyxDQUFDO0lBQ2hDLE9BQU8sTUFBTSxDQUFDLFNBQVMsQ0FDbkIsSUFBSSxFQUFFLE1BQThCLEVBQUUsS0FBZ0MsQ0FBQyxDQUFDO0FBQzlFLENBQUM7QUFFRCxNQUFNLENBQUMsTUFBTSxXQUFXLEdBQUcsRUFBRSxDQUFDLEVBQUMsWUFBWSxFQUFDLENBQUMsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbIi8qKlxuICogQGxpY2Vuc2VcbiAqIENvcHlyaWdodCAyMDIwIEdvb2dsZSBMTEMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuXG4gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgXCJMaWNlbnNlXCIpO1xuICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLlxuICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0XG4gKlxuICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wXG4gKlxuICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZVxuICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gXCJBUyBJU1wiIEJBU0lTLFxuICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuXG4gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kXG4gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS5cbiAqID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4gKi9cblxuaW1wb3J0IHtFTkdJTkV9IGZyb20gJy4uL2VuZ2luZSc7XG5pbXBvcnQge1RpbGUsIFRpbGVBdHRycywgVGlsZUlucHV0c30gZnJvbSAnLi4va2VybmVsX25hbWVzJztcbmltcG9ydCB7TmFtZWRBdHRyTWFwfSBmcm9tICcuLi9rZXJuZWxfcmVnaXN0cnknO1xuaW1wb3J0IHtUZW5zb3J9IGZyb20gJy4uL3RlbnNvcic7XG5pbXBvcnQge05hbWVkVGVuc29yTWFwfSBmcm9tICcuLi90ZW5zb3JfdHlwZXMnO1xuaW1wb3J0IHtjb252ZXJ0VG9UZW5zb3J9IGZyb20gJy4uL3RlbnNvcl91dGlsX2Vudic7XG5pbXBvcnQge1JhbmssIFNoYXBlTWFwLCBUZW5zb3JMaWtlfSBmcm9tICcuLi90eXBlcyc7XG5cbmltcG9ydCB7Y2xvbmV9IGZyb20gJy4vY2xvbmUnO1xuaW1wb3J0IHtvcH0gZnJvbSAnLi9vcGVyYXRpb24nO1xuaW1wb3J0IHtyZXNoYXBlfSBmcm9tICcuL3Jlc2hhcGUnO1xuXG4vKipcbiAqIEJyb2FkY2FzdCBhbiBhcnJheSB0byBhIGNvbXBhdGlibGUgc2hhcGUgTnVtUHktc3R5bGUuXG4gKlxuICogVGhlIHRlbnNvcidzIHNoYXBlIGlzIGNvbXBhcmVkIHRvIHRoZSBicm9hZGNhc3Qgc2hhcGUgZnJvbSBlbmQgdG8gYmVnaW5uaW5nLlxuICogT25lcyBhcmUgcHJlcGVuZGVkIHRvIHRoZSB0ZW5zb3IncyBzaGFwZSB1bnRpbCBpdCBoYXMgdGhlIHNhbWUgbGVuZ3RoIGFzXG4gKiB0aGUgYnJvYWRjYXN0IHNoYXBlLiBJZiBpbnB1dC5zaGFwZVtpXT09c2hhcGVbaV0sIHRoZSAoaSsxKS10aCBheGlzIGlzXG4gKiBhbHJlYWR5IGJyb2FkY2FzdC1jb21wYXRpYmxlLiBJZiBpbnB1dC5zaGFwZVtpXT09MSBhbmQgc2hhcGVbaV09PU4sIHRoZW5cbiAqIHRoZSBpbnB1dCB0ZW5zb3IgaXMgdGlsZWQgTiB0aW1lcyBhbG9uZyB0aGF0IGF4aXMgKHVzaW5nIHRmLnRpbGUpLlxuICpcbiAqIEBwYXJhbSBpbnB1dCBUaGUgdGVuc29yIHRoYXQgaXMgdG8gYmUgYnJvYWRjYXN0ZWQuXG4gKiBAcGFyYW0gc2hhcGUgVGhlIGlucHV0IGlzIHRvIGJlIGJyb2FkY2FzdCB0byB0aGlzIHNoYXBlLlxuICpcbiAqIEBkb2Mge2hlYWRpbmc6ICdUZW5zb3JzJywgc3ViaGVhZGluZzogJ1RyYW5zZm9ybWF0aW9ucyd9XG4gKi9cbmZ1bmN0aW9uIGJyb2FkY2FzdFRvXzxSIGV4dGVuZHMgUmFuaz4oXG4gICAgeDogVGVuc29yfFRlbnNvckxpa2UsIHNoYXBlOiBTaGFwZU1hcFtSXSk6IFRlbnNvcjxSPiB7XG4gIGxldCBpbnB1dCA9IGNvbnZlcnRUb1RlbnNvcih4LCAnYnJvYWRjYXN0VG8nLCAneCcpO1xuICBjb25zdCB4U2hhcGUgPSBpbnB1dC5zaGFwZTtcblxuICBpZiAoc2hhcGUuc29tZShkID0+ICEoZCA+IDApIHx8IGQgJSAxICE9PSAwKSkge1xuICAgIHRocm93IG5ldyBFcnJvcihgYnJvYWRjYXN0VG8oKTogSW52YWxpZCBicm9hZGNhc3Qgc2hhcGUgWyR7c2hhcGV9XS5gKTtcbiAgfVxuXG4gIGlmIChzaGFwZS5sZW5ndGggPCBpbnB1dC5yYW5rKSB7XG4gICAgdGhyb3cgbmV3IEVycm9yKGBicm9hZGNhc3RUbygpOiBzaGFwZS5sZW5ndGg9JHtzaGFwZS5sZW5ndGh9IDwgaW5wdXQucmFuaz0ke1xuICAgICAgICBpbnB1dC5yYW5rfS5gKTtcbiAgfVxuXG4gIGlmIChzaGFwZS5sZW5ndGggPiBpbnB1dC5yYW5rKSB7XG4gICAgY29uc3QgbmV3U2hhcGUgPSBpbnB1dC5zaGFwZS5zbGljZSgpO1xuICAgIHdoaWxlIChuZXdTaGFwZS5sZW5ndGggPCBzaGFwZS5sZW5ndGgpIHtcbiAgICAgIG5ld1NoYXBlLnVuc2hpZnQoMSk7XG4gICAgfVxuICAgIGlucHV0ID0gcmVzaGFwZShpbnB1dCwgbmV3U2hhcGUpO1xuICB9XG5cbiAgY29uc3QgaW5wdXRTaGFwZSA9IGlucHV0LnNoYXBlO1xuICBjb25zdCByZXBzOiBudW1iZXJbXSA9IEFycmF5LmZyb20oc2hhcGUpO1xuICBmb3IgKGxldCBpID0gc2hhcGUubGVuZ3RoIC0gMTsgaSA+PSAwOyBpLS0pIHtcbiAgICBpZiAoaW5wdXRTaGFwZVtpXSA9PT0gc2hhcGVbaV0pIHtcbiAgICAgIHJlcHNbaV0gPSAxO1xuICAgIH0gZWxzZSBpZiAoaW5wdXQuc2hhcGVbaV0gIT09IDEpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcihcbiAgICAgICAgICBgYnJvYWRjYXN0VG8oKTogWyR7eFNoYXBlfV0gY2Fubm90IGJlIGJyb2FkY2FzdCB0byBbJHtzaGFwZX1dLmApO1xuICAgIH1cbiAgfVxuICBjb25zdCBheGVzID0gcmVwcy5tYXAoKG4sIGkpID0+IG4gPiAxID8gaSA6IC0xKS5maWx0ZXIoaSA9PiBpID49IDApO1xuXG4gIGlmIChheGVzLmxlbmd0aCA9PT0gMCkge1xuICAgIHJldHVybiBjbG9uZShpbnB1dCkgYXMgVGVuc29yPFI+O1xuICB9XG5cbiAgLy8gVE9ETyBjYWxsIGJyb2FkY2FzdFRvIGtlcm5lbCBkaXJlY3RseSBvbmNlIGJhY2tlbmRzIGltcGxlbWVudCBicm9hZGNzdFRvXG4gIGNvbnN0IGlucHV0czogVGlsZUlucHV0cyA9IHt4OiBpbnB1dH07XG4gIGNvbnN0IGF0dHJzOiBUaWxlQXR0cnMgPSB7cmVwc307XG4gIHJldHVybiBFTkdJTkUucnVuS2VybmVsKFxuICAgICAgVGlsZSwgaW5wdXRzIGFzIHt9IGFzIE5hbWVkVGVuc29yTWFwLCBhdHRycyBhcyB1bmtub3duIGFzIE5hbWVkQXR0ck1hcCk7XG59XG5cbmV4cG9ydCBjb25zdCBicm9hZGNhc3RUbyA9IG9wKHticm9hZGNhc3RUb199KTtcbiJdfQ==","/**\n * @license\n * Copyright 2017 Google LLC. All Rights Reserved.\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n * =============================================================================\n */\n/**\n * Returns the dimensions in the input shape that are broadcasted to\n * produce the provided output shape.\n *\n * The returned dimensions are 0-indexed and sorted. An example:\n * inShape = [4, 1, 3]\n * outShape = [5, 4, 3, 3]\n * result = [1]. Dimension 1 (2nd dimension of input) gets broadcasted 1 => 3.\n */\nexport function getBroadcastDims(inShape, outShape) {\n const inRank = inShape.length;\n const dims = [];\n for (let i = 0; i < inRank; i++) {\n const dim = inRank - 1 - i;\n const a = inShape[dim] || 1;\n const b = outShape[outShape.length - 1 - i] || 1;\n if (b > 1 && a === 1) {\n dims.unshift(dim);\n }\n }\n return dims;\n}\n/**\n * Returns the axes in the output space that should be reduced to produce\n * the input space.\n */\nexport function getReductionAxes(inShape, outShape) {\n const result = [];\n for (let i = 0; i < outShape.length; i++) {\n const inDim = inShape[inShape.length - i - 1];\n const outAxis = outShape.length - i - 1;\n const outDim = outShape[outAxis];\n if (inDim == null || (inDim === 1 && outDim > 1)) {\n result.unshift(outAxis);\n }\n }\n return result;\n}\nexport function assertAndGetBroadcastShape(shapeA, shapeB) {\n const result = [];\n const l = Math.max(shapeA.length, shapeB.length);\n for (let i = 0; i < l; i++) {\n let a = shapeA[shapeA.length - i - 1];\n if (a == null) {\n a = 1;\n }\n let b = shapeB[shapeB.length - i - 1];\n if (b == null) {\n b = 1;\n }\n if (a === 1) {\n result.unshift(b);\n }\n else if (b === 1) {\n result.unshift(a);\n }\n else if (a !== b) {\n const errMsg = `Operands could not be broadcast together with shapes ` +\n `${shapeA} and ${shapeB}.`;\n throw Error(errMsg);\n }\n else {\n result.unshift(a);\n }\n }\n return result;\n}\n//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYnJvYWRjYXN0X3V0aWwuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi8uLi90ZmpzLWNvcmUvc3JjL29wcy9icm9hZGNhc3RfdXRpbC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQTs7Ozs7Ozs7Ozs7Ozs7O0dBZUc7QUFFSDs7Ozs7Ozs7R0FRRztBQUNILE1BQU0sVUFBVSxnQkFBZ0IsQ0FDNUIsT0FBaUIsRUFBRSxRQUFrQjtJQUN2QyxNQUFNLE1BQU0sR0FBRyxPQUFPLENBQUMsTUFBTSxDQUFDO0lBQzlCLE1BQU0sSUFBSSxHQUFhLEVBQUUsQ0FBQztJQUMxQixLQUFLLElBQUksQ0FBQyxHQUFHLENBQUMsRUFBRSxDQUFDLEdBQUcsTUFBTSxFQUFFLENBQUMsRUFBRSxFQUFFO1FBQy9CLE1BQU0sR0FBRyxHQUFHLE1BQU0sR0FBRyxDQUFDLEdBQUcsQ0FBQyxDQUFDO1FBQzNCLE1BQU0sQ0FBQyxHQUFHLE9BQU8sQ0FBQyxHQUFHLENBQUMsSUFBSSxDQUFDLENBQUM7UUFDNUIsTUFBTSxDQUFDLEdBQUcsUUFBUSxDQUFDLFFBQVEsQ0FBQyxNQUFNLEdBQUcsQ0FBQyxHQUFHLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQztRQUNqRCxJQUFJLENBQUMsR0FBRyxDQUFDLElBQUksQ0FBQyxLQUFLLENBQUMsRUFBRTtZQUNwQixJQUFJLENBQUMsT0FBTyxDQUFDLEdBQUcsQ0FBQyxDQUFDO1NBQ25CO0tBQ0Y7SUFDRCxPQUFPLElBQUksQ0FBQztBQUNkLENBQUM7QUFFRDs7O0dBR0c7QUFDSCxNQUFNLFVBQVUsZ0JBQWdCLENBQzVCLE9BQWlCLEVBQUUsUUFBa0I7SUFDdkMsTUFBTSxNQUFNLEdBQWEsRUFBRSxDQUFDO0lBQzVCLEtBQUssSUFBSSxDQUFDLEdBQUcsQ0FBQyxFQUFFLENBQUMsR0FBRyxRQUFRLENBQUMsTUFBTSxFQUFFLENBQUMsRUFBRSxFQUFFO1FBQ3hDLE1BQU0sS0FBSyxHQUFHLE9BQU8sQ0FBQyxPQUFPLENBQUMsTUFBTSxHQUFHLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQztRQUM5QyxNQUFNLE9BQU8sR0FBRyxRQUFRLENBQUMsTUFBTSxHQUFHLENBQUMsR0FBRyxDQUFDLENBQUM7UUFDeEMsTUFBTSxNQUFNLEdBQUcsUUFBUSxDQUFDLE9BQU8sQ0FBQyxDQUFDO1FBQ2pDLElBQUksS0FBSyxJQUFJLElBQUksSUFBSSxDQUFDLEtBQUssS0FBSyxDQUFDLElBQUksTUFBTSxHQUFHLENBQUMsQ0FBQyxFQUFFO1lBQ2hELE1BQU0sQ0FBQyxPQUFPLENBQUMsT0FBTyxDQUFDLENBQUM7U0FDekI7S0FDRjtJQUNELE9BQU8sTUFBTSxDQUFDO0FBQ2hCLENBQUM7QUFFRCxNQUFNLFVBQVUsMEJBQTBCLENBQ3RDLE1BQWdCLEVBQUUsTUFBZ0I7SUFDcEMsTUFBTSxNQUFNLEdBQWEsRUFBRSxDQUFDO0lBQzVCLE1BQU0sQ0FBQyxHQUFHLElBQUksQ0FBQyxHQUFHLENBQUMsTUFBTSxDQUFDLE1BQU0sRUFBRSxNQUFNLENBQUMsTUFBTSxDQUFDLENBQUM7SUFFakQsS0FBSyxJQUFJLENBQUMsR0FBRyxDQUFDLEVBQUUsQ0FBQyxHQUFHLENBQUMsRUFBRSxDQUFDLEVBQUUsRUFBRTtRQUMxQixJQUFJLENBQUMsR0FBRyxNQUFNLENBQUMsTUFBTSxDQUFDLE1BQU0sR0FBRyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUM7UUFDdEMsSUFBSSxDQUFDLElBQUksSUFBSSxFQUFFO1lBQ2IsQ0FBQyxHQUFHLENBQUMsQ0FBQztTQUNQO1FBQ0QsSUFBSSxDQUFDLEdBQUcsTUFBTSxDQUFDLE1BQU0sQ0FBQyxNQUFNLEdBQUcsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDO1FBQ3RDLElBQUksQ0FBQyxJQUFJLElBQUksRUFBRTtZQUNiLENBQUMsR0FBRyxDQUFDLENBQUM7U0FDUDtRQUNELElBQUksQ0FBQyxLQUFLLENBQUMsRUFBRTtZQUNYLE1BQU0sQ0FBQyxPQUFPLENBQUMsQ0FBQyxDQUFDLENBQUM7U0FDbkI7YUFBTSxJQUFJLENBQUMsS0FBSyxDQUFDLEVBQUU7WUFDbEIsTUFBTSxDQUFDLE9BQU8sQ0FBQyxDQUFDLENBQUMsQ0FBQztTQUNuQjthQUFNLElBQUksQ0FBQyxLQUFLLENBQUMsRUFBRTtZQUNsQixNQUFNLE1BQU0sR0FBRyx1REFBdUQ7Z0JBQ2xFLEdBQUcsTUFBTSxRQUFRLE1BQU0sR0FBRyxDQUFDO1lBQy9CLE1BQU0sS0FBSyxDQUFDLE1BQU0sQ0FBQyxDQUFDO1NBQ3JCO2FBQU07WUFDTCxNQUFNLENBQUMsT0FBTyxDQUFDLENBQUMsQ0FBQyxDQUFDO1NBQ25CO0tBQ0Y7SUFDRCxPQUFPLE1BQU0sQ0FBQztBQUNoQixDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiLyoqXG4gKiBAbGljZW5zZVxuICogQ29weXJpZ2h0IDIwMTcgR29vZ2xlIExMQy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC5cbiAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSBcIkxpY2Vuc2VcIik7XG4gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuXG4gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXRcbiAqXG4gKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjBcbiAqXG4gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlXG4gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiBcIkFTIElTXCIgQkFTSVMsXG4gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC5cbiAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmRcbiAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLlxuICogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbiAqL1xuXG4vKipcbiAqIFJldHVybnMgdGhlIGRpbWVuc2lvbnMgaW4gdGhlIGlucHV0IHNoYXBlIHRoYXQgYXJlIGJyb2FkY2FzdGVkIHRvXG4gKiBwcm9kdWNlIHRoZSBwcm92aWRlZCBvdXRwdXQgc2hhcGUuXG4gKlxuICogVGhlIHJldHVybmVkIGRpbWVuc2lvbnMgYXJlIDAtaW5kZXhlZCBhbmQgc29ydGVkLiBBbiBleGFtcGxlOlxuICogaW5TaGFwZSA9IFs0LCAxLCAzXVxuICogb3V0U2hhcGUgPSBbNSwgNCwgMywgM11cbiAqIHJlc3VsdCA9IFsxXS4gRGltZW5zaW9uIDEgKDJuZCBkaW1lbnNpb24gb2YgaW5wdXQpIGdldHMgYnJvYWRjYXN0ZWQgMSA9PiAzLlxuICovXG5leHBvcnQgZnVuY3Rpb24gZ2V0QnJvYWRjYXN0RGltcyhcbiAgICBpblNoYXBlOiBudW1iZXJbXSwgb3V0U2hhcGU6IG51bWJlcltdKTogbnVtYmVyW10ge1xuICBjb25zdCBpblJhbmsgPSBpblNoYXBlLmxlbmd0aDtcbiAgY29uc3QgZGltczogbnVtYmVyW10gPSBbXTtcbiAgZm9yIChsZXQgaSA9IDA7IGkgPCBpblJhbms7IGkrKykge1xuICAgIGNvbnN0IGRpbSA9IGluUmFuayAtIDEgLSBpO1xuICAgIGNvbnN0IGEgPSBpblNoYXBlW2RpbV0gfHwgMTtcbiAgICBjb25zdCBiID0gb3V0U2hhcGVbb3V0U2hhcGUubGVuZ3RoIC0gMSAtIGldIHx8IDE7XG4gICAgaWYgKGIgPiAxICYmIGEgPT09IDEpIHtcbiAgICAgIGRpbXMudW5zaGlmdChkaW0pO1xuICAgIH1cbiAgfVxuICByZXR1cm4gZGltcztcbn1cblxuLyoqXG4gKiBSZXR1cm5zIHRoZSBheGVzIGluIHRoZSBvdXRwdXQgc3BhY2UgdGhhdCBzaG91bGQgYmUgcmVkdWNlZCB0byBwcm9kdWNlXG4gKiB0aGUgaW5wdXQgc3BhY2UuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBnZXRSZWR1Y3Rpb25BeGVzKFxuICAgIGluU2hhcGU6IG51bWJlcltdLCBvdXRTaGFwZTogbnVtYmVyW10pOiBudW1iZXJbXSB7XG4gIGNvbnN0IHJlc3VsdDogbnVtYmVyW10gPSBbXTtcbiAgZm9yIChsZXQgaSA9IDA7IGkgPCBvdXRTaGFwZS5sZW5ndGg7IGkrKykge1xuICAgIGNvbnN0IGluRGltID0gaW5TaGFwZVtpblNoYXBlLmxlbmd0aCAtIGkgLSAxXTtcbiAgICBjb25zdCBvdXRBeGlzID0gb3V0U2hhcGUubGVuZ3RoIC0gaSAtIDE7XG4gICAgY29uc3Qgb3V0RGltID0gb3V0U2hhcGVbb3V0QXhpc107XG4gICAgaWYgKGluRGltID09IG51bGwgfHwgKGluRGltID09PSAxICYmIG91dERpbSA+IDEpKSB7XG4gICAgICByZXN1bHQudW5zaGlmdChvdXRBeGlzKTtcbiAgICB9XG4gIH1cbiAgcmV0dXJuIHJlc3VsdDtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGFzc2VydEFuZEdldEJyb2FkY2FzdFNoYXBlKFxuICAgIHNoYXBlQTogbnVtYmVyW10sIHNoYXBlQjogbnVtYmVyW10pOiBudW1iZXJbXSB7XG4gIGNvbnN0IHJlc3VsdDogbnVtYmVyW10gPSBbXTtcbiAgY29uc3QgbCA9IE1hdGgubWF4KHNoYXBlQS5sZW5ndGgsIHNoYXBlQi5sZW5ndGgpO1xuXG4gIGZvciAobGV0IGkgPSAwOyBpIDwgbDsgaSsrKSB7XG4gICAgbGV0IGEgPSBzaGFwZUFbc2hhcGVBLmxlbmd0aCAtIGkgLSAxXTtcbiAgICBpZiAoYSA9PSBudWxsKSB7XG4gICAgICBhID0gMTtcbiAgICB9XG4gICAgbGV0IGIgPSBzaGFwZUJbc2hhcGVCLmxlbmd0aCAtIGkgLSAxXTtcbiAgICBpZiAoYiA9PSBudWxsKSB7XG4gICAgICBiID0gMTtcbiAgICB9XG4gICAgaWYgKGEgPT09IDEpIHtcbiAgICAgIHJlc3VsdC51bnNoaWZ0KGIpO1xuICAgIH0gZWxzZSBpZiAoYiA9PT0gMSkge1xuICAgICAgcmVzdWx0LnVuc2hpZnQoYSk7XG4gICAgfSBlbHNlIGlmIChhICE9PSBiKSB7XG4gICAgICBjb25zdCBlcnJNc2cgPSBgT3BlcmFuZHMgY291bGQgbm90IGJlIGJyb2FkY2FzdCB0b2dldGhlciB3aXRoIHNoYXBlcyBgICtcbiAgICAgICAgICBgJHtzaGFwZUF9IGFuZCAke3NoYXBlQn0uYDtcbiAgICAgIHRocm93IEVycm9yKGVyck1zZyk7XG4gICAgfSBlbHNlIHtcbiAgICAgIHJlc3VsdC51bnNoaWZ0KGEpO1xuICAgIH1cbiAgfVxuICByZXR1cm4gcmVzdWx0O1xufVxuIl19","/**\n * @license\n * Copyright 2020 Google Inc. All Rights Reserved.\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n * =============================================================================\n */\nimport { TensorBuffer } from '../tensor';\nimport * as util from '../util';\n/**\n * Creates an empty `tf.TensorBuffer` with the specified `shape` and `dtype`.\n *\n * The values are stored in CPU as `TypedArray`. Fill the buffer using\n * `buffer.set()`, or by modifying directly `buffer.values`.\n *\n * When done, call `buffer.toTensor()` to get an immutable `tf.Tensor` with\n * those values.\n *\n * ```js\n * // Create a buffer and set values at particular indices.\n * const buffer = tf.buffer([2, 2]);\n * buffer.set(3, 0, 0);\n * buffer.set(5, 1, 0);\n *\n * // Convert the buffer back to a tensor.\n * buffer.toTensor().print();\n * ```\n *\n * @param shape An array of integers defining the output tensor shape.\n * @param dtype The dtype of the buffer. Defaults to 'float32'.\n * @param values The values of the buffer as `TypedArray`. Defaults to\n * zeros.\n *\n * @doc {heading: 'Tensors', subheading: 'Creation'}\n */\nexport function buffer(shape, dtype = 'float32', values) {\n dtype = dtype || 'float32';\n util.assertNonNegativeIntegerDimensions(shape);\n return new TensorBuffer(shape, dtype, values);\n}\n//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYnVmZmVyLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vLi4vdGZqcy1jb3JlL3NyYy9vcHMvYnVmZmVyLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBOzs7Ozs7Ozs7Ozs7Ozs7R0FlRztBQUVILE9BQU8sRUFBQyxZQUFZLEVBQUMsTUFBTSxXQUFXLENBQUM7QUFFdkMsT0FBTyxLQUFLLElBQUksTUFBTSxTQUFTLENBQUM7QUFFaEM7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7R0F5Qkc7QUFDSCxNQUFNLFVBQVUsTUFBTSxDQUNsQixLQUFrQixFQUFFLFFBQVcsU0FBYyxFQUM3QyxNQUF1QjtJQUN6QixLQUFLLEdBQUcsS0FBSyxJQUFJLFNBQWMsQ0FBQztJQUNoQyxJQUFJLENBQUMsa0NBQWtDLENBQUMsS0FBSyxDQUFDLENBQUM7SUFDL0MsT0FBTyxJQUFJLFlBQVksQ0FBTyxLQUFLLEVBQUUsS0FBSyxFQUFFLE1BQU0sQ0FBQyxDQUFDO0FBQ3RELENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyIvKipcbiAqIEBsaWNlbnNlXG4gKiBDb3B5cmlnaHQgMjAyMCBHb29nbGUgSW5jLiBBbGwgUmlnaHRzIFJlc2VydmVkLlxuICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlIFwiTGljZW5zZVwiKTtcbiAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS5cbiAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdFxuICpcbiAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMFxuICpcbiAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmVcbiAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuIFwiQVMgSVNcIiBCQVNJUyxcbiAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLlxuICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZFxuICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuXG4gKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuICovXG5cbmltcG9ydCB7VGVuc29yQnVmZmVyfSBmcm9tICcuLi90ZW5zb3InO1xuaW1wb3J0IHtEYXRhVHlwZSwgRGF0YVR5cGVNYXAsIFJhbmssIFNoYXBlTWFwfSBmcm9tICcuLi90eXBlcyc7XG5pbXBvcnQgKiBhcyB1dGlsIGZyb20gJy4uL3V0aWwnO1xuXG4vKipcbiAqIENyZWF0ZXMgYW4gZW1wdHkgYHRmLlRlbnNvckJ1ZmZlcmAgd2l0aCB0aGUgc3BlY2lmaWVkIGBzaGFwZWAgYW5kIGBkdHlwZWAuXG4gKlxuICogVGhlIHZhbHVlcyBhcmUgc3RvcmVkIGluIENQVSBhcyBgVHlwZWRBcnJheWAuIEZpbGwgdGhlIGJ1ZmZlciB1c2luZ1xuICogYGJ1ZmZlci5zZXQoKWAsIG9yIGJ5IG1vZGlmeWluZyBkaXJlY3RseSBgYnVmZmVyLnZhbHVlc2AuXG4gKlxuICogV2hlbiBkb25lLCBjYWxsIGBidWZmZXIudG9UZW5zb3IoKWAgdG8gZ2V0IGFuIGltbXV0YWJsZSBgdGYuVGVuc29yYCB3aXRoXG4gKiB0aG9zZSB2YWx1ZXMuXG4gKlxuICogYGBganNcbiAqIC8vIENyZWF0ZSBhIGJ1ZmZlciBhbmQgc2V0IHZhbHVlcyBhdCBwYXJ0aWN1bGFyIGluZGljZXMuXG4gKiBjb25zdCBidWZmZXIgPSB0Zi5idWZmZXIoWzIsIDJdKTtcbiAqIGJ1ZmZlci5zZXQoMywgMCwgMCk7XG4gKiBidWZmZXIuc2V0KDUsIDEsIDApO1xuICpcbiAqIC8vIENvbnZlcnQgdGhlIGJ1ZmZlciBiYWNrIHRvIGEgdGVuc29yLlxuICogYnVmZmVyLnRvVGVuc29yKCkucHJpbnQoKTtcbiAqIGBgYFxuICpcbiAqIEBwYXJhbSBzaGFwZSBBbiBhcnJheSBvZiBpbnRlZ2VycyBkZWZpbmluZyB0aGUgb3V0cHV0IHRlbnNvciBzaGFwZS5cbiAqIEBwYXJhbSBkdHlwZSBUaGUgZHR5cGUgb2YgdGhlIGJ1ZmZlci4gRGVmYXVsdHMgdG8gJ2Zsb2F0MzInLlxuICogQHBhcmFtIHZhbHVlcyBUaGUgdmFsdWVzIG9mIHRoZSBidWZmZXIgYXMgYFR5cGVkQXJyYXlgLiBEZWZhdWx0cyB0b1xuICogemVyb3MuXG4gKlxuICogQGRvYyB7aGVhZGluZzogJ1RlbnNvcnMnLCBzdWJoZWFkaW5nOiAnQ3JlYXRpb24nfVxuICovXG5leHBvcnQgZnVuY3Rpb24gYnVmZmVyPFIgZXh0ZW5kcyBSYW5rLCBEIGV4dGVuZHMgRGF0YVR5cGUgPSAnZmxvYXQzMic+KFxuICAgIHNoYXBlOiBTaGFwZU1hcFtSXSwgZHR5cGU6IEQgPSAnZmxvYXQzMicgYXMgRCxcbiAgICB2YWx1ZXM/OiBEYXRhVHlwZU1hcFtEXSk6IFRlbnNvckJ1ZmZlcjxSLCBEPiB7XG4gIGR0eXBlID0gZHR5cGUgfHwgJ2Zsb2F0MzInIGFzIEQ7XG4gIHV0aWwuYXNzZXJ0Tm9uTmVnYXRpdmVJbnRlZ2VyRGltZW5zaW9ucyhzaGFwZSk7XG4gIHJldHVybiBuZXcgVGVuc29yQnVmZmVyPFIsIEQ+KHNoYXBlLCBkdHlwZSwgdmFsdWVzKTtcbn1cbiJdfQ==","/**\n * @license\n * Copyright 2020 Google Inc. All Rights Reserved.\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n * =============================================================================\n */\nimport { ENGINE } from '../engine';\nimport { Cast } from '../kernel_names';\nimport { convertToTensor } from '../tensor_util_env';\nimport * as util from '../util';\nimport { op } from './operation';\n/**\n * Casts a `tf.Tensor` to a new dtype.\n *\n * ```js\n * const x = tf.tensor1d([1.5, 2.5, 3]);\n * tf.cast(x, 'int32').print();\n * ```\n * @param x The input tensor to be casted.\n * @param dtype The dtype to cast the input tensor to.\n *\n * @doc {heading: 'Tensors', subheading: 'Transformations'}\n */\nfunction cast_(x, dtype) {\n const $x = convertToTensor(x, 'x', 'cast');\n // Sanity checks.\n if (!util.isValidDtype(dtype)) {\n throw new Error(`Failed to cast to unknown dtype ${dtype}`);\n }\n if (dtype === 'string' && $x.dtype !== 'string' ||\n dtype !== 'string' && $x.dtype === 'string') {\n throw new Error('Only strings can be casted to strings');\n }\n const inputs = { x: $x };\n const attrs = { dtype };\n return ENGINE.runKernel(Cast, inputs, attrs);\n}\nexport const cast = op({ cast_ });\n//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY2FzdC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uLy4uL3RmanMtY29yZS9zcmMvb3BzL2Nhc3QudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUE7Ozs7Ozs7Ozs7Ozs7OztHQWVHO0FBQ0gsT0FBTyxFQUFDLE1BQU0sRUFBQyxNQUFNLFdBQVcsQ0FBQztBQUNqQyxPQUFPLEVBQUMsSUFBSSxFQUF3QixNQUFNLGlCQUFpQixDQUFDO0FBSTVELE9BQU8sRUFBQyxlQUFlLEVBQUMsTUFBTSxvQkFBb0IsQ0FBQztBQUVuRCxPQUFPLEtBQUssSUFBSSxNQUFNLFNBQVMsQ0FBQztBQUVoQyxPQUFPLEVBQUMsRUFBRSxFQUFDLE1BQU0sYUFBYSxDQUFDO0FBRS9COzs7Ozs7Ozs7OztHQVdHO0FBQ0gsU0FBUyxLQUFLLENBQW1CLENBQWUsRUFBRSxLQUFlO0lBQy9ELE1BQU0sRUFBRSxHQUFHLGVBQWUsQ0FBQyxDQUFDLEVBQUUsR0FBRyxFQUFFLE1BQU0sQ0FBQyxDQUFDO0lBRTNDLGlCQUFpQjtJQUNqQixJQUFJLENBQUMsSUFBSSxDQUFDLFlBQVksQ0FBQyxLQUFLLENBQUMsRUFBRTtRQUM3QixNQUFNLElBQUksS0FBSyxDQUFDLG1DQUFtQyxLQUFLLEVBQUUsQ0FBQyxDQUFDO0tBQzdEO0lBQ0QsSUFBSSxLQUFLLEtBQUssUUFBUSxJQUFJLEVBQUUsQ0FBQyxLQUFLLEtBQUssUUFBUTtRQUMzQyxLQUFLLEtBQUssUUFBUSxJQUFJLEVBQUUsQ0FBQyxLQUFLLEtBQUssUUFBUSxFQUFFO1FBQy9DLE1BQU0sSUFBSSxLQUFLLENBQUMsdUNBQXVDLENBQUMsQ0FBQztLQUMxRDtJQUVELE1BQU0sTUFBTSxHQUFlLEVBQUMsQ0FBQyxFQUFFLEVBQUUsRUFBQyxDQUFDO0lBQ25DLE1BQU0sS0FBSyxHQUFjLEVBQUMsS0FBSyxFQUFDLENBQUM7SUFFakMsT0FBTyxNQUFNLENBQUMsU0FBUyxDQUNuQixJQUFJLEVBQUUsTUFBOEIsRUFBRSxLQUEyQixDQUFDLENBQUM7QUFDekUsQ0FBQztBQUVELE1BQU0sQ0FBQyxNQUFNLElBQUksR0FBRyxFQUFFLENBQUMsRUFBQyxLQUFLLEVBQUMsQ0FBQyxDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiLyoqXG4gKiBAbGljZW5zZVxuICogQ29weXJpZ2h0IDIwMjAgR29vZ2xlIEluYy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC5cbiAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSBcIkxpY2Vuc2VcIik7XG4gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuXG4gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXRcbiAqXG4gKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjBcbiAqXG4gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlXG4gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiBcIkFTIElTXCIgQkFTSVMsXG4gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC5cbiAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmRcbiAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLlxuICogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbiAqL1xuaW1wb3J0IHtFTkdJTkV9IGZyb20gJy4uL2VuZ2luZSc7XG5pbXBvcnQge0Nhc3QsIENhc3RBdHRycywgQ2FzdElucHV0c30gZnJvbSAnLi4va2VybmVsX25hbWVzJztcbmltcG9ydCB7TmFtZWRBdHRyTWFwfSBmcm9tICcuLi9rZXJuZWxfcmVnaXN0cnknO1xuaW1wb3J0IHtUZW5zb3J9IGZyb20gJy4uL3RlbnNvcic7XG5pbXBvcnQge05hbWVkVGVuc29yTWFwfSBmcm9tICcuLi90ZW5zb3JfdHlwZXMnO1xuaW1wb3J0IHtjb252ZXJ0VG9UZW5zb3J9IGZyb20gJy4uL3RlbnNvcl91dGlsX2Vudic7XG5pbXBvcnQge0RhdGFUeXBlLCBUZW5zb3JMaWtlfSBmcm9tICcuLi90eXBlcyc7XG5pbXBvcnQgKiBhcyB1dGlsIGZyb20gJy4uL3V0aWwnO1xuXG5pbXBvcnQge29wfSBmcm9tICcuL29wZXJhdGlvbic7XG5cbi8qKlxuICogQ2FzdHMgYSBgdGYuVGVuc29yYCB0byBhIG5ldyBkdHlwZS5cbiAqXG4gKiBgYGBqc1xuICogY29uc3QgeCA9IHRmLnRlbnNvcjFkKFsxLjUsIDIuNSwgM10pO1xuICogdGYuY2FzdCh4LCAnaW50MzInKS5wcmludCgpO1xuICogYGBgXG4gKiBAcGFyYW0geCBUaGUgaW5wdXQgdGVuc29yIHRvIGJlIGNhc3RlZC5cbiAqIEBwYXJhbSBkdHlwZSBUaGUgZHR5cGUgdG8gY2FzdCB0aGUgaW5wdXQgdGVuc29yIHRvLlxuICpcbiAqIEBkb2Mge2hlYWRpbmc6ICdUZW5zb3JzJywgc3ViaGVhZGluZzogJ1RyYW5zZm9ybWF0aW9ucyd9XG4gKi9cbmZ1bmN0aW9uIGNhc3RfPFQgZXh0ZW5kcyBUZW5zb3I+KHg6IFR8VGVuc29yTGlrZSwgZHR5cGU6IERhdGFUeXBlKTogVCB7XG4gIGNvbnN0ICR4ID0gY29udmVydFRvVGVuc29yKHgsICd4JywgJ2Nhc3QnKTtcblxuICAvLyBTYW5pdHkgY2hlY2tzLlxuICBpZiAoIXV0aWwuaXNWYWxpZER0eXBlKGR0eXBlKSkge1xuICAgIHRocm93IG5ldyBFcnJvcihgRmFpbGVkIHRvIGNhc3QgdG8gdW5rbm93biBkdHlwZSAke2R0eXBlfWApO1xuICB9XG4gIGlmIChkdHlwZSA9PT0gJ3N0cmluZycgJiYgJHguZHR5cGUgIT09ICdzdHJpbmcnIHx8XG4gICAgICBkdHlwZSAhPT0gJ3N0cmluZycgJiYgJHguZHR5cGUgPT09ICdzdHJpbmcnKSB7XG4gICAgdGhyb3cgbmV3IEVycm9yKCdPbmx5IHN0cmluZ3MgY2FuIGJlIGNhc3RlZCB0byBzdHJpbmdzJyk7XG4gIH1cblxuICBjb25zdCBpbnB1dHM6IENhc3RJbnB1dHMgPSB7eDogJHh9O1xuICBjb25zdCBhdHRyczogQ2FzdEF0dHJzID0ge2R0eXBlfTtcblxuICByZXR1cm4gRU5HSU5FLnJ1bktlcm5lbChcbiAgICAgIENhc3QsIGlucHV0cyBhcyB7fSBhcyBOYW1lZFRlbnNvck1hcCwgYXR0cnMgYXMge30gYXMgTmFtZWRBdHRyTWFwKTtcbn1cblxuZXhwb3J0IGNvbnN0IGNhc3QgPSBvcCh7Y2FzdF99KTtcbiJdfQ==","/**\n * @license\n * Copyright 2018 Google LLC. All Rights Reserved.\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n * =============================================================================\n */\nimport { ENGINE } from '../engine';\nimport { Ceil } from '../kernel_names';\nimport { convertToTensor } from '../tensor_util_env';\nimport { op } from './operation';\n/**\n * Computes ceiling of input `tf.Tensor` element-wise: `ceil(x)`\n *\n * ```js\n * const x = tf.tensor1d([.6, 1.1, -3.3]);\n *\n * x.ceil().print(); // or tf.ceil(x)\n * ```\n * @param x The input Tensor.\n *\n * @doc {heading: 'Operations', subheading: 'Basic math'}\n */\nfunction ceil_(x) {\n const $x = convertToTensor(x, 'x', 'ceil', 'float32');\n const inputs = { x: $x };\n return ENGINE.runKernel(Ceil, inputs);\n}\nexport const ceil = op({ ceil_ });\n//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY2VpbC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uLy4uL3RmanMtY29yZS9zcmMvb3BzL2NlaWwudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUE7Ozs7Ozs7Ozs7Ozs7OztHQWVHO0FBRUgsT0FBTyxFQUFDLE1BQU0sRUFBQyxNQUFNLFdBQVcsQ0FBQztBQUNqQyxPQUFPLEVBQUMsSUFBSSxFQUFhLE1BQU0saUJBQWlCLENBQUM7QUFHakQsT0FBTyxFQUFDLGVBQWUsRUFBQyxNQUFNLG9CQUFvQixDQUFDO0FBR25ELE9BQU8sRUFBQyxFQUFFLEVBQUMsTUFBTSxhQUFhLENBQUM7QUFFL0I7Ozs7Ozs7Ozs7O0dBV0c7QUFDSCxTQUFTLEtBQUssQ0FBbUIsQ0FBZTtJQUM5QyxNQUFNLEVBQUUsR0FBRyxlQUFlLENBQUMsQ0FBQyxFQUFFLEdBQUcsRUFBRSxNQUFNLEVBQUUsU0FBUyxDQUFDLENBQUM7SUFFdEQsTUFBTSxNQUFNLEdBQWUsRUFBQyxDQUFDLEVBQUUsRUFBRSxFQUFDLENBQUM7SUFDbkMsT0FBTyxNQUFNLENBQUMsU0FBUyxDQUFDLElBQUksRUFBRSxNQUE4QixDQUFDLENBQUM7QUFDaEUsQ0FBQztBQUNELE1BQU0sQ0FBQyxNQUFNLElBQUksR0FBRyxFQUFFLENBQUMsRUFBQyxLQUFLLEVBQUMsQ0FBQyxDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiLyoqXG4gKiBAbGljZW5zZVxuICogQ29weXJpZ2h0IDIwMTggR29vZ2xlIExMQy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC5cbiAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSBcIkxpY2Vuc2VcIik7XG4gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuXG4gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXRcbiAqXG4gKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjBcbiAqXG4gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlXG4gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiBcIkFTIElTXCIgQkFTSVMsXG4gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC5cbiAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmRcbiAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLlxuICogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbiAqL1xuXG5pbXBvcnQge0VOR0lORX0gZnJvbSAnLi4vZW5naW5lJztcbmltcG9ydCB7Q2VpbCwgQ2VpbElucHV0c30gZnJvbSAnLi4va2VybmVsX25hbWVzJztcbmltcG9ydCB7VGVuc29yfSBmcm9tICcuLi90ZW5zb3InO1xuaW1wb3J0IHtOYW1lZFRlbnNvck1hcH0gZnJvbSAnLi4vdGVuc29yX3R5cGVzJztcbmltcG9ydCB7Y29udmVydFRvVGVuc29yfSBmcm9tICcuLi90ZW5zb3JfdXRpbF9lbnYnO1xuaW1wb3J0IHtUZW5zb3JMaWtlfSBmcm9tICcuLi90eXBlcyc7XG5cbmltcG9ydCB7b3B9IGZyb20gJy4vb3BlcmF0aW9uJztcblxuLyoqXG4gKiBDb21wdXRlcyBjZWlsaW5nIG9mIGlucHV0IGB0Zi5UZW5zb3JgIGVsZW1lbnQtd2lzZTogYGNlaWwoeClgXG4gKlxuICogYGBganNcbiAqIGNvbnN0IHggPSB0Zi50ZW5zb3IxZChbLjYsIDEuMSwgLTMuM10pO1xuICpcbiAqIHguY2VpbCgpLnByaW50KCk7ICAvLyBvciB0Zi5jZWlsKHgpXG4gKiBgYGBcbiAqIEBwYXJhbSB4IFRoZSBpbnB1dCBUZW5zb3IuXG4gKlxuICogQGRvYyB7aGVhZGluZzogJ09wZXJhdGlvbnMnLCBzdWJoZWFkaW5nOiAnQmFzaWMgbWF0aCd9XG4gKi9cbmZ1bmN0aW9uIGNlaWxfPFQgZXh0ZW5kcyBUZW5zb3I+KHg6IFR8VGVuc29yTGlrZSk6IFQge1xuICBjb25zdCAkeCA9IGNvbnZlcnRUb1RlbnNvcih4LCAneCcsICdjZWlsJywgJ2Zsb2F0MzInKTtcblxuICBjb25zdCBpbnB1dHM6IENlaWxJbnB1dHMgPSB7eDogJHh9O1xuICByZXR1cm4gRU5HSU5FLnJ1bktlcm5lbChDZWlsLCBpbnB1dHMgYXMge30gYXMgTmFtZWRUZW5zb3JNYXApO1xufVxuZXhwb3J0IGNvbnN0IGNlaWwgPSBvcCh7Y2VpbF99KTtcbiJdfQ==","/**\n * @license\n * Copyright 2018 Google LLC. All Rights Reserved.\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n * =============================================================================\n */\nimport { ENGINE } from '../engine';\nimport { ClipByValue } from '../kernel_names';\nimport { convertToTensor } from '../tensor_util_env';\nimport * as util from '../util';\nimport { fill } from './fill';\nimport { op } from './operation';\n/**\n * Clips values element-wise. `max(min(x, clipValueMax), clipValueMin)`\n *\n * ```js\n * const x = tf.tensor1d([-1, 2, -3, 4]);\n *\n * x.clipByValue(-2, 3).print(); // or tf.clipByValue(x, -2, 3)\n * ```\n * @param x The input tensor.\n * @param clipValueMin Lower bound of range to be clipped to.\n * @param clipValueMax Upper bound of range to be clipped to.\n *\n * @doc {heading: 'Operations', subheading: 'Basic math'}\n */\nfunction clipByValue_(x, clipValueMin, clipValueMax) {\n const $x = convertToTensor(x, 'x', 'clipByValue');\n util.assert((clipValueMin <= clipValueMax), () => `Error in clip: min (${clipValueMin}) must be ` +\n `less than or equal to max (${clipValueMax}).`);\n if (clipValueMin === clipValueMax) {\n return fill($x.shape, clipValueMin, $x.dtype);\n }\n const inputs = { x: $x };\n const attrs = { clipValueMin, clipValueMax };\n return ENGINE.runKernel(ClipByValue, inputs, attrs);\n}\nexport const clipByValue = op({ clipByValue_ });\n//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY2xpcF9ieV92YWx1ZS5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uLy4uL3RmanMtY29yZS9zcmMvb3BzL2NsaXBfYnlfdmFsdWUudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUE7Ozs7Ozs7Ozs7Ozs7OztHQWVHO0FBQ0gsT0FBTyxFQUFDLE1BQU0sRUFBQyxNQUFNLFdBQVcsQ0FBQztBQUNqQyxPQUFPLEVBQUMsV0FBVyxFQUFzQyxNQUFNLGlCQUFpQixDQUFDO0FBSWpGLE9BQU8sRUFBQyxlQUFlLEVBQUMsTUFBTSxvQkFBb0IsQ0FBQztBQUVuRCxPQUFPLEtBQUssSUFBSSxNQUFNLFNBQVMsQ0FBQztBQUNoQyxPQUFPLEVBQUMsSUFBSSxFQUFDLE1BQU0sUUFBUSxDQUFDO0FBRTVCLE9BQU8sRUFBQyxFQUFFLEVBQUMsTUFBTSxhQUFhLENBQUM7QUFFL0I7Ozs7Ozs7Ozs7Ozs7R0FhRztBQUNILFNBQVMsWUFBWSxDQUNqQixDQUFlLEVBQUUsWUFBb0IsRUFBRSxZQUFvQjtJQUM3RCxNQUFNLEVBQUUsR0FBRyxlQUFlLENBQUMsQ0FBQyxFQUFFLEdBQUcsRUFBRSxhQUFhLENBQUMsQ0FBQztJQUNsRCxJQUFJLENBQUMsTUFBTSxDQUNQLENBQUMsWUFBWSxJQUFJLFlBQVksQ0FBQyxFQUM5QixHQUFHLEVBQUUsQ0FBQyx1QkFBdUIsWUFBWSxZQUFZO1FBQ2pELDhCQUE4QixZQUFZLElBQUksQ0FBQyxDQUFDO0lBRXhELElBQUksWUFBWSxLQUFLLFlBQVksRUFBRTtRQUNqQyxPQUFPLElBQUksQ0FBQyxFQUFFLENBQUMsS0FBSyxFQUFFLFlBQVksRUFBRSxFQUFFLENBQUMsS0FBSyxDQUFNLENBQUM7S0FDcEQ7SUFFRCxNQUFNLE1BQU0sR0FBc0IsRUFBQyxDQUFDLEVBQUUsRUFBRSxFQUFDLENBQUM7SUFDMUMsTUFBTSxLQUFLLEdBQXFCLEVBQUMsWUFBWSxFQUFFLFlBQVksRUFBQyxDQUFDO0lBRTdELE9BQU8sTUFBTSxDQUFDLFNBQVMsQ0FDbkIsV0FBVyxFQUFFLE1BQThCLEVBQUUsS0FBMkIsQ0FBQyxDQUFDO0FBQ2hGLENBQUM7QUFFRCxNQUFNLENBQUMsTUFBTSxXQUFXLEdBQUcsRUFBRSxDQUFDLEVBQUMsWUFBWSxFQUFDLENBQUMsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbIi8qKlxuICogQGxpY2Vuc2VcbiAqIENvcHlyaWdodCAyMDE4IEdvb2dsZSBMTEMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuXG4gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgXCJMaWNlbnNlXCIpO1xuICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLlxuICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0XG4gKlxuICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wXG4gKlxuICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZVxuICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gXCJBUyBJU1wiIEJBU0lTLFxuICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuXG4gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kXG4gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS5cbiAqID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4gKi9cbmltcG9ydCB7RU5HSU5FfSBmcm9tICcuLi9lbmdpbmUnO1xuaW1wb3J0IHtDbGlwQnlWYWx1ZSwgQ2xpcEJ5VmFsdWVBdHRycywgQ2xpcEJ5VmFsdWVJbnB1dHN9IGZyb20gJy4uL2tlcm5lbF9uYW1lcyc7XG5pbXBvcnQge05hbWVkQXR0ck1hcH0gZnJvbSAnLi4va2VybmVsX3JlZ2lzdHJ5JztcbmltcG9ydCB7VGVuc29yfSBmcm9tICcuLi90ZW5zb3InO1xuaW1wb3J0IHtOYW1lZFRlbnNvck1hcH0gZnJvbSAnLi4vdGVuc29yX3R5cGVzJztcbmltcG9ydCB7Y29udmVydFRvVGVuc29yfSBmcm9tICcuLi90ZW5zb3JfdXRpbF9lbnYnO1xuaW1wb3J0IHtUZW5zb3JMaWtlfSBmcm9tICcuLi90eXBlcyc7XG5pbXBvcnQgKiBhcyB1dGlsIGZyb20gJy4uL3V0aWwnO1xuaW1wb3J0IHtmaWxsfSBmcm9tICcuL2ZpbGwnO1xuXG5pbXBvcnQge29wfSBmcm9tICcuL29wZXJhdGlvbic7XG5cbi8qKlxuICogQ2xpcHMgdmFsdWVzIGVsZW1lbnQtd2lzZS4gYG1heChtaW4oeCwgY2xpcFZhbHVlTWF4KSwgY2xpcFZhbHVlTWluKWBcbiAqXG4gKiBgYGBqc1xuICogY29uc3QgeCA9IHRmLnRlbnNvcjFkKFstMSwgMiwgLTMsIDRdKTtcbiAqXG4gKiB4LmNsaXBCeVZhbHVlKC0yLCAzKS5wcmludCgpOyAgLy8gb3IgdGYuY2xpcEJ5VmFsdWUoeCwgLTIsIDMpXG4gKiBgYGBcbiAqIEBwYXJhbSB4IFRoZSBpbnB1dCB0ZW5zb3IuXG4gKiBAcGFyYW0gY2xpcFZhbHVlTWluIExvd2VyIGJvdW5kIG9mIHJhbmdlIHRvIGJlIGNsaXBwZWQgdG8uXG4gKiBAcGFyYW0gY2xpcFZhbHVlTWF4IFVwcGVyIGJvdW5kIG9mIHJhbmdlIHRvIGJlIGNsaXBwZWQgdG8uXG4gKlxuICogQGRvYyB7aGVhZGluZzogJ09wZXJhdGlvbnMnLCBzdWJoZWFkaW5nOiAnQmFzaWMgbWF0aCd9XG4gKi9cbmZ1bmN0aW9uIGNsaXBCeVZhbHVlXzxUIGV4dGVuZHMgVGVuc29yPihcbiAgICB4OiBUfFRlbnNvckxpa2UsIGNsaXBWYWx1ZU1pbjogbnVtYmVyLCBjbGlwVmFsdWVNYXg6IG51bWJlcik6IFQge1xuICBjb25zdCAkeCA9IGNvbnZlcnRUb1RlbnNvcih4LCAneCcsICdjbGlwQnlWYWx1ZScpO1xuICB1dGlsLmFzc2VydChcbiAgICAgIChjbGlwVmFsdWVNaW4gPD0gY2xpcFZhbHVlTWF4KSxcbiAgICAgICgpID0+IGBFcnJvciBpbiBjbGlwOiBtaW4gKCR7Y2xpcFZhbHVlTWlufSkgbXVzdCBiZSBgICtcbiAgICAgICAgICBgbGVzcyB0aGFuIG9yIGVxdWFsIHRvIG1heCAoJHtjbGlwVmFsdWVNYXh9KS5gKTtcblxuICBpZiAoY2xpcFZhbHVlTWluID09PSBjbGlwVmFsdWVNYXgpIHtcbiAgICByZXR1cm4gZmlsbCgkeC5zaGFwZSwgY2xpcFZhbHVlTWluLCAkeC5kdHlwZSkgYXMgVDtcbiAgfVxuXG4gIGNvbnN0IGlucHV0czogQ2xpcEJ5VmFsdWVJbnB1dHMgPSB7eDogJHh9O1xuICBjb25zdCBhdHRyczogQ2xpcEJ5VmFsdWVBdHRycyA9IHtjbGlwVmFsdWVNaW4sIGNsaXBWYWx1ZU1heH07XG5cbiAgcmV0dXJuIEVOR0lORS5ydW5LZXJuZWwoXG4gICAgICBDbGlwQnlWYWx1ZSwgaW5wdXRzIGFzIHt9IGFzIE5hbWVkVGVuc29yTWFwLCBhdHRycyBhcyB7fSBhcyBOYW1lZEF0dHJNYXApO1xufVxuXG5leHBvcnQgY29uc3QgY2xpcEJ5VmFsdWUgPSBvcCh7Y2xpcEJ5VmFsdWVffSk7XG4iXX0=","/**\n * @license\n * Copyright 2020 Google LLC. All Rights Reserved.\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n * =============================================================================\n */\nimport { ENGINE } from '../engine';\nimport { Identity } from '../kernel_names';\nimport { convertToTensor } from '../tensor_util_env';\nimport { op } from './operation';\n/**\n * Creates a new tensor with the same values and shape as the specified\n * tensor.\n *\n * ```js\n * const x = tf.tensor([1, 2]);\n *\n * x.clone().print();\n * ```\n *\n * @param x The tensor to clone.\n *\n * @doc {heading: 'Tensors', subheading: 'Creation'}\n */\nfunction clone_(x) {\n const $x = convertToTensor(x, 'x', 'clone', 'string_or_numeric');\n const inputs = { x: $x };\n // Note this op is called tf.identity in python. Hence the kernel name used\n // here.\n return ENGINE.runKernel(Identity, inputs);\n}\nexport const clone = op({ clone_ });\n//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY2xvbmUuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi8uLi90ZmpzLWNvcmUvc3JjL29wcy9jbG9uZS50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQTs7Ozs7Ozs7Ozs7Ozs7O0dBZUc7QUFFSCxPQUFPLEVBQUMsTUFBTSxFQUFDLE1BQU0sV0FBVyxDQUFDO0FBQ2pDLE9BQU8sRUFBQyxRQUFRLEVBQWlCLE1BQU0saUJBQWlCLENBQUM7QUFHekQsT0FBTyxFQUFDLGVBQWUsRUFBQyxNQUFNLG9CQUFvQixDQUFDO0FBR25ELE9BQU8sRUFBQyxFQUFFLEVBQUMsTUFBTSxhQUFhLENBQUM7QUFFL0I7Ozs7Ozs7Ozs7Ozs7R0FhRztBQUNILFNBQVMsTUFBTSxDQUFtQixDQUFlO0lBQy9DLE1BQU0sRUFBRSxHQUFHLGVBQWUsQ0FBQyxDQUFDLEVBQUUsR0FBRyxFQUFFLE9BQU8sRUFBRSxtQkFBbUIsQ0FBQyxDQUFDO0lBQ2pFLE1BQU0sTUFBTSxHQUFtQixFQUFDLENBQUMsRUFBRSxFQUFFLEVBQUMsQ0FBQztJQUV2QywyRUFBMkU7SUFDM0UsUUFBUTtJQUNSLE9BQU8sTUFBTSxDQUFDLFNBQVMsQ0FBQyxRQUFRLEVBQUUsTUFBOEIsQ0FBQyxDQUFDO0FBQ3BFLENBQUM7QUFFRCxNQUFNLENBQUMsTUFBTSxLQUFLLEdBQUcsRUFBRSxDQUFDLEVBQUMsTUFBTSxFQUFDLENBQUMsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbIi8qKlxuICogQGxpY2Vuc2VcbiAqIENvcHlyaWdodCAyMDIwIEdvb2dsZSBMTEMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuXG4gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgXCJMaWNlbnNlXCIpO1xuICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLlxuICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0XG4gKlxuICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wXG4gKlxuICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZVxuICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gXCJBUyBJU1wiIEJBU0lTLFxuICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuXG4gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kXG4gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS5cbiAqID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4gKi9cblxuaW1wb3J0IHtFTkdJTkV9IGZyb20gJy4uL2VuZ2luZSc7XG5pbXBvcnQge0lkZW50aXR5LCBJZGVudGl0eUlucHV0c30gZnJvbSAnLi4va2VybmVsX25hbWVzJztcbmltcG9ydCB7VGVuc29yfSBmcm9tICcuLi90ZW5zb3InO1xuaW1wb3J0IHtOYW1lZFRlbnNvck1hcH0gZnJvbSAnLi4vdGVuc29yX3R5cGVzJztcbmltcG9ydCB7Y29udmVydFRvVGVuc29yfSBmcm9tICcuLi90ZW5zb3JfdXRpbF9lbnYnO1xuaW1wb3J0IHtUZW5zb3JMaWtlfSBmcm9tICcuLi90eXBlcyc7XG5cbmltcG9ydCB7b3B9IGZyb20gJy4vb3BlcmF0aW9uJztcblxuLyoqXG4gKiBDcmVhdGVzIGEgbmV3IHRlbnNvciB3aXRoIHRoZSBzYW1lIHZhbHVlcyBhbmQgc2hhcGUgYXMgdGhlIHNwZWNpZmllZFxuICogdGVuc29yLlxuICpcbiAqIGBgYGpzXG4gKiBjb25zdCB4ID0gdGYudGVuc29yKFsxLCAyXSk7XG4gKlxuICogeC5jbG9uZSgpLnByaW50KCk7XG4gKiBgYGBcbiAqXG4gKiBAcGFyYW0geCBUaGUgdGVuc29yIHRvIGNsb25lLlxuICpcbiAqIEBkb2Mge2hlYWRpbmc6ICdUZW5zb3JzJywgc3ViaGVhZGluZzogJ0NyZWF0aW9uJ31cbiAqL1xuZnVuY3Rpb24gY2xvbmVfPFQgZXh0ZW5kcyBUZW5zb3I+KHg6IFR8VGVuc29yTGlrZSk6IFQge1xuICBjb25zdCAkeCA9IGNvbnZlcnRUb1RlbnNvcih4LCAneCcsICdjbG9uZScsICdzdHJpbmdfb3JfbnVtZXJpYycpO1xuICBjb25zdCBpbnB1dHM6IElkZW50aXR5SW5wdXRzID0ge3g6ICR4fTtcblxuICAvLyBOb3RlIHRoaXMgb3AgaXMgY2FsbGVkIHRmLmlkZW50aXR5IGluIHB5dGhvbi4gSGVuY2UgdGhlIGtlcm5lbCBuYW1lIHVzZWRcbiAgLy8gaGVyZS5cbiAgcmV0dXJuIEVOR0lORS5ydW5LZXJuZWwoSWRlbnRpdHksIGlucHV0cyBhcyB7fSBhcyBOYW1lZFRlbnNvck1hcCk7XG59XG5cbmV4cG9ydCBjb25zdCBjbG9uZSA9IG9wKHtjbG9uZV99KTtcbiJdfQ==","/**\n * @license\n * Copyright 2020 Google LLC. All Rights Reserved.\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n * =============================================================================\n */\nimport { ENGINE } from '../engine';\nimport { Complex } from '../kernel_names';\nimport { convertToTensor } from '../tensor_util_env';\nimport * as util from '../util';\nimport { op } from './operation';\n/**\n * Converts two real numbers to a complex number.\n *\n * Given a tensor `real` representing the real part of a complex number, and a\n * tensor `imag` representing the imaginary part of a complex number, this\n * operation returns complex numbers elementwise of the form [r0, i0, r1, i1],\n * where r represents the real part and i represents the imag part.\n *\n * The input tensors real and imag must have the same shape.\n *\n * ```js\n * const real = tf.tensor1d([2.25, 3.25]);\n * const imag = tf.tensor1d([4.75, 5.75]);\n * const complex = tf.complex(real, imag);\n *\n * complex.print();\n * ```\n *\n * @doc {heading: 'Tensors', subheading: 'Creation'}\n */\nfunction complex_(real, imag) {\n const $real = convertToTensor(real, 'real', 'complex');\n const $imag = convertToTensor(imag, 'imag', 'complex');\n util.assertShapesMatch($real.shape, $imag.shape, `real and imag shapes, ${$real.shape} and ${$imag.shape}, ` +\n `must match in call to tf.complex().`);\n const inputs = { real: $real, imag: $imag };\n return ENGINE.runKernel(Complex, inputs);\n}\nexport const complex = op({ complex_ });\n//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY29tcGxleC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uLy4uL3RmanMtY29yZS9zcmMvb3BzL2NvbXBsZXgudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUE7Ozs7Ozs7Ozs7Ozs7OztHQWVHO0FBQ0gsT0FBTyxFQUFDLE1BQU0sRUFBQyxNQUFNLFdBQVcsQ0FBQztBQUNqQyxPQUFPLEVBQUMsT0FBTyxFQUFnQixNQUFNLGlCQUFpQixDQUFDO0FBR3ZELE9BQU8sRUFBQyxlQUFlLEVBQUMsTUFBTSxvQkFBb0IsQ0FBQztBQUVuRCxPQUFPLEtBQUssSUFBSSxNQUFNLFNBQVMsQ0FBQztBQUVoQyxPQUFPLEVBQUMsRUFBRSxFQUFDLE1BQU0sYUFBYSxDQUFDO0FBRS9COzs7Ozs7Ozs7Ozs7Ozs7Ozs7O0dBbUJHO0FBQ0gsU0FBUyxRQUFRLENBQW1CLElBQWtCLEVBQUUsSUFBa0I7SUFDeEUsTUFBTSxLQUFLLEdBQUcsZUFBZSxDQUFDLElBQUksRUFBRSxNQUFNLEVBQUUsU0FBUyxDQUFDLENBQUM7SUFDdkQsTUFBTSxLQUFLLEdBQUcsZUFBZSxDQUFDLElBQUksRUFBRSxNQUFNLEVBQUUsU0FBUyxDQUFDLENBQUM7SUFDdkQsSUFBSSxDQUFDLGlCQUFpQixDQUNsQixLQUFLLENBQUMsS0FBSyxFQUFFLEtBQUssQ0FBQyxLQUFLLEVBQ3hCLHlCQUF5QixLQUFLLENBQUMsS0FBSyxRQUFRLEtBQUssQ0FBQyxLQUFLLElBQUk7UUFDdkQscUNBQXFDLENBQUMsQ0FBQztJQUUvQyxNQUFNLE1BQU0sR0FBa0IsRUFBQyxJQUFJLEVBQUUsS0FBSyxFQUFFLElBQUksRUFBRSxLQUFLLEVBQUMsQ0FBQztJQUN6RCxPQUFPLE1BQU0sQ0FBQyxTQUFTLENBQUMsT0FBTyxFQUFFLE1BQThCLENBQUMsQ0FBQztBQUNuRSxDQUFDO0FBRUQsTUFBTSxDQUFDLE1BQU0sT0FBTyxHQUFHLEVBQUUsQ0FBQyxFQUFDLFFBQVEsRUFBQyxDQUFDLENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyIvKipcbiAqIEBsaWNlbnNlXG4gKiBDb3B5cmlnaHQgMjAyMCBHb29nbGUgTExDLiBBbGwgUmlnaHRzIFJlc2VydmVkLlxuICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlIFwiTGljZW5zZVwiKTtcbiAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS5cbiAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdFxuICpcbiAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMFxuICpcbiAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmVcbiAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuIFwiQVMgSVNcIiBCQVNJUyxcbiAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLlxuICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZFxuICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuXG4gKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuICovXG5pbXBvcnQge0VOR0lORX0gZnJvbSAnLi4vZW5naW5lJztcbmltcG9ydCB7Q29tcGxleCwgQ29tcGxleElucHV0c30gZnJvbSAnLi4va2VybmVsX25hbWVzJztcbmltcG9ydCB7VGVuc29yfSBmcm9tICcuLi90ZW5zb3InO1xuaW1wb3J0IHtOYW1lZFRlbnNvck1hcH0gZnJvbSAnLi4vdGVuc29yX3R5cGVzJztcbmltcG9ydCB7Y29udmVydFRvVGVuc29yfSBmcm9tICcuLi90ZW5zb3JfdXRpbF9lbnYnO1xuaW1wb3J0IHtUZW5zb3JMaWtlfSBmcm9tICcuLi90eXBlcyc7XG5pbXBvcnQgKiBhcyB1dGlsIGZyb20gJy4uL3V0aWwnO1xuXG5pbXBvcnQge29wfSBmcm9tICcuL29wZXJhdGlvbic7XG5cbi8qKlxuICogQ29udmVydHMgdHdvIHJlYWwgbnVtYmVycyB0byBhIGNvbXBsZXggbnVtYmVyLlxuICpcbiAqIEdpdmVuIGEgdGVuc29yIGByZWFsYCByZXByZXNlbnRpbmcgdGhlIHJlYWwgcGFydCBvZiBhIGNvbXBsZXggbnVtYmVyLCBhbmQgYVxuICogdGVuc29yIGBpbWFnYCByZXByZXNlbnRpbmcgdGhlIGltYWdpbmFyeSBwYXJ0IG9mIGEgY29tcGxleCBudW1iZXIsIHRoaXNcbiAqIG9wZXJhdGlvbiByZXR1cm5zIGNvbXBsZXggbnVtYmVycyBlbGVtZW50d2lzZSBvZiB0aGUgZm9ybSBbcjAsIGkwLCByMSwgaTFdLFxuICogd2hlcmUgciByZXByZXNlbnRzIHRoZSByZWFsIHBhcnQgYW5kIGkgcmVwcmVzZW50cyB0aGUgaW1hZyBwYXJ0LlxuICpcbiAqIFRoZSBpbnB1dCB0ZW5zb3JzIHJlYWwgYW5kIGltYWcgbXVzdCBoYXZlIHRoZSBzYW1lIHNoYXBlLlxuICpcbiAqIGBgYGpzXG4gKiBjb25zdCByZWFsID0gdGYudGVuc29yMWQoWzIuMjUsIDMuMjVdKTtcbiAqIGNvbnN0IGltYWcgPSB0Zi50ZW5zb3IxZChbNC43NSwgNS43NV0pO1xuICogY29uc3QgY29tcGxleCA9IHRmLmNvbXBsZXgocmVhbCwgaW1hZyk7XG4gKlxuICogY29tcGxleC5wcmludCgpO1xuICogYGBgXG4gKlxuICogQGRvYyB7aGVhZGluZzogJ1RlbnNvcnMnLCBzdWJoZWFkaW5nOiAnQ3JlYXRpb24nfVxuICovXG5mdW5jdGlvbiBjb21wbGV4XzxUIGV4dGVuZHMgVGVuc29yPihyZWFsOiBUfFRlbnNvckxpa2UsIGltYWc6IFR8VGVuc29yTGlrZSk6IFQge1xuICBjb25zdCAkcmVhbCA9IGNvbnZlcnRUb1RlbnNvcihyZWFsLCAncmVhbCcsICdjb21wbGV4Jyk7XG4gIGNvbnN0ICRpbWFnID0gY29udmVydFRvVGVuc29yKGltYWcsICdpbWFnJywgJ2NvbXBsZXgnKTtcbiAgdXRpbC5hc3NlcnRTaGFwZXNNYXRjaChcbiAgICAgICRyZWFsLnNoYXBlLCAkaW1hZy5zaGFwZSxcbiAgICAgIGByZWFsIGFuZCBpbWFnIHNoYXBlcywgJHskcmVhbC5zaGFwZX0gYW5kICR7JGltYWcuc2hhcGV9LCBgICtcbiAgICAgICAgICBgbXVzdCBtYXRjaCBpbiBjYWxsIHRvIHRmLmNvbXBsZXgoKS5gKTtcblxuICBjb25zdCBpbnB1dHM6IENvbXBsZXhJbnB1dHMgPSB7cmVhbDogJHJlYWwsIGltYWc6ICRpbWFnfTtcbiAgcmV0dXJuIEVOR0lORS5ydW5LZXJuZWwoQ29tcGxleCwgaW5wdXRzIGFzIHt9IGFzIE5hbWVkVGVuc29yTWFwKTtcbn1cblxuZXhwb3J0IGNvbnN0IGNvbXBsZXggPSBvcCh7Y29tcGxleF99KTtcbiJdfQ==","/**\n * @license\n * Copyright 2020 Google LLC. All Rights Reserved.\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n * =============================================================================\n */\nimport { ENGINE } from '../engine';\nimport { Concat } from '../kernel_names';\nimport { convertToTensorArray } from '../tensor_util_env';\nimport { assert } from '../util';\nimport { clone } from './clone';\nimport { op } from './operation';\n/**\n * Concatenates a list of `tf.Tensor`s along a given axis.\n *\n * The tensors ranks and types must match, and their sizes must match in all\n * dimensions except `axis`.\n *\n * Also available are stricter rank-specific methods that assert that\n * `tensors` are of the given rank:\n * - `tf.concat1d`\n * - `tf.concat2d`\n * - `tf.concat3d`\n * - `tf.concat4d`\n *\n * Except `tf.concat1d` (which does not have axis param), all methods have\n * same signature as this method.\n *\n * ```js\n * const a = tf.tensor1d([1, 2]);\n * const b = tf.tensor1d([3, 4]);\n * a.concat(b).print(); // or a.concat(b)\n * ```\n *\n * ```js\n * const a = tf.tensor1d([1, 2]);\n * const b = tf.tensor1d([3, 4]);\n * const c = tf.tensor1d([5, 6]);\n * tf.concat([a, b, c]).print();\n * ```\n *\n * ```js\n * const a = tf.tensor2d([[1, 2], [10, 20]]);\n * const b = tf.tensor2d([[3, 4], [30, 40]]);\n * const axis = 1;\n * tf.concat([a, b], axis).print();\n * ```\n * @param tensors A list of tensors to concatenate.\n * @param axis The axis to concatenate along. Defaults to 0 (the first dim).\n *\n * @doc {heading: 'Tensors', subheading: 'Slicing and Joining'}\n */\nfunction concat_(tensors, axis = 0) {\n assert(tensors.length >= 1, () => 'Pass at least one tensor to concat');\n const $tensors = convertToTensorArray(tensors, 'tensors', 'concat', 'string_or_numeric');\n if ($tensors[0].dtype === 'complex64') {\n $tensors.forEach(tensor => {\n if (tensor.dtype !== 'complex64') {\n throw new Error(`Cannot concatenate complex64 tensors with a tensor\n with dtype ${tensor.dtype}. `);\n }\n });\n }\n if ($tensors.length === 1) {\n return clone($tensors[0]);\n }\n const inputs = $tensors;\n const attr = { axis };\n return ENGINE.runKernel(Concat, inputs, attr);\n}\nexport const concat = op({ concat_ });\n//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY29uY2F0LmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vLi4vdGZqcy1jb3JlL3NyYy9vcHMvY29uY2F0LnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBOzs7Ozs7Ozs7Ozs7Ozs7R0FlRztBQUNILE9BQU8sRUFBQyxNQUFNLEVBQUMsTUFBTSxXQUFXLENBQUM7QUFDakMsT0FBTyxFQUFDLE1BQU0sRUFBNEIsTUFBTSxpQkFBaUIsQ0FBQztBQUlsRSxPQUFPLEVBQUMsb0JBQW9CLEVBQUMsTUFBTSxvQkFBb0IsQ0FBQztBQUV4RCxPQUFPLEVBQUMsTUFBTSxFQUFDLE1BQU0sU0FBUyxDQUFDO0FBRS9CLE9BQU8sRUFBQyxLQUFLLEVBQUMsTUFBTSxTQUFTLENBQUM7QUFDOUIsT0FBTyxFQUFDLEVBQUUsRUFBQyxNQUFNLGFBQWEsQ0FBQztBQUUvQjs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7O0dBdUNHO0FBQ0gsU0FBUyxPQUFPLENBQW1CLE9BQTRCLEVBQUUsSUFBSSxHQUFHLENBQUM7SUFDdkUsTUFBTSxDQUFDLE9BQU8sQ0FBQyxNQUFNLElBQUksQ0FBQyxFQUFFLEdBQUcsRUFBRSxDQUFDLG9DQUFvQyxDQUFDLENBQUM7SUFFeEUsTUFBTSxRQUFRLEdBQ1Ysb0JBQW9CLENBQUMsT0FBTyxFQUFFLFNBQVMsRUFBRSxRQUFRLEVBQUUsbUJBQW1CLENBQUMsQ0FBQztJQUU1RSxJQUFJLFFBQVEsQ0FBQyxDQUFDLENBQUMsQ0FBQyxLQUFLLEtBQUssV0FBVyxFQUFFO1FBQ3JDLFFBQVEsQ0FBQyxPQUFPLENBQUMsTUFBTSxDQUFDLEVBQUU7WUFDeEIsSUFBSSxNQUFNLENBQUMsS0FBSyxLQUFLLFdBQVcsRUFBRTtnQkFDaEMsTUFBTSxJQUFJLEtBQUssQ0FBQzt1QkFDRCxNQUFNLENBQUMsS0FBSyxJQUFJLENBQUMsQ0FBQzthQUNsQztRQUNILENBQUMsQ0FBQyxDQUFDO0tBQ0o7SUFFRCxJQUFJLFFBQVEsQ0FBQyxNQUFNLEtBQUssQ0FBQyxFQUFFO1FBQ3pCLE9BQU8sS0FBSyxDQUFDLFFBQVEsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDO0tBQzNCO0lBRUQsTUFBTSxNQUFNLEdBQWlCLFFBQVEsQ0FBQztJQUN0QyxNQUFNLElBQUksR0FBZ0IsRUFBQyxJQUFJLEVBQUMsQ0FBQztJQUVqQyxPQUFPLE1BQU0sQ0FBQyxTQUFTLENBQ25CLE1BQU0sRUFBRSxNQUE4QixFQUFFLElBQTBCLENBQUMsQ0FBQztBQUMxRSxDQUFDO0FBRUQsTUFBTSxDQUFDLE1BQU0sTUFBTSxHQUFHLEVBQUUsQ0FBQyxFQUFDLE9BQU8sRUFBQyxDQUFDLENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyIvKipcbiAqIEBsaWNlbnNlXG4gKiBDb3B5cmlnaHQgMjAyMCBHb29nbGUgTExDLiBBbGwgUmlnaHRzIFJlc2VydmVkLlxuICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlIFwiTGljZW5zZVwiKTtcbiAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS5cbiAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdFxuICpcbiAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMFxuICpcbiAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmVcbiAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuIFwiQVMgSVNcIiBCQVNJUyxcbiAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLlxuICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZFxuICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuXG4gKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuICovXG5pbXBvcnQge0VOR0lORX0gZnJvbSAnLi4vZW5naW5lJztcbmltcG9ydCB7Q29uY2F0LCBDb25jYXRBdHRycywgQ29uY2F0SW5wdXRzfSBmcm9tICcuLi9rZXJuZWxfbmFtZXMnO1xuaW1wb3J0IHtOYW1lZEF0dHJNYXB9IGZyb20gJy4uL2tlcm5lbF9yZWdpc3RyeSc7XG5pbXBvcnQge1RlbnNvcn0gZnJvbSAnLi4vdGVuc29yJztcbmltcG9ydCB7TmFtZWRUZW5zb3JNYXB9IGZyb20gJy4uL3RlbnNvcl90eXBlcyc7XG5pbXBvcnQge2NvbnZlcnRUb1RlbnNvckFycmF5fSBmcm9tICcuLi90ZW5zb3JfdXRpbF9lbnYnO1xuaW1wb3J0IHtUZW5zb3JMaWtlfSBmcm9tICcuLi90eXBlcyc7XG5pbXBvcnQge2Fzc2VydH0gZnJvbSAnLi4vdXRpbCc7XG5cbmltcG9ydCB7Y2xvbmV9IGZyb20gJy4vY2xvbmUnO1xuaW1wb3J0IHtvcH0gZnJvbSAnLi9vcGVyYXRpb24nO1xuXG4vKipcbiAqIENvbmNhdGVuYXRlcyBhIGxpc3Qgb2YgYHRmLlRlbnNvcmBzIGFsb25nIGEgZ2l2ZW4gYXhpcy5cbiAqXG4gKiBUaGUgdGVuc29ycyByYW5rcyBhbmQgdHlwZXMgbXVzdCBtYXRjaCwgYW5kIHRoZWlyIHNpemVzIG11c3QgbWF0Y2ggaW4gYWxsXG4gKiBkaW1lbnNpb25zIGV4Y2VwdCBgYXhpc2AuXG4gKlxuICogQWxzbyBhdmFpbGFibGUgYXJlIHN0cmljdGVyIHJhbmstc3BlY2lmaWMgbWV0aG9kcyB0aGF0IGFzc2VydCB0aGF0XG4gKiBgdGVuc29yc2AgYXJlIG9mIHRoZSBnaXZlbiByYW5rOlxuICogICAtIGB0Zi5jb25jYXQxZGBcbiAqICAgLSBgdGYuY29uY2F0MmRgXG4gKiAgIC0gYHRmLmNvbmNhdDNkYFxuICogICAtIGB0Zi5jb25jYXQ0ZGBcbiAqXG4gKiBFeGNlcHQgYHRmLmNvbmNhdDFkYCAod2hpY2ggZG9lcyBub3QgaGF2ZSBheGlzIHBhcmFtKSwgYWxsIG1ldGhvZHMgaGF2ZVxuICogc2FtZSBzaWduYXR1cmUgYXMgdGhpcyBtZXRob2QuXG4gKlxuICogYGBganNcbiAqIGNvbnN0IGEgPSB0Zi50ZW5zb3IxZChbMSwgMl0pO1xuICogY29uc3QgYiA9IHRmLnRlbnNvcjFkKFszLCA0XSk7XG4gKiBhLmNvbmNhdChiKS5wcmludCgpOyAgLy8gb3IgYS5jb25jYXQoYilcbiAqIGBgYFxuICpcbiAqIGBgYGpzXG4gKiBjb25zdCBhID0gdGYudGVuc29yMWQoWzEsIDJdKTtcbiAqIGNvbnN0IGIgPSB0Zi50ZW5zb3IxZChbMywgNF0pO1xuICogY29uc3QgYyA9IHRmLnRlbnNvcjFkKFs1LCA2XSk7XG4gKiB0Zi5jb25jYXQoW2EsIGIsIGNdKS5wcmludCgpO1xuICogYGBgXG4gKlxuICogYGBganNcbiAqIGNvbnN0IGEgPSB0Zi50ZW5zb3IyZChbWzEsIDJdLCBbMTAsIDIwXV0pO1xuICogY29uc3QgYiA9IHRmLnRlbnNvcjJkKFtbMywgNF0sIFszMCwgNDBdXSk7XG4gKiBjb25zdCBheGlzID0gMTtcbiAqIHRmLmNvbmNhdChbYSwgYl0sIGF4aXMpLnByaW50KCk7XG4gKiBgYGBcbiAqIEBwYXJhbSB0ZW5zb3JzIEEgbGlzdCBvZiB0ZW5zb3JzIHRvIGNvbmNhdGVuYXRlLlxuICogQHBhcmFtIGF4aXMgVGhlIGF4aXMgdG8gY29uY2F0ZW5hdGUgYWxvbmcuIERlZmF1bHRzIHRvIDAgKHRoZSBmaXJzdCBkaW0pLlxuICpcbiAqIEBkb2Mge2hlYWRpbmc6ICdUZW5zb3JzJywgc3ViaGVhZGluZzogJ1NsaWNpbmcgYW5kIEpvaW5pbmcnfVxuICovXG5mdW5jdGlvbiBjb25jYXRfPFQgZXh0ZW5kcyBUZW5zb3I+KHRlbnNvcnM6IEFycmF5PFR8VGVuc29yTGlrZT4sIGF4aXMgPSAwKTogVCB7XG4gIGFzc2VydCh0ZW5zb3JzLmxlbmd0aCA+PSAxLCAoKSA9PiAnUGFzcyBhdCBsZWFzdCBvbmUgdGVuc29yIHRvIGNvbmNhdCcpO1xuXG4gIGNvbnN0ICR0ZW5zb3JzID1cbiAgICAgIGNvbnZlcnRUb1RlbnNvckFycmF5KHRlbnNvcnMsICd0ZW5zb3JzJywgJ2NvbmNhdCcsICdzdHJpbmdfb3JfbnVtZXJpYycpO1xuXG4gIGlmICgkdGVuc29yc1swXS5kdHlwZSA9PT0gJ2NvbXBsZXg2NCcpIHtcbiAgICAkdGVuc29ycy5mb3JFYWNoKHRlbnNvciA9PiB7XG4gICAgICBpZiAodGVuc29yLmR0eXBlICE9PSAnY29tcGxleDY0Jykge1xuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoYENhbm5vdCBjb25jYXRlbmF0ZSBjb21wbGV4NjQgdGVuc29ycyB3aXRoIGEgdGVuc29yXG4gICAgICAgICAgd2l0aCBkdHlwZSAke3RlbnNvci5kdHlwZX0uIGApO1xuICAgICAgfVxuICAgIH0pO1xuICB9XG5cbiAgaWYgKCR0ZW5zb3JzLmxlbmd0aCA9PT0gMSkge1xuICAgIHJldHVybiBjbG9uZSgkdGVuc29yc1swXSk7XG4gIH1cblxuICBjb25zdCBpbnB1dHM6IENvbmNhdElucHV0cyA9ICR0ZW5zb3JzO1xuICBjb25zdCBhdHRyOiBDb25jYXRBdHRycyA9IHtheGlzfTtcblxuICByZXR1cm4gRU5HSU5FLnJ1bktlcm5lbChcbiAgICAgIENvbmNhdCwgaW5wdXRzIGFzIHt9IGFzIE5hbWVkVGVuc29yTWFwLCBhdHRyIGFzIHt9IGFzIE5hbWVkQXR0ck1hcCk7XG59XG5cbmV4cG9ydCBjb25zdCBjb25jYXQgPSBvcCh7Y29uY2F0X30pO1xuIl19","import { convertToTensor } from '../tensor_util_env';\nimport * as util from '../util';\nimport { conv2d } from './conv2d';\nimport * as conv_util from './conv_util';\nimport { op } from './operation';\nimport { reshape } from './reshape';\n/**\n * Computes a 1D convolution over the input x.\n *\n * @param x The input tensor, of rank 3 or rank 2, of shape\n * `[batch, width, inChannels]`. If rank 2, batch of 1 is assumed.\n * @param filter The filter, rank 3, of shape\n * `[filterWidth, inDepth, outDepth]`.\n * @param stride The number of entries by which the filter is moved right at\n * each step.\n * @param pad The type of padding algorithm.\n * - `same` and stride 1: output will be of same size as input,\n * regardless of filter size.\n * - `valid`: output will be smaller than input if filter is larger\n * than 1x1.\n * - For more info, see this guide:\n * [https://www.tensorflow.org/api_docs/python/tf/nn/convolution](\n * https://www.tensorflow.org/api_docs/python/tf/nn/convolution)\n * @param dataFormat An optional string from \"NWC\", \"NCW\". Defaults to \"NWC\",\n * the data is stored in the order of [batch, in_width, in_channels]. Only\n * \"NWC\" is currently supported.\n * @param dilation The dilation rate in which we sample input values in\n * atrous convolution. Defaults to `1`. If it is greater than 1, then\n * stride must be `1`.\n * @param dimRoundingMode A string from: 'ceil', 'round', 'floor'. If none is\n * provided, it will default to truncate.\n *\n * @doc {heading: 'Operations', subheading: 'Convolution'}\n */\nfunction conv1d_(x, filter, stride, pad, dataFormat = 'NWC', dilation = 1, dimRoundingMode) {\n const $x = convertToTensor(x, 'x', 'conv1d');\n const $filter = convertToTensor(filter, 'filter', 'conv1d');\n let x3D = $x;\n let reshapedTo3D = false;\n if ($x.rank === 2) {\n reshapedTo3D = true;\n x3D = reshape($x, [1, $x.shape[0], $x.shape[1]]);\n }\n util.assert(x3D.rank === 3, () => `Error in conv1d: input must be rank 3, but got rank ${x3D.rank}.`);\n util.assert($filter.rank === 3, () => `Error in conv1d: filter must be rank 3, but got rank ` +\n `${$filter.rank}.`);\n conv_util.checkPadOnDimRoundingMode('conv1d', pad, dimRoundingMode);\n util.assert(x3D.shape[2] === $filter.shape[1], () => `Error in conv1d: depth of input (${x3D.shape[2]}) must match ` +\n `input depth for filter ${$filter.shape[1]}.`);\n util.assert(conv_util.eitherStridesOrDilationsAreOne(stride, dilation), () => 'Error in conv1D: Either stride or dilation must be 1. ' +\n `Got stride ${stride} and dilation '${dilation}'`);\n util.assert(dataFormat === 'NWC', () => `Error in conv1d: got dataFormat of ${dataFormat} but only NWC is currently supported.`);\n const filter4D = reshape($filter, [1, $filter.shape[0], $filter.shape[1], $filter.shape[2]]);\n const input4D = reshape(x3D, [x3D.shape[0], 1, x3D.shape[1], x3D.shape[2]]);\n const strides = [1, stride];\n const dilations = [1, dilation];\n const conv2dDataFormat = 'NHWC';\n const res = conv2d(input4D, filter4D, strides, pad, conv2dDataFormat, dilations, dimRoundingMode);\n if (reshapedTo3D) {\n return reshape(res, [res.shape[2], res.shape[3]]);\n }\n return reshape(res, [res.shape[0], res.shape[2], res.shape[3]]);\n}\nexport const conv1d = op({ conv1d_ });\n//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY29udjFkLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vLi4vdGZqcy1jb3JlL3NyYy9vcHMvY29udjFkLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQWlCQSxPQUFPLEVBQUMsZUFBZSxFQUFDLE1BQU0sb0JBQW9CLENBQUM7QUFFbkQsT0FBTyxLQUFLLElBQUksTUFBTSxTQUFTLENBQUM7QUFFaEMsT0FBTyxFQUFDLE1BQU0sRUFBQyxNQUFNLFVBQVUsQ0FBQztBQUNoQyxPQUFPLEtBQUssU0FBUyxNQUFNLGFBQWEsQ0FBQztBQUN6QyxPQUFPLEVBQUMsRUFBRSxFQUFDLE1BQU0sYUFBYSxDQUFDO0FBQy9CLE9BQU8sRUFBQyxPQUFPLEVBQUMsTUFBTSxXQUFXLENBQUM7QUFFbEM7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7OztHQTJCRztBQUNILFNBQVMsT0FBTyxDQUNaLENBQWUsRUFBRSxNQUEyQixFQUFFLE1BQWMsRUFDNUQsR0FBb0QsRUFDcEQsYUFBMEIsS0FBSyxFQUFFLFFBQVEsR0FBRyxDQUFDLEVBQzdDLGVBQXdDO0lBQzFDLE1BQU0sRUFBRSxHQUFHLGVBQWUsQ0FBQyxDQUFDLEVBQUUsR0FBRyxFQUFFLFFBQVEsQ0FBQyxDQUFDO0lBQzdDLE1BQU0sT0FBTyxHQUFHLGVBQWUsQ0FBQyxNQUFNLEVBQUUsUUFBUSxFQUFFLFFBQVEsQ0FBQyxDQUFDO0lBRTVELElBQUksR0FBRyxHQUFHLEVBQWMsQ0FBQztJQUN6QixJQUFJLFlBQVksR0FBRyxLQUFLLENBQUM7SUFDekIsSUFBSSxFQUFFLENBQUMsSUFBSSxLQUFLLENBQUMsRUFBRTtRQUNqQixZQUFZLEdBQUcsSUFBSSxDQUFDO1FBQ3BCLEdBQUcsR0FBRyxPQUFPLENBQUMsRUFBRSxFQUFFLENBQUMsQ0FBQyxFQUFFLEVBQUUsQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDLEVBQUUsRUFBRSxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUM7S0FDbEQ7SUFFRCxJQUFJLENBQUMsTUFBTSxDQUNQLEdBQUcsQ0FBQyxJQUFJLEtBQUssQ0FBQyxFQUNkLEdBQUcsRUFBRSxDQUFDLHVEQUF1RCxHQUFHLENBQUMsSUFBSSxHQUFHLENBQUMsQ0FBQztJQUM5RSxJQUFJLENBQUMsTUFBTSxDQUNQLE9BQU8sQ0FBQyxJQUFJLEtBQUssQ0FBQyxFQUNsQixHQUFHLEVBQUUsQ0FBQyx1REFBdUQ7UUFDekQsR0FBRyxPQUFPLENBQUMsSUFBSSxHQUFHLENBQUMsQ0FBQztJQUM1QixTQUFTLENBQUMseUJBQXlCLENBQUMsUUFBUSxFQUFFLEdBQUcsRUFBRSxlQUFlLENBQUMsQ0FBQztJQUNwRSxJQUFJLENBQUMsTUFBTSxDQUNQLEdBQUcsQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDLEtBQUssT0FBTyxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUMsRUFDakMsR0FBRyxFQUFFLENBQUMsb0NBQW9DLEdBQUcsQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDLGVBQWU7UUFDakUsMEJBQTBCLE9BQU8sQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDO0lBQ3ZELElBQUksQ0FBQyxNQUFNLENBQ1AsU0FBUyxDQUFDLDhCQUE4QixDQUFDLE1BQU0sRUFBRSxRQUFRLENBQUMsRUFDMUQsR0FBRyxFQUFFLENBQUMsd0RBQXdEO1FBQzFELGNBQWMsTUFBTSxrQkFBa0IsUUFBUSxHQUFHLENBQUMsQ0FBQztJQUMzRCxJQUFJLENBQUMsTUFBTSxDQUNQLFVBQVUsS0FBSyxLQUFLLEVBQ3BCLEdBQUcsRUFBRSxDQUFDLHNDQUNGLFVBQVUsdUNBQXVDLENBQUMsQ0FBQztJQUUzRCxNQUFNLFFBQVEsR0FBRyxPQUFPLENBQ3BCLE9BQU8sRUFBRSxDQUFDLENBQUMsRUFBRSxPQUFPLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQyxFQUFFLE9BQU8sQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDLEVBQUUsT0FBTyxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUM7SUFDeEUsTUFBTSxPQUFPLEdBQUcsT0FBTyxDQUFDLEdBQUcsRUFBRSxDQUFDLEdBQUcsQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxFQUFFLEdBQUcsQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDLEVBQUUsR0FBRyxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUM7SUFDNUUsTUFBTSxPQUFPLEdBQXFCLENBQUMsQ0FBQyxFQUFFLE1BQU0sQ0FBQyxDQUFDO0lBQzlDLE1BQU0sU0FBUyxHQUFxQixDQUFDLENBQUMsRUFBRSxRQUFRLENBQUMsQ0FBQztJQUVsRCxNQUFNLGdCQUFnQixHQUFHLE1BQU0sQ0FBQztJQUVoQyxNQUFNLEdBQUcsR0FBRyxNQUFNLENBQ2IsT0FBb0IsRUFBRyxRQUFxQixFQUFFLE9BQU8sRUFBRSxHQUFHLEVBQzNELGdCQUFnQixFQUFFLFNBQVMsRUFBRSxlQUFlLENBQUMsQ0FBQztJQUVsRCxJQUFJLFlBQVksRUFBRTtRQUNoQixPQUFPLE9BQU8sQ0FBQyxHQUFHLEVBQUUsQ0FBQyxHQUFHLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQyxFQUFFLEdBQUcsQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBTSxDQUFDO0tBQ3hEO0lBRUQsT0FBTyxPQUFPLENBQUMsR0FBRyxFQUFFLENBQUMsR0FBRyxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUMsRUFBRSxHQUFHLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQyxFQUFFLEdBQUcsQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBTSxDQUFDO0FBQ3ZFLENBQUM7QUFFRCxNQUFNLENBQUMsTUFBTSxNQUFNLEdBQUcsRUFBRSxDQUFDLEVBQUMsT0FBTyxFQUFDLENBQUMsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbIi8qKlxuICogQGxpY2Vuc2VcbiAqIENvcHlyaWdodCAyMDIwIEdvb2dsZSBMTEMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuXG4gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgXCJMaWNlbnNlXCIpO1xuICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLlxuICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0XG4gKlxuICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wXG4gKlxuICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZVxuICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gXCJBUyBJU1wiIEJBU0lTLFxuICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuXG4gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kXG4gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS5cbiAqID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4gKi9cbmltcG9ydCB7VGVuc29yMkQsIFRlbnNvcjNELCBUZW5zb3I0RH0gZnJvbSAnLi4vdGVuc29yJztcbmltcG9ydCB7Y29udmVydFRvVGVuc29yfSBmcm9tICcuLi90ZW5zb3JfdXRpbF9lbnYnO1xuaW1wb3J0IHtUZW5zb3JMaWtlfSBmcm9tICcuLi90eXBlcyc7XG5pbXBvcnQgKiBhcyB1dGlsIGZyb20gJy4uL3V0aWwnO1xuXG5pbXBvcnQge2NvbnYyZH0gZnJvbSAnLi9jb252MmQnO1xuaW1wb3J0ICogYXMgY29udl91dGlsIGZyb20gJy4vY29udl91dGlsJztcbmltcG9ydCB7b3B9IGZyb20gJy4vb3BlcmF0aW9uJztcbmltcG9ydCB7cmVzaGFwZX0gZnJvbSAnLi9yZXNoYXBlJztcblxuLyoqXG4gKiBDb21wdXRlcyBhIDFEIGNvbnZvbHV0aW9uIG92ZXIgdGhlIGlucHV0IHguXG4gKlxuICogQHBhcmFtIHggVGhlIGlucHV0IHRlbnNvciwgb2YgcmFuayAzIG9yIHJhbmsgMiwgb2Ygc2hhcGVcbiAqICAgICBgW2JhdGNoLCB3aWR0aCwgaW5DaGFubmVsc11gLiBJZiByYW5rIDIsIGJhdGNoIG9mIDEgaXMgYXNzdW1lZC5cbiAqIEBwYXJhbSBmaWx0ZXIgVGhlIGZpbHRlciwgcmFuayAzLCBvZiBzaGFwZVxuICogICAgIGBbZmlsdGVyV2lkdGgsIGluRGVwdGgsIG91dERlcHRoXWAuXG4gKiBAcGFyYW0gc3RyaWRlIFRoZSBudW1iZXIgb2YgZW50cmllcyBieSB3aGljaCB0aGUgZmlsdGVyIGlzIG1vdmVkIHJpZ2h0IGF0XG4gKiAgICAgZWFjaCBzdGVwLlxuICogQHBhcmFtIHBhZCBUaGUgdHlwZSBvZiBwYWRkaW5nIGFsZ29yaXRobS5cbiAqICAgIC0gYHNhbWVgIGFuZCBzdHJpZGUgMTogb3V0cHV0IHdpbGwgYmUgb2Ygc2FtZSBzaXplIGFzIGlucHV0LFxuICogICAgICAgcmVnYXJkbGVzcyBvZiBmaWx0ZXIgc2l6ZS5cbiAqICAgIC0gYHZhbGlkYDogb3V0cHV0IHdpbGwgYmUgc21hbGxlciB0aGFuIGlucHV0IGlmIGZpbHRlciBpcyBsYXJnZXJcbiAqICAgICAgIHRoYW4gMXgxLlxuICogICAtIEZvciBtb3JlIGluZm8sIHNlZSB0aGlzIGd1aWRlOlxuICogICAgIFtodHRwczovL3d3dy50ZW5zb3JmbG93Lm9yZy9hcGlfZG9jcy9weXRob24vdGYvbm4vY29udm9sdXRpb25dKFxuICogICAgICAgICAgaHR0cHM6Ly93d3cudGVuc29yZmxvdy5vcmcvYXBpX2RvY3MvcHl0aG9uL3RmL25uL2NvbnZvbHV0aW9uKVxuICogQHBhcmFtIGRhdGFGb3JtYXQgQW4gb3B0aW9uYWwgc3RyaW5nIGZyb20gXCJOV0NcIiwgXCJOQ1dcIi4gRGVmYXVsdHMgdG8gXCJOV0NcIixcbiAqICAgICB0aGUgZGF0YSBpcyBzdG9yZWQgaW4gdGhlIG9yZGVyIG9mIFtiYXRjaCwgaW5fd2lkdGgsIGluX2NoYW5uZWxzXS4gT25seVxuICogICAgIFwiTldDXCIgaXMgY3VycmVudGx5IHN1cHBvcnRlZC5cbiAqIEBwYXJhbSBkaWxhdGlvbiBUaGUgZGlsYXRpb24gcmF0ZSBpbiB3aGljaCB3ZSBzYW1wbGUgaW5wdXQgdmFsdWVzIGluXG4gKiAgICAgYXRyb3VzIGNvbnZvbHV0aW9uLiBEZWZhdWx0cyB0byBgMWAuIElmIGl0IGlzIGdyZWF0ZXIgdGhhbiAxLCB0aGVuXG4gKiAgICAgc3RyaWRlIG11c3QgYmUgYDFgLlxuICogQHBhcmFtIGRpbVJvdW5kaW5nTW9kZSBBIHN0cmluZyBmcm9tOiAnY2VpbCcsICdyb3VuZCcsICdmbG9vcicuIElmIG5vbmUgaXNcbiAqICAgICBwcm92aWRlZCwgaXQgd2lsbCBkZWZhdWx0IHRvIHRydW5jYXRlLlxuICpcbiAqIEBkb2Mge2hlYWRpbmc6ICdPcGVyYXRpb25zJywgc3ViaGVhZGluZzogJ0NvbnZvbHV0aW9uJ31cbiAqL1xuZnVuY3Rpb24gY29udjFkXzxUIGV4dGVuZHMgVGVuc29yMkR8VGVuc29yM0Q+KFxuICAgIHg6IFR8VGVuc29yTGlrZSwgZmlsdGVyOiBUZW5zb3IzRHxUZW5zb3JMaWtlLCBzdHJpZGU6IG51bWJlcixcbiAgICBwYWQ6ICd2YWxpZCd8J3NhbWUnfG51bWJlcnxjb252X3V0aWwuRXhwbGljaXRQYWRkaW5nLFxuICAgIGRhdGFGb3JtYXQ6ICdOV0MnfCdOQ1cnID0gJ05XQycsIGRpbGF0aW9uID0gMSxcbiAgICBkaW1Sb3VuZGluZ01vZGU/OiAnZmxvb3InfCdyb3VuZCd8J2NlaWwnKTogVCB7XG4gIGNvbnN0ICR4ID0gY29udmVydFRvVGVuc29yKHgsICd4JywgJ2NvbnYxZCcpO1xuICBjb25zdCAkZmlsdGVyID0gY29udmVydFRvVGVuc29yKGZpbHRlciwgJ2ZpbHRlcicsICdjb252MWQnKTtcblxuICBsZXQgeDNEID0gJHggYXMgVGVuc29yM0Q7XG4gIGxldCByZXNoYXBlZFRvM0QgPSBmYWxzZTtcbiAgaWYgKCR4LnJhbmsgPT09IDIpIHtcbiAgICByZXNoYXBlZFRvM0QgPSB0cnVlO1xuICAgIHgzRCA9IHJlc2hhcGUoJHgsIFsxLCAkeC5zaGFwZVswXSwgJHguc2hhcGVbMV1dKTtcbiAgfVxuXG4gIHV0aWwuYXNzZXJ0KFxuICAgICAgeDNELnJhbmsgPT09IDMsXG4gICAgICAoKSA9PiBgRXJyb3IgaW4gY29udjFkOiBpbnB1dCBtdXN0IGJlIHJhbmsgMywgYnV0IGdvdCByYW5rICR7eDNELnJhbmt9LmApO1xuICB1dGlsLmFzc2VydChcbiAgICAgICRmaWx0ZXIucmFuayA9PT0gMyxcbiAgICAgICgpID0+IGBFcnJvciBpbiBjb252MWQ6IGZpbHRlciBtdXN0IGJlIHJhbmsgMywgYnV0IGdvdCByYW5rIGAgK1xuICAgICAgICAgIGAkeyRmaWx0ZXIucmFua30uYCk7XG4gIGNvbnZfdXRpbC5jaGVja1BhZE9uRGltUm91bmRpbmdNb2RlKCdjb252MWQnLCBwYWQsIGRpbVJvdW5kaW5nTW9kZSk7XG4gIHV0aWwuYXNzZXJ0KFxuICAgICAgeDNELnNoYXBlWzJdID09PSAkZmlsdGVyLnNoYXBlWzFdLFxuICAgICAgKCkgPT4gYEVycm9yIGluIGNvbnYxZDogZGVwdGggb2YgaW5wdXQgKCR7eDNELnNoYXBlWzJdfSkgbXVzdCBtYXRjaCBgICtcbiAgICAgICAgICBgaW5wdXQgZGVwdGggZm9yIGZpbHRlciAkeyRmaWx0ZXIuc2hhcGVbMV19LmApO1xuICB1dGlsLmFzc2VydChcbiAgICAgIGNvbnZfdXRpbC5laXRoZXJTdHJpZGVzT3JEaWxhdGlvbnNBcmVPbmUoc3RyaWRlLCBkaWxhdGlvbiksXG4gICAgICAoKSA9PiAnRXJyb3IgaW4gY29udjFEOiBFaXRoZXIgc3RyaWRlIG9yIGRpbGF0aW9uIG11c3QgYmUgMS4gJyArXG4gICAgICAgICAgYEdvdCBzdHJpZGUgJHtzdHJpZGV9IGFuZCBkaWxhdGlvbiAnJHtkaWxhdGlvbn0nYCk7XG4gIHV0aWwuYXNzZXJ0KFxuICAgICAgZGF0YUZvcm1hdCA9PT0gJ05XQycsXG4gICAgICAoKSA9PiBgRXJyb3IgaW4gY29udjFkOiBnb3QgZGF0YUZvcm1hdCBvZiAke1xuICAgICAgICAgIGRhdGFGb3JtYXR9IGJ1dCBvbmx5IE5XQyBpcyBjdXJyZW50bHkgc3VwcG9ydGVkLmApO1xuXG4gIGNvbnN0IGZpbHRlcjREID0gcmVzaGFwZShcbiAgICAgICRmaWx0ZXIsIFsxLCAkZmlsdGVyLnNoYXBlWzBdLCAkZmlsdGVyLnNoYXBlWzFdLCAkZmlsdGVyLnNoYXBlWzJdXSk7XG4gIGNvbnN0IGlucHV0NEQgPSByZXNoYXBlKHgzRCwgW3gzRC5zaGFwZVswXSwgMSwgeDNELnNoYXBlWzFdLCB4M0Quc2hhcGVbMl1dKTtcbiAgY29uc3Qgc3RyaWRlczogW251bWJlciwgbnVtYmVyXSA9IFsxLCBzdHJpZGVdO1xuICBjb25zdCBkaWxhdGlvbnM6IFtudW1iZXIsIG51bWJlcl0gPSBbMSwgZGlsYXRpb25dO1xuXG4gIGNvbnN0IGNvbnYyZERhdGFGb3JtYXQgPSAnTkhXQyc7XG5cbiAgY29uc3QgcmVzID0gY29udjJkKFxuICAgICAgKGlucHV0NEQgYXMgVGVuc29yNEQpLCAoZmlsdGVyNEQgYXMgVGVuc29yNEQpLCBzdHJpZGVzLCBwYWQsXG4gICAgICBjb252MmREYXRhRm9ybWF0LCBkaWxhdGlvbnMsIGRpbVJvdW5kaW5nTW9kZSk7XG5cbiAgaWYgKHJlc2hhcGVkVG8zRCkge1xuICAgIHJldHVybiByZXNoYXBlKHJlcywgW3Jlcy5zaGFwZVsyXSwgcmVzLnNoYXBlWzNdXSkgYXMgVDtcbiAgfVxuXG4gIHJldHVybiByZXNoYXBlKHJlcywgW3Jlcy5zaGFwZVswXSwgcmVzLnNoYXBlWzJdLCByZXMuc2hhcGVbM11dKSBhcyBUO1xufVxuXG5leHBvcnQgY29uc3QgY29udjFkID0gb3Aoe2NvbnYxZF99KTtcbiJdfQ==","/**\n * @license\n * Copyright 2020 Google LLC. All Rights Reserved.\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n * =============================================================================\n */\nimport { ENGINE } from '../engine';\nimport { Conv2D } from '../kernel_names';\nimport { convertToTensor } from '../tensor_util_env';\nimport * as util from '../util';\nimport * as conv_util from './conv_util';\nimport { op } from './operation';\nimport { reshape } from './reshape';\n/**\n * Computes a 2D convolution over the input x.\n *\n * @param x The input tensor, of rank 4 or rank 3, of shape\n * `[batch, height, width, inChannels]`. If rank 3, batch of 1 is\n * assumed.\n * @param filter The filter, rank 4, of shape\n * `[filterHeight, filterWidth, inDepth, outDepth]`.\n * @param strides The strides of the convolution: `[strideHeight,\n * strideWidth]`.\n * @param pad The type of padding algorithm.\n * - `same` and stride 1: output will be of same size as input,\n * regardless of filter size.\n * - `valid`: output will be smaller than input if filter is larger\n * than 1x1.\n * - For more info, see this guide:\n * [https://www.tensorflow.org/api_docs/python/tf/nn/convolution](\n * https://www.tensorflow.org/api_docs/python/tf/nn/convolution)\n * @param dataFormat: An optional string from: \"NHWC\", \"NCHW\". Defaults to\n * \"NHWC\". Specify the data format of the input and output data. With the\n * default format \"NHWC\", the data is stored in the order of: [batch,\n * height, width, channels].\n * @param dilations The dilation rates: `[dilationHeight, dilationWidth]`\n * in which we sample input values across the height and width dimensions\n * in atrous convolution. Defaults to `[1, 1]`. If `dilations` is a single\n * number, then `dilationHeight == dilationWidth`. If it is greater than\n * 1, then all values of `strides` must be 1.\n * @param dimRoundingMode A string from: 'ceil', 'round', 'floor'. If none is\n * provided, it will default to truncate.\n *\n * @doc {heading: 'Operations', subheading: 'Convolution'}\n */\nfunction conv2d_(x, filter, strides, pad, dataFormat = 'NHWC', dilations = [1, 1], dimRoundingMode) {\n const $x = convertToTensor(x, 'x', 'conv2d', 'float32');\n const $filter = convertToTensor(filter, 'filter', 'conv2d', 'float32');\n let x4D = $x;\n let reshapedTo4D = false;\n if ($x.rank === 3) {\n reshapedTo4D = true;\n x4D = reshape($x, [1, $x.shape[0], $x.shape[1], $x.shape[2]]);\n }\n util.assert(x4D.rank === 4, () => `Error in conv2d: input must be rank 4, but got rank ${x4D.rank}.`);\n util.assert($filter.rank === 4, () => `Error in conv2d: filter must be rank 4, but got rank ` +\n `${$filter.rank}.`);\n conv_util.checkPadOnDimRoundingMode('conv2d', pad, dimRoundingMode);\n const inDepth = dataFormat === 'NHWC' ? x4D.shape[3] : x4D.shape[1];\n util.assert(inDepth === $filter.shape[2], () => `Error in conv2d: depth of input (${inDepth}) must match ` +\n `input depth for filter ${$filter.shape[2]}.`);\n util.assert(conv_util.eitherStridesOrDilationsAreOne(strides, dilations), () => 'Error in conv2D: Either strides or dilations must be 1. ' +\n `Got strides ${strides} and dilations '${dilations}'`);\n const inputs = { x: x4D, filter: $filter };\n const attrs = { strides, pad, dataFormat, dilations, dimRoundingMode };\n // tslint:disable-next-line: no-unnecessary-type-assertion\n const res = ENGINE.runKernel(Conv2D, inputs, attrs);\n if (reshapedTo4D) {\n return reshape(res, [res.shape[1], res.shape[2], res.shape[3]]);\n }\n return res;\n}\nexport const conv2d = op({ conv2d_ });\n//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY29udjJkLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vLi4vdGZqcy1jb3JlL3NyYy9vcHMvY29udjJkLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBOzs7Ozs7Ozs7Ozs7Ozs7R0FlRztBQUNILE9BQU8sRUFBQyxNQUFNLEVBQUMsTUFBTSxXQUFXLENBQUM7QUFDakMsT0FBTyxFQUFDLE1BQU0sRUFBNEIsTUFBTSxpQkFBaUIsQ0FBQztBQUlsRSxPQUFPLEVBQUMsZUFBZSxFQUFDLE1BQU0sb0JBQW9CLENBQUM7QUFFbkQsT0FBTyxLQUFLLElBQUksTUFBTSxTQUFTLENBQUM7QUFFaEMsT0FBTyxLQUFLLFNBQVMsTUFBTSxhQUFhLENBQUM7QUFDekMsT0FBTyxFQUFDLEVBQUUsRUFBQyxNQUFNLGFBQWEsQ0FBQztBQUMvQixPQUFPLEVBQUMsT0FBTyxFQUFDLE1BQU0sV0FBVyxDQUFDO0FBRWxDOzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7O0dBK0JHO0FBQ0gsU0FBUyxPQUFPLENBQ1osQ0FBZSxFQUFFLE1BQTJCLEVBQzVDLE9BQWdDLEVBQ2hDLEdBQW9ELEVBQ3BELGFBQTRCLE1BQU0sRUFDbEMsWUFBcUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLEVBQzNDLGVBQXdDO0lBQzFDLE1BQU0sRUFBRSxHQUFHLGVBQWUsQ0FBQyxDQUFDLEVBQUUsR0FBRyxFQUFFLFFBQVEsRUFBRSxTQUFTLENBQUMsQ0FBQztJQUN4RCxNQUFNLE9BQU8sR0FBRyxlQUFlLENBQUMsTUFBTSxFQUFFLFFBQVEsRUFBRSxRQUFRLEVBQUUsU0FBUyxDQUFDLENBQUM7SUFFdkUsSUFBSSxHQUFHLEdBQUcsRUFBYyxDQUFDO0lBQ3pCLElBQUksWUFBWSxHQUFHLEtBQUssQ0FBQztJQUV6QixJQUFJLEVBQUUsQ0FBQyxJQUFJLEtBQUssQ0FBQyxFQUFFO1FBQ2pCLFlBQVksR0FBRyxJQUFJLENBQUM7UUFDcEIsR0FBRyxHQUFHLE9BQU8sQ0FBQyxFQUFFLEVBQUUsQ0FBQyxDQUFDLEVBQUUsRUFBRSxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUMsRUFBRSxFQUFFLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQyxFQUFFLEVBQUUsQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDO0tBQy9EO0lBRUQsSUFBSSxDQUFDLE1BQU0sQ0FDUCxHQUFHLENBQUMsSUFBSSxLQUFLLENBQUMsRUFDZCxHQUFHLEVBQUUsQ0FBQyx1REFBdUQsR0FBRyxDQUFDLElBQUksR0FBRyxDQUFDLENBQUM7SUFDOUUsSUFBSSxDQUFDLE1BQU0sQ0FDUCxPQUFPLENBQUMsSUFBSSxLQUFLLENBQUMsRUFDbEIsR0FBRyxFQUFFLENBQUMsdURBQXVEO1FBQ3pELEdBQUcsT0FBTyxDQUFDLElBQUksR0FBRyxDQUFDLENBQUM7SUFDNUIsU0FBUyxDQUFDLHlCQUF5QixDQUFDLFFBQVEsRUFBRSxHQUFHLEVBQUUsZUFBZSxDQUFDLENBQUM7SUFDcEUsTUFBTSxPQUFPLEdBQUcsVUFBVSxLQUFLLE1BQU0sQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUMsQ0FBQztJQUNwRSxJQUFJLENBQUMsTUFBTSxDQUNQLE9BQU8sS0FBSyxPQUFPLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQyxFQUM1QixHQUFHLEVBQUUsQ0FBQyxvQ0FBb0MsT0FBTyxlQUFlO1FBQzVELDBCQUEwQixPQUFPLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQztJQUN2RCxJQUFJLENBQUMsTUFBTSxDQUNQLFNBQVMsQ0FBQyw4QkFBOEIsQ0FBQyxPQUFPLEVBQUUsU0FBUyxDQUFDLEVBQzVELEdBQUcsRUFBRSxDQUFDLDBEQUEwRDtRQUM1RCxlQUFlLE9BQU8sbUJBQW1CLFNBQVMsR0FBRyxDQUFDLENBQUM7SUFFL0QsTUFBTSxNQUFNLEdBQWlCLEVBQUMsQ0FBQyxFQUFFLEdBQUcsRUFBRSxNQUFNLEVBQUUsT0FBTyxFQUFDLENBQUM7SUFDdkQsTUFBTSxLQUFLLEdBQ08sRUFBQyxPQUFPLEVBQUUsR0FBRyxFQUFFLFVBQVUsRUFBRSxTQUFTLEVBQUUsZUFBZSxFQUFDLENBQUM7SUFFekUsMERBQTBEO0lBQzFELE1BQU0sR0FBRyxHQUFHLE1BQU0sQ0FBQyxTQUFTLENBQ1osTUFBTSxFQUFFLE1BQThCLEVBQ3RDLEtBQTJCLENBQU0sQ0FBQztJQUVsRCxJQUFJLFlBQVksRUFBRTtRQUNoQixPQUFPLE9BQU8sQ0FBQyxHQUFHLEVBQUUsQ0FBQyxHQUFHLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQyxFQUFFLEdBQUcsQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDLEVBQUUsR0FBRyxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFNLENBQUM7S0FDdEU7SUFDRCxPQUFPLEdBQUcsQ0FBQztBQUNiLENBQUM7QUFFRCxNQUFNLENBQUMsTUFBTSxNQUFNLEdBQUcsRUFBRSxDQUFDLEVBQUMsT0FBTyxFQUFDLENBQUMsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbIi8qKlxuICogQGxpY2Vuc2VcbiAqIENvcHlyaWdodCAyMDIwIEdvb2dsZSBMTEMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuXG4gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgXCJMaWNlbnNlXCIpO1xuICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLlxuICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0XG4gKlxuICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wXG4gKlxuICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZVxuICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gXCJBUyBJU1wiIEJBU0lTLFxuICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuXG4gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kXG4gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS5cbiAqID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4gKi9cbmltcG9ydCB7RU5HSU5FfSBmcm9tICcuLi9lbmdpbmUnO1xuaW1wb3J0IHtDb252MkQsIENvbnYyREF0dHJzLCBDb252MkRJbnB1dHN9IGZyb20gJy4uL2tlcm5lbF9uYW1lcyc7XG5pbXBvcnQge05hbWVkQXR0ck1hcH0gZnJvbSAnLi4va2VybmVsX3JlZ2lzdHJ5JztcbmltcG9ydCB7VGVuc29yM0QsIFRlbnNvcjREfSBmcm9tICcuLi90ZW5zb3InO1xuaW1wb3J0IHtOYW1lZFRlbnNvck1hcH0gZnJvbSAnLi4vdGVuc29yX3R5cGVzJztcbmltcG9ydCB7Y29udmVydFRvVGVuc29yfSBmcm9tICcuLi90ZW5zb3JfdXRpbF9lbnYnO1xuaW1wb3J0IHtUZW5zb3JMaWtlfSBmcm9tICcuLi90eXBlcyc7XG5pbXBvcnQgKiBhcyB1dGlsIGZyb20gJy4uL3V0aWwnO1xuXG5pbXBvcnQgKiBhcyBjb252X3V0aWwgZnJvbSAnLi9jb252X3V0aWwnO1xuaW1wb3J0IHtvcH0gZnJvbSAnLi9vcGVyYXRpb24nO1xuaW1wb3J0IHtyZXNoYXBlfSBmcm9tICcuL3Jlc2hhcGUnO1xuXG4vKipcbiAqIENvbXB1dGVzIGEgMkQgY29udm9sdXRpb24gb3ZlciB0aGUgaW5wdXQgeC5cbiAqXG4gKiBAcGFyYW0geCBUaGUgaW5wdXQgdGVuc29yLCBvZiByYW5rIDQgb3IgcmFuayAzLCBvZiBzaGFwZVxuICogICAgIGBbYmF0Y2gsIGhlaWdodCwgd2lkdGgsIGluQ2hhbm5lbHNdYC4gSWYgcmFuayAzLCBiYXRjaCBvZiAxIGlzXG4gKiBhc3N1bWVkLlxuICogQHBhcmFtIGZpbHRlciBUaGUgZmlsdGVyLCByYW5rIDQsIG9mIHNoYXBlXG4gKiAgICAgYFtmaWx0ZXJIZWlnaHQsIGZpbHRlcldpZHRoLCBpbkRlcHRoLCBvdXREZXB0aF1gLlxuICogQHBhcmFtIHN0cmlkZXMgVGhlIHN0cmlkZXMgb2YgdGhlIGNvbnZvbHV0aW9uOiBgW3N0cmlkZUhlaWdodCxcbiAqIHN0cmlkZVdpZHRoXWAuXG4gKiBAcGFyYW0gcGFkIFRoZSB0eXBlIG9mIHBhZGRpbmcgYWxnb3JpdGhtLlxuICogICAgLSBgc2FtZWAgYW5kIHN0cmlkZSAxOiBvdXRwdXQgd2lsbCBiZSBvZiBzYW1lIHNpemUgYXMgaW5wdXQsXG4gKiAgICAgICByZWdhcmRsZXNzIG9mIGZpbHRlciBzaXplLlxuICogICAgLSBgdmFsaWRgOiBvdXRwdXQgd2lsbCBiZSBzbWFsbGVyIHRoYW4gaW5wdXQgaWYgZmlsdGVyIGlzIGxhcmdlclxuICogICAgICAgdGhhbiAxeDEuXG4gKiAgIC0gRm9yIG1vcmUgaW5mbywgc2VlIHRoaXMgZ3VpZGU6XG4gKiAgICAgW2h0dHBzOi8vd3d3LnRlbnNvcmZsb3cub3JnL2FwaV9kb2NzL3B5dGhvbi90Zi9ubi9jb252b2x1dGlvbl0oXG4gKiAgICAgICAgICBodHRwczovL3d3dy50ZW5zb3JmbG93Lm9yZy9hcGlfZG9jcy9weXRob24vdGYvbm4vY29udm9sdXRpb24pXG4gKiBAcGFyYW0gZGF0YUZvcm1hdDogQW4gb3B0aW9uYWwgc3RyaW5nIGZyb206IFwiTkhXQ1wiLCBcIk5DSFdcIi4gRGVmYXVsdHMgdG9cbiAqICAgICBcIk5IV0NcIi4gU3BlY2lmeSB0aGUgZGF0YSBmb3JtYXQgb2YgdGhlIGlucHV0IGFuZCBvdXRwdXQgZGF0YS4gV2l0aCB0aGVcbiAqICAgICBkZWZhdWx0IGZvcm1hdCBcIk5IV0NcIiwgdGhlIGRhdGEgaXMgc3RvcmVkIGluIHRoZSBvcmRlciBvZjogW2JhdGNoLFxuICogICAgIGhlaWdodCwgd2lkdGgsIGNoYW5uZWxzXS5cbiAqIEBwYXJhbSBkaWxhdGlvbnMgVGhlIGRpbGF0aW9uIHJhdGVzOiBgW2RpbGF0aW9uSGVpZ2h0LCBkaWxhdGlvbldpZHRoXWBcbiAqICAgICBpbiB3aGljaCB3ZSBzYW1wbGUgaW5wdXQgdmFsdWVzIGFjcm9zcyB0aGUgaGVpZ2h0IGFuZCB3aWR0aCBkaW1lbnNpb25zXG4gKiAgICAgaW4gYXRyb3VzIGNvbnZvbHV0aW9uLiBEZWZhdWx0cyB0byBgWzEsIDFdYC4gSWYgYGRpbGF0aW9uc2AgaXMgYSBzaW5nbGVcbiAqICAgICBudW1iZXIsIHRoZW4gYGRpbGF0aW9uSGVpZ2h0ID09IGRpbGF0aW9uV2lkdGhgLiBJZiBpdCBpcyBncmVhdGVyIHRoYW5cbiAqICAgICAxLCB0aGVuIGFsbCB2YWx1ZXMgb2YgYHN0cmlkZXNgIG11c3QgYmUgMS5cbiAqIEBwYXJhbSBkaW1Sb3VuZGluZ01vZGUgQSBzdHJpbmcgZnJvbTogJ2NlaWwnLCAncm91bmQnLCAnZmxvb3InLiBJZiBub25lIGlzXG4gKiAgICAgcHJvdmlkZWQsIGl0IHdpbGwgZGVmYXVsdCB0byB0cnVuY2F0ZS5cbiAqXG4gKiBAZG9jIHtoZWFkaW5nOiAnT3BlcmF0aW9ucycsIHN1YmhlYWRpbmc6ICdDb252b2x1dGlvbid9XG4gKi9cbmZ1bmN0aW9uIGNvbnYyZF88VCBleHRlbmRzIFRlbnNvcjNEfFRlbnNvcjREPihcbiAgICB4OiBUfFRlbnNvckxpa2UsIGZpbHRlcjogVGVuc29yNER8VGVuc29yTGlrZSxcbiAgICBzdHJpZGVzOiBbbnVtYmVyLCBudW1iZXJdfG51bWJlcixcbiAgICBwYWQ6ICd2YWxpZCd8J3NhbWUnfG51bWJlcnxjb252X3V0aWwuRXhwbGljaXRQYWRkaW5nLFxuICAgIGRhdGFGb3JtYXQ6ICdOSFdDJ3wnTkNIVycgPSAnTkhXQycsXG4gICAgZGlsYXRpb25zOiBbbnVtYmVyLCBudW1iZXJdfG51bWJlciA9IFsxLCAxXSxcbiAgICBkaW1Sb3VuZGluZ01vZGU/OiAnZmxvb3InfCdyb3VuZCd8J2NlaWwnKTogVCB7XG4gIGNvbnN0ICR4ID0gY29udmVydFRvVGVuc29yKHgsICd4JywgJ2NvbnYyZCcsICdmbG9hdDMyJyk7XG4gIGNvbnN0ICRmaWx0ZXIgPSBjb252ZXJ0VG9UZW5zb3IoZmlsdGVyLCAnZmlsdGVyJywgJ2NvbnYyZCcsICdmbG9hdDMyJyk7XG5cbiAgbGV0IHg0RCA9ICR4IGFzIFRlbnNvcjREO1xuICBsZXQgcmVzaGFwZWRUbzREID0gZmFsc2U7XG5cbiAgaWYgKCR4LnJhbmsgPT09IDMpIHtcbiAgICByZXNoYXBlZFRvNEQgPSB0cnVlO1xuICAgIHg0RCA9IHJlc2hhcGUoJHgsIFsxLCAkeC5zaGFwZVswXSwgJHguc2hhcGVbMV0sICR4LnNoYXBlWzJdXSk7XG4gIH1cblxuICB1dGlsLmFzc2VydChcbiAgICAgIHg0RC5yYW5rID09PSA0LFxuICAgICAgKCkgPT4gYEVycm9yIGluIGNvbnYyZDogaW5wdXQgbXVzdCBiZSByYW5rIDQsIGJ1dCBnb3QgcmFuayAke3g0RC5yYW5rfS5gKTtcbiAgdXRpbC5hc3NlcnQoXG4gICAgICAkZmlsdGVyLnJhbmsgPT09IDQsXG4gICAgICAoKSA9PiBgRXJyb3IgaW4gY29udjJkOiBmaWx0ZXIgbXVzdCBiZSByYW5rIDQsIGJ1dCBnb3QgcmFuayBgICtcbiAgICAgICAgICBgJHskZmlsdGVyLnJhbmt9LmApO1xuICBjb252X3V0aWwuY2hlY2tQYWRPbkRpbVJvdW5kaW5nTW9kZSgnY29udjJkJywgcGFkLCBkaW1Sb3VuZGluZ01vZGUpO1xuICBjb25zdCBpbkRlcHRoID0gZGF0YUZvcm1hdCA9PT0gJ05IV0MnID8geDRELnNoYXBlWzNdIDogeDRELnNoYXBlWzFdO1xuICB1dGlsLmFzc2VydChcbiAgICAgIGluRGVwdGggPT09ICRmaWx0ZXIuc2hhcGVbMl0sXG4gICAgICAoKSA9PiBgRXJyb3IgaW4gY29udjJkOiBkZXB0aCBvZiBpbnB1dCAoJHtpbkRlcHRofSkgbXVzdCBtYXRjaCBgICtcbiAgICAgICAgICBgaW5wdXQgZGVwdGggZm9yIGZpbHRlciAkeyRmaWx0ZXIuc2hhcGVbMl19LmApO1xuICB1dGlsLmFzc2VydChcbiAgICAgIGNvbnZfdXRpbC5laXRoZXJTdHJpZGVzT3JEaWxhdGlvbnNBcmVPbmUoc3RyaWRlcywgZGlsYXRpb25zKSxcbiAgICAgICgpID0+ICdFcnJvciBpbiBjb252MkQ6IEVpdGhlciBzdHJpZGVzIG9yIGRpbGF0aW9ucyBtdXN0IGJlIDEuICcgK1xuICAgICAgICAgIGBHb3Qgc3RyaWRlcyAke3N0cmlkZXN9IGFuZCBkaWxhdGlvbnMgJyR7ZGlsYXRpb25zfSdgKTtcblxuICBjb25zdCBpbnB1dHM6IENvbnYyRElucHV0cyA9IHt4OiB4NEQsIGZpbHRlcjogJGZpbHRlcn07XG4gIGNvbnN0IGF0dHJzOlxuICAgICAgQ29udjJEQXR0cnMgPSB7c3RyaWRlcywgcGFkLCBkYXRhRm9ybWF0LCBkaWxhdGlvbnMsIGRpbVJvdW5kaW5nTW9kZX07XG5cbiAgLy8gdHNsaW50OmRpc2FibGUtbmV4dC1saW5lOiBuby11bm5lY2Vzc2FyeS10eXBlLWFzc2VydGlvblxuICBjb25zdCByZXMgPSBFTkdJTkUucnVuS2VybmVsKFxuICAgICAgICAgICAgICAgICAgQ29udjJELCBpbnB1dHMgYXMge30gYXMgTmFtZWRUZW5zb3JNYXAsXG4gICAgICAgICAgICAgICAgICBhdHRycyBhcyB7fSBhcyBOYW1lZEF0dHJNYXApIGFzIFQ7XG5cbiAgaWYgKHJlc2hhcGVkVG80RCkge1xuICAgIHJldHVybiByZXNoYXBlKHJlcywgW3Jlcy5zaGFwZVsxXSwgcmVzLnNoYXBlWzJdLCByZXMuc2hhcGVbM11dKSBhcyBUO1xuICB9XG4gIHJldHVybiByZXM7XG59XG5cbmV4cG9ydCBjb25zdCBjb252MmQgPSBvcCh7Y29udjJkX30pO1xuIl19","/**\n * @license\n * Copyright 2020 Google LLC. All Rights Reserved.\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n * =============================================================================\n */\nimport { ENGINE } from '../engine';\nimport { Conv2DBackpropFilter } from '../kernel_names';\nimport * as util from '../util';\nimport * as conv_util from './conv_util';\nimport { op } from './operation';\nimport { reshape } from './reshape';\n/**\n * Computes the derivative of the filter of a 2D convolution.\n *\n * @param x The input tensor, of rank 4 or rank 3 of shape\n * [batch, height, width, inChannels]. If rank 3, batch of 1 is assumed.\n * @param dy The dy image, of rank 4 or rank 3, of shape\n * [batch, height, width, outDepth]. If rank 3, batch of 1 is assumed.\n * @param filterShape The shape of the filter, length 4,\n * [filterHeight, filterWidth, inDepth, outDepth].\n * @param strides The strides of the convolution: [strideHeight,\n * strideWidth].\n * @param pad A string from: 'same', 'valid'. The type of padding algorithm\n * used in the forward prop of the op.\n * @param dataFormat: An optional string from: \"NHWC\", \"NCHW\". Defaults to\n * \"NHWC\". Specify the data format of the input and output data. With the\n * default format \"NHWC\", the data is stored in the order of: [batch,\n * height, width, channels].\n * @param dimRoundingMode A string from: 'ceil', 'round', 'floor'. If none is\n * provided, it will default to truncate.\n */\nfunction conv2DBackpropFilter_(x, dy, filterShape, strides, pad, dataFormat = 'NHWC', dimRoundingMode) {\n let x4D = x;\n if (x.rank === 3) {\n x4D = reshape(x, [1, x.shape[0], x.shape[1], x.shape[2]]);\n }\n let dy4D = dy;\n if (dy4D.rank === 3) {\n dy4D = reshape(dy, [1, dy.shape[0], dy.shape[1], dy.shape[2]]);\n }\n util.assert(x4D.rank === 4, () => `Error in conv2dDerFilter: input must be rank 4, but got shape ` +\n `${x4D.shape}.`);\n util.assert(dy4D.rank === 4, () => `Error in conv2dDerFilter: dy must be rank 4, but got shape ` +\n `${dy4D.shape}.`);\n util.assert(filterShape.length === 4, () => `Error in conv2dDerFilter: filterShape must be length 4, but got ` +\n `${filterShape}.`);\n const inDepth = dataFormat === 'NHWC' ? x4D.shape[3] : x4D.shape[1];\n const outDepth = dataFormat === 'NHWC' ? dy4D.shape[3] : dy4D.shape[1];\n util.assert(inDepth === filterShape[2], () => `Error in conv2dDerFilter: depth of input ${inDepth}) must ` +\n `match input depth in filter (${filterShape[2]}.`);\n util.assert(outDepth === filterShape[3], () => `Error in conv2dDerFilter: depth of dy (${outDepth}) must ` +\n `match output depth for filter (${filterShape[3]}).`);\n conv_util.checkPadOnDimRoundingMode('conv2dDerFilter', pad, dimRoundingMode);\n const inputs = { x: x4D, dy: dy4D };\n const attrs = { strides, pad, dataFormat, dimRoundingMode, filterShape };\n // tslint:disable-next-line: no-unnecessary-type-assertion\n return ENGINE.runKernel(Conv2DBackpropFilter, inputs, attrs);\n}\nexport const conv2DBackpropFilter = op({ conv2DBackpropFilter_ });\n//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY29udjJkX2JhY2twcm9wX2ZpbHRlci5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uLy4uL3RmanMtY29yZS9zcmMvb3BzL2NvbnYyZF9iYWNrcHJvcF9maWx0ZXIudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUE7Ozs7Ozs7Ozs7Ozs7OztHQWVHO0FBQ0gsT0FBTyxFQUFDLE1BQU0sRUFBQyxNQUFNLFdBQVcsQ0FBQztBQUNqQyxPQUFPLEVBQUMsb0JBQW9CLEVBQXdELE1BQU0saUJBQWlCLENBQUM7QUFJNUcsT0FBTyxLQUFLLElBQUksTUFBTSxTQUFTLENBQUM7QUFFaEMsT0FBTyxLQUFLLFNBQVMsTUFBTSxhQUFhLENBQUM7QUFDekMsT0FBTyxFQUFDLEVBQUUsRUFBQyxNQUFNLGFBQWEsQ0FBQztBQUMvQixPQUFPLEVBQUMsT0FBTyxFQUFDLE1BQU0sV0FBVyxDQUFDO0FBRWxDOzs7Ozs7Ozs7Ozs7Ozs7Ozs7O0dBbUJHO0FBQ0gsU0FBUyxxQkFBcUIsQ0FDMUIsQ0FBSSxFQUFFLEVBQUssRUFBRSxXQUE2QyxFQUMxRCxPQUFnQyxFQUNoQyxHQUFvRCxFQUNwRCxhQUE0QixNQUFNLEVBQ2xDLGVBQXdDO0lBQzFDLElBQUksR0FBRyxHQUFHLENBQWEsQ0FBQztJQUN4QixJQUFJLENBQUMsQ0FBQyxJQUFJLEtBQUssQ0FBQyxFQUFFO1FBQ2hCLEdBQUcsR0FBRyxPQUFPLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQztLQUMzRDtJQUNELElBQUksSUFBSSxHQUFHLEVBQWMsQ0FBQztJQUMxQixJQUFJLElBQUksQ0FBQyxJQUFJLEtBQUssQ0FBQyxFQUFFO1FBQ25CLElBQUksR0FBRyxPQUFPLENBQUMsRUFBRSxFQUFFLENBQUMsQ0FBQyxFQUFFLEVBQUUsQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDLEVBQUUsRUFBRSxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUMsRUFBRSxFQUFFLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQztLQUNoRTtJQUNELElBQUksQ0FBQyxNQUFNLENBQ1AsR0FBRyxDQUFDLElBQUksS0FBSyxDQUFDLEVBQ2QsR0FBRyxFQUFFLENBQUMsZ0VBQWdFO1FBQ2xFLEdBQUcsR0FBRyxDQUFDLEtBQUssR0FBRyxDQUFDLENBQUM7SUFDekIsSUFBSSxDQUFDLE1BQU0sQ0FDUCxJQUFJLENBQUMsSUFBSSxLQUFLLENBQUMsRUFDZixHQUFHLEVBQUUsQ0FBQyw2REFBNkQ7UUFDL0QsR0FBRyxJQUFJLENBQUMsS0FBSyxHQUFHLENBQUMsQ0FBQztJQUMxQixJQUFJLENBQUMsTUFBTSxDQUNQLFdBQVcsQ0FBQyxNQUFNLEtBQUssQ0FBQyxFQUN4QixHQUFHLEVBQUUsQ0FBQyxrRUFBa0U7UUFDcEUsR0FBRyxXQUFXLEdBQUcsQ0FBQyxDQUFDO0lBQzNCLE1BQU0sT0FBTyxHQUFHLFVBQVUsS0FBSyxNQUFNLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDLENBQUM7SUFDcEUsTUFBTSxRQUFRLEdBQUcsVUFBVSxLQUFLLE1BQU0sQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUMsQ0FBQztJQUN2RSxJQUFJLENBQUMsTUFBTSxDQUNQLE9BQU8sS0FBSyxXQUFXLENBQUMsQ0FBQyxDQUFDLEVBQzFCLEdBQUcsRUFBRSxDQUFDLDRDQUE0QyxPQUFPLFNBQVM7UUFDOUQsZ0NBQWdDLFdBQVcsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUM7SUFDM0QsSUFBSSxDQUFDLE1BQU0sQ0FDUCxRQUFRLEtBQUssV0FBVyxDQUFDLENBQUMsQ0FBQyxFQUMzQixHQUFHLEVBQUUsQ0FBQywwQ0FBMEMsUUFBUSxTQUFTO1FBQzdELGtDQUFrQyxXQUFXLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDO0lBQzlELFNBQVMsQ0FBQyx5QkFBeUIsQ0FBQyxpQkFBaUIsRUFBRSxHQUFHLEVBQUUsZUFBZSxDQUFDLENBQUM7SUFDN0UsTUFBTSxNQUFNLEdBQStCLEVBQUMsQ0FBQyxFQUFFLEdBQUcsRUFBRSxFQUFFLEVBQUUsSUFBSSxFQUFDLENBQUM7SUFDOUQsTUFBTSxLQUFLLEdBQ1AsRUFBQyxPQUFPLEVBQUUsR0FBRyxFQUFFLFVBQVUsRUFBRSxlQUFlLEVBQUUsV0FBVyxFQUFDLENBQUM7SUFFN0QsMERBQTBEO0lBQzFELE9BQU8sTUFBTSxDQUFDLFNBQVMsQ0FDWixvQkFBb0IsRUFBRSxNQUE4QixFQUNwRCxLQUEyQixDQUFhLENBQUM7QUFDdEQsQ0FBQztBQUVELE1BQU0sQ0FBQyxNQUFNLG9CQUFvQixHQUFHLEVBQUUsQ0FBQyxFQUFDLHFCQUFxQixFQUFDLENBQUMsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbIi8qKlxuICogQGxpY2Vuc2VcbiAqIENvcHlyaWdodCAyMDIwIEdvb2dsZSBMTEMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuXG4gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgXCJMaWNlbnNlXCIpO1xuICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLlxuICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0XG4gKlxuICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wXG4gKlxuICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZVxuICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gXCJBUyBJU1wiIEJBU0lTLFxuICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuXG4gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kXG4gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS5cbiAqID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4gKi9cbmltcG9ydCB7RU5HSU5FfSBmcm9tICcuLi9lbmdpbmUnO1xuaW1wb3J0IHtDb252MkRCYWNrcHJvcEZpbHRlciwgQ29udjJEQmFja3Byb3BGaWx0ZXJBdHRycywgQ29udjJEQmFja3Byb3BGaWx0ZXJJbnB1dHN9IGZyb20gJy4uL2tlcm5lbF9uYW1lcyc7XG5pbXBvcnQge05hbWVkQXR0ck1hcH0gZnJvbSAnLi4va2VybmVsX3JlZ2lzdHJ5JztcbmltcG9ydCB7VGVuc29yM0QsIFRlbnNvcjREfSBmcm9tICcuLi90ZW5zb3InO1xuaW1wb3J0IHtOYW1lZFRlbnNvck1hcH0gZnJvbSAnLi4vdGVuc29yX3R5cGVzJztcbmltcG9ydCAqIGFzIHV0aWwgZnJvbSAnLi4vdXRpbCc7XG5cbmltcG9ydCAqIGFzIGNvbnZfdXRpbCBmcm9tICcuL2NvbnZfdXRpbCc7XG5pbXBvcnQge29wfSBmcm9tICcuL29wZXJhdGlvbic7XG5pbXBvcnQge3Jlc2hhcGV9IGZyb20gJy4vcmVzaGFwZSc7XG5cbi8qKlxuICogQ29tcHV0ZXMgdGhlIGRlcml2YXRpdmUgb2YgdGhlIGZpbHRlciBvZiBhIDJEIGNvbnZvbHV0aW9uLlxuICpcbiAqIEBwYXJhbSB4IFRoZSBpbnB1dCB0ZW5zb3IsIG9mIHJhbmsgNCBvciByYW5rIDMgb2Ygc2hhcGVcbiAqICAgICBbYmF0Y2gsIGhlaWdodCwgd2lkdGgsIGluQ2hhbm5lbHNdLiBJZiByYW5rIDMsIGJhdGNoIG9mIDEgaXMgYXNzdW1lZC5cbiAqIEBwYXJhbSBkeSBUaGUgZHkgaW1hZ2UsIG9mIHJhbmsgNCBvciByYW5rIDMsIG9mIHNoYXBlXG4gKiAgICAgW2JhdGNoLCBoZWlnaHQsIHdpZHRoLCBvdXREZXB0aF0uIElmIHJhbmsgMywgYmF0Y2ggb2YgMSBpcyBhc3N1bWVkLlxuICogQHBhcmFtIGZpbHRlclNoYXBlIFRoZSBzaGFwZSBvZiB0aGUgZmlsdGVyLCBsZW5ndGggNCxcbiAqICAgICBbZmlsdGVySGVpZ2h0LCBmaWx0ZXJXaWR0aCwgaW5EZXB0aCwgb3V0RGVwdGhdLlxuICogQHBhcmFtIHN0cmlkZXMgVGhlIHN0cmlkZXMgb2YgdGhlIGNvbnZvbHV0aW9uOiBbc3RyaWRlSGVpZ2h0LFxuICogc3RyaWRlV2lkdGhdLlxuICogQHBhcmFtIHBhZCBBIHN0cmluZyBmcm9tOiAnc2FtZScsICd2YWxpZCcuIFRoZSB0eXBlIG9mIHBhZGRpbmcgYWxnb3JpdGhtXG4gKiAgICAgdXNlZCBpbiB0aGUgZm9yd2FyZCBwcm9wIG9mIHRoZSBvcC5cbiAqIEBwYXJhbSBkYXRhRm9ybWF0OiBBbiBvcHRpb25hbCBzdHJpbmcgZnJvbTogXCJOSFdDXCIsIFwiTkNIV1wiLiBEZWZhdWx0cyB0b1xuICogICAgIFwiTkhXQ1wiLiBTcGVjaWZ5IHRoZSBkYXRhIGZvcm1hdCBvZiB0aGUgaW5wdXQgYW5kIG91dHB1dCBkYXRhLiBXaXRoIHRoZVxuICogICAgIGRlZmF1bHQgZm9ybWF0IFwiTkhXQ1wiLCB0aGUgZGF0YSBpcyBzdG9yZWQgaW4gdGhlIG9yZGVyIG9mOiBbYmF0Y2gsXG4gKiAgICAgaGVpZ2h0LCB3aWR0aCwgY2hhbm5lbHNdLlxuICogQHBhcmFtIGRpbVJvdW5kaW5nTW9kZSBBIHN0cmluZyBmcm9tOiAnY2VpbCcsICdyb3VuZCcsICdmbG9vcicuIElmIG5vbmUgaXNcbiAqICAgICBwcm92aWRlZCwgaXQgd2lsbCBkZWZhdWx0IHRvIHRydW5jYXRlLlxuICovXG5mdW5jdGlvbiBjb252MkRCYWNrcHJvcEZpbHRlcl88VCBleHRlbmRzIFRlbnNvcjNEfFRlbnNvcjREPihcbiAgICB4OiBULCBkeTogVCwgZmlsdGVyU2hhcGU6IFtudW1iZXIsIG51bWJlciwgbnVtYmVyLCBudW1iZXJdLFxuICAgIHN0cmlkZXM6IFtudW1iZXIsIG51bWJlcl18bnVtYmVyLFxuICAgIHBhZDogJ3ZhbGlkJ3wnc2FtZSd8bnVtYmVyfGNvbnZfdXRpbC5FeHBsaWNpdFBhZGRpbmcsXG4gICAgZGF0YUZvcm1hdDogJ05IV0MnfCdOQ0hXJyA9ICdOSFdDJyxcbiAgICBkaW1Sb3VuZGluZ01vZGU/OiAnZmxvb3InfCdyb3VuZCd8J2NlaWwnKTogVGVuc29yNEQge1xuICBsZXQgeDREID0geCBhcyBUZW5zb3I0RDtcbiAgaWYgKHgucmFuayA9PT0gMykge1xuICAgIHg0RCA9IHJlc2hhcGUoeCwgWzEsIHguc2hhcGVbMF0sIHguc2hhcGVbMV0sIHguc2hhcGVbMl1dKTtcbiAgfVxuICBsZXQgZHk0RCA9IGR5IGFzIFRlbnNvcjREO1xuICBpZiAoZHk0RC5yYW5rID09PSAzKSB7XG4gICAgZHk0RCA9IHJlc2hhcGUoZHksIFsxLCBkeS5zaGFwZVswXSwgZHkuc2hhcGVbMV0sIGR5LnNoYXBlWzJdXSk7XG4gIH1cbiAgdXRpbC5hc3NlcnQoXG4gICAgICB4NEQucmFuayA9PT0gNCxcbiAgICAgICgpID0+IGBFcnJvciBpbiBjb252MmREZXJGaWx0ZXI6IGlucHV0IG11c3QgYmUgcmFuayA0LCBidXQgZ290IHNoYXBlIGAgK1xuICAgICAgICAgIGAke3g0RC5zaGFwZX0uYCk7XG4gIHV0aWwuYXNzZXJ0KFxuICAgICAgZHk0RC5yYW5rID09PSA0LFxuICAgICAgKCkgPT4gYEVycm9yIGluIGNvbnYyZERlckZpbHRlcjogZHkgbXVzdCBiZSByYW5rIDQsIGJ1dCBnb3Qgc2hhcGUgYCArXG4gICAgICAgICAgYCR7ZHk0RC5zaGFwZX0uYCk7XG4gIHV0aWwuYXNzZXJ0KFxuICAgICAgZmlsdGVyU2hhcGUubGVuZ3RoID09PSA0LFxuICAgICAgKCkgPT4gYEVycm9yIGluIGNvbnYyZERlckZpbHRlcjogZmlsdGVyU2hhcGUgbXVzdCBiZSBsZW5ndGggNCwgYnV0IGdvdCBgICtcbiAgICAgICAgICBgJHtmaWx0ZXJTaGFwZX0uYCk7XG4gIGNvbnN0IGluRGVwdGggPSBkYXRhRm9ybWF0ID09PSAnTkhXQycgPyB4NEQuc2hhcGVbM10gOiB4NEQuc2hhcGVbMV07XG4gIGNvbnN0IG91dERlcHRoID0gZGF0YUZvcm1hdCA9PT0gJ05IV0MnID8gZHk0RC5zaGFwZVszXSA6IGR5NEQuc2hhcGVbMV07XG4gIHV0aWwuYXNzZXJ0KFxuICAgICAgaW5EZXB0aCA9PT0gZmlsdGVyU2hhcGVbMl0sXG4gICAgICAoKSA9PiBgRXJyb3IgaW4gY29udjJkRGVyRmlsdGVyOiBkZXB0aCBvZiBpbnB1dCAke2luRGVwdGh9KSBtdXN0IGAgK1xuICAgICAgICAgIGBtYXRjaCBpbnB1dCBkZXB0aCBpbiBmaWx0ZXIgKCR7ZmlsdGVyU2hhcGVbMl19LmApO1xuICB1dGlsLmFzc2VydChcbiAgICAgIG91dERlcHRoID09PSBmaWx0ZXJTaGFwZVszXSxcbiAgICAgICgpID0+IGBFcnJvciBpbiBjb252MmREZXJGaWx0ZXI6IGRlcHRoIG9mIGR5ICgke291dERlcHRofSkgbXVzdCBgICtcbiAgICAgICAgICBgbWF0Y2ggb3V0cHV0IGRlcHRoIGZvciBmaWx0ZXIgKCR7ZmlsdGVyU2hhcGVbM119KS5gKTtcbiAgY29udl91dGlsLmNoZWNrUGFkT25EaW1Sb3VuZGluZ01vZGUoJ2NvbnYyZERlckZpbHRlcicsIHBhZCwgZGltUm91bmRpbmdNb2RlKTtcbiAgY29uc3QgaW5wdXRzOiBDb252MkRCYWNrcHJvcEZpbHRlcklucHV0cyA9IHt4OiB4NEQsIGR5OiBkeTREfTtcbiAgY29uc3QgYXR0cnM6IENvbnYyREJhY2twcm9wRmlsdGVyQXR0cnMgPVxuICAgICAge3N0cmlkZXMsIHBhZCwgZGF0YUZvcm1hdCwgZGltUm91bmRpbmdNb2RlLCBmaWx0ZXJTaGFwZX07XG5cbiAgLy8gdHNsaW50OmRpc2FibGUtbmV4dC1saW5lOiBuby11bm5lY2Vzc2FyeS10eXBlLWFzc2VydGlvblxuICByZXR1cm4gRU5HSU5FLnJ1bktlcm5lbChcbiAgICAgICAgICAgICBDb252MkRCYWNrcHJvcEZpbHRlciwgaW5wdXRzIGFzIHt9IGFzIE5hbWVkVGVuc29yTWFwLFxuICAgICAgICAgICAgIGF0dHJzIGFzIHt9IGFzIE5hbWVkQXR0ck1hcCkgYXMgVGVuc29yNEQ7XG59XG5cbmV4cG9ydCBjb25zdCBjb252MkRCYWNrcHJvcEZpbHRlciA9IG9wKHtjb252MkRCYWNrcHJvcEZpbHRlcl99KTtcbiJdfQ==","/**\n * @license\n * Copyright 2020 Google LLC. All Rights Reserved.\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n * =============================================================================\n */\nimport { ENGINE } from '../engine';\nimport { Conv2DBackpropInput } from '../kernel_names';\nimport * as util from '../util';\nimport * as conv_util from './conv_util';\nimport { op } from './operation';\nimport { reshape } from './reshape';\n/**\n * Computes the derivative of the input of a 2D convolution.\n *\n * @param xShape The shape of the input: [batch, height, width, inDepth].\n * If length of 3, batch of 1 is assumed.\n * @param dy The derivative of the output, of rank 4 or rank 3 of shape\n * `[batch, outHeight, outWidth, outDepth]`. If rank 3, batch of 1 is\n * assumed.\n * @param filter The filter, rank 4, of shape\n * `[filterHeight, filterWidth, inDepth, outDepth]`.\n * @param strides The strides of the convolution: `[strideHeight,\n * strideWidth]`.\n * @param pad The type of padding algorithm used:\n * - `same` and stride 1: output will be of same size as input,\n * regardless of filter size.\n * - `valid`: output will be smaller than input if filter is larger\n * than 1x1.\n * @param dataFormat: An optional string from: \"NHWC\", \"NCHW\". Defaults to\n * \"NHWC\". Specify the data format of the input and output data. With the\n * default format \"NHWC\", the data is stored in the order of: [batch,\n * height, width, channels].\n * @param dimRoundingMode A string from: 'ceil', 'round', 'floor'. If none is\n * provided, it will default to truncate.\n */\nfunction conv2DBackpropInput_(xShape, dy, filter, strides, pad, dataFormat = 'NHWC', dimRoundingMode) {\n util.assert(xShape.length === dy.rank, () => `Length of inShape ` +\n `(${xShape.length}) and rank of dy (${dy.rank}) must match`);\n let xShape4D = xShape;\n let dy4D = dy;\n let reshapedTo4D = false;\n if (dy.rank === 3) {\n reshapedTo4D = true;\n dy4D = reshape(dy, [1, dy.shape[0], dy.shape[1], dy.shape[2]]);\n xShape4D = [1, xShape[0], xShape[1], xShape[2]];\n }\n util.assert(xShape4D.length === 4, () => `Error in conv2dDerInput: inShape must be length 4, but got length ` +\n `${xShape4D.length}.`);\n util.assert(dy4D.rank === 4, () => `Error in conv2dDerInput: dy must be rank 4, but got ` +\n `rank ${dy4D.rank}`);\n util.assert(filter.rank === 4, () => `Error in conv2dDerInput: filter must be rank 4, but got ` +\n `rank ${filter.rank}`);\n const inDepth = dataFormat === 'NHWC' ? xShape4D[3] : xShape4D[1];\n const outDepth = dataFormat === 'NHWC' ? dy4D.shape[3] : dy4D.shape[1];\n util.assert(inDepth === filter.shape[2], () => `Error in conv2dDerInput: depth of input (${inDepth}) must ` +\n `match input depth for filter ${filter.shape[2]}.`);\n util.assert(outDepth === filter.shape[3], () => `Error in conv2dDerInput: depth of output (${outDepth}) must ` +\n `match output depth for filter ${filter.shape[3]}.`);\n conv_util.checkPadOnDimRoundingMode('conv2dDerInput', pad, dimRoundingMode);\n const inputs = { dy: dy4D, filter };\n const attrs = { strides, pad, dataFormat, dimRoundingMode, inputShape: xShape4D };\n // tslint:disable-next-line: no-unnecessary-type-assertion\n const res = ENGINE.runKernel(Conv2DBackpropInput, inputs, attrs);\n if (reshapedTo4D) {\n return reshape(res, [res.shape[1], res.shape[2], res.shape[3]]);\n }\n return res;\n}\nexport const conv2DBackpropInput = op({ conv2DBackpropInput_ });\n//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY29udjJkX2JhY2twcm9wX2lucHV0LmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vLi4vdGZqcy1jb3JlL3NyYy9vcHMvY29udjJkX2JhY2twcm9wX2lucHV0LnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBOzs7Ozs7Ozs7Ozs7Ozs7R0FlRztBQUNILE9BQU8sRUFBQyxNQUFNLEVBQUMsTUFBTSxXQUFXLENBQUM7QUFDakMsT0FBTyxFQUFDLG1CQUFtQixFQUFzRCxNQUFNLGlCQUFpQixDQUFDO0FBSXpHLE9BQU8sS0FBSyxJQUFJLE1BQU0sU0FBUyxDQUFDO0FBRWhDLE9BQU8sS0FBSyxTQUFTLE1BQU0sYUFBYSxDQUFDO0FBQ3pDLE9BQU8sRUFBQyxFQUFFLEVBQUMsTUFBTSxhQUFhLENBQUM7QUFDL0IsT0FBTyxFQUFDLE9BQU8sRUFBQyxNQUFNLFdBQVcsQ0FBQztBQUVsQzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7R0F1Qkc7QUFDSCxTQUFTLG9CQUFvQixDQUN6QixNQUFpRSxFQUFFLEVBQUssRUFDeEUsTUFBZ0IsRUFBRSxPQUFnQyxFQUNsRCxHQUFvRCxFQUNwRCxhQUE0QixNQUFNLEVBQ2xDLGVBQXdDO0lBQzFDLElBQUksQ0FBQyxNQUFNLENBQ1AsTUFBTSxDQUFDLE1BQU0sS0FBSyxFQUFFLENBQUMsSUFBSSxFQUN6QixHQUFHLEVBQUUsQ0FBQyxvQkFBb0I7UUFDdEIsSUFBSSxNQUFNLENBQUMsTUFBTSxxQkFBcUIsRUFBRSxDQUFDLElBQUksY0FBYyxDQUFDLENBQUM7SUFFckUsSUFBSSxRQUFRLEdBQUcsTUFBMEMsQ0FBQztJQUMxRCxJQUFJLElBQUksR0FBRyxFQUFjLENBQUM7SUFDMUIsSUFBSSxZQUFZLEdBQUcsS0FBSyxDQUFDO0lBQ3pCLElBQUksRUFBRSxDQUFDLElBQUksS0FBSyxDQUFDLEVBQUU7UUFDakIsWUFBWSxHQUFHLElBQUksQ0FBQztRQUNwQixJQUFJLEdBQUcsT0FBTyxDQUFD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bGljZW5zZVxuICogQ29weXJpZ2h0IDIwMjAgR29vZ2xlIExMQy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC5cbiAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSBcIkxpY2Vuc2VcIik7XG4gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuXG4gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXRcbiAqXG4gKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjBcbiAqXG4gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlXG4gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiBcIkFTIElTXCIgQkFTSVMsXG4gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC5cbiAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmRcbiAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLlxuICogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbiAqL1xuaW1wb3J0IHtFTkdJTkV9IGZyb20gJy4uL2VuZ2luZSc7XG5pbXBvcnQge0NvbnYyREJhY2twcm9wSW5wdXQsIENvbnYyREJhY2twcm9wSW5wdXRBdHRycywgQ29udjJEQmFja3Byb3BJbnB1dElucHV0c30gZnJvbSAnLi4va2VybmVsX25hbWVzJztcbmltcG9ydCB7TmFtZWRBdHRyTWFwfSBmcm9tICcuLi9rZXJuZWxfcmVnaXN0cnknO1xuaW1wb3J0IHtUZW5zb3IzRCwgVGVuc29yNER9IGZyb20gJy4uL3RlbnNvcic7XG5pbXBvcnQge05hbWVkVGVuc29yTWFwfSBmcm9tICcuLi90ZW5zb3JfdHlwZXMnO1xuaW1wb3J0ICogYXMgdXRpbCBmcm9tICcuLi91dGlsJztcblxuaW1wb3J0ICogYXMgY29udl91dGlsIGZyb20gJy4vY29udl91dGlsJztcbmltcG9ydCB7b3B9IGZyb20gJy4vb3BlcmF0aW9uJztcbmltcG9ydCB7cmVzaGFwZX0gZnJvbSAnLi9yZXNoYXBlJztcblxuLyoqXG4gKiBDb21wdXRlcyB0aGUgZGVyaXZhdGl2ZSBvZiB0aGUgaW5wdXQgb2YgYSAyRCBjb252b2x1dGlvbi5cbiAqXG4gKiBAcGFyYW0geFNoYXBlIFRoZSBzaGFwZSBvZiB0aGUgaW5wdXQ6IFtiYXRjaCwgaGVpZ2h0LCB3aWR0aCwgaW5EZXB0aF0uXG4gKiBJZiBsZW5ndGggb2YgMywgYmF0Y2ggb2YgMSBpcyBhc3N1bWVkLlxuICogQHBhcmFtIGR5IFRoZSBkZXJpdmF0aXZlIG9mIHRoZSBvdXRwdXQsIG9mIHJhbmsgNCBvciByYW5rIDMgb2Ygc2hhcGVcbiAqICAgYFtiYXRjaCwgb3V0SGVpZ2h0LCBvdXRXaWR0aCwgb3V0RGVwdGhdYC4gSWYgcmFuayAzLCBiYXRjaCBvZiAxIGlzXG4gKiBhc3N1bWVkLlxuICogQHBhcmFtIGZpbHRlciBUaGUgZmlsdGVyLCByYW5rIDQsIG9mIHNoYXBlXG4gKiAgICAgYFtmaWx0ZXJIZWlnaHQsIGZpbHRlcldpZHRoLCBpbkRlcHRoLCBvdXREZXB0aF1gLlxuICogQHBhcmFtIHN0cmlkZXMgVGhlIHN0cmlkZXMgb2YgdGhlIGNvbnZvbHV0aW9uOiBgW3N0cmlkZUhlaWdodCxcbiAqIHN0cmlkZVdpZHRoXWAuXG4gKiBAcGFyYW0gcGFkIFRoZSB0eXBlIG9mIHBhZGRpbmcgYWxnb3JpdGhtIHVzZWQ6XG4gKiAgICAtIGBzYW1lYCBhbmQgc3RyaWRlIDE6IG91dHB1dCB3aWxsIGJlIG9mIHNhbWUgc2l6ZSBhcyBpbnB1dCxcbiAqICAgICAgIHJlZ2FyZGxlc3Mgb2YgZmlsdGVyIHNpemUuXG4gKiAgICAtIGB2YWxpZGA6IG91dHB1dCB3aWxsIGJlIHNtYWxsZXIgdGhhbiBpbnB1dCBpZiBmaWx0ZXIgaXMgbGFyZ2VyXG4gKiAgICAgICB0aGFuIDF4MS5cbiAqIEBwYXJhbSBkYXRhRm9ybWF0OiBBbiBvcHRpb25hbCBzdHJpbmcgZnJvbTogXCJOSFdDXCIsIFwiTkNIV1wiLiBEZWZhdWx0cyB0b1xuICogICAgIFwiTkhXQ1wiLiBTcGVjaWZ5IHRoZSBkYXRhIGZvcm1hdCBvZiB0aGUgaW5wdXQgYW5kIG91dHB1dCBkYXRhLiBXaXRoIHRoZVxuICogICAgIGRlZmF1bHQgZm9ybWF0IFwiTkhXQ1wiLCB0aGUgZGF0YSBpcyBzdG9yZWQgaW4gdGhlIG9yZGVyIG9mOiBbYmF0Y2gsXG4gKiAgICAgaGVpZ2h0LCB3aWR0aCwgY2hhbm5lbHNdLlxuICogQHBhcmFtIGRpbVJvdW5kaW5nTW9kZSBBIHN0cmluZyBmcm9tOiAnY2VpbCcsICdyb3VuZCcsICdmbG9vcicuIElmIG5vbmUgaXNcbiAqICAgICBwcm92aWRlZCwgaXQgd2lsbCBkZWZhdWx0IHRvIHRydW5jYXRlLlxuICovXG5mdW5jdGlvbiBjb252MkRCYWNrcHJvcElucHV0XzxUIGV4dGVuZHMgVGVuc29yM0R8VGVuc29yNEQ+KFxuICAgIHhTaGFwZTogW251bWJlciwgbnVtYmVyLCBudW1iZXIsIG51bWJlcl18W251bWJlciwgbnVtYmVyLCBudW1iZXJdLCBkeTogVCxcbiAgICBmaWx0ZXI6IFRlbnNvcjRELCBzdHJpZGVzOiBbbnVtYmVyLCBudW1iZXJdfG51bWJlcixcbiAgICBwYWQ6ICd2YWxpZCd8J3NhbWUnfG51bWJlcnxjb252X3V0aWwuRXhwbGljaXRQYWRkaW5nLFxuICAgIGRhdGFGb3JtYXQ6ICdOSFdDJ3wnTkNIVycgPSAnTkhXQycsXG4gICAgZGltUm91bmRpbmdNb2RlPzogJ2Zsb29yJ3wncm91bmQnfCdjZWlsJyk6IFQge1xuICB1dGlsLmFzc2VydChcbiAgICAgIHhTaGFwZS5sZW5ndGggPT09IGR5LnJhbmssXG4gICAgICAoKSA9PiBgTGVuZ3RoIG9mIGluU2hhcGUgYCArXG4gICAgICAgICAgYCgke3hTaGFwZS5sZW5ndGh9KSBhbmQgcmFuayBvZiBkeSAoJHtkeS5yYW5rfSkgbXVzdCBtYXRjaGApO1xuXG4gIGxldCB4U2hhcGU0RCA9IHhTaGFwZSBhcyBbbnVtYmVyLCBudW1iZXIsIG51bWJlciwgbnVtYmVyXTtcbiAgbGV0IGR5NEQgPSBkeSBhcyBUZW5zb3I0RDtcbiAgbGV0IHJlc2hhcGVkVG80RCA9IGZhbHNlO1xuICBpZiAoZHkucmFuayA9PT0gMykge1xuICAgIHJlc2hhcGVkVG80RCA9IHRydWU7XG4gICAgZHk0RCA9IHJlc2hhcGUoZHksIFsxLCBkeS5zaGFwZVswXSwgZHkuc2hhcGVbMV0sIGR5LnNoYXBlWzJdXSk7XG4gICAgeFNoYXBlNEQgPSBbMSwgeFNoYXBlWzBdLCB4U2hhcGVbMV0sIHhTaGFwZVsyXV07XG4gIH1cblxuICB1dGlsLmFzc2VydChcbiAgICAgIHhTaGFwZTRELmxlbmd0aCA9PT0gNCxcbiAgICAgICgpID0+XG4gICAgICAgICAgYEVycm9yIGluIGNvbnYyZERlcklucHV0OiBpblNoYXBlIG11c3QgYmUgbGVuZ3RoIDQsIGJ1dCBnb3QgbGVuZ3RoIGAgK1xuICAgICAgICAgIGAke3hTaGFwZTRELmxlbmd0aH0uYCk7XG4gIHV0aWwuYXNzZXJ0KFxuICAgICAgZHk0RC5yYW5rID09PSA0LFxuICAgICAgKCkgPT4gYEVycm9yIGluIGNvbnYyZERlcklucHV0OiBkeSBtdXN0IGJlIHJhbmsgNCwgYnV0IGdvdCBgICtcbiAgICAgICAgICBgcmFuayAke2R5NEQucmFua31gKTtcbiAgdXRpbC5hc3NlcnQoXG4gICAgICBmaWx0ZXIucmFuayA9PT0gNCxcbiAgICAgICgpID0+IGBFcnJvciBpbiBjb252MmREZXJJbnB1dDogZmlsdGVyIG11c3QgYmUgcmFuayA0LCBidXQgZ290IGAgK1xuICAgICAgICAgIGByYW5rICR7ZmlsdGVyLnJhbmt9YCk7XG4gIGNvbnN0IGluRGVwdGggPSBkYXRhRm9ybWF0ID09PSAnTkhXQycgPyB4U2hhcGU0RFszXSA6IHhTaGFwZTREWzFdO1xuICBjb25zdCBvdXREZXB0aCA9IGRhdGFGb3JtYXQgPT09ICdOSFdDJyA/IGR5NEQuc2hhcGVbM10gOiBkeTRELnNoYXBlWzFdO1xuICB1dGlsLmFzc2VydChcbiAgICAgIGluRGVwdGggPT09IGZpbHRlci5zaGFwZVsyXSxcbiAgICAgICgpID0+IGBFcnJvciBpbiBjb252MmREZXJJbnB1dDogZGVwdGggb2YgaW5wdXQgKCR7aW5EZXB0aH0pIG11c3QgYCArXG4gICAgICAgICAgYG1hdGNoIGlucHV0IGRlcHRoIGZvciBmaWx0ZXIgJHtmaWx0ZXIuc2hhcGVbMl19LmApO1xuICB1dGlsLmFzc2VydChcbiAgICAgIG91dERlcHRoID09PSBmaWx0ZXIuc2hhcGVbM10sXG4gICAgICAoKSA9PiBgRXJyb3IgaW4gY29udjJkRGVySW5wdXQ6IGRlcHRoIG9mIG91dHB1dCAoJHtvdXREZXB0aH0pIG11c3QgYCArXG4gICAgICAgICAgYG1hdGNoIG91dHB1dCBkZXB0aCBmb3IgZmlsdGVyICR7ZmlsdGVyLnNoYXBlWzNdfS5gKTtcbiAgY29udl91dGlsLmNoZWNrUGFkT25EaW1Sb3VuZGluZ01vZGUoJ2NvbnYyZERlcklucHV0JywgcGFkLCBkaW1Sb3VuZGluZ01vZGUpO1xuICBjb25zdCBpbnB1dHM6IENvbnYyREJhY2twcm9wSW5wdXRJbnB1dHMgPSB7ZHk6IGR5NEQsIGZpbHRlcn07XG4gIGNvbnN0IGF0dHJzOiBDb252MkRCYWNrcHJvcElucHV0QXR0cnMgPVxuICAgICAge3N0cmlkZXMsIHBhZCwgZGF0YUZvcm1hdCwgZGltUm91bmRpbmdNb2RlLCBpbnB1dFNoYXBlOiB4U2hhcGU0RH07XG5cbiAgLy8gdHNsaW50OmRpc2FibGUtbmV4dC1saW5lOiBuby11bm5lY2Vzc2FyeS10eXBlLWFzc2VydGlvblxuICBjb25zdCByZXMgPSBFTkdJTkUucnVuS2VybmVsKFxuICAgICAgICAgICAgICAgICAgQ29udjJEQmFja3Byb3BJbnB1dCwgaW5wdXRzIGFzIHt9IGFzIE5hbWVkVGVuc29yTWFwLFxuICAgICAgICAgICAgICAgICAgYXR0cnMgYXMge30gYXMgTmFtZWRBdHRyTWFwKSBhcyBUO1xuXG4gIGlmIChyZXNoYXBlZFRvNEQpIHtcbiAgICByZXR1cm4gcmVzaGFwZShyZXMsIFtyZXMuc2hhcGVbMV0sIHJlcy5zaGFwZVsyXSwgcmVzLnNoYXBlWzNdXSkgYXMgVDtcbiAgfVxuICByZXR1cm4gcmVzO1xufVxuXG5leHBvcnQgY29uc3QgY29udjJEQmFja3Byb3BJbnB1dCA9IG9wKHtjb252MkRCYWNrcHJvcElucHV0X30pO1xuIl19","import { convertToTensor } from '../tensor_util_env';\nimport { conv2DBackpropInput } from './conv2d_backprop_input';\nimport { op } from './operation';\n/**\n * Computes the transposed 2D convolution of an image, also known as a\n * deconvolution.\n *\n * @param x The input image, of rank 4 or rank 3, of shape\n * `[batch, height, width, inDepth]`. If rank 3, batch of 1 is assumed.\n * @param filter The filter, rank 4, of shape\n * `[filterHeight, filterWidth, outDepth, inDepth]`.\n * `inDepth` must match `inDepth` in `x`.\n * @param outputShape Output shape, of rank 4 or rank 3:\n * `[batch, height, width, outDepth]`. If rank 3, batch of 1 is assumed.\n * @param strides The strides of the original convolution:\n * `[strideHeight, strideWidth]`.\n * @param pad The type of padding algorithm used in the non-transpose version\n * of the op.\n * @param dimRoundingMode A string from: 'ceil', 'round', 'floor'. If none is\n * provided, it will default to truncate.\n *\n * @doc {heading: 'Operations', subheading: 'Convolution'}\n */\nfunction conv2dTranspose_(x, filter, outputShape, strides, pad, dimRoundingMode) {\n const $x = convertToTensor(x, 'x', 'conv2dTranspose');\n const $filter = convertToTensor(filter, 'filter', 'conv2dTranspose');\n return conv2DBackpropInput(outputShape, $x, $filter, strides, pad, 'NHWC', dimRoundingMode);\n}\nexport const conv2dTranspose = op({ conv2dTranspose_ });\n//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY29udjJkX3RyYW5zcG9zZS5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uLy4uL3RmanMtY29yZS9zcmMvb3BzL2NvbnYyZF90cmFuc3Bvc2UudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBaUJBLE9BQU8sRUFBQyxlQUFlLEVBQUMsTUFBTSxvQkFBb0IsQ0FBQztBQUduRCxPQUFPLEVBQUMsbUJBQW1CLEVBQUMsTUFBTSx5QkFBeUIsQ0FBQztBQUU1RCxPQUFPLEVBQUMsRUFBRSxFQUFDLE1BQU0sYUFBYSxDQUFDO0FBRS9COzs7Ozs7Ozs7Ozs7Ozs7Ozs7O0dBbUJHO0FBQ0gsU0FBUyxnQkFBZ0IsQ0FDckIsQ0FBZSxFQUFFLE1BQTJCLEVBQzVDLFdBQXNFLEVBQ3RFLE9BQWdDLEVBQ2hDLEdBQTBDLEVBQzFDLGVBQXdDO0lBQzFDLE1BQU0sRUFBRSxHQUFHLGVBQWUsQ0FBQyxDQUFDLEVBQUUsR0FBRyxFQUFFLGlCQUFpQixDQUFDLENBQUM7SUFDdEQsTUFBTSxPQUFPLEdBQUcsZUFBZSxDQUFDLE1BQU0sRUFBRSxRQUFRLEVBQUUsaUJBQWlCLENBQUMsQ0FBQztJQUVyRSxPQUFPLG1CQUFtQixDQUN0QixXQUFXLEVBQUUsRUFBRSxFQUFFLE9BQU8sRUFBRSxPQUFPLEVBQUUsR0FBRyxFQUFFLE1BQU0sRUFBRSxlQUFlLENBQUMsQ0FBQztBQUN2RSxDQUFDO0FBRUQsTUFBTSxDQUFDLE1BQU0sZUFBZSxHQUFHLEVBQUUsQ0FBQyxFQUFDLGdCQUFnQixFQUFDLENBQUMsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbIi8qKlxuICogQGxpY2Vuc2VcbiAqIENvcHlyaWdodCAyMDIwIEdvb2dsZSBMTEMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuXG4gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgXCJMaWNlbnNlXCIpO1xuICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLlxuICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0XG4gKlxuICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wXG4gKlxuICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZVxuICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gXCJBUyBJU1wiIEJBU0lTLFxuICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuXG4gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kXG4gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS5cbiAqID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4gKi9cbmltcG9ydCB7VGVuc29yM0QsIFRlbnNvcjREfSBmcm9tICcuLi90ZW5zb3InO1xuaW1wb3J0IHtjb252ZXJ0VG9UZW5zb3J9IGZyb20gJy4uL3RlbnNvcl91dGlsX2Vudic7XG5pbXBvcnQge1RlbnNvckxpa2V9IGZyb20gJy4uL3R5cGVzJztcblxuaW1wb3J0IHtjb252MkRCYWNrcHJvcElucHV0fSBmcm9tICcuL2NvbnYyZF9iYWNrcHJvcF9pbnB1dCc7XG5pbXBvcnQge0V4cGxpY2l0UGFkZGluZ30gZnJvbSAnLi9jb252X3V0aWwnO1xuaW1wb3J0IHtvcH0gZnJvbSAnLi9vcGVyYXRpb24nO1xuXG4vKipcbiAqIENvbXB1dGVzIHRoZSB0cmFuc3Bvc2VkIDJEIGNvbnZvbHV0aW9uIG9mIGFuIGltYWdlLCBhbHNvIGtub3duIGFzIGFcbiAqIGRlY29udm9sdXRpb24uXG4gKlxuICogQHBhcmFtIHggVGhlIGlucHV0IGltYWdlLCBvZiByYW5rIDQgb3IgcmFuayAzLCBvZiBzaGFwZVxuICogICBgW2JhdGNoLCBoZWlnaHQsIHdpZHRoLCBpbkRlcHRoXWAuIElmIHJhbmsgMywgYmF0Y2ggb2YgMSBpcyBhc3N1bWVkLlxuICogQHBhcmFtIGZpbHRlciBUaGUgZmlsdGVyLCByYW5rIDQsIG9mIHNoYXBlXG4gKiAgICAgYFtmaWx0ZXJIZWlnaHQsIGZpbHRlcldpZHRoLCBvdXREZXB0aCwgaW5EZXB0aF1gLlxuICogICAgIGBpbkRlcHRoYCBtdXN0IG1hdGNoIGBpbkRlcHRoYCBpbiBgeGAuXG4gKiBAcGFyYW0gb3V0cHV0U2hhcGUgT3V0cHV0IHNoYXBlLCBvZiByYW5rIDQgb3IgcmFuayAzOlxuICogICAgIGBbYmF0Y2gsIGhlaWdodCwgd2lkdGgsIG91dERlcHRoXWAuIElmIHJhbmsgMywgYmF0Y2ggb2YgMSBpcyBhc3N1bWVkLlxuICogQHBhcmFtIHN0cmlkZXMgVGhlIHN0cmlkZXMgb2YgdGhlIG9yaWdpbmFsIGNvbnZvbHV0aW9uOlxuICogICAgIGBbc3RyaWRlSGVpZ2h0LCBzdHJpZGVXaWR0aF1gLlxuICogQHBhcmFtIHBhZCAgVGhlIHR5cGUgb2YgcGFkZGluZyBhbGdvcml0aG0gdXNlZCBpbiB0aGUgbm9uLXRyYW5zcG9zZSB2ZXJzaW9uXG4gKiAgICBvZiB0aGUgb3AuXG4gKiBAcGFyYW0gZGltUm91bmRpbmdNb2RlIEEgc3RyaW5nIGZyb206ICdjZWlsJywgJ3JvdW5kJywgJ2Zsb29yJy4gSWYgbm9uZSBpc1xuICogICAgIHByb3ZpZGVkLCBpdCB3aWxsIGRlZmF1bHQgdG8gdHJ1bmNhdGUuXG4gKlxuICogQGRvYyB7aGVhZGluZzogJ09wZXJhdGlvbnMnLCBzdWJoZWFkaW5nOiAnQ29udm9sdXRpb24nfVxuICovXG5mdW5jdGlvbiBjb252MmRUcmFuc3Bvc2VfPFQgZXh0ZW5kcyBUZW5zb3IzRHxUZW5zb3I0RD4oXG4gICAgeDogVHxUZW5zb3JMaWtlLCBmaWx0ZXI6IFRlbnNvcjREfFRlbnNvckxpa2UsXG4gICAgb3V0cHV0U2hhcGU6IFtudW1iZXIsIG51bWJlciwgbnVtYmVyLCBudW1iZXJdfFtudW1iZXIsIG51bWJlciwgbnVtYmVyXSxcbiAgICBzdHJpZGVzOiBbbnVtYmVyLCBudW1iZXJdfG51bWJlcixcbiAgICBwYWQ6ICd2YWxpZCd8J3NhbWUnfG51bWJlcnxFeHBsaWNpdFBhZGRpbmcsXG4gICAgZGltUm91bmRpbmdNb2RlPzogJ2Zsb29yJ3wncm91bmQnfCdjZWlsJyk6IFQge1xuICBjb25zdCAkeCA9IGNvbnZlcnRUb1RlbnNvcih4LCAneCcsICdjb252MmRUcmFuc3Bvc2UnKTtcbiAgY29uc3QgJGZpbHRlciA9IGNvbnZlcnRUb1RlbnNvcihmaWx0ZXIsICdmaWx0ZXInLCAnY29udjJkVHJhbnNwb3NlJyk7XG5cbiAgcmV0dXJuIGNvbnYyREJhY2twcm9wSW5wdXQoXG4gICAgICBvdXRwdXRTaGFwZSwgJHgsICRmaWx0ZXIsIHN0cmlkZXMsIHBhZCwgJ05IV0MnLCBkaW1Sb3VuZGluZ01vZGUpO1xufVxuXG5leHBvcnQgY29uc3QgY29udjJkVHJhbnNwb3NlID0gb3Aoe2NvbnYyZFRyYW5zcG9zZV99KTtcbiJdfQ==","/**\n * @license\n * Copyright 2020 Google LLC. All Rights Reserved.\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n * =============================================================================\n */\nimport { ENGINE } from '../engine';\nimport { Conv3DBackpropInputV2 } from '../kernel_names';\nimport * as util from '../util';\nimport { op } from './operation';\nimport { reshape } from './reshape';\n/**\n * Computes the derivative of the input of a 3D convolution.\n *\n * @param xShape The shape of the input: [batch, depth, height, width,\n * in_channels]. If length of 4, batch of 1 is assumed.\n * @param dy The derivative of the output, of rank 5 or rank 4 of shape\n * `[batch, outDepth, outHeight, outWidth, in_channels]`.\n * If rank 4, batch of 1 is assumed.\n * @param filter The filter, rank 5, of shape\n * `[filterDepth, filterHeight, filterWidth, inDepth, outDepth]`.\n * @param strides The strides of the convolution: `[strideDepth, strideHeight,\n * strideWidth]`.\n * @param pad The type of padding algorithm used:\n * - `same` and stride 1: output will be of same size as input,\n * regardless of filter size.\n * - `valid`: output will be smaller than input if filter is larger\n * than 1x1.\n */\nfunction conv3DBackpropInput_(xShape, dy, filter, strides, pad) {\n util.assert(xShape.length === dy.rank, () => `Length of inShape ` +\n `(${xShape.length}) and rank of dy (${dy.rank}) must match`);\n let xShape5D = xShape;\n let dy5D = dy;\n let reshapedTo5D = false;\n if (dy.rank === 4) {\n reshapedTo5D = true;\n dy5D = reshape(dy, [1, dy.shape[0], dy.shape[1], dy.shape[2], dy.shape[3]]);\n xShape5D = [1, xShape[0], xShape[1], xShape[2], xShape[3]];\n }\n const inDepth = xShape5D[4];\n const outDepth = dy5D.shape[4];\n util.assert(xShape5D.length === 5, () => `Error in conv3dDerInput: inShape must be length 5, but got length ` +\n `${xShape5D.length}.`);\n util.assert(dy5D.rank === 5, () => `Error in conv3dDerInput: dy must be rank 5, but got ` +\n `rank ${dy5D.rank}`);\n util.assert(filter.rank === 5, () => `Error in conv3dDerInput: filter must be rank 5, but got ` +\n `rank ${filter.rank}`);\n util.assert(inDepth === filter.shape[3], () => `Error in conv3dDerInput: depth of input (${inDepth}) must ` +\n `match input depth for filter ${filter.shape[3]}.`);\n util.assert(outDepth === filter.shape[4], () => `Error in conv3dDerInput: depth of output (${outDepth}) must ` +\n `match output depth for filter ${filter.shape[4]}.`);\n const inputs = { dy: dy5D, filter };\n const attrs = { pad, strides, inputShape: xShape5D };\n // tslint:disable-next-line: no-unnecessary-type-assertion\n const res = ENGINE.runKernel(Conv3DBackpropInputV2, inputs, attrs);\n if (reshapedTo5D) {\n return reshape(res, [res.shape[1], res.shape[2], res.shape[3], res.shape[4]]);\n }\n return res;\n}\nexport const conv3DBackpropInput = op({ conv3DBackpropInput_ });\n//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY29udjNkX2JhY2twcm9wX2lucHV0LmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vLi4vdGZqcy1jb3JlL3NyYy9vcHMvY29udjNkX2JhY2twcm9wX2lucHV0LnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBOzs7Ozs7Ozs7Ozs7Ozs7R0FlRztBQUNILE9BQU8sRUFBQyxNQUFNLEVBQUMsTUFBTSxXQUFXLENBQUM7QUFDakMsT0FBTyxFQUFDLHFCQUFxQixFQUEwRCxNQUFNLGlCQUFpQixDQUFDO0FBSS9HLE9BQU8sS0FBSyxJQUFJLE1BQU0sU0FBUyxDQUFDO0FBRWhDLE9BQU8sRUFBQyxFQUFFLEVBQUMsTUFBTSxhQUFhLENBQUM7QUFDL0IsT0FBTyxFQUFDLE9BQU8sRUFBQyxNQUFNLFdBQVcsQ0FBQztBQUVsQzs7Ozs7Ozs7Ozs7Ozs7Ozs7R0FpQkc7QUFDSCxTQUFTLG9CQUFvQixDQUN6QixNQUU2QyxFQUM3QyxFQUFLLEVBQUUsTUFBZ0IsRUFBRSxPQUF3QyxFQUNqRSxHQUFtQjtJQUNyQixJQUFJLENBQUMsTUFBTSxDQUNQLE1BQU0sQ0FBQyxNQUFNLEtBQUssRUFBRSxDQUFDLElBQUksRUFDekIsR0FBRyxFQUFFLENBQUMsb0JBQW9CO1FBQ3RCLElBQUksTUFBTSxDQUFDLE1BQU0scUJBQXFCLEVBQUUsQ0FBQyxJQUFJLGNBQWMsQ0FBQyxDQUFDO0lBRXJFLElBQUksUUFBUSxHQUFHLE1BQWtELENBQUM7SUFDbEUsSUFBSSxJQUFJLEdBQUcsRUFBYyxDQUFDO0lBQzFCLElBQUksWUFBWSxHQUFHLEtBQUssQ0FBQztJQUN6QixJQUFJLEVBQUUsQ0FBQyxJQUFJLEtBQUssQ0FBQyxFQUFFO1FBQ2pCLFlBQVksR0FBRyxJQUFJLENBQUM7UUFDcEIsSUFBSSxHQUFHLE9BQU8sQ0FBQyxFQUFFLEVBQUUsQ0FBQyxDQUFDLEVBQUUsRUFBRSxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUMsRUFBRSxFQUFFLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQyxFQUFFLEVBQUUsQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDLEVBQUUsRUFBRSxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUM7UUFDNUUsUUFBUSxHQUFHLENBQUMsQ0FBQyxFQUFFLE1BQU0sQ0FBQyxDQUFDLENBQUMsRUFBRSxNQUFNLENBQUMsQ0FBQyxDQUFDLEVBQUUsTUFBTSxDQUFDLENBQUMsQ0FBQyxFQUFFLE1BQU0sQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDO0tBQzVEO0lBRUQsTUFBTSxPQUFPLEdBQUcsUUFBUSxDQUFDLENBQUMsQ0FBQyxDQUFDO0lBQzVCLE1BQU0sUUFBUSxHQUFHLElBQUksQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDLENBQUM7SUFDL0IsSUFBSSxDQUFDLE1BQU0sQ0FDUCxRQUFRLENBQUMsTUFBTSxLQUFLLENBQUMsRUFDckIsR0FBRyxFQUFFLENBQ0Qsb0VBQW9FO1FBQ3BFLEdBQUcsUUFBUSxDQUFDLE1BQU0sR0FBRyxDQUFDLENBQUM7SUFDL0IsSUFBSSxDQUFDLE1BQU0sQ0FDUCxJQUFJLENBQUMsSUFBSSxLQUFLLENBQUMsRUFDZixHQUFHLEVBQUUsQ0FBQyxzREFBc0Q7UUFDeEQsUUFBUSxJQUFJLENBQUMsSUFBSSxFQUFFLENBQUMsQ0FBQztJQUM3QixJQUFJLENBQUMsTUFBTSxDQUNQLE1BQU0sQ0FBQyxJQUFJLEtBQUssQ0FBQyxFQUNqQixHQUFHLEVBQUUsQ0FBQywwREFBMEQ7UUFDNUQsUUFBUSxNQUFNLENBQUMsSUFBSSxFQUFFLENBQUMsQ0FBQztJQUMvQixJQUFJLENBQUMsTUFBTSxDQUNQLE9BQU8sS0FBSyxNQUFNLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQyxFQUMzQixHQUFHLEVBQUUsQ0FBQyw0Q0FBNEMsT0FBTyxTQUFTO1FBQzlELGdDQUFnQyxNQUFNLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQztJQUM1RCxJQUFJLENBQUMsTUFBTSxDQUNQLFFBQVEsS0FBSyxNQUFNLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQyxFQUM1QixHQUFHLEVBQUUsQ0FBQyw2Q0FBNkMsUUFBUSxTQUFTO1FBQ2hFLGlDQUFpQyxNQUFNLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQztJQUU3RCxNQUFNLE1BQU0sR0FBZ0MsRUFBQyxFQUFFLEVBQUUsSUFBSSxFQUFFLE1BQU0sRUFBQyxDQUFDO0lBRS9ELE1BQU0sS0FBSyxHQUNzQixFQUFDLEdBQUcsRUFBRSxPQUFPLEVBQUUsVUFBVSxFQUFFLFFBQVEsRUFBQyxDQUFDO0lBRXRFLDBEQUEwRDtJQUMxRCxNQUFNLEdBQUcsR0FBRyxNQUFNLENBQUMsU0FBUyxDQUNaLHFCQUFxQixFQUFFLE1BQThCLEVBQ3JELEtBQTJCLENBQU0sQ0FBQztJQUVsRCxJQUFJLFlBQVksRUFBRTtRQUNoQixPQUFPLE9BQU8sQ0FDSCxHQUFHLEVBQUUsQ0FBQyxHQUFHLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQyxFQUFFLEdBQUcsQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDLEVBQUUsR0FBRyxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUMsRUFBRSxHQUFHLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQ25FLENBQUM7S0FDUDtJQUNELE9BQU8sR0FBRyxDQUFDO0FBQ2IsQ0FBQztBQUVELE1BQU0sQ0FBQyxNQUFNLG1CQUFtQixHQUFHLEVBQUUsQ0FBQyxFQUFDLG9CQUFvQixFQUFDLENBQUMsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbIi8qKlxuICogQGxpY2Vuc2VcbiAqIENvcHlyaWdodCAyMDIwIEdvb2dsZSBMTEMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuXG4gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgXCJMaWNlbnNlXCIpO1xuICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLlxuICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0XG4gKlxuICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wXG4gKlxuICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZVxuICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gXCJBUyBJU1wiIEJBU0lTLFxuICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuXG4gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kXG4gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS5cbiAqID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4gKi9cbmltcG9ydCB7RU5HSU5FfSBmcm9tICcuLi9lbmdpbmUnO1xuaW1wb3J0IHtDb252M0RCYWNrcHJvcElucHV0VjIsIENvbnYzREJhY2twcm9wSW5wdXRWMkF0dHJzLCBDb252M0RCYWNrcHJvcElucHV0VjJJbnB1dHN9IGZyb20gJy4uL2tlcm5lbF9uYW1lcyc7XG5pbXBvcnQge05hbWVkQXR0ck1hcH0gZnJvbSAnLi4va2VybmVsX3JlZ2lzdHJ5JztcbmltcG9ydCB7VGVuc29yNEQsIFRlbnNvcjVEfSBmcm9tICcuLi90ZW5zb3InO1xuaW1wb3J0IHtOYW1lZFRlbnNvck1hcH0gZnJvbSAnLi4vdGVuc29yX3R5cGVzJztcbmltcG9ydCAqIGFzIHV0aWwgZnJvbSAnLi4vdXRpbCc7XG5cbmltcG9ydCB7b3B9IGZyb20gJy4vb3BlcmF0aW9uJztcbmltcG9ydCB7cmVzaGFwZX0gZnJvbSAnLi9yZXNoYXBlJztcblxuLyoqXG4gKiBDb21wdXRlcyB0aGUgZGVyaXZhdGl2ZSBvZiB0aGUgaW5wdXQgb2YgYSAzRCBjb252b2x1dGlvbi5cbiAqXG4gKiBAcGFyYW0geFNoYXBlIFRoZSBzaGFwZSBvZiB0aGUgaW5wdXQ6IFtiYXRjaCwgZGVwdGgsIGhlaWdodCwgd2lkdGgsXG4gKiBpbl9jaGFubmVsc10uIElmIGxlbmd0aCBvZiA0LCBiYXRjaCBvZiAxIGlzIGFzc3VtZWQuXG4gKiBAcGFyYW0gZHkgVGhlIGRlcml2YXRpdmUgb2YgdGhlIG91dHB1dCwgb2YgcmFuayA1IG9yIHJhbmsgNCBvZiBzaGFwZVxuICogICBgW2JhdGNoLCBvdXREZXB0aCwgb3V0SGVpZ2h0LCBvdXRXaWR0aCwgaW5fY2hhbm5lbHNdYC5cbiAqIElmIHJhbmsgNCwgYmF0Y2ggb2YgMSBpcyBhc3N1bWVkLlxuICogQHBhcmFtIGZpbHRlciBUaGUgZmlsdGVyLCByYW5rIDUsIG9mIHNoYXBlXG4gKiAgICAgYFtmaWx0ZXJEZXB0aCwgZmlsdGVySGVpZ2h0LCBmaWx0ZXJXaWR0aCwgaW5EZXB0aCwgb3V0RGVwdGhdYC5cbiAqIEBwYXJhbSBzdHJpZGVzIFRoZSBzdHJpZGVzIG9mIHRoZSBjb252b2x1dGlvbjogYFtzdHJpZGVEZXB0aCwgc3RyaWRlSGVpZ2h0LFxuICogc3RyaWRlV2lkdGhdYC5cbiAqIEBwYXJhbSBwYWQgVGhlIHR5cGUgb2YgcGFkZGluZyBhbGdvcml0aG0gdXNlZDpcbiAqICAgIC0gYHNhbWVgIGFuZCBzdHJpZGUgMTogb3V0cHV0IHdpbGwgYmUgb2Ygc2FtZSBzaXplIGFzIGlucHV0LFxuICogICAgICAgcmVnYXJkbGVzcyBvZiBmaWx0ZXIgc2l6ZS5cbiAqICAgIC0gYHZhbGlkYDogb3V0cHV0IHdpbGwgYmUgc21hbGxlciB0aGFuIGlucHV0IGlmIGZpbHRlciBpcyBsYXJnZXJcbiAqICAgICAgIHRoYW4gMXgxLlxuICovXG5mdW5jdGlvbiBjb252M0RCYWNrcHJvcElucHV0XzxUIGV4dGVuZHMgVGVuc29yNER8VGVuc29yNUQ+KFxuICAgIHhTaGFwZTpcbiAgICAgICAgW251bWJlciwgbnVtYmVyLCBudW1iZXIsIG51bWJlcixcbiAgICAgICAgIG51bWJlcl18W251bWJlciwgbnVtYmVyLCBudW1iZXIsIG51bWJlcl0sXG4gICAgZHk6IFQsIGZpbHRlcjogVGVuc29yNUQsIHN0cmlkZXM6IFtudW1iZXIsIG51bWJlciwgbnVtYmVyXXxudW1iZXIsXG4gICAgcGFkOiAndmFsaWQnfCdzYW1lJyk6IFQge1xuICB1dGlsLmFzc2VydChcbiAgICAgIHhTaGFwZS5sZW5ndGggPT09IGR5LnJhbmssXG4gICAgICAoKSA9PiBgTGVuZ3RoIG9mIGluU2hhcGUgYCArXG4gICAgICAgICAgYCgke3hTaGFwZS5sZW5ndGh9KSBhbmQgcmFuayBvZiBkeSAoJHtkeS5yYW5rfSkgbXVzdCBtYXRjaGApO1xuXG4gIGxldCB4U2hhcGU1RCA9IHhTaGFwZSBhcyBbbnVtYmVyLCBudW1iZXIsIG51bWJlciwgbnVtYmVyLCBudW1iZXJdO1xuICBsZXQgZHk1RCA9IGR5IGFzIFRlbnNvcjVEO1xuICBsZXQgcmVzaGFwZWRUbzVEID0gZmFsc2U7XG4gIGlmIChkeS5yYW5rID09PSA0KSB7XG4gICAgcmVzaGFwZWRUbzVEID0gdHJ1ZTtcbiAgICBkeTVEID0gcmVzaGFwZShkeSwgWzEsIGR5LnNoYXBlWzBdLCBkeS5zaGFwZVsxXSwgZHkuc2hhcGVbMl0sIGR5LnNoYXBlWzNdXSk7XG4gICAgeFNoYXBlNUQgPSBbMSwgeFNoYXBlWzBdLCB4U2hhcGVbMV0sIHhTaGFwZVsyXSwgeFNoYXBlWzNdXTtcbiAgfVxuXG4gIGNvbnN0IGluRGVwdGggPSB4U2hhcGU1RFs0XTtcbiAgY29uc3Qgb3V0RGVwdGggPSBkeTVELnNoYXBlWzRdO1xuICB1dGlsLmFzc2VydChcbiAgICAgIHhTaGFwZTVELmxlbmd0aCA9PT0gNSxcbiAgICAgICgpID0+XG4gICAgICAgICAgYEVycm9yIGluIGNvbnYzZERlcklucHV0OiBpblNoYXBlIG11c3QgYmUgbGVuZ3RoIDUsIGJ1dCBnb3QgbGVuZ3RoIGAgK1xuICAgICAgICAgIGAke3hTaGFwZTVELmxlbmd0aH0uYCk7XG4gIHV0aWwuYXNzZXJ0KFxuICAgICAgZHk1RC5yYW5rID09PSA1LFxuICAgICAgKCkgPT4gYEVycm9yIGluIGNvbnYzZERlcklucHV0OiBkeSBtdXN0IGJlIHJhbmsgNSwgYnV0IGdvdCBgICtcbiAgICAgICAgICBgcmFuayAke2R5NUQucmFua31gKTtcbiAgdXRpbC5hc3NlcnQoXG4gICAgICBmaWx0ZXIucmFuayA9PT0gNSxcbiAgICAgICgpID0+IGBFcnJvciBpbiBjb252M2REZXJJbnB1dDogZmlsdGVyIG11c3QgYmUgcmFuayA1LCBidXQgZ290IGAgK1xuICAgICAgICAgIGByYW5rICR7ZmlsdGVyLnJhbmt9YCk7XG4gIHV0aWwuYXNzZXJ0KFxuICAgICAgaW5EZXB0aCA9PT0gZmlsdGVyLnNoYXBlWzNdLFxuICAgICAgKCkgPT4gYEVycm9yIGluIGNvbnYzZERlcklucHV0OiBkZXB0aCBvZiBpbnB1dCAoJHtpbkRlcHRofSkgbXVzdCBgICtcbiAgICAgICAgICBgbWF0Y2ggaW5wdXQgZGVwdGggZm9yIGZpbHRlciAke2ZpbHRlci5zaGFwZVszXX0uYCk7XG4gIHV0aWwuYXNzZXJ0KFxuICAgICAgb3V0RGVwdGggPT09IGZpbHRlci5zaGFwZVs0XSxcbiAgICAgICgpID0+IGBFcnJvciBpbiBjb252M2REZXJJbnB1dDogZGVwdGggb2Ygb3V0cHV0ICgke291dERlcHRofSkgbXVzdCBgICtcbiAgICAgICAgICBgbWF0Y2ggb3V0cHV0IGRlcHRoIGZvciBmaWx0ZXIgJHtmaWx0ZXIuc2hhcGVbNF19LmApO1xuXG4gIGNvbnN0IGlucHV0czogQ29udjNEQmFja3Byb3BJbnB1dFYySW5wdXRzID0ge2R5OiBkeTVELCBmaWx0ZXJ9O1xuXG4gIGNvbnN0IGF0dHJzOlxuICAgICAgQ29udjNEQmFja3Byb3BJbnB1dFYyQXR0cnMgPSB7cGFkLCBzdHJpZGVzLCBpbnB1dFNoYXBlOiB4U2hhcGU1RH07XG5cbiAgLy8gdHNsaW50OmRpc2FibGUtbmV4dC1saW5lOiBuby11bm5lY2Vzc2FyeS10eXBlLWFzc2VydGlvblxuICBjb25zdCByZXMgPSBFTkdJTkUucnVuS2VybmVsKFxuICAgICAgICAgICAgICAgICAgQ29udjNEQmFja3Byb3BJbnB1dFYyLCBpbnB1dHMgYXMge30gYXMgTmFtZWRUZW5zb3JNYXAsXG4gICAgICAgICAgICAgICAgICBhdHRycyBhcyB7fSBhcyBOYW1lZEF0dHJNYXApIGFzIFQ7XG5cbiAgaWYgKHJlc2hhcGVkVG81RCkge1xuICAgIHJldHVybiByZXNoYXBlKFxuICAgICAgICAgICAgICAgcmVzLCBbcmVzLnNoYXBlWzFdLCByZXMuc2hhcGVbMl0sIHJlcy5zaGFwZVszXSwgcmVzLnNoYXBlWzRdXSkgYXNcbiAgICAgICAgVDtcbiAgfVxuICByZXR1cm4gcmVzO1xufVxuXG5leHBvcnQgY29uc3QgY29udjNEQmFja3Byb3BJbnB1dCA9IG9wKHtjb252M0RCYWNrcHJvcElucHV0X30pO1xuIl19","/**\n * @license\n * Copyright 2020 Google LLC. All Rights Reserved.\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n * =============================================================================\n */\nimport * as util from '../util';\n/**\n *\n * @param inputShape Input tensor shape is of the following dimensions:\n * `[batch, height, width, inChannels]`.\n * @param filterShape The filter shape is of the following dimensions:\n * `[filterHeight, filterWidth, depth]`.\n * @param strides The strides of the sliding window for each dimension of the\n * input tensor: `[strideHeight, strideWidth]`.\n * If `strides` is a single number,\n * then `strideHeight == strideWidth`.\n * @param pad The type of padding algorithm.\n * - `same` and stride 1: output will be of same size as input,\n * regardless of filter size.\n * - `valid`: output will be smaller than input if filter is larger\n * than 1*1x1.\n * - For more info, see this guide:\n * [https://www.tensorflow.org/api_docs/python/tf/nn/convolution](\n * https://www.tensorflow.org/api_docs/python/tf/nn/convolution)\n * @param dataFormat The data format of the input and output data.\n * Defaults to 'NHWC'.\n * @param dilations The dilation rates: `[dilationHeight, dilationWidth]`.\n * Defaults to `[1, 1]`. If `dilations` is a single number, then\n * `dilationHeight == dilationWidth`.\n */\nexport function computeDilation2DInfo(inputShape, filterShape, strides, pad, dataFormat = 'NHWC', dilations) {\n // `computerConv2DInfo` require filterShape to be in the dimension of:\n // `[filterHeight, filterWidth, depth, outDepth]`, dilation2d doesn't have\n // outDepth, it should have the same depth as the input.\n // Input shape: [batch, height, width, inChannels]\n const inputChannels = inputShape[3];\n const $filterShape = [...filterShape, inputChannels];\n const $dataFormat = convertConv2DDataFormat(dataFormat);\n return computeConv2DInfo(inputShape, $filterShape, strides, dilations, pad, null /* roundingMode */, null /* depthWise */, $dataFormat);\n}\nexport function computePool2DInfo(inShape, filterSize, strides, dilations, pad, roundingMode, dataFormat = 'channelsLast') {\n const [filterHeight, filterWidth] = parseTupleParam(filterSize);\n let filterShape;\n if (dataFormat === 'channelsLast') {\n filterShape = [filterHeight, filterWidth, inShape[3], inShape[3]];\n }\n else if (dataFormat === 'channelsFirst') {\n filterShape = [filterHeight, filterWidth, inShape[1], inShape[1]];\n }\n else {\n throw new Error(`Unknown dataFormat ${dataFormat}`);\n }\n return computeConv2DInfo(inShape, filterShape, strides, dilations, pad, roundingMode, false, dataFormat);\n}\n/**\n * Computes the information for a forward pass of a pooling3D operation.\n */\nexport function computePool3DInfo(inShape, filterSize, strides, dilations, pad, roundingMode, dataFormat = 'NDHWC') {\n const [filterDepth, filterHeight, filterWidth] = parse3TupleParam(filterSize);\n let filterShape;\n let $dataFormat;\n if (dataFormat === 'NDHWC') {\n $dataFormat = 'channelsLast';\n filterShape =\n [filterDepth, filterHeight, filterWidth, inShape[4], inShape[4]];\n }\n else if (dataFormat === 'NCDHW') {\n $dataFormat = 'channelsFirst';\n filterShape =\n [filterDepth, filterHeight, filterWidth, inShape[1], inShape[1]];\n }\n else {\n throw new Error(`Unknown dataFormat ${dataFormat}`);\n }\n return computeConv3DInfo(inShape, filterShape, strides, dilations, pad, false, $dataFormat, roundingMode);\n}\n/**\n * Computes the information for a forward pass of a convolution/pooling\n * operation.\n */\nexport function computeConv2DInfo(inShape, filterShape, strides, dilations, pad, roundingMode, depthwise = false, dataFormat = 'channelsLast') {\n let [batchSize, inHeight, inWidth, inChannels] = [-1, -1, -1, -1];\n if (dataFormat === 'channelsLast') {\n [batchSize, inHeight, inWidth, inChannels] = inShape;\n }\n else if (dataFormat === 'channelsFirst') {\n [batchSize, inChannels, inHeight, inWidth] = inShape;\n }\n else {\n throw new Error(`Unknown dataFormat ${dataFormat}`);\n }\n const [filterHeight, filterWidth, , filterChannels] = filterShape;\n const [strideHeight, strideWidth] = parseTupleParam(strides);\n const [dilationHeight, dilationWidth] = parseTupleParam(dilations);\n const effectiveFilterHeight = getEffectiveFilterSize(filterHeight, dilationHeight);\n const effectiveFilterWidth = getEffectiveFilterSize(filterWidth, dilationWidth);\n const { padInfo, outHeight, outWidth } = getPadAndOutInfo(pad, inHeight, inWidth, strideHeight, strideWidth, effectiveFilterHeight, effectiveFilterWidth, roundingMode, dataFormat);\n const outChannels = depthwise ? filterChannels * inChannels : filterChannels;\n let outShape;\n if (dataFormat === 'channelsFirst') {\n outShape = [batchSize, outChannels, outHeight, outWidth];\n }\n else if (dataFormat === 'channelsLast') {\n outShape = [batchSize, outHeight, outWidth, outChannels];\n }\n return {\n batchSize,\n dataFormat,\n inHeight,\n inWidth,\n inChannels,\n outHeight,\n outWidth,\n outChannels,\n padInfo,\n strideHeight,\n strideWidth,\n filterHeight,\n filterWidth,\n effectiveFilterHeight,\n effectiveFilterWidth,\n dilationHeight,\n dilationWidth,\n inShape,\n outShape,\n filterShape\n };\n}\n/**\n * Computes the information for a forward pass of a 3D convolution/pooling\n * operation.\n */\nexport function computeConv3DInfo(inShape, filterShape, strides, dilations, pad, depthwise = false, dataFormat = 'channelsLast', roundingMode) {\n let [batchSize, inDepth, inHeight, inWidth, inChannels] = [-1, -1, -1, -1, -1];\n if (dataFormat === 'channelsLast') {\n [batchSize, inDepth, inHeight, inWidth, inChannels] = inShape;\n }\n else if (dataFormat === 'channelsFirst') {\n [batchSize, inChannels, inDepth, inHeight, inWidth] = inShape;\n }\n else {\n throw new Error(`Unknown dataFormat ${dataFormat}`);\n }\n const [filterDepth, filterHeight, filterWidth, , filterChannels] = filterShape;\n const [strideDepth, strideHeight, strideWidth] = parse3TupleParam(strides);\n const [dilationDepth, dilationHeight, dilationWidth] = parse3TupleParam(dilations);\n const effectiveFilterDepth = getEffectiveFilterSize(filterDepth, dilationDepth);\n const effectiveFilterHeight = getEffectiveFilterSize(filterHeight, dilationHeight);\n const effectiveFilterWidth = getEffectiveFilterSize(filterWidth, dilationWidth);\n const { padInfo, outDepth, outHeight, outWidth } = get3DPadAndOutInfo(pad, inDepth, inHeight, inWidth, strideDepth, strideHeight, strideWidth, effectiveFilterDepth, effectiveFilterHeight, effectiveFilterWidth, roundingMode);\n const outChannels = depthwise ? filterChannels * inChannels : filterChannels;\n let outShape;\n if (dataFormat === 'channelsFirst') {\n outShape = [batchSize, outChannels, outDepth, outHeight, outWidth];\n }\n else if (dataFormat === 'channelsLast') {\n outShape = [batchSize, outDepth, outHeight, outWidth, outChannels];\n }\n return {\n batchSize,\n dataFormat,\n inDepth,\n inHeight,\n inWidth,\n inChannels,\n outDepth,\n outHeight,\n outWidth,\n outChannels,\n padInfo,\n strideDepth,\n strideHeight,\n strideWidth,\n filterDepth,\n filterHeight,\n filterWidth,\n effectiveFilterDepth,\n effectiveFilterHeight,\n effectiveFilterWidth,\n dilationDepth,\n dilationHeight,\n dilationWidth,\n inShape,\n outShape,\n filterShape\n };\n}\nfunction computeOutputShape2D(inShape, fieldSize, stride, zeroPad, roundingMode) {\n if (zeroPad == null) {\n zeroPad = computeDefaultPad(inShape, fieldSize, stride);\n }\n const inputRows = inShape[0];\n const inputCols = inShape[1];\n const outputRows = round((inputRows - fieldSize + 2 * zeroPad) / stride + 1, roundingMode);\n const outputCols = round((inputCols - fieldSize + 2 * zeroPad) / stride + 1, roundingMode);\n return [outputRows, outputCols];\n}\nfunction computeOutputShape4D(inShape, fieldSize, outChannels, stride, zeroPad, roundingMode) {\n if (zeroPad == null) {\n zeroPad = computeDefaultPad(inShape, fieldSize, stride);\n }\n const inputDepth = inShape[0];\n const inputRows = inShape[1];\n const inputCols = inShape[2];\n const outputDepths = round((inputDepth - fieldSize + 2 * zeroPad) / stride + 1, roundingMode);\n const outputRows = round((inputRows - fieldSize + 2 * zeroPad) / stride + 1, roundingMode);\n const outputCols = round((inputCols - fieldSize + 2 * zeroPad) / stride + 1, roundingMode);\n return [outputDepths, outputRows, outputCols, outChannels];\n}\nexport function computeDefaultPad(inputShape, fieldSize, stride, dilation = 1) {\n const effectiveFieldSize = getEffectiveFilterSize(fieldSize, dilation);\n return Math.floor((inputShape[0] * (stride - 1) - stride + effectiveFieldSize) / 2);\n}\nfunction parseTupleParam(param) {\n if (typeof param === 'number') {\n return [param, param, param];\n }\n if (param.length === 2) {\n return [param[0], param[1], 1];\n }\n return param;\n}\nfunction parse3TupleParam(param) {\n return typeof param === 'number' ? [param, param, param] : param;\n}\n/* See https://www.tensorflow.org/api_docs/python/tf/nn/atrous_conv2d\n * Atrous convolution is equivalent to standard convolution with upsampled\n * filters with effective_filter_height =\n * filter_height + (filter_height - 1) * (dilation - 1)\n * and effective_filter_width =\n * filter_width + (filter_width - 1) * (dilation - 1),\n * produced by inserting dilation - 1 zeros along consecutive elements across\n * the filters' spatial dimensions.\n * When there is a dilation, this converts a filter dimension to the\n * effective filter dimension, so it can be used in a standard convolution.\n */\nfunction getEffectiveFilterSize(filterSize, dilation) {\n if (dilation <= 1) {\n return filterSize;\n }\n return filterSize + (filterSize - 1) * (dilation - 1);\n}\nfunction getPadAndOutInfo(pad, inHeight, inWidth, strideHeight, strideWidth, filterHeight, filterWidth, roundingMode, dataFormat) {\n let padInfo;\n let outHeight;\n let outWidth;\n if (typeof pad === 'number') {\n const padType = (pad === 0) ? 'VALID' : 'NUMBER';\n padInfo = { top: pad, bottom: pad, left: pad, right: pad, type: padType };\n const outShape = computeOutputShape2D([inHeight, inWidth], filterHeight, strideHeight, pad, roundingMode);\n outHeight = outShape[0];\n outWidth = outShape[1];\n }\n else if (pad === 'same') {\n outHeight = Math.ceil(inHeight / strideHeight);\n outWidth = Math.ceil(inWidth / strideWidth);\n const padAlongHeight = Math.max(0, (outHeight - 1) * strideHeight + filterHeight - inHeight);\n const padAlongWidth = Math.max(0, (outWidth - 1) * strideWidth + filterWidth - inWidth);\n const top = Math.floor(padAlongHeight / 2);\n const bottom = padAlongHeight - top;\n const left = Math.floor(padAlongWidth / 2);\n const right = padAlongWidth - left;\n padInfo = { top, bottom, left, right, type: 'SAME' };\n }\n else if (pad === 'valid') {\n padInfo = { top: 0, bottom: 0, left: 0, right: 0, type: 'VALID' };\n outHeight = Math.ceil((inHeight - filterHeight + 1) / strideHeight);\n outWidth = Math.ceil((inWidth - filterWidth + 1) / strideWidth);\n }\n else if (typeof pad === 'object') {\n const top = dataFormat === 'channelsLast' ? pad[1][0] : pad[2][0];\n const bottom = dataFormat === 'channelsLast' ? pad[1][1] : pad[2][1];\n const left = dataFormat === 'channelsLast' ? pad[2][0] : pad[3][0];\n const right = dataFormat === 'channelsLast' ? pad[2][1] : pad[3][1];\n const padType = (top === 0 && bottom === 0 && left === 0 && right === 0) ?\n 'VALID' :\n 'EXPLICIT';\n padInfo = { top, bottom, left, right, type: padType };\n outHeight = round((inHeight - filterHeight + top + bottom) / strideHeight + 1, roundingMode);\n outWidth = round((inWidth - filterWidth + left + right) / strideWidth + 1, roundingMode);\n }\n else {\n throw Error(`Unknown padding parameter: ${pad}`);\n }\n return { padInfo, outHeight, outWidth };\n}\nfunction get3DPadAndOutInfo(pad, inDepth, inHeight, inWidth, strideDepth, strideHeight, strideWidth, filterDepth, filterHeight, filterWidth, roundingMode) {\n let padInfo;\n let outDepth;\n let outHeight;\n let outWidth;\n if (typeof pad === 'number') {\n const padType = (pad === 0) ? 'VALID' : 'NUMBER';\n padInfo = {\n top: pad,\n bottom: pad,\n left: pad,\n right: pad,\n front: pad,\n back: pad,\n type: padType\n };\n const outShape = computeOutputShape4D([inDepth, inHeight, inWidth, 1], filterDepth, 1, strideDepth, pad, roundingMode);\n outDepth = outShape[0];\n outHeight = outShape[1];\n outWidth = outShape[2];\n }\n else if (pad === 'same') {\n outDepth = Math.ceil(inDepth / strideDepth);\n outHeight = Math.ceil(inHeight / strideHeight);\n outWidth = Math.ceil(inWidth / strideWidth);\n const padAlongDepth = (outDepth - 1) * strideDepth + filterDepth - inDepth;\n const padAlongHeight = (outHeight - 1) * strideHeight + filterHeight - inHeight;\n const padAlongWidth = (outWidth - 1) * strideWidth + filterWidth - inWidth;\n const front = Math.floor(padAlongDepth / 2);\n const back = padAlongDepth - front;\n const top = Math.floor(padAlongHeight / 2);\n const bottom = padAlongHeight - top;\n const left = Math.floor(padAlongWidth / 2);\n const right = padAlongWidth - left;\n padInfo = { top, bottom, left, right, front, back, type: 'SAME' };\n }\n else if (pad === 'valid') {\n padInfo = {\n top: 0,\n bottom: 0,\n left: 0,\n right: 0,\n front: 0,\n back: 0,\n type: 'VALID'\n };\n outDepth = Math.ceil((inDepth - filterDepth + 1) / strideDepth);\n outHeight = Math.ceil((inHeight - filterHeight + 1) / strideHeight);\n outWidth = Math.ceil((inWidth - filterWidth + 1) / strideWidth);\n }\n else {\n throw Error(`Unknown padding parameter: ${pad}`);\n }\n return { padInfo, outDepth, outHeight, outWidth };\n}\n/**\n * Rounds a value depending on the rounding mode\n * @param value\n * @param roundingMode A string from: 'ceil', 'round', 'floor'. If none is\n * provided, it will default to truncate.\n */\nfunction round(value, roundingMode) {\n if (!roundingMode) {\n return Math.trunc(value);\n }\n switch (roundingMode) {\n case 'round':\n // used for Caffe Conv\n return Math.round(value);\n case 'ceil':\n // used for Caffe Pool\n return Math.ceil(value);\n case 'floor':\n return Math.floor(value);\n default:\n throw new Error(`Unknown roundingMode ${roundingMode}`);\n }\n}\nexport function tupleValuesAreOne(param) {\n const [dimA, dimB, dimC] = parseTupleParam(param);\n return dimA === 1 && dimB === 1 && dimC === 1;\n}\nexport function eitherStridesOrDilationsAreOne(strides, dilations) {\n return tupleValuesAreOne(strides) || tupleValuesAreOne(dilations);\n}\n/**\n * Convert Conv2D dataFormat from 'NHWC'|'NCHW' to\n * 'channelsLast'|'channelsFirst'\n * @param dataFormat in 'NHWC'|'NCHW' mode\n * @return dataFormat in 'channelsLast'|'channelsFirst' mode\n * @throws unknown dataFormat\n */\nexport function convertConv2DDataFormat(dataFormat) {\n if (dataFormat === 'NHWC') {\n return 'channelsLast';\n }\n else if (dataFormat === 'NCHW') {\n return 'channelsFirst';\n }\n else {\n throw new Error(`Unknown dataFormat ${dataFormat}`);\n }\n}\n/**\n * Check validity of pad when using dimRoundingMode.\n * @param opDesc A string of op description\n * @param pad The type of padding algorithm.\n * - `same` and stride 1: output will be of same size as input,\n * regardless of filter size.\n * - `valid` output will be smaller than input if filter is larger\n * than 1x1.\n * - For more info, see this guide:\n * [https://www.tensorflow.org/api_docs/python/tf/nn/convolution](\n * https://www.tensorflow.org/api_docs/python/tf/nn/convolution)\n * @param dimRoundingMode A string from: 'ceil', 'round', 'floor'. If none is\n * provided, it will default to truncate.\n * @throws unknown padding parameter\n */\nexport function checkPadOnDimRoundingMode(opDesc, pad, dimRoundingMode) {\n if (dimRoundingMode != null) {\n if (typeof pad === 'string') {\n throw Error(`Error in ${opDesc}: pad must be an integer when using ` +\n `dimRoundingMode ${dimRoundingMode} but got pad ${pad}.`);\n }\n else if (typeof pad === 'number') {\n util.assert(util.isInt(pad), () => `Error in ${opDesc}: pad must be an integer when using ` +\n `dimRoundingMode ${dimRoundingMode} but got pad ${pad}.`);\n }\n else if (typeof pad === 'object') {\n pad.forEach(p => {\n p.forEach(v => {\n util.assert(util.isInt(v), () => `Error in ${opDesc}: pad must be an integer when using ` +\n `dimRoundingMode ${dimRoundingMode} but got pad ${v}.`);\n });\n });\n }\n else {\n throw Error(`Error in ${opDesc}: Unknown padding parameter: ${pad}`);\n }\n }\n}\n//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY29udl91dGlsLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vLi4vdGZqcy1jb3JlL3NyYy9vcHMvY29udl91dGlsLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBOzs7Ozs7Ozs7Ozs7Ozs7R0FlRztBQUVILE9BQU8sS0FBSyxJQUFJLE1BQU0sU0FBUyxDQUFDO0FBMERoQzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7R0F1Qkc7QUFDSCxNQUFNLFVBQVUscUJBQXFCLENBQ2pDLFVBQTRDLEVBQzVDLFdBQXFDLEVBQUUsT0FBZ0MsRUFDdkUsR0FBMEIsRUFBRSxhQUFxQixNQUFNLEVBQ3ZELFNBQWtDO0lBQ3BDLHNFQUFzRTtJQUN0RSwwRUFBMEU7SUFDMUUsd0RBQXdEO0lBQ3hELGtEQUFrRDtJQUNsRCxNQUFNLGFBQWEsR0FBRyxVQUFVLENBQUMsQ0FBQyxDQUFDLENBQUM7SUFDcEMsTUFBTSxZQUFZLEdBQ2QsQ0FBQyxHQUFHLFdBQVcsRUFBRSxhQUFhLENBQXFDLENBQUM7SUFDeEUsTUFBTSxXQUFXLEdBQUcsdUJBQXVCLENBQUMsVUFBVSxDQUFDLENBQUM7SUFFeEQsT0FBTyxpQkFBaUIsQ0FDcEIsVUFBVSxFQUFFLFlBQVksRUFBRSxPQUFPLEVBQUUsU0FBUyxFQUFFLEdBQUcsRUFDakQsSUFBSSxDQUFDLGtCQUFrQixFQUFFLElBQUksQ0FBQyxlQUFlLEVBQUUsV0FBVyxDQUFDLENBQUM7QUFDbEUsQ0FBQztBQUVELE1BQU0sVUFBVSxpQkFBaUIsQ0FDN0IsT0FBeUMsRUFDekMsVUFBbUMsRUFBRSxPQUFnQyxFQUNyRSxTQUFrQyxFQUNsQyxHQUEwQyxFQUMxQyxZQUFxQyxFQUNyQyxhQUE2QyxjQUFjO0lBQzdELE1BQU0sQ0FBQyxZQUFZLEVBQUUsV0FBVyxDQUFDLEdBQUcsZUFBZSxDQUFDLFVBQVUsQ0FBQyxDQUFDO0lBRWhFLElBQUksV0FBNkMsQ0FBQztJQUNsRCxJQUFJLFVBQVUsS0FBSyxjQUFjLEVB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LEdBQUcsRUFBRSxDQUFDLFlBQVksTUFBTSxzQ0FBc0M7d0JBQzFELG1CQUFtQixlQUFlLGdCQUFnQixDQUFDLEdBQUcsQ0FBQyxDQUFDO2dCQUNoRSxDQUFDLENBQUMsQ0FBQztZQUNMLENBQUMsQ0FBQyxDQUFDO1NBQ0o7YUFBTTtZQUNMLE1BQU0sS0FBSyxDQUFDLFlBQVksTUFBTSxnQ0FBZ0MsR0FBRyxFQUFFLENBQUMsQ0FBQztTQUN0RTtLQUNGO0FBQ0gsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbIi8qKlxuICogQGxpY2Vuc2VcbiAqIENvcHlyaWdodCAyMDIwIEdvb2dsZSBMTEMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuXG4gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgXCJMaWNlbnNlXCIpO1xuICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLlxuICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0XG4gKlxuICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wXG4gKlxuICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZVxuICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gXCJBUyBJU1wiIEJBU0lTLFxuICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuXG4gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kXG4gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS5cbiAqID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4gKi9cblxuaW1wb3J0ICogYXMgdXRpbCBmcm9tICcuLi91dGlsJztcblxudHlwZSBQYWRUeXBlID0gJ1NBTUUnfCdWQUxJRCd8J05VTUJFUid8J0VYUExJQ0lUJztcblxuLy8gRm9yIE5IV0Mgc2hvdWxkIGJlIGluIHRoZSBmb2xsb3dpbmcgZm9ybTpcbi8vICBbWzAsIDBdLCBbcGFkX3RvcCxwYWRfYm90dG9tXSwgW3BhZF9sZWZ0LCBwYWRfcmlnaHRdLCBbMCwgMF1dXG4vLyBGb3IgTkNIVyBzaG91bGQgYmUgaW4gdGhlIGZvbGxvd2luZyBmb3JtOlxuLy8gIFtbMCwgMF0sIFswLCAwXSwgW3BhZF90b3AscGFkX2JvdHRvbV0sIFtwYWRfbGVmdCwgcGFkX3JpZ2h0XV1cbi8vIFJlZmVyZW5jZTogaHR0cHM6Ly93d3cudGVuc29yZmxvdy5vcmcvYXBpX2RvY3MvcHl0aG9uL3RmL25uL2NvbnYyZFxuZXhwb3J0IHR5cGUgRXhwbGljaXRQYWRkaW5nID1cbiAgICBbW251bWJlciwgbnVtYmVyXSwgW251bWJlciwgbnVtYmVyXSwgW251bWJlciwgbnVtYmVyXSwgW251bWJlciwgbnVtYmVyXV07XG5cbmV4cG9ydCB0eXBlIFBhZEluZm8gPSB7XG4gIHRvcDogbnVtYmVyLFxuICBsZWZ0OiBudW1iZXIsXG4gIHJpZ2h0OiBudW1iZXIsXG4gIGJvdHRvbTogbnVtYmVyLFxuICB0eXBlOiBQYWRUeXBlXG59O1xuXG5leHBvcnQgdHlwZSBQYWRJbmZvM0QgPSB7XG4gIHRvcDogbnVtYmVyLFxuICBsZWZ0OiBudW1iZXIsXG4gIHJpZ2h0OiBudW1iZXIsXG4gIGJvdHRvbTogbnVtYmVyLFxuICBmcm9udDogbnVtYmVyLFxuICBiYWNrOiBudW1iZXIsXG4gIHR5cGU6IFBhZFR5cGVcbn07XG5cbi8qKlxuICogSW5mb3JtYXRpb24gYWJvdXQgdGhlIGZvcndhcmQgcGFzcyBvZiBhIGNvbnZvbHV0aW9uL3Bvb2xpbmcgb3BlcmF0aW9uLlxuICogSXQgaW5jbHVkZXMgaW5wdXQgYW5kIG91dHB1dCBzaGFwZSwgc3RyaWRlcywgZmlsdGVyIHNpemUgYW5kIHBhZGRpbmdcbiAqIGluZm9ybWF0aW9uLlxuICovXG5leHBvcnQgdHlwZSBDb252MkRJbmZvID0ge1xuICBiYXRjaFNpemU6IG51bWJlcixcbiAgaW5IZWlnaHQ6IG51bWJlcixcbiAgaW5XaWR0aDogbnVtYmVyLFxuICBpbkNoYW5uZWxzOiBudW1iZXIsXG4gIG91dEhlaWdodDogbnVtYmVyLFxuICBvdXRXaWR0aDogbnVtYmVyLFxuICBvdXRDaGFubmVsczogbnVtYmVyLFxuICBkYXRhRm9ybWF0OiAnY2hhbm5lbHNGaXJzdCd8J2NoYW5uZWxzTGFzdCcsXG4gIHN0cmlkZUhlaWdodDogbnVtYmVyLFxuICBzdHJpZGVXaWR0aDogbnVtYmVyLFxuICBkaWxhdGlvbkhlaWdodDogbnVtYmVyLFxuICBkaWxhdGlvbldpZHRoOiBudW1iZXIsXG4gIGZpbHRlckhlaWdodDogbnVtYmVyLFxuICBmaWx0ZXJXaWR0aDogbnVtYmVyLFxuICBlZmZlY3RpdmVGaWx0ZXJIZWlnaHQ6IG51bWJlcixcbiAgZWZmZWN0aXZlRmlsdGVyV2lkdGg6IG51bWJlcixcbiAgcGFkSW5mbzogUGFkSW5mbyxcbiAgaW5TaGFwZTogW251bWJlciwgbnVtYmVyLCBudW1iZXIsIG51bWJlcl0sXG4gIG91dFNoYXBlOiBbbnVtYmVyLCBudW1iZXIsIG51bWJlciwgbnVtYmVyXSxcbiAgZmlsdGVyU2hhcGU6IFtudW1iZXIsIG51bWJlciwgbnVtYmVyLCBudW1iZXJdXG59O1xuXG4vKipcbiAqXG4gKiBAcGFyYW0gaW5wdXRTaGFwZSBJbnB1dCB0ZW5zb3Igc2hhcGUgaXMgb2YgdGhlIGZvbGxvd2luZyBkaW1lbnNpb25zOlxuICogICAgIGBbYmF0Y2gsIGhlaWdodCwgd2lkdGgsIGluQ2hhbm5lbHNdYC5cbiAqIEBwYXJhbSBmaWx0ZXJTaGFwZSBUaGUgZmlsdGVyIHNoYXBlIGlzIG9mIHRoZSBmb2xsb3dpbmcgZGltZW5zaW9uczpcbiAqICAgICBgW2ZpbHRlckhlaWdodCwgZmlsdGVyV2lkdGgsIGRlcHRoXWAuXG4gKiBAcGFyYW0gc3RyaWRlcyBUaGUgc3RyaWRlcyBvZiB0aGUgc2xpZGluZyB3aW5kb3cgZm9yIGVhY2ggZGltZW5zaW9uIG9mIHRoZVxuICogICAgIGlucHV0IHRlbnNvcjogYFtzdHJpZGVIZWlnaHQsIHN0cmlkZVdpZHRoXWAuXG4gKiAgICAgSWYgYHN0cmlkZXNgIGlzIGEgc2luZ2xlIG51bWJlcixcbiAqICAgICB0aGVuIGBzdHJpZGVIZWlnaHQgPT0gc3RyaWRlV2lkdGhgLlxuICogQHBhcmFtIHBhZCBUaGUgdHlwZSBvZiBwYWRkaW5nIGFsZ29yaXRobS5cbiAqICAgIC0gYHNhbWVgIGFuZCBzdHJpZGUgMTogb3V0cHV0IHdpbGwgYmUgb2Ygc2FtZSBzaXplIGFzIGlucHV0LFxuICogICAgICAgcmVnYXJkbGVzcyBvZiBmaWx0ZXIgc2l6ZS5cbiAqICAgIC0gYHZhbGlkYDogb3V0cHV0IHdpbGwgYmUgc21hbGxlciB0aGFuIGlucHV0IGlmIGZpbHRlciBpcyBsYXJnZXJcbiAqICAgICAgIHRoYW4gMSoxeDEuXG4gKiAgICAtIEZvciBtb3JlIGluZm8sIHNlZSB0aGlzIGd1aWRlOlxuICogICAgIFtodHRwczovL3d3dy50ZW5zb3JmbG93Lm9yZy9hcGlfZG9jcy9weXRob24vdGYvbm4vY29udm9sdXRpb25dKFxuICogICAgICAgICAgaHR0cHM6Ly93d3cudGVuc29yZmxvdy5vcmcvYXBpX2RvY3MvcHl0aG9uL3RmL25uL2NvbnZvbHV0aW9uKVxuICogQHBhcmFtIGRhdGFGb3JtYXQgVGhlIGRhdGEgZm9ybWF0IG9mIHRoZSBpbnB1dCBhbmQgb3V0cHV0IGRhdGEuXG4gKiAgICAgRGVmYXVsdHMgdG8gJ05IV0MnLlxuICogQHBhcmFtIGRpbGF0aW9ucyBUaGUgZGlsYXRpb24gcmF0ZXM6IGBbZGlsYXRpb25IZWlnaHQsIGRpbGF0aW9uV2lkdGhdYC5cbiAqICAgICBEZWZhdWx0cyB0byBgWzEsIDFdYC4gSWYgYGRpbGF0aW9uc2AgaXMgYSBzaW5nbGUgbnVtYmVyLCB0aGVuXG4gKiAgICAgYGRpbGF0aW9uSGVpZ2h0ID09IGRpbGF0aW9uV2lkdGhgLlxuICovXG5leHBvcnQgZnVuY3Rpb24gY29tcHV0ZURpbGF0aW9uMkRJbmZvKFxuICAgIGlucHV0U2hhcGU6IFtudW1iZXIsIG51bWJlciwgbnVtYmVyLCBudW1iZXJdLFxuICAgIGZpbHRlclNoYXBlOiBbbnVtYmVyLCBudW1iZXIsIG51bWJlcl0sIHN0cmlkZXM6IG51bWJlcnxbbnVtYmVyLCBudW1iZXJdLFxuICAgIHBhZDogJ3NhbWUnfCd2YWxpZCd8bnVtYmVyLCBkYXRhRm9ybWF0OiAnTkhXQycgPSAnTkhXQycsXG4gICAgZGlsYXRpb25zOiBudW1iZXJ8W251bWJlciwgbnVtYmVyXSkge1xuICAvLyBgY29tcHV0ZXJDb252MkRJbmZvYCByZXF1aXJlIGZpbHRlclNoYXBlIHRvIGJlIGluIHRoZSBkaW1lbnNpb24gb2Y6XG4gIC8vIGBbZmlsdGVySGVpZ2h0LCBmaWx0ZXJXaWR0aCwgZGVwdGgsIG91dERlcHRoXWAsIGRpbGF0aW9uMmQgZG9lc24ndCBoYXZlXG4gIC8vIG91dERlcHRoLCBpdCBzaG91bGQgaGF2ZSB0aGUgc2FtZSBkZXB0aCBhcyB0aGUgaW5wdXQuXG4gIC8vIElucHV0IHNoYXBlOiBbYmF0Y2gsIGhlaWdodCwgd2lkdGgsIGluQ2hhbm5lbHNdXG4gIGNvbnN0IGlucHV0Q2hhbm5lbHMgPSBpbnB1dFNoYXBlWzNdO1xuICBjb25zdCAkZmlsdGVyU2hhcGUgPVxuICAgICAgWy4uLmZpbHRlclNoYXBlLCBpbnB1dENoYW5uZWxzXSBhcyBbbnVtYmVyLCBudW1iZXIsIG51bWJlciwgbnVtYmVyXTtcbiAgY29uc3QgJGRhdGFGb3JtYXQgPSBjb252ZXJ0Q29udjJERGF0YUZvcm1hdChkYXRhRm9ybWF0KTtcblxuICByZXR1cm4gY29tcHV0ZUNvbnYyREluZm8oXG4gICAgICBpbnB1dFNoYXBlLCAkZmlsdGVyU2hhcGUsIHN0cmlkZXMsIGRpbGF0aW9ucywgcGFkLFxuICAgICAgbnVsbCAvKiByb3VuZGluZ01vZGUgKi8sIG51bGwgLyogZGVwdGhXaXNlICovLCAkZGF0YUZvcm1hdCk7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBjb21wdXRlUG9vbDJESW5mbyhcbiAgICBpblNoYXBlOiBbbnVtYmVyLCBudW1iZXIsIG51bWJlciwgbnVtYmVyXSxcbiAgICBmaWx0ZXJTaXplOiBbbnVtYmVyLCBudW1iZXJdfG51bWJlciwgc3RyaWRlczogbnVtYmVyfFtudW1iZXIsIG51bWJlcl0sXG4gICAgZGlsYXRpb25zOiBudW1iZXJ8W251bWJlciwgbnVtYmVyXSxcbiAgICBwYWQ6ICdzYW1lJ3wndmFsaWQnfG51bWJlcnxFeHBsaWNpdFBhZGRpbmcsXG4gICAgcm91bmRpbmdNb2RlPzogJ2Zsb29yJ3wncm91bmQnfCdjZWlsJyxcbiAgICBkYXRhRm9ybWF0OiAnY2hhbm5lbHNGaXJzdCd8J2NoYW5uZWxzTGFzdCcgPSAnY2hhbm5lbHNMYXN0Jyk6IENvbnYyREluZm8ge1xuICBjb25zdCBbZmlsdGVySGVpZ2h0LCBmaWx0ZXJXaWR0aF0gPSBwYXJzZVR1cGxlUGFyYW0oZmlsdGVyU2l6ZSk7XG5cbiAgbGV0IGZpbHRlclNoYXBlOiBbbnVtYmVyLCBudW1iZXIsIG51bWJlciwgbnVtYmVyXTtcbiAgaWYgKGRhdGFGb3JtYXQgPT09ICdjaGFubmVsc0xhc3QnKSB7XG4gICAgZmlsdGVyU2hhcGUgPSBbZmlsdGVySGVpZ2h0LCBmaWx0ZXJXaWR0aCwgaW5TaGFwZVszXSwgaW5TaGFwZVszXV07XG4gIH0gZWxzZSBpZiAoZGF0YUZvcm1hdCA9PT0gJ2NoYW5uZWxzRmlyc3QnKSB7XG4gICAgZmlsdGVyU2hhcGUgPSBbZmlsdGVySGVpZ2h0LCBmaWx0ZXJXaWR0aCwgaW5TaGFwZVsxXSwgaW5TaGFwZVsxXV07XG4gIH0gZWxzZSB7XG4gICAgdGhyb3cgbmV3IEVycm9yKGBVbmtub3duIGRhdGFGb3JtYXQgJHtkYXRhRm9ybWF0fWApO1xuICB9XG5cbiAgcmV0dXJuIGNvbXB1dGVDb252MkRJbmZvKFxuICAgICAgaW5TaGFwZSwgZmlsdGVyU2hhcGUsIHN0cmlkZXMsIGRpbGF0aW9ucywgcGFkLCByb3VuZGluZ01vZGUsIGZhbHNlLFxuICAgICAgZGF0YUZvcm1hdCk7XG59XG5cbi8qKlxuICogQ29tcHV0ZXMgdGhlIGluZm9ybWF0aW9uIGZvciBhIGZvcndhcmQgcGFzcyBvZiBhIHBvb2xpbmczRCBvcGVyYXRpb24uXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBjb21wdXRlUG9vbDNESW5mbyhcbiAgICBpblNoYXBlOiBbbnVtYmVyLCBudW1iZXIsIG51bWJlciwgbnVtYmVyLCBudW1iZXJdLFxuICAgIGZpbHRlclNpemU6IG51bWJlcnxbbnVtYmVyLCBudW1iZXIsIG51bWJlcl0sXG4gICAgc3RyaWRlczogbnVtYmVyfFtudW1iZXIsIG51bWJlciwgbnVtYmVyXSxcbiAgICBkaWxhdGlvbnM6IG51bWJlcnxbbnVtYmVyLCBudW1iZXIsIG51bWJlcl0sIHBhZDogJ3NhbWUnfCd2YWxpZCd8bnVtYmVyLFxuICAgIHJvdW5kaW5nTW9kZT86ICdmbG9vcid8J3JvdW5kJ3wnY2VpbCcsXG4gICAgZGF0YUZvcm1hdDogJ05ESFdDJ3wnTkNESFcnID0gJ05ESFdDJyk6IENvbnYzREluZm8ge1xuICBjb25zdCBbZmlsdGVyRGVwdGgsIGZpbHRlckhlaWdodCwgZmlsdGVyV2lkdGhdID0gcGFyc2UzVHVwbGVQYXJhbShmaWx0ZXJTaXplKTtcblxuICBsZXQgZmlsdGVyU2hhcGU6IFtudW1iZXIsIG51bWJlciwgbnVtYmVyLCBudW1iZXIsIG51bWJlcl07XG4gIGxldCAkZGF0YUZvcm1hdDogJ2NoYW5uZWxzRmlyc3QnfCdjaGFubmVsc0xhc3QnO1xuICBpZiAoZGF0YUZvcm1hdCA9PT0gJ05ESFdDJykge1xuICAgICRkYXRhRm9ybWF0ID0gJ2NoYW5uZWxzTGFzdCc7XG4gICAgZmlsdGVyU2hhcGUgPVxuICAgICAgICBbZmlsdGVyRGVwdGgsIGZpbHRlckhlaWdodCwgZmlsdGVyV2lkdGgsIGluU2hhcGVbNF0sIGluU2hhcGVbNF1dO1xuICB9IGVsc2UgaWYgKGRhdGFGb3JtYXQgPT09ICdOQ0RIVycpIHtcbiAgICAkZGF0YUZvcm1hdCA9ICdjaGFubmVsc0ZpcnN0JztcbiAgICBmaWx0ZXJTaGFwZSA9XG4gICAgICAgIFtmaWx0ZXJEZXB0aCwgZmlsdGVySGVpZ2h0LCBmaWx0ZXJXaWR0aCwgaW5TaGFwZVsxXSwgaW5TaGFwZVsxXV07XG4gIH0gZWxzZSB7XG4gICAgdGhyb3cgbmV3IEVycm9yKGBVbmtub3duIGRhdGFGb3JtYXQgJHtkYXRhRm9ybWF0fWApO1xuICB9XG5cbiAgcmV0dXJuIGNvbXB1dGVDb252M0RJbmZvKFxuICAgICAgaW5TaGFwZSwgZmlsdGVyU2hhcGUsIHN0cmlkZXMsIGRpbGF0aW9ucywgcGFkLCBmYWxzZSwgJGRhdGFGb3JtYXQsXG4gICAgICByb3VuZGluZ01vZGUpO1xufVxuXG4vKipcbiAqIENvbXB1dGVzIHRoZSBpbmZvcm1hdGlvbiBmb3IgYSBmb3J3YXJkIHBhc3Mgb2YgYSBjb252b2x1dGlvbi9wb29saW5nXG4gKiBvcGVyYXRpb24uXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBjb21wdXRlQ29udjJESW5mbyhcbiAgICBpblNoYXBlOiBbbnVtYmVyLCBudW1iZXIsIG51bWJlciwgbnVtYmVyXSxcbiAgICBmaWx0ZXJTaGFwZTogW251bWJlciwgbnVtYmVyLCBudW1iZXIsIG51bWJlcl0sXG4gICAgc3RyaWRlczogbnVtYmVyfFtudW1iZXIsIG51bWJlcl0sIGRpbGF0aW9uczogbnVtYmVyfFtudW1iZXIsIG51bWJlcl0sXG4gICAgcGFkOiAnc2FtZSd8J3ZhbGlkJ3xudW1iZXJ8RXhwbGljaXRQYWRkaW5nLFxuICAgIHJvdW5kaW5nTW9kZT86ICdmbG9vcid8J3JvdW5kJ3wnY2VpbCcsIGRlcHRod2lzZSA9IGZhbHNlLFxuICAgIGRhdGFGb3JtYXQ6ICdjaGFubmVsc0ZpcnN0J3wnY2hhbm5lbHNMYXN0JyA9ICdjaGFubmVsc0xhc3QnKTogQ29udjJESW5mbyB7XG4gIGxldCBbYmF0Y2hTaXplLCBpbkhlaWdodCwgaW5XaWR0aCwgaW5DaGFubmVsc10gPSBbLTEsIC0xLCAtMSwgLTFdO1xuICBpZiAoZGF0YUZvcm1hdCA9PT0gJ2NoYW5uZWxzTGFzdCcpIHtcbiAgICBbYmF0Y2hTaXplLCBpbkhlaWdodCwgaW5XaWR0aCwgaW5DaGFubmVsc10gPSBpblNoYXBlO1xuICB9IGVsc2UgaWYgKGRhdGFGb3JtYXQgPT09ICdjaGFubmVsc0ZpcnN0Jykge1xuICAgIFtiYXRjaFNpemUsIGluQ2hhbm5lbHMsIGluSGVpZ2h0LCBpbldpZHRoXSA9IGluU2hhcGU7XG4gIH0gZWxzZSB7XG4gICAgdGhyb3cgbmV3IEVycm9yKGBVbmtub3duIGRhdGFGb3JtYXQgJHtkYXRhRm9ybWF0fWApO1xuICB9XG5cbiAgY29uc3QgW2ZpbHRlckhlaWdodCwgZmlsdGVyV2lkdGgsICwgZmlsdGVyQ2hhbm5lbHNdID0gZmlsdGVyU2hhcGU7XG4gIGNvbnN0IFtzdHJpZGVIZWlnaHQsIHN0cmlkZVdpZHRoXSA9IHBhcnNlVHVwbGVQYXJhbShzdHJpZGVzKTtcbiAgY29uc3QgW2RpbGF0aW9uSGVpZ2h0LCBkaWxhdGlvbldpZHRoXSA9IHBhcnNlVHVwbGVQYXJhbShkaWxhdGlvbnMpO1xuXG4gIGNvbnN0IGVmZmVjdGl2ZUZpbHRlckhlaWdodCA9XG4gICAgICBnZXRFZmZlY3RpdmVGaWx0ZXJTaXplKGZpbHRlckhlaWdodCwgZGlsYXRpb25IZWlnaHQpO1xuICBjb25zdCBlZmZlY3RpdmVGaWx0ZXJXaWR0aCA9XG4gICAgICBnZXRFZmZlY3RpdmVGaWx0ZXJTaXplKGZpbHRlcldpZHRoLCBkaWxhdGlvbldpZHRoKTtcbiAgY29uc3Qge3BhZEluZm8sIG91dEhlaWdodCwgb3V0V2lkdGh9ID0gZ2V0UGFkQW5kT3V0SW5mbyhcbiAgICAgIHBhZCwgaW5IZWlnaHQsIGluV2lkdGgsIHN0cmlkZUhlaWdodCwgc3RyaWRlV2lkdGgsIGVmZmVjdGl2ZUZpbHRlckhlaWdodCxcbiAgICAgIGVmZmVjdGl2ZUZpbHRlcldpZHRoLCByb3VuZGluZ01vZGUsIGRhdGFGb3JtYXQpO1xuXG4gIGNvbnN0IG91dENoYW5uZWxzID0gZGVwdGh3aXNlID8gZmlsdGVyQ2hhbm5lbHMgKiBpbkNoYW5uZWxzIDogZmlsdGVyQ2hhbm5lbHM7XG5cbiAgbGV0IG91dFNoYXBlOiBbbnVtYmVyLCBudW1iZXIsIG51bWJlciwgbnVtYmVyXTtcbiAgaWYgKGRhdGFGb3JtYXQgPT09ICdjaGFubmVsc0ZpcnN0Jykge1xuICAgIG91dFNoYXBlID0gW2JhdGNoU2l6ZSwgb3V0Q2hhbm5lbHMsIG91dEhlaWdodCwgb3V0V2lkdGhdO1xuICB9IGVsc2UgaWYgKGRhdGFGb3JtYXQgPT09ICdjaGFubmVsc0xhc3QnKSB7XG4gICAgb3V0U2hhcGUgPSBbYmF0Y2hTaXplLCBvdXRIZWlnaHQsIG91dFdpZHRoLCBvdXRDaGFubmVsc107XG4gIH1cblxuICByZXR1cm4ge1xuICAgIGJhdGNoU2l6ZSxcbiAgICBkYXRhRm9ybWF0LFxuICAgIGluSGVpZ2h0LFxuICAgIGluV2lkdGgsXG4gICAgaW5DaGFubmVscyxcbiAgICBvdXRIZWlnaHQsXG4gICAgb3V0V2lkdGgsXG4gICAgb3V0Q2hhbm5lbHMsXG4gICAgcGFkSW5mbyxcbiAgICBzdHJpZGVIZWlnaHQsXG4gICAgc3RyaWRlV2lkdGgsXG4gICAgZmlsdGVySGVpZ2h0LFxuICAgIGZpbHRlcldpZHRoLFxuICAgIGVmZmVjdGl2ZUZpbHRlckhlaWdodCxcbiAgICBlZmZlY3RpdmVGaWx0ZXJXaWR0aCxcbiAgICBkaWxhdGlvbkhlaWdodCxcbiAgICBkaWxhdGlvbldpZHRoLFxuICAgIGluU2hhcGUsXG4gICAgb3V0U2hhcGUsXG4gICAgZmlsdGVyU2hhcGVcbiAgfTtcbn1cblxuLyoqXG4gKiBJbmZvcm1hdGlvbiBhYm91dCB0aGUgZm9yd2FyZCBwYXNzIG9mIGEgM0QgY29udm9sdXRpb24vcG9vbGluZyBvcGVyYXRpb24uXG4gKiBJdCBpbmNsdWRlcyBpbnB1dCBhbmQgb3V0cHV0IHNoYXBlLCBzdHJpZGVzLCBmaWx0ZXIgc2l6ZSBhbmQgcGFkZGluZ1xuICogaW5mb3JtYXRpb24uXG4gKi9cbmV4cG9ydCB0eXBlIENvbnYzREluZm8gPSB7XG4gIGJhdGNoU2l6ZTogbnVtYmVyLFxuICBpbkRlcHRoOiBudW1iZXIsXG4gIGluSGVpZ2h0OiBudW1iZXIsXG4gIGluV2lkdGg6IG51bWJlcixcbiAgaW5DaGFubmVsczogbnVtYmVyLFxuICBvdXREZXB0aDogbnVtYmVyLFxuICBvdXRIZWlnaHQ6IG51bWJlcixcbiAgb3V0V2lkdGg6IG51bWJlcixcbiAgb3V0Q2hhbm5lbHM6IG51bWJlcixcbiAgZGF0YUZvcm1hdDogJ2NoYW5uZWxzRmlyc3QnfCdjaGFubmVsc0xhc3QnLFxuICBzdHJpZGVEZXB0aDogbnVtYmVyLFxuICBzdHJpZGVIZWlnaHQ6IG51bWJlcixcbiAgc3RyaWRlV2lkdGg6IG51bWJlcixcbiAgZGlsYXRpb25EZXB0aDogbnVtYmVyLFxuICBkaWxhdGlvbkhlaWdodDogbnVtYmVyLFxuICBkaWxhdGlvbldpZHRoOiBudW1iZXIsXG4gIGZpbHRlckRlcHRoOiBudW1iZXIsXG4gIGZpbHRlckhlaWdodDogbnVtYmVyLFxuICBmaWx0ZXJXaWR0aDogbnVtYmVyLFxuICBlZmZlY3RpdmVGaWx0ZXJEZXB0aDogbnVtYmVyLFxuICBlZmZlY3RpdmVGaWx0ZXJIZWlnaHQ6IG51bWJlcixcbiAgZWZmZWN0aXZlRmlsdGVyV2lkdGg6IG51bWJlcixcbiAgcGFkSW5mbzogUGFkSW5mbzNELFxuICBpblNoYXBlOiBbbnVtYmVyLCBudW1iZXIsIG51bWJlciwgbnVtYmVyLCBudW1iZXJdLFxuICBvdXRTaGFwZTogW251bWJlciwgbnVtYmVyLCBudW1iZXIsIG51bWJlciwgbnVtYmVyXSxcbiAgZmlsdGVyU2hhcGU6IFtudW1iZXIsIG51bWJlciwgbnVtYmVyLCBudW1iZXIsIG51bWJlcl1cbn07XG5cbi8qKlxuICogQ29tcHV0ZXMgdGhlIGluZm9ybWF0aW9uIGZvciBhIGZvcndhcmQgcGFzcyBvZiBhIDNEIGNvbnZvbHV0aW9uL3Bvb2xpbmdcbiAqIG9wZXJhdGlvbi5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGNvbXB1dGVDb252M0RJbmZvKFxuICAgIGluU2hhcGU6IFtudW1iZXIsIG51bWJlciwgbnVtYmVyLCBudW1iZXIsIG51bWJlcl0sXG4gICAgZmlsdGVyU2hhcGU6IFtudW1iZXIsIG51bWJlciwgbnVtYmVyLCBudW1iZXIsIG51bWJlcl0sXG4gICAgc3RyaWRlczogbnVtYmVyfFtudW1iZXIsIG51bWJlciwgbnVtYmVyXSxcbiAgICBkaWxhdGlvbnM6IG51bWJlcnxbbnVtYmVyLCBudW1iZXIsIG51bWJlcl0sIHBhZDogJ3NhbWUnfCd2YWxpZCd8bnVtYmVyLFxuICAgIGRlcHRod2lzZSA9IGZhbHNlLFxuICAgIGRhdGFGb3JtYXQ6ICdjaGFubmVsc0ZpcnN0J3wnY2hhbm5lbHNMYXN0JyA9ICdjaGFubmVsc0xhc3QnLFxuICAgIHJvdW5kaW5nTW9kZT86ICdmbG9vcid8J3JvdW5kJ3wnY2VpbCcpOiBDb252M0RJbmZvIHtcbiAgbGV0IFtiYXRjaFNpemUsIGluRGVwdGgsIGluSGVpZ2h0LCBpbldpZHRoLCBpbkNoYW5uZWxzXSA9XG4gICAgICBbLTEsIC0xLCAtMSwgLTEsIC0xXTtcbiAgaWYgKGRhdGFGb3JtYXQgPT09ICdjaGFubmVsc0xhc3QnKSB7XG4gICAgW2JhdGNoU2l6ZSwgaW5EZXB0aCwgaW5IZWlnaHQsIGluV2lkdGgsIGluQ2hhbm5lbHNdID0gaW5TaGFwZTtcbiAgfSBlbHNlIGlmIChkYXRhRm9ybWF0ID09PSAnY2hhbm5lbHNGaXJzdCcpIHtcbiAgICBbYmF0Y2hTaXplLCBpbkNoYW5uZWxzLCBpbkRlcHRoLCBpbkhlaWdodCwgaW5XaWR0aF0gPSBpblNoYXBlO1xuICB9IGVsc2Uge1xuICAgIHRocm93IG5ldyBFcnJvcihgVW5rbm93biBkYXRhRm9ybWF0ICR7ZGF0YUZvcm1hdH1gKTtcbiAgfVxuXG4gIGNvbnN0IFtmaWx0ZXJEZXB0aCwgZmlsdGVySGVpZ2h0LCBmaWx0ZXJXaWR0aCwgLCBmaWx0ZXJDaGFubmVsc10gPVxuICAgICAgZmlsdGVyU2hhcGU7XG4gIGNvbnN0IFtzdHJpZGVEZXB0aCwgc3RyaWRlSGVpZ2h0LCBzdHJpZGVXaWR0aF0gPSBwYXJzZTNUdXBsZVBhcmFtKHN0cmlkZXMpO1xuICBjb25zdCBbZGlsYXRpb25EZXB0aCwgZGlsYXRpb25IZWlnaHQsIGRpbGF0aW9uV2lkdGhdID1cbiAgICAgIHBhcnNlM1R1cGxlUGFyYW0oZGlsYXRpb25zKTtcblxuICBjb25zdCBlZmZlY3RpdmVGaWx0ZXJEZXB0aCA9XG4gICAgICBnZXRFZmZlY3RpdmVGaWx0ZXJTaXplKGZpbHRlckRlcHRoLCBkaWxhdGlvbkRlcHRoKTtcbiAgY29uc3QgZWZmZWN0aXZlRmlsdGVySGVpZ2h0ID1cbiAgICAgIGdldEVmZmVjdGl2ZUZpbHRlclNpemUoZmlsdGVySGVpZ2h0LCBkaWxhdGlvbkhlaWdodCk7XG4gIGNvbnN0IGVmZmVjdGl2ZUZpbHRlcldpZHRoID1cbiAgICAgIGdldEVmZmVjdGl2ZUZpbHRlclNpemUoZmlsdGVyV2lkdGgsIGRpbGF0aW9uV2lkdGgpO1xuICBjb25zdCB7cGFkSW5mbywgb3V0RGVwdGgsIG91dEhlaWdodCwgb3V0V2lkdGh9ID0gZ2V0M0RQYWRBbmRPdXRJbmZvKFxuICAgICAgcGFkLCBpbkRlcHRoLCBpbkhlaWdodCwgaW5XaWR0aCwgc3RyaWRlRGVwdGgsIHN0cmlkZUhlaWdodCwgc3RyaWRlV2lkdGgsXG4gICAgICBlZmZlY3RpdmVGaWx0ZXJEZXB0aCwgZWZmZWN0aXZlRmlsdGVySGVpZ2h0LCBlZmZlY3RpdmVGaWx0ZXJXaWR0aCxcbiAgICAgIHJvdW5kaW5nTW9kZSk7XG5cbiAgY29uc3Qgb3V0Q2hhbm5lbHMgPSBkZXB0aHdpc2UgPyBmaWx0ZXJDaGFubmVscyAqIGluQ2hhbm5lbHMgOiBmaWx0ZXJDaGFubmVscztcblxuICBsZXQgb3V0U2hhcGU6IFtudW1iZXIsIG51bWJlciwgbnVtYmVyLCBudW1iZXIsIG51bWJlcl07XG4gIGlmIChkYXRhRm9ybWF0ID09PSAnY2hhbm5lbHNGaXJzdCcpIHtcbiAgICBvdXRTaGFwZSA9IFtiYXRjaFNpemUsIG91dENoYW5uZWxzLCBvdXREZXB0aCwgb3V0SGVpZ2h0LCBvdXRXaWR0aF07XG4gIH0gZWxzZSBpZiAoZGF0YUZvcm1hdCA9PT0gJ2NoYW5uZWxzTGFzdCcpIHtcbiAgICBvdXRTaGFwZSA9IFtiYXRjaFNpemUsIG91dERlcHRoLCBvdXRIZWlnaHQsIG91dFdpZHRoLCBvdXRDaGFubmVsc107XG4gIH1cblxuICByZXR1cm4ge1xuICAgIGJhdGNoU2l6ZSxcbiAgICBkYXRhRm9ybWF0LFxuICAgIGluRGVwdGgsXG4gICAgaW5IZWlnaHQsXG4gICAgaW5XaWR0aCxcbiAgICBpbkNoYW5uZWxzLFxuICAgIG91dERlcHRoLFxuICAgIG91dEhlaWdodCxcbiAgICBvdXRXaWR0aCxcbiAgICBvdXRDaGFubmVscyxcbiAgICBwYWRJbmZvLFxuICAgIHN0cmlkZURlcHRoLFxuICAgIHN0cmlkZUhlaWdodCxcbiAgICBzdHJpZGVXaWR0aCxcbiAgICBmaWx0ZXJEZXB0aCxcbiAgICBmaWx0ZXJIZWlnaHQsXG4gICAgZmlsdGVyV2lkdGgsXG4gICAgZWZmZWN0aXZlRmlsdGVyRGVwdGgsXG4gICAgZWZmZWN0aXZlRmlsdGVySGVpZ2h0LFxuICAgIGVmZmVjdGl2ZUZpbHRlcldpZHRoLFxuICAgIGRpbGF0aW9uRGVwdGgsXG4gICAgZGlsYXRpb25IZWlnaHQsXG4gICAgZGlsYXRpb25XaWR0aCxcbiAgICBpblNoYXBlLFxuICAgIG91dFNoYXBlLFxuICAgIGZpbHRlclNoYXBlXG4gIH07XG59XG5cbmZ1bmN0aW9uIGNvbXB1dGVPdXRwdXRTaGFwZTJEKFxuICAgIGluU2hhcGU6IFtudW1iZXIsIG51bWJlcl0sIGZpZWxkU2l6ZTogbnVtYmVyLCBzdHJpZGU6IG51bWJlcixcbiAgICB6ZXJvUGFkPzogbnVtYmVyLCByb3VuZGluZ01vZGU/OiAnZmxvb3InfCdyb3VuZCd8J2NlaWwnKTogW251bWJlciwgbnVtYmVyXSB7XG4gIGlmICh6ZXJvUGFkID09IG51bGwpIHtcbiAgICB6ZXJvUGFkID0gY29tcHV0ZURlZmF1bHRQYWQoaW5TaGFwZSwgZmllbGRTaXplLCBzdHJpZGUpO1xuICB9XG4gIGNvbnN0IGlucHV0Um93cyA9IGluU2hhcGVbMF07XG4gIGNvbnN0IGlucHV0Q29scyA9IGluU2hhcGVbMV07XG5cbiAgY29uc3Qgb3V0cHV0Um93cyA9XG4gICAgICByb3VuZCgoaW5wdXRSb3dzIC0gZmllbGRTaXplICsgMiAqIHplcm9QYWQpIC8gc3RyaWRlICsgMSwgcm91bmRpbmdNb2RlKTtcbiAgY29uc3Qgb3V0cHV0Q29scyA9XG4gICAgICByb3VuZCgoaW5wdXRDb2xzIC0gZmllbGRTaXplICsgMiAqIHplcm9QYWQpIC8gc3RyaWRlICsgMSwgcm91bmRpbmdNb2RlKTtcblxuICByZXR1cm4gW291dHB1dFJvd3MsIG91dHB1dENvbHNdO1xufVxuXG5mdW5jdGlvbiBjb21wdXRlT3V0cHV0U2hhcGU0RChcbiAgICBpblNoYXBlOiBbbnVtYmVyLCBudW1iZXIsIG51bWJlciwgbnVtYmVyXSwgZmllbGRTaXplOiBudW1iZXIsXG4gICAgb3V0Q2hhbm5lbHM6IG51bWJlciwgc3RyaWRlOiBudW1iZXIsIHplcm9QYWQ/OiBudW1iZXIsXG4gICAgcm91bmRpbmdNb2RlPzogJ2Zsb29yJ3wncm91bmQnfCdjZWlsJyk6IFtudW1iZXIsIG51bWJlciwgbnVtYmVyLCBudW1iZXJdIHtcbiAgaWYgKHplcm9QYWQgPT0gbnVsbCkge1xuICAgIHplcm9QYWQgPSBjb21wdXRlRGVmYXVsdFBhZChpblNoYXBlLCBmaWVsZFNpemUsIHN0cmlkZSk7XG4gIH1cbiAgY29uc3QgaW5wdXREZXB0aCA9IGluU2hhcGVbMF07XG4gIGNvbnN0IGlucHV0Um93cyA9IGluU2hhcGVbMV07XG4gIGNvbnN0IGlucHV0Q29scyA9IGluU2hhcGVbMl07XG5cbiAgY29uc3Qgb3V0cHV0RGVwdGhzID1cbiAgICAgIHJvdW5kKChpbnB1dERlcHRoIC0gZmllbGRTaXplICsgMiAqIHplcm9QYWQpIC8gc3RyaWRlICsgMSwgcm91bmRpbmdNb2RlKTtcbiAgY29uc3Qgb3V0cHV0Um93cyA9XG4gICAgICByb3VuZCgoaW5wdXRSb3dzIC0gZmllbGRTaXplICsgMiAqIHplcm9QYWQpIC8gc3RyaWRlICsgMSwgcm91bmRpbmdNb2RlKTtcbiAgY29uc3Qgb3V0cHV0Q29scyA9XG4gICAgICByb3VuZCgoaW5wdXRDb2xzIC0gZmllbGRTaXplICsgMiAqIHplcm9QYWQpIC8gc3RyaWRlICsgMSwgcm91bmRpbmdNb2RlKTtcblxuICByZXR1cm4gW291dHB1dERlcHRocywgb3V0cHV0Um93cywgb3V0cHV0Q29scywgb3V0Q2hhbm5lbHNdO1xufVxuXG5leHBvcnQgZnVuY3Rpb24gY29tcHV0ZURlZmF1bHRQYWQoXG4gICAgaW5wdXRTaGFwZTogW251bWJlciwgbnVtYmVyXXxbbnVtYmVyLCBudW1iZXIsIG51bWJlciwgbnVtYmVyXSxcbiAgICBmaWVsZFNpemU6IG51bWJlciwgc3RyaWRlOiBudW1iZXIsIGRpbGF0aW9uID0gMSk6IG51bWJlciB7XG4gIGNvbnN0IGVmZmVjdGl2ZUZpZWxkU2l6ZSA9IGdldEVmZmVjdGl2ZUZpbHRlclNpemUoZmllbGRTaXplLCBkaWxhdGlvbik7XG4gIHJldHVybiBNYXRoLmZsb29yKFxuICAgICAgKGlucHV0U2hhcGVbMF0gKiAoc3RyaWRlIC0gMSkgLSBzdHJpZGUgKyBlZmZlY3RpdmVGaWVsZFNpemUpIC8gMik7XG59XG5cbmZ1bmN0aW9uIHBhcnNlVHVwbGVQYXJhbShwYXJhbTogbnVtYmVyfG51bWJlcltdKTogW251bWJlciwgbnVtYmVyLCBudW1iZXJdIHtcbiAgaWYgKHR5cGVvZiBwYXJhbSA9PT0gJ251bWJlcicpIHtcbiAgICByZXR1cm4gW3BhcmFtLCBwYXJhbSwgcGFyYW1dO1xuICB9XG4gIGlmIChwYXJhbS5sZW5ndGggPT09IDIpIHtcbiAgICByZXR1cm4gW3BhcmFtWzBdLCBwYXJhbVsxXSwgMV07XG4gIH1cbiAgcmV0dXJuIHBhcmFtIGFzIFtudW1iZXIsIG51bWJlciwgbnVtYmVyXTtcbn1cblxuZnVuY3Rpb24gcGFyc2UzVHVwbGVQYXJhbShwYXJhbTogbnVtYmVyfFtudW1iZXIsIG51bWJlciwgbnVtYmVyXSk6XG4gICAgW251bWJlciwgbnVtYmVyLCBudW1iZXJdIHtcbiAgcmV0dXJuIHR5cGVvZiBwYXJhbSA9PT0gJ251bWJlcicgPyBbcGFyYW0sIHBhcmFtLCBwYXJhbV0gOiBwYXJhbTtcbn1cblxuLyogU2VlIGh0dHBzOi8vd3d3LnRlbnNvcmZsb3cub3JnL2FwaV9kb2NzL3B5dGhvbi90Zi9ubi9hdHJvdXNfY29udjJkXG4gKiBBdHJvdXMgY29udm9sdXRpb24gaXMgZXF1aXZhbGVudCB0byBzdGFuZGFyZCBjb252b2x1dGlvbiB3aXRoIHVwc2FtcGxlZFxuICogZmlsdGVycyB3aXRoIGVmZmVjdGl2ZV9maWx0ZXJfaGVpZ2h0ID1cbiAqIGZpbHRlcl9oZWlnaHQgKyAoZmlsdGVyX2hlaWdodCAtIDEpICogKGRpbGF0aW9uIC0gMSlcbiAqIGFuZCBlZmZlY3RpdmVfZmlsdGVyX3dpZHRoID1cbiAqIGZpbHRlcl93aWR0aCArIChmaWx0ZXJfd2lkdGggLSAxKSAqIChkaWxhdGlvbiAtIDEpLFxuICogcHJvZHVjZWQgYnkgaW5zZXJ0aW5nIGRpbGF0aW9uIC0gMSB6ZXJvcyBhbG9uZyBjb25zZWN1dGl2ZSBlbGVtZW50cyBhY3Jvc3NcbiAqIHRoZSBmaWx0ZXJzJyBzcGF0aWFsIGRpbWVuc2lvbnMuXG4gKiBXaGVuIHRoZXJlIGlzIGEgZGlsYXRpb24sIHRoaXMgY29udmVydHMgYSBmaWx0ZXIgZGltZW5zaW9uIHRvIHRoZVxuICogZWZmZWN0aXZlIGZpbHRlciBkaW1lbnNpb24sIHNvIGl0IGNhbiBiZSB1c2VkIGluIGEgc3RhbmRhcmQgY29udm9sdXRpb24uXG4gKi9cbmZ1bmN0aW9uIGdldEVmZmVjdGl2ZUZpbHRlclNpemUoZmlsdGVyU2l6ZTogbnVtYmVyLCBkaWxhdGlvbjogbnVtYmVyKSB7XG4gIGlmIChkaWxhdGlvbiA8PSAxKSB7XG4gICAgcmV0dXJuIGZpbHRlclNpemU7XG4gIH1cblxuICByZXR1cm4gZmlsdGVyU2l6ZSArIChmaWx0ZXJTaXplIC0gMSkgKiAoZGlsYXRpb24gLSAxKTtcbn1cblxuZnVuY3Rpb24gZ2V0UGFkQW5kT3V0SW5mbyhcbiAgICBwYWQ6ICdzYW1lJ3wndmFsaWQnfG51bWJlcnxFeHBsaWNpdFBhZGRpbmcsIGluSGVpZ2h0OiBudW1iZXIsXG4gICAgaW5XaWR0aDogbnVtYmVyLCBzdHJpZGVIZWlnaHQ6IG51bWJlciwgc3RyaWRlV2lkdGg6IG51bWJlcixcbiAgICBmaWx0ZXJIZWlnaHQ6IG51bWJlciwgZmlsdGVyV2lkdGg6IG51bWJlcixcbiAgICByb3VuZGluZ01vZGU6ICdmbG9vcid8J3JvdW5kJ3wnY2VpbCcsXG4gICAgZGF0YUZvcm1hdDogJ2NoYW5uZWxzRmlyc3QnfFxuICAgICdjaGFubmVsc0xhc3QnKToge3BhZEluZm86IFBhZEluZm8sIG91dEhlaWdodDogbnVtYmVyLCBvdXRXaWR0aDogbnVtYmVyfSB7XG4gIGxldCBwYWRJbmZvOiBQYWRJbmZvO1xuICBsZXQgb3V0SGVpZ2h0OiBudW1iZXI7XG4gIGxldCBvdXRXaWR0aDogbnVtYmVyO1xuXG4gIGlmICh0eXBlb2YgcGFkID09PSAnbnVtYmVyJykge1xuICAgIGNvbnN0IHBhZFR5cGUgPSAocGFkID09PSAwKSA/ICdWQUxJRCcgOiAnTlVNQkVSJztcbiAgICBwYWRJbmZvID0ge3RvcDogcGFkLCBib3R0b206IHBhZCwgbGVmdDogcGFkLCByaWdodDogcGFkLCB0eXBlOiBwYWRUeXBlfTtcbiAgICBjb25zdCBvdXRTaGFwZSA9IGNvbXB1dGVPdXRwdXRTaGFwZTJEKFxuICAgICAgICBbaW5IZWlnaHQsIGluV2lkdGhdLCBmaWx0ZXJIZWlnaHQsIHN0cmlkZUhlaWdodCwgcGFkLCByb3VuZGluZ01vZGUpO1xuICAgIG91dEhlaWdodCA9IG91dFNoYXBlWzBdO1xuICAgIG91dFdpZHRoID0gb3V0U2hhcGVbMV07XG4gIH0gZWxzZSBpZiAocGFkID09PSAnc2FtZScpIHtcbiAgICBvdXRIZWlnaHQgPSBNYXRoLmNlaWwoaW5IZWlnaHQgLyBzdHJpZGVIZWlnaHQpO1xuICAgIG91dFdpZHRoID0gTWF0aC5jZWlsKGluV2lkdGggLyBzdHJpZGVXaWR0aCk7XG4gICAgY29uc3QgcGFkQWxvbmdIZWlnaHQgPVxuICAgICAgICBNYXRoLm1heCgwLCAob3V0SGVpZ2h0IC0gMSkgKiBzdHJpZGVIZWlnaHQgKyBmaWx0ZXJIZWlnaHQgLSBpbkhlaWdodCk7XG4gICAgY29uc3QgcGFkQWxvbmdXaWR0aCA9XG4gICAgICAgIE1hdGgubWF4KDAsIChvdXRXaWR0aCAtIDEpICogc3RyaWRlV2lkdGggKyBmaWx0ZXJXaWR0aCAtIGluV2lkdGgpO1xuICAgIGNvbnN0IHRvcCA9IE1hdGguZmxvb3IocGFkQWxvbmdIZWlnaHQgLyAyKTtcbiAgICBjb25zdCBib3R0b20gPSBwYWRBbG9uZ0hlaWdodCAtIHRvcDtcbiAgICBjb25zdCBsZWZ0ID0gTWF0aC5mbG9vcihwYWRBbG9uZ1dpZHRoIC8gMik7XG4gICAgY29uc3QgcmlnaHQgPSBwYWRBbG9uZ1dpZHRoIC0gbGVmdDtcbiAgICBwYWRJbmZvID0ge3RvcCwgYm90dG9tLCBsZWZ0LCByaWdodCwgdHlwZTogJ1NBTUUnfTtcbiAgfSBlbHNlIGlmIChwYWQgPT09ICd2YWxpZCcpIHtcbiAgICBwYWRJbmZvID0ge3RvcDogMCwgYm90dG9tOiAwLCBsZWZ0OiAwLCByaWdodDogMCwgdHlwZTogJ1ZBTElEJ307XG4gICAgb3V0SGVpZ2h0ID0gTWF0aC5jZWlsKChpbkhlaWdodCAtIGZpbHRlckhlaWdodCArIDEpIC8gc3RyaWRlSGVpZ2h0KTtcbiAgICBvdXRXaWR0aCA9IE1hdGguY2VpbCgoaW5XaWR0aCAtIGZpbHRlcldpZHRoICsgMSkgLyBzdHJpZGVXaWR0aCk7XG4gIH0gZWxzZSBpZiAodHlwZW9mIHBhZCA9PT0gJ29iamVjdCcpIHtcbiAgICBjb25zdCB0b3AgPSBkYXRhRm9ybWF0ID09PSAnY2hhbm5lbHNMYXN0JyA/IHBhZFsxXVswXSA6IHBhZFsyXVswXTtcbiAgICBjb25zdCBib3R0b20gPSBkYXRhRm9ybWF0ID09PSAnY2hhbm5lbHNMYXN0JyA/IHBhZFsxXVsxXSA6IHBhZFsyXVsxXTtcbiAgICBjb25zdCBsZWZ0ID0gZGF0YUZvcm1hdCA9PT0gJ2NoYW5uZWxzTGFzdCcgPyBwYWRbMl1bMF0gOiBwYWRbM11bMF07XG4gICAgY29uc3QgcmlnaHQgPSBkYXRhRm9ybWF0ID09PSAnY2hhbm5lbHNMYXN0JyA/IHBhZFsyXVsxXSA6IHBhZFszXVsxXTtcbiAgICBjb25zdCBwYWRUeXBlID0gKHRvcCA9PT0gMCAmJiBib3R0b20gPT09IDAgJiYgbGVmdCA9PT0gMCAmJiByaWdodCA9PT0gMCkgP1xuICAgICAgICAnVkFMSUQnIDpcbiAgICAgICAgJ0VYUExJQ0lUJztcbiAgICBwYWRJbmZvID0ge3RvcCwgYm90dG9tLCBsZWZ0LCByaWdodCwgdHlwZTogcGFkVHlwZX07XG4gICAgb3V0SGVpZ2h0ID0gcm91bmQoXG4gICAgICAgIChpbkhlaWdodCAtIGZpbHRlckhlaWdodCArIHRvcCArIGJvdHRvbSkgLyBzdHJpZGVIZWlnaHQgKyAxLFxuICAgICAgICByb3VuZGluZ01vZGUpO1xuICAgIG91dFdpZHRoID0gcm91bmQoXG4gICAgICAgIChpbldpZHRoIC0gZmlsdGVyV2lkdGggKyBsZWZ0ICsgcmlnaHQpIC8gc3RyaWRlV2lkdGggKyAxLCByb3VuZGluZ01vZGUpO1xuICB9IGVsc2Uge1xuICAgIHRocm93IEVycm9yKGBVbmtub3duIHBhZGRpbmcgcGFyYW1ldGVyOiAke3BhZH1gKTtcbiAgfVxuICByZXR1cm4ge3BhZEluZm8sIG91dEhlaWdodCwgb3V0V2lkdGh9O1xufVxuXG5mdW5jdGlvbiBnZXQzRFBhZEFuZE91dEluZm8oXG4gICAgcGFkOiAnc2FtZSd8J3ZhbGlkJ3xudW1iZXIsIGluRGVwdGg6IG51bWJlciwgaW5IZWlnaHQ6IG51bWJlcixcbiAgICBpbldpZHRoOiBudW1iZXIsIHN0cmlkZURlcHRoOiBudW1iZXIsIHN0cmlkZUhlaWdodDogbnVtYmVyLFxuICAgIHN0cmlkZVdpZHRoOiBudW1iZXIsIGZpbHRlckRlcHRoOiBudW1iZXIsIGZpbHRlckhlaWdodDogbnVtYmVyLFxuICAgIGZpbHRlcldpZHRoOiBudW1iZXIsIHJvdW5kaW5nTW9kZT86ICdmbG9vcid8J3JvdW5kJ3wnY2VpbCcpOiB7XG4gIHBhZEluZm86IFBhZEluZm8zRCxcbiAgb3V0RGVwdGg6IG51bWJlcixcbiAgb3V0SGVpZ2h0OiBudW1iZXIsXG4gIG91dFdpZHRoOiBudW1iZXJcbn0ge1xuICBsZXQgcGFkSW5mbzogUGFkSW5mbzNEO1xuICBsZXQgb3V0RGVwdGg6IG51bWJlcjtcbiAgbGV0IG91dEhlaWdodDogbnVtYmVyO1xuICBsZXQgb3V0V2lkdGg6IG51bWJlcjtcblxuICBpZiAodHlwZW9mIHBhZCA9PT0gJ251bWJlcicpIHtcbiAgICBjb25zdCBwYWRUeXBlID0gKHBhZCA9PT0gMCkgPyAnVkFMSUQnIDogJ05VTUJFUic7XG4gICAgcGFkSW5mbyA9IHtcbiAgICAgIHRvcDogcGFkLFxuICAgICAgYm90dG9tOiBwYWQsXG4gICAgICBsZWZ0OiBwYWQsXG4gICAgICByaWdodDogcGFkLFxuICAgICAgZnJvbnQ6IHBhZCxcbiAgICAgIGJhY2s6IHBhZCxcbiAgICAgIHR5cGU6IHBhZFR5cGVcbiAgICB9O1xuICAgIGNvbnN0IG91dFNoYXBlID0gY29tcHV0ZU91dHB1dFNoYXBlNEQoXG4gICAgICAgIFtpbkRlcHRoLCBpbkhlaWdodCwgaW5XaWR0aCwgMV0sIGZpbHRlckRlcHRoLCAxLCBzdHJpZGVEZXB0aCwgcGFkLFxuICAgICAgICByb3VuZGluZ01vZGUpO1xuICAgIG91dERlcHRoID0gb3V0U2hhcGVbMF07XG4gICAgb3V0SGVpZ2h0ID0gb3V0U2hhcGVbMV07XG4gICAgb3V0V2lkdGggPSBvdXRTaGFwZVsyXTtcbiAgfSBlbHNlIGlmIChwYWQgPT09ICdzYW1lJykge1xuICAgIG91dERlcHRoID0gTWF0aC5jZWlsKGluRGVwdGggLyBzdHJpZGVEZXB0aCk7XG4gICAgb3V0SGVpZ2h0ID0gTWF0aC5jZWlsKGluSGVpZ2h0IC8gc3RyaWRlSGVpZ2h0KTtcbiAgICBvdXRXaWR0aCA9IE1hdGguY2VpbChpbldpZHRoIC8gc3RyaWRlV2lkdGgpO1xuICAgIGNvbnN0IHBhZEFsb25nRGVwdGggPSAob3V0RGVwdGggLSAxKSAqIHN0cmlkZURlcHRoICsgZmlsdGVyRGVwdGggLSBpbkRlcHRoO1xuICAgIGNvbnN0IHBhZEFsb25nSGVpZ2h0ID1cbiAgICAgICAgKG91dEhlaWdodCAtIDEpICogc3RyaWRlSGVpZ2h0ICsgZmlsdGVySGVpZ2h0IC0gaW5IZWlnaHQ7XG4gICAgY29uc3QgcGFkQWxvbmdXaWR0aCA9IChvdXRXaWR0aCAtIDEpICogc3RyaWRlV2lkdGggKyBmaWx0ZXJXaWR0aCAtIGluV2lkdGg7XG4gICAgY29uc3QgZnJvbnQgPSBNYXRoLmZsb29yKHBhZEFsb25nRGVwdGggLyAyKTtcbiAgICBjb25zdCBiYWNrID0gcGFkQWxvbmdEZXB0aCAtIGZyb250O1xuICAgIGNvbnN0IHRvcCA9IE1hdGguZmxvb3IocGFkQWxvbmdIZWlnaHQgLyAyKTtcbiAgICBjb25zdCBib3R0b20gPSBwYWRBbG9uZ0hlaWdodCAtIHRvcDtcbiAgICBjb25zdCBsZWZ0ID0gTWF0aC5mbG9vcihwYWRBbG9uZ1dpZHRoIC8gMik7XG4gICAgY29uc3QgcmlnaHQgPSBwYWRBbG9uZ1dpZHRoIC0gbGVmdDtcblxuICAgIHBhZEluZm8gPSB7dG9wLCBib3R0b20sIGxlZnQsIHJpZ2h0LCBmcm9udCwgYmFjaywgdHlwZTogJ1NBTUUnfTtcbiAgfSBlbHNlIGlmIChwYWQgPT09ICd2YWxpZCcpIHtcbiAgICBwYWRJbmZvID0ge1xuICAgICAgdG9wOiAwLFxuICAgICAgYm90dG9tOiAwLFxuICAgICAgbGVmdDogMCxcbiAgICAgIHJpZ2h0OiAwLFxuICAgICAgZnJvbnQ6IDAsXG4gICAgICBiYWNrOiAwLFxuICAgICAgdHlwZTogJ1ZBTElEJ1xuICAgIH07XG4gICAgb3V0RGVwdGggPSBNYXRoLmNlaWwoKGluRGVwdGggLSBmaWx0ZXJEZXB0aCArIDEpIC8gc3RyaWRlRGVwdGgpO1xuICAgIG91dEhlaWdodCA9IE1hdGguY2VpbCgoaW5IZWlnaHQgLSBmaWx0ZXJIZWlnaHQgKyAxKSAvIHN0cmlkZUhlaWdodCk7XG4gICAgb3V0V2lkdGggPSBNYXRoLmNlaWwoKGluV2lkdGggLSBmaWx0ZXJXaWR0aCArIDEpIC8gc3RyaWRlV2lkdGgpO1xuICB9IGVsc2Uge1xuICAgIHRocm93IEVycm9yKGBVbmtub3duIHBhZGRpbmcgcGFyYW1ldGVyOiAke3BhZH1gKTtcbiAgfVxuICByZXR1cm4ge3BhZEluZm8sIG91dERlcHRoLCBvdXRIZWlnaHQsIG91dFdpZHRofTtcbn1cblxuLyoqXG4gKiBSb3VuZHMgYSB2YWx1ZSBkZXBlbmRpbmcgb24gdGhlIHJvdW5kaW5nIG1vZGVcbiAqIEBwYXJhbSB2YWx1ZVxuICogQHBhcmFtIHJvdW5kaW5nTW9kZSBBIHN0cmluZyBmcm9tOiAnY2VpbCcsICdyb3VuZCcsICdmbG9vcicuIElmIG5vbmUgaXNcbiAqICAgICBwcm92aWRlZCwgaXQgd2lsbCBkZWZhdWx0IHRvIHRydW5jYXRlLlxuICovXG5mdW5jdGlvbiByb3VuZCh2YWx1ZTogbnVtYmVyLCByb3VuZGluZ01vZGU/OiAnZmxvb3InfCdyb3VuZCd8J2NlaWwnKSB7XG4gIGlmICghcm91bmRpbmdNb2RlKSB7XG4gICAgcmV0dXJuIE1hdGgudHJ1bmModmFsdWUpO1xuICB9XG4gIHN3aXRjaCAocm91bmRpbmdNb2RlKSB7XG4gICAgY2FzZSAncm91bmQnOlxuICAgICAgLy8gdXNlZCBmb3IgQ2FmZmUgQ29udlxuICAgICAgcmV0dXJuIE1hdGgucm91bmQodmFsdWUpO1xuICAgIGNhc2UgJ2NlaWwnOlxuICAgICAgLy8gdXNlZCBmb3IgQ2FmZmUgUG9vbFxuICAgICAgcmV0dXJuIE1hdGguY2VpbCh2YWx1ZSk7XG4gICAgY2FzZSAnZmxvb3InOlxuICAgICAgcmV0dXJuIE1hdGguZmxvb3IodmFsdWUpO1xuICAgIGRlZmF1bHQ6XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoYFVua25vd24gcm91bmRpbmdNb2RlICR7cm91bmRpbmdNb2RlfWApO1xuICB9XG59XG5cbmV4cG9ydCBmdW5jdGlvbiB0dXBsZVZhbHVlc0FyZU9uZShwYXJhbTogbnVtYmVyfG51bWJlcltdKTogYm9vbGVhbiB7XG4gIGNvbnN0IFtkaW1BLCBkaW1CLCBkaW1DXSA9IHBhcnNlVHVwbGVQYXJhbShwYXJhbSk7XG4gIHJldHVybiBkaW1BID09PSAxICYmIGRpbUIgPT09IDEgJiYgZGltQyA9PT0gMTtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGVpdGhlclN0cmlkZXNPckRpbGF0aW9uc0FyZU9uZShcbiAgICBzdHJpZGVzOiBudW1iZXJ8bnVtYmVyW10sIGRpbGF0aW9uczogbnVtYmVyfG51bWJlcltdKTogYm9vbGVhbiB7XG4gIHJldHVybiB0dXBsZVZhbHVlc0FyZU9uZShzdHJpZGVzKSB8fCB0dXBsZVZhbHVlc0FyZU9uZShkaWxhdGlvbnMpO1xufVxuXG4vKipcbiAqIENvbnZlcnQgQ29udjJEIGRhdGFGb3JtYXQgZnJvbSAnTkhXQyd8J05DSFcnIHRvXG4gKiAgICAnY2hhbm5lbHNMYXN0J3wnY2hhbm5lbHNGaXJzdCdcbiAqIEBwYXJhbSBkYXRhRm9ybWF0IGluICdOSFdDJ3wnTkNIVycgbW9kZVxuICogQHJldHVybiBkYXRhRm9ybWF0IGluICdjaGFubmVsc0xhc3QnfCdjaGFubmVsc0ZpcnN0JyBtb2RlXG4gKiBAdGhyb3dzIHVua25vd24gZGF0YUZvcm1hdFxuICovXG5leHBvcnQgZnVuY3Rpb24gY29udmVydENvbnYyRERhdGFGb3JtYXQoZGF0YUZvcm1hdDogJ05IV0MnfCdOQ0hXJyk6XG4gICAgJ2NoYW5uZWxzTGFzdCd8J2NoYW5uZWxzRmlyc3QnIHtcbiAgaWYgKGRhdGFGb3JtYXQgPT09ICdOSFdDJykge1xuICAgIHJldHVybiAnY2hhbm5lbHNMYXN0JztcbiAgfSBlbHNlIGlmIChkYXRhRm9ybWF0ID09PSAnTkNIVycpIHtcbiAgICByZXR1cm4gJ2NoYW5uZWxzRmlyc3QnO1xuICB9IGVsc2Uge1xuICAgIHRocm93IG5ldyBFcnJvcihgVW5rbm93biBkYXRhRm9ybWF0ICR7ZGF0YUZvcm1hdH1gKTtcbiAgfVxufVxuXG4vKipcbiAqIENoZWNrIHZhbGlkaXR5IG9mIHBhZCB3aGVuIHVzaW5nIGRpbVJvdW5kaW5nTW9kZS5cbiAqIEBwYXJhbSBvcERlc2MgQSBzdHJpbmcgb2Ygb3AgZGVzY3JpcHRpb25cbiAqIEBwYXJhbSBwYWQgVGhlIHR5cGUgb2YgcGFkZGluZyBhbGdvcml0aG0uXG4gKiAgIC0gYHNhbWVgIGFuZCBzdHJpZGUgMTogb3V0cHV0IHdpbGwgYmUgb2Ygc2FtZSBzaXplIGFzIGlucHV0LFxuICogICAgICAgcmVnYXJkbGVzcyBvZiBmaWx0ZXIgc2l6ZS5cbiAqICAgLSBgdmFsaWRgIG91dHB1dCB3aWxsIGJlIHNtYWxsZXIgdGhhbiBpbnB1dCBpZiBmaWx0ZXIgaXMgbGFyZ2VyXG4gKiAgICAgICB0aGFuIDF4MS5cbiAqICAgLSBGb3IgbW9yZSBpbmZvLCBzZWUgdGhpcyBndWlkZTpcbiAqICAgICBbaHR0cHM6Ly93d3cudGVuc29yZmxvdy5vcmcvYXBpX2RvY3MvcHl0aG9uL3RmL25uL2NvbnZvbHV0aW9uXShcbiAqICAgICAgICAgIGh0dHBzOi8vd3d3LnRlbnNvcmZsb3cub3JnL2FwaV9kb2NzL3B5dGhvbi90Zi9ubi9jb252b2x1dGlvbilcbiAqIEBwYXJhbSBkaW1Sb3VuZGluZ01vZGUgQSBzdHJpbmcgZnJvbTogJ2NlaWwnLCAncm91bmQnLCAnZmxvb3InLiBJZiBub25lIGlzXG4gKiAgICAgcHJvdmlkZWQsIGl0IHdpbGwgZGVmYXVsdCB0byB0cnVuY2F0ZS5cbiAqIEB0aHJvd3MgdW5rbm93biBwYWRkaW5nIHBhcmFtZXRlclxuICovXG5leHBvcnQgZnVuY3Rpb24gY2hlY2tQYWRPbkRpbVJvdW5kaW5nTW9kZShcbiAgICBvcERlc2M6IHN0cmluZywgcGFkOiAndmFsaWQnfCdzYW1lJ3xudW1iZXJ8RXhwbGljaXRQYWRkaW5nLFxuICAgIGRpbVJvdW5kaW5nTW9kZT86ICdmbG9vcid8J3JvdW5kJ3wnY2VpbCcpIHtcbiAgaWYgKGRpbVJvdW5kaW5nTW9kZSAhPSBudWxsKSB7XG4gICAgaWYgKHR5cGVvZiBwYWQgPT09ICdzdHJpbmcnKSB7XG4gICAgICB0aHJvdyBFcnJvcihcbiAgICAgICAgICBgRXJyb3IgaW4gJHtvcERlc2N9OiBwYWQgbXVzdCBiZSBhbiBpbnRlZ2VyIHdoZW4gdXNpbmcgYCAgK1xuICAgICAgICAgIGBkaW1Sb3VuZGluZ01vZGUgJHtkaW1Sb3VuZGluZ01vZGV9IGJ1dCBnb3QgcGFkICR7cGFkfS5gKTtcbiAgICB9IGVsc2UgaWYgKHR5cGVvZiBwYWQgPT09ICdudW1iZXInKSB7XG4gICAgICB1dGlsLmFzc2VydChcbiAgICAgICAgdXRpbC5pc0ludChwYWQpLFxuICAgICAgICAgICgpID0+IGBFcnJvciBpbiAke29wRGVzY306IHBhZCBtdXN0IGJlIGFuIGludGVnZXIgd2hlbiB1c2luZyBgICtcbiAgICAgICAgICAgICAgYGRpbVJvdW5kaW5nTW9kZSAke2RpbVJvdW5kaW5nTW9kZX0gYnV0IGdvdCBwYWQgJHtwYWR9LmApO1xuICAgIH0gZWxzZSBpZiAodHlwZW9mIHBhZCA9PT0gJ29iamVjdCcpIHtcbiAgICAgIChwYWQgYXMgRXhwbGljaXRQYWRkaW5nKS5mb3JFYWNoKHAgPT4ge3AuZm9yRWFjaCh2ID0+e1xuICAgICAgICB1dGlsLmFzc2VydChcbiAgICAgICAgICB1dGlsLmlzSW50KHYpLFxuICAgICAgICAgICAgKCkgPT4gYEVycm9yIGluICR7b3BEZXNjfTogcGFkIG11c3QgYmUgYW4gaW50ZWdlciB3aGVuIHVzaW5nIGAgK1xuICAgICAgICAgICAgICAgIGBkaW1Sb3VuZGluZ01vZGUgJHtkaW1Sb3VuZGluZ01vZGV9IGJ1dCBnb3QgcGFkICR7dn0uYCk7XG4gICAgICAgIH0pO1xuICAgICAgfSk7XG4gICAgfSBlbHNlIHtcbiAgICAgIHRocm93IEVycm9yKGBFcnJvciBpbiAke29wRGVzY306IFVua25vd24gcGFkZGluZyBwYXJhbWV0ZXI6ICR7cGFkfWApO1xuICAgIH1cbiAgfVxufVxuIl19","/**\n * @license\n * Copyright 2018 Google LLC. All Rights Reserved.\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n * =============================================================================\n */\nimport { ENGINE } from '../engine';\nimport { Cos } from '../kernel_names';\nimport { convertToTensor } from '../tensor_util_env';\nimport { op } from './operation';\n/**\n * Computes cos of the input `tf.Tensor` element-wise: `cos(x)`\n *\n * ```js\n * const x = tf.tensor1d([0, Math.PI / 2, Math.PI * 3 / 4]);\n *\n * x.cos().print(); // or tf.cos(x)\n * ```\n * @param x The input tensor. Must be float32 type.\n *\n * @doc {heading: 'Operations', subheading: 'Basic math'}\n */\nfunction cos_(x) {\n const $x = convertToTensor(x, 'x', 'cos', 'float32');\n const inputs = { x: $x };\n return ENGINE.runKernel(Cos, inputs);\n}\nexport const cos = op({ cos_ });\n//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY29zLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vLi4vdGZqcy1jb3JlL3NyYy9vcHMvY29zLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBOzs7Ozs7Ozs7Ozs7Ozs7R0FlRztBQUVILE9BQU8sRUFBQyxNQUFNLEVBQUMsTUFBTSxXQUFXLENBQUM7QUFDakMsT0FBTyxFQUFDLEdBQUcsRUFBWSxNQUFNLGlCQUFpQixDQUFDO0FBRy9DLE9BQU8sRUFBQyxlQUFlLEVBQUMsTUFBTSxvQkFBb0IsQ0FBQztBQUduRCxPQUFPLEVBQUMsRUFBRSxFQUFDLE1BQU0sYUFBYSxDQUFDO0FBRS9COzs7Ozs7Ozs7OztHQVdHO0FBQ0gsU0FBUyxJQUFJLENBQW1CLENBQWU7SUFDN0MsTUFBTSxFQUFFLEdBQUcsZUFBZSxDQUFDLENBQUMsRUFBRSxHQUFHLEVBQUUsS0FBSyxFQUFFLFNBQVMsQ0FBQyxDQUFDO0lBRXJELE1BQU0sTUFBTSxHQUFjLEVBQUMsQ0FBQyxFQUFFLEVBQUUsRUFBQyxDQUFDO0lBRWxDLE9BQU8sTUFBTSxDQUFDLFNBQVMsQ0FBQyxHQUFHLEVBQUUsTUFBOEIsQ0FBQyxDQUFDO0FBQy9ELENBQUM7QUFDRCxNQUFNLENBQUMsTUFBTSxHQUFHLEdBQUcsRUFBRSxDQUFDLEVBQUMsSUFBSSxFQUFDLENBQUMsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbIi8qKlxuICogQGxpY2Vuc2VcbiAqIENvcHlyaWdodCAyMDE4IEdvb2dsZSBMTEMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuXG4gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgXCJMaWNlbnNlXCIpO1xuICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLlxuICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0XG4gKlxuICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wXG4gKlxuICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZVxuICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gXCJBUyBJU1wiIEJBU0lTLFxuICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuXG4gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kXG4gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS5cbiAqID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4gKi9cblxuaW1wb3J0IHtFTkdJTkV9IGZyb20gJy4uL2VuZ2luZSc7XG5pbXBvcnQge0NvcywgQ29zSW5wdXRzfSBmcm9tICcuLi9rZXJuZWxfbmFtZXMnO1xuaW1wb3J0IHtUZW5zb3J9IGZyb20gJy4uL3RlbnNvcic7XG5pbXBvcnQge05hbWVkVGVuc29yTWFwfSBmcm9tICcuLi90ZW5zb3JfdHlwZXMnO1xuaW1wb3J0IHtjb252ZXJ0VG9UZW5zb3J9IGZyb20gJy4uL3RlbnNvcl91dGlsX2Vudic7XG5pbXBvcnQge1RlbnNvckxpa2V9IGZyb20gJy4uL3R5cGVzJztcblxuaW1wb3J0IHtvcH0gZnJvbSAnLi9vcGVyYXRpb24nO1xuXG4vKipcbiAqIENvbXB1dGVzIGNvcyBvZiB0aGUgaW5wdXQgYHRmLlRlbnNvcmAgZWxlbWVudC13aXNlOiBgY29zKHgpYFxuICpcbiAqIGBgYGpzXG4gKiBjb25zdCB4ID0gdGYudGVuc29yMWQoWzAsIE1hdGguUEkgLyAyLCBNYXRoLlBJICogMyAvIDRdKTtcbiAqXG4gKiB4LmNvcygpLnByaW50KCk7ICAvLyBvciB0Zi5jb3MoeClcbiAqIGBgYFxuICogQHBhcmFtIHggVGhlIGlucHV0IHRlbnNvci4gTXVzdCBiZSBmbG9hdDMyIHR5cGUuXG4gKlxuICogQGRvYyB7aGVhZGluZzogJ09wZXJhdGlvbnMnLCBzdWJoZWFkaW5nOiAnQmFzaWMgbWF0aCd9XG4gKi9cbmZ1bmN0aW9uIGNvc188VCBleHRlbmRzIFRlbnNvcj4oeDogVHxUZW5zb3JMaWtlKTogVCB7XG4gIGNvbnN0ICR4ID0gY29udmVydFRvVGVuc29yKHgsICd4JywgJ2NvcycsICdmbG9hdDMyJyk7XG5cbiAgY29uc3QgaW5wdXRzOiBDb3NJbnB1dHMgPSB7eDogJHh9O1xuXG4gIHJldHVybiBFTkdJTkUucnVuS2VybmVsKENvcywgaW5wdXRzIGFzIHt9IGFzIE5hbWVkVGVuc29yTWFwKTtcbn1cbmV4cG9ydCBjb25zdCBjb3MgPSBvcCh7Y29zX30pO1xuIl19","/**\n * @license\n * Copyright 2018 Google LLC. All Rights Reserved.\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n * =============================================================================\n */\nimport { ENGINE } from '../engine';\nimport { Cosh } from '../kernel_names';\nimport { convertToTensor } from '../tensor_util_env';\nimport { op } from './operation';\n/**\n * Computes hyperbolic cos of the input `tf.Tensor` element-wise: `cosh(x)`\n *\n * ```js\n * const x = tf.tensor1d([0, 1, -1, .7]);\n *\n * x.cosh().print(); // or tf.cosh(x)\n * ```\n * @param x The input tensor. Must be float32 type.\n *\n * @doc {heading: 'Operations', subheading: 'Basic math'}\n */\nfunction cosh_(x) {\n const $x = convertToTensor(x, 'x', 'cosh', 'float32');\n const inputs = { x: $x };\n return ENGINE.runKernel(Cosh, inputs);\n}\nexport const cosh = op({ cosh_ });\n//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY29zaC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uLy4uL3RmanMtY29yZS9zcmMvb3BzL2Nvc2gudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUE7Ozs7Ozs7Ozs7Ozs7OztHQWVHO0FBRUgsT0FBTyxFQUFDLE1BQU0sRUFBQyxNQUFNLFdBQVcsQ0FBQztBQUNqQyxPQUFPLEVBQUMsSUFBSSxFQUFhLE1BQU0saUJBQWlCLENBQUM7QUFHakQsT0FBTyxFQUFDLGVBQWUsRUFBQyxNQUFNLG9CQUFvQixDQUFDO0FBR25ELE9BQU8sRUFBQyxFQUFFLEVBQUMsTUFBTSxhQUFhLENBQUM7QUFFL0I7Ozs7Ozs7Ozs7O0dBV0c7QUFDSCxTQUFTLEtBQUssQ0FBbUIsQ0FBZTtJQUM5QyxNQUFNLEVBQUUsR0FBRyxlQUFlLENBQUMsQ0FBQyxFQUFFLEdBQUcsRUFBRSxNQUFNLEVBQUUsU0FBUyxDQUFDLENBQUM7SUFDdEQsTUFBTSxNQUFNLEdBQWUsRUFBQyxDQUFDLEVBQUUsRUFBRSxFQUFDLENBQUM7SUFFbkMsT0FBTyxNQUFNLENBQUMsU0FBUyxDQUFDLElBQUksRUFBRSxNQUE4QixDQUFDLENBQUM7QUFDaEUsQ0FBQztBQUNELE1BQU0sQ0FBQyxNQUFNLElBQUksR0FBRyxFQUFFLENBQUMsRUFBQyxLQUFLLEVBQUMsQ0FBQyxDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiLyoqXG4gKiBAbGljZW5zZVxuICogQ29weXJpZ2h0IDIwMTggR29vZ2xlIExMQy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC5cbiAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSBcIkxpY2Vuc2VcIik7XG4gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuXG4gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXRcbiAqXG4gKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjBcbiAqXG4gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlXG4gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiBcIkFTIElTXCIgQkFTSVMsXG4gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC5cbiAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmRcbiAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLlxuICogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbiAqL1xuXG5pbXBvcnQge0VOR0lORX0gZnJvbSAnLi4vZW5naW5lJztcbmltcG9ydCB7Q29zaCwgQ29zaElucHV0c30gZnJvbSAnLi4va2VybmVsX25hbWVzJztcbmltcG9ydCB7VGVuc29yfSBmcm9tICcuLi90ZW5zb3InO1xuaW1wb3J0IHtOYW1lZFRlbnNvck1hcH0gZnJvbSAnLi4vdGVuc29yX3R5cGVzJztcbmltcG9ydCB7Y29udmVydFRvVGVuc29yfSBmcm9tICcuLi90ZW5zb3JfdXRpbF9lbnYnO1xuaW1wb3J0IHtUZW5zb3JMaWtlfSBmcm9tICcuLi90eXBlcyc7XG5cbmltcG9ydCB7b3B9IGZyb20gJy4vb3BlcmF0aW9uJztcblxuLyoqXG4gKiBDb21wdXRlcyBoeXBlcmJvbGljIGNvcyBvZiB0aGUgaW5wdXQgYHRmLlRlbnNvcmAgZWxlbWVudC13aXNlOiBgY29zaCh4KWBcbiAqXG4gKiBgYGBqc1xuICogY29uc3QgeCA9IHRmLnRlbnNvcjFkKFswLCAxLCAtMSwgLjddKTtcbiAqXG4gKiB4LmNvc2goKS5wcmludCgpOyAgLy8gb3IgdGYuY29zaCh4KVxuICogYGBgXG4gKiBAcGFyYW0geCBUaGUgaW5wdXQgdGVuc29yLiBNdXN0IGJlIGZsb2F0MzIgdHlwZS5cbiAqXG4gKiBAZG9jIHtoZWFkaW5nOiAnT3BlcmF0aW9ucycsIHN1YmhlYWRpbmc6ICdCYXNpYyBtYXRoJ31cbiAqL1xuZnVuY3Rpb24gY29zaF88VCBleHRlbmRzIFRlbnNvcj4oeDogVHxUZW5zb3JMaWtlKTogVCB7XG4gIGNvbnN0ICR4ID0gY29udmVydFRvVGVuc29yKHgsICd4JywgJ2Nvc2gnLCAnZmxvYXQzMicpO1xuICBjb25zdCBpbnB1dHM6IENvc2hJbnB1dHMgPSB7eDogJHh9O1xuXG4gIHJldHVybiBFTkdJTkUucnVuS2VybmVsKENvc2gsIGlucHV0cyBhcyB7fSBhcyBOYW1lZFRlbnNvck1hcCk7XG59XG5leHBvcnQgY29uc3QgY29zaCA9IG9wKHtjb3NoX30pO1xuIl19","/**\n * @license\n * Copyright 2022 Google LLC. All Rights Reserved.\n * Licensed under the Apache License, Version 2.0 (the 'License');\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an 'AS IS' BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n * =============================================================================\n */\nimport { ENGINE } from '../engine';\nimport { Cumprod } from '../kernel_names';\nimport { convertToTensor } from '../tensor_util_env';\nimport { op } from './operation';\n/**\n * Computes the cumulative product of a `tf.Tensor` along `axis`.\n *\n * ```js\n * const x = tf.tensor([1, 2, 3, 4]);\n * x.cumprod().print();\n * ```\n * ```js\n * const x = tf.tensor([[1, 2], [3, 4]]);\n * x.cumprod().print();\n * ```\n *\n * @param x The input tensor to cumulatively multiply.\n * @param axis The axis along which to multiply. Optional. Defaults to 0.\n * @param exclusive Whether to perform exclusive cumulative product. Optional.\n * Defaults to false. If set to true then the product of each tensor entry\n * does not include its own value, but only the values previous to it\n * along the specified axis.\n * @param reverse Whether to multiply in the opposite direction. Optional.\n * Defaults to false.\n *\n * @doc {heading: 'Operations', subheading: 'Scan'}\n */\nfunction cumprod_(x, axis = 0, exclusive = false, reverse = false) {\n const $x = convertToTensor(x, 'x', 'cumprod');\n const inputs = { x: $x };\n const attrs = { axis, exclusive, reverse };\n return ENGINE.runKernel(Cumprod, inputs, attrs);\n}\nexport const cumprod = op({ cumprod_ });\n//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY3VtcHJvZC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uLy4uL3RmanMtY29yZS9zcmMvb3BzL2N1bXByb2QudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUE7Ozs7Ozs7Ozs7Ozs7OztHQWVHO0FBRUgsT0FBTyxFQUFFLE1BQU0sRUFBRSxNQUFNLFdBQVcsQ0FBQztBQUNuQyxPQUFPLEVBQUUsT0FBTyxFQUErQixNQUFNLGlCQUFpQixDQUFDO0FBSXZFLE9BQU8sRUFBRSxlQUFlLEVBQUUsTUFBTSxvQkFBb0IsQ0FBQztBQUdyRCxPQUFPLEVBQUUsRUFBRSxFQUFFLE1BQU0sYUFBYSxDQUFDO0FBRWpDOzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7O0dBc0JHO0FBQ0gsU0FBUyxRQUFRLENBQ2YsQ0FBc0IsRUFDdEIsSUFBSSxHQUFHLENBQUMsRUFDUixTQUFTLEdBQUcsS0FBSyxFQUNqQixPQUFPLEdBQUcsS0FBSztJQUVmLE1BQU0sRUFBRSxHQUFHLGVBQWUsQ0FBQyxDQUFDLEVBQUUsR0FBRyxFQUFFLFNBQVMsQ0FBQyxDQUFDO0lBRTlDLE1BQU0sTUFBTSxHQUFrQixFQUFFLENBQUMsRUFBRSxFQUFFLEVBQUUsQ0FBQztJQUN4QyxNQUFNLEtBQUssR0FBaUIsRUFBRSxJQUFJLEVBQUUsU0FBUyxFQUFFLE9BQU8sRUFBRSxDQUFDO0lBRXpELE9BQU8sTUFBTSxDQUFDLFNBQVMsQ0FDckIsT0FBTyxFQUNQLE1BQThCLEVBQzlCLEtBQTJCLENBQzVCLENBQUM7QUFDSixDQUFDO0FBRUQsTUFBTSxDQUFDLE1BQU0sT0FBTyxHQUFHLEVBQUUsQ0FBQyxFQUFFLFFBQVEsRUFBRSxDQUFDLENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyIvKipcbiAqIEBsaWNlbnNlXG4gKiBDb3B5cmlnaHQgMjAyMiBHb29nbGUgTExDLiBBbGwgUmlnaHRzIFJlc2VydmVkLlxuICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICdMaWNlbnNlJyk7XG4gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuXG4gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXRcbiAqXG4gKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjBcbiAqXG4gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlXG4gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAnQVMgSVMnIEJBU0lTLFxuICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuXG4gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kXG4gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS5cbiAqID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4gKi9cblxuaW1wb3J0IHsgRU5HSU5FIH0gZnJvbSAnLi4vZW5naW5lJztcbmltcG9ydCB7IEN1bXByb2QsIEN1bXByb2RBdHRycywgQ3VtcHJvZElucHV0cyB9IGZyb20gJy4uL2tlcm5lbF9uYW1lcyc7XG5pbXBvcnQgeyBOYW1lZEF0dHJNYXAgfSBmcm9tICcuLi9rZXJuZWxfcmVnaXN0cnknO1xuaW1wb3J0IHsgVGVuc29yIH0gZnJvbSAnLi4vdGVuc29yJztcbmltcG9ydCB7IE5hbWVkVGVuc29yTWFwIH0gZnJvbSAnLi4vdGVuc29yX3R5cGVzJztcbmltcG9ydCB7IGNvbnZlcnRUb1RlbnNvciB9IGZyb20gJy4uL3RlbnNvcl91dGlsX2Vudic7XG5pbXBvcnQgeyBUZW5zb3JMaWtlIH0gZnJvbSAnLi4vdHlwZXMnO1xuXG5pbXBvcnQgeyBvcCB9IGZyb20gJy4vb3BlcmF0aW9uJztcblxuLyoqXG4gKiBDb21wdXRlcyB0aGUgY3VtdWxhdGl2ZSBwcm9kdWN0IG9mIGEgYHRmLlRlbnNvcmAgYWxvbmcgYGF4aXNgLlxuICpcbiAqIGBgYGpzXG4gKiBjb25zdCB4ID0gdGYudGVuc29yKFsxLCAyLCAzLCA0XSk7XG4gKiB4LmN1bXByb2QoKS5wcmludCgpO1xuICogYGBgXG4gKiBgYGBqc1xuICogY29uc3QgeCA9IHRmLnRlbnNvcihbWzEsIDJdLCBbMywgNF1dKTtcbiAqIHguY3VtcHJvZCgpLnByaW50KCk7XG4gKiBgYGBcbiAqXG4gKiBAcGFyYW0geCBUaGUgaW5wdXQgdGVuc29yIHRvIGN1bXVsYXRpdmVseSBtdWx0aXBseS5cbiAqIEBwYXJhbSBheGlzIFRoZSBheGlzIGFsb25nIHdoaWNoIHRvIG11bHRpcGx5LiBPcHRpb25hbC4gRGVmYXVsdHMgdG8gMC5cbiAqIEBwYXJhbSBleGNsdXNpdmUgV2hldGhlciB0byBwZXJmb3JtIGV4Y2x1c2l2ZSBjdW11bGF0aXZlIHByb2R1Y3QuIE9wdGlvbmFsLlxuICogICAgIERlZmF1bHRzIHRvIGZhbHNlLiBJZiBzZXQgdG8gdHJ1ZSB0aGVuIHRoZSBwcm9kdWN0IG9mIGVhY2ggdGVuc29yIGVudHJ5XG4gKiAgICAgZG9lcyBub3QgaW5jbHVkZSBpdHMgb3duIHZhbHVlLCBidXQgb25seSB0aGUgdmFsdWVzIHByZXZpb3VzIHRvIGl0XG4gKiAgICAgYWxvbmcgdGhlIHNwZWNpZmllZCBheGlzLlxuICogQHBhcmFtIHJldmVyc2UgV2hldGhlciB0byBtdWx0aXBseSBpbiB0aGUgb3Bwb3NpdGUgZGlyZWN0aW9uLiBPcHRpb25hbC5cbiAqICAgICBEZWZhdWx0cyB0byBmYWxzZS5cbiAqXG4gKiBAZG9jIHtoZWFkaW5nOiAnT3BlcmF0aW9ucycsIHN1YmhlYWRpbmc6ICdTY2FuJ31cbiAqL1xuZnVuY3Rpb24gY3VtcHJvZF88VCBleHRlbmRzIFRlbnNvcj4oXG4gIHg6IFRlbnNvciB8IFRlbnNvckxpa2UsXG4gIGF4aXMgPSAwLFxuICBleGNsdXNpdmUgPSBmYWxzZSxcbiAgcmV2ZXJzZSA9IGZhbHNlXG4pOiBUIHtcbiAgY29uc3QgJHggPSBjb252ZXJ0VG9UZW5zb3IoeCwgJ3gnLCAnY3VtcHJvZCcpO1xuXG4gIGNvbnN0IGlucHV0czogQ3VtcHJvZElucHV0cyA9IHsgeDogJHggfTtcbiAgY29uc3QgYXR0cnM6IEN1bXByb2RBdHRycyA9IHsgYXhpcywgZXhjbHVzaXZlLCByZXZlcnNlIH07XG5cbiAgcmV0dXJuIEVOR0lORS5ydW5LZXJuZWwoXG4gICAgQ3VtcHJvZCxcbiAgICBpbnB1dHMgYXMge30gYXMgTmFtZWRUZW5zb3JNYXAsXG4gICAgYXR0cnMgYXMge30gYXMgTmFtZWRBdHRyTWFwXG4gICk7XG59XG5cbmV4cG9ydCBjb25zdCBjdW1wcm9kID0gb3AoeyBjdW1wcm9kXyB9KTtcbiJdfQ==","/**\n * @license\n * Copyright 2018 Google LLC. All Rights Reserved.\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n * =============================================================================\n */\nimport { ENGINE } from '../engine';\nimport { Cumsum } from '../kernel_names';\nimport { convertToTensor } from '../tensor_util_env';\nimport { op } from './operation';\n/**\n * Computes the cumulative sum of a `tf.Tensor` along `axis`.\n *\n * ```js\n * const x = tf.tensor([1, 2, 3, 4]);\n * x.cumsum().print();\n * ```\n * ```js\n * const x = tf.tensor([[1, 2], [3, 4]]);\n * x.cumsum().print();\n * ```\n *\n * @param x The input tensor to be summed.\n * @param axis The axis along which to sum. Optional. Defaults to 0.\n * @param exclusive Whether to perform exclusive cumulative sum. Optional.\n * Defaults to false. If set to true then the sum of each tensor entry\n * does not include its own value, but only the values previous to it\n * along the specified axis.\n * @param reverse Whether to sum in the opposite direction. Optional.\n * Defaults to false.\n *\n * @doc {heading: 'Operations', subheading: 'Scan'}\n */\nfunction cumsum_(x, axis = 0, exclusive = false, reverse = false) {\n const $x = convertToTensor(x, 'x', 'cumsum');\n const inputs = { x: $x };\n const attrs = { axis, exclusive, reverse };\n return ENGINE.runKernel(Cumsum, inputs, attrs);\n}\nexport const cumsum = op({ cumsum_ });\n//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY3Vtc3VtLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vLi4vdGZqcy1jb3JlL3NyYy9vcHMvY3Vtc3VtLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBOzs7Ozs7Ozs7Ozs7Ozs7R0FlRztBQUVILE9BQU8sRUFBQyxNQUFNLEVBQUMsTUFBTSxXQUFXLENBQUM7QUFDakMsT0FBTyxFQUFDLE1BQU0sRUFBNEIsTUFBTSxpQkFBaUIsQ0FBQztBQUlsRSxPQUFPLEVBQUMsZUFBZSxFQUFDLE1BQU0sb0JBQW9CLENBQUM7QUFHbkQsT0FBTyxFQUFDLEVBQUUsRUFBQyxNQUFNLGFBQWEsQ0FBQztBQUUvQjs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7OztHQXNCRztBQUNILFNBQVMsT0FBTyxDQUNaLENBQW9CLEVBQUUsSUFBSSxHQUFHLENBQUMsRUFBRSxTQUFTLEdBQUcsS0FBSyxFQUFFLE9BQU8sR0FBRyxLQUFLO0lBQ3BFLE1BQU0sRUFBRSxHQUFHLGVBQWUsQ0FBQyxDQUFDLEVBQUUsR0FBRyxFQUFFLFFBQVEsQ0FBQyxDQUFDO0lBRTdDLE1BQU0sTUFBTSxHQUFpQixFQUFDLENBQUMsRUFBRSxFQUFFLEVBQUMsQ0FBQztJQUNyQyxNQUFNLEtBQUssR0FBZ0IsRUFBQyxJQUFJLEVBQUUsU0FBUyxFQUFFLE9BQU8sRUFBQyxDQUFDO0lBRXRELE9BQU8sTUFBTSxDQUFDLFNBQVMsQ0FDbkIsTUFBTSxFQUFFLE1BQThCLEVBQUUsS0FBMkIsQ0FBQyxDQUFDO0FBQzNFLENBQUM7QUFFRCxNQUFNLENBQUMsTUFBTSxNQUFNLEdBQUcsRUFBRSxDQUFDLEVBQUMsT0FBTyxFQUFDLENBQUMsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbIi8qKlxuICogQGxpY2Vuc2VcbiAqIENvcHlyaWdodCAyMDE4IEdvb2dsZSBMTEMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuXG4gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgXCJMaWNlbnNlXCIpO1xuICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLlxuICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0XG4gKlxuICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wXG4gKlxuICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZVxuICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gXCJBUyBJU1wiIEJBU0lTLFxuICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuXG4gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kXG4gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS5cbiAqID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4gKi9cblxuaW1wb3J0IHtFTkdJTkV9IGZyb20gJy4uL2VuZ2luZSc7XG5pbXBvcnQge0N1bXN1bSwgQ3Vtc3VtQXR0cnMsIEN1bXN1bUlucHV0c30gZnJvbSAnLi4va2VybmVsX25hbWVzJztcbmltcG9ydCB7TmFtZWRBdHRyTWFwfSBmcm9tICcuLi9rZXJuZWxfcmVnaXN0cnknO1xuaW1wb3J0IHtUZW5zb3J9IGZyb20gJy4uL3RlbnNvcic7XG5pbXBvcnQge05hbWVkVGVuc29yTWFwfSBmcm9tICcuLi90ZW5zb3JfdHlwZXMnO1xuaW1wb3J0IHtjb252ZXJ0VG9UZW5zb3J9IGZyb20gJy4uL3RlbnNvcl91dGlsX2Vudic7XG5pbXBvcnQge1RlbnNvckxpa2V9IGZyb20gJy4uL3R5cGVzJztcblxuaW1wb3J0IHtvcH0gZnJvbSAnLi9vcGVyYXRpb24nO1xuXG4vKipcbiAqIENvbXB1dGVzIHRoZSBjdW11bGF0aXZlIHN1bSBvZiBhIGB0Zi5UZW5zb3JgIGFsb25nIGBheGlzYC5cbiAqXG4gKiBgYGBqc1xuICogY29uc3QgeCA9IHRmLnRlbnNvcihbMSwgMiwgMywgNF0pO1xuICogeC5jdW1zdW0oKS5wcmludCgpO1xuICogYGBgXG4gKiBgYGBqc1xuICogY29uc3QgeCA9IHRmLnRlbnNvcihbWzEsIDJdLCBbMywgNF1dKTtcbiAqIHguY3Vtc3VtKCkucHJpbnQoKTtcbiAqIGBgYFxuICpcbiAqIEBwYXJhbSB4IFRoZSBpbnB1dCB0ZW5zb3IgdG8gYmUgc3VtbWVkLlxuICogQHBhcmFtIGF4aXMgVGhlIGF4aXMgYWxvbmcgd2hpY2ggdG8gc3VtLiBPcHRpb25hbC4gRGVmYXVsdHMgdG8gMC5cbiAqIEBwYXJhbSBleGNsdXNpdmUgV2hldGhlciB0byBwZXJmb3JtIGV4Y2x1c2l2ZSBjdW11bGF0aXZlIHN1bS4gT3B0aW9uYWwuXG4gKiAgICAgRGVmYXVsdHMgdG8gZmFsc2UuIElmIHNldCB0byB0cnVlIHRoZW4gdGhlIHN1bSBvZiBlYWNoIHRlbnNvciBlbnRyeVxuICogICAgIGRvZXMgbm90IGluY2x1ZGUgaXRzIG93biB2YWx1ZSwgYnV0IG9ubHkgdGhlIHZhbHVlcyBwcmV2aW91cyB0byBpdFxuICogICAgIGFsb25nIHRoZSBzcGVjaWZpZWQgYXhpcy5cbiAqIEBwYXJhbSByZXZlcnNlIFdoZXRoZXIgdG8gc3VtIGluIHRoZSBvcHBvc2l0ZSBkaXJlY3Rpb24uIE9wdGlvbmFsLlxuICogICAgIERlZmF1bHRzIHRvIGZhbHNlLlxuICpcbiAqIEBkb2Mge2hlYWRpbmc6ICdPcGVyYXRpb25zJywgc3ViaGVhZGluZzogJ1NjYW4nfVxuICovXG5mdW5jdGlvbiBjdW1zdW1fPFQgZXh0ZW5kcyBUZW5zb3I+KFxuICAgIHg6IFRlbnNvcnxUZW5zb3JMaWtlLCBheGlzID0gMCwgZXhjbHVzaXZlID0gZmFsc2UsIHJldmVyc2UgPSBmYWxzZSk6IFQge1xuICBjb25zdCAkeCA9IGNvbnZlcnRUb1RlbnNvcih4LCAneCcsICdjdW1zdW0nKTtcblxuICBjb25zdCBpbnB1dHM6IEN1bXN1bUlucHV0cyA9IHt4OiAkeH07XG4gIGNvbnN0IGF0dHJzOiBDdW1zdW1BdHRycyA9IHtheGlzLCBleGNsdXNpdmUsIHJldmVyc2V9O1xuXG4gIHJldHVybiBFTkdJTkUucnVuS2VybmVsKFxuICAgICAgQ3Vtc3VtLCBpbnB1dHMgYXMge30gYXMgTmFtZWRUZW5zb3JNYXAsIGF0dHJzIGFzIHt9IGFzIE5hbWVkQXR0ck1hcCk7XG59XG5cbmV4cG9ydCBjb25zdCBjdW1zdW0gPSBvcCh7Y3Vtc3VtX30pO1xuIl19","/**\n * @license\n * Copyright 2020 Google LLC. All Rights Reserved.\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n * =============================================================================\n */\nimport { ENGINE } from '../engine';\nimport { DepthToSpace } from '../kernel_names';\nimport { convertToTensor } from '../tensor_util_env';\nimport * as util from '../util';\nimport { op } from './operation';\n/**\n * Rearranges data from depth into blocks of spatial data. More specifically,\n * this op outputs a copy of the input tensor where values from the `depth`\n * dimension are moved in spatial blocks to the `height` and `width` dimensions.\n * The attr `blockSize` indicates the input block size and how the data is\n * moved.\n *\n * - Chunks of data of size `blockSize * blockSize` from depth are rearranged\n * into non-overlapping blocks of size `blockSize x blockSize`\n *\n * - The width the output tensor is `inputWidth * blockSize`, whereas the\n * height is `inputHeight * blockSize`\n *\n * - The Y, X coordinates within each block of the output image are determined\n * by the high order component of the input channel index\n *\n * - The depth of the input tensor must be divisible by `blockSize *\n * blockSize`\n *\n * The `dataFormat` attr specifies the layout of the input and output tensors\n * with the following options: \"NHWC\": [ `batch, height, width, channels` ]\n * \"NCHW\": [ `batch, channels, height, width` ]\n *\n * ```js\n * const x = tf.tensor4d([1, 2, 3, 4], [1, 1, 1, 4]);\n * const blockSize = 2;\n * const dataFormat = \"NHWC\";\n *\n * tf.depthToSpace(x, blockSize, dataFormat).print();\n * ```\n *\n * @param x The input tensor of rank 4\n * @param blockSIze An `int` that is `>= 2`. The size of the spatial block\n * @param dataFormat An optional string from: \"NHWC\", \"NCHW\". Defaults to \"NHWC\"\n *\n * @doc {heading: 'Tensors', subheading: 'Transformations'}\n */\nfunction depthToSpace_(x, blockSize, dataFormat = 'NHWC') {\n const $x = convertToTensor(x, 'x', 'depthToSpace', 'float32');\n const inputHeight = (dataFormat === 'NHWC') ? $x.shape[1] : $x.shape[2];\n const inputWidth = (dataFormat === 'NHWC') ? $x.shape[2] : $x.shape[3];\n const inputDepth = (dataFormat === 'NHWC') ? $x.shape[3] : $x.shape[1];\n util.assert(blockSize > 1, () => `blockSize should be > 1 for depthToSpace, but was: ${blockSize}`);\n util.assert(inputHeight * blockSize >= 0, () => `Negative dimension size caused by overflow when multiplying\n ${inputHeight} and ${blockSize} for depthToSpace with input shape\n ${$x.shape}`);\n util.assert(inputWidth * blockSize >= 0, () => `Negative dimension size caused by overflow when multiplying\n ${inputWidth} and ${blockSize} for depthToSpace with input shape\n ${$x.shape}`);\n util.assert((inputDepth % (blockSize * blockSize) === 0), () => `Dimension size must be evenly divisible by ${blockSize * blockSize} but is ${inputDepth} for depthToSpace with input shape ${$x.shape}`);\n const inputs = { x: $x };\n const attrs = { blockSize, dataFormat };\n return ENGINE.runKernel(DepthToSpace, inputs, attrs);\n}\nexport const depthToSpace = op({ depthToSpace_ });\n//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZGVwdGhfdG9fc3BhY2UuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi8uLi90ZmpzLWNvcmUvc3JjL29wcy9kZXB0aF90b19zcGFjZS50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQTs7Ozs7Ozs7Ozs7Ozs7O0dBZUc7QUFFSCxPQUFPLEVBQUMsTUFBTSxFQUFDLE1BQU0sV0FBVyxDQUFDO0FBQ2pDLE9BQU8sRUFBQyxZQUFZLEVBQXdDLE1BQU0saUJBQWlCLENBQUM7QUFJcEYsT0FBTyxFQUFDLGVBQWUsRUFBQyxNQUFNLG9CQUFvQixDQUFDO0FBRW5ELE9BQU8sS0FBSyxJQUFJLE1BQU0sU0FBUyxDQUFDO0FBRWhDLE9BQU8sRUFBQyxFQUFFLEVBQUMsTUFBTSxhQUFhLENBQUM7QUFFL0I7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7OztHQW9DRztBQUNILFNBQVMsYUFBYSxDQUNsQixDQUF3QixFQUFFLFNBQWlCLEVBQzNDLGFBQTRCLE1BQU07SUFDcEMsTUFBTSxFQUFFLEdBQUcsZUFBZSxDQUFDLENBQUMsRUFBRSxHQUFHLEVBQUUsY0FBYyxFQUFFLFNBQVMsQ0FBYSxDQUFDO0lBRTFFLE1BQU0sV0FBVyxHQUFHLENBQUMsVUFBVSxLQUFLLE1BQU0sQ0FBQyxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQyxDQUFDO0lBQ3hFLE1BQU0sVUFBVSxHQUFHLENBQUMsVUFBVSxLQUFLLE1BQU0sQ0FBQyxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQyxDQUFDO0lBQ3ZFLE1BQU0sVUFBVSxHQUFHLENBQUMsVUFBVSxLQUFLLE1BQU0sQ0FBQyxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQyxDQUFDO0lBRXZFLElBQUksQ0FBQyxNQUFNLENBQ1AsU0FBUyxHQUFHLENBQUMsRUFDYixHQUFHLEVBQUUsQ0FBQyxzREFBc0QsU0FBUyxFQUFFLENBQUMsQ0FBQztJQUU3RSxJQUFJLENBQUMsTUFBTSxDQUNQLFdBQVcsR0FBRyxTQUFTLElBQUksQ0FBQyxFQUM1QixHQUFHLEVBQUUsQ0FBQztNQUNOLFdBQVcsUUFBUSxTQUFTO01BQzVCLEVBQUUsQ0FBQyxLQUFLLEVBQUUsQ0FBQyxDQUFDO0lBRWhCLElBQUksQ0FBQyxNQUFNLENBQ1AsVUFBVSxHQUFHLFNBQVMsSUFBSSxDQUFDLEVBQzNCLEdBQUcsRUFBRSxDQUFDO01BQ04sVUFBVSxRQUFRLFNBQVM7VUFDdkIsRUFBRSxDQUFDLEtBQUssRUFBRSxDQUFDLENBQUM7SUFFcEIsSUFBSSxDQUFDLE1BQU0sQ0FDUCxDQUFDLFVBQVUsR0FBRyxDQUFDLFNBQVMsR0FBRyxTQUFTLENBQUMsS0FBSyxDQUFDLENBQUMsRUFDNUMsR0FBRyxFQUFFLENBQUMsOENBQ0YsU0FBUyxHQUFHLFNBQVMsV0FDckIsVUFBVSxzQ0FBc0MsRUFBRSxDQUFDLEtBQUssRUFBRSxDQUFDLENBQUM7SUFFcEUsTUFBTSxNQUFNLEdBQXVCLEVBQUMsQ0FBQyxFQUFFLEVBQUUsRUFBQyxDQUFDO0lBQzNDLE1BQU0sS0FBSyxHQUFzQixFQUFDLFNBQVMsRUFBRSxVQUFVLEVBQUMsQ0FBQztJQUV6RCxPQUFPLE1BQU0sQ0FBQyxTQUFTLENBQ25CLFlBQVksRUFBRSxNQUE4QixFQUM1QyxLQUEyQixDQUFDLENBQUM7QUFDbkMsQ0FBQztBQUVELE1BQU0sQ0FBQyxNQUFNLFlBQVksR0FBRyxFQUFFLENBQUMsRUFBQyxhQUFhLEVBQUMsQ0FBQyxDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiLyoqXG4gKiBAbGljZW5zZVxuICogQ29weXJpZ2h0IDIwMjAgR29vZ2xlIExMQy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC5cbiAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSBcIkxpY2Vuc2VcIik7XG4gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuXG4gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXRcbiAqXG4gKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjBcbiAqXG4gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlXG4gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiBcIkFTIElTXCIgQkFTSVMsXG4gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC5cbiAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmRcbiAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLlxuICogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbiAqL1xuXG5pbXBvcnQge0VOR0lORX0gZnJvbSAnLi4vZW5naW5lJztcbmltcG9ydCB7RGVwdGhUb1NwYWNlLCBEZXB0aFRvU3BhY2VBdHRycywgRGVwdGhUb1NwYWNlSW5wdXRzfSBmcm9tICcuLi9rZXJuZWxfbmFtZXMnO1xuaW1wb3J0IHtOYW1lZEF0dHJNYXB9IGZyb20gJy4uL2tlcm5lbF9yZWdpc3RyeSc7XG5pbXBvcnQge1RlbnNvcjREfSBmcm9tICcuLi90ZW5zb3InO1xuaW1wb3J0IHtOYW1lZFRlbnNvck1hcH0gZnJvbSAnLi4vdGVuc29yX3R5cGVzJztcbmltcG9ydCB7Y29udmVydFRvVGVuc29yfSBmcm9tICcuLi90ZW5zb3JfdXRpbF9lbnYnO1xuaW1wb3J0IHtUZW5zb3JMaWtlNER9IGZyb20gJy4uL3R5cGVzJztcbmltcG9ydCAqIGFzIHV0aWwgZnJvbSAnLi4vdXRpbCc7XG5cbmltcG9ydCB7b3B9IGZyb20gJy4vb3BlcmF0aW9uJztcblxuLyoqXG4gKiBSZWFycmFuZ2VzIGRhdGEgZnJvbSBkZXB0aCBpbnRvIGJsb2NrcyBvZiBzcGF0aWFsIGRhdGEuIE1vcmUgc3BlY2lmaWNhbGx5LFxuICogdGhpcyBvcCBvdXRwdXRzIGEgY29weSBvZiB0aGUgaW5wdXQgdGVuc29yIHdoZXJlIHZhbHVlcyBmcm9tIHRoZSBgZGVwdGhgXG4gKiBkaW1lbnNpb24gYXJlIG1vdmVkIGluIHNwYXRpYWwgYmxvY2tzIHRvIHRoZSBgaGVpZ2h0YCBhbmQgYHdpZHRoYCBkaW1lbnNpb25zLlxuICogVGhlIGF0dHIgYGJsb2NrU2l6ZWAgaW5kaWNhdGVzIHRoZSBpbnB1dCBibG9jayBzaXplIGFuZCBob3cgdGhlIGRhdGEgaXNcbiAqIG1vdmVkLlxuICpcbiAqICAtIENodW5rcyBvZiBkYXRhIG9mIHNpemUgYGJsb2NrU2l6ZSAqIGJsb2NrU2l6ZWAgZnJvbSBkZXB0aCBhcmUgcmVhcnJhbmdlZFxuICogaW50byBub24tb3ZlcmxhcHBpbmcgYmxvY2tzIG9mIHNpemUgYGJsb2NrU2l6ZSB4IGJsb2NrU2l6ZWBcbiAqXG4gKiAgLSBUaGUgd2lkdGggdGhlIG91dHB1dCB0ZW5zb3IgaXMgYGlucHV0V2lkdGggKiBibG9ja1NpemVgLCB3aGVyZWFzIHRoZVxuICogaGVpZ2h0IGlzIGBpbnB1dEhlaWdodCAqIGJsb2NrU2l6ZWBcbiAqXG4gKiAgLSBUaGUgWSwgWCBjb29yZGluYXRlcyB3aXRoaW4gZWFjaCBibG9jayBvZiB0aGUgb3V0cHV0IGltYWdlIGFyZSBkZXRlcm1pbmVkXG4gKiBieSB0aGUgaGlnaCBvcmRlciBjb21wb25lbnQgb2YgdGhlIGlucHV0IGNoYW5uZWwgaW5kZXhcbiAqXG4gKiAgLSBUaGUgZGVwdGggb2YgdGhlIGlucHV0IHRlbnNvciBtdXN0IGJlIGRpdmlzaWJsZSBieSBgYmxvY2tTaXplICpcbiAqIGJsb2NrU2l6ZWBcbiAqXG4gKiBUaGUgYGRhdGFGb3JtYXRgIGF0dHIgc3BlY2lmaWVzIHRoZSBsYXlvdXQgb2YgdGhlIGlucHV0IGFuZCBvdXRwdXQgdGVuc29yc1xuICogd2l0aCB0aGUgZm9sbG93aW5nIG9wdGlvbnM6IFwiTkhXQ1wiOiBbIGBiYXRjaCwgaGVpZ2h0LCB3aWR0aCwgY2hhbm5lbHNgIF1cbiAqIFwiTkNIV1wiOiBbIGBiYXRjaCwgY2hhbm5lbHMsIGhlaWdodCwgd2lkdGhgIF1cbiAqXG4gKiBgYGBqc1xuICogY29uc3QgeCA9IHRmLnRlbnNvcjRkKFsxLCAyLCAzLCA0XSwgWzEsIDEsIDEsIDRdKTtcbiAqIGNvbnN0IGJsb2NrU2l6ZSA9IDI7XG4gKiBjb25zdCBkYXRhRm9ybWF0ID0gXCJOSFdDXCI7XG4gKlxuICogdGYuZGVwdGhUb1NwYWNlKHgsIGJsb2NrU2l6ZSwgZGF0YUZvcm1hdCkucHJpbnQoKTtcbiAqIGBgYFxuICpcbiAqIEBwYXJhbSB4IFRoZSBpbnB1dCB0ZW5zb3Igb2YgcmFuayA0XG4gKiBAcGFyYW0gYmxvY2tTSXplICBBbiBgaW50YCB0aGF0IGlzIGA+PSAyYC4gVGhlIHNpemUgb2YgdGhlIHNwYXRpYWwgYmxvY2tcbiAqIEBwYXJhbSBkYXRhRm9ybWF0IEFuIG9wdGlvbmFsIHN0cmluZyBmcm9tOiBcIk5IV0NcIiwgXCJOQ0hXXCIuIERlZmF1bHRzIHRvIFwiTkhXQ1wiXG4gKlxuICogQGRvYyB7aGVhZGluZzogJ1RlbnNvcnMnLCBzdWJoZWFkaW5nOiAnVHJhbnNmb3JtYXRpb25zJ31cbiAqL1xuZnVuY3Rpb24gZGVwdGhUb1NwYWNlXyhcbiAgICB4OiBUZW5zb3I0RHxUZW5zb3JMaWtlNEQsIGJsb2NrU2l6ZTogbnVtYmVyLFxuICAgIGRhdGFGb3JtYXQ6ICdOSFdDJ3wnTkNIVycgPSAnTkhXQycpOiBUZW5zb3I0RCB7XG4gIGNvbnN0ICR4ID0gY29udmVydFRvVGVuc29yKHgsICd4JywgJ2RlcHRoVG9TcGFjZScsICdmbG9hdDMyJykgYXMgVGVuc29yNEQ7XG5cbiAgY29uc3QgaW5wdXRIZWlnaHQgPSAoZGF0YUZvcm1hdCA9PT0gJ05IV0MnKSA/ICR4LnNoYXBlWzFdIDogJHguc2hhcGVbMl07XG4gIGNvbnN0IGlucHV0V2lkdGggPSAoZGF0YUZvcm1hdCA9PT0gJ05IV0MnKSA/ICR4LnNoYXBlWzJdIDogJHguc2hhcGVbM107XG4gIGNvbnN0IGlucHV0RGVwdGggPSAoZGF0YUZvcm1hdCA9PT0gJ05IV0MnKSA/ICR4LnNoYXBlWzNdIDogJHguc2hhcGVbMV07XG5cbiAgdXRpbC5hc3NlcnQoXG4gICAgICBibG9ja1NpemUgPiAxLFxuICAgICAgKCkgPT4gYGJsb2NrU2l6ZSBzaG91bGQgYmUgPiAxIGZvciBkZXB0aFRvU3BhY2UsIGJ1dCB3YXM6ICR7YmxvY2tTaXplfWApO1xuXG4gIHV0aWwuYXNzZXJ0KFxuICAgICAgaW5wdXRIZWlnaHQgKiBibG9ja1NpemUgPj0gMCxcbiAgICAgICgpID0+IGBOZWdhdGl2ZSBkaW1lbnNpb24gc2l6ZSBjYXVzZWQgYnkgb3ZlcmZsb3cgd2hlbiBtdWx0aXBseWluZ1xuICAgICR7aW5wdXRIZWlnaHR9IGFuZCAke2Jsb2NrU2l6ZX0gIGZvciBkZXB0aFRvU3BhY2Ugd2l0aCBpbnB1dCBzaGFwZVxuICAgICR7JHguc2hhcGV9YCk7XG5cbiAgdXRpbC5hc3NlcnQoXG4gICAgICBpbnB1dFdpZHRoICogYmxvY2tTaXplID49IDAsXG4gICAgICAoKSA9PiBgTmVnYXRpdmUgZGltZW5zaW9uIHNpemUgY2F1c2VkIGJ5IG92ZXJmbG93IHdoZW4gbXVsdGlwbHlpbmdcbiAgICAke2lucHV0V2lkdGh9IGFuZCAke2Jsb2NrU2l6ZX0gZm9yIGRlcHRoVG9TcGFjZSB3aXRoIGlucHV0IHNoYXBlXG4gICAgICAgICR7JHguc2hhcGV9YCk7XG5cbiAgdXRpbC5hc3NlcnQoXG4gICAgICAoaW5wdXREZXB0aCAlIChibG9ja1NpemUgKiBibG9ja1NpemUpID09PSAwKSxcbiAgICAgICgpID0+IGBEaW1lbnNpb24gc2l6ZSBtdXN0IGJlIGV2ZW5seSBkaXZpc2libGUgYnkgJHtcbiAgICAgICAgICBibG9ja1NpemUgKiBibG9ja1NpemV9IGJ1dCBpcyAke1xuICAgICAgICAgIGlucHV0RGVwdGh9IGZvciBkZXB0aFRvU3BhY2Ugd2l0aCBpbnB1dCBzaGFwZSAkeyR4LnNoYXBlfWApO1xuXG4gIGNvbnN0IGlucHV0czogRGVwdGhUb1NwYWNlSW5wdXRzID0ge3g6ICR4fTtcbiAgY29uc3QgYXR0cnM6IERlcHRoVG9TcGFjZUF0dHJzID0ge2Jsb2NrU2l6ZSwgZGF0YUZvcm1hdH07XG5cbiAgcmV0dXJuIEVOR0lORS5ydW5LZXJuZWwoXG4gICAgICBEZXB0aFRvU3BhY2UsIGlucHV0cyBhcyB7fSBhcyBOYW1lZFRlbnNvck1hcCxcbiAgICAgIGF0dHJzIGFzIHt9IGFzIE5hbWVkQXR0ck1hcCk7XG59XG5cbmV4cG9ydCBjb25zdCBkZXB0aFRvU3BhY2UgPSBvcCh7ZGVwdGhUb1NwYWNlX30pO1xuIl19","/**\n * @license\n * Copyright 2020 Google LLC. All Rights Reserved.\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n * =============================================================================\n */\nimport { ENGINE } from '../engine';\nimport { DepthwiseConv2dNative } from '../kernel_names';\nimport { convertToTensor } from '../tensor_util_env';\nimport * as util from '../util';\nimport * as conv_util from './conv_util';\nimport { op } from './operation';\nimport { reshape } from './reshape';\n/**\n * Depthwise 2D convolution.\n *\n * Given a 4D `input` array and a `filter` array of shape\n * `[filterHeight, filterWidth, inChannels, channelMultiplier]` containing\n * `inChannels` convolutional filters of depth 1, this op applies a\n * different filter to each input channel (expanding from 1 channel to\n * `channelMultiplier` channels for each), then concatenates the results\n * together. The output has `inChannels * channelMultiplier` channels.\n *\n * See\n * [https://www.tensorflow.org/api_docs/python/tf/nn/depthwise_conv2d](\n * https://www.tensorflow.org/api_docs/python/tf/nn/depthwise_conv2d)\n * for more details.\n *\n * @param x The input tensor, of rank 4 or rank 3, of shape\n * `[batch, height, width, inChannels]`. If rank 3, batch of 1 is\n * assumed.\n * @param filter The filter tensor, rank 4, of shape\n * `[filterHeight, filterWidth, inChannels, channelMultiplier]`.\n * @param strides The strides of the convolution: `[strideHeight,\n * strideWidth]`. If strides is a single number, then `strideHeight ==\n * strideWidth`.\n * @param pad The type of padding algorithm.\n * - `same` and stride 1: output will be of same size as input,\n * regardless of filter size.\n * - `valid`: output will be smaller than input if filter is larger\n * than 1x1.\n * - For more info, see this guide:\n * [https://www.tensorflow.org/api_docs/python/tf/nn/convolution](\n * https://www.tensorflow.org/api_docs/python/tf/nn/convolution)\n * @param dilations The dilation rates: `[dilationHeight, dilationWidth]`\n * in which we sample input values across the height and width dimensions\n * in atrous convolution. Defaults to `[1, 1]`. If `rate` is a single\n * number, then `dilationHeight == dilationWidth`. If it is greater than\n * 1, then all values of `strides` must be 1.\n * @param dataFormat: An optional string from: \"NHWC\", \"NCHW\". Defaults to\n * \"NHWC\". Specify the data format of the input and output data. With the\n * default format \"NHWC\", the data is stored in the order of: [batch,\n * height, width, channels]. Only \"NHWC\" is currently supported.\n * @param dimRoundingMode A string from: 'ceil', 'round', 'floor'. If none is\n * provided, it will default to truncate.\n *\n * @doc {heading: 'Operations', subheading: 'Convolution'}\n */\nfunction depthwiseConv2d_(x, filter, strides, pad, dataFormat = 'NHWC', dilations = [1, 1], dimRoundingMode) {\n const $x = convertToTensor(x, 'x', 'depthwiseConv2d', 'float32');\n const $filter = convertToTensor(filter, 'filter', 'depthwiseConv2d', 'float32');\n let x4D = $x;\n let reshapedTo4D = false;\n if ($x.rank === 3) {\n reshapedTo4D = true;\n x4D = reshape($x, [1, $x.shape[0], $x.shape[1], $x.shape[2]]);\n }\n util.assert(x4D.rank === 4, () => `Error in depthwiseConv2d: input must be rank 4, but got ` +\n `rank ${x4D.rank}.`);\n util.assert($filter.rank === 4, () => `Error in depthwiseConv2d: filter must be rank 4, but got rank ` +\n `${$filter.rank}.`);\n const inChannels = dataFormat === 'NHWC' ? x4D.shape[3] : x4D.shape[1];\n util.assert(inChannels === $filter.shape[2], () => `Error in depthwiseConv2d: number of input channels ` +\n `(${inChannels}) must match the inChannels dimension in ` +\n `filter ${$filter.shape[2]}.`);\n conv_util.checkPadOnDimRoundingMode('depthwiseConv2d', pad, dimRoundingMode);\n const inputs = { x: x4D, filter: $filter };\n const attrs = { strides, pad, dataFormat, dilations, dimRoundingMode };\n // tslint:disable-next-line: no-unnecessary-type-assertion\n const res = ENGINE.runKernel(DepthwiseConv2dNative, inputs, attrs);\n if (reshapedTo4D) {\n return reshape(res, [res.shape[1], res.shape[2], res.shape[3]]);\n }\n return res;\n}\nexport const depthwiseConv2d = op({ depthwiseConv2d_ });\n//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZGVwdGh3aXNlX2NvbnYyZC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uLy4uL3RmanMtY29yZS9zcmMvb3BzL2RlcHRod2lzZV9jb252MmQudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUE7Ozs7Ozs7Ozs7Ozs7OztHQWVHO0FBQ0gsT0FBTyxFQUFDLE1BQU0sRUFBQyxNQUFNLFdBQVcsQ0FBQztBQUNqQyxPQUFPLEVBQUMscUJBQXFCLEVBQTBELE1BQU0saUJBQWlCLENBQUM7QUFJL0csT0FBTyxFQUFDLGVBQWUsRUFBQyxNQUFNLG9CQUFvQixDQUFDO0FBRW5ELE9BQU8sS0FBSyxJQUFJLE1BQU0sU0FBUyxDQUFDO0FBRWhDLE9BQU8sS0FBSyxTQUFTLE1BQU0sYUFBYSxDQUFDO0FBQ3pDLE9BQU8sRUFBQyxFQUFFLEVBQUMsTUFBTSxhQUFhLENBQUM7QUFDL0IsT0FBTyxFQUFDLE9BQU8sRUFBQyxNQUFNLFdBQVcsQ0FBQztBQUVsQzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7R0E0Q0c7QUFDSCxTQUFTLGdCQUFnQixDQUNyQixDQUFlLEVBQUUsTUFBMkIsRUFDNUMsT0FBZ0MsRUFDaEMsR0FBb0QsRUFDcEQsYUFBNEIsTUFBTSxFQUNsQyxZQUFxQyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsRUFDM0MsZUFBd0M7SUFDMUMsTUFBTSxFQUFFLEdBQUcsZUFBZSxDQUFDLENBQUMsRUFBRSxHQUFHLEVBQUUsaUJBQWlCLEVBQUUsU0FBUyxDQUFDLENBQUM7SUFDakUsTUFBTSxPQUFPLEdBQ1QsZUFBZSxDQUFDLE1BQU0sRUFBRSxRQUFRLEVBQUUsaUJBQWlCLEVBQUUsU0FBUyxDQUFDLENBQUM7SUFFcEUsSUFBSSxHQUFHLEdBQUcsRUFBYyxDQUFDO0lBQ3pCLElBQUksWUFBWSxHQUFHLEtBQUssQ0FBQztJQUN6QixJQUFJLEVBQUUsQ0FBQyxJQUFJLEtBQUssQ0FBQyxFQUFFO1FBQ2pCLFlBQVksR0FBRyxJQUFJLENBQUM7UUFDcEIsR0FBRyxHQUFHLE9BQU8sQ0FBQyxFQUFFLEVBQUUsQ0FBQyxDQUFDLEVBQUUsRUFBRSxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUMsRUFBRSxFQUFFLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQyxFQUFFLEVBQUUsQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDO0tBQy9EO0lBQ0QsSUFBSSxDQUFDLE1BQU0sQ0FDUCxHQUFHLENBQUMsSUFBSSxLQUFLLENBQUMsRUFDZCxHQUFHLEVBQUUsQ0FBQywwREFBMEQ7UUFDNUQsUUFBUSxHQUFHLENBQUMsSUFBSSxHQUFHLENBQUMsQ0FBQztJQUM3QixJQUFJLENBQUMsTUFBTSxDQUNQLE9BQU8sQ0FBQyxJQUFJLEtBQUssQ0FBQyxFQUNsQixHQUFHLEVBQUUsQ0FBQyxnRUFBZ0U7UUFDbEUsR0FBRyxPQUFPLENBQUMsSUFBSSxHQUFHLENBQUMsQ0FBQztJQUM1QixNQUFNLFVBQVUsR0FBRyxVQUFVLEtBQUssTUFBTSxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQyxDQUFDO0lBQ3ZFLElBQUksQ0FBQyxNQUFNLENBQ1AsVUFBVSxLQUFLLE9BQU8sQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDLEVBQy9CLEdBQUcsRUFBRSxDQUFDLHFEQUFxRDtRQUN2RCxJQUFJLFVBQVUsMkNBQTJDO1FBQ3pELFVBQVUsT0FBTyxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUM7SUFDdkMsU0FBUyxDQUFDLHlCQUF5QixDQUFDLGlCQUFpQixFQUFFLEdBQUcsRUFBRSxlQUFlLENBQUMsQ0FBQztJQUM3RSxNQUFNLE1BQU0sR0FBZ0MsRUFBQyxDQUFDLEVBQUUsR0FBRyxFQUFFLE1BQU0sRUFBRSxPQUFPLEVBQUMsQ0FBQztJQUN0RSxNQUFNLEtBQUssR0FDUCxFQUFDLE9BQU8sRUFBRSxHQUFHLEVBQUUsVUFBVSxFQUFFLFNBQVMsRUFBRSxlQUFlLEVBQUMsQ0FBQztJQUUzRCwwREFBMEQ7SUFDMUQsTUFBTSxHQUFHLEdBQUcsTUFBTSxDQUFDLFNBQVMsQ0FDWixxQkFBcUIsRUFBRSxNQUE4QixFQUNyRCxLQUEyQixDQUFNLENBQUM7SUFFbEQsSUFBSSxZQUFZLEVBQUU7UUFDaEIsT0FBTyxPQUFPLENBQUMsR0FBRyxFQUFFLENBQUMsR0FBRyxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUMsRUFBRSxHQUFHLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQyxFQUFFLEdBQUcsQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBTSxDQUFDO0tBQ3RFO0lBQ0QsT0FBTyxHQUFHLENBQUM7QUFDYixDQUFDO0FBRUQsTUFBTSxDQUFDLE1BQU0sZUFBZSxHQUFHLEVBQUUsQ0FBQyxFQUFDLGdCQUFnQixFQUFDLENBQUMsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbIi8qKlxuICogQGxpY2Vuc2VcbiAqIENvcHlyaWdodCAyMDIwIEdvb2dsZSBMTEMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuXG4gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgXCJMaWNlbnNlXCIpO1xuICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLlxuICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0XG4gKlxuICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wXG4gKlxuICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZVxuICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gXCJBUyBJU1wiIEJBU0lTLFxuICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuXG4gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kXG4gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS5cbiAqID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4gKi9cbmltcG9ydCB7RU5HSU5FfSBmcm9tICcuLi9lbmdpbmUnO1xuaW1wb3J0IHtEZXB0aHdpc2VDb252MmROYXRpdmUsIERlcHRod2lzZUNvbnYyZE5hdGl2ZUF0dHJzLCBEZXB0aHdpc2VDb252MmROYXRpdmVJbnB1dHN9IGZyb20gJy4uL2tlcm5lbF9uYW1lcyc7XG5pbXBvcnQge05hbWVkQXR0ck1hcH0gZnJvbSAnLi4va2VybmVsX3JlZ2lzdHJ5JztcbmltcG9ydCB7VGVuc29yM0QsIFRlbnNvcjREfSBmcm9tICcuLi90ZW5zb3InO1xuaW1wb3J0IHtOYW1lZFRlbnNvck1hcH0gZnJvbSAnLi4vdGVuc29yX3R5cGVzJztcbmltcG9ydCB7Y29udmVydFRvVGVuc29yfSBmcm9tICcuLi90ZW5zb3JfdXRpbF9lbnYnO1xuaW1wb3J0IHtUZW5zb3JMaWtlfSBmcm9tICcuLi90eXBlcyc7XG5pbXBvcnQgKiBhcyB1dGlsIGZyb20gJy4uL3V0aWwnO1xuXG5pbXBvcnQgKiBhcyBjb252X3V0aWwgZnJvbSAnLi9jb252X3V0aWwnO1xuaW1wb3J0IHtvcH0gZnJvbSAnLi9vcGVyYXRpb24nO1xuaW1wb3J0IHtyZXNoYXBlfSBmcm9tICcuL3Jlc2hhcGUnO1xuXG4vKipcbiAqIERlcHRod2lzZSAyRCBjb252b2x1dGlvbi5cbiAqXG4gKiBHaXZlbiBhIDREIGBpbnB1dGAgYXJyYXkgYW5kIGEgYGZpbHRlcmAgYXJyYXkgb2Ygc2hhcGVcbiAqIGBbZmlsdGVySGVpZ2h0LCBmaWx0ZXJXaWR0aCwgaW5DaGFubmVscywgY2hhbm5lbE11bHRpcGxpZXJdYCBjb250YWluaW5nXG4gKiBgaW5DaGFubmVsc2AgY29udm9sdXRpb25hbCBmaWx0ZXJzIG9mIGRlcHRoIDEsIHRoaXMgb3AgYXBwbGllcyBhXG4gKiBkaWZmZXJlbnQgZmlsdGVyIHRvIGVhY2ggaW5wdXQgY2hhbm5lbCAoZXhwYW5kaW5nIGZyb20gMSBjaGFubmVsIHRvXG4gKiBgY2hhbm5lbE11bHRpcGxpZXJgIGNoYW5uZWxzIGZvciBlYWNoKSwgdGhlbiBjb25jYXRlbmF0ZXMgdGhlIHJlc3VsdHNcbiAqIHRvZ2V0aGVyLiBUaGUgb3V0cHV0IGhhcyBgaW5DaGFubmVscyAqIGNoYW5uZWxNdWx0aXBsaWVyYCBjaGFubmVscy5cbiAqXG4gKiBTZWVcbiAqIFtodHRwczovL3d3dy50ZW5zb3JmbG93Lm9yZy9hcGlfZG9jcy9weXRob24vdGYvbm4vZGVwdGh3aXNlX2NvbnYyZF0oXG4gKiAgICAgaHR0cHM6Ly93d3cudGVuc29yZmxvdy5vcmcvYXBpX2RvY3MvcHl0aG9uL3RmL25uL2RlcHRod2lzZV9jb252MmQpXG4gKiBmb3IgbW9yZSBkZXRhaWxzLlxuICpcbiAqIEBwYXJhbSB4IFRoZSBpbnB1dCB0ZW5zb3IsIG9mIHJhbmsgNCBvciByYW5rIDMsIG9mIHNoYXBlXG4gKiAgICAgYFtiYXRjaCwgaGVpZ2h0LCB3aWR0aCwgaW5DaGFubmVsc11gLiBJZiByYW5rIDMsIGJhdGNoIG9mIDEgaXNcbiAqIGFzc3VtZWQuXG4gKiBAcGFyYW0gZmlsdGVyIFRoZSBmaWx0ZXIgdGVuc29yLCByYW5rIDQsIG9mIHNoYXBlXG4gKiAgICAgYFtmaWx0ZXJIZWlnaHQsIGZpbHRlcldpZHRoLCBpbkNoYW5uZWxzLCBjaGFubmVsTXVsdGlwbGllcl1gLlxuICogQHBhcmFtIHN0cmlkZXMgVGhlIHN0cmlkZXMgb2YgdGhlIGNvbnZvbHV0aW9uOiBgW3N0cmlkZUhlaWdodCxcbiAqIHN0cmlkZVdpZHRoXWAuIElmIHN0cmlkZXMgaXMgYSBzaW5nbGUgbnVtYmVyLCB0aGVuIGBzdHJpZGVIZWlnaHQgPT1cbiAqIHN0cmlkZVdpZHRoYC5cbiAqIEBwYXJhbSBwYWQgVGhlIHR5cGUgb2YgcGFkZGluZyBhbGdvcml0aG0uXG4gKiAgIC0gYHNhbWVgIGFuZCBzdHJpZGUgMTogb3V0cHV0IHdpbGwgYmUgb2Ygc2FtZSBzaXplIGFzIGlucHV0LFxuICogICAgICAgcmVnYXJkbGVzcyBvZiBmaWx0ZXIgc2l6ZS5cbiAqICAgLSBgdmFsaWRgOiBvdXRwdXQgd2lsbCBiZSBzbWFsbGVyIHRoYW4gaW5wdXQgaWYgZmlsdGVyIGlzIGxhcmdlclxuICogICAgICAgdGhhbiAxeDEuXG4gKiAgIC0gRm9yIG1vcmUgaW5mbywgc2VlIHRoaXMgZ3VpZGU6XG4gKiAgICAgW2h0dHBzOi8vd3d3LnRlbnNvcmZsb3cub3JnL2FwaV9kb2NzL3B5dGhvbi90Zi9ubi9jb252b2x1dGlvbl0oXG4gKiAgICAgICAgICBodHRwczovL3d3dy50ZW5zb3JmbG93Lm9yZy9hcGlfZG9jcy9weXRob24vdGYvbm4vY29udm9sdXRpb24pXG4gKiBAcGFyYW0gZGlsYXRpb25zIFRoZSBkaWxhdGlvbiByYXRlczogYFtkaWxhdGlvbkhlaWdodCwgZGlsYXRpb25XaWR0aF1gXG4gKiAgICAgaW4gd2hpY2ggd2Ugc2FtcGxlIGlucHV0IHZhbHVlcyBhY3Jvc3MgdGhlIGhlaWdodCBhbmQgd2lkdGggZGltZW5zaW9uc1xuICogICAgIGluIGF0cm91cyBjb252b2x1dGlvbi4gRGVmYXVsdHMgdG8gYFsxLCAxXWAuIElmIGByYXRlYCBpcyBhIHNpbmdsZVxuICogICAgIG51bWJlciwgdGhlbiBgZGlsYXRpb25IZWlnaHQgPT0gZGlsYXRpb25XaWR0aGAuIElmIGl0IGlzIGdyZWF0ZXIgdGhhblxuICogICAgIDEsIHRoZW4gYWxsIHZhbHVlcyBvZiBgc3RyaWRlc2AgbXVzdCBiZSAxLlxuICogQHBhcmFtIGRhdGFGb3JtYXQ6IEFuIG9wdGlvbmFsIHN0cmluZyBmcm9tOiBcIk5IV0NcIiwgXCJOQ0hXXCIuIERlZmF1bHRzIHRvXG4gKiAgICAgXCJOSFdDXCIuIFNwZWNpZnkgdGhlIGRhdGEgZm9ybWF0IG9mIHRoZSBpbnB1dCBhbmQgb3V0cHV0IGRhdGEuIFdpdGggdGhlXG4gKiAgICAgZGVmYXVsdCBmb3JtYXQgXCJOSFdDXCIsIHRoZSBkYXRhIGlzIHN0b3JlZCBpbiB0aGUgb3JkZXIgb2Y6IFtiYXRjaCxcbiAqICAgICBoZWlnaHQsIHdpZHRoLCBjaGFubmVsc10uIE9ubHkgXCJOSFdDXCIgaXMgY3VycmVudGx5IHN1cHBvcnRlZC5cbiAqIEBwYXJhbSBkaW1Sb3VuZGluZ01vZGUgQSBzdHJpbmcgZnJvbTogJ2NlaWwnLCAncm91bmQnLCAnZmxvb3InLiBJZiBub25lIGlzXG4gKiAgICAgcHJvdmlkZWQsIGl0IHdpbGwgZGVmYXVsdCB0byB0cnVuY2F0ZS5cbiAqXG4gKiBAZG9jIHtoZWFkaW5nOiAnT3BlcmF0aW9ucycsIHN1YmhlYWRpbmc6ICdDb252b2x1dGlvbid9XG4gKi9cbmZ1bmN0aW9uIGRlcHRod2lzZUNvbnYyZF88VCBleHRlbmRzIFRlbnNvcjNEfFRlbnNvcjREPihcbiAgICB4OiBUfFRlbnNvckxpa2UsIGZpbHRlcjogVGVuc29yNER8VGVuc29yTGlrZSxcbiAgICBzdHJpZGVzOiBbbnVtYmVyLCBudW1iZXJdfG51bWJlcixcbiAgICBwYWQ6ICd2YWxpZCd8J3NhbWUnfG51bWJlcnxjb252X3V0aWwuRXhwbGljaXRQYWRkaW5nLFxuICAgIGRhdGFGb3JtYXQ6ICdOSFdDJ3wnTkNIVycgPSAnTkhXQycsXG4gICAgZGlsYXRpb25zOiBbbnVtYmVyLCBudW1iZXJdfG51bWJlciA9IFsxLCAxXSxcbiAgICBkaW1Sb3VuZGluZ01vZGU/OiAnZmxvb3InfCdyb3VuZCd8J2NlaWwnKTogVCB7XG4gIGNvbnN0ICR4ID0gY29udmVydFRvVGVuc29yKHgsICd4JywgJ2RlcHRod2lzZUNvbnYyZCcsICdmbG9hdDMyJyk7XG4gIGNvbnN0ICRmaWx0ZXIgPVxuICAgICAgY29udmVydFRvVGVuc29yKGZpbHRlciwgJ2ZpbHRlcicsICdkZXB0aHdpc2VDb252MmQnLCAnZmxvYXQzMicpO1xuXG4gIGxldCB4NEQgPSAkeCBhcyBUZW5zb3I0RDtcbiAgbGV0IHJlc2hhcGVkVG80RCA9IGZhbHNlO1xuICBpZiAoJHgucmFuayA9PT0gMykge1xuICAgIHJlc2hhcGVkVG80RCA9IHRydWU7XG4gICAgeDREID0gcmVzaGFwZSgkeCwgWzEsICR4LnNoYXBlWzBdLCAkeC5zaGFwZVsxXSwgJHguc2hhcGVbMl1dKTtcbiAgfVxuICB1dGlsLmFzc2VydChcbiAgICAgIHg0RC5yYW5rID09PSA0LFxuICAgICAgKCkgPT4gYEVycm9yIGluIGRlcHRod2lzZUNvbnYyZDogaW5wdXQgbXVzdCBiZSByYW5rIDQsIGJ1dCBnb3QgYCArXG4gICAgICAgICAgYHJhbmsgJHt4NEQucmFua30uYCk7XG4gIHV0aWwuYXNzZXJ0KFxuICAgICAgJGZpbHRlci5yYW5rID09PSA0LFxuICAgICAgKCkgPT4gYEVycm9yIGluIGRlcHRod2lzZUNvbnYyZDogZmlsdGVyIG11c3QgYmUgcmFuayA0LCBidXQgZ290IHJhbmsgYCArXG4gICAgICAgICAgYCR7JGZpbHRlci5yYW5rfS5gKTtcbiAgY29uc3QgaW5DaGFubmVscyA9IGRhdGFGb3JtYXQgPT09ICdOSFdDJyA/IHg0RC5zaGFwZVszXSA6IHg0RC5zaGFwZVsxXTtcbiAgdXRpbC5hc3NlcnQoXG4gICAgICBpbkNoYW5uZWxzID09PSAkZmlsdGVyLnNoYXBlWzJdLFxuICAgICAgKCkgPT4gYEVycm9yIGluIGRlcHRod2lzZUNvbnYyZDogbnVtYmVyIG9mIGlucHV0IGNoYW5uZWxzIGAgK1xuICAgICAgICAgIGAoJHtpbkNoYW5uZWxzfSkgbXVzdCBtYXRjaCB0aGUgaW5DaGFubmVscyBkaW1lbnNpb24gaW4gYCArXG4gICAgICAgICAgYGZpbHRlciAkeyRmaWx0ZXIuc2hhcGVbMl19LmApO1xuICBjb252X3V0aWwuY2hlY2tQYWRPbkRpbVJvdW5kaW5nTW9kZSgnZGVwdGh3aXNlQ29udjJkJywgcGFkLCBkaW1Sb3VuZGluZ01vZGUpO1xuICBjb25zdCBpbnB1dHM6IERlcHRod2lzZUNvbnYyZE5hdGl2ZUlucHV0cyA9IHt4OiB4NEQsIGZpbHRlcjogJGZpbHRlcn07XG4gIGNvbnN0IGF0dHJzOiBEZXB0aHdpc2VDb252MmROYXRpdmVBdHRycyA9XG4gICAgICB7c3RyaWRlcywgcGFkLCBkYXRhRm9ybWF0LCBkaWxhdGlvbnMsIGRpbVJvdW5kaW5nTW9kZX07XG5cbiAgLy8gdHNsaW50OmRpc2FibGUtbmV4dC1saW5lOiBuby11bm5lY2Vzc2FyeS10eXBlLWFzc2VydGlvblxuICBjb25zdCByZXMgPSBFTkdJTkUucnVuS2VybmVsKFxuICAgICAgICAgICAgICAgICAgRGVwdGh3aXNlQ29udjJkTmF0aXZlLCBpbnB1dHMgYXMge30gYXMgTmFtZWRUZW5zb3JNYXAsXG4gICAgICAgICAgICAgICAgICBhdHRycyBhcyB7fSBhcyBOYW1lZEF0dHJNYXApIGFzIFQ7XG5cbiAgaWYgKHJlc2hhcGVkVG80RCkge1xuICAgIHJldHVybiByZXNoYXBlKHJlcywgW3Jlcy5zaGFwZVsxXSwgcmVzLnNoYXBlWzJdLCByZXMuc2hhcGVbM11dKSBhcyBUO1xuICB9XG4gIHJldHVybiByZXM7XG59XG5cbmV4cG9ydCBjb25zdCBkZXB0aHdpc2VDb252MmQgPSBvcCh7ZGVwdGh3aXNlQ29udjJkX30pO1xuIl19","/**\n * @license\n * Copyright 2020 Google LLC. All Rights Reserved.\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n * =============================================================================\n */\nimport { ENGINE } from '../engine';\nimport { DepthwiseConv2dNativeBackpropFilter } from '../kernel_names';\nimport { op } from './operation';\nimport { reshape } from './reshape';\nfunction depthwiseConv2dNativeBackpropFilter_(x, dy, filterShape, strides, pad, dilations = [1, 1], dimRoundingMode) {\n let x4D = x;\n if (x.rank === 3) {\n x4D = reshape(x, [1, x.shape[0], x.shape[1], x.shape[2]]);\n }\n let dy4D = dy;\n if (dy4D.rank === 3) {\n dy4D = reshape(dy, [1, dy.shape[0], dy.shape[1], dy.shape[2]]);\n }\n const inputs = { x: x4D, dy: dy4D };\n const attrs = { strides, pad, dimRoundingMode, dilations, filterShape };\n // tslint:disable-next-line: no-unnecessary-type-assertion\n return ENGINE.runKernel(DepthwiseConv2dNativeBackpropFilter, inputs, attrs);\n}\nexport const depthwiseConv2dNativeBackpropFilter = op({ depthwiseConv2dNativeBackpropFilter_ });\n//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZGVwdGh3aXNlX2NvbnYyZF9uYXRpdmVfYmFja3Byb3BfZmlsdGVyLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vLi4vdGZqcy1jb3JlL3NyYy9vcHMvZGVwdGh3aXNlX2NvbnYyZF9uYXRpdmVfYmFja3Byb3BfZmlsdGVyLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBOzs7Ozs7Ozs7Ozs7Ozs7R0FlRztBQUNILE9BQU8sRUFBQyxNQUFNLEVBQUMsTUFBTSxXQUFXLENBQUM7QUFDakMsT0FBTyxFQUFDLG1DQUFtQyxFQUFzRixNQUFNLGlCQUFpQixDQUFDO0FBTXpKLE9BQU8sRUFBQyxFQUFFLEVBQUMsTUFBTSxhQUFhLENBQUM7QUFDL0IsT0FBTyxFQUFDLE9BQU8sRUFBQyxNQUFNLFdBQVcsQ0FBQztBQUVsQyxTQUFTLG9DQUFvQyxDQUN6QyxDQUFJLEVBQUUsRUFBSyxFQUFFLFdBQTZDLEVBQzFELE9BQWdDLEVBQ2hDLEdBQTBDLEVBQzFDLFlBQXFDLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxFQUMzQyxlQUF3QztJQUMxQyxJQUFJLEdBQUcsR0FBRyxDQUFhLENBQUM7SUFDeEIsSUFBSSxDQUFDLENBQUMsSUFBSSxLQUFLLENBQUMsRUFBRTtRQUNoQixHQUFHLEdBQUcsT0FBTyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUM7S0FDM0Q7SUFDRCxJQUFJLElBQUksR0FBRyxFQUFjLENBQUM7SUFDMUIsSUFBSSxJQUFJLENBQUMsSUFBSSxLQUFLLENBQUMsRUFBRTtRQUNuQixJQUFJLEdBQUcsT0FBTyxDQUFDLEVBQUUsRUFBRSxDQUFDLENBQUMsRUFBRSxFQUFFLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQyxFQUFFLEVBQUUsQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDLEVBQUUsRUFBRSxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUM7S0FDaEU7SUFFRCxNQUFNLE1BQU0sR0FBOEMsRUFBQyxDQUFDLEVBQUUsR0FBRyxFQUFFLEVBQUUsRUFBRSxJQUFJLEVBQUMsQ0FBQztJQUM3RSxNQUFNLEtBQUssR0FDUCxFQUFDLE9BQU8sRUFBRSxHQUFHLEVBQUUsZUFBZSxFQUFFLFNBQVMsRUFBRSxXQUFXLEVBQUMsQ0FBQztJQUU1RCwwREFBMEQ7SUFDMUQsT0FBTyxNQUFNLENBQUMsU0FBUyxDQUNaLG1DQUFtQyxFQUNuQyxNQUE4QixFQUFFLEtBQTJCLENBQzFELENBQUM7QUFDZixDQUFDO0FBRUQsTUFBTSxDQUFDLE1BQU0sbUNBQW1DLEdBQzVDLEVBQUUsQ0FBQyxFQUFDLG9DQUFvQyxFQUFDLENBQUMsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbIi8qKlxuICogQGxpY2Vuc2VcbiAqIENvcHlyaWdodCAyMDIwIEdvb2dsZSBMTEMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuXG4gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgXCJMaWNlbnNlXCIpO1xuICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLlxuICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0XG4gKlxuICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wXG4gKlxuICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZVxuICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gXCJBUyBJU1wiIEJBU0lTLFxuICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuXG4gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kXG4gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS5cbiAqID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4gKi9cbmltcG9ydCB7RU5HSU5FfSBmcm9tICcuLi9lbmdpbmUnO1xuaW1wb3J0IHtEZXB0aHdpc2VDb252MmROYXRpdmVCYWNrcHJvcEZpbHRlciwgRGVwdGh3aXNlQ29udjJkTmF0aXZlQmFja3Byb3BGaWx0ZXJBdHRycywgRGVwdGh3aXNlQ29udjJkTmF0aXZlQmFja3Byb3BGaWx0ZXJJbnB1dHN9IGZyb20gJy4uL2tlcm5lbF9uYW1lcyc7XG5pbXBvcnQge05hbWVkQXR0ck1hcH0gZnJvbSAnLi4va2VybmVsX3JlZ2lzdHJ5JztcbmltcG9ydCB7VGVuc29yM0QsIFRlbnNvcjREfSBmcm9tICcuLi90ZW5zb3InO1xuaW1wb3J0IHtOYW1lZFRlbnNvck1hcH0gZnJvbSAnLi4vdGVuc29yX3R5cGVzJztcblxuaW1wb3J0IHtFeHBsaWNpdFBhZGRpbmd9IGZyb20gJy4vY29udl91dGlsJztcbmltcG9ydCB7b3B9IGZyb20gJy4vb3BlcmF0aW9uJztcbmltcG9ydCB7cmVzaGFwZX0gZnJvbSAnLi9yZXNoYXBlJztcblxuZnVuY3Rpb24gZGVwdGh3aXNlQ29udjJkTmF0aXZlQmFja3Byb3BGaWx0ZXJfPFQgZXh0ZW5kcyBUZW5zb3IzRHxUZW5zb3I0RD4oXG4gICAgeDogVCwgZHk6IFQsIGZpbHRlclNoYXBlOiBbbnVtYmVyLCBudW1iZXIsIG51bWJlciwgbnVtYmVyXSxcbiAgICBzdHJpZGVzOiBbbnVtYmVyLCBudW1iZXJdfG51bWJlcixcbiAgICBwYWQ6ICd2YWxpZCd8J3NhbWUnfG51bWJlcnxFeHBsaWNpdFBhZGRpbmcsXG4gICAgZGlsYXRpb25zOiBbbnVtYmVyLCBudW1iZXJdfG51bWJlciA9IFsxLCAxXSxcbiAgICBkaW1Sb3VuZGluZ01vZGU/OiAnZmxvb3InfCdyb3VuZCd8J2NlaWwnKTogVGVuc29yNEQge1xuICBsZXQgeDREID0geCBhcyBUZW5zb3I0RDtcbiAgaWYgKHgucmFuayA9PT0gMykge1xuICAgIHg0RCA9IHJlc2hhcGUoeCwgWzEsIHguc2hhcGVbMF0sIHguc2hhcGVbMV0sIHguc2hhcGVbMl1dKTtcbiAgfVxuICBsZXQgZHk0RCA9IGR5IGFzIFRlbnNvcjREO1xuICBpZiAoZHk0RC5yYW5rID09PSAzKSB7XG4gICAgZHk0RCA9IHJlc2hhcGUoZHksIFsxLCBkeS5zaGFwZVswXSwgZHkuc2hhcGVbMV0sIGR5LnNoYXBlWzJdXSk7XG4gIH1cblxuICBjb25zdCBpbnB1dHM6IERlcHRod2lzZUNvbnYyZE5hdGl2ZUJhY2twcm9wRmlsdGVySW5wdXRzID0ge3g6IHg0RCwgZHk6IGR5NER9O1xuICBjb25zdCBhdHRyczogRGVwdGh3aXNlQ29udjJkTmF0aXZlQmFja3Byb3BGaWx0ZXJBdHRycyA9XG4gICAgICB7c3RyaWRlcywgcGFkLCBkaW1Sb3VuZGluZ01vZGUsIGRpbGF0aW9ucywgZmlsdGVyU2hhcGV9O1xuXG4gIC8vIHRzbGludDpkaXNhYmxlLW5leHQtbGluZTogbm8tdW5uZWNlc3NhcnktdHlwZS1hc3NlcnRpb25cbiAgcmV0dXJuIEVOR0lORS5ydW5LZXJuZWwoXG4gICAgICAgICAgICAgRGVwdGh3aXNlQ29udjJkTmF0aXZlQmFja3Byb3BGaWx0ZXIsXG4gICAgICAgICAgICAgaW5wdXRzIGFzIHt9IGFzIE5hbWVkVGVuc29yTWFwLCBhdHRycyBhcyB7fSBhcyBOYW1lZEF0dHJNYXApIGFzXG4gICAgICBUZW5zb3I0RDtcbn1cblxuZXhwb3J0IGNvbnN0IGRlcHRod2lzZUNvbnYyZE5hdGl2ZUJhY2twcm9wRmlsdGVyID1cbiAgICBvcCh7ZGVwdGh3aXNlQ29udjJkTmF0aXZlQmFja3Byb3BGaWx0ZXJffSk7XG4iXX0=","/**\n * @license\n * Copyright 2020 Google LLC. All Rights Reserved.\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n * =============================================================================\n */\nimport { ENGINE } from '../engine';\nimport { DepthwiseConv2dNativeBackpropInput } from '../kernel_names';\nimport { op } from './operation';\nimport { reshape } from './reshape';\nfunction depthwiseConv2dNativeBackpropInput_(xShape, dy, filter, strides, pad, dilations = [1, 1], dimRoundingMode) {\n let dy4D = dy;\n let reshapedTo4D = false;\n if (dy.rank === 3) {\n reshapedTo4D = true;\n dy4D = reshape(dy, [1, dy.shape[0], dy.shape[1], dy.shape[2]]);\n }\n const inputs = { dy: dy4D, filter };\n const attrs = { strides, pad, dimRoundingMode, dilations, inputShape: xShape };\n const res = \n // tslint:disable-next-line: no-unnecessary-type-assertion\n ENGINE.runKernel(DepthwiseConv2dNativeBackpropInput, inputs, attrs);\n if (reshapedTo4D) {\n return reshape(res, [res.shape[1], res.shape[2], res.shape[3]]);\n }\n return res;\n}\nexport const depthwiseConv2dNativeBackpropInput = op({ depthwiseConv2dNativeBackpropInput_ });\n//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZGVwdGh3aXNlX2NvbnYyZF9uYXRpdmVfYmFja3Byb3BfaW5wdXQuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi8uLi90ZmpzLWNvcmUvc3JjL29wcy9kZXB0aHdpc2VfY29udjJkX25hdGl2ZV9iYWNrcHJvcF9pbnB1dC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQTs7Ozs7Ozs7Ozs7Ozs7O0dBZUc7QUFDSCxPQUFPLEVBQUMsTUFBTSxFQUFDLE1BQU0sV0FBVyxDQUFDO0FBQ2pDLE9BQU8sRUFBQyxrQ0FBa0MsRUFBb0YsTUFBTSxpQkFBaUIsQ0FBQztBQU10SixPQUFPLEVBQUMsRUFBRSxFQUFDLE1BQU0sYUFBYSxDQUFDO0FBQy9CLE9BQU8sRUFBQyxPQUFPLEVBQUMsTUFBTSxXQUFXLENBQUM7QUFFbEMsU0FBUyxtQ0FBbUMsQ0FDeEMsTUFBd0MsRUFBRSxFQUFLLEVBQUUsTUFBZ0IsRUFDakUsT0FBZ0MsRUFDaEMsR0FBMEMsRUFDMUMsWUFBcUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLEVBQzNDLGVBQXdDO0lBQzFDLElBQUksSUFBSSxHQUFHLEVBQWMsQ0FBQztJQUMxQixJQUFJLFlBQVksR0FBRyxLQUFLLENBQUM7SUFDekIsSUFBSSxFQUFFLENBQUMsSUFBSSxLQUFLLENBQUMsRUFBRTtRQUNqQixZQUFZLEdBQUcsSUFBSSxDQUFDO1FBQ3BCLElBQUksR0FBRyxPQUFPLENBQUMsRUFBRSxFQUFFLENBQUMsQ0FBQyxFQUFFLEVBQUUsQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDLEVBQUUsRUFBRSxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUMsRUFBRSxFQUFFLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQztLQUNoRTtJQUVELE1BQU0sTUFBTSxHQUE2QyxFQUFDLEVBQUUsRUFBRSxJQUFJLEVBQUUsTUFBTSxFQUFDLENBQUM7SUFDNUUsTUFBTSxLQUFLLEdBQ1AsRUFBQyxPQUFPLEVBQUUsR0FBRyxFQUFFLGVBQWUsRUFBRSxTQUFTLEVBQUUsVUFBVSxFQUFFLE1BQU0sRUFBQyxDQUFDO0lBRW5FLE1BQU0sR0FBRztJQUNMLDBEQUEwRDtJQUMxRCxNQUFNLENBQUMsU0FBUyxDQUNaLGtDQUFrQyxFQUFFLE1BQThCLEVBQ2xFLEtBQTJCLENBQU0sQ0FBQztJQUUxQyxJQUFJLFlBQVksRUFBRTtRQUNoQixPQUFPLE9BQU8sQ0FBQyxHQUFHLEVBQUUsQ0FBQyxHQUFHLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQyxFQUFFLEdBQUcsQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDLEVBQUUsR0FBRyxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFNLENBQUM7S0FDdEU7SUFDRCxPQUFPLEdBQUcsQ0FBQztBQUNiLENBQUM7QUFFRCxNQUFNLENBQUMsTUFBTSxrQ0FBa0MsR0FDM0MsRUFBRSxDQUFDLEVBQUMsbUNBQW1DLEVBQUMsQ0FBQyxDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiLyoqXG4gKiBAbGljZW5zZVxuICogQ29weXJpZ2h0IDIwMjAgR29vZ2xlIExMQy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC5cbiAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSBcIkxpY2Vuc2VcIik7XG4gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuXG4gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXRcbiAqXG4gKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjBcbiAqXG4gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlXG4gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiBcIkFTIElTXCIgQkFTSVMsXG4gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC5cbiAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmRcbiAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLlxuICogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbiAqL1xuaW1wb3J0IHtFTkdJTkV9IGZyb20gJy4uL2VuZ2luZSc7XG5pbXBvcnQge0RlcHRod2lzZUNvbnYyZE5hdGl2ZUJhY2twcm9wSW5wdXQsIERlcHRod2lzZUNvbnYyZE5hdGl2ZUJhY2twcm9wSW5wdXRBdHRycywgRGVwdGh3aXNlQ29udjJkTmF0aXZlQmFja3Byb3BJbnB1dElucHV0c30gZnJvbSAnLi4va2VybmVsX25hbWVzJztcbmltcG9ydCB7TmFtZWRBdHRyTWFwfSBmcm9tICcuLi9rZXJuZWxfcmVnaXN0cnknO1xuaW1wb3J0IHtUZW5zb3IzRCwgVGVuc29yNER9IGZyb20gJy4uL3RlbnNvcic7XG5pbXBvcnQge05hbWVkVGVuc29yTWFwfSBmcm9tICcuLi90ZW5zb3JfdHlwZXMnO1xuXG5pbXBvcnQge0V4cGxpY2l0UGFkZGluZ30gZnJvbSAnLi9jb252X3V0aWwnO1xuaW1wb3J0IHtvcH0gZnJvbSAnLi9vcGVyYXRpb24nO1xuaW1wb3J0IHtyZXNoYXBlfSBmcm9tICcuL3Jlc2hhcGUnO1xuXG5mdW5jdGlvbiBkZXB0aHdpc2VDb252MmROYXRpdmVCYWNrcHJvcElucHV0XzxUIGV4dGVuZHMgVGVuc29yM0R8VGVuc29yNEQ+KFxuICAgIHhTaGFwZTogW251bWJlciwgbnVtYmVyLCBudW1iZXIsIG51bWJlcl0sIGR5OiBULCBmaWx0ZXI6IFRlbnNvcjRELFxuICAgIHN0cmlkZXM6IFtudW1iZXIsIG51bWJlcl18bnVtYmVyLFxuICAgIHBhZDogJ3ZhbGlkJ3wnc2FtZSd8bnVtYmVyfEV4cGxpY2l0UGFkZGluZyxcbiAgICBkaWxhdGlvbnM6IFtudW1iZXIsIG51bWJlcl18bnVtYmVyID0gWzEsIDFdLFxuICAgIGRpbVJvdW5kaW5nTW9kZT86ICdmbG9vcid8J3JvdW5kJ3wnY2VpbCcpOiBUIHtcbiAgbGV0IGR5NEQgPSBkeSBhcyBUZW5zb3I0RDtcbiAgbGV0IHJlc2hhcGVkVG80RCA9IGZhbHNlO1xuICBpZiAoZHkucmFuayA9PT0gMykge1xuICAgIHJlc2hhcGVkVG80RCA9IHRydWU7XG4gICAgZHk0RCA9IHJlc2hhcGUoZHksIFsxLCBkeS5zaGFwZVswXSwgZHkuc2hhcGVbMV0sIGR5LnNoYXBlWzJdXSk7XG4gIH1cblxuICBjb25zdCBpbnB1dHM6IERlcHRod2lzZUNvbnYyZE5hdGl2ZUJhY2twcm9wSW5wdXRJbnB1dHMgPSB7ZHk6IGR5NEQsIGZpbHRlcn07XG4gIGNvbnN0IGF0dHJzOiBEZXB0aHdpc2VDb252MmROYXRpdmVCYWNrcHJvcElucHV0QXR0cnMgPVxuICAgICAge3N0cmlkZXMsIHBhZCwgZGltUm91bmRpbmdNb2RlLCBkaWxhdGlvbnMsIGlucHV0U2hhcGU6IHhTaGFwZX07XG5cbiAgY29uc3QgcmVzID1cbiAgICAgIC8vIHRzbGludDpkaXNhYmxlLW5leHQtbGluZTogbm8tdW5uZWNlc3NhcnktdHlwZS1hc3NlcnRpb25cbiAgICAgIEVOR0lORS5ydW5LZXJuZWwoXG4gICAgICAgICAgRGVwdGh3aXNlQ29udjJkTmF0aXZlQmFja3Byb3BJbnB1dCwgaW5wdXRzIGFzIHt9IGFzIE5hbWVkVGVuc29yTWFwLFxuICAgICAgICAgIGF0dHJzIGFzIHt9IGFzIE5hbWVkQXR0ck1hcCkgYXMgVDtcblxuICBpZiAocmVzaGFwZWRUbzREKSB7XG4gICAgcmV0dXJuIHJlc2hhcGUocmVzLCBbcmVzLnNoYXBlWzFdLCByZXMuc2hhcGVbMl0sIHJlcy5zaGFwZVszXV0pIGFzIFQ7XG4gIH1cbiAgcmV0dXJuIHJlcztcbn1cblxuZXhwb3J0IGNvbnN0IGRlcHRod2lzZUNvbnYyZE5hdGl2ZUJhY2twcm9wSW5wdXQgPVxuICAgIG9wKHtkZXB0aHdpc2VDb252MmROYXRpdmVCYWNrcHJvcElucHV0X30pO1xuIl19","/**\n * @license\n * Copyright 2020 Google LLC. All Rights Reserved.\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n * =============================================================================\n */\nimport { ENGINE } from '../engine';\nimport { Dilation2D } from '../kernel_names';\nimport { convertToTensor } from '../tensor_util_env';\nimport * as util from '../util';\nimport { op } from './operation';\nimport { reshape } from './reshape';\n/**\n * Computes the grayscale dilation over the input `x`.\n *\n * @param x The input tensor, rank 3 or rank 4 of shape\n * `[batch, height, width, inChannels]`. If rank 3, batch of 1 is assumed.\n * @param filter The filter tensor, rank 3, of shape\n * `[filterHeight, filterWidth, depth]`.\n * @param strides The strides of the sliding window for each dimension of the\n * input tensor: `[strideHeight, strideWidth]`.\n * If `strides` is a single number,\n * then `strideHeight == strideWidth`.\n * @param pad The type of padding algorithm.\n * - `same` and stride 1: output will be of same size as input,\n * regardless of filter size.\n * - `valid`: output will be smaller than input if filter is larger\n * than 1*1x1.\n * - For more info, see this guide:\n * [https://www.tensorflow.org/api_docs/python/tf/nn/convolution](\n * https://www.tensorflow.org/api_docs/python/tf/nn/convolution)\n * @param dataFormat Specify the data format of the input and output data.\n * Defaults to 'NHWC'. Only 'NHWC' is currently supported. With the\n * default format \"NHWC\", the data is stored in the order of: [batch,\n * height, width, channels].\n * @param dilations The dilation rates: `[dilationHeight, dilationWidth]`\n * in which we sample input values across the height and width dimensions\n * for atrous morphological dilation. Defaults to `[1, 1]`. If `dilations`\n * is a single number, then `dilationHeight == dilationWidth`. If it is\n * greater than 1, then all values of `strides` must be 1.\n *\n * @doc {heading: 'Operations', subheading: 'Convolution'}\n */\nfunction dilation2d_(x, filter, strides, pad, dilations = [1, 1], dataFormat = 'NHWC') {\n const $x = convertToTensor(x, 'x', 'dilation2d');\n const $filter = convertToTensor(filter, 'filter', 'dilation2d');\n util.assert($x.rank === 3 || $x.rank === 4, () => `Error in dilation2d: input must be rank 3 or 4, but got rank ` +\n `${$x.rank}.`);\n util.assert($filter.rank === 3, () => `Error in dilation2d: filter must be rank 3, but got rank ` +\n `${$filter.rank}.`);\n util.assert(dataFormat === 'NHWC', () => `Error in dilation2d: Only NHWC is currently supported, ` +\n `but got dataFormat of ${dataFormat}`);\n let x4D = $x;\n let reshapedTo4D = false;\n if ($x.rank === 3) {\n x4D = reshape($x, [1, $x.shape[0], $x.shape[1], $x.shape[2]]);\n reshapedTo4D = true;\n }\n const inputs = { x: x4D, filter: $filter };\n const attrs = { strides, pad, dilations };\n // tslint:disable-next-line: no-unnecessary-type-assertion\n const res = ENGINE.runKernel(Dilation2D, inputs, attrs);\n if (reshapedTo4D) {\n return reshape(res, [res.shape[1], res.shape[2], res.shape[3]]);\n }\n return res;\n}\nexport const dilation2d = op({ dilation2d_ });\n//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZGlsYXRpb24yZC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uLy4uL3RmanMtY29yZS9zcmMvb3BzL2RpbGF0aW9uMmQudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUE7Ozs7Ozs7Ozs7Ozs7OztHQWVHO0FBRUgsT0FBTyxFQUFDLE1BQU0sRUFBQyxNQUFNLFdBQVcsQ0FBQztBQUNqQyxPQUFPLEVBQUMsVUFBVSxFQUFvQyxNQUFNLGlCQUFpQixDQUFDO0FBSTlFLE9BQU8sRUFBQyxlQUFlLEVBQUMsTUFBTSxvQkFBb0IsQ0FBQztBQUVuRCxPQUFPLEtBQUssSUFBSSxNQUFNLFNBQVMsQ0FBQztBQUVoQyxPQUFPLEVBQUMsRUFBRSxFQUFDLE1BQU0sYUFBYSxDQUFDO0FBQy9CLE9BQU8sRUFBQyxPQUFPLEVBQUMsTUFBTSxXQUFXLENBQUM7QUFFbEM7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7OztHQThCRztBQUNILFNBQVMsV0FBVyxDQUNoQixDQUFlLEVBQUUsTUFBMkIsRUFDNUMsT0FBZ0MsRUFBRSxHQUFtQixFQUNyRCxZQUFxQyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsRUFDM0MsYUFBcUIsTUFBTTtJQUM3QixNQUFNLEVBQUUsR0FBRyxlQUFlLENBQUMsQ0FBQyxFQUFFLEdBQUcsRUFBRSxZQUFZLENBQUMsQ0FBQztJQUNqRCxNQUFNLE9BQU8sR0FBRyxlQUFlLENBQUMsTUFBTSxFQUFFLFFBQVEsRUFBRSxZQUFZLENBQUMsQ0FBQztJQUVoRSxJQUFJLENBQUMsTUFBTSxDQUNQLEVBQUUsQ0FBQyxJQUFJLEtBQUssQ0FBQyxJQUFJLEVBQUUsQ0FBQyxJQUFJLEtBQUssQ0FBQyxFQUM5QixHQUFHLEVBQUUsQ0FBQywrREFBK0Q7UUFDakUsR0FBRyxFQUFFLENBQUMsSUFBSSxHQUFHLENBQUMsQ0FBQztJQUN2QixJQUFJLENBQUMsTUFBTSxDQUNQLE9BQU8sQ0FBQyxJQUFJLEtBQUssQ0FBQyxFQUNsQixHQUFHLEVBQUUsQ0FBQywyREFBMkQ7UUFDN0QsR0FBRyxPQUFPLENBQUMsSUFBSSxHQUFHLENBQUMsQ0FBQztJQUM1QixJQUFJLENBQUMsTUFBTSxDQUNQLFVBQVUsS0FBSyxNQUFNLEVBQ3JCLEdBQUcsRUFBRSxDQUFDLHlEQUF5RDtRQUMzRCx5QkFBeUIsVUFBVSxFQUFFLENBQUMsQ0FBQztJQUUvQyxJQUFJLEdBQUcsR0FBRyxFQUFjLENBQUM7SUFDekIsSUFBSSxZQUFZLEdBQUcsS0FBSyxDQUFDO0lBRXpCLElBQUksRUFBRSxDQUFDLElBQUksS0FBSyxDQUFDLEVBQUU7UUFDakIsR0FBRyxHQUFHLE9BQU8sQ0FBQyxFQUFFLEVBQUUsQ0FBQyxDQUFDLEVBQUUsRUFBRSxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUMsRUFBRSxFQUFFLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQyxFQUFFLEVBQUUsQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDO1FBQzlELFlBQVksR0FBRyxJQUFJLENBQUM7S0FDckI7SUFFRCxNQUFNLE1BQU0sR0FBcUIsRUFBQyxDQUFDLEVBQUUsR0FBRyxFQUFFLE1BQU0sRUFBRSxPQUFPLEVBQUMsQ0FBQztJQUMzRCxNQUFNLEtBQUssR0FBb0IsRUFBQyxPQUFPLEVBQUUsR0FBRyxFQUFFLFNBQVMsRUFBQyxDQUFDO0lBRXpELDBEQUEwRDtJQUMxRCxNQUFNLEdBQUcsR0FBRyxNQUFNLENBQUMsU0FBUyxDQUNaLFVBQVUsRUFBRSxNQUE4QixFQUMxQyxLQUEyQixDQUFNLENBQUM7SUFFbEQsSUFBSSxZQUFZLEVBQUU7UUFDaEIsT0FBTyxPQUFPLENBQUMsR0FBRyxFQUFFLENBQUMsR0FBRyxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUMsRUFBRSxHQUFHLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQyxFQUFFLEdBQUcsQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBTSxDQUFDO0tBQ3RFO0lBRUQsT0FBTyxHQUFHLENBQUM7QUFDYixDQUFDO0FBRUQsTUFBTSxDQUFDLE1BQU0sVUFBVSxHQUFHLEVBQUUsQ0FBQyxFQUFDLFdBQVcsRUFBQyxDQUFDLENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyIvKipcbiAqIEBsaWNlbnNlXG4gKiBDb3B5cmlnaHQgMjAyMCBHb29nbGUgTExDLiBBbGwgUmlnaHRzIFJlc2VydmVkLlxuICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlIFwiTGljZW5zZVwiKTtcbiAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS5cbiAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdFxuICpcbiAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMFxuICpcbiAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmVcbiAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuIFwiQVMgSVNcIiBCQVNJUyxcbiAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLlxuICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZFxuICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuXG4gKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuICovXG5cbmltcG9ydCB7RU5HSU5FfSBmcm9tICcuLi9lbmdpbmUnO1xuaW1wb3J0IHtEaWxhdGlvbjJELCBEaWxhdGlvbjJEQXR0cnMsIERpbGF0aW9uMkRJbnB1dHN9IGZyb20gJy4uL2tlcm5lbF9uYW1lcyc7XG5pbXBvcnQge05hbWVkQXR0ck1hcH0gZnJvbSAnLi4va2VybmVsX3JlZ2lzdHJ5JztcbmltcG9ydCB7VGVuc29yM0QsIFRlbnNvcjREfSBmcm9tICcuLi90ZW5zb3InO1xuaW1wb3J0IHtOYW1lZFRlbnNvck1hcH0gZnJvbSAnLi4vdGVuc29yX3R5cGVzJztcbmltcG9ydCB7Y29udmVydFRvVGVuc29yfSBmcm9tICcuLi90ZW5zb3JfdXRpbF9lbnYnO1xuaW1wb3J0IHtUZW5zb3JMaWtlfSBmcm9tICcuLi90eXBlcyc7XG5pbXBvcnQgKiBhcyB1dGlsIGZyb20gJy4uL3V0aWwnO1xuXG5pbXBvcnQge29wfSBmcm9tICcuL29wZXJhdGlvbic7XG5pbXBvcnQge3Jlc2hhcGV9IGZyb20gJy4vcmVzaGFwZSc7XG5cbi8qKlxuICogQ29tcHV0ZXMgdGhlIGdyYXlzY2FsZSBkaWxhdGlvbiBvdmVyIHRoZSBpbnB1dCBgeGAuXG4gKlxuICogQHBhcmFtIHggVGhlIGlucHV0IHRlbnNvciwgcmFuayAzIG9yIHJhbmsgNCBvZiBzaGFwZVxuICogICAgIGBbYmF0Y2gsIGhlaWdodCwgd2lkdGgsIGluQ2hhbm5lbHNdYC4gSWYgcmFuayAzLCBiYXRjaCBvZiAxIGlzIGFzc3VtZWQuXG4gKiBAcGFyYW0gZmlsdGVyIFRoZSBmaWx0ZXIgdGVuc29yLCByYW5rIDMsIG9mIHNoYXBlXG4gKiAgICAgYFtmaWx0ZXJIZWlnaHQsIGZpbHRlcldpZHRoLCBkZXB0aF1gLlxuICogQHBhcmFtIHN0cmlkZXMgVGhlIHN0cmlkZXMgb2YgdGhlIHNsaWRpbmcgd2luZG93IGZvciBlYWNoIGRpbWVuc2lvbiBvZiB0aGVcbiAqICAgICBpbnB1dCB0ZW5zb3I6IGBbc3RyaWRlSGVpZ2h0LCBzdHJpZGVXaWR0aF1gLlxuICogICAgIElmIGBzdHJpZGVzYCBpcyBhIHNpbmdsZSBudW1iZXIsXG4gKiAgICAgdGhlbiBgc3RyaWRlSGVpZ2h0ID09IHN0cmlkZVdpZHRoYC5cbiAqIEBwYXJhbSBwYWQgVGhlIHR5cGUgb2YgcGFkZGluZyBhbGdvcml0aG0uXG4gKiAgICAtIGBzYW1lYCBhbmQgc3RyaWRlIDE6IG91dHB1dCB3aWxsIGJlIG9mIHNhbWUgc2l6ZSBhcyBpbnB1dCxcbiAqICAgICAgIHJlZ2FyZGxlc3Mgb2YgZmlsdGVyIHNpemUuXG4gKiAgICAtIGB2YWxpZGA6IG91dHB1dCB3aWxsIGJlIHNtYWxsZXIgdGhhbiBpbnB1dCBpZiBmaWx0ZXIgaXMgbGFyZ2VyXG4gKiAgICAgICB0aGFuIDEqMXgxLlxuICogICAgLSBGb3IgbW9yZSBpbmZvLCBzZWUgdGhpcyBndWlkZTpcbiAqICAgICBbaHR0cHM6Ly93d3cudGVuc29yZmxvdy5vcmcvYXBpX2RvY3MvcHl0aG9uL3RmL25uL2NvbnZvbHV0aW9uXShcbiAqICAgICAgICAgIGh0dHBzOi8vd3d3LnRlbnNvcmZsb3cub3JnL2FwaV9kb2NzL3B5dGhvbi90Zi9ubi9jb252b2x1dGlvbilcbiAqIEBwYXJhbSBkYXRhRm9ybWF0IFNwZWNpZnkgdGhlIGRhdGEgZm9ybWF0IG9mIHRoZSBpbnB1dCBhbmQgb3V0cHV0IGRhdGEuXG4gKiAgICAgIERlZmF1bHRzIHRvICdOSFdDJy4gT25seSAnTkhXQycgaXMgY3VycmVudGx5IHN1cHBvcnRlZC4gV2l0aCB0aGVcbiAqICAgICAgZGVmYXVsdCBmb3JtYXQgXCJOSFdDXCIsIHRoZSBkYXRhIGlzIHN0b3JlZCBpbiB0aGUgb3JkZXIgb2Y6IFtiYXRjaCxcbiAqICAgICAgaGVpZ2h0LCB3aWR0aCwgY2hhbm5lbHNdLlxuICogQHBhcmFtIGRpbGF0aW9ucyBUaGUgZGlsYXRpb24gcmF0ZXM6IGBbZGlsYXRpb25IZWlnaHQsIGRpbGF0aW9uV2lkdGhdYFxuICogICAgIGluIHdoaWNoIHdlIHNhbXBsZSBpbnB1dCB2YWx1ZXMgYWNyb3NzIHRoZSBoZWlnaHQgYW5kIHdpZHRoIGRpbWVuc2lvbnNcbiAqICAgICBmb3IgYXRyb3VzIG1vcnBob2xvZ2ljYWwgZGlsYXRpb24uIERlZmF1bHRzIHRvIGBbMSwgMV1gLiBJZiBgZGlsYXRpb25zYFxuICogICAgIGlzIGEgc2luZ2xlIG51bWJlciwgdGhlbiBgZGlsYXRpb25IZWlnaHQgPT0gZGlsYXRpb25XaWR0aGAuIElmIGl0IGlzXG4gKiAgICAgZ3JlYXRlciB0aGFuIDEsIHRoZW4gYWxsIHZhbHVlcyBvZiBgc3RyaWRlc2AgbXVzdCBiZSAxLlxuICpcbiAqIEBkb2Mge2hlYWRpbmc6ICdPcGVyYXRpb25zJywgc3ViaGVhZGluZzogJ0NvbnZvbHV0aW9uJ31cbiAqL1xuZnVuY3Rpb24gZGlsYXRpb24yZF88VCBleHRlbmRzIFRlbnNvcjNEfFRlbnNvcjREPihcbiAgICB4OiBUfFRlbnNvckxpa2UsIGZpbHRlcjogVGVuc29yM0R8VGVuc29yTGlrZSxcbiAgICBzdHJpZGVzOiBbbnVtYmVyLCBudW1iZXJdfG51bWJlciwgcGFkOiAndmFsaWQnfCdzYW1lJyxcbiAgICBkaWxhdGlvbnM6IFtudW1iZXIsIG51bWJlcl18bnVtYmVyID0gWzEsIDFdLFxuICAgIGRhdGFGb3JtYXQ6ICdOSFdDJyA9ICdOSFdDJyk6IFQge1xuICBjb25zdCAkeCA9IGNvbnZlcnRUb1RlbnNvcih4LCAneCcsICdkaWxhdGlvbjJkJyk7XG4gIGNvbnN0ICRmaWx0ZXIgPSBjb252ZXJ0VG9UZW5zb3IoZmlsdGVyLCAnZmlsdGVyJywgJ2RpbGF0aW9uMmQnKTtcblxuICB1dGlsLmFzc2VydChcbiAgICAgICR4LnJhbmsgPT09IDMgfHwgJHgucmFuayA9PT0gNCxcbiAgICAgICgpID0+IGBFcnJvciBpbiBkaWxhdGlvbjJkOiBpbnB1dCBtdXN0IGJlIHJhbmsgMyBvciA0LCBidXQgZ290IHJhbmsgYCArXG4gICAgICAgICAgYCR7JHgucmFua30uYCk7XG4gIHV0aWwuYXNzZXJ0KFxuICAgICAgJGZpbHRlci5yYW5rID09PSAzLFxuICAgICAgKCkgPT4gYEVycm9yIGluIGRpbGF0aW9uMmQ6IGZpbHRlciBtdXN0IGJlIHJhbmsgMywgYnV0IGdvdCByYW5rIGAgK1xuICAgICAgICAgIGAkeyRmaWx0ZXIucmFua30uYCk7XG4gIHV0aWwuYXNzZXJ0KFxuICAgICAgZGF0YUZvcm1hdCA9PT0gJ05IV0MnLFxuICAgICAgKCkgPT4gYEVycm9yIGluIGRpbGF0aW9uMmQ6IE9ubHkgTkhXQyBpcyBjdXJyZW50bHkgc3VwcG9ydGVkLCBgICtcbiAgICAgICAgICBgYnV0IGdvdCBkYXRhRm9ybWF0IG9mICR7ZGF0YUZvcm1hdH1gKTtcblxuICBsZXQgeDREID0gJHggYXMgVGVuc29yNEQ7XG4gIGxldCByZXNoYXBlZFRvNEQgPSBmYWxzZTtcblxuICBpZiAoJHgucmFuayA9PT0gMykge1xuICAgIHg0RCA9IHJlc2hhcGUoJHgsIFsxLCAkeC5zaGFwZVswXSwgJHguc2hhcGVbMV0sICR4LnNoYXBlWzJdXSk7XG4gICAgcmVzaGFwZWRUbzREID0gdHJ1ZTtcbiAgfVxuXG4gIGNvbnN0IGlucHV0czogRGlsYXRpb24yRElucHV0cyA9IHt4OiB4NEQsIGZpbHRlcjogJGZpbHRlcn07XG4gIGNvbnN0IGF0dHJzOiBEaWxhdGlvbjJEQXR0cnMgPSB7c3RyaWRlcywgcGFkLCBkaWxhdGlvbnN9O1xuXG4gIC8vIHRzbGludDpkaXNhYmxlLW5leHQtbGluZTogbm8tdW5uZWNlc3NhcnktdHlwZS1hc3NlcnRpb25cbiAgY29uc3QgcmVzID0gRU5HSU5FLnJ1bktlcm5lbChcbiAgICAgICAgICAgICAgICAgIERpbGF0aW9uMkQsIGlucHV0cyBhcyB7fSBhcyBOYW1lZFRlbnNvck1hcCxcbiAgICAgICAgICAgICAgICAgIGF0dHJzIGFzIHt9IGFzIE5hbWVkQXR0ck1hcCkgYXMgVDtcblxuICBpZiAocmVzaGFwZWRUbzREKSB7XG4gICAgcmV0dXJuIHJlc2hhcGUocmVzLCBbcmVzLnNoYXBlWzFdLCByZXMuc2hhcGVbMl0sIHJlcy5zaGFwZVszXV0pIGFzIFQ7XG4gIH1cblxuICByZXR1cm4gcmVzO1xufVxuXG5leHBvcnQgY29uc3QgZGlsYXRpb24yZCA9IG9wKHtkaWxhdGlvbjJkX30pO1xuIl19","/**\n * @license\n * Copyright 2020 Google LLC. All Rights Reserved.\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n * =============================================================================\n */\nimport { ENGINE } from '../engine';\nimport { RealDiv } from '../kernel_names';\nimport { makeTypesMatch } from '../tensor_util';\nimport { convertToTensor } from '../tensor_util_env';\nimport { floorDiv } from './floorDiv';\nimport { op } from './operation';\n/**\n * Divides two `tf.Tensor`s element-wise, A / B. Supports broadcasting.\n *\n * ```js\n * const a = tf.tensor1d([1, 4, 9, 16]);\n * const b = tf.tensor1d([1, 2, 3, 4]);\n *\n * a.div(b).print(); // or tf.div(a, b)\n * ```\n *\n * ```js\n * // Broadcast div a with b.\n * const a = tf.tensor1d([2, 4, 6, 8]);\n * const b = tf.scalar(2);\n *\n * a.div(b).print(); // or tf.div(a, b)\n * ```\n *\n * @param a The first tensor as the numerator.\n * @param b The second tensor as the denominator. Must have the same dtype as\n * `a`.\n *\n * @doc {heading: 'Operations', subheading: 'Arithmetic'}\n */\nfunction div_(a, b) {\n let $a = convertToTensor(a, 'a', 'div');\n let $b = convertToTensor(b, 'b', 'div');\n [$a, $b] = makeTypesMatch($a, $b);\n if ($a.dtype === 'int32' && $b.dtype === 'int32') {\n return floorDiv($a, $b);\n }\n const inputs = { a: $a, b: $b };\n const attrs = {};\n // tslint:disable-next-line: no-unnecessary-type-assertion\n return ENGINE.runKernel(RealDiv, inputs, attrs);\n}\nexport const div = op({ div_ });\n//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZGl2LmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vLi4vdGZqcy1jb3JlL3NyYy9vcHMvZGl2LnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBOzs7Ozs7Ozs7Ozs7Ozs7R0FlRztBQUVILE9BQU8sRUFBQyxNQUFNLEVBQUMsTUFBTSxXQUFXLENBQUM7QUFDakMsT0FBTyxFQUFDLE9BQU8sRUFBZ0IsTUFBTSxpQkFBaUIsQ0FBQztBQUd2RCxPQUFPLEVBQUMsY0FBYyxFQUFDLE1BQU0sZ0JBQWdCLENBQUM7QUFDOUMsT0FBTyxFQUFDLGVBQWUsRUFBQyxNQUFNLG9CQUFvQixDQUFDO0FBR25ELE9BQU8sRUFBQyxRQUFRLEVBQUMsTUFBTSxZQUFZLENBQUM7QUFDcEMsT0FBTyxFQUFDLEVBQUUsRUFBQyxNQUFNLGFBQWEsQ0FBQztBQUUvQjs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7R0F1Qkc7QUFDSCxTQUFTLElBQUksQ0FBbUIsQ0FBb0IsRUFBRSxDQUFvQjtJQUN4RSxJQUFJLEVBQUUsR0FBRyxlQUFlLENBQUMsQ0FBQyxFQUFFLEdBQUcsRUFBRSxLQUFLLENBQUMsQ0FBQztJQUN4QyxJQUFJLEVBQUUsR0FBRyxlQUFlLENBQUMsQ0FBQyxFQUFFLEdBQUcsRUFBRSxLQUFLLENBQUMsQ0FBQztJQUN4QyxDQUFDLEVBQUUsRUFBRSxFQUFFLENBQUMsR0FBRyxjQUFjLENBQUMsRUFBRSxFQUFFLEVBQUUsQ0FBQyxDQUFDO0lBRWxDLElBQUksRUFBRSxDQUFDLEtBQUssS0FBSyxPQUFPLElBQUksRUFBRSxDQUFDLEtBQUssS0FBSyxPQUFPLEVBQUU7UUFDaEQsT0FBTyxRQUFRLENBQUMsRUFBRSxFQUFFLEVBQUUsQ0FBQyxDQUFDO0tBQ3pCO0lBRUQsTUFBTSxNQUFNLEdBQWtCLEVBQUMsQ0FBQyxFQUFFLEVBQUUsRUFBRSxDQUFDLEVBQUUsRUFBRSxFQUFDLENBQUM7SUFDN0MsTUFBTSxLQUFLLEdBQUcsRUFBRSxDQUFDO0lBRWpCLDBEQUEwRDtJQUMxRCxPQUFPLE1BQU0sQ0FBQyxTQUFTLENBQUMsT0FBTyxFQUFFLE1BQThCLEVBQUUsS0FBSyxDQUFNLENBQUM7QUFDL0UsQ0FBQztBQUVELE1BQU0sQ0FBQyxNQUFNLEdBQUcsR0FBRyxFQUFFLENBQUMsRUFBQyxJQUFJLEVBQUMsQ0FBQyxDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiLyoqXG4gKiBAbGljZW5zZVxuICogQ29weXJpZ2h0IDIwMjAgR29vZ2xlIExMQy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC5cbiAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSBcIkxpY2Vuc2VcIik7XG4gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuXG4gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXRcbiAqXG4gKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjBcbiAqXG4gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlXG4gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiBcIkFTIElTXCIgQkFTSVMsXG4gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC5cbiAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmRcbiAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLlxuICogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbiAqL1xuXG5pbXBvcnQge0VOR0lORX0gZnJvbSAnLi4vZW5naW5lJztcbmltcG9ydCB7UmVhbERpdiwgUmVhbERpdklucHV0c30gZnJvbSAnLi4va2VybmVsX25hbWVzJztcbmltcG9ydCB7VGVuc29yfSBmcm9tICcuLi90ZW5zb3InO1xuaW1wb3J0IHtOYW1lZFRlbnNvck1hcH0gZnJvbSAnLi4vdGVuc29yX3R5cGVzJztcbmltcG9ydCB7bWFrZVR5cGVzTWF0Y2h9IGZyb20gJy4uL3RlbnNvcl91dGlsJztcbmltcG9ydCB7Y29udmVydFRvVGVuc29yfSBmcm9tICcuLi90ZW5zb3JfdXRpbF9lbnYnO1xuaW1wb3J0IHtUZW5zb3JMaWtlfSBmcm9tICcuLi90eXBlcyc7XG5cbmltcG9ydCB7Zmxvb3JEaXZ9IGZyb20gJy4vZmxvb3JEaXYnO1xuaW1wb3J0IHtvcH0gZnJvbSAnLi9vcGVyYXRpb24nO1xuXG4vKipcbiAqIERpdmlkZXMgdHdvIGB0Zi5UZW5zb3JgcyBlbGVtZW50LXdpc2UsIEEgLyBCLiBTdXBwb3J0cyBicm9hZGNhc3RpbmcuXG4gKlxuICogYGBganNcbiAqIGNvbnN0IGEgPSB0Zi50ZW5zb3IxZChbMSwgNCwgOSwgMTZdKTtcbiAqIGNvbnN0IGIgPSB0Zi50ZW5zb3IxZChbMSwgMiwgMywgNF0pO1xuICpcbiAqIGEuZGl2KGIpLnByaW50KCk7ICAvLyBvciB0Zi5kaXYoYSwgYilcbiAqIGBgYFxuICpcbiAqIGBgYGpzXG4gKiAvLyBCcm9hZGNhc3QgZGl2IGEgd2l0aCBiLlxuICogY29uc3QgYSA9IHRmLnRlbnNvcjFkKFsyLCA0LCA2LCA4XSk7XG4gKiBjb25zdCBiID0gdGYuc2NhbGFyKDIpO1xuICpcbiAqIGEuZGl2KGIpLnByaW50KCk7ICAvLyBvciB0Zi5kaXYoYSwgYilcbiAqIGBgYFxuICpcbiAqIEBwYXJhbSBhIFRoZSBmaXJzdCB0ZW5zb3IgYXMgdGhlIG51bWVyYXRvci5cbiAqIEBwYXJhbSBiIFRoZSBzZWNvbmQgdGVuc29yIGFzIHRoZSBkZW5vbWluYXRvci4gTXVzdCBoYXZlIHRoZSBzYW1lIGR0eXBlIGFzXG4gKiBgYWAuXG4gKlxuICogQGRvYyB7aGVhZGluZzogJ09wZXJhdGlvbnMnLCBzdWJoZWFkaW5nOiAnQXJpdGhtZXRpYyd9XG4gKi9cbmZ1bmN0aW9uIGRpdl88VCBleHRlbmRzIFRlbnNvcj4oYTogVGVuc29yfFRlbnNvckxpa2UsIGI6IFRlbnNvcnxUZW5zb3JMaWtlKTogVCB7XG4gIGxldCAkYSA9IGNvbnZlcnRUb1RlbnNvcihhLCAnYScsICdkaXYnKTtcbiAgbGV0ICRiID0gY29udmVydFRvVGVuc29yKGIsICdiJywgJ2RpdicpO1xuICBbJGEsICRiXSA9IG1ha2VUeXBlc01hdGNoKCRhLCAkYik7XG5cbiAgaWYgKCRhLmR0eXBlID09PSAnaW50MzInICYmICRiLmR0eXBlID09PSAnaW50MzInKSB7XG4gICAgcmV0dXJuIGZsb29yRGl2KCRhLCAkYik7XG4gIH1cblxuICBjb25zdCBpbnB1dHM6IFJlYWxEaXZJbnB1dHMgPSB7YTogJGEsIGI6ICRifTtcbiAgY29uc3QgYXR0cnMgPSB7fTtcblxuICAvLyB0c2xpbnQ6ZGlzYWJsZS1uZXh0LWxpbmU6IG5vLXVubmVjZXNzYXJ5LXR5cGUtYXNzZXJ0aW9uXG4gIHJldHVybiBFTkdJTkUucnVuS2VybmVsKFJlYWxEaXYsIGlucHV0cyBhcyB7fSBhcyBOYW1lZFRlbnNvck1hcCwgYXR0cnMpIGFzIFQ7XG59XG5cbmV4cG9ydCBjb25zdCBkaXYgPSBvcCh7ZGl2X30pO1xuIl19","/**\n * @license\n * Copyright 2020 Google LLC. All Rights Reserved.\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n * =============================================================================\n */\nimport { makeTypesMatch } from '../tensor_util';\nimport { convertToTensor } from '../tensor_util_env';\nimport { div } from './div';\nimport { equal } from './equal';\nimport { op } from './operation';\nimport { where } from './where';\nimport { zerosLike } from './zeros_like';\n/**\n * Divides two `tf.Tensor`s element-wise, A / B. Supports broadcasting. Return 0\n * if denominator is 0.\n *\n *\n * ```js\n * const a = tf.tensor1d([1, 4, 9, 16]);\n * const b = tf.tensor1d([1, 2, 3, 4]);\n * const c = tf.tensor1d([0, 0, 0, 0]);\n *\n * a.divNoNan(b).print(); // or tf.divNoNan(a, b)\n * a.divNoNan(c).print(); // or tf.divNoNan(a, c)\n * ```\n *\n * ```js\n * // Broadcast div a with b.\n * const a = tf.tensor1d([2, 4, 6, 8]);\n * const b = tf.scalar(2);\n * const c = tf.scalar(0);\n *\n * a.divNoNan(b).print(); // or tf.divNoNan(a, b)\n * a.divNoNan(c).print(); // or tf.divNoNan(a, c)\n * ```\n *\n * @param a The first tensor as the numerator.\n * @param b The second tensor as the denominator. Must have the same dtype as\n * `a`.\n *\n * @doc {heading: 'Operations', subheading: 'Arithmetic'}\n */\nfunction divNoNan_(a, b) {\n // TODO: Make this into its own kernel.\n let $a = convertToTensor(a, 'a', 'div');\n let $b = convertToTensor(b, 'b', 'div');\n [$a, $b] = makeTypesMatch($a, $b);\n const divResult = div($a, $b);\n const zeros = zerosLike(divResult);\n const bEqualsZero = equal($b, zeros);\n return where(bEqualsZero, zeros, divResult);\n}\nexport const divNoNan = op({ divNoNan_ });\n//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZGl2X25vX25hbi5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uLy4uL3RmanMtY29yZS9zcmMvb3BzL2Rpdl9ub19uYW4udHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUE7Ozs7Ozs7Ozs7Ozs7OztHQWVHO0FBR0gsT0FBTyxFQUFDLGNBQWMsRUFBQyxNQUFNLGdCQUFnQixDQUFDO0FBQzlDLE9BQU8sRUFBQyxlQUFlLEVBQUMsTUFBTSxvQkFBb0IsQ0FBQztBQUduRCxPQUFPLEVBQUMsR0FBRyxFQUFDLE1BQU0sT0FBTyxDQUFDO0FBQzFCLE9BQU8sRUFBQyxLQUFLLEVBQUMsTUFBTSxTQUFTLENBQUM7QUFDOUIsT0FBTyxFQUFDLEVBQUUsRUFBQyxNQUFNLGFBQWEsQ0FBQztBQUMvQixPQUFPLEVBQUMsS0FBSyxFQUFDLE1BQU0sU0FBUyxDQUFDO0FBQzlCLE9BQU8sRUFBQyxTQUFTLEVBQUMsTUFBTSxjQUFjLENBQUM7QUFFdkM7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7O0dBNkJHO0FBQ0gsU0FBUyxTQUFTLENBQ2QsQ0FBb0IsRUFBRSxDQUFvQjtJQUM1Qyx1Q0FBdUM7SUFDdkMsSUFBSSxFQUFFLEdBQUcsZUFBZSxDQUFDLENBQUMsRUFBRSxHQUFHLEVBQUUsS0FBSyxDQUFDLENBQUM7SUFDeEMsSUFBSSxFQUFFLEdBQUcsZUFBZSxDQUFDLENBQUMsRUFBRSxHQUFHLEVBQUUsS0FBSyxDQUFDLENBQUM7SUFDeEMsQ0FBQyxFQUFFLEVBQUUsRUFBRSxDQUFDLEdBQUcsY0FBYyxDQUFDLEVBQUUsRUFBRSxFQUFFLENBQUMsQ0FBQztJQUVsQyxNQUFNLFNBQVMsR0FBRyxHQUFHLENBQUMsRUFBRSxFQUFFLEVBQUUsQ0FBQyxDQUFDO0lBQzlCLE1BQU0sS0FBSyxHQUFHLFNBQVMsQ0FBQyxTQUFTLENBQUMsQ0FBQztJQUNuQyxNQUFNLFdBQVcsR0FBRyxLQUFLLENBQUMsRUFBRSxFQUFFLEtBQUssQ0FBQyxDQUFDO0lBQ3JDLE9BQU8sS0FBSyxDQUFDLFdBQVcsRUFBRSxLQUFLLEVBQUUsU0FBUyxDQUFNLENBQUM7QUFDbkQsQ0FBQztBQUVELE1BQU0sQ0FBQyxNQUFNLFFBQVEsR0FBRyxFQUFFLENBQUMsRUFBQyxTQUFTLEVBQUMsQ0FBQyxDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiLyoqXG4gKiBAbGljZW5zZVxuICogQ29weXJpZ2h0IDIwMjAgR29vZ2xlIExMQy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC5cbiAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSBcIkxpY2Vuc2VcIik7XG4gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuXG4gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXRcbiAqXG4gKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjBcbiAqXG4gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlXG4gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiBcIkFTIElTXCIgQkFTSVMsXG4gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC5cbiAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmRcbiAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLlxuICogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbiAqL1xuXG5pbXBvcnQge1RlbnNvcn0gZnJvbSAnLi4vdGVuc29yJztcbmltcG9ydCB7bWFrZVR5cGVzTWF0Y2h9IGZyb20gJy4uL3RlbnNvcl91dGlsJztcbmltcG9ydCB7Y29udmVydFRvVGVuc29yfSBmcm9tICcuLi90ZW5zb3JfdXRpbF9lbnYnO1xuaW1wb3J0IHtUZW5zb3JMaWtlfSBmcm9tICcuLi90eXBlcyc7XG5cbmltcG9ydCB7ZGl2fSBmcm9tICcuL2Rpdic7XG5pbXBvcnQge2VxdWFsfSBmcm9tICcuL2VxdWFsJztcbmltcG9ydCB7b3B9IGZyb20gJy4vb3BlcmF0aW9uJztcbmltcG9ydCB7d2hlcmV9IGZyb20gJy4vd2hlcmUnO1xuaW1wb3J0IHt6ZXJvc0xpa2V9IGZyb20gJy4vemVyb3NfbGlrZSc7XG5cbi8qKlxuICogRGl2aWRlcyB0d28gYHRmLlRlbnNvcmBzIGVsZW1lbnQtd2lzZSwgQSAvIEIuIFN1cHBvcnRzIGJyb2FkY2FzdGluZy4gUmV0dXJuIDBcbiAqIGlmIGRlbm9taW5hdG9yIGlzIDAuXG4gKlxuICpcbiAqIGBgYGpzXG4gKiBjb25zdCBhID0gdGYudGVuc29yMWQoWzEsIDQsIDksIDE2XSk7XG4gKiBjb25zdCBiID0gdGYudGVuc29yMWQoWzEsIDIsIDMsIDRdKTtcbiAqIGNvbnN0IGMgPSB0Zi50ZW5zb3IxZChbMCwgMCwgMCwgMF0pO1xuICpcbiAqIGEuZGl2Tm9OYW4oYikucHJpbnQoKTsgIC8vIG9yIHRmLmRpdk5vTmFuKGEsIGIpXG4gKiBhLmRpdk5vTmFuKGMpLnByaW50KCk7ICAvLyBvciB0Zi5kaXZOb05hbihhLCBjKVxuICogYGBgXG4gKlxuICogYGBganNcbiAqIC8vIEJyb2FkY2FzdCBkaXYgYSB3aXRoIGIuXG4gKiBjb25zdCBhID0gdGYudGVuc29yMWQoWzIsIDQsIDYsIDhdKTtcbiAqIGNvbnN0IGIgPSB0Zi5zY2FsYXIoMik7XG4gKiBjb25zdCBjID0gdGYuc2NhbGFyKDApO1xuICpcbiAqIGEuZGl2Tm9OYW4oYikucHJpbnQoKTsgIC8vIG9yIHRmLmRpdk5vTmFuKGEsIGIpXG4gKiBhLmRpdk5vTmFuKGMpLnByaW50KCk7ICAvLyBvciB0Zi5kaXZOb05hbihhLCBjKVxuICogYGBgXG4gKlxuICogQHBhcmFtIGEgVGhlIGZpcnN0IHRlbnNvciBhcyB0aGUgbnVtZXJhdG9yLlxuICogQHBhcmFtIGIgVGhlIHNlY29uZCB0ZW5zb3IgYXMgdGhlIGRlbm9taW5hdG9yLiBNdXN0IGhhdmUgdGhlIHNhbWUgZHR5cGUgYXNcbiAqIGBhYC5cbiAqXG4gKiBAZG9jIHtoZWFkaW5nOiAnT3BlcmF0aW9ucycsIHN1YmhlYWRpbmc6ICdBcml0aG1ldGljJ31cbiAqL1xuZnVuY3Rpb24gZGl2Tm9OYW5fPFQgZXh0ZW5kcyBUZW5zb3I+KFxuICAgIGE6IFRlbnNvcnxUZW5zb3JMaWtlLCBiOiBUZW5zb3J8VGVuc29yTGlrZSk6IFQge1xuICAvLyBUT0RPOiBNYWtlIHRoaXMgaW50byBpdHMgb3duIGtlcm5lbC5cbiAgbGV0ICRhID0gY29udmVydFRvVGVuc29yKGEsICdhJywgJ2RpdicpO1xuICBsZXQgJGIgPSBjb252ZXJ0VG9UZW5zb3IoYiwgJ2InLCAnZGl2Jyk7XG4gIFskYSwgJGJdID0gbWFrZVR5cGVzTWF0Y2goJGEsICRiKTtcblxuICBjb25zdCBkaXZSZXN1bHQgPSBkaXYoJGEsICRiKTtcbiAgY29uc3QgemVyb3MgPSB6ZXJvc0xpa2UoZGl2UmVzdWx0KTtcbiAgY29uc3QgYkVxdWFsc1plcm8gPSBlcXVhbCgkYiwgemVyb3MpO1xuICByZXR1cm4gd2hlcmUoYkVxdWFsc1plcm8sIHplcm9zLCBkaXZSZXN1bHQpIGFzIFQ7XG59XG5cbmV4cG9ydCBjb25zdCBkaXZOb05hbiA9IG9wKHtkaXZOb05hbl99KTtcbiJdfQ==","/**\n * @license\n * Copyright 2020 Google LLC. All Rights Reserved.\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n * =============================================================================\n */\nimport { convertToTensor } from '../tensor_util_env';\nimport * as util from '../util';\nimport { matMul } from './mat_mul';\nimport { op } from './operation';\nimport { reshape } from './reshape';\n/**\n * Computes the dot product of two matrices and/or vectors, `t1` and `t2`.\n *\n * ```js\n * const a = tf.tensor1d([1, 2]);\n * const b = tf.tensor2d([[1, 2], [3, 4]]);\n * const c = tf.tensor2d([[1, 2, 3], [4, 5, 6]]);\n *\n * a.dot(b).print(); // or tf.dot(a, b)\n * b.dot(a).print();\n * b.dot(c).print();\n * ```\n * @param t1 The first tensor in the dot operation.\n * @param t2 The second tensor in the dot operation.\n *\n * @doc {heading: 'Operations', subheading: 'Matrices'}\n */\nfunction dot_(t1, t2) {\n const $t1 = convertToTensor(t1, 't1', 'dot');\n const $t2 = convertToTensor(t2, 't2', 'dot');\n util.assert(($t1.rank === 1 || $t1.rank === 2) && ($t2.rank === 1 || $t2.rank === 2), () => `Error in dot: inputs must all be rank 1 or 2, but got ranks ` +\n `${$t1.rank} and ${$t2.rank}.`);\n const t1Inner = ($t1.rank === 1 ? $t1.size : $t1.shape[1]);\n const t2Inner = ($t2.rank === 1 ? $t2.size : $t2.shape[0]);\n util.assert(t1Inner === t2Inner, () => `Error in dot: inner dimensions of inputs must match, but got ` +\n `${t1Inner} and ${t2Inner}.`);\n if ($t1.rank === 1 && $t2.rank === 1) {\n const t12D = reshape($t1, [1, -1]);\n const t22D = reshape($t2, [-1, 1]);\n const t1t2 = matMul(t12D, t22D);\n return reshape(t1t2, []);\n }\n else if ($t1.rank === 1 && $t2.rank === 2) {\n const t12D = reshape($t1, [1, -1]);\n const t22D = reshape($t2, [$t2.shape[0], $t2.shape[1]]);\n const t1t2 = matMul(t12D, t22D);\n return reshape(t1t2, [t1t2.size]);\n }\n else if ($t1.rank === 2 && $t2.rank === 1) {\n const t22D = reshape($t2, [-1, 1]);\n const t1t2 = matMul($t1, t22D);\n return reshape(t1t2, [t1t2.size]);\n }\n else {\n const t22D = reshape($t2, [$t2.shape[0], $t2.shape[1]]);\n const t1t2 = matMul($t1, t22D);\n return t1t2;\n }\n}\nexport const dot = op({ dot_ });\n//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZG90LmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vLi4vdGZqcy1jb3JlL3NyYy9vcHMvZG90LnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBOzs7Ozs7Ozs7Ozs7Ozs7R0FlRztBQUdILE9BQU8sRUFBQyxlQUFlLEVBQUMsTUFBTSxvQkFBb0IsQ0FBQztBQUVuRCxPQUFPLEtBQUssSUFBSSxNQUFNLFNBQVMsQ0FBQztBQUVoQyxPQUFPLEVBQUMsTUFBTSxFQUFDLE1BQU0sV0FBVyxDQUFDO0FBQ2pDLE9BQU8sRUFBQyxFQUFFLEVBQUMsTUFBTSxhQUFhLENBQUM7QUFDL0IsT0FBTyxFQUFDLE9BQU8sRUFBQyxNQUFNLFdBQVcsQ0FBQztBQUVsQzs7Ozs7Ozs7Ozs7Ozs7OztHQWdCRztBQUNILFNBQVMsSUFBSSxDQUFDLEVBQXFCLEVBQUUsRUFBcUI7SUFDeEQsTUFBTSxHQUFHLEdBQUcsZUFBZSxDQUFDLEVBQUUsRUFBRSxJQUFJLEVBQUUsS0FBSyxDQUFDLENBQUM7SUFDN0MsTUFBTSxHQUFHLEdBQUcsZUFBZSxDQUFDLEVBQUUsRUFBRSxJQUFJLEVBQUUsS0FBSyxDQUFDLENBQUM7SUFFN0MsSUFBSSxDQUFDLE1BQU0sQ0FDUCxDQUFDLEdBQUcsQ0FBQyxJQUFJLEtBQUssQ0FBQyxJQUFJLEdBQUcsQ0FBQyxJQUFJLEtBQUssQ0FBQyxDQUFDLElBQUksQ0FBQyxHQUFHLENBQUMsSUFBSSxLQUFLLENBQUMsSUFBSSxHQUFHLENBQUMsSUFBSSxLQUFLLENBQUMsQ0FBQyxFQUN4RSxHQUFHLEVBQUUsQ0FBQyw4REFBOEQ7UUFDaEUsR0FBRyxHQUFHLENBQUMsSUFBSSxRQUFRLEdBQUcsQ0FBQyxJQUFJLEdBQUcsQ0FBQyxDQUFDO0lBRXhDLE1BQU0sT0FBTyxHQUFHLENBQUMsR0FBRyxDQUFDLElBQUksS0FBSyxDQUFDLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQztJQUMzRCxNQUFNLE9BQU8sR0FBRyxDQUFDLEdBQUcsQ0FBQyxJQUFJLEtBQUssQ0FBQyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUM7SUFFM0QsSUFBSSxDQUFDLE1BQU0sQ0FDUCxPQUFPLEtBQUssT0FBTyxFQUNuQixHQUFHLEVBQUUsQ0FBQywrREFBK0Q7UUFDakUsR0FBRyxPQUFPLFFBQVEsT0FBTyxHQUFHLENBQUMsQ0FBQztJQUV0QyxJQUFJLEdBQUcsQ0FBQyxJQUFJLEtBQUssQ0FBQyxJQUFJLEdBQUcsQ0FBQyxJQUFJLEtBQUssQ0FBQyxFQUFFO1FBQ3BDLE1BQU0sSUFBSSxHQUFHLE9BQU8sQ0FBQyxHQUFHLEVBQUUsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDO1FBQ25DLE1BQU0sSUFBSSxHQUFHLE9BQU8sQ0FBQyxHQUFHLEVBQUUsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxDQUFDO1FBQ25DLE1BQU0sSUFBSSxHQUFHLE1BQU0sQ0FBQyxJQUFJLEVBQUUsSUFBSSxDQUFDLENBQUM7UUFDaEMsT0FBTyxPQUFPLENBQUMsSUFBSSxFQUFFLEVBQUUsQ0FBQyxDQUFDO0tBQzFCO1NBQU0sSUFBSSxHQUFHLENBQUMsSUFBSSxLQUFLLENBQUMsSUFBSSxHQUFHLENBQUMsSUFBSSxLQUFLLENBQUMsRUFBRTtRQUMzQyxNQUFNLElBQUksR0FBRyxPQUFPLENBQUMsR0FBRyxFQUFFLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQztRQUNuQyxNQUFNLElBQUksR0FBRyxPQUFPLENBQUMsR0FBRyxFQUFFLENBQUMsR0FBRyxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUMsRUFBRSxHQUFHLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQztRQUN4RCxNQUFNLElBQUksR0FBRyxNQUFNLENBQUMsSUFBSSxFQUFFLElBQUksQ0FBQyxDQUFDO1FBQ2hDLE9BQU8sT0FBTyxDQUFDLElBQUksRUFBRSxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDO0tBQ25DO1NBQU0sSUFBSSxHQUFHLENBQUMsSUFBSSxLQUFLLENBQUMsSUFBSSxHQUFHLENBQUMsSUFBSSxLQUFLLENBQUMsRUFBRTtRQUMzQyxNQUFNLElBQUksR0FBRyxPQUFPLENBQUMsR0FBRyxFQUFFLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsQ0FBQztRQUNuQyxNQUFNLElBQUksR0FBRyxNQUFNLENBQUMsR0FBRyxFQUFFLElBQUksQ0FBQyxDQUFDO1FBQy9CLE9BQU8sT0FBTyxDQUFDLElBQUksRUFBRSxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDO0tBQ25DO1NBQU07UUFDTCxNQUFNLElBQUksR0FBRyxPQUFPLENBQUMsR0FBRyxFQUFFLENBQUMsR0FBRyxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUMsRUFBRSxHQUFHLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQztRQUN4RCxNQUFNLElBQUksR0FBRyxNQUFNLENBQUMsR0FBRyxFQUFFLElBQUksQ0FBQyxDQUFDO1FBQy9CLE9BQU8sSUFBSSxDQUFDO0tBQ2I7QUFDSCxDQUFDO0FBRUQsTUFBTSxDQUFDLE1BQU0sR0FBRyxHQUFHLEVBQUUsQ0FBQyxFQUFDLElBQUksRUFBQyxDQUFDLENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyIvKipcbiAqIEBsaWNlbnNlXG4gKiBDb3B5cmlnaHQgMjAyMCBHb29nbGUgTExDLiBBbGwgUmlnaHRzIFJlc2VydmVkLlxuICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlIFwiTGljZW5zZVwiKTtcbiAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS5cbiAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdFxuICpcbiAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMFxuICpcbiAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmVcbiAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuIFwiQVMgSVNcIiBCQVNJUyxcbiAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLlxuICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZFxuICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuXG4gKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuICovXG5cbmltcG9ydCB7VGVuc29yLH0gZnJvbSAnLi4vdGVuc29yJztcbmltcG9ydCB7Y29udmVydFRvVGVuc29yfSBmcm9tICcuLi90ZW5zb3JfdXRpbF9lbnYnO1xuaW1wb3J0IHtUZW5zb3JMaWtlfSBmcm9tICcuLi90eXBlcyc7XG5pbXBvcnQgKiBhcyB1dGlsIGZyb20gJy4uL3V0aWwnO1xuXG5pbXBvcnQge21hdE11bH0gZnJvbSAnLi9tYXRfbXVsJztcbmltcG9ydCB7b3B9IGZyb20gJy4vb3BlcmF0aW9uJztcbmltcG9ydCB7cmVzaGFwZX0gZnJvbSAnLi9yZXNoYXBlJztcblxuLyoqXG4gKiBDb21wdXRlcyB0aGUgZG90IHByb2R1Y3Qgb2YgdHdvIG1hdHJpY2VzIGFuZC9vciB2ZWN0b3JzLCBgdDFgIGFuZCBgdDJgLlxuICpcbiAqIGBgYGpzXG4gKiBjb25zdCBhID0gdGYudGVuc29yMWQoWzEsIDJdKTtcbiAqIGNvbnN0IGIgPSB0Zi50ZW5zb3IyZChbWzEsIDJdLCBbMywgNF1dKTtcbiAqIGNvbnN0IGMgPSB0Zi50ZW5zb3IyZChbWzEsIDIsIDNdLCBbNCwgNSwgNl1dKTtcbiAqXG4gKiBhLmRvdChiKS5wcmludCgpOyAgLy8gb3IgdGYuZG90KGEsIGIpXG4gKiBiLmRvdChhKS5wcmludCgpO1xuICogYi5kb3QoYykucHJpbnQoKTtcbiAqIGBgYFxuICogQHBhcmFtIHQxIFRoZSBmaXJzdCB0ZW5zb3IgaW4gdGhlIGRvdCBvcGVyYXRpb24uXG4gKiBAcGFyYW0gdDIgVGhlIHNlY29uZCB0ZW5zb3IgaW4gdGhlIGRvdCBvcGVyYXRpb24uXG4gKlxuICogQGRvYyB7aGVhZGluZzogJ09wZXJhdGlvbnMnLCBzdWJoZWFkaW5nOiAnTWF0cmljZXMnfVxuICovXG5mdW5jdGlvbiBkb3RfKHQxOiBUZW5zb3J8VGVuc29yTGlrZSwgdDI6IFRlbnNvcnxUZW5zb3JMaWtlKTogVGVuc29yIHtcbiAgY29uc3QgJHQxID0gY29udmVydFRvVGVuc29yKHQxLCAndDEnLCAnZG90Jyk7XG4gIGNvbnN0ICR0MiA9IGNvbnZlcnRUb1RlbnNvcih0MiwgJ3QyJywgJ2RvdCcpO1xuXG4gIHV0aWwuYXNzZXJ0KFxuICAgICAgKCR0MS5yYW5rID09PSAxIHx8ICR0MS5yYW5rID09PSAyKSAmJiAoJHQyLnJhbmsgPT09IDEgfHwgJHQyLnJhbmsgPT09IDIpLFxuICAgICAgKCkgPT4gYEVycm9yIGluIGRvdDogaW5wdXRzIG11c3QgYWxsIGJlIHJhbmsgMSBvciAyLCBidXQgZ290IHJhbmtzIGAgK1xuICAgICAgICAgIGAkeyR0MS5yYW5rfSBhbmQgJHskdDIucmFua30uYCk7XG5cbiAgY29uc3QgdDFJbm5lciA9ICgkdDEucmFuayA9PT0gMSA/ICR0MS5zaXplIDogJHQxLnNoYXBlWzFdKTtcbiAgY29uc3QgdDJJbm5lciA9ICgkdDIucmFuayA9PT0gMSA/ICR0Mi5zaXplIDogJHQyLnNoYXBlWzBdKTtcblxuICB1dGlsLmFzc2VydChcbiAgICAgIHQxSW5uZXIgPT09IHQySW5uZXIsXG4gICAgICAoKSA9PiBgRXJyb3IgaW4gZG90OiBpbm5lciBkaW1lbnNpb25zIG9mIGlucHV0cyBtdXN0IG1hdGNoLCBidXQgZ290IGAgK1xuICAgICAgICAgIGAke3QxSW5uZXJ9IGFuZCAke3QySW5uZXJ9LmApO1xuXG4gIGlmICgkdDEucmFuayA9PT0gMSAmJiAkdDIucmFuayA9PT0gMSkge1xuICAgIGNvbnN0IHQxMkQgPSByZXNoYXBlKCR0MSwgWzEsIC0xXSk7XG4gICAgY29uc3QgdDIyRCA9IHJlc2hhcGUoJHQyLCBbLTEsIDFdKTtcbiAgICBjb25zdCB0MXQyID0gbWF0TXVsKHQxMkQsIHQyMkQpO1xuICAgIHJldHVybiByZXNoYXBlKHQxdDIsIFtdKTtcbiAgfSBlbHNlIGlmICgkdDEucmFuayA9PT0gMSAmJiAkdDIucmFuayA9PT0gMikge1xuICAgIGNvbnN0IHQxMkQgPSByZXNoYXBlKCR0MSwgWzEsIC0xXSk7XG4gICAgY29uc3QgdDIyRCA9IHJlc2hhcGUoJHQyLCBbJHQyLnNoYXBlWzBdLCAkdDIuc2hhcGVbMV1dKTtcbiAgICBjb25zdCB0MXQyID0gbWF0TXVsKHQxMkQsIHQyMkQpO1xuICAgIHJldHVybiByZXNoYXBlKHQxdDIsIFt0MXQyLnNpemVdKTtcbiAgfSBlbHNlIGlmICgkdDEucmFuayA9PT0gMiAmJiAkdDIucmFuayA9PT0gMSkge1xuICAgIGNvbnN0IHQyMkQgPSByZXNoYXBlKCR0MiwgWy0xLCAxXSk7XG4gICAgY29uc3QgdDF0MiA9IG1hdE11bCgkdDEsIHQyMkQpO1xuICAgIHJldHVybiByZXNoYXBlKHQxdDIsIFt0MXQyLnNpemVdKTtcbiAgfSBlbHNlIHtcbiAgICBjb25zdCB0MjJEID0gcmVzaGFwZSgkdDIsIFskdDIuc2hhcGVbMF0sICR0Mi5zaGFwZVsxXV0pO1xuICAgIGNvbnN0IHQxdDIgPSBtYXRNdWwoJHQxLCB0MjJEKTtcbiAgICByZXR1cm4gdDF0MjtcbiAgfVxufVxuXG5leHBvcnQgY29uc3QgZG90ID0gb3Aoe2RvdF99KTtcbiJdfQ==","/**\n * @license\n * Copyright 2020 Google LLC. All Rights Reserved.\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n * =============================================================================\n */\nimport { ENGINE } from '../engine';\nimport { Elu } from '../kernel_names';\nimport { convertToTensor } from '../tensor_util_env';\nimport { op } from './operation';\n/**\n * Computes exponential linear element-wise: `x > 0 ? x : (e ^ x) - 1`.\n *\n * ```js\n * const x = tf.tensor1d([-1, 1, -3, 2]);\n *\n * x.elu().print(); // or tf.elu(x)\n * ```\n * @param x The input tensor.\n *\n * @doc {heading: 'Operations', subheading: 'Basic math'}\n */\nfunction elu_(x) {\n const $x = convertToTensor(x, 'x', 'elu', 'float32');\n const inputs = { x: $x };\n return ENGINE.runKernel(Elu, inputs);\n}\nexport const elu = op({ elu_ });\n//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZWx1LmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vLi4vdGZqcy1jb3JlL3NyYy9vcHMvZWx1LnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBOzs7Ozs7Ozs7Ozs7Ozs7R0FlRztBQUVILE9BQU8sRUFBQyxNQUFNLEVBQUMsTUFBTSxXQUFXLENBQUM7QUFDakMsT0FBTyxFQUFDLEdBQUcsRUFBWSxNQUFNLGlCQUFpQixDQUFDO0FBRy9DLE9BQU8sRUFBQyxlQUFlLEVBQUMsTUFBTSxvQkFBb0IsQ0FBQztBQUduRCxPQUFPLEVBQUMsRUFBRSxFQUFDLE1BQU0sYUFBYSxDQUFDO0FBRS9COzs7Ozs7Ozs7OztHQVdHO0FBQ0gsU0FBUyxJQUFJLENBQW1CLENBQWU7SUFDN0MsTUFBTSxFQUFFLEdBQUcsZUFBZSxDQUFDLENBQUMsRUFBRSxHQUFHLEVBQUUsS0FBSyxFQUFFLFNBQVMsQ0FBQyxDQUFDO0lBRXJELE1BQU0sTUFBTSxHQUFjLEVBQUMsQ0FBQyxFQUFFLEVBQUUsRUFBQyxDQUFDO0lBRWxDLE9BQU8sTUFBTSxDQUFDLFNBQVMsQ0FBQyxHQUFHLEVBQUUsTUFBOEIsQ0FBQyxDQUFDO0FBQy9ELENBQUM7QUFFRCxNQUFNLENBQUMsTUFBTSxHQUFHLEdBQUcsRUFBRSxDQUFDLEVBQUMsSUFBSSxFQUFDLENBQUMsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbIi8qKlxuICogQGxpY2Vuc2VcbiAqIENvcHlyaWdodCAyMDIwIEdvb2dsZSBMTEMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuXG4gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgXCJMaWNlbnNlXCIpO1xuICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLlxuICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0XG4gKlxuICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wXG4gKlxuICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZVxuICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gXCJBUyBJU1wiIEJBU0lTLFxuICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuXG4gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kXG4gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS5cbiAqID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4gKi9cblxuaW1wb3J0IHtFTkdJTkV9IGZyb20gJy4uL2VuZ2luZSc7XG5pbXBvcnQge0VsdSwgRWx1SW5wdXRzfSBmcm9tICcuLi9rZXJuZWxfbmFtZXMnO1xuaW1wb3J0IHtUZW5zb3J9IGZyb20gJy4uL3RlbnNvcic7XG5pbXBvcnQge05hbWVkVGVuc29yTWFwfSBmcm9tICcuLi90ZW5zb3JfdHlwZXMnO1xuaW1wb3J0IHtjb252ZXJ0VG9UZW5zb3J9IGZyb20gJy4uL3RlbnNvcl91dGlsX2Vudic7XG5pbXBvcnQge1RlbnNvckxpa2V9IGZyb20gJy4uL3R5cGVzJztcblxuaW1wb3J0IHtvcH0gZnJvbSAnLi9vcGVyYXRpb24nO1xuXG4vKipcbiAqIENvbXB1dGVzIGV4cG9uZW50aWFsIGxpbmVhciBlbGVtZW50LXdpc2U6IGB4ID4gMCA/IHggOiAoZSBeIHgpIC0gMWAuXG4gKlxuICogYGBganNcbiAqIGNvbnN0IHggPSB0Zi50ZW5zb3IxZChbLTEsIDEsIC0zLCAyXSk7XG4gKlxuICogeC5lbHUoKS5wcmludCgpOyAgLy8gb3IgdGYuZWx1KHgpXG4gKiBgYGBcbiAqIEBwYXJhbSB4IFRoZSBpbnB1dCB0ZW5zb3IuXG4gKlxuICogQGRvYyB7aGVhZGluZzogJ09wZXJhdGlvbnMnLCBzdWJoZWFkaW5nOiAnQmFzaWMgbWF0aCd9XG4gKi9cbmZ1bmN0aW9uIGVsdV88VCBleHRlbmRzIFRlbnNvcj4oeDogVHxUZW5zb3JMaWtlKTogVCB7XG4gIGNvbnN0ICR4ID0gY29udmVydFRvVGVuc29yKHgsICd4JywgJ2VsdScsICdmbG9hdDMyJyk7XG5cbiAgY29uc3QgaW5wdXRzOiBFbHVJbnB1dHMgPSB7eDogJHh9O1xuXG4gIHJldHVybiBFTkdJTkUucnVuS2VybmVsKEVsdSwgaW5wdXRzIGFzIHt9IGFzIE5hbWVkVGVuc29yTWFwKTtcbn1cblxuZXhwb3J0IGNvbnN0IGVsdSA9IG9wKHtlbHVffSk7XG4iXX0=","/**\n * @license\n * Copyright 2020 Google LLC. All Rights Reserved.\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n * =============================================================================\n */\nimport { ENGINE } from '../engine';\nimport { Equal } from '../kernel_names';\nimport { makeTypesMatch } from '../tensor_util';\nimport { convertToTensor } from '../tensor_util_env';\nimport { assertAndGetBroadcastShape } from './broadcast_util';\nimport { op } from './operation';\n/**\n * Returns the truth value of (a == b) element-wise. Supports broadcasting.\n *\n * ```js\n * const a = tf.tensor1d([1, 2, 3]);\n * const b = tf.tensor1d([2, 2, 2]);\n *\n * a.equal(b).print();\n * ```\n *\n * @param a The first input tensor.\n * @param b The second input tensor. Must have the same dtype as `a`.\n *\n * @doc {heading: 'Operations', subheading: 'Logical'}\n */\nfunction equal_(a, b) {\n let $a = convertToTensor(a, 'a', 'equal', 'string_or_numeric');\n let $b = convertToTensor(b, 'b', 'equal', 'string_or_numeric');\n [$a, $b] = makeTypesMatch($a, $b);\n assertAndGetBroadcastShape($a.shape, $b.shape);\n const inputs = { a: $a, b: $b };\n return ENGINE.runKernel(Equal, inputs);\n}\nexport const equal = op({ equal_ });\n//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZXF1YWwuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi8uLi90ZmpzLWNvcmUvc3JjL29wcy9lcXVhbC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQTs7Ozs7Ozs7Ozs7Ozs7O0dBZUc7QUFDSCxPQUFPLEVBQUMsTUFBTSxFQUFDLE1BQU0sV0FBVyxDQUFDO0FBQ2pDLE9BQU8sRUFBQyxLQUFLLEVBQWMsTUFBTSxpQkFBaUIsQ0FBQztBQUduRCxPQUFPLEVBQUMsY0FBYyxFQUFDLE1BQU0sZ0JBQWdCLENBQUM7QUFDOUMsT0FBTyxFQUFDLGVBQWUsRUFBQyxNQUFNLG9CQUFvQixDQUFDO0FBR25ELE9BQU8sRUFBQywwQkFBMEIsRUFBQyxNQUFNLGtCQUFrQixDQUFDO0FBQzVELE9BQU8sRUFBQyxFQUFFLEVBQUMsTUFBTSxhQUFhLENBQUM7QUFFL0I7Ozs7Ozs7Ozs7Ozs7O0dBY0c7QUFDSCxTQUFTLE1BQU0sQ0FDWCxDQUFvQixFQUFFLENBQW9CO0lBQzVDLElBQUksRUFBRSxHQUFHLGVBQWUsQ0FBQyxDQUFDLEVBQUUsR0FBRyxFQUFFLE9BQU8sRUFBRSxtQkFBbUIsQ0FBQyxDQUFDO0lBQy9ELElBQUksRUFBRSxHQUFHLGVBQWUsQ0FBQyxDQUFDLEVBQUUsR0FBRyxFQUFFLE9BQU8sRUFBRSxtQkFBbUIsQ0FBQyxDQUFDO0lBQy9ELENBQUMsRUFBRSxFQUFFLEVBQUUsQ0FBQyxHQUFHLGNBQWMsQ0FBQyxFQUFFLEVBQUUsRUFBRSxDQUFDLENBQUM7SUFFbEMsMEJBQTBCLENBQUMsRUFBRSxDQUFDLEtBQUssRUFBRSxFQUFFLENBQUMsS0FBSyxDQUFDLENBQUM7SUFFL0MsTUFBTSxNQUFNLEdBQWdCLEVBQUMsQ0FBQyxFQUFFLEVBQUUsRUFBRSxDQUFDLEVBQUUsRUFBRSxFQUFDLENBQUM7SUFFM0MsT0FBTyxNQUFNLENBQUMsU0FBUyxDQUFDLEtBQUssRUFBRSxNQUE4QixDQUFDLENBQUM7QUFDakUsQ0FBQztBQUVELE1BQU0sQ0FBQyxNQUFNLEtBQUssR0FBRyxFQUFFLENBQUMsRUFBQyxNQUFNLEVBQUMsQ0FBQyxDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiLyoqXG4gKiBAbGljZW5zZVxuICogQ29weXJpZ2h0IDIwMjAgR29vZ2xlIExMQy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC5cbiAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSBcIkxpY2Vuc2VcIik7XG4gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuXG4gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXRcbiAqXG4gKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjBcbiAqXG4gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlXG4gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiBcIkFTIElTXCIgQkFTSVMsXG4gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC5cbiAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmRcbiAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLlxuICogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbiAqL1xuaW1wb3J0IHtFTkdJTkV9IGZyb20gJy4uL2VuZ2luZSc7XG5pbXBvcnQge0VxdWFsLCBFcXVhbElucHV0c30gZnJvbSAnLi4va2VybmVsX25hbWVzJztcbmltcG9ydCB7VGVuc29yfSBmcm9tICcuLi90ZW5zb3InO1xuaW1wb3J0IHtOYW1lZFRlbnNvck1hcH0gZnJvbSAnLi4vdGVuc29yX3R5cGVzJztcbmltcG9ydCB7bWFrZVR5cGVzTWF0Y2h9IGZyb20gJy4uL3RlbnNvcl91dGlsJztcbmltcG9ydCB7Y29udmVydFRvVGVuc29yfSBmcm9tICcuLi90ZW5zb3JfdXRpbF9lbnYnO1xuaW1wb3J0IHtUZW5zb3JMaWtlfSBmcm9tICcuLi90eXBlcyc7XG5cbmltcG9ydCB7YXNzZXJ0QW5kR2V0QnJvYWRjYXN0U2hhcGV9IGZyb20gJy4vYnJvYWRjYXN0X3V0aWwnO1xuaW1wb3J0IHtvcH0gZnJvbSAnLi9vcGVyYXRpb24nO1xuXG4vKipcbiAqIFJldHVybnMgdGhlIHRydXRoIHZhbHVlIG9mIChhID09IGIpIGVsZW1lbnQtd2lzZS4gU3VwcG9ydHMgYnJvYWRjYXN0aW5nLlxuICpcbiAqIGBgYGpzXG4gKiBjb25zdCBhID0gdGYudGVuc29yMWQoWzEsIDIsIDNdKTtcbiAqIGNvbnN0IGIgPSB0Zi50ZW5zb3IxZChbMiwgMiwgMl0pO1xuICpcbiAqIGEuZXF1YWwoYikucHJpbnQoKTtcbiAqIGBgYFxuICpcbiAqIEBwYXJhbSBhIFRoZSBmaXJzdCBpbnB1dCB0ZW5zb3IuXG4gKiBAcGFyYW0gYiBUaGUgc2Vjb25kIGlucHV0IHRlbnNvci4gTXVzdCBoYXZlIHRoZSBzYW1lIGR0eXBlIGFzIGBhYC5cbiAqXG4gKiBAZG9jIHtoZWFkaW5nOiAnT3BlcmF0aW9ucycsIHN1YmhlYWRpbmc6ICdMb2dpY2FsJ31cbiAqL1xuZnVuY3Rpb24gZXF1YWxfPFQgZXh0ZW5kcyBUZW5zb3I+KFxuICAgIGE6IFRlbnNvcnxUZW5zb3JMaWtlLCBiOiBUZW5zb3J8VGVuc29yTGlrZSk6IFQge1xuICBsZXQgJGEgPSBjb252ZXJ0VG9UZW5zb3IoYSwgJ2EnLCAnZXF1YWwnLCAnc3RyaW5nX29yX251bWVyaWMnKTtcbiAgbGV0ICRiID0gY29udmVydFRvVGVuc29yKGIsICdiJywgJ2VxdWFsJywgJ3N0cmluZ19vcl9udW1lcmljJyk7XG4gIFskYSwgJGJdID0gbWFrZVR5cGVzTWF0Y2goJGEsICRiKTtcblxuICBhc3NlcnRBbmRHZXRCcm9hZGNhc3RTaGFwZSgkYS5zaGFwZSwgJGIuc2hhcGUpO1xuXG4gIGNvbnN0IGlucHV0czogRXF1YWxJbnB1dHMgPSB7YTogJGEsIGI6ICRifTtcblxuICByZXR1cm4gRU5HSU5FLnJ1bktlcm5lbChFcXVhbCwgaW5wdXRzIGFzIHt9IGFzIE5hbWVkVGVuc29yTWFwKTtcbn1cblxuZXhwb3J0IGNvbnN0IGVxdWFsID0gb3Aoe2VxdWFsX30pO1xuIl19","/**\n * @license\n * Copyright 2018 Google LLC. All Rights Reserved.\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n * =============================================================================\n */\nimport { ENGINE } from '../engine';\nimport { Erf } from '../kernel_names';\nimport { convertToTensor } from '../tensor_util_env';\nimport * as util from '../util';\nimport { cast } from './cast';\nimport { op } from './operation';\n/**\n * Computes Gauss error function of the input `tf.Tensor` element-wise:\n * `erf(x)`\n *\n * ```js\n * const x = tf.tensor1d([0, .1, -.1, .7]);\n *\n * x.erf().print(); // or tf.erf(x);\n * ```\n * @param x The input tensor.\n *\n * @doc {heading: 'Operations', subheading: 'Basic math'}\n */\nfunction erf_(x) {\n let $x = convertToTensor(x, 'x', 'erf');\n util.assert($x.dtype === 'int32' || $x.dtype === 'float32', () => 'Input dtype must be `int32` or `float32`.');\n if ($x.dtype === 'int32') {\n $x = cast($x, 'float32');\n }\n const inputs = { x: $x };\n return ENGINE.runKernel(Erf, inputs);\n}\nexport const erf = op({ erf_ });\n//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZXJmLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vLi4vdGZqcy1jb3JlL3NyYy9vcHMvZXJmLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBOzs7Ozs7Ozs7Ozs7Ozs7R0FlRztBQUVILE9BQU8sRUFBQyxNQUFNLEVBQUMsTUFBTSxXQUFXLENBQUM7QUFDakMsT0FBTyxFQUFDLEdBQUcsRUFBWSxNQUFNLGlCQUFpQixDQUFDO0FBRy9DLE9BQU8sRUFBQyxlQUFlLEVBQUMsTUFBTSxvQkFBb0IsQ0FBQztBQUVuRCxPQUFPLEtBQUssSUFBSSxNQUFNLFNBQVMsQ0FBQztBQUVoQyxPQUFPLEVBQUMsSUFBSSxFQUFDLE1BQU0sUUFBUSxDQUFDO0FBQzVCLE9BQU8sRUFBQyxFQUFFLEVBQUMsTUFBTSxhQUFhLENBQUM7QUFFL0I7Ozs7Ozs7Ozs7OztHQVlHO0FBQ0gsU0FBUyxJQUFJLENBQW1CLENBQWU7SUFDN0MsSUFBSSxFQUFFLEdBQUcsZUFBZSxDQUFDLENBQUMsRUFBRSxHQUFHLEVBQUUsS0FBSyxDQUFDLENBQUM7SUFDeEMsSUFBSSxDQUFDLE1BQU0sQ0FDUCxFQUFFLENBQUMsS0FBSyxLQUFLLE9BQU8sSUFBSSxFQUFFLENBQUMsS0FBSyxLQUFLLFNBQVMsRUFDOUMsR0FBRyxFQUFFLENBQUMsMkNBQTJDLENBQUMsQ0FBQztJQUV2RCxJQUFJLEVBQUUsQ0FBQyxLQUFLLEtBQUssT0FBTyxFQUFFO1FBQ3hCLEVBQUUsR0FBRyxJQUFJLENBQUMsRUFBRSxFQUFFLFNBQVMsQ0FBQyxDQUFDO0tBQzFCO0lBRUQsTUFBTSxNQUFNLEdBQWMsRUFBQyxDQUFDLEVBQUUsRUFBRSxFQUFDLENBQUM7SUFDbEMsT0FBTyxNQUFNLENBQUMsU0FBUyxDQUFDLEdBQUcsRUFBRSxNQUE4QixDQUFDLENBQUM7QUFDL0QsQ0FBQztBQUNELE1BQU0sQ0FBQyxNQUFNLEdBQUcsR0FBRyxFQUFFLENBQUMsRUFBQyxJQUFJLEVBQUMsQ0FBQyxDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiLyoqXG4gKiBAbGljZW5zZVxuICogQ29weXJpZ2h0IDIwMTggR29vZ2xlIExMQy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC5cbiAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSBcIkxpY2Vuc2VcIik7XG4gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuXG4gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXRcbiAqXG4gKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjBcbiAqXG4gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlXG4gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiBcIkFTIElTXCIgQkFTSVMsXG4gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC5cbiAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmRcbiAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLlxuICogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbiAqL1xuXG5pbXBvcnQge0VOR0lORX0gZnJvbSAnLi4vZW5naW5lJztcbmltcG9ydCB7RXJmLCBFcmZJbnB1dHN9IGZyb20gJy4uL2tlcm5lbF9uYW1lcyc7XG5pbXBvcnQge1RlbnNvcn0gZnJvbSAnLi4vdGVuc29yJztcbmltcG9ydCB7TmFtZWRUZW5zb3JNYXB9IGZyb20gJy4uL3RlbnNvcl90eXBlcyc7XG5pbXBvcnQge2NvbnZlcnRUb1RlbnNvcn0gZnJvbSAnLi4vdGVuc29yX3V0aWxfZW52JztcbmltcG9ydCB7VGVuc29yTGlrZX0gZnJvbSAnLi4vdHlwZXMnO1xuaW1wb3J0ICogYXMgdXRpbCBmcm9tICcuLi91dGlsJztcblxuaW1wb3J0IHtjYXN0fSBmcm9tICcuL2Nhc3QnO1xuaW1wb3J0IHtvcH0gZnJvbSAnLi9vcGVyYXRpb24nO1xuXG4vKipcbiAqIENvbXB1dGVzIEdhdXNzIGVycm9yIGZ1bmN0aW9uIG9mIHRoZSBpbnB1dCBgdGYuVGVuc29yYCBlbGVtZW50LXdpc2U6XG4gKiBgZXJmKHgpYFxuICpcbiAqIGBgYGpzXG4gKiBjb25zdCB4ID0gdGYudGVuc29yMWQoWzAsIC4xLCAtLjEsIC43XSk7XG4gKlxuICogeC5lcmYoKS5wcmludCgpOyAvLyBvciB0Zi5lcmYoeCk7XG4gKiBgYGBcbiAqIEBwYXJhbSB4IFRoZSBpbnB1dCB0ZW5zb3IuXG4gKlxuICogQGRvYyB7aGVhZGluZzogJ09wZXJhdGlvbnMnLCBzdWJoZWFkaW5nOiAnQmFzaWMgbWF0aCd9XG4gKi9cbmZ1bmN0aW9uIGVyZl88VCBleHRlbmRzIFRlbnNvcj4oeDogVHxUZW5zb3JMaWtlKTogVCB7XG4gIGxldCAkeCA9IGNvbnZlcnRUb1RlbnNvcih4LCAneCcsICdlcmYnKTtcbiAgdXRpbC5hc3NlcnQoXG4gICAgICAkeC5kdHlwZSA9PT0gJ2ludDMyJyB8fCAkeC5kdHlwZSA9PT0gJ2Zsb2F0MzInLFxuICAgICAgKCkgPT4gJ0lucHV0IGR0eXBlIG11c3QgYmUgYGludDMyYCBvciBgZmxvYXQzMmAuJyk7XG5cbiAgaWYgKCR4LmR0eXBlID09PSAnaW50MzInKSB7XG4gICAgJHggPSBjYXN0KCR4LCAnZmxvYXQzMicpO1xuICB9XG5cbiAgY29uc3QgaW5wdXRzOiBFcmZJbnB1dHMgPSB7eDogJHh9O1xuICByZXR1cm4gRU5HSU5FLnJ1bktlcm5lbChFcmYsIGlucHV0cyBhcyB7fSBhcyBOYW1lZFRlbnNvck1hcCk7XG59XG5leHBvcnQgY29uc3QgZXJmID0gb3Aoe2VyZl99KTtcbiJdfQ==","/**\n * @license\n * Copyright 2022 Google LLC. All Rights Reserved.\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n * =============================================================================\n */\nimport { norm } from './norm';\nimport { op } from './operation';\n/**\n * Computes the Euclidean norm of scalar, vectors, and matrices.\n *\n * ```js\n * const x = tf.tensor1d([1, 2, 3, 4]);\n *\n * x.euclideanNorm().print(); // or tf.euclideanNorm(x)\n * ```\n *\n * @param x The input array.\n * @param axis Optional. If axis is null (the default), the input is\n * considered a vector and a single vector norm is computed over the entire\n * set of values in the Tensor, i.e. euclideanNorm(x) is equivalent\n * to euclideanNorm(x.reshape([-1])). If axis is an integer, the input\n * is considered a batch of vectors, and axis determines the axis in x\n * over which to compute vector norms. If axis is a 2-tuple of integer it is\n * considered a batch of matrices and axis determines the axes in NDArray\n * over which to compute a matrix norm.\n * @param keepDims Optional. If true, the norm has the same dimensionality\n * as the input.\n *\n * @doc {heading: 'Operations', subheading: 'Matrices'}\n */\nfunction euclideanNorm_(x, axis = null, keepDims = false) {\n return norm(x, 'euclidean', axis, keepDims);\n}\nexport const euclideanNorm = op({ euclideanNorm_ });\n//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZXVjbGlkZWFuX25vcm0uanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi8uLi90ZmpzLWNvcmUvc3JjL29wcy9ldWNsaWRlYW5fbm9ybS50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQTs7Ozs7Ozs7Ozs7Ozs7O0dBZUc7QUFLSCxPQUFPLEVBQUMsSUFBSSxFQUFDLE1BQU0sUUFBUSxDQUFDO0FBQzVCLE9BQU8sRUFBQyxFQUFFLEVBQUMsTUFBTSxhQUFhLENBQUM7QUFFL0I7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7R0FzQkc7QUFDSCxTQUFTLGNBQWMsQ0FDbkIsQ0FBb0IsRUFBRSxPQUF3QixJQUFJLEVBQ2xELFFBQVEsR0FBRyxLQUFLO0lBQ2xCLE9BQU8sSUFBSSxDQUFDLENBQUMsRUFBRSxXQUFXLEVBQUUsSUFBSSxFQUFFLFFBQVEsQ0FBQyxDQUFDO0FBQzlDLENBQUM7QUFFRCxNQUFNLENBQUMsTUFBTSxhQUFhLEdBQUcsRUFBRSxDQUFDLEVBQUMsY0FBYyxFQUFDLENBQUMsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbIi8qKlxuICogQGxpY2Vuc2VcbiAqIENvcHlyaWdodCAyMDIyIEdvb2dsZSBMTEMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuXG4gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgXCJMaWNlbnNlXCIpO1xuICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLlxuICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0XG4gKlxuICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wXG4gKlxuICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZVxuICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gXCJBUyBJU1wiIEJBU0lTLFxuICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuXG4gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kXG4gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS5cbiAqID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4gKi9cblxuaW1wb3J0IHtUZW5zb3J9IGZyb20gJy4uL3RlbnNvcic7XG5pbXBvcnQge1RlbnNvckxpa2V9IGZyb20gJy4uL3R5cGVzJztcblxuaW1wb3J0IHtub3JtfSBmcm9tICcuL25vcm0nO1xuaW1wb3J0IHtvcH0gZnJvbSAnLi9vcGVyYXRpb24nO1xuXG4vKipcbiAqIENvbXB1dGVzIHRoZSBFdWNsaWRlYW4gbm9ybSBvZiBzY2FsYXIsIHZlY3RvcnMsIGFuZCBtYXRyaWNlcy5cbiAqXG4gKiBgYGBqc1xuICogY29uc3QgeCA9IHRmLnRlbnNvcjFkKFsxLCAyLCAzLCA0XSk7XG4gKlxuICogeC5ldWNsaWRlYW5Ob3JtKCkucHJpbnQoKTsgIC8vIG9yIHRmLmV1Y2xpZGVhbk5vcm0oeClcbiAqIGBgYFxuICpcbiAqIEBwYXJhbSB4IFRoZSBpbnB1dCBhcnJheS5cbiAqIEBwYXJhbSBheGlzIE9wdGlvbmFsLiBJZiBheGlzIGlzIG51bGwgKHRoZSBkZWZhdWx0KSwgdGhlIGlucHV0IGlzXG4gKiBjb25zaWRlcmVkIGEgdmVjdG9yIGFuZCBhIHNpbmdsZSB2ZWN0b3Igbm9ybSBpcyBjb21wdXRlZCBvdmVyIHRoZSBlbnRpcmVcbiAqIHNldCBvZiB2YWx1ZXMgaW4gdGhlIFRlbnNvciwgaS5lLiBldWNsaWRlYW5Ob3JtKHgpIGlzIGVxdWl2YWxlbnRcbiAqIHRvIGV1Y2xpZGVhbk5vcm0oeC5yZXNoYXBlKFstMV0pKS4gSWYgYXhpcyBpcyBhbiBpbnRlZ2VyLCB0aGUgaW5wdXRcbiAqIGlzIGNvbnNpZGVyZWQgYSBiYXRjaCBvZiB2ZWN0b3JzLCBhbmQgYXhpcyBkZXRlcm1pbmVzIHRoZSBheGlzIGluIHhcbiAqIG92ZXIgd2hpY2ggdG8gY29tcHV0ZSB2ZWN0b3Igbm9ybXMuIElmIGF4aXMgaXMgYSAyLXR1cGxlIG9mIGludGVnZXIgaXQgaXNcbiAqIGNvbnNpZGVyZWQgYSBiYXRjaCBvZiBtYXRyaWNlcyBhbmQgYXhpcyBkZXRlcm1pbmVzIHRoZSBheGVzIGluIE5EQXJyYXlcbiAqIG92ZXIgd2hpY2ggdG8gY29tcHV0ZSBhIG1hdHJpeCBub3JtLlxuICogQHBhcmFtIGtlZXBEaW1zIE9wdGlvbmFsLiBJZiB0cnVlLCB0aGUgbm9ybSBoYXMgdGhlIHNhbWUgZGltZW5zaW9uYWxpdHlcbiAqIGFzIHRoZSBpbnB1dC5cbiAqXG4gKiBAZG9jIHtoZWFkaW5nOiAnT3BlcmF0aW9ucycsIHN1YmhlYWRpbmc6ICdNYXRyaWNlcyd9XG4gKi9cbmZ1bmN0aW9uIGV1Y2xpZGVhbk5vcm1fKFxuICAgIHg6IFRlbnNvcnxUZW5zb3JMaWtlLCBheGlzOiBudW1iZXJ8bnVtYmVyW10gPSBudWxsLFxuICAgIGtlZXBEaW1zID0gZmFsc2UpOiBUZW5zb3Ige1xuICByZXR1cm4gbm9ybSh4LCAnZXVjbGlkZWFuJywgYXhpcywga2VlcERpbXMpO1xufVxuXG5leHBvcnQgY29uc3QgZXVjbGlkZWFuTm9ybSA9IG9wKHtldWNsaWRlYW5Ob3JtX30pO1xuIl19","/**\n * @license\n * Copyright 2018 Google LLC. All Rights Reserved.\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n * =============================================================================\n */\nimport { ENGINE } from '../engine';\nimport { Exp } from '../kernel_names';\nimport { convertToTensor } from '../tensor_util_env';\nimport { op } from './operation';\n/**\n * Computes exponential of the input `tf.Tensor` element-wise. `e ^ x`\n *\n * ```js\n * const x = tf.tensor1d([1, 2, -3]);\n *\n * x.exp().print(); // or tf.exp(x)\n * ```\n * @param x The input tensor.\n *\n * @doc {heading: 'Operations', subheading: 'Basic math'}\n */\nfunction exp_(x) {\n const $x = convertToTensor(x, 'x', 'exp');\n const inputs = { x: $x };\n return ENGINE.runKernel(Exp, inputs);\n}\nexport const exp = op({ exp_ });\n//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZXhwLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vLi4vdGZqcy1jb3JlL3NyYy9vcHMvZXhwLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBOzs7Ozs7Ozs7Ozs7Ozs7R0FlRztBQUVILE9BQU8sRUFBQyxNQUFNLEVBQUMsTUFBTSxXQUFXLENBQUM7QUFDakMsT0FBTyxFQUFDLEdBQUcsRUFBWSxNQUFNLGlCQUFpQixDQUFDO0FBRy9DLE9BQU8sRUFBQyxlQUFlLEVBQUMsTUFBTSxvQkFBb0IsQ0FBQztBQUduRCxPQUFPLEVBQUMsRUFBRSxFQUFDLE1BQU0sYUFBYSxDQUFDO0FBRS9COzs7Ozs7Ozs7OztHQVdHO0FBQ0gsU0FBUyxJQUFJLENBQW1CLENBQWU7SUFDN0MsTUFBTSxFQUFFLEdBQUcsZUFBZSxDQUFDLENBQUMsRUFBRSxHQUFHLEVBQUUsS0FBSyxDQUFDLENBQUM7SUFFMUMsTUFBTSxNQUFNLEdBQWMsRUFBQyxDQUFDLEVBQUUsRUFBRSxFQUFDLENBQUM7SUFDbEMsT0FBTyxNQUFNLENBQUMsU0FBUyxDQUFDLEdBQUcsRUFBRSxNQUE4QixDQUFDLENBQUM7QUFDL0QsQ0FBQztBQUNELE1BQU0sQ0FBQyxNQUFNLEdBQUcsR0FBRyxFQUFFLENBQUMsRUFBQyxJQUFJLEVBQUMsQ0FBQyxDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiLyoqXG4gKiBAbGljZW5zZVxuICogQ29weXJpZ2h0IDIwMTggR29vZ2xlIExMQy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC5cbiAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSBcIkxpY2Vuc2VcIik7XG4gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuXG4gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXRcbiAqXG4gKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjBcbiAqXG4gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlXG4gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiBcIkFTIElTXCIgQkFTSVMsXG4gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC5cbiAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmRcbiAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLlxuICogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbiAqL1xuXG5pbXBvcnQge0VOR0lORX0gZnJvbSAnLi4vZW5naW5lJztcbmltcG9ydCB7RXhwLCBFeHBJbnB1dHN9IGZyb20gJy4uL2tlcm5lbF9uYW1lcyc7XG5pbXBvcnQge1RlbnNvcn0gZnJvbSAnLi4vdGVuc29yJztcbmltcG9ydCB7TmFtZWRUZW5zb3JNYXB9IGZyb20gJy4uL3RlbnNvcl90eXBlcyc7XG5pbXBvcnQge2NvbnZlcnRUb1RlbnNvcn0gZnJvbSAnLi4vdGVuc29yX3V0aWxfZW52JztcbmltcG9ydCB7VGVuc29yTGlrZX0gZnJvbSAnLi4vdHlwZXMnO1xuXG5pbXBvcnQge29wfSBmcm9tICcuL29wZXJhdGlvbic7XG5cbi8qKlxuICogQ29tcHV0ZXMgZXhwb25lbnRpYWwgb2YgdGhlIGlucHV0IGB0Zi5UZW5zb3JgIGVsZW1lbnQtd2lzZS4gYGUgXiB4YFxuICpcbiAqIGBgYGpzXG4gKiBjb25zdCB4ID0gdGYudGVuc29yMWQoWzEsIDIsIC0zXSk7XG4gKlxuICogeC5leHAoKS5wcmludCgpOyAgLy8gb3IgdGYuZXhwKHgpXG4gKiBgYGBcbiAqIEBwYXJhbSB4IFRoZSBpbnB1dCB0ZW5zb3IuXG4gKlxuICogQGRvYyB7aGVhZGluZzogJ09wZXJhdGlvbnMnLCBzdWJoZWFkaW5nOiAnQmFzaWMgbWF0aCd9XG4gKi9cbmZ1bmN0aW9uIGV4cF88VCBleHRlbmRzIFRlbnNvcj4oeDogVHxUZW5zb3JMaWtlKTogVCB7XG4gIGNvbnN0ICR4ID0gY29udmVydFRvVGVuc29yKHgsICd4JywgJ2V4cCcpO1xuXG4gIGNvbnN0IGlucHV0czogRXhwSW5wdXRzID0ge3g6ICR4fTtcbiAgcmV0dXJuIEVOR0lORS5ydW5LZXJuZWwoRXhwLCBpbnB1dHMgYXMge30gYXMgTmFtZWRUZW5zb3JNYXApO1xufVxuZXhwb3J0IGNvbnN0IGV4cCA9IG9wKHtleHBffSk7XG4iXX0=","/**\n * @license\n * Copyright 2020 Google LLC. All Rights Reserved.\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n * =============================================================================\n */\nimport { ENGINE } from '../engine';\nimport { ExpandDims } from '../kernel_names';\nimport { convertToTensor } from '../tensor_util_env';\nimport * as util from '../util';\nimport { op } from './operation';\n/**\n * Returns a `tf.Tensor` that has expanded rank, by inserting a dimension\n * into the tensor's shape.\n *\n * ```js\n * const x = tf.tensor1d([1, 2, 3, 4]);\n * const axis = 1;\n * x.expandDims(axis).print();\n * ```\n *\n * @param x The input tensor whose dimensions are to be expanded.\n * @param axis The dimension index at which to insert shape of `1`. Defaults\n * to 0 (the first dimension).\n *\n * @doc {heading: 'Tensors', subheading: 'Transformations'}\n */\nfunction expandDims_(x, axis = 0) {\n const $x = convertToTensor(x, 'x', 'expandDims', 'string_or_numeric');\n util.assert(axis <= $x.rank, () => 'Axis must be <= rank of the tensor');\n const inputs = { input: $x };\n const attrs = { dim: axis };\n return ENGINE.runKernel(ExpandDims, inputs, attrs);\n}\nexport const expandDims = op({ expandDims_ });\n//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZXhwYW5kX2RpbXMuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi8uLi90ZmpzLWNvcmUvc3JjL29wcy9leHBhbmRfZGltcy50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQTs7Ozs7Ozs7Ozs7Ozs7O0dBZUc7QUFFSCxPQUFPLEVBQUMsTUFBTSxFQUFDLE1BQU0sV0FBVyxDQUFDO0FBQ2pDLE9BQU8sRUFBQyxVQUFVLEVBQW9DLE1BQU0saUJBQWlCLENBQUM7QUFJOUUsT0FBTyxFQUFDLGVBQWUsRUFBQyxNQUFNLG9CQUFvQixDQUFDO0FBRW5ELE9BQU8sS0FBSyxJQUFJLE1BQU0sU0FBUyxDQUFDO0FBRWhDLE9BQU8sRUFBQyxFQUFFLEVBQUMsTUFBTSxhQUFhLENBQUM7QUFFL0I7Ozs7Ozs7Ozs7Ozs7OztHQWVHO0FBQ0gsU0FBUyxXQUFXLENBQW1CLENBQW9CLEVBQUUsSUFBSSxHQUFHLENBQUM7SUFDbkUsTUFBTSxFQUFFLEdBQUcsZUFBZSxDQUFDLENBQUMsRUFBRSxHQUFHLEVBQUUsWUFBWSxFQUFFLG1CQUFtQixDQUFDLENBQUM7SUFFdEUsSUFBSSxDQUFDLE1BQU0sQ0FBQyxJQUFJLElBQUksRUFBRSxDQUFDLElBQUksRUFBRSxHQUFHLEVBQUUsQ0FBQyxvQ0FBb0MsQ0FBQyxDQUFDO0lBRXpFLE1BQU0sTUFBTSxHQUFxQixFQUFDLEtBQUssRUFBRSxFQUFFLEVBQUMsQ0FBQztJQUM3QyxNQUFNLEtBQUssR0FBb0IsRUFBQyxHQUFHLEVBQUUsSUFBSSxFQUFDLENBQUM7SUFFM0MsT0FBTyxNQUFNLENBQUMsU0FBUyxDQUNuQixVQUFVLEVBQUUsTUFBOEIsRUFBRSxLQUEyQixDQUFDLENBQUM7QUFDL0UsQ0FBQztBQUVELE1BQU0sQ0FBQyxNQUFNLFVBQVUsR0FBRyxFQUFFLENBQUMsRUFBQyxXQUFXLEVBQUMsQ0FBQyxDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiLyoqXG4gKiBAbGljZW5zZVxuICogQ29weXJpZ2h0IDIwMjAgR29vZ2xlIExMQy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC5cbiAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSBcIkxpY2Vuc2VcIik7XG4gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuXG4gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXRcbiAqXG4gKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjBcbiAqXG4gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlXG4gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiBcIkFTIElTXCIgQkFTSVMsXG4gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC5cbiAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmRcbiAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLlxuICogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbiAqL1xuXG5pbXBvcnQge0VOR0lORX0gZnJvbSAnLi4vZW5naW5lJztcbmltcG9ydCB7RXhwYW5kRGltcywgRXhwYW5kRGltc0F0dHJzLCBFeHBhbmREaW1zSW5wdXRzfSBmcm9tICcuLi9rZXJuZWxfbmFtZXMnO1xuaW1wb3J0IHtOYW1lZEF0dHJNYXB9IGZyb20gJy4uL2tlcm5lbF9yZWdpc3RyeSc7XG5pbXBvcnQge1RlbnNvcn0gZnJvbSAnLi4vdGVuc29yJztcbmltcG9ydCB7TmFtZWRUZW5zb3JNYXB9IGZyb20gJy4uL3RlbnNvcl90eXBlcyc7XG5pbXBvcnQge2NvbnZlcnRUb1RlbnNvcn0gZnJvbSAnLi4vdGVuc29yX3V0aWxfZW52JztcbmltcG9ydCB7VGVuc29yTGlrZX0gZnJvbSAnLi4vdHlwZXMnO1xuaW1wb3J0ICogYXMgdXRpbCBmcm9tICcuLi91dGlsJztcblxuaW1wb3J0IHtvcH0gZnJvbSAnLi9vcGVyYXRpb24nO1xuXG4vKipcbiAqIFJldHVybnMgYSBgdGYuVGVuc29yYCB0aGF0IGhhcyBleHBhbmRlZCByYW5rLCBieSBpbnNlcnRpbmcgYSBkaW1lbnNpb25cbiAqIGludG8gdGhlIHRlbnNvcidzIHNoYXBlLlxuICpcbiAqIGBgYGpzXG4gKiBjb25zdCB4ID0gdGYudGVuc29yMWQoWzEsIDIsIDMsIDRdKTtcbiAqIGNvbnN0IGF4aXMgPSAxO1xuICogeC5leHBhbmREaW1zKGF4aXMpLnByaW50KCk7XG4gKiBgYGBcbiAqXG4gKiBAcGFyYW0geCBUaGUgaW5wdXQgdGVuc29yIHdob3NlIGRpbWVuc2lvbnMgYXJlIHRvIGJlIGV4cGFuZGVkLlxuICogQHBhcmFtIGF4aXMgVGhlIGRpbWVuc2lvbiBpbmRleCBhdCB3aGljaCB0byBpbnNlcnQgc2hhcGUgb2YgYDFgLiBEZWZhdWx0c1xuICogICAgIHRvIDAgKHRoZSBmaXJzdCBkaW1lbnNpb24pLlxuICpcbiAqIEBkb2Mge2hlYWRpbmc6ICdUZW5zb3JzJywgc3ViaGVhZGluZzogJ1RyYW5zZm9ybWF0aW9ucyd9XG4gKi9cbmZ1bmN0aW9uIGV4cGFuZERpbXNfPFQgZXh0ZW5kcyBUZW5zb3I+KHg6IFRlbnNvcnxUZW5zb3JMaWtlLCBheGlzID0gMCk6IFQge1xuICBjb25zdCAkeCA9IGNvbnZlcnRUb1RlbnNvcih4LCAneCcsICdleHBhbmREaW1zJywgJ3N0cmluZ19vcl9udW1lcmljJyk7XG5cbiAgdXRpbC5hc3NlcnQoYXhpcyA8PSAkeC5yYW5rLCAoKSA9PiAnQXhpcyBtdXN0IGJlIDw9IHJhbmsgb2YgdGhlIHRlbnNvcicpO1xuXG4gIGNvbnN0IGlucHV0czogRXhwYW5kRGltc0lucHV0cyA9IHtpbnB1dDogJHh9O1xuICBjb25zdCBhdHRyczogRXhwYW5kRGltc0F0dHJzID0ge2RpbTogYXhpc307XG5cbiAgcmV0dXJuIEVOR0lORS5ydW5LZXJuZWwoXG4gICAgICBFeHBhbmREaW1zLCBpbnB1dHMgYXMge30gYXMgTmFtZWRUZW5zb3JNYXAsIGF0dHJzIGFzIHt9IGFzIE5hbWVkQXR0ck1hcCk7XG59XG5cbmV4cG9ydCBjb25zdCBleHBhbmREaW1zID0gb3Aoe2V4cGFuZERpbXNffSk7XG4iXX0=","/**\n * @license\n * Copyright 2018 Google LLC. All Rights Reserved.\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n * =============================================================================\n */\nimport { ENGINE } from '../engine';\nimport { Expm1 } from '../kernel_names';\nimport { convertToTensor } from '../tensor_util_env';\nimport { op } from './operation';\n/**\n * Computes exponential of the input `tf.Tensor` minus one element-wise.\n * `e ^ x - 1`\n *\n * ```js\n * const x = tf.tensor1d([1, 2, -3]);\n *\n * x.expm1().print(); // or tf.expm1(x)\n * ```\n * @param x The input tensor.\n *\n * @doc {heading: 'Operations', subheading: 'Basic math'}\n */\nfunction expm1_(x) {\n const $x = convertToTensor(x, 'x', 'expm1');\n const inputs = { x: $x };\n return ENGINE.runKernel(Expm1, inputs);\n}\nexport const expm1 = op({ expm1_ });\n//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZXhwbTEuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi8uLi90ZmpzLWNvcmUvc3JjL29wcy9leHBtMS50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQTs7Ozs7Ozs7Ozs7Ozs7O0dBZUc7QUFFSCxPQUFPLEVBQUMsTUFBTSxFQUFDLE1BQU0sV0FBVyxDQUFDO0FBQ2pDLE9BQU8sRUFBQyxLQUFLLEVBQWMsTUFBTSxpQkFBaUIsQ0FBQztBQUduRCxPQUFPLEVBQUMsZUFBZSxFQUFDLE1BQU0sb0JBQW9CLENBQUM7QUFHbkQsT0FBTyxFQUFDLEVBQUUsRUFBQyxNQUFNLGFBQWEsQ0FBQztBQUUvQjs7Ozs7Ozs7Ozs7O0dBWUc7QUFDSCxTQUFTLE1BQU0sQ0FBbUIsQ0FBZTtJQUMvQyxNQUFNLEVBQUUsR0FBRyxlQUFlLENBQUMsQ0FBQyxFQUFFLEdBQUcsRUFBRSxPQUFPLENBQUMsQ0FBQztJQUU1QyxNQUFNLE1BQU0sR0FBZ0IsRUFBQyxDQUFDLEVBQUUsRUFBRSxFQUFDLENBQUM7SUFDcEMsT0FBTyxNQUFNLENBQUMsU0FBUyxDQUFDLEtBQUssRUFBRSxNQUE4QixDQUFDLENBQUM7QUFDakUsQ0FBQztBQUNELE1BQU0sQ0FBQyxNQUFNLEtBQUssR0FBRyxFQUFFLENBQUMsRUFBQyxNQUFNLEVBQUMsQ0FBQyxDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiLyoqXG4gKiBAbGljZW5zZVxuICogQ29weXJpZ2h0IDIwMTggR29vZ2xlIExMQy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC5cbiAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSBcIkxpY2Vuc2VcIik7XG4gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuXG4gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXRcbiAqXG4gKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjBcbiAqXG4gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlXG4gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiBcIkFTIElTXCIgQkFTSVMsXG4gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC5cbiAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmRcbiAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLlxuICogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbiAqL1xuXG5pbXBvcnQge0VOR0lORX0gZnJvbSAnLi4vZW5naW5lJztcbmltcG9ydCB7RXhwbTEsIEV4cG0xSW5wdXRzfSBmcm9tICcuLi9rZXJuZWxfbmFtZXMnO1xuaW1wb3J0IHtUZW5zb3J9IGZyb20gJy4uL3RlbnNvcic7XG5pbXBvcnQge05hbWVkVGVuc29yTWFwfSBmcm9tICcuLi90ZW5zb3JfdHlwZXMnO1xuaW1wb3J0IHtjb252ZXJ0VG9UZW5zb3J9IGZyb20gJy4uL3RlbnNvcl91dGlsX2Vudic7XG5pbXBvcnQge1RlbnNvckxpa2V9IGZyb20gJy4uL3R5cGVzJztcblxuaW1wb3J0IHtvcH0gZnJvbSAnLi9vcGVyYXRpb24nO1xuXG4vKipcbiAqIENvbXB1dGVzIGV4cG9uZW50aWFsIG9mIHRoZSBpbnB1dCBgdGYuVGVuc29yYCBtaW51cyBvbmUgZWxlbWVudC13aXNlLlxuICogYGUgXiB4IC0gMWBcbiAqXG4gKiBgYGBqc1xuICogY29uc3QgeCA9IHRmLnRlbnNvcjFkKFsxLCAyLCAtM10pO1xuICpcbiAqIHguZXhwbTEoKS5wcmludCgpOyAgLy8gb3IgdGYuZXhwbTEoeClcbiAqIGBgYFxuICogQHBhcmFtIHggVGhlIGlucHV0IHRlbnNvci5cbiAqXG4gKiBAZG9jIHtoZWFkaW5nOiAnT3BlcmF0aW9ucycsIHN1YmhlYWRpbmc6ICdCYXNpYyBtYXRoJ31cbiAqL1xuZnVuY3Rpb24gZXhwbTFfPFQgZXh0ZW5kcyBUZW5zb3I+KHg6IFR8VGVuc29yTGlrZSk6IFQge1xuICBjb25zdCAkeCA9IGNvbnZlcnRUb1RlbnNvcih4LCAneCcsICdleHBtMScpO1xuXG4gIGNvbnN0IGlucHV0czogRXhwbTFJbnB1dHMgPSB7eDogJHh9O1xuICByZXR1cm4gRU5HSU5FLnJ1bktlcm5lbChFeHBtMSwgaW5wdXRzIGFzIHt9IGFzIE5hbWVkVGVuc29yTWFwKTtcbn1cbmV4cG9ydCBjb25zdCBleHBtMSA9IG9wKHtleHBtMV99KTtcbiJdfQ==","/**\n * @license\n * Copyright 2020 Google LLC. All Rights Reserved.\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n * =============================================================================\n */\nimport { ENGINE } from '../engine';\nimport { Fill } from '../kernel_names';\n/**\n * Creates a `tf.Tensor` filled with a scalar value.\n *\n * ```js\n * tf.fill([2, 2], 4).print();\n * ```\n *\n * @param shape An array of integers defining the output tensor shape.\n * @param value The scalar value to fill the tensor with.\n * @param dtype The type of an element in the resulting tensor. Defaults to\n * 'float'.\n *\n * @doc {heading: 'Tensors', subheading: 'Creation'}\n */\nfunction fill(shape, value, dtype) {\n const attrs = { shape, value, dtype };\n return ENGINE.runKernel(Fill, {}, attrs);\n}\nexport { fill };\n//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZmlsbC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uLy4uL3RmanMtY29yZS9zcmMvb3BzL2ZpbGwudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUE7Ozs7Ozs7Ozs7Ozs7OztHQWVHO0FBRUgsT0FBTyxFQUFDLE1BQU0sRUFBQyxNQUFNLFdBQVcsQ0FBQztBQUNqQyxPQUFPLEVBQUMsSUFBSSxFQUFZLE1BQU0saUJBQWlCLENBQUM7QUFLaEQ7Ozs7Ozs7Ozs7Ozs7R0FhRztBQUNILFNBQVMsSUFBSSxDQUNULEtBQWtCLEVBQUUsS0FBb0IsRUFBRSxLQUFnQjtJQUM1RCxNQUFNLEtBQUssR0FBYyxFQUFDLEtBQUssRUFBRSxLQUFLLEVBQUUsS0FBSyxFQUFDLENBQUM7SUFFL0MsT0FBTyxNQUFNLENBQUMsU0FBUyxDQUFDLElBQUksRUFBRSxFQUFFLEVBQUUsS0FBMkIsQ0FBQyxDQUFDO0FBQ2pFLENBQUM7QUFFRCxPQUFPLEVBQUMsSUFBSSxFQUFDLENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyIvKipcbiAqIEBsaWNlbnNlXG4gKiBDb3B5cmlnaHQgMjAyMCBHb29nbGUgTExDLiBBbGwgUmlnaHRzIFJlc2VydmVkLlxuICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlIFwiTGljZW5zZVwiKTtcbiAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS5cbiAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdFxuICpcbiAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMFxuICpcbiAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmVcbiAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuIFwiQVMgSVNcIiBCQVNJUyxcbiAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLlxuICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZFxuICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuXG4gKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuICovXG5cbmltcG9ydCB7RU5HSU5FfSBmcm9tICcuLi9lbmdpbmUnO1xuaW1wb3J0IHtGaWxsLCBGaWxsQXR0cnN9IGZyb20gJy4uL2tlcm5lbF9uYW1lcyc7XG5pbXBvcnQge05hbWVkQXR0ck1hcH0gZnJvbSAnLi4va2VybmVsX3JlZ2lzdHJ5JztcbmltcG9ydCB7VGVuc29yfSBmcm9tICcuLi90ZW5zb3InO1xuaW1wb3J0IHtEYXRhVHlwZSwgUmFuaywgU2hhcGVNYXB9IGZyb20gJy4uL3R5cGVzJztcblxuLyoqXG4gKiBDcmVhdGVzIGEgYHRmLlRlbnNvcmAgZmlsbGVkIHdpdGggYSBzY2FsYXIgdmFsdWUuXG4gKlxuICogYGBganNcbiAqIHRmLmZpbGwoWzIsIDJdLCA0KS5wcmludCgpO1xuICogYGBgXG4gKlxuICogQHBhcmFtIHNoYXBlIEFuIGFycmF5IG9mIGludGVnZXJzIGRlZmluaW5nIHRoZSBvdXRwdXQgdGVuc29yIHNoYXBlLlxuICogQHBhcmFtIHZhbHVlIFRoZSBzY2FsYXIgdmFsdWUgdG8gZmlsbCB0aGUgdGVuc29yIHdpdGguXG4gKiBAcGFyYW0gZHR5cGUgVGhlIHR5cGUgb2YgYW4gZWxlbWVudCBpbiB0aGUgcmVzdWx0aW5nIHRlbnNvci4gRGVmYXVsdHMgdG9cbiAqICdmbG9hdCcuXG4gKlxuICogQGRvYyB7aGVhZGluZzogJ1RlbnNvcnMnLCBzdWJoZWFkaW5nOiAnQ3JlYXRpb24nfVxuICovXG5mdW5jdGlvbiBmaWxsPFIgZXh0ZW5kcyBSYW5rPihcbiAgICBzaGFwZTogU2hhcGVNYXBbUl0sIHZhbHVlOiBudW1iZXJ8c3RyaW5nLCBkdHlwZT86IERhdGFUeXBlKTogVGVuc29yPFI+IHtcbiAgY29uc3QgYXR0cnM6IEZpbGxBdHRycyA9IHtzaGFwZSwgdmFsdWUsIGR0eXBlfTtcblxuICByZXR1cm4gRU5HSU5FLnJ1bktlcm5lbChGaWxsLCB7fSwgYXR0cnMgYXMge30gYXMgTmFtZWRBdHRyTWFwKTtcbn1cblxuZXhwb3J0IHtmaWxsfTtcbiJdfQ==","/**\n * @license\n * Copyright 2018 Google LLC. All Rights Reserved.\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n * =============================================================================\n */\nimport { ENGINE } from '../engine';\nimport { Floor } from '../kernel_names';\nimport { convertToTensor } from '../tensor_util_env';\nimport { op } from './operation';\n/**\n * Computes floor of input `tf.Tensor` element-wise: `floor(x)`.\n *\n * ```js\n * const x = tf.tensor1d([.6, 1.1, -3.3]);\n *\n * x.floor().print(); // or tf.floor(x)\n * ```\n * @param x The input tensor.\n *\n * @doc {heading: 'Operations', subheading: 'Basic math'}\n */\nfunction floor_(x) {\n const $x = convertToTensor(x, 'x', 'floor', 'float32');\n const inputs = { x: $x };\n return ENGINE.runKernel(Floor, inputs);\n}\nexport const floor = op({ floor_ });\n//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZmxvb3IuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi8uLi90ZmpzLWNvcmUvc3JjL29wcy9mbG9vci50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQTs7Ozs7Ozs7Ozs7Ozs7O0dBZUc7QUFDSCxPQUFPLEVBQUMsTUFBTSxFQUFDLE1BQU0sV0FBVyxDQUFDO0FBQ2pDLE9BQU8sRUFBQyxLQUFLLEVBQWMsTUFBTSxpQkFBaUIsQ0FBQztBQUduRCxPQUFPLEVBQUMsZUFBZSxFQUFDLE1BQU0sb0JBQW9CLENBQUM7QUFHbkQsT0FBTyxFQUFDLEVBQUUsRUFBQyxNQUFNLGFBQWEsQ0FBQztBQUUvQjs7Ozs7Ozs7Ozs7R0FXRztBQUNILFNBQVMsTUFBTSxDQUFtQixDQUFlO0lBQy9DLE1BQU0sRUFBRSxHQUFHLGVBQWUsQ0FBQyxDQUFDLEVBQUUsR0FBRyxFQUFFLE9BQU8sRUFBRSxTQUFTLENBQUMsQ0FBQztJQUV2RCxNQUFNLE1BQU0sR0FBZ0IsRUFBQyxDQUFDLEVBQUUsRUFBRSxFQUFDLENBQUM7SUFDcEMsT0FBTyxNQUFNLENBQUMsU0FBUyxDQUFDLEtBQUssRUFBRSxNQUE4QixDQUFDLENBQUM7QUFDakUsQ0FBQztBQUNELE1BQU0sQ0FBQyxNQUFNLEtBQUssR0FBRyxFQUFFLENBQUMsRUFBQyxNQUFNLEVBQUMsQ0FBQyxDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiLyoqXG4gKiBAbGljZW5zZVxuICogQ29weXJpZ2h0IDIwMTggR29vZ2xlIExMQy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC5cbiAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSBcIkxpY2Vuc2VcIik7XG4gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuXG4gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXRcbiAqXG4gKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjBcbiAqXG4gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlXG4gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiBcIkFTIElTXCIgQkFTSVMsXG4gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC5cbiAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmRcbiAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLlxuICogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbiAqL1xuaW1wb3J0IHtFTkdJTkV9IGZyb20gJy4uL2VuZ2luZSc7XG5pbXBvcnQge0Zsb29yLCBGbG9vcklucHV0c30gZnJvbSAnLi4va2VybmVsX25hbWVzJztcbmltcG9ydCB7VGVuc29yfSBmcm9tICcuLi90ZW5zb3InO1xuaW1wb3J0IHtOYW1lZFRlbnNvck1hcH0gZnJvbSAnLi4vdGVuc29yX3R5cGVzJztcbmltcG9ydCB7Y29udmVydFRvVGVuc29yfSBmcm9tICcuLi90ZW5zb3JfdXRpbF9lbnYnO1xuaW1wb3J0IHtUZW5zb3JMaWtlfSBmcm9tICcuLi90eXBlcyc7XG5cbmltcG9ydCB7b3B9IGZyb20gJy4vb3BlcmF0aW9uJztcblxuLyoqXG4gKiBDb21wdXRlcyBmbG9vciBvZiBpbnB1dCBgdGYuVGVuc29yYCBlbGVtZW50LXdpc2U6IGBmbG9vcih4KWAuXG4gKlxuICogYGBganNcbiAqIGNvbnN0IHggPSB0Zi50ZW5zb3IxZChbLjYsIDEuMSwgLTMuM10pO1xuICpcbiAqIHguZmxvb3IoKS5wcmludCgpOyAgLy8gb3IgdGYuZmxvb3IoeClcbiAqIGBgYFxuICogQHBhcmFtIHggVGhlIGlucHV0IHRlbnNvci5cbiAqXG4gKiBAZG9jIHtoZWFkaW5nOiAnT3BlcmF0aW9ucycsIHN1YmhlYWRpbmc6ICdCYXNpYyBtYXRoJ31cbiAqL1xuZnVuY3Rpb24gZmxvb3JfPFQgZXh0ZW5kcyBUZW5zb3I+KHg6IFR8VGVuc29yTGlrZSk6IFQge1xuICBjb25zdCAkeCA9IGNvbnZlcnRUb1RlbnNvcih4LCAneCcsICdmbG9vcicsICdmbG9hdDMyJyk7XG5cbiAgY29uc3QgaW5wdXRzOiBGbG9vcklucHV0cyA9IHt4OiAkeH07XG4gIHJldHVybiBFTkdJTkUucnVuS2VybmVsKEZsb29yLCBpbnB1dHMgYXMge30gYXMgTmFtZWRUZW5zb3JNYXApO1xufVxuZXhwb3J0IGNvbnN0IGZsb29yID0gb3Aoe2Zsb29yX30pO1xuIl19","/**\n * @license\n * Copyright 2020 Google LLC. All Rights Reserved.\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n * =============================================================================\n */\nimport { ENGINE } from '../engine';\nimport { FloorDiv } from '../kernel_names';\nimport { makeTypesMatch } from '../tensor_util';\nimport { convertToTensor } from '../tensor_util_env';\nimport { op } from './operation';\n/**\n * Divides two `tf.Tensor`s element-wise, A / B. Supports broadcasting.\n * The result is rounded with floor function.\n *\n *\n * ```js\n * const a = tf.tensor1d([1, 4, 9, 16]);\n * const b = tf.tensor1d([1, 2, 3, 4]);\n *\n * a.floorDiv(b).print(); // or tf.div(a, b)\n * ```\n *\n * ```js\n * // Broadcast div a with b.\n * const a = tf.tensor1d([2, 4, 6, 8]);\n * const b = tf.scalar(2);\n *\n * a.floorDiv(b).print(); // or tf.floorDiv(a, b)\n * ```\n *\n * @param a The first tensor as the numerator.\n * @param b The second tensor as the denominator. Must have the same dtype as\n * `a`.\n *\n * @doc {heading: 'Operations', subheading: 'Arithmetic'}\n */\nfunction floorDiv_(a, b) {\n let $a = convertToTensor(a, 'a', 'floorDiv');\n let $b = convertToTensor(b, 'b', 'floorDiv');\n [$a, $b] = makeTypesMatch($a, $b);\n const inputs = { a: $a, b: $b };\n return ENGINE.runKernel(FloorDiv, inputs);\n}\nexport const floorDiv = op({ floorDiv_ });\n//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZmxvb3JEaXYuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi8uLi90ZmpzLWNvcmUvc3JjL29wcy9mbG9vckRpdi50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQTs7Ozs7Ozs7Ozs7Ozs7O0dBZUc7QUFFSCxPQUFPLEVBQUMsTUFBTSxFQUFDLE1BQU0sV0FBVyxDQUFDO0FBQ2pDLE9BQU8sRUFBQyxRQUFRLEVBQWlCLE1BQU0saUJBQWlCLENBQUM7QUFHekQsT0FBTyxFQUFDLGNBQWMsRUFBQyxNQUFNLGdCQUFnQixDQUFDO0FBQzlDLE9BQU8sRUFBQyxlQUFlLEVBQUMsTUFBTSxvQkFBb0IsQ0FBQztBQUduRCxPQUFPLEVBQUMsRUFBRSxFQUFDLE1BQU0sYUFBYSxDQUFDO0FBRS9COzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7O0dBeUJHO0FBQ0gsU0FBUyxTQUFTLENBQ2QsQ0FBb0IsRUFBRSxDQUFvQjtJQUM1QyxJQUFJLEVBQUUsR0FBRyxlQUFlLENBQUMsQ0FBQyxFQUFFLEdBQUcsRUFBRSxVQUFVLENBQUMsQ0FBQztJQUM3QyxJQUFJLEVBQUUsR0FBRyxlQUFlLENBQUMsQ0FBQyxFQUFFLEdBQUcsRUFBRSxVQUFVLENBQUMsQ0FBQztJQUM3QyxDQUFDLEVBQUUsRUFBRSxFQUFFLENBQUMsR0FBRyxjQUFjLENBQUMsRUFBRSxFQUFFLEVBQUUsQ0FBQyxDQUFDO0lBRWxDLE1BQU0sTUFBTSxHQUFtQixFQUFDLENBQUMsRUFBRSxFQUFFLEVBQUUsQ0FBQyxFQUFFLEVBQUUsRUFBQyxDQUFDO0lBRTlDLE9BQU8sTUFBTSxDQUFDLFNBQVMsQ0FBQyxRQUFRLEVBQUUsTUFBOEIsQ0FBQyxDQUFDO0FBQ3BFLENBQUM7QUFFRCxNQUFNLENBQUMsTUFBTSxRQUFRLEdBQUcsRUFBRSxDQUFDLEVBQUMsU0FBUyxFQUFDLENBQUMsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbIi8qKlxuICogQGxpY2Vuc2VcbiAqIENvcHlyaWdodCAyMDIwIEdvb2dsZSBMTEMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuXG4gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgXCJMaWNlbnNlXCIpO1xuICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLlxuICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0XG4gKlxuICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wXG4gKlxuICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZVxuICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gXCJBUyBJU1wiIEJBU0lTLFxuICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuXG4gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kXG4gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS5cbiAqID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4gKi9cblxuaW1wb3J0IHtFTkdJTkV9IGZyb20gJy4uL2VuZ2luZSc7XG5pbXBvcnQge0Zsb29yRGl2LCBGbG9vckRpdklucHV0c30gZnJvbSAnLi4va2VybmVsX25hbWVzJztcbmltcG9ydCB7VGVuc29yfSBmcm9tICcuLi90ZW5zb3InO1xuaW1wb3J0IHtOYW1lZFRlbnNvck1hcH0gZnJvbSAnLi4vdGVuc29yX3R5cGVzJztcbmltcG9ydCB7bWFrZVR5cGVzTWF0Y2h9IGZyb20gJy4uL3RlbnNvcl91dGlsJztcbmltcG9ydCB7Y29udmVydFRvVGVuc29yfSBmcm9tICcuLi90ZW5zb3JfdXRpbF9lbnYnO1xuaW1wb3J0IHtUZW5zb3JMaWtlfSBmcm9tICcuLi90eXBlcyc7XG5cbmltcG9ydCB7b3B9IGZyb20gJy4vb3BlcmF0aW9uJztcblxuLyoqXG4gKiBEaXZpZGVzIHR3byBgdGYuVGVuc29yYHMgZWxlbWVudC13aXNlLCBBIC8gQi4gU3VwcG9ydHMgYnJvYWRjYXN0aW5nLlxuICogVGhlIHJlc3VsdCBpcyByb3VuZGVkIHdpdGggZmxvb3IgZnVuY3Rpb24uXG4gKlxuICpcbiAqIGBgYGpzXG4gKiBjb25zdCBhID0gdGYudGVuc29yMWQoWzEsIDQsIDksIDE2XSk7XG4gKiBjb25zdCBiID0gdGYudGVuc29yMWQoWzEsIDIsIDMsIDRdKTtcbiAqXG4gKiBhLmZsb29yRGl2KGIpLnByaW50KCk7ICAvLyBvciB0Zi5kaXYoYSwgYilcbiAqIGBgYFxuICpcbiAqIGBgYGpzXG4gKiAvLyBCcm9hZGNhc3QgZGl2IGEgd2l0aCBiLlxuICogY29uc3QgYSA9IHRmLnRlbnNvcjFkKFsyLCA0LCA2LCA4XSk7XG4gKiBjb25zdCBiID0gdGYuc2NhbGFyKDIpO1xuICpcbiAqIGEuZmxvb3JEaXYoYikucHJpbnQoKTsgIC8vIG9yIHRmLmZsb29yRGl2KGEsIGIpXG4gKiBgYGBcbiAqXG4gKiBAcGFyYW0gYSBUaGUgZmlyc3QgdGVuc29yIGFzIHRoZSBudW1lcmF0b3IuXG4gKiBAcGFyYW0gYiBUaGUgc2Vjb25kIHRlbnNvciBhcyB0aGUgZGVub21pbmF0b3IuIE11c3QgaGF2ZSB0aGUgc2FtZSBkdHlwZSBhc1xuICogYGFgLlxuICpcbiAqIEBkb2Mge2hlYWRpbmc6ICdPcGVyYXRpb25zJywgc3ViaGVhZGluZzogJ0FyaXRobWV0aWMnfVxuICovXG5mdW5jdGlvbiBmbG9vckRpdl88VCBleHRlbmRzIFRlbnNvcj4oXG4gICAgYTogVGVuc29yfFRlbnNvckxpa2UsIGI6IFRlbnNvcnxUZW5zb3JMaWtlKTogVCB7XG4gIGxldCAkYSA9IGNvbnZlcnRUb1RlbnNvcihhLCAnYScsICdmbG9vckRpdicpO1xuICBsZXQgJGIgPSBjb252ZXJ0VG9UZW5zb3IoYiwgJ2InLCAnZmxvb3JEaXYnKTtcbiAgWyRhLCAkYl0gPSBtYWtlVHlwZXNNYXRjaCgkYSwgJGIpO1xuXG4gIGNvbnN0IGlucHV0czogRmxvb3JEaXZJbnB1dHMgPSB7YTogJGEsIGI6ICRifTtcblxuICByZXR1cm4gRU5HSU5FLnJ1bktlcm5lbChGbG9vckRpdiwgaW5wdXRzIGFzIHt9IGFzIE5hbWVkVGVuc29yTWFwKTtcbn1cblxuZXhwb3J0IGNvbnN0IGZsb29yRGl2ID0gb3Aoe2Zsb29yRGl2X30pO1xuIl19","/**\n * @license\n * Copyright 2019 Google LLC. All Rights Reserved.\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n * =============================================================================\n */\nimport * as broadcast_util from './broadcast_util';\nimport { elu } from './elu';\nimport { leakyRelu } from './leaky_relu';\nimport { mul } from './mul';\nimport { prelu } from './prelu';\nimport { relu } from './relu';\nimport { relu6 } from './relu6';\nimport { reshape } from './reshape';\nimport { sigmoid } from './sigmoid';\nimport { step } from './step';\nimport { sum } from './sum';\n// Returns gradient for fused activation.\nexport function getFusedDyActivation(dy, y, activation) {\n if (activation == null || activation === 'linear') {\n return dy;\n }\n if (activation === 'relu') {\n return mul(dy, step(y));\n }\n throw new Error(`Cannot compute gradient for fused activation ${activation}.`);\n}\n// Returns gradient for fused bias.\nexport function getFusedBiasGradient(bias, dyActivation) {\n let res = dyActivation;\n const reduceAxes = broadcast_util.getReductionAxes(bias.shape, dyActivation.shape);\n if (reduceAxes.length > 0) {\n res = sum(res, reduceAxes);\n }\n return reshape(res, bias.shape);\n}\nexport function applyActivation(x, activation, preluActivationWeights, leakyreluAlpha) {\n if (activation === 'linear') {\n return x;\n }\n else if (activation === 'relu') {\n return relu(x);\n }\n else if (activation === 'elu') {\n return elu(x);\n }\n else if (activation === 'relu6') {\n return relu6(x);\n }\n else if (activation === 'prelu') {\n return prelu(x, preluActivationWeights);\n }\n else if (activation === 'leakyrelu') {\n return leakyRelu(x, leakyreluAlpha);\n }\n else if (activation === 'sigmoid') {\n return sigmoid(x);\n }\n throw new Error(`Unknown fused activation ${activation}.`);\n}\n// Whether we should call fused ops.\nexport const shouldFuse = (gradientDepth, activation) => {\n const gradientMode = gradientDepth > 0;\n return !gradientMode || activation === 'linear';\n};\n//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZnVzZWRfdXRpbC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uLy4uL3RmanMtY29yZS9zcmMvb3BzL2Z1c2VkX3V0aWwudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUE7Ozs7Ozs7Ozs7Ozs7OztHQWVHO0FBSUgsT0FBTyxLQUFLLGNBQWMsTUFBTSxrQkFBa0IsQ0FBQztBQUNuRCxPQUFPLEVBQUMsR0FBRyxFQUFDLE1BQU0sT0FBTyxDQUFDO0FBRTFCLE9BQU8sRUFBQyxTQUFTLEVBQUMsTUFBTSxjQUFjLENBQUM7QUFDdkMsT0FBTyxFQUFDLEdBQUcsRUFBQyxNQUFNLE9BQU8sQ0FBQztBQUMxQixPQUFPLEVBQUMsS0FBSyxFQUFDLE1BQU0sU0FBUyxDQUFDO0FBQzlCLE9BQU8sRUFBQyxJQUFJLEVBQUMsTUFBTSxRQUFRLENBQUM7QUFDNUIsT0FBTyxFQUFDLEtBQUssRUFBQyxNQUFNLFNBQVMsQ0FBQztBQUM5QixPQUFPLEVBQUMsT0FBTyxFQUFDLE1BQU0sV0FBVyxDQUFDO0FBQ2xDLE9BQU8sRUFBQyxPQUFPLEVBQUMsTUFBTSxXQUFXLENBQUM7QUFDbEMsT0FBTyxFQUFDLElBQUksRUFBQyxNQUFNLFFBQVEsQ0FBQztBQUM1QixPQUFPLEVBQUMsR0FBRyxFQUFDLE1BQU0sT0FBTyxDQUFDO0FBRTFCLHlDQUF5QztBQUN6QyxNQUFNLFVBQVUsb0JBQW9CLENBQ2hDLEVBQVUsRUFBRSxDQUFTLEVBQUUsVUFBc0I7SUFDL0MsSUFBSSxVQUFVLElBQUksSUFBSSxJQUFJLFVBQVUsS0FBSyxRQUFRLEVBQUU7UUFDakQsT0FBTyxFQUFFLENBQUM7S0FDWDtJQUNELElBQUksVUFBVSxLQUFLLE1BQU0sRUFBRTtRQUN6QixPQUFPLEdBQUcsQ0FBQyxFQUFFLEVBQUUsSUFBSSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUM7S0FDekI7SUFDRCxNQUFNLElBQUksS0FBSyxDQUNYLGdEQUFnRCxVQUFVLEdBQUcsQ0FBQyxDQUFDO0FBQ3JFLENBQUM7QUFFRCxtQ0FBbUM7QUFDbkMsTUFBTSxVQUFVLG9CQUFvQixDQUNoQyxJQUFZLEVBQUUsWUFBb0I7SUFDcEMsSUFBSSxHQUFHLEdBQUcsWUFBWSxDQUFDO0lBQ3ZCLE1BQU0sVUFBVSxHQUNaLGNBQWMsQ0FBQyxnQkFBZ0IsQ0FBQyxJQUFJLENBQUMsS0FBSyxFQUFFLFlBQVksQ0FBQyxLQUFLLENBQUMsQ0FBQztJQUNwRSxJQUFJLFVBQVUsQ0FBQyxNQUFNLEdBQUcsQ0FBQyxFQUFFO1FBQ3pCLEdBQUcsR0FBRyxHQUFHLENBQUMsR0FBRyxFQUFFLFVBQVUsQ0FBQyxDQUFDO0tBQzVCO0lBQ0QsT0FBTyxPQUFPLENBQUMsR0FBRyxFQUFFLElBQUksQ0FBQyxLQUFLLENBQUMsQ0FBQztBQUNsQyxDQUFDO0FBRUQsTUFBTSxVQUFVLGVBQWUsQ0FDM0IsQ0FBUyxFQUFFLFVBQXNCLEVBQUUsc0JBQStCLEVBQ2xFLGNBQXVCO0lBQ3pCLElBQUksVUFBVSxLQUFLLFFBQVEsRUFBRTtRQUMzQixPQUFPLENBQUMsQ0FBQztLQUNWO1NBQU0sSUFBSSxVQUFVLEtBQUssTUFBTSxFQUFFO1FBQ2hDLE9BQU8sSUFBSSxDQUFDLENBQUMsQ0FBQyxDQUFDO0tBQ2hCO1NBQU0sSUFBSSxVQUFVLEtBQUssS0FBSyxFQUFFO1FBQy9CLE9BQU8sR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDO0tBQ2Y7U0FBTSxJQUFJLFVBQVUsS0FBSyxPQUFPLEVBQUU7UUFDakMsT0FBTyxLQUFLLENBQUMsQ0FBQyxDQUFDLENBQUM7S0FDakI7U0FBTSxJQUFJLFVBQVUsS0FBSyxPQUFPLEVBQUU7UUFDakMsT0FBTyxLQUFLLENBQUMsQ0FBQyxFQUFFLHNCQUFzQixDQUFDLENBQUM7S0FDekM7U0FBTSxJQUFJLFVBQVUsS0FBSyxXQUFXLEVBQUU7UUFDckMsT0FBTyxTQUFTLENBQUMsQ0FBQyxFQUFFLGNBQWMsQ0FBQyxDQUFDO0tBQ3JDO1NBQU0sSUFBSSxVQUFVLEtBQUssU0FBUyxFQUFFO1FBQ25DLE9BQU8sT0FBTyxDQUFDLENBQUMsQ0FBQyxDQUFDO0tBQ25CO0lBQ0QsTUFBTSxJQUFJLEtBQUssQ0FBQyw0QkFBNEIsVUFBVSxHQUFHLENBQUMsQ0FBQztBQUM3RCxDQUFDO0FBRUQsb0NBQW9DO0FBQ3BDLE1BQU0sQ0FBQyxNQUFNLFVBQVUsR0FBRyxDQUFDLGFBQXFCLEVBQUUsVUFBc0IsRUFBRSxFQUFFO0lBQzFFLE1BQU0sWUFBWSxHQUFHLGFBQWEsR0FBRyxDQUFDLENBQUM7SUFDdkMsT0FBTyxDQUFDLFlBQVksSUFBSSxVQUFVLEtBQUssUUFBUSxDQUFDO0FBQ2xELENBQUMsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbIi8qKlxuICogQGxpY2Vuc2VcbiAqIENvcHlyaWdodCAyMDE5IEdvb2dsZSBMTEMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuXG4gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgXCJMaWNlbnNlXCIpO1xuICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLlxuICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0XG4gKlxuICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wXG4gKlxuICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZVxuICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gXCJBUyBJU1wiIEJBU0lTLFxuICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuXG4gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kXG4gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS5cbiAqID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4gKi9cblxuaW1wb3J0IHtUZW5zb3J9IGZyb20gJy4uL3RlbnNvcic7XG5cbmltcG9ydCAqIGFzIGJyb2FkY2FzdF91dGlsIGZyb20gJy4vYnJvYWRjYXN0X3V0aWwnO1xuaW1wb3J0IHtlbHV9IGZyb20gJy4vZWx1JztcbmltcG9ydCB7QWN0aXZhdGlvbn0gZnJvbSAnLi9mdXNlZF90eXBlcyc7XG5pbXBvcnQge2xlYWt5UmVsdX0gZnJvbSAnLi9sZWFreV9yZWx1JztcbmltcG9ydCB7bXVsfSBmcm9tICcuL211bCc7XG5pbXBvcnQge3ByZWx1fSBmcm9tICcuL3ByZWx1JztcbmltcG9ydCB7cmVsdX0gZnJvbSAnLi9yZWx1JztcbmltcG9ydCB7cmVsdTZ9IGZyb20gJy4vcmVsdTYnO1xuaW1wb3J0IHtyZXNoYXBlfSBmcm9tICcuL3Jlc2hhcGUnO1xuaW1wb3J0IHtzaWdtb2lkfSBmcm9tICcuL3NpZ21vaWQnO1xuaW1wb3J0IHtzdGVwfSBmcm9tICcuL3N0ZXAnO1xuaW1wb3J0IHtzdW19IGZyb20gJy4vc3VtJztcblxuLy8gUmV0dXJucyBncmFkaWVudCBmb3IgZnVzZWQgYWN0aXZhdGlvbi5cbmV4cG9ydCBmdW5jdGlvbiBnZXRGdXNlZER5QWN0aXZhdGlvbihcbiAgICBkeTogVGVuc29yLCB5OiBUZW5zb3IsIGFjdGl2YXRpb246IEFjdGl2YXRpb24pOiBUZW5zb3Ige1xuICBpZiAoYWN0aXZhdGlvbiA9PSBudWxsIHx8IGFjdGl2YXRpb24gPT09ICdsaW5lYXInKSB7XG4gICAgcmV0dXJuIGR5O1xuICB9XG4gIGlmIChhY3RpdmF0aW9uID09PSAncmVsdScpIHtcbiAgICByZXR1cm4gbXVsKGR5LCBzdGVwKHkpKTtcbiAgfVxuICB0aHJvdyBuZXcgRXJyb3IoXG4gICAgICBgQ2Fubm90IGNvbXB1dGUgZ3JhZGllbnQgZm9yIGZ1c2VkIGFjdGl2YXRpb24gJHthY3RpdmF0aW9ufS5gKTtcbn1cblxuLy8gUmV0dXJucyBncmFkaWVudCBmb3IgZnVzZWQgYmlhcy5cbmV4cG9ydCBmdW5jdGlvbiBnZXRGdXNlZEJpYXNHcmFkaWVudChcbiAgICBiaWFzOiBUZW5zb3IsIGR5QWN0aXZhdGlvbjogVGVuc29yKTogVGVuc29yIHtcbiAgbGV0IHJlcyA9IGR5QWN0aXZhdGlvbjtcbiAgY29uc3QgcmVkdWNlQXhlcyA9XG4gICAgICBicm9hZGNhc3RfdXRpbC5nZXRSZWR1Y3Rpb25BeGVzKGJpYXMuc2hhcGUsIGR5QWN0aXZhdGlvbi5zaGFwZSk7XG4gIGlmIChyZWR1Y2VBeGVzLmxlbmd0aCA+IDApIHtcbiAgICByZXMgPSBzdW0ocmVzLCByZWR1Y2VBeGVzKTtcbiAgfVxuICByZXR1cm4gcmVzaGFwZShyZXMsIGJpYXMuc2hhcGUpO1xufVxuXG5leHBvcnQgZnVuY3Rpb24gYXBwbHlBY3RpdmF0aW9uKFxuICAgIHg6IFRlbnNvciwgYWN0aXZhdGlvbjogQWN0aXZhdGlvbiwgcHJlbHVBY3RpdmF0aW9uV2VpZ2h0cz86IFRlbnNvcixcbiAgICBsZWFreXJlbHVBbHBoYT86IG51bWJlcik6IFRlbnNvciB7XG4gIGlmIChhY3RpdmF0aW9uID09PSAnbGluZWFyJykge1xuICAgIHJldHVybiB4O1xuICB9IGVsc2UgaWYgKGFjdGl2YXRpb24gPT09ICdyZWx1Jykge1xuICAgIHJldHVybiByZWx1KHgpO1xuICB9IGVsc2UgaWYgKGFjdGl2YXRpb24gPT09ICdlbHUnKSB7XG4gICAgcmV0dXJuIGVsdSh4KTtcbiAgfSBlbHNlIGlmIChhY3RpdmF0aW9uID09PSAncmVsdTYnKSB7XG4gICAgcmV0dXJuIHJlbHU2KHgpO1xuICB9IGVsc2UgaWYgKGFjdGl2YXRpb24gPT09ICdwcmVsdScpIHtcbiAgICByZXR1cm4gcHJlbHUoeCwgcHJlbHVBY3RpdmF0aW9uV2VpZ2h0cyk7XG4gIH0gZWxzZSBpZiAoYWN0aXZhdGlvbiA9PT0gJ2xlYWt5cmVsdScpIHtcbiAgICByZXR1cm4gbGVha3lSZWx1KHgsIGxlYWt5cmVsdUFscGhhKTtcbiAgfSBlbHNlIGlmIChhY3RpdmF0aW9uID09PSAnc2lnbW9pZCcpIHtcbiAgICByZXR1cm4gc2lnbW9pZCh4KTtcbiAgfVxuICB0aHJvdyBuZXcgRXJyb3IoYFVua25vd24gZnVzZWQgYWN0aXZhdGlvbiAke2FjdGl2YXRpb259LmApO1xufVxuXG4vLyBXaGV0aGVyIHdlIHNob3VsZCBjYWxsIGZ1c2VkIG9wcy5cbmV4cG9ydCBjb25zdCBzaG91bGRGdXNlID0gKGdyYWRpZW50RGVwdGg6IG51bWJlciwgYWN0aXZhdGlvbjogQWN0aXZhdGlvbikgPT4ge1xuICBjb25zdCBncmFkaWVudE1vZGUgPSBncmFkaWVudERlcHRoID4gMDtcbiAgcmV0dXJuICFncmFkaWVudE1vZGUgfHwgYWN0aXZhdGlvbiA9PT0gJ2xpbmVhcic7XG59O1xuIl19","/**\n * @license\n * Copyright 2018 Google LLC. All Rights Reserved.\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n * =============================================================================\n */\nimport { ENGINE } from '../engine';\nimport { GatherV2 } from '../kernel_names';\nimport { convertToTensor } from '../tensor_util_env';\nimport { op } from './operation';\n/**\n * Gather slices from tensor `x`'s axis `axis` according to `indices`.\n *\n * ```js\n * const x = tf.tensor1d([1, 2, 3, 4]);\n * const indices = tf.tensor1d([1, 3, 3], 'int32');\n *\n * x.gather(indices).print();\n * ```\n *\n * ```js\n * const x = tf.tensor2d([1, 2, 3, 4], [2, 2]);\n * const indices = tf.tensor1d([1, 1, 0], 'int32');\n *\n * x.gather(indices).print();\n * ```\n * @param x The input tensor whose slices are to be gathered.\n * @param indices The indices of the values to extract.\n * @param axis The axis over which to select values. Defaults to 0.\n * @param batchDims Optional. The number of batch dimensions. It must be less\n * than or equal to rank(indices). Defaults to 0.\n * The output tensor will have shape of\n * `x.shape[:axis] + indices.shape[batchDims:] + x.shape[axis + 1:]`\n *\n * @doc {heading: 'Tensors', subheading: 'Slicing and Joining'}\n */\nfunction gather_(x, indices, axis = 0, batchDims = 0) {\n const $x = convertToTensor(x, 'x', 'gather');\n const $indices = convertToTensor(indices, 'indices', 'gather', 'int32');\n const inputs = { x: $x, indices: $indices };\n const attrs = { axis, batchDims };\n return ENGINE.runKernel(GatherV2, inputs, attrs);\n}\nexport const gather = op({ gather_ });\n//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZ2F0aGVyLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vLi4vdGZqcy1jb3JlL3NyYy9vcHMvZ2F0aGVyLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBOzs7Ozs7Ozs7Ozs7Ozs7R0FlRztBQUVILE9BQU8sRUFBQyxNQUFNLEVBQUMsTUFBTSxXQUFXLENBQUM7QUFDakMsT0FBTyxFQUFDLFFBQVEsRUFBZ0MsTUFBTSxpQkFBaUIsQ0FBQztBQUl4RSxPQUFPLEVBQUMsZUFBZSxFQUFDLE1BQU0sb0JBQW9CLENBQUM7QUFHbkQsT0FBTyxFQUFDLEVBQUUsRUFBQyxNQUFNLGFBQWEsQ0FBQztBQUUvQjs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7OztHQXlCRztBQUNILFNBQVMsT0FBTyxDQUNaLENBQWUsRUFBRSxPQUEwQixFQUFFLElBQUksR0FBRyxDQUFDLEVBQUUsU0FBUyxHQUFHLENBQUM7SUFDdEUsTUFBTSxFQUFFLEdBQUcsZUFBZSxDQUFDLENBQUMsRUFBRSxHQUFHLEVBQUUsUUFBUSxDQUFDLENBQUM7SUFDN0MsTUFBTSxRQUFRLEdBQUcsZUFBZSxDQUFDLE9BQU8sRUFBRSxTQUFTLEVBQUUsUUFBUSxFQUFFLE9BQU8sQ0FBQyxDQUFDO0lBRXhFLE1BQU0sTUFBTSxHQUFtQixFQUFDLENBQUMsRUFBRSxFQUFFLEVBQUUsT0FBTyxFQUFFLFFBQVEsRUFBQyxDQUFDO0lBQzFELE1BQU0sS0FBSyxHQUFrQixFQUFDLElBQUksRUFBRSxTQUFTLEVBQUMsQ0FBQztJQUUvQyxPQUFPLE1BQU0sQ0FBQyxTQUFTLENBQ25CLFFBQVEsRUFBRSxNQUE4QixFQUFFLEtBQTJCLENBQUMsQ0FBQztBQUM3RSxDQUFDO0FBRUQsTUFBTSxDQUFDLE1BQU0sTUFBTSxHQUFHLEVBQUUsQ0FBQyxFQUFDLE9BQU8sRUFBQyxDQUFDLENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyIvKipcbiAqIEBsaWNlbnNlXG4gKiBDb3B5cmlnaHQgMjAxOCBHb29nbGUgTExDLiBBbGwgUmlnaHRzIFJlc2VydmVkLlxuICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlIFwiTGljZW5zZVwiKTtcbiAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS5cbiAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdFxuICpcbiAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMFxuICpcbiAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmVcbiAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuIFwiQVMgSVNcIiBCQVNJUyxcbiAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLlxuICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZFxuICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuXG4gKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuICovXG5cbmltcG9ydCB7RU5HSU5FfSBmcm9tICcuLi9lbmdpbmUnO1xuaW1wb3J0IHtHYXRoZXJWMiwgR2F0aGVyVjJBdHRycywgR2F0aGVyVjJJbnB1dHN9IGZyb20gJy4uL2tlcm5lbF9uYW1lcyc7XG5pbXBvcnQge05hbWVkQXR0ck1hcH0gZnJvbSAnLi4va2VybmVsX3JlZ2lzdHJ5JztcbmltcG9ydCB7VGVuc29yfSBmcm9tICcuLi90ZW5zb3InO1xuaW1wb3J0IHtOYW1lZFRlbnNvck1hcH0gZnJvbSAnLi4vdGVuc29yX3R5cGVzJztcbmltcG9ydCB7Y29udmVydFRvVGVuc29yfSBmcm9tICcuLi90ZW5zb3JfdXRpbF9lbnYnO1xuaW1wb3J0IHtUZW5zb3JMaWtlfSBmcm9tICcuLi90eXBlcyc7XG5cbmltcG9ydCB7b3B9IGZyb20gJy4vb3BlcmF0aW9uJztcblxuLyoqXG4gKiBHYXRoZXIgc2xpY2VzIGZyb20gdGVuc29yIGB4YCdzIGF4aXMgYGF4aXNgIGFjY29yZGluZyB0byBgaW5kaWNlc2AuXG4gKlxuICogYGBganNcbiAqIGNvbnN0IHggPSB0Zi50ZW5zb3IxZChbMSwgMiwgMywgNF0pO1xuICogY29uc3QgaW5kaWNlcyA9IHRmLnRlbnNvcjFkKFsxLCAzLCAzXSwgJ2ludDMyJyk7XG4gKlxuICogeC5nYXRoZXIoaW5kaWNlcykucHJpbnQoKTtcbiAqIGBgYFxuICpcbiAqIGBgYGpzXG4gKiBjb25zdCB4ID0gdGYudGVuc29yMmQoWzEsIDIsIDMsIDRdLCBbMiwgMl0pO1xuICogY29uc3QgaW5kaWNlcyA9IHRmLnRlbnNvcjFkKFsxLCAxLCAwXSwgJ2ludDMyJyk7XG4gKlxuICogeC5nYXRoZXIoaW5kaWNlcykucHJpbnQoKTtcbiAqIGBgYFxuICogQHBhcmFtIHggVGhlIGlucHV0IHRlbnNvciB3aG9zZSBzbGljZXMgYXJlIHRvIGJlIGdhdGhlcmVkLlxuICogQHBhcmFtIGluZGljZXMgVGhlIGluZGljZXMgb2YgdGhlIHZhbHVlcyB0byBleHRyYWN0LlxuICogQHBhcmFtIGF4aXMgVGhlIGF4aXMgb3ZlciB3aGljaCB0byBzZWxlY3QgdmFsdWVzLiBEZWZhdWx0cyB0byAwLlxuICogQHBhcmFtIGJhdGNoRGltcyBPcHRpb25hbC4gVGhlIG51bWJlciBvZiBiYXRjaCBkaW1lbnNpb25zLiBJdCBtdXN0IGJlIGxlc3NcbiAqICAgICB0aGFuIG9yIGVxdWFsIHRvIHJhbmsoaW5kaWNlcykuIERlZmF1bHRzIHRvIDAuXG4gKiAgICAgVGhlIG91dHB1dCB0ZW5zb3Igd2lsbCBoYXZlIHNoYXBlIG9mXG4gKiAgICAgYHguc2hhcGVbOmF4aXNdICsgaW5kaWNlcy5zaGFwZVtiYXRjaERpbXM6XSArIHguc2hhcGVbYXhpcyArIDE6XWBcbiAqXG4gKiBAZG9jIHtoZWFkaW5nOiAnVGVuc29ycycsIHN1YmhlYWRpbmc6ICdTbGljaW5nIGFuZCBKb2luaW5nJ31cbiAqL1xuZnVuY3Rpb24gZ2F0aGVyXzxUIGV4dGVuZHMgVGVuc29yPihcbiAgICB4OiBUfFRlbnNvckxpa2UsIGluZGljZXM6IFRlbnNvcnxUZW5zb3JMaWtlLCBheGlzID0gMCwgYmF0Y2hEaW1zID0gMCk6IFQge1xuICBjb25zdCAkeCA9IGNvbnZlcnRUb1RlbnNvcih4LCAneCcsICdnYXRoZXInKTtcbiAgY29uc3QgJGluZGljZXMgPSBjb252ZXJ0VG9UZW5zb3IoaW5kaWNlcywgJ2luZGljZXMnLCAnZ2F0aGVyJywgJ2ludDMyJyk7XG5cbiAgY29uc3QgaW5wdXRzOiBHYXRoZXJWMklucHV0cyA9IHt4OiAkeCwgaW5kaWNlczogJGluZGljZXN9O1xuICBjb25zdCBhdHRyczogR2F0aGVyVjJBdHRycyA9IHtheGlzLCBiYXRjaERpbXN9O1xuXG4gIHJldHVybiBFTkdJTkUucnVuS2VybmVsKFxuICAgICAgR2F0aGVyVjIsIGlucHV0cyBhcyB7fSBhcyBOYW1lZFRlbnNvck1hcCwgYXR0cnMgYXMge30gYXMgTmFtZWRBdHRyTWFwKTtcbn1cblxuZXhwb3J0IGNvbnN0IGdhdGhlciA9IG9wKHtnYXRoZXJffSk7XG4iXX0=","/**\n * @license\n * Copyright 2020 Google LLC. All Rights Reserved.\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n * =============================================================================\n */\nimport { ENGINE } from '../engine';\nimport { Greater } from '../kernel_names';\nimport { makeTypesMatch } from '../tensor_util';\nimport { convertToTensor } from '../tensor_util_env';\nimport { assertAndGetBroadcastShape } from './broadcast_util';\nimport { op } from './operation';\n/**\n * Returns the truth value of (a > b) element-wise. Supports broadcasting.\n *\n * ```js\n * const a = tf.tensor1d([1, 2, 3]);\n * const b = tf.tensor1d([2, 2, 2]);\n *\n * a.greater(b).print();\n * ```\n *\n * @param a The first input tensor.\n * @param b The second input tensor. Must have the same dtype as `a`.\n *\n * @doc {heading: 'Operations', subheading: 'Logical'}\n */\nfunction greater_(a, b) {\n let $a = convertToTensor(a, 'a', 'greater', 'string_or_numeric');\n let $b = convertToTensor(b, 'b', 'greater', 'string_or_numeric');\n [$a, $b] = makeTypesMatch($a, $b);\n assertAndGetBroadcastShape($a.shape, $b.shape);\n const inputs = { a: $a, b: $b };\n return ENGINE.runKernel(Greater, inputs);\n}\nexport const greater = op({ greater_ });\n//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZ3JlYXRlci5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uLy4uL3RmanMtY29yZS9zcmMvb3BzL2dyZWF0ZXIudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUE7Ozs7Ozs7Ozs7Ozs7OztHQWVHO0FBQ0gsT0FBTyxFQUFDLE1BQU0sRUFBQyxNQUFNLFdBQVcsQ0FBQztBQUNqQyxPQUFPLEVBQUMsT0FBTyxFQUFnQixNQUFNLGlCQUFpQixDQUFDO0FBR3ZELE9BQU8sRUFBQyxjQUFjLEVBQUMsTUFBTSxnQkFBZ0IsQ0FBQztBQUM5QyxPQUFPLEVBQUMsZUFBZSxFQUFDLE1BQU0sb0JBQW9CLENBQUM7QUFHbkQsT0FBTyxFQUFDLDBCQUEwQixFQUFDLE1BQU0sa0JBQWtCLENBQUM7QUFDNUQsT0FBTyxFQUFDLEVBQUUsRUFBQyxNQUFNLGFBQWEsQ0FBQztBQUUvQjs7Ozs7Ozs7Ozs7Ozs7R0FjRztBQUNILFNBQVMsUUFBUSxDQUNiLENBQW9CLEVBQUUsQ0FBb0I7SUFDNUMsSUFBSSxFQUFFLEdBQUcsZUFBZSxDQUFDLENBQUMsRUFBRSxHQUFHLEVBQUUsU0FBUyxFQUFFLG1CQUFtQixDQUFDLENBQUM7SUFDakUsSUFBSSxFQUFFLEdBQUcsZUFBZSxDQUFDLENBQUMsRUFBRSxHQUFHLEVBQUUsU0FBUyxFQUFFLG1CQUFtQixDQUFDLENBQUM7SUFDakUsQ0FBQyxFQUFFLEVBQUUsRUFBRSxDQUFDLEdBQUcsY0FBYyxDQUFDLEVBQUUsRUFBRSxFQUFFLENBQUMsQ0FBQztJQUVsQywwQkFBMEIsQ0FBQyxFQUFFLENBQUMsS0FBSyxFQUFFLEVBQUUsQ0FBQyxLQUFLLENBQUMsQ0FBQztJQUUvQyxNQUFNLE1BQU0sR0FBa0IsRUFBQyxDQUFDLEVBQUUsRUFBRSxFQUFFLENBQUMsRUFBRSxFQUFFLEVBQUMsQ0FBQztJQUU3QyxPQUFPLE1BQU0sQ0FBQyxTQUFTLENBQUMsT0FBTyxFQUFFLE1BQThCLENBQUMsQ0FBQztBQUNuRSxDQUFDO0FBRUQsTUFBTSxDQUFDLE1BQU0sT0FBTyxHQUFHLEVBQUUsQ0FBQyxFQUFDLFFBQVEsRUFBQyxDQUFDLENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyIvKipcbiAqIEBsaWNlbnNlXG4gKiBDb3B5cmlnaHQgMjAyMCBHb29nbGUgTExDLiBBbGwgUmlnaHRzIFJlc2VydmVkLlxuICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlIFwiTGljZW5zZVwiKTtcbiAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS5cbiAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdFxuICpcbiAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMFxuICpcbiAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmVcbiAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuIFwiQVMgSVNcIiBCQVNJUyxcbiAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLlxuICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZFxuICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuXG4gKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuICovXG5pbXBvcnQge0VOR0lORX0gZnJvbSAnLi4vZW5naW5lJztcbmltcG9ydCB7R3JlYXRlciwgR3JlYXRlcklucHV0c30gZnJvbSAnLi4va2VybmVsX25hbWVzJztcbmltcG9ydCB7VGVuc29yfSBmcm9tICcuLi90ZW5zb3InO1xuaW1wb3J0IHtOYW1lZFRlbnNvck1hcH0gZnJvbSAnLi4vdGVuc29yX3R5cGVzJztcbmltcG9ydCB7bWFrZVR5cGVzTWF0Y2h9IGZyb20gJy4uL3RlbnNvcl91dGlsJztcbmltcG9ydCB7Y29udmVydFRvVGVuc29yfSBmcm9tICcuLi90ZW5zb3JfdXRpbF9lbnYnO1xuaW1wb3J0IHtUZW5zb3JMaWtlfSBmcm9tICcuLi90eXBlcyc7XG5cbmltcG9ydCB7YXNzZXJ0QW5kR2V0QnJvYWRjYXN0U2hhcGV9IGZyb20gJy4vYnJvYWRjYXN0X3V0aWwnO1xuaW1wb3J0IHtvcH0gZnJvbSAnLi9vcGVyYXRpb24nO1xuXG4vKipcbiAqIFJldHVybnMgdGhlIHRydXRoIHZhbHVlIG9mIChhID4gYikgZWxlbWVudC13aXNlLiBTdXBwb3J0cyBicm9hZGNhc3RpbmcuXG4gKlxuICogYGBganNcbiAqIGNvbnN0IGEgPSB0Zi50ZW5zb3IxZChbMSwgMiwgM10pO1xuICogY29uc3QgYiA9IHRmLnRlbnNvcjFkKFsyLCAyLCAyXSk7XG4gKlxuICogYS5ncmVhdGVyKGIpLnByaW50KCk7XG4gKiBgYGBcbiAqXG4gKiBAcGFyYW0gYSBUaGUgZmlyc3QgaW5wdXQgdGVuc29yLlxuICogQHBhcmFtIGIgVGhlIHNlY29uZCBpbnB1dCB0ZW5zb3IuIE11c3QgaGF2ZSB0aGUgc2FtZSBkdHlwZSBhcyBgYWAuXG4gKlxuICogQGRvYyB7aGVhZGluZzogJ09wZXJhdGlvbnMnLCBzdWJoZWFkaW5nOiAnTG9naWNhbCd9XG4gKi9cbmZ1bmN0aW9uIGdyZWF0ZXJfPFQgZXh0ZW5kcyBUZW5zb3I+KFxuICAgIGE6IFRlbnNvcnxUZW5zb3JMaWtlLCBiOiBUZW5zb3J8VGVuc29yTGlrZSk6IFQge1xuICBsZXQgJGEgPSBjb252ZXJ0VG9UZW5zb3IoYSwgJ2EnLCAnZ3JlYXRlcicsICdzdHJpbmdfb3JfbnVtZXJpYycpO1xuICBsZXQgJGIgPSBjb252ZXJ0VG9UZW5zb3IoYiwgJ2InLCAnZ3JlYXRlcicsICdzdHJpbmdfb3JfbnVtZXJpYycpO1xuICBbJGEsICRiXSA9IG1ha2VUeXBlc01hdGNoKCRhLCAkYik7XG5cbiAgYXNzZXJ0QW5kR2V0QnJvYWRjYXN0U2hhcGUoJGEuc2hhcGUsICRiLnNoYXBlKTtcblxuICBjb25zdCBpbnB1dHM6IEdyZWF0ZXJJbnB1dHMgPSB7YTogJGEsIGI6ICRifTtcblxuICByZXR1cm4gRU5HSU5FLnJ1bktlcm5lbChHcmVhdGVyLCBpbnB1dHMgYXMge30gYXMgTmFtZWRUZW5zb3JNYXApO1xufVxuXG5leHBvcnQgY29uc3QgZ3JlYXRlciA9IG9wKHtncmVhdGVyX30pO1xuIl19","/**\n * @license\n * Copyright 2020 Google LLC. All Rights Reserved.\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n * =============================================================================\n */\nimport { ENGINE } from '../engine';\nimport { GreaterEqual } from '../kernel_names';\nimport { makeTypesMatch } from '../tensor_util';\nimport { convertToTensor } from '../tensor_util_env';\nimport { assertAndGetBroadcastShape } from './broadcast_util';\nimport { op } from './operation';\n/**\n * Returns the truth value of (a >= b) element-wise. Supports broadcasting.\n *\n * ```js\n * const a = tf.tensor1d([1, 2, 3]);\n * const b = tf.tensor1d([2, 2, 2]);\n *\n * a.greaterEqual(b).print();\n * ```\n *\n * @param a The first input tensor.\n * @param b The second input tensor. Must have the same dtype as `a`.\n *\n * @doc {heading: 'Operations', subheading: 'Logical'}\n */\nfunction greaterEqual_(a, b) {\n let $a = convertToTensor(a, 'a', 'greaterEqual', 'string_or_numeric');\n let $b = convertToTensor(b, 'b', 'greaterEqual', 'string_or_numeric');\n [$a, $b] = makeTypesMatch($a, $b);\n assertAndGetBroadcastShape($a.shape, $b.shape);\n const inputs = { a: $a, b: $b };\n return ENGINE.runKernel(GreaterEqual, inputs);\n}\nexport const greaterEqual = op({ greaterEqual_ });\n//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZ3JlYXRlcl9lcXVhbC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uLy4uL3RmanMtY29yZS9zcmMvb3BzL2dyZWF0ZXJfZXF1YWwudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUE7Ozs7Ozs7Ozs7Ozs7OztHQWVHO0FBQ0gsT0FBTyxFQUFDLE1BQU0sRUFBQyxNQUFNLFdBQVcsQ0FBQztBQUNqQyxPQUFPLEVBQUMsWUFBWSxFQUFxQixNQUFNLGlCQUFpQixDQUFDO0FBR2pFLE9BQU8sRUFBQyxjQUFjLEVBQUMsTUFBTSxnQkFBZ0IsQ0FBQztBQUM5QyxPQUFPLEVBQUMsZUFBZSxFQUFDLE1BQU0sb0JBQW9CLENBQUM7QUFHbkQsT0FBTyxFQUFDLDBCQUEwQixFQUFDLE1BQU0sa0JBQWtCLENBQUM7QUFDNUQsT0FBTyxFQUFDLEVBQUUsRUFBQyxNQUFNLGFBQWEsQ0FBQztBQUUvQjs7Ozs7Ozs7Ozs7Ozs7R0FjRztBQUNILFNBQVMsYUFBYSxDQUNsQixDQUFvQixFQUFFLENBQW9CO0lBQzVDLElBQUksRUFBRSxHQUFHLGVBQWUsQ0FBQyxDQUFDLEVBQUUsR0FBRyxFQUFFLGNBQWMsRUFBRSxtQkFBbUIsQ0FBQyxDQUFDO0lBQ3RFLElBQUksRUFBRSxHQUFHLGVBQWUsQ0FBQyxDQUFDLEVBQUUsR0FBRyxFQUFFLGNBQWMsRUFBRSxtQkFBbUIsQ0FBQyxDQUFDO0lBQ3RFLENBQUMsRUFBRSxFQUFFLEVBQUUsQ0FBQyxHQUFHLGNBQWMsQ0FBQyxFQUFFLEVBQUUsRUFBRSxDQUFDLENBQUM7SUFFbEMsMEJBQTBCLENBQUMsRUFBRSxDQUFDLEtBQUssRUFBRSxFQUFFLENBQUMsS0FBSyxDQUFDLENBQUM7SUFFL0MsTUFBTSxNQUFNLEdBQXVCLEVBQUMsQ0FBQyxFQUFFLEVBQUUsRUFBRSxDQUFDLEVBQUUsRUFBRSxFQUFDLENBQUM7SUFFbEQsT0FBTyxNQUFNLENBQUMsU0FBUyxDQUFDLFlBQVksRUFBRSxNQUE4QixDQUFDLENBQUM7QUFDeEUsQ0FBQztBQUVELE1BQU0sQ0FBQyxNQUFNLFlBQVksR0FBRyxFQUFFLENBQUMsRUFBQyxhQUFhLEVBQUMsQ0FBQyxDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiLyoqXG4gKiBAbGljZW5zZVxuICogQ29weXJpZ2h0IDIwMjAgR29vZ2xlIExMQy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC5cbiAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSBcIkxpY2Vuc2VcIik7XG4gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuXG4gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXRcbiAqXG4gKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjBcbiAqXG4gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlXG4gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiBcIkFTIElTXCIgQkFTSVMsXG4gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC5cbiAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmRcbiAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLlxuICogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbiAqL1xuaW1wb3J0IHtFTkdJTkV9IGZyb20gJy4uL2VuZ2luZSc7XG5pbXBvcnQge0dyZWF0ZXJFcXVhbCwgR3JlYXRlckVxdWFsSW5wdXRzfSBmcm9tICcuLi9rZXJuZWxfbmFtZXMnO1xuaW1wb3J0IHtUZW5zb3J9IGZyb20gJy4uL3RlbnNvcic7XG5pbXBvcnQge05hbWVkVGVuc29yTWFwfSBmcm9tICcuLi90ZW5zb3JfdHlwZXMnO1xuaW1wb3J0IHttYWtlVHlwZXNNYXRjaH0gZnJvbSAnLi4vdGVuc29yX3V0aWwnO1xuaW1wb3J0IHtjb252ZXJ0VG9UZW5zb3J9IGZyb20gJy4uL3RlbnNvcl91dGlsX2Vudic7XG5pbXBvcnQge1RlbnNvckxpa2V9IGZyb20gJy4uL3R5cGVzJztcblxuaW1wb3J0IHthc3NlcnRBbmRHZXRCcm9hZGNhc3RTaGFwZX0gZnJvbSAnLi9icm9hZGNhc3RfdXRpbCc7XG5pbXBvcnQge29wfSBmcm9tICcuL29wZXJhdGlvbic7XG5cbi8qKlxuICogUmV0dXJucyB0aGUgdHJ1dGggdmFsdWUgb2YgKGEgPj0gYikgZWxlbWVudC13aXNlLiBTdXBwb3J0cyBicm9hZGNhc3RpbmcuXG4gKlxuICogYGBganNcbiAqIGNvbnN0IGEgPSB0Zi50ZW5zb3IxZChbMSwgMiwgM10pO1xuICogY29uc3QgYiA9IHRmLnRlbnNvcjFkKFsyLCAyLCAyXSk7XG4gKlxuICogYS5ncmVhdGVyRXF1YWwoYikucHJpbnQoKTtcbiAqIGBgYFxuICpcbiAqIEBwYXJhbSBhIFRoZSBmaXJzdCBpbnB1dCB0ZW5zb3IuXG4gKiBAcGFyYW0gYiBUaGUgc2Vjb25kIGlucHV0IHRlbnNvci4gTXVzdCBoYXZlIHRoZSBzYW1lIGR0eXBlIGFzIGBhYC5cbiAqXG4gKiBAZG9jIHtoZWFkaW5nOiAnT3BlcmF0aW9ucycsIHN1YmhlYWRpbmc6ICdMb2dpY2FsJ31cbiAqL1xuZnVuY3Rpb24gZ3JlYXRlckVxdWFsXzxUIGV4dGVuZHMgVGVuc29yPihcbiAgICBhOiBUZW5zb3J8VGVuc29yTGlrZSwgYjogVGVuc29yfFRlbnNvckxpa2UpOiBUIHtcbiAgbGV0ICRhID0gY29udmVydFRvVGVuc29yKGEsICdhJywgJ2dyZWF0ZXJFcXVhbCcsICdzdHJpbmdfb3JfbnVtZXJpYycpO1xuICBsZXQgJGIgPSBjb252ZXJ0VG9UZW5zb3IoYiwgJ2InLCAnZ3JlYXRlckVxdWFsJywgJ3N0cmluZ19vcl9udW1lcmljJyk7XG4gIFskYSwgJGJdID0gbWFrZVR5cGVzTWF0Y2goJGEsICRiKTtcblxuICBhc3NlcnRBbmRHZXRCcm9hZGNhc3RTaGFwZSgkYS5zaGFwZSwgJGIuc2hhcGUpO1xuXG4gIGNvbnN0IGlucHV0czogR3JlYXRlckVxdWFsSW5wdXRzID0ge2E6ICRhLCBiOiAkYn07XG5cbiAgcmV0dXJuIEVOR0lORS5ydW5LZXJuZWwoR3JlYXRlckVxdWFsLCBpbnB1dHMgYXMge30gYXMgTmFtZWRUZW5zb3JNYXApO1xufVxuXG5leHBvcnQgY29uc3QgZ3JlYXRlckVxdWFsID0gb3Aoe2dyZWF0ZXJFcXVhbF99KTtcbiJdfQ==","/**\n * @license\n * Copyright 2020 Google LLC. All Rights Reserved.\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n * =============================================================================\n */\nimport { ENGINE } from '../engine';\nimport { Imag } from '../kernel_names';\nimport { convertToTensor } from '../tensor_util_env';\nimport { op } from './operation';\n/**\n * Returns the imaginary part of a complex (or real) tensor.\n *\n * Given a tensor input, this operation returns a tensor of type float that is\n * the imaginary part of each element in input considered as a complex number.\n * If input is real, a tensor of all zeros is returned.\n *\n * ```js\n * const x = tf.complex([-2.25, 3.25], [4.75, 5.75]);\n * tf.imag(x).print();\n * ```\n *\n * @doc {heading: 'Tensors', subheading: 'Creation'}\n */\nfunction imag_(input) {\n const $input = convertToTensor(input, 'input', 'imag');\n const inputs = { input: $input };\n return ENGINE.runKernel(Imag, inputs);\n}\nexport const imag = op({ imag_ });\n//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW1hZy5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uLy4uL3RmanMtY29yZS9zcmMvb3BzL2ltYWcudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUE7Ozs7Ozs7Ozs7Ozs7OztHQWVHO0FBRUgsT0FBTyxFQUFDLE1BQU0sRUFBQyxNQUFNLFdBQVcsQ0FBQztBQUNqQyxPQUFPLEVBQUMsSUFBSSxFQUFhLE1BQU0saUJBQWlCLENBQUM7QUFHakQsT0FBTyxFQUFDLGVBQWUsRUFBQyxNQUFNLG9CQUFvQixDQUFDO0FBRW5ELE9BQU8sRUFBQyxFQUFFLEVBQUMsTUFBTSxhQUFhLENBQUM7QUFDL0I7Ozs7Ozs7Ozs7Ozs7R0FhRztBQUNILFNBQVMsS0FBSyxDQUFtQixLQUFtQjtJQUNsRCxNQUFNLE1BQU0sR0FBRyxlQUFlLENBQUMsS0FBSyxFQUFFLE9BQU8sRUFBRSxNQUFNLENBQUMsQ0FBQztJQUV2RCxNQUFNLE1BQU0sR0FBZSxFQUFDLEtBQUssRUFBRSxNQUFNLEVBQUMsQ0FBQztJQUMzQyxPQUFPLE1BQU0sQ0FBQyxTQUFTLENBQUMsSUFBSSxFQUFFLE1BQThCLENBQUMsQ0FBQztBQUNoRSxDQUFDO0FBRUQsTUFBTSxDQUFDLE1BQU0sSUFBSSxHQUFHLEVBQUUsQ0FBQyxFQUFDLEtBQUssRUFBQyxDQUFDLENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyIvKipcbiAqIEBsaWNlbnNlXG4gKiBDb3B5cmlnaHQgMjAyMCBHb29nbGUgTExDLiBBbGwgUmlnaHRzIFJlc2VydmVkLlxuICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlIFwiTGljZW5zZVwiKTtcbiAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS5cbiAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdFxuICpcbiAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMFxuICpcbiAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmVcbiAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuIFwiQVMgSVNcIiBCQVNJUyxcbiAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLlxuICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZFxuICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuXG4gKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuICovXG5cbmltcG9ydCB7RU5HSU5FfSBmcm9tICcuLi9lbmdpbmUnO1xuaW1wb3J0IHtJbWFnLCBJbWFnSW5wdXRzfSBmcm9tICcuLi9rZXJuZWxfbmFtZXMnO1xuaW1wb3J0IHtUZW5zb3J9IGZyb20gJy4uL3RlbnNvcic7XG5pbXBvcnQge05hbWVkVGVuc29yTWFwfSBmcm9tICcuLi90ZW5zb3JfdHlwZXMnO1xuaW1wb3J0IHtjb252ZXJ0VG9UZW5zb3J9IGZyb20gJy4uL3RlbnNvcl91dGlsX2Vudic7XG5pbXBvcnQge1RlbnNvckxpa2V9IGZyb20gJy4uL3R5cGVzJztcbmltcG9ydCB7b3B9IGZyb20gJy4vb3BlcmF0aW9uJztcbi8qKlxuICogUmV0dXJucyB0aGUgaW1hZ2luYXJ5IHBhcnQgb2YgYSBjb21wbGV4IChvciByZWFsKSB0ZW5zb3IuXG4gKlxuICogR2l2ZW4gYSB0ZW5zb3IgaW5wdXQsIHRoaXMgb3BlcmF0aW9uIHJldHVybnMgYSB0ZW5zb3Igb2YgdHlwZSBmbG9hdCB0aGF0IGlzXG4gKiB0aGUgaW1hZ2luYXJ5IHBhcnQgb2YgZWFjaCBlbGVtZW50IGluIGlucHV0IGNvbnNpZGVyZWQgYXMgYSBjb21wbGV4IG51bWJlci5cbiAqIElmIGlucHV0IGlzIHJlYWwsIGEgdGVuc29yIG9mIGFsbCB6ZXJvcyBpcyByZXR1cm5lZC5cbiAqXG4gKiBgYGBqc1xuICogY29uc3QgeCA9IHRmLmNvbXBsZXgoWy0yLjI1LCAzLjI1XSwgWzQuNzUsIDUuNzVdKTtcbiAqIHRmLmltYWcoeCkucHJpbnQoKTtcbiAqIGBgYFxuICpcbiAqIEBkb2Mge2hlYWRpbmc6ICdUZW5zb3JzJywgc3ViaGVhZGluZzogJ0NyZWF0aW9uJ31cbiAqL1xuZnVuY3Rpb24gaW1hZ188VCBleHRlbmRzIFRlbnNvcj4oaW5wdXQ6IFR8VGVuc29yTGlrZSk6IFQge1xuICBjb25zdCAkaW5wdXQgPSBjb252ZXJ0VG9UZW5zb3IoaW5wdXQsICdpbnB1dCcsICdpbWFnJyk7XG5cbiAgY29uc3QgaW5wdXRzOiBJbWFnSW5wdXRzID0ge2lucHV0OiAkaW5wdXR9O1xuICByZXR1cm4gRU5HSU5FLnJ1bktlcm5lbChJbWFnLCBpbnB1dHMgYXMge30gYXMgTmFtZWRUZW5zb3JNYXApO1xufVxuXG5leHBvcnQgY29uc3QgaW1hZyA9IG9wKHtpbWFnX30pO1xuIl19","/**\n * @license\n * Copyright 2020 Google LLC. All Rights Reserved.\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n * =============================================================================\n */\nimport { ENGINE } from '../../engine';\nimport { ResizeBilinear } from '../../kernel_names';\nimport { convertToTensor } from '../../tensor_util_env';\nimport * as util from '../../util';\nimport { op } from '../operation';\nimport { reshape } from '../reshape';\n/**\n * Bilinear resize a single 3D image or a batch of 3D images to a new shape.\n *\n * @param images The images, of rank 4 or rank 3, of shape\n * `[batch, height, width, inChannels]`. If rank 3, batch of 1 is assumed.\n * @param size The new shape `[newHeight, newWidth]` to resize the\n * images to. Each channel is resized individually.\n * @param alignCorners Defaults to `false`. If true, rescale\n * input by `(new_height - 1) / (height - 1)`, which exactly aligns the 4\n * corners of images and resized images. If false, rescale by\n * `new_height / height`. Treat similarly the width dimension.\n * @param halfPixelCenters Defaults to `false`. Whether to assume pixel centers\n * are at 0.5, which would make the floating point coordinates of the top\n * left pixel 0.5, 0.5.\n *\n * @doc {heading: 'Operations', subheading: 'Images', namespace: 'image'}\n */\nfunction resizeBilinear_(images, size, alignCorners = false, halfPixelCenters = false) {\n const $images = convertToTensor(images, 'images', 'resizeBilinear');\n util.assert($images.rank === 3 || $images.rank === 4, () => `Error in resizeBilinear: x must be rank 3 or 4, but got ` +\n `rank ${$images.rank}.`);\n util.assert(size.length === 2, () => `Error in resizeBilinear: new shape must 2D, but got shape ` +\n `${size}.`);\n util.assert(halfPixelCenters === false || alignCorners === false, () => `Error in resizeBilinear: If halfPixelCenters is true, ` +\n `alignCorners must be false.`);\n let batchImages = $images;\n let reshapedTo4D = false;\n if ($images.rank === 3) {\n reshapedTo4D = true;\n batchImages = reshape($images, [1, $images.shape[0], $images.shape[1], $images.shape[2]]);\n }\n const [] = size;\n const inputs = { images: batchImages };\n const attrs = { alignCorners, halfPixelCenters, size };\n // tslint:disable-next-line: no-unnecessary-type-assertion\n const res = ENGINE.runKernel(ResizeBilinear, inputs, attrs);\n if (reshapedTo4D) {\n return reshape(res, [res.shape[1], res.shape[2], res.shape[3]]);\n }\n return res;\n}\nexport const resizeBilinear = op({ resizeBilinear_ });\n//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicmVzaXplX2JpbGluZWFyLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vLi4vLi4vdGZqcy1jb3JlL3NyYy9vcHMvaW1hZ2UvcmVzaXplX2JpbGluZWFyLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBOzs7Ozs7Ozs7Ozs7Ozs7R0FlRztBQUVILE9BQU8sRUFBQyxNQUFNLEVBQUMsTUFBTSxjQUFjLENBQUM7QUFDcEMsT0FBTyxFQUFDLGNBQWMsRUFBNEMsTUFBTSxvQkFBb0IsQ0FBQztBQUk3RixPQUFPLEVBQUMsZUFBZSxFQUFDLE1BQU0sdUJBQXVCLENBQUM7QUFFdEQsT0FBTyxLQUFLLElBQUksTUFBTSxZQUFZLENBQUM7QUFFbkMsT0FBTyxFQUFDLEVBQUUsRUFBQyxNQUFNLGNBQWMsQ0FBQztBQUNoQyxPQUFPLEVBQUMsT0FBTyxFQUFDLE1BQU0sWUFBWSxDQUFDO0FBRW5DOzs7Ozs7Ozs7Ozs7Ozs7O0dBZ0JHO0FBQ0gsU0FBUyxlQUFlLENBQ3BCLE1BQW9CLEVBQUUsSUFBc0IsRUFBRSxZQUFZLEdBQUcsS0FBSyxFQUNsRSxnQkFBZ0IsR0FBRyxLQUFLO0lBQzFCLE1BQU0sT0FBTyxHQUFHLGVBQWUsQ0FBQyxNQUFNLEVBQUUsUUFBUSxFQUFFLGdCQUFnQixDQUFDLENBQUM7SUFFcEUsSUFBSSxDQUFDLE1BQU0sQ0FDUCxPQUFPLENBQUMsSUFBSSxLQUFLLENBQUMsSUFBSSxPQUFPLENBQUMsSUFBSSxLQUFLLENBQUMsRUFDeEMsR0FBRyxFQUFFLENBQUMsMERBQTBEO1FBQzVELFFBQVEsT0FBTyxDQUFDLElBQUksR0FBRyxDQUFDLENBQUM7SUFDakMsSUFBSSxDQUFDLE1BQU0sQ0FDUCxJQUFJLENBQUMsTUFBTSxLQUFLLENBQUMsRUFDakIsR0FBRyxFQUFFLENBQUMsNERBQTREO1FBQzlELEdBQUcsSUFBSSxHQUFHLENBQUMsQ0FBQztJQUNwQixJQUFJLENBQUMsTUFBTSxDQUNQLGdCQUFnQixLQUFLLEtBQUssSUFBSSxZQUFZLEtBQUssS0FBSyxFQUNwRCxHQUFHLEVBQUUsQ0FBQyx3REFBd0Q7UUFDMUQsNkJBQTZCLENBQUMsQ0FBQztJQUV2QyxJQUFJLFdBQVcsR0FBRyxPQUFtQixDQUFDO0lBQ3RDLElBQUksWUFBWSxHQUFHLEtBQUssQ0FBQztJQUN6QixJQUFJLE9BQU8sQ0FBQyxJQUFJLEtBQUssQ0FBQyxFQUFFO1FBQ3RCLFlBQVksR0FBRyxJQUFJLENBQUM7UUFDcEIsV0FBVyxHQUFHLE9BQU8sQ0FDakIsT0FBTyxFQUFFLENBQUMsQ0FBQyxFQUFFLE9BQU8sQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDLEVBQUUsT0FBTyxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUMsRUFBRSxPQUFPLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQztLQUN6RTtJQUVELE1BQU0sRUFBRSxHQUFHLElBQUksQ0FBQztJQUVoQixNQUFNLE1BQU0sR0FBeUIsRUFBQyxNQUFNLEVBQUUsV0FBVyxFQUFDLENBQUM7SUFDM0QsTUFBTSxLQUFLLEdBQXdCLEVBQUMsWUFBWSxFQUFFLGdCQUFnQixFQUFFLElBQUksRUFBQyxDQUFDO0lBRTFFLDBEQUEwRDtJQUMxRCxNQUFNLEdBQUcsR0FBRyxNQUFNLENBQUMsU0FBUyxDQUNaLGNBQWMsRUFBRSxNQUE4QixFQUM5QyxLQUEyQixDQUFNLENBQUM7SUFFbEQsSUFBSSxZQUFZLEVBQUU7UUFDaEIsT0FBTyxPQUFPLENBQUMsR0FBRyxFQUFFLENBQUMsR0FBRyxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUMsRUFBRSxHQUFHLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQyxFQUFFLEdBQUcsQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBTSxDQUFDO0tBQ3RFO0lBQ0QsT0FBTyxHQUFHLENBQUM7QUFDYixDQUFDO0FBRUQsTUFBTSxDQUFDLE1BQU0sY0FBYyxHQUFHLEVBQUUsQ0FBQyxFQUFDLGVBQWUsRUFBQyxDQUFDLENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyIvKipcbiAqIEBsaWNlbnNlXG4gKiBDb3B5cmlnaHQgMjAyMCBHb29nbGUgTExDLiBBbGwgUmlnaHRzIFJlc2VydmVkLlxuICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlIFwiTGljZW5zZVwiKTtcbiAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS5cbiAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdFxuICpcbiAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMFxuICpcbiAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmVcbiAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuIFwiQVMgSVNcIiBCQVNJUyxcbiAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLlxuICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZFxuICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuXG4gKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuICovXG5cbmltcG9ydCB7RU5HSU5FfSBmcm9tICcuLi8uLi9lbmdpbmUnO1xuaW1wb3J0IHtSZXNpemVCaWxpbmVhciwgUmVzaXplQmlsaW5lYXJBdHRycywgUmVzaXplQmlsaW5lYXJJbnB1dHN9IGZyb20gJy4uLy4uL2tlcm5lbF9uYW1lcyc7XG5pbXBvcnQge05hbWVkQXR0ck1hcH0gZnJvbSAnLi4vLi4va2VybmVsX3JlZ2lzdHJ5JztcbmltcG9ydCB7VGVuc29yM0QsIFRlbnNvcjREfSBmcm9tICcuLi8uLi90ZW5zb3InO1xuaW1wb3J0IHtOYW1lZFRlbnNvck1hcH0gZnJvbSAnLi4vLi4vdGVuc29yX3R5cGVzJztcbmltcG9ydCB7Y29udmVydFRvVGVuc29yfSBmcm9tICcuLi8uLi90ZW5zb3JfdXRpbF9lbnYnO1xuaW1wb3J0IHtUZW5zb3JMaWtlfSBmcm9tICcuLi8uLi90eXBlcyc7XG5pbXBvcnQgKiBhcyB1dGlsIGZyb20gJy4uLy4uL3V0aWwnO1xuXG5pbXBvcnQge29wfSBmcm9tICcuLi9vcGVyYXRpb24nO1xuaW1wb3J0IHtyZXNoYXBlfSBmcm9tICcuLi9yZXNoYXBlJztcblxuLyoqXG4gKiBCaWxpbmVhciByZXNpemUgYSBzaW5nbGUgM0QgaW1hZ2Ugb3IgYSBiYXRjaCBvZiAzRCBpbWFnZXMgdG8gYSBuZXcgc2hhcGUuXG4gKlxuICogQHBhcmFtIGltYWdlcyBUaGUgaW1hZ2VzLCBvZiByYW5rIDQgb3IgcmFuayAzLCBvZiBzaGFwZVxuICogICAgIGBbYmF0Y2gsIGhlaWdodCwgd2lkdGgsIGluQ2hhbm5lbHNdYC4gSWYgcmFuayAzLCBiYXRjaCBvZiAxIGlzIGFzc3VtZWQuXG4gKiBAcGFyYW0gc2l6ZSBUaGUgbmV3IHNoYXBlIGBbbmV3SGVpZ2h0LCBuZXdXaWR0aF1gIHRvIHJlc2l6ZSB0aGVcbiAqICAgICBpbWFnZXMgdG8uIEVhY2ggY2hhbm5lbCBpcyByZXNpemVkIGluZGl2aWR1YWxseS5cbiAqIEBwYXJhbSBhbGlnbkNvcm5lcnMgRGVmYXVsdHMgdG8gYGZhbHNlYC4gSWYgdHJ1ZSwgcmVzY2FsZVxuICogICAgIGlucHV0IGJ5IGAobmV3X2hlaWdodCAtIDEpIC8gKGhlaWdodCAtIDEpYCwgd2hpY2ggZXhhY3RseSBhbGlnbnMgdGhlIDRcbiAqICAgICBjb3JuZXJzIG9mIGltYWdlcyBhbmQgcmVzaXplZCBpbWFnZXMuIElmIGZhbHNlLCByZXNjYWxlIGJ5XG4gKiAgICAgYG5ld19oZWlnaHQgLyBoZWlnaHRgLiBUcmVhdCBzaW1pbGFybHkgdGhlIHdpZHRoIGRpbWVuc2lvbi5cbiAqIEBwYXJhbSBoYWxmUGl4ZWxDZW50ZXJzIERlZmF1bHRzIHRvIGBmYWxzZWAuIFdoZXRoZXIgdG8gYXNzdW1lIHBpeGVsIGNlbnRlcnNcbiAqICAgICBhcmUgYXQgMC41LCB3aGljaCB3b3VsZCBtYWtlIHRoZSBmbG9hdGluZyBwb2ludCBjb29yZGluYXRlcyBvZiB0aGUgdG9wXG4gKiAgICAgbGVmdCBwaXhlbCAwLjUsIDAuNS5cbiAqXG4gKiBAZG9jIHtoZWFkaW5nOiAnT3BlcmF0aW9ucycsIHN1YmhlYWRpbmc6ICdJbWFnZXMnLCBuYW1lc3BhY2U6ICdpbWFnZSd9XG4gKi9cbmZ1bmN0aW9uIHJlc2l6ZUJpbGluZWFyXzxUIGV4dGVuZHMgVGVuc29yM0R8VGVuc29yNEQ+KFxuICAgIGltYWdlczogVHxUZW5zb3JMaWtlLCBzaXplOiBbbnVtYmVyLCBudW1iZXJdLCBhbGlnbkNvcm5lcnMgPSBmYWxzZSxcbiAgICBoYWxmUGl4ZWxDZW50ZXJzID0gZmFsc2UpOiBUIHtcbiAgY29uc3QgJGltYWdlcyA9IGNvbnZlcnRUb1RlbnNvcihpbWFnZXMsICdpbWFnZXMnLCAncmVzaXplQmlsaW5lYXInKTtcblxuICB1dGlsLmFzc2VydChcbiAgICAgICRpbWFnZXMucmFuayA9PT0gMyB8fCAkaW1hZ2VzLnJhbmsgPT09IDQsXG4gICAgICAoKSA9PiBgRXJyb3IgaW4gcmVzaXplQmlsaW5lYXI6IHggbXVzdCBiZSByYW5rIDMgb3IgNCwgYnV0IGdvdCBgICtcbiAgICAgICAgICBgcmFuayAkeyRpbWFnZXMucmFua30uYCk7XG4gIHV0aWwuYXNzZXJ0KFxuICAgICAgc2l6ZS5sZW5ndGggPT09IDIsXG4gICAgICAoKSA9PiBgRXJyb3IgaW4gcmVzaXplQmlsaW5lYXI6IG5ldyBzaGFwZSBtdXN0IDJELCBidXQgZ290IHNoYXBlIGAgK1xuICAgICAgICAgIGAke3NpemV9LmApO1xuICB1dGlsLmFzc2VydChcbiAgICAgIGhhbGZQaXhlbENlbnRlcnMgPT09IGZhbHNlIHx8IGFsaWduQ29ybmVycyA9PT0gZmFsc2UsXG4gICAgICAoKSA9PiBgRXJyb3IgaW4gcmVzaXplQmlsaW5lYXI6IElmIGhhbGZQaXhlbENlbnRlcnMgaXMgdHJ1ZSwgYCArXG4gICAgICAgICAgYGFsaWduQ29ybmVycyBtdXN0IGJlIGZhbHNlLmApO1xuXG4gIGxldCBiYXRjaEltYWdlcyA9ICRpbWFnZXMgYXMgVGVuc29yNEQ7XG4gIGxldCByZXNoYXBlZFRvNEQgPSBmYWxzZTtcbiAgaWYgKCRpbWFnZXMucmFuayA9PT0gMykge1xuICAgIHJlc2hhcGVkVG80RCA9IHRydWU7XG4gICAgYmF0Y2hJbWFnZXMgPSByZXNoYXBlKFxuICAgICAgICAkaW1hZ2VzLCBbMSwgJGltYWdlcy5zaGFwZVswXSwgJGltYWdlcy5zaGFwZVsxXSwgJGltYWdlcy5zaGFwZVsyXV0pO1xuICB9XG5cbiAgY29uc3QgW10gPSBzaXplO1xuXG4gIGNvbnN0IGlucHV0czogUmVzaXplQmlsaW5lYXJJbnB1dHMgPSB7aW1hZ2VzOiBiYXRjaEltYWdlc307XG4gIGNvbnN0IGF0dHJzOiBSZXNpemVCaWxpbmVhckF0dHJzID0ge2FsaWduQ29ybmVycywgaGFsZlBpeGVsQ2VudGVycywgc2l6ZX07XG5cbiAgLy8gdHNsaW50OmRpc2FibGUtbmV4dC1saW5lOiBuby11bm5lY2Vzc2FyeS10eXBlLWFzc2VydGlvblxuICBjb25zdCByZXMgPSBFTkdJTkUucnVuS2VybmVsKFxuICAgICAgICAgICAgICAgICAgUmVzaXplQmlsaW5lYXIsIGlucHV0cyBhcyB7fSBhcyBOYW1lZFRlbnNvck1hcCxcbiAgICAgICAgICAgICAgICAgIGF0dHJzIGFzIHt9IGFzIE5hbWVkQXR0ck1hcCkgYXMgVDtcblxuICBpZiAocmVzaGFwZWRUbzREKSB7XG4gICAgcmV0dXJuIHJlc2hhcGUocmVzLCBbcmVzLnNoYXBlWzFdLCByZXMuc2hhcGVbMl0sIHJlcy5zaGFwZVszXV0pIGFzIFQ7XG4gIH1cbiAgcmV0dXJuIHJlcztcbn1cblxuZXhwb3J0IGNvbnN0IHJlc2l6ZUJpbGluZWFyID0gb3Aoe3Jlc2l6ZUJpbGluZWFyX30pO1xuIl19","/**\n * @license\n * Copyright 2020 Google LLC. All Rights Reserved.\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n * =============================================================================\n */\nimport { ENGINE } from '../../engine';\nimport { ResizeNearestNeighbor } from '../../kernel_names';\nimport { convertToTensor } from '../../tensor_util_env';\nimport * as util from '../../util';\nimport { op } from '../operation';\nimport { reshape } from '../reshape';\n/**\n * NearestNeighbor resize a batch of 3D images to a new shape.\n *\n * @param images The images, of rank 4 or rank 3, of shape\n * `[batch, height, width, inChannels]`. If rank 3, batch of 1 is assumed.\n * @param size The new shape `[newHeight, newWidth]` to resize the\n * images to. Each channel is resized individually.\n * @param alignCorners Defaults to False. If true, rescale\n * input by `(new_height - 1) / (height - 1)`, which exactly aligns the 4\n * corners of images and resized images. If false, rescale by\n * `new_height / height`. Treat similarly the width dimension.\n * @param halfPixelCenters Defaults to `false`. Whether to assume pixels are of\n * half the actual dimensions, and yield more accurate resizes. This flag\n * would also make the floating point coordinates of the top left pixel\n * 0.5, 0.5.\n *\n * @doc {heading: 'Operations', subheading: 'Images', namespace: 'image'}\n */\nfunction resizeNearestNeighbor_(images, size, alignCorners = false, halfPixelCenters = false) {\n const $images = convertToTensor(images, 'images', 'resizeNearestNeighbor');\n util.assert($images.rank === 3 || $images.rank === 4, () => `Error in resizeNearestNeighbor: x must be rank 3 or 4, but got ` +\n `rank ${$images.rank}.`);\n util.assert(size.length === 2, () => `Error in resizeNearestNeighbor: new shape must 2D, but got shape ` +\n `${size}.`);\n util.assert($images.dtype === 'float32' || $images.dtype === 'int32', () => '`images` must have `int32` or `float32` as dtype');\n util.assert(halfPixelCenters === false || alignCorners === false, () => `Error in resizeNearestNeighbor: If halfPixelCenters is true, ` +\n `alignCorners must be false.`);\n let batchImages = $images;\n let reshapedTo4D = false;\n if ($images.rank === 3) {\n reshapedTo4D = true;\n batchImages = reshape($images, [1, $images.shape[0], $images.shape[1], $images.shape[2]]);\n }\n const [] = size;\n const inputs = { images: batchImages };\n const attrs = { alignCorners, halfPixelCenters, size };\n // tslint:disable-next-line: no-unnecessary-type-assertion\n const res = ENGINE.runKernel(ResizeNearestNeighbor, inputs, attrs);\n if (reshapedTo4D) {\n return reshape(res, [res.shape[1], res.shape[2], res.shape[3]]);\n }\n return res;\n}\nexport const resizeNearestNeighbor = op({ resizeNearestNeighbor_ });\n//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicmVzaXplX25lYXJlc3RfbmVpZ2hib3IuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi8uLi8uLi90ZmpzLWNvcmUvc3JjL29wcy9pbWFnZS9yZXNpemVfbmVhcmVzdF9uZWlnaGJvci50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQTs7Ozs7Ozs7Ozs7Ozs7O0dBZUc7QUFFSCxPQUFPLEVBQUMsTUFBTSxFQUFDLE1BQU0sY0FBYyxDQUFDO0FBQ3BDLE9BQU8sRUFBQyxxQkFBcUIsRUFBMEQsTUFBTSxvQkFBb0IsQ0FBQztBQUlsSCxPQUFPLEVBQUMsZUFBZSxFQUFDLE1BQU0sdUJBQXVCLENBQUM7QUFFdEQsT0FBTyxLQUFLLElBQUksTUFBTSxZQUFZLENBQUM7QUFFbkMsT0FBTyxFQUFDLEVBQUUsRUFBQyxNQUFNLGNBQWMsQ0FBQztBQUNoQyxPQUFPLEVBQUMsT0FBTyxFQUFDLE1BQU0sWUFBWSxDQUFDO0FBRW5DOzs7Ozs7Ozs7Ozs7Ozs7OztHQWlCRztBQUNILFNBQVMsc0JBQXNCLENBQzNCLE1BQW9CLEVBQUUsSUFBc0IsRUFBRSxZQUFZLEdBQUcsS0FBSyxFQUNsRSxnQkFBZ0IsR0FBRyxLQUFLO0lBQzFCLE1BQU0sT0FBTyxHQUFHLGVBQWUsQ0FBQyxNQUFNLEVBQUUsUUFBUSxFQUFFLHVCQUF1QixDQUFDLENBQUM7SUFFM0UsSUFBSSxDQUFDLE1BQU0sQ0FDUCxPQUFPLENBQUMsSUFBSSxLQUFLLENBQUMsSUFBSSxPQUFPLENBQUMsSUFBSSxLQUFLLENBQUMsRUFDeEMsR0FBRyxFQUFFLENBQUMsaUVBQWlFO1FBQ25FLFFBQVEsT0FBTyxDQUFDLElBQUksR0FBRyxDQUFDLENBQUM7SUFDakMsSUFBSSxDQUFDLE1BQU0sQ0FDUCxJQUFJLENBQUMsTUFBTSxLQUFLLENBQUMsRUFDakIsR0FBRyxFQUFFLENBQ0QsbUVBQW1FO1FBQ25FLEdBQUcsSUFBSSxHQUFHLENBQUMsQ0FBQztJQUNwQixJQUFJLENBQUMsTUFBTSxDQUNQLE9BQU8sQ0FBQyxLQUFLLEtBQUssU0FBUyxJQUFJLE9BQU8sQ0FBQyxLQUFLLEtBQUssT0FBTyxFQUN4RCxHQUFHLEVBQUUsQ0FBQyxrREFBa0QsQ0FBQyxDQUFDO0lBQzlELElBQUksQ0FBQyxNQUFNLENBQ1AsZ0JBQWdCLEtBQUssS0FBSyxJQUFJLFlBQVksS0FBSyxLQUFLLEVBQ3BELEdBQUcsRUFBRSxDQUFDLCtEQUErRDtRQUNqRSw2QkFBNkIsQ0FBQyxDQUFDO0lBQ3ZDLElBQUksV0FBVyxHQUFHLE9BQW1CLENBQUM7SUFDdEMsSUFBSSxZQUFZLEdBQUcsS0FBSyxDQUFDO0lBQ3pCLElBQUksT0FBTyxDQUFDLElBQUksS0FBSyxDQUFDLEVBQUU7UUFDdEIsWUFBWSxHQUFHLElBQUksQ0FBQztRQUNwQixXQUFXLEdBQUcsT0FBTyxDQUNqQixPQUFPLEVBQUUsQ0FBQyxDQUFDLEVBQUUsT0FBTyxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUMsRUFBRSxPQUFPLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQyxFQUFFLE9BQU8sQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDO0tBQ3pFO0lBQ0QsTUFBTSxFQUFFLEdBQUcsSUFBSSxDQUFDO0lBRWhCLE1BQU0sTUFBTSxHQUFnQyxFQUFDLE1BQU0sRUFBRSxXQUFXLEVBQUMsQ0FBQztJQUNsRSxNQUFNLEtBQUssR0FDc0IsRUFBQyxZQUFZLEVBQUUsZ0JBQWdCLEVBQUUsSUFBSSxFQUFDLENBQUM7SUFFeEUsMERBQTBEO0lBQzFELE1BQU0sR0FBRyxHQUFHLE1BQU0sQ0FBQyxTQUFTLENBQ1oscUJBQXFCLEVBQUUsTUFBOEIsRUFDckQsS0FBMkIsQ0FBTSxDQUFDO0lBRWxELElBQUksWUFBWSxFQUFFO1FBQ2hCLE9BQU8sT0FBTyxDQUFDLEdBQUcsRUFBRSxDQUFDLEdBQUcsQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDLEVBQUUsR0FBRyxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUMsRUFBRSxHQUFHLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQU0sQ0FBQztLQUN0RTtJQUNELE9BQU8sR0FBRyxDQUFDO0FBQ2IsQ0FBQztBQUVELE1BQU0sQ0FBQyxNQUFNLHFCQUFxQixHQUFHLEVBQUUsQ0FBQyxFQUFDLHNCQUFzQixFQUFDLENBQUMsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbIi8qKlxuICogQGxpY2Vuc2VcbiAqIENvcHlyaWdodCAyMDIwIEdvb2dsZSBMTEMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuXG4gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgXCJMaWNlbnNlXCIpO1xuICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLlxuICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0XG4gKlxuICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wXG4gKlxuICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZVxuICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gXCJBUyBJU1wiIEJBU0lTLFxuICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuXG4gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kXG4gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS5cbiAqID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4gKi9cblxuaW1wb3J0IHtFTkdJTkV9IGZyb20gJy4uLy4uL2VuZ2luZSc7XG5pbXBvcnQge1Jlc2l6ZU5lYXJlc3ROZWlnaGJvciwgUmVzaXplTmVhcmVzdE5laWdoYm9yQXR0cnMsIFJlc2l6ZU5lYXJlc3ROZWlnaGJvcklucHV0c30gZnJvbSAnLi4vLi4va2VybmVsX25hbWVzJztcbmltcG9ydCB7TmFtZWRBdHRyTWFwfSBmcm9tICcuLi8uLi9rZXJuZWxfcmVnaXN0cnknO1xuaW1wb3J0IHtUZW5zb3IzRCwgVGVuc29yNER9IGZyb20gJy4uLy4uL3RlbnNvcic7XG5pbXBvcnQge05hbWVkVGVuc29yTWFwfSBmcm9tICcuLi8uLi90ZW5zb3JfdHlwZXMnO1xuaW1wb3J0IHtjb252ZXJ0VG9UZW5zb3J9IGZyb20gJy4uLy4uL3RlbnNvcl91dGlsX2Vudic7XG5pbXBvcnQge1RlbnNvckxpa2V9IGZyb20gJy4uLy4uL3R5cGVzJztcbmltcG9ydCAqIGFzIHV0aWwgZnJvbSAnLi4vLi4vdXRpbCc7XG5cbmltcG9ydCB7b3B9IGZyb20gJy4uL29wZXJhdGlvbic7XG5pbXBvcnQge3Jlc2hhcGV9IGZyb20gJy4uL3Jlc2hhcGUnO1xuXG4vKipcbiAqIE5lYXJlc3ROZWlnaGJvciByZXNpemUgYSBiYXRjaCBvZiAzRCBpbWFnZXMgdG8gYSBuZXcgc2hhcGUuXG4gKlxuICogQHBhcmFtIGltYWdlcyBUaGUgaW1hZ2VzLCBvZiByYW5rIDQgb3IgcmFuayAzLCBvZiBzaGFwZVxuICogICAgIGBbYmF0Y2gsIGhlaWdodCwgd2lkdGgsIGluQ2hhbm5lbHNdYC4gSWYgcmFuayAzLCBiYXRjaCBvZiAxIGlzIGFzc3VtZWQuXG4gKiBAcGFyYW0gc2l6ZSBUaGUgbmV3IHNoYXBlIGBbbmV3SGVpZ2h0LCBuZXdXaWR0aF1gIHRvIHJlc2l6ZSB0aGVcbiAqICAgICBpbWFnZXMgdG8uIEVhY2ggY2hhbm5lbCBpcyByZXNpemVkIGluZGl2aWR1YWxseS5cbiAqIEBwYXJhbSBhbGlnbkNvcm5lcnMgRGVmYXVsdHMgdG8gRmFsc2UuIElmIHRydWUsIHJlc2NhbGVcbiAqICAgICBpbnB1dCBieSBgKG5ld19oZWlnaHQgLSAxKSAvIChoZWlnaHQgLSAxKWAsIHdoaWNoIGV4YWN0bHkgYWxpZ25zIHRoZSA0XG4gKiAgICAgY29ybmVycyBvZiBpbWFnZXMgYW5kIHJlc2l6ZWQgaW1hZ2VzLiBJZiBmYWxzZSwgcmVzY2FsZSBieVxuICogICAgIGBuZXdfaGVpZ2h0IC8gaGVpZ2h0YC4gVHJlYXQgc2ltaWxhcmx5IHRoZSB3aWR0aCBkaW1lbnNpb24uXG4gKiBAcGFyYW0gaGFsZlBpeGVsQ2VudGVycyBEZWZhdWx0cyB0byBgZmFsc2VgLiBXaGV0aGVyIHRvIGFzc3VtZSBwaXhlbHMgYXJlIG9mXG4gKiAgICAgIGhhbGYgdGhlIGFjdHVhbCBkaW1lbnNpb25zLCBhbmQgeWllbGQgbW9yZSBhY2N1cmF0ZSByZXNpemVzLiBUaGlzIGZsYWdcbiAqICAgICAgd291bGQgYWxzbyBtYWtlIHRoZSBmbG9hdGluZyBwb2ludCBjb29yZGluYXRlcyBvZiB0aGUgdG9wIGxlZnQgcGl4ZWxcbiAqICAgICAgMC41LCAwLjUuXG4gKlxuICogQGRvYyB7aGVhZGluZzogJ09wZXJhdGlvbnMnLCBzdWJoZWFkaW5nOiAnSW1hZ2VzJywgbmFtZXNwYWNlOiAnaW1hZ2UnfVxuICovXG5mdW5jdGlvbiByZXNpemVOZWFyZXN0TmVpZ2hib3JfPFQgZXh0ZW5kcyBUZW5zb3IzRHxUZW5zb3I0RD4oXG4gICAgaW1hZ2VzOiBUfFRlbnNvckxpa2UsIHNpemU6IFtudW1iZXIsIG51bWJlcl0sIGFsaWduQ29ybmVycyA9IGZhbHNlLFxuICAgIGhhbGZQaXhlbENlbnRlcnMgPSBmYWxzZSk6IFQge1xuICBjb25zdCAkaW1hZ2VzID0gY29udmVydFRvVGVuc29yKGltYWdlcywgJ2ltYWdlcycsICdyZXNpemVOZWFyZXN0TmVpZ2hib3InKTtcblxuICB1dGlsLmFzc2VydChcbiAgICAgICRpbWFnZXMucmFuayA9PT0gMyB8fCAkaW1hZ2VzLnJhbmsgPT09IDQsXG4gICAgICAoKSA9PiBgRXJyb3IgaW4gcmVzaXplTmVhcmVzdE5laWdoYm9yOiB4IG11c3QgYmUgcmFuayAzIG9yIDQsIGJ1dCBnb3QgYCArXG4gICAgICAgICAgYHJhbmsgJHskaW1hZ2VzLnJhbmt9LmApO1xuICB1dGlsLmFzc2VydChcbiAgICAgIHNpemUubGVuZ3RoID09PSAyLFxuICAgICAgKCkgPT5cbiAgICAgICAgICBgRXJyb3IgaW4gcmVzaXplTmVhcmVzdE5laWdoYm9yOiBuZXcgc2hhcGUgbXVzdCAyRCwgYnV0IGdvdCBzaGFwZSBgICtcbiAgICAgICAgICBgJHtzaXplfS5gKTtcbiAgdXRpbC5hc3NlcnQoXG4gICAgICAkaW1hZ2VzLmR0eXBlID09PSAnZmxvYXQzMicgfHwgJGltYWdlcy5kdHlwZSA9PT0gJ2ludDMyJyxcbiAgICAgICgpID0+ICdgaW1hZ2VzYCBtdXN0IGhhdmUgYGludDMyYCBvciBgZmxvYXQzMmAgYXMgZHR5cGUnKTtcbiAgdXRpbC5hc3NlcnQoXG4gICAgICBoYWxmUGl4ZWxDZW50ZXJzID09PSBmYWxzZSB8fCBhbGlnbkNvcm5lcnMgPT09IGZhbHNlLFxuICAgICAgKCkgPT4gYEVycm9yIGluIHJlc2l6ZU5lYXJlc3ROZWlnaGJvcjogSWYgaGFsZlBpeGVsQ2VudGVycyBpcyB0cnVlLCBgICtcbiAgICAgICAgICBgYWxpZ25Db3JuZXJzIG11c3QgYmUgZmFsc2UuYCk7XG4gIGxldCBiYXRjaEltYWdlcyA9ICRpbWFnZXMgYXMgVGVuc29yNEQ7XG4gIGxldCByZXNoYXBlZFRvNEQgPSBmYWxzZTtcbiAgaWYgKCRpbWFnZXMucmFuayA9PT0gMykge1xuICAgIHJlc2hhcGVkVG80RCA9IHRydWU7XG4gICAgYmF0Y2hJbWFnZXMgPSByZXNoYXBlKFxuICAgICAgICAkaW1hZ2VzLCBbMSwgJGltYWdlcy5zaGFwZVswXSwgJGltYWdlcy5zaGFwZVsxXSwgJGltYWdlcy5zaGFwZVsyXV0pO1xuICB9XG4gIGNvbnN0IFtdID0gc2l6ZTtcblxuICBjb25zdCBpbnB1dHM6IFJlc2l6ZU5lYXJlc3ROZWlnaGJvcklucHV0cyA9IHtpbWFnZXM6IGJhdGNoSW1hZ2VzfTtcbiAgY29uc3QgYXR0cnM6XG4gICAgICBSZXNpemVOZWFyZXN0TmVpZ2hib3JBdHRycyA9IHthbGlnbkNvcm5lcnMsIGhhbGZQaXhlbENlbnRlcnMsIHNpemV9O1xuXG4gIC8vIHRzbGludDpkaXNhYmxlLW5leHQtbGluZTogbm8tdW5uZWNlc3NhcnktdHlwZS1hc3NlcnRpb25cbiAgY29uc3QgcmVzID0gRU5HSU5FLnJ1bktlcm5lbChcbiAgICAgICAgICAgICAgICAgIFJlc2l6ZU5lYXJlc3ROZWlnaGJvciwgaW5wdXRzIGFzIHt9IGFzIE5hbWVkVGVuc29yTWFwLFxuICAgICAgICAgICAgICAgICAgYXR0cnMgYXMge30gYXMgTmFtZWRBdHRyTWFwKSBhcyBUO1xuXG4gIGlmIChyZXNoYXBlZFRvNEQpIHtcbiAgICByZXR1cm4gcmVzaGFwZShyZXMsIFtyZXMuc2hhcGVbMV0sIHJlcy5zaGFwZVsyXSwgcmVzLnNoYXBlWzNdXSkgYXMgVDtcbiAgfVxuICByZXR1cm4gcmVzO1xufVxuXG5leHBvcnQgY29uc3QgcmVzaXplTmVhcmVzdE5laWdoYm9yID0gb3Aoe3Jlc2l6ZU5lYXJlc3ROZWlnaGJvcl99KTtcbiJdfQ==","/**\n * @license\n * Copyright 2018 Google LLC. All Rights Reserved.\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n * =============================================================================\n */\nimport { ENGINE } from '../engine';\nimport { IsFinite } from '../kernel_names';\nimport { convertToTensor } from '../tensor_util_env';\nimport { op } from './operation';\n/**\n * Returns which elements of x are finite.\n *\n * ```js\n * const x = tf.tensor1d([NaN, Infinity, -Infinity, 0, 1]);\n *\n * x.isFinite().print(); // or tf.isNaN(x)\n * ```\n * @param x The input Tensor.\n *\n * @doc {heading: 'Operations', subheading: 'Basic math'}\n */\nfunction isFinite_(x) {\n const $x = convertToTensor(x, 'x', 'isFinite');\n const inputs = { x: $x };\n return ENGINE.runKernel(IsFinite, inputs);\n}\nexport const isFinite = op({ isFinite_ });\n//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaXNfZmluaXRlLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vLi4vdGZqcy1jb3JlL3NyYy9vcHMvaXNfZmluaXRlLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBOzs7Ozs7Ozs7Ozs7Ozs7R0FlRztBQUVILE9BQU8sRUFBQyxNQUFNLEVBQUMsTUFBTSxXQUFXLENBQUM7QUFDakMsT0FBTyxFQUFDLFFBQVEsRUFBaUIsTUFBTSxpQkFBaUIsQ0FBQztBQUd6RCxPQUFPLEVBQUMsZUFBZSxFQUFDLE1BQU0sb0JBQW9CLENBQUM7QUFHbkQsT0FBTyxFQUFDLEVBQUUsRUFBQyxNQUFNLGFBQWEsQ0FBQztBQUUvQjs7Ozs7Ozs7Ozs7R0FXRztBQUNILFNBQVMsU0FBUyxDQUFtQixDQUFlO0lBQ2xELE1BQU0sRUFBRSxHQUFHLGVBQWUsQ0FBQyxDQUFDLEVBQUUsR0FBRyxFQUFFLFVBQVUsQ0FBQyxDQUFDO0lBRS9DLE1BQU0sTUFBTSxHQUFtQixFQUFDLENBQUMsRUFBRSxFQUFFLEVBQUMsQ0FBQztJQUV2QyxPQUFPLE1BQU0sQ0FBQyxTQUFTLENBQUMsUUFBUSxFQUFFLE1BQThCLENBQUMsQ0FBQztBQUNwRSxDQUFDO0FBQ0QsTUFBTSxDQUFDLE1BQU0sUUFBUSxHQUFHLEVBQUUsQ0FBQyxFQUFDLFNBQVMsRUFBQyxDQUFDLENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyIvKipcbiAqIEBsaWNlbnNlXG4gKiBDb3B5cmlnaHQgMjAxOCBHb29nbGUgTExDLiBBbGwgUmlnaHRzIFJlc2VydmVkLlxuICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlIFwiTGljZW5zZVwiKTtcbiAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS5cbiAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdFxuICpcbiAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMFxuICpcbiAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmVcbiAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuIFwiQVMgSVNcIiBCQVNJUyxcbiAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLlxuICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZFxuICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuXG4gKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuICovXG5cbmltcG9ydCB7RU5HSU5FfSBmcm9tICcuLi9lbmdpbmUnO1xuaW1wb3J0IHtJc0Zpbml0ZSwgSXNGaW5pdGVJbnB1dHN9IGZyb20gJy4uL2tlcm5lbF9uYW1lcyc7XG5pbXBvcnQge1RlbnNvcn0gZnJvbSAnLi4vdGVuc29yJztcbmltcG9ydCB7TmFtZWRUZW5zb3JNYXB9IGZyb20gJy4uL3RlbnNvcl90eXBlcyc7XG5pbXBvcnQge2NvbnZlcnRUb1RlbnNvcn0gZnJvbSAnLi4vdGVuc29yX3V0aWxfZW52JztcbmltcG9ydCB7VGVuc29yTGlrZX0gZnJvbSAnLi4vdHlwZXMnO1xuXG5pbXBvcnQge29wfSBmcm9tICcuL29wZXJhdGlvbic7XG5cbi8qKlxuICogUmV0dXJucyB3aGljaCBlbGVtZW50cyBvZiB4IGFyZSBmaW5pdGUuXG4gKlxuICogYGBganNcbiAqIGNvbnN0IHggPSB0Zi50ZW5zb3IxZChbTmFOLCBJbmZpbml0eSwgLUluZmluaXR5LCAwLCAxXSk7XG4gKlxuICogeC5pc0Zpbml0ZSgpLnByaW50KCk7ICAvLyBvciB0Zi5pc05hTih4KVxuICogYGBgXG4gKiBAcGFyYW0geCBUaGUgaW5wdXQgVGVuc29yLlxuICpcbiAqIEBkb2Mge2hlYWRpbmc6ICdPcGVyYXRpb25zJywgc3ViaGVhZGluZzogJ0Jhc2ljIG1hdGgnfVxuICovXG5mdW5jdGlvbiBpc0Zpbml0ZV88VCBleHRlbmRzIFRlbnNvcj4oeDogVHxUZW5zb3JMaWtlKTogVCB7XG4gIGNvbnN0ICR4ID0gY29udmVydFRvVGVuc29yKHgsICd4JywgJ2lzRmluaXRlJyk7XG5cbiAgY29uc3QgaW5wdXRzOiBJc0Zpbml0ZUlucHV0cyA9IHt4OiAkeH07XG5cbiAgcmV0dXJuIEVOR0lORS5ydW5LZXJuZWwoSXNGaW5pdGUsIGlucHV0cyBhcyB7fSBhcyBOYW1lZFRlbnNvck1hcCk7XG59XG5leHBvcnQgY29uc3QgaXNGaW5pdGUgPSBvcCh7aXNGaW5pdGVffSk7XG4iXX0=","/**\n * @license\n * Copyright 2018 Google LLC. All Rights Reserved.\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n * =============================================================================\n */\nimport { ENGINE } from '../engine';\nimport { IsInf } from '../kernel_names';\nimport { convertToTensor } from '../tensor_util_env';\nimport { op } from './operation';\n/**\n * Returns which elements of x are Infinity or -Infinity.\n *\n * ```js\n * const x = tf.tensor1d([NaN, Infinity, -Infinity, 0, 1]);\n *\n * x.isInf().print(); // or tf.isNaN(x)\n * ```\n * @param x The input Tensor.\n *\n * @doc {heading: 'Operations', subheading: 'Basic math'}\n */\nfunction isInf_(x) {\n const $x = convertToTensor(x, 'x', 'isInf');\n const inputs = { x: $x };\n return ENGINE.runKernel(IsInf, inputs);\n}\nexport const isInf = op({ isInf_ });\n//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaXNfaW5mLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vLi4vdGZqcy1jb3JlL3NyYy9vcHMvaXNfaW5mLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBOzs7Ozs7Ozs7Ozs7Ozs7R0FlRztBQUVILE9BQU8sRUFBQyxNQUFNLEVBQUMsTUFBTSxXQUFXLENBQUM7QUFDakMsT0FBTyxFQUFDLEtBQUssRUFBYyxNQUFNLGlCQUFpQixDQUFDO0FBR25ELE9BQU8sRUFBQyxlQUFlLEVBQUMsTUFBTSxvQkFBb0IsQ0FBQztBQUduRCxPQUFPLEVBQUMsRUFBRSxFQUFDLE1BQU0sYUFBYSxDQUFDO0FBRS9COzs7Ozs7Ozs7OztHQVdHO0FBQ0gsU0FBUyxNQUFNLENBQW1CLENBQWU7SUFDL0MsTUFBTSxFQUFFLEdBQUcsZUFBZSxDQUFDLENBQUMsRUFBRSxHQUFHLEVBQUUsT0FBTyxDQUFDLENBQUM7SUFFNUMsTUFBTSxNQUFNLEdBQWdCLEVBQUMsQ0FBQyxFQUFFLEVBQUUsRUFBQyxDQUFDO0lBRXBDLE9BQU8sTUFBTSxDQUFDLFNBQVMsQ0FBQyxLQUFLLEVBQUUsTUFBOEIsQ0FBQyxDQUFDO0FBQ2pFLENBQUM7QUFDRCxNQUFNLENBQUMsTUFBTSxLQUFLLEdBQUcsRUFBRSxDQUFDLEVBQUMsTUFBTSxFQUFDLENBQUMsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbIi8qKlxuICogQGxpY2Vuc2VcbiAqIENvcHlyaWdodCAyMDE4IEdvb2dsZSBMTEMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuXG4gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgXCJMaWNlbnNlXCIpO1xuICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLlxuICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0XG4gKlxuICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wXG4gKlxuICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZVxuICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gXCJBUyBJU1wiIEJBU0lTLFxuICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuXG4gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kXG4gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS5cbiAqID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4gKi9cblxuaW1wb3J0IHtFTkdJTkV9IGZyb20gJy4uL2VuZ2luZSc7XG5pbXBvcnQge0lzSW5mLCBJc0luZklucHV0c30gZnJvbSAnLi4va2VybmVsX25hbWVzJztcbmltcG9ydCB7VGVuc29yfSBmcm9tICcuLi90ZW5zb3InO1xuaW1wb3J0IHtOYW1lZFRlbnNvck1hcH0gZnJvbSAnLi4vdGVuc29yX3R5cGVzJztcbmltcG9ydCB7Y29udmVydFRvVGVuc29yfSBmcm9tICcuLi90ZW5zb3JfdXRpbF9lbnYnO1xuaW1wb3J0IHtUZW5zb3JMaWtlfSBmcm9tICcuLi90eXBlcyc7XG5cbmltcG9ydCB7b3B9IGZyb20gJy4vb3BlcmF0aW9uJztcblxuLyoqXG4gKiBSZXR1cm5zIHdoaWNoIGVsZW1lbnRzIG9mIHggYXJlIEluZmluaXR5IG9yIC1JbmZpbml0eS5cbiAqXG4gKiBgYGBqc1xuICogY29uc3QgeCA9IHRmLnRlbnNvcjFkKFtOYU4sIEluZmluaXR5LCAtSW5maW5pdHksIDAsIDFdKTtcbiAqXG4gKiB4LmlzSW5mKCkucHJpbnQoKTsgIC8vIG9yIHRmLmlzTmFOKHgpXG4gKiBgYGBcbiAqIEBwYXJhbSB4IFRoZSBpbnB1dCBUZW5zb3IuXG4gKlxuICogQGRvYyB7aGVhZGluZzogJ09wZXJhdGlvbnMnLCBzdWJoZWFkaW5nOiAnQmFzaWMgbWF0aCd9XG4gKi9cbmZ1bmN0aW9uIGlzSW5mXzxUIGV4dGVuZHMgVGVuc29yPih4OiBUfFRlbnNvckxpa2UpOiBUIHtcbiAgY29uc3QgJHggPSBjb252ZXJ0VG9UZW5zb3IoeCwgJ3gnLCAnaXNJbmYnKTtcblxuICBjb25zdCBpbnB1dHM6IElzSW5mSW5wdXRzID0ge3g6ICR4fTtcblxuICByZXR1cm4gRU5HSU5FLnJ1bktlcm5lbChJc0luZiwgaW5wdXRzIGFzIHt9IGFzIE5hbWVkVGVuc29yTWFwKTtcbn1cbmV4cG9ydCBjb25zdCBpc0luZiA9IG9wKHtpc0luZl99KTtcbiJdfQ==","/**\n * @license\n * Copyright 2018 Google LLC. All Rights Reserved.\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n * =============================================================================\n */\nimport { ENGINE } from '../engine';\nimport { IsNan } from '../kernel_names';\nimport { convertToTensor } from '../tensor_util_env';\nimport { op } from './operation';\n/**\n * Returns which elements of x are NaN.\n *\n * ```js\n * const x = tf.tensor1d([NaN, Infinity, -Infinity, 0, 1]);\n *\n * x.isNaN().print(); // or tf.isNaN(x)\n * ```\n * @param x The input Tensor.\n *\n * @doc {heading: 'Operations', subheading: 'Basic math'}\n */\nfunction isNaN_(x) {\n const $x = convertToTensor(x, 'x', 'isNaN');\n const inputs = { x: $x };\n return ENGINE.runKernel(IsNan, inputs);\n}\nexport const isNaN = op({ isNaN_ });\n//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaXNfbmFuLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vLi4vdGZqcy1jb3JlL3NyYy9vcHMvaXNfbmFuLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBOzs7Ozs7Ozs7Ozs7Ozs7R0FlRztBQUVILE9BQU8sRUFBQyxNQUFNLEVBQUMsTUFBTSxXQUFXLENBQUM7QUFDakMsT0FBTyxFQUFDLEtBQUssRUFBYyxNQUFNLGlCQUFpQixDQUFDO0FBR25ELE9BQU8sRUFBQyxlQUFlLEVBQUMsTUFBTSxvQkFBb0IsQ0FBQztBQUduRCxPQUFPLEVBQUMsRUFBRSxFQUFDLE1BQU0sYUFBYSxDQUFDO0FBRS9COzs7Ozs7Ozs7OztHQVdHO0FBQ0gsU0FBUyxNQUFNLENBQW1CLENBQWU7SUFDL0MsTUFBTSxFQUFFLEdBQUcsZUFBZSxDQUFDLENBQUMsRUFBRSxHQUFHLEVBQUUsT0FBTyxDQUFDLENBQUM7SUFDNUMsTUFBTSxNQUFNLEdBQWdCLEVBQUMsQ0FBQyxFQUFFLEVBQUUsRUFBQyxDQUFDO0lBRXBDLE9BQU8sTUFBTSxDQUFDLFNBQVMsQ0FBQyxLQUFLLEVBQUUsTUFBOEIsQ0FBQyxDQUFDO0FBQ2pFLENBQUM7QUFDRCxNQUFNLENBQUMsTUFBTSxLQUFLLEdBQUcsRUFBRSxDQUFDLEVBQUMsTUFBTSxFQUFDLENBQUMsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbIi8qKlxuICogQGxpY2Vuc2VcbiAqIENvcHlyaWdodCAyMDE4IEdvb2dsZSBMTEMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuXG4gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgXCJMaWNlbnNlXCIpO1xuICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLlxuICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0XG4gKlxuICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wXG4gKlxuICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZVxuICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gXCJBUyBJU1wiIEJBU0lTLFxuICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuXG4gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kXG4gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS5cbiAqID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4gKi9cblxuaW1wb3J0IHtFTkdJTkV9IGZyb20gJy4uL2VuZ2luZSc7XG5pbXBvcnQge0lzTmFuLCBJc05hbklucHV0c30gZnJvbSAnLi4va2VybmVsX25hbWVzJztcbmltcG9ydCB7VGVuc29yfSBmcm9tICcuLi90ZW5zb3InO1xuaW1wb3J0IHtOYW1lZFRlbnNvck1hcH0gZnJvbSAnLi4vdGVuc29yX3R5cGVzJztcbmltcG9ydCB7Y29udmVydFRvVGVuc29yfSBmcm9tICcuLi90ZW5zb3JfdXRpbF9lbnYnO1xuaW1wb3J0IHtUZW5zb3JMaWtlfSBmcm9tICcuLi90eXBlcyc7XG5cbmltcG9ydCB7b3B9IGZyb20gJy4vb3BlcmF0aW9uJztcblxuLyoqXG4gKiBSZXR1cm5zIHdoaWNoIGVsZW1lbnRzIG9mIHggYXJlIE5hTi5cbiAqXG4gKiBgYGBqc1xuICogY29uc3QgeCA9IHRmLnRlbnNvcjFkKFtOYU4sIEluZmluaXR5LCAtSW5maW5pdHksIDAsIDFdKTtcbiAqXG4gKiB4LmlzTmFOKCkucHJpbnQoKTsgIC8vIG9yIHRmLmlzTmFOKHgpXG4gKiBgYGBcbiAqIEBwYXJhbSB4IFRoZSBpbnB1dCBUZW5zb3IuXG4gKlxuICogQGRvYyB7aGVhZGluZzogJ09wZXJhdGlvbnMnLCBzdWJoZWFkaW5nOiAnQmFzaWMgbWF0aCd9XG4gKi9cbmZ1bmN0aW9uIGlzTmFOXzxUIGV4dGVuZHMgVGVuc29yPih4OiBUfFRlbnNvckxpa2UpOiBUIHtcbiAgY29uc3QgJHggPSBjb252ZXJ0VG9UZW5zb3IoeCwgJ3gnLCAnaXNOYU4nKTtcbiAgY29uc3QgaW5wdXRzOiBJc05hbklucHV0cyA9IHt4OiAkeH07XG5cbiAgcmV0dXJuIEVOR0lORS5ydW5LZXJuZWwoSXNOYW4sIGlucHV0cyBhcyB7fSBhcyBOYW1lZFRlbnNvck1hcCk7XG59XG5leHBvcnQgY29uc3QgaXNOYU4gPSBvcCh7aXNOYU5ffSk7XG4iXX0=","/**\n * @license\n * Copyright 2020 Google LLC. All Rights Reserved.\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n * =============================================================================\n */\nimport { ENGINE } from '../engine';\nimport { LeakyRelu } from '../kernel_names';\nimport { convertToTensor } from '../tensor_util_env';\nimport { op } from './operation';\n/**\n * Computes leaky rectified linear element-wise.\n *\n * See\n * [http://web.stanford.edu/~awni/papers/relu_hybrid_icml2013_final.pdf](\n * http://web.stanford.edu/~awni/papers/relu_hybrid_icml2013_final.pdf)\n *\n * ```js\n * const x = tf.tensor1d([-1, 2, -3, 4]);\n *\n * x.leakyRelu(0.1).print(); // or tf.leakyRelu(x, 0.1)\n * ```\n * @param x The input tensor.\n * @param alpha The scaling factor for negative values, defaults to 0.2.\n *\n * @doc {heading: 'Operations', subheading: 'Basic math'}\n */\nfunction leakyRelu_(x, alpha = 0.2) {\n const $x = convertToTensor(x, 'x', 'leakyRelu');\n const inputs = { x: $x };\n const attrs = { alpha };\n return ENGINE.runKernel(LeakyRelu, inputs, attrs);\n}\nexport const leakyRelu = op({ leakyRelu_ });\n//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibGVha3lfcmVsdS5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uLy4uL3RmanMtY29yZS9zcmMvb3BzL2xlYWt5X3JlbHUudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUE7Ozs7Ozs7Ozs7Ozs7OztHQWVHO0FBRUgsT0FBTyxFQUFDLE1BQU0sRUFBQyxNQUFNLFdBQVcsQ0FBQztBQUNqQyxPQUFPLEVBQUMsU0FBUyxFQUFrQyxNQUFNLGlCQUFpQixDQUFDO0FBSTNFLE9BQU8sRUFBQyxlQUFlLEVBQUMsTUFBTSxvQkFBb0IsQ0FBQztBQUduRCxPQUFPLEVBQUMsRUFBRSxFQUFDLE1BQU0sYUFBYSxDQUFDO0FBRS9COzs7Ozs7Ozs7Ozs7Ozs7O0dBZ0JHO0FBQ0gsU0FBUyxVQUFVLENBQW1CLENBQWUsRUFBRSxLQUFLLEdBQUcsR0FBRztJQUNoRSxNQUFNLEVBQUUsR0FBRyxlQUFlLENBQUMsQ0FBQyxFQUFFLEdBQUcsRUFBRSxXQUFXLENBQUMsQ0FBQztJQUVoRCxNQUFNLE1BQU0sR0FBb0IsRUFBQyxDQUFDLEVBQUUsRUFBRSxFQUFDLENBQUM7SUFDeEMsTUFBTSxLQUFLLEdBQW1CLEVBQUMsS0FBSyxFQUFDLENBQUM7SUFFdEMsT0FBTyxNQUFNLENBQUMsU0FBUyxDQUNuQixTQUFTLEVBQUUsTUFBOEIsRUFBRSxLQUEyQixDQUFDLENBQUM7QUFDOUUsQ0FBQztBQUVELE1BQU0sQ0FBQyxNQUFNLFNBQVMsR0FBRyxFQUFFLENBQUMsRUFBQyxVQUFVLEVBQUMsQ0FBQyxDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiLyoqXG4gKiBAbGljZW5zZVxuICogQ29weXJpZ2h0IDIwMjAgR29vZ2xlIExMQy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC5cbiAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSBcIkxpY2Vuc2VcIik7XG4gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuXG4gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXRcbiAqXG4gKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjBcbiAqXG4gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlXG4gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiBcIkFTIElTXCIgQkFTSVMsXG4gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC5cbiAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmRcbiAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLlxuICogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbiAqL1xuXG5pbXBvcnQge0VOR0lORX0gZnJvbSAnLi4vZW5naW5lJztcbmltcG9ydCB7TGVha3lSZWx1LCBMZWFreVJlbHVBdHRycywgTGVha3lSZWx1SW5wdXRzfSBmcm9tICcuLi9rZXJuZWxfbmFtZXMnO1xuaW1wb3J0IHtOYW1lZEF0dHJNYXB9IGZyb20gJy4uL2tlcm5lbF9yZWdpc3RyeSc7XG5pbXBvcnQge1RlbnNvcn0gZnJvbSAnLi4vdGVuc29yJztcbmltcG9ydCB7TmFtZWRUZW5zb3JNYXB9IGZyb20gJy4uL3RlbnNvcl90eXBlcyc7XG5pbXBvcnQge2NvbnZlcnRUb1RlbnNvcn0gZnJvbSAnLi4vdGVuc29yX3V0aWxfZW52JztcbmltcG9ydCB7VGVuc29yTGlrZX0gZnJvbSAnLi4vdHlwZXMnO1xuXG5pbXBvcnQge29wfSBmcm9tICcuL29wZXJhdGlvbic7XG5cbi8qKlxuICogQ29tcHV0ZXMgbGVha3kgcmVjdGlmaWVkIGxpbmVhciBlbGVtZW50LXdpc2UuXG4gKlxuICogU2VlXG4gKiBbaHR0cDovL3dlYi5zdGFuZm9yZC5lZHUvfmF3bmkvcGFwZXJzL3JlbHVfaHlicmlkX2ljbWwyMDEzX2ZpbmFsLnBkZl0oXG4gKiAgICAgaHR0cDovL3dlYi5zdGFuZm9yZC5lZHUvfmF3bmkvcGFwZXJzL3JlbHVfaHlicmlkX2ljbWwyMDEzX2ZpbmFsLnBkZilcbiAqXG4gKiBgYGBqc1xuICogY29uc3QgeCA9IHRmLnRlbnNvcjFkKFstMSwgMiwgLTMsIDRdKTtcbiAqXG4gKiB4LmxlYWt5UmVsdSgwLjEpLnByaW50KCk7ICAvLyBvciB0Zi5sZWFreVJlbHUoeCwgMC4xKVxuICogYGBgXG4gKiBAcGFyYW0geCBUaGUgaW5wdXQgdGVuc29yLlxuICogQHBhcmFtIGFscGhhIFRoZSBzY2FsaW5nIGZhY3RvciBmb3IgbmVnYXRpdmUgdmFsdWVzLCBkZWZhdWx0cyB0byAwLjIuXG4gKlxuICogQGRvYyB7aGVhZGluZzogJ09wZXJhdGlvbnMnLCBzdWJoZWFkaW5nOiAnQmFzaWMgbWF0aCd9XG4gKi9cbmZ1bmN0aW9uIGxlYWt5UmVsdV88VCBleHRlbmRzIFRlbnNvcj4oeDogVHxUZW5zb3JMaWtlLCBhbHBoYSA9IDAuMik6IFQge1xuICBjb25zdCAkeCA9IGNvbnZlcnRUb1RlbnNvcih4LCAneCcsICdsZWFreVJlbHUnKTtcblxuICBjb25zdCBpbnB1dHM6IExlYWt5UmVsdUlucHV0cyA9IHt4OiAkeH07XG4gIGNvbnN0IGF0dHJzOiBMZWFreVJlbHVBdHRycyA9IHthbHBoYX07XG5cbiAgcmV0dXJuIEVOR0lORS5ydW5LZXJuZWwoXG4gICAgICBMZWFreVJlbHUsIGlucHV0cyBhcyB7fSBhcyBOYW1lZFRlbnNvck1hcCwgYXR0cnMgYXMge30gYXMgTmFtZWRBdHRyTWFwKTtcbn1cblxuZXhwb3J0IGNvbnN0IGxlYWt5UmVsdSA9IG9wKHtsZWFreVJlbHVffSk7XG4iXX0=","/**\n * @license\n * Copyright 2020 Google LLC. All Rights Reserved.\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n * =============================================================================\n */\nimport { ENGINE } from '../engine';\nimport { Less } from '../kernel_names';\nimport { makeTypesMatch } from '../tensor_util';\nimport { convertToTensor } from '../tensor_util_env';\nimport { assertAndGetBroadcastShape } from './broadcast_util';\nimport { op } from './operation';\n/**\n * Returns the truth value of (a < b) element-wise. Supports broadcasting.\n *\n * ```js\n * const a = tf.tensor1d([1, 2, 3]);\n * const b = tf.tensor1d([2, 2, 2]);\n *\n * a.less(b).print();\n * ```\n * @param a The first input tensor.\n * @param b The second input tensor. Must have the same dtype as `a`.\n *\n * @doc {heading: 'Operations', subheading: 'Logical'}\n */\nfunction less_(a, b) {\n let $a = convertToTensor(a, 'a', 'less', 'string_or_numeric');\n let $b = convertToTensor(b, 'b', 'less', 'string_or_numeric');\n [$a, $b] = makeTypesMatch($a, $b);\n assertAndGetBroadcastShape($a.shape, $b.shape);\n const inputs = { a: $a, b: $b };\n return ENGINE.runKernel(Less, inputs);\n}\nexport const less = op({ less_ });\n//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibGVzcy5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uLy4uL3RmanMtY29yZS9zcmMvb3BzL2xlc3MudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUE7Ozs7Ozs7Ozs7Ozs7OztHQWVHO0FBQ0gsT0FBTyxFQUFDLE1BQU0sRUFBQyxNQUFNLFdBQVcsQ0FBQztBQUNqQyxPQUFPLEVBQUMsSUFBSSxFQUFhLE1BQU0saUJBQWlCLENBQUM7QUFHakQsT0FBTyxFQUFDLGNBQWMsRUFBQyxNQUFNLGdCQUFnQixDQUFDO0FBQzlDLE9BQU8sRUFBQyxlQUFlLEVBQUMsTUFBTSxvQkFBb0IsQ0FBQztBQUduRCxPQUFPLEVBQUMsMEJBQTBCLEVBQUMsTUFBTSxrQkFBa0IsQ0FBQztBQUM1RCxPQUFPLEVBQUMsRUFBRSxFQUFDLE1BQU0sYUFBYSxDQUFDO0FBRS9COzs7Ozs7Ozs7Ozs7O0dBYUc7QUFDSCxTQUFTLEtBQUssQ0FDVixDQUFvQixFQUFFLENBQW9CO0lBQzVDLElBQUksRUFBRSxHQUFHLGVBQWUsQ0FBQyxDQUFDLEVBQUUsR0FBRyxFQUFFLE1BQU0sRUFBRSxtQkFBbUIsQ0FBQyxDQUFDO0lBQzlELElBQUksRUFBRSxHQUFHLGVBQWUsQ0FBQyxDQUFDLEVBQUUsR0FBRyxFQUFFLE1BQU0sRUFBRSxtQkFBbUIsQ0FBQyxDQUFDO0lBQzlELENBQUMsRUFBRSxFQUFFLEVBQUUsQ0FBQyxHQUFHLGNBQWMsQ0FBQyxFQUFFLEVBQUUsRUFBRSxDQUFDLENBQUM7SUFFbEMsMEJBQTBCLENBQUMsRUFBRSxDQUFDLEtBQUssRUFBRSxFQUFFLENBQUMsS0FBSyxDQUFDLENBQUM7SUFFL0MsTUFBTSxNQUFNLEdBQWUsRUFBQyxDQUFDLEVBQUUsRUFBRSxFQUFFLENBQUMsRUFBRSxFQUFFLEVBQUMsQ0FBQztJQUUxQyxPQUFPLE1BQU0sQ0FBQyxTQUFTLENBQUMsSUFBSSxFQUFFLE1BQThCLENBQUMsQ0FBQztBQUNoRSxDQUFDO0FBRUQsTUFBTSxDQUFDLE1BQU0sSUFBSSxHQUFHLEVBQUUsQ0FBQyxFQUFDLEtBQUssRUFBQyxDQUFDLENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyIvKipcbiAqIEBsaWNlbnNlXG4gKiBDb3B5cmlnaHQgMjAyMCBHb29nbGUgTExDLiBBbGwgUmlnaHRzIFJlc2VydmVkLlxuICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlIFwiTGljZW5zZVwiKTtcbiAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS5cbiAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdFxuICpcbiAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMFxuICpcbiAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmVcbiAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuIFwiQVMgSVNcIiBCQVNJUyxcbiAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLlxuICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZFxuICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuXG4gKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuICovXG5pbXBvcnQge0VOR0lORX0gZnJvbSAnLi4vZW5naW5lJztcbmltcG9ydCB7TGVzcywgTGVzc0lucHV0c30gZnJvbSAnLi4va2VybmVsX25hbWVzJztcbmltcG9ydCB7VGVuc29yfSBmcm9tICcuLi90ZW5zb3InO1xuaW1wb3J0IHtOYW1lZFRlbnNvck1hcH0gZnJvbSAnLi4vdGVuc29yX3R5cGVzJztcbmltcG9ydCB7bWFrZVR5cGVzTWF0Y2h9IGZyb20gJy4uL3RlbnNvcl91dGlsJztcbmltcG9ydCB7Y29udmVydFRvVGVuc29yfSBmcm9tICcuLi90ZW5zb3JfdXRpbF9lbnYnO1xuaW1wb3J0IHtUZW5zb3JMaWtlfSBmcm9tICcuLi90eXBlcyc7XG5cbmltcG9ydCB7YXNzZXJ0QW5kR2V0QnJvYWRjYXN0U2hhcGV9IGZyb20gJy4vYnJvYWRjYXN0X3V0aWwnO1xuaW1wb3J0IHtvcH0gZnJvbSAnLi9vcGVyYXRpb24nO1xuXG4vKipcbiAqIFJldHVybnMgdGhlIHRydXRoIHZhbHVlIG9mIChhIDwgYikgZWxlbWVudC13aXNlLiBTdXBwb3J0cyBicm9hZGNhc3RpbmcuXG4gKlxuICogYGBganNcbiAqIGNvbnN0IGEgPSB0Zi50ZW5zb3IxZChbMSwgMiwgM10pO1xuICogY29uc3QgYiA9IHRmLnRlbnNvcjFkKFsyLCAyLCAyXSk7XG4gKlxuICogYS5sZXNzKGIpLnByaW50KCk7XG4gKiBgYGBcbiAqIEBwYXJhbSBhIFRoZSBmaXJzdCBpbnB1dCB0ZW5zb3IuXG4gKiBAcGFyYW0gYiBUaGUgc2Vjb25kIGlucHV0IHRlbnNvci4gTXVzdCBoYXZlIHRoZSBzYW1lIGR0eXBlIGFzIGBhYC5cbiAqXG4gKiBAZG9jIHtoZWFkaW5nOiAnT3BlcmF0aW9ucycsIHN1YmhlYWRpbmc6ICdMb2dpY2FsJ31cbiAqL1xuZnVuY3Rpb24gbGVzc188VCBleHRlbmRzIFRlbnNvcj4oXG4gICAgYTogVGVuc29yfFRlbnNvckxpa2UsIGI6IFRlbnNvcnxUZW5zb3JMaWtlKTogVCB7XG4gIGxldCAkYSA9IGNvbnZlcnRUb1RlbnNvcihhLCAnYScsICdsZXNzJywgJ3N0cmluZ19vcl9udW1lcmljJyk7XG4gIGxldCAkYiA9IGNvbnZlcnRUb1RlbnNvcihiLCAnYicsICdsZXNzJywgJ3N0cmluZ19vcl9udW1lcmljJyk7XG4gIFskYSwgJGJdID0gbWFrZVR5cGVzTWF0Y2goJGEsICRiKTtcblxuICBhc3NlcnRBbmRHZXRCcm9hZGNhc3RTaGFwZSgkYS5zaGFwZSwgJGIuc2hhcGUpO1xuXG4gIGNvbnN0IGlucHV0czogTGVzc0lucHV0cyA9IHthOiAkYSwgYjogJGJ9O1xuXG4gIHJldHVybiBFTkdJTkUucnVuS2VybmVsKExlc3MsIGlucHV0cyBhcyB7fSBhcyBOYW1lZFRlbnNvck1hcCk7XG59XG5cbmV4cG9ydCBjb25zdCBsZXNzID0gb3Aoe2xlc3NffSk7XG4iXX0=","/**\n * @license\n * Copyright 2020 Google LLC. All Rights Reserved.\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n * =============================================================================\n */\nimport { ENGINE } from '../engine';\nimport { LessEqual } from '../kernel_names';\nimport { makeTypesMatch } from '../tensor_util';\nimport { convertToTensor } from '../tensor_util_env';\nimport { assertAndGetBroadcastShape } from './broadcast_util';\nimport { op } from './operation';\n/**\n * Returns the truth value of (a <= b) element-wise. Supports broadcasting.\n *\n * ```js\n * const a = tf.tensor1d([1, 2, 3]);\n * const b = tf.tensor1d([2, 2, 2]);\n *\n * a.lessEqual(b).print();\n * ```\n *\n * @param a The first input tensor.\n * @param b The second input tensor. Must have the same dtype as `a`.\n *\n * @doc {heading: 'Operations', subheading: 'Logical'}\n */\nfunction lessEqual_(a, b) {\n let $a = convertToTensor(a, 'a', 'lessEqual', 'string_or_numeric');\n let $b = convertToTensor(b, 'b', 'lessEqual', 'string_or_numeric');\n [$a, $b] = makeTypesMatch($a, $b);\n assertAndGetBroadcastShape($a.shape, $b.shape);\n const inputs = { a: $a, b: $b };\n return ENGINE.runKernel(LessEqual, inputs);\n}\nexport const lessEqual = op({ lessEqual_ });\n//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibGVzc19lcXVhbC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uLy4uL3RmanMtY29yZS9zcmMvb3BzL2xlc3NfZXF1YWwudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUE7Ozs7Ozs7Ozs7Ozs7OztHQWVHO0FBQ0gsT0FBTyxFQUFDLE1BQU0sRUFBQyxNQUFNLFdBQVcsQ0FBQztBQUNqQyxPQUFPLEVBQUMsU0FBUyxFQUFrQixNQUFNLGlCQUFpQixDQUFDO0FBRzNELE9BQU8sRUFBQyxjQUFjLEVBQUMsTUFBTSxnQkFBZ0IsQ0FBQztBQUM5QyxPQUFPLEVBQUMsZUFBZSxFQUFDLE1BQU0sb0JBQW9CLENBQUM7QUFHbkQsT0FBTyxFQUFDLDBCQUEwQixFQUFDLE1BQU0sa0JBQWtCLENBQUM7QUFDNUQsT0FBTyxFQUFDLEVBQUUsRUFBQyxNQUFNLGFBQWEsQ0FBQztBQUUvQjs7Ozs7Ozs7Ozs7Ozs7R0FjRztBQUNILFNBQVMsVUFBVSxDQUNmLENBQW9CLEVBQUUsQ0FBb0I7SUFDNUMsSUFBSSxFQUFFLEdBQUcsZUFBZSxDQUFDLENBQUMsRUFBRSxHQUFHLEVBQUUsV0FBVyxFQUFFLG1CQUFtQixDQUFDLENBQUM7SUFDbkUsSUFBSSxFQUFFLEdBQUcsZUFBZSxDQUFDLENBQUMsRUFBRSxHQUFHLEVBQUUsV0FBVyxFQUFFLG1CQUFtQixDQUFDLENBQUM7SUFDbkUsQ0FBQyxFQUFFLEVBQUUsRUFBRSxDQUFDLEdBQUcsY0FBYyxDQUFDLEVBQUUsRUFBRSxFQUFFLENBQUMsQ0FBQztJQUVsQywwQkFBMEIsQ0FBQyxFQUFFLENBQUMsS0FBSyxFQUFFLEVBQUUsQ0FBQyxLQUFLLENBQUMsQ0FBQztJQUUvQyxNQUFNLE1BQU0sR0FBb0IsRUFBQyxDQUFDLEVBQUUsRUFBRSxFQUFFLENBQUMsRUFBRSxFQUFFLEVBQUMsQ0FBQztJQUUvQyxPQUFPLE1BQU0sQ0FBQyxTQUFTLENBQUMsU0FBUyxFQUFFLE1BQThCLENBQUMsQ0FBQztBQUNyRSxDQUFDO0FBRUQsTUFBTSxDQUFDLE1BQU0sU0FBUyxHQUFHLEVBQUUsQ0FBQyxFQUFDLFVBQVUsRUFBQyxDQUFDLENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyIvKipcbiAqIEBsaWNlbnNlXG4gKiBDb3B5cmlnaHQgMjAyMCBHb29nbGUgTExDLiBBbGwgUmlnaHRzIFJlc2VydmVkLlxuICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlIFwiTGljZW5zZVwiKTtcbiAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS5cbiAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdFxuICpcbiAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMFxuICpcbiAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmVcbiAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuIFwiQVMgSVNcIiBCQVNJUyxcbiAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLlxuICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZFxuICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuXG4gKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuICovXG5pbXBvcnQge0VOR0lORX0gZnJvbSAnLi4vZW5naW5lJztcbmltcG9ydCB7TGVzc0VxdWFsLCBMZXNzRXF1YWxJbnB1dHN9IGZyb20gJy4uL2tlcm5lbF9uYW1lcyc7XG5pbXBvcnQge1RlbnNvcn0gZnJvbSAnLi4vdGVuc29yJztcbmltcG9ydCB7TmFtZWRUZW5zb3JNYXB9IGZyb20gJy4uL3RlbnNvcl90eXBlcyc7XG5pbXBvcnQge21ha2VUeXBlc01hdGNofSBmcm9tICcuLi90ZW5zb3JfdXRpbCc7XG5pbXBvcnQge2NvbnZlcnRUb1RlbnNvcn0gZnJvbSAnLi4vdGVuc29yX3V0aWxfZW52JztcbmltcG9ydCB7VGVuc29yTGlrZX0gZnJvbSAnLi4vdHlwZXMnO1xuXG5pbXBvcnQge2Fzc2VydEFuZEdldEJyb2FkY2FzdFNoYXBlfSBmcm9tICcuL2Jyb2FkY2FzdF91dGlsJztcbmltcG9ydCB7b3B9IGZyb20gJy4vb3BlcmF0aW9uJztcblxuLyoqXG4gKiBSZXR1cm5zIHRoZSB0cnV0aCB2YWx1ZSBvZiAoYSA8PSBiKSBlbGVtZW50LXdpc2UuIFN1cHBvcnRzIGJyb2FkY2FzdGluZy5cbiAqXG4gKiBgYGBqc1xuICogY29uc3QgYSA9IHRmLnRlbnNvcjFkKFsxLCAyLCAzXSk7XG4gKiBjb25zdCBiID0gdGYudGVuc29yMWQoWzIsIDIsIDJdKTtcbiAqXG4gKiBhLmxlc3NFcXVhbChiKS5wcmludCgpO1xuICogYGBgXG4gKlxuICogQHBhcmFtIGEgVGhlIGZpcnN0IGlucHV0IHRlbnNvci5cbiAqIEBwYXJhbSBiIFRoZSBzZWNvbmQgaW5wdXQgdGVuc29yLiBNdXN0IGhhdmUgdGhlIHNhbWUgZHR5cGUgYXMgYGFgLlxuICpcbiAqIEBkb2Mge2hlYWRpbmc6ICdPcGVyYXRpb25zJywgc3ViaGVhZGluZzogJ0xvZ2ljYWwnfVxuICovXG5mdW5jdGlvbiBsZXNzRXF1YWxfPFQgZXh0ZW5kcyBUZW5zb3I+KFxuICAgIGE6IFRlbnNvcnxUZW5zb3JMaWtlLCBiOiBUZW5zb3J8VGVuc29yTGlrZSk6IFQge1xuICBsZXQgJGEgPSBjb252ZXJ0VG9UZW5zb3IoYSwgJ2EnLCAnbGVzc0VxdWFsJywgJ3N0cmluZ19vcl9udW1lcmljJyk7XG4gIGxldCAkYiA9IGNvbnZlcnRUb1RlbnNvcihiLCAnYicsICdsZXNzRXF1YWwnLCAnc3RyaW5nX29yX251bWVyaWMnKTtcbiAgWyRhLCAkYl0gPSBtYWtlVHlwZXNNYXRjaCgkYSwgJGIpO1xuXG4gIGFzc2VydEFuZEdldEJyb2FkY2FzdFNoYXBlKCRhLnNoYXBlLCAkYi5zaGFwZSk7XG5cbiAgY29uc3QgaW5wdXRzOiBMZXNzRXF1YWxJbnB1dHMgPSB7YTogJGEsIGI6ICRifTtcblxuICByZXR1cm4gRU5HSU5FLnJ1bktlcm5lbChMZXNzRXF1YWwsIGlucHV0cyBhcyB7fSBhcyBOYW1lZFRlbnNvck1hcCk7XG59XG5cbmV4cG9ydCBjb25zdCBsZXNzRXF1YWwgPSBvcCh7bGVzc0VxdWFsX30pO1xuIl19","/**\n * @license\n * Copyright 2020 Google LLC. All Rights Reserved.\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n * =============================================================================\n */\nimport { ENGINE } from '../engine';\nimport { LRN } from '../kernel_names';\nimport { convertToTensor } from '../tensor_util_env';\nimport * as util from '../util';\nimport { op } from './operation';\nimport { reshape } from './reshape';\n/**\n * Normalizes the activation of a local neighborhood across or within\n * channels.\n *\n * @param x The input tensor. The 4-D input tensor is treated as a 3-D array\n * of 1D vectors (along the last dimension), and each vector is\n * normalized independently.\n * @param depthRadius The number of adjacent channels in the 1D normalization\n * window.\n * @param bias A constant bias term for the basis.\n * @param alpha A scale factor, usually positive.\n * @param beta An exponent.\n *\n * @doc {heading: 'Operations', subheading: 'Normalization'}\n */\nfunction localResponseNormalization_(x, depthRadius = 5, bias = 1, alpha = 1, beta = 0.5) {\n const $x = convertToTensor(x, 'x', 'localResponseNormalization');\n util.assert($x.rank === 4 || $x.rank === 3, () => `Error in localResponseNormalization: x must be rank 3 or 4 but got\n rank ${$x.rank}.`);\n util.assert(util.isInt(depthRadius), () => `Error in localResponseNormalization: depthRadius must be an ` +\n `integer but got depthRadius ${depthRadius}.`);\n let x4D = $x;\n let reshapedTo4D = false;\n if ($x.rank === 3) {\n reshapedTo4D = true;\n x4D = reshape($x, [1, $x.shape[0], $x.shape[1], $x.shape[2]]);\n }\n const inputs = { x: x4D };\n const attrs = { depthRadius, bias, alpha, beta };\n // tslint:disable-next-line: no-unnecessary-type-assertion\n const res = ENGINE.runKernel(LRN, inputs, attrs);\n if (reshapedTo4D) {\n return reshape(res, [res.shape[1], res.shape[2], res.shape[3]]);\n }\n else {\n return res;\n }\n}\nexport const localResponseNormalization = op({ localResponseNormalization_ });\n//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibG9jYWxfcmVzcG9uc2Vfbm9ybWFsaXphdGlvbi5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uLy4uL3RmanMtY29yZS9zcmMvb3BzL2xvY2FsX3Jlc3BvbnNlX25vcm1hbGl6YXRpb24udHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUE7Ozs7Ozs7Ozs7Ozs7OztHQWVHO0FBRUgsT0FBTyxFQUFDLE1BQU0sRUFBQyxNQUFNLFdBQVcsQ0FBQztBQUNqQyxPQUFPLEVBQUMsR0FBRyxFQUFzQixNQUFNLGlCQUFpQixDQUFDO0FBSXpELE9BQU8sRUFBQyxlQUFlLEVBQUMsTUFBTSxvQkFBb0IsQ0FBQztBQUVuRCxPQUFPLEtBQUssSUFBSSxNQUFNLFNBQVMsQ0FBQztBQUVoQyxPQUFPLEVBQUMsRUFBRSxFQUFDLE1BQU0sYUFBYSxDQUFDO0FBQy9CLE9BQU8sRUFBQyxPQUFPLEVBQUMsTUFBTSxXQUFXLENBQUM7QUFFbEM7Ozs7Ozs7Ozs7Ozs7O0dBY0c7QUFDSCxTQUFTLDJCQUEyQixDQUNoQyxDQUFlLEVBQUUsV0FBVyxHQUFHLENBQUMsRUFBRSxJQUFJLEdBQUcsQ0FBQyxFQUFFLEtBQUssR0FBRyxDQUFDLEVBQUUsSUFBSSxHQUFHLEdBQUc7SUFDbkUsTUFBTSxFQUFFLEdBQUcsZUFBZSxDQUFDLENBQUMsRUFBRSxHQUFHLEVBQUUsNEJBQTRCLENBQUMsQ0FBQztJQUNqRSxJQUFJLENBQUMsTUFBTSxDQUNQLEVBQUUsQ0FBQyxJQUFJLEtBQUssQ0FBQyxJQUFJLEVBQUUsQ0FBQyxJQUFJLEtBQUssQ0FBQyxFQUM5QixHQUFHLEVBQUUsQ0FBQztzQkFDVSxFQUFFLENBQUMsSUFBSSxHQUFHLENBQUMsQ0FBQztJQUNoQyxJQUFJLENBQUMsTUFBTSxDQUNQLElBQUksQ0FBQyxLQUFLLENBQUMsV0FBVyxDQUFDLEVBQ3ZCLEdBQUcsRUFBRSxDQUFDLDhEQUE4RDtRQUNoRSwrQkFBK0IsV0FBVyxHQUFHLENBQUMsQ0FBQztJQUV2RCxJQUFJLEdBQUcsR0FBRyxFQUFjLENBQUM7SUFDekIsSUFBSSxZQUFZLEdBQUcsS0FBSyxDQUFDO0lBQ3pCLElBQUksRUFBRSxDQUFDLElBQUksS0FBSyxDQUFDLEVBQUU7UUFDakIsWUFBWSxHQUFHLElBQUksQ0FBQztRQUNwQixHQUFHLEdBQUcsT0FBTyxDQUFDLEVBQUUsRUFBRSxDQUFDLENBQUMsRUFBRSxFQUFFLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQyxFQUFFLEVBQUUsQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDLEVBQUUsRUFBRSxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUM7S0FDL0Q7SUFFRCxNQUFNLE1BQU0sR0FBYyxFQUFDLENBQUMsRUFBRSxHQUFHLEVBQUMsQ0FBQztJQUVuQyxNQUFNLEtBQUssR0FBYSxFQUFDLFdBQVcsRUFBRSxJQUFJLEVBQUUsS0FBSyxFQUFFLElBQUksRUFBQyxDQUFDO0lBRXpELDBEQUEwRDtJQUMxRCxNQUFNLEdBQUcsR0FBRyxNQUFNLENBQUMsU0FBUyxDQUNaLEdBQUcsRUFBRSxNQUE4QixFQUNuQyxLQUEyQixDQUFNLENBQUM7SUFFbEQsSUFBSSxZQUFZLEVBQUU7UUFDaEIsT0FBTyxPQUFPLENBQUMsR0FBRyxFQUFFLENBQUMsR0FBRyxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUMsRUFBRSxHQUFHLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQyxFQUFFLEdBQUcsQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBTSxDQUFDO0tBQ3RFO1NBQU07UUFDTCxPQUFPLEdBQUcsQ0FBQztLQUNaO0FBQ0gsQ0FBQztBQUVELE1BQU0sQ0FBQyxNQUFNLDBCQUEwQixHQUFHLEVBQUUsQ0FBQyxFQUFDLDJCQUEyQixFQUFDLENBQUMsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbIi8qKlxuICogQGxpY2Vuc2VcbiAqIENvcHlyaWdodCAyMDIwIEdvb2dsZSBMTEMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuXG4gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgXCJMaWNlbnNlXCIpO1xuICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLlxuICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0XG4gKlxuICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wXG4gKlxuICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZVxuICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gXCJBUyBJU1wiIEJBU0lTLFxuICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuXG4gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kXG4gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS5cbiAqID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4gKi9cblxuaW1wb3J0IHtFTkdJTkV9IGZyb20gJy4uL2VuZ2luZSc7XG5pbXBvcnQge0xSTiwgTFJOQXR0cnMsIExSTklucHV0c30gZnJvbSAnLi4va2VybmVsX25hbWVzJztcbmltcG9ydCB7TmFtZWRBdHRyTWFwfSBmcm9tICcuLi9rZXJuZWxfcmVnaXN0cnknO1xuaW1wb3J0IHtUZW5zb3IzRCwgVGVuc29yNER9IGZyb20gJy4uL3RlbnNvcic7XG5pbXBvcnQge05hbWVkVGVuc29yTWFwfSBmcm9tICcuLi90ZW5zb3JfdHlwZXMnO1xuaW1wb3J0IHtjb252ZXJ0VG9UZW5zb3J9IGZyb20gJy4uL3RlbnNvcl91dGlsX2Vudic7XG5pbXBvcnQge1RlbnNvckxpa2V9IGZyb20gJy4uL3R5cGVzJztcbmltcG9ydCAqIGFzIHV0aWwgZnJvbSAnLi4vdXRpbCc7XG5cbmltcG9ydCB7b3B9IGZyb20gJy4vb3BlcmF0aW9uJztcbmltcG9ydCB7cmVzaGFwZX0gZnJvbSAnLi9yZXNoYXBlJztcblxuLyoqXG4gKiBOb3JtYWxpemVzIHRoZSBhY3RpdmF0aW9uIG9mIGEgbG9jYWwgbmVpZ2hib3Job29kIGFjcm9zcyBvciB3aXRoaW5cbiAqIGNoYW5uZWxzLlxuICpcbiAqIEBwYXJhbSB4IFRoZSBpbnB1dCB0ZW5zb3IuIFRoZSA0LUQgaW5wdXQgdGVuc29yIGlzIHRyZWF0ZWQgYXMgYSAzLUQgYXJyYXlcbiAqICAgICBvZiAxRCB2ZWN0b3JzIChhbG9uZyB0aGUgbGFzdCBkaW1lbnNpb24pLCBhbmQgZWFjaCB2ZWN0b3IgaXNcbiAqICAgICBub3JtYWxpemVkIGluZGVwZW5kZW50bHkuXG4gKiBAcGFyYW0gZGVwdGhSYWRpdXMgVGhlIG51bWJlciBvZiBhZGphY2VudCBjaGFubmVscyBpbiB0aGUgMUQgbm9ybWFsaXphdGlvblxuICogICAgIHdpbmRvdy5cbiAqIEBwYXJhbSBiaWFzIEEgY29uc3RhbnQgYmlhcyB0ZXJtIGZvciB0aGUgYmFzaXMuXG4gKiBAcGFyYW0gYWxwaGEgQSBzY2FsZSBmYWN0b3IsIHVzdWFsbHkgcG9zaXRpdmUuXG4gKiBAcGFyYW0gYmV0YSBBbiBleHBvbmVudC5cbiAqXG4gKiBAZG9jIHtoZWFkaW5nOiAnT3BlcmF0aW9ucycsIHN1YmhlYWRpbmc6ICdOb3JtYWxpemF0aW9uJ31cbiAqL1xuZnVuY3Rpb24gbG9jYWxSZXNwb25zZU5vcm1hbGl6YXRpb25fPFQgZXh0ZW5kcyBUZW5zb3IzRHxUZW5zb3I0RD4oXG4gICAgeDogVHxUZW5zb3JMaWtlLCBkZXB0aFJhZGl1cyA9IDUsIGJpYXMgPSAxLCBhbHBoYSA9IDEsIGJldGEgPSAwLjUpOiBUIHtcbiAgY29uc3QgJHggPSBjb252ZXJ0VG9UZW5zb3IoeCwgJ3gnLCAnbG9jYWxSZXNwb25zZU5vcm1hbGl6YXRpb24nKTtcbiAgdXRpbC5hc3NlcnQoXG4gICAgICAkeC5yYW5rID09PSA0IHx8ICR4LnJhbmsgPT09IDMsXG4gICAgICAoKSA9PiBgRXJyb3IgaW4gbG9jYWxSZXNwb25zZU5vcm1hbGl6YXRpb246IHggbXVzdCBiZSByYW5rIDMgb3IgNCBidXQgZ290XG4gICAgICAgICAgICAgICByYW5rICR7JHgucmFua30uYCk7XG4gIHV0aWwuYXNzZXJ0KFxuICAgICAgdXRpbC5pc0ludChkZXB0aFJhZGl1cyksXG4gICAgICAoKSA9PiBgRXJyb3IgaW4gbG9jYWxSZXNwb25zZU5vcm1hbGl6YXRpb246IGRlcHRoUmFkaXVzIG11c3QgYmUgYW4gYCArXG4gICAgICAgICAgYGludGVnZXIgYnV0IGdvdCBkZXB0aFJhZGl1cyAke2RlcHRoUmFkaXVzfS5gKTtcblxuICBsZXQgeDREID0gJHggYXMgVGVuc29yNEQ7XG4gIGxldCByZXNoYXBlZFRvNEQgPSBmYWxzZTtcbiAgaWYgKCR4LnJhbmsgPT09IDMpIHtcbiAgICByZXNoYXBlZFRvNEQgPSB0cnVlO1xuICAgIHg0RCA9IHJlc2hhcGUoJHgsIFsxLCAkeC5zaGFwZVswXSwgJHguc2hhcGVbMV0sICR4LnNoYXBlWzJdXSk7XG4gIH1cblxuICBjb25zdCBpbnB1dHM6IExSTklucHV0cyA9IHt4OiB4NER9O1xuXG4gIGNvbnN0IGF0dHJzOiBMUk5BdHRycyA9IHtkZXB0aFJhZGl1cywgYmlhcywgYWxwaGEsIGJldGF9O1xuXG4gIC8vIHRzbGludDpkaXNhYmxlLW5leHQtbGluZTogbm8tdW5uZWNlc3NhcnktdHlwZS1hc3NlcnRpb25cbiAgY29uc3QgcmVzID0gRU5HSU5FLnJ1bktlcm5lbChcbiAgICAgICAgICAgICAgICAgIExSTiwgaW5wdXRzIGFzIHt9IGFzIE5hbWVkVGVuc29yTWFwLFxuICAgICAgICAgICAgICAgICAgYXR0cnMgYXMge30gYXMgTmFtZWRBdHRyTWFwKSBhcyBUO1xuXG4gIGlmIChyZXNoYXBlZFRvNEQpIHtcbiAgICByZXR1cm4gcmVzaGFwZShyZXMsIFtyZXMuc2hhcGVbMV0sIHJlcy5zaGFwZVsyXSwgcmVzLnNoYXBlWzNdXSkgYXMgVDtcbiAgfSBlbHNlIHtcbiAgICByZXR1cm4gcmVzO1xuICB9XG59XG5cbmV4cG9ydCBjb25zdCBsb2NhbFJlc3BvbnNlTm9ybWFsaXphdGlvbiA9IG9wKHtsb2NhbFJlc3BvbnNlTm9ybWFsaXphdGlvbl99KTtcbiJdfQ==","/**\n * @license\n * Copyright 2018 Google LLC. All Rights Reserved.\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n * =============================================================================\n */\nimport { ENGINE } from '../engine';\nimport { Log } from '../kernel_names';\nimport { convertToTensor } from '../tensor_util_env';\nimport { op } from './operation';\n/**\n * Computes natural logarithm of the input `tf.Tensor` element-wise: `ln(x)`\n *\n * ```js\n * const x = tf.tensor1d([1, 2, Math.E]);\n *\n * x.log().print(); // or tf.log(x)\n * ```\n * @param x The input tensor.\n *\n * @doc {heading: 'Operations', subheading: 'Basic math'}\n */\nfunction log_(x) {\n const $x = convertToTensor(x, 'x', 'log', 'float32');\n const inputs = { x: $x };\n return ENGINE.runKernel(Log, inputs);\n}\nexport const log = op({ log_ });\n//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibG9nLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vLi4vdGZqcy1jb3JlL3NyYy9vcHMvbG9nLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBOzs7Ozs7Ozs7Ozs7Ozs7R0FlRztBQUVILE9BQU8sRUFBQyxNQUFNLEVBQUMsTUFBTSxXQUFXLENBQUM7QUFDakMsT0FBTyxFQUFDLEdBQUcsRUFBWSxNQUFNLGlCQUFpQixDQUFDO0FBRy9DLE9BQU8sRUFBQyxlQUFlLEVBQUMsTUFBTSxvQkFBb0IsQ0FBQztBQUduRCxPQUFPLEVBQUMsRUFBRSxFQUFDLE1BQU0sYUFBYSxDQUFDO0FBRS9COzs7Ozs7Ozs7OztHQVdHO0FBQ0gsU0FBUyxJQUFJLENBQW1CLENBQWU7SUFDN0MsTUFBTSxFQUFFLEdBQUcsZUFBZSxDQUFDLENBQUMsRUFBRSxHQUFHLEVBQUUsS0FBSyxFQUFFLFNBQVMsQ0FBQyxDQUFDO0lBRXJELE1BQU0sTUFBTSxHQUFjLEVBQUMsQ0FBQyxFQUFFLEVBQUUsRUFBQyxDQUFDO0lBQ2xDLE9BQU8sTUFBTSxDQUFDLFNBQVMsQ0FBQyxHQUFHLEVBQUUsTUFBOEIsQ0FBQyxDQUFDO0FBQy9ELENBQUM7QUFDRCxNQUFNLENBQUMsTUFBTSxHQUFHLEdBQUcsRUFBRSxDQUFDLEVBQUMsSUFBSSxFQUFDLENBQUMsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbIi8qKlxuICogQGxpY2Vuc2VcbiAqIENvcHlyaWdodCAyMDE4IEdvb2dsZSBMTEMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuXG4gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgXCJMaWNlbnNlXCIpO1xuICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLlxuICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0XG4gKlxuICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wXG4gKlxuICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZVxuICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gXCJBUyBJU1wiIEJBU0lTLFxuICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuXG4gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kXG4gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS5cbiAqID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4gKi9cblxuaW1wb3J0IHtFTkdJTkV9IGZyb20gJy4uL2VuZ2luZSc7XG5pbXBvcnQge0xvZywgTG9nSW5wdXRzfSBmcm9tICcuLi9rZXJuZWxfbmFtZXMnO1xuaW1wb3J0IHtUZW5zb3J9IGZyb20gJy4uL3RlbnNvcic7XG5pbXBvcnQge05hbWVkVGVuc29yTWFwfSBmcm9tICcuLi90ZW5zb3JfdHlwZXMnO1xuaW1wb3J0IHtjb252ZXJ0VG9UZW5zb3J9IGZyb20gJy4uL3RlbnNvcl91dGlsX2Vudic7XG5pbXBvcnQge1RlbnNvckxpa2V9IGZyb20gJy4uL3R5cGVzJztcblxuaW1wb3J0IHtvcH0gZnJvbSAnLi9vcGVyYXRpb24nO1xuXG4vKipcbiAqIENvbXB1dGVzIG5hdHVyYWwgbG9nYXJpdGhtIG9mIHRoZSBpbnB1dCBgdGYuVGVuc29yYCBlbGVtZW50LXdpc2U6IGBsbih4KWBcbiAqXG4gKiBgYGBqc1xuICogY29uc3QgeCA9IHRmLnRlbnNvcjFkKFsxLCAyLCBNYXRoLkVdKTtcbiAqXG4gKiB4LmxvZygpLnByaW50KCk7ICAvLyBvciB0Zi5sb2coeClcbiAqIGBgYFxuICogQHBhcmFtIHggVGhlIGlucHV0IHRlbnNvci5cbiAqXG4gKiBAZG9jIHtoZWFkaW5nOiAnT3BlcmF0aW9ucycsIHN1YmhlYWRpbmc6ICdCYXNpYyBtYXRoJ31cbiAqL1xuZnVuY3Rpb24gbG9nXzxUIGV4dGVuZHMgVGVuc29yPih4OiBUfFRlbnNvckxpa2UpOiBUIHtcbiAgY29uc3QgJHggPSBjb252ZXJ0VG9UZW5zb3IoeCwgJ3gnLCAnbG9nJywgJ2Zsb2F0MzInKTtcblxuICBjb25zdCBpbnB1dHM6IExvZ0lucHV0cyA9IHt4OiAkeH07XG4gIHJldHVybiBFTkdJTkUucnVuS2VybmVsKExvZywgaW5wdXRzIGFzIHt9IGFzIE5hbWVkVGVuc29yTWFwKTtcbn1cbmV4cG9ydCBjb25zdCBsb2cgPSBvcCh7bG9nX30pO1xuIl19","/**\n * @license\n * Copyright 2018 Google LLC. All Rights Reserved.\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n * =============================================================================\n */\nimport { ENGINE } from '../engine';\nimport { Log1p } from '../kernel_names';\nimport { convertToTensor } from '../tensor_util_env';\nimport { op } from './operation';\n/**\n * Computes natural logarithm of the input `tf.Tensor` plus one\n * element-wise: `ln(1 + x)`\n *\n * ```js\n * const x = tf.tensor1d([1, 2, Math.E - 1]);\n *\n * x.log1p().print(); // or tf.log1p(x)\n * ```\n * @param x The input tensor.\n *\n * @doc {heading: 'Operations', subheading: 'Basic math'}\n */\nfunction log1p_(x) {\n const $x = convertToTensor(x, 'x', 'log1p');\n const inputs = { x: $x };\n return ENGINE.runKernel(Log1p, inputs);\n}\nexport const log1p = op({ log1p_ });\n//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibG9nMXAuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi8uLi90ZmpzLWNvcmUvc3JjL29wcy9sb2cxcC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQTs7Ozs7Ozs7Ozs7Ozs7O0dBZUc7QUFFSCxPQUFPLEVBQUMsTUFBTSxFQUFDLE1BQU0sV0FBVyxDQUFDO0FBQ2pDLE9BQU8sRUFBQyxLQUFLLEVBQWMsTUFBTSxpQkFBaUIsQ0FBQztBQUduRCxPQUFPLEVBQUMsZUFBZSxFQUFDLE1BQU0sb0JBQW9CLENBQUM7QUFHbkQsT0FBTyxFQUFDLEVBQUUsRUFBQyxNQUFNLGFBQWEsQ0FBQztBQUUvQjs7Ozs7Ozs7Ozs7O0dBWUc7QUFDSCxTQUFTLE1BQU0sQ0FBbUIsQ0FBZTtJQUMvQyxNQUFNLEVBQUUsR0FBRyxlQUFlLENBQUMsQ0FBQyxFQUFFLEdBQUcsRUFBRSxPQUFPLENBQUMsQ0FBQztJQUU1QyxNQUFNLE1BQU0sR0FBZ0IsRUFBQyxDQUFDLEVBQUUsRUFBRSxFQUFDLENBQUM7SUFDcEMsT0FBTyxNQUFNLENBQUMsU0FBUyxDQUFDLEtBQUssRUFBRSxNQUE4QixDQUFDLENBQUM7QUFDakUsQ0FBQztBQUNELE1BQU0sQ0FBQyxNQUFNLEtBQUssR0FBRyxFQUFFLENBQUMsRUFBQyxNQUFNLEVBQUMsQ0FBQyxDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiLyoqXG4gKiBAbGljZW5zZVxuICogQ29weXJpZ2h0IDIwMTggR29vZ2xlIExMQy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC5cbiAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSBcIkxpY2Vuc2VcIik7XG4gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuXG4gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXRcbiAqXG4gKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjBcbiAqXG4gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlXG4gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiBcIkFTIElTXCIgQkFTSVMsXG4gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC5cbiAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmRcbiAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLlxuICogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbiAqL1xuXG5pbXBvcnQge0VOR0lORX0gZnJvbSAnLi4vZW5naW5lJztcbmltcG9ydCB7TG9nMXAsIExvZzFwSW5wdXRzfSBmcm9tICcuLi9rZXJuZWxfbmFtZXMnO1xuaW1wb3J0IHtUZW5zb3J9IGZyb20gJy4uL3RlbnNvcic7XG5pbXBvcnQge05hbWVkVGVuc29yTWFwfSBmcm9tICcuLi90ZW5zb3JfdHlwZXMnO1xuaW1wb3J0IHtjb252ZXJ0VG9UZW5zb3J9IGZyb20gJy4uL3RlbnNvcl91dGlsX2Vudic7XG5pbXBvcnQge1RlbnNvckxpa2V9IGZyb20gJy4uL3R5cGVzJztcblxuaW1wb3J0IHtvcH0gZnJvbSAnLi9vcGVyYXRpb24nO1xuXG4vKipcbiAqIENvbXB1dGVzIG5hdHVyYWwgbG9nYXJpdGhtIG9mIHRoZSBpbnB1dCBgdGYuVGVuc29yYCBwbHVzIG9uZVxuICogZWxlbWVudC13aXNlOiBgbG4oMSArIHgpYFxuICpcbiAqIGBgYGpzXG4gKiBjb25zdCB4ID0gdGYudGVuc29yMWQoWzEsIDIsIE1hdGguRSAtIDFdKTtcbiAqXG4gKiB4LmxvZzFwKCkucHJpbnQoKTsgIC8vIG9yIHRmLmxvZzFwKHgpXG4gKiBgYGBcbiAqIEBwYXJhbSB4IFRoZSBpbnB1dCB0ZW5zb3IuXG4gKlxuICogQGRvYyB7aGVhZGluZzogJ09wZXJhdGlvbnMnLCBzdWJoZWFkaW5nOiAnQmFzaWMgbWF0aCd9XG4gKi9cbmZ1bmN0aW9uIGxvZzFwXzxUIGV4dGVuZHMgVGVuc29yPih4OiBUfFRlbnNvckxpa2UpOiBUIHtcbiAgY29uc3QgJHggPSBjb252ZXJ0VG9UZW5zb3IoeCwgJ3gnLCAnbG9nMXAnKTtcblxuICBjb25zdCBpbnB1dHM6IExvZzFwSW5wdXRzID0ge3g6ICR4fTtcbiAgcmV0dXJuIEVOR0lORS5ydW5LZXJuZWwoTG9nMXAsIGlucHV0cyBhcyB7fSBhcyBOYW1lZFRlbnNvck1hcCk7XG59XG5leHBvcnQgY29uc3QgbG9nMXAgPSBvcCh7bG9nMXBffSk7XG4iXX0=","/**\n * @license\n * Copyright 2018 Google LLC. All Rights Reserved.\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n * =============================================================================\n */\nimport { customGrad } from '../gradients';\nimport { convertToTensor } from '../tensor_util_env';\nimport { mul } from './mul';\nimport { neg } from './neg';\nimport { op } from './operation';\nimport { sigmoid } from './sigmoid';\nimport { softplus } from './softplus';\n/**\n * Computes log sigmoid of the input `tf.Tensor` element-wise:\n * `logSigmoid(x)`. For numerical stability, we use `-tf.softplus(-x)`.\n *\n * ```js\n * const x = tf.tensor1d([0, 1, -1, .7]);\n *\n * x.logSigmoid().print(); // or tf.logSigmoid(x)\n * ```\n * @param x The input tensor.\n *\n * @doc {heading: 'Operations', subheading: 'Basic math'}\n */\nfunction logSigmoid_(x) {\n const $x = convertToTensor(x, 'x', 'logSigmoid');\n // Use a custom gradient to maintain previous implementation.\n // There is no LogSigmoid kernel in TF so we can't use engine.runKernel\n // directly\n const customOp = customGrad((x) => {\n // TODO(yassogba) we can remove the chained softplus call here only\n // after backends have modualrized softplus at which point we can call\n // engine runKernel(..., Sotfplus, ...) directly.\n const value = neg(softplus(neg(x)));\n const gradFunc = (dy) => {\n const derX = mul(dy, sigmoid(neg(x)));\n return derX;\n };\n return { value, gradFunc };\n });\n return customOp($x);\n}\nexport const logSigmoid = op({ logSigmoid_ });\n//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibG9nX3NpZ21vaWQuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi8uLi90ZmpzLWNvcmUvc3JjL29wcy9sb2dfc2lnbW9pZC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQTs7Ozs7Ozs7Ozs7Ozs7O0dBZUc7QUFFSCxPQUFPLEVBQUMsVUFBVSxFQUFDLE1BQU0sY0FBYyxDQUFDO0FBRXhDLE9BQU8sRUFBQyxlQUFlLEVBQUMsTUFBTSxvQkFBb0IsQ0FBQztBQUduRCxPQUFPLEVBQUMsR0FBRyxFQUFDLE1BQU0sT0FBTyxDQUFDO0FBQzFCLE9BQU8sRUFBQyxHQUFHLEVBQUMsTUFBTSxPQUFPLENBQUM7QUFDMUIsT0FBTyxFQUFDLEVBQUUsRUFBQyxNQUFNLGFBQWEsQ0FBQztBQUMvQixPQUFPLEVBQUMsT0FBTyxFQUFDLE1BQU0sV0FBVyxDQUFDO0FBQ2xDLE9BQU8sRUFBQyxRQUFRLEVBQUMsTUFBTSxZQUFZLENBQUM7QUFFcEM7Ozs7Ozs7Ozs7OztHQVlHO0FBQ0gsU0FBUyxXQUFXLENBQW1CLENBQWU7SUFDcEQsTUFBTSxFQUFFLEdBQUcsZUFBZSxDQUFDLENBQUMsRUFBRSxHQUFHLEVBQUUsWUFBWSxDQUFDLENBQUM7SUFFakQsNkRBQTZEO0lBQzdELHVFQUF1RTtJQUN2RSxXQUFXO0lBQ1gsTUFBTSxRQUFRLEdBQUcsVUFBVSxDQUFDLENBQUMsQ0FBUyxFQUFFLEVBQUU7UUFDeEMsbUVBQW1FO1FBQ25FLHNFQUFzRTtRQUN0RSxpREFBaUQ7UUFDakQsTUFBTSxLQUFLLEdBQUcsR0FBRyxDQUFDLFFBQVEsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDO1FBRXBDLE1BQU0sUUFBUSxHQUFHLENBQUMsRUFBSyxFQUFFLEVBQUU7WUFDekIsTUFBTSxJQUFJLEdBQUcsR0FBRyxDQUFDLEVBQUUsRUFBRSxPQUFPLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQztZQUN0QyxPQUFPLElBQUksQ0FBQztRQUNkLENBQUMsQ0FBQztRQUNGLE9BQU8sRUFBQyxLQUFLLEVBQUUsUUFBUSxFQUFDLENBQUM7SUFDM0IsQ0FBQyxDQUFDLENBQUM7SUFFSCxPQUFPLFFBQVEsQ0FBQyxFQUFFLENBQU0sQ0FBQztBQUMzQixDQUFDO0FBQ0QsTUFBTSxDQUFDLE1BQU0sVUFBVSxHQUFHLEVBQUUsQ0FBQyxFQUFDLFdBQVcsRUFBQyxDQUFDLENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyIvKipcbiAqIEBsaWNlbnNlXG4gKiBDb3B5cmlnaHQgMjAxOCBHb29nbGUgTExDLiBBbGwgUmlnaHRzIFJlc2VydmVkLlxuICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlIFwiTGljZW5zZVwiKTtcbiAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS5cbiAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdFxuICpcbiAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMFxuICpcbiAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmVcbiAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuIFwiQVMgSVNcIiBCQVNJUyxcbiAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLlxuICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZFxuICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuXG4gKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuICovXG5cbmltcG9ydCB7Y3VzdG9tR3JhZH0gZnJvbSAnLi4vZ3JhZGllbnRzJztcbmltcG9ydCB7VGVuc29yfSBmcm9tICcuLi90ZW5zb3InO1xuaW1wb3J0IHtjb252ZXJ0VG9UZW5zb3J9IGZyb20gJy4uL3RlbnNvcl91dGlsX2Vudic7XG5pbXBvcnQge1RlbnNvckxpa2V9IGZyb20gJy4uL3R5cGVzJztcblxuaW1wb3J0IHttdWx9IGZyb20gJy4vbXVsJztcbmltcG9ydCB7bmVnfSBmcm9tICcuL25lZyc7XG5pbXBvcnQge29wfSBmcm9tICcuL29wZXJhdGlvbic7XG5pbXBvcnQge3NpZ21vaWR9IGZyb20gJy4vc2lnbW9pZCc7XG5pbXBvcnQge3NvZnRwbHVzfSBmcm9tICcuL3NvZnRwbHVzJztcblxuLyoqXG4gKiBDb21wdXRlcyBsb2cgc2lnbW9pZCBvZiB0aGUgaW5wdXQgYHRmLlRlbnNvcmAgZWxlbWVudC13aXNlOlxuICogYGxvZ1NpZ21vaWQoeClgLiBGb3IgbnVtZXJpY2FsIHN0YWJpbGl0eSwgd2UgdXNlIGAtdGYuc29mdHBsdXMoLXgpYC5cbiAqXG4gKiBgYGBqc1xuICogY29uc3QgeCA9IHRmLnRlbnNvcjFkKFswLCAxLCAtMSwgLjddKTtcbiAqXG4gKiB4LmxvZ1NpZ21vaWQoKS5wcmludCgpOyAgLy8gb3IgdGYubG9nU2lnbW9pZCh4KVxuICogYGBgXG4gKiBAcGFyYW0geCBUaGUgaW5wdXQgdGVuc29yLlxuICpcbiAqIEBkb2Mge2hlYWRpbmc6ICdPcGVyYXRpb25zJywgc3ViaGVhZGluZzogJ0Jhc2ljIG1hdGgnfVxuICovXG5mdW5jdGlvbiBsb2dTaWdtb2lkXzxUIGV4dGVuZHMgVGVuc29yPih4OiBUfFRlbnNvckxpa2UpOiBUIHtcbiAgY29uc3QgJHggPSBjb252ZXJ0VG9UZW5zb3IoeCwgJ3gnLCAnbG9nU2lnbW9pZCcpO1xuXG4gIC8vIFVzZSBhIGN1c3RvbSBncmFkaWVudCB0byBtYWludGFpbiBwcmV2aW91cyBpbXBsZW1lbnRhdGlvbi5cbiAgLy8gVGhlcmUgaXMgbm8gTG9nU2lnbW9pZCBrZXJuZWwgaW4gVEYgc28gd2UgY2FuJ3QgdXNlIGVuZ2luZS5ydW5LZXJuZWxcbiAgLy8gZGlyZWN0bHlcbiAgY29uc3QgY3VzdG9tT3AgPSBjdXN0b21HcmFkKCh4OiBUZW5zb3IpID0+IHtcbiAgICAvLyBUT0RPKHlhc3NvZ2JhKSB3ZSBjYW4gcmVtb3ZlIHRoZSBjaGFpbmVkIHNvZnRwbHVzIGNhbGwgaGVyZSBvbmx5XG4gICAgLy8gYWZ0ZXIgYmFja2VuZHMgaGF2ZSBtb2R1YWxyaXplZCBzb2Z0cGx1cyBhdCB3aGljaCBwb2ludCB3ZSBjYW4gY2FsbFxuICAgIC8vIGVuZ2luZSBydW5LZXJuZWwoLi4uLCBTb3RmcGx1cywgLi4uKSBkaXJlY3RseS5cbiAgICBjb25zdCB2YWx1ZSA9IG5lZyhzb2Z0cGx1cyhuZWcoeCkpKTtcblxuICAgIGNvbnN0IGdyYWRGdW5jID0gKGR5OiBUKSA9PiB7XG4gICAgICBjb25zdCBkZXJYID0gbXVsKGR5LCBzaWdtb2lkKG5lZyh4KSkpO1xuICAgICAgcmV0dXJuIGRlclg7XG4gICAgfTtcbiAgICByZXR1cm4ge3ZhbHVlLCBncmFkRnVuY307XG4gIH0pO1xuXG4gIHJldHVybiBjdXN0b21PcCgkeCkgYXMgVDtcbn1cbmV4cG9ydCBjb25zdCBsb2dTaWdtb2lkID0gb3Aoe2xvZ1NpZ21vaWRffSk7XG4iXX0=","/**\n * @license\n * Copyright 2020 Google Inc. All Rights Reserved.\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n * =============================================================================\n */\nimport { customGrad } from '../gradients';\nimport { convertToTensor } from '../tensor_util_env';\nimport { cast } from './cast';\nimport { exp } from './exp';\nimport { log } from './log';\nimport { max } from './max';\nimport { mul } from './mul';\nimport { op } from './operation';\nimport { sub } from './sub';\nimport { sum } from './sum';\n/**\n * Computes the log softmax.\n *\n * ```js\n * const a = tf.tensor1d([1, 2, 3]);\n *\n * a.logSoftmax().print(); // or tf.logSoftmax(a)\n * ```\n *\n * ```js\n * const a = tf.tensor2d([2, 4, 6, 1, 2, 3], [2, 3]);\n *\n * a.logSoftmax().print(); // or tf.logSoftmax(a)\n * ```\n *\n * @param logits The logits array.\n * @param axis The dimension softmax would be performed on. Defaults to `-1`\n * which indicates the last dimension.\n *\n * @doc {heading: 'Operations', subheading: 'Normalization'}\n */\nfunction logSoftmax_(logits, axis = -1) {\n const $logits = convertToTensor(logits, 'logits', 'logSoftmax');\n if (axis === -1) {\n axis = $logits.rank - 1;\n }\n if (axis !== $logits.rank - 1) {\n throw Error('Log Softmax along a non-last dimension is not yet supported. ' +\n `Logits was rank ${$logits.rank} and axis was ${axis}`);\n }\n // const forward: ForwardFunc = (backend, save) => {\n // const keepDims = true;\n // const xMax = max(logits, axis, true);\n // const shifted = sub(logits, xMax);\n // const value =\n // sub(cast(shifted, 'float32'), log(sum(exp(shifted), axis,\n // keepDims)));\n // save([value]);\n // return value;\n // };\n // Use a custom gradient for numerical stability.\n const customOp = customGrad((logits, save) => {\n const keepDims = true;\n const xMax = max(logits, axis, true);\n const shifted = sub(logits, xMax);\n const value = sub(cast(shifted, 'float32'), log(sum(exp(shifted), axis, keepDims)));\n save([value]);\n const gradFunc = (dy, saved) => {\n const [value] = saved;\n const keepDims = true;\n const softmax = exp(value);\n return sub(dy, mul(sum(dy, axis, keepDims), softmax));\n };\n return { value, gradFunc };\n });\n return customOp($logits);\n // TODO Use Engine.runKernel when CPU/WebGL/WASM backends implement this.\n // const inputs: LogSoftmaxInputs = {logits: $logits};\n // const attrs: LogSoftmaxAttrs = {axis};\n // return ENGINE.runKernel(\n // LogSoftmax, inputs as {} as NamedTensorMap,\n // attrs as {} as NamedAttrMap);\n}\nexport const logSoftmax = op({ logSoftmax_ });\n//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibG9nX3NvZnRtYXguanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi8uLi90ZmpzLWNvcmUvc3JjL29wcy9sb2dfc29mdG1heC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQTs7Ozs7Ozs7Ozs7Ozs7O0dBZUc7QUFFSCxPQUFPLEVBQUMsVUFBVSxFQUFDLE1BQU0sY0FBYyxDQUFDO0FBSXhDLE9BQU8sRUFBQyxlQUFlLEVBQUMsTUFBTSxvQkFBb0IsQ0FBQztBQUduRCxPQUFPLEVBQUMsSUFBSSxFQUFDLE1BQU0sUUFBUSxDQUFDO0FBQzVCLE9BQU8sRUFBQyxHQUFHLEVBQUMsTUFBTSxPQUFPLENBQUM7QUFDMUIsT0FBTyxFQUFDLEdBQUcsRUFBQyxNQUFNLE9BQU8sQ0FBQztBQUMxQixPQUFPLEVBQUMsR0FBRyxFQUFDLE1BQU0sT0FBTyxDQUFDO0FBQzFCLE9BQU8sRUFBQyxHQUFHLEVBQUMsTUFBTSxPQUFPLENBQUM7QUFDMUIsT0FBTyxFQUFDLEVBQUUsRUFBQyxNQUFNLGFBQWEsQ0FBQztBQUMvQixPQUFPLEVBQUMsR0FBRyxFQUFDLE1BQU0sT0FBTyxDQUFDO0FBQzFCLE9BQU8sRUFBQyxHQUFHLEVBQUMsTUFBTSxPQUFPLENBQUM7QUFFMUI7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7O0dBb0JHO0FBQ0gsU0FBUyxXQUFXLENBQW1CLE1BQW9CLEVBQUUsSUFBSSxHQUFHLENBQUMsQ0FBQztJQUNwRSxNQUFNLE9BQU8sR0FBRyxlQUFlLENBQUMsTUFBTSxFQUFFLFFBQVEsRUFBRSxZQUFZLENBQUMsQ0FBQztJQUVoRSxJQUFJLElBQUksS0FBSyxDQUFDLENBQUMsRUFBRTtRQUNmLElBQUksR0FBRyxPQUFPLENBQUMsSUFBSSxHQUFHLENBQUMsQ0FBQztLQUN6QjtJQUNELElBQUksSUFBSSxLQUFLLE9BQU8sQ0FBQyxJQUFJLEdBQUcsQ0FBQyxFQUFFO1FBQzdCLE1BQU0sS0FBSyxDQUNQLCtEQUErRDtZQUMvRCxtQkFBbUIsT0FBTyxDQUFDLElBQUksaUJBQWlCLElBQUksRUFBRSxDQUFDLENBQUM7S0FDN0Q7SUFFRCw0REFBNEQ7SUFDNUQsMkJBQTJCO0lBQzNCLDBDQUEwQztJQUMxQyx1Q0FBdUM7SUFDdkMsa0JBQWtCO0lBQ2xCLGtFQUFrRTtJQUNsRSxxQkFBcUI7SUFDckIsbUJBQW1CO0lBQ25CLGtCQUFrQjtJQUNsQixLQUFLO0lBRUwsaURBQWlEO0lBQ2pELE1BQU0sUUFBUSxHQUFHLFVBQVUsQ0FBQyxDQUFDLE1BQWMsRUFBRSxJQUFrQixFQUFFLEVBQUU7UUFDakUsTUFBTSxRQUFRLEdBQUcsSUFBSSxDQUFDO1FBQ3RCLE1BQU0sSUFBSSxHQUFHLEdBQUcsQ0FBQyxNQUFNLEVBQUUsSUFBSSxFQUFFLElBQUksQ0FBQyxDQUFDO1FBQ3JDLE1BQU0sT0FBTyxHQUFHLEdBQUcsQ0FBQyxNQUFNLEVBQUUsSUFBSSxDQUFDLENBQUM7UUFDbEMsTUFBTSxLQUFLLEdBQ1AsR0FBRyxDQUFDLElBQUksQ0FBQyxPQUFPLEVBQUUsU0FBUyxDQUFDLEVBQUUsR0FBRyxDQUFDLEdBQUcsQ0FBQyxHQUFHLENBQUMsT0FBTyxDQUFDLEVBQUUsSUFBSSxFQUFFLFFBQVEsQ0FBQyxDQUFDLENBQUMsQ0FBQztRQUMxRSxJQUFJLENBQUMsQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDO1FBRWQsTUFBTSxRQUFRLEdBQUcsQ0FBQyxFQUFVLEVBQUUsS0FBZSxFQUFFLEVBQUU7WUFDL0MsTUFBTSxDQUFDLEtBQUssQ0FBQyxHQUFHLEtBQUssQ0FBQztZQUN0QixNQUFNLFFBQVEsR0FBRyxJQUFJLENBQUM7WUFDdEIsTUFBTSxPQUFPLEdBQUcsR0FBRyxDQUFDLEtBQUssQ0FBQyxDQUFDO1lBQzNCLE9BQU8sR0FBRyxDQUFDLEVBQUUsRUFBRSxHQUFHLENBQUMsR0FBRyxDQUFDLEVBQUUsRUFBRSxJQUFJLEVBQUUsUUFBUSxDQUFDLEVBQUUsT0FBTyxDQUFDLENBQUMsQ0FBQztRQUN4RCxDQUFDLENBQUM7UUFDRixPQUFPLEVBQUMsS0FBSyxFQUFFLFFBQVEsRUFBQyxDQUFDO0lBQzNCLENBQUMsQ0FBQyxDQUFDO0lBRUgsT0FBTyxRQUFRLENBQUMsT0FBTyxDQUFNLENBQUM7SUFFOUIseUVBQXlFO0lBQ3pFLHNEQUFzRDtJQUN0RCx5Q0FBeUM7SUFDekMsMkJBQTJCO0lBQzNCLHlEQUF5RDtJQUN6RCwyQ0FBMkM7QUFDN0MsQ0FBQztBQUVELE1BQU0sQ0FBQyxNQUFNLFVBQVUsR0FBRyxFQUFFLENBQUMsRUFBQyxXQUFXLEVBQUMsQ0FBQyxDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiLyoqXG4gKiBAbGljZW5zZVxuICogQ29weXJpZ2h0IDIwMjAgR29vZ2xlIEluYy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC5cbiAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSBcIkxpY2Vuc2VcIik7XG4gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuXG4gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXRcbiAqXG4gKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjBcbiAqXG4gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlXG4gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiBcIkFTIElTXCIgQkFTSVMsXG4gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC5cbiAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmRcbiAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLlxuICogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbiAqL1xuXG5pbXBvcnQge2N1c3RvbUdyYWR9IGZyb20gJy4uL2dyYWRpZW50cyc7XG5cbmltcG9ydCB7VGVuc29yfSBmcm9tICcuLi90ZW5zb3InO1xuaW1wb3J0IHtHcmFkU2F2ZUZ1bmN9IGZyb20gJy4uL3RlbnNvcl90eXBlcyc7XG5pbXBvcnQge2NvbnZlcnRUb1RlbnNvcn0gZnJvbSAnLi4vdGVuc29yX3V0aWxfZW52JztcbmltcG9ydCB7VGVuc29yTGlrZX0gZnJvbSAnLi4vdHlwZXMnO1xuXG5pbXBvcnQge2Nhc3R9IGZyb20gJy4vY2FzdCc7XG5pbXBvcnQge2V4cH0gZnJvbSAnLi9leHAnO1xuaW1wb3J0IHtsb2d9IGZyb20gJy4vbG9nJztcbmltcG9ydCB7bWF4fSBmcm9tICcuL21heCc7XG5pbXBvcnQge211bH0gZnJvbSAnLi9tdWwnO1xuaW1wb3J0IHtvcH0gZnJvbSAnLi9vcGVyYXRpb24nO1xuaW1wb3J0IHtzdWJ9IGZyb20gJy4vc3ViJztcbmltcG9ydCB7c3VtfSBmcm9tICcuL3N1bSc7XG5cbi8qKlxuICogQ29tcHV0ZXMgdGhlIGxvZyBzb2Z0bWF4LlxuICpcbiAqIGBgYGpzXG4gKiBjb25zdCBhID0gdGYudGVuc29yMWQoWzEsIDIsIDNdKTtcbiAqXG4gKiBhLmxvZ1NvZnRtYXgoKS5wcmludCgpOyAgLy8gb3IgdGYubG9nU29mdG1heChhKVxuICogYGBgXG4gKlxuICogYGBganNcbiAqIGNvbnN0IGEgPSB0Zi50ZW5zb3IyZChbMiwgNCwgNiwgMSwgMiwgM10sIFsyLCAzXSk7XG4gKlxuICogYS5sb2dTb2Z0bWF4KCkucHJpbnQoKTsgIC8vIG9yIHRmLmxvZ1NvZnRtYXgoYSlcbiAqIGBgYFxuICpcbiAqIEBwYXJhbSBsb2dpdHMgVGhlIGxvZ2l0cyBhcnJheS5cbiAqIEBwYXJhbSBheGlzIFRoZSBkaW1lbnNpb24gc29mdG1heCB3b3VsZCBiZSBwZXJmb3JtZWQgb24uIERlZmF1bHRzIHRvIGAtMWBcbiAqICAgICB3aGljaCBpbmRpY2F0ZXMgdGhlIGxhc3QgZGltZW5zaW9uLlxuICpcbiAqIEBkb2Mge2hlYWRpbmc6ICdPcGVyYXRpb25zJywgc3ViaGVhZGluZzogJ05vcm1hbGl6YXRpb24nfVxuICovXG5mdW5jdGlvbiBsb2dTb2Z0bWF4XzxUIGV4dGVuZHMgVGVuc29yPihsb2dpdHM6IFR8VGVuc29yTGlrZSwgYXhpcyA9IC0xKTogVCB7XG4gIGNvbnN0ICRsb2dpdHMgPSBjb252ZXJ0VG9UZW5zb3IobG9naXRzLCAnbG9naXRzJywgJ2xvZ1NvZnRtYXgnKTtcblxuICBpZiAoYXhpcyA9PT0gLTEpIHtcbiAgICBheGlzID0gJGxvZ2l0cy5yYW5rIC0gMTtcbiAgfVxuICBpZiAoYXhpcyAhPT0gJGxvZ2l0cy5yYW5rIC0gMSkge1xuICAgIHRocm93IEVycm9yKFxuICAgICAgICAnTG9nIFNvZnRtYXggYWxvbmcgYSBub24tbGFzdCBkaW1lbnNpb24gaXMgbm90IHlldCBzdXBwb3J0ZWQuICcgK1xuICAgICAgICBgTG9naXRzIHdhcyByYW5rICR7JGxvZ2l0cy5yYW5rfSBhbmQgYXhpcyB3YXMgJHtheGlzfWApO1xuICB9XG5cbiAgLy8gY29uc3QgZm9yd2FyZDogRm9yd2FyZEZ1bmM8VGVuc29yPiA9IChiYWNrZW5kLCBzYXZlKSA9PiB7XG4gIC8vICAgY29uc3Qga2VlcERpbXMgPSB0cnVlO1xuICAvLyAgIGNvbnN0IHhNYXggPSBtYXgobG9naXRzLCBheGlzLCB0cnVlKTtcbiAgLy8gICBjb25zdCBzaGlmdGVkID0gc3ViKGxvZ2l0cywgeE1heCk7XG4gIC8vICAgY29uc3QgdmFsdWUgPVxuICAvLyAgICAgICBzdWIoY2FzdChzaGlmdGVkLCAnZmxvYXQzMicpLCBsb2coc3VtKGV4cChzaGlmdGVkKSwgYXhpcyxcbiAgLy8gICAgICAga2VlcERpbXMpKSk7XG4gIC8vICAgc2F2ZShbdmFsdWVdKTtcbiAgLy8gICByZXR1cm4gdmFsdWU7XG4gIC8vIH07XG5cbiAgLy8gVXNlIGEgY3VzdG9tIGdyYWRpZW50IGZvciBudW1lcmljYWwgc3RhYmlsaXR5LlxuICBjb25zdCBjdXN0b21PcCA9IGN1c3RvbUdyYWQoKGxvZ2l0czogVGVuc29yLCBzYXZlOiBHcmFkU2F2ZUZ1bmMpID0+IHtcbiAgICBjb25zdCBrZWVwRGltcyA9IHRydWU7XG4gICAgY29uc3QgeE1heCA9IG1heChsb2dpdHMsIGF4aXMsIHRydWUpO1xuICAgIGNvbnN0IHNoaWZ0ZWQgPSBzdWIobG9naXRzLCB4TWF4KTtcbiAgICBjb25zdCB2YWx1ZSA9XG4gICAgICAgIHN1YihjYXN0KHNoaWZ0ZWQsICdmbG9hdDMyJyksIGxvZyhzdW0oZXhwKHNoaWZ0ZWQpLCBheGlzLCBrZWVwRGltcykpKTtcbiAgICBzYXZlKFt2YWx1ZV0pO1xuXG4gICAgY29uc3QgZ3JhZEZ1bmMgPSAoZHk6IFRlbnNvciwgc2F2ZWQ6IFRlbnNvcltdKSA9PiB7XG4gICAgICBjb25zdCBbdmFsdWVdID0gc2F2ZWQ7XG4gICAgICBjb25zdCBrZWVwRGltcyA9IHRydWU7XG4gICAgICBjb25zdCBzb2Z0bWF4ID0gZXhwKHZhbHVlKTtcbiAgICAgIHJldHVybiBzdWIoZHksIG11bChzdW0oZHksIGF4aXMsIGtlZXBEaW1zKSwgc29mdG1heCkpO1xuICAgIH07XG4gICAgcmV0dXJuIHt2YWx1ZSwgZ3JhZEZ1bmN9O1xuICB9KTtcblxuICByZXR1cm4gY3VzdG9tT3AoJGxvZ2l0cykgYXMgVDtcblxuICAvLyBUT0RPIFVzZSBFbmdpbmUucnVuS2VybmVsIHdoZW4gQ1BVL1dlYkdML1dBU00gYmFja2VuZHMgaW1wbGVtZW50IHRoaXMuXG4gIC8vIGNvbnN0IGlucHV0czogTG9nU29mdG1heElucHV0cyA9IHtsb2dpdHM6ICRsb2dpdHN9O1xuICAvLyBjb25zdCBhdHRyczogTG9nU29mdG1heEF0dHJzID0ge2F4aXN9O1xuICAvLyByZXR1cm4gRU5HSU5FLnJ1bktlcm5lbChcbiAgLy8gICAgICAgICAgICBMb2dTb2Z0bWF4LCBpbnB1dHMgYXMge30gYXMgTmFtZWRUZW5zb3JNYXAsXG4gIC8vICAgICAgICAgICAgYXR0cnMgYXMge30gYXMgTmFtZWRBdHRyTWFwKTtcbn1cblxuZXhwb3J0IGNvbnN0IGxvZ1NvZnRtYXggPSBvcCh7bG9nU29mdG1heF99KTtcbiJdfQ==","/**\n * @license\n * Copyright 2020 Google LLC. All Rights Reserved.\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n * =============================================================================\n */\nimport { convertToTensor } from '../tensor_util_env';\nimport { parseAxisParam } from '../util';\nimport { add } from './add';\nimport { expandShapeToKeepDim } from './axis_util';\nimport { exp } from './exp';\nimport { log } from './log';\nimport { max } from './max';\nimport { op } from './operation';\nimport { reshape } from './reshape';\nimport { sub } from './sub';\nimport { sum } from './sum';\n/**\n * Computes the log(sum(exp(elements across the reduction dimensions))).\n *\n * Reduces the input along the dimensions given in `axis`. Unless `keepDims`\n * is true, the rank of the array is reduced by 1 for each entry in `axis`.\n * If `keepDims` is true, the reduced dimensions are retained with length 1.\n * If `axis` has no entries, all dimensions are reduced, and an array with a\n * single element is returned.\n *\n * ```js\n * const x = tf.tensor1d([1, 2, 3]);\n *\n * x.logSumExp().print(); // or tf.logSumExp(x)\n * ```\n *\n * ```js\n * const x = tf.tensor2d([1, 2, 3, 4], [2, 2]);\n *\n * const axis = 1;\n * x.logSumExp(axis).print(); // or tf.logSumExp(a, axis)\n * ```\n * @param x The input tensor.\n * @param axis The dimension(s) to reduce. If null (the default),\n * reduces all dimensions.\n * @param keepDims If true, retains reduced dimensions with length\n * of 1. Defaults to false.\n *\n * @doc {heading: 'Operations', subheading: 'Reduction'}\n */\nfunction logSumExp_(x, axis = null, keepDims = false) {\n const $x = convertToTensor(x, 'x', 'logSumExp');\n const axes = parseAxisParam(axis, $x.shape);\n const xMax = max($x, axes, true /* keepDims */);\n const a = sub($x, xMax);\n const b = exp(a);\n const c = sum(b, axes);\n const d = log(c);\n const res = add(reshape(xMax, d.shape), d);\n if (keepDims) {\n const newShape = expandShapeToKeepDim(res.shape, axes);\n return reshape(res, newShape);\n }\n return res;\n}\nexport const logSumExp = op({ logSumExp_ });\n//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibG9nX3N1bV9leHAuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi8uLi90ZmpzLWNvcmUvc3JjL29wcy9sb2dfc3VtX2V4cC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQTs7Ozs7Ozs7Ozs7Ozs7O0dBZUc7QUFHSCxPQUFPLEVBQUMsZUFBZSxFQUFDLE1BQU0sb0JBQW9CLENBQUM7QUFFbkQsT0FBTyxFQUFDLGNBQWMsRUFBQyxNQUFNLFNBQVMsQ0FBQztBQUV2QyxPQUFPLEVBQUMsR0FBRyxFQUFDLE1BQU0sT0FBTyxDQUFDO0FBQzFCLE9BQU8sRUFBQyxvQkFBb0IsRUFBQyxNQUFNLGFBQWEsQ0FBQztBQUNqRCxPQUFPLEVBQUMsR0FBRyxFQUFDLE1BQU0sT0FBTyxDQUFDO0FBQzFCLE9BQU8sRUFBQyxHQUFHLEVBQUMsTUFBTSxPQUFPLENBQUM7QUFDMUIsT0FBTyxFQUFDLEdBQUcsRUFBQyxNQUFNLE9BQU8sQ0FBQztBQUMxQixPQUFPLEVBQUMsRUFBRSxFQUFDLE1BQU0sYUFBYSxDQUFDO0FBQy9CLE9BQU8sRUFBQyxPQUFPLEVBQUMsTUFBTSxXQUFXLENBQUM7QUFDbEMsT0FBTyxFQUFDLEdBQUcsRUFBQyxNQUFNLE9BQU8sQ0FBQztBQUMxQixPQUFPLEVBQUMsR0FBRyxFQUFDLE1BQU0sT0FBTyxDQUFDO0FBRTFCOzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7O0dBNEJHO0FBQ0gsU0FBUyxVQUFVLENBQ2YsQ0FBb0IsRUFBRSxPQUF3QixJQUFJLEVBQUUsUUFBUSxHQUFHLEtBQUs7SUFDdEUsTUFBTSxFQUFFLEdBQUcsZUFBZSxDQUFDLENBQUMsRUFBRSxHQUFHLEVBQUUsV0FBVyxDQUFDLENBQUM7SUFFaEQsTUFBTSxJQUFJLEdBQUcsY0FBYyxDQUFDLElBQUksRUFBRSxFQUFFLENBQUMsS0FBSyxDQUFDLENBQUM7SUFDNUMsTUFBTSxJQUFJLEdBQUcsR0FBRyxDQUFDLEVBQUUsRUFBRSxJQUFJLEVBQUUsSUFBSSxDQUFDLGNBQWMsQ0FBQyxDQUFDO0lBQ2hELE1BQU0sQ0FBQyxHQUFHLEdBQUcsQ0FBQyxFQUFFLEVBQUUsSUFBSSxDQUFDLENBQUM7SUFDeEIsTUFBTSxDQUFDLEdBQUcsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDO0lBQ2pCLE1BQU0sQ0FBQyxHQUFHLEdBQUcsQ0FBQyxDQUFDLEVBQUUsSUFBSSxDQUFDLENBQUM7SUFDdkIsTUFBTSxDQUFDLEdBQUcsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDO0lBQ2pCLE1BQU0sR0FBRyxHQUFHLEdBQUcsQ0FBQyxPQUFPLENBQUMsSUFBSSxFQUFFLENBQUMsQ0FBQyxLQUFLLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQztJQUUzQyxJQUFJLFFBQVEsRUFBRTtRQUNaLE1BQU0sUUFBUSxHQUFHLG9CQUFvQixDQUFDLEdBQUcsQ0FBQyxLQUFLLEVBQUUsSUFBSSxDQUFDLENBQUM7UUFDdkQsT0FBTyxPQUFPLENBQUMsR0FBRyxFQUFFLFFBQVEsQ0FBTSxDQUFDO0tBQ3BDO0lBQ0QsT0FBTyxHQUFRLENBQUM7QUFDbEIsQ0FBQztBQUVELE1BQU0sQ0FBQyxNQUFNLFNBQVMsR0FBRyxFQUFFLENBQUMsRUFBQyxVQUFVLEVBQUMsQ0FBQyxDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiLyoqXG4gKiBAbGljZW5zZVxuICogQ29weXJpZ2h0IDIwMjAgR29vZ2xlIExMQy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC5cbiAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSBcIkxpY2Vuc2VcIik7XG4gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuXG4gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXRcbiAqXG4gKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjBcbiAqXG4gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlXG4gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiBcIkFTIElTXCIgQkFTSVMsXG4gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC5cbiAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmRcbiAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLlxuICogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbiAqL1xuXG5pbXBvcnQge1RlbnNvcn0gZnJvbSAnLi4vdGVuc29yJztcbmltcG9ydCB7Y29udmVydFRvVGVuc29yfSBmcm9tICcuLi90ZW5zb3JfdXRpbF9lbnYnO1xuaW1wb3J0IHtUZW5zb3JMaWtlfSBmcm9tICcuLi90eXBlcyc7XG5pbXBvcnQge3BhcnNlQXhpc1BhcmFtfSBmcm9tICcuLi91dGlsJztcblxuaW1wb3J0IHthZGR9IGZyb20gJy4vYWRkJztcbmltcG9ydCB7ZXhwYW5kU2hhcGVUb0tlZXBEaW19IGZyb20gJy4vYXhpc191dGlsJztcbmltcG9ydCB7ZXhwfSBmcm9tICcuL2V4cCc7XG5pbXBvcnQge2xvZ30gZnJvbSAnLi9sb2cnO1xuaW1wb3J0IHttYXh9IGZyb20gJy4vbWF4JztcbmltcG9ydCB7b3B9IGZyb20gJy4vb3BlcmF0aW9uJztcbmltcG9ydCB7cmVzaGFwZX0gZnJvbSAnLi9yZXNoYXBlJztcbmltcG9ydCB7c3VifSBmcm9tICcuL3N1Yic7XG5pbXBvcnQge3N1bX0gZnJvbSAnLi9zdW0nO1xuXG4vKipcbiAqIENvbXB1dGVzIHRoZSBsb2coc3VtKGV4cChlbGVtZW50cyBhY3Jvc3MgdGhlIHJlZHVjdGlvbiBkaW1lbnNpb25zKSkpLlxuICpcbiAqIFJlZHVjZXMgdGhlIGlucHV0IGFsb25nIHRoZSBkaW1lbnNpb25zIGdpdmVuIGluIGBheGlzYC4gVW5sZXNzIGBrZWVwRGltc2BcbiAqIGlzIHRydWUsIHRoZSByYW5rIG9mIHRoZSBhcnJheSBpcyByZWR1Y2VkIGJ5IDEgZm9yIGVhY2ggZW50cnkgaW4gYGF4aXNgLlxuICogSWYgYGtlZXBEaW1zYCBpcyB0cnVlLCB0aGUgcmVkdWNlZCBkaW1lbnNpb25zIGFyZSByZXRhaW5lZCB3aXRoIGxlbmd0aCAxLlxuICogSWYgYGF4aXNgIGhhcyBubyBlbnRyaWVzLCBhbGwgZGltZW5zaW9ucyBhcmUgcmVkdWNlZCwgYW5kIGFuIGFycmF5IHdpdGggYVxuICogc2luZ2xlIGVsZW1lbnQgaXMgcmV0dXJuZWQuXG4gKlxuICogYGBganNcbiAqIGNvbnN0IHggPSB0Zi50ZW5zb3IxZChbMSwgMiwgM10pO1xuICpcbiAqIHgubG9nU3VtRXhwKCkucHJpbnQoKTsgIC8vIG9yIHRmLmxvZ1N1bUV4cCh4KVxuICogYGBgXG4gKlxuICogYGBganNcbiAqIGNvbnN0IHggPSB0Zi50ZW5zb3IyZChbMSwgMiwgMywgNF0sIFsyLCAyXSk7XG4gKlxuICogY29uc3QgYXhpcyA9IDE7XG4gKiB4LmxvZ1N1bUV4cChheGlzKS5wcmludCgpOyAgLy8gb3IgdGYubG9nU3VtRXhwKGEsIGF4aXMpXG4gKiBgYGBcbiAqIEBwYXJhbSB4IFRoZSBpbnB1dCB0ZW5zb3IuXG4gKiBAcGFyYW0gYXhpcyBUaGUgZGltZW5zaW9uKHMpIHRvIHJlZHVjZS4gSWYgbnVsbCAodGhlIGRlZmF1bHQpLFxuICogICAgIHJlZHVjZXMgYWxsIGRpbWVuc2lvbnMuXG4gKiBAcGFyYW0ga2VlcERpbXMgSWYgdHJ1ZSwgcmV0YWlucyByZWR1Y2VkIGRpbWVuc2lvbnMgd2l0aCBsZW5ndGhcbiAqICAgICBvZiAxLiBEZWZhdWx0cyB0byBmYWxzZS5cbiAqXG4gKiBAZG9jIHtoZWFkaW5nOiAnT3BlcmF0aW9ucycsIHN1YmhlYWRpbmc6ICdSZWR1Y3Rpb24nfVxuICovXG5mdW5jdGlvbiBsb2dTdW1FeHBfPFQgZXh0ZW5kcyBUZW5zb3I+KFxuICAgIHg6IFRlbnNvcnxUZW5zb3JMaWtlLCBheGlzOiBudW1iZXJ8bnVtYmVyW10gPSBudWxsLCBrZWVwRGltcyA9IGZhbHNlKTogVCB7XG4gIGNvbnN0ICR4ID0gY29udmVydFRvVGVuc29yKHgsICd4JywgJ2xvZ1N1bUV4cCcpO1xuXG4gIGNvbnN0IGF4ZXMgPSBwYXJzZUF4aXNQYXJhbShheGlzLCAkeC5zaGFwZSk7XG4gIGNvbnN0IHhNYXggPSBtYXgoJHgsIGF4ZXMsIHRydWUgLyoga2VlcERpbXMgKi8pO1xuICBjb25zdCBhID0gc3ViKCR4LCB4TWF4KTtcbiAgY29uc3QgYiA9IGV4cChhKTtcbiAgY29uc3QgYyA9IHN1bShiLCBheGVzKTtcbiAgY29uc3QgZCA9IGxvZyhjKTtcbiAgY29uc3QgcmVzID0gYWRkKHJlc2hhcGUoeE1heCwgZC5zaGFwZSksIGQpO1xuXG4gIGlmIChrZWVwRGltcykge1xuICAgIGNvbnN0IG5ld1NoYXBlID0gZXhwYW5kU2hhcGVUb0tlZXBEaW0ocmVzLnNoYXBlLCBheGVzKTtcbiAgICByZXR1cm4gcmVzaGFwZShyZXMsIG5ld1NoYXBlKSBhcyBUO1xuICB9XG4gIHJldHVybiByZXMgYXMgVDtcbn1cblxuZXhwb3J0IGNvbnN0IGxvZ1N1bUV4cCA9IG9wKHtsb2dTdW1FeHBffSk7XG4iXX0=","/**\n * @license\n * Copyright 2020 Google LLC. All Rights Reserved.\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n * =============================================================================\n */\nimport { ENGINE } from '../engine';\nimport { LogicalAnd } from '../kernel_names';\nimport { convertToTensor } from '../tensor_util_env';\nimport { assertAndGetBroadcastShape } from './broadcast_util';\nimport { op } from './operation';\n/**\n * Returns the truth value of `a AND b` element-wise. Supports broadcasting.\n *\n * ```js\n * const a = tf.tensor1d([false, false, true, true], 'bool');\n * const b = tf.tensor1d([false, true, false, true], 'bool');\n *\n * a.logicalAnd(b).print();\n * ```\n *\n * @param a The first input tensor. Must be of dtype bool.\n * @param b The second input tensor. Must be of dtype bool.\n *\n * @doc {heading: 'Operations', subheading: 'Logical'}\n */\nfunction logicalAnd_(a, b) {\n const $a = convertToTensor(a, 'a', 'logicalAnd', 'bool');\n const $b = convertToTensor(b, 'b', 'logicalAnd', 'bool');\n assertAndGetBroadcastShape($a.shape, $b.shape);\n const inputs = { a: $a, b: $b };\n return ENGINE.runKernel(LogicalAnd, inputs);\n}\nexport const logicalAnd = op({ logicalAnd_ });\n//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibG9naWNhbF9hbmQuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi8uLi90ZmpzLWNvcmUvc3JjL29wcy9sb2dpY2FsX2FuZC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQTs7Ozs7Ozs7Ozs7Ozs7O0dBZUc7QUFDSCxPQUFPLEVBQUMsTUFBTSxFQUFDLE1BQU0sV0FBVyxDQUFDO0FBQ2pDLE9BQU8sRUFBQyxVQUFVLEVBQW1CLE1BQU0saUJBQWlCLENBQUM7QUFHN0QsT0FBTyxFQUFDLGVBQWUsRUFBQyxNQUFNLG9CQUFvQixDQUFDO0FBR25ELE9BQU8sRUFBQywwQkFBMEIsRUFBQyxNQUFNLGtCQUFrQixDQUFDO0FBQzVELE9BQU8sRUFBQyxFQUFFLEVBQUMsTUFBTSxhQUFhLENBQUM7QUFFL0I7Ozs7Ozs7Ozs7Ozs7O0dBY0c7QUFDSCxTQUFTLFdBQVcsQ0FDaEIsQ0FBb0IsRUFBRSxDQUFvQjtJQUM1QyxNQUFNLEVBQUUsR0FBRyxlQUFlLENBQUMsQ0FBQyxFQUFFLEdBQUcsRUFBRSxZQUFZLEVBQUUsTUFBTSxDQUFDLENBQUM7SUFDekQsTUFBTSxFQUFFLEdBQUcsZUFBZSxDQUFDLENBQUMsRUFBRSxHQUFHLEVBQUUsWUFBWSxFQUFFLE1BQU0sQ0FBQyxDQUFDO0lBQ3pELDBCQUEwQixDQUFDLEVBQUUsQ0FBQyxLQUFLLEVBQUUsRUFBRSxDQUFDLEtBQUssQ0FBQyxDQUFDO0lBRS9DLE1BQU0sTUFBTSxHQUFxQixFQUFDLENBQUMsRUFBRSxFQUFFLEVBQUUsQ0FBQyxFQUFFLEVBQUUsRUFBQyxDQUFDO0lBRWhELE9BQU8sTUFBTSxDQUFDLFNBQVMsQ0FBQyxVQUFVLEVBQUUsTUFBOEIsQ0FBQyxDQUFDO0FBQ3RFLENBQUM7QUFFRCxNQUFNLENBQUMsTUFBTSxVQUFVLEdBQUcsRUFBRSxDQUFDLEVBQUMsV0FBVyxFQUFDLENBQUMsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbIi8qKlxuICogQGxpY2Vuc2VcbiAqIENvcHlyaWdodCAyMDIwIEdvb2dsZSBMTEMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuXG4gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgXCJMaWNlbnNlXCIpO1xuICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLlxuICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0XG4gKlxuICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wXG4gKlxuICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZVxuICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gXCJBUyBJU1wiIEJBU0lTLFxuICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuXG4gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kXG4gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS5cbiAqID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4gKi9cbmltcG9ydCB7RU5HSU5FfSBmcm9tICcuLi9lbmdpbmUnO1xuaW1wb3J0IHtMb2dpY2FsQW5kLCBMb2dpY2FsQW5kSW5wdXRzfSBmcm9tICcuLi9rZXJuZWxfbmFtZXMnO1xuaW1wb3J0IHtUZW5zb3J9IGZyb20gJy4uL3RlbnNvcic7XG5pbXBvcnQge05hbWVkVGVuc29yTWFwfSBmcm9tICcuLi90ZW5zb3JfdHlwZXMnO1xuaW1wb3J0IHtjb252ZXJ0VG9UZW5zb3J9IGZyb20gJy4uL3RlbnNvcl91dGlsX2Vudic7XG5pbXBvcnQge1RlbnNvckxpa2V9IGZyb20gJy4uL3R5cGVzJztcblxuaW1wb3J0IHthc3NlcnRBbmRHZXRCcm9hZGNhc3RTaGFwZX0gZnJvbSAnLi9icm9hZGNhc3RfdXRpbCc7XG5pbXBvcnQge29wfSBmcm9tICcuL29wZXJhdGlvbic7XG5cbi8qKlxuICogUmV0dXJucyB0aGUgdHJ1dGggdmFsdWUgb2YgYGEgQU5EIGJgIGVsZW1lbnQtd2lzZS4gU3VwcG9ydHMgYnJvYWRjYXN0aW5nLlxuICpcbiAqIGBgYGpzXG4gKiBjb25zdCBhID0gdGYudGVuc29yMWQoW2ZhbHNlLCBmYWxzZSwgdHJ1ZSwgdHJ1ZV0sICdib29sJyk7XG4gKiBjb25zdCBiID0gdGYudGVuc29yMWQoW2ZhbHNlLCB0cnVlLCBmYWxzZSwgdHJ1ZV0sICdib29sJyk7XG4gKlxuICogYS5sb2dpY2FsQW5kKGIpLnByaW50KCk7XG4gKiBgYGBcbiAqXG4gKiBAcGFyYW0gYSBUaGUgZmlyc3QgaW5wdXQgdGVuc29yLiBNdXN0IGJlIG9mIGR0eXBlIGJvb2wuXG4gKiBAcGFyYW0gYiBUaGUgc2Vjb25kIGlucHV0IHRlbnNvci4gTXVzdCBiZSBvZiBkdHlwZSBib29sLlxuICpcbiAqIEBkb2Mge2hlYWRpbmc6ICdPcGVyYXRpb25zJywgc3ViaGVhZGluZzogJ0xvZ2ljYWwnfVxuICovXG5mdW5jdGlvbiBsb2dpY2FsQW5kXzxUIGV4dGVuZHMgVGVuc29yPihcbiAgICBhOiBUZW5zb3J8VGVuc29yTGlrZSwgYjogVGVuc29yfFRlbnNvckxpa2UpOiBUIHtcbiAgY29uc3QgJGEgPSBjb252ZXJ0VG9UZW5zb3IoYSwgJ2EnLCAnbG9naWNhbEFuZCcsICdib29sJyk7XG4gIGNvbnN0ICRiID0gY29udmVydFRvVGVuc29yKGIsICdiJywgJ2xvZ2ljYWxBbmQnLCAnYm9vbCcpO1xuICBhc3NlcnRBbmRHZXRCcm9hZGNhc3RTaGFwZSgkYS5zaGFwZSwgJGIuc2hhcGUpO1xuXG4gIGNvbnN0IGlucHV0czogTG9naWNhbEFuZElucHV0cyA9IHthOiAkYSwgYjogJGJ9O1xuXG4gIHJldHVybiBFTkdJTkUucnVuS2VybmVsKExvZ2ljYWxBbmQsIGlucHV0cyBhcyB7fSBhcyBOYW1lZFRlbnNvck1hcCk7XG59XG5cbmV4cG9ydCBjb25zdCBsb2dpY2FsQW5kID0gb3Aoe2xvZ2ljYWxBbmRffSk7XG4iXX0=","/**\n * @license\n * Copyright 2020 Google LLC. All Rights Reserved.\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n * =============================================================================\n */\nimport { ENGINE } from '../engine';\nimport { LogicalNot } from '../kernel_names';\nimport { convertToTensor } from '../tensor_util_env';\nimport { op } from './operation';\n/**\n * Returns the truth value of `NOT x` element-wise.\n *\n * ```js\n * const a = tf.tensor1d([false, true], 'bool');\n *\n * a.logicalNot().print();\n * ```\n *\n * @param x The input tensor. Must be of dtype 'bool'.\n *\n * @doc {heading: 'Operations', subheading: 'Logical'}\n */\nfunction logicalNot_(x) {\n const $x = convertToTensor(x, 'x', 'logicalNot', 'bool');\n const inputs = { x: $x };\n return ENGINE.runKernel(LogicalNot, inputs);\n}\nexport const logicalNot = op({ logicalNot_ });\n//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibG9naWNhbF9ub3QuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi8uLi90ZmpzLWNvcmUvc3JjL29wcy9sb2dpY2FsX25vdC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQTs7Ozs7Ozs7Ozs7Ozs7O0dBZUc7QUFFSCxPQUFPLEVBQUMsTUFBTSxFQUFDLE1BQU0sV0FBVyxDQUFDO0FBQ2pDLE9BQU8sRUFBQyxVQUFVLEVBQW1CLE1BQU0saUJBQWlCLENBQUM7QUFHN0QsT0FBTyxFQUFDLGVBQWUsRUFBQyxNQUFNLG9CQUFvQixDQUFDO0FBRW5ELE9BQU8sRUFBQyxFQUFFLEVBQUMsTUFBTSxhQUFhLENBQUM7QUFFL0I7Ozs7Ozs7Ozs7OztHQVlHO0FBQ0gsU0FBUyxXQUFXLENBQW1CLENBQWU7SUFDcEQsTUFBTSxFQUFFLEdBQUcsZUFBZSxDQUFDLENBQUMsRUFBRSxHQUFHLEVBQUUsWUFBWSxFQUFFLE1BQU0sQ0FBQyxDQUFDO0lBQ3pELE1BQU0sTUFBTSxHQUFxQixFQUFDLENBQUMsRUFBRSxFQUFFLEVBQUMsQ0FBQztJQUN6QyxPQUFPLE1BQU0sQ0FBQyxTQUFTLENBQUMsVUFBVSxFQUFFLE1BQThCLENBQUMsQ0FBQztBQUN0RSxDQUFDO0FBRUQsTUFBTSxDQUFDLE1BQU0sVUFBVSxHQUFHLEVBQUUsQ0FBQyxFQUFDLFdBQVcsRUFBQyxDQUFDLENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyIvKipcbiAqIEBsaWNlbnNlXG4gKiBDb3B5cmlnaHQgMjAyMCBHb29nbGUgTExDLiBBbGwgUmlnaHRzIFJlc2VydmVkLlxuICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlIFwiTGljZW5zZVwiKTtcbiAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS5cbiAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdFxuICpcbiAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMFxuICpcbiAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmVcbiAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuIFwiQVMgSVNcIiBCQVNJUyxcbiAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLlxuICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZFxuICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuXG4gKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuICovXG5cbmltcG9ydCB7RU5HSU5FfSBmcm9tICcuLi9lbmdpbmUnO1xuaW1wb3J0IHtMb2dpY2FsTm90LCBMb2dpY2FsTm90SW5wdXRzfSBmcm9tICcuLi9rZXJuZWxfbmFtZXMnO1xuaW1wb3J0IHtUZW5zb3J9IGZyb20gJy4uL3RlbnNvcic7XG5pbXBvcnQge05hbWVkVGVuc29yTWFwfSBmcm9tICcuLi90ZW5zb3JfdHlwZXMnO1xuaW1wb3J0IHtjb252ZXJ0VG9UZW5zb3J9IGZyb20gJy4uL3RlbnNvcl91dGlsX2Vudic7XG5pbXBvcnQge1RlbnNvckxpa2V9IGZyb20gJy4uL3R5cGVzJztcbmltcG9ydCB7b3B9IGZyb20gJy4vb3BlcmF0aW9uJztcblxuLyoqXG4gKiBSZXR1cm5zIHRoZSB0cnV0aCB2YWx1ZSBvZiBgTk9UIHhgIGVsZW1lbnQtd2lzZS5cbiAqXG4gKiBgYGBqc1xuICogY29uc3QgYSA9IHRmLnRlbnNvcjFkKFtmYWxzZSwgdHJ1ZV0sICdib29sJyk7XG4gKlxuICogYS5sb2dpY2FsTm90KCkucHJpbnQoKTtcbiAqIGBgYFxuICpcbiAqIEBwYXJhbSB4IFRoZSBpbnB1dCB0ZW5zb3IuIE11c3QgYmUgb2YgZHR5cGUgJ2Jvb2wnLlxuICpcbiAqIEBkb2Mge2hlYWRpbmc6ICdPcGVyYXRpb25zJywgc3ViaGVhZGluZzogJ0xvZ2ljYWwnfVxuICovXG5mdW5jdGlvbiBsb2dpY2FsTm90XzxUIGV4dGVuZHMgVGVuc29yPih4OiBUfFRlbnNvckxpa2UpOiBUIHtcbiAgY29uc3QgJHggPSBjb252ZXJ0VG9UZW5zb3IoeCwgJ3gnLCAnbG9naWNhbE5vdCcsICdib29sJyk7XG4gIGNvbnN0IGlucHV0czogTG9naWNhbE5vdElucHV0cyA9IHt4OiAkeH07XG4gIHJldHVybiBFTkdJTkUucnVuS2VybmVsKExvZ2ljYWxOb3QsIGlucHV0cyBhcyB7fSBhcyBOYW1lZFRlbnNvck1hcCk7XG59XG5cbmV4cG9ydCBjb25zdCBsb2dpY2FsTm90ID0gb3Aoe2xvZ2ljYWxOb3RffSk7XG4iXX0=","/**\n * @license\n * Copyright 2020 Google LLC. All Rights Reserved.\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n * =============================================================================\n */\nimport { ENGINE } from '../engine';\nimport { LogicalOr } from '../kernel_names';\nimport { convertToTensor } from '../tensor_util_env';\nimport { assertAndGetBroadcastShape } from './broadcast_util';\nimport { op } from './operation';\n/**\n * Returns the truth value of `a OR b` element-wise. Supports broadcasting.\n *\n * ```js\n * const a = tf.tensor1d([false, false, true, true], 'bool');\n * const b = tf.tensor1d([false, true, false, true], 'bool');\n *\n * a.logicalOr(b).print();\n * ```\n * @param a The first input tensor. Must be of dtype bool.\n * @param b The second input tensor. Must be of dtype bool.\n *\n * @doc {heading: 'Operations', subheading: 'Logical'}\n */\nfunction logicalOr_(a, b) {\n const $a = convertToTensor(a, 'a', 'logicalOr', 'bool');\n const $b = convertToTensor(b, 'b', 'logicalOr', 'bool');\n assertAndGetBroadcastShape($a.shape, $b.shape);\n const inputs = { a: $a, b: $b };\n return ENGINE.runKernel(LogicalOr, inputs);\n}\nexport const logicalOr = op({ logicalOr_ });\n//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibG9naWNhbF9vci5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uLy4uL3RmanMtY29yZS9zcmMvb3BzL2xvZ2ljYWxfb3IudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUE7Ozs7Ozs7Ozs7Ozs7OztHQWVHO0FBRUgsT0FBTyxFQUFDLE1BQU0sRUFBQyxNQUFNLFdBQVcsQ0FBQztBQUNqQyxPQUFPLEVBQUMsU0FBUyxFQUFrQixNQUFNLGlCQUFpQixDQUFDO0FBRzNELE9BQU8sRUFBQyxlQUFlLEVBQUMsTUFBTSxvQkFBb0IsQ0FBQztBQUVuRCxPQUFPLEVBQUMsMEJBQTBCLEVBQUMsTUFBTSxrQkFBa0IsQ0FBQztBQUM1RCxPQUFPLEVBQUMsRUFBRSxFQUFDLE1BQU0sYUFBYSxDQUFDO0FBRS9COzs7Ozs7Ozs7Ozs7O0dBYUc7QUFDSCxTQUFTLFVBQVUsQ0FDZixDQUFvQixFQUFFLENBQW9CO0lBQzVDLE1BQU0sRUFBRSxHQUFHLGVBQWUsQ0FBQyxDQUFDLEVBQUUsR0FBRyxFQUFFLFdBQVcsRUFBRSxNQUFNLENBQUMsQ0FBQztJQUN4RCxNQUFNLEVBQUUsR0FBRyxlQUFlLENBQUMsQ0FBQyxFQUFFLEdBQUcsRUFBRSxXQUFXLEVBQUUsTUFBTSxDQUFDLENBQUM7SUFDeEQsMEJBQTBCLENBQUMsRUFBRSxDQUFDLEtBQUssRUFBRSxFQUFFLENBQUMsS0FBSyxDQUFDLENBQUM7SUFFL0MsTUFBTSxNQUFNLEdBQW9CLEVBQUMsQ0FBQyxFQUFFLEVBQUUsRUFBRSxDQUFDLEVBQUUsRUFBRSxFQUFDLENBQUM7SUFDL0MsT0FBTyxNQUFNLENBQUMsU0FBUyxDQUFDLFNBQVMsRUFBRSxNQUE4QixDQUFDLENBQUM7QUFDckUsQ0FBQztBQUNELE1BQU0sQ0FBQyxNQUFNLFNBQVMsR0FBRyxFQUFFLENBQUMsRUFBQyxVQUFVLEVBQUMsQ0FBQyxDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiLyoqXG4gKiBAbGljZW5zZVxuICogQ29weXJpZ2h0IDIwMjAgR29vZ2xlIExMQy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC5cbiAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSBcIkxpY2Vuc2VcIik7XG4gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuXG4gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXRcbiAqXG4gKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjBcbiAqXG4gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlXG4gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiBcIkFTIElTXCIgQkFTSVMsXG4gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC5cbiAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmRcbiAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLlxuICogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbiAqL1xuXG5pbXBvcnQge0VOR0lORX0gZnJvbSAnLi4vZW5naW5lJztcbmltcG9ydCB7TG9naWNhbE9yLCBMb2dpY2FsT3JJbnB1dHN9IGZyb20gJy4uL2tlcm5lbF9uYW1lcyc7XG5pbXBvcnQge1RlbnNvcn0gZnJvbSAnLi4vdGVuc29yJztcbmltcG9ydCB7TmFtZWRUZW5zb3JNYXB9IGZyb20gJy4uL3RlbnNvcl90eXBlcyc7XG5pbXBvcnQge2NvbnZlcnRUb1RlbnNvcn0gZnJvbSAnLi4vdGVuc29yX3V0aWxfZW52JztcbmltcG9ydCB7VGVuc29yTGlrZX0gZnJvbSAnLi4vdHlwZXMnO1xuaW1wb3J0IHthc3NlcnRBbmRHZXRCcm9hZGNhc3RTaGFwZX0gZnJvbSAnLi9icm9hZGNhc3RfdXRpbCc7XG5pbXBvcnQge29wfSBmcm9tICcuL29wZXJhdGlvbic7XG5cbi8qKlxuICogUmV0dXJucyB0aGUgdHJ1dGggdmFsdWUgb2YgYGEgT1IgYmAgZWxlbWVudC13aXNlLiBTdXBwb3J0cyBicm9hZGNhc3RpbmcuXG4gKlxuICogYGBganNcbiAqIGNvbnN0IGEgPSB0Zi50ZW5zb3IxZChbZmFsc2UsIGZhbHNlLCB0cnVlLCB0cnVlXSwgJ2Jvb2wnKTtcbiAqIGNvbnN0IGIgPSB0Zi50ZW5zb3IxZChbZmFsc2UsIHRydWUsIGZhbHNlLCB0cnVlXSwgJ2Jvb2wnKTtcbiAqXG4gKiBhLmxvZ2ljYWxPcihiKS5wcmludCgpO1xuICogYGBgXG4gKiBAcGFyYW0gYSBUaGUgZmlyc3QgaW5wdXQgdGVuc29yLiBNdXN0IGJlIG9mIGR0eXBlIGJvb2wuXG4gKiBAcGFyYW0gYiBUaGUgc2Vjb25kIGlucHV0IHRlbnNvci4gTXVzdCBiZSBvZiBkdHlwZSBib29sLlxuICpcbiAqIEBkb2Mge2hlYWRpbmc6ICdPcGVyYXRpb25zJywgc3ViaGVhZGluZzogJ0xvZ2ljYWwnfVxuICovXG5mdW5jdGlvbiBsb2dpY2FsT3JfPFQgZXh0ZW5kcyBUZW5zb3I+KFxuICAgIGE6IFRlbnNvcnxUZW5zb3JMaWtlLCBiOiBUZW5zb3J8VGVuc29yTGlrZSk6IFQge1xuICBjb25zdCAkYSA9IGNvbnZlcnRUb1RlbnNvcihhLCAnYScsICdsb2dpY2FsT3InLCAnYm9vbCcpO1xuICBjb25zdCAkYiA9IGNvbnZlcnRUb1RlbnNvcihiLCAnYicsICdsb2dpY2FsT3InLCAnYm9vbCcpO1xuICBhc3NlcnRBbmRHZXRCcm9hZGNhc3RTaGFwZSgkYS5zaGFwZSwgJGIuc2hhcGUpO1xuXG4gIGNvbnN0IGlucHV0czogTG9naWNhbE9ySW5wdXRzID0ge2E6ICRhLCBiOiAkYn07XG4gIHJldHVybiBFTkdJTkUucnVuS2VybmVsKExvZ2ljYWxPciwgaW5wdXRzIGFzIHt9IGFzIE5hbWVkVGVuc29yTWFwKTtcbn1cbmV4cG9ydCBjb25zdCBsb2dpY2FsT3IgPSBvcCh7bG9naWNhbE9yX30pO1xuIl19","/**\n * @license\n * Copyright 2020 Google LLC. All Rights Reserved.\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n * =============================================================================\n */\nimport { convertToTensor } from '../tensor_util_env';\nimport { assertAndGetBroadcastShape } from './broadcast_util';\nimport { logicalAnd } from './logical_and';\nimport { logicalNot } from './logical_not';\nimport { logicalOr } from './logical_or';\nimport { op } from './operation';\n/**\n * Returns the truth value of `a XOR b` element-wise. Supports broadcasting.\n *\n * ```js\n * const a = tf.tensor1d([false, false, true, true], 'bool');\n * const b = tf.tensor1d([false, true, false, true], 'bool');\n *\n * a.logicalXor(b).print();\n * ```\n *\n * @param a The first input tensor. Must be of dtype bool.\n * @param b The second input tensor. Must be of dtype bool.\n *\n * @doc {heading: 'Operations', subheading: 'Logical'}\n */\nfunction logicalXor_(a, b) {\n const $a = convertToTensor(a, 'a', 'logicalXor', 'bool');\n const $b = convertToTensor(b, 'b', 'logicalXor', 'bool');\n assertAndGetBroadcastShape($a.shape, $b.shape);\n // x ^ y = (x | y) & ~(x & y)\n return logicalAnd(logicalOr(a, b), logicalNot(logicalAnd(a, b)));\n}\nexport const logicalXor = op({ logicalXor_ });\n//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibG9naWNhbF94b3IuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi8uLi90ZmpzLWNvcmUvc3JjL29wcy9sb2dpY2FsX3hvci50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQTs7Ozs7Ozs7Ozs7Ozs7O0dBZUc7QUFHSCxPQUFPLEVBQUMsZUFBZSxFQUFDLE1BQU0sb0JBQW9CLENBQUM7QUFHbkQsT0FBTyxFQUFDLDBCQUEwQixFQUFDLE1BQU0sa0JBQWtCLENBQUM7QUFDNUQsT0FBTyxFQUFDLFVBQVUsRUFBQyxNQUFNLGVBQWUsQ0FBQztBQUN6QyxPQUFPLEVBQUMsVUFBVSxFQUFDLE1BQU0sZUFBZSxDQUFDO0FBQ3pDLE9BQU8sRUFBQyxTQUFTLEVBQUMsTUFBTSxjQUFjLENBQUM7QUFDdkMsT0FBTyxFQUFDLEVBQUUsRUFBQyxNQUFNLGFBQWEsQ0FBQztBQUUvQjs7Ozs7Ozs7Ozs7Ozs7R0FjRztBQUNILFNBQVMsV0FBVyxDQUNoQixDQUFvQixFQUFFLENBQW9CO0lBQzVDLE1BQU0sRUFBRSxHQUFHLGVBQWUsQ0FBQyxDQUFDLEVBQUUsR0FBRyxFQUFFLFlBQVksRUFBRSxNQUFNLENBQUMsQ0FBQztJQUN6RCxNQUFNLEVBQUUsR0FBRyxlQUFlLENBQUMsQ0FBQyxFQUFFLEdBQUcsRUFBRSxZQUFZLEVBQUUsTUFBTSxDQUFDLENBQUM7SUFDekQsMEJBQTBCLENBQUMsRUFBRSxDQUFDLEtBQUssRUFBRSxFQUFFLENBQUMsS0FBSyxDQUFDLENBQUM7SUFFL0MsNkJBQTZCO0lBQzdCLE9BQU8sVUFBVSxDQUFDLFNBQVMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLEVBQUUsVUFBVSxDQUFDLFVBQVUsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDO0FBQ25FLENBQUM7QUFFRCxNQUFNLENBQUMsTUFBTSxVQUFVLEdBQUcsRUFBRSxDQUFDLEVBQUMsV0FBVyxFQUFDLENBQUMsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbIi8qKlxuICogQGxpY2Vuc2VcbiAqIENvcHlyaWdodCAyMDIwIEdvb2dsZSBMTEMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuXG4gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgXCJMaWNlbnNlXCIpO1xuICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLlxuICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0XG4gKlxuICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wXG4gKlxuICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZVxuICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gXCJBUyBJU1wiIEJBU0lTLFxuICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuXG4gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kXG4gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS5cbiAqID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4gKi9cblxuaW1wb3J0IHtUZW5zb3J9IGZyb20gJy4uL3RlbnNvcic7XG5pbXBvcnQge2NvbnZlcnRUb1RlbnNvcn0gZnJvbSAnLi4vdGVuc29yX3V0aWxfZW52JztcbmltcG9ydCB7VGVuc29yTGlrZX0gZnJvbSAnLi4vdHlwZXMnO1xuXG5pbXBvcnQge2Fzc2VydEFuZEdldEJyb2FkY2FzdFNoYXBlfSBmcm9tICcuL2Jyb2FkY2FzdF91dGlsJztcbmltcG9ydCB7bG9naWNhbEFuZH0gZnJvbSAnLi9sb2dpY2FsX2FuZCc7XG5pbXBvcnQge2xvZ2ljYWxOb3R9IGZyb20gJy4vbG9naWNhbF9ub3QnO1xuaW1wb3J0IHtsb2dpY2FsT3J9IGZyb20gJy4vbG9naWNhbF9vcic7XG5pbXBvcnQge29wfSBmcm9tICcuL29wZXJhdGlvbic7XG5cbi8qKlxuICogUmV0dXJucyB0aGUgdHJ1dGggdmFsdWUgb2YgYGEgWE9SIGJgIGVsZW1lbnQtd2lzZS4gU3VwcG9ydHMgYnJvYWRjYXN0aW5nLlxuICpcbiAqIGBgYGpzXG4gKiBjb25zdCBhID0gdGYudGVuc29yMWQoW2ZhbHNlLCBmYWxzZSwgdHJ1ZSwgdHJ1ZV0sICdib29sJyk7XG4gKiBjb25zdCBiID0gdGYudGVuc29yMWQoW2ZhbHNlLCB0cnVlLCBmYWxzZSwgdHJ1ZV0sICdib29sJyk7XG4gKlxuICogYS5sb2dpY2FsWG9yKGIpLnByaW50KCk7XG4gKiBgYGBcbiAqXG4gKiBAcGFyYW0gYSBUaGUgZmlyc3QgaW5wdXQgdGVuc29yLiBNdXN0IGJlIG9mIGR0eXBlIGJvb2wuXG4gKiBAcGFyYW0gYiBUaGUgc2Vjb25kIGlucHV0IHRlbnNvci4gTXVzdCBiZSBvZiBkdHlwZSBib29sLlxuICpcbiAqIEBkb2Mge2hlYWRpbmc6ICdPcGVyYXRpb25zJywgc3ViaGVhZGluZzogJ0xvZ2ljYWwnfVxuICovXG5mdW5jdGlvbiBsb2dpY2FsWG9yXzxUIGV4dGVuZHMgVGVuc29yPihcbiAgICBhOiBUZW5zb3J8VGVuc29yTGlrZSwgYjogVGVuc29yfFRlbnNvckxpa2UpOiBUIHtcbiAgY29uc3QgJGEgPSBjb252ZXJ0VG9UZW5zb3IoYSwgJ2EnLCAnbG9naWNhbFhvcicsICdib29sJyk7XG4gIGNvbnN0ICRiID0gY29udmVydFRvVGVuc29yKGIsICdiJywgJ2xvZ2ljYWxYb3InLCAnYm9vbCcpO1xuICBhc3NlcnRBbmRHZXRCcm9hZGNhc3RTaGFwZSgkYS5zaGFwZSwgJGIuc2hhcGUpO1xuXG4gIC8vIHggXiB5ID0gKHggfCB5KSAmIH4oeCAmIHkpXG4gIHJldHVybiBsb2dpY2FsQW5kKGxvZ2ljYWxPcihhLCBiKSwgbG9naWNhbE5vdChsb2dpY2FsQW5kKGEsIGIpKSk7XG59XG5cbmV4cG9ydCBjb25zdCBsb2dpY2FsWG9yID0gb3Aoe2xvZ2ljYWxYb3JffSk7XG4iXX0=","/**\n * @license\n * Copyright 2020 Google LLC. All Rights Reserved.\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n * =============================================================================\n */\nexport var Reduction;\n(function (Reduction) {\n Reduction[Reduction[\"NONE\"] = 0] = \"NONE\";\n Reduction[Reduction[\"MEAN\"] = 1] = \"MEAN\";\n Reduction[Reduction[\"SUM\"] = 2] = \"SUM\";\n Reduction[Reduction[\"SUM_BY_NONZERO_WEIGHTS\"] = 3] = \"SUM_BY_NONZERO_WEIGHTS\";\n})(Reduction || (Reduction = {}));\n//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibG9zc19vcHNfdXRpbHMuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi8uLi90ZmpzLWNvcmUvc3JjL29wcy9sb3NzX29wc191dGlscy50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQTs7Ozs7Ozs7Ozs7Ozs7O0dBZUc7QUFFSCxNQUFNLENBQU4sSUFBWSxTQUtYO0FBTEQsV0FBWSxTQUFTO0lBQ25CLHlDQUFJLENBQUE7SUFDSix5Q0FBSSxDQUFBO0lBQ0osdUNBQUcsQ0FBQTtJQUNILDZFQUFzQixDQUFBO0FBQ3hCLENBQUMsRUFMVyxTQUFTLEtBQVQsU0FBUyxRQUtwQiIsInNvdXJjZXNDb250ZW50IjpbIi8qKlxuICogQGxpY2Vuc2VcbiAqIENvcHlyaWdodCAyMDIwIEdvb2dsZSBMTEMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuXG4gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgXCJMaWNlbnNlXCIpO1xuICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLlxuICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0XG4gKlxuICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wXG4gKlxuICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZVxuICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gXCJBUyBJU1wiIEJBU0lTLFxuICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuXG4gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kXG4gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS5cbiAqID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4gKi9cblxuZXhwb3J0IGVudW0gUmVkdWN0aW9uIHtcbiAgTk9ORSxcbiAgTUVBTixcbiAgU1VNLFxuICBTVU1fQllfTk9OWkVST19XRUlHSFRTXG59XG4iXX0=","/**\n * @license\n * Copyright 2020 Google LLC. All Rights Reserved.\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n * =============================================================================\n */\nimport { ENGINE } from '../engine';\nimport { BatchMatMul } from '../kernel_names';\nimport { makeTypesMatch } from '../tensor_util';\nimport { convertToTensor } from '../tensor_util_env';\nimport { op } from './operation';\n/**\n * Computes the dot product of two matrices, A * B. These must be matrices.\n *\n * ```js\n * const a = tf.tensor2d([1, 2], [1, 2]);\n * const b = tf.tensor2d([1, 2, 3, 4], [2, 2]);\n *\n * a.matMul(b).print(); // or tf.matMul(a, b)\n * ```\n * @param a First matrix in dot product operation.\n * @param b Second matrix in dot product operation.\n * @param transposeA If true, `a` is transposed before multiplication.\n * @param transposeB If true, `b` is transposed before multiplication.\n *\n * @doc {heading: 'Operations', subheading: 'Matrices'}\n */\nfunction matMul_(a, b, transposeA = false, transposeB = false) {\n let $a = convertToTensor(a, 'a', 'matMul');\n let $b = convertToTensor(b, 'b', 'matMul');\n [$a, $b] = makeTypesMatch($a, $b);\n const inputs = { a: $a, b: $b };\n const attrs = { transposeA, transposeB };\n return ENGINE.runKernel(BatchMatMul, inputs, attrs);\n}\nexport const matMul = op({ matMul_ });\n//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibWF0X211bC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uLy4uL3RmanMtY29yZS9zcmMvb3BzL21hdF9tdWwudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUE7Ozs7Ozs7Ozs7Ozs7OztHQWVHO0FBQ0gsT0FBTyxFQUFDLE1BQU0sRUFBQyxNQUFNLFdBQVcsQ0FBQztBQUNqQyxPQUFPLEVBQUMsV0FBVyxFQUFzQyxNQUFNLGlCQUFpQixDQUFDO0FBSWpGLE9BQU8sRUFBQyxjQUFjLEVBQUMsTUFBTSxnQkFBZ0IsQ0FBQztBQUM5QyxPQUFPLEVBQUMsZUFBZSxFQUFDLE1BQU0sb0JBQW9CLENBQUM7QUFHbkQsT0FBTyxFQUFDLEVBQUUsRUFBQyxNQUFNLGFBQWEsQ0FBQztBQUUvQjs7Ozs7Ozs7Ozs7Ozs7O0dBZUc7QUFDSCxTQUFTLE9BQU8sQ0FDWixDQUFvQixFQUFFLENBQW9CLEVBQUUsVUFBVSxHQUFHLEtBQUssRUFDOUQsVUFBVSxHQUFHLEtBQUs7SUFDcEIsSUFBSSxFQUFFLEdBQUcsZUFBZSxDQUFDLENBQUMsRUFBRSxHQUFHLEVBQUUsUUFBUSxDQUFDLENBQUM7SUFDM0MsSUFBSSxFQUFFLEdBQUcsZUFBZSxDQUFDLENBQUMsRUFBRSxHQUFHLEVBQUUsUUFBUSxDQUFDLENBQUM7SUFDM0MsQ0FBQyxFQUFFLEVBQUUsRUFBRSxDQUFDLEdBQUcsY0FBYyxDQUFDLEVBQUUsRUFBRSxFQUFFLENBQUMsQ0FBQztJQUVsQyxNQUFNLE1BQU0sR0FBc0IsRUFBQyxDQUFDLEVBQUUsRUFBRSxFQUFFLENBQUMsRUFBRSxFQUFFLEVBQUMsQ0FBQztJQUNqRCxNQUFNLEtBQUssR0FBcUIsRUFBQyxVQUFVLEVBQUUsVUFBVSxFQUFDLENBQUM7SUFFekQsT0FBTyxNQUFNLENBQUMsU0FBUyxDQUNuQixXQUFXLEVBQUUsTUFBOEIsRUFBRSxLQUEyQixDQUFDLENBQUM7QUFDaEYsQ0FBQztBQUVELE1BQU0sQ0FBQyxNQUFNLE1BQU0sR0FBRyxFQUFFLENBQUMsRUFBQyxPQUFPLEVBQUMsQ0FBQyxDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiLyoqXG4gKiBAbGljZW5zZVxuICogQ29weXJpZ2h0IDIwMjAgR29vZ2xlIExMQy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC5cbiAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSBcIkxpY2Vuc2VcIik7XG4gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuXG4gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXRcbiAqXG4gKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjBcbiAqXG4gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlXG4gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiBcIkFTIElTXCIgQkFTSVMsXG4gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC5cbiAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmRcbiAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLlxuICogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbiAqL1xuaW1wb3J0IHtFTkdJTkV9IGZyb20gJy4uL2VuZ2luZSc7XG5pbXBvcnQge0JhdGNoTWF0TXVsLCBCYXRjaE1hdE11bEF0dHJzLCBCYXRjaE1hdE11bElucHV0c30gZnJvbSAnLi4va2VybmVsX25hbWVzJztcbmltcG9ydCB7TmFtZWRBdHRyTWFwfSBmcm9tICcuLi9rZXJuZWxfcmVnaXN0cnknO1xuaW1wb3J0IHtUZW5zb3J9IGZyb20gJy4uL3RlbnNvcic7XG5pbXBvcnQge05hbWVkVGVuc29yTWFwfSBmcm9tICcuLi90ZW5zb3JfdHlwZXMnO1xuaW1wb3J0IHttYWtlVHlwZXNNYXRjaH0gZnJvbSAnLi4vdGVuc29yX3V0aWwnO1xuaW1wb3J0IHtjb252ZXJ0VG9UZW5zb3J9IGZyb20gJy4uL3RlbnNvcl91dGlsX2Vudic7XG5pbXBvcnQge1RlbnNvckxpa2V9IGZyb20gJy4uL3R5cGVzJztcblxuaW1wb3J0IHtvcH0gZnJvbSAnLi9vcGVyYXRpb24nO1xuXG4vKipcbiAqIENvbXB1dGVzIHRoZSBkb3QgcHJvZHVjdCBvZiB0d28gbWF0cmljZXMsIEEgKiBCLiBUaGVzZSBtdXN0IGJlIG1hdHJpY2VzLlxuICpcbiAqIGBgYGpzXG4gKiBjb25zdCBhID0gdGYudGVuc29yMmQoWzEsIDJdLCBbMSwgMl0pO1xuICogY29uc3QgYiA9IHRmLnRlbnNvcjJkKFsxLCAyLCAzLCA0XSwgWzIsIDJdKTtcbiAqXG4gKiBhLm1hdE11bChiKS5wcmludCgpOyAgLy8gb3IgdGYubWF0TXVsKGEsIGIpXG4gKiBgYGBcbiAqIEBwYXJhbSBhIEZpcnN0IG1hdHJpeCBpbiBkb3QgcHJvZHVjdCBvcGVyYXRpb24uXG4gKiBAcGFyYW0gYiBTZWNvbmQgbWF0cml4IGluIGRvdCBwcm9kdWN0IG9wZXJhdGlvbi5cbiAqIEBwYXJhbSB0cmFuc3Bvc2VBIElmIHRydWUsIGBhYCBpcyB0cmFuc3Bvc2VkIGJlZm9yZSBtdWx0aXBsaWNhdGlvbi5cbiAqIEBwYXJhbSB0cmFuc3Bvc2VCIElmIHRydWUsIGBiYCBpcyB0cmFuc3Bvc2VkIGJlZm9yZSBtdWx0aXBsaWNhdGlvbi5cbiAqXG4gKiBAZG9jIHtoZWFkaW5nOiAnT3BlcmF0aW9ucycsIHN1YmhlYWRpbmc6ICdNYXRyaWNlcyd9XG4gKi9cbmZ1bmN0aW9uIG1hdE11bF88VCBleHRlbmRzIFRlbnNvcj4oXG4gICAgYTogVGVuc29yfFRlbnNvckxpa2UsIGI6IFRlbnNvcnxUZW5zb3JMaWtlLCB0cmFuc3Bvc2VBID0gZmFsc2UsXG4gICAgdHJhbnNwb3NlQiA9IGZhbHNlKTogVCB7XG4gIGxldCAkYSA9IGNvbnZlcnRUb1RlbnNvcihhLCAnYScsICdtYXRNdWwnKTtcbiAgbGV0ICRiID0gY29udmVydFRvVGVuc29yKGIsICdiJywgJ21hdE11bCcpO1xuICBbJGEsICRiXSA9IG1ha2VUeXBlc01hdGNoKCRhLCAkYik7XG5cbiAgY29uc3QgaW5wdXRzOiBCYXRjaE1hdE11bElucHV0cyA9IHthOiAkYSwgYjogJGJ9O1xuICBjb25zdCBhdHRyczogQmF0Y2hNYXRNdWxBdHRycyA9IHt0cmFuc3Bvc2VBLCB0cmFuc3Bvc2VCfTtcblxuICByZXR1cm4gRU5HSU5FLnJ1bktlcm5lbChcbiAgICAgIEJhdGNoTWF0TXVsLCBpbnB1dHMgYXMge30gYXMgTmFtZWRUZW5zb3JNYXAsIGF0dHJzIGFzIHt9IGFzIE5hbWVkQXR0ck1hcCk7XG59XG5cbmV4cG9ydCBjb25zdCBtYXRNdWwgPSBvcCh7bWF0TXVsX30pO1xuIl19","/**\n * @license\n * Copyright 2020 Google LLC. All Rights Reserved.\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n * =============================================================================\n */\nimport { ENGINE } from '../engine';\nimport { Max } from '../kernel_names';\nimport { convertToTensor } from '../tensor_util_env';\nimport { op } from './operation';\n/**\n * Computes the maximum of elements across dimensions of a `tf.Tensor`.\n *\n * Reduces the input along the dimensions given in `axes`. Unless `keepDims`\n * is true, the rank of the `tf.Tensor` is reduced by 1 for each entry in\n * `axes`. If `keepDims` is true, the reduced dimensions are retained with\n * length 1. If `axes` has no entries, all dimensions are reduced, and a\n * `tf.Tensor` with a single element is returned.\n *\n * ```js\n * const x = tf.tensor1d([1, 2, 3]);\n *\n * x.max().print(); // or tf.max(x)\n * ```\n *\n * ```js\n * const x = tf.tensor2d([1, 2, 3, 4], [2, 2]);\n *\n * const axis = 1;\n * x.max(axis).print(); // or tf.max(x, axis)\n * ```\n *\n * @param x The input tensor.\n * @param axis The dimension(s) to reduce. By default it reduces\n * all dimensions.\n * @param keepDims If true, retains reduced dimensions with size 1.\n *\n * @doc {heading: 'Operations', subheading: 'Reduction'}\n */\nfunction max_(x, axis = null, keepDims = false) {\n const $x = convertToTensor(x, 'x', 'max');\n const inputs = { x: $x };\n const attrs = { reductionIndices: axis, keepDims };\n return ENGINE.runKernel(Max, inputs, attrs);\n}\nexport const max = op({ max_ });\n//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibWF4LmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vLi4vdGZqcy1jb3JlL3NyYy9vcHMvbWF4LnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBOzs7Ozs7Ozs7Ozs7Ozs7R0FlRztBQUVILE9BQU8sRUFBQyxNQUFNLEVBQUMsTUFBTSxXQUFXLENBQUM7QUFDakMsT0FBTyxFQUFDLEdBQUcsRUFBc0IsTUFBTSxpQkFBaUIsQ0FBQztBQUl6RCxPQUFPLEVBQUMsZUFBZSxFQUFDLE1BQU0sb0JBQW9CLENBQUM7QUFHbkQsT0FBTyxFQUFDLEVBQUUsRUFBQyxNQUFNLGFBQWEsQ0FBQztBQUUvQjs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7OztHQTRCRztBQUNILFNBQVMsSUFBSSxDQUNULENBQW9CLEVBQUUsT0FBd0IsSUFBSSxFQUFFLFFBQVEsR0FBRyxLQUFLO0lBQ3RFLE1BQU0sRUFBRSxHQUFHLGVBQWUsQ0FBQyxDQUFDLEVBQUUsR0FBRyxFQUFFLEtBQUssQ0FBQyxDQUFDO0lBRTFDLE1BQU0sTUFBTSxHQUFjLEVBQUMsQ0FBQyxFQUFFLEVBQUUsRUFBQyxDQUFDO0lBQ2xDLE1BQU0sS0FBSyxHQUFhLEVBQUMsZ0JBQWdCLEVBQUUsSUFBSSxFQUFFLFFBQVEsRUFBQyxDQUFDO0lBRTNELE9BQU8sTUFBTSxDQUFDLFNBQVMsQ0FDbkIsR0FBRyxFQUFFLE1BQThCLEVBQUUsS0FBMkIsQ0FBQyxDQUFDO0FBQ3hFLENBQUM7QUFFRCxNQUFNLENBQUMsTUFBTSxHQUFHLEdBQUcsRUFBRSxDQUFDLEVBQUMsSUFBSSxFQUFDLENBQUMsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbIi8qKlxuICogQGxpY2Vuc2VcbiAqIENvcHlyaWdodCAyMDIwIEdvb2dsZSBMTEMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuXG4gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgXCJMaWNlbnNlXCIpO1xuICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLlxuICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0XG4gKlxuICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wXG4gKlxuICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZVxuICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gXCJBUyBJU1wiIEJBU0lTLFxuICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuXG4gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kXG4gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS5cbiAqID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4gKi9cblxuaW1wb3J0IHtFTkdJTkV9IGZyb20gJy4uL2VuZ2luZSc7XG5pbXBvcnQge01heCwgTWF4QXR0cnMsIE1heElucHV0c30gZnJvbSAnLi4va2VybmVsX25hbWVzJztcbmltcG9ydCB7TmFtZWRBdHRyTWFwfSBmcm9tICcuLi9rZXJuZWxfcmVnaXN0cnknO1xuaW1wb3J0IHtUZW5zb3J9IGZyb20gJy4uL3RlbnNvcic7XG5pbXBvcnQge05hbWVkVGVuc29yTWFwfSBmcm9tICcuLi90ZW5zb3JfdHlwZXMnO1xuaW1wb3J0IHtjb252ZXJ0VG9UZW5zb3J9IGZyb20gJy4uL3RlbnNvcl91dGlsX2Vudic7XG5pbXBvcnQge1RlbnNvckxpa2V9IGZyb20gJy4uL3R5cGVzJztcblxuaW1wb3J0IHtvcH0gZnJvbSAnLi9vcGVyYXRpb24nO1xuXG4vKipcbiAqIENvbXB1dGVzIHRoZSBtYXhpbXVtIG9mIGVsZW1lbnRzIGFjcm9zcyBkaW1lbnNpb25zIG9mIGEgYHRmLlRlbnNvcmAuXG4gKlxuICogUmVkdWNlcyB0aGUgaW5wdXQgYWxvbmcgdGhlIGRpbWVuc2lvbnMgZ2l2ZW4gaW4gYGF4ZXNgLiBVbmxlc3MgYGtlZXBEaW1zYFxuICogaXMgdHJ1ZSwgdGhlIHJhbmsgb2YgdGhlIGB0Zi5UZW5zb3JgIGlzIHJlZHVjZWQgYnkgMSBmb3IgZWFjaCBlbnRyeSBpblxuICogYGF4ZXNgLiBJZiBga2VlcERpbXNgIGlzIHRydWUsIHRoZSByZWR1Y2VkIGRpbWVuc2lvbnMgYXJlIHJldGFpbmVkIHdpdGhcbiAqIGxlbmd0aCAxLiBJZiBgYXhlc2AgaGFzIG5vIGVudHJpZXMsIGFsbCBkaW1lbnNpb25zIGFyZSByZWR1Y2VkLCBhbmQgYVxuICogYHRmLlRlbnNvcmAgd2l0aCBhIHNpbmdsZSBlbGVtZW50IGlzIHJldHVybmVkLlxuICpcbiAqIGBgYGpzXG4gKiBjb25zdCB4ID0gdGYudGVuc29yMWQoWzEsIDIsIDNdKTtcbiAqXG4gKiB4Lm1heCgpLnByaW50KCk7ICAvLyBvciB0Zi5tYXgoeClcbiAqIGBgYFxuICpcbiAqIGBgYGpzXG4gKiBjb25zdCB4ID0gdGYudGVuc29yMmQoWzEsIDIsIDMsIDRdLCBbMiwgMl0pO1xuICpcbiAqIGNvbnN0IGF4aXMgPSAxO1xuICogeC5tYXgoYXhpcykucHJpbnQoKTsgIC8vIG9yIHRmLm1heCh4LCBheGlzKVxuICogYGBgXG4gKlxuICogQHBhcmFtIHggVGhlIGlucHV0IHRlbnNvci5cbiAqIEBwYXJhbSBheGlzIFRoZSBkaW1lbnNpb24ocykgdG8gcmVkdWNlLiBCeSBkZWZhdWx0IGl0IHJlZHVjZXNcbiAqICAgICBhbGwgZGltZW5zaW9ucy5cbiAqIEBwYXJhbSBrZWVwRGltcyBJZiB0cnVlLCByZXRhaW5zIHJlZHVjZWQgZGltZW5zaW9ucyB3aXRoIHNpemUgMS5cbiAqXG4gKiBAZG9jIHtoZWFkaW5nOiAnT3BlcmF0aW9ucycsIHN1YmhlYWRpbmc6ICdSZWR1Y3Rpb24nfVxuICovXG5mdW5jdGlvbiBtYXhfPFQgZXh0ZW5kcyBUZW5zb3I+KFxuICAgIHg6IFRlbnNvcnxUZW5zb3JMaWtlLCBheGlzOiBudW1iZXJ8bnVtYmVyW10gPSBudWxsLCBrZWVwRGltcyA9IGZhbHNlKTogVCB7XG4gIGNvbnN0ICR4ID0gY29udmVydFRvVGVuc29yKHgsICd4JywgJ21heCcpO1xuXG4gIGNvbnN0IGlucHV0czogTWF4SW5wdXRzID0ge3g6ICR4fTtcbiAgY29uc3QgYXR0cnM6IE1heEF0dHJzID0ge3JlZHVjdGlvbkluZGljZXM6IGF4aXMsIGtlZXBEaW1zfTtcblxuICByZXR1cm4gRU5HSU5FLnJ1bktlcm5lbChcbiAgICAgIE1heCwgaW5wdXRzIGFzIHt9IGFzIE5hbWVkVGVuc29yTWFwLCBhdHRycyBhcyB7fSBhcyBOYW1lZEF0dHJNYXApO1xufVxuXG5leHBvcnQgY29uc3QgbWF4ID0gb3Aoe21heF99KTtcbiJdfQ==","/**\n * @license\n * Copyright 2020 Google LLC. All Rights Reserved.\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n * =============================================================================\n */\nimport { ENGINE } from '../engine';\nimport { MaxPool } from '../kernel_names';\nimport { convertToTensor } from '../tensor_util_env';\nimport * as util from '../util';\nimport * as conv_util from './conv_util';\nimport { op } from './operation';\nimport { reshape } from './reshape';\n/**\n * Computes the 2D max pooling of an image.\n *\n * @param x The input tensor, of rank 4 or rank 3 of shape\n * `[batch, height, width, inChannels]`. If rank 3, batch of 1 is assumed.\n * @param filterSize The filter size: `[filterHeight, filterWidth]`. If\n * `filterSize` is a single number, then `filterHeight == filterWidth`.\n * @param strides The strides of the pooling: `[strideHeight, strideWidth]`. If\n * `strides` is a single number, then `strideHeight == strideWidth`.\n * @param dilations The dilation rates: `[dilationHeight, dilationWidth]`\n * in which we sample input values across the height and width dimensions\n * in dilated pooling. Defaults to `[1, 1]`. If `dilations` is a single\n * number, then `dilationHeight == dilationWidth`. If it is greater than\n * 1, then all values of `strides` must be 1.\n * @param pad The type of padding algorithm.\n * - `same` and stride 1: output will be of same size as input,\n * regardless of filter size.\n * - `valid`: output will be smaller than input if filter is larger\n * than 1x1.\n * - For more info, see this guide:\n * [https://www.tensorflow.org/api_docs/python/tf/nn/convolution](\n * https://www.tensorflow.org/api_docs/python/tf/nn/convolution)\n * @param dimRoundingMode A string from: 'ceil', 'round', 'floor'. If none is\n * provided, it will default to truncate.\n */\nfunction maxPool_(x, filterSize, strides, pad, dimRoundingMode) {\n const $x = convertToTensor(x, 'x', 'maxPool');\n const dilations = 1;\n let x4D = $x;\n let reshapedTo4D = false;\n if ($x.rank === 3) {\n reshapedTo4D = true;\n x4D = reshape($x, [1, $x.shape[0], $x.shape[1], $x.shape[2]]);\n }\n util.assert(x4D.rank === 4, () => `Error in maxPool: input must be rank 4 but got rank ${x4D.rank}.`);\n util.assert(conv_util.eitherStridesOrDilationsAreOne(strides, dilations), () => 'Error in maxPool: Either strides or dilations must be 1. ' +\n `Got strides ${strides} and dilations '${dilations}'`);\n conv_util.checkPadOnDimRoundingMode('maxPool', pad, dimRoundingMode);\n const inputs = { x: x4D };\n const attrs = { filterSize, strides, pad, dimRoundingMode };\n // tslint:disable-next-line: no-unnecessary-type-assertion\n const res = ENGINE.runKernel(MaxPool, inputs, attrs);\n if (reshapedTo4D) {\n return reshape(res, [res.shape[1], res.shape[2], res.shape[3]]);\n }\n return res;\n}\nexport const maxPool = op({ maxPool_ });\n//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibWF4X3Bvb2wuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi8uLi90ZmpzLWNvcmUvc3JjL29wcy9tYXhfcG9vbC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQTs7Ozs7Ozs7Ozs7Ozs7O0dBZUc7QUFFSCxPQUFPLEVBQUMsTUFBTSxFQUFDLE1BQU0sV0FBVyxDQUFDO0FBQ2pDLE9BQU8sRUFBQyxPQUFPLEVBQThCLE1BQU0saUJBQWlCLENBQUM7QUFJckUsT0FBTyxFQUFDLGVBQWUsRUFBQyxNQUFNLG9CQUFvQixDQUFDO0FBRW5ELE9BQU8sS0FBSyxJQUFJLE1BQU0sU0FBUyxDQUFDO0FBRWhDLE9BQU8sS0FBSyxTQUFTLE1BQU0sYUFBYSxDQUFDO0FBQ3pDLE9BQU8sRUFBQyxFQUFFLEVBQUMsTUFBTSxhQUFhLENBQUM7QUFDL0IsT0FBTyxFQUFDLE9BQU8sRUFBQyxNQUFNLFdBQVcsQ0FBQztBQUVsQzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7O0dBd0JHO0FBQ0gsU0FBUyxRQUFRLENBQ2IsQ0FBZSxFQUFFLFVBQW1DLEVBQ3BELE9BQWdDLEVBQ2hDLEdBQW9ELEVBQ3BELGVBQXdDO0lBQzFDLE1BQU0sRUFBRSxHQUFHLGVBQWUsQ0FBQyxDQUFDLEVBQUUsR0FBRyxFQUFFLFNBQVMsQ0FBQyxDQUFDO0lBQzlDLE1BQU0sU0FBUyxHQUFHLENBQUMsQ0FBQztJQUVwQixJQUFJLEdBQUcsR0FBRyxFQUFjLENBQUM7SUFDekIsSUFBSSxZQUFZLEdBQUcsS0FBSyxDQUFDO0lBQ3pCLElBQUksRUFBRSxDQUFDLElBQUksS0FBSyxDQUFDLEVBQUU7UUFDakIsWUFBWSxHQUFHLElBQUksQ0FBQztRQUNwQixHQUFHLEdBQUcsT0FBTyxDQUFDLEVBQUUsRUFBRSxDQUFDLENBQUMsRUFBRSxFQUFFLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQyxFQUFFLEVBQUUsQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDLEVBQUUsRUFBRSxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUM7S0FDL0Q7SUFFRCxJQUFJLENBQUMsTUFBTSxDQUNQLEdBQUcsQ0FBQyxJQUFJLEtBQUssQ0FBQyxFQUNkLEdBQUcsRUFBRSxDQUFDLHVEQUF1RCxHQUFHLENBQUMsSUFBSSxHQUFHLENBQUMsQ0FBQztJQUM5RSxJQUFJLENBQUMsTUFBTSxDQUNQLFNBQVMsQ0FBQyw4QkFBOEIsQ0FBQyxPQUFPLEVBQUUsU0FBUyxDQUFDLEVBQzVELEdBQUcsRUFBRSxDQUFDLDJEQUEyRDtRQUM3RCxlQUFlLE9BQU8sbUJBQW1CLFNBQVMsR0FBRyxDQUFDLENBQUM7SUFDL0QsU0FBUyxDQUFDLHlCQUF5QixDQUFDLFNBQVMsRUFBRSxHQUFHLEVBQUUsZUFBZSxDQUFDLENBQUM7SUFDckUsTUFBTSxNQUFNLEdBQWtCLEVBQUMsQ0FBQyxFQUFFLEdBQUcsRUFBQyxDQUFDO0lBQ3ZDLE1BQU0sS0FBSyxHQUFpQixFQUFDLFVBQVUsRUFBRSxPQUFPLEVBQUUsR0FBRyxFQUFFLGVBQWUsRUFBQyxDQUFDO0lBRXhFLDBEQUEwRDtJQUMxRCxNQUFNLEdBQUcsR0FBRyxNQUFNLENBQUMsU0FBUyxDQUNaLE9BQU8sRUFBRSxNQUE4QixFQUN2QyxLQUEyQixDQUFNLENBQUM7SUFFbEQsSUFBSSxZQUFZLEVBQUU7UUFDaEIsT0FBTyxPQUFPLENBQUMsR0FBRyxFQUFFLENBQUMsR0FBRyxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUMsRUFBRSxHQUFHLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQyxFQUFFLEdBQUcsQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBTSxDQUFDO0tBQ3RFO0lBQ0QsT0FBTyxHQUFHLENBQUM7QUFDYixDQUFDO0FBRUQsTUFBTSxDQUFDLE1BQU0sT0FBTyxHQUFHLEVBQUUsQ0FBQyxFQUFDLFFBQVEsRUFBQyxDQUFDLENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyIvKipcbiAqIEBsaWNlbnNlXG4gKiBDb3B5cmlnaHQgMjAyMCBHb29nbGUgTExDLiBBbGwgUmlnaHRzIFJlc2VydmVkLlxuICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlIFwiTGljZW5zZVwiKTtcbiAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS5cbiAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdFxuICpcbiAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMFxuICpcbiAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmVcbiAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuIFwiQVMgSVNcIiBCQVNJUyxcbiAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLlxuICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZFxuICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuXG4gKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuICovXG5cbmltcG9ydCB7RU5HSU5FfSBmcm9tICcuLi9lbmdpbmUnO1xuaW1wb3J0IHtNYXhQb29sLCBNYXhQb29sQXR0cnMsIE1heFBvb2xJbnB1dHN9IGZyb20gJy4uL2tlcm5lbF9uYW1lcyc7XG5pbXBvcnQge05hbWVkQXR0ck1hcH0gZnJvbSAnLi4va2VybmVsX3JlZ2lzdHJ5JztcbmltcG9ydCB7VGVuc29yM0QsIFRlbnNvcjREfSBmcm9tICcuLi90ZW5zb3InO1xuaW1wb3J0IHtOYW1lZFRlbnNvck1hcH0gZnJvbSAnLi4vdGVuc29yX3R5cGVzJztcbmltcG9ydCB7Y29udmVydFRvVGVuc29yfSBmcm9tICcuLi90ZW5zb3JfdXRpbF9lbnYnO1xuaW1wb3J0IHtUZW5zb3JMaWtlfSBmcm9tICcuLi90eXBlcyc7XG5pbXBvcnQgKiBhcyB1dGlsIGZyb20gJy4uL3V0aWwnO1xuXG5pbXBvcnQgKiBhcyBjb252X3V0aWwgZnJvbSAnLi9jb252X3V0aWwnO1xuaW1wb3J0IHtvcH0gZnJvbSAnLi9vcGVyYXRpb24nO1xuaW1wb3J0IHtyZXNoYXBlfSBmcm9tICcuL3Jlc2hhcGUnO1xuXG4vKipcbiAqIENvbXB1dGVzIHRoZSAyRCBtYXggcG9vbGluZyBvZiBhbiBpbWFnZS5cbiAqXG4gKiBAcGFyYW0geCBUaGUgaW5wdXQgdGVuc29yLCBvZiByYW5rIDQgb3IgcmFuayAzIG9mIHNoYXBlXG4gKiAgICAgYFtiYXRjaCwgaGVpZ2h0LCB3aWR0aCwgaW5DaGFubmVsc11gLiBJZiByYW5rIDMsIGJhdGNoIG9mIDEgaXMgYXNzdW1lZC5cbiAqIEBwYXJhbSBmaWx0ZXJTaXplIFRoZSBmaWx0ZXIgc2l6ZTogYFtmaWx0ZXJIZWlnaHQsIGZpbHRlcldpZHRoXWAuIElmXG4gKiAgICAgYGZpbHRlclNpemVgIGlzIGEgc2luZ2xlIG51bWJlciwgdGhlbiBgZmlsdGVySGVpZ2h0ID09IGZpbHRlcldpZHRoYC5cbiAqIEBwYXJhbSBzdHJpZGVzIFRoZSBzdHJpZGVzIG9mIHRoZSBwb29saW5nOiBgW3N0cmlkZUhlaWdodCwgc3RyaWRlV2lkdGhdYC4gSWZcbiAqICAgICBgc3RyaWRlc2AgaXMgYSBzaW5nbGUgbnVtYmVyLCB0aGVuIGBzdHJpZGVIZWlnaHQgPT0gc3RyaWRlV2lkdGhgLlxuICogQHBhcmFtIGRpbGF0aW9ucyBUaGUgZGlsYXRpb24gcmF0ZXM6IGBbZGlsYXRpb25IZWlnaHQsIGRpbGF0aW9uV2lkdGhdYFxuICogICAgIGluIHdoaWNoIHdlIHNhbXBsZSBpbnB1dCB2YWx1ZXMgYWNyb3NzIHRoZSBoZWlnaHQgYW5kIHdpZHRoIGRpbWVuc2lvbnNcbiAqICAgICBpbiBkaWxhdGVkIHBvb2xpbmcuIERlZmF1bHRzIHRvIGBbMSwgMV1gLiBJZiBgZGlsYXRpb25zYCBpcyBhIHNpbmdsZVxuICogICAgIG51bWJlciwgdGhlbiBgZGlsYXRpb25IZWlnaHQgPT0gZGlsYXRpb25XaWR0aGAuIElmIGl0IGlzIGdyZWF0ZXIgdGhhblxuICogICAgIDEsIHRoZW4gYWxsIHZhbHVlcyBvZiBgc3RyaWRlc2AgbXVzdCBiZSAxLlxuICogQHBhcmFtIHBhZCBUaGUgdHlwZSBvZiBwYWRkaW5nIGFsZ29yaXRobS5cbiAqICAgIC0gYHNhbWVgIGFuZCBzdHJpZGUgMTogb3V0cHV0IHdpbGwgYmUgb2Ygc2FtZSBzaXplIGFzIGlucHV0LFxuICogICAgICAgcmVnYXJkbGVzcyBvZiBmaWx0ZXIgc2l6ZS5cbiAqICAgIC0gYHZhbGlkYDogb3V0cHV0IHdpbGwgYmUgc21hbGxlciB0aGFuIGlucHV0IGlmIGZpbHRlciBpcyBsYXJnZXJcbiAqICAgICAgIHRoYW4gMXgxLlxuICogICAgLSBGb3IgbW9yZSBpbmZvLCBzZWUgdGhpcyBndWlkZTpcbiAqICAgICBbaHR0cHM6Ly93d3cudGVuc29yZmxvdy5vcmcvYXBpX2RvY3MvcHl0aG9uL3RmL25uL2NvbnZvbHV0aW9uXShcbiAqICAgICAgICAgIGh0dHBzOi8vd3d3LnRlbnNvcmZsb3cub3JnL2FwaV9kb2NzL3B5dGhvbi90Zi9ubi9jb252b2x1dGlvbilcbiAqIEBwYXJhbSBkaW1Sb3VuZGluZ01vZGUgQSBzdHJpbmcgZnJvbTogJ2NlaWwnLCAncm91bmQnLCAnZmxvb3InLiBJZiBub25lIGlzXG4gKiAgICAgcHJvdmlkZWQsIGl0IHdpbGwgZGVmYXVsdCB0byB0cnVuY2F0ZS5cbiAqL1xuZnVuY3Rpb24gbWF4UG9vbF88VCBleHRlbmRzIFRlbnNvcjNEfFRlbnNvcjREPihcbiAgICB4OiBUfFRlbnNvckxpa2UsIGZpbHRlclNpemU6IFtudW1iZXIsIG51bWJlcl18bnVtYmVyLFxuICAgIHN0cmlkZXM6IFtudW1iZXIsIG51bWJlcl18bnVtYmVyLFxuICAgIHBhZDogJ3ZhbGlkJ3wnc2FtZSd8bnVtYmVyfGNvbnZfdXRpbC5FeHBsaWNpdFBhZGRpbmcsXG4gICAgZGltUm91bmRpbmdNb2RlPzogJ2Zsb29yJ3wncm91bmQnfCdjZWlsJyk6IFQge1xuICBjb25zdCAkeCA9IGNvbnZlcnRUb1RlbnNvcih4LCAneCcsICdtYXhQb29sJyk7XG4gIGNvbnN0IGRpbGF0aW9ucyA9IDE7XG5cbiAgbGV0IHg0RCA9ICR4IGFzIFRlbnNvcjREO1xuICBsZXQgcmVzaGFwZWRUbzREID0gZmFsc2U7XG4gIGlmICgkeC5yYW5rID09PSAzKSB7XG4gICAgcmVzaGFwZWRUbzREID0gdHJ1ZTtcbiAgICB4NEQgPSByZXNoYXBlKCR4LCBbMSwgJHguc2hhcGVbMF0sICR4LnNoYXBlWzFdLCAkeC5zaGFwZVsyXV0pO1xuICB9XG5cbiAgdXRpbC5hc3NlcnQoXG4gICAgICB4NEQucmFuayA9PT0gNCxcbiAgICAgICgpID0+IGBFcnJvciBpbiBtYXhQb29sOiBpbnB1dCBtdXN0IGJlIHJhbmsgNCBidXQgZ290IHJhbmsgJHt4NEQucmFua30uYCk7XG4gIHV0aWwuYXNzZXJ0KFxuICAgICAgY29udl91dGlsLmVpdGhlclN0cmlkZXNPckRpbGF0aW9uc0FyZU9uZShzdHJpZGVzLCBkaWxhdGlvbnMpLFxuICAgICAgKCkgPT4gJ0Vycm9yIGluIG1heFBvb2w6IEVpdGhlciBzdHJpZGVzIG9yIGRpbGF0aW9ucyBtdXN0IGJlIDEuICcgK1xuICAgICAgICAgIGBHb3Qgc3RyaWRlcyAke3N0cmlkZXN9IGFuZCBkaWxhdGlvbnMgJyR7ZGlsYXRpb25zfSdgKTtcbiAgY29udl91dGlsLmNoZWNrUGFkT25EaW1Sb3VuZGluZ01vZGUoJ21heFBvb2wnLCBwYWQsIGRpbVJvdW5kaW5nTW9kZSk7XG4gIGNvbnN0IGlucHV0czogTWF4UG9vbElucHV0cyA9IHt4OiB4NER9O1xuICBjb25zdCBhdHRyczogTWF4UG9vbEF0dHJzID0ge2ZpbHRlclNpemUsIHN0cmlkZXMsIHBhZCwgZGltUm91bmRpbmdNb2RlfTtcblxuICAvLyB0c2xpbnQ6ZGlzYWJsZS1uZXh0LWxpbmU6IG5vLXVubmVjZXNzYXJ5LXR5cGUtYXNzZXJ0aW9uXG4gIGNvbnN0IHJlcyA9IEVOR0lORS5ydW5LZXJuZWwoXG4gICAgICAgICAgICAgICAgICBNYXhQb29sLCBpbnB1dHMgYXMge30gYXMgTmFtZWRUZW5zb3JNYXAsXG4gICAgICAgICAgICAgICAgICBhdHRycyBhcyB7fSBhcyBOYW1lZEF0dHJNYXApIGFzIFQ7XG5cbiAgaWYgKHJlc2hhcGVkVG80RCkge1xuICAgIHJldHVybiByZXNoYXBlKHJlcywgW3Jlcy5zaGFwZVsxXSwgcmVzLnNoYXBlWzJdLCByZXMuc2hhcGVbM11dKSBhcyBUO1xuICB9XG4gIHJldHVybiByZXM7XG59XG5cbmV4cG9ydCBjb25zdCBtYXhQb29sID0gb3Aoe21heFBvb2xffSk7XG4iXX0=","/**\n * @license\n * Copyright 2020 Google LLC. All Rights Reserved.\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n * =============================================================================\n */\nimport { ENGINE } from '../engine';\nimport { Maximum } from '../kernel_names';\nimport { makeTypesMatch } from '../tensor_util';\nimport { convertToTensor } from '../tensor_util_env';\nimport { assertAndGetBroadcastShape } from './broadcast_util';\nimport { cast } from './cast';\nimport { op } from './operation';\n/**\n * Returns the max of a and b (`a > b ? a : b`) element-wise.\n * Supports broadcasting.\n *\n * We also expose `tf.maximumStrict` which has the same signature as this op and\n * asserts that `a` and `b` are the same shape (does not broadcast).\n *\n * ```js\n * const a = tf.tensor1d([1, 4, 3, 16]);\n * const b = tf.tensor1d([1, 2, 9, 4]);\n *\n * a.maximum(b).print(); // or tf.maximum(a, b)\n * ```\n *\n * ```js\n * // Broadcast maximum a with b.\n * const a = tf.tensor1d([2, 4, 6, 8]);\n * const b = tf.scalar(5);\n *\n * a.maximum(b).print(); // or tf.maximum(a, b)\n * ```\n *\n * @param a The first tensor.\n * @param b The second tensor. Must have the same type as `a`.\n *\n * @doc {heading: 'Operations', subheading: 'Arithmetic'}\n */\nfunction maximum_(a, b) {\n let $a = convertToTensor(a, 'a', 'maximum');\n let $b = convertToTensor(b, 'b', 'maximum');\n [$a, $b] = makeTypesMatch($a, $b);\n if ($a.dtype === 'bool') {\n $a = cast($a, 'int32');\n $b = cast($b, 'int32');\n }\n assertAndGetBroadcastShape($a.shape, $b.shape);\n const inputs = { a: $a, b: $b };\n return ENGINE.runKernel(Maximum, inputs);\n}\nexport const maximum = op({ maximum_ });\n//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibWF4aW11bS5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uLy4uL3RmanMtY29yZS9zcmMvb3BzL21heGltdW0udHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUE7Ozs7Ozs7Ozs7Ozs7OztHQWVHO0FBRUgsT0FBTyxFQUFDLE1BQU0sRUFBQyxNQUFNLFdBQVcsQ0FBQztBQUNqQyxPQUFPLEVBQUMsT0FBTyxFQUFnQixNQUFNLGlCQUFpQixDQUFDO0FBR3ZELE9BQU8sRUFBQyxjQUFjLEVBQUMsTUFBTSxnQkFBZ0IsQ0FBQztBQUM5QyxPQUFPLEVBQUMsZUFBZSxFQUFDLE1BQU0sb0JBQW9CLENBQUM7QUFHbkQsT0FBTyxFQUFDLDBCQUEwQixFQUFDLE1BQU0sa0JBQWtCLENBQUM7QUFDNUQsT0FBTyxFQUFDLElBQUksRUFBQyxNQUFNLFFBQVEsQ0FBQztBQUM1QixPQUFPLEVBQUMsRUFBRSxFQUFDLE1BQU0sYUFBYSxDQUFDO0FBRS9COzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7OztHQTBCRztBQUNILFNBQVMsUUFBUSxDQUNiLENBQW9CLEVBQUUsQ0FBb0I7SUFDNUMsSUFBSSxFQUFFLEdBQUcsZUFBZSxDQUFDLENBQUMsRUFBRSxHQUFHLEVBQUUsU0FBUyxDQUFDLENBQUM7SUFDNUMsSUFBSSxFQUFFLEdBQUcsZUFBZSxDQUFDLENBQUMsRUFBRSxHQUFHLEVBQUUsU0FBUyxDQUFDLENBQUM7SUFDNUMsQ0FBQyxFQUFFLEVBQUUsRUFBRSxDQUFDLEdBQUcsY0FBYyxDQUFDLEVBQUUsRUFBRSxFQUFFLENBQUMsQ0FBQztJQUVsQyxJQUFJLEVBQUUsQ0FBQyxLQUFLLEtBQUssTUFBTSxFQUFFO1FBQ3ZCLEVBQUUsR0FBRyxJQUFJLENBQUMsRUFBRSxFQUFFLE9BQU8sQ0FBQyxDQUFDO1FBQ3ZCLEVBQUUsR0FBRyxJQUFJLENBQUMsRUFBRSxFQUFFLE9BQU8sQ0FBQyxDQUFDO0tBQ3hCO0lBQ0QsMEJBQTBCLENBQUMsRUFBRSxDQUFDLEtBQUssRUFBRSxFQUFFLENBQUMsS0FBSyxDQUFDLENBQUM7SUFFL0MsTUFBTSxNQUFNLEdBQWtCLEVBQUMsQ0FBQyxFQUFFLEVBQUUsRUFBRSxDQUFDLEVBQUUsRUFBRSxFQUFDLENBQUM7SUFFN0MsT0FBTyxNQUFNLENBQUMsU0FBUyxDQUFDLE9BQU8sRUFBRSxNQUE4QixDQUFDLENBQUM7QUFDbkUsQ0FBQztBQUVELE1BQU0sQ0FBQyxNQUFNLE9BQU8sR0FBRyxFQUFFLENBQUMsRUFBQyxRQUFRLEVBQUMsQ0FBQyxDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiLyoqXG4gKiBAbGljZW5zZVxuICogQ29weXJpZ2h0IDIwMjAgR29vZ2xlIExMQy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC5cbiAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSBcIkxpY2Vuc2VcIik7XG4gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuXG4gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXRcbiAqXG4gKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjBcbiAqXG4gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlXG4gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiBcIkFTIElTXCIgQkFTSVMsXG4gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC5cbiAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmRcbiAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLlxuICogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbiAqL1xuXG5pbXBvcnQge0VOR0lORX0gZnJvbSAnLi4vZW5naW5lJztcbmltcG9ydCB7TWF4aW11bSwgTWF4aW11bUlucHV0c30gZnJvbSAnLi4va2VybmVsX25hbWVzJztcbmltcG9ydCB7VGVuc29yfSBmcm9tICcuLi90ZW5zb3InO1xuaW1wb3J0IHtOYW1lZFRlbnNvck1hcH0gZnJvbSAnLi4vdGVuc29yX3R5cGVzJztcbmltcG9ydCB7bWFrZVR5cGVzTWF0Y2h9IGZyb20gJy4uL3RlbnNvcl91dGlsJztcbmltcG9ydCB7Y29udmVydFRvVGVuc29yfSBmcm9tICcuLi90ZW5zb3JfdXRpbF9lbnYnO1xuaW1wb3J0IHtUZW5zb3JMaWtlfSBmcm9tICcuLi90eXBlcyc7XG5cbmltcG9ydCB7YXNzZXJ0QW5kR2V0QnJvYWRjYXN0U2hhcGV9IGZyb20gJy4vYnJvYWRjYXN0X3V0aWwnO1xuaW1wb3J0IHtjYXN0fSBmcm9tICcuL2Nhc3QnO1xuaW1wb3J0IHtvcH0gZnJvbSAnLi9vcGVyYXRpb24nO1xuXG4vKipcbiAqIFJldHVybnMgdGhlIG1heCBvZiBhIGFuZCBiIChgYSA+IGIgPyBhIDogYmApIGVsZW1lbnQtd2lzZS5cbiAqIFN1cHBvcnRzIGJyb2FkY2FzdGluZy5cbiAqXG4gKiBXZSBhbHNvIGV4cG9zZSBgdGYubWF4aW11bVN0cmljdGAgd2hpY2ggaGFzIHRoZSBzYW1lIHNpZ25hdHVyZSBhcyB0aGlzIG9wIGFuZFxuICogYXNzZXJ0cyB0aGF0IGBhYCBhbmQgYGJgIGFyZSB0aGUgc2FtZSBzaGFwZSAoZG9lcyBub3QgYnJvYWRjYXN0KS5cbiAqXG4gKiBgYGBqc1xuICogY29uc3QgYSA9IHRmLnRlbnNvcjFkKFsxLCA0LCAzLCAxNl0pO1xuICogY29uc3QgYiA9IHRmLnRlbnNvcjFkKFsxLCAyLCA5LCA0XSk7XG4gKlxuICogYS5tYXhpbXVtKGIpLnByaW50KCk7ICAvLyBvciB0Zi5tYXhpbXVtKGEsIGIpXG4gKiBgYGBcbiAqXG4gKiBgYGBqc1xuICogLy8gQnJvYWRjYXN0IG1heGltdW0gYSB3aXRoIGIuXG4gKiBjb25zdCBhID0gdGYudGVuc29yMWQoWzIsIDQsIDYsIDhdKTtcbiAqIGNvbnN0IGIgPSB0Zi5zY2FsYXIoNSk7XG4gKlxuICogYS5tYXhpbXVtKGIpLnByaW50KCk7ICAvLyBvciB0Zi5tYXhpbXVtKGEsIGIpXG4gKiBgYGBcbiAqXG4gKiBAcGFyYW0gYSBUaGUgZmlyc3QgdGVuc29yLlxuICogQHBhcmFtIGIgVGhlIHNlY29uZCB0ZW5zb3IuIE11c3QgaGF2ZSB0aGUgc2FtZSB0eXBlIGFzIGBhYC5cbiAqXG4gKiBAZG9jIHtoZWFkaW5nOiAnT3BlcmF0aW9ucycsIHN1YmhlYWRpbmc6ICdBcml0aG1ldGljJ31cbiAqL1xuZnVuY3Rpb24gbWF4aW11bV88VCBleHRlbmRzIFRlbnNvcj4oXG4gICAgYTogVGVuc29yfFRlbnNvckxpa2UsIGI6IFRlbnNvcnxUZW5zb3JMaWtlKTogVCB7XG4gIGxldCAkYSA9IGNvbnZlcnRUb1RlbnNvcihhLCAnYScsICdtYXhpbXVtJyk7XG4gIGxldCAkYiA9IGNvbnZlcnRUb1RlbnNvcihiLCAnYicsICdtYXhpbXVtJyk7XG4gIFskYSwgJGJdID0gbWFrZVR5cGVzTWF0Y2goJGEsICRiKTtcblxuICBpZiAoJGEuZHR5cGUgPT09ICdib29sJykge1xuICAgICRhID0gY2FzdCgkYSwgJ2ludDMyJyk7XG4gICAgJGIgPSBjYXN0KCRiLCAnaW50MzInKTtcbiAgfVxuICBhc3NlcnRBbmRHZXRCcm9hZGNhc3RTaGFwZSgkYS5zaGFwZSwgJGIuc2hhcGUpO1xuXG4gIGNvbnN0IGlucHV0czogTWF4aW11bUlucHV0cyA9IHthOiAkYSwgYjogJGJ9O1xuXG4gIHJldHVybiBFTkdJTkUucnVuS2VybmVsKE1heGltdW0sIGlucHV0cyBhcyB7fSBhcyBOYW1lZFRlbnNvck1hcCk7XG59XG5cbmV4cG9ydCBjb25zdCBtYXhpbXVtID0gb3Aoe21heGltdW1ffSk7XG4iXX0=","/**\n * @license\n * Copyright 2020 Google Inc. All Rights Reserved.\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n * =============================================================================\n */\nimport { ENGINE } from '../engine';\nimport { Mean } from '../kernel_names';\nimport { convertToTensor } from '../tensor_util_env';\nimport { op } from './operation';\n/**\n * Computes the mean of elements across dimensions of a `tf.Tensor`.\n *\n * Reduces `x` along the dimensions given in `axis`. Unless `keepDims` is\n * true, the rank of the `tf.Tensor` is reduced by 1 for each entry in `axis`.\n * If `keepDims` is true, the reduced dimensions are retained with length 1.\n * If `axis` has no entries, all dimensions are reduced, and a `tf.Tensor` with\n * a single element is returned.\n *\n * ```js\n * const x = tf.tensor1d([1, 2, 3]);\n *\n * x.mean().print(); // or tf.mean(a)\n * ```\n *\n * ```js\n * const x = tf.tensor2d([1, 2, 3, 4], [2, 2]);\n *\n * const axis = 1;\n * x.mean(axis).print(); // or tf.mean(x, axis)\n * ```\n *\n * @param x The input tensor.\n * @param axis The dimension(s) to reduce. By default it reduces\n * all dimensions.\n * @param keepDims If true, retains reduced dimensions with size 1.\n *\n * @doc {heading: 'Operations', subheading: 'Reduction'}\n */\nfunction mean_(x, axis = null, keepDims = false) {\n const $x = convertToTensor(x, 'x', 'mean');\n const inputs = { x: $x };\n const attrs = { axis, keepDims };\n return ENGINE.runKernel(Mean, inputs, attrs);\n}\nexport const mean = op({ mean_ });\n//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibWVhbi5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uLy4uL3RmanMtY29yZS9zcmMvb3BzL21lYW4udHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUE7Ozs7Ozs7Ozs7Ozs7OztHQWVHO0FBRUgsT0FBTyxFQUFDLE1BQU0sRUFBQyxNQUFNLFdBQVcsQ0FBQztBQUNqQyxPQUFPLEVBQUMsSUFBSSxFQUF3QixNQUFNLGlCQUFpQixDQUFDO0FBSTVELE9BQU8sRUFBQyxlQUFlLEVBQUMsTUFBTSxvQkFBb0IsQ0FBQztBQUduRCxPQUFPLEVBQUMsRUFBRSxFQUFDLE1BQU0sYUFBYSxDQUFDO0FBRS9COzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7O0dBNEJHO0FBQ0gsU0FBUyxLQUFLLENBQ1YsQ0FBb0IsRUFBRSxPQUF3QixJQUFJLEVBQUUsUUFBUSxHQUFHLEtBQUs7SUFDdEUsTUFBTSxFQUFFLEdBQUcsZUFBZSxDQUFDLENBQUMsRUFBRSxHQUFHLEVBQUUsTUFBTSxDQUFDLENBQUM7SUFFM0MsTUFBTSxNQUFNLEdBQWUsRUFBQyxDQUFDLEVBQUUsRUFBRSxFQUFDLENBQUM7SUFDbkMsTUFBTSxLQUFLLEdBQWMsRUFBQyxJQUFJLEVBQUUsUUFBUSxFQUFDLENBQUM7SUFFMUMsT0FBTyxNQUFNLENBQUMsU0FBUyxDQUNuQixJQUFJLEVBQUUsTUFBOEIsRUFBRSxLQUEyQixDQUFDLENBQUM7QUFDekUsQ0FBQztBQUVELE1BQU0sQ0FBQyxNQUFNLElBQUksR0FBRyxFQUFFLENBQUMsRUFBQyxLQUFLLEVBQUMsQ0FBQyxDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiLyoqXG4gKiBAbGljZW5zZVxuICogQ29weXJpZ2h0IDIwMjAgR29vZ2xlIEluYy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC5cbiAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSBcIkxpY2Vuc2VcIik7XG4gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuXG4gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXRcbiAqXG4gKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjBcbiAqXG4gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlXG4gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiBcIkFTIElTXCIgQkFTSVMsXG4gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC5cbiAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmRcbiAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLlxuICogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbiAqL1xuXG5pbXBvcnQge0VOR0lORX0gZnJvbSAnLi4vZW5naW5lJztcbmltcG9ydCB7TWVhbiwgTWVhbkF0dHJzLCBNZWFuSW5wdXRzfSBmcm9tICcuLi9rZXJuZWxfbmFtZXMnO1xuaW1wb3J0IHtOYW1lZEF0dHJNYXB9IGZyb20gJy4uL2tlcm5lbF9yZWdpc3RyeSc7XG5pbXBvcnQge1RlbnNvcn0gZnJvbSAnLi4vdGVuc29yJztcbmltcG9ydCB7TmFtZWRUZW5zb3JNYXB9IGZyb20gJy4uL3RlbnNvcl90eXBlcyc7XG5pbXBvcnQge2NvbnZlcnRUb1RlbnNvcn0gZnJvbSAnLi4vdGVuc29yX3V0aWxfZW52JztcbmltcG9ydCB7VGVuc29yTGlrZX0gZnJvbSAnLi4vdHlwZXMnO1xuXG5pbXBvcnQge29wfSBmcm9tICcuL29wZXJhdGlvbic7XG5cbi8qKlxuICogQ29tcHV0ZXMgdGhlIG1lYW4gb2YgZWxlbWVudHMgYWNyb3NzIGRpbWVuc2lvbnMgb2YgYSBgdGYuVGVuc29yYC5cbiAqXG4gKiBSZWR1Y2VzIGB4YCBhbG9uZyB0aGUgZGltZW5zaW9ucyBnaXZlbiBpbiBgYXhpc2AuIFVubGVzcyBga2VlcERpbXNgIGlzXG4gKiB0cnVlLCB0aGUgcmFuayBvZiB0aGUgYHRmLlRlbnNvcmAgaXMgcmVkdWNlZCBieSAxIGZvciBlYWNoIGVudHJ5IGluIGBheGlzYC5cbiAqIElmIGBrZWVwRGltc2AgaXMgdHJ1ZSwgdGhlIHJlZHVjZWQgZGltZW5zaW9ucyBhcmUgcmV0YWluZWQgd2l0aCBsZW5ndGggMS5cbiAqIElmIGBheGlzYCBoYXMgbm8gZW50cmllcywgYWxsIGRpbWVuc2lvbnMgYXJlIHJlZHVjZWQsIGFuZCBhIGB0Zi5UZW5zb3JgIHdpdGhcbiAqIGEgc2luZ2xlIGVsZW1lbnQgaXMgcmV0dXJuZWQuXG4gKlxuICogYGBganNcbiAqIGNvbnN0IHggPSB0Zi50ZW5zb3IxZChbMSwgMiwgM10pO1xuICpcbiAqIHgubWVhbigpLnByaW50KCk7ICAvLyBvciB0Zi5tZWFuKGEpXG4gKiBgYGBcbiAqXG4gKiBgYGBqc1xuICogY29uc3QgeCA9IHRmLnRlbnNvcjJkKFsxLCAyLCAzLCA0XSwgWzIsIDJdKTtcbiAqXG4gKiBjb25zdCBheGlzID0gMTtcbiAqIHgubWVhbihheGlzKS5wcmludCgpOyAgLy8gb3IgdGYubWVhbih4LCBheGlzKVxuICogYGBgXG4gKlxuICogQHBhcmFtIHggVGhlIGlucHV0IHRlbnNvci5cbiAqIEBwYXJhbSBheGlzIFRoZSBkaW1lbnNpb24ocykgdG8gcmVkdWNlLiBCeSBkZWZhdWx0IGl0IHJlZHVjZXNcbiAqICAgICBhbGwgZGltZW5zaW9ucy5cbiAqIEBwYXJhbSBrZWVwRGltcyBJZiB0cnVlLCByZXRhaW5zIHJlZHVjZWQgZGltZW5zaW9ucyB3aXRoIHNpemUgMS5cbiAqXG4gKiBAZG9jIHtoZWFkaW5nOiAnT3BlcmF0aW9ucycsIHN1YmhlYWRpbmc6ICdSZWR1Y3Rpb24nfVxuICovXG5mdW5jdGlvbiBtZWFuXzxUIGV4dGVuZHMgVGVuc29yPihcbiAgICB4OiBUZW5zb3J8VGVuc29yTGlrZSwgYXhpczogbnVtYmVyfG51bWJlcltdID0gbnVsbCwga2VlcERpbXMgPSBmYWxzZSk6IFQge1xuICBjb25zdCAkeCA9IGNvbnZlcnRUb1RlbnNvcih4LCAneCcsICdtZWFuJyk7XG5cbiAgY29uc3QgaW5wdXRzOiBNZWFuSW5wdXRzID0ge3g6ICR4fTtcbiAgY29uc3QgYXR0cnM6IE1lYW5BdHRycyA9IHtheGlzLCBrZWVwRGltc307XG5cbiAgcmV0dXJuIEVOR0lORS5ydW5LZXJuZWwoXG4gICAgICBNZWFuLCBpbnB1dHMgYXMge30gYXMgTmFtZWRUZW5zb3JNYXAsIGF0dHJzIGFzIHt9IGFzIE5hbWVkQXR0ck1hcCk7XG59XG5cbmV4cG9ydCBjb25zdCBtZWFuID0gb3Aoe21lYW5ffSk7XG4iXX0=","/**\n * @license\n * Copyright 2020 Google Inc. All Rights Reserved.\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n * =============================================================================\n */\nimport { ENGINE } from '../engine';\nimport { Min } from '../kernel_names';\nimport { convertToTensor } from '../tensor_util_env';\nimport { op } from './operation';\n/**\n * Computes the minimum value from the input.\n *\n * Reduces the input along the dimensions given in `axes`. Unless `keepDims`\n * is true, the rank of the array is reduced by 1 for each entry in `axes`.\n * If `keepDims` is true, the reduced dimensions are retained with length 1.\n * If `axes` has no entries, all dimensions are reduced, and an array with a\n * single element is returned.\n *\n * ```js\n * const x = tf.tensor1d([1, 2, 3]);\n *\n * x.min().print(); // or tf.min(x)\n * ```\n *\n * ```js\n * const x = tf.tensor2d([1, 2, 3, 4], [2, 2]);\n *\n * const axis = 1;\n * x.min(axis).print(); // or tf.min(x, axis)\n * ```\n *\n * @param x The input Tensor.\n * @param axis The dimension(s) to reduce. By default it reduces\n * all dimensions.\n * @param keepDims If true, retains reduced dimensions with size 1.\n *\n * @doc {heading: 'Operations', subheading: 'Reduction'}\n */\nfunction min_(x, axis = null, keepDims = false) {\n const $x = convertToTensor(x, 'x', 'min');\n const inputs = { x: $x };\n const attrs = { axis, keepDims };\n // tslint:disable-next-line: no-unnecessary-type-assertion\n return ENGINE.runKernel(Min, inputs, attrs);\n}\nexport const min = op({ min_ });\n//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibWluLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vLi4vdGZqcy1jb3JlL3NyYy9vcHMvbWluLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBOzs7Ozs7Ozs7Ozs7Ozs7R0FlRztBQUNILE9BQU8sRUFBQyxNQUFNLEVBQUMsTUFBTSxXQUFXLENBQUM7QUFDakMsT0FBTyxFQUFDLEdBQUcsRUFBc0IsTUFBTSxpQkFBaUIsQ0FBQztBQUl6RCxPQUFPLEVBQUMsZUFBZSxFQUFDLE1BQU0sb0JBQW9CLENBQUM7QUFHbkQsT0FBTyxFQUFDLEVBQUUsRUFBQyxNQUFNLGFBQWEsQ0FBQztBQUUvQjs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7OztHQTRCRztBQUNILFNBQVMsSUFBSSxDQUNULENBQW9CLEVBQUUsT0FBd0IsSUFBSSxFQUFFLFFBQVEsR0FBRyxLQUFLO0lBQ3RFLE1BQU0sRUFBRSxHQUFHLGVBQWUsQ0FBQyxDQUFDLEVBQUUsR0FBRyxFQUFFLEtBQUssQ0FBQyxDQUFDO0lBRTFDLE1BQU0sTUFBTSxHQUFjLEVBQUMsQ0FBQyxFQUFFLEVBQUUsRUFBQyxDQUFDO0lBQ2xDLE1BQU0sS0FBSyxHQUFhLEVBQUMsSUFBSSxFQUFFLFFBQVEsRUFBQyxDQUFDO0lBRXpDLDBEQUEwRDtJQUMxRCxPQUFPLE1BQU0sQ0FBQyxTQUFTLENBQ1osR0FBRyxFQUFFLE1BQThCLEVBQ25DLEtBQTJCLENBQU0sQ0FBQztBQUMvQyxDQUFDO0FBRUQsTUFBTSxDQUFDLE1BQU0sR0FBRyxHQUFHLEVBQUUsQ0FBQyxFQUFDLElBQUksRUFBQyxDQUFDLENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyIvKipcbiAqIEBsaWNlbnNlXG4gKiBDb3B5cmlnaHQgMjAyMCBHb29nbGUgSW5jLiBBbGwgUmlnaHRzIFJlc2VydmVkLlxuICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlIFwiTGljZW5zZVwiKTtcbiAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS5cbiAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdFxuICpcbiAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMFxuICpcbiAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmVcbiAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuIFwiQVMgSVNcIiBCQVNJUyxcbiAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLlxuICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZFxuICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuXG4gKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuICovXG5pbXBvcnQge0VOR0lORX0gZnJvbSAnLi4vZW5naW5lJztcbmltcG9ydCB7TWluLCBNaW5BdHRycywgTWluSW5wdXRzfSBmcm9tICcuLi9rZXJuZWxfbmFtZXMnO1xuaW1wb3J0IHtOYW1lZEF0dHJNYXB9IGZyb20gJy4uL2tlcm5lbF9yZWdpc3RyeSc7XG5pbXBvcnQge1RlbnNvcn0gZnJvbSAnLi4vdGVuc29yJztcbmltcG9ydCB7TmFtZWRUZW5zb3JNYXB9IGZyb20gJy4uL3RlbnNvcl90eXBlcyc7XG5pbXBvcnQge2NvbnZlcnRUb1RlbnNvcn0gZnJvbSAnLi4vdGVuc29yX3V0aWxfZW52JztcbmltcG9ydCB7VGVuc29yTGlrZX0gZnJvbSAnLi4vdHlwZXMnO1xuXG5pbXBvcnQge29wfSBmcm9tICcuL29wZXJhdGlvbic7XG5cbi8qKlxuICogQ29tcHV0ZXMgdGhlIG1pbmltdW0gdmFsdWUgZnJvbSB0aGUgaW5wdXQuXG4gKlxuICogUmVkdWNlcyB0aGUgaW5wdXQgYWxvbmcgdGhlIGRpbWVuc2lvbnMgZ2l2ZW4gaW4gYGF4ZXNgLiBVbmxlc3MgYGtlZXBEaW1zYFxuICogaXMgdHJ1ZSwgdGhlIHJhbmsgb2YgdGhlIGFycmF5IGlzIHJlZHVjZWQgYnkgMSBmb3IgZWFjaCBlbnRyeSBpbiBgYXhlc2AuXG4gKiBJZiBga2VlcERpbXNgIGlzIHRydWUsIHRoZSByZWR1Y2VkIGRpbWVuc2lvbnMgYXJlIHJldGFpbmVkIHdpdGggbGVuZ3RoIDEuXG4gKiBJZiBgYXhlc2AgaGFzIG5vIGVudHJpZXMsIGFsbCBkaW1lbnNpb25zIGFyZSByZWR1Y2VkLCBhbmQgYW4gYXJyYXkgd2l0aCBhXG4gKiBzaW5nbGUgZWxlbWVudCBpcyByZXR1cm5lZC5cbiAqXG4gKiBgYGBqc1xuICogY29uc3QgeCA9IHRmLnRlbnNvcjFkKFsxLCAyLCAzXSk7XG4gKlxuICogeC5taW4oKS5wcmludCgpOyAgLy8gb3IgdGYubWluKHgpXG4gKiBgYGBcbiAqXG4gKiBgYGBqc1xuICogY29uc3QgeCA9IHRmLnRlbnNvcjJkKFsxLCAyLCAzLCA0XSwgWzIsIDJdKTtcbiAqXG4gKiBjb25zdCBheGlzID0gMTtcbiAqIHgubWluKGF4aXMpLnByaW50KCk7ICAvLyBvciB0Zi5taW4oeCwgYXhpcylcbiAqIGBgYFxuICpcbiAqIEBwYXJhbSB4IFRoZSBpbnB1dCBUZW5zb3IuXG4gKiBAcGFyYW0gYXhpcyBUaGUgZGltZW5zaW9uKHMpIHRvIHJlZHVjZS4gQnkgZGVmYXVsdCBpdCByZWR1Y2VzXG4gKiAgICAgYWxsIGRpbWVuc2lvbnMuXG4gKiBAcGFyYW0ga2VlcERpbXMgSWYgdHJ1ZSwgcmV0YWlucyByZWR1Y2VkIGRpbWVuc2lvbnMgd2l0aCBzaXplIDEuXG4gKlxuICogQGRvYyB7aGVhZGluZzogJ09wZXJhdGlvbnMnLCBzdWJoZWFkaW5nOiAnUmVkdWN0aW9uJ31cbiAqL1xuZnVuY3Rpb24gbWluXzxUIGV4dGVuZHMgVGVuc29yPihcbiAgICB4OiBUZW5zb3J8VGVuc29yTGlrZSwgYXhpczogbnVtYmVyfG51bWJlcltdID0gbnVsbCwga2VlcERpbXMgPSBmYWxzZSk6IFQge1xuICBjb25zdCAkeCA9IGNvbnZlcnRUb1RlbnNvcih4LCAneCcsICdtaW4nKTtcblxuICBjb25zdCBpbnB1dHM6IE1pbklucHV0cyA9IHt4OiAkeH07XG4gIGNvbnN0IGF0dHJzOiBNaW5BdHRycyA9IHtheGlzLCBrZWVwRGltc307XG5cbiAgLy8gdHNsaW50OmRpc2FibGUtbmV4dC1saW5lOiBuby11bm5lY2Vzc2FyeS10eXBlLWFzc2VydGlvblxuICByZXR1cm4gRU5HSU5FLnJ1bktlcm5lbChcbiAgICAgICAgICAgICBNaW4sIGlucHV0cyBhcyB7fSBhcyBOYW1lZFRlbnNvck1hcCxcbiAgICAgICAgICAgICBhdHRycyBhcyB7fSBhcyBOYW1lZEF0dHJNYXApIGFzIFQ7XG59XG5cbmV4cG9ydCBjb25zdCBtaW4gPSBvcCh7bWluX30pO1xuIl19","/**\n * @license\n * Copyright 2020 Google LLC. All Rights Reserved.\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n * =============================================================================\n */\nimport { ENGINE } from '../engine';\nimport { Minimum } from '../kernel_names';\nimport { makeTypesMatch } from '../tensor_util';\nimport { convertToTensor } from '../tensor_util_env';\nimport { assertAndGetBroadcastShape } from './broadcast_util';\nimport { cast } from './cast';\nimport { op } from './operation';\n/**\n * Returns the min of a and b (`a < b ? a : b`) element-wise.\n * Supports broadcasting.\n *\n * We also expose `minimumStrict` which has the same signature as this op and\n * asserts that `a` and `b` are the same shape (does not broadcast).\n *\n * ```js\n * const a = tf.tensor1d([1, 4, 3, 16]);\n * const b = tf.tensor1d([1, 2, 9, 4]);\n *\n * a.minimum(b).print(); // or tf.minimum(a, b)\n * ```\n *\n * ```js\n * // Broadcast minimum a with b.\n * const a = tf.tensor1d([2, 4, 6, 8]);\n * const b = tf.scalar(5);\n *\n * a.minimum(b).print(); // or tf.minimum(a, b)\n * ```\n *\n * @param a The first tensor.\n * @param b The second tensor. Must have the same type as `a`.\n *\n * @doc {heading: 'Operations', subheading: 'Arithmetic'}\n */\nfunction minimum_(a, b) {\n let $a = convertToTensor(a, 'a', 'minimum');\n let $b = convertToTensor(b, 'b', 'minimum');\n [$a, $b] = makeTypesMatch($a, $b);\n if ($a.dtype === 'bool') {\n $a = cast($a, 'int32');\n $b = cast($b, 'int32');\n }\n assertAndGetBroadcastShape($a.shape, $b.shape);\n const inputs = { a: $a, b: $b };\n return ENGINE.runKernel(Minimum, inputs);\n}\nexport const minimum = op({ minimum_ });\n//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibWluaW11bS5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uLy4uL3RmanMtY29yZS9zcmMvb3BzL21pbmltdW0udHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUE7Ozs7Ozs7Ozs7Ozs7OztHQWVHO0FBRUgsT0FBTyxFQUFDLE1BQU0sRUFBQyxNQUFNLFdBQVcsQ0FBQztBQUNqQyxPQUFPLEVBQUMsT0FBTyxFQUFnQixNQUFNLGlCQUFpQixDQUFDO0FBR3ZELE9BQU8sRUFBQyxjQUFjLEVBQUMsTUFBTSxnQkFBZ0IsQ0FBQztBQUM5QyxPQUFPLEVBQUMsZUFBZSxFQUFDLE1BQU0sb0JBQW9CLENBQUM7QUFHbkQsT0FBTyxFQUFDLDBCQUEwQixFQUFDLE1BQU0sa0JBQWtCLENBQUM7QUFDNUQsT0FBTyxFQUFDLElBQUksRUFBQyxNQUFNLFFBQVEsQ0FBQztBQUM1QixPQUFPLEVBQUMsRUFBRSxFQUFDLE1BQU0sYUFBYSxDQUFDO0FBRS9COzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7OztHQTBCRztBQUNILFNBQVMsUUFBUSxDQUNiLENBQW9CLEVBQUUsQ0FBb0I7SUFDNUMsSUFBSSxFQUFFLEdBQUcsZUFBZSxDQUFDLENBQUMsRUFBRSxHQUFHLEVBQUUsU0FBUyxDQUFDLENBQUM7SUFDNUMsSUFBSSxFQUFFLEdBQUcsZUFBZSxDQUFDLENBQUMsRUFBRSxHQUFHLEVBQUUsU0FBUyxDQUFDLENBQUM7SUFDNUMsQ0FBQyxFQUFFLEVBQUUsRUFBRSxDQUFDLEdBQUcsY0FBYyxDQUFDLEVBQUUsRUFBRSxFQUFFLENBQUMsQ0FBQztJQUVsQyxJQUFJLEVBQUUsQ0FBQyxLQUFLLEtBQUssTUFBTSxFQUFFO1FBQ3ZCLEVBQUUsR0FBRyxJQUFJLENBQUMsRUFBRSxFQUFFLE9BQU8sQ0FBQyxDQUFDO1FBQ3ZCLEVBQUUsR0FBRyxJQUFJLENBQUMsRUFBRSxFQUFFLE9BQU8sQ0FBQyxDQUFDO0tBQ3hCO0lBRUQsMEJBQTBCLENBQUMsRUFBRSxDQUFDLEtBQUssRUFBRSxFQUFFLENBQUMsS0FBSyxDQUFDLENBQUM7SUFFL0MsTUFBTSxNQUFNLEdBQWtCLEVBQUMsQ0FBQyxFQUFFLEVBQUUsRUFBRSxDQUFDLEVBQUUsRUFBRSxFQUFDLENBQUM7SUFFN0MsT0FBTyxNQUFNLENBQUMsU0FBUyxDQUFDLE9BQU8sRUFBRSxNQUE4QixDQUFDLENBQUM7QUFDbkUsQ0FBQztBQUVELE1BQU0sQ0FBQyxNQUFNLE9BQU8sR0FBRyxFQUFFLENBQUMsRUFBQyxRQUFRLEVBQUMsQ0FBQyxDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiLyoqXG4gKiBAbGljZW5zZVxuICogQ29weXJpZ2h0IDIwMjAgR29vZ2xlIExMQy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC5cbiAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSBcIkxpY2Vuc2VcIik7XG4gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuXG4gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXRcbiAqXG4gKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjBcbiAqXG4gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlXG4gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiBcIkFTIElTXCIgQkFTSVMsXG4gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC5cbiAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmRcbiAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLlxuICogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbiAqL1xuXG5pbXBvcnQge0VOR0lORX0gZnJvbSAnLi4vZW5naW5lJztcbmltcG9ydCB7TWluaW11bSwgTWluaW11bUlucHV0c30gZnJvbSAnLi4va2VybmVsX25hbWVzJztcbmltcG9ydCB7VGVuc29yfSBmcm9tICcuLi90ZW5zb3InO1xuaW1wb3J0IHtOYW1lZFRlbnNvck1hcH0gZnJvbSAnLi4vdGVuc29yX3R5cGVzJztcbmltcG9ydCB7bWFrZVR5cGVzTWF0Y2h9IGZyb20gJy4uL3RlbnNvcl91dGlsJztcbmltcG9ydCB7Y29udmVydFRvVGVuc29yfSBmcm9tICcuLi90ZW5zb3JfdXRpbF9lbnYnO1xuaW1wb3J0IHtUZW5zb3JMaWtlfSBmcm9tICcuLi90eXBlcyc7XG5cbmltcG9ydCB7YXNzZXJ0QW5kR2V0QnJvYWRjYXN0U2hhcGV9IGZyb20gJy4vYnJvYWRjYXN0X3V0aWwnO1xuaW1wb3J0IHtjYXN0fSBmcm9tICcuL2Nhc3QnO1xuaW1wb3J0IHtvcH0gZnJvbSAnLi9vcGVyYXRpb24nO1xuXG4vKipcbiAqIFJldHVybnMgdGhlIG1pbiBvZiBhIGFuZCBiIChgYSA8IGIgPyBhIDogYmApIGVsZW1lbnQtd2lzZS5cbiAqIFN1cHBvcnRzIGJyb2FkY2FzdGluZy5cbiAqXG4gKiBXZSBhbHNvIGV4cG9zZSBgbWluaW11bVN0cmljdGAgd2hpY2ggaGFzIHRoZSBzYW1lIHNpZ25hdHVyZSBhcyB0aGlzIG9wIGFuZFxuICogYXNzZXJ0cyB0aGF0IGBhYCBhbmQgYGJgIGFyZSB0aGUgc2FtZSBzaGFwZSAoZG9lcyBub3QgYnJvYWRjYXN0KS5cbiAqXG4gKiBgYGBqc1xuICogY29uc3QgYSA9IHRmLnRlbnNvcjFkKFsxLCA0LCAzLCAxNl0pO1xuICogY29uc3QgYiA9IHRmLnRlbnNvcjFkKFsxLCAyLCA5LCA0XSk7XG4gKlxuICogYS5taW5pbXVtKGIpLnByaW50KCk7ICAvLyBvciB0Zi5taW5pbXVtKGEsIGIpXG4gKiBgYGBcbiAqXG4gKiBgYGBqc1xuICogLy8gQnJvYWRjYXN0IG1pbmltdW0gYSB3aXRoIGIuXG4gKiBjb25zdCBhID0gdGYudGVuc29yMWQoWzIsIDQsIDYsIDhdKTtcbiAqIGNvbnN0IGIgPSB0Zi5zY2FsYXIoNSk7XG4gKlxuICogYS5taW5pbXVtKGIpLnByaW50KCk7ICAvLyBvciB0Zi5taW5pbXVtKGEsIGIpXG4gKiBgYGBcbiAqXG4gKiBAcGFyYW0gYSBUaGUgZmlyc3QgdGVuc29yLlxuICogQHBhcmFtIGIgVGhlIHNlY29uZCB0ZW5zb3IuIE11c3QgaGF2ZSB0aGUgc2FtZSB0eXBlIGFzIGBhYC5cbiAqXG4gKiBAZG9jIHtoZWFkaW5nOiAnT3BlcmF0aW9ucycsIHN1YmhlYWRpbmc6ICdBcml0aG1ldGljJ31cbiAqL1xuZnVuY3Rpb24gbWluaW11bV88VCBleHRlbmRzIFRlbnNvcj4oXG4gICAgYTogVGVuc29yfFRlbnNvckxpa2UsIGI6IFRlbnNvcnxUZW5zb3JMaWtlKTogVCB7XG4gIGxldCAkYSA9IGNvbnZlcnRUb1RlbnNvcihhLCAnYScsICdtaW5pbXVtJyk7XG4gIGxldCAkYiA9IGNvbnZlcnRUb1RlbnNvcihiLCAnYicsICdtaW5pbXVtJyk7XG4gIFskYSwgJGJdID0gbWFrZVR5cGVzTWF0Y2goJGEsICRiKTtcblxuICBpZiAoJGEuZHR5cGUgPT09ICdib29sJykge1xuICAgICRhID0gY2FzdCgkYSwgJ2ludDMyJyk7XG4gICAgJGIgPSBjYXN0KCRiLCAnaW50MzInKTtcbiAgfVxuXG4gIGFzc2VydEFuZEdldEJyb2FkY2FzdFNoYXBlKCRhLnNoYXBlLCAkYi5zaGFwZSk7XG5cbiAgY29uc3QgaW5wdXRzOiBNaW5pbXVtSW5wdXRzID0ge2E6ICRhLCBiOiAkYn07XG5cbiAgcmV0dXJuIEVOR0lORS5ydW5LZXJuZWwoTWluaW11bSwgaW5wdXRzIGFzIHt9IGFzIE5hbWVkVGVuc29yTWFwKTtcbn1cblxuZXhwb3J0IGNvbnN0IG1pbmltdW0gPSBvcCh7bWluaW11bV99KTtcbiJdfQ==","/**\n * @license\n * Copyright 2020 Google LLC. All Rights Reserved.\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n * =============================================================================\n */\nimport { ENGINE } from '../engine';\nimport { MirrorPad } from '../kernel_names';\nimport { convertToTensor } from '../tensor_util_env';\nimport * as util from '../util';\nimport { op } from './operation';\n/**\n * Pads a `tf.Tensor` using mirror padding.\n *\n * This operation implements the `REFLECT` and `SYMMETRIC` modes of pad.\n *\n * ```js\n * const x = tf.range(0, 9).reshape([1, 1, 3, 3]);\n * x.mirrorPad([[0, 0], [0, 0], [2, 2], [2, 2]], 'reflect').print();\n * ```\n * @param x The tensor to pad.\n * @param paddings An array of length `R` (the rank of the tensor), where\n * each element is a length-2 tuple of ints `[padBefore, padAfter]`,\n * specifying how much to pad along each dimension of the tensor.\n * In \"reflect\" mode, the padded regions do not include the borders,\n * while in \"symmetric\" mode the padded regions do include the borders.\n * For example, if the input is `[1, 2, 3]` and paddings is `[0, 2]`,\n * then the output is `[1, 2, 3, 2, 1]` in \"reflect\" mode, and\n * `[1, 2, 3, 3, 2]` in \"symmetric\" mode.\n * If `mode` is \"reflect\" then both `paddings[D, 0]` and `paddings[D, 1]`\n * must be no greater than `x.shape[D] - 1`. If mode is \"symmetric\"\n * then both `paddings[D, 0]` and `paddings[D, 1]` must be no greater than\n * `x.shape[D]`\n * @param mode String to specify padding mode. Can be `'reflect' | 'symmetric'`\n */\n/** @doc {heading: 'Tensors', subheading: 'Transformations'} */\nfunction mirrorPad_(x, paddings, mode) {\n util.assert(mode === 'reflect' || mode === 'symmetric', () => `Invalid mode. Mode must be either reflect or symmetric. ` +\n `Got ${mode}.`);\n const $x = convertToTensor(x, 'x', 'mirrorPad');\n if ($x.rank === 0) {\n throw new Error('mirrorPad(scalar) is not defined. ' +\n 'Pass non-scalar to mirrorPad');\n }\n util.assert(paddings.length === $x.rank, () => `Padding doesn't match input. Must be ${$x.rank}. ` +\n `Got ${paddings.length}.`);\n const shapeOffset = mode === 'reflect' ? 1 : 0;\n for (let i = 0; i < $x.rank; i++) {\n util.assert(paddings[i].length === 2, () => `Invalid number of paddings. Must be length of 2 each.`);\n util.assert(paddings[i][0] >= 0 && paddings[i][0] <= $x.shape[i] - shapeOffset &&\n paddings[i][1] >= 0 && paddings[i][1] <= $x.shape[i] - shapeOffset, () => `Padding in dimension ${i} cannot be greater than or equal ` +\n `to ${$x.shape[i] - shapeOffset} or less than 0 for input of ` +\n `shape ${$x.shape}`);\n }\n const attrs = { paddings, mode };\n const inputs = { x: $x };\n return ENGINE.runKernel(MirrorPad, inputs, attrs);\n}\nexport const mirrorPad = op({ mirrorPad_ });\n//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibWlycm9yX3BhZC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uLy4uL3RmanMtY29yZS9zcmMvb3BzL21pcnJvcl9wYWQudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUE7Ozs7Ozs7Ozs7Ozs7OztHQWVHO0FBRUgsT0FBTyxFQUFDLE1BQU0sRUFBQyxNQUFNLFdBQVcsQ0FBQztBQUNqQyxPQUFPLEVBQUMsU0FBUyxFQUFrQyxNQUFNLGlCQUFpQixDQUFDO0FBSTNFLE9BQU8sRUFBQyxlQUFlLEVBQUMsTUFBTSxvQkFBb0IsQ0FBQztBQUVuRCxPQUFPLEtBQUssSUFBSSxNQUFNLFNBQVMsQ0FBQztBQUVoQyxPQUFPLEVBQUMsRUFBRSxFQUFDLE1BQU0sYUFBYSxDQUFDO0FBRS9COzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7OztHQXVCRztBQUNILCtEQUErRDtBQUMvRCxTQUFTLFVBQVUsQ0FDZixDQUFlLEVBQUUsUUFBaUMsRUFDbEQsSUFBMkI7SUFDN0IsSUFBSSxDQUFDLE1BQU0sQ0FDUCxJQUFJLEtBQUssU0FBUyxJQUFJLElBQUksS0FBSyxXQUFXLEVBQzFDLEdBQUcsRUFBRSxDQUFDLDBEQUEwRDtRQUM1RCxPQUFPLElBQUksR0FBRyxDQUFDLENBQUM7SUFFeEIsTUFBTSxFQUFFLEdBQUcsZUFBZSxDQUFDLENBQUMsRUFBRSxHQUFHLEVBQUUsV0FBVyxDQUFDLENBQUM7SUFDaEQsSUFBSSxFQUFFLENBQUMsSUFBSSxLQUFLLENBQUMsRUFBRTtRQUNqQixNQUFNLElBQUksS0FBSyxDQUNYLG9DQUFvQztZQUNwQyw4QkFBOEIsQ0FBQyxDQUFDO0tBQ3JDO0lBQ0QsSUFBSSxDQUFDLE1BQU0sQ0FDUCxRQUFRLENBQUMsTUFBTSxLQUFLLEVBQUUsQ0FBQyxJQUFJLEVBQzNCLEdBQUcsRUFBRSxDQUFDLHdDQUF3QyxFQUFFLENBQUMsSUFBSSxJQUFJO1FBQ3JELE9BQU8sUUFBUSxDQUFDLE1BQU0sR0FBRyxDQUFDLENBQUM7SUFDbkMsTUFBTSxXQUFXLEdBQUcsSUFBSSxLQUFLLFNBQVMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUM7SUFDL0MsS0FBSyxJQUFJLENBQUMsR0FBRyxDQUFDLEVBQUUsQ0FBQyxHQUFHLEVBQUUsQ0FBQyxJQUFJLEVBQUUsQ0FBQyxFQUFFLEVBQUU7UUFDaEMsSUFBSSxDQUFDLE1BQU0sQ0FDUCxRQUFRLENBQUMsQ0FBQyxDQUFDLENBQUMsTUFBTSxLQUFLLENBQUMsRUFDeEIsR0FBRyxFQUFFLENBQUMsdURBQXVELENBQUMsQ0FBQztRQUNuRSxJQUFJLENBQUMsTUFBTSxDQUNQLFFBQVEsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLElBQUksUUFBUSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLEVBQUUsQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDLEdBQUcsV0FBVztZQUM5RCxRQUFRLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxJQUFJLFFBQVEsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxFQUFFLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQyxHQUFHLFdBQVcsRUFDdEUsR0FBRyxFQUFFLENBQUMsd0JBQXdCLENBQUMsbUNBQW1DO1lBQzlELE1BQU0sRUFBRSxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUMsR0FBRyxXQUFXLCtCQUErQjtZQUM5RCxTQUFTLEVBQUUsQ0FBQyxLQUFLLEVBQUUsQ0FBQyxDQUFDO0tBQzlCO0lBRUQsTUFBTSxLQUFLLEdBQW1CLEVBQUMsUUFBUSxFQUFFLElBQUksRUFBQyxDQUFDO0lBQy9DLE1BQU0sTUFBTSxHQUFvQixFQUFDLENBQUMsRUFBRSxFQUFFLEVBQUMsQ0FBQztJQUN4QyxPQUFPLE1BQU0sQ0FBQyxTQUFTLENBQ25CLFNBQVMsRUFBRSxNQUE4QixFQUFFLEtBQTJCLENBQUMsQ0FBQztBQUM5RSxDQUFDO0FBRUQsTUFBTSxDQUFDLE1BQU0sU0FBUyxHQUFHLEVBQUUsQ0FBQyxFQUFDLFVBQVUsRUFBQyxDQUFDLENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyIvKipcbiAqIEBsaWNlbnNlXG4gKiBDb3B5cmlnaHQgMjAyMCBHb29nbGUgTExDLiBBbGwgUmlnaHRzIFJlc2VydmVkLlxuICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlIFwiTGljZW5zZVwiKTtcbiAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS5cbiAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdFxuICpcbiAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMFxuICpcbiAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmVcbiAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuIFwiQVMgSVNcIiBCQVNJUyxcbiAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLlxuICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZFxuICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuXG4gKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuICovXG5cbmltcG9ydCB7RU5HSU5FfSBmcm9tICcuLi9lbmdpbmUnO1xuaW1wb3J0IHtNaXJyb3JQYWQsIE1pcnJvclBhZEF0dHJzLCBNaXJyb3JQYWRJbnB1dHN9IGZyb20gJy4uL2tlcm5lbF9uYW1lcyc7XG5pbXBvcnQge05hbWVkQXR0ck1hcH0gZnJvbSAnLi4va2VybmVsX3JlZ2lzdHJ5JztcbmltcG9ydCB7VGVuc29yfSBmcm9tICcuLi90ZW5zb3InO1xuaW1wb3J0IHtOYW1lZFRlbnNvck1hcH0gZnJvbSAnLi4vdGVuc29yX3R5cGVzJztcbmltcG9ydCB7Y29udmVydFRvVGVuc29yfSBmcm9tICcuLi90ZW5zb3JfdXRpbF9lbnYnO1xuaW1wb3J0IHtUZW5zb3JMaWtlfSBmcm9tICcuLi90eXBlcyc7XG5pbXBvcnQgKiBhcyB1dGlsIGZyb20gJy4uL3V0aWwnO1xuXG5pbXBvcnQge29wfSBmcm9tICcuL29wZXJhdGlvbic7XG5cbi8qKlxuICogUGFkcyBhIGB0Zi5UZW5zb3JgIHVzaW5nIG1pcnJvciBwYWRkaW5nLlxuICpcbiAqIFRoaXMgb3BlcmF0aW9uIGltcGxlbWVudHMgdGhlIGBSRUZMRUNUYCBhbmQgYFNZTU1FVFJJQ2AgbW9kZXMgb2YgcGFkLlxuICpcbiAqIGBgYGpzXG4gKiBjb25zdCB4ID0gdGYucmFuZ2UoMCwgOSkucmVzaGFwZShbMSwgMSwgMywgM10pO1xuICogeC5taXJyb3JQYWQoW1swLCAwXSwgWzAsIDBdLCBbMiwgMl0sIFsyLCAyXV0sICdyZWZsZWN0JykucHJpbnQoKTtcbiAqIGBgYFxuICogQHBhcmFtIHggVGhlIHRlbnNvciB0byBwYWQuXG4gKiBAcGFyYW0gcGFkZGluZ3MgQW4gYXJyYXkgb2YgbGVuZ3RoIGBSYCAodGhlIHJhbmsgb2YgdGhlIHRlbnNvciksIHdoZXJlXG4gKiBlYWNoIGVsZW1lbnQgaXMgYSBsZW5ndGgtMiB0dXBsZSBvZiBpbnRzIGBbcGFkQmVmb3JlLCBwYWRBZnRlcl1gLFxuICogc3BlY2lmeWluZyBob3cgbXVjaCB0byBwYWQgYWxvbmcgZWFjaCBkaW1lbnNpb24gb2YgdGhlIHRlbnNvci5cbiAqIEluIFwicmVmbGVjdFwiIG1vZGUsIHRoZSBwYWRkZWQgcmVnaW9ucyBkbyBub3QgaW5jbHVkZSB0aGUgYm9yZGVycyxcbiAqIHdoaWxlIGluIFwic3ltbWV0cmljXCIgbW9kZSB0aGUgcGFkZGVkIHJlZ2lvbnMgZG8gaW5jbHVkZSB0aGUgYm9yZGVycy5cbiAqIEZvciBleGFtcGxlLCBpZiB0aGUgaW5wdXQgaXMgYFsxLCAyLCAzXWAgYW5kIHBhZGRpbmdzIGlzIGBbMCwgMl1gLFxuICogdGhlbiB0aGUgb3V0cHV0IGlzIGBbMSwgMiwgMywgMiwgMV1gIGluIFwicmVmbGVjdFwiIG1vZGUsIGFuZFxuICogYFsxLCAyLCAzLCAzLCAyXWAgaW4gXCJzeW1tZXRyaWNcIiBtb2RlLlxuICogSWYgYG1vZGVgIGlzIFwicmVmbGVjdFwiIHRoZW4gYm90aCBgcGFkZGluZ3NbRCwgMF1gIGFuZCBgcGFkZGluZ3NbRCwgMV1gXG4gKiBtdXN0IGJlIG5vIGdyZWF0ZXIgdGhhbiBgeC5zaGFwZVtEXSAtIDFgLiBJZiBtb2RlIGlzIFwic3ltbWV0cmljXCJcbiAqIHRoZW4gYm90aCBgcGFkZGluZ3NbRCwgMF1gIGFuZCBgcGFkZGluZ3NbRCwgMV1gIG11c3QgYmUgbm8gZ3JlYXRlciB0aGFuXG4gKiBgeC5zaGFwZVtEXWBcbiAqIEBwYXJhbSBtb2RlIFN0cmluZyB0byBzcGVjaWZ5IHBhZGRpbmcgbW9kZS4gQ2FuIGJlIGAncmVmbGVjdCcgfCAnc3ltbWV0cmljJ2BcbiAqL1xuLyoqIEBkb2Mge2hlYWRpbmc6ICdUZW5zb3JzJywgc3ViaGVhZGluZzogJ1RyYW5zZm9ybWF0aW9ucyd9ICovXG5mdW5jdGlvbiBtaXJyb3JQYWRfPFQgZXh0ZW5kcyBUZW5zb3I+KFxuICAgIHg6IFR8VGVuc29yTGlrZSwgcGFkZGluZ3M6IEFycmF5PFtudW1iZXIsIG51bWJlcl0+LFxuICAgIG1vZGU6ICdyZWZsZWN0J3wnc3ltbWV0cmljJyk6IFQge1xuICB1dGlsLmFzc2VydChcbiAgICAgIG1vZGUgPT09ICdyZWZsZWN0JyB8fCBtb2RlID09PSAnc3ltbWV0cmljJyxcbiAgICAgICgpID0+IGBJbnZhbGlkIG1vZGUuIE1vZGUgbXVzdCBiZSBlaXRoZXIgcmVmbGVjdCBvciBzeW1tZXRyaWMuIGAgK1xuICAgICAgICAgIGBHb3QgJHttb2RlfS5gKTtcblxuICBjb25zdCAkeCA9IGNvbnZlcnRUb1RlbnNvcih4LCAneCcsICdtaXJyb3JQYWQnKTtcbiAgaWYgKCR4LnJhbmsgPT09IDApIHtcbiAgICB0aHJvdyBuZXcgRXJyb3IoXG4gICAgICAgICdtaXJyb3JQYWQoc2NhbGFyKSBpcyBub3QgZGVmaW5lZC4gJyArXG4gICAgICAgICdQYXNzIG5vbi1zY2FsYXIgdG8gbWlycm9yUGFkJyk7XG4gIH1cbiAgdXRpbC5hc3NlcnQoXG4gICAgICBwYWRkaW5ncy5sZW5ndGggPT09ICR4LnJhbmssXG4gICAgICAoKSA9PiBgUGFkZGluZyBkb2Vzbid0IG1hdGNoIGlucHV0LiBNdXN0IGJlICR7JHgucmFua30uIGAgK1xuICAgICAgICAgIGBHb3QgJHtwYWRkaW5ncy5sZW5ndGh9LmApO1xuICBjb25zdCBzaGFwZU9mZnNldCA9IG1vZGUgPT09ICdyZWZsZWN0JyA/IDEgOiAwO1xuICBmb3IgKGxldCBpID0gMDsgaSA8ICR4LnJhbms7IGkrKykge1xuICAgIHV0aWwuYXNzZXJ0KFxuICAgICAgICBwYWRkaW5nc1tpXS5sZW5ndGggPT09IDIsXG4gICAgICAgICgpID0+IGBJbnZhbGlkIG51bWJlciBvZiBwYWRkaW5ncy4gTXVzdCBiZSBsZW5ndGggb2YgMiBlYWNoLmApO1xuICAgIHV0aWwuYXNzZXJ0KFxuICAgICAgICBwYWRkaW5nc1tpXVswXSA+PSAwICYmIHBhZGRpbmdzW2ldWzBdIDw9ICR4LnNoYXBlW2ldIC0gc2hhcGVPZmZzZXQgJiZcbiAgICAgICAgICAgIHBhZGRpbmdzW2ldWzFdID49IDAgJiYgcGFkZGluZ3NbaV1bMV0gPD0gJHguc2hhcGVbaV0gLSBzaGFwZU9mZnNldCxcbiAgICAgICAgKCkgPT4gYFBhZGRpbmcgaW4gZGltZW5zaW9uICR7aX0gY2Fubm90IGJlIGdyZWF0ZXIgdGhhbiBvciBlcXVhbCBgICtcbiAgICAgICAgICAgIGB0byAkeyR4LnNoYXBlW2ldIC0gc2hhcGVPZmZzZXR9IG9yIGxlc3MgdGhhbiAwIGZvciBpbnB1dCBvZiBgICtcbiAgICAgICAgICAgIGBzaGFwZSAkeyR4LnNoYXBlfWApO1xuICB9XG5cbiAgY29uc3QgYXR0cnM6IE1pcnJvclBhZEF0dHJzID0ge3BhZGRpbmdzLCBtb2RlfTtcbiAgY29uc3QgaW5wdXRzOiBNaXJyb3JQYWRJbnB1dHMgPSB7eDogJHh9O1xuICByZXR1cm4gRU5HSU5FLnJ1bktlcm5lbChcbiAgICAgIE1pcnJvclBhZCwgaW5wdXRzIGFzIHt9IGFzIE5hbWVkVGVuc29yTWFwLCBhdHRycyBhcyB7fSBhcyBOYW1lZEF0dHJNYXApO1xufVxuXG5leHBvcnQgY29uc3QgbWlycm9yUGFkID0gb3Aoe21pcnJvclBhZF99KTtcbiJdfQ==","/**\n * @license\n * Copyright 2020 Google LLC. All Rights Reserved.\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n * =============================================================================\n */\nimport { ENGINE } from '../engine';\nimport { Mod } from '../kernel_names';\nimport { makeTypesMatch } from '../tensor_util';\nimport { convertToTensor } from '../tensor_util_env';\nimport { op } from './operation';\n/**\n * Returns the mod of a and b element-wise.\n * `floor(x / y) * y + mod(x, y) = x`\n * Supports broadcasting.\n *\n * We also expose `tf.modStrict` which has the same signature as this op and\n * asserts that `a` and `b` are the same shape (does not broadcast).\n *\n * ```js\n * const a = tf.tensor1d([1, 4, 3, 16]);\n * const b = tf.tensor1d([1, 2, 9, 4]);\n *\n * a.mod(b).print(); // or tf.mod(a, b)\n * ```\n *\n * ```js\n * // Broadcast a mod b.\n * const a = tf.tensor1d([2, 4, 6, 8]);\n * const b = tf.scalar(5);\n *\n * a.mod(b).print(); // or tf.mod(a, b)\n * ```\n *\n * @param a The first tensor.\n * @param b The second tensor. Must have the same type as `a`.\n *\n * @doc {heading: 'Operations', subheading: 'Arithmetic'}\n */\nfunction mod_(a, b) {\n let $a = convertToTensor(a, 'a', 'mod');\n let $b = convertToTensor(b, 'b', 'mod');\n [$a, $b] = makeTypesMatch($a, $b);\n const inputs = { a: $a, b: $b };\n return ENGINE.runKernel(Mod, inputs);\n}\nexport const mod = op({ mod_ });\n//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibW9kLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vLi4vdGZqcy1jb3JlL3NyYy9vcHMvbW9kLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBOzs7Ozs7Ozs7Ozs7Ozs7R0FlRztBQUVILE9BQU8sRUFBQyxNQUFNLEVBQUMsTUFBTSxXQUFXLENBQUM7QUFDakMsT0FBTyxFQUFDLEdBQUcsRUFBWSxNQUFNLGlCQUFpQixDQUFDO0FBRy9DLE9BQU8sRUFBQyxjQUFjLEVBQUMsTUFBTSxnQkFBZ0IsQ0FBQztBQUM5QyxPQUFPLEVBQUMsZUFBZSxFQUFDLE1BQU0sb0JBQW9CLENBQUM7QUFHbkQsT0FBTyxFQUFDLEVBQUUsRUFBQyxNQUFNLGFBQWEsQ0FBQztBQUUvQjs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7O0dBMkJHO0FBQ0gsU0FBUyxJQUFJLENBQW1CLENBQW9CLEVBQUUsQ0FBb0I7SUFDeEUsSUFBSSxFQUFFLEdBQUcsZUFBZSxDQUFDLENBQUMsRUFBRSxHQUFHLEVBQUUsS0FBSyxDQUFDLENBQUM7SUFDeEMsSUFBSSxFQUFFLEdBQUcsZUFBZSxDQUFDLENBQUMsRUFBRSxHQUFHLEVBQUUsS0FBSyxDQUFDLENBQUM7SUFDeEMsQ0FBQyxFQUFFLEVBQUUsRUFBRSxDQUFDLEdBQUcsY0FBYyxDQUFDLEVBQUUsRUFBRSxFQUFFLENBQUMsQ0FBQztJQUVsQyxNQUFNLE1BQU0sR0FBYyxFQUFDLENBQUMsRUFBRSxFQUFFLEVBQUUsQ0FBQyxFQUFFLEVBQUUsRUFBQyxDQUFDO0lBRXpDLE9BQU8sTUFBTSxDQUFDLFNBQVMsQ0FBQyxHQUFHLEVBQUUsTUFBOEIsQ0FBQyxDQUFDO0FBQy9ELENBQUM7QUFFRCxNQUFNLENBQUMsTUFBTSxHQUFHLEdBQUcsRUFBRSxDQUFDLEVBQUMsSUFBSSxFQUFDLENBQUMsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbIi8qKlxuICogQGxpY2Vuc2VcbiAqIENvcHlyaWdodCAyMDIwIEdvb2dsZSBMTEMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuXG4gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgXCJMaWNlbnNlXCIpO1xuICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLlxuICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0XG4gKlxuICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wXG4gKlxuICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZVxuICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gXCJBUyBJU1wiIEJBU0lTLFxuICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuXG4gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kXG4gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS5cbiAqID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4gKi9cblxuaW1wb3J0IHtFTkdJTkV9IGZyb20gJy4uL2VuZ2luZSc7XG5pbXBvcnQge01vZCwgTW9kSW5wdXRzfSBmcm9tICcuLi9rZXJuZWxfbmFtZXMnO1xuaW1wb3J0IHtUZW5zb3J9IGZyb20gJy4uL3RlbnNvcic7XG5pbXBvcnQge05hbWVkVGVuc29yTWFwfSBmcm9tICcuLi90ZW5zb3JfdHlwZXMnO1xuaW1wb3J0IHttYWtlVHlwZXNNYXRjaH0gZnJvbSAnLi4vdGVuc29yX3V0aWwnO1xuaW1wb3J0IHtjb252ZXJ0VG9UZW5zb3J9IGZyb20gJy4uL3RlbnNvcl91dGlsX2Vudic7XG5pbXBvcnQge1RlbnNvckxpa2V9IGZyb20gJy4uL3R5cGVzJztcblxuaW1wb3J0IHtvcH0gZnJvbSAnLi9vcGVyYXRpb24nO1xuXG4vKipcbiAqIFJldHVybnMgdGhlIG1vZCBvZiBhIGFuZCBiIGVsZW1lbnQtd2lzZS5cbiAqIGBmbG9vcih4IC8geSkgKiB5ICsgbW9kKHgsIHkpID0geGBcbiAqIFN1cHBvcnRzIGJyb2FkY2FzdGluZy5cbiAqXG4gKiBXZSBhbHNvIGV4cG9zZSBgdGYubW9kU3RyaWN0YCB3aGljaCBoYXMgdGhlIHNhbWUgc2lnbmF0dXJlIGFzIHRoaXMgb3AgYW5kXG4gKiBhc3NlcnRzIHRoYXQgYGFgIGFuZCBgYmAgYXJlIHRoZSBzYW1lIHNoYXBlIChkb2VzIG5vdCBicm9hZGNhc3QpLlxuICpcbiAqIGBgYGpzXG4gKiBjb25zdCBhID0gdGYudGVuc29yMWQoWzEsIDQsIDMsIDE2XSk7XG4gKiBjb25zdCBiID0gdGYudGVuc29yMWQoWzEsIDIsIDksIDRdKTtcbiAqXG4gKiBhLm1vZChiKS5wcmludCgpOyAgLy8gb3IgdGYubW9kKGEsIGIpXG4gKiBgYGBcbiAqXG4gKiBgYGBqc1xuICogLy8gQnJvYWRjYXN0IGEgbW9kIGIuXG4gKiBjb25zdCBhID0gdGYudGVuc29yMWQoWzIsIDQsIDYsIDhdKTtcbiAqIGNvbnN0IGIgPSB0Zi5zY2FsYXIoNSk7XG4gKlxuICogYS5tb2QoYikucHJpbnQoKTsgIC8vIG9yIHRmLm1vZChhLCBiKVxuICogYGBgXG4gKlxuICogQHBhcmFtIGEgVGhlIGZpcnN0IHRlbnNvci5cbiAqIEBwYXJhbSBiIFRoZSBzZWNvbmQgdGVuc29yLiBNdXN0IGhhdmUgdGhlIHNhbWUgdHlwZSBhcyBgYWAuXG4gKlxuICogQGRvYyB7aGVhZGluZzogJ09wZXJhdGlvbnMnLCBzdWJoZWFkaW5nOiAnQXJpdGhtZXRpYyd9XG4gKi9cbmZ1bmN0aW9uIG1vZF88VCBleHRlbmRzIFRlbnNvcj4oYTogVGVuc29yfFRlbnNvckxpa2UsIGI6IFRlbnNvcnxUZW5zb3JMaWtlKTogVCB7XG4gIGxldCAkYSA9IGNvbnZlcnRUb1RlbnNvcihhLCAnYScsICdtb2QnKTtcbiAgbGV0ICRiID0gY29udmVydFRvVGVuc29yKGIsICdiJywgJ21vZCcpO1xuICBbJGEsICRiXSA9IG1ha2VUeXBlc01hdGNoKCRhLCAkYik7XG5cbiAgY29uc3QgaW5wdXRzOiBNb2RJbnB1dHMgPSB7YTogJGEsIGI6ICRifTtcblxuICByZXR1cm4gRU5HSU5FLnJ1bktlcm5lbChNb2QsIGlucHV0cyBhcyB7fSBhcyBOYW1lZFRlbnNvck1hcCk7XG59XG5cbmV4cG9ydCBjb25zdCBtb2QgPSBvcCh7bW9kX30pO1xuIl19","/**\n * @license\n * Copyright 2020 Google LLC. All Rights Reserved.\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n * =============================================================================\n */\nimport { ENGINE } from '../engine';\nimport { Multiply } from '../kernel_names';\nimport { makeTypesMatch } from '../tensor_util';\nimport { convertToTensor } from '../tensor_util_env';\nimport { op } from './operation';\n/**\n * Multiplies two `tf.Tensor`s element-wise, A * B. Supports broadcasting.\n *\n * We also expose `tf.mulStrict` which has the same signature as this op and\n * asserts that `a` and `b` are the same shape (does not broadcast).\n *\n * ```js\n * const a = tf.tensor1d([1, 2, 3, 4]);\n * const b = tf.tensor1d([2, 3, 4, 5]);\n *\n * a.mul(b).print(); // or tf.mul(a, b)\n * ```\n *\n * ```js\n * // Broadcast mul a with b.\n * const a = tf.tensor1d([1, 2, 3, 4]);\n * const b = tf.scalar(5);\n *\n * a.mul(b).print(); // or tf.mul(a, b)\n * ```\n * @param a The first tensor to multiply.\n * @param b The second tensor to multiply. Must have the same dtype as `a`.\n *\n * @doc {heading: 'Operations', subheading: 'Arithmetic'}\n */\nfunction mul_(a, b) {\n let $a = convertToTensor(a, 'a', 'mul');\n let $b = convertToTensor(b, 'b', 'mul');\n [$a, $b] = makeTypesMatch($a, $b);\n const inputs = { a: $a, b: $b };\n return ENGINE.runKernel(Multiply, inputs);\n}\nexport const mul = op({ mul_ });\n//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibXVsLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vLi4vdGZqcy1jb3JlL3NyYy9vcHMvbXVsLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBOzs7Ozs7Ozs7Ozs7Ozs7R0FlRztBQUVILE9BQU8sRUFBQyxNQUFNLEVBQUMsTUFBTSxXQUFXLENBQUM7QUFDakMsT0FBTyxFQUFDLFFBQVEsRUFBaUIsTUFBTSxpQkFBaUIsQ0FBQztBQUd6RCxPQUFPLEVBQUMsY0FBYyxFQUFDLE1BQU0sZ0JBQWdCLENBQUM7QUFDOUMsT0FBTyxFQUFDLGVBQWUsRUFBQyxNQUFNLG9CQUFvQixDQUFDO0FBR25ELE9BQU8sRUFBQyxFQUFFLEVBQUMsTUFBTSxhQUFhLENBQUM7QUFFL0I7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7OztHQXdCRztBQUNILFNBQVMsSUFBSSxDQUFtQixDQUFvQixFQUFFLENBQW9CO0lBQ3hFLElBQUksRUFBRSxHQUFHLGVBQWUsQ0FBQyxDQUFDLEVBQUUsR0FBRyxFQUFFLEtBQUssQ0FBQyxDQUFDO0lBQ3hDLElBQUksRUFBRSxHQUFHLGVBQWUsQ0FBQyxDQUFDLEVBQUUsR0FBRyxFQUFFLEtBQUssQ0FBQyxDQUFDO0lBQ3hDLENBQUMsRUFBRSxFQUFFLEVBQUUsQ0FBQyxHQUFHLGNBQWMsQ0FBQyxFQUFFLEVBQUUsRUFBRSxDQUFDLENBQUM7SUFFbEMsTUFBTSxNQUFNLEdBQW1CLEVBQUMsQ0FBQyxFQUFFLEVBQUUsRUFBRSxDQUFDLEVBQUUsRUFBRSxFQUFDLENBQUM7SUFFOUMsT0FBTyxNQUFNLENBQUMsU0FBUyxDQUFDLFFBQVEsRUFBRSxNQUE4QixDQUFDLENBQUM7QUFDcEUsQ0FBQztBQUNELE1BQU0sQ0FBQyxNQUFNLEdBQUcsR0FBRyxFQUFFLENBQUMsRUFBQyxJQUFJLEVBQUMsQ0FBQyxDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiLyoqXG4gKiBAbGljZW5zZVxuICogQ29weXJpZ2h0IDIwMjAgR29vZ2xlIExMQy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC5cbiAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSBcIkxpY2Vuc2VcIik7XG4gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuXG4gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXRcbiAqXG4gKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjBcbiAqXG4gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlXG4gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiBcIkFTIElTXCIgQkFTSVMsXG4gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC5cbiAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmRcbiAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLlxuICogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbiAqL1xuXG5pbXBvcnQge0VOR0lORX0gZnJvbSAnLi4vZW5naW5lJztcbmltcG9ydCB7TXVsdGlwbHksIE11bHRpcGx5SW5wdXRzfSBmcm9tICcuLi9rZXJuZWxfbmFtZXMnO1xuaW1wb3J0IHtUZW5zb3J9IGZyb20gJy4uL3RlbnNvcic7XG5pbXBvcnQge05hbWVkVGVuc29yTWFwfSBmcm9tICcuLi90ZW5zb3JfdHlwZXMnO1xuaW1wb3J0IHttYWtlVHlwZXNNYXRjaH0gZnJvbSAnLi4vdGVuc29yX3V0aWwnO1xuaW1wb3J0IHtjb252ZXJ0VG9UZW5zb3J9IGZyb20gJy4uL3RlbnNvcl91dGlsX2Vudic7XG5pbXBvcnQge1RlbnNvckxpa2V9IGZyb20gJy4uL3R5cGVzJztcblxuaW1wb3J0IHtvcH0gZnJvbSAnLi9vcGVyYXRpb24nO1xuXG4vKipcbiAqIE11bHRpcGxpZXMgdHdvIGB0Zi5UZW5zb3JgcyBlbGVtZW50LXdpc2UsIEEgKiBCLiBTdXBwb3J0cyBicm9hZGNhc3RpbmcuXG4gKlxuICogV2UgYWxzbyBleHBvc2UgYHRmLm11bFN0cmljdGAgd2hpY2ggaGFzIHRoZSBzYW1lIHNpZ25hdHVyZSBhcyB0aGlzIG9wIGFuZFxuICogYXNzZXJ0cyB0aGF0IGBhYCBhbmQgYGJgIGFyZSB0aGUgc2FtZSBzaGFwZSAoZG9lcyBub3QgYnJvYWRjYXN0KS5cbiAqXG4gKiBgYGBqc1xuICogY29uc3QgYSA9IHRmLnRlbnNvcjFkKFsxLCAyLCAzLCA0XSk7XG4gKiBjb25zdCBiID0gdGYudGVuc29yMWQoWzIsIDMsIDQsIDVdKTtcbiAqXG4gKiBhLm11bChiKS5wcmludCgpOyAgLy8gb3IgdGYubXVsKGEsIGIpXG4gKiBgYGBcbiAqXG4gKiBgYGBqc1xuICogLy8gQnJvYWRjYXN0IG11bCBhIHdpdGggYi5cbiAqIGNvbnN0IGEgPSB0Zi50ZW5zb3IxZChbMSwgMiwgMywgNF0pO1xuICogY29uc3QgYiA9IHRmLnNjYWxhcig1KTtcbiAqXG4gKiBhLm11bChiKS5wcmludCgpOyAgLy8gb3IgdGYubXVsKGEsIGIpXG4gKiBgYGBcbiAqIEBwYXJhbSBhIFRoZSBmaXJzdCB0ZW5zb3IgdG8gbXVsdGlwbHkuXG4gKiBAcGFyYW0gYiBUaGUgc2Vjb25kIHRlbnNvciB0byBtdWx0aXBseS4gTXVzdCBoYXZlIHRoZSBzYW1lIGR0eXBlIGFzIGBhYC5cbiAqXG4gKiBAZG9jIHtoZWFkaW5nOiAnT3BlcmF0aW9ucycsIHN1YmhlYWRpbmc6ICdBcml0aG1ldGljJ31cbiAqL1xuZnVuY3Rpb24gbXVsXzxUIGV4dGVuZHMgVGVuc29yPihhOiBUZW5zb3J8VGVuc29yTGlrZSwgYjogVGVuc29yfFRlbnNvckxpa2UpOiBUIHtcbiAgbGV0ICRhID0gY29udmVydFRvVGVuc29yKGEsICdhJywgJ211bCcpO1xuICBsZXQgJGIgPSBjb252ZXJ0VG9UZW5zb3IoYiwgJ2InLCAnbXVsJyk7XG4gIFskYSwgJGJdID0gbWFrZVR5cGVzTWF0Y2goJGEsICRiKTtcblxuICBjb25zdCBpbnB1dHM6IE11bHRpcGx5SW5wdXRzID0ge2E6ICRhLCBiOiAkYn07XG5cbiAgcmV0dXJuIEVOR0lORS5ydW5LZXJuZWwoTXVsdGlwbHksIGlucHV0cyBhcyB7fSBhcyBOYW1lZFRlbnNvck1hcCk7XG59XG5leHBvcnQgY29uc3QgbXVsID0gb3Aoe211bF99KTtcbiJdfQ==","/**\n * @license\n * Copyright 2018 Google LLC. All Rights Reserved.\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n * =============================================================================\n */\nimport { ENGINE } from '../engine';\nimport { Neg } from '../kernel_names';\nimport { convertToTensor } from '../tensor_util_env';\nimport { op } from './operation';\n/**\n * Computes `-1 * x` element-wise.\n *\n * ```js\n * const x = tf.tensor2d([1, 2, -2, 0], [2, 2]);\n *\n * x.neg().print(); // or tf.neg(x)\n * ```\n *\n * @param x The input tensor.\n *\n * @doc {heading: 'Operations', subheading: 'Basic math'}\n */\nfunction neg_(x) {\n const $x = convertToTensor(x, 'x', 'neg');\n const inputs = { x: $x };\n return ENGINE.runKernel(Neg, inputs);\n}\nexport const neg = op({ neg_ });\n//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibmVnLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vLi4vdGZqcy1jb3JlL3NyYy9vcHMvbmVnLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBOzs7Ozs7Ozs7Ozs7Ozs7R0FlRztBQUVILE9BQU8sRUFBQyxNQUFNLEVBQUMsTUFBTSxXQUFXLENBQUM7QUFDakMsT0FBTyxFQUFDLEdBQUcsRUFBWSxNQUFNLGlCQUFpQixDQUFDO0FBRy9DLE9BQU8sRUFBQyxlQUFlLEVBQUMsTUFBTSxvQkFBb0IsQ0FBQztBQUduRCxPQUFPLEVBQUMsRUFBRSxFQUFDLE1BQU0sYUFBYSxDQUFDO0FBRS9COzs7Ozs7Ozs7Ozs7R0FZRztBQUNILFNBQVMsSUFBSSxDQUFtQixDQUFlO0lBQzdDLE1BQU0sRUFBRSxHQUFHLGVBQWUsQ0FBQyxDQUFDLEVBQUUsR0FBRyxFQUFFLEtBQUssQ0FBQyxDQUFDO0lBRTFDLE1BQU0sTUFBTSxHQUFjLEVBQUMsQ0FBQyxFQUFFLEVBQUUsRUFBQyxDQUFDO0lBQ2xDLE9BQU8sTUFBTSxDQUFDLFNBQVMsQ0FBQyxHQUFHLEVBQUUsTUFBOEIsQ0FBQyxDQUFDO0FBQy9ELENBQUM7QUFDRCxNQUFNLENBQUMsTUFBTSxHQUFHLEdBQUcsRUFBRSxDQUFDLEVBQUMsSUFBSSxFQUFDLENBQUMsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbIi8qKlxuICogQGxpY2Vuc2VcbiAqIENvcHlyaWdodCAyMDE4IEdvb2dsZSBMTEMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuXG4gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgXCJMaWNlbnNlXCIpO1xuICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLlxuICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0XG4gKlxuICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wXG4gKlxuICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZVxuICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gXCJBUyBJU1wiIEJBU0lTLFxuICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuXG4gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kXG4gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS5cbiAqID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4gKi9cblxuaW1wb3J0IHtFTkdJTkV9IGZyb20gJy4uL2VuZ2luZSc7XG5pbXBvcnQge05lZywgTmVnSW5wdXRzfSBmcm9tICcuLi9rZXJuZWxfbmFtZXMnO1xuaW1wb3J0IHtUZW5zb3J9IGZyb20gJy4uL3RlbnNvcic7XG5pbXBvcnQge05hbWVkVGVuc29yTWFwfSBmcm9tICcuLi90ZW5zb3JfdHlwZXMnO1xuaW1wb3J0IHtjb252ZXJ0VG9UZW5zb3J9IGZyb20gJy4uL3RlbnNvcl91dGlsX2Vudic7XG5pbXBvcnQge1RlbnNvckxpa2V9IGZyb20gJy4uL3R5cGVzJztcblxuaW1wb3J0IHtvcH0gZnJvbSAnLi9vcGVyYXRpb24nO1xuXG4vKipcbiAqIENvbXB1dGVzIGAtMSAqIHhgIGVsZW1lbnQtd2lzZS5cbiAqXG4gKiBgYGBqc1xuICogY29uc3QgeCA9IHRmLnRlbnNvcjJkKFsxLCAyLCAtMiwgMF0sIFsyLCAyXSk7XG4gKlxuICogeC5uZWcoKS5wcmludCgpOyAgLy8gb3IgdGYubmVnKHgpXG4gKiBgYGBcbiAqXG4gKiBAcGFyYW0geCBUaGUgaW5wdXQgdGVuc29yLlxuICpcbiAqIEBkb2Mge2hlYWRpbmc6ICdPcGVyYXRpb25zJywgc3ViaGVhZGluZzogJ0Jhc2ljIG1hdGgnfVxuICovXG5mdW5jdGlvbiBuZWdfPFQgZXh0ZW5kcyBUZW5zb3I+KHg6IFR8VGVuc29yTGlrZSk6IFQge1xuICBjb25zdCAkeCA9IGNvbnZlcnRUb1RlbnNvcih4LCAneCcsICduZWcnKTtcblxuICBjb25zdCBpbnB1dHM6IE5lZ0lucHV0cyA9IHt4OiAkeH07XG4gIHJldHVybiBFTkdJTkUucnVuS2VybmVsKE5lZywgaW5wdXRzIGFzIHt9IGFzIE5hbWVkVGVuc29yTWFwKTtcbn1cbmV4cG9ydCBjb25zdCBuZWcgPSBvcCh7bmVnX30pO1xuIl19","/**\n * @license\n * Copyright 2018 Google LLC. All Rights Reserved.\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n * =============================================================================\n */\nimport { convertToTensor } from '../tensor_util_env';\nimport { parseAxisParam } from '../util';\nimport { abs } from './abs';\nimport * as axis_util from './axis_util';\nimport { max } from './max';\nimport { min } from './min';\nimport { op } from './operation';\nimport { pow } from './pow';\nimport { reshape } from './reshape';\nimport { scalar } from './scalar';\nimport { sqrt } from './sqrt';\nimport { square } from './square';\nimport { sum } from './sum';\n/**\n * Computes the norm of scalar, vectors, and matrices.\n * This function can compute several different vector norms (the 1-norm, the\n * Euclidean or 2-norm, the inf-norm, and in general the p-norm for p > 0)\n * and matrix norms (Frobenius, 1-norm, and inf-norm).\n *\n * ```js\n * const x = tf.tensor1d([1, 2, 3, 4]);\n *\n * x.norm().print(); // or tf.norm(x)\n * ```\n *\n * @param x The input array.\n * @param ord Optional. Order of the norm. Supported norm types are\n * following:\n *\n * | ord | norm for matrices | norm for vectors\n * |------------|---------------------------|---------------------\n * |'euclidean' |Frobenius norm |2-norm\n * |'fro' |Frobenius norm\t |\n * |Infinity |max(sum(abs(x), axis=1)) |max(abs(x))\n * |-Infinity |min(sum(abs(x), axis=1)) |min(abs(x))\n * |1 |max(sum(abs(x), axis=0)) |sum(abs(x))\n * |2 | |sum(abs(x)^2)^(1/2)\n *\n * @param axis Optional. If axis is null (the default), the input is\n * considered a vector and a single vector norm is computed over the entire\n * set of values in the Tensor, i.e. norm(x, ord) is equivalent\n * to norm(x.reshape([-1]), ord). If axis is an integer, the input\n * is considered a batch of vectors, and axis determines the axis in x\n * over which to compute vector norms. If axis is a 2-tuple of integer it is\n * considered a batch of matrices and axis determines the axes in NDArray\n * over which to compute a matrix norm.\n * @param keepDims Optional. If true, the norm has the same dimensionality\n * as the input.\n *\n * @doc {heading: 'Operations', subheading: 'Matrices'}\n */\nfunction norm_(x, ord = 'euclidean', axis = null, keepDims = false) {\n x = convertToTensor(x, 'x', 'norm');\n const norm = normImpl(x, ord, axis);\n let keepDimsShape = norm.shape;\n if (keepDims) {\n const axes = parseAxisParam(axis, x.shape);\n keepDimsShape = axis_util.expandShapeToKeepDim(norm.shape, axes);\n }\n return reshape(norm, keepDimsShape);\n}\nfunction normImpl(x, p, axis = null) {\n if (x.rank === 0) {\n return abs(x);\n }\n // consider vector when no axis is specified\n if (x.rank !== 1 && axis === null) {\n return normImpl(reshape(x, [-1]), p, axis);\n }\n // vector\n if (x.rank === 1 || typeof axis === 'number' ||\n Array.isArray(axis) && axis.length === 1) {\n if (p === 1) {\n return sum(abs(x), axis);\n }\n if (p === Infinity) {\n return max(abs(x), axis);\n }\n if (p === -Infinity) {\n return min(abs(x), axis);\n }\n if (p === 'euclidean' || p === 2) {\n // norm(x, 2) = sum(abs(xi) ^ 2) ^ 1/2\n return sqrt(sum(pow(abs(x), scalar(2, 'int32')), axis));\n }\n throw new Error(`Error in norm: invalid ord value: ${p}`);\n }\n // matrix (assumption axis[0] < axis[1])\n if (Array.isArray(axis) && axis.length === 2) {\n if (p === 1) {\n return max(sum(abs(x), axis[0]), axis[1] - 1);\n }\n if (p === Infinity) {\n return max(sum(abs(x), axis[1]), axis[0]);\n }\n if (p === -Infinity) {\n return min(sum(abs(x), axis[1]), axis[0]);\n }\n if (p === 'fro' || p === 'euclidean') {\n // norm(x) = sqrt(sum(pow(x, 2)))\n return sqrt(sum(square(x), axis));\n }\n throw new Error(`Error in norm: invalid ord value: ${p}`);\n }\n throw new Error(`Error in norm: invalid axis: ${axis}`);\n}\nexport const norm = op({ norm_ });\n//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibm9ybS5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uLy4uL3RmanMtY29yZS9zcmMvb3BzL25vcm0udHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUE7Ozs7Ozs7Ozs7Ozs7OztHQWVHO0FBR0gsT0FBTyxFQUFDLGVBQWUsRUFBQyxNQUFNLG9CQUFvQixDQUFDO0FBRW5ELE9BQU8sRUFBQyxjQUFjLEVBQUMsTUFBTSxTQUFTLENBQUM7QUFFdkMsT0FBTyxFQUFDLEdBQUcsRUFBQyxNQUFNLE9BQU8sQ0FBQztBQUMxQixPQUFPLEtBQUssU0FBUyxNQUFNLGFBQWEsQ0FBQztBQUN6QyxPQUFPLEVBQUMsR0FBRyxFQUFDLE1BQU0sT0FBTyxDQUFDO0FBQzFCLE9BQU8sRUFBQyxHQUFHLEVBQUMsTUFBTSxPQUFPLENBQUM7QUFDMUIsT0FBTyxFQUFDLEVBQUUsRUFBQyxNQUFNLGFBQWEsQ0FBQztBQUMvQixPQUFPLEVBQUMsR0FBRyxFQUFDLE1BQU0sT0FBTyxDQUFDO0FBQzFCLE9BQU8sRUFBQyxPQUFPLEVBQUMsTUFBTSxXQUFXLENBQUM7QUFDbEMsT0FBTyxFQUFDLE1BQU0sRUFBQyxNQUFNLFVBQVUsQ0FBQztBQUNoQyxPQUFPLEVBQUMsSUFBSSxFQUFDLE1BQU0sUUFBUSxDQUFDO0FBQzVCLE9BQU8sRUFBQyxNQUFNLEVBQUMsTUFBTSxVQUFVLENBQUM7QUFDaEMsT0FBTyxFQUFDLEdBQUcsRUFBQyxNQUFNLE9BQU8sQ0FBQztBQUUxQjs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7OztHQXFDRztBQUNILFNBQVMsS0FBSyxDQUNWLENBQW9CLEVBQUUsTUFBZ0MsV0FBVyxFQUNqRSxPQUF3QixJQUFJLEVBQUUsUUFBUSxHQUFHLEtBQUs7SUFDaEQsQ0FBQyxHQUFHLGVBQWUsQ0FBQyxDQUFDLEVBQUUsR0FBRyxFQUFFLE1BQU0sQ0FBQyxDQUFDO0lBRXBDLE1BQU0sSUFBSSxHQUFHLFFBQVEsQ0FBQyxDQUFDLEVBQUUsR0FBRyxFQUFFLElBQUksQ0FBQyxDQUFDO0lBQ3BDLElBQUksYUFBYSxHQUFHLElBQUksQ0FBQyxLQUFLLENBQUM7SUFDL0IsSUFBSSxRQUFRLEVBQUU7UUFDWixNQUFNLElBQUksR0FBRyxjQUFjLENBQUMsSUFBSSxFQUFFLENBQUMsQ0FBQyxLQUFLLENBQUMsQ0FBQztRQUMzQyxhQUFhLEdBQUcsU0FBUyxDQUFDLG9CQUFvQixDQUFDLElBQUksQ0FBQyxLQUFLLEVBQUUsSUFBSSxDQUFDLENBQUM7S0FDbEU7SUFDRCxPQUFPLE9BQU8sQ0FBQyxJQUFJLEVBQUUsYUFBYSxDQUFDLENBQUM7QUFDdEMsQ0FBQztBQUVELFNBQVMsUUFBUSxDQUNiLENBQVMsRUFBRSxDQUFnQixFQUFFLE9BQXdCLElBQUk7SUFDM0QsSUFBSSxDQUFDLENBQUMsSUFBSSxLQUFLLENBQUMsRUFBRTtRQUNoQixPQUFPLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQztLQUNmO0lBRUQsNENBQTRDO0lBQzVDLElBQUksQ0FBQyxDQUFDLElBQUksS0FBSyxDQUFDLElBQUksSUFBSSxLQUFLLElBQUksRUFBRTtRQUNqQyxPQUFPLFFBQVEsQ0FBQyxPQUFPLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsRUFBRSxJQUFJLENBQUMsQ0FBQztLQUM1QztJQUVELFNBQVM7SUFDVCxJQUFJLENBQUMsQ0FBQyxJQUFJLEtBQUssQ0FBQyxJQUFJLE9BQU8sSUFBSSxLQUFLLFFBQVE7UUFDeEMsS0FBSyxDQUFDLE9BQU8sQ0FBQyxJQUFJLENBQUMsSUFBSSxJQUFJLENBQUMsTUFBTSxLQUFLLENBQUMsRUFBRTtRQUM1QyxJQUFJLENBQUMsS0FBSyxDQUFDLEVBQUU7WUFDWCxPQUFPLEdBQUcsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLEVBQUUsSUFBSSxDQUFDLENBQUM7U0FDMUI7UUFDRCxJQUFJLENBQUMsS0FBSyxRQUFRLEVBQUU7WUFDbEIsT0FBTyxHQUFHLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxFQUFFLElBQUksQ0FBQyxDQUFDO1NBQzFCO1FBQ0QsSUFBSSxDQUFDLEtBQUssQ0FBQyxRQUFRLEVBQUU7WUFDbkIsT0FBTyxHQUFHLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxFQUFFLElBQUksQ0FBQyxDQUFDO1NBQzFCO1FBQ0QsSUFBSSxDQUFDLEtBQUssV0FBVyxJQUFJLENBQUMsS0FBSyxDQUFDLEVBQUU7WUFDaEMsc0NBQXNDO1lBQ3RDLE9BQU8sSUFBSSxDQUFDLEdBQUcsQ0FBQyxHQUFHLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxFQUFFLE1BQU0sQ0FBQyxDQUFDLEVBQUUsT0FBTyxDQUFDLENBQUMsRUFBRSxJQUFJLENBQUMsQ0FBQyxDQUFDO1NBQ3pEO1FBRUQsTUFBTSxJQUFJLEtBQUssQ0FBQyxxQ0FBcUMsQ0FBQyxFQUFFLENBQUMsQ0FBQztLQUMzRDtJQUVELHdDQUF3QztJQUN4QyxJQUFJLEtBQUssQ0FBQyxPQUFPLENBQUMsSUFBSSxDQUFDLElBQUksSUFBSSxDQUFDLE1BQU0sS0FBSyxDQUFDLEVBQUU7UUFDNUMsSUFBSSxDQUFDLEtBQUssQ0FBQyxFQUFFO1lBQ1gsT0FBTyxHQUFHLENBQUMsR0FBRyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsRUFBRSxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUMsRUFBRSxJQUFJLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUM7U0FDL0M7UUFDRCxJQUFJLENBQUMsS0FBSyxRQUFRLEVBQUU7WUFDbEIsT0FBTyxHQUFHLENBQUMsR0FBRyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsRUFBRSxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUMsRUFBRSxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQztTQUMzQztRQUNELElBQUksQ0FBQyxLQUFLLENBQUMsUUFBUSxFQUFFO1lBQ25CLE9BQU8sR0FBRyxDQUFDLEdBQUcsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLEVBQUUsSUFBSSxDQUFDLENBQUMsQ0FBQyxDQUFDLEVBQUUsSUFBSSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUM7U0FDM0M7UUFDRCxJQUFJLENBQUMsS0FBSyxLQUFLLElBQUksQ0FBQyxLQUFLLFdBQVcsRUFBRTtZQUNwQyxpQ0FBaUM7WUFDakMsT0FBTyxJQUFJLENBQUMsR0FBRyxDQUFDLE1BQU0sQ0FBQyxDQUFDLENBQUMsRUFBRSxJQUFJLENBQUMsQ0FBQyxDQUFDO1NBQ25DO1FBRUQsTUFBTSxJQUFJLEtBQUssQ0FBQyxxQ0FBcUMsQ0FBQyxFQUFFLENBQUMsQ0FBQztLQUMzRDtJQUVELE1BQU0sSUFBSSxLQUFLLENBQUMsZ0NBQWdDLElBQUksRUFBRSxDQUFDLENBQUM7QUFDMUQsQ0FBQztBQUVELE1BQU0sQ0FBQyxNQUFNLElBQUksR0FBRyxFQUFFLENBQUMsRUFBQyxLQUFLLEVBQUMsQ0FBQyxDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiLyoqXG4gKiBAbGljZW5zZVxuICogQ29weXJpZ2h0IDIwMTggR29vZ2xlIExMQy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC5cbiAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSBcIkxpY2Vuc2VcIik7XG4gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuXG4gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXRcbiAqXG4gKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjBcbiAqXG4gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlXG4gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiBcIkFTIElTXCIgQkFTSVMsXG4gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC5cbiAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmRcbiAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLlxuICogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbiAqL1xuXG5pbXBvcnQge1RlbnNvcn0gZnJvbSAnLi4vdGVuc29yJztcbmltcG9ydCB7Y29udmVydFRvVGVuc29yfSBmcm9tICcuLi90ZW5zb3JfdXRpbF9lbnYnO1xuaW1wb3J0IHtUZW5zb3JMaWtlfSBmcm9tICcuLi90eXBlcyc7XG5pbXBvcnQge3BhcnNlQXhpc1BhcmFtfSBmcm9tICcuLi91dGlsJztcblxuaW1wb3J0IHthYnN9IGZyb20gJy4vYWJzJztcbmltcG9ydCAqIGFzIGF4aXNfdXRpbCBmcm9tICcuL2F4aXNfdXRpbCc7XG5pbXBvcnQge21heH0gZnJvbSAnLi9tYXgnO1xuaW1wb3J0IHttaW59IGZyb20gJy4vbWluJztcbmltcG9ydCB7b3B9IGZyb20gJy4vb3BlcmF0aW9uJztcbmltcG9ydCB7cG93fSBmcm9tICcuL3Bvdyc7XG5pbXBvcnQge3Jlc2hhcGV9IGZyb20gJy4vcmVzaGFwZSc7XG5pbXBvcnQge3NjYWxhcn0gZnJvbSAnLi9zY2FsYXInO1xuaW1wb3J0IHtzcXJ0fSBmcm9tICcuL3NxcnQnO1xuaW1wb3J0IHtzcXVhcmV9IGZyb20gJy4vc3F1YXJlJztcbmltcG9ydCB7c3VtfSBmcm9tICcuL3N1bSc7XG5cbi8qKlxuICogQ29tcHV0ZXMgdGhlIG5vcm0gb2Ygc2NhbGFyLCB2ZWN0b3JzLCBhbmQgbWF0cmljZXMuXG4gKiBUaGlzIGZ1bmN0aW9uIGNhbiBjb21wdXRlIHNldmVyYWwgZGlmZmVyZW50IHZlY3RvciBub3JtcyAodGhlIDEtbm9ybSwgdGhlXG4gKiBFdWNsaWRlYW4gb3IgMi1ub3JtLCB0aGUgaW5mLW5vcm0sIGFuZCBpbiBnZW5lcmFsIHRoZSBwLW5vcm0gZm9yIHAgPiAwKVxuICogYW5kIG1hdHJpeCBub3JtcyAoRnJvYmVuaXVzLCAxLW5vcm0sIGFuZCBpbmYtbm9ybSkuXG4gKlxuICogYGBganNcbiAqIGNvbnN0IHggPSB0Zi50ZW5zb3IxZChbMSwgMiwgMywgNF0pO1xuICpcbiAqIHgubm9ybSgpLnByaW50KCk7ICAvLyBvciB0Zi5ub3JtKHgpXG4gKiBgYGBcbiAqXG4gKiBAcGFyYW0geCBUaGUgaW5wdXQgYXJyYXkuXG4gKiBAcGFyYW0gb3JkIE9wdGlvbmFsLiBPcmRlciBvZiB0aGUgbm9ybS4gU3VwcG9ydGVkIG5vcm0gdHlwZXMgYXJlXG4gKiBmb2xsb3dpbmc6XG4gKlxuICogIHwgb3JkICAgICAgICB8IG5vcm0gZm9yIG1hdHJpY2VzICAgICAgICAgfCBub3JtIGZvciB2ZWN0b3JzXG4gKiAgfC0tLS0tLS0tLS0tLXwtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS18LS0tLS0tLS0tLS0tLS0tLS0tLS0tXG4gKiAgfCdldWNsaWRlYW4nIHxGcm9iZW5pdXMgbm9ybSAgICAgICAgICAgICB8Mi1ub3JtXG4gKiAgfCdmcm8nICAgICAgIHxGcm9iZW5pdXMgbm9ybVx0ICAgICAgICAgICB8XG4gKiAgfEluZmluaXR5ICAgIHxtYXgoc3VtKGFicyh4KSwgYXhpcz0xKSkgICB8bWF4KGFicyh4KSlcbiAqICB8LUluZmluaXR5ICAgfG1pbihzdW0oYWJzKHgpLCBheGlzPTEpKSAgIHxtaW4oYWJzKHgpKVxuICogIHwxICAgICAgICAgICB8bWF4KHN1bShhYnMoeCksIGF4aXM9MCkpICAgfHN1bShhYnMoeCkpXG4gKiAgfDIgICAgICAgICAgIHwgICAgICAgICAgICAgICAgICAgICAgICAgICB8c3VtKGFicyh4KV4yKV4oMS8yKVxuICpcbiAqIEBwYXJhbSBheGlzIE9wdGlvbmFsLiBJZiBheGlzIGlzIG51bGwgKHRoZSBkZWZhdWx0KSwgdGhlIGlucHV0IGlzXG4gKiBjb25zaWRlcmVkIGEgdmVjdG9yIGFuZCBhIHNpbmdsZSB2ZWN0b3Igbm9ybSBpcyBjb21wdXRlZCBvdmVyIHRoZSBlbnRpcmVcbiAqIHNldCBvZiB2YWx1ZXMgaW4gdGhlIFRlbnNvciwgaS5lLiBub3JtKHgsIG9yZCkgaXMgZXF1aXZhbGVudFxuICogdG8gbm9ybSh4LnJlc2hhcGUoWy0xXSksIG9yZCkuIElmIGF4aXMgaXMgYW4gaW50ZWdlciwgdGhlIGlucHV0XG4gKiBpcyBjb25zaWRlcmVkIGEgYmF0Y2ggb2YgdmVjdG9ycywgYW5kIGF4aXMgZGV0ZXJtaW5lcyB0aGUgYXhpcyBpbiB4XG4gKiBvdmVyIHdoaWNoIHRvIGNvbXB1dGUgdmVjdG9yIG5vcm1zLiBJZiBheGlzIGlzIGEgMi10dXBsZSBvZiBpbnRlZ2VyIGl0IGlzXG4gKiBjb25zaWRlcmVkIGEgYmF0Y2ggb2YgbWF0cmljZXMgYW5kIGF4aXMgZGV0ZXJtaW5lcyB0aGUgYXhlcyBpbiBOREFycmF5XG4gKiBvdmVyIHdoaWNoIHRvIGNvbXB1dGUgYSBtYXRyaXggbm9ybS5cbiAqIEBwYXJhbSBrZWVwRGltcyBPcHRpb25hbC4gSWYgdHJ1ZSwgdGhlIG5vcm0gaGFzIHRoZSBzYW1lIGRpbWVuc2lvbmFsaXR5XG4gKiBhcyB0aGUgaW5wdXQuXG4gKlxuICogQGRvYyB7aGVhZGluZzogJ09wZXJhdGlvbnMnLCBzdWJoZWFkaW5nOiAnTWF0cmljZXMnfVxuICovXG5mdW5jdGlvbiBub3JtXyhcbiAgICB4OiBUZW5zb3J8VGVuc29yTGlrZSwgb3JkOiBudW1iZXJ8J2V1Y2xpZGVhbid8J2ZybycgPSAnZXVjbGlkZWFuJyxcbiAgICBheGlzOiBudW1iZXJ8bnVtYmVyW10gPSBudWxsLCBrZWVwRGltcyA9IGZhbHNlKTogVGVuc29yIHtcbiAgeCA9IGNvbnZlcnRUb1RlbnNvcih4LCAneCcsICdub3JtJyk7XG5cbiAgY29uc3Qgbm9ybSA9IG5vcm1JbXBsKHgsIG9yZCwgYXhpcyk7XG4gIGxldCBrZWVwRGltc1NoYXBlID0gbm9ybS5zaGFwZTtcbiAgaWYgKGtlZXBEaW1zKSB7XG4gICAgY29uc3QgYXhlcyA9IHBhcnNlQXhpc1BhcmFtKGF4aXMsIHguc2hhcGUpO1xuICAgIGtlZXBEaW1zU2hhcGUgPSBheGlzX3V0aWwuZXhwYW5kU2hhcGVUb0tlZXBEaW0obm9ybS5zaGFwZSwgYXhlcyk7XG4gIH1cbiAgcmV0dXJuIHJlc2hhcGUobm9ybSwga2VlcERpbXNTaGFwZSk7XG59XG5cbmZ1bmN0aW9uIG5vcm1JbXBsKFxuICAgIHg6IFRlbnNvciwgcDogbnVtYmVyfHN0cmluZywgYXhpczogbnVtYmVyfG51bWJlcltdID0gbnVsbCk6IFRlbnNvciB7XG4gIGlmICh4LnJhbmsgPT09IDApIHtcbiAgICByZXR1cm4gYWJzKHgpO1xuICB9XG5cbiAgLy8gY29uc2lkZXIgdmVjdG9yIHdoZW4gbm8gYXhpcyBpcyBzcGVjaWZpZWRcbiAgaWYgKHgucmFuayAhPT0gMSAmJiBheGlzID09PSBudWxsKSB7XG4gICAgcmV0dXJuIG5vcm1JbXBsKHJlc2hhcGUoeCwgWy0xXSksIHAsIGF4aXMpO1xuICB9XG5cbiAgLy8gdmVjdG9yXG4gIGlmICh4LnJhbmsgPT09IDEgfHwgdHlwZW9mIGF4aXMgPT09ICdudW1iZXInIHx8XG4gICAgICBBcnJheS5pc0FycmF5KGF4aXMpICYmIGF4aXMubGVuZ3RoID09PSAxKSB7XG4gICAgaWYgKHAgPT09IDEpIHtcbiAgICAgIHJldHVybiBzdW0oYWJzKHgpLCBheGlzKTtcbiAgICB9XG4gICAgaWYgKHAgPT09IEluZmluaXR5KSB7XG4gICAgICByZXR1cm4gbWF4KGFicyh4KSwgYXhpcyk7XG4gICAgfVxuICAgIGlmIChwID09PSAtSW5maW5pdHkpIHtcbiAgICAgIHJldHVybiBtaW4oYWJzKHgpLCBheGlzKTtcbiAgICB9XG4gICAgaWYgKHAgPT09ICdldWNsaWRlYW4nIHx8IHAgPT09IDIpIHtcbiAgICAgIC8vIG5vcm0oeCwgMikgPSBzdW0oYWJzKHhpKSBeIDIpIF4gMS8yXG4gICAgICByZXR1cm4gc3FydChzdW0ocG93KGFicyh4KSwgc2NhbGFyKDIsICdpbnQzMicpKSwgYXhpcykpO1xuICAgIH1cblxuICAgIHRocm93IG5ldyBFcnJvcihgRXJyb3IgaW4gbm9ybTogaW52YWxpZCBvcmQgdmFsdWU6ICR7cH1gKTtcbiAgfVxuXG4gIC8vIG1hdHJpeCAoYXNzdW1wdGlvbiBheGlzWzBdIDwgYXhpc1sxXSlcbiAgaWYgKEFycmF5LmlzQXJyYXkoYXhpcykgJiYgYXhpcy5sZW5ndGggPT09IDIpIHtcbiAgICBpZiAocCA9PT0gMSkge1xuICAgICAgcmV0dXJuIG1heChzdW0oYWJzKHgpLCBheGlzWzBdKSwgYXhpc1sxXSAtIDEpO1xuICAgIH1cbiAgICBpZiAocCA9PT0gSW5maW5pdHkpIHtcbiAgICAgIHJldHVybiBtYXgoc3VtKGFicyh4KSwgYXhpc1sxXSksIGF4aXNbMF0pO1xuICAgIH1cbiAgICBpZiAocCA9PT0gLUluZmluaXR5KSB7XG4gICAgICByZXR1cm4gbWluKHN1bShhYnMoeCksIGF4aXNbMV0pLCBheGlzWzBdKTtcbiAgICB9XG4gICAgaWYgKHAgPT09ICdmcm8nIHx8IHAgPT09ICdldWNsaWRlYW4nKSB7XG4gICAgICAvLyBub3JtKHgpID0gc3FydChzdW0ocG93KHgsIDIpKSlcbiAgICAgIHJldHVybiBzcXJ0KHN1bShzcXVhcmUoeCksIGF4aXMpKTtcbiAgICB9XG5cbiAgICB0aHJvdyBuZXcgRXJyb3IoYEVycm9yIGluIG5vcm06IGludmFsaWQgb3JkIHZhbHVlOiAke3B9YCk7XG4gIH1cblxuICB0aHJvdyBuZXcgRXJyb3IoYEVycm9yIGluIG5vcm06IGludmFsaWQgYXhpczogJHtheGlzfWApO1xufVxuXG5leHBvcnQgY29uc3Qgbm9ybSA9IG9wKHtub3JtX30pO1xuIl19","/**\n * @license\n * Copyright 2020 Google LLC. All Rights Reserved.\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n * =============================================================================\n */\nimport { ENGINE } from '../engine';\nimport { NotEqual } from '../kernel_names';\nimport { makeTypesMatch } from '../tensor_util';\nimport { convertToTensor } from '../tensor_util_env';\nimport { assertAndGetBroadcastShape } from './broadcast_util';\nimport { op } from './operation';\n/**\n * Returns the truth value of (a != b) element-wise. Supports broadcasting.\n *\n * ```js\n * const a = tf.tensor1d([1, 2, 3]);\n * const b = tf.tensor1d([0, 2, 3]);\n *\n * a.notEqual(b).print();\n * ```\n * @param a The first input tensor.\n * @param b The second input tensor. Must have the same dtype as `a`.\n *\n * @doc {heading: 'Operations', subheading: 'Logical'}\n */\nfunction notEqual_(a, b) {\n let $a = convertToTensor(a, 'a', 'notEqual', 'string_or_numeric');\n let $b = convertToTensor(b, 'b', 'notEqual', 'string_or_numeric');\n [$a, $b] = makeTypesMatch($a, $b);\n assertAndGetBroadcastShape($a.shape, $b.shape);\n const inputs = { a: $a, b: $b };\n return ENGINE.runKernel(NotEqual, inputs);\n}\nexport const notEqual = op({ notEqual_ });\n//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibm90X2VxdWFsLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vLi4vdGZqcy1jb3JlL3NyYy9vcHMvbm90X2VxdWFsLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBOzs7Ozs7Ozs7Ozs7Ozs7R0FlRztBQUNILE9BQU8sRUFBQyxNQUFNLEVBQUMsTUFBTSxXQUFXLENBQUM7QUFDakMsT0FBTyxFQUFDLFFBQVEsRUFBaUIsTUFBTSxpQkFBaUIsQ0FBQztBQUd6RCxPQUFPLEVBQUMsY0FBYyxFQUFDLE1BQU0sZ0JBQWdCLENBQUM7QUFDOUMsT0FBTyxFQUFDLGVBQWUsRUFBQyxNQUFNLG9CQUFvQixDQUFDO0FBR25ELE9BQU8sRUFBQywwQkFBMEIsRUFBQyxNQUFNLGtCQUFrQixDQUFDO0FBQzVELE9BQU8sRUFBQyxFQUFFLEVBQUMsTUFBTSxhQUFhLENBQUM7QUFFL0I7Ozs7Ozs7Ozs7Ozs7R0FhRztBQUNILFNBQVMsU0FBUyxDQUNkLENBQW9CLEVBQUUsQ0FBb0I7SUFDNUMsSUFBSSxFQUFFLEdBQUcsZUFBZSxDQUFDLENBQUMsRUFBRSxHQUFHLEVBQUUsVUFBVSxFQUFFLG1CQUFtQixDQUFDLENBQUM7SUFDbEUsSUFBSSxFQUFFLEdBQUcsZUFBZSxDQUFDLENBQUMsRUFBRSxHQUFHLEVBQUUsVUFBVSxFQUFFLG1CQUFtQixDQUFDLENBQUM7SUFDbEUsQ0FBQyxFQUFFLEVBQUUsRUFBRSxDQUFDLEdBQUcsY0FBYyxDQUFDLEVBQUUsRUFBRSxFQUFFLENBQUMsQ0FBQztJQUVsQywwQkFBMEIsQ0FBQyxFQUFFLENBQUMsS0FBSyxFQUFFLEVBQUUsQ0FBQyxLQUFLLENBQUMsQ0FBQztJQUUvQyxNQUFNLE1BQU0sR0FBbUIsRUFBQyxDQUFDLEVBQUUsRUFBRSxFQUFFLENBQUMsRUFBRSxFQUFFLEVBQUMsQ0FBQztJQUU5QyxPQUFPLE1BQU0sQ0FBQyxTQUFTLENBQUMsUUFBUSxFQUFFLE1BQThCLENBQUMsQ0FBQztBQUNwRSxDQUFDO0FBRUQsTUFBTSxDQUFDLE1BQU0sUUFBUSxHQUFHLEVBQUUsQ0FBQyxFQUFDLFNBQVMsRUFBQyxDQUFDLENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyIvKipcbiAqIEBsaWNlbnNlXG4gKiBDb3B5cmlnaHQgMjAyMCBHb29nbGUgTExDLiBBbGwgUmlnaHRzIFJlc2VydmVkLlxuICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlIFwiTGljZW5zZVwiKTtcbiAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS5cbiAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdFxuICpcbiAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMFxuICpcbiAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmVcbiAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuIFwiQVMgSVNcIiBCQVNJUyxcbiAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLlxuICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZFxuICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuXG4gKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuICovXG5pbXBvcnQge0VOR0lORX0gZnJvbSAnLi4vZW5naW5lJztcbmltcG9ydCB7Tm90RXF1YWwsIE5vdEVxdWFsSW5wdXRzfSBmcm9tICcuLi9rZXJuZWxfbmFtZXMnO1xuaW1wb3J0IHtUZW5zb3J9IGZyb20gJy4uL3RlbnNvcic7XG5pbXBvcnQge05hbWVkVGVuc29yTWFwfSBmcm9tICcuLi90ZW5zb3JfdHlwZXMnO1xuaW1wb3J0IHttYWtlVHlwZXNNYXRjaH0gZnJvbSAnLi4vdGVuc29yX3V0aWwnO1xuaW1wb3J0IHtjb252ZXJ0VG9UZW5zb3J9IGZyb20gJy4uL3RlbnNvcl91dGlsX2Vudic7XG5pbXBvcnQge1RlbnNvckxpa2V9IGZyb20gJy4uL3R5cGVzJztcblxuaW1wb3J0IHthc3NlcnRBbmRHZXRCcm9hZGNhc3RTaGFwZX0gZnJvbSAnLi9icm9hZGNhc3RfdXRpbCc7XG5pbXBvcnQge29wfSBmcm9tICcuL29wZXJhdGlvbic7XG5cbi8qKlxuICogUmV0dXJucyB0aGUgdHJ1dGggdmFsdWUgb2YgKGEgIT0gYikgZWxlbWVudC13aXNlLiBTdXBwb3J0cyBicm9hZGNhc3RpbmcuXG4gKlxuICogYGBganNcbiAqIGNvbnN0IGEgPSB0Zi50ZW5zb3IxZChbMSwgMiwgM10pO1xuICogY29uc3QgYiA9IHRmLnRlbnNvcjFkKFswLCAyLCAzXSk7XG4gKlxuICogYS5ub3RFcXVhbChiKS5wcmludCgpO1xuICogYGBgXG4gKiBAcGFyYW0gYSBUaGUgZmlyc3QgaW5wdXQgdGVuc29yLlxuICogQHBhcmFtIGIgVGhlIHNlY29uZCBpbnB1dCB0ZW5zb3IuIE11c3QgaGF2ZSB0aGUgc2FtZSBkdHlwZSBhcyBgYWAuXG4gKlxuICogQGRvYyB7aGVhZGluZzogJ09wZXJhdGlvbnMnLCBzdWJoZWFkaW5nOiAnTG9naWNhbCd9XG4gKi9cbmZ1bmN0aW9uIG5vdEVxdWFsXzxUIGV4dGVuZHMgVGVuc29yPihcbiAgICBhOiBUZW5zb3J8VGVuc29yTGlrZSwgYjogVGVuc29yfFRlbnNvckxpa2UpOiBUIHtcbiAgbGV0ICRhID0gY29udmVydFRvVGVuc29yKGEsICdhJywgJ25vdEVxdWFsJywgJ3N0cmluZ19vcl9udW1lcmljJyk7XG4gIGxldCAkYiA9IGNvbnZlcnRUb1RlbnNvcihiLCAnYicsICdub3RFcXVhbCcsICdzdHJpbmdfb3JfbnVtZXJpYycpO1xuICBbJGEsICRiXSA9IG1ha2VUeXBlc01hdGNoKCRhLCAkYik7XG5cbiAgYXNzZXJ0QW5kR2V0QnJvYWRjYXN0U2hhcGUoJGEuc2hhcGUsICRiLnNoYXBlKTtcblxuICBjb25zdCBpbnB1dHM6IE5vdEVxdWFsSW5wdXRzID0ge2E6ICRhLCBiOiAkYn07XG5cbiAgcmV0dXJuIEVOR0lORS5ydW5LZXJuZWwoTm90RXF1YWwsIGlucHV0cyBhcyB7fSBhcyBOYW1lZFRlbnNvck1hcCk7XG59XG5cbmV4cG9ydCBjb25zdCBub3RFcXVhbCA9IG9wKHtub3RFcXVhbF99KTtcbiJdfQ==","/**\n * @license\n * Copyright 2020 Google LLC. All Rights Reserved.\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n * =============================================================================\n */\nimport { ENGINE } from '../engine';\nimport { OneHot } from '../kernel_names';\nimport { convertToTensor } from '../tensor_util_env';\nimport { op } from './operation';\n/**\n * Creates a one-hot `tf.Tensor`. The locations represented by `indices` take\n * value `onValue` (defaults to 1), while all other locations take value\n * `offValue` (defaults to 0). If `indices` is rank `R`, the output has rank\n * `R+1` with the last axis of size `depth`.\n * `indices` used to encode prediction class must start from 0. For example,\n * if you have 3 classes of data, class 1 should be encoded as 0, class 2\n * should be 1, and class 3 should be 2.\n *\n * ```js\n * tf.oneHot(tf.tensor1d([0, 1], 'int32'), 3).print();\n * ```\n *\n * @param indices `tf.Tensor` of indices with dtype `int32`. Indices must\n * start from 0.\n * @param depth The depth of the one hot dimension.\n * @param onValue A number used to fill in the output when the index matches\n * the location.\n * @param offValue A number used to fill in the output when the index does\n * not match the location.\n * @param dtype The dtype of the output tensor, default to 'int32'.\n *\n * @doc {heading: 'Tensors', subheading: 'Creation'}\n */\nfunction oneHot_(indices, depth, onValue = 1, offValue = 0, dtype = 'int32') {\n if (depth < 2) {\n throw new Error(`Error in oneHot: depth must be >=2, but it is ${depth}`);\n }\n const $indices = convertToTensor(indices, 'indices', 'oneHot', 'int32');\n const inputs = { indices: $indices };\n const attrs = { dtype, depth, onValue, offValue };\n return ENGINE.runKernel(OneHot, inputs, attrs);\n}\nexport const oneHot = op({ oneHot_ });\n//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoib25lX2hvdC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uLy4uL3RmanMtY29yZS9zcmMvb3BzL29uZV9ob3QudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUE7Ozs7Ozs7Ozs7Ozs7OztHQWVHO0FBRUgsT0FBTyxFQUFDLE1BQU0sRUFBQyxNQUFNLFdBQVcsQ0FBQztBQUNqQyxPQUFPLEVBQUMsTUFBTSxFQUE0QixNQUFNLGlCQUFpQixDQUFDO0FBSWxFLE9BQU8sRUFBQyxlQUFlLEVBQUMsTUFBTSxvQkFBb0IsQ0FBQztBQUduRCxPQUFPLEVBQUMsRUFBRSxFQUFDLE1BQU0sYUFBYSxDQUFDO0FBRS9COzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7OztHQXVCRztBQUNILFNBQVMsT0FBTyxDQUNaLE9BQTBCLEVBQUUsS0FBYSxFQUFFLE9BQU8sR0FBRyxDQUFDLEVBQUUsUUFBUSxHQUFHLENBQUMsRUFDcEUsUUFBa0IsT0FBTztJQUMzQixJQUFJLEtBQUssR0FBRyxDQUFDLEVBQUU7UUFDYixNQUFNLElBQUksS0FBSyxDQUFDLGlEQUFpRCxLQUFLLEVBQUUsQ0FBQyxDQUFDO0tBQzNFO0lBQ0QsTUFBTSxRQUFRLEdBQUcsZUFBZSxDQUFDLE9BQU8sRUFBRSxTQUFTLEVBQUUsUUFBUSxFQUFFLE9BQU8sQ0FBQyxDQUFDO0lBRXhFLE1BQU0sTUFBTSxHQUFpQixFQUFDLE9BQU8sRUFBRSxRQUFRLEVBQUMsQ0FBQztJQUNqRCxNQUFNLEtBQUssR0FBZ0IsRUFBQyxLQUFLLEVBQUUsS0FBSyxFQUFFLE9BQU8sRUFBRSxRQUFRLEVBQUMsQ0FBQztJQUU3RCxPQUFPLE1BQU0sQ0FBQyxTQUFTLENBQ25CLE1BQU0sRUFBRSxNQUFtQyxFQUMzQyxLQUFnQyxDQUFDLENBQUM7QUFDeEMsQ0FBQztBQUVELE1BQU0sQ0FBQyxNQUFNLE1BQU0sR0FBRyxFQUFFLENBQUMsRUFBQyxPQUFPLEVBQUMsQ0FBQyxDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiLyoqXG4gKiBAbGljZW5zZVxuICogQ29weXJpZ2h0IDIwMjAgR29vZ2xlIExMQy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC5cbiAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSBcIkxpY2Vuc2VcIik7XG4gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuXG4gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXRcbiAqXG4gKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjBcbiAqXG4gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlXG4gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiBcIkFTIElTXCIgQkFTSVMsXG4gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC5cbiAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmRcbiAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLlxuICogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbiAqL1xuXG5pbXBvcnQge0VOR0lORX0gZnJvbSAnLi4vZW5naW5lJztcbmltcG9ydCB7T25lSG90LCBPbmVIb3RBdHRycywgT25lSG90SW5wdXRzfSBmcm9tICcuLi9rZXJuZWxfbmFtZXMnO1xuaW1wb3J0IHtOYW1lZEF0dHJNYXB9IGZyb20gJy4uL2tlcm5lbF9yZWdpc3RyeSc7XG5pbXBvcnQge1RlbnNvcn0gZnJvbSAnLi4vdGVuc29yJztcbmltcG9ydCB7TmFtZWRUZW5zb3JNYXB9IGZyb20gJy4uL3RlbnNvcl90eXBlcyc7XG5pbXBvcnQge2NvbnZlcnRUb1RlbnNvcn0gZnJvbSAnLi4vdGVuc29yX3V0aWxfZW52JztcbmltcG9ydCB7RGF0YVR5cGUsIFRlbnNvckxpa2V9IGZyb20gJy4uL3R5cGVzJztcblxuaW1wb3J0IHtvcH0gZnJvbSAnLi9vcGVyYXRpb24nO1xuXG4vKipcbiAqIENyZWF0ZXMgYSBvbmUtaG90IGB0Zi5UZW5zb3JgLiBUaGUgbG9jYXRpb25zIHJlcHJlc2VudGVkIGJ5IGBpbmRpY2VzYCB0YWtlXG4gKiB2YWx1ZSBgb25WYWx1ZWAgKGRlZmF1bHRzIHRvIDEpLCB3aGlsZSBhbGwgb3RoZXIgbG9jYXRpb25zIHRha2UgdmFsdWVcbiAqIGBvZmZWYWx1ZWAgKGRlZmF1bHRzIHRvIDApLiBJZiBgaW5kaWNlc2AgaXMgcmFuayBgUmAsIHRoZSBvdXRwdXQgaGFzIHJhbmtcbiAqIGBSKzFgIHdpdGggdGhlIGxhc3QgYXhpcyBvZiBzaXplIGBkZXB0aGAuXG4gKiBgaW5kaWNlc2AgdXNlZCB0byBlbmNvZGUgcHJlZGljdGlvbiBjbGFzcyBtdXN0IHN0YXJ0IGZyb20gMC4gRm9yIGV4YW1wbGUsXG4gKiAgaWYgeW91IGhhdmUgMyBjbGFzc2VzIG9mIGRhdGEsIGNsYXNzIDEgc2hvdWxkIGJlIGVuY29kZWQgYXMgMCwgY2xhc3MgMlxuICogIHNob3VsZCBiZSAxLCBhbmQgY2xhc3MgMyBzaG91bGQgYmUgMi5cbiAqXG4gKiBgYGBqc1xuICogdGYub25lSG90KHRmLnRlbnNvcjFkKFswLCAxXSwgJ2ludDMyJyksIDMpLnByaW50KCk7XG4gKiBgYGBcbiAqXG4gKiBAcGFyYW0gaW5kaWNlcyBgdGYuVGVuc29yYCBvZiBpbmRpY2VzIHdpdGggZHR5cGUgYGludDMyYC4gSW5kaWNlcyBtdXN0XG4gKiBzdGFydCBmcm9tIDAuXG4gKiBAcGFyYW0gZGVwdGggVGhlIGRlcHRoIG9mIHRoZSBvbmUgaG90IGRpbWVuc2lvbi5cbiAqIEBwYXJhbSBvblZhbHVlIEEgbnVtYmVyIHVzZWQgdG8gZmlsbCBpbiB0aGUgb3V0cHV0IHdoZW4gdGhlIGluZGV4IG1hdGNoZXNcbiAqIHRoZSBsb2NhdGlvbi5cbiAqIEBwYXJhbSBvZmZWYWx1ZSBBIG51bWJlciB1c2VkIHRvIGZpbGwgaW4gdGhlIG91dHB1dCB3aGVuIHRoZSBpbmRleCBkb2VzXG4gKiAgICAgbm90IG1hdGNoIHRoZSBsb2NhdGlvbi5cbiAqIEBwYXJhbSBkdHlwZSBUaGUgZHR5cGUgb2YgdGhlIG91dHB1dCB0ZW5zb3IsIGRlZmF1bHQgdG8gJ2ludDMyJy5cbiAqXG4gKiBAZG9jIHtoZWFkaW5nOiAnVGVuc29ycycsIHN1YmhlYWRpbmc6ICdDcmVhdGlvbid9XG4gKi9cbmZ1bmN0aW9uIG9uZUhvdF8oXG4gICAgaW5kaWNlczogVGVuc29yfFRlbnNvckxpa2UsIGRlcHRoOiBudW1iZXIsIG9uVmFsdWUgPSAxLCBvZmZWYWx1ZSA9IDAsXG4gICAgZHR5cGU6IERhdGFUeXBlID0gJ2ludDMyJyk6IFRlbnNvciB7XG4gIGlmIChkZXB0aCA8IDIpIHtcbiAgICB0aHJvdyBuZXcgRXJyb3IoYEVycm9yIGluIG9uZUhvdDogZGVwdGggbXVzdCBiZSA+PTIsIGJ1dCBpdCBpcyAke2RlcHRofWApO1xuICB9XG4gIGNvbnN0ICRpbmRpY2VzID0gY29udmVydFRvVGVuc29yKGluZGljZXMsICdpbmRpY2VzJywgJ29uZUhvdCcsICdpbnQzMicpO1xuXG4gIGNvbnN0IGlucHV0czogT25lSG90SW5wdXRzID0ge2luZGljZXM6ICRpbmRpY2VzfTtcbiAgY29uc3QgYXR0cnM6IE9uZUhvdEF0dHJzID0ge2R0eXBlLCBkZXB0aCwgb25WYWx1ZSwgb2ZmVmFsdWV9O1xuXG4gIHJldHVybiBFTkdJTkUucnVuS2VybmVsKFxuICAgICAgT25lSG90LCBpbnB1dHMgYXMgdW5rbm93biBhcyBOYW1lZFRlbnNvck1hcCxcbiAgICAgIGF0dHJzIGFzIHVua25vd24gYXMgTmFtZWRBdHRyTWFwKTtcbn1cblxuZXhwb3J0IGNvbnN0IG9uZUhvdCA9IG9wKHtvbmVIb3RffSk7XG4iXX0=","/**\n * @license\n * Copyright 2018 Google LLC. All Rights Reserved.\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n * =============================================================================\n */\nimport { ENGINE } from '../engine';\nimport { makeOnesTypedArray, sizeFromShape } from '../util';\nimport { complex } from './complex';\nimport { zeros } from './zeros';\n/**\n * Creates a `tf.Tensor` with all elements set to 1.\n *\n * ```js\n * tf.ones([2, 2]).print();\n * ```\n *\n * @param shape An array of integers defining the output tensor shape.\n * @param dtype The type of an element in the resulting tensor. Defaults to\n * 'float'.\n *\n * @doc {heading: 'Tensors', subheading: 'Creation'}\n */\nexport function ones(shape, dtype = 'float32') {\n if (dtype === 'complex64') {\n const real = ones(shape, 'float32');\n const imag = zeros(shape, 'float32');\n return complex(real, imag);\n }\n const values = makeOnesTypedArray(sizeFromShape(shape), dtype);\n return ENGINE.makeTensor(values, shape, dtype);\n}\n//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoib25lcy5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uLy4uL3RmanMtY29yZS9zcmMvb3BzL29uZXMudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUE7Ozs7Ozs7Ozs7Ozs7OztHQWVHO0FBRUgsT0FBTyxFQUFDLE1BQU0sRUFBQyxNQUFNLFdBQVcsQ0FBQztBQUdqQyxPQUFPLEVBQUMsa0JBQWtCLEVBQUUsYUFBYSxFQUFDLE1BQU0sU0FBUyxDQUFDO0FBRTFELE9BQU8sRUFBQyxPQUFPLEVBQUMsTUFBTSxXQUFXLENBQUM7QUFDbEMsT0FBTyxFQUFDLEtBQUssRUFBQyxNQUFNLFNBQVMsQ0FBQztBQUU5Qjs7Ozs7Ozs7Ozs7O0dBWUc7QUFDSCxNQUFNLFVBQVUsSUFBSSxDQUNoQixLQUFrQixFQUFFLFFBQWtCLFNBQVM7SUFDakQsSUFBSSxLQUFLLEtBQUssV0FBVyxFQUFFO1FBQ3pCLE1BQU0sSUFBSSxHQUFHLElBQUksQ0FBQyxLQUFLLEVBQUUsU0FBUyxDQUFDLENBQUM7UUFDcEMsTUFBTSxJQUFJLEdBQUcsS0FBSyxDQUFDLEtBQUssRUFBRSxTQUFTLENBQUMsQ0FBQztRQUNyQyxPQUFPLE9BQU8sQ0FBQyxJQUFJLEVBQUUsSUFBSSxDQUFDLENBQUM7S0FDNUI7SUFDRCxNQUFNLE1BQU0sR0FBRyxrQkFBa0IsQ0FBQyxhQUFhLENBQUMsS0FBSyxDQUFDLEVBQUUsS0FBSyxDQUFDLENBQUM7SUFDL0QsT0FBTyxNQUFNLENBQUMsVUFBVSxDQUFDLE1BQU0sRUFBRSxLQUFLLEVBQUUsS0FBSyxDQUFjLENBQUM7QUFDOUQsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbIi8qKlxuICogQGxpY2Vuc2VcbiAqIENvcHlyaWdodCAyMDE4IEdvb2dsZSBMTEMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuXG4gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgXCJMaWNlbnNlXCIpO1xuICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLlxuICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0XG4gKlxuICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wXG4gKlxuICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZVxuICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gXCJBUyBJU1wiIEJBU0lTLFxuICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuXG4gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kXG4gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS5cbiAqID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4gKi9cblxuaW1wb3J0IHtFTkdJTkV9IGZyb20gJy4uL2VuZ2luZSc7XG5pbXBvcnQge1RlbnNvcn0gZnJvbSAnLi4vdGVuc29yJztcbmltcG9ydCB7RGF0YVR5cGUsIFJhbmssIFNoYXBlTWFwfSBmcm9tICcuLi90eXBlcyc7XG5pbXBvcnQge21ha2VPbmVzVHlwZWRBcnJheSwgc2l6ZUZyb21TaGFwZX0gZnJvbSAnLi4vdXRpbCc7XG5cbmltcG9ydCB7Y29tcGxleH0gZnJvbSAnLi9jb21wbGV4JztcbmltcG9ydCB7emVyb3N9IGZyb20gJy4vemVyb3MnO1xuXG4vKipcbiAqIENyZWF0ZXMgYSBgdGYuVGVuc29yYCB3aXRoIGFsbCBlbGVtZW50cyBzZXQgdG8gMS5cbiAqXG4gKiBgYGBqc1xuICogdGYub25lcyhbMiwgMl0pLnByaW50KCk7XG4gKiBgYGBcbiAqXG4gKiBAcGFyYW0gc2hhcGUgQW4gYXJyYXkgb2YgaW50ZWdlcnMgZGVmaW5pbmcgdGhlIG91dHB1dCB0ZW5zb3Igc2hhcGUuXG4gKiBAcGFyYW0gZHR5cGUgVGhlIHR5cGUgb2YgYW4gZWxlbWVudCBpbiB0aGUgcmVzdWx0aW5nIHRlbnNvci4gRGVmYXVsdHMgdG9cbiAqICAgICAnZmxvYXQnLlxuICpcbiAqIEBkb2Mge2hlYWRpbmc6ICdUZW5zb3JzJywgc3ViaGVhZGluZzogJ0NyZWF0aW9uJ31cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIG9uZXM8UiBleHRlbmRzIFJhbms+KFxuICAgIHNoYXBlOiBTaGFwZU1hcFtSXSwgZHR5cGU6IERhdGFUeXBlID0gJ2Zsb2F0MzInKTogVGVuc29yPFI+IHtcbiAgaWYgKGR0eXBlID09PSAnY29tcGxleDY0Jykge1xuICAgIGNvbnN0IHJlYWwgPSBvbmVzKHNoYXBlLCAnZmxvYXQzMicpO1xuICAgIGNvbnN0IGltYWcgPSB6ZXJvcyhzaGFwZSwgJ2Zsb2F0MzInKTtcbiAgICByZXR1cm4gY29tcGxleChyZWFsLCBpbWFnKTtcbiAgfVxuICBjb25zdCB2YWx1ZXMgPSBtYWtlT25lc1R5cGVkQXJyYXkoc2l6ZUZyb21TaGFwZShzaGFwZSksIGR0eXBlKTtcbiAgcmV0dXJuIEVOR0lORS5tYWtlVGVuc29yKHZhbHVlcywgc2hhcGUsIGR0eXBlKSBhcyBUZW5zb3I8Uj47XG59XG4iXX0=","/**\n * @license\n * Copyright 2018 Google LLC. All Rights Reserved.\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n * =============================================================================\n */\nimport { ENGINE } from '../engine';\nimport { OnesLike } from '../kernel_names';\nimport { convertToTensor } from '../tensor_util_env';\nimport { op } from './operation';\n/**\n * Creates a `tf.Tensor` with all elements set to 1 with the same shape as the\n * given tensor.\n *\n * ```js\n * const x = tf.tensor([1, 2]);\n * tf.onesLike(x).print();\n * ```\n * @param x A tensor.\n *\n * @doc {heading: 'Tensors', subheading: 'Creation'}\n */\nfunction onesLike_(x) {\n const $x = convertToTensor(x, 'x', 'onesLike');\n const inputs = { x: $x };\n return ENGINE.runKernel(OnesLike, inputs);\n}\nexport const onesLike = op({ onesLike_ });\n//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoib25lc19saWtlLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vLi4vdGZqcy1jb3JlL3NyYy9vcHMvb25lc19saWtlLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBOzs7Ozs7Ozs7Ozs7Ozs7R0FlRztBQUVILE9BQU8sRUFBQyxNQUFNLEVBQUMsTUFBTSxXQUFXLENBQUM7QUFDakMsT0FBTyxFQUFDLFFBQVEsRUFBaUIsTUFBTSxpQkFBaUIsQ0FBQztBQUd6RCxPQUFPLEVBQUMsZUFBZSxFQUFDLE1BQU0sb0JBQW9CLENBQUM7QUFHbkQsT0FBTyxFQUFDLEVBQUUsRUFBQyxNQUFNLGFBQWEsQ0FBQztBQUUvQjs7Ozs7Ozs7Ozs7R0FXRztBQUNILFNBQVMsU0FBUyxDQUFtQixDQUFlO0lBQ2xELE1BQU0sRUFBRSxHQUFHLGVBQWUsQ0FBQyxDQUFDLEVBQUUsR0FBRyxFQUFFLFVBQVUsQ0FBQyxDQUFDO0lBRS9DLE1BQU0sTUFBTSxHQUFtQixFQUFDLENBQUMsRUFBRSxFQUFFLEVBQUMsQ0FBQztJQUN2QyxPQUFPLE1BQU0sQ0FBQyxTQUFTLENBQUMsUUFBUSxFQUFFLE1BQThCLENBQUMsQ0FBQztBQUNwRSxDQUFDO0FBRUQsTUFBTSxDQUFDLE1BQU0sUUFBUSxHQUFHLEVBQUUsQ0FBQyxFQUFDLFNBQVMsRUFBQyxDQUFDLENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyIvKipcbiAqIEBsaWNlbnNlXG4gKiBDb3B5cmlnaHQgMjAxOCBHb29nbGUgTExDLiBBbGwgUmlnaHRzIFJlc2VydmVkLlxuICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlIFwiTGljZW5zZVwiKTtcbiAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS5cbiAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdFxuICpcbiAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMFxuICpcbiAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmVcbiAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuIFwiQVMgSVNcIiBCQVNJUyxcbiAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLlxuICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZFxuICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuXG4gKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuICovXG5cbmltcG9ydCB7RU5HSU5FfSBmcm9tICcuLi9lbmdpbmUnO1xuaW1wb3J0IHtPbmVzTGlrZSwgT25lc0xpa2VJbnB1dHN9IGZyb20gJy4uL2tlcm5lbF9uYW1lcyc7XG5pbXBvcnQge1RlbnNvcn0gZnJvbSAnLi4vdGVuc29yJztcbmltcG9ydCB7TmFtZWRUZW5zb3JNYXB9IGZyb20gJy4uL3RlbnNvcl90eXBlcyc7XG5pbXBvcnQge2NvbnZlcnRUb1RlbnNvcn0gZnJvbSAnLi4vdGVuc29yX3V0aWxfZW52JztcbmltcG9ydCB7VGVuc29yTGlrZX0gZnJvbSAnLi4vdHlwZXMnO1xuXG5pbXBvcnQge29wfSBmcm9tICcuL29wZXJhdGlvbic7XG5cbi8qKlxuICogQ3JlYXRlcyBhIGB0Zi5UZW5zb3JgIHdpdGggYWxsIGVsZW1lbnRzIHNldCB0byAxIHdpdGggdGhlIHNhbWUgc2hhcGUgYXMgdGhlXG4gKiBnaXZlbiB0ZW5zb3IuXG4gKlxuICogYGBganNcbiAqIGNvbnN0IHggPSB0Zi50ZW5zb3IoWzEsIDJdKTtcbiAqIHRmLm9uZXNMaWtlKHgpLnByaW50KCk7XG4gKiBgYGBcbiAqIEBwYXJhbSB4IEEgdGVuc29yLlxuICpcbiAqIEBkb2Mge2hlYWRpbmc6ICdUZW5zb3JzJywgc3ViaGVhZGluZzogJ0NyZWF0aW9uJ31cbiAqL1xuZnVuY3Rpb24gb25lc0xpa2VfPFQgZXh0ZW5kcyBUZW5zb3I+KHg6IFR8VGVuc29yTGlrZSk6IFQge1xuICBjb25zdCAkeCA9IGNvbnZlcnRUb1RlbnNvcih4LCAneCcsICdvbmVzTGlrZScpO1xuXG4gIGNvbnN0IGlucHV0czogT25lc0xpa2VJbnB1dHMgPSB7eDogJHh9O1xuICByZXR1cm4gRU5HSU5FLnJ1bktlcm5lbChPbmVzTGlrZSwgaW5wdXRzIGFzIHt9IGFzIE5hbWVkVGVuc29yTWFwKTtcbn1cblxuZXhwb3J0IGNvbnN0IG9uZXNMaWtlID0gb3Aoe29uZXNMaWtlX30pO1xuIl19","/**\n * @license\n * Copyright 2018 Google LLC. All Rights Reserved.\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n * =============================================================================\n */\nimport { ENGINE } from '../engine';\nimport { isPromise } from '../util';\nexport const OP_SCOPE_SUFFIX = '__op';\n/**\n * Used for wrapping functions that perform math operations on\n * Tensors. The function will be wrapped in a named scope that cleans all\n * memory usage after the function is done.\n */\nexport function op(f) {\n const keys = Object.keys(f);\n if (keys.length !== 1) {\n throw new Error(`Please provide an object with a single key ` +\n `(operation name) mapping to a function. Got an object with ` +\n `${keys.length} keys.`);\n }\n let opName = keys[0];\n const fn = f[opName];\n // Strip the underscore from the end of the function name.\n if (opName.endsWith('_')) {\n opName = opName.substring(0, opName.length - 1);\n }\n // add an __op suffix to distinguish ops from kernels in tf.profile\n opName = opName + OP_SCOPE_SUFFIX;\n // tslint:disable-next-line:no-any\n const f2 = (...args) => {\n ENGINE.startScope(opName);\n try {\n const result = fn(...args);\n if (isPromise(result)) {\n console.error('Cannot return a Promise inside of tidy.');\n }\n ENGINE.endScope(result);\n return result;\n }\n catch (ex) {\n ENGINE.endScope(null);\n throw ex;\n }\n };\n Object.defineProperty(f2, 'name', { value: opName, configurable: true });\n // tslint:disable-next-line:no-any\n return f2;\n}\n//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoib3BlcmF0aW9uLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vLi4vdGZqcy1jb3JlL3NyYy9vcHMvb3BlcmF0aW9uLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBOzs7Ozs7Ozs7Ozs7Ozs7R0FlRztBQUNILE9BQU8sRUFBQyxNQUFNLEVBQUMsTUFBTSxXQUFXLENBQUM7QUFDakMsT0FBTyxFQUFDLFNBQVMsRUFBQyxNQUFNLFNBQVMsQ0FBQztBQUVsQyxNQUFNLENBQUMsTUFBTSxlQUFlLEdBQUcsTUFBTSxDQUFDO0FBRXRDOzs7O0dBSUc7QUFDSCxNQUFNLFVBQVUsRUFBRSxDQUFxQixDQUFzQjtJQUMzRCxNQUFNLElBQUksR0FBRyxNQUFNLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxDQUFDO0lBQzVCLElBQUksSUFBSSxDQUFDLE1BQU0sS0FBSyxDQUFDLEVBQUU7UUFDckIsTUFBTSxJQUFJLEtBQUssQ0FDWCw2Q0FBNkM7WUFDN0MsNkRBQTZEO1lBQzdELEdBQUcsSUFBSSxDQUFDLE1BQU0sUUFBUSxDQUFDLENBQUM7S0FDN0I7SUFFRCxJQUFJLE1BQU0sR0FBRyxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUM7SUFDckIsTUFBTSxFQUFFLEdBQUcsQ0FBQyxDQUFDLE1BQU0sQ0FBQyxDQUFDO0lBRXJCLDBEQUEwRDtJQUMxRCxJQUFJLE1BQU0sQ0FBQyxRQUFRLENBQUMsR0FBRyxDQUFDLEVBQUU7UUFDeEIsTUFBTSxHQUFHLE1BQU0sQ0FBQyxTQUFTLENBQUMsQ0FBQyxFQUFFLE1BQU0sQ0FBQyxNQUFNLEdBQUcsQ0FBQyxDQUFDLENBQUM7S0FDakQ7SUFFRCxtRUFBbUU7SUFDbkUsTUFBTSxHQUFHLE1BQU0sR0FBRyxlQUFlLENBQUM7SUFFbEMsa0NBQWtDO0lBQ2xDLE1BQU0sRUFBRSxHQUFHLENBQUMsR0FBRyxJQUFXLEVBQUUsRUFBRTtRQUM1QixNQUFNLENBQUMsVUFBVSxDQUFDLE1BQU0sQ0FBQyxDQUFDO1FBQzFCLElBQUk7WUFDRixNQUFNLE1BQU0sR0FBRyxFQUFFLENBQUMsR0FBRyxJQUFJLENBQUMsQ0FBQztZQUMzQixJQUFJLFNBQVMsQ0FBQyxNQUFNLENBQUMsRUFBRTtnQkFDckIsT0FBTyxDQUFDLEtBQUssQ0FBQyx5Q0FBeUMsQ0FBQyxDQUFDO2FBQzFEO1lBQ0QsTUFBTSxDQUFDLFFBQVEsQ0FBQyxNQUFNLENBQUMsQ0FBQztZQUN4QixPQUFPLE1BQU0sQ0FBQztTQUNmO1FBQUMsT0FBTyxFQUFFLEVBQUU7WUFDWCxNQUFNLENBQUMsUUFBUSxDQUFDLElBQUksQ0FBQyxDQUFDO1lBQ3RCLE1BQU0sRUFBRSxDQUFDO1NBQ1Y7SUFDSCxDQUFDLENBQUM7SUFDRixNQUFNLENBQUMsY0FBYyxDQUFDLEVBQUUsRUFBRSxNQUFNLEVBQUUsRUFBQyxLQUFLLEVBQUUsTUFBTSxFQUFFLFlBQVksRUFBRSxJQUFJLEVBQUMsQ0FBQyxDQUFDO0lBRXZFLGtDQUFrQztJQUNsQyxPQUFPLEVBQWMsQ0FBQztBQUN4QixDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiLyoqXG4gKiBAbGljZW5zZVxuICogQ29weXJpZ2h0IDIwMTggR29vZ2xlIExMQy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC5cbiAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSBcIkxpY2Vuc2VcIik7XG4gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuXG4gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXRcbiAqXG4gKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjBcbiAqXG4gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlXG4gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiBcIkFTIElTXCIgQkFTSVMsXG4gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC5cbiAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmRcbiAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLlxuICogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbiAqL1xuaW1wb3J0IHtFTkdJTkV9IGZyb20gJy4uL2VuZ2luZSc7XG5pbXBvcnQge2lzUHJvbWlzZX0gZnJvbSAnLi4vdXRpbCc7XG5cbmV4cG9ydCBjb25zdCBPUF9TQ09QRV9TVUZGSVggPSAnX19vcCc7XG5cbi8qKlxuICogVXNlZCBmb3Igd3JhcHBpbmcgZnVuY3Rpb25zIHRoYXQgcGVyZm9ybSBtYXRoIG9wZXJhdGlvbnMgb25cbiAqIFRlbnNvcnMuIFRoZSBmdW5jdGlvbiB3aWxsIGJlIHdyYXBwZWQgaW4gYSBuYW1lZCBzY29wZSB0aGF0IGNsZWFucyBhbGxcbiAqIG1lbW9yeSB1c2FnZSBhZnRlciB0aGUgZnVuY3Rpb24gaXMgZG9uZS5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIG9wPFQgZXh0ZW5kcyBGdW5jdGlvbj4oZjoge1tuYW1lOiBzdHJpbmddOiBUfSk6IFQge1xuICBjb25zdCBrZXlzID0gT2JqZWN0LmtleXMoZik7XG4gIGlmIChrZXlzLmxlbmd0aCAhPT0gMSkge1xuICAgIHRocm93IG5ldyBFcnJvcihcbiAgICAgICAgYFBsZWFzZSBwcm92aWRlIGFuIG9iamVjdCB3aXRoIGEgc2luZ2xlIGtleSBgICtcbiAgICAgICAgYChvcGVyYXRpb24gbmFtZSkgbWFwcGluZyB0byBhIGZ1bmN0aW9uLiBHb3QgYW4gb2JqZWN0IHdpdGggYCArXG4gICAgICAgIGAke2tleXMubGVuZ3RofSBrZXlzLmApO1xuICB9XG5cbiAgbGV0IG9wTmFtZSA9IGtleXNbMF07XG4gIGNvbnN0IGZuID0gZltvcE5hbWVdO1xuXG4gIC8vIFN0cmlwIHRoZSB1bmRlcnNjb3JlIGZyb20gdGhlIGVuZCBvZiB0aGUgZnVuY3Rpb24gbmFtZS5cbiAgaWYgKG9wTmFtZS5lbmRzV2l0aCgnXycpKSB7XG4gICAgb3BOYW1lID0gb3BOYW1lLnN1YnN0cmluZygwLCBvcE5hbWUubGVuZ3RoIC0gMSk7XG4gIH1cblxuICAvLyBhZGQgYW4gX19vcCBzdWZmaXggdG8gZGlzdGluZ3Vpc2ggb3BzIGZyb20ga2VybmVscyBpbiB0Zi5wcm9maWxlXG4gIG9wTmFtZSA9IG9wTmFtZSArIE9QX1NDT1BFX1NVRkZJWDtcblxuICAvLyB0c2xpbnQ6ZGlzYWJsZS1uZXh0LWxpbmU6bm8tYW55XG4gIGNvbnN0IGYyID0gKC4uLmFyZ3M6IGFueVtdKSA9PiB7XG4gICAgRU5HSU5FLnN0YXJ0U2NvcGUob3BOYW1lKTtcbiAgICB0cnkge1xuICAgICAgY29uc3QgcmVzdWx0ID0gZm4oLi4uYXJncyk7XG4gICAgICBpZiAoaXNQcm9taXNlKHJlc3VsdCkpIHtcbiAgICAgICAgY29uc29sZS5lcnJvcignQ2Fubm90IHJldHVybiBhIFByb21pc2UgaW5zaWRlIG9mIHRpZHkuJyk7XG4gICAgICB9XG4gICAgICBFTkdJTkUuZW5kU2NvcGUocmVzdWx0KTtcbiAgICAgIHJldHVybiByZXN1bHQ7XG4gICAgfSBjYXRjaCAoZXgpIHtcbiAgICAgIEVOR0lORS5lbmRTY29wZShudWxsKTtcbiAgICAgIHRocm93IGV4O1xuICAgIH1cbiAgfTtcbiAgT2JqZWN0LmRlZmluZVByb3BlcnR5KGYyLCAnbmFtZScsIHt2YWx1ZTogb3BOYW1lLCBjb25maWd1cmFibGU6IHRydWV9KTtcblxuICAvLyB0c2xpbnQ6ZGlzYWJsZS1uZXh0LWxpbmU6bm8tYW55XG4gIHJldHVybiBmMiBhcyBhbnkgYXMgVDtcbn1cbiJdfQ==","/**\n * @license\n * Copyright 2020 Google LLC. All Rights Reserved.\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n * =============================================================================\n */\nimport { ENGINE } from '../engine';\nimport { AddN } from '../kernel_names';\nimport { convertToTensor } from '../tensor_util_env';\nimport * as util from '../util';\nimport { op } from './operation';\n/**\n * Adds a list of `tf.Tensor`s element-wise, each with the same shape and dtype.\n *\n * ```js\n * const a = tf.tensor1d([1, 2]);\n * const b = tf.tensor1d([3, 4]);\n * const c = tf.tensor1d([5, 6]);\n *\n * tf.addN([a, b, c]).print();\n * ```\n * @param tensors A list of tensors with the same shape and dtype.\n * @doc {heading: 'Operations', subheading: 'Arithmetic'}\n */\nfunction addN_(tensors) {\n util.assert(Array.isArray(tensors), () => 'The argument passed to tf.addN() must be a list of tensors');\n util.assert(tensors.length >= 1, () => `Must pass at least one tensor to tf.addN(), but got ` +\n `${tensors.length}`);\n const $tensors = tensors.map((t, i) => convertToTensor(t, `tensors${i}`, 'addN'));\n const firstTensor = $tensors[0];\n $tensors.forEach(t => {\n if (t.dtype !== firstTensor.dtype) {\n throw new Error('All tensors passed to tf.addN() must have the same dtype');\n }\n });\n $tensors.forEach(t => {\n if (!util.arraysEqual(t.shape, firstTensor.shape)) {\n throw new Error('All tensors passed to tf.addN() must have the same shape');\n }\n });\n const inputs = $tensors;\n return ENGINE.runKernel(AddN, inputs);\n}\nexport const addN = op({ addN_ });\n//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYWRkX24uanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi8uLi90ZmpzLWNvcmUvc3JjL29wcy9hZGRfbi50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQTs7Ozs7Ozs7Ozs7Ozs7O0dBZUc7QUFDSCxPQUFPLEVBQUMsTUFBTSxFQUFDLE1BQU0sV0FBVyxDQUFDO0FBQ2pDLE9BQU8sRUFBQyxJQUFJLEVBQWEsTUFBTSxpQkFBaUIsQ0FBQztBQUdqRCxPQUFPLEVBQUMsZUFBZSxFQUFDLE1BQU0sb0JBQW9CLENBQUM7QUFFbkQsT0FBTyxLQUFLLElBQUksTUFBTSxTQUFTLENBQUM7QUFFaEMsT0FBTyxFQUFDLEVBQUUsRUFBQyxNQUFNLGFBQWEsQ0FBQztBQUUvQjs7Ozs7Ozs7Ozs7O0dBWUc7QUFDSCxTQUFTLEtBQUssQ0FBbUIsT0FBNEI7SUFDM0QsSUFBSSxDQUFDLE1BQU0sQ0FDUCxLQUFLLENBQUMsT0FBTyxDQUFDLE9BQU8sQ0FBQyxFQUN0QixHQUFHLEVBQUUsQ0FBQyw0REFBNEQsQ0FBQyxDQUFDO0lBQ3hFLElBQUksQ0FBQyxNQUFNLENBQ1AsT0FBTyxDQUFDLE1BQU0sSUFBSSxDQUFDLEVBQ25CLEdBQUcsRUFBRSxDQUFDLHNEQUFzRDtRQUN4RCxHQUFHLE9BQU8sQ0FBQyxNQUFNLEVBQUUsQ0FBQyxDQUFDO0lBRTdCLE1BQU0sUUFBUSxHQUNWLE9BQU8sQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxFQUFFLEVBQUUsQ0FBQyxlQUFlLENBQUMsQ0FBQyxFQUFFLFVBQVUsQ0FBQyxFQUFFLEVBQUUsTUFBTSxDQUFDLENBQUMsQ0FBQztJQUVyRSxNQUFNLFdBQVcsR0FBRyxRQUFRLENBQUMsQ0FBQyxDQUFDLENBQUM7SUFDaEMsUUFBUSxDQUFDLE9BQU8sQ0FBQyxDQUFDLENBQUMsRUFBRTtRQUNuQixJQUFJLENBQUMsQ0FBQyxLQUFLLEtBQUssV0FBVyxDQUFDLEtBQUssRUFBRTtZQUNqQyxNQUFNLElBQUksS0FBSyxDQUNYLDBEQUEwRCxDQUFDLENBQUM7U0FDakU7SUFDSCxDQUFDLENBQUMsQ0FBQztJQUVILFFBQVEsQ0FBQyxPQUFPLENBQUMsQ0FBQyxDQUFDLEVBQUU7UUFDbkIsSUFBSSxDQUFDLElBQUksQ0FBQyxXQUFXLENBQUMsQ0FBQyxDQUFDLEtBQUssRUFBRSxXQUFXLENBQUMsS0FBSyxDQUFDLEVBQUU7WUFDakQsTUFBTSxJQUFJLEtBQUssQ0FDWCwwREFBMEQsQ0FBQyxDQUFDO1NBQ2pFO0lBQ0gsQ0FBQyxDQUFDLENBQUM7SUFFSCxNQUFNLE1BQU0sR0FBZSxRQUFRLENBQUM7SUFFcEMsT0FBTyxNQUFNLENBQUMsU0FBUyxDQUFDLElBQUksRUFBRSxNQUE4QixDQUFDLENBQUM7QUFDaEUsQ0FBQztBQUVELE1BQU0sQ0FBQyxNQUFNLElBQUksR0FBRyxFQUFFLENBQUMsRUFBQyxLQUFLLEVBQUMsQ0FBQyxDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiLyoqXG4gKiBAbGljZW5zZVxuICogQ29weXJpZ2h0IDIwMjAgR29vZ2xlIExMQy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC5cbiAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSBcIkxpY2Vuc2VcIik7XG4gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuXG4gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXRcbiAqXG4gKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjBcbiAqXG4gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlXG4gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiBcIkFTIElTXCIgQkFTSVMsXG4gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC5cbiAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmRcbiAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLlxuICogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbiAqL1xuaW1wb3J0IHtFTkdJTkV9IGZyb20gJy4uL2VuZ2luZSc7XG5pbXBvcnQge0FkZE4sIEFkZE5JbnB1dHN9IGZyb20gJy4uL2tlcm5lbF9uYW1lcyc7XG5pbXBvcnQge1RlbnNvcn0gZnJvbSAnLi4vdGVuc29yJztcbmltcG9ydCB7TmFtZWRUZW5zb3JNYXB9IGZyb20gJy4uL3RlbnNvcl90eXBlcyc7XG5pbXBvcnQge2NvbnZlcnRUb1RlbnNvcn0gZnJvbSAnLi4vdGVuc29yX3V0aWxfZW52JztcbmltcG9ydCB7VGVuc29yTGlrZX0gZnJvbSAnLi4vdHlwZXMnO1xuaW1wb3J0ICogYXMgdXRpbCBmcm9tICcuLi91dGlsJztcblxuaW1wb3J0IHtvcH0gZnJvbSAnLi9vcGVyYXRpb24nO1xuXG4vKipcbiAqIEFkZHMgYSBsaXN0IG9mIGB0Zi5UZW5zb3JgcyBlbGVtZW50LXdpc2UsIGVhY2ggd2l0aCB0aGUgc2FtZSBzaGFwZSBhbmQgZHR5cGUuXG4gKlxuICogYGBganNcbiAqIGNvbnN0IGEgPSB0Zi50ZW5zb3IxZChbMSwgMl0pO1xuICogY29uc3QgYiA9IHRmLnRlbnNvcjFkKFszLCA0XSk7XG4gKiBjb25zdCBjID0gdGYudGVuc29yMWQoWzUsIDZdKTtcbiAqXG4gKiB0Zi5hZGROKFthLCBiLCBjXSkucHJpbnQoKTtcbiAqIGBgYFxuICogQHBhcmFtIHRlbnNvcnMgQSBsaXN0IG9mIHRlbnNvcnMgd2l0aCB0aGUgc2FtZSBzaGFwZSBhbmQgZHR5cGUuXG4gKiBAZG9jIHtoZWFkaW5nOiAnT3BlcmF0aW9ucycsIHN1YmhlYWRpbmc6ICdBcml0aG1ldGljJ31cbiAqL1xuZnVuY3Rpb24gYWRkTl88VCBleHRlbmRzIFRlbnNvcj4odGVuc29yczogQXJyYXk8VHxUZW5zb3JMaWtlPik6IFQge1xuICB1dGlsLmFzc2VydChcbiAgICAgIEFycmF5LmlzQXJyYXkodGVuc29ycyksXG4gICAgICAoKSA9PiAnVGhlIGFyZ3VtZW50IHBhc3NlZCB0byB0Zi5hZGROKCkgbXVzdCBiZSBhIGxpc3Qgb2YgdGVuc29ycycpO1xuICB1dGlsLmFzc2VydChcbiAgICAgIHRlbnNvcnMubGVuZ3RoID49IDEsXG4gICAgICAoKSA9PiBgTXVzdCBwYXNzIGF0IGxlYXN0IG9uZSB0ZW5zb3IgdG8gdGYuYWRkTigpLCBidXQgZ290IGAgK1xuICAgICAgICAgIGAke3RlbnNvcnMubGVuZ3RofWApO1xuXG4gIGNvbnN0ICR0ZW5zb3JzID1cbiAgICAgIHRlbnNvcnMubWFwKCh0LCBpKSA9PiBjb252ZXJ0VG9UZW5zb3IodCwgYHRlbnNvcnMke2l9YCwgJ2FkZE4nKSk7XG5cbiAgY29uc3QgZmlyc3RUZW5zb3IgPSAkdGVuc29yc1swXTtcbiAgJHRlbnNvcnMuZm9yRWFjaCh0ID0+IHtcbiAgICBpZiAodC5kdHlwZSAhPT0gZmlyc3RUZW5zb3IuZHR5cGUpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcihcbiAgICAgICAgICAnQWxsIHRlbnNvcnMgcGFzc2VkIHRvIHRmLmFkZE4oKSBtdXN0IGhhdmUgdGhlIHNhbWUgZHR5cGUnKTtcbiAgICB9XG4gIH0pO1xuXG4gICR0ZW5zb3JzLmZvckVhY2godCA9PiB7XG4gICAgaWYgKCF1dGlsLmFycmF5c0VxdWFsKHQuc2hhcGUsIGZpcnN0VGVuc29yLnNoYXBlKSkge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKFxuICAgICAgICAgICdBbGwgdGVuc29ycyBwYXNzZWQgdG8gdGYuYWRkTigpIG11c3QgaGF2ZSB0aGUgc2FtZSBzaGFwZScpO1xuICAgIH1cbiAgfSk7XG5cbiAgY29uc3QgaW5wdXRzOiBBZGROSW5wdXRzID0gJHRlbnNvcnM7XG5cbiAgcmV0dXJuIEVOR0lORS5ydW5LZXJuZWwoQWRkTiwgaW5wdXRzIGFzIHt9IGFzIE5hbWVkVGVuc29yTWFwKTtcbn1cblxuZXhwb3J0IGNvbnN0IGFkZE4gPSBvcCh7YWRkTl99KTtcbiJdfQ==","/**\n * @license\n * Copyright 2020 Google LLC. All Rights Reserved.\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n * =============================================================================\n */\nimport { ENGINE } from '../engine';\nimport { AvgPool3D } from '../kernel_names';\nimport { convertToTensor } from '../tensor_util_env';\nimport * as util from '../util';\nimport { checkPadOnDimRoundingMode } from './conv_util';\nimport { cast } from './cast';\nimport { op } from './operation';\nimport { reshape } from './reshape';\n/**\n * Computes the 3D average pooling.\n *\n * ```js\n * const x = tf.tensor5d([1, 2, 3, 4, 5, 6, 7, 8], [1, 2, 2, 2, 1]);\n * const result = tf.avgPool3d(x, 2, 1, 'valid');\n * result.print();\n * ```\n *\n * @param x The input tensor, of rank 5 or rank 4 of shape\n * `[batch, depth, height, width, inChannels]`.\n * @param filterSize The filter size:\n * `[filterDepth, filterHeight, filterWidth]`.\n * If `filterSize` is a single number,\n * then `filterDepth == filterHeight == filterWidth`.\n * @param strides The strides of the pooling:\n * `[strideDepth, strideHeight, strideWidth]`.\n * If `strides` is a single number,\n * then `strideDepth == strideHeight == strideWidth`.\n * @param pad The type of padding algorithm.\n * - `same` and stride 1: output will be of same size as input,\n * regardless of filter size.\n * - `valid`: output will be smaller than input if filter is larger\n * than 1*1x1.\n * - For more info, see this guide:\n * [https://www.tensorflow.org/api_docs/python/tf/nn/convolution](\n * https://www.tensorflow.org/api_docs/python/tf/nn/convolution)\n * @param dimRoundingMode A string from: 'ceil', 'round', 'floor'. If none is\n * provided, it will default to truncate.\n * @param dataFormat An optional string from: \"NDHWC\", \"NCDHW\". Defaults to\n * \"NDHWC\". Specify the data format of the input and output data. With the\n * default format \"NDHWC\", the data is stored in the order of: [batch,\n * depth, height, width, channels]. Only \"NDHWC\" is currently supported.\n *\n * @doc {heading: 'Operations', subheading: 'Convolution'}\n */\nfunction avgPool3d_(x, filterSize, strides, pad, dimRoundingMode, dataFormat = 'NDHWC') {\n const $x = convertToTensor(x, 'x', 'avgPool3d', 'float32');\n let x5D = $x;\n let reshapedTo5D = false;\n if ($x.rank === 4) {\n reshapedTo5D = true;\n x5D = reshape($x, [1, $x.shape[0], $x.shape[1], $x.shape[2], $x.shape[3]]);\n }\n util.assert(x5D.rank === 5, () => `Error in avgPool3d: x must be rank 5 but got rank ${x5D.rank}.`);\n util.assert(dataFormat === 'NDHWC', () => `Error in avgPool3d: Only NDHWC is currently supported, ` +\n `but got dataFormat of ${dataFormat}`);\n checkPadOnDimRoundingMode('avgPool3d', pad, dimRoundingMode);\n const inputs = { x: x5D };\n const attrs = { filterSize, strides, pad, dimRoundingMode, dataFormat };\n // tslint:disable-next-line: no-unnecessary-type-assertion\n let res = ENGINE.runKernel(AvgPool3D, inputs, attrs);\n res = cast(res, x5D.dtype);\n if (reshapedTo5D) {\n return reshape(res, [res.shape[1], res.shape[2], res.shape[3], res.shape[4]]);\n }\n return res;\n}\nexport const avgPool3d = op({ avgPool3d_ });\n//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYXZnX3Bvb2xfM2QuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi8uLi90ZmpzLWNvcmUvc3JjL29wcy9hdmdfcG9vbF8zZC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQTs7Ozs7Ozs7Ozs7Ozs7O0dBZUc7QUFFSCxPQUFPLEVBQUMsTUFBTSxFQUFDLE1BQU0sV0FBVyxDQUFDO0FBQ2pDLE9BQU8sRUFBQyxTQUFTLEVBQWtDLE1BQU0saUJBQWlCLENBQUM7QUFJM0UsT0FBTyxFQUFDLGVBQWUsRUFBQyxNQUFNLG9CQUFvQixDQUFDO0FBRW5ELE9BQU8sS0FBSyxJQUFJLE1BQU0sU0FBUyxDQUFDO0FBRWhDLE9BQU8sRUFBQyx5QkFBeUIsRUFBQyxNQUFNLGFBQWEsQ0FBQztBQUN0RCxPQUFPLEVBQUMsSUFBSSxFQUFDLE1BQU0sUUFBUSxDQUFDO0FBQzVCLE9BQU8sRUFBQyxFQUFFLEVBQUMsTUFBTSxhQUFhLENBQUM7QUFDL0IsT0FBTyxFQUFDLE9BQU8sRUFBQyxNQUFNLFdBQVcsQ0FBQztBQUVsQzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7R0FtQ0c7QUFDSCxTQUFTLFVBQVUsQ0FDZixDQUFlLEVBQUUsVUFBMkMsRUFDNUQsT0FBd0MsRUFBRSxHQUEwQixFQUNwRSxlQUF3QyxFQUN4QyxhQUE4QixPQUFPO0lBQ3ZDLE1BQU0sRUFBRSxHQUFHLGVBQWUsQ0FBQyxDQUFDLEVBQUUsR0FBRyxFQUFFLFdBQVcsRUFBRSxTQUFTLENBQUMsQ0FBQztJQUUzRCxJQUFJLEdBQUcsR0FBRyxFQUFjLENBQUM7SUFDekIsSUFBSSxZQUFZLEdBQUcsS0FBSyxDQUFDO0lBQ3pCLElBQUksRUFBRSxDQUFDLElBQUksS0FBSyxDQUFDLEVBQUU7UUFDakIsWUFBWSxHQUFHLElBQUksQ0FBQztRQUNwQixHQUFHLEdBQUcsT0FBTyxDQUFDLEVBQUUsRUFBRSxDQUFDLENBQUMsRUFBRSxFQUFFLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQyxFQUFFLEVBQUUsQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDLEVBQUUsRUFBRSxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUMsRUFBRSxFQUFFLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQztLQUM1RTtJQUVELElBQUksQ0FBQyxNQUFNLENBQ1AsR0FBRyxDQUFDLElBQUksS0FBSyxDQUFDLEVBQ2QsR0FBRyxFQUFFLENBQUMscURBQXFELEdBQUcsQ0FBQyxJQUFJLEdBQUcsQ0FBQyxDQUFDO0lBQzVFLElBQUksQ0FBQyxNQUFNLENBQ1AsVUFBVSxLQUFLLE9BQU8sRUFDdEIsR0FBRyxFQUFFLENBQUMseURBQXlEO1FBQzNELHlCQUF5QixVQUFVLEVBQUUsQ0FBQyxDQUFDO0lBQy9DLHlCQUF5QixDQUFDLFdBQVcsRUFBRSxHQUFHLEVBQUUsZUFBZSxDQUFDLENBQUM7SUFDN0QsTUFBTSxNQUFNLEdBQW9CLEVBQUMsQ0FBQyxFQUFFLEdBQUcsRUFBQyxDQUFDO0lBQ3pDLE1BQU0sS0FBSyxHQUNVLEVBQUMsVUFBVSxFQUFFLE9BQU8sRUFBRSxHQUFHLEVBQUUsZUFBZSxFQUFFLFVBQVUsRUFBQyxDQUFDO0lBRTdFLDBEQUEwRDtJQUMxRCxJQUFJLEdBQUcsR0FBRyxNQUFNLENBQUMsU0FBUyxDQUNaLFNBQVMsRUFBRSxNQUE4QixFQUN6QyxLQUEyQixDQUFNLENBQUM7SUFFaEQsR0FBRyxHQUFHLElBQUksQ0FBQyxHQUFHLEVBQUUsR0FBRyxDQUFDLEtBQUssQ0FBQyxDQUFDO0lBRTNCLElBQUksWUFBWSxFQUFFO1FBQ2hCLE9BQU8sT0FBTyxDQUNILEdBQUcsRUFBRSxDQUFDLEdBQUcsQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDLEVBQUUsR0FBRyxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUMsRUFBRSxHQUFHLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQyxFQUFFLEdBQUcsQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FDbkUsQ0FBQztLQUNQO0lBRUQsT0FBTyxHQUFHLENBQUM7QUFDYixDQUFDO0FBRUQsTUFBTSxDQUFDLE1BQU0sU0FBUyxHQUFHLEVBQUUsQ0FBQyxFQUFDLFVBQVUsRUFBQyxDQUFDLENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyIvKipcbiAqIEBsaWNlbnNlXG4gKiBDb3B5cmlnaHQgMjAyMCBHb29nbGUgTExDLiBBbGwgUmlnaHRzIFJlc2VydmVkLlxuICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlIFwiTGljZW5zZVwiKTtcbiAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS5cbiAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdFxuICpcbiAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMFxuICpcbiAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmVcbiAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuIFwiQVMgSVNcIiBCQVNJUyxcbiAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLlxuICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZFxuICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuXG4gKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuICovXG5cbmltcG9ydCB7RU5HSU5FfSBmcm9tICcuLi9lbmdpbmUnO1xuaW1wb3J0IHtBdmdQb29sM0QsIEF2Z1Bvb2wzREF0dHJzLCBBdmdQb29sM0RJbnB1dHN9IGZyb20gJy4uL2tlcm5lbF9uYW1lcyc7XG5pbXBvcnQge05hbWVkQXR0ck1hcH0gZnJvbSAnLi4va2VybmVsX3JlZ2lzdHJ5JztcbmltcG9ydCB7VGVuc29yNEQsIFRlbnNvcjVEfSBmcm9tICcuLi90ZW5zb3InO1xuaW1wb3J0IHtOYW1lZFRlbnNvck1hcH0gZnJvbSAnLi4vdGVuc29yX3R5cGVzJztcbmltcG9ydCB7Y29udmVydFRvVGVuc29yfSBmcm9tICcuLi90ZW5zb3JfdXRpbF9lbnYnO1xuaW1wb3J0IHtUZW5zb3JMaWtlfSBmcm9tICcuLi90eXBlcyc7XG5pbXBvcnQgKiBhcyB1dGlsIGZyb20gJy4uL3V0aWwnO1xuXG5pbXBvcnQge2NoZWNrUGFkT25EaW1Sb3VuZGluZ01vZGV9IGZyb20gJy4vY29udl91dGlsJztcbmltcG9ydCB7Y2FzdH0gZnJvbSAnLi9jYXN0JztcbmltcG9ydCB7b3B9IGZyb20gJy4vb3BlcmF0aW9uJztcbmltcG9ydCB7cmVzaGFwZX0gZnJvbSAnLi9yZXNoYXBlJztcblxuLyoqXG4gKiBDb21wdXRlcyB0aGUgM0QgYXZlcmFnZSBwb29saW5nLlxuICpcbiAqIGBgYGpzXG4gKiBjb25zdCB4ID0gdGYudGVuc29yNWQoWzEsIDIsIDMsIDQsIDUsIDYsIDcsIDhdLCBbMSwgMiwgMiwgMiwgMV0pO1xuICogY29uc3QgcmVzdWx0ID0gdGYuYXZnUG9vbDNkKHgsIDIsIDEsICd2YWxpZCcpO1xuICogcmVzdWx0LnByaW50KCk7XG4gKiBgYGBcbiAqXG4gKiBAcGFyYW0geCBUaGUgaW5wdXQgdGVuc29yLCBvZiByYW5rIDUgb3IgcmFuayA0IG9mIHNoYXBlXG4gKiAgICAgYFtiYXRjaCwgZGVwdGgsIGhlaWdodCwgd2lkdGgsIGluQ2hhbm5lbHNdYC5cbiAqIEBwYXJhbSBmaWx0ZXJTaXplIFRoZSBmaWx0ZXIgc2l6ZTpcbiAqICAgICBgW2ZpbHRlckRlcHRoLCBmaWx0ZXJIZWlnaHQsIGZpbHRlcldpZHRoXWAuXG4gKiAgICAgSWYgYGZpbHRlclNpemVgIGlzIGEgc2luZ2xlIG51bWJlcixcbiAqICAgICB0aGVuIGBmaWx0ZXJEZXB0aCA9PSBmaWx0ZXJIZWlnaHQgPT0gZmlsdGVyV2lkdGhgLlxuICogQHBhcmFtIHN0cmlkZXMgVGhlIHN0cmlkZXMgb2YgdGhlIHBvb2xpbmc6XG4gKiAgICAgYFtzdHJpZGVEZXB0aCwgc3RyaWRlSGVpZ2h0LCBzdHJpZGVXaWR0aF1gLlxuICogICAgIElmIGBzdHJpZGVzYCBpcyBhIHNpbmdsZSBudW1iZXIsXG4gKiAgICAgdGhlbiBgc3RyaWRlRGVwdGggPT0gc3RyaWRlSGVpZ2h0ID09IHN0cmlkZVdpZHRoYC5cbiAqIEBwYXJhbSBwYWQgVGhlIHR5cGUgb2YgcGFkZGluZyBhbGdvcml0aG0uXG4gKiAgICAtIGBzYW1lYCBhbmQgc3RyaWRlIDE6IG91dHB1dCB3aWxsIGJlIG9mIHNhbWUgc2l6ZSBhcyBpbnB1dCxcbiAqICAgICAgIHJlZ2FyZGxlc3Mgb2YgZmlsdGVyIHNpemUuXG4gKiAgICAtIGB2YWxpZGA6IG91dHB1dCB3aWxsIGJlIHNtYWxsZXIgdGhhbiBpbnB1dCBpZiBmaWx0ZXIgaXMgbGFyZ2VyXG4gKiAgICAgICB0aGFuIDEqMXgxLlxuICogICAgLSBGb3IgbW9yZSBpbmZvLCBzZWUgdGhpcyBndWlkZTpcbiAqICAgICBbaHR0cHM6Ly93d3cudGVuc29yZmxvdy5vcmcvYXBpX2RvY3MvcHl0aG9uL3RmL25uL2NvbnZvbHV0aW9uXShcbiAqICAgICAgICAgIGh0dHBzOi8vd3d3LnRlbnNvcmZsb3cub3JnL2FwaV9kb2NzL3B5dGhvbi90Zi9ubi9jb252b2x1dGlvbilcbiAqIEBwYXJhbSBkaW1Sb3VuZGluZ01vZGUgQSBzdHJpbmcgZnJvbTogJ2NlaWwnLCAncm91bmQnLCAnZmxvb3InLiBJZiBub25lIGlzXG4gKiAgICAgcHJvdmlkZWQsIGl0IHdpbGwgZGVmYXVsdCB0byB0cnVuY2F0ZS5cbiAqIEBwYXJhbSBkYXRhRm9ybWF0IEFuIG9wdGlvbmFsIHN0cmluZyBmcm9tOiBcIk5ESFdDXCIsIFwiTkNESFdcIi4gRGVmYXVsdHMgdG9cbiAqICAgICBcIk5ESFdDXCIuIFNwZWNpZnkgdGhlIGRhdGEgZm9ybWF0IG9mIHRoZSBpbnB1dCBhbmQgb3V0cHV0IGRhdGEuIFdpdGggdGhlXG4gKiAgICAgZGVmYXVsdCBmb3JtYXQgXCJOREhXQ1wiLCB0aGUgZGF0YSBpcyBzdG9yZWQgaW4gdGhlIG9yZGVyIG9mOiBbYmF0Y2gsXG4gKiAgICAgZGVwdGgsIGhlaWdodCwgd2lkdGgsIGNoYW5uZWxzXS4gT25seSBcIk5ESFdDXCIgaXMgY3VycmVudGx5IHN1cHBvcnRlZC5cbiAqXG4gKiBAZG9jIHtoZWFkaW5nOiAnT3BlcmF0aW9ucycsIHN1YmhlYWRpbmc6ICdDb252b2x1dGlvbid9XG4gKi9cbmZ1bmN0aW9uIGF2Z1Bvb2wzZF88VCBleHRlbmRzIFRlbnNvcjREfFRlbnNvcjVEPihcbiAgICB4OiBUfFRlbnNvckxpa2UsIGZpbHRlclNpemU6IFtudW1iZXIsIG51bWJlciwgbnVtYmVyXXxudW1iZXIsXG4gICAgc3RyaWRlczogW251bWJlciwgbnVtYmVyLCBudW1iZXJdfG51bWJlciwgcGFkOiAndmFsaWQnfCdzYW1lJ3xudW1iZXIsXG4gICAgZGltUm91bmRpbmdNb2RlPzogJ2Zsb29yJ3wncm91bmQnfCdjZWlsJyxcbiAgICBkYXRhRm9ybWF0OiAnTkRIV0MnfCdOQ0RIVycgPSAnTkRIV0MnKTogVCB7XG4gIGNvbnN0ICR4ID0gY29udmVydFRvVGVuc29yKHgsICd4JywgJ2F2Z1Bvb2wzZCcsICdmbG9hdDMyJyk7XG5cbiAgbGV0IHg1RCA9ICR4IGFzIFRlbnNvcjVEO1xuICBsZXQgcmVzaGFwZWRUbzVEID0gZmFsc2U7XG4gIGlmICgkeC5yYW5rID09PSA0KSB7XG4gICAgcmVzaGFwZWRUbzVEID0gdHJ1ZTtcbiAgICB4NUQgPSByZXNoYXBlKCR4LCBbMSwgJHguc2hhcGVbMF0sICR4LnNoYXBlWzFdLCAkeC5zaGFwZVsyXSwgJHguc2hhcGVbM11dKTtcbiAgfVxuXG4gIHV0aWwuYXNzZXJ0KFxuICAgICAgeDVELnJhbmsgPT09IDUsXG4gICAgICAoKSA9PiBgRXJyb3IgaW4gYXZnUG9vbDNkOiB4IG11c3QgYmUgcmFuayA1IGJ1dCBnb3QgcmFuayAke3g1RC5yYW5rfS5gKTtcbiAgdXRpbC5hc3NlcnQoXG4gICAgICBkYXRhRm9ybWF0ID09PSAnTkRIV0MnLFxuICAgICAgKCkgPT4gYEVycm9yIGluIGF2Z1Bvb2wzZDogT25seSBOREhXQyBpcyBjdXJyZW50bHkgc3VwcG9ydGVkLCBgICtcbiAgICAgICAgICBgYnV0IGdvdCBkYXRhRm9ybWF0IG9mICR7ZGF0YUZvcm1hdH1gKTtcbiAgY2hlY2tQYWRPbkRpbVJvdW5kaW5nTW9kZSgnYXZnUG9vbDNkJywgcGFkLCBkaW1Sb3VuZGluZ01vZGUpO1xuICBjb25zdCBpbnB1dHM6IEF2Z1Bvb2wzRElucHV0cyA9IHt4OiB4NUR9O1xuICBjb25zdCBhdHRyczpcbiAgICAgIEF2Z1Bvb2wzREF0dHJzID0ge2ZpbHRlclNpemUsIHN0cmlkZXMsIHBhZCwgZGltUm91bmRpbmdNb2RlLCBkYXRhRm9ybWF0fTtcblxuICAvLyB0c2xpbnQ6ZGlzYWJsZS1uZXh0LWxpbmU6IG5vLXVubmVjZXNzYXJ5LXR5cGUtYXNzZXJ0aW9uXG4gIGxldCByZXMgPSBFTkdJTkUucnVuS2VybmVsKFxuICAgICAgICAgICAgICAgIEF2Z1Bvb2wzRCwgaW5wdXRzIGFzIHt9IGFzIE5hbWVkVGVuc29yTWFwLFxuICAgICAgICAgICAgICAgIGF0dHJzIGFzIHt9IGFzIE5hbWVkQXR0ck1hcCkgYXMgVDtcblxuICByZXMgPSBjYXN0KHJlcywgeDVELmR0eXBlKTtcblxuICBpZiAocmVzaGFwZWRUbzVEKSB7XG4gICAgcmV0dXJuIHJlc2hhcGUoXG4gICAgICAgICAgICAgICByZXMsIFtyZXMuc2hhcGVbMV0sIHJlcy5zaGFwZVsyXSwgcmVzLnNoYXBlWzNdLCByZXMuc2hhcGVbNF1dKSBhc1xuICAgICAgICBUO1xuICB9XG5cbiAgcmV0dXJuIHJlcztcbn1cblxuZXhwb3J0IGNvbnN0IGF2Z1Bvb2wzZCA9IG9wKHthdmdQb29sM2RffSk7XG4iXX0=","/**\n * @license\n * Copyright 2020 Google LLC. All Rights Reserved.\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n * =============================================================================\n */\nimport { convertToTensor } from '../tensor_util_env';\nimport { add } from './add';\nimport { concat } from './concat';\nimport { matMul } from './mat_mul';\nimport { mul } from './mul';\nimport { op } from './operation';\nimport { sigmoid } from './sigmoid';\nimport { slice } from './slice';\nimport { tanh } from './tanh';\n/**\n * Computes the next state and output of a BasicLSTMCell.\n *\n * Returns `[newC, newH]`.\n *\n * Derived from tf.contrib.rnn.BasicLSTMCell.\n *\n * @param forgetBias Forget bias for the cell.\n * @param lstmKernel The weights for the cell.\n * @param lstmBias The bias for the cell.\n * @param data The input to the cell.\n * @param c Previous cell state.\n * @param h Previous cell output.\n *\n * @doc {heading: 'Operations', subheading: 'RNN'}\n */\nfunction basicLSTMCell_(forgetBias, lstmKernel, lstmBias, data, c, h) {\n const $forgetBias = convertToTensor(forgetBias, 'forgetBias', 'basicLSTMCell');\n const $lstmKernel = convertToTensor(lstmKernel, 'lstmKernel', 'basicLSTMCell');\n const $lstmBias = convertToTensor(lstmBias, 'lstmBias', 'basicLSTMCell');\n const $data = convertToTensor(data, 'data', 'basicLSTMCell');\n const $c = convertToTensor(c, 'c', 'basicLSTMCell');\n const $h = convertToTensor(h, 'h', 'basicLSTMCell');\n const combined = concat([$data, $h], 1);\n const weighted = matMul(combined, $lstmKernel);\n const res = add(weighted, $lstmBias);\n // i = input_gate, j = new_input, f = forget_gate, o = output_gate\n const batchSize = res.shape[0];\n const sliceCols = res.shape[1] / 4;\n const sliceSize = [batchSize, sliceCols];\n const i = slice(res, [0, 0], sliceSize);\n const j = slice(res, [0, sliceCols], sliceSize);\n const f = slice(res, [0, sliceCols * 2], sliceSize);\n const o = slice(res, [0, sliceCols * 3], sliceSize);\n const newC = add(mul(sigmoid(i), tanh(j)), mul($c, sigmoid(add($forgetBias, f))));\n const newH = mul(tanh(newC), sigmoid(o));\n return [newC, newH];\n}\nexport const basicLSTMCell = op({ basicLSTMCell_ });\n//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYmFzaWNfbHN0bV9jZWxsLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vLi4vdGZqcy1jb3JlL3NyYy9vcHMvYmFzaWNfbHN0bV9jZWxsLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBOzs7Ozs7Ozs7Ozs7Ozs7R0FlRztBQUdILE9BQU8sRUFBQyxlQUFlLEVBQUMsTUFBTSxvQkFBb0IsQ0FBQztBQUduRCxPQUFPLEVBQUMsR0FBRyxFQUFDLE1BQU0sT0FBTyxDQUFDO0FBQzFCLE9BQU8sRUFBQyxNQUFNLEVBQUMsTUFBTSxVQUFVLENBQUM7QUFDaEMsT0FBTyxFQUFDLE1BQU0sRUFBQyxNQUFNLFdBQVcsQ0FBQztBQUNqQyxPQUFPLEVBQUMsR0FBRyxFQUFDLE1BQU0sT0FBTyxDQUFDO0FBQzFCLE9BQU8sRUFBQyxFQUFFLEVBQUMsTUFBTSxhQUFhLENBQUM7QUFDL0IsT0FBTyxFQUFDLE9BQU8sRUFBQyxNQUFNLFdBQVcsQ0FBQztBQUNsQyxPQUFPLEVBQUMsS0FBSyxFQUFDLE1BQU0sU0FBUyxDQUFDO0FBQzlCLE9BQU8sRUFBQyxJQUFJLEVBQUMsTUFBTSxRQUFRLENBQUM7QUFFNUI7Ozs7Ozs7Ozs7Ozs7OztHQWVHO0FBQ0gsU0FBUyxjQUFjLENBQ25CLFVBQTZCLEVBQUUsVUFBK0IsRUFDOUQsUUFBNkIsRUFBRSxJQUF5QixFQUN4RCxDQUFzQixFQUFFLENBQXNCO0lBQ2hELE1BQU0sV0FBVyxHQUNiLGVBQWUsQ0FBQyxVQUFVLEVBQUUsWUFBWSxFQUFFLGVBQWUsQ0FBQyxDQUFDO0lBQy9ELE1BQU0sV0FBVyxHQUNiLGVBQWUsQ0FBQyxVQUFVLEVBQUUsWUFBWSxFQUFFLGVBQWUsQ0FBQyxDQUFDO0lBQy9ELE1BQU0sU0FBUyxHQUFHLGVBQWUsQ0FBQyxRQUFRLEVBQUUsVUFBVSxFQUFFLGVBQWUsQ0FBQyxDQUFDO0lBQ3pFLE1BQU0sS0FBSyxHQUFHLGVBQWUsQ0FBQyxJQUFJLEVBQUUsTUFBTSxFQUFFLGVBQWUsQ0FBQyxDQUFDO0lBQzdELE1BQU0sRUFBRSxHQUFHLGVBQWUsQ0FBQyxDQUFDLEVBQUUsR0FBRyxFQUFFLGVBQWUsQ0FBQyxDQUFDO0lBQ3BELE1BQU0sRUFBRSxHQUFHLGVBQWUsQ0FBQyxDQUFDLEVBQUUsR0FBRyxFQUFFLGVBQWUsQ0FBQyxDQUFDO0lBRXBELE1BQU0sUUFBUSxHQUFHLE1BQU0sQ0FBQyxDQUFDLEtBQUssRUFBRSxFQUFFLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQztJQUN4QyxNQUFNLFFBQVEsR0FBRyxNQUFNLENBQUMsUUFBUSxFQUFFLFdBQVcsQ0FBQyxDQUFDO0lBQy9DLE1BQU0sR0FBRyxHQUFhLEdBQUcsQ0FBQyxRQUFRLEVBQUUsU0FBUyxDQUFDLENBQUM7SUFFL0Msa0VBQWtFO0lBQ2xFLE1BQU0sU0FBUyxHQUFHLEdBQUcsQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDLENBQUM7SUFDL0IsTUFBTSxTQUFTLEdBQUcsR0FBRyxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUM7SUFDbkMsTUFBTSxTQUFTLEdBQXFCLENBQUMsU0FBUyxFQUFFLFNBQVMsQ0FBQyxDQUFDO0lBQzNELE1BQU0sQ0FBQyxHQUFHLEtBQUssQ0FBQyxHQUFHLEVBQUUsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLEVBQUUsU0FBUyxDQUFDLENBQUM7SUFDeEMsTUFBTSxDQUFDLEdBQUcsS0FBSyxDQUFDLEdBQUcsRUFBRSxDQUFDLENBQUMsRUFBRSxTQUFTLENBQUMsRUFBRSxTQUFTLENBQUMsQ0FBQztJQUNoRCxNQUFNLENBQUMsR0FBRyxLQUFLLENBQUMsR0FBRyxFQUFFLENBQUMsQ0FBQyxFQUFFLFNBQVMsR0FBRyxDQUFDLENBQUMsRUFBRSxTQUFTLENBQUMsQ0FBQztJQUNwRCxNQUFNLENBQUMsR0FBRyxLQUFLLENBQUMsR0FBRyxFQUFFLENBQUMsQ0FBQyxFQUFFLFNBQVMsR0FBRyxDQUFDLENBQUMsRUFBRSxTQUFTLENBQUMsQ0FBQztJQUVwRCxNQUFNLElBQUksR0FDTixHQUFHLENBQUMsR0FBRyxDQUFDLE9BQU8sQ0FBQyxDQUFDLENBQUMsRUFBRSxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUMsRUFDeEIsR0FBRyxDQUFDLEVBQUUsRUFBRSxPQUFPLENBQUMsR0FBRyxDQUFDLFdBQVcsRUFBRSxDQUFDLENBQUMsQ0FBYSxDQUFDLENBQUMsQ0FBQztJQUMzRCxNQUFNLElBQUksR0FBYSxHQUFHLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxFQUFFLE9BQU8sQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDO0lBQ25ELE9BQU8sQ0FBQyxJQUFJLEVBQUUsSUFBSSxDQUFDLENBQUM7QUFDdEIsQ0FBQztBQUVELE1BQU0sQ0FBQyxNQUFNLGFBQWEsR0FBRyxFQUFFLENBQUMsRUFBQyxjQUFjLEVBQUMsQ0FBQyxDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiLyoqXG4gKiBAbGljZW5zZVxuICogQ29weXJpZ2h0IDIwMjAgR29vZ2xlIExMQy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC5cbiAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSBcIkxpY2Vuc2VcIik7XG4gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuXG4gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXRcbiAqXG4gKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjBcbiAqXG4gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlXG4gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiBcIkFTIElTXCIgQkFTSVMsXG4gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC5cbiAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmRcbiAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLlxuICogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbiAqL1xuXG5pbXBvcnQge1NjYWxhciwgVGVuc29yMUQsIFRlbnNvcjJEfSBmcm9tICcuLi90ZW5zb3InO1xuaW1wb3J0IHtjb252ZXJ0VG9UZW5zb3J9IGZyb20gJy4uL3RlbnNvcl91dGlsX2Vudic7XG5pbXBvcnQge1RlbnNvckxpa2V9IGZyb20gJy4uL3R5cGVzJztcblxuaW1wb3J0IHthZGR9IGZyb20gJy4vYWRkJztcbmltcG9ydCB7Y29uY2F0fSBmcm9tICcuL2NvbmNhdCc7XG5pbXBvcnQge21hdE11bH0gZnJvbSAnLi9tYXRfbXVsJztcbmltcG9ydCB7bXVsfSBmcm9tICcuL211bCc7XG5pbXBvcnQge29wfSBmcm9tICcuL29wZXJhdGlvbic7XG5pbXBvcnQge3NpZ21vaWR9IGZyb20gJy4vc2lnbW9pZCc7XG5pbXBvcnQge3NsaWNlfSBmcm9tICcuL3NsaWNlJztcbmltcG9ydCB7dGFuaH0gZnJvbSAnLi90YW5oJztcblxuLyoqXG4gKiBDb21wdXRlcyB0aGUgbmV4dCBzdGF0ZSBhbmQgb3V0cHV0IG9mIGEgQmFzaWNMU1RNQ2VsbC5cbiAqXG4gKiBSZXR1cm5zIGBbbmV3QywgbmV3SF1gLlxuICpcbiAqIERlcml2ZWQgZnJvbSB0Zi5jb250cmliLnJubi5CYXNpY0xTVE1DZWxsLlxuICpcbiAqIEBwYXJhbSBmb3JnZXRCaWFzIEZvcmdldCBiaWFzIGZvciB0aGUgY2VsbC5cbiAqIEBwYXJhbSBsc3RtS2VybmVsIFRoZSB3ZWlnaHRzIGZvciB0aGUgY2VsbC5cbiAqIEBwYXJhbSBsc3RtQmlhcyBUaGUgYmlhcyBmb3IgdGhlIGNlbGwuXG4gKiBAcGFyYW0gZGF0YSBUaGUgaW5wdXQgdG8gdGhlIGNlbGwuXG4gKiBAcGFyYW0gYyBQcmV2aW91cyBjZWxsIHN0YXRlLlxuICogQHBhcmFtIGggUHJldmlvdXMgY2VsbCBvdXRwdXQuXG4gKlxuICogQGRvYyB7aGVhZGluZzogJ09wZXJhdGlvbnMnLCBzdWJoZWFkaW5nOiAnUk5OJ31cbiAqL1xuZnVuY3Rpb24gYmFzaWNMU1RNQ2VsbF8oXG4gICAgZm9yZ2V0QmlhczogU2NhbGFyfFRlbnNvckxpa2UsIGxzdG1LZXJuZWw6IFRlbnNvcjJEfFRlbnNvckxpa2UsXG4gICAgbHN0bUJpYXM6IFRlbnNvcjFEfFRlbnNvckxpa2UsIGRhdGE6IFRlbnNvcjJEfFRlbnNvckxpa2UsXG4gICAgYzogVGVuc29yMkR8VGVuc29yTGlrZSwgaDogVGVuc29yMkR8VGVuc29yTGlrZSk6IFtUZW5zb3IyRCwgVGVuc29yMkRdIHtcbiAgY29uc3QgJGZvcmdldEJpYXMgPVxuICAgICAgY29udmVydFRvVGVuc29yKGZvcmdldEJpYXMsICdmb3JnZXRCaWFzJywgJ2Jhc2ljTFNUTUNlbGwnKTtcbiAgY29uc3QgJGxzdG1LZXJuZWwgPVxuICAgICAgY29udmVydFRvVGVuc29yKGxzdG1LZXJuZWwsICdsc3RtS2VybmVsJywgJ2Jhc2ljTFNUTUNlbGwnKTtcbiAgY29uc3QgJGxzdG1CaWFzID0gY29udmVydFRvVGVuc29yKGxzdG1CaWFzLCAnbHN0bUJpYXMnLCAnYmFzaWNMU1RNQ2VsbCcpO1xuICBjb25zdCAkZGF0YSA9IGNvbnZlcnRUb1RlbnNvcihkYXRhLCAnZGF0YScsICdiYXNpY0xTVE1DZWxsJyk7XG4gIGNvbnN0ICRjID0gY29udmVydFRvVGVuc29yKGMsICdjJywgJ2Jhc2ljTFNUTUNlbGwnKTtcbiAgY29uc3QgJGggPSBjb252ZXJ0VG9UZW5zb3IoaCwgJ2gnLCAnYmFzaWNMU1RNQ2VsbCcpO1xuXG4gIGNvbnN0IGNvbWJpbmVkID0gY29uY2F0KFskZGF0YSwgJGhdLCAxKTtcbiAgY29uc3Qgd2VpZ2h0ZWQgPSBtYXRNdWwoY29tYmluZWQsICRsc3RtS2VybmVsKTtcbiAgY29uc3QgcmVzOiBUZW5zb3IyRCA9IGFkZCh3ZWlnaHRlZCwgJGxzdG1CaWFzKTtcblxuICAvLyBpID0gaW5wdXRfZ2F0ZSwgaiA9IG5ld19pbnB1dCwgZiA9IGZvcmdldF9nYXRlLCBvID0gb3V0cHV0X2dhdGVcbiAgY29uc3QgYmF0Y2hTaXplID0gcmVzLnNoYXBlWzBdO1xuICBjb25zdCBzbGljZUNvbHMgPSByZXMuc2hhcGVbMV0gLyA0O1xuICBjb25zdCBzbGljZVNpemU6IFtudW1iZXIsIG51bWJlcl0gPSBbYmF0Y2hTaXplLCBzbGljZUNvbHNdO1xuICBjb25zdCBpID0gc2xpY2UocmVzLCBbMCwgMF0sIHNsaWNlU2l6ZSk7XG4gIGNvbnN0IGogPSBzbGljZShyZXMsIFswLCBzbGljZUNvbHNdLCBzbGljZVNpemUpO1xuICBjb25zdCBmID0gc2xpY2UocmVzLCBbMCwgc2xpY2VDb2xzICogMl0sIHNsaWNlU2l6ZSk7XG4gIGNvbnN0IG8gPSBzbGljZShyZXMsIFswLCBzbGljZUNvbHMgKiAzXSwgc2xpY2VTaXplKTtcblxuICBjb25zdCBuZXdDOiBUZW5zb3IyRCA9XG4gICAgICBhZGQobXVsKHNpZ21vaWQoaSksIHRhbmgoaikpLFxuICAgICAgICAgIG11bCgkYywgc2lnbW9pZChhZGQoJGZvcmdldEJpYXMsIGYpKSBhcyBUZW5zb3IyRCkpO1xuICBjb25zdCBuZXdIOiBUZW5zb3IyRCA9IG11bCh0YW5oKG5ld0MpLCBzaWdtb2lkKG8pKTtcbiAgcmV0dXJuIFtuZXdDLCBuZXdIXTtcbn1cblxuZXhwb3J0IGNvbnN0IGJhc2ljTFNUTUNlbGwgPSBvcCh7YmFzaWNMU1RNQ2VsbF99KTtcbiJdfQ==","import { convertToTensor } from '../tensor_util_env';\nimport * as util from '../util';\nimport { batchNorm } from './batchnorm';\nimport { op } from './operation';\n/**\n * Batch normalization, strictly for 2D. For the more relaxed version, see\n * `tf.batchNorm`.\n *\n * @param x The input Tensor.\n * @param mean A mean Tensor.\n * @param variance A variance Tensor.\n * @param offset An offset Tensor.\n * @param scale A scale Tensor.\n * @param varianceEpsilon A small float number to avoid dividing by 0.\n */\nfunction batchNorm2d_(x, mean, variance, offset, scale, varianceEpsilon) {\n const $x = convertToTensor(x, 'x', 'batchNorm');\n const $mean = convertToTensor(mean, 'mean', 'batchNorm');\n const $variance = convertToTensor(variance, 'variance', 'batchNorm');\n let $scale;\n if (scale != null) {\n $scale = convertToTensor(scale, 'scale', 'batchNorm');\n }\n let $offset;\n if (offset != null) {\n $offset = convertToTensor(offset, 'offset', 'batchNorm');\n }\n util.assert($x.rank === 2, () => `Error in batchNorm2D: x must be rank 2 but got rank ` +\n `${$x.rank}.`);\n util.assert($mean.rank === 2 || $mean.rank === 1, () => `Error in batchNorm2D: mean must be rank 2 or rank 1 but ` +\n `got rank ${$mean.rank}.`);\n util.assert($variance.rank === 2 || $variance.rank === 1, () => `Error in batchNorm2D: variance must be rank 2 or rank 1 ` +\n `but got rank ${$variance.rank}.`);\n if ($scale != null) {\n util.assert($scale.rank === 2 || $scale.rank === 1, () => `Error in batchNorm2D: scale must be rank 2 or rank 1 ` +\n `but got rank ${$scale.rank}.`);\n }\n if ($offset != null) {\n util.assert($offset.rank === 2 || $offset.rank === 1, () => `Error in batchNorm2D: offset must be rank 2 or rank 1 ` +\n `but got rank ${$offset.rank}.`);\n }\n return batchNorm($x, $mean, $variance, $offset, $scale, varianceEpsilon);\n}\nexport const batchNorm2d = op({ batchNorm2d_ });\n//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYmF0Y2hub3JtMmQuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi8uLi90ZmpzLWNvcmUvc3JjL29wcy9iYXRjaG5vcm0yZC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFpQkEsT0FBTyxFQUFDLGVBQWUsRUFBQyxNQUFNLG9CQUFvQixDQUFDO0FBRW5ELE9BQU8sS0FBSyxJQUFJLE1BQU0sU0FBUyxDQUFDO0FBRWhDLE9BQU8sRUFBQyxTQUFTLEVBQUMsTUFBTSxhQUFhLENBQUM7QUFDdEMsT0FBTyxFQUFDLEVBQUUsRUFBQyxNQUFNLGFBQWEsQ0FBQztBQUUvQjs7Ozs7Ozs7OztHQVVHO0FBQ0gsU0FBUyxZQUFZLENBQ2pCLENBQXNCLEVBQUUsSUFBa0MsRUFDMUQsUUFBc0MsRUFDdEMsTUFBcUMsRUFBRSxLQUFvQyxFQUMzRSxlQUF3QjtJQUMxQixNQUFNLEVBQUUsR0FBRyxlQUFlLENBQUMsQ0FBQyxFQUFFLEdBQUcsRUFBRSxXQUFXLENBQUMsQ0FBQztJQUNoRCxNQUFNLEtBQUssR0FBRyxlQUFlLENBQUMsSUFBSSxFQUFFLE1BQU0sRUFBRSxXQUFXLENBQUMsQ0FBQztJQUN6RCxNQUFNLFNBQVMsR0FBRyxlQUFlLENBQUMsUUFBUSxFQUFFLFVBQVUsRUFBRSxXQUFXLENBQUMsQ0FBQztJQUNyRSxJQUFJLE1BQXlCLENBQUM7SUFDOUIsSUFBSSxLQUFLLElBQUksSUFBSSxFQUFFO1FBQ2pCLE1BQU0sR0FBRyxlQUFlLENBQUMsS0FBSyxFQUFFLE9BQU8sRUFBRSxXQUFXLENBQUMsQ0FBQztLQUN2RDtJQUNELElBQUksT0FBMEIsQ0FBQztJQUMvQixJQUFJLE1BQU0sSUFBSSxJQUFJLEVBQUU7UUFDbEIsT0FBTyxHQUFHLGVBQWUsQ0FBQyxNQUFNLEVBQUUsUUFBUSxFQUFFLFdBQVcsQ0FBQyxDQUFDO0tBQzFEO0lBQ0QsSUFBSSxDQUFDLE1BQU0sQ0FDUCxFQUFFLENBQUMsSUFBSSxLQUFLLENBQUMsRUFDYixHQUFHLEVBQUUsQ0FBQyxzREFBc0Q7UUFDeEQsR0FBRyxFQUFFLENBQUMsSUFBSSxHQUFHLENBQUMsQ0FBQztJQUN2QixJQUFJLENBQUMsTUFBTSxDQUNQLEtBQUssQ0FBQyxJQUFJLEtBQUssQ0FBQyxJQUFJLEtBQUssQ0FBQyxJQUFJLEtBQUssQ0FBQyxFQUNwQyxHQUFHLEVBQUUsQ0FBQywwREFBMEQ7UUFDNUQsWUFBWSxLQUFLLENBQUMsSUFBSSxHQUFHLENBQUMsQ0FBQztJQUNuQyxJQUFJLENBQUMsTUFBTSxDQUNQLFNBQVMsQ0FBQyxJQUFJLEtBQUssQ0FBQyxJQUFJLFNBQVMsQ0FBQyxJQUFJLEtBQUssQ0FBQyxFQUM1QyxHQUFHLEVBQUUsQ0FBQywwREFBMEQ7UUFDNUQsZ0JBQWdCLFNBQVMsQ0FBQyxJQUFJLEdBQUcsQ0FBQyxDQUFDO0lBQzNDLElBQUksTUFBTSxJQUFJLElBQUksRUFBRTtRQUNsQixJQUFJLENBQUMsTUFBTSxDQUNQLE1BQU0sQ0FBQyxJQUFJLEtBQUssQ0FBQyxJQUFJLE1BQU0sQ0FBQyxJQUFJLEtBQUssQ0FBQyxFQUN0QyxHQUFHLEVBQUUsQ0FBQyx1REFBdUQ7WUFDekQsZ0JBQWdCLE1BQU0sQ0FBQyxJQUFJLEdBQUcsQ0FBQyxDQUFDO0tBQ3pDO0lBQ0QsSUFBSSxPQUFPLElBQUksSUFBSSxFQUFFO1FBQ25CLElBQUksQ0FBQyxNQUFNLENBQ1AsT0FBTyxDQUFDLElBQUksS0FBSyxDQUFDLElBQUksT0FBTyxDQUFDLElBQUksS0FBSyxDQUFDLEVBQ3hDLEdBQUcsRUFBRSxDQUFDLHdEQUF3RDtZQUMxRCxnQkFBZ0IsT0FBTyxDQUFDLElBQUksR0FBRyxDQUFDLENBQUM7S0FDMUM7SUFFRCxPQUFPLFNBQVMsQ0FBQyxFQUFFLEVBQUUsS0FBSyxFQUFFLFNBQVMsRUFBRSxPQUFPLEVBQUUsTUFBTSxFQUFFLGVBQWUsQ0FBQyxDQUFDO0FBQzNFLENBQUM7QUFFRCxNQUFNLENBQUMsTUFBTSxXQUFXLEdBQUcsRUFBRSxDQUFDLEVBQUMsWUFBWSxFQUFDLENBQUMsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbIi8qKlxuICogQGxpY2Vuc2VcbiAqIENvcHlyaWdodCAyMDIwIEdvb2dsZSBMTEMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuXG4gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgXCJMaWNlbnNlXCIpO1xuICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLlxuICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0XG4gKlxuICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wXG4gKlxuICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZVxuICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gXCJBUyBJU1wiIEJBU0lTLFxuICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuXG4gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kXG4gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS5cbiAqID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4gKi9cbmltcG9ydCB7VGVuc29yMUQsIFRlbnNvcjJEfSBmcm9tICcuLi90ZW5zb3InO1xuaW1wb3J0IHtjb252ZXJ0VG9UZW5zb3J9IGZyb20gJy4uL3RlbnNvcl91dGlsX2Vudic7XG5pbXBvcnQge1RlbnNvckxpa2V9IGZyb20gJy4uL3R5cGVzJztcbmltcG9ydCAqIGFzIHV0aWwgZnJvbSAnLi4vdXRpbCc7XG5cbmltcG9ydCB7YmF0Y2hOb3JtfSBmcm9tICcuL2JhdGNobm9ybSc7XG5pbXBvcnQge29wfSBmcm9tICcuL29wZXJhdGlvbic7XG5cbi8qKlxuICogQmF0Y2ggbm9ybWFsaXphdGlvbiwgc3RyaWN0bHkgZm9yIDJELiBGb3IgdGhlIG1vcmUgcmVsYXhlZCB2ZXJzaW9uLCBzZWVcbiAqIGB0Zi5iYXRjaE5vcm1gLlxuICpcbiAqIEBwYXJhbSB4IFRoZSBpbnB1dCBUZW5zb3IuXG4gKiBAcGFyYW0gbWVhbiBBIG1lYW4gVGVuc29yLlxuICogQHBhcmFtIHZhcmlhbmNlIEEgdmFyaWFuY2UgVGVuc29yLlxuICogQHBhcmFtIG9mZnNldCBBbiBvZmZzZXQgVGVuc29yLlxuICogQHBhcmFtIHNjYWxlIEEgc2NhbGUgVGVuc29yLlxuICogQHBhcmFtIHZhcmlhbmNlRXBzaWxvbiBBIHNtYWxsIGZsb2F0IG51bWJlciB0byBhdm9pZCBkaXZpZGluZyBieSAwLlxuICovXG5mdW5jdGlvbiBiYXRjaE5vcm0yZF8oXG4gICAgeDogVGVuc29yMkR8VGVuc29yTGlrZSwgbWVhbjogVGVuc29yMkR8VGVuc29yMUR8VGVuc29yTGlrZSxcbiAgICB2YXJpYW5jZTogVGVuc29yMkR8VGVuc29yMUR8VGVuc29yTGlrZSxcbiAgICBvZmZzZXQ/OiBUZW5zb3IyRHxUZW5zb3IxRHxUZW5zb3JMaWtlLCBzY2FsZT86IFRlbnNvcjJEfFRlbnNvcjFEfFRlbnNvckxpa2UsXG4gICAgdmFyaWFuY2VFcHNpbG9uPzogbnVtYmVyKTogVGVuc29yMkQge1xuICBjb25zdCAkeCA9IGNvbnZlcnRUb1RlbnNvcih4LCAneCcsICdiYXRjaE5vcm0nKTtcbiAgY29uc3QgJG1lYW4gPSBjb252ZXJ0VG9UZW5zb3IobWVhbiwgJ21lYW4nLCAnYmF0Y2hOb3JtJyk7XG4gIGNvbnN0ICR2YXJpYW5jZSA9IGNvbnZlcnRUb1RlbnNvcih2YXJpYW5jZSwgJ3ZhcmlhbmNlJywgJ2JhdGNoTm9ybScpO1xuICBsZXQgJHNjYWxlOiBUZW5zb3IyRHxUZW5zb3IxRDtcbiAgaWYgKHNjYWxlICE9IG51bGwpIHtcbiAgICAkc2NhbGUgPSBjb252ZXJ0VG9UZW5zb3Ioc2NhbGUsICdzY2FsZScsICdiYXRjaE5vcm0nKTtcbiAgfVxuICBsZXQgJG9mZnNldDogVGVuc29yMkR8VGVuc29yMUQ7XG4gIGlmIChvZmZzZXQgIT0gbnVsbCkge1xuICAgICRvZmZzZXQgPSBjb252ZXJ0VG9UZW5zb3Iob2Zmc2V0LCAnb2Zmc2V0JywgJ2JhdGNoTm9ybScpO1xuICB9XG4gIHV0aWwuYXNzZXJ0KFxuICAgICAgJHgucmFuayA9PT0gMixcbiAgICAgICgpID0+IGBFcnJvciBpbiBiYXRjaE5vcm0yRDogeCBtdXN0IGJlIHJhbmsgMiBidXQgZ290IHJhbmsgYCArXG4gICAgICAgICAgYCR7JHgucmFua30uYCk7XG4gIHV0aWwuYXNzZXJ0KFxuICAgICAgJG1lYW4ucmFuayA9PT0gMiB8fCAkbWVhbi5yYW5rID09PSAxLFxuICAgICAgKCkgPT4gYEVycm9yIGluIGJhdGNoTm9ybTJEOiBtZWFuIG11c3QgYmUgcmFuayAyIG9yIHJhbmsgMSBidXQgYCArXG4gICAgICAgICAgYGdvdCByYW5rICR7JG1lYW4ucmFua30uYCk7XG4gIHV0aWwuYXNzZXJ0KFxuICAgICAgJHZhcmlhbmNlLnJhbmsgPT09IDIgfHwgJHZhcmlhbmNlLnJhbmsgPT09IDEsXG4gICAgICAoKSA9PiBgRXJyb3IgaW4gYmF0Y2hOb3JtMkQ6IHZhcmlhbmNlIG11c3QgYmUgcmFuayAyIG9yIHJhbmsgMSBgICtcbiAgICAgICAgICBgYnV0IGdvdCByYW5rICR7JHZhcmlhbmNlLnJhbmt9LmApO1xuICBpZiAoJHNjYWxlICE9IG51bGwpIHtcbiAgICB1dGlsLmFzc2VydChcbiAgICAgICAgJHNjYWxlLnJhbmsgPT09IDIgfHwgJHNjYWxlLnJhbmsgPT09IDEsXG4gICAgICAgICgpID0+IGBFcnJvciBpbiBiYXRjaE5vcm0yRDogc2NhbGUgbXVzdCBiZSByYW5rIDIgb3IgcmFuayAxIGAgK1xuICAgICAgICAgICAgYGJ1dCBnb3QgcmFuayAkeyRzY2FsZS5yYW5rfS5gKTtcbiAgfVxuICBpZiAoJG9mZnNldCAhPSBudWxsKSB7XG4gICAgdXRpbC5hc3NlcnQoXG4gICAgICAgICRvZmZzZXQucmFuayA9PT0gMiB8fCAkb2Zmc2V0LnJhbmsgPT09IDEsXG4gICAgICAgICgpID0+IGBFcnJvciBpbiBiYXRjaE5vcm0yRDogb2Zmc2V0IG11c3QgYmUgcmFuayAyIG9yIHJhbmsgMSBgICtcbiAgICAgICAgICAgIGBidXQgZ290IHJhbmsgJHskb2Zmc2V0LnJhbmt9LmApO1xuICB9XG5cbiAgcmV0dXJuIGJhdGNoTm9ybSgkeCwgJG1lYW4sICR2YXJpYW5jZSwgJG9mZnNldCwgJHNjYWxlLCB2YXJpYW5jZUVwc2lsb24pO1xufVxuXG5leHBvcnQgY29uc3QgYmF0Y2hOb3JtMmQgPSBvcCh7YmF0Y2hOb3JtMmRffSk7XG4iXX0=","import { convertToTensor } from '../tensor_util_env';\nimport * as util from '../util';\nimport { batchNorm } from './batchnorm';\nimport { op } from './operation';\n/**\n * Batch normalization, strictly for 3D. For the more relaxed version, see\n * `tf.batchNorm`.\n *\n * @param x The input Tensor.\n * @param mean A mean Tensor.\n * @param variance A variance Tensor.\n * @param offset An offset Tensor.\n * @param scale A scale Tensor.\n * @param varianceEpsilon A small float number to avoid dividing by 0.\n */\nfunction batchNorm3d_(x, mean, variance, offset, scale, varianceEpsilon) {\n const $x = convertToTensor(x, 'x', 'batchNorm');\n const $mean = convertToTensor(mean, 'mean', 'batchNorm');\n const $variance = convertToTensor(variance, 'variance', 'batchNorm');\n let $scale;\n if (scale != null) {\n $scale = convertToTensor(scale, 'scale', 'batchNorm');\n }\n let $offset;\n if (offset != null) {\n $offset = convertToTensor(offset, 'offset', 'batchNorm');\n }\n util.assert($x.rank === 3, () => `Error in batchNorm3D: x must be rank 3 but got rank ` +\n `${$x.rank}.`);\n util.assert($mean.rank === 3 || $mean.rank === 1, () => `Error in batchNorm3D: mean must be rank 3 or rank 1 but ` +\n `got rank ${$mean.rank}.`);\n util.assert($variance.rank === 3 || $variance.rank === 1, () => `Error in batchNorm3D: variance must be rank 3 or rank 1 ` +\n `but got rank ${$variance.rank}.`);\n if ($scale != null) {\n util.assert($scale.rank === 3 || $scale.rank === 1, () => `Error in batchNorm3D: scale must be rank 3 or rank 1 ` +\n `but got rank ${$scale.rank}.`);\n }\n if ($offset != null) {\n util.assert($offset.rank === 3 || $offset.rank === 1, () => `Error in batchNorm3D: offset must be rank 3 or rank 1 ` +\n `but got rank ${$offset.rank}.`);\n }\n return batchNorm($x, $mean, $variance, $offset, $scale, varianceEpsilon);\n}\nexport const batchNorm3d = op({ batchNorm3d_ });\n//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYmF0Y2hub3JtM2QuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi8uLi90ZmpzLWNvcmUvc3JjL29wcy9iYXRjaG5vcm0zZC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFpQkEsT0FBTyxFQUFDLGVBQWUsRUFBQyxNQUFNLG9CQUFvQixDQUFDO0FBRW5ELE9BQU8sS0FBSyxJQUFJLE1BQU0sU0FBUyxDQUFDO0FBRWhDLE9BQU8sRUFBQyxTQUFTLEVBQUMsTUFBTSxhQUFhLENBQUM7QUFDdEMsT0FBTyxFQUFDLEVBQUUsRUFBQyxNQUFNLGFBQWEsQ0FBQztBQUUvQjs7Ozs7Ozs7OztHQVVHO0FBQ0gsU0FBUyxZQUFZLENBQ2pCLENBQXNCLEVBQUUsSUFBa0MsRUFDMUQsUUFBc0MsRUFDdEMsTUFBcUMsRUFBRSxLQUFvQyxFQUMzRSxlQUF3QjtJQUMxQixNQUFNLEVBQUUsR0FBRyxlQUFlLENBQUMsQ0FBQyxFQUFFLEdBQUcsRUFBRSxXQUFXLENBQUMsQ0FBQztJQUNoRCxNQUFNLEtBQUssR0FBRyxlQUFlLENBQUMsSUFBSSxFQUFFLE1BQU0sRUFBRSxXQUFXLENBQUMsQ0FBQztJQUN6RCxNQUFNLFNBQVMsR0FBRyxlQUFlLENBQUMsUUFBUSxFQUFFLFVBQVUsRUFBRSxXQUFXLENBQUMsQ0FBQztJQUNyRSxJQUFJLE1BQXlCLENBQUM7SUFDOUIsSUFBSSxLQUFLLElBQUksSUFBSSxFQUFFO1FBQ2pCLE1BQU0sR0FBRyxlQUFlLENBQUMsS0FBSyxFQUFFLE9BQU8sRUFBRSxXQUFXLENBQUMsQ0FBQztLQUN2RDtJQUNELElBQUksT0FBMEIsQ0FBQztJQUMvQixJQUFJLE1BQU0sSUFBSSxJQUFJLEVBQUU7UUFDbEIsT0FBTyxHQUFHLGVBQWUsQ0FBQyxNQUFNLEVBQUUsUUFBUSxFQUFFLFdBQVcsQ0FBQyxDQUFDO0tBQzFEO0lBQ0QsSUFBSSxDQUFDLE1BQU0sQ0FDUCxFQUFFLENBQUMsSUFBSSxLQUFLLENBQUMsRUFDYixHQUFHLEVBQUUsQ0FBQyxzREFBc0Q7UUFDeEQsR0FBRyxFQUFFLENBQUMsSUFBSSxHQUFHLENBQUMsQ0FBQztJQUN2QixJQUFJLENBQUMsTUFBTSxDQUNQLEtBQUssQ0FBQyxJQUFJLEtBQUssQ0FBQyxJQUFJLEtBQUssQ0FBQyxJQUFJLEtBQUssQ0FBQyxFQUNwQyxHQUFHLEVBQUUsQ0FBQywwREFBMEQ7UUFDNUQsWUFBWSxLQUFLLENBQUMsSUFBSSxHQUFHLENBQUMsQ0FBQztJQUNuQyxJQUFJLENBQUMsTUFBTSxDQUNQLFNBQVMsQ0FBQyxJQUFJLEtBQUssQ0FBQyxJQUFJLFNBQVMsQ0FBQyxJQUFJLEtBQUssQ0FBQyxFQUM1QyxHQUFHLEVBQUUsQ0FBQywwREFBMEQ7UUFDNUQsZ0JBQWdCLFNBQVMsQ0FBQyxJQUFJLEdBQUcsQ0FBQyxDQUFDO0lBQzNDLElBQUksTUFBTSxJQUFJLElBQUksRUFBRTtRQUNsQixJQUFJLENBQUMsTUFBTSxDQUNQLE1BQU0sQ0FBQyxJQUFJLEtBQUssQ0FBQyxJQUFJLE1BQU0sQ0FBQyxJQUFJLEtBQUssQ0FBQyxFQUN0QyxHQUFHLEVBQUUsQ0FBQyx1REFBdUQ7WUFDekQsZ0JBQWdCLE1BQU0sQ0FBQyxJQUFJLEdBQUcsQ0FBQyxDQUFDO0tBQ3pDO0lBQ0QsSUFBSSxPQUFPLElBQUksSUFBSSxFQUFFO1FBQ25CLElBQUksQ0FBQyxNQUFNLENBQ1AsT0FBTyxDQUFDLElBQUksS0FBSyxDQUFDLElBQUksT0FBTyxDQUFDLElBQUksS0FBSyxDQUFDLEVBQ3hDLEdBQUcsRUFBRSxDQUFDLHdEQUF3RDtZQUMxRCxnQkFBZ0IsT0FBTyxDQUFDLElBQUksR0FBRyxDQUFDLENBQUM7S0FDMUM7SUFFRCxPQUFPLFNBQVMsQ0FBQyxFQUFFLEVBQUUsS0FBSyxFQUFFLFNBQVMsRUFBRSxPQUFPLEVBQUUsTUFBTSxFQUFFLGVBQWUsQ0FBQyxDQUFDO0FBQzNFLENBQUM7QUFFRCxNQUFNLENBQUMsTUFBTSxXQUFXLEdBQUcsRUFBRSxDQUFDLEVBQUMsWUFBWSxFQUFDLENBQUMsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbIi8qKlxuICogQGxpY2Vuc2VcbiAqIENvcHlyaWdodCAyMDIwIEdvb2dsZSBMTEMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuXG4gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgXCJMaWNlbnNlXCIpO1xuICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLlxuICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0XG4gKlxuICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wXG4gKlxuICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZVxuICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gXCJBUyBJU1wiIEJBU0lTLFxuICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuXG4gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kXG4gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS5cbiAqID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4gKi9cbmltcG9ydCB7VGVuc29yMUQsIFRlbnNvcjNEfSBmcm9tICcuLi90ZW5zb3InO1xuaW1wb3J0IHtjb252ZXJ0VG9UZW5zb3J9IGZyb20gJy4uL3RlbnNvcl91dGlsX2Vudic7XG5pbXBvcnQge1RlbnNvckxpa2V9IGZyb20gJy4uL3R5cGVzJztcbmltcG9ydCAqIGFzIHV0aWwgZnJvbSAnLi4vdXRpbCc7XG5cbmltcG9ydCB7YmF0Y2hOb3JtfSBmcm9tICcuL2JhdGNobm9ybSc7XG5pbXBvcnQge29wfSBmcm9tICcuL29wZXJhdGlvbic7XG5cbi8qKlxuICogQmF0Y2ggbm9ybWFsaXphdGlvbiwgc3RyaWN0bHkgZm9yIDNELiBGb3IgdGhlIG1vcmUgcmVsYXhlZCB2ZXJzaW9uLCBzZWVcbiAqIGB0Zi5iYXRjaE5vcm1gLlxuICpcbiAqIEBwYXJhbSB4IFRoZSBpbnB1dCBUZW5zb3IuXG4gKiBAcGFyYW0gbWVhbiBBIG1lYW4gVGVuc29yLlxuICogQHBhcmFtIHZhcmlhbmNlIEEgdmFyaWFuY2UgVGVuc29yLlxuICogQHBhcmFtIG9mZnNldCBBbiBvZmZzZXQgVGVuc29yLlxuICogQHBhcmFtIHNjYWxlIEEgc2NhbGUgVGVuc29yLlxuICogQHBhcmFtIHZhcmlhbmNlRXBzaWxvbiBBIHNtYWxsIGZsb2F0IG51bWJlciB0byBhdm9pZCBkaXZpZGluZyBieSAwLlxuICovXG5mdW5jdGlvbiBiYXRjaE5vcm0zZF8oXG4gICAgeDogVGVuc29yM0R8VGVuc29yTGlrZSwgbWVhbjogVGVuc29yM0R8VGVuc29yMUR8VGVuc29yTGlrZSxcbiAgICB2YXJpYW5jZTogVGVuc29yM0R8VGVuc29yMUR8VGVuc29yTGlrZSxcbiAgICBvZmZzZXQ/OiBUZW5zb3IzRHxUZW5zb3IxRHxUZW5zb3JMaWtlLCBzY2FsZT86IFRlbnNvcjNEfFRlbnNvcjFEfFRlbnNvckxpa2UsXG4gICAgdmFyaWFuY2VFcHNpbG9uPzogbnVtYmVyKTogVGVuc29yM0Qge1xuICBjb25zdCAkeCA9IGNvbnZlcnRUb1RlbnNvcih4LCAneCcsICdiYXRjaE5vcm0nKTtcbiAgY29uc3QgJG1lYW4gPSBjb252ZXJ0VG9UZW5zb3IobWVhbiwgJ21lYW4nLCAnYmF0Y2hOb3JtJyk7XG4gIGNvbnN0ICR2YXJpYW5jZSA9IGNvbnZlcnRUb1RlbnNvcih2YXJpYW5jZSwgJ3ZhcmlhbmNlJywgJ2JhdGNoTm9ybScpO1xuICBsZXQgJHNjYWxlOiBUZW5zb3IzRHxUZW5zb3IxRDtcbiAgaWYgKHNjYWxlICE9IG51bGwpIHtcbiAgICAkc2NhbGUgPSBjb252ZXJ0VG9UZW5zb3Ioc2NhbGUsICdzY2FsZScsICdiYXRjaE5vcm0nKTtcbiAgfVxuICBsZXQgJG9mZnNldDogVGVuc29yM0R8VGVuc29yMUQ7XG4gIGlmIChvZmZzZXQgIT0gbnVsbCkge1xuICAgICRvZmZzZXQgPSBjb252ZXJ0VG9UZW5zb3Iob2Zmc2V0LCAnb2Zmc2V0JywgJ2JhdGNoTm9ybScpO1xuICB9XG4gIHV0aWwuYXNzZXJ0KFxuICAgICAgJHgucmFuayA9PT0gMyxcbiAgICAgICgpID0+IGBFcnJvciBpbiBiYXRjaE5vcm0zRDogeCBtdXN0IGJlIHJhbmsgMyBidXQgZ290IHJhbmsgYCArXG4gICAgICAgICAgYCR7JHgucmFua30uYCk7XG4gIHV0aWwuYXNzZXJ0KFxuICAgICAgJG1lYW4ucmFuayA9PT0gMyB8fCAkbWVhbi5yYW5rID09PSAxLFxuICAgICAgKCkgPT4gYEVycm9yIGluIGJhdGNoTm9ybTNEOiBtZWFuIG11c3QgYmUgcmFuayAzIG9yIHJhbmsgMSBidXQgYCArXG4gICAgICAgICAgYGdvdCByYW5rICR7JG1lYW4ucmFua30uYCk7XG4gIHV0aWwuYXNzZXJ0KFxuICAgICAgJHZhcmlhbmNlLnJhbmsgPT09IDMgfHwgJHZhcmlhbmNlLnJhbmsgPT09IDEsXG4gICAgICAoKSA9PiBgRXJyb3IgaW4gYmF0Y2hOb3JtM0Q6IHZhcmlhbmNlIG11c3QgYmUgcmFuayAzIG9yIHJhbmsgMSBgICtcbiAgICAgICAgICBgYnV0IGdvdCByYW5rICR7JHZhcmlhbmNlLnJhbmt9LmApO1xuICBpZiAoJHNjYWxlICE9IG51bGwpIHtcbiAgICB1dGlsLmFzc2VydChcbiAgICAgICAgJHNjYWxlLnJhbmsgPT09IDMgfHwgJHNjYWxlLnJhbmsgPT09IDEsXG4gICAgICAgICgpID0+IGBFcnJvciBpbiBiYXRjaE5vcm0zRDogc2NhbGUgbXVzdCBiZSByYW5rIDMgb3IgcmFuayAxIGAgK1xuICAgICAgICAgICAgYGJ1dCBnb3QgcmFuayAkeyRzY2FsZS5yYW5rfS5gKTtcbiAgfVxuICBpZiAoJG9mZnNldCAhPSBudWxsKSB7XG4gICAgdXRpbC5hc3NlcnQoXG4gICAgICAgICRvZmZzZXQucmFuayA9PT0gMyB8fCAkb2Zmc2V0LnJhbmsgPT09IDEsXG4gICAgICAgICgpID0+IGBFcnJvciBpbiBiYXRjaE5vcm0zRDogb2Zmc2V0IG11c3QgYmUgcmFuayAzIG9yIHJhbmsgMSBgICtcbiAgICAgICAgICAgIGBidXQgZ290IHJhbmsgJHskb2Zmc2V0LnJhbmt9LmApO1xuICB9XG5cbiAgcmV0dXJuIGJhdGNoTm9ybSgkeCwgJG1lYW4sICR2YXJpYW5jZSwgJG9mZnNldCwgJHNjYWxlLCB2YXJpYW5jZUVwc2lsb24pO1xufVxuXG5leHBvcnQgY29uc3QgYmF0Y2hOb3JtM2QgPSBvcCh7YmF0Y2hOb3JtM2RffSk7XG4iXX0=","import { convertToTensor } from '../tensor_util_env';\nimport * as util from '../util';\nimport { batchNorm } from './batchnorm';\nimport { op } from './operation';\n/**\n * Batch normalization, strictly for 4D. For the more relaxed version, see\n * `tf.batchNorm`.\n *\n * @param x The input Tensor.\n * @param mean A mean Tensor.\n * @param variance A variance Tensor.\n * @param offset An offset Tensor.\n * @param scale A scale Tensor.\n * @param varianceEpsilon A small float number to avoid dividing by 0.\n */\nfunction batchNorm4d_(x, mean, variance, offset, scale, varianceEpsilon) {\n const $x = convertToTensor(x, 'x', 'batchNorm');\n const $mean = convertToTensor(mean, 'mean', 'batchNorm');\n const $variance = convertToTensor(variance, 'variance', 'batchNorm');\n let $scale;\n if (scale != null) {\n $scale = convertToTensor(scale, 'scale', 'batchNorm');\n }\n let $offset;\n if (offset != null) {\n $offset = convertToTensor(offset, 'offset', 'batchNorm');\n }\n util.assert($x.rank === 4, () => `Error in batchNorm4D: x must be rank 4 but got rank ` +\n `${$x.rank}.`);\n util.assert($mean.rank === 4 || $mean.rank === 1, () => `Error in batchNorm4D: mean must be rank 4 or rank 1 but ` +\n `got rank ${$mean.rank}.`);\n util.assert($variance.rank === 4 || $variance.rank === 1, () => `Error in batchNorm4D: variance must be rank 4 or rank 1 ` +\n `but got rank ${$variance.rank}.`);\n if ($scale != null) {\n util.assert($scale.rank === 4 || $scale.rank === 1, () => `Error in batchNorm4D: scale must be rank 4 or rank 1 ` +\n `but got rank ${$scale.rank}.`);\n }\n if ($offset != null) {\n util.assert($offset.rank === 4 || $offset.rank === 1, () => `Error in batchNorm4D: offset must be rank 4 or rank 1 ` +\n `but got rank ${$offset.rank}.`);\n }\n return batchNorm($x, $mean, $variance, $offset, $scale, varianceEpsilon);\n}\nexport const batchNorm4d = op({ batchNorm4d_ });\n//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYmF0Y2hub3JtNGQuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi8uLi90ZmpzLWNvcmUvc3JjL29wcy9iYXRjaG5vcm00ZC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFpQkEsT0FBTyxFQUFDLGVBQWUsRUFBQyxNQUFNLG9CQUFvQixDQUFDO0FBRW5ELE9BQU8sS0FBSyxJQUFJLE1BQU0sU0FBUyxDQUFDO0FBRWhDLE9BQU8sRUFBQyxTQUFTLEVBQUMsTUFBTSxhQUFhLENBQUM7QUFDdEMsT0FBTyxFQUFDLEVBQUUsRUFBQyxNQUFNLGFBQWEsQ0FBQztBQUUvQjs7Ozs7Ozs7OztHQVVHO0FBQ0gsU0FBUyxZQUFZLENBQ2pCLENBQXNCLEVBQUUsSUFBa0MsRUFDMUQsUUFBc0MsRUFDdEMsTUFBcUMsRUFBRSxLQUFvQyxFQUMzRSxlQUF3QjtJQUMxQixNQUFNLEVBQUUsR0FBRyxlQUFlLENBQUMsQ0FBQyxFQUFFLEdBQUcsRUFBRSxXQUFXLENBQUMsQ0FBQztJQUNoRCxNQUFNLEtBQUssR0FBRyxlQUFlLENBQUMsSUFBSSxFQUFFLE1BQU0sRUFBRSxXQUFXLENBQUMsQ0FBQztJQUN6RCxNQUFNLFNBQVMsR0FBRyxlQUFlLENBQUMsUUFBUSxFQUFFLFVBQVUsRUFBRSxXQUFXLENBQUMsQ0FBQztJQUNyRSxJQUFJLE1BQXlCLENBQUM7SUFDOUIsSUFBSSxLQUFLLElBQUksSUFBSSxFQUFFO1FBQ2pCLE1BQU0sR0FBRyxlQUFlLENBQUMsS0FBSyxFQUFFLE9BQU8sRUFBRSxXQUFXLENBQUMsQ0FBQztLQUN2RDtJQUNELElBQUksT0FBMEIsQ0FBQztJQUMvQixJQUFJLE1BQU0sSUFBSSxJQUFJLEVBQUU7UUFDbEIsT0FBTyxHQUFHLGVBQWUsQ0FBQyxNQUFNLEVBQUUsUUFBUSxFQUFFLFdBQVcsQ0FBQyxDQUFDO0tBQzFEO0lBQ0QsSUFBSSxDQUFDLE1BQU0sQ0FDUCxFQUFFLENBQUMsSUFBSSxLQUFLLENBQUMsRUFDYixHQUFHLEVBQUUsQ0FBQyxzREFBc0Q7UUFDeEQsR0FBRyxFQUFFLENBQUMsSUFBSSxHQUFHLENBQUMsQ0FBQztJQUN2QixJQUFJLENBQUMsTUFBTSxDQUNQLEtBQUssQ0FBQyxJQUFJLEtBQUssQ0FBQyxJQUFJLEtBQUssQ0FBQyxJQUFJLEtBQUssQ0FBQyxFQUNwQyxHQUFHLEVBQUUsQ0FBQywwREFBMEQ7UUFDNUQsWUFBWSxLQUFLLENBQUMsSUFBSSxHQUFHLENBQUMsQ0FBQztJQUNuQyxJQUFJLENBQUMsTUFBTSxDQUNQLFNBQVMsQ0FBQyxJQUFJLEtBQUssQ0FBQyxJQUFJLFNBQVMsQ0FBQyxJQUFJLEtBQUssQ0FBQyxFQUM1QyxHQUFHLEVBQUUsQ0FBQywwREFBMEQ7UUFDNUQsZ0JBQWdCLFNBQVMsQ0FBQyxJQUFJLEdBQUcsQ0FBQyxDQUFDO0lBQzNDLElBQUksTUFBTSxJQUFJLElBQUksRUFBRTtRQUNsQixJQUFJLENBQUMsTUFBTSxDQUNQLE1BQU0sQ0FBQyxJQUFJLEtBQUssQ0FBQyxJQUFJLE1BQU0sQ0FBQyxJQUFJLEtBQUssQ0FBQyxFQUN0QyxHQUFHLEVBQUUsQ0FBQyx1REFBdUQ7WUFDekQsZ0JBQWdCLE1BQU0sQ0FBQyxJQUFJLEdBQUcsQ0FBQyxDQUFDO0tBQ3pDO0lBQ0QsSUFBSSxPQUFPLElBQUksSUFBSSxFQUFFO1FBQ25CLElBQUksQ0FBQyxNQUFNLENBQ1AsT0FBTyxDQUFDLElBQUksS0FBSyxDQUFDLElBQUksT0FBTyxDQUFDLElBQUksS0FBSyxDQUFDLEVBQ3hDLEdBQUcsRUFBRSxDQUFDLHdEQUF3RDtZQUMxRCxnQkFBZ0IsT0FBTyxDQUFDLElBQUksR0FBRyxDQUFDLENBQUM7S0FDMUM7SUFDRCxPQUFPLFNBQVMsQ0FBQyxFQUFFLEVBQUUsS0FBSyxFQUFFLFNBQVMsRUFBRSxPQUFPLEVBQUUsTUFBTSxFQUFFLGVBQWUsQ0FBQyxDQUFDO0FBQzNFLENBQUM7QUFFRCxNQUFNLENBQUMsTUFBTSxXQUFXLEdBQUcsRUFBRSxDQUFDLEVBQUMsWUFBWSxFQUFDLENBQUMsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbIi8qKlxuICogQGxpY2Vuc2VcbiAqIENvcHlyaWdodCAyMDIwIEdvb2dsZSBMTEMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuXG4gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgXCJMaWNlbnNlXCIpO1xuICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLlxuICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0XG4gKlxuICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wXG4gKlxuICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZVxuICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gXCJBUyBJU1wiIEJBU0lTLFxuICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuXG4gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kXG4gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS5cbiAqID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4gKi9cbmltcG9ydCB7VGVuc29yMUQsIFRlbnNvcjREfSBmcm9tICcuLi90ZW5zb3InO1xuaW1wb3J0IHtjb252ZXJ0VG9UZW5zb3J9IGZyb20gJy4uL3RlbnNvcl91dGlsX2Vudic7XG5pbXBvcnQge1RlbnNvckxpa2V9IGZyb20gJy4uL3R5cGVzJztcbmltcG9ydCAqIGFzIHV0aWwgZnJvbSAnLi4vdXRpbCc7XG5cbmltcG9ydCB7YmF0Y2hOb3JtfSBmcm9tICcuL2JhdGNobm9ybSc7XG5pbXBvcnQge29wfSBmcm9tICcuL29wZXJhdGlvbic7XG5cbi8qKlxuICogQmF0Y2ggbm9ybWFsaXphdGlvbiwgc3RyaWN0bHkgZm9yIDRELiBGb3IgdGhlIG1vcmUgcmVsYXhlZCB2ZXJzaW9uLCBzZWVcbiAqIGB0Zi5iYXRjaE5vcm1gLlxuICpcbiAqIEBwYXJhbSB4IFRoZSBpbnB1dCBUZW5zb3IuXG4gKiBAcGFyYW0gbWVhbiBBIG1lYW4gVGVuc29yLlxuICogQHBhcmFtIHZhcmlhbmNlIEEgdmFyaWFuY2UgVGVuc29yLlxuICogQHBhcmFtIG9mZnNldCBBbiBvZmZzZXQgVGVuc29yLlxuICogQHBhcmFtIHNjYWxlIEEgc2NhbGUgVGVuc29yLlxuICogQHBhcmFtIHZhcmlhbmNlRXBzaWxvbiBBIHNtYWxsIGZsb2F0IG51bWJlciB0byBhdm9pZCBkaXZpZGluZyBieSAwLlxuICovXG5mdW5jdGlvbiBiYXRjaE5vcm00ZF8oXG4gICAgeDogVGVuc29yNER8VGVuc29yTGlrZSwgbWVhbjogVGVuc29yNER8VGVuc29yMUR8VGVuc29yTGlrZSxcbiAgICB2YXJpYW5jZTogVGVuc29yNER8VGVuc29yMUR8VGVuc29yTGlrZSxcbiAgICBvZmZzZXQ/OiBUZW5zb3I0RHxUZW5zb3IxRHxUZW5zb3JMaWtlLCBzY2FsZT86IFRlbnNvcjREfFRlbnNvcjFEfFRlbnNvckxpa2UsXG4gICAgdmFyaWFuY2VFcHNpbG9uPzogbnVtYmVyKTogVGVuc29yNEQge1xuICBjb25zdCAkeCA9IGNvbnZlcnRUb1RlbnNvcih4LCAneCcsICdiYXRjaE5vcm0nKTtcbiAgY29uc3QgJG1lYW4gPSBjb252ZXJ0VG9UZW5zb3IobWVhbiwgJ21lYW4nLCAnYmF0Y2hOb3JtJyk7XG4gIGNvbnN0ICR2YXJpYW5jZSA9IGNvbnZlcnRUb1RlbnNvcih2YXJpYW5jZSwgJ3ZhcmlhbmNlJywgJ2JhdGNoTm9ybScpO1xuICBsZXQgJHNjYWxlOiBUZW5zb3I0RHxUZW5zb3IxRDtcbiAgaWYgKHNjYWxlICE9IG51bGwpIHtcbiAgICAkc2NhbGUgPSBjb252ZXJ0VG9UZW5zb3Ioc2NhbGUsICdzY2FsZScsICdiYXRjaE5vcm0nKTtcbiAgfVxuICBsZXQgJG9mZnNldDogVGVuc29yNER8VGVuc29yMUQ7XG4gIGlmIChvZmZzZXQgIT0gbnVsbCkge1xuICAgICRvZmZzZXQgPSBjb252ZXJ0VG9UZW5zb3Iob2Zmc2V0LCAnb2Zmc2V0JywgJ2JhdGNoTm9ybScpO1xuICB9XG4gIHV0aWwuYXNzZXJ0KFxuICAgICAgJHgucmFuayA9PT0gNCxcbiAgICAgICgpID0+IGBFcnJvciBpbiBiYXRjaE5vcm00RDogeCBtdXN0IGJlIHJhbmsgNCBidXQgZ290IHJhbmsgYCArXG4gICAgICAgICAgYCR7JHgucmFua30uYCk7XG4gIHV0aWwuYXNzZXJ0KFxuICAgICAgJG1lYW4ucmFuayA9PT0gNCB8fCAkbWVhbi5yYW5rID09PSAxLFxuICAgICAgKCkgPT4gYEVycm9yIGluIGJhdGNoTm9ybTREOiBtZWFuIG11c3QgYmUgcmFuayA0IG9yIHJhbmsgMSBidXQgYCArXG4gICAgICAgICAgYGdvdCByYW5rICR7JG1lYW4ucmFua30uYCk7XG4gIHV0aWwuYXNzZXJ0KFxuICAgICAgJHZhcmlhbmNlLnJhbmsgPT09IDQgfHwgJHZhcmlhbmNlLnJhbmsgPT09IDEsXG4gICAgICAoKSA9PiBgRXJyb3IgaW4gYmF0Y2hOb3JtNEQ6IHZhcmlhbmNlIG11c3QgYmUgcmFuayA0IG9yIHJhbmsgMSBgICtcbiAgICAgICAgICBgYnV0IGdvdCByYW5rICR7JHZhcmlhbmNlLnJhbmt9LmApO1xuICBpZiAoJHNjYWxlICE9IG51bGwpIHtcbiAgICB1dGlsLmFzc2VydChcbiAgICAgICAgJHNjYWxlLnJhbmsgPT09IDQgfHwgJHNjYWxlLnJhbmsgPT09IDEsXG4gICAgICAgICgpID0+IGBFcnJvciBpbiBiYXRjaE5vcm00RDogc2NhbGUgbXVzdCBiZSByYW5rIDQgb3IgcmFuayAxIGAgK1xuICAgICAgICAgICAgYGJ1dCBnb3QgcmFuayAkeyRzY2FsZS5yYW5rfS5gKTtcbiAgfVxuICBpZiAoJG9mZnNldCAhPSBudWxsKSB7XG4gICAgdXRpbC5hc3NlcnQoXG4gICAgICAgICRvZmZzZXQucmFuayA9PT0gNCB8fCAkb2Zmc2V0LnJhbmsgPT09IDEsXG4gICAgICAgICgpID0+IGBFcnJvciBpbiBiYXRjaE5vcm00RDogb2Zmc2V0IG11c3QgYmUgcmFuayA0IG9yIHJhbmsgMSBgICtcbiAgICAgICAgICAgIGBidXQgZ290IHJhbmsgJHskb2Zmc2V0LnJhbmt9LmApO1xuICB9XG4gIHJldHVybiBiYXRjaE5vcm0oJHgsICRtZWFuLCAkdmFyaWFuY2UsICRvZmZzZXQsICRzY2FsZSwgdmFyaWFuY2VFcHNpbG9uKTtcbn1cblxuZXhwb3J0IGNvbnN0IGJhdGNoTm9ybTRkID0gb3Aoe2JhdGNoTm9ybTRkX30pO1xuIl19","/**\n * @license\n * Copyright 2020 Google LLC. All Rights Reserved.\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n * =============================================================================\n */\nimport { ENGINE } from '../engine';\nimport { Bincount } from '../kernel_names';\nimport { convertToTensor } from '../tensor_util_env';\nimport * as util from '../util';\nimport { op } from './operation';\n/**\n * Outputs a vector with length `size` and the same dtype as `weights`.\n *\n * If `weights` are empty, then index `i` stores the number of times the value\n * `i` is counted in `x`. If `weights` are non-empty, then index `i` stores the\n * sum of the value in `weights` at each index where the corresponding value in\n * `x` is `i`.\n *\n * Values in `x` outside of the range [0, size) are ignored.\n *\n * @param x The input int tensor, rank 1.\n * @param weights The weights tensor, must have the same shape as x, or a\n * length-0 Tensor, in which case it acts as all weights equal to 1.\n * @param size Non-negative integer.\n *\n * @doc {heading: 'Operations', subheading: 'Reduction'}\n */\nfunction bincount_(x, weights, size) {\n const $x = convertToTensor(x, 'x', 'bincount');\n const $weights = convertToTensor(weights, 'weights', 'bincount');\n util.assert($x.dtype === 'int32', () => `Error in bincount: input ` +\n `dtype must be int32, but got ${$x.dtype}`);\n util.assert(size >= 0, () => `size must be non-negative, but got ${size}.`);\n util.assert($weights.size === $x.size || $weights.size === 0, () => `Error in bincount: weights must have the same size as input or` +\n `0-length, but got input shape: ${$x.shape}, weights shape: ` +\n `${$weights.shape}.`);\n const inputs = { x: $x, weights: $weights };\n const attrs = { size };\n return ENGINE.runKernel(Bincount, inputs, attrs);\n}\nexport const bincount = op({ bincount_ });\n//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYmluY291bnQuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi8uLi90ZmpzLWNvcmUvc3JjL29wcy9iaW5jb3VudC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQTs7Ozs7Ozs7Ozs7Ozs7O0dBZUc7QUFFSCxPQUFPLEVBQUMsTUFBTSxFQUFDLE1BQU0sV0FBVyxDQUFDO0FBQ2pDLE9BQU8sRUFBQyxRQUFRLEVBQWdDLE1BQU0saUJBQWlCLENBQUM7QUFJeEUsT0FBTyxFQUFDLGVBQWUsRUFBQyxNQUFNLG9CQUFvQixDQUFDO0FBRW5ELE9BQU8sS0FBSyxJQUFJLE1BQU0sU0FBUyxDQUFDO0FBRWhDLE9BQU8sRUFBQyxFQUFFLEVBQUMsTUFBTSxhQUFhLENBQUM7QUFFL0I7Ozs7Ozs7Ozs7Ozs7Ozs7R0FnQkc7QUFDSCxTQUFTLFNBQVMsQ0FDZCxDQUFlLEVBQUUsT0FBcUIsRUFBRSxJQUFZO0lBQ3RELE1BQU0sRUFBRSxHQUFHLGVBQWUsQ0FBQyxDQUFDLEVBQUUsR0FBRyxFQUFFLFVBQVUsQ0FBQyxDQUFDO0lBQy9DLE1BQU0sUUFBUSxHQUFHLGVBQWUsQ0FBQyxPQUFPLEVBQUUsU0FBUyxFQUFFLFVBQVUsQ0FBQyxDQUFDO0lBRWpFLElBQUksQ0FBQyxNQUFNLENBQ1AsRUFBRSxDQUFDLEtBQUssS0FBSyxPQUFPLEVBQ3BCLEdBQUcsRUFBRSxDQUFDLDJCQUEyQjtRQUM3QixnQ0FBZ0MsRUFBRSxDQUFDLEtBQUssRUFBRSxDQUFDLENBQUM7SUFDcEQsSUFBSSxDQUFDLE1BQU0sQ0FBQyxJQUFJLElBQUksQ0FBQyxFQUFFLEdBQUcsRUFBRSxDQUFDLHNDQUFzQyxJQUFJLEdBQUcsQ0FBQyxDQUFDO0lBQzVFLElBQUksQ0FBQyxNQUFNLENBQ1AsUUFBUSxDQUFDLElBQUksS0FBSyxFQUFFLENBQUMsSUFBSSxJQUFJLFFBQVEsQ0FBQyxJQUFJLEtBQUssQ0FBQyxFQUNoRCxHQUFHLEVBQUUsQ0FBQyxnRUFBZ0U7UUFDbEUsa0NBQWtDLEVBQUUsQ0FBQyxLQUFLLG1CQUFtQjtRQUM3RCxHQUFHLFFBQVEsQ0FBQyxLQUFLLEdBQUcsQ0FBQyxDQUFDO0lBRTlCLE1BQU0sTUFBTSxHQUFtQixFQUFDLENBQUMsRUFBRSxFQUFFLEVBQUUsT0FBTyxFQUFFLFFBQVEsRUFBQyxDQUFDO0lBQzFELE1BQU0sS0FBSyxHQUFrQixFQUFDLElBQUksRUFBQyxDQUFDO0lBRXBDLE9BQU8sTUFBTSxDQUFDLFNBQVMsQ0FDbkIsUUFBUSxFQUFFLE1BQThCLEVBQUUsS0FBMkIsQ0FBQyxDQUFDO0FBQzdFLENBQUM7QUFFRCxNQUFNLENBQUMsTUFBTSxRQUFRLEdBQUcsRUFBRSxDQUFDLEVBQUMsU0FBUyxFQUFDLENBQUMsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbIi8qKlxuICogQGxpY2Vuc2VcbiAqIENvcHlyaWdodCAyMDIwIEdvb2dsZSBMTEMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuXG4gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgXCJMaWNlbnNlXCIpO1xuICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLlxuICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0XG4gKlxuICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wXG4gKlxuICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZVxuICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gXCJBUyBJU1wiIEJBU0lTLFxuICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuXG4gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kXG4gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS5cbiAqID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4gKi9cblxuaW1wb3J0IHtFTkdJTkV9IGZyb20gJy4uL2VuZ2luZSc7XG5pbXBvcnQge0JpbmNvdW50LCBCaW5jb3VudEF0dHJzLCBCaW5jb3VudElucHV0c30gZnJvbSAnLi4va2VybmVsX25hbWVzJztcbmltcG9ydCB7TmFtZWRBdHRyTWFwfSBmcm9tICcuLi9rZXJuZWxfcmVnaXN0cnknO1xuaW1wb3J0IHtUZW5zb3IxRH0gZnJvbSAnLi4vdGVuc29yJztcbmltcG9ydCB7TmFtZWRUZW5zb3JNYXB9IGZyb20gJy4uL3RlbnNvcl90eXBlcyc7XG5pbXBvcnQge2NvbnZlcnRUb1RlbnNvcn0gZnJvbSAnLi4vdGVuc29yX3V0aWxfZW52JztcbmltcG9ydCB7VGVuc29yTGlrZX0gZnJvbSAnLi4vdHlwZXMnO1xuaW1wb3J0ICogYXMgdXRpbCBmcm9tICcuLi91dGlsJztcblxuaW1wb3J0IHtvcH0gZnJvbSAnLi9vcGVyYXRpb24nO1xuXG4vKipcbiAqIE91dHB1dHMgYSB2ZWN0b3Igd2l0aCBsZW5ndGggYHNpemVgIGFuZCB0aGUgc2FtZSBkdHlwZSBhcyBgd2VpZ2h0c2AuXG4gKlxuICogSWYgYHdlaWdodHNgIGFyZSBlbXB0eSwgdGhlbiBpbmRleCBgaWAgc3RvcmVzIHRoZSBudW1iZXIgb2YgdGltZXMgdGhlIHZhbHVlXG4gKiBgaWAgaXMgY291bnRlZCBpbiBgeGAuIElmIGB3ZWlnaHRzYCBhcmUgbm9uLWVtcHR5LCB0aGVuIGluZGV4IGBpYCBzdG9yZXMgdGhlXG4gKiBzdW0gb2YgdGhlIHZhbHVlIGluIGB3ZWlnaHRzYCBhdCBlYWNoIGluZGV4IHdoZXJlIHRoZSBjb3JyZXNwb25kaW5nIHZhbHVlIGluXG4gKiBgeGAgaXMgYGlgLlxuICpcbiAqIFZhbHVlcyBpbiBgeGAgb3V0c2lkZSBvZiB0aGUgcmFuZ2UgWzAsIHNpemUpIGFyZSBpZ25vcmVkLlxuICpcbiAqIEBwYXJhbSB4IFRoZSBpbnB1dCBpbnQgdGVuc29yLCByYW5rIDEuXG4gKiBAcGFyYW0gd2VpZ2h0cyBUaGUgd2VpZ2h0cyB0ZW5zb3IsIG11c3QgaGF2ZSB0aGUgc2FtZSBzaGFwZSBhcyB4LCBvciBhXG4gKiAgICAgbGVuZ3RoLTAgVGVuc29yLCBpbiB3aGljaCBjYXNlIGl0IGFjdHMgYXMgYWxsIHdlaWdodHMgZXF1YWwgdG8gMS5cbiAqIEBwYXJhbSBzaXplIE5vbi1uZWdhdGl2ZSBpbnRlZ2VyLlxuICpcbiAqIEBkb2Mge2hlYWRpbmc6ICdPcGVyYXRpb25zJywgc3ViaGVhZGluZzogJ1JlZHVjdGlvbid9XG4gKi9cbmZ1bmN0aW9uIGJpbmNvdW50XzxUIGV4dGVuZHMgVGVuc29yMUQ+KFxuICAgIHg6IFR8VGVuc29yTGlrZSwgd2VpZ2h0czogVHxUZW5zb3JMaWtlLCBzaXplOiBudW1iZXIpOiBUIHtcbiAgY29uc3QgJHggPSBjb252ZXJ0VG9UZW5zb3IoeCwgJ3gnLCAnYmluY291bnQnKTtcbiAgY29uc3QgJHdlaWdodHMgPSBjb252ZXJ0VG9UZW5zb3Iod2VpZ2h0cywgJ3dlaWdodHMnLCAnYmluY291bnQnKTtcblxuICB1dGlsLmFzc2VydChcbiAgICAgICR4LmR0eXBlID09PSAnaW50MzInLFxuICAgICAgKCkgPT4gYEVycm9yIGluIGJpbmNvdW50OiBpbnB1dCBgICtcbiAgICAgICAgICBgZHR5cGUgbXVzdCBiZSBpbnQzMiwgYnV0IGdvdCAkeyR4LmR0eXBlfWApO1xuICB1dGlsLmFzc2VydChzaXplID49IDAsICgpID0+IGBzaXplIG11c3QgYmUgbm9uLW5lZ2F0aXZlLCBidXQgZ290ICR7c2l6ZX0uYCk7XG4gIHV0aWwuYXNzZXJ0KFxuICAgICAgJHdlaWdodHMuc2l6ZSA9PT0gJHguc2l6ZSB8fCAkd2VpZ2h0cy5zaXplID09PSAwLFxuICAgICAgKCkgPT4gYEVycm9yIGluIGJpbmNvdW50OiB3ZWlnaHRzIG11c3QgaGF2ZSB0aGUgc2FtZSBzaXplIGFzIGlucHV0IG9yYCArXG4gICAgICAgICAgYDAtbGVuZ3RoLCBidXQgZ290IGlucHV0IHNoYXBlOiAkeyR4LnNoYXBlfSwgd2VpZ2h0cyBzaGFwZTogYCArXG4gICAgICAgICAgYCR7JHdlaWdodHMuc2hhcGV9LmApO1xuXG4gIGNvbnN0IGlucHV0czogQmluY291bnRJbnB1dHMgPSB7eDogJHgsIHdlaWdodHM6ICR3ZWlnaHRzfTtcbiAgY29uc3QgYXR0cnM6IEJpbmNvdW50QXR0cnMgPSB7c2l6ZX07XG5cbiAgcmV0dXJuIEVOR0lORS5ydW5LZXJuZWwoXG4gICAgICBCaW5jb3VudCwgaW5wdXRzIGFzIHt9IGFzIE5hbWVkVGVuc29yTWFwLCBhdHRycyBhcyB7fSBhcyBOYW1lZEF0dHJNYXApO1xufVxuXG5leHBvcnQgY29uc3QgYmluY291bnQgPSBvcCh7YmluY291bnRffSk7XG4iXX0=","/**\n * @license\n * Copyright 2021 Google LLC. All Rights Reserved.\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n * =============================================================================\n */\nimport { ENGINE } from '../engine';\nimport { BroadcastArgs } from '../kernel_names';\nimport { convertToTensor } from '../tensor_util_env';\nimport { op } from './operation';\n/**\n * Return the shape of s0 op s1 with broadcast.\n *\n * compute r0, the broadcasted shape as a tensor.\n * s0, s1 and r0 are all integer vectors.\n *\n * This function returns the shape of the result of an operation between\n * two tensors of size s0 and s1 performed with broadcast.\n *\n * @param s0 A tensor representing a shape\n * @param s1 A tensor representing a shape\n *\n * @doc {heading: 'Tensors', subheading: 'Transformations'}\n */\nfunction broadcastArgs_(s0, s1) {\n const shape1Input = convertToTensor(s0, 's0', 'broadcastArgs', 'int32');\n const shape2Input = convertToTensor(s1, 's1', 'broadcastArgs', 'int32');\n if (shape1Input.rank !== 1) {\n throw new Error('broadcastArgs(): first input must be a vector (rank=1). ' +\n `Has rank ${shape1Input.rank}`);\n }\n if (shape2Input.rank !== 1) {\n throw new Error('broadcastArgs(): second input must be a vector (rank=1). ' +\n `Has rank ${shape2Input.rank}`);\n }\n const inputs = { s0: shape1Input, s1: shape2Input };\n return ENGINE.runKernel(BroadcastArgs, inputs);\n}\nexport const broadcastArgs = op({ broadcastArgs_ });\n//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYnJvYWRjYXN0X2FyZ3MuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi8uLi90ZmpzLWNvcmUvc3JjL29wcy9icm9hZGNhc3RfYXJncy50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQTs7Ozs7Ozs7Ozs7Ozs7O0dBZUc7QUFHSCxPQUFPLEVBQUUsTUFBTSxFQUFFLE1BQU0sV0FBVyxDQUFDO0FBQ25DLE9BQU8sRUFBRSxhQUFhLEVBQXVCLE1BQU0saUJBQWlCLENBQUM7QUFFckUsT0FBTyxFQUFFLGVBQWUsRUFBRSxNQUFNLG9CQUFvQixDQUFDO0FBR3JELE9BQU8sRUFBRSxFQUFFLEVBQUUsTUFBTSxhQUFhLENBQUM7QUFFakM7Ozs7Ozs7Ozs7Ozs7R0FhRztBQUNILFNBQVMsY0FBYyxDQUNyQixFQUF1QixFQUFFLEVBQXVCO0lBQ2hELE1BQU0sV0FBVyxHQUFHLGVBQWUsQ0FBQyxFQUFFLEVBQUUsSUFBSSxFQUFFLGVBQWUsRUFBRSxPQUFPLENBQUMsQ0FBQztJQUN4RSxNQUFNLFdBQVcsR0FBRyxlQUFlLENBQUMsRUFBRSxFQUFFLElBQUksRUFBRSxlQUFlLEVBQUUsT0FBTyxDQUFDLENBQUM7SUFFeEUsSUFBSSxXQUFXLENBQUMsSUFBSSxLQUFLLENBQUMsRUFBRTtRQUMxQixNQUFNLElBQUksS0FBSyxDQUNiLDBEQUEwRDtZQUMxRCxZQUFZLFdBQVcsQ0FBQyxJQUFJLEVBQUUsQ0FBQyxDQUFDO0tBQ25DO0lBRUQsSUFBSSxXQUFXLENBQUMsSUFBSSxLQUFLLENBQUMsRUFBRTtRQUMxQixNQUFNLElBQUksS0FBSyxDQUNiLDJEQUEyRDtZQUMzRCxZQUFZLFdBQVcsQ0FBQyxJQUFJLEVBQUUsQ0FBQyxDQUFDO0tBQ25DO0lBRUQsTUFBTSxNQUFNLEdBQXdCLEVBQUUsRUFBRSxFQUFFLFdBQVcsRUFBRSxFQUFFLEVBQUUsV0FBVyxFQUFFLENBQUM7SUFDekUsT0FBTyxNQUFNLENBQUMsU0FBUyxDQUFDLGFBQWEsRUFBRSxNQUE4QixDQUFDLENBQUM7QUFDekUsQ0FBQztBQUVELE1BQU0sQ0FBQyxNQUFNLGFBQWEsR0FBRyxFQUFFLENBQUMsRUFBRSxjQUFjLEVBQUUsQ0FBQyxDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiLyoqXG4gKiBAbGljZW5zZVxuICogQ29weXJpZ2h0IDIwMjEgR29vZ2xlIExMQy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC5cbiAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSBcIkxpY2Vuc2VcIik7XG4gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuXG4gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXRcbiAqXG4gKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjBcbiAqXG4gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlXG4gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiBcIkFTIElTXCIgQkFTSVMsXG4gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC5cbiAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmRcbiAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLlxuICogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbiAqL1xuXG5pbXBvcnQgeyBOYW1lZFRlbnNvck1hcCB9IGZyb20gJy4uL3RlbnNvcl90eXBlcyc7XG5pbXBvcnQgeyBFTkdJTkUgfSBmcm9tICcuLi9lbmdpbmUnO1xuaW1wb3J0IHsgQnJvYWRjYXN0QXJncywgQnJvYWRjYXN0QXJnc0lucHV0cyB9IGZyb20gJy4uL2tlcm5lbF9uYW1lcyc7XG5pbXBvcnQgeyBUZW5zb3IgfSBmcm9tICcuLi90ZW5zb3InO1xuaW1wb3J0IHsgY29udmVydFRvVGVuc29yIH0gZnJvbSAnLi4vdGVuc29yX3V0aWxfZW52JztcbmltcG9ydCB7IFJhbmssIFRlbnNvckxpa2UgfSBmcm9tICcuLi90eXBlcyc7XG5cbmltcG9ydCB7IG9wIH0gZnJvbSAnLi9vcGVyYXRpb24nO1xuXG4vKipcbiAqIFJldHVybiB0aGUgc2hhcGUgb2YgczAgb3AgczEgd2l0aCBicm9hZGNhc3QuXG4gKlxuICogY29tcHV0ZSByMCwgdGhlIGJyb2FkY2FzdGVkIHNoYXBlIGFzIGEgdGVuc29yLlxuICogczAsIHMxIGFuZCByMCBhcmUgYWxsIGludGVnZXIgdmVjdG9ycy5cbiAqXG4gKiBUaGlzIGZ1bmN0aW9uIHJldHVybnMgdGhlIHNoYXBlIG9mIHRoZSByZXN1bHQgb2YgYW4gb3BlcmF0aW9uIGJldHdlZW5cbiAqIHR3byB0ZW5zb3JzIG9mIHNpemUgczAgYW5kIHMxIHBlcmZvcm1lZCB3aXRoIGJyb2FkY2FzdC5cbiAqXG4gKiBAcGFyYW0gczAgQSB0ZW5zb3IgcmVwcmVzZW50aW5nIGEgc2hhcGVcbiAqIEBwYXJhbSBzMSBBIHRlbnNvciByZXByZXNlbnRpbmcgYSBzaGFwZVxuICpcbiAqIEBkb2Mge2hlYWRpbmc6ICdUZW5zb3JzJywgc3ViaGVhZGluZzogJ1RyYW5zZm9ybWF0aW9ucyd9XG4gKi9cbmZ1bmN0aW9uIGJyb2FkY2FzdEFyZ3NfPFIgZXh0ZW5kcyBSYW5rPihcbiAgczA6IFRlbnNvciB8IFRlbnNvckxpa2UsIHMxOiBUZW5zb3IgfCBUZW5zb3JMaWtlKTogVGVuc29yPFI+IHtcbiAgY29uc3Qgc2hhcGUxSW5wdXQgPSBjb252ZXJ0VG9UZW5zb3IoczAsICdzMCcsICdicm9hZGNhc3RBcmdzJywgJ2ludDMyJyk7XG4gIGNvbnN0IHNoYXBlMklucHV0ID0gY29udmVydFRvVGVuc29yKHMxLCAnczEnLCAnYnJvYWRjYXN0QXJncycsICdpbnQzMicpO1xuXG4gIGlmIChzaGFwZTFJbnB1dC5yYW5rICE9PSAxKSB7XG4gICAgdGhyb3cgbmV3IEVycm9yKFxuICAgICAgJ2Jyb2FkY2FzdEFyZ3MoKTogZmlyc3QgaW5wdXQgbXVzdCBiZSBhIHZlY3RvciAocmFuaz0xKS4gJyArXG4gICAgICBgSGFzIHJhbmsgJHtzaGFwZTFJbnB1dC5yYW5rfWApO1xuICB9XG5cbiAgaWYgKHNoYXBlMklucHV0LnJhbmsgIT09IDEpIHtcbiAgICB0aHJvdyBuZXcgRXJyb3IoXG4gICAgICAnYnJvYWRjYXN0QXJncygpOiBzZWNvbmQgaW5wdXQgbXVzdCBiZSBhIHZlY3RvciAocmFuaz0xKS4gJyArXG4gICAgICBgSGFzIHJhbmsgJHtzaGFwZTJJbnB1dC5yYW5rfWApO1xuICB9XG5cbiAgY29uc3QgaW5wdXRzOiBCcm9hZGNhc3RBcmdzSW5wdXRzID0geyBzMDogc2hhcGUxSW5wdXQsIHMxOiBzaGFwZTJJbnB1dCB9O1xuICByZXR1cm4gRU5HSU5FLnJ1bktlcm5lbChCcm9hZGNhc3RBcmdzLCBpbnB1dHMgYXMge30gYXMgTmFtZWRUZW5zb3JNYXApO1xufVxuXG5leHBvcnQgY29uc3QgYnJvYWRjYXN0QXJncyA9IG9wKHsgYnJvYWRjYXN0QXJnc18gfSk7XG4iXX0=","import { concat } from './concat';\nimport { op } from './operation';\n/**\n * Concatenates a list of`tf.Tensor1D`s along an axis. See `concat` for details.\n *\n * For example, if:\n * A: shape(3) = |r1, g1, b1|\n * B: shape(2) = |r2, g2|\n * C = tf.concat1d([A, B]) == |r1, g1, b1, r2, g2|\n *\n * @param tensors A list of`tf.Tensor`s to concatenate.\n * @return The concatenated array.\n */\nfunction concat1d_(tensors) {\n return concat(tensors, 0 /* axis */);\n}\nexport const concat1d = op({ concat1d_ });\n//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY29uY2F0XzFkLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vLi4vdGZqcy1jb3JlL3NyYy9vcHMvY29uY2F0XzFkLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQW1CQSxPQUFPLEVBQUMsTUFBTSxFQUFDLE1BQU0sVUFBVSxDQUFDO0FBQ2hDLE9BQU8sRUFBQyxFQUFFLEVBQUMsTUFBTSxhQUFhLENBQUM7QUFFL0I7Ozs7Ozs7Ozs7R0FVRztBQUNILFNBQVMsU0FBUyxDQUFDLE9BQW1DO0lBQ3BELE9BQU8sTUFBTSxDQUFDLE9BQU8sRUFBRSxDQUFDLENBQUMsVUFBVSxDQUFDLENBQUM7QUFDdkMsQ0FBQztBQUVELE1BQU0sQ0FBQyxNQUFNLFFBQVEsR0FBRyxFQUFFLENBQUMsRUFBQyxTQUFTLEVBQUMsQ0FBQyxDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiLyoqXG4gKiBAbGljZW5zZVxuICogQ29weXJpZ2h0IDIwMjAgR29vZ2xlIExMQy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC5cbiAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSBcIkxpY2Vuc2VcIik7XG4gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuXG4gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXRcbiAqXG4gKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjBcbiAqXG4gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlXG4gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiBcIkFTIElTXCIgQkFTSVMsXG4gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC5cbiAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmRcbiAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLlxuICogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbiAqL1xuaW1wb3J0IHtUZW5zb3IxRH0gZnJvbSAnLi4vdGVuc29yJztcbmltcG9ydCB7VGVuc29yTGlrZX0gZnJvbSAnLi4vdHlwZXMnO1xuXG5pbXBvcnQge2NvbmNhdH0gZnJvbSAnLi9jb25jYXQnO1xuaW1wb3J0IHtvcH0gZnJvbSAnLi9vcGVyYXRpb24nO1xuXG4vKipcbiAqIENvbmNhdGVuYXRlcyBhIGxpc3Qgb2ZgdGYuVGVuc29yMURgcyBhbG9uZyBhbiBheGlzLiBTZWUgYGNvbmNhdGAgZm9yIGRldGFpbHMuXG4gKlxuICogRm9yIGV4YW1wbGUsIGlmOlxuICogQTogc2hhcGUoMykgPSB8cjEsIGcxLCBiMXxcbiAqIEI6IHNoYXBlKDIpID0gfHIyLCBnMnxcbiAqIEMgPSB0Zi5jb25jYXQxZChbQSwgQl0pID09IHxyMSwgZzEsIGIxLCByMiwgZzJ8XG4gKlxuICogQHBhcmFtIHRlbnNvcnMgQSBsaXN0IG9mYHRmLlRlbnNvcmBzIHRvIGNvbmNhdGVuYXRlLlxuICogQHJldHVybiBUaGUgY29uY2F0ZW5hdGVkIGFycmF5LlxuICovXG5mdW5jdGlvbiBjb25jYXQxZF8odGVuc29yczogQXJyYXk8VGVuc29yMUR8VGVuc29yTGlrZT4pOiBUZW5zb3IxRCB7XG4gIHJldHVybiBjb25jYXQodGVuc29ycywgMCAvKiBheGlzICovKTtcbn1cblxuZXhwb3J0IGNvbnN0IGNvbmNhdDFkID0gb3Aoe2NvbmNhdDFkX30pO1xuIl19","import { concat } from './concat';\nimport { op } from './operation';\n/**\n * Concatenates a list of`tf.Tensor2D`s along an axis. See `concat` for details.\n *\n * For example, if:\n * A: shape(2, 3) = | r1, g1, b1 |\n * | r2, g2, b2 |\n *\n * B: shape(2, 3) = | r3, g3, b3 |\n * | r4, g4, b4 |\n *\n * C = tf.concat2d([A, B], axis)\n *\n * if axis = 0:\n * C: shape(4, 3) = | r1, g1, b1 |\n * | r2, g2, b2 |\n * | r3, g3, b3 |\n * | r4, g4, b4 |\n *\n * if axis = 1:\n * C = shape(2, 6) = | r1, g1, b1, r3, g3, b3 |\n * | r2, g2, b2, r4, g4, b4 |\n *\n *\n * @param tensors A list of `tf.Tensor`s to concatenate.\n * @param axis The axis to concatenate along.\n * @return The concatenated array.\n */\nfunction concat2d_(tensors, axis) {\n return concat(tensors, axis);\n}\nexport const concat2d = op({ concat2d_ });\n//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY29uY2F0XzJkLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vLi4vdGZqcy1jb3JlL3NyYy9vcHMvY29uY2F0XzJkLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQW1CQSxPQUFPLEVBQUMsTUFBTSxFQUFDLE1BQU0sVUFBVSxDQUFDO0FBQ2hDLE9BQU8sRUFBQyxFQUFFLEVBQUMsTUFBTSxhQUFhLENBQUM7QUFFL0I7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7O0dBMEJHO0FBQ0gsU0FBUyxTQUFTLENBQ2QsT0FBbUMsRUFBRSxJQUFZO0lBQ25ELE9BQU8sTUFBTSxDQUFDLE9BQU8sRUFBRSxJQUFJLENBQUMsQ0FBQztBQUMvQixDQUFDO0FBRUQsTUFBTSxDQUFDLE1BQU0sUUFBUSxHQUFHLEVBQUUsQ0FBQyxFQUFDLFNBQVMsRUFBQyxDQUFDLENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyIvKipcbiAqIEBsaWNlbnNlXG4gKiBDb3B5cmlnaHQgMjAyMCBHb29nbGUgTExDLiBBbGwgUmlnaHRzIFJlc2VydmVkLlxuICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlIFwiTGljZW5zZVwiKTtcbiAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS5cbiAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdFxuICpcbiAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMFxuICpcbiAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmVcbiAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuIFwiQVMgSVNcIiBCQVNJUyxcbiAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLlxuICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZFxuICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuXG4gKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuICovXG5pbXBvcnQge1RlbnNvcjJEfSBmcm9tICcuLi90ZW5zb3InO1xuaW1wb3J0IHtUZW5zb3JMaWtlfSBmcm9tICcuLi90eXBlcyc7XG5cbmltcG9ydCB7Y29uY2F0fSBmcm9tICcuL2NvbmNhdCc7XG5pbXBvcnQge29wfSBmcm9tICcuL29wZXJhdGlvbic7XG5cbi8qKlxuICogQ29uY2F0ZW5hdGVzIGEgbGlzdCBvZmB0Zi5UZW5zb3IyRGBzIGFsb25nIGFuIGF4aXMuIFNlZSBgY29uY2F0YCBmb3IgZGV0YWlscy5cbiAqXG4gKiBGb3IgZXhhbXBsZSwgaWY6XG4gKiBBOiBzaGFwZSgyLCAzKSA9IHwgcjEsIGcxLCBiMSB8XG4gKiAgICAgICAgICAgICAgICAgIHwgcjIsIGcyLCBiMiB8XG4gKlxuICogQjogc2hhcGUoMiwgMykgPSB8IHIzLCBnMywgYjMgfFxuICogICAgICAgICAgICAgICAgICB8IHI0LCBnNCwgYjQgfFxuICpcbiAqIEMgPSB0Zi5jb25jYXQyZChbQSwgQl0sIGF4aXMpXG4gKlxuICogaWYgYXhpcyA9IDA6XG4gKiBDOiBzaGFwZSg0LCAzKSA9IHwgcjEsIGcxLCBiMSB8XG4gKiAgICAgICAgICAgICAgICAgIHwgcjIsIGcyLCBiMiB8XG4gKiAgICAgICAgICAgICAgICAgIHwgcjMsIGczLCBiMyB8XG4gKiAgICAgICAgICAgICAgICAgIHwgcjQsIGc0LCBiNCB8XG4gKlxuICogaWYgYXhpcyA9IDE6XG4gKiBDID0gc2hhcGUoMiwgNikgPSB8IHIxLCBnMSwgYjEsIHIzLCBnMywgYjMgfFxuICogICAgICAgICAgICAgICAgICAgfCByMiwgZzIsIGIyLCByNCwgZzQsIGI0IHxcbiAqXG4gKlxuICogQHBhcmFtIHRlbnNvcnMgQSBsaXN0IG9mIGB0Zi5UZW5zb3JgcyB0byBjb25jYXRlbmF0ZS5cbiAqIEBwYXJhbSBheGlzIFRoZSBheGlzIHRvIGNvbmNhdGVuYXRlIGFsb25nLlxuICogQHJldHVybiBUaGUgY29uY2F0ZW5hdGVkIGFycmF5LlxuICovXG5mdW5jdGlvbiBjb25jYXQyZF8oXG4gICAgdGVuc29yczogQXJyYXk8VGVuc29yMkR8VGVuc29yTGlrZT4sIGF4aXM6IG51bWJlcik6IFRlbnNvcjJEIHtcbiAgcmV0dXJuIGNvbmNhdCh0ZW5zb3JzLCBheGlzKTtcbn1cblxuZXhwb3J0IGNvbnN0IGNvbmNhdDJkID0gb3Aoe2NvbmNhdDJkX30pO1xuIl19","import { concat } from './concat';\nimport { op } from './operation';\n/**\n * Concatenates a list of `tf.Tensor3D`s along an axis.\n * See `concat` for details.\n *\n * For example, if:\n * A: shape(2, 1, 3) = | r1, g1, b1 |\n * | r2, g2, b2 |\n *\n * B: shape(2, 1, 3) = | r3, g3, b3 |\n * | r4, g4, b4 |\n *\n * C = tf.concat3d([A, B], axis)\n *\n * if axis = 0:\n * C: shape(4, 1, 3) = | r1, g1, b1 |\n * | r2, g2, b2 |\n * | r3, g3, b3 |\n * | r4, g4, b4 |\n *\n * if axis = 1:\n * C: shape(2, 2, 3) = | r1, g1, b1, r3, g3, b3 |\n * | r2, g2, b2, r4, g4, b4 |\n *\n * if axis = 2:\n * C = shape(2, 1, 6) = | r1, g1, b1, r3, g3, b3 |\n * | r2, g2, b2, r4, g4, b4 |\n *\n * @param tensors A list of`tf.Tensor`s to concatenate.\n * @param axis The axis to concate along.\n * @return The concatenated array.\n */\nfunction concat3d_(tensors, axis) {\n return concat(tensors, axis);\n}\nexport const concat3d = op({ concat3d_ });\n//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY29uY2F0XzNkLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vLi4vdGZqcy1jb3JlL3NyYy9vcHMvY29uY2F0XzNkLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQW1CQSxPQUFPLEVBQUMsTUFBTSxFQUFDLE1BQU0sVUFBVSxDQUFDO0FBQ2hDLE9BQU8sRUFBQyxFQUFFLEVBQUMsTUFBTSxhQUFhLENBQUM7QUFFL0I7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7OztHQThCRztBQUNILFNBQVMsU0FBUyxDQUNkLE9BQW1DLEVBQUUsSUFBWTtJQUNuRCxPQUFPLE1BQU0sQ0FBQyxPQUFPLEVBQUUsSUFBSSxDQUFDLENBQUM7QUFDL0IsQ0FBQztBQUVELE1BQU0sQ0FBQyxNQUFNLFFBQVEsR0FBRyxFQUFFLENBQUMsRUFBQyxTQUFTLEVBQUMsQ0FBQyxDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiLyoqXG4gKiBAbGljZW5zZVxuICogQ29weXJpZ2h0IDIwMjAgR29vZ2xlIExMQy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC5cbiAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSBcIkxpY2Vuc2VcIik7XG4gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuXG4gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXRcbiAqXG4gKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjBcbiAqXG4gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlXG4gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiBcIkFTIElTXCIgQkFTSVMsXG4gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC5cbiAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmRcbiAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLlxuICogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbiAqL1xuaW1wb3J0IHtUZW5zb3IzRH0gZnJvbSAnLi4vdGVuc29yJztcbmltcG9ydCB7VGVuc29yTGlrZX0gZnJvbSAnLi4vdHlwZXMnO1xuXG5pbXBvcnQge2NvbmNhdH0gZnJvbSAnLi9jb25jYXQnO1xuaW1wb3J0IHtvcH0gZnJvbSAnLi9vcGVyYXRpb24nO1xuXG4vKipcbiAqIENvbmNhdGVuYXRlcyBhIGxpc3Qgb2YgYHRmLlRlbnNvcjNEYHMgYWxvbmcgYW4gYXhpcy5cbiAqIFNlZSBgY29uY2F0YCBmb3IgZGV0YWlscy5cbiAqXG4gKiBGb3IgZXhhbXBsZSwgaWY6XG4gKiBBOiBzaGFwZSgyLCAxLCAzKSA9IHwgcjEsIGcxLCBiMSB8XG4gKiAgICAgICAgICAgICAgICAgICAgIHwgcjIsIGcyLCBiMiB8XG4gKlxuICogQjogc2hhcGUoMiwgMSwgMykgPSB8IHIzLCBnMywgYjMgfFxuICogICAgICAgICAgICAgICAgICAgICB8IHI0LCBnNCwgYjQgfFxuICpcbiAqIEMgPSB0Zi5jb25jYXQzZChbQSwgQl0sIGF4aXMpXG4gKlxuICogaWYgYXhpcyA9IDA6XG4gKiBDOiBzaGFwZSg0LCAxLCAzKSA9IHwgcjEsIGcxLCBiMSB8XG4gKiAgICAgICAgICAgICAgICAgICAgIHwgcjIsIGcyLCBiMiB8XG4gKiAgICAgICAgICAgICAgICAgICAgIHwgcjMsIGczLCBiMyB8XG4gKiAgICAgICAgICAgICAgICAgICAgIHwgcjQsIGc0LCBiNCB8XG4gKlxuICogaWYgYXhpcyA9IDE6XG4gKiBDOiBzaGFwZSgyLCAyLCAzKSA9IHwgcjEsIGcxLCBiMSwgcjMsIGczLCBiMyB8XG4gKiAgICAgICAgICAgICAgICAgICAgIHwgcjIsIGcyLCBiMiwgcjQsIGc0LCBiNCB8XG4gKlxuICogaWYgYXhpcyA9IDI6XG4gKiBDID0gc2hhcGUoMiwgMSwgNikgPSB8IHIxLCBnMSwgYjEsIHIzLCBnMywgYjMgfFxuICogICAgICAgICAgICAgICAgICAgICAgfCByMiwgZzIsIGIyLCByNCwgZzQsIGI0IHxcbiAqXG4gKiBAcGFyYW0gdGVuc29ycyBBIGxpc3Qgb2ZgdGYuVGVuc29yYHMgdG8gY29uY2F0ZW5hdGUuXG4gKiBAcGFyYW0gYXhpcyBUaGUgYXhpcyB0byBjb25jYXRlIGFsb25nLlxuICogQHJldHVybiBUaGUgY29uY2F0ZW5hdGVkIGFycmF5LlxuICovXG5mdW5jdGlvbiBjb25jYXQzZF8oXG4gICAgdGVuc29yczogQXJyYXk8VGVuc29yM0R8VGVuc29yTGlrZT4sIGF4aXM6IG51bWJlcik6IFRlbnNvcjNEIHtcbiAgcmV0dXJuIGNvbmNhdCh0ZW5zb3JzLCBheGlzKTtcbn1cblxuZXhwb3J0IGNvbnN0IGNvbmNhdDNkID0gb3Aoe2NvbmNhdDNkX30pO1xuIl19","import { concat } from './concat';\nimport { op } from './operation';\n/**\n * Concatenates a list of `tf.Tensor4D`s along an axis.\n * See `concat` for details.\n *\n * @param tensors A list of `tf.Tensor`s to concatenate.\n * @param axis The axis to concate along.\n * @return The concatenated array.\n */\nfunction concat4d_(tensors, axis) {\n return concat(tensors, axis);\n}\nexport const concat4d = op({ concat4d_ });\n//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY29uY2F0XzRkLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vLi4vdGZqcy1jb3JlL3NyYy9vcHMvY29uY2F0XzRkLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQW1CQSxPQUFPLEVBQUMsTUFBTSxFQUFDLE1BQU0sVUFBVSxDQUFDO0FBQ2hDLE9BQU8sRUFBQyxFQUFFLEVBQUMsTUFBTSxhQUFhLENBQUM7QUFFL0I7Ozs7Ozs7R0FPRztBQUNILFNBQVMsU0FBUyxDQUNkLE9BQW1DLEVBQUUsSUFBWTtJQUNuRCxPQUFPLE1BQU0sQ0FBQyxPQUFPLEVBQUUsSUFBSSxDQUFDLENBQUM7QUFDL0IsQ0FBQztBQUVELE1BQU0sQ0FBQyxNQUFNLFFBQVEsR0FBRyxFQUFFLENBQUMsRUFBQyxTQUFTLEVBQUMsQ0FBQyxDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiLyoqXG4gKiBAbGljZW5zZVxuICogQ29weXJpZ2h0IDIwMjAgR29vZ2xlIExMQy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC5cbiAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSBcIkxpY2Vuc2VcIik7XG4gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuXG4gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXRcbiAqXG4gKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjBcbiAqXG4gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlXG4gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiBcIkFTIElTXCIgQkFTSVMsXG4gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC5cbiAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmRcbiAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLlxuICogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbiAqL1xuaW1wb3J0IHtUZW5zb3I0RH0gZnJvbSAnLi4vdGVuc29yJztcbmltcG9ydCB7VGVuc29yTGlrZX0gZnJvbSAnLi4vdHlwZXMnO1xuXG5pbXBvcnQge2NvbmNhdH0gZnJvbSAnLi9jb25jYXQnO1xuaW1wb3J0IHtvcH0gZnJvbSAnLi9vcGVyYXRpb24nO1xuXG4vKipcbiAqIENvbmNhdGVuYXRlcyBhIGxpc3Qgb2YgYHRmLlRlbnNvcjREYHMgYWxvbmcgYW4gYXhpcy5cbiAqIFNlZSBgY29uY2F0YCBmb3IgZGV0YWlscy5cbiAqXG4gKiBAcGFyYW0gdGVuc29ycyBBIGxpc3Qgb2YgYHRmLlRlbnNvcmBzIHRvIGNvbmNhdGVuYXRlLlxuICogQHBhcmFtIGF4aXMgVGhlIGF4aXMgdG8gY29uY2F0ZSBhbG9uZy5cbiAqIEByZXR1cm4gVGhlIGNvbmNhdGVuYXRlZCBhcnJheS5cbiAqL1xuZnVuY3Rpb24gY29uY2F0NGRfKFxuICAgIHRlbnNvcnM6IEFycmF5PFRlbnNvcjREfFRlbnNvckxpa2U+LCBheGlzOiBudW1iZXIpOiBUZW5zb3I0RCB7XG4gIHJldHVybiBjb25jYXQodGVuc29ycywgYXhpcyk7XG59XG5cbmV4cG9ydCBjb25zdCBjb25jYXQ0ZCA9IG9wKHtjb25jYXQ0ZF99KTtcbiJdfQ==","/**\n * @license\n * Copyright 2020 Google LLC. All Rights Reserved.\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n * =============================================================================\n */\nimport { ENGINE } from '../engine';\nimport { Conv3D } from '../kernel_names';\nimport { convertToTensor } from '../tensor_util_env';\nimport * as util from '../util';\nimport { eitherStridesOrDilationsAreOne } from './conv_util';\nimport { op } from './operation';\nimport { reshape } from './reshape';\n/**\n * Computes a 3D convolution over the input x.\n *\n * @param x The input tensor, of rank 5 or rank 4, of shape\n * `[batch, depth, height, width, channels]`. If rank 4,\n * batch of 1 is assumed.\n * @param filter The filter, rank 5, of shape\n * `[filterDepth, filterHeight, filterWidth, inChannels, outChannels]`.\n * inChannels must match between input and filter.\n * @param strides The strides of the convolution: `[strideDepth, strideHeight,\n * strideWidth]`.\n * @param pad The type of padding algorithm.\n * - `same` and stride 1: output will be of same size as input,\n * regardless of filter size.\n * - `valid`: output will be smaller than input if filter is larger\n * than 1x1.\n * - For more info, see this guide:\n * [https://www.tensorflow.org/api_docs/python/tf/nn/convolution](\n * https://www.tensorflow.org/api_docs/python/tf/nn/convolution)\n * @param dataFormat: An optional string from: \"NDHWC\", \"NCDHW\". Defaults to\n * \"NDHWC\". Specify the data format of the input and output data. With the\n * default format \"NDHWC\", the data is stored in the order of: [batch,\n * depth, height, width, channels]. Only \"NDHWC\" is currently supported.\n * @param dilations The dilation rates: `[dilationDepth, dilationHeight,\n * dilationWidth]` in which we sample input values across the height\n * and width dimensions in atrous convolution. Defaults to `[1, 1, 1]`.\n * If `dilations` is a single number, then\n * `dilationDepth == dilationHeight == dilationWidth`. If it is greater\n * than 1, then all values of `strides` must be 1.\n *\n * @doc {heading: 'Operations', subheading: 'Convolution'}\n */\nfunction conv3d_(x, filter, strides, pad, dataFormat = 'NDHWC', dilations = [1, 1, 1]) {\n const $x = convertToTensor(x, 'x', 'conv3d');\n const $filter = convertToTensor(filter, 'filter', 'conv3d');\n let x5D = $x;\n let reshapedTo5D = false;\n if ($x.rank === 4) {\n reshapedTo5D = true;\n x5D = reshape($x, [1, $x.shape[0], $x.shape[1], $x.shape[2], $x.shape[3]]);\n }\n util.assert(x5D.rank === 5, () => `Error in conv3d: input must be rank 5, but got rank ${x5D.rank}.`);\n util.assert($filter.rank === 5, () => `Error in conv3d: filter must be rank 5, but got rank ` +\n `${$filter.rank}.`);\n util.assert(x5D.shape[4] === $filter.shape[3], () => `Error in conv3d: depth of input (${x5D.shape[4]}) must match ` +\n `input depth for filter ${$filter.shape[3]}.`);\n util.assert(eitherStridesOrDilationsAreOne(strides, dilations), () => 'Error in conv3D: Either strides or dilations must be 1. ' +\n `Got strides ${strides} and dilations '${dilations}'`);\n util.assert(dataFormat === 'NDHWC', () => `Error in conv3d: got dataFormat of ${dataFormat} but only NDHWC is currently supported.`);\n const inputs = { x: x5D, filter: $filter };\n const attrs = { strides, pad, dataFormat, dilations };\n // tslint:disable-next-line: no-unnecessary-type-assertion\n const res = ENGINE.runKernel(Conv3D, inputs, attrs);\n if (reshapedTo5D) {\n return reshape(res, [res.shape[1], res.shape[2], res.shape[3], res.shape[4]]);\n }\n return res;\n}\nexport const conv3d = op({ conv3d_ });\n//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY29udjNkLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vLi4vdGZqcy1jb3JlL3NyYy9vcHMvY29udjNkLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBOzs7Ozs7Ozs7Ozs7Ozs7R0FlRztBQUNILE9BQU8sRUFBQyxNQUFNLEVBQUMsTUFBTSxXQUFXLENBQUM7QUFDakMsT0FBTyxFQUFDLE1BQU0sRUFBNEIsTUFBTSxpQkFBaUIsQ0FBQztBQUlsRSxPQUFPLEVBQUMsZUFBZSxFQUFDLE1BQU0sb0JBQW9CLENBQUM7QUFFbkQsT0FBTyxLQUFLLElBQUksTUFBTSxTQUFTLENBQUM7QUFFaEMsT0FBTyxFQUFDLDhCQUE4QixFQUFDLE1BQU0sYUFBYSxDQUFDO0FBQzNELE9BQU8sRUFBQyxFQUFFLEVBQUMsTUFBTSxhQUFhLENBQUM7QUFDL0IsT0FBTyxFQUFDLE9BQU8sRUFBQyxNQUFNLFdBQVcsQ0FBQztBQUVsQzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7OztHQStCRztBQUNILFNBQVMsT0FBTyxDQUNaLENBQWUsRUFBRSxNQUEyQixFQUM1QyxPQUF3QyxFQUFFLEdBQW1CLEVBQzdELGFBQThCLE9BQU8sRUFDckMsWUFBNkMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsQ0FBQztJQUN4RCxNQUFNLEVBQUUsR0FBRyxlQUFlLENBQUMsQ0FBQyxFQUFFLEdBQUcsRUFBRSxRQUFRLENBQUMsQ0FBQztJQUM3QyxNQUFNLE9BQU8sR0FBRyxlQUFlLENBQUMsTUFBTSxFQUFFLFFBQVEsRUFBRSxRQUFRLENBQUMsQ0FBQztJQUU1RCxJQUFJLEdBQUcsR0FBRyxFQUFjLENBQUM7SUFDekIsSUFBSSxZQUFZLEdBQUcsS0FBSyxDQUFDO0lBRXpCLElBQUksRUFBRSxDQUFDLElBQUksS0FBSyxDQUFDLEVBQUU7UUFDakIsWUFBWSxHQUFHLElBQUksQ0FBQztRQUNwQixHQUFHLEdBQUcsT0FBTyxDQUFDLEVBQUUsRUFBRSxDQUFDLENBQUMsRUFBRSxFQUFFLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQyxFQUFFLEVBQUUsQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDLEVBQUUsRUFBRSxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUMsRUFBRSxFQUFFLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQztLQUM1RTtJQUNELElBQUksQ0FBQyxNQUFNLENBQ1AsR0FBRyxDQUFDLElBQUksS0FBSyxDQUFDLEVBQ2QsR0FBRyxFQUFFLENBQUMsdURBQXVELEdBQUcsQ0FBQyxJQUFJLEdBQUcsQ0FBQyxDQUFDO0lBQzlFLElBQUksQ0FBQyxNQUFNLENBQ1AsT0FBTyxDQUFDLElBQUksS0FBSyxDQUFDLEVBQ2xCLEdBQUcsRUFBRSxDQUFDLHVEQUF1RDtRQUN6RCxHQUFHLE9BQU8sQ0FBQyxJQUFJLEdBQUcsQ0FBQyxDQUFDO0lBQzVCLElBQUksQ0FBQyxNQUFNLENBQ1AsR0FBRyxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUMsS0FBSyxPQUFPLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQyxFQUNqQyxHQUFHLEVBQUUsQ0FBQyxvQ0FBb0MsR0FBRyxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUMsZUFBZTtRQUNqRSwwQkFBMEIsT0FBTyxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUM7SUFDdkQsSUFBSSxDQUFDLE1BQU0sQ0FDUCw4QkFBOEIsQ0FBQyxPQUFPLEVBQUUsU0FBUyxDQUFDLEVBQ2xELEdBQUcsRUFBRSxDQUFDLDBEQUEwRDtRQUM1RCxlQUFlLE9BQU8sbUJBQW1CLFNBQVMsR0FBRyxDQUFDLENBQUM7SUFDL0QsSUFBSSxDQUFDLE1BQU0sQ0FDUCxVQUFVLEtBQUssT0FBTyxFQUN0QixHQUFHLEVBQUUsQ0FBQyxzQ0FDRixVQUFVLHlDQUF5QyxDQUFDLENBQUM7SUFFN0QsTUFBTSxNQUFNLEdBQWlCLEVBQUMsQ0FBQyxFQUFFLEdBQUcsRUFBRSxNQUFNLEVBQUUsT0FBTyxFQUFDLENBQUM7SUFFdkQsTUFBTSxLQUFLLEdBQWdCLEVBQUMsT0FBTyxFQUFFLEdBQUcsRUFBRSxVQUFVLEVBQUUsU0FBUyxFQUFDLENBQUM7SUFFakUsMERBQTBEO0lBQzFELE1BQU0sR0FBRyxHQUFHLE1BQU0sQ0FBQyxTQUFTLENBQ1osTUFBTSxFQUFFLE1BQThCLEVBQ3RDLEtBQTJCLENBQU0sQ0FBQztJQUVsRCxJQUFJLFlBQVksRUFBRTtRQUNoQixPQUFPLE9BQU8sQ0FDSCxHQUFHLEVBQUUsQ0FBQyxHQUFHLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQyxFQUFFLEdBQUcsQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDLEVBQUUsR0FBRyxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUMsRUFBRSxHQUFHLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQ25FLENBQUM7S0FDUDtJQUNELE9BQU8sR0FBRyxDQUFDO0FBQ2IsQ0FBQztBQUVELE1BQU0sQ0FBQyxNQUFNLE1BQU0sR0FBRyxFQUFFLENBQUMsRUFBQyxPQUFPLEVBQUMsQ0FBQyxDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiLyoqXG4gKiBAbGljZW5zZVxuICogQ29weXJpZ2h0IDIwMjAgR29vZ2xlIExMQy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC5cbiAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSBcIkxpY2Vuc2VcIik7XG4gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuXG4gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXRcbiAqXG4gKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjBcbiAqXG4gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlXG4gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiBcIkFTIElTXCIgQkFTSVMsXG4gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC5cbiAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmRcbiAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLlxuICogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbiAqL1xuaW1wb3J0IHtFTkdJTkV9IGZyb20gJy4uL2VuZ2luZSc7XG5pbXBvcnQge0NvbnYzRCwgQ29udjNEQXR0cnMsIENvbnYzRElucHV0c30gZnJvbSAnLi4va2VybmVsX25hbWVzJztcbmltcG9ydCB7TmFtZWRBdHRyTWFwfSBmcm9tICcuLi9rZXJuZWxfcmVnaXN0cnknO1xuaW1wb3J0IHtUZW5zb3I0RCwgVGVuc29yNUR9IGZyb20gJy4uL3RlbnNvcic7XG5pbXBvcnQge05hbWVkVGVuc29yTWFwfSBmcm9tICcuLi90ZW5zb3JfdHlwZXMnO1xuaW1wb3J0IHtjb252ZXJ0VG9UZW5zb3J9IGZyb20gJy4uL3RlbnNvcl91dGlsX2Vudic7XG5pbXBvcnQge1RlbnNvckxpa2V9IGZyb20gJy4uL3R5cGVzJztcbmltcG9ydCAqIGFzIHV0aWwgZnJvbSAnLi4vdXRpbCc7XG5cbmltcG9ydCB7ZWl0aGVyU3RyaWRlc09yRGlsYXRpb25zQXJlT25lfSBmcm9tICcuL2NvbnZfdXRpbCc7XG5pbXBvcnQge29wfSBmcm9tICcuL29wZXJhdGlvbic7XG5pbXBvcnQge3Jlc2hhcGV9IGZyb20gJy4vcmVzaGFwZSc7XG5cbi8qKlxuICogQ29tcHV0ZXMgYSAzRCBjb252b2x1dGlvbiBvdmVyIHRoZSBpbnB1dCB4LlxuICpcbiAqIEBwYXJhbSB4IFRoZSBpbnB1dCB0ZW5zb3IsIG9mIHJhbmsgNSBvciByYW5rIDQsIG9mIHNoYXBlXG4gKiAgICAgYFtiYXRjaCwgZGVwdGgsIGhlaWdodCwgd2lkdGgsIGNoYW5uZWxzXWAuIElmIHJhbmsgNCxcbiAqIGJhdGNoIG9mIDEgaXMgYXNzdW1lZC5cbiAqIEBwYXJhbSBmaWx0ZXIgVGhlIGZpbHRlciwgcmFuayA1LCBvZiBzaGFwZVxuICogICAgIGBbZmlsdGVyRGVwdGgsIGZpbHRlckhlaWdodCwgZmlsdGVyV2lkdGgsIGluQ2hhbm5lbHMsIG91dENoYW5uZWxzXWAuXG4gKiAgICAgIGluQ2hhbm5lbHMgbXVzdCBtYXRjaCBiZXR3ZWVuIGlucHV0IGFuZCBmaWx0ZXIuXG4gKiBAcGFyYW0gc3RyaWRlcyBUaGUgc3RyaWRlcyBvZiB0aGUgY29udm9sdXRpb246IGBbc3RyaWRlRGVwdGgsIHN0cmlkZUhlaWdodCxcbiAqIHN0cmlkZVdpZHRoXWAuXG4gKiBAcGFyYW0gcGFkIFRoZSB0eXBlIG9mIHBhZGRpbmcgYWxnb3JpdGhtLlxuICogICAgLSBgc2FtZWAgYW5kIHN0cmlkZSAxOiBvdXRwdXQgd2lsbCBiZSBvZiBzYW1lIHNpemUgYXMgaW5wdXQsXG4gKiAgICAgICByZWdhcmRsZXNzIG9mIGZpbHRlciBzaXplLlxuICogICAgLSBgdmFsaWRgOiBvdXRwdXQgd2lsbCBiZSBzbWFsbGVyIHRoYW4gaW5wdXQgaWYgZmlsdGVyIGlzIGxhcmdlclxuICogICAgICAgdGhhbiAxeDEuXG4gKiAgIC0gRm9yIG1vcmUgaW5mbywgc2VlIHRoaXMgZ3VpZGU6XG4gKiAgICAgW2h0dHBzOi8vd3d3LnRlbnNvcmZsb3cub3JnL2FwaV9kb2NzL3B5dGhvbi90Zi9ubi9jb252b2x1dGlvbl0oXG4gKiAgICAgICAgICBodHRwczovL3d3dy50ZW5zb3JmbG93Lm9yZy9hcGlfZG9jcy9weXRob24vdGYvbm4vY29udm9sdXRpb24pXG4gKiBAcGFyYW0gZGF0YUZvcm1hdDogQW4gb3B0aW9uYWwgc3RyaW5nIGZyb206IFwiTkRIV0NcIiwgXCJOQ0RIV1wiLiBEZWZhdWx0cyB0b1xuICogICAgIFwiTkRIV0NcIi4gU3BlY2lmeSB0aGUgZGF0YSBmb3JtYXQgb2YgdGhlIGlucHV0IGFuZCBvdXRwdXQgZGF0YS4gV2l0aCB0aGVcbiAqICAgICBkZWZhdWx0IGZvcm1hdCBcIk5ESFdDXCIsIHRoZSBkYXRhIGlzIHN0b3JlZCBpbiB0aGUgb3JkZXIgb2Y6IFtiYXRjaCxcbiAqICAgICBkZXB0aCwgaGVpZ2h0LCB3aWR0aCwgY2hhbm5lbHNdLiBPbmx5IFwiTkRIV0NcIiBpcyBjdXJyZW50bHkgc3VwcG9ydGVkLlxuICogQHBhcmFtIGRpbGF0aW9ucyBUaGUgZGlsYXRpb24gcmF0ZXM6IGBbZGlsYXRpb25EZXB0aCwgZGlsYXRpb25IZWlnaHQsXG4gKiAgICAgZGlsYXRpb25XaWR0aF1gIGluIHdoaWNoIHdlIHNhbXBsZSBpbnB1dCB2YWx1ZXMgYWNyb3NzIHRoZSBoZWlnaHRcbiAqICAgICBhbmQgd2lkdGggZGltZW5zaW9ucyBpbiBhdHJvdXMgY29udm9sdXRpb24uIERlZmF1bHRzIHRvIGBbMSwgMSwgMV1gLlxuICogICAgIElmIGBkaWxhdGlvbnNgIGlzIGEgc2luZ2xlIG51bWJlciwgdGhlblxuICogICAgIGBkaWxhdGlvbkRlcHRoID09IGRpbGF0aW9uSGVpZ2h0ID09IGRpbGF0aW9uV2lkdGhgLiBJZiBpdCBpcyBncmVhdGVyXG4gKiAgICAgdGhhbiAxLCB0aGVuIGFsbCB2YWx1ZXMgb2YgYHN0cmlkZXNgIG11c3QgYmUgMS5cbiAqXG4gKiBAZG9jIHtoZWFkaW5nOiAnT3BlcmF0aW9ucycsIHN1YmhlYWRpbmc6ICdDb252b2x1dGlvbid9XG4gKi9cbmZ1bmN0aW9uIGNvbnYzZF88VCBleHRlbmRzIFRlbnNvcjREfFRlbnNvcjVEPihcbiAgICB4OiBUfFRlbnNvckxpa2UsIGZpbHRlcjogVGVuc29yNUR8VGVuc29yTGlrZSxcbiAgICBzdHJpZGVzOiBbbnVtYmVyLCBudW1iZXIsIG51bWJlcl18bnVtYmVyLCBwYWQ6ICd2YWxpZCd8J3NhbWUnLFxuICAgIGRhdGFGb3JtYXQ6ICdOREhXQyd8J05DREhXJyA9ICdOREhXQycsXG4gICAgZGlsYXRpb25zOiBbbnVtYmVyLCBudW1iZXIsIG51bWJlcl18bnVtYmVyID0gWzEsIDEsIDFdKTogVCB7XG4gIGNvbnN0ICR4ID0gY29udmVydFRvVGVuc29yKHgsICd4JywgJ2NvbnYzZCcpO1xuICBjb25zdCAkZmlsdGVyID0gY29udmVydFRvVGVuc29yKGZpbHRlciwgJ2ZpbHRlcicsICdjb252M2QnKTtcblxuICBsZXQgeDVEID0gJHggYXMgVGVuc29yNUQ7XG4gIGxldCByZXNoYXBlZFRvNUQgPSBmYWxzZTtcblxuICBpZiAoJHgucmFuayA9PT0gNCkge1xuICAgIHJlc2hhcGVkVG81RCA9IHRydWU7XG4gICAgeDVEID0gcmVzaGFwZSgkeCwgWzEsICR4LnNoYXBlWzBdLCAkeC5zaGFwZVsxXSwgJHguc2hhcGVbMl0sICR4LnNoYXBlWzNdXSk7XG4gIH1cbiAgdXRpbC5hc3NlcnQoXG4gICAgICB4NUQucmFuayA9PT0gNSxcbiAgICAgICgpID0+IGBFcnJvciBpbiBjb252M2Q6IGlucHV0IG11c3QgYmUgcmFuayA1LCBidXQgZ290IHJhbmsgJHt4NUQucmFua30uYCk7XG4gIHV0aWwuYXNzZXJ0KFxuICAgICAgJGZpbHRlci5yYW5rID09PSA1LFxuICAgICAgKCkgPT4gYEVycm9yIGluIGNvbnYzZDogZmlsdGVyIG11c3QgYmUgcmFuayA1LCBidXQgZ290IHJhbmsgYCArXG4gICAgICAgICAgYCR7JGZpbHRlci5yYW5rfS5gKTtcbiAgdXRpbC5hc3NlcnQoXG4gICAgICB4NUQuc2hhcGVbNF0gPT09ICRmaWx0ZXIuc2hhcGVbM10sXG4gICAgICAoKSA9PiBgRXJyb3IgaW4gY29udjNkOiBkZXB0aCBvZiBpbnB1dCAoJHt4NUQuc2hhcGVbNF19KSBtdXN0IG1hdGNoIGAgK1xuICAgICAgICAgIGBpbnB1dCBkZXB0aCBmb3IgZmlsdGVyICR7JGZpbHRlci5zaGFwZVszXX0uYCk7XG4gIHV0aWwuYXNzZXJ0KFxuICAgICAgZWl0aGVyU3RyaWRlc09yRGlsYXRpb25zQXJlT25lKHN0cmlkZXMsIGRpbGF0aW9ucyksXG4gICAgICAoKSA9PiAnRXJyb3IgaW4gY29udjNEOiBFaXRoZXIgc3RyaWRlcyBvciBkaWxhdGlvbnMgbXVzdCBiZSAxLiAnICtcbiAgICAgICAgICBgR290IHN0cmlkZXMgJHtzdHJpZGVzfSBhbmQgZGlsYXRpb25zICcke2RpbGF0aW9uc30nYCk7XG4gIHV0aWwuYXNzZXJ0KFxuICAgICAgZGF0YUZvcm1hdCA9PT0gJ05ESFdDJyxcbiAgICAgICgpID0+IGBFcnJvciBpbiBjb252M2Q6IGdvdCBkYXRhRm9ybWF0IG9mICR7XG4gICAgICAgICAgZGF0YUZvcm1hdH0gYnV0IG9ubHkgTkRIV0MgaXMgY3VycmVudGx5IHN1cHBvcnRlZC5gKTtcblxuICBjb25zdCBpbnB1dHM6IENvbnYzRElucHV0cyA9IHt4OiB4NUQsIGZpbHRlcjogJGZpbHRlcn07XG5cbiAgY29uc3QgYXR0cnM6IENvbnYzREF0dHJzID0ge3N0cmlkZXMsIHBhZCwgZGF0YUZvcm1hdCwgZGlsYXRpb25zfTtcblxuICAvLyB0c2xpbnQ6ZGlzYWJsZS1uZXh0LWxpbmU6IG5vLXVubmVjZXNzYXJ5LXR5cGUtYXNzZXJ0aW9uXG4gIGNvbnN0IHJlcyA9IEVOR0lORS5ydW5LZXJuZWwoXG4gICAgICAgICAgICAgICAgICBDb252M0QsIGlucHV0cyBhcyB7fSBhcyBOYW1lZFRlbnNvck1hcCxcbiAgICAgICAgICAgICAgICAgIGF0dHJzIGFzIHt9IGFzIE5hbWVkQXR0ck1hcCkgYXMgVDtcblxuICBpZiAocmVzaGFwZWRUbzVEKSB7XG4gICAgcmV0dXJuIHJlc2hhcGUoXG4gICAgICAgICAgICAgICByZXMsIFtyZXMuc2hhcGVbMV0sIHJlcy5zaGFwZVsyXSwgcmVzLnNoYXBlWzNdLCByZXMuc2hhcGVbNF1dKSBhc1xuICAgICAgICBUO1xuICB9XG4gIHJldHVybiByZXM7XG59XG5cbmV4cG9ydCBjb25zdCBjb252M2QgPSBvcCh7Y29udjNkX30pO1xuIl19","import { convertToTensor } from '../tensor_util_env';\nimport { conv3DBackpropInput } from './conv3d_backprop_input';\nimport { op } from './operation';\n/**\n * Computes the transposed 3D convolution of a volume, also known as a\n * deconvolution.\n *\n * @param x The input image, of rank 5 or rank 4, of shape\n * `[batch, depth, height, width, inDepth]`. If rank 4, batch of 1 is assumed.\n * @param filter The filter, rank 4, of shape\n * `[depth, filterHeight, filterWidth, outDepth, inDepth]`.\n * `inDepth` must match `inDepth` in `x`.\n * @param outputShape Output shape, of rank 5 or rank 4:\n * `[batch, depth, height, width, outDepth]`. If rank 3, batch of 1 is\n * assumed.\n * @param strides The strides of the original convolution:\n * `[strideDepth, strideHeight, strideWidth]`.\n * @param pad The type of padding algorithm used in the non-transpose version\n * of the op.\n *\n * @doc {heading: 'Operations', subheading: 'Convolution'}\n */\nfunction conv3dTranspose_(x, filter, outputShape, strides, pad) {\n const $x = convertToTensor(x, 'x', 'conv3dTranspose');\n const $filter = convertToTensor(filter, 'filter', 'conv3dTranspose');\n return conv3DBackpropInput(outputShape, $x, $filter, strides, pad);\n}\nexport const conv3dTranspose = op({ conv3dTranspose_ });\n//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY29udjNkX3RyYW5zcG9zZS5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uLy4uL3RmanMtY29yZS9zcmMvb3BzL2NvbnYzZF90cmFuc3Bvc2UudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBaUJBLE9BQU8sRUFBQyxlQUFlLEVBQUMsTUFBTSxvQkFBb0IsQ0FBQztBQUduRCxPQUFPLEVBQUMsbUJBQW1CLEVBQUMsTUFBTSx5QkFBeUIsQ0FBQztBQUM1RCxPQUFPLEVBQUMsRUFBRSxFQUFDLE1BQU0sYUFBYSxDQUFDO0FBRS9COzs7Ozs7Ozs7Ozs7Ozs7Ozs7R0FrQkc7QUFDSCxTQUFTLGdCQUFnQixDQUNyQixDQUFlLEVBQUUsTUFBMkIsRUFDNUMsV0FFNkMsRUFDN0MsT0FBd0MsRUFBRSxHQUFtQjtJQUMvRCxNQUFNLEVBQUUsR0FBRyxlQUFlLENBQUMsQ0FBQyxFQUFFLEdBQUcsRUFBRSxpQkFBaUIsQ0FBQyxDQUFDO0lBQ3RELE1BQU0sT0FBTyxHQUFHLGVBQWUsQ0FBQyxNQUFNLEVBQUUsUUFBUSxFQUFFLGlCQUFpQixDQUFDLENBQUM7SUFFckUsT0FBTyxtQkFBbUIsQ0FBQyxXQUFXLEVBQUUsRUFBRSxFQUFFLE9BQU8sRUFBRSxPQUFPLEVBQUUsR0FBRyxDQUFDLENBQUM7QUFDckUsQ0FBQztBQUVELE1BQU0sQ0FBQyxNQUFNLGVBQWUsR0FBRyxFQUFFLENBQUMsRUFBQyxnQkFBZ0IsRUFBQyxDQUFDLENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyIvKipcbiAqIEBsaWNlbnNlXG4gKiBDb3B5cmlnaHQgMjAyMCBHb29nbGUgTExDLiBBbGwgUmlnaHRzIFJlc2VydmVkLlxuICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlIFwiTGljZW5zZVwiKTtcbiAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS5cbiAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdFxuICpcbiAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMFxuICpcbiAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmVcbiAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuIFwiQVMgSVNcIiBCQVNJUyxcbiAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLlxuICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZFxuICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuXG4gKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuICovXG5pbXBvcnQge1RlbnNvcjRELCBUZW5zb3I1RH0gZnJvbSAnLi4vdGVuc29yJztcbmltcG9ydCB7Y29udmVydFRvVGVuc29yfSBmcm9tICcuLi90ZW5zb3JfdXRpbF9lbnYnO1xuaW1wb3J0IHtUZW5zb3JMaWtlfSBmcm9tICcuLi90eXBlcyc7XG5cbmltcG9ydCB7Y29udjNEQmFja3Byb3BJbnB1dH0gZnJvbSAnLi9jb252M2RfYmFja3Byb3BfaW5wdXQnO1xuaW1wb3J0IHtvcH0gZnJvbSAnLi9vcGVyYXRpb24nO1xuXG4vKipcbiAqIENvbXB1dGVzIHRoZSB0cmFuc3Bvc2VkIDNEIGNvbnZvbHV0aW9uIG9mIGEgdm9sdW1lLCBhbHNvIGtub3duIGFzIGFcbiAqIGRlY29udm9sdXRpb24uXG4gKlxuICogQHBhcmFtIHggVGhlIGlucHV0IGltYWdlLCBvZiByYW5rIDUgb3IgcmFuayA0LCBvZiBzaGFwZVxuICogICBgW2JhdGNoLCBkZXB0aCwgaGVpZ2h0LCB3aWR0aCwgaW5EZXB0aF1gLiBJZiByYW5rIDQsIGJhdGNoIG9mIDEgaXMgYXNzdW1lZC5cbiAqIEBwYXJhbSBmaWx0ZXIgVGhlIGZpbHRlciwgcmFuayA0LCBvZiBzaGFwZVxuICogICAgIGBbZGVwdGgsIGZpbHRlckhlaWdodCwgZmlsdGVyV2lkdGgsIG91dERlcHRoLCBpbkRlcHRoXWAuXG4gKiAgICAgYGluRGVwdGhgIG11c3QgbWF0Y2ggYGluRGVwdGhgIGluIGB4YC5cbiAqIEBwYXJhbSBvdXRwdXRTaGFwZSBPdXRwdXQgc2hhcGUsIG9mIHJhbmsgNSBvciByYW5rIDQ6XG4gKiAgICAgYFtiYXRjaCwgZGVwdGgsIGhlaWdodCwgd2lkdGgsIG91dERlcHRoXWAuIElmIHJhbmsgMywgYmF0Y2ggb2YgMSBpc1xuICogICAgYXNzdW1lZC5cbiAqIEBwYXJhbSBzdHJpZGVzIFRoZSBzdHJpZGVzIG9mIHRoZSBvcmlnaW5hbCBjb252b2x1dGlvbjpcbiAqICAgICBgW3N0cmlkZURlcHRoLCBzdHJpZGVIZWlnaHQsIHN0cmlkZVdpZHRoXWAuXG4gKiBAcGFyYW0gcGFkICBUaGUgdHlwZSBvZiBwYWRkaW5nIGFsZ29yaXRobSB1c2VkIGluIHRoZSBub24tdHJhbnNwb3NlIHZlcnNpb25cbiAqICAgIG9mIHRoZSBvcC5cbiAqXG4gKiBAZG9jIHtoZWFkaW5nOiAnT3BlcmF0aW9ucycsIHN1YmhlYWRpbmc6ICdDb252b2x1dGlvbid9XG4gKi9cbmZ1bmN0aW9uIGNvbnYzZFRyYW5zcG9zZV88VCBleHRlbmRzIFRlbnNvcjREfFRlbnNvcjVEPihcbiAgICB4OiBUfFRlbnNvckxpa2UsIGZpbHRlcjogVGVuc29yNUR8VGVuc29yTGlrZSxcbiAgICBvdXRwdXRTaGFwZTpcbiAgICAgICAgW251bWJlciwgbnVtYmVyLCBudW1iZXIsIG51bWJlcixcbiAgICAgICAgIG51bWJlcl18W251bWJlciwgbnVtYmVyLCBudW1iZXIsIG51bWJlcl0sXG4gICAgc3RyaWRlczogW251bWJlciwgbnVtYmVyLCBudW1iZXJdfG51bWJlciwgcGFkOiAndmFsaWQnfCdzYW1lJyk6IFQge1xuICBjb25zdCAkeCA9IGNvbnZlcnRUb1RlbnNvcih4LCAneCcsICdjb252M2RUcmFuc3Bvc2UnKTtcbiAgY29uc3QgJGZpbHRlciA9IGNvbnZlcnRUb1RlbnNvcihmaWx0ZXIsICdmaWx0ZXInLCAnY29udjNkVHJhbnNwb3NlJyk7XG5cbiAgcmV0dXJuIGNvbnYzREJhY2twcm9wSW5wdXQob3V0cHV0U2hhcGUsICR4LCAkZmlsdGVyLCBzdHJpZGVzLCBwYWQpO1xufVxuXG5leHBvcnQgY29uc3QgY29udjNkVHJhbnNwb3NlID0gb3Aoe2NvbnYzZFRyYW5zcG9zZV99KTtcbiJdfQ==","/**\n * @license\n * Copyright 2020 Google LLC. All Rights Reserved.\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n * =============================================================================\n */\nimport { ENGINE } from '../engine';\nimport { DenseBincount } from '../kernel_names';\nimport { convertToTensor } from '../tensor_util_env';\nimport * as util from '../util';\nimport { op } from './operation';\n/**\n * Outputs a vector with length `size` and the same dtype as `weights`.\n *\n * If `weights` are empty, then index `i` stores the number of times the value\n * `i` is counted in `x`. If `weights` are non-empty, then index `i` stores the\n * sum of the value in `weights` at each index where the corresponding value in\n * `x` is `i`.\n *\n * Values in `x` outside of the range [0, size) are ignored.\n *\n * @param x The input int tensor, rank 1 or rank 2.\n * @param weights The weights tensor, must have the same shape as x, or a\n * length-0 Tensor, in which case it acts as all weights equal to 1.\n * @param size Non-negative integer.\n * @param binaryOutput Optional. Whether the kernel should count the appearance\n * or number of occurrences. Defaults to False.\n *\n * @doc {heading: 'Operations', subheading: 'Reduction'}\n */\nfunction denseBincount_(x, weights, size, binaryOutput = false) {\n const $x = convertToTensor(x, 'x', 'denseBincount');\n const $weights = convertToTensor(weights, 'weights', 'denseBincount');\n util.assert($x.dtype === 'int32', () => `Error in denseBincount: input ` +\n `dtype must be int32, but got ${$x.dtype}`);\n util.assert($x.rank <= 2, () => `Error in denseBincount: input must be at most rank 2, but got ` +\n `rank ${$x.rank}.`);\n util.assert(size >= 0, () => `size must be non-negative, but got ${size}.`);\n util.assert($weights.size === $x.size || $weights.size === 0, () => `Error in denseBincount: weights must have the same shape as x or ` +\n `0-length, but got x shape: ${$x.shape}, weights shape: ` +\n `${$weights.shape}.`);\n const inputs = { x: $x, weights: $weights };\n const attrs = { size, binaryOutput };\n return ENGINE.runKernel(DenseBincount, inputs, attrs);\n}\nexport const denseBincount = op({ denseBincount_ });\n//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZGVuc2VfYmluY291bnQuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi8uLi90ZmpzLWNvcmUvc3JjL29wcy9kZW5zZV9iaW5jb3VudC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQTs7Ozs7Ozs7Ozs7Ozs7O0dBZUc7QUFFSCxPQUFPLEVBQUMsTUFBTSxFQUFDLE1BQU0sV0FBVyxDQUFDO0FBQ2pDLE9BQU8sRUFBQyxhQUFhLEVBQTBDLE1BQU0saUJBQWlCLENBQUM7QUFJdkYsT0FBTyxFQUFDLGVBQWUsRUFBQyxNQUFNLG9CQUFvQixDQUFDO0FBRW5ELE9BQU8sS0FBSyxJQUFJLE1BQU0sU0FBUyxDQUFDO0FBRWhDLE9BQU8sRUFBQyxFQUFFLEVBQUMsTUFBTSxhQUFhLENBQUM7QUFFL0I7Ozs7Ozs7Ozs7Ozs7Ozs7OztHQWtCRztBQUNILFNBQVMsY0FBYyxDQUNuQixDQUFlLEVBQUUsT0FBcUIsRUFBRSxJQUFZLEVBQ3BELFlBQVksR0FBRyxLQUFLO0lBQ3RCLE1BQU0sRUFBRSxHQUFHLGVBQWUsQ0FBQyxDQUFDLEVBQUUsR0FBRyxFQUFFLGVBQWUsQ0FBQyxDQUFDO0lBQ3BELE1BQU0sUUFBUSxHQUFHLGVBQWUsQ0FBQyxPQUFPLEVBQUUsU0FBUyxFQUFFLGVBQWUsQ0FBQyxDQUFDO0lBRXRFLElBQUksQ0FBQyxNQUFNLENBQ1AsRUFBRSxDQUFDLEtBQUssS0FBSyxPQUFPLEVBQ3BCLEdBQUcsRUFBRSxDQUFDLGdDQUFnQztRQUNsQyxnQ0FBZ0MsRUFBRSxDQUFDLEtBQUssRUFBRSxDQUFDLENBQUM7SUFDcEQsSUFBSSxDQUFDLE1BQU0sQ0FDUCxFQUFFLENBQUMsSUFBSSxJQUFJLENBQUMsRUFDWixHQUFHLEVBQUUsQ0FBQyxnRUFBZ0U7UUFDbEUsUUFBUSxFQUFFLENBQUMsSUFBSSxHQUFHLENBQUMsQ0FBQztJQUM1QixJQUFJLENBQUMsTUFBTSxDQUFDLElBQUksSUFBSSxDQUFDLEVBQUUsR0FBRyxFQUFFLENBQUMsc0NBQXNDLElBQUksR0FBRyxDQUFDLENBQUM7SUFDNUUsSUFBSSxDQUFDLE1BQU0sQ0FDUCxRQUFRLENBQUMsSUFBSSxLQUFLLEVBQUUsQ0FBQyxJQUFJLElBQUksUUFBUSxDQUFDLElBQUksS0FBSyxDQUFDLEVBQ2hELEdBQUcsRUFBRSxDQUNELG1FQUFtRTtRQUNuRSw4QkFBOEIsRUFBRSxDQUFDLEtBQUssbUJBQW1CO1FBQ3pELEdBQUcsUUFBUSxDQUFDLEtBQUssR0FBRyxDQUFDLENBQUM7SUFFOUIsTUFBTSxNQUFNLEdBQXdCLEVBQUMsQ0FBQyxFQUFFLEVBQUUsRUFBRSxPQUFPLEVBQUUsUUFBUSxFQUFDLENBQUM7SUFDL0QsTUFBTSxLQUFLLEdBQXVCLEVBQUMsSUFBSSxFQUFFLFlBQVksRUFBQyxDQUFDO0lBRXZELE9BQU8sTUFBTSxDQUFDLFNBQVMsQ0FDbkIsYUFBYSxFQUFFLE1BQThCLEVBQzdDLEtBQTJCLENBQUMsQ0FBQztBQUNuQyxDQUFDO0FBRUQsTUFBTSxDQUFDLE1BQU0sYUFBYSxHQUFHLEVBQUUsQ0FBQyxFQUFDLGNBQWMsRUFBQyxDQUFDLENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyIvKipcbiAqIEBsaWNlbnNlXG4gKiBDb3B5cmlnaHQgMjAyMCBHb29nbGUgTExDLiBBbGwgUmlnaHRzIFJlc2VydmVkLlxuICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlIFwiTGljZW5zZVwiKTtcbiAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS5cbiAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdFxuICpcbiAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMFxuICpcbiAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmVcbiAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuIFwiQVMgSVNcIiBCQVNJUyxcbiAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLlxuICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZFxuICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuXG4gKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuICovXG5cbmltcG9ydCB7RU5HSU5FfSBmcm9tICcuLi9lbmdpbmUnO1xuaW1wb3J0IHtEZW5zZUJpbmNvdW50LCBEZW5zZUJpbmNvdW50QXR0cnMsIERlbnNlQmluY291bnRJbnB1dHN9IGZyb20gJy4uL2tlcm5lbF9uYW1lcyc7XG5pbXBvcnQge05hbWVkQXR0ck1hcH0gZnJvbSAnLi4va2VybmVsX3JlZ2lzdHJ5JztcbmltcG9ydCB7VGVuc29yMUQsIFRlbnNvcjJEfSBmcm9tICcuLi90ZW5zb3InO1xuaW1wb3J0IHtOYW1lZFRlbnNvck1hcH0gZnJvbSAnLi4vdGVuc29yX3R5cGVzJztcbmltcG9ydCB7Y29udmVydFRvVGVuc29yfSBmcm9tICcuLi90ZW5zb3JfdXRpbF9lbnYnO1xuaW1wb3J0IHtUZW5zb3JMaWtlfSBmcm9tICcuLi90eXBlcyc7XG5pbXBvcnQgKiBhcyB1dGlsIGZyb20gJy4uL3V0aWwnO1xuXG5pbXBvcnQge29wfSBmcm9tICcuL29wZXJhdGlvbic7XG5cbi8qKlxuICogT3V0cHV0cyBhIHZlY3RvciB3aXRoIGxlbmd0aCBgc2l6ZWAgYW5kIHRoZSBzYW1lIGR0eXBlIGFzIGB3ZWlnaHRzYC5cbiAqXG4gKiBJZiBgd2VpZ2h0c2AgYXJlIGVtcHR5LCB0aGVuIGluZGV4IGBpYCBzdG9yZXMgdGhlIG51bWJlciBvZiB0aW1lcyB0aGUgdmFsdWVcbiAqIGBpYCBpcyBjb3VudGVkIGluIGB4YC4gSWYgYHdlaWdodHNgIGFyZSBub24tZW1wdHksIHRoZW4gaW5kZXggYGlgIHN0b3JlcyB0aGVcbiAqIHN1bSBvZiB0aGUgdmFsdWUgaW4gYHdlaWdodHNgIGF0IGVhY2ggaW5kZXggd2hlcmUgdGhlIGNvcnJlc3BvbmRpbmcgdmFsdWUgaW5cbiAqIGB4YCBpcyBgaWAuXG4gKlxuICogVmFsdWVzIGluIGB4YCBvdXRzaWRlIG9mIHRoZSByYW5nZSBbMCwgc2l6ZSkgYXJlIGlnbm9yZWQuXG4gKlxuICogQHBhcmFtIHggVGhlIGlucHV0IGludCB0ZW5zb3IsIHJhbmsgMSBvciByYW5rIDIuXG4gKiBAcGFyYW0gd2VpZ2h0cyBUaGUgd2VpZ2h0cyB0ZW5zb3IsIG11c3QgaGF2ZSB0aGUgc2FtZSBzaGFwZSBhcyB4LCBvciBhXG4gKiAgICAgbGVuZ3RoLTAgVGVuc29yLCBpbiB3aGljaCBjYXNlIGl0IGFjdHMgYXMgYWxsIHdlaWdodHMgZXF1YWwgdG8gMS5cbiAqIEBwYXJhbSBzaXplIE5vbi1uZWdhdGl2ZSBpbnRlZ2VyLlxuICogQHBhcmFtIGJpbmFyeU91dHB1dCBPcHRpb25hbC4gV2hldGhlciB0aGUga2VybmVsIHNob3VsZCBjb3VudCB0aGUgYXBwZWFyYW5jZVxuICogICAgIG9yIG51bWJlciBvZiBvY2N1cnJlbmNlcy4gRGVmYXVsdHMgdG8gRmFsc2UuXG4gKlxuICogQGRvYyB7aGVhZGluZzogJ09wZXJhdGlvbnMnLCBzdWJoZWFkaW5nOiAnUmVkdWN0aW9uJ31cbiAqL1xuZnVuY3Rpb24gZGVuc2VCaW5jb3VudF88VCBleHRlbmRzIFRlbnNvcjFEfFRlbnNvcjJEPihcbiAgICB4OiBUfFRlbnNvckxpa2UsIHdlaWdodHM6IFR8VGVuc29yTGlrZSwgc2l6ZTogbnVtYmVyLFxuICAgIGJpbmFyeU91dHB1dCA9IGZhbHNlKTogVCB7XG4gIGNvbnN0ICR4ID0gY29udmVydFRvVGVuc29yKHgsICd4JywgJ2RlbnNlQmluY291bnQnKTtcbiAgY29uc3QgJHdlaWdodHMgPSBjb252ZXJ0VG9UZW5zb3Iod2VpZ2h0cywgJ3dlaWdodHMnLCAnZGVuc2VCaW5jb3VudCcpO1xuXG4gIHV0aWwuYXNzZXJ0KFxuICAgICAgJHguZHR5cGUgPT09ICdpbnQzMicsXG4gICAgICAoKSA9PiBgRXJyb3IgaW4gZGVuc2VCaW5jb3VudDogaW5wdXQgYCArXG4gICAgICAgICAgYGR0eXBlIG11c3QgYmUgaW50MzIsIGJ1dCBnb3QgJHskeC5kdHlwZX1gKTtcbiAgdXRpbC5hc3NlcnQoXG4gICAgICAkeC5yYW5rIDw9IDIsXG4gICAgICAoKSA9PiBgRXJyb3IgaW4gZGVuc2VCaW5jb3VudDogaW5wdXQgbXVzdCBiZSBhdCBtb3N0IHJhbmsgMiwgYnV0IGdvdCBgICtcbiAgICAgICAgICBgcmFuayAkeyR4LnJhbmt9LmApO1xuICB1dGlsLmFzc2VydChzaXplID49IDAsICgpID0+IGBzaXplIG11c3QgYmUgbm9uLW5lZ2F0aXZlLCBidXQgZ290ICR7c2l6ZX0uYCk7XG4gIHV0aWwuYXNzZXJ0KFxuICAgICAgJHdlaWdodHMuc2l6ZSA9PT0gJHguc2l6ZSB8fCAkd2VpZ2h0cy5zaXplID09PSAwLFxuICAgICAgKCkgPT5cbiAgICAgICAgICBgRXJyb3IgaW4gZGVuc2VCaW5jb3VudDogd2VpZ2h0cyBtdXN0IGhhdmUgdGhlIHNhbWUgc2hhcGUgYXMgeCBvciBgICtcbiAgICAgICAgICBgMC1sZW5ndGgsIGJ1dCBnb3QgeCBzaGFwZTogJHskeC5zaGFwZX0sIHdlaWdodHMgc2hhcGU6IGAgK1xuICAgICAgICAgIGAkeyR3ZWlnaHRzLnNoYXBlfS5gKTtcblxuICBjb25zdCBpbnB1dHM6IERlbnNlQmluY291bnRJbnB1dHMgPSB7eDogJHgsIHdlaWdodHM6ICR3ZWlnaHRzfTtcbiAgY29uc3QgYXR0cnM6IERlbnNlQmluY291bnRBdHRycyA9IHtzaXplLCBiaW5hcnlPdXRwdXR9O1xuXG4gIHJldHVybiBFTkdJTkUucnVuS2VybmVsKFxuICAgICAgRGVuc2VCaW5jb3VudCwgaW5wdXRzIGFzIHt9IGFzIE5hbWVkVGVuc29yTWFwLFxuICAgICAgYXR0cnMgYXMge30gYXMgTmFtZWRBdHRyTWFwKTtcbn1cblxuZXhwb3J0IGNvbnN0IGRlbnNlQmluY291bnQgPSBvcCh7ZGVuc2VCaW5jb3VudF99KTtcbiJdfQ==","/**\n * @license\n * Copyright 2020 Google LLC. All Rights Reserved.\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n * =============================================================================\n */\nimport { ENGINE } from '../engine';\nimport { Diag } from '../kernel_names';\nimport { convertToTensor } from '../tensor_util_env';\nimport { op } from './operation';\n/**\n * Returns a diagonal tensor with given diagonal values.\n *\n * Given a diagonal, this operation returns a tensor with the diagonal and\n * everything else padded with zeros.\n *\n * Assume the input has dimensions `[D1,..., Dk]`, then the output is a tensor\n * of rank 2k with dimensions `[D1,..., Dk, D1,..., Dk]`\n *\n * ```js\n * const x = tf.tensor1d([1, 2, 3, 4]);\n *\n * tf.diag(x).print()\n * ```\n * ```js\n * const x = tf.tensor2d([1, 2, 3, 4, 5, 6, 6, 8], [4, 2])\n *\n * tf.diag(x).print()\n * ```\n * @param x The input tensor.\n *\n * @doc {heading: 'Tensors', subheading: 'Creation'}\n */\nfunction diag_(x) {\n const $x = convertToTensor(x, 'x', 'diag');\n const inputs = { x: $x };\n return ENGINE.runKernel(Diag, inputs);\n}\nexport const diag = op({ diag_ });\n//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZGlhZy5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uLy4uL3RmanMtY29yZS9zcmMvb3BzL2RpYWcudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUE7Ozs7Ozs7Ozs7Ozs7OztHQWVHO0FBRUgsT0FBTyxFQUFDLE1BQU0sRUFBQyxNQUFNLFdBQVcsQ0FBQztBQUNqQyxPQUFPLEVBQUMsSUFBSSxFQUFhLE1BQU0saUJBQWlCLENBQUM7QUFHakQsT0FBTyxFQUFDLGVBQWUsRUFBQyxNQUFNLG9CQUFvQixDQUFDO0FBRW5ELE9BQU8sRUFBQyxFQUFFLEVBQUMsTUFBTSxhQUFhLENBQUM7QUFFL0I7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7R0FzQkc7QUFDSCxTQUFTLEtBQUssQ0FBQyxDQUFTO0lBQ3RCLE1BQU0sRUFBRSxHQUFHLGVBQWUsQ0FBQyxDQUFDLEVBQUUsR0FBRyxFQUFFLE1BQU0sQ0FBQyxDQUFDO0lBRTNDLE1BQU0sTUFBTSxHQUFlLEVBQUMsQ0FBQyxFQUFFLEVBQUUsRUFBQyxDQUFDO0lBRW5DLE9BQU8sTUFBTSxDQUFDLFNBQVMsQ0FBQyxJQUFJLEVBQUUsTUFBOEIsQ0FBQyxDQUFDO0FBQ2hFLENBQUM7QUFFRCxNQUFNLENBQUMsTUFBTSxJQUFJLEdBQUcsRUFBRSxDQUFDLEVBQUMsS0FBSyxFQUFDLENBQUMsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbIi8qKlxuICogQGxpY2Vuc2VcbiAqIENvcHlyaWdodCAyMDIwIEdvb2dsZSBMTEMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuXG4gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgXCJMaWNlbnNlXCIpO1xuICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLlxuICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0XG4gKlxuICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wXG4gKlxuICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZVxuICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gXCJBUyBJU1wiIEJBU0lTLFxuICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuXG4gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kXG4gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS5cbiAqID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4gKi9cblxuaW1wb3J0IHtFTkdJTkV9IGZyb20gJy4uL2VuZ2luZSc7XG5pbXBvcnQge0RpYWcsIERpYWdJbnB1dHN9IGZyb20gJy4uL2tlcm5lbF9uYW1lcyc7XG5pbXBvcnQge1RlbnNvcn0gZnJvbSAnLi4vdGVuc29yJztcbmltcG9ydCB7TmFtZWRUZW5zb3JNYXB9IGZyb20gJy4uL3RlbnNvcl90eXBlcyc7XG5pbXBvcnQge2NvbnZlcnRUb1RlbnNvcn0gZnJvbSAnLi4vdGVuc29yX3V0aWxfZW52JztcblxuaW1wb3J0IHtvcH0gZnJvbSAnLi9vcGVyYXRpb24nO1xuXG4vKipcbiAqIFJldHVybnMgYSBkaWFnb25hbCB0ZW5zb3Igd2l0aCBnaXZlbiBkaWFnb25hbCB2YWx1ZXMuXG4gKlxuICogR2l2ZW4gYSBkaWFnb25hbCwgdGhpcyBvcGVyYXRpb24gcmV0dXJucyBhIHRlbnNvciB3aXRoIHRoZSBkaWFnb25hbCBhbmRcbiAqIGV2ZXJ5dGhpbmcgZWxzZSBwYWRkZWQgd2l0aCB6ZXJvcy5cbiAqXG4gKiBBc3N1bWUgdGhlIGlucHV0IGhhcyBkaW1lbnNpb25zIGBbRDEsLi4uLCBEa11gLCB0aGVuIHRoZSBvdXRwdXQgaXMgYSB0ZW5zb3JcbiAqIG9mIHJhbmsgMmsgd2l0aCBkaW1lbnNpb25zIGBbRDEsLi4uLCBEaywgRDEsLi4uLCBEa11gXG4gKlxuICogYGBganNcbiAqIGNvbnN0IHggPSB0Zi50ZW5zb3IxZChbMSwgMiwgMywgNF0pO1xuICpcbiAqIHRmLmRpYWcoeCkucHJpbnQoKVxuICogYGBgXG4gKiBgYGBqc1xuICogY29uc3QgeCA9IHRmLnRlbnNvcjJkKFsxLCAyLCAzLCA0LCA1LCA2LCA2LCA4XSwgWzQsIDJdKVxuICpcbiAqIHRmLmRpYWcoeCkucHJpbnQoKVxuICogYGBgXG4gKiBAcGFyYW0geCBUaGUgaW5wdXQgdGVuc29yLlxuICpcbiAqIEBkb2Mge2hlYWRpbmc6ICdUZW5zb3JzJywgc3ViaGVhZGluZzogJ0NyZWF0aW9uJ31cbiAqL1xuZnVuY3Rpb24gZGlhZ18oeDogVGVuc29yKTogVGVuc29yIHtcbiAgY29uc3QgJHggPSBjb252ZXJ0VG9UZW5zb3IoeCwgJ3gnLCAnZGlhZycpO1xuXG4gIGNvbnN0IGlucHV0czogRGlhZ0lucHV0cyA9IHt4OiAkeH07XG5cbiAgcmV0dXJuIEVOR0lORS5ydW5LZXJuZWwoRGlhZywgaW5wdXRzIGFzIHt9IGFzIE5hbWVkVGVuc29yTWFwKTtcbn1cblxuZXhwb3J0IGNvbnN0IGRpYWcgPSBvcCh7ZGlhZ199KTtcbiJdfQ==","/**\n * @license\n * Copyright 2021 Google LLC. All Rights Reserved.\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n * =============================================================================\n */\nimport { ENGINE } from '../engine';\nimport { Einsum } from '../kernel_names';\nimport { convertToTensor } from '../tensor_util_env';\nimport { op } from './operation';\n/**\n * Tensor contraction over specified indices and outer product.\n *\n * `einsum` allows defining Tensors by defining their element-wise computation.\n * This computation is based on\n * [Einstein summation](https://en.wikipedia.org/wiki/Einstein_notation).\n *\n * Some special cases include:\n *\n * Matrix multiplication:\n * ```js\n * const x = tf.tensor2d([[1, 2, 3], [4, 5, 6]]);\n * const y = tf.tensor2d([[0, 1], [2, 3], [4, 5]]);\n * x.print();\n * y.print();\n * tf.einsum('ij,jk->ik', x, y).print();\n * ```\n *\n * Dot product:\n * ```js\n * const x = tf.tensor1d([1, 2, 3]);\n * const y = tf.tensor1d([0, 1, 2]);\n * x.print();\n * y.print();\n * tf.einsum('i,i->', x, y).print();\n * ```\n *\n * Batch dot product:\n * ```js\n * const x = tf.tensor2d([[1, 2, 3], [4, 5, 6]]);\n * const y = tf.tensor2d([[0, 1, 2], [3, 4, 5]]);\n * x.print();\n * y.print();\n * tf.einsum('bi,bi->b', x, y).print();\n * ```\n *\n * Outer prouduct:\n * ```js\n * const x = tf.tensor1d([1, 3, 5]);\n * const y = tf.tensor1d([2, 4, 6]);\n * x.print();\n * y.print();\n * tf.einsum('i,j->ij', x, y).print();\n * ```\n *\n * Matrix transpose:\n * ```js\n * const x = tf.tensor2d([[1, 2], [3, 4]]);\n * x.print();\n * tf.einsum('ij->ji', x).print();\n * ```\n *\n * Batch matrix transpose:\n * ```js\n * const x = tf.tensor3d([[[1, 2], [3, 4]], [[-1, -2], [-3, -4]]]);\n * x.print();\n * tf.einsum('bij->bji', x).print();\n * ```\n *\n * Limitations:\n *\n * This implementation of einsum has the following limitations:\n *\n * - Does not support >2 input tensors.\n * - Does not support duplicate axes for any given input tensor. E.g., equation\n * 'ii->' is not supported.\n * - The `...` notation is not supported.\n *\n * @param equation a string describing the contraction, in the same format as\n * [numpy.einsum](https://numpy.org/doc/stable/reference/generated/numpy.einsum.html).\n * @param tensors the input(s) to contract (each one a Tensor), whose shapes\n * should be consistent with equation.\n * @returns The output tensor.\n *\n * @doc {heading: 'Tensors', subheading: 'Matrices'}\n */\nexport function einsum_(equation, ...tensors) {\n const $tensors = tensors.map((t, i) => convertToTensor(t, `tensors${i}`, 'einsum'));\n const attrs = { equation };\n return ENGINE.runKernel(Einsum, $tensors, attrs);\n}\nexport const einsum = op({ einsum_ });\n//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZWluc3VtLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vLi4vdGZqcy1jb3JlL3NyYy9vcHMvZWluc3VtLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBOzs7Ozs7Ozs7Ozs7Ozs7R0FlRztBQUVILE9BQU8sRUFBQyxNQUFNLEVBQUMsTUFBTSxXQUFXLENBQUM7QUFDakMsT0FBTyxFQUFDLE1BQU0sRUFBYyxNQUFNLGlCQUFpQixDQUFDO0FBSXBELE9BQU8sRUFBQyxlQUFlLEVBQUMsTUFBTSxvQkFBb0IsQ0FBQztBQUVuRCxPQUFPLEVBQUMsRUFBRSxFQUFDLE1BQU0sYUFBYSxDQUFDO0FBRS9COzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7R0EyRUc7QUFDSCxNQUFNLFVBQVUsT0FBTyxDQUFDLFFBQWdCLEVBQUUsR0FBRyxPQUFpQjtJQUM1RCxNQUFNLFFBQVEsR0FDVixPQUFPLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsRUFBRSxFQUFFLENBQUMsZUFBZSxDQUFDLENBQUMsRUFBRSxVQUFVLENBQUMsRUFBRSxFQUFFLFFBQVEsQ0FBQyxDQUFDLENBQUM7SUFDdkUsTUFBTSxLQUFLLEdBQWdCLEVBQUMsUUFBUSxFQUFDLENBQUM7SUFDdEMsT0FBTyxNQUFNLENBQUMsU0FBUyxDQUNuQixNQUFNLEVBQUUsUUFBZ0MsRUFBRSxLQUEyQixDQUFDLENBQUM7QUFDN0UsQ0FBQztBQUVELE1BQU0sQ0FBQyxNQUFNLE1BQU0sR0FBRyxFQUFFLENBQUMsRUFBQyxPQUFPLEVBQUMsQ0FBQyxDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiLyoqXG4gKiBAbGljZW5zZVxuICogQ29weXJpZ2h0IDIwMjEgR29vZ2xlIExMQy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC5cbiAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSBcIkxpY2Vuc2VcIik7XG4gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuXG4gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXRcbiAqXG4gKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjBcbiAqXG4gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlXG4gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiBcIkFTIElTXCIgQkFTSVMsXG4gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC5cbiAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmRcbiAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLlxuICogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbiAqL1xuXG5pbXBvcnQge0VOR0lORX0gZnJvbSAnLi4vZW5naW5lJztcbmltcG9ydCB7RWluc3VtLCBFaW5zdW1BdHRyc30gZnJvbSAnLi4va2VybmVsX25hbWVzJztcbmltcG9ydCB7TmFtZWRBdHRyTWFwfSBmcm9tICcuLi9rZXJuZWxfcmVnaXN0cnknO1xuaW1wb3J0IHtUZW5zb3J9IGZyb20gJy4uL3RlbnNvcic7XG5pbXBvcnQge05hbWVkVGVuc29yTWFwfSBmcm9tICcuLi90ZW5zb3JfdHlwZXMnO1xuaW1wb3J0IHtjb252ZXJ0VG9UZW5zb3J9IGZyb20gJy4uL3RlbnNvcl91dGlsX2Vudic7XG5cbmltcG9ydCB7b3B9IGZyb20gJy4vb3BlcmF0aW9uJztcblxuLyoqXG4gKiBUZW5zb3IgY29udHJhY3Rpb24gb3ZlciBzcGVjaWZpZWQgaW5kaWNlcyBhbmQgb3V0ZXIgcHJvZHVjdC5cbiAqXG4gKiBgZWluc3VtYCBhbGxvd3MgZGVmaW5pbmcgVGVuc29ycyBieSBkZWZpbmluZyB0aGVpciBlbGVtZW50LXdpc2UgY29tcHV0YXRpb24uXG4gKiBUaGlzIGNvbXB1dGF0aW9uIGlzIGJhc2VkIG9uXG4gKiBbRWluc3RlaW4gc3VtbWF0aW9uXShodHRwczovL2VuLndpa2lwZWRpYS5vcmcvd2lraS9FaW5zdGVpbl9ub3RhdGlvbikuXG4gKlxuICogU29tZSBzcGVjaWFsIGNhc2VzIGluY2x1ZGU6XG4gKlxuICogTWF0cml4IG11bHRpcGxpY2F0aW9uOlxuICogYGBganNcbiAqIGNvbnN0IHggPSB0Zi50ZW5zb3IyZChbWzEsIDIsIDNdLCBbNCwgNSwgNl1dKTtcbiAqIGNvbnN0IHkgPSB0Zi50ZW5zb3IyZChbWzAsIDFdLCBbMiwgM10sIFs0LCA1XV0pO1xuICogeC5wcmludCgpO1xuICogeS5wcmludCgpO1xuICogdGYuZWluc3VtKCdpaixqay0+aWsnLCB4LCB5KS5wcmludCgpO1xuICogYGBgXG4gKlxuICogRG90IHByb2R1Y3Q6XG4gKiBgYGBqc1xuICogY29uc3QgeCA9IHRmLnRlbnNvcjFkKFsxLCAyLCAzXSk7XG4gKiBjb25zdCB5ID0gdGYudGVuc29yMWQoWzAsIDEsIDJdKTtcbiAqIHgucHJpbnQoKTtcbiAqIHkucHJpbnQoKTtcbiAqIHRmLmVpbnN1bSgnaSxpLT4nLCB4LCB5KS5wcmludCgpO1xuICogYGBgXG4gKlxuICogQmF0Y2ggZG90IHByb2R1Y3Q6XG4gKiBgYGBqc1xuICogY29uc3QgeCA9IHRmLnRlbnNvcjJkKFtbMSwgMiwgM10sIFs0LCA1LCA2XV0pO1xuICogY29uc3QgeSA9IHRmLnRlbnNvcjJkKFtbMCwgMSwgMl0sIFszLCA0LCA1XV0pO1xuICogeC5wcmludCgpO1xuICogeS5wcmludCgpO1xuICogdGYuZWluc3VtKCdiaSxiaS0+YicsIHgsIHkpLnByaW50KCk7XG4gKiBgYGBcbiAqXG4gKiBPdXRlciBwcm91ZHVjdDpcbiAqIGBgYGpzXG4gKiBjb25zdCB4ID0gdGYudGVuc29yMWQoWzEsIDMsIDVdKTtcbiAqIGNvbnN0IHkgPSB0Zi50ZW5zb3IxZChbMiwgNCwgNl0pO1xuICogeC5wcmludCgpO1xuICogeS5wcmludCgpO1xuICogdGYuZWluc3VtKCdpLGotPmlqJywgeCwgeSkucHJpbnQoKTtcbiAqIGBgYFxuICpcbiAqIE1hdHJpeCB0cmFuc3Bvc2U6XG4gKiBgYGBqc1xuICogY29uc3QgeCA9IHRmLnRlbnNvcjJkKFtbMSwgMl0sIFszLCA0XV0pO1xuICogeC5wcmludCgpO1xuICogdGYuZWluc3VtKCdpai0+amknLCB4KS5wcmludCgpO1xuICogYGBgXG4gKlxuICogQmF0Y2ggbWF0cml4IHRyYW5zcG9zZTpcbiAqIGBgYGpzXG4gKiBjb25zdCB4ID0gdGYudGVuc29yM2QoW1tbMSwgMl0sIFszLCA0XV0sIFtbLTEsIC0yXSwgWy0zLCAtNF1dXSk7XG4gKiB4LnByaW50KCk7XG4gKiB0Zi5laW5zdW0oJ2Jpai0+YmppJywgeCkucHJpbnQoKTtcbiAqIGBgYFxuICpcbiAqIExpbWl0YXRpb25zOlxuICpcbiAqIFRoaXMgaW1wbGVtZW50YXRpb24gb2YgZWluc3VtIGhhcyB0aGUgZm9sbG93aW5nIGxpbWl0YXRpb25zOlxuICpcbiAqIC0gRG9lcyBub3Qgc3VwcG9ydCA+MiBpbnB1dCB0ZW5zb3JzLlxuICogLSBEb2VzIG5vdCBzdXBwb3J0IGR1cGxpY2F0ZSBheGVzIGZvciBhbnkgZ2l2ZW4gaW5wdXQgdGVuc29yLiBFLmcuLCBlcXVhdGlvblxuICogICAnaWktPicgaXMgbm90IHN1cHBvcnRlZC5cbiAqIC0gVGhlIGAuLi5gIG5vdGF0aW9uIGlzIG5vdCBzdXBwb3J0ZWQuXG4gKlxuICogQHBhcmFtIGVxdWF0aW9uIGEgc3RyaW5nIGRlc2NyaWJpbmcgdGhlIGNvbnRyYWN0aW9uLCBpbiB0aGUgc2FtZSBmb3JtYXQgYXNcbiAqIFtudW1weS5laW5zdW1dKGh0dHBzOi8vbnVtcHkub3JnL2RvYy9zdGFibGUvcmVmZXJlbmNlL2dlbmVyYXRlZC9udW1weS5laW5zdW0uaHRtbCkuXG4gKiBAcGFyYW0gdGVuc29ycyB0aGUgaW5wdXQocykgdG8gY29udHJhY3QgKGVhY2ggb25lIGEgVGVuc29yKSwgd2hvc2Ugc2hhcGVzXG4gKiAgICAgc2hvdWxkIGJlIGNvbnNpc3RlbnQgd2l0aCBlcXVhdGlvbi5cbiAqIEByZXR1cm5zIFRoZSBvdXRwdXQgdGVuc29yLlxuICpcbiAqIEBkb2Mge2hlYWRpbmc6ICdUZW5zb3JzJywgc3ViaGVhZGluZzogJ01hdHJpY2VzJ31cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGVpbnN1bV8oZXF1YXRpb246IHN0cmluZywgLi4udGVuc29yczogVGVuc29yW10pOiBUZW5zb3Ige1xuICBjb25zdCAkdGVuc29ycyA9XG4gICAgICB0ZW5zb3JzLm1hcCgodCwgaSkgPT4gY29udmVydFRvVGVuc29yKHQsIGB0ZW5zb3JzJHtpfWAsICdlaW5zdW0nKSk7XG4gIGNvbnN0IGF0dHJzOiBFaW5zdW1BdHRycyA9IHtlcXVhdGlvbn07XG4gIHJldHVybiBFTkdJTkUucnVuS2VybmVsKFxuICAgICAgRWluc3VtLCAkdGVuc29ycyBhcyB7fSBhcyBOYW1lZFRlbnNvck1hcCwgYXR0cnMgYXMge30gYXMgTmFtZWRBdHRyTWFwKTtcbn1cblxuZXhwb3J0IGNvbnN0IGVpbnN1bSA9IG9wKHtlaW5zdW1ffSk7XG4iXX0=","/**\n * @license\n * Copyright 2020 Google LLC. All Rights Reserved.\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n * =============================================================================\n */\nimport { buffer } from './buffer';\nimport { expandDims } from './expand_dims';\nimport { op } from './operation';\nimport { reshape } from './reshape';\nimport { tile } from './tile';\n/**\n * Create an identity matrix.\n *\n * @param numRows Number of rows.\n * @param numColumns Number of columns. Defaults to `numRows`.\n * @param batchShape If provided, will add the batch shape to the beginning\n * of the shape of the returned `tf.Tensor` by repeating the identity\n * matrix.\n * @param dtype Data type.\n * @returns Identity matrix of the specified size and data type, possibly\n * with batch repetition if `batchShape` is specified.\n *\n * @doc {heading: 'Tensors', subheading: 'Creation'}\n */\nfunction eye_(numRows, numColumns, batchShape, dtype = 'float32') {\n if (numColumns == null) {\n numColumns = numRows;\n }\n const buff = buffer([numRows, numColumns], dtype);\n const n = numRows <= numColumns ? numRows : numColumns;\n for (let i = 0; i < n; ++i) {\n buff.set(1, i, i);\n }\n const out = reshape(buff.toTensor(), [numRows, numColumns]);\n if (batchShape == null) {\n return out;\n }\n else {\n if (batchShape.length === 1) {\n return tile(expandDims(out, 0), [batchShape[0], 1, 1]);\n }\n else if (batchShape.length === 2) {\n // tslint:disable-next-line:no-unnecessary-type-assertion\n return tile(expandDims(expandDims(out, 0), 0), [batchShape[0], batchShape[1], 1, 1]);\n }\n else if (batchShape.length === 3) {\n // tslint:disable-next-line:no-unnecessary-type-assertion\n return tile(expandDims(expandDims(expandDims(out, 0), 0), 0), [\n batchShape[0], batchShape[1], batchShape[2], 1, 1\n ]);\n }\n else {\n throw new Error(`eye() currently supports only 1D and 2D ` +\n // tslint:disable-next-line:no-any\n `batchShapes, but received ${batchShape.length}D.`);\n }\n }\n}\nexport const eye = op({ eye_ });\n//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZXllLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vLi4vdGZqcy1jb3JlL3NyYy9vcHMvZXllLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBOzs7Ozs7Ozs7Ozs7Ozs7R0FlRztBQUtILE9BQU8sRUFBQyxNQUFNLEVBQUMsTUFBTSxVQUFVLENBQUM7QUFDaEMsT0FBTyxFQUFDLFVBQVUsRUFBQyxNQUFNLGVBQWUsQ0FBQztBQUN6QyxPQUFPLEVBQUMsRUFBRSxFQUFDLE1BQU0sYUFBYSxDQUFDO0FBQy9CLE9BQU8sRUFBQyxPQUFPLEVBQUMsTUFBTSxXQUFXLENBQUM7QUFDbEMsT0FBTyxFQUFDLElBQUksRUFBQyxNQUFNLFFBQVEsQ0FBQztBQUU1Qjs7Ozs7Ozs7Ozs7OztHQWFHO0FBQ0gsU0FBUyxJQUFJLENBQ1QsT0FBZSxFQUFFLFVBQW1CLEVBQ3BDLFVBSXdFLEVBQ3hFLFFBQWtCLFNBQVM7SUFDN0IsSUFBSSxVQUFVLElBQUksSUFBSSxFQUFFO1FBQ3RCLFVBQVUsR0FBRyxPQUFPLENBQUM7S0FDdEI7SUFDRCxNQUFNLElBQUksR0FBRyxNQUFNLENBQUMsQ0FBQyxPQUFPLEVBQUUsVUFBVSxDQUFDLEVBQUUsS0FBSyxDQUFDLENBQUM7SUFDbEQsTUFBTSxDQUFDLEdBQUcsT0FBTyxJQUFJLFVBQVUsQ0FBQyxDQUFDLENBQUMsT0FBTyxDQUFDLENBQUMsQ0FBQyxVQUFVLENBQUM7SUFDdkQsS0FBSyxJQUFJLENBQUMsR0FBRyxDQUFDLEVBQUUsQ0FBQyxHQUFHLENBQUMsRUFBRSxFQUFFLENBQUMsRUFBRTtRQUMxQixJQUFJLENBQUMsR0FBRyxDQUFDLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUM7S0FDbkI7SUFDRCxNQUFNLEdBQUcsR0FBYSxPQUFPLENBQUMsSUFBSSxDQUFDLFFBQVEsRUFBRSxFQUFFLENBQUMsT0FBTyxFQUFFLFVBQVUsQ0FBQyxDQUFDLENBQUM7SUFDdEUsSUFBSSxVQUFVLElBQUksSUFBSSxFQUFFO1FBQ3RCLE9BQU8sR0FBRyxDQUFDO0tBQ1o7U0FBTTtRQUNMLElBQUksVUFBVSxDQUFDLE1BQU0sS0FBSyxDQUFDLEVBQUU7WUFDM0IsT0FBTyxJQUFJLENBQUMsVUFBVSxDQUFDLEdBQUcsRUFBRSxDQUFDLENBQUMsRUFBRSxDQUFDLFVBQVUsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQWEsQ0FBQztTQUNwRTthQUFNLElBQUksVUFBVSxDQUFDLE1BQU0sS0FBSyxDQUFDLEVBQUU7WUFDbEMseURBQXlEO1lBQ3pELE9BQU8sSUFBSSxDQUNBLFVBQVUsQ0FBQyxVQUFVLENBQUMsR0FBRyxFQUFFLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxFQUNqQyxDQUFDLFVBQVUsQ0FBQyxDQUFDLENBQUMsRUFBRSxVQUFVLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFhLENBQUM7U0FDOUQ7YUFBTSxJQUFJLFVBQVUsQ0FBQyxNQUFNLEtBQUssQ0FBQyxFQUFFO1lBQ2xDLHlEQUF5RDtZQUN6RCxPQUFPLElBQUksQ0FBQyxVQUFVLENBQUMsVUFBVSxDQUFDLFVBQVUsQ0FBQyxHQUFHLEVBQUUsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLEVBQUU7Z0JBQ3JELFVBQVUsQ0FBQyxDQUFDLENBQUMsRUFBRSxVQUFVLENBQUMsQ0FBQyxDQUFDLEVBQUUsVUFBVSxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDO2FBQ2xELENBQWEsQ0FBQztTQUN2QjthQUFNO1lBQ0wsTUFBTSxJQUFJLEtBQUssQ0FDWCwwQ0FBMEM7Z0JBQzFDLGtDQUFrQztnQkFDbEMsNkJBQThCLFVBQWtCLENBQUMsTUFBTSxJQUFJLENBQUMsQ0FBQztTQUNsRTtLQUNGO0FBQ0gsQ0FBQztBQUVELE1BQU0sQ0FBQyxNQUFNLEdBQUcsR0FBRyxFQUFFLENBQUMsRUFBQyxJQUFJLEVBQUMsQ0FBQyxDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiLyoqXG4gKiBAbGljZW5zZVxuICogQ29weXJpZ2h0IDIwMjAgR29vZ2xlIExMQy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC5cbiAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSBcIkxpY2Vuc2VcIik7XG4gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuXG4gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXRcbiAqXG4gKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjBcbiAqXG4gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlXG4gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiBcIkFTIElTXCIgQkFTSVMsXG4gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC5cbiAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmRcbiAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLlxuICogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbiAqL1xuXG5pbXBvcnQge1RlbnNvcjJEfSBmcm9tICcuLi90ZW5zb3InO1xuaW1wb3J0IHtEYXRhVHlwZX0gZnJvbSAnLi4vdHlwZXMnO1xuXG5pbXBvcnQge2J1ZmZlcn0gZnJvbSAnLi9idWZmZXInO1xuaW1wb3J0IHtleHBhbmREaW1zfSBmcm9tICcuL2V4cGFuZF9kaW1zJztcbmltcG9ydCB7b3B9IGZyb20gJy4vb3BlcmF0aW9uJztcbmltcG9ydCB7cmVzaGFwZX0gZnJvbSAnLi9yZXNoYXBlJztcbmltcG9ydCB7dGlsZX0gZnJvbSAnLi90aWxlJztcblxuLyoqXG4gKiBDcmVhdGUgYW4gaWRlbnRpdHkgbWF0cml4LlxuICpcbiAqIEBwYXJhbSBudW1Sb3dzIE51bWJlciBvZiByb3dzLlxuICogQHBhcmFtIG51bUNvbHVtbnMgTnVtYmVyIG9mIGNvbHVtbnMuIERlZmF1bHRzIHRvIGBudW1Sb3dzYC5cbiAqIEBwYXJhbSBiYXRjaFNoYXBlIElmIHByb3ZpZGVkLCB3aWxsIGFkZCB0aGUgYmF0Y2ggc2hhcGUgdG8gdGhlIGJlZ2lubmluZ1xuICogICBvZiB0aGUgc2hhcGUgb2YgdGhlIHJldHVybmVkIGB0Zi5UZW5zb3JgIGJ5IHJlcGVhdGluZyB0aGUgaWRlbnRpdHlcbiAqICAgbWF0cml4LlxuICogQHBhcmFtIGR0eXBlIERhdGEgdHlwZS5cbiAqIEByZXR1cm5zIElkZW50aXR5IG1hdHJpeCBvZiB0aGUgc3BlY2lmaWVkIHNpemUgYW5kIGRhdGEgdHlwZSwgcG9zc2libHlcbiAqICAgd2l0aCBiYXRjaCByZXBldGl0aW9uIGlmIGBiYXRjaFNoYXBlYCBpcyBzcGVjaWZpZWQuXG4gKlxuICogQGRvYyB7aGVhZGluZzogJ1RlbnNvcnMnLCBzdWJoZWFkaW5nOiAnQ3JlYXRpb24nfVxuICovXG5mdW5jdGlvbiBleWVfKFxuICAgIG51bVJvd3M6IG51bWJlciwgbnVtQ29sdW1ucz86IG51bWJlcixcbiAgICBiYXRjaFNoYXBlPzpcbiAgICAgICAgW1xuICAgICAgICAgIG51bWJlclxuICAgICAgICBdfFtudW1iZXIsXG4gICAgICAgICAgIG51bWJlcl18W251bWJlciwgbnVtYmVyLCBudW1iZXJdfFtudW1iZXIsIG51bWJlciwgbnVtYmVyLCBudW1iZXJdLFxuICAgIGR0eXBlOiBEYXRhVHlwZSA9ICdmbG9hdDMyJyk6IFRlbnNvcjJEIHtcbiAgaWYgKG51bUNvbHVtbnMgPT0gbnVsbCkge1xuICAgIG51bUNvbHVtbnMgPSBudW1Sb3dzO1xuICB9XG4gIGNvbnN0IGJ1ZmYgPSBidWZmZXIoW251bVJvd3MsIG51bUNvbHVtbnNdLCBkdHlwZSk7XG4gIGNvbnN0IG4gPSBudW1Sb3dzIDw9IG51bUNvbHVtbnMgPyBudW1Sb3dzIDogbnVtQ29sdW1ucztcbiAgZm9yIChsZXQgaSA9IDA7IGkgPCBuOyArK2kpIHtcbiAgICBidWZmLnNldCgxLCBpLCBpKTtcbiAgfVxuICBjb25zdCBvdXQ6IFRlbnNvcjJEID0gcmVzaGFwZShidWZmLnRvVGVuc29yKCksIFtudW1Sb3dzLCBudW1Db2x1bW5zXSk7XG4gIGlmIChiYXRjaFNoYXBlID09IG51bGwpIHtcbiAgICByZXR1cm4gb3V0O1xuICB9IGVsc2Uge1xuICAgIGlmIChiYXRjaFNoYXBlLmxlbmd0aCA9PT0gMSkge1xuICAgICAgcmV0dXJuIHRpbGUoZXhwYW5kRGltcyhvdXQsIDApLCBbYmF0Y2hTaGFwZVswXSwgMSwgMV0pIGFzIFRlbnNvcjJEO1xuICAgIH0gZWxzZSBpZiAoYmF0Y2hTaGFwZS5sZW5ndGggPT09IDIpIHtcbiAgICAgIC8vIHRzbGludDpkaXNhYmxlLW5leHQtbGluZTpuby11bm5lY2Vzc2FyeS10eXBlLWFzc2VydGlvblxuICAgICAgcmV0dXJuIHRpbGUoXG4gICAgICAgICAgICAgICAgIGV4cGFuZERpbXMoZXhwYW5kRGltcyhvdXQsIDApLCAwKSxcbiAgICAgICAgICAgICAgICAgW2JhdGNoU2hhcGVbMF0sIGJhdGNoU2hhcGVbMV0sIDEsIDFdKSBhcyBUZW5zb3IyRDtcbiAgICB9IGVsc2UgaWYgKGJhdGNoU2hhcGUubGVuZ3RoID09PSAzKSB7XG4gICAgICAvLyB0c2xpbnQ6ZGlzYWJsZS1uZXh0LWxpbmU6bm8tdW5uZWNlc3NhcnktdHlwZS1hc3NlcnRpb25cbiAgICAgIHJldHVybiB0aWxlKGV4cGFuZERpbXMoZXhwYW5kRGltcyhleHBhbmREaW1zKG91dCwgMCksIDApLCAwKSwgW1xuICAgICAgICAgICAgICAgYmF0Y2hTaGFwZVswXSwgYmF0Y2hTaGFwZVsxXSwgYmF0Y2hTaGFwZVsyXSwgMSwgMVxuICAgICAgICAgICAgIF0pIGFzIFRlbnNvcjJEO1xuICAgIH0gZWxzZSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoXG4gICAgICAgICAgYGV5ZSgpIGN1cnJlbnRseSBzdXBwb3J0cyBvbmx5IDFEIGFuZCAyRCBgICtcbiAgICAgICAgICAvLyB0c2xpbnQ6ZGlzYWJsZS1uZXh0LWxpbmU6bm8tYW55XG4gICAgICAgICAgYGJhdGNoU2hhcGVzLCBidXQgcmVjZWl2ZWQgJHsoYmF0Y2hTaGFwZSBhcyBhbnkpLmxlbmd0aH1ELmApO1xuICAgIH1cbiAgfVxufVxuXG5leHBvcnQgY29uc3QgZXllID0gb3Aoe2V5ZV99KTtcbiJdfQ==","/**\n * @license\n * Copyright 2018 Google LLC. All Rights Reserved.\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n * =============================================================================\n */\nimport { ENGINE } from '../engine';\nimport { LinSpace } from '../kernel_names';\n/**\n * Return an evenly spaced sequence of numbers over the given interval.\n *\n * ```js\n * tf.linspace(0, 9, 10).print();\n * ```\n * @param start The start value of the sequence.\n * @param stop The end value of the sequence.\n * @param num The number of values to generate.\n *\n * @doc {heading: 'Tensors', subheading: 'Creation'}\n */\nexport function linspace(start, stop, num) {\n if (num <= 0) {\n throw new Error('The number of values should be positive.');\n }\n const attrs = { start, stop, num };\n return ENGINE.runKernel(LinSpace, {}, attrs);\n}\n//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibGluc3BhY2UuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi8uLi90ZmpzLWNvcmUvc3JjL29wcy9saW5zcGFjZS50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQTs7Ozs7Ozs7Ozs7Ozs7O0dBZUc7QUFFSCxPQUFPLEVBQUMsTUFBTSxFQUFDLE1BQU0sV0FBVyxDQUFDO0FBQ2pDLE9BQU8sRUFBQyxRQUFRLEVBQWdCLE1BQU0saUJBQWlCLENBQUM7QUFJeEQ7Ozs7Ozs7Ozs7O0dBV0c7QUFDSCxNQUFNLFVBQVUsUUFBUSxDQUFDLEtBQWEsRUFBRSxJQUFZLEVBQUUsR0FBVztJQUMvRCxJQUFJLEdBQUcsSUFBSSxDQUFDLEVBQUU7UUFDWixNQUFNLElBQUksS0FBSyxDQUFDLDBDQUEwQyxDQUFDLENBQUM7S0FDN0Q7SUFFRCxNQUFNLEtBQUssR0FBa0IsRUFBQyxLQUFLLEVBQUUsSUFBSSxFQUFFLEdBQUcsRUFBQyxDQUFDO0lBQ2hELE9BQU8sTUFBTSxDQUFDLFNBQVMsQ0FBQyxRQUFRLEVBQUUsRUFBRSxFQUFFLEtBQTJCLENBQUMsQ0FBQztBQUNyRSxDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiLyoqXG4gKiBAbGljZW5zZVxuICogQ29weXJpZ2h0IDIwMTggR29vZ2xlIExMQy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC5cbiAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSBcIkxpY2Vuc2VcIik7XG4gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuXG4gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXRcbiAqXG4gKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjBcbiAqXG4gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlXG4gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiBcIkFTIElTXCIgQkFTSVMsXG4gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC5cbiAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmRcbiAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLlxuICogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbiAqL1xuXG5pbXBvcnQge0VOR0lORX0gZnJvbSAnLi4vZW5naW5lJztcbmltcG9ydCB7TGluU3BhY2UsIExpblNwYWNlQXR0cnN9IGZyb20gJy4uL2tlcm5lbF9uYW1lcyc7XG5pbXBvcnQge05hbWVkQXR0ck1hcH0gZnJvbSAnLi4va2VybmVsX3JlZ2lzdHJ5JztcbmltcG9ydCB7VGVuc29yMUR9IGZyb20gJy4uL3RlbnNvcic7XG5cbi8qKlxuICogUmV0dXJuIGFuIGV2ZW5seSBzcGFjZWQgc2VxdWVuY2Ugb2YgbnVtYmVycyBvdmVyIHRoZSBnaXZlbiBpbnRlcnZhbC5cbiAqXG4gKiBgYGBqc1xuICogdGYubGluc3BhY2UoMCwgOSwgMTApLnByaW50KCk7XG4gKiBgYGBcbiAqIEBwYXJhbSBzdGFydCBUaGUgc3RhcnQgdmFsdWUgb2YgdGhlIHNlcXVlbmNlLlxuICogQHBhcmFtIHN0b3AgVGhlIGVuZCB2YWx1ZSBvZiB0aGUgc2VxdWVuY2UuXG4gKiBAcGFyYW0gbnVtIFRoZSBudW1iZXIgb2YgdmFsdWVzIHRvIGdlbmVyYXRlLlxuICpcbiAqIEBkb2Mge2hlYWRpbmc6ICdUZW5zb3JzJywgc3ViaGVhZGluZzogJ0NyZWF0aW9uJ31cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGxpbnNwYWNlKHN0YXJ0OiBudW1iZXIsIHN0b3A6IG51bWJlciwgbnVtOiBudW1iZXIpOiBUZW5zb3IxRCB7XG4gIGlmIChudW0gPD0gMCkge1xuICAgIHRocm93IG5ldyBFcnJvcignVGhlIG51bWJlciBvZiB2YWx1ZXMgc2hvdWxkIGJlIHBvc2l0aXZlLicpO1xuICB9XG5cbiAgY29uc3QgYXR0cnM6IExpblNwYWNlQXR0cnMgPSB7c3RhcnQsIHN0b3AsIG51bX07XG4gIHJldHVybiBFTkdJTkUucnVuS2VybmVsKExpblNwYWNlLCB7fSwgYXR0cnMgYXMge30gYXMgTmFtZWRBdHRyTWFwKTtcbn1cbiJdfQ==","/**\n * @license\n * Copyright 2022 Google LLC. All Rights Reserved.\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n * =============================================================================\n */\nimport { ENGINE } from '../engine';\nimport { SearchSorted } from '../kernel_names';\nimport { convertToTensor } from '../tensor_util_env';\nimport { sizeFromShape } from '../util_base';\nimport { op } from './operation';\nimport { reshape } from './reshape';\nconst INT32_MAX = 2147483648;\n/**\n * Searches for where a value would go in a sorted sequence.\n *\n * This is not a method for checking containment (like javascript in).\n *\n * The typical use case for this operation is \"binning\", \"bucketing\", or\n * \"discretizing\". The values are assigned to bucket-indices based on the edges\n * listed in 'sortedSequence'. This operation returns the bucket-index for each\n * value.\n *\n * The side argument controls which index is returned if a value lands exactly\n * on an edge.\n *\n * The axis is not settable for this operation. It always operates on the\n * innermost dimension (axis=-1). The operation will accept any number of outer\n * dimensions.\n *\n * Note: This operation assumes that 'sortedSequence' is sorted along the\n * innermost axis, maybe using 'sort(..., axis=-1)'. If the sequence is not\n * sorted no error is raised and the content of the returned tensor is not well\n * defined.\n *\n * ```js\n * const edges = tf.tensor1d([-1, 3.3, 9.1, 10.0]);\n * let values = tf.tensor1d([0.0, 4.1, 12.0]);\n * const result1 = tf.searchSorted(edges, values, 'left');\n * result1.print(); // [1, 2, 4]\n *\n * const seq = tf.tensor1d([0, 3, 9, 10, 10]);\n * values = tf.tensor1d([0, 4, 10]);\n * const result2 = tf.searchSorted(seq, values, 'left');\n * result2.print(); // [0, 2, 3]\n * const result3 = tf.searchSorted(seq, values, 'right');\n * result3.print(); // [1, 2, 5]\n *\n * const sortedSequence = tf.tensor2d([[0., 3., 8., 9., 10.],\n * [1., 2., 3., 4., 5.]]);\n * values = tf.tensor2d([[9.8, 2.1, 4.3],\n * [0.1, 6.6, 4.5, ]]);\n * const result4 = tf.searchSorted(sortedSequence, values, 'left');\n * result4.print(); // [[4, 1, 2], [0, 5, 4]]\n * ```\n * @param sortedSequence: N-D. Sorted sequence.\n * @param values: N-D. Search values.\n * @param side: 'left'|'right'. Defaults to 'left'. 'left' corresponds to lower\n * bound and 'right' to upper bound.\n * @return An N-D int32 tensor the size of values containing the result of\n * applying either lower bound or upper bound (depending on side) to each\n * value. The result is not a global index to the entire Tensor, but the\n * index in the last dimension.\n * @doc {heading: 'Operations', subheading: 'Evaluation'}\n */\nfunction searchSorted_(sortedSequence, values, side = 'left') {\n const $sortedSequence = convertToTensor(sortedSequence, 'sortedSequence', 'searchSorted');\n const $values = convertToTensor(values, 'values', 'searchSorted');\n const sequenceSize = $sortedSequence.shape[$sortedSequence.shape.length - 1];\n const valuesSize = $values.shape[$values.shape.length - 1];\n const $sortedSequence2D = reshape($sortedSequence, [-1, sequenceSize]);\n const $values2D = reshape($values, [-1, valuesSize]);\n if ($sortedSequence2D.rank < 2) {\n throw new Error(`Sorted input argument must be at least 2-dimensional`);\n }\n if ($sortedSequence2D.shape[0] !== $values2D.shape[0]) {\n throw new Error(`Leading dimension of 'sortedSequence' and 'values' must match.`);\n }\n if (sizeFromShape($values2D.shape) >= INT32_MAX) {\n throw new Error(`values tensor size must less than ${INT32_MAX}`);\n }\n if ($sortedSequence2D.shape[1] >= INT32_MAX) {\n throw new Error(`trailing dim_size must less than ${INT32_MAX} for int32 output type, was ${$sortedSequence2D.shape[1]}`);\n }\n const inputs = {\n sortedSequence: $sortedSequence2D,\n values: $values2D,\n };\n const attrs = { side };\n return ENGINE.runKernel(SearchSorted, inputs, attrs);\n}\nexport const searchSorted = op({ searchSorted_ });\n//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic2VhcmNoX3NvcnRlZC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uLy4uL3RmanMtY29yZS9zcmMvb3BzL3NlYXJjaF9zb3J0ZWQudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUE7Ozs7Ozs7Ozs7Ozs7OztHQWVHO0FBRUgsT0FBTyxFQUFDLE1BQU0sRUFBQyxNQUFNLFdBQVcsQ0FBQztBQUNqQyxPQUFPLEVBQUMsWUFBWSxFQUF3QyxNQUFNLGlCQUFpQixDQUFDO0FBRXBGLE9BQU8sRUFBQyxlQUFlLEVBQUMsTUFBTSxvQkFBb0IsQ0FBQztBQUVuRCxPQUFPLEVBQUMsYUFBYSxFQUFDLE1BQU0sY0FBYyxDQUFDO0FBQzNDLE9BQU8sRUFBQyxFQUFFLEVBQUMsTUFBTSxhQUFhLENBQUM7QUFDL0IsT0FBTyxFQUFDLE9BQU8sRUFBQyxNQUFNLFdBQVcsQ0FBQztBQUVsQyxNQUFNLFNBQVMsR0FBRyxVQUFVLENBQUM7QUFDN0I7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7OztHQW1ERztBQUNILFNBQVMsYUFBYSxDQUNsQixjQUFpQyxFQUFFLE1BQXlCLEVBQzVELE9BQXVCLE1BQU07SUFDL0IsTUFBTSxlQUFlLEdBQ2pCLGVBQWUsQ0FBQyxjQUFjLEVBQUUsZ0JBQWdCLEVBQUUsY0FBYyxDQUFDLENBQUM7SUFDdEUsTUFBTSxPQUFPLEdBQUcsZUFBZSxDQUFDLE1BQU0sRUFBRSxRQUFRLEVBQUUsY0FBYyxDQUFDLENBQUM7SUFFbEUsTUFBTSxZQUFZLEdBQUcsZUFBZSxDQUFDLEtBQUssQ0FBQyxlQUFlLENBQUMsS0FBSyxDQUFDLE1BQU0sR0FBRyxDQUFDLENBQUMsQ0FBQztJQUM3RSxNQUFNLFVBQVUsR0FBRyxPQUFPLENBQUMsS0FBSyxDQUFDLE9BQU8sQ0FBQyxLQUFLLENBQUMsTUFBTSxHQUFHLENBQUMsQ0FBQyxDQUFDO0lBQzNELE1BQU0saUJBQWlCLEdBQUcsT0FBTyxDQUFDLGVBQWUsRUFBRSxDQUFDLENBQUMsQ0FBQyxFQUFFLFlBQVksQ0FBQyxDQUFDLENBQUM7SUFDdkUsTUFBTSxTQUFTLEdBQUcsT0FBTyxDQUFDLE9BQU8sRUFBRSxDQUFDLENBQUMsQ0FBQyxFQUFFLFVBQVUsQ0FBQyxDQUFDLENBQUM7SUFFckQsSUFBSSxpQkFBaUIsQ0FBQyxJQUFJLEdBQUcsQ0FBQyxFQUFFO1FBQzlCLE1BQU0sSUFBSSxLQUFLLENBQUMsc0RBQXNELENBQUMsQ0FBQztLQUN6RTtJQUNELElBQUksaUJBQWlCLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQyxLQUFLLFNBQVMsQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDLEVBQUU7UUFDckQsTUFBTSxJQUFJLEtBQUssQ0FDWCxnRUFBZ0UsQ0FBQyxDQUFDO0tBQ3ZFO0lBQ0QsSUFBSSxhQUFhLENBQUMsU0FBUyxDQUFDLEtBQUssQ0FBQyxJQUFJLFNBQVMsRUFBRTtRQUMvQyxNQUFNLElBQUksS0FBSyxDQUFDLHFDQUFxQyxTQUFTLEVBQUUsQ0FBQyxDQUFDO0tBQ25FO0lBQ0QsSUFBSSxpQkFBaUIsQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDLElBQUksU0FBUyxFQUFFO1FBQzNDLE1BQU0sSUFBSSxLQUFLLENBQUMsb0NBQ1osU0FBUywrQkFBK0IsaUJBQWlCLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQztLQUMzRTtJQUVELE1BQU0sTUFBTSxHQUF1QjtRQUNqQyxjQUFjLEVBQUUsaUJBQWlCO1FBQ2pDLE1BQU0sRUFBRSxTQUFTO0tBQ2xCLENBQUM7SUFDRixNQUFNLEtBQUssR0FBc0IsRUFBQyxJQUFJLEVBQUMsQ0FBQztJQUV4QyxPQUFPLE1BQU0sQ0FBQyxTQUFTLENBQUMsWUFBWSxFQUFFLE1BQVksRUFBRSxLQUFXLENBQUMsQ0FBQztBQUNuRSxDQUFDO0FBRUQsTUFBTSxDQUFDLE1BQU0sWUFBWSxHQUFHLEVBQUUsQ0FBQyxFQUFDLGFBQWEsRUFBQyxDQUFDLENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyIvKipcbiAqIEBsaWNlbnNlXG4gKiBDb3B5cmlnaHQgMjAyMiBHb29nbGUgTExDLiBBbGwgUmlnaHRzIFJlc2VydmVkLlxuICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlIFwiTGljZW5zZVwiKTtcbiAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS5cbiAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdFxuICpcbiAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMFxuICpcbiAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmVcbiAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuIFwiQVMgSVNcIiBCQVNJUyxcbiAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLlxuICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZFxuICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuXG4gKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuICovXG5cbmltcG9ydCB7RU5HSU5FfSBmcm9tICcuLi9lbmdpbmUnO1xuaW1wb3J0IHtTZWFyY2hTb3J0ZWQsIFNlYXJjaFNvcnRlZEF0dHJzLCBTZWFyY2hTb3J0ZWRJbnB1dHN9IGZyb20gJy4uL2tlcm5lbF9uYW1lcyc7XG5pbXBvcnQge1RlbnNvcn0gZnJvbSAnLi4vdGVuc29yJztcbmltcG9ydCB7Y29udmVydFRvVGVuc29yfSBmcm9tICcuLi90ZW5zb3JfdXRpbF9lbnYnO1xuaW1wb3J0IHtUZW5zb3JMaWtlfSBmcm9tICcuLi90eXBlcyc7XG5pbXBvcnQge3NpemVGcm9tU2hhcGV9IGZyb20gJy4uL3V0aWxfYmFzZSc7XG5pbXBvcnQge29wfSBmcm9tICcuL29wZXJhdGlvbic7XG5pbXBvcnQge3Jlc2hhcGV9IGZyb20gJy4vcmVzaGFwZSc7XG5cbmNvbnN0IElOVDMyX01BWCA9IDIxNDc0ODM2NDg7XG4vKipcbiAqIFNlYXJjaGVzIGZvciB3aGVyZSBhIHZhbHVlIHdvdWxkIGdvIGluIGEgc29ydGVkIHNlcXVlbmNlLlxuICpcbiAqIFRoaXMgaXMgbm90IGEgbWV0aG9kIGZvciBjaGVja2luZyBjb250YWlubWVudCAobGlrZSBqYXZhc2NyaXB0IGluKS5cbiAqXG4gKiBUaGUgdHlwaWNhbCB1c2UgY2FzZSBmb3IgdGhpcyBvcGVyYXRpb24gaXMgXCJiaW5uaW5nXCIsIFwiYnVja2V0aW5nXCIsIG9yXG4gKiBcImRpc2NyZXRpemluZ1wiLiBUaGUgdmFsdWVzIGFyZSBhc3NpZ25lZCB0byBidWNrZXQtaW5kaWNlcyBiYXNlZCBvbiB0aGUgZWRnZXNcbiAqIGxpc3RlZCBpbiAnc29ydGVkU2VxdWVuY2UnLiBUaGlzIG9wZXJhdGlvbiByZXR1cm5zIHRoZSBidWNrZXQtaW5kZXggZm9yIGVhY2hcbiAqIHZhbHVlLlxuICpcbiAqIFRoZSBzaWRlIGFyZ3VtZW50IGNvbnRyb2xzIHdoaWNoIGluZGV4IGlzIHJldHVybmVkIGlmIGEgdmFsdWUgbGFuZHMgZXhhY3RseVxuICogb24gYW4gZWRnZS5cbiAqXG4gKiBUaGUgYXhpcyBpcyBub3Qgc2V0dGFibGUgZm9yIHRoaXMgb3BlcmF0aW9uLiBJdCBhbHdheXMgb3BlcmF0ZXMgb24gdGhlXG4gKiBpbm5lcm1vc3QgZGltZW5zaW9uIChheGlzPS0xKS4gVGhlIG9wZXJhdGlvbiB3aWxsIGFjY2VwdCBhbnkgbnVtYmVyIG9mIG91dGVyXG4gKiBkaW1lbnNpb25zLlxuICpcbiAqIE5vdGU6IFRoaXMgb3BlcmF0aW9uIGFzc3VtZXMgdGhhdCAnc29ydGVkU2VxdWVuY2UnIGlzIHNvcnRlZCBhbG9uZyB0aGVcbiAqIGlubmVybW9zdCBheGlzLCBtYXliZSB1c2luZyAnc29ydCguLi4sIGF4aXM9LTEpJy4gSWYgdGhlIHNlcXVlbmNlIGlzIG5vdFxuICogc29ydGVkIG5vIGVycm9yIGlzIHJhaXNlZCBhbmQgdGhlIGNvbnRlbnQgb2YgdGhlIHJldHVybmVkIHRlbnNvciBpcyBub3Qgd2VsbFxuICogZGVmaW5lZC5cbiAqXG4gKiBgYGBqc1xuICogY29uc3QgZWRnZXMgPSB0Zi50ZW5zb3IxZChbLTEsIDMuMywgOS4xLCAxMC4wXSk7XG4gKiBsZXQgdmFsdWVzID0gdGYudGVuc29yMWQoWzAuMCwgNC4xLCAxMi4wXSk7XG4gKiBjb25zdCByZXN1bHQxID0gdGYuc2VhcmNoU29ydGVkKGVkZ2VzLCB2YWx1ZXMsICdsZWZ0Jyk7XG4gKiByZXN1bHQxLnByaW50KCk7IC8vIFsxLCAyLCA0XVxuICpcbiAqIGNvbnN0IHNlcSA9IHRmLnRlbnNvcjFkKFswLCAzLCA5LCAxMCwgMTBdKTtcbiAqIHZhbHVlcyA9IHRmLnRlbnNvcjFkKFswLCA0LCAxMF0pO1xuICogY29uc3QgcmVzdWx0MiA9IHRmLnNlYXJjaFNvcnRlZChzZXEsIHZhbHVlcywgJ2xlZnQnKTtcbiAqIHJlc3VsdDIucHJpbnQoKTsgLy8gWzAsIDIsIDNdXG4gKiBjb25zdCByZXN1bHQzID0gdGYuc2VhcmNoU29ydGVkKHNlcSwgdmFsdWVzLCAncmlnaHQnKTtcbiAqIHJlc3VsdDMucHJpbnQoKTsgLy8gWzEsIDIsIDVdXG4gKlxuICogY29uc3Qgc29ydGVkU2VxdWVuY2UgPSB0Zi50ZW5zb3IyZChbWzAuLCAzLiwgOC4sIDkuLCAxMC5dLFxuICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgWzEuLCAyLiwgMy4sIDQuLCA1Ll1dKTtcbiAqIHZhbHVlcyA9IHRmLnRlbnNvcjJkKFtbOS44LCAyLjEsIDQuM10sXG4gKiAgICAgICAgICAgICAgICAgICAgICAgWzAuMSwgNi42LCA0LjUsIF1dKTtcbiAqIGNvbnN0IHJlc3VsdDQgPSB0Zi5zZWFyY2hTb3J0ZWQoc29ydGVkU2VxdWVuY2UsIHZhbHVlcywgJ2xlZnQnKTtcbiAqIHJlc3VsdDQucHJpbnQoKTsgLy8gW1s0LCAxLCAyXSwgWzAsIDUsIDRdXVxuICogYGBgXG4gKiBAcGFyYW0gc29ydGVkU2VxdWVuY2U6IE4tRC4gU29ydGVkIHNlcXVlbmNlLlxuICogQHBhcmFtIHZhbHVlczogTi1ELiBTZWFyY2ggdmFsdWVzLlxuICogQHBhcmFtIHNpZGU6ICdsZWZ0J3wncmlnaHQnLiBEZWZhdWx0cyB0byAnbGVmdCcuICdsZWZ0JyBjb3JyZXNwb25kcyB0byBsb3dlclxuICogICAgIGJvdW5kIGFuZCAncmlnaHQnIHRvIHVwcGVyIGJvdW5kLlxuICogQHJldHVybiBBbiBOLUQgaW50MzIgdGVuc29yIHRoZSBzaXplIG9mIHZhbHVlcyBjb250YWluaW5nIHRoZSByZXN1bHQgb2ZcbiAqICAgICBhcHBseWluZyBlaXRoZXIgbG93ZXIgYm91bmQgb3IgdXBwZXIgYm91bmQgKGRlcGVuZGluZyBvbiBzaWRlKSB0byBlYWNoXG4gKiAgICAgdmFsdWUuIFRoZSByZXN1bHQgaXMgbm90IGEgZ2xvYmFsIGluZGV4IHRvIHRoZSBlbnRpcmUgVGVuc29yLCBidXQgdGhlXG4gKiAgICAgaW5kZXggaW4gdGhlIGxhc3QgZGltZW5zaW9uLlxuICogQGRvYyB7aGVhZGluZzogJ09wZXJhdGlvbnMnLCBzdWJoZWFkaW5nOiAnRXZhbHVhdGlvbid9XG4gKi9cbmZ1bmN0aW9uIHNlYXJjaFNvcnRlZF8oXG4gICAgc29ydGVkU2VxdWVuY2U6IFRlbnNvcnxUZW5zb3JMaWtlLCB2YWx1ZXM6IFRlbnNvcnxUZW5zb3JMaWtlLFxuICAgIHNpZGU6ICdsZWZ0J3wncmlnaHQnID0gJ2xlZnQnKTogVGVuc29yIHtcbiAgY29uc3QgJHNvcnRlZFNlcXVlbmNlID1cbiAgICAgIGNvbnZlcnRUb1RlbnNvcihzb3J0ZWRTZXF1ZW5jZSwgJ3NvcnRlZFNlcXVlbmNlJywgJ3NlYXJjaFNvcnRlZCcpO1xuICBjb25zdCAkdmFsdWVzID0gY29udmVydFRvVGVuc29yKHZhbHVlcywgJ3ZhbHVlcycsICdzZWFyY2hTb3J0ZWQnKTtcblxuICBjb25zdCBzZXF1ZW5jZVNpemUgPSAkc29ydGVkU2VxdWVuY2Uuc2hhcGVbJHNvcnRlZFNlcXVlbmNlLnNoYXBlLmxlbmd0aCAtIDFdO1xuICBjb25zdCB2YWx1ZXNTaXplID0gJHZhbHVlcy5zaGFwZVskdmFsdWVzLnNoYXBlLmxlbmd0aCAtIDFdO1xuICBjb25zdCAkc29ydGVkU2VxdWVuY2UyRCA9IHJlc2hhcGUoJHNvcnRlZFNlcXVlbmNlLCBbLTEsIHNlcXVlbmNlU2l6ZV0pO1xuICBjb25zdCAkdmFsdWVzMkQgPSByZXNoYXBlKCR2YWx1ZXMsIFstMSwgdmFsdWVzU2l6ZV0pO1xuXG4gIGlmICgkc29ydGVkU2VxdWVuY2UyRC5yYW5rIDwgMikge1xuICAgIHRocm93IG5ldyBFcnJvcihgU29ydGVkIGlucHV0IGFyZ3VtZW50IG11c3QgYmUgYXQgbGVhc3QgMi1kaW1lbnNpb25hbGApO1xuICB9XG4gIGlmICgkc29ydGVkU2VxdWVuY2UyRC5zaGFwZVswXSAhPT0gJHZhbHVlczJELnNoYXBlWzBdKSB7XG4gICAgdGhyb3cgbmV3IEVycm9yKFxuICAgICAgICBgTGVhZGluZyBkaW1lbnNpb24gb2YgJ3NvcnRlZFNlcXVlbmNlJyBhbmQgJ3ZhbHVlcycgbXVzdCBtYXRjaC5gKTtcbiAgfVxuICBpZiAoc2l6ZUZyb21TaGFwZSgkdmFsdWVzMkQuc2hhcGUpID49IElOVDMyX01BWCkge1xuICAgIHRocm93IG5ldyBFcnJvcihgdmFsdWVzIHRlbnNvciBzaXplIG11c3QgbGVzcyB0aGFuICR7SU5UMzJfTUFYfWApO1xuICB9XG4gIGlmICgkc29ydGVkU2VxdWVuY2UyRC5zaGFwZVsxXSA+PSBJTlQzMl9NQVgpIHtcbiAgICB0aHJvdyBuZXcgRXJyb3IoYHRyYWlsaW5nIGRpbV9zaXplIG11c3QgbGVzcyB0aGFuICR7XG4gICAgICAgIElOVDMyX01BWH0gZm9yIGludDMyIG91dHB1dCB0eXBlLCB3YXMgJHskc29ydGVkU2VxdWVuY2UyRC5zaGFwZVsxXX1gKTtcbiAgfVxuXG4gIGNvbnN0IGlucHV0czogU2VhcmNoU29ydGVkSW5wdXRzID0ge1xuICAgIHNvcnRlZFNlcXVlbmNlOiAkc29ydGVkU2VxdWVuY2UyRCxcbiAgICB2YWx1ZXM6ICR2YWx1ZXMyRCxcbiAgfTtcbiAgY29uc3QgYXR0cnM6IFNlYXJjaFNvcnRlZEF0dHJzID0ge3NpZGV9O1xuXG4gIHJldHVybiBFTkdJTkUucnVuS2VybmVsKFNlYXJjaFNvcnRlZCwgaW5wdXRzIGFzIHt9LCBhdHRycyBhcyB7fSk7XG59XG5cbmV4cG9ydCBjb25zdCBzZWFyY2hTb3J0ZWQgPSBvcCh7c2VhcmNoU29ydGVkX30pO1xuIl19","/**\n * @license\n * Copyright 2022 Google LLC. All Rights Reserved.\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n * =============================================================================\n */\nimport { searchSorted } from './search_sorted';\n/**\n * Searches for where a value would go in a sorted sequence.\n *\n * This is not a method for checking containment (like javascript in).\n *\n * The typical use case for this operation is \"binning\", \"bucketing\", or\n * \"discretizing\". The values are assigned to bucket-indices based on the edges\n * listed in 'sortedSequence'. This operation returns the bucket-index for each\n * value.\n *\n * The index returned corresponds to the first edge greater than or equal to the\n * value.\n *\n * The axis is not settable for this operation. It always operates on the\n * innermost dimension (axis=-1). The operation will accept any number of outer\n * dimensions.\n *\n * Note: This operation assumes that 'lowerBound' is sorted along the\n * innermost axis, maybe using 'sort(..., axis=-1)'. If the sequence is not\n * sorted no error is raised and the content of the returned tensor is not well\n * defined.\n *\n * ```js\n * const edges = tf.tensor1d([-1, 3.3, 9.1, 10.0]);\n * let values = tf.tensor1d([0.0, 4.1, 12.0]);\n * const result1 = tf.lowerBound(edges, values);\n * result1.print(); // [1, 2, 4]\n *\n * const seq = tf.tensor1d([0, 3, 9, 10, 10]);\n * values = tf.tensor1d([0, 4, 10]);\n * const result2 = tf.lowerBound(seq, values);\n * result2.print(); // [0, 2, 3]\n *\n * const sortedSequence = tf.tensor2d([[0., 3., 8., 9., 10.],\n * [1., 2., 3., 4., 5.]]);\n * values = tf.tensor2d([[9.8, 2.1, 4.3],\n * [0.1, 6.6, 4.5, ]]);\n * const result3 = tf.lowerBound(sortedSequence, values);\n * result3.print(); // [[4, 1, 2], [0, 5, 4]]\n * ```\n * @param sortedSequence: N-D. Sorted sequence.\n * @param values: N-D. Search values.\n * @return An N-D int32 tensor the size of values containing the result of\n * applying lower bound to each value. The result is not a global index to\n * the entire Tensor, but the index in the last dimension.\n * @doc {heading: 'Operations', subheading: 'Evaluation'}\n */\nexport function lowerBound(sortedSequence, values) {\n return searchSorted(sortedSequence, values, 'left');\n}\n//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibG93ZXJfYm91bmQuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi8uLi90ZmpzLWNvcmUvc3JjL29wcy9sb3dlcl9ib3VuZC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQTs7Ozs7Ozs7Ozs7Ozs7O0dBZUc7QUFJSCxPQUFPLEVBQUMsWUFBWSxFQUFDLE1BQU0saUJBQWlCLENBQUM7QUFFN0M7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7R0E4Q0c7QUFDSCxNQUFNLFVBQVUsVUFBVSxDQUN0QixjQUFpQyxFQUFFLE1BQXlCO0lBQzlELE9BQU8sWUFBWSxDQUFDLGNBQWMsRUFBRSxNQUFNLEVBQUUsTUFBTSxDQUFDLENBQUM7QUFDdEQsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbIi8qKlxuICogQGxpY2Vuc2VcbiAqIENvcHlyaWdodCAyMDIyIEdvb2dsZSBMTEMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuXG4gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgXCJMaWNlbnNlXCIpO1xuICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLlxuICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0XG4gKlxuICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wXG4gKlxuICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZVxuICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gXCJBUyBJU1wiIEJBU0lTLFxuICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuXG4gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kXG4gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS5cbiAqID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4gKi9cblxuaW1wb3J0IHtUZW5zb3J9IGZyb20gJy4uL3RlbnNvcic7XG5pbXBvcnQge1RlbnNvckxpa2V9IGZyb20gJy4uL3R5cGVzJztcbmltcG9ydCB7c2VhcmNoU29ydGVkfSBmcm9tICcuL3NlYXJjaF9zb3J0ZWQnO1xuXG4vKipcbiAqIFNlYXJjaGVzIGZvciB3aGVyZSBhIHZhbHVlIHdvdWxkIGdvIGluIGEgc29ydGVkIHNlcXVlbmNlLlxuICpcbiAqIFRoaXMgaXMgbm90IGEgbWV0aG9kIGZvciBjaGVja2luZyBjb250YWlubWVudCAobGlrZSBqYXZhc2NyaXB0IGluKS5cbiAqXG4gKiBUaGUgdHlwaWNhbCB1c2UgY2FzZSBmb3IgdGhpcyBvcGVyYXRpb24gaXMgXCJiaW5uaW5nXCIsIFwiYnVja2V0aW5nXCIsIG9yXG4gKiBcImRpc2NyZXRpemluZ1wiLiBUaGUgdmFsdWVzIGFyZSBhc3NpZ25lZCB0byBidWNrZXQtaW5kaWNlcyBiYXNlZCBvbiB0aGUgZWRnZXNcbiAqIGxpc3RlZCBpbiAnc29ydGVkU2VxdWVuY2UnLiBUaGlzIG9wZXJhdGlvbiByZXR1cm5zIHRoZSBidWNrZXQtaW5kZXggZm9yIGVhY2hcbiAqIHZhbHVlLlxuICpcbiAqIFRoZSBpbmRleCByZXR1cm5lZCBjb3JyZXNwb25kcyB0byB0aGUgZmlyc3QgZWRnZSBncmVhdGVyIHRoYW4gb3IgZXF1YWwgdG8gdGhlXG4gKiB2YWx1ZS5cbiAqXG4gKiBUaGUgYXhpcyBpcyBub3Qgc2V0dGFibGUgZm9yIHRoaXMgb3BlcmF0aW9uLiBJdCBhbHdheXMgb3BlcmF0ZXMgb24gdGhlXG4gKiBpbm5lcm1vc3QgZGltZW5zaW9uIChheGlzPS0xKS4gVGhlIG9wZXJhdGlvbiB3aWxsIGFjY2VwdCBhbnkgbnVtYmVyIG9mIG91dGVyXG4gKiBkaW1lbnNpb25zLlxuICpcbiAqIE5vdGU6IFRoaXMgb3BlcmF0aW9uIGFzc3VtZXMgdGhhdCAnbG93ZXJCb3VuZCcgaXMgc29ydGVkIGFsb25nIHRoZVxuICogaW5uZXJtb3N0IGF4aXMsIG1heWJlIHVzaW5nICdzb3J0KC4uLiwgYXhpcz0tMSknLiBJZiB0aGUgc2VxdWVuY2UgaXMgbm90XG4gKiBzb3J0ZWQgbm8gZXJyb3IgaXMgcmFpc2VkIGFuZCB0aGUgY29udGVudCBvZiB0aGUgcmV0dXJuZWQgdGVuc29yIGlzIG5vdCB3ZWxsXG4gKiBkZWZpbmVkLlxuICpcbiAqIGBgYGpzXG4gKiBjb25zdCBlZGdlcyA9IHRmLnRlbnNvcjFkKFstMSwgMy4zLCA5LjEsIDEwLjBdKTtcbiAqIGxldCB2YWx1ZXMgPSB0Zi50ZW5zb3IxZChbMC4wLCA0LjEsIDEyLjBdKTtcbiAqIGNvbnN0IHJlc3VsdDEgPSB0Zi5sb3dlckJvdW5kKGVkZ2VzLCB2YWx1ZXMpO1xuICogcmVzdWx0MS5wcmludCgpOyAvLyBbMSwgMiwgNF1cbiAqXG4gKiBjb25zdCBzZXEgPSB0Zi50ZW5zb3IxZChbMCwgMywgOSwgMTAsIDEwXSk7XG4gKiB2YWx1ZXMgPSB0Zi50ZW5zb3IxZChbMCwgNCwgMTBdKTtcbiAqIGNvbnN0IHJlc3VsdDIgPSB0Zi5sb3dlckJvdW5kKHNlcSwgdmFsdWVzKTtcbiAqIHJlc3VsdDIucHJpbnQoKTsgLy8gWzAsIDIsIDNdXG4gKlxuICogY29uc3Qgc29ydGVkU2VxdWVuY2UgPSB0Zi50ZW5zb3IyZChbWzAuLCAzLiwgOC4sIDkuLCAxMC5dLFxuICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgWzEuLCAyLiwgMy4sIDQuLCA1Ll1dKTtcbiAqIHZhbHVlcyA9IHRmLnRlbnNvcjJkKFtbOS44LCAyLjEsIDQuM10sXG4gKiAgICAgICAgICAgICAgICAgICAgICAgWzAuMSwgNi42LCA0LjUsIF1dKTtcbiAqIGNvbnN0IHJlc3VsdDMgPSB0Zi5sb3dlckJvdW5kKHNvcnRlZFNlcXVlbmNlLCB2YWx1ZXMpO1xuICogcmVzdWx0My5wcmludCgpOyAvLyBbWzQsIDEsIDJdLCBbMCwgNSwgNF1dXG4gKiBgYGBcbiAqIEBwYXJhbSBzb3J0ZWRTZXF1ZW5jZTogTi1ELiBTb3J0ZWQgc2VxdWVuY2UuXG4gKiBAcGFyYW0gdmFsdWVzOiBOLUQuIFNlYXJjaCB2YWx1ZXMuXG4gKiBAcmV0dXJuIEFuIE4tRCBpbnQzMiB0ZW5zb3IgdGhlIHNpemUgb2YgdmFsdWVzIGNvbnRhaW5pbmcgdGhlIHJlc3VsdCBvZlxuICogICAgIGFwcGx5aW5nIGxvd2VyIGJvdW5kIHRvIGVhY2ggdmFsdWUuIFRoZSByZXN1bHQgaXMgbm90IGEgZ2xvYmFsIGluZGV4IHRvXG4gKiAgICAgdGhlIGVudGlyZSBUZW5zb3IsIGJ1dCB0aGUgaW5kZXggaW4gdGhlIGxhc3QgZGltZW5zaW9uLlxuICogQGRvYyB7aGVhZGluZzogJ09wZXJhdGlvbnMnLCBzdWJoZWFkaW5nOiAnRXZhbHVhdGlvbid9XG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBsb3dlckJvdW5kKFxuICAgIHNvcnRlZFNlcXVlbmNlOiBUZW5zb3J8VGVuc29yTGlrZSwgdmFsdWVzOiBUZW5zb3J8VGVuc29yTGlrZSk6IFRlbnNvciB7XG4gIHJldHVybiBzZWFyY2hTb3J0ZWQoc29ydGVkU2VxdWVuY2UsIHZhbHVlcywgJ2xlZnQnKTtcbn1cbiJdfQ==","/**\n * @license\n * Copyright 2020 Google LLC. All Rights Reserved.\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n * =============================================================================\n */\nimport { ENGINE } from '../engine';\nimport { MaxPool3D } from '../kernel_names';\nimport { convertToTensor } from '../tensor_util_env';\nimport * as util from '../util';\nimport { checkPadOnDimRoundingMode } from './conv_util';\nimport { op } from './operation';\nimport { reshape } from './reshape';\n/**\n * Computes the 3D max pooling.\n *\n * ```js\n * const x = tf.tensor5d([1, 2, 3, 4, 5, 6, 7, 8], [1, 2, 2, 2, 1]);\n * const result = tf.maxPool3d(x, 2, 1, 'valid');\n * result.print();\n * ```\n *\n * @param x The input tensor, of rank 5 or rank 4 of shape\n * `[batch, depth, height, width, inChannels]`.\n * @param filterSize The filter size:\n * `[filterDepth, filterHeight, filterWidth]`.\n * If `filterSize` is a single number,\n * then `filterDepth == filterHeight == filterWidth`.\n * @param strides The strides of the pooling:\n * `[strideDepth, strideHeight, strideWidth]`.\n * If `strides` is a single number,\n * then `strideDepth == strideHeight == strideWidth`.\n * @param pad The type of padding algorithm.\n * - `same` and stride 1: output will be of same size as input,\n * regardless of filter size.\n * - `valid`: output will be smaller than input if filter is larger\n * than 1*1x1.\n * - For more info, see this guide:\n * [https://www.tensorflow.org/api_docs/python/tf/nn/convolution](\n * https://www.tensorflow.org/api_docs/python/tf/nn/convolution)\n * @param dimRoundingMode A string from: 'ceil', 'round', 'floor'. If none is\n * provided, it will default to truncate.\n * @param dataFormat An optional string from: \"NDHWC\", \"NCDHW\". Defaults to\n * \"NDHWC\". Specify the data format of the input and output data. With the\n * default format \"NDHWC\", the data is stored in the order of: [batch,\n * depth, height, width, channels]. Only \"NDHWC\" is currently supported.\n * @doc {heading: 'Operations', subheading: 'Convolution'}\n */\nfunction maxPool3d_(x, filterSize = [1, 1, 1], strides, pad, dimRoundingMode, dataFormat = 'NDHWC') {\n const $x = convertToTensor(x, 'x', 'maxPool3d');\n let x5D = $x;\n let reshapedTo5D = false;\n if ($x.rank === 4) {\n reshapedTo5D = true;\n x5D = reshape($x, [1, $x.shape[0], $x.shape[1], $x.shape[2], $x.shape[3]]);\n }\n util.assert(x5D.rank === 5, () => `Error in maxPool3d: x must be rank 5 but got rank ${x5D.rank}.`);\n util.assert(dataFormat === 'NDHWC', () => `Error in maxPool3d: Only NDHWC is currently supported, ` +\n `but got dataFormat of ${dataFormat}`);\n checkPadOnDimRoundingMode('maxPool3d', pad, dimRoundingMode);\n const inputs = { x: x5D };\n const attrs = { filterSize, strides, pad, dimRoundingMode, dataFormat };\n // tslint:disable-next-line: no-unnecessary-type-assertion\n const res = ENGINE.runKernel(MaxPool3D, inputs, attrs);\n if (reshapedTo5D) {\n return reshape(res, [res.shape[1], res.shape[2], res.shape[3], res.shape[4]]);\n }\n return res;\n}\nexport const maxPool3d = op({ maxPool3d_ });\n//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibWF4X3Bvb2xfM2QuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi8uLi90ZmpzLWNvcmUvc3JjL29wcy9tYXhfcG9vbF8zZC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQTs7Ozs7Ozs7Ozs7Ozs7O0dBZUc7QUFFSCxPQUFPLEVBQUMsTUFBTSxFQUFDLE1BQU0sV0FBVyxDQUFDO0FBQ2pDLE9BQU8sRUFBQyxTQUFTLEVBQWtDLE1BQU0saUJBQWlCLENBQUM7QUFJM0UsT0FBTyxFQUFDLGVBQWUsRUFBQyxNQUFNLG9CQUFvQixDQUFDO0FBRW5ELE9BQU8sS0FBSyxJQUFJLE1BQU0sU0FBUyxDQUFDO0FBRWhDLE9BQU8sRUFBQyx5QkFBeUIsRUFBQyxNQUFNLGFBQWEsQ0FBQztBQUN0RCxPQUFPLEVBQUMsRUFBRSxFQUFDLE1BQU0sYUFBYSxDQUFDO0FBQy9CLE9BQU8sRUFBQyxPQUFPLEVBQUMsTUFBTSxXQUFXLENBQUM7QUFFbEM7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7R0FrQ0c7QUFDSCxTQUFTLFVBQVUsQ0FDZixDQUFlLEVBQUUsYUFBOEMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsQ0FBQyxFQUN4RSxPQUF3QyxFQUFFLEdBQTBCLEVBQ3BFLGVBQXdDLEVBQ3hDLGFBQThCLE9BQU87SUFDdkMsTUFBTSxFQUFFLEdBQUcsZUFBZSxDQUFDLENBQUMsRUFBRSxHQUFHLEVBQUUsV0FBVyxDQUFDLENBQUM7SUFFaEQsSUFBSSxHQUFHLEdBQUcsRUFBYyxDQUFDO0lBQ3pCLElBQUksWUFBWSxHQUFHLEtBQUssQ0FBQztJQUN6QixJQUFJLEVBQUUsQ0FBQyxJQUFJLEtBQUssQ0FBQyxFQUFFO1FBQ2pCLFlBQVksR0FBRyxJQUFJLENBQUM7UUFDcEIsR0FBRyxHQUFHLE9BQU8sQ0FBQyxFQUFFLEVBQUUsQ0FBQyxDQUFDLEVBQUUsRUFBRSxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUMsRUFBRSxFQUFFLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQyxFQUFFLEVBQUUsQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDLEVBQUUsRUFBRSxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUM7S0FDNUU7SUFFRCxJQUFJLENBQUMsTUFBTSxDQUNQLEdBQUcsQ0FBQyxJQUFJLEtBQUssQ0FBQyxFQUNkLEdBQUcsRUFBRSxDQUFDLHFEQUFxRCxHQUFHLENBQUMsSUFBSSxHQUFHLENBQUMsQ0FBQztJQUM1RSxJQUFJLENBQUMsTUFBTSxDQUNQLFVBQVUsS0FBSyxPQUFPLEVBQ3RCLEdBQUcsRUFBRSxDQUFDLHlEQUF5RDtRQUMzRCx5QkFBeUIsVUFBVSxFQUFFLENBQUMsQ0FBQztJQUMvQyx5QkFBeUIsQ0FBQyxXQUFXLEVBQUUsR0FBRyxFQUFFLGVBQWUsQ0FBQyxDQUFDO0lBQzdELE1BQU0sTUFBTSxHQUFvQixFQUFDLENBQUMsRUFBRSxHQUFHLEVBQUMsQ0FBQztJQUN6QyxNQUFNLEtBQUssR0FDVSxFQUFDLFVBQVUsRUFBRSxPQUFPLEVBQUUsR0FBRyxFQUFFLGVBQWUsRUFBRSxVQUFVLEVBQUMsQ0FBQztJQUU3RSwwREFBMEQ7SUFDMUQsTUFBTSxHQUFHLEdBQUcsTUFBTSxDQUFDLFNBQVMsQ0FDWixTQUFTLEVBQUUsTUFBOEIsRUFDekMsS0FBMkIsQ0FBTSxDQUFDO0lBRWxELElBQUksWUFBWSxFQUFFO1FBQ2hCLE9BQU8sT0FBTyxDQUNILEdBQUcsRUFBRSxDQUFDLEdBQUcsQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDLEVBQUUsR0FBRyxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUMsRUFBRSxHQUFHLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQyxFQUFFLEdBQUcsQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FDbkUsQ0FBQztLQUNQO0lBRUQsT0FBTyxHQUFHLENBQUM7QUFDYixDQUFDO0FBRUQsTUFBTSxDQUFDLE1BQU0sU0FBUyxHQUFHLEVBQUUsQ0FBQyxFQUFDLFVBQVUsRUFBQyxDQUFDLENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyIvKipcbiAqIEBsaWNlbnNlXG4gKiBDb3B5cmlnaHQgMjAyMCBHb29nbGUgTExDLiBBbGwgUmlnaHRzIFJlc2VydmVkLlxuICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlIFwiTGljZW5zZVwiKTtcbiAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS5cbiAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdFxuICpcbiAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMFxuICpcbiAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmVcbiAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuIFwiQVMgSVNcIiBCQVNJUyxcbiAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLlxuICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZFxuICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuXG4gKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuICovXG5cbmltcG9ydCB7RU5HSU5FfSBmcm9tICcuLi9lbmdpbmUnO1xuaW1wb3J0IHtNYXhQb29sM0QsIE1heFBvb2wzREF0dHJzLCBNYXhQb29sM0RJbnB1dHN9IGZyb20gJy4uL2tlcm5lbF9uYW1lcyc7XG5pbXBvcnQge05hbWVkQXR0ck1hcH0gZnJvbSAnLi4va2VybmVsX3JlZ2lzdHJ5JztcbmltcG9ydCB7VGVuc29yNEQsIFRlbnNvcjVEfSBmcm9tICcuLi90ZW5zb3InO1xuaW1wb3J0IHtOYW1lZFRlbnNvck1hcH0gZnJvbSAnLi4vdGVuc29yX3R5cGVzJztcbmltcG9ydCB7Y29udmVydFRvVGVuc29yfSBmcm9tICcuLi90ZW5zb3JfdXRpbF9lbnYnO1xuaW1wb3J0IHtUZW5zb3JMaWtlfSBmcm9tICcuLi90eXBlcyc7XG5pbXBvcnQgKiBhcyB1dGlsIGZyb20gJy4uL3V0aWwnO1xuXG5pbXBvcnQge2NoZWNrUGFkT25EaW1Sb3VuZGluZ01vZGV9IGZyb20gJy4vY29udl91dGlsJztcbmltcG9ydCB7b3B9IGZyb20gJy4vb3BlcmF0aW9uJztcbmltcG9ydCB7cmVzaGFwZX0gZnJvbSAnLi9yZXNoYXBlJztcblxuLyoqXG4gKiBDb21wdXRlcyB0aGUgM0QgbWF4IHBvb2xpbmcuXG4gKlxuICogYGBganNcbiAqIGNvbnN0IHggPSB0Zi50ZW5zb3I1ZChbMSwgMiwgMywgNCwgNSwgNiwgNywgOF0sIFsxLCAyLCAyLCAyLCAxXSk7XG4gKiBjb25zdCByZXN1bHQgPSB0Zi5tYXhQb29sM2QoeCwgMiwgMSwgJ3ZhbGlkJyk7XG4gKiByZXN1bHQucHJpbnQoKTtcbiAqIGBgYFxuICpcbiAqIEBwYXJhbSB4IFRoZSBpbnB1dCB0ZW5zb3IsIG9mIHJhbmsgNSBvciByYW5rIDQgb2Ygc2hhcGVcbiAqICAgICBgW2JhdGNoLCBkZXB0aCwgaGVpZ2h0LCB3aWR0aCwgaW5DaGFubmVsc11gLlxuICogQHBhcmFtIGZpbHRlclNpemUgVGhlIGZpbHRlciBzaXplOlxuICogICAgIGBbZmlsdGVyRGVwdGgsIGZpbHRlckhlaWdodCwgZmlsdGVyV2lkdGhdYC5cbiAqICAgICBJZiBgZmlsdGVyU2l6ZWAgaXMgYSBzaW5nbGUgbnVtYmVyLFxuICogICAgIHRoZW4gYGZpbHRlckRlcHRoID09IGZpbHRlckhlaWdodCA9PSBmaWx0ZXJXaWR0aGAuXG4gKiBAcGFyYW0gc3RyaWRlcyBUaGUgc3RyaWRlcyBvZiB0aGUgcG9vbGluZzpcbiAqICAgICBgW3N0cmlkZURlcHRoLCBzdHJpZGVIZWlnaHQsIHN0cmlkZVdpZHRoXWAuXG4gKiAgICAgSWYgYHN0cmlkZXNgIGlzIGEgc2luZ2xlIG51bWJlcixcbiAqICAgICB0aGVuIGBzdHJpZGVEZXB0aCA9PSBzdHJpZGVIZWlnaHQgPT0gc3RyaWRlV2lkdGhgLlxuICogQHBhcmFtIHBhZCBUaGUgdHlwZSBvZiBwYWRkaW5nIGFsZ29yaXRobS5cbiAqICAgIC0gYHNhbWVgIGFuZCBzdHJpZGUgMTogb3V0cHV0IHdpbGwgYmUgb2Ygc2FtZSBzaXplIGFzIGlucHV0LFxuICogICAgICAgcmVnYXJkbGVzcyBvZiBmaWx0ZXIgc2l6ZS5cbiAqICAgIC0gYHZhbGlkYDogb3V0cHV0IHdpbGwgYmUgc21hbGxlciB0aGFuIGlucHV0IGlmIGZpbHRlciBpcyBsYXJnZXJcbiAqICAgICAgIHRoYW4gMSoxeDEuXG4gKiAgICAtIEZvciBtb3JlIGluZm8sIHNlZSB0aGlzIGd1aWRlOlxuICogICAgIFtodHRwczovL3d3dy50ZW5zb3JmbG93Lm9yZy9hcGlfZG9jcy9weXRob24vdGYvbm4vY29udm9sdXRpb25dKFxuICogICAgICAgICAgaHR0cHM6Ly93d3cudGVuc29yZmxvdy5vcmcvYXBpX2RvY3MvcHl0aG9uL3RmL25uL2NvbnZvbHV0aW9uKVxuICogQHBhcmFtIGRpbVJvdW5kaW5nTW9kZSBBIHN0cmluZyBmcm9tOiAnY2VpbCcsICdyb3VuZCcsICdmbG9vcicuIElmIG5vbmUgaXNcbiAqICAgICBwcm92aWRlZCwgaXQgd2lsbCBkZWZhdWx0IHRvIHRydW5jYXRlLlxuICogQHBhcmFtIGRhdGFGb3JtYXQgQW4gb3B0aW9uYWwgc3RyaW5nIGZyb206IFwiTkRIV0NcIiwgXCJOQ0RIV1wiLiBEZWZhdWx0cyB0b1xuICogICAgIFwiTkRIV0NcIi4gU3BlY2lmeSB0aGUgZGF0YSBmb3JtYXQgb2YgdGhlIGlucHV0IGFuZCBvdXRwdXQgZGF0YS4gV2l0aCB0aGVcbiAqICAgICBkZWZhdWx0IGZvcm1hdCBcIk5ESFdDXCIsIHRoZSBkYXRhIGlzIHN0b3JlZCBpbiB0aGUgb3JkZXIgb2Y6IFtiYXRjaCxcbiAqICAgICBkZXB0aCwgaGVpZ2h0LCB3aWR0aCwgY2hhbm5lbHNdLiBPbmx5IFwiTkRIV0NcIiBpcyBjdXJyZW50bHkgc3VwcG9ydGVkLlxuICogQGRvYyB7aGVhZGluZzogJ09wZXJhdGlvbnMnLCBzdWJoZWFkaW5nOiAnQ29udm9sdXRpb24nfVxuICovXG5mdW5jdGlvbiBtYXhQb29sM2RfPFQgZXh0ZW5kcyBUZW5zb3I0RHxUZW5zb3I1RD4oXG4gICAgeDogVHxUZW5zb3JMaWtlLCBmaWx0ZXJTaXplOiBbbnVtYmVyLCBudW1iZXIsIG51bWJlcl18bnVtYmVyID0gWzEsIDEsIDFdLFxuICAgIHN0cmlkZXM6IFtudW1iZXIsIG51bWJlciwgbnVtYmVyXXxudW1iZXIsIHBhZDogJ3ZhbGlkJ3wnc2FtZSd8bnVtYmVyLFxuICAgIGRpbVJvdW5kaW5nTW9kZT86ICdmbG9vcid8J3JvdW5kJ3wnY2VpbCcsXG4gICAgZGF0YUZvcm1hdDogJ05ESFdDJ3wnTkNESFcnID0gJ05ESFdDJyk6IFQge1xuICBjb25zdCAkeCA9IGNvbnZlcnRUb1RlbnNvcih4LCAneCcsICdtYXhQb29sM2QnKTtcblxuICBsZXQgeDVEID0gJHggYXMgVGVuc29yNUQ7XG4gIGxldCByZXNoYXBlZFRvNUQgPSBmYWxzZTtcbiAgaWYgKCR4LnJhbmsgPT09IDQpIHtcbiAgICByZXNoYXBlZFRvNUQgPSB0cnVlO1xuICAgIHg1RCA9IHJlc2hhcGUoJHgsIFsxLCAkeC5zaGFwZVswXSwgJHguc2hhcGVbMV0sICR4LnNoYXBlWzJdLCAkeC5zaGFwZVszXV0pO1xuICB9XG5cbiAgdXRpbC5hc3NlcnQoXG4gICAgICB4NUQucmFuayA9PT0gNSxcbiAgICAgICgpID0+IGBFcnJvciBpbiBtYXhQb29sM2Q6IHggbXVzdCBiZSByYW5rIDUgYnV0IGdvdCByYW5rICR7eDVELnJhbmt9LmApO1xuICB1dGlsLmFzc2VydChcbiAgICAgIGRhdGFGb3JtYXQgPT09ICdOREhXQycsXG4gICAgICAoKSA9PiBgRXJyb3IgaW4gbWF4UG9vbDNkOiBPbmx5IE5ESFdDIGlzIGN1cnJlbnRseSBzdXBwb3J0ZWQsIGAgK1xuICAgICAgICAgIGBidXQgZ290IGRhdGFGb3JtYXQgb2YgJHtkYXRhRm9ybWF0fWApO1xuICBjaGVja1BhZE9uRGltUm91bmRpbmdNb2RlKCdtYXhQb29sM2QnLCBwYWQsIGRpbVJvdW5kaW5nTW9kZSk7XG4gIGNvbnN0IGlucHV0czogTWF4UG9vbDNESW5wdXRzID0ge3g6IHg1RH07XG4gIGNvbnN0IGF0dHJzOlxuICAgICAgTWF4UG9vbDNEQXR0cnMgPSB7ZmlsdGVyU2l6ZSwgc3RyaWRlcywgcGFkLCBkaW1Sb3VuZGluZ01vZGUsIGRhdGFGb3JtYXR9O1xuXG4gIC8vIHRzbGludDpkaXNhYmxlLW5leHQtbGluZTogbm8tdW5uZWNlc3NhcnktdHlwZS1hc3NlcnRpb25cbiAgY29uc3QgcmVzID0gRU5HSU5FLnJ1bktlcm5lbChcbiAgICAgICAgICAgICAgICAgIE1heFBvb2wzRCwgaW5wdXRzIGFzIHt9IGFzIE5hbWVkVGVuc29yTWFwLFxuICAgICAgICAgICAgICAgICAgYXR0cnMgYXMge30gYXMgTmFtZWRBdHRyTWFwKSBhcyBUO1xuXG4gIGlmIChyZXNoYXBlZFRvNUQpIHtcbiAgICByZXR1cm4gcmVzaGFwZShcbiAgICAgICAgICAgICAgIHJlcywgW3Jlcy5zaGFwZVsxXSwgcmVzLnNoYXBlWzJdLCByZXMuc2hhcGVbM10sIHJlcy5zaGFwZVs0XV0pIGFzXG4gICAgICAgIFQ7XG4gIH1cblxuICByZXR1cm4gcmVzO1xufVxuXG5leHBvcnQgY29uc3QgbWF4UG9vbDNkID0gb3Aoe21heFBvb2wzZF99KTtcbiJdfQ==","/**\n * @license\n * Copyright 2018 Google LLC. All Rights Reserved.\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n * =============================================================================\n */\nimport { ENGINE } from '../engine';\nimport { MaxPoolWithArgmax } from '../kernel_names';\nimport { convertToTensor } from '../tensor_util_env';\nimport { op } from './operation';\n/**\n * Computes the 2D max pooling of an image with Argmax index.\n * The indices in argmax are flattened, so that a maximum value at position `[b,\n * y, x, c]` becomes flattened index: `(y * width + x) * channels + c` if\n * include_batch_in_index is False; `((b * height + y) * width + x) * channels\n * +c` if include_batch_in_index is True.\n *\n * The indices returned are always in `[0, height) x [0, width)` before\n * flattening.\n *\n * @param x The input tensor, of rank 4 or rank 3 of shape\n * `[batch, height, width, inChannels]`. If rank 3, batch of 1 is assumed.\n * @param filterSize The filter size: `[filterHeight, filterWidth]`. If\n * `filterSize` is a single number, then `filterHeight == filterWidth`.\n * @param strides The strides of the pooling: `[strideHeight, strideWidth]`. If\n * `strides` is a single number, then `strideHeight == strideWidth`.\n * @param dataFormat An optional string from: \"NDHWC\", \"NCDHW\". Defaults to\n * \"NDHWC\". Specify the data format of the input and output data. With the\n * default format \"NDHWC\", the data is stored in the order of: [batch,\n * depth, height, width, channels]. Only \"NDHWC\" is currently supported.\n * @param pad The type of padding algorithm.\n * - `same` and stride 1: output will be of same size as input,\n * regardless of filter size.\n * - `valid`: output will be smaller than input if filter is larger\n * than 1x1.\n * - For more info, see this guide:\n * [https://www.tensorflow.org/api_docs/python/tf/nn/convolution](\n * https://www.tensorflow.org/api_docs/python/tf/nn/convolution)\n * @param includeBatchIndex Defaults to False. Whether to include batch\n * dimension in flattened index of argmax.\n *\n * @doc {heading: 'Operations', subheading: 'Convolution'}\n */\nfunction maxPoolWithArgmax_(x, filterSize, strides, pad, includeBatchInIndex = false) {\n const $x = convertToTensor(x, 'x', 'maxPoolWithArgmax');\n const inputs = { x: $x };\n const attrs = { filterSize, strides, pad, includeBatchInIndex };\n // tslint:disable-next-line: no-unnecessary-type-assertion\n const result = ENGINE.runKernel(MaxPoolWithArgmax, inputs, attrs);\n return { result: result[0], indexes: result[1] };\n}\nexport const maxPoolWithArgmax = op({ maxPoolWithArgmax_ });\n//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibWF4X3Bvb2xfd2l0aF9hcmdtYXguanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi8uLi90ZmpzLWNvcmUvc3JjL29wcy9tYXhfcG9vbF93aXRoX2FyZ21heC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQTs7Ozs7Ozs7Ozs7Ozs7O0dBZUc7QUFFSCxPQUFPLEVBQUMsTUFBTSxFQUFDLE1BQU0sV0FBVyxDQUFDO0FBQ2pDLE9BQU8sRUFBQyxpQkFBaUIsRUFBa0QsTUFBTSxpQkFBaUIsQ0FBQztBQUluRyxPQUFPLEVBQUMsZUFBZSxFQUFDLE1BQU0sb0JBQW9CLENBQUM7QUFHbkQsT0FBTyxFQUFDLEVBQUUsRUFBQyxNQUFNLGFBQWEsQ0FBQztBQUUvQjs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7R0FnQ0c7QUFDSCxTQUFTLGtCQUFrQixDQUN2QixDQUFlLEVBQUUsVUFBbUMsRUFDcEQsT0FBZ0MsRUFBRSxHQUEwQixFQUM1RCxtQkFBbUIsR0FBRyxLQUFLO0lBQzdCLE1BQU0sRUFBRSxHQUFHLGVBQWUsQ0FBQyxDQUFDLEVBQUUsR0FBRyxFQUFFLG1CQUFtQixDQUFDLENBQUM7SUFFeEQsTUFBTSxNQUFNLEdBQTRCLEVBQUMsQ0FBQyxFQUFFLEVBQUUsRUFBQyxDQUFDO0lBQ2hELE1BQU0sS0FBSyxHQUNrQixFQUFDLFVBQVUsRUFBRSxPQUFPLEVBQUUsR0FBRyxFQUFFLG1CQUFtQixFQUFDLENBQUM7SUFFN0UsMERBQTBEO0lBQzFELE1BQU0sTUFBTSxHQUFHLE1BQU0sQ0FBQyxTQUFTLENBQ1osaUJBQWlCLEVBQUUsTUFBOEIsRUFDakQsS0FBMkIsQ0FBYSxDQUFDO0lBRTVELE9BQU8sRUFBQyxNQUFNLEVBQUUsTUFBTSxDQUFDLENBQUMsQ0FBQyxFQUFFLE9BQU8sRUFBRSxNQUFNLENBQUMsQ0FBQyxDQUFDLEVBQUMsQ0FBQztBQUNqRCxDQUFDO0FBRUQsTUFBTSxDQUFDLE1BQU0saUJBQWlCLEdBQUcsRUFBRSxDQUFDLEVBQUMsa0JBQWtCLEVBQUMsQ0FBQyxDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiLyoqXG4gKiBAbGljZW5zZVxuICogQ29weXJpZ2h0IDIwMTggR29vZ2xlIExMQy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC5cbiAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSBcIkxpY2Vuc2VcIik7XG4gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuXG4gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXRcbiAqXG4gKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjBcbiAqXG4gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlXG4gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiBcIkFTIElTXCIgQkFTSVMsXG4gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC5cbiAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmRcbiAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLlxuICogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbiAqL1xuXG5pbXBvcnQge0VOR0lORX0gZnJvbSAnLi4vZW5naW5lJztcbmltcG9ydCB7TWF4UG9vbFdpdGhBcmdtYXgsIE1heFBvb2xXaXRoQXJnbWF4QXR0cnMsIE1heFBvb2xXaXRoQXJnbWF4SW5wdXRzfSBmcm9tICcuLi9rZXJuZWxfbmFtZXMnO1xuaW1wb3J0IHtOYW1lZEF0dHJNYXB9IGZyb20gJy4uL2tlcm5lbF9yZWdpc3RyeSc7XG5pbXBvcnQge1RlbnNvciwgVGVuc29yNER9IGZyb20gJy4uL3RlbnNvcic7XG5pbXBvcnQge05hbWVkVGVuc29yTWFwfSBmcm9tICcuLi90ZW5zb3JfdHlwZXMnO1xuaW1wb3J0IHtjb252ZXJ0VG9UZW5zb3J9IGZyb20gJy4uL3RlbnNvcl91dGlsX2Vudic7XG5pbXBvcnQge1RlbnNvckxpa2V9IGZyb20gJy4uL3R5cGVzJztcblxuaW1wb3J0IHtvcH0gZnJvbSAnLi9vcGVyYXRpb24nO1xuXG4vKipcbiAqIENvbXB1dGVzIHRoZSAyRCBtYXggcG9vbGluZyBvZiBhbiBpbWFnZSB3aXRoIEFyZ21heCBpbmRleC5cbiAqIFRoZSBpbmRpY2VzIGluIGFyZ21heCBhcmUgZmxhdHRlbmVkLCBzbyB0aGF0IGEgbWF4aW11bSB2YWx1ZSBhdCBwb3NpdGlvbiBgW2IsXG4gKiB5LCB4LCBjXWAgYmVjb21lcyBmbGF0dGVuZWQgaW5kZXg6IGAoeSAqIHdpZHRoICsgeCkgKiBjaGFubmVscyArIGNgIGlmXG4gKiBpbmNsdWRlX2JhdGNoX2luX2luZGV4IGlzIEZhbHNlOyBgKChiICogaGVpZ2h0ICsgeSkgKiB3aWR0aCArIHgpICogY2hhbm5lbHNcbiAqICtjYCBpZiBpbmNsdWRlX2JhdGNoX2luX2luZGV4IGlzIFRydWUuXG4gKlxuICogVGhlIGluZGljZXMgcmV0dXJuZWQgYXJlIGFsd2F5cyBpbiBgWzAsIGhlaWdodCkgeCBbMCwgd2lkdGgpYCBiZWZvcmVcbiAqIGZsYXR0ZW5pbmcuXG4gKlxuICogQHBhcmFtIHggVGhlIGlucHV0IHRlbnNvciwgb2YgcmFuayA0IG9yIHJhbmsgMyBvZiBzaGFwZVxuICogICAgIGBbYmF0Y2gsIGhlaWdodCwgd2lkdGgsIGluQ2hhbm5lbHNdYC4gSWYgcmFuayAzLCBiYXRjaCBvZiAxIGlzIGFzc3VtZWQuXG4gKiBAcGFyYW0gZmlsdGVyU2l6ZSBUaGUgZmlsdGVyIHNpemU6IGBbZmlsdGVySGVpZ2h0LCBmaWx0ZXJXaWR0aF1gLiBJZlxuICogICAgIGBmaWx0ZXJTaXplYCBpcyBhIHNpbmdsZSBudW1iZXIsIHRoZW4gYGZpbHRlckhlaWdodCA9PSBmaWx0ZXJXaWR0aGAuXG4gKiBAcGFyYW0gc3RyaWRlcyBUaGUgc3RyaWRlcyBvZiB0aGUgcG9vbGluZzogYFtzdHJpZGVIZWlnaHQsIHN0cmlkZVdpZHRoXWAuIElmXG4gKiAgICAgYHN0cmlkZXNgIGlzIGEgc2luZ2xlIG51bWJlciwgdGhlbiBgc3RyaWRlSGVpZ2h0ID09IHN0cmlkZVdpZHRoYC5cbiAqIEBwYXJhbSBkYXRhRm9ybWF0IEFuIG9wdGlvbmFsIHN0cmluZyBmcm9tOiBcIk5ESFdDXCIsIFwiTkNESFdcIi4gRGVmYXVsdHMgdG9cbiAqICAgICBcIk5ESFdDXCIuIFNwZWNpZnkgdGhlIGRhdGEgZm9ybWF0IG9mIHRoZSBpbnB1dCBhbmQgb3V0cHV0IGRhdGEuIFdpdGggdGhlXG4gKiAgICAgZGVmYXVsdCBmb3JtYXQgXCJOREhXQ1wiLCB0aGUgZGF0YSBpcyBzdG9yZWQgaW4gdGhlIG9yZGVyIG9mOiBbYmF0Y2gsXG4gKiAgICAgZGVwdGgsIGhlaWdodCwgd2lkdGgsIGNoYW5uZWxzXS4gT25seSBcIk5ESFdDXCIgaXMgY3VycmVudGx5IHN1cHBvcnRlZC5cbiAqIEBwYXJhbSBwYWQgVGhlIHR5cGUgb2YgcGFkZGluZyBhbGdvcml0aG0uXG4gKiAgICAtIGBzYW1lYCBhbmQgc3RyaWRlIDE6IG91dHB1dCB3aWxsIGJlIG9mIHNhbWUgc2l6ZSBhcyBpbnB1dCxcbiAqICAgICAgIHJlZ2FyZGxlc3Mgb2YgZmlsdGVyIHNpemUuXG4gKiAgICAtIGB2YWxpZGA6IG91dHB1dCB3aWxsIGJlIHNtYWxsZXIgdGhhbiBpbnB1dCBpZiBmaWx0ZXIgaXMgbGFyZ2VyXG4gKiAgICAgICB0aGFuIDF4MS5cbiAqICAgIC0gRm9yIG1vcmUgaW5mbywgc2VlIHRoaXMgZ3VpZGU6XG4gKiAgICAgW2h0dHBzOi8vd3d3LnRlbnNvcmZsb3cub3JnL2FwaV9kb2NzL3B5dGhvbi90Zi9ubi9jb252b2x1dGlvbl0oXG4gKiAgICAgICAgICBodHRwczovL3d3dy50ZW5zb3JmbG93Lm9yZy9hcGlfZG9jcy9weXRob24vdGYvbm4vY29udm9sdXRpb24pXG4gKiBAcGFyYW0gaW5jbHVkZUJhdGNoSW5kZXggRGVmYXVsdHMgdG8gRmFsc2UuIFdoZXRoZXIgdG8gaW5jbHVkZSBiYXRjaFxuICogICAgZGltZW5zaW9uIGluIGZsYXR0ZW5lZCBpbmRleCBvZiBhcmdtYXguXG4gKlxuICogQGRvYyB7aGVhZGluZzogJ09wZXJhdGlvbnMnLCBzdWJoZWFkaW5nOiAnQ29udm9sdXRpb24nfVxuICovXG5mdW5jdGlvbiBtYXhQb29sV2l0aEFyZ21heF88VCBleHRlbmRzIFRlbnNvcjREPihcbiAgICB4OiBUfFRlbnNvckxpa2UsIGZpbHRlclNpemU6IFtudW1iZXIsIG51bWJlcl18bnVtYmVyLFxuICAgIHN0cmlkZXM6IFtudW1iZXIsIG51bWJlcl18bnVtYmVyLCBwYWQ6ICd2YWxpZCd8J3NhbWUnfG51bWJlcixcbiAgICBpbmNsdWRlQmF0Y2hJbkluZGV4ID0gZmFsc2UpOiBOYW1lZFRlbnNvck1hcCB7XG4gIGNvbnN0ICR4ID0gY29udmVydFRvVGVuc29yKHgsICd4JywgJ21heFBvb2xXaXRoQXJnbWF4Jyk7XG5cbiAgY29uc3QgaW5wdXRzOiBNYXhQb29sV2l0aEFyZ21heElucHV0cyA9IHt4OiAkeH07XG4gIGNvbnN0IGF0dHJzOlxuICAgICAgTWF4UG9vbFdpdGhBcmdtYXhBdHRycyA9IHtmaWx0ZXJTaXplLCBzdHJpZGVzLCBwYWQsIGluY2x1ZGVCYXRjaEluSW5kZXh9O1xuXG4gIC8vIHRzbGludDpkaXNhYmxlLW5leHQtbGluZTogbm8tdW5uZWNlc3NhcnktdHlwZS1hc3NlcnRpb25cbiAgY29uc3QgcmVzdWx0ID0gRU5HSU5FLnJ1bktlcm5lbChcbiAgICAgICAgICAgICAgICAgICAgIE1heFBvb2xXaXRoQXJnbWF4LCBpbnB1dHMgYXMge30gYXMgTmFtZWRUZW5zb3JNYXAsXG4gICAgICAgICAgICAgICAgICAgICBhdHRycyBhcyB7fSBhcyBOYW1lZEF0dHJNYXApIGFzIFRlbnNvcltdO1xuXG4gIHJldHVybiB7cmVzdWx0OiByZXN1bHRbMF0sIGluZGV4ZXM6IHJlc3VsdFsxXX07XG59XG5cbmV4cG9ydCBjb25zdCBtYXhQb29sV2l0aEFyZ21heCA9IG9wKHttYXhQb29sV2l0aEFyZ21heF99KTtcbiJdfQ==","/**\n * @license\n * Copyright 2021 Google LLC. All Rights Reserved.\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n * =============================================================================\n */\nimport { matMul } from './mat_mul';\nimport { ones } from './ones';\nimport { reshape } from './reshape';\nimport { Tensor } from '../tensor';\nimport { convertToTensor } from '../tensor_util_env';\nimport { sizeFromShape } from '../util_base';\n/**\n * Broadcasts parameters for evaluation on an N-D grid.\n *\n * Given N one-dimensional coordinate arrays `*args`, returns a list `outputs`\n * of N-D coordinate arrays for evaluating expressions on an N-D grid.\n *\n * Notes:\n * `meshgrid` supports cartesian ('xy') and matrix ('ij') indexing conventions.\n * When the `indexing` argument is set to 'xy' (the default), the broadcasting\n * instructions for the first two dimensions are swapped.\n * Examples:\n * Calling `const [X, Y] = meshgrid(x, y)` with the tensors\n *\n * ```javascript\n * const x = [1, 2, 3];\n * const y = [4, 5, 6];\n * const [X, Y] = tf.meshgrid(x, y);\n * // X = [[1, 2, 3],\n * // [1, 2, 3],\n * // [1, 2, 3]]\n * // Y = [[4, 4, 4],\n * // [5, 5, 5],\n * // [6, 6, 6]]\n * ```\n *\n * @param x Tensor with rank geq 1.\n * @param y Tensor with rank geq 1.\n * @param indexing\n *\n * @doc {heading: 'Operations', subheading: 'Slicing and Joining'}\n */\nexport function meshgrid(x, y, { indexing = 'xy' } = {}) {\n if (indexing !== 'xy' && indexing !== 'ij') {\n throw new TypeError(`${indexing} is not a valid third argument to meshgrid`);\n }\n if (x === undefined) {\n return [];\n }\n let $x = convertToTensor(x, 'x', 'meshgrid', x instanceof Tensor ? x.dtype : 'float32');\n if (y === undefined) {\n return [$x];\n }\n let $y = convertToTensor(y, 'y', 'meshgrid', y instanceof Tensor ? y.dtype : 'float32');\n const w = sizeFromShape($x.shape);\n const h = sizeFromShape($y.shape);\n if (indexing === 'xy') {\n $x = reshape($x, [1, -1]);\n $y = reshape($y, [-1, 1]);\n return [\n matMul(ones([h, 1], $x.dtype), $x),\n matMul($y, ones([1, w], $y.dtype)),\n ];\n }\n $x = reshape($x, [-1, 1]);\n $y = reshape($y, [1, -1]);\n return [\n matMul($x, ones([1, h], $x.dtype)),\n matMul(ones([w, 1], $y.dtype), $y),\n ];\n}\n//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibWVzaGdyaWQuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi8uLi90ZmpzLWNvcmUvc3JjL29wcy9tZXNoZ3JpZC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQTs7Ozs7Ozs7Ozs7Ozs7O0dBZUc7QUFFSCxPQUFPLEVBQUMsTUFBTSxFQUFDLE1BQU0sV0FBVyxDQUFDO0FBQ2pDLE9BQU8sRUFBQyxJQUFJLEVBQUMsTUFBTSxRQUFRLENBQUM7QUFDNUIsT0FBTyxFQUFDLE9BQU8sRUFBQyxNQUFNLFdBQVcsQ0FBQztBQUNsQyxPQUFPLEVBQUMsTUFBTSxFQUFDLE1BQU0sV0FBVyxDQUFDO0FBQ2pDLE9BQU8sRUFBQyxlQUFlLEVBQUMsTUFBTSxvQkFBb0IsQ0FBQztBQUVuRCxPQUFPLEVBQUMsYUFBYSxFQUFDLE1BQU0sY0FBYyxDQUFDO0FBRTNDOzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7R0E4Qkc7QUFDSCxNQUFNLFVBQVUsUUFBUSxDQUNwQixDQUFnQixFQUFFLENBQWdCLEVBQUUsRUFBQyxRQUFRLEdBQUcsSUFBSSxFQUFDLEdBQUcsRUFBRTtJQUM1RCxJQUFJLFFBQVEsS0FBSyxJQUFJLElBQUksUUFBUSxLQUFLLElBQUksRUFBRTtRQUMxQyxNQUFNLElBQUksU0FBUyxDQUNmLEdBQUcsUUFBUSw0Q0FBNEMsQ0FBQyxDQUFDO0tBQzlEO0lBQ0QsSUFBSSxDQUFDLEtBQUssU0FBUyxFQUFFO1FBQ25CLE9BQU8sRUFBRSxDQUFDO0tBQ1g7SUFDRCxJQUFJLEVBQUUsR0FBRyxlQUFlLENBQ3BCLENBQUMsRUFBRSxHQUFHLEVBQUUsVUFBVSxFQUFFLENBQUMsWUFBWSxNQUFNLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDLFNBQVMsQ0FBQyxDQUFDO0lBRW5FLElBQUksQ0FBQyxLQUFLLFNBQVMsRUFBRTtRQUNuQixPQUFPLENBQUMsRUFBRSxDQUFDLENBQUM7S0FDYjtJQUNELElBQUksRUFBRSxHQUFHLGVBQWUsQ0FDcEIsQ0FBQyxFQUFFLEdBQUcsRUFBRSxVQUFVLEVBQUUsQ0FBQyxZQUFZLE1BQU0sQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUMsU0FBUyxDQUFDLENBQUM7SUFFbkUsTUFBTSxDQUFDLEdBQUcsYUFBYSxDQUFDLEVBQUUsQ0FBQyxLQUFLLENBQUMsQ0FBQztJQUNsQyxNQUFNLENBQUMsR0FBRyxhQUFhLENBQUMsRUFBRSxDQUFDLEtBQUssQ0FBQyxDQUFDO0lBRWxDLElBQUksUUFBUSxLQUFLLElBQUksRUFBRTtRQUNyQixFQUFFLEdBQUcsT0FBTyxDQUFDLEVBQUUsRUFBRSxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxDQUFNLENBQUM7UUFDL0IsRUFBRSxHQUFHLE9BQU8sQ0FBQyxFQUFFLEVBQUUsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBTSxDQUFDO1FBQy9CLE9BQU87WUFDTCxNQUFNLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxFQUFFLEVBQUUsQ0FBQyxLQUFLLENBQUMsRUFBRSxFQUFFLENBQUM7WUFDbEMsTUFBTSxDQUFDLEVBQUUsRUFBRSxJQUFJLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLEVBQUUsRUFBRSxDQUFDLEtBQUssQ0FBQyxDQUFDO1NBQ25DLENBQUM7S0FDSDtJQUVELEVBQUUsR0FBRyxPQUFPLENBQUMsRUFBRSxFQUFFLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQU0sQ0FBQztJQUMvQixFQUFFLEdBQUcsT0FBTyxDQUFDLEVBQUUsRUFBRSxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxDQUFNLENBQUM7SUFDL0IsT0FBTztRQUNMLE1BQU0sQ0FBQyxFQUFFLEVBQUUsSUFBSSxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxFQUFFLEVBQUUsQ0FBQyxLQUFLLENBQUMsQ0FBQztRQUNsQyxNQUFNLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxFQUFFLEVBQUUsQ0FBQyxLQUFLLENBQUMsRUFBRSxFQUFFLENBQUM7S0FDbkMsQ0FBQztBQUNKLENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyIvKipcbiAqIEBsaWNlbnNlXG4gKiBDb3B5cmlnaHQgMjAyMSBHb29nbGUgTExDLiBBbGwgUmlnaHRzIFJlc2VydmVkLlxuICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlIFwiTGljZW5zZVwiKTtcbiAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS5cbiAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdFxuICpcbiAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMFxuICpcbiAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmVcbiAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuIFwiQVMgSVNcIiBCQVNJUyxcbiAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLlxuICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZFxuICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuXG4gKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuICovXG5cbmltcG9ydCB7bWF0TXVsfSBmcm9tICcuL21hdF9tdWwnO1xuaW1wb3J0IHtvbmVzfSBmcm9tICcuL29uZXMnO1xuaW1wb3J0IHtyZXNoYXBlfSBmcm9tICcuL3Jlc2hhcGUnO1xuaW1wb3J0IHtUZW5zb3J9IGZyb20gJy4uL3RlbnNvcic7XG5pbXBvcnQge2NvbnZlcnRUb1RlbnNvcn0gZnJvbSAnLi4vdGVuc29yX3V0aWxfZW52JztcbmltcG9ydCB7VGVuc29yTGlrZX0gZnJvbSAnLi4vdHlwZXMnO1xuaW1wb3J0IHtzaXplRnJvbVNoYXBlfSBmcm9tICcuLi91dGlsX2Jhc2UnO1xuXG4vKipcbiAqIEJyb2FkY2FzdHMgcGFyYW1ldGVycyBmb3IgZXZhbHVhdGlvbiBvbiBhbiBOLUQgZ3JpZC5cbiAqXG4gKiBHaXZlbiBOIG9uZS1kaW1lbnNpb25hbCBjb29yZGluYXRlIGFycmF5cyBgKmFyZ3NgLCByZXR1cm5zIGEgbGlzdCBgb3V0cHV0c2BcbiAqIG9mIE4tRCBjb29yZGluYXRlIGFycmF5cyBmb3IgZXZhbHVhdGluZyBleHByZXNzaW9ucyBvbiBhbiBOLUQgZ3JpZC5cbiAqXG4gKiBOb3RlczpcbiAqIGBtZXNoZ3JpZGAgc3VwcG9ydHMgY2FydGVzaWFuICgneHknKSBhbmQgbWF0cml4ICgnaWonKSBpbmRleGluZyBjb252ZW50aW9ucy5cbiAqIFdoZW4gdGhlIGBpbmRleGluZ2AgYXJndW1lbnQgaXMgc2V0IHRvICd4eScgKHRoZSBkZWZhdWx0KSwgdGhlIGJyb2FkY2FzdGluZ1xuICogaW5zdHJ1Y3Rpb25zIGZvciB0aGUgZmlyc3QgdHdvIGRpbWVuc2lvbnMgYXJlIHN3YXBwZWQuXG4gKiBFeGFtcGxlczpcbiAqIENhbGxpbmcgYGNvbnN0IFtYLCBZXSA9IG1lc2hncmlkKHgsIHkpYCB3aXRoIHRoZSB0ZW5zb3JzXG4gKlxuICogYGBgamF2YXNjcmlwdFxuICogY29uc3QgeCA9IFsxLCAyLCAzXTtcbiAqIGNvbnN0IHkgPSBbNCwgNSwgNl07XG4gKiBjb25zdCBbWCwgWV0gPSB0Zi5tZXNoZ3JpZCh4LCB5KTtcbiAqIC8vIFggPSBbWzEsIDIsIDNdLFxuICogLy8gICAgICBbMSwgMiwgM10sXG4gKiAvLyAgICAgIFsxLCAyLCAzXV1cbiAqIC8vIFkgPSBbWzQsIDQsIDRdLFxuICogLy8gICAgICBbNSwgNSwgNV0sXG4gKiAvLyAgICAgIFs2LCA2LCA2XV1cbiAqIGBgYFxuICpcbiAqIEBwYXJhbSB4IFRlbnNvciB3aXRoIHJhbmsgZ2VxIDEuXG4gKiBAcGFyYW0geSBUZW5zb3Igd2l0aCByYW5rIGdlcSAxLlxuICogQHBhcmFtIGluZGV4aW5nXG4gKlxuICogQGRvYyB7aGVhZGluZzogJ09wZXJhdGlvbnMnLCBzdWJoZWFkaW5nOiAnU2xpY2luZyBhbmQgSm9pbmluZyd9XG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBtZXNoZ3JpZDxUIGV4dGVuZHMgVGVuc29yPihcbiAgICB4PzogVHxUZW5zb3JMaWtlLCB5PzogVHxUZW5zb3JMaWtlLCB7aW5kZXhpbmcgPSAneHknfSA9IHt9KTogVFtdIHtcbiAgaWYgKGluZGV4aW5nICE9PSAneHknICYmIGluZGV4aW5nICE9PSAnaWonKSB7XG4gICAgdGhyb3cgbmV3IFR5cGVFcnJvcihcbiAgICAgICAgYCR7aW5kZXhpbmd9IGlzIG5vdCBhIHZhbGlkIHRoaXJkIGFyZ3VtZW50IHRvIG1lc2hncmlkYCk7XG4gIH1cbiAgaWYgKHggPT09IHVuZGVmaW5lZCkge1xuICAgIHJldHVybiBbXTtcbiAgfVxuICBsZXQgJHggPSBjb252ZXJ0VG9UZW5zb3IoXG4gICAgICB4LCAneCcsICdtZXNoZ3JpZCcsIHggaW5zdGFuY2VvZiBUZW5zb3IgPyB4LmR0eXBlIDogJ2Zsb2F0MzInKTtcblxuICBpZiAoeSA9PT0gdW5kZWZpbmVkKSB7XG4gICAgcmV0dXJuIFskeF07XG4gIH1cbiAgbGV0ICR5ID0gY29udmVydFRvVGVuc29yKFxuICAgICAgeSwgJ3knLCAnbWVzaGdyaWQnLCB5IGluc3RhbmNlb2YgVGVuc29yID8geS5kdHlwZSA6ICdmbG9hdDMyJyk7XG5cbiAgY29uc3QgdyA9IHNpemVGcm9tU2hhcGUoJHguc2hhcGUpO1xuICBjb25zdCBoID0gc2l6ZUZyb21TaGFwZSgkeS5zaGFwZSk7XG5cbiAgaWYgKGluZGV4aW5nID09PSAneHknKSB7XG4gICAgJHggPSByZXNoYXBlKCR4LCBbMSwgLTFdKSBhcyBUO1xuICAgICR5ID0gcmVzaGFwZSgkeSwgWy0xLCAxXSkgYXMgVDtcbiAgICByZXR1cm4gW1xuICAgICAgbWF0TXVsKG9uZXMoW2gsIDFdLCAkeC5kdHlwZSksICR4KSxcbiAgICAgIG1hdE11bCgkeSwgb25lcyhbMSwgd10sICR5LmR0eXBlKSksXG4gICAgXTtcbiAgfVxuXG4gICR4ID0gcmVzaGFwZSgkeCwgWy0xLCAxXSkgYXMgVDtcbiAgJHkgPSByZXNoYXBlKCR5LCBbMSwgLTFdKSBhcyBUO1xuICByZXR1cm4gW1xuICAgIG1hdE11bCgkeCwgb25lcyhbMSwgaF0sICR4LmR0eXBlKSksXG4gICAgbWF0TXVsKG9uZXMoW3csIDFdLCAkeS5kdHlwZSksICR5KSxcbiAgXTtcbn1cbiJdfQ==","/**\n * @license\n * Copyright 2020 Google LLC. All Rights Reserved.\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n * =============================================================================\n */\nimport { convertToTensor } from '../tensor_util_env';\nimport { parseAxisParam } from '../util';\nimport { expandShapeToKeepDim } from './axis_util';\nimport { cast } from './cast';\nimport { mean } from './mean';\nimport { op } from './operation';\nimport { reshape } from './reshape';\nimport { square } from './square';\nimport { sub } from './sub';\n/**\n * Calculates the mean and variance of `x`. The mean and variance are\n * calculated by aggregating the contents of `x` across `axes`. If `x` is\n * 1-D and `axes = [0]` this is just the mean and variance of a vector.\n *\n * @param x The input tensor.\n * @param axis The dimension(s) along with to compute mean and\n * variance. By default it reduces all dimensions.\n * @param keepDims If true, the moments have the same dimensionality as the\n * input.\n * @return An object with two keys: `mean` and `variance`.\n *\n * @doc {heading: 'Operations', subheading: 'Normalization'}\n */\nfunction moments_(x, axis = null, keepDims = false) {\n x = convertToTensor(x, 'x', 'moments');\n const axes = parseAxisParam(axis, x.shape);\n const xMean = mean(x, axes, keepDims);\n let keepDimsShape = xMean.shape;\n if (!keepDims) {\n keepDimsShape = expandShapeToKeepDim(xMean.shape, axes);\n }\n const devSquared = square(sub(cast(x, 'float32'), reshape(xMean, keepDimsShape)));\n const variance = mean(devSquared, axes, keepDims);\n return { mean: xMean, variance };\n}\nexport const moments = op({ moments_ });\n//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibW9tZW50cy5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uLy4uL3RmanMtY29yZS9zcmMvb3BzL21vbWVudHMudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUE7Ozs7Ozs7Ozs7Ozs7OztHQWVHO0FBR0gsT0FBTyxFQUFDLGVBQWUsRUFBQyxNQUFNLG9CQUFvQixDQUFDO0FBRW5ELE9BQU8sRUFBQyxjQUFjLEVBQUMsTUFBTSxTQUFTLENBQUM7QUFFdkMsT0FBTyxFQUFDLG9CQUFvQixFQUFDLE1BQU0sYUFBYSxDQUFDO0FBQ2pELE9BQU8sRUFBQyxJQUFJLEVBQUMsTUFBTSxRQUFRLENBQUM7QUFDNUIsT0FBTyxFQUFDLElBQUksRUFBQyxNQUFNLFFBQVEsQ0FBQztBQUM1QixPQUFPLEVBQUMsRUFBRSxFQUFDLE1BQU0sYUFBYSxDQUFDO0FBQy9CLE9BQU8sRUFBQyxPQUFPLEVBQUMsTUFBTSxXQUFXLENBQUM7QUFDbEMsT0FBTyxFQUFDLE1BQU0sRUFBQyxNQUFNLFVBQVUsQ0FBQztBQUNoQyxPQUFPLEVBQUMsR0FBRyxFQUFDLE1BQU0sT0FBTyxDQUFDO0FBRTFCOzs7Ozs7Ozs7Ozs7O0dBYUc7QUFDSCxTQUFTLFFBQVEsQ0FDYixDQUFvQixFQUFFLE9BQXdCLElBQUksRUFDbEQsUUFBUSxHQUFHLEtBQUs7SUFDbEIsQ0FBQyxHQUFHLGVBQWUsQ0FBQyxDQUFDLEVBQUUsR0FBRyxFQUFFLFNBQVMsQ0FBQyxDQUFDO0lBQ3ZDLE1BQU0sSUFBSSxHQUFHLGNBQWMsQ0FBQyxJQUFJLEVBQUUsQ0FBQyxDQUFDLEtBQUssQ0FBQyxDQUFDO0lBQzNDLE1BQU0sS0FBSyxHQUFHLElBQUksQ0FBQyxDQUFDLEVBQUUsSUFBSSxFQUFFLFFBQVEsQ0FBQyxDQUFDO0lBQ3RDLElBQUksYUFBYSxHQUFHLEtBQUssQ0FBQyxLQUFLLENBQUM7SUFDaEMsSUFBSSxDQUFDLFFBQVEsRUFBRTtRQUNiLGFBQWEsR0FBRyxvQkFBb0IsQ0FBQyxLQUFLLENBQUMsS0FBSyxFQUFFLElBQUksQ0FBQyxDQUFDO0tBQ3pEO0lBQ0QsTUFBTSxVQUFVLEdBQ1osTUFBTSxDQUFDLEdBQUcsQ0FBQyxJQUFJLENBQUMsQ0FBQyxFQUFFLFNBQVMsQ0FBQyxFQUFFLE9BQU8sQ0FBQyxLQUFLLEVBQUUsYUFBYSxDQUFDLENBQUMsQ0FBQyxDQUFDO0lBQ25FLE1BQU0sUUFBUSxHQUFHLElBQUksQ0FBQyxVQUFVLEVBQUUsSUFBSSxFQUFFLFFBQVEsQ0FBQyxDQUFDO0lBQ2xELE9BQU8sRUFBQyxJQUFJLEVBQUUsS0FBSyxFQUFFLFFBQVEsRUFBQyxDQUFDO0FBQ2pDLENBQUM7QUFFRCxNQUFNLENBQUMsTUFBTSxPQUFPLEdBQUcsRUFBRSxDQUFDLEVBQUMsUUFBUSxFQUFDLENBQUMsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbIi8qKlxuICogQGxpY2Vuc2VcbiAqIENvcHlyaWdodCAyMDIwIEdvb2dsZSBMTEMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuXG4gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgXCJMaWNlbnNlXCIpO1xuICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLlxuICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0XG4gKlxuICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wXG4gKlxuICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZVxuICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gXCJBUyBJU1wiIEJBU0lTLFxuICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuXG4gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kXG4gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS5cbiAqID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4gKi9cblxuaW1wb3J0IHtUZW5zb3J9IGZyb20gJy4uL3RlbnNvcic7XG5pbXBvcnQge2NvbnZlcnRUb1RlbnNvcn0gZnJvbSAnLi4vdGVuc29yX3V0aWxfZW52JztcbmltcG9ydCB7VGVuc29yTGlrZX0gZnJvbSAnLi4vdHlwZXMnO1xuaW1wb3J0IHtwYXJzZUF4aXNQYXJhbX0gZnJvbSAnLi4vdXRpbCc7XG5cbmltcG9ydCB7ZXhwYW5kU2hhcGVUb0tlZXBEaW19IGZyb20gJy4vYXhpc191dGlsJztcbmltcG9ydCB7Y2FzdH0gZnJvbSAnLi9jYXN0JztcbmltcG9ydCB7bWVhbn0gZnJvbSAnLi9tZWFuJztcbmltcG9ydCB7b3B9IGZyb20gJy4vb3BlcmF0aW9uJztcbmltcG9ydCB7cmVzaGFwZX0gZnJvbSAnLi9yZXNoYXBlJztcbmltcG9ydCB7c3F1YXJlfSBmcm9tICcuL3NxdWFyZSc7XG5pbXBvcnQge3N1Yn0gZnJvbSAnLi9zdWInO1xuXG4vKipcbiAqIENhbGN1bGF0ZXMgdGhlIG1lYW4gYW5kIHZhcmlhbmNlIG9mIGB4YC4gVGhlIG1lYW4gYW5kIHZhcmlhbmNlIGFyZVxuICogY2FsY3VsYXRlZCBieSBhZ2dyZWdhdGluZyB0aGUgY29udGVudHMgb2YgYHhgIGFjcm9zcyBgYXhlc2AuIElmIGB4YCBpc1xuICogMS1EIGFuZCBgYXhlcyA9IFswXWAgdGhpcyBpcyBqdXN0IHRoZSBtZWFuIGFuZCB2YXJpYW5jZSBvZiBhIHZlY3Rvci5cbiAqXG4gKiBAcGFyYW0geCBUaGUgaW5wdXQgdGVuc29yLlxuICogQHBhcmFtIGF4aXMgVGhlIGRpbWVuc2lvbihzKSBhbG9uZyB3aXRoIHRvIGNvbXB1dGUgbWVhbiBhbmRcbiAqICAgICB2YXJpYW5jZS4gQnkgZGVmYXVsdCBpdCByZWR1Y2VzIGFsbCBkaW1lbnNpb25zLlxuICogQHBhcmFtIGtlZXBEaW1zIElmIHRydWUsIHRoZSBtb21lbnRzIGhhdmUgdGhlIHNhbWUgZGltZW5zaW9uYWxpdHkgYXMgdGhlXG4gKiAgICAgaW5wdXQuXG4gKiBAcmV0dXJuIEFuIG9iamVjdCB3aXRoIHR3byBrZXlzOiBgbWVhbmAgYW5kIGB2YXJpYW5jZWAuXG4gKlxuICogQGRvYyB7aGVhZGluZzogJ09wZXJhdGlvbnMnLCBzdWJoZWFkaW5nOiAnTm9ybWFsaXphdGlvbid9XG4gKi9cbmZ1bmN0aW9uIG1vbWVudHNfKFxuICAgIHg6IFRlbnNvcnxUZW5zb3JMaWtlLCBheGlzOiBudW1iZXJ8bnVtYmVyW10gPSBudWxsLFxuICAgIGtlZXBEaW1zID0gZmFsc2UpOiB7bWVhbjogVGVuc29yLCB2YXJpYW5jZTogVGVuc29yfSB7XG4gIHggPSBjb252ZXJ0VG9UZW5zb3IoeCwgJ3gnLCAnbW9tZW50cycpO1xuICBjb25zdCBheGVzID0gcGFyc2VBeGlzUGFyYW0oYXhpcywgeC5zaGFwZSk7XG4gIGNvbnN0IHhNZWFuID0gbWVhbih4LCBheGVzLCBrZWVwRGltcyk7XG4gIGxldCBrZWVwRGltc1NoYXBlID0geE1lYW4uc2hhcGU7XG4gIGlmICgha2VlcERpbXMpIHtcbiAgICBrZWVwRGltc1NoYXBlID0gZXhwYW5kU2hhcGVUb0tlZXBEaW0oeE1lYW4uc2hhcGUsIGF4ZXMpO1xuICB9XG4gIGNvbnN0IGRldlNxdWFyZWQgPVxuICAgICAgc3F1YXJlKHN1YihjYXN0KHgsICdmbG9hdDMyJyksIHJlc2hhcGUoeE1lYW4sIGtlZXBEaW1zU2hhcGUpKSk7XG4gIGNvbnN0IHZhcmlhbmNlID0gbWVhbihkZXZTcXVhcmVkLCBheGVzLCBrZWVwRGltcyk7XG4gIHJldHVybiB7bWVhbjogeE1lYW4sIHZhcmlhbmNlfTtcbn1cblxuZXhwb3J0IGNvbnN0IG1vbWVudHMgPSBvcCh7bW9tZW50c199KTtcbiJdfQ==","import { convertToTensor, convertToTensorArray } from '../tensor_util_env';\nimport { op } from './operation';\n/**\n * Computes the next states and outputs of a stack of LSTMCells.\n *\n * Each cell output is used as input to the next cell.\n *\n * Returns `[cellState, cellOutput]`.\n *\n * Derived from tf.contrib.rn.MultiRNNCell.\n *\n * @param lstmCells Array of LSTMCell functions.\n * @param data The input to the cell.\n * @param c Array of previous cell states.\n * @param h Array of previous cell outputs.\n *\n * @doc {heading: 'Operations', subheading: 'RNN'}\n */\nfunction multiRNNCell_(lstmCells, data, c, h) {\n const $data = convertToTensor(data, 'data', 'multiRNNCell');\n const $c = convertToTensorArray(c, 'c', 'multiRNNCell');\n const $h = convertToTensorArray(h, 'h', 'multiRNNCell');\n let input = $data;\n const newStates = [];\n for (let i = 0; i < lstmCells.length; i++) {\n const output = lstmCells[i](input, $c[i], $h[i]);\n newStates.push(output[0]);\n newStates.push(output[1]);\n input = output[1];\n }\n const newC = [];\n const newH = [];\n for (let i = 0; i < newStates.length; i += 2) {\n newC.push(newStates[i]);\n newH.push(newStates[i + 1]);\n }\n return [newC, newH];\n}\nexport const multiRNNCell = op({ multiRNNCell_ });\n//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibXVsdGlfcm5uX2NlbGwuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi8uLi90ZmpzLWNvcmUvc3JjL29wcy9tdWx0aV9ybm5fY2VsbC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFpQkEsT0FBTyxFQUFDLGVBQWUsRUFBRSxvQkFBb0IsRUFBQyxNQUFNLG9CQUFvQixDQUFDO0FBRXpFLE9BQU8sRUFBQyxFQUFFLEVBQUMsTUFBTSxhQUFhLENBQUM7QUFTL0I7Ozs7Ozs7Ozs7Ozs7OztHQWVHO0FBQ0gsU0FBUyxhQUFhLENBQ2xCLFNBQXlCLEVBQUUsSUFBeUIsRUFDcEQsQ0FBNkIsRUFDN0IsQ0FBNkI7SUFDL0IsTUFBTSxLQUFLLEdBQUcsZUFBZSxDQUFDLElBQUksRUFBRSxNQUFNLEVBQUUsY0FBYyxDQUFDLENBQUM7SUFDNUQsTUFBTSxFQUFFLEdBQUcsb0JBQW9CLENBQUMsQ0FBQyxFQUFFLEdBQUcsRUFBRSxjQUFjLENBQUMsQ0FBQztJQUN4RCxNQUFNLEVBQUUsR0FBRyxvQkFBb0IsQ0FBQyxDQUFDLEVBQUUsR0FBRyxFQUFFLGNBQWMsQ0FBQyxDQUFDO0lBRXhELElBQUksS0FBSyxHQUFHLEtBQUssQ0FBQztJQUNsQixNQUFNLFNBQVMsR0FBRyxFQUFFLENBQUM7SUFDckIsS0FBSyxJQUFJLENBQUMsR0FBRyxDQUFDLEVBQUUsQ0FBQyxHQUFHLFNBQVMsQ0FBQyxNQUFNLEVBQUUsQ0FBQyxFQUFFLEVBQUU7UUFDekMsTUFBTSxNQUFNLEdBQUcsU0FBUyxDQUFDLENBQUMsQ0FBQyxDQUFDLEtBQUssRUFBRSxFQUFFLENBQUMsQ0FBQyxDQUFDLEVBQUUsRUFBRSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUM7UUFDakQsU0FBUyxDQUFDLElBQUksQ0FBQyxNQUFNLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQztRQUMxQixTQUFTLENBQUMsSUFBSSxDQUFDLE1BQU0sQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDO1FBQzFCLEtBQUssR0FBRyxNQUFNLENBQUMsQ0FBQyxDQUFDLENBQUM7S0FDbkI7SUFDRCxNQUFNLElBQUksR0FBZSxFQUFFLENBQUM7SUFDNUIsTUFBTSxJQUFJLEdBQWUsRUFBRSxDQUFDO0lBQzVCLEtBQUssSUFBSSxDQUFDLEdBQUcsQ0FBQyxFQUFFLENBQUMsR0FBRyxTQUFTLENBQUMsTUFBTSxFQUFFLENBQUMsSUFBSSxDQUFDLEVBQUU7UUFDNUMsSUFBSSxDQUFDLElBQUksQ0FBQyxTQUFTLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQztRQUN4QixJQUFJLENBQUMsSUFBSSxDQUFDLFNBQVMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQztLQUM3QjtJQUNELE9BQU8sQ0FBQyxJQUFJLEVBQUUsSUFBSSxDQUFDLENBQUM7QUFDdEIsQ0FBQztBQUNELE1BQU0sQ0FBQyxNQUFNLFlBQVksR0FBRyxFQUFFLENBQUMsRUFBQyxhQUFhLEVBQUMsQ0FBQyxDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiLyoqXG4gKiBAbGljZW5zZVxuICogQ29weXJpZ2h0IDIwMjAgR29vZ2xlIExMQy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC5cbiAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSBcIkxpY2Vuc2VcIik7XG4gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuXG4gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXRcbiAqXG4gKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjBcbiAqXG4gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlXG4gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiBcIkFTIElTXCIgQkFTSVMsXG4gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC5cbiAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmRcbiAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLlxuICogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbiAqL1xuaW1wb3J0IHtUZW5zb3IyRH0gZnJvbSAnLi4vdGVuc29yJztcbmltcG9ydCB7Y29udmVydFRvVGVuc29yLCBjb252ZXJ0VG9UZW5zb3JBcnJheX0gZnJvbSAnLi4vdGVuc29yX3V0aWxfZW52JztcbmltcG9ydCB7VGVuc29yTGlrZX0gZnJvbSAnLi4vdHlwZXMnO1xuaW1wb3J0IHtvcH0gZnJvbSAnLi9vcGVyYXRpb24nO1xuXG4vKipcbiAqIEBkb2NhbGlhcyAoZGF0YTogVGVuc29yMkQsIGM6IFRlbnNvcjJELCBoOiBUZW5zb3IyRCk6IFtUZW5zb3IyRCwgVGVuc29yMkRdXG4gKi9cbmV4cG9ydCB0eXBlIExTVE1DZWxsRnVuYyA9IHtcbiAgKGRhdGE6IFRlbnNvcjJELCBjOiBUZW5zb3IyRCwgaDogVGVuc29yMkQpOiBbVGVuc29yMkQsIFRlbnNvcjJEXTtcbn07XG5cbi8qKlxuICogQ29tcHV0ZXMgdGhlIG5leHQgc3RhdGVzIGFuZCBvdXRwdXRzIG9mIGEgc3RhY2sgb2YgTFNUTUNlbGxzLlxuICpcbiAqIEVhY2ggY2VsbCBvdXRwdXQgaXMgdXNlZCBhcyBpbnB1dCB0byB0aGUgbmV4dCBjZWxsLlxuICpcbiAqIFJldHVybnMgYFtjZWxsU3RhdGUsIGNlbGxPdXRwdXRdYC5cbiAqXG4gKiBEZXJpdmVkIGZyb20gdGYuY29udHJpYi5ybi5NdWx0aVJOTkNlbGwuXG4gKlxuICogQHBhcmFtIGxzdG1DZWxscyBBcnJheSBvZiBMU1RNQ2VsbCBmdW5jdGlvbnMuXG4gKiBAcGFyYW0gZGF0YSBUaGUgaW5wdXQgdG8gdGhlIGNlbGwuXG4gKiBAcGFyYW0gYyBBcnJheSBvZiBwcmV2aW91cyBjZWxsIHN0YXRlcy5cbiAqIEBwYXJhbSBoIEFycmF5IG9mIHByZXZpb3VzIGNlbGwgb3V0cHV0cy5cbiAqXG4gKiBAZG9jIHtoZWFkaW5nOiAnT3BlcmF0aW9ucycsIHN1YmhlYWRpbmc6ICdSTk4nfVxuICovXG5mdW5jdGlvbiBtdWx0aVJOTkNlbGxfKFxuICAgIGxzdG1DZWxsczogTFNUTUNlbGxGdW5jW10sIGRhdGE6IFRlbnNvcjJEfFRlbnNvckxpa2UsXG4gICAgYzogQXJyYXk8VGVuc29yMkR8VGVuc29yTGlrZT4sXG4gICAgaDogQXJyYXk8VGVuc29yMkR8VGVuc29yTGlrZT4pOiBbVGVuc29yMkRbXSwgVGVuc29yMkRbXV0ge1xuICBjb25zdCAkZGF0YSA9IGNvbnZlcnRUb1RlbnNvcihkYXRhLCAnZGF0YScsICdtdWx0aVJOTkNlbGwnKTtcbiAgY29uc3QgJGMgPSBjb252ZXJ0VG9UZW5zb3JBcnJheShjLCAnYycsICdtdWx0aVJOTkNlbGwnKTtcbiAgY29uc3QgJGggPSBjb252ZXJ0VG9UZW5zb3JBcnJheShoLCAnaCcsICdtdWx0aVJOTkNlbGwnKTtcblxuICBsZXQgaW5wdXQgPSAkZGF0YTtcbiAgY29uc3QgbmV3U3RhdGVzID0gW107XG4gIGZvciAobGV0IGkgPSAwOyBpIDwgbHN0bUNlbGxzLmxlbmd0aDsgaSsrKSB7XG4gICAgY29uc3Qgb3V0cHV0ID0gbHN0bUNlbGxzW2ldKGlucHV0LCAkY1tpXSwgJGhbaV0pO1xuICAgIG5ld1N0YXRlcy5wdXNoKG91dHB1dFswXSk7XG4gICAgbmV3U3RhdGVzLnB1c2gob3V0cHV0WzFdKTtcbiAgICBpbnB1dCA9IG91dHB1dFsxXTtcbiAgfVxuICBjb25zdCBuZXdDOiBUZW5zb3IyRFtdID0gW107XG4gIGNvbnN0IG5ld0g6IFRlbnNvcjJEW10gPSBbXTtcbiAgZm9yIChsZXQgaSA9IDA7IGkgPCBuZXdTdGF0ZXMubGVuZ3RoOyBpICs9IDIpIHtcbiAgICBuZXdDLnB1c2gobmV3U3RhdGVzW2ldKTtcbiAgICBuZXdILnB1c2gobmV3U3RhdGVzW2kgKyAxXSk7XG4gIH1cbiAgcmV0dXJuIFtuZXdDLCBuZXdIXTtcbn1cbmV4cG9ydCBjb25zdCBtdWx0aVJOTkNlbGwgPSBvcCh7bXVsdGlSTk5DZWxsX30pO1xuIl19","/**\n * @license\n * Copyright 2020 Google LLC. All Rights Reserved.\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n * =============================================================================\n */\nimport { ENGINE } from '../engine';\nimport { Multinomial } from '../kernel_names';\nimport { convertToTensor } from '../tensor_util_env';\nimport { op } from './operation';\nimport { reshape } from './reshape';\n/**\n * Creates a `tf.Tensor` with values drawn from a multinomial distribution.\n *\n * ```js\n * const probs = tf.tensor([.75, .25]);\n * tf.multinomial(probs, 3).print();\n * ```\n *\n * @param logits 1D array with unnormalized log-probabilities, or\n * 2D array of shape `[batchSize, numOutcomes]`. See the `normalized`\n * parameter.\n * @param numSamples Number of samples to draw for each row slice.\n * @param seed The seed number.\n * @param normalized Whether the provided `logits` are normalized true\n * probabilities (sum to 1). Defaults to false.\n * @return 1D array of shape `[numSamples]`, or 2D array of shape\n * `[batchSize, numSamples]`, depending on the rank of the input.\n *\n * @doc {heading: 'Tensors', subheading: 'Random'}\n */\nfunction multinomial_(logits, numSamples, seed, normalized = false) {\n const $logits = convertToTensor(logits, 'logits', 'multinomial');\n const numOutcomes = $logits.size;\n const origRank = $logits.rank;\n if (numOutcomes < 2) {\n throw new Error(`Error in multinomial: you need at least 2 outcomes, but got ` +\n `${numOutcomes}.`);\n }\n if (origRank > 2) {\n throw new Error(`Rank of probabilities must be 1 or 2, but is ${origRank}`);\n }\n // TODO(lina128): Investigate correct seed behavior. The code seems not allow\n // setting see to 0.\n seed = seed || Math.random();\n // The kernel only accepts (and returns) rank 2 tensors.\n const logits2D = origRank === 1 ? reshape($logits, [1, -1]) : $logits;\n const inputs = { logits: logits2D };\n const attrs = { numSamples, seed, normalized };\n // tslint:disable-next-line: no-unnecessary-type-assertion\n const res = ENGINE.runKernel(Multinomial, inputs, attrs);\n // tslint:disable-next-line:no-unnecessary-type-assertion\n return origRank === 1 ? reshape(res, [res.size]) : res;\n}\nexport const multinomial = op({ multinomial_ });\n//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibXVsdGlub21pYWwuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi8uLi90ZmpzLWNvcmUvc3JjL29wcy9tdWx0aW5vbWlhbC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQTs7Ozs7Ozs7Ozs7Ozs7O0dBZUc7QUFFSCxPQUFPLEVBQUMsTUFBTSxFQUFDLE1BQU0sV0FBVyxDQUFDO0FBQ2pDLE9BQU8sRUFBQyxXQUFXLEVBQXNDLE1BQU0saUJBQWlCLENBQUM7QUFJakYsT0FBTyxFQUFDLGVBQWUsRUFBQyxNQUFNLG9CQUFvQixDQUFDO0FBR25ELE9BQU8sRUFBQyxFQUFFLEVBQUMsTUFBTSxhQUFhLENBQUM7QUFDL0IsT0FBTyxFQUFDLE9BQU8sRUFBQyxNQUFNLFdBQVcsQ0FBQztBQUVsQzs7Ozs7Ozs7Ozs7Ozs7Ozs7OztHQW1CRztBQUNILFNBQVMsWUFBWSxDQUNqQixNQUFvQyxFQUFFLFVBQWtCLEVBQUUsSUFBYSxFQUN2RSxVQUFVLEdBQUcsS0FBSztJQUNwQixNQUFNLE9BQU8sR0FBRyxlQUFlLENBQUMsTUFBTSxFQUFFLFFBQVEsRUFBRSxhQUFhLENBQUMsQ0FBQztJQUNqRSxNQUFNLFdBQVcsR0FBRyxPQUFPLENBQUMsSUFBSSxDQUFDO0lBQ2pDLE1BQU0sUUFBUSxHQUFHLE9BQU8sQ0FBQyxJQUFJLENBQUM7SUFDOUIsSUFBSSxXQUFXLEdBQUcsQ0FBQyxFQUFFO1FBQ25CLE1BQU0sSUFBSSxLQUFLLENBQ1gsOERBQThEO1lBQzlELEdBQUcsV0FBVyxHQUFHLENBQUMsQ0FBQztLQUN4QjtJQUNELElBQUksUUFBUSxHQUFHLENBQUMsRUFBRTtRQUNoQixNQUFNLElBQUksS0FBSyxDQUFDLGdEQUFnRCxRQUFRLEVBQUUsQ0FBQyxDQUFDO0tBQzdFO0lBQ0QsNkVBQTZFO0lBQzdFLG9CQUFvQjtJQUNwQixJQUFJLEdBQUcsSUFBSSxJQUFJLElBQUksQ0FBQyxNQUFNLEVBQUUsQ0FBQztJQUU3Qix3REFBd0Q7SUFDeEQsTUFBTSxRQUFRLEdBQ1YsUUFBUSxLQUFLLENBQUMsQ0FBQyxDQUFDLENBQUMsT0FBTyxDQUFDLE9BQU8sRUFBRSxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLE9BQW1CLENBQUM7SUFFckUsTUFBTSxNQUFNLEdBQXNCLEVBQUMsTUFBTSxFQUFFLFFBQVEsRUFBQyxDQUFDO0lBQ3JELE1BQU0sS0FBSyxHQUFxQixFQUFDLFVBQVUsRUFBRSxJQUFJLEVBQUUsVUFBVSxFQUFDLENBQUM7SUFFL0QsMERBQTBEO0lBQzFELE1BQU0sR0FBRyxHQUFHLE1BQU0sQ0FBQyxTQUFTLENBQ1osV0FBVyxFQUFFLE1BQThCLEVBQzNDLEtBQTJCLENBQWEsQ0FBQztJQUV6RCx5REFBeUQ7SUFDekQsT0FBTyxRQUFRLEtBQUssQ0FBQyxDQUFDLENBQUMsQ0FBQyxPQUFPLENBQUMsR0FBRyxFQUFFLENBQUMsR0FBRyxDQUFDLElBQUksQ0FBQyxDQUFhLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQztBQUNyRSxDQUFDO0FBRUQsTUFBTSxDQUFDLE1BQU0sV0FBVyxHQUFHLEVBQUUsQ0FBQyxFQUFDLFlBQVksRUFBQyxDQUFDLENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyIvKipcbiAqIEBsaWNlbnNlXG4gKiBDb3B5cmlnaHQgMjAyMCBHb29nbGUgTExDLiBBbGwgUmlnaHRzIFJlc2VydmVkLlxuICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlIFwiTGljZW5zZVwiKTtcbiAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS5cbiAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdFxuICpcbiAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMFxuICpcbiAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmVcbiAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuIFwiQVMgSVNcIiBCQVNJUyxcbiAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLlxuICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZFxuICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuXG4gKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuICovXG5cbmltcG9ydCB7RU5HSU5FfSBmcm9tICcuLi9lbmdpbmUnO1xuaW1wb3J0IHtNdWx0aW5vbWlhbCwgTXVsdGlub21pYWxBdHRycywgTXVsdGlub21pYWxJbnB1dHN9IGZyb20gJy4uL2tlcm5lbF9uYW1lcyc7XG5pbXBvcnQge05hbWVkQXR0ck1hcH0gZnJvbSAnLi4va2VybmVsX3JlZ2lzdHJ5JztcbmltcG9ydCB7VGVuc29yMUQsIFRlbnNvcjJEfSBmcm9tICcuLi90ZW5zb3InO1xuaW1wb3J0IHtOYW1lZFRlbnNvck1hcH0gZnJvbSAnLi4vdGVuc29yX3R5cGVzJztcbmltcG9ydCB7Y29udmVydFRvVGVuc29yfSBmcm9tICcuLi90ZW5zb3JfdXRpbF9lbnYnO1xuaW1wb3J0IHtUZW5zb3JMaWtlfSBmcm9tICcuLi90eXBlcyc7XG5cbmltcG9ydCB7b3B9IGZyb20gJy4vb3BlcmF0aW9uJztcbmltcG9ydCB7cmVzaGFwZX0gZnJvbSAnLi9yZXNoYXBlJztcblxuLyoqXG4gKiBDcmVhdGVzIGEgYHRmLlRlbnNvcmAgd2l0aCB2YWx1ZXMgZHJhd24gZnJvbSBhIG11bHRpbm9taWFsIGRpc3RyaWJ1dGlvbi5cbiAqXG4gKiBgYGBqc1xuICogY29uc3QgcHJvYnMgPSB0Zi50ZW5zb3IoWy43NSwgLjI1XSk7XG4gKiB0Zi5tdWx0aW5vbWlhbChwcm9icywgMykucHJpbnQoKTtcbiAqIGBgYFxuICpcbiAqIEBwYXJhbSBsb2dpdHMgMUQgYXJyYXkgd2l0aCB1bm5vcm1hbGl6ZWQgbG9nLXByb2JhYmlsaXRpZXMsIG9yXG4gKiAgICAgMkQgYXJyYXkgb2Ygc2hhcGUgYFtiYXRjaFNpemUsIG51bU91dGNvbWVzXWAuIFNlZSB0aGUgYG5vcm1hbGl6ZWRgXG4gKiAgICAgcGFyYW1ldGVyLlxuICogQHBhcmFtIG51bVNhbXBsZXMgTnVtYmVyIG9mIHNhbXBsZXMgdG8gZHJhdyBmb3IgZWFjaCByb3cgc2xpY2UuXG4gKiBAcGFyYW0gc2VlZCBUaGUgc2VlZCBudW1iZXIuXG4gKiBAcGFyYW0gbm9ybWFsaXplZCBXaGV0aGVyIHRoZSBwcm92aWRlZCBgbG9naXRzYCBhcmUgbm9ybWFsaXplZCB0cnVlXG4gKiAgICAgcHJvYmFiaWxpdGllcyAoc3VtIHRvIDEpLiBEZWZhdWx0cyB0byBmYWxzZS5cbiAqIEByZXR1cm4gMUQgYXJyYXkgb2Ygc2hhcGUgYFtudW1TYW1wbGVzXWAsIG9yIDJEIGFycmF5IG9mIHNoYXBlXG4gKiAgICAgYFtiYXRjaFNpemUsIG51bVNhbXBsZXNdYCwgZGVwZW5kaW5nIG9uIHRoZSByYW5rIG9mIHRoZSBpbnB1dC5cbiAqXG4gKiBAZG9jIHtoZWFkaW5nOiAnVGVuc29ycycsIHN1YmhlYWRpbmc6ICdSYW5kb20nfVxuICovXG5mdW5jdGlvbiBtdWx0aW5vbWlhbF8oXG4gICAgbG9naXRzOiBUZW5zb3IxRHxUZW5zb3IyRHxUZW5zb3JMaWtlLCBudW1TYW1wbGVzOiBudW1iZXIsIHNlZWQ/OiBudW1iZXIsXG4gICAgbm9ybWFsaXplZCA9IGZhbHNlKTogVGVuc29yMUR8VGVuc29yMkQge1xuICBjb25zdCAkbG9naXRzID0gY29udmVydFRvVGVuc29yKGxvZ2l0cywgJ2xvZ2l0cycsICdtdWx0aW5vbWlhbCcpO1xuICBjb25zdCBudW1PdXRjb21lcyA9ICRsb2dpdHMuc2l6ZTtcbiAgY29uc3Qgb3JpZ1JhbmsgPSAkbG9naXRzLnJhbms7XG4gIGlmIChudW1PdXRjb21lcyA8IDIpIHtcbiAgICB0aHJvdyBuZXcgRXJyb3IoXG4gICAgICAgIGBFcnJvciBpbiBtdWx0aW5vbWlhbDogeW91IG5lZWQgYXQgbGVhc3QgMiBvdXRjb21lcywgYnV0IGdvdCBgICtcbiAgICAgICAgYCR7bnVtT3V0Y29tZXN9LmApO1xuICB9XG4gIGlmIChvcmlnUmFuayA+IDIpIHtcbiAgICB0aHJvdyBuZXcgRXJyb3IoYFJhbmsgb2YgcHJvYmFiaWxpdGllcyBtdXN0IGJlIDEgb3IgMiwgYnV0IGlzICR7b3JpZ1Jhbmt9YCk7XG4gIH1cbiAgLy8gVE9ETyhsaW5hMTI4KTogSW52ZXN0aWdhdGUgY29ycmVjdCBzZWVkIGJlaGF2aW9yLiBUaGUgY29kZSBzZWVtcyBub3QgYWxsb3dcbiAgLy8gc2V0dGluZyBzZWUgdG8gMC5cbiAgc2VlZCA9IHNlZWQgfHwgTWF0aC5yYW5kb20oKTtcblxuICAvLyBUaGUga2VybmVsIG9ubHkgYWNjZXB0cyAoYW5kIHJldHVybnMpIHJhbmsgMiB0ZW5zb3JzLlxuICBjb25zdCBsb2dpdHMyRDogVGVuc29yMkQgPVxuICAgICAgb3JpZ1JhbmsgPT09IDEgPyByZXNoYXBlKCRsb2dpdHMsIFsxLCAtMV0pIDogJGxvZ2l0cyBhcyBUZW5zb3IyRDtcblxuICBjb25zdCBpbnB1dHM6IE11bHRpbm9taWFsSW5wdXRzID0ge2xvZ2l0czogbG9naXRzMkR9O1xuICBjb25zdCBhdHRyczogTXVsdGlub21pYWxBdHRycyA9IHtudW1TYW1wbGVzLCBzZWVkLCBub3JtYWxpemVkfTtcblxuICAvLyB0c2xpbnQ6ZGlzYWJsZS1uZXh0LWxpbmU6IG5vLXVubmVjZXNzYXJ5LXR5cGUtYXNzZXJ0aW9uXG4gIGNvbnN0IHJlcyA9IEVOR0lORS5ydW5LZXJuZWwoXG4gICAgICAgICAgICAgICAgICBNdWx0aW5vbWlhbCwgaW5wdXRzIGFzIHt9IGFzIE5hbWVkVGVuc29yTWFwLFxuICAgICAgICAgICAgICAgICAgYXR0cnMgYXMge30gYXMgTmFtZWRBdHRyTWFwKSBhcyBUZW5zb3IyRDtcblxuICAvLyB0c2xpbnQ6ZGlzYWJsZS1uZXh0LWxpbmU6bm8tdW5uZWNlc3NhcnktdHlwZS1hc3NlcnRpb25cbiAgcmV0dXJuIG9yaWdSYW5rID09PSAxID8gcmVzaGFwZShyZXMsIFtyZXMuc2l6ZV0pIGFzIFRlbnNvcjFEIDogcmVzO1xufVxuXG5leHBvcnQgY29uc3QgbXVsdGlub21pYWwgPSBvcCh7bXVsdGlub21pYWxffSk7XG4iXX0=","import { convertToTensor } from '../tensor_util_env';\nimport * as util from '../util';\nimport { matMul } from './mat_mul';\nimport { op } from './operation';\nimport { reshape } from './reshape';\n/**\n * Computes the outer product of two vectors, `v1` and `v2`.\n *\n * ```js\n * const a = tf.tensor1d([1, 2, 3]);\n * const b = tf.tensor1d([3, 4, 5]);\n *\n * tf.outerProduct(a, b).print();\n * ```\n * @param v1 The first vector in the outer product operation.\n * @param v2 The second vector in the outer product operation.\n *\n * @doc {heading: 'Operations', subheading: 'Matrices'}\n */\nfunction outerProduct_(v1, v2) {\n const $v1 = convertToTensor(v1, 'v1', 'outerProduct');\n const $v2 = convertToTensor(v2, 'v2', 'outerProduct');\n util.assert($v1.rank === 1 && $v2.rank === 1, () => `Error in outerProduct: inputs must be rank 1, but got ranks ` +\n `${$v1.rank} and ${$v2.rank}.`);\n const v12D = reshape($v1, [-1, 1]);\n const v22D = reshape($v2, [1, -1]);\n return matMul(v12D, v22D);\n}\nexport const outerProduct = op({ outerProduct_ });\n//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoib3V0ZXJfcHJvZHVjdC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uLy4uL3RmanMtY29yZS9zcmMvb3BzL291dGVyX3Byb2R1Y3QudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBaUJBLE9BQU8sRUFBQyxlQUFlLEVBQUMsTUFBTSxvQkFBb0IsQ0FBQztBQUVuRCxPQUFPLEtBQUssSUFBSSxNQUFNLFNBQVMsQ0FBQztBQUVoQyxPQUFPLEVBQUMsTUFBTSxFQUFDLE1BQU0sV0FBVyxDQUFDO0FBQ2pDLE9BQU8sRUFBQyxFQUFFLEVBQUMsTUFBTSxhQUFhLENBQUM7QUFDL0IsT0FBTyxFQUFDLE9BQU8sRUFBQyxNQUFNLFdBQVcsQ0FBQztBQUVsQzs7Ozs7Ozs7Ozs7OztHQWFHO0FBQ0gsU0FBUyxhQUFhLENBQ2xCLEVBQXVCLEVBQUUsRUFBdUI7SUFDbEQsTUFBTSxHQUFHLEdBQUcsZUFBZSxDQUFDLEVBQUUsRUFBRSxJQUFJLEVBQUUsY0FBYyxDQUFDLENBQUM7SUFDdEQsTUFBTSxHQUFHLEdBQUcsZUFBZSxDQUFDLEVBQUUsRUFBRSxJQUFJLEVBQUUsY0FBYyxDQUFDLENBQUM7SUFFdEQsSUFBSSxDQUFDLE1BQU0sQ0FDUCxHQUFHLENBQUMsSUFBSSxLQUFLLENBQUMsSUFBSSxHQUFHLENBQUMsSUFBSSxLQUFLLENBQUMsRUFDaEMsR0FBRyxFQUFFLENBQUMsOERBQThEO1FBQ2hFLEdBQUcsR0FBRyxDQUFDLElBQUksUUFBUSxHQUFHLENBQUMsSUFBSSxHQUFHLENBQUMsQ0FBQztJQUV4QyxNQUFNLElBQUksR0FBRyxPQUFPLENBQUMsR0FBRyxFQUFFLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsQ0FBQztJQUNuQyxNQUFNLElBQUksR0FBRyxPQUFPLENBQUMsR0FBRyxFQUFFLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQztJQUNuQyxPQUFPLE1BQU0sQ0FBQyxJQUFJLEVBQUUsSUFBSSxDQUFDLENBQUM7QUFDNUIsQ0FBQztBQUVELE1BQU0sQ0FBQyxNQUFNLFlBQVksR0FBRyxFQUFFLENBQUMsRUFBQyxhQUFhLEVBQUMsQ0FBQyxDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiLyoqXG4gKiBAbGljZW5zZVxuICogQ29weXJpZ2h0IDIwMjAgR29vZ2xlIExMQy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC5cbiAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSBcIkxpY2Vuc2VcIik7XG4gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuXG4gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXRcbiAqXG4gKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjBcbiAqXG4gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlXG4gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiBcIkFTIElTXCIgQkFTSVMsXG4gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC5cbiAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmRcbiAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLlxuICogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbiAqL1xuaW1wb3J0IHtUZW5zb3IxRCwgVGVuc29yMkR9IGZyb20gJy4uL3RlbnNvcic7XG5pbXBvcnQge2NvbnZlcnRUb1RlbnNvcn0gZnJvbSAnLi4vdGVuc29yX3V0aWxfZW52JztcbmltcG9ydCB7VGVuc29yTGlrZX0gZnJvbSAnLi4vdHlwZXMnO1xuaW1wb3J0ICogYXMgdXRpbCBmcm9tICcuLi91dGlsJztcblxuaW1wb3J0IHttYXRNdWx9IGZyb20gJy4vbWF0X211bCc7XG5pbXBvcnQge29wfSBmcm9tICcuL29wZXJhdGlvbic7XG5pbXBvcnQge3Jlc2hhcGV9IGZyb20gJy4vcmVzaGFwZSc7XG5cbi8qKlxuICogQ29tcHV0ZXMgdGhlIG91dGVyIHByb2R1Y3Qgb2YgdHdvIHZlY3RvcnMsIGB2MWAgYW5kIGB2MmAuXG4gKlxuICogYGBganNcbiAqIGNvbnN0IGEgPSB0Zi50ZW5zb3IxZChbMSwgMiwgM10pO1xuICogY29uc3QgYiA9IHRmLnRlbnNvcjFkKFszLCA0LCA1XSk7XG4gKlxuICogdGYub3V0ZXJQcm9kdWN0KGEsIGIpLnByaW50KCk7XG4gKiBgYGBcbiAqIEBwYXJhbSB2MSBUaGUgZmlyc3QgdmVjdG9yIGluIHRoZSBvdXRlciBwcm9kdWN0IG9wZXJhdGlvbi5cbiAqIEBwYXJhbSB2MiBUaGUgc2Vjb25kIHZlY3RvciBpbiB0aGUgb3V0ZXIgcHJvZHVjdCBvcGVyYXRpb24uXG4gKlxuICogQGRvYyB7aGVhZGluZzogJ09wZXJhdGlvbnMnLCBzdWJoZWFkaW5nOiAnTWF0cmljZXMnfVxuICovXG5mdW5jdGlvbiBvdXRlclByb2R1Y3RfKFxuICAgIHYxOiBUZW5zb3IxRHxUZW5zb3JMaWtlLCB2MjogVGVuc29yMUR8VGVuc29yTGlrZSk6IFRlbnNvcjJEIHtcbiAgY29uc3QgJHYxID0gY29udmVydFRvVGVuc29yKHYxLCAndjEnLCAnb3V0ZXJQcm9kdWN0Jyk7XG4gIGNvbnN0ICR2MiA9IGNvbnZlcnRUb1RlbnNvcih2MiwgJ3YyJywgJ291dGVyUHJvZHVjdCcpO1xuXG4gIHV0aWwuYXNzZXJ0KFxuICAgICAgJHYxLnJhbmsgPT09IDEgJiYgJHYyLnJhbmsgPT09IDEsXG4gICAgICAoKSA9PiBgRXJyb3IgaW4gb3V0ZXJQcm9kdWN0OiBpbnB1dHMgbXVzdCBiZSByYW5rIDEsIGJ1dCBnb3QgcmFua3MgYCArXG4gICAgICAgICAgYCR7JHYxLnJhbmt9IGFuZCAkeyR2Mi5yYW5rfS5gKTtcblxuICBjb25zdCB2MTJEID0gcmVzaGFwZSgkdjEsIFstMSwgMV0pO1xuICBjb25zdCB2MjJEID0gcmVzaGFwZSgkdjIsIFsxLCAtMV0pO1xuICByZXR1cm4gbWF0TXVsKHYxMkQsIHYyMkQpO1xufVxuXG5leHBvcnQgY29uc3Qgb3V0ZXJQcm9kdWN0ID0gb3Aoe291dGVyUHJvZHVjdF99KTtcbiJdfQ==","import { assert } from '../util';\nimport { op } from './operation';\nimport { pad } from './pad';\n/**\n * Pads a `tf.Tensor1D` with a given value and paddings. See `pad` for details.\n */\nfunction pad1d_(x, paddings, constantValue = 0) {\n assert(paddings.length === 2, () => 'Invalid number of paddings. Must be length of 2.');\n return pad(x, [paddings], constantValue);\n}\nexport const pad1d = op({ pad1d_ });\n//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicGFkMWQuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi8uLi90ZmpzLWNvcmUvc3JjL29wcy9wYWQxZC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFrQkEsT0FBTyxFQUFDLE1BQU0sRUFBQyxNQUFNLFNBQVMsQ0FBQztBQUMvQixPQUFPLEVBQUMsRUFBRSxFQUFDLE1BQU0sYUFBYSxDQUFDO0FBQy9CLE9BQU8sRUFBQyxHQUFHLEVBQUMsTUFBTSxPQUFPLENBQUM7QUFFMUI7O0dBRUc7QUFDSCxTQUFTLE1BQU0sQ0FDWCxDQUFzQixFQUFFLFFBQTBCLEVBQ2xELGFBQWEsR0FBRyxDQUFDO0lBQ25CLE1BQU0sQ0FDRixRQUFRLENBQUMsTUFBTSxLQUFLLENBQUMsRUFDckIsR0FBRyxFQUFFLENBQUMsa0RBQWtELENBQUMsQ0FBQztJQUM5RCxPQUFPLEdBQUcsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxRQUFRLENBQUMsRUFBRSxhQUFhLENBQUMsQ0FBQztBQUMzQyxDQUFDO0FBRUQsTUFBTSxDQUFDLE1BQU0sS0FBSyxHQUFHLEVBQUUsQ0FBQyxFQUFDLE1BQU0sRUFBQyxDQUFDLENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyIvKipcbiAqIEBsaWNlbnNlXG4gKiBDb3B5cmlnaHQgMjAyMCBHb29nbGUgTExDLiBBbGwgUmlnaHRzIFJlc2VydmVkLlxuICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlIFwiTGljZW5zZVwiKTtcbiAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS5cbiAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdFxuICpcbiAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMFxuICpcbiAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmVcbiAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuIFwiQVMgSVNcIiBCQVNJUyxcbiAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLlxuICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZFxuICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuXG4gKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuICovXG5pbXBvcnQge1RlbnNvcjFEfSBmcm9tICcuLi90ZW5zb3InO1xuaW1wb3J0IHtUZW5zb3JMaWtlfSBmcm9tICcuLi90eXBlcyc7XG5pbXBvcnQge2Fzc2VydH0gZnJvbSAnLi4vdXRpbCc7XG5pbXBvcnQge29wfSBmcm9tICcuL29wZXJhdGlvbic7XG5pbXBvcnQge3BhZH0gZnJvbSAnLi9wYWQnO1xuXG4vKipcbiAqIFBhZHMgYSBgdGYuVGVuc29yMURgIHdpdGggYSBnaXZlbiB2YWx1ZSBhbmQgcGFkZGluZ3MuIFNlZSBgcGFkYCBmb3IgZGV0YWlscy5cbiAqL1xuZnVuY3Rpb24gcGFkMWRfKFxuICAgIHg6IFRlbnNvcjFEfFRlbnNvckxpa2UsIHBhZGRpbmdzOiBbbnVtYmVyLCBudW1iZXJdLFxuICAgIGNvbnN0YW50VmFsdWUgPSAwKTogVGVuc29yMUQge1xuICBhc3NlcnQoXG4gICAgICBwYWRkaW5ncy5sZW5ndGggPT09IDIsXG4gICAgICAoKSA9PiAnSW52YWxpZCBudW1iZXIgb2YgcGFkZGluZ3MuIE11c3QgYmUgbGVuZ3RoIG9mIDIuJyk7XG4gIHJldHVybiBwYWQoeCwgW3BhZGRpbmdzXSwgY29uc3RhbnRWYWx1ZSk7XG59XG5cbmV4cG9ydCBjb25zdCBwYWQxZCA9IG9wKHtwYWQxZF99KTtcbiJdfQ==","import { assert } from '../util';\nimport { op } from './operation';\nimport { pad } from './pad';\n/**\n * Pads a `tf.Tensor2D` with a given value and paddings. See `pad` for details.\n */\nfunction pad2d_(x, paddings, constantValue = 0) {\n assert(paddings.length === 2 && paddings[0].length === 2 &&\n paddings[1].length === 2, () => 'Invalid number of paddings. Must be length of 2 each.');\n return pad(x, paddings, constantValue);\n}\nexport const pad2d = op({ pad2d_ });\n//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicGFkMmQuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi8uLi90ZmpzLWNvcmUvc3JjL29wcy9wYWQyZC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFrQkEsT0FBTyxFQUFDLE1BQU0sRUFBQyxNQUFNLFNBQVMsQ0FBQztBQUMvQixPQUFPLEVBQUMsRUFBRSxFQUFDLE1BQU0sYUFBYSxDQUFDO0FBQy9CLE9BQU8sRUFBQyxHQUFHLEVBQUMsTUFBTSxPQUFPLENBQUM7QUFFMUI7O0dBRUc7QUFDSCxTQUFTLE1BQU0sQ0FDWCxDQUFzQixFQUFFLFFBQThDLEVBQ3RFLGFBQWEsR0FBRyxDQUFDO0lBQ25CLE1BQU0sQ0FDRixRQUFRLENBQUMsTUFBTSxLQUFLLENBQUMsSUFBSSxRQUFRLENBQUMsQ0FBQyxDQUFDLENBQUMsTUFBTSxLQUFLLENBQUM7UUFDN0MsUUFBUSxDQUFDLENBQUMsQ0FBQyxDQUFDLE1BQU0sS0FBSyxDQUFDLEVBQzVCLEdBQUcsRUFBRSxDQUFDLHVEQUF1RCxDQUFDLENBQUM7SUFDbkUsT0FBTyxHQUFHLENBQUMsQ0FBQyxFQUFFLFFBQVEsRUFBRSxhQUFhLENBQUMsQ0FBQztBQUN6QyxDQUFDO0FBRUQsTUFBTSxDQUFDLE1BQU0sS0FBSyxHQUFHLEVBQUUsQ0FBQyxFQUFDLE1BQU0sRUFBQyxDQUFDLENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyIvKipcbiAqIEBsaWNlbnNlXG4gKiBDb3B5cmlnaHQgMjAyMCBHb29nbGUgTExDLiBBbGwgUmlnaHRzIFJlc2VydmVkLlxuICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlIFwiTGljZW5zZVwiKTtcbiAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS5cbiAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdFxuICpcbiAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMFxuICpcbiAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmVcbiAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuIFwiQVMgSVNcIiBCQVNJUyxcbiAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLlxuICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZFxuICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuXG4gKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuICovXG5pbXBvcnQge1RlbnNvcjJEfSBmcm9tICcuLi90ZW5zb3InO1xuaW1wb3J0IHtUZW5zb3JMaWtlfSBmcm9tICcuLi90eXBlcyc7XG5pbXBvcnQge2Fzc2VydH0gZnJvbSAnLi4vdXRpbCc7XG5pbXBvcnQge29wfSBmcm9tICcuL29wZXJhdGlvbic7XG5pbXBvcnQge3BhZH0gZnJvbSAnLi9wYWQnO1xuXG4vKipcbiAqIFBhZHMgYSBgdGYuVGVuc29yMkRgIHdpdGggYSBnaXZlbiB2YWx1ZSBhbmQgcGFkZGluZ3MuIFNlZSBgcGFkYCBmb3IgZGV0YWlscy5cbiAqL1xuZnVuY3Rpb24gcGFkMmRfKFxuICAgIHg6IFRlbnNvcjJEfFRlbnNvckxpa2UsIHBhZGRpbmdzOiBbW251bWJlciwgbnVtYmVyXSwgW251bWJlciwgbnVtYmVyXV0sXG4gICAgY29uc3RhbnRWYWx1ZSA9IDApOiBUZW5zb3IyRCB7XG4gIGFzc2VydChcbiAgICAgIHBhZGRpbmdzLmxlbmd0aCA9PT0gMiAmJiBwYWRkaW5nc1swXS5sZW5ndGggPT09IDIgJiZcbiAgICAgICAgICBwYWRkaW5nc1sxXS5sZW5ndGggPT09IDIsXG4gICAgICAoKSA9PiAnSW52YWxpZCBudW1iZXIgb2YgcGFkZGluZ3MuIE11c3QgYmUgbGVuZ3RoIG9mIDIgZWFjaC4nKTtcbiAgcmV0dXJuIHBhZCh4LCBwYWRkaW5ncywgY29uc3RhbnRWYWx1ZSk7XG59XG5cbmV4cG9ydCBjb25zdCBwYWQyZCA9IG9wKHtwYWQyZF99KTtcbiJdfQ==","import { assert } from '../util';\nimport { op } from './operation';\nimport { pad } from './pad';\n/**\n * Pads a `tf.Tensor3D` with a given value and paddings. See `pad` for details.\n */\nfunction pad3d_(x, paddings, constantValue = 0) {\n assert(paddings.length === 3 && paddings[0].length === 2 &&\n paddings[1].length === 2 && paddings[2].length === 2, () => 'Invalid number of paddings. Must be length of 2 each.');\n return pad(x, paddings, constantValue);\n}\nexport const pad3d = op({ pad3d_ });\n//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicGFkM2QuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi8uLi90ZmpzLWNvcmUvc3JjL29wcy9wYWQzZC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFrQkEsT0FBTyxFQUFDLE1BQU0sRUFBQyxNQUFNLFNBQVMsQ0FBQztBQUMvQixPQUFPLEVBQUMsRUFBRSxFQUFDLE1BQU0sYUFBYSxDQUFDO0FBQy9CLE9BQU8sRUFBQyxHQUFHLEVBQUMsTUFBTSxPQUFPLENBQUM7QUFFMUI7O0dBRUc7QUFDSCxTQUFTLE1BQU0sQ0FDWCxDQUFzQixFQUN0QixRQUFnRSxFQUNoRSxhQUFhLEdBQUcsQ0FBQztJQUNuQixNQUFNLENBQ0YsUUFBUSxDQUFDLE1BQU0sS0FBSyxDQUFDLElBQUksUUFBUSxDQUFDLENBQUMsQ0FBQyxDQUFDLE1BQU0sS0FBSyxDQUFDO1FBQzdDLFFBQVEsQ0FBQyxDQUFDLENBQUMsQ0FBQyxNQUFNLEtBQUssQ0FBQyxJQUFJLFFBQVEsQ0FBQyxDQUFDLENBQUMsQ0FBQyxNQUFNLEtBQUssQ0FBQyxFQUN4RCxHQUFHLEVBQUUsQ0FBQyx1REFBdUQsQ0FBQyxDQUFDO0lBQ25FLE9BQU8sR0FBRyxDQUFDLENBQUMsRUFBRSxRQUFRLEVBQUUsYUFBYSxDQUFDLENBQUM7QUFDekMsQ0FBQztBQUVELE1BQU0sQ0FBQyxNQUFNLEtBQUssR0FBRyxFQUFFLENBQUMsRUFBQyxNQUFNLEVBQUMsQ0FBQyxDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiLyoqXG4gKiBAbGljZW5zZVxuICogQ29weXJpZ2h0IDIwMjAgR29vZ2xlIExMQy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC5cbiAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSBcIkxpY2Vuc2VcIik7XG4gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuXG4gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXRcbiAqXG4gKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjBcbiAqXG4gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlXG4gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiBcIkFTIElTXCIgQkFTSVMsXG4gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC5cbiAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmRcbiAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLlxuICogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbiAqL1xuaW1wb3J0IHtUZW5zb3IzRH0gZnJvbSAnLi4vdGVuc29yJztcbmltcG9ydCB7VGVuc29yTGlrZX0gZnJvbSAnLi4vdHlwZXMnO1xuaW1wb3J0IHthc3NlcnR9IGZyb20gJy4uL3V0aWwnO1xuaW1wb3J0IHtvcH0gZnJvbSAnLi9vcGVyYXRpb24nO1xuaW1wb3J0IHtwYWR9IGZyb20gJy4vcGFkJztcblxuLyoqXG4gKiBQYWRzIGEgYHRmLlRlbnNvcjNEYCB3aXRoIGEgZ2l2ZW4gdmFsdWUgYW5kIHBhZGRpbmdzLiBTZWUgYHBhZGAgZm9yIGRldGFpbHMuXG4gKi9cbmZ1bmN0aW9uIHBhZDNkXyhcbiAgICB4OiBUZW5zb3IzRHxUZW5zb3JMaWtlLFxuICAgIHBhZGRpbmdzOiBbW251bWJlciwgbnVtYmVyXSwgW251bWJlciwgbnVtYmVyXSwgW251bWJlciwgbnVtYmVyXV0sXG4gICAgY29uc3RhbnRWYWx1ZSA9IDApOiBUZW5zb3IzRCB7XG4gIGFzc2VydChcbiAgICAgIHBhZGRpbmdzLmxlbmd0aCA9PT0gMyAmJiBwYWRkaW5nc1swXS5sZW5ndGggPT09IDIgJiZcbiAgICAgICAgICBwYWRkaW5nc1sxXS5sZW5ndGggPT09IDIgJiYgcGFkZGluZ3NbMl0ubGVuZ3RoID09PSAyLFxuICAgICAgKCkgPT4gJ0ludmFsaWQgbnVtYmVyIG9mIHBhZGRpbmdzLiBNdXN0IGJlIGxlbmd0aCBvZiAyIGVhY2guJyk7XG4gIHJldHVybiBwYWQoeCwgcGFkZGluZ3MsIGNvbnN0YW50VmFsdWUpO1xufVxuXG5leHBvcnQgY29uc3QgcGFkM2QgPSBvcCh7cGFkM2RffSk7XG4iXX0=","import { assert } from '../util';\nimport { op } from './operation';\nimport { pad } from './pad';\n/**\n * Pads a `tf.Tensor4D` with a given value and paddings. See `pad` for details.\n */\nfunction pad4d_(x, paddings, constantValue = 0) {\n assert(paddings.length === 4 && paddings[0].length === 2 &&\n paddings[1].length === 2 && paddings[2].length === 2 &&\n paddings[3].length === 2, () => 'Invalid number of paddings. Must be length of 2 each.');\n return pad(x, paddings, constantValue);\n}\nexport const pad4d = op({ pad4d_ });\n//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicGFkNGQuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi8uLi90ZmpzLWNvcmUvc3JjL29wcy9wYWQ0ZC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFrQkEsT0FBTyxFQUFDLE1BQU0sRUFBQyxNQUFNLFNBQVMsQ0FBQztBQUMvQixPQUFPLEVBQUMsRUFBRSxFQUFDLE1BQU0sYUFBYSxDQUFDO0FBQy9CLE9BQU8sRUFBQyxHQUFHLEVBQUMsTUFBTSxPQUFPLENBQUM7QUFFMUI7O0dBRUc7QUFDSCxTQUFTLE1BQU0sQ0FDWCxDQUFzQixFQUN0QixRQUdLLEVBQ0wsYUFBYSxHQUFHLENBQUM7SUFDbkIsTUFBTSxDQUNGLFFBQVEsQ0FBQyxNQUFNLEtBQUssQ0FBQyxJQUFJLFFBQVEsQ0FBQyxDQUFDLENBQUMsQ0FBQyxNQUFNLEtBQUssQ0FBQztRQUM3QyxRQUFRLENBQUMsQ0FBQyxDQUFDLENBQUMsTUFBTSxLQUFLLENBQUMsSUFBSSxRQUFRLENBQUMsQ0FBQyxDQUFDLENBQUMsTUFBTSxLQUFLLENBQUM7UUFDcEQsUUFBUSxDQUFDLENBQUMsQ0FBQyxDQUFDLE1BQU0sS0FBSyxDQUFDLEVBQzVCLEdBQUcsRUFBRSxDQUFDLHVEQUF1RCxDQUFDLENBQUM7SUFDbkUsT0FBTyxHQUFHLENBQUMsQ0FBQyxFQUFFLFFBQVEsRUFBRSxhQUFhLENBQUMsQ0FBQztBQUN6QyxDQUFDO0FBRUQsTUFBTSxDQUFDLE1BQU0sS0FBSyxHQUFHLEVBQUUsQ0FBQyxFQUFDLE1BQU0sRUFBQyxDQUFDLENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyIvKipcbiAqIEBsaWNlbnNlXG4gKiBDb3B5cmlnaHQgMjAyMCBHb29nbGUgTExDLiBBbGwgUmlnaHRzIFJlc2VydmVkLlxuICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlIFwiTGljZW5zZVwiKTtcbiAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS5cbiAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdFxuICpcbiAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMFxuICpcbiAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmVcbiAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuIFwiQVMgSVNcIiBCQVNJUyxcbiAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLlxuICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZFxuICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuXG4gKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuICovXG5pbXBvcnQge1RlbnNvcjREfSBmcm9tICcuLi90ZW5zb3InO1xuaW1wb3J0IHtUZW5zb3JMaWtlfSBmcm9tICcuLi90eXBlcyc7XG5pbXBvcnQge2Fzc2VydH0gZnJvbSAnLi4vdXRpbCc7XG5pbXBvcnQge29wfSBmcm9tICcuL29wZXJhdGlvbic7XG5pbXBvcnQge3BhZH0gZnJvbSAnLi9wYWQnO1xuXG4vKipcbiAqIFBhZHMgYSBgdGYuVGVuc29yNERgIHdpdGggYSBnaXZlbiB2YWx1ZSBhbmQgcGFkZGluZ3MuIFNlZSBgcGFkYCBmb3IgZGV0YWlscy5cbiAqL1xuZnVuY3Rpb24gcGFkNGRfKFxuICAgIHg6IFRlbnNvcjREfFRlbnNvckxpa2UsXG4gICAgcGFkZGluZ3M6XG4gICAgICAgIFtcbiAgICAgICAgICBbbnVtYmVyLCBudW1iZXJdLCBbbnVtYmVyLCBudW1iZXJdLCBbbnVtYmVyLCBudW1iZXJdLCBbbnVtYmVyLCBudW1iZXJdXG4gICAgICAgIF0sXG4gICAgY29uc3RhbnRWYWx1ZSA9IDApOiBUZW5zb3I0RCB7XG4gIGFzc2VydChcbiAgICAgIHBhZGRpbmdzLmxlbmd0aCA9PT0gNCAmJiBwYWRkaW5nc1swXS5sZW5ndGggPT09IDIgJiZcbiAgICAgICAgICBwYWRkaW5nc1sxXS5sZW5ndGggPT09IDIgJiYgcGFkZGluZ3NbMl0ubGVuZ3RoID09PSAyICYmXG4gICAgICAgICAgcGFkZGluZ3NbM10ubGVuZ3RoID09PSAyLFxuICAgICAgKCkgPT4gJ0ludmFsaWQgbnVtYmVyIG9mIHBhZGRpbmdzLiBNdXN0IGJlIGxlbmd0aCBvZiAyIGVhY2guJyk7XG4gIHJldHVybiBwYWQoeCwgcGFkZGluZ3MsIGNvbnN0YW50VmFsdWUpO1xufVxuXG5leHBvcnQgY29uc3QgcGFkNGQgPSBvcCh7cGFkNGRffSk7XG4iXX0=","/**\n * @license\n * Copyright 2022 Google LLC. All Rights Reserved.\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n * =============================================================================\n */\nimport { ENGINE } from '../engine';\nimport { RaggedGather } from '../kernel_names';\nimport { convertToTensor } from '../tensor_util_env';\nimport { op } from './operation';\nfunction raggedGather_(paramsNestedSplits, paramsDenseValues, indices, outputRaggedRank) {\n const $paramsNestedSplits = paramsNestedSplits.map((t, i) => convertToTensor(t, `tensors${i}`, 'raggedGather', 'int32'));\n const $paramsDenseValues = convertToTensor(paramsDenseValues, 'paramsDenseValues', 'raggedGather');\n const $indices = convertToTensor(indices, 'indices', 'raggedGather', 'int32');\n const inputs = {\n paramsNestedSplits: $paramsNestedSplits,\n paramsDenseValues: $paramsDenseValues,\n indices: $indices,\n };\n const attrs = { outputRaggedRank };\n const result = ENGINE.runKernel(RaggedGather, inputs, attrs);\n return {\n outputNestedSplits: result.slice(0, result.length - 1),\n outputDenseValues: result[result.length - 1],\n };\n}\nexport const raggedGather = op({ raggedGather_ });\n//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicmFnZ2VkX2dhdGhlci5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uLy4uL3RmanMtY29yZS9zcmMvb3BzL3JhZ2dlZF9nYXRoZXIudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUE7Ozs7Ozs7Ozs7Ozs7OztHQWVHO0FBRUgsT0FBTyxFQUFDLE1BQU0sRUFBQyxNQUFNLFdBQVcsQ0FBQztBQUNqQyxPQUFPLEVBQUMsWUFBWSxFQUF3QyxNQUFNLGlCQUFpQixDQUFDO0FBRXBGLE9BQU8sRUFBQyxlQUFlLEVBQUMsTUFBTSxvQkFBb0IsQ0FBQztBQUVuRCxPQUFPLEVBQUMsRUFBRSxFQUFDLE1BQU0sYUFBYSxDQUFDO0FBNEIvQixTQUFTLGFBQWEsQ0FDbEIsa0JBQTRCLEVBQUUsaUJBQW9DLEVBQ2xFLE9BQTBCLEVBQUUsZ0JBQXdCO0lBQ3RELE1BQU0sbUJBQW1CLEdBQUcsa0JBQWtCLENBQUMsR0FBRyxDQUM5QyxDQUFDLENBQUMsRUFBRSxDQUFDLEVBQUUsRUFBRSxDQUFDLGVBQWUsQ0FBQyxDQUFDLEVBQUUsVUFBVSxDQUFDLEVBQUUsRUFBRSxjQUFjLEVBQUUsT0FBTyxDQUFDLENBQUMsQ0FBQztJQUMxRSxNQUFNLGtCQUFrQixHQUNwQixlQUFlLENBQUMsaUJBQWlCLEVBQUUsbUJBQW1CLEVBQUUsY0FBYyxDQUFDLENBQUM7SUFDNUUsTUFBTSxRQUFRLEdBQUcsZUFBZSxDQUFDLE9BQU8sRUFBRSxTQUFTLEVBQUUsY0FBYyxFQUFFLE9BQU8sQ0FBQyxDQUFDO0lBRTlFLE1BQU0sTUFBTSxHQUF1QjtRQUNqQyxrQkFBa0IsRUFBRSxtQkFBbUI7UUFDdkMsaUJBQWlCLEVBQUUsa0JBQWtCO1FBQ3JDLE9BQU8sRUFBRSxRQUFRO0tBQ2xCLENBQUM7SUFDRixNQUFNLEtBQUssR0FBc0IsRUFBQyxnQkFBZ0IsRUFBQyxDQUFDO0lBRXBELE1BQU0sTUFBTSxHQUNSLE1BQU0sQ0FBQyxTQUFTLENBQUMsWUFBWSxFQUFFLE1BQVksRUFBRSxLQUFXLENBQUMsQ0FBQztJQUM5RCxPQUFPO1FBQ0wsa0JBQWtCLEVBQUUsTUFBTSxDQUFDLEtBQUssQ0FBQyxDQUFDLEVBQUUsTUFBTSxDQUFDLE1BQU0sR0FBRyxDQUFDLENBQUM7UUFDdEQsaUJBQWlCLEVBQUUsTUFBTSxDQUFDLE1BQU0sQ0FBQyxNQUFNLEdBQUcsQ0FBQyxDQUFDO0tBQzdDLENBQUM7QUFDSixDQUFDO0FBRUQsTUFBTSxDQUFDLE1BQU0sWUFBWSxHQUFHLEVBQUUsQ0FBQyxFQUFDLGFBQWEsRUFBQyxDQUFDLENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyIvKipcbiAqIEBsaWNlbnNlXG4gKiBDb3B5cmlnaHQgMjAyMiBHb29nbGUgTExDLiBBbGwgUmlnaHRzIFJlc2VydmVkLlxuICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlIFwiTGljZW5zZVwiKTtcbiAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS5cbiAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdFxuICpcbiAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMFxuICpcbiAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmVcbiAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuIFwiQVMgSVNcIiBCQVNJUyxcbiAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLlxuICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZFxuICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuXG4gKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuICovXG5cbmltcG9ydCB7RU5HSU5FfSBmcm9tICcuLi9lbmdpbmUnO1xuaW1wb3J0IHtSYWdnZWRHYXRoZXIsIFJhZ2dlZEdhdGhlckF0dHJzLCBSYWdnZWRHYXRoZXJJbnB1dHN9IGZyb20gJy4uL2tlcm5lbF9uYW1lcyc7XG5pbXBvcnQge1RlbnNvcn0gZnJvbSAnLi4vdGVuc29yJztcbmltcG9ydCB7Y29udmVydFRvVGVuc29yfSBmcm9tICcuLi90ZW5zb3JfdXRpbF9lbnYnO1xuaW1wb3J0IHtUZW5zb3JMaWtlfSBmcm9tICcuLi90eXBlcyc7XG5pbXBvcnQge29wfSBmcm9tICcuL29wZXJhdGlvbic7XG5cbi8qKlxuICogR2F0aGVyIHJhZ2dlZCBzbGljZXMgZnJvbSBwYXJhbXMgYXhpcyAwIGFjY29yZGluZyB0byBpbmRpY2VzLlxuICpcbiAqIEBwYXJhbSBwYXJhbXNOZXN0ZWRTcGxpdHM6IEEgbGlzdCBvZiBhdCBsZWFzdCAxIFRlbnNvciB3aXRoIHR5cGUgJ2ludDMyJyBUaGVcbiAqICAgICBuZXN0ZWRSb3dTcGxpdHMgdGVuc29ycyB0aGF0IGRlZmluZSB0aGUgcm93LXBhcnRpdGlvbmluZyBmb3IgdGhlIHBhcmFtc1xuICogICAgIFJhZ2dlZFRlbnNvciBpbnB1dC5cbiAqIEBwYXJhbSBwYXJhbXNEZW5zZVZhbHVlczogQSBUZW5zb3IuIFRoZSBmbGF0VmFsdWVzIGZvciB0aGUgcGFyYW1zXG4gKiAgICAgUmFnZ2VkVGVuc29yLlxuICogQHBhcmFtIGluZGljZXM6IEEgVGVuc29yLiBNdXN0IGJlIG9uZSBvZiB0eXBlOiBpbnQzMi4gSW5kaWNlcyBpbiB0aGVcbiAqICAgICBvdXRlcm1vc3QgZGltZW5zaW9uIG9mIHBhcmFtcyBvZiB0aGUgdmFsdWVzIHRoYXQgc2hvdWxkIGJlIGdhdGhlcmVkLlxuICogQHBhcmFtIG91dHB1dFJhZ2dlZFJhbms6IEFuIGludCB0aGF0IGlzID49IDAuIFRoZSByYWdnZWQgcmFuayBvZiB0aGUgb3V0cHV0XG4gKiAgICAgUmFnZ2VkVGVuc29yLiBvdXRwdXROZXN0ZWRTcGxpdHMgd2lsbCBjb250YWluIHRoaXMgbnVtYmVyIG9mIHJvd1NwbGl0c1xuICogICAgIHRlbnNvcnMuIFRoaXMgdmFsdWUgc2hvdWxkIGVxdWFsIGluZGljZXMuc2hhcGUubmRpbXMgKyBwYXJhbXMucmFnZ2VkUmFua1xuICogICAgIC0gMS5cbiAqIEByZXR1cm4gQSBtYXAgd2l0aCB0aGUgZm9sbG93aW5nIHByb3BlcnRpZXM6XG4gKiAgICAgLSBvdXRwdXROZXN0ZWRTcGxpdHM6IEEgbGlzdCBvZiBvdXRwdXRSYWdnZWRSYW5rIFRlbnNvciBvYmplY3RzIHdpdGggdGhlXG4gKiBzYW1lIHR5cGUgYXMgcGFyYW1zTmVzdGVkU3BsaXRzLlxuICogICAgIC0gb3V0cHV0RGVuc2VWYWx1ZXM6IEEgVGVuc29yLiBIYXMgdGhlIHNhbWUgdHlwZSBhcyBwYXJhbXNEZW5zZVZhbHVlcy5cbiAqIEBkb2Mge2hlYWRpbmc6ICdPcGVyYXRpb25zJywgc3ViaGVhZGluZzogJ1JhZ2dlZCd9XG4gKi9cblxuaW50ZXJmYWNlIFJhZ2dlZEdhdGhlck1hcCB7XG4gIG91dHB1dE5lc3RlZFNwbGl0czogVGVuc29yW107XG4gIG91dHB1dERlbnNlVmFsdWVzOiBUZW5zb3I7XG59XG5cbmZ1bmN0aW9uIHJhZ2dlZEdhdGhlcl8oXG4gICAgcGFyYW1zTmVzdGVkU3BsaXRzOiBUZW5zb3JbXSwgcGFyYW1zRGVuc2VWYWx1ZXM6IFRlbnNvcnxUZW5zb3JMaWtlLFxuICAgIGluZGljZXM6IFRlbnNvcnxUZW5zb3JMaWtlLCBvdXRwdXRSYWdnZWRSYW5rOiBudW1iZXIpOiBSYWdnZWRHYXRoZXJNYXAge1xuICBjb25zdCAkcGFyYW1zTmVzdGVkU3BsaXRzID0gcGFyYW1zTmVzdGVkU3BsaXRzLm1hcChcbiAgICAgICh0LCBpKSA9PiBjb252ZXJ0VG9UZW5zb3IodCwgYHRlbnNvcnMke2l9YCwgJ3JhZ2dlZEdhdGhlcicsICdpbnQzMicpKTtcbiAgY29uc3QgJHBhcmFtc0RlbnNlVmFsdWVzID1cbiAgICAgIGNvbnZlcnRUb1RlbnNvcihwYXJhbXNEZW5zZVZhbHVlcywgJ3BhcmFtc0RlbnNlVmFsdWVzJywgJ3JhZ2dlZEdhdGhlcicpO1xuICBjb25zdCAkaW5kaWNlcyA9IGNvbnZlcnRUb1RlbnNvcihpbmRpY2VzLCAnaW5kaWNlcycsICdyYWdnZWRHYXRoZXInLCAnaW50MzInKTtcblxuICBjb25zdCBpbnB1dHM6IFJhZ2dlZEdhdGhlcklucHV0cyA9IHtcbiAgICBwYXJhbXNOZXN0ZWRTcGxpdHM6ICRwYXJhbXNOZXN0ZWRTcGxpdHMsXG4gICAgcGFyYW1zRGVuc2VWYWx1ZXM6ICRwYXJhbXNEZW5zZVZhbHVlcyxcbiAgICBpbmRpY2VzOiAkaW5kaWNlcyxcbiAgfTtcbiAgY29uc3QgYXR0cnM6IFJhZ2dlZEdhdGhlckF0dHJzID0ge291dHB1dFJhZ2dlZFJhbmt9O1xuXG4gIGNvbnN0IHJlc3VsdDogVGVuc29yW10gPVxuICAgICAgRU5HSU5FLnJ1bktlcm5lbChSYWdnZWRHYXRoZXIsIGlucHV0cyBhcyB7fSwgYXR0cnMgYXMge30pO1xuICByZXR1cm4ge1xuICAgIG91dHB1dE5lc3RlZFNwbGl0czogcmVzdWx0LnNsaWNlKDAsIHJlc3VsdC5sZW5ndGggLSAxKSxcbiAgICBvdXRwdXREZW5zZVZhbHVlczogcmVzdWx0W3Jlc3VsdC5sZW5ndGggLSAxXSxcbiAgfTtcbn1cblxuZXhwb3J0IGNvbnN0IHJhZ2dlZEdhdGhlciA9IG9wKHtyYWdnZWRHYXRoZXJffSk7XG4iXX0=","/**\n * @license\n * Copyright 2022 Google LLC. All Rights Reserved.\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n * =============================================================================\n */\nimport { ENGINE } from '../engine';\nimport { RaggedTensorToTensor } from '../kernel_names';\nimport { convertToTensor } from '../tensor_util_env';\nimport { op } from './operation';\n/**\n * Create a dense tensor from a ragged tensor, possibly altering its shape.\n *\n * The raggedTensorToTensor op creates a dense tensor from am array of row\n * partition tensors, a value vector, and default values. If the shape is\n * unspecified, the minimal shape required to contain all the elements in the\n * ragged tensor (the natural shape) will be used. If some dimensions are left\n * unspecified, then the size of the natural shape is used in that dimension.\n *\n * The defaultValue will be broadcast to the output shape. After that, the\n * values from the ragged tensor overwrite the default values. Note that the\n * defaultValue must have less dimensions than the value.\n *\n * The row partition tensors are in the order of the dimensions. At present, the\n * types can be: \"ROW_SPLITS\": the row_splits tensor from the ragged tensor.\n * \"VALUE_ROWIDS\": the value_rowids tensor from the ragged tensor.\n * \"FIRST_DIM_SIZE\": if value_rowids is used for the first dimension, then it\n * is preceded by \"FIRST_DIM_SIZE\".\n * ```\n * @param shape: A Tensor. Must be one of the following types: 'int32'. The\n * desired shape of the output tensor. If left unspecified (empty), the\n * minimal shape required to contain all the elements in the ragged tensor\n * (the natural shape) will be used. If some dimensions are left\n * unspecified, then the size of the natural shape is used in that\n * dimension.\n *\n * Note that dense dimensions cannot be modified by the shape argument.\n * Trying to change the size of a dense dimension will cause the op to fail.\n * Examples: natural shape: [4, 5, 6] shape: -1 output shape: [4, 5, 6]\n *\n * natural shape: [4, 5, 6] shape: [3, -1, 2] output shape: [3, 5, 2]\n *\n * natural shape: [4, 5, 6] shape: [3, 7, 2] output shape: [3, 7, 2]\n * @param values: A Tensor. A 1D tensor representing the values of the ragged\n * tensor.\n * @param defaultValue: A Tensor. Must have the same type as values. The\n * defaultValue when the shape is larger than the ragged tensor. The\n * defaultValue is broadcast until it is the shape of the output tensor,\n * and then overwritten by values in the ragged tensor. The default value\n * must be compatible with this broadcast operation, and must have fewer\n * dimensions than the value tensor.\n * @param rowPartitionTensors: A list of at least 1 Tensor objects with the same\n * type in: 'int32'.\n * @param rowPartitionTypes: A list of strings. The types of the row partition\n * tensors. At present, these can be:\n * \"ROW_SPLITS\": the row_splits tensor from the ragged tensor.\n * \"VALUE_ROWIDS\": the value_rowids tensor from the ragged tensor.\n * \"FIRST_DIM_SIZE\": if value_rowids is used for the first dimension, then\n * it is preceeded by \"FIRST_DIM_SIZE\". The tensors are in the order of\n * the dimensions.\n * @return A Tensor. Has the same type as values.\n * @doc {heading: 'Operations', subheading: 'Ragged'}\n */\nfunction raggedTensorToTensor_(shape, values, defaultValue, rowPartitionTensors, rowPartitionTypes) {\n const $shape = convertToTensor(shape, 'shape', 'raggedTensorToTensor', 'int32');\n const $values = convertToTensor(values, 'values', 'raggedTensorToTensor');\n const $defaultValue = convertToTensor(defaultValue, 'defaultValue', 'raggedTensorToTensor', $values.dtype);\n const $rowPartitionTensors = rowPartitionTensors.map((t, i) => convertToTensor(t, `tensors${i}`, 'raggedTensorToTensor', 'int32'));\n const inputs = {\n shape: $shape,\n values: $values,\n defaultValue: $defaultValue,\n rowPartitionTensors: $rowPartitionTensors\n };\n const attrs = { rowPartitionTypes };\n return ENGINE.runKernel(RaggedTensorToTensor, inputs, attrs);\n}\nexport const raggedTensorToTensor = op({ raggedTensorToTensor_ });\n//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicmFnZ2VkX3RlbnNvcl90b190ZW5zb3IuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi8uLi90ZmpzLWNvcmUvc3JjL29wcy9yYWdnZWRfdGVuc29yX3RvX3RlbnNvci50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQTs7Ozs7Ozs7Ozs7Ozs7O0dBZUc7QUFFSCxPQUFPLEVBQUMsTUFBTSxFQUFDLE1BQU0sV0FBVyxDQUFDO0FBQ2pDLE9BQU8sRUFBQyxvQkFBb0IsRUFBd0QsTUFBTSxpQkFBaUIsQ0FBQztBQUU1RyxPQUFPLEVBQUMsZUFBZSxFQUFDLE1BQU0sb0JBQW9CLENBQUM7QUFFbkQsT0FBTyxFQUFDLEVBQUUsRUFBQyxNQUFNLGFBQWEsQ0FBQztBQUUvQjs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7OztHQW9ERztBQUNILFNBQVMscUJBQXFCLENBQzFCLEtBQXdCLEVBQUUsTUFBeUIsRUFDbkQsWUFBK0IsRUFBRSxtQkFBNkIsRUFDOUQsaUJBQTJCO0lBQzdCLE1BQU0sTUFBTSxHQUNSLGVBQWUsQ0FBQyxLQUFLLEVBQUUsT0FBTyxFQUFFLHNCQUFzQixFQUFFLE9BQU8sQ0FBQyxDQUFDO0lBQ3JFLE1BQU0sT0FBTyxHQUFHLGVBQWUsQ0FBQyxNQUFNLEVBQUUsUUFBUSxFQUFFLHNCQUFzQixDQUFDLENBQUM7SUFDMUUsTUFBTSxhQUFhLEdBQUcsZUFBZSxDQUNqQyxZQUFZLEVBQUUsY0FBYyxFQUFFLHNCQUFzQixFQUFFLE9BQU8sQ0FBQyxLQUFLLENBQUMsQ0FBQztJQUN6RSxNQUFNLG9CQUFvQixHQUFHLG1CQUFtQixDQUFDLEdBQUcsQ0FDaEQsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxFQUFFLEVBQUUsQ0FDTCxlQUFlLENBQUMsQ0FBQyxFQUFFLFVBQVUsQ0FBQyxFQUFFLEVBQUUsc0JBQXNCLEVBQUUsT0FBTyxDQUFDLENBQUMsQ0FBQztJQUU1RSxNQUFNLE1BQU0sR0FBK0I7UUFDekMsS0FBSyxFQUFFLE1BQU07UUFDYixNQUFNLEVBQUUsT0FBTztRQUNmLFlBQVksRUFBRSxhQUFhO1FBQzNCLG1CQUFtQixFQUFFLG9CQUFvQjtLQUMxQyxDQUFDO0lBQ0YsTUFBTSxLQUFLLEdBQThCLEVBQUMsaUJBQWlCLEVBQUMsQ0FBQztJQUU3RCxPQUFPLE1BQU0sQ0FBQyxTQUFTLENBQUMsb0JBQW9CLEVBQUUsTUFBWSxFQUFFLEtBQVcsQ0FBQyxDQUFDO0FBQzNFLENBQUM7QUFFRCxNQUFNLENBQUMsTUFBTSxvQkFBb0IsR0FBRyxFQUFFLENBQUMsRUFBQyxxQkFBcUIsRUFBQyxDQUFDLENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyIvKipcbiAqIEBsaWNlbnNlXG4gKiBDb3B5cmlnaHQgMjAyMiBHb29nbGUgTExDLiBBbGwgUmlnaHRzIFJlc2VydmVkLlxuICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlIFwiTGljZW5zZVwiKTtcbiAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS5cbiAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdFxuICpcbiAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMFxuICpcbiAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmVcbiAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuIFwiQVMgSVNcIiBCQVNJUyxcbiAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLlxuICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZFxuICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuXG4gKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuICovXG5cbmltcG9ydCB7RU5HSU5FfSBmcm9tICcuLi9lbmdpbmUnO1xuaW1wb3J0IHtSYWdnZWRUZW5zb3JUb1RlbnNvciwgUmFnZ2VkVGVuc29yVG9UZW5zb3JBdHRycywgUmFnZ2VkVGVuc29yVG9UZW5zb3JJbnB1dHN9IGZyb20gJy4uL2tlcm5lbF9uYW1lcyc7XG5pbXBvcnQge1RlbnNvcn0gZnJvbSAnLi4vdGVuc29yJztcbmltcG9ydCB7Y29udmVydFRvVGVuc29yfSBmcm9tICcuLi90ZW5zb3JfdXRpbF9lbnYnO1xuaW1wb3J0IHtUZW5zb3JMaWtlfSBmcm9tICcuLi90eXBlcyc7XG5pbXBvcnQge29wfSBmcm9tICcuL29wZXJhdGlvbic7XG5cbi8qKlxuICogQ3JlYXRlIGEgZGVuc2UgdGVuc29yIGZyb20gYSByYWdnZWQgdGVuc29yLCBwb3NzaWJseSBhbHRlcmluZyBpdHMgc2hhcGUuXG4gKlxuICogVGhlIHJhZ2dlZFRlbnNvclRvVGVuc29yIG9wIGNyZWF0ZXMgYSBkZW5zZSB0ZW5zb3IgZnJvbSBhbSBhcnJheSBvZiByb3dcbiAqIHBhcnRpdGlvbiB0ZW5zb3JzLCBhIHZhbHVlIHZlY3RvciwgYW5kIGRlZmF1bHQgdmFsdWVzLiBJZiB0aGUgc2hhcGUgaXNcbiAqIHVuc3BlY2lmaWVkLCB0aGUgbWluaW1hbCBzaGFwZSByZXF1aXJlZCB0byBjb250YWluIGFsbCB0aGUgZWxlbWVudHMgaW4gdGhlXG4gKiByYWdnZWQgdGVuc29yICh0aGUgbmF0dXJhbCBzaGFwZSkgd2lsbCBiZSB1c2VkLiBJZiBzb21lIGRpbWVuc2lvbnMgYXJlIGxlZnRcbiAqIHVuc3BlY2lmaWVkLCB0aGVuIHRoZSBzaXplIG9mIHRoZSBuYXR1cmFsIHNoYXBlIGlzIHVzZWQgaW4gdGhhdCBkaW1lbnNpb24uXG4gKlxuICogVGhlIGRlZmF1bHRWYWx1ZSB3aWxsIGJlIGJyb2FkY2FzdCB0byB0aGUgb3V0cHV0IHNoYXBlLiBBZnRlciB0aGF0LCB0aGVcbiAqIHZhbHVlcyBmcm9tIHRoZSByYWdnZWQgdGVuc29yIG92ZXJ3cml0ZSB0aGUgZGVmYXVsdCB2YWx1ZXMuIE5vdGUgdGhhdCB0aGVcbiAqIGRlZmF1bHRWYWx1ZSBtdXN0IGhhdmUgbGVzcyBkaW1lbnNpb25zIHRoYW4gdGhlIHZhbHVlLlxuICpcbiAqIFRoZSByb3cgcGFydGl0aW9uIHRlbnNvcnMgYXJlIGluIHRoZSBvcmRlciBvZiB0aGUgZGltZW5zaW9ucy4gQXQgcHJlc2VudCwgdGhlXG4gKiB0eXBlcyBjYW4gYmU6IFwiUk9XX1NQTElUU1wiOiB0aGUgcm93X3NwbGl0cyB0ZW5zb3IgZnJvbSB0aGUgcmFnZ2VkIHRlbnNvci5cbiAqICAgXCJWQUxVRV9ST1dJRFNcIjogdGhlIHZhbHVlX3Jvd2lkcyB0ZW5zb3IgZnJvbSB0aGUgcmFnZ2VkIHRlbnNvci5cbiAqICAgXCJGSVJTVF9ESU1fU0laRVwiOiBpZiB2YWx1ZV9yb3dpZHMgaXMgdXNlZCBmb3IgdGhlIGZpcnN0IGRpbWVuc2lvbiwgdGhlbiBpdFxuICogaXMgcHJlY2VkZWQgYnkgXCJGSVJTVF9ESU1fU0laRVwiLlxuICogYGBgXG4gKiBAcGFyYW0gc2hhcGU6IEEgVGVuc29yLiBNdXN0IGJlIG9uZSBvZiB0aGUgZm9sbG93aW5nIHR5cGVzOiAnaW50MzInLiBUaGVcbiAqICAgICBkZXNpcmVkIHNoYXBlIG9mIHRoZSBvdXRwdXQgdGVuc29yLiBJZiBsZWZ0IHVuc3BlY2lmaWVkIChlbXB0eSksIHRoZVxuICogICAgIG1pbmltYWwgc2hhcGUgcmVxdWlyZWQgdG8gY29udGFpbiBhbGwgdGhlIGVsZW1lbnRzIGluIHRoZSByYWdnZWQgdGVuc29yXG4gKiAgICAgKHRoZSBuYXR1cmFsIHNoYXBlKSB3aWxsIGJlIHVzZWQuIElmIHNvbWUgZGltZW5zaW9ucyBhcmUgbGVmdFxuICogICAgIHVuc3BlY2lmaWVkLCB0aGVuIHRoZSBzaXplIG9mIHRoZSBuYXR1cmFsIHNoYXBlIGlzIHVzZWQgaW4gdGhhdFxuICogICAgIGRpbWVuc2lvbi5cbiAqXG4gKiAgICAgTm90ZSB0aGF0IGRlbnNlIGRpbWVuc2lvbnMgY2Fubm90IGJlIG1vZGlmaWVkIGJ5IHRoZSBzaGFwZSBhcmd1bWVudC5cbiAqICAgICBUcnlpbmcgdG8gY2hhbmdlIHRoZSBzaXplIG9mIGEgZGVuc2UgZGltZW5zaW9uIHdpbGwgY2F1c2UgdGhlIG9wIHRvIGZhaWwuXG4gKiAgICAgRXhhbXBsZXM6IG5hdHVyYWwgc2hhcGU6IFs0LCA1LCA2XSBzaGFwZTogLTEgb3V0cHV0IHNoYXBlOiBbNCwgNSwgNl1cbiAqXG4gKiAgICAgbmF0dXJhbCBzaGFwZTogWzQsIDUsIDZdIHNoYXBlOiBbMywgLTEsIDJdIG91dHB1dCBzaGFwZTogWzMsIDUsIDJdXG4gKlxuICogICAgIG5hdHVyYWwgc2hhcGU6IFs0LCA1LCA2XSBzaGFwZTogWzMsIDcsIDJdIG91dHB1dCBzaGFwZTogWzMsIDcsIDJdXG4gKiBAcGFyYW0gdmFsdWVzOiBBIFRlbnNvci4gQSAxRCB0ZW5zb3IgcmVwcmVzZW50aW5nIHRoZSB2YWx1ZXMgb2YgdGhlIHJhZ2dlZFxuICogICAgIHRlbnNvci5cbiAqIEBwYXJhbSBkZWZhdWx0VmFsdWU6IEEgVGVuc29yLiBNdXN0IGhhdmUgdGhlIHNhbWUgdHlwZSBhcyB2YWx1ZXMuIFRoZVxuICogICAgIGRlZmF1bHRWYWx1ZSB3aGVuIHRoZSBzaGFwZSBpcyBsYXJnZXIgdGhhbiB0aGUgcmFnZ2VkIHRlbnNvci4gVGhlXG4gKiAgICAgZGVmYXVsdFZhbHVlIGlzIGJyb2FkY2FzdCB1bnRpbCBpdCBpcyB0aGUgc2hhcGUgb2YgdGhlIG91dHB1dCB0ZW5zb3IsXG4gKiAgICAgYW5kIHRoZW4gb3ZlcndyaXR0ZW4gYnkgdmFsdWVzIGluIHRoZSByYWdnZWQgdGVuc29yLiBUaGUgZGVmYXVsdCB2YWx1ZVxuICogICAgIG11c3QgYmUgY29tcGF0aWJsZSB3aXRoIHRoaXMgYnJvYWRjYXN0IG9wZXJhdGlvbiwgYW5kIG11c3QgaGF2ZSBmZXdlclxuICogICAgIGRpbWVuc2lvbnMgdGhhbiB0aGUgdmFsdWUgdGVuc29yLlxuICogQHBhcmFtIHJvd1BhcnRpdGlvblRlbnNvcnM6IEEgbGlzdCBvZiBhdCBsZWFzdCAxIFRlbnNvciBvYmplY3RzIHdpdGggdGhlIHNhbWVcbiAqICAgICB0eXBlIGluOiAnaW50MzInLlxuICogQHBhcmFtIHJvd1BhcnRpdGlvblR5cGVzOiBBIGxpc3Qgb2Ygc3RyaW5ncy4gVGhlIHR5cGVzIG9mIHRoZSByb3cgcGFydGl0aW9uXG4gKiAgICAgdGVuc29ycy4gQXQgcHJlc2VudCwgdGhlc2UgY2FuIGJlOlxuICogICAgIFwiUk9XX1NQTElUU1wiOiB0aGUgcm93X3NwbGl0cyB0ZW5zb3IgZnJvbSB0aGUgcmFnZ2VkIHRlbnNvci5cbiAqICAgICBcIlZBTFVFX1JPV0lEU1wiOiB0aGUgdmFsdWVfcm93aWRzIHRlbnNvciBmcm9tIHRoZSByYWdnZWQgdGVuc29yLlxuICogICAgIFwiRklSU1RfRElNX1NJWkVcIjogaWYgdmFsdWVfcm93aWRzIGlzIHVzZWQgZm9yIHRoZSBmaXJzdCBkaW1lbnNpb24sIHRoZW5cbiAqICAgICAgICAgaXQgaXMgcHJlY2VlZGVkIGJ5IFwiRklSU1RfRElNX1NJWkVcIi4gVGhlIHRlbnNvcnMgYXJlIGluIHRoZSBvcmRlciBvZlxuICogICAgICAgICB0aGUgZGltZW5zaW9ucy5cbiAqIEByZXR1cm4gQSBUZW5zb3IuIEhhcyB0aGUgc2FtZSB0eXBlIGFzIHZhbHVlcy5cbiAqIEBkb2Mge2hlYWRpbmc6ICdPcGVyYXRpb25zJywgc3ViaGVhZGluZzogJ1JhZ2dlZCd9XG4gKi9cbmZ1bmN0aW9uIHJhZ2dlZFRlbnNvclRvVGVuc29yXyhcbiAgICBzaGFwZTogVGVuc29yfFRlbnNvckxpa2UsIHZhbHVlczogVGVuc29yfFRlbnNvckxpa2UsXG4gICAgZGVmYXVsdFZhbHVlOiBUZW5zb3J8VGVuc29yTGlrZSwgcm93UGFydGl0aW9uVGVuc29yczogVGVuc29yW10sXG4gICAgcm93UGFydGl0aW9uVHlwZXM6IHN0cmluZ1tdKTogVGVuc29yIHtcbiAgY29uc3QgJHNoYXBlID1cbiAgICAgIGNvbnZlcnRUb1RlbnNvcihzaGFwZSwgJ3NoYXBlJywgJ3JhZ2dlZFRlbnNvclRvVGVuc29yJywgJ2ludDMyJyk7XG4gIGNvbnN0ICR2YWx1ZXMgPSBjb252ZXJ0VG9UZW5zb3IodmFsdWVzLCAndmFsdWVzJywgJ3JhZ2dlZFRlbnNvclRvVGVuc29yJyk7XG4gIGNvbnN0ICRkZWZhdWx0VmFsdWUgPSBjb252ZXJ0VG9UZW5zb3IoXG4gICAgICBkZWZhdWx0VmFsdWUsICdkZWZhdWx0VmFsdWUnLCAncmFnZ2VkVGVuc29yVG9UZW5zb3InLCAkdmFsdWVzLmR0eXBlKTtcbiAgY29uc3QgJHJvd1BhcnRpdGlvblRlbnNvcnMgPSByb3dQYXJ0aXRpb25UZW5zb3JzLm1hcChcbiAgICAgICh0LCBpKSA9PlxuICAgICAgICAgIGNvbnZlcnRUb1RlbnNvcih0LCBgdGVuc29ycyR7aX1gLCAncmFnZ2VkVGVuc29yVG9UZW5zb3InLCAnaW50MzInKSk7XG5cbiAgY29uc3QgaW5wdXRzOiBSYWdnZWRUZW5zb3JUb1RlbnNvcklucHV0cyA9IHtcbiAgICBzaGFwZTogJHNoYXBlLFxuICAgIHZhbHVlczogJHZhbHVlcyxcbiAgICBkZWZhdWx0VmFsdWU6ICRkZWZhdWx0VmFsdWUsXG4gICAgcm93UGFydGl0aW9uVGVuc29yczogJHJvd1BhcnRpdGlvblRlbnNvcnNcbiAgfTtcbiAgY29uc3QgYXR0cnM6IFJhZ2dlZFRlbnNvclRvVGVuc29yQXR0cnMgPSB7cm93UGFydGl0aW9uVHlwZXN9O1xuXG4gIHJldHVybiBFTkdJTkUucnVuS2VybmVsKFJhZ2dlZFRlbnNvclRvVGVuc29yLCBpbnB1dHMgYXMge30sIGF0dHJzIGFzIHt9KTtcbn1cblxuZXhwb3J0IGNvbnN0IHJhZ2dlZFRlbnNvclRvVGVuc29yID0gb3Aoe3JhZ2dlZFRlbnNvclRvVGVuc29yX30pO1xuIl19","/**\n * @license\n * Copyright 2020 Google LLC. All Rights Reserved.\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n * =============================================================================\n */\nimport { ENGINE } from '../engine';\nimport { sizeFromShape } from '../util';\nimport { op } from './operation';\n/**\n * Creates a `tf.Tensor` with values sampled from a random number generator\n * function defined by the user.\n *\n * @param shape An array of integers defining the output tensor shape.\n * @param randFunction A random number generator function which is called\n * for each element in the output tensor.\n * @param dtype The data type of the output tensor. Defaults to 'float32'.\n *\n * @doc {heading: 'Tensors', subheading: 'Random'}\n */\nfunction rand_(shape, randFunction, dtype) {\n const size = sizeFromShape(shape);\n let values = null;\n if (dtype == null || dtype === 'float32') {\n values = new Float32Array(size);\n }\n else if (dtype === 'int32') {\n values = new Int32Array(size);\n }\n else if (dtype === 'bool') {\n values = new Uint8Array(size);\n }\n else {\n throw new Error(`Unknown data type ${dtype}`);\n }\n for (let i = 0; i < size; i++) {\n values[i] = randFunction();\n }\n return ENGINE.makeTensor(values, shape, dtype);\n}\nexport const rand = op({ rand_ });\n//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicmFuZC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uLy4uL3RmanMtY29yZS9zcmMvb3BzL3JhbmQudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUE7Ozs7Ozs7Ozs7Ozs7OztHQWVHO0FBRUgsT0FBTyxFQUFDLE1BQU0sRUFBQyxNQUFNLFdBQVcsQ0FBQztBQUdqQyxPQUFPLEVBQUMsYUFBYSxFQUFDLE1BQU0sU0FBUyxDQUFDO0FBRXRDLE9BQU8sRUFBQyxFQUFFLEVBQUMsTUFBTSxhQUFhLENBQUM7QUFFL0I7Ozs7Ozs7Ozs7R0FVRztBQUNILFNBQVMsS0FBSyxDQUNWLEtBQWtCLEVBQUUsWUFBMEIsRUFDOUMsS0FBZ0I7SUFDbEIsTUFBTSxJQUFJLEdBQUcsYUFBYSxDQUFDLEtBQUssQ0FBQyxDQUFDO0lBQ2xDLElBQUksTUFBTSxHQUFHLElBQUksQ0FBQztJQUNsQixJQUFJLEtBQUssSUFBSSxJQUFJLElBQUksS0FBSyxLQUFLLFNBQVMsRUFBRTtRQUN4QyxNQUFNLEdBQUcsSUFBSSxZQUFZLENBQUMsSUFBSSxDQUFDLENBQUM7S0FDakM7U0FBTSxJQUFJLEtBQUssS0FBSyxPQUFPLEVBQUU7UUFDNUIsTUFBTSxHQUFHLElBQUksVUFBVSxDQUFDLElBQUksQ0FBQyxDQUFDO0tBQy9CO1NBQU0sSUFBSSxLQUFLLEtBQUssTUFBTSxFQUFFO1FBQzNCLE1BQU0sR0FBRyxJQUFJLFVBQVUsQ0FBQyxJQUFJLENBQUMsQ0FBQztLQUMvQjtTQUFNO1FBQ0wsTUFBTSxJQUFJLEtBQUssQ0FBQyxxQkFBcUIsS0FBSyxFQUFFLENBQUMsQ0FBQztLQUMvQztJQUNELEtBQUssSUFBSSxDQUFDLEdBQUcsQ0FBQyxFQUFFLENBQUMsR0FBRyxJQUFJLEVBQUUsQ0FBQyxFQUFFLEVBQUU7UUFDN0IsTUFBTSxDQUFDLENBQUMsQ0FBQyxHQUFHLFlBQVksRUFBRSxDQUFDO0tBQzVCO0lBQ0QsT0FBTyxNQUFNLENBQUMsVUFBVSxDQUFDLE1BQU0sRUFBRSxLQUFLLEVBQUUsS0FBSyxDQUFjLENBQUM7QUFDOUQsQ0FBQztBQUVELE1BQU0sQ0FBQyxNQUFNLElBQUksR0FBRyxFQUFFLENBQUMsRUFBQyxLQUFLLEVBQUMsQ0FBQyxDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiLyoqXG4gKiBAbGljZW5zZVxuICogQ29weXJpZ2h0IDIwMjAgR29vZ2xlIExMQy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC5cbiAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSBcIkxpY2Vuc2VcIik7XG4gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuXG4gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXRcbiAqXG4gKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjBcbiAqXG4gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlXG4gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiBcIkFTIElTXCIgQkFTSVMsXG4gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC5cbiAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmRcbiAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLlxuICogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbiAqL1xuXG5pbXBvcnQge0VOR0lORX0gZnJvbSAnLi4vZW5naW5lJztcbmltcG9ydCB7VGVuc29yfSBmcm9tICcuLi90ZW5zb3InO1xuaW1wb3J0IHtEYXRhVHlwZSwgUmFuaywgU2hhcGVNYXB9IGZyb20gJy4uL3R5cGVzJztcbmltcG9ydCB7c2l6ZUZyb21TaGFwZX0gZnJvbSAnLi4vdXRpbCc7XG5cbmltcG9ydCB7b3B9IGZyb20gJy4vb3BlcmF0aW9uJztcblxuLyoqXG4gKiBDcmVhdGVzIGEgYHRmLlRlbnNvcmAgd2l0aCB2YWx1ZXMgc2FtcGxlZCBmcm9tIGEgcmFuZG9tIG51bWJlciBnZW5lcmF0b3JcbiAqIGZ1bmN0aW9uIGRlZmluZWQgYnkgdGhlIHVzZXIuXG4gKlxuICogQHBhcmFtIHNoYXBlIEFuIGFycmF5IG9mIGludGVnZXJzIGRlZmluaW5nIHRoZSBvdXRwdXQgdGVuc29yIHNoYXBlLlxuICogQHBhcmFtIHJhbmRGdW5jdGlvbiBBIHJhbmRvbSBudW1iZXIgZ2VuZXJhdG9yIGZ1bmN0aW9uIHdoaWNoIGlzIGNhbGxlZFxuICogZm9yIGVhY2ggZWxlbWVudCBpbiB0aGUgb3V0cHV0IHRlbnNvci5cbiAqIEBwYXJhbSBkdHlwZSBUaGUgZGF0YSB0eXBlIG9mIHRoZSBvdXRwdXQgdGVuc29yLiBEZWZhdWx0cyB0byAnZmxvYXQzMicuXG4gKlxuICogQGRvYyB7aGVhZGluZzogJ1RlbnNvcnMnLCBzdWJoZWFkaW5nOiAnUmFuZG9tJ31cbiAqL1xuZnVuY3Rpb24gcmFuZF88UiBleHRlbmRzIFJhbms+KFxuICAgIHNoYXBlOiBTaGFwZU1hcFtSXSwgcmFuZEZ1bmN0aW9uOiAoKSA9PiBudW1iZXIsXG4gICAgZHR5cGU/OiBEYXRhVHlwZSk6IFRlbnNvcjxSPiB7XG4gIGNvbnN0IHNpemUgPSBzaXplRnJvbVNoYXBlKHNoYXBlKTtcbiAgbGV0IHZhbHVlcyA9IG51bGw7XG4gIGlmIChkdHlwZSA9PSBudWxsIHx8IGR0eXBlID09PSAnZmxvYXQzMicpIHtcbiAgICB2YWx1ZXMgPSBuZXcgRmxvYXQzMkFycmF5KHNpemUpO1xuICB9IGVsc2UgaWYgKGR0eXBlID09PSAnaW50MzInKSB7XG4gICAgdmFsdWVzID0gbmV3IEludDMyQXJyYXkoc2l6ZSk7XG4gIH0gZWxzZSBpZiAoZHR5cGUgPT09ICdib29sJykge1xuICAgIHZhbHVlcyA9IG5ldyBVaW50OEFycmF5KHNpemUpO1xuICB9IGVsc2Uge1xuICAgIHRocm93IG5ldyBFcnJvcihgVW5rbm93biBkYXRhIHR5cGUgJHtkdHlwZX1gKTtcbiAgfVxuICBmb3IgKGxldCBpID0gMDsgaSA8IHNpemU7IGkrKykge1xuICAgIHZhbHVlc1tpXSA9IHJhbmRGdW5jdGlvbigpO1xuICB9XG4gIHJldHVybiBFTkdJTkUubWFrZVRlbnNvcih2YWx1ZXMsIHNoYXBlLCBkdHlwZSkgYXMgVGVuc29yPFI+O1xufVxuXG5leHBvcnQgY29uc3QgcmFuZCA9IG9wKHtyYW5kX30pO1xuIl19","/**\n * @license\n * Copyright 2018 Google LLC. All Rights Reserved.\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n * =============================================================================\n */\nimport * as seedrandom from 'seedrandom';\nimport { expectNumbersClose, testEpsilon } from '../test_util';\n// https://en.wikipedia.org/wiki/Marsaglia_polar_method\nexport class MPRandGauss {\n constructor(mean, stdDeviation, dtype, truncated, seed) {\n this.mean = mean;\n this.stdDev = stdDeviation;\n this.dtype = dtype;\n this.nextVal = NaN;\n this.truncated = truncated;\n if (this.truncated) {\n this.upper = this.mean + this.stdDev * 2;\n this.lower = this.mean - this.stdDev * 2;\n }\n const seedValue = seed ? seed : Math.random();\n this.random = seedrandom.alea(seedValue.toString());\n }\n /** Returns next sample from a Gaussian distribution. */\n nextValue() {\n if (!isNaN(this.nextVal)) {\n const value = this.nextVal;\n this.nextVal = NaN;\n return value;\n }\n let resultX, resultY;\n let isValid = false;\n while (!isValid) {\n let v1, v2, s;\n do {\n v1 = 2 * this.random() - 1;\n v2 = 2 * this.random() - 1;\n s = v1 * v1 + v2 * v2;\n } while (s >= 1 || s === 0);\n const mul = Math.sqrt(-2.0 * Math.log(s) / s);\n resultX = this.mean + this.stdDev * v1 * mul;\n resultY = this.mean + this.stdDev * v2 * mul;\n if (!this.truncated || this.isValidTruncated(resultX)) {\n isValid = true;\n }\n }\n if (!this.truncated || this.isValidTruncated(resultY)) {\n this.nextVal = this.convertValue(resultY);\n }\n return this.convertValue(resultX);\n }\n /** Handles proper rounding for non-floating-point numbers. */\n convertValue(value) {\n if (this.dtype == null || this.dtype === 'float32') {\n return value;\n }\n return Math.round(value);\n }\n /** Returns true if less than 2-standard-deviations from the mean. */\n isValidTruncated(value) {\n return value <= this.upper && value >= this.lower;\n }\n}\n// Marsaglia, George, and Wai Wan Tsang. 2000. \"A Simple Method for Generating\n// Gamma Variables.\"\nexport class RandGamma {\n constructor(alpha, beta, dtype, seed) {\n this.alpha = alpha;\n this.beta = 1 / beta; // convert rate to scale parameter\n this.dtype = dtype;\n const seedValue = seed ? seed : Math.random();\n this.randu = seedrandom.alea(seedValue.toString());\n this.randn = new MPRandGauss(0, 1, dtype, false, this.randu());\n if (alpha < 1) {\n this.d = alpha + (2 / 3);\n }\n else {\n this.d = alpha - (1 / 3);\n }\n this.c = 1 / Math.sqrt(9 * this.d);\n }\n /** Returns next sample from a gamma distribution. */\n nextValue() {\n let x2, v0, v1, x, u, v;\n while (true) {\n do {\n x = this.randn.nextValue();\n v = 1 + (this.c * x);\n } while (v <= 0);\n v *= v * v;\n x2 = x * x;\n v0 = 1 - (0.331 * x2 * x2);\n v1 = (0.5 * x2) + (this.d * (1 - v + Math.log(v)));\n u = this.randu();\n if (u < v0 || Math.log(u) < v1) {\n break;\n }\n }\n v = (1 / this.beta) * this.d * v;\n if (this.alpha < 1) {\n v *= Math.pow(this.randu(), 1 / this.alpha);\n }\n return this.convertValue(v);\n }\n /** Handles proper rounding for non-floating-point numbers. */\n convertValue(value) {\n if (this.dtype === 'float32') {\n return value;\n }\n return Math.round(value);\n }\n}\nexport class UniformRandom {\n constructor(min = 0, max = 1, dtype, seed) {\n /** Handles proper rounding for non floating point numbers. */\n this.canReturnFloat = () => (this.dtype == null || this.dtype === 'float32');\n this.min = min;\n this.range = max - min;\n this.dtype = dtype;\n if (seed == null) {\n seed = Math.random();\n }\n if (typeof seed === 'number') {\n seed = seed.toString();\n }\n if (!this.canReturnFloat() && this.range <= 1) {\n throw new Error(`The difference between ${min} - ${max} <= 1 and dtype is not float`);\n }\n this.random = seedrandom.alea(seed);\n }\n convertValue(value) {\n if (this.canReturnFloat()) {\n return value;\n }\n return Math.round(value);\n }\n nextValue() {\n return this.convertValue(this.min + this.range * this.random());\n }\n}\nexport function jarqueBeraNormalityTest(values) {\n // https://en.wikipedia.org/wiki/Jarque%E2%80%93Bera_test\n const n = values.length;\n const s = skewness(values);\n const k = kurtosis(values);\n const jb = n / 6 * (Math.pow(s, 2) + 0.25 * Math.pow(k - 3, 2));\n // JB test requires 2-degress of freedom from Chi-Square @ 0.95:\n // http://www.itl.nist.gov/div898/handbook/eda/section3/eda3674.htm\n const CHI_SQUARE_2DEG = 5.991;\n if (jb > CHI_SQUARE_2DEG) {\n throw new Error(`Invalid p-value for JB: ${jb}`);\n }\n}\nexport function expectArrayInMeanStdRange(actual, expectedMean, expectedStdDev, epsilon) {\n if (epsilon == null) {\n epsilon = testEpsilon();\n }\n const actualMean = mean(actual);\n expectNumbersClose(actualMean, expectedMean, epsilon);\n expectNumbersClose(standardDeviation(actual, actualMean), expectedStdDev, epsilon);\n}\nfunction mean(values) {\n let sum = 0;\n for (let i = 0; i < values.length; i++) {\n sum += values[i];\n }\n return sum / values.length;\n}\nfunction standardDeviation(values, mean) {\n let squareDiffSum = 0;\n for (let i = 0; i < values.length; i++) {\n const diff = values[i] - mean;\n squareDiffSum += diff * diff;\n }\n return Math.sqrt(squareDiffSum / values.length);\n}\nfunction kurtosis(values) {\n // https://en.wikipedia.org/wiki/Kurtosis\n const valuesMean = mean(values);\n const n = values.length;\n let sum2 = 0;\n let sum4 = 0;\n for (let i = 0; i < n; i++) {\n const v = values[i] - valuesMean;\n sum2 += Math.pow(v, 2);\n sum4 += Math.pow(v, 4);\n }\n return (1 / n) * sum4 / Math.pow((1 / n) * sum2, 2);\n}\nfunction skewness(values) {\n // https://en.wikipedia.org/wiki/Skewness\n const valuesMean = mean(values);\n const n = values.length;\n let sum2 = 0;\n let sum3 = 0;\n for (let i = 0; i < n; i++) {\n const v = values[i] - valuesMean;\n sum2 += Math.pow(v, 2);\n sum3 += Math.pow(v, 3);\n }\n return (1 / n) * sum3 / Math.pow((1 / (n - 1)) * sum2, 3 / 2);\n}\n//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicmFuZF91dGlsLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vLi4vdGZqcy1jb3JlL3NyYy9vcHMvcmFuZF91dGlsLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBOzs7Ozs7Ozs7Ozs7Ozs7R0FlRztBQUVILE9BQU8sS0FBSyxVQUFVLE1BQU0sWUFBWSxDQUFDO0FBRXpDLE9BQU8sRUFBQyxrQkFBa0IsRUFBRSxXQUFXLEVBQUMsTUFBTSxjQUFjLENBQUM7QUFxQjdELHVEQUF1RDtBQUN2RCxNQUFNLE9BQU8sV0FBVztJQVV0QixZQUNJLElBQVksRUFBRSxZQUFvQixFQUFFLEtBQWlDLEVBQ3JFLFNBQW1CLEVBQUUsSUFBYTtRQUNwQyxJQUFJLENBQUMsSUFBSSxHQUFHLElBQUksQ0FBQztRQUNqQixJQUFJLENBQUMsTUFBTSxHQUFHLFlBQVksQ0FBQztRQUMzQixJQUFJLENBQUMsS0FBSyxHQUFHLEtBQUssQ0FBQztRQUNuQixJQUFJLENBQUMsT0FBTyxHQUFHLEdBQUcsQ0FBQztRQUNuQixJQUFJLENBQUMsU0FBUyxHQUFHLFNBQVMsQ0FBQztRQUMzQixJQUFJLElBQUksQ0FBQyxTQUFTLEVBQUU7WUFDbEIsSUFBSSxDQUFDLEtBQUssR0FBRyxJQUFJLENBQUMsSUFBSSxHQUFHLElBQUksQ0FBQyxNQUFNLEdBQUcsQ0FBQyxDQUFDO1lBQ3pDLElBQUksQ0FBQyxLQUFLLEdBQUcsSUFBSSxDQUFDLElBQUksR0FBRyxJQUFJLENBQUMsTUFBTSxHQUFHLENBQUMsQ0FBQztTQUMxQztRQUNELE1BQU0sU0FBUyxHQUFHLElBQUksQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsTUFBTSxFQUFFLENBQUM7UUFDOUMsSUFBSSxDQUFDLE1BQU0sR0FBRyxVQUFVLENBQUMsSUFBSSxDQUFDLFNBQVMsQ0FBQyxRQUFRLEVBQUUsQ0FBQyxDQUFDO0lBQ3RELENBQUM7SUFFRCx3REFBd0Q7SUFD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QUFNLENBQUMsQ0FBQztJQUNoQyxNQUFNLENBQUMsR0FBRyxNQUFNLENBQUMsTUFBTSxDQUFDO0lBQ3hCLElBQUksSUFBSSxHQUFHLENBQUMsQ0FBQztJQUNiLElBQUksSUFBSSxHQUFHLENBQUMsQ0FBQztJQUNiLEtBQUssSUFBSSxDQUFDLEdBQUcsQ0FBQyxFQUFFLENBQUMsR0FBRyxDQUFDLEVBQUUsQ0FBQyxFQUFFLEVBQUU7UUFDMUIsTUFBTSxDQUFDLEdBQUcsTUFBTSxDQUFDLENBQUMsQ0FBQyxHQUFHLFVBQVUsQ0FBQztRQUNqQyxJQUFJLElBQUksSUFBSSxDQUFDLEdBQUcsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUM7UUFDdkIsSUFBSSxJQUFJLElBQUksQ0FBQyxHQUFHLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDO0tBQ3hCO0lBQ0QsT0FBTyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsR0FBRyxJQUFJLEdBQUcsSUFBSSxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxHQUFHLElBQUksRUFBRSxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUM7QUFDaEUsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbIi8qKlxuICogQGxpY2Vuc2VcbiAqIENvcHlyaWdodCAyMDE4IEdvb2dsZSBMTEMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuXG4gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgXCJMaWNlbnNlXCIpO1xuICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLlxuICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0XG4gKlxuICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wXG4gKlxuICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZVxuICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gXCJBUyBJU1wiIEJBU0lTLFxuICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuXG4gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kXG4gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS5cbiAqID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4gKi9cblxuaW1wb3J0ICogYXMgc2VlZHJhbmRvbSBmcm9tICdzZWVkcmFuZG9tJztcblxuaW1wb3J0IHtleHBlY3ROdW1iZXJzQ2xvc2UsIHRlc3RFcHNpbG9ufSBmcm9tICcuLi90ZXN0X3V0aWwnO1xuaW1wb3J0IHtUeXBlZEFycmF5fSBmcm9tICcuLi90eXBlcyc7XG5cbmV4cG9ydCBpbnRlcmZhY2UgUmFuZG9tQmFzZSB7XG4gIG5leHRWYWx1ZSgpOiBudW1iZXI7XG59XG5cbmV4cG9ydCBpbnRlcmZhY2UgUmFuZG9tR2FtbWEge1xuICBuZXh0VmFsdWUoKTogbnVtYmVyO1xufVxuXG5leHBvcnQgaW50ZXJmYWNlIFJhbmROb3JtYWxEYXRhVHlwZXMge1xuICBmbG9hdDMyOiBGbG9hdDMyQXJyYXk7XG4gIGludDMyOiBJbnQzMkFycmF5O1xufVxuXG5leHBvcnQgaW50ZXJmYWNlIFJhbmRHYW1tYURhdGFUeXBlcyB7XG4gIGZsb2F0MzI6IEZsb2F0MzJBcnJheTtcbiAgaW50MzI6IEludDMyQXJyYXk7XG59XG5cbi8vIGh0dHBzOi8vZW4ud2lraXBlZGlhLm9yZy93aWtpL01hcnNhZ2xpYV9wb2xhcl9tZXRob2RcbmV4cG9ydCBjbGFzcyBNUFJhbmRHYXVzcyBpbXBsZW1lbnRzIFJhbmRvbUJhc2Uge1xuICBwcml2YXRlIG1lYW46IG51bWJlcjtcbiAgcHJpdmF0ZSBzdGREZXY6IG51bWJlcjtcbiAgcHJpdmF0ZSBuZXh0VmFsOiBudW1iZXI7XG4gIHByaXZhdGUgZHR5cGU/OiBrZXlvZiBSYW5kTm9ybWFsRGF0YVR5cGVzO1xuICBwcml2YXRlIHRydW5jYXRlZD86IGJvb2xlYW47XG4gIHByaXZhdGUgdXBwZXI/OiBudW1iZXI7XG4gIHByaXZhdGUgbG93ZXI/OiBudW1iZXI7XG4gIHByaXZhdGUgcmFuZG9tOiBzZWVkcmFuZG9tLnBybmc7XG5cbiAgY29uc3RydWN0b3IoXG4gICAgICBtZWFuOiBudW1iZXIsIHN0ZERldmlhdGlvbjogbnVtYmVyLCBkdHlwZT86IGtleW9mIFJhbmROb3JtYWxEYXRhVHlwZXMsXG4gICAgICB0cnVuY2F0ZWQ/OiBib29sZWFuLCBzZWVkPzogbnVtYmVyKSB7XG4gICAgdGhpcy5tZWFuID0gbWVhbjtcbiAgICB0aGlzLnN0ZERldiA9IHN0ZERldmlhdGlvbjtcbiAgICB0aGlzLmR0eXBlID0gZHR5cGU7XG4gICAgdGhpcy5uZXh0VmFsID0gTmFOO1xuICAgIHRoaXMudHJ1bmNhdGVkID0gdHJ1bmNhdGVkO1xuICAgIGlmICh0aGlzLnRydW5jYXRlZCkge1xuICAgICAgdGhpcy51cHBlciA9IHRoaXMubWVhbiArIHRoaXMuc3RkRGV2ICogMjtcbiAgICAgIHRoaXMubG93ZXIgPSB0aGlzLm1lYW4gLSB0aGlzLnN0ZERldiAqIDI7XG4gICAgfVxuICAgIGNvbnN0IHNlZWRWYWx1ZSA9IHNlZWQgPyBzZWVkIDogTWF0aC5yYW5kb20oKTtcbiAgICB0aGlzLnJhbmRvbSA9IHNlZWRyYW5kb20uYWxlYShzZWVkVmFsdWUudG9TdHJpbmcoKSk7XG4gIH1cblxuICAvKiogUmV0dXJucyBuZXh0IHNhbXBsZSBmcm9tIGEgR2F1c3NpYW4gZGlzdHJpYnV0aW9uLiAqL1xuICBwdWJsaWMgbmV4dFZhbHVlKCk6IG51bWJlciB7XG4gICAgaWYgKCFpc05hTih0aGlzLm5leHRWYWwpKSB7XG4gICAgICBjb25zdCB2YWx1ZSA9IHRoaXMubmV4dFZhbDtcbiAgICAgIHRoaXMubmV4dFZhbCA9IE5hTjtcbiAgICAgIHJldHVybiB2YWx1ZTtcbiAgICB9XG5cbiAgICBsZXQgcmVzdWx0WDogbnVtYmVyLCByZXN1bHRZOiBudW1iZXI7XG4gICAgbGV0IGlzVmFsaWQgPSBmYWxzZTtcbiAgICB3aGlsZSAoIWlzVmFsaWQpIHtcbiAgICAgIGxldCB2MTogbnVtYmVyLCB2MjogbnVtYmVyLCBzOiBudW1iZXI7XG4gICAgICBkbyB7XG4gICAgICAgIHYxID0gMiAqIHRoaXMucmFuZG9tKCkgLSAxO1xuICAgICAgICB2MiA9IDIgKiB0aGlzLnJhbmRvbSgpIC0gMTtcbiAgICAgICAgcyA9IHYxICogdjEgKyB2MiAqIHYyO1xuICAgICAgfSB3aGlsZSAocyA+PSAxIHx8IHMgPT09IDApO1xuXG4gICAgICBjb25zdCBtdWwgPSBNYXRoLnNxcnQoLTIuMCAqIE1hdGgubG9nKHMpIC8gcyk7XG4gICAgICByZXN1bHRYID0gdGhpcy5tZWFuICsgdGhpcy5zdGREZXYgKiB2MSAqIG11bDtcbiAgICAgIHJlc3VsdFkgPSB0aGlzLm1lYW4gKyB0aGlzLnN0ZERldiAqIHYyICogbXVsO1xuXG4gICAgICBpZiAoIXRoaXMudHJ1bmNhdGVkIHx8IHRoaXMuaXNWYWxpZFRydW5jYXRlZChyZXN1bHRYKSkge1xuICAgICAgICBpc1ZhbGlkID0gdHJ1ZTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICBpZiAoIXRoaXMudHJ1bmNhdGVkIHx8IHRoaXMuaXNWYWxpZFRydW5jYXRlZChyZXN1bHRZKSkge1xuICAgICAgdGhpcy5uZXh0VmFsID0gdGhpcy5jb252ZXJ0VmFsdWUocmVzdWx0WSk7XG4gICAgfVxuICAgIHJldHVybiB0aGlzLmNvbnZlcnRWYWx1ZShyZXN1bHRYKTtcbiAgfVxuXG4gIC8qKiBIYW5kbGVzIHByb3BlciByb3VuZGluZyBmb3Igbm9uLWZsb2F0aW5nLXBvaW50IG51bWJlcnMuICovXG4gIHByaXZhdGUgY29udmVydFZhbHVlKHZhbHVlOiBudW1iZXIpOiBudW1iZXIge1xuICAgIGlmICh0aGlzLmR0eXBlID09IG51bGwgfHwgdGhpcy5kdHlwZSA9PT0gJ2Zsb2F0MzInKSB7XG4gICAgICByZXR1cm4gdmFsdWU7XG4gICAgfVxuICAgIHJldHVybiBNYXRoLnJvdW5kKHZhbHVlKTtcbiAgfVxuXG4gIC8qKiBSZXR1cm5zIHRydWUgaWYgbGVzcyB0aGFuIDItc3RhbmRhcmQtZGV2aWF0aW9ucyBmcm9tIHRoZSBtZWFuLiAqL1xuICBwcml2YXRlIGlzVmFsaWRUcnVuY2F0ZWQodmFsdWU6IG51bWJlcik6IGJvb2xlYW4ge1xuICAgIHJldHVybiB2YWx1ZSA8PSB0aGlzLnVwcGVyICYmIHZhbHVlID49IHRoaXMubG93ZXI7XG4gIH1cbn1cblxuLy8gTWFyc2FnbGlhLCBHZW9yZ2UsIGFuZCBXYWkgV2FuIFRzYW5nLiAyMDAwLiBcIkEgU2ltcGxlIE1ldGhvZCBmb3IgR2VuZXJhdGluZ1xuLy8gR2FtbWEgVmFyaWFibGVzLlwiXG5leHBvcnQgY2xhc3MgUmFuZEdhbW1hIGltcGxlbWVudHMgUmFuZG9tR2FtbWEge1xuICBwcml2YXRlIGFscGhhOiBudW1iZXI7XG4gIHByaXZhdGUgYmV0YTogbnVtYmVyO1xuICBwcml2YXRlIGQ6IG51bWJlcjtcbiAgcHJpdmF0ZSBjOiBudW1iZXI7XG4gIHByaXZhdGUgZHR5cGU/OiBrZXlvZiBSYW5kR2FtbWFEYXRhVHlwZXM7XG4gIHByaXZhdGUgcmFuZHU6IHNlZWRyYW5kb20ucHJuZztcbiAgcHJpdmF0ZSByYW5kbjogTVBSYW5kR2F1c3M7XG5cbiAgY29uc3RydWN0b3IoXG4gICAgICBhbHBoYTogbnVtYmVyLCBiZXRhOiBudW1iZXIsIGR0eXBlOiBrZXlvZiBSYW5kR2FtbWFEYXRhVHlwZXMsXG4gICAgICBzZWVkPzogbnVtYmVyKSB7XG4gICAgdGhpcy5hbHBoYSA9IGFscGhhO1xuICAgIHRoaXMuYmV0YSA9IDEgLyBiZXRhOyAgLy8gY29udmVydCByYXRlIHRvIHNjYWxlIHBhcmFtZXRlclxuICAgIHRoaXMuZHR5cGUgPSBkdHlwZTtcblxuICAgIGNvbnN0IHNlZWRWYWx1ZSA9IHNlZWQgPyBzZWVkIDogTWF0aC5yYW5kb20oKTtcbiAgICB0aGlzLnJhbmR1ID0gc2VlZHJhbmRvbS5hbGVhKHNlZWRWYWx1ZS50b1N0cmluZygpKTtcbiAgICB0aGlzLnJhbmRuID0gbmV3IE1QUmFuZEdhdXNzKDAsIDEsIGR0eXBlLCBmYWxzZSwgdGhpcy5yYW5kdSgpKTtcblxuICAgIGlmIChhbHBoYSA8IDEpIHtcbiAgICAgIHRoaXMuZCA9IGFscGhhICsgKDIgLyAzKTtcbiAgICB9IGVsc2Uge1xuICAgICAgdGhpcy5kID0gYWxwaGEgLSAoMSAvIDMpO1xuICAgIH1cbiAgICB0aGlzLmMgPSAxIC8gTWF0aC5zcXJ0KDkgKiB0aGlzLmQpO1xuICB9XG5cbiAgLyoqIFJldHVybnMgbmV4dCBzYW1wbGUgZnJvbSBhIGdhbW1hIGRpc3RyaWJ1dGlvbi4gKi9cbiAgcHVibGljIG5leHRWYWx1ZSgpOiBudW1iZXIge1xuICAgIGxldCB4MjogbnVtYmVyLCB2MDogbnVtYmVyLCB2MTogbnVtYmVyLCB4OiBudW1iZXIsIHU6IG51bWJlciwgdjogbnVtYmVyO1xuICAgIHdoaWxlICh0cnVlKSB7XG4gICAgICBkbyB7XG4gICAgICAgIHggPSB0aGlzLnJhbmRuLm5leHRWYWx1ZSgpO1xuICAgICAgICB2ID0gMSArICh0aGlzLmMgKiB4KTtcbiAgICAgIH0gd2hpbGUgKHYgPD0gMCk7XG4gICAgICB2ICo9IHYgKiB2O1xuICAgICAgeDIgPSB4ICogeDtcbiAgICAgIHYwID0gMSAtICgwLjMzMSAqIHgyICogeDIpO1xuICAgICAgdjEgPSAoMC41ICogeDIpICsgKHRoaXMuZCAqICgxIC0gdiArIE1hdGgubG9nKHYpKSk7XG4gICAgICB1ID0gdGhpcy5yYW5kdSgpO1xuICAgICAgaWYgKHUgPCB2MCB8fCBNYXRoLmxvZyh1KSA8IHYxKSB7XG4gICAgICAgIGJyZWFrO1xuICAgICAgfVxuICAgIH1cbiAgICB2ID0gKDEgLyB0aGlzLmJldGEpICogdGhpcy5kICogdjtcbiAgICBpZiAodGhpcy5hbHBoYSA8IDEpIHtcbiAgICAgIHYgKj0gTWF0aC5wb3codGhpcy5yYW5kdSgpLCAxIC8gdGhpcy5hbHBoYSk7XG4gICAgfVxuICAgIHJldHVybiB0aGlzLmNvbnZlcnRWYWx1ZSh2KTtcbiAgfVxuICAvKiogSGFuZGxlcyBwcm9wZXIgcm91bmRpbmcgZm9yIG5vbi1mbG9hdGluZy1wb2ludCBudW1iZXJzLiAqL1xuICBwcml2YXRlIGNvbnZlcnRWYWx1ZSh2YWx1ZTogbnVtYmVyKTogbnVtYmVyIHtcbiAgICBpZiAodGhpcy5kdHlwZSA9PT0gJ2Zsb2F0MzInKSB7XG4gICAgICByZXR1cm4gdmFsdWU7XG4gICAgfVxuICAgIHJldHVybiBNYXRoLnJvdW5kKHZhbHVlKTtcbiAgfVxufVxuXG5leHBvcnQgY2xhc3MgVW5pZm9ybVJhbmRvbSBpbXBsZW1lbnRzIFJhbmRvbUJhc2Uge1xuICBwcml2YXRlIG1pbjogbnVtYmVyO1xuICBwcml2YXRlIHJhbmdlOiBudW1iZXI7XG4gIHByaXZhdGUgcmFuZG9tOiBzZWVkcmFuZG9tLnBybmc7XG4gIHByaXZhdGUgZHR5cGU/OiBrZXlvZiBSYW5kTm9ybWFsRGF0YVR5cGVzO1xuXG4gIGNvbnN0cnVjdG9yKFxuICAgICAgbWluID0gMCwgbWF4ID0gMSwgZHR5cGU/OiBrZXlvZiBSYW5kTm9ybWFsRGF0YVR5cGVzLFxuICAgICAgc2VlZD86IHN0cmluZ3xudW1iZXIpIHtcbiAgICB0aGlzLm1pbiA9IG1pbjtcbiAgICB0aGlzLnJhbmdlID0gbWF4IC0gbWluO1xuICAgIHRoaXMuZHR5cGUgPSBkdHlwZTtcbiAgICBpZiAoc2VlZCA9PSBudWxsKSB7XG4gICAgICBzZWVkID0gTWF0aC5yYW5kb20oKTtcbiAgICB9XG4gICAgaWYgKHR5cGVvZiBzZWVkID09PSAnbnVtYmVyJykge1xuICAgICAgc2VlZCA9IHNlZWQudG9TdHJpbmcoKTtcbiAgICB9XG5cbiAgICBpZiAoIXRoaXMuY2FuUmV0dXJuRmxvYXQoKSAmJiB0aGlzLnJhbmdlIDw9IDEpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcihcbiAgICAgICAgICBgVGhlIGRpZmZlcmVuY2UgYmV0d2VlbiAke21pbn0gLSAke21heH0gPD0gMSBhbmQgZHR5cGUgaXMgbm90IGZsb2F0YCk7XG4gICAgfVxuICAgIHRoaXMucmFuZG9tID0gc2VlZHJhbmRvbS5hbGVhKHNlZWQpO1xuICB9XG5cbiAgLyoqIEhhbmRsZXMgcHJvcGVyIHJvdW5kaW5nIGZvciBub24gZmxvYXRpbmcgcG9pbnQgbnVtYmVycy4gKi9cbiAgcHJpdmF0ZSBjYW5SZXR1cm5GbG9hdCA9ICgpID0+XG4gICAgICAodGhpcy5kdHlwZSA9PSBudWxsIHx8IHRoaXMuZHR5cGUgPT09ICdmbG9hdDMyJyk7XG5cbiAgcHJpdmF0ZSBjb252ZXJ0VmFsdWUodmFsdWU6IG51bWJlcik6IG51bWJlciB7XG4gICAgaWYgKHRoaXMuY2FuUmV0dXJuRmxvYXQoKSkge1xuICAgICAgcmV0dXJuIHZhbHVlO1xuICAgIH1cbiAgICByZXR1cm4gTWF0aC5yb3VuZCh2YWx1ZSk7XG4gIH1cblxuICBuZXh0VmFsdWUoKSB7XG4gICAgcmV0dXJuIHRoaXMuY29udmVydFZhbHVlKHRoaXMubWluICsgdGhpcy5yYW5nZSAqIHRoaXMucmFuZG9tKCkpO1xuICB9XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBqYXJxdWVCZXJhTm9ybWFsaXR5VGVzdCh2YWx1ZXM6IFR5cGVkQXJyYXl8bnVtYmVyW10pIHtcbiAgLy8gaHR0cHM6Ly9lbi53aWtpcGVkaWEub3JnL3dpa2kvSmFycXVlJUUyJTgwJTkzQmVyYV90ZXN0XG4gIGNvbnN0IG4gPSB2YWx1ZXMubGVuZ3RoO1xuICBjb25zdCBzID0gc2tld25lc3ModmFsdWVzKTtcbiAgY29uc3QgayA9IGt1cnRvc2lzKHZhbHVlcyk7XG4gIGNvbnN0IGpiID0gbiAvIDYgKiAoTWF0aC5wb3cocywgMikgKyAwLjI1ICogTWF0aC5wb3coayAtIDMsIDIpKTtcbiAgLy8gSkIgdGVzdCByZXF1aXJlcyAyLWRlZ3Jlc3Mgb2YgZnJlZWRvbSBmcm9tIENoaS1TcXVhcmUgQCAwLjk1OlxuICAvLyBodHRwOi8vd3d3Lml0bC5uaXN0Lmdvdi9kaXY4OTgvaGFuZGJvb2svZWRhL3NlY3Rpb24zL2VkYTM2NzQuaHRtXG4gIGNvbnN0IENISV9TUVVBUkVfMkRFRyA9IDUuOTkxO1xuICBpZiAoamIgPiBDSElfU1FVQVJFXzJERUcpIHtcbiAgICB0aHJvdyBuZXcgRXJyb3IoYEludmFsaWQgcC12YWx1ZSBmb3IgSkI6ICR7amJ9YCk7XG4gIH1cbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGV4cGVjdEFycmF5SW5NZWFuU3RkUmFuZ2UoXG4gICAgYWN0dWFsOiBUeXBlZEFycmF5fG51bWJlcltdLCBleHBlY3RlZE1lYW46IG51bWJlciwgZXhwZWN0ZWRTdGREZXY6IG51bWJlcixcbiAgICBlcHNpbG9uPzogbnVtYmVyKSB7XG4gIGlmIChlcHNpbG9uID09IG51bGwpIHtcbiAgICBlcHNpbG9uID0gdGVzdEVwc2lsb24oKTtcbiAgfVxuICBjb25zdCBhY3R1YWxNZWFuID0gbWVhbihhY3R1YWwpO1xuICBleHBlY3ROdW1iZXJzQ2xvc2UoYWN0dWFsTWVhbiwgZXhwZWN0ZWRNZWFuLCBlcHNpbG9uKTtcbiAgZXhwZWN0TnVtYmVyc0Nsb3NlKFxuICAgICAgc3RhbmRhcmREZXZpYXRpb24oYWN0dWFsLCBhY3R1YWxNZWFuKSwgZXhwZWN0ZWRTdGREZXYsIGVwc2lsb24pO1xufVxuXG5mdW5jdGlvbiBtZWFuKHZhbHVlczogVHlwZWRBcnJheXxudW1iZXJbXSkge1xuICBsZXQgc3VtID0gMDtcbiAgZm9yIChsZXQgaSA9IDA7IGkgPCB2YWx1ZXMubGVuZ3RoOyBpKyspIHtcbiAgICBzdW0gKz0gdmFsdWVzW2ldO1xuICB9XG4gIHJldHVybiBzdW0gLyB2YWx1ZXMubGVuZ3RoO1xufVxuXG5mdW5jdGlvbiBzdGFuZGFyZERldmlhdGlvbih2YWx1ZXM6IFR5cGVkQXJyYXl8bnVtYmVyW10sIG1lYW46IG51bWJlcikge1xuICBsZXQgc3F1YXJlRGlmZlN1bSA9IDA7XG4gIGZvciAobGV0IGkgPSAwOyBpIDwgdmFsdWVzLmxlbmd0aDsgaSsrKSB7XG4gICAgY29uc3QgZGlmZiA9IHZhbHVlc1tpXSAtIG1lYW47XG4gICAgc3F1YXJlRGlmZlN1bSArPSBkaWZmICogZGlmZjtcbiAgfVxuICByZXR1cm4gTWF0aC5zcXJ0KHNxdWFyZURpZmZTdW0gLyB2YWx1ZXMubGVuZ3RoKTtcbn1cblxuZnVuY3Rpb24ga3VydG9zaXModmFsdWVzOiBUeXBlZEFycmF5fG51bWJlcltdKSB7XG4gIC8vIGh0dHBzOi8vZW4ud2lraXBlZGlhLm9yZy93aWtpL0t1cnRvc2lzXG4gIGNvbnN0IHZhbHVlc01lYW4gPSBtZWFuKHZhbHVlcyk7XG4gIGNvbnN0IG4gPSB2YWx1ZXMubGVuZ3RoO1xuICBsZXQgc3VtMiA9IDA7XG4gIGxldCBzdW00ID0gMDtcbiAgZm9yIChsZXQgaSA9IDA7IGkgPCBuOyBpKyspIHtcbiAgICBjb25zdCB2ID0gdmFsdWVzW2ldIC0gdmFsdWVzTWVhbjtcbiAgICBzdW0yICs9IE1hdGgucG93KHYsIDIpO1xuICAgIHN1bTQgKz0gTWF0aC5wb3codiwgNCk7XG4gIH1cbiAgcmV0dXJuICgxIC8gbikgKiBzdW00IC8gTWF0aC5wb3coKDEgLyBuKSAqIHN1bTIsIDIpO1xufVxuXG5mdW5jdGlvbiBza2V3bmVzcyh2YWx1ZXM6IFR5cGVkQXJyYXl8bnVtYmVyW10pIHtcbiAgLy8gaHR0cHM6Ly9lbi53aWtpcGVkaWEub3JnL3dpa2kvU2tld25lc3NcbiAgY29uc3QgdmFsdWVzTWVhbiA9IG1lYW4odmFsdWVzKTtcbiAgY29uc3QgbiA9IHZhbHVlcy5sZW5ndGg7XG4gIGxldCBzdW0yID0gMDtcbiAgbGV0IHN1bTMgPSAwO1xuICBmb3IgKGxldCBpID0gMDsgaSA8IG47IGkrKykge1xuICAgIGNvbnN0IHYgPSB2YWx1ZXNbaV0gLSB2YWx1ZXNNZWFuO1xuICAgIHN1bTIgKz0gTWF0aC5wb3codiwgMik7XG4gICAgc3VtMyArPSBNYXRoLnBvdyh2LCAzKTtcbiAgfVxuICByZXR1cm4gKDEgLyBuKSAqIHN1bTMgLyBNYXRoLnBvdygoMSAvIChuIC0gMSkpICogc3VtMiwgMyAvIDIpO1xufVxuIl19","/**\n * @license\n * Copyright 2020 Google LLC. All Rights Reserved.\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n * =============================================================================\n */\nimport { buffer } from './buffer';\nimport { op } from './operation';\nimport { RandGamma } from './rand_util';\n/**\n * Creates a `tf.Tensor` with values sampled from a gamma distribution.\n *\n * ```js\n * tf.randomGamma([2, 2], 1).print();\n * ```\n *\n * @param shape An array of integers defining the output tensor shape.\n * @param alpha The shape parameter of the gamma distribution.\n * @param beta The inverse scale parameter of the gamma distribution. Defaults\n * to 1.\n * @param dtype The data type of the output. Defaults to float32.\n * @param seed The seed for the random number generator.\n *\n * @doc {heading: 'Tensors', subheading: 'Random'}\n */\nfunction randomGamma_(shape, alpha, beta = 1, dtype = 'float32', seed) {\n if (beta == null) {\n beta = 1;\n }\n if (dtype == null) {\n dtype = 'float32';\n }\n if (dtype !== 'float32' && dtype !== 'int32') {\n throw new Error(`Unsupported data type ${dtype}`);\n }\n const rgamma = new RandGamma(alpha, beta, dtype, seed);\n const res = buffer(shape, dtype);\n for (let i = 0; i < res.values.length; i++) {\n res.values[i] = rgamma.nextValue();\n }\n return res.toTensor();\n}\nexport const randomGamma = op({ randomGamma_ });\n//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicmFuZG9tX2dhbW1hLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vLi4vdGZqcy1jb3JlL3NyYy9vcHMvcmFuZG9tX2dhbW1hLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBOzs7Ozs7Ozs7Ozs7Ozs7R0FlRztBQUtILE9BQU8sRUFBQyxNQUFNLEVBQUMsTUFBTSxVQUFVLENBQUM7QUFDaEMsT0FBTyxFQUFDLEVBQUUsRUFBQyxNQUFNLGFBQWEsQ0FBQztBQUMvQixPQUFPLEVBQUMsU0FBUyxFQUFDLE1BQU0sYUFBYSxDQUFDO0FBRXRDOzs7Ozs7Ozs7Ozs7Ozs7R0FlRztBQUNILFNBQVMsWUFBWSxDQUNqQixLQUFrQixFQUFFLEtBQWEsRUFBRSxJQUFJLEdBQUcsQ0FBQyxFQUMzQyxRQUEyQixTQUFTLEVBQUUsSUFBYTtJQUNyRCxJQUFJLElBQUksSUFBSSxJQUFJLEVBQUU7UUFDaEIsSUFBSSxHQUFHLENBQUMsQ0FBQztLQUNWO0lBQ0QsSUFBSSxLQUFLLElBQUksSUFBSSxFQUFFO1FBQ2pCLEtBQUssR0FBRyxTQUFTLENBQUM7S0FDbkI7SUFDRCxJQUFJLEtBQUssS0FBSyxTQUFTLElBQUksS0FBSyxLQUFLLE9BQU8sRUFBRTtRQUM1QyxNQUFNLElBQUksS0FBSyxDQUFDLHlCQUF5QixLQUFLLEVBQUUsQ0FBQyxDQUFDO0tBQ25EO0lBQ0QsTUFBTSxNQUFNLEdBQUcsSUFBSSxTQUFTLENBQUMsS0FBSyxFQUFFLElBQUksRUFBRSxLQUFLLEVBQUUsSUFBSSxDQUFDLENBQUM7SUFDdkQsTUFBTSxHQUFHLEdBQUcsTUFBTSxDQUFDLEtBQUssRUFBRSxLQUFLLENBQUMsQ0FBQztJQUNqQyxLQUFLLElBQUksQ0FBQyxHQUFHLENBQUMsRUFBRSxDQUFDLEdBQUcsR0FBRyxDQUFDLE1BQU0sQ0FBQyxNQUFNLEVBQUUsQ0FBQyxFQUFFLEVBQUU7UUFDMUMsR0FBRyxDQUFDLE1BQU0sQ0FBQyxDQUFDLENBQUMsR0FBRyxNQUFNLENBQUMsU0FBUyxFQUFFLENBQUM7S0FDcEM7SUFDRCxPQUFPLEdBQUcsQ0FBQyxRQUFRLEVBQUUsQ0FBQztBQUN4QixDQUFDO0FBRUQsTUFBTSxDQUFDLE1BQU0sV0FBVyxHQUFHLEVBQUUsQ0FBQyxFQUFDLFlBQVksRUFBQyxDQUFDLENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyIvKipcbiAqIEBsaWNlbnNlXG4gKiBDb3B5cmlnaHQgMjAyMCBHb29nbGUgTExDLiBBbGwgUmlnaHRzIFJlc2VydmVkLlxuICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlIFwiTGljZW5zZVwiKTtcbiAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS5cbiAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdFxuICpcbiAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMFxuICpcbiAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmVcbiAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuIFwiQVMgSVNcIiBCQVNJUyxcbiAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLlxuICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZFxuICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuXG4gKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuICovXG5cbmltcG9ydCB7VGVuc29yfSBmcm9tICcuLi90ZW5zb3InO1xuaW1wb3J0IHtSYW5rLCBTaGFwZU1hcH0gZnJvbSAnLi4vdHlwZXMnO1xuXG5pbXBvcnQge2J1ZmZlcn0gZnJvbSAnLi9idWZmZXInO1xuaW1wb3J0IHtvcH0gZnJvbSAnLi9vcGVyYXRpb24nO1xuaW1wb3J0IHtSYW5kR2FtbWF9IGZyb20gJy4vcmFuZF91dGlsJztcblxuLyoqXG4gKiBDcmVhdGVzIGEgYHRmLlRlbnNvcmAgd2l0aCB2YWx1ZXMgc2FtcGxlZCBmcm9tIGEgZ2FtbWEgZGlzdHJpYnV0aW9uLlxuICpcbiAqIGBgYGpzXG4gKiB0Zi5yYW5kb21HYW1tYShbMiwgMl0sIDEpLnByaW50KCk7XG4gKiBgYGBcbiAqXG4gKiBAcGFyYW0gc2hhcGUgQW4gYXJyYXkgb2YgaW50ZWdlcnMgZGVmaW5pbmcgdGhlIG91dHB1dCB0ZW5zb3Igc2hhcGUuXG4gKiBAcGFyYW0gYWxwaGEgVGhlIHNoYXBlIHBhcmFtZXRlciBvZiB0aGUgZ2FtbWEgZGlzdHJpYnV0aW9uLlxuICogQHBhcmFtIGJldGEgVGhlIGludmVyc2Ugc2NhbGUgcGFyYW1ldGVyIG9mIHRoZSBnYW1tYSBkaXN0cmlidXRpb24uIERlZmF1bHRzXG4gKiAgICAgdG8gMS5cbiAqIEBwYXJhbSBkdHlwZSBUaGUgZGF0YSB0eXBlIG9mIHRoZSBvdXRwdXQuIERlZmF1bHRzIHRvIGZsb2F0MzIuXG4gKiBAcGFyYW0gc2VlZCBUaGUgc2VlZCBmb3IgdGhlIHJhbmRvbSBudW1iZXIgZ2VuZXJhdG9yLlxuICpcbiAqIEBkb2Mge2hlYWRpbmc6ICdUZW5zb3JzJywgc3ViaGVhZGluZzogJ1JhbmRvbSd9XG4gKi9cbmZ1bmN0aW9uIHJhbmRvbUdhbW1hXzxSIGV4dGVuZHMgUmFuaz4oXG4gICAgc2hhcGU6IFNoYXBlTWFwW1JdLCBhbHBoYTogbnVtYmVyLCBiZXRhID0gMSxcbiAgICBkdHlwZTogJ2Zsb2F0MzInfCdpbnQzMicgPSAnZmxvYXQzMicsIHNlZWQ/OiBudW1iZXIpOiBUZW5zb3I8Uj4ge1xuICBpZiAoYmV0YSA9PSBudWxsKSB7XG4gICAgYmV0YSA9IDE7XG4gIH1cbiAgaWYgKGR0eXBlID09IG51bGwpIHtcbiAgICBkdHlwZSA9ICdmbG9hdDMyJztcbiAgfVxuICBpZiAoZHR5cGUgIT09ICdmbG9hdDMyJyAmJiBkdHlwZSAhPT0gJ2ludDMyJykge1xuICAgIHRocm93IG5ldyBFcnJvcihgVW5zdXBwb3J0ZWQgZGF0YSB0eXBlICR7ZHR5cGV9YCk7XG4gIH1cbiAgY29uc3QgcmdhbW1hID0gbmV3IFJhbmRHYW1tYShhbHBoYSwgYmV0YSwgZHR5cGUsIHNlZWQpO1xuICBjb25zdCByZXMgPSBidWZmZXIoc2hhcGUsIGR0eXBlKTtcbiAgZm9yIChsZXQgaSA9IDA7IGkgPCByZXMudmFsdWVzLmxlbmd0aDsgaSsrKSB7XG4gICAgcmVzLnZhbHVlc1tpXSA9IHJnYW1tYS5uZXh0VmFsdWUoKTtcbiAgfVxuICByZXR1cm4gcmVzLnRvVGVuc29yKCk7XG59XG5cbmV4cG9ydCBjb25zdCByYW5kb21HYW1tYSA9IG9wKHtyYW5kb21HYW1tYV99KTtcbiJdfQ==","/**\n * @license\n * Copyright 2020 Google LLC. All Rights Reserved.\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n * =============================================================================\n */\nimport { buffer } from './buffer';\nimport { op } from './operation';\nimport { MPRandGauss } from './rand_util';\n/**\n * Creates a `tf.Tensor` with values sampled from a normal distribution.\n *\n * ```js\n * tf.randomNormal([2, 2]).print();\n * ```\n *\n * @param shape An array of integers defining the output tensor shape.\n * @param mean The mean of the normal distribution.\n * @param stdDev The standard deviation of the normal distribution.\n * @param dtype The data type of the output.\n * @param seed The seed for the random number generator.\n *\n * @doc {heading: 'Tensors', subheading: 'Random'}\n */\nfunction randomNormal_(shape, mean = 0, stdDev = 1, dtype, seed) {\n if (dtype != null && dtype === 'bool') {\n throw new Error(`Unsupported data type ${dtype}`);\n }\n const randGauss = new MPRandGauss(mean, stdDev, dtype, false /* truncated */, seed);\n const res = buffer(shape, dtype);\n for (let i = 0; i < res.values.length; i++) {\n res.values[i] = randGauss.nextValue();\n }\n return res.toTensor();\n}\nexport const randomNormal = op({ randomNormal_ });\n//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicmFuZG9tX25vcm1hbC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uLy4uL3RmanMtY29yZS9zcmMvb3BzL3JhbmRvbV9ub3JtYWwudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUE7Ozs7Ozs7Ozs7Ozs7OztHQWVHO0FBS0gsT0FBTyxFQUFDLE1BQU0sRUFBQyxNQUFNLFVBQVUsQ0FBQztBQUNoQyxPQUFPLEVBQUMsRUFBRSxFQUFDLE1BQU0sYUFBYSxDQUFDO0FBQy9CLE9BQU8sRUFBQyxXQUFXLEVBQUMsTUFBTSxhQUFhLENBQUM7QUFFeEM7Ozs7Ozs7Ozs7Ozs7O0dBY0c7QUFDSCxTQUFTLGFBQWEsQ0FDbEIsS0FBa0IsRUFBRSxJQUFJLEdBQUcsQ0FBQyxFQUFFLE1BQU0sR0FBRyxDQUFDLEVBQUUsS0FBeUIsRUFDbkUsSUFBYTtJQUNmLElBQUksS0FBSyxJQUFJLElBQUksSUFBSyxLQUFrQixLQUFLLE1BQU0sRUFBRTtRQUNuRCxNQUFNLElBQUksS0FBSyxDQUFDLHlCQUF5QixLQUFLLEVBQUUsQ0FBQyxDQUFDO0tBQ25EO0lBQ0QsTUFBTSxTQUFTLEdBQ1gsSUFBSSxXQUFXLENBQUMsSUFBSSxFQUFFLE1BQU0sRUFBRSxLQUFLLEVBQUUsS0FBSyxDQUFDLGVBQWUsRUFBRSxJQUFJLENBQUMsQ0FBQztJQUN0RSxNQUFNLEdBQUcsR0FBRyxNQUFNLENBQUMsS0FBSyxFQUFFLEtBQUssQ0FBQyxDQUFDO0lBQ2pDLEtBQUssSUFBSSxDQUFDLEdBQUcsQ0FBQyxFQUFFLENBQUMsR0FBRyxHQUFHLENBQUMsTUFBTSxDQUFDLE1BQU0sRUFBRSxDQUFDLEVBQUUsRUFBRTtRQUMxQyxHQUFHLENBQUMsTUFBTSxDQUFDLENBQUMsQ0FBQyxHQUFHLFNBQVMsQ0FBQyxTQUFTLEVBQUUsQ0FBQztLQUN2QztJQUNELE9BQU8sR0FBRyxDQUFDLFFBQVEsRUFBRSxDQUFDO0FBQ3hCLENBQUM7QUFFRCxNQUFNLENBQUMsTUFBTSxZQUFZLEdBQUcsRUFBRSxDQUFDLEVBQUMsYUFBYSxFQUFDLENBQUMsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbIi8qKlxuICogQGxpY2Vuc2VcbiAqIENvcHlyaWdodCAyMDIwIEdvb2dsZSBMTEMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuXG4gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgXCJMaWNlbnNlXCIpO1xuICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLlxuICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0XG4gKlxuICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wXG4gKlxuICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZVxuICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gXCJBUyBJU1wiIEJBU0lTLFxuICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuXG4gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kXG4gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS5cbiAqID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4gKi9cblxuaW1wb3J0IHtUZW5zb3J9IGZyb20gJy4uL3RlbnNvcic7XG5pbXBvcnQge0RhdGFUeXBlLCBSYW5rLCBTaGFwZU1hcH0gZnJvbSAnLi4vdHlwZXMnO1xuXG5pbXBvcnQge2J1ZmZlcn0gZnJvbSAnLi9idWZmZXInO1xuaW1wb3J0IHtvcH0gZnJvbSAnLi9vcGVyYXRpb24nO1xuaW1wb3J0IHtNUFJhbmRHYXVzc30gZnJvbSAnLi9yYW5kX3V0aWwnO1xuXG4vKipcbiAqIENyZWF0ZXMgYSBgdGYuVGVuc29yYCB3aXRoIHZhbHVlcyBzYW1wbGVkIGZyb20gYSBub3JtYWwgZGlzdHJpYnV0aW9uLlxuICpcbiAqIGBgYGpzXG4gKiB0Zi5yYW5kb21Ob3JtYWwoWzIsIDJdKS5wcmludCgpO1xuICogYGBgXG4gKlxuICogQHBhcmFtIHNoYXBlIEFuIGFycmF5IG9mIGludGVnZXJzIGRlZmluaW5nIHRoZSBvdXRwdXQgdGVuc29yIHNoYXBlLlxuICogQHBhcmFtIG1lYW4gVGhlIG1lYW4gb2YgdGhlIG5vcm1hbCBkaXN0cmlidXRpb24uXG4gKiBAcGFyYW0gc3RkRGV2IFRoZSBzdGFuZGFyZCBkZXZpYXRpb24gb2YgdGhlIG5vcm1hbCBkaXN0cmlidXRpb24uXG4gKiBAcGFyYW0gZHR5cGUgVGhlIGRhdGEgdHlwZSBvZiB0aGUgb3V0cHV0LlxuICogQHBhcmFtIHNlZWQgVGhlIHNlZWQgZm9yIHRoZSByYW5kb20gbnVtYmVyIGdlbmVyYXRvci5cbiAqXG4gKiBAZG9jIHtoZWFkaW5nOiAnVGVuc29ycycsIHN1YmhlYWRpbmc6ICdSYW5kb20nfVxuICovXG5mdW5jdGlvbiByYW5kb21Ob3JtYWxfPFIgZXh0ZW5kcyBSYW5rPihcbiAgICBzaGFwZTogU2hhcGVNYXBbUl0sIG1lYW4gPSAwLCBzdGREZXYgPSAxLCBkdHlwZT86ICdmbG9hdDMyJ3wnaW50MzInLFxuICAgIHNlZWQ/OiBudW1iZXIpOiBUZW5zb3I8Uj4ge1xuICBpZiAoZHR5cGUgIT0gbnVsbCAmJiAoZHR5cGUgYXMgRGF0YVR5cGUpID09PSAnYm9vbCcpIHtcbiAgICB0aHJvdyBuZXcgRXJyb3IoYFVuc3VwcG9ydGVkIGRhdGEgdHlwZSAke2R0eXBlfWApO1xuICB9XG4gIGNvbnN0IHJhbmRHYXVzcyA9XG4gICAgICBuZXcgTVBSYW5kR2F1c3MobWVhbiwgc3RkRGV2LCBkdHlwZSwgZmFsc2UgLyogdHJ1bmNhdGVkICovLCBzZWVkKTtcbiAgY29uc3QgcmVzID0gYnVmZmVyKHNoYXBlLCBkdHlwZSk7XG4gIGZvciAobGV0IGkgPSAwOyBpIDwgcmVzLnZhbHVlcy5sZW5ndGg7IGkrKykge1xuICAgIHJlcy52YWx1ZXNbaV0gPSByYW5kR2F1c3MubmV4dFZhbHVlKCk7XG4gIH1cbiAgcmV0dXJuIHJlcy50b1RlbnNvcigpO1xufVxuXG5leHBvcnQgY29uc3QgcmFuZG9tTm9ybWFsID0gb3Aoe3JhbmRvbU5vcm1hbF99KTtcbiJdfQ==","/**\n * @license\n * Copyright 2022 Google LLC. All Rights Reserved.\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n * =============================================================================\n */\nimport { op } from './operation';\nimport { randomNormal } from './random_normal';\n/**\n * Creates a `tf.Tensor` with values sampled from a normal distribution.\n *\n * The generated values will have mean 0 and standard deviation 1.\n *\n * ```js\n * tf.randomStandardNormal([2, 2]).print();\n * ```\n *\n * @param shape An array of integers defining the output tensor shape.\n * @param dtype The data type of the output.\n * @param seed The seed for the random number generator.\n *\n * @doc {heading: 'Tensors', subheading: 'Random'}\n */\nfunction randomStandardNormal_(shape, dtype, seed) {\n if (dtype != null && dtype === 'bool') {\n throw new Error(`Unsupported data type ${dtype}`);\n }\n return randomNormal(shape, 0, 1, dtype, seed);\n}\nexport const randomStandardNormal = op({ randomStandardNormal_ });\n//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicmFuZG9tX3N0YW5kYXJkX25vcm1hbC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uLy4uL3RmanMtY29yZS9zcmMvb3BzL3JhbmRvbV9zdGFuZGFyZF9ub3JtYWwudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUE7Ozs7Ozs7Ozs7Ozs7OztHQWVHO0FBS0gsT0FBTyxFQUFDLEVBQUUsRUFBQyxNQUFNLGFBQWEsQ0FBQztBQUMvQixPQUFPLEVBQUMsWUFBWSxFQUFDLE1BQU0saUJBQWlCLENBQUM7QUFFN0M7Ozs7Ozs7Ozs7Ozs7O0dBY0c7QUFDSCxTQUFTLHFCQUFxQixDQUMxQixLQUFrQixFQUFFLEtBQXlCLEVBQUUsSUFBYTtJQUM5RCxJQUFJLEtBQUssSUFBSSxJQUFJLElBQUssS0FBa0IsS0FBSyxNQUFNLEVBQUU7UUFDbkQsTUFBTSxJQUFJLEtBQUssQ0FBQyx5QkFBeUIsS0FBSyxFQUFFLENBQUMsQ0FBQztLQUNuRDtJQUNELE9BQU8sWUFBWSxDQUFDLEtBQUssRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLEtBQUssRUFBRSxJQUFJLENBQUMsQ0FBQztBQUNoRCxDQUFDO0FBRUQsTUFBTSxDQUFDLE1BQU0sb0JBQW9CLEdBQUcsRUFBRSxDQUFDLEVBQUMscUJBQXFCLEVBQUMsQ0FBQyxDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiLyoqXG4gKiBAbGljZW5zZVxuICogQ29weXJpZ2h0IDIwMjIgR29vZ2xlIExMQy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC5cbiAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSBcIkxpY2Vuc2VcIik7XG4gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuXG4gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXRcbiAqXG4gKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjBcbiAqXG4gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlXG4gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiBcIkFTIElTXCIgQkFTSVMsXG4gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC5cbiAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmRcbiAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLlxuICogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbiAqL1xuXG5pbXBvcnQge1RlbnNvcn0gZnJvbSAnLi4vdGVuc29yJztcbmltcG9ydCB7RGF0YVR5cGUsIFJhbmssIFNoYXBlTWFwfSBmcm9tICcuLi90eXBlcyc7XG5cbmltcG9ydCB7b3B9IGZyb20gJy4vb3BlcmF0aW9uJztcbmltcG9ydCB7cmFuZG9tTm9ybWFsfSBmcm9tICcuL3JhbmRvbV9ub3JtYWwnO1xuXG4vKipcbiAqIENyZWF0ZXMgYSBgdGYuVGVuc29yYCB3aXRoIHZhbHVlcyBzYW1wbGVkIGZyb20gYSBub3JtYWwgZGlzdHJpYnV0aW9uLlxuICpcbiAqIFRoZSBnZW5lcmF0ZWQgdmFsdWVzIHdpbGwgaGF2ZSBtZWFuIDAgYW5kIHN0YW5kYXJkIGRldmlhdGlvbiAxLlxuICpcbiAqIGBgYGpzXG4gKiB0Zi5yYW5kb21TdGFuZGFyZE5vcm1hbChbMiwgMl0pLnByaW50KCk7XG4gKiBgYGBcbiAqXG4gKiBAcGFyYW0gc2hhcGUgQW4gYXJyYXkgb2YgaW50ZWdlcnMgZGVmaW5pbmcgdGhlIG91dHB1dCB0ZW5zb3Igc2hhcGUuXG4gKiBAcGFyYW0gZHR5cGUgVGhlIGRhdGEgdHlwZSBvZiB0aGUgb3V0cHV0LlxuICogQHBhcmFtIHNlZWQgVGhlIHNlZWQgZm9yIHRoZSByYW5kb20gbnVtYmVyIGdlbmVyYXRvci5cbiAqXG4gKiBAZG9jIHtoZWFkaW5nOiAnVGVuc29ycycsIHN1YmhlYWRpbmc6ICdSYW5kb20nfVxuICovXG5mdW5jdGlvbiByYW5kb21TdGFuZGFyZE5vcm1hbF88UiBleHRlbmRzIFJhbms+KFxuICAgIHNoYXBlOiBTaGFwZU1hcFtSXSwgZHR5cGU/OiAnZmxvYXQzMid8J2ludDMyJywgc2VlZD86IG51bWJlcik6IFRlbnNvcjxSPiB7XG4gIGlmIChkdHlwZSAhPSBudWxsICYmIChkdHlwZSBhcyBEYXRhVHlwZSkgPT09ICdib29sJykge1xuICAgIHRocm93IG5ldyBFcnJvcihgVW5zdXBwb3J0ZWQgZGF0YSB0eXBlICR7ZHR5cGV9YCk7XG4gIH1cbiAgcmV0dXJuIHJhbmRvbU5vcm1hbChzaGFwZSwgMCwgMSwgZHR5cGUsIHNlZWQpO1xufVxuXG5leHBvcnQgY29uc3QgcmFuZG9tU3RhbmRhcmROb3JtYWwgPSBvcCh7cmFuZG9tU3RhbmRhcmROb3JtYWxffSk7XG4iXX0=","/**\n * @license\n * Copyright 2020 Google LLC. All Rights Reserved.\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n * =============================================================================\n */\nimport { buffer } from './buffer';\nimport { op } from './operation';\nimport { UniformRandom } from './rand_util';\n/**\n * Creates a `tf.Tensor` with values sampled from a uniform distribution.\n *\n * The generated values follow a uniform distribution in the range [minval,\n * maxval). The lower bound minval is included in the range, while the upper\n * bound maxval is excluded.\n *\n * ```js\n * tf.randomUniform([2, 2]).print();\n * ```\n *\n * @param shape An array of integers defining the output tensor shape.\n * @param minval The lower bound on the range of random values to generate.\n * Defaults to 0.\n * @param maxval The upper bound on the range of random values to generate.\n * Defaults to 1.\n * @param dtype The data type of the output tensor. Defaults to 'float32'.\n *\n * @doc {heading: 'Tensors', subheading: 'Random'}\n */\nfunction randomUniform_(shape, minval = 0, maxval = 1, dtype = 'float32', seed) {\n const res = buffer(shape, dtype);\n const random = new UniformRandom(minval, maxval, null, seed);\n for (let i = 0; i < res.values.length; i++) {\n res.values[i] = random.nextValue();\n }\n return res.toTensor();\n}\nexport const randomUniform = op({ randomUniform_ });\n//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicmFuZG9tX3VuaWZvcm0uanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi8uLi90ZmpzLWNvcmUvc3JjL29wcy9yYW5kb21fdW5pZm9ybS50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQTs7Ozs7Ozs7Ozs7Ozs7O0dBZUc7QUFLSCxPQUFPLEVBQUMsTUFBTSxFQUFDLE1BQU0sVUFBVSxDQUFDO0FBQ2hDLE9BQU8sRUFBQyxFQUFFLEVBQUMsTUFBTSxhQUFhLENBQUM7QUFDL0IsT0FBTyxFQUFDLGFBQWEsRUFBQyxNQUFNLGFBQWEsQ0FBQztBQUUxQzs7Ozs7Ozs7Ozs7Ozs7Ozs7OztHQW1CRztBQUNILFNBQVMsY0FBYyxDQUNuQixLQUFrQixFQUFFLE1BQU0sR0FBRyxDQUFDLEVBQUUsTUFBTSxHQUFHLENBQUMsRUFBRSxRQUFrQixTQUFTLEVBQ3ZFLElBQW9CO0lBQ3RCLE1BQU0sR0FBRyxHQUFHLE1BQU0sQ0FBQyxLQUFLLEVBQUUsS0FBSyxDQUFDLENBQUM7SUFDakMsTUFBTSxNQUFNLEdBQUcsSUFBSSxhQUFhLENBQUMsTUFBTSxFQUFFLE1BQU0sRUFBRSxJQUFJLEVBQUUsSUFBSSxDQUFDLENBQUM7SUFDN0QsS0FBSyxJQUFJLENBQUMsR0FBRyxDQUFDLEVBQUUsQ0FBQyxHQUFHLEdBQUcsQ0FBQyxNQUFNLENBQUMsTUFBTSxFQUFFLENBQUMsRUFBRSxFQUFFO1FBQzFDLEdBQUcsQ0FBQyxNQUFNLENBQUMsQ0FBQyxDQUFDLEdBQUcsTUFBTSxDQUFDLFNBQVMsRUFBRSxDQUFDO0tBQ3BDO0lBQ0QsT0FBTyxHQUFHLENBQUMsUUFBUSxFQUFFLENBQUM7QUFDeEIsQ0FBQztBQUVELE1BQU0sQ0FBQyxNQUFNLGFBQWEsR0FBRyxFQUFFLENBQUMsRUFBQyxjQUFjLEVBQUMsQ0FBQyxDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiLyoqXG4gKiBAbGljZW5zZVxuICogQ29weXJpZ2h0IDIwMjAgR29vZ2xlIExMQy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC5cbiAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSBcIkxpY2Vuc2VcIik7XG4gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuXG4gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXRcbiAqXG4gKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjBcbiAqXG4gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlXG4gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiBcIkFTIElTXCIgQkFTSVMsXG4gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC5cbiAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmRcbiAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLlxuICogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbiAqL1xuXG5pbXBvcnQge1RlbnNvcn0gZnJvbSAnLi4vdGVuc29yJztcbmltcG9ydCB7RGF0YVR5cGUsIFJhbmssIFNoYXBlTWFwfSBmcm9tICcuLi90eXBlcyc7XG5cbmltcG9ydCB7YnVmZmVyfSBmcm9tICcuL2J1ZmZlcic7XG5pbXBvcnQge29wfSBmcm9tICcuL29wZXJhdGlvbic7XG5pbXBvcnQge1VuaWZvcm1SYW5kb219IGZyb20gJy4vcmFuZF91dGlsJztcblxuLyoqXG4gKiBDcmVhdGVzIGEgYHRmLlRlbnNvcmAgd2l0aCB2YWx1ZXMgc2FtcGxlZCBmcm9tIGEgdW5pZm9ybSBkaXN0cmlidXRpb24uXG4gKlxuICogVGhlIGdlbmVyYXRlZCB2YWx1ZXMgZm9sbG93IGEgdW5pZm9ybSBkaXN0cmlidXRpb24gaW4gdGhlIHJhbmdlIFttaW52YWwsXG4gKiBtYXh2YWwpLiBUaGUgbG93ZXIgYm91bmQgbWludmFsIGlzIGluY2x1ZGVkIGluIHRoZSByYW5nZSwgd2hpbGUgdGhlIHVwcGVyXG4gKiBib3VuZCBtYXh2YWwgaXMgZXhjbHVkZWQuXG4gKlxuICogYGBganNcbiAqIHRmLnJhbmRvbVVuaWZvcm0oWzIsIDJdKS5wcmludCgpO1xuICogYGBgXG4gKlxuICogQHBhcmFtIHNoYXBlIEFuIGFycmF5IG9mIGludGVnZXJzIGRlZmluaW5nIHRoZSBvdXRwdXQgdGVuc29yIHNoYXBlLlxuICogQHBhcmFtIG1pbnZhbCBUaGUgbG93ZXIgYm91bmQgb24gdGhlIHJhbmdlIG9mIHJhbmRvbSB2YWx1ZXMgdG8gZ2VuZXJhdGUuXG4gKiAgIERlZmF1bHRzIHRvIDAuXG4gKiBAcGFyYW0gbWF4dmFsIFRoZSB1cHBlciBib3VuZCBvbiB0aGUgcmFuZ2Ugb2YgcmFuZG9tIHZhbHVlcyB0byBnZW5lcmF0ZS5cbiAqICAgRGVmYXVsdHMgdG8gMS5cbiAqIEBwYXJhbSBkdHlwZSBUaGUgZGF0YSB0eXBlIG9mIHRoZSBvdXRwdXQgdGVuc29yLiBEZWZhdWx0cyB0byAnZmxvYXQzMicuXG4gKlxuICogQGRvYyB7aGVhZGluZzogJ1RlbnNvcnMnLCBzdWJoZWFkaW5nOiAnUmFuZG9tJ31cbiAqL1xuZnVuY3Rpb24gcmFuZG9tVW5pZm9ybV88UiBleHRlbmRzIFJhbms+KFxuICAgIHNoYXBlOiBTaGFwZU1hcFtSXSwgbWludmFsID0gMCwgbWF4dmFsID0gMSwgZHR5cGU6IERhdGFUeXBlID0gJ2Zsb2F0MzInLFxuICAgIHNlZWQ/OiBudW1iZXJ8c3RyaW5nKTogVGVuc29yPFI+IHtcbiAgY29uc3QgcmVzID0gYnVmZmVyKHNoYXBlLCBkdHlwZSk7XG4gIGNvbnN0IHJhbmRvbSA9IG5ldyBVbmlmb3JtUmFuZG9tKG1pbnZhbCwgbWF4dmFsLCBudWxsLCBzZWVkKTtcbiAgZm9yIChsZXQgaSA9IDA7IGkgPCByZXMudmFsdWVzLmxlbmd0aDsgaSsrKSB7XG4gICAgcmVzLnZhbHVlc1tpXSA9IHJhbmRvbS5uZXh0VmFsdWUoKTtcbiAgfVxuICByZXR1cm4gcmVzLnRvVGVuc29yKCk7XG59XG5cbmV4cG9ydCBjb25zdCByYW5kb21Vbmlmb3JtID0gb3Aoe3JhbmRvbVVuaWZvcm1ffSk7XG4iXX0=","/**\n * @license\n * Copyright 2018 Google LLC. All Rights Reserved.\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n * =============================================================================\n */\nimport { ENGINE } from '../engine';\nimport { Range } from '../kernel_names';\n/**\n * Creates a new `tf.Tensor1D` filled with the numbers in the range provided.\n *\n * The tensor is a half-open interval meaning it includes start, but\n * excludes stop. Decrementing ranges and negative step values are also\n * supported.\n *\n *\n * ```js\n * tf.range(0, 9, 2).print();\n * ```\n *\n * @param start An integer start value\n * @param stop An integer stop value\n * @param step An integer increment (will default to 1 or -1)\n * @param dtype The data type of the output tensor. Defaults to 'float32'.\n *\n * @doc {heading: 'Tensors', subheading: 'Creation'}\n */\nexport function range(start, stop, step = 1, dtype = 'float32') {\n if (step === 0) {\n throw new Error('Cannot have a step of zero');\n }\n const attrs = { start, stop, step, dtype };\n return ENGINE.runKernel(Range, {} /* inputs */, attrs);\n}\n//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicmFuZ2UuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi8uLi90ZmpzLWNvcmUvc3JjL29wcy9yYW5nZS50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQTs7Ozs7Ozs7Ozs7Ozs7O0dBZUc7QUFFSCxPQUFPLEVBQUMsTUFBTSxFQUFDLE1BQU0sV0FBVyxDQUFDO0FBQ2pDLE9BQU8sRUFBQyxLQUFLLEVBQWEsTUFBTSxpQkFBaUIsQ0FBQztBQUlsRDs7Ozs7Ozs7Ozs7Ozs7Ozs7O0dBa0JHO0FBQ0gsTUFBTSxVQUFVLEtBQUssQ0FDakIsS0FBYSxFQUFFLElBQVksRUFBRSxJQUFJLEdBQUcsQ0FBQyxFQUNyQyxRQUEyQixTQUFTO0lBQ3RDLElBQUksSUFBSSxLQUFLLENBQUMsRUFBRTtRQUNkLE1BQU0sSUFBSSxLQUFLLENBQUMsNEJBQTRCLENBQUMsQ0FBQztLQUMvQztJQUVELE1BQU0sS0FBSyxHQUFlLEVBQUMsS0FBSyxFQUFFLElBQUksRUFBRSxJQUFJLEVBQUUsS0FBSyxFQUFDLENBQUM7SUFFckQsT0FBTyxNQUFNLENBQUMsU0FBUyxDQUFDLEtBQUssRUFBRSxFQUFFLENBQUMsWUFBWSxFQUFFLEtBQTJCLENBQUMsQ0FBQztBQUMvRSxDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiLyoqXG4gKiBAbGljZW5zZVxuICogQ29weXJpZ2h0IDIwMTggR29vZ2xlIExMQy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC5cbiAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSBcIkxpY2Vuc2VcIik7XG4gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuXG4gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXRcbiAqXG4gKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjBcbiAqXG4gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlXG4gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiBcIkFTIElTXCIgQkFTSVMsXG4gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC5cbiAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmRcbiAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLlxuICogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbiAqL1xuXG5pbXBvcnQge0VOR0lORX0gZnJvbSAnLi4vZW5naW5lJztcbmltcG9ydCB7UmFuZ2UsIFJhbmdlQXR0cnN9IGZyb20gJy4uL2tlcm5lbF9uYW1lcyc7XG5pbXBvcnQge05hbWVkQXR0ck1hcH0gZnJvbSAnLi4va2VybmVsX3JlZ2lzdHJ5JztcbmltcG9ydCB7VGVuc29yMUR9IGZyb20gJy4uL3RlbnNvcic7XG5cbi8qKlxuICogQ3JlYXRlcyBhIG5ldyBgdGYuVGVuc29yMURgIGZpbGxlZCB3aXRoIHRoZSBudW1iZXJzIGluIHRoZSByYW5nZSBwcm92aWRlZC5cbiAqXG4gKiBUaGUgdGVuc29yIGlzIGEgaGFsZi1vcGVuIGludGVydmFsIG1lYW5pbmcgaXQgaW5jbHVkZXMgc3RhcnQsIGJ1dFxuICogZXhjbHVkZXMgc3RvcC4gRGVjcmVtZW50aW5nIHJhbmdlcyBhbmQgbmVnYXRpdmUgc3RlcCB2YWx1ZXMgYXJlIGFsc29cbiAqIHN1cHBvcnRlZC5cbiAqXG4gKlxuICogYGBganNcbiAqIHRmLnJhbmdlKDAsIDksIDIpLnByaW50KCk7XG4gKiBgYGBcbiAqXG4gKiBAcGFyYW0gc3RhcnQgQW4gaW50ZWdlciBzdGFydCB2YWx1ZVxuICogQHBhcmFtIHN0b3AgQW4gaW50ZWdlciBzdG9wIHZhbHVlXG4gKiBAcGFyYW0gc3RlcCBBbiBpbnRlZ2VyIGluY3JlbWVudCAod2lsbCBkZWZhdWx0IHRvIDEgb3IgLTEpXG4gKiBAcGFyYW0gZHR5cGUgVGhlIGRhdGEgdHlwZSBvZiB0aGUgb3V0cHV0IHRlbnNvci4gRGVmYXVsdHMgdG8gJ2Zsb2F0MzInLlxuICpcbiAqIEBkb2Mge2hlYWRpbmc6ICdUZW5zb3JzJywgc3ViaGVhZGluZzogJ0NyZWF0aW9uJ31cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHJhbmdlKFxuICAgIHN0YXJ0OiBudW1iZXIsIHN0b3A6IG51bWJlciwgc3RlcCA9IDEsXG4gICAgZHR5cGU6ICdmbG9hdDMyJ3wnaW50MzInID0gJ2Zsb2F0MzInKTogVGVuc29yMUQge1xuICBpZiAoc3RlcCA9PT0gMCkge1xuICAgIHRocm93IG5ldyBFcnJvcignQ2Fubm90IGhhdmUgYSBzdGVwIG9mIHplcm8nKTtcbiAgfVxuXG4gIGNvbnN0IGF0dHJzOiBSYW5nZUF0dHJzID0ge3N0YXJ0LCBzdG9wLCBzdGVwLCBkdHlwZX07XG5cbiAgcmV0dXJuIEVOR0lORS5ydW5LZXJuZWwoUmFuZ2UsIHt9IC8qIGlucHV0cyAqLywgYXR0cnMgYXMge30gYXMgTmFtZWRBdHRyTWFwKTtcbn1cbiJdfQ==","/**\n * @license\n * Copyright 2020 Google LLC. All Rights Reserved.\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n * =============================================================================\n */\nimport { convertToTensor } from '../tensor_util_env';\nimport * as util from '../util';\nimport { op } from './operation';\nimport { reverse } from './reverse';\n/**\n * Reverses a `tf.Tensor1D`.\n *\n * @param x The input tensor.\n */\nfunction reverse1d_(x) {\n const $x = convertToTensor(x, 'x', 'reverse');\n util.assert($x.rank === 1, () => `Error in reverse1D: x must be rank 1 but got rank ${$x.rank}.`);\n return reverse($x, 0);\n}\nexport const reverse1d = op({ reverse1d_ });\n//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicmV2ZXJzZV8xZC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uLy4uL3RmanMtY29yZS9zcmMvb3BzL3JldmVyc2VfMWQudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUE7Ozs7Ozs7Ozs7Ozs7OztHQWVHO0FBR0gsT0FBTyxFQUFDLGVBQWUsRUFBQyxNQUFNLG9CQUFvQixDQUFDO0FBRW5ELE9BQU8sS0FBSyxJQUFJLE1BQU0sU0FBUyxDQUFDO0FBQ2hDLE9BQU8sRUFBQyxFQUFFLEVBQUMsTUFBTSxhQUFhLENBQUM7QUFDL0IsT0FBTyxFQUFDLE9BQU8sRUFBQyxNQUFNLFdBQVcsQ0FBQztBQUVsQzs7OztHQUlHO0FBQ0gsU0FBUyxVQUFVLENBQUMsQ0FBc0I7SUFDeEMsTUFBTSxFQUFFLEdBQUcsZUFBZSxDQUFDLENBQUMsRUFBRSxHQUFHLEVBQUUsU0FBUyxDQUFDLENBQUM7SUFDOUMsSUFBSSxDQUFDLE1BQU0sQ0FDUCxFQUFFLENBQUMsSUFBSSxLQUFLLENBQUMsRUFDYixHQUFHLEVBQUUsQ0FBQyxxREFBcUQsRUFBRSxDQUFDLElBQUksR0FBRyxDQUFDLENBQUM7SUFDM0UsT0FBTyxPQUFPLENBQUMsRUFBRSxFQUFFLENBQUMsQ0FBQyxDQUFDO0FBQ3hCLENBQUM7QUFFRCxNQUFNLENBQUMsTUFBTSxTQUFTLEdBQUcsRUFBRSxDQUFDLEVBQUMsVUFBVSxFQUFDLENBQUMsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbIi8qKlxuICogQGxpY2Vuc2VcbiAqIENvcHlyaWdodCAyMDIwIEdvb2dsZSBMTEMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuXG4gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgXCJMaWNlbnNlXCIpO1xuICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLlxuICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0XG4gKlxuICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wXG4gKlxuICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZVxuICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gXCJBUyBJU1wiIEJBU0lTLFxuICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuXG4gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kXG4gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS5cbiAqID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4gKi9cblxuaW1wb3J0IHtUZW5zb3IxRH0gZnJvbSAnLi4vdGVuc29yJztcbmltcG9ydCB7Y29udmVydFRvVGVuc29yfSBmcm9tICcuLi90ZW5zb3JfdXRpbF9lbnYnO1xuaW1wb3J0IHtUZW5zb3JMaWtlfSBmcm9tICcuLi90eXBlcyc7XG5pbXBvcnQgKiBhcyB1dGlsIGZyb20gJy4uL3V0aWwnO1xuaW1wb3J0IHtvcH0gZnJvbSAnLi9vcGVyYXRpb24nO1xuaW1wb3J0IHtyZXZlcnNlfSBmcm9tICcuL3JldmVyc2UnO1xuXG4vKipcbiAqIFJldmVyc2VzIGEgYHRmLlRlbnNvcjFEYC5cbiAqXG4gKiBAcGFyYW0geCBUaGUgaW5wdXQgdGVuc29yLlxuICovXG5mdW5jdGlvbiByZXZlcnNlMWRfKHg6IFRlbnNvcjFEfFRlbnNvckxpa2UpOiBUZW5zb3IxRCB7XG4gIGNvbnN0ICR4ID0gY29udmVydFRvVGVuc29yKHgsICd4JywgJ3JldmVyc2UnKTtcbiAgdXRpbC5hc3NlcnQoXG4gICAgICAkeC5yYW5rID09PSAxLFxuICAgICAgKCkgPT4gYEVycm9yIGluIHJldmVyc2UxRDogeCBtdXN0IGJlIHJhbmsgMSBidXQgZ290IHJhbmsgJHskeC5yYW5rfS5gKTtcbiAgcmV0dXJuIHJldmVyc2UoJHgsIDApO1xufVxuXG5leHBvcnQgY29uc3QgcmV2ZXJzZTFkID0gb3Aoe3JldmVyc2UxZF99KTtcbiJdfQ==","/**\n * @license\n * Copyright 2020 Google LLC. All Rights Reserved.\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n * =============================================================================\n */\nimport { convertToTensor } from '../tensor_util_env';\nimport * as util from '../util';\nimport { op } from './operation';\nimport { reverse } from './reverse';\n/**\n * Reverses a `tf.Tensor2D` along a specified axis.\n *\n * @param x The input tensor.\n * @param axis The set of dimensions to reverse. Must be in the\n * range [-rank(x), rank(x)). Defaults to all axes.\n */\nfunction reverse2d_(x, axis) {\n const $x = convertToTensor(x, 'x', 'reverse');\n util.assert($x.rank === 2, () => `Error in reverse2D: x must be rank 2 but got rank ${$x.rank}.`);\n return reverse($x, axis);\n}\nexport const reverse2d = op({ reverse2d_ });\n//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicmV2ZXJzZV8yZC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uLy4uL3RmanMtY29yZS9zcmMvb3BzL3JldmVyc2VfMmQudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUE7Ozs7Ozs7Ozs7Ozs7OztHQWVHO0FBR0gsT0FBTyxFQUFDLGVBQWUsRUFBQyxNQUFNLG9CQUFvQixDQUFDO0FBRW5ELE9BQU8sS0FBSyxJQUFJLE1BQU0sU0FBUyxDQUFDO0FBQ2hDLE9BQU8sRUFBQyxFQUFFLEVBQUMsTUFBTSxhQUFhLENBQUM7QUFDL0IsT0FBTyxFQUFDLE9BQU8sRUFBQyxNQUFNLFdBQVcsQ0FBQztBQUVsQzs7Ozs7O0dBTUc7QUFDSCxTQUFTLFVBQVUsQ0FBQyxDQUFzQixFQUFFLElBQXNCO0lBQ2hFLE1BQU0sRUFBRSxHQUFHLGVBQWUsQ0FBQyxDQUFDLEVBQUUsR0FBRyxFQUFFLFNBQVMsQ0FBQyxDQUFDO0lBQzlDLElBQUksQ0FBQyxNQUFNLENBQ1AsRUFBRSxDQUFDLElBQUksS0FBSyxDQUFDLEVBQ2IsR0FBRyxFQUFFLENBQUMscURBQXFELEVBQUUsQ0FBQyxJQUFJLEdBQUcsQ0FBQyxDQUFDO0lBQzNFLE9BQU8sT0FBTyxDQUFDLEVBQUUsRUFBRSxJQUFJLENBQUMsQ0FBQztBQUMzQixDQUFDO0FBRUQsTUFBTSxDQUFDLE1BQU0sU0FBUyxHQUFHLEVBQUUsQ0FBQyxFQUFDLFVBQVUsRUFBQyxDQUFDLENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyIvKipcbiAqIEBsaWNlbnNlXG4gKiBDb3B5cmlnaHQgMjAyMCBHb29nbGUgTExDLiBBbGwgUmlnaHRzIFJlc2VydmVkLlxuICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlIFwiTGljZW5zZVwiKTtcbiAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS5cbiAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdFxuICpcbiAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMFxuICpcbiAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmVcbiAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuIFwiQVMgSVNcIiBCQVNJUyxcbiAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLlxuICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZFxuICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuXG4gKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuICovXG5cbmltcG9ydCB7VGVuc29yMkR9IGZyb20gJy4uL3RlbnNvcic7XG5pbXBvcnQge2NvbnZlcnRUb1RlbnNvcn0gZnJvbSAnLi4vdGVuc29yX3V0aWxfZW52JztcbmltcG9ydCB7VGVuc29yTGlrZX0gZnJvbSAnLi4vdHlwZXMnO1xuaW1wb3J0ICogYXMgdXRpbCBmcm9tICcuLi91dGlsJztcbmltcG9ydCB7b3B9IGZyb20gJy4vb3BlcmF0aW9uJztcbmltcG9ydCB7cmV2ZXJzZX0gZnJvbSAnLi9yZXZlcnNlJztcblxuLyoqXG4gKiBSZXZlcnNlcyBhIGB0Zi5UZW5zb3IyRGAgYWxvbmcgYSBzcGVjaWZpZWQgYXhpcy5cbiAqXG4gKiBAcGFyYW0geCBUaGUgaW5wdXQgdGVuc29yLlxuICogQHBhcmFtIGF4aXMgVGhlIHNldCBvZiBkaW1lbnNpb25zIHRvIHJldmVyc2UuIE11c3QgYmUgaW4gdGhlXG4gKiAgICAgcmFuZ2UgWy1yYW5rKHgpLCByYW5rKHgpKS4gRGVmYXVsdHMgdG8gYWxsIGF4ZXMuXG4gKi9cbmZ1bmN0aW9uIHJldmVyc2UyZF8oeDogVGVuc29yMkR8VGVuc29yTGlrZSwgYXhpcz86IG51bWJlcnxudW1iZXJbXSk6IFRlbnNvcjJEIHtcbiAgY29uc3QgJHggPSBjb252ZXJ0VG9UZW5zb3IoeCwgJ3gnLCAncmV2ZXJzZScpO1xuICB1dGlsLmFzc2VydChcbiAgICAgICR4LnJhbmsgPT09IDIsXG4gICAgICAoKSA9PiBgRXJyb3IgaW4gcmV2ZXJzZTJEOiB4IG11c3QgYmUgcmFuayAyIGJ1dCBnb3QgcmFuayAkeyR4LnJhbmt9LmApO1xuICByZXR1cm4gcmV2ZXJzZSgkeCwgYXhpcyk7XG59XG5cbmV4cG9ydCBjb25zdCByZXZlcnNlMmQgPSBvcCh7cmV2ZXJzZTJkX30pO1xuIl19","/**\n * @license\n * Copyright 2020 Google LLC. All Rights Reserved.\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n * =============================================================================\n */\nimport { convertToTensor } from '../tensor_util_env';\nimport * as util from '../util';\nimport { op } from './operation';\nimport { reverse } from './reverse';\n/**\n * Reverses a `tf.Tensor3D` along a specified axis.\n *\n * @param x The input tensor.\n * @param axis The set of dimensions to reverse. Must be in the\n * range [-rank(x), rank(x)). Defaults to all axes.\n */\nfunction reverse3d_(x, axis) {\n const $x = convertToTensor(x, 'x', 'reverse');\n util.assert($x.rank === 3, () => `Error in reverse3D: x must be rank 3 but got rank ${$x.rank}.`);\n return reverse($x, axis);\n}\nexport const reverse3d = op({ reverse3d_ });\n//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicmV2ZXJzZV8zZC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uLy4uL3RmanMtY29yZS9zcmMvb3BzL3JldmVyc2VfM2QudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUE7Ozs7Ozs7Ozs7Ozs7OztHQWVHO0FBR0gsT0FBTyxFQUFDLGVBQWUsRUFBQyxNQUFNLG9CQUFvQixDQUFDO0FBRW5ELE9BQU8sS0FBSyxJQUFJLE1BQU0sU0FBUyxDQUFDO0FBQ2hDLE9BQU8sRUFBQyxFQUFFLEVBQUMsTUFBTSxhQUFhLENBQUM7QUFDL0IsT0FBTyxFQUFDLE9BQU8sRUFBQyxNQUFNLFdBQVcsQ0FBQztBQUVsQzs7Ozs7O0dBTUc7QUFDSCxTQUFTLFVBQVUsQ0FBQyxDQUFzQixFQUFFLElBQXNCO0lBQ2hFLE1BQU0sRUFBRSxHQUFHLGVBQWUsQ0FBQyxDQUFDLEVBQUUsR0FBRyxFQUFFLFNBQVMsQ0FBQyxDQUFDO0lBQzlDLElBQUksQ0FBQyxNQUFNLENBQ1AsRUFBRSxDQUFDLElBQUksS0FBSyxDQUFDLEVBQ2IsR0FBRyxFQUFFLENBQUMscURBQXFELEVBQUUsQ0FBQyxJQUFJLEdBQUcsQ0FBQyxDQUFDO0lBQzNFLE9BQU8sT0FBTyxDQUFDLEVBQUUsRUFBRSxJQUFJLENBQUMsQ0FBQztBQUMzQixDQUFDO0FBRUQsTUFBTSxDQUFDLE1BQU0sU0FBUyxHQUFHLEVBQUUsQ0FBQyxFQUFDLFVBQVUsRUFBQyxDQUFDLENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyIvKipcbiAqIEBsaWNlbnNlXG4gKiBDb3B5cmlnaHQgMjAyMCBHb29nbGUgTExDLiBBbGwgUmlnaHRzIFJlc2VydmVkLlxuICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlIFwiTGljZW5zZVwiKTtcbiAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS5cbiAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdFxuICpcbiAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMFxuICpcbiAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmVcbiAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuIFwiQVMgSVNcIiBCQVNJUyxcbiAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLlxuICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZFxuICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuXG4gKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuICovXG5cbmltcG9ydCB7VGVuc29yM0R9IGZyb20gJy4uL3RlbnNvcic7XG5pbXBvcnQge2NvbnZlcnRUb1RlbnNvcn0gZnJvbSAnLi4vdGVuc29yX3V0aWxfZW52JztcbmltcG9ydCB7VGVuc29yTGlrZX0gZnJvbSAnLi4vdHlwZXMnO1xuaW1wb3J0ICogYXMgdXRpbCBmcm9tICcuLi91dGlsJztcbmltcG9ydCB7b3B9IGZyb20gJy4vb3BlcmF0aW9uJztcbmltcG9ydCB7cmV2ZXJzZX0gZnJvbSAnLi9yZXZlcnNlJztcblxuLyoqXG4gKiBSZXZlcnNlcyBhIGB0Zi5UZW5zb3IzRGAgYWxvbmcgYSBzcGVjaWZpZWQgYXhpcy5cbiAqXG4gKiBAcGFyYW0geCBUaGUgaW5wdXQgdGVuc29yLlxuICogQHBhcmFtIGF4aXMgVGhlIHNldCBvZiBkaW1lbnNpb25zIHRvIHJldmVyc2UuIE11c3QgYmUgaW4gdGhlXG4gKiAgICAgcmFuZ2UgWy1yYW5rKHgpLCByYW5rKHgpKS4gRGVmYXVsdHMgdG8gYWxsIGF4ZXMuXG4gKi9cbmZ1bmN0aW9uIHJldmVyc2UzZF8oeDogVGVuc29yM0R8VGVuc29yTGlrZSwgYXhpcz86IG51bWJlcnxudW1iZXJbXSk6IFRlbnNvcjNEIHtcbiAgY29uc3QgJHggPSBjb252ZXJ0VG9UZW5zb3IoeCwgJ3gnLCAncmV2ZXJzZScpO1xuICB1dGlsLmFzc2VydChcbiAgICAgICR4LnJhbmsgPT09IDMsXG4gICAgICAoKSA9PiBgRXJyb3IgaW4gcmV2ZXJzZTNEOiB4IG11c3QgYmUgcmFuayAzIGJ1dCBnb3QgcmFuayAkeyR4LnJhbmt9LmApO1xuICByZXR1cm4gcmV2ZXJzZSgkeCwgYXhpcyk7XG59XG5cbmV4cG9ydCBjb25zdCByZXZlcnNlM2QgPSBvcCh7cmV2ZXJzZTNkX30pO1xuIl19","/**\n * @license\n * Copyright 2020 Google LLC. All Rights Reserved.\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n * =============================================================================\n */\nimport { convertToTensor } from '../tensor_util_env';\nimport * as util from '../util';\nimport { op } from './operation';\nimport { reverse } from './reverse';\n/**\n * Reverses a `tf.Tensor4D` along a specified axis.\n *\n * @param x The input tensor.\n * @param axis The set of dimensions to reverse. Must be in the\n * range [-rank(x), rank(x)). Defaults to all axes.\n */\nfunction reverse4d_(x, axis) {\n const $x = convertToTensor(x, 'x', 'reverse');\n util.assert($x.rank === 4, () => `Error in reverse4D: x must be rank 4 but got rank ${$x.rank}.`);\n return reverse($x, axis);\n}\nexport const reverse4d = op({ reverse4d_ });\n//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicmV2ZXJzZV80ZC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uLy4uL3RmanMtY29yZS9zcmMvb3BzL3JldmVyc2VfNGQudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUE7Ozs7Ozs7Ozs7Ozs7OztHQWVHO0FBR0gsT0FBTyxFQUFDLGVBQWUsRUFBQyxNQUFNLG9CQUFvQixDQUFDO0FBRW5ELE9BQU8sS0FBSyxJQUFJLE1BQU0sU0FBUyxDQUFDO0FBQ2hDLE9BQU8sRUFBQyxFQUFFLEVBQUMsTUFBTSxhQUFhLENBQUM7QUFDL0IsT0FBTyxFQUFDLE9BQU8sRUFBQyxNQUFNLFdBQVcsQ0FBQztBQUVsQzs7Ozs7O0dBTUc7QUFDSCxTQUFTLFVBQVUsQ0FBQyxDQUFzQixFQUFFLElBQXNCO0lBQ2hFLE1BQU0sRUFBRSxHQUFHLGVBQWUsQ0FBQyxDQUFDLEVBQUUsR0FBRyxFQUFFLFNBQVMsQ0FBQyxDQUFDO0lBQzlDLElBQUksQ0FBQyxNQUFNLENBQ1AsRUFBRSxDQUFDLElBQUksS0FBSyxDQUFDLEVBQ2IsR0FBRyxFQUFFLENBQUMscURBQXFELEVBQUUsQ0FBQyxJQUFJLEdBQUcsQ0FBQyxDQUFDO0lBQzNFLE9BQU8sT0FBTyxDQUFDLEVBQUUsRUFBRSxJQUFJLENBQUMsQ0FBQztBQUMzQixDQUFDO0FBRUQsTUFBTSxDQUFDLE1BQU0sU0FBUyxHQUFHLEVBQUUsQ0FBQyxFQUFDLFVBQVUsRUFBQyxDQUFDLENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyIvKipcbiAqIEBsaWNlbnNlXG4gKiBDb3B5cmlnaHQgMjAyMCBHb29nbGUgTExDLiBBbGwgUmlnaHRzIFJlc2VydmVkLlxuICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlIFwiTGljZW5zZVwiKTtcbiAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS5cbiAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdFxuICpcbiAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMFxuICpcbiAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmVcbiAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuIFwiQVMgSVNcIiBCQVNJUyxcbiAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLlxuICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZFxuICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuXG4gKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuICovXG5cbmltcG9ydCB7VGVuc29yNER9IGZyb20gJy4uL3RlbnNvcic7XG5pbXBvcnQge2NvbnZlcnRUb1RlbnNvcn0gZnJvbSAnLi4vdGVuc29yX3V0aWxfZW52JztcbmltcG9ydCB7VGVuc29yTGlrZX0gZnJvbSAnLi4vdHlwZXMnO1xuaW1wb3J0ICogYXMgdXRpbCBmcm9tICcuLi91dGlsJztcbmltcG9ydCB7b3B9IGZyb20gJy4vb3BlcmF0aW9uJztcbmltcG9ydCB7cmV2ZXJzZX0gZnJvbSAnLi9yZXZlcnNlJztcblxuLyoqXG4gKiBSZXZlcnNlcyBhIGB0Zi5UZW5zb3I0RGAgYWxvbmcgYSBzcGVjaWZpZWQgYXhpcy5cbiAqXG4gKiBAcGFyYW0geCBUaGUgaW5wdXQgdGVuc29yLlxuICogQHBhcmFtIGF4aXMgVGhlIHNldCBvZiBkaW1lbnNpb25zIHRvIHJldmVyc2UuIE11c3QgYmUgaW4gdGhlXG4gKiAgICAgcmFuZ2UgWy1yYW5rKHgpLCByYW5rKHgpKS4gRGVmYXVsdHMgdG8gYWxsIGF4ZXMuXG4gKi9cbmZ1bmN0aW9uIHJldmVyc2U0ZF8oeDogVGVuc29yNER8VGVuc29yTGlrZSwgYXhpcz86IG51bWJlcnxudW1iZXJbXSk6IFRlbnNvcjREIHtcbiAgY29uc3QgJHggPSBjb252ZXJ0VG9UZW5zb3IoeCwgJ3gnLCAncmV2ZXJzZScpO1xuICB1dGlsLmFzc2VydChcbiAgICAgICR4LnJhbmsgPT09IDQsXG4gICAgICAoKSA9PiBgRXJyb3IgaW4gcmV2ZXJzZTREOiB4IG11c3QgYmUgcmFuayA0IGJ1dCBnb3QgcmFuayAkeyR4LnJhbmt9LmApO1xuICByZXR1cm4gcmV2ZXJzZSgkeCwgYXhpcyk7XG59XG5cbmV4cG9ydCBjb25zdCByZXZlcnNlNGQgPSBvcCh7cmV2ZXJzZTRkX30pO1xuIl19","/**\n * @license\n * Copyright 2020 Google Inc. All Rights Reserved.\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n * =============================================================================\n */\nimport { TensorBuffer } from '../tensor';\nimport { convertToTensor } from '../tensor_util_env';\nimport * as util from '../util';\n/**\n * Computes the difference between two lists of numbers.\n *\n * Given a Tensor `x` and a Tensor `y`, this operation returns a Tensor `out`\n * that represents all values that are in `x` but not in `y`. The returned\n * Tensor `out` is sorted in the same order that the numbers appear in `x`\n * (duplicates are preserved). This operation also returns a Tensor indices that\n * represents the position of each out element in `x`. In other words:\n *\n * `out[i] = x[idx[i]] for i in [0, 1, ..., out.length - 1]`\n *\n * ```js\n * const x = [1, 2, 3, 4, 5, 6];\n * const y = [1, 3, 5];\n *\n * const [out, indices] = await tf.setdiff1dAsync(x, y);\n * out.print(); // [2, 4, 6]\n * indices.print(); // [1, 3, 5]\n * ```\n *\n * @param x 1-D Tensor. Values to keep.\n * @param y 1-D Tensor. Must have the same type as x. Values to exclude in the\n * output.\n * @returns Promise of Tensor tuple [out, indices].\n * out: Tensor with the same type as x.\n * indices: A Tensor of type int32.\n *\n * @doc {heading: 'Tensors', subheading: 'Transformations'}\n */\nasync function setdiff1dAsync_(x, y) {\n const $x = convertToTensor(x, 'x', 'setdiff1d');\n const $y = convertToTensor(y, 'y', 'setdiff1d');\n util.assert($x.dtype === $y.dtype, () => `x and y should have the same dtype, but got x (${$x.dtype}) and y (${$y.dtype}).`);\n util.assert($x.rank === 1, () => `x should be 1D tensor, but got x (${$x.shape}).`);\n util.assert($y.rank === 1, () => `y should be 1D tensor, but got y (${$y.shape}).`);\n const xVals = await $x.data();\n const yVals = await $y.data();\n const ySet = new Set(yVals);\n let outputSize = 0;\n for (let i = 0; i < xVals.length; i++) {\n if (!ySet.has(xVals[i])) {\n outputSize++;\n }\n }\n const buffer = new TensorBuffer([outputSize], $x.dtype);\n const indices = new TensorBuffer([outputSize], 'int32');\n for (let i = 0, p = 0; i < xVals.length; i++) {\n if (!ySet.has(xVals[i])) {\n buffer.values[p] = xVals[i];\n indices.values[p] = i;\n p++;\n }\n }\n return [buffer.toTensor(), indices.toTensor()];\n}\nexport const setdiff1dAsync = setdiff1dAsync_;\n//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic2V0ZGlmZjFkX2FzeW5jLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vLi4vdGZqcy1jb3JlL3NyYy9vcHMvc2V0ZGlmZjFkX2FzeW5jLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBOzs7Ozs7Ozs7Ozs7Ozs7R0FlRztBQUNILE9BQU8sRUFBUyxZQUFZLEVBQUMsTUFBTSxXQUFXLENBQUM7QUFDL0MsT0FBTyxFQUFDLGVBQWUsRUFBQyxNQUFNLG9CQUFvQixDQUFDO0FBRW5ELE9BQU8sS0FBSyxJQUFJLE1BQU0sU0FBUyxDQUFDO0FBRWhDOzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7O0dBNEJHO0FBQ0gsS0FBSyxVQUFVLGVBQWUsQ0FDMUIsQ0FBb0IsRUFBRSxDQUFvQjtJQUM1QyxNQUFNLEVBQUUsR0FBRyxlQUFlLENBQUMsQ0FBQyxFQUFFLEdBQUcsRUFBRSxXQUFXLENBQUMsQ0FBQztJQUNoRCxNQUFNLEVBQUUsR0FBRyxlQUFlLENBQUMsQ0FBQyxFQUFFLEdBQUcsRUFBRSxXQUFXLENBQUMsQ0FBQztJQUVoRCxJQUFJLENBQUMsTUFBTSxDQUNQLEVBQUUsQ0FBQyxLQUFLLEtBQUssRUFBRSxDQUFDLEtBQUssRUFDckIsR0FBRyxFQUFFLENBQUMsa0RBQ0YsRUFBRSxDQUFDLEtBQUssWUFBWSxFQUFFLENBQUMsS0FBSyxJQUFJLENBQUMsQ0FBQztJQUUxQyxJQUFJLENBQUMsTUFBTSxDQUNQLEVBQUUsQ0FBQyxJQUFJLEtBQUssQ0FBQyxFQUFFLEdBQUcsRUFBRSxDQUFDLHFDQUFxQyxFQUFFLENBQUMsS0FBSyxJQUFJLENBQUMsQ0FBQztJQUU1RSxJQUFJLENBQUMsTUFBTSxDQUNQLEVBQUUsQ0FBQyxJQUFJLEtBQUssQ0FBQyxFQUFFLEdBQUcsRUFBRSxDQUFDLHFDQUFxQyxFQUFFLENBQUMsS0FBSyxJQUFJLENBQUMsQ0FBQztJQUU1RSxNQUFNLEtBQUssR0FBRyxNQUFNLEVBQUUsQ0FBQyxJQUFJLEVBQUUsQ0FBQztJQUM5QixNQUFNLEtBQUssR0FBRyxNQUFNLEVBQUUsQ0FBQyxJQUFJLEVBQUUsQ0FBQztJQUM5QixNQUFNLElBQUksR0FBRyxJQUFJLEdBQUcsQ0FBQyxLQUFLLENBQUMsQ0FBQztJQUU1QixJQUFJLFVBQVUsR0FBRyxDQUFDLENBQUM7SUFDbkIsS0FBSyxJQUFJLENBQUMsR0FBRyxDQUFDLEVBQUUsQ0FBQyxHQUFHLEtBQUssQ0FBQyxNQUFNLEVBQUUsQ0FBQyxFQUFFLEVBQUU7UUFDckMsSUFBSSxDQUFDLElBQUksQ0FBQyxHQUFHLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQyxDQUFDLEVBQUU7WUFDdkIsVUFBVSxFQUFFLENBQUM7U0FDZDtLQUNGO0lBRUQsTUFBTSxNQUFNLEdBQUcsSUFBSSxZQUFZLENBQUMsQ0FBQyxVQUFVLENBQUMsRUFBRSxFQUFFLENBQUMsS0FBSyxDQUFDLENBQUM7SUFDeEQsTUFBTSxPQUFPLEdBQUcsSUFBSSxZQUFZLENBQUMsQ0FBQyxVQUFVLENBQUMsRUFBRSxPQUFPLENBQUMsQ0FBQztJQUN4RCxLQUFLLElBQUksQ0FBQyxHQUFHLENBQUMsRUFBRSxDQUFDLEdBQUcsQ0FBQyxFQUFFLENBQUMsR0FBRyxLQUFLLENBQUMsTUFBTSxFQUFFLENBQUMsRUFBRSxFQUFFO1FBQzVDLElBQUksQ0FBQyxJQUFJLENBQUMsR0FBRyxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUMsQ0FBQyxFQUFFO1lBQ3ZCLE1BQU0sQ0FBQyxNQUFNLENBQUMsQ0FBQyxDQUFDLEdBQUcsS0FBSyxDQUFDLENBQUMsQ0FBQyxDQUFDO1lBQzVCLE9BQU8sQ0FBQyxNQUFNLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDO1lBQ3RCLENBQUMsRUFBRSxDQUFDO1NBQ0w7S0FDRjtJQUNELE9BQU8sQ0FBQyxNQUFNLENBQUMsUUFBUSxFQUFFLEVBQUUsT0FBTyxDQUFDLFFBQVEsRUFBRSxDQUFDLENBQUM7QUFDakQsQ0FBQztBQUNELE1BQU0sQ0FBQyxNQUFNLGNBQWMsR0FBRyxlQUFlLENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyIvKipcbiAqIEBsaWNlbnNlXG4gKiBDb3B5cmlnaHQgMjAyMCBHb29nbGUgSW5jLiBBbGwgUmlnaHRzIFJlc2VydmVkLlxuICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlIFwiTGljZW5zZVwiKTtcbiAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS5cbiAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdFxuICpcbiAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMFxuICpcbiAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmVcbiAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuIFwiQVMgSVNcIiBCQVNJUyxcbiAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLlxuICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZFxuICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuXG4gKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuICovXG5pbXBvcnQge1RlbnNvciwgVGVuc29yQnVmZmVyfSBmcm9tICcuLi90ZW5zb3InO1xuaW1wb3J0IHtjb252ZXJ0VG9UZW5zb3J9IGZyb20gJy4uL3RlbnNvcl91dGlsX2Vudic7XG5pbXBvcnQge1RlbnNvckxpa2V9IGZyb20gJy4uL3R5cGVzJztcbmltcG9ydCAqIGFzIHV0aWwgZnJvbSAnLi4vdXRpbCc7XG5cbi8qKlxuICogQ29tcHV0ZXMgdGhlIGRpZmZlcmVuY2UgYmV0d2VlbiB0d28gbGlzdHMgb2YgbnVtYmVycy5cbiAqXG4gKiBHaXZlbiBhIFRlbnNvciBgeGAgYW5kIGEgVGVuc29yIGB5YCwgdGhpcyBvcGVyYXRpb24gcmV0dXJucyBhIFRlbnNvciBgb3V0YFxuICogdGhhdCByZXByZXNlbnRzIGFsbCB2YWx1ZXMgdGhhdCBhcmUgaW4gYHhgIGJ1dCBub3QgaW4gYHlgLiBUaGUgcmV0dXJuZWRcbiAqIFRlbnNvciBgb3V0YCBpcyBzb3J0ZWQgaW4gdGhlIHNhbWUgb3JkZXIgdGhhdCB0aGUgbnVtYmVycyBhcHBlYXIgaW4gYHhgXG4gKiAoZHVwbGljYXRlcyBhcmUgcHJlc2VydmVkKS4gVGhpcyBvcGVyYXRpb24gYWxzbyByZXR1cm5zIGEgVGVuc29yIGluZGljZXMgdGhhdFxuICogcmVwcmVzZW50cyB0aGUgcG9zaXRpb24gb2YgZWFjaCBvdXQgZWxlbWVudCBpbiBgeGAuIEluIG90aGVyIHdvcmRzOlxuICpcbiAqIGBvdXRbaV0gPSB4W2lkeFtpXV0gZm9yIGkgaW4gWzAsIDEsIC4uLiwgb3V0Lmxlbmd0aCAtIDFdYFxuICpcbiAqIGBgYGpzXG4gKiBjb25zdCB4ID0gWzEsIDIsIDMsIDQsIDUsIDZdO1xuICogY29uc3QgeSA9IFsxLCAzLCA1XTtcbiAqXG4gKiBjb25zdCBbb3V0LCBpbmRpY2VzXSA9IGF3YWl0IHRmLnNldGRpZmYxZEFzeW5jKHgsIHkpO1xuICogb3V0LnByaW50KCk7IC8vIFsyLCA0LCA2XVxuICogaW5kaWNlcy5wcmludCgpOyAvLyBbMSwgMywgNV1cbiAqIGBgYFxuICpcbiAqIEBwYXJhbSB4IDEtRCBUZW5zb3IuIFZhbHVlcyB0byBrZWVwLlxuICogQHBhcmFtIHkgMS1EIFRlbnNvci4gTXVzdCBoYXZlIHRoZSBzYW1lIHR5cGUgYXMgeC4gVmFsdWVzIHRvIGV4Y2x1ZGUgaW4gdGhlXG4gKiAgICAgb3V0cHV0LlxuICogQHJldHVybnMgUHJvbWlzZSBvZiBUZW5zb3IgdHVwbGUgW291dCwgaW5kaWNlc10uXG4gKiAgb3V0OiBUZW5zb3Igd2l0aCB0aGUgc2FtZSB0eXBlIGFzIHguXG4gKiAgaW5kaWNlczogQSBUZW5zb3Igb2YgdHlwZSBpbnQzMi5cbiAqXG4gKiBAZG9jIHtoZWFkaW5nOiAnVGVuc29ycycsIHN1YmhlYWRpbmc6ICdUcmFuc2Zvcm1hdGlvbnMnfVxuICovXG5hc3luYyBmdW5jdGlvbiBzZXRkaWZmMWRBc3luY18oXG4gICAgeDogVGVuc29yfFRlbnNvckxpa2UsIHk6IFRlbnNvcnxUZW5zb3JMaWtlKTogUHJvbWlzZTxbVGVuc29yLCBUZW5zb3JdPiB7XG4gIGNvbnN0ICR4ID0gY29udmVydFRvVGVuc29yKHgsICd4JywgJ3NldGRpZmYxZCcpO1xuICBjb25zdCAkeSA9IGNvbnZlcnRUb1RlbnNvcih5LCAneScsICdzZXRkaWZmMWQnKTtcblxuICB1dGlsLmFzc2VydChcbiAgICAgICR4LmR0eXBlID09PSAkeS5kdHlwZSxcbiAgICAgICgpID0+IGB4IGFuZCB5IHNob3VsZCBoYXZlIHRoZSBzYW1lIGR0eXBlLCBidXQgZ290IHggKCR7XG4gICAgICAgICAgJHguZHR5cGV9KSBhbmQgeSAoJHskeS5kdHlwZX0pLmApO1xuXG4gIHV0aWwuYXNzZXJ0KFxuICAgICAgJHgucmFuayA9PT0gMSwgKCkgPT4gYHggc2hvdWxkIGJlIDFEIHRlbnNvciwgYnV0IGdvdCB4ICgkeyR4LnNoYXBlfSkuYCk7XG5cbiAgdXRpbC5hc3NlcnQoXG4gICAgICAkeS5yYW5rID09PSAxLCAoKSA9PiBgeSBzaG91bGQgYmUgMUQgdGVuc29yLCBidXQgZ290IHkgKCR7JHkuc2hhcGV9KS5gKTtcblxuICBjb25zdCB4VmFscyA9IGF3YWl0ICR4LmRhdGEoKTtcbiAgY29uc3QgeVZhbHMgPSBhd2FpdCAkeS5kYXRhKCk7XG4gIGNvbnN0IHlTZXQgPSBuZXcgU2V0KHlWYWxzKTtcblxuICBsZXQgb3V0cHV0U2l6ZSA9IDA7XG4gIGZvciAobGV0IGkgPSAwOyBpIDwgeFZhbHMubGVuZ3RoOyBpKyspIHtcbiAgICBpZiAoIXlTZXQuaGFzKHhWYWxzW2ldKSkge1xuICAgICAgb3V0cHV0U2l6ZSsrO1xuICAgIH1cbiAgfVxuXG4gIGNvbnN0IGJ1ZmZlciA9IG5ldyBUZW5zb3JCdWZmZXIoW291dHB1dFNpemVdLCAkeC5kdHlwZSk7XG4gIGNvbnN0IGluZGljZXMgPSBuZXcgVGVuc29yQnVmZmVyKFtvdXRwdXRTaXplXSwgJ2ludDMyJyk7XG4gIGZvciAobGV0IGkgPSAwLCBwID0gMDsgaSA8IHhWYWxzLmxlbmd0aDsgaSsrKSB7XG4gICAgaWYgKCF5U2V0Lmhhcyh4VmFsc1tpXSkpIHtcbiAgICAgIGJ1ZmZlci52YWx1ZXNbcF0gPSB4VmFsc1tpXTtcbiAgICAgIGluZGljZXMudmFsdWVzW3BdID0gaTtcbiAgICAgIHArKztcbiAgICB9XG4gIH1cbiAgcmV0dXJuIFtidWZmZXIudG9UZW5zb3IoKSwgaW5kaWNlcy50b1RlbnNvcigpXTtcbn1cbmV4cG9ydCBjb25zdCBzZXRkaWZmMWRBc3luYyA9IHNldGRpZmYxZEFzeW5jXztcbiJdfQ==","/**\n * @license\n * Copyright 2018 Google LLC. All Rights Reserved.\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n * =============================================================================\n */\nimport { convertToTensor } from '../tensor_util_env';\nimport * as util from '../util';\nimport { op } from './operation';\nimport { slice } from './slice';\n/**\n * Extracts a 1D slice from 1D array starting at coordinates `begin` and is\n * of length `size`. See `slice` for details.\n */\nfunction slice1d_(x, begin, size) {\n const $x = convertToTensor(x, 'x', 'slice1d');\n util.assert($x.rank === 1, () => `slice1d expects a rank-1 tensor, but got a rank-${$x.rank} tensor`);\n return slice($x, [begin], [size]);\n}\nexport const slice1d = op({ slice1d_ });\n//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic2xpY2UxZC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uLy4uL3RmanMtY29yZS9zcmMvb3BzL3NsaWNlMWQudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUE7Ozs7Ozs7Ozs7Ozs7OztHQWVHO0FBR0gsT0FBTyxFQUFDLGVBQWUsRUFBQyxNQUFNLG9CQUFvQixDQUFDO0FBRW5ELE9BQU8sS0FBSyxJQUFJLE1BQU0sU0FBUyxDQUFDO0FBRWhDLE9BQU8sRUFBQyxFQUFFLEVBQUMsTUFBTSxhQUFhLENBQUM7QUFDL0IsT0FBTyxFQUFDLEtBQUssRUFBQyxNQUFNLFNBQVMsQ0FBQztBQUU5Qjs7O0dBR0c7QUFDSCxTQUFTLFFBQVEsQ0FDYixDQUFzQixFQUFFLEtBQWEsRUFBRSxJQUFZO0lBQ3JELE1BQU0sRUFBRSxHQUFHLGVBQWUsQ0FBQyxDQUFDLEVBQUUsR0FBRyxFQUFFLFNBQVMsQ0FBQyxDQUFDO0lBQzlDLElBQUksQ0FBQyxNQUFNLENBQ1AsRUFBRSxDQUFDLElBQUksS0FBSyxDQUFDLEVBQ2IsR0FBRyxFQUFFLENBQ0QsbURBQW1ELEVBQUUsQ0FBQyxJQUFJLFNBQVMsQ0FBQyxDQUFDO0lBQzdFLE9BQU8sS0FBSyxDQUFDLEVBQUUsRUFBRSxDQUFDLEtBQUssQ0FBQyxFQUFFLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQztBQUNwQyxDQUFDO0FBQ0QsTUFBTSxDQUFDLE1BQU0sT0FBTyxHQUFHLEVBQUUsQ0FBQyxFQUFDLFFBQVEsRUFBQyxDQUFDLENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyIvKipcbiAqIEBsaWNlbnNlXG4gKiBDb3B5cmlnaHQgMjAxOCBHb29nbGUgTExDLiBBbGwgUmlnaHRzIFJlc2VydmVkLlxuICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlIFwiTGljZW5zZVwiKTtcbiAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS5cbiAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdFxuICpcbiAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMFxuICpcbiAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmVcbiAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuIFwiQVMgSVNcIiBCQVNJUyxcbiAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLlxuICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZFxuICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuXG4gKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuICovXG5cbmltcG9ydCB7VGVuc29yMUR9IGZyb20gJy4uL3RlbnNvcic7XG5pbXBvcnQge2NvbnZlcnRUb1RlbnNvcn0gZnJvbSAnLi4vdGVuc29yX3V0aWxfZW52JztcbmltcG9ydCB7VGVuc29yTGlrZX0gZnJvbSAnLi4vdHlwZXMnO1xuaW1wb3J0ICogYXMgdXRpbCBmcm9tICcuLi91dGlsJztcblxuaW1wb3J0IHtvcH0gZnJvbSAnLi9vcGVyYXRpb24nO1xuaW1wb3J0IHtzbGljZX0gZnJvbSAnLi9zbGljZSc7XG5cbi8qKlxuICogRXh0cmFjdHMgYSAxRCBzbGljZSBmcm9tIDFEIGFycmF5IHN0YXJ0aW5nIGF0IGNvb3JkaW5hdGVzIGBiZWdpbmAgYW5kIGlzXG4gKiBvZiBsZW5ndGggYHNpemVgLiBTZWUgYHNsaWNlYCBmb3IgZGV0YWlscy5cbiAqL1xuZnVuY3Rpb24gc2xpY2UxZF8oXG4gICAgeDogVGVuc29yMUR8VGVuc29yTGlrZSwgYmVnaW46IG51bWJlciwgc2l6ZTogbnVtYmVyKTogVGVuc29yMUQge1xuICBjb25zdCAkeCA9IGNvbnZlcnRUb1RlbnNvcih4LCAneCcsICdzbGljZTFkJyk7XG4gIHV0aWwuYXNzZXJ0KFxuICAgICAgJHgucmFuayA9PT0gMSxcbiAgICAgICgpID0+XG4gICAgICAgICAgYHNsaWNlMWQgZXhwZWN0cyBhIHJhbmstMSB0ZW5zb3IsIGJ1dCBnb3QgYSByYW5rLSR7JHgucmFua30gdGVuc29yYCk7XG4gIHJldHVybiBzbGljZSgkeCwgW2JlZ2luXSwgW3NpemVdKTtcbn1cbmV4cG9ydCBjb25zdCBzbGljZTFkID0gb3Aoe3NsaWNlMWRffSk7XG4iXX0=","/**\n * @license\n * Copyright 2018 Google LLC. All Rights Reserved.\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n * =============================================================================\n */\nimport { convertToTensor } from '../tensor_util_env';\nimport * as util from '../util';\nimport { op } from './operation';\nimport { slice } from './slice';\n/**\n * Extracts a 2D slice from a 2D array starting at coordinates `begin` and\n * is of size `size`. See `slice` for details.\n */\nfunction slice2d_(x, begin, size) {\n const $x = convertToTensor(x, 'x', 'slice2d');\n util.assert($x.rank === 2, () => `slice2d expects a rank-2 tensor, but got a rank-${$x.rank} tensor`);\n return slice($x, begin, size);\n}\nexport const slice2d = op({ slice2d_ });\n//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic2xpY2UyZC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uLy4uL3RmanMtY29yZS9zcmMvb3BzL3NsaWNlMmQudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUE7Ozs7Ozs7Ozs7Ozs7OztHQWVHO0FBR0gsT0FBTyxFQUFDLGVBQWUsRUFBQyxNQUFNLG9CQUFvQixDQUFDO0FBRW5ELE9BQU8sS0FBSyxJQUFJLE1BQU0sU0FBUyxDQUFDO0FBRWhDLE9BQU8sRUFBQyxFQUFFLEVBQUMsTUFBTSxhQUFhLENBQUM7QUFDL0IsT0FBTyxFQUFDLEtBQUssRUFBQyxNQUFNLFNBQVMsQ0FBQztBQUU5Qjs7O0dBR0c7QUFDSCxTQUFTLFFBQVEsQ0FDYixDQUFzQixFQUFFLEtBQXVCLEVBQy9DLElBQXNCO0lBQ3hCLE1BQU0sRUFBRSxHQUFHLGVBQWUsQ0FBQyxDQUFDLEVBQUUsR0FBRyxFQUFFLFNBQVMsQ0FBQyxDQUFDO0lBQzlDLElBQUksQ0FBQyxNQUFNLENBQ1AsRUFBRSxDQUFDLElBQUksS0FBSyxDQUFDLEVBQ2IsR0FBRyxFQUFFLENBQ0QsbURBQW1ELEVBQUUsQ0FBQyxJQUFJLFNBQVMsQ0FBQyxDQUFDO0lBQzdFLE9BQU8sS0FBSyxDQUFDLEVBQUUsRUFBRSxLQUFLLEVBQUUsSUFBSSxDQUFDLENBQUM7QUFDaEMsQ0FBQztBQUNELE1BQU0sQ0FBQyxNQUFNLE9BQU8sR0FBRyxFQUFFLENBQUMsRUFBQyxRQUFRLEVBQUMsQ0FBQyxDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiLyoqXG4gKiBAbGljZW5zZVxuICogQ29weXJpZ2h0IDIwMTggR29vZ2xlIExMQy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC5cbiAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSBcIkxpY2Vuc2VcIik7XG4gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuXG4gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXRcbiAqXG4gKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjBcbiAqXG4gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlXG4gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiBcIkFTIElTXCIgQkFTSVMsXG4gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC5cbiAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmRcbiAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLlxuICogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbiAqL1xuXG5pbXBvcnQge1RlbnNvcjJEfSBmcm9tICcuLi90ZW5zb3InO1xuaW1wb3J0IHtjb252ZXJ0VG9UZW5zb3J9IGZyb20gJy4uL3RlbnNvcl91dGlsX2Vudic7XG5pbXBvcnQge1RlbnNvckxpa2V9IGZyb20gJy4uL3R5cGVzJztcbmltcG9ydCAqIGFzIHV0aWwgZnJvbSAnLi4vdXRpbCc7XG5cbmltcG9ydCB7b3B9IGZyb20gJy4vb3BlcmF0aW9uJztcbmltcG9ydCB7c2xpY2V9IGZyb20gJy4vc2xpY2UnO1xuXG4vKipcbiAqIEV4dHJhY3RzIGEgMkQgc2xpY2UgZnJvbSBhIDJEIGFycmF5IHN0YXJ0aW5nIGF0IGNvb3JkaW5hdGVzIGBiZWdpbmAgYW5kXG4gKiBpcyBvZiBzaXplIGBzaXplYC4gU2VlIGBzbGljZWAgZm9yIGRldGFpbHMuXG4gKi9cbmZ1bmN0aW9uIHNsaWNlMmRfKFxuICAgIHg6IFRlbnNvcjJEfFRlbnNvckxpa2UsIGJlZ2luOiBbbnVtYmVyLCBudW1iZXJdLFxuICAgIHNpemU6IFtudW1iZXIsIG51bWJlcl0pOiBUZW5zb3IyRCB7XG4gIGNvbnN0ICR4ID0gY29udmVydFRvVGVuc29yKHgsICd4JywgJ3NsaWNlMmQnKTtcbiAgdXRpbC5hc3NlcnQoXG4gICAgICAkeC5yYW5rID09PSAyLFxuICAgICAgKCkgPT5cbiAgICAgICAgICBgc2xpY2UyZCBleHBlY3RzIGEgcmFuay0yIHRlbnNvciwgYnV0IGdvdCBhIHJhbmstJHskeC5yYW5rfSB0ZW5zb3JgKTtcbiAgcmV0dXJuIHNsaWNlKCR4LCBiZWdpbiwgc2l6ZSk7XG59XG5leHBvcnQgY29uc3Qgc2xpY2UyZCA9IG9wKHtzbGljZTJkX30pO1xuIl19","/**\n * @license\n * Copyright 2018 Google LLC. All Rights Reserved.\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n * =============================================================================\n */\nimport { convertToTensor } from '../tensor_util_env';\nimport * as util from '../util';\nimport { op } from './operation';\nimport { slice } from './slice';\n/**\n * Extracts a 3D slice from a 3D array starting at coordinates `begin` and\n * is of size `size`. See `slice` for details.\n */\nfunction slice3d_(x, begin, size) {\n const $x = convertToTensor(x, 'x', 'slice3d');\n util.assert($x.rank === 3, () => `slice3d expects a rank-3 tensor, but got a rank-${$x.rank} tensor`);\n return slice($x, begin, size);\n}\nexport const slice3d = op({ slice3d_ });\n//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic2xpY2UzZC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uLy4uL3RmanMtY29yZS9zcmMvb3BzL3NsaWNlM2QudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUE7Ozs7Ozs7Ozs7Ozs7OztHQWVHO0FBR0gsT0FBTyxFQUFDLGVBQWUsRUFBQyxNQUFNLG9CQUFvQixDQUFDO0FBRW5ELE9BQU8sS0FBSyxJQUFJLE1BQU0sU0FBUyxDQUFDO0FBRWhDLE9BQU8sRUFBQyxFQUFFLEVBQUMsTUFBTSxhQUFhLENBQUM7QUFDL0IsT0FBTyxFQUFDLEtBQUssRUFBQyxNQUFNLFNBQVMsQ0FBQztBQUU5Qjs7O0dBR0c7QUFDSCxTQUFTLFFBQVEsQ0FDYixDQUFzQixFQUFFLEtBQStCLEVBQ3ZELElBQThCO0lBQ2hDLE1BQU0sRUFBRSxHQUFHLGVBQWUsQ0FBQyxDQUFDLEVBQUUsR0FBRyxFQUFFLFNBQVMsQ0FBQyxDQUFDO0lBQzlDLElBQUksQ0FBQyxNQUFNLENBQ1AsRUFBRSxDQUFDLElBQUksS0FBSyxDQUFDLEVBQ2IsR0FBRyxFQUFFLENBQ0QsbURBQW1ELEVBQUUsQ0FBQyxJQUFJLFNBQVMsQ0FBQyxDQUFDO0lBQzdFLE9BQU8sS0FBSyxDQUFDLEVBQUUsRUFBRSxLQUFLLEVBQUUsSUFBSSxDQUFDLENBQUM7QUFDaEMsQ0FBQztBQUNELE1BQU0sQ0FBQyxNQUFNLE9BQU8sR0FBRyxFQUFFLENBQUMsRUFBQyxRQUFRLEVBQUMsQ0FBQyxDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiLyoqXG4gKiBAbGljZW5zZVxuICogQ29weXJpZ2h0IDIwMTggR29vZ2xlIExMQy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC5cbiAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSBcIkxpY2Vuc2VcIik7XG4gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuXG4gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXRcbiAqXG4gKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjBcbiAqXG4gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlXG4gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiBcIkFTIElTXCIgQkFTSVMsXG4gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC5cbiAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmRcbiAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLlxuICogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbiAqL1xuXG5pbXBvcnQge1RlbnNvcjNEfSBmcm9tICcuLi90ZW5zb3InO1xuaW1wb3J0IHtjb252ZXJ0VG9UZW5zb3J9IGZyb20gJy4uL3RlbnNvcl91dGlsX2Vudic7XG5pbXBvcnQge1RlbnNvckxpa2V9IGZyb20gJy4uL3R5cGVzJztcbmltcG9ydCAqIGFzIHV0aWwgZnJvbSAnLi4vdXRpbCc7XG5cbmltcG9ydCB7b3B9IGZyb20gJy4vb3BlcmF0aW9uJztcbmltcG9ydCB7c2xpY2V9IGZyb20gJy4vc2xpY2UnO1xuXG4vKipcbiAqIEV4dHJhY3RzIGEgM0Qgc2xpY2UgZnJvbSBhIDNEIGFycmF5IHN0YXJ0aW5nIGF0IGNvb3JkaW5hdGVzIGBiZWdpbmAgYW5kXG4gKiBpcyBvZiBzaXplIGBzaXplYC4gU2VlIGBzbGljZWAgZm9yIGRldGFpbHMuXG4gKi9cbmZ1bmN0aW9uIHNsaWNlM2RfKFxuICAgIHg6IFRlbnNvcjNEfFRlbnNvckxpa2UsIGJlZ2luOiBbbnVtYmVyLCBudW1iZXIsIG51bWJlcl0sXG4gICAgc2l6ZTogW251bWJlciwgbnVtYmVyLCBudW1iZXJdKTogVGVuc29yM0Qge1xuICBjb25zdCAkeCA9IGNvbnZlcnRUb1RlbnNvcih4LCAneCcsICdzbGljZTNkJyk7XG4gIHV0aWwuYXNzZXJ0KFxuICAgICAgJHgucmFuayA9PT0gMyxcbiAgICAgICgpID0+XG4gICAgICAgICAgYHNsaWNlM2QgZXhwZWN0cyBhIHJhbmstMyB0ZW5zb3IsIGJ1dCBnb3QgYSByYW5rLSR7JHgucmFua30gdGVuc29yYCk7XG4gIHJldHVybiBzbGljZSgkeCwgYmVnaW4sIHNpemUpO1xufVxuZXhwb3J0IGNvbnN0IHNsaWNlM2QgPSBvcCh7c2xpY2UzZF99KTtcbiJdfQ==","/**\n * @license\n * Copyright 2018 Google LLC. All Rights Reserved.\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n * =============================================================================\n */\nimport { convertToTensor } from '../tensor_util_env';\nimport * as util from '../util';\nimport { op } from './operation';\nimport { slice } from './slice';\n/**\n * Extracts a 4D slice from a 4D array starting at coordinates `begin` and\n * is of size `size`. See `slice` for details.\n */\nfunction slice4d_(x, begin, size) {\n const $x = convertToTensor(x, 'x', 'slice4d');\n util.assert($x.rank === 4, () => `slice4d expects a rank-4 tensor, but got a rank-${$x.rank} tensor`);\n return slice($x, begin, size);\n}\nexport const slice4d = op({ slice4d_ });\n//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic2xpY2U0ZC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uLy4uL3RmanMtY29yZS9zcmMvb3BzL3NsaWNlNGQudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUE7Ozs7Ozs7Ozs7Ozs7OztHQWVHO0FBR0gsT0FBTyxFQUFDLGVBQWUsRUFBQyxNQUFNLG9CQUFvQixDQUFDO0FBRW5ELE9BQU8sS0FBSyxJQUFJLE1BQU0sU0FBUyxDQUFDO0FBRWhDLE9BQU8sRUFBQyxFQUFFLEVBQUMsTUFBTSxhQUFhLENBQUM7QUFDL0IsT0FBTyxFQUFDLEtBQUssRUFBQyxNQUFNLFNBQVMsQ0FBQztBQUU5Qjs7O0dBR0c7QUFDSCxTQUFTLFFBQVEsQ0FDYixDQUFzQixFQUFFLEtBQXVDLEVBQy9ELElBQXNDO0lBQ3hDLE1BQU0sRUFBRSxHQUFHLGVBQWUsQ0FBQyxDQUFDLEVBQUUsR0FBRyxFQUFFLFNBQVMsQ0FBQyxDQUFDO0lBQzlDLElBQUksQ0FBQyxNQUFNLENBQ1AsRUFBRSxDQUFDLElBQUksS0FBSyxDQUFDLEVBQ2IsR0FBRyxFQUFFLENBQ0QsbURBQW1ELEVBQUUsQ0FBQyxJQUFJLFNBQVMsQ0FBQyxDQUFDO0lBQzdFLE9BQU8sS0FBSyxDQUFDLEVBQUUsRUFBRSxLQUFLLEVBQUUsSUFBSSxDQUFDLENBQUM7QUFDaEMsQ0FBQztBQUNELE1BQU0sQ0FBQyxNQUFNLE9BQU8sR0FBRyxFQUFFLENBQUMsRUFBQyxRQUFRLEVBQUMsQ0FBQyxDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiLyoqXG4gKiBAbGljZW5zZVxuICogQ29weXJpZ2h0IDIwMTggR29vZ2xlIExMQy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC5cbiAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSBcIkxpY2Vuc2VcIik7XG4gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuXG4gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXRcbiAqXG4gKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjBcbiAqXG4gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlXG4gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiBcIkFTIElTXCIgQkFTSVMsXG4gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC5cbiAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmRcbiAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLlxuICogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbiAqL1xuXG5pbXBvcnQge1RlbnNvcjREfSBmcm9tICcuLi90ZW5zb3InO1xuaW1wb3J0IHtjb252ZXJ0VG9UZW5zb3J9IGZyb20gJy4uL3RlbnNvcl91dGlsX2Vudic7XG5pbXBvcnQge1RlbnNvckxpa2V9IGZyb20gJy4uL3R5cGVzJztcbmltcG9ydCAqIGFzIHV0aWwgZnJvbSAnLi4vdXRpbCc7XG5cbmltcG9ydCB7b3B9IGZyb20gJy4vb3BlcmF0aW9uJztcbmltcG9ydCB7c2xpY2V9IGZyb20gJy4vc2xpY2UnO1xuXG4vKipcbiAqIEV4dHJhY3RzIGEgNEQgc2xpY2UgZnJvbSBhIDREIGFycmF5IHN0YXJ0aW5nIGF0IGNvb3JkaW5hdGVzIGBiZWdpbmAgYW5kXG4gKiBpcyBvZiBzaXplIGBzaXplYC4gU2VlIGBzbGljZWAgZm9yIGRldGFpbHMuXG4gKi9cbmZ1bmN0aW9uIHNsaWNlNGRfKFxuICAgIHg6IFRlbnNvcjREfFRlbnNvckxpa2UsIGJlZ2luOiBbbnVtYmVyLCBudW1iZXIsIG51bWJlciwgbnVtYmVyXSxcbiAgICBzaXplOiBbbnVtYmVyLCBudW1iZXIsIG51bWJlciwgbnVtYmVyXSk6IFRlbnNvcjREIHtcbiAgY29uc3QgJHggPSBjb252ZXJ0VG9UZW5zb3IoeCwgJ3gnLCAnc2xpY2U0ZCcpO1xuICB1dGlsLmFzc2VydChcbiAgICAgICR4LnJhbmsgPT09IDQsXG4gICAgICAoKSA9PlxuICAgICAgICAgIGBzbGljZTRkIGV4cGVjdHMgYSByYW5rLTQgdGVuc29yLCBidXQgZ290IGEgcmFuay0keyR4LnJhbmt9IHRlbnNvcmApO1xuICByZXR1cm4gc2xpY2UoJHgsIGJlZ2luLCBzaXplKTtcbn1cbmV4cG9ydCBjb25zdCBzbGljZTRkID0gb3Aoe3NsaWNlNGRffSk7XG4iXX0=","/**\n * @license\n * Copyright 2018 Google LLC. All Rights Reserved.\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n * =============================================================================\n */\nimport { inferShape } from '../tensor_util_env';\nimport { assertNonNull } from '../util';\nimport { makeTensor } from './tensor_ops_util';\n/**\n * Creates rank-1 `tf.Tensor` with the provided values, shape and dtype.\n *\n * The same functionality can be achieved with `tf.tensor`, but in general\n * we recommend using `tf.tensor1d` as it makes the code more readable.\n *\n * ```js\n * tf.tensor1d([1, 2, 3]).print();\n * ```\n *\n * @param values The values of the tensor. Can be array of numbers,\n * or a `TypedArray`.\n * @param dtype The data type.\n *\n * @doc {heading: 'Tensors', subheading: 'Creation'}\n */\nexport function tensor1d(values, dtype) {\n assertNonNull(values);\n const inferredShape = inferShape(values, dtype);\n if (inferredShape.length !== 1) {\n throw new Error('tensor1d() requires values to be a flat/TypedArray');\n }\n const shape = null;\n return makeTensor(values, shape, inferredShape, dtype);\n}\n//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidGVuc29yMWQuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi8uLi90ZmpzLWNvcmUvc3JjL29wcy90ZW5zb3IxZC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQTs7Ozs7Ozs7Ozs7Ozs7O0dBZUc7QUFHSCxPQUFPLEVBQUMsVUFBVSxFQUFDLE1BQU0sb0JBQW9CLENBQUM7QUFHOUMsT0FBTyxFQUFDLGFBQWEsRUFBQyxNQUFNLFNBQVMsQ0FBQztBQUN0QyxPQUFPLEVBQUMsVUFBVSxFQUFDLE1BQU0sbUJBQW1CLENBQUM7QUFFN0M7Ozs7Ozs7Ozs7Ozs7OztHQWVHO0FBQ0gsTUFBTSxVQUFVLFFBQVEsQ0FBQyxNQUFvQixFQUFFLEtBQWdCO0lBQzdELGFBQWEsQ0FBQyxNQUFNLENBQUMsQ0FBQztJQUN0QixNQUFNLGFBQWEsR0FBRyxVQUFVLENBQUMsTUFBTSxFQUFFLEtBQUssQ0FBQyxDQUFDO0lBQ2hELElBQUksYUFBYSxDQUFDLE1BQU0sS0FBSyxDQUFDLEVBQUU7UUFDOUIsTUFBTSxJQUFJLEtBQUssQ0FBQyxvREFBb0QsQ0FBQyxDQUFDO0tBQ3ZFO0lBQ0QsTUFBTSxLQUFLLEdBQWEsSUFBSSxDQUFDO0lBQzdCLE9BQU8sVUFBVSxDQUFDLE1BQU0sRUFBRSxLQUFLLEVBQUUsYUFBYSxFQUFFLEtBQUssQ0FBYSxDQUFDO0FBQ3JFLENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyIvKipcbiAqIEBsaWNlbnNlXG4gKiBDb3B5cmlnaHQgMjAxOCBHb29nbGUgTExDLiBBbGwgUmlnaHRzIFJlc2VydmVkLlxuICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlIFwiTGljZW5zZVwiKTtcbiAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS5cbiAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdFxuICpcbiAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMFxuICpcbiAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmVcbiAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuIFwiQVMgSVNcIiBCQVNJUyxcbiAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLlxuICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZFxuICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuXG4gKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuICovXG5cbmltcG9ydCB7VGVuc29yMUR9IGZyb20gJy4uL3RlbnNvcic7XG5pbXBvcnQge2luZmVyU2hhcGV9IGZyb20gJy4uL3RlbnNvcl91dGlsX2Vudic7XG5pbXBvcnQge1RlbnNvckxpa2UxRH0gZnJvbSAnLi4vdHlwZXMnO1xuaW1wb3J0IHtEYXRhVHlwZX0gZnJvbSAnLi4vdHlwZXMnO1xuaW1wb3J0IHthc3NlcnROb25OdWxsfSBmcm9tICcuLi91dGlsJztcbmltcG9ydCB7bWFrZVRlbnNvcn0gZnJvbSAnLi90ZW5zb3Jfb3BzX3V0aWwnO1xuXG4vKipcbiAqIENyZWF0ZXMgcmFuay0xIGB0Zi5UZW5zb3JgIHdpdGggdGhlIHByb3ZpZGVkIHZhbHVlcywgc2hhcGUgYW5kIGR0eXBlLlxuICpcbiAqIFRoZSBzYW1lIGZ1bmN0aW9uYWxpdHkgY2FuIGJlIGFjaGlldmVkIHdpdGggYHRmLnRlbnNvcmAsIGJ1dCBpbiBnZW5lcmFsXG4gKiB3ZSByZWNvbW1lbmQgdXNpbmcgYHRmLnRlbnNvcjFkYCBhcyBpdCBtYWtlcyB0aGUgY29kZSBtb3JlIHJlYWRhYmxlLlxuICpcbiAqIGBgYGpzXG4gKiB0Zi50ZW5zb3IxZChbMSwgMiwgM10pLnByaW50KCk7XG4gKiBgYGBcbiAqXG4gKiBAcGFyYW0gdmFsdWVzIFRoZSB2YWx1ZXMgb2YgdGhlIHRlbnNvci4gQ2FuIGJlIGFycmF5IG9mIG51bWJlcnMsXG4gKiAgICAgb3IgYSBgVHlwZWRBcnJheWAuXG4gKiBAcGFyYW0gZHR5cGUgVGhlIGRhdGEgdHlwZS5cbiAqXG4gKiBAZG9jIHtoZWFkaW5nOiAnVGVuc29ycycsIHN1YmhlYWRpbmc6ICdDcmVhdGlvbid9XG4gKi9cbmV4cG9ydCBmdW5jdGlvbiB0ZW5zb3IxZCh2YWx1ZXM6IFRlbnNvckxpa2UxRCwgZHR5cGU/OiBEYXRhVHlwZSk6IFRlbnNvcjFEIHtcbiAgYXNzZXJ0Tm9uTnVsbCh2YWx1ZXMpO1xuICBjb25zdCBpbmZlcnJlZFNoYXBlID0gaW5mZXJTaGFwZSh2YWx1ZXMsIGR0eXBlKTtcbiAgaWYgKGluZmVycmVkU2hhcGUubGVuZ3RoICE9PSAxKSB7XG4gICAgdGhyb3cgbmV3IEVycm9yKCd0ZW5zb3IxZCgpIHJlcXVpcmVzIHZhbHVlcyB0byBiZSBhIGZsYXQvVHlwZWRBcnJheScpO1xuICB9XG4gIGNvbnN0IHNoYXBlOiBudW1iZXJbXSA9IG51bGw7XG4gIHJldHVybiBtYWtlVGVuc29yKHZhbHVlcywgc2hhcGUsIGluZmVycmVkU2hhcGUsIGR0eXBlKSBhcyBUZW5zb3IxRDtcbn1cbiJdfQ==","/**\n * @license\n * Copyright 2018 Google LLC. All Rights Reserved.\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n * =============================================================================\n */\nimport { inferShape } from '../tensor_util_env';\nimport { assertNonNull } from '../util';\nimport { makeTensor } from './tensor_ops_util';\n/**\n * Creates rank-2 `tf.Tensor` with the provided values, shape and dtype.\n *\n * The same functionality can be achieved with `tf.tensor`, but in general\n * we recommend using `tf.tensor2d` as it makes the code more readable.\n *\n * ```js\n * // Pass a nested array.\n * tf.tensor2d([[1, 2], [3, 4]]).print();\n * ```\n * ```js\n * // Pass a flat array and specify a shape.\n * tf.tensor2d([1, 2, 3, 4], [2, 2]).print();\n * ```\n *\n * @param values The values of the tensor. Can be nested array of numbers,\n * or a flat array, or a `TypedArray`.\n * @param shape The shape of the tensor. If not provided, it is inferred from\n * `values`.\n * @param dtype The data type.\n *\n * @doc {heading: 'Tensors', subheading: 'Creation'}\n */\nexport function tensor2d(values, shape, dtype) {\n assertNonNull(values);\n if (shape != null && shape.length !== 2) {\n throw new Error('tensor2d() requires shape to have two numbers');\n }\n const inferredShape = inferShape(values, dtype);\n if (inferredShape.length !== 2 && inferredShape.length !== 1) {\n throw new Error('tensor2d() requires values to be number[][] or flat/TypedArray');\n }\n if (inferredShape.length === 1 && shape == null) {\n throw new Error('tensor2d() requires shape to be provided when `values` ' +\n 'are a flat/TypedArray');\n }\n return makeTensor(values, shape, inferredShape, dtype);\n}\n//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidGVuc29yMmQuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi8uLi90ZmpzLWNvcmUvc3JjL29wcy90ZW5zb3IyZC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQTs7Ozs7Ozs7Ozs7Ozs7O0dBZUc7QUFHSCxPQUFPLEVBQUMsVUFBVSxFQUFDLE1BQU0sb0JBQW9CLENBQUM7QUFHOUMsT0FBTyxFQUFDLGFBQWEsRUFBQyxNQUFNLFNBQVMsQ0FBQztBQUN0QyxPQUFPLEVBQUMsVUFBVSxFQUFDLE1BQU0sbUJBQW1CLENBQUM7QUFFN0M7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7R0FzQkc7QUFDSCxNQUFNLFVBQVUsUUFBUSxDQUNwQixNQUFvQixFQUFFLEtBQXdCLEVBQzlDLEtBQWdCO0lBQ2xCLGFBQWEsQ0FBQyxNQUFNLENBQUMsQ0FBQztJQUN0QixJQUFJLEtBQUssSUFBSSxJQUFJLElBQUksS0FBSyxDQUFDLE1BQU0sS0FBSyxDQUFDLEVBQUU7UUFDdkMsTUFBTSxJQUFJLEtBQUssQ0FBQywrQ0FBK0MsQ0FBQyxDQUFDO0tBQ2xFO0lBQ0QsTUFBTSxhQUFhLEdBQUcsVUFBVSxDQUFDLE1BQU0sRUFBRSxLQUFLLENBQUMsQ0FBQztJQUNoRCxJQUFJLGFBQWEsQ0FBQyxNQUFNLEtBQUssQ0FBQyxJQUFJLGFBQWEsQ0FBQyxNQUFNLEtBQUssQ0FBQyxFQUFFO1FBQzVELE1BQU0sSUFBSSxLQUFLLENBQ1gsZ0VBQWdFLENBQUMsQ0FBQztLQUN2RTtJQUNELElBQUksYUFBYSxDQUFDLE1BQU0sS0FBSyxDQUFDLElBQUksS0FBSyxJQUFJLElBQUksRUFBRTtRQUMvQyxNQUFNLElBQUksS0FBSyxDQUNYLHlEQUF5RDtZQUN6RCx1QkFBdUIsQ0FBQyxDQUFDO0tBQzlCO0lBQ0QsT0FBTyxVQUFVLENBQUMsTUFBTSxFQUFFLEtBQUssRUFBRSxhQUFhLEVBQUUsS0FBSyxDQUFhLENBQUM7QUFDckUsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbIi8qKlxuICogQGxpY2Vuc2VcbiAqIENvcHlyaWdodCAyMDE4IEdvb2dsZSBMTEMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuXG4gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgXCJMaWNlbnNlXCIpO1xuICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLlxuICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0XG4gKlxuICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wXG4gKlxuICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZVxuICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gXCJBUyBJU1wiIEJBU0lTLFxuICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuXG4gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kXG4gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS5cbiAqID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4gKi9cblxuaW1wb3J0IHtUZW5zb3IyRH0gZnJvbSAnLi4vdGVuc29yJztcbmltcG9ydCB7aW5mZXJTaGFwZX0gZnJvbSAnLi4vdGVuc29yX3V0aWxfZW52JztcbmltcG9ydCB7VGVuc29yTGlrZTJEfSBmcm9tICcuLi90eXBlcyc7XG5pbXBvcnQge0RhdGFUeXBlfSBmcm9tICcuLi90eXBlcyc7XG5pbXBvcnQge2Fzc2VydE5vbk51bGx9IGZyb20gJy4uL3V0aWwnO1xuaW1wb3J0IHttYWtlVGVuc29yfSBmcm9tICcuL3RlbnNvcl9vcHNfdXRpbCc7XG5cbi8qKlxuICogQ3JlYXRlcyByYW5rLTIgYHRmLlRlbnNvcmAgd2l0aCB0aGUgcHJvdmlkZWQgdmFsdWVzLCBzaGFwZSBhbmQgZHR5cGUuXG4gKlxuICogVGhlIHNhbWUgZnVuY3Rpb25hbGl0eSBjYW4gYmUgYWNoaWV2ZWQgd2l0aCBgdGYudGVuc29yYCwgYnV0IGluIGdlbmVyYWxcbiAqIHdlIHJlY29tbWVuZCB1c2luZyBgdGYudGVuc29yMmRgIGFzIGl0IG1ha2VzIHRoZSBjb2RlIG1vcmUgcmVhZGFibGUuXG4gKlxuICogIGBgYGpzXG4gKiAvLyBQYXNzIGEgbmVzdGVkIGFycmF5LlxuICogdGYudGVuc29yMmQoW1sxLCAyXSwgWzMsIDRdXSkucHJpbnQoKTtcbiAqIGBgYFxuICogYGBganNcbiAqIC8vIFBhc3MgYSBmbGF0IGFycmF5IGFuZCBzcGVjaWZ5IGEgc2hhcGUuXG4gKiB0Zi50ZW5zb3IyZChbMSwgMiwgMywgNF0sIFsyLCAyXSkucHJpbnQoKTtcbiAqIGBgYFxuICpcbiAqIEBwYXJhbSB2YWx1ZXMgVGhlIHZhbHVlcyBvZiB0aGUgdGVuc29yLiBDYW4gYmUgbmVzdGVkIGFycmF5IG9mIG51bWJlcnMsXG4gKiAgICAgb3IgYSBmbGF0IGFycmF5LCBvciBhIGBUeXBlZEFycmF5YC5cbiAqIEBwYXJhbSBzaGFwZSBUaGUgc2hhcGUgb2YgdGhlIHRlbnNvci4gSWYgbm90IHByb3ZpZGVkLCBpdCBpcyBpbmZlcnJlZCBmcm9tXG4gKiAgICAgYHZhbHVlc2AuXG4gKiBAcGFyYW0gZHR5cGUgVGhlIGRhdGEgdHlwZS5cbiAqXG4gKiBAZG9jIHtoZWFkaW5nOiAnVGVuc29ycycsIHN1YmhlYWRpbmc6ICdDcmVhdGlvbid9XG4gKi9cbmV4cG9ydCBmdW5jdGlvbiB0ZW5zb3IyZChcbiAgICB2YWx1ZXM6IFRlbnNvckxpa2UyRCwgc2hhcGU/OiBbbnVtYmVyLCBudW1iZXJdLFxuICAgIGR0eXBlPzogRGF0YVR5cGUpOiBUZW5zb3IyRCB7XG4gIGFzc2VydE5vbk51bGwodmFsdWVzKTtcbiAgaWYgKHNoYXBlICE9IG51bGwgJiYgc2hhcGUubGVuZ3RoICE9PSAyKSB7XG4gICAgdGhyb3cgbmV3IEVycm9yKCd0ZW5zb3IyZCgpIHJlcXVpcmVzIHNoYXBlIHRvIGhhdmUgdHdvIG51bWJlcnMnKTtcbiAgfVxuICBjb25zdCBpbmZlcnJlZFNoYXBlID0gaW5mZXJTaGFwZSh2YWx1ZXMsIGR0eXBlKTtcbiAgaWYgKGluZmVycmVkU2hhcGUubGVuZ3RoICE9PSAyICYmIGluZmVycmVkU2hhcGUubGVuZ3RoICE9PSAxKSB7XG4gICAgdGhyb3cgbmV3IEVycm9yKFxuICAgICAgICAndGVuc29yMmQoKSByZXF1aXJlcyB2YWx1ZXMgdG8gYmUgbnVtYmVyW11bXSBvciBmbGF0L1R5cGVkQXJyYXknKTtcbiAgfVxuICBpZiAoaW5mZXJyZWRTaGFwZS5sZW5ndGggPT09IDEgJiYgc2hhcGUgPT0gbnVsbCkge1xuICAgIHRocm93IG5ldyBFcnJvcihcbiAgICAgICAgJ3RlbnNvcjJkKCkgcmVxdWlyZXMgc2hhcGUgdG8gYmUgcHJvdmlkZWQgd2hlbiBgdmFsdWVzYCAnICtcbiAgICAgICAgJ2FyZSBhIGZsYXQvVHlwZWRBcnJheScpO1xuICB9XG4gIHJldHVybiBtYWtlVGVuc29yKHZhbHVlcywgc2hhcGUsIGluZmVycmVkU2hhcGUsIGR0eXBlKSBhcyBUZW5zb3IyRDtcbn1cbiJdfQ==","/**\n * @license\n * Copyright 2018 Google LLC. All Rights Reserved.\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n * =============================================================================\n */\nimport { inferShape } from '../tensor_util_env';\nimport { assertNonNull } from '../util';\nimport { makeTensor } from './tensor_ops_util';\n/**\n * Creates rank-4 `tf.Tensor` with the provided values, shape and dtype.\n *\n * The same functionality can be achieved with `tf.tensor`, but in general\n * we recommend using `tf.tensor4d` as it makes the code more readable.\n *\n * ```js\n * // Pass a nested array.\n * tf.tensor4d([[[[1], [2]], [[3], [4]]]]).print();\n * ```\n * ```js\n * // Pass a flat array and specify a shape.\n * tf.tensor4d([1, 2, 3, 4], [1, 2, 2, 1]).print();\n * ```\n *\n * @param values The values of the tensor. Can be nested array of numbers,\n * or a flat array, or a `TypedArray`.\n * @param shape The shape of the tensor. Optional. If not provided,\n * it is inferred from `values`.\n * @param dtype The data type.\n *\n * @doc {heading: 'Tensors', subheading: 'Creation'}\n */\nexport function tensor4d(values, shape, dtype) {\n assertNonNull(values);\n if (shape != null && shape.length !== 4) {\n throw new Error('tensor4d() requires shape to have four numbers');\n }\n const inferredShape = inferShape(values, dtype);\n if (inferredShape.length !== 4 && inferredShape.length !== 1) {\n throw new Error('tensor4d() requires values to be number[][][][] or flat/TypedArray');\n }\n if (inferredShape.length === 1 && shape == null) {\n throw new Error('tensor4d() requires shape to be provided when `values` ' +\n 'are a flat array');\n }\n return makeTensor(values, shape, inferredShape, dtype);\n}\n//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidGVuc29yNGQuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi8uLi90ZmpzLWNvcmUvc3JjL29wcy90ZW5zb3I0ZC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQTs7Ozs7Ozs7Ozs7Ozs7O0dBZUc7QUFHSCxPQUFPLEVBQUMsVUFBVSxFQUFDLE1BQU0sb0JBQW9CLENBQUM7QUFHOUMsT0FBTyxFQUFDLGFBQWEsRUFBQyxNQUFNLFNBQVMsQ0FBQztBQUN0QyxPQUFPLEVBQUMsVUFBVSxFQUFDLE1BQU0sbUJBQW1CLENBQUM7QUFFN0M7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7R0FzQkc7QUFDSCxNQUFNLFVBQVUsUUFBUSxDQUNwQixNQUFvQixFQUFFLEtBQXdDLEVBQzlELEtBQWdCO0lBQ2xCLGFBQWEsQ0FBQyxNQUFNLENBQUMsQ0FBQztJQUN0QixJQUFJLEtBQUssSUFBSSxJQUFJLElBQUksS0FBSyxDQUFDLE1BQU0sS0FBSyxDQUFDLEVBQUU7UUFDdkMsTUFBTSxJQUFJLEtBQUssQ0FBQyxnREFBZ0QsQ0FBQyxDQUFDO0tBQ25FO0lBQ0QsTUFBTSxhQUFhLEdBQUcsVUFBVSxDQUFDLE1BQU0sRUFBRSxLQUFLLENBQUMsQ0FBQztJQUNoRCxJQUFJLGFBQWEsQ0FBQyxNQUFNLEtBQUssQ0FBQyxJQUFJLGFBQWEsQ0FBQyxNQUFNLEtBQUssQ0FBQyxFQUFFO1FBQzVELE1BQU0sSUFBSSxLQUFLLENBQ1gsb0VBQW9FLENBQUMsQ0FBQztLQUMzRTtJQUNELElBQUksYUFBYSxDQUFDLE1BQU0sS0FBSyxDQUFDLElBQUksS0FBSyxJQUFJLElBQUksRUFBRTtRQUMvQyxNQUFNLElBQUksS0FBSyxDQUNYLHlEQUF5RDtZQUN6RCxrQkFBa0IsQ0FBQyxDQUFDO0tBQ3pCO0lBQ0QsT0FBTyxVQUFVLENBQUMsTUFBTSxFQUFFLEtBQUssRUFBRSxhQUFhLEVBQUUsS0FBSyxDQUFhLENBQUM7QUFDckUsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbIi8qKlxuICogQGxpY2Vuc2VcbiAqIENvcHlyaWdodCAyMDE4IEdvb2dsZSBMTEMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuXG4gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgXCJMaWNlbnNlXCIpO1xuICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLlxuICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0XG4gKlxuICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wXG4gKlxuICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZVxuICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gXCJBUyBJU1wiIEJBU0lTLFxuICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuXG4gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kXG4gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS5cbiAqID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4gKi9cblxuaW1wb3J0IHtUZW5zb3I0RH0gZnJvbSAnLi4vdGVuc29yJztcbmltcG9ydCB7aW5mZXJTaGFwZX0gZnJvbSAnLi4vdGVuc29yX3V0aWxfZW52JztcbmltcG9ydCB7VGVuc29yTGlrZTREfSBmcm9tICcuLi90eXBlcyc7XG5pbXBvcnQge0RhdGFUeXBlfSBmcm9tICcuLi90eXBlcyc7XG5pbXBvcnQge2Fzc2VydE5vbk51bGx9IGZyb20gJy4uL3V0aWwnO1xuaW1wb3J0IHttYWtlVGVuc29yfSBmcm9tICcuL3RlbnNvcl9vcHNfdXRpbCc7XG5cbi8qKlxuICogQ3JlYXRlcyByYW5rLTQgYHRmLlRlbnNvcmAgd2l0aCB0aGUgcHJvdmlkZWQgdmFsdWVzLCBzaGFwZSBhbmQgZHR5cGUuXG4gKlxuICogVGhlIHNhbWUgZnVuY3Rpb25hbGl0eSBjYW4gYmUgYWNoaWV2ZWQgd2l0aCBgdGYudGVuc29yYCwgYnV0IGluIGdlbmVyYWxcbiAqIHdlIHJlY29tbWVuZCB1c2luZyBgdGYudGVuc29yNGRgIGFzIGl0IG1ha2VzIHRoZSBjb2RlIG1vcmUgcmVhZGFibGUuXG4gKlxuICogIGBgYGpzXG4gKiAvLyBQYXNzIGEgbmVzdGVkIGFycmF5LlxuICogdGYudGVuc29yNGQoW1tbWzFdLCBbMl1dLCBbWzNdLCBbNF1dXV0pLnByaW50KCk7XG4gKiBgYGBcbiAqIGBgYGpzXG4gKiAvLyBQYXNzIGEgZmxhdCBhcnJheSBhbmQgc3BlY2lmeSBhIHNoYXBlLlxuICogdGYudGVuc29yNGQoWzEsIDIsIDMsIDRdLCBbMSwgMiwgMiwgMV0pLnByaW50KCk7XG4gKiBgYGBcbiAqXG4gKiBAcGFyYW0gdmFsdWVzIFRoZSB2YWx1ZXMgb2YgdGhlIHRlbnNvci4gQ2FuIGJlIG5lc3RlZCBhcnJheSBvZiBudW1iZXJzLFxuICogICAgIG9yIGEgZmxhdCBhcnJheSwgb3IgYSBgVHlwZWRBcnJheWAuXG4gKiBAcGFyYW0gc2hhcGUgVGhlIHNoYXBlIG9mIHRoZSB0ZW5zb3IuIE9wdGlvbmFsLiBJZiBub3QgcHJvdmlkZWQsXG4gKiAgIGl0IGlzIGluZmVycmVkIGZyb20gYHZhbHVlc2AuXG4gKiBAcGFyYW0gZHR5cGUgVGhlIGRhdGEgdHlwZS5cbiAqXG4gKiBAZG9jIHtoZWFkaW5nOiAnVGVuc29ycycsIHN1YmhlYWRpbmc6ICdDcmVhdGlvbid9XG4gKi9cbmV4cG9ydCBmdW5jdGlvbiB0ZW5zb3I0ZChcbiAgICB2YWx1ZXM6IFRlbnNvckxpa2U0RCwgc2hhcGU/OiBbbnVtYmVyLCBudW1iZXIsIG51bWJlciwgbnVtYmVyXSxcbiAgICBkdHlwZT86IERhdGFUeXBlKTogVGVuc29yNEQge1xuICBhc3NlcnROb25OdWxsKHZhbHVlcyk7XG4gIGlmIChzaGFwZSAhPSBudWxsICYmIHNoYXBlLmxlbmd0aCAhPT0gNCkge1xuICAgIHRocm93IG5ldyBFcnJvcigndGVuc29yNGQoKSByZXF1aXJlcyBzaGFwZSB0byBoYXZlIGZvdXIgbnVtYmVycycpO1xuICB9XG4gIGNvbnN0IGluZmVycmVkU2hhcGUgPSBpbmZlclNoYXBlKHZhbHVlcywgZHR5cGUpO1xuICBpZiAoaW5mZXJyZWRTaGFwZS5sZW5ndGggIT09IDQgJiYgaW5mZXJyZWRTaGFwZS5sZW5ndGggIT09IDEpIHtcbiAgICB0aHJvdyBuZXcgRXJyb3IoXG4gICAgICAgICd0ZW5zb3I0ZCgpIHJlcXVpcmVzIHZhbHVlcyB0byBiZSBudW1iZXJbXVtdW11bXSBvciBmbGF0L1R5cGVkQXJyYXknKTtcbiAgfVxuICBpZiAoaW5mZXJyZWRTaGFwZS5sZW5ndGggPT09IDEgJiYgc2hhcGUgPT0gbnVsbCkge1xuICAgIHRocm93IG5ldyBFcnJvcihcbiAgICAgICAgJ3RlbnNvcjRkKCkgcmVxdWlyZXMgc2hhcGUgdG8gYmUgcHJvdmlkZWQgd2hlbiBgdmFsdWVzYCAnICtcbiAgICAgICAgJ2FyZSBhIGZsYXQgYXJyYXknKTtcbiAgfVxuICByZXR1cm4gbWFrZVRlbnNvcih2YWx1ZXMsIHNoYXBlLCBpbmZlcnJlZFNoYXBlLCBkdHlwZSkgYXMgVGVuc29yNEQ7XG59XG4iXX0=","/**\n * @license\n * Copyright 2018 Google LLC. All Rights Reserved.\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n * =============================================================================\n */\nimport { inferShape } from '../tensor_util_env';\nimport { assertNonNull } from '../util';\nimport { makeTensor } from './tensor_ops_util';\n/**\n * Creates rank-5 `tf.Tensor` with the provided values, shape and dtype.\n *\n * The same functionality can be achieved with `tf.tensor`, but in general\n * we recommend using `tf.tensor5d` as it makes the code more readable.\n *\n * ```js\n * // Pass a nested array.\n * tf.tensor5d([[[[[1],[2]],[[3],[4]]],[[[5],[6]],[[7],[8]]]]]).print();\n * ```\n * ```js\n * // Pass a flat array and specify a shape.\n * tf.tensor5d([1, 2, 3, 4, 5, 6, 7, 8], [1, 2, 2, 2, 1]).print();\n * ```\n *\n * @param values The values of the tensor. Can be nested array of numbers,\n * or a flat array, or a `TypedArray`.\n * @param shape The shape of the tensor. Optional. If not provided,\n * it is inferred from `values`.\n * @param dtype The data type.\n *\n * @doc {heading: 'Tensors', subheading: 'Creation'}\n */\nexport function tensor5d(values, shape, dtype) {\n assertNonNull(values);\n if (shape != null && shape.length !== 5) {\n throw new Error('tensor5d() requires shape to have five numbers');\n }\n const inferredShape = inferShape(values, dtype);\n if (inferredShape.length !== 5 && inferredShape.length !== 1) {\n throw new Error('tensor5d() requires values to be ' +\n 'number[][][][][] or flat/TypedArray');\n }\n if (inferredShape.length === 1 && shape == null) {\n throw new Error('tensor5d() requires shape to be provided when `values` ' +\n 'are a flat array');\n }\n return makeTensor(values, shape, inferredShape, dtype);\n}\n//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidGVuc29yNWQuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi8uLi90ZmpzLWNvcmUvc3JjL29wcy90ZW5zb3I1ZC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQTs7Ozs7Ozs7Ozs7Ozs7O0dBZUc7QUFHSCxPQUFPLEVBQUMsVUFBVSxFQUFDLE1BQU0sb0JBQW9CLENBQUM7QUFHOUMsT0FBTyxFQUFDLGFBQWEsRUFBQyxNQUFNLFNBQVMsQ0FBQztBQUN0QyxPQUFPLEVBQUMsVUFBVSxFQUFDLE1BQU0sbUJBQW1CLENBQUM7QUFFN0M7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7R0FzQkc7QUFDSCxNQUFNLFVBQVUsUUFBUSxDQUNwQixNQUFvQixFQUFFLEtBQWdELEVBQ3RFLEtBQWdCO0lBQ2xCLGFBQWEsQ0FBQyxNQUFNLENBQUMsQ0FBQztJQUN0QixJQUFJLEtBQUssSUFBSSxJQUFJLElBQUksS0FBSyxDQUFDLE1BQU0sS0FBSyxDQUFDLEVBQUU7UUFDdkMsTUFBTSxJQUFJLEtBQUssQ0FBQyxnREFBZ0QsQ0FBQyxDQUFDO0tBQ25FO0lBQ0QsTUFBTSxhQUFhLEdBQUcsVUFBVSxDQUFDLE1BQU0sRUFBRSxLQUFLLENBQUMsQ0FBQztJQUNoRCxJQUFJLGFBQWEsQ0FBQyxNQUFNLEtBQUssQ0FBQyxJQUFJLGFBQWEsQ0FBQyxNQUFNLEtBQUssQ0FBQyxFQUFFO1FBQzVELE1BQU0sSUFBSSxLQUFLLENBQ1gsbUNBQW1DO1lBQ25DLHFDQUFxQyxDQUFDLENBQUM7S0FDNUM7SUFDRCxJQUFJLGFBQWEsQ0FBQyxNQUFNLEtBQUssQ0FBQyxJQUFJLEtBQUssSUFBSSxJQUFJLEVBQUU7UUFDL0MsTUFBTSxJQUFJLEtBQUssQ0FDWCx5REFBeUQ7WUFDekQsa0JBQWtCLENBQUMsQ0FBQztLQUN6QjtJQUNELE9BQU8sVUFBVSxDQUFDLE1BQU0sRUFBRSxLQUFLLEVBQUUsYUFBYSxFQUFFLEtBQUssQ0FBYSxDQUFDO0FBQ3JFLENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyIvKipcbiAqIEBsaWNlbnNlXG4gKiBDb3B5cmlnaHQgMjAxOCBHb29nbGUgTExDLiBBbGwgUmlnaHRzIFJlc2VydmVkLlxuICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlIFwiTGljZW5zZVwiKTtcbiAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS5cbiAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdFxuICpcbiAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMFxuICpcbiAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmVcbiAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuIFwiQVMgSVNcIiBCQVNJUyxcbiAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLlxuICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZFxuICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuXG4gKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuICovXG5cbmltcG9ydCB7VGVuc29yNUR9IGZyb20gJy4uL3RlbnNvcic7XG5pbXBvcnQge2luZmVyU2hhcGV9IGZyb20gJy4uL3RlbnNvcl91dGlsX2Vudic7XG5pbXBvcnQge1RlbnNvckxpa2U1RH0gZnJvbSAnLi4vdHlwZXMnO1xuaW1wb3J0IHtEYXRhVHlwZX0gZnJvbSAnLi4vdHlwZXMnO1xuaW1wb3J0IHthc3NlcnROb25OdWxsfSBmcm9tICcuLi91dGlsJztcbmltcG9ydCB7bWFrZVRlbnNvcn0gZnJvbSAnLi90ZW5zb3Jfb3BzX3V0aWwnO1xuXG4vKipcbiAqIENyZWF0ZXMgcmFuay01IGB0Zi5UZW5zb3JgIHdpdGggdGhlIHByb3ZpZGVkIHZhbHVlcywgc2hhcGUgYW5kIGR0eXBlLlxuICpcbiAqIFRoZSBzYW1lIGZ1bmN0aW9uYWxpdHkgY2FuIGJlIGFjaGlldmVkIHdpdGggYHRmLnRlbnNvcmAsIGJ1dCBpbiBnZW5lcmFsXG4gKiB3ZSByZWNvbW1lbmQgdXNpbmcgYHRmLnRlbnNvcjVkYCBhcyBpdCBtYWtlcyB0aGUgY29kZSBtb3JlIHJlYWRhYmxlLlxuICpcbiAqICBgYGBqc1xuICogLy8gUGFzcyBhIG5lc3RlZCBhcnJheS5cbiAqIHRmLnRlbnNvcjVkKFtbW1tbMV0sWzJdXSxbWzNdLFs0XV1dLFtbWzVdLFs2XV0sW1s3XSxbOF1dXV1dKS5wcmludCgpO1xuICogYGBgXG4gKiBgYGBqc1xuICogLy8gUGFzcyBhIGZsYXQgYXJyYXkgYW5kIHNwZWNpZnkgYSBzaGFwZS5cbiAqIHRmLnRlbnNvcjVkKFsxLCAyLCAzLCA0LCA1LCA2LCA3LCA4XSwgWzEsIDIsIDIsIDIsIDFdKS5wcmludCgpO1xuICogYGBgXG4gKlxuICogQHBhcmFtIHZhbHVlcyBUaGUgdmFsdWVzIG9mIHRoZSB0ZW5zb3IuIENhbiBiZSBuZXN0ZWQgYXJyYXkgb2YgbnVtYmVycyxcbiAqICAgICBvciBhIGZsYXQgYXJyYXksIG9yIGEgYFR5cGVkQXJyYXlgLlxuICogQHBhcmFtIHNoYXBlIFRoZSBzaGFwZSBvZiB0aGUgdGVuc29yLiBPcHRpb25hbC4gSWYgbm90IHByb3ZpZGVkLFxuICogICBpdCBpcyBpbmZlcnJlZCBmcm9tIGB2YWx1ZXNgLlxuICogQHBhcmFtIGR0eXBlIFRoZSBkYXRhIHR5cGUuXG4gKlxuICogQGRvYyB7aGVhZGluZzogJ1RlbnNvcnMnLCBzdWJoZWFkaW5nOiAnQ3JlYXRpb24nfVxuICovXG5leHBvcnQgZnVuY3Rpb24gdGVuc29yNWQoXG4gICAgdmFsdWVzOiBUZW5zb3JMaWtlNUQsIHNoYXBlPzogW251bWJlciwgbnVtYmVyLCBudW1iZXIsIG51bWJlciwgbnVtYmVyXSxcbiAgICBkdHlwZT86IERhdGFUeXBlKTogVGVuc29yNUQge1xuICBhc3NlcnROb25OdWxsKHZhbHVlcyk7XG4gIGlmIChzaGFwZSAhPSBudWxsICYmIHNoYXBlLmxlbmd0aCAhPT0gNSkge1xuICAgIHRocm93IG5ldyBFcnJvcigndGVuc29yNWQoKSByZXF1aXJlcyBzaGFwZSB0byBoYXZlIGZpdmUgbnVtYmVycycpO1xuICB9XG4gIGNvbnN0IGluZmVycmVkU2hhcGUgPSBpbmZlclNoYXBlKHZhbHVlcywgZHR5cGUpO1xuICBpZiAoaW5mZXJyZWRTaGFwZS5sZW5ndGggIT09IDUgJiYgaW5mZXJyZWRTaGFwZS5sZW5ndGggIT09IDEpIHtcbiAgICB0aHJvdyBuZXcgRXJyb3IoXG4gICAgICAgICd0ZW5zb3I1ZCgpIHJlcXVpcmVzIHZhbHVlcyB0byBiZSAnICtcbiAgICAgICAgJ251bWJlcltdW11bXVtdW10gb3IgZmxhdC9UeXBlZEFycmF5Jyk7XG4gIH1cbiAgaWYgKGluZmVycmVkU2hhcGUubGVuZ3RoID09PSAxICYmIHNoYXBlID09IG51bGwpIHtcbiAgICB0aHJvdyBuZXcgRXJyb3IoXG4gICAgICAgICd0ZW5zb3I1ZCgpIHJlcXVpcmVzIHNoYXBlIHRvIGJlIHByb3ZpZGVkIHdoZW4gYHZhbHVlc2AgJyArXG4gICAgICAgICdhcmUgYSBmbGF0IGFycmF5Jyk7XG4gIH1cbiAgcmV0dXJuIG1ha2VUZW5zb3IodmFsdWVzLCBzaGFwZSwgaW5mZXJyZWRTaGFwZSwgZHR5cGUpIGFzIFRlbnNvcjVEO1xufVxuIl19","/**\n * @license\n * Copyright 2018 Google LLC. All Rights Reserved.\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n * =============================================================================\n */\nimport { inferShape } from '../tensor_util_env';\nimport { assertNonNull } from '../util';\nimport { makeTensor } from './tensor_ops_util';\n/**\n * Creates rank-6 `tf.Tensor` with the provided values, shape and dtype.\n *\n * The same functionality can be achieved with `tf.tensor`, but in general\n * we recommend using `tf.tensor6d` as it makes the code more readable.\n *\n * ```js\n * // Pass a nested array.\n * tf.tensor6d([[[[[[1],[2]],[[3],[4]]],[[[5],[6]],[[7],[8]]]]]]).print();\n * ```\n * ```js\n * // Pass a flat array and specify a shape.\n * tf.tensor6d([1, 2, 3, 4, 5, 6, 7, 8], [1, 1, 2, 2, 2, 1]).print();\n * ```\n *\n * @param values The values of the tensor. Can be nested array of numbers,\n * or a flat array, or a `TypedArray`.\n * @param shape The shape of the tensor. Optional. If not provided,\n * it is inferred from `values`.\n * @param dtype The data type.\n *\n * @doc {heading: 'Tensors', subheading: 'Creation'}\n */\nexport function tensor6d(values, shape, dtype) {\n assertNonNull(values);\n if (shape != null && shape.length !== 6) {\n throw new Error('tensor6d() requires shape to have six numbers');\n }\n const inferredShape = inferShape(values, dtype);\n if (inferredShape.length !== 6 && inferredShape.length !== 1) {\n throw new Error('tensor6d() requires values to be number[][][][][][] or ' +\n 'flat/TypedArray');\n }\n if (inferredShape.length === 1 && shape == null) {\n throw new Error('tensor6d() requires shape to be provided when `values` ' +\n 'are a flat array');\n }\n shape = shape ||\n inferredShape;\n return makeTensor(values, shape, inferredShape, dtype);\n}\n//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidGVuc29yNmQuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi8uLi90ZmpzLWNvcmUvc3JjL29wcy90ZW5zb3I2ZC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQTs7Ozs7Ozs7Ozs7Ozs7O0dBZUc7QUFHSCxPQUFPLEVBQUMsVUFBVSxFQUFDLE1BQU0sb0JBQW9CLENBQUM7QUFHOUMsT0FBTyxFQUFDLGFBQWEsRUFBQyxNQUFNLFNBQVMsQ0FBQztBQUN0QyxPQUFPLEVBQUMsVUFBVSxFQUFDLE1BQU0sbUJBQW1CLENBQUM7QUFFN0M7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7R0FzQkc7QUFDSCxNQUFNLFVBQVUsUUFBUSxDQUNwQixNQUFvQixFQUNwQixLQUF3RCxFQUN4RCxLQUFnQjtJQUNsQixhQUFhLENBQUMsTUFBTSxDQUFDLENBQUM7SUFDdEIsSUFBSSxLQUFLLElBQUksSUFBSSxJQUFJLEtBQUssQ0FBQyxNQUFNLEtBQUssQ0FBQyxFQUFFO1FBQ3ZDLE1BQU0sSUFBSSxLQUFLLENBQUMsK0NBQStDLENBQUMsQ0FBQztLQUNsRTtJQUNELE1BQU0sYUFBYSxHQUFHLFVBQVUsQ0FBQyxNQUFNLEVBQUUsS0FBSyxDQUFDLENBQUM7SUFDaEQsSUFBSSxhQUFhLENBQUMsTUFBTSxLQUFLLENBQUMsSUFBSSxhQUFhLENBQUMsTUFBTSxLQUFLLENBQUMsRUFBRTtRQUM1RCxNQUFNLElBQUksS0FBSyxDQUNYLHlEQUF5RDtZQUN6RCxpQkFBaUIsQ0FBQyxDQUFDO0tBQ3hCO0lBQ0QsSUFBSSxhQUFhLENBQUMsTUFBTSxLQUFLLENBQUMsSUFBSSxLQUFLLElBQUksSUFBSSxFQUFFO1FBQy9DLE1BQU0sSUFBSSxLQUFLLENBQ1gseURBQXlEO1lBQ3pELGtCQUFrQixDQUFDLENBQUM7S0FDekI7SUFDRCxLQUFLLEdBQUcsS0FBSztRQUNULGFBQWlFLENBQUM7SUFDdEUsT0FBTyxVQUFVLENBQUMsTUFBTSxFQUFFLEtBQUssRUFBRSxhQUFhLEVBQUUsS0FBSyxDQUFhLENBQUM7QUFDckUsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbIi8qKlxuICogQGxpY2Vuc2VcbiAqIENvcHlyaWdodCAyMDE4IEdvb2dsZSBMTEMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuXG4gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgXCJMaWNlbnNlXCIpO1xuICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLlxuICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0XG4gKlxuICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wXG4gKlxuICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZVxuICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gXCJBUyBJU1wiIEJBU0lTLFxuICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuXG4gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kXG4gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS5cbiAqID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4gKi9cblxuaW1wb3J0IHtUZW5zb3I2RH0gZnJvbSAnLi4vdGVuc29yJztcbmltcG9ydCB7aW5mZXJTaGFwZX0gZnJvbSAnLi4vdGVuc29yX3V0aWxfZW52JztcbmltcG9ydCB7VGVuc29yTGlrZTZEfSBmcm9tICcuLi90eXBlcyc7XG5pbXBvcnQge0RhdGFUeXBlfSBmcm9tICcuLi90eXBlcyc7XG5pbXBvcnQge2Fzc2VydE5vbk51bGx9IGZyb20gJy4uL3V0aWwnO1xuaW1wb3J0IHttYWtlVGVuc29yfSBmcm9tICcuL3RlbnNvcl9vcHNfdXRpbCc7XG5cbi8qKlxuICogQ3JlYXRlcyByYW5rLTYgYHRmLlRlbnNvcmAgd2l0aCB0aGUgcHJvdmlkZWQgdmFsdWVzLCBzaGFwZSBhbmQgZHR5cGUuXG4gKlxuICogVGhlIHNhbWUgZnVuY3Rpb25hbGl0eSBjYW4gYmUgYWNoaWV2ZWQgd2l0aCBgdGYudGVuc29yYCwgYnV0IGluIGdlbmVyYWxcbiAqIHdlIHJlY29tbWVuZCB1c2luZyBgdGYudGVuc29yNmRgIGFzIGl0IG1ha2VzIHRoZSBjb2RlIG1vcmUgcmVhZGFibGUuXG4gKlxuICogIGBgYGpzXG4gKiAvLyBQYXNzIGEgbmVzdGVkIGFycmF5LlxuICogdGYudGVuc29yNmQoW1tbW1tbMV0sWzJdXSxbWzNdLFs0XV1dLFtbWzVdLFs2XV0sW1s3XSxbOF1dXV1dXSkucHJpbnQoKTtcbiAqIGBgYFxuICogYGBganNcbiAqIC8vIFBhc3MgYSBmbGF0IGFycmF5IGFuZCBzcGVjaWZ5IGEgc2hhcGUuXG4gKiB0Zi50ZW5zb3I2ZChbMSwgMiwgMywgNCwgNSwgNiwgNywgOF0sIFsxLCAxLCAyLCAyLCAyLCAxXSkucHJpbnQoKTtcbiAqIGBgYFxuICpcbiAqIEBwYXJhbSB2YWx1ZXMgVGhlIHZhbHVlcyBvZiB0aGUgdGVuc29yLiBDYW4gYmUgbmVzdGVkIGFycmF5IG9mIG51bWJlcnMsXG4gKiAgICAgb3IgYSBmbGF0IGFycmF5LCBvciBhIGBUeXBlZEFycmF5YC5cbiAqIEBwYXJhbSBzaGFwZSBUaGUgc2hhcGUgb2YgdGhlIHRlbnNvci4gT3B0aW9uYWwuIElmIG5vdCBwcm92aWRlZCxcbiAqICAgaXQgaXMgaW5mZXJyZWQgZnJvbSBgdmFsdWVzYC5cbiAqIEBwYXJhbSBkdHlwZSBUaGUgZGF0YSB0eXBlLlxuICpcbiAqIEBkb2Mge2hlYWRpbmc6ICdUZW5zb3JzJywgc3ViaGVhZGluZzogJ0NyZWF0aW9uJ31cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHRlbnNvcjZkKFxuICAgIHZhbHVlczogVGVuc29yTGlrZTZELFxuICAgIHNoYXBlPzogW251bWJlciwgbnVtYmVyLCBudW1iZXIsIG51bWJlciwgbnVtYmVyLCBudW1iZXJdLFxuICAgIGR0eXBlPzogRGF0YVR5cGUpOiBUZW5zb3I2RCB7XG4gIGFzc2VydE5vbk51bGwodmFsdWVzKTtcbiAgaWYgKHNoYXBlICE9IG51bGwgJiYgc2hhcGUubGVuZ3RoICE9PSA2KSB7XG4gICAgdGhyb3cgbmV3IEVycm9yKCd0ZW5zb3I2ZCgpIHJlcXVpcmVzIHNoYXBlIHRvIGhhdmUgc2l4IG51bWJlcnMnKTtcbiAgfVxuICBjb25zdCBpbmZlcnJlZFNoYXBlID0gaW5mZXJTaGFwZSh2YWx1ZXMsIGR0eXBlKTtcbiAgaWYgKGluZmVycmVkU2hhcGUubGVuZ3RoICE9PSA2ICYmIGluZmVycmVkU2hhcGUubGVuZ3RoICE9PSAxKSB7XG4gICAgdGhyb3cgbmV3IEVycm9yKFxuICAgICAgICAndGVuc29yNmQoKSByZXF1aXJlcyB2YWx1ZXMgdG8gYmUgbnVtYmVyW11bXVtdW11bXVtdIG9yICcgK1xuICAgICAgICAnZmxhdC9UeXBlZEFycmF5Jyk7XG4gIH1cbiAgaWYgKGluZmVycmVkU2hhcGUubGVuZ3RoID09PSAxICYmIHNoYXBlID09IG51bGwpIHtcbiAgICB0aHJvdyBuZXcgRXJyb3IoXG4gICAgICAgICd0ZW5zb3I2ZCgpIHJlcXVpcmVzIHNoYXBlIHRvIGJlIHByb3ZpZGVkIHdoZW4gYHZhbHVlc2AgJyArXG4gICAgICAgICdhcmUgYSBmbGF0IGFycmF5Jyk7XG4gIH1cbiAgc2hhcGUgPSBzaGFwZSB8fFxuICAgICAgaW5mZXJyZWRTaGFwZSBhcyBbbnVtYmVyLCBudW1iZXIsIG51bWJlciwgbnVtYmVyLCBudW1iZXIsIG51bWJlcl07XG4gIHJldHVybiBtYWtlVGVuc29yKHZhbHVlcywgc2hhcGUsIGluZmVycmVkU2hhcGUsIGR0eXBlKSBhcyBUZW5zb3I2RDtcbn1cbiJdfQ==","/**\n * @license\n * Copyright 2020 Google LLC. All Rights Reserved.\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n * =============================================================================\n */\nimport { buffer } from './buffer';\nimport { op } from './operation';\nimport { MPRandGauss } from './rand_util';\n/**\n * Creates a `tf.Tensor` with values sampled from a truncated normal\n * distribution.\n *\n * ```js\n * tf.truncatedNormal([2, 2]).print();\n * ```\n *\n * The generated values follow a normal distribution with specified mean and\n * standard deviation, except that values whose magnitude is more than 2\n * standard deviations from the mean are dropped and re-picked.\n *\n * @param shape An array of integers defining the output tensor shape.\n * @param mean The mean of the normal distribution.\n * @param stdDev The standard deviation of the normal distribution.\n * @param dtype The data type of the output tensor.\n * @param seed The seed for the random number generator.\n *\n * @doc {heading: 'Tensors', subheading: 'Creation'}\n */\nfunction truncatedNormal_(shape, mean = 0, stdDev = 1, dtype, seed) {\n if (dtype != null && dtype === 'bool') {\n throw new Error(`Unsupported data type $ { dtype }`);\n }\n const randGauss = new MPRandGauss(mean, stdDev, dtype, true /* truncated */, seed);\n const res = buffer(shape, dtype);\n for (let i = 0; i < res.values.length; i++) {\n res.values[i] = randGauss.nextValue();\n }\n return res.toTensor();\n}\nexport const truncatedNormal = op({ truncatedNormal_ });\n//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidHJ1bmNhdGVkX25vcm1hbC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uLy4uL3RmanMtY29yZS9zcmMvb3BzL3RydW5jYXRlZF9ub3JtYWwudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUE7Ozs7Ozs7Ozs7Ozs7OztHQWVHO0FBS0gsT0FBTyxFQUFDLE1BQU0sRUFBQyxNQUFNLFVBQVUsQ0FBQztBQUNoQyxPQUFPLEVBQUMsRUFBRSxFQUFDLE1BQU0sYUFBYSxDQUFDO0FBQy9CLE9BQU8sRUFBQyxXQUFXLEVBQUMsTUFBTSxhQUFhLENBQUM7QUFFeEM7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7R0FtQkc7QUFDSCxTQUFTLGdCQUFnQixDQUNyQixLQUFrQixFQUFFLElBQUksR0FBRyxDQUFDLEVBQUUsTUFBTSxHQUFHLENBQUMsRUFBRSxLQUF5QixFQUNuRSxJQUFhO0lBQ2YsSUFBSSxLQUFLLElBQUksSUFBSSxJQUFLLEtBQWtCLEtBQUssTUFBTSxFQUFFO1FBQ25ELE1BQU0sSUFBSSxLQUFLLENBQUMsbUNBQW1DLENBQUMsQ0FBQztLQUN0RDtJQUNELE1BQU0sU0FBUyxHQUNYLElBQUksV0FBVyxDQUFDLElBQUksRUFBRSxNQUFNLEVBQUUsS0FBSyxFQUFFLElBQUksQ0FBQyxlQUFlLEVBQUUsSUFBSSxDQUFDLENBQUM7SUFDckUsTUFBTSxHQUFHLEdBQUcsTUFBTSxDQUFDLEtBQUssRUFBRSxLQUFLLENBQUMsQ0FBQztJQUNqQyxLQUFLLElBQUksQ0FBQyxHQUFHLENBQUMsRUFBRSxDQUFDLEdBQUcsR0FBRyxDQUFDLE1BQU0sQ0FBQyxNQUFNLEVBQUUsQ0FBQyxFQUFFLEVBQUU7UUFDMUMsR0FBRyxDQUFDLE1BQU0sQ0FBQyxDQUFDLENBQUMsR0FBRyxTQUFTLENBQUMsU0FBUyxFQUFFLENBQUM7S0FDdkM7SUFDRCxPQUFPLEdBQUcsQ0FBQyxRQUFRLEVBQUUsQ0FBQztBQUN4QixDQUFDO0FBRUQsTUFBTSxDQUFDLE1BQU0sZUFBZSxHQUFHLEVBQUUsQ0FBQyxFQUFDLGdCQUFnQixFQUFDLENBQUMsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbIi8qKlxuICogQGxpY2Vuc2VcbiAqIENvcHlyaWdodCAyMDIwIEdvb2dsZSBMTEMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuXG4gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgXCJMaWNlbnNlXCIpO1xuICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLlxuICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0XG4gKlxuICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wXG4gKlxuICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZVxuICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gXCJBUyBJU1wiIEJBU0lTLFxuICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuXG4gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kXG4gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS5cbiAqID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4gKi9cblxuaW1wb3J0IHtUZW5zb3J9IGZyb20gJy4uL3RlbnNvcic7XG5pbXBvcnQge0RhdGFUeXBlLCBSYW5rLCBTaGFwZU1hcH0gZnJvbSAnLi4vdHlwZXMnO1xuXG5pbXBvcnQge2J1ZmZlcn0gZnJvbSAnLi9idWZmZXInO1xuaW1wb3J0IHtvcH0gZnJvbSAnLi9vcGVyYXRpb24nO1xuaW1wb3J0IHtNUFJhbmRHYXVzc30gZnJvbSAnLi9yYW5kX3V0aWwnO1xuXG4vKipcbiAqIENyZWF0ZXMgYSBgdGYuVGVuc29yYCB3aXRoIHZhbHVlcyBzYW1wbGVkIGZyb20gYSB0cnVuY2F0ZWQgbm9ybWFsXG4gKiBkaXN0cmlidXRpb24uXG4gKlxuICogYGBganNcbiAqIHRmLnRydW5jYXRlZE5vcm1hbChbMiwgMl0pLnByaW50KCk7XG4gKiBgYGBcbiAqXG4gKiBUaGUgZ2VuZXJhdGVkIHZhbHVlcyBmb2xsb3cgYSBub3JtYWwgZGlzdHJpYnV0aW9uIHdpdGggc3BlY2lmaWVkIG1lYW4gYW5kXG4gKiBzdGFuZGFyZCBkZXZpYXRpb24sIGV4Y2VwdCB0aGF0IHZhbHVlcyB3aG9zZSBtYWduaXR1ZGUgaXMgbW9yZSB0aGFuIDJcbiAqIHN0YW5kYXJkIGRldmlhdGlvbnMgZnJvbSB0aGUgbWVhbiBhcmUgZHJvcHBlZCBhbmQgcmUtcGlja2VkLlxuICpcbiAqIEBwYXJhbSBzaGFwZSBBbiBhcnJheSBvZiBpbnRlZ2VycyBkZWZpbmluZyB0aGUgb3V0cHV0IHRlbnNvciBzaGFwZS5cbiAqIEBwYXJhbSBtZWFuIFRoZSBtZWFuIG9mIHRoZSBub3JtYWwgZGlzdHJpYnV0aW9uLlxuICogQHBhcmFtIHN0ZERldiBUaGUgc3RhbmRhcmQgZGV2aWF0aW9uIG9mIHRoZSBub3JtYWwgZGlzdHJpYnV0aW9uLlxuICogQHBhcmFtIGR0eXBlIFRoZSBkYXRhIHR5cGUgb2YgdGhlIG91dHB1dCB0ZW5zb3IuXG4gKiBAcGFyYW0gc2VlZCBUaGUgc2VlZCBmb3IgdGhlIHJhbmRvbSBudW1iZXIgZ2VuZXJhdG9yLlxuICpcbiAqIEBkb2Mge2hlYWRpbmc6ICdUZW5zb3JzJywgc3ViaGVhZGluZzogJ0NyZWF0aW9uJ31cbiAqL1xuZnVuY3Rpb24gdHJ1bmNhdGVkTm9ybWFsXzxSIGV4dGVuZHMgUmFuaz4oXG4gICAgc2hhcGU6IFNoYXBlTWFwW1JdLCBtZWFuID0gMCwgc3RkRGV2ID0gMSwgZHR5cGU/OiAnZmxvYXQzMid8J2ludDMyJyxcbiAgICBzZWVkPzogbnVtYmVyKTogVGVuc29yPFI+IHtcbiAgaWYgKGR0eXBlICE9IG51bGwgJiYgKGR0eXBlIGFzIERhdGFUeXBlKSA9PT0gJ2Jvb2wnKSB7XG4gICAgdGhyb3cgbmV3IEVycm9yKGBVbnN1cHBvcnRlZCBkYXRhIHR5cGUgJCB7IGR0eXBlIH1gKTtcbiAgfVxuICBjb25zdCByYW5kR2F1c3MgPVxuICAgICAgbmV3IE1QUmFuZEdhdXNzKG1lYW4sIHN0ZERldiwgZHR5cGUsIHRydWUgLyogdHJ1bmNhdGVkICovLCBzZWVkKTtcbiAgY29uc3QgcmVzID0gYnVmZmVyKHNoYXBlLCBkdHlwZSk7XG4gIGZvciAobGV0IGkgPSAwOyBpIDwgcmVzLnZhbHVlcy5sZW5ndGg7IGkrKykge1xuICAgIHJlcy52YWx1ZXNbaV0gPSByYW5kR2F1c3MubmV4dFZhbHVlKCk7XG4gIH1cbiAgcmV0dXJuIHJlcy50b1RlbnNvcigpO1xufVxuXG5leHBvcnQgY29uc3QgdHJ1bmNhdGVkTm9ybWFsID0gb3Aoe3RydW5jYXRlZE5vcm1hbF99KTtcbiJdfQ==","/**\n * @license\n * Copyright 2022 Google LLC. All Rights Reserved.\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n * =============================================================================\n */\nimport { searchSorted } from './search_sorted';\n/**\n * Searches for where a value would go in a sorted sequence.\n *\n * This is not a method for checking containment (like javascript in).\n *\n * The typical use case for this operation is \"binning\", \"bucketing\", or\n * \"discretizing\". The values are assigned to bucket-indices based on the edges\n * listed in 'sortedSequence'. This operation returns the bucket-index for each\n * value.\n *\n * The index returned corresponds to the first edge greater than the value.\n *\n * The axis is not settable for this operation. It always operates on the\n * innermost dimension (axis=-1). The operation will accept any number of outer\n * dimensions.\n *\n * Note: This operation assumes that 'upperBound' is sorted along the\n * innermost axis, maybe using 'sort(..., axis=-1)'. If the sequence is not\n * sorted no error is raised and the content of the returned tensor is not well\n * defined.\n *\n * ```js\n * const seq = tf.tensor1d([0, 3, 9, 10, 10]);\n * const values = tf.tensor1d([0, 4, 10]);\n * const result = tf.upperBound(seq, values);\n * result.print(); // [1, 2, 5]\n * ```\n * @param sortedSequence: N-D. Sorted sequence.\n * @param values: N-D. Search values.\n * @return An N-D int32 tensor the size of values containing the result of\n * applying upper bound to each value. The result is not a global index to\n * the entire Tensor, but the index in the last dimension.\n * @doc {heading: 'Operations', subheading: 'Evaluation'}\n */\nexport function upperBound(sortedSequence, values) {\n return searchSorted(sortedSequence, values, 'right');\n}\n//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidXBwZXJfYm91bmQuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi8uLi90ZmpzLWNvcmUvc3JjL29wcy91cHBlcl9ib3VuZC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQTs7Ozs7Ozs7Ozs7Ozs7O0dBZUc7QUFJSCxPQUFPLEVBQUMsWUFBWSxFQUFDLE1BQU0saUJBQWlCLENBQUM7QUFFN0M7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7OztHQWlDRztBQUNILE1BQU0sVUFBVSxVQUFVLENBQ3RCLGNBQWlDLEVBQUUsTUFBeUI7SUFDOUQsT0FBTyxZQUFZLENBQUMsY0FBYyxFQUFFLE1BQU0sRUFBRSxPQUFPLENBQUMsQ0FBQztBQUN2RCxDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiLyoqXG4gKiBAbGljZW5zZVxuICogQ29weXJpZ2h0IDIwMjIgR29vZ2xlIExMQy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC5cbiAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSBcIkxpY2Vuc2VcIik7XG4gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuXG4gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXRcbiAqXG4gKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjBcbiAqXG4gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlXG4gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiBcIkFTIElTXCIgQkFTSVMsXG4gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC5cbiAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmRcbiAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLlxuICogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbiAqL1xuXG5pbXBvcnQge1RlbnNvcn0gZnJvbSAnLi4vdGVuc29yJztcbmltcG9ydCB7VGVuc29yTGlrZX0gZnJvbSAnLi4vdHlwZXMnO1xuaW1wb3J0IHtzZWFyY2hTb3J0ZWR9IGZyb20gJy4vc2VhcmNoX3NvcnRlZCc7XG5cbi8qKlxuICogU2VhcmNoZXMgZm9yIHdoZXJlIGEgdmFsdWUgd291bGQgZ28gaW4gYSBzb3J0ZWQgc2VxdWVuY2UuXG4gKlxuICogVGhpcyBpcyBub3QgYSBtZXRob2QgZm9yIGNoZWNraW5nIGNvbnRhaW5tZW50IChsaWtlIGphdmFzY3JpcHQgaW4pLlxuICpcbiAqIFRoZSB0eXBpY2FsIHVzZSBjYXNlIGZvciB0aGlzIG9wZXJhdGlvbiBpcyBcImJpbm5pbmdcIiwgXCJidWNrZXRpbmdcIiwgb3JcbiAqIFwiZGlzY3JldGl6aW5nXCIuIFRoZSB2YWx1ZXMgYXJlIGFzc2lnbmVkIHRvIGJ1Y2tldC1pbmRpY2VzIGJhc2VkIG9uIHRoZSBlZGdlc1xuICogbGlzdGVkIGluICdzb3J0ZWRTZXF1ZW5jZScuIFRoaXMgb3BlcmF0aW9uIHJldHVybnMgdGhlIGJ1Y2tldC1pbmRleCBmb3IgZWFjaFxuICogdmFsdWUuXG4gKlxuICogVGhlIGluZGV4IHJldHVybmVkIGNvcnJlc3BvbmRzIHRvIHRoZSBmaXJzdCBlZGdlIGdyZWF0ZXIgdGhhbiB0aGUgdmFsdWUuXG4gKlxuICogVGhlIGF4aXMgaXMgbm90IHNldHRhYmxlIGZvciB0aGlzIG9wZXJhdGlvbi4gSXQgYWx3YXlzIG9wZXJhdGVzIG9uIHRoZVxuICogaW5uZXJtb3N0IGRpbWVuc2lvbiAoYXhpcz0tMSkuIFRoZSBvcGVyYXRpb24gd2lsbCBhY2NlcHQgYW55IG51bWJlciBvZiBvdXRlclxuICogZGltZW5zaW9ucy5cbiAqXG4gKiBOb3RlOiBUaGlzIG9wZXJhdGlvbiBhc3N1bWVzIHRoYXQgJ3VwcGVyQm91bmQnIGlzIHNvcnRlZCBhbG9uZyB0aGVcbiAqIGlubmVybW9zdCBheGlzLCBtYXliZSB1c2luZyAnc29ydCguLi4sIGF4aXM9LTEpJy4gSWYgdGhlIHNlcXVlbmNlIGlzIG5vdFxuICogc29ydGVkIG5vIGVycm9yIGlzIHJhaXNlZCBhbmQgdGhlIGNvbnRlbnQgb2YgdGhlIHJldHVybmVkIHRlbnNvciBpcyBub3Qgd2VsbFxuICogZGVmaW5lZC5cbiAqXG4gKiBgYGBqc1xuICogY29uc3Qgc2VxID0gdGYudGVuc29yMWQoWzAsIDMsIDksIDEwLCAxMF0pO1xuICogY29uc3QgdmFsdWVzID0gdGYudGVuc29yMWQoWzAsIDQsIDEwXSk7XG4gKiBjb25zdCByZXN1bHQgPSB0Zi51cHBlckJvdW5kKHNlcSwgdmFsdWVzKTtcbiAqIHJlc3VsdC5wcmludCgpOyAvLyBbMSwgMiwgNV1cbiAqIGBgYFxuICogQHBhcmFtIHNvcnRlZFNlcXVlbmNlOiBOLUQuIFNvcnRlZCBzZXF1ZW5jZS5cbiAqIEBwYXJhbSB2YWx1ZXM6IE4tRC4gU2VhcmNoIHZhbHVlcy5cbiAqIEByZXR1cm4gQW4gTi1EIGludDMyIHRlbnNvciB0aGUgc2l6ZSBvZiB2YWx1ZXMgY29udGFpbmluZyB0aGUgcmVzdWx0IG9mXG4gKiAgICAgYXBwbHlpbmcgdXBwZXIgYm91bmQgdG8gZWFjaCB2YWx1ZS4gVGhlIHJlc3VsdCBpcyBub3QgYSBnbG9iYWwgaW5kZXggdG9cbiAqICAgICB0aGUgZW50aXJlIFRlbnNvciwgYnV0IHRoZSBpbmRleCBpbiB0aGUgbGFzdCBkaW1lbnNpb24uXG4gKiBAZG9jIHtoZWFkaW5nOiAnT3BlcmF0aW9ucycsIHN1YmhlYWRpbmc6ICdFdmFsdWF0aW9uJ31cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHVwcGVyQm91bmQoXG4gICAgc29ydGVkU2VxdWVuY2U6IFRlbnNvcnxUZW5zb3JMaWtlLCB2YWx1ZXM6IFRlbnNvcnxUZW5zb3JMaWtlKTogVGVuc29yIHtcbiAgcmV0dXJuIHNlYXJjaFNvcnRlZChzb3J0ZWRTZXF1ZW5jZSwgdmFsdWVzLCAncmlnaHQnKTtcbn1cbiJdfQ==","/**\n * @license\n * Copyright 2018 Google LLC. All Rights Reserved.\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n * =============================================================================\n */\nimport { ENGINE } from '../engine';\n/**\n * Creates a new variable with the provided initial value.\n * ```js\n * const x = tf.variable(tf.tensor([1, 2, 3]));\n * x.assign(tf.tensor([4, 5, 6]));\n *\n * x.print();\n * ```\n *\n * @param initialValue Initial value for the tensor.\n * @param trainable If true, optimizers are allowed to update it.\n * @param name Name of the variable. Defaults to a unique id.\n * @param dtype If set, initialValue will be converted to the given type.\n *\n * @doc {heading: 'Tensors', subheading: 'Creation'}\n */\nexport function variable(initialValue, trainable = true, name, dtype) {\n return ENGINE.makeVariable(initialValue, trainable, name, dtype);\n}\n//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidmFyaWFibGUuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi8uLi90ZmpzLWNvcmUvc3JjL29wcy92YXJpYWJsZS50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQTs7Ozs7Ozs7Ozs7Ozs7O0dBZUc7QUFFSCxPQUFPLEVBQUMsTUFBTSxFQUFDLE1BQU0sV0FBVyxDQUFDO0FBSWpDOzs7Ozs7Ozs7Ozs7Ozs7R0FlRztBQUNILE1BQU0sVUFBVSxRQUFRLENBQ3BCLFlBQXVCLEVBQUUsU0FBUyxHQUFHLElBQUksRUFBRSxJQUFhLEVBQ3hELEtBQWdCO0lBQ2xCLE9BQU8sTUFBTSxDQUFDLFlBQVksQ0FBQyxZQUFZLEVBQUUsU0FBUyxFQUFFLElBQUksRUFBRSxLQUFLLENBQ2hELENBQUM7QUFDbEIsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbIi8qKlxuICogQGxpY2Vuc2VcbiAqIENvcHlyaWdodCAyMDE4IEdvb2dsZSBMTEMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuXG4gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgXCJMaWNlbnNlXCIpO1xuICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLlxuICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0XG4gKlxuICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wXG4gKlxuICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZVxuICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gXCJBUyBJU1wiIEJBU0lTLFxuICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuXG4gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kXG4gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS5cbiAqID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4gKi9cblxuaW1wb3J0IHtFTkdJTkV9IGZyb20gJy4uL2VuZ2luZSc7XG5pbXBvcnQge1RlbnNvciwgVmFyaWFibGV9IGZyb20gJy4uL3RlbnNvcic7XG5pbXBvcnQge0RhdGFUeXBlLCBSYW5rfSBmcm9tICcuLi90eXBlcyc7XG5cbi8qKlxuICogQ3JlYXRlcyBhIG5ldyB2YXJpYWJsZSB3aXRoIHRoZSBwcm92aWRlZCBpbml0aWFsIHZhbHVlLlxuICogYGBganNcbiAqIGNvbnN0IHggPSB0Zi52YXJpYWJsZSh0Zi50ZW5zb3IoWzEsIDIsIDNdKSk7XG4gKiB4LmFzc2lnbih0Zi50ZW5zb3IoWzQsIDUsIDZdKSk7XG4gKlxuICogeC5wcmludCgpO1xuICogYGBgXG4gKlxuICogQHBhcmFtIGluaXRpYWxWYWx1ZSBJbml0aWFsIHZhbHVlIGZvciB0aGUgdGVuc29yLlxuICogQHBhcmFtIHRyYWluYWJsZSBJZiB0cnVlLCBvcHRpbWl6ZXJzIGFyZSBhbGxvd2VkIHRvIHVwZGF0ZSBpdC5cbiAqIEBwYXJhbSBuYW1lIE5hbWUgb2YgdGhlIHZhcmlhYmxlLiBEZWZhdWx0cyB0byBhIHVuaXF1ZSBpZC5cbiAqIEBwYXJhbSBkdHlwZSBJZiBzZXQsIGluaXRpYWxWYWx1ZSB3aWxsIGJlIGNvbnZlcnRlZCB0byB0aGUgZ2l2ZW4gdHlwZS5cbiAqXG4gKiBAZG9jIHtoZWFkaW5nOiAnVGVuc29ycycsIHN1YmhlYWRpbmc6ICdDcmVhdGlvbid9XG4gKi9cbmV4cG9ydCBmdW5jdGlvbiB2YXJpYWJsZTxSIGV4dGVuZHMgUmFuaz4oXG4gICAgaW5pdGlhbFZhbHVlOiBUZW5zb3I8Uj4sIHRyYWluYWJsZSA9IHRydWUsIG5hbWU/OiBzdHJpbmcsXG4gICAgZHR5cGU/OiBEYXRhVHlwZSk6IFZhcmlhYmxlPFI+IHtcbiAgcmV0dXJuIEVOR0lORS5tYWtlVmFyaWFibGUoaW5pdGlhbFZhbHVlLCB0cmFpbmFibGUsIG5hbWUsIGR0eXBlKSBhc1xuICAgICAgVmFyaWFibGU8Uj47XG59XG4iXX0=","/**\n * @license\n * Copyright 2020 Google LLC. All Rights Reserved.\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n * =============================================================================\n */\nimport { whereImpl } from '../backends/where_impl';\nimport { convertToTensor } from '../tensor_util_env';\n/**\n * Returns the coordinates of true elements of condition.\n *\n * The coordinates are returned in a 2-D tensor where the first dimension (rows)\n * represents the number of true elements, and the second dimension (columns)\n * represents the coordinates of the true elements. Keep in mind, the shape of\n * the output tensor can vary depending on how many true values there are in\n * input. Indices are output in row-major order. The resulting tensor has the\n * shape `[numTrueElems, condition.rank]`.\n *\n * This is analogous to calling the python `tf.where(cond)` without an x or y.\n *\n * ```js\n * const cond = tf.tensor1d([false, false, true], 'bool');\n * const result = await tf.whereAsync(cond);\n * result.print();\n * ```\n *\n * @doc {heading: 'Operations', subheading: 'Logical'}\n */\nasync function whereAsync_(condition) {\n const $condition = convertToTensor(condition, 'condition', 'whereAsync', 'bool');\n const vals = await $condition.data();\n const res = whereImpl($condition.shape, vals);\n if (condition !== $condition) {\n $condition.dispose();\n }\n return res;\n}\nexport const whereAsync = whereAsync_;\n//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoid2hlcmVfYXN5bmMuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi8uLi90ZmpzLWNvcmUvc3JjL29wcy93aGVyZV9hc3luYy50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQTs7Ozs7Ozs7Ozs7Ozs7O0dBZUc7QUFDSCxPQUFPLEVBQUMsU0FBUyxFQUFDLE1BQU0sd0JBQXdCLENBQUM7QUFFakQsT0FBTyxFQUFDLGVBQWUsRUFBQyxNQUFNLG9CQUFvQixDQUFDO0FBR25EOzs7Ozs7Ozs7Ozs7Ozs7Ozs7O0dBbUJHO0FBQ0gsS0FBSyxVQUFVLFdBQVcsQ0FBQyxTQUE0QjtJQUNyRCxNQUFNLFVBQVUsR0FDWixlQUFlLENBQUMsU0FBUyxFQUFFLFdBQVcsRUFBRSxZQUFZLEVBQUUsTUFBTSxDQUFDLENBQUM7SUFDbEUsTUFBTSxJQUFJLEdBQUcsTUFBTSxVQUFVLENBQUMsSUFBSSxFQUFFLENBQUM7SUFDckMsTUFBTSxHQUFHLEdBQUcsU0FBUyxDQUFDLFVBQVUsQ0FBQyxLQUFLLEVBQUUsSUFBSSxDQUFDLENBQUM7SUFDOUMsSUFBSSxTQUFTLEtBQUssVUFBVSxFQUFFO1FBQzVCLFVBQVUsQ0FBQyxPQUFPLEVBQUUsQ0FBQztLQUN0QjtJQUNELE9BQU8sR0FBRyxDQUFDO0FBQ2IsQ0FBQztBQUVELE1BQU0sQ0FBQyxNQUFNLFVBQVUsR0FBRyxXQUFXLENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyIvKipcbiAqIEBsaWNlbnNlXG4gKiBDb3B5cmlnaHQgMjAyMCBHb29nbGUgTExDLiBBbGwgUmlnaHRzIFJlc2VydmVkLlxuICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlIFwiTGljZW5zZVwiKTtcbiAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS5cbiAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdFxuICpcbiAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMFxuICpcbiAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmVcbiAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuIFwiQVMgSVNcIiBCQVNJUyxcbiAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLlxuICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZFxuICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuXG4gKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuICovXG5pbXBvcnQge3doZXJlSW1wbH0gZnJvbSAnLi4vYmFja2VuZHMvd2hlcmVfaW1wbCc7XG5pbXBvcnQge1RlbnNvciwgVGVuc29yMkR9IGZyb20gJy4uL3RlbnNvcic7XG5pbXBvcnQge2NvbnZlcnRUb1RlbnNvcn0gZnJvbSAnLi4vdGVuc29yX3V0aWxfZW52JztcbmltcG9ydCB7VGVuc29yTGlrZX0gZnJvbSAnLi4vdHlwZXMnO1xuXG4vKipcbiAqIFJldHVybnMgdGhlIGNvb3JkaW5hdGVzIG9mIHRydWUgZWxlbWVudHMgb2YgY29uZGl0aW9uLlxuICpcbiAqIFRoZSBjb29yZGluYXRlcyBhcmUgcmV0dXJuZWQgaW4gYSAyLUQgdGVuc29yIHdoZXJlIHRoZSBmaXJzdCBkaW1lbnNpb24gKHJvd3MpXG4gKiByZXByZXNlbnRzIHRoZSBudW1iZXIgb2YgdHJ1ZSBlbGVtZW50cywgYW5kIHRoZSBzZWNvbmQgZGltZW5zaW9uIChjb2x1bW5zKVxuICogcmVwcmVzZW50cyB0aGUgY29vcmRpbmF0ZXMgb2YgdGhlIHRydWUgZWxlbWVudHMuIEtlZXAgaW4gbWluZCwgdGhlIHNoYXBlIG9mXG4gKiB0aGUgb3V0cHV0IHRlbnNvciBjYW4gdmFyeSBkZXBlbmRpbmcgb24gaG93IG1hbnkgdHJ1ZSB2YWx1ZXMgdGhlcmUgYXJlIGluXG4gKiBpbnB1dC4gSW5kaWNlcyBhcmUgb3V0cHV0IGluIHJvdy1tYWpvciBvcmRlci4gVGhlIHJlc3VsdGluZyB0ZW5zb3IgaGFzIHRoZVxuICogc2hhcGUgYFtudW1UcnVlRWxlbXMsIGNvbmRpdGlvbi5yYW5rXWAuXG4gKlxuICogVGhpcyBpcyBhbmFsb2dvdXMgdG8gY2FsbGluZyB0aGUgcHl0aG9uIGB0Zi53aGVyZShjb25kKWAgd2l0aG91dCBhbiB4IG9yIHkuXG4gKlxuICogYGBganNcbiAqIGNvbnN0IGNvbmQgPSB0Zi50ZW5zb3IxZChbZmFsc2UsIGZhbHNlLCB0cnVlXSwgJ2Jvb2wnKTtcbiAqIGNvbnN0IHJlc3VsdCA9IGF3YWl0IHRmLndoZXJlQXN5bmMoY29uZCk7XG4gKiByZXN1bHQucHJpbnQoKTtcbiAqIGBgYFxuICpcbiAqIEBkb2Mge2hlYWRpbmc6ICdPcGVyYXRpb25zJywgc3ViaGVhZGluZzogJ0xvZ2ljYWwnfVxuICovXG5hc3luYyBmdW5jdGlvbiB3aGVyZUFzeW5jXyhjb25kaXRpb246IFRlbnNvcnxUZW5zb3JMaWtlKTogUHJvbWlzZTxUZW5zb3IyRD4ge1xuICBjb25zdCAkY29uZGl0aW9uID1cbiAgICAgIGNvbnZlcnRUb1RlbnNvcihjb25kaXRpb24sICdjb25kaXRpb24nLCAnd2hlcmVBc3luYycsICdib29sJyk7XG4gIGNvbnN0IHZhbHMgPSBhd2FpdCAkY29uZGl0aW9uLmRhdGEoKTtcbiAgY29uc3QgcmVzID0gd2hlcmVJbXBsKCRjb25kaXRpb24uc2hhcGUsIHZhbHMpO1xuICBpZiAoY29uZGl0aW9uICE9PSAkY29uZGl0aW9uKSB7XG4gICAgJGNvbmRpdGlvbi5kaXNwb3NlKCk7XG4gIH1cbiAgcmV0dXJuIHJlcztcbn1cblxuZXhwb3J0IGNvbnN0IHdoZXJlQXN5bmMgPSB3aGVyZUFzeW5jXztcbiJdfQ==","/**\n * @license\n * Copyright 2018 Google LLC. All Rights Reserved.\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n * =============================================================================\n */\nimport { convertToTensor } from '../tensor_util_env';\nimport * as util from '../util';\nimport { gather } from './gather';\nimport { reshape } from './reshape';\nimport { squeeze } from './squeeze';\nimport { whereAsync } from './where_async';\n/**\n * Apply boolean mask to tensor.\n *\n * ```js\n * const tensor = tf.tensor2d([1, 2, 3, 4, 5, 6], [3, 2]);\n * const mask = tf.tensor1d([1, 0, 1], 'bool');\n * const result = await tf.booleanMaskAsync(tensor, mask);\n * result.print();\n * ```\n *\n * @param tensor N-D tensor.\n * @param mask K-D boolean tensor, K <= N and K must be known statically.\n * @param axis A 0-D int Tensor representing the axis in tensor to mask from.\n * By default, axis is 0 which will mask from the first dimension.\n * Otherwise K + axis <= N.\n *\n * @doc {heading: 'Tensors', subheading: 'Slicing and Joining'}\n */\nasync function booleanMaskAsync_(tensor, mask, axis) {\n const $tensor = convertToTensor(tensor, 'tensor', 'boolMask');\n const $mask = convertToTensor(mask, 'mask', 'boolMask', 'bool');\n const axisFrom = axis == null ? 0 : axis;\n const maskDim = $mask.rank;\n const tensorShape = $tensor.shape;\n util.assert(maskDim > 0, () => 'mask cannot be scalar');\n util.assertShapesMatch(tensorShape.slice(axisFrom, axisFrom + maskDim), $mask.shape, `mask's shape must match the first K dimensions of tensor's shape,`);\n let leadingSize = 1;\n for (let i = axisFrom; i < axisFrom + maskDim; i++) {\n leadingSize *= tensorShape[i];\n }\n const targetTensorShape = tensorShape.slice(0, axisFrom)\n .concat([leadingSize], tensorShape.slice(axisFrom + maskDim));\n const reshapedTensor = reshape($tensor, targetTensorShape);\n const reshapedMask = reshape($mask, [-1]);\n const positivePositions = await whereAsync(reshapedMask);\n const indices = squeeze(positivePositions, [1]);\n const res = gather(reshapedTensor, indices, axisFrom);\n // Ensure no memory leak.\n if (tensor !== $tensor) {\n $tensor.dispose();\n }\n if (mask !== $mask) {\n $mask.dispose();\n }\n indices.dispose();\n reshapedTensor.dispose();\n reshapedMask.dispose();\n positivePositions.dispose();\n return res;\n}\nexport const booleanMaskAsync = booleanMaskAsync_;\n//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYm9vbGVhbl9tYXNrLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vLi4vdGZqcy1jb3JlL3NyYy9vcHMvYm9vbGVhbl9tYXNrLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBOzs7Ozs7Ozs7Ozs7Ozs7R0FlRztBQUdILE9BQU8sRUFBQyxlQUFlLEVBQUMsTUFBTSxvQkFBb0IsQ0FBQztBQUVuRCxPQUFPLEtBQUssSUFBSSxNQUFNLFNBQVMsQ0FBQztBQUVoQyxPQUFPLEVBQUMsTUFBTSxFQUFDLE1BQU0sVUFBVSxDQUFDO0FBQ2hDLE9BQU8sRUFBQyxPQUFPLEVBQUMsTUFBTSxXQUFXLENBQUM7QUFDbEMsT0FBTyxFQUFDLE9BQU8sRUFBQyxNQUFNLFdBQVcsQ0FBQztBQUNsQyxPQUFPLEVBQUMsVUFBVSxFQUFDLE1BQU0sZUFBZSxDQUFDO0FBRXpDOzs7Ozs7Ozs7Ozs7Ozs7OztHQWlCRztBQUNILEtBQUssVUFBVSxpQkFBaUIsQ0FDNUIsTUFBeUIsRUFBRSxJQUF1QixFQUNsRCxJQUFhO0lBQ2YsTUFBTSxPQUFPLEdBQUcsZUFBZSxDQUFDLE1BQU0sRUFBRSxRQUFRLEVBQUUsVUFBVSxDQUFDLENBQUM7SUFDOUQsTUFBTSxLQUFLLEdBQUcsZUFBZSxDQUFDLElBQUksRUFBRSxNQUFNLEVBQUUsVUFBVSxFQUFFLE1BQU0sQ0FBQyxDQUFDO0lBRWhFLE1BQU0sUUFBUSxHQUFHLElBQUksSUFBSSxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDO0lBQ3pDLE1BQU0sT0FBTyxHQUFHLEtBQUssQ0FBQyxJQUFJLENBQUM7SUFDM0IsTUFBTSxXQUFXLEdBQUcsT0FBTyxDQUFDLEtBQUssQ0FBQztJQUVsQyxJQUFJLENBQUMsTUFBTSxDQUFDLE9BQU8sR0FBRyxDQUFDLEVBQUUsR0FBRyxFQUFFLENBQUMsdUJBQXVCLENBQUMsQ0FBQztJQUN4RCxJQUFJLENBQUMsaUJBQWlCLENBQ2xCLFdBQVcsQ0FBQyxLQUFLLENBQUMsUUFBUSxFQUFFLFFBQVEsR0FBRyxPQUFPLENBQUMsRUFBRSxLQUFLLENBQUMsS0FBSyxFQUM1RCxtRUFBbUUsQ0FBQyxDQUFDO0lBRXpFLElBQUksV0FBVyxHQUFHLENBQUMsQ0FBQztJQUNwQixLQUFLLElBQUksQ0FBQyxHQUFHLFFBQVEsRUFBRSxDQUFDLEdBQUcsUUFBUSxHQUFHLE9BQU8sRUFBRSxDQUFDLEVBQUUsRUFBRTtRQUNsRCxXQUFXLElBQUksV0FBVyxDQUFDLENBQUMsQ0FBQyxDQUFDO0tBQy9CO0lBQ0QsTUFBTSxpQkFBaUIsR0FDbkIsV0FBVyxDQUFDLEtBQUssQ0FBQyxDQUFDLEVBQUUsUUFBUSxDQUFDO1NBQ3pCLE1BQU0sQ0FBQyxDQUFDLFdBQVcsQ0FBQyxFQUFFLFdBQVcsQ0FBQyxLQUFLLENBQUMsUUFBUSxHQUFHLE9BQU8sQ0FBQyxDQUFDLENBQUM7SUFDdEUsTUFBTSxjQUFjLEdBQUcsT0FBTyxDQUFDLE9BQU8sRUFBRSxpQkFBaUIsQ0FBQyxDQUFDO0lBQzNELE1BQU0sWUFBWSxHQUFHLE9BQU8sQ0FBQyxLQUFLLEVBQUUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUM7SUFDMUMsTUFBTSxpQkFBaUIsR0FBRyxNQUFNLFVBQVUsQ0FBQyxZQUFZLENBQUMsQ0FBQztJQUN6RCxNQUFNLE9BQU8sR0FBRyxPQUFPLENBQUMsaUJBQWlCLEVBQUUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDO0lBRWhELE1BQU0sR0FBRyxHQUFHLE1BQU0sQ0FBQyxjQUFjLEVBQUUsT0FBTyxFQUFFLFFBQVEsQ0FBQyxDQUFDO0lBRXRELHlCQUF5QjtJQUN6QixJQUFJLE1BQU0sS0FBSyxPQUFPLEVBQUU7UUFDdEIsT0FBTyxDQUFDLE9BQU8sRUFBRSxDQUFDO0tBQ25CO0lBQ0QsSUFBSSxJQUFJLEtBQUssS0FBSyxFQUFFO1FBQ2xCLEtBQUssQ0FBQyxPQUFPLEVBQUUsQ0FBQztLQUNqQjtJQUNELE9BQU8sQ0FBQyxPQUFPLEVBQUUsQ0FBQztJQUNsQixjQUFjLENBQUMsT0FBTyxFQUFFLENBQUM7SUFDekIsWUFBWSxDQUFDLE9BQU8sRUFBRSxDQUFDO0lBQ3ZCLGlCQUFpQixDQUFDLE9BQU8sRUFBRSxDQUFDO0lBRTVCLE9BQU8sR0FBRyxDQUFDO0FBQ2IsQ0FBQztBQUVELE1BQU0sQ0FBQyxNQUFNLGdCQUFnQixHQUFHLGlCQUFpQixDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiLyoqXG4gKiBAbGljZW5zZVxuICogQ29weXJpZ2h0IDIwMTggR29vZ2xlIExMQy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC5cbiAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSBcIkxpY2Vuc2VcIik7XG4gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuXG4gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXRcbiAqXG4gKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjBcbiAqXG4gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlXG4gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiBcIkFTIElTXCIgQkFTSVMsXG4gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC5cbiAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmRcbiAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLlxuICogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbiAqL1xuXG5pbXBvcnQge1RlbnNvcn0gZnJvbSAnLi4vdGVuc29yJztcbmltcG9ydCB7Y29udmVydFRvVGVuc29yfSBmcm9tICcuLi90ZW5zb3JfdXRpbF9lbnYnO1xuaW1wb3J0IHtUZW5zb3JMaWtlfSBmcm9tICcuLi90eXBlcyc7XG5pbXBvcnQgKiBhcyB1dGlsIGZyb20gJy4uL3V0aWwnO1xuXG5pbXBvcnQge2dhdGhlcn0gZnJvbSAnLi9nYXRoZXInO1xuaW1wb3J0IHtyZXNoYXBlfSBmcm9tICcuL3Jlc2hhcGUnO1xuaW1wb3J0IHtzcXVlZXplfSBmcm9tICcuL3NxdWVlemUnO1xuaW1wb3J0IHt3aGVyZUFzeW5jfSBmcm9tICcuL3doZXJlX2FzeW5jJztcblxuLyoqXG4gKiBBcHBseSBib29sZWFuIG1hc2sgdG8gdGVuc29yLlxuICpcbiAqIGBgYGpzXG4gKiBjb25zdCB0ZW5zb3IgPSB0Zi50ZW5zb3IyZChbMSwgMiwgMywgNCwgNSwgNl0sIFszLCAyXSk7XG4gKiBjb25zdCBtYXNrID0gdGYudGVuc29yMWQoWzEsIDAsIDFdLCAnYm9vbCcpO1xuICogY29uc3QgcmVzdWx0ID0gYXdhaXQgdGYuYm9vbGVhbk1hc2tBc3luYyh0ZW5zb3IsIG1hc2spO1xuICogcmVzdWx0LnByaW50KCk7XG4gKiBgYGBcbiAqXG4gKiBAcGFyYW0gdGVuc29yIE4tRCB0ZW5zb3IuXG4gKiBAcGFyYW0gbWFzayBLLUQgYm9vbGVhbiB0ZW5zb3IsIEsgPD0gTiBhbmQgSyBtdXN0IGJlIGtub3duIHN0YXRpY2FsbHkuXG4gKiBAcGFyYW0gYXhpcyBBIDAtRCBpbnQgVGVuc29yIHJlcHJlc2VudGluZyB0aGUgYXhpcyBpbiB0ZW5zb3IgdG8gbWFzayBmcm9tLlxuICogICAgIEJ5IGRlZmF1bHQsIGF4aXMgaXMgMCB3aGljaCB3aWxsIG1hc2sgZnJvbSB0aGUgZmlyc3QgZGltZW5zaW9uLlxuICogICAgIE90aGVyd2lzZSBLICsgYXhpcyA8PSBOLlxuICpcbiAqIEBkb2Mge2hlYWRpbmc6ICdUZW5zb3JzJywgc3ViaGVhZGluZzogJ1NsaWNpbmcgYW5kIEpvaW5pbmcnfVxuICovXG5hc3luYyBmdW5jdGlvbiBib29sZWFuTWFza0FzeW5jXyhcbiAgICB0ZW5zb3I6IFRlbnNvcnxUZW5zb3JMaWtlLCBtYXNrOiBUZW5zb3J8VGVuc29yTGlrZSxcbiAgICBheGlzPzogbnVtYmVyKTogUHJvbWlzZTxUZW5zb3I+IHtcbiAgY29uc3QgJHRlbnNvciA9IGNvbnZlcnRUb1RlbnNvcih0ZW5zb3IsICd0ZW5zb3InLCAnYm9vbE1hc2snKTtcbiAgY29uc3QgJG1hc2sgPSBjb252ZXJ0VG9UZW5zb3IobWFzaywgJ21hc2snLCAnYm9vbE1hc2snLCAnYm9vbCcpO1xuXG4gIGNvbnN0IGF4aXNGcm9tID0gYXhpcyA9PSBudWxsID8gMCA6IGF4aXM7XG4gIGNvbnN0IG1hc2tEaW0gPSAkbWFzay5yYW5rO1xuICBjb25zdCB0ZW5zb3JTaGFwZSA9ICR0ZW5zb3Iuc2hhcGU7XG5cbiAgdXRpbC5hc3NlcnQobWFza0RpbSA+IDAsICgpID0+ICdtYXNrIGNhbm5vdCBiZSBzY2FsYXInKTtcbiAgdXRpbC5hc3NlcnRTaGFwZXNNYXRjaChcbiAgICAgIHRlbnNvclNoYXBlLnNsaWNlKGF4aXNGcm9tLCBheGlzRnJvbSArIG1hc2tEaW0pLCAkbWFzay5zaGFwZSxcbiAgICAgIGBtYXNrJ3Mgc2hhcGUgbXVzdCBtYXRjaCB0aGUgZmlyc3QgSyBkaW1lbnNpb25zIG9mIHRlbnNvcidzIHNoYXBlLGApO1xuXG4gIGxldCBsZWFkaW5nU2l6ZSA9IDE7XG4gIGZvciAobGV0IGkgPSBheGlzRnJvbTsgaSA8IGF4aXNGcm9tICsgbWFza0RpbTsgaSsrKSB7XG4gICAgbGVhZGluZ1NpemUgKj0gdGVuc29yU2hhcGVbaV07XG4gIH1cbiAgY29uc3QgdGFyZ2V0VGVuc29yU2hhcGUgPVxuICAgICAgdGVuc29yU2hhcGUuc2xpY2UoMCwgYXhpc0Zyb20pXG4gICAgICAgICAgLmNvbmNhdChbbGVhZGluZ1NpemVdLCB0ZW5zb3JTaGFwZS5zbGljZShheGlzRnJvbSArIG1hc2tEaW0pKTtcbiAgY29uc3QgcmVzaGFwZWRUZW5zb3IgPSByZXNoYXBlKCR0ZW5zb3IsIHRhcmdldFRlbnNvclNoYXBlKTtcbiAgY29uc3QgcmVzaGFwZWRNYXNrID0gcmVzaGFwZSgkbWFzaywgWy0xXSk7XG4gIGNvbnN0IHBvc2l0aXZlUG9zaXRpb25zID0gYXdhaXQgd2hlcmVBc3luYyhyZXNoYXBlZE1hc2spO1xuICBjb25zdCBpbmRpY2VzID0gc3F1ZWV6ZShwb3NpdGl2ZVBvc2l0aW9ucywgWzFdKTtcblxuICBjb25zdCByZXMgPSBnYXRoZXIocmVzaGFwZWRUZW5zb3IsIGluZGljZXMsIGF4aXNGcm9tKTtcblxuICAvLyBFbnN1cmUgbm8gbWVtb3J5IGxlYWsuXG4gIGlmICh0ZW5zb3IgIT09ICR0ZW5zb3IpIHtcbiAgICAkdGVuc29yLmRpc3Bvc2UoKTtcbiAgfVxuICBpZiAobWFzayAhPT0gJG1hc2spIHtcbiAgICAkbWFzay5kaXNwb3NlKCk7XG4gIH1cbiAgaW5kaWNlcy5kaXNwb3NlKCk7XG4gIHJlc2hhcGVkVGVuc29yLmRpc3Bvc2UoKTtcbiAgcmVzaGFwZWRNYXNrLmRpc3Bvc2UoKTtcbiAgcG9zaXRpdmVQb3NpdGlvbnMuZGlzcG9zZSgpO1xuXG4gIHJldHVybiByZXM7XG59XG5cbmV4cG9ydCBjb25zdCBib29sZWFuTWFza0FzeW5jID0gYm9vbGVhbk1hc2tBc3luY187XG4iXX0=","/**\n * @license\n * Copyright 2018 Google LLC. All Rights Reserved.\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n * =============================================================================\n */\nimport { assertTypesMatch } from '../tensor_util';\nimport { convertToTensor } from '../tensor_util_env';\nimport * as util from '../util';\nimport { add } from './add';\nimport { div } from './div';\nimport { mul } from './mul';\nimport { op } from './operation';\nimport { pow } from './pow';\nimport { scalar } from './scalar';\nimport { sub } from './sub';\n/**\n * Compute the moving average of a variable.\n *\n * Without zeroDebias, the moving average operation is defined by:\n * `v += delta`\n * where\n * `delta = (1 - decay) * (x - v)`\n *\n * With zeroDebias (default), the `delta` term is scaled to debias the\n * effect of the (assumed) zero-initialization of `v`.\n * `delta /= (1 - decay ^ step)`\n *\n * For more details on the zero-debiasing algorithm, see:\n * https://arxiv.org/abs/1412.6980\n *\n * Note that this function is completely stateless and does not keep track of\n * step count. The step count needs to be maintained by the caller and passed\n * in as `step`.\n *\n * @param v The current moving average value.\n * @param x New input value, must have the same shape and dtype as `v`.\n * @param decay The decay factor. Typical values are 0.95 and 0.99.\n * @param step Step count.\n * @param zeroDebias: Whether zeroDebias is to be performed (default: `true`).\n * @returns The new moving average value.\n *\n * @doc {heading: 'Operations', subheading: 'Moving Average'}\n */\nfunction movingAverage_(v, x, decay, step, zeroDebias = true) {\n const $v = convertToTensor(v, 'v', 'movingAverage');\n const $x = convertToTensor(x, 'x', 'movingAverage');\n const $decay = convertToTensor(decay, 'decay', 'movingAverage');\n assertTypesMatch($v, $x);\n util.assert(util.arraysEqual($v.shape, $x.shape), () => 'Shape mismatch in v and x');\n const one = scalar(1);\n const oneMinusDecay = sub(one, $decay);\n let update = mul(sub($x, $v), oneMinusDecay);\n if (zeroDebias) {\n util.assert(step != null, () => 'When using zeroDebias: true, step is required.');\n const $step = convertToTensor(step, 'step', 'movingAverage');\n update = div(update, sub(one, pow($decay, $step)));\n }\n return add($v, update);\n}\nexport const movingAverage = op({ movingAverage_ });\n//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibW92aW5nX2F2ZXJhZ2UuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi8uLi90ZmpzLWNvcmUvc3JjL29wcy9tb3ZpbmdfYXZlcmFnZS50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQTs7Ozs7Ozs7Ozs7Ozs7O0dBZUc7QUFHSCxPQUFPLEVBQUMsZ0JBQWdCLEVBQUMsTUFBTSxnQkFBZ0IsQ0FBQztBQUNoRCxPQUFPLEVBQUMsZUFBZSxFQUFDLE1BQU0sb0JBQW9CLENBQUM7QUFFbkQsT0FBTyxLQUFLLElBQUksTUFBTSxTQUFTLENBQUM7QUFFaEMsT0FBTyxFQUFDLEdBQUcsRUFBQyxNQUFNLE9BQU8sQ0FBQztBQUMxQixPQUFPLEVBQUMsR0FBRyxFQUFDLE1BQU0sT0FBTyxDQUFDO0FBQzFCLE9BQU8sRUFBQyxHQUFHLEVBQUMsTUFBTSxPQUFPLENBQUM7QUFDMUIsT0FBTyxFQUFDLEVBQUUsRUFBQyxNQUFNLGFBQWEsQ0FBQztBQUMvQixPQUFPLEVBQUMsR0FBRyxFQUFDLE1BQU0sT0FBTyxDQUFDO0FBQzFCLE9BQU8sRUFBQyxNQUFNLEVBQUMsTUFBTSxVQUFVLENBQUM7QUFDaEMsT0FBTyxFQUFDLEdBQUcsRUFBQyxNQUFNLE9BQU8sQ0FBQztBQUUxQjs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7O0dBMkJHO0FBQ0gsU0FBUyxjQUFjLENBQ25CLENBQWUsRUFBRSxDQUFlLEVBQUUsS0FBb0IsRUFDdEQsSUFBb0IsRUFBRSxVQUFVLEdBQUcsSUFBSTtJQUN6QyxNQUFNLEVBQUUsR0FBRyxlQUFlLENBQUMsQ0FBQyxFQUFFLEdBQUcsRUFBRSxlQUFlLENBQUMsQ0FBQztJQUNwRCxNQUFNLEVBQUUsR0FBRyxlQUFlLENBQUMsQ0FBQyxFQUFFLEdBQUcsRUFBRSxlQUFlLENBQUMsQ0FBQztJQUNwRCxNQUFNLE1BQU0sR0FBRyxlQUFlLENBQUMsS0FBSyxFQUFFLE9BQU8sRUFBRSxlQUFlLENBQUMsQ0FBQztJQUVoRSxnQkFBZ0IsQ0FBQyxFQUFFLEVBQUUsRUFBRSxDQUFDLENBQUM7SUFDekIsSUFBSSxDQUFDLE1BQU0sQ0FDUCxJQUFJLENBQUMsV0FBVyxDQUFDLEVBQUUsQ0FBQyxLQUFLLEVBQUUsRUFBRSxDQUFDLEtBQUssQ0FBQyxFQUFFLEdBQUcsRUFBRSxDQUFDLDJCQUEyQixDQUFDLENBQUM7SUFFN0UsTUFBTSxHQUFHLEdBQUcsTUFBTSxDQUFDLENBQUMsQ0FBQyxDQUFDO0lBQ3RCLE1BQU0sYUFBYSxHQUFHLEdBQUcsQ0FBQyxHQUFHLEVBQUUsTUFBTSxDQUFDLENBQUM7SUFFdkMsSUFBSSxNQUFNLEdBQUcsR0FBRyxDQUFDLEdBQUcsQ0FBQyxFQUFFLEVBQUUsRUFBRSxDQUFDLEVBQUUsYUFBYSxDQUFDLENBQUM7SUFDN0MsSUFBSSxVQUFVLEVBQUU7UUFDZCxJQUFJLENBQUMsTUFBTSxDQUNQLElBQUksSUFBSSxJQUFJLEVBQUUsR0FBRyxFQUFFLENBQUMsZ0RBQWdELENBQUMsQ0FBQztRQUMxRSxNQUFNLEtBQUssR0FBRyxlQUFlLENBQUMsSUFBSSxFQUFFLE1BQU0sRUFBRSxlQUFlLENBQUMsQ0FBQztRQUM3RCxNQUFNLEdBQUcsR0FBRyxDQUFDLE1BQU0sRUFBRSxHQUFHLENBQUMsR0FBRyxFQUFFLEdBQUcsQ0FBQyxNQUFNLEVBQUUsS0FBSyxDQUFDLENBQUMsQ0FBQyxDQUFDO0tBQ3BEO0lBQ0QsT0FBTyxHQUFHLENBQUMsRUFBRSxFQUFFLE1BQU0sQ0FBQyxDQUFDO0FBQ3pCLENBQUM7QUFFRCxNQUFNLENBQUMsTUFBTSxhQUFhLEdBQUcsRUFBRSxDQUFDLEVBQUMsY0FBYyxFQUFDLENBQUMsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbIi8qKlxuICogQGxpY2Vuc2VcbiAqIENvcHlyaWdodCAyMDE4IEdvb2dsZSBMTEMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuXG4gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgXCJMaWNlbnNlXCIpO1xuICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLlxuICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0XG4gKlxuICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wXG4gKlxuICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZVxuICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gXCJBUyBJU1wiIEJBU0lTLFxuICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuXG4gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kXG4gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS5cbiAqID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4gKi9cblxuaW1wb3J0IHtTY2FsYXIsIFRlbnNvcn0gZnJvbSAnLi4vdGVuc29yJztcbmltcG9ydCB7YXNzZXJ0VHlwZXNNYXRjaH0gZnJvbSAnLi4vdGVuc29yX3V0aWwnO1xuaW1wb3J0IHtjb252ZXJ0VG9UZW5zb3J9IGZyb20gJy4uL3RlbnNvcl91dGlsX2Vudic7XG5pbXBvcnQge1RlbnNvckxpa2V9IGZyb20gJy4uL3R5cGVzJztcbmltcG9ydCAqIGFzIHV0aWwgZnJvbSAnLi4vdXRpbCc7XG5cbmltcG9ydCB7YWRkfSBmcm9tICcuL2FkZCc7XG5pbXBvcnQge2Rpdn0gZnJvbSAnLi9kaXYnO1xuaW1wb3J0IHttdWx9IGZyb20gJy4vbXVsJztcbmltcG9ydCB7b3B9IGZyb20gJy4vb3BlcmF0aW9uJztcbmltcG9ydCB7cG93fSBmcm9tICcuL3Bvdyc7XG5pbXBvcnQge3NjYWxhcn0gZnJvbSAnLi9zY2FsYXInO1xuaW1wb3J0IHtzdWJ9IGZyb20gJy4vc3ViJztcblxuLyoqXG4gKiBDb21wdXRlIHRoZSBtb3ZpbmcgYXZlcmFnZSBvZiBhIHZhcmlhYmxlLlxuICpcbiAqIFdpdGhvdXQgemVyb0RlYmlhcywgdGhlIG1vdmluZyBhdmVyYWdlIG9wZXJhdGlvbiBpcyBkZWZpbmVkIGJ5OlxuICogICBgdiArPSBkZWx0YWBcbiAqIHdoZXJlXG4gKiAgIGBkZWx0YSA9ICgxIC0gZGVjYXkpICogKHggLSB2KWBcbiAqXG4gKiBXaXRoIHplcm9EZWJpYXMgKGRlZmF1bHQpLCB0aGUgYGRlbHRhYCB0ZXJtIGlzIHNjYWxlZCB0byBkZWJpYXMgdGhlXG4gKiBlZmZlY3Qgb2YgdGhlIChhc3N1bWVkKSB6ZXJvLWluaXRpYWxpemF0aW9uIG9mIGB2YC5cbiAqICAgYGRlbHRhIC89ICgxIC0gZGVjYXkgXiBzdGVwKWBcbiAqXG4gKiBGb3IgbW9yZSBkZXRhaWxzIG9uIHRoZSB6ZXJvLWRlYmlhc2luZyBhbGdvcml0aG0sIHNlZTpcbiAqICAgaHR0cHM6Ly9hcnhpdi5vcmcvYWJzLzE0MTIuNjk4MFxuICpcbiAqIE5vdGUgdGhhdCB0aGlzIGZ1bmN0aW9uIGlzIGNvbXBsZXRlbHkgc3RhdGVsZXNzIGFuZCBkb2VzIG5vdCBrZWVwIHRyYWNrIG9mXG4gKiBzdGVwIGNvdW50LiBUaGUgc3RlcCBjb3VudCBuZWVkcyB0byBiZSBtYWludGFpbmVkIGJ5IHRoZSBjYWxsZXIgYW5kIHBhc3NlZFxuICogaW4gYXMgYHN0ZXBgLlxuICpcbiAqIEBwYXJhbSB2IFRoZSBjdXJyZW50IG1vdmluZyBhdmVyYWdlIHZhbHVlLlxuICogQHBhcmFtIHggTmV3IGlucHV0IHZhbHVlLCBtdXN0IGhhdmUgdGhlIHNhbWUgc2hhcGUgYW5kIGR0eXBlIGFzIGB2YC5cbiAqIEBwYXJhbSBkZWNheSBUaGUgZGVjYXkgZmFjdG9yLiBUeXBpY2FsIHZhbHVlcyBhcmUgMC45NSBhbmQgMC45OS5cbiAqIEBwYXJhbSBzdGVwIFN0ZXAgY291bnQuXG4gKiBAcGFyYW0gemVyb0RlYmlhczogV2hldGhlciB6ZXJvRGViaWFzIGlzIHRvIGJlIHBlcmZvcm1lZCAoZGVmYXVsdDogYHRydWVgKS5cbiAqIEByZXR1cm5zIFRoZSBuZXcgbW92aW5nIGF2ZXJhZ2UgdmFsdWUuXG4gKlxuICogQGRvYyB7aGVhZGluZzogJ09wZXJhdGlvbnMnLCBzdWJoZWFkaW5nOiAnTW92aW5nIEF2ZXJhZ2UnfVxuICovXG5mdW5jdGlvbiBtb3ZpbmdBdmVyYWdlXzxUIGV4dGVuZHMgVGVuc29yPihcbiAgICB2OiBUfFRlbnNvckxpa2UsIHg6IFR8VGVuc29yTGlrZSwgZGVjYXk6IG51bWJlcnxTY2FsYXIsXG4gICAgc3RlcD86IG51bWJlcnxTY2FsYXIsIHplcm9EZWJpYXMgPSB0cnVlKTogVCB7XG4gIGNvbnN0ICR2ID0gY29udmVydFRvVGVuc29yKHYsICd2JywgJ21vdmluZ0F2ZXJhZ2UnKTtcbiAgY29uc3QgJHggPSBjb252ZXJ0VG9UZW5zb3IoeCwgJ3gnLCAnbW92aW5nQXZlcmFnZScpO1xuICBjb25zdCAkZGVjYXkgPSBjb252ZXJ0VG9UZW5zb3IoZGVjYXksICdkZWNheScsICdtb3ZpbmdBdmVyYWdlJyk7XG5cbiAgYXNzZXJ0VHlwZXNNYXRjaCgkdiwgJHgpO1xuICB1dGlsLmFzc2VydChcbiAgICAgIHV0aWwuYXJyYXlzRXF1YWwoJHYuc2hhcGUsICR4LnNoYXBlKSwgKCkgPT4gJ1NoYXBlIG1pc21hdGNoIGluIHYgYW5kIHgnKTtcblxuICBjb25zdCBvbmUgPSBzY2FsYXIoMSk7XG4gIGNvbnN0IG9uZU1pbnVzRGVjYXkgPSBzdWIob25lLCAkZGVjYXkpO1xuXG4gIGxldCB1cGRhdGUgPSBtdWwoc3ViKCR4LCAkdiksIG9uZU1pbnVzRGVjYXkpO1xuICBpZiAoemVyb0RlYmlhcykge1xuICAgIHV0aWwuYXNzZXJ0KFxuICAgICAgICBzdGVwICE9IG51bGwsICgpID0+ICdXaGVuIHVzaW5nIHplcm9EZWJpYXM6IHRydWUsIHN0ZXAgaXMgcmVxdWlyZWQuJyk7XG4gICAgY29uc3QgJHN0ZXAgPSBjb252ZXJ0VG9UZW5zb3Ioc3RlcCwgJ3N0ZXAnLCAnbW92aW5nQXZlcmFnZScpO1xuICAgIHVwZGF0ZSA9IGRpdih1cGRhdGUsIHN1YihvbmUsIHBvdygkZGVjYXksICRzdGVwKSkpO1xuICB9XG4gIHJldHVybiBhZGQoJHYsIHVwZGF0ZSk7XG59XG5cbmV4cG9ydCBjb25zdCBtb3ZpbmdBdmVyYWdlID0gb3Aoe21vdmluZ0F2ZXJhZ2VffSk7XG4iXX0=","/**\n * @license\n * Copyright 2018 Google LLC. All Rights Reserved.\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n * =============================================================================\n */\nimport { ENGINE } from '../engine';\nimport { ScatterNd } from '../kernel_names';\nimport { convertToTensor } from '../tensor_util_env';\nimport { op } from './operation';\nimport * as scatter_nd_util from './scatter_nd_util';\n/**\n * Creates a new tensor by applying sparse updates to individual\n * values or slices within a zero tensor of the given shape tensor according to\n * indices. This operator is the inverse of the `tf.gatherND` operator which\n * extracts values or slices from a given tensor.\n *\n * ```js\n * const indices = tf.tensor2d([4, 3, 1, 7], [4, 1], 'int32');\n * const updates = tf.tensor1d([9, 10, 11, 12]);\n * const shape = [8];\n * tf.scatterND(indices, updates, shape).print() //[0, 11, 0, 10, 9, 0, 0, 12]\n * ```\n *\n * @param indices The tensor contains the indices into the output tensor.\n * @param updates The tensor contains the value for the indices.\n * @param shape: The shape of the output tensor.\n *\n * @doc {heading: 'Operations', subheading: 'Slicing and Joining'}\n */\nfunction scatterND_(indices, updates, shape) {\n const $indices = convertToTensor(indices, 'indices', 'scatterND', 'int32');\n const $updates = convertToTensor(updates, 'updates', 'scatterND');\n scatter_nd_util.validateInput($updates, $indices, shape);\n const inputs = { indices: $indices, updates: $updates };\n const attrs = { shape };\n // tslint:disable-next-line: no-unnecessary-type-assertion\n return ENGINE.runKernel(ScatterNd, inputs, attrs);\n}\nexport const scatterND = op({ scatterND_ });\n//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic2NhdHRlcl9uZC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uLy4uL3RmanMtY29yZS9zcmMvb3BzL3NjYXR0ZXJfbmQudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUE7Ozs7Ozs7Ozs7Ozs7OztHQWVHO0FBRUgsT0FBTyxFQUFDLE1BQU0sRUFBQyxNQUFNLFdBQVcsQ0FBQztBQUNqQyxPQUFPLEVBQUMsU0FBUyxFQUFrQyxNQUFNLGlCQUFpQixDQUFDO0FBSTNFLE9BQU8sRUFBQyxlQUFlLEVBQUMsTUFBTSxvQkFBb0IsQ0FBQztBQUduRCxPQUFPLEVBQUMsRUFBRSxFQUFDLE1BQU0sYUFBYSxDQUFDO0FBQy9CLE9BQU8sS0FBSyxlQUFlLE1BQU0sbUJBQW1CLENBQUM7QUFFckQ7Ozs7Ozs7Ozs7Ozs7Ozs7OztHQWtCRztBQUNILFNBQVMsVUFBVSxDQUNmLE9BQTBCLEVBQUUsT0FBMEIsRUFDdEQsS0FBa0I7SUFDcEIsTUFBTSxRQUFRLEdBQUcsZUFBZSxDQUFDLE9BQU8sRUFBRSxTQUFTLEVBQUUsV0FBVyxFQUFFLE9BQU8sQ0FBQyxDQUFDO0lBQzNFLE1BQU0sUUFBUSxHQUFHLGVBQWUsQ0FBQyxPQUFPLEVBQUUsU0FBUyxFQUFFLFdBQVcsQ0FBQyxDQUFDO0lBQ2xFLGVBQWUsQ0FBQyxhQUFhLENBQUMsUUFBUSxFQUFFLFFBQVEsRUFBRSxLQUFLLENBQUMsQ0FBQztJQUV6RCxNQUFNLE1BQU0sR0FBb0IsRUFBQyxPQUFPLEVBQUUsUUFBUSxFQUFFLE9BQU8sRUFBRSxRQUFRLEVBQUMsQ0FBQztJQUN2RSxNQUFNLEtBQUssR0FBbUIsRUFBQyxLQUFLLEVBQUMsQ0FBQztJQUV0QywwREFBMEQ7SUFDMUQsT0FBTyxNQUFNLENBQUMsU0FBUyxDQUNaLFNBQVMsRUFBRSxNQUE4QixFQUN6QyxLQUEyQixDQUFjLENBQUM7QUFDdkQsQ0FBQztBQUVELE1BQU0sQ0FBQyxNQUFNLFNBQVMsR0FBRyxFQUFFLENBQUMsRUFBQyxVQUFVLEVBQUMsQ0FBQyxDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiLyoqXG4gKiBAbGljZW5zZVxuICogQ29weXJpZ2h0IDIwMTggR29vZ2xlIExMQy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC5cbiAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSBcIkxpY2Vuc2VcIik7XG4gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuXG4gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXRcbiAqXG4gKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjBcbiAqXG4gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlXG4gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiBcIkFTIElTXCIgQkFTSVMsXG4gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC5cbiAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmRcbiAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLlxuICogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbiAqL1xuXG5pbXBvcnQge0VOR0lORX0gZnJvbSAnLi4vZW5naW5lJztcbmltcG9ydCB7U2NhdHRlck5kLCBTY2F0dGVyTmRBdHRycywgU2NhdHRlck5kSW5wdXRzfSBmcm9tICcuLi9rZXJuZWxfbmFtZXMnO1xuaW1wb3J0IHtOYW1lZEF0dHJNYXB9IGZyb20gJy4uL2tlcm5lbF9yZWdpc3RyeSc7XG5pbXBvcnQge1RlbnNvcn0gZnJvbSAnLi4vdGVuc29yJztcbmltcG9ydCB7TmFtZWRUZW5zb3JNYXB9IGZyb20gJy4uL3RlbnNvcl90eXBlcyc7XG5pbXBvcnQge2NvbnZlcnRUb1RlbnNvcn0gZnJvbSAnLi4vdGVuc29yX3V0aWxfZW52JztcbmltcG9ydCB7UmFuaywgU2hhcGVNYXAsIFRlbnNvckxpa2V9IGZyb20gJy4uL3R5cGVzJztcblxuaW1wb3J0IHtvcH0gZnJvbSAnLi9vcGVyYXRpb24nO1xuaW1wb3J0ICogYXMgc2NhdHRlcl9uZF91dGlsIGZyb20gJy4vc2NhdHRlcl9uZF91dGlsJztcblxuLyoqXG4gKiBDcmVhdGVzIGEgbmV3IHRlbnNvciBieSBhcHBseWluZyBzcGFyc2UgdXBkYXRlcyB0byBpbmRpdmlkdWFsXG4gKiB2YWx1ZXMgb3Igc2xpY2VzIHdpdGhpbiBhIHplcm8gdGVuc29yIG9mIHRoZSBnaXZlbiBzaGFwZSB0ZW5zb3IgYWNjb3JkaW5nIHRvXG4gKiBpbmRpY2VzLiBUaGlzIG9wZXJhdG9yIGlzIHRoZSBpbnZlcnNlIG9mIHRoZSBgdGYuZ2F0aGVyTkRgIG9wZXJhdG9yIHdoaWNoXG4gKiBleHRyYWN0cyB2YWx1ZXMgb3Igc2xpY2VzIGZyb20gYSBnaXZlbiB0ZW5zb3IuXG4gKlxuICogYGBganNcbiAqIGNvbnN0IGluZGljZXMgPSB0Zi50ZW5zb3IyZChbNCwgMywgMSwgN10sIFs0LCAxXSwgJ2ludDMyJyk7XG4gKiBjb25zdCB1cGRhdGVzID0gdGYudGVuc29yMWQoWzksIDEwLCAxMSwgMTJdKTtcbiAqIGNvbnN0IHNoYXBlID0gWzhdO1xuICogdGYuc2NhdHRlck5EKGluZGljZXMsIHVwZGF0ZXMsIHNoYXBlKS5wcmludCgpIC8vWzAsIDExLCAwLCAxMCwgOSwgMCwgMCwgMTJdXG4gKiBgYGBcbiAqXG4gKiBAcGFyYW0gaW5kaWNlcyBUaGUgdGVuc29yIGNvbnRhaW5zIHRoZSBpbmRpY2VzIGludG8gdGhlIG91dHB1dCB0ZW5zb3IuXG4gKiBAcGFyYW0gdXBkYXRlcyBUaGUgdGVuc29yIGNvbnRhaW5zIHRoZSB2YWx1ZSBmb3IgdGhlIGluZGljZXMuXG4gKiBAcGFyYW0gc2hhcGU6IFRoZSBzaGFwZSBvZiB0aGUgb3V0cHV0IHRlbnNvci5cbiAqXG4gKiBAZG9jIHtoZWFkaW5nOiAnT3BlcmF0aW9ucycsIHN1YmhlYWRpbmc6ICdTbGljaW5nIGFuZCBKb2luaW5nJ31cbiAqL1xuZnVuY3Rpb24gc2NhdHRlck5EXzxSIGV4dGVuZHMgUmFuaz4oXG4gICAgaW5kaWNlczogVGVuc29yfFRlbnNvckxpa2UsIHVwZGF0ZXM6IFRlbnNvcnxUZW5zb3JMaWtlLFxuICAgIHNoYXBlOiBTaGFwZU1hcFtSXSk6IFRlbnNvcjxSPiB7XG4gIGNvbnN0ICRpbmRpY2VzID0gY29udmVydFRvVGVuc29yKGluZGljZXMsICdpbmRpY2VzJywgJ3NjYXR0ZXJORCcsICdpbnQzMicpO1xuICBjb25zdCAkdXBkYXRlcyA9IGNvbnZlcnRUb1RlbnNvcih1cGRhdGVzLCAndXBkYXRlcycsICdzY2F0dGVyTkQnKTtcbiAgc2NhdHRlcl9uZF91dGlsLnZhbGlkYXRlSW5wdXQoJHVwZGF0ZXMsICRpbmRpY2VzLCBzaGFwZSk7XG5cbiAgY29uc3QgaW5wdXRzOiBTY2F0dGVyTmRJbnB1dHMgPSB7aW5kaWNlczogJGluZGljZXMsIHVwZGF0ZXM6ICR1cGRhdGVzfTtcbiAgY29uc3QgYXR0cnM6IFNjYXR0ZXJOZEF0dHJzID0ge3NoYXBlfTtcblxuICAvLyB0c2xpbnQ6ZGlzYWJsZS1uZXh0LWxpbmU6IG5vLXVubmVjZXNzYXJ5LXR5cGUtYXNzZXJ0aW9uXG4gIHJldHVybiBFTkdJTkUucnVuS2VybmVsKFxuICAgICAgICAgICAgIFNjYXR0ZXJOZCwgaW5wdXRzIGFzIHt9IGFzIE5hbWVkVGVuc29yTWFwLFxuICAgICAgICAgICAgIGF0dHJzIGFzIHt9IGFzIE5hbWVkQXR0ck1hcCkgYXMgVGVuc29yPFI+O1xufVxuXG5leHBvcnQgY29uc3Qgc2NhdHRlck5EID0gb3Aoe3NjYXR0ZXJORF99KTtcbiJdfQ==","/**\n * @license\n * Copyright 2018 Google LLC. All Rights Reserved.\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n * =============================================================================\n */\nimport { ENGINE } from '../engine';\nimport { SparseToDense } from '../kernel_names';\nimport * as sparse_to_dense from '../ops/sparse_to_dense_util';\nimport { convertToTensor } from '../tensor_util_env';\nimport { op } from './operation';\n/**\n * Converts a sparse representation into a dense tensor.\n *\n * Builds an array dense with shape outputShape such that:\n *\n * // If sparseIndices is scalar\n * dense[i] = (i == sparseIndices ? sparseValues : defaultValue)\n *\n * // If sparseIndices is a vector, then for each i\n * dense[sparseIndices[i]] = sparseValues[i]\n *\n * // If sparseIndices is an n by d matrix, then for each i in [0, n)\n * dense[sparseIndices[i][0], ..., sparseIndices[i][d-1]] = sparseValues[i]\n * All other values in dense are set to defaultValue. If sparseValues is a\n * scalar, all sparse indices are set to this single value.\n *\n * If indices are repeated the final value is summed over all values for those\n * indices.\n *\n * ```js\n * const indices = tf.tensor1d([4, 5, 6, 1, 2, 3], 'int32');\n * const values = tf.tensor1d([10, 11, 12, 13, 14, 15], 'float32');\n * const shape = [8];\n * tf.sparseToDense(indices, values, shape).print();\n * ```\n *\n * @param sparseIndices A 0-D, 1-D, or 2-D Tensor of type int32.\n * sparseIndices[i] contains the complete index where sparseValues[i] will be\n * placed.\n * @param sparseValues A 0-D or 1-D Tensor. Values\n * corresponding to each row of sparseIndices, or a scalar value to be used for\n * all sparse indices.\n * @param outputShape Shape of the dense output tensor. The type is inferred.\n * @param defaultValue Scalar. Value to set for indices not specified in\n * sparseIndices. Defaults to zero.\n *\n * @doc {heading: 'Operations', subheading: 'Normalization'}\n */\nfunction sparseToDense_(sparseIndices, sparseValues, outputShape, defaultValue = 0) {\n const $sparseIndices = convertToTensor(sparseIndices, 'sparseIndices', 'sparseToDense', 'int32');\n const $sparseValues = convertToTensor(sparseValues, 'sparseValues', 'sparseToDense', 'string_or_numeric');\n const $defaultValue = convertToTensor(defaultValue, 'defaultValue', 'sparseToDense', $sparseValues.dtype);\n sparse_to_dense.validateInput($sparseIndices, $sparseValues, outputShape, $defaultValue);\n const inputs = {\n sparseIndices: $sparseIndices,\n sparseValues: $sparseValues,\n defaultValue: $defaultValue\n };\n const attrs = { outputShape };\n return ENGINE.runKernel(SparseToDense, inputs, attrs);\n}\nexport const sparseToDense = op({ sparseToDense_ });\n//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic3BhcnNlX3RvX2RlbnNlLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vLi4vdGZqcy1jb3JlL3NyYy9vcHMvc3BhcnNlX3RvX2RlbnNlLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBOzs7Ozs7Ozs7Ozs7Ozs7R0FlRztBQUVILE9BQU8sRUFBQyxNQUFNLEVBQUMsTUFBTSxXQUFXLENBQUM7QUFDakMsT0FBTyxFQUFDLGFBQWEsRUFBMEMsTUFBTSxpQkFBaUIsQ0FBQztBQUV2RixPQUFPLEtBQUssZUFBZSxNQUFNLDZCQUE2QixDQUFDO0FBRy9ELE9BQU8sRUFBQyxlQUFlLEVBQUMsTUFBTSxvQkFBb0IsQ0FBQztBQUduRCxPQUFPLEVBQUMsRUFBRSxFQUFDLE1BQU0sYUFBYSxDQUFDO0FBRS9COzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7O0dBcUNHO0FBQ0gsU0FBUyxjQUFjLENBQ25CLGFBQWdDLEVBQUUsWUFBK0IsRUFDakUsV0FBd0IsRUFBRSxlQUFrQyxDQUFDO0lBQy9ELE1BQU0sY0FBYyxHQUNoQixlQUFlLENBQUMsYUFBYSxFQUFFLGVBQWUsRUFBRSxlQUFlLEVBQUUsT0FBTyxDQUFDLENBQUM7SUFDOUUsTUFBTSxhQUFhLEdBQUcsZUFBZSxDQUNqQyxZQUFZLEVBQUUsY0FBYyxFQUFFLGVBQWUsRUFBRSxtQkFBbUIsQ0FBQyxDQUFDO0lBQ3hFLE1BQU0sYUFBYSxHQUFHLGVBQWUsQ0FDakMsWUFBWSxFQUFFLGNBQWMsRUFBRSxlQUFlLEVBQUUsYUFBYSxDQUFDLEtBQUssQ0FBQyxDQUFDO0lBRXhFLGVBQWUsQ0FBQyxhQUFhLENBQ3pCLGNBQWMsRUFBRSxhQUFhLEVBQUUsV0FBVyxFQUFFLGFBQWEsQ0FBQyxDQUFDO0lBRS9ELE1BQU0sTUFBTSxHQUF3QjtRQUNsQyxhQUFhLEVBQUUsY0FBYztRQUM3QixZQUFZLEVBQUUsYUFBYTtRQUMzQixZQUFZLEVBQUUsYUFBYTtLQUM1QixDQUFDO0lBRUYsTUFBTSxLQUFLLEdBQXVCLEVBQUMsV0FBVyxFQUFDLENBQUM7SUFFaEQsT0FBTyxNQUFNLENBQUMsU0FBUyxDQUNuQixhQUFhLEVBQUUsTUFBOEIsRUFDN0MsS0FBMkIsQ0FBQyxDQUFDO0FBQ25DLENBQUM7QUFFRCxNQUFNLENBQUMsTUFBTSxhQUFhLEdBQUcsRUFBRSxDQUFDLEVBQUMsY0FBYyxFQUFDLENBQUMsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbIi8qKlxuICogQGxpY2Vuc2VcbiAqIENvcHlyaWdodCAyMDE4IEdvb2dsZSBMTEMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuXG4gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgXCJMaWNlbnNlXCIpO1xuICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLlxuICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0XG4gKlxuICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wXG4gKlxuICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZVxuICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gXCJBUyBJU1wiIEJBU0lTLFxuICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuXG4gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kXG4gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS5cbiAqID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4gKi9cblxuaW1wb3J0IHtFTkdJTkV9IGZyb20gJy4uL2VuZ2luZSc7XG5pbXBvcnQge1NwYXJzZVRvRGVuc2UsIFNwYXJzZVRvRGVuc2VBdHRycywgU3BhcnNlVG9EZW5zZUlucHV0c30gZnJvbSAnLi4va2VybmVsX25hbWVzJztcbmltcG9ydCB7TmFtZWRBdHRyTWFwfSBmcm9tICcuLi9rZXJuZWxfcmVnaXN0cnknO1xuaW1wb3J0ICogYXMgc3BhcnNlX3RvX2RlbnNlIGZyb20gJy4uL29wcy9zcGFyc2VfdG9fZGVuc2VfdXRpbCc7XG5pbXBvcnQge1NjYWxhciwgVGVuc29yfSBmcm9tICcuLi90ZW5zb3InO1xuaW1wb3J0IHtOYW1lZFRlbnNvck1hcH0gZnJvbSAnLi4vdGVuc29yX3R5cGVzJztcbmltcG9ydCB7Y29udmVydFRvVGVuc29yfSBmcm9tICcuLi90ZW5zb3JfdXRpbF9lbnYnO1xuaW1wb3J0IHtSYW5rLCBTY2FsYXJMaWtlLCBTaGFwZU1hcCwgVGVuc29yTGlrZX0gZnJvbSAnLi4vdHlwZXMnO1xuXG5pbXBvcnQge29wfSBmcm9tICcuL29wZXJhdGlvbic7XG5cbi8qKlxuICogQ29udmVydHMgYSBzcGFyc2UgcmVwcmVzZW50YXRpb24gaW50byBhIGRlbnNlIHRlbnNvci5cbiAqXG4gKiBCdWlsZHMgYW4gYXJyYXkgZGVuc2Ugd2l0aCBzaGFwZSBvdXRwdXRTaGFwZSBzdWNoIHRoYXQ6XG4gKlxuICogLy8gSWYgc3BhcnNlSW5kaWNlcyBpcyBzY2FsYXJcbiAqIGRlbnNlW2ldID0gKGkgPT0gc3BhcnNlSW5kaWNlcyA/IHNwYXJzZVZhbHVlcyA6IGRlZmF1bHRWYWx1ZSlcbiAqXG4gKiAvLyBJZiBzcGFyc2VJbmRpY2VzIGlzIGEgdmVjdG9yLCB0aGVuIGZvciBlYWNoIGlcbiAqIGRlbnNlW3NwYXJzZUluZGljZXNbaV1dID0gc3BhcnNlVmFsdWVzW2ldXG4gKlxuICogLy8gSWYgc3BhcnNlSW5kaWNlcyBpcyBhbiBuIGJ5IGQgbWF0cml4LCB0aGVuIGZvciBlYWNoIGkgaW4gWzAsIG4pXG4gKiBkZW5zZVtzcGFyc2VJbmRpY2VzW2ldWzBdLCAuLi4sIHNwYXJzZUluZGljZXNbaV1bZC0xXV0gPSBzcGFyc2VWYWx1ZXNbaV1cbiAqIEFsbCBvdGhlciB2YWx1ZXMgaW4gZGVuc2UgYXJlIHNldCB0byBkZWZhdWx0VmFsdWUuIElmIHNwYXJzZVZhbHVlcyBpcyBhXG4gKiBzY2FsYXIsIGFsbCBzcGFyc2UgaW5kaWNlcyBhcmUgc2V0IHRvIHRoaXMgc2luZ2xlIHZhbHVlLlxuICpcbiAqIElmIGluZGljZXMgYXJlIHJlcGVhdGVkIHRoZSBmaW5hbCB2YWx1ZSBpcyBzdW1tZWQgb3ZlciBhbGwgdmFsdWVzIGZvciB0aG9zZVxuICogaW5kaWNlcy5cbiAqXG4gKiBgYGBqc1xuICogY29uc3QgaW5kaWNlcyA9IHRmLnRlbnNvcjFkKFs0LCA1LCA2LCAxLCAyLCAzXSwgJ2ludDMyJyk7XG4gKiBjb25zdCB2YWx1ZXMgPSB0Zi50ZW5zb3IxZChbMTAsIDExLCAxMiwgMTMsIDE0LCAxNV0sICdmbG9hdDMyJyk7XG4gKiBjb25zdCBzaGFwZSA9IFs4XTtcbiAqIHRmLnNwYXJzZVRvRGVuc2UoaW5kaWNlcywgdmFsdWVzLCBzaGFwZSkucHJpbnQoKTtcbiAqIGBgYFxuICpcbiAqIEBwYXJhbSBzcGFyc2VJbmRpY2VzIEEgMC1ELCAxLUQsIG9yIDItRCBUZW5zb3Igb2YgdHlwZSBpbnQzMi5cbiAqIHNwYXJzZUluZGljZXNbaV0gY29udGFpbnMgdGhlIGNvbXBsZXRlIGluZGV4IHdoZXJlIHNwYXJzZVZhbHVlc1tpXSB3aWxsIGJlXG4gKiBwbGFjZWQuXG4gKiBAcGFyYW0gc3BhcnNlVmFsdWVzIEEgMC1EIG9yIDEtRCBUZW5zb3IuIFZhbHVlc1xuICogY29ycmVzcG9uZGluZyB0byBlYWNoIHJvdyBvZiBzcGFyc2VJbmRpY2VzLCBvciBhIHNjYWxhciB2YWx1ZSB0byBiZSB1c2VkIGZvclxuICogYWxsIHNwYXJzZSBpbmRpY2VzLlxuICogQHBhcmFtIG91dHB1dFNoYXBlIFNoYXBlIG9mIHRoZSBkZW5zZSBvdXRwdXQgdGVuc29yLiBUaGUgdHlwZSBpcyBpbmZlcnJlZC5cbiAqIEBwYXJhbSBkZWZhdWx0VmFsdWUgU2NhbGFyLiBWYWx1ZSB0byBzZXQgZm9yIGluZGljZXMgbm90IHNwZWNpZmllZCBpblxuICogc3BhcnNlSW5kaWNlcy4gRGVmYXVsdHMgdG8gemVyby5cbiAqXG4gKiBAZG9jIHtoZWFkaW5nOiAnT3BlcmF0aW9ucycsIHN1YmhlYWRpbmc6ICdOb3JtYWxpemF0aW9uJ31cbiAqL1xuZnVuY3Rpb24gc3BhcnNlVG9EZW5zZV88UiBleHRlbmRzIFJhbms+KFxuICAgIHNwYXJzZUluZGljZXM6IFRlbnNvcnxUZW5zb3JMaWtlLCBzcGFyc2VWYWx1ZXM6IFRlbnNvcnxUZW5zb3JMaWtlLFxuICAgIG91dHB1dFNoYXBlOiBTaGFwZU1hcFtSXSwgZGVmYXVsdFZhbHVlOiBTY2FsYXJ8U2NhbGFyTGlrZSA9IDApOiBUZW5zb3I8Uj4ge1xuICBjb25zdCAkc3BhcnNlSW5kaWNlcyA9XG4gICAgICBjb252ZXJ0VG9UZW5zb3Ioc3BhcnNlSW5kaWNlcywgJ3NwYXJzZUluZGljZXMnLCAnc3BhcnNlVG9EZW5zZScsICdpbnQzMicpO1xuICBjb25zdCAkc3BhcnNlVmFsdWVzID0gY29udmVydFRvVGVuc29yKFxuICAgICAgc3BhcnNlVmFsdWVzLCAnc3BhcnNlVmFsdWVzJywgJ3NwYXJzZVRvRGVuc2UnLCAnc3RyaW5nX29yX251bWVyaWMnKTtcbiAgY29uc3QgJGRlZmF1bHRWYWx1ZSA9IGNvbnZlcnRUb1RlbnNvcihcbiAgICAgIGRlZmF1bHRWYWx1ZSwgJ2RlZmF1bHRWYWx1ZScsICdzcGFyc2VUb0RlbnNlJywgJHNwYXJzZVZhbHVlcy5kdHlwZSk7XG5cbiAgc3BhcnNlX3RvX2RlbnNlLnZhbGlkYXRlSW5wdXQoXG4gICAgICAkc3BhcnNlSW5kaWNlcywgJHNwYXJzZVZhbHVlcywgb3V0cHV0U2hhcGUsICRkZWZhdWx0VmFsdWUpO1xuXG4gIGNvbnN0IGlucHV0czogU3BhcnNlVG9EZW5zZUlucHV0cyA9IHtcbiAgICBzcGFyc2VJbmRpY2VzOiAkc3BhcnNlSW5kaWNlcyxcbiAgICBzcGFyc2VWYWx1ZXM6ICRzcGFyc2VWYWx1ZXMsXG4gICAgZGVmYXVsdFZhbHVlOiAkZGVmYXVsdFZhbHVlXG4gIH07XG5cbiAgY29uc3QgYXR0cnM6IFNwYXJzZVRvRGVuc2VBdHRycyA9IHtvdXRwdXRTaGFwZX07XG5cbiAgcmV0dXJuIEVOR0lORS5ydW5LZXJuZWwoXG4gICAgICBTcGFyc2VUb0RlbnNlLCBpbnB1dHMgYXMge30gYXMgTmFtZWRUZW5zb3JNYXAsXG4gICAgICBhdHRycyBhcyB7fSBhcyBOYW1lZEF0dHJNYXApO1xufVxuXG5leHBvcnQgY29uc3Qgc3BhcnNlVG9EZW5zZSA9IG9wKHtzcGFyc2VUb0RlbnNlX30pO1xuIl19","/**\n * Validate sparseToDense inputs.\n *\n * @param sparseIndices A 0-D, 1-D, or 2-D Tensor of type int32.\n * sparseIndices[i] contains the complete index where sparseValues[i] will be\n * placed.\n * @param sparseValues A 0-D or 1-D Tensor. Values\n * corresponding to each row of sparseIndices, or a scalar value to be used for\n * all sparse indices.\n * @param outputShape number[]. Shape of the dense output tensor.\n * @param validateIndices boolean. indice validation is not supported, error\n * will be thrown if it is set.\n */\nexport function validateInput(sparseIndices, sparseValues, outputShape, defaultValues) {\n if (sparseIndices.dtype !== 'int32') {\n throw new Error('tf.sparseToDense() expects the indices to be int32 type,' +\n ` but the dtype was ${sparseIndices.dtype}.`);\n }\n if (sparseIndices.rank > 2) {\n throw new Error('sparseIndices should be a scalar, vector, or matrix,' +\n ` but got shape ${sparseIndices.shape}.`);\n }\n const numElems = sparseIndices.rank > 0 ? sparseIndices.shape[0] : 1;\n const numDims = sparseIndices.rank > 1 ? sparseIndices.shape[1] : 1;\n if (outputShape.length !== numDims) {\n throw new Error('outputShape has incorrect number of elements:,' +\n ` ${outputShape.length}, should be: ${numDims}.`);\n }\n const numValues = sparseValues.size;\n if (!(sparseValues.rank === 0 ||\n sparseValues.rank === 1 && numValues === numElems)) {\n throw new Error('sparseValues has incorrect shape ' +\n `${sparseValues.shape}, should be [] or [${numElems}]`);\n }\n if (sparseValues.dtype !== defaultValues.dtype) {\n throw new Error('sparseValues.dtype must match defaultValues.dtype');\n }\n}\n//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic3BhcnNlX3RvX2RlbnNlX3V0aWwuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi8uLi90ZmpzLWNvcmUvc3JjL29wcy9zcGFyc2VfdG9fZGVuc2VfdXRpbC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFrQkE7Ozs7Ozs7Ozs7OztHQVlHO0FBQ0gsTUFBTSxVQUFVLGFBQWEsQ0FDekIsYUFBcUIsRUFBRSxZQUFvQixFQUFFLFdBQXFCLEVBQ2xFLGFBQXFCO0lBQ3ZCLElBQUksYUFBYSxDQUFDLEtBQUssS0FBSyxPQUFPLEVBQUU7UUFDbkMsTUFBTSxJQUFJLEtBQUssQ0FDWCwwREFBMEQ7WUFDMUQsc0JBQXNCLGFBQWEsQ0FBQyxLQUFLLEdBQUcsQ0FBQyxDQUFDO0tBQ25EO0lBQ0QsSUFBSSxhQUFhLENBQUMsSUFBSSxHQUFHLENBQUMsRUFBRTtRQUMxQixNQUFNLElBQUksS0FBSyxDQUNYLHNEQUFzRDtZQUN0RCxrQkFBa0IsYUFBYSxDQUFDLEtBQUssR0FBRyxDQUFDLENBQUM7S0FDL0M7SUFFRCxNQUFNLFFBQVEsR0FBRyxhQUFhLENBQUMsSUFBSSxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsYUFBYSxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDO0lBQ3JFLE1BQU0sT0FBTyxHQUFHLGFBQWEsQ0FBQyxJQUFJLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxhQUFhLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUM7SUFFcEUsSUFBSSxXQUFXLENBQUMsTUFBTSxLQUFLLE9BQU8sRUFBRTtRQUNsQyxNQUFNLElBQUksS0FBSyxDQUNYLGdEQUFnRDtZQUNoRCxJQUFJLFdBQVcsQ0FBQyxNQUFNLGdCQUFnQixPQUFPLEdBQUcsQ0FBQyxDQUFDO0tBQ3ZEO0lBRUQsTUFBTSxTQUFTLEdBQUcsWUFBWSxDQUFDLElBQUksQ0FBQztJQUNwQyxJQUFJLENBQUMsQ0FBQyxZQUFZLENBQUMsSUFBSSxLQUFLLENBQUM7UUFDdkIsWUFBWSxDQUFDLElBQUksS0FBSyxDQUFDLElBQUksU0FBUyxLQUFLLFFBQVEsQ0FBQyxFQUFFO1FBQ3hELE1BQU0sSUFBSSxLQUFLLENBQ1gsbUNBQW1DO1lBQ25DLEdBQUcsWUFBWSxDQUFDLEtBQUssc0JBQXNCLFFBQVEsR0FBRyxDQUFDLENBQUM7S0FDN0Q7SUFFRCxJQUFJLFlBQVksQ0FBQyxLQUFLLEtBQUssYUFBYSxDQUFDLEtBQUssRUFBRTtRQUM5QyxNQUFNLElBQUksS0FBSyxDQUFDLG1EQUFtRCxDQUFDLENBQUM7S0FDdEU7QUFDSCxDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiLyoqXG4gKiBAbGljZW5zZVxuICogQ29weXJpZ2h0IDIwMTggR29vZ2xlIExMQy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC5cbiAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSBcIkxpY2Vuc2VcIik7XG4gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuXG4gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXRcbiAqXG4gKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjBcbiAqXG4gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlXG4gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiBcIkFTIElTXCIgQkFTSVMsXG4gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC5cbiAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmRcbiAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLlxuICogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbiAqL1xuaW1wb3J0IHtUZW5zb3J9IGZyb20gJy4uL3RlbnNvcic7XG5cbi8qKlxuICogVmFsaWRhdGUgc3BhcnNlVG9EZW5zZSBpbnB1dHMuXG4gKlxuICogQHBhcmFtIHNwYXJzZUluZGljZXMgQSAwLUQsIDEtRCwgb3IgMi1EIFRlbnNvciBvZiB0eXBlIGludDMyLlxuICogc3BhcnNlSW5kaWNlc1tpXSBjb250YWlucyB0aGUgY29tcGxldGUgaW5kZXggd2hlcmUgc3BhcnNlVmFsdWVzW2ldIHdpbGwgYmVcbiAqIHBsYWNlZC5cbiAqIEBwYXJhbSBzcGFyc2VWYWx1ZXMgQSAwLUQgb3IgMS1EIFRlbnNvci4gVmFsdWVzXG4gKiBjb3JyZXNwb25kaW5nIHRvIGVhY2ggcm93IG9mIHNwYXJzZUluZGljZXMsIG9yIGEgc2NhbGFyIHZhbHVlIHRvIGJlIHVzZWQgZm9yXG4gKiBhbGwgc3BhcnNlIGluZGljZXMuXG4gKiBAcGFyYW0gb3V0cHV0U2hhcGUgbnVtYmVyW10uIFNoYXBlIG9mIHRoZSBkZW5zZSBvdXRwdXQgdGVuc29yLlxuICogQHBhcmFtIHZhbGlkYXRlSW5kaWNlcyBib29sZWFuLiBpbmRpY2UgdmFsaWRhdGlvbiBpcyBub3Qgc3VwcG9ydGVkLCBlcnJvclxuICogd2lsbCBiZSB0aHJvd24gaWYgaXQgaXMgc2V0LlxuICovXG5leHBvcnQgZnVuY3Rpb24gdmFsaWRhdGVJbnB1dChcbiAgICBzcGFyc2VJbmRpY2VzOiBUZW5zb3IsIHNwYXJzZVZhbHVlczogVGVuc29yLCBvdXRwdXRTaGFwZTogbnVtYmVyW10sXG4gICAgZGVmYXVsdFZhbHVlczogVGVuc29yKSB7XG4gIGlmIChzcGFyc2VJbmRpY2VzLmR0eXBlICE9PSAnaW50MzInKSB7XG4gICAgdGhyb3cgbmV3IEVycm9yKFxuICAgICAgICAndGYuc3BhcnNlVG9EZW5zZSgpIGV4cGVjdHMgdGhlIGluZGljZXMgdG8gYmUgaW50MzIgdHlwZSwnICtcbiAgICAgICAgYCBidXQgdGhlIGR0eXBlIHdhcyAke3NwYXJzZUluZGljZXMuZHR5cGV9LmApO1xuICB9XG4gIGlmIChzcGFyc2VJbmRpY2VzLnJhbmsgPiAyKSB7XG4gICAgdGhyb3cgbmV3IEVycm9yKFxuICAgICAgICAnc3BhcnNlSW5kaWNlcyBzaG91bGQgYmUgYSBzY2FsYXIsIHZlY3Rvciwgb3IgbWF0cml4LCcgK1xuICAgICAgICBgIGJ1dCBnb3Qgc2hhcGUgJHtzcGFyc2VJbmRpY2VzLnNoYXBlfS5gKTtcbiAgfVxuXG4gIGNvbnN0IG51bUVsZW1zID0gc3BhcnNlSW5kaWNlcy5yYW5rID4gMCA/IHNwYXJzZUluZGljZXMuc2hhcGVbMF0gOiAxO1xuICBjb25zdCBudW1EaW1zID0gc3BhcnNlSW5kaWNlcy5yYW5rID4gMSA/IHNwYXJzZUluZGljZXMuc2hhcGVbMV0gOiAxO1xuXG4gIGlmIChvdXRwdXRTaGFwZS5sZW5ndGggIT09IG51bURpbXMpIHtcbiAgICB0aHJvdyBuZXcgRXJyb3IoXG4gICAgICAgICdvdXRwdXRTaGFwZSBoYXMgaW5jb3JyZWN0IG51bWJlciBvZiBlbGVtZW50czosJyArXG4gICAgICAgIGAgJHtvdXRwdXRTaGFwZS5sZW5ndGh9LCBzaG91bGQgYmU6ICR7bnVtRGltc30uYCk7XG4gIH1cblxuICBjb25zdCBudW1WYWx1ZXMgPSBzcGFyc2VWYWx1ZXMuc2l6ZTtcbiAgaWYgKCEoc3BhcnNlVmFsdWVzLnJhbmsgPT09IDAgfHxcbiAgICAgICAgc3BhcnNlVmFsdWVzLnJhbmsgPT09IDEgJiYgbnVtVmFsdWVzID09PSBudW1FbGVtcykpIHtcbiAgICB0aHJvdyBuZXcgRXJyb3IoXG4gICAgICAgICdzcGFyc2VWYWx1ZXMgaGFzIGluY29ycmVjdCBzaGFwZSAnICtcbiAgICAgICAgYCR7c3BhcnNlVmFsdWVzLnNoYXBlfSwgc2hvdWxkIGJlIFtdIG9yIFske251bUVsZW1zfV1gKTtcbiAgfVxuXG4gIGlmIChzcGFyc2VWYWx1ZXMuZHR5cGUgIT09IGRlZmF1bHRWYWx1ZXMuZHR5cGUpIHtcbiAgICB0aHJvdyBuZXcgRXJyb3IoJ3NwYXJzZVZhbHVlcy5kdHlwZSBtdXN0IG1hdGNoIGRlZmF1bHRWYWx1ZXMuZHR5cGUnKTtcbiAgfVxufVxuIl19","/**\n * @license\n * Copyright 2018 Google LLC. All Rights Reserved.\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n * =============================================================================\n */\nimport { ENGINE } from '../engine';\nimport { GatherNd } from '../kernel_names';\nimport { convertToTensor } from '../tensor_util_env';\nimport { op } from './operation';\n/**\n * Gather slices from input tensor into a Tensor with shape specified by\n * `indices`.\n *\n * `indices` is a K-dimensional integer tensor, best thought of as a\n * (K-1)-dimensional tensor of indices into input, where each element defines a\n * slice of input:\n * output[\\\\(i_0, ..., i_{K-2}\\\\)] = input[indices[\\\\(i_0, ..., i_{K-2}\\\\)]]\n *\n * Whereas in `tf.gather`, `indices` defines slices into the first dimension of\n * input, in `tf.gatherND`, `indices` defines slices into the first N dimensions\n * of input, where N = indices.shape[-1].\n *\n * The last dimension of indices can be at most the rank of input:\n * indices.shape[-1] <= input.rank\n *\n * The last dimension of `indices` corresponds to elements\n * (if indices.shape[-1] == input.rank) or slices\n * (if indices.shape[-1] < input.rank) along dimension indices.shape[-1] of\n * input.\n * The output tensor has shape\n * indices.shape[:-1] + input.shape[indices.shape[-1]:]\n *\n * Note that on CPU, if an out of bound index is found, an error is returned. On\n * GPU, if an out of bound index is found, a 0 is stored in the corresponding\n * output value.\n *\n * ```js\n * const indices = tf.tensor2d([0, 1, 1, 0], [2,2], 'int32');\n * const input = tf.tensor2d([9, 10, 11, 12], [2, 2]);\n * tf.gatherND(input, indices).print() // [10, 11]\n * ```\n *\n * @param x The tensor from which to gather values.\n * @param indices Index tensor, must be of type int32.\n *\n * @doc {heading: 'Operations', subheading: 'Slicing and Joining'}\n */\nfunction gatherND_(x, indices) {\n const $indices = convertToTensor(indices, 'indices', 'gatherND', 'int32');\n const $x = convertToTensor(x, 'x', 'gatherND', 'string_or_numeric');\n const inputs = { params: $x, indices: $indices };\n return ENGINE.runKernel(GatherNd, inputs);\n}\nexport const gatherND = op({ gatherND_ });\n//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZ2F0aGVyX25kLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vLi4vdGZqcy1jb3JlL3NyYy9vcHMvZ2F0aGVyX25kLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBOzs7Ozs7Ozs7Ozs7Ozs7R0FlRztBQUNILE9BQU8sRUFBQyxNQUFNLEVBQUMsTUFBTSxXQUFXLENBQUM7QUFDakMsT0FBTyxFQUFDLFFBQVEsRUFBaUIsTUFBTSxpQkFBaUIsQ0FBQztBQUd6RCxPQUFPLEVBQUMsZUFBZSxFQUFDLE1BQU0sb0JBQW9CLENBQUM7QUFFbkQsT0FBTyxFQUFDLEVBQUUsRUFBQyxNQUFNLGFBQWEsQ0FBQztBQUUvQjs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7OztHQXFDRztBQUNILFNBQVMsU0FBUyxDQUFDLENBQW9CLEVBQUUsT0FBMEI7SUFDakUsTUFBTSxRQUFRLEdBQUcsZUFBZSxDQUFDLE9BQU8sRUFBRSxTQUFTLEVBQUUsVUFBVSxFQUFFLE9BQU8sQ0FBQyxDQUFDO0lBQzFFLE1BQU0sRUFBRSxHQUFHLGVBQWUsQ0FBQyxDQUFDLEVBQUUsR0FBRyxFQUFFLFVBQVUsRUFBRSxtQkFBbUIsQ0FBQyxDQUFDO0lBRXBFLE1BQU0sTUFBTSxHQUFtQixFQUFDLE1BQU0sRUFBRSxFQUFFLEVBQUUsT0FBTyxFQUFFLFFBQVEsRUFBQyxDQUFDO0lBRS9ELE9BQU8sTUFBTSxDQUFDLFNBQVMsQ0FBQyxRQUFRLEVBQUUsTUFBOEIsQ0FBQyxDQUFDO0FBQ3BFLENBQUM7QUFFRCxNQUFNLENBQUMsTUFBTSxRQUFRLEdBQUcsRUFBRSxDQUFDLEVBQUMsU0FBUyxFQUFDLENBQUMsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbIi8qKlxuICogQGxpY2Vuc2VcbiAqIENvcHlyaWdodCAyMDE4IEdvb2dsZSBMTEMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuXG4gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgXCJMaWNlbnNlXCIpO1xuICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLlxuICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0XG4gKlxuICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wXG4gKlxuICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZVxuICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gXCJBUyBJU1wiIEJBU0lTLFxuICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuXG4gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kXG4gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS5cbiAqID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4gKi9cbmltcG9ydCB7RU5HSU5FfSBmcm9tICcuLi9lbmdpbmUnO1xuaW1wb3J0IHtHYXRoZXJOZCwgR2F0aGVyTmRJbnB1dHN9IGZyb20gJy4uL2tlcm5lbF9uYW1lcyc7XG5pbXBvcnQge1RlbnNvcn0gZnJvbSAnLi4vdGVuc29yJztcbmltcG9ydCB7TmFtZWRUZW5zb3JNYXB9IGZyb20gJy4uL3RlbnNvcl90eXBlcyc7XG5pbXBvcnQge2NvbnZlcnRUb1RlbnNvcn0gZnJvbSAnLi4vdGVuc29yX3V0aWxfZW52JztcbmltcG9ydCB7VGVuc29yTGlrZX0gZnJvbSAnLi4vdHlwZXMnO1xuaW1wb3J0IHtvcH0gZnJvbSAnLi9vcGVyYXRpb24nO1xuXG4vKipcbiAqIEdhdGhlciBzbGljZXMgZnJvbSBpbnB1dCB0ZW5zb3IgaW50byBhIFRlbnNvciB3aXRoIHNoYXBlIHNwZWNpZmllZCBieVxuICogYGluZGljZXNgLlxuICpcbiAqIGBpbmRpY2VzYCBpcyBhIEstZGltZW5zaW9uYWwgaW50ZWdlciB0ZW5zb3IsIGJlc3QgdGhvdWdodCBvZiBhcyBhXG4gKiAoSy0xKS1kaW1lbnNpb25hbCB0ZW5zb3Igb2YgaW5kaWNlcyBpbnRvIGlucHV0LCB3aGVyZSBlYWNoIGVsZW1lbnQgZGVmaW5lcyBhXG4gKiBzbGljZSBvZiBpbnB1dDpcbiAqIG91dHB1dFtcXFxcKGlfMCwgLi4uLCBpX3tLLTJ9XFxcXCldID0gaW5wdXRbaW5kaWNlc1tcXFxcKGlfMCwgLi4uLCBpX3tLLTJ9XFxcXCldXVxuICpcbiAqIFdoZXJlYXMgaW4gYHRmLmdhdGhlcmAsIGBpbmRpY2VzYCBkZWZpbmVzIHNsaWNlcyBpbnRvIHRoZSBmaXJzdCBkaW1lbnNpb24gb2ZcbiAqIGlucHV0LCBpbiBgdGYuZ2F0aGVyTkRgLCBgaW5kaWNlc2AgZGVmaW5lcyBzbGljZXMgaW50byB0aGUgZmlyc3QgTiBkaW1lbnNpb25zXG4gKiBvZiBpbnB1dCwgd2hlcmUgTiA9IGluZGljZXMuc2hhcGVbLTFdLlxuICpcbiAqIFRoZSBsYXN0IGRpbWVuc2lvbiBvZiBpbmRpY2VzIGNhbiBiZSBhdCBtb3N0IHRoZSByYW5rIG9mIGlucHV0OlxuICogaW5kaWNlcy5zaGFwZVstMV0gPD0gaW5wdXQucmFua1xuICpcbiAqIFRoZSBsYXN0IGRpbWVuc2lvbiBvZiBgaW5kaWNlc2AgY29ycmVzcG9uZHMgdG8gZWxlbWVudHNcbiAqIChpZiBpbmRpY2VzLnNoYXBlWy0xXSA9PSBpbnB1dC5yYW5rKSBvciBzbGljZXNcbiAqIChpZiBpbmRpY2VzLnNoYXBlWy0xXSA8IGlucHV0LnJhbmspIGFsb25nIGRpbWVuc2lvbiBpbmRpY2VzLnNoYXBlWy0xXSBvZlxuICogaW5wdXQuXG4gKiBUaGUgb3V0cHV0IHRlbnNvciBoYXMgc2hhcGVcbiAqIGluZGljZXMuc2hhcGVbOi0xXSArIGlucHV0LnNoYXBlW2luZGljZXMuc2hhcGVbLTFdOl1cbiAqXG4gKiBOb3RlIHRoYXQgb24gQ1BVLCBpZiBhbiBvdXQgb2YgYm91bmQgaW5kZXggaXMgZm91bmQsIGFuIGVycm9yIGlzIHJldHVybmVkLiBPblxuICogR1BVLCBpZiBhbiBvdXQgb2YgYm91bmQgaW5kZXggaXMgZm91bmQsIGEgMCBpcyBzdG9yZWQgaW4gdGhlIGNvcnJlc3BvbmRpbmdcbiAqIG91dHB1dCB2YWx1ZS5cbiAqXG4gKiBgYGBqc1xuICogY29uc3QgaW5kaWNlcyA9IHRmLnRlbnNvcjJkKFswLCAxLCAxLCAwXSwgWzIsMl0sICdpbnQzMicpO1xuICogY29uc3QgaW5wdXQgPSB0Zi50ZW5zb3IyZChbOSwgMTAsIDExLCAxMl0sIFsyLCAyXSk7XG4gKiB0Zi5nYXRoZXJORChpbnB1dCwgaW5kaWNlcykucHJpbnQoKSAvLyBbMTAsIDExXVxuICogYGBgXG4gKlxuICogQHBhcmFtIHggVGhlIHRlbnNvciBmcm9tIHdoaWNoIHRvIGdhdGhlciB2YWx1ZXMuXG4gKiBAcGFyYW0gaW5kaWNlcyBJbmRleCB0ZW5zb3IsIG11c3QgYmUgb2YgdHlwZSBpbnQzMi5cbiAqXG4gKiBAZG9jIHtoZWFkaW5nOiAnT3BlcmF0aW9ucycsIHN1YmhlYWRpbmc6ICdTbGljaW5nIGFuZCBKb2luaW5nJ31cbiAqL1xuZnVuY3Rpb24gZ2F0aGVyTkRfKHg6IFRlbnNvcnxUZW5zb3JMaWtlLCBpbmRpY2VzOiBUZW5zb3J8VGVuc29yTGlrZSk6IFRlbnNvciB7XG4gIGNvbnN0ICRpbmRpY2VzID0gY29udmVydFRvVGVuc29yKGluZGljZXMsICdpbmRpY2VzJywgJ2dhdGhlck5EJywgJ2ludDMyJyk7XG4gIGNvbnN0ICR4ID0gY29udmVydFRvVGVuc29yKHgsICd4JywgJ2dhdGhlck5EJywgJ3N0cmluZ19vcl9udW1lcmljJyk7XG5cbiAgY29uc3QgaW5wdXRzOiBHYXRoZXJOZElucHV0cyA9IHtwYXJhbXM6ICR4LCBpbmRpY2VzOiAkaW5kaWNlc307XG5cbiAgcmV0dXJuIEVOR0lORS5ydW5LZXJuZWwoR2F0aGVyTmQsIGlucHV0cyBhcyB7fSBhcyBOYW1lZFRlbnNvck1hcCk7XG59XG5cbmV4cG9ydCBjb25zdCBnYXRoZXJORCA9IG9wKHtnYXRoZXJORF99KTtcbiJdfQ==","/**\n * @license\n * Copyright 2018 Google LLC. All Rights Reserved.\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n * =============================================================================\n */\nimport { Tensor } from '../tensor';\nimport { convertToTensor } from '../tensor_util_env';\nimport * as util from '../util';\nimport { add } from './add';\nimport { div } from './div';\nimport { getNoiseShape } from './dropout_util';\nimport { floor } from './floor';\nimport { mul } from './mul';\nimport { op } from './operation';\nimport { randomUniform } from './random_uniform';\n/**\n * Computes dropout.\n *\n * ```js\n * const x = tf.tensor1d([1, 2, 2, 1]);\n * const rate = 0.75;\n * const output = tf.dropout(x, rate);\n * output.print();\n * ```\n *\n * @param x A floating point Tensor or TensorLike.\n * @param rate A float in the range [0, 1). The probability that each element\n * of x is discarded.\n * @param noiseShape An array of numbers of type int32, representing the\n * shape for randomly generated keep/drop flags. If the noiseShape has null\n * value, it will be automatically replaced with the x's relative dimension\n * size. Optional.\n * @param seed Used to create random seeds. Optional.\n * @returns A Tensor of the same shape of x.\n *\n * @doc {heading: 'Operations', subheading: 'Dropout'}\n */\nfunction dropout_(x, rate, noiseShape, seed) {\n const $x = convertToTensor(x, 'x', 'dropout');\n util.assert($x.dtype === 'float32', () => `x has to be a floating point tensor since it's going to be ` +\n `scaled, but got a ${$x.dtype} tensor instead.`);\n util.assert(rate >= 0 && rate < 1, () => `rate must be a float in the range [0, 1), but got ${rate}.`);\n if (rate === 0) {\n return x instanceof Tensor ? $x.clone() : $x;\n }\n const $noiseShape = getNoiseShape($x, noiseShape);\n const keepProb = 1 - rate;\n const multiplier = div(floor(add(randomUniform($noiseShape, 0, 1, 'float32', seed), keepProb)), keepProb);\n return mul($x, multiplier);\n}\nexport const dropout = op({ dropout_ });\n//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZHJvcG91dC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uLy4uL3RmanMtY29yZS9zcmMvb3BzL2Ryb3BvdXQudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUE7Ozs7Ozs7Ozs7Ozs7OztHQWVHO0FBRUgsT0FBTyxFQUFDLE1BQU0sRUFBQyxNQUFNLFdBQVcsQ0FBQztBQUNqQyxPQUFPLEVBQUMsZUFBZSxFQUFDLE1BQU0sb0JBQW9CLENBQUM7QUFFbkQsT0FBTyxLQUFLLElBQUksTUFBTSxTQUFTLENBQUM7QUFFaEMsT0FBTyxFQUFDLEdBQUcsRUFBQyxNQUFNLE9BQU8sQ0FBQztBQUMxQixPQUFPLEVBQUMsR0FBRyxFQUFDLE1BQU0sT0FBTyxDQUFDO0FBQzFCLE9BQU8sRUFBQyxhQUFhLEVBQUMsTUFBTSxnQkFBZ0IsQ0FBQztBQUM3QyxPQUFPLEVBQUMsS0FBSyxFQUFDLE1BQU0sU0FBUyxDQUFDO0FBQzlCLE9BQU8sRUFBQyxHQUFHLEVBQUMsTUFBTSxPQUFPLENBQUM7QUFDMUIsT0FBTyxFQUFDLEVBQUUsRUFBQyxNQUFNLGFBQWEsQ0FBQztBQUMvQixPQUFPLEVBQUMsYUFBYSxFQUFDLE1BQU0sa0JBQWtCLENBQUM7QUFFL0M7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7OztHQXFCRztBQUNILFNBQVMsUUFBUSxDQUNiLENBQW9CLEVBQUUsSUFBWSxFQUFFLFVBQXFCLEVBQ3pELElBQW9CO0lBQ3RCLE1BQU0sRUFBRSxHQUFHLGVBQWUsQ0FBQyxDQUFDLEVBQUUsR0FBRyxFQUFFLFNBQVMsQ0FBQyxDQUFDO0lBRTlDLElBQUksQ0FBQyxNQUFNLENBQ1AsRUFBRSxDQUFDLEtBQUssS0FBSyxTQUFTLEVBQ3RCLEdBQUcsRUFBRSxDQUFDLDZEQUE2RDtRQUMvRCxxQkFBcUIsRUFBRSxDQUFDLEtBQUssa0JBQWtCLENBQUMsQ0FBQztJQUN6RCxJQUFJLENBQUMsTUFBTSxDQUNQLElBQUksSUFBSSxDQUFDLElBQUksSUFBSSxHQUFHLENBQUMsRUFDckIsR0FBRyxFQUFFLENBQUMscURBQXFELElBQUksR0FBRyxDQUFDLENBQUM7SUFFeEUsSUFBSSxJQUFJLEtBQUssQ0FBQyxFQUFFO1FBQ2QsT0FBTyxDQUFDLFlBQVksTUFBTSxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsS0FBSyxFQUFFLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQztLQUM5QztJQUVELE1BQU0sV0FBVyxHQUFHLGFBQWEsQ0FBQyxFQUFFLEVBQUUsVUFBVSxDQUFDLENBQUM7SUFDbEQsTUFBTSxRQUFRLEdBQUcsQ0FBQyxHQUFHLElBQUksQ0FBQztJQUMxQixNQUFNLFVBQVUsR0FBRyxHQUFHLENBQ2xCLEtBQUssQ0FBQyxHQUFHLENBQUMsYUFBYSxDQUFDLFdBQVcsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLFNBQVMsRUFBRSxJQUFJLENBQUMsRUFBRSxRQUFRLENBQUMsQ0FBQyxFQUN2RSxRQUFRLENBQUMsQ0FBQztJQUVkLE9BQU8sR0FBRyxDQUFDLEVBQUUsRUFBRSxVQUFVLENBQUMsQ0FBQztBQUM3QixDQUFDO0FBRUQsTUFBTSxDQUFDLE1BQU0sT0FBTyxHQUFHLEVBQUUsQ0FBQyxFQUFDLFFBQVEsRUFBQyxDQUFDLENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyIvKipcbiAqIEBsaWNlbnNlXG4gKiBDb3B5cmlnaHQgMjAxOCBHb29nbGUgTExDLiBBbGwgUmlnaHRzIFJlc2VydmVkLlxuICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlIFwiTGljZW5zZVwiKTtcbiAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS5cbiAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdFxuICpcbiAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMFxuICpcbiAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmVcbiAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuIFwiQVMgSVNcIiBCQVNJUyxcbiAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLlxuICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZFxuICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuXG4gKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuICovXG5cbmltcG9ydCB7VGVuc29yfSBmcm9tICcuLi90ZW5zb3InO1xuaW1wb3J0IHtjb252ZXJ0VG9UZW5zb3J9IGZyb20gJy4uL3RlbnNvcl91dGlsX2Vudic7XG5pbXBvcnQge1RlbnNvckxpa2V9IGZyb20gJy4uL3R5cGVzJztcbmltcG9ydCAqIGFzIHV0aWwgZnJvbSAnLi4vdXRpbCc7XG5cbmltcG9ydCB7YWRkfSBmcm9tICcuL2FkZCc7XG5pbXBvcnQge2Rpdn0gZnJvbSAnLi9kaXYnO1xuaW1wb3J0IHtnZXROb2lzZVNoYXBlfSBmcm9tICcuL2Ryb3BvdXRfdXRpbCc7XG5pbXBvcnQge2Zsb29yfSBmcm9tICcuL2Zsb29yJztcbmltcG9ydCB7bXVsfSBmcm9tICcuL211bCc7XG5pbXBvcnQge29wfSBmcm9tICcuL29wZXJhdGlvbic7XG5pbXBvcnQge3JhbmRvbVVuaWZvcm19IGZyb20gJy4vcmFuZG9tX3VuaWZvcm0nO1xuXG4vKipcbiAqIENvbXB1dGVzIGRyb3BvdXQuXG4gKlxuICogYGBganNcbiAqIGNvbnN0IHggPSB0Zi50ZW5zb3IxZChbMSwgMiwgMiwgMV0pO1xuICogY29uc3QgcmF0ZSA9IDAuNzU7XG4gKiBjb25zdCBvdXRwdXQgPSB0Zi5kcm9wb3V0KHgsIHJhdGUpO1xuICogb3V0cHV0LnByaW50KCk7XG4gKiBgYGBcbiAqXG4gKiBAcGFyYW0geCBBIGZsb2F0aW5nIHBvaW50IFRlbnNvciBvciBUZW5zb3JMaWtlLlxuICogQHBhcmFtIHJhdGUgQSBmbG9hdCBpbiB0aGUgcmFuZ2UgWzAsIDEpLiBUaGUgcHJvYmFiaWxpdHkgdGhhdCBlYWNoIGVsZW1lbnRcbiAqICAgb2YgeCBpcyBkaXNjYXJkZWQuXG4gKiBAcGFyYW0gbm9pc2VTaGFwZSBBbiBhcnJheSBvZiBudW1iZXJzIG9mIHR5cGUgaW50MzIsIHJlcHJlc2VudGluZyB0aGVcbiAqIHNoYXBlIGZvciByYW5kb21seSBnZW5lcmF0ZWQga2VlcC9kcm9wIGZsYWdzLiBJZiB0aGUgbm9pc2VTaGFwZSBoYXMgbnVsbFxuICogdmFsdWUsIGl0IHdpbGwgYmUgYXV0b21hdGljYWxseSByZXBsYWNlZCB3aXRoIHRoZSB4J3MgcmVsYXRpdmUgZGltZW5zaW9uXG4gKiBzaXplLiBPcHRpb25hbC5cbiAqIEBwYXJhbSBzZWVkIFVzZWQgdG8gY3JlYXRlIHJhbmRvbSBzZWVkcy4gT3B0aW9uYWwuXG4gKiBAcmV0dXJucyBBIFRlbnNvciBvZiB0aGUgc2FtZSBzaGFwZSBvZiB4LlxuICpcbiAqIEBkb2Mge2hlYWRpbmc6ICdPcGVyYXRpb25zJywgc3ViaGVhZGluZzogJ0Ryb3BvdXQnfVxuICovXG5mdW5jdGlvbiBkcm9wb3V0XyhcbiAgICB4OiBUZW5zb3J8VGVuc29yTGlrZSwgcmF0ZTogbnVtYmVyLCBub2lzZVNoYXBlPzogbnVtYmVyW10sXG4gICAgc2VlZD86IG51bWJlcnxzdHJpbmcpOiBUZW5zb3Ige1xuICBjb25zdCAkeCA9IGNvbnZlcnRUb1RlbnNvcih4LCAneCcsICdkcm9wb3V0Jyk7XG5cbiAgdXRpbC5hc3NlcnQoXG4gICAgICAkeC5kdHlwZSA9PT0gJ2Zsb2F0MzInLFxuICAgICAgKCkgPT4gYHggaGFzIHRvIGJlIGEgZmxvYXRpbmcgcG9pbnQgdGVuc29yIHNpbmNlIGl0J3MgZ29pbmcgdG8gYmUgYCArXG4gICAgICAgICAgYHNjYWxlZCwgYnV0IGdvdCBhICR7JHguZHR5cGV9IHRlbnNvciBpbnN0ZWFkLmApO1xuICB1dGlsLmFzc2VydChcbiAgICAgIHJhdGUgPj0gMCAmJiByYXRlIDwgMSxcbiAgICAgICgpID0+IGByYXRlIG11c3QgYmUgYSBmbG9hdCBpbiB0aGUgcmFuZ2UgWzAsIDEpLCBidXQgZ290ICR7cmF0ZX0uYCk7XG5cbiAgaWYgKHJhdGUgPT09IDApIHtcbiAgICByZXR1cm4geCBpbnN0YW5jZW9mIFRlbnNvciA/ICR4LmNsb25lKCkgOiAkeDtcbiAgfVxuXG4gIGNvbnN0ICRub2lzZVNoYXBlID0gZ2V0Tm9pc2VTaGFwZSgkeCwgbm9pc2VTaGFwZSk7XG4gIGNvbnN0IGtlZXBQcm9iID0gMSAtIHJhdGU7XG4gIGNvbnN0IG11bHRpcGxpZXIgPSBkaXYoXG4gICAgICBmbG9vcihhZGQocmFuZG9tVW5pZm9ybSgkbm9pc2VTaGFwZSwgMCwgMSwgJ2Zsb2F0MzInLCBzZWVkKSwga2VlcFByb2IpKSxcbiAgICAgIGtlZXBQcm9iKTtcblxuICByZXR1cm4gbXVsKCR4LCBtdWx0aXBsaWVyKTtcbn1cblxuZXhwb3J0IGNvbnN0IGRyb3BvdXQgPSBvcCh7ZHJvcG91dF99KTtcbiJdfQ==","/**\n * @license\n * Copyright 2019 Google LLC. All Rights Reserved.\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n * =============================================================================\n */\nimport * as util from '../util';\n/**\n * Normalize noise shape based on provided tensor and noise shape.\n *\n * @param x Tensor.\n * @param noiseShape The shape for the randomly generated keep/drop flags, as\n * an array of numbers. Optional.\n * @returns Normalized noise shape.\n */\nexport function getNoiseShape(x, noiseShape) {\n if (noiseShape == null) {\n return x.shape.slice();\n }\n if (util.arraysEqual(x.shape, noiseShape)) {\n return noiseShape;\n }\n if (x.shape.length === noiseShape.length) {\n const newDimension = [];\n for (let i = 0; i < x.shape.length; i++) {\n if (noiseShape[i] == null && x.shape[i] != null) {\n newDimension.push(x.shape[i]);\n }\n else {\n newDimension.push(noiseShape[i]);\n }\n }\n return newDimension;\n }\n return noiseShape;\n}\n//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZHJvcG91dF91dGlsLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vLi4vdGZqcy1jb3JlL3NyYy9vcHMvZHJvcG91dF91dGlsLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBOzs7Ozs7Ozs7Ozs7Ozs7R0FlRztBQUdILE9BQU8sS0FBSyxJQUFJLE1BQU0sU0FBUyxDQUFDO0FBRWhDOzs7Ozs7O0dBT0c7QUFDSCxNQUFNLFVBQVUsYUFBYSxDQUFDLENBQVMsRUFBRSxVQUFxQjtJQUM1RCxJQUFJLFVBQVUsSUFBSSxJQUFJLEVBQUU7UUFDdEIsT0FBTyxDQUFDLENBQUMsS0FBSyxDQUFDLEtBQUssRUFBRSxDQUFDO0tBQ3hCO0lBQ0QsSUFBSSxJQUFJLENBQUMsV0FBVyxDQUFDLENBQUMsQ0FBQyxLQUFLLEVBQUUsVUFBVSxDQUFDLEVBQUU7UUFDekMsT0FBTyxVQUFVLENBQUM7S0FDbkI7SUFDRCxJQUFJLENBQUMsQ0FBQyxLQUFLLENBQUMsTUFBTSxLQUFLLFVBQVUsQ0FBQyxNQUFNLEVBQUU7UUFDeEMsTUFBTSxZQUFZLEdBQWEsRUFBRSxDQUFDO1FBQ2xDLEtBQUssSUFBSSxDQUFDLEdBQUcsQ0FBQyxFQUFFLENBQUMsR0FBRyxDQUFDLENBQUMsS0FBSyxDQUFDLE1BQU0sRUFBRSxDQUFDLEVBQUUsRUFBRTtZQUN2QyxJQUFJLFVBQVUsQ0FBQyxDQUFDLENBQUMsSUFBSSxJQUFJLElBQUksQ0FBQyxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUMsSUFBSSxJQUFJLEVBQUU7Z0JBQy9DLFlBQVksQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDO2FBQy9CO2lCQUFNO2dCQUNMLFlBQVksQ0FBQyxJQUFJLENBQUMsVUFBVSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUM7YUFDbEM7U0FDRjtRQUNELE9BQU8sWUFBWSxDQUFDO0tBQ3JCO0lBRUQsT0FBTyxVQUFVLENBQUM7QUFDcEIsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbIi8qKlxuICogQGxpY2Vuc2VcbiAqIENvcHlyaWdodCAyMDE5IEdvb2dsZSBMTEMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuXG4gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgXCJMaWNlbnNlXCIpO1xuICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLlxuICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0XG4gKlxuICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wXG4gKlxuICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZVxuICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gXCJBUyBJU1wiIEJBU0lTLFxuICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuXG4gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kXG4gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS5cbiAqID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4gKi9cblxuaW1wb3J0IHtUZW5zb3J9IGZyb20gJy4uL3RlbnNvcic7XG5pbXBvcnQgKiBhcyB1dGlsIGZyb20gJy4uL3V0aWwnO1xuXG4vKipcbiAqIE5vcm1hbGl6ZSBub2lzZSBzaGFwZSBiYXNlZCBvbiBwcm92aWRlZCB0ZW5zb3IgYW5kIG5vaXNlIHNoYXBlLlxuICpcbiAqIEBwYXJhbSB4IFRlbnNvci5cbiAqIEBwYXJhbSBub2lzZVNoYXBlIFRoZSBzaGFwZSBmb3IgdGhlIHJhbmRvbWx5IGdlbmVyYXRlZCBrZWVwL2Ryb3AgZmxhZ3MsIGFzXG4gKiAgIGFuIGFycmF5IG9mIG51bWJlcnMuIE9wdGlvbmFsLlxuICogQHJldHVybnMgTm9ybWFsaXplZCBub2lzZSBzaGFwZS5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGdldE5vaXNlU2hhcGUoeDogVGVuc29yLCBub2lzZVNoYXBlPzogbnVtYmVyW10pOiBudW1iZXJbXSB7XG4gIGlmIChub2lzZVNoYXBlID09IG51bGwpIHtcbiAgICByZXR1cm4geC5zaGFwZS5zbGljZSgpO1xuICB9XG4gIGlmICh1dGlsLmFycmF5c0VxdWFsKHguc2hhcGUsIG5vaXNlU2hhcGUpKSB7XG4gICAgcmV0dXJuIG5vaXNlU2hhcGU7XG4gIH1cbiAgaWYgKHguc2hhcGUubGVuZ3RoID09PSBub2lzZVNoYXBlLmxlbmd0aCkge1xuICAgIGNvbnN0IG5ld0RpbWVuc2lvbjogbnVtYmVyW10gPSBbXTtcbiAgICBmb3IgKGxldCBpID0gMDsgaSA8IHguc2hhcGUubGVuZ3RoOyBpKyspIHtcbiAgICAgIGlmIChub2lzZVNoYXBlW2ldID09IG51bGwgJiYgeC5zaGFwZVtpXSAhPSBudWxsKSB7XG4gICAgICAgIG5ld0RpbWVuc2lvbi5wdXNoKHguc2hhcGVbaV0pO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgbmV3RGltZW5zaW9uLnB1c2gobm9pc2VTaGFwZVtpXSk7XG4gICAgICB9XG4gICAgfVxuICAgIHJldHVybiBuZXdEaW1lbnNpb247XG4gIH1cblxuICByZXR1cm4gbm9pc2VTaGFwZTtcbn1cbiJdfQ==","/**\n * @license\n * Copyright 2019 Google LLC. All Rights Reserved.\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n * =============================================================================\n */\nimport { tensor1d } from './tensor1d';\nexport function enclosingPowerOfTwo(value) {\n // Return 2**N for integer N such that 2**N >= value.\n return Math.floor(Math.pow(2, Math.ceil(Math.log(value) / Math.log(2.0))));\n}\nexport function cosineWindow(windowLength, a, b) {\n const even = 1 - windowLength % 2;\n const newValues = new Float32Array(windowLength);\n for (let i = 0; i < windowLength; ++i) {\n const cosArg = (2.0 * Math.PI * i) / (windowLength + even - 1);\n newValues[i] = a - b * Math.cos(cosArg);\n }\n return tensor1d(newValues, 'float32');\n}\n//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic2lnbmFsX29wc191dGlsLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vLi4vdGZqcy1jb3JlL3NyYy9vcHMvc2lnbmFsX29wc191dGlsLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBOzs7Ozs7Ozs7Ozs7Ozs7R0FlRztBQUdILE9BQU8sRUFBQyxRQUFRLEVBQUMsTUFBTSxZQUFZLENBQUM7QUFFcEMsTUFBTSxVQUFVLG1CQUFtQixDQUFDLEtBQWE7SUFDL0MscURBQXFEO0lBQ3JELE9BQU8sSUFBSSxDQUFDLEtBQUssQ0FBQyxJQUFJLENBQUMsR0FBRyxDQUFDLENBQUMsRUFBRSxJQUFJLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxHQUFHLENBQUMsS0FBSyxDQUFDLEdBQUcsSUFBSSxDQUFDLEdBQUcsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQztBQUM3RSxDQUFDO0FBRUQsTUFBTSxVQUFVLFlBQVksQ0FDeEIsWUFBb0IsRUFBRSxDQUFTLEVBQUUsQ0FBUztJQUM1QyxNQUFNLElBQUksR0FBRyxDQUFDLEdBQUcsWUFBWSxHQUFHLENBQUMsQ0FBQztJQUNsQyxNQUFNLFNBQVMsR0FBRyxJQUFJLFlBQVksQ0FBQyxZQUFZLENBQUMsQ0FBQztJQUNqRCxLQUFLLElBQUksQ0FBQyxHQUFHLENBQUMsRUFBRSxDQUFDLEdBQUcsWUFBWSxFQUFFLEVBQUUsQ0FBQyxFQUFFO1FBQ3JDLE1BQU0sTUFBTSxHQUFHLENBQUMsR0FBRyxHQUFHLElBQUksQ0FBQyxFQUFFLEdBQUcsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxZQUFZLEdBQUcsSUFBSSxHQUFHLENBQUMsQ0FBQyxDQUFDO1FBQy9ELFNBQVMsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLEdBQUcsQ0FBQyxHQUFHLElBQUksQ0FBQyxHQUFHLENBQUMsTUFBTSxDQUFDLENBQUM7S0FDekM7SUFDRCxPQUFPLFFBQVEsQ0FBQyxTQUFTLEVBQUUsU0FBUyxDQUFDLENBQUM7QUFDeEMsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbIi8qKlxuICogQGxpY2Vuc2VcbiAqIENvcHlyaWdodCAyMDE5IEdvb2dsZSBMTEMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuXG4gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgXCJMaWNlbnNlXCIpO1xuICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLlxuICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0XG4gKlxuICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wXG4gKlxuICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZVxuICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gXCJBUyBJU1wiIEJBU0lTLFxuICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuXG4gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kXG4gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS5cbiAqID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4gKi9cblxuaW1wb3J0IHtUZW5zb3IxRH0gZnJvbSAnLi4vdGVuc29yJztcbmltcG9ydCB7dGVuc29yMWR9IGZyb20gJy4vdGVuc29yMWQnO1xuXG5leHBvcnQgZnVuY3Rpb24gZW5jbG9zaW5nUG93ZXJPZlR3byh2YWx1ZTogbnVtYmVyKSB7XG4gIC8vIFJldHVybiAyKipOIGZvciBpbnRlZ2VyIE4gc3VjaCB0aGF0IDIqKk4gPj0gdmFsdWUuXG4gIHJldHVybiBNYXRoLmZsb29yKE1hdGgucG93KDIsIE1hdGguY2VpbChNYXRoLmxvZyh2YWx1ZSkgLyBNYXRoLmxvZygyLjApKSkpO1xufVxuXG5leHBvcnQgZnVuY3Rpb24gY29zaW5lV2luZG93KFxuICAgIHdpbmRvd0xlbmd0aDogbnVtYmVyLCBhOiBudW1iZXIsIGI6IG51bWJlcik6IFRlbnNvcjFEIHtcbiAgY29uc3QgZXZlbiA9IDEgLSB3aW5kb3dMZW5ndGggJSAyO1xuICBjb25zdCBuZXdWYWx1ZXMgPSBuZXcgRmxvYXQzMkFycmF5KHdpbmRvd0xlbmd0aCk7XG4gIGZvciAobGV0IGkgPSAwOyBpIDwgd2luZG93TGVuZ3RoOyArK2kpIHtcbiAgICBjb25zdCBjb3NBcmcgPSAoMi4wICogTWF0aC5QSSAqIGkpIC8gKHdpbmRvd0xlbmd0aCArIGV2ZW4gLSAxKTtcbiAgICBuZXdWYWx1ZXNbaV0gPSBhIC0gYiAqIE1hdGguY29zKGNvc0FyZyk7XG4gIH1cbiAgcmV0dXJuIHRlbnNvcjFkKG5ld1ZhbHVlcywgJ2Zsb2F0MzInKTtcbn1cbiJdfQ==","/**\n * @license\n * Copyright 2019 Google LLC. All Rights Reserved.\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n * =============================================================================\n */\nimport { convertToTensor } from '../tensor_util_env';\nimport { assert, assertShapesMatch, getTypedArrayFromDType } from '../util';\nimport { tensor } from './tensor';\n/**\n * Returns whether the targets are in the top K predictions.\n *\n * ```js\n * const predictions = tf.tensor2d([[20, 10, 40, 30], [30, 50, -20, 10]]);\n * const targets = tf.tensor1d([2, 0]);\n * const precision = await tf.inTopKAsync(predictions, targets);\n * precision.print();\n * ```\n * @param predictions 2-D or higher `tf.Tensor` with last dimension being\n * at least `k`.\n * @param targets 1-D or higher `tf.Tensor`.\n * @param k Optional Number of top elements to look at for computing precision,\n * default to 1.\n *\n * @doc {heading: 'Operations', subheading: 'Evaluation'}\n */\nasync function inTopKAsync_(predictions, targets, k = 1) {\n const $predictions = convertToTensor(predictions, 'predictions', 'inTopK');\n const $targets = convertToTensor(targets, 'targets', 'inTopK');\n assert($predictions.rank > 1, () => 'inTopK() expects the predictions to be of rank 2 or higher, ' +\n `but got ${$predictions.rank}`);\n assert($predictions.rank - 1 === $targets.rank, () => `predictions rank should be 1 larger than ` +\n `targets rank, but got predictions rank ` +\n `${$predictions.rank} and targets rank ${$targets.rank}`);\n assertShapesMatch($predictions.shape.slice(0, $predictions.shape.length - 1), $targets.shape, `predictions's shape should be align with the targets' shape, ` +\n 'except the last dimension.');\n const lastDim = $predictions.shape[$predictions.shape.length - 1];\n assert(k > 0 && k <= lastDim, () => `'k' passed to inTopK() must be > 0 && <= the predictions last ` +\n `dimension (${lastDim}), but got ${k}`);\n const predictionsVals = await $predictions.data();\n const targetsVals = await $targets.data();\n // Reshape predictionsVals into a 2d tensor [batch, lastDim]\n // and look up topK along lastDim.\n const [batch, size] = [predictionsVals.length / lastDim, lastDim];\n const precision = getTypedArrayFromDType('bool', batch);\n for (let b = 0; b < batch; b++) {\n const offset = b * size;\n const vals = predictionsVals.subarray(offset, offset + size);\n const valAndInd = [];\n for (let i = 0; i < vals.length; i++) {\n valAndInd.push({ value: vals[i], index: i });\n }\n valAndInd.sort((a, b) => b.value - a.value);\n precision[b] = 0;\n for (let i = 0; i < k; i++) {\n if (valAndInd[i].index === targetsVals[b]) {\n precision[b] = 1;\n break;\n }\n }\n }\n if (predictions !== $predictions) {\n $predictions.dispose();\n }\n if (targets !== $targets) {\n $targets.dispose();\n }\n // Output precision has the same shape as targets.\n return tensor(precision, $targets.shape, 'bool');\n}\nexport const inTopKAsync = inTopKAsync_;\n//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW5fdG9wX2suanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi8uLi90ZmpzLWNvcmUvc3JjL29wcy9pbl90b3Bfay50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQTs7Ozs7Ozs7Ozs7Ozs7O0dBZUc7QUFHSCxPQUFPLEVBQUMsZUFBZSxFQUFDLE1BQU0sb0JBQW9CLENBQUM7QUFFbkQsT0FBTyxFQUFDLE1BQU0sRUFBRSxpQkFBaUIsRUFBRSxzQkFBc0IsRUFBQyxNQUFNLFNBQVMsQ0FBQztBQUMxRSxPQUFPLEVBQUMsTUFBTSxFQUFDLE1BQU0sVUFBVSxDQUFDO0FBRWhDOzs7Ozs7Ozs7Ozs7Ozs7O0dBZ0JHO0FBQ0gsS0FBSyxVQUFVLFlBQVksQ0FDdkIsV0FBeUIsRUFBRSxPQUFxQixFQUFFLENBQUMsR0FBRyxDQUFDO0lBQ3pELE1BQU0sWUFBWSxHQUFHLGVBQWUsQ0FBQyxXQUFXLEVBQUUsYUFBYSxFQUFFLFFBQVEsQ0FBQyxDQUFDO0lBQzNFLE1BQU0sUUFBUSxHQUFHLGVBQWUsQ0FBQyxPQUFPLEVBQUUsU0FBUyxFQUFFLFFBQVEsQ0FBQyxDQUFDO0lBRS9ELE1BQU0sQ0FDRixZQUFZLENBQUMsSUFBSSxHQUFHLENBQUMsRUFDckIsR0FBRyxFQUFFLENBQUMsOERBQThEO1FBQ2hFLFdBQVcsWUFBWSxDQUFDLElBQUksRUFBRSxDQUFDLENBQUM7SUFDeEMsTUFBTSxDQUNGLFlBQVksQ0FBQyxJQUFJLEdBQUcsQ0FBQyxLQUFLLFFBQVEsQ0FBQyxJQUFJLEVBQ3ZDLEdBQUcsRUFBRSxDQUFDLDJDQUEyQztRQUM3Qyx5Q0FBeUM7UUFDekMsR0FBRyxZQUFZLENBQUMsSUFBSSxxQkFBcUIsUUFBUSxDQUFDLElBQUksRUFBRSxDQUFDLENBQUM7SUFDbEUsaUJBQWlCLENBQ2IsWUFBWSxDQUFDLEtBQUssQ0FBQyxLQUFLLENBQUMsQ0FBQyxFQUFFLFlBQVksQ0FBQyxLQUFLLENBQUMsTUFBTSxHQUFHLENBQUMsQ0FBQyxFQUMxRCxRQUFRLENBQUMsS0FBSyxFQUNkLCtEQUErRDtRQUMzRCw0QkFBNEIsQ0FBQyxDQUFDO0lBQ3RDLE1BQU0sT0FBTyxHQUFHLFlBQVksQ0FBQyxLQUFLLENBQUMsWUFBWSxDQUFDLEtBQUssQ0FBQyxNQUFNLEdBQUcsQ0FBQyxDQUFDLENBQUM7SUFDbEUsTUFBTSxDQUNGLENBQUMsR0FBRyxDQUFDLElBQUksQ0FBQyxJQUFJLE9BQU8sRUFDckIsR0FBRyxFQUFFLENBQUMsZ0VBQWdFO1FBQ2xFLGNBQWMsT0FBTyxjQUFjLENBQUMsRUFBRSxDQUFDLENBQUM7SUFFaEQsTUFBTSxlQUFlLEdBQUcsTUFBTSxZQUFZLENBQUMsSUFBSSxFQUFFLENBQUM7SUFDbEQsTUFBTSxXQUFXLEdBQUcsTUFBTSxRQUFRLENBQUMsSUFBSSxFQUFFLENBQUM7SUFFMUMsNERBQTREO0lBQzVELGtDQUFrQztJQUNsQyxNQUFNLENBQUMsS0FBSyxFQUFFLElBQUksQ0FBQyxHQUFHLENBQUMsZUFBZSxDQUFDLE1BQU0sR0FBRyxPQUFPLEVBQUUsT0FBTyxDQUFDLENBQUM7SUFDbEUsTUFBTSxTQUFTLEdBQUcsc0JBQXNCLENBQUMsTUFBTSxFQUFFLEtBQUssQ0FBQyxDQUFDO0lBRXhELEtBQUssSUFBSSxDQUFDLEdBQUcsQ0FBQyxFQUFFLENBQUMsR0FBRyxLQUFLLEVBQUUsQ0FBQyxFQUFFLEVBQUU7UUFDOUIsTUFBTSxNQUFNLEdBQUcsQ0FBQyxHQUFHLElBQUksQ0FBQztRQUN4QixNQUFNLElBQUksR0FBRyxlQUFlLENBQUMsUUFBUSxDQUFDLE1BQU0sRUFBRSxNQUFNLEdBQUcsSUFBSSxDQUFDLENBQUM7UUFDN0QsTUFBTSxTQUFTLEdBQTBDLEVBQUUsQ0FBQztRQUM1RCxLQUFLLElBQUksQ0FBQyxHQUFHLENBQUMsRUFBRSxDQUFDLEdBQUcsSUFBSSxDQUFDLE1BQU0sRUFBRSxDQUFDLEVBQUUsRUFBRTtZQUNwQyxTQUFTLENBQUMsSUFBSSxDQUFDLEVBQUMsS0FBSyxFQUFFLElBQUksQ0FBQyxDQUFDLENBQUMsRUFBRSxLQUFLLEVBQUUsQ0FBQyxFQUFDLENBQUMsQ0FBQztTQUM1QztRQUNELFNBQVMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxFQUFFLEVBQUUsQ0FBQyxDQUFDLENBQUMsS0FBSyxHQUFHLENBQUMsQ0FBQyxLQUFLLENBQUMsQ0FBQztRQUU1QyxTQUFTLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDO1FBQ2pCLEtBQUssSUFBSSxDQUFDLEdBQUcsQ0FBQyxFQUFFLENBQUMsR0FBRyxDQUFDLEVBQUUsQ0FBQyxFQUFFLEVBQUU7WUFDMUIsSUFBSSxTQUFTLENBQUMsQ0FBQyxDQUFDLENBQUMsS0FBSyxLQUFLLFdBQVcsQ0FBQyxDQUFDLENBQUMsRUFBRTtnQkFDekMsU0FBUyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQztnQkFDakIsTUFBTTthQUNQO1NBQ0Y7S0FDRjtJQUVELElBQUksV0FBVyxLQUFLLFlBQVksRUFBRTtRQUNoQyxZQUFZLENBQUMsT0FBTyxFQUFFLENBQUM7S0FDeEI7SUFDRCxJQUFJLE9BQU8sS0FBSyxRQUFRLEVBQUU7UUFDeEIsUUFBUSxDQUFDLE9BQU8sRUFBRSxDQUFDO0tBQ3BCO0lBRUQsa0RBQWtEO0lBQ2xELE9BQU8sTUFBTSxDQUFDLFNBQVMsRUFBRSxRQUFRLENBQUMsS0FBSyxFQUFFLE1BQU0sQ0FBTSxDQUFDO0FBQ3hELENBQUM7QUFFRCxNQUFNLENBQUMsTUFBTSxXQUFXLEdBQUcsWUFBWSxDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiLyoqXG4gKiBAbGljZW5zZVxuICogQ29weXJpZ2h0IDIwMTkgR29vZ2xlIExMQy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC5cbiAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSBcIkxpY2Vuc2VcIik7XG4gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuXG4gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXRcbiAqXG4gKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjBcbiAqXG4gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlXG4gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiBcIkFTIElTXCIgQkFTSVMsXG4gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC5cbiAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmRcbiAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLlxuICogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbiAqL1xuXG5pbXBvcnQge1RlbnNvcn0gZnJvbSAnLi4vdGVuc29yJztcbmltcG9ydCB7Y29udmVydFRvVGVuc29yfSBmcm9tICcuLi90ZW5zb3JfdXRpbF9lbnYnO1xuaW1wb3J0IHtUZW5zb3JMaWtlfSBmcm9tICcuLi90eXBlcyc7XG5pbXBvcnQge2Fzc2VydCwgYXNzZXJ0U2hhcGVzTWF0Y2gsIGdldFR5cGVkQXJyYXlGcm9tRFR5cGV9IGZyb20gJy4uL3V0aWwnO1xuaW1wb3J0IHt0ZW5zb3J9IGZyb20gJy4vdGVuc29yJztcblxuLyoqXG4gKiBSZXR1cm5zIHdoZXRoZXIgdGhlIHRhcmdldHMgYXJlIGluIHRoZSB0b3AgSyBwcmVkaWN0aW9ucy5cbiAqXG4gKiBgYGBqc1xuICogY29uc3QgcHJlZGljdGlvbnMgPSB0Zi50ZW5zb3IyZChbWzIwLCAxMCwgNDAsIDMwXSwgWzMwLCA1MCwgLTIwLCAxMF1dKTtcbiAqIGNvbnN0IHRhcmdldHMgPSB0Zi50ZW5zb3IxZChbMiwgMF0pO1xuICogY29uc3QgcHJlY2lzaW9uID0gYXdhaXQgdGYuaW5Ub3BLQXN5bmMocHJlZGljdGlvbnMsIHRhcmdldHMpO1xuICogcHJlY2lzaW9uLnByaW50KCk7XG4gKiBgYGBcbiAqIEBwYXJhbSBwcmVkaWN0aW9ucyAyLUQgb3IgaGlnaGVyIGB0Zi5UZW5zb3JgIHdpdGggbGFzdCBkaW1lbnNpb24gYmVpbmdcbiAqICAgICBhdCBsZWFzdCBga2AuXG4gKiBAcGFyYW0gdGFyZ2V0cyAxLUQgb3IgaGlnaGVyIGB0Zi5UZW5zb3JgLlxuICogQHBhcmFtIGsgT3B0aW9uYWwgTnVtYmVyIG9mIHRvcCBlbGVtZW50cyB0byBsb29rIGF0IGZvciBjb21wdXRpbmcgcHJlY2lzaW9uLFxuICogICAgIGRlZmF1bHQgdG8gMS5cbiAqXG4gKiBAZG9jIHtoZWFkaW5nOiAnT3BlcmF0aW9ucycsIHN1YmhlYWRpbmc6ICdFdmFsdWF0aW9uJ31cbiAqL1xuYXN5bmMgZnVuY3Rpb24gaW5Ub3BLQXN5bmNfPFQgZXh0ZW5kcyBUZW5zb3IsIFUgZXh0ZW5kcyBUZW5zb3I+KFxuICAgIHByZWRpY3Rpb25zOiBUfFRlbnNvckxpa2UsIHRhcmdldHM6IFV8VGVuc29yTGlrZSwgayA9IDEpOiBQcm9taXNlPFU+IHtcbiAgY29uc3QgJHByZWRpY3Rpb25zID0gY29udmVydFRvVGVuc29yKHByZWRpY3Rpb25zLCAncHJlZGljdGlvbnMnLCAnaW5Ub3BLJyk7XG4gIGNvbnN0ICR0YXJnZXRzID0gY29udmVydFRvVGVuc29yKHRhcmdldHMsICd0YXJnZXRzJywgJ2luVG9wSycpO1xuXG4gIGFzc2VydChcbiAgICAgICRwcmVkaWN0aW9ucy5yYW5rID4gMSxcbiAgICAgICgpID0+ICdpblRvcEsoKSBleHBlY3RzIHRoZSBwcmVkaWN0aW9ucyB0byBiZSBvZiByYW5rIDIgb3IgaGlnaGVyLCAnICtcbiAgICAgICAgICBgYnV0IGdvdCAkeyRwcmVkaWN0aW9ucy5yYW5rfWApO1xuICBhc3NlcnQoXG4gICAgICAkcHJlZGljdGlvbnMucmFuayAtIDEgPT09ICR0YXJnZXRzLnJhbmssXG4gICAgICAoKSA9PiBgcHJlZGljdGlvbnMgcmFuayBzaG91bGQgYmUgMSBsYXJnZXIgdGhhbiBgICtcbiAgICAgICAgICBgdGFyZ2V0cyByYW5rLCBidXQgZ290IHByZWRpY3Rpb25zIHJhbmsgYCArXG4gICAgICAgICAgYCR7JHByZWRpY3Rpb25zLnJhbmt9IGFuZCB0YXJnZXRzIHJhbmsgJHskdGFyZ2V0cy5yYW5rfWApO1xuICBhc3NlcnRTaGFwZXNNYXRjaChcbiAgICAgICRwcmVkaWN0aW9ucy5zaGFwZS5zbGljZSgwLCAkcHJlZGljdGlvbnMuc2hhcGUubGVuZ3RoIC0gMSksXG4gICAgICAkdGFyZ2V0cy5zaGFwZSxcbiAgICAgIGBwcmVkaWN0aW9ucydzIHNoYXBlIHNob3VsZCBiZSBhbGlnbiB3aXRoIHRoZSB0YXJnZXRzJyBzaGFwZSwgYCArXG4gICAgICAgICAgJ2V4Y2VwdCB0aGUgbGFzdCBkaW1lbnNpb24uJyk7XG4gIGNvbnN0IGxhc3REaW0gPSAkcHJlZGljdGlvbnMuc2hhcGVbJHByZWRpY3Rpb25zLnNoYXBlLmxlbmd0aCAtIDFdO1xuICBhc3NlcnQoXG4gICAgICBrID4gMCAmJiBrIDw9IGxhc3REaW0sXG4gICAgICAoKSA9PiBgJ2snIHBhc3NlZCB0byBpblRvcEsoKSBtdXN0IGJlID4gMCAmJiA8PSB0aGUgcHJlZGljdGlvbnMgbGFzdCBgICtcbiAgICAgICAgICBgZGltZW5zaW9uICgke2xhc3REaW19KSwgYnV0IGdvdCAke2t9YCk7XG5cbiAgY29uc3QgcHJlZGljdGlvbnNWYWxzID0gYXdhaXQgJHByZWRpY3Rpb25zLmRhdGEoKTtcbiAgY29uc3QgdGFyZ2V0c1ZhbHMgPSBhd2FpdCAkdGFyZ2V0cy5kYXRhKCk7XG5cbiAgLy8gUmVzaGFwZSBwcmVkaWN0aW9uc1ZhbHMgaW50byBhIDJkIHRlbnNvciBbYmF0Y2gsIGxhc3REaW1dXG4gIC8vIGFuZCBsb29rIHVwIHRvcEsgYWxvbmcgbGFzdERpbS5cbiAgY29uc3QgW2JhdGNoLCBzaXplXSA9IFtwcmVkaWN0aW9uc1ZhbHMubGVuZ3RoIC8gbGFzdERpbSwgbGFzdERpbV07XG4gIGNvbnN0IHByZWNpc2lvbiA9IGdldFR5cGVkQXJyYXlGcm9tRFR5cGUoJ2Jvb2wnLCBiYXRjaCk7XG5cbiAgZm9yIChsZXQgYiA9IDA7IGIgPCBiYXRjaDsgYisrKSB7XG4gICAgY29uc3Qgb2Zmc2V0ID0gYiAqIHNpemU7XG4gICAgY29uc3QgdmFscyA9IHByZWRpY3Rpb25zVmFscy5zdWJhcnJheShvZmZzZXQsIG9mZnNldCArIHNpemUpO1xuICAgIGNvbnN0IHZhbEFuZEluZDogQXJyYXk8e3ZhbHVlOiBudW1iZXIsIGluZGV4OiBudW1iZXJ9PiA9IFtdO1xuICAgIGZvciAobGV0IGkgPSAwOyBpIDwgdmFscy5sZW5ndGg7IGkrKykge1xuICAgICAgdmFsQW5kSW5kLnB1c2goe3ZhbHVlOiB2YWxzW2ldLCBpbmRleDogaX0pO1xuICAgIH1cbiAgICB2YWxBbmRJbmQuc29ydCgoYSwgYikgPT4gYi52YWx1ZSAtIGEudmFsdWUpO1xuXG4gICAgcHJlY2lzaW9uW2JdID0gMDtcbiAgICBmb3IgKGxldCBpID0gMDsgaSA8IGs7IGkrKykge1xuICAgICAgaWYgKHZhbEFuZEluZFtpXS5pbmRleCA9PT0gdGFyZ2V0c1ZhbHNbYl0pIHtcbiAgICAgICAgcHJlY2lzaW9uW2JdID0gMTtcbiAgICAgICAgYnJlYWs7XG4gICAgICB9XG4gICAgfVxuICB9XG5cbiAgaWYgKHByZWRpY3Rpb25zICE9PSAkcHJlZGljdGlvbnMpIHtcbiAgICAkcHJlZGljdGlvbnMuZGlzcG9zZSgpO1xuICB9XG4gIGlmICh0YXJnZXRzICE9PSAkdGFyZ2V0cykge1xuICAgICR0YXJnZXRzLmRpc3Bvc2UoKTtcbiAgfVxuXG4gIC8vIE91dHB1dCBwcmVjaXNpb24gaGFzIHRoZSBzYW1lIHNoYXBlIGFzIHRhcmdldHMuXG4gIHJldHVybiB0ZW5zb3IocHJlY2lzaW9uLCAkdGFyZ2V0cy5zaGFwZSwgJ2Jvb2wnKSBhcyBVO1xufVxuXG5leHBvcnQgY29uc3QgaW5Ub3BLQXN5bmMgPSBpblRvcEtBc3luY187XG4iXX0=","/**\n * @license\n * Copyright 2019 Google LLC. All Rights Reserved.\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n * =============================================================================\n */\nimport { ENGINE } from '../../engine';\nimport { customGrad } from '../../gradients';\nimport { FusedConv2D } from '../../kernel_names';\nimport { makeTypesMatch } from '../../tensor_util';\nimport { convertToTensor } from '../../tensor_util_env';\nimport * as util from '../../util';\nimport { add } from '../add';\nimport * as broadcast_util from '../broadcast_util';\nimport { conv2d as unfusedConv2d } from '../conv2d';\nimport { conv2DBackpropFilter } from '../conv2d_backprop_filter';\nimport { conv2DBackpropInput } from '../conv2d_backprop_input';\nimport * as conv_util from '../conv_util';\nimport { applyActivation, getFusedBiasGradient, getFusedDyActivation, shouldFuse } from '../fused_util';\nimport { op } from '../operation';\nimport { reshape } from '../reshape';\n/**\n * Computes a 2D convolution over the input x, optionally fused with adding a\n * bias and applying an activation.\n *\n * ```js\n * const inputDepth = 2;\n * const inShape = [2, 2, 2, inputDepth];\n * const outputDepth = 2;\n * const fSize = 1;\n * const pad = 0;\n * const strides = 1;\n *\n * const x = tf.tensor4d( [1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15,\n * 16], inShape);\n * const w = tf.tensor4d([-1, 1, -2, 0.5], [fSize, fSize, inputDepth,\n * outputDepth]);\n *\n * tf.fused.conv2d({ x, filter: w, strides, pad, dataFormat: 'NHWC',\n * dilations: [1, 1], bias: tf.scalar(5), activation: 'relu' }).print();\n * ```\n *\n * @param obj An object with the following properties:\n * @param x The input tensor, of rank 4 or rank 3, of shape\n * `[batch, height, width, inChannels]`. If rank 3, batch of 1 is\n * assumed.\n * @param filter The filter, rank 4, of shape\n * `[filterHeight, filterWidth, inDepth, outDepth]`.\n * @param strides The strides of the convolution: `[strideHeight,\n * strideWidth]`.\n * @param pad The type of padding algorithm.\n * - `same` and stride 1: output will be of same size as input,\n * regardless of filter size.\n * - `valid` output will be smaller than input if filter is larger\n * than 1x1.\n * - For more info, see this guide:\n * [https://www.tensorflow.org/api_docs/python/tf/nn/convolution](\n * https://www.tensorflow.org/api_docs/python/tf/nn/convolution)\n * @param dataFormat An optional string from: \"NHWC\", \"NCHW\". Defaults to\n * \"NHWC\". Specify the data format of the input and output data. With the\n * default format \"NHWC\", the data is stored in the order of: [batch,\n * height, width, channels]. Only \"NHWC\" is currently supported.\n * @param dilations The dilation rates: `[dilationHeight, dilationWidth]`\n * in which we sample input values across the height and width dimensions\n * in atrous convolution. Defaults to `[1, 1]`. If `dilations` is a single\n * number, then `dilationHeight == dilationWidth`. If it is greater than\n * 1, then all values of `strides` must be 1.\n * @param dimRoundingMode A string from: 'ceil', 'round', 'floor'. If none is\n * provided, it will default to truncate.\n * @param bias Tensor to be added to the result.\n * @param activation Name of activation kernel (defaults to `linear`) to be\n * applied\n * after biasAdd.\n * @param preluActivationWeights Tensor of prelu weights to be applied as part\n * of a `prelu` activation, typically the same shape as `x`.\n * @param leakyreluAlpha Optional. Alpha to be applied as part of a `leakyrelu`\n * activation.\n */\nfunction fusedConv2d_({ x, filter, strides, pad, dataFormat = 'NHWC', dilations = [1, 1], dimRoundingMode, bias, activation = 'linear', preluActivationWeights, leakyreluAlpha }) {\n activation = activation || 'linear';\n if (shouldFuse(ENGINE.state.gradientDepth, activation) === false) {\n // TODO: Transpose bias and preluActivationWeights properly for NCHW\n // format before computation.\n util.assert(dataFormat === 'NHWC', () => `Error in fused conv2d: got dataFormat of ${dataFormat} but ` +\n `only NHWC is currently supported for the case of gradient depth ` +\n `is 0 and the activation is not linear.`);\n let result = unfusedConv2d(x, filter, strides, pad, dataFormat, dilations, dimRoundingMode);\n if (bias != null) {\n result = add(result, bias);\n }\n return applyActivation(result, activation, preluActivationWeights, leakyreluAlpha);\n }\n const $x = convertToTensor(x, 'x', 'conv2d', 'float32');\n const $filter = convertToTensor(filter, 'filter', 'conv2d', 'float32');\n let x4D = $x;\n let reshapedTo4D = false;\n if ($x.rank === 3) {\n reshapedTo4D = true;\n x4D = reshape($x, [1, $x.shape[0], $x.shape[1], $x.shape[2]]);\n }\n util.assert(x4D.rank === 4, () => `Error in fused conv2d: input must be rank 4, but got rank ` +\n `${x4D.rank}.`);\n util.assert($filter.rank === 4, () => `Error in fused conv2d: filter must be rank 4, but got rank ` +\n `${$filter.rank}.`);\n conv_util.checkPadOnDimRoundingMode('fused conv2d', pad, dimRoundingMode);\n const inputChannels = dataFormat === 'NHWC' ? x4D.shape[3] : x4D.shape[1];\n util.assert($filter.shape[2] === inputChannels, () => `Error in conv2d: depth of input (${inputChannels}) must match ` +\n `input depth for filter ${$filter.shape[2]}.`);\n util.assert(conv_util.eitherStridesOrDilationsAreOne(strides, dilations), () => 'Error in conv2D: Either strides or dilations must be 1. ' +\n `Got strides ${strides} and dilations '${dilations}'`);\n const convInfo = conv_util.computeConv2DInfo(x4D.shape, $filter.shape, strides, dilations, pad, dimRoundingMode);\n let $bias;\n if (bias != null) {\n $bias = convertToTensor(bias, 'bias', 'fused conv2d');\n [$bias] = makeTypesMatch($bias, $x);\n // According to TensorFlow, the bias is supposed be a 1-D tensor or a\n // scalar.\n //\n // 3-D or 4-D bias is not disabled for NHWC format, because they are\n // currently being used in some cases. For examplem in our code base,\n // https://github.com/tensorflow/tfjs/blob/b53bd47e880367ae57493f0ea628abaf08db2d5d/tfjs-core/src/ops/fused/fused_conv2d_test.ts#L1972.\n if (dataFormat === 'NHWC') {\n broadcast_util.assertAndGetBroadcastShape(convInfo.outShape, $bias.shape);\n }\n else {\n util.assert($bias.shape.length <= 1, () => `Error in fused conv2d: only supports scalar or 1-D Tensor ` +\n `bias for NCHW format but got the bias of ` +\n `rank-${$bias.shape.length}.`);\n util.assert($bias.shape.length === 0 || $bias.shape[0] === convInfo.outChannels ||\n $bias.shape[0] === 1, () => `Error in fused conv2d: bias shape (${$bias.shape}) is not ` +\n `compatible with the number of output channels ` +\n `(${convInfo.outChannels})`);\n }\n }\n let $preluActivationWeights;\n if (preluActivationWeights != null) {\n // PReLU's activation weights could be a scalar, a 1-D tensor or a 3-D\n // tensor.\n const alphaShape = preluActivationWeights.shape;\n util.assert(alphaShape.length <= 1 || alphaShape.length === 3, () => `Error in fused conv2d: only supports scalar, 1-D Tensor or ` +\n `3-D Tensor PReLU activation weights but got a tensor of ` +\n `rank-${alphaShape.length}.`);\n if (alphaShape.length === 1) {\n // Whether the data format is NCHW or NHWC, the 1-D PReLU activation\n // weights tensor should be aligned with the output channels of conv2d\n // result.\n util.assert(alphaShape[0] === 1 || alphaShape[0] === convInfo.outChannels, () => `Error in fused conv2d: PReLU activation weights ` +\n `(${alphaShape}) is not compatible with the number of output ` +\n `channels (${convInfo.outChannels}).`);\n }\n else if (alphaShape.length === 3) {\n // Whether the data format is NCHW or NHWC, the PReLU activation weights\n // tensor should has the compatible shape with the result of conv2d.\n try {\n broadcast_util.assertAndGetBroadcastShape(alphaShape, convInfo.outShape);\n }\n catch (e) {\n const errMsg = `Error in fused conv2d: PReLU activation weights (${alphaShape}) ` +\n `is not compatible with the output shape of the conv2d ` +\n `(${convInfo.outShape}).`;\n throw Error(errMsg);\n }\n }\n $preluActivationWeights = convertToTensor(preluActivationWeights, 'prelu weights', 'fused conv2d');\n }\n const grad = (dy, saved) => {\n util.assert(dataFormat === 'NHWC', () => `Error in gradient of fused conv2D: got dataFormat of ${dataFormat} but only NHWC is currently supported.`);\n const [$filter, x4D, y, $bias] = saved;\n const dyActivation = getFusedDyActivation(dy, y, activation);\n util.assert(conv_util.tupleValuesAreOne(dilations), () => 'Error in gradient of fused conv2D: ' +\n `dilation rates greater than 1 ` +\n `are not yet supported in gradients. Got dilations '${dilations}'`);\n const xDer = conv2DBackpropInput(x4D.shape, dyActivation, $filter, strides, pad);\n const filterDer = conv2DBackpropFilter(x4D, dyActivation, $filter.shape, strides, pad);\n const der = [xDer, filterDer];\n if ($bias != null) {\n const biasDer = getFusedBiasGradient($bias, dyActivation);\n der.push(biasDer);\n }\n return der;\n };\n const inputs = {\n x: x4D,\n filter: $filter,\n bias: $bias,\n preluActivationWeights: $preluActivationWeights\n };\n const attrs = {\n strides,\n pad,\n dataFormat,\n dilations,\n dimRoundingMode,\n activation,\n leakyreluAlpha\n };\n // Depending on the the params passed in we will have different number of\n // inputs and thus a a different number of elements in the gradient.\n if (bias == null) {\n const customOp = customGrad((x4D, filter, save) => {\n let res = \n // tslint:disable-next-line: no-unnecessary-type-assertion\n ENGINE.runKernel(FusedConv2D, inputs, attrs);\n save([filter, x4D, res]);\n if (reshapedTo4D) {\n // tslint:disable-next-line: no-unnecessary-type-assertion\n res = reshape(res, [res.shape[1], res.shape[2], res.shape[3]]);\n }\n return { value: res, gradFunc: grad };\n });\n return customOp(x4D, $filter);\n }\n else {\n const customOpWithBias = customGrad((x4D, filter, bias, save) => {\n let res = ENGINE.runKernel(FusedConv2D, inputs, attrs);\n save([filter, x4D, res, bias]);\n if (reshapedTo4D) {\n // tslint:disable-next-line: no-unnecessary-type-assertion\n res = reshape(res, [res.shape[1], res.shape[2], res.shape[3]]);\n }\n return { value: res, gradFunc: grad };\n });\n return customOpWithBias(x4D, $filter, $bias);\n }\n}\nexport const conv2d = op({ fusedConv2d_ });\n//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY29udjJkLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vLi4vLi4vdGZqcy1jb3JlL3NyYy9vcHMvZnVzZWQvY29udjJkLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBOzs7Ozs7Ozs7Ozs7Ozs7R0FlRztBQUVILE9BQU8sRUFBQyxNQUFNLEVBQUMsTUFBTSxjQUFjLENBQUM7QUFDcEMsT0FBTyxFQUFDLFVBQVUsRUFBQyxNQUFNLGlCQUFpQixDQUFDO0FBQzNDLE9BQU8sRUFBQyxXQUFXLEVBQXNDLE1BQU0sb0JBQW9CLENBQUM7QUFJcEYsT0FBTyxFQUFDLGNBQWMsRUFBQyxNQUFNLG1CQUFtQixDQUFDO0FBQ2pELE9BQU8sRUFBQyxlQUFlLEVBQUMsTUFBTSx1QkFBdUIsQ0FBQztBQUV0RCxPQUFPLEtBQUssSUFBSSxNQUFNLFlBQVksQ0FBQztBQUNuQyxPQUFPLEVBQUMsR0FBRyxFQUFDLE1BQU0sUUFBUSxDQUFDO0FBQzNCLE9BQU8sS0FBSyxjQUFjLE1BQU0sbUJBQW1CLENBQUM7QUFDcEQsT0FBTyxFQUFDLE1BQU0sSUFBSSxhQUFhLEVBQUMsTUFBTSxXQUFXLENBQUM7QUFDbEQsT0FBTyxFQUFDLG9CQUFvQixFQUFDLE1BQU0sMkJBQTJCLENBQUM7QUFDL0QsT0FBTyxFQUFDLG1CQUFtQixFQUFDLE1BQU0sMEJBQTBCLENBQUM7QUFDN0QsT0FBTyxLQUFLLFNBQVMsTUFBTSxjQUFjLENBQUM7QUFFMUMsT0FBTyxFQUFDLGVBQWUsRUFBRSxvQkFBb0IsRUFBRSxvQkFBb0IsRUFBRSxVQUFVLEVBQUMsTUFBTSxlQUFlLENBQUM7QUFDdEcsT0FBTyxFQUFDLEVBQUUsRUFBQyxNQUFNLGNBQWMsQ0FBQztBQUNoQyxPQUFPLEVBQUMsT0FBTyxFQUFDLE1BQU0sWUFBWSxDQUFDO0FBRW5DOzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7OztHQXdERztBQUNILFNB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LENBQUM7S0FDcEM7U0FBTTtRQUNMLE1BQU0sZ0JBQWdCLEdBQUcsVUFBVSxDQUMvQixDQUFDLEdBQWEsRUFBRSxNQUFnQixFQUFFLElBQVksRUFBRSxJQUFrQixFQUFFLEVBQUU7WUFDcEUsSUFBSSxHQUFHLEdBQXNCLE1BQU0sQ0FBQyxTQUFTLENBQ3pDLFdBQVcsRUFBRSxNQUE4QixFQUMzQyxLQUEyQixDQUFDLENBQUM7WUFFakMsSUFBSSxDQUFDLENBQUMsTUFBTSxFQUFFLEdBQUcsRUFBRSxHQUFHLEVBQUUsSUFBSSxDQUFDLENBQUMsQ0FBQztZQUUvQixJQUFJLFlBQVksRUFBRTtnQkFDaEIsMERBQTBEO2dCQUMxRCxHQUFHLEdBQUcsT0FBTyxDQUFDLEdBQUcsRUFBRSxDQUFDLEdBQUcsQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDLEVBQUUsR0FBRyxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUMsRUFBRSxHQUFHLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQ2pELENBQUM7YUFDZDtZQUVELE9BQU8sRUFBQyxLQUFLLEVBQUUsR0FBRyxFQUFFLFFBQVEsRUFBRSxJQUFJLEVBQUMsQ0FBQztRQUN0QyxDQUFDLENBQUMsQ0FBQztRQUVQLE9BQU8sZ0JBQWdCLENBQUMsR0FBRyxFQUFFLE9BQU8sRUFBRSxLQUFLLENBQU0sQ0FBQztLQUNuRDtBQUNILENBQUM7QUFDRCxNQUFNLENBQUMsTUFBTSxNQUFNLEdBQUcsRUFBRSxDQUFDLEVBQUMsWUFBWSxFQUFDLENBQUMsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbIi8qKlxuICogQGxpY2Vuc2VcbiAqIENvcHlyaWdodCAyMDE5IEdvb2dsZSBMTEMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuXG4gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgXCJMaWNlbnNlXCIpO1xuICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLlxuICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0XG4gKlxuICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wXG4gKlxuICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZVxuICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gXCJBUyBJU1wiIEJBU0lTLFxuICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuXG4gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kXG4gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS5cbiAqID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4gKi9cblxuaW1wb3J0IHtFTkdJTkV9IGZyb20gJy4uLy4uL2VuZ2luZSc7XG5pbXBvcnQge2N1c3RvbUdyYWR9IGZyb20gJy4uLy4uL2dyYWRpZW50cyc7XG5pbXBvcnQge0Z1c2VkQ29udjJELCBGdXNlZENvbnYyREF0dHJzLCBGdXNlZENvbnYyRElucHV0c30gZnJvbSAnLi4vLi4va2VybmVsX25hbWVzJztcbmltcG9ydCB7TmFtZWRBdHRyTWFwfSBmcm9tICcuLi8uLi9rZXJuZWxfcmVnaXN0cnknO1xuaW1wb3J0IHtUZW5zb3IsIFRlbnNvcjNELCBUZW5zb3I0RH0gZnJvbSAnLi4vLi4vdGVuc29yJztcbmltcG9ydCB7R3JhZFNhdmVGdW5jLCBOYW1lZFRlbnNvck1hcH0gZnJvbSAnLi4vLi4vdGVuc29yX3R5cGVzJztcbmltcG9ydCB7bWFrZVR5cGVzTWF0Y2h9IGZyb20gJy4uLy4uL3RlbnNvcl91dGlsJztcbmltcG9ydCB7Y29udmVydFRvVGVuc29yfSBmcm9tICcuLi8uLi90ZW5zb3JfdXRpbF9lbnYnO1xuaW1wb3J0IHtUZW5zb3JMaWtlfSBmcm9tICcuLi8uLi90eXBlcyc7XG5pbXBvcnQgKiBhcyB1dGlsIGZyb20gJy4uLy4uL3V0aWwnO1xuaW1wb3J0IHthZGR9IGZyb20gJy4uL2FkZCc7XG5pbXBvcnQgKiBhcyBicm9hZGNhc3RfdXRpbCBmcm9tICcuLi9icm9hZGNhc3RfdXRpbCc7XG5pbXBvcnQge2NvbnYyZCBhcyB1bmZ1c2VkQ29udjJkfSBmcm9tICcuLi9jb252MmQnO1xuaW1wb3J0IHtjb252MkRCYWNrcHJvcEZpbHRlcn0gZnJvbSAnLi4vY29udjJkX2JhY2twcm9wX2ZpbHRlcic7XG5pbXBvcnQge2NvbnYyREJhY2twcm9wSW5wdXR9IGZyb20gJy4uL2NvbnYyZF9iYWNrcHJvcF9pbnB1dCc7XG5pbXBvcnQgKiBhcyBjb252X3V0aWwgZnJvbSAnLi4vY29udl91dGlsJztcbmltcG9ydCB7QWN0aXZhdGlvbn0gZnJvbSAnLi4vZnVzZWRfdHlwZXMnO1xuaW1wb3J0IHthcHBseUFjdGl2YXRpb24sIGdldEZ1c2VkQmlhc0dyYWRpZW50LCBnZXRGdXNlZER5QWN0aXZhdGlvbiwgc2hvdWxkRnVzZX0gZnJvbSAnLi4vZnVzZWRfdXRpbCc7XG5pbXBvcnQge29wfSBmcm9tICcuLi9vcGVyYXRpb24nO1xuaW1wb3J0IHtyZXNoYXBlfSBmcm9tICcuLi9yZXNoYXBlJztcblxuLyoqXG4gKiBDb21wdXRlcyBhIDJEIGNvbnZvbHV0aW9uIG92ZXIgdGhlIGlucHV0IHgsIG9wdGlvbmFsbHkgZnVzZWQgd2l0aCBhZGRpbmcgYVxuICogYmlhcyBhbmQgYXBwbHlpbmcgYW4gYWN0aXZhdGlvbi5cbiAqXG4gKiBgYGBqc1xuICogY29uc3QgaW5wdXREZXB0aCA9IDI7XG4gKiBjb25zdCBpblNoYXBlID0gWzIsIDIsIDIsIGlucHV0RGVwdGhdO1xuICogY29uc3Qgb3V0cHV0RGVwdGggPSAyO1xuICogY29uc3QgZlNpemUgPSAxO1xuICogY29uc3QgcGFkID0gMDtcbiAqIGNvbnN0IHN0cmlkZXMgPSAxO1xuICpcbiAqIGNvbnN0IHggPSB0Zi50ZW5zb3I0ZCggWzEsIDIsIDMsIDQsIDUsIDYsIDcsIDgsIDksIDEwLCAxMSwgMTIsIDEzLCAxNCwgMTUsXG4gKiAxNl0sIGluU2hhcGUpO1xuICogY29uc3QgdyA9IHRmLnRlbnNvcjRkKFstMSwgMSwgLTIsIDAuNV0sIFtmU2l6ZSwgZlNpemUsIGlucHV0RGVwdGgsXG4gKiBvdXRwdXREZXB0aF0pO1xuICpcbiAqIHRmLmZ1c2VkLmNvbnYyZCh7IHgsIGZpbHRlcjogdywgc3RyaWRlcywgcGFkLCBkYXRhRm9ybWF0OiAnTkhXQycsXG4gKiBkaWxhdGlvbnM6IFsxLCAxXSwgYmlhczogdGYuc2NhbGFyKDUpLCBhY3RpdmF0aW9uOiAncmVsdScgfSkucHJpbnQoKTtcbiAqIGBgYFxuICpcbiAqIEBwYXJhbSBvYmogQW4gb2JqZWN0IHdpdGggdGhlIGZvbGxvd2luZyBwcm9wZXJ0aWVzOlxuICogQHBhcmFtIHggVGhlIGlucHV0IHRlbnNvciwgb2YgcmFuayA0IG9yIHJhbmsgMywgb2Ygc2hhcGVcbiAqICAgICBgW2JhdGNoLCBoZWlnaHQsIHdpZHRoLCBpbkNoYW5uZWxzXWAuIElmIHJhbmsgMywgYmF0Y2ggb2YgMSBpc1xuICogYXNzdW1lZC5cbiAqIEBwYXJhbSBmaWx0ZXIgVGhlIGZpbHRlciwgcmFuayA0LCBvZiBzaGFwZVxuICogICAgIGBbZmlsdGVySGVpZ2h0LCBmaWx0ZXJXaWR0aCwgaW5EZXB0aCwgb3V0RGVwdGhdYC5cbiAqIEBwYXJhbSBzdHJpZGVzIFRoZSBzdHJpZGVzIG9mIHRoZSBjb252b2x1dGlvbjogYFtzdHJpZGVIZWlnaHQsXG4gKiBzdHJpZGVXaWR0aF1gLlxuICogQHBhcmFtIHBhZCBUaGUgdHlwZSBvZiBwYWRkaW5nIGFsZ29yaXRobS5cbiAqICAgLSBgc2FtZWAgYW5kIHN0cmlkZSAxOiBvdXRwdXQgd2lsbCBiZSBvZiBzYW1lIHNpemUgYXMgaW5wdXQsXG4gKiAgICAgICByZWdhcmRsZXNzIG9mIGZpbHRlciBzaXplLlxuICogICAtIGB2YWxpZGAgb3V0cHV0IHdpbGwgYmUgc21hbGxlciB0aGFuIGlucHV0IGlmIGZpbHRlciBpcyBsYXJnZXJcbiAqICAgICAgIHRoYW4gMXgxLlxuICogICAtIEZvciBtb3JlIGluZm8sIHNlZSB0aGlzIGd1aWRlOlxuICogICAgIFtodHRwczovL3d3dy50ZW5zb3JmbG93Lm9yZy9hcGlfZG9jcy9weXRob24vdGYvbm4vY29udm9sdXRpb25dKFxuICogICAgICAgICAgaHR0cHM6Ly93d3cudGVuc29yZmxvdy5vcmcvYXBpX2RvY3MvcHl0aG9uL3RmL25uL2NvbnZvbHV0aW9uKVxuICogQHBhcmFtIGRhdGFGb3JtYXQgQW4gb3B0aW9uYWwgc3RyaW5nIGZyb206IFwiTkhXQ1wiLCBcIk5DSFdcIi4gRGVmYXVsdHMgdG9cbiAqICAgICBcIk5IV0NcIi4gU3BlY2lmeSB0aGUgZGF0YSBmb3JtYXQgb2YgdGhlIGlucHV0IGFuZCBvdXRwdXQgZGF0YS4gV2l0aCB0aGVcbiAqICAgICBkZWZhdWx0IGZvcm1hdCBcIk5IV0NcIiwgdGhlIGRhdGEgaXMgc3RvcmVkIGluIHRoZSBvcmRlciBvZjogW2JhdGNoLFxuICogICAgIGhlaWdodCwgd2lkdGgsIGNoYW5uZWxzXS4gT25seSBcIk5IV0NcIiBpcyBjdXJyZW50bHkgc3VwcG9ydGVkLlxuICogQHBhcmFtIGRpbGF0aW9ucyBUaGUgZGlsYXRpb24gcmF0ZXM6IGBbZGlsYXRpb25IZWlnaHQsIGRpbGF0aW9uV2lkdGhdYFxuICogICAgIGluIHdoaWNoIHdlIHNhbXBsZSBpbnB1dCB2YWx1ZXMgYWNyb3NzIHRoZSBoZWlnaHQgYW5kIHdpZHRoIGRpbWVuc2lvbnNcbiAqICAgICBpbiBhdHJvdXMgY29udm9sdXRpb24uIERlZmF1bHRzIHRvIGBbMSwgMV1gLiBJZiBgZGlsYXRpb25zYCBpcyBhIHNpbmdsZVxuICogICAgIG51bWJlciwgdGhlbiBgZGlsYXRpb25IZWlnaHQgPT0gZGlsYXRpb25XaWR0aGAuIElmIGl0IGlzIGdyZWF0ZXIgdGhhblxuICogICAgIDEsIHRoZW4gYWxsIHZhbHVlcyBvZiBgc3RyaWRlc2AgbXVzdCBiZSAxLlxuICogQHBhcmFtIGRpbVJvdW5kaW5nTW9kZSBBIHN0cmluZyBmcm9tOiAnY2VpbCcsICdyb3VuZCcsICdmbG9vcicuIElmIG5vbmUgaXNcbiAqICAgICBwcm92aWRlZCwgaXQgd2lsbCBkZWZhdWx0IHRvIHRydW5jYXRlLlxuICogQHBhcmFtIGJpYXMgVGVuc29yIHRvIGJlIGFkZGVkIHRvIHRoZSByZXN1bHQuXG4gKiBAcGFyYW0gYWN0aXZhdGlvbiBOYW1lIG9mIGFjdGl2YXRpb24ga2VybmVsIChkZWZhdWx0cyB0byBgbGluZWFyYCkgdG8gYmVcbiAqICAgICBhcHBsaWVkXG4gKiAgICAgIGFmdGVyIGJpYXNBZGQuXG4gKiBAcGFyYW0gcHJlbHVBY3RpdmF0aW9uV2VpZ2h0cyBUZW5zb3Igb2YgcHJlbHUgd2VpZ2h0cyB0byBiZSBhcHBsaWVkIGFzIHBhcnRcbiAqICAgICBvZiBhIGBwcmVsdWAgYWN0aXZhdGlvbiwgdHlwaWNhbGx5IHRoZSBzYW1lIHNoYXBlIGFzIGB4YC5cbiAqIEBwYXJhbSBsZWFreXJlbHVBbHBoYSBPcHRpb25hbC4gQWxwaGEgdG8gYmUgYXBwbGllZCBhcyBwYXJ0IG9mIGEgYGxlYWt5cmVsdWBcbiAqICAgICBhY3RpdmF0aW9uLlxuICovXG5mdW5jdGlvbiBmdXNlZENvbnYyZF88VCBleHRlbmRzIFRlbnNvcjNEfFRlbnNvcjREPih7XG4gIHgsXG4gIGZpbHRlcixcbiAgc3RyaWRlcyxcbiAgcGFkLFxuICBkYXRhRm9ybWF0ID0gJ05IV0MnLFxuICBkaWxhdGlvbnMgPSBbMSwgMV0sXG4gIGRpbVJvdW5kaW5nTW9kZSxcbiAgYmlhcyxcbiAgYWN0aXZhdGlvbiA9ICdsaW5lYXInLFxuICBwcmVsdUFjdGl2YXRpb25XZWlnaHRzLFxuICBsZWFreXJlbHVBbHBoYVxufToge1xuICB4OiBUfFRlbnNvckxpa2UsXG4gIGZpbHRlcjogVGVuc29yNER8VGVuc29yTGlrZSxcbiAgc3RyaWRlczogW251bWJlciwgbnVtYmVyXXxudW1iZXIsXG4gIHBhZDogJ3ZhbGlkJ3wnc2FtZSd8bnVtYmVyfGNvbnZfdXRpbC5FeHBsaWNpdFBhZGRpbmcsXG4gIGRhdGFGb3JtYXQ/OiAnTkhXQyd8J05DSFcnLFxuICBkaWxhdGlvbnM/OiBbbnVtYmVyLCBudW1iZXJdfG51bWJlcixcbiAgZGltUm91bmRpbmdNb2RlPzogJ2Zsb29yJ3wncm91bmQnfCdjZWlsJyxcbiAgYmlhcz86IFRlbnNvcnxUZW5zb3JMaWtlLFxuICBhY3RpdmF0aW9uPzogQWN0aXZhdGlvbixcbiAgcHJlbHVBY3RpdmF0aW9uV2VpZ2h0cz86IFRlbnNvcixcbiAgbGVha3lyZWx1QWxwaGE/OiBudW1iZXJcbn0pOiBUIHtcbiAgYWN0aXZhdGlvbiA9IGFjdGl2YXRpb24gfHwgJ2xpbmVhcic7XG5cbiAgaWYgKHNob3VsZEZ1c2UoRU5HSU5FLnN0YXRlLmdyYWRpZW50RGVwdGgsIGFjdGl2YXRpb24pID09PSBmYWxzZSkge1xuICAgIC8vIFRPRE86IFRyYW5zcG9zZSBiaWFzIGFuZCBwcmVsdUFjdGl2YXRpb25XZWlnaHRzIHByb3Blcmx5IGZvciBOQ0hXXG4gICAgLy8gZm9ybWF0IGJlZm9yZSBjb21wdXRhdGlvbi5cbiAgICB1dGlsLmFzc2VydChcbiAgICAgICAgZGF0YUZvcm1hdCA9PT0gJ05IV0MnLFxuICAgICAgICAoKSA9PiBgRXJyb3IgaW4gZnVzZWQgY29udjJkOiBnb3QgZGF0YUZvcm1hdCBvZiAke2RhdGFGb3JtYXR9IGJ1dCBgICtcbiAgICAgICAgICAgIGBvbmx5IE5IV0MgaXMgY3VycmVudGx5IHN1cHBvcnRlZCBmb3IgdGhlIGNhc2Ugb2YgZ3JhZGllbnQgZGVwdGggYCArXG4gICAgICAgICAgICBgaXMgMCBhbmQgdGhlIGFjdGl2YXRpb24gaXMgbm90IGxpbmVhci5gKTtcblxuICAgIGxldCByZXN1bHQgPSB1bmZ1c2VkQ29udjJkKFxuICAgICAgICB4LCBmaWx0ZXIsIHN0cmlkZXMsIHBhZCwgZGF0YUZvcm1hdCwgZGlsYXRpb25zLCBkaW1Sb3VuZGluZ01vZGUpO1xuICAgIGlmIChiaWFzICE9IG51bGwpIHtcbiAgICAgIHJlc3VsdCA9IGFkZChyZXN1bHQsIGJpYXMpO1xuICAgIH1cblxuICAgIHJldHVybiBhcHBseUFjdGl2YXRpb24oXG4gICAgICAgICAgICAgICByZXN1bHQsIGFjdGl2YXRpb24sIHByZWx1QWN0aXZhdGlvbldlaWdodHMsIGxlYWt5cmVsdUFscGhhKSBhcyBUO1xuICB9XG5cbiAgY29uc3QgJHggPSBjb252ZXJ0VG9UZW5zb3IoeCwgJ3gnLCAnY29udjJkJywgJ2Zsb2F0MzInKTtcbiAgY29uc3QgJGZpbHRlciA9IGNvbnZlcnRUb1RlbnNvcihmaWx0ZXIsICdmaWx0ZXInLCAnY29udjJkJywgJ2Zsb2F0MzInKTtcblxuICBsZXQgeDREID0gJHggYXMgVGVuc29yNEQ7XG4gIGxldCByZXNoYXBlZFRvNEQgPSBmYWxzZTtcblxuICBpZiAoJHgucmFuayA9PT0gMykge1xuICAgIHJlc2hhcGVkVG80RCA9IHRydWU7XG4gICAgeDREID0gcmVzaGFwZSgkeCwgWzEsICR4LnNoYXBlWzBdLCAkeC5zaGFwZVsxXSwgJHguc2hhcGVbMl1dKTtcbiAgfVxuICB1dGlsLmFzc2VydChcbiAgICAgIHg0RC5yYW5rID09PSA0LFxuICAgICAgKCkgPT4gYEVycm9yIGluIGZ1c2VkIGNvbnYyZDogaW5wdXQgbXVzdCBiZSByYW5rIDQsIGJ1dCBnb3QgcmFuayBgICtcbiAgICAgICAgICBgJHt4NEQucmFua30uYCk7XG4gIHV0aWwuYXNzZXJ0KFxuICAgICAgJGZpbHRlci5yYW5rID09PSA0LFxuICAgICAgKCkgPT4gYEVycm9yIGluIGZ1c2VkIGNvbnYyZDogZmlsdGVyIG11c3QgYmUgcmFuayA0LCBidXQgZ290IHJhbmsgYCArXG4gICAgICAgICAgYCR7JGZpbHRlci5yYW5rfS5gKTtcbiAgY29udl91dGlsLmNoZWNrUGFkT25EaW1Sb3VuZGluZ01vZGUoJ2Z1c2VkIGNvbnYyZCcsIHBhZCwgZGltUm91bmRpbmdNb2RlKTtcbiAgY29uc3QgaW5wdXRDaGFubmVscyA9IGRhdGFGb3JtYXQgPT09ICdOSFdDJyA/IHg0RC5zaGFwZVszXSA6IHg0RC5zaGFwZVsxXTtcbiAgdXRpbC5hc3NlcnQoXG4gICAgICAkZmlsdGVyLnNoYXBlWzJdID09PSBpbnB1dENoYW5uZWxzLFxuICAgICAgKCkgPT4gYEVycm9yIGluIGNvbnYyZDogZGVwdGggb2YgaW5wdXQgKCR7aW5wdXRDaGFubmVsc30pIG11c3QgbWF0Y2ggYCArXG4gICAgICAgICAgYGlucHV0IGRlcHRoIGZvciBmaWx0ZXIgJHskZmlsdGVyLnNoYXBlWzJdfS5gKTtcbiAgdXRpbC5hc3NlcnQoXG4gICAgICBjb252X3V0aWwuZWl0aGVyU3RyaWRlc09yRGlsYXRpb25zQXJlT25lKHN0cmlkZXMsIGRpbGF0aW9ucyksXG4gICAgICAoKSA9PiAnRXJyb3IgaW4gY29udjJEOiBFaXRoZXIgc3RyaWRlcyBvciBkaWxhdGlvbnMgbXVzdCBiZSAxLiAnICtcbiAgICAgICAgICBgR290IHN0cmlkZXMgJHtzdHJpZGVzfSBhbmQgZGlsYXRpb25zICcke2RpbGF0aW9uc30nYCk7XG5cbiAgY29uc3QgY29udkluZm8gPSBjb252X3V0aWwuY29tcHV0ZUNvbnYyREluZm8oXG4gICAgICB4NEQuc2hhcGUsICRmaWx0ZXIuc2hhcGUsIHN0cmlkZXMsIGRpbGF0aW9ucywgcGFkLCBkaW1Sb3VuZGluZ01vZGUpO1xuXG4gIGxldCAkYmlhczogVGVuc29yO1xuICBpZiAoYmlhcyAhPSBudWxsKSB7XG4gICAgJGJpYXMgPSBjb252ZXJ0VG9UZW5zb3IoYmlhcywgJ2JpYXMnLCAnZnVzZWQgY29udjJkJyk7XG4gICAgWyRiaWFzXSA9IG1ha2VUeXBlc01hdGNoKCRiaWFzLCAkeCk7XG5cbiAgICAvLyBBY2NvcmRpbmcgdG8gVGVuc29yRmxvdywgdGhlIGJpYXMgaXMgc3VwcG9zZWQgYmUgYSAxLUQgdGVuc29yIG9yIGFcbiAgICAvLyBzY2FsYXIuXG4gICAgLy9cbiAgICAvLyAzLUQgb3IgNC1EIGJpYXMgaXMgbm90IGRpc2FibGVkIGZvciBOSFdDIGZvcm1hdCwgYmVjYXVzZSB0aGV5IGFyZVxuICAgIC8vIGN1cnJlbnRseSBiZWluZyB1c2VkIGluIHNvbWUgY2FzZXMuIEZvciBleGFtcGxlbSBpbiBvdXIgY29kZSBiYXNlLFxuICAgIC8vIGh0dHBzOi8vZ2l0aHViLmNvbS90ZW5zb3JmbG93L3RmanMvYmxvYi9iNTNiZDQ3ZTg4MDM2N2FlNTc0OTNmMGVhNjI4YWJhZjA4ZGIyZDVkL3RmanMtY29yZS9zcmMvb3BzL2Z1c2VkL2Z1c2VkX2NvbnYyZF90ZXN0LnRzI0wxOTcyLlxuICAgIGlmIChkYXRhRm9ybWF0ID09PSAnTkhXQycpIHtcbiAgICAgIGJyb2FkY2FzdF91dGlsLmFzc2VydEFuZEdldEJyb2FkY2FzdFNoYXBlKGNvbnZJbmZvLm91dFNoYXBlLCAkYmlhcy5zaGFwZSk7XG4gICAgfSBlbHNlIHtcbiAgICAgIHV0aWwuYXNzZXJ0KFxuICAgICAgICAgICRiaWFzLnNoYXBlLmxlbmd0aCA8PSAxLFxuICAgICAgICAgICgpID0+IGBFcnJvciBpbiBmdXNlZCBjb252MmQ6IG9ubHkgc3VwcG9ydHMgc2NhbGFyIG9yIDEtRCBUZW5zb3IgYCArXG4gICAgICAgICAgICAgIGBiaWFzIGZvciBOQ0hXIGZvcm1hdCBidXQgZ290IHRoZSBiaWFzIG9mIGAgK1xuICAgICAgICAgICAgICBgcmFuay0keyRiaWFzLnNoYXBlLmxlbmd0aH0uYCk7XG5cbiAgICAgIHV0aWwuYXNzZXJ0KFxuICAgICAgICAgICRiaWFzLnNoYXBlLmxlbmd0aCA9PT0gMCB8fCAkYmlhcy5zaGFwZVswXSA9PT0gY29udkluZm8ub3V0Q2hhbm5lbHMgfHxcbiAgICAgICAgICAgICAgJGJpYXMuc2hhcGVbMF0gPT09IDEsXG4gICAgICAgICAgKCkgPT4gYEVycm9yIGluIGZ1c2VkIGNvbnYyZDogYmlhcyBzaGFwZSAoJHskYmlhcy5zaGFwZX0pIGlzIG5vdCBgICtcbiAgICAgICAgICAgICAgYGNvbXBhdGlibGUgd2l0aCB0aGUgbnVtYmVyIG9mIG91dHB1dCBjaGFubmVscyBgICtcbiAgICAgICAgICAgICAgYCgke2NvbnZJbmZvLm91dENoYW5uZWxzfSlgKTtcbiAgICB9XG4gIH1cblxuICBsZXQgJHByZWx1QWN0aXZhdGlvbldlaWdodHM6IFRlbnNvcjtcbiAgaWYgKHByZWx1QWN0aXZhdGlvbldlaWdodHMgIT0gbnVsbCkge1xuICAgIC8vIFBSZUxVJ3MgYWN0aXZhdGlvbiB3ZWlnaHRzIGNvdWxkIGJlIGEgc2NhbGFyLCBhIDEtRCB0ZW5zb3Igb3IgYSAzLURcbiAgICAvLyB0ZW5zb3IuXG4gICAgY29uc3QgYWxwaGFTaGFwZSA9IHByZWx1QWN0aXZhdGlvbldlaWdodHMuc2hhcGU7XG4gICAgdXRpbC5hc3NlcnQoXG4gICAgICAgIGFscGhhU2hhcGUubGVuZ3RoIDw9IDEgfHwgYWxwaGFTaGFwZS5sZW5ndGggPT09IDMsXG4gICAgICAgICgpID0+IGBFcnJvciBpbiBmdXNlZCBjb252MmQ6IG9ubHkgc3VwcG9ydHMgc2NhbGFyLCAxLUQgVGVuc29yIG9yIGAgK1xuICAgICAgICAgICAgYDMtRCBUZW5zb3IgUFJlTFUgYWN0aXZhdGlvbiB3ZWlnaHRzIGJ1dCBnb3QgYSB0ZW5zb3Igb2YgYCArXG4gICAgICAgICAgICBgcmFuay0ke2FscGhhU2hhcGUubGVuZ3RofS5gKTtcblxuICAgIGlmIChhbHBoYVNoYXBlLmxlbmd0aCA9PT0gMSkge1xuICAgICAgLy8gV2hldGhlciB0aGUgZGF0YSBmb3JtYXQgaXMgTkNIVyBvciBOSFdDLCB0aGUgMS1EIFBSZUxVIGFjdGl2YXRpb25cbiAgICAgIC8vIHdlaWdodHMgdGVuc29yIHNob3VsZCBiZSBhbGlnbmVkIHdpdGggdGhlIG91dHB1dCBjaGFubmVscyBvZiBjb252MmRcbiAgICAgIC8vIHJlc3VsdC5cbiAgICAgIHV0aWwuYXNzZXJ0KFxuICAgICAgICAgIGFscGhhU2hhcGVbMF0gPT09IDEgfHwgYWxwaGFTaGFwZVswXSA9PT0gY29udkluZm8ub3V0Q2hhbm5lbHMsXG4gICAgICAgICAgKCkgPT4gYEVycm9yIGluIGZ1c2VkIGNvbnYyZDogUFJlTFUgYWN0aXZhdGlvbiB3ZWlnaHRzIGAgK1xuICAgICAgICAgICAgICBgKCR7YWxwaGFTaGFwZX0pIGlzIG5vdCBjb21wYXRpYmxlIHdpdGggdGhlIG51bWJlciBvZiBvdXRwdXQgYCArXG4gICAgICAgICAgICAgIGBjaGFubmVscyAoJHtjb252SW5mby5vdXRDaGFubmVsc30pLmApO1xuICAgIH0gZWxzZSBpZiAoYWxwaGFTaGFwZS5sZW5ndGggPT09IDMpIHtcbiAgICAgIC8vIFdoZXRoZXIgdGhlIGRhdGEgZm9ybWF0IGlzIE5DSFcgb3IgTkhXQywgdGhlIFBSZUxVIGFjdGl2YXRpb24gd2VpZ2h0c1xuICAgICAgLy8gdGVuc29yIHNob3VsZCBoYXMgdGhlIGNvbXBhdGlibGUgc2hhcGUgd2l0aCB0aGUgcmVzdWx0IG9mIGNvbnYyZC5cbiAgICAgIHRyeSB7XG4gICAgICAgIGJyb2FkY2FzdF91dGlsLmFzc2VydEFuZEdldEJyb2FkY2FzdFNoYXBlKFxuICAgICAgICAgICAgYWxwaGFTaGFwZSwgY29udkluZm8ub3V0U2hhcGUpO1xuICAgICAgfSBjYXRjaCAoZSkge1xuICAgICAgICBjb25zdCBlcnJNc2cgPVxuICAgICAgICAgICAgYEVycm9yIGluIGZ1c2VkIGNvbnYyZDogUFJlTFUgYWN0aXZhdGlvbiB3ZWlnaHRzICgke2FscGhhU2hhcGV9KSBgICtcbiAgICAgICAgICAgIGBpcyBub3QgY29tcGF0aWJsZSB3aXRoIHRoZSBvdXRwdXQgc2hhcGUgb2YgdGhlIGNvbnYyZCBgICtcbiAgICAgICAgICAgIGAoJHtjb252SW5mby5vdXRTaGFwZX0pLmA7XG4gICAgICAgIHRocm93IEVycm9yKGVyck1zZyk7XG4gICAgICB9XG4gICAgfVxuXG4gICAgJHByZWx1QWN0aXZhdGlvbldlaWdodHMgPSBjb252ZXJ0VG9UZW5zb3IoXG4gICAgICAgIHByZWx1QWN0aXZhdGlvbldlaWdodHMsICdwcmVsdSB3ZWlnaHRzJywgJ2Z1c2VkIGNvbnYyZCcpO1xuICB9XG5cbiAgY29uc3QgZ3JhZCA9IChkeTogVGVuc29yNEQsIHNhdmVkOiBUZW5zb3JbXSkgPT4ge1xuICAgIHV0aWwuYXNzZXJ0KFxuICAgICAgICBkYXRhRm9ybWF0ID09PSAnTkhXQycsXG4gICAgICAgICgpID0+IGBFcnJvciBpbiBncmFkaWVudCBvZiBmdXNlZCBjb252MkQ6IGdvdCBkYXRhRm9ybWF0IG9mICR7XG4gICAgICAgICAgICBkYXRhRm9ybWF0fSBidXQgb25seSBOSFdDIGlzIGN1cnJlbnRseSBzdXBwb3J0ZWQuYCk7XG5cbiAgICBjb25zdCBbJGZpbHRlciwgeDRELCB5LCAkYmlhc10gPVxuICAgICAgICBzYXZlZCBhcyBbVGVuc29yNEQsIFRlbnNvcjRELCBUZW5zb3I0RCwgVGVuc29yXTtcblxuICAgIGNvbnN0IGR5QWN0aXZhdGlvbiA9IGdldEZ1c2VkRHlBY3RpdmF0aW9uKGR5LCB5LCBhY3RpdmF0aW9uKSBhcyBUZW5zb3I0RDtcblxuICAgIHV0aWwuYXNzZXJ0KFxuICAgICAgICBjb252X3V0aWwudHVwbGVWYWx1ZXNBcmVPbmUoZGlsYXRpb25zKSxcbiAgICAgICAgKCkgPT4gJ0Vycm9yIGluIGdyYWRpZW50IG9mIGZ1c2VkIGNvbnYyRDogJyArXG4gICAgICAgICAgICBgZGlsYXRpb24gcmF0ZXMgZ3JlYXRlciB0aGFuIDEgYCArXG4gICAgICAgICAgICBgYXJlIG5vdCB5ZXQgc3VwcG9ydGVkIGluIGdyYWRpZW50cy4gR290IGRpbGF0aW9ucyAnJHtkaWxhdGlvbnN9J2ApO1xuXG4gICAgY29uc3QgeERlciA9XG4gICAgICAgIGNvbnYyREJhY2twcm9wSW5wdXQoeDRELnNoYXBlLCBkeUFjdGl2YXRpb24sICRmaWx0ZXIsIHN0cmlkZXMsIHBhZCk7XG4gICAgY29uc3QgZmlsdGVyRGVyID1cbiAgICAgICAgY29udjJEQmFja3Byb3BGaWx0ZXIoeDRELCBkeUFjdGl2YXRpb24sICRmaWx0ZXIuc2hhcGUsIHN0cmlkZXMsIHBhZCk7XG4gICAgY29uc3QgZGVyOiBUZW5zb3JbXSA9IFt4RGVyLCBmaWx0ZXJEZXJdO1xuXG4gICAgaWYgKCRiaWFzICE9IG51bGwpIHtcbiAgICAgIGNvbnN0IGJpYXNEZXIgPSBnZXRGdXNlZEJpYXNHcmFkaWVudCgkYmlhcywgZHlBY3RpdmF0aW9uKTtcbiAgICAgIGRlci5wdXNoKGJpYXNEZXIpO1xuICAgIH1cbiAgICByZXR1cm4gZGVyO1xuICB9O1xuXG4gIGNvbnN0IGlucHV0czogRnVzZWRDb252MkRJbnB1dHMgPSB7XG4gICAgeDogeDRELFxuICAgIGZpbHRlcjogJGZpbHRlcixcbiAgICBiaWFzOiAkYmlhcyxcbiAgICBwcmVsdUFjdGl2YXRpb25XZWlnaHRzOiAkcHJlbHVBY3RpdmF0aW9uV2VpZ2h0c1xuICB9O1xuXG4gIGNvbnN0IGF0dHJzOiBGdXNlZENvbnYyREF0dHJzID0ge1xuICAgIHN0cmlkZXMsXG4gICAgcGFkLFxuICAgIGRhdGFGb3JtYXQsXG4gICAgZGlsYXRpb25zLFxuICAgIGRpbVJvdW5kaW5nTW9kZSxcbiAgICBhY3RpdmF0aW9uLFxuICAgIGxlYWt5cmVsdUFscGhhXG4gIH07XG5cbiAgLy8gRGVwZW5kaW5nIG9uIHRoZSB0aGUgcGFyYW1zIHBhc3NlZCBpbiB3ZSB3aWxsIGhhdmUgZGlmZmVyZW50IG51bWJlciBvZlxuICAvLyBpbnB1dHMgYW5kIHRodXMgYSBhIGRpZmZlcmVudCBudW1iZXIgb2YgZWxlbWVudHMgaW4gdGhlIGdyYWRpZW50LlxuICBpZiAoYmlhcyA9PSBudWxsKSB7XG4gICAgY29uc3QgY3VzdG9tT3AgPVxuICAgICAgICBjdXN0b21HcmFkKCh4NEQ6IFRlbnNvcjRELCBmaWx0ZXI6IFRlbnNvcjRELCBzYXZlOiBHcmFkU2F2ZUZ1bmMpID0+IHtcbiAgICAgICAgICBsZXQgcmVzOiBUZW5zb3I0RHxUZW5zb3IzRCA9XG4gICAgICAgICAgICAgIC8vIHRzbGludDpkaXNhYmxlLW5leHQtbGluZTogbm8tdW5uZWNlc3NhcnktdHlwZS1hc3NlcnRpb25cbiAgICAgICAgICAgICAgRU5HSU5FLnJ1bktlcm5lbChcbiAgICAgICAgICAgICAgICAgIEZ1c2VkQ29udjJELCBpbnB1dHMgYXMge30gYXMgTmFtZWRUZW5zb3JNYXAsXG4gICAgICAgICAgICAgICAgICBhdHRycyBhcyB7fSBhcyBOYW1lZEF0dHJNYXApO1xuXG4gICAgICAgICAgc2F2ZShbZmlsdGVyLCB4NEQsIHJlc10pO1xuXG4gICAgICAgICAgaWYgKHJlc2hhcGVkVG80RCkge1xuICAgICAgICAgICAgLy8gdHNsaW50OmRpc2FibGUtbmV4dC1saW5lOiBuby11bm5lY2Vzc2FyeS10eXBlLWFzc2VydGlvblxuICAgICAgICAgICAgcmVzID0gcmVzaGFwZShyZXMsIFtyZXMuc2hhcGVbMV0sIHJlcy5zaGFwZVsyXSwgcmVzLnNoYXBlWzNdXSkgYXNcbiAgICAgICAgICAgICAgICBUZW5zb3IzRDtcbiAgICAgICAgICB9XG5cbiAgICAgICAgICByZXR1cm4ge3ZhbHVlOiByZXMsIGdyYWRGdW5jOiBncmFkfTtcbiAgICAgICAgfSk7XG4gICAgcmV0dXJuIGN1c3RvbU9wKHg0RCwgJGZpbHRlcikgYXMgVDtcbiAgfSBlbHNlIHtcbiAgICBjb25zdCBjdXN0b21PcFdpdGhCaWFzID0gY3VzdG9tR3JhZChcbiAgICAgICAgKHg0RDogVGVuc29yNEQsIGZpbHRlcjogVGVuc29yNEQsIGJpYXM6IFRlbnNvciwgc2F2ZTogR3JhZFNhdmVGdW5jKSA9PiB7XG4gICAgICAgICAgbGV0IHJlczogVGVuc29yNER8VGVuc29yM0QgPSBFTkdJTkUucnVuS2VybmVsKFxuICAgICAgICAgICAgICBGdXNlZENvbnYyRCwgaW5wdXRzIGFzIHt9IGFzIE5hbWVkVGVuc29yTWFwLFxuICAgICAgICAgICAgICBhdHRycyBhcyB7fSBhcyBOYW1lZEF0dHJNYXApO1xuXG4gICAgICAgICAgc2F2ZShbZmlsdGVyLCB4NEQsIHJlcywgYmlhc10pO1xuXG4gICAgICAgICAgaWYgKHJlc2hhcGVkVG80RCkge1xuICAgICAgICAgICAgLy8gdHNsaW50OmRpc2FibGUtbmV4dC1saW5lOiBuby11bm5lY2Vzc2FyeS10eXBlLWFzc2VydGlvblxuICAgICAgICAgICAgcmVzID0gcmVzaGFwZShyZXMsIFtyZXMuc2hhcGVbMV0sIHJlcy5zaGFwZVsyXSwgcmVzLnNoYXBlWzNdXSkgYXNcbiAgICAgICAgICAgICAgICBUZW5zb3IzRDtcbiAgICAgICAgICB9XG5cbiAgICAgICAgICByZXR1cm4ge3ZhbHVlOiByZXMsIGdyYWRGdW5jOiBncmFkfTtcbiAgICAgICAgfSk7XG5cbiAgICByZXR1cm4gY3VzdG9tT3BXaXRoQmlhcyh4NEQsICRmaWx0ZXIsICRiaWFzKSBhcyBUO1xuICB9XG59XG5leHBvcnQgY29uc3QgY29udjJkID0gb3Aoe2Z1c2VkQ29udjJkX30pO1xuIl19","/**\n * @license\n * Copyright 2019 Google LLC. All Rights Reserved.\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n * =============================================================================\n */\nimport { ENGINE } from '../../engine';\nimport { customGrad } from '../../gradients';\nimport { FusedDepthwiseConv2D } from '../../kernel_names';\nimport { makeTypesMatch } from '../../tensor_util';\nimport { convertToTensor } from '../../tensor_util_env';\nimport * as util from '../../util';\nimport { add } from '../add';\nimport * as broadcast_util from '../broadcast_util';\nimport * as conv_util from '../conv_util';\nimport { depthwiseConv2d as unfusedDepthwiseConv2d } from '../depthwise_conv2d';\nimport { depthwiseConv2dNativeBackpropFilter } from '../depthwise_conv2d_native_backprop_filter';\nimport { depthwiseConv2dNativeBackpropInput } from '../depthwise_conv2d_native_backprop_input';\nimport { applyActivation, getFusedBiasGradient, getFusedDyActivation, shouldFuse } from '../fused_util';\nimport { op } from '../operation';\nimport { reshape } from '../reshape';\n/**\n * Computes depthwise 2D convolution, optionally fused with adding a\n * bias and applying an activation.\n *\n * Given a 4D `input` array and a `filter` array of shape\n * `[filterHeight, filterWidth, inChannels, channelMultiplier]` containing\n * `inChannels` convolutional filters of depth 1, this op applies a\n * different filter to each input channel (expanding from 1 channel to\n * `channelMultiplier` channels for each), then concatenates the results\n * together. The output has `inChannels * channelMultiplier` channels.\n *\n * See\n * [https://www.tensorflow.org/api_docs/python/tf/nn/depthwise_conv2d](\n * https://www.tensorflow.org/api_docs/python/tf/nn/depthwise_conv2d)\n * for more details.\n *\n * @param obj An object with the following properties:\n * @param x The input tensor, of rank 4 or rank 3, of shape\n * `[batch, height, width, inChannels]`. If rank 3, batch of 1 is\n * assumed.\n * @param filter The filter tensor, rank 4, of shape\n * `[filterHeight, filterWidth, inChannels, channelMultiplier]`.\n * @param strides The strides of the convolution: `[strideHeight,\n * strideWidth]`. If strides is a single number, then `strideHeight ==\n * strideWidth`.\n * @param pad The type of padding algorithm.\n * - `same` and stride 1: output will be of same size as input,\n * regardless of filter size.\n * - `valid`: output will be smaller than input if filter is larger\n * than 1x1.\n * - For more info, see this guide:\n * [https://www.tensorflow.org/api_docs/python/tf/nn/convolution](\n * https://www.tensorflow.org/api_docs/python/tf/nn/convolution)\n * @param dilations The dilation rates: `[dilationHeight, dilationWidth]`\n * in which we sample input values across the height and width dimensions\n * in atrous convolution. Defaults to `[1, 1]`. If `rate` is a single\n * number, then `dilationHeight == dilationWidth`. If it is greater than\n * 1, then all values of `strides` must be 1.\n * @param dataFormat: An optional string from: \"NHWC\", \"NCHW\". Defaults to\n * \"NHWC\". Specify the data format of the input and output data. With the\n * default format \"NHWC\", the data is stored in the order of: [batch,\n * height, width, channels]. Only \"NHWC\" is currently supported.\n * @param dimRoundingMode A string from: 'ceil', 'round', 'floor'. If none is\n * provided, it will default to truncate.\n * @param bias Tensor to be added to the result.\n * @param activation Name of activation kernel (defaults to `linear`).\n * @param preluActivationWeights Tensor of prelu weights to be applied as part\n * of a `prelu` activation, typically the same shape as `x`.\n * @param leakyreluAlpha Optional. Alpha to be applied as part of a `leakyrelu`\n * activation.\n */\nfunction fusedDepthwiseConv2d_({ x, filter, strides, pad, dataFormat = 'NHWC', dilations = [1, 1], dimRoundingMode, bias, activation = 'linear', preluActivationWeights, leakyreluAlpha }) {\n if (shouldFuse(ENGINE.state.gradientDepth, activation) === false) {\n let result = unfusedDepthwiseConv2d(x, filter, strides, pad, dataFormat, dilations, dimRoundingMode);\n if (bias != null) {\n result = add(result, bias);\n }\n return applyActivation(result, activation, preluActivationWeights, leakyreluAlpha);\n }\n const $x = convertToTensor(x, 'x', 'depthwiseConv2d', 'float32');\n const $filter = convertToTensor(filter, 'filter', 'depthwiseConv2d', 'float32');\n let x4D = $x;\n let reshapedTo4D = false;\n if ($x.rank === 3) {\n reshapedTo4D = true;\n x4D = reshape($x, [1, $x.shape[0], $x.shape[1], $x.shape[2]]);\n }\n util.assert(x4D.rank === 4, () => `Error in fused depthwiseConv2d: input must be rank 4, but got ` +\n `rank ${x4D.rank}.`);\n util.assert($filter.rank === 4, () => `Error in fused depthwiseConv2d: filter must be rank 4, ` +\n `but got rank ${$filter.rank}.`);\n util.assert(x4D.shape[3] === $filter.shape[2], () => `Error in fused depthwiseConv2d: number of input channels ` +\n `(${x4D.shape[3]}) must match the inChannels dimension in ` +\n `filter ${$filter.shape[2]}.`);\n if (dilations == null) {\n dilations = [1, 1];\n }\n util.assert(conv_util.eitherStridesOrDilationsAreOne(strides, dilations), () => 'Error in fused depthwiseConv2d: Either strides or dilations must ' +\n `be 1. Got strides ${strides} and dilations '${dilations}'`);\n conv_util.checkPadOnDimRoundingMode('fused depthwiseConv2d', pad, dimRoundingMode);\n const convInfo = conv_util.computeConv2DInfo(x4D.shape, $filter.shape, strides, dilations, pad, dimRoundingMode, true /* depthwise */);\n let $bias;\n if (bias != null) {\n $bias = convertToTensor(bias, 'bias', 'fused conv2d');\n [$bias] = makeTypesMatch($bias, $x);\n broadcast_util.assertAndGetBroadcastShape(convInfo.outShape, $bias.shape);\n }\n let $preluActivationWeights;\n if (preluActivationWeights != null) {\n $preluActivationWeights = convertToTensor(preluActivationWeights, 'prelu weights', 'fused depthwiseConv2d');\n }\n const grad = (dy, saved) => {\n util.assert(conv_util.tupleValuesAreOne(dilations), () => 'Error in gradient of fused depthwiseConv2d: dilation rates ' +\n `greater than 1 are not yet supported. Got dilations ` +\n `'${dilations}'`);\n const [$filter, x4D, y, bias] = saved;\n const dyActivation = getFusedDyActivation(dy, y, activation);\n const xDer = depthwiseConv2dNativeBackpropInput(x4D.shape, dyActivation, $filter, strides, pad, dilations, dimRoundingMode);\n const filterDer = depthwiseConv2dNativeBackpropFilter(x4D, dyActivation, $filter.shape, strides, pad, dilations, dimRoundingMode);\n if (bias != null) {\n const biasDer = getFusedBiasGradient($bias, dyActivation);\n return [xDer, filterDer, biasDer];\n }\n return [xDer, filterDer];\n };\n const inputs = {\n x: x4D,\n filter: $filter,\n bias: $bias,\n preluActivationWeights: $preluActivationWeights\n };\n const attrs = {\n strides,\n pad,\n dataFormat,\n dilations,\n dimRoundingMode,\n activation,\n leakyreluAlpha\n };\n // Depending on the the params passed in we will have different number of\n // inputs and thus a a different number of elements in the gradient.\n if (bias == null) {\n const customOp = customGrad((x4D, filter, save) => {\n // tslint:disable-next-line: no-unnecessary-type-assertion\n let res = ENGINE.runKernel(FusedDepthwiseConv2D, inputs, attrs);\n save([filter, x4D, res]);\n if (reshapedTo4D) {\n // tslint:disable-next-line: no-unnecessary-type-assertion\n res = reshape(res, [res.shape[1], res.shape[2], res.shape[3]]);\n }\n return { value: res, gradFunc: grad };\n });\n return customOp(x4D, $filter);\n }\n else {\n const customOpWithBias = customGrad((x4D, filter, bias, save) => {\n // tslint:disable-next-line: no-unnecessary-type-assertion\n let res = ENGINE.runKernel(FusedDepthwiseConv2D, inputs, attrs);\n save([filter, x4D, res, bias]);\n if (reshapedTo4D) {\n // tslint:disable-next-line: no-unnecessary-type-assertion\n res = reshape(res, [res.shape[1], res.shape[2], res.shape[3]]);\n }\n return { value: res, gradFunc: grad };\n });\n return customOpWithBias(x4D, $filter, $bias);\n }\n}\nexport const depthwiseConv2d = op({ fusedDepthwiseConv2d_ });\n//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZGVwdGh3aXNlX2NvbnYyZC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uLy4uLy4uL3RmanMtY29yZS9zcmMvb3BzL2Z1c2VkL2RlcHRod2lzZV9jb252MmQudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUE7Ozs7Ozs7Ozs7Ozs7OztHQWVHO0FBRUgsT0FBTyxFQUFDLE1BQU0sRUFBQyxNQUFNLGNBQWMsQ0FBQztBQUNwQyxPQUFPLEVBQUMsVUFBVSxFQUFDLE1BQU0saUJBQWlCLENBQUM7QUFDM0MsT0FBTyxFQUFDLG9CQUFvQixFQUF3RCxNQUFNLG9CQUFvQixDQUFDO0FBSS9HLE9BQU8sRUFBQyxjQUFjLEVBQUMsTUFBTSxtQkFBbUIsQ0FBQztBQUNqRCxPQUFPLEVBQUMsZUFBZSxFQUFDLE1BQU0sdUJBQXVCLENBQUM7QUFFdEQsT0FBTyxLQUFLLElBQUksTUFBTSxZQUFZLENBQUM7QUFDbkMsT0FBTyxFQUFDLEdBQUcsRUFBQyxNQUFNLFFBQVEsQ0FBQztBQUMzQixPQUFPLEtBQUssY0FBYyxNQUFNLG1CQUFtQixDQUFDO0FBQ3BELE9BQU8sS0FBSyxTQUFTLE1BQU0sY0FBYyxDQUFDO0FBQzFDLE9BQU8sRUFBQyxlQUFlLElBQUksc0JBQXNCLEVBQUMsTUFBTSxxQkFBcUIsQ0FBQztBQUM5RSxPQUFPLEVBQUMsbUNBQW1DLEVBQUMsTUFBTSw0Q0FBNEMsQ0FBQztBQUMvRixPQUFPLEVBQUMsa0NBQWtDLEVBQUMsTUFBTSwyQ0FBMkMsQ0FBQztBQUU3RixPQUFPLEVBQUMsZUFBZSxFQUFFLG9CQUFvQixFQUFFLG9CQUFvQixFQUFFLFVBQVUsRUFBQyxNQUFNLGVBQWUsQ0FBQztBQUN0RyxPQUFPLEVBQUMsRUFBRSxFQUFDLE1BQU0sY0FBYyxDQUFDO0FBQ2hDLE9BQU8sRUFBQyxPQUFPLEVBQUMsTUFBTSxZQUFZLENBQUM7QUFFbkM7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7O0dBa0RHO0FBQ0gsU0FBUyxxQkFBcUIsQ0FBOEIsRUFDMUQsQ0FBQyxFQUNELE1BQU0sRUFDTixPQUFPLEVBQ1AsR0FBRyxFQUNILFVBQVUsR0FBRyxNQUFNLEVBQ25CLFNBQVMsR0FBRyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsRUFDbEIsZUFBZSxFQUNmLElBQUksRUFDSixVQUFVLEdBQUcsUUFBUSxFQUNyQixzQkFBc0IsRUFDdEIsY0FBYyxFQWFmO0lBQ0MsSUFBSSxVQUFVLENBQUMsTUFBTSxDQUFDLEtBQUssQ0FBQyxhQUFhLEVBQUUsVUFBVSxDQUFDLEtBQUssS0FBSyxFQUFFO1FBQ2hFLElBQUksTUFBTSxHQUFHLHNCQUFzQixDQUMvQixDQUFDLEVBQUUsTUFBTSxFQUFFLE9BQU8sRUFBRSxHQUFHLEVBQUUsVUFBVSxFQUFFLFNBQVMsRUFBRSxlQUFlLENBQUMsQ0FBQztRQUNyRSxJQUFJLElBQUksSUFBSSxJQUFJLEVBQUU7WUFDaEIsTUFBTSxHQUFHLEdBQUcsQ0FBQyxNQUFNLEVBQUUsSUFBSSxDQUFDLENBQUM7U0FDNUI7UUFFRCxPQUFPLGVBQWUsQ0FDWCxNQUFNLEVBQUUsVUFBVSxFQUFFLHNCQUFzQixFQUFFLGNBQWMsQ0FBTSxDQUFDO0tBQzdFO0lBRUQsTUFBTSxFQUFFLEdBQUcsZUFBZSxDQUFDLENBQUMsRUFBRSxHQUFHLEVBQUUsaUJBQWlCLEVBQUUsU0FBUyxDQUFDLENBQUM7SUFDakUsTUFBTSxPQUFPLEdBQ1QsZUFBZSxDQUFDLE1BQU0sRUFBRSxRQUFRLEVBQUUsaUJBQWlCLEVBQUUsU0FBUyxDQUFDLENBQUM7SUFFcEUsSUFBSSxHQUFHLEdBQUcsRUFBYyxDQUFDO0lBQ3pCLElBQUksWUFBWSxHQUFHLEtBQUssQ0FBQztJQUN6QixJQUFJLEVBQUUsQ0FBQyxJQUFJLEtBQUssQ0FBQyxFQUFFO1FBQ2pCLFlBQVksR0FBRyxJQUFJLENBQUM7UUFDcEIsR0FBRyxHQUFHLE9BQU8sQ0FBQyxFQUFFLEVBQUUsQ0FBQyxDQUFDLEVBQUUsRUFBRSxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUMsRUFBRSxFQUFFLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQyxFQUFFLEVBQUUsQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDO0tBQy9EO0lBQ0QsSUFBSSxDQUFDLE1BQU0sQ0FDUCxHQUFHLENBQUMsSUFBSSxLQUFLLENBQUMsRUFDZCxHQUFHLEVBQUUsQ0FBQyxnRUFBZ0U7UUFDbEUsUUFBUSxHQUFHLENBQUMsSUFBSSxHQUFHLENBQUMsQ0FBQztJQUM3QixJQUFJLENBQUMsTUFBTSxDQUNQLE9BQU8sQ0FBQyxJQUFJLEtBQUssQ0FBQyxFQUNsQixHQUFHLEVBQUUsQ0FBQyx5REFBeUQ7UUFDM0QsZ0JBQWdCLE9BQU8sQ0FBQyxJQUFJLEdBQUcsQ0FBQyxDQUFDO0lBQ3pDLElBQUksQ0FBQyxNQUFNLENBQ1AsR0FBRyxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUMsS0FBSyxPQUFPLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQyxFQUNqQyxHQUFHLEVBQUUsQ0FBQywyREFBMkQ7UUFDN0QsSUFBSSxHQUFHLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQywyQ0FBMkM7UUFDM0QsVUFBVSxPQUFPLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQztJQUN2QyxJQUFJLFNBQVMsSUFBSSxJQUFJLEVBQUU7UUFDckIsU0FBUyxHQUFHLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDO0tBQ3BCO0lBQ0QsSUFBSSxDQUFDLE1BQU0sQ0FDUCxTQUFTLENBQUMsOEJBQThCLENBQUMsT0FBTyxFQUFFLFNBQVMsQ0FBQyxFQUM1RCxHQUFHLEVBQUUsQ0FDRCxtRUFBbUU7UUFDbkUscUJBQXFCLE9BQU8sbUJBQW1CLFNBQVMsR0FBRyxDQUFDLENBQUM7SUFDckUsU0FBUyxDQUFDLHlCQUF5QixDQUMvQix1QkFBdUIsRUFBRSxHQUFHLEVBQUUsZUFBZSxDQUFDLENBQUM7SUFDbkQsTUFBTSxRQUFRLEdBQUcsU0FBUyxDQUFDLGlCQUFpQixDQUN4QyxHQUFHLENBQUMsS0FBSyxFQUFFLE9BQU8sQ0FBQyxLQUFLLEVBQUUsT0FBTyxFQUFFLFNBQVMsRUFBRSxHQUFHLEVBQUUsZUFBZSxFQUNsRSxJQUFJLENBQUMsZUFBZSxDQUFDLENBQUM7SUFFMUIsSUFBSSxLQUFhLENBQUM7SUFDbEIsSUFBSSxJQUFJLElBQUksSUFBSSxFQUFFO1FBQ2hCLEtBQUssR0FBRyxlQUFlLENBQUMsSUFBSSxFQUFFLE1BQU0sRUFBRSxjQUFjLENBQUMsQ0FBQztRQUN0RCxDQUFDLEtBQUssQ0FBQyxHQUFHLGNBQWMsQ0FBQyxLQUFLLEVBQUUsRUFBRSxDQUFDLENBQUM7UUFFcEMsY0FBYyxDQUFDLDBCQUEwQixDQUFDLFFBQVEsQ0FBQyxRQUFRLEVBQUUsS0FBSyxDQUFDLEtBQUssQ0FBQyxDQUFDO0tBQzNFO0lBRUQsSUFBSSx1QkFBK0IsQ0FBQztJQUNwQyxJQUFJLHNCQUFzQixJQUFJLElBQUksRUFBRTtRQUNsQyx1QkFBdUIsR0FBRyxlQUFlLENBQ3JDLHNCQUFzQixFQUFFLGVBQWUsRUFBRSx1QkFBdUIsQ0FBQyxDQUFDO0tBQ3ZFO0lBRUQsTUFBTSxJQUFJLEdBQUcsQ0FBQyxFQUFZLEVBQUUsS0FBZSxFQUFFLEVBQUU7UUFDN0MsSUFBSSxDQUFDLE1BQU0sQ0FDUCxTQUFTLENBQUMsaUJBQWlCLENBQUMsU0FBUyxDQUFDLEVBQ3RDLEdBQUcsRUFBRSxDQUFDLDZEQUE2RDtZQUMvRCxzREFBc0Q7WUFDdEQsSUFBSSxTQUFTLEdBQUcsQ0FBQyxDQUFDO1FBQzFCLE1BQU0sQ0FBQyxPQUFPLEVBQUUsR0FBRyxFQUFFLENBQUMsRUFBRSxJQUFJLENBQUMsR0FBRyxLQUFLLENBQUM7UUFFdEMsTUFBTSxZQUFZLEdBQUcsb0JBQW9CLENBQUMsRUFBRSxFQUFFLENBQUMsRUFBRSxVQUFVLENBQWEsQ0FBQztRQUV6RSxNQUFNLElBQUksR0FBRyxrQ0FBa0MsQ0FDMUMsR0FBZ0IsQ0FBQyxLQUFLLEVBQUUsWUFBWSxFQUFFLE9BQW1CLEVBQUUsT0FBTyxFQUNuRSxHQUFHLEVBQUUsU0FBUyxFQUFFLGVBQWUsQ0FBQyxDQUFDO1FBQ3JDLE1BQU0sU0FBUyxHQUFHLG1DQUFtQyxDQUNqRCxHQUFlLEVBQUUsWUFBWSxFQUFHLE9BQW9CLENBQUMsS0FBSyxFQUFFLE9BQU8sRUFDbkUsR0FBRyxFQUFFLFNBQVMsRUFBRSxlQUFlLENBQUMsQ0FBQztRQUVyQyxJQUFJLElBQUksSUFBSSxJQUFJLEVBQUU7WUFDaEIsTUFBTSxPQUFPLEdBQUcsb0JBQW9CLENBQUMsS0FBSyxFQUFFLFlBQVksQ0FBQyxDQUFDO1lBQzFELE9BQU8sQ0FBQyxJQUFJLEVBQUUsU0FBUyxFQUFFLE9BQU8sQ0FBQyxDQUFDO1NBQ25DO1FBQ0QsT0FBTyxDQUFDLElBQUksRUFBRSxTQUFTLENBQUMsQ0FBQztJQUMzQixDQUFDLENBQUM7SUFFRixNQUFNLE1BQU0sR0FBK0I7UUFDekMsQ0FBQyxFQUFFLEdBQUc7UUFDTixNQUFNLEVBQUUsT0FBTztRQUNmLElBQUksRUFBRSxLQUFLO1FBQ1gsc0JBQXNCLEVBQUUsdUJBQXVCO0tBQ2hELENBQUM7SUFDRixNQUFNLEtBQUssR0FBOEI7UUFDdkMsT0FBTztRQUNQLEdBQUc7UUFDSCxVQUFVO1FBQ1YsU0FBUztRQUNULGVBQWU7UUFDZixVQUFVO1FBQ1YsY0FBYztLQUNmLENBQUM7SUFFRix5RUFBeUU7SUFDekUsb0VBQW9FO0lBQ3BFLElBQUksSUFBSSxJQUFJLElBQUksRUFBRTtRQUNoQixNQUFNLFFBQVEsR0FDVixVQUFVLENBQUMsQ0FBQyxHQUFhLEVBQUUsTUFBZ0IsRUFBRSxJQUFrQixFQUFFLEVBQUU7WUFDakUsMERBQTBEO1lBQzFELElBQUksR0FBRyxHQUFzQixNQUFNLENBQUMsU0FBUyxDQUN6QyxvQkFBb0IsRUFBRSxNQUE4QixFQUNwRCxLQUEyQixDQUFDLENBQUM7WUFFakMsSUFBSSxDQUFDLENBQUMsTUFBTSxFQUFFLEdBQUcsRUFBRSxHQUFHLENBQUMsQ0FBQyxDQUFDO1lBRXpCLElBQUksWUFBWSxFQUFFO2dCQUNoQiwwREFBMEQ7Z0JBQzFELEdBQUcsR0FBRyxPQUFPLENBQUMsR0FBRyxFQUFFLENBQUMsR0FBRyxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUMsRUFBRSxHQUFHLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQyxFQUFFLEdBQUcsQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FDakQsQ0FBQzthQUNkO1lBRUQsT0FBTyxFQUFDLEtBQUssRUFBRSxHQUFHLEVBQUUsUUFBUSxFQUFFLElBQUksRUFBQyxDQUFDO1FBQ3RDLENBQUMsQ0FBQyxDQUFDO1FBQ1AsT0FBTyxRQUFRLENBQUMsR0FBRyxFQUFFLE9BQU8sQ0FBTSxDQUFDO0tBQ3BDO1NBQU07UUFDTCxNQUFNLGdCQUFnQixHQUFHLFVBQVUsQ0FDL0IsQ0FBQyxHQUFhLEVBQUUsTUFBZ0IsRUFBRSxJQUFZLEVBQUUsSUFBa0IsRUFBRSxFQUFFO1lBQ3BFLDBEQUEwRDtZQUMxRCxJQUFJLEdBQUcsR0FBc0IsTUFBTSxDQUFDLFNBQVMsQ0FDekMsb0JBQW9CLEVBQUUsTUFBOEIsRUFDcEQsS0FBMkIsQ0FBQyxDQUFDO1lBRWpDLElBQUksQ0FBQyxDQUFDLE1BQU0sRUFBRSxHQUFHLEVBQUUsR0FBRyxFQUFFLElBQUksQ0FBQyxDQUFDLENBQUM7WUFFL0IsSUFBSSxZQUFZLEVBQUU7Z0JBQ2hCLDBEQUEwRDtnQkFDMUQsR0FBRyxHQUFHLE9BQU8sQ0FBQyxHQUFHLEVBQUUsQ0FBQyxHQUFHLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQyxFQUFFLEdBQUcsQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDLEVBQUUsR0FBRyxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUNqRCxDQUFDO2FBQ2Q7WUFFRCxPQUFPLEVBQUMsS0FBSyxFQUFFLEdBQUcsRUFBRSxRQUFRLEVBQUUsSUFBSSxFQUFDLENBQUM7UUFDdEMsQ0FBQyxDQUFDLENBQUM7UUFFUCxPQUFPLGdCQUFnQixDQUFDLEdBQUcsRUFBRSxPQUFPLEVBQUUsS0FBSyxDQUFNLENBQUM7S0FDbkQ7QUFDSCxDQUFDO0FBQ0QsTUFBTSxDQUFDLE1BQU0sZUFBZSxHQUFHLEVBQUUsQ0FBQyxFQUFDLHFCQUFxQixFQUFDLENBQUMsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbIi8qKlxuICogQGxpY2Vuc2VcbiAqIENvcHlyaWdodCAyMDE5IEdvb2dsZSBMTEMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuXG4gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgXCJMaWNlbnNlXCIpO1xuICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLlxuICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0XG4gKlxuICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wXG4gKlxuICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZVxuICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gXCJBUyBJU1wiIEJBU0lTLFxuICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuXG4gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kXG4gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS5cbiAqID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4gKi9cblxuaW1wb3J0IHtFTkdJTkV9IGZyb20gJy4uLy4uL2VuZ2luZSc7XG5pbXBvcnQge2N1c3RvbUdyYWR9IGZyb20gJy4uLy4uL2dyYWRpZW50cyc7XG5pbXBvcnQge0Z1c2VkRGVwdGh3aXNlQ29udjJELCBGdXNlZERlcHRod2lzZUNvbnYyREF0dHJzLCBGdXNlZERlcHRod2lzZUNvbnYyRElucHV0c30gZnJvbSAnLi4vLi4va2VybmVsX25hbWVzJztcbmltcG9ydCB7TmFtZWRBdHRyTWFwfSBmcm9tICcuLi8uLi9rZXJuZWxfcmVnaXN0cnknO1xuaW1wb3J0IHtUZW5zb3IsIFRlbnNvcjNELCBUZW5zb3I0RH0gZnJvbSAnLi4vLi4vdGVuc29yJztcbmltcG9ydCB7R3JhZFNhdmVGdW5jLCBOYW1lZFRlbnNvck1hcH0gZnJvbSAnLi4vLi4vdGVuc29yX3R5cGVzJztcbmltcG9ydCB7bWFrZVR5cGVzTWF0Y2h9IGZyb20gJy4uLy4uL3RlbnNvcl91dGlsJztcbmltcG9ydCB7Y29udmVydFRvVGVuc29yfSBmcm9tICcuLi8uLi90ZW5zb3JfdXRpbF9lbnYnO1xuaW1wb3J0IHtUZW5zb3JMaWtlfSBmcm9tICcuLi8uLi90eXBlcyc7XG5pbXBvcnQgKiBhcyB1dGlsIGZyb20gJy4uLy4uL3V0aWwnO1xuaW1wb3J0IHthZGR9IGZyb20gJy4uL2FkZCc7XG5pbXBvcnQgKiBhcyBicm9hZGNhc3RfdXRpbCBmcm9tICcuLi9icm9hZGNhc3RfdXRpbCc7XG5pbXBvcnQgKiBhcyBjb252X3V0aWwgZnJvbSAnLi4vY29udl91dGlsJztcbmltcG9ydCB7ZGVwdGh3aXNlQ29udjJkIGFzIHVuZnVzZWREZXB0aHdpc2VDb252MmR9IGZyb20gJy4uL2RlcHRod2lzZV9jb252MmQnO1xuaW1wb3J0IHtkZXB0aHdpc2VDb252MmROYXRpdmVCYWNrcHJvcEZpbHRlcn0gZnJvbSAnLi4vZGVwdGh3aXNlX2NvbnYyZF9uYXRpdmVfYmFja3Byb3BfZmlsdGVyJztcbmltcG9ydCB7ZGVwdGh3aXNlQ29udjJkTmF0aXZlQmFja3Byb3BJbnB1dH0gZnJvbSAnLi4vZGVwdGh3aXNlX2NvbnYyZF9uYXRpdmVfYmFja3Byb3BfaW5wdXQnO1xuaW1wb3J0IHtBY3RpdmF0aW9ufSBmcm9tICcuLi9mdXNlZF90eXBlcyc7XG5pbXBvcnQge2FwcGx5QWN0aXZhdGlvbiwgZ2V0RnVzZWRCaWFzR3JhZGllbnQsIGdldEZ1c2VkRHlBY3RpdmF0aW9uLCBzaG91bGRGdXNlfSBmcm9tICcuLi9mdXNlZF91dGlsJztcbmltcG9ydCB7b3B9IGZyb20gJy4uL29wZXJhdGlvbic7XG5pbXBvcnQge3Jlc2hhcGV9IGZyb20gJy4uL3Jlc2hhcGUnO1xuXG4vKipcbiAqIENvbXB1dGVzIGRlcHRod2lzZSAyRCBjb252b2x1dGlvbiwgb3B0aW9uYWxseSBmdXNlZCB3aXRoIGFkZGluZyBhXG4gKiBiaWFzIGFuZCBhcHBseWluZyBhbiBhY3RpdmF0aW9uLlxuICpcbiAqIEdpdmVuIGEgNEQgYGlucHV0YCBhcnJheSBhbmQgYSBgZmlsdGVyYCBhcnJheSBvZiBzaGFwZVxuICogYFtmaWx0ZXJIZWlnaHQsIGZpbHRlcldpZHRoLCBpbkNoYW5uZWxzLCBjaGFubmVsTXVsdGlwbGllcl1gIGNvbnRhaW5pbmdcbiAqIGBpbkNoYW5uZWxzYCBjb252b2x1dGlvbmFsIGZpbHRlcnMgb2YgZGVwdGggMSwgdGhpcyBvcCBhcHBsaWVzIGFcbiAqIGRpZmZlcmVudCBmaWx0ZXIgdG8gZWFjaCBpbnB1dCBjaGFubmVsIChleHBhbmRpbmcgZnJvbSAxIGNoYW5uZWwgdG9cbiAqIGBjaGFubmVsTXVsdGlwbGllcmAgY2hhbm5lbHMgZm9yIGVhY2gpLCB0aGVuIGNvbmNhdGVuYXRlcyB0aGUgcmVzdWx0c1xuICogdG9nZXRoZXIuIFRoZSBvdXRwdXQgaGFzIGBpbkNoYW5uZWxzICogY2hhbm5lbE11bHRpcGxpZXJgIGNoYW5uZWxzLlxuICpcbiAqIFNlZVxuICogW2h0dHBzOi8vd3d3LnRlbnNvcmZsb3cub3JnL2FwaV9kb2NzL3B5dGhvbi90Zi9ubi9kZXB0aHdpc2VfY29udjJkXShcbiAqICAgICBodHRwczovL3d3dy50ZW5zb3JmbG93Lm9yZy9hcGlfZG9jcy9weXRob24vdGYvbm4vZGVwdGh3aXNlX2NvbnYyZClcbiAqIGZvciBtb3JlIGRldGFpbHMuXG4gKlxuICogQHBhcmFtIG9iaiBBbiBvYmplY3Qgd2l0aCB0aGUgZm9sbG93aW5nIHByb3BlcnRpZXM6XG4gKiBAcGFyYW0geCBUaGUgaW5wdXQgdGVuc29yLCBvZiByYW5rIDQgb3IgcmFuayAzLCBvZiBzaGFwZVxuICogICAgIGBbYmF0Y2gsIGhlaWdodCwgd2lkdGgsIGluQ2hhbm5lbHNdYC4gSWYgcmFuayAzLCBiYXRjaCBvZiAxIGlzXG4gKiBhc3N1bWVkLlxuICogQHBhcmFtIGZpbHRlciBUaGUgZmlsdGVyIHRlbnNvciwgcmFuayA0LCBvZiBzaGFwZVxuICogICAgIGBbZmlsdGVySGVpZ2h0LCBmaWx0ZXJXaWR0aCwgaW5DaGFubmVscywgY2hhbm5lbE11bHRpcGxpZXJdYC5cbiAqIEBwYXJhbSBzdHJpZGVzIFRoZSBzdHJpZGVzIG9mIHRoZSBjb252b2x1dGlvbjogYFtzdHJpZGVIZWlnaHQsXG4gKiBzdHJpZGVXaWR0aF1gLiBJZiBzdHJpZGVzIGlzIGEgc2luZ2xlIG51bWJlciwgdGhlbiBgc3RyaWRlSGVpZ2h0ID09XG4gKiBzdHJpZGVXaWR0aGAuXG4gKiBAcGFyYW0gcGFkIFRoZSB0eXBlIG9mIHBhZGRpbmcgYWxnb3JpdGhtLlxuICogICAtIGBzYW1lYCBhbmQgc3RyaWRlIDE6IG91dHB1dCB3aWxsIGJlIG9mIHNhbWUgc2l6ZSBhcyBpbnB1dCxcbiAqICAgICAgIHJlZ2FyZGxlc3Mgb2YgZmlsdGVyIHNpemUuXG4gKiAgIC0gYHZhbGlkYDogb3V0cHV0IHdpbGwgYmUgc21hbGxlciB0aGFuIGlucHV0IGlmIGZpbHRlciBpcyBsYXJnZXJcbiAqICAgICAgIHRoYW4gMXgxLlxuICogICAtIEZvciBtb3JlIGluZm8sIHNlZSB0aGlzIGd1aWRlOlxuICogICAgIFtodHRwczovL3d3dy50ZW5zb3JmbG93Lm9yZy9hcGlfZG9jcy9weXRob24vdGYvbm4vY29udm9sdXRpb25dKFxuICogICAgICAgICAgaHR0cHM6Ly93d3cudGVuc29yZmxvdy5vcmcvYXBpX2RvY3MvcHl0aG9uL3RmL25uL2NvbnZvbHV0aW9uKVxuICogQHBhcmFtIGRpbGF0aW9ucyBUaGUgZGlsYXRpb24gcmF0ZXM6IGBbZGlsYXRpb25IZWlnaHQsIGRpbGF0aW9uV2lkdGhdYFxuICogICAgIGluIHdoaWNoIHdlIHNhbXBsZSBpbnB1dCB2YWx1ZXMgYWNyb3NzIHRoZSBoZWlnaHQgYW5kIHdpZHRoIGRpbWVuc2lvbnNcbiAqICAgICBpbiBhdHJvdXMgY29udm9sdXRpb24uIERlZmF1bHRzIHRvIGBbMSwgMV1gLiBJZiBgcmF0ZWAgaXMgYSBzaW5nbGVcbiAqICAgICBudW1iZXIsIHRoZW4gYGRpbGF0aW9uSGVpZ2h0ID09IGRpbGF0aW9uV2lkdGhgLiBJZiBpdCBpcyBncmVhdGVyIHRoYW5cbiAqICAgICAxLCB0aGVuIGFsbCB2YWx1ZXMgb2YgYHN0cmlkZXNgIG11c3QgYmUgMS5cbiAqIEBwYXJhbSBkYXRhRm9ybWF0OiBBbiBvcHRpb25hbCBzdHJpbmcgZnJvbTogXCJOSFdDXCIsIFwiTkNIV1wiLiBEZWZhdWx0cyB0b1xuICogICAgIFwiTkhXQ1wiLiBTcGVjaWZ5IHRoZSBkYXRhIGZvcm1hdCBvZiB0aGUgaW5wdXQgYW5kIG91dHB1dCBkYXRhLiBXaXRoIHRoZVxuICogICAgIGRlZmF1bHQgZm9ybWF0IFwiTkhXQ1wiLCB0aGUgZGF0YSBpcyBzdG9yZWQgaW4gdGhlIG9yZGVyIG9mOiBbYmF0Y2gsXG4gKiAgICAgaGVpZ2h0LCB3aWR0aCwgY2hhbm5lbHNdLiBPbmx5IFwiTkhXQ1wiIGlzIGN1cnJlbnRseSBzdXBwb3J0ZWQuXG4gKiBAcGFyYW0gZGltUm91bmRpbmdNb2RlIEEgc3RyaW5nIGZyb206ICdjZWlsJywgJ3JvdW5kJywgJ2Zsb29yJy4gSWYgbm9uZSBpc1xuICogICAgIHByb3ZpZGVkLCBpdCB3aWxsIGRlZmF1bHQgdG8gdHJ1bmNhdGUuXG4gKiBAcGFyYW0gYmlhcyBUZW5zb3IgdG8gYmUgYWRkZWQgdG8gdGhlIHJlc3VsdC5cbiAqIEBwYXJhbSBhY3RpdmF0aW9uIE5hbWUgb2YgYWN0aXZhdGlvbiBrZXJuZWwgKGRlZmF1bHRzIHRvIGBsaW5lYXJgKS5cbiAqIEBwYXJhbSBwcmVsdUFjdGl2YXRpb25XZWlnaHRzIFRlbnNvciBvZiBwcmVsdSB3ZWlnaHRzIHRvIGJlIGFwcGxpZWQgYXMgcGFydFxuICogICAgIG9mIGEgYHByZWx1YCBhY3RpdmF0aW9uLCB0eXBpY2FsbHkgdGhlIHNhbWUgc2hhcGUgYXMgYHhgLlxuICogQHBhcmFtIGxlYWt5cmVsdUFscGhhIE9wdGlvbmFsLiBBbHBoYSB0byBiZSBhcHBsaWVkIGFzIHBhcnQgb2YgYSBgbGVha3lyZWx1YFxuICogICAgIGFjdGl2YXRpb24uXG4gKi9cbmZ1bmN0aW9uIGZ1c2VkRGVwdGh3aXNlQ29udjJkXzxUIGV4dGVuZHMgVGVuc29yM0R8VGVuc29yNEQ+KHtcbiAgeCxcbiAgZmlsdGVyLFxuICBzdHJpZGVzLFxuICBwYWQsXG4gIGRhdGFGb3JtYXQgPSAnTkhXQycsXG4gIGRpbGF0aW9ucyA9IFsxLCAxXSxcbiAgZGltUm91bmRpbmdNb2RlLFxuICBiaWFzLFxuICBhY3RpdmF0aW9uID0gJ2xpbmVhcicsXG4gIHByZWx1QWN0aXZhdGlvbldlaWdodHMsXG4gIGxlYWt5cmVsdUFscGhhXG59OiB7XG4gIHg6IFR8VGVuc29yTGlrZSxcbiAgZmlsdGVyOiBUZW5zb3I0RHxUZW5zb3JMaWtlLFxuICBzdHJpZGVzOiBbbnVtYmVyLCBudW1iZXJdfG51bWJlcixcbiAgcGFkOiAndmFsaWQnfCdzYW1lJ3xudW1iZXIsXG4gIGRhdGFGb3JtYXQ/OiAnTkhXQyd8J05DSFcnLFxuICBkaWxhdGlvbnM/OiBbbnVtYmVyLCBudW1iZXJdfG51bWJlcixcbiAgZGltUm91bmRpbmdNb2RlPzogJ2Zsb29yJ3wncm91bmQnfCdjZWlsJyxcbiAgYmlhcz86IFRlbnNvcnxUZW5zb3JMaWtlLFxuICBhY3RpdmF0aW9uPzogQWN0aXZhdGlvbixcbiAgcHJlbHVBY3RpdmF0aW9uV2VpZ2h0cz86IFRlbnNvcixcbiAgbGVha3lyZWx1QWxwaGE/OiBudW1iZXJcbn0pOiBUIHtcbiAgaWYgKHNob3VsZEZ1c2UoRU5HSU5FLnN0YXRlLmdyYWRpZW50RGVwdGgsIGFjdGl2YXRpb24pID09PSBmYWxzZSkge1xuICAgIGxldCByZXN1bHQgPSB1bmZ1c2VkRGVwdGh3aXNlQ29udjJkKFxuICAgICAgICB4LCBmaWx0ZXIsIHN0cmlkZXMsIHBhZCwgZGF0YUZvcm1hdCwgZGlsYXRpb25zLCBkaW1Sb3VuZGluZ01vZGUpO1xuICAgIGlmIChiaWFzICE9IG51bGwpIHtcbiAgICAgIHJlc3VsdCA9IGFkZChyZXN1bHQsIGJpYXMpO1xuICAgIH1cblxuICAgIHJldHVybiBhcHBseUFjdGl2YXRpb24oXG4gICAgICAgICAgICAgICByZXN1bHQsIGFjdGl2YXRpb24sIHByZWx1QWN0aXZhdGlvbldlaWdodHMsIGxlYWt5cmVsdUFscGhhKSBhcyBUO1xuICB9XG5cbiAgY29uc3QgJHggPSBjb252ZXJ0VG9UZW5zb3IoeCwgJ3gnLCAnZGVwdGh3aXNlQ29udjJkJywgJ2Zsb2F0MzInKTtcbiAgY29uc3QgJGZpbHRlciA9XG4gICAgICBjb252ZXJ0VG9UZW5zb3IoZmlsdGVyLCAnZmlsdGVyJywgJ2RlcHRod2lzZUNvbnYyZCcsICdmbG9hdDMyJyk7XG5cbiAgbGV0IHg0RCA9ICR4IGFzIFRlbnNvcjREO1xuICBsZXQgcmVzaGFwZWRUbzREID0gZmFsc2U7XG4gIGlmICgkeC5yYW5rID09PSAzKSB7XG4gICAgcmVzaGFwZWRUbzREID0gdHJ1ZTtcbiAgICB4NEQgPSByZXNoYXBlKCR4LCBbMSwgJHguc2hhcGVbMF0sICR4LnNoYXBlWzFdLCAkeC5zaGFwZVsyXV0pO1xuICB9XG4gIHV0aWwuYXNzZXJ0KFxuICAgICAgeDRELnJhbmsgPT09IDQsXG4gICAgICAoKSA9PiBgRXJyb3IgaW4gZnVzZWQgZGVwdGh3aXNlQ29udjJkOiBpbnB1dCBtdXN0IGJlIHJhbmsgNCwgYnV0IGdvdCBgICtcbiAgICAgICAgICBgcmFuayAke3g0RC5yYW5rfS5gKTtcbiAgdXRpbC5hc3NlcnQoXG4gICAgICAkZmlsdGVyLnJhbmsgPT09IDQsXG4gICAgICAoKSA9PiBgRXJyb3IgaW4gZnVzZWQgZGVwdGh3aXNlQ29udjJkOiBmaWx0ZXIgbXVzdCBiZSByYW5rIDQsIGAgK1xuICAgICAgICAgIGBidXQgZ290IHJhbmsgJHskZmlsdGVyLnJhbmt9LmApO1xuICB1dGlsLmFzc2VydChcbiAgICAgIHg0RC5zaGFwZVszXSA9PT0gJGZpbHRlci5zaGFwZVsyXSxcbiAgICAgICgpID0+IGBFcnJvciBpbiBmdXNlZCBkZXB0aHdpc2VDb252MmQ6IG51bWJlciBvZiBpbnB1dCBjaGFubmVscyBgICtcbiAgICAgICAgICBgKCR7eDRELnNoYXBlWzNdfSkgbXVzdCBtYXRjaCB0aGUgaW5DaGFubmVscyBkaW1lbnNpb24gaW4gYCArXG4gICAgICAgICAgYGZpbHRlciAkeyRmaWx0ZXIuc2hhcGVbMl19LmApO1xuICBpZiAoZGlsYXRpb25zID09IG51bGwpIHtcbiAgICBkaWxhdGlvbnMgPSBbMSwgMV07XG4gIH1cbiAgdXRpbC5hc3NlcnQoXG4gICAgICBjb252X3V0aWwuZWl0aGVyU3RyaWRlc09yRGlsYXRpb25zQXJlT25lKHN0cmlkZXMsIGRpbGF0aW9ucyksXG4gICAgICAoKSA9PlxuICAgICAgICAgICdFcnJvciBpbiBmdXNlZCBkZXB0aHdpc2VDb252MmQ6IEVpdGhlciBzdHJpZGVzIG9yIGRpbGF0aW9ucyBtdXN0ICcgK1xuICAgICAgICAgIGBiZSAxLiBHb3Qgc3RyaWRlcyAke3N0cmlkZXN9IGFuZCBkaWxhdGlvbnMgJyR7ZGlsYXRpb25zfSdgKTtcbiAgY29udl91dGlsLmNoZWNrUGFkT25EaW1Sb3VuZGluZ01vZGUoXG4gICAgICAnZnVzZWQgZGVwdGh3aXNlQ29udjJkJywgcGFkLCBkaW1Sb3VuZGluZ01vZGUpO1xuICBjb25zdCBjb252SW5mbyA9IGNvbnZfdXRpbC5jb21wdXRlQ29udjJESW5mbyhcbiAgICAgIHg0RC5zaGFwZSwgJGZpbHRlci5zaGFwZSwgc3RyaWRlcywgZGlsYXRpb25zLCBwYWQsIGRpbVJvdW5kaW5nTW9kZSxcbiAgICAgIHRydWUgLyogZGVwdGh3aXNlICovKTtcblxuICBsZXQgJGJpYXM6IFRlbnNvcjtcbiAgaWYgKGJpYXMgIT0gbnVsbCkge1xuICAgICRiaWFzID0gY29udmVydFRvVGVuc29yKGJpYXMsICdiaWFzJywgJ2Z1c2VkIGNvbnYyZCcpO1xuICAgIFskYmlhc10gPSBtYWtlVHlwZXNNYXRjaCgkYmlhcywgJHgpO1xuXG4gICAgYnJvYWRjYXN0X3V0aWwuYXNzZXJ0QW5kR2V0QnJvYWRjYXN0U2hhcGUoY29udkluZm8ub3V0U2hhcGUsICRiaWFzLnNoYXBlKTtcbiAgfVxuXG4gIGxldCAkcHJlbHVBY3RpdmF0aW9uV2VpZ2h0czogVGVuc29yO1xuICBpZiAocHJlbHVBY3RpdmF0aW9uV2VpZ2h0cyAhPSBudWxsKSB7XG4gICAgJHByZWx1QWN0aXZhdGlvbldlaWdodHMgPSBjb252ZXJ0VG9UZW5zb3IoXG4gICAgICAgIHByZWx1QWN0aXZhdGlvbldlaWdodHMsICdwcmVsdSB3ZWlnaHRzJywgJ2Z1c2VkIGRlcHRod2lzZUNvbnYyZCcpO1xuICB9XG5cbiAgY29uc3QgZ3JhZCA9IChkeTogVGVuc29yNEQsIHNhdmVkOiBUZW5zb3JbXSkgPT4ge1xuICAgIHV0aWwuYXNzZXJ0KFxuICAgICAgICBjb252X3V0aWwudHVwbGVWYWx1ZXNBcmVPbmUoZGlsYXRpb25zKSxcbiAgICAgICAgKCkgPT4gJ0Vycm9yIGluIGdyYWRpZW50IG9mIGZ1c2VkIGRlcHRod2lzZUNvbnYyZDogZGlsYXRpb24gcmF0ZXMgJyArXG4gICAgICAgICAgICBgZ3JlYXRlciB0aGFuIDEgYXJlIG5vdCB5ZXQgc3VwcG9ydGVkLiBHb3QgZGlsYXRpb25zIGAgK1xuICAgICAgICAgICAgYCcke2RpbGF0aW9uc30nYCk7XG4gICAgY29uc3QgWyRmaWx0ZXIsIHg0RCwgeSwgYmlhc10gPSBzYXZlZDtcblxuICAgIGNvbnN0IGR5QWN0aXZhdGlvbiA9IGdldEZ1c2VkRHlBY3RpdmF0aW9uKGR5LCB5LCBhY3RpdmF0aW9uKSBhcyBUZW5zb3I0RDtcblxuICAgIGNvbnN0IHhEZXIgPSBkZXB0aHdpc2VDb252MmROYXRpdmVCYWNrcHJvcElucHV0KFxuICAgICAgICAoeDREIGFzIFRlbnNvcjREKS5zaGFwZSwgZHlBY3RpdmF0aW9uLCAkZmlsdGVyIGFzIFRlbnNvcjRELCBzdHJpZGVzLFxuICAgICAgICBwYWQsIGRpbGF0aW9ucywgZGltUm91bmRpbmdNb2RlKTtcbiAgICBjb25zdCBmaWx0ZXJEZXIgPSBkZXB0aHdpc2VDb252MmROYXRpdmVCYWNrcHJvcEZpbHRlcihcbiAgICAgICAgeDREIGFzIFRlbnNvcjRELCBkeUFjdGl2YXRpb24sICgkZmlsdGVyIGFzIFRlbnNvcjREKS5zaGFwZSwgc3RyaWRlcyxcbiAgICAgICAgcGFkLCBkaWxhdGlvbnMsIGRpbVJvdW5kaW5nTW9kZSk7XG5cbiAgICBpZiAoYmlhcyAhPSBudWxsKSB7XG4gICAgICBjb25zdCBiaWFzRGVyID0gZ2V0RnVzZWRCaWFzR3JhZGllbnQoJGJpYXMsIGR5QWN0aXZhdGlvbik7XG4gICAgICByZXR1cm4gW3hEZXIsIGZpbHRlckRlciwgYmlhc0Rlcl07XG4gICAgfVxuICAgIHJldHVybiBbeERlciwgZmlsdGVyRGVyXTtcbiAgfTtcblxuICBjb25zdCBpbnB1dHM6IEZ1c2VkRGVwdGh3aXNlQ29udjJESW5wdXRzID0ge1xuICAgIHg6IHg0RCxcbiAgICBmaWx0ZXI6ICRmaWx0ZXIsXG4gICAgYmlhczogJGJpYXMsXG4gICAgcHJlbHVBY3RpdmF0aW9uV2VpZ2h0czogJHByZWx1QWN0aXZhdGlvbldlaWdodHNcbiAgfTtcbiAgY29uc3QgYXR0cnM6IEZ1c2VkRGVwdGh3aXNlQ29udjJEQXR0cnMgPSB7XG4gICAgc3RyaWRlcyxcbiAgICBwYWQsXG4gICAgZGF0YUZvcm1hdCxcbiAgICBkaWxhdGlvbnMsXG4gICAgZGltUm91bmRpbmdNb2RlLFxuICAgIGFjdGl2YXRpb24sXG4gICAgbGVha3lyZWx1QWxwaGFcbiAgfTtcblxuICAvLyBEZXBlbmRpbmcgb24gdGhlIHRoZSBwYXJhbXMgcGFzc2VkIGluIHdlIHdpbGwgaGF2ZSBkaWZmZXJlbnQgbnVtYmVyIG9mXG4gIC8vIGlucHV0cyBhbmQgdGh1cyBhIGEgZGlmZmVyZW50IG51bWJlciBvZiBlbGVtZW50cyBpbiB0aGUgZ3JhZGllbnQuXG4gIGlmIChiaWFzID09IG51bGwpIHtcbiAgICBjb25zdCBjdXN0b21PcCA9XG4gICAgICAgIGN1c3RvbUdyYWQoKHg0RDogVGVuc29yNEQsIGZpbHRlcjogVGVuc29yNEQsIHNhdmU6IEdyYWRTYXZlRnVuYykgPT4ge1xuICAgICAgICAgIC8vIHRzbGludDpkaXNhYmxlLW5leHQtbGluZTogbm8tdW5uZWNlc3NhcnktdHlwZS1hc3NlcnRpb25cbiAgICAgICAgICBsZXQgcmVzOiBUZW5zb3I0RHxUZW5zb3IzRCA9IEVOR0lORS5ydW5LZXJuZWwoXG4gICAgICAgICAgICAgIEZ1c2VkRGVwdGh3aXNlQ29udjJELCBpbnB1dHMgYXMge30gYXMgTmFtZWRUZW5zb3JNYXAsXG4gICAgICAgICAgICAgIGF0dHJzIGFzIHt9IGFzIE5hbWVkQXR0ck1hcCk7XG5cbiAgICAgICAgICBzYXZlKFtmaWx0ZXIsIHg0RCwgcmVzXSk7XG5cbiAgICAgICAgICBpZiAocmVzaGFwZWRUbzREKSB7XG4gICAgICAgICAgICAvLyB0c2xpbnQ6ZGlzYWJsZS1uZXh0LWxpbmU6IG5vLXVubmVjZXNzYXJ5LXR5cGUtYXNzZXJ0aW9uXG4gICAgICAgICAgICByZXMgPSByZXNoYXBlKHJlcywgW3Jlcy5zaGFwZVsxXSwgcmVzLnNoYXBlWzJdLCByZXMuc2hhcGVbM11dKSBhc1xuICAgICAgICAgICAgICAgIFRlbnNvcjNEO1xuICAgICAgICAgIH1cblxuICAgICAgICAgIHJldHVybiB7dmFsdWU6IHJlcywgZ3JhZEZ1bmM6IGdyYWR9O1xuICAgICAgICB9KTtcbiAgICByZXR1cm4gY3VzdG9tT3AoeDRELCAkZmlsdGVyKSBhcyBUO1xuICB9IGVsc2Uge1xuICAgIGNvbnN0IGN1c3RvbU9wV2l0aEJpYXMgPSBjdXN0b21HcmFkKFxuICAgICAgICAoeDREOiBUZW5zb3I0RCwgZmlsdGVyOiBUZW5zb3I0RCwgYmlhczogVGVuc29yLCBzYXZlOiBHcmFkU2F2ZUZ1bmMpID0+IHtcbiAgICAgICAgICAvLyB0c2xpbnQ6ZGlzYWJsZS1uZXh0LWxpbmU6IG5vLXVubmVjZXNzYXJ5LXR5cGUtYXNzZXJ0aW9uXG4gICAgICAgICAgbGV0IHJlczogVGVuc29yNER8VGVuc29yM0QgPSBFTkdJTkUucnVuS2VybmVsKFxuICAgICAgICAgICAgICBGdXNlZERlcHRod2lzZUNvbnYyRCwgaW5wdXRzIGFzIHt9IGFzIE5hbWVkVGVuc29yTWFwLFxuICAgICAgICAgICAgICBhdHRycyBhcyB7fSBhcyBOYW1lZEF0dHJNYXApO1xuXG4gICAgICAgICAgc2F2ZShbZmlsdGVyLCB4NEQsIHJlcywgYmlhc10pO1xuXG4gICAgICAgICAgaWYgKHJlc2hhcGVkVG80RCkge1xuICAgICAgICAgICAgLy8gdHNsaW50OmRpc2FibGUtbmV4dC1saW5lOiBuby11bm5lY2Vzc2FyeS10eXBlLWFzc2VydGlvblxuICAgICAgICAgICAgcmVzID0gcmVzaGFwZShyZXMsIFtyZXMuc2hhcGVbMV0sIHJlcy5zaGFwZVsyXSwgcmVzLnNoYXBlWzNdXSkgYXNcbiAgICAgICAgICAgICAgICBUZW5zb3IzRDtcbiAgICAgICAgICB9XG5cbiAgICAgICAgICByZXR1cm4ge3ZhbHVlOiByZXMsIGdyYWRGdW5jOiBncmFkfTtcbiAgICAgICAgfSk7XG5cbiAgICByZXR1cm4gY3VzdG9tT3BXaXRoQmlhcyh4NEQsICRmaWx0ZXIsICRiaWFzKSBhcyBUO1xuICB9XG59XG5leHBvcnQgY29uc3QgZGVwdGh3aXNlQ29udjJkID0gb3Aoe2Z1c2VkRGVwdGh3aXNlQ29udjJkX30pO1xuIl19","/**\n * @license\n * Copyright 2019 Google LLC. All Rights Reserved.\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n * =============================================================================\n */\nimport { ENGINE } from '../../engine';\nimport { customGrad } from '../../gradients';\nimport { _FusedMatMul } from '../../kernel_names';\nimport { makeTypesMatch } from '../../tensor_util';\nimport { convertToTensor } from '../../tensor_util_env';\nimport * as util from '../../util';\nimport { add } from '../add';\nimport * as broadcast_util from '../broadcast_util';\nimport { applyActivation, getFusedBiasGradient, getFusedDyActivation, shouldFuse } from '../fused_util';\nimport { matMul as unfusedMatMul } from '../mat_mul';\nimport { op } from '../operation';\nimport { reshape } from '../reshape';\n/**\n * Computes the dot product of two matrices with optional activation and bias.\n *\n * ```js\n * const a = tf.tensor2d([-1, -2], [1, 2]);\n * const b = tf.tensor2d([1, 2, 3, 4], [2, 2]);\n * const bias = tf.tensor2d([1, 2], [1, 2]);\n *\n * tf.fused.matMul({a, b, bias, activation: 'relu'}).print();\n * ```\n *\n * @param obj An object with the following properties:\n * - `a` First matrix in dot product operation.\n * - `b` Second matrix in dot product operation.\n * - `transposeA` If true, `a` is transposed before multiplication.\n * - `transposeB` If true, `b` is transposed before multiplication.\n * - `bias` Matrix to be added to the result.\n * - `activation` Name of activation kernel (defaults to `linear`).\n * - `preluActivationWeights` Tensor of prelu weights.\n * - `leakyreluAlpha` Alpha of leakyrelu.\n */\nfunction fusedMatMul_({ a, b, transposeA = false, transposeB = false, bias, activation = 'linear', preluActivationWeights, leakyreluAlpha = 0.2, }) {\n if (shouldFuse(ENGINE.state.gradientDepth, activation) === false) {\n let result = unfusedMatMul(a, b, transposeA, transposeB);\n if (bias != null) {\n result = add(result, bias);\n }\n return applyActivation(result, activation, preluActivationWeights, leakyreluAlpha);\n }\n let $a = convertToTensor(a, 'a', 'fused matMul');\n let $b = convertToTensor(b, 'b', 'fused matMul');\n [$a, $b] = makeTypesMatch($a, $b);\n const innerShapeA = transposeA ? $a.shape[$a.rank - 2] : $a.shape[$a.rank - 1];\n const innerShapeB = transposeB ? $b.shape[$b.rank - 1] : $b.shape[$b.rank - 2];\n const outerShapeA = transposeA ? $a.shape[$a.rank - 1] : $a.shape[$a.rank - 2];\n const outerShapeB = transposeB ? $b.shape[$b.rank - 2] : $b.shape[$b.rank - 1];\n const outerDimsA = $a.shape.slice(0, -2);\n const outerDimsB = $b.shape.slice(0, -2);\n const batchDimA = util.sizeFromShape(outerDimsA);\n const batchDimB = util.sizeFromShape(outerDimsB);\n util.assert(innerShapeA === innerShapeB, () => `Error in fused matMul: inner shapes (${innerShapeA}) and (` +\n `${innerShapeB}) of Tensors with shapes ${$a.shape} and ` +\n `${$b.shape} and transposeA=${transposeA}` +\n ` and transposeB=${transposeB} must match.`);\n const outShapeOuterDims = broadcast_util.assertAndGetBroadcastShape($a.shape.slice(0, -2), $b.shape.slice(0, -2));\n const outShape = outShapeOuterDims.concat([outerShapeA, outerShapeB]);\n const a3D = transposeA ?\n reshape($a, [batchDimA, innerShapeA, outerShapeA]) :\n reshape($a, [batchDimA, outerShapeA, innerShapeA]);\n const b3D = transposeB ?\n reshape($b, [batchDimB, outerShapeB, innerShapeB]) :\n reshape($b, [batchDimB, innerShapeB, outerShapeB]);\n let $bias;\n if (bias != null) {\n $bias = convertToTensor(bias, 'bias', 'fused matMul');\n [$bias] = makeTypesMatch($bias, $a);\n broadcast_util.assertAndGetBroadcastShape(outShape, $bias.shape);\n }\n let $preluActivationWeights;\n if (preluActivationWeights != null) {\n $preluActivationWeights = convertToTensor(preluActivationWeights, 'prelu weights', 'fused matMul');\n }\n const grad = (dy, saved) => {\n const [a3D, b3D, y, $bias] = saved;\n // we reshape dy because the result of the forward is not\n // necessarily going to be a 3d tensor due to a reshape done at the end of\n // the customOp.\n const dyActivation = getFusedDyActivation(reshape(dy, y.shape), y, activation);\n let aDer;\n let bDer;\n if (!transposeA && !transposeB) {\n aDer = unfusedMatMul(dyActivation, b3D, false, true);\n bDer = unfusedMatMul(a3D, dyActivation, true, false);\n }\n else if (!transposeA && transposeB) {\n aDer = unfusedMatMul(dyActivation, b3D, false, false);\n bDer = unfusedMatMul(dyActivation, a3D, true, false);\n }\n else if (transposeA && !transposeB) {\n aDer = unfusedMatMul(b3D, dyActivation, false, true);\n bDer = unfusedMatMul(a3D, dyActivation, false, false);\n }\n else {\n aDer = unfusedMatMul(b3D, dyActivation, true, true);\n bDer = unfusedMatMul(dyActivation, a3D, true, true);\n }\n if (bias != null) {\n const biasDer = getFusedBiasGradient($bias, dyActivation);\n return [aDer, bDer, biasDer];\n }\n else {\n return [aDer, bDer];\n }\n };\n const inputs = {\n a: a3D,\n b: b3D,\n bias: $bias,\n preluActivationWeights: $preluActivationWeights\n };\n const attrs = { transposeA, transposeB, activation, leakyreluAlpha };\n // Depending on the the params passed in we will have different number of\n // inputs and thus a a different number of elements in the gradient.\n if (bias == null) {\n const customOp = customGrad((a3D, b3D, save) => {\n const res = \n // tslint:disable-next-line: no-unnecessary-type-assertion\n ENGINE.runKernel(_FusedMatMul, inputs, attrs);\n save([a3D, b3D, res]);\n return { value: reshape(res, outShape), gradFunc: grad };\n });\n return customOp(a3D, b3D);\n }\n else {\n const customOpWithBias = customGrad((a3D, b3D, $bias, save) => {\n const res = \n // tslint:disable-next-line: no-unnecessary-type-assertion\n ENGINE.runKernel(_FusedMatMul, inputs, attrs);\n save([a3D, b3D, res, $bias]);\n return { value: reshape(res, outShape), gradFunc: grad };\n });\n return customOpWithBias(a3D, b3D, $bias);\n }\n}\nexport const matMul = op({ fusedMatMul_ });\n//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibWF0X211bC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uLy4uLy4uL3RmanMtY29yZS9zcmMvb3BzL2Z1c2VkL21hdF9tdWwudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUE7Ozs7Ozs7Ozs7Ozs7OztHQWVHO0FBRUgsT0FBTyxFQUFDLE1BQU0sRUFBQyxNQUFNLGNBQWMsQ0FBQztBQUNwQyxPQUFPLEVBQUMsVUFBVSxFQUFDLE1BQU0saUJBQWlCLENBQUM7QUFDM0MsT0FBTyxFQUFDLFlBQVksRUFBd0MsTUFBTSxvQkFBb0IsQ0FBQztBQUl2RixPQUFPLEVBQUMsY0FBYyxFQUFDLE1BQU0sbUJBQW1CLENBQUM7QUFDakQsT0FBTyxFQUFDLGVBQWUsRUFBQyxNQUFNLHVCQUF1QixDQUFDO0FBRXRELE9BQU8sS0FBSyxJQUFJLE1BQU0sWUFBWSxDQUFDO0FBRW5DLE9BQU8sRUFBQyxHQUFHLEVBQUMsTUFBTSxRQUFRLENBQUM7QUFDM0IsT0FBTyxLQUFLLGNBQWMsTUFBTSxtQkFBbUIsQ0FBQztBQUVwRCxPQUFPLEVBQUMsZUFBZSxFQUFFLG9CQUFvQixFQUFFLG9CQUFvQixFQUFFLFVBQVUsRUFBQyxNQUFNLGVBQWUsQ0FBQztBQUN0RyxPQUFPLEVBQUMsTUFBTSxJQUFJLGFBQWEsRUFBQyxNQUFNLFlBQVksQ0FBQztBQUNuRCxPQUFPLEVBQUMsRUFBRSxFQUFDLE1BQU0sY0FBYyxDQUFDO0FBQ2hDLE9BQU8sRUFBQyxPQUFPLEVBQUMsTUFBTSxZQUFZLENBQUM7QUFFbkM7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7O0dBb0JHO0FBQ0gsU0FBUyxZQUFZLENBQUMsRUFDcEIsQ0FBQyxFQUNELENBQUMsRUFDRCxVQUFVLEdBQUcsS0FBSyxFQUNsQixVQUFVLEdBQUcsS0FBSyxFQUNsQixJQUFJLEVBQ0osVUFBVSxHQUFHLFFBQVEsRUFDckIsc0JBQXNCLEVBQ3RCLGNBQWMsR0FBRyxHQUFHLEdBVXJCO0lBQ0csSUFBSSxVQUFV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QUFFLEdBQWEsRUFBRSxLQUFhLEVBQUUsSUFBa0IsRUFBRSxFQUFFO1lBQ2xFLE1BQU0sR0FBRztZQUNMLDBEQUEwRDtZQUMxRCxNQUFNLENBQUMsU0FBUyxDQUNaLFlBQVksRUFBRSxNQUE4QixFQUM1QyxLQUEyQixDQUFXLENBQUM7WUFFL0MsSUFBSSxDQUFDLENBQUMsR0FBRyxFQUFFLEdBQUcsRUFBRSxHQUFHLEVBQUUsS0FBSyxDQUFDLENBQUMsQ0FBQztZQUU3QixPQUFPLEVBQUMsS0FBSyxFQUFFLE9BQU8sQ0FBQyxHQUFHLEVBQUUsUUFBUSxDQUFDLEVBQUUsUUFBUSxFQUFFLElBQUksRUFBQyxDQUFDO1FBQ3pELENBQUMsQ0FBQyxDQUFDO1FBRVAsT0FBTyxnQkFBZ0IsQ0FBQyxHQUFHLEVBQUUsR0FBRyxFQUFFLEtBQUssQ0FBQyxDQUFDO0tBQzFDO0FBQ0gsQ0FBQztBQUVELE1BQU0sQ0FBQyxNQUFNLE1BQU0sR0FBRyxFQUFFLENBQUMsRUFBQyxZQUFZLEVBQUMsQ0FBQyxDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiLyoqXG4gKiBAbGljZW5zZVxuICogQ29weXJpZ2h0IDIwMTkgR29vZ2xlIExMQy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC5cbiAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSBcIkxpY2Vuc2VcIik7XG4gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuXG4gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXRcbiAqXG4gKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjBcbiAqXG4gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlXG4gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiBcIkFTIElTXCIgQkFTSVMsXG4gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC5cbiAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmRcbiAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLlxuICogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbiAqL1xuXG5pbXBvcnQge0VOR0lORX0gZnJvbSAnLi4vLi4vZW5naW5lJztcbmltcG9ydCB7Y3VzdG9tR3JhZH0gZnJvbSAnLi4vLi4vZ3JhZGllbnRzJztcbmltcG9ydCB7X0Z1c2VkTWF0TXVsLCBfRnVzZWRNYXRNdWxBdHRycywgX0Z1c2VkTWF0TXVsSW5wdXRzfSBmcm9tICcuLi8uLi9rZXJuZWxfbmFtZXMnO1xuaW1wb3J0IHtOYW1lZEF0dHJNYXB9IGZyb20gJy4uLy4uL2tlcm5lbF9yZWdpc3RyeSc7XG5pbXBvcnQge1RlbnNvciwgVGVuc29yM0R9IGZyb20gJy4uLy4uL3RlbnNvcic7XG5pbXBvcnQge0dyYWRTYXZlRnVuYywgTmFtZWRUZW5zb3JNYXB9IGZyb20gJy4uLy4uL3RlbnNvcl90eXBlcyc7XG5pbXBvcnQge21ha2VUeXBlc01hdGNofSBmcm9tICcuLi8uLi90ZW5zb3JfdXRpbCc7XG5pbXBvcnQge2NvbnZlcnRUb1RlbnNvcn0gZnJvbSAnLi4vLi4vdGVuc29yX3V0aWxfZW52JztcbmltcG9ydCB7VGVuc29yTGlrZX0gZnJvbSAnLi4vLi4vdHlwZXMnO1xuaW1wb3J0ICogYXMgdXRpbCBmcm9tICcuLi8uLi91dGlsJztcblxuaW1wb3J0IHthZGR9IGZyb20gJy4uL2FkZCc7XG5pbXBvcnQgKiBhcyBicm9hZGNhc3RfdXRpbCBmcm9tICcuLi9icm9hZGNhc3RfdXRpbCc7XG5pbXBvcnQge0FjdGl2YXRpb259IGZyb20gJy4uL2Z1c2VkX3R5cGVzJztcbmltcG9ydCB7YXBwbHlBY3RpdmF0aW9uLCBnZXRGdXNlZEJpYXNHcmFkaWVudCwgZ2V0RnVzZWREeUFjdGl2YXRpb24sIHNob3VsZEZ1c2V9IGZyb20gJy4uL2Z1c2VkX3V0aWwnO1xuaW1wb3J0IHttYXRNdWwgYXMgdW5mdXNlZE1hdE11bH0gZnJvbSAnLi4vbWF0X211bCc7XG5pbXBvcnQge29wfSBmcm9tICcuLi9vcGVyYXRpb24nO1xuaW1wb3J0IHtyZXNoYXBlfSBmcm9tICcuLi9yZXNoYXBlJztcblxuLyoqXG4gKiBDb21wdXRlcyB0aGUgZG90IHByb2R1Y3Qgb2YgdHdvIG1hdHJpY2VzIHdpdGggb3B0aW9uYWwgYWN0aXZhdGlvbiBhbmQgYmlhcy5cbiAqXG4gKiBgYGBqc1xuICogY29uc3QgYSA9IHRmLnRlbnNvcjJkKFstMSwgLTJdLCBbMSwgMl0pO1xuICogY29uc3QgYiA9IHRmLnRlbnNvcjJkKFsxLCAyLCAzLCA0XSwgWzIsIDJdKTtcbiAqIGNvbnN0IGJpYXMgPSB0Zi50ZW5zb3IyZChbMSwgMl0sIFsxLCAyXSk7XG4gKlxuICogdGYuZnVzZWQubWF0TXVsKHthLCBiLCBiaWFzLCBhY3RpdmF0aW9uOiAncmVsdSd9KS5wcmludCgpO1xuICogYGBgXG4gKlxuICogQHBhcmFtIG9iaiBBbiBvYmplY3Qgd2l0aCB0aGUgZm9sbG93aW5nIHByb3BlcnRpZXM6XG4gKiAtIGBhYCBGaXJzdCBtYXRyaXggaW4gZG90IHByb2R1Y3Qgb3BlcmF0aW9uLlxuICogLSBgYmAgU2Vjb25kIG1hdHJpeCBpbiBkb3QgcHJvZHVjdCBvcGVyYXRpb24uXG4gKiAtIGB0cmFuc3Bvc2VBYCBJZiB0cnVlLCBgYWAgaXMgdHJhbnNwb3NlZCBiZWZvcmUgbXVsdGlwbGljYXRpb24uXG4gKiAtIGB0cmFuc3Bvc2VCYCBJZiB0cnVlLCBgYmAgaXMgdHJhbnNwb3NlZCBiZWZvcmUgbXVsdGlwbGljYXRpb24uXG4gKiAtIGBiaWFzYCBNYXRyaXggdG8gYmUgYWRkZWQgdG8gdGhlIHJlc3VsdC5cbiAqIC0gYGFjdGl2YXRpb25gIE5hbWUgb2YgYWN0aXZhdGlvbiBrZXJuZWwgKGRlZmF1bHRzIHRvIGBsaW5lYXJgKS5cbiAqIC0gYHByZWx1QWN0aXZhdGlvbldlaWdodHNgIFRlbnNvciBvZiBwcmVsdSB3ZWlnaHRzLlxuICogLSBgbGVha3lyZWx1QWxwaGFgIEFscGhhIG9mIGxlYWt5cmVsdS5cbiAqL1xuZnVuY3Rpb24gZnVzZWRNYXRNdWxfKHtcbiAgYSxcbiAgYixcbiAgdHJhbnNwb3NlQSA9IGZhbHNlLFxuICB0cmFuc3Bvc2VCID0gZmFsc2UsXG4gIGJpYXMsXG4gIGFjdGl2YXRpb24gPSAnbGluZWFyJyxcbiAgcHJlbHVBY3RpdmF0aW9uV2VpZ2h0cyxcbiAgbGVha3lyZWx1QWxwaGEgPSAwLjIsXG59OiB7XG4gIGE6IFRlbnNvcnxUZW5zb3JMaWtlLFxuICBiOiBUZW5zb3J8VGVuc29yTGlrZSxcbiAgdHJhbnNwb3NlQT86IGJvb2xlYW4sXG4gIHRyYW5zcG9zZUI/OiBib29sZWFuLFxuICBiaWFzPzogVGVuc29yfFRlbnNvckxpa2UsXG4gIGFjdGl2YXRpb24/OiBBY3RpdmF0aW9uLFxuICBwcmVsdUFjdGl2YXRpb25XZWlnaHRzPzogVGVuc29yXG4gIGxlYWt5cmVsdUFscGhhPzogbnVtYmVyXG59KTogVGVuc29yIHtcbiAgICBpZiAoc2hvdWxkRnVzZShFTkdJTkUuc3RhdGUuZ3JhZGllbnREZXB0aCwgYWN0aXZhdGlvbikgPT09IGZhbHNlKSB7XG4gICAgICBsZXQgcmVzdWx0ID0gdW5mdXNlZE1hdE11bChhLCBiLCB0cmFuc3Bvc2VBLCB0cmFuc3Bvc2VCKTtcbiAgICAgIGlmIChiaWFzICE9IG51bGwpIHtcbiAgICAgICAgcmVzdWx0ID0gYWRkKHJlc3VsdCwgYmlhcyk7XG4gICAgICB9XG5cbiAgICAgIHJldHVybiBhcHBseUFjdGl2YXRpb24oXG4gICAgICAgICAgICAgICAgIHJlc3VsdCwgYWN0aXZhdGlvbiwgcHJlbHVBY3RpdmF0aW9uV2VpZ2h0cywgbGVha3lyZWx1QWxwaGEpO1xuICAgIH1cblxuICAgIGxldCAkYSA9IGNvbnZlcnRUb1RlbnNvcihhLCAnYScsICdmdXNlZCBtYXRNdWwnKTtcbiAgICBsZXQgJGIgPSBjb252ZXJ0VG9UZW5zb3IoYiwgJ2InLCAnZnVzZWQgbWF0TXVsJyk7XG4gICAgWyRhLCAkYl0gPSBtYWtlVHlwZXNNYXRjaCgkYSwgJGIpO1xuXG4gICAgY29uc3QgaW5uZXJTaGFwZUEgPVxuICAgICAgICB0cmFuc3Bvc2VBID8gJGEuc2hhcGVbJGEucmFuayAtIDJdIDogJGEuc2hhcGVbJGEucmFuayAtIDFdO1xuICAgIGNvbnN0IGlubmVyU2hhcGVCID1cbiAgICAgICAgdHJhbnNwb3NlQiA/ICRiLnNoYXBlWyRiLnJhbmsgLSAxXSA6ICRiLnNoYXBlWyRiLnJhbmsgLSAyXTtcblxuICAgIGNvbnN0IG91dGVyU2hhcGVBID1cbiAgICAgICAgdHJhbnNwb3NlQSA/ICRhLnNoYXBlWyRhLnJhbmsgLSAxXSA6ICRhLnNoYXBlWyRhLnJhbmsgLSAyXTtcbiAgICBjb25zdCBvdXRlclNoYXBlQiA9XG4gICAgICAgIHRyYW5zcG9zZUIgPyAkYi5zaGFwZVskYi5yYW5rIC0gMl0gOiAkYi5zaGFwZVskYi5yYW5rIC0gMV07XG5cbiAgICBjb25zdCBvdXRlckRpbXNBID0gJGEuc2hhcGUuc2xpY2UoMCwgLTIpO1xuICAgIGNvbnN0IG91dGVyRGltc0IgPSAkYi5zaGFwZS5zbGljZSgwLCAtMik7XG4gICAgY29uc3QgYmF0Y2hEaW1BID0gdXRpbC5zaXplRnJvbVNoYXBlKG91dGVyRGltc0EpO1xuICAgIGNvbnN0IGJhdGNoRGltQiA9IHV0aWwuc2l6ZUZyb21TaGFwZShvdXRlckRpbXNCKTtcblxuICAgIHV0aWwuYXNzZXJ0KFxuICAgICAgICBpbm5lclNoYXBlQSA9PT0gaW5uZXJTaGFwZUIsXG4gICAgICAgICgpID0+IGBFcnJvciBpbiBmdXNlZCBtYXRNdWw6IGlubmVyIHNoYXBlcyAoJHtpbm5lclNoYXBlQX0pIGFuZCAoYCArXG4gICAgICAgICAgICBgJHtpbm5lclNoYXBlQn0pIG9mIFRlbnNvcnMgd2l0aCBzaGFwZXMgJHskYS5zaGFwZX0gYW5kIGAgK1xuICAgICAgICAgICAgYCR7JGIuc2hhcGV9IGFuZCB0cmFuc3Bvc2VBPSR7dHJhbnNwb3NlQX1gICtcbiAgICAgICAgICAgIGAgYW5kIHRyYW5zcG9zZUI9JHt0cmFuc3Bvc2VCfSBtdXN0IG1hdGNoLmApO1xuXG4gICAgY29uc3Qgb3V0U2hhcGVPdXRlckRpbXMgPSBicm9hZGNhc3RfdXRpbC5hc3NlcnRBbmRHZXRCcm9hZGNhc3RTaGFwZShcbiAgICAgICAgJGEuc2hhcGUuc2xpY2UoMCwgLTIpLCAkYi5zaGFwZS5zbGljZSgwLCAtMikpO1xuICAgIGNvbnN0IG91dFNoYXBlID0gb3V0U2hhcGVPdXRlckRpbXMuY29uY2F0KFtvdXRlclNoYXBlQSwgb3V0ZXJTaGFwZUJdKTtcblxuICAgIGNvbnN0IGEzRDogVGVuc29yM0QgPSB0cmFuc3Bvc2VBID9cbiAgICAgICAgcmVzaGFwZSgkYSwgW2JhdGNoRGltQSwgaW5uZXJTaGFwZUEsIG91dGVyU2hhcGVBXSkgOlxuICAgICAgICByZXNoYXBlKCRhLCBbYmF0Y2hEaW1BLCBvdXRlclNoYXBlQSwgaW5uZXJTaGFwZUFdKTtcbiAgICBjb25zdCBiM0Q6IFRlbnNvcjNEID0gdHJhbnNwb3NlQiA/XG4gICAgICAgIHJlc2hhcGUoJGIsIFtiYXRjaERpbUIsIG91dGVyU2hhcGVCLCBpbm5lclNoYXBlQl0pIDpcbiAgICAgICAgcmVzaGFwZSgkYiwgW2JhdGNoRGltQiwgaW5uZXJTaGFwZUIsIG91dGVyU2hhcGVCXSk7XG5cbiAgICBsZXQgJGJpYXM6IFRlbnNvcjtcbiAgICBpZiAoYmlhcyAhPSBudWxsKSB7XG4gICAgICAkYmlhcyA9IGNvbnZlcnRUb1RlbnNvcihiaWFzLCAnYmlhcycsICdmdXNlZCBtYXRNdWwnKTtcbiAgICAgIFskYmlhc10gPSBtYWtlVHlwZXNNYXRjaCgkYmlhcywgJGEpO1xuXG4gICAgICBicm9hZGNhc3RfdXRpbC5hc3NlcnRBbmRHZXRCcm9hZGNhc3RTaGFwZShvdXRTaGFwZSwgJGJpYXMuc2hhcGUpO1xuICAgIH1cblxuICAgIGxldCAkcHJlbHVBY3RpdmF0aW9uV2VpZ2h0czogVGVuc29yO1xuICAgIGlmIChwcmVsdUFjdGl2YXRpb25XZWlnaHRzICE9IG51bGwpIHtcbiAgICAgICRwcmVsdUFjdGl2YXRpb25XZWlnaHRzID0gY29udmVydFRvVGVuc29yKFxuICAgICAgICAgIHByZWx1QWN0aXZhdGlvbldlaWdodHMsICdwcmVsdSB3ZWlnaHRzJywgJ2Z1c2VkIG1hdE11bCcpO1xuICAgIH1cblxuICAgIGNvbnN0IGdyYWQgPSAoZHk6IFRlbnNvcjNELCBzYXZlZDogVGVuc29yW10pID0+IHtcbiAgICAgIGNvbnN0IFthM0QsIGIzRCwgeSwgJGJpYXNdID0gc2F2ZWQ7XG4gICAgICAvLyB3ZSByZXNoYXBlIGR5IGJlY2F1c2UgdGhlIHJlc3VsdCBvZiB0aGUgZm9yd2FyZCBpcyBub3RcbiAgICAgIC8vIG5lY2Vzc2FyaWx5IGdvaW5nIHRvIGJlIGEgM2QgdGVuc29yIGR1ZSB0byBhIHJlc2hhcGUgZG9uZSBhdCB0aGUgZW5kIG9mXG4gICAgICAvLyB0aGUgY3VzdG9tT3AuXG4gICAgICBjb25zdCBkeUFjdGl2YXRpb24gPVxuICAgICAgICAgIGdldEZ1c2VkRHlBY3RpdmF0aW9uKHJlc2hhcGUoZHksIHkuc2hhcGUpLCB5LCBhY3RpdmF0aW9uKTtcbiAgICAgIGxldCBhRGVyOiBUZW5zb3I7XG4gICAgICBsZXQgYkRlcjogVGVuc29yO1xuXG4gICAgICBpZiAoIXRyYW5zcG9zZUEgJiYgIXRyYW5zcG9zZUIpIHtcbiAgICAgICAgYURlciA9IHVuZnVzZWRNYXRNdWwoZHlBY3RpdmF0aW9uLCBiM0QsIGZhbHNlLCB0cnVlKTtcbiAgICAgICAgYkRlciA9IHVuZnVzZWRNYXRNdWwoYTNELCBkeUFjdGl2YXRpb24sIHRydWUsIGZhbHNlKTtcbiAgICAgIH0gZWxzZSBpZiAoIXRyYW5zcG9zZUEgJiYgdHJhbnNwb3NlQikge1xuICAgICAgICBhRGVyID0gdW5mdXNlZE1hdE11bChkeUFjdGl2YXRpb24sIGIzRCwgZmFsc2UsIGZhbHNlKTtcbiAgICAgICAgYkRlciA9IHVuZnVzZWRNYXRNdWwoZHlBY3RpdmF0aW9uLCBhM0QsIHRydWUsIGZhbHNlKTtcbiAgICAgIH0gZWxzZSBpZiAodHJhbnNwb3NlQSAmJiAhdHJhbnNwb3NlQikge1xuICAgICAgICBhRGVyID0gdW5mdXNlZE1hdE11bChiM0QsIGR5QWN0aXZhdGlvbiwgZmFsc2UsIHRydWUpO1xuICAgICAgICBiRGVyID0gdW5mdXNlZE1hdE11bChhM0QsIGR5QWN0aXZhdGlvbiwgZmFsc2UsIGZhbHNlKTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIGFEZXIgPSB1bmZ1c2VkTWF0TXVsKGIzRCwgZHlBY3RpdmF0aW9uLCB0cnVlLCB0cnVlKTtcbiAgICAgICAgYkRlciA9IHVuZnVzZWRNYXRNdWwoZHlBY3RpdmF0aW9uLCBhM0QsIHRydWUsIHRydWUpO1xuICAgICAgfVxuXG4gICAgICBpZiAoYmlhcyAhPSBudWxsKSB7XG4gICAgICAgIGNvbnN0IGJpYXNEZXIgPSBnZXRGdXNlZEJpYXNHcmFkaWVudCgkYmlhcywgZHlBY3RpdmF0aW9uKTtcbiAgICAgICAgcmV0dXJuIFthRGVyLCBiRGVyLCBiaWFzRGVyXTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHJldHVybiBbYURlciwgYkRlcl07XG4gICAgICB9XG4gICAgfTtcblxuICAgIGNvbnN0IGlucHV0czogX0Z1c2VkTWF0TXVsSW5wdXRzID0ge1xuICAgICAgYTogYTNELFxuICAgICAgYjogYjNELFxuICAgICAgYmlhczogJGJpYXMsXG4gICAgICBwcmVsdUFjdGl2YXRpb25XZWlnaHRzOiAkcHJlbHVBY3RpdmF0aW9uV2VpZ2h0c1xuICAgIH07XG4gICAgY29uc3QgYXR0cnM6IF9GdXNlZE1hdE11bEF0dHJzID1cbiAgICAgICAge3RyYW5zcG9zZUEsIHRyYW5zcG9zZUIsIGFjdGl2YXRpb24sIGxlYWt5cmVsdUFscGhhfTtcblxuICAgIC8vIERlcGVuZGluZyBvbiB0aGUgdGhlIHBhcmFtcyBwYXNzZWQgaW4gd2Ugd2lsbCBoYXZlIGRpZmZlcmVudCBudW1iZXIgb2ZcbiAgICAvLyBpbnB1dHMgYW5kIHRodXMgYSBhIGRpZmZlcmVudCBudW1iZXIgb2YgZWxlbWVudHMgaW4gdGhlIGdyYWRpZW50LlxuICAgIGlmIChiaWFzID09IG51bGwpIHtcbiAgICAgIGNvbnN0IGN1c3RvbU9wID1cbiAgICAgICAgICBjdXN0b21HcmFkKChhM0Q6IFRlbnNvcjNELCBiM0Q6IFRlbnNvcjNELCBzYXZlOiBHcmFkU2F2ZUZ1bmMpID0+IHtcbiAgICAgICAgICAgIGNvbnN0IHJlcyA9XG4gICAgICAgICAgICAgICAgLy8gdHNsaW50OmRpc2FibGUtbmV4dC1saW5lOiBuby11bm5lY2Vzc2FyeS10eXBlLWFzc2VydGlvblxuICAgICAgICAgICAgICAgIEVOR0lORS5ydW5LZXJuZWwoXG4gICAgICAgICAgICAgICAgICAgIF9GdXNlZE1hdE11bCwgaW5wdXRzIGFzIHt9IGFzIE5hbWVkVGVuc29yTWFwLFxuICAgICAgICAgICAgICAgICAgICBhdHRycyBhcyB7fSBhcyBOYW1lZEF0dHJNYXApIGFzIFRlbnNvcjtcblxuICAgICAgICAgICAgc2F2ZShbYTNELCBiM0QsIHJlc10pO1xuXG4gICAgICAgICAgICByZXR1cm4ge3ZhbHVlOiByZXNoYXBlKHJlcywgb3V0U2hhcGUpLCBncmFkRnVuYzogZ3JhZH07XG4gICAgICAgICAgfSk7XG4gICAgICByZXR1cm4gY3VzdG9tT3AoYTNELCBiM0QpO1xuICAgIH0gZWxzZSB7XG4gICAgICBjb25zdCBjdXN0b21PcFdpdGhCaWFzID0gY3VzdG9tR3JhZChcbiAgICAgICAgICAoYTNEOiBUZW5zb3IzRCwgYjNEOiBUZW5zb3IzRCwgJGJpYXM6IFRlbnNvciwgc2F2ZTogR3JhZFNhdmVGdW5jKSA9PiB7XG4gICAgICAgICAgICBjb25zdCByZXMgPVxuICAgICAgICAgICAgICAgIC8vIHRzbGludDpkaXNhYmxlLW5leHQtbGluZTogbm8tdW5uZWNlc3NhcnktdHlwZS1hc3NlcnRpb25cbiAgICAgICAgICAgICAgICBFTkdJTkUucnVuS2VybmVsKFxuICAgICAgICAgICAgICAgICAgICBfRnVzZWRNYXRNdWwsIGlucHV0cyBhcyB7fSBhcyBOYW1lZFRlbnNvck1hcCxcbiAgICAgICAgICAgICAgICAgICAgYXR0cnMgYXMge30gYXMgTmFtZWRBdHRyTWFwKSBhcyBUZW5zb3I7XG5cbiAgICAgICAgICAgIHNhdmUoW2EzRCwgYjNELCByZXMsICRiaWFzXSk7XG5cbiAgICAgICAgICAgIHJldHVybiB7dmFsdWU6IHJlc2hhcGUocmVzLCBvdXRTaGFwZSksIGdyYWRGdW5jOiBncmFkfTtcbiAgICAgICAgICB9KTtcblxuICAgICAgcmV0dXJuIGN1c3RvbU9wV2l0aEJpYXMoYTNELCBiM0QsICRiaWFzKTtcbiAgICB9XG4gIH1cblxuICBleHBvcnQgY29uc3QgbWF0TXVsID0gb3Aoe2Z1c2VkTWF0TXVsX30pO1xuIl19","/**\n * @license\n * Copyright 2019 Google LLC. All Rights Reserved.\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n * =============================================================================\n */\nimport { op } from '../operation';\nimport { cosineWindow } from '../signal_ops_util';\n/**\n * Generate a hamming window.\n *\n * See: https://en.wikipedia.org/wiki/Window_function#Hann_and_Hamming_windows\n *\n * ```js\n * tf.signal.hammingWindow(10).print();\n * ```\n * @param The length of window\n *\n * @doc {heading: 'Operations', subheading: 'Signal', namespace: 'signal'}\n */\nfunction hammingWindow_(windowLength) {\n return cosineWindow(windowLength, 0.54, 0.46);\n}\nexport const hammingWindow = op({ hammingWindow_ });\n//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaGFtbWluZ193aW5kb3cuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi8uLi8uLi90ZmpzLWNvcmUvc3JjL29wcy9zaWduYWwvaGFtbWluZ193aW5kb3cudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUE7Ozs7Ozs7Ozs7Ozs7OztHQWVHO0FBR0gsT0FBTyxFQUFDLEVBQUUsRUFBQyxNQUFNLGNBQWMsQ0FBQztBQUNoQyxPQUFPLEVBQUMsWUFBWSxFQUFDLE1BQU0sb0JBQW9CLENBQUM7QUFFaEQ7Ozs7Ozs7Ozs7O0dBV0c7QUFDSCxTQUFTLGNBQWMsQ0FBQyxZQUFvQjtJQUMxQyxPQUFPLFlBQVksQ0FBQyxZQUFZLEVBQUUsSUFBSSxFQUFFLElBQUksQ0FBQyxDQUFDO0FBQ2hELENBQUM7QUFDRCxNQUFNLENBQUMsTUFBTSxhQUFhLEdBQUcsRUFBRSxDQUFDLEVBQUMsY0FBYyxFQUFDLENBQUMsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbIi8qKlxuICogQGxpY2Vuc2VcbiAqIENvcHlyaWdodCAyMDE5IEdvb2dsZSBMTEMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuXG4gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgXCJMaWNlbnNlXCIpO1xuICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLlxuICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0XG4gKlxuICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wXG4gKlxuICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZVxuICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gXCJBUyBJU1wiIEJBU0lTLFxuICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuXG4gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kXG4gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS5cbiAqID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4gKi9cblxuaW1wb3J0IHtUZW5zb3IxRH0gZnJvbSAnLi4vLi4vdGVuc29yJztcbmltcG9ydCB7b3B9IGZyb20gJy4uL29wZXJhdGlvbic7XG5pbXBvcnQge2Nvc2luZVdpbmRvd30gZnJvbSAnLi4vc2lnbmFsX29wc191dGlsJztcblxuLyoqXG4gKiBHZW5lcmF0ZSBhIGhhbW1pbmcgd2luZG93LlxuICpcbiAqIFNlZTogaHR0cHM6Ly9lbi53aWtpcGVkaWEub3JnL3dpa2kvV2luZG93X2Z1bmN0aW9uI0hhbm5fYW5kX0hhbW1pbmdfd2luZG93c1xuICpcbiAqIGBgYGpzXG4gKiB0Zi5zaWduYWwuaGFtbWluZ1dpbmRvdygxMCkucHJpbnQoKTtcbiAqIGBgYFxuICogQHBhcmFtIFRoZSBsZW5ndGggb2Ygd2luZG93XG4gKlxuICogQGRvYyB7aGVhZGluZzogJ09wZXJhdGlvbnMnLCBzdWJoZWFkaW5nOiAnU2lnbmFsJywgbmFtZXNwYWNlOiAnc2lnbmFsJ31cbiAqL1xuZnVuY3Rpb24gaGFtbWluZ1dpbmRvd18od2luZG93TGVuZ3RoOiBudW1iZXIpOiBUZW5zb3IxRCB7XG4gIHJldHVybiBjb3NpbmVXaW5kb3cod2luZG93TGVuZ3RoLCAwLjU0LCAwLjQ2KTtcbn1cbmV4cG9ydCBjb25zdCBoYW1taW5nV2luZG93ID0gb3Aoe2hhbW1pbmdXaW5kb3dffSk7XG4iXX0=","/**\n * @license\n * Copyright 2019 Google LLC. All Rights Reserved.\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n * =============================================================================\n */\nimport { op } from '../operation';\nimport { cosineWindow } from '../signal_ops_util';\n/**\n * Generate a Hann window.\n *\n * See: https://en.wikipedia.org/wiki/Window_function#Hann_and_Hamming_windows\n *\n * ```js\n * tf.signal.hannWindow(10).print();\n * ```\n * @param The length of window\n *\n * @doc {heading: 'Operations', subheading: 'Signal', namespace: 'signal'}\n */\nfunction hannWindow_(windowLength) {\n return cosineWindow(windowLength, 0.5, 0.5);\n}\nexport const hannWindow = op({ hannWindow_ });\n//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaGFubl93aW5kb3cuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi8uLi8uLi90ZmpzLWNvcmUvc3JjL29wcy9zaWduYWwvaGFubl93aW5kb3cudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUE7Ozs7Ozs7Ozs7Ozs7OztHQWVHO0FBR0gsT0FBTyxFQUFDLEVBQUUsRUFBQyxNQUFNLGNBQWMsQ0FBQztBQUNoQyxPQUFPLEVBQUMsWUFBWSxFQUFDLE1BQU0sb0JBQW9CLENBQUM7QUFFaEQ7Ozs7Ozs7Ozs7O0dBV0c7QUFDSCxTQUFTLFdBQVcsQ0FBQyxZQUFvQjtJQUN2QyxPQUFPLFlBQVksQ0FBQyxZQUFZLEVBQUUsR0FBRyxFQUFFLEdBQUcsQ0FBQyxDQUFDO0FBQzlDLENBQUM7QUFFRCxNQUFNLENBQUMsTUFBTSxVQUFVLEdBQUcsRUFBRSxDQUFDLEVBQUMsV0FBVyxFQUFDLENBQUMsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbIi8qKlxuICogQGxpY2Vuc2VcbiAqIENvcHlyaWdodCAyMDE5IEdvb2dsZSBMTEMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuXG4gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgXCJMaWNlbnNlXCIpO1xuICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLlxuICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0XG4gKlxuICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wXG4gKlxuICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZVxuICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gXCJBUyBJU1wiIEJBU0lTLFxuICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuXG4gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kXG4gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS5cbiAqID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4gKi9cblxuaW1wb3J0IHtUZW5zb3IxRH0gZnJvbSAnLi4vLi4vdGVuc29yJztcbmltcG9ydCB7b3B9IGZyb20gJy4uL29wZXJhdGlvbic7XG5pbXBvcnQge2Nvc2luZVdpbmRvd30gZnJvbSAnLi4vc2lnbmFsX29wc191dGlsJztcblxuLyoqXG4gKiBHZW5lcmF0ZSBhIEhhbm4gd2luZG93LlxuICpcbiAqIFNlZTogaHR0cHM6Ly9lbi53aWtpcGVkaWEub3JnL3dpa2kvV2luZG93X2Z1bmN0aW9uI0hhbm5fYW5kX0hhbW1pbmdfd2luZG93c1xuICpcbiAqIGBgYGpzXG4gKiB0Zi5zaWduYWwuaGFubldpbmRvdygxMCkucHJpbnQoKTtcbiAqIGBgYFxuICogQHBhcmFtIFRoZSBsZW5ndGggb2Ygd2luZG93XG4gKlxuICogQGRvYyB7aGVhZGluZzogJ09wZXJhdGlvbnMnLCBzdWJoZWFkaW5nOiAnU2lnbmFsJywgbmFtZXNwYWNlOiAnc2lnbmFsJ31cbiAqL1xuZnVuY3Rpb24gaGFubldpbmRvd18od2luZG93TGVuZ3RoOiBudW1iZXIpOiBUZW5zb3IxRCB7XG4gIHJldHVybiBjb3NpbmVXaW5kb3cod2luZG93TGVuZ3RoLCAwLjUsIDAuNSk7XG59XG5cbmV4cG9ydCBjb25zdCBoYW5uV2luZG93ID0gb3Aoe2hhbm5XaW5kb3dffSk7XG4iXX0=","/**\n * @license\n * Copyright 2019 Google LLC. All Rights Reserved.\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n * =============================================================================\n */\nimport { concat } from '../concat';\nimport { fill } from '../fill';\nimport { op } from '../operation';\nimport { reshape } from '../reshape';\nimport { slice } from '../slice';\nimport { tensor2d } from '../tensor2d';\n/**\n * Expands input into frames of frameLength.\n * Slides a window size with frameStep.\n *\n * ```js\n * tf.signal.frame([1, 2, 3], 2, 1).print();\n * ```\n * @param signal The input tensor to be expanded\n * @param frameLength Length of each frame\n * @param frameStep The frame hop size in samples.\n * @param padEnd Whether to pad the end of signal with padValue.\n * @param padValue A number to use where the input signal does\n * not exist when padEnd is True.\n *\n * @doc {heading: 'Operations', subheading: 'Signal', namespace: 'signal'}\n */\nfunction frame_(signal, frameLength, frameStep, padEnd = false, padValue = 0) {\n let start = 0;\n const output = [];\n while (start + frameLength <= signal.size) {\n output.push(slice(signal, start, frameLength));\n start += frameStep;\n }\n if (padEnd) {\n while (start < signal.size) {\n const padLen = (start + frameLength) - signal.size;\n const pad = concat([\n slice(signal, start, frameLength - padLen), fill([padLen], padValue)\n ]);\n output.push(pad);\n start += frameStep;\n }\n }\n if (output.length === 0) {\n return tensor2d([], [0, frameLength]);\n }\n return reshape(concat(output), [output.length, frameLength]);\n}\nexport const frame = op({ frame_ });\n//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZnJhbWUuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi8uLi8uLi90ZmpzLWNvcmUvc3JjL29wcy9zaWduYWwvZnJhbWUudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUE7Ozs7Ozs7Ozs7Ozs7OztHQWVHO0FBR0gsT0FBTyxFQUFDLE1BQU0sRUFBQyxNQUFNLFdBQVcsQ0FBQztBQUNqQyxPQUFPLEVBQUMsSUFBSSxFQUFDLE1BQU0sU0FBUyxDQUFDO0FBQzdCLE9BQU8sRUFBQyxFQUFFLEVBQUMsTUFBTSxjQUFjLENBQUM7QUFDaEMsT0FBTyxFQUFDLE9BQU8sRUFBQyxNQUFNLFlBQVksQ0FBQztBQUNuQyxPQUFPLEVBQUMsS0FBSyxFQUFDLE1BQU0sVUFBVSxDQUFDO0FBQy9CLE9BQU8sRUFBQyxRQUFRLEVBQUMsTUFBTSxhQUFhLENBQUM7QUFFckM7Ozs7Ozs7Ozs7Ozs7OztHQWVHO0FBQ0gsU0FBUyxNQUFNLENBQ1gsTUFBZ0IsRUFBRSxXQUFtQixFQUFFLFNBQWlCLEVBQUUsTUFBTSxHQUFHLEtBQUssRUFDeEUsUUFBUSxHQUFHLENBQUM7SUFDZCxJQUFJLEtBQUssR0FBRyxDQUFDLENBQUM7SUFDZCxNQUFNLE1BQU0sR0FBYSxFQUFFLENBQUM7SUFDNUIsT0FBTyxLQUFLLEdBQUcsV0FBVyxJQUFJLE1BQU0sQ0FBQyxJQUFJLEVBQUU7UUFDekMsTUFBTSxDQUFDLElBQUksQ0FBQyxLQUFLLENBQUMsTUFBTSxFQUFFLEtBQUssRUFBRSxXQUFXLENBQUMsQ0FBQyxDQUFDO1FBQy9DLEtBQUssSUFBSSxTQUFTLENBQUM7S0FDcEI7SUFFRCxJQUFJLE1BQU0sRUFBRTtRQUNWLE9BQU8sS0FBSyxHQUFHLE1BQU0sQ0FBQyxJQUFJLEVBQUU7WUFDMUIsTUFBTSxNQUFNLEdBQUcsQ0FBQyxLQUFLLEdBQUcsV0FBVyxDQUFDLEdBQUcsTUFBTSxDQUFDLElBQUksQ0FBQztZQUNuRCxNQUFNLEdBQUcsR0FBRyxNQUFNLENBQUM7Z0JBQ2pCLEtBQUssQ0FBQyxNQUFNLEVBQUUsS0FBSyxFQUFFLFdBQVcsR0FBRyxNQUFNLENBQUMsRUFBRSxJQUFJLENBQUMsQ0FBQyxNQUFNLENBQUMsRUFBRSxRQUFRLENBQUM7YUFDckUsQ0FBQyxDQUFDO1lBQ0gsTUFBTSxDQUFDLElBQUksQ0FBQyxHQUFHLENBQUMsQ0FBQztZQUNqQixLQUFLLElBQUksU0FBUyxDQUFDO1NBQ3BCO0tBQ0Y7SUFFRCxJQUFJLE1BQU0sQ0FBQyxNQUFNLEtBQUssQ0FBQyxFQUFFO1FBQ3ZCLE9BQU8sUUFBUSxDQUFDLEVBQUUsRUFBRSxDQUFDLENBQUMsRUFBRSxXQUFXLENBQUMsQ0FBQyxDQUFDO0tBQ3ZDO0lBRUQsT0FBTyxPQUFPLENBQUMsTUFBTSxDQUFDLE1BQU0sQ0FBQyxFQUFFLENBQUMsTUFBTSxDQUFDLE1BQU0sRUFBRSxXQUFXLENBQUMsQ0FBQyxDQUFDO0FBQy9ELENBQUM7QUFDRCxNQUFNLENBQUMsTUFBTSxLQUFLLEdBQUcsRUFBRSxDQUFDLEVBQUMsTUFBTSxFQUFDLENBQUMsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbIi8qKlxuICogQGxpY2Vuc2VcbiAqIENvcHlyaWdodCAyMDE5IEdvb2dsZSBMTEMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuXG4gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgXCJMaWNlbnNlXCIpO1xuICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLlxuICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0XG4gKlxuICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wXG4gKlxuICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZVxuICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gXCJBUyBJU1wiIEJBU0lTLFxuICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuXG4gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kXG4gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS5cbiAqID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4gKi9cblxuaW1wb3J0IHtUZW5zb3IsIFRlbnNvcjFEfSBmcm9tICcuLi8uLi90ZW5zb3InO1xuaW1wb3J0IHtjb25jYXR9IGZyb20gJy4uL2NvbmNhdCc7XG5pbXBvcnQge2ZpbGx9IGZyb20gJy4uL2ZpbGwnO1xuaW1wb3J0IHtvcH0gZnJvbSAnLi4vb3BlcmF0aW9uJztcbmltcG9ydCB7cmVzaGFwZX0gZnJvbSAnLi4vcmVzaGFwZSc7XG5pbXBvcnQge3NsaWNlfSBmcm9tICcuLi9zbGljZSc7XG5pbXBvcnQge3RlbnNvcjJkfSBmcm9tICcuLi90ZW5zb3IyZCc7XG5cbi8qKlxuICogRXhwYW5kcyBpbnB1dCBpbnRvIGZyYW1lcyBvZiBmcmFtZUxlbmd0aC5cbiAqIFNsaWRlcyBhIHdpbmRvdyBzaXplIHdpdGggZnJhbWVTdGVwLlxuICpcbiAqIGBgYGpzXG4gKiB0Zi5zaWduYWwuZnJhbWUoWzEsIDIsIDNdLCAyLCAxKS5wcmludCgpO1xuICogYGBgXG4gKiBAcGFyYW0gc2lnbmFsIFRoZSBpbnB1dCB0ZW5zb3IgdG8gYmUgZXhwYW5kZWRcbiAqIEBwYXJhbSBmcmFtZUxlbmd0aCBMZW5ndGggb2YgZWFjaCBmcmFtZVxuICogQHBhcmFtIGZyYW1lU3RlcCBUaGUgZnJhbWUgaG9wIHNpemUgaW4gc2FtcGxlcy5cbiAqIEBwYXJhbSBwYWRFbmQgV2hldGhlciB0byBwYWQgdGhlIGVuZCBvZiBzaWduYWwgd2l0aCBwYWRWYWx1ZS5cbiAqIEBwYXJhbSBwYWRWYWx1ZSBBIG51bWJlciB0byB1c2Ugd2hlcmUgdGhlIGlucHV0IHNpZ25hbCBkb2VzXG4gKiAgICAgbm90IGV4aXN0IHdoZW4gcGFkRW5kIGlzIFRydWUuXG4gKlxuICogQGRvYyB7aGVhZGluZzogJ09wZXJhdGlvbnMnLCBzdWJoZWFkaW5nOiAnU2lnbmFsJywgbmFtZXNwYWNlOiAnc2lnbmFsJ31cbiAqL1xuZnVuY3Rpb24gZnJhbWVfKFxuICAgIHNpZ25hbDogVGVuc29yMUQsIGZyYW1lTGVuZ3RoOiBudW1iZXIsIGZyYW1lU3RlcDogbnVtYmVyLCBwYWRFbmQgPSBmYWxzZSxcbiAgICBwYWRWYWx1ZSA9IDApOiBUZW5zb3Ige1xuICBsZXQgc3RhcnQgPSAwO1xuICBjb25zdCBvdXRwdXQ6IFRlbnNvcltdID0gW107XG4gIHdoaWxlIChzdGFydCArIGZyYW1lTGVuZ3RoIDw9IHNpZ25hbC5zaXplKSB7XG4gICAgb3V0cHV0LnB1c2goc2xpY2Uoc2lnbmFsLCBzdGFydCwgZnJhbWVMZW5ndGgpKTtcbiAgICBzdGFydCArPSBmcmFtZVN0ZXA7XG4gIH1cblxuICBpZiAocGFkRW5kKSB7XG4gICAgd2hpbGUgKHN0YXJ0IDwgc2lnbmFsLnNpemUpIHtcbiAgICAgIGNvbnN0IHBhZExlbiA9IChzdGFydCArIGZyYW1lTGVuZ3RoKSAtIHNpZ25hbC5zaXplO1xuICAgICAgY29uc3QgcGFkID0gY29uY2F0KFtcbiAgICAgICAgc2xpY2Uoc2lnbmFsLCBzdGFydCwgZnJhbWVMZW5ndGggLSBwYWRMZW4pLCBmaWxsKFtwYWRMZW5dLCBwYWRWYWx1ZSlcbiAgICAgIF0pO1xuICAgICAgb3V0cHV0LnB1c2gocGFkKTtcbiAgICAgIHN0YXJ0ICs9IGZyYW1lU3RlcDtcbiAgICB9XG4gIH1cblxuICBpZiAob3V0cHV0Lmxlbmd0aCA9PT0gMCkge1xuICAgIHJldHVybiB0ZW5zb3IyZChbXSwgWzAsIGZyYW1lTGVuZ3RoXSk7XG4gIH1cblxuICByZXR1cm4gcmVzaGFwZShjb25jYXQob3V0cHV0KSwgW291dHB1dC5sZW5ndGgsIGZyYW1lTGVuZ3RoXSk7XG59XG5leHBvcnQgY29uc3QgZnJhbWUgPSBvcCh7ZnJhbWVffSk7XG4iXX0=","/**\n * @license\n * Copyright 2019 Google LLC. All Rights Reserved.\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n * =============================================================================\n */\nimport { mul } from '../mul';\nimport { op } from '../operation';\nimport { enclosingPowerOfTwo } from '../signal_ops_util';\nimport { rfft } from '../spectral/rfft';\nimport { frame } from './frame';\nimport { hannWindow } from './hann_window';\n/**\n * Computes the Short-time Fourier Transform of signals\n * See: https://en.wikipedia.org/wiki/Short-time_Fourier_transform\n *\n * ```js\n * const input = tf.tensor1d([1, 1, 1, 1, 1])\n * tf.signal.stft(input, 3, 1).print();\n * ```\n * @param signal 1-dimensional real value tensor.\n * @param frameLength The window length of samples.\n * @param frameStep The number of samples to step.\n * @param fftLength The size of the FFT to apply.\n * @param windowFn A callable that takes a window length and returns 1-d tensor.\n *\n * @doc {heading: 'Operations', subheading: 'Signal', namespace: 'signal'}\n */\nfunction stft_(signal, frameLength, frameStep, fftLength, windowFn = hannWindow) {\n if (fftLength == null) {\n fftLength = enclosingPowerOfTwo(frameLength);\n }\n const framedSignal = frame(signal, frameLength, frameStep);\n const windowedSignal = mul(framedSignal, windowFn(frameLength));\n return rfft(windowedSignal, fftLength);\n}\nexport const stft = op({ stft_ });\n//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic3RmdC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uLy4uLy4uL3RmanMtY29yZS9zcmMvb3BzL3NpZ25hbC9zdGZ0LnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBOzs7Ozs7Ozs7Ozs7Ozs7R0FlRztBQUdILE9BQU8sRUFBQyxHQUFHLEVBQUMsTUFBTSxRQUFRLENBQUM7QUFDM0IsT0FBTyxFQUFDLEVBQUUsRUFBQyxNQUFNLGNBQWMsQ0FBQztBQUNoQyxPQUFPLEVBQUMsbUJBQW1CLEVBQUMsTUFBTSxvQkFBb0IsQ0FBQztBQUN2RCxPQUFPLEVBQUMsSUFBSSxFQUFDLE1BQU0sa0JBQWtCLENBQUM7QUFFdEMsT0FBTyxFQUFDLEtBQUssRUFBQyxNQUFNLFNBQVMsQ0FBQztBQUM5QixPQUFPLEVBQUMsVUFBVSxFQUFDLE1BQU0sZUFBZSxDQUFDO0FBRXpDOzs7Ozs7Ozs7Ozs7Ozs7R0FlRztBQUNILFNBQVMsS0FBSyxDQUNWLE1BQWdCLEVBQUUsV0FBbUIsRUFBRSxTQUFpQixFQUN4RCxTQUFrQixFQUNsQixXQUF5QyxVQUFVO0lBQ3JELElBQUksU0FBUyxJQUFJLElBQUksRUFBRTtRQUNyQixTQUFTLEdBQUcsbUJBQW1CLENBQUMsV0FBVyxDQUFDLENBQUM7S0FDOUM7SUFDRCxNQUFNLFlBQVksR0FBRyxLQUFLLENBQUMsTUFBTSxFQUFFLFdBQVcsRUFBRSxTQUFTLENBQUMsQ0FBQztJQUMzRCxNQUFNLGNBQWMsR0FBRyxHQUFHLENBQUMsWUFBWSxFQUFFLFFBQVEsQ0FBQyxXQUFXLENBQUMsQ0FBQyxDQUFDO0lBQ2hFLE9BQU8sSUFBSSxDQUFDLGNBQWMsRUFBRSxTQUFTLENBQUMsQ0FBQztBQUN6QyxDQUFDO0FBQ0QsTUFBTSxDQUFDLE1BQU0sSUFBSSxHQUFHLEVBQUUsQ0FBQyxFQUFDLEtBQUssRUFBQyxDQUFDLENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyIvKipcbiAqIEBsaWNlbnNlXG4gKiBDb3B5cmlnaHQgMjAxOSBHb29nbGUgTExDLiBBbGwgUmlnaHRzIFJlc2VydmVkLlxuICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlIFwiTGljZW5zZVwiKTtcbiAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS5cbiAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdFxuICpcbiAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMFxuICpcbiAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmVcbiAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuIFwiQVMgSVNcIiBCQVNJUyxcbiAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLlxuICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZFxuICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuXG4gKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuICovXG5cbmltcG9ydCB7VGVuc29yLCBUZW5zb3IxRH0gZnJvbSAnLi4vLi4vdGVuc29yJztcbmltcG9ydCB7bXVsfSBmcm9tICcuLi9tdWwnO1xuaW1wb3J0IHtvcH0gZnJvbSAnLi4vb3BlcmF0aW9uJztcbmltcG9ydCB7ZW5jbG9zaW5nUG93ZXJPZlR3b30gZnJvbSAnLi4vc2lnbmFsX29wc191dGlsJztcbmltcG9ydCB7cmZmdH0gZnJvbSAnLi4vc3BlY3RyYWwvcmZmdCc7XG5cbmltcG9ydCB7ZnJhbWV9IGZyb20gJy4vZnJhbWUnO1xuaW1wb3J0IHtoYW5uV2luZG93fSBmcm9tICcuL2hhbm5fd2luZG93JztcblxuLyoqXG4gKiBDb21wdXRlcyB0aGUgU2hvcnQtdGltZSBGb3VyaWVyIFRyYW5zZm9ybSBvZiBzaWduYWxzXG4gKiBTZWU6IGh0dHBzOi8vZW4ud2lraXBlZGlhLm9yZy93aWtpL1Nob3J0LXRpbWVfRm91cmllcl90cmFuc2Zvcm1cbiAqXG4gKiBgYGBqc1xuICogY29uc3QgaW5wdXQgPSB0Zi50ZW5zb3IxZChbMSwgMSwgMSwgMSwgMV0pXG4gKiB0Zi5zaWduYWwuc3RmdChpbnB1dCwgMywgMSkucHJpbnQoKTtcbiAqIGBgYFxuICogQHBhcmFtIHNpZ25hbCAxLWRpbWVuc2lvbmFsIHJlYWwgdmFsdWUgdGVuc29yLlxuICogQHBhcmFtIGZyYW1lTGVuZ3RoIFRoZSB3aW5kb3cgbGVuZ3RoIG9mIHNhbXBsZXMuXG4gKiBAcGFyYW0gZnJhbWVTdGVwIFRoZSBudW1iZXIgb2Ygc2FtcGxlcyB0byBzdGVwLlxuICogQHBhcmFtIGZmdExlbmd0aCBUaGUgc2l6ZSBvZiB0aGUgRkZUIHRvIGFwcGx5LlxuICogQHBhcmFtIHdpbmRvd0ZuIEEgY2FsbGFibGUgdGhhdCB0YWtlcyBhIHdpbmRvdyBsZW5ndGggYW5kIHJldHVybnMgMS1kIHRlbnNvci5cbiAqXG4gKiBAZG9jIHtoZWFkaW5nOiAnT3BlcmF0aW9ucycsIHN1YmhlYWRpbmc6ICdTaWduYWwnLCBuYW1lc3BhY2U6ICdzaWduYWwnfVxuICovXG5mdW5jdGlvbiBzdGZ0XyhcbiAgICBzaWduYWw6IFRlbnNvcjFELCBmcmFtZUxlbmd0aDogbnVtYmVyLCBmcmFtZVN0ZXA6IG51bWJlcixcbiAgICBmZnRMZW5ndGg/OiBudW1iZXIsXG4gICAgd2luZG93Rm46IChsZW5ndGg6IG51bWJlcikgPT4gVGVuc29yMUQgPSBoYW5uV2luZG93KTogVGVuc29yIHtcbiAgaWYgKGZmdExlbmd0aCA9PSBudWxsKSB7XG4gICAgZmZ0TGVuZ3RoID0gZW5jbG9zaW5nUG93ZXJPZlR3byhmcmFtZUxlbmd0aCk7XG4gIH1cbiAgY29uc3QgZnJhbWVkU2lnbmFsID0gZnJhbWUoc2lnbmFsLCBmcmFtZUxlbmd0aCwgZnJhbWVTdGVwKTtcbiAgY29uc3Qgd2luZG93ZWRTaWduYWwgPSBtdWwoZnJhbWVkU2lnbmFsLCB3aW5kb3dGbihmcmFtZUxlbmd0aCkpO1xuICByZXR1cm4gcmZmdCh3aW5kb3dlZFNpZ25hbCwgZmZ0TGVuZ3RoKTtcbn1cbmV4cG9ydCBjb25zdCBzdGZ0ID0gb3Aoe3N0ZnRffSk7XG4iXX0=","/**\n * @license\n * Copyright 2020 Google LLC. All Rights Reserved.\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n * =============================================================================\n */\nimport { ENGINE } from '../../engine';\nimport { CropAndResize } from '../../kernel_names';\nimport { convertToTensor } from '../../tensor_util_env';\nimport * as util from '../../util';\nimport { op } from '../operation';\n/**\n * Extracts crops from the input image tensor and resizes them using bilinear\n * sampling or nearest neighbor sampling (possibly with aspect ratio change)\n * to a common output size specified by cropSize.\n *\n * @param image 4d tensor of shape `[batch,imageHeight,imageWidth, depth]`,\n * where imageHeight and imageWidth must be positive, specifying the\n * batch of images from which to take crops\n * @param boxes 2d float32 tensor of shape `[numBoxes, 4]`. Each entry is\n * `[y1, x1, y2, x2]`, where `(y1, x1)` and `(y2, x2)` are the normalized\n * coordinates of the box in the `boxInd[i]`th image in the batch\n * @param boxInd 1d int32 tensor of shape `[numBoxes]` with values in range\n * `[0, batch)` that specifies the image that the `i`-th box refers to.\n * @param cropSize 1d int32 tensor of 2 elements `[cropHeigh, cropWidth]`\n * specifying the size to which all crops are resized to.\n * @param method Optional string from `'bilinear' | 'nearest'`,\n * defaults to bilinear, which specifies the sampling method for resizing\n * @param extrapolationValue A threshold for deciding when to remove boxes based\n * on score. Defaults to 0.\n * @return A 4D tensor of the shape `[numBoxes,cropHeight,cropWidth,depth]`\n *\n * @doc {heading: 'Operations', subheading: 'Images', namespace: 'image'}\n */\nfunction cropAndResize_(image, boxes, boxInd, cropSize, method = 'bilinear', extrapolationValue = 0) {\n const $image = convertToTensor(image, 'image', 'cropAndResize');\n const $boxes = convertToTensor(boxes, 'boxes', 'cropAndResize', 'float32');\n const $boxInd = convertToTensor(boxInd, 'boxInd', 'cropAndResize', 'int32');\n const numBoxes = $boxes.shape[0];\n util.assert($image.rank === 4, () => 'Error in cropAndResize: image must be rank 4,' +\n `but got rank ${$image.rank}.`);\n util.assert($boxes.rank === 2 && $boxes.shape[1] === 4, () => `Error in cropAndResize: boxes must be have size [${numBoxes},4] ` +\n `but had shape ${$boxes.shape}.`);\n util.assert($boxInd.rank === 1 && $boxInd.shape[0] === numBoxes, () => `Error in cropAndResize: boxInd must be have size [${numBoxes}] ` +\n `but had shape ${$boxes.shape}.`);\n util.assert(cropSize.length === 2, () => `Error in cropAndResize: cropSize must be of length 2, but got ` +\n `length ${cropSize.length}.`);\n util.assert(cropSize[0] >= 1 && cropSize[1] >= 1, () => `cropSize must be atleast [1,1], but was ${cropSize}`);\n util.assert(method === 'bilinear' || method === 'nearest', () => `method must be bilinear or nearest, but was ${method}`);\n const inputs = { image: $image, boxes: $boxes, boxInd: $boxInd };\n const attrs = { method, extrapolationValue, cropSize };\n const res = ENGINE.runKernel(CropAndResize, inputs, attrs);\n return res;\n}\nexport const cropAndResize = op({ cropAndResize_ });\n//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY3JvcF9hbmRfcmVzaXplLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vLi4vLi4vdGZqcy1jb3JlL3NyYy9vcHMvaW1hZ2UvY3JvcF9hbmRfcmVzaXplLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBOzs7Ozs7Ozs7Ozs7Ozs7R0FlRztBQUVILE9BQU8sRUFBQyxNQUFNLEVBQUMsTUFBTSxjQUFjLENBQUM7QUFDcEMsT0FBTyxFQUFDLGFBQWEsRUFBMEMsTUFBTSxvQkFBb0IsQ0FBQztBQUkxRixPQUFPLEVBQUMsZUFBZSxFQUFDLE1BQU0sdUJBQXVCLENBQUM7QUFFdEQsT0FBTyxLQUFLLElBQUksTUFBTSxZQUFZLENBQUM7QUFFbkMsT0FBTyxFQUFDLEVBQUUsRUFBQyxNQUFNLGNBQWMsQ0FBQztBQUVoQzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7OztHQXNCRztBQUNILFNBQVMsY0FBYyxDQUNuQixLQUEwQixFQUMxQixLQUEwQixFQUMxQixNQUEyQixFQUMzQixRQUEwQixFQUMxQixTQUErQixVQUFVLEVBQ3pDLGtCQUFrQixHQUFHLENBQUM7SUFFeEIsTUFBTSxNQUFNLEdBQUcsZUFBZSxDQUFDLEtBQUssRUFBRSxPQUFPLEVBQUUsZUFBZSxDQUFDLENBQUM7SUFDaEUsTUFBTSxNQUFNLEdBQUcsZUFBZSxDQUFDLEtBQUssRUFBRSxPQUFPLEVBQUUsZUFBZSxFQUFFLFNBQVMsQ0FBQyxDQUFDO0lBQzNFLE1BQU0sT0FBTyxHQUFHLGVBQWUsQ0FBQyxNQUFNLEVBQUUsUUFBUSxFQUFFLGVBQWUsRUFBRSxPQUFPLENBQUMsQ0FBQztJQUU1RSxNQUFNLFFBQVEsR0FBRyxNQUFNLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQyxDQUFDO0lBRWpDLElBQUksQ0FBQyxNQUFNLENBQ1AsTUFBTSxDQUFDLElBQUksS0FBSyxDQUFDLEVBQ2pCLEdBQUcsRUFBRSxDQUFDLCtDQUErQztRQUNqRCxnQkFBZ0IsTUFBTSxDQUFDLElBQUksR0FBRyxDQUFDLENBQUM7SUFDeEMsSUFBSSxDQUFDLE1BQU0sQ0FDUCxNQUFNLENBQUMsSUFBSSxLQUFLLENBQUMsSUFBSSxNQUFNLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQyxLQUFLLENBQUMsRUFDMUMsR0FBRyxFQUFFLENBQUMsb0RBQW9ELFFBQVEsTUFBTTtRQUNwRSxpQkFBaUIsTUFBTSxDQUFDLEtBQUssR0FBRyxDQUFDLENBQUM7SUFDMUMsSUFBSSxDQUFDLE1BQU0sQ0FDUCxPQUFPLENBQUMsSUFBSSxLQUFLLENBQUMsSUFBSSxPQUFPLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQyxLQUFLLFFBQVEsRUFDbkQsR0FBRyxFQUFFLENBQUMscURBQXFELFFBQVEsSUFBSTtRQUNuRSxpQkFBaUIsTUFBTSxDQUFDLEtBQUssR0FBRyxDQUFDLENBQUM7SUFDMUMsSUFBSSxDQUFDLE1BQU0sQ0FDUCxRQUFRLENBQUMsTUFBTSxLQUFLLENBQUMsRUFDckIsR0FBRyxFQUFFLENBQUMsZ0VBQWdFO1FBQ2xFLFVBQVUsUUFBUSxDQUFDLE1BQU0sR0FBRyxDQUFDLENBQUM7SUFDdEMsSUFBSSxDQUFDLE1BQU0sQ0FDUCxRQUFRLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxJQUFJLFFBQVEsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLEVBQ3BDLEdBQUcsRUFBRSxDQUFDLDJDQUEyQyxRQUFRLEVBQUUsQ0FBQyxDQUFDO0lBQ2pFLElBQUksQ0FBQyxNQUFNLENBQ1AsTUFBTSxLQUFLLFVBQVUsSUFBSSxNQUFNLEtBQUssU0FBUyxFQUM3QyxHQUFHLEVBQUUsQ0FBQywrQ0FBK0MsTUFBTSxFQUFFLENBQUMsQ0FBQztJQUVuRSxNQUFNLE1BQU0sR0FDYyxFQUFDLEtBQUssRUFBRSxNQUFNLEVBQUUsS0FBSyxFQUFFLE1BQU0sRUFBRSxNQUFNLEVBQUUsT0FBTyxFQUFDLENBQUM7SUFDMUUsTUFBTSxLQUFLLEdBQXVCLEVBQUMsTUFBTSxFQUFFLGtCQUFrQixFQUFFLFFBQVEsRUFBQyxDQUFDO0lBQ3pFLE1BQU0sR0FBRyxHQUFHLE1BQU0sQ0FBQyxTQUFTLENBQ3hCLGFBQWEsRUFBRSxNQUE4QixFQUM3QyxLQUEyQixDQUFDLENBQUM7SUFDakMsT0FBTyxHQUFlLENBQUM7QUFDekIsQ0FBQztBQUVELE1BQU0sQ0FBQyxNQUFNLGFBQWEsR0FBRyxFQUFFLENBQUMsRUFBQyxjQUFjLEVBQUMsQ0FBQyxDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiLyoqXG4gKiBAbGljZW5zZVxuICogQ29weXJpZ2h0IDIwMjAgR29vZ2xlIExMQy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC5cbiAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSBcIkxpY2Vuc2VcIik7XG4gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuXG4gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXRcbiAqXG4gKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjBcbiAqXG4gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlXG4gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiBcIkFTIElTXCIgQkFTSVMsXG4gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC5cbiAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmRcbiAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLlxuICogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbiAqL1xuXG5pbXBvcnQge0VOR0lORX0gZnJvbSAnLi4vLi4vZW5naW5lJztcbmltcG9ydCB7Q3JvcEFuZFJlc2l6ZSwgQ3JvcEFuZFJlc2l6ZUF0dHJzLCBDcm9wQW5kUmVzaXplSW5wdXRzfSBmcm9tICcuLi8uLi9rZXJuZWxfbmFtZXMnO1xuaW1wb3J0IHtOYW1lZEF0dHJNYXB9IGZyb20gJy4uLy4uL2tlcm5lbF9yZWdpc3RyeSc7XG5pbXBvcnQge1RlbnNvcjFELCBUZW5zb3IyRCwgVGVuc29yNER9IGZyb20gJy4uLy4uL3RlbnNvcic7XG5pbXBvcnQge05hbWVkVGVuc29yTWFwfSBmcm9tICcuLi8uLi90ZW5zb3JfdHlwZXMnO1xuaW1wb3J0IHtjb252ZXJ0VG9UZW5zb3J9IGZyb20gJy4uLy4uL3RlbnNvcl91dGlsX2Vudic7XG5pbXBvcnQge1RlbnNvckxpa2V9IGZyb20gJy4uLy4uL3R5cGVzJztcbmltcG9ydCAqIGFzIHV0aWwgZnJvbSAnLi4vLi4vdXRpbCc7XG5cbmltcG9ydCB7b3B9IGZyb20gJy4uL29wZXJhdGlvbic7XG5cbi8qKlxuICogRXh0cmFjdHMgY3JvcHMgZnJvbSB0aGUgaW5wdXQgaW1hZ2UgdGVuc29yIGFuZCByZXNpemVzIHRoZW0gdXNpbmcgYmlsaW5lYXJcbiAqIHNhbXBsaW5nIG9yIG5lYXJlc3QgbmVpZ2hib3Igc2FtcGxpbmcgKHBvc3NpYmx5IHdpdGggYXNwZWN0IHJhdGlvIGNoYW5nZSlcbiAqIHRvIGEgY29tbW9uIG91dHB1dCBzaXplIHNwZWNpZmllZCBieSBjcm9wU2l6ZS5cbiAqXG4gKiBAcGFyYW0gaW1hZ2UgNGQgdGVuc29yIG9mIHNoYXBlIGBbYmF0Y2gsaW1hZ2VIZWlnaHQsaW1hZ2VXaWR0aCwgZGVwdGhdYCxcbiAqICAgICB3aGVyZSBpbWFnZUhlaWdodCBhbmQgaW1hZ2VXaWR0aCBtdXN0IGJlIHBvc2l0aXZlLCBzcGVjaWZ5aW5nIHRoZVxuICogICAgIGJhdGNoIG9mIGltYWdlcyBmcm9tIHdoaWNoIHRvIHRha2UgY3JvcHNcbiAqIEBwYXJhbSBib3hlcyAyZCBmbG9hdDMyIHRlbnNvciBvZiBzaGFwZSBgW251bUJveGVzLCA0XWAuIEVhY2ggZW50cnkgaXNcbiAqICAgICBgW3kxLCB4MSwgeTIsIHgyXWAsIHdoZXJlIGAoeTEsIHgxKWAgYW5kIGAoeTIsIHgyKWAgYXJlIHRoZSBub3JtYWxpemVkXG4gKiAgICAgY29vcmRpbmF0ZXMgb2YgdGhlIGJveCBpbiB0aGUgYGJveEluZFtpXWB0aCBpbWFnZSBpbiB0aGUgYmF0Y2hcbiAqIEBwYXJhbSBib3hJbmQgMWQgaW50MzIgdGVuc29yIG9mIHNoYXBlIGBbbnVtQm94ZXNdYCB3aXRoIHZhbHVlcyBpbiByYW5nZVxuICogICAgIGBbMCwgYmF0Y2gpYCB0aGF0IHNwZWNpZmllcyB0aGUgaW1hZ2UgdGhhdCB0aGUgYGlgLXRoIGJveCByZWZlcnMgdG8uXG4gKiBAcGFyYW0gY3JvcFNpemUgMWQgaW50MzIgdGVuc29yIG9mIDIgZWxlbWVudHMgYFtjcm9wSGVpZ2gsIGNyb3BXaWR0aF1gXG4gKiAgICAgc3BlY2lmeWluZyB0aGUgc2l6ZSB0byB3aGljaCBhbGwgY3JvcHMgYXJlIHJlc2l6ZWQgdG8uXG4gKiBAcGFyYW0gbWV0aG9kIE9wdGlvbmFsIHN0cmluZyBmcm9tIGAnYmlsaW5lYXInIHwgJ25lYXJlc3QnYCxcbiAqICAgICBkZWZhdWx0cyB0byBiaWxpbmVhciwgd2hpY2ggc3BlY2lmaWVzIHRoZSBzYW1wbGluZyBtZXRob2QgZm9yIHJlc2l6aW5nXG4gKiBAcGFyYW0gZXh0cmFwb2xhdGlvblZhbHVlIEEgdGhyZXNob2xkIGZvciBkZWNpZGluZyB3aGVuIHRvIHJlbW92ZSBib3hlcyBiYXNlZFxuICogICAgIG9uIHNjb3JlLiBEZWZhdWx0cyB0byAwLlxuICogQHJldHVybiBBIDREIHRlbnNvciBvZiB0aGUgc2hhcGUgYFtudW1Cb3hlcyxjcm9wSGVpZ2h0LGNyb3BXaWR0aCxkZXB0aF1gXG4gKlxuICogQGRvYyB7aGVhZGluZzogJ09wZXJhdGlvbnMnLCBzdWJoZWFkaW5nOiAnSW1hZ2VzJywgbmFtZXNwYWNlOiAnaW1hZ2UnfVxuICovXG5mdW5jdGlvbiBjcm9wQW5kUmVzaXplXyhcbiAgICBpbWFnZTogVGVuc29yNER8VGVuc29yTGlrZSxcbiAgICBib3hlczogVGVuc29yMkR8VGVuc29yTGlrZSxcbiAgICBib3hJbmQ6IFRlbnNvcjFEfFRlbnNvckxpa2UsXG4gICAgY3JvcFNpemU6IFtudW1iZXIsIG51bWJlcl0sXG4gICAgbWV0aG9kOiAnYmlsaW5lYXInfCduZWFyZXN0JyA9ICdiaWxpbmVhcicsXG4gICAgZXh0cmFwb2xhdGlvblZhbHVlID0gMCxcbiAgICApOiBUZW5zb3I0RCB7XG4gIGNvbnN0ICRpbWFnZSA9IGNvbnZlcnRUb1RlbnNvcihpbWFnZSwgJ2ltYWdlJywgJ2Nyb3BBbmRSZXNpemUnKTtcbiAgY29uc3QgJGJveGVzID0gY29udmVydFRvVGVuc29yKGJveGVzLCAnYm94ZXMnLCAnY3JvcEFuZFJlc2l6ZScsICdmbG9hdDMyJyk7XG4gIGNvbnN0ICRib3hJbmQgPSBjb252ZXJ0VG9UZW5zb3IoYm94SW5kLCAnYm94SW5kJywgJ2Nyb3BBbmRSZXNpemUnLCAnaW50MzInKTtcblxuICBjb25zdCBudW1Cb3hlcyA9ICRib3hlcy5zaGFwZVswXTtcblxuICB1dGlsLmFzc2VydChcbiAgICAgICRpbWFnZS5yYW5rID09PSA0LFxuICAgICAgKCkgPT4gJ0Vycm9yIGluIGNyb3BBbmRSZXNpemU6IGltYWdlIG11c3QgYmUgcmFuayA0LCcgK1xuICAgICAgICAgIGBidXQgZ290IHJhbmsgJHskaW1hZ2UucmFua30uYCk7XG4gIHV0aWwuYXNzZXJ0KFxuICAgICAgJGJveGVzLnJhbmsgPT09IDIgJiYgJGJveGVzLnNoYXBlWzFdID09PSA0LFxuICAgICAgKCkgPT4gYEVycm9yIGluIGNyb3BBbmRSZXNpemU6IGJveGVzIG11c3QgYmUgaGF2ZSBzaXplIFske251bUJveGVzfSw0XSBgICtcbiAgICAgICAgICBgYnV0IGhhZCBzaGFwZSAkeyRib3hlcy5zaGFwZX0uYCk7XG4gIHV0aWwuYXNzZXJ0KFxuICAgICAgJGJveEluZC5yYW5rID09PSAxICYmICRib3hJbmQuc2hhcGVbMF0gPT09IG51bUJveGVzLFxuICAgICAgKCkgPT4gYEVycm9yIGluIGNyb3BBbmRSZXNpemU6IGJveEluZCBtdXN0IGJlIGhhdmUgc2l6ZSBbJHtudW1Cb3hlc31dIGAgK1xuICAgICAgICAgIGBidXQgaGFkIHNoYXBlICR7JGJveGVzLnNoYXBlfS5gKTtcbiAgdXRpbC5hc3NlcnQoXG4gICAgICBjcm9wU2l6ZS5sZW5ndGggPT09IDIsXG4gICAgICAoKSA9PiBgRXJyb3IgaW4gY3JvcEFuZFJlc2l6ZTogY3JvcFNpemUgbXVzdCBiZSBvZiBsZW5ndGggMiwgYnV0IGdvdCBgICtcbiAgICAgICAgICBgbGVuZ3RoICR7Y3JvcFNpemUubGVuZ3RofS5gKTtcbiAgdXRpbC5hc3NlcnQoXG4gICAgICBjcm9wU2l6ZVswXSA+PSAxICYmIGNyb3BTaXplWzFdID49IDEsXG4gICAgICAoKSA9PiBgY3JvcFNpemUgbXVzdCBiZSBhdGxlYXN0IFsxLDFdLCBidXQgd2FzICR7Y3JvcFNpemV9YCk7XG4gIHV0aWwuYXNzZXJ0KFxuICAgICAgbWV0aG9kID09PSAnYmlsaW5lYXInIHx8IG1ldGhvZCA9PT0gJ25lYXJlc3QnLFxuICAgICAgKCkgPT4gYG1ldGhvZCBtdXN0IGJlIGJpbGluZWFyIG9yIG5lYXJlc3QsIGJ1dCB3YXMgJHttZXRob2R9YCk7XG5cbiAgY29uc3QgaW5wdXRzOlxuICAgICAgQ3JvcEFuZFJlc2l6ZUlucHV0cyA9IHtpbWFnZTogJGltYWdlLCBib3hlczogJGJveGVzLCBib3hJbmQ6ICRib3hJbmR9O1xuICBjb25zdCBhdHRyczogQ3JvcEFuZFJlc2l6ZUF0dHJzID0ge21ldGhvZCwgZXh0cmFwb2xhdGlvblZhbHVlLCBjcm9wU2l6ZX07XG4gIGNvbnN0IHJlcyA9IEVOR0lORS5ydW5LZXJuZWwoXG4gICAgICBDcm9wQW5kUmVzaXplLCBpbnB1dHMgYXMge30gYXMgTmFtZWRUZW5zb3JNYXAsXG4gICAgICBhdHRycyBhcyB7fSBhcyBOYW1lZEF0dHJNYXApO1xuICByZXR1cm4gcmVzIGFzIFRlbnNvcjREO1xufVxuXG5leHBvcnQgY29uc3QgY3JvcEFuZFJlc2l6ZSA9IG9wKHtjcm9wQW5kUmVzaXplX30pO1xuIl19","/**\n * @license\n * Copyright 2020 Google LLC. All Rights Reserved.\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n * =============================================================================\n */\nimport { ENGINE } from '../../engine';\nimport { FlipLeftRight } from '../../kernel_names';\nimport { convertToTensor } from '../../tensor_util_env';\nimport * as util from '../../util';\nimport { op } from '../operation';\n/**\n * Flips the image left to right. Currently available in the CPU, WebGL, and\n * WASM backends.\n *\n * @param image 4d tensor of shape `[batch, imageHeight, imageWidth, depth]`.\n */\n/** @doc {heading: 'Operations', subheading: 'Images', namespace: 'image'} */\nfunction flipLeftRight_(image) {\n const $image = convertToTensor(image, 'image', 'flipLeftRight', 'float32');\n util.assert($image.rank === 4, () => 'Error in flipLeftRight: image must be rank 4,' +\n `but got rank ${$image.rank}.`);\n const inputs = { image: $image };\n const res = ENGINE.runKernel(FlipLeftRight, inputs, {});\n return res;\n}\nexport const flipLeftRight = op({ flipLeftRight_ });\n//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZmxpcF9sZWZ0X3JpZ2h0LmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vLi4vLi4vdGZqcy1jb3JlL3NyYy9vcHMvaW1hZ2UvZmxpcF9sZWZ0X3JpZ2h0LnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBOzs7Ozs7Ozs7Ozs7Ozs7R0FlRztBQUVILE9BQU8sRUFBQyxNQUFNLEVBQUMsTUFBTSxjQUFjLENBQUM7QUFDcEMsT0FBTyxFQUFDLGFBQWEsRUFBc0IsTUFBTSxvQkFBb0IsQ0FBQztBQUd0RSxPQUFPLEVBQUMsZUFBZSxFQUFDLE1BQU0sdUJBQXVCLENBQUM7QUFFdEQsT0FBTyxLQUFLLElBQUksTUFBTSxZQUFZLENBQUM7QUFDbkMsT0FBTyxFQUFDLEVBQUUsRUFBQyxNQUFNLGNBQWMsQ0FBQztBQUVoQzs7Ozs7R0FLRztBQUNILDZFQUE2RTtBQUM3RSxTQUFTLGNBQWMsQ0FBQyxLQUEwQjtJQUNoRCxNQUFNLE1BQU0sR0FBRyxlQUFlLENBQUMsS0FBSyxFQUFFLE9BQU8sRUFBRSxlQUFlLEVBQUUsU0FBUyxDQUFDLENBQUM7SUFFM0UsSUFBSSxDQUFDLE1BQU0sQ0FDUCxNQUFNLENBQUMsSUFBSSxLQUFLLENBQUMsRUFDakIsR0FBRyxFQUFFLENBQUMsK0NBQStDO1FBQ2pELGdCQUFnQixNQUFNLENBQUMsSUFBSSxHQUFHLENBQUMsQ0FBQztJQUV4QyxNQUFNLE1BQU0sR0FBd0IsRUFBQyxLQUFLLEVBQUUsTUFBTSxFQUFDLENBQUM7SUFDcEQsTUFBTSxHQUFHLEdBQ0wsTUFBTSxDQUFDLFNBQVMsQ0FBQyxhQUFhLEVBQUUsTUFBOEIsRUFBRSxFQUFFLENBQUMsQ0FBQztJQUN4RSxPQUFPLEdBQWUsQ0FBQztBQUN6QixDQUFDO0FBRUQsTUFBTSxDQUFDLE1BQU0sYUFBYSxHQUFHLEVBQUUsQ0FBQyxFQUFDLGNBQWMsRUFBQyxDQUFDLENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyIvKipcbiAqIEBsaWNlbnNlXG4gKiBDb3B5cmlnaHQgMjAyMCBHb29nbGUgTExDLiBBbGwgUmlnaHRzIFJlc2VydmVkLlxuICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlIFwiTGljZW5zZVwiKTtcbiAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS5cbiAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdFxuICpcbiAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMFxuICpcbiAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmVcbiAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuIFwiQVMgSVNcIiBCQVNJUyxcbiAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLlxuICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZFxuICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuXG4gKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuICovXG5cbmltcG9ydCB7RU5HSU5FfSBmcm9tICcuLi8uLi9lbmdpbmUnO1xuaW1wb3J0IHtGbGlwTGVmdFJpZ2h0LCBGbGlwTGVmdFJpZ2h0SW5wdXRzfSBmcm9tICcuLi8uLi9rZXJuZWxfbmFtZXMnO1xuaW1wb3J0IHtUZW5zb3I0RH0gZnJvbSAnLi4vLi4vdGVuc29yJztcbmltcG9ydCB7TmFtZWRUZW5zb3JNYXB9IGZyb20gJy4uLy4uL3RlbnNvcl90eXBlcyc7XG5pbXBvcnQge2NvbnZlcnRUb1RlbnNvcn0gZnJvbSAnLi4vLi4vdGVuc29yX3V0aWxfZW52JztcbmltcG9ydCB7VGVuc29yTGlrZX0gZnJvbSAnLi4vLi4vdHlwZXMnO1xuaW1wb3J0ICogYXMgdXRpbCBmcm9tICcuLi8uLi91dGlsJztcbmltcG9ydCB7b3B9IGZyb20gJy4uL29wZXJhdGlvbic7XG5cbi8qKlxuICogRmxpcHMgdGhlIGltYWdlIGxlZnQgdG8gcmlnaHQuIEN1cnJlbnRseSBhdmFpbGFibGUgaW4gdGhlIENQVSwgV2ViR0wsIGFuZFxuICogV0FTTSBiYWNrZW5kcy5cbiAqXG4gKiBAcGFyYW0gaW1hZ2UgNGQgdGVuc29yIG9mIHNoYXBlIGBbYmF0Y2gsIGltYWdlSGVpZ2h0LCBpbWFnZVdpZHRoLCBkZXB0aF1gLlxuICovXG4vKiogQGRvYyB7aGVhZGluZzogJ09wZXJhdGlvbnMnLCBzdWJoZWFkaW5nOiAnSW1hZ2VzJywgbmFtZXNwYWNlOiAnaW1hZ2UnfSAqL1xuZnVuY3Rpb24gZmxpcExlZnRSaWdodF8oaW1hZ2U6IFRlbnNvcjREfFRlbnNvckxpa2UpOiBUZW5zb3I0RCB7XG4gIGNvbnN0ICRpbWFnZSA9IGNvbnZlcnRUb1RlbnNvcihpbWFnZSwgJ2ltYWdlJywgJ2ZsaXBMZWZ0UmlnaHQnLCAnZmxvYXQzMicpO1xuXG4gIHV0aWwuYXNzZXJ0KFxuICAgICAgJGltYWdlLnJhbmsgPT09IDQsXG4gICAgICAoKSA9PiAnRXJyb3IgaW4gZmxpcExlZnRSaWdodDogaW1hZ2UgbXVzdCBiZSByYW5rIDQsJyArXG4gICAgICAgICAgYGJ1dCBnb3QgcmFuayAkeyRpbWFnZS5yYW5rfS5gKTtcblxuICBjb25zdCBpbnB1dHM6IEZsaXBMZWZ0UmlnaHRJbnB1dHMgPSB7aW1hZ2U6ICRpbWFnZX07XG4gIGNvbnN0IHJlcyA9XG4gICAgICBFTkdJTkUucnVuS2VybmVsKEZsaXBMZWZ0UmlnaHQsIGlucHV0cyBhcyB7fSBhcyBOYW1lZFRlbnNvck1hcCwge30pO1xuICByZXR1cm4gcmVzIGFzIFRlbnNvcjREO1xufVxuXG5leHBvcnQgY29uc3QgZmxpcExlZnRSaWdodCA9IG9wKHtmbGlwTGVmdFJpZ2h0X30pO1xuIl19","/**\n * @license\n * Copyright 2021 Google LLC. All Rights Reserved.\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n * =============================================================================\n */\nimport { convertToTensor } from '../../tensor_util_env';\nimport * as util from '../../util';\nimport { op } from '../operation';\nimport { tile } from '../tile';\n/**\n * Converts images from grayscale to RGB format.\n *\n * @param image A grayscale tensor to convert. The `image`'s last dimension must\n * be size 1 with at least a two-dimensional shape.\n *\n * @doc {heading: 'Operations', subheading: 'Images', namespace: 'image'}\n */\nfunction grayscaleToRGB_(image) {\n const $image = convertToTensor(image, 'image', 'grayscaleToRGB');\n const lastDimsIdx = $image.rank - 1;\n const lastDims = $image.shape[lastDimsIdx];\n util.assert($image.rank >= 2, () => 'Error in grayscaleToRGB: images must be at least rank 2, ' +\n `but got rank ${$image.rank}.`);\n util.assert(lastDims === 1, () => 'Error in grayscaleToRGB: last dimension of a grayscale image ' +\n `should be size 1, but got size ${lastDims}.`);\n const reps = new Array($image.rank);\n reps.fill(1, 0, lastDimsIdx);\n reps[lastDimsIdx] = 3;\n return tile($image, reps);\n}\nexport const grayscaleToRGB = op({ grayscaleToRGB_ });\n//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZ3JheXNjYWxlX3RvX3JnYi5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uLy4uLy4uL3RmanMtY29yZS9zcmMvb3BzL2ltYWdlL2dyYXlzY2FsZV90b19yZ2IudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUE7Ozs7Ozs7Ozs7Ozs7OztHQWVHO0FBR0gsT0FBTyxFQUFDLGVBQWUsRUFBQyxNQUFNLHVCQUF1QixDQUFDO0FBRXRELE9BQU8sS0FBSyxJQUFJLE1BQU0sWUFBWSxDQUFDO0FBRW5DLE9BQU8sRUFBQyxFQUFFLEVBQUMsTUFBTSxjQUFjLENBQUM7QUFDaEMsT0FBTyxFQUFDLElBQUksRUFBQyxNQUFNLFNBQVMsQ0FBQztBQUU3Qjs7Ozs7OztHQU9HO0FBQ0gsU0FBUyxlQUFlLENBQ1csS0FBbUI7SUFDcEQsTUFBTSxNQUFNLEdBQUcsZUFBZSxDQUFDLEtBQUssRUFBRSxPQUFPLEVBQUUsZ0JBQWdCLENBQUMsQ0FBQztJQUVqRSxNQUFNLFdBQVcsR0FBRyxNQUFNLENBQUMsSUFBSSxHQUFHLENBQUMsQ0FBQztJQUNwQyxNQUFNLFFBQVEsR0FBRyxNQUFNLENBQUMsS0FBSyxDQUFDLFdBQVcsQ0FBQyxDQUFDO0lBRTNDLElBQUksQ0FBQyxNQUFNLENBQ1AsTUFBTSxDQUFDLElBQUksSUFBSSxDQUFDLEVBQ2hCLEdBQUcsRUFBRSxDQUFDLDJEQUEyRDtRQUM3RCxnQkFBZ0IsTUFBTSxDQUFDLElBQUksR0FBRyxDQUFDLENBQUM7SUFFeEMsSUFBSSxDQUFDLE1BQU0sQ0FDUCxRQUFRLEtBQUssQ0FBQyxFQUNkLEdBQUcsRUFBRSxDQUFDLCtEQUErRDtRQUNqRSxrQ0FBa0MsUUFBUSxHQUFHLENBQUMsQ0FBQztJQUV2RCxNQUFNLElBQUksR0FBRyxJQUFJLEtBQUssQ0FBQyxNQUFNLENBQUMsSUFBSSxDQUFDLENBQUM7SUFFcEMsSUFBSSxDQUFDLElBQUksQ0FBQyxDQUFDLEVBQUUsQ0FBQyxFQUFFLFdBQVcsQ0FBQyxDQUFDO0lBQzdCLElBQUksQ0FBQyxXQUFXLENBQUMsR0FBRyxDQUFDLENBQUM7SUFFdEIsT0FBTyxJQUFJLENBQUMsTUFBTSxFQUFFLElBQUksQ0FBQyxDQUFDO0FBQzVCLENBQUM7QUFFRCxNQUFNLENBQUMsTUFBTSxjQUFjLEdBQUcsRUFBRSxDQUFDLEVBQUMsZUFBZSxFQUFDLENBQUMsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbIi8qKlxuICogQGxpY2Vuc2VcbiAqIENvcHlyaWdodCAyMDIxIEdvb2dsZSBMTEMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuXG4gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgXCJMaWNlbnNlXCIpO1xuICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLlxuICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0XG4gKlxuICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wXG4gKlxuICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZVxuICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gXCJBUyBJU1wiIEJBU0lTLFxuICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuXG4gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kXG4gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS5cbiAqID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4gKi9cblxuaW1wb3J0IHtUZW5zb3IyRCwgVGVuc29yM0QsIFRlbnNvcjRELCBUZW5zb3I1RCwgVGVuc29yNkR9IGZyb20gJy4uLy4uL3RlbnNvcic7XG5pbXBvcnQge2NvbnZlcnRUb1RlbnNvcn0gZnJvbSAnLi4vLi4vdGVuc29yX3V0aWxfZW52JztcbmltcG9ydCB7VGVuc29yTGlrZX0gZnJvbSAnLi4vLi4vdHlwZXMnO1xuaW1wb3J0ICogYXMgdXRpbCBmcm9tICcuLi8uLi91dGlsJztcblxuaW1wb3J0IHtvcH0gZnJvbSAnLi4vb3BlcmF0aW9uJztcbmltcG9ydCB7dGlsZX0gZnJvbSAnLi4vdGlsZSc7XG5cbi8qKlxuICogQ29udmVydHMgaW1hZ2VzIGZyb20gZ3JheXNjYWxlIHRvIFJHQiBmb3JtYXQuXG4gKlxuICogQHBhcmFtIGltYWdlIEEgZ3JheXNjYWxlIHRlbnNvciB0byBjb252ZXJ0LiBUaGUgYGltYWdlYCdzIGxhc3QgZGltZW5zaW9uIG11c3RcbiAqICAgICBiZSBzaXplIDEgd2l0aCBhdCBsZWFzdCBhIHR3by1kaW1lbnNpb25hbCBzaGFwZS5cbiAqXG4gKiBAZG9jIHtoZWFkaW5nOiAnT3BlcmF0aW9ucycsIHN1YmhlYWRpbmc6ICdJbWFnZXMnLCBuYW1lc3BhY2U6ICdpbWFnZSd9XG4gKi9cbmZ1bmN0aW9uIGdyYXlzY2FsZVRvUkdCXzxUIGV4dGVuZHMgVGVuc29yMkR8VGVuc29yM0R8VGVuc29yNER8VGVuc29yNUR8XG4gICAgICAgICAgICAgICAgICAgICAgICAgVGVuc29yNkQ+KGltYWdlOiBUfFRlbnNvckxpa2UpOiBUIHtcbiAgY29uc3QgJGltYWdlID0gY29udmVydFRvVGVuc29yKGltYWdlLCAnaW1hZ2UnLCAnZ3JheXNjYWxlVG9SR0InKTtcblxuICBjb25zdCBsYXN0RGltc0lkeCA9ICRpbWFnZS5yYW5rIC0gMTtcbiAgY29uc3QgbGFzdERpbXMgPSAkaW1hZ2Uuc2hhcGVbbGFzdERpbXNJZHhdO1xuXG4gIHV0aWwuYXNzZXJ0KFxuICAgICAgJGltYWdlLnJhbmsgPj0gMixcbiAgICAgICgpID0+ICdFcnJvciBpbiBncmF5c2NhbGVUb1JHQjogaW1hZ2VzIG11c3QgYmUgYXQgbGVhc3QgcmFuayAyLCAnICtcbiAgICAgICAgICBgYnV0IGdvdCByYW5rICR7JGltYWdlLnJhbmt9LmApO1xuXG4gIHV0aWwuYXNzZXJ0KFxuICAgICAgbGFzdERpbXMgPT09IDEsXG4gICAgICAoKSA9PiAnRXJyb3IgaW4gZ3JheXNjYWxlVG9SR0I6IGxhc3QgZGltZW5zaW9uIG9mIGEgZ3JheXNjYWxlIGltYWdlICcgK1xuICAgICAgICAgIGBzaG91bGQgYmUgc2l6ZSAxLCBidXQgZ290IHNpemUgJHtsYXN0RGltc30uYCk7XG5cbiAgY29uc3QgcmVwcyA9IG5ldyBBcnJheSgkaW1hZ2UucmFuayk7XG5cbiAgcmVwcy5maWxsKDEsIDAsIGxhc3REaW1zSWR4KTtcbiAgcmVwc1tsYXN0RGltc0lkeF0gPSAzO1xuXG4gIHJldHVybiB0aWxlKCRpbWFnZSwgcmVwcyk7XG59XG5cbmV4cG9ydCBjb25zdCBncmF5c2NhbGVUb1JHQiA9IG9wKHtncmF5c2NhbGVUb1JHQl99KTtcbiJdfQ==","/**\n * @license\n * Copyright 2020 Google LLC. All Rights Reserved.\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n * =============================================================================\n */\nimport { ENGINE } from '../../engine';\nimport { RotateWithOffset } from '../../kernel_names';\nimport { convertToTensor } from '../../tensor_util_env';\nimport * as util from '../../util';\nimport { op } from '../operation';\n/**\n * Rotates the input image tensor counter-clockwise with an optional offset\n * center of rotation. Currently available in the CPU, WebGL, and WASM backends.\n *\n * @param image 4d tensor of shape `[batch, imageHeight, imageWidth, depth]`.\n * @param radians The amount of rotation.\n * @param fillValue The value to fill in the empty space leftover\n * after rotation. Can be either a single grayscale value (0-255), or an\n * array of three numbers `[red, green, blue]` specifying the red, green,\n * and blue channels. Defaults to `0` (black).\n * @param center The center of rotation. Can be either a single value (0-1), or\n * an array of two numbers `[centerX, centerY]`. Defaults to `0.5` (rotates\n * the image around its center).\n *\n * @doc {heading: 'Operations', subheading: 'Images', namespace: 'image'}\n */\nfunction rotateWithOffset_(image, radians, fillValue = 0, center = 0.5) {\n const $image = convertToTensor(image, 'image', 'rotateWithOffset', 'float32');\n util.assert($image.rank === 4, () => 'Error in rotateWithOffset: image must be rank 4,' +\n `but got rank ${$image.rank}.`);\n const inputs = { image: $image };\n const attrs = { radians, fillValue, center };\n const res = ENGINE.runKernel(RotateWithOffset, inputs, attrs);\n return res;\n}\nexport const rotateWithOffset = op({ rotateWithOffset_ });\n//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicm90YXRlX3dpdGhfb2Zmc2V0LmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vLi4vLi4vdGZqcy1jb3JlL3NyYy9vcHMvaW1hZ2Uvcm90YXRlX3dpdGhfb2Zmc2V0LnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBOzs7Ozs7Ozs7Ozs7Ozs7R0FlRztBQUVILE9BQU8sRUFBQyxNQUFNLEVBQUMsTUFBTSxjQUFjLENBQUM7QUFDcEMsT0FBTyxFQUFDLGdCQUFnQixFQUFnRCxNQUFNLG9CQUFvQixDQUFDO0FBSW5HLE9BQU8sRUFBQyxlQUFlLEVBQUMsTUFBTSx1QkFBdUIsQ0FBQztBQUV0RCxPQUFPLEtBQUssSUFBSSxNQUFNLFlBQVksQ0FBQztBQUVuQyxPQUFPLEVBQUMsRUFBRSxFQUFDLE1BQU0sY0FBYyxDQUFDO0FBRWhDOzs7Ozs7Ozs7Ozs7Ozs7R0FlRztBQUNILFNBQVMsaUJBQWlCLENBQ3RCLEtBQTBCLEVBQUUsT0FBZSxFQUMzQyxZQUE2QyxDQUFDLEVBQzlDLFNBQWtDLEdBQUc7SUFDdkMsTUFBTSxNQUFNLEdBQUcsZUFBZSxDQUFDLEtBQUssRUFBRSxPQUFPLEVBQUUsa0JBQWtCLEVBQUUsU0FBUyxDQUFDLENBQUM7SUFFOUUsSUFBSSxDQUFDLE1BQU0sQ0FDUCxNQUFNLENBQUMsSUFBSSxLQUFLLENBQUMsRUFDakIsR0FBRyxFQUFFLENBQUMsa0RBQWtEO1FBQ3BELGdCQUFnQixNQUFNLENBQUMsSUFBSSxHQUFHLENBQUMsQ0FBQztJQUV4QyxNQUFNLE1BQU0sR0FBMkIsRUFBQyxLQUFLLEVBQUUsTUFBTSxFQUFDLENBQUM7SUFDdkQsTUFBTSxLQUFLLEdBQTBCLEVBQUMsT0FBTyxFQUFFLFNBQVMsRUFBRSxNQUFNLEVBQUMsQ0FBQztJQUNsRSxNQUFNLEdBQUcsR0FBRyxNQUFNLENBQUMsU0FBUyxDQUN4QixnQkFBZ0IsRUFBRSxNQUE4QixFQUNoRCxLQUEyQixDQUFDLENBQUM7SUFDakMsT0FBTyxHQUFlLENBQUM7QUFDekIsQ0FBQztBQUVELE1BQU0sQ0FBQyxNQUFNLGdCQUFnQixHQUFHLEVBQUUsQ0FBQyxFQUFDLGlCQUFpQixFQUFDLENBQUMsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbIi8qKlxuICogQGxpY2Vuc2VcbiAqIENvcHlyaWdodCAyMDIwIEdvb2dsZSBMTEMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuXG4gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgXCJMaWNlbnNlXCIpO1xuICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLlxuICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0XG4gKlxuICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wXG4gKlxuICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZVxuICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gXCJBUyBJU1wiIEJBU0lTLFxuICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuXG4gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kXG4gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS5cbiAqID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4gKi9cblxuaW1wb3J0IHtFTkdJTkV9IGZyb20gJy4uLy4uL2VuZ2luZSc7XG5pbXBvcnQge1JvdGF0ZVdpdGhPZmZzZXQsIFJvdGF0ZVdpdGhPZmZzZXRBdHRycywgUm90YXRlV2l0aE9mZnNldElucHV0c30gZnJvbSAnLi4vLi4va2VybmVsX25hbWVzJztcbmltcG9ydCB7TmFtZWRBdHRyTWFwfSBmcm9tICcuLi8uLi9rZXJuZWxfcmVnaXN0cnknO1xuaW1wb3J0IHtUZW5zb3I0RH0gZnJvbSAnLi4vLi4vdGVuc29yJztcbmltcG9ydCB7TmFtZWRUZW5zb3JNYXB9IGZyb20gJy4uLy4uL3RlbnNvcl90eXBlcyc7XG5pbXBvcnQge2NvbnZlcnRUb1RlbnNvcn0gZnJvbSAnLi4vLi4vdGVuc29yX3V0aWxfZW52JztcbmltcG9ydCB7VGVuc29yTGlrZX0gZnJvbSAnLi4vLi4vdHlwZXMnO1xuaW1wb3J0ICogYXMgdXRpbCBmcm9tICcuLi8uLi91dGlsJztcblxuaW1wb3J0IHtvcH0gZnJvbSAnLi4vb3BlcmF0aW9uJztcblxuLyoqXG4gKiBSb3RhdGVzIHRoZSBpbnB1dCBpbWFnZSB0ZW5zb3IgY291bnRlci1jbG9ja3dpc2Ugd2l0aCBhbiBvcHRpb25hbCBvZmZzZXRcbiAqIGNlbnRlciBvZiByb3RhdGlvbi4gQ3VycmVudGx5IGF2YWlsYWJsZSBpbiB0aGUgQ1BVLCBXZWJHTCwgYW5kIFdBU00gYmFja2VuZHMuXG4gKlxuICogQHBhcmFtIGltYWdlIDRkIHRlbnNvciBvZiBzaGFwZSBgW2JhdGNoLCBpbWFnZUhlaWdodCwgaW1hZ2VXaWR0aCwgZGVwdGhdYC5cbiAqIEBwYXJhbSByYWRpYW5zIFRoZSBhbW91bnQgb2Ygcm90YXRpb24uXG4gKiBAcGFyYW0gZmlsbFZhbHVlIFRoZSB2YWx1ZSB0byBmaWxsIGluIHRoZSBlbXB0eSBzcGFjZSBsZWZ0b3ZlclxuICogICAgIGFmdGVyIHJvdGF0aW9uLiBDYW4gYmUgZWl0aGVyIGEgc2luZ2xlIGdyYXlzY2FsZSB2YWx1ZSAoMC0yNTUpLCBvciBhblxuICogICAgIGFycmF5IG9mIHRocmVlIG51bWJlcnMgYFtyZWQsIGdyZWVuLCBibHVlXWAgc3BlY2lmeWluZyB0aGUgcmVkLCBncmVlbixcbiAqICAgICBhbmQgYmx1ZSBjaGFubmVscy4gRGVmYXVsdHMgdG8gYDBgIChibGFjaykuXG4gKiBAcGFyYW0gY2VudGVyIFRoZSBjZW50ZXIgb2Ygcm90YXRpb24uIENhbiBiZSBlaXRoZXIgYSBzaW5nbGUgdmFsdWUgKDAtMSksIG9yXG4gKiAgICAgYW4gYXJyYXkgb2YgdHdvIG51bWJlcnMgYFtjZW50ZXJYLCBjZW50ZXJZXWAuIERlZmF1bHRzIHRvIGAwLjVgIChyb3RhdGVzXG4gKiAgICAgdGhlIGltYWdlIGFyb3VuZCBpdHMgY2VudGVyKS5cbiAqXG4gKiBAZG9jIHtoZWFkaW5nOiAnT3BlcmF0aW9ucycsIHN1YmhlYWRpbmc6ICdJbWFnZXMnLCBuYW1lc3BhY2U6ICdpbWFnZSd9XG4gKi9cbmZ1bmN0aW9uIHJvdGF0ZVdpdGhPZmZzZXRfKFxuICAgIGltYWdlOiBUZW5zb3I0RHxUZW5zb3JMaWtlLCByYWRpYW5zOiBudW1iZXIsXG4gICAgZmlsbFZhbHVlOiBudW1iZXJ8W251bWJlciwgbnVtYmVyLCBudW1iZXJdID0gMCxcbiAgICBjZW50ZXI6IG51bWJlcnxbbnVtYmVyLCBudW1iZXJdID0gMC41KTogVGVuc29yNEQge1xuICBjb25zdCAkaW1hZ2UgPSBjb252ZXJ0VG9UZW5zb3IoaW1hZ2UsICdpbWFnZScsICdyb3RhdGVXaXRoT2Zmc2V0JywgJ2Zsb2F0MzInKTtcblxuICB1dGlsLmFzc2VydChcbiAgICAgICRpbWFnZS5yYW5rID09PSA0LFxuICAgICAgKCkgPT4gJ0Vycm9yIGluIHJvdGF0ZVdpdGhPZmZzZXQ6IGltYWdlIG11c3QgYmUgcmFuayA0LCcgK1xuICAgICAgICAgIGBidXQgZ290IHJhbmsgJHskaW1hZ2UucmFua30uYCk7XG5cbiAgY29uc3QgaW5wdXRzOiBSb3RhdGVXaXRoT2Zmc2V0SW5wdXRzID0ge2ltYWdlOiAkaW1hZ2V9O1xuICBjb25zdCBhdHRyczogUm90YXRlV2l0aE9mZnNldEF0dHJzID0ge3JhZGlhbnMsIGZpbGxWYWx1ZSwgY2VudGVyfTtcbiAgY29uc3QgcmVzID0gRU5HSU5FLnJ1bktlcm5lbChcbiAgICAgIFJvdGF0ZVdpdGhPZmZzZXQsIGlucHV0cyBhcyB7fSBhcyBOYW1lZFRlbnNvck1hcCxcbiAgICAgIGF0dHJzIGFzIHt9IGFzIE5hbWVkQXR0ck1hcCk7XG4gIHJldHVybiByZXMgYXMgVGVuc29yNEQ7XG59XG5cbmV4cG9ydCBjb25zdCByb3RhdGVXaXRoT2Zmc2V0ID0gb3Aoe3JvdGF0ZVdpdGhPZmZzZXRffSk7XG4iXX0=","/**\n * @license\n * Copyright 2020 Google LLC. All Rights Reserved.\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n * =============================================================================\n */\nimport * as util from '../util';\nfunction nonMaxSuppSanityCheck(boxes, scores, maxOutputSize, iouThreshold, scoreThreshold, softNmsSigma) {\n if (iouThreshold == null) {\n iouThreshold = 0.5;\n }\n if (scoreThreshold == null) {\n scoreThreshold = Number.NEGATIVE_INFINITY;\n }\n if (softNmsSigma == null) {\n softNmsSigma = 0.0;\n }\n const numBoxes = boxes.shape[0];\n maxOutputSize = Math.min(maxOutputSize, numBoxes);\n util.assert(0 <= iouThreshold && iouThreshold <= 1, () => `iouThreshold must be in [0, 1], but was '${iouThreshold}'`);\n util.assert(boxes.rank === 2, () => `boxes must be a 2D tensor, but was of rank '${boxes.rank}'`);\n util.assert(boxes.shape[1] === 4, () => `boxes must have 4 columns, but 2nd dimension was ${boxes.shape[1]}`);\n util.assert(scores.rank === 1, () => 'scores must be a 1D tensor');\n util.assert(scores.shape[0] === numBoxes, () => `scores has incompatible shape with boxes. Expected ${numBoxes}, ` +\n `but was ${scores.shape[0]}`);\n util.assert(0 <= softNmsSigma && softNmsSigma <= 1, () => `softNmsSigma must be in [0, 1], but was '${softNmsSigma}'`);\n return { maxOutputSize, iouThreshold, scoreThreshold, softNmsSigma };\n}\nexport { nonMaxSuppSanityCheck };\n//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibm9ubWF4X3V0aWwuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi8uLi90ZmpzLWNvcmUvc3JjL29wcy9ub25tYXhfdXRpbC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQTs7Ozs7Ozs7Ozs7Ozs7O0dBZUc7QUFHSCxPQUFPLEtBQUssSUFBSSxNQUFNLFNBQVMsQ0FBQztBQUVoQyxTQUFTLHFCQUFxQixDQUMxQixLQUFlLEVBQUUsTUFBZ0IsRUFBRSxhQUFxQixFQUN4RCxZQUFvQixFQUFFLGNBQXNCLEVBQUUsWUFBcUI7SUFNckUsSUFBSSxZQUFZLElBQUksSUFBSSxFQUFFO1FBQ3hCLFlBQVksR0FBRyxHQUFHLENBQUM7S0FDcEI7SUFDRCxJQUFJLGNBQWMsSUFBSSxJQUFJLEVBQUU7UUFDMUIsY0FBYyxHQUFHLE1BQU0sQ0FBQyxpQkFBaUIsQ0FBQztLQUMzQztJQUNELElBQUksWUFBWSxJQUFJLElBQUksRUFBRTtRQUN4QixZQUFZLEdBQUcsR0FBRyxDQUFDO0tBQ3BCO0lBRUQsTUFBTSxRQUFRLEdBQUcsS0FBSyxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUMsQ0FBQztJQUNoQyxhQUFhLEdBQUcsSUFBSSxDQUFDLEdBQUcsQ0FBQyxhQUFhLEVBQUUsUUFBUSxDQUFDLENBQUM7SUFFbEQsSUFBSSxDQUFDLE1BQU0sQ0FDUCxDQUFDLElBQUksWUFBWSxJQUFJLFlBQVksSUFBSSxDQUFDLEVBQ3RDLEdBQUcsRUFBRSxDQUFDLDRDQUE0QyxZQUFZLEdBQUcsQ0FBQyxDQUFDO0lBQ3ZFLElBQUksQ0FBQyxNQUFNLENBQ1AsS0FBSyxDQUFDLElBQUksS0FBSyxDQUFDLEVBQ2hCLEdBQUcsRUFBRSxDQUFDLCtDQUErQyxLQUFLLENBQUMsSUFBSSxHQUFHLENBQUMsQ0FBQztJQUN4RSxJQUFJLENBQUMsTUFBTSxDQUNQLEtBQUssQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDLEtBQUssQ0FBQyxFQUNwQixHQUFHLEVBQUUsQ0FDRCxvREFBb0QsS0FBSyxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUM7SUFDOUUsSUFBSSxDQUFDLE1BQU0sQ0FBQyxNQUFNLENBQUMsSUFBSSxLQUFLLENBQUMsRUFBRSxHQUFHLEVBQUUsQ0FBQyw0QkFBNEIsQ0FBQyxDQUFDO0lBQ25FLElBQUksQ0FBQyxNQUFNLENBQ1AsTUFBTSxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUMsS0FBSyxRQUFRLEVBQzVCLEdBQUcsRUFBRSxDQUFDLHNEQUFzRCxRQUFRLElBQUk7UUFDcEUsV0FBVyxNQUFNLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQztJQUN0QyxJQUFJLENBQUMsTUFBTSxDQUNQLENBQUMsSUFBSSxZQUFZLElBQUksWUFBWSxJQUFJLENBQUMsRUFDdEMsR0FBRyxFQUFFLENBQUMsNENBQTRDLFlBQVksR0FBRyxDQUFDLENBQUM7SUFDdkUsT0FBTyxFQUFDLGFBQWEsRUFBRSxZQUFZLEVBQUUsY0FBYyxFQUFFLFlBQVksRUFBQyxDQUFDO0FBQ3JFLENBQUM7QUFFRCxPQUFPLEVBQUMscUJBQXFCLEVBQUMsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbIi8qKlxuICogQGxpY2Vuc2VcbiAqIENvcHlyaWdodCAyMDIwIEdvb2dsZSBMTEMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuXG4gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgXCJMaWNlbnNlXCIpO1xuICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLlxuICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0XG4gKlxuICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wXG4gKlxuICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZVxuICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gXCJBUyBJU1wiIEJBU0lTLFxuICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuXG4gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kXG4gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS5cbiAqID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4gKi9cblxuaW1wb3J0IHtUZW5zb3IxRCwgVGVuc29yMkR9IGZyb20gJy4uL3RlbnNvcic7XG5pbXBvcnQgKiBhcyB1dGlsIGZyb20gJy4uL3V0aWwnO1xuXG5mdW5jdGlvbiBub25NYXhTdXBwU2FuaXR5Q2hlY2soXG4gICAgYm94ZXM6IFRlbnNvcjJELCBzY29yZXM6IFRlbnNvcjFELCBtYXhPdXRwdXRTaXplOiBudW1iZXIsXG4gICAgaW91VGhyZXNob2xkOiBudW1iZXIsIHNjb3JlVGhyZXNob2xkOiBudW1iZXIsIHNvZnRObXNTaWdtYT86IG51bWJlcik6IHtcbiAgbWF4T3V0cHV0U2l6ZTogbnVtYmVyLFxuICBpb3VUaHJlc2hvbGQ6IG51bWJlcixcbiAgc2NvcmVUaHJlc2hvbGQ6IG51bWJlcixcbiAgc29mdE5tc1NpZ21hOiBudW1iZXJcbn0ge1xuICBpZiAoaW91VGhyZXNob2xkID09IG51bGwpIHtcbiAgICBpb3VUaHJlc2hvbGQgPSAwLjU7XG4gIH1cbiAgaWYgKHNjb3JlVGhyZXNob2xkID09IG51bGwpIHtcbiAgICBzY29yZVRocmVzaG9sZCA9IE51bWJlci5ORUdBVElWRV9JTkZJTklUWTtcbiAgfVxuICBpZiAoc29mdE5tc1NpZ21hID09IG51bGwpIHtcbiAgICBzb2Z0Tm1zU2lnbWEgPSAwLjA7XG4gIH1cblxuICBjb25zdCBudW1Cb3hlcyA9IGJveGVzLnNoYXBlWzBdO1xuICBtYXhPdXRwdXRTaXplID0gTWF0aC5taW4obWF4T3V0cHV0U2l6ZSwgbnVtQm94ZXMpO1xuXG4gIHV0aWwuYXNzZXJ0KFxuICAgICAgMCA8PSBpb3VUaHJlc2hvbGQgJiYgaW91VGhyZXNob2xkIDw9IDEsXG4gICAgICAoKSA9PiBgaW91VGhyZXNob2xkIG11c3QgYmUgaW4gWzAsIDFdLCBidXQgd2FzICcke2lvdVRocmVzaG9sZH0nYCk7XG4gIHV0aWwuYXNzZXJ0KFxuICAgICAgYm94ZXMucmFuayA9PT0gMixcbiAgICAgICgpID0+IGBib3hlcyBtdXN0IGJlIGEgMkQgdGVuc29yLCBidXQgd2FzIG9mIHJhbmsgJyR7Ym94ZXMucmFua30nYCk7XG4gIHV0aWwuYXNzZXJ0KFxuICAgICAgYm94ZXMuc2hhcGVbMV0gPT09IDQsXG4gICAgICAoKSA9PlxuICAgICAgICAgIGBib3hlcyBtdXN0IGhhdmUgNCBjb2x1bW5zLCBidXQgMm5kIGRpbWVuc2lvbiB3YXMgJHtib3hlcy5zaGFwZVsxXX1gKTtcbiAgdXRpbC5hc3NlcnQoc2NvcmVzLnJhbmsgPT09IDEsICgpID0+ICdzY29yZXMgbXVzdCBiZSBhIDFEIHRlbnNvcicpO1xuICB1dGlsLmFzc2VydChcbiAgICAgIHNjb3Jlcy5zaGFwZVswXSA9PT0gbnVtQm94ZXMsXG4gICAgICAoKSA9PiBgc2NvcmVzIGhhcyBpbmNvbXBhdGlibGUgc2hhcGUgd2l0aCBib3hlcy4gRXhwZWN0ZWQgJHtudW1Cb3hlc30sIGAgK1xuICAgICAgICAgIGBidXQgd2FzICR7c2NvcmVzLnNoYXBlWzBdfWApO1xuICB1dGlsLmFzc2VydChcbiAgICAgIDAgPD0gc29mdE5tc1NpZ21hICYmIHNvZnRObXNTaWdtYSA8PSAxLFxuICAgICAgKCkgPT4gYHNvZnRObXNTaWdtYSBtdXN0IGJlIGluIFswLCAxXSwgYnV0IHdhcyAnJHtzb2Z0Tm1zU2lnbWF9J2ApO1xuICByZXR1cm4ge21heE91dHB1dFNpemUsIGlvdVRocmVzaG9sZCwgc2NvcmVUaHJlc2hvbGQsIHNvZnRObXNTaWdtYX07XG59XG5cbmV4cG9ydCB7bm9uTWF4U3VwcFNhbml0eUNoZWNrfTtcbiJdfQ==","/**\n * @license\n * Copyright 2020 Google LLC. All Rights Reserved.\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n * =============================================================================\n */\nimport { ENGINE } from '../../engine';\nimport { NonMaxSuppressionV3 } from '../../kernel_names';\nimport { convertToTensor } from '../../tensor_util_env';\nimport { nonMaxSuppSanityCheck } from '../nonmax_util';\nimport { op } from '../operation';\n/**\n * Performs non maximum suppression of bounding boxes based on\n * iou (intersection over union).\n *\n * @param boxes a 2d tensor of shape `[numBoxes, 4]`. Each entry is\n * `[y1, x1, y2, x2]`, where `(y1, x1)` and `(y2, x2)` are the corners of\n * the bounding box.\n * @param scores a 1d tensor providing the box scores of shape `[numBoxes]`.\n * @param maxOutputSize The maximum number of boxes to be selected.\n * @param iouThreshold A float representing the threshold for deciding whether\n * boxes overlap too much with respect to IOU. Must be between [0, 1].\n * Defaults to 0.5 (50% box overlap).\n * @param scoreThreshold A threshold for deciding when to remove boxes based\n * on score. Defaults to -inf, which means any score is accepted.\n * @return A 1D tensor with the selected box indices.\n *\n * @doc {heading: 'Operations', subheading: 'Images', namespace: 'image'}\n */\nfunction nonMaxSuppression_(boxes, scores, maxOutputSize, iouThreshold = 0.5, scoreThreshold = Number.NEGATIVE_INFINITY) {\n const $boxes = convertToTensor(boxes, 'boxes', 'nonMaxSuppression', 'float32');\n const $scores = convertToTensor(scores, 'scores', 'nonMaxSuppression', 'float32');\n const inputs = nonMaxSuppSanityCheck($boxes, $scores, maxOutputSize, iouThreshold, scoreThreshold);\n maxOutputSize = inputs.maxOutputSize;\n iouThreshold = inputs.iouThreshold;\n scoreThreshold = inputs.scoreThreshold;\n const attrs = { maxOutputSize, iouThreshold, scoreThreshold };\n return ENGINE.runKernel(NonMaxSuppressionV3, { boxes: $boxes, scores: $scores }, attrs);\n}\nexport const nonMaxSuppression = op({ nonMaxSuppression_ });\n//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibm9uX21heF9zdXBwcmVzc2lvbi5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uLy4uLy4uL3RmanMtY29yZS9zcmMvb3BzL2ltYWdlL25vbl9tYXhfc3VwcHJlc3Npb24udHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUE7Ozs7Ozs7Ozs7Ozs7OztHQWVHO0FBRUgsT0FBTyxFQUFDLE1BQU0sRUFBQyxNQUFNLGNBQWMsQ0FBQztBQUNwQyxPQUFPLEVBQUMsbUJBQW1CLEVBQUMsTUFBTSxvQkFBb0IsQ0FBQztBQUV2RCxPQUFPLEVBQUMsZUFBZSxFQUFDLE1BQU0sdUJBQXVCLENBQUM7QUFFdEQsT0FBTyxFQUFDLHFCQUFxQixFQUFDLE1BQU0sZ0JBQWdCLENBQUM7QUFDckQsT0FBTyxFQUFDLEVBQUUsRUFBQyxNQUFNLGNBQWMsQ0FBQztBQUVoQzs7Ozs7Ozs7Ozs7Ozs7Ozs7R0FpQkc7QUFDSCxTQUFTLGtCQUFrQixDQUN2QixLQUEwQixFQUFFLE1BQTJCLEVBQ3ZELGFBQXFCLEVBQUUsWUFBWSxHQUFHLEdBQUcsRUFDekMsY0FBYyxHQUFHLE1BQU0sQ0FBQyxpQkFBaUI7SUFDM0MsTUFBTSxNQUFNLEdBQ1IsZUFBZSxDQUFDLEtBQUssRUFBRSxPQUFPLEVBQUUsbUJBQW1CLEVBQUUsU0FBUyxDQUFDLENBQUM7SUFDcEUsTUFBTSxPQUFPLEdBQ1QsZUFBZSxDQUFDLE1BQU0sRUFBRSxRQUFRLEVBQUUsbUJBQW1CLEVBQUUsU0FBUyxDQUFDLENBQUM7SUFFdEUsTUFBTSxNQUFNLEdBQUcscUJBQXFCLENBQ2hDLE1BQU0sRUFBRSxPQUFPLEVBQUUsYUFBYSxFQUFFLFlBQVksRUFBRSxjQUFjLENBQUMsQ0FBQztJQUNsRSxhQUFhLEdBQUcsTUFBTSxDQUFDLGFBQWEsQ0FBQztJQUNyQyxZQUFZLEdBQUcsTUFBTSxDQUFDLFlBQVksQ0FBQztJQUNuQyxjQUFjLEdBQUcsTUFBTSxDQUFDLGNBQWMsQ0FBQztJQUV2QyxNQUFNLEtBQUssR0FBRyxFQUFDLGFBQWEsRUFBRSxZQUFZLEVBQUUsY0FBYyxFQUFDLENBQUM7SUFDNUQsT0FBTyxNQUFNLENBQUMsU0FBUyxDQUNuQixtQkFBbUIsRUFBRSxFQUFDLEtBQUssRUFBRSxNQUFNLEVBQUUsTUFBTSxFQUFFLE9BQU8sRUFBQyxFQUFFLEtBQUssQ0FBQyxDQUFDO0FBQ3BFLENBQUM7QUFFRCxNQUFNLENBQUMsTUFBTSxpQkFBaUIsR0FBRyxFQUFFLENBQUMsRUFBQyxrQkFBa0IsRUFBQyxDQUFDLENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyIvKipcbiAqIEBsaWNlbnNlXG4gKiBDb3B5cmlnaHQgMjAyMCBHb29nbGUgTExDLiBBbGwgUmlnaHRzIFJlc2VydmVkLlxuICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlIFwiTGljZW5zZVwiKTtcbiAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS5cbiAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdFxuICpcbiAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMFxuICpcbiAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmVcbiAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuIFwiQVMgSVNcIiBCQVNJUyxcbiAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLlxuICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZFxuICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuXG4gKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuICovXG5cbmltcG9ydCB7RU5HSU5FfSBmcm9tICcuLi8uLi9lbmdpbmUnO1xuaW1wb3J0IHtOb25NYXhTdXBwcmVzc2lvblYzfSBmcm9tICcuLi8uLi9rZXJuZWxfbmFtZXMnO1xuaW1wb3J0IHtUZW5zb3IxRCwgVGVuc29yMkR9IGZyb20gJy4uLy4uL3RlbnNvcic7XG5pbXBvcnQge2NvbnZlcnRUb1RlbnNvcn0gZnJvbSAnLi4vLi4vdGVuc29yX3V0aWxfZW52JztcbmltcG9ydCB7VGVuc29yTGlrZX0gZnJvbSAnLi4vLi4vdHlwZXMnO1xuaW1wb3J0IHtub25NYXhTdXBwU2FuaXR5Q2hlY2t9IGZyb20gJy4uL25vbm1heF91dGlsJztcbmltcG9ydCB7b3B9IGZyb20gJy4uL29wZXJhdGlvbic7XG5cbi8qKlxuICogUGVyZm9ybXMgbm9uIG1heGltdW0gc3VwcHJlc3Npb24gb2YgYm91bmRpbmcgYm94ZXMgYmFzZWQgb25cbiAqIGlvdSAoaW50ZXJzZWN0aW9uIG92ZXIgdW5pb24pLlxuICpcbiAqIEBwYXJhbSBib3hlcyBhIDJkIHRlbnNvciBvZiBzaGFwZSBgW251bUJveGVzLCA0XWAuIEVhY2ggZW50cnkgaXNcbiAqICAgICBgW3kxLCB4MSwgeTIsIHgyXWAsIHdoZXJlIGAoeTEsIHgxKWAgYW5kIGAoeTIsIHgyKWAgYXJlIHRoZSBjb3JuZXJzIG9mXG4gKiAgICAgdGhlIGJvdW5kaW5nIGJveC5cbiAqIEBwYXJhbSBzY29yZXMgYSAxZCB0ZW5zb3IgcHJvdmlkaW5nIHRoZSBib3ggc2NvcmVzIG9mIHNoYXBlIGBbbnVtQm94ZXNdYC5cbiAqIEBwYXJhbSBtYXhPdXRwdXRTaXplIFRoZSBtYXhpbXVtIG51bWJlciBvZiBib3hlcyB0byBiZSBzZWxlY3RlZC5cbiAqIEBwYXJhbSBpb3VUaHJlc2hvbGQgQSBmbG9hdCByZXByZXNlbnRpbmcgdGhlIHRocmVzaG9sZCBmb3IgZGVjaWRpbmcgd2hldGhlclxuICogICAgIGJveGVzIG92ZXJsYXAgdG9vIG11Y2ggd2l0aCByZXNwZWN0IHRvIElPVS4gTXVzdCBiZSBiZXR3ZWVuIFswLCAxXS5cbiAqICAgICBEZWZhdWx0cyB0byAwLjUgKDUwJSBib3ggb3ZlcmxhcCkuXG4gKiBAcGFyYW0gc2NvcmVUaHJlc2hvbGQgQSB0aHJlc2hvbGQgZm9yIGRlY2lkaW5nIHdoZW4gdG8gcmVtb3ZlIGJveGVzIGJhc2VkXG4gKiAgICAgb24gc2NvcmUuIERlZmF1bHRzIHRvIC1pbmYsIHdoaWNoIG1lYW5zIGFueSBzY29yZSBpcyBhY2NlcHRlZC5cbiAqIEByZXR1cm4gQSAxRCB0ZW5zb3Igd2l0aCB0aGUgc2VsZWN0ZWQgYm94IGluZGljZXMuXG4gKlxuICogQGRvYyB7aGVhZGluZzogJ09wZXJhdGlvbnMnLCBzdWJoZWFkaW5nOiAnSW1hZ2VzJywgbmFtZXNwYWNlOiAnaW1hZ2UnfVxuICovXG5mdW5jdGlvbiBub25NYXhTdXBwcmVzc2lvbl8oXG4gICAgYm94ZXM6IFRlbnNvcjJEfFRlbnNvckxpa2UsIHNjb3JlczogVGVuc29yMUR8VGVuc29yTGlrZSxcbiAgICBtYXhPdXRwdXRTaXplOiBudW1iZXIsIGlvdVRocmVzaG9sZCA9IDAuNSxcbiAgICBzY29yZVRocmVzaG9sZCA9IE51bWJlci5ORUdBVElWRV9JTkZJTklUWSk6IFRlbnNvcjFEIHtcbiAgY29uc3QgJGJveGVzID1cbiAgICAgIGNvbnZlcnRUb1RlbnNvcihib3hlcywgJ2JveGVzJywgJ25vbk1heFN1cHByZXNzaW9uJywgJ2Zsb2F0MzInKTtcbiAgY29uc3QgJHNjb3JlcyA9XG4gICAgICBjb252ZXJ0VG9UZW5zb3Ioc2NvcmVzLCAnc2NvcmVzJywgJ25vbk1heFN1cHByZXNzaW9uJywgJ2Zsb2F0MzInKTtcblxuICBjb25zdCBpbnB1dHMgPSBub25NYXhTdXBwU2FuaXR5Q2hlY2soXG4gICAgICAkYm94ZXMsICRzY29yZXMsIG1heE91dHB1dFNpemUsIGlvdVRocmVzaG9sZCwgc2NvcmVUaHJlc2hvbGQpO1xuICBtYXhPdXRwdXRTaXplID0gaW5wdXRzLm1heE91dHB1dFNpemU7XG4gIGlvdVRocmVzaG9sZCA9IGlucHV0cy5pb3VUaHJlc2hvbGQ7XG4gIHNjb3JlVGhyZXNob2xkID0gaW5wdXRzLnNjb3JlVGhyZXNob2xkO1xuXG4gIGNvbnN0IGF0dHJzID0ge21heE91dHB1dFNpemUsIGlvdVRocmVzaG9sZCwgc2NvcmVUaHJlc2hvbGR9O1xuICByZXR1cm4gRU5HSU5FLnJ1bktlcm5lbChcbiAgICAgIE5vbk1heFN1cHByZXNzaW9uVjMsIHtib3hlczogJGJveGVzLCBzY29yZXM6ICRzY29yZXN9LCBhdHRycyk7XG59XG5cbmV4cG9ydCBjb25zdCBub25NYXhTdXBwcmVzc2lvbiA9IG9wKHtub25NYXhTdXBwcmVzc2lvbl99KTtcbiJdfQ==","/**\n * @license\n * Copyright 2020 Google LLC. All Rights Reserved.\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n * =============================================================================\n */\nimport { nonMaxSuppressionV3Impl } from '../../backends/non_max_suppression_impl';\nimport { convertToTensor } from '../../tensor_util_env';\nimport { nonMaxSuppSanityCheck } from '../nonmax_util';\nimport { tensor1d } from '../tensor1d';\n/**\n * Performs non maximum suppression of bounding boxes based on\n * iou (intersection over union).\n *\n * This is the async version of `nonMaxSuppression`\n *\n * @param boxes a 2d tensor of shape `[numBoxes, 4]`. Each entry is\n * `[y1, x1, y2, x2]`, where `(y1, x1)` and `(y2, x2)` are the corners of\n * the bounding box.\n * @param scores a 1d tensor providing the box scores of shape `[numBoxes]`.\n * @param maxOutputSize The maximum number of boxes to be selected.\n * @param iouThreshold A float representing the threshold for deciding whether\n * boxes overlap too much with respect to IOU. Must be between [0, 1].\n * Defaults to 0.5 (50% box overlap).\n * @param scoreThreshold A threshold for deciding when to remove boxes based\n * on score. Defaults to -inf, which means any score is accepted.\n * @return A 1D tensor with the selected box indices.\n *\n * @doc {heading: 'Operations', subheading: 'Images', namespace: 'image'}\n */\nasync function nonMaxSuppressionAsync_(boxes, scores, maxOutputSize, iouThreshold = 0.5, scoreThreshold = Number.NEGATIVE_INFINITY) {\n const $boxes = convertToTensor(boxes, 'boxes', 'nonMaxSuppressionAsync');\n const $scores = convertToTensor(scores, 'scores', 'nonMaxSuppressionAsync');\n const inputs = nonMaxSuppSanityCheck($boxes, $scores, maxOutputSize, iouThreshold, scoreThreshold);\n maxOutputSize = inputs.maxOutputSize;\n iouThreshold = inputs.iouThreshold;\n scoreThreshold = inputs.scoreThreshold;\n const boxesAndScores = await Promise.all([$boxes.data(), $scores.data()]);\n const boxesVals = boxesAndScores[0];\n const scoresVals = boxesAndScores[1];\n // We call a cpu based impl directly with the typedarray data here rather\n // than a kernel because all kernels are synchronous (and thus cannot await\n // .data()).\n const { selectedIndices } = nonMaxSuppressionV3Impl(boxesVals, scoresVals, maxOutputSize, iouThreshold, scoreThreshold);\n if ($boxes !== boxes) {\n $boxes.dispose();\n }\n if ($scores !== scores) {\n $scores.dispose();\n }\n return tensor1d(selectedIndices, 'int32');\n}\nexport const nonMaxSuppressionAsync = nonMaxSuppressionAsync_;\n//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibm9uX21heF9zdXBwcmVzc2lvbl9hc3luYy5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uLy4uLy4uL3RmanMtY29yZS9zcmMvb3BzL2ltYWdlL25vbl9tYXhfc3VwcHJlc3Npb25fYXN5bmMudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUE7Ozs7Ozs7Ozs7Ozs7OztHQWVHO0FBRUgsT0FBTyxFQUFDLHVCQUF1QixFQUFDLE1BQU0seUNBQXlDLENBQUM7QUFFaEYsT0FBTyxFQUFDLGVBQWUsRUFBQyxNQUFNLHVCQUF1QixDQUFDO0FBRXRELE9BQU8sRUFBQyxxQkFBcUIsRUFBQyxNQUFNLGdCQUFnQixDQUFDO0FBQ3JELE9BQU8sRUFBQyxRQUFRLEVBQUMsTUFBTSxhQUFhLENBQUM7QUFFckM7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7R0FtQkc7QUFDSCxLQUFLLFVBQVUsdUJBQXVCLENBQ2xDLEtBQTBCLEVBQUUsTUFBMkIsRUFDdkQsYUFBcUIsRUFBRSxZQUFZLEdBQUcsR0FBRyxFQUN6QyxjQUFjLEdBQUcsTUFBTSxDQUFDLGlCQUFpQjtJQUMzQyxNQUFNLE1BQU0sR0FBRyxlQUFlLENBQUMsS0FBSyxFQUFFLE9BQU8sRUFBRSx3QkFBd0IsQ0FBQyxDQUFDO0lBQ3pFLE1BQU0sT0FBTyxHQUFHLGVBQWUsQ0FBQyxNQUFNLEVBQUUsUUFBUSxFQUFFLHdCQUF3QixDQUFDLENBQUM7SUFFNUUsTUFBTSxNQUFNLEdBQUcscUJBQXFCLENBQ2hDLE1BQU0sRUFBRSxPQUFPLEVBQUUsYUFBYSxFQUFFLFlBQVksRUFBRSxjQUFjLENBQUMsQ0FBQztJQUNsRSxhQUFhLEdBQUcsTUFBTSxDQUFDLGFBQWEsQ0FBQztJQUNyQyxZQUFZLEdBQUcsTUFBTSxDQUFDLFlBQVksQ0FBQztJQUNuQyxjQUFjLEdBQUcsTUFBTSxDQUFDLGNBQWMsQ0FBQztJQUV2QyxNQUFNLGNBQWMsR0FBRyxNQUFNLE9BQU8sQ0FBQyxHQUFHLENBQUMsQ0FBQyxNQUFNLENBQUMsSUFBSSxFQUFFLEVBQUUsT0FBTyxDQUFDLElBQUksRUFBRSxDQUFDLENBQUMsQ0FBQztJQUMxRSxNQUFNLFNBQVMsR0FBRyxjQUFjLENBQUMsQ0FBQyxDQUFDLENBQUM7SUFDcEMsTUFBTSxVQUFVLEdBQUcsY0FBYyxDQUFDLENBQUMsQ0FBQyxDQUFDO0lBRXJDLDBFQUEwRTtJQUMxRSwyRUFBMkU7SUFDM0UsWUFBWTtJQUNaLE1BQU0sRUFBQyxlQUFlLEVBQUMsR0FBRyx1QkFBdUIsQ0FDN0MsU0FBUyxFQUFFLFVBQVUsRUFBRSxhQUFhLEVBQUUsWUFBWSxFQUFFLGNBQWMsQ0FBQyxDQUFDO0lBQ3hFLElBQUksTUFBTSxLQUFLLEtBQUssRUFBRTtRQUNwQixNQUFNLENBQUMsT0FBTyxFQUFFLENBQUM7S0FDbEI7SUFDRCxJQUFJLE9BQU8sS0FBSyxNQUFNLEVBQUU7UUFDdEIsT0FBTyxDQUFDLE9BQU8sRUFBRSxDQUFDO0tBQ25CO0lBRUQsT0FBTyxRQUFRLENBQUMsZUFBZSxFQUFFLE9BQU8sQ0FBQyxDQUFDO0FBQzVDLENBQUM7QUFFRCxNQUFNLENBQUMsTUFBTSxzQkFBc0IsR0FBRyx1QkFBdUIsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbIi8qKlxuICogQGxpY2Vuc2VcbiAqIENvcHlyaWdodCAyMDIwIEdvb2dsZSBMTEMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuXG4gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgXCJMaWNlbnNlXCIpO1xuICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLlxuICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0XG4gKlxuICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wXG4gKlxuICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZVxuICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gXCJBUyBJU1wiIEJBU0lTLFxuICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuXG4gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kXG4gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS5cbiAqID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4gKi9cblxuaW1wb3J0IHtub25NYXhTdXBwcmVzc2lvblYzSW1wbH0gZnJvbSAnLi4vLi4vYmFja2VuZHMvbm9uX21heF9zdXBwcmVzc2lvbl9pbXBsJztcbmltcG9ydCB7VGVuc29yMUQsIFRlbnNvcjJEfSBmcm9tICcuLi8uLi90ZW5zb3InO1xuaW1wb3J0IHtjb252ZXJ0VG9UZW5zb3J9IGZyb20gJy4uLy4uL3RlbnNvcl91dGlsX2Vudic7XG5pbXBvcnQge1RlbnNvckxpa2V9IGZyb20gJy4uLy4uL3R5cGVzJztcbmltcG9ydCB7bm9uTWF4U3VwcFNhbml0eUNoZWNrfSBmcm9tICcuLi9ub25tYXhfdXRpbCc7XG5pbXBvcnQge3RlbnNvcjFkfSBmcm9tICcuLi90ZW5zb3IxZCc7XG5cbi8qKlxuICogUGVyZm9ybXMgbm9uIG1heGltdW0gc3VwcHJlc3Npb24gb2YgYm91bmRpbmcgYm94ZXMgYmFzZWQgb25cbiAqIGlvdSAoaW50ZXJzZWN0aW9uIG92ZXIgdW5pb24pLlxuICpcbiAqIFRoaXMgaXMgdGhlIGFzeW5jIHZlcnNpb24gb2YgYG5vbk1heFN1cHByZXNzaW9uYFxuICpcbiAqIEBwYXJhbSBib3hlcyBhIDJkIHRlbnNvciBvZiBzaGFwZSBgW251bUJveGVzLCA0XWAuIEVhY2ggZW50cnkgaXNcbiAqICAgICBgW3kxLCB4MSwgeTIsIHgyXWAsIHdoZXJlIGAoeTEsIHgxKWAgYW5kIGAoeTIsIHgyKWAgYXJlIHRoZSBjb3JuZXJzIG9mXG4gKiAgICAgdGhlIGJvdW5kaW5nIGJveC5cbiAqIEBwYXJhbSBzY29yZXMgYSAxZCB0ZW5zb3IgcHJvdmlkaW5nIHRoZSBib3ggc2NvcmVzIG9mIHNoYXBlIGBbbnVtQm94ZXNdYC5cbiAqIEBwYXJhbSBtYXhPdXRwdXRTaXplIFRoZSBtYXhpbXVtIG51bWJlciBvZiBib3hlcyB0byBiZSBzZWxlY3RlZC5cbiAqIEBwYXJhbSBpb3VUaHJlc2hvbGQgQSBmbG9hdCByZXByZXNlbnRpbmcgdGhlIHRocmVzaG9sZCBmb3IgZGVjaWRpbmcgd2hldGhlclxuICogICAgIGJveGVzIG92ZXJsYXAgdG9vIG11Y2ggd2l0aCByZXNwZWN0IHRvIElPVS4gTXVzdCBiZSBiZXR3ZWVuIFswLCAxXS5cbiAqICAgICBEZWZhdWx0cyB0byAwLjUgKDUwJSBib3ggb3ZlcmxhcCkuXG4gKiBAcGFyYW0gc2NvcmVUaHJlc2hvbGQgQSB0aHJlc2hvbGQgZm9yIGRlY2lkaW5nIHdoZW4gdG8gcmVtb3ZlIGJveGVzIGJhc2VkXG4gKiAgICAgb24gc2NvcmUuIERlZmF1bHRzIHRvIC1pbmYsIHdoaWNoIG1lYW5zIGFueSBzY29yZSBpcyBhY2NlcHRlZC5cbiAqIEByZXR1cm4gQSAxRCB0ZW5zb3Igd2l0aCB0aGUgc2VsZWN0ZWQgYm94IGluZGljZXMuXG4gKlxuICogQGRvYyB7aGVhZGluZzogJ09wZXJhdGlvbnMnLCBzdWJoZWFkaW5nOiAnSW1hZ2VzJywgbmFtZXNwYWNlOiAnaW1hZ2UnfVxuICovXG5hc3luYyBmdW5jdGlvbiBub25NYXhTdXBwcmVzc2lvbkFzeW5jXyhcbiAgICBib3hlczogVGVuc29yMkR8VGVuc29yTGlrZSwgc2NvcmVzOiBUZW5zb3IxRHxUZW5zb3JMaWtlLFxuICAgIG1heE91dHB1dFNpemU6IG51bWJlciwgaW91VGhyZXNob2xkID0gMC41LFxuICAgIHNjb3JlVGhyZXNob2xkID0gTnVtYmVyLk5FR0FUSVZFX0lORklOSVRZKTogUHJvbWlzZTxUZW5zb3IxRD4ge1xuICBjb25zdCAkYm94ZXMgPSBjb252ZXJ0VG9UZW5zb3IoYm94ZXMsICdib3hlcycsICdub25NYXhTdXBwcmVzc2lvbkFzeW5jJyk7XG4gIGNvbnN0ICRzY29yZXMgPSBjb252ZXJ0VG9UZW5zb3Ioc2NvcmVzLCAnc2NvcmVzJywgJ25vbk1heFN1cHByZXNzaW9uQXN5bmMnKTtcblxuICBjb25zdCBpbnB1dHMgPSBub25NYXhTdXBwU2FuaXR5Q2hlY2soXG4gICAgICAkYm94ZXMsICRzY29yZXMsIG1heE91dHB1dFNpemUsIGlvdVRocmVzaG9sZCwgc2NvcmVUaHJlc2hvbGQpO1xuICBtYXhPdXRwdXRTaXplID0gaW5wdXRzLm1heE91dHB1dFNpemU7XG4gIGlvdVRocmVzaG9sZCA9IGlucHV0cy5pb3VUaHJlc2hvbGQ7XG4gIHNjb3JlVGhyZXNob2xkID0gaW5wdXRzLnNjb3JlVGhyZXNob2xkO1xuXG4gIGNvbnN0IGJveGVzQW5kU2NvcmVzID0gYXdhaXQgUHJvbWlzZS5hbGwoWyRib3hlcy5kYXRhKCksICRzY29yZXMuZGF0YSgpXSk7XG4gIGNvbnN0IGJveGVzVmFscyA9IGJveGVzQW5kU2NvcmVzWzBdO1xuICBjb25zdCBzY29yZXNWYWxzID0gYm94ZXNBbmRTY29yZXNbMV07XG5cbiAgLy8gV2UgY2FsbCBhIGNwdSBiYXNlZCBpbXBsIGRpcmVjdGx5IHdpdGggdGhlIHR5cGVkYXJyYXkgZGF0YSAgaGVyZSByYXRoZXJcbiAgLy8gdGhhbiBhIGtlcm5lbCBiZWNhdXNlIGFsbCBrZXJuZWxzIGFyZSBzeW5jaHJvbm91cyAoYW5kIHRodXMgY2Fubm90IGF3YWl0XG4gIC8vIC5kYXRhKCkpLlxuICBjb25zdCB7c2VsZWN0ZWRJbmRpY2VzfSA9IG5vbk1heFN1cHByZXNzaW9uVjNJbXBsKFxuICAgICAgYm94ZXNWYWxzLCBzY29yZXNWYWxzLCBtYXhPdXRwdXRTaXplLCBpb3VUaHJlc2hvbGQsIHNjb3JlVGhyZXNob2xkKTtcbiAgaWYgKCRib3hlcyAhPT0gYm94ZXMpIHtcbiAgICAkYm94ZXMuZGlzcG9zZSgpO1xuICB9XG4gIGlmICgkc2NvcmVzICE9PSBzY29yZXMpIHtcbiAgICAkc2NvcmVzLmRpc3Bvc2UoKTtcbiAgfVxuXG4gIHJldHVybiB0ZW5zb3IxZChzZWxlY3RlZEluZGljZXMsICdpbnQzMicpO1xufVxuXG5leHBvcnQgY29uc3Qgbm9uTWF4U3VwcHJlc3Npb25Bc3luYyA9IG5vbk1heFN1cHByZXNzaW9uQXN5bmNfO1xuIl19","/**\n * @license\n * Copyright 2020 Google LLC. All Rights Reserved.\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n * =============================================================================\n */\nimport { ENGINE } from '../../engine';\nimport { NonMaxSuppressionV5 } from '../../kernel_names';\nimport { convertToTensor } from '../../tensor_util_env';\nimport { nonMaxSuppSanityCheck } from '../nonmax_util';\nimport { op } from '../operation';\n/**\n * Performs non maximum suppression of bounding boxes based on\n * iou (intersection over union).\n *\n * This op also supports a Soft-NMS mode (cf.\n * Bodla et al, https://arxiv.org/abs/1704.04503) where boxes reduce the score\n * of other overlapping boxes, therefore favoring different regions of the image\n * with high scores. To enable this Soft-NMS mode, set the `softNmsSigma`\n * parameter to be larger than 0.\n *\n * @param boxes a 2d tensor of shape `[numBoxes, 4]`. Each entry is\n * `[y1, x1, y2, x2]`, where `(y1, x1)` and `(y2, x2)` are the corners of\n * the bounding box.\n * @param scores a 1d tensor providing the box scores of shape `[numBoxes]`.\n * @param maxOutputSize The maximum number of boxes to be selected.\n * @param iouThreshold A float representing the threshold for deciding whether\n * boxes overlap too much with respect to IOU. Must be between [0, 1].\n * Defaults to 0.5 (50% box overlap).\n * @param scoreThreshold A threshold for deciding when to remove boxes based\n * on score. Defaults to -inf, which means any score is accepted.\n * @param softNmsSigma A float representing the sigma parameter for Soft NMS.\n * When sigma is 0, it falls back to nonMaxSuppression.\n * @return A map with the following properties:\n * - selectedIndices: A 1D tensor with the selected box indices.\n * - selectedScores: A 1D tensor with the corresponding scores for each\n * selected box.\n *\n * @doc {heading: 'Operations', subheading: 'Images', namespace: 'image'}\n */\nfunction nonMaxSuppressionWithScore_(boxes, scores, maxOutputSize, iouThreshold = 0.5, scoreThreshold = Number.NEGATIVE_INFINITY, softNmsSigma = 0.0) {\n const $boxes = convertToTensor(boxes, 'boxes', 'nonMaxSuppression');\n const $scores = convertToTensor(scores, 'scores', 'nonMaxSuppression');\n const params = nonMaxSuppSanityCheck($boxes, $scores, maxOutputSize, iouThreshold, scoreThreshold, softNmsSigma);\n maxOutputSize = params.maxOutputSize;\n iouThreshold = params.iouThreshold;\n scoreThreshold = params.scoreThreshold;\n softNmsSigma = params.softNmsSigma;\n const inputs = { boxes: $boxes, scores: $scores };\n const attrs = { maxOutputSize, iouThreshold, scoreThreshold, softNmsSigma };\n // tslint:disable-next-line: no-unnecessary-type-assertion\n const result = ENGINE.runKernel(NonMaxSuppressionV5, inputs, attrs);\n return { selectedIndices: result[0], selectedScores: result[1] };\n}\nexport const nonMaxSuppressionWithScore = op({ nonMaxSuppressionWithScore_ });\n//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibm9uX21heF9zdXBwcmVzc2lvbl93aXRoX3Njb3JlLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vLi4vLi4vdGZqcy1jb3JlL3NyYy9vcHMvaW1hZ2Uvbm9uX21heF9zdXBwcmVzc2lvbl93aXRoX3Njb3JlLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBOzs7Ozs7Ozs7Ozs7Ozs7R0FlRztBQUVILE9BQU8sRUFBQyxNQUFNLEVBQUMsTUFBTSxjQUFjLENBQUM7QUFDcEMsT0FBTyxFQUFDLG1CQUFtQixFQUFzRCxNQUFNLG9CQUFvQixDQUFDO0FBSTVHLE9BQU8sRUFBQyxlQUFlLEVBQUMsTUFBTSx1QkFBdUIsQ0FBQztBQUd0RCxPQUFPLEVBQUMscUJBQXFCLEVBQUMsTUFBTSxnQkFBZ0IsQ0FBQztBQUNyRCxPQUFPLEVBQUMsRUFBRSxFQUFDLE1BQU0sY0FBYyxDQUFDO0FBRWhDOzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7O0dBNEJHO0FBQ0gsU0FBUywyQkFBMkIsQ0FDaEMsS0FBMEIsRUFBRSxNQUEyQixFQUN2RCxhQUFxQixFQUFFLFlBQVksR0FBRyxHQUFHLEVBQ3pDLGNBQWMsR0FBRyxNQUFNLENBQUMsaUJBQWlCLEVBQ3pDLFlBQVksR0FBRyxHQUFHO0lBQ3BCLE1BQU0sTUFBTSxHQUFHLGVBQWUsQ0FBQyxLQUFLLEVBQUUsT0FBTyxFQUFFLG1CQUFtQixDQUFDLENBQUM7SUFDcEUsTUFBTSxPQUFPLEdBQUcsZUFBZSxDQUFDLE1BQU0sRUFBRSxRQUFRLEVBQUUsbUJBQW1CLENBQUMsQ0FBQztJQUV2RSxNQUFNLE1BQU0sR0FBRyxxQkFBcUIsQ0FDaEMsTUFBTSxFQUFFLE9BQU8sRUFBRSxhQUFhLEVBQUUsWUFBWSxFQUFFLGNBQWMsRUFDNUQsWUFBWSxDQUFDLENBQUM7SUFDbEIsYUFBYSxHQUFHLE1BQU0sQ0FBQyxhQUFhLENBQUM7SUFDckMsWUFBWSxHQUFHLE1BQU0sQ0FBQyxZQUFZLENBQUM7SUFDbkMsY0FBYyxHQUFHLE1BQU0sQ0FBQyxjQUFjLENBQUM7SUFDdkMsWUFBWSxHQUFHLE1BQU0sQ0FBQyxZQUFZLENBQUM7SUFFbkMsTUFBTSxNQUFNLEdBQThCLEVBQUMsS0FBSyxFQUFFLE1BQU0sRUFBRSxNQUFNLEVBQUUsT0FBTyxFQUFDLENBQUM7SUFDM0UsTUFBTSxLQUFLLEdBQ1AsRUFBQyxhQUFhLEVBQUUsWUFBWSxFQUFFLGNBQWMsRUFBRSxZQUFZLEVBQUMsQ0FBQztJQUVoRSwwREFBMEQ7SUFDMUQsTUFBTSxNQUFNLEdBQUcsTUFBTSxDQUFDLFNBQVMsQ0FDWixtQkFBbUIsRUFBRSxNQUE4QixFQUNuRCxLQUEyQixDQUFhLENBQUM7SUFFNUQsT0FBTyxFQUFDLGVBQWUsRUFBRSxNQUFNLENBQUMsQ0FBQyxDQUFDLEVBQUUsY0FBYyxFQUFFLE1BQU0sQ0FBQyxDQUFDLENBQUMsRUFBQyxDQUFDO0FBQ2pFLENBQUM7QUFFRCxNQUFNLENBQUMsTUFBTSwwQkFBMEIsR0FBRyxFQUFFLENBQUMsRUFBQywyQkFBMkIsRUFBQyxDQUFDLENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyIvKipcbiAqIEBsaWNlbnNlXG4gKiBDb3B5cmlnaHQgMjAyMCBHb29nbGUgTExDLiBBbGwgUmlnaHRzIFJlc2VydmVkLlxuICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlIFwiTGljZW5zZVwiKTtcbiAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS5cbiAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdFxuICpcbiAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMFxuICpcbiAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmVcbiAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuIFwiQVMgSVNcIiBCQVNJUyxcbiAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLlxuICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZFxuICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuXG4gKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuICovXG5cbmltcG9ydCB7RU5HSU5FfSBmcm9tICcuLi8uLi9lbmdpbmUnO1xuaW1wb3J0IHtOb25NYXhTdXBwcmVzc2lvblY1LCBOb25NYXhTdXBwcmVzc2lvblY1QXR0cnMsIE5vbk1heFN1cHByZXNzaW9uVjVJbnB1dHN9IGZyb20gJy4uLy4uL2tlcm5lbF9uYW1lcyc7XG5pbXBvcnQge05hbWVkQXR0ck1hcH0gZnJvbSAnLi4vLi4va2VybmVsX3JlZ2lzdHJ5JztcbmltcG9ydCB7VGVuc29yLCBUZW5zb3IxRCwgVGVuc29yMkR9IGZyb20gJy4uLy4uL3RlbnNvcic7XG5pbXBvcnQge05hbWVkVGVuc29yTWFwfSBmcm9tICcuLi8uLi90ZW5zb3JfdHlwZXMnO1xuaW1wb3J0IHtjb252ZXJ0VG9UZW5zb3J9IGZyb20gJy4uLy4uL3RlbnNvcl91dGlsX2Vudic7XG5pbXBvcnQge1RlbnNvckxpa2V9IGZyb20gJy4uLy4uL3R5cGVzJztcblxuaW1wb3J0IHtub25NYXhTdXBwU2FuaXR5Q2hlY2t9IGZyb20gJy4uL25vbm1heF91dGlsJztcbmltcG9ydCB7b3B9IGZyb20gJy4uL29wZXJhdGlvbic7XG5cbi8qKlxuICogUGVyZm9ybXMgbm9uIG1heGltdW0gc3VwcHJlc3Npb24gb2YgYm91bmRpbmcgYm94ZXMgYmFzZWQgb25cbiAqIGlvdSAoaW50ZXJzZWN0aW9uIG92ZXIgdW5pb24pLlxuICpcbiAqIFRoaXMgb3AgYWxzbyBzdXBwb3J0cyBhIFNvZnQtTk1TIG1vZGUgKGNmLlxuICogQm9kbGEgZXQgYWwsIGh0dHBzOi8vYXJ4aXYub3JnL2Ficy8xNzA0LjA0NTAzKSB3aGVyZSBib3hlcyByZWR1Y2UgdGhlIHNjb3JlXG4gKiBvZiBvdGhlciBvdmVybGFwcGluZyBib3hlcywgdGhlcmVmb3JlIGZhdm9yaW5nIGRpZmZlcmVudCByZWdpb25zIG9mIHRoZSBpbWFnZVxuICogd2l0aCBoaWdoIHNjb3Jlcy4gVG8gZW5hYmxlIHRoaXMgU29mdC1OTVMgbW9kZSwgc2V0IHRoZSBgc29mdE5tc1NpZ21hYFxuICogcGFyYW1ldGVyIHRvIGJlIGxhcmdlciB0aGFuIDAuXG4gKlxuICogQHBhcmFtIGJveGVzIGEgMmQgdGVuc29yIG9mIHNoYXBlIGBbbnVtQm94ZXMsIDRdYC4gRWFjaCBlbnRyeSBpc1xuICogICAgIGBbeTEsIHgxLCB5MiwgeDJdYCwgd2hlcmUgYCh5MSwgeDEpYCBhbmQgYCh5MiwgeDIpYCBhcmUgdGhlIGNvcm5lcnMgb2ZcbiAqICAgICB0aGUgYm91bmRpbmcgYm94LlxuICogQHBhcmFtIHNjb3JlcyBhIDFkIHRlbnNvciBwcm92aWRpbmcgdGhlIGJveCBzY29yZXMgb2Ygc2hhcGUgYFtudW1Cb3hlc11gLlxuICogQHBhcmFtIG1heE91dHB1dFNpemUgVGhlIG1heGltdW0gbnVtYmVyIG9mIGJveGVzIHRvIGJlIHNlbGVjdGVkLlxuICogQHBhcmFtIGlvdVRocmVzaG9sZCBBIGZsb2F0IHJlcHJlc2VudGluZyB0aGUgdGhyZXNob2xkIGZvciBkZWNpZGluZyB3aGV0aGVyXG4gKiAgICAgYm94ZXMgb3ZlcmxhcCB0b28gbXVjaCB3aXRoIHJlc3BlY3QgdG8gSU9VLiBNdXN0IGJlIGJldHdlZW4gWzAsIDFdLlxuICogICAgIERlZmF1bHRzIHRvIDAuNSAoNTAlIGJveCBvdmVybGFwKS5cbiAqIEBwYXJhbSBzY29yZVRocmVzaG9sZCBBIHRocmVzaG9sZCBmb3IgZGVjaWRpbmcgd2hlbiB0byByZW1vdmUgYm94ZXMgYmFzZWRcbiAqICAgICBvbiBzY29yZS4gRGVmYXVsdHMgdG8gLWluZiwgd2hpY2ggbWVhbnMgYW55IHNjb3JlIGlzIGFjY2VwdGVkLlxuICogQHBhcmFtIHNvZnRObXNTaWdtYSBBIGZsb2F0IHJlcHJlc2VudGluZyB0aGUgc2lnbWEgcGFyYW1ldGVyIGZvciBTb2Z0IE5NUy5cbiAqICAgICBXaGVuIHNpZ21hIGlzIDAsIGl0IGZhbGxzIGJhY2sgdG8gbm9uTWF4U3VwcHJlc3Npb24uXG4gKiBAcmV0dXJuIEEgbWFwIHdpdGggdGhlIGZvbGxvd2luZyBwcm9wZXJ0aWVzOlxuICogICAgIC0gc2VsZWN0ZWRJbmRpY2VzOiBBIDFEIHRlbnNvciB3aXRoIHRoZSBzZWxlY3RlZCBib3ggaW5kaWNlcy5cbiAqICAgICAtIHNlbGVjdGVkU2NvcmVzOiBBIDFEIHRlbnNvciB3aXRoIHRoZSBjb3JyZXNwb25kaW5nIHNjb3JlcyBmb3IgZWFjaFxuICogICAgICAgc2VsZWN0ZWQgYm94LlxuICpcbiAqIEBkb2Mge2hlYWRpbmc6ICdPcGVyYXRpb25zJywgc3ViaGVhZGluZzogJ0ltYWdlcycsIG5hbWVzcGFjZTogJ2ltYWdlJ31cbiAqL1xuZnVuY3Rpb24gbm9uTWF4U3VwcHJlc3Npb25XaXRoU2NvcmVfKFxuICAgIGJveGVzOiBUZW5zb3IyRHxUZW5zb3JMaWtlLCBzY29yZXM6IFRlbnNvcjFEfFRlbnNvckxpa2UsXG4gICAgbWF4T3V0cHV0U2l6ZTogbnVtYmVyLCBpb3VUaHJlc2hvbGQgPSAwLjUsXG4gICAgc2NvcmVUaHJlc2hvbGQgPSBOdW1iZXIuTkVHQVRJVkVfSU5GSU5JVFksXG4gICAgc29mdE5tc1NpZ21hID0gMC4wKTogTmFtZWRUZW5zb3JNYXAge1xuICBjb25zdCAkYm94ZXMgPSBjb252ZXJ0VG9UZW5zb3IoYm94ZXMsICdib3hlcycsICdub25NYXhTdXBwcmVzc2lvbicpO1xuICBjb25zdCAkc2NvcmVzID0gY29udmVydFRvVGVuc29yKHNjb3JlcywgJ3Njb3JlcycsICdub25NYXhTdXBwcmVzc2lvbicpO1xuXG4gIGNvbnN0IHBhcmFtcyA9IG5vbk1heFN1cHBTYW5pdHlDaGVjayhcbiAgICAgICRib3hlcywgJHNjb3JlcywgbWF4T3V0cHV0U2l6ZSwgaW91VGhyZXNob2xkLCBzY29yZVRocmVzaG9sZCxcbiAgICAgIHNvZnRObXNTaWdtYSk7XG4gIG1heE91dHB1dFNpemUgPSBwYXJhbXMubWF4T3V0cHV0U2l6ZTtcbiAgaW91VGhyZXNob2xkID0gcGFyYW1zLmlvdVRocmVzaG9sZDtcbiAgc2NvcmVUaHJlc2hvbGQgPSBwYXJhbXMuc2NvcmVUaHJlc2hvbGQ7XG4gIHNvZnRObXNTaWdtYSA9IHBhcmFtcy5zb2Z0Tm1zU2lnbWE7XG5cbiAgY29uc3QgaW5wdXRzOiBOb25NYXhTdXBwcmVzc2lvblY1SW5wdXRzID0ge2JveGVzOiAkYm94ZXMsIHNjb3JlczogJHNjb3Jlc307XG4gIGNvbnN0IGF0dHJzOiBOb25NYXhTdXBwcmVzc2lvblY1QXR0cnMgPVxuICAgICAge21heE91dHB1dFNpemUsIGlvdVRocmVzaG9sZCwgc2NvcmVUaHJlc2hvbGQsIHNvZnRObXNTaWdtYX07XG5cbiAgLy8gdHNsaW50OmRpc2FibGUtbmV4dC1saW5lOiBuby11bm5lY2Vzc2FyeS10eXBlLWFzc2VydGlvblxuICBjb25zdCByZXN1bHQgPSBFTkdJTkUucnVuS2VybmVsKFxuICAgICAgICAgICAgICAgICAgICAgTm9uTWF4U3VwcHJlc3Npb25WNSwgaW5wdXRzIGFzIHt9IGFzIE5hbWVkVGVuc29yTWFwLFxuICAgICAgICAgICAgICAgICAgICAgYXR0cnMgYXMge30gYXMgTmFtZWRBdHRyTWFwKSBhcyBUZW5zb3JbXTtcblxuICByZXR1cm4ge3NlbGVjdGVkSW5kaWNlczogcmVzdWx0WzBdLCBzZWxlY3RlZFNjb3JlczogcmVzdWx0WzFdfTtcbn1cblxuZXhwb3J0IGNvbnN0IG5vbk1heFN1cHByZXNzaW9uV2l0aFNjb3JlID0gb3Aoe25vbk1heFN1cHByZXNzaW9uV2l0aFNjb3JlX30pO1xuIl19","/**\n * @license\n * Copyright 2020 Google LLC. All Rights Reserved.\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n * =============================================================================\n */\nimport { nonMaxSuppressionV5Impl } from '../../backends/non_max_suppression_impl';\nimport { convertToTensor } from '../../tensor_util_env';\nimport { nonMaxSuppSanityCheck } from '../nonmax_util';\nimport { tensor1d } from '../tensor1d';\n/**\n * Asynchronously performs non maximum suppression of bounding boxes based on\n * iou (intersection over union).\n *\n * This op also supports a Soft-NMS mode (cf.\n * Bodla et al, https://arxiv.org/abs/1704.04503) where boxes reduce the score\n * of other overlapping boxes, therefore favoring different regions of the image\n * with high scores. To enable this Soft-NMS mode, set the `softNmsSigma`\n * parameter to be larger than 0.\n *\n * @param boxes a 2d tensor of shape `[numBoxes, 4]`. Each entry is\n * `[y1, x1, y2, x2]`, where `(y1, x1)` and `(y2, x2)` are the corners of\n * the bounding box.\n * @param scores a 1d tensor providing the box scores of shape `[numBoxes]`.\n * @param maxOutputSize The maximum number of boxes to be selected.\n * @param iouThreshold A float representing the threshold for deciding whether\n * boxes overlap too much with respect to IOU. Must be between [0, 1].\n * Defaults to 0.5 (50% box overlap).\n * @param scoreThreshold A threshold for deciding when to remove boxes based\n * on score. Defaults to -inf, which means any score is accepted.\n * @param softNmsSigma A float representing the sigma parameter for Soft NMS.\n * When sigma is 0, it falls back to nonMaxSuppression.\n * @return A map with the following properties:\n * - selectedIndices: A 1D tensor with the selected box indices.\n * - selectedScores: A 1D tensor with the corresponding scores for each\n * selected box.\n *\n * @doc {heading: 'Operations', subheading: 'Images', namespace: 'image'}\n */\nasync function nonMaxSuppressionWithScoreAsync_(boxes, scores, maxOutputSize, iouThreshold = 0.5, scoreThreshold = Number.NEGATIVE_INFINITY, softNmsSigma = 0.0) {\n const $boxes = convertToTensor(boxes, 'boxes', 'nonMaxSuppressionAsync');\n const $scores = convertToTensor(scores, 'scores', 'nonMaxSuppressionAsync');\n const params = nonMaxSuppSanityCheck($boxes, $scores, maxOutputSize, iouThreshold, scoreThreshold, softNmsSigma);\n maxOutputSize = params.maxOutputSize;\n iouThreshold = params.iouThreshold;\n scoreThreshold = params.scoreThreshold;\n softNmsSigma = params.softNmsSigma;\n const boxesAndScores = await Promise.all([$boxes.data(), $scores.data()]);\n const boxesVals = boxesAndScores[0];\n const scoresVals = boxesAndScores[1];\n // We call a cpu based impl directly with the typedarray data here rather\n // than a kernel because all kernels are synchronous (and thus cannot await\n // .data()).\n const { selectedIndices, selectedScores } = nonMaxSuppressionV5Impl(boxesVals, scoresVals, maxOutputSize, iouThreshold, scoreThreshold, softNmsSigma);\n if ($boxes !== boxes) {\n $boxes.dispose();\n }\n if ($scores !== scores) {\n $scores.dispose();\n }\n return {\n selectedIndices: tensor1d(selectedIndices, 'int32'),\n selectedScores: tensor1d(selectedScores)\n };\n}\nexport const nonMaxSuppressionWithScoreAsync = nonMaxSuppressionWithScoreAsync_;\n//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibm9uX21heF9zdXBwcmVzc2lvbl93aXRoX3Njb3JlX2FzeW5jLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vLi4vLi4vdGZqcy1jb3JlL3NyYy9vcHMvaW1hZ2Uvbm9uX21heF9zdXBwcmVzc2lvbl93aXRoX3Njb3JlX2FzeW5jLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBOzs7Ozs7Ozs7Ozs7Ozs7R0FlRztBQUNILE9BQU8sRUFBQyx1QkFBdUIsRUFBQyxNQUFNLHlDQUF5QyxDQUFDO0FBR2hGLE9BQU8sRUFBQyxlQUFlLEVBQUMsTUFBTSx1QkFBdUIsQ0FBQztBQUV0RCxPQUFPLEVBQUMscUJBQXFCLEVBQUMsTUFBTSxnQkFBZ0IsQ0FBQztBQUNyRCxPQUFPLEVBQUMsUUFBUSxFQUFDLE1BQU0sYUFBYSxDQUFDO0FBRXJDOzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7O0dBNEJHO0FBQ0gsS0FBSyxVQUFVLGdDQUFnQyxDQUMzQyxLQUEwQixFQUFFLE1BQTJCLEVBQ3ZELGFBQXFCLEVBQUUsWUFBWSxHQUFHLEdBQUcsRUFDekMsY0FBYyxHQUFHLE1BQU0sQ0FBQyxpQkFBaUIsRUFDekMsWUFBWSxHQUFHLEdBQUc7SUFDcEIsTUFBTSxNQUFNLEdBQUcsZUFBZSxDQUFDLEtBQUssRUFBRSxPQUFPLEVBQUUsd0JBQXdCLENBQUMsQ0FBQztJQUN6RSxNQUFNLE9BQU8sR0FBRyxlQUFlLENBQUMsTUFBTSxFQUFFLFFBQVEsRUFBRSx3QkFBd0IsQ0FBQyxDQUFDO0lBRTVFLE1BQU0sTUFBTSxHQUFHLHFCQUFxQixDQUNoQyxNQUFNLEVBQUUsT0FBTyxFQUFFLGFBQWEsRUFBRSxZQUFZLEVBQUUsY0FBYyxFQUM1RCxZQUFZLENBQUMsQ0FBQztJQUNsQixhQUFhLEdBQUcsTUFBTSxDQUFDLGFBQWEsQ0FBQztJQUNyQyxZQUFZLEdBQUcsTUFBTSxDQUFDLFlBQVksQ0FBQztJQUNuQyxjQUFjLEdBQUcsTUFBTSxDQUFDLGNBQWMsQ0FBQztJQUN2QyxZQUFZLEdBQUcsTUFBTSxDQUFDLFlBQVksQ0FBQztJQUVuQyxNQUFNLGNBQWMsR0FBRyxNQUFNLE9BQU8sQ0FBQyxHQUFHLENBQUMsQ0FBQyxNQUFNLENBQUMsSUFBSSxFQUFFLEVBQUUsT0FBTyxDQUFDLElBQUksRUFBRSxDQUFDLENBQUMsQ0FBQztJQUMxRSxNQUFNLFNBQVMsR0FBRyxjQUFjLENBQUMsQ0FBQyxDQUFDLENBQUM7SUFDcEMsTUFBTSxVQUFVLEdBQUcsY0FBYyxDQUFDLENBQUMsQ0FBQyxDQUFDO0lBRXJDLDBFQUEwRTtJQUMxRSwyRUFBMkU7SUFDM0UsWUFBWTtJQUNaLE1BQU0sRUFBQyxlQUFlLEVBQUUsY0FBYyxFQUFDLEdBQUcsdUJBQXVCLENBQzdELFNBQVMsRUFBRSxVQUFVLEVBQUUsYUFBYSxFQUFFLFlBQVksRUFBRSxjQUFjLEVBQ2xFLFlBQVksQ0FBQyxDQUFDO0lBRWxCLElBQUksTUFBTSxLQUFLLEtBQUssRUFBRTtRQUNwQixNQUFNLENBQUMsT0FBTyxFQUFFLENBQUM7S0FDbEI7SUFDRCxJQUFJLE9BQU8sS0FBSyxNQUFNLEVBQUU7UUFDdEIsT0FBTyxDQUFDLE9BQU8sRUFBRSxDQUFDO0tBQ25CO0lBRUQsT0FBTztRQUNMLGVBQWUsRUFBRSxRQUFRLENBQUMsZUFBZSxFQUFFLE9BQU8sQ0FBQztRQUNuRCxjQUFjLEVBQUUsUUFBUSxDQUFDLGNBQWMsQ0FBQztLQUN6QyxDQUFDO0FBQ0osQ0FBQztBQUVELE1BQU0sQ0FBQyxNQUFNLCtCQUErQixHQUFHLGdDQUFnQyxDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiLyoqXG4gKiBAbGljZW5zZVxuICogQ29weXJpZ2h0IDIwMjAgR29vZ2xlIExMQy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC5cbiAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSBcIkxpY2Vuc2VcIik7XG4gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuXG4gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXRcbiAqXG4gKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjBcbiAqXG4gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlXG4gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiBcIkFTIElTXCIgQkFTSVMsXG4gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC5cbiAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmRcbiAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLlxuICogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbiAqL1xuaW1wb3J0IHtub25NYXhTdXBwcmVzc2lvblY1SW1wbH0gZnJvbSAnLi4vLi4vYmFja2VuZHMvbm9uX21heF9zdXBwcmVzc2lvbl9pbXBsJztcbmltcG9ydCB7VGVuc29yMUQsIFRlbnNvcjJEfSBmcm9tICcuLi8uLi90ZW5zb3InO1xuaW1wb3J0IHtOYW1lZFRlbnNvck1hcH0gZnJvbSAnLi4vLi4vdGVuc29yX3R5cGVzJztcbmltcG9ydCB7Y29udmVydFRvVGVuc29yfSBmcm9tICcuLi8uLi90ZW5zb3JfdXRpbF9lbnYnO1xuaW1wb3J0IHtUZW5zb3JMaWtlfSBmcm9tICcuLi8uLi90eXBlcyc7XG5pbXBvcnQge25vbk1heFN1cHBTYW5pdHlDaGVja30gZnJvbSAnLi4vbm9ubWF4X3V0aWwnO1xuaW1wb3J0IHt0ZW5zb3IxZH0gZnJvbSAnLi4vdGVuc29yMWQnO1xuXG4vKipcbiAqIEFzeW5jaHJvbm91c2x5IHBlcmZvcm1zIG5vbiBtYXhpbXVtIHN1cHByZXNzaW9uIG9mIGJvdW5kaW5nIGJveGVzIGJhc2VkIG9uXG4gKiBpb3UgKGludGVyc2VjdGlvbiBvdmVyIHVuaW9uKS5cbiAqXG4gKiBUaGlzIG9wIGFsc28gc3VwcG9ydHMgYSBTb2Z0LU5NUyBtb2RlIChjZi5cbiAqIEJvZGxhIGV0IGFsLCBodHRwczovL2FyeGl2Lm9yZy9hYnMvMTcwNC4wNDUwMykgd2hlcmUgYm94ZXMgcmVkdWNlIHRoZSBzY29yZVxuICogb2Ygb3RoZXIgb3ZlcmxhcHBpbmcgYm94ZXMsIHRoZXJlZm9yZSBmYXZvcmluZyBkaWZmZXJlbnQgcmVnaW9ucyBvZiB0aGUgaW1hZ2VcbiAqIHdpdGggaGlnaCBzY29yZXMuIFRvIGVuYWJsZSB0aGlzIFNvZnQtTk1TIG1vZGUsIHNldCB0aGUgYHNvZnRObXNTaWdtYWBcbiAqIHBhcmFtZXRlciB0byBiZSBsYXJnZXIgdGhhbiAwLlxuICpcbiAqIEBwYXJhbSBib3hlcyBhIDJkIHRlbnNvciBvZiBzaGFwZSBgW251bUJveGVzLCA0XWAuIEVhY2ggZW50cnkgaXNcbiAqICAgICBgW3kxLCB4MSwgeTIsIHgyXWAsIHdoZXJlIGAoeTEsIHgxKWAgYW5kIGAoeTIsIHgyKWAgYXJlIHRoZSBjb3JuZXJzIG9mXG4gKiAgICAgdGhlIGJvdW5kaW5nIGJveC5cbiAqIEBwYXJhbSBzY29yZXMgYSAxZCB0ZW5zb3IgcHJvdmlkaW5nIHRoZSBib3ggc2NvcmVzIG9mIHNoYXBlIGBbbnVtQm94ZXNdYC5cbiAqIEBwYXJhbSBtYXhPdXRwdXRTaXplIFRoZSBtYXhpbXVtIG51bWJlciBvZiBib3hlcyB0byBiZSBzZWxlY3RlZC5cbiAqIEBwYXJhbSBpb3VUaHJlc2hvbGQgQSBmbG9hdCByZXByZXNlbnRpbmcgdGhlIHRocmVzaG9sZCBmb3IgZGVjaWRpbmcgd2hldGhlclxuICogICAgIGJveGVzIG92ZXJsYXAgdG9vIG11Y2ggd2l0aCByZXNwZWN0IHRvIElPVS4gTXVzdCBiZSBiZXR3ZWVuIFswLCAxXS5cbiAqICAgICBEZWZhdWx0cyB0byAwLjUgKDUwJSBib3ggb3ZlcmxhcCkuXG4gKiBAcGFyYW0gc2NvcmVUaHJlc2hvbGQgQSB0aHJlc2hvbGQgZm9yIGRlY2lkaW5nIHdoZW4gdG8gcmVtb3ZlIGJveGVzIGJhc2VkXG4gKiAgICAgb24gc2NvcmUuIERlZmF1bHRzIHRvIC1pbmYsIHdoaWNoIG1lYW5zIGFueSBzY29yZSBpcyBhY2NlcHRlZC5cbiAqIEBwYXJhbSBzb2Z0Tm1zU2lnbWEgQSBmbG9hdCByZXByZXNlbnRpbmcgdGhlIHNpZ21hIHBhcmFtZXRlciBmb3IgU29mdCBOTVMuXG4gKiAgICAgV2hlbiBzaWdtYSBpcyAwLCBpdCBmYWxscyBiYWNrIHRvIG5vbk1heFN1cHByZXNzaW9uLlxuICogQHJldHVybiBBIG1hcCB3aXRoIHRoZSBmb2xsb3dpbmcgcHJvcGVydGllczpcbiAqICAgICAtIHNlbGVjdGVkSW5kaWNlczogQSAxRCB0ZW5zb3Igd2l0aCB0aGUgc2VsZWN0ZWQgYm94IGluZGljZXMuXG4gKiAgICAgLSBzZWxlY3RlZFNjb3JlczogQSAxRCB0ZW5zb3Igd2l0aCB0aGUgY29ycmVzcG9uZGluZyBzY29yZXMgZm9yIGVhY2hcbiAqICAgICAgIHNlbGVjdGVkIGJveC5cbiAqXG4gKiBAZG9jIHtoZWFkaW5nOiAnT3BlcmF0aW9ucycsIHN1YmhlYWRpbmc6ICdJbWFnZXMnLCBuYW1lc3BhY2U6ICdpbWFnZSd9XG4gKi9cbmFzeW5jIGZ1bmN0aW9uIG5vbk1heFN1cHByZXNzaW9uV2l0aFNjb3JlQXN5bmNfKFxuICAgIGJveGVzOiBUZW5zb3IyRHxUZW5zb3JMaWtlLCBzY29yZXM6IFRlbnNvcjFEfFRlbnNvckxpa2UsXG4gICAgbWF4T3V0cHV0U2l6ZTogbnVtYmVyLCBpb3VUaHJlc2hvbGQgPSAwLjUsXG4gICAgc2NvcmVUaHJlc2hvbGQgPSBOdW1iZXIuTkVHQVRJVkVfSU5GSU5JVFksXG4gICAgc29mdE5tc1NpZ21hID0gMC4wKTogUHJvbWlzZTxOYW1lZFRlbnNvck1hcD4ge1xuICBjb25zdCAkYm94ZXMgPSBjb252ZXJ0VG9UZW5zb3IoYm94ZXMsICdib3hlcycsICdub25NYXhTdXBwcmVzc2lvbkFzeW5jJyk7XG4gIGNvbnN0ICRzY29yZXMgPSBjb252ZXJ0VG9UZW5zb3Ioc2NvcmVzLCAnc2NvcmVzJywgJ25vbk1heFN1cHByZXNzaW9uQXN5bmMnKTtcblxuICBjb25zdCBwYXJhbXMgPSBub25NYXhTdXBwU2FuaXR5Q2hlY2soXG4gICAgICAkYm94ZXMsICRzY29yZXMsIG1heE91dHB1dFNpemUsIGlvdVRocmVzaG9sZCwgc2NvcmVUaHJlc2hvbGQsXG4gICAgICBzb2Z0Tm1zU2lnbWEpO1xuICBtYXhPdXRwdXRTaXplID0gcGFyYW1zLm1heE91dHB1dFNpemU7XG4gIGlvdVRocmVzaG9sZCA9IHBhcmFtcy5pb3VUaHJlc2hvbGQ7XG4gIHNjb3JlVGhyZXNob2xkID0gcGFyYW1zLnNjb3JlVGhyZXNob2xkO1xuICBzb2Z0Tm1zU2lnbWEgPSBwYXJhbXMuc29mdE5tc1NpZ21hO1xuXG4gIGNvbnN0IGJveGVzQW5kU2NvcmVzID0gYXdhaXQgUHJvbWlzZS5hbGwoWyRib3hlcy5kYXRhKCksICRzY29yZXMuZGF0YSgpXSk7XG4gIGNvbnN0IGJveGVzVmFscyA9IGJveGVzQW5kU2NvcmVzWzBdO1xuICBjb25zdCBzY29yZXNWYWxzID0gYm94ZXNBbmRTY29yZXNbMV07XG5cbiAgLy8gV2UgY2FsbCBhIGNwdSBiYXNlZCBpbXBsIGRpcmVjdGx5IHdpdGggdGhlIHR5cGVkYXJyYXkgZGF0YSAgaGVyZSByYXRoZXJcbiAgLy8gdGhhbiBhIGtlcm5lbCBiZWNhdXNlIGFsbCBrZXJuZWxzIGFyZSBzeW5jaHJvbm91cyAoYW5kIHRodXMgY2Fubm90IGF3YWl0XG4gIC8vIC5kYXRhKCkpLlxuICBjb25zdCB7c2VsZWN0ZWRJbmRpY2VzLCBzZWxlY3RlZFNjb3Jlc30gPSBub25NYXhTdXBwcmVzc2lvblY1SW1wbChcbiAgICAgIGJveGVzVmFscywgc2NvcmVzVmFscywgbWF4T3V0cHV0U2l6ZSwgaW91VGhyZXNob2xkLCBzY29yZVRocmVzaG9sZCxcbiAgICAgIHNvZnRObXNTaWdtYSk7XG5cbiAgaWYgKCRib3hlcyAhPT0gYm94ZXMpIHtcbiAgICAkYm94ZXMuZGlzcG9zZSgpO1xuICB9XG4gIGlmICgkc2NvcmVzICE9PSBzY29yZXMpIHtcbiAgICAkc2NvcmVzLmRpc3Bvc2UoKTtcbiAgfVxuXG4gIHJldHVybiB7XG4gICAgc2VsZWN0ZWRJbmRpY2VzOiB0ZW5zb3IxZChzZWxlY3RlZEluZGljZXMsICdpbnQzMicpLFxuICAgIHNlbGVjdGVkU2NvcmVzOiB0ZW5zb3IxZChzZWxlY3RlZFNjb3JlcylcbiAgfTtcbn1cblxuZXhwb3J0IGNvbnN0IG5vbk1heFN1cHByZXNzaW9uV2l0aFNjb3JlQXN5bmMgPSBub25NYXhTdXBwcmVzc2lvbldpdGhTY29yZUFzeW5jXztcbiJdfQ==","/**\n * @license\n * Copyright 2020 Google LLC. All Rights Reserved.\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n * =============================================================================\n */\nimport { ENGINE } from '../../engine';\nimport { NonMaxSuppressionV4 } from '../../kernel_names';\nimport { convertToTensor } from '../../tensor_util_env';\nimport { nonMaxSuppSanityCheck } from '../nonmax_util';\nimport { op } from '../operation';\n/**\n * Asynchronously performs non maximum suppression of bounding boxes based on\n * iou (intersection over union), with an option to pad results.\n *\n * @param boxes a 2d tensor of shape `[numBoxes, 4]`. Each entry is\n * `[y1, x1, y2, x2]`, where `(y1, x1)` and `(y2, x2)` are the corners of\n * the bounding box.\n * @param scores a 1d tensor providing the box scores of shape `[numBoxes]`.\n * @param maxOutputSize The maximum number of boxes to be selected.\n * @param iouThreshold A float representing the threshold for deciding whether\n * boxes overlap too much with respect to IOU. Must be between [0, 1].\n * Defaults to 0.5 (50% box overlap).\n * @param scoreThreshold A threshold for deciding when to remove boxes based\n * on score. Defaults to -inf, which means any score is accepted.\n * @param padToMaxOutputSize Defaults to false. If true, size of output\n * `selectedIndices` is padded to maxOutputSize.\n * @return A map with the following properties:\n * - selectedIndices: A 1D tensor with the selected box indices.\n * - validOutputs: A scalar denoting how many elements in `selectedIndices`\n * are valid. Valid elements occur first, then padding.\n *\n * @doc {heading: 'Operations', subheading: 'Images', namespace: 'image'}\n */\nfunction nonMaxSuppressionPadded_(boxes, scores, maxOutputSize, iouThreshold = 0.5, scoreThreshold = Number.NEGATIVE_INFINITY, padToMaxOutputSize = false) {\n const $boxes = convertToTensor(boxes, 'boxes', 'nonMaxSuppression');\n const $scores = convertToTensor(scores, 'scores', 'nonMaxSuppression');\n const params = nonMaxSuppSanityCheck($boxes, $scores, maxOutputSize, iouThreshold, scoreThreshold, null /* softNmsSigma */);\n const $maxOutputSize = params.maxOutputSize;\n const $iouThreshold = params.iouThreshold;\n const $scoreThreshold = params.scoreThreshold;\n const inputs = { boxes: $boxes, scores: $scores };\n const attrs = {\n maxOutputSize: $maxOutputSize,\n iouThreshold: $iouThreshold,\n scoreThreshold: $scoreThreshold,\n padToMaxOutputSize\n };\n // tslint:disable-next-line: no-unnecessary-type-assertion\n const result = ENGINE.runKernel(NonMaxSuppressionV4, inputs, attrs);\n return { selectedIndices: result[0], validOutputs: result[1] };\n}\nexport const nonMaxSuppressionPadded = op({ nonMaxSuppressionPadded_ });\n//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibm9uX21heF9zdXBwcmVzc2lvbl9wYWRkZWQuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi8uLi8uLi90ZmpzLWNvcmUvc3JjL29wcy9pbWFnZS9ub25fbWF4X3N1cHByZXNzaW9uX3BhZGRlZC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQTs7Ozs7Ozs7Ozs7Ozs7O0dBZUc7QUFFSCxPQUFPLEVBQUMsTUFBTSxFQUFDLE1BQU0sY0FBYyxDQUFDO0FBQ3BDLE9BQU8sRUFBQyxtQkFBbUIsRUFBc0QsTUFBTSxvQkFBb0IsQ0FBQztBQUk1RyxPQUFPLEVBQUMsZUFBZSxFQUFDLE1BQU0sdUJBQXVCLENBQUM7QUFHdEQsT0FBTyxFQUFDLHFCQUFxQixFQUFDLE1BQU0sZ0JBQWdCLENBQUM7QUFDckQsT0FBTyxFQUFDLEVBQUUsRUFBQyxNQUFNLGNBQWMsQ0FBQztBQUVoQzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7OztHQXNCRztBQUNILFNBQVMsd0JBQXdCLENBQzdCLEtBQTBCLEVBQUUsTUFBMkIsRUFDdkQsYUFBcUIsRUFBRSxZQUFZLEdBQUcsR0FBRyxFQUN6QyxjQUFjLEdBQUcsTUFBTSxDQUFDLGlCQUFpQixFQUN6QyxrQkFBa0IsR0FBRyxLQUFLO0lBQzVCLE1BQU0sTUFBTSxHQUFHLGVBQWUsQ0FBQyxLQUFLLEVBQUUsT0FBTyxFQUFFLG1CQUFtQixDQUFDLENBQUM7SUFDcEUsTUFBTSxPQUFPLEdBQUcsZUFBZSxDQUFDLE1BQU0sRUFBRSxRQUFRLEVBQUUsbUJBQW1CLENBQUMsQ0FBQztJQUV2RSxNQUFNLE1BQU0sR0FBRyxxQkFBcUIsQ0FDaEMsTUFBTSxFQUFFLE9BQU8sRUFBRSxhQUFhLEVBQUUsWUFBWSxFQUFFLGNBQWMsRUFDNUQsSUFBSSxDQUFDLGtCQUFrQixDQUFDLENBQUM7SUFDN0IsTUFBTSxjQUFjLEdBQUcsTUFBTSxDQUFDLGFBQWEsQ0FBQztJQUM1QyxNQUFNLGFBQWEsR0FBRyxNQUFNLENBQUMsWUFBWSxDQUFDO0lBQzFDLE1BQU0sZUFBZSxHQUFHLE1BQU0sQ0FBQyxjQUFjLENBQUM7SUFFOUMsTUFBTSxNQUFNLEdBQThCLEVBQUMsS0FBSyxFQUFFLE1BQU0sRUFBRSxNQUFNLEVBQUUsT0FBTyxFQUFDLENBQUM7SUFDM0UsTUFBTSxLQUFLLEdBQTZCO1FBQ3RDLGFBQWEsRUFBRSxjQUFjO1FBQzdCLFlBQVksRUFBRSxhQUFhO1FBQzNCLGNBQWMsRUFBRSxlQUFlO1FBQy9CLGtCQUFrQjtLQUNuQixDQUFDO0lBRUYsMERBQTBEO0lBQzFELE1BQU0sTUFBTSxHQUFHLE1BQU0sQ0FBQyxTQUFTLENBQ1osbUJBQW1CLEVBQUUsTUFBOEIsRUFDbkQsS0FBMkIsQ0FBYSxDQUFDO0lBRTVELE9BQU8sRUFBQyxlQUFlLEVBQUUsTUFBTSxDQUFDLENBQUMsQ0FBQyxFQUFFLFlBQVksRUFBRSxNQUFNLENBQUMsQ0FBQyxDQUFDLEVBQUMsQ0FBQztBQUMvRCxDQUFDO0FBRUQsTUFBTSxDQUFDLE1BQU0sdUJBQXVCLEdBQUcsRUFBRSxDQUFDLEVBQUMsd0JBQXdCLEVBQUMsQ0FBQyxDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiLyoqXG4gKiBAbGljZW5zZVxuICogQ29weXJpZ2h0IDIwMjAgR29vZ2xlIExMQy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC5cbiAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSBcIkxpY2Vuc2VcIik7XG4gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuXG4gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXRcbiAqXG4gKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjBcbiAqXG4gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlXG4gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiBcIkFTIElTXCIgQkFTSVMsXG4gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC5cbiAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmRcbiAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLlxuICogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbiAqL1xuXG5pbXBvcnQge0VOR0lORX0gZnJvbSAnLi4vLi4vZW5naW5lJztcbmltcG9ydCB7Tm9uTWF4U3VwcHJlc3Npb25WNCwgTm9uTWF4U3VwcHJlc3Npb25WNEF0dHJzLCBOb25NYXhTdXBwcmVzc2lvblY0SW5wdXRzfSBmcm9tICcuLi8uLi9rZXJuZWxfbmFtZXMnO1xuaW1wb3J0IHtOYW1lZEF0dHJNYXB9IGZyb20gJy4uLy4uL2tlcm5lbF9yZWdpc3RyeSc7XG5pbXBvcnQge1RlbnNvciwgVGVuc29yMUQsIFRlbnNvcjJEfSBmcm9tICcuLi8uLi90ZW5zb3InO1xuaW1wb3J0IHtOYW1lZFRlbnNvck1hcH0gZnJvbSAnLi4vLi4vdGVuc29yX3R5cGVzJztcbmltcG9ydCB7Y29udmVydFRvVGVuc29yfSBmcm9tICcuLi8uLi90ZW5zb3JfdXRpbF9lbnYnO1xuaW1wb3J0IHtUZW5zb3JMaWtlfSBmcm9tICcuLi8uLi90eXBlcyc7XG5cbmltcG9ydCB7bm9uTWF4U3VwcFNhbml0eUNoZWNrfSBmcm9tICcuLi9ub25tYXhfdXRpbCc7XG5pbXBvcnQge29wfSBmcm9tICcuLi9vcGVyYXRpb24nO1xuXG4vKipcbiAqIEFzeW5jaHJvbm91c2x5IHBlcmZvcm1zIG5vbiBtYXhpbXVtIHN1cHByZXNzaW9uIG9mIGJvdW5kaW5nIGJveGVzIGJhc2VkIG9uXG4gKiBpb3UgKGludGVyc2VjdGlvbiBvdmVyIHVuaW9uKSwgd2l0aCBhbiBvcHRpb24gdG8gcGFkIHJlc3VsdHMuXG4gKlxuICogQHBhcmFtIGJveGVzIGEgMmQgdGVuc29yIG9mIHNoYXBlIGBbbnVtQm94ZXMsIDRdYC4gRWFjaCBlbnRyeSBpc1xuICogICAgIGBbeTEsIHgxLCB5MiwgeDJdYCwgd2hlcmUgYCh5MSwgeDEpYCBhbmQgYCh5MiwgeDIpYCBhcmUgdGhlIGNvcm5lcnMgb2ZcbiAqICAgICB0aGUgYm91bmRpbmcgYm94LlxuICogQHBhcmFtIHNjb3JlcyBhIDFkIHRlbnNvciBwcm92aWRpbmcgdGhlIGJveCBzY29yZXMgb2Ygc2hhcGUgYFtudW1Cb3hlc11gLlxuICogQHBhcmFtIG1heE91dHB1dFNpemUgVGhlIG1heGltdW0gbnVtYmVyIG9mIGJveGVzIHRvIGJlIHNlbGVjdGVkLlxuICogQHBhcmFtIGlvdVRocmVzaG9sZCBBIGZsb2F0IHJlcHJlc2VudGluZyB0aGUgdGhyZXNob2xkIGZvciBkZWNpZGluZyB3aGV0aGVyXG4gKiAgICAgYm94ZXMgb3ZlcmxhcCB0b28gbXVjaCB3aXRoIHJlc3BlY3QgdG8gSU9VLiBNdXN0IGJlIGJldHdlZW4gWzAsIDFdLlxuICogICAgIERlZmF1bHRzIHRvIDAuNSAoNTAlIGJveCBvdmVybGFwKS5cbiAqIEBwYXJhbSBzY29yZVRocmVzaG9sZCBBIHRocmVzaG9sZCBmb3IgZGVjaWRpbmcgd2hlbiB0byByZW1vdmUgYm94ZXMgYmFzZWRcbiAqICAgICBvbiBzY29yZS4gRGVmYXVsdHMgdG8gLWluZiwgd2hpY2ggbWVhbnMgYW55IHNjb3JlIGlzIGFjY2VwdGVkLlxuICogQHBhcmFtIHBhZFRvTWF4T3V0cHV0U2l6ZSBEZWZhdWx0cyB0byBmYWxzZS4gSWYgdHJ1ZSwgc2l6ZSBvZiBvdXRwdXRcbiAqICAgICBgc2VsZWN0ZWRJbmRpY2VzYCBpcyBwYWRkZWQgdG8gbWF4T3V0cHV0U2l6ZS5cbiAqIEByZXR1cm4gQSBtYXAgd2l0aCB0aGUgZm9sbG93aW5nIHByb3BlcnRpZXM6XG4gKiAgICAgLSBzZWxlY3RlZEluZGljZXM6IEEgMUQgdGVuc29yIHdpdGggdGhlIHNlbGVjdGVkIGJveCBpbmRpY2VzLlxuICogICAgIC0gdmFsaWRPdXRwdXRzOiBBIHNjYWxhciBkZW5vdGluZyBob3cgbWFueSBlbGVtZW50cyBpbiBgc2VsZWN0ZWRJbmRpY2VzYFxuICogICAgICAgYXJlIHZhbGlkLiBWYWxpZCBlbGVtZW50cyBvY2N1ciBmaXJzdCwgdGhlbiBwYWRkaW5nLlxuICpcbiAqIEBkb2Mge2hlYWRpbmc6ICdPcGVyYXRpb25zJywgc3ViaGVhZGluZzogJ0ltYWdlcycsIG5hbWVzcGFjZTogJ2ltYWdlJ31cbiAqL1xuZnVuY3Rpb24gbm9uTWF4U3VwcHJlc3Npb25QYWRkZWRfKFxuICAgIGJveGVzOiBUZW5zb3IyRHxUZW5zb3JMaWtlLCBzY29yZXM6IFRlbnNvcjFEfFRlbnNvckxpa2UsXG4gICAgbWF4T3V0cHV0U2l6ZTogbnVtYmVyLCBpb3VUaHJlc2hvbGQgPSAwLjUsXG4gICAgc2NvcmVUaHJlc2hvbGQgPSBOdW1iZXIuTkVHQVRJVkVfSU5GSU5JVFksXG4gICAgcGFkVG9NYXhPdXRwdXRTaXplID0gZmFsc2UpOiBOYW1lZFRlbnNvck1hcCB7XG4gIGNvbnN0ICRib3hlcyA9IGNvbnZlcnRUb1RlbnNvcihib3hlcywgJ2JveGVzJywgJ25vbk1heFN1cHByZXNzaW9uJyk7XG4gIGNvbnN0ICRzY29yZXMgPSBjb252ZXJ0VG9UZW5zb3Ioc2NvcmVzLCAnc2NvcmVzJywgJ25vbk1heFN1cHByZXNzaW9uJyk7XG5cbiAgY29uc3QgcGFyYW1zID0gbm9uTWF4U3VwcFNhbml0eUNoZWNrKFxuICAgICAgJGJveGVzLCAkc2NvcmVzLCBtYXhPdXRwdXRTaXplLCBpb3VUaHJlc2hvbGQsIHNjb3JlVGhyZXNob2xkLFxuICAgICAgbnVsbCAvKiBzb2Z0Tm1zU2lnbWEgKi8pO1xuICBjb25zdCAkbWF4T3V0cHV0U2l6ZSA9IHBhcmFtcy5tYXhPdXRwdXRTaXplO1xuICBjb25zdCAkaW91VGhyZXNob2xkID0gcGFyYW1zLmlvdVRocmVzaG9sZDtcbiAgY29uc3QgJHNjb3JlVGhyZXNob2xkID0gcGFyYW1zLnNjb3JlVGhyZXNob2xkO1xuXG4gIGNvbnN0IGlucHV0czogTm9uTWF4U3VwcHJlc3Npb25WNElucHV0cyA9IHtib3hlczogJGJveGVzLCBzY29yZXM6ICRzY29yZXN9O1xuICBjb25zdCBhdHRyczogTm9uTWF4U3VwcHJlc3Npb25WNEF0dHJzID0ge1xuICAgIG1heE91dHB1dFNpemU6ICRtYXhPdXRwdXRTaXplLFxuICAgIGlvdVRocmVzaG9sZDogJGlvdVRocmVzaG9sZCxcbiAgICBzY29yZVRocmVzaG9sZDogJHNjb3JlVGhyZXNob2xkLFxuICAgIHBhZFRvTWF4T3V0cHV0U2l6ZVxuICB9O1xuXG4gIC8vIHRzbGludDpkaXNhYmxlLW5leHQtbGluZTogbm8tdW5uZWNlc3NhcnktdHlwZS1hc3NlcnRpb25cbiAgY29uc3QgcmVzdWx0ID0gRU5HSU5FLnJ1bktlcm5lbChcbiAgICAgICAgICAgICAgICAgICAgIE5vbk1heFN1cHByZXNzaW9uVjQsIGlucHV0cyBhcyB7fSBhcyBOYW1lZFRlbnNvck1hcCxcbiAgICAgICAgICAgICAgICAgICAgIGF0dHJzIGFzIHt9IGFzIE5hbWVkQXR0ck1hcCkgYXMgVGVuc29yW107XG5cbiAgcmV0dXJuIHtzZWxlY3RlZEluZGljZXM6IHJlc3VsdFswXSwgdmFsaWRPdXRwdXRzOiByZXN1bHRbMV19O1xufVxuXG5leHBvcnQgY29uc3Qgbm9uTWF4U3VwcHJlc3Npb25QYWRkZWQgPSBvcCh7bm9uTWF4U3VwcHJlc3Npb25QYWRkZWRffSk7XG4iXX0=","/**\n * @license\n * Copyright 2020 Google LLC. All Rights Reserved.\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n * =============================================================================\n */\nimport { nonMaxSuppressionV4Impl } from '../../backends/non_max_suppression_impl';\nimport { convertToTensor } from '../../tensor_util_env';\nimport { nonMaxSuppSanityCheck } from '../nonmax_util';\nimport { scalar } from '../scalar';\nimport { tensor1d } from '../tensor1d';\n/**\n * Asynchronously performs non maximum suppression of bounding boxes based on\n * iou (intersection over union), with an option to pad results.\n *\n * @param boxes a 2d tensor of shape `[numBoxes, 4]`. Each entry is\n * `[y1, x1, y2, x2]`, where `(y1, x1)` and `(y2, x2)` are the corners of\n * the bounding box.\n * @param scores a 1d tensor providing the box scores of shape `[numBoxes]`.\n * @param maxOutputSize The maximum number of boxes to be selected.\n * @param iouThreshold A float representing the threshold for deciding whether\n * boxes overlap too much with respect to IOU. Must be between [0, 1].\n * Defaults to 0.5 (50% box overlap).\n * @param scoreThreshold A threshold for deciding when to remove boxes based\n * on score. Defaults to -inf, which means any score is accepted.\n * @param padToMaxOutputSize Defaults to false. If true, size of output\n * `selectedIndices` is padded to maxOutputSize.\n * @return A map with the following properties:\n * - selectedIndices: A 1D tensor with the selected box indices.\n * - validOutputs: A scalar denoting how many elements in `selectedIndices`\n * are valid. Valid elements occur first, then padding.\n *\n * @doc {heading: 'Operations', subheading: 'Images', namespace: 'image'}\n */\nasync function nonMaxSuppressionPaddedAsync_(boxes, scores, maxOutputSize, iouThreshold = 0.5, scoreThreshold = Number.NEGATIVE_INFINITY, padToMaxOutputSize = false) {\n const $boxes = convertToTensor(boxes, 'boxes', 'nonMaxSuppressionAsync');\n const $scores = convertToTensor(scores, 'scores', 'nonMaxSuppressionAsync');\n const params = nonMaxSuppSanityCheck($boxes, $scores, maxOutputSize, iouThreshold, scoreThreshold, null /* softNmsSigma */);\n const $maxOutputSize = params.maxOutputSize;\n const $iouThreshold = params.iouThreshold;\n const $scoreThreshold = params.scoreThreshold;\n const [boxesVals, scoresVals] = await Promise.all([$boxes.data(), $scores.data()]);\n // We call a cpu based impl directly with the typedarray data here rather\n // than a kernel because all kernels are synchronous (and thus cannot await\n // .data()).\n const { selectedIndices, validOutputs } = nonMaxSuppressionV4Impl(boxesVals, scoresVals, $maxOutputSize, $iouThreshold, $scoreThreshold, padToMaxOutputSize);\n if ($boxes !== boxes) {\n $boxes.dispose();\n }\n if ($scores !== scores) {\n $scores.dispose();\n }\n return {\n selectedIndices: tensor1d(selectedIndices, 'int32'),\n validOutputs: scalar(validOutputs, 'int32')\n };\n}\nexport const nonMaxSuppressionPaddedAsync = nonMaxSuppressionPaddedAsync_;\n//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibm9uX21heF9zdXBwcmVzc2lvbl9wYWRkZWRfYXN5bmMuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi8uLi8uLi90ZmpzLWNvcmUvc3JjL29wcy9pbWFnZS9ub25fbWF4X3N1cHByZXNzaW9uX3BhZGRlZF9hc3luYy50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQTs7Ozs7Ozs7Ozs7Ozs7O0dBZUc7QUFDSCxPQUFPLEVBQUMsdUJBQXVCLEVBQUMsTUFBTSx5Q0FBeUMsQ0FBQztBQUdoRixPQUFPLEVBQUMsZUFBZSxFQUFDLE1BQU0sdUJBQXVCLENBQUM7QUFFdEQsT0FBTyxFQUFDLHFCQUFxQixFQUFDLE1BQU0sZ0JBQWdCLENBQUM7QUFDckQsT0FBTyxFQUFDLE1BQU0sRUFBQyxNQUFNLFdBQVcsQ0FBQztBQUNqQyxPQUFPLEVBQUMsUUFBUSxFQUFDLE1BQU0sYUFBYSxDQUFDO0FBRXJDOzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7O0dBc0JHO0FBQ0gsS0FBSyxVQUFVLDZCQUE2QixDQUN4QyxLQUEwQixFQUFFLE1BQTJCLEVBQ3ZELGFBQXFCLEVBQUUsWUFBWSxHQUFHLEdBQUcsRUFDekMsY0FBYyxHQUFHLE1BQU0sQ0FBQyxpQkFBaUIsRUFDekMsa0JBQWtCLEdBQUcsS0FBSztJQUM1QixNQUFNLE1BQU0sR0FBRyxlQUFlLENBQUMsS0FBSyxFQUFFLE9BQU8sRUFBRSx3QkFBd0IsQ0FBQyxDQUFDO0lBQ3pFLE1BQU0sT0FBTyxHQUFHLGVBQWUsQ0FBQyxNQUFNLEVBQUUsUUFBUSxFQUFFLHdCQUF3QixDQUFDLENBQUM7SUFFNUUsTUFBTSxNQUFNLEdBQUcscUJBQXFCLENBQ2hDLE1BQU0sRUFBRSxPQUFPLEVBQUUsYUFBYSxFQUFFLFlBQVksRUFBRSxjQUFjLEVBQzVELElBQUksQ0FBQyxrQkFBa0IsQ0FBQyxDQUFDO0lBQzdCLE1BQU0sY0FBYyxHQUFHLE1BQU0sQ0FBQyxhQUFhLENBQUM7SUFDNUMsTUFBTSxhQUFhLEdBQUcsTUFBTSxDQUFDLFlBQVksQ0FBQztJQUMxQyxNQUFNLGVBQWUsR0FBRyxNQUFNLENBQUMsY0FBYyxDQUFDO0lBRTlDLE1BQU0sQ0FBQyxTQUFTLEVBQUUsVUFBVSxDQUFDLEdBQ3pCLE1BQU0sT0FBTyxDQUFDLEdBQUcsQ0FBQyxDQUFDLE1BQU0sQ0FBQyxJQUFJLEVBQUUsRUFBRSxPQUFPLENBQUMsSUFBSSxFQUFFLENBQUMsQ0FBQyxDQUFDO0lBRXZELHlFQUF5RTtJQUN6RSwyRUFBMkU7SUFDM0UsWUFBWTtJQUNaLE1BQU0sRUFBQyxlQUFlLEVBQUUsWUFBWSxFQUFDLEdBQUcsdUJBQXVCLENBQzNELFNBQVMsRUFBRSxVQUFVLEVBQUUsY0FBYyxFQUFFLGFBQWEsRUFBRSxlQUFlLEVBQ3JFLGtCQUFrQixDQUFDLENBQUM7SUFFeEIsSUFBSSxNQUFNLEtBQUssS0FBSyxFQUFFO1FBQ3BCLE1BQU0sQ0FBQyxPQUFPLEVBQUUsQ0FBQztLQUNsQjtJQUNELElBQUksT0FBTyxLQUFLLE1BQU0sRUFBRTtRQUN0QixPQUFPLENBQUMsT0FBTyxFQUFFLENBQUM7S0FDbkI7SUFFRCxPQUFPO1FBQ0wsZUFBZSxFQUFFLFFBQVEsQ0FBQyxlQUFlLEVBQUUsT0FBTyxDQUFDO1FBQ25ELFlBQVksRUFBRSxNQUFNLENBQUMsWUFBWSxFQUFFLE9BQU8sQ0FBQztLQUM1QyxDQUFDO0FBQ0osQ0FBQztBQUVELE1BQU0sQ0FBQyxNQUFNLDRCQUE0QixHQUFHLDZCQUE2QixDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiLyoqXG4gKiBAbGljZW5zZVxuICogQ29weXJpZ2h0IDIwMjAgR29vZ2xlIExMQy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC5cbiAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSBcIkxpY2Vuc2VcIik7XG4gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuXG4gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXRcbiAqXG4gKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjBcbiAqXG4gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlXG4gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiBcIkFTIElTXCIgQkFTSVMsXG4gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC5cbiAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmRcbiAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLlxuICogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbiAqL1xuaW1wb3J0IHtub25NYXhTdXBwcmVzc2lvblY0SW1wbH0gZnJvbSAnLi4vLi4vYmFja2VuZHMvbm9uX21heF9zdXBwcmVzc2lvbl9pbXBsJztcbmltcG9ydCB7VGVuc29yMUQsIFRlbnNvcjJEfSBmcm9tICcuLi8uLi90ZW5zb3InO1xuaW1wb3J0IHtOYW1lZFRlbnNvck1hcH0gZnJvbSAnLi4vLi4vdGVuc29yX3R5cGVzJztcbmltcG9ydCB7Y29udmVydFRvVGVuc29yfSBmcm9tICcuLi8uLi90ZW5zb3JfdXRpbF9lbnYnO1xuaW1wb3J0IHtUZW5zb3JMaWtlfSBmcm9tICcuLi8uLi90eXBlcyc7XG5pbXBvcnQge25vbk1heFN1cHBTYW5pdHlDaGVja30gZnJvbSAnLi4vbm9ubWF4X3V0aWwnO1xuaW1wb3J0IHtzY2FsYXJ9IGZyb20gJy4uL3NjYWxhcic7XG5pbXBvcnQge3RlbnNvcjFkfSBmcm9tICcuLi90ZW5zb3IxZCc7XG5cbi8qKlxuICogQXN5bmNocm9ub3VzbHkgcGVyZm9ybXMgbm9uIG1heGltdW0gc3VwcHJlc3Npb24gb2YgYm91bmRpbmcgYm94ZXMgYmFzZWQgb25cbiAqIGlvdSAoaW50ZXJzZWN0aW9uIG92ZXIgdW5pb24pLCB3aXRoIGFuIG9wdGlvbiB0byBwYWQgcmVzdWx0cy5cbiAqXG4gKiBAcGFyYW0gYm94ZXMgYSAyZCB0ZW5zb3Igb2Ygc2hhcGUgYFtudW1Cb3hlcywgNF1gLiBFYWNoIGVudHJ5IGlzXG4gKiAgICAgYFt5MSwgeDEsIHkyLCB4Ml1gLCB3aGVyZSBgKHkxLCB4MSlgIGFuZCBgKHkyLCB4MilgIGFyZSB0aGUgY29ybmVycyBvZlxuICogICAgIHRoZSBib3VuZGluZyBib3guXG4gKiBAcGFyYW0gc2NvcmVzIGEgMWQgdGVuc29yIHByb3ZpZGluZyB0aGUgYm94IHNjb3JlcyBvZiBzaGFwZSBgW251bUJveGVzXWAuXG4gKiBAcGFyYW0gbWF4T3V0cHV0U2l6ZSBUaGUgbWF4aW11bSBudW1iZXIgb2YgYm94ZXMgdG8gYmUgc2VsZWN0ZWQuXG4gKiBAcGFyYW0gaW91VGhyZXNob2xkIEEgZmxvYXQgcmVwcmVzZW50aW5nIHRoZSB0aHJlc2hvbGQgZm9yIGRlY2lkaW5nIHdoZXRoZXJcbiAqICAgICBib3hlcyBvdmVybGFwIHRvbyBtdWNoIHdpdGggcmVzcGVjdCB0byBJT1UuIE11c3QgYmUgYmV0d2VlbiBbMCwgMV0uXG4gKiAgICAgRGVmYXVsdHMgdG8gMC41ICg1MCUgYm94IG92ZXJsYXApLlxuICogQHBhcmFtIHNjb3JlVGhyZXNob2xkIEEgdGhyZXNob2xkIGZvciBkZWNpZGluZyB3aGVuIHRvIHJlbW92ZSBib3hlcyBiYXNlZFxuICogICAgIG9uIHNjb3JlLiBEZWZhdWx0cyB0byAtaW5mLCB3aGljaCBtZWFucyBhbnkgc2NvcmUgaXMgYWNjZXB0ZWQuXG4gKiBAcGFyYW0gcGFkVG9NYXhPdXRwdXRTaXplIERlZmF1bHRzIHRvIGZhbHNlLiBJZiB0cnVlLCBzaXplIG9mIG91dHB1dFxuICogICAgIGBzZWxlY3RlZEluZGljZXNgIGlzIHBhZGRlZCB0byBtYXhPdXRwdXRTaXplLlxuICogQHJldHVybiBBIG1hcCB3aXRoIHRoZSBmb2xsb3dpbmcgcHJvcGVydGllczpcbiAqICAgICAtIHNlbGVjdGVkSW5kaWNlczogQSAxRCB0ZW5zb3Igd2l0aCB0aGUgc2VsZWN0ZWQgYm94IGluZGljZXMuXG4gKiAgICAgLSB2YWxpZE91dHB1dHM6IEEgc2NhbGFyIGRlbm90aW5nIGhvdyBtYW55IGVsZW1lbnRzIGluIGBzZWxlY3RlZEluZGljZXNgXG4gKiAgICAgICBhcmUgdmFsaWQuIFZhbGlkIGVsZW1lbnRzIG9jY3VyIGZpcnN0LCB0aGVuIHBhZGRpbmcuXG4gKlxuICogQGRvYyB7aGVhZGluZzogJ09wZXJhdGlvbnMnLCBzdWJoZWFkaW5nOiAnSW1hZ2VzJywgbmFtZXNwYWNlOiAnaW1hZ2UnfVxuICovXG5hc3luYyBmdW5jdGlvbiBub25NYXhTdXBwcmVzc2lvblBhZGRlZEFzeW5jXyhcbiAgICBib3hlczogVGVuc29yMkR8VGVuc29yTGlrZSwgc2NvcmVzOiBUZW5zb3IxRHxUZW5zb3JMaWtlLFxuICAgIG1heE91dHB1dFNpemU6IG51bWJlciwgaW91VGhyZXNob2xkID0gMC41LFxuICAgIHNjb3JlVGhyZXNob2xkID0gTnVtYmVyLk5FR0FUSVZFX0lORklOSVRZLFxuICAgIHBhZFRvTWF4T3V0cHV0U2l6ZSA9IGZhbHNlKTogUHJvbWlzZTxOYW1lZFRlbnNvck1hcD4ge1xuICBjb25zdCAkYm94ZXMgPSBjb252ZXJ0VG9UZW5zb3IoYm94ZXMsICdib3hlcycsICdub25NYXhTdXBwcmVzc2lvbkFzeW5jJyk7XG4gIGNvbnN0ICRzY29yZXMgPSBjb252ZXJ0VG9UZW5zb3Ioc2NvcmVzLCAnc2NvcmVzJywgJ25vbk1heFN1cHByZXNzaW9uQXN5bmMnKTtcblxuICBjb25zdCBwYXJhbXMgPSBub25NYXhTdXBwU2FuaXR5Q2hlY2soXG4gICAgICAkYm94ZXMsICRzY29yZXMsIG1heE91dHB1dFNpemUsIGlvdVRocmVzaG9sZCwgc2NvcmVUaHJlc2hvbGQsXG4gICAgICBudWxsIC8qIHNvZnRObXNTaWdtYSAqLyk7XG4gIGNvbnN0ICRtYXhPdXRwdXRTaXplID0gcGFyYW1zLm1heE91dHB1dFNpemU7XG4gIGNvbnN0ICRpb3VUaHJlc2hvbGQgPSBwYXJhbXMuaW91VGhyZXNob2xkO1xuICBjb25zdCAkc2NvcmVUaHJlc2hvbGQgPSBwYXJhbXMuc2NvcmVUaHJlc2hvbGQ7XG5cbiAgY29uc3QgW2JveGVzVmFscywgc2NvcmVzVmFsc10gPVxuICAgICAgYXdhaXQgUHJvbWlzZS5hbGwoWyRib3hlcy5kYXRhKCksICRzY29yZXMuZGF0YSgpXSk7XG5cbiAgLy8gV2UgY2FsbCBhIGNwdSBiYXNlZCBpbXBsIGRpcmVjdGx5IHdpdGggdGhlIHR5cGVkYXJyYXkgZGF0YSBoZXJlIHJhdGhlclxuICAvLyB0aGFuIGEga2VybmVsIGJlY2F1c2UgYWxsIGtlcm5lbHMgYXJlIHN5bmNocm9ub3VzIChhbmQgdGh1cyBjYW5ub3QgYXdhaXRcbiAgLy8gLmRhdGEoKSkuXG4gIGNvbnN0IHtzZWxlY3RlZEluZGljZXMsIHZhbGlkT3V0cHV0c30gPSBub25NYXhTdXBwcmVzc2lvblY0SW1wbChcbiAgICAgIGJveGVzVmFscywgc2NvcmVzVmFscywgJG1heE91dHB1dFNpemUsICRpb3VUaHJlc2hvbGQsICRzY29yZVRocmVzaG9sZCxcbiAgICAgIHBhZFRvTWF4T3V0cHV0U2l6ZSk7XG5cbiAgaWYgKCRib3hlcyAhPT0gYm94ZXMpIHtcbiAgICAkYm94ZXMuZGlzcG9zZSgpO1xuICB9XG4gIGlmICgkc2NvcmVzICE9PSBzY29yZXMpIHtcbiAgICAkc2NvcmVzLmRpc3Bvc2UoKTtcbiAgfVxuXG4gIHJldHVybiB7XG4gICAgc2VsZWN0ZWRJbmRpY2VzOiB0ZW5zb3IxZChzZWxlY3RlZEluZGljZXMsICdpbnQzMicpLFxuICAgIHZhbGlkT3V0cHV0czogc2NhbGFyKHZhbGlkT3V0cHV0cywgJ2ludDMyJylcbiAgfTtcbn1cblxuZXhwb3J0IGNvbnN0IG5vbk1heFN1cHByZXNzaW9uUGFkZGVkQXN5bmMgPSBub25NYXhTdXBwcmVzc2lvblBhZGRlZEFzeW5jXztcbiJdfQ==","/**\n * @license\n * Copyright 2021 Google LLC. All Rights Reserved.\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * https://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n * =============================================================================\n */\nimport { tensor1d } from '../tensor1d';\nimport { op } from '../operation';\nimport { cast } from '../cast';\nimport { split } from '../split';\nimport { bincount } from '../bincount';\nimport { lessEqual } from '../less_equal';\nimport { greater } from '../greater';\nimport { sum } from '../sum';\nimport { add } from '../add';\nimport { mul } from '../mul';\nimport { div } from '../div';\nimport { sub } from '../sub';\nimport { round } from '../round';\nimport { where } from '../where';\nimport { fill } from '../fill';\nimport { slice } from '../slice';\nimport { range } from '../range';\nimport { tensor } from '../tensor';\nimport * as util from '../../util';\nimport { convertToTensor } from '../../tensor_util_env';\n/**\n * Performs image binarization with corresponding threshold\n * (depends on the method)value, which creates a binary image from a grayscale.\n * @param image 3d tensor of shape [imageHeight,imageWidth, depth],\n * where imageHeight and imageWidth must be positive.The image color\n * range should be [0, 255].\n * @param method Optional string from `'binary' | 'otsu'`\n * which specifies the method for thresholding. Defaults to 'binary'.\n * @param inverted Optional boolean whichspecifies\n * if colours should be inverted. Defaults to false.\n * @param threshValue Optional number which defines threshold value from 0 to 1.\n * Defaults to 0.5.\n * @return A 3d tensor of shape [imageHeight,imageWidth, depth], which\n * contains binarized image.\n */\nfunction threshold_(image, method = 'binary', inverted = false, threshValue = 0.5) {\n const $image = convertToTensor(image, 'image', 'threshold');\n /* 0.2989, 0.5870, 0.1140 are represent luma coefficients in CCIR601.\n Reference for converting between RGB and grayscale: https://en.wikipedia.org/wiki/Luma_%28video%29 */\n const RED_INTENCITY_COEF = 0.2989;\n const GREEN_INTENCITY_COEF = 0.5870;\n const BLUE_INTENCITY_COEF = 0.1140;\n const totalPixelsInImage = $image.shape[0] * $image.shape[1];\n let $threshold = mul(tensor1d([threshValue]), 255);\n let r, g, b, grayscale;\n util.assert($image.rank === 3, () => 'Error in threshold: image must be rank 3,' +\n `but got rank ${$image.rank}.`);\n util.assert($image.shape[2] === 3 || $image.shape[2] === 1, () => 'Error in threshold: ' +\n 'image color channel must be equal to 3 or 1' +\n `but got ${$image.shape[2]}.`);\n util.assert($image.dtype === 'int32' || $image.dtype === 'float32', () => 'Error in dtype: image dtype must be int32 or float32,' +\n `but got dtype ${$image.dtype}.`);\n util.assert(method === 'otsu' || method === 'binary', () => `Method must be binary or otsu, but was ${method}`);\n if ($image.shape[2] === 3) {\n [r, g, b] = split($image, [1, 1, 1], -1);\n const $r = mul(r, RED_INTENCITY_COEF);\n const $g = mul(g, GREEN_INTENCITY_COEF);\n const $b = mul(b, BLUE_INTENCITY_COEF);\n grayscale = add(add($r, $g), $b);\n }\n else {\n grayscale = image;\n }\n if (method === 'otsu') {\n const $histogram = bincount(cast(round(grayscale), 'int32'), tensor([]), 256);\n $threshold = otsu($histogram, totalPixelsInImage);\n }\n const invCondition = inverted ?\n lessEqual(grayscale, $threshold) : greater(grayscale, $threshold);\n const result = cast(mul(invCondition, 255), 'int32');\n return result;\n}\nfunction otsu(histogram, total) {\n let bestThresh = tensor1d([-1]);\n let bestInBetVar = tensor1d([0]);\n let cInBetVar = tensor1d([0]);\n let classFirst, classSecond, meanFirst, meanSec, weightForeground, weightBack;\n for (let index = 0; index < histogram.size - 1; index++) {\n classFirst = slice(histogram, 0, index + 1);\n classSecond = slice(histogram, index + 1);\n weightForeground = div(sum(classFirst), total);\n weightBack = div(sum(classSecond), total);\n const meanFirstDivA = sum(mul(classFirst, range(0, classFirst.size)));\n meanFirst = div(meanFirstDivA, sum(classFirst));\n const meanSecFill = fill(classSecond.shape, classFirst.size);\n const meanSecAdd = add(range(0, classSecond.size), meanSecFill);\n const meanSecMul = mul(classSecond, (meanSecAdd));\n meanSec = div(sum(meanSecMul), sum(classSecond));\n const cInBetVarSubA = sub(meanFirst, meanSec);\n const cInBetVarSubB = sub(meanFirst, meanSec);\n const cInBetVarMul = mul(weightForeground, weightBack);\n cInBetVar = mul(mul(cInBetVarMul, cInBetVarSubA), cInBetVarSubB);\n const condition = greater(cInBetVar, bestInBetVar);\n bestInBetVar = where(condition, cInBetVar, bestInBetVar);\n bestThresh = where(condition, tensor1d([index]), bestThresh);\n }\n return bestThresh;\n}\nexport const threshold = op({ threshold_ });\n//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidGhyZXNob2xkLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vLi4vLi4vdGZqcy1jb3JlL3NyYy9vcHMvaW1hZ2UvdGhyZXNob2xkLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBOzs7Ozs7Ozs7Ozs7Ozs7R0FlRztBQUdILE9BQU8sRUFBRSxRQUFRLEVBQUUsTUFBTSxhQUFhLENBQUM7QUFFdkMsT0FBTyxFQUFFLEVBQUUsRUFBRSxNQUFNLGNBQWMsQ0FBQztBQUNsQyxPQUFPLEVBQUUsSUFBSSxFQUFFLE1BQU0sU0FBUyxDQUFDO0FBQy9CLE9BQU8sRUFBRSxLQUFLLEVBQUUsTUFBTSxVQUFVLENBQUM7QUFDakMsT0FBTyxFQUFFLFFBQVEsRUFBRSxNQUFNLGFBQWEsQ0FBQztBQUN2QyxPQUFPLEVBQUUsU0FBUyxFQUFFLE1BQU0sZUFBZSxDQUFDO0FBQzFDLE9BQU8sRUFBRSxPQUFPLEVBQUUsTUFBTSxZQUFZLENBQUM7QUFDckMsT0FBTyxFQUFFLEdBQUcsRUFBRSxNQUFNLFFBQVEsQ0FBQztBQUM3QixPQUFPLEVBQUUsR0FBRyxFQUFFLE1BQU0sUUFBUSxDQUFDO0FBQzdCLE9BQU8sRUFBRSxHQUFHLEVBQUUsTUFBTSxRQUFRLENBQUM7QUFDN0IsT0FBTyxFQUFFLEdBQUcsRUFBRSxNQUFNLFFBQVEsQ0FBQztBQUM3QixPQUFPLEVBQUUsR0FBRyxFQUFFLE1BQU0sUUFBUSxDQUFDO0FBQzdCLE9BQU8sRUFBRSxLQUFLLEVBQUUsTUFBTSxVQUFVLENBQUM7QUFDakMsT0FBTyxFQUFFLEtBQUssRUFBRSxNQUFNLFVBQVUsQ0FBQztBQUNqQyxPQUFPLEVBQUUsSUFBSSxFQUFFLE1BQU0sU0FBUyxDQUFDO0FBQy9CLE9BQU8sRUFBQyxLQUFLLEVBQUMsTUFBTSxVQUFVLENBQUM7QUFDL0IsT0FBTyxFQUFFLEtBQUssRUFBRSxNQUFNLFVBQVUsQ0FBQztBQUNqQyxPQUFPLEVBQUUsTUFBTSxFQUFFLE1BQU0sV0FB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O1FBRXpELFVBQVUsR0FBRyxLQUFLLENBQUMsU0FBUyxFQUFFLFFBQVEsQ0FBQyxDQUFDLEtBQUssQ0FBQyxDQUFDLEVBQUUsVUFBVSxDQUFDLENBQUM7S0FFaEU7SUFDRCxPQUFPLFVBQVUsQ0FBQztBQUN0QixDQUFDO0FBRUQsTUFBTSxDQUFDLE1BQU0sU0FBUyxHQUFHLEVBQUUsQ0FBQyxFQUFFLFVBQVUsRUFBRSxDQUFDLENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyIvKipcbiAqIEBsaWNlbnNlXG4gKiBDb3B5cmlnaHQgMjAyMSBHb29nbGUgTExDLiBBbGwgUmlnaHRzIFJlc2VydmVkLlxuICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlIFwiTGljZW5zZVwiKTtcbiAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS5cbiAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdFxuICpcbiAqIGh0dHBzOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjBcbiAqXG4gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlXG4gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiBcIkFTIElTXCIgQkFTSVMsXG4gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC5cbiAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmRcbiAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLlxuICogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbiAqL1xuXG5pbXBvcnQgeyBUZW5zb3IxRCwgVGVuc29yM0QgfSBmcm9tICcuLi8uLi90ZW5zb3InO1xuaW1wb3J0IHsgdGVuc29yMWQgfSBmcm9tICcuLi90ZW5zb3IxZCc7XG5pbXBvcnQgeyBUZW5zb3JMaWtlIH0gZnJvbSAnLi4vLi4vdHlwZXMnO1xuaW1wb3J0IHsgb3AgfSBmcm9tICcuLi9vcGVyYXRpb24nO1xuaW1wb3J0IHsgY2FzdCB9IGZyb20gJy4uL2Nhc3QnO1xuaW1wb3J0IHsgc3BsaXQgfSBmcm9tICcuLi9zcGxpdCc7XG5pbXBvcnQgeyBiaW5jb3VudCB9IGZyb20gJy4uL2JpbmNvdW50JztcbmltcG9ydCB7IGxlc3NFcXVhbCB9IGZyb20gJy4uL2xlc3NfZXF1YWwnO1xuaW1wb3J0IHsgZ3JlYXRlciB9IGZyb20gJy4uL2dyZWF0ZXInO1xuaW1wb3J0IHsgc3VtIH0gZnJvbSAnLi4vc3VtJztcbmltcG9ydCB7IGFkZCB9IGZyb20gJy4uL2FkZCc7XG5pbXBvcnQgeyBtdWwgfSBmcm9tICcuLi9tdWwnO1xuaW1wb3J0IHsgZGl2IH0gZnJvbSAnLi4vZGl2JztcbmltcG9ydCB7IHN1YiB9IGZyb20gJy4uL3N1Yic7XG5pbXBvcnQgeyByb3VuZCB9IGZyb20gJy4uL3JvdW5kJztcbmltcG9ydCB7IHdoZXJlIH0gZnJvbSAnLi4vd2hlcmUnO1xuaW1wb3J0IHsgZmlsbCB9IGZyb20gJy4uL2ZpbGwnO1xuaW1wb3J0IHtzbGljZX0gZnJvbSAnLi4vc2xpY2UnO1xuaW1wb3J0IHsgcmFuZ2UgfSBmcm9tICcuLi9yYW5nZSc7XG5pbXBvcnQgeyB0ZW5zb3IgfSBmcm9tICcuLi90ZW5zb3InO1xuaW1wb3J0ICogYXMgdXRpbCBmcm9tICcuLi8uLi91dGlsJztcbmltcG9ydCB7IGNvbnZlcnRUb1RlbnNvciB9IGZyb20gJy4uLy4uL3RlbnNvcl91dGlsX2Vudic7XG5cbi8qKlxuICogUGVyZm9ybXMgaW1hZ2UgYmluYXJpemF0aW9uIHdpdGggY29ycmVzcG9uZGluZyB0aHJlc2hvbGRcbiAqIChkZXBlbmRzIG9uIHRoZSBtZXRob2QpdmFsdWUsIHdoaWNoIGNyZWF0ZXMgYSBiaW5hcnkgaW1hZ2UgZnJvbSBhIGdyYXlzY2FsZS5cbiAqIEBwYXJhbSBpbWFnZSAzZCB0ZW5zb3Igb2Ygc2hhcGUgW2ltYWdlSGVpZ2h0LGltYWdlV2lkdGgsIGRlcHRoXSxcbiAqIHdoZXJlIGltYWdlSGVpZ2h0IGFuZCBpbWFnZVdpZHRoIG11c3QgYmUgcG9zaXRpdmUuVGhlIGltYWdlIGNvbG9yXG4gKiByYW5nZSBzaG91bGQgYmUgWzAsIDI1NV0uXG4gKiBAcGFyYW0gbWV0aG9kIE9wdGlvbmFsIHN0cmluZyBmcm9tIGAnYmluYXJ5JyB8ICdvdHN1J2BcbiAqIHdoaWNoIHNwZWNpZmllcyB0aGUgbWV0aG9kIGZvciB0aHJlc2hvbGRpbmcuIERlZmF1bHRzIHRvICdiaW5hcnknLlxuICogQHBhcmFtIGludmVydGVkIE9wdGlvbmFsIGJvb2xlYW4gd2hpY2hzcGVjaWZpZXNcbiAqIGlmIGNvbG91cnMgc2hvdWxkIGJlIGludmVydGVkLiBEZWZhdWx0cyB0byBmYWxzZS5cbiAqIEBwYXJhbSB0aHJlc2hWYWx1ZSBPcHRpb25hbCBudW1iZXIgd2hpY2ggZGVmaW5lcyB0aHJlc2hvbGQgdmFsdWUgZnJvbSAwIHRvIDEuXG4gKiBEZWZhdWx0cyB0byAwLjUuXG4gKiBAcmV0dXJuIEEgM2QgdGVuc29yIG9mIHNoYXBlIFtpbWFnZUhlaWdodCxpbWFnZVdpZHRoLCBkZXB0aF0sIHdoaWNoXG4gKiBjb250YWlucyBiaW5hcml6ZWQgaW1hZ2UuXG4gKi9cblxuZnVuY3Rpb24gdGhyZXNob2xkXyhcbiAgICBpbWFnZTogVGVuc29yM0QgfCBUZW5zb3JMaWtlLFxuICAgIG1ldGhvZCA9ICdiaW5hcnknLFxuICAgIGludmVydGVkID0gZmFsc2UsXG4gICAgdGhyZXNoVmFsdWUgPSAwLjVcbik6IFRlbnNvcjNEIHtcbiAgICBjb25zdCAkaW1hZ2UgPSBjb252ZXJ0VG9UZW5zb3IoaW1hZ2UsICdpbWFnZScsICd0aHJlc2hvbGQnKTtcblxuICAgIC8qIDAuMjk4OSwgMC41ODcwLCAwLjExNDAgYXJlIHJlcHJlc2VudCBsdW1hIGNvZWZmaWNpZW50cyBpbiBDQ0lSNjAxLlxuXHRSZWZlcmVuY2UgZm9yIGNvbnZlcnRpbmcgYmV0d2VlbiBSR0IgYW5kIGdyYXlzY2FsZTogaHR0cHM6Ly9lbi53aWtpcGVkaWEub3JnL3dpa2kvTHVtYV8lMjh2aWRlbyUyOSAgKi9cblxuICAgIGNvbnN0IFJFRF9JTlRFTkNJVFlfQ09FRiA9IDAuMjk4OTtcbiAgICBjb25zdCBHUkVFTl9JTlRFTkNJVFlfQ09FRiA9IDAuNTg3MDtcbiAgICBjb25zdCBCTFVFX0lOVEVOQ0lUWV9DT0VGID0gMC4xMTQwO1xuICAgIGNvbnN0IHRvdGFsUGl4ZWxzSW5JbWFnZSA9ICRpbWFnZS5zaGFwZVswXSAqICRpbWFnZS5zaGFwZVsxXTtcblxuICAgIGxldCAkdGhyZXNob2xkID0gbXVsKHRlbnNvcjFkKFt0aHJlc2hWYWx1ZV0pLCAyNTUpO1xuICAgIGxldCByLCBnLCBiLCBncmF5c2NhbGU7XG5cbiAgICB1dGlsLmFzc2VydChcbiAgICAgICAgJGltYWdlLnJhbmsgPT09IDMsXG4gICAgICAgICgpID0+ICdFcnJvciBpbiB0aHJlc2hvbGQ6IGltYWdlIG11c3QgYmUgcmFuayAzLCcgK1xuICAgICAgICAgICAgYGJ1dCBnb3QgcmFuayAkeyRpbWFnZS5yYW5rfS5gKTtcblxuICAgIHV0aWwuYXNzZXJ0KFxuICAgICAgICAkaW1hZ2Uuc2hhcGVbMl0gPT09IDMgfHwgJGltYWdlLnNoYXBlWzJdPT09IDEsXG4gICAgICAgICgpID0+ICdFcnJvciBpbiB0aHJlc2hvbGQ6ICcgK1xuICAgICAgICAgICAgJ2ltYWdlIGNvbG9yIGNoYW5uZWwgbXVzdCBiZSBlcXVhbCB0byAzIG9yIDEnICtcbiAgICAgICAgICAgIGBidXQgZ290ICR7JGltYWdlLnNoYXBlWzJdfS5gKTtcblxuICAgIHV0aWwuYXNzZXJ0KFxuICAgICAgJGltYWdlLmR0eXBlID09PSAnaW50MzInIHx8ICRpbWFnZS5kdHlwZSA9PT0gJ2Zsb2F0MzInLFxuICAgICAgKCkgPT4gJ0Vycm9yIGluIGR0eXBlOiBpbWFnZSBkdHlwZSBtdXN0IGJlIGludDMyIG9yIGZsb2F0MzIsJyArXG4gICAgICAgICAgYGJ1dCBnb3QgZHR5cGUgJHskaW1hZ2UuZHR5cGV9LmApO1xuXG4gICAgdXRpbC5hc3NlcnQoXG4gICAgICBtZXRob2QgPT09ICdvdHN1JyB8fCBtZXRob2QgPT09ICdiaW5hcnknLFxuICAgICAgKCkgPT4gYE1ldGhvZCBtdXN0IGJlIGJpbmFyeSBvciBvdHN1LCBidXQgd2FzICR7bWV0aG9kfWApO1xuXG4gICAgaWYgKCRpbWFnZS5zaGFwZVsyXSA9PT0gMykge1xuICAgICAgICBbciwgZywgYl0gPSBzcGxpdCgkaW1hZ2UsIFsxLCAxLCAxXSwgLTEpO1xuICAgICAgICBjb25zdCAkciA9IG11bChyLFJFRF9JTlRFTkNJVFlfQ09FRik7XG4gICAgICAgIGNvbnN0ICRnID0gbXVsKGcsR1JFRU5fSU5URU5DSVRZX0NPRUYpO1xuICAgICAgICBjb25zdCAkYiA9IG11bChiLEJMVUVfSU5URU5DSVRZX0NPRUYpO1xuICAgICAgICBncmF5c2NhbGUgPSBhZGQoYWRkKCRyLCAkZyksICRiKTtcbiAgICB9IGVsc2Uge1xuICAgICAgICBncmF5c2NhbGUgPSBpbWFnZTtcbiAgICB9XG5cbiAgICBpZiAobWV0aG9kID09PSAnb3RzdScpIHtcbiAgICAgICAgY29uc3QgJGhpc3RvZ3JhbSA9IGJpbmNvdW50KGNhc3Qocm91bmQoZ3JheXNjYWxlKSwgJ2ludDMyJykgYXMgVGVuc29yMUQsXG4gICAgICAgICAgICB0ZW5zb3IoW10pLFxuICAgICAgICAgICAgMjU2KTtcbiAgICAgICAgJHRocmVzaG9sZCA9IG90c3UoJGhpc3RvZ3JhbSwgdG90YWxQaXhlbHNJbkltYWdlKTtcbiAgICB9XG5cbiAgICBjb25zdCBpbnZDb25kaXRpb24gPSBpbnZlcnRlZCA/XG4gICAgICAgIGxlc3NFcXVhbChncmF5c2NhbGUsICR0aHJlc2hvbGQpIDogZ3JlYXRlcihncmF5c2NhbGUsICR0aHJlc2hvbGQpO1xuXG4gICAgY29uc3QgcmVzdWx0ID0gY2FzdChtdWwoaW52Q29uZGl0aW9uLDI1NSksICdpbnQzMicpO1xuXG4gICAgcmV0dXJuIHJlc3VsdCBhcyBUZW5zb3IzRDtcbn1cblxuZnVuY3Rpb24gb3RzdShoaXN0b2dyYW06IFRlbnNvcjFELCB0b3RhbDogbnVtYmVyKTpUZW5zb3IxRCB7XG5cbiAgICBsZXQgYmVzdFRocmVzaCA9IHRlbnNvcjFkKFstMV0pO1xuICAgIGxldCBiZXN0SW5CZXRWYXIgPSB0ZW5zb3IxZChbMF0pO1xuICAgIGxldCBjSW5CZXRWYXIgPSB0ZW5zb3IxZChbMF0pO1xuICAgIGxldCBjbGFzc0ZpcnN0LCBjbGFzc1NlY29uZCwgbWVhbkZpcnN0LFxuICAgICAgICBtZWFuU2VjLCB3ZWlnaHRGb3JlZ3JvdW5kLCB3ZWlnaHRCYWNrO1xuXG4gICAgZm9yIChsZXQgaW5kZXggPSAwOyBpbmRleCA8IGhpc3RvZ3JhbS5zaXplLTE7IGluZGV4KyspIHtcblxuICAgICAgICBjbGFzc0ZpcnN0ID0gc2xpY2UoaGlzdG9ncmFtLCAwLCBpbmRleCArIDEpO1xuXG4gICAgICAgIGNsYXNzU2Vjb25kID0gc2xpY2UoaGlzdG9ncmFtLGluZGV4ICsgMSk7XG5cbiAgICAgICAgd2VpZ2h0Rm9yZWdyb3VuZCA9IGRpdihzdW0oY2xhc3NGaXJzdCksdG90YWwpO1xuXG4gICAgICAgIHdlaWdodEJhY2sgPSBkaXYoc3VtKGNsYXNzU2Vjb25kKSx0b3RhbCk7XG5cbiAgICAgICAgY29uc3QgbWVhbkZpcnN0RGl2QSA9IHN1bShtdWwoY2xhc3NGaXJzdCwgcmFuZ2UoMCwgY2xhc3NGaXJzdC5zaXplKSkpO1xuXG4gICAgICAgIG1lYW5GaXJzdCA9IGRpdihtZWFuRmlyc3REaXZBLCBzdW0oY2xhc3NGaXJzdCkgKTtcblxuICAgICAgICBjb25zdCBtZWFuU2VjRmlsbCA9IGZpbGwoY2xhc3NTZWNvbmQuc2hhcGUsIGNsYXNzRmlyc3Quc2l6ZSk7XG4gICAgICAgIGNvbnN0IG1lYW5TZWNBZGQgPSBhZGQocmFuZ2UoMCxjbGFzc1NlY29uZC5zaXplKSxtZWFuU2VjRmlsbCk7XG4gICAgICAgIGNvbnN0IG1lYW5TZWNNdWwgPSBtdWwoY2xhc3NTZWNvbmQsIChtZWFuU2VjQWRkKSk7XG4gICAgICAgIG1lYW5TZWMgPSBkaXYoc3VtKG1lYW5TZWNNdWwpLCBzdW0oY2xhc3NTZWNvbmQpKTtcblxuICAgICAgICBjb25zdCBjSW5CZXRWYXJTdWJBID0gc3ViKG1lYW5GaXJzdCwgbWVhblNlYyk7XG4gICAgICAgIGNvbnN0IGNJbkJldFZhclN1YkIgPSBzdWIobWVhbkZpcnN0LCBtZWFuU2VjKTtcbiAgICAgICAgY29uc3QgY0luQmV0VmFyTXVsID0gbXVsKHdlaWdodEZvcmVncm91bmQsIHdlaWdodEJhY2spO1xuICAgICAgICBjSW5CZXRWYXIgPSBtdWwobXVsKGNJbkJldFZhck11bCxjSW5CZXRWYXJTdWJBKSwgY0luQmV0VmFyU3ViQik7XG5cbiAgICAgICAgY29uc3QgY29uZGl0aW9uID0gZ3JlYXRlcihjSW5CZXRWYXIsIGJlc3RJbkJldFZhcik7XG5cbiAgICAgICAgYmVzdEluQmV0VmFyID0gd2hlcmUoY29uZGl0aW9uLCBjSW5CZXRWYXIsIGJlc3RJbkJldFZhcik7XG5cbiAgICAgICAgYmVzdFRocmVzaCA9IHdoZXJlKGNvbmRpdGlvbiwgdGVuc29yMWQoW2luZGV4XSksIGJlc3RUaHJlc2gpO1xuXG4gICAgfVxuICAgIHJldHVybiBiZXN0VGhyZXNoO1xufVxuXG5leHBvcnQgY29uc3QgdGhyZXNob2xkID0gb3AoeyB0aHJlc2hvbGRfIH0pO1xuIl19","/**\n * @license\n * Copyright 2021 Google LLC. All Rights Reserved.\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n * =============================================================================\n */\nimport { ENGINE } from '../../engine';\nimport { Transform } from '../../kernel_names';\nimport { convertToTensor } from '../../tensor_util_env';\nimport * as util from '../../util';\nimport { op } from '../operation';\n/**\n * Applies the given transform(s) to the image(s).\n *\n * @param image 4d tensor of shape `[batch, imageHeight, imageWidth, depth]`.\n * @param transforms Projective transform matrix/matrices. A tensor1d of length\n * 8 or tensor of size N x 8. If one row of transforms is [a0, a1, a2, b0,\n * b1, b2, c0, c1], then it maps the output point (x, y) to a transformed\n * input point (x', y') = ((a0 x + a1 y + a2) / k, (b0 x + b1 y + b2) / k),\n * where k = c0 x + c1 y + 1. The transforms are inverted compared to the\n * transform mapping input points to output points.\n * @param interpolation Interpolation mode.\n * Supported values: 'nearest', 'bilinear'. Default to 'nearest'.\n * @param fillMode Points outside the boundaries of the input are filled\n * according to the given mode, one of 'constant', 'reflect', 'wrap',\n * 'nearest'. Default to 'constant'.\n * 'reflect': (d c b a | a b c d | d c b a ) The input is extended by\n * reflecting about the edge of the last pixel.\n * 'constant': (k k k k | a b c d | k k k k) The input is extended by\n * filling all values beyond the edge with the same constant value k.\n * 'wrap': (a b c d | a b c d | a b c d) The input is extended by\n * wrapping around to the opposite edge.\n * 'nearest': (a a a a | a b c d | d d d d) The input is extended by\n * the nearest pixel.\n * @param fillValue A float represents the value to be filled outside the\n * boundaries when fillMode is 'constant'.\n * @param Output dimension after the transform, [height, width]. If undefined,\n * output is the same size as input image.\n *\n * @doc {heading: 'Operations', subheading: 'Images', namespace: 'image'}\n */\nfunction transform_(image, transforms, interpolation = 'nearest', fillMode = 'constant', fillValue = 0, outputShape) {\n const $image = convertToTensor(image, 'image', 'transform', 'float32');\n const $transforms = convertToTensor(transforms, 'transforms', 'transform', 'float32');\n util.assert($image.rank === 4, () => 'Error in transform: image must be rank 4,' +\n `but got rank ${$image.rank}.`);\n util.assert($transforms.rank === 2 &&\n ($transforms.shape[0] === $image.shape[0] ||\n $transforms.shape[0] === 1) &&\n $transforms.shape[1] === 8, () => `Error in transform: Input transform should be batch x 8 or 1 x 8`);\n util.assert(outputShape == null || outputShape.length === 2, () => 'Error in transform: outputShape must be [height, width] or null, ' +\n `but got ${outputShape}.`);\n const inputs = { image: $image, transforms: $transforms };\n const attrs = { interpolation, fillMode, fillValue, outputShape };\n return ENGINE.runKernel(Transform, inputs, attrs);\n}\nexport const transform = op({ transform_ });\n//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidHJhbnNmb3JtLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vLi4vLi4vdGZqcy1jb3JlL3NyYy9vcHMvaW1hZ2UvdHJhbnNmb3JtLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBOzs7Ozs7Ozs7Ozs7Ozs7R0FlRztBQUNILE9BQU8sRUFBQyxNQUFNLEVBQUMsTUFBTSxjQUFjLENBQUM7QUFDcEMsT0FBTyxFQUFDLFNBQVMsRUFBa0MsTUFBTSxvQkFBb0IsQ0FBQztBQUk5RSxPQUFPLEVBQUMsZUFBZSxFQUFDLE1BQU0sdUJBQXVCLENBQUM7QUFFdEQsT0FBTyxLQUFLLElBQUksTUFBTSxZQUFZLENBQUM7QUFFbkMsT0FBTyxFQUFDLEVBQUUsRUFBQyxNQUFNLGNBQWMsQ0FBQztBQUVoQzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7R0E2Qkc7QUFDSCxTQUFTLFVBQVUsQ0FDZixLQUEwQixFQUFFLFVBQStCLEVBQzNELGdCQUFzQyxTQUFTLEVBQy9DLFdBQWtELFVBQVUsRUFBRSxTQUFTLEdBQUcsQ0FBQyxFQUMzRSxXQUE4QjtJQUNoQyxNQUFNLE1BQU0sR0FBRyxlQUFlLENBQUMsS0FBSyxFQUFFLE9BQU8sRUFBRSxXQUFXLEVBQUUsU0FBUyxDQUFDLENBQUM7SUFDdkUsTUFBTSxXQUFXLEdBQ2IsZUFBZSxDQUFDLFVBQVUsRUFBRSxZQUFZLEVBQUUsV0FBVyxFQUFFLFNBQVMsQ0FBQyxDQUFDO0lBRXRFLElBQUksQ0FBQyxNQUFNLENBQ1AsTUFBTSxDQUFDLElBQUksS0FBSyxDQUFDLEVBQ2pCLEdBQUcsRUFBRSxDQUFDLDJDQUEyQztRQUM3QyxnQkFBZ0IsTUFBTSxDQUFDLElBQUksR0FBRyxDQUFDLENBQUM7SUFFeEMsSUFBSSxDQUFDLE1BQU0sQ0FDUCxXQUFXLENBQUMsSUFBSSxLQUFLLENBQUM7UUFDbEIsQ0FBQyxXQUFXLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQyxLQUFLLE1BQU0sQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDO1lBQ3hDLFdBQVcsQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDLEtBQUssQ0FBQyxDQUFDO1FBQzVCLFdBQVcsQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDLEtBQUssQ0FBQyxFQUM5QixHQUFHLEVBQUUsQ0FBQyxrRUFBa0UsQ0FBQyxDQUFDO0lBRTlFLElBQUksQ0FBQyxNQUFNLENBQ1AsV0FBVyxJQUFJLElBQUksSUFBSSxXQUFXLENBQUMsTUFBTSxLQUFLLENBQUMsRUFDL0MsR0FBRyxFQUFFLENBQ0QsbUVBQW1FO1FBQ25FLFdBQVcsV0FBVyxHQUFHLENBQUMsQ0FBQztJQUVuQyxNQUFNLE1BQU0sR0FBb0IsRUFBQyxLQUFLLEVBQUUsTUFBTSxFQUFFLFVBQVUsRUFBRSxXQUFXLEVBQUMsQ0FBQztJQUN6RSxNQUFNLEtBQUssR0FDVSxFQUFDLGFBQWEsRUFBRSxRQUFRLEVBQUUsU0FBUyxFQUFFLFdBQVcsRUFBQyxDQUFDO0lBRXZFLE9BQU8sTUFBTSxDQUFDLFNBQVMsQ0FDbkIsU0FBUyxFQUFFLE1BQThCLEVBQUUsS0FBMkIsQ0FBQyxDQUFDO0FBQzlFLENBQUM7QUFFRCxNQUFNLENBQUMsTUFBTSxTQUFTLEdBQUcsRUFBRSxDQUFDLEVBQUMsVUFBVSxFQUFDLENBQUMsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbIi8qKlxuICogQGxpY2Vuc2VcbiAqIENvcHlyaWdodCAyMDIxIEdvb2dsZSBMTEMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuXG4gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgXCJMaWNlbnNlXCIpO1xuICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLlxuICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0XG4gKlxuICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wXG4gKlxuICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZVxuICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gXCJBUyBJU1wiIEJBU0lTLFxuICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuXG4gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kXG4gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS5cbiAqID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4gKi9cbmltcG9ydCB7RU5HSU5FfSBmcm9tICcuLi8uLi9lbmdpbmUnO1xuaW1wb3J0IHtUcmFuc2Zvcm0sIFRyYW5zZm9ybUF0dHJzLCBUcmFuc2Zvcm1JbnB1dHN9IGZyb20gJy4uLy4uL2tlcm5lbF9uYW1lcyc7XG5pbXBvcnQge05hbWVkQXR0ck1hcH0gZnJvbSAnLi4vLi4va2VybmVsX3JlZ2lzdHJ5JztcbmltcG9ydCB7VGVuc29yMkQsIFRlbnNvcjREfSBmcm9tICcuLi8uLi90ZW5zb3InO1xuaW1wb3J0IHtOYW1lZFRlbnNvck1hcH0gZnJvbSAnLi4vLi4vdGVuc29yX3R5cGVzJztcbmltcG9ydCB7Y29udmVydFRvVGVuc29yfSBmcm9tICcuLi8uLi90ZW5zb3JfdXRpbF9lbnYnO1xuaW1wb3J0IHtUZW5zb3JMaWtlfSBmcm9tICcuLi8uLi90eXBlcyc7XG5pbXBvcnQgKiBhcyB1dGlsIGZyb20gJy4uLy4uL3V0aWwnO1xuXG5pbXBvcnQge29wfSBmcm9tICcuLi9vcGVyYXRpb24nO1xuXG4vKipcbiAqIEFwcGxpZXMgdGhlIGdpdmVuIHRyYW5zZm9ybShzKSB0byB0aGUgaW1hZ2UocykuXG4gKlxuICogQHBhcmFtIGltYWdlIDRkIHRlbnNvciBvZiBzaGFwZSBgW2JhdGNoLCBpbWFnZUhlaWdodCwgaW1hZ2VXaWR0aCwgZGVwdGhdYC5cbiAqIEBwYXJhbSB0cmFuc2Zvcm1zIFByb2plY3RpdmUgdHJhbnNmb3JtIG1hdHJpeC9tYXRyaWNlcy4gQSB0ZW5zb3IxZCBvZiBsZW5ndGhcbiAqICAgICA4IG9yIHRlbnNvciBvZiBzaXplIE4geCA4LiBJZiBvbmUgcm93IG9mIHRyYW5zZm9ybXMgaXMgW2EwLCBhMSwgYTIsIGIwLFxuICogICAgIGIxLCBiMiwgYzAsIGMxXSwgdGhlbiBpdCBtYXBzIHRoZSBvdXRwdXQgcG9pbnQgKHgsIHkpIHRvIGEgdHJhbnNmb3JtZWRcbiAqICAgICBpbnB1dCBwb2ludCAoeCcsIHknKSA9ICgoYTAgeCArIGExIHkgKyBhMikgLyBrLCAoYjAgeCArIGIxIHkgKyBiMikgLyBrKSxcbiAqICAgICB3aGVyZSBrID0gYzAgeCArIGMxIHkgKyAxLiBUaGUgdHJhbnNmb3JtcyBhcmUgaW52ZXJ0ZWQgY29tcGFyZWQgdG8gdGhlXG4gKiAgICAgdHJhbnNmb3JtIG1hcHBpbmcgaW5wdXQgcG9pbnRzIHRvIG91dHB1dCBwb2ludHMuXG4gKiBAcGFyYW0gaW50ZXJwb2xhdGlvbiBJbnRlcnBvbGF0aW9uIG1vZGUuXG4gKiAgICAgU3VwcG9ydGVkIHZhbHVlczogJ25lYXJlc3QnLCAnYmlsaW5lYXInLiBEZWZhdWx0IHRvICduZWFyZXN0Jy5cbiAqIEBwYXJhbSBmaWxsTW9kZSBQb2ludHMgb3V0c2lkZSB0aGUgYm91bmRhcmllcyBvZiB0aGUgaW5wdXQgYXJlIGZpbGxlZFxuICogICAgIGFjY29yZGluZyB0byB0aGUgZ2l2ZW4gbW9kZSwgb25lIG9mICdjb25zdGFudCcsICdyZWZsZWN0JywgJ3dyYXAnLFxuICogICAgICduZWFyZXN0Jy4gRGVmYXVsdCB0byAnY29uc3RhbnQnLlxuICogICAgICdyZWZsZWN0JzogKGQgYyBiIGEgfCBhIGIgYyBkIHwgZCBjIGIgYSApIFRoZSBpbnB1dCBpcyBleHRlbmRlZCBieVxuICogICAgIHJlZmxlY3RpbmcgYWJvdXQgdGhlIGVkZ2Ugb2YgdGhlIGxhc3QgcGl4ZWwuXG4gKiAgICAgJ2NvbnN0YW50JzogKGsgayBrIGsgfCBhIGIgYyBkIHwgayBrIGsgaykgVGhlIGlucHV0IGlzIGV4dGVuZGVkIGJ5XG4gKiAgICAgZmlsbGluZyBhbGwgdmFsdWVzIGJleW9uZCB0aGUgZWRnZSB3aXRoIHRoZSBzYW1lIGNvbnN0YW50IHZhbHVlIGsuXG4gKiAgICAgJ3dyYXAnOiAoYSBiIGMgZCB8IGEgYiBjIGQgfCBhIGIgYyBkKSBUaGUgaW5wdXQgaXMgZXh0ZW5kZWQgYnlcbiAqICAgICB3cmFwcGluZyBhcm91bmQgdG8gdGhlIG9wcG9zaXRlIGVkZ2UuXG4gKiAgICAgJ25lYXJlc3QnOiAoYSBhIGEgYSB8IGEgYiBjIGQgfCBkIGQgZCBkKSBUaGUgaW5wdXQgaXMgZXh0ZW5kZWQgYnlcbiAqICAgICB0aGUgbmVhcmVzdCBwaXhlbC5cbiAqIEBwYXJhbSBmaWxsVmFsdWUgQSBmbG9hdCByZXByZXNlbnRzIHRoZSB2YWx1ZSB0byBiZSBmaWxsZWQgb3V0c2lkZSB0aGVcbiAqICAgICBib3VuZGFyaWVzIHdoZW4gZmlsbE1vZGUgaXMgJ2NvbnN0YW50Jy5cbiAqIEBwYXJhbSBPdXRwdXQgZGltZW5zaW9uIGFmdGVyIHRoZSB0cmFuc2Zvcm0sIFtoZWlnaHQsIHdpZHRoXS4gSWYgdW5kZWZpbmVkLFxuICogICAgIG91dHB1dCBpcyB0aGUgc2FtZSBzaXplIGFzIGlucHV0IGltYWdlLlxuICpcbiAqIEBkb2Mge2hlYWRpbmc6ICdPcGVyYXRpb25zJywgc3ViaGVhZGluZzogJ0ltYWdlcycsIG5hbWVzcGFjZTogJ2ltYWdlJ31cbiAqL1xuZnVuY3Rpb24gdHJhbnNmb3JtXyhcbiAgICBpbWFnZTogVGVuc29yNER8VGVuc29yTGlrZSwgdHJhbnNmb3JtczogVGVuc29yMkR8VGVuc29yTGlrZSxcbiAgICBpbnRlcnBvbGF0aW9uOiAnbmVhcmVzdCd8J2JpbGluZWFyJyA9ICduZWFyZXN0JyxcbiAgICBmaWxsTW9kZTogJ2NvbnN0YW50J3wncmVmbGVjdCd8J3dyYXAnfCduZWFyZXN0JyA9ICdjb25zdGFudCcsIGZpbGxWYWx1ZSA9IDAsXG4gICAgb3V0cHV0U2hhcGU/OiBbbnVtYmVyLCBudW1iZXJdKTogVGVuc29yNEQge1xuICBjb25zdCAkaW1hZ2UgPSBjb252ZXJ0VG9UZW5zb3IoaW1hZ2UsICdpbWFnZScsICd0cmFuc2Zvcm0nLCAnZmxvYXQzMicpO1xuICBjb25zdCAkdHJhbnNmb3JtcyA9XG4gICAgICBjb252ZXJ0VG9UZW5zb3IodHJhbnNmb3JtcywgJ3RyYW5zZm9ybXMnLCAndHJhbnNmb3JtJywgJ2Zsb2F0MzInKTtcblxuICB1dGlsLmFzc2VydChcbiAgICAgICRpbWFnZS5yYW5rID09PSA0LFxuICAgICAgKCkgPT4gJ0Vycm9yIGluIHRyYW5zZm9ybTogaW1hZ2UgbXVzdCBiZSByYW5rIDQsJyArXG4gICAgICAgICAgYGJ1dCBnb3QgcmFuayAkeyRpbWFnZS5yYW5rfS5gKTtcblxuICB1dGlsLmFzc2VydChcbiAgICAgICR0cmFuc2Zvcm1zLnJhbmsgPT09IDIgJiZcbiAgICAgICAgICAoJHRyYW5zZm9ybXMuc2hhcGVbMF0gPT09ICRpbWFnZS5zaGFwZVswXSB8fFxuICAgICAgICAgICAkdHJhbnNmb3Jtcy5zaGFwZVswXSA9PT0gMSkgJiZcbiAgICAgICAgICAkdHJhbnNmb3Jtcy5zaGFwZVsxXSA9PT0gOCxcbiAgICAgICgpID0+IGBFcnJvciBpbiB0cmFuc2Zvcm06IElucHV0IHRyYW5zZm9ybSBzaG91bGQgYmUgYmF0Y2ggeCA4IG9yIDEgeCA4YCk7XG5cbiAgdXRpbC5hc3NlcnQoXG4gICAgICBvdXRwdXRTaGFwZSA9PSBudWxsIHx8IG91dHB1dFNoYXBlLmxlbmd0aCA9PT0gMixcbiAgICAgICgpID0+XG4gICAgICAgICAgJ0Vycm9yIGluIHRyYW5zZm9ybTogb3V0cHV0U2hhcGUgbXVzdCBiZSBbaGVpZ2h0LCB3aWR0aF0gb3IgbnVsbCwgJyArXG4gICAgICAgICAgYGJ1dCBnb3QgJHtvdXRwdXRTaGFwZX0uYCk7XG5cbiAgY29uc3QgaW5wdXRzOiBUcmFuc2Zvcm1JbnB1dHMgPSB7aW1hZ2U6ICRpbWFnZSwgdHJhbnNmb3JtczogJHRyYW5zZm9ybXN9O1xuICBjb25zdCBhdHRyczpcbiAgICAgIFRyYW5zZm9ybUF0dHJzID0ge2ludGVycG9sYXRpb24sIGZpbGxNb2RlLCBmaWxsVmFsdWUsIG91dHB1dFNoYXBlfTtcblxuICByZXR1cm4gRU5HSU5FLnJ1bktlcm5lbChcbiAgICAgIFRyYW5zZm9ybSwgaW5wdXRzIGFzIHt9IGFzIE5hbWVkVGVuc29yTWFwLCBhdHRycyBhcyB7fSBhcyBOYW1lZEF0dHJNYXApO1xufVxuXG5leHBvcnQgY29uc3QgdHJhbnNmb3JtID0gb3Aoe3RyYW5zZm9ybV99KTtcbiJdfQ==","/**\n * @license\n * Copyright 2020 Google LLC. All Rights Reserved.\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n * =============================================================================\n */\nimport { convertToTensor } from '../../tensor_util_env';\nimport { assert } from '../../util';\nimport { greaterEqual } from '../greater_equal';\nimport { lessEqual } from '../less_equal';\nimport { logicalAnd } from '../logical_and';\nimport { op } from '../operation';\nimport { range } from '../range';\nimport { reshape } from '../reshape';\nimport { scalar } from '../scalar';\nimport { stack } from '../stack';\nimport { sub } from '../sub';\nimport { unstack } from '../unstack';\nimport { where } from '../where';\nimport { zeros } from '../zeros';\n/**\n * Copy a tensor setting everything outside a central band in each innermost\n * matrix to zero.\n *\n * The band part is computed as follows: Assume input has `k` dimensions\n * `[I, J, K, ..., M, N]`, then the output is a tensor with the same shape where\n * `band[i, j, k, ..., m, n] = in_band(m, n) * input[i, j, k, ..., m, n]`.\n * The indicator function\n * `in_band(m, n) = (num_lower < 0 || (m-n) <= num_lower)`\n * `&& (num_upper < 0 || (n-m) <= num_upper)`\n *\n * ```js\n * const x = tf.tensor2d([[ 0, 1, 2, 3],\n * [-1, 0, 1, 2],\n * [-2, -1, 0, 1],\n * [-3, -2, -1, 0]]);\n * let y = tf.linalg.bandPart(x, 1, -1);\n * y.print(); // [[ 0, 1, 2, 3],\n * // [-1, 0, 1, 2],\n * // [ 0, -1, 0, 1],\n * // [ 0, 0 , -1, 0]]\n * let z = tf.linalg.bandPart(x, 2, 1);\n * z.print(); // [[ 0, 1, 0, 0],\n * // [-1, 0, 1, 0],\n * // [-2, -1, 0, 1],\n * // [ 0, -2, -1, 0]]\n * ```\n *\n * @param x Rank `k` tensor\n * @param numLower Number of subdiagonals to keep.\n * If negative, keep entire lower triangle.\n * @param numUpper Number of subdiagonals to keep.\n * If negative, keep entire upper triangle.\n * @returns Rank `k` tensor of the same shape as input.\n * The extracted banded tensor.\n *\n * @doc {heading:'Operations', subheading:'Linear Algebra', namespace:'linalg'}\n */\nfunction bandPart_(a, numLower, numUpper) {\n assert(numLower % 1 === 0, () => `bandPart(): numLower must be an integer, got ${numLower}.`);\n assert(numUpper % 1 === 0, () => `bandPart(): numUpper must be an integer, got ${numUpper}.`);\n const $a = convertToTensor(a, 'a', 'bandPart');\n assert($a.rank >= 2, () => `bandPart(): Rank must be at least 2, got ${$a.rank}.`);\n const shape = $a.shape;\n const [M, N] = $a.shape.slice(-2);\n if (!(numLower <= M)) {\n throw new Error(`bandPart(): numLower (${numLower})` +\n ` must not be greater than the number of rows (${M}).`);\n }\n if (!(numUpper <= N)) {\n throw new Error(`bandPart(): numUpper (${numUpper})` +\n ` must not be greater than the number of columns (${N}).`);\n }\n if (numLower < 0) {\n numLower = M;\n }\n if (numUpper < 0) {\n numUpper = N;\n }\n const i = reshape(range(0, M, 1, 'int32'), [-1, 1]);\n const j = range(0, N, 1, 'int32');\n const ij = sub(i, j);\n const inBand = logicalAnd(lessEqual(ij, scalar(+numLower, 'int32')), greaterEqual(ij, scalar(-numUpper, 'int32')));\n const zero = zeros([M, N], $a.dtype);\n return reshape(stack(unstack(reshape($a, [-1, M, N]))\n .map(mat => where(inBand, mat, zero))), shape);\n}\nexport const bandPart = op({ bandPart_ });\n//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYmFuZF9wYXJ0LmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vLi4vLi4vdGZqcy1jb3JlL3NyYy9vcHMvbGluYWxnL2JhbmRfcGFydC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQTs7Ozs7Ozs7Ozs7Ozs7O0dBZUc7QUFHSCxPQUFPLEVBQUMsZUFBZSxFQUFDLE1BQU0sdUJBQXVCLENBQUM7QUFFdEQsT0FBTyxFQUFDLE1BQU0sRUFBQyxNQUFNLFlBQVksQ0FBQztBQUVsQyxPQUFPLEVBQUMsWUFBWSxFQUFDLE1BQU0sa0JBQWtCLENBQUM7QUFDOUMsT0FBTyxFQUFDLFNBQVMsRUFBQyxNQUFNLGVBQWUsQ0FBQztBQUN4QyxPQUFPLEVBQUMsVUFBVSxFQUFDLE1BQU0sZ0JBQWdCLENBQUM7QUFDMUMsT0FBTyxFQUFDLEVBQUUsRUFBQyxNQUFNLGNBQWMsQ0FBQztBQUNoQyxPQUFPLEVBQUMsS0FBSyxFQUFDLE1BQU0sVUFBVSxDQUFDO0FBQy9CLE9BQU8sRUFBQyxPQUFPLEVBQUMsTUFBTSxZQUFZLENBQUM7QUFDbkMsT0FBTyxFQUFDLE1BQU0sRUFBQyxNQUFNLFdBQVcsQ0FBQztBQUNqQyxPQUFPLEVBQUMsS0FBSyxFQUFDLE1BQU0sVUFBVSxDQUFDO0FBQy9CLE9BQU8sRUFBQyxHQUFHLEVBQUMsTUFBTSxRQUFRLENBQUM7QUFDM0IsT0FBTyxFQUFDLE9BQU8sRUFBQyxNQUFNLFlBQVksQ0FBQztBQUNuQyxPQUFPLEVBQUMsS0FBSyxFQUFDLE1BQU0sVUFBVSxDQUFDO0FBQy9CLE9BQU8sRUFBQyxLQUFLLEVBQUMsTUFBTSxVQUFVLENBQUM7QUFFL0I7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7R0FxQ0c7QUFDSCxTQUFTLFNBQVMsQ0FDZCxDQUFlLEVBQUUsUUFBZ0IsRUFBRSxRQUFnQjtJQUNyRCxNQUFNLENBQ0YsUUFBUSxHQUFHLENBQUMsS0FBSyxDQUFDLEVBQ2xCLEdBQUcsRUFBRSxDQUFDLGdEQUFnRCxRQUFRLEdBQUcsQ0FBQyxDQUFDO0lBQ3ZFLE1BQU0sQ0FDRixRQUFRLEdBQUcsQ0FBQyxLQUFLLENBQUMsRUFDbEIsR0FBRyxFQUFFLENBQUMsZ0RBQWdELFFBQVEsR0FBRyxDQUFDLENBQUM7SUFFdkUsTUFBTSxFQUFFLEdBQUcsZUFBZSxDQUFDLENBQUMsRUFBRSxHQUFHLEVBQUUsVUFBVSxDQUFDLENBQUM7SUFFL0MsTUFBTSxDQUNGLEVBQUUsQ0FBQyxJQUFJLElBQUksQ0FBQyxFQUNaLEdBQUcsRUFBRSxDQUFDLDRDQUE0QyxFQUFFLENBQUMsSUFBSSxHQUFHLENBQUMsQ0FBQztJQUVsRSxNQUFNLEtBQUssR0FBRyxFQUFFLENBQUMsS0FBSyxDQUFDO0lBQ3ZCLE1BQU0sQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLEdBQUcsRUFBRSxDQUFDLEtBQUssQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQztJQUVsQyxJQUFJLENBQUMsQ0FBQyxRQUFRLElBQUksQ0FBQyxDQUFDLEVBQUU7UUFDcEIsTUFBTSxJQUFJLEtBQUssQ0FDWCx5QkFBeUIsUUFBUSxHQUFHO1lBQ3BDLGlEQUFpRCxDQUFDLElBQUksQ0FBQyxDQUFDO0tBQzdEO0lBQ0QsSUFBSSxDQUFDLENBQUMsUUFBUSxJQUFJLENBQUMsQ0FBQyxFQUFFO1FBQ3BCLE1BQU0sSUFBSSxLQUFLLENBQ1gseUJBQXlCLFFBQVEsR0FBRztZQUNwQyxvREFBb0QsQ0FBQyxJQUFJLENBQUMsQ0FBQztLQUNoRTtJQUVELElBQUksUUFBUSxHQUFHLENBQUMsRUFBRTtRQUNoQixRQUFRLEdBQUcsQ0FBQyxDQUFDO0tBQ2Q7SUFDRCxJQUFJLFFBQVEsR0FBRyxDQUFDLEVBQUU7UUFDaEIsUUFBUSxHQUFHLENBQUMsQ0FBQztLQUNkO0lBRUQsTUFBTSxDQUFDLEdBQUcsT0FBTyxDQUFDLEtBQUssQ0FBQyxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxPQUFPLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUM7SUFDcEQsTUFBTSxDQUFDLEdBQUcsS0FBSyxDQUFDLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLE9BQU8sQ0FBQyxDQUFDO0lBQ2xDLE1BQU0sRUFBRSxHQUFHLEdBQUcsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUM7SUFFckIsTUFBTSxNQUFNLEdBQUcsVUFBVSxDQUNyQixTQUFTLENBQUMsRUFBRSxFQUFFLE1BQU0sQ0FBQyxDQUFDLFFBQVEsRUFBRSxPQUFPLENBQUMsQ0FBQyxFQUN6QyxZQUFZLENBQUMsRUFBRSxFQUFFLE1BQU0sQ0FBQyxDQUFDLFFBQVEsRUFBRSxPQUFPLENBQUMsQ0FBQyxDQUFDLENBQUM7SUFFbEQsTUFBTSxJQUFJLEdBQUcsS0FBSyxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxFQUFFLEVBQUUsQ0FBQyxLQUFLLENBQUMsQ0FBQztJQUVyQyxPQUFPLE9BQU8sQ0FDSCxLQUFLLENBQUMsT0FBTyxDQUFDLE9BQU8sQ0FBQyxFQUFFLEVBQUUsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsQ0FBQztTQUMzQixHQUFHLENBQUMsR0FBRyxDQUFDLEVBQUUsQ0FBQyxLQUFLLENBQUMsTUFBTSxFQUFFLEdBQUcsRUFBRSxJQUFJLENBQUMsQ0FBQyxDQUFDLEVBQ2hELEtBQUssQ0FBTSxDQUFDO0FBQ3pCLENBQUM7QUFFRCxNQUFNLENBQUMsTUFBTSxRQUFRLEdBQUcsRUFBRSxDQUFDLEVBQUMsU0FBUyxFQUFDLENBQUMsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbIi8qKlxuICogQGxpY2Vuc2VcbiAqIENvcHlyaWdodCAyMDIwIEdvb2dsZSBMTEMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuXG4gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgXCJMaWNlbnNlXCIpO1xuICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLlxuICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0XG4gKlxuICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wXG4gKlxuICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZVxuICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gXCJBUyBJU1wiIEJBU0lTLFxuICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuXG4gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kXG4gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS5cbiAqID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4gKi9cblxuaW1wb3J0IHtUZW5zb3J9IGZyb20gJy4uLy4uL3RlbnNvcic7XG5pbXBvcnQge2NvbnZlcnRUb1RlbnNvcn0gZnJvbSAnLi4vLi4vdGVuc29yX3V0aWxfZW52JztcbmltcG9ydCB7VGVuc29yTGlrZX0gZnJvbSAnLi4vLi4vdHlwZXMnO1xuaW1wb3J0IHthc3NlcnR9IGZyb20gJy4uLy4uL3V0aWwnO1xuXG5pbXBvcnQge2dyZWF0ZXJFcXVhbH0gZnJvbSAnLi4vZ3JlYXRlcl9lcXVhbCc7XG5pbXBvcnQge2xlc3NFcXVhbH0gZnJvbSAnLi4vbGVzc19lcXVhbCc7XG5pbXBvcnQge2xvZ2ljYWxBbmR9IGZyb20gJy4uL2xvZ2ljYWxfYW5kJztcbmltcG9ydCB7b3B9IGZyb20gJy4uL29wZXJhdGlvbic7XG5pbXBvcnQge3JhbmdlfSBmcm9tICcuLi9yYW5nZSc7XG5pbXBvcnQge3Jlc2hhcGV9IGZyb20gJy4uL3Jlc2hhcGUnO1xuaW1wb3J0IHtzY2FsYXJ9IGZyb20gJy4uL3NjYWxhcic7XG5pbXBvcnQge3N0YWNrfSBmcm9tICcuLi9zdGFjayc7XG5pbXBvcnQge3N1Yn0gZnJvbSAnLi4vc3ViJztcbmltcG9ydCB7dW5zdGFja30gZnJvbSAnLi4vdW5zdGFjayc7XG5pbXBvcnQge3doZXJlfSBmcm9tICcuLi93aGVyZSc7XG5pbXBvcnQge3plcm9zfSBmcm9tICcuLi96ZXJvcyc7XG5cbi8qKlxuICogQ29weSBhIHRlbnNvciBzZXR0aW5nIGV2ZXJ5dGhpbmcgb3V0c2lkZSBhIGNlbnRyYWwgYmFuZCBpbiBlYWNoIGlubmVybW9zdFxuICogbWF0cml4IHRvIHplcm8uXG4gKlxuICogVGhlIGJhbmQgcGFydCBpcyBjb21wdXRlZCBhcyBmb2xsb3dzOiBBc3N1bWUgaW5wdXQgaGFzIGBrYCBkaW1lbnNpb25zXG4gKiBgW0ksIEosIEssIC4uLiwgTSwgTl1gLCB0aGVuIHRoZSBvdXRwdXQgaXMgYSB0ZW5zb3Igd2l0aCB0aGUgc2FtZSBzaGFwZSB3aGVyZVxuICogYGJhbmRbaSwgaiwgaywgLi4uLCBtLCBuXSA9IGluX2JhbmQobSwgbikgKiBpbnB1dFtpLCBqLCBrLCAuLi4sIG0sIG5dYC5cbiAqIFRoZSBpbmRpY2F0b3IgZnVuY3Rpb25cbiAqIGBpbl9iYW5kKG0sIG4pID0gKG51bV9sb3dlciA8IDAgfHwgKG0tbikgPD0gbnVtX2xvd2VyKWBcbiAqIGAmJiAobnVtX3VwcGVyIDwgMCB8fCAobi1tKSA8PSBudW1fdXBwZXIpYFxuICpcbiAqIGBgYGpzXG4gKiBjb25zdCB4ID0gdGYudGVuc29yMmQoW1sgMCwgIDEsICAyLCAzXSxcbiAqICAgICAgICAgICAgICAgICAgICAgICAgWy0xLCAgMCwgIDEsIDJdLFxuICogICAgICAgICAgICAgICAgICAgICAgICBbLTIsIC0xLCAgMCwgMV0sXG4gKiAgICAgICAgICAgICAgICAgICAgICAgIFstMywgLTIsIC0xLCAwXV0pO1xuICogbGV0IHkgPSB0Zi5saW5hbGcuYmFuZFBhcnQoeCwgMSwgLTEpO1xuICogeS5wcmludCgpOyAvLyBbWyAwLCAgMSwgIDIsIDNdLFxuICogICAgICAgICAgICAvLyAgWy0xLCAgMCwgIDEsIDJdLFxuICogICAgICAgICAgICAvLyAgWyAwLCAtMSwgIDAsIDFdLFxuICogICAgICAgICAgICAvLyAgWyAwLCAwICwgLTEsIDBdXVxuICogbGV0IHogPSB0Zi5saW5hbGcuYmFuZFBhcnQoeCwgMiwgMSk7XG4gKiB6LnByaW50KCk7IC8vIFtbIDAsICAxLCAgMCwgMF0sXG4gKiAgICAgICAgICAgIC8vICBbLTEsICAwLCAgMSwgMF0sXG4gKiAgICAgICAgICAgIC8vICBbLTIsIC0xLCAgMCwgMV0sXG4gKiAgICAgICAgICAgIC8vICBbIDAsIC0yLCAtMSwgMF1dXG4gKiBgYGBcbiAqXG4gKiBAcGFyYW0geCBSYW5rIGBrYCB0ZW5zb3JcbiAqIEBwYXJhbSBudW1Mb3dlciBOdW1iZXIgb2Ygc3ViZGlhZ29uYWxzIHRvIGtlZXAuXG4gKiAgIElmIG5lZ2F0aXZlLCBrZWVwIGVudGlyZSBsb3dlciB0cmlhbmdsZS5cbiAqIEBwYXJhbSBudW1VcHBlciBOdW1iZXIgb2Ygc3ViZGlhZ29uYWxzIHRvIGtlZXAuXG4gKiAgIElmIG5lZ2F0aXZlLCBrZWVwIGVudGlyZSB1cHBlciB0cmlhbmdsZS5cbiAqIEByZXR1cm5zIFJhbmsgYGtgIHRlbnNvciBvZiB0aGUgc2FtZSBzaGFwZSBhcyBpbnB1dC5cbiAqICAgVGhlIGV4dHJhY3RlZCBiYW5kZWQgdGVuc29yLlxuICpcbiAqIEBkb2Mge2hlYWRpbmc6J09wZXJhdGlvbnMnLCBzdWJoZWFkaW5nOidMaW5lYXIgQWxnZWJyYScsIG5hbWVzcGFjZTonbGluYWxnJ31cbiAqL1xuZnVuY3Rpb24gYmFuZFBhcnRfPFQgZXh0ZW5kcyBUZW5zb3I+KFxuICAgIGE6IFR8VGVuc29yTGlrZSwgbnVtTG93ZXI6IG51bWJlciwgbnVtVXBwZXI6IG51bWJlcik6IFQge1xuICBhc3NlcnQoXG4gICAgICBudW1Mb3dlciAlIDEgPT09IDAsXG4gICAgICAoKSA9PiBgYmFuZFBhcnQoKTogbnVtTG93ZXIgbXVzdCBiZSBhbiBpbnRlZ2VyLCBnb3QgJHtudW1Mb3dlcn0uYCk7XG4gIGFzc2VydChcbiAgICAgIG51bVVwcGVyICUgMSA9PT0gMCxcbiAgICAgICgpID0+IGBiYW5kUGFydCgpOiBudW1VcHBlciBtdXN0IGJlIGFuIGludGVnZXIsIGdvdCAke251bVVwcGVyfS5gKTtcblxuICBjb25zdCAkYSA9IGNvbnZlcnRUb1RlbnNvcihhLCAnYScsICdiYW5kUGFydCcpO1xuXG4gIGFzc2VydChcbiAgICAgICRhLnJhbmsgPj0gMixcbiAgICAgICgpID0+IGBiYW5kUGFydCgpOiBSYW5rIG11c3QgYmUgYXQgbGVhc3QgMiwgZ290ICR7JGEucmFua30uYCk7XG5cbiAgY29uc3Qgc2hhcGUgPSAkYS5zaGFwZTtcbiAgY29uc3QgW00sIE5dID0gJGEuc2hhcGUuc2xpY2UoLTIpO1xuXG4gIGlmICghKG51bUxvd2VyIDw9IE0pKSB7XG4gICAgdGhyb3cgbmV3IEVycm9yKFxuICAgICAgICBgYmFuZFBhcnQoKTogbnVtTG93ZXIgKCR7bnVtTG93ZXJ9KWAgK1xuICAgICAgICBgIG11c3Qgbm90IGJlIGdyZWF0ZXIgdGhhbiB0aGUgbnVtYmVyIG9mIHJvd3MgKCR7TX0pLmApO1xuICB9XG4gIGlmICghKG51bVVwcGVyIDw9IE4pKSB7XG4gICAgdGhyb3cgbmV3IEVycm9yKFxuICAgICAgICBgYmFuZFBhcnQoKTogbnVtVXBwZXIgKCR7bnVtVXBwZXJ9KWAgK1xuICAgICAgICBgIG11c3Qgbm90IGJlIGdyZWF0ZXIgdGhhbiB0aGUgbnVtYmVyIG9mIGNvbHVtbnMgKCR7Tn0pLmApO1xuICB9XG5cbiAgaWYgKG51bUxvd2VyIDwgMCkge1xuICAgIG51bUxvd2VyID0gTTtcbiAgfVxuICBpZiAobnVtVXBwZXIgPCAwKSB7XG4gICAgbnVtVXBwZXIgPSBOO1xuICB9XG5cbiAgY29uc3QgaSA9IHJlc2hhcGUocmFuZ2UoMCwgTSwgMSwgJ2ludDMyJyksIFstMSwgMV0pO1xuICBjb25zdCBqID0gcmFuZ2UoMCwgTiwgMSwgJ2ludDMyJyk7XG4gIGNvbnN0IGlqID0gc3ViKGksIGopO1xuXG4gIGNvbnN0IGluQmFuZCA9IGxvZ2ljYWxBbmQoXG4gICAgICBsZXNzRXF1YWwoaWosIHNjYWxhcigrbnVtTG93ZXIsICdpbnQzMicpKSxcbiAgICAgIGdyZWF0ZXJFcXVhbChpaiwgc2NhbGFyKC1udW1VcHBlciwgJ2ludDMyJykpKTtcblxuICBjb25zdCB6ZXJvID0gemVyb3MoW00sIE5dLCAkYS5kdHlwZSk7XG5cbiAgcmV0dXJuIHJlc2hhcGUoXG4gICAgICAgICAgICAgc3RhY2sodW5zdGFjayhyZXNoYXBlKCRhLCBbLTEsIE0sIE5dKSlcbiAgICAgICAgICAgICAgICAgICAgICAgLm1hcChtYXQgPT4gd2hlcmUoaW5CYW5kLCBtYXQsIHplcm8pKSksXG4gICAgICAgICAgICAgc2hhcGUpIGFzIFQ7XG59XG5cbmV4cG9ydCBjb25zdCBiYW5kUGFydCA9IG9wKHtiYW5kUGFydF99KTtcbiJdfQ==","/**\n * @license\n * Copyright 2020 Google LLC. All Rights Reserved.\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n * =============================================================================\n */\nimport { ENGINE } from '../../engine';\nimport { assert } from '../../util';\nimport { div } from '../div';\nimport { mul } from '../mul';\nimport { norm } from '../norm';\nimport { op } from '../operation';\nimport { split } from '../split';\nimport { squeeze } from '../squeeze';\nimport { stack } from '../stack';\nimport { sub } from '../sub';\nimport { sum } from '../sum';\n/**\n * Gram-Schmidt orthogonalization.\n *\n * ```js\n * const x = tf.tensor2d([[1, 2], [3, 4]]);\n * let y = tf.linalg.gramSchmidt(x);\n * y.print();\n * console.log('Orthogonalized:');\n * y.dot(y.transpose()).print(); // should be nearly the identity matrix.\n * console.log('First row direction maintained:');\n * const data = await y.array();\n * console.log(data[0][1] / data[0][0]); // should be nearly 2.\n * ```\n *\n * @param xs The vectors to be orthogonalized, in one of the two following\n * formats:\n * - An Array of `tf.Tensor1D`.\n * - A `tf.Tensor2D`, i.e., a matrix, in which case the vectors are the rows\n * of `xs`.\n * In each case, all the vectors must have the same length and the length\n * must be greater than or equal to the number of vectors.\n * @returns The orthogonalized and normalized vectors or matrix.\n * Orthogonalization means that the vectors or the rows of the matrix\n * are orthogonal (zero inner products). Normalization means that each\n * vector or each row of the matrix has an L2 norm that equals `1`.\n *\n * @doc {heading:'Operations', subheading:'Linear Algebra', namespace:'linalg'}\n */\nfunction gramSchmidt_(xs) {\n let inputIsTensor2D;\n if (Array.isArray(xs)) {\n inputIsTensor2D = false;\n assert(xs != null && xs.length > 0, () => 'Gram-Schmidt process: input must not be null, undefined, or ' +\n 'empty');\n const dim = xs[0].shape[0];\n for (let i = 1; i < xs.length; ++i) {\n assert(xs[i].shape[0] === dim, () => 'Gram-Schmidt: Non-unique lengths found in the input vectors: ' +\n `(${xs[i].shape[0]} vs. ${dim})`);\n }\n }\n else {\n inputIsTensor2D = true;\n xs = split(xs, xs.shape[0], 0).map(x => squeeze(x, [0]));\n }\n assert(xs.length <= xs[0].shape[0], () => `Gram-Schmidt: Number of vectors (${xs.length}) exceeds ` +\n `number of dimensions (${xs[0].shape[0]}).`);\n const ys = [];\n const xs1d = xs;\n for (let i = 0; i < xs.length; ++i) {\n ys.push(ENGINE.tidy(() => {\n let x = xs1d[i];\n if (i > 0) {\n for (let j = 0; j < i; ++j) {\n const proj = mul(sum(mul(ys[j], x)), ys[j]);\n x = sub(x, proj);\n }\n }\n return div(x, norm(x, 'euclidean'));\n }));\n }\n if (inputIsTensor2D) {\n return stack(ys, 0);\n }\n else {\n return ys;\n }\n}\nexport const gramSchmidt = op({ gramSchmidt_ });\n//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZ3JhbV9zY2htaWR0LmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vLi4vLi4vdGZqcy1jb3JlL3NyYy9vcHMvbGluYWxnL2dyYW1fc2NobWlkdC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQTs7Ozs7Ozs7Ozs7Ozs7O0dBZUc7QUFFSCxPQUFPLEVBQUMsTUFBTSxFQUFDLE1BQU0sY0FBYyxDQUFDO0FBRXBDLE9BQU8sRUFBQyxNQUFNLEVBQUMsTUFBTSxZQUFZLENBQUM7QUFFbEMsT0FBTyxFQUFDLEdBQUcsRUFBQyxNQUFNLFFBQVEsQ0FBQztBQUMzQixPQUFPLEVBQUMsR0FBRyxFQUFDLE1BQU0sUUFBUSxDQUFDO0FBQzNCLE9BQU8sRUFBQyxJQUFJLEVBQUMsTUFBTSxTQUFTLENBQUM7QUFDN0IsT0FBTyxFQUFDLEVBQUUsRUFBQyxNQUFNLGNBQWMsQ0FBQztBQUNoQyxPQUFPLEVBQUMsS0FBSyxFQUFDLE1BQU0sVUFBVSxDQUFDO0FBQy9CLE9BQU8sRUFBQyxPQUFPLEVBQUMsTUFBTSxZQUFZLENBQUM7QUFDbkMsT0FBTyxFQUFDLEtBQUssRUFBQyxNQUFNLFVBQVUsQ0FBQztBQUMvQixPQUFPLEVBQUMsR0FBRyxFQUFDLE1BQU0sUUFBUSxDQUFDO0FBQzNCLE9BQU8sRUFBQyxHQUFHLEVBQUMsTUFBTSxRQUFRLENBQUM7QUFFM0I7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7OztHQTJCRztBQUNILFNBQVMsWUFBWSxDQUFDLEVBQXVCO0lBQzNDLElBQUksZUFBd0IsQ0FBQztJQUM3QixJQUFJLEtBQUssQ0FBQyxPQUFPLENBQUMsRUFBRSxDQUFDLEVBQUU7UUFDckIsZUFBZSxHQUFHLEtBQUssQ0FBQztRQUN4QixNQUFNLENBQ0YsRUFBRSxJQUFJLElBQUksSUFBSSxFQUFFLENBQUMsTUFBTSxHQUFHLENBQUMsRUFDM0IsR0FBRyxFQUFFLENBQUMsOERBQThEO1lBQ2hFLE9BQU8sQ0FBQyxDQUFDO1FBQ2pCLE1BQU0sR0FBRyxHQUFHLEVBQUUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDLENBQUM7UUFDM0IsS0FBSyxJQUFJLENBQUMsR0FBRyxDQUFDLEVBQUUsQ0FBQyxHQUFHLEVBQUUsQ0FBQyxNQUFNLEVBQUUsRUFBRSxDQUFDLEVBQUU7WUFDbEMsTUFBTSxDQUNGLEVBQUUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDLEtBQUssR0FBRyxFQUN0QixHQUFHLEVBQUUsQ0FDRCwrREFBK0Q7Z0JBQy9ELElBQUssRUFBaUIsQ0FBQyxDQUFDLENBQUMsQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDLFFBQVEsR0FBRyxHQUFHLENBQUMsQ0FBQztTQUMzRDtLQUNGO1NBQU07UUFDTCxlQUFlLEdBQUcsSUFBSSxDQUFDO1FBQ3ZCLEVBQUUsR0FBRyxLQUFLLENBQUMsRUFBRSxFQUFFLEVBQUUsQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsT0FBTyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQztLQUMxRDtJQUVELE1BQU0sQ0FDRixFQUFFLENBQUMsTUFBTSxJQUFJLEVBQUUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDLEVBQzNCLEdBQUcsRUFBRSxDQUFDLG9DQUNLLEVBQWlCLENBQUMsTUFBTSxZQUFZO1FBQzNDLHlCQUEwQixFQUFpQixDQUFDLENBQUMsQ0FBQyxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUM7SUFFckUsTUFBTSxFQUFFLEdBQWUsRUFBRSxDQUFDO0lBQzFCLE1BQU0sSUFBSSxHQUFHLEVBQUUsQ0FBQztJQUNoQixLQUFLLElBQUksQ0FBQyxHQUFHLENBQUMsRUFBRSxDQUFDLEdBQUcsRUFBRSxDQUFDLE1BQU0sRUFBRSxFQUFFLENBQUMsRUFBRTtRQUNsQyxFQUFFLENBQUMsSUFBSSxDQUFDLE1BQU0sQ0FBQyxJQUFJLENBQUMsR0FBRyxFQUFFO1lBQ3ZCLElBQUksQ0FBQyxHQUFHLElBQUksQ0FBQyxDQUFDLENBQUMsQ0FBQztZQUNoQixJQUFJLENBQUMsR0FBRyxDQUFDLEVBQUU7Z0JBQ1QsS0FBSyxJQUFJLENBQUMsR0FBRyxDQUFDLEVBQUUsQ0FBQyxHQUFHLENBQUMsRUFBRSxFQUFFLENBQUMsRUFBRTtvQkFDMUIsTUFBTSxJQUFJLEdBQUcsR0FBRyxDQUFDLEdBQUcsQ0FBQyxHQUFHLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLEVBQUUsRUFBRSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUM7b0JBQzVDLENBQUMsR0FBRyxHQUFHLENBQUMsQ0FBQyxFQUFFLElBQUksQ0FBQyxDQUFDO2lCQUNsQjthQUNGO1lBQ0QsT0FBTyxHQUFHLENBQUMsQ0FBQyxFQUFFLElBQUksQ0FBQyxDQUFDLEVBQUUsV0FBVyxDQUFDLENBQUMsQ0FBQztRQUN0QyxDQUFDLENBQUMsQ0FBQyxDQUFDO0tBQ0w7SUFFRCxJQUFJLGVBQWUsRUFBRTtRQUNuQixPQUFPLEtBQUssQ0FBQyxFQUFFLEVBQUUsQ0FBQyxDQUFhLENBQUM7S0FDakM7U0FBTTtRQUNMLE9BQU8sRUFBRSxDQUFDO0tBQ1g7QUFDSCxDQUFDO0FBRUQsTUFBTSxDQUFDLE1BQU0sV0FBVyxHQUFHLEVBQUUsQ0FBQyxFQUFDLFlBQVksRUFBQyxDQUFDLENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyIvKipcbiAqIEBsaWNlbnNlXG4gKiBDb3B5cmlnaHQgMjAyMCBHb29nbGUgTExDLiBBbGwgUmlnaHRzIFJlc2VydmVkLlxuICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlIFwiTGljZW5zZVwiKTtcbiAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS5cbiAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdFxuICpcbiAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMFxuICpcbiAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmVcbiAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuIFwiQVMgSVNcIiBCQVNJUyxcbiAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLlxuICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZFxuICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuXG4gKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuICovXG5cbmltcG9ydCB7RU5HSU5FfSBmcm9tICcuLi8uLi9lbmdpbmUnO1xuaW1wb3J0IHtUZW5zb3IxRCwgVGVuc29yMkR9IGZyb20gJy4uLy4uL3RlbnNvcic7XG5pbXBvcnQge2Fzc2VydH0gZnJvbSAnLi4vLi4vdXRpbCc7XG5cbmltcG9ydCB7ZGl2fSBmcm9tICcuLi9kaXYnO1xuaW1wb3J0IHttdWx9IGZyb20gJy4uL211bCc7XG5pbXBvcnQge25vcm19IGZyb20gJy4uL25vcm0nO1xuaW1wb3J0IHtvcH0gZnJvbSAnLi4vb3BlcmF0aW9uJztcbmltcG9ydCB7c3BsaXR9IGZyb20gJy4uL3NwbGl0JztcbmltcG9ydCB7c3F1ZWV6ZX0gZnJvbSAnLi4vc3F1ZWV6ZSc7XG5pbXBvcnQge3N0YWNrfSBmcm9tICcuLi9zdGFjayc7XG5pbXBvcnQge3N1Yn0gZnJvbSAnLi4vc3ViJztcbmltcG9ydCB7c3VtfSBmcm9tICcuLi9zdW0nO1xuXG4vKipcbiAqIEdyYW0tU2NobWlkdCBvcnRob2dvbmFsaXphdGlvbi5cbiAqXG4gKiBgYGBqc1xuICogY29uc3QgeCA9IHRmLnRlbnNvcjJkKFtbMSwgMl0sIFszLCA0XV0pO1xuICogbGV0IHkgPSB0Zi5saW5hbGcuZ3JhbVNjaG1pZHQoeCk7XG4gKiB5LnByaW50KCk7XG4gKiBjb25zb2xlLmxvZygnT3J0aG9nb25hbGl6ZWQ6Jyk7XG4gKiB5LmRvdCh5LnRyYW5zcG9zZSgpKS5wcmludCgpOyAgLy8gc2hvdWxkIGJlIG5lYXJseSB0aGUgaWRlbnRpdHkgbWF0cml4LlxuICogY29uc29sZS5sb2coJ0ZpcnN0IHJvdyBkaXJlY3Rpb24gbWFpbnRhaW5lZDonKTtcbiAqIGNvbnN0IGRhdGEgPSBhd2FpdCB5LmFycmF5KCk7XG4gKiBjb25zb2xlLmxvZyhkYXRhWzBdWzFdIC8gZGF0YVswXVswXSk7ICAvLyBzaG91bGQgYmUgbmVhcmx5IDIuXG4gKiBgYGBcbiAqXG4gKiBAcGFyYW0geHMgVGhlIHZlY3RvcnMgdG8gYmUgb3J0aG9nb25hbGl6ZWQsIGluIG9uZSBvZiB0aGUgdHdvIGZvbGxvd2luZ1xuICogICBmb3JtYXRzOlxuICogICAtIEFuIEFycmF5IG9mIGB0Zi5UZW5zb3IxRGAuXG4gKiAgIC0gQSBgdGYuVGVuc29yMkRgLCBpLmUuLCBhIG1hdHJpeCwgaW4gd2hpY2ggY2FzZSB0aGUgdmVjdG9ycyBhcmUgdGhlIHJvd3NcbiAqICAgICBvZiBgeHNgLlxuICogICBJbiBlYWNoIGNhc2UsIGFsbCB0aGUgdmVjdG9ycyBtdXN0IGhhdmUgdGhlIHNhbWUgbGVuZ3RoIGFuZCB0aGUgbGVuZ3RoXG4gKiAgIG11c3QgYmUgZ3JlYXRlciB0aGFuIG9yIGVxdWFsIHRvIHRoZSBudW1iZXIgb2YgdmVjdG9ycy5cbiAqIEByZXR1cm5zIFRoZSBvcnRob2dvbmFsaXplZCBhbmQgbm9ybWFsaXplZCB2ZWN0b3JzIG9yIG1hdHJpeC5cbiAqICAgT3J0aG9nb25hbGl6YXRpb24gbWVhbnMgdGhhdCB0aGUgdmVjdG9ycyBvciB0aGUgcm93cyBvZiB0aGUgbWF0cml4XG4gKiAgIGFyZSBvcnRob2dvbmFsICh6ZXJvIGlubmVyIHByb2R1Y3RzKS4gTm9ybWFsaXphdGlvbiBtZWFucyB0aGF0IGVhY2hcbiAqICAgdmVjdG9yIG9yIGVhY2ggcm93IG9mIHRoZSBtYXRyaXggaGFzIGFuIEwyIG5vcm0gdGhhdCBlcXVhbHMgYDFgLlxuICpcbiAqIEBkb2Mge2hlYWRpbmc6J09wZXJhdGlvbnMnLCBzdWJoZWFkaW5nOidMaW5lYXIgQWxnZWJyYScsIG5hbWVzcGFjZTonbGluYWxnJ31cbiAqL1xuZnVuY3Rpb24gZ3JhbVNjaG1pZHRfKHhzOiBUZW5zb3IxRFtdfFRlbnNvcjJEKTogVGVuc29yMURbXXxUZW5zb3IyRCB7XG4gIGxldCBpbnB1dElzVGVuc29yMkQ6IGJvb2xlYW47XG4gIGlmIChBcnJheS5pc0FycmF5KHhzKSkge1xuICAgIGlucHV0SXNUZW5zb3IyRCA9IGZhbHNlO1xuICAgIGFzc2VydChcbiAgICAgICAgeHMgIT0gbnVsbCAmJiB4cy5sZW5ndGggPiAwLFxuICAgICAgICAoKSA9PiAnR3JhbS1TY2htaWR0IHByb2Nlc3M6IGlucHV0IG11c3Qgbm90IGJlIG51bGwsIHVuZGVmaW5lZCwgb3IgJyArXG4gICAgICAgICAgICAnZW1wdHknKTtcbiAgICBjb25zdCBkaW0gPSB4c1swXS5zaGFwZVswXTtcbiAgICBmb3IgKGxldCBpID0gMTsgaSA8IHhzLmxlbmd0aDsgKytpKSB7XG4gICAgICBhc3NlcnQoXG4gICAgICAgICAgeHNbaV0uc2hhcGVbMF0gPT09IGRpbSxcbiAgICAgICAgICAoKSA9PlxuICAgICAgICAgICAgICAnR3JhbS1TY2htaWR0OiBOb24tdW5pcXVlIGxlbmd0aHMgZm91bmQgaW4gdGhlIGlucHV0IHZlY3RvcnM6ICcgK1xuICAgICAgICAgICAgICBgKCR7KHhzIGFzIFRlbnNvcjFEW10pW2ldLnNoYXBlWzBdfSB2cy4gJHtkaW19KWApO1xuICAgIH1cbiAgfSBlbHNlIHtcbiAgICBpbnB1dElzVGVuc29yMkQgPSB0cnVlO1xuICAgIHhzID0gc3BsaXQoeHMsIHhzLnNoYXBlWzBdLCAwKS5tYXAoeCA9PiBzcXVlZXplKHgsIFswXSkpO1xuICB9XG5cbiAgYXNzZXJ0KFxuICAgICAgeHMubGVuZ3RoIDw9IHhzWzBdLnNoYXBlWzBdLFxuICAgICAgKCkgPT4gYEdyYW0tU2NobWlkdDogTnVtYmVyIG9mIHZlY3RvcnMgKCR7XG4gICAgICAgICAgICAgICAgKHhzIGFzIFRlbnNvcjFEW10pLmxlbmd0aH0pIGV4Y2VlZHMgYCArXG4gICAgICAgICAgYG51bWJlciBvZiBkaW1lbnNpb25zICgkeyh4cyBhcyBUZW5zb3IxRFtdKVswXS5zaGFwZVswXX0pLmApO1xuXG4gIGNvbnN0IHlzOiBUZW5zb3IxRFtdID0gW107XG4gIGNvbnN0IHhzMWQgPSB4cztcbiAgZm9yIChsZXQgaSA9IDA7IGkgPCB4cy5sZW5ndGg7ICsraSkge1xuICAgIHlzLnB1c2goRU5HSU5FLnRpZHkoKCkgPT4ge1xuICAgICAgbGV0IHggPSB4czFkW2ldO1xuICAgICAgaWYgKGkgPiAwKSB7XG4gICAgICAgIGZvciAobGV0IGogPSAwOyBqIDwgaTsgKytqKSB7XG4gICAgICAgICAgY29uc3QgcHJvaiA9IG11bChzdW0obXVsKHlzW2pdLCB4KSksIHlzW2pdKTtcbiAgICAgICAgICB4ID0gc3ViKHgsIHByb2opO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgICByZXR1cm4gZGl2KHgsIG5vcm0oeCwgJ2V1Y2xpZGVhbicpKTtcbiAgICB9KSk7XG4gIH1cblxuICBpZiAoaW5wdXRJc1RlbnNvcjJEKSB7XG4gICAgcmV0dXJuIHN0YWNrKHlzLCAwKSBhcyBUZW5zb3IyRDtcbiAgfSBlbHNlIHtcbiAgICByZXR1cm4geXM7XG4gIH1cbn1cblxuZXhwb3J0IGNvbnN0IGdyYW1TY2htaWR0ID0gb3Aoe2dyYW1TY2htaWR0X30pO1xuIl19","/**\n * @license\n * Copyright 2020 Google LLC. All Rights Reserved.\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n * =============================================================================\n */\nimport { ENGINE } from '../../engine';\nimport { dispose } from '../../globals';\nimport { assert } from '../../util';\nimport { clone } from '../clone';\nimport { concat } from '../concat';\nimport { div } from '../div';\nimport { eye } from '../eye';\nimport { greater } from '../greater';\nimport { matMul } from '../mat_mul';\nimport { mul } from '../mul';\nimport { neg } from '../neg';\nimport { norm } from '../norm';\nimport { op } from '../operation';\nimport { reshape } from '../reshape';\nimport { slice } from '../slice';\nimport { stack } from '../stack';\nimport { sub } from '../sub';\nimport { tensor2d } from '../tensor2d';\nimport { transpose } from '../transpose';\nimport { unstack } from '../unstack';\nimport { where } from '../where';\n/**\n * Compute QR decomposition of m-by-n matrix using Householder transformation.\n *\n * Implementation based on\n * [http://www.cs.cornell.edu/~bindel/class/cs6210-f09/lec18.pdf]\n * (http://www.cs.cornell.edu/~bindel/class/cs6210-f09/lec18.pdf)\n *\n * ```js\n * const a = tf.tensor2d([[1, 2], [3, 4]]);\n * let [q, r] = tf.linalg.qr(a);\n * console.log('Q');\n * q.print();\n * console.log('R');\n * r.print();\n * console.log('Orthogonalized');\n * q.dot(q.transpose()).print() // should be nearly the identity matrix.\n * console.log('Reconstructed');\n * q.dot(r).print(); // should be nearly [[1, 2], [3, 4]];\n * ```\n *\n * @param x The `tf.Tensor` to be QR-decomposed. Must have rank >= 2. Suppose\n * it has the shape `[..., M, N]`.\n * @param fullMatrices An optional boolean parameter. Defaults to `false`.\n * If `true`, compute full-sized `Q`. If `false` (the default),\n * compute only the leading N columns of `Q` and `R`.\n * @returns An `Array` of two `tf.Tensor`s: `[Q, R]`. `Q` is a unitary matrix,\n * i.e., its columns all have unit norm and are mutually orthogonal.\n * If `M >= N`,\n * If `fullMatrices` is `false` (default),\n * - `Q` has a shape of `[..., M, N]`,\n * - `R` has a shape of `[..., N, N]`.\n * If `fullMatrices` is `true` (default),\n * - `Q` has a shape of `[..., M, M]`,\n * - `R` has a shape of `[..., M, N]`.\n * If `M < N`,\n * - `Q` has a shape of `[..., M, M]`,\n * - `R` has a shape of `[..., M, N]`.\n * @throws If the rank of `x` is less than 2.\n *\n * @doc {heading:'Operations',\n * subheading:'Linear Algebra',\n * namespace:'linalg'}\n */\nfunction qr_(x, fullMatrices = false) {\n assert(x.rank >= 2, () => `qr() requires input tensor to have a rank >= 2, but got rank ${x.rank}`);\n if (x.rank === 2) {\n return qr2d(x, fullMatrices);\n }\n else {\n // Rank > 2.\n // TODO(cais): Below we split the input into individual 2D tensors,\n // perform QR decomposition on them and then stack the results back\n // together. We should explore whether this can be parallelized.\n const outerDimsProd = x.shape.slice(0, x.shape.length - 2)\n .reduce((value, prev) => value * prev);\n const x2ds = unstack(reshape(x, [\n outerDimsProd, x.shape[x.shape.length - 2],\n x.shape[x.shape.length - 1]\n ]), 0);\n const q2ds = [];\n const r2ds = [];\n x2ds.forEach(x2d => {\n const [q2d, r2d] = qr2d(x2d, fullMatrices);\n q2ds.push(q2d);\n r2ds.push(r2d);\n });\n const q = reshape(stack(q2ds, 0), x.shape);\n const r = reshape(stack(r2ds, 0), x.shape);\n return [q, r];\n }\n}\nfunction qr2d(x, fullMatrices = false) {\n return ENGINE.tidy(() => {\n assert(x.shape.length === 2, () => `qr2d() requires a 2D Tensor, but got a ${x.shape.length}D Tensor.`);\n const m = x.shape[0];\n const n = x.shape[1];\n let q = eye(m); // Orthogonal transform so far.\n let r = clone(x); // Transformed matrix so far.\n const one2D = tensor2d([[1]], [1, 1]);\n let w = clone(one2D);\n const iters = m >= n ? n : m;\n for (let j = 0; j < iters; ++j) {\n // This tidy within the for-loop ensures we clean up temporary\n // tensors as soon as they are no longer needed.\n const rTemp = r;\n const wTemp = w;\n const qTemp = q;\n [w, r, q] = ENGINE.tidy(() => {\n // Find H = I - tau * w * w', to put zeros below R(j, j).\n const rjEnd1 = slice(r, [j, j], [m - j, 1]);\n const normX = norm(rjEnd1);\n const rjj = slice(r, [j, j], [1, 1]);\n // The sign() function returns 0 on 0, which causes division by zero.\n const s = where(greater(rjj, 0), tensor2d([[-1]]), tensor2d([[1]]));\n const u1 = sub(rjj, mul(s, normX));\n const wPre = div(rjEnd1, u1);\n if (wPre.shape[0] === 1) {\n w = clone(one2D);\n }\n else {\n w = concat([\n one2D,\n slice(wPre, [1, 0], [wPre.shape[0] - 1, wPre.shape[1]])\n ], 0);\n }\n const tau = neg(div(matMul(s, u1), normX));\n // -- R := HR, Q := QH.\n const rjEndAll = slice(r, [j, 0], [m - j, n]);\n const tauTimesW = mul(tau, w);\n const wT = transpose(w);\n if (j === 0) {\n r = sub(rjEndAll, matMul(tauTimesW, matMul(wT, rjEndAll)));\n }\n else {\n const rTimesTau = sub(rjEndAll, matMul(tauTimesW, matMul(wT, rjEndAll)));\n r = concat([slice(r, [0, 0], [j, n]), rTimesTau], 0);\n }\n const tawTimesWT = transpose(tauTimesW);\n const qAllJEnd = slice(q, [0, j], [m, q.shape[1] - j]);\n if (j === 0) {\n q = sub(qAllJEnd, matMul(matMul(qAllJEnd, w), tawTimesWT));\n }\n else {\n const qTimesTau = sub(qAllJEnd, matMul(matMul(qAllJEnd, w), tawTimesWT));\n q = concat([slice(q, [0, 0], [m, j]), qTimesTau], 1);\n }\n return [w, r, q];\n });\n dispose([rTemp, wTemp, qTemp]);\n }\n if (!fullMatrices && m > n) {\n q = slice(q, [0, 0], [m, n]);\n r = slice(r, [0, 0], [n, n]);\n }\n return [q, r];\n });\n}\nexport const qr = op({ qr_ });\n//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicXIuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi8uLi8uLi90ZmpzLWNvcmUvc3JjL29wcy9saW5hbGcvcXIudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUE7Ozs7Ozs7Ozs7Ozs7OztHQWVHO0FBQ0gsT0FBTyxFQUFDLE1BQU0sRUFBQyxNQUFNLGNBQWMsQ0FBQztBQUNwQyxPQUFPLEVBQUMsT0FBTyxFQUFDLE1BQU0sZUFBZSxDQUFDO0FBRXRDLE9BQU8sRUFBQyxNQUFNLEVBQUMsTUFBTSxZQUFZLENBQUM7QUFFbEMsT0FBTyxFQUFDLEtBQUssRUFBQyxNQUFNLFVBQVUsQ0FBQztBQUMvQixPQUFPLEVBQUMsTUFBTSxFQUFDLE1BQU0sV0FBVyxDQUFDO0FBQ2pDLE9BQU8sRUFBQyxHQUFHLEVBQUMsTUFBTSxRQUFRLENBQUM7QUFDM0IsT0FBTyxFQUFDLEdBQUcsRUFBQyxNQUFNLFFBQVEsQ0FBQztBQUMzQixPQUFPLEVBQUMsT0FBTyxFQUFDLE1BQU0sWUFBWSxDQUFDO0FBQ25DLE9BQU8sRUFBQyxNQUFNLEVBQUMsTUFBTSxZQUFZLENBQUM7QUFDbEMsT0FBTyxFQUFDLEdBQUcsRUFBQyxNQUFNLFFBQVEsQ0FBQztBQUMzQixPQUFPLEVBQUMsR0FBRyxFQUFDLE1BQU0sUUFBUSxDQUFDO0FBQzNCLE9BQU8sRUFBQyxJQUFJLEVBQUMsTUFBTSxTQUFTLENBQUM7QUFDN0IsT0FBTyxFQUFDLEVBQUUsRUFBQyxNQUFNLGNBQWMsQ0FBQztBQUNoQyxPQUFPLEVBQUMsT0FBTyxFQUFDLE1BQU0sWUFBWSxDQUFDO0FBQ25DLE9BQU8sRUFBQyxLQUFLLEVBQUMsTUFBTSxVQUFVLENBQUM7QUFDL0IsT0FBTyxFQUFDLEtBQUssRUFBQyxNQUFNLFVBQVUsQ0FBQztBQUMvQixPQUFPLEVBQUMsR0FBRyxFQUFDLE1BQU0sUUFBUSxDQUFDO0FBQzNCLE9BQU8sRUFBQyxRQUFRLEVBQUMsTUFBTSxhQUFhLENBQUM7QUFDckMs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Q0FBQyxHQUFHLEdBQUcsQ0FBQyxRQUFRLEVBQUUsTUFBTSxDQUFDLFNBQVMsRUFBRSxNQUFNLENBQUMsRUFBRSxFQUFFLFFBQVEsQ0FBQyxDQUFDLENBQUMsQ0FBQztpQkFDNUQ7cUJBQU07b0JBQ0wsTUFBTSxTQUFTLEdBQ1gsR0FBRyxDQUFDLFFBQVEsRUFBRSxNQUFNLENBQUMsU0FBUyxFQUFFLE1BQU0sQ0FBQyxFQUFFLEVBQUUsUUFBUSxDQUFDLENBQUMsQ0FBQyxDQUFDO29CQUMzRCxDQUFDLEdBQUcsTUFBTSxDQUFDLENBQUMsS0FBSyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxFQUFFLFNBQVMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDO2lCQUN0RDtnQkFDRCxNQUFNLFVBQVUsR0FBYSxTQUFTLENBQUMsU0FBUyxDQUFDLENBQUM7Z0JBQ2xELE1BQU0sUUFBUSxHQUFHLEtBQUssQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDO2dCQUN2RCxJQUFJLENBQUMsS0FBSyxDQUFDLEVBQUU7b0JBQ1gsQ0FBQyxHQUFHLEdBQUcsQ0FBQyxRQUFRLEVBQUUsTUFBTSxDQUFDLE1BQU0sQ0FBQyxRQUFRLEVBQUUsQ0FBQyxDQUFDLEVBQUUsVUFBVSxDQUFDLENBQUMsQ0FBQztpQkFDNUQ7cUJBQU07b0JBQ0wsTUFBTSxTQUFTLEdBQ1gsR0FBRyxDQUFDLFFBQVEsRUFBRSxNQUFNLENBQUMsTUFBTSxDQUFDLFFBQVEsRUFBRSxDQUFDLENBQUMsRUFBRSxVQUFVLENBQUMsQ0FBQyxDQUFDO29CQUMzRCxDQUFDLEdBQUcsTUFBTSxDQUFDLENBQUMsS0FBSyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxFQUFFLFNBQVMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDO2lCQUN0RDtnQkFDRCxPQUFPLENBQUMsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQztZQUNuQixDQUFDLENBQUMsQ0FBQztZQUNILE9BQU8sQ0FBQyxDQUFDLEtBQUssRUFBRSxLQUFLLEVBQUUsS0FBSyxDQUFDLENBQUMsQ0FBQztTQUNoQztRQUVELElBQUksQ0FBQyxZQUFZLElBQUksQ0FBQyxHQUFHLENBQUMsRUFBRTtZQUMxQixDQUFDLEdBQUcsS0FBSyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxDQUFDO1lBQzdCLENBQUMsR0FBRyxLQUFLLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUM7U0FDOUI7UUFFRCxPQUFPLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDO0lBQ2hCLENBQUMsQ0FBeUIsQ0FBQztBQUM3QixDQUFDO0FBRUQsTUFBTSxDQUFDLE1BQU0sRUFBRSxHQUFHLEVBQUUsQ0FBQyxFQUFDLEdBQUcsRUFBQyxDQUFDLENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyIvKipcbiAqIEBsaWNlbnNlXG4gKiBDb3B5cmlnaHQgMjAyMCBHb29nbGUgTExDLiBBbGwgUmlnaHRzIFJlc2VydmVkLlxuICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlIFwiTGljZW5zZVwiKTtcbiAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS5cbiAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdFxuICpcbiAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMFxuICpcbiAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmVcbiAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuIFwiQVMgSVNcIiBCQVNJUyxcbiAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLlxuICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZFxuICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuXG4gKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuICovXG5pbXBvcnQge0VOR0lORX0gZnJvbSAnLi4vLi4vZW5naW5lJztcbmltcG9ydCB7ZGlzcG9zZX0gZnJvbSAnLi4vLi4vZ2xvYmFscyc7XG5pbXBvcnQge1RlbnNvciwgVGVuc29yMkR9IGZyb20gJy4uLy4uL3RlbnNvcic7XG5pbXBvcnQge2Fzc2VydH0gZnJvbSAnLi4vLi4vdXRpbCc7XG5cbmltcG9ydCB7Y2xvbmV9IGZyb20gJy4uL2Nsb25lJztcbmltcG9ydCB7Y29uY2F0fSBmcm9tICcuLi9jb25jYXQnO1xuaW1wb3J0IHtkaXZ9IGZyb20gJy4uL2Rpdic7XG5pbXBvcnQge2V5ZX0gZnJvbSAnLi4vZXllJztcbmltcG9ydCB7Z3JlYXRlcn0gZnJvbSAnLi4vZ3JlYXRlcic7XG5pbXBvcnQge21hdE11bH0gZnJvbSAnLi4vbWF0X211bCc7XG5pbXBvcnQge211bH0gZnJvbSAnLi4vbXVsJztcbmltcG9ydCB7bmVnfSBmcm9tICcuLi9uZWcnO1xuaW1wb3J0IHtub3JtfSBmcm9tICcuLi9ub3JtJztcbmltcG9ydCB7b3B9IGZyb20gJy4uL29wZXJhdGlvbic7XG5pbXBvcnQge3Jlc2hhcGV9IGZyb20gJy4uL3Jlc2hhcGUnO1xuaW1wb3J0IHtzbGljZX0gZnJvbSAnLi4vc2xpY2UnO1xuaW1wb3J0IHtzdGFja30gZnJvbSAnLi4vc3RhY2snO1xuaW1wb3J0IHtzdWJ9IGZyb20gJy4uL3N1Yic7XG5pbXBvcnQge3RlbnNvcjJkfSBmcm9tICcuLi90ZW5zb3IyZCc7XG5pbXBvcnQge3RyYW5zcG9zZX0gZnJvbSAnLi4vdHJhbnNwb3NlJztcbmltcG9ydCB7dW5zdGFja30gZnJvbSAnLi4vdW5zdGFjayc7XG5pbXBvcnQge3doZXJlfSBmcm9tICcuLi93aGVyZSc7XG5cbi8qKlxuICogQ29tcHV0ZSBRUiBkZWNvbXBvc2l0aW9uIG9mIG0tYnktbiBtYXRyaXggdXNpbmcgSG91c2Vob2xkZXIgdHJhbnNmb3JtYXRpb24uXG4gKlxuICogSW1wbGVtZW50YXRpb24gYmFzZWQgb25cbiAqICAgW2h0dHA6Ly93d3cuY3MuY29ybmVsbC5lZHUvfmJpbmRlbC9jbGFzcy9jczYyMTAtZjA5L2xlYzE4LnBkZl1cbiAqIChodHRwOi8vd3d3LmNzLmNvcm5lbGwuZWR1L35iaW5kZWwvY2xhc3MvY3M2MjEwLWYwOS9sZWMxOC5wZGYpXG4gKlxuICogYGBganNcbiAqIGNvbnN0IGEgPSB0Zi50ZW5zb3IyZChbWzEsIDJdLCBbMywgNF1dKTtcbiAqIGxldCBbcSwgcl0gPSB0Zi5saW5hbGcucXIoYSk7XG4gKiBjb25zb2xlLmxvZygnUScpO1xuICogcS5wcmludCgpO1xuICogY29uc29sZS5sb2coJ1InKTtcbiAqIHIucHJpbnQoKTtcbiAqIGNvbnNvbGUubG9nKCdPcnRob2dvbmFsaXplZCcpO1xuICogcS5kb3QocS50cmFuc3Bvc2UoKSkucHJpbnQoKSAgLy8gc2hvdWxkIGJlIG5lYXJseSB0aGUgaWRlbnRpdHkgbWF0cml4LlxuICogY29uc29sZS5sb2coJ1JlY29uc3RydWN0ZWQnKTtcbiAqIHEuZG90KHIpLnByaW50KCk7IC8vIHNob3VsZCBiZSBuZWFybHkgW1sxLCAyXSwgWzMsIDRdXTtcbiAqIGBgYFxuICpcbiAqIEBwYXJhbSB4IFRoZSBgdGYuVGVuc29yYCB0byBiZSBRUi1kZWNvbXBvc2VkLiBNdXN0IGhhdmUgcmFuayA+PSAyLiBTdXBwb3NlXG4gKiAgIGl0IGhhcyB0aGUgc2hhcGUgYFsuLi4sIE0sIE5dYC5cbiAqIEBwYXJhbSBmdWxsTWF0cmljZXMgQW4gb3B0aW9uYWwgYm9vbGVhbiBwYXJhbWV0ZXIuIERlZmF1bHRzIHRvIGBmYWxzZWAuXG4gKiAgIElmIGB0cnVlYCwgY29tcHV0ZSBmdWxsLXNpemVkIGBRYC4gSWYgYGZhbHNlYCAodGhlIGRlZmF1bHQpLFxuICogICBjb21wdXRlIG9ubHkgdGhlIGxlYWRpbmcgTiBjb2x1bW5zIG9mIGBRYCBhbmQgYFJgLlxuICogQHJldHVybnMgQW4gYEFycmF5YCBvZiB0d28gYHRmLlRlbnNvcmBzOiBgW1EsIFJdYC4gYFFgIGlzIGEgdW5pdGFyeSBtYXRyaXgsXG4gKiAgIGkuZS4sIGl0cyBjb2x1bW5zIGFsbCBoYXZlIHVuaXQgbm9ybSBhbmQgYXJlIG11dHVhbGx5IG9ydGhvZ29uYWwuXG4gKiAgIElmIGBNID49IE5gLFxuICogICAgIElmIGBmdWxsTWF0cmljZXNgIGlzIGBmYWxzZWAgKGRlZmF1bHQpLFxuICogICAgICAgLSBgUWAgaGFzIGEgc2hhcGUgb2YgYFsuLi4sIE0sIE5dYCxcbiAqICAgICAgIC0gYFJgIGhhcyBhIHNoYXBlIG9mIGBbLi4uLCBOLCBOXWAuXG4gKiAgICAgSWYgYGZ1bGxNYXRyaWNlc2AgaXMgYHRydWVgIChkZWZhdWx0KSxcbiAqICAgICAgIC0gYFFgIGhhcyBhIHNoYXBlIG9mIGBbLi4uLCBNLCBNXWAsXG4gKiAgICAgICAtIGBSYCBoYXMgYSBzaGFwZSBvZiBgWy4uLiwgTSwgTl1gLlxuICogICBJZiBgTSA8IE5gLFxuICogICAgIC0gYFFgIGhhcyBhIHNoYXBlIG9mIGBbLi4uLCBNLCBNXWAsXG4gKiAgICAgLSBgUmAgaGFzIGEgc2hhcGUgb2YgYFsuLi4sIE0sIE5dYC5cbiAqIEB0aHJvd3MgSWYgdGhlIHJhbmsgb2YgYHhgIGlzIGxlc3MgdGhhbiAyLlxuICpcbiAqIEBkb2Mge2hlYWRpbmc6J09wZXJhdGlvbnMnLFxuICogICAgICAgc3ViaGVhZGluZzonTGluZWFyIEFsZ2VicmEnLFxuICogICAgICAgbmFtZXNwYWNlOidsaW5hbGcnfVxuICovXG5mdW5jdGlvbiBxcl8oeDogVGVuc29yLCBmdWxsTWF0cmljZXMgPSBmYWxzZSk6IFtUZW5zb3IsIFRlbnNvcl0ge1xuICBhc3NlcnQoXG4gICAgICB4LnJhbmsgPj0gMixcbiAgICAgICgpID0+IGBxcigpIHJlcXVpcmVzIGlucHV0IHRlbnNvciB0byBoYXZlIGEgcmFuayA+PSAyLCBidXQgZ290IHJhbmsgJHtcbiAgICAgICAgICB4LnJhbmt9YCk7XG5cbiAgaWYgKHgucmFuayA9PT0gMikge1xuICAgIHJldHVybiBxcjJkKHggYXMgVGVuc29yMkQsIGZ1bGxNYXRyaWNlcyk7XG4gIH0gZWxzZSB7XG4gICAgLy8gUmFuayA+IDIuXG4gICAgLy8gVE9ETyhjYWlzKTogQmVsb3cgd2Ugc3BsaXQgdGhlIGlucHV0IGludG8gaW5kaXZpZHVhbCAyRCB0ZW5zb3JzLFxuICAgIC8vICAgcGVyZm9ybSBRUiBkZWNvbXBvc2l0aW9uIG9uIHRoZW0gYW5kIHRoZW4gc3RhY2sgdGhlIHJlc3VsdHMgYmFja1xuICAgIC8vICAgdG9nZXRoZXIuIFdlIHNob3VsZCBleHBsb3JlIHdoZXRoZXIgdGhpcyBjYW4gYmUgcGFyYWxsZWxpemVkLlxuICAgIGNvbnN0IG91dGVyRGltc1Byb2QgPSB4LnNoYXBlLnNsaWNlKDAsIHguc2hhcGUubGVuZ3RoIC0gMilcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC5yZWR1Y2UoKHZhbHVlLCBwcmV2KSA9PiB2YWx1ZSAqIHByZXYpO1xuICAgIGNvbnN0IHgyZHMgPSB1bnN0YWNrKFxuICAgICAgICByZXNoYXBlKFxuICAgICAgICAgICAgeCxcbiAgICAgICAgICAgIFtcbiAgICAgICAgICAgICAgb3V0ZXJEaW1zUHJvZCwgeC5zaGFwZVt4LnNoYXBlLmxlbmd0aCAtIDJdLFxuICAgICAgICAgICAgICB4LnNoYXBlW3guc2hhcGUubGVuZ3RoIC0gMV1cbiAgICAgICAgICAgIF0pLFxuICAgICAgICAwKTtcbiAgICBjb25zdCBxMmRzOiBUZW5zb3IyRFtdID0gW107XG4gICAgY29uc3QgcjJkczogVGVuc29yMkRbXSA9IFtdO1xuICAgIHgyZHMuZm9yRWFjaCh4MmQgPT4ge1xuICAgICAgY29uc3QgW3EyZCwgcjJkXSA9IHFyMmQoeDJkIGFzIFRlbnNvcjJELCBmdWxsTWF0cmljZXMpO1xuICAgICAgcTJkcy5wdXNoKHEyZCk7XG4gICAgICByMmRzLnB1c2gocjJkKTtcbiAgICB9KTtcbiAgICBjb25zdCBxID0gcmVzaGFwZShzdGFjayhxMmRzLCAwKSwgeC5zaGFwZSk7XG4gICAgY29uc3QgciA9IHJlc2hhcGUoc3RhY2socjJkcywgMCksIHguc2hhcGUpO1xuICAgIHJldHVybiBbcSwgcl07XG4gIH1cbn1cblxuZnVuY3Rpb24gcXIyZCh4OiBUZW5zb3IyRCwgZnVsbE1hdHJpY2VzID0gZmFsc2UpOiBbVGVuc29yMkQsIFRlbnNvcjJEXSB7XG4gIHJldHVybiBFTkdJTkUudGlkeSgoKSA9PiB7XG4gICAgYXNzZXJ0KFxuICAgICAgICB4LnNoYXBlLmxlbmd0aCA9PT0gMixcbiAgICAgICAgKCkgPT4gYHFyMmQoKSByZXF1aXJlcyBhIDJEIFRlbnNvciwgYnV0IGdvdCBhICR7XG4gICAgICAgICAgICB4LnNoYXBlLmxlbmd0aH1EIFRlbnNvci5gKTtcblxuICAgIGNvbnN0IG0gPSB4LnNoYXBlWzBdO1xuICAgIGNvbnN0IG4gPSB4LnNoYXBlWzFdO1xuXG4gICAgbGV0IHEgPSBleWUobSk7ICAgIC8vIE9ydGhvZ29uYWwgdHJhbnNmb3JtIHNvIGZhci5cbiAgICBsZXQgciA9IGNsb25lKHgpOyAgLy8gVHJhbnNmb3JtZWQgbWF0cml4IHNvIGZhci5cblxuICAgIGNvbnN0IG9uZTJEID0gdGVuc29yMmQoW1sxXV0sIFsxLCAxXSk7XG4gICAgbGV0IHc6IFRlbnNvcjJEID0gY2xvbmUob25lMkQpO1xuXG4gICAgY29uc3QgaXRlcnMgPSBtID49IG4gPyBuIDogbTtcbiAgICBmb3IgKGxldCBqID0gMDsgaiA8IGl0ZXJzOyArK2opIHtcbiAgICAgIC8vIFRoaXMgdGlkeSB3aXRoaW4gdGhlIGZvci1sb29wIGVuc3VyZXMgd2UgY2xlYW4gdXAgdGVtcG9yYXJ5XG4gICAgICAvLyB0ZW5zb3JzIGFzIHNvb24gYXMgdGhleSBhcmUgbm8gbG9uZ2VyIG5lZWRlZC5cbiAgICAgIGNvbnN0IHJUZW1wID0gcjtcbiAgICAgIGNvbnN0IHdUZW1wID0gdztcbiAgICAgIGNvbnN0IHFUZW1wID0gcTtcbiAgICAgIFt3LCByLCBxXSA9IEVOR0lORS50aWR5KCgpOiBbVGVuc29yMkQsIFRlbnNvcjJELCBUZW5zb3IyRF0gPT4ge1xuICAgICAgICAvLyBGaW5kIEggPSBJIC0gdGF1ICogdyAqIHcnLCB0byBwdXQgemVyb3MgYmVsb3cgUihqLCBqKS5cbiAgICAgICAgY29uc3QgcmpFbmQxID0gc2xpY2UociwgW2osIGpdLCBbbSAtIGosIDFdKTtcbiAgICAgICAgY29uc3Qgbm9ybVggPSBub3JtKHJqRW5kMSk7XG4gICAgICAgIGNvbnN0IHJqaiA9IHNsaWNlKHIsIFtqLCBqXSwgWzEsIDFdKTtcblxuICAgICAgICAvLyBUaGUgc2lnbigpIGZ1bmN0aW9uIHJldHVybnMgMCBvbiAwLCB3aGljaCBjYXVzZXMgZGl2aXNpb24gYnkgemVyby5cbiAgICAgICAgY29uc3QgcyA9IHdoZXJlKGdyZWF0ZXIocmpqLCAwKSwgdGVuc29yMmQoW1stMV1dKSwgdGVuc29yMmQoW1sxXV0pKTtcblxuICAgICAgICBjb25zdCB1MSA9IHN1YihyamosIG11bChzLCBub3JtWCkpO1xuICAgICAgICBjb25zdCB3UHJlID0gZGl2KHJqRW5kMSwgdTEpO1xuICAgICAgICBpZiAod1ByZS5zaGFwZVswXSA9PT0gMSkge1xuICAgICAgICAgIHcgPSBjbG9uZShvbmUyRCk7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgdyA9IGNvbmNhdChcbiAgICAgICAgICAgICAgW1xuICAgICAgICAgICAgICAgIG9uZTJELFxuICAgICAgICAgICAgICAgIHNsaWNlKHdQcmUsIFsxLCAwXSwgW3dQcmUuc2hhcGVbMF0gLSAxLCB3UHJlLnNoYXBlWzFdXSkgYXNcbiAgICAgICAgICAgICAgICAgICAgVGVuc29yMkRcbiAgICAgICAgICAgICAgXSxcbiAgICAgICAgICAgICAgMCk7XG4gICAgICAgIH1cbiAgICAgICAgY29uc3QgdGF1ID0gbmVnKGRpdihtYXRNdWwocywgdTEpLCBub3JtWCkpIGFzIFRlbnNvcjJEO1xuXG4gICAgICAgIC8vIC0tIFIgOj0gSFIsIFEgOj0gUUguXG4gICAgICAgIGNvbnN0IHJqRW5kQWxsID0gc2xpY2UociwgW2osIDBdLCBbbSAtIGosIG5dKTtcbiAgICAgICAgY29uc3QgdGF1VGltZXNXOiBUZW5zb3IyRCA9IG11bCh0YXUsIHcpO1xuICAgICAgICBjb25zdCB3VDogVGVuc29yMkQgPSB0cmFuc3Bvc2Uodyk7XG4gICAgICAgIGlmIChqID09PSAwKSB7XG4gICAgICAgICAgciA9IHN1YihyakVuZEFsbCwgbWF0TXVsKHRhdVRpbWVzVywgbWF0TXVsKHdULCByakVuZEFsbCkpKTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICBjb25zdCByVGltZXNUYXU6IFRlbnNvcjJEID1cbiAgICAgICAgICAgICAgc3ViKHJqRW5kQWxsLCBtYXRNdWwodGF1VGltZXNXLCBtYXRNdWwod1QsIHJqRW5kQWxsKSkpO1xuICAgICAgICAgIHIgPSBjb25jYXQoW3NsaWNlKHIsIFswLCAwXSwgW2osIG5dKSwgclRpbWVzVGF1XSwgMCk7XG4gICAgICAgIH1cbiAgICAgICAgY29uc3QgdGF3VGltZXNXVDogVGVuc29yMkQgPSB0cmFuc3Bvc2UodGF1VGltZXNXKTtcbiAgICAgICAgY29uc3QgcUFsbEpFbmQgPSBzbGljZShxLCBbMCwgal0sIFttLCBxLnNoYXBlWzFdIC0gal0pO1xuICAgICAgICBpZiAoaiA9PT0gMCkge1xuICAgICAgICAgIHEgPSBzdWIocUFsbEpFbmQsIG1hdE11bChtYXRNdWwocUFsbEpFbmQsIHcpLCB0YXdUaW1lc1dUKSk7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgY29uc3QgcVRpbWVzVGF1OiBUZW5zb3IyRCA9XG4gICAgICAgICAgICAgIHN1YihxQWxsSkVuZCwgbWF0TXVsKG1hdE11bChxQWxsSkVuZCwgdyksIHRhd1RpbWVzV1QpKTtcbiAgICAgICAgICBxID0gY29uY2F0KFtzbGljZShxLCBbMCwgMF0sIFttLCBqXSksIHFUaW1lc1RhdV0sIDEpO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBbdywgciwgcV07XG4gICAgICB9KTtcbiAgICAgIGRpc3Bvc2UoW3JUZW1wLCB3VGVtcCwgcVRlbXBdKTtcbiAgICB9XG5cbiAgICBpZiAoIWZ1bGxNYXRyaWNlcyAmJiBtID4gbikge1xuICAgICAgcSA9IHNsaWNlKHEsIFswLCAwXSwgW20sIG5dKTtcbiAgICAgIHIgPSBzbGljZShyLCBbMCwgMF0sIFtuLCBuXSk7XG4gICAgfVxuXG4gICAgcmV0dXJuIFtxLCByXTtcbiAgfSkgYXMgW1RlbnNvcjJELCBUZW5zb3IyRF07XG59XG5cbmV4cG9ydCBjb25zdCBxciA9IG9wKHtxcl99KTtcbiJdfQ==","import { convertToTensor } from '../../tensor_util_env';\nimport { cast } from '../cast';\nimport { div } from '../div';\nimport { Reduction } from '../loss_ops_utils';\nimport { mean } from '../mean';\nimport { mul } from '../mul';\nimport { notEqual } from '../not_equal';\nimport { ones } from '../ones';\nimport { op } from '../operation';\nimport { scalar } from '../scalar';\nimport { sum } from '../sum';\n/**\n * Computes the weighted loss between two tensors.\n *\n * @param losses Tensor of shape `[batch_size, d1, ..., dN]`.\n * @param weights Tensor whose rank is either 0, or the same rank as\n * `losses`, and must be broadcastable to `losses` (i.e., all\n * dimensions must be either `1`, or the same as the corresponding\n * `losses` dimension).\n *\n * @doc {heading: 'Training', subheading: 'Losses', namespace: 'losses'}\n */\nfunction computeWeightedLoss_(losses, weights, reduction = Reduction.SUM_BY_NONZERO_WEIGHTS) {\n const $losses = convertToTensor(losses, 'losses', 'computeWeightedLoss');\n let $weights = null;\n if (weights != null) {\n $weights = convertToTensor(weights, 'weights', 'computeWeightedLoss');\n }\n const weightedLoss = ($weights == null) ? $losses : mul($losses, $weights);\n if (reduction === Reduction.NONE) {\n return weightedLoss;\n }\n if (reduction === Reduction.SUM) {\n return sum(weightedLoss);\n }\n if (reduction === Reduction.MEAN) {\n if ($weights == null) {\n return mean(weightedLoss);\n }\n else {\n const broadcastFactor = $losses.size / $weights.size;\n const result = div(sum(weightedLoss), sum($weights));\n return broadcastFactor > 1 ? div(result, scalar(broadcastFactor)) :\n result;\n }\n }\n if (reduction === Reduction.SUM_BY_NONZERO_WEIGHTS) {\n if ($weights == null) {\n return div(sum(weightedLoss), scalar($losses.size));\n }\n else {\n const broadcastedWeights = mul($weights, ones($losses.shape));\n const numNonZeros = cast(sum(notEqual(broadcastedWeights, scalar(0))), 'float32');\n return div(sum(weightedLoss), numNonZeros);\n }\n }\n throw Error(`Unknown reduction: ${reduction}`);\n}\nexport const computeWeightedLoss = op({ computeWeightedLoss_ });\n//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY29tcHV0ZV93ZWlnaHRlZF9sb3NzLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vLi4vLi4vdGZqcy1jb3JlL3NyYy9vcHMvbG9zc2VzL2NvbXB1dGVfd2VpZ2h0ZWRfbG9zcy50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFpQkEsT0FBTyxFQUFDLGVBQWUsRUFBQyxNQUFNLHVCQUF1QixDQUFDO0FBR3RELE9BQU8sRUFBQyxJQUFJLEVBQUMsTUFBTSxTQUFTLENBQUM7QUFDN0IsT0FBTyxFQUFDLEdBQUcsRUFBQyxNQUFNLFFBQVEsQ0FBQztBQUMzQixPQUFPLEVBQUMsU0FBUyxFQUFDLE1BQU0sbUJBQW1CLENBQUM7QUFDNUMsT0FBTyxFQUFDLElBQUksRUFBQyxNQUFNLFNBQVMsQ0FBQztBQUM3QixPQUFPLEVBQUMsR0FBRyxFQUFDLE1BQU0sUUFBUSxDQUFDO0FBQzNCLE9BQU8sRUFBQyxRQUFRLEVBQUMsTUFBTSxjQUFjLENBQUM7QUFDdEMsT0FBTyxFQUFDLElBQUksRUFBQyxNQUFNLFNBQVMsQ0FBQztBQUM3QixPQUFPLEVBQUMsRUFBRSxFQUFDLE1BQU0sY0FBYyxDQUFDO0FBQ2hDLE9BQU8sRUFBQyxNQUFNLEVBQUMsTUFBTSxXQUFXLENBQUM7QUFDakMsT0FBTyxFQUFDLEdBQUcsRUFBQyxNQUFNLFFBQVEsQ0FBQztBQUUzQjs7Ozs7Ozs7OztHQVVHO0FBQ0gsU0FBUyxvQkFBb0IsQ0FDekIsTUFBb0IsRUFBRSxPQUEyQixFQUNqRCxTQUFTLEdBQUcsU0FBUyxDQUFDLHNCQUFzQjtJQUM5QyxNQUFNLE9BQU8sR0FBRyxlQUFlLENBQUMsTUFBTSxFQUFFLFFBQVEsRUFBRSxxQkFBcUIsQ0FBQyxDQUFDO0lBQ3pFLElBQUksUUFBUSxHQUFXLElBQUksQ0FBQztJQUM1QixJQUFJLE9BQU8sSUFBSSxJQUFJLEVBQUU7UUFDbkIsUUFBUSxHQUFHLGVBQWUsQ0FBQyxPQUFPLEVBQUUsU0FBUyxFQUFFLHFCQUFxQixDQUFDLENBQUM7S0FDdkU7SUFFRCxNQUFNLFlBQVksR0FBRyxDQUFDLFFBQVEsSUFBSSxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUMsT0FBTyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsT0FBTyxFQUFFLFFBQVEsQ0FBQyxDQUFDO0lBRTNFLElBQUksU0FBUyxLQUFLLFNBQVMsQ0FBQyxJQUFJLEVBQUU7UUFDaEMsT0FBTyxZQUFpQixDQUFDO0tBQzFCO0lBQ0QsSUFBSSxTQUFTLEtBQUssU0FBUyxDQUFDLEdBQUcsRUFBRTtRQUMvQixPQUFPLEdBQUcsQ0FBQyxZQUFZLENBQUMsQ0FBQztLQUMxQjtJQUNELElBQUksU0FBUyxLQUFLLFNBQVMsQ0FBQyxJQUFJLEVBQUU7UUFDaEMsSUFBSSxRQUFRLElBQUksSUFBSSxFQUFFO1lBQ3BCLE9BQU8sSUFBSSxDQUFDLFlBQVksQ0FBQyxDQUFDO1NBQzNCO2FBQU07WUFDTCxNQUFNLGVBQWUsR0FBRyxPQUFPLENBQUMsSUFBSSxHQUFHLFFBQVEsQ0FBQyxJQUFJLENBQUM7WUFDckQsTUFBTSxNQUFNLEdBQUcsR0FBRyxDQUFDLEdBQUcsQ0FBQyxZQUFZLENBQUMsRUFBRSxHQUFHLENBQUMsUUFBUSxDQUFDLENBQUMsQ0FBQztZQUNyRCxPQUFPLGVBQWUsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxNQUFNLEVBQUUsTUFBTSxDQUFDLGVBQWUsQ0FBQyxDQUFDLENBQUMsQ0FBQztnQkFDdEMsTUFBVyxDQUFDO1NBQzFDO0tBQ0Y7SUFDRCxJQUFJLFNBQVMsS0FBSyxTQUFTLENBQUMsc0JBQXNCLEVBQUU7UUFDbEQsSUFBSSxRQUFRLElBQUksSUFBSSxFQUFFO1lBQ3BCLE9BQU8sR0FBRyxDQUFDLEdBQUcsQ0FBQyxZQUFZLENBQUMsRUFBRSxNQUFNLENBQUMsT0FBTyxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUM7U0FDckQ7YUFBTTtZQUNMLE1BQU0sa0JBQWtCLEdBQUcsR0FBRyxDQUFDLFFBQVEsRUFBRSxJQUFJLENBQUMsT0FBTyxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUM7WUFFOUQsTUFBTSxXQUFXLEdBQ2IsSUFBSSxDQUFDLEdBQUcsQ0FBQyxRQUFRLENBQUMsa0JBQWtCLEVBQUUsTUFBTSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsRUFBRSxTQUFTLENBQUMsQ0FBQztZQUNsRSxPQUFPLEdBQUcsQ0FBQyxHQUFHLENBQUMsWUFBWSxDQUFDLEVBQUUsV0FBVyxDQUFDLENBQUM7U0FDNUM7S0FDRjtJQUVELE1BQU0sS0FBSyxDQUFDLHNCQUFzQixTQUFTLEVBQUUsQ0FBQyxDQUFDO0FBQ2pELENBQUM7QUFDRCxNQUFNLENBQUMsTUFBTSxtQkFBbUIsR0FBRyxFQUFFLENBQUMsRUFBQyxvQkFBb0IsRUFBQyxDQUFDLENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyIvKipcbiAqIEBsaWNlbnNlXG4gKiBDb3B5cmlnaHQgMjAyMCBHb29nbGUgTExDLiBBbGwgUmlnaHRzIFJlc2VydmVkLlxuICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlIFwiTGljZW5zZVwiKTtcbiAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS5cbiAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdFxuICpcbiAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMFxuICpcbiAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmVcbiAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuIFwiQVMgSVNcIiBCQVNJUyxcbiAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLlxuICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZFxuICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuXG4gKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuICovXG5pbXBvcnQge1RlbnNvcn0gZnJvbSAnLi4vLi4vdGVuc29yJztcbmltcG9ydCB7Y29udmVydFRvVGVuc29yfSBmcm9tICcuLi8uLi90ZW5zb3JfdXRpbF9lbnYnO1xuaW1wb3J0IHtUZW5zb3JMaWtlfSBmcm9tICcuLi8uLi90eXBlcyc7XG5cbmltcG9ydCB7Y2FzdH0gZnJvbSAnLi4vY2FzdCc7XG5pbXBvcnQge2Rpdn0gZnJvbSAnLi4vZGl2JztcbmltcG9ydCB7UmVkdWN0aW9ufSBmcm9tICcuLi9sb3NzX29wc191dGlscyc7XG5pbXBvcnQge21lYW59IGZyb20gJy4uL21lYW4nO1xuaW1wb3J0IHttdWx9IGZyb20gJy4uL211bCc7XG5pbXBvcnQge25vdEVxdWFsfSBmcm9tICcuLi9ub3RfZXF1YWwnO1xuaW1wb3J0IHtvbmVzfSBmcm9tICcuLi9vbmVzJztcbmltcG9ydCB7b3B9IGZyb20gJy4uL29wZXJhdGlvbic7XG5pbXBvcnQge3NjYWxhcn0gZnJvbSAnLi4vc2NhbGFyJztcbmltcG9ydCB7c3VtfSBmcm9tICcuLi9zdW0nO1xuXG4vKipcbiAqIENvbXB1dGVzIHRoZSB3ZWlnaHRlZCBsb3NzIGJldHdlZW4gdHdvIHRlbnNvcnMuXG4gKlxuICogQHBhcmFtIGxvc3NlcyBUZW5zb3Igb2Ygc2hhcGUgYFtiYXRjaF9zaXplLCBkMSwgLi4uLCBkTl1gLlxuICogQHBhcmFtIHdlaWdodHMgVGVuc29yIHdob3NlIHJhbmsgaXMgZWl0aGVyIDAsIG9yIHRoZSBzYW1lIHJhbmsgYXNcbiAqICAgIGBsb3NzZXNgLCBhbmQgbXVzdCBiZSBicm9hZGNhc3RhYmxlIHRvIGBsb3NzZXNgIChpLmUuLCBhbGxcbiAqICAgIGRpbWVuc2lvbnMgbXVzdCBiZSBlaXRoZXIgYDFgLCBvciB0aGUgc2FtZSBhcyB0aGUgY29ycmVzcG9uZGluZ1xuICogICAgYGxvc3Nlc2AgZGltZW5zaW9uKS5cbiAqXG4gKiBAZG9jIHtoZWFkaW5nOiAnVHJhaW5pbmcnLCBzdWJoZWFkaW5nOiAnTG9zc2VzJywgbmFtZXNwYWNlOiAnbG9zc2VzJ31cbiAqL1xuZnVuY3Rpb24gY29tcHV0ZVdlaWdodGVkTG9zc188VCBleHRlbmRzIFRlbnNvciwgTyBleHRlbmRzIFRlbnNvcj4oXG4gICAgbG9zc2VzOiBUfFRlbnNvckxpa2UsIHdlaWdodHM/OiBUZW5zb3J8VGVuc29yTGlrZSxcbiAgICByZWR1Y3Rpb24gPSBSZWR1Y3Rpb24uU1VNX0JZX05PTlpFUk9fV0VJR0hUUyk6IE8ge1xuICBjb25zdCAkbG9zc2VzID0gY29udmVydFRvVGVuc29yKGxvc3NlcywgJ2xvc3NlcycsICdjb21wdXRlV2VpZ2h0ZWRMb3NzJyk7XG4gIGxldCAkd2VpZ2h0czogVGVuc29yID0gbnVsbDtcbiAgaWYgKHdlaWdodHMgIT0gbnVsbCkge1xuICAgICR3ZWlnaHRzID0gY29udmVydFRvVGVuc29yKHdlaWdodHMsICd3ZWlnaHRzJywgJ2NvbXB1dGVXZWlnaHRlZExvc3MnKTtcbiAgfVxuXG4gIGNvbnN0IHdlaWdodGVkTG9zcyA9ICgkd2VpZ2h0cyA9PSBudWxsKSA/ICRsb3NzZXMgOiBtdWwoJGxvc3NlcywgJHdlaWdodHMpO1xuXG4gIGlmIChyZWR1Y3Rpb24gPT09IFJlZHVjdGlvbi5OT05FKSB7XG4gICAgcmV0dXJuIHdlaWdodGVkTG9zcyBhcyBPO1xuICB9XG4gIGlmIChyZWR1Y3Rpb24gPT09IFJlZHVjdGlvbi5TVU0pIHtcbiAgICByZXR1cm4gc3VtKHdlaWdodGVkTG9zcyk7XG4gIH1cbiAgaWYgKHJlZHVjdGlvbiA9PT0gUmVkdWN0aW9uLk1FQU4pIHtcbiAgICBpZiAoJHdlaWdodHMgPT0gbnVsbCkge1xuICAgICAgcmV0dXJuIG1lYW4od2VpZ2h0ZWRMb3NzKTtcbiAgICB9IGVsc2Uge1xuICAgICAgY29uc3QgYnJvYWRjYXN0RmFjdG9yID0gJGxvc3Nlcy5zaXplIC8gJHdlaWdodHMuc2l6ZTtcbiAgICAgIGNvbnN0IHJlc3VsdCA9IGRpdihzdW0od2VpZ2h0ZWRMb3NzKSwgc3VtKCR3ZWlnaHRzKSk7XG4gICAgICByZXR1cm4gYnJvYWRjYXN0RmFjdG9yID4gMSA/IGRpdihyZXN1bHQsIHNjYWxhcihicm9hZGNhc3RGYWN0b3IpKSA6XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlc3VsdCBhcyBPO1xuICAgIH1cbiAgfVxuICBpZiAocmVkdWN0aW9uID09PSBSZWR1Y3Rpb24uU1VNX0JZX05PTlpFUk9fV0VJR0hUUykge1xuICAgIGlmICgkd2VpZ2h0cyA9PSBudWxsKSB7XG4gICAgICByZXR1cm4gZGl2KHN1bSh3ZWlnaHRlZExvc3MpLCBzY2FsYXIoJGxvc3Nlcy5zaXplKSk7XG4gICAgfSBlbHNlIHtcbiAgICAgIGNvbnN0IGJyb2FkY2FzdGVkV2VpZ2h0cyA9IG11bCgkd2VpZ2h0cywgb25lcygkbG9zc2VzLnNoYXBlKSk7XG5cbiAgICAgIGNvbnN0IG51bU5vblplcm9zID1cbiAgICAgICAgICBjYXN0KHN1bShub3RFcXVhbChicm9hZGNhc3RlZFdlaWdodHMsIHNjYWxhcigwKSkpLCAnZmxvYXQzMicpO1xuICAgICAgcmV0dXJuIGRpdihzdW0od2VpZ2h0ZWRMb3NzKSwgbnVtTm9uWmVyb3MpO1xuICAgIH1cbiAgfVxuXG4gIHRocm93IEVycm9yKGBVbmtub3duIHJlZHVjdGlvbjogJHtyZWR1Y3Rpb259YCk7XG59XG5leHBvcnQgY29uc3QgY29tcHV0ZVdlaWdodGVkTG9zcyA9IG9wKHtjb21wdXRlV2VpZ2h0ZWRMb3NzX30pO1xuIl19","/**\n * @license\n * Copyright 2020 Google LLC. All Rights Reserved.\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n * =============================================================================\n */\nimport { convertToTensor } from '../../tensor_util_env';\nimport { assertShapesMatch } from '../../util';\nimport { abs } from '../abs';\nimport { Reduction } from '../loss_ops_utils';\nimport { op } from '../operation';\nimport { sub } from '../sub';\nimport { computeWeightedLoss } from './compute_weighted_loss';\n/**\n * Computes the absolute difference loss between two tensors.\n *\n * @param labels The ground truth output tensor, same dimensions as\n * 'predictions'.\n * @param predictions The predicted outputs.\n * @param weights Tensor whose rank is either 0, or the same rank as\n * `labels`, and must be broadcastable to `labels` (i.e., all dimensions\n * must be either `1`, or the same as the corresponding `losses`\n * dimension).\n * @param reduction Type of reduction to apply to loss. Should be of type\n * `Reduction`\n *\n * @doc {heading: 'Training', subheading: 'Losses', namespace: 'losses'}\n */\nfunction absoluteDifference_(labels, predictions, weights, reduction = Reduction.SUM_BY_NONZERO_WEIGHTS) {\n const $labels = convertToTensor(labels, 'labels', 'absoluteDifference');\n const $predictions = convertToTensor(predictions, 'predictions', 'absoluteDifference');\n let $weights = null;\n if (weights != null) {\n $weights = convertToTensor(weights, 'weights', 'absoluteDifference');\n }\n assertShapesMatch($labels.shape, $predictions.shape, 'Error in absoluteDifference: ');\n const losses = abs(sub($labels, $predictions));\n return computeWeightedLoss(losses, $weights, reduction);\n}\nexport const absoluteDifference = op({ absoluteDifference_ });\n//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYWJzb2x1dGVfZGlmZmVyZW5jZS5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uLy4uLy4uL3RmanMtY29yZS9zcmMvb3BzL2xvc3Nlcy9hYnNvbHV0ZV9kaWZmZXJlbmNlLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBOzs7Ozs7Ozs7Ozs7Ozs7R0FlRztBQUdILE9BQU8sRUFBQyxlQUFlLEVBQUMsTUFBTSx1QkFBdUIsQ0FBQztBQUV0RCxPQUFPLEVBQUMsaUJBQWlCLEVBQUMsTUFBTSxZQUFZLENBQUM7QUFDN0MsT0FBTyxFQUFDLEdBQUcsRUFBQyxNQUFNLFFBQVEsQ0FBQztBQUMzQixPQUFPLEVBQUMsU0FBUyxFQUFDLE1BQU0sbUJBQW1CLENBQUM7QUFDNUMsT0FBTyxFQUFDLEVBQUUsRUFBQyxNQUFNLGNBQWMsQ0FBQztBQUNoQyxPQUFPLEVBQUMsR0FBRyxFQUFDLE1BQU0sUUFBUSxDQUFDO0FBRTNCLE9BQU8sRUFBQyxtQkFBbUIsRUFBQyxNQUFNLHlCQUF5QixDQUFDO0FBRTVEOzs7Ozs7Ozs7Ozs7OztHQWNHO0FBQ0gsU0FBUyxtQkFBbUIsQ0FDeEIsTUFBb0IsRUFBRSxXQUF5QixFQUMvQyxPQUEyQixFQUMzQixTQUFTLEdBQUcsU0FBUyxDQUFDLHNCQUFzQjtJQUM5QyxNQUFNLE9BQU8sR0FBRyxlQUFlLENBQUMsTUFBTSxFQUFFLFFBQVEsRUFBRSxvQkFBb0IsQ0FBQyxDQUFDO0lBQ3hFLE1BQU0sWUFBWSxHQUNkLGVBQWUsQ0FBQyxXQUFXLEVBQUUsYUFBYSxFQUFFLG9CQUFvQixDQUFDLENBQUM7SUFDdEUsSUFBSSxRQUFRLEdBQVcsSUFBSSxDQUFDO0lBQzVCLElBQUksT0FBTyxJQUFJLElBQUksRUFBRTtRQUNuQixRQUFRLEdBQUcsZUFBZSxDQUFDLE9BQU8sRUFBRSxTQUFTLEVBQUUsb0JBQW9CLENBQUMsQ0FBQztLQUN0RTtJQUNELGlCQUFpQixDQUNiLE9BQU8sQ0FBQyxLQUFLLEVBQUUsWUFBWSxDQUFDLEtBQUssRUFBRSwrQkFBK0IsQ0FBQyxDQUFDO0lBRXhFLE1BQU0sTUFBTSxHQUFHLEdBQUcsQ0FBQyxHQUFHLENBQUMsT0FBTyxFQUFFLFlBQVksQ0FBQyxDQUFDLENBQUM7SUFDL0MsT0FBTyxtQkFBbUIsQ0FBQyxNQUFNLEVBQUUsUUFBUSxFQUFFLFNBQVMsQ0FBQyxDQUFDO0FBQzFELENBQUM7QUFFRCxNQUFNLENBQUMsTUFBTSxrQkFBa0IsR0FBRyxFQUFFLENBQUMsRUFBQyxtQkFBbUIsRUFBQyxDQUFDLENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyIvKipcbiAqIEBsaWNlbnNlXG4gKiBDb3B5cmlnaHQgMjAyMCBHb29nbGUgTExDLiBBbGwgUmlnaHRzIFJlc2VydmVkLlxuICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlIFwiTGljZW5zZVwiKTtcbiAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS5cbiAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdFxuICpcbiAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMFxuICpcbiAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmVcbiAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuIFwiQVMgSVNcIiBCQVNJUyxcbiAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLlxuICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZFxuICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuXG4gKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuICovXG5cbmltcG9ydCB7VGVuc29yfSBmcm9tICcuLi8uLi90ZW5zb3InO1xuaW1wb3J0IHtjb252ZXJ0VG9UZW5zb3J9IGZyb20gJy4uLy4uL3RlbnNvcl91dGlsX2Vudic7XG5pbXBvcnQge1RlbnNvckxpa2V9IGZyb20gJy4uLy4uL3R5cGVzJztcbmltcG9ydCB7YXNzZXJ0U2hhcGVzTWF0Y2h9IGZyb20gJy4uLy4uL3V0aWwnO1xuaW1wb3J0IHthYnN9IGZyb20gJy4uL2Ficyc7XG5pbXBvcnQge1JlZHVjdGlvbn0gZnJvbSAnLi4vbG9zc19vcHNfdXRpbHMnO1xuaW1wb3J0IHtvcH0gZnJvbSAnLi4vb3BlcmF0aW9uJztcbmltcG9ydCB7c3VifSBmcm9tICcuLi9zdWInO1xuXG5pbXBvcnQge2NvbXB1dGVXZWlnaHRlZExvc3N9IGZyb20gJy4vY29tcHV0ZV93ZWlnaHRlZF9sb3NzJztcblxuLyoqXG4gKiBDb21wdXRlcyB0aGUgYWJzb2x1dGUgZGlmZmVyZW5jZSBsb3NzIGJldHdlZW4gdHdvIHRlbnNvcnMuXG4gKlxuICogQHBhcmFtIGxhYmVscyBUaGUgZ3JvdW5kIHRydXRoIG91dHB1dCB0ZW5zb3IsIHNhbWUgZGltZW5zaW9ucyBhc1xuICogICAgJ3ByZWRpY3Rpb25zJy5cbiAqIEBwYXJhbSBwcmVkaWN0aW9ucyBUaGUgcHJlZGljdGVkIG91dHB1dHMuXG4gKiBAcGFyYW0gd2VpZ2h0cyBUZW5zb3Igd2hvc2UgcmFuayBpcyBlaXRoZXIgMCwgb3IgdGhlIHNhbWUgcmFuayBhc1xuICogICAgYGxhYmVsc2AsIGFuZCBtdXN0IGJlIGJyb2FkY2FzdGFibGUgdG8gYGxhYmVsc2AgKGkuZS4sIGFsbCBkaW1lbnNpb25zXG4gKiAgICBtdXN0IGJlIGVpdGhlciBgMWAsIG9yIHRoZSBzYW1lIGFzIHRoZSBjb3JyZXNwb25kaW5nIGBsb3NzZXNgXG4gKiAgICBkaW1lbnNpb24pLlxuICogQHBhcmFtIHJlZHVjdGlvbiBUeXBlIG9mIHJlZHVjdGlvbiB0byBhcHBseSB0byBsb3NzLiBTaG91bGQgYmUgb2YgdHlwZVxuICogICAgYFJlZHVjdGlvbmBcbiAqXG4gKiBAZG9jIHtoZWFkaW5nOiAnVHJhaW5pbmcnLCBzdWJoZWFkaW5nOiAnTG9zc2VzJywgbmFtZXNwYWNlOiAnbG9zc2VzJ31cbiAqL1xuZnVuY3Rpb24gYWJzb2x1dGVEaWZmZXJlbmNlXzxUIGV4dGVuZHMgVGVuc29yLCBPIGV4dGVuZHMgVGVuc29yPihcbiAgICBsYWJlbHM6IFR8VGVuc29yTGlrZSwgcHJlZGljdGlvbnM6IFR8VGVuc29yTGlrZSxcbiAgICB3ZWlnaHRzPzogVGVuc29yfFRlbnNvckxpa2UsXG4gICAgcmVkdWN0aW9uID0gUmVkdWN0aW9uLlNVTV9CWV9OT05aRVJPX1dFSUdIVFMpOiBPIHtcbiAgY29uc3QgJGxhYmVscyA9IGNvbnZlcnRUb1RlbnNvcihsYWJlbHMsICdsYWJlbHMnLCAnYWJzb2x1dGVEaWZmZXJlbmNlJyk7XG4gIGNvbnN0ICRwcmVkaWN0aW9ucyA9XG4gICAgICBjb252ZXJ0VG9UZW5zb3IocHJlZGljdGlvbnMsICdwcmVkaWN0aW9ucycsICdhYnNvbHV0ZURpZmZlcmVuY2UnKTtcbiAgbGV0ICR3ZWlnaHRzOiBUZW5zb3IgPSBudWxsO1xuICBpZiAod2VpZ2h0cyAhPSBudWxsKSB7XG4gICAgJHdlaWdodHMgPSBjb252ZXJ0VG9UZW5zb3Iod2VpZ2h0cywgJ3dlaWdodHMnLCAnYWJzb2x1dGVEaWZmZXJlbmNlJyk7XG4gIH1cbiAgYXNzZXJ0U2hhcGVzTWF0Y2goXG4gICAgICAkbGFiZWxzLnNoYXBlLCAkcHJlZGljdGlvbnMuc2hhcGUsICdFcnJvciBpbiBhYnNvbHV0ZURpZmZlcmVuY2U6ICcpO1xuXG4gIGNvbnN0IGxvc3NlcyA9IGFicyhzdWIoJGxhYmVscywgJHByZWRpY3Rpb25zKSk7XG4gIHJldHVybiBjb21wdXRlV2VpZ2h0ZWRMb3NzKGxvc3NlcywgJHdlaWdodHMsIHJlZHVjdGlvbik7XG59XG5cbmV4cG9ydCBjb25zdCBhYnNvbHV0ZURpZmZlcmVuY2UgPSBvcCh7YWJzb2x1dGVEaWZmZXJlbmNlX30pO1xuIl19","import { convertToTensor } from '../../tensor_util_env';\nimport { assertShapesMatch } from '../../util';\nimport { Reduction } from '../loss_ops_utils';\nimport { mul } from '../mul';\nimport { op } from '../operation';\nimport { scalar } from '../scalar';\nimport { sub } from '../sub';\nimport { sum } from '../sum';\nimport { computeWeightedLoss } from './compute_weighted_loss';\n/**\n * Computes the cosine distance loss between two tensors.\n *\n * @param labels The ground truth output tensor, same dimensions as\n * 'predictions'.\n * @param predictions The predicted outputs.\n * @param axis The dimension along which the cosine distance is computed.\n * @param weights Tensor whose rank is either 0, or the same rank as\n * `labels`, and must be broadcastable to `labels` (i.e., all dimensions\n * must be either `1`, or the same as the corresponding `losses`\n * dimension).\n * @param reduction Type of reduction to apply to loss. Should be of type\n * `Reduction`\n *\n * @doc {heading: 'Training', subheading: 'Losses', namespace: 'losses'}\n */\nfunction cosineDistance_(labels, predictions, axis, weights, reduction = Reduction.SUM_BY_NONZERO_WEIGHTS) {\n const $labels = convertToTensor(labels, 'labels', 'cosineDistance');\n const $predictions = convertToTensor(predictions, 'predictions', 'cosineDistance');\n let $weights = null;\n if (weights != null) {\n $weights = convertToTensor(weights, 'weights', 'cosineDistance');\n }\n assertShapesMatch($labels.shape, $predictions.shape, 'Error in cosineDistance: ');\n const one = scalar(1);\n const losses = sub(one, sum(mul($labels, $predictions), axis, true));\n return computeWeightedLoss(losses, $weights, reduction);\n}\nexport const cosineDistance = op({ cosineDistance_ });\n//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY29zaW5lX2Rpc3RhbmNlLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vLi4vLi4vdGZqcy1jb3JlL3NyYy9vcHMvbG9zc2VzL2Nvc2luZV9kaXN0YW5jZS50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFpQkEsT0FBTyxFQUFDLGVBQWUsRUFBQyxNQUFNLHVCQUF1QixDQUFDO0FBRXRELE9BQU8sRUFBQyxpQkFBaUIsRUFBQyxNQUFNLFlBQVksQ0FBQztBQUM3QyxPQUFPLEVBQUMsU0FBUyxFQUFDLE1BQU0sbUJBQW1CLENBQUM7QUFDNUMsT0FBTyxFQUFDLEdBQUcsRUFBQyxNQUFNLFFBQVEsQ0FBQztBQUMzQixPQUFPLEVBQUMsRUFBRSxFQUFDLE1BQU0sY0FBYyxDQUFDO0FBQ2hDLE9BQU8sRUFBQyxNQUFNLEVBQUMsTUFBTSxXQUFXLENBQUM7QUFDakMsT0FBTyxFQUFDLEdBQUcsRUFBQyxNQUFNLFFBQVEsQ0FBQztBQUMzQixPQUFPLEVBQUMsR0FBRyxFQUFDLE1BQU0sUUFBUSxDQUFDO0FBRTNCLE9BQU8sRUFBQyxtQkFBbUIsRUFBQyxNQUFNLHlCQUF5QixDQUFDO0FBRTVEOzs7Ozs7Ozs7Ozs7Ozs7R0FlRztBQUNILFNBQVMsZUFBZSxDQUNwQixNQUFvQixFQUFFLFdBQXlCLEVBQUUsSUFBWSxFQUM3RCxPQUEyQixFQUMzQixTQUFTLEdBQUcsU0FBUyxDQUFDLHNCQUFzQjtJQUM5QyxNQUFNLE9BQU8sR0FBRyxlQUFlLENBQUMsTUFBTSxFQUFFLFFBQVEsRUFBRSxnQkFBZ0IsQ0FBQyxDQUFDO0lBQ3BFLE1BQU0sWUFBWSxHQUNkLGVBQWUsQ0FBQyxXQUFXLEVBQUUsYUFBYSxFQUFFLGdCQUFnQixDQUFDLENBQUM7SUFDbEUsSUFBSSxRQUFRLEdBQVcsSUFBSSxDQUFDO0lBQzVCLElBQUksT0FBTyxJQUFJLElBQUksRUFBRTtRQUNuQixRQUFRLEdBQUcsZUFBZSxDQUFDLE9BQU8sRUFBRSxTQUFTLEVBQUUsZ0JBQWdCLENBQUMsQ0FBQztLQUNsRTtJQUNELGlCQUFpQixDQUNiLE9BQU8sQ0FBQyxLQUFLLEVBQUUsWUFBWSxDQUFDLEtBQUssRUFBRSwyQkFBMkIsQ0FBQyxDQUFDO0lBRXBFLE1BQU0sR0FBRyxHQUFHLE1BQU0sQ0FBQyxDQUFDLENBQUMsQ0FBQztJQUN0QixNQUFNLE1BQU0sR0FBRyxHQUFHLENBQUMsR0FBRyxFQUFFLEdBQUcsQ0FBQyxHQUFHLENBQUMsT0FBTyxFQUFFLFlBQVksQ0FBQyxFQUFFLElBQUksRUFBRSxJQUFJLENBQUMsQ0FBQyxDQUFDO0lBQ3JFLE9BQU8sbUJBQW1CLENBQUMsTUFBTSxFQUFFLFFBQVEsRUFBRSxTQUFTLENBQUMsQ0FBQztBQUMxRCxDQUFDO0FBQ0QsTUFBTSxDQUFDLE1BQU0sY0FBYyxHQUFHLEVBQUUsQ0FBQyxFQUFDLGVBQWUsRUFBQyxDQUFDLENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyIvKipcbiAqIEBsaWNlbnNlXG4gKiBDb3B5cmlnaHQgMjAyMCBHb29nbGUgTExDLiBBbGwgUmlnaHRzIFJlc2VydmVkLlxuICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlIFwiTGljZW5zZVwiKTtcbiAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS5cbiAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdFxuICpcbiAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMFxuICpcbiAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmVcbiAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuIFwiQVMgSVNcIiBCQVNJUyxcbiAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLlxuICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZFxuICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuXG4gKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuICovXG5pbXBvcnQge1RlbnNvcn0gZnJvbSAnLi4vLi4vdGVuc29yJztcbmltcG9ydCB7Y29udmVydFRvVGVuc29yfSBmcm9tICcuLi8uLi90ZW5zb3JfdXRpbF9lbnYnO1xuaW1wb3J0IHtUZW5zb3JMaWtlfSBmcm9tICcuLi8uLi90eXBlcyc7XG5pbXBvcnQge2Fzc2VydFNoYXBlc01hdGNofSBmcm9tICcuLi8uLi91dGlsJztcbmltcG9ydCB7UmVkdWN0aW9ufSBmcm9tICcuLi9sb3NzX29wc191dGlscyc7XG5pbXBvcnQge211bH0gZnJvbSAnLi4vbXVsJztcbmltcG9ydCB7b3B9IGZyb20gJy4uL29wZXJhdGlvbic7XG5pbXBvcnQge3NjYWxhcn0gZnJvbSAnLi4vc2NhbGFyJztcbmltcG9ydCB7c3VifSBmcm9tICcuLi9zdWInO1xuaW1wb3J0IHtzdW19IGZyb20gJy4uL3N1bSc7XG5cbmltcG9ydCB7Y29tcHV0ZVdlaWdodGVkTG9zc30gZnJvbSAnLi9jb21wdXRlX3dlaWdodGVkX2xvc3MnO1xuXG4vKipcbiAqIENvbXB1dGVzIHRoZSBjb3NpbmUgZGlzdGFuY2UgbG9zcyBiZXR3ZWVuIHR3byB0ZW5zb3JzLlxuICpcbiAqIEBwYXJhbSBsYWJlbHMgVGhlIGdyb3VuZCB0cnV0aCBvdXRwdXQgdGVuc29yLCBzYW1lIGRpbWVuc2lvbnMgYXNcbiAqICAgICdwcmVkaWN0aW9ucycuXG4gKiBAcGFyYW0gcHJlZGljdGlvbnMgVGhlIHByZWRpY3RlZCBvdXRwdXRzLlxuICogQHBhcmFtIGF4aXMgVGhlIGRpbWVuc2lvbiBhbG9uZyB3aGljaCB0aGUgY29zaW5lIGRpc3RhbmNlIGlzIGNvbXB1dGVkLlxuICogQHBhcmFtIHdlaWdodHMgVGVuc29yIHdob3NlIHJhbmsgaXMgZWl0aGVyIDAsIG9yIHRoZSBzYW1lIHJhbmsgYXNcbiAqICAgIGBsYWJlbHNgLCBhbmQgbXVzdCBiZSBicm9hZGNhc3RhYmxlIHRvIGBsYWJlbHNgIChpLmUuLCBhbGwgZGltZW5zaW9uc1xuICogICAgbXVzdCBiZSBlaXRoZXIgYDFgLCBvciB0aGUgc2FtZSBhcyB0aGUgY29ycmVzcG9uZGluZyBgbG9zc2VzYFxuICogICAgZGltZW5zaW9uKS5cbiAqIEBwYXJhbSByZWR1Y3Rpb24gVHlwZSBvZiByZWR1Y3Rpb24gdG8gYXBwbHkgdG8gbG9zcy4gU2hvdWxkIGJlIG9mIHR5cGVcbiAqICAgIGBSZWR1Y3Rpb25gXG4gKlxuICogQGRvYyB7aGVhZGluZzogJ1RyYWluaW5nJywgc3ViaGVhZGluZzogJ0xvc3NlcycsIG5hbWVzcGFjZTogJ2xvc3Nlcyd9XG4gKi9cbmZ1bmN0aW9uIGNvc2luZURpc3RhbmNlXzxUIGV4dGVuZHMgVGVuc29yLCBPIGV4dGVuZHMgVGVuc29yPihcbiAgICBsYWJlbHM6IFR8VGVuc29yTGlrZSwgcHJlZGljdGlvbnM6IFR8VGVuc29yTGlrZSwgYXhpczogbnVtYmVyLFxuICAgIHdlaWdodHM/OiBUZW5zb3J8VGVuc29yTGlrZSxcbiAgICByZWR1Y3Rpb24gPSBSZWR1Y3Rpb24uU1VNX0JZX05PTlpFUk9fV0VJR0hUUyk6IE8ge1xuICBjb25zdCAkbGFiZWxzID0gY29udmVydFRvVGVuc29yKGxhYmVscywgJ2xhYmVscycsICdjb3NpbmVEaXN0YW5jZScpO1xuICBjb25zdCAkcHJlZGljdGlvbnMgPVxuICAgICAgY29udmVydFRvVGVuc29yKHByZWRpY3Rpb25zLCAncHJlZGljdGlvbnMnLCAnY29zaW5lRGlzdGFuY2UnKTtcbiAgbGV0ICR3ZWlnaHRzOiBUZW5zb3IgPSBudWxsO1xuICBpZiAod2VpZ2h0cyAhPSBudWxsKSB7XG4gICAgJHdlaWdodHMgPSBjb252ZXJ0VG9UZW5zb3Iod2VpZ2h0cywgJ3dlaWdodHMnLCAnY29zaW5lRGlzdGFuY2UnKTtcbiAgfVxuICBhc3NlcnRTaGFwZXNNYXRjaChcbiAgICAgICRsYWJlbHMuc2hhcGUsICRwcmVkaWN0aW9ucy5zaGFwZSwgJ0Vycm9yIGluIGNvc2luZURpc3RhbmNlOiAnKTtcblxuICBjb25zdCBvbmUgPSBzY2FsYXIoMSk7XG4gIGNvbnN0IGxvc3NlcyA9IHN1YihvbmUsIHN1bShtdWwoJGxhYmVscywgJHByZWRpY3Rpb25zKSwgYXhpcywgdHJ1ZSkpO1xuICByZXR1cm4gY29tcHV0ZVdlaWdodGVkTG9zcyhsb3NzZXMsICR3ZWlnaHRzLCByZWR1Y3Rpb24pO1xufVxuZXhwb3J0IGNvbnN0IGNvc2luZURpc3RhbmNlID0gb3Aoe2Nvc2luZURpc3RhbmNlX30pO1xuIl19","import { convertToTensor } from '../../tensor_util_env';\nimport { assertShapesMatch } from '../../util';\nimport { Reduction } from '../loss_ops_utils';\nimport { mul } from '../mul';\nimport { op } from '../operation';\nimport { relu } from '../relu';\nimport { scalar } from '../scalar';\nimport { sub } from '../sub';\nimport { computeWeightedLoss } from './compute_weighted_loss';\n/**\n * Computes the Hinge loss between two tensors.\n *\n * @param labels The ground truth output tensor, same dimensions as\n * 'predictions'.\n * @param predictions The predicted outputs.\n * @param weights Tensor whose rank is either 0, or the same rank as\n * `labels`, and must be broadcastable to `labels` (i.e., all dimensions\n * must be either `1`, or the same as the corresponding `losses`\n * dimension).\n * @param reduction Type of reduction to apply to loss. Should be of type\n * `Reduction`\n *\n * @doc {heading: 'Training', subheading: 'Losses', namespace: 'losses'}\n */\nfunction hingeLoss_(labels, predictions, weights, reduction = Reduction.SUM_BY_NONZERO_WEIGHTS) {\n let $labels = convertToTensor(labels, 'labels', 'hingeLoss');\n const $predictions = convertToTensor(predictions, 'predictions', 'hingeLoss');\n let $weights = null;\n if (weights != null) {\n $weights = convertToTensor(weights, 'weights', 'hingeLoss');\n }\n assertShapesMatch($labels.shape, $predictions.shape, 'Error in hingeLoss: ');\n const one = scalar(1);\n // Convert binary labels to (-1, 1)\n $labels = sub(mul(scalar(2), $labels), one);\n const losses = relu(sub(one, mul($labels, $predictions)));\n return computeWeightedLoss(losses, $weights, reduction);\n}\nexport const hingeLoss = op({ hingeLoss_ });\n//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaGluZ2VfbG9zcy5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uLy4uLy4uL3RmanMtY29yZS9zcmMvb3BzL2xvc3Nlcy9oaW5nZV9sb3NzLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQWlCQSxPQUFPLEVBQUMsZUFBZSxFQUFDLE1BQU0sdUJBQXVCLENBQUM7QUFFdEQsT0FBTyxFQUFDLGlCQUFpQixFQUFDLE1BQU0sWUFBWSxDQUFDO0FBQzdDLE9BQU8sRUFBQyxTQUFTLEVBQUMsTUFBTSxtQkFBbUIsQ0FBQztBQUM1QyxPQUFPLEVBQUMsR0FBRyxFQUFDLE1BQU0sUUFBUSxDQUFDO0FBQzNCLE9BQU8sRUFBQyxFQUFFLEVBQUMsTUFBTSxjQUFjLENBQUM7QUFDaEMsT0FBTyxFQUFDLElBQUksRUFBQyxNQUFNLFNBQVMsQ0FBQztBQUM3QixPQUFPLEVBQUMsTUFBTSxFQUFDLE1BQU0sV0FBVyxDQUFDO0FBQ2pDLE9BQU8sRUFBQyxHQUFHLEVBQUMsTUFBTSxRQUFRLENBQUM7QUFFM0IsT0FBTyxFQUFDLG1CQUFtQixFQUFDLE1BQU0seUJBQXlCLENBQUM7QUFFNUQ7Ozs7Ozs7Ozs7Ozs7O0dBY0c7QUFDSCxTQUFTLFVBQVUsQ0FDZixNQUFvQixFQUFFLFdBQXlCLEVBQy9DLE9BQTJCLEVBQzNCLFNBQVMsR0FBRyxTQUFTLENBQUMsc0JBQXNCO0lBQzlDLElBQUksT0FBTyxHQUFHLGVBQWUsQ0FBQyxNQUFNLEVBQUUsUUFBUSxFQUFFLFdBQVcsQ0FBQyxDQUFDO0lBQzdELE1BQU0sWUFBWSxHQUFHLGVBQWUsQ0FBQyxXQUFXLEVBQUUsYUFBYSxFQUFFLFdBQVcsQ0FBQyxDQUFDO0lBQzlFLElBQUksUUFBUSxHQUFXLElBQUksQ0FBQztJQUM1QixJQUFJLE9BQU8sSUFBSSxJQUFJLEVBQUU7UUFDbkIsUUFBUSxHQUFHLGVBQWUsQ0FBQyxPQUFPLEVBQUUsU0FBUyxFQUFFLFdBQVcsQ0FBQyxDQUFDO0tBQzdEO0lBQ0QsaUJBQWlCLENBQUMsT0FBTyxDQUFDLEtBQUssRUFBRSxZQUFZLENBQUMsS0FBSyxFQUFFLHNCQUFzQixDQUFDLENBQUM7SUFFN0UsTUFBTSxHQUFHLEdBQUcsTUFBTSxDQUFDLENBQUMsQ0FBQyxDQUFDO0lBQ3RCLG1DQUFtQztJQUNuQyxPQUFPLEdBQUcsR0FBRyxDQUFDLEdBQUcsQ0FBQyxNQUFNLENBQUMsQ0FBQyxDQUFDLEVBQUUsT0FBTyxDQUFDLEVBQUUsR0FBRyxDQUFDLENBQUM7SUFDNUMsTUFBTSxNQUFNLEdBQUcsSUFBSSxDQUFDLEdBQUcsQ0FBQyxHQUFHLEVBQUUsR0FBRyxDQUFDLE9BQU8sRUFBRSxZQUFZLENBQUMsQ0FBQyxDQUFDLENBQUM7SUFDMUQsT0FBTyxtQkFBbUIsQ0FBQyxNQUFNLEVBQUUsUUFBUSxFQUFFLFNBQVMsQ0FBQyxDQUFDO0FBQzFELENBQUM7QUFDRCxNQUFNLENBQUMsTUFBTSxTQUFTLEdBQUcsRUFBRSxDQUFDLEVBQUMsVUFBVSxFQUFDLENBQUMsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbIi8qKlxuICogQGxpY2Vuc2VcbiAqIENvcHlyaWdodCAyMDIwIEdvb2dsZSBMTEMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuXG4gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgXCJMaWNlbnNlXCIpO1xuICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLlxuICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0XG4gKlxuICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wXG4gKlxuICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZVxuICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gXCJBUyBJU1wiIEJBU0lTLFxuICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuXG4gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kXG4gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS5cbiAqID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4gKi9cbmltcG9ydCB7VGVuc29yfSBmcm9tICcuLi8uLi90ZW5zb3InO1xuaW1wb3J0IHtjb252ZXJ0VG9UZW5zb3J9IGZyb20gJy4uLy4uL3RlbnNvcl91dGlsX2Vudic7XG5pbXBvcnQge1RlbnNvckxpa2V9IGZyb20gJy4uLy4uL3R5cGVzJztcbmltcG9ydCB7YXNzZXJ0U2hhcGVzTWF0Y2h9IGZyb20gJy4uLy4uL3V0aWwnO1xuaW1wb3J0IHtSZWR1Y3Rpb259IGZyb20gJy4uL2xvc3Nfb3BzX3V0aWxzJztcbmltcG9ydCB7bXVsfSBmcm9tICcuLi9tdWwnO1xuaW1wb3J0IHtvcH0gZnJvbSAnLi4vb3BlcmF0aW9uJztcbmltcG9ydCB7cmVsdX0gZnJvbSAnLi4vcmVsdSc7XG5pbXBvcnQge3NjYWxhcn0gZnJvbSAnLi4vc2NhbGFyJztcbmltcG9ydCB7c3VifSBmcm9tICcuLi9zdWInO1xuXG5pbXBvcnQge2NvbXB1dGVXZWlnaHRlZExvc3N9IGZyb20gJy4vY29tcHV0ZV93ZWlnaHRlZF9sb3NzJztcblxuLyoqXG4gKiBDb21wdXRlcyB0aGUgSGluZ2UgbG9zcyBiZXR3ZWVuIHR3byB0ZW5zb3JzLlxuICpcbiAqIEBwYXJhbSBsYWJlbHMgVGhlIGdyb3VuZCB0cnV0aCBvdXRwdXQgdGVuc29yLCBzYW1lIGRpbWVuc2lvbnMgYXNcbiAqICAgICdwcmVkaWN0aW9ucycuXG4gKiBAcGFyYW0gcHJlZGljdGlvbnMgVGhlIHByZWRpY3RlZCBvdXRwdXRzLlxuICogQHBhcmFtIHdlaWdodHMgVGVuc29yIHdob3NlIHJhbmsgaXMgZWl0aGVyIDAsIG9yIHRoZSBzYW1lIHJhbmsgYXNcbiAqICAgIGBsYWJlbHNgLCBhbmQgbXVzdCBiZSBicm9hZGNhc3RhYmxlIHRvIGBsYWJlbHNgIChpLmUuLCBhbGwgZGltZW5zaW9uc1xuICogICAgbXVzdCBiZSBlaXRoZXIgYDFgLCBvciB0aGUgc2FtZSBhcyB0aGUgY29ycmVzcG9uZGluZyBgbG9zc2VzYFxuICogICAgZGltZW5zaW9uKS5cbiAqIEBwYXJhbSByZWR1Y3Rpb24gVHlwZSBvZiByZWR1Y3Rpb24gdG8gYXBwbHkgdG8gbG9zcy4gU2hvdWxkIGJlIG9mIHR5cGVcbiAqICAgIGBSZWR1Y3Rpb25gXG4gKlxuICogQGRvYyB7aGVhZGluZzogJ1RyYWluaW5nJywgc3ViaGVhZGluZzogJ0xvc3NlcycsIG5hbWVzcGFjZTogJ2xvc3Nlcyd9XG4gKi9cbmZ1bmN0aW9uIGhpbmdlTG9zc188VCBleHRlbmRzIFRlbnNvciwgTyBleHRlbmRzIFRlbnNvcj4oXG4gICAgbGFiZWxzOiBUfFRlbnNvckxpa2UsIHByZWRpY3Rpb25zOiBUfFRlbnNvckxpa2UsXG4gICAgd2VpZ2h0cz86IFRlbnNvcnxUZW5zb3JMaWtlLFxuICAgIHJlZHVjdGlvbiA9IFJlZHVjdGlvbi5TVU1fQllfTk9OWkVST19XRUlHSFRTKTogTyB7XG4gIGxldCAkbGFiZWxzID0gY29udmVydFRvVGVuc29yKGxhYmVscywgJ2xhYmVscycsICdoaW5nZUxvc3MnKTtcbiAgY29uc3QgJHByZWRpY3Rpb25zID0gY29udmVydFRvVGVuc29yKHByZWRpY3Rpb25zLCAncHJlZGljdGlvbnMnLCAnaGluZ2VMb3NzJyk7XG4gIGxldCAkd2VpZ2h0czogVGVuc29yID0gbnVsbDtcbiAgaWYgKHdlaWdodHMgIT0gbnVsbCkge1xuICAgICR3ZWlnaHRzID0gY29udmVydFRvVGVuc29yKHdlaWdodHMsICd3ZWlnaHRzJywgJ2hpbmdlTG9zcycpO1xuICB9XG4gIGFzc2VydFNoYXBlc01hdGNoKCRsYWJlbHMuc2hhcGUsICRwcmVkaWN0aW9ucy5zaGFwZSwgJ0Vycm9yIGluIGhpbmdlTG9zczogJyk7XG5cbiAgY29uc3Qgb25lID0gc2NhbGFyKDEpO1xuICAvLyBDb252ZXJ0IGJpbmFyeSBsYWJlbHMgdG8gKC0xLCAxKVxuICAkbGFiZWxzID0gc3ViKG11bChzY2FsYXIoMiksICRsYWJlbHMpLCBvbmUpO1xuICBjb25zdCBsb3NzZXMgPSByZWx1KHN1YihvbmUsIG11bCgkbGFiZWxzLCAkcHJlZGljdGlvbnMpKSk7XG4gIHJldHVybiBjb21wdXRlV2VpZ2h0ZWRMb3NzKGxvc3NlcywgJHdlaWdodHMsIHJlZHVjdGlvbik7XG59XG5leHBvcnQgY29uc3QgaGluZ2VMb3NzID0gb3Aoe2hpbmdlTG9zc199KTtcbiJdfQ==","/**\n * @license\n * Copyright 2020 Google LLC. All Rights Reserved.\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n * =============================================================================\n */\nimport { convertToTensor } from '../../tensor_util_env';\nimport { assertShapesMatch } from '../../util';\nimport { abs } from '../abs';\nimport { add } from '../add';\nimport { Reduction } from '../loss_ops_utils';\nimport { minimum } from '../minimum';\nimport { mul } from '../mul';\nimport { op } from '../operation';\nimport { scalar } from '../scalar';\nimport { square } from '../square';\nimport { sub } from '../sub';\nimport { computeWeightedLoss } from './compute_weighted_loss';\n/**\n * Computes the Huber loss between two tensors.\n *\n * @param labels The ground truth output tensor, same dimensions as\n * 'predictions'.\n * @param predictions The predicted outputs.\n * @param weights Tensor whose rank is either 0, or the same rank as\n * `labels`, and must be broadcastable to `labels` (i.e., all dimensions\n * must be either `1`, or the same as the corresponding `losses`\n * dimension).\n * @param delta Point where Huber loss changes from quadratic to linear.\n * @param reduction Type of reduction to apply to loss. Should be of type\n * `Reduction`.\n *\n * @doc {heading: 'Training', subheading: 'Losses', namespace: 'losses'}\n */\nfunction huberLoss_(labels, predictions, weights, delta = 1.0, reduction = Reduction.SUM_BY_NONZERO_WEIGHTS) {\n const $labels = convertToTensor(labels, 'labels', 'huberLoss');\n const $predictions = convertToTensor(predictions, 'predictions', 'huberLoss');\n let $weights = null;\n if (weights != null) {\n $weights = convertToTensor(weights, 'weights', 'huberLoss');\n }\n assertShapesMatch($labels.shape, $predictions.shape, 'Error in huberLoss: ');\n const deltaScalar = scalar(delta);\n const error = abs(sub($predictions, $labels));\n const quadratic = minimum(error, deltaScalar);\n const linear = sub(error, quadratic);\n const losses = add(mul(scalar(0.5), square(quadratic)), mul(deltaScalar, linear));\n return computeWeightedLoss(losses, $weights, reduction);\n}\nexport const huberLoss = op({ huberLoss_ });\n//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaHViZXJfbG9zcy5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uLy4uLy4uL3RmanMtY29yZS9zcmMvb3BzL2xvc3Nlcy9odWJlcl9sb3NzLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBOzs7Ozs7Ozs7Ozs7Ozs7R0FlRztBQUdILE9BQU8sRUFBQyxlQUFlLEVBQUMsTUFBTSx1QkFBdUIsQ0FBQztBQUV0RCxPQUFPLEVBQUMsaUJBQWlCLEVBQUMsTUFBTSxZQUFZLENBQUM7QUFDN0MsT0FBTyxFQUFDLEdBQUcsRUFBQyxNQUFNLFFBQVEsQ0FBQztBQUMzQixPQUFPLEVBQUMsR0FBRyxFQUFDLE1BQU0sUUFBUSxDQUFDO0FBQzNCLE9BQU8sRUFBQyxTQUFTLEVBQUMsTUFBTSxtQkFBbUIsQ0FBQztBQUM1QyxPQUFPLEVBQUMsT0FBTyxFQUFDLE1BQU0sWUFBWSxDQUFDO0FBQ25DLE9BQU8sRUFBQyxHQUFHLEVBQUMsTUFBTSxRQUFRLENBQUM7QUFDM0IsT0FBTyxFQUFDLEVBQUUsRUFBQyxNQUFNLGNBQWMsQ0FBQztBQUNoQyxPQUFPLEVBQUMsTUFBTSxFQUFDLE1BQU0sV0FBVyxDQUFDO0FBQ2pDLE9BQU8sRUFBQyxNQUFNLEVBQUMsTUFBTSxXQUFXLENBQUM7QUFDakMsT0FBTyxFQUFDLEdBQUcsRUFBQyxNQUFNLFFBQVEsQ0FBQztBQUUzQixPQUFPLEVBQUMsbUJBQW1CLEVBQUMsTUFBTSx5QkFBeUIsQ0FBQztBQUU1RDs7Ozs7Ozs7Ozs7Ozs7O0dBZUc7QUFDSCxTQUFTLFVBQVUsQ0FDZixNQUFvQixFQUFFLFdBQXlCLEVBQy9DLE9BQTJCLEVBQUUsS0FBSyxHQUFHLEdBQUcsRUFDeEMsU0FBUyxHQUFHLFNBQVMsQ0FBQyxzQkFBc0I7SUFDOUMsTUFBTSxPQUFPLEdBQUcsZUFBZSxDQUFDLE1BQU0sRUFBRSxRQUFRLEVBQUUsV0FBVyxDQUFDLENBQUM7SUFDL0QsTUFBTSxZQUFZLEdBQUcsZUFBZSxDQUFDLFdBQVcsRUFBRSxhQUFhLEVBQUUsV0FBVyxDQUFDLENBQUM7SUFDOUUsSUFBSSxRQUFRLEdBQVcsSUFBSSxDQUFDO0lBQzVCLElBQUksT0FBTyxJQUFJLElBQUksRUFBRTtRQUNuQixRQUFRLEdBQUcsZUFBZSxDQUFDLE9BQU8sRUFBRSxTQUFTLEVBQUUsV0FBVyxDQUFDLENBQUM7S0FDN0Q7SUFDRCxpQkFBaUIsQ0FBQyxPQUFPLENBQUMsS0FBSyxFQUFFLFlBQVksQ0FBQyxLQUFLLEVBQUUsc0JBQXNCLENBQUMsQ0FBQztJQUU3RSxNQUFNLFdBQVcsR0FBRyxNQUFNLENBQUMsS0FBSyxDQUFDLENBQUM7SUFDbEMsTUFBTSxLQUFLLEdBQUcsR0FBRyxDQUFDLEdBQUcsQ0FBQyxZQUFZLEVBQUUsT0FBTyxDQUFDLENBQUMsQ0FBQztJQUM5QyxNQUFNLFNBQVMsR0FBRyxPQUFPLENBQUMsS0FBSyxFQUFFLFdBQVcsQ0FBQyxDQUFDO0lBQzlDLE1BQU0sTUFBTSxHQUFHLEdBQUcsQ0FBQyxLQUFLLEVBQUUsU0FBUyxDQUFDLENBQUM7SUFFckMsTUFBTSxNQUFNLEdBQ1IsR0FBRyxDQUFDLEdBQUcsQ0FBQyxNQUFNLENBQUMsR0FBRyxDQUFDLEVBQUUsTUFBTSxDQUFDLFNBQVMsQ0FBQyxDQUFDLEVBQUUsR0FBRyxDQUFDLFdBQVcsRUFBRSxNQUFNLENBQUMsQ0FBQyxDQUFDO0lBQ3ZFLE9BQU8sbUJBQW1CLENBQUMsTUFBTSxFQUFFLFFBQVEsRUFBRSxTQUFTLENBQUMsQ0FBQztBQUMxRCxDQUFDO0FBQ0QsTUFBTSxDQUFDLE1BQU0sU0FBUyxHQUFHLEVBQUUsQ0FBQyxFQUFDLFVBQVUsRUFBQyxDQUFDLENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyIvKipcbiAqIEBsaWNlbnNlXG4gKiBDb3B5cmlnaHQgMjAyMCBHb29nbGUgTExDLiBBbGwgUmlnaHRzIFJlc2VydmVkLlxuICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlIFwiTGljZW5zZVwiKTtcbiAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS5cbiAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdFxuICpcbiAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMFxuICpcbiAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmVcbiAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuIFwiQVMgSVNcIiBCQVNJUyxcbiAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLlxuICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZFxuICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuXG4gKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuICovXG5cbmltcG9ydCB7VGVuc29yfSBmcm9tICcuLi8uLi90ZW5zb3InO1xuaW1wb3J0IHtjb252ZXJ0VG9UZW5zb3J9IGZyb20gJy4uLy4uL3RlbnNvcl91dGlsX2Vudic7XG5pbXBvcnQge1RlbnNvckxpa2V9IGZyb20gJy4uLy4uL3R5cGVzJztcbmltcG9ydCB7YXNzZXJ0U2hhcGVzTWF0Y2h9IGZyb20gJy4uLy4uL3V0aWwnO1xuaW1wb3J0IHthYnN9IGZyb20gJy4uL2Ficyc7XG5pbXBvcnQge2FkZH0gZnJvbSAnLi4vYWRkJztcbmltcG9ydCB7UmVkdWN0aW9ufSBmcm9tICcuLi9sb3NzX29wc191dGlscyc7XG5pbXBvcnQge21pbmltdW19IGZyb20gJy4uL21pbmltdW0nO1xuaW1wb3J0IHttdWx9IGZyb20gJy4uL211bCc7XG5pbXBvcnQge29wfSBmcm9tICcuLi9vcGVyYXRpb24nO1xuaW1wb3J0IHtzY2FsYXJ9IGZyb20gJy4uL3NjYWxhcic7XG5pbXBvcnQge3NxdWFyZX0gZnJvbSAnLi4vc3F1YXJlJztcbmltcG9ydCB7c3VifSBmcm9tICcuLi9zdWInO1xuXG5pbXBvcnQge2NvbXB1dGVXZWlnaHRlZExvc3N9IGZyb20gJy4vY29tcHV0ZV93ZWlnaHRlZF9sb3NzJztcblxuLyoqXG4gKiBDb21wdXRlcyB0aGUgSHViZXIgbG9zcyBiZXR3ZWVuIHR3byB0ZW5zb3JzLlxuICpcbiAqIEBwYXJhbSBsYWJlbHMgVGhlIGdyb3VuZCB0cnV0aCBvdXRwdXQgdGVuc29yLCBzYW1lIGRpbWVuc2lvbnMgYXNcbiAqICAgICdwcmVkaWN0aW9ucycuXG4gKiBAcGFyYW0gcHJlZGljdGlvbnMgVGhlIHByZWRpY3RlZCBvdXRwdXRzLlxuICogQHBhcmFtIHdlaWdodHMgVGVuc29yIHdob3NlIHJhbmsgaXMgZWl0aGVyIDAsIG9yIHRoZSBzYW1lIHJhbmsgYXNcbiAqICAgIGBsYWJlbHNgLCBhbmQgbXVzdCBiZSBicm9hZGNhc3RhYmxlIHRvIGBsYWJlbHNgIChpLmUuLCBhbGwgZGltZW5zaW9uc1xuICogICAgbXVzdCBiZSBlaXRoZXIgYDFgLCBvciB0aGUgc2FtZSBhcyB0aGUgY29ycmVzcG9uZGluZyBgbG9zc2VzYFxuICogICAgZGltZW5zaW9uKS5cbiAqIEBwYXJhbSBkZWx0YSBQb2ludCB3aGVyZSBIdWJlciBsb3NzIGNoYW5nZXMgZnJvbSBxdWFkcmF0aWMgdG8gbGluZWFyLlxuICogQHBhcmFtIHJlZHVjdGlvbiBUeXBlIG9mIHJlZHVjdGlvbiB0byBhcHBseSB0byBsb3NzLiBTaG91bGQgYmUgb2YgdHlwZVxuICogICAgYFJlZHVjdGlvbmAuXG4gKlxuICogQGRvYyB7aGVhZGluZzogJ1RyYWluaW5nJywgc3ViaGVhZGluZzogJ0xvc3NlcycsIG5hbWVzcGFjZTogJ2xvc3Nlcyd9XG4gKi9cbmZ1bmN0aW9uIGh1YmVyTG9zc188VCBleHRlbmRzIFRlbnNvciwgTyBleHRlbmRzIFRlbnNvcj4oXG4gICAgbGFiZWxzOiBUfFRlbnNvckxpa2UsIHByZWRpY3Rpb25zOiBUfFRlbnNvckxpa2UsXG4gICAgd2VpZ2h0cz86IFRlbnNvcnxUZW5zb3JMaWtlLCBkZWx0YSA9IDEuMCxcbiAgICByZWR1Y3Rpb24gPSBSZWR1Y3Rpb24uU1VNX0JZX05PTlpFUk9fV0VJR0hUUyk6IE8ge1xuICBjb25zdCAkbGFiZWxzID0gY29udmVydFRvVGVuc29yKGxhYmVscywgJ2xhYmVscycsICdodWJlckxvc3MnKTtcbiAgY29uc3QgJHByZWRpY3Rpb25zID0gY29udmVydFRvVGVuc29yKHByZWRpY3Rpb25zLCAncHJlZGljdGlvbnMnLCAnaHViZXJMb3NzJyk7XG4gIGxldCAkd2VpZ2h0czogVGVuc29yID0gbnVsbDtcbiAgaWYgKHdlaWdodHMgIT0gbnVsbCkge1xuICAgICR3ZWlnaHRzID0gY29udmVydFRvVGVuc29yKHdlaWdodHMsICd3ZWlnaHRzJywgJ2h1YmVyTG9zcycpO1xuICB9XG4gIGFzc2VydFNoYXBlc01hdGNoKCRsYWJlbHMuc2hhcGUsICRwcmVkaWN0aW9ucy5zaGFwZSwgJ0Vycm9yIGluIGh1YmVyTG9zczogJyk7XG5cbiAgY29uc3QgZGVsdGFTY2FsYXIgPSBzY2FsYXIoZGVsdGEpO1xuICBjb25zdCBlcnJvciA9IGFicyhzdWIoJHByZWRpY3Rpb25zLCAkbGFiZWxzKSk7XG4gIGNvbnN0IHF1YWRyYXRpYyA9IG1pbmltdW0oZXJyb3IsIGRlbHRhU2NhbGFyKTtcbiAgY29uc3QgbGluZWFyID0gc3ViKGVycm9yLCBxdWFkcmF0aWMpO1xuXG4gIGNvbnN0IGxvc3NlcyA9XG4gICAgICBhZGQobXVsKHNjYWxhcigwLjUpLCBzcXVhcmUocXVhZHJhdGljKSksIG11bChkZWx0YVNjYWxhciwgbGluZWFyKSk7XG4gIHJldHVybiBjb21wdXRlV2VpZ2h0ZWRMb3NzKGxvc3NlcywgJHdlaWdodHMsIHJlZHVjdGlvbik7XG59XG5leHBvcnQgY29uc3QgaHViZXJMb3NzID0gb3Aoe2h1YmVyTG9zc199KTtcbiJdfQ==","/**\n * @license\n * Copyright 2020 Google LLC. All Rights Reserved.\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n * =============================================================================\n */\nimport { convertToTensor } from '../../tensor_util_env';\nimport { assertShapesMatch } from '../../util';\nimport { add } from '../add';\nimport { log } from '../log';\nimport { Reduction } from '../loss_ops_utils';\nimport { mul } from '../mul';\nimport { neg } from '../neg';\nimport { op } from '../operation';\nimport { scalar } from '../scalar';\nimport { sub } from '../sub';\nimport { computeWeightedLoss } from './compute_weighted_loss';\n/**\n * Computes the log loss between two tensors.\n *\n * @param labels The ground truth output tensor, same dimensions as\n * 'predictions'.\n * @param predictions The predicted outputs.\n * @param weights Tensor whose rank is either 0, or the same rank as\n * `labels`, and must be broadcastable to `labels` (i.e., all dimensions\n * must be either `1`, or the same as the corresponding `losses`\n * dimension).\n * @param epsilon A small increment to avoid taking log of zero\n * @param reduction Type of reduction to apply to loss. Should be of type\n * `Reduction`\n *\n * @doc {heading: 'Training', subheading: 'Losses', namespace: 'losses'}\n */\nfunction logLoss_(labels, predictions, weights, epsilon = 1e-7, reduction = Reduction.SUM_BY_NONZERO_WEIGHTS) {\n const $labels = convertToTensor(labels, 'labels', 'logLoss');\n const $predictions = convertToTensor(predictions, 'predictions', 'logLoss');\n let $weights = null;\n if (weights != null) {\n $weights = convertToTensor(weights, 'weights', 'logLoss');\n }\n assertShapesMatch($labels.shape, $predictions.shape, 'Error in logLoss: ');\n const one = scalar(1);\n const epsilonScalar = scalar(epsilon);\n const l1 = neg(mul($labels, log(add($predictions, epsilonScalar))));\n const l2 = mul(sub(one, $labels), log(add(sub(one, $predictions), epsilonScalar)));\n const losses = sub(l1, l2);\n return computeWeightedLoss(losses, $weights, reduction);\n}\nexport const logLoss = op({ logLoss_ });\n//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibG9nX2xvc3MuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi8uLi8uLi90ZmpzLWNvcmUvc3JjL29wcy9sb3NzZXMvbG9nX2xvc3MudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUE7Ozs7Ozs7Ozs7Ozs7OztHQWVHO0FBR0gsT0FBTyxFQUFDLGVBQWUsRUFBQyxNQUFNLHVCQUF1QixDQUFDO0FBRXRELE9BQU8sRUFBQyxpQkFBaUIsRUFBQyxNQUFNLFlBQVksQ0FBQztBQUM3QyxPQUFPLEVBQUMsR0FBRyxFQUFDLE1BQU0sUUFBUSxDQUFDO0FBQzNCLE9BQU8sRUFBQyxHQUFHLEVBQUMsTUFBTSxRQUFRLENBQUM7QUFDM0IsT0FBTyxFQUFDLFNBQVMsRUFBQyxNQUFNLG1CQUFtQixDQUFDO0FBQzVDLE9BQU8sRUFBQyxHQUFHLEVBQUMsTUFBTSxRQUFRLENBQUM7QUFDM0IsT0FBTyxFQUFDLEdBQUcsRUFBQyxNQUFNLFFBQVEsQ0FBQztBQUMzQixPQUFPLEVBQUMsRUFBRSxFQUFDLE1BQU0sY0FBYyxDQUFDO0FBQ2hDLE9BQU8sRUFBQyxNQUFNLEVBQUMsTUFBTSxXQUFXLENBQUM7QUFDakMsT0FBTyxFQUFDLEdBQUcsRUFBQyxNQUFNLFFBQVEsQ0FBQztBQUUzQixPQUFPLEVBQUMsbUJBQW1CLEVBQUMsTUFBTSx5QkFBeUIsQ0FBQztBQUU1RDs7Ozs7Ozs7Ozs7Ozs7O0dBZUc7QUFDSCxTQUFTLFFBQVEsQ0FDYixNQUFvQixFQUFFLFdBQXlCLEVBQy9DLE9BQTJCLEVBQUUsT0FBTyxHQUFHLElBQUksRUFDM0MsU0FBUyxHQUFHLFNBQVMsQ0FBQyxzQkFBc0I7SUFDOUMsTUFBTSxPQUFPLEdBQUcsZUFBZSxDQUFDLE1BQU0sRUFBRSxRQUFRLEVBQUUsU0FBUyxDQUFDLENBQUM7SUFDN0QsTUFBTSxZQUFZLEdBQUcsZUFBZSxDQUFDLFdBQVcsRUFBRSxhQUFhLEVBQUUsU0FBUyxDQUFDLENBQUM7SUFDNUUsSUFBSSxRQUFRLEdBQVcsSUFBSSxDQUFDO0lBQzVCLElBQUksT0FBTyxJQUFJLElBQUksRUFBRTtRQUNuQixRQUFRLEdBQUcsZUFBZSxDQUFDLE9BQU8sRUFBRSxTQUFTLEVBQUUsU0FBUyxDQUFDLENBQUM7S0FDM0Q7SUFDRCxpQkFBaUIsQ0FBQyxPQUFPLENBQUMsS0FBSyxFQUFFLFlBQVksQ0FBQyxLQUFLLEVBQUUsb0JBQW9CLENBQUMsQ0FBQztJQUUzRSxNQUFNLEdBQUcsR0FBRyxNQUFNLENBQUMsQ0FBQyxDQUFDLENBQUM7SUFDdEIsTUFBTSxhQUFhLEdBQUcsTUFBTSxDQUFDLE9BQU8sQ0FBQyxDQUFDO0lBRXRDLE1BQU0sRUFBRSxHQUFHLEdBQUcsQ0FBQyxHQUFHLENBQUMsT0FBTyxFQUFFLEdBQUcsQ0FBQyxHQUFHLENBQUMsWUFBWSxFQUFFLGFBQWEsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDO0lBQ3BFLE1BQU0sRUFBRSxHQUNKLEdBQUcsQ0FBQyxHQUFHLENBQUMsR0FBRyxFQUFFLE9BQU8sQ0FBQyxFQUFFLEdBQUcsQ0FBQyxHQUFHLENBQUMsR0FBRyxDQUFDLEdBQUcsRUFBRSxZQUFZLENBQUMsRUFBRSxhQUFhLENBQUMsQ0FBQyxDQUFDLENBQUM7SUFDNUUsTUFBTSxNQUFNLEdBQUcsR0FBRyxDQUFDLEVBQUUsRUFBRSxFQUFFLENBQUMsQ0FBQztJQUMzQixPQUFPLG1CQUFtQixDQUFDLE1BQU0sRUFBRSxRQUFRLEVBQUUsU0FBUyxDQUFDLENBQUM7QUFDMUQsQ0FBQztBQUNELE1BQU0sQ0FBQyxNQUFNLE9BQU8sR0FBRyxFQUFFLENBQUMsRUFBQyxRQUFRLEVBQUMsQ0FBQyxDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiLyoqXG4gKiBAbGljZW5zZVxuICogQ29weXJpZ2h0IDIwMjAgR29vZ2xlIExMQy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC5cbiAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSBcIkxpY2Vuc2VcIik7XG4gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuXG4gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXRcbiAqXG4gKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjBcbiAqXG4gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlXG4gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiBcIkFTIElTXCIgQkFTSVMsXG4gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC5cbiAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmRcbiAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLlxuICogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbiAqL1xuXG5pbXBvcnQge1RlbnNvcn0gZnJvbSAnLi4vLi4vdGVuc29yJztcbmltcG9ydCB7Y29udmVydFRvVGVuc29yfSBmcm9tICcuLi8uLi90ZW5zb3JfdXRpbF9lbnYnO1xuaW1wb3J0IHtUZW5zb3JMaWtlfSBmcm9tICcuLi8uLi90eXBlcyc7XG5pbXBvcnQge2Fzc2VydFNoYXBlc01hdGNofSBmcm9tICcuLi8uLi91dGlsJztcbmltcG9ydCB7YWRkfSBmcm9tICcuLi9hZGQnO1xuaW1wb3J0IHtsb2d9IGZyb20gJy4uL2xvZyc7XG5pbXBvcnQge1JlZHVjdGlvbn0gZnJvbSAnLi4vbG9zc19vcHNfdXRpbHMnO1xuaW1wb3J0IHttdWx9IGZyb20gJy4uL211bCc7XG5pbXBvcnQge25lZ30gZnJvbSAnLi4vbmVnJztcbmltcG9ydCB7b3B9IGZyb20gJy4uL29wZXJhdGlvbic7XG5pbXBvcnQge3NjYWxhcn0gZnJvbSAnLi4vc2NhbGFyJztcbmltcG9ydCB7c3VifSBmcm9tICcuLi9zdWInO1xuXG5pbXBvcnQge2NvbXB1dGVXZWlnaHRlZExvc3N9IGZyb20gJy4vY29tcHV0ZV93ZWlnaHRlZF9sb3NzJztcblxuLyoqXG4gKiBDb21wdXRlcyB0aGUgbG9nIGxvc3MgYmV0d2VlbiB0d28gdGVuc29ycy5cbiAqXG4gKiBAcGFyYW0gbGFiZWxzIFRoZSBncm91bmQgdHJ1dGggb3V0cHV0IHRlbnNvciwgc2FtZSBkaW1lbnNpb25zIGFzXG4gKiAgICAncHJlZGljdGlvbnMnLlxuICogQHBhcmFtIHByZWRpY3Rpb25zIFRoZSBwcmVkaWN0ZWQgb3V0cHV0cy5cbiAqIEBwYXJhbSB3ZWlnaHRzIFRlbnNvciB3aG9zZSByYW5rIGlzIGVpdGhlciAwLCBvciB0aGUgc2FtZSByYW5rIGFzXG4gKiAgICBgbGFiZWxzYCwgYW5kIG11c3QgYmUgYnJvYWRjYXN0YWJsZSB0byBgbGFiZWxzYCAoaS5lLiwgYWxsIGRpbWVuc2lvbnNcbiAqICAgIG11c3QgYmUgZWl0aGVyIGAxYCwgb3IgdGhlIHNhbWUgYXMgdGhlIGNvcnJlc3BvbmRpbmcgYGxvc3Nlc2BcbiAqICAgIGRpbWVuc2lvbikuXG4gKiBAcGFyYW0gZXBzaWxvbiBBIHNtYWxsIGluY3JlbWVudCB0byBhdm9pZCB0YWtpbmcgbG9nIG9mIHplcm9cbiAqIEBwYXJhbSByZWR1Y3Rpb24gVHlwZSBvZiByZWR1Y3Rpb24gdG8gYXBwbHkgdG8gbG9zcy4gU2hvdWxkIGJlIG9mIHR5cGVcbiAqICAgIGBSZWR1Y3Rpb25gXG4gKlxuICogQGRvYyB7aGVhZGluZzogJ1RyYWluaW5nJywgc3ViaGVhZGluZzogJ0xvc3NlcycsIG5hbWVzcGFjZTogJ2xvc3Nlcyd9XG4gKi9cbmZ1bmN0aW9uIGxvZ0xvc3NfPFQgZXh0ZW5kcyBUZW5zb3IsIE8gZXh0ZW5kcyBUZW5zb3I+KFxuICAgIGxhYmVsczogVHxUZW5zb3JMaWtlLCBwcmVkaWN0aW9uczogVHxUZW5zb3JMaWtlLFxuICAgIHdlaWdodHM/OiBUZW5zb3J8VGVuc29yTGlrZSwgZXBzaWxvbiA9IDFlLTcsXG4gICAgcmVkdWN0aW9uID0gUmVkdWN0aW9uLlNVTV9CWV9OT05aRVJPX1dFSUdIVFMpOiBPIHtcbiAgY29uc3QgJGxhYmVscyA9IGNvbnZlcnRUb1RlbnNvcihsYWJlbHMsICdsYWJlbHMnLCAnbG9nTG9zcycpO1xuICBjb25zdCAkcHJlZGljdGlvbnMgPSBjb252ZXJ0VG9UZW5zb3IocHJlZGljdGlvbnMsICdwcmVkaWN0aW9ucycsICdsb2dMb3NzJyk7XG4gIGxldCAkd2VpZ2h0czogVGVuc29yID0gbnVsbDtcbiAgaWYgKHdlaWdodHMgIT0gbnVsbCkge1xuICAgICR3ZWlnaHRzID0gY29udmVydFRvVGVuc29yKHdlaWdodHMsICd3ZWlnaHRzJywgJ2xvZ0xvc3MnKTtcbiAgfVxuICBhc3NlcnRTaGFwZXNNYXRjaCgkbGFiZWxzLnNoYXBlLCAkcHJlZGljdGlvbnMuc2hhcGUsICdFcnJvciBpbiBsb2dMb3NzOiAnKTtcblxuICBjb25zdCBvbmUgPSBzY2FsYXIoMSk7XG4gIGNvbnN0IGVwc2lsb25TY2FsYXIgPSBzY2FsYXIoZXBzaWxvbik7XG5cbiAgY29uc3QgbDEgPSBuZWcobXVsKCRsYWJlbHMsIGxvZyhhZGQoJHByZWRpY3Rpb25zLCBlcHNpbG9uU2NhbGFyKSkpKTtcbiAgY29uc3QgbDIgPVxuICAgICAgbXVsKHN1YihvbmUsICRsYWJlbHMpLCBsb2coYWRkKHN1YihvbmUsICRwcmVkaWN0aW9ucyksIGVwc2lsb25TY2FsYXIpKSk7XG4gIGNvbnN0IGxvc3NlcyA9IHN1YihsMSwgbDIpO1xuICByZXR1cm4gY29tcHV0ZVdlaWdodGVkTG9zcyhsb3NzZXMsICR3ZWlnaHRzLCByZWR1Y3Rpb24pO1xufVxuZXhwb3J0IGNvbnN0IGxvZ0xvc3MgPSBvcCh7bG9nTG9zc199KTtcbiJdfQ==","/**\n * @license\n * Copyright 2020 Google LLC. All Rights Reserved.\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n * =============================================================================\n */\nimport { convertToTensor } from '../../tensor_util_env';\nimport { assertShapesMatch } from '../../util';\nimport { Reduction } from '../loss_ops_utils';\nimport { op } from '../operation';\nimport { squaredDifference } from '../squared_difference';\nimport { computeWeightedLoss } from './compute_weighted_loss';\n/**\n * Computes the mean squared error between two tensors.\n *\n * @param labels The ground truth output tensor, same dimensions as\n * 'predictions'.\n * @param predictions The predicted outputs.\n * @param weights Tensor whose rank is either 0, or the same rank as\n * `labels`, and must be broadcastable to `labels` (i.e., all dimensions\n * must be either `1`, or the same as the corresponding `losses`\n * dimension).\n * @param reduction Type of reduction to apply to loss. Should be of type\n * `Reduction`\n *\n * @doc {heading: 'Training', subheading: 'Losses', namespace: 'losses'}\n */\nfunction meanSquaredError_(labels, predictions, weights, reduction = Reduction.SUM_BY_NONZERO_WEIGHTS) {\n const $labels = convertToTensor(labels, 'labels', 'meanSquaredError');\n const $predictions = convertToTensor(predictions, 'predictions', 'meanSquaredError');\n let $weights = null;\n if (weights != null) {\n $weights = convertToTensor(weights, 'weights', 'meanSquaredError');\n }\n assertShapesMatch($labels.shape, $predictions.shape, 'Error in meanSquaredError: ');\n const losses = squaredDifference($labels, $predictions);\n return computeWeightedLoss(losses, $weights, reduction);\n}\nexport const meanSquaredError = op({ meanSquaredError_ });\n//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibWVhbl9zcXVhcmVkX2Vycm9yLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vLi4vLi4vdGZqcy1jb3JlL3NyYy9vcHMvbG9zc2VzL21lYW5fc3F1YXJlZF9lcnJvci50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQTs7Ozs7Ozs7Ozs7Ozs7O0dBZUc7QUFHSCxPQUFPLEVBQUMsZUFBZSxFQUFDLE1BQU0sdUJBQXVCLENBQUM7QUFFdEQsT0FBTyxFQUFDLGlCQUFpQixFQUFDLE1BQU0sWUFBWSxDQUFDO0FBQzdDLE9BQU8sRUFBQyxTQUFTLEVBQUMsTUFBTSxtQkFBbUIsQ0FBQztBQUM1QyxPQUFPLEVBQUMsRUFBRSxFQUFDLE1BQU0sY0FBYyxDQUFDO0FBQ2hDLE9BQU8sRUFBQyxpQkFBaUIsRUFBQyxNQUFNLHVCQUF1QixDQUFDO0FBRXhELE9BQU8sRUFBQyxtQkFBbUIsRUFBQyxNQUFNLHlCQUF5QixDQUFDO0FBRTVEOzs7Ozs7Ozs7Ozs7OztHQWNHO0FBQ0gsU0FBUyxpQkFBaUIsQ0FDdEIsTUFBb0IsRUFBRSxXQUF5QixFQUMvQyxPQUEyQixFQUMzQixTQUFTLEdBQUcsU0FBUyxDQUFDLHNCQUFzQjtJQUM5QyxNQUFNLE9BQU8sR0FBRyxlQUFlLENBQUMsTUFBTSxFQUFFLFFBQVEsRUFBRSxrQkFBa0IsQ0FBQyxDQUFDO0lBQ3RFLE1BQU0sWUFBWSxHQUNkLGVBQWUsQ0FBQyxXQUFXLEVBQUUsYUFBYSxFQUFFLGtCQUFrQixDQUFDLENBQUM7SUFDcEUsSUFBSSxRQUFRLEdBQVcsSUFBSSxDQUFDO0lBQzVCLElBQUksT0FBTyxJQUFJLElBQUksRUFBRTtRQUNuQixRQUFRLEdBQUcsZUFBZSxDQUFDLE9BQU8sRUFBRSxTQUFTLEVBQUUsa0JBQWtCLENBQUMsQ0FBQztLQUNwRTtJQUNELGlCQUFpQixDQUNiLE9BQU8sQ0FBQyxLQUFLLEVBQUUsWUFBWSxDQUFDLEtBQUssRUFBRSw2QkFBNkIsQ0FBQyxDQUFDO0lBRXRFLE1BQU0sTUFBTSxHQUFHLGlCQUFpQixDQUFDLE9BQU8sRUFBRSxZQUFZLENBQUMsQ0FBQztJQUN4RCxPQUFPLG1CQUFtQixDQUFDLE1BQU0sRUFBRSxRQUFRLEVBQUUsU0FBUyxDQUFDLENBQUM7QUFDMUQsQ0FBQztBQUNELE1BQU0sQ0FBQyxNQUFNLGdCQUFnQixHQUFHLEVBQUUsQ0FBQyxFQUFDLGlCQUFpQixFQUFDLENBQUMsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbIi8qKlxuICogQGxpY2Vuc2VcbiAqIENvcHlyaWdodCAyMDIwIEdvb2dsZSBMTEMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuXG4gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgXCJMaWNlbnNlXCIpO1xuICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLlxuICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0XG4gKlxuICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wXG4gKlxuICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZVxuICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gXCJBUyBJU1wiIEJBU0lTLFxuICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuXG4gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kXG4gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS5cbiAqID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4gKi9cblxuaW1wb3J0IHtUZW5zb3J9IGZyb20gJy4uLy4uL3RlbnNvcic7XG5pbXBvcnQge2NvbnZlcnRUb1RlbnNvcn0gZnJvbSAnLi4vLi4vdGVuc29yX3V0aWxfZW52JztcbmltcG9ydCB7VGVuc29yTGlrZX0gZnJvbSAnLi4vLi4vdHlwZXMnO1xuaW1wb3J0IHthc3NlcnRTaGFwZXNNYXRjaH0gZnJvbSAnLi4vLi4vdXRpbCc7XG5pbXBvcnQge1JlZHVjdGlvbn0gZnJvbSAnLi4vbG9zc19vcHNfdXRpbHMnO1xuaW1wb3J0IHtvcH0gZnJvbSAnLi4vb3BlcmF0aW9uJztcbmltcG9ydCB7c3F1YXJlZERpZmZlcmVuY2V9IGZyb20gJy4uL3NxdWFyZWRfZGlmZmVyZW5jZSc7XG5cbmltcG9ydCB7Y29tcHV0ZVdlaWdodGVkTG9zc30gZnJvbSAnLi9jb21wdXRlX3dlaWdodGVkX2xvc3MnO1xuXG4vKipcbiAqIENvbXB1dGVzIHRoZSBtZWFuIHNxdWFyZWQgZXJyb3IgYmV0d2VlbiB0d28gdGVuc29ycy5cbiAqXG4gKiBAcGFyYW0gbGFiZWxzIFRoZSBncm91bmQgdHJ1dGggb3V0cHV0IHRlbnNvciwgc2FtZSBkaW1lbnNpb25zIGFzXG4gKiAgICAncHJlZGljdGlvbnMnLlxuICogQHBhcmFtIHByZWRpY3Rpb25zIFRoZSBwcmVkaWN0ZWQgb3V0cHV0cy5cbiAqIEBwYXJhbSB3ZWlnaHRzIFRlbnNvciB3aG9zZSByYW5rIGlzIGVpdGhlciAwLCBvciB0aGUgc2FtZSByYW5rIGFzXG4gKiAgICBgbGFiZWxzYCwgYW5kIG11c3QgYmUgYnJvYWRjYXN0YWJsZSB0byBgbGFiZWxzYCAoaS5lLiwgYWxsIGRpbWVuc2lvbnNcbiAqICAgIG11c3QgYmUgZWl0aGVyIGAxYCwgb3IgdGhlIHNhbWUgYXMgdGhlIGNvcnJlc3BvbmRpbmcgYGxvc3Nlc2BcbiAqICAgIGRpbWVuc2lvbikuXG4gKiBAcGFyYW0gcmVkdWN0aW9uIFR5cGUgb2YgcmVkdWN0aW9uIHRvIGFwcGx5IHRvIGxvc3MuIFNob3VsZCBiZSBvZiB0eXBlXG4gKiAgICBgUmVkdWN0aW9uYFxuICpcbiAqIEBkb2Mge2hlYWRpbmc6ICdUcmFpbmluZycsIHN1YmhlYWRpbmc6ICdMb3NzZXMnLCBuYW1lc3BhY2U6ICdsb3NzZXMnfVxuICovXG5mdW5jdGlvbiBtZWFuU3F1YXJlZEVycm9yXzxUIGV4dGVuZHMgVGVuc29yLCBPIGV4dGVuZHMgVGVuc29yPihcbiAgICBsYWJlbHM6IFR8VGVuc29yTGlrZSwgcHJlZGljdGlvbnM6IFR8VGVuc29yTGlrZSxcbiAgICB3ZWlnaHRzPzogVGVuc29yfFRlbnNvckxpa2UsXG4gICAgcmVkdWN0aW9uID0gUmVkdWN0aW9uLlNVTV9CWV9OT05aRVJPX1dFSUdIVFMpOiBPIHtcbiAgY29uc3QgJGxhYmVscyA9IGNvbnZlcnRUb1RlbnNvcihsYWJlbHMsICdsYWJlbHMnLCAnbWVhblNxdWFyZWRFcnJvcicpO1xuICBjb25zdCAkcHJlZGljdGlvbnMgPVxuICAgICAgY29udmVydFRvVGVuc29yKHByZWRpY3Rpb25zLCAncHJlZGljdGlvbnMnLCAnbWVhblNxdWFyZWRFcnJvcicpO1xuICBsZXQgJHdlaWdodHM6IFRlbnNvciA9IG51bGw7XG4gIGlmICh3ZWlnaHRzICE9IG51bGwpIHtcbiAgICAkd2VpZ2h0cyA9IGNvbnZlcnRUb1RlbnNvcih3ZWlnaHRzLCAnd2VpZ2h0cycsICdtZWFuU3F1YXJlZEVycm9yJyk7XG4gIH1cbiAgYXNzZXJ0U2hhcGVzTWF0Y2goXG4gICAgICAkbGFiZWxzLnNoYXBlLCAkcHJlZGljdGlvbnMuc2hhcGUsICdFcnJvciBpbiBtZWFuU3F1YXJlZEVycm9yOiAnKTtcblxuICBjb25zdCBsb3NzZXMgPSBzcXVhcmVkRGlmZmVyZW5jZSgkbGFiZWxzLCAkcHJlZGljdGlvbnMpO1xuICByZXR1cm4gY29tcHV0ZVdlaWdodGVkTG9zcyhsb3NzZXMsICR3ZWlnaHRzLCByZWR1Y3Rpb24pO1xufVxuZXhwb3J0IGNvbnN0IG1lYW5TcXVhcmVkRXJyb3IgPSBvcCh7bWVhblNxdWFyZWRFcnJvcl99KTtcbiJdfQ==","/**\n * @license\n * Copyright 2020 Google LLC. All Rights Reserved.\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n * =============================================================================\n */\nimport { convertToTensor } from '../../tensor_util_env';\nimport { assertShapesMatch } from '../../util';\nimport { abs } from '../abs';\nimport { add } from '../add';\nimport { exp } from '../exp';\nimport { log1p } from '../log1p';\nimport { Reduction } from '../loss_ops_utils';\nimport { mul } from '../mul';\nimport { neg } from '../neg';\nimport { op } from '../operation';\nimport { relu } from '../relu';\nimport { scalar } from '../scalar';\nimport { sub } from '../sub';\nimport { computeWeightedLoss } from './compute_weighted_loss';\nfunction sigmoidCrossEntropyWithLogits_(labels, logits) {\n const $labels = convertToTensor(labels, 'labels', 'sigmoidCrossEntropyWithLogits');\n const $logits = convertToTensor(logits, 'logits', 'sigmoidCrossEntropyWithLogits');\n assertShapesMatch($labels.shape, $logits.shape, 'Error in sigmoidCrossEntropyWithLogits: ');\n /**\n * Implementation Details:\n *\n * For brevity, let `x = logits`, `z = labels`. The logistic loss is\n * z * -log(sigmoid(x)) + (1 - z) * -log(1 - sigmoid(x))\n * = z * -log(1 / (1 + exp(-x))) + (1 - z) * -log(exp(-x) / (1 + exp(-x)))\n * = z * log(1 + exp(-x)) + (1 - z) * (-log(exp(-x)) + log(1 + exp(-x)))\n * = z * log(1 + exp(-x)) + (1 - z) * (x + log(1 + exp(-x))\n * = (1 - z) * x + log(1 + exp(-x))\n * = x - x * z + log(1 + exp(-x))\n *\n * For x < 0, to avoid overflow in exp(-x), we reformulate the above\n * x - x * z + log(1 + exp(-x))\n * = log(exp(x)) - x * z + log(1 + exp(-x))\n * = - x * z + log(1 + exp(x))\n *\n * Hence, to ensure stability and avoid overflow, the implementation uses\n * this equivalent formulation:\n * max(x, 0) - x * z + log(1 + exp(-abs(x)))\n */\n const maxOutput = relu($logits);\n const outputXTarget = mul($logits, $labels);\n const sigmoidOutput = log1p(exp(neg(abs($logits))));\n return add(sub(maxOutput, outputXTarget), sigmoidOutput);\n}\n/**\n * Computes the sigmoid cross entropy loss between two tensors.\n *\n * If labelSmoothing is nonzero, smooth the labels towards 1/2:\n *\n * newMulticlassLabels = multiclassLabels * (1 - labelSmoothing)\n * + 0.5 * labelSmoothing\n *\n * @param multiClassLabels The ground truth output tensor of shape\n * [batch_size, num_classes], same dimensions as 'predictions'.\n * @param logits The predicted outputs.\n * @param weights Tensor whose rank is either 0, or the same rank as\n * `labels`, and must be broadcastable to `labels` (i.e., all dimensions\n * must be either `1`, or the same as the corresponding `losses`\n * dimension).\n * @param labelSmoothing If greater than 0, then smooth the labels.\n * @param reduction Type of reduction to apply to loss. Should be of type\n * `Reduction`\n *\n * @doc { heading: 'Training', subheading: 'Losses', namespace: 'losses' }\n */\nfunction sigmoidCrossEntropy_(multiClassLabels, logits, weights, labelSmoothing = 0, reduction = Reduction.SUM_BY_NONZERO_WEIGHTS) {\n let $multiClassLabels = convertToTensor(multiClassLabels, 'multiClassLabels', 'sigmoidCrossEntropy');\n const $logits = convertToTensor(logits, 'logits', 'sigmoidCrossEntropy');\n let $weights = null;\n if (weights != null) {\n $weights = convertToTensor(weights, 'weights', 'sigmoidCrossEntropy');\n }\n assertShapesMatch($multiClassLabels.shape, $logits.shape, 'Error in sigmoidCrossEntropy: ');\n if (labelSmoothing > 0) {\n const labelSmoothingScalar = scalar(labelSmoothing);\n const one = scalar(1);\n const half = scalar(0.5);\n $multiClassLabels =\n add(mul($multiClassLabels, sub(one, labelSmoothingScalar)), mul(half, labelSmoothingScalar));\n }\n const losses = sigmoidCrossEntropyWithLogits_($multiClassLabels, $logits);\n return computeWeightedLoss(losses, $weights, reduction);\n}\nexport const sigmoidCrossEntropy = op({ sigmoidCrossEntropy_ });\n//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic2lnbW9pZF9jcm9zc19lbnRyb3B5LmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vLi4vLi4vdGZqcy1jb3JlL3NyYy9vcHMvbG9zc2VzL3NpZ21vaWRfY3Jvc3NfZW50cm9weS50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQTs7Ozs7Ozs7Ozs7Ozs7O0dBZUc7QUFHSCxPQUFPLEVBQUMsZUFBZSxFQUFDLE1BQU0sdUJBQXVCLENBQUM7QUFFdEQsT0FBTyxFQUFDLGlCQUFpQixFQUFDLE1BQU0sWUFBWSxDQUFDO0FBQzdDLE9BQU8sRUFBQyxHQUFHLEVBQUMsTUFBTSxRQUFRLENBQUM7QUFDM0IsT0FBTyxFQUFDLEdBQUcsRUFBQyxNQUFNLFFBQVEsQ0FBQztBQUMzQixPQUFPLEVBQUMsR0FBRyxFQUFDLE1BQU0sUUFBUSxDQUFDO0FBQzNCLE9BQU8sRUFBQyxLQUFLLEVBQUMsTUFBTSxVQUFVLENBQUM7QUFDL0IsT0FBTyxFQUFDLFNBQVMsRUFBQyxNQUFNLG1CQUFtQixDQUFDO0FBQzVDLE9BQU8sRUFBQyxHQUFHLEVBQUMsTUFBTSxRQUFRLENBQUM7QUFDM0IsT0FBTyxFQUFDLEdBQUcsRUFBQyxNQUFNLFFBQVEsQ0FBQztBQUMzQixPQUFPLEVBQUMsRUFBRSxFQUFDLE1BQU0sY0FBYyxDQUFDO0FBQ2hDLE9BQU8sRUFBQyxJQUFJLEVBQUMsTUFBTSxTQUFTLENBQUM7QUFDN0IsT0FBTyxFQUFDLE1BQU0sRUFBQyxNQUFNLFdBQVcsQ0FBQztBQUNqQyxPQUFPLEVBQUMsR0FBRyxFQUFDLE1BQU0sUUFBUSxDQUFDO0FBRTNCLE9BQU8sRUFBQyxtQkFBbUIsRUFBQyxNQUFNLHlCQUF5QixDQUFDO0FBRTVELFNBQVMsOEJBQThCLENBQ25DLE1BQW9CLEVBQUUsTUFBb0I7SUFDNUMsTUFBTSxPQUFPLEdBQ1QsZUFBZSxDQUFDLE1BQU0sRUFBRSxRQUFRLEVBQUUsK0JBQStCLENBQUMsQ0FBQztJQUN2RSxNQUFNLE9BQU8sR0FDVCxlQUFlLENBQUMsTUFBTSxFQUFFLFFBQVEsRUFBRSwrQkFBK0IsQ0FBQyxDQUFDO0lBQ3ZFLGlCQUFpQixDQUNiLE9BQU8sQ0FBQyxLQUFLLEVBQUUsT0FBTyxDQUFDLEtBQUssRUFBRSwwQ0FBMEMsQ0FBQyxDQUFDO0lBRTlFOzs7Ozs7Ozs7Ozs7Ozs7Ozs7O09BbUJHO0lBQ0gsTUFBTSxTQUFTLEdBQUcsSUFBSSxDQUFDLE9BQU8sQ0FBQyxDQUFDO0lBQ2hDLE1BQU0sYUFBYSxHQUFHLEdBQUcsQ0FBQyxPQUFPLEVBQUUsT0FBTyxDQUFDLENBQUM7SUFDNUMsTUFBTSxhQUFhLEdBQUcsS0FBSyxDQUFDLEdBQUcsQ0FBQyxHQUFHLENBQUMsR0FBRyxDQUFDLE9BQU8sQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDO0lBRXBELE9BQU8sR0FBRyxDQUFDLEdBQUcsQ0FBQyxTQUFTLEVBQUUsYUFBYSxDQUFDLEVBQUUsYUFBYSxDQUFDLENBQUM7QUFDM0QsQ0FBQztBQUVEOzs7Ozs7Ozs7Ozs7Ozs7Ozs7OztHQW9CRztBQUNILFNBQVMsb0JBQW9CLENBQ3pCLGdCQUE4QixFQUFFLE1BQW9CLEVBQ3BELE9BQTJCLEVBQUUsY0FBYyxHQUFHLENBQUMsRUFDL0MsU0FBUyxHQUFHLFNBQVMsQ0FBQyxzQkFBc0I7SUFDOUMsSUFBSSxpQkFBaUIsR0FBRyxlQUFlLENBQ25DLGdCQUFnQixFQUFFLGtCQUFrQixFQUFFLHFCQUFxQixDQUFDLENBQUM7SUFDakUsTUFBTSxPQUFPLEdBQUcsZUFBZSxDQUFDLE1BQU0sRUFBRSxRQUFRLEVBQUUscUJBQXFCLENBQUMsQ0FBQztJQUN6RSxJQUFJLFFBQVEsR0FBVyxJQUFJLENBQUM7SUFDNUIsSUFBSSxPQUFPLElBQUksSUFBSSxFQUFFO1FBQ25CLFFBQVEsR0FBRyxlQUFlLENBQUMsT0FBTyxFQUFFLFNBQVMsRUFBRSxxQkFBcUIsQ0FBQyxDQUFDO0tBQ3ZFO0lBQ0QsaUJBQWlCLENBQ2IsaUJBQWlCLENBQUMsS0FBSyxFQUFFLE9BQU8sQ0FBQyxLQUFLLEVBQUUsZ0NBQWdDLENBQUMsQ0FBQztJQUU5RSxJQUFJLGNBQWMsR0FBRyxDQUFDLEVBQUU7UUFDdEIsTUFBTSxvQkFBb0IsR0FBRyxNQUFNLENBQUMsY0FBYyxDQUFDLENBQUM7UUFDcEQsTUFBTSxHQUFHLEdBQUcsTUFBTSxDQUFDLENBQUMsQ0FBQyxDQUFDO1FBQ3RCLE1BQU0sSUFBSSxHQUFHLE1BQU0sQ0FBQyxHQUFHLENBQUMsQ0FBQztRQUV6QixpQkFBaUI7WUFDYixHQUFHLENBQUMsR0FBRyxDQUFDLGlCQUFpQixFQUFFLEdBQUcsQ0FBQyxHQUFHLEVBQUUsb0JBQW9CLENBQUMsQ0FBQyxFQUN0RCxHQUFHLENBQUMsSUFBSSxFQUFFLG9CQUFvQixDQUFDLENBQUMsQ0FBQztLQUMxQztJQUNELE1BQU0sTUFBTSxHQUFHLDhCQUE4QixDQUFDLGlCQUFpQixFQUFFLE9BQU8sQ0FBQyxDQUFDO0lBRTFFLE9BQU8sbUJBQW1CLENBQUMsTUFBTSxFQUFFLFFBQVEsRUFBRSxTQUFTLENBQUMsQ0FBQztBQUMxRCxDQUFDO0FBRUQsTUFBTSxDQUFDLE1BQU0sbUJBQW1CLEdBQUcsRUFBRSxDQUFDLEVBQUMsb0JBQW9CLEVBQUMsQ0FBQyxDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiLyoqXG4gKiBAbGljZW5zZVxuICogQ29weXJpZ2h0IDIwMjAgR29vZ2xlIExMQy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC5cbiAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSBcIkxpY2Vuc2VcIik7XG4gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuXG4gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXRcbiAqXG4gKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjBcbiAqXG4gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlXG4gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiBcIkFTIElTXCIgQkFTSVMsXG4gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC5cbiAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmRcbiAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLlxuICogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbiAqL1xuXG5pbXBvcnQge1RlbnNvcn0gZnJvbSAnLi4vLi4vdGVuc29yJztcbmltcG9ydCB7Y29udmVydFRvVGVuc29yfSBmcm9tICcuLi8uLi90ZW5zb3JfdXRpbF9lbnYnO1xuaW1wb3J0IHtUZW5zb3JMaWtlfSBmcm9tICcuLi8uLi90eXBlcyc7XG5pbXBvcnQge2Fzc2VydFNoYXBlc01hdGNofSBmcm9tICcuLi8uLi91dGlsJztcbmltcG9ydCB7YWJzfSBmcm9tICcuLi9hYnMnO1xuaW1wb3J0IHthZGR9IGZyb20gJy4uL2FkZCc7XG5pbXBvcnQge2V4cH0gZnJvbSAnLi4vZXhwJztcbmltcG9ydCB7bG9nMXB9IGZyb20gJy4uL2xvZzFwJztcbmltcG9ydCB7UmVkdWN0aW9ufSBmcm9tICcuLi9sb3NzX29wc191dGlscyc7XG5pbXBvcnQge211bH0gZnJvbSAnLi4vbXVsJztcbmltcG9ydCB7bmVnfSBmcm9tICcuLi9uZWcnO1xuaW1wb3J0IHtvcH0gZnJvbSAnLi4vb3BlcmF0aW9uJztcbmltcG9ydCB7cmVsdX0gZnJvbSAnLi4vcmVsdSc7XG5pbXBvcnQge3NjYWxhcn0gZnJvbSAnLi4vc2NhbGFyJztcbmltcG9ydCB7c3VifSBmcm9tICcuLi9zdWInO1xuXG5pbXBvcnQge2NvbXB1dGVXZWlnaHRlZExvc3N9IGZyb20gJy4vY29tcHV0ZV93ZWlnaHRlZF9sb3NzJztcblxuZnVuY3Rpb24gc2lnbW9pZENyb3NzRW50cm9weVdpdGhMb2dpdHNfPFQgZXh0ZW5kcyBUZW5zb3IsIE8gZXh0ZW5kcyBUZW5zb3I+KFxuICAgIGxhYmVsczogVHxUZW5zb3JMaWtlLCBsb2dpdHM6IFR8VGVuc29yTGlrZSk6IE8ge1xuICBjb25zdCAkbGFiZWxzID1cbiAgICAgIGNvbnZlcnRUb1RlbnNvcihsYWJlbHMsICdsYWJlbHMnLCAnc2lnbW9pZENyb3NzRW50cm9weVdpdGhMb2dpdHMnKTtcbiAgY29uc3QgJGxvZ2l0cyA9XG4gICAgICBjb252ZXJ0VG9UZW5zb3IobG9naXRzLCAnbG9naXRzJywgJ3NpZ21vaWRDcm9zc0VudHJvcHlXaXRoTG9naXRzJyk7XG4gIGFzc2VydFNoYXBlc01hdGNoKFxuICAgICAgJGxhYmVscy5zaGFwZSwgJGxvZ2l0cy5zaGFwZSwgJ0Vycm9yIGluIHNpZ21vaWRDcm9zc0VudHJvcHlXaXRoTG9naXRzOiAnKTtcblxuICAvKipcbiAgICogSW1wbGVtZW50YXRpb24gRGV0YWlsczpcbiAgICpcbiAgICogRm9yIGJyZXZpdHksIGxldCBgeCA9IGxvZ2l0c2AsIGB6ID0gbGFiZWxzYC4gIFRoZSBsb2dpc3RpYyBsb3NzIGlzXG4gICAqICAgICB6ICogLWxvZyhzaWdtb2lkKHgpKSArICgxIC0geikgKiAtbG9nKDEgLSBzaWdtb2lkKHgpKVxuICAgKiAgID0geiAqIC1sb2coMSAvICgxICsgZXhwKC14KSkpICsgKDEgLSB6KSAqIC1sb2coZXhwKC14KSAvICgxICsgZXhwKC14KSkpXG4gICAqICAgPSB6ICogbG9nKDEgKyBleHAoLXgpKSArICgxIC0geikgKiAoLWxvZyhleHAoLXgpKSArIGxvZygxICsgZXhwKC14KSkpXG4gICAqICAgPSB6ICogbG9nKDEgKyBleHAoLXgpKSArICgxIC0geikgKiAoeCArIGxvZygxICsgZXhwKC14KSlcbiAgICogICA9ICgxIC0geikgKiB4ICsgbG9nKDEgKyBleHAoLXgpKVxuICAgKiAgID0geCAtIHggKiB6ICsgbG9nKDEgKyBleHAoLXgpKVxuICAgKlxuICAgKiAgIEZvciB4IDwgMCwgdG8gYXZvaWQgb3ZlcmZsb3cgaW4gZXhwKC14KSwgd2UgcmVmb3JtdWxhdGUgdGhlIGFib3ZlXG4gICAqICAgICB4IC0geCAqIHogKyBsb2coMSArIGV4cCgteCkpXG4gICAqICAgPSBsb2coZXhwKHgpKSAtIHggKiB6ICsgbG9nKDEgKyBleHAoLXgpKVxuICAgKiAgID0gLSB4ICogeiArIGxvZygxICsgZXhwKHgpKVxuICAgKlxuICAgKiBIZW5jZSwgdG8gZW5zdXJlIHN0YWJpbGl0eSBhbmQgYXZvaWQgb3ZlcmZsb3csIHRoZSBpbXBsZW1lbnRhdGlvbiB1c2VzXG4gICAqIHRoaXMgZXF1aXZhbGVudCBmb3JtdWxhdGlvbjpcbiAgICogICAgIG1heCh4LCAwKSAtIHggKiB6ICsgbG9nKDEgKyBleHAoLWFicyh4KSkpXG4gICAqL1xuICBjb25zdCBtYXhPdXRwdXQgPSByZWx1KCRsb2dpdHMpO1xuICBjb25zdCBvdXRwdXRYVGFyZ2V0ID0gbXVsKCRsb2dpdHMsICRsYWJlbHMpO1xuICBjb25zdCBzaWdtb2lkT3V0cHV0ID0gbG9nMXAoZXhwKG5lZyhhYnMoJGxvZ2l0cykpKSk7XG5cbiAgcmV0dXJuIGFkZChzdWIobWF4T3V0cHV0LCBvdXRwdXRYVGFyZ2V0KSwgc2lnbW9pZE91dHB1dCk7XG59XG5cbi8qKlxuICogQ29tcHV0ZXMgdGhlIHNpZ21vaWQgY3Jvc3MgZW50cm9weSBsb3NzIGJldHdlZW4gdHdvIHRlbnNvcnMuXG4gKlxuICogSWYgbGFiZWxTbW9vdGhpbmcgaXMgbm9uemVybywgc21vb3RoIHRoZSBsYWJlbHMgdG93YXJkcyAxLzI6XG4gKlxuICogICBuZXdNdWx0aWNsYXNzTGFiZWxzID0gbXVsdGljbGFzc0xhYmVscyAqICgxIC0gbGFiZWxTbW9vdGhpbmcpXG4gKiAgICAgICAgICAgICAgICAgICAgICAgICArIDAuNSAqIGxhYmVsU21vb3RoaW5nXG4gKlxuICogQHBhcmFtIG11bHRpQ2xhc3NMYWJlbHMgVGhlIGdyb3VuZCB0cnV0aCBvdXRwdXQgdGVuc29yIG9mIHNoYXBlXG4gKiBbYmF0Y2hfc2l6ZSwgbnVtX2NsYXNzZXNdLCBzYW1lIGRpbWVuc2lvbnMgYXMgJ3ByZWRpY3Rpb25zJy5cbiAqIEBwYXJhbSBsb2dpdHMgVGhlIHByZWRpY3RlZCBvdXRwdXRzLlxuICogQHBhcmFtIHdlaWdodHMgVGVuc29yIHdob3NlIHJhbmsgaXMgZWl0aGVyIDAsIG9yIHRoZSBzYW1lIHJhbmsgYXNcbiAqICAgIGBsYWJlbHNgLCBhbmQgbXVzdCBiZSBicm9hZGNhc3RhYmxlIHRvIGBsYWJlbHNgIChpLmUuLCBhbGwgZGltZW5zaW9uc1xuICogICAgbXVzdCBiZSBlaXRoZXIgYDFgLCBvciB0aGUgc2FtZSBhcyB0aGUgY29ycmVzcG9uZGluZyBgbG9zc2VzYFxuICogICAgZGltZW5zaW9uKS5cbiAqIEBwYXJhbSBsYWJlbFNtb290aGluZyBJZiBncmVhdGVyIHRoYW4gMCwgdGhlbiBzbW9vdGggdGhlIGxhYmVscy5cbiAqIEBwYXJhbSByZWR1Y3Rpb24gVHlwZSBvZiByZWR1Y3Rpb24gdG8gYXBwbHkgdG8gbG9zcy4gU2hvdWxkIGJlIG9mIHR5cGVcbiAqICAgIGBSZWR1Y3Rpb25gXG4gKlxuICogQGRvYyB7IGhlYWRpbmc6ICdUcmFpbmluZycsIHN1YmhlYWRpbmc6ICdMb3NzZXMnLCBuYW1lc3BhY2U6ICdsb3NzZXMnIH1cbiAqL1xuZnVuY3Rpb24gc2lnbW9pZENyb3NzRW50cm9weV88VCBleHRlbmRzIFRlbnNvciwgTyBleHRlbmRzIFRlbnNvcj4oXG4gICAgbXVsdGlDbGFzc0xhYmVsczogVHxUZW5zb3JMaWtlLCBsb2dpdHM6IFR8VGVuc29yTGlrZSxcbiAgICB3ZWlnaHRzPzogVGVuc29yfFRlbnNvckxpa2UsIGxhYmVsU21vb3RoaW5nID0gMCxcbiAgICByZWR1Y3Rpb24gPSBSZWR1Y3Rpb24uU1VNX0JZX05PTlpFUk9fV0VJR0hUUyk6IE8ge1xuICBsZXQgJG11bHRpQ2xhc3NMYWJlbHMgPSBjb252ZXJ0VG9UZW5zb3IoXG4gICAgICBtdWx0aUNsYXNzTGFiZWxzLCAnbXVsdGlDbGFzc0xhYmVscycsICdzaWdtb2lkQ3Jvc3NFbnRyb3B5Jyk7XG4gIGNvbnN0ICRsb2dpdHMgPSBjb252ZXJ0VG9UZW5zb3IobG9naXRzLCAnbG9naXRzJywgJ3NpZ21vaWRDcm9zc0VudHJvcHknKTtcbiAgbGV0ICR3ZWlnaHRzOiBUZW5zb3IgPSBudWxsO1xuICBpZiAod2VpZ2h0cyAhPSBudWxsKSB7XG4gICAgJHdlaWdodHMgPSBjb252ZXJ0VG9UZW5zb3Iod2VpZ2h0cywgJ3dlaWdodHMnLCAnc2lnbW9pZENyb3NzRW50cm9weScpO1xuICB9XG4gIGFzc2VydFNoYXBlc01hdGNoKFxuICAgICAgJG11bHRpQ2xhc3NMYWJlbHMuc2hhcGUsICRsb2dpdHMuc2hhcGUsICdFcnJvciBpbiBzaWdtb2lkQ3Jvc3NFbnRyb3B5OiAnKTtcblxuICBpZiAobGFiZWxTbW9vdGhpbmcgPiAwKSB7XG4gICAgY29uc3QgbGFiZWxTbW9vdGhpbmdTY2FsYXIgPSBzY2FsYXIobGFiZWxTbW9vdGhpbmcpO1xuICAgIGNvbnN0IG9uZSA9IHNjYWxhcigxKTtcbiAgICBjb25zdCBoYWxmID0gc2NhbGFyKDAuNSk7XG5cbiAgICAkbXVsdGlDbGFzc0xhYmVscyA9XG4gICAgICAgIGFkZChtdWwoJG11bHRpQ2xhc3NMYWJlbHMsIHN1YihvbmUsIGxhYmVsU21vb3RoaW5nU2NhbGFyKSksXG4gICAgICAgICAgICBtdWwoaGFsZiwgbGFiZWxTbW9vdGhpbmdTY2FsYXIpKTtcbiAgfVxuICBjb25zdCBsb3NzZXMgPSBzaWdtb2lkQ3Jvc3NFbnRyb3B5V2l0aExvZ2l0c18oJG11bHRpQ2xhc3NMYWJlbHMsICRsb2dpdHMpO1xuXG4gIHJldHVybiBjb21wdXRlV2VpZ2h0ZWRMb3NzKGxvc3NlcywgJHdlaWdodHMsIHJlZHVjdGlvbik7XG59XG5cbmV4cG9ydCBjb25zdCBzaWdtb2lkQ3Jvc3NFbnRyb3B5ID0gb3Aoe3NpZ21vaWRDcm9zc0VudHJvcHlffSk7XG4iXX0=","/**\n * @license\n * Copyright 2020 Google LLC. All Rights Reserved.\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n * =============================================================================\n */\nimport { customGrad } from '../../gradients';\nimport { convertToTensor } from '../../tensor_util_env';\nimport { assertShapesMatch } from '../../util';\nimport { add } from '../add';\nimport { expandShapeToKeepDim } from '../axis_util';\nimport { cast } from '../cast';\nimport { div } from '../div';\nimport { exp } from '../exp';\nimport { logSumExp } from '../log_sum_exp';\nimport { Reduction } from '../loss_ops_utils';\nimport { mul } from '../mul';\nimport { neg } from '../neg';\nimport { op } from '../operation';\nimport { reshape } from '../reshape';\nimport { scalar } from '../scalar';\nimport { sub } from '../sub';\nimport { sum } from '../sum';\nimport { computeWeightedLoss } from './compute_weighted_loss';\n/**\n * Computes softmax cross entropy between logits and labels.\n *\n * Measures the probability error in discrete classification tasks in which\n * the classes are mutually exclusive (each entry is in exactly one class).\n * For example, each CIFAR-10 image is labeled with one and only one label: an\n * image can be a dog or a truck, but not both.\n *\n * `NOTE`: While the classes are mutually exclusive, their probabilities need\n * not be. All that is required is that each row of labels is a valid\n * probability distribution. If they are not, the computation of the gradient\n * will be incorrect.\n *\n * `WARNING`: This op expects unscaled logits, since it performs a softmax on\n * logits internally for efficiency. Do not call this op with the output of\n * softmax, as it will produce incorrect results.\n *\n * logits and labels must have the same shape, e.g. [batch_size, num_classes]\n * and the same dtype.\n * @param labels The labels array.\n * @param logits The logits array.\n * @param dim The dimension softmax would be performed on. Defaults to `-1`\n * which indicates the last dimension.\n */\nfunction softmaxCrossEntropyWithLogits_(labels, logits, dim = -1) {\n if (dim === -1) {\n dim = logits.rank - 1;\n }\n if (dim !== logits.rank - 1) {\n throw Error(`Softmax cross entropy along a non-last dimension is not yet ` +\n `supported. Labels / logits was rank ${logits.rank} ` +\n `and dim was ${dim}`);\n }\n // Use a custom gradient for numerical stability.\n const customOp = customGrad((labels, logits, save) => {\n // Reference:\n // 1. http://cs231n.github.io/linear-classify/#softmax\n // 2. https://blog.feedly.com/tricks-of-the-trade-logsumexp/\n const keepDims = true;\n const lse = logSumExp(logits, [dim], keepDims);\n const logResult = sub(cast(logits, 'float32'), lse);\n save([labels, logResult]);\n const costVector = neg(mul(logResult, labels));\n const value = sum(costVector, [dim]);\n const gradFunc = (dy, saved) => {\n const [labels, logResult] = saved;\n const dyShape = expandShapeToKeepDim(dy.shape, [dim]);\n return [\n mul(reshape(dy, dyShape), sub(cast(labels, 'float32'), exp(logResult))),\n mul(reshape(dy, dyShape), sub(exp(logResult), cast(labels, 'float32'))),\n ];\n };\n return { value, gradFunc };\n });\n return customOp(labels, logits);\n}\n/**\n * Computes the softmax cross entropy loss between two tensors.\n *\n * If labelSmoothing is nonzero, smooth the labels towards 1/2:\n *\n * newOnehotLabels = onehotLabels * (1 - labelSmoothing)\n * + labelSmoothing / numClasses\n *\n * @param onehotLabels One hot encoded labels\n * [batch_size, num_classes], same dimensions as 'predictions'.\n * @param logits The predicted outputs.\n * @param weights Tensor whose rank is either 0, or 1, and must be\n * broadcastable to `loss` of shape [batch_size]\n * @param labelSmoothing If greater than 0, then smooth the labels.\n * @param reduction Type of reduction to apply to loss. Should be of type\n * `Reduction`\n *\n * @doc { heading: 'Training', subheading: 'Losses', namespace: 'losses' }\n */\nfunction softmaxCrossEntropy_(onehotLabels, logits, weights, labelSmoothing = 0, reduction = Reduction.SUM_BY_NONZERO_WEIGHTS) {\n let $onehotLabels = convertToTensor(onehotLabels, 'onehotLabels', 'softmaxCrossEntropy');\n const $logits = convertToTensor(logits, 'logits', 'softmaxCrossEntropy');\n let $weights = null;\n if (weights != null) {\n $weights = convertToTensor(weights, 'weights', 'softmaxCrossEntropy');\n }\n assertShapesMatch($onehotLabels.shape, $logits.shape, 'Error in softmaxCrossEntropy: ');\n if (labelSmoothing > 0) {\n const labelSmoothingScalar = scalar(labelSmoothing);\n const one = scalar(1);\n const numClasses = scalar($onehotLabels.shape[1]);\n $onehotLabels =\n add(mul($onehotLabels, sub(one, labelSmoothingScalar)), div(labelSmoothingScalar, numClasses));\n }\n const losses = softmaxCrossEntropyWithLogits_($onehotLabels, $logits);\n return computeWeightedLoss(losses, $weights, reduction);\n}\nexport const softmaxCrossEntropy = op({ softmaxCrossEntropy_ });\n//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic29mdG1heF9jcm9zc19lbnRyb3B5LmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vLi4vLi4vdGZqcy1jb3JlL3NyYy9vcHMvbG9zc2VzL3NvZnRtYXhfY3Jvc3NfZW50cm9weS50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQTs7Ozs7Ozs7Ozs7Ozs7O0dBZUc7QUFDSCxPQUFPLEVBQUMsVUFBVSxFQUFDLE1BQU0saUJBQWlCLENBQUM7QUFHM0MsT0FBTyxFQUFDLGVBQWUsRUFBQyxNQUFNLHVCQUF1QixDQUFDO0FBRXRELE9BQU8sRUFBQyxpQkFBaUIsRUFBQyxNQUFNLFlBQVksQ0FBQztBQUM3QyxPQUFPLEVBQUMsR0FBRyxFQUFDLE1BQU0sUUFBUSxDQUFDO0FBQzNCLE9BQU8sRUFBQyxvQkFBb0IsRUFBQyxNQUFNLGNBQWMsQ0FBQztBQUNsRCxPQUFPLEVBQUMsSUFBSSxFQUFDLE1BQU0sU0FBUyxDQUFDO0FBQzdCLE9BQU8sRUFBQyxHQUFHLEVBQUMsTUFBTSxRQUFRLENBQUM7QUFDM0IsT0FBTyxFQUFDLEdBQUcsRUFBQyxNQUFNLFFBQVEsQ0FBQztBQUMzQixPQUFPLEVBQUMsU0FBUyxFQUFDLE1BQU0sZ0JBQWdCLENBQUM7QUFDekMsT0FBTyxFQUFDLFNBQVMsRUFBQyxNQUFNLG1CQUFtQixDQUFDO0FBQzVDLE9BQU8sRUFBQyxHQUFHLEVBQUMsTUFBTSxRQUFRLENBQUM7QUFDM0IsT0FBTyxFQUFDLEdBQUcsRUFBQyxNQUFNLFFBQVEsQ0FBQztBQUMzQixPQUFPLEVBQUMsRUFBRSxFQUFDLE1BQU0sY0FBYyxDQUFDO0FBQ2hDLE9BQU8sRUFBQyxPQUFPLEVBQUMsTUFBTSxZQUFZLENBQUM7QUFDbkMsT0FBTyxFQUFDLE1BQU0sRUFBQyxNQUFNLFdBQVcsQ0FBQztBQUNqQyxPQUFPLEVBQUMsR0FBRyxFQUFDLE1BQU0sUUFBUSxDQUFDO0FBQzNCLE9BQU8sRUFBQyxHQUFHLEVBQUMsTUFBTSxRQUFRLENB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QixRQUFRLEdBQUcsZUFBZSxDQUFDLE9BQU8sRUFBRSxTQUFTLEVBQUUscUJBQXFCLENBQUMsQ0FBQztLQUN2RTtJQUVELGlCQUFpQixDQUNiLGFBQWEsQ0FBQyxLQUFLLEVBQUUsT0FBTyxDQUFDLEtBQUssRUFBRSxnQ0FBZ0MsQ0FBQyxDQUFDO0lBRTFFLElBQUksY0FBYyxHQUFHLENBQUMsRUFBRTtRQUN0QixNQUFNLG9CQUFvQixHQUFHLE1BQU0sQ0FBQyxjQUFjLENBQUMsQ0FBQztRQUNwRCxNQUFNLEdBQUcsR0FBRyxNQUFNLENBQUMsQ0FBQyxDQUFDLENBQUM7UUFDdEIsTUFBTSxVQUFVLEdBQUcsTUFBTSxDQUFDLGFBQWEsQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQztRQUVsRCxhQUFhO1lBQ1QsR0FBRyxDQUFDLEdBQUcsQ0FBQyxhQUFhLEVBQUUsR0FBRyxDQUFDLEdBQUcsRUFBRSxvQkFBb0IsQ0FBQyxDQUFDLEVBQ2xELEdBQUcsQ0FBQyxvQkFBb0IsRUFBRSxVQUFVLENBQUMsQ0FBQyxDQUFDO0tBQ2hEO0lBRUQsTUFBTSxNQUFNLEdBQUcsOEJBQThCLENBQUMsYUFBYSxFQUFFLE9BQU8sQ0FBQyxDQUFDO0lBRXRFLE9BQU8sbUJBQW1CLENBQUMsTUFBTSxFQUFFLFFBQVEsRUFBRSxTQUFTLENBQUMsQ0FBQztBQUMxRCxDQUFDO0FBRUQsTUFBTSxDQUFDLE1BQU0sbUJBQW1CLEdBQUcsRUFBRSxDQUFDLEVBQUMsb0JBQW9CLEVBQUMsQ0FBQyxDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiLyoqXG4gKiBAbGljZW5zZVxuICogQ29weXJpZ2h0IDIwMjAgR29vZ2xlIExMQy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC5cbiAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSBcIkxpY2Vuc2VcIik7XG4gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuXG4gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXRcbiAqXG4gKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjBcbiAqXG4gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlXG4gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiBcIkFTIElTXCIgQkFTSVMsXG4gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC5cbiAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmRcbiAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLlxuICogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbiAqL1xuaW1wb3J0IHtjdXN0b21HcmFkfSBmcm9tICcuLi8uLi9ncmFkaWVudHMnO1xuaW1wb3J0IHtUZW5zb3J9IGZyb20gJy4uLy4uL3RlbnNvcic7XG5pbXBvcnQge0dyYWRTYXZlRnVuY30gZnJvbSAnLi4vLi4vdGVuc29yX3R5cGVzJztcbmltcG9ydCB7Y29udmVydFRvVGVuc29yfSBmcm9tICcuLi8uLi90ZW5zb3JfdXRpbF9lbnYnO1xuaW1wb3J0IHtUZW5zb3JMaWtlfSBmcm9tICcuLi8uLi90eXBlcyc7XG5pbXBvcnQge2Fzc2VydFNoYXBlc01hdGNofSBmcm9tICcuLi8uLi91dGlsJztcbmltcG9ydCB7YWRkfSBmcm9tICcuLi9hZGQnO1xuaW1wb3J0IHtleHBhbmRTaGFwZVRvS2VlcERpbX0gZnJvbSAnLi4vYXhpc191dGlsJztcbmltcG9ydCB7Y2FzdH0gZnJvbSAnLi4vY2FzdCc7XG5pbXBvcnQge2Rpdn0gZnJvbSAnLi4vZGl2JztcbmltcG9ydCB7ZXhwfSBmcm9tICcuLi9leHAnO1xuaW1wb3J0IHtsb2dTdW1FeHB9IGZyb20gJy4uL2xvZ19zdW1fZXhwJztcbmltcG9ydCB7UmVkdWN0aW9ufSBmcm9tICcuLi9sb3NzX29wc191dGlscyc7XG5pbXBvcnQge211bH0gZnJvbSAnLi4vbXVsJztcbmltcG9ydCB7bmVnfSBmcm9tICcuLi9uZWcnO1xuaW1wb3J0IHtvcH0gZnJvbSAnLi4vb3BlcmF0aW9uJztcbmltcG9ydCB7cmVzaGFwZX0gZnJvbSAnLi4vcmVzaGFwZSc7XG5pbXBvcnQge3NjYWxhcn0gZnJvbSAnLi4vc2NhbGFyJztcbmltcG9ydCB7c3VifSBmcm9tICcuLi9zdWInO1xuaW1wb3J0IHtzdW19IGZyb20gJy4uL3N1bSc7XG5cbmltcG9ydCB7Y29tcHV0ZVdlaWdodGVkTG9zc30gZnJvbSAnLi9jb21wdXRlX3dlaWdodGVkX2xvc3MnO1xuXG4vKipcbiAqIENvbXB1dGVzIHNvZnRtYXggY3Jvc3MgZW50cm9weSBiZXR3ZWVuIGxvZ2l0cyBhbmQgbGFiZWxzLlxuICpcbiAqIE1lYXN1cmVzIHRoZSBwcm9iYWJpbGl0eSBlcnJvciBpbiBkaXNjcmV0ZSBjbGFzc2lmaWNhdGlvbiB0YXNrcyBpbiB3aGljaFxuICogdGhlIGNsYXNzZXMgYXJlIG11dHVhbGx5IGV4Y2x1c2l2ZSAoZWFjaCBlbnRyeSBpcyBpbiBleGFjdGx5IG9uZSBjbGFzcykuXG4gKiBGb3IgZXhhbXBsZSwgZWFjaCBDSUZBUi0xMCBpbWFnZSBpcyBsYWJlbGVkIHdpdGggb25lIGFuZCBvbmx5IG9uZSBsYWJlbDogYW5cbiAqIGltYWdlIGNhbiBiZSBhIGRvZyBvciBhIHRydWNrLCBidXQgbm90IGJvdGguXG4gKlxuICogYE5PVEVgOiBXaGlsZSB0aGUgY2xhc3NlcyBhcmUgbXV0dWFsbHkgZXhjbHVzaXZlLCB0aGVpciBwcm9iYWJpbGl0aWVzIG5lZWRcbiAqIG5vdCBiZS4gQWxsIHRoYXQgaXMgcmVxdWlyZWQgaXMgdGhhdCBlYWNoIHJvdyBvZiBsYWJlbHMgaXMgYSB2YWxpZFxuICogcHJvYmFiaWxpdHkgZGlzdHJpYnV0aW9uLiBJZiB0aGV5IGFyZSBub3QsIHRoZSBjb21wdXRhdGlvbiBvZiB0aGUgZ3JhZGllbnRcbiAqIHdpbGwgYmUgaW5jb3JyZWN0LlxuICpcbiAqIGBXQVJOSU5HYDogVGhpcyBvcCBleHBlY3RzIHVuc2NhbGVkIGxvZ2l0cywgc2luY2UgaXQgcGVyZm9ybXMgYSBzb2Z0bWF4IG9uXG4gKiBsb2dpdHMgaW50ZXJuYWxseSBmb3IgZWZmaWNpZW5jeS4gRG8gbm90IGNhbGwgdGhpcyBvcCB3aXRoIHRoZSBvdXRwdXQgb2ZcbiAqIHNvZnRtYXgsIGFzIGl0IHdpbGwgcHJvZHVjZSBpbmNvcnJlY3QgcmVzdWx0cy5cbiAqXG4gKiBsb2dpdHMgYW5kIGxhYmVscyBtdXN0IGhhdmUgdGhlIHNhbWUgc2hhcGUsIGUuZy4gW2JhdGNoX3NpemUsIG51bV9jbGFzc2VzXVxuICogYW5kIHRoZSBzYW1lIGR0eXBlLlxuICogQHBhcmFtIGxhYmVscyBUaGUgbGFiZWxzIGFycmF5LlxuICogQHBhcmFtIGxvZ2l0cyBUaGUgbG9naXRzIGFycmF5LlxuICogQHBhcmFtIGRpbSBUaGUgZGltZW5zaW9uIHNvZnRtYXggd291bGQgYmUgcGVyZm9ybWVkIG9uLiBEZWZhdWx0cyB0byBgLTFgXG4gKiAgICAgd2hpY2ggaW5kaWNhdGVzIHRoZSBsYXN0IGRpbWVuc2lvbi5cbiAqL1xuZnVuY3Rpb24gc29mdG1heENyb3NzRW50cm9weVdpdGhMb2dpdHNfPFQgZXh0ZW5kcyBUZW5zb3IsIE8gZXh0ZW5kcyBUZW5zb3I+KFxuICAgIGxhYmVsczogVCwgbG9naXRzOiBULCBkaW0gPSAtMSk6IE8ge1xuICBpZiAoZGltID09PSAtMSkge1xuICAgIGRpbSA9IGxvZ2l0cy5yYW5rIC0gMTtcbiAgfVxuXG4gIGlmIChkaW0gIT09IGxvZ2l0cy5yYW5rIC0gMSkge1xuICAgIHRocm93IEVycm9yKFxuICAgICAgICBgU29mdG1heCBjcm9zcyBlbnRyb3B5IGFsb25nIGEgbm9uLWxhc3QgZGltZW5zaW9uIGlzIG5vdCB5ZXQgYCArXG4gICAgICAgIGBzdXBwb3J0ZWQuIExhYmVscyAvIGxvZ2l0cyB3YXMgcmFuayAke2xvZ2l0cy5yYW5rfSBgICtcbiAgICAgICAgYGFuZCBkaW0gd2FzICR7ZGltfWApO1xuICB9XG4gIC8vIFVzZSBhIGN1c3RvbSBncmFkaWVudCBmb3IgbnVtZXJpY2FsIHN0YWJpbGl0eS5cbiAgY29uc3QgY3VzdG9tT3AgPVxuICAgICAgY3VzdG9tR3JhZCgobGFiZWxzOiBUZW5zb3IsIGxvZ2l0czogVGVuc29yLCBzYXZlOiBHcmFkU2F2ZUZ1bmMpID0+IHtcbiAgICAgICAgLy8gUmVmZXJlbmNlOlxuICAgICAgICAvLyAgIDEuIGh0dHA6Ly9jczIzMW4uZ2l0aHViLmlvL2xpbmVhci1jbGFzc2lmeS8jc29mdG1heFxuICAgICAgICAvLyAgIDIuIGh0dHBzOi8vYmxvZy5mZWVkbHkuY29tL3RyaWNrcy1vZi10aGUtdHJhZGUtbG9nc3VtZXhwL1xuICAgICAgICBjb25zdCBrZWVwRGltcyA9IHRydWU7XG4gICAgICAgIGNvbnN0IGxzZSA9IGxvZ1N1bUV4cChsb2dpdHMsIFtkaW1dLCBrZWVwRGltcyk7XG4gICAgICAgIGNvbnN0IGxvZ1Jlc3VsdCA9IHN1YihjYXN0KGxvZ2l0cywgJ2Zsb2F0MzInKSwgbHNlKTtcbiAgICAgICAgc2F2ZShbbGFiZWxzLCBsb2dSZXN1bHRdKTtcblxuICAgICAgICBjb25zdCBjb3N0VmVjdG9yID0gbmVnKG11bChsb2dSZXN1bHQsIGxhYmVscykpO1xuICAgICAgICBjb25zdCB2YWx1ZTogTyA9IHN1bShjb3N0VmVjdG9yLCBbZGltXSk7XG5cbiAgICAgICAgY29uc3QgZ3JhZEZ1bmMgPSAoZHk6IE8sIHNhdmVkOiBUZW5zb3JbXSkgPT4ge1xuICAgICAgICAgIGNvbnN0IFtsYWJlbHMsIGxvZ1Jlc3VsdF0gPSBzYXZlZDtcbiAgICAgICAgICBjb25zdCBkeVNoYXBlID0gZXhwYW5kU2hhcGVUb0tlZXBEaW0oZHkuc2hhcGUsIFtkaW1dKTtcbiAgICAgICAgICByZXR1cm4gW1xuICAgICAgICAgICAgbXVsKHJlc2hhcGUoZHksIGR5U2hhcGUpLFxuICAgICAgICAgICAgICAgIHN1YihjYXN0KGxhYmVscywgJ2Zsb2F0MzInKSwgZXhwKGxvZ1Jlc3VsdCkpKSxcbiAgICAgICAgICAgIG11bChyZXNoYXBlKGR5LCBkeVNoYXBlKSxcbiAgICAgICAgICAgICAgICBzdWIoZXhwKGxvZ1Jlc3VsdCksIGNhc3QobGFiZWxzLCAnZmxvYXQzMicpKSksXG4gICAgICAgICAgXTtcbiAgICAgICAgfTtcbiAgICAgICAgcmV0dXJuIHt2YWx1ZSwgZ3JhZEZ1bmN9O1xuICAgICAgfSk7XG5cbiAgcmV0dXJuIGN1c3RvbU9wKGxhYmVscywgbG9naXRzKTtcbn1cblxuLyoqXG4gKiBDb21wdXRlcyB0aGUgc29mdG1heCBjcm9zcyBlbnRyb3B5IGxvc3MgYmV0d2VlbiB0d28gdGVuc29ycy5cbiAqXG4gKiBJZiBsYWJlbFNtb290aGluZyBpcyBub256ZXJvLCBzbW9vdGggdGhlIGxhYmVscyB0b3dhcmRzIDEvMjpcbiAqXG4gKiAgIG5ld09uZWhvdExhYmVscyA9IG9uZWhvdExhYmVscyAqICgxIC0gbGFiZWxTbW9vdGhpbmcpXG4gKiAgICAgICAgICAgICAgICAgICAgICAgICArIGxhYmVsU21vb3RoaW5nIC8gbnVtQ2xhc3Nlc1xuICpcbiAqIEBwYXJhbSBvbmVob3RMYWJlbHMgT25lIGhvdCBlbmNvZGVkIGxhYmVsc1xuICogICAgW2JhdGNoX3NpemUsIG51bV9jbGFzc2VzXSwgc2FtZSBkaW1lbnNpb25zIGFzICdwcmVkaWN0aW9ucycuXG4gKiBAcGFyYW0gbG9naXRzIFRoZSBwcmVkaWN0ZWQgb3V0cHV0cy5cbiAqIEBwYXJhbSB3ZWlnaHRzIFRlbnNvciB3aG9zZSByYW5rIGlzIGVpdGhlciAwLCBvciAxLCBhbmQgbXVzdCBiZVxuICogICAgYnJvYWRjYXN0YWJsZSB0byBgbG9zc2AgIG9mIHNoYXBlIFtiYXRjaF9zaXplXVxuICogQHBhcmFtIGxhYmVsU21vb3RoaW5nIElmIGdyZWF0ZXIgdGhhbiAwLCB0aGVuIHNtb290aCB0aGUgbGFiZWxzLlxuICogQHBhcmFtIHJlZHVjdGlvbiBUeXBlIG9mIHJlZHVjdGlvbiB0byBhcHBseSB0byBsb3NzLiBTaG91bGQgYmUgb2YgdHlwZVxuICogICAgYFJlZHVjdGlvbmBcbiAqXG4gKiBAZG9jIHsgaGVhZGluZzogJ1RyYWluaW5nJywgc3ViaGVhZGluZzogJ0xvc3NlcycsIG5hbWVzcGFjZTogJ2xvc3NlcycgfVxuICovXG5mdW5jdGlvbiBzb2Z0bWF4Q3Jvc3NFbnRyb3B5XzxUIGV4dGVuZHMgVGVuc29yLCBPIGV4dGVuZHMgVGVuc29yPihcbiAgICBvbmVob3RMYWJlbHM6IFR8VGVuc29yTGlrZSwgbG9naXRzOiBUfFRlbnNvckxpa2UsXG4gICAgd2VpZ2h0cz86IFRlbnNvcnxUZW5zb3JMaWtlLCBsYWJlbFNtb290aGluZyA9IDAsXG4gICAgcmVkdWN0aW9uID0gUmVkdWN0aW9uLlNVTV9CWV9OT05aRVJPX1dFSUdIVFMpOiBPIHtcbiAgbGV0ICRvbmVob3RMYWJlbHMgPVxuICAgICAgY29udmVydFRvVGVuc29yKG9uZWhvdExhYmVscywgJ29uZWhvdExhYmVscycsICdzb2Z0bWF4Q3Jvc3NFbnRyb3B5Jyk7XG4gIGNvbnN0ICRsb2dpdHMgPSBjb252ZXJ0VG9UZW5zb3IobG9naXRzLCAnbG9naXRzJywgJ3NvZnRtYXhDcm9zc0VudHJvcHknKTtcbiAgbGV0ICR3ZWlnaHRzOiBUZW5zb3IgPSBudWxsO1xuXG4gIGlmICh3ZWlnaHRzICE9IG51bGwpIHtcbiAgICAkd2VpZ2h0cyA9IGNvbnZlcnRUb1RlbnNvcih3ZWlnaHRzLCAnd2VpZ2h0cycsICdzb2Z0bWF4Q3Jvc3NFbnRyb3B5Jyk7XG4gIH1cblxuICBhc3NlcnRTaGFwZXNNYXRjaChcbiAgICAgICRvbmVob3RMYWJlbHMuc2hhcGUsICRsb2dpdHMuc2hhcGUsICdFcnJvciBpbiBzb2Z0bWF4Q3Jvc3NFbnRyb3B5OiAnKTtcblxuICBpZiAobGFiZWxTbW9vdGhpbmcgPiAwKSB7XG4gICAgY29uc3QgbGFiZWxTbW9vdGhpbmdTY2FsYXIgPSBzY2FsYXIobGFiZWxTbW9vdGhpbmcpO1xuICAgIGNvbnN0IG9uZSA9IHNjYWxhcigxKTtcbiAgICBjb25zdCBudW1DbGFzc2VzID0gc2NhbGFyKCRvbmVob3RMYWJlbHMuc2hhcGVbMV0pO1xuXG4gICAgJG9uZWhvdExhYmVscyA9XG4gICAgICAgIGFkZChtdWwoJG9uZWhvdExhYmVscywgc3ViKG9uZSwgbGFiZWxTbW9vdGhpbmdTY2FsYXIpKSxcbiAgICAgICAgICAgIGRpdihsYWJlbFNtb290aGluZ1NjYWxhciwgbnVtQ2xhc3NlcykpO1xuICB9XG5cbiAgY29uc3QgbG9zc2VzID0gc29mdG1heENyb3NzRW50cm9weVdpdGhMb2dpdHNfKCRvbmVob3RMYWJlbHMsICRsb2dpdHMpO1xuXG4gIHJldHVybiBjb21wdXRlV2VpZ2h0ZWRMb3NzKGxvc3NlcywgJHdlaWdodHMsIHJlZHVjdGlvbik7XG59XG5cbmV4cG9ydCBjb25zdCBzb2Z0bWF4Q3Jvc3NFbnRyb3B5ID0gb3Aoe3NvZnRtYXhDcm9zc0VudHJvcHlffSk7XG4iXX0=","/**\n * @license\n * Copyright 2021 Google LLC. All Rights Reserved.\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n * =============================================================================\n */\nimport { ENGINE } from '../../engine';\nimport { SparseFillEmptyRows } from '../../kernel_names';\nimport { convertToTensor } from '../../tensor_util_env';\nimport { op } from '../operation';\n/**\n * The input SparseTensor is represented via the map of inputs {`indices`,\n * `values`, `denseShape`}. The output SparseTensor has the same `denseShape`\n * but with indices `outputIndices` and values `outputValues`. This op inserts a\n * single entry for every row that doesn't have any values. The index is created\n * as `[row, 0, ..., 0]` and the inserted value is `defaultValue`.\n *\n * For example, suppose `spInput` has shape [5, 6] and non-empty values:\n * [0, 1]: a\n * [0, 3]: b\n * [2, 0]: c\n * [3, 1]: d\n *\n * Rows 1 and 4 are empty, so the output will be of shape [5, 6] with values:\n * [0, 1]: a\n * [0, 3]: b\n * [1, 0]: `defaultValue`\n * [2, 0]: c\n * [3, 1]: d\n * [4, 0]: `defaultValue`\n *\n * The output SparseTensor will be in row-major order and will have the same\n * shape as the input.\n *\n * This op also returns an indicator vector shaped [dense_shape[0]] such that\n * emptyRowIndicator[i] = True iff row i was an empty row.\n *\n * And a reverse index map vector shaped [indices.shape[0]] that is used during\n * backpropagation, reverseIndexMap[i] = outi s.t. indices[i, j] ==\n * outputIndices[outi, j] for all j\n *\n * ```js\n * const result = tf.sparse.sparseFillEmptyRows(\n * [[0, 0], [1, 0], [1, 3], [1, 4], [3, 2], [3, 3]],\n * [0, 10, 13, 14, 32, 33], [5, 6], -1);\n * console.log(result);\n * result['outputIndices'].print(); // [[0, 0], [1, 0], [1, 3], [1, 4],\n * // [2, 0], [3, 2], [3, 3], [4, 0]]\n * result['outputValues'].print(); // [0, 10, 13, 14,-1, 32, 33, -1]\n * result['emptyRowIndicator'].print(); // [false, false, true, false, true]\n * result['reverseIndexMap'].print(); // [0, 1, 2, 3, 5, 6]\n * ```\n * @param indices: 2-D. The indices of the sparse tensor.\n * @param values: 1-D. The values of the sparse tensor.\n * @param denseShape: 1-D. The shape of the sparse tensor.\n * @param defaultValue: 0-D. Default value to insert into location [row, 0, ...,\n * 0] for rows missing from the input sparse tensor.\n * @return A map with the following properties:\n * - outputIndices\n * - outputValues: 1-D. The values of the filled sparse tensor.\n * - emptyRowIndicator: 1-D. Whether the dense row was missing in the input\n * sparse tensor.\n * - reverseIndexMap: 1-D. A map from the input indices to the output\n * indices.\n * @doc {heading: 'Operations', subheading: 'Sparse'}\n */\nfunction sparseFillEmptyRows_(indices, values, denseShape, defaultValue) {\n const $indices = convertToTensor(indices, 'indices', 'sparseFillEmptyRows', 'int32');\n const $values = convertToTensor(values, 'values', 'sparseFillEmptyRows');\n const $denseShape = convertToTensor(denseShape, 'denseShape', 'sparseFillEmptyRows', 'int32');\n const $defaultValue = convertToTensor(defaultValue, 'defaultValue', 'sparseFillEmptyRows', $values.dtype);\n if ($indices.rank !== 2) {\n throw new Error(`Indices should be Tensor2D but received shape\n ${$indices.shape}`);\n }\n if ($values.rank !== 1) {\n throw new Error(`Values should be Tensor1D but received shape ${$values.shape}`);\n }\n if ($denseShape.rank !== 1) {\n throw new Error(`Dense shape should be Tensor1D but received shape ${$denseShape.shape}`);\n }\n if ($defaultValue.rank !== 0) {\n throw new Error(`Default value should be a scalar but received shape ${$defaultValue.shape}`);\n }\n const inputs = {\n indices: $indices,\n values: $values,\n denseShape: $denseShape,\n defaultValue: $defaultValue\n };\n const result = ENGINE.runKernel(SparseFillEmptyRows, inputs);\n return {\n outputIndices: result[0],\n outputValues: result[1],\n emptyRowIndicator: result[2],\n reverseIndexMap: result[3]\n };\n}\nexport const sparseFillEmptyRows = op({ sparseFillEmptyRows_ });\n//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic3BhcnNlX2ZpbGxfZW1wdHlfcm93cy5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uLy4uLy4uL3RmanMtY29yZS9zcmMvb3BzL3NwYXJzZS9zcGFyc2VfZmlsbF9lbXB0eV9yb3dzLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBOzs7Ozs7Ozs7Ozs7Ozs7R0FlRztBQUVILE9BQU8sRUFBQyxNQUFNLEVBQUMsTUFBTSxjQUFjLENBQUM7QUFDcEMsT0FBTyxFQUFDLG1CQUFtQixFQUE0QixNQUFNLG9CQUFvQixDQUFDO0FBR2xGLE9BQU8sRUFBQyxlQUFlLEVBQUMsTUFBTSx1QkFBdUIsQ0FBQztBQUV0RCxPQUFPLEVBQUMsRUFBRSxFQUFDLE1BQU0sY0FBYyxDQUFDO0FBRWhDOzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7O0dBdURHO0FBQ0gsU0FBUyxvQkFBb0IsQ0FDekIsT0FBNEIsRUFBRSxNQUEyQixFQUN6RCxVQUErQixFQUMvQixZQUErQjtJQUNqQyxNQUFNLFFBQVEsR0FDVixlQUFlLENBQUMsT0FBTyxFQUFFLFNBQVMsRUFBRSxxQkFBcUIsRUFBRSxPQUFPLENBQUMsQ0FBQztJQUN4RSxNQUFNLE9BQU8sR0FBRyxlQUFlLENBQUMsTUFBTSxFQUFFLFFBQVEsRUFBRSxxQkFBcUIsQ0FBQyxDQUFDO0lBQ3pFLE1BQU0sV0FBVyxHQUNiLGVBQWUsQ0FBQyxVQUFVLEVBQUUsWUFBWSxFQUFFLHFCQUFxQixFQUFFLE9BQU8sQ0FBQyxDQUFDO0lBQzlFLE1BQU0sYUFBYSxHQUFHLGVBQWUsQ0FDakMsWUFBWSxFQUFFLGNBQWMsRUFBRSxxQkFBcUIsRUFBRSxPQUFPLENBQUMsS0FBSyxDQUFDLENBQUM7SUFFeEUsSUFBSSxRQUFRLENBQUMsSUFBSSxLQUFLLENBQUMsRUFBRTtRQUN2QixNQUFNLElBQUksS0FBSyxDQUFDO1VBQ1YsUUFBUSxDQUFDLEtBQUssRUFBRSxDQUFDLENBQUM7S0FDekI7SUFDRCxJQUFJLE9BQU8sQ0FBQyxJQUFJLEtBQUssQ0FBQyxFQUFFO1FBQ3RCLE1BQU0sSUFBSSxLQUFLLENBQ1gsZ0RBQWdELE9BQU8sQ0FBQyxLQUFLLEVBQUUsQ0FBQyxDQUFDO0tBQ3RFO0lBQ0QsSUFBSSxXQUFXLENBQUMsSUFBSSxLQUFLLENBQUMsRUFBRTtRQUMxQixNQUFNLElBQUksS0FBSyxDQUFDLHFEQUNaLFdBQVcsQ0FBQyxLQUFLLEVBQUUsQ0FBQyxDQUFDO0tBQzFCO0lBQ0QsSUFBSSxhQUFhLENBQUMsSUFBSSxLQUFLLENBQUMsRUFBRTtRQUM1QixNQUFNLElBQUksS0FBSyxDQUFDLHVEQUNaLGFBQWEsQ0FBQyxLQUFLLEVBQUUsQ0FBQyxDQUFDO0tBQzVCO0lBRUQsTUFBTSxNQUFNLEdBQThCO1FBQ3hDLE9BQU8sRUFBRSxRQUFRO1FBQ2pCLE1BQU0sRUFBRSxPQUFPO1FBQ2YsVUFBVSxFQUFFLFdBQVc7UUFDdkIsWUFBWSxFQUFFLGFBQWE7S0FDNUIsQ0FBQztJQUVGLE1BQU0sTUFBTSxHQUFhLE1BQU0sQ0FBQyxTQUFTLENBQUMsbUJBQW1CLEVBQUUsTUFBWSxDQUFDLENBQUM7SUFDN0UsT0FBTztRQUNMLGFBQWEsRUFBRSxNQUFNLENBQUMsQ0FBQyxDQUFDO1FBQ3hCLFlBQVksRUFBRSxNQUFNLENBQUMsQ0FBQyxDQUFDO1FBQ3ZCLGlCQUFpQixFQUFFLE1BQU0sQ0FBQyxDQUFDLENBQUM7UUFDNUIsZUFBZSxFQUFFLE1BQU0sQ0FBQyxDQUFDLENBQUM7S0FDM0IsQ0FBQztBQUNKLENBQUM7QUFFRCxNQUFNLENBQUMsTUFBTSxtQkFBbUIsR0FBRyxFQUFFLENBQUMsRUFBQyxvQkFBb0IsRUFBQyxDQUFDLENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyIvKipcbiAqIEBsaWNlbnNlXG4gKiBDb3B5cmlnaHQgMjAyMSBHb29nbGUgTExDLiBBbGwgUmlnaHRzIFJlc2VydmVkLlxuICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlIFwiTGljZW5zZVwiKTtcbiAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS5cbiAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdFxuICpcbiAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMFxuICpcbiAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmVcbiAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuIFwiQVMgSVNcIiBCQVNJUyxcbiAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLlxuICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZFxuICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuXG4gKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuICovXG5cbmltcG9ydCB7RU5HSU5FfSBmcm9tICcuLi8uLi9lbmdpbmUnO1xuaW1wb3J0IHtTcGFyc2VGaWxsRW1wdHlSb3dzLCBTcGFyc2VGaWxsRW1wdHlSb3dzSW5wdXRzfSBmcm9tICcuLi8uLi9rZXJuZWxfbmFtZXMnO1xuaW1wb3J0IHtTY2FsYXIsIFRlbnNvciwgVGVuc29yMUQsIFRlbnNvcjJEfSBmcm9tICcuLi8uLi90ZW5zb3InO1xuaW1wb3J0IHtOYW1lZFRlbnNvck1hcH0gZnJvbSAnLi4vLi4vdGVuc29yX3R5cGVzJztcbmltcG9ydCB7Y29udmVydFRvVGVuc29yfSBmcm9tICcuLi8uLi90ZW5zb3JfdXRpbF9lbnYnO1xuaW1wb3J0IHtTY2FsYXJMaWtlLCBUZW5zb3JMaWtlfSBmcm9tICcuLi8uLi90eXBlcyc7XG5pbXBvcnQge29wfSBmcm9tICcuLi9vcGVyYXRpb24nO1xuXG4vKipcbiAqIFRoZSBpbnB1dCBTcGFyc2VUZW5zb3IgaXMgcmVwcmVzZW50ZWQgdmlhIHRoZSBtYXAgb2YgaW5wdXRzIHtgaW5kaWNlc2AsXG4gKiBgdmFsdWVzYCwgYGRlbnNlU2hhcGVgfS4gVGhlIG91dHB1dCBTcGFyc2VUZW5zb3IgaGFzIHRoZSBzYW1lIGBkZW5zZVNoYXBlYFxuICogYnV0IHdpdGggaW5kaWNlcyBgb3V0cHV0SW5kaWNlc2AgYW5kIHZhbHVlcyBgb3V0cHV0VmFsdWVzYC4gVGhpcyBvcCBpbnNlcnRzIGFcbiAqIHNpbmdsZSBlbnRyeSBmb3IgZXZlcnkgcm93IHRoYXQgZG9lc24ndCBoYXZlIGFueSB2YWx1ZXMuIFRoZSBpbmRleCBpcyBjcmVhdGVkXG4gKiBhcyBgW3JvdywgMCwgLi4uLCAwXWAgYW5kIHRoZSBpbnNlcnRlZCB2YWx1ZSBpcyBgZGVmYXVsdFZhbHVlYC5cbiAqXG4gKiBGb3IgZXhhbXBsZSwgc3VwcG9zZSBgc3BJbnB1dGAgaGFzIHNoYXBlIFs1LCA2XSBhbmQgbm9uLWVtcHR5IHZhbHVlczpcbiAqIFswLCAxXTogYVxuICogWzAsIDNdOiBiXG4gKiBbMiwgMF06IGNcbiAqIFszLCAxXTogZFxuICpcbiAqIFJvd3MgMSBhbmQgNCBhcmUgZW1wdHksIHNvIHRoZSBvdXRwdXQgd2lsbCBiZSBvZiBzaGFwZSBbNSwgNl0gd2l0aCB2YWx1ZXM6XG4gKiBbMCwgMV06IGFcbiAqIFswLCAzXTogYlxuICogWzEsIDBdOiBgZGVmYXVsdFZhbHVlYFxuICogWzIsIDBdOiBjXG4gKiBbMywgMV06IGRcbiAqIFs0LCAwXTogYGRlZmF1bHRWYWx1ZWBcbiAqXG4gKiBUaGUgb3V0cHV0IFNwYXJzZVRlbnNvciB3aWxsIGJlIGluIHJvdy1tYWpvciBvcmRlciBhbmQgd2lsbCBoYXZlIHRoZSBzYW1lXG4gKiBzaGFwZSBhcyB0aGUgaW5wdXQuXG4gKlxuICogVGhpcyBvcCBhbHNvIHJldHVybnMgYW4gaW5kaWNhdG9yIHZlY3RvciBzaGFwZWQgW2RlbnNlX3NoYXBlWzBdXSBzdWNoIHRoYXRcbiAqIGVtcHR5Um93SW5kaWNhdG9yW2ldID0gVHJ1ZSBpZmYgcm93IGkgd2FzIGFuIGVtcHR5IHJvdy5cbiAqXG4gKiBBbmQgYSByZXZlcnNlIGluZGV4IG1hcCB2ZWN0b3Igc2hhcGVkIFtpbmRpY2VzLnNoYXBlWzBdXSB0aGF0IGlzIHVzZWQgZHVyaW5nXG4gKiBiYWNrcHJvcGFnYXRpb24sIHJldmVyc2VJbmRleE1hcFtpXSA9IG91dGkgcy50LiBpbmRpY2VzW2ksIGpdID09XG4gKiBvdXRwdXRJbmRpY2VzW291dGksIGpdIGZvciBhbGwgalxuICpcbiAqIGBgYGpzXG4gKiBjb25zdCByZXN1bHQgPSB0Zi5zcGFyc2Uuc3BhcnNlRmlsbEVtcHR5Um93cyhcbiAqICAgW1swLCAwXSwgWzEsIDBdLCBbMSwgM10sIFsxLCA0XSwgWzMsIDJdLCBbMywgM11dLFxuICogICBbMCwgMTAsIDEzLCAxNCwgMzIsIDMzXSwgWzUsIDZdLCAtMSk7XG4gKiBjb25zb2xlLmxvZyhyZXN1bHQpO1xuICogcmVzdWx0WydvdXRwdXRJbmRpY2VzJ10ucHJpbnQoKTsgLy8gW1swLCAwXSwgWzEsIDBdLCBbMSwgM10sIFsxLCA0XSxcbiAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vICBbMiwgMF0sIFszLCAyXSwgWzMsIDNdLCBbNCwgMF1dXG4gKiByZXN1bHRbJ291dHB1dFZhbHVlcyddLnByaW50KCk7IC8vIFswLCAxMCwgMTMsIDE0LC0xLCAzMiwgMzMsIC0xXVxuICogcmVzdWx0WydlbXB0eVJvd0luZGljYXRvciddLnByaW50KCk7IC8vIFtmYWxzZSwgZmFsc2UsIHRydWUsIGZhbHNlLCB0cnVlXVxuICogcmVzdWx0WydyZXZlcnNlSW5kZXhNYXAnXS5wcmludCgpOyAvLyBbMCwgMSwgMiwgMywgNSwgNl1cbiAqIGBgYFxuICogQHBhcmFtIGluZGljZXM6IDItRC4gVGhlIGluZGljZXMgb2YgdGhlIHNwYXJzZSB0ZW5zb3IuXG4gKiBAcGFyYW0gdmFsdWVzOiAxLUQuIFRoZSB2YWx1ZXMgb2YgdGhlIHNwYXJzZSB0ZW5zb3IuXG4gKiBAcGFyYW0gZGVuc2VTaGFwZTogMS1ELiBUaGUgc2hhcGUgb2YgdGhlIHNwYXJzZSB0ZW5zb3IuXG4gKiBAcGFyYW0gZGVmYXVsdFZhbHVlOiAwLUQuIERlZmF1bHQgdmFsdWUgdG8gaW5zZXJ0IGludG8gbG9jYXRpb24gW3JvdywgMCwgLi4uLFxuICogICAgIDBdIGZvciByb3dzIG1pc3NpbmcgZnJvbSB0aGUgaW5wdXQgc3BhcnNlIHRlbnNvci5cbiAqIEByZXR1cm4gQSBtYXAgd2l0aCB0aGUgZm9sbG93aW5nIHByb3BlcnRpZXM6XG4gKiAgICAgLSBvdXRwdXRJbmRpY2VzXG4gKiAgICAgLSBvdXRwdXRWYWx1ZXM6IDEtRC4gVGhlIHZhbHVlcyBvZiB0aGUgZmlsbGVkIHNwYXJzZSB0ZW5zb3IuXG4gKiAgICAgLSBlbXB0eVJvd0luZGljYXRvcjogMS1ELiBXaGV0aGVyIHRoZSBkZW5zZSByb3cgd2FzIG1pc3NpbmcgaW4gdGhlIGlucHV0XG4gKiBzcGFyc2UgdGVuc29yLlxuICogICAgIC0gcmV2ZXJzZUluZGV4TWFwOiAxLUQuIEEgbWFwIGZyb20gdGhlIGlucHV0IGluZGljZXMgdG8gdGhlIG91dHB1dFxuICogaW5kaWNlcy5cbiAqIEBkb2Mge2hlYWRpbmc6ICdPcGVyYXRpb25zJywgc3ViaGVhZGluZzogJ1NwYXJzZSd9XG4gKi9cbmZ1bmN0aW9uIHNwYXJzZUZpbGxFbXB0eVJvd3NfKFxuICAgIGluZGljZXM6IFRlbnNvcjJEfFRlbnNvckxpa2UsIHZhbHVlczogVGVuc29yMUR8VGVuc29yTGlrZSxcbiAgICBkZW5zZVNoYXBlOiBUZW5zb3IxRHxUZW5zb3JMaWtlLFxuICAgIGRlZmF1bHRWYWx1ZTogU2NhbGFyfFNjYWxhckxpa2UpOiBOYW1lZFRlbnNvck1hcCB7XG4gIGNvbnN0ICRpbmRpY2VzID1cbiAgICAgIGNvbnZlcnRUb1RlbnNvcihpbmRpY2VzLCAnaW5kaWNlcycsICdzcGFyc2VGaWxsRW1wdHlSb3dzJywgJ2ludDMyJyk7XG4gIGNvbnN0ICR2YWx1ZXMgPSBjb252ZXJ0VG9UZW5zb3IodmFsdWVzLCAndmFsdWVzJywgJ3NwYXJzZUZpbGxFbXB0eVJvd3MnKTtcbiAgY29uc3QgJGRlbnNlU2hhcGUgPVxuICAgICAgY29udmVydFRvVGVuc29yKGRlbnNlU2hhcGUsICdkZW5zZVNoYXBlJywgJ3NwYXJzZUZpbGxFbXB0eVJvd3MnLCAnaW50MzInKTtcbiAgY29uc3QgJGRlZmF1bHRWYWx1ZSA9IGNvbnZlcnRUb1RlbnNvcihcbiAgICAgIGRlZmF1bHRWYWx1ZSwgJ2RlZmF1bHRWYWx1ZScsICdzcGFyc2VGaWxsRW1wdHlSb3dzJywgJHZhbHVlcy5kdHlwZSk7XG5cbiAgaWYgKCRpbmRpY2VzLnJhbmsgIT09IDIpIHtcbiAgICB0aHJvdyBuZXcgRXJyb3IoYEluZGljZXMgc2hvdWxkIGJlIFRlbnNvcjJEIGJ1dCByZWNlaXZlZCBzaGFwZVxuICAgICAgICAkeyRpbmRpY2VzLnNoYXBlfWApO1xuICB9XG4gIGlmICgkdmFsdWVzLnJhbmsgIT09IDEpIHtcbiAgICB0aHJvdyBuZXcgRXJyb3IoXG4gICAgICAgIGBWYWx1ZXMgc2hvdWxkIGJlIFRlbnNvcjFEIGJ1dCByZWNlaXZlZCBzaGFwZSAkeyR2YWx1ZXMuc2hhcGV9YCk7XG4gIH1cbiAgaWYgKCRkZW5zZVNoYXBlLnJhbmsgIT09IDEpIHtcbiAgICB0aHJvdyBuZXcgRXJyb3IoYERlbnNlIHNoYXBlIHNob3VsZCBiZSBUZW5zb3IxRCBidXQgcmVjZWl2ZWQgc2hhcGUgJHtcbiAgICAgICAgJGRlbnNlU2hhcGUuc2hhcGV9YCk7XG4gIH1cbiAgaWYgKCRkZWZhdWx0VmFsdWUucmFuayAhPT0gMCkge1xuICAgIHRocm93IG5ldyBFcnJvcihgRGVmYXVsdCB2YWx1ZSBzaG91bGQgYmUgYSBzY2FsYXIgYnV0IHJlY2VpdmVkIHNoYXBlICR7XG4gICAgICAgICRkZWZhdWx0VmFsdWUuc2hhcGV9YCk7XG4gIH1cblxuICBjb25zdCBpbnB1dHM6IFNwYXJzZUZpbGxFbXB0eVJvd3NJbnB1dHMgPSB7XG4gICAgaW5kaWNlczogJGluZGljZXMsXG4gICAgdmFsdWVzOiAkdmFsdWVzLFxuICAgIGRlbnNlU2hhcGU6ICRkZW5zZVNoYXBlLFxuICAgIGRlZmF1bHRWYWx1ZTogJGRlZmF1bHRWYWx1ZVxuICB9O1xuXG4gIGNvbnN0IHJlc3VsdDogVGVuc29yW10gPSBFTkdJTkUucnVuS2VybmVsKFNwYXJzZUZpbGxFbXB0eVJvd3MsIGlucHV0cyBhcyB7fSk7XG4gIHJldHVybiB7XG4gICAgb3V0cHV0SW5kaWNlczogcmVzdWx0WzBdLFxuICAgIG91dHB1dFZhbHVlczogcmVzdWx0WzFdLFxuICAgIGVtcHR5Um93SW5kaWNhdG9yOiByZXN1bHRbMl0sXG4gICAgcmV2ZXJzZUluZGV4TWFwOiByZXN1bHRbM11cbiAgfTtcbn1cblxuZXhwb3J0IGNvbnN0IHNwYXJzZUZpbGxFbXB0eVJvd3MgPSBvcCh7c3BhcnNlRmlsbEVtcHR5Um93c199KTtcbiJdfQ==","/**\n * @license\n * Copyright 2021 Google LLC. All Rights Reserved.\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n * =============================================================================\n */\nimport { ENGINE } from '../../engine';\nimport { SparseReshape } from '../../kernel_names';\nimport { convertToTensor } from '../../tensor_util_env';\nimport { op } from '../operation';\n/**\n * This operation has the same semantics as reshape on the represented dense\n * tensor. The `inputIndices` are recomputed based on the requested `newShape`.\n * If one component of `newShape` is the special value -1, the size of that\n * dimension is computed so that the total dense size remains constant. At most\n * one component of `newShape` can be -1. The number of dense elements implied\n * by `newShape` must be the same as the number of dense elements originally\n * implied by `inputShape`. Reshaping does not affect the order of values in the\n * SparseTensor. If the input tensor has rank R_in and N non-empty values, and\n * `newShape` has length R_out, then `inputIndices` has shape [N, R_in],\n * `inputShape` has length R_in, `outputIndices` has shape [N, R_out], and\n * `outputShape` has length R_out.\n *\n * ```js\n * const result = tf.sparse.sparseReshape(\n * [[0, 0, 0], [0, 0, 1], [0, 1, 0], [1, 0, 0], [1, 2, 3]],\n * [2, 3, 6], [9, -1]);\n * console.log(result);\n * result['outputIndices'].print(); //[[0, 0], [0, 1], [1, 2], [4, 2], [8, 1]]\n * result['outputShape'].print(); // [9, 4]\n * ```\n * @param inputIndices: 2-D. N x R_in matrix with the indices of non-empty\n * values in a SparseTensor.\n * @param inputShape: 1-D. R_in Tensor1D with the input SparseTensor's dense\n * shape.\n * @param newShape: 1-D. R_out Tensor1D with the requested new dense shape.\n * @return A map with the following properties:\n * - outputIndices: 2-D. N x R_out matrix with the updated indices of\n * non-empty values in the output SparseTensor.\n * - outputShape: 1-D. R_out vector with the full dense shape of the output\n * SparseTensor. This is the same as newShape but with any -1 dimensions\n * filled in.\n * @doc {heading: 'Operations', subheading: 'Sparse'}\n */\nfunction sparseReshape_(inputIndices, inputShape, newShape) {\n const $inputIndices = convertToTensor(inputIndices, 'inputIndices', 'sparseReshape', 'int32');\n const $inputShape = convertToTensor(inputShape, 'inputShape', 'sparseReshape', 'int32');\n const $newShape = convertToTensor(newShape, 'newShape', 'sparseReshape', 'int32');\n if ($inputIndices.rank !== 2) {\n throw new Error(`Input indices should be Tensor2D but received shape\n ${$inputIndices.shape}`);\n }\n if ($inputShape.rank !== 1) {\n throw new Error(`Input shape should be Tensor1D but received shape ${$inputShape.shape}`);\n }\n if ($newShape.rank !== 1) {\n throw new Error(`New shape should be Tensor1D but received shape ${$newShape.shape}`);\n }\n const inputs = {\n inputIndices: $inputIndices,\n inputShape: $inputShape,\n newShape: $newShape\n };\n const result = ENGINE.runKernel(SparseReshape, inputs);\n return { outputIndices: result[0], outputShape: result[1] };\n}\nexport const sparseReshape = op({ sparseReshape_ });\n//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic3BhcnNlX3Jlc2hhcGUuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi8uLi8uLi90ZmpzLWNvcmUvc3JjL29wcy9zcGFyc2Uvc3BhcnNlX3Jlc2hhcGUudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUE7Ozs7Ozs7Ozs7Ozs7OztHQWVHO0FBRUgsT0FBTyxFQUFDLE1BQU0sRUFBQyxNQUFNLGNBQWMsQ0FBQztBQUNwQyxPQUFPLEVBQUMsYUFBYSxFQUFzQixNQUFNLG9CQUFvQixDQUFDO0FBR3RFLE9BQU8sRUFBQyxlQUFlLEVBQUMsTUFBTSx1QkFBdUIsQ0FBQztBQUV0RCxPQUFPLEVBQUMsRUFBRSxFQUFDLE1BQU0sY0FBYyxDQUFDO0FBRWhDOzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7R0FpQ0c7QUFDSCxTQUFTLGNBQWMsQ0FDbkIsWUFBaUMsRUFBRSxVQUErQixFQUNsRSxRQUE2QjtJQUMvQixNQUFNLGFBQWEsR0FDZixlQUFlLENBQUMsWUFBWSxFQUFFLGNBQWMsRUFBRSxlQUFlLEVBQUUsT0FBTyxDQUFDLENBQUM7SUFDNUUsTUFBTSxXQUFXLEdBQ2IsZUFBZSxDQUFDLFVBQVUsRUFBRSxZQUFZLEVBQUUsZUFBZSxFQUFFLE9BQU8sQ0FBQyxDQUFDO0lBQ3hFLE1BQU0sU0FBUyxHQUNYLGVBQWUsQ0FBQyxRQUFRLEVBQUUsVUFBVSxFQUFFLGVBQWUsRUFBRSxPQUFPLENBQUMsQ0FBQztJQUVwRSxJQUFJLGFBQWEsQ0FBQyxJQUFJLEtBQUssQ0FBQyxFQUFFO1FBQzVCLE1BQU0sSUFBSSxLQUFLLENBQUM7VUFDVixhQUFhLENBQUMsS0FBSyxFQUFFLENBQUMsQ0FBQztLQUM5QjtJQUNELElBQUksV0FBVyxDQUFDLElBQUksS0FBSyxDQUFDLEVBQUU7UUFDMUIsTUFBTSxJQUFJLEtBQUssQ0FBQyxxREFDWixXQUFXLENBQUMsS0FBSyxFQUFFLENBQUMsQ0FBQztLQUMxQjtJQUNELElBQUksU0FBUyxDQUFDLElBQUksS0FBSyxDQUFDLEVBQUU7UUFDeEIsTUFBTSxJQUFJLEtBQUssQ0FDWCxtREFBbUQsU0FBUyxDQUFDLEtBQUssRUFBRSxDQUFDLENBQUM7S0FDM0U7SUFFRCxNQUFNLE1BQU0sR0FBd0I7UUFDbEMsWUFBWSxFQUFFLGFBQWE7UUFDM0IsVUFBVSxFQUFFLFdBQVc7UUFDdkIsUUFBUSxFQUFFLFNBQVM7S0FDcEIsQ0FBQztJQUNGLE1BQU0sTUFBTSxHQUFhLE1BQU0sQ0FBQyxTQUFTLENBQUMsYUFBYSxFQUFFLE1BQVksQ0FBQyxDQUFDO0lBQ3ZFLE9BQU8sRUFBQyxhQUFhLEVBQUUsTUFBTSxDQUFDLENBQUMsQ0FBQyxFQUFFLFdBQVcsRUFBRSxNQUFNLENBQUMsQ0FBQyxDQUFDLEVBQUMsQ0FBQztBQUM1RCxDQUFDO0FBRUQsTUFBTSxDQUFDLE1BQU0sYUFBYSxHQUFHLEVBQUUsQ0FBQyxFQUFDLGNBQWMsRUFBQyxDQUFDLENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyIvKipcbiAqIEBsaWNlbnNlXG4gKiBDb3B5cmlnaHQgMjAyMSBHb29nbGUgTExDLiBBbGwgUmlnaHRzIFJlc2VydmVkLlxuICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlIFwiTGljZW5zZVwiKTtcbiAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS5cbiAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdFxuICpcbiAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMFxuICpcbiAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmVcbiAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuIFwiQVMgSVNcIiBCQVNJUyxcbiAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLlxuICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZFxuICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuXG4gKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuICovXG5cbmltcG9ydCB7RU5HSU5FfSBmcm9tICcuLi8uLi9lbmdpbmUnO1xuaW1wb3J0IHtTcGFyc2VSZXNoYXBlLCBTcGFyc2VSZXNoYXBlSW5wdXRzfSBmcm9tICcuLi8uLi9rZXJuZWxfbmFtZXMnO1xuaW1wb3J0IHtUZW5zb3IsIFRlbnNvcjFELCBUZW5zb3IyRH0gZnJvbSAnLi4vLi4vdGVuc29yJztcbmltcG9ydCB7TmFtZWRUZW5zb3JNYXB9IGZyb20gJy4uLy4uL3RlbnNvcl90eXBlcyc7XG5pbXBvcnQge2NvbnZlcnRUb1RlbnNvcn0gZnJvbSAnLi4vLi4vdGVuc29yX3V0aWxfZW52JztcbmltcG9ydCB7VGVuc29yTGlrZX0gZnJvbSAnLi4vLi4vdHlwZXMnO1xuaW1wb3J0IHtvcH0gZnJvbSAnLi4vb3BlcmF0aW9uJztcblxuLyoqXG4gKiBUaGlzIG9wZXJhdGlvbiBoYXMgdGhlIHNhbWUgc2VtYW50aWNzIGFzIHJlc2hhcGUgb24gdGhlIHJlcHJlc2VudGVkIGRlbnNlXG4gKiB0ZW5zb3IuIFRoZSBgaW5wdXRJbmRpY2VzYCBhcmUgcmVjb21wdXRlZCBiYXNlZCBvbiB0aGUgcmVxdWVzdGVkIGBuZXdTaGFwZWAuXG4gKiBJZiBvbmUgY29tcG9uZW50IG9mIGBuZXdTaGFwZWAgaXMgdGhlIHNwZWNpYWwgdmFsdWUgLTEsIHRoZSBzaXplIG9mIHRoYXRcbiAqIGRpbWVuc2lvbiBpcyBjb21wdXRlZCBzbyB0aGF0IHRoZSB0b3RhbCBkZW5zZSBzaXplIHJlbWFpbnMgY29uc3RhbnQuIEF0IG1vc3RcbiAqIG9uZSBjb21wb25lbnQgb2YgYG5ld1NoYXBlYCBjYW4gYmUgLTEuIFRoZSBudW1iZXIgb2YgZGVuc2UgZWxlbWVudHMgaW1wbGllZFxuICogYnkgYG5ld1NoYXBlYCBtdXN0IGJlIHRoZSBzYW1lIGFzIHRoZSBudW1iZXIgb2YgZGVuc2UgZWxlbWVudHMgb3JpZ2luYWxseVxuICogaW1wbGllZCBieSBgaW5wdXRTaGFwZWAuIFJlc2hhcGluZyBkb2VzIG5vdCBhZmZlY3QgdGhlIG9yZGVyIG9mIHZhbHVlcyBpbiB0aGVcbiAqIFNwYXJzZVRlbnNvci4gSWYgdGhlIGlucHV0IHRlbnNvciBoYXMgcmFuayBSX2luIGFuZCBOIG5vbi1lbXB0eSB2YWx1ZXMsIGFuZFxuICogYG5ld1NoYXBlYCBoYXMgbGVuZ3RoIFJfb3V0LCB0aGVuIGBpbnB1dEluZGljZXNgIGhhcyBzaGFwZSBbTiwgUl9pbl0sXG4gKiBgaW5wdXRTaGFwZWAgaGFzIGxlbmd0aCBSX2luLCBgb3V0cHV0SW5kaWNlc2AgaGFzIHNoYXBlIFtOLCBSX291dF0sIGFuZFxuICogYG91dHB1dFNoYXBlYCBoYXMgbGVuZ3RoIFJfb3V0LlxuICpcbiAqIGBgYGpzXG4gKiBjb25zdCByZXN1bHQgPSB0Zi5zcGFyc2Uuc3BhcnNlUmVzaGFwZShcbiAqICAgW1swLCAwLCAwXSwgWzAsIDAsIDFdLCBbMCwgMSwgMF0sIFsxLCAwLCAwXSwgWzEsIDIsIDNdXSxcbiAqICAgWzIsIDMsIDZdLCBbOSwgLTFdKTtcbiAqIGNvbnNvbGUubG9nKHJlc3VsdCk7XG4gKiByZXN1bHRbJ291dHB1dEluZGljZXMnXS5wcmludCgpOyAvL1tbMCwgMF0sIFswLCAxXSwgWzEsIDJdLCBbNCwgMl0sIFs4LCAxXV1cbiAqIHJlc3VsdFsnb3V0cHV0U2hhcGUnXS5wcmludCgpOyAvLyBbOSwgNF1cbiAqIGBgYFxuICogQHBhcmFtIGlucHV0SW5kaWNlczogMi1ELiBOIHggUl9pbiBtYXRyaXggd2l0aCB0aGUgaW5kaWNlcyBvZiBub24tZW1wdHlcbiAqIHZhbHVlcyBpbiBhIFNwYXJzZVRlbnNvci5cbiAqIEBwYXJhbSBpbnB1dFNoYXBlOiAxLUQuIFJfaW4gVGVuc29yMUQgd2l0aCB0aGUgaW5wdXQgU3BhcnNlVGVuc29yJ3MgZGVuc2VcbiAqIHNoYXBlLlxuICogQHBhcmFtIG5ld1NoYXBlOiAxLUQuIFJfb3V0IFRlbnNvcjFEIHdpdGggdGhlIHJlcXVlc3RlZCBuZXcgZGVuc2Ugc2hhcGUuXG4gKiBAcmV0dXJuIEEgbWFwIHdpdGggdGhlIGZvbGxvd2luZyBwcm9wZXJ0aWVzOlxuICogICAgIC0gb3V0cHV0SW5kaWNlczogMi1ELiBOIHggUl9vdXQgbWF0cml4IHdpdGggdGhlIHVwZGF0ZWQgaW5kaWNlcyBvZlxuICogICAgICAgbm9uLWVtcHR5IHZhbHVlcyBpbiB0aGUgb3V0cHV0IFNwYXJzZVRlbnNvci5cbiAqICAgICAtIG91dHB1dFNoYXBlOiAxLUQuIFJfb3V0IHZlY3RvciB3aXRoIHRoZSBmdWxsIGRlbnNlIHNoYXBlIG9mIHRoZSBvdXRwdXRcbiAqICAgICAgIFNwYXJzZVRlbnNvci4gVGhpcyBpcyB0aGUgc2FtZSBhcyBuZXdTaGFwZSBidXQgd2l0aCBhbnkgLTEgZGltZW5zaW9uc1xuICogICAgICAgIGZpbGxlZCBpbi5cbiAqIEBkb2Mge2hlYWRpbmc6ICdPcGVyYXRpb25zJywgc3ViaGVhZGluZzogJ1NwYXJzZSd9XG4gKi9cbmZ1bmN0aW9uIHNwYXJzZVJlc2hhcGVfKFxuICAgIGlucHV0SW5kaWNlczogVGVuc29yMkR8VGVuc29yTGlrZSwgaW5wdXRTaGFwZTogVGVuc29yMUR8VGVuc29yTGlrZSxcbiAgICBuZXdTaGFwZTogVGVuc29yMUR8VGVuc29yTGlrZSk6IE5hbWVkVGVuc29yTWFwIHtcbiAgY29uc3QgJGlucHV0SW5kaWNlcyA9XG4gICAgICBjb252ZXJ0VG9UZW5zb3IoaW5wdXRJbmRpY2VzLCAnaW5wdXRJbmRpY2VzJywgJ3NwYXJzZVJlc2hhcGUnLCAnaW50MzInKTtcbiAgY29uc3QgJGlucHV0U2hhcGUgPVxuICAgICAgY29udmVydFRvVGVuc29yKGlucHV0U2hhcGUsICdpbnB1dFNoYXBlJywgJ3NwYXJzZVJlc2hhcGUnLCAnaW50MzInKTtcbiAgY29uc3QgJG5ld1NoYXBlID1cbiAgICAgIGNvbnZlcnRUb1RlbnNvcihuZXdTaGFwZSwgJ25ld1NoYXBlJywgJ3NwYXJzZVJlc2hhcGUnLCAnaW50MzInKTtcblxuICBpZiAoJGlucHV0SW5kaWNlcy5yYW5rICE9PSAyKSB7XG4gICAgdGhyb3cgbmV3IEVycm9yKGBJbnB1dCBpbmRpY2VzIHNob3VsZCBiZSBUZW5zb3IyRCBidXQgcmVjZWl2ZWQgc2hhcGVcbiAgICAgICAgJHskaW5wdXRJbmRpY2VzLnNoYXBlfWApO1xuICB9XG4gIGlmICgkaW5wdXRTaGFwZS5yYW5rICE9PSAxKSB7XG4gICAgdGhyb3cgbmV3IEVycm9yKGBJbnB1dCBzaGFwZSBzaG91bGQgYmUgVGVuc29yMUQgYnV0IHJlY2VpdmVkIHNoYXBlICR7XG4gICAgICAgICRpbnB1dFNoYXBlLnNoYXBlfWApO1xuICB9XG4gIGlmICgkbmV3U2hhcGUucmFuayAhPT0gMSkge1xuICAgIHRocm93IG5ldyBFcnJvcihcbiAgICAgICAgYE5ldyBzaGFwZSBzaG91bGQgYmUgVGVuc29yMUQgYnV0IHJlY2VpdmVkIHNoYXBlICR7JG5ld1NoYXBlLnNoYXBlfWApO1xuICB9XG5cbiAgY29uc3QgaW5wdXRzOiBTcGFyc2VSZXNoYXBlSW5wdXRzID0ge1xuICAgIGlucHV0SW5kaWNlczogJGlucHV0SW5kaWNlcyxcbiAgICBpbnB1dFNoYXBlOiAkaW5wdXRTaGFwZSxcbiAgICBuZXdTaGFwZTogJG5ld1NoYXBlXG4gIH07XG4gIGNvbnN0IHJlc3VsdDogVGVuc29yW10gPSBFTkdJTkUucnVuS2VybmVsKFNwYXJzZVJlc2hhcGUsIGlucHV0cyBhcyB7fSk7XG4gIHJldHVybiB7b3V0cHV0SW5kaWNlczogcmVzdWx0WzBdLCBvdXRwdXRTaGFwZTogcmVzdWx0WzFdfTtcbn1cblxuZXhwb3J0IGNvbnN0IHNwYXJzZVJlc2hhcGUgPSBvcCh7c3BhcnNlUmVzaGFwZV99KTtcbiJdfQ==","/**\n * @license\n * Copyright 2021 Google LLC. All Rights Reserved.\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n * =============================================================================\n */\nimport { ENGINE } from '../../engine';\nimport { SparseSegmentMean } from '../../kernel_names';\nimport { convertToTensor } from '../../tensor_util_env';\nimport { op } from '../operation';\n/**\n * Computes the mean along sparse segments of a tensor.\n *\n * ```js\n * const c = tf.tensor2d([[1,2,3,4], [-1,-2,-3,-4], [6,7,8,9]]);\n * // Select two rows, one segment.\n * const result1 = tf.sparse.sparseSegmentMean(c,\n * tf.tensor1d([0, 1], 'int32'),\n * tf.tensor1d([0, 0], 'int32'));\n * result1.print(); // [[0, 0, 0, 0]]\n *\n * // Select two rows, two segments.\n * const result2 = tf.sparse.sparseSegmentMean(c,\n * tf.tensor1d([0, 1], 'int32'),\n * tf.tensor1d([0, 1], 'int32'));\n * result2.print(); // [[1, 2, 3, 4], [-1, -2, -3, -4]]\n *\n * // Select all rows, two segments.\n * const result3 = tf.sparse.sparseSegmentMean(c,\n * tf.tensor1d([0, 1, 2], 'int32'),\n * tf.tensor1d([0, 1, 1], 'int32'));\n * result3.print(); // [[1.0, 2.0, 3.0, 4.0], [2.5, 2.5, 2.5, 2.5]]\n * ```\n * @param data: A Tensor of at least one dimension with data that will be\n * assembled in the output.\n * @param indices: A 1-D Tensor with indices into data. Has same rank as\n * segmentIds.\n * @param segmentIds: A 1-D Tensor with indices into the output Tensor. Values\n * should be sorted and can be repeated.\n * @return Has same shape as data, except for dimension 0 which has equal to\n * the number of segments.\n *\n * @doc {heading: 'Operations', subheading: 'Sparse'}\n */\nfunction sparseSegmentMean_(data, indices, segmentIds) {\n const $data = convertToTensor(data, 'data', 'sparseSegmentMean');\n const $indices = convertToTensor(indices, 'indices', 'sparseSegmentMean', 'int32');\n const $segmentIds = convertToTensor(segmentIds, 'segmentIds', 'sparseSegmentMean', 'int32');\n if ($data.rank < 1) {\n throw new Error(`Data should be at least 1 dimensional but received scalar`);\n }\n if ($indices.rank !== 1) {\n throw new Error(`Indices should be Tensor1D but received shape\n ${$indices.shape}`);\n }\n if ($segmentIds.rank !== 1) {\n throw new Error(`Segment ids should be Tensor1D but received shape\n ${$segmentIds.shape}`);\n }\n const inputs = {\n data: $data,\n indices: $indices,\n segmentIds: $segmentIds\n };\n return ENGINE.runKernel(SparseSegmentMean, inputs);\n}\nexport const sparseSegmentMean = op({ sparseSegmentMean_ });\n//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic3BhcnNlX3NlZ21lbnRfbWVhbi5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uLy4uLy4uL3RmanMtY29yZS9zcmMvb3BzL3NwYXJzZS9zcGFyc2Vfc2VnbWVudF9tZWFuLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBOzs7Ozs7Ozs7Ozs7Ozs7R0FlRztBQUVILE9BQU8sRUFBQyxNQUFNLEVBQUMsTUFBTSxjQUFjLENBQUM7QUFDcEMsT0FBTyxFQUFDLGlCQUFpQixFQUEwQixNQUFNLG9CQUFvQixDQUFDO0FBRTlFLE9BQU8sRUFBQyxlQUFlLEVBQUMsTUFBTSx1QkFBdUIsQ0FBQztBQUV0RCxPQUFPLEVBQUMsRUFBRSxFQUFDLE1BQU0sY0FBYyxDQUFDO0FBRWhDOzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7R0FpQ0c7QUFDSCxTQUFTLGtCQUFrQixDQUN2QixJQUF1QixFQUFFLE9BQTRCLEVBQ3JELFVBQStCO0lBQ2pDLE1BQU0sS0FBSyxHQUFHLGVBQWUsQ0FBQyxJQUFJLEVBQUUsTUFBTSxFQUFFLG1CQUFtQixDQUFDLENBQUM7SUFDakUsTUFBTSxRQUFRLEdBQ1YsZUFBZSxDQUFDLE9BQU8sRUFBRSxTQUFTLEVBQUUsbUJBQW1CLEVBQUUsT0FBTyxDQUFDLENBQUM7SUFDdEUsTUFBTSxXQUFXLEdBQ2IsZUFBZSxDQUFDLFVBQVUsRUFBRSxZQUFZLEVBQUUsbUJBQW1CLEVBQUUsT0FBTyxDQUFDLENBQUM7SUFFNUUsSUFBSSxLQUFLLENBQUMsSUFBSSxHQUFHLENBQUMsRUFBRTtRQUNsQixNQUFNLElBQUksS0FBSyxDQUNYLDJEQUEyRCxDQUFDLENBQUM7S0FDbEU7SUFDRCxJQUFJLFFBQVEsQ0FBQyxJQUFJLEtBQUssQ0FBQyxFQUFFO1FBQ3ZCLE1BQU0sSUFBSSxLQUFLLENBQUM7WUFDUixRQUFRLENBQUMsS0FBSyxFQUFFLENBQUMsQ0FBQztLQUMzQjtJQUNELElBQUksV0FBVyxDQUFDLElBQUksS0FBSyxDQUFDLEVBQUU7UUFDMUIsTUFBTSxJQUFJLEtBQUssQ0FBQztZQUNSLFdBQVcsQ0FBQyxLQUFLLEVBQUUsQ0FBQyxDQUFDO0tBQzlCO0lBRUQsTUFBTSxNQUFNLEdBQTRCO1FBQ3RDLElBQUksRUFBRSxLQUFLO1FBQ1gsT0FBTyxFQUFFLFFBQVE7UUFDakIsVUFBVSxFQUFFLFdBQVc7S0FDeEIsQ0FBQztJQUVGLE9BQU8sTUFBTSxDQUFDLFNBQVMsQ0FBQyxpQkFBaUIsRUFBRSxNQUFZLENBQUMsQ0FBQztBQUMzRCxDQUFDO0FBRUQsTUFBTSxDQUFDLE1BQU0saUJBQWlCLEdBQUcsRUFBRSxDQUFDLEVBQUMsa0JBQWtCLEVBQUMsQ0FBQyxDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiLyoqXG4gKiBAbGljZW5zZVxuICogQ29weXJpZ2h0IDIwMjEgR29vZ2xlIExMQy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC5cbiAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSBcIkxpY2Vuc2VcIik7XG4gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuXG4gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXRcbiAqXG4gKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjBcbiAqXG4gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlXG4gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiBcIkFTIElTXCIgQkFTSVMsXG4gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC5cbiAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmRcbiAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLlxuICogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbiAqL1xuXG5pbXBvcnQge0VOR0lORX0gZnJvbSAnLi4vLi4vZW5naW5lJztcbmltcG9ydCB7U3BhcnNlU2VnbWVudE1lYW4sIFNwYXJzZVNlZ21lbnRNZWFuSW5wdXRzfSBmcm9tICcuLi8uLi9rZXJuZWxfbmFtZXMnO1xuaW1wb3J0IHtUZW5zb3IsIFRlbnNvcjFEfSBmcm9tICcuLi8uLi90ZW5zb3InO1xuaW1wb3J0IHtjb252ZXJ0VG9UZW5zb3J9IGZyb20gJy4uLy4uL3RlbnNvcl91dGlsX2Vudic7XG5pbXBvcnQge1RlbnNvckxpa2V9IGZyb20gJy4uLy4uL3R5cGVzJztcbmltcG9ydCB7b3B9IGZyb20gJy4uL29wZXJhdGlvbic7XG5cbi8qKlxuICogQ29tcHV0ZXMgdGhlIG1lYW4gYWxvbmcgc3BhcnNlIHNlZ21lbnRzIG9mIGEgdGVuc29yLlxuICpcbiAqIGBgYGpzXG4gKiBjb25zdCBjID0gdGYudGVuc29yMmQoW1sxLDIsMyw0XSwgWy0xLC0yLC0zLC00XSwgWzYsNyw4LDldXSk7XG4gKiAvLyBTZWxlY3QgdHdvIHJvd3MsIG9uZSBzZWdtZW50LlxuICogY29uc3QgcmVzdWx0MSA9IHRmLnNwYXJzZS5zcGFyc2VTZWdtZW50TWVhbihjLFxuICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGYudGVuc29yMWQoWzAsIDFdLCAnaW50MzInKSxcbiAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRmLnRlbnNvcjFkKFswLCAwXSwgJ2ludDMyJykpO1xuICogcmVzdWx0MS5wcmludCgpOyAvLyBbWzAsIDAsIDAsIDBdXVxuICpcbiAqIC8vIFNlbGVjdCB0d28gcm93cywgdHdvIHNlZ21lbnRzLlxuICogY29uc3QgcmVzdWx0MiA9IHRmLnNwYXJzZS5zcGFyc2VTZWdtZW50TWVhbihjLFxuICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0Zi50ZW5zb3IxZChbMCwgMV0sICdpbnQzMicpLFxuICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0Zi50ZW5zb3IxZChbMCwgMV0sICdpbnQzMicpKTtcbiAqIHJlc3VsdDIucHJpbnQoKTsgLy8gW1sxLCAyLCAzLCA0XSwgWy0xLCAtMiwgLTMsIC00XV1cbiAqXG4gKiAvLyBTZWxlY3QgYWxsIHJvd3MsIHR3byBzZWdtZW50cy5cbiAqIGNvbnN0IHJlc3VsdDMgPSB0Zi5zcGFyc2Uuc3BhcnNlU2VnbWVudE1lYW4oYyxcbiAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGYudGVuc29yMWQoWzAsIDEsIDJdLCAnaW50MzInKSxcbiAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGYudGVuc29yMWQoWzAsIDEsIDFdLCAnaW50MzInKSk7XG4gKiByZXN1bHQzLnByaW50KCk7IC8vIFtbMS4wLCAyLjAsIDMuMCwgNC4wXSwgWzIuNSwgMi41LCAyLjUsIDIuNV1dXG4gKiBgYGBcbiAqIEBwYXJhbSBkYXRhOiBBIFRlbnNvciBvZiBhdCBsZWFzdCBvbmUgZGltZW5zaW9uIHdpdGggZGF0YSB0aGF0IHdpbGwgYmVcbiAqICAgICBhc3NlbWJsZWQgaW4gdGhlIG91dHB1dC5cbiAqIEBwYXJhbSBpbmRpY2VzOiBBIDEtRCBUZW5zb3Igd2l0aCBpbmRpY2VzIGludG8gZGF0YS4gSGFzIHNhbWUgcmFuayBhc1xuICogICAgIHNlZ21lbnRJZHMuXG4gKiBAcGFyYW0gc2VnbWVudElkczogQSAxLUQgVGVuc29yIHdpdGggaW5kaWNlcyBpbnRvIHRoZSBvdXRwdXQgVGVuc29yLiBWYWx1ZXNcbiAqICAgICBzaG91bGQgYmUgc29ydGVkIGFuZCBjYW4gYmUgcmVwZWF0ZWQuXG4gKiBAcmV0dXJuIEhhcyBzYW1lIHNoYXBlIGFzIGRhdGEsIGV4Y2VwdCBmb3IgZGltZW5zaW9uIDAgd2hpY2ggaGFzIGVxdWFsIHRvXG4gKiAgICAgICAgIHRoZSBudW1iZXIgb2Ygc2VnbWVudHMuXG4gKlxuICogQGRvYyB7aGVhZGluZzogJ09wZXJhdGlvbnMnLCBzdWJoZWFkaW5nOiAnU3BhcnNlJ31cbiAqL1xuZnVuY3Rpb24gc3BhcnNlU2VnbWVudE1lYW5fKFxuICAgIGRhdGE6IFRlbnNvcnxUZW5zb3JMaWtlLCBpbmRpY2VzOiBUZW5zb3IxRHxUZW5zb3JMaWtlLFxuICAgIHNlZ21lbnRJZHM6IFRlbnNvcjFEfFRlbnNvckxpa2UpOiBUZW5zb3Ige1xuICBjb25zdCAkZGF0YSA9IGNvbnZlcnRUb1RlbnNvcihkYXRhLCAnZGF0YScsICdzcGFyc2VTZWdtZW50TWVhbicpO1xuICBjb25zdCAkaW5kaWNlcyA9XG4gICAgICBjb252ZXJ0VG9UZW5zb3IoaW5kaWNlcywgJ2luZGljZXMnLCAnc3BhcnNlU2VnbWVudE1lYW4nLCAnaW50MzInKTtcbiAgY29uc3QgJHNlZ21lbnRJZHMgPVxuICAgICAgY29udmVydFRvVGVuc29yKHNlZ21lbnRJZHMsICdzZWdtZW50SWRzJywgJ3NwYXJzZVNlZ21lbnRNZWFuJywgJ2ludDMyJyk7XG5cbiAgaWYgKCRkYXRhLnJhbmsgPCAxKSB7XG4gICAgdGhyb3cgbmV3IEVycm9yKFxuICAgICAgICBgRGF0YSBzaG91bGQgYmUgYXQgbGVhc3QgMSBkaW1lbnNpb25hbCBidXQgcmVjZWl2ZWQgc2NhbGFyYCk7XG4gIH1cbiAgaWYgKCRpbmRpY2VzLnJhbmsgIT09IDEpIHtcbiAgICB0aHJvdyBuZXcgRXJyb3IoYEluZGljZXMgc2hvdWxkIGJlIFRlbnNvcjFEIGJ1dCByZWNlaXZlZCBzaGFwZVxuICAgICAgICAgICR7JGluZGljZXMuc2hhcGV9YCk7XG4gIH1cbiAgaWYgKCRzZWdtZW50SWRzLnJhbmsgIT09IDEpIHtcbiAgICB0aHJvdyBuZXcgRXJyb3IoYFNlZ21lbnQgaWRzIHNob3VsZCBiZSBUZW5zb3IxRCBidXQgcmVjZWl2ZWQgc2hhcGVcbiAgICAgICAgICAkeyRzZWdtZW50SWRzLnNoYXBlfWApO1xuICB9XG5cbiAgY29uc3QgaW5wdXRzOiBTcGFyc2VTZWdtZW50TWVhbklucHV0cyA9IHtcbiAgICBkYXRhOiAkZGF0YSxcbiAgICBpbmRpY2VzOiAkaW5kaWNlcyxcbiAgICBzZWdtZW50SWRzOiAkc2VnbWVudElkc1xuICB9O1xuXG4gIHJldHVybiBFTkdJTkUucnVuS2VybmVsKFNwYXJzZVNlZ21lbnRNZWFuLCBpbnB1dHMgYXMge30pO1xufVxuXG5leHBvcnQgY29uc3Qgc3BhcnNlU2VnbWVudE1lYW4gPSBvcCh7c3BhcnNlU2VnbWVudE1lYW5ffSk7XG4iXX0=","/**\n * @license\n * Copyright 2021 Google LLC. All Rights Reserved.\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n * =============================================================================\n */\nimport { ENGINE } from '../../engine';\nimport { SparseSegmentSum } from '../../kernel_names';\nimport { convertToTensor } from '../../tensor_util_env';\nimport { op } from '../operation';\n/**\n * Computes the sum along sparse segments of a tensor.\n *\n * ```js\n * const c = tf.tensor2d([[1,2,3,4], [-1,-2,-3,-4], [5,6,7,8]]);\n * // Select two rows, one segment.\n * const result1 = tf.sparse.sparseSegmentSum(c,\n * tf.tensor1d([0, 1], 'int32'),\n * tf.tensor1d([0, 0], 'int32'));\n * result1.print(); // [[0, 0, 0, 0]]\n *\n * // Select two rows, two segments.\n * const result2 = tf.sparse.sparseSegmentSum(c,\n * tf.tensor1d([0, 1], 'int32'),\n * tf.tensor1d([0, 1], 'int32'));\n * result2.print(); // [[1, 2, 3, 4], [-1, -2, -3, -4]]\n *\n * // Select all rows, two segments.\n * const result3 = tf.sparse.sparseSegmentSum(c,\n * tf.tensor1d([0, 1, 2], 'int32'),\n * tf.tensor1d([0, 0, 1], 'int32'));\n * result3.print(); // [[0, 0, 0, 0], [5, 6, 7, 8]]\n * ```\n * @param data: A Tensor of at least one dimension with data that will be\n * assembled in the output.\n * @param indices: A 1-D Tensor with indices into data. Has same rank as\n * segmentIds.\n * @param segmentIds: A 1-D Tensor with indices into the output Tensor. Values\n * should be sorted and can be repeated.\n * @return Has same shape as data, except for dimension 0 which has equal to\n * the number of segments.\n *\n * @doc {heading: 'Operations', subheading: 'Sparse'}\n */\nfunction sparseSegmentSum_(data, indices, segmentIds) {\n const $data = convertToTensor(data, 'data', 'sparseSegmentSum');\n const $indices = convertToTensor(indices, 'indices', 'sparseSegmentSum', 'int32');\n const $segmentIds = convertToTensor(segmentIds, 'segmentIds', 'sparseSegmentSum', 'int32');\n if ($data.rank < 1) {\n throw new Error(`Data should be at least 1 dimensional but received scalar`);\n }\n if ($indices.rank !== 1) {\n throw new Error(`Indices should be Tensor1D but received shape\n ${$indices.shape}`);\n }\n if ($segmentIds.rank !== 1) {\n throw new Error(`Segment ids should be Tensor1D but received shape\n ${$segmentIds.shape}`);\n }\n const inputs = {\n data: $data,\n indices: $indices,\n segmentIds: $segmentIds\n };\n return ENGINE.runKernel(SparseSegmentSum, inputs);\n}\nexport const sparseSegmentSum = op({ sparseSegmentSum_ });\n//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic3BhcnNlX3NlZ21lbnRfc3VtLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vLi4vLi4vdGZqcy1jb3JlL3NyYy9vcHMvc3BhcnNlL3NwYXJzZV9zZWdtZW50X3N1bS50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQTs7Ozs7Ozs7Ozs7Ozs7O0dBZUc7QUFFSCxPQUFPLEVBQUMsTUFBTSxFQUFDLE1BQU0sY0FBYyxDQUFDO0FBQ3BDLE9BQU8sRUFBQyxnQkFBZ0IsRUFBeUIsTUFBTSxvQkFBb0IsQ0FBQztBQUU1RSxPQUFPLEVBQUMsZUFBZSxFQUFDLE1BQU0sdUJBQXVCLENBQUM7QUFFdEQsT0FBTyxFQUFDLEVBQUUsRUFBQyxNQUFNLGNBQWMsQ0FBQztBQUVoQzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7O0dBaUNHO0FBQ0gsU0FBUyxpQkFBaUIsQ0FDdEIsSUFBdUIsRUFBRSxPQUE0QixFQUNyRCxVQUErQjtJQUNqQyxNQUFNLEtBQUssR0FBRyxlQUFlLENBQUMsSUFBSSxFQUFFLE1BQU0sRUFBRSxrQkFBa0IsQ0FBQyxDQUFDO0lBQ2hFLE1BQU0sUUFBUSxHQUNWLGVBQWUsQ0FBQyxPQUFPLEVBQUUsU0FBUyxFQUFFLGtCQUFrQixFQUFFLE9BQU8sQ0FBQyxDQUFDO0lBQ3JFLE1BQU0sV0FBVyxHQUNiLGVBQWUsQ0FBQyxVQUFVLEVBQUUsWUFBWSxFQUFFLGtCQUFrQixFQUFFLE9BQU8sQ0FBQyxDQUFDO0lBRTNFLElBQUksS0FBSyxDQUFDLElBQUksR0FBRyxDQUFDLEVBQUU7UUFDbEIsTUFBTSxJQUFJLEtBQUssQ0FDWCwyREFBMkQsQ0FBQyxDQUFDO0tBQ2xFO0lBQ0QsSUFBSSxRQUFRLENBQUMsSUFBSSxLQUFLLENBQUMsRUFBRTtRQUN2QixNQUFNLElBQUksS0FBSyxDQUFDO1dBQ1QsUUFBUSxDQUFDLEtBQUssRUFBRSxDQUFDLENBQUM7S0FDMUI7SUFDRCxJQUFJLFdBQVcsQ0FBQyxJQUFJLEtBQUssQ0FBQyxFQUFFO1FBQzFCLE1BQU0sSUFBSSxLQUFLLENBQUM7V0FDVCxXQUFXLENBQUMsS0FBSyxFQUFFLENBQUMsQ0FBQztLQUM3QjtJQUVELE1BQU0sTUFBTSxHQUEyQjtRQUNyQyxJQUFJLEVBQUUsS0FBSztRQUNYLE9BQU8sRUFBRSxRQUFRO1FBQ2pCLFVBQVUsRUFBRSxXQUFXO0tBQ3hCLENBQUM7SUFFRixPQUFPLE1BQU0sQ0FBQyxTQUFTLENBQUMsZ0JBQWdCLEVBQUUsTUFBWSxDQUFDLENBQUM7QUFDMUQsQ0FBQztBQUVELE1BQU0sQ0FBQyxNQUFNLGdCQUFnQixHQUFHLEVBQUUsQ0FBQyxFQUFDLGlCQUFpQixFQUFDLENBQUMsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbIi8qKlxuICogQGxpY2Vuc2VcbiAqIENvcHlyaWdodCAyMDIxIEdvb2dsZSBMTEMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuXG4gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgXCJMaWNlbnNlXCIpO1xuICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLlxuICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0XG4gKlxuICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wXG4gKlxuICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZVxuICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gXCJBUyBJU1wiIEJBU0lTLFxuICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuXG4gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kXG4gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS5cbiAqID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4gKi9cblxuaW1wb3J0IHtFTkdJTkV9IGZyb20gJy4uLy4uL2VuZ2luZSc7XG5pbXBvcnQge1NwYXJzZVNlZ21lbnRTdW0sIFNwYXJzZVNlZ21lbnRTdW1JbnB1dHN9IGZyb20gJy4uLy4uL2tlcm5lbF9uYW1lcyc7XG5pbXBvcnQge1RlbnNvciwgVGVuc29yMUR9IGZyb20gJy4uLy4uL3RlbnNvcic7XG5pbXBvcnQge2NvbnZlcnRUb1RlbnNvcn0gZnJvbSAnLi4vLi4vdGVuc29yX3V0aWxfZW52JztcbmltcG9ydCB7VGVuc29yTGlrZX0gZnJvbSAnLi4vLi4vdHlwZXMnO1xuaW1wb3J0IHtvcH0gZnJvbSAnLi4vb3BlcmF0aW9uJztcblxuLyoqXG4gKiBDb21wdXRlcyB0aGUgc3VtIGFsb25nIHNwYXJzZSBzZWdtZW50cyBvZiBhIHRlbnNvci5cbiAqXG4gKiBgYGBqc1xuICogY29uc3QgYyA9IHRmLnRlbnNvcjJkKFtbMSwyLDMsNF0sIFstMSwtMiwtMywtNF0sIFs1LDYsNyw4XV0pO1xuICogLy8gU2VsZWN0IHR3byByb3dzLCBvbmUgc2VnbWVudC5cbiAqIGNvbnN0IHJlc3VsdDEgPSB0Zi5zcGFyc2Uuc3BhcnNlU2VnbWVudFN1bShjLFxuICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGYudGVuc29yMWQoWzAsIDFdLCAnaW50MzInKSxcbiAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRmLnRlbnNvcjFkKFswLCAwXSwgJ2ludDMyJykpO1xuICogcmVzdWx0MS5wcmludCgpOyAvLyBbWzAsIDAsIDAsIDBdXVxuICpcbiAqIC8vIFNlbGVjdCB0d28gcm93cywgdHdvIHNlZ21lbnRzLlxuICogY29uc3QgcmVzdWx0MiA9IHRmLnNwYXJzZS5zcGFyc2VTZWdtZW50U3VtKGMsXG4gKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0Zi50ZW5zb3IxZChbMCwgMV0sICdpbnQzMicpLFxuICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGYudGVuc29yMWQoWzAsIDFdLCAnaW50MzInKSk7XG4gKiByZXN1bHQyLnByaW50KCk7IC8vIFtbMSwgMiwgMywgNF0sIFstMSwgLTIsIC0zLCAtNF1dXG4gKlxuICogLy8gU2VsZWN0IGFsbCByb3dzLCB0d28gc2VnbWVudHMuXG4gKiBjb25zdCByZXN1bHQzID0gdGYuc3BhcnNlLnNwYXJzZVNlZ21lbnRTdW0oYyxcbiAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRmLnRlbnNvcjFkKFswLCAxLCAyXSwgJ2ludDMyJyksXG4gKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0Zi50ZW5zb3IxZChbMCwgMCwgMV0sICdpbnQzMicpKTtcbiAqIHJlc3VsdDMucHJpbnQoKTsgLy8gW1swLCAwLCAwLCAwXSwgWzUsIDYsIDcsIDhdXVxuICogYGBgXG4gKiBAcGFyYW0gZGF0YTogQSBUZW5zb3Igb2YgYXQgbGVhc3Qgb25lIGRpbWVuc2lvbiB3aXRoIGRhdGEgdGhhdCB3aWxsIGJlXG4gKiAgICAgYXNzZW1ibGVkIGluIHRoZSBvdXRwdXQuXG4gKiBAcGFyYW0gaW5kaWNlczogQSAxLUQgVGVuc29yIHdpdGggaW5kaWNlcyBpbnRvIGRhdGEuIEhhcyBzYW1lIHJhbmsgYXNcbiAqICAgICBzZWdtZW50SWRzLlxuICogQHBhcmFtIHNlZ21lbnRJZHM6IEEgMS1EIFRlbnNvciB3aXRoIGluZGljZXMgaW50byB0aGUgb3V0cHV0IFRlbnNvci4gVmFsdWVzXG4gKiAgICAgc2hvdWxkIGJlIHNvcnRlZCBhbmQgY2FuIGJlIHJlcGVhdGVkLlxuICogQHJldHVybiBIYXMgc2FtZSBzaGFwZSBhcyBkYXRhLCBleGNlcHQgZm9yIGRpbWVuc2lvbiAwIHdoaWNoIGhhcyBlcXVhbCB0b1xuICogICAgICAgICB0aGUgbnVtYmVyIG9mIHNlZ21lbnRzLlxuICpcbiAqIEBkb2Mge2hlYWRpbmc6ICdPcGVyYXRpb25zJywgc3ViaGVhZGluZzogJ1NwYXJzZSd9XG4gKi9cbmZ1bmN0aW9uIHNwYXJzZVNlZ21lbnRTdW1fKFxuICAgIGRhdGE6IFRlbnNvcnxUZW5zb3JMaWtlLCBpbmRpY2VzOiBUZW5zb3IxRHxUZW5zb3JMaWtlLFxuICAgIHNlZ21lbnRJZHM6IFRlbnNvcjFEfFRlbnNvckxpa2UpOiBUZW5zb3Ige1xuICBjb25zdCAkZGF0YSA9IGNvbnZlcnRUb1RlbnNvcihkYXRhLCAnZGF0YScsICdzcGFyc2VTZWdtZW50U3VtJyk7XG4gIGNvbnN0ICRpbmRpY2VzID1cbiAgICAgIGNvbnZlcnRUb1RlbnNvcihpbmRpY2VzLCAnaW5kaWNlcycsICdzcGFyc2VTZWdtZW50U3VtJywgJ2ludDMyJyk7XG4gIGNvbnN0ICRzZWdtZW50SWRzID1cbiAgICAgIGNvbnZlcnRUb1RlbnNvcihzZWdtZW50SWRzLCAnc2VnbWVudElkcycsICdzcGFyc2VTZWdtZW50U3VtJywgJ2ludDMyJyk7XG5cbiAgaWYgKCRkYXRhLnJhbmsgPCAxKSB7XG4gICAgdGhyb3cgbmV3IEVycm9yKFxuICAgICAgICBgRGF0YSBzaG91bGQgYmUgYXQgbGVhc3QgMSBkaW1lbnNpb25hbCBidXQgcmVjZWl2ZWQgc2NhbGFyYCk7XG4gIH1cbiAgaWYgKCRpbmRpY2VzLnJhbmsgIT09IDEpIHtcbiAgICB0aHJvdyBuZXcgRXJyb3IoYEluZGljZXMgc2hvdWxkIGJlIFRlbnNvcjFEIGJ1dCByZWNlaXZlZCBzaGFwZVxuICAgICAgICAgJHskaW5kaWNlcy5zaGFwZX1gKTtcbiAgfVxuICBpZiAoJHNlZ21lbnRJZHMucmFuayAhPT0gMSkge1xuICAgIHRocm93IG5ldyBFcnJvcihgU2VnbWVudCBpZHMgc2hvdWxkIGJlIFRlbnNvcjFEIGJ1dCByZWNlaXZlZCBzaGFwZVxuICAgICAgICAgJHskc2VnbWVudElkcy5zaGFwZX1gKTtcbiAgfVxuXG4gIGNvbnN0IGlucHV0czogU3BhcnNlU2VnbWVudFN1bUlucHV0cyA9IHtcbiAgICBkYXRhOiAkZGF0YSxcbiAgICBpbmRpY2VzOiAkaW5kaWNlcyxcbiAgICBzZWdtZW50SWRzOiAkc2VnbWVudElkc1xuICB9O1xuXG4gIHJldHVybiBFTkdJTkUucnVuS2VybmVsKFNwYXJzZVNlZ21lbnRTdW0sIGlucHV0cyBhcyB7fSk7XG59XG5cbmV4cG9ydCBjb25zdCBzcGFyc2VTZWdtZW50U3VtID0gb3Aoe3NwYXJzZVNlZ21lbnRTdW1ffSk7XG4iXX0=","/**\n * @license\n * Copyright 2021 Google LLC. All Rights Reserved.\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n * =============================================================================\n */\nimport { ENGINE } from '../../engine';\nimport { StringNGrams } from '../../kernel_names';\nimport { convertToTensor } from '../../tensor_util_env';\nimport { op } from '../operation';\n/**\n * Creates ngrams from ragged string data.\n *\n * This op accepts a ragged tensor with 1 ragged dimension containing only\n * strings and outputs a ragged tensor with 1 ragged dimension containing ngrams\n * of that string, joined along the innermost axis.\n *\n * ```js\n * const result = tf.string.stringNGrams(\n * ['a', 'b', 'c', 'd'], tf.tensor1d([0, 2, 4], 'int32'),\n * '|', [1, 2], 'LP', 'RP', -1, false);\n * result['nGrams'].print(); // ['a', 'b', 'LP|a', 'a|b', 'b|RP',\n * // 'c', 'd', 'LP|c', 'c|d', 'd|RP']\n * result['nGramsSplits'].print(); // [0, 5, 10]\n * ```\n * @param data: The values tensor of the ragged string tensor to make ngrams out\n * of. Must be a 1D string tensor.\n * @param dataSplits: The splits tensor of the ragged string tensor to make\n * ngrams out of.\n * @param separator: The string to append between elements of the token. Use \"\"\n * for no separator.\n * @param nGramWidths: The sizes of the ngrams to create.\n * @param leftPad: The string to use to pad the left side of the ngram sequence.\n * Only used if pad_width !== 0.\n * @param rightPad: The string to use to pad the right side of the ngram\n * sequence. Only used if pad_width !== 0.\n * @param padWidth: The number of padding elements to add to each side of each\n * sequence. Note that padding will never be greater than `nGramWidths`-1\n * regardless of this value. If `padWidth`=-1, then add max(`nGramWidths`)-1\n * elements.\n * @param preserveShortSequences: If true, then ensure that at least one ngram\n * is generated for each input sequence. In particular, if an input sequence\n * is shorter than min(ngramWidth) + 2*padWidth, then generate a single\n * ngram containing the entire sequence. If false, then no ngrams are\n * generated for these short input sequences.\n * @return A map with the following properties:\n * - nGrams: The values tensor of the output ngrams ragged tensor.\n * - nGramsSplits: The splits tensor of the output ngrams ragged tensor.\n *\n * @doc {heading: 'Operations', subheading: 'String'}\n */\nfunction stringNGrams_(data, dataSplits, separator, nGramWidths, leftPad, rightPad, padWidth, preserveShortSequences) {\n const $data = convertToTensor(data, 'data', 'stringNGrams', 'string');\n if ($data.dtype !== 'string') {\n throw new Error('Data must be of datatype string');\n }\n if ($data.shape.length !== 1) {\n throw new Error(`Data must be a vector, saw: ${$data.shape}`);\n }\n const $dataSplits = convertToTensor(dataSplits, 'dataSplits', 'stringNGrams');\n if ($dataSplits.dtype !== 'int32') {\n throw new Error('Data splits must be of datatype int32');\n }\n const attrs = {\n separator,\n nGramWidths,\n leftPad,\n rightPad,\n padWidth,\n preserveShortSequences\n };\n const inputs = { data: $data, dataSplits: $dataSplits };\n const result = ENGINE.runKernel(StringNGrams, inputs, attrs);\n return { nGrams: result[0], nGramsSplits: result[1] };\n}\nexport const stringNGrams = op({ stringNGrams_ });\n//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic3RyaW5nX25fZ3JhbXMuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi8uLi8uLi90ZmpzLWNvcmUvc3JjL29wcy9zdHJpbmcvc3RyaW5nX25fZ3JhbXMudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUE7Ozs7Ozs7Ozs7Ozs7OztHQWVHO0FBRUgsT0FBTyxFQUFDLE1BQU0sRUFBQyxNQUFNLGNBQWMsQ0FBQztBQUNwQyxPQUFPLEVBQUMsWUFBWSxFQUF3QyxNQUFNLG9CQUFvQixDQUFDO0FBR3ZGLE9BQU8sRUFBQyxlQUFlLEVBQUMsTUFBTSx1QkFBdUIsQ0FBQztBQUV0RCxPQUFPLEVBQUMsRUFBRSxFQUFDLE1BQU0sY0FBYyxDQUFDO0FBRWhDOzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7O0dBd0NHO0FBQ0gsU0FBUyxhQUFhLENBQ2xCLElBQXlCLEVBQUUsVUFBNkIsRUFBRSxTQUFpQixFQUMzRSxXQUFxQixFQUFFLE9BQWUsRUFBRSxRQUFnQixFQUFFLFFBQWdCLEVBQzFFLHNCQUErQjtJQUNqQyxNQUFNLEtBQUssR0FBRyxlQUFlLENBQUMsSUFBSSxFQUFFLE1BQU0sRUFBRSxjQUFjLEVBQUUsUUFBUSxDQUFDLENBQUM7SUFDdEUsSUFBSSxLQUFLLENBQUMsS0FBSyxLQUFLLFFBQVEsRUFBRTtRQUM1QixNQUFNLElBQUksS0FBSyxDQUFDLGlDQUFpQyxDQUFDLENBQUM7S0FDcEQ7SUFDRCxJQUFJLEtBQUssQ0FBQyxLQUFLLENBQUMsTUFBTSxLQUFLLENBQUMsRUFBRTtRQUM1QixNQUFNLElBQUksS0FBSyxDQUFDLCtCQUErQixLQUFLLENBQUMsS0FBSyxFQUFFLENBQUMsQ0FBQztLQUMvRDtJQUVELE1BQU0sV0FBVyxHQUFHLGVBQWUsQ0FBQyxVQUFVLEVBQUUsWUFBWSxFQUFFLGNBQWMsQ0FBQyxDQUFDO0lBQzlFLElBQUksV0FBVyxDQUFDLEtBQUssS0FBSyxPQUFPLEVBQUU7UUFDakMsTUFBTSxJQUFJLEtBQUssQ0FBQyx1Q0FBdUMsQ0FBQyxDQUFDO0tBQzFEO0lBRUQsTUFBTSxLQUFLLEdBQXNCO1FBQy9CLFNBQVM7UUFDVCxXQUFXO1FBQ1gsT0FBTztRQUNQLFFBQVE7UUFDUixRQUFRO1FBQ1Isc0JBQXNCO0tBQ3ZCLENBQUM7SUFFRixNQUFNLE1BQU0sR0FBdUIsRUFBQyxJQUFJLEVBQUUsS0FBSyxFQUFFLFVBQVUsRUFBRSxXQUFXLEVBQUMsQ0FBQztJQUMxRSxNQUFNLE1BQU0sR0FDUixNQUFNLENBQUMsU0FBUyxDQUFDLFlBQVksRUFBRSxNQUFZLEVBQUUsS0FBVyxDQUFDLENBQUM7SUFDOUQsT0FBTyxFQUFDLE1BQU0sRUFBRSxNQUFNLENBQUMsQ0FBQyxDQUFDLEVBQUUsWUFBWSxFQUFFLE1BQU0sQ0FBQyxDQUFDLENBQUMsRUFBQyxDQUFDO0FBQ3RELENBQUM7QUFFRCxNQUFNLENBQUMsTUFBTSxZQUFZLEdBQUcsRUFBRSxDQUFDLEVBQUMsYUFBYSxFQUFDLENBQUMsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbIi8qKlxuICogQGxpY2Vuc2VcbiAqIENvcHlyaWdodCAyMDIxIEdvb2dsZSBMTEMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuXG4gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgXCJMaWNlbnNlXCIpO1xuICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLlxuICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0XG4gKlxuICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wXG4gKlxuICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZVxuICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gXCJBUyBJU1wiIEJBU0lTLFxuICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuXG4gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kXG4gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS5cbiAqID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4gKi9cblxuaW1wb3J0IHtFTkdJTkV9IGZyb20gJy4uLy4uL2VuZ2luZSc7XG5pbXBvcnQge1N0cmluZ05HcmFtcywgU3RyaW5nTkdyYW1zQXR0cnMsIFN0cmluZ05HcmFtc0lucHV0c30gZnJvbSAnLi4vLi4va2VybmVsX25hbWVzJztcbmltcG9ydCB7VGVuc29yLCBUZW5zb3IxRH0gZnJvbSAnLi4vLi4vdGVuc29yJztcbmltcG9ydCB7TmFtZWRUZW5zb3JNYXB9IGZyb20gJy4uLy4uL3RlbnNvcl90eXBlcyc7XG5pbXBvcnQge2NvbnZlcnRUb1RlbnNvcn0gZnJvbSAnLi4vLi4vdGVuc29yX3V0aWxfZW52JztcbmltcG9ydCB7VGVuc29yTGlrZX0gZnJvbSAnLi4vLi4vdHlwZXMnO1xuaW1wb3J0IHtvcH0gZnJvbSAnLi4vb3BlcmF0aW9uJztcblxuLyoqXG4gKiBDcmVhdGVzIG5ncmFtcyBmcm9tIHJhZ2dlZCBzdHJpbmcgZGF0YS5cbiAqXG4gKiBUaGlzIG9wIGFjY2VwdHMgYSByYWdnZWQgdGVuc29yIHdpdGggMSByYWdnZWQgZGltZW5zaW9uIGNvbnRhaW5pbmcgb25seVxuICogc3RyaW5ncyBhbmQgb3V0cHV0cyBhIHJhZ2dlZCB0ZW5zb3Igd2l0aCAxIHJhZ2dlZCBkaW1lbnNpb24gY29udGFpbmluZyBuZ3JhbXNcbiAqIG9mIHRoYXQgc3RyaW5nLCBqb2luZWQgYWxvbmcgdGhlIGlubmVybW9zdCBheGlzLlxuICpcbiAqIGBgYGpzXG4gKiBjb25zdCByZXN1bHQgPSB0Zi5zdHJpbmcuc3RyaW5nTkdyYW1zKFxuICogICBbJ2EnLCAnYicsICdjJywgJ2QnXSwgdGYudGVuc29yMWQoWzAsIDIsIDRdLCAnaW50MzInKSxcbiAqICAgJ3wnLCBbMSwgMl0sICdMUCcsICdSUCcsIC0xLCBmYWxzZSk7XG4gKiByZXN1bHRbJ25HcmFtcyddLnByaW50KCk7IC8vIFsnYScsICdiJywgJ0xQfGEnLCAnYXxiJywgJ2J8UlAnLFxuICogICAgICAgICAgICAgICAgICAgICAgICAgICAvLyAgJ2MnLCAnZCcsICdMUHxjJywgJ2N8ZCcsICdkfFJQJ11cbiAqIHJlc3VsdFsnbkdyYW1zU3BsaXRzJ10ucHJpbnQoKTsgLy8gWzAsIDUsIDEwXVxuICogYGBgXG4gKiBAcGFyYW0gZGF0YTogVGhlIHZhbHVlcyB0ZW5zb3Igb2YgdGhlIHJhZ2dlZCBzdHJpbmcgdGVuc29yIHRvIG1ha2UgbmdyYW1zIG91dFxuICogICAgIG9mLiBNdXN0IGJlIGEgMUQgc3RyaW5nIHRlbnNvci5cbiAqIEBwYXJhbSBkYXRhU3BsaXRzOiBUaGUgc3BsaXRzIHRlbnNvciBvZiB0aGUgcmFnZ2VkIHN0cmluZyB0ZW5zb3IgdG8gbWFrZVxuICogICAgIG5ncmFtcyBvdXQgb2YuXG4gKiBAcGFyYW0gc2VwYXJhdG9yOiBUaGUgc3RyaW5nIHRvIGFwcGVuZCBiZXR3ZWVuIGVsZW1lbnRzIG9mIHRoZSB0b2tlbi4gVXNlIFwiXCJcbiAqICAgICBmb3Igbm8gc2VwYXJhdG9yLlxuICogQHBhcmFtIG5HcmFtV2lkdGhzOiBUaGUgc2l6ZXMgb2YgdGhlIG5ncmFtcyB0byBjcmVhdGUuXG4gKiBAcGFyYW0gbGVmdFBhZDogVGhlIHN0cmluZyB0byB1c2UgdG8gcGFkIHRoZSBsZWZ0IHNpZGUgb2YgdGhlIG5ncmFtIHNlcXVlbmNlLlxuICogICAgIE9ubHkgdXNlZCBpZiBwYWRfd2lkdGggIT09IDAuXG4gKiBAcGFyYW0gcmlnaHRQYWQ6IFRoZSBzdHJpbmcgdG8gdXNlIHRvIHBhZCB0aGUgcmlnaHQgc2lkZSBvZiB0aGUgbmdyYW1cbiAqICAgICBzZXF1ZW5jZS4gT25seSB1c2VkIGlmIHBhZF93aWR0aCAhPT0gMC5cbiAqIEBwYXJhbSBwYWRXaWR0aDogVGhlIG51bWJlciBvZiBwYWRkaW5nIGVsZW1lbnRzIHRvIGFkZCB0byBlYWNoIHNpZGUgb2YgZWFjaFxuICogICAgIHNlcXVlbmNlLiBOb3RlIHRoYXQgcGFkZGluZyB3aWxsIG5ldmVyIGJlIGdyZWF0ZXIgdGhhbiBgbkdyYW1XaWR0aHNgLTFcbiAqICAgICByZWdhcmRsZXNzIG9mIHRoaXMgdmFsdWUuIElmIGBwYWRXaWR0aGA9LTEsIHRoZW4gYWRkIG1heChgbkdyYW1XaWR0aHNgKS0xXG4gKiAgICAgZWxlbWVudHMuXG4gKiBAcGFyYW0gcHJlc2VydmVTaG9ydFNlcXVlbmNlczogSWYgdHJ1ZSwgdGhlbiBlbnN1cmUgdGhhdCBhdCBsZWFzdCBvbmUgbmdyYW1cbiAqICAgICBpcyBnZW5lcmF0ZWQgZm9yIGVhY2ggaW5wdXQgc2VxdWVuY2UuIEluIHBhcnRpY3VsYXIsIGlmIGFuIGlucHV0IHNlcXVlbmNlXG4gKiAgICAgaXMgc2hvcnRlciB0aGFuIG1pbihuZ3JhbVdpZHRoKSArIDIqcGFkV2lkdGgsIHRoZW4gZ2VuZXJhdGUgYSBzaW5nbGVcbiAqICAgICBuZ3JhbSBjb250YWluaW5nIHRoZSBlbnRpcmUgc2VxdWVuY2UuIElmIGZhbHNlLCB0aGVuIG5vIG5ncmFtcyBhcmVcbiAqICAgICBnZW5lcmF0ZWQgZm9yIHRoZXNlIHNob3J0IGlucHV0IHNlcXVlbmNlcy5cbiAqIEByZXR1cm4gQSBtYXAgd2l0aCB0aGUgZm9sbG93aW5nIHByb3BlcnRpZXM6XG4gKiAgICAgLSBuR3JhbXM6IFRoZSB2YWx1ZXMgdGVuc29yIG9mIHRoZSBvdXRwdXQgbmdyYW1zIHJhZ2dlZCB0ZW5zb3IuXG4gKiAgICAgLSBuR3JhbXNTcGxpdHM6IFRoZSBzcGxpdHMgdGVuc29yIG9mIHRoZSBvdXRwdXQgbmdyYW1zIHJhZ2dlZCB0ZW5zb3IuXG4gKlxuICogQGRvYyB7aGVhZGluZzogJ09wZXJhdGlvbnMnLCBzdWJoZWFkaW5nOiAnU3RyaW5nJ31cbiAqL1xuZnVuY3Rpb24gc3RyaW5nTkdyYW1zXyhcbiAgICBkYXRhOiBUZW5zb3IxRHxUZW5zb3JMaWtlLCBkYXRhU3BsaXRzOiBUZW5zb3J8VGVuc29yTGlrZSwgc2VwYXJhdG9yOiBzdHJpbmcsXG4gICAgbkdyYW1XaWR0aHM6IG51bWJlcltdLCBsZWZ0UGFkOiBzdHJpbmcsIHJpZ2h0UGFkOiBzdHJpbmcsIHBhZFdpZHRoOiBudW1iZXIsXG4gICAgcHJlc2VydmVTaG9ydFNlcXVlbmNlczogYm9vbGVhbik6IE5hbWVkVGVuc29yTWFwIHtcbiAgY29uc3QgJGRhdGEgPSBjb252ZXJ0VG9UZW5zb3IoZGF0YSwgJ2RhdGEnLCAnc3RyaW5nTkdyYW1zJywgJ3N0cmluZycpO1xuICBpZiAoJGRhdGEuZHR5cGUgIT09ICdzdHJpbmcnKSB7XG4gICAgdGhyb3cgbmV3IEVycm9yKCdEYXRhIG11c3QgYmUgb2YgZGF0YXR5cGUgc3RyaW5nJyk7XG4gIH1cbiAgaWYgKCRkYXRhLnNoYXBlLmxlbmd0aCAhPT0gMSkge1xuICAgIHRocm93IG5ldyBFcnJvcihgRGF0YSBtdXN0IGJlIGEgdmVjdG9yLCBzYXc6ICR7JGRhdGEuc2hhcGV9YCk7XG4gIH1cblxuICBjb25zdCAkZGF0YVNwbGl0cyA9IGNvbnZlcnRUb1RlbnNvcihkYXRhU3BsaXRzLCAnZGF0YVNwbGl0cycsICdzdHJpbmdOR3JhbXMnKTtcbiAgaWYgKCRkYXRhU3BsaXRzLmR0eXBlICE9PSAnaW50MzInKSB7XG4gICAgdGhyb3cgbmV3IEVycm9yKCdEYXRhIHNwbGl0cyBtdXN0IGJlIG9mIGRhdGF0eXBlIGludDMyJyk7XG4gIH1cblxuICBjb25zdCBhdHRyczogU3RyaW5nTkdyYW1zQXR0cnMgPSB7XG4gICAgc2VwYXJhdG9yLFxuICAgIG5HcmFtV2lkdGhzLFxuICAgIGxlZnRQYWQsXG4gICAgcmlnaHRQYWQsXG4gICAgcGFkV2lkdGgsXG4gICAgcHJlc2VydmVTaG9ydFNlcXVlbmNlc1xuICB9O1xuXG4gIGNvbnN0IGlucHV0czogU3RyaW5nTkdyYW1zSW5wdXRzID0ge2RhdGE6ICRkYXRhLCBkYXRhU3BsaXRzOiAkZGF0YVNwbGl0c307XG4gIGNvbnN0IHJlc3VsdDogVGVuc29yW10gPVxuICAgICAgRU5HSU5FLnJ1bktlcm5lbChTdHJpbmdOR3JhbXMsIGlucHV0cyBhcyB7fSwgYXR0cnMgYXMge30pO1xuICByZXR1cm4ge25HcmFtczogcmVzdWx0WzBdLCBuR3JhbXNTcGxpdHM6IHJlc3VsdFsxXX07XG59XG5cbmV4cG9ydCBjb25zdCBzdHJpbmdOR3JhbXMgPSBvcCh7c3RyaW5nTkdyYW1zX30pO1xuIl19","/**\n * @license\n * Copyright 2021 Google LLC. All Rights Reserved.\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n * =============================================================================\n */\nimport { ENGINE } from '../../engine';\nimport { StringSplit } from '../../kernel_names';\nimport { convertToTensor } from '../../tensor_util_env';\nimport { op } from '../operation';\n/**\n * Split elements of `input` based on `delimiter` into a SparseTensor .\n *\n * Let N be the size of source (typically N will be the batch size). Split each\n * element of `input` based on `delimiter` and return a SparseTensor containing\n * the splitted tokens. Empty tokens are ignored if `skipEmpty` is set to True.\n *\n * `delimiter` can be empty, or a string of split characters. If `delimiter` is\n * an empty string, each element of `input` is split into individual\n * character strings. Otherwise every character of `delimiter` is a potential\n * split point.\n *\n * ```js\n * const result = tf.string.stringSplit(['hello world', 'a b c'], ' ');\n * result['indices'].print(); // [[0, 0], [0, 1], [1, 0], [1, 1], [1, 2]]\n * result['values'].print(); // ['hello', 'world', 'a', 'b', 'c']\n * result['shape'].print(); // [2, 3]\n * ```\n * @param input: 1-D. Strings to split.\n * @param delimiter: 0-D. Delimiter characters, or empty string.\n * @param skipEmpty: Optional. If true, skip the empty strings from the result.\n * Defaults to true.\n * @return A map with the following properties:\n * - indices: A dense matrix of int32 representing the indices of the sparse\n * tensor.\n * - values: A vector of strings corresponding to the splited values.\n * - shape: a length-2 vector of int32 representing the shape of the sparse\n * tensor, where the first value is N and the second value is the maximum number\n * of tokens in a single input entry.\n *\n * @doc {heading: 'Operations', subheading: 'String'}\n */\nfunction stringSplit_(input, delimiter, skipEmpty = true) {\n const $input = convertToTensor(input, 'input', 'stringSplit', 'string');\n const $delimiter = convertToTensor(delimiter, 'delimiter', 'stringSplit', 'string');\n if ($input.rank !== 1) {\n throw new Error(`Input should be Tensor1D but received shape ${$input.shape}`);\n }\n if ($delimiter.rank !== 0) {\n throw new Error(`Delimiter should be a scalar but received shape ${$delimiter.shape}`);\n }\n const attrs = { skipEmpty };\n const inputs = { input: $input, delimiter: $delimiter };\n const result = ENGINE.runKernel(StringSplit, inputs, attrs);\n return { indices: result[0], values: result[1], shape: result[2] };\n}\nexport const stringSplit = op({ stringSplit_ });\n//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic3RyaW5nX3NwbGl0LmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vLi4vLi4vdGZqcy1jb3JlL3NyYy9vcHMvc3RyaW5nL3N0cmluZ19zcGxpdC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQTs7Ozs7Ozs7Ozs7Ozs7O0dBZUc7QUFFSCxPQUFPLEVBQUMsTUFBTSxFQUFDLE1BQU0sY0FBYyxDQUFDO0FBQ3BDLE9BQU8sRUFBQyxXQUFXLEVBQXNDLE1BQU0sb0JBQW9CLENBQUM7QUFHcEYsT0FBTyxFQUFDLGVBQWUsRUFBQyxNQUFNLHVCQUF1QixDQUFDO0FBRXRELE9BQU8sRUFBQyxFQUFFLEVBQUMsTUFBTSxjQUFjLENBQUM7QUFFaEM7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7R0ErQkc7QUFDSCxTQUFTLFlBQVksQ0FDakIsS0FBMEIsRUFBRSxTQUE0QixFQUN4RCxTQUFTLEdBQUcsSUFBSTtJQUNsQixNQUFNLE1BQU0sR0FBRyxlQUFlLENBQUMsS0FBSyxFQUFFLE9BQU8sRUFBRSxhQUFhLEVBQUUsUUFBUSxDQUFDLENBQUM7SUFDeEUsTUFBTSxVQUFVLEdBQ1osZUFBZSxDQUFDLFNBQVMsRUFBRSxXQUFXLEVBQUUsYUFBYSxFQUFFLFFBQVEsQ0FBQyxDQUFDO0lBRXJFLElBQUksTUFBTSxDQUFDLElBQUksS0FBSyxDQUFDLEVBQUU7UUFDckIsTUFBTSxJQUFJLEtBQUssQ0FDWCwrQ0FBK0MsTUFBTSxDQUFDLEtBQUssRUFBRSxDQUFDLENBQUM7S0FDcEU7SUFDRCxJQUFJLFVBQVUsQ0FBQyxJQUFJLEtBQUssQ0FBQyxFQUFFO1FBQ3pCLE1BQU0sSUFBSSxLQUFLLENBQ1gsbURBQW1ELFVBQVUsQ0FBQyxLQUFLLEVBQUUsQ0FBQyxDQUFDO0tBQzVFO0lBRUQsTUFBTSxLQUFLLEdBQXFCLEVBQUMsU0FBUyxFQUFDLENBQUM7SUFDNUMsTUFBTSxNQUFNLEdBQXNCLEVBQUMsS0FBSyxFQUFFLE1BQU0sRUFBRSxTQUFTLEVBQUUsVUFBVSxFQUFDLENBQUM7SUFDekUsTUFBTSxNQUFNLEdBQ1IsTUFBTSxDQUFDLFNBQVMsQ0FBQyxXQUFXLEVBQUUsTUFBWSxFQUFFLEtBQVcsQ0FBQyxDQUFDO0lBQzdELE9BQU8sRUFBQyxPQUFPLEVBQUUsTUFBTSxDQUFDLENBQUMsQ0FBQyxFQUFFLE1BQU0sRUFBRSxNQUFNLENBQUMsQ0FBQyxDQUFDLEVBQUUsS0FBSyxFQUFFLE1BQU0sQ0FBQyxDQUFDLENBQUMsRUFBQyxDQUFDO0FBQ25FLENBQUM7QUFFRCxNQUFNLENBQUMsTUFBTSxXQUFXLEdBQUcsRUFBRSxDQUFDLEVBQUMsWUFBWSxFQUFDLENBQUMsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbIi8qKlxuICogQGxpY2Vuc2VcbiAqIENvcHlyaWdodCAyMDIxIEdvb2dsZSBMTEMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuXG4gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgXCJMaWNlbnNlXCIpO1xuICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLlxuICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0XG4gKlxuICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wXG4gKlxuICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZVxuICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gXCJBUyBJU1wiIEJBU0lTLFxuICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuXG4gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kXG4gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS5cbiAqID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4gKi9cblxuaW1wb3J0IHtFTkdJTkV9IGZyb20gJy4uLy4uL2VuZ2luZSc7XG5pbXBvcnQge1N0cmluZ1NwbGl0LCBTdHJpbmdTcGxpdEF0dHJzLCBTdHJpbmdTcGxpdElucHV0c30gZnJvbSAnLi4vLi4va2VybmVsX25hbWVzJztcbmltcG9ydCB7U2NhbGFyLCBUZW5zb3IsIFRlbnNvcjFEfSBmcm9tICcuLi8uLi90ZW5zb3InO1xuaW1wb3J0IHtOYW1lZFRlbnNvck1hcH0gZnJvbSAnLi4vLi4vdGVuc29yX3R5cGVzJztcbmltcG9ydCB7Y29udmVydFRvVGVuc29yfSBmcm9tICcuLi8uLi90ZW5zb3JfdXRpbF9lbnYnO1xuaW1wb3J0IHtTY2FsYXJMaWtlLCBUZW5zb3JMaWtlfSBmcm9tICcuLi8uLi90eXBlcyc7XG5pbXBvcnQge29wfSBmcm9tICcuLi9vcGVyYXRpb24nO1xuXG4vKipcbiAqIFNwbGl0IGVsZW1lbnRzIG9mIGBpbnB1dGAgYmFzZWQgb24gYGRlbGltaXRlcmAgaW50byBhIFNwYXJzZVRlbnNvciAuXG4gKlxuICogTGV0IE4gYmUgdGhlIHNpemUgb2Ygc291cmNlICh0eXBpY2FsbHkgTiB3aWxsIGJlIHRoZSBiYXRjaCBzaXplKS4gU3BsaXQgZWFjaFxuICogZWxlbWVudCBvZiBgaW5wdXRgIGJhc2VkIG9uIGBkZWxpbWl0ZXJgIGFuZCByZXR1cm4gYSBTcGFyc2VUZW5zb3IgY29udGFpbmluZ1xuICogdGhlIHNwbGl0dGVkIHRva2Vucy4gRW1wdHkgdG9rZW5zIGFyZSBpZ25vcmVkIGlmIGBza2lwRW1wdHlgIGlzIHNldCB0byBUcnVlLlxuICpcbiAqIGBkZWxpbWl0ZXJgIGNhbiBiZSBlbXB0eSwgb3IgYSBzdHJpbmcgb2Ygc3BsaXQgY2hhcmFjdGVycy4gSWYgYGRlbGltaXRlcmAgaXNcbiAqIGFuIGVtcHR5IHN0cmluZywgZWFjaCBlbGVtZW50IG9mIGBpbnB1dGAgaXMgc3BsaXQgaW50byBpbmRpdmlkdWFsXG4gKiBjaGFyYWN0ZXIgc3RyaW5ncy4gT3RoZXJ3aXNlIGV2ZXJ5IGNoYXJhY3RlciBvZiBgZGVsaW1pdGVyYCBpcyBhIHBvdGVudGlhbFxuICogc3BsaXQgcG9pbnQuXG4gKlxuICogYGBganNcbiAqIGNvbnN0IHJlc3VsdCA9IHRmLnN0cmluZy5zdHJpbmdTcGxpdChbJ2hlbGxvIHdvcmxkJywgICdhIGIgYyddLCAnICcpO1xuICogcmVzdWx0WydpbmRpY2VzJ10ucHJpbnQoKTsgLy8gW1swLCAwXSwgWzAsIDFdLCBbMSwgMF0sIFsxLCAxXSwgWzEsIDJdXVxuICogcmVzdWx0Wyd2YWx1ZXMnXS5wcmludCgpOyAvLyBbJ2hlbGxvJywgJ3dvcmxkJywgJ2EnLCAnYicsICdjJ11cbiAqIHJlc3VsdFsnc2hhcGUnXS5wcmludCgpOyAvLyBbMiwgM11cbiAqIGBgYFxuICogQHBhcmFtIGlucHV0OiAxLUQuIFN0cmluZ3MgdG8gc3BsaXQuXG4gKiBAcGFyYW0gZGVsaW1pdGVyOiAwLUQuIERlbGltaXRlciBjaGFyYWN0ZXJzLCBvciBlbXB0eSBzdHJpbmcuXG4gKiBAcGFyYW0gc2tpcEVtcHR5OiBPcHRpb25hbC4gSWYgdHJ1ZSwgc2tpcCB0aGUgZW1wdHkgc3RyaW5ncyBmcm9tIHRoZSByZXN1bHQuXG4gKiAgICAgRGVmYXVsdHMgdG8gdHJ1ZS5cbiAqIEByZXR1cm4gQSBtYXAgd2l0aCB0aGUgZm9sbG93aW5nIHByb3BlcnRpZXM6XG4gKiAgICAgLSBpbmRpY2VzOiBBIGRlbnNlIG1hdHJpeCBvZiBpbnQzMiByZXByZXNlbnRpbmcgdGhlIGluZGljZXMgb2YgdGhlIHNwYXJzZVxuICogICAgICAgdGVuc29yLlxuICogICAgIC0gdmFsdWVzOiBBIHZlY3RvciBvZiBzdHJpbmdzIGNvcnJlc3BvbmRpbmcgdG8gdGhlIHNwbGl0ZWQgdmFsdWVzLlxuICogICAgIC0gc2hhcGU6IGEgbGVuZ3RoLTIgdmVjdG9yIG9mIGludDMyIHJlcHJlc2VudGluZyB0aGUgc2hhcGUgb2YgdGhlIHNwYXJzZVxuICogdGVuc29yLCB3aGVyZSB0aGUgZmlyc3QgdmFsdWUgaXMgTiBhbmQgdGhlIHNlY29uZCB2YWx1ZSBpcyB0aGUgbWF4aW11bSBudW1iZXJcbiAqIG9mIHRva2VucyBpbiBhIHNpbmdsZSBpbnB1dCBlbnRyeS5cbiAqXG4gKiBAZG9jIHtoZWFkaW5nOiAnT3BlcmF0aW9ucycsIHN1YmhlYWRpbmc6ICdTdHJpbmcnfVxuICovXG5mdW5jdGlvbiBzdHJpbmdTcGxpdF8oXG4gICAgaW5wdXQ6IFRlbnNvcjFEfFRlbnNvckxpa2UsIGRlbGltaXRlcjogU2NhbGFyfFNjYWxhckxpa2UsXG4gICAgc2tpcEVtcHR5ID0gdHJ1ZSk6IE5hbWVkVGVuc29yTWFwIHtcbiAgY29uc3QgJGlucHV0ID0gY29udmVydFRvVGVuc29yKGlucHV0LCAnaW5wdXQnLCAnc3RyaW5nU3BsaXQnLCAnc3RyaW5nJyk7XG4gIGNvbnN0ICRkZWxpbWl0ZXIgPVxuICAgICAgY29udmVydFRvVGVuc29yKGRlbGltaXRlciwgJ2RlbGltaXRlcicsICdzdHJpbmdTcGxpdCcsICdzdHJpbmcnKTtcblxuICBpZiAoJGlucHV0LnJhbmsgIT09IDEpIHtcbiAgICB0aHJvdyBuZXcgRXJyb3IoXG4gICAgICAgIGBJbnB1dCBzaG91bGQgYmUgVGVuc29yMUQgYnV0IHJlY2VpdmVkIHNoYXBlICR7JGlucHV0LnNoYXBlfWApO1xuICB9XG4gIGlmICgkZGVsaW1pdGVyLnJhbmsgIT09IDApIHtcbiAgICB0aHJvdyBuZXcgRXJyb3IoXG4gICAgICAgIGBEZWxpbWl0ZXIgc2hvdWxkIGJlIGEgc2NhbGFyIGJ1dCByZWNlaXZlZCBzaGFwZSAkeyRkZWxpbWl0ZXIuc2hhcGV9YCk7XG4gIH1cblxuICBjb25zdCBhdHRyczogU3RyaW5nU3BsaXRBdHRycyA9IHtza2lwRW1wdHl9O1xuICBjb25zdCBpbnB1dHM6IFN0cmluZ1NwbGl0SW5wdXRzID0ge2lucHV0OiAkaW5wdXQsIGRlbGltaXRlcjogJGRlbGltaXRlcn07XG4gIGNvbnN0IHJlc3VsdDogVGVuc29yW10gPVxuICAgICAgRU5HSU5FLnJ1bktlcm5lbChTdHJpbmdTcGxpdCwgaW5wdXRzIGFzIHt9LCBhdHRycyBhcyB7fSk7XG4gIHJldHVybiB7aW5kaWNlczogcmVzdWx0WzBdLCB2YWx1ZXM6IHJlc3VsdFsxXSwgc2hhcGU6IHJlc3VsdFsyXX07XG59XG5cbmV4cG9ydCBjb25zdCBzdHJpbmdTcGxpdCA9IG9wKHtzdHJpbmdTcGxpdF99KTtcbiJdfQ==","/**\n * @license\n * Copyright 2021 Google LLC. All Rights Reserved.\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n * =============================================================================\n */\nimport { ENGINE } from '../../engine';\nimport { StringToHashBucketFast } from '../../kernel_names';\nimport { convertToTensor } from '../../tensor_util_env';\nimport { op } from '../operation';\n/**\n * Converts each string in the input Tensor to its hash mod by a number of\n * buckets.\n *\n * The hash function is deterministic on the content of the string within the\n * process and will never change. However, it is not suitable for cryptography.\n * This function may be used when CPU time is scarce and inputs are trusted or\n * unimportant. There is a risk of adversaries constructing inputs that all hash\n * to the same bucket.\n *\n * ```js\n * const result = tf.string.stringToHashBucketFast(\n * ['Hello', 'TensorFlow', '2.x'], 3);\n * result.print(); // [0, 2, 2]\n * ```\n * @param input: The strings to assign a hash bucket.\n * @param numBuckets: The number of buckets.\n * @return A Tensor of the same shape as the input tensor.\n *\n * @doc {heading: 'Operations', subheading: 'String'}\n */\nfunction stringToHashBucketFast_(input, numBuckets) {\n const $input = convertToTensor(input, 'input', 'stringToHashBucketFast', 'string');\n const attrs = { numBuckets };\n if (numBuckets <= 0) {\n throw new Error(`Number of buckets must be at least 1`);\n }\n const inputs = { input: $input };\n return ENGINE.runKernel(StringToHashBucketFast, inputs, attrs);\n}\nexport const stringToHashBucketFast = op({ stringToHashBucketFast_ });\n//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic3RyaW5nX3RvX2hhc2hfYnVja2V0X2Zhc3QuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi8uLi8uLi90ZmpzLWNvcmUvc3JjL29wcy9zdHJpbmcvc3RyaW5nX3RvX2hhc2hfYnVja2V0X2Zhc3QudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUE7Ozs7Ozs7Ozs7Ozs7OztHQWVHO0FBRUgsT0FBTyxFQUFDLE1BQU0sRUFBQyxNQUFNLGNBQWMsQ0FBQztBQUNwQyxPQUFPLEVBQUMsc0JBQXNCLEVBQTRELE1BQU0sb0JBQW9CLENBQUM7QUFFckgsT0FBTyxFQUFDLGVBQWUsRUFBQyxNQUFNLHVCQUF1QixDQUFDO0FBRXRELE9BQU8sRUFBQyxFQUFFLEVBQUMsTUFBTSxjQUFjLENBQUM7QUFFaEM7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7O0dBb0JHO0FBQ0gsU0FBUyx1QkFBdUIsQ0FDNUIsS0FBd0IsRUFBRSxVQUFrQjtJQUM5QyxNQUFNLE1BQU0sR0FDUixlQUFlLENBQUMsS0FBSyxFQUFFLE9BQU8sRUFBRSx3QkFBd0IsRUFBRSxRQUFRLENBQUMsQ0FBQztJQUN4RSxNQUFNLEtBQUssR0FBZ0MsRUFBQyxVQUFVLEVBQUMsQ0FBQztJQUV4RCxJQUFJLFVBQVUsSUFBSSxDQUFDLEVBQUU7UUFDbkIsTUFBTSxJQUFJLEtBQUssQ0FBQyxzQ0FBc0MsQ0FBQyxDQUFDO0tBQ3pEO0lBRUQsTUFBTSxNQUFNLEdBQWlDLEVBQUMsS0FBSyxFQUFFLE1BQU0sRUFBQyxDQUFDO0lBQzdELE9BQU8sTUFBTSxDQUFDLFNBQVMsQ0FBQyxzQkFBc0IsRUFBRSxNQUFZLEVBQUUsS0FBVyxDQUFDLENBQUM7QUFDN0UsQ0FBQztBQUVELE1BQU0sQ0FBQyxNQUFNLHNCQUFzQixHQUFHLEVBQUUsQ0FBQyxFQUFDLHVCQUF1QixFQUFDLENBQUMsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbIi8qKlxuICogQGxpY2Vuc2VcbiAqIENvcHlyaWdodCAyMDIxIEdvb2dsZSBMTEMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuXG4gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgXCJMaWNlbnNlXCIpO1xuICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLlxuICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0XG4gKlxuICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wXG4gKlxuICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZVxuICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gXCJBUyBJU1wiIEJBU0lTLFxuICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuXG4gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kXG4gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS5cbiAqID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4gKi9cblxuaW1wb3J0IHtFTkdJTkV9IGZyb20gJy4uLy4uL2VuZ2luZSc7XG5pbXBvcnQge1N0cmluZ1RvSGFzaEJ1Y2tldEZhc3QsIFN0cmluZ1RvSGFzaEJ1Y2tldEZhc3RBdHRycywgU3RyaW5nVG9IYXNoQnVja2V0RmFzdElucHV0c30gZnJvbSAnLi4vLi4va2VybmVsX25hbWVzJztcbmltcG9ydCB7VGVuc29yfSBmcm9tICcuLi8uLi90ZW5zb3InO1xuaW1wb3J0IHtjb252ZXJ0VG9UZW5zb3J9IGZyb20gJy4uLy4uL3RlbnNvcl91dGlsX2Vudic7XG5pbXBvcnQge1RlbnNvckxpa2V9IGZyb20gJy4uLy4uL3R5cGVzJztcbmltcG9ydCB7b3B9IGZyb20gJy4uL29wZXJhdGlvbic7XG5cbi8qKlxuICogQ29udmVydHMgZWFjaCBzdHJpbmcgaW4gdGhlIGlucHV0IFRlbnNvciB0byBpdHMgaGFzaCBtb2QgYnkgYSBudW1iZXIgb2ZcbiAqIGJ1Y2tldHMuXG4gKlxuICogVGhlIGhhc2ggZnVuY3Rpb24gaXMgZGV0ZXJtaW5pc3RpYyBvbiB0aGUgY29udGVudCBvZiB0aGUgc3RyaW5nIHdpdGhpbiB0aGVcbiAqIHByb2Nlc3MgYW5kIHdpbGwgbmV2ZXIgY2hhbmdlLiBIb3dldmVyLCBpdCBpcyBub3Qgc3VpdGFibGUgZm9yIGNyeXB0b2dyYXBoeS5cbiAqIFRoaXMgZnVuY3Rpb24gbWF5IGJlIHVzZWQgd2hlbiBDUFUgdGltZSBpcyBzY2FyY2UgYW5kIGlucHV0cyBhcmUgdHJ1c3RlZCBvclxuICogdW5pbXBvcnRhbnQuIFRoZXJlIGlzIGEgcmlzayBvZiBhZHZlcnNhcmllcyBjb25zdHJ1Y3RpbmcgaW5wdXRzIHRoYXQgYWxsIGhhc2hcbiAqIHRvIHRoZSBzYW1lIGJ1Y2tldC5cbiAqXG4gKiBgYGBqc1xuICogY29uc3QgcmVzdWx0ID0gdGYuc3RyaW5nLnN0cmluZ1RvSGFzaEJ1Y2tldEZhc3QoXG4gKiAgIFsnSGVsbG8nLCAnVGVuc29yRmxvdycsICcyLngnXSwgMyk7XG4gKiByZXN1bHQucHJpbnQoKTsgLy8gWzAsIDIsIDJdXG4gKiBgYGBcbiAqIEBwYXJhbSBpbnB1dDogVGhlIHN0cmluZ3MgdG8gYXNzaWduIGEgaGFzaCBidWNrZXQuXG4gKiBAcGFyYW0gbnVtQnVja2V0czogVGhlIG51bWJlciBvZiBidWNrZXRzLlxuICogQHJldHVybiBBIFRlbnNvciBvZiB0aGUgc2FtZSBzaGFwZSBhcyB0aGUgaW5wdXQgdGVuc29yLlxuICpcbiAqIEBkb2Mge2hlYWRpbmc6ICdPcGVyYXRpb25zJywgc3ViaGVhZGluZzogJ1N0cmluZyd9XG4gKi9cbmZ1bmN0aW9uIHN0cmluZ1RvSGFzaEJ1Y2tldEZhc3RfKFxuICAgIGlucHV0OiBUZW5zb3J8VGVuc29yTGlrZSwgbnVtQnVja2V0czogbnVtYmVyKTogVGVuc29yIHtcbiAgY29uc3QgJGlucHV0ID1cbiAgICAgIGNvbnZlcnRUb1RlbnNvcihpbnB1dCwgJ2lucHV0JywgJ3N0cmluZ1RvSGFzaEJ1Y2tldEZhc3QnLCAnc3RyaW5nJyk7XG4gIGNvbnN0IGF0dHJzOiBTdHJpbmdUb0hhc2hCdWNrZXRGYXN0QXR0cnMgPSB7bnVtQnVja2V0c307XG5cbiAgaWYgKG51bUJ1Y2tldHMgPD0gMCkge1xuICAgIHRocm93IG5ldyBFcnJvcihgTnVtYmVyIG9mIGJ1Y2tldHMgbXVzdCBiZSBhdCBsZWFzdCAxYCk7XG4gIH1cblxuICBjb25zdCBpbnB1dHM6IFN0cmluZ1RvSGFzaEJ1Y2tldEZhc3RJbnB1dHMgPSB7aW5wdXQ6ICRpbnB1dH07XG4gIHJldHVybiBFTkdJTkUucnVuS2VybmVsKFN0cmluZ1RvSGFzaEJ1Y2tldEZhc3QsIGlucHV0cyBhcyB7fSwgYXR0cnMgYXMge30pO1xufVxuXG5leHBvcnQgY29uc3Qgc3RyaW5nVG9IYXNoQnVja2V0RmFzdCA9IG9wKHtzdHJpbmdUb0hhc2hCdWNrZXRGYXN0X30pO1xuIl19","/**\n * @license\n * Copyright 2020 Google LLC. All Rights Reserved.\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n * =============================================================================\n */\n// Modularized ops.\nexport { abs } from './abs';\nexport { acos } from './acos';\nexport { acosh } from './acosh';\nexport { add } from './add';\nexport { addN } from './add_n';\nexport { all } from './all';\nexport { any } from './any';\nexport { argMax } from './arg_max';\nexport { argMin } from './arg_min';\nexport { asin } from './asin';\nexport { asinh } from './asinh';\nexport { atan } from './atan';\nexport { atan2 } from './atan2';\nexport { atanh } from './atanh';\nexport { avgPool } from './avg_pool';\nexport { avgPool3d } from './avg_pool_3d';\nexport { basicLSTMCell } from './basic_lstm_cell';\nexport { batchToSpaceND } from './batch_to_space_nd';\nexport { batchNorm } from './batchnorm';\nexport { batchNorm2d } from './batchnorm2d';\nexport { batchNorm3d } from './batchnorm3d';\nexport { batchNorm4d } from './batchnorm4d';\nexport { bincount } from './bincount';\nexport { broadcastArgs } from './broadcast_args';\nexport { broadcastTo } from './broadcast_to';\nexport { buffer } from './buffer';\nexport { cast } from './cast';\nexport { ceil } from './ceil';\nexport { clipByValue } from './clip_by_value';\nexport { clone } from './clone';\nexport { complex } from './complex';\nexport { concat } from './concat';\nexport { concat1d } from './concat_1d';\nexport { concat2d } from './concat_2d';\nexport { concat3d } from './concat_3d';\nexport { concat4d } from './concat_4d';\nexport { conv1d } from './conv1d';\nexport { conv2d } from './conv2d';\nexport { conv2dTranspose } from './conv2d_transpose';\nexport { conv3d } from './conv3d';\nexport { conv3dTranspose } from './conv3d_transpose';\nexport { cos } from './cos';\nexport { cosh } from './cosh';\nexport { cumprod } from './cumprod';\nexport { cumsum } from './cumsum';\nexport { denseBincount } from './dense_bincount';\nexport { depthToSpace } from './depth_to_space';\nexport { depthwiseConv2d } from './depthwise_conv2d';\nexport { diag } from './diag';\nexport { dilation2d } from './dilation2d';\nexport { div } from './div';\nexport { divNoNan } from './div_no_nan';\nexport { dot } from './dot';\nexport { einsum } from './einsum';\nexport { elu } from './elu';\nexport { equal } from './equal';\nexport { erf } from './erf';\nexport { euclideanNorm } from './euclidean_norm';\nexport { exp } from './exp';\nexport { expandDims } from './expand_dims';\nexport { expm1 } from './expm1';\nexport { eye } from './eye';\nexport { fill } from './fill';\nexport { floor } from './floor';\nexport { floorDiv } from './floorDiv';\nexport { gather } from './gather';\nexport { greater } from './greater';\nexport { greaterEqual } from './greater_equal';\nexport { imag } from './imag';\nexport { isFinite } from './is_finite';\nexport { isInf } from './is_inf';\nexport { isNaN } from './is_nan';\nexport { leakyRelu } from './leaky_relu';\nexport { less } from './less';\nexport { lessEqual } from './less_equal';\nexport { linspace } from './linspace';\nexport { localResponseNormalization } from './local_response_normalization';\nexport { log } from './log';\nexport { log1p } from './log1p';\nexport { logSigmoid } from './log_sigmoid';\nexport { logSoftmax } from './log_softmax';\nexport { logSumExp } from './log_sum_exp';\nexport { logicalAnd } from './logical_and';\nexport { logicalNot } from './logical_not';\nexport { logicalOr } from './logical_or';\nexport { logicalXor } from './logical_xor';\nexport { lowerBound } from './lower_bound';\nexport { matMul } from './mat_mul';\nexport { max } from './max';\nexport { maxPool } from './max_pool';\nexport { maxPool3d } from './max_pool_3d';\nexport { maxPoolWithArgmax } from './max_pool_with_argmax';\nexport { maximum } from './maximum';\nexport { mean } from './mean';\nexport { meshgrid } from './meshgrid';\nexport { min } from './min';\nexport { minimum } from './minimum';\nexport { mirrorPad } from './mirror_pad';\nexport { mod } from './mod';\nexport { moments } from './moments';\nexport { mul } from './mul';\nexport { multiRNNCell } from './multi_rnn_cell';\nexport { multinomial } from './multinomial';\nexport { neg } from './neg';\nexport { notEqual } from './not_equal';\nexport { oneHot } from './one_hot';\nexport { ones } from './ones';\nexport { onesLike } from './ones_like';\nexport { outerProduct } from './outer_product';\nexport { pad } from './pad';\nexport { pad1d } from './pad1d';\nexport { pad2d } from './pad2d';\nexport { pad3d } from './pad3d';\nexport { pad4d } from './pad4d';\nexport { pool } from './pool';\nexport { pow } from './pow';\nexport { prelu } from './prelu';\nexport { print } from './print';\nexport { prod } from './prod';\nexport { raggedGather } from './ragged_gather';\nexport { raggedTensorToTensor } from './ragged_tensor_to_tensor';\nexport { rand } from './rand';\nexport { randomGamma } from './random_gamma';\nexport { randomNormal } from './random_normal';\nexport { randomStandardNormal } from './random_standard_normal';\nexport { randomUniform } from './random_uniform';\nexport { range } from './range';\nexport { real } from './real';\nexport { reciprocal } from './reciprocal';\nexport { relu } from './relu';\nexport { relu6 } from './relu6';\nexport { reshape } from './reshape';\nexport { reverse } from './reverse';\nexport { reverse1d } from './reverse_1d';\nexport { reverse2d } from './reverse_2d';\nexport { reverse3d } from './reverse_3d';\nexport { reverse4d } from './reverse_4d';\nexport { round } from './round';\nexport { rsqrt } from './rsqrt';\nexport { scalar } from './scalar';\nexport { selu } from './selu';\nexport { separableConv2d } from './separable_conv2d';\nexport { setdiff1dAsync } from './setdiff1d_async';\nexport { sigmoid } from './sigmoid';\nexport { sign } from './sign';\nexport { sin } from './sin';\nexport { sinh } from './sinh';\nexport { slice } from './slice';\nexport { slice1d } from './slice1d';\nexport { slice2d } from './slice2d';\nexport { slice3d } from './slice3d';\nexport { slice4d } from './slice4d';\nexport { softmax } from './softmax';\nexport { softplus } from './softplus';\nexport { spaceToBatchND } from './space_to_batch_nd';\nexport { fft } from './spectral/fft';\nexport { ifft } from './spectral/ifft';\nexport { irfft } from './spectral/irfft';\nexport { rfft } from './spectral/rfft';\nexport { split } from './split';\nexport { sqrt } from './sqrt';\nexport { square } from './square';\nexport { squaredDifference } from './squared_difference';\nexport { squeeze } from './squeeze';\nexport { stack } from './stack';\nexport { step } from './step';\nexport { stridedSlice } from './strided_slice';\nexport { sub } from './sub';\nexport { sum } from './sum';\nexport { tan } from './tan';\nexport { tanh } from './tanh';\nexport { tensor } from './tensor';\nexport { tensor1d } from './tensor1d';\nexport { tensor2d } from './tensor2d';\nexport { tensor3d } from './tensor3d';\nexport { tensor4d } from './tensor4d';\nexport { tensor5d } from './tensor5d';\nexport { tensor6d } from './tensor6d';\nexport { tile } from './tile';\nexport { topk } from './topk';\nexport { truncatedNormal } from './truncated_normal';\nexport { unique } from './unique';\nexport { unsortedSegmentSum } from './unsorted_segment_sum';\nexport { unstack } from './unstack';\nexport { upperBound } from './upper_bound';\nexport { variable } from './variable';\nexport { where } from './where';\nexport { whereAsync } from './where_async';\nexport { zeros } from './zeros';\nexport { zerosLike } from './zeros_like';\nexport * from './boolean_mask';\nexport * from './transpose';\nexport * from './norm';\nexport * from './moving_average';\nexport * from './scatter_nd';\nexport * from './search_sorted';\nexport * from './sparse_to_dense';\nexport * from './gather_nd';\nexport * from './dropout';\nexport * from './signal_ops_util';\nexport * from './in_top_k';\nexport { op, OP_SCOPE_SUFFIX } from './operation';\nimport { rfft } from './spectral/rfft';\nimport { fft } from './spectral/fft';\nimport { ifft } from './spectral/ifft';\nimport { irfft } from './spectral/irfft';\nconst spectral = {\n fft,\n ifft,\n rfft,\n irfft\n};\nimport * as fused from './fused_ops';\nimport { hammingWindow } from './signal/hamming_window';\nimport { hannWindow } from './signal/hann_window';\nimport { frame } from './signal/frame';\nimport { stft } from './signal/stft';\nconst signal = {\n hammingWindow,\n hannWindow,\n frame,\n stft,\n};\n// Image Ops namespace\nimport { cropAndResize } from './image/crop_and_resize';\nimport { flipLeftRight } from './image/flip_left_right';\nimport { grayscaleToRGB } from './image/grayscale_to_rgb';\nimport { rotateWithOffset } from './image/rotate_with_offset';\nimport { nonMaxSuppression } from './image/non_max_suppression';\nimport { nonMaxSuppressionAsync } from './image/non_max_suppression_async';\nimport { nonMaxSuppressionWithScore } from './image/non_max_suppression_with_score';\nimport { nonMaxSuppressionWithScoreAsync } from './image/non_max_suppression_with_score_async';\nimport { nonMaxSuppressionPadded } from './image/non_max_suppression_padded';\nimport { nonMaxSuppressionPaddedAsync } from './image/non_max_suppression_padded_async';\nimport { resizeBilinear } from './image/resize_bilinear';\nimport { resizeNearestNeighbor } from './image/resize_nearest_neighbor';\nimport { threshold } from './image/threshold';\nimport { transform } from './image/transform';\nconst image = {\n flipLeftRight,\n grayscaleToRGB,\n resizeNearestNeighbor,\n resizeBilinear,\n rotateWithOffset,\n cropAndResize,\n nonMaxSuppression,\n nonMaxSuppressionAsync,\n nonMaxSuppressionWithScore,\n nonMaxSuppressionWithScoreAsync,\n nonMaxSuppressionPadded,\n nonMaxSuppressionPaddedAsync,\n threshold,\n transform\n};\n// linalg namespace\nimport { bandPart } from './linalg/band_part';\nimport { gramSchmidt } from './linalg/gram_schmidt';\nimport { qr } from './linalg/qr';\nconst linalg = {\n bandPart,\n gramSchmidt,\n qr\n};\n// losses namespace;\nimport { absoluteDifference } from './losses/absolute_difference';\nimport { computeWeightedLoss } from './losses/compute_weighted_loss';\nimport { cosineDistance } from './losses/cosine_distance';\nimport { hingeLoss } from './losses/hinge_loss';\nimport { huberLoss } from './losses/huber_loss';\nimport { logLoss } from './losses/log_loss';\nimport { meanSquaredError } from './losses/mean_squared_error';\nimport { sigmoidCrossEntropy } from './losses/sigmoid_cross_entropy';\nimport { softmaxCrossEntropy } from './losses/softmax_cross_entropy';\nconst losses = {\n absoluteDifference,\n computeWeightedLoss,\n cosineDistance,\n hingeLoss,\n huberLoss,\n logLoss,\n meanSquaredError,\n sigmoidCrossEntropy,\n softmaxCrossEntropy\n};\nimport { sparseFillEmptyRows } from './sparse/sparse_fill_empty_rows';\nimport { sparseReshape } from './sparse/sparse_reshape';\nimport { sparseSegmentMean } from './sparse/sparse_segment_mean';\nimport { sparseSegmentSum } from './sparse/sparse_segment_sum';\nconst sparse = {\n sparseFillEmptyRows,\n sparseReshape,\n sparseSegmentMean,\n sparseSegmentSum\n};\nimport { stringNGrams } from './string/string_n_grams';\nimport { stringSplit } from './string/string_split';\nimport { stringToHashBucketFast } from './string/string_to_hash_bucket_fast';\n// tslint:disable-next-line:variable-name\nconst string = {\n stringNGrams,\n stringSplit,\n stringToHashBucketFast\n};\n// Second level exports.\nexport { image, linalg, losses, spectral, fused, signal, sparse, string };\n//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoib3BzLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vLi4vdGZqcy1jb3JlL3NyYy9vcHMvb3BzLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBOzs7Ozs7Ozs7Ozs7Ozs7R0FlRztBQUVILG1CQUFtQjtBQUNuQixPQUFPLEVBQUMsR0FBRyxFQUFDLE1BQU0sT0FBTyxDQUFDO0FBQzFCLE9BQU8sRUFBQyxJQUFJLEVBQUMsTUFBTSxRQUFRLENBQUM7QUFDNUIsT0FBTyxFQUFDLEtBQUssRUFBQyxNQUFNLFNBQVMsQ0FBQztBQUM5QixPQUFPLEVBQUMsR0FBRyxFQUFDLE1BQU0sT0FBTyxDQUFDO0FBQzFCLE9BQU8sRUFBQyxJQUFJLEVBQUMsTUFBTSxTQUFTLENBQUM7QUFDN0IsT0FBTyxFQUFDLEdBQUcsRUFBQyxNQUFNLE9BQU8sQ0FBQztBQUMxQixPQUFPLEVBQUMsR0FBRyxFQUFDLE1BQU0sT0FBTyxDQUFDO0FBQzFCLE9BQU8sRUFBQyxNQUFNLEVBQUMsTUFBTSxXQUFXLENBQUM7QUFDakMsT0FBTyxFQUFDLE1BQU0sRUFBQyxNQUFNLFdBQVcsQ0FBQztBQUNqQyxPQUFPLEVBQUMsSUFBSSxFQUFDLE1BQU0sUUFBUSxDQUFDO0FBQzVCLE9BQU8sRUFBQyxLQUFLLEVBQUMsTUFBTSxTQUFTLENBQUM7QUFDOUIsT0FBTyxFQUFDLElBQUksRUFBQyxNQUFNLFFBQVEsQ0FBQztBQUM1QixPQUFPLEVBQUMsS0FBSyxFQUFDLE1BQU0sU0FBUyxDQUFDO0FBQzlCLE9BQU8sRUFBQyxLQUFLLEVBQUMsTUFBTSxTQUFTLENBQUM7QUFDOUIsT0FBTyxFQUFDLE9BQU8sRUFBQyxNQUFNLFlBQVksQ0FBQztBQUNuQyxPQUFPLEVBQUMsU0FBUyxFQUFDLE1BQU0sZUFBZSxDQUFDO0FBQ3hDLE9BQU8sRUFBQyxhQUFhLEVBQUMsTUFBTSxtQkFBbUIsQ0FBQztBQUNoRCxPQUFPLEVBQUMsY0FBYyxFQUFDLE1BQU0scUJBQXFCLENB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M0UseUNBQXlDO0FBQ3pDLE1BQU0sTUFBTSxHQUFHO0lBQ2IsWUFBWTtJQUNaLFdBQVc7SUFDWCxzQkFBc0I7Q0FDdkIsQ0FBQztBQUVGLHdCQUF3QjtBQUN4QixPQUFPLEVBQUMsS0FBSyxFQUFFLE1BQU0sRUFBRSxNQUFNLEVBQUUsUUFBUSxFQUFFLEtBQUssRUFBRSxNQUFNLEVBQUUsTUFBTSxFQUFFLE1BQU0sRUFBQyxDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiLyoqXG4gKiBAbGljZW5zZVxuICogQ29weXJpZ2h0IDIwMjAgR29vZ2xlIExMQy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC5cbiAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSBcIkxpY2Vuc2VcIik7XG4gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuXG4gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXRcbiAqXG4gKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjBcbiAqXG4gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlXG4gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiBcIkFTIElTXCIgQkFTSVMsXG4gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC5cbiAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmRcbiAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLlxuICogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbiAqL1xuXG4vLyBNb2R1bGFyaXplZCBvcHMuXG5leHBvcnQge2Fic30gZnJvbSAnLi9hYnMnO1xuZXhwb3J0IHthY29zfSBmcm9tICcuL2Fjb3MnO1xuZXhwb3J0IHthY29zaH0gZnJvbSAnLi9hY29zaCc7XG5leHBvcnQge2FkZH0gZnJvbSAnLi9hZGQnO1xuZXhwb3J0IHthZGROfSBmcm9tICcuL2FkZF9uJztcbmV4cG9ydCB7YWxsfSBmcm9tICcuL2FsbCc7XG5leHBvcnQge2FueX0gZnJvbSAnLi9hbnknO1xuZXhwb3J0IHthcmdNYXh9IGZyb20gJy4vYXJnX21heCc7XG5leHBvcnQge2FyZ01pbn0gZnJvbSAnLi9hcmdfbWluJztcbmV4cG9ydCB7YXNpbn0gZnJvbSAnLi9hc2luJztcbmV4cG9ydCB7YXNpbmh9IGZyb20gJy4vYXNpbmgnO1xuZXhwb3J0IHthdGFufSBmcm9tICcuL2F0YW4nO1xuZXhwb3J0IHthdGFuMn0gZnJvbSAnLi9hdGFuMic7XG5leHBvcnQge2F0YW5ofSBmcm9tICcuL2F0YW5oJztcbmV4cG9ydCB7YXZnUG9vbH0gZnJvbSAnLi9hdmdfcG9vbCc7XG5leHBvcnQge2F2Z1Bvb2wzZH0gZnJvbSAnLi9hdmdfcG9vbF8zZCc7XG5leHBvcnQge2Jhc2ljTFNUTUNlbGx9IGZyb20gJy4vYmFzaWNfbHN0bV9jZWxsJztcbmV4cG9ydCB7YmF0Y2hUb1NwYWNlTkR9IGZyb20gJy4vYmF0Y2hfdG9fc3BhY2VfbmQnO1xuZXhwb3J0IHtiYXRjaE5vcm19IGZyb20gJy4vYmF0Y2hub3JtJztcbmV4cG9ydCB7YmF0Y2hOb3JtMmR9IGZyb20gJy4vYmF0Y2hub3JtMmQnO1xuZXhwb3J0IHtiYXRjaE5vcm0zZH0gZnJvbSAnLi9iYXRjaG5vcm0zZCc7XG5leHBvcnQge2JhdGNoTm9ybTRkfSBmcm9tICcuL2JhdGNobm9ybTRkJztcbmV4cG9ydCB7YmluY291bnR9IGZyb20gJy4vYmluY291bnQnO1xuZXhwb3J0IHticm9hZGNhc3RBcmdzfSBmcm9tICcuL2Jyb2FkY2FzdF9hcmdzJztcbmV4cG9ydCB7YnJvYWRjYXN0VG99IGZyb20gJy4vYnJvYWRjYXN0X3RvJztcbmV4cG9ydCB7YnVmZmVyfSBmcm9tICcuL2J1ZmZlcic7XG5leHBvcnQge2Nhc3R9IGZyb20gJy4vY2FzdCc7XG5leHBvcnQge2NlaWx9IGZyb20gJy4vY2VpbCc7XG5leHBvcnQge2NsaXBCeVZhbHVlfSBmcm9tICcuL2NsaXBfYnlfdmFsdWUnO1xuZXhwb3J0IHtjbG9uZX0gZnJvbSAnLi9jbG9uZSc7XG5leHBvcnQge2NvbXBsZXh9IGZyb20gJy4vY29tcGxleCc7XG5leHBvcnQge2NvbmNhdH0gZnJvbSAnLi9jb25jYXQnO1xuZXhwb3J0IHtjb25jYXQxZH0gZnJvbSAnLi9jb25jYXRfMWQnO1xuZXhwb3J0IHtjb25jYXQyZH0gZnJvbSAnLi9jb25jYXRfMmQnO1xuZXhwb3J0IHtjb25jYXQzZH0gZnJvbSAnLi9jb25jYXRfM2QnO1xuZXhwb3J0IHtjb25jYXQ0ZH0gZnJvbSAnLi9jb25jYXRfNGQnO1xuZXhwb3J0IHtjb252MWR9IGZyb20gJy4vY29udjFkJztcbmV4cG9ydCB7Y29udjJkfSBmcm9tICcuL2NvbnYyZCc7XG5leHBvcnQge2NvbnYyZFRyYW5zcG9zZX0gZnJvbSAnLi9jb252MmRfdHJhbnNwb3NlJztcbmV4cG9ydCB7Y29udjNkfSBmcm9tICcuL2NvbnYzZCc7XG5leHBvcnQge2NvbnYzZFRyYW5zcG9zZX0gZnJvbSAnLi9jb252M2RfdHJhbnNwb3NlJztcbmV4cG9ydCB7Y29zfSBmcm9tICcuL2Nvcyc7XG5leHBvcnQge2Nvc2h9IGZyb20gJy4vY29zaCc7XG5leHBvcnQge2N1bXByb2R9IGZyb20gJy4vY3VtcHJvZCc7XG5leHBvcnQge2N1bXN1bX0gZnJvbSAnLi9jdW1zdW0nO1xuZXhwb3J0IHtkZW5zZUJpbmNvdW50fSBmcm9tICcuL2RlbnNlX2JpbmNvdW50JztcbmV4cG9ydCB7ZGVwdGhUb1NwYWNlfSBmcm9tICcuL2RlcHRoX3RvX3NwYWNlJztcbmV4cG9ydCB7ZGVwdGh3aXNlQ29udjJkfSBmcm9tICcuL2RlcHRod2lzZV9jb252MmQnO1xuZXhwb3J0IHtkaWFnfSBmcm9tICcuL2RpYWcnO1xuZXhwb3J0IHtkaWxhdGlvbjJkfSBmcm9tICcuL2RpbGF0aW9uMmQnO1xuZXhwb3J0IHtkaXZ9IGZyb20gJy4vZGl2JztcbmV4cG9ydCB7ZGl2Tm9OYW59IGZyb20gJy4vZGl2X25vX25hbic7XG5leHBvcnQge2RvdH0gZnJvbSAnLi9kb3QnO1xuZXhwb3J0IHtlaW5zdW19IGZyb20gJy4vZWluc3VtJztcbmV4cG9ydCB7ZWx1fSBmcm9tICcuL2VsdSc7XG5leHBvcnQge2VxdWFsfSBmcm9tICcuL2VxdWFsJztcbmV4cG9ydCB7ZXJmfSBmcm9tICcuL2VyZic7XG5leHBvcnQge2V1Y2xpZGVhbk5vcm19IGZyb20gJy4vZXVjbGlkZWFuX25vcm0nO1xuZXhwb3J0IHtleHB9IGZyb20gJy4vZXhwJztcbmV4cG9ydCB7ZXhwYW5kRGltc30gZnJvbSAnLi9leHBhbmRfZGltcyc7XG5leHBvcnQge2V4cG0xfSBmcm9tICcuL2V4cG0xJztcbmV4cG9ydCB7ZXllfSBmcm9tICcuL2V5ZSc7XG5leHBvcnQge2ZpbGx9IGZyb20gJy4vZmlsbCc7XG5leHBvcnQge2Zsb29yfSBmcm9tICcuL2Zsb29yJztcbmV4cG9ydCB7Zmxvb3JEaXZ9IGZyb20gJy4vZmxvb3JEaXYnO1xuZXhwb3J0IHtnYXRoZXJ9IGZyb20gJy4vZ2F0aGVyJztcbmV4cG9ydCB7Z3JlYXRlcn0gZnJvbSAnLi9ncmVhdGVyJztcbmV4cG9ydCB7Z3JlYXRlckVxdWFsfSBmcm9tICcuL2dyZWF0ZXJfZXF1YWwnO1xuZXhwb3J0IHtpbWFnfSBmcm9tICcuL2ltYWcnO1xuZXhwb3J0IHtpc0Zpbml0ZX0gZnJvbSAnLi9pc19maW5pdGUnO1xuZXhwb3J0IHtpc0luZn0gZnJvbSAnLi9pc19pbmYnO1xuZXhwb3J0IHtpc05hTn0gZnJvbSAnLi9pc19uYW4nO1xuZXhwb3J0IHtsZWFreVJlbHV9IGZyb20gJy4vbGVha3lfcmVsdSc7XG5leHBvcnQge2xlc3N9IGZyb20gJy4vbGVzcyc7XG5leHBvcnQge2xlc3NFcXVhbH0gZnJvbSAnLi9sZXNzX2VxdWFsJztcbmV4cG9ydCB7bGluc3BhY2V9IGZyb20gJy4vbGluc3BhY2UnO1xuZXhwb3J0IHtsb2NhbFJlc3BvbnNlTm9ybWFsaXphdGlvbn0gZnJvbSAnLi9sb2NhbF9yZXNwb25zZV9ub3JtYWxpemF0aW9uJztcbmV4cG9ydCB7bG9nfSBmcm9tICcuL2xvZyc7XG5leHBvcnQge2xvZzFwfSBmcm9tICcuL2xvZzFwJztcbmV4cG9ydCB7bG9nU2lnbW9pZH0gZnJvbSAnLi9sb2dfc2lnbW9pZCc7XG5leHBvcnQge2xvZ1NvZnRtYXh9IGZyb20gJy4vbG9nX3NvZnRtYXgnO1xuZXhwb3J0IHtsb2dTdW1FeHB9IGZyb20gJy4vbG9nX3N1bV9leHAnO1xuZXhwb3J0IHtsb2dpY2FsQW5kfSBmcm9tICcuL2xvZ2ljYWxfYW5kJztcbmV4cG9ydCB7bG9naWNhbE5vdH0gZnJvbSAnLi9sb2dpY2FsX25vdCc7XG5leHBvcnQge2xvZ2ljYWxPcn0gZnJvbSAnLi9sb2dpY2FsX29yJztcbmV4cG9ydCB7bG9naWNhbFhvcn0gZnJvbSAnLi9sb2dpY2FsX3hvcic7XG5leHBvcnQge2xvd2VyQm91bmR9IGZyb20gJy4vbG93ZXJfYm91bmQnO1xuZXhwb3J0IHttYXRNdWx9IGZyb20gJy4vbWF0X211bCc7XG5leHBvcnQge21heH0gZnJvbSAnLi9tYXgnO1xuZXhwb3J0IHttYXhQb29sfSBmcm9tICcuL21heF9wb29sJztcbmV4cG9ydCB7bWF4UG9vbDNkfSBmcm9tICcuL21heF9wb29sXzNkJztcbmV4cG9ydCB7bWF4UG9vbFdpdGhBcmdtYXh9IGZyb20gJy4vbWF4X3Bvb2xfd2l0aF9hcmdtYXgnO1xuZXhwb3J0IHttYXhpbXVtfSBmcm9tICcuL21heGltdW0nO1xuZXhwb3J0IHttZWFufSBmcm9tICcuL21lYW4nO1xuZXhwb3J0IHttZXNoZ3JpZH0gZnJvbSAnLi9tZXNoZ3JpZCc7XG5leHBvcnQge21pbn0gZnJvbSAnLi9taW4nO1xuZXhwb3J0IHttaW5pbXVtfSBmcm9tICcuL21pbmltdW0nO1xuZXhwb3J0IHttaXJyb3JQYWR9IGZyb20gJy4vbWlycm9yX3BhZCc7XG5leHBvcnQge21vZH0gZnJvbSAnLi9tb2QnO1xuZXhwb3J0IHttb21lbnRzfSBmcm9tICcuL21vbWVudHMnO1xuZXhwb3J0IHttdWx9IGZyb20gJy4vbXVsJztcbmV4cG9ydCB7TFNUTUNlbGxGdW5jLCBtdWx0aVJOTkNlbGx9IGZyb20gJy4vbXVsdGlfcm5uX2NlbGwnO1xuZXhwb3J0IHttdWx0aW5vbWlhbH0gZnJvbSAnLi9tdWx0aW5vbWlhbCc7XG5leHBvcnQge25lZ30gZnJvbSAnLi9uZWcnO1xuZXhwb3J0IHtub3RFcXVhbH0gZnJvbSAnLi9ub3RfZXF1YWwnO1xuZXhwb3J0IHtvbmVIb3R9IGZyb20gJy4vb25lX2hvdCc7XG5leHBvcnQge29uZXN9IGZyb20gJy4vb25lcyc7XG5leHBvcnQge29uZXNMaWtlfSBmcm9tICcuL29uZXNfbGlrZSc7XG5leHBvcnQge291dGVyUHJvZHVjdH0gZnJvbSAnLi9vdXRlcl9wcm9kdWN0JztcbmV4cG9ydCB7cGFkfSBmcm9tICcuL3BhZCc7XG5leHBvcnQge3BhZDFkfSBmcm9tICcuL3BhZDFkJztcbmV4cG9ydCB7cGFkMmR9IGZyb20gJy4vcGFkMmQnO1xuZXhwb3J0IHtwYWQzZH0gZnJvbSAnLi9wYWQzZCc7XG5leHBvcnQge3BhZDRkfSBmcm9tICcuL3BhZDRkJztcbmV4cG9ydCB7cG9vbH0gZnJvbSAnLi9wb29sJztcbmV4cG9ydCB7cG93fSBmcm9tICcuL3Bvdyc7XG5leHBvcnQge3ByZWx1fSBmcm9tICcuL3ByZWx1JztcbmV4cG9ydCB7cHJpbnR9IGZyb20gJy4vcHJpbnQnO1xuZXhwb3J0IHtwcm9kfSBmcm9tICcuL3Byb2QnO1xuZXhwb3J0IHtyYWdnZWRHYXRoZXJ9IGZyb20gJy4vcmFnZ2VkX2dhdGhlcic7XG5leHBvcnQge3JhZ2dlZFRlbnNvclRvVGVuc29yfSBmcm9tICcuL3JhZ2dlZF90ZW5zb3JfdG9fdGVuc29yJztcbmV4cG9ydCB7cmFuZH0gZnJvbSAnLi9yYW5kJztcbmV4cG9ydCB7cmFuZG9tR2FtbWF9IGZyb20gJy4vcmFuZG9tX2dhbW1hJztcbmV4cG9ydCB7cmFuZG9tTm9ybWFsfSBmcm9tICcuL3JhbmRvbV9ub3JtYWwnO1xuZXhwb3J0IHtyYW5kb21TdGFuZGFyZE5vcm1hbH0gZnJvbSAnLi9yYW5kb21fc3RhbmRhcmRfbm9ybWFsJztcbmV4cG9ydCB7cmFuZG9tVW5pZm9ybX0gZnJvbSAnLi9yYW5kb21fdW5pZm9ybSc7XG5leHBvcnQge3JhbmdlfSBmcm9tICcuL3JhbmdlJztcbmV4cG9ydCB7cmVhbH0gZnJvbSAnLi9yZWFsJztcbmV4cG9ydCB7cmVjaXByb2NhbH0gZnJvbSAnLi9yZWNpcHJvY2FsJztcbmV4cG9ydCB7cmVsdX0gZnJvbSAnLi9yZWx1JztcbmV4cG9ydCB7cmVsdTZ9IGZyb20gJy4vcmVsdTYnO1xuZXhwb3J0IHtyZXNoYXBlfSBmcm9tICcuL3Jlc2hhcGUnO1xuZXhwb3J0IHtyZXZlcnNlfSBmcm9tICcuL3JldmVyc2UnO1xuZXhwb3J0IHtyZXZlcnNlMWR9IGZyb20gJy4vcmV2ZXJzZV8xZCc7XG5leHBvcnQge3JldmVyc2UyZH0gZnJvbSAnLi9yZXZlcnNlXzJkJztcbmV4cG9ydCB7cmV2ZXJzZTNkfSBmcm9tICcuL3JldmVyc2VfM2QnO1xuZXhwb3J0IHtyZXZlcnNlNGR9IGZyb20gJy4vcmV2ZXJzZV80ZCc7XG5leHBvcnQge3JvdW5kfSBmcm9tICcuL3JvdW5kJztcbmV4cG9ydCB7cnNxcnR9IGZyb20gJy4vcnNxcnQnO1xuZXhwb3J0IHtzY2FsYXJ9IGZyb20gJy4vc2NhbGFyJztcbmV4cG9ydCB7c2VsdX0gZnJvbSAnLi9zZWx1JztcbmV4cG9ydCB7c2VwYXJhYmxlQ29udjJkfSBmcm9tICcuL3NlcGFyYWJsZV9jb252MmQnO1xuZXhwb3J0IHtzZXRkaWZmMWRBc3luY30gZnJvbSAnLi9zZXRkaWZmMWRfYXN5bmMnO1xuZXhwb3J0IHtzaWdtb2lkfSBmcm9tICcuL3NpZ21vaWQnO1xuZXhwb3J0IHtzaWdufSBmcm9tICcuL3NpZ24nO1xuZXhwb3J0IHtzaW59IGZyb20gJy4vc2luJztcbmV4cG9ydCB7c2luaH0gZnJvbSAnLi9zaW5oJztcbmV4cG9ydCB7c2xpY2V9IGZyb20gJy4vc2xpY2UnO1xuZXhwb3J0IHtzbGljZTFkfSBmcm9tICcuL3NsaWNlMWQnO1xuZXhwb3J0IHtzbGljZTJkfSBmcm9tICcuL3NsaWNlMmQnO1xuZXhwb3J0IHtzbGljZTNkfSBmcm9tICcuL3NsaWNlM2QnO1xuZXhwb3J0IHtzbGljZTRkfSBmcm9tICcuL3NsaWNlNGQnO1xuZXhwb3J0IHtzb2Z0bWF4fSBmcm9tICcuL3NvZnRtYXgnO1xuZXhwb3J0IHtzb2Z0cGx1c30gZnJvbSAnLi9zb2Z0cGx1cyc7XG5leHBvcnQge3NwYWNlVG9CYXRjaE5EfSBmcm9tICcuL3NwYWNlX3RvX2JhdGNoX25kJztcbmV4cG9ydCB7ZmZ0fSBmcm9tICcuL3NwZWN0cmFsL2ZmdCc7XG5leHBvcnQge2lmZnR9IGZyb20gJy4vc3BlY3RyYWwvaWZmdCc7XG5leHBvcnQge2lyZmZ0fSBmcm9tICcuL3NwZWN0cmFsL2lyZmZ0JztcbmV4cG9ydCB7cmZmdH0gZnJvbSAnLi9zcGVjdHJhbC9yZmZ0JztcbmV4cG9ydCB7c3BsaXR9IGZyb20gJy4vc3BsaXQnO1xuZXhwb3J0IHtzcXJ0fSBmcm9tICcuL3NxcnQnO1xuZXhwb3J0IHtzcXVhcmV9IGZyb20gJy4vc3F1YXJlJztcbmV4cG9ydCB7c3F1YXJlZERpZmZlcmVuY2V9IGZyb20gJy4vc3F1YXJlZF9kaWZmZXJlbmNlJztcbmV4cG9ydCB7c3F1ZWV6ZX0gZnJvbSAnLi9zcXVlZXplJztcbmV4cG9ydCB7c3RhY2t9IGZyb20gJy4vc3RhY2snO1xuZXhwb3J0IHtzdGVwfSBmcm9tICcuL3N0ZXAnO1xuZXhwb3J0IHtzdHJpZGVkU2xpY2V9IGZyb20gJy4vc3RyaWRlZF9zbGljZSc7XG5leHBvcnQge3N1Yn0gZnJvbSAnLi9zdWInO1xuZXhwb3J0IHtzdW19IGZyb20gJy4vc3VtJztcbmV4cG9ydCB7dGFufSBmcm9tICcuL3Rhbic7XG5leHBvcnQge3Rhbmh9IGZyb20gJy4vdGFuaCc7XG5leHBvcnQge3RlbnNvcn0gZnJvbSAnLi90ZW5zb3InO1xuZXhwb3J0IHt0ZW5zb3IxZH0gZnJvbSAnLi90ZW5zb3IxZCc7XG5leHBvcnQge3RlbnNvcjJkfSBmcm9tICcuL3RlbnNvcjJkJztcbmV4cG9ydCB7dGVuc29yM2R9IGZyb20gJy4vdGVuc29yM2QnO1xuZXhwb3J0IHt0ZW5zb3I0ZH0gZnJvbSAnLi90ZW5zb3I0ZCc7XG5leHBvcnQge3RlbnNvcjVkfSBmcm9tICcuL3RlbnNvcjVkJztcbmV4cG9ydCB7dGVuc29yNmR9IGZyb20gJy4vdGVuc29yNmQnO1xuZXhwb3J0IHt0aWxlfSBmcm9tICcuL3RpbGUnO1xuZXhwb3J0IHt0b3BrfSBmcm9tICcuL3RvcGsnO1xuZXhwb3J0IHt0cnVuY2F0ZWROb3JtYWx9IGZyb20gJy4vdHJ1bmNhdGVkX25vcm1hbCc7XG5leHBvcnQge3VuaXF1ZX0gZnJvbSAnLi91bmlxdWUnO1xuZXhwb3J0IHt1bnNvcnRlZFNlZ21lbnRTdW19IGZyb20gJy4vdW5zb3J0ZWRfc2VnbWVudF9zdW0nO1xuZXhwb3J0IHt1bnN0YWNrfSBmcm9tICcuL3Vuc3RhY2snO1xuZXhwb3J0IHt1cHBlckJvdW5kfSBmcm9tICcuL3VwcGVyX2JvdW5kJztcbmV4cG9ydCB7dmFyaWFibGV9IGZyb20gJy4vdmFyaWFibGUnO1xuZXhwb3J0IHt3aGVyZX0gZnJvbSAnLi93aGVyZSc7XG5leHBvcnQge3doZXJlQXN5bmN9IGZyb20gJy4vd2hlcmVfYXN5bmMnO1xuZXhwb3J0IHt6ZXJvc30gZnJvbSAnLi96ZXJvcyc7XG5leHBvcnQge3plcm9zTGlrZX0gZnJvbSAnLi96ZXJvc19saWtlJztcblxuZXhwb3J0ICogZnJvbSAnLi9ib29sZWFuX21hc2snO1xuZXhwb3J0ICogZnJvbSAnLi90cmFuc3Bvc2UnO1xuZXhwb3J0ICogZnJvbSAnLi9ub3JtJztcbmV4cG9ydCAqIGZyb20gJy4vbW92aW5nX2F2ZXJhZ2UnO1xuZXhwb3J0ICogZnJvbSAnLi9zY2F0dGVyX25kJztcbmV4cG9ydCAqIGZyb20gJy4vc2VhcmNoX3NvcnRlZCc7XG5leHBvcnQgKiBmcm9tICcuL3NwYXJzZV90b19kZW5zZSc7XG5leHBvcnQgKiBmcm9tICcuL2dhdGhlcl9uZCc7XG5leHBvcnQgKiBmcm9tICcuL2Ryb3BvdXQnO1xuZXhwb3J0ICogZnJvbSAnLi9zaWduYWxfb3BzX3V0aWwnO1xuZXhwb3J0ICogZnJvbSAnLi9pbl90b3Bfayc7XG5cbmV4cG9ydCB7b3AsIE9QX1NDT1BFX1NVRkZJWH0gZnJvbSAnLi9vcGVyYXRpb24nO1xuXG5pbXBvcnQge3JmZnR9IGZyb20gJy4vc3BlY3RyYWwvcmZmdCc7XG5pbXBvcnQge2ZmdH0gZnJvbSAnLi9zcGVjdHJhbC9mZnQnO1xuaW1wb3J0IHtpZmZ0fSBmcm9tICcuL3NwZWN0cmFsL2lmZnQnO1xuaW1wb3J0IHtpcmZmdH0gZnJvbSAnLi9zcGVjdHJhbC9pcmZmdCc7XG5jb25zdCBzcGVjdHJhbCA9IHtcbiAgZmZ0LFxuICBpZmZ0LFxuICByZmZ0LFxuICBpcmZmdFxufTtcblxuaW1wb3J0ICogYXMgZnVzZWQgZnJvbSAnLi9mdXNlZF9vcHMnO1xuXG5pbXBvcnQge2hhbW1pbmdXaW5kb3d9IGZyb20gJy4vc2lnbmFsL2hhbW1pbmdfd2luZG93JztcbmltcG9ydCB7aGFubldpbmRvd30gZnJvbSAnLi9zaWduYWwvaGFubl93aW5kb3cnO1xuaW1wb3J0IHtmcmFtZX0gZnJvbSAnLi9zaWduYWwvZnJhbWUnO1xuaW1wb3J0IHtzdGZ0fSBmcm9tICcuL3NpZ25hbC9zdGZ0JztcbmNvbnN0IHNpZ25hbCA9IHtcbiAgaGFtbWluZ1dpbmRvdyxcbiAgaGFubldpbmRvdyxcbiAgZnJhbWUsXG4gIHN0ZnQsXG59O1xuXG4vLyBJbWFnZSBPcHMgbmFtZXNwYWNlXG5pbXBvcnQge2Nyb3BBbmRSZXNpemV9IGZyb20gJy4vaW1hZ2UvY3JvcF9hbmRfcmVzaXplJztcbmltcG9ydCB7ZmxpcExlZnRSaWdodH0gZnJvbSAnLi9pbWFnZS9mbGlwX2xlZnRfcmlnaHQnO1xuaW1wb3J0IHtncmF5c2NhbGVUb1JHQn0gZnJvbSAnLi9pbWFnZS9ncmF5c2NhbGVfdG9fcmdiJztcbmltcG9ydCB7cm90YXRlV2l0aE9mZnNldH0gZnJvbSAnLi9pbWFnZS9yb3RhdGVfd2l0aF9vZmZzZXQnO1xuaW1wb3J0IHtub25NYXhTdXBwcmVzc2lvbn0gZnJvbSAnLi9pbWFnZS9ub25fbWF4X3N1cHByZXNzaW9uJztcbmltcG9ydCB7bm9uTWF4U3VwcHJlc3Npb25Bc3luY30gZnJvbSAnLi9pbWFnZS9ub25fbWF4X3N1cHByZXNzaW9uX2FzeW5jJztcbmltcG9ydCB7bm9uTWF4U3VwcHJlc3Npb25XaXRoU2NvcmV9IGZyb20gJy4vaW1hZ2Uvbm9uX21heF9zdXBwcmVzc2lvbl93aXRoX3Njb3JlJztcbmltcG9ydCB7bm9uTWF4U3VwcHJlc3Npb25XaXRoU2NvcmVBc3luY30gZnJvbSAnLi9pbWFnZS9ub25fbWF4X3N1cHByZXNzaW9uX3dpdGhfc2NvcmVfYXN5bmMnO1xuaW1wb3J0IHtub25NYXhTdXBwcmVzc2lvblBhZGRlZH0gZnJvbSAnLi9pbWFnZS9ub25fbWF4X3N1cHByZXNzaW9uX3BhZGRlZCc7XG5pbXBvcnQge25vbk1heFN1cHByZXNzaW9uUGFkZGVkQXN5bmN9IGZyb20gJy4vaW1hZ2Uvbm9uX21heF9zdXBwcmVzc2lvbl9wYWRkZWRfYXN5bmMnO1xuaW1wb3J0IHtyZXNpemVCaWxpbmVhcn0gZnJvbSAnLi9pbWFnZS9yZXNpemVfYmlsaW5lYXInO1xuaW1wb3J0IHtyZXNpemVOZWFyZXN0TmVpZ2hib3J9IGZyb20gJy4vaW1hZ2UvcmVzaXplX25lYXJlc3RfbmVpZ2hib3InO1xuaW1wb3J0IHt0aHJlc2hvbGR9IGZyb20gJy4vaW1hZ2UvdGhyZXNob2xkJztcbmltcG9ydCB7dHJhbnNmb3JtfSBmcm9tICcuL2ltYWdlL3RyYW5zZm9ybSc7XG5jb25zdCBpbWFnZSA9IHtcbiAgZmxpcExlZnRSaWdodCxcbiAgZ3JheXNjYWxlVG9SR0IsXG4gIHJlc2l6ZU5lYXJlc3ROZWlnaGJvcixcbiAgcmVzaXplQmlsaW5lYXIsXG4gIHJvdGF0ZVdpdGhPZmZzZXQsXG4gIGNyb3BBbmRSZXNpemUsXG4gIG5vbk1heFN1cHByZXNzaW9uLFxuICBub25NYXhTdXBwcmVzc2lvbkFzeW5jLFxuICBub25NYXhTdXBwcmVzc2lvbldpdGhTY29yZSxcbiAgbm9uTWF4U3VwcHJlc3Npb25XaXRoU2NvcmVBc3luYyxcbiAgbm9uTWF4U3VwcHJlc3Npb25QYWRkZWQsXG4gIG5vbk1heFN1cHByZXNzaW9uUGFkZGVkQXN5bmMsXG4gIHRocmVzaG9sZCxcbiAgdHJhbnNmb3JtXG59O1xuXG4vLyBsaW5hbGcgbmFtZXNwYWNlXG5pbXBvcnQge2JhbmRQYXJ0fSBmcm9tICcuL2xpbmFsZy9iYW5kX3BhcnQnO1xuaW1wb3J0IHtncmFtU2NobWlkdH0gZnJvbSAnLi9saW5hbGcvZ3JhbV9zY2htaWR0JztcbmltcG9ydCB7cXJ9IGZyb20gJy4vbGluYWxnL3FyJztcbmNvbnN0IGxpbmFsZyA9IHtcbiAgYmFuZFBhcnQsXG4gIGdyYW1TY2htaWR0LFxuICBxclxufTtcblxuLy8gbG9zc2VzIG5hbWVzcGFjZTtcbmltcG9ydCB7YWJzb2x1dGVEaWZmZXJlbmNlfSBmcm9tICcuL2xvc3Nlcy9hYnNvbHV0ZV9kaWZmZXJlbmNlJztcbmltcG9ydCB7Y29tcHV0ZVdlaWdodGVkTG9zc30gZnJvbSAnLi9sb3NzZXMvY29tcHV0ZV93ZWlnaHRlZF9sb3NzJztcbmltcG9ydCB7Y29zaW5lRGlzdGFuY2V9IGZyb20gJy4vbG9zc2VzL2Nvc2luZV9kaXN0YW5jZSc7XG5pbXBvcnQge2hpbmdlTG9zc30gZnJvbSAnLi9sb3NzZXMvaGluZ2VfbG9zcyc7XG5pbXBvcnQge2h1YmVyTG9zc30gZnJvbSAnLi9sb3NzZXMvaHViZXJfbG9zcyc7XG5pbXBvcnQge2xvZ0xvc3N9IGZyb20gJy4vbG9zc2VzL2xvZ19sb3NzJztcbmltcG9ydCB7bWVhblNxdWFyZWRFcnJvcn0gZnJvbSAnLi9sb3NzZXMvbWVhbl9zcXVhcmVkX2Vycm9yJztcbmltcG9ydCB7c2lnbW9pZENyb3NzRW50cm9weX0gZnJvbSAnLi9sb3NzZXMvc2lnbW9pZF9jcm9zc19lbnRyb3B5JztcbmltcG9ydCB7c29mdG1heENyb3NzRW50cm9weX0gZnJvbSAnLi9sb3NzZXMvc29mdG1heF9jcm9zc19lbnRyb3B5JztcbmNvbnN0IGxvc3NlcyA9IHtcbiAgYWJzb2x1dGVEaWZmZXJlbmNlLFxuICBjb21wdXRlV2VpZ2h0ZWRMb3NzLFxuICBjb3NpbmVEaXN0YW5jZSxcbiAgaGluZ2VMb3NzLFxuICBodWJlckxvc3MsXG4gIGxvZ0xvc3MsXG4gIG1lYW5TcXVhcmVkRXJyb3IsXG4gIHNpZ21vaWRDcm9zc0VudHJvcHksXG4gIHNvZnRtYXhDcm9zc0VudHJvcHlcbn07XG5cbmltcG9ydCB7c3BhcnNlRmlsbEVtcHR5Um93c30gZnJvbSAnLi9zcGFyc2Uvc3BhcnNlX2ZpbGxfZW1wdHlfcm93cyc7XG5pbXBvcnQge3NwYXJzZVJlc2hhcGV9IGZyb20gJy4vc3BhcnNlL3NwYXJzZV9yZXNoYXBlJztcbmltcG9ydCB7c3BhcnNlU2VnbWVudE1lYW59IGZyb20gJy4vc3BhcnNlL3NwYXJzZV9zZWdtZW50X21lYW4nO1xuaW1wb3J0IHtzcGFyc2VTZWdtZW50U3VtfSBmcm9tICcuL3NwYXJzZS9zcGFyc2Vfc2VnbWVudF9zdW0nO1xuY29uc3Qgc3BhcnNlID0ge1xuICBzcGFyc2VGaWxsRW1wdHlSb3dzLFxuICBzcGFyc2VSZXNoYXBlLFxuICBzcGFyc2VTZWdtZW50TWVhbixcbiAgc3BhcnNlU2VnbWVudFN1bVxufTtcblxuaW1wb3J0IHtzdHJpbmdOR3JhbXN9IGZyb20gJy4vc3RyaW5nL3N0cmluZ19uX2dyYW1zJztcbmltcG9ydCB7c3RyaW5nU3BsaXR9IGZyb20gJy4vc3RyaW5nL3N0cmluZ19zcGxpdCc7XG5pbXBvcnQge3N0cmluZ1RvSGFzaEJ1Y2tldEZhc3R9IGZyb20gJy4vc3RyaW5nL3N0cmluZ190b19oYXNoX2J1Y2tldF9mYXN0Jztcbi8vIHRzbGludDpkaXNhYmxlLW5leHQtbGluZTp2YXJpYWJsZS1uYW1lXG5jb25zdCBzdHJpbmcgPSB7XG4gIHN0cmluZ05HcmFtcyxcbiAgc3RyaW5nU3BsaXQsXG4gIHN0cmluZ1RvSGFzaEJ1Y2tldEZhc3Rcbn07XG5cbi8vIFNlY29uZCBsZXZlbCBleHBvcnRzLlxuZXhwb3J0IHtpbWFnZSwgbGluYWxnLCBsb3NzZXMsIHNwZWN0cmFsLCBmdXNlZCwgc2lnbmFsLCBzcGFyc2UsIHN0cmluZ307XG4iXX0=","/**\n * @license\n * Copyright 2020 Google LLC. All Rights Reserved.\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n * =============================================================================\n */\nimport { ENGINE } from '../engine';\nimport { PadV2 } from '../kernel_names';\nimport { convertToTensor } from '../tensor_util_env';\nimport { op } from './operation';\n/**\n * Pads a `tf.Tensor` with a given value and paddings.\n *\n * This operation implements `CONSTANT` mode. For `REFLECT` and `SYMMETRIC`,\n * refer to `tf.mirrorPad`.\n *\n * Also available are stricter rank-specific methods with the same signature\n * as this method that assert that `paddings` is of given length.\n * - `tf.pad1d`\n * - `tf.pad2d`\n * - `tf.pad3d`\n * - `tf.pad4d`\n *\n * ```js\n * const x = tf.tensor1d([1, 2, 3, 4]);\n * x.pad([[1, 2]]).print();\n * ```\n * @param x The tensor to pad.\n * @param paddings An array of length `R` (the rank of the tensor), where\n * each element is a length-2 tuple of ints `[padBefore, padAfter]`,\n * specifying how much to pad along each dimension of the tensor.\n * @param constantValue The pad value to use. Defaults to 0.\n *\n * @doc {heading: 'Tensors', subheading: 'Transformations'}\n */\nfunction pad_(x, paddings, constantValue = 0) {\n const $x = convertToTensor(x, 'x', 'pad');\n if ($x.rank === 0) {\n throw new Error('pad(scalar) is not defined. Pass non-scalar to pad');\n }\n const attrs = { paddings, constantValue };\n const inputs = { x: $x };\n return ENGINE.runKernel(PadV2, inputs, attrs);\n}\nexport const pad = op({ pad_ });\n//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicGFkLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vLi4vdGZqcy1jb3JlL3NyYy9vcHMvcGFkLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBOzs7Ozs7Ozs7Ozs7Ozs7R0FlRztBQUVILE9BQU8sRUFBQyxNQUFNLEVBQUMsTUFBTSxXQUFXLENBQUM7QUFDakMsT0FBTyxFQUFDLEtBQUssRUFBMEIsTUFBTSxpQkFBaUIsQ0FBQztBQUkvRCxPQUFPLEVBQUMsZUFBZSxFQUFDLE1BQU0sb0JBQW9CLENBQUM7QUFHbkQsT0FBTyxFQUFDLEVBQUUsRUFBQyxNQUFNLGFBQWEsQ0FBQztBQUUvQjs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7O0dBd0JHO0FBQ0gsU0FBUyxJQUFJLENBQ1QsQ0FBZSxFQUFFLFFBQWlDLEVBQUUsYUFBYSxHQUFHLENBQUM7SUFDdkUsTUFBTSxFQUFFLEdBQUcsZUFBZSxDQUFDLENBQUMsRUFBRSxHQUFHLEVBQUUsS0FBSyxDQUFDLENBQUM7SUFDMUMsSUFBSSxFQUFFLENBQUMsSUFBSSxLQUFLLENBQUMsRUFBRTtRQUNqQixNQUFNLElBQUksS0FBSyxDQUFDLG9EQUFvRCxDQUFDLENBQUM7S0FDdkU7SUFFRCxNQUFNLEtBQUssR0FBZSxFQUFDLFFBQVEsRUFBRSxhQUFhLEVBQUMsQ0FBQztJQUNwRCxNQUFNLE1BQU0sR0FBZ0IsRUFBQyxDQUFDLEVBQUUsRUFBRSxFQUFDLENBQUM7SUFDcEMsT0FBTyxNQUFNLENBQUMsU0FBUyxDQUNuQixLQUFLLEVBQUUsTUFBbUMsRUFDMUMsS0FBZ0MsQ0FBQyxDQUFDO0FBQ3hDLENBQUM7QUFFRCxNQUFNLENBQUMsTUFBTSxHQUFHLEdBQUcsRUFBRSxDQUFDLEVBQUMsSUFBSSxFQUFDLENBQUMsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbIi8qKlxuICogQGxpY2Vuc2VcbiAqIENvcHlyaWdodCAyMDIwIEdvb2dsZSBMTEMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuXG4gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgXCJMaWNlbnNlXCIpO1xuICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLlxuICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0XG4gKlxuICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wXG4gKlxuICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZVxuICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gXCJBUyBJU1wiIEJBU0lTLFxuICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuXG4gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kXG4gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS5cbiAqID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4gKi9cblxuaW1wb3J0IHtFTkdJTkV9IGZyb20gJy4uL2VuZ2luZSc7XG5pbXBvcnQge1BhZFYyLCBQYWRWMkF0dHJzLCBQYWRWMklucHV0c30gZnJvbSAnLi4va2VybmVsX25hbWVzJztcbmltcG9ydCB7TmFtZWRBdHRyTWFwfSBmcm9tICcuLi9rZXJuZWxfcmVnaXN0cnknO1xuaW1wb3J0IHtUZW5zb3J9IGZyb20gJy4uL3RlbnNvcic7XG5pbXBvcnQge05hbWVkVGVuc29yTWFwfSBmcm9tICcuLi90ZW5zb3JfdHlwZXMnO1xuaW1wb3J0IHtjb252ZXJ0VG9UZW5zb3J9IGZyb20gJy4uL3RlbnNvcl91dGlsX2Vudic7XG5pbXBvcnQge1RlbnNvckxpa2V9IGZyb20gJy4uL3R5cGVzJztcblxuaW1wb3J0IHtvcH0gZnJvbSAnLi9vcGVyYXRpb24nO1xuXG4vKipcbiAqIFBhZHMgYSBgdGYuVGVuc29yYCB3aXRoIGEgZ2l2ZW4gdmFsdWUgYW5kIHBhZGRpbmdzLlxuICpcbiAqIFRoaXMgb3BlcmF0aW9uIGltcGxlbWVudHMgYENPTlNUQU5UYCBtb2RlLiBGb3IgYFJFRkxFQ1RgIGFuZCBgU1lNTUVUUklDYCxcbiAqIHJlZmVyIHRvIGB0Zi5taXJyb3JQYWRgLlxuICpcbiAqIEFsc28gYXZhaWxhYmxlIGFyZSBzdHJpY3RlciByYW5rLXNwZWNpZmljIG1ldGhvZHMgd2l0aCB0aGUgc2FtZSBzaWduYXR1cmVcbiAqIGFzIHRoaXMgbWV0aG9kIHRoYXQgYXNzZXJ0IHRoYXQgYHBhZGRpbmdzYCBpcyBvZiBnaXZlbiBsZW5ndGguXG4gKiAgIC0gYHRmLnBhZDFkYFxuICogICAtIGB0Zi5wYWQyZGBcbiAqICAgLSBgdGYucGFkM2RgXG4gKiAgIC0gYHRmLnBhZDRkYFxuICpcbiAqIGBgYGpzXG4gKiBjb25zdCB4ID0gdGYudGVuc29yMWQoWzEsIDIsIDMsIDRdKTtcbiAqIHgucGFkKFtbMSwgMl1dKS5wcmludCgpO1xuICogYGBgXG4gKiBAcGFyYW0geCBUaGUgdGVuc29yIHRvIHBhZC5cbiAqIEBwYXJhbSBwYWRkaW5ncyBBbiBhcnJheSBvZiBsZW5ndGggYFJgICh0aGUgcmFuayBvZiB0aGUgdGVuc29yKSwgd2hlcmVcbiAqIGVhY2ggZWxlbWVudCBpcyBhIGxlbmd0aC0yIHR1cGxlIG9mIGludHMgYFtwYWRCZWZvcmUsIHBhZEFmdGVyXWAsXG4gKiBzcGVjaWZ5aW5nIGhvdyBtdWNoIHRvIHBhZCBhbG9uZyBlYWNoIGRpbWVuc2lvbiBvZiB0aGUgdGVuc29yLlxuICogQHBhcmFtIGNvbnN0YW50VmFsdWUgVGhlIHBhZCB2YWx1ZSB0byB1c2UuIERlZmF1bHRzIHRvIDAuXG4gKlxuICogQGRvYyB7aGVhZGluZzogJ1RlbnNvcnMnLCBzdWJoZWFkaW5nOiAnVHJhbnNmb3JtYXRpb25zJ31cbiAqL1xuZnVuY3Rpb24gcGFkXzxUIGV4dGVuZHMgVGVuc29yPihcbiAgICB4OiBUfFRlbnNvckxpa2UsIHBhZGRpbmdzOiBBcnJheTxbbnVtYmVyLCBudW1iZXJdPiwgY29uc3RhbnRWYWx1ZSA9IDApOiBUIHtcbiAgY29uc3QgJHggPSBjb252ZXJ0VG9UZW5zb3IoeCwgJ3gnLCAncGFkJyk7XG4gIGlmICgkeC5yYW5rID09PSAwKSB7XG4gICAgdGhyb3cgbmV3IEVycm9yKCdwYWQoc2NhbGFyKSBpcyBub3QgZGVmaW5lZC4gUGFzcyBub24tc2NhbGFyIHRvIHBhZCcpO1xuICB9XG5cbiAgY29uc3QgYXR0cnM6IFBhZFYyQXR0cnMgPSB7cGFkZGluZ3MsIGNvbnN0YW50VmFsdWV9O1xuICBjb25zdCBpbnB1dHM6IFBhZFYySW5wdXRzID0ge3g6ICR4fTtcbiAgcmV0dXJuIEVOR0lORS5ydW5LZXJuZWwoXG4gICAgICBQYWRWMiwgaW5wdXRzIGFzIHVua25vd24gYXMgTmFtZWRUZW5zb3JNYXAsXG4gICAgICBhdHRycyBhcyB1bmtub3duIGFzIE5hbWVkQXR0ck1hcCk7XG59XG5cbmV4cG9ydCBjb25zdCBwYWQgPSBvcCh7cGFkX30pO1xuIl19","/**\n * @license\n * Copyright 2018 Google LLC. All Rights Reserved.\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n * =============================================================================\n */\nimport { convertToTensor } from '../tensor_util_env';\nimport * as util from '../util';\nimport { avgPool } from './avg_pool';\nimport { batchToSpaceND } from './batch_to_space_nd';\nimport * as conv_util from './conv_util';\nimport { maxPool } from './max_pool';\nimport { op } from './operation';\nimport { reshape } from './reshape';\nimport { spaceToBatchND } from './space_to_batch_nd';\n/**\n * Performs an N-D pooling operation\n *\n * @param input The input tensor, of rank 4 or rank 3 of shape\n * `[batch, height, width, inChannels]`. If rank 3, batch of 1 is assumed.\n * @param windowShape The filter size: `[filterHeight, filterWidth]`. If\n * `filterSize` is a single number, then `filterHeight == filterWidth`.\n * @param poolingType The type of pooling, either 'max' or 'avg'.\n * @param pad The type of padding algorithm:\n * - `same` and stride 1: output will be of same size as input,\n * regardless of filter size.\n * - `valid`: output will be smaller than input if filter is larger\n * than 1x1.\n * - For more info, see this guide:\n * [https://www.tensorflow.org/api_guides/python/nn#Convolution](\n * https://www.tensorflow.org/api_guides/python/nn#Convolution)\n * @param dilations The dilation rates: `[dilationHeight, dilationWidth]`\n * in which we sample input values across the height and width dimensions\n * in dilated pooling. Defaults to `[1, 1]`. If `dilationRate` is a single\n * number, then `dilationHeight == dilationWidth`. If it is greater than\n * 1, then all values of `strides` must be 1.\n * @param strides The strides of the pooling: `[strideHeight, strideWidth]`. If\n * `strides` is a single number, then `strideHeight == strideWidth`.\n * @param dimRoundingMode A string from: 'ceil', 'round', 'floor'. If none is\n * provided, it will default to truncate.\n *\n * @doc {heading: 'Operations', subheading: 'Convolution'}\n */\nfunction pool_(input, windowShape, poolingType, pad, dilations, strides, dimRoundingMode) {\n if (dilations == null) {\n dilations = [1, 1];\n }\n if (strides == null) {\n strides = 1;\n }\n if (pad === 0) {\n pad = 'valid';\n }\n const $x = convertToTensor(input, 'x', 'maxPool');\n let x4D = $x;\n let reshapedTo4D = false;\n if ($x.rank === 3) {\n reshapedTo4D = true;\n x4D = reshape($x, [1, $x.shape[0], $x.shape[1], $x.shape[2]]);\n }\n util.assert(conv_util.eitherStridesOrDilationsAreOne(strides, dilations), () => 'Error in pool: Either strides or dilations must be 1. ' +\n `Got strides ${strides} and dilations '${dilations}'`);\n const convInfo = conv_util.computePool2DInfo(x4D.shape, windowShape, strides, dilations, pad);\n const dilation = [convInfo.dilationHeight, convInfo.dilationWidth];\n // The following implementation does batchToSpace(pool(spaceToBatch(x)))\n // whenever dilation > 1 since the TF kernels do not support dilation > 1.\n // tslint:disable-next-line:max-line-length\n // https://github.com/tensorflow/tensorflow/blob/50f6bb67dc98c9b74630b6047aae7a4f8a40fd02/tensorflow/python/ops/nn_ops.py#L1037\n let basePadding;\n if (pad === 'same') {\n basePadding = withSpaceToBatchBasePaddings([convInfo.filterHeight, convInfo.filterWidth], dilation);\n }\n else {\n basePadding = [[0, 0], [0, 0]];\n }\n const isDilationOne = dilation[0] === 1 && dilation[1] === 1;\n const [adjustedPadding, adjustedCrops] = requiredSpaceToBatchPaddings([convInfo.inHeight, convInfo.inWidth], dilation, basePadding);\n const convertedPad = isDilationOne ? pad : 'valid';\n const convertedX = isDilationOne ? x4D : spaceToBatchND(x4D, dilation, adjustedPadding);\n const forwardOp = poolingType === 'avg' ?\n () => avgPool(convertedX, windowShape, strides, convertedPad, dimRoundingMode) :\n () => maxPool(convertedX, windowShape, strides, convertedPad, dimRoundingMode);\n const y = forwardOp();\n const res = isDilationOne ? y : batchToSpaceND(y, dilation, adjustedCrops);\n if (reshapedTo4D) {\n return reshape(res, [res.shape[1], res.shape[2], res.shape[3]]);\n }\n return res;\n}\n// Helper function to compute crops and paddings for pool with dilation > 1.\n// tslint:disable-next-line:max-line-length\n// https://github.com/tensorflow/tensorflow/blob/50f6bb67dc98c9b74630b6047aae7a4f8a40fd02/tensorflow/python/ops/array_ops.py#L2184\nfunction requiredSpaceToBatchPaddings(inputShape, blockShape, basePadding) {\n const padStart = basePadding.map(b => b[0]);\n const origPadEnd = basePadding.map(b => b[1]);\n const fullInputShape = inputShape.concat(padStart, origPadEnd);\n const padEndExtra = blockShape.map((b, i) => (b - fullInputShape[i] % b) % b);\n const padEnd = origPadEnd.map((s, i) => s + padEndExtra[i]);\n const paddings = blockShape.map((_, i) => [padStart[i], padEnd[i]]);\n const crops = blockShape.map((_, i) => [0, padEndExtra[i]]);\n return [paddings, crops];\n}\n// Helper function to compute base paddings for pool with dilation > 1.\n// tslint:disable-next-line:max-line-length\n// https://github.com/tensorflow/tensorflow/blob/50f6bb67dc98c9b74630b6047aae7a4f8a40fd02/tensorflow/python/ops/nn_ops.py#L524\nfunction withSpaceToBatchBasePaddings(filterShape, dilation) {\n // Spatial dimensions of the filters and the upsampled filters in which we\n // introduce (rate - 1) zeros between consecutive filter values.\n const dilatedFilterShape = filterShape.map((s, i) => {\n return s + (s - 1) * (dilation[i] - 1);\n });\n const padExtraShape = dilatedFilterShape.map(s => s - 1);\n // When padding is odd, we pad more at end, following the same\n // convention as conv2d.\n const padExtraStart = padExtraShape.map(s => Math.floor(s / 2));\n const padExtraEnd = padExtraShape.map((s, i) => s - padExtraStart[i]);\n return padExtraShape.map((_, i) => {\n return [padExtraStart[i], padExtraEnd[i]];\n });\n}\nexport const pool = op({ pool_ });\n//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicG9vbC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uLy4uL3RmanMtY29yZS9zcmMvb3BzL3Bvb2wudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUE7Ozs7Ozs7Ozs7Ozs7OztHQWVHO0FBR0gsT0FBTyxFQUFDLGVBQWUsRUFBQyxNQUFNLG9CQUFvQixDQUFDO0FBRW5ELE9BQU8sS0FBSyxJQUFJLE1BQU0sU0FBUyxDQUFDO0FBRWhDLE9BQU8sRUFBQyxPQUFPLEVBQUMsTUFBTSxZQUFZLENBQUM7QUFDbkMsT0FBTyxFQUFDLGNBQWMsRUFBQyxNQUFNLHFCQUFxQixDQUFDO0FBQ25ELE9BQU8sS0FBSyxTQUFTLE1BQU0sYUFBYSxDQUFDO0FBQ3pDLE9BQU8sRUFBQyxPQUFPLEVBQUMsTUFBTSxZQUFZLENBQUM7QUFDbkMsT0FBTyxFQUFDLEVBQUUsRUFBQyxNQUFNLGFBQWEsQ0FBQztBQUMvQixPQUFPLEVBQUMsT0FBTyxFQUFDLE1BQU0sV0FBVyxDQUFDO0FBQ2xDLE9BQU8sRUFBQyxjQUFjLEVBQUMsTUFBTSxxQkFBcUIsQ0FBQztBQUVuRDs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7O0dBMkJHO0FBQ0gsU0FBUyxLQUFLLENBQ1YsS0FBbUIsRUFBRSxXQUFvQyxFQUN6RCxXQUF3QixFQUN4QixHQUFvRCxFQUNwRCxTQUFtQyxFQUFFLE9BQWlDLEVBQ3RFLGVBQXdDO0lBQzFDLElBQUksU0FBUyxJQUFJLElBQUksRUFBRTtRQUNyQixTQUFTLEdBQUcsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUM7S0FDcEI7SUFDRCxJQUFJLE9BQU8sSUFBSSxJQUFJLEVBQUU7UUFDbkIsT0FBTyxHQUFHLENBQUMsQ0FBQztLQUNiO0lBQ0QsSUFBSSxHQUFHLEtBQUssQ0FBQyxFQUFFO1FBQ2IsR0FBRyxHQUFHLE9BQU8sQ0FBQztLQUNmO0lBRUQsTUFBTSxFQUFFLEdBQUcsZUFBZSxDQUFDLEtBQUssRUFBRSxHQUFHLEVB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NUMsQ0FBQyxDQUFDLENBQUM7QUFDTCxDQUFDO0FBRUQsTUFBTSxDQUFDLE1BQU0sSUFBSSxHQUFHLEVBQUUsQ0FBQyxFQUFDLEtBQUssRUFBQyxDQUFDLENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyIvKipcbiAqIEBsaWNlbnNlXG4gKiBDb3B5cmlnaHQgMjAxOCBHb29nbGUgTExDLiBBbGwgUmlnaHRzIFJlc2VydmVkLlxuICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlIFwiTGljZW5zZVwiKTtcbiAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS5cbiAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdFxuICpcbiAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMFxuICpcbiAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmVcbiAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuIFwiQVMgSVNcIiBCQVNJUyxcbiAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLlxuICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZFxuICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuXG4gKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuICovXG5cbmltcG9ydCB7VGVuc29yM0QsIFRlbnNvcjREfSBmcm9tICcuLi90ZW5zb3InO1xuaW1wb3J0IHtjb252ZXJ0VG9UZW5zb3J9IGZyb20gJy4uL3RlbnNvcl91dGlsX2Vudic7XG5pbXBvcnQge1RlbnNvckxpa2V9IGZyb20gJy4uL3R5cGVzJztcbmltcG9ydCAqIGFzIHV0aWwgZnJvbSAnLi4vdXRpbCc7XG5cbmltcG9ydCB7YXZnUG9vbH0gZnJvbSAnLi9hdmdfcG9vbCc7XG5pbXBvcnQge2JhdGNoVG9TcGFjZU5EfSBmcm9tICcuL2JhdGNoX3RvX3NwYWNlX25kJztcbmltcG9ydCAqIGFzIGNvbnZfdXRpbCBmcm9tICcuL2NvbnZfdXRpbCc7XG5pbXBvcnQge21heFBvb2x9IGZyb20gJy4vbWF4X3Bvb2wnO1xuaW1wb3J0IHtvcH0gZnJvbSAnLi9vcGVyYXRpb24nO1xuaW1wb3J0IHtyZXNoYXBlfSBmcm9tICcuL3Jlc2hhcGUnO1xuaW1wb3J0IHtzcGFjZVRvQmF0Y2hORH0gZnJvbSAnLi9zcGFjZV90b19iYXRjaF9uZCc7XG5cbi8qKlxuICogUGVyZm9ybXMgYW4gTi1EIHBvb2xpbmcgb3BlcmF0aW9uXG4gKlxuICogQHBhcmFtIGlucHV0IFRoZSBpbnB1dCB0ZW5zb3IsIG9mIHJhbmsgNCBvciByYW5rIDMgb2Ygc2hhcGVcbiAqICAgICBgW2JhdGNoLCBoZWlnaHQsIHdpZHRoLCBpbkNoYW5uZWxzXWAuIElmIHJhbmsgMywgYmF0Y2ggb2YgMSBpcyBhc3N1bWVkLlxuICogQHBhcmFtIHdpbmRvd1NoYXBlIFRoZSBmaWx0ZXIgc2l6ZTogYFtmaWx0ZXJIZWlnaHQsIGZpbHRlcldpZHRoXWAuIElmXG4gKiAgICAgYGZpbHRlclNpemVgIGlzIGEgc2luZ2xlIG51bWJlciwgdGhlbiBgZmlsdGVySGVpZ2h0ID09IGZpbHRlcldpZHRoYC5cbiAqIEBwYXJhbSBwb29saW5nVHlwZSBUaGUgdHlwZSBvZiBwb29saW5nLCBlaXRoZXIgJ21heCcgb3IgJ2F2ZycuXG4gKiBAcGFyYW0gcGFkIFRoZSB0eXBlIG9mIHBhZGRpbmcgYWxnb3JpdGhtOlxuICogICAgLSBgc2FtZWAgYW5kIHN0cmlkZSAxOiBvdXRwdXQgd2lsbCBiZSBvZiBzYW1lIHNpemUgYXMgaW5wdXQsXG4gKiAgICAgICByZWdhcmRsZXNzIG9mIGZpbHRlciBzaXplLlxuICogICAgLSBgdmFsaWRgOiBvdXRwdXQgd2lsbCBiZSBzbWFsbGVyIHRoYW4gaW5wdXQgaWYgZmlsdGVyIGlzIGxhcmdlclxuICogICAgICAgdGhhbiAxeDEuXG4gKiAgICAtIEZvciBtb3JlIGluZm8sIHNlZSB0aGlzIGd1aWRlOlxuICogICAgIFtodHRwczovL3d3dy50ZW5zb3JmbG93Lm9yZy9hcGlfZ3VpZGVzL3B5dGhvbi9ubiNDb252b2x1dGlvbl0oXG4gKiAgICAgICAgIGh0dHBzOi8vd3d3LnRlbnNvcmZsb3cub3JnL2FwaV9ndWlkZXMvcHl0aG9uL25uI0NvbnZvbHV0aW9uKVxuICogQHBhcmFtIGRpbGF0aW9ucyBUaGUgZGlsYXRpb24gcmF0ZXM6IGBbZGlsYXRpb25IZWlnaHQsIGRpbGF0aW9uV2lkdGhdYFxuICogICAgIGluIHdoaWNoIHdlIHNhbXBsZSBpbnB1dCB2YWx1ZXMgYWNyb3NzIHRoZSBoZWlnaHQgYW5kIHdpZHRoIGRpbWVuc2lvbnNcbiAqICAgICBpbiBkaWxhdGVkIHBvb2xpbmcuIERlZmF1bHRzIHRvIGBbMSwgMV1gLiBJZiBgZGlsYXRpb25SYXRlYCBpcyBhIHNpbmdsZVxuICogICAgIG51bWJlciwgdGhlbiBgZGlsYXRpb25IZWlnaHQgPT0gZGlsYXRpb25XaWR0aGAuIElmIGl0IGlzIGdyZWF0ZXIgdGhhblxuICogICAgIDEsIHRoZW4gYWxsIHZhbHVlcyBvZiBgc3RyaWRlc2AgbXVzdCBiZSAxLlxuICogQHBhcmFtIHN0cmlkZXMgVGhlIHN0cmlkZXMgb2YgdGhlIHBvb2xpbmc6IGBbc3RyaWRlSGVpZ2h0LCBzdHJpZGVXaWR0aF1gLiBJZlxuICogICAgIGBzdHJpZGVzYCBpcyBhIHNpbmdsZSBudW1iZXIsIHRoZW4gYHN0cmlkZUhlaWdodCA9PSBzdHJpZGVXaWR0aGAuXG4gKiBAcGFyYW0gZGltUm91bmRpbmdNb2RlIEEgc3RyaW5nIGZyb206ICdjZWlsJywgJ3JvdW5kJywgJ2Zsb29yJy4gSWYgbm9uZSBpc1xuICogICAgIHByb3ZpZGVkLCBpdCB3aWxsIGRlZmF1bHQgdG8gdHJ1bmNhdGUuXG4gKlxuICogQGRvYyB7aGVhZGluZzogJ09wZXJhdGlvbnMnLCBzdWJoZWFkaW5nOiAnQ29udm9sdXRpb24nfVxuICovXG5mdW5jdGlvbiBwb29sXzxUIGV4dGVuZHMgVGVuc29yM0R8VGVuc29yNEQ+KFxuICAgIGlucHV0OiBUfFRlbnNvckxpa2UsIHdpbmRvd1NoYXBlOiBbbnVtYmVyLCBudW1iZXJdfG51bWJlcixcbiAgICBwb29saW5nVHlwZTogJ2F2Zyd8J21heCcsXG4gICAgcGFkOiAndmFsaWQnfCdzYW1lJ3xudW1iZXJ8Y29udl91dGlsLkV4cGxpY2l0UGFkZGluZyxcbiAgICBkaWxhdGlvbnM/OiBbbnVtYmVyLCBudW1iZXJdfG51bWJlciwgc3RyaWRlcz86IFtudW1iZXIsIG51bWJlcl18bnVtYmVyLFxuICAgIGRpbVJvdW5kaW5nTW9kZT86ICdmbG9vcid8J3JvdW5kJ3wnY2VpbCcpIHtcbiAgaWYgKGRpbGF0aW9ucyA9PSBudWxsKSB7XG4gICAgZGlsYXRpb25zID0gWzEsIDFdO1xuICB9XG4gIGlmIChzdHJpZGVzID09IG51bGwpIHtcbiAgICBzdHJpZGVzID0gMTtcbiAgfVxuICBpZiAocGFkID09PSAwKSB7XG4gICAgcGFkID0gJ3ZhbGlkJztcbiAgfVxuXG4gIGNvbnN0ICR4ID0gY29udmVydFRvVGVuc29yKGlucHV0LCAneCcsICdtYXhQb29sJyk7XG4gIGxldCB4NEQgPSAkeCBhcyBUZW5zb3I0RDtcbiAgbGV0IHJlc2hhcGVkVG80RCA9IGZhbHNlO1xuXG4gIGlmICgkeC5yYW5rID09PSAzKSB7XG4gICAgcmVzaGFwZWRUbzREID0gdHJ1ZTtcbiAgICB4NEQgPSByZXNoYXBlKCR4LCBbMSwgJHguc2hhcGVbMF0sICR4LnNoYXBlWzFdLCAkeC5zaGFwZVsyXV0pO1xuICB9XG5cbiAgdXRpbC5hc3NlcnQoXG4gICAgICBjb252X3V0aWwuZWl0aGVyU3RyaWRlc09yRGlsYXRpb25zQXJlT25lKHN0cmlkZXMsIGRpbGF0aW9ucyksXG4gICAgICAoKSA9PiAnRXJyb3IgaW4gcG9vbDogRWl0aGVyIHN0cmlkZXMgb3IgZGlsYXRpb25zIG11c3QgYmUgMS4gJyArXG4gICAgICAgICAgYEdvdCBzdHJpZGVzICR7c3RyaWRlc30gYW5kIGRpbGF0aW9ucyAnJHtkaWxhdGlvbnN9J2ApO1xuXG4gIGNvbnN0IGNvbnZJbmZvID0gY29udl91dGlsLmNvbXB1dGVQb29sMkRJbmZvKFxuICAgICAgeDRELnNoYXBlLCB3aW5kb3dTaGFwZSwgc3RyaWRlcywgZGlsYXRpb25zLCBwYWQpO1xuICBjb25zdCBkaWxhdGlvbjogW251bWJlciwgbnVtYmVyXSA9XG4gICAgICBbY29udkluZm8uZGlsYXRpb25IZWlnaHQsIGNvbnZJbmZvLmRpbGF0aW9uV2lkdGhdO1xuXG4gIC8vIFRoZSBmb2xsb3dpbmcgaW1wbGVtZW50YXRpb24gZG9lcyBiYXRjaFRvU3BhY2UocG9vbChzcGFjZVRvQmF0Y2goeCkpKVxuICAvLyB3aGVuZXZlciBkaWxhdGlvbiA+IDEgc2luY2UgdGhlIFRGIGtlcm5lbHMgZG8gbm90IHN1cHBvcnQgZGlsYXRpb24gPiAxLlxuICAvLyB0c2xpbnQ6ZGlzYWJsZS1uZXh0LWxpbmU6bWF4LWxpbmUtbGVuZ3RoXG4gIC8vIGh0dHBzOi8vZ2l0aHViLmNvbS90ZW5zb3JmbG93L3RlbnNvcmZsb3cvYmxvYi81MGY2YmI2N2RjOThjOWI3NDYzMGI2MDQ3YWFlN2E0ZjhhNDBmZDAyL3RlbnNvcmZsb3cvcHl0aG9uL29wcy9ubl9vcHMucHkjTDEwMzdcblxuICBsZXQgYmFzZVBhZGRpbmc6IG51bWJlcltdW107XG4gIGlmIChwYWQgPT09ICdzYW1lJykge1xuICAgIGJhc2VQYWRkaW5nID0gd2l0aFNwYWNlVG9CYXRjaEJhc2VQYWRkaW5ncyhcbiAgICAgICAgW2NvbnZJbmZvLmZpbHRlckhlaWdodCwgY29udkluZm8uZmlsdGVyV2lkdGhdLCBkaWxhdGlvbik7XG4gIH0gZWxzZSB7XG4gICAgYmFzZVBhZGRpbmcgPSBbWzAsIDBdLCBbMCwgMF1dO1xuICB9XG5cbiAgY29uc3QgaXNEaWxhdGlvbk9uZSA9IGRpbGF0aW9uWzBdID09PSAxICYmIGRpbGF0aW9uWzFdID09PSAxO1xuICBjb25zdCBbYWRqdXN0ZWRQYWRkaW5nLCBhZGp1c3RlZENyb3BzXSA9IHJlcXVpcmVkU3BhY2VUb0JhdGNoUGFkZGluZ3MoXG4gICAgICBbY29udkluZm8uaW5IZWlnaHQsIGNvbnZJbmZvLmluV2lkdGhdLCBkaWxhdGlvbiwgYmFzZVBhZGRpbmcpO1xuICBjb25zdCBjb252ZXJ0ZWRQYWQgPSBpc0RpbGF0aW9uT25lID8gcGFkIDogJ3ZhbGlkJztcbiAgY29uc3QgY29udmVydGVkWCA9XG4gICAgICBpc0RpbGF0aW9uT25lID8geDREIDogc3BhY2VUb0JhdGNoTkQoeDRELCBkaWxhdGlvbiwgYWRqdXN0ZWRQYWRkaW5nKTtcblxuICBjb25zdCBmb3J3YXJkT3AgPSBwb29saW5nVHlwZSA9PT0gJ2F2ZycgP1xuICAgICAgKCkgPT4gYXZnUG9vbChjb252ZXJ0ZWRYLCB3aW5kb3dTaGFwZSwgc3RyaWRlcywgY29udmVydGVkUGFkLFxuICAgICAgICAgICAgICAgICAgICBkaW1Sb3VuZGluZ01vZGUpIDpcbiAgICAgICgpID0+IG1heFBvb2woY29udmVydGVkWCwgd2luZG93U2hhcGUsIHN0cmlkZXMsIGNvbnZlcnRlZFBhZCxcbiAgICAgICAgICAgICAgICAgICAgZGltUm91bmRpbmdNb2RlKTtcbiAgY29uc3QgeSA9IGZvcndhcmRPcCgpO1xuXG4gIGNvbnN0IHJlcyA9IGlzRGlsYXRpb25PbmUgPyB5IDogYmF0Y2hUb1NwYWNlTkQoeSwgZGlsYXRpb24sIGFkanVzdGVkQ3JvcHMpO1xuXG4gIGlmIChyZXNoYXBlZFRvNEQpIHtcbiAgICByZXR1cm4gcmVzaGFwZShyZXMsIFtyZXMuc2hhcGVbMV0sIHJlcy5zaGFwZVsyXSwgcmVzLnNoYXBlWzNdXSkgYXMgVDtcbiAgfVxuXG4gIHJldHVybiByZXMgYXMgVDtcbn1cblxuLy8gSGVscGVyIGZ1bmN0aW9uIHRvIGNvbXB1dGUgY3JvcHMgYW5kIHBhZGRpbmdzIGZvciBwb29sIHdpdGggZGlsYXRpb24gPiAxLlxuLy8gdHNsaW50OmRpc2FibGUtbmV4dC1saW5lOm1heC1saW5lLWxlbmd0aFxuLy8gaHR0cHM6Ly9naXRodWIuY29tL3RlbnNvcmZsb3cvdGVuc29yZmxvdy9ibG9iLzUwZjZiYjY3ZGM5OGM5Yjc0NjMwYjYwNDdhYWU3YTRmOGE0MGZkMDIvdGVuc29yZmxvdy9weXRob24vb3BzL2FycmF5X29wcy5weSNMMjE4NFxuZnVuY3Rpb24gcmVxdWlyZWRTcGFjZVRvQmF0Y2hQYWRkaW5ncyhcbiAgICBpbnB1dFNoYXBlOiBbbnVtYmVyLCBudW1iZXJdLCBibG9ja1NoYXBlOiBbbnVtYmVyLCBudW1iZXJdLFxuICAgIGJhc2VQYWRkaW5nOiBudW1iZXJbXVtdKSB7XG4gIGNvbnN0IHBhZFN0YXJ0ID0gYmFzZVBhZGRpbmcubWFwKGIgPT4gYlswXSk7XG4gIGNvbnN0IG9yaWdQYWRFbmQgPSBiYXNlUGFkZGluZy5tYXAoYiA9PiBiWzFdKTtcbiAgY29uc3QgZnVsbElucHV0U2hhcGUgPSBpbnB1dFNoYXBlLmNvbmNhdChwYWRTdGFydCwgb3JpZ1BhZEVuZCk7XG4gIGNvbnN0IHBhZEVuZEV4dHJhID0gYmxvY2tTaGFwZS5tYXAoKGIsIGkpID0+IChiIC0gZnVsbElucHV0U2hhcGVbaV0gJSBiKSAlIGIpO1xuICBjb25zdCBwYWRFbmQgPSBvcmlnUGFkRW5kLm1hcCgocywgaSkgPT4gcyArIHBhZEVuZEV4dHJhW2ldKTtcbiAgY29uc3QgcGFkZGluZ3MgPSBibG9ja1NoYXBlLm1hcCgoXywgaSkgPT4gW3BhZFN0YXJ0W2ldLCBwYWRFbmRbaV1dKTtcbiAgY29uc3QgY3JvcHMgPSBibG9ja1NoYXBlLm1hcCgoXywgaSkgPT4gWzAsIHBhZEVuZEV4dHJhW2ldXSk7XG4gIHJldHVybiBbcGFkZGluZ3MsIGNyb3BzXTtcbn1cblxuLy8gSGVscGVyIGZ1bmN0aW9uIHRvIGNvbXB1dGUgYmFzZSBwYWRkaW5ncyBmb3IgcG9vbCB3aXRoIGRpbGF0aW9uID4gMS5cbi8vIHRzbGludDpkaXNhYmxlLW5leHQtbGluZTptYXgtbGluZS1sZW5ndGhcbi8vIGh0dHBzOi8vZ2l0aHViLmNvbS90ZW5zb3JmbG93L3RlbnNvcmZsb3cvYmxvYi81MGY2YmI2N2RjOThjOWI3NDYzMGI2MDQ3YWFlN2E0ZjhhNDBmZDAyL3RlbnNvcmZsb3cvcHl0aG9uL29wcy9ubl9vcHMucHkjTDUyNFxuZnVuY3Rpb24gd2l0aFNwYWNlVG9CYXRjaEJhc2VQYWRkaW5ncyhcbiAgICBmaWx0ZXJTaGFwZTogW251bWJlciwgbnVtYmVyXSwgZGlsYXRpb246IFtudW1iZXIsIG51bWJlcl0pIHtcbiAgLy8gU3BhdGlhbCBkaW1lbnNpb25zIG9mIHRoZSBmaWx0ZXJzIGFuZCB0aGUgdXBzYW1wbGVkIGZpbHRlcnMgaW4gd2hpY2ggd2VcbiAgLy8gaW50cm9kdWNlIChyYXRlIC0gMSkgemVyb3MgYmV0d2VlbiBjb25zZWN1dGl2ZSBmaWx0ZXIgdmFsdWVzLlxuICBjb25zdCBkaWxhdGVkRmlsdGVyU2hhcGUgPSBmaWx0ZXJTaGFwZS5tYXAoKHMsIGkpID0+IHtcbiAgICByZXR1cm4gcyArIChzIC0gMSkgKiAoZGlsYXRpb25baV0gLSAxKTtcbiAgfSk7XG4gIGNvbnN0IHBhZEV4dHJhU2hhcGUgPSBkaWxhdGVkRmlsdGVyU2hhcGUubWFwKHMgPT4gcyAtIDEpO1xuXG4gIC8vIFdoZW4gcGFkZGluZyBpcyBvZGQsIHdlIHBhZCBtb3JlIGF0IGVuZCwgZm9sbG93aW5nIHRoZSBzYW1lXG4gIC8vIGNvbnZlbnRpb24gYXMgY29udjJkLlxuICBjb25zdCBwYWRFeHRyYVN0YXJ0ID0gcGFkRXh0cmFTaGFwZS5tYXAocyA9PiBNYXRoLmZsb29yKHMgLyAyKSk7XG4gIGNvbnN0IHBhZEV4dHJhRW5kID0gcGFkRXh0cmFTaGFwZS5tYXAoKHMsIGkpID0+IHMgLSBwYWRFeHRyYVN0YXJ0W2ldKTtcbiAgcmV0dXJuIHBhZEV4dHJhU2hhcGUubWFwKChfLCBpKSA9PiB7XG4gICAgcmV0dXJuIFtwYWRFeHRyYVN0YXJ0W2ldLCBwYWRFeHRyYUVuZFtpXV07XG4gIH0pO1xufVxuXG5leHBvcnQgY29uc3QgcG9vbCA9IG9wKHtwb29sX30pO1xuIl19","/**\n * @license\n * Copyright 2020 Google LLC. All Rights Reserved.\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n * =============================================================================\n */\nimport { ENGINE } from '../engine';\nimport { Pow } from '../kernel_names';\nimport { makeTypesMatch } from '../tensor_util';\nimport { convertToTensor } from '../tensor_util_env';\nimport { op } from './operation';\n/**\n * Computes the power of one `tf.Tensor` to another. Supports broadcasting.\n *\n * Given a `tf.Tensor` x and a `tf.Tensor` y, this operation computes x^y for\n * corresponding elements in x and y. The result's dtype will be the upcasted\n * type of the `base` and `exp` dtypes.\n *\n * ```js\n * const a = tf.tensor([[2, 3], [4, 5]])\n * const b = tf.tensor([[1, 2], [3, 0]]).toInt();\n *\n * a.pow(b).print(); // or tf.pow(a, b)\n * ```\n *\n * ```js\n * const a = tf.tensor([[1, 2], [3, 4]])\n * const b = tf.tensor(2).toInt();\n *\n * a.pow(b).print(); // or tf.pow(a, b)\n * ```\n * We also expose `powStrict` which has the same signature as this op and\n * asserts that `base` and `exp` are the same shape (does not broadcast).\n *\n * @param base The base `tf.Tensor` to pow element-wise.\n * @param exp The exponent `tf.Tensor` to pow element-wise.\n *\n * @doc {heading: 'Operations', subheading: 'Arithmetic'}\n */\nfunction pow_(base, exp) {\n let $base = convertToTensor(base, 'base', 'pow');\n let $exp = convertToTensor(exp, 'exp', 'pow');\n [$base, $exp] = makeTypesMatch($base, $exp);\n const inputs = { a: $base, b: $exp };\n return ENGINE.runKernel(Pow, inputs);\n}\nexport const pow = op({ pow_ });\n//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicG93LmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vLi4vdGZqcy1jb3JlL3NyYy9vcHMvcG93LnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBOzs7Ozs7Ozs7Ozs7Ozs7R0FlRztBQUNILE9BQU8sRUFBQyxNQUFNLEVBQUMsTUFBTSxXQUFXLENBQUM7QUFDakMsT0FBTyxFQUFDLEdBQUcsRUFBWSxNQUFNLGlCQUFpQixDQUFDO0FBRy9DLE9BQU8sRUFBQyxjQUFjLEVBQUMsTUFBTSxnQkFBZ0IsQ0FBQztBQUM5QyxPQUFPLEVBQUMsZUFBZSxFQUFDLE1BQU0sb0JBQW9CLENBQUM7QUFHbkQsT0FBTyxFQUFDLEVBQUUsRUFBQyxNQUFNLGFBQWEsQ0FBQztBQUUvQjs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7O0dBMkJHO0FBQ0gsU0FBUyxJQUFJLENBQ1QsSUFBdUIsRUFBRSxHQUFzQjtJQUNqRCxJQUFJLEtBQUssR0FBRyxlQUFlLENBQUMsSUFBSSxFQUFFLE1BQU0sRUFBRSxLQUFLLENBQUMsQ0FBQztJQUNqRCxJQUFJLElBQUksR0FBRyxlQUFlLENBQUMsR0FBRyxFQUFFLEtBQUssRUFBRSxLQUFLLENBQUMsQ0FBQztJQUM5QyxDQUFDLEtBQUssRUFBRSxJQUFJLENBQUMsR0FBRyxjQUFjLENBQUMsS0FBSyxFQUFFLElBQUksQ0FBQyxDQUFDO0lBRTVDLE1BQU0sTUFBTSxHQUFjLEVBQUMsQ0FBQyxFQUFFLEtBQUssRUFBRSxDQUFDLEVBQUUsSUFBSSxFQUFDLENBQUM7SUFFOUMsT0FBTyxNQUFNLENBQUMsU0FBUyxDQUFDLEdBQUcsRUFBRSxNQUE4QixDQUFDLENBQUM7QUFDL0QsQ0FBQztBQUVELE1BQU0sQ0FBQyxNQUFNLEdBQUcsR0FBRyxFQUFFLENBQUMsRUFBQyxJQUFJLEVBQUMsQ0FBQyxDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiLyoqXG4gKiBAbGljZW5zZVxuICogQ29weXJpZ2h0IDIwMjAgR29vZ2xlIExMQy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC5cbiAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSBcIkxpY2Vuc2VcIik7XG4gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuXG4gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXRcbiAqXG4gKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjBcbiAqXG4gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlXG4gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiBcIkFTIElTXCIgQkFTSVMsXG4gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC5cbiAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmRcbiAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLlxuICogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbiAqL1xuaW1wb3J0IHtFTkdJTkV9IGZyb20gJy4uL2VuZ2luZSc7XG5pbXBvcnQge1BvdywgUG93SW5wdXRzfSBmcm9tICcuLi9rZXJuZWxfbmFtZXMnO1xuaW1wb3J0IHtUZW5zb3J9IGZyb20gJy4uL3RlbnNvcic7XG5pbXBvcnQge05hbWVkVGVuc29yTWFwfSBmcm9tICcuLi90ZW5zb3JfdHlwZXMnO1xuaW1wb3J0IHttYWtlVHlwZXNNYXRjaH0gZnJvbSAnLi4vdGVuc29yX3V0aWwnO1xuaW1wb3J0IHtjb252ZXJ0VG9UZW5zb3J9IGZyb20gJy4uL3RlbnNvcl91dGlsX2Vudic7XG5pbXBvcnQge1RlbnNvckxpa2V9IGZyb20gJy4uL3R5cGVzJztcblxuaW1wb3J0IHtvcH0gZnJvbSAnLi9vcGVyYXRpb24nO1xuXG4vKipcbiAqIENvbXB1dGVzIHRoZSBwb3dlciBvZiBvbmUgYHRmLlRlbnNvcmAgdG8gYW5vdGhlci4gU3VwcG9ydHMgYnJvYWRjYXN0aW5nLlxuICpcbiAqIEdpdmVuIGEgYHRmLlRlbnNvcmAgeCBhbmQgYSBgdGYuVGVuc29yYCB5LCB0aGlzIG9wZXJhdGlvbiBjb21wdXRlcyB4XnkgZm9yXG4gKiBjb3JyZXNwb25kaW5nIGVsZW1lbnRzIGluIHggYW5kIHkuIFRoZSByZXN1bHQncyBkdHlwZSB3aWxsIGJlIHRoZSB1cGNhc3RlZFxuICogdHlwZSBvZiB0aGUgYGJhc2VgIGFuZCBgZXhwYCBkdHlwZXMuXG4gKlxuICogYGBganNcbiAqIGNvbnN0IGEgPSB0Zi50ZW5zb3IoW1syLCAzXSwgWzQsIDVdXSlcbiAqIGNvbnN0IGIgPSB0Zi50ZW5zb3IoW1sxLCAyXSwgWzMsIDBdXSkudG9JbnQoKTtcbiAqXG4gKiBhLnBvdyhiKS5wcmludCgpOyAgLy8gb3IgdGYucG93KGEsIGIpXG4gKiBgYGBcbiAqXG4gKiBgYGBqc1xuICogY29uc3QgYSA9IHRmLnRlbnNvcihbWzEsIDJdLCBbMywgNF1dKVxuICogY29uc3QgYiA9IHRmLnRlbnNvcigyKS50b0ludCgpO1xuICpcbiAqIGEucG93KGIpLnByaW50KCk7ICAvLyBvciB0Zi5wb3coYSwgYilcbiAqIGBgYFxuICogV2UgYWxzbyBleHBvc2UgYHBvd1N0cmljdGAgd2hpY2ggaGFzIHRoZSBzYW1lIHNpZ25hdHVyZSBhcyB0aGlzIG9wIGFuZFxuICogYXNzZXJ0cyB0aGF0IGBiYXNlYCBhbmQgYGV4cGAgYXJlIHRoZSBzYW1lIHNoYXBlIChkb2VzIG5vdCBicm9hZGNhc3QpLlxuICpcbiAqIEBwYXJhbSBiYXNlIFRoZSBiYXNlIGB0Zi5UZW5zb3JgIHRvIHBvdyBlbGVtZW50LXdpc2UuXG4gKiBAcGFyYW0gZXhwIFRoZSBleHBvbmVudCBgdGYuVGVuc29yYCB0byBwb3cgZWxlbWVudC13aXNlLlxuICpcbiAqIEBkb2Mge2hlYWRpbmc6ICdPcGVyYXRpb25zJywgc3ViaGVhZGluZzogJ0FyaXRobWV0aWMnfVxuICovXG5mdW5jdGlvbiBwb3dfPFQgZXh0ZW5kcyBUZW5zb3I+KFxuICAgIGJhc2U6IFRlbnNvcnxUZW5zb3JMaWtlLCBleHA6IFRlbnNvcnxUZW5zb3JMaWtlKTogVCB7XG4gIGxldCAkYmFzZSA9IGNvbnZlcnRUb1RlbnNvcihiYXNlLCAnYmFzZScsICdwb3cnKTtcbiAgbGV0ICRleHAgPSBjb252ZXJ0VG9UZW5zb3IoZXhwLCAnZXhwJywgJ3BvdycpO1xuICBbJGJhc2UsICRleHBdID0gbWFrZVR5cGVzTWF0Y2goJGJhc2UsICRleHApO1xuXG4gIGNvbnN0IGlucHV0czogUG93SW5wdXRzID0ge2E6ICRiYXNlLCBiOiAkZXhwfTtcblxuICByZXR1cm4gRU5HSU5FLnJ1bktlcm5lbChQb3csIGlucHV0cyBhcyB7fSBhcyBOYW1lZFRlbnNvck1hcCk7XG59XG5cbmV4cG9ydCBjb25zdCBwb3cgPSBvcCh7cG93X30pO1xuIl19","/**\n * @license\n * Copyright 2020 Google LLC. All Rights Reserved.\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n * =============================================================================\n */\nimport { ENGINE } from '../engine';\nimport { Prelu } from '../kernel_names';\nimport { convertToTensor } from '../tensor_util_env';\nimport { op } from './operation';\n/**\n * Computes leaky rectified linear element-wise with parametric alphas.\n *\n * `x < 0 ? alpha * x : f(x) = x`\n *\n * ```js\n * const x = tf.tensor1d([-1, 2, -3, 4]);\n * const alpha = tf.scalar(0.1);\n *\n * x.prelu(alpha).print(); // or tf.prelu(x, alpha)\n * ```\n * @param x The input tensor.\n * @param alpha Scaling factor for negative values.\n *\n * @doc {heading: 'Operations', subheading: 'Basic math'}\n */\nfunction prelu_(x, alpha) {\n const $x = convertToTensor(x, 'x', 'prelu');\n const $alpha = convertToTensor(alpha, 'alpha', 'prelu');\n const inputs = { x: $x, alpha: $alpha };\n return ENGINE.runKernel(Prelu, inputs);\n}\nexport const prelu = op({ prelu_ });\n//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicHJlbHUuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi8uLi90ZmpzLWNvcmUvc3JjL29wcy9wcmVsdS50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQTs7Ozs7Ozs7Ozs7Ozs7O0dBZUc7QUFFSCxPQUFPLEVBQUMsTUFBTSxFQUFDLE1BQU0sV0FBVyxDQUFDO0FBQ2pDLE9BQU8sRUFBQyxLQUFLLEVBQWMsTUFBTSxpQkFBaUIsQ0FBQztBQUduRCxPQUFPLEVBQUMsZUFBZSxFQUFDLE1BQU0sb0JBQW9CLENBQUM7QUFHbkQsT0FBTyxFQUFDLEVBQUUsRUFBQyxNQUFNLGFBQWEsQ0FBQztBQUUvQjs7Ozs7Ozs7Ozs7Ozs7O0dBZUc7QUFDSCxTQUFTLE1BQU0sQ0FBbUIsQ0FBZSxFQUFFLEtBQW1CO0lBQ3BFLE1BQU0sRUFBRSxHQUFHLGVBQWUsQ0FBQyxDQUFDLEVBQUUsR0FBRyxFQUFFLE9BQU8sQ0FBQyxDQUFDO0lBQzVDLE1BQU0sTUFBTSxHQUFHLGVBQWUsQ0FBQyxLQUFLLEVBQUUsT0FBTyxFQUFFLE9BQU8sQ0FBQyxDQUFDO0lBRXhELE1BQU0sTUFBTSxHQUFnQixFQUFDLENBQUMsRUFBRSxFQUFFLEVBQUUsS0FBSyxFQUFFLE1BQU0sRUFBQyxDQUFDO0lBQ25ELE9BQU8sTUFBTSxDQUFDLFNBQVMsQ0FBQyxLQUFLLEVBQUUsTUFBOEIsQ0FBQyxDQUFDO0FBQ2pFLENBQUM7QUFFRCxNQUFNLENBQUMsTUFBTSxLQUFLLEdBQUcsRUFBRSxDQUFDLEVBQUMsTUFBTSxFQUFDLENBQUMsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbIi8qKlxuICogQGxpY2Vuc2VcbiAqIENvcHlyaWdodCAyMDIwIEdvb2dsZSBMTEMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuXG4gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgXCJMaWNlbnNlXCIpO1xuICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLlxuICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0XG4gKlxuICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wXG4gKlxuICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZVxuICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gXCJBUyBJU1wiIEJBU0lTLFxuICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuXG4gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kXG4gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS5cbiAqID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4gKi9cblxuaW1wb3J0IHtFTkdJTkV9IGZyb20gJy4uL2VuZ2luZSc7XG5pbXBvcnQge1ByZWx1LCBQcmVsdUlucHV0c30gZnJvbSAnLi4va2VybmVsX25hbWVzJztcbmltcG9ydCB7VGVuc29yfSBmcm9tICcuLi90ZW5zb3InO1xuaW1wb3J0IHtOYW1lZFRlbnNvck1hcH0gZnJvbSAnLi4vdGVuc29yX3R5cGVzJztcbmltcG9ydCB7Y29udmVydFRvVGVuc29yfSBmcm9tICcuLi90ZW5zb3JfdXRpbF9lbnYnO1xuaW1wb3J0IHtUZW5zb3JMaWtlfSBmcm9tICcuLi90eXBlcyc7XG5cbmltcG9ydCB7b3B9IGZyb20gJy4vb3BlcmF0aW9uJztcblxuLyoqXG4gKiBDb21wdXRlcyBsZWFreSByZWN0aWZpZWQgbGluZWFyIGVsZW1lbnQtd2lzZSB3aXRoIHBhcmFtZXRyaWMgYWxwaGFzLlxuICpcbiAqIGB4IDwgMCA/IGFscGhhICogeCA6IGYoeCkgPSB4YFxuICpcbiAqIGBgYGpzXG4gKiBjb25zdCB4ID0gdGYudGVuc29yMWQoWy0xLCAyLCAtMywgNF0pO1xuICogY29uc3QgYWxwaGEgPSB0Zi5zY2FsYXIoMC4xKTtcbiAqXG4gKiB4LnByZWx1KGFscGhhKS5wcmludCgpOyAgLy8gb3IgdGYucHJlbHUoeCwgYWxwaGEpXG4gKiBgYGBcbiAqIEBwYXJhbSB4IFRoZSBpbnB1dCB0ZW5zb3IuXG4gKiBAcGFyYW0gYWxwaGEgU2NhbGluZyBmYWN0b3IgZm9yIG5lZ2F0aXZlIHZhbHVlcy5cbiAqXG4gKiBAZG9jIHtoZWFkaW5nOiAnT3BlcmF0aW9ucycsIHN1YmhlYWRpbmc6ICdCYXNpYyBtYXRoJ31cbiAqL1xuZnVuY3Rpb24gcHJlbHVfPFQgZXh0ZW5kcyBUZW5zb3I+KHg6IFR8VGVuc29yTGlrZSwgYWxwaGE6IFR8VGVuc29yTGlrZSk6IFQge1xuICBjb25zdCAkeCA9IGNvbnZlcnRUb1RlbnNvcih4LCAneCcsICdwcmVsdScpO1xuICBjb25zdCAkYWxwaGEgPSBjb252ZXJ0VG9UZW5zb3IoYWxwaGEsICdhbHBoYScsICdwcmVsdScpO1xuXG4gIGNvbnN0IGlucHV0czogUHJlbHVJbnB1dHMgPSB7eDogJHgsIGFscGhhOiAkYWxwaGF9O1xuICByZXR1cm4gRU5HSU5FLnJ1bktlcm5lbChQcmVsdSwgaW5wdXRzIGFzIHt9IGFzIE5hbWVkVGVuc29yTWFwKTtcbn1cblxuZXhwb3J0IGNvbnN0IHByZWx1ID0gb3Aoe3ByZWx1X30pO1xuIl19","/**\n * @license\n * Copyright 2020 Google Inc. All Rights Reserved.\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n * =============================================================================\n */\n/**\n * Prints information about the `tf.Tensor` including its data.\n *\n * ```js\n * const verbose = true;\n * tf.tensor2d([1, 2, 3, 4], [2, 2]).print(verbose);\n * ```\n * @param x The tensor to be printed.\n * @param verbose Whether to print verbose information about the ` Tensor`,\n * including dtype and size.\n *\n * @doc {heading: 'Tensors', subheading: 'Creation'}\n */\nexport function print(x, verbose = false) {\n console.log(x.toString(verbose));\n}\n//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicHJpbnQuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi8uLi90ZmpzLWNvcmUvc3JjL29wcy9wcmludC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQTs7Ozs7Ozs7Ozs7Ozs7O0dBZUc7QUFJSDs7Ozs7Ozs7Ozs7O0dBWUc7QUFDSCxNQUFNLFVBQVUsS0FBSyxDQUFtQixDQUFJLEVBQUUsT0FBTyxHQUFHLEtBQUs7SUFDM0QsT0FBTyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsUUFBUSxDQUFDLE9BQU8sQ0FBQyxDQUFDLENBQUM7QUFDbkMsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbIi8qKlxuICogQGxpY2Vuc2VcbiAqIENvcHlyaWdodCAyMDIwIEdvb2dsZSBJbmMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuXG4gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgXCJMaWNlbnNlXCIpO1xuICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLlxuICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0XG4gKlxuICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wXG4gKlxuICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZVxuICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gXCJBUyBJU1wiIEJBU0lTLFxuICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuXG4gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kXG4gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS5cbiAqID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4gKi9cblxuaW1wb3J0IHtUZW5zb3J9IGZyb20gJy4uL3RlbnNvcic7XG5cbi8qKlxuICogUHJpbnRzIGluZm9ybWF0aW9uIGFib3V0IHRoZSBgdGYuVGVuc29yYCBpbmNsdWRpbmcgaXRzIGRhdGEuXG4gKlxuICogYGBganNcbiAqIGNvbnN0IHZlcmJvc2UgPSB0cnVlO1xuICogdGYudGVuc29yMmQoWzEsIDIsIDMsIDRdLCBbMiwgMl0pLnByaW50KHZlcmJvc2UpO1xuICogYGBgXG4gKiBAcGFyYW0geCBUaGUgdGVuc29yIHRvIGJlIHByaW50ZWQuXG4gKiBAcGFyYW0gdmVyYm9zZSBXaGV0aGVyIHRvIHByaW50IHZlcmJvc2UgaW5mb3JtYXRpb24gYWJvdXQgdGhlIGAgVGVuc29yYCxcbiAqIGluY2x1ZGluZyBkdHlwZSBhbmQgc2l6ZS5cbiAqXG4gKiBAZG9jIHtoZWFkaW5nOiAnVGVuc29ycycsIHN1YmhlYWRpbmc6ICdDcmVhdGlvbid9XG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBwcmludDxUIGV4dGVuZHMgVGVuc29yPih4OiBULCB2ZXJib3NlID0gZmFsc2UpOiB2b2lkIHtcbiAgY29uc29sZS5sb2coeC50b1N0cmluZyh2ZXJib3NlKSk7XG59XG4iXX0=","/**\n * @license\n * Copyright 2020 Google LLC. All Rights Reserved.\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n * =============================================================================\n */\nimport { ENGINE } from '../engine';\nimport { Prod } from '../kernel_names';\nimport { convertToTensor } from '../tensor_util_env';\nimport { cast } from './cast';\nimport { op } from './operation';\n/**\n * Computes the product of elements across dimensions of a `tf.Tensor`.\n *\n * Reduces the input along the dimensions given in `axes`. Unless `keepDims`\n * is true, the rank of the `tf.Tensor` is reduced by 1 for each entry in\n * `axes`. If `keepDims` is true, the reduced dimensions are retained with\n * length 1. If `axes` has no entries, all dimensions are reduced, and a\n * `tf.Tensor` with a single element is returned.\n *\n * ```js\n * const x = tf.tensor1d([1, 2, 3]);\n *\n * x.prod().print(); // or tf.prod(x)\n * ```\n *\n * ```js\n * const x = tf.tensor2d([1, 2, 3, 4], [2, 2]);\n *\n * const axis = 1;\n * x.prod(axis).print(); // or tf.prod(x, axis)\n * ```\n *\n * @param x The input tensor to compute the product over. If the dtype is `bool`\n * it will be converted to `int32` and the output dtype will be `int32`.\n * @param axis The dimension(s) to reduce. By default it reduces\n * all dimensions.\n * @param keepDims If true, retains reduced dimensions with size 1.\n *\n * @doc {heading: 'Operations', subheading: 'Reduction'}\n */\nfunction prod_(x, axis = null, keepDims = false) {\n let $x = convertToTensor(x, 'x', 'prod');\n if ($x.dtype === 'bool') {\n // bool is not an allowed type for the underlying kernel.\n $x = cast($x, 'int32');\n }\n const inputs = { x: $x };\n const attrs = { axis, keepDims };\n return ENGINE.runKernel(Prod, inputs, attrs);\n}\nexport const prod = op({ prod_ });\n//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicHJvZC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uLy4uL3RmanMtY29yZS9zcmMvb3BzL3Byb2QudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUE7Ozs7Ozs7Ozs7Ozs7OztHQWVHO0FBRUgsT0FBTyxFQUFDLE1BQU0sRUFBQyxNQUFNLFdBQVcsQ0FBQztBQUNqQyxPQUFPLEVBQUMsSUFBSSxFQUF3QixNQUFNLGlCQUFpQixDQUFDO0FBSTVELE9BQU8sRUFBQyxlQUFlLEVBQUMsTUFBTSxvQkFBb0IsQ0FBQztBQUduRCxPQUFPLEVBQUMsSUFBSSxFQUFDLE1BQU0sUUFBUSxDQUFDO0FBQzVCLE9BQU8sRUFBQyxFQUFFLEVBQUMsTUFBTSxhQUFhLENBQUM7QUFFL0I7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7O0dBNkJHO0FBQ0gsU0FBUyxLQUFLLENBQ1YsQ0FBb0IsRUFBRSxPQUF3QixJQUFJLEVBQUUsUUFBUSxHQUFHLEtBQUs7SUFDdEUsSUFBSSxFQUFFLEdBQUcsZUFBZSxDQUFDLENBQUMsRUFBRSxHQUFHLEVBQUUsTUFBTSxDQUFDLENBQUM7SUFFekMsSUFBSSxFQUFFLENBQUMsS0FBSyxLQUFLLE1BQU0sRUFBRTtRQUN2Qix5REFBeUQ7UUFDekQsRUFBRSxHQUFHLElBQUksQ0FBQyxFQUFFLEVBQUUsT0FBTyxDQUFDLENBQUM7S0FDeEI7SUFFRCxNQUFNLE1BQU0sR0FBZSxFQUFDLENBQUMsRUFBRSxFQUFFLEVBQUMsQ0FBQztJQUNuQyxNQUFNLEtBQUssR0FBYyxFQUFDLElBQUksRUFBRSxRQUFRLEVBQUMsQ0FBQztJQUUxQyxPQUFPLE1BQU0sQ0FBQyxTQUFTLENBQ25CLElBQUksRUFBRSxNQUE4QixFQUFFLEtBQTJCLENBQUMsQ0FBQztBQUN6RSxDQUFDO0FBRUQsTUFBTSxDQUFDLE1BQU0sSUFBSSxHQUFHLEVBQUUsQ0FBQyxFQUFDLEtBQUssRUFBQyxDQUFDLENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyIvKipcbiAqIEBsaWNlbnNlXG4gKiBDb3B5cmlnaHQgMjAyMCBHb29nbGUgTExDLiBBbGwgUmlnaHRzIFJlc2VydmVkLlxuICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlIFwiTGljZW5zZVwiKTtcbiAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS5cbiAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdFxuICpcbiAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMFxuICpcbiAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmVcbiAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuIFwiQVMgSVNcIiBCQVNJUyxcbiAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLlxuICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZFxuICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuXG4gKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuICovXG5cbmltcG9ydCB7RU5HSU5FfSBmcm9tICcuLi9lbmdpbmUnO1xuaW1wb3J0IHtQcm9kLCBQcm9kQXR0cnMsIFByb2RJbnB1dHN9IGZyb20gJy4uL2tlcm5lbF9uYW1lcyc7XG5pbXBvcnQge05hbWVkQXR0ck1hcH0gZnJvbSAnLi4va2VybmVsX3JlZ2lzdHJ5JztcbmltcG9ydCB7VGVuc29yfSBmcm9tICcuLi90ZW5zb3InO1xuaW1wb3J0IHtOYW1lZFRlbnNvck1hcH0gZnJvbSAnLi4vdGVuc29yX3R5cGVzJztcbmltcG9ydCB7Y29udmVydFRvVGVuc29yfSBmcm9tICcuLi90ZW5zb3JfdXRpbF9lbnYnO1xuaW1wb3J0IHtUZW5zb3JMaWtlfSBmcm9tICcuLi90eXBlcyc7XG5cbmltcG9ydCB7Y2FzdH0gZnJvbSAnLi9jYXN0JztcbmltcG9ydCB7b3B9IGZyb20gJy4vb3BlcmF0aW9uJztcblxuLyoqXG4gKiBDb21wdXRlcyB0aGUgcHJvZHVjdCBvZiBlbGVtZW50cyBhY3Jvc3MgZGltZW5zaW9ucyBvZiBhIGB0Zi5UZW5zb3JgLlxuICpcbiAqIFJlZHVjZXMgdGhlIGlucHV0IGFsb25nIHRoZSBkaW1lbnNpb25zIGdpdmVuIGluIGBheGVzYC4gVW5sZXNzIGBrZWVwRGltc2BcbiAqIGlzIHRydWUsIHRoZSByYW5rIG9mIHRoZSBgdGYuVGVuc29yYCBpcyByZWR1Y2VkIGJ5IDEgZm9yIGVhY2ggZW50cnkgaW5cbiAqIGBheGVzYC4gSWYgYGtlZXBEaW1zYCBpcyB0cnVlLCB0aGUgcmVkdWNlZCBkaW1lbnNpb25zIGFyZSByZXRhaW5lZCB3aXRoXG4gKiBsZW5ndGggMS4gSWYgYGF4ZXNgIGhhcyBubyBlbnRyaWVzLCBhbGwgZGltZW5zaW9ucyBhcmUgcmVkdWNlZCwgYW5kIGFcbiAqIGB0Zi5UZW5zb3JgIHdpdGggYSBzaW5nbGUgZWxlbWVudCBpcyByZXR1cm5lZC5cbiAqXG4gKiBgYGBqc1xuICogY29uc3QgeCA9IHRmLnRlbnNvcjFkKFsxLCAyLCAzXSk7XG4gKlxuICogeC5wcm9kKCkucHJpbnQoKTsgIC8vIG9yIHRmLnByb2QoeClcbiAqIGBgYFxuICpcbiAqIGBgYGpzXG4gKiBjb25zdCB4ID0gdGYudGVuc29yMmQoWzEsIDIsIDMsIDRdLCBbMiwgMl0pO1xuICpcbiAqIGNvbnN0IGF4aXMgPSAxO1xuICogeC5wcm9kKGF4aXMpLnByaW50KCk7ICAvLyBvciB0Zi5wcm9kKHgsIGF4aXMpXG4gKiBgYGBcbiAqXG4gKiBAcGFyYW0geCBUaGUgaW5wdXQgdGVuc29yIHRvIGNvbXB1dGUgdGhlIHByb2R1Y3Qgb3Zlci4gSWYgdGhlIGR0eXBlIGlzIGBib29sYFxuICogICBpdCB3aWxsIGJlIGNvbnZlcnRlZCB0byBgaW50MzJgIGFuZCB0aGUgb3V0cHV0IGR0eXBlIHdpbGwgYmUgYGludDMyYC5cbiAqIEBwYXJhbSBheGlzIFRoZSBkaW1lbnNpb24ocykgdG8gcmVkdWNlLiBCeSBkZWZhdWx0IGl0IHJlZHVjZXNcbiAqICAgICBhbGwgZGltZW5zaW9ucy5cbiAqIEBwYXJhbSBrZWVwRGltcyBJZiB0cnVlLCByZXRhaW5zIHJlZHVjZWQgZGltZW5zaW9ucyB3aXRoIHNpemUgMS5cbiAqXG4gKiBAZG9jIHtoZWFkaW5nOiAnT3BlcmF0aW9ucycsIHN1YmhlYWRpbmc6ICdSZWR1Y3Rpb24nfVxuICovXG5mdW5jdGlvbiBwcm9kXzxUIGV4dGVuZHMgVGVuc29yPihcbiAgICB4OiBUZW5zb3J8VGVuc29yTGlrZSwgYXhpczogbnVtYmVyfG51bWJlcltdID0gbnVsbCwga2VlcERpbXMgPSBmYWxzZSk6IFQge1xuICBsZXQgJHggPSBjb252ZXJ0VG9UZW5zb3IoeCwgJ3gnLCAncHJvZCcpO1xuXG4gIGlmICgkeC5kdHlwZSA9PT0gJ2Jvb2wnKSB7XG4gICAgLy8gYm9vbCBpcyBub3QgYW4gYWxsb3dlZCB0eXBlIGZvciB0aGUgdW5kZXJseWluZyBrZXJuZWwuXG4gICAgJHggPSBjYXN0KCR4LCAnaW50MzInKTtcbiAgfVxuXG4gIGNvbnN0IGlucHV0czogUHJvZElucHV0cyA9IHt4OiAkeH07XG4gIGNvbnN0IGF0dHJzOiBQcm9kQXR0cnMgPSB7YXhpcywga2VlcERpbXN9O1xuXG4gIHJldHVybiBFTkdJTkUucnVuS2VybmVsKFxuICAgICAgUHJvZCwgaW5wdXRzIGFzIHt9IGFzIE5hbWVkVGVuc29yTWFwLCBhdHRycyBhcyB7fSBhcyBOYW1lZEF0dHJNYXApO1xufVxuXG5leHBvcnQgY29uc3QgcHJvZCA9IG9wKHtwcm9kX30pO1xuIl19","/**\n * @license\n * Copyright 2020 Google LLC. All Rights Reserved.\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n * =============================================================================\n */\nimport { ENGINE } from '../engine';\nimport { Real } from '../kernel_names';\nimport { convertToTensor } from '../tensor_util_env';\nimport { op } from './operation';\n/**\n * Returns the real part of a complex (or real) tensor.\n *\n * Given a tensor input, this operation returns a tensor of type float that is\n * the real part of each element in input considered as a complex number.\n *\n * If the input is real, it simply makes a clone.\n *\n * ```js\n * const x = tf.complex([-2.25, 3.25], [4.75, 5.75]);\n * tf.real(x).print();\n * ```\n *\n * @doc {heading: 'Tensors', subheading: 'Creation'}\n */\nfunction real_(input) {\n const $input = convertToTensor(input, 'input', 'real');\n const inputs = { input: $input };\n return ENGINE.runKernel(Real, inputs);\n}\nexport const real = op({ real_ });\n//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicmVhbC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uLy4uL3RmanMtY29yZS9zcmMvb3BzL3JlYWwudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUE7Ozs7Ozs7Ozs7Ozs7OztHQWVHO0FBRUgsT0FBTyxFQUFDLE1BQU0sRUFBQyxNQUFNLFdBQVcsQ0FBQztBQUNqQyxPQUFPLEVBQUMsSUFBSSxFQUFhLE1BQU0saUJBQWlCLENBQUM7QUFHakQsT0FBTyxFQUFDLGVBQWUsRUFBQyxNQUFNLG9CQUFvQixDQUFDO0FBRW5ELE9BQU8sRUFBQyxFQUFFLEVBQUMsTUFBTSxhQUFhLENBQUM7QUFFL0I7Ozs7Ozs7Ozs7Ozs7O0dBY0c7QUFDSCxTQUFTLEtBQUssQ0FBbUIsS0FBbUI7SUFDbEQsTUFBTSxNQUFNLEdBQUcsZUFBZSxDQUFDLEtBQUssRUFBRSxPQUFPLEVBQUUsTUFBTSxDQUFDLENBQUM7SUFFdkQsTUFBTSxNQUFNLEdBQWUsRUFBQyxLQUFLLEVBQUUsTUFBTSxFQUFDLENBQUM7SUFDM0MsT0FBTyxNQUFNLENBQUMsU0FBUyxDQUFDLElBQUksRUFBRSxNQUE4QixDQUFDLENBQUM7QUFDaEUsQ0FBQztBQUVELE1BQU0sQ0FBQyxNQUFNLElBQUksR0FBRyxFQUFFLENBQUMsRUFBQyxLQUFLLEVBQUMsQ0FBQyxDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiLyoqXG4gKiBAbGljZW5zZVxuICogQ29weXJpZ2h0IDIwMjAgR29vZ2xlIExMQy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC5cbiAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSBcIkxpY2Vuc2VcIik7XG4gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuXG4gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXRcbiAqXG4gKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjBcbiAqXG4gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlXG4gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiBcIkFTIElTXCIgQkFTSVMsXG4gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC5cbiAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmRcbiAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLlxuICogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbiAqL1xuXG5pbXBvcnQge0VOR0lORX0gZnJvbSAnLi4vZW5naW5lJztcbmltcG9ydCB7UmVhbCwgUmVhbElucHV0c30gZnJvbSAnLi4va2VybmVsX25hbWVzJztcbmltcG9ydCB7VGVuc29yfSBmcm9tICcuLi90ZW5zb3InO1xuaW1wb3J0IHtOYW1lZFRlbnNvck1hcH0gZnJvbSAnLi4vdGVuc29yX3R5cGVzJztcbmltcG9ydCB7Y29udmVydFRvVGVuc29yfSBmcm9tICcuLi90ZW5zb3JfdXRpbF9lbnYnO1xuaW1wb3J0IHtUZW5zb3JMaWtlfSBmcm9tICcuLi90eXBlcyc7XG5pbXBvcnQge29wfSBmcm9tICcuL29wZXJhdGlvbic7XG5cbi8qKlxuICogUmV0dXJucyB0aGUgcmVhbCBwYXJ0IG9mIGEgY29tcGxleCAob3IgcmVhbCkgdGVuc29yLlxuICpcbiAqIEdpdmVuIGEgdGVuc29yIGlucHV0LCB0aGlzIG9wZXJhdGlvbiByZXR1cm5zIGEgdGVuc29yIG9mIHR5cGUgZmxvYXQgdGhhdCBpc1xuICogdGhlIHJlYWwgcGFydCBvZiBlYWNoIGVsZW1lbnQgaW4gaW5wdXQgY29uc2lkZXJlZCBhcyBhIGNvbXBsZXggbnVtYmVyLlxuICpcbiAqIElmIHRoZSBpbnB1dCBpcyByZWFsLCBpdCBzaW1wbHkgbWFrZXMgYSBjbG9uZS5cbiAqXG4gKiBgYGBqc1xuICogY29uc3QgeCA9IHRmLmNvbXBsZXgoWy0yLjI1LCAzLjI1XSwgWzQuNzUsIDUuNzVdKTtcbiAqIHRmLnJlYWwoeCkucHJpbnQoKTtcbiAqIGBgYFxuICpcbiAqIEBkb2Mge2hlYWRpbmc6ICdUZW5zb3JzJywgc3ViaGVhZGluZzogJ0NyZWF0aW9uJ31cbiAqL1xuZnVuY3Rpb24gcmVhbF88VCBleHRlbmRzIFRlbnNvcj4oaW5wdXQ6IFR8VGVuc29yTGlrZSk6IFQge1xuICBjb25zdCAkaW5wdXQgPSBjb252ZXJ0VG9UZW5zb3IoaW5wdXQsICdpbnB1dCcsICdyZWFsJyk7XG5cbiAgY29uc3QgaW5wdXRzOiBSZWFsSW5wdXRzID0ge2lucHV0OiAkaW5wdXR9O1xuICByZXR1cm4gRU5HSU5FLnJ1bktlcm5lbChSZWFsLCBpbnB1dHMgYXMge30gYXMgTmFtZWRUZW5zb3JNYXApO1xufVxuXG5leHBvcnQgY29uc3QgcmVhbCA9IG9wKHtyZWFsX30pO1xuIl19","/**\n * @license\n * Copyright 2018 Google LLC. All Rights Reserved.\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n * =============================================================================\n */\nimport { ENGINE } from '../engine';\nimport { Reciprocal } from '../kernel_names';\nimport { convertToTensor } from '../tensor_util_env';\nimport { op } from './operation';\n/**\n * Computes reciprocal of x element-wise: `1 / x`\n *\n * ```js\n * const x = tf.tensor1d([0, 1, 2]);\n *\n * x.reciprocal().print(); // or tf.reciprocal(x)\n * ```\n * @param x The input tensor.\n *\n * @doc {heading: 'Operations', subheading: 'Basic math'}\n */\nfunction reciprocal_(x) {\n const $x = convertToTensor(x, 'x', 'reciprocal');\n const inputs = { x: $x };\n return ENGINE.runKernel(Reciprocal, inputs);\n}\nexport const reciprocal = op({ reciprocal_ });\n//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicmVjaXByb2NhbC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uLy4uL3RmanMtY29yZS9zcmMvb3BzL3JlY2lwcm9jYWwudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUE7Ozs7Ozs7Ozs7Ozs7OztHQWVHO0FBRUgsT0FBTyxFQUFDLE1BQU0sRUFBQyxNQUFNLFdBQVcsQ0FBQztBQUNqQyxPQUFPLEVBQUMsVUFBVSxFQUFtQixNQUFNLGlCQUFpQixDQUFDO0FBRzdELE9BQU8sRUFBQyxlQUFlLEVBQUMsTUFBTSxvQkFBb0IsQ0FBQztBQUduRCxPQUFPLEVBQUMsRUFBRSxFQUFDLE1BQU0sYUFBYSxDQUFDO0FBRS9COzs7Ozs7Ozs7OztHQVdHO0FBQ0gsU0FBUyxXQUFXLENBQW1CLENBQWU7SUFDcEQsTUFBTSxFQUFFLEdBQUcsZUFBZSxDQUFDLENBQUMsRUFBRSxHQUFHLEVBQUUsWUFBWSxDQUFDLENBQUM7SUFFakQsTUFBTSxNQUFNLEdBQXFCLEVBQUMsQ0FBQyxFQUFFLEVBQUUsRUFBQyxDQUFDO0lBQ3pDLE9BQU8sTUFBTSxDQUFDLFNBQVMsQ0FBQyxVQUFVLEVBQUUsTUFBOEIsQ0FBQyxDQUFDO0FBQ3RFLENBQUM7QUFDRCxNQUFNLENBQUMsTUFBTSxVQUFVLEdBQUcsRUFBRSxDQUFDLEVBQUMsV0FBVyxFQUFDLENBQUMsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbIi8qKlxuICogQGxpY2Vuc2VcbiAqIENvcHlyaWdodCAyMDE4IEdvb2dsZSBMTEMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuXG4gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgXCJMaWNlbnNlXCIpO1xuICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLlxuICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0XG4gKlxuICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wXG4gKlxuICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZVxuICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gXCJBUyBJU1wiIEJBU0lTLFxuICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuXG4gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kXG4gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS5cbiAqID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4gKi9cblxuaW1wb3J0IHtFTkdJTkV9IGZyb20gJy4uL2VuZ2luZSc7XG5pbXBvcnQge1JlY2lwcm9jYWwsIFJlY2lwcm9jYWxJbnB1dHN9IGZyb20gJy4uL2tlcm5lbF9uYW1lcyc7XG5pbXBvcnQge1RlbnNvcn0gZnJvbSAnLi4vdGVuc29yJztcbmltcG9ydCB7TmFtZWRUZW5zb3JNYXB9IGZyb20gJy4uL3RlbnNvcl90eXBlcyc7XG5pbXBvcnQge2NvbnZlcnRUb1RlbnNvcn0gZnJvbSAnLi4vdGVuc29yX3V0aWxfZW52JztcbmltcG9ydCB7VGVuc29yTGlrZX0gZnJvbSAnLi4vdHlwZXMnO1xuXG5pbXBvcnQge29wfSBmcm9tICcuL29wZXJhdGlvbic7XG5cbi8qKlxuICogQ29tcHV0ZXMgcmVjaXByb2NhbCBvZiB4IGVsZW1lbnQtd2lzZTogYDEgLyB4YFxuICpcbiAqIGBgYGpzXG4gKiBjb25zdCB4ID0gdGYudGVuc29yMWQoWzAsIDEsIDJdKTtcbiAqXG4gKiB4LnJlY2lwcm9jYWwoKS5wcmludCgpOyAgLy8gb3IgdGYucmVjaXByb2NhbCh4KVxuICogYGBgXG4gKiBAcGFyYW0geCBUaGUgaW5wdXQgdGVuc29yLlxuICpcbiAqIEBkb2Mge2hlYWRpbmc6ICdPcGVyYXRpb25zJywgc3ViaGVhZGluZzogJ0Jhc2ljIG1hdGgnfVxuICovXG5mdW5jdGlvbiByZWNpcHJvY2FsXzxUIGV4dGVuZHMgVGVuc29yPih4OiBUfFRlbnNvckxpa2UpOiBUIHtcbiAgY29uc3QgJHggPSBjb252ZXJ0VG9UZW5zb3IoeCwgJ3gnLCAncmVjaXByb2NhbCcpO1xuXG4gIGNvbnN0IGlucHV0czogUmVjaXByb2NhbElucHV0cyA9IHt4OiAkeH07XG4gIHJldHVybiBFTkdJTkUucnVuS2VybmVsKFJlY2lwcm9jYWwsIGlucHV0cyBhcyB7fSBhcyBOYW1lZFRlbnNvck1hcCk7XG59XG5leHBvcnQgY29uc3QgcmVjaXByb2NhbCA9IG9wKHtyZWNpcHJvY2FsX30pO1xuIl19","/**\n * @license\n * Copyright 2020 Google LLC. All Rights Reserved.\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n * =============================================================================\n */\nimport { ENGINE } from '../engine';\nimport { Relu } from '../kernel_names';\nimport { convertToTensor } from '../tensor_util_env';\nimport { op } from './operation';\n/**\n * Computes rectified linear element-wise: `max(x, 0)`.\n *\n * ```js\n * const x = tf.tensor1d([-1, 2, -3, 4]);\n *\n * x.relu().print(); // or tf.relu(x)\n * ```\n * @param x The input tensor. If the dtype is `bool`, the output dtype will be\n * `int32`.\n *\n * @doc {heading: 'Operations', subheading: 'Basic math'}\n */\nfunction relu_(x) {\n const $x = convertToTensor(x, 'x', 'relu');\n const inputs = { x: $x };\n return ENGINE.runKernel(Relu, inputs);\n}\nexport const relu = op({ relu_ });\n//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicmVsdS5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uLy4uL3RmanMtY29yZS9zcmMvb3BzL3JlbHUudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUE7Ozs7Ozs7Ozs7Ozs7OztHQWVHO0FBRUgsT0FBTyxFQUFDLE1BQU0sRUFBQyxNQUFNLFdBQVcsQ0FBQztBQUNqQyxPQUFPLEVBQUMsSUFBSSxFQUFhLE1BQU0saUJBQWlCLENBQUM7QUFHakQsT0FBTyxFQUFDLGVBQWUsRUFBQyxNQUFNLG9CQUFvQixDQUFDO0FBR25ELE9BQU8sRUFBQyxFQUFFLEVBQUMsTUFBTSxhQUFhLENBQUM7QUFFL0I7Ozs7Ozs7Ozs7OztHQVlHO0FBQ0gsU0FBUyxLQUFLLENBQW1CLENBQWU7SUFDOUMsTUFBTSxFQUFFLEdBQUcsZUFBZSxDQUFDLENBQUMsRUFBRSxHQUFHLEVBQUUsTUFBTSxDQUFDLENBQUM7SUFFM0MsTUFBTSxNQUFNLEdBQWUsRUFBQyxDQUFDLEVBQUUsRUFBRSxFQUFDLENBQUM7SUFFbkMsT0FBTyxNQUFNLENBQUMsU0FBUyxDQUFDLElBQUksRUFBRSxNQUE4QixDQUFDLENBQUM7QUFDaEUsQ0FBQztBQUVELE1BQU0sQ0FBQyxNQUFNLElBQUksR0FBRyxFQUFFLENBQUMsRUFBQyxLQUFLLEVBQUMsQ0FBQyxDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiLyoqXG4gKiBAbGljZW5zZVxuICogQ29weXJpZ2h0IDIwMjAgR29vZ2xlIExMQy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC5cbiAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSBcIkxpY2Vuc2VcIik7XG4gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuXG4gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXRcbiAqXG4gKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjBcbiAqXG4gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlXG4gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiBcIkFTIElTXCIgQkFTSVMsXG4gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC5cbiAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmRcbiAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLlxuICogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbiAqL1xuXG5pbXBvcnQge0VOR0lORX0gZnJvbSAnLi4vZW5naW5lJztcbmltcG9ydCB7UmVsdSwgUmVsdUlucHV0c30gZnJvbSAnLi4va2VybmVsX25hbWVzJztcbmltcG9ydCB7VGVuc29yfSBmcm9tICcuLi90ZW5zb3InO1xuaW1wb3J0IHtOYW1lZFRlbnNvck1hcH0gZnJvbSAnLi4vdGVuc29yX3R5cGVzJztcbmltcG9ydCB7Y29udmVydFRvVGVuc29yfSBmcm9tICcuLi90ZW5zb3JfdXRpbF9lbnYnO1xuaW1wb3J0IHtUZW5zb3JMaWtlfSBmcm9tICcuLi90eXBlcyc7XG5cbmltcG9ydCB7b3B9IGZyb20gJy4vb3BlcmF0aW9uJztcblxuLyoqXG4gKiBDb21wdXRlcyByZWN0aWZpZWQgbGluZWFyIGVsZW1lbnQtd2lzZTogYG1heCh4LCAwKWAuXG4gKlxuICogYGBganNcbiAqIGNvbnN0IHggPSB0Zi50ZW5zb3IxZChbLTEsIDIsIC0zLCA0XSk7XG4gKlxuICogeC5yZWx1KCkucHJpbnQoKTsgIC8vIG9yIHRmLnJlbHUoeClcbiAqIGBgYFxuICogQHBhcmFtIHggVGhlIGlucHV0IHRlbnNvci4gSWYgdGhlIGR0eXBlIGlzIGBib29sYCwgdGhlIG91dHB1dCBkdHlwZSB3aWxsIGJlXG4gKiAgICAgYGludDMyYC5cbiAqXG4gKiBAZG9jIHtoZWFkaW5nOiAnT3BlcmF0aW9ucycsIHN1YmhlYWRpbmc6ICdCYXNpYyBtYXRoJ31cbiAqL1xuZnVuY3Rpb24gcmVsdV88VCBleHRlbmRzIFRlbnNvcj4oeDogVHxUZW5zb3JMaWtlKTogVCB7XG4gIGNvbnN0ICR4ID0gY29udmVydFRvVGVuc29yKHgsICd4JywgJ3JlbHUnKTtcblxuICBjb25zdCBpbnB1dHM6IFJlbHVJbnB1dHMgPSB7eDogJHh9O1xuXG4gIHJldHVybiBFTkdJTkUucnVuS2VybmVsKFJlbHUsIGlucHV0cyBhcyB7fSBhcyBOYW1lZFRlbnNvck1hcCk7XG59XG5cbmV4cG9ydCBjb25zdCByZWx1ID0gb3Aoe3JlbHVffSk7XG4iXX0=","/**\n * @license\n * Copyright 2020 Google LLC. All Rights Reserved.\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n * =============================================================================\n */\nimport { ENGINE } from '../engine';\nimport { Relu6 } from '../kernel_names';\nimport { convertToTensor } from '../tensor_util_env';\nimport { op } from './operation';\n/**\n * Computes rectified linear 6 element-wise: `min(max(x, 0), 6)`.\n *\n * ```js\n * const x = tf.tensor1d([-1, 2, -3, 8]);\n *\n * x.relu6().print(); // or tf.relu6(x)\n * ```\n * @param x The input tensor. If the dtype is `bool`, the output dtype will be\n * `int32`.\n *\n * @doc {heading: 'Operations', subheading: 'Basic math'}\n */\nfunction relu6_(x) {\n const $x = convertToTensor(x, 'x', 'relu6');\n const inputs = { x: $x };\n return ENGINE.runKernel(Relu6, inputs);\n}\nexport const relu6 = op({ relu6_ });\n//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicmVsdTYuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi8uLi90ZmpzLWNvcmUvc3JjL29wcy9yZWx1Ni50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQTs7Ozs7Ozs7Ozs7Ozs7O0dBZUc7QUFFSCxPQUFPLEVBQUMsTUFBTSxFQUFDLE1BQU0sV0FBVyxDQUFDO0FBQ2pDLE9BQU8sRUFBQyxLQUFLLEVBQWMsTUFBTSxpQkFBaUIsQ0FBQztBQUduRCxPQUFPLEVBQUMsZUFBZSxFQUFDLE1BQU0sb0JBQW9CLENBQUM7QUFHbkQsT0FBTyxFQUFDLEVBQUUsRUFBQyxNQUFNLGFBQWEsQ0FBQztBQUUvQjs7Ozs7Ozs7Ozs7O0dBWUc7QUFDSCxTQUFTLE1BQU0sQ0FBbUIsQ0FBZTtJQUMvQyxNQUFNLEVBQUUsR0FBRyxlQUFlLENBQUMsQ0FBQyxFQUFFLEdBQUcsRUFBRSxPQUFPLENBQUMsQ0FBQztJQUU1QyxNQUFNLE1BQU0sR0FBZ0IsRUFBQyxDQUFDLEVBQUUsRUFBRSxFQUFDLENBQUM7SUFFcEMsT0FBTyxNQUFNLENBQUMsU0FBUyxDQUFDLEtBQUssRUFBRSxNQUE4QixDQUFDLENBQUM7QUFDakUsQ0FBQztBQUVELE1BQU0sQ0FBQyxNQUFNLEtBQUssR0FBRyxFQUFFLENBQUMsRUFBQyxNQUFNLEVBQUMsQ0FBQyxDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiLyoqXG4gKiBAbGljZW5zZVxuICogQ29weXJpZ2h0IDIwMjAgR29vZ2xlIExMQy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC5cbiAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSBcIkxpY2Vuc2VcIik7XG4gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuXG4gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXRcbiAqXG4gKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjBcbiAqXG4gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlXG4gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiBcIkFTIElTXCIgQkFTSVMsXG4gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC5cbiAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmRcbiAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLlxuICogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbiAqL1xuXG5pbXBvcnQge0VOR0lORX0gZnJvbSAnLi4vZW5naW5lJztcbmltcG9ydCB7UmVsdTYsIFJlbHU2SW5wdXRzfSBmcm9tICcuLi9rZXJuZWxfbmFtZXMnO1xuaW1wb3J0IHtUZW5zb3J9IGZyb20gJy4uL3RlbnNvcic7XG5pbXBvcnQge05hbWVkVGVuc29yTWFwfSBmcm9tICcuLi90ZW5zb3JfdHlwZXMnO1xuaW1wb3J0IHtjb252ZXJ0VG9UZW5zb3J9IGZyb20gJy4uL3RlbnNvcl91dGlsX2Vudic7XG5pbXBvcnQge1RlbnNvckxpa2V9IGZyb20gJy4uL3R5cGVzJztcblxuaW1wb3J0IHtvcH0gZnJvbSAnLi9vcGVyYXRpb24nO1xuXG4vKipcbiAqIENvbXB1dGVzIHJlY3RpZmllZCBsaW5lYXIgNiBlbGVtZW50LXdpc2U6IGBtaW4obWF4KHgsIDApLCA2KWAuXG4gKlxuICogYGBganNcbiAqIGNvbnN0IHggPSB0Zi50ZW5zb3IxZChbLTEsIDIsIC0zLCA4XSk7XG4gKlxuICogeC5yZWx1NigpLnByaW50KCk7ICAvLyBvciB0Zi5yZWx1Nih4KVxuICogYGBgXG4gKiBAcGFyYW0geCBUaGUgaW5wdXQgdGVuc29yLiBJZiB0aGUgZHR5cGUgaXMgYGJvb2xgLCB0aGUgb3V0cHV0IGR0eXBlIHdpbGwgYmVcbiAqICAgICBgaW50MzJgLlxuICpcbiAqIEBkb2Mge2hlYWRpbmc6ICdPcGVyYXRpb25zJywgc3ViaGVhZGluZzogJ0Jhc2ljIG1hdGgnfVxuICovXG5mdW5jdGlvbiByZWx1Nl88VCBleHRlbmRzIFRlbnNvcj4oeDogVHxUZW5zb3JMaWtlKTogVCB7XG4gIGNvbnN0ICR4ID0gY29udmVydFRvVGVuc29yKHgsICd4JywgJ3JlbHU2Jyk7XG5cbiAgY29uc3QgaW5wdXRzOiBSZWx1NklucHV0cyA9IHt4OiAkeH07XG5cbiAgcmV0dXJuIEVOR0lORS5ydW5LZXJuZWwoUmVsdTYsIGlucHV0cyBhcyB7fSBhcyBOYW1lZFRlbnNvck1hcCk7XG59XG5cbmV4cG9ydCBjb25zdCByZWx1NiA9IG9wKHtyZWx1Nl99KTtcbiJdfQ==","/**\n * @license\n * Copyright 2020 Google LLC. All Rights Reserved.\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n * =============================================================================\n */\nimport { ENGINE } from '../engine';\nimport { Reshape } from '../kernel_names';\nimport { convertToTensor } from '../tensor_util_env';\nimport { op } from './operation';\n/**\n * Reshapes a `tf.Tensor` to a given shape.\n *\n * Given an input tensor, returns a new tensor with the same values as the\n * input tensor with shape `shape`.\n *\n * If one component of shape is the special value -1, the size of that\n * dimension is computed so that the total size remains constant. In\n * particular, a shape of [-1] flattens into 1-D. At most one component of\n * shape can be -1.\n *\n * If shape is 1-D or higher, then the operation returns a tensor with shape\n * shape filled with the values of tensor. In this case, the number of\n * elements implied by shape must be the same as the number of elements in\n * tensor.\n *\n * ```js\n * const x = tf.tensor1d([1, 2, 3, 4]);\n * x.reshape([2, 2]).print();\n * ```\n *\n * @param x The input tensor to be reshaped.\n * @param shape An array of integers defining the output tensor shape.\n *\n * @doc {heading: 'Tensors', subheading: 'Transformations'}\n */\nfunction reshape_(x, shape) {\n const $x = convertToTensor(x, 'x', 'reshape', 'string_or_numeric');\n const inputs = { x: $x };\n const attrs = { shape };\n return ENGINE.runKernel(Reshape, inputs, attrs);\n}\nexport const reshape = op({ reshape_ });\n//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicmVzaGFwZS5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uLy4uL3RmanMtY29yZS9zcmMvb3BzL3Jlc2hhcGUudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUE7Ozs7Ozs7Ozs7Ozs7OztHQWVHO0FBRUgsT0FBTyxFQUFDLE1BQU0sRUFBQyxNQUFNLFdBQVcsQ0FBQztBQUNqQyxPQUFPLEVBQUMsT0FBTyxFQUE4QixNQUFNLGlCQUFpQixDQUFDO0FBSXJFLE9BQU8sRUFBQyxlQUFlLEVBQUMsTUFBTSxvQkFBb0IsQ0FBQztBQUduRCxPQUFPLEVBQUMsRUFBRSxFQUFDLE1BQU0sYUFBYSxDQUFDO0FBRS9COzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7O0dBeUJHO0FBQ0gsU0FBUyxRQUFRLENBQ2IsQ0FBb0IsRUFBRSxLQUFrQjtJQUMxQyxNQUFNLEVBQUUsR0FBRyxlQUFlLENBQUMsQ0FBQyxFQUFFLEdBQUcsRUFBRSxTQUFTLEVBQUUsbUJBQW1CLENBQUMsQ0FBQztJQUVuRSxNQUFNLE1BQU0sR0FBa0IsRUFBQyxDQUFDLEVBQUUsRUFBRSxFQUFDLENBQUM7SUFDdEMsTUFBTSxLQUFLLEdBQWlCLEVBQUMsS0FBSyxFQUFDLENBQUM7SUFDcEMsT0FBTyxNQUFNLENBQUMsU0FBUyxDQUNuQixPQUFPLEVBQUUsTUFBOEIsRUFBRSxLQUEyQixDQUFDLENBQUM7QUFDNUUsQ0FBQztBQUNELE1BQU0sQ0FBQyxNQUFNLE9BQU8sR0FBRyxFQUFFLENBQUMsRUFBQyxRQUFRLEVBQUMsQ0FBQyxDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiLyoqXG4gKiBAbGljZW5zZVxuICogQ29weXJpZ2h0IDIwMjAgR29vZ2xlIExMQy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC5cbiAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSBcIkxpY2Vuc2VcIik7XG4gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuXG4gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXRcbiAqXG4gKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjBcbiAqXG4gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlXG4gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiBcIkFTIElTXCIgQkFTSVMsXG4gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC5cbiAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmRcbiAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLlxuICogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbiAqL1xuXG5pbXBvcnQge0VOR0lORX0gZnJvbSAnLi4vZW5naW5lJztcbmltcG9ydCB7UmVzaGFwZSwgUmVzaGFwZUF0dHJzLCBSZXNoYXBlSW5wdXRzfSBmcm9tICcuLi9rZXJuZWxfbmFtZXMnO1xuaW1wb3J0IHtOYW1lZEF0dHJNYXB9IGZyb20gJy4uL2tlcm5lbF9yZWdpc3RyeSc7XG5pbXBvcnQge1RlbnNvcn0gZnJvbSAnLi4vdGVuc29yJztcbmltcG9ydCB7TmFtZWRUZW5zb3JNYXB9IGZyb20gJy4uL3RlbnNvcl90eXBlcyc7XG5pbXBvcnQge2NvbnZlcnRUb1RlbnNvcn0gZnJvbSAnLi4vdGVuc29yX3V0aWxfZW52JztcbmltcG9ydCB7UmFuaywgU2hhcGVNYXAsIFRlbnNvckxpa2V9IGZyb20gJy4uL3R5cGVzJztcblxuaW1wb3J0IHtvcH0gZnJvbSAnLi9vcGVyYXRpb24nO1xuXG4vKipcbiAqIFJlc2hhcGVzIGEgYHRmLlRlbnNvcmAgdG8gYSBnaXZlbiBzaGFwZS5cbiAqXG4gKiBHaXZlbiBhbiBpbnB1dCB0ZW5zb3IsIHJldHVybnMgYSBuZXcgdGVuc29yIHdpdGggdGhlIHNhbWUgdmFsdWVzIGFzIHRoZVxuICogaW5wdXQgdGVuc29yIHdpdGggc2hhcGUgYHNoYXBlYC5cbiAqXG4gKiBJZiBvbmUgY29tcG9uZW50IG9mIHNoYXBlIGlzIHRoZSBzcGVjaWFsIHZhbHVlIC0xLCB0aGUgc2l6ZSBvZiB0aGF0XG4gKiBkaW1lbnNpb24gaXMgY29tcHV0ZWQgc28gdGhhdCB0aGUgdG90YWwgc2l6ZSByZW1haW5zIGNvbnN0YW50LiBJblxuICogcGFydGljdWxhciwgYSBzaGFwZSBvZiBbLTFdIGZsYXR0ZW5zIGludG8gMS1ELiBBdCBtb3N0IG9uZSBjb21wb25lbnQgb2ZcbiAqIHNoYXBlIGNhbiBiZSAtMS5cbiAqXG4gKiBJZiBzaGFwZSBpcyAxLUQgb3IgaGlnaGVyLCB0aGVuIHRoZSBvcGVyYXRpb24gcmV0dXJucyBhIHRlbnNvciB3aXRoIHNoYXBlXG4gKiBzaGFwZSBmaWxsZWQgd2l0aCB0aGUgdmFsdWVzIG9mIHRlbnNvci4gSW4gdGhpcyBjYXNlLCB0aGUgbnVtYmVyIG9mXG4gKiBlbGVtZW50cyBpbXBsaWVkIGJ5IHNoYXBlIG11c3QgYmUgdGhlIHNhbWUgYXMgdGhlIG51bWJlciBvZiBlbGVtZW50cyBpblxuICogdGVuc29yLlxuICpcbiAqIGBgYGpzXG4gKiBjb25zdCB4ID0gdGYudGVuc29yMWQoWzEsIDIsIDMsIDRdKTtcbiAqIHgucmVzaGFwZShbMiwgMl0pLnByaW50KCk7XG4gKiBgYGBcbiAqXG4gKiBAcGFyYW0geCBUaGUgaW5wdXQgdGVuc29yIHRvIGJlIHJlc2hhcGVkLlxuICogQHBhcmFtIHNoYXBlIEFuIGFycmF5IG9mIGludGVnZXJzIGRlZmluaW5nIHRoZSBvdXRwdXQgdGVuc29yIHNoYXBlLlxuICpcbiAqIEBkb2Mge2hlYWRpbmc6ICdUZW5zb3JzJywgc3ViaGVhZGluZzogJ1RyYW5zZm9ybWF0aW9ucyd9XG4gKi9cbmZ1bmN0aW9uIHJlc2hhcGVfPFIgZXh0ZW5kcyBSYW5rPihcbiAgICB4OiBUZW5zb3J8VGVuc29yTGlrZSwgc2hhcGU6IFNoYXBlTWFwW1JdKTogVGVuc29yPFI+IHtcbiAgY29uc3QgJHggPSBjb252ZXJ0VG9UZW5zb3IoeCwgJ3gnLCAncmVzaGFwZScsICdzdHJpbmdfb3JfbnVtZXJpYycpO1xuXG4gIGNvbnN0IGlucHV0czogUmVzaGFwZUlucHV0cyA9IHt4OiAkeH07XG4gIGNvbnN0IGF0dHJzOiBSZXNoYXBlQXR0cnMgPSB7c2hhcGV9O1xuICByZXR1cm4gRU5HSU5FLnJ1bktlcm5lbChcbiAgICAgIFJlc2hhcGUsIGlucHV0cyBhcyB7fSBhcyBOYW1lZFRlbnNvck1hcCwgYXR0cnMgYXMge30gYXMgTmFtZWRBdHRyTWFwKTtcbn1cbmV4cG9ydCBjb25zdCByZXNoYXBlID0gb3Aoe3Jlc2hhcGVffSk7XG4iXX0=","/**\n * @license\n * Copyright 2018 Google LLC. All Rights Reserved.\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n * =============================================================================\n */\nimport { ENGINE } from '../engine';\nimport { Reverse } from '../kernel_names';\nimport { convertToTensor } from '../tensor_util_env';\nimport { op } from './operation';\n/**\n * Reverses a `tf.Tensor` along a specified axis.\n *\n * Also available are stricter rank-specific methods that assert that `x` is\n * of the given rank:\n * - `tf.reverse1d`\n * - `tf.reverse2d`\n * - `tf.reverse3d`\n * - `tf.reverse4d`\n *\n * Except `tf.reverse1d` (which does not have axis param), all methods have\n * same signature as this method.\n *\n * ```js\n * const x = tf.tensor1d([1, 2, 3, 4]);\n *\n * x.reverse().print();\n * ```\n *\n * ```js\n * const x = tf.tensor2d([1, 2, 3, 4], [2, 2]);\n *\n * const axis = 1;\n * x.reverse(axis).print();\n * ```\n * @param x The input tensor to be reversed.\n * @param axis The set of dimensions to reverse. Must be in the\n * range [-rank(x), rank(x)). Defaults to all axes.\n *\n * @doc {heading: 'Tensors', subheading: 'Slicing and Joining'}\n */\nfunction reverse_(x, axis) {\n const $x = convertToTensor(x, 'x', 'reverse');\n const inputs = { x: $x };\n const attrs = { dims: axis };\n return ENGINE.runKernel(Reverse, inputs, attrs);\n}\nexport const reverse = op({ reverse_ });\n//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicmV2ZXJzZS5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uLy4uL3RmanMtY29yZS9zcmMvb3BzL3JldmVyc2UudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUE7Ozs7Ozs7Ozs7Ozs7OztHQWVHO0FBRUgsT0FBTyxFQUFDLE1BQU0sRUFBQyxNQUFNLFdBQVcsQ0FBQztBQUNqQyxPQUFPLEVBQUMsT0FBTyxFQUE4QixNQUFNLGlCQUFpQixDQUFDO0FBSXJFLE9BQU8sRUFBQyxlQUFlLEVBQUMsTUFBTSxvQkFBb0IsQ0FBQztBQUduRCxPQUFPLEVBQUMsRUFBRSxFQUFDLE1BQU0sYUFBYSxDQUFDO0FBRS9COzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7R0E4Qkc7QUFDSCxTQUFTLFFBQVEsQ0FDYixDQUFlLEVBQUUsSUFBc0I7SUFDekMsTUFBTSxFQUFFLEdBQUcsZUFBZSxDQUFDLENBQUMsRUFBRSxHQUFHLEVBQUUsU0FBUyxDQUFDLENBQUM7SUFFOUMsTUFBTSxNQUFNLEdBQWtCLEVBQUMsQ0FBQyxFQUFFLEVBQUUsRUFBQyxDQUFDO0lBQ3RDLE1BQU0sS0FBSyxHQUFpQixFQUFDLElBQUksRUFBRSxJQUFJLEVBQUMsQ0FBQztJQUV6QyxPQUFPLE1BQU0sQ0FBQyxTQUFTLENBQ25CLE9BQU8sRUFBRSxNQUE4QixFQUFFLEtBQTJCLENBQUMsQ0FBQztBQUM1RSxDQUFDO0FBRUQsTUFBTSxDQUFDLE1BQU0sT0FBTyxHQUFHLEVBQUUsQ0FBQyxFQUFDLFFBQVEsRUFBQyxDQUFDLENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyIvKipcbiAqIEBsaWNlbnNlXG4gKiBDb3B5cmlnaHQgMjAxOCBHb29nbGUgTExDLiBBbGwgUmlnaHRzIFJlc2VydmVkLlxuICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlIFwiTGljZW5zZVwiKTtcbiAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS5cbiAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdFxuICpcbiAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMFxuICpcbiAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmVcbiAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuIFwiQVMgSVNcIiBCQVNJUyxcbiAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLlxuICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZFxuICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuXG4gKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuICovXG5cbmltcG9ydCB7RU5HSU5FfSBmcm9tICcuLi9lbmdpbmUnO1xuaW1wb3J0IHtSZXZlcnNlLCBSZXZlcnNlQXR0cnMsIFJldmVyc2VJbnB1dHN9IGZyb20gJy4uL2tlcm5lbF9uYW1lcyc7XG5pbXBvcnQge05hbWVkQXR0ck1hcH0gZnJvbSAnLi4va2VybmVsX3JlZ2lzdHJ5JztcbmltcG9ydCB7VGVuc29yfSBmcm9tICcuLi90ZW5zb3InO1xuaW1wb3J0IHtOYW1lZFRlbnNvck1hcH0gZnJvbSAnLi4vdGVuc29yX3R5cGVzJztcbmltcG9ydCB7Y29udmVydFRvVGVuc29yfSBmcm9tICcuLi90ZW5zb3JfdXRpbF9lbnYnO1xuaW1wb3J0IHtUZW5zb3JMaWtlfSBmcm9tICcuLi90eXBlcyc7XG5cbmltcG9ydCB7b3B9IGZyb20gJy4vb3BlcmF0aW9uJztcblxuLyoqXG4gKiBSZXZlcnNlcyBhIGB0Zi5UZW5zb3JgIGFsb25nIGEgc3BlY2lmaWVkIGF4aXMuXG4gKlxuICogQWxzbyBhdmFpbGFibGUgYXJlIHN0cmljdGVyIHJhbmstc3BlY2lmaWMgbWV0aG9kcyB0aGF0IGFzc2VydCB0aGF0IGB4YCBpc1xuICogb2YgdGhlIGdpdmVuIHJhbms6XG4gKiAgIC0gYHRmLnJldmVyc2UxZGBcbiAqICAgLSBgdGYucmV2ZXJzZTJkYFxuICogICAtIGB0Zi5yZXZlcnNlM2RgXG4gKiAgIC0gYHRmLnJldmVyc2U0ZGBcbiAqXG4gKiBFeGNlcHQgYHRmLnJldmVyc2UxZGAgKHdoaWNoIGRvZXMgbm90IGhhdmUgYXhpcyBwYXJhbSksIGFsbCBtZXRob2RzIGhhdmVcbiAqIHNhbWUgc2lnbmF0dXJlIGFzIHRoaXMgbWV0aG9kLlxuICpcbiAqIGBgYGpzXG4gKiBjb25zdCB4ID0gdGYudGVuc29yMWQoWzEsIDIsIDMsIDRdKTtcbiAqXG4gKiB4LnJldmVyc2UoKS5wcmludCgpO1xuICogYGBgXG4gKlxuICogYGBganNcbiAqIGNvbnN0IHggPSB0Zi50ZW5zb3IyZChbMSwgMiwgMywgNF0sIFsyLCAyXSk7XG4gKlxuICogY29uc3QgYXhpcyA9IDE7XG4gKiB4LnJldmVyc2UoYXhpcykucHJpbnQoKTtcbiAqIGBgYFxuICogQHBhcmFtIHggVGhlIGlucHV0IHRlbnNvciB0byBiZSByZXZlcnNlZC5cbiAqIEBwYXJhbSBheGlzIFRoZSBzZXQgb2YgZGltZW5zaW9ucyB0byByZXZlcnNlLiBNdXN0IGJlIGluIHRoZVxuICogICAgIHJhbmdlIFstcmFuayh4KSwgcmFuayh4KSkuIERlZmF1bHRzIHRvIGFsbCBheGVzLlxuICpcbiAqIEBkb2Mge2hlYWRpbmc6ICdUZW5zb3JzJywgc3ViaGVhZGluZzogJ1NsaWNpbmcgYW5kIEpvaW5pbmcnfVxuICovXG5mdW5jdGlvbiByZXZlcnNlXzxUIGV4dGVuZHMgVGVuc29yPihcbiAgICB4OiBUfFRlbnNvckxpa2UsIGF4aXM/OiBudW1iZXJ8bnVtYmVyW10pOiBUIHtcbiAgY29uc3QgJHggPSBjb252ZXJ0VG9UZW5zb3IoeCwgJ3gnLCAncmV2ZXJzZScpO1xuXG4gIGNvbnN0IGlucHV0czogUmV2ZXJzZUlucHV0cyA9IHt4OiAkeH07XG4gIGNvbnN0IGF0dHJzOiBSZXZlcnNlQXR0cnMgPSB7ZGltczogYXhpc307XG5cbiAgcmV0dXJuIEVOR0lORS5ydW5LZXJuZWwoXG4gICAgICBSZXZlcnNlLCBpbnB1dHMgYXMge30gYXMgTmFtZWRUZW5zb3JNYXAsIGF0dHJzIGFzIHt9IGFzIE5hbWVkQXR0ck1hcCk7XG59XG5cbmV4cG9ydCBjb25zdCByZXZlcnNlID0gb3Aoe3JldmVyc2VffSk7XG4iXX0=","/**\n * @license\n * Copyright 2018 Google LLC. All Rights Reserved.\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n * =============================================================================\n */\nimport { ENGINE } from '../engine';\nimport { Round } from '../kernel_names';\nimport { convertToTensor } from '../tensor_util_env';\nimport { op } from './operation';\n/**\n * Computes round of input `tf.Tensor` element-wise: `round(x)`.\n * It implements banker's rounding.\n *\n * ```js\n * const x = tf.tensor1d([.6, 1.1, -3.3]);\n *\n * x.round().print(); // or tf.round(x)\n * ```\n * @param x The input tensor.\n *\n * @doc {heading: 'Operations', subheading: 'Basic math'}\n */\nfunction round_(x) {\n const $x = convertToTensor(x, 'x', 'round');\n const inputs = { x: $x };\n return ENGINE.runKernel(Round, inputs);\n}\nexport const round = op({ round_ });\n//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicm91bmQuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi8uLi90ZmpzLWNvcmUvc3JjL29wcy9yb3VuZC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQTs7Ozs7Ozs7Ozs7Ozs7O0dBZUc7QUFFSCxPQUFPLEVBQUMsTUFBTSxFQUFDLE1BQU0sV0FBVyxDQUFDO0FBQ2pDLE9BQU8sRUFBQyxLQUFLLEVBQWMsTUFBTSxpQkFBaUIsQ0FBQztBQUduRCxPQUFPLEVBQUMsZUFBZSxFQUFDLE1BQU0sb0JBQW9CLENBQUM7QUFHbkQsT0FBTyxFQUFDLEVBQUUsRUFBQyxNQUFNLGFBQWEsQ0FBQztBQUUvQjs7Ozs7Ozs7Ozs7O0dBWUc7QUFDSCxTQUFTLE1BQU0sQ0FBbUIsQ0FBZTtJQUMvQyxNQUFNLEVBQUUsR0FBRyxlQUFlLENBQUMsQ0FBQyxFQUFFLEdBQUcsRUFBRSxPQUFPLENBQUMsQ0FBQztJQUM1QyxNQUFNLE1BQU0sR0FBZ0IsRUFBQyxDQUFDLEVBQUUsRUFBRSxFQUFDLENBQUM7SUFFcEMsT0FBTyxNQUFNLENBQUMsU0FBUyxDQUFDLEtBQUssRUFBRSxNQUE4QixDQUFDLENBQUM7QUFDakUsQ0FBQztBQUVELE1BQU0sQ0FBQyxNQUFNLEtBQUssR0FBRyxFQUFFLENBQUMsRUFBQyxNQUFNLEVBQUMsQ0FBQyxDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiLyoqXG4gKiBAbGljZW5zZVxuICogQ29weXJpZ2h0IDIwMTggR29vZ2xlIExMQy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC5cbiAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSBcIkxpY2Vuc2VcIik7XG4gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuXG4gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXRcbiAqXG4gKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjBcbiAqXG4gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlXG4gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiBcIkFTIElTXCIgQkFTSVMsXG4gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC5cbiAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmRcbiAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLlxuICogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbiAqL1xuXG5pbXBvcnQge0VOR0lORX0gZnJvbSAnLi4vZW5naW5lJztcbmltcG9ydCB7Um91bmQsIFJvdW5kSW5wdXRzfSBmcm9tICcuLi9rZXJuZWxfbmFtZXMnO1xuaW1wb3J0IHtUZW5zb3J9IGZyb20gJy4uL3RlbnNvcic7XG5pbXBvcnQge05hbWVkVGVuc29yTWFwfSBmcm9tICcuLi90ZW5zb3JfdHlwZXMnO1xuaW1wb3J0IHtjb252ZXJ0VG9UZW5zb3J9IGZyb20gJy4uL3RlbnNvcl91dGlsX2Vudic7XG5pbXBvcnQge1RlbnNvckxpa2V9IGZyb20gJy4uL3R5cGVzJztcblxuaW1wb3J0IHtvcH0gZnJvbSAnLi9vcGVyYXRpb24nO1xuXG4vKipcbiAqIENvbXB1dGVzIHJvdW5kIG9mIGlucHV0IGB0Zi5UZW5zb3JgIGVsZW1lbnQtd2lzZTogYHJvdW5kKHgpYC5cbiAqIEl0IGltcGxlbWVudHMgYmFua2VyJ3Mgcm91bmRpbmcuXG4gKlxuICogYGBganNcbiAqIGNvbnN0IHggPSB0Zi50ZW5zb3IxZChbLjYsIDEuMSwgLTMuM10pO1xuICpcbiAqIHgucm91bmQoKS5wcmludCgpOyAgLy8gb3IgdGYucm91bmQoeClcbiAqIGBgYFxuICogQHBhcmFtIHggVGhlIGlucHV0IHRlbnNvci5cbiAqXG4gKiBAZG9jIHtoZWFkaW5nOiAnT3BlcmF0aW9ucycsIHN1YmhlYWRpbmc6ICdCYXNpYyBtYXRoJ31cbiAqL1xuZnVuY3Rpb24gcm91bmRfPFQgZXh0ZW5kcyBUZW5zb3I+KHg6IFR8VGVuc29yTGlrZSk6IFQge1xuICBjb25zdCAkeCA9IGNvbnZlcnRUb1RlbnNvcih4LCAneCcsICdyb3VuZCcpO1xuICBjb25zdCBpbnB1dHM6IFJvdW5kSW5wdXRzID0ge3g6ICR4fTtcblxuICByZXR1cm4gRU5HSU5FLnJ1bktlcm5lbChSb3VuZCwgaW5wdXRzIGFzIHt9IGFzIE5hbWVkVGVuc29yTWFwKTtcbn1cblxuZXhwb3J0IGNvbnN0IHJvdW5kID0gb3Aoe3JvdW5kX30pO1xuIl19","/**\n * @license\n * Copyright 2018 Google LLC. All Rights Reserved.\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n * =============================================================================\n */\nimport { ENGINE } from '../engine';\nimport { Rsqrt } from '../kernel_names';\nimport { convertToTensor } from '../tensor_util_env';\nimport { op } from './operation';\n/**\n * Computes reciprocal of square root of the input `tf.Tensor` element-wise:\n * `y = 1 / sqrt(x)`\n *\n * ```js\n * const x = tf.tensor1d([1, 2, 4, -1]);\n *\n * x.rsqrt().print(); // or tf.rsqrt(x)\n * ```\n * @param x The input tensor.\n *\n * @doc {heading: 'Operations', subheading: 'Basic math'}\n */\nfunction rsqrt_(x) {\n const $x = convertToTensor(x, 'x', 'rsqrt', 'float32');\n const inputs = { x: $x };\n return ENGINE.runKernel(Rsqrt, inputs);\n}\nexport const rsqrt = op({ rsqrt_ });\n//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicnNxcnQuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi8uLi90ZmpzLWNvcmUvc3JjL29wcy9yc3FydC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQTs7Ozs7Ozs7Ozs7Ozs7O0dBZUc7QUFFSCxPQUFPLEVBQUMsTUFBTSxFQUFDLE1BQU0sV0FBVyxDQUFDO0FBQ2pDLE9BQU8sRUFBQyxLQUFLLEVBQWMsTUFBTSxpQkFBaUIsQ0FBQztBQUduRCxPQUFPLEVBQUMsZUFBZSxFQUFDLE1BQU0sb0JBQW9CLENBQUM7QUFHbkQsT0FBTyxFQUFDLEVBQUUsRUFBQyxNQUFNLGFBQWEsQ0FBQztBQUUvQjs7Ozs7Ozs7Ozs7O0dBWUc7QUFDSCxTQUFTLE1BQU0sQ0FBbUIsQ0FBZTtJQUMvQyxNQUFNLEVBQUUsR0FBRyxlQUFlLENBQUMsQ0FBQyxFQUFFLEdBQUcsRUFBRSxPQUFPLEVBQUUsU0FBUyxDQUFDLENBQUM7SUFFdkQsTUFBTSxNQUFNLEdBQWdCLEVBQUMsQ0FBQyxFQUFFLEVBQUUsRUFBQyxDQUFDO0lBRXBDLE9BQU8sTUFBTSxDQUFDLFNBQVMsQ0FBQyxLQUFLLEVBQUUsTUFBOEIsQ0FBQyxDQUFDO0FBQ2pFLENBQUM7QUFDRCxNQUFNLENBQUMsTUFBTSxLQUFLLEdBQUcsRUFBRSxDQUFDLEVBQUMsTUFBTSxFQUFDLENBQUMsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbIi8qKlxuICogQGxpY2Vuc2VcbiAqIENvcHlyaWdodCAyMDE4IEdvb2dsZSBMTEMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuXG4gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgXCJMaWNlbnNlXCIpO1xuICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLlxuICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0XG4gKlxuICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wXG4gKlxuICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZVxuICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gXCJBUyBJU1wiIEJBU0lTLFxuICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuXG4gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kXG4gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS5cbiAqID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4gKi9cblxuaW1wb3J0IHtFTkdJTkV9IGZyb20gJy4uL2VuZ2luZSc7XG5pbXBvcnQge1JzcXJ0LCBSc3FydElucHV0c30gZnJvbSAnLi4va2VybmVsX25hbWVzJztcbmltcG9ydCB7VGVuc29yfSBmcm9tICcuLi90ZW5zb3InO1xuaW1wb3J0IHtOYW1lZFRlbnNvck1hcH0gZnJvbSAnLi4vdGVuc29yX3R5cGVzJztcbmltcG9ydCB7Y29udmVydFRvVGVuc29yfSBmcm9tICcuLi90ZW5zb3JfdXRpbF9lbnYnO1xuaW1wb3J0IHtUZW5zb3JMaWtlfSBmcm9tICcuLi90eXBlcyc7XG5cbmltcG9ydCB7b3B9IGZyb20gJy4vb3BlcmF0aW9uJztcblxuLyoqXG4gKiBDb21wdXRlcyByZWNpcHJvY2FsIG9mIHNxdWFyZSByb290IG9mIHRoZSBpbnB1dCBgdGYuVGVuc29yYCBlbGVtZW50LXdpc2U6XG4gKiBgeSA9IDEgLyBzcXJ0KHgpYFxuICpcbiAqIGBgYGpzXG4gKiBjb25zdCB4ID0gdGYudGVuc29yMWQoWzEsIDIsIDQsIC0xXSk7XG4gKlxuICogeC5yc3FydCgpLnByaW50KCk7ICAvLyBvciB0Zi5yc3FydCh4KVxuICogYGBgXG4gKiBAcGFyYW0geCBUaGUgaW5wdXQgdGVuc29yLlxuICpcbiAqIEBkb2Mge2hlYWRpbmc6ICdPcGVyYXRpb25zJywgc3ViaGVhZGluZzogJ0Jhc2ljIG1hdGgnfVxuICovXG5mdW5jdGlvbiByc3FydF88VCBleHRlbmRzIFRlbnNvcj4oeDogVHxUZW5zb3JMaWtlKTogVCB7XG4gIGNvbnN0ICR4ID0gY29udmVydFRvVGVuc29yKHgsICd4JywgJ3JzcXJ0JywgJ2Zsb2F0MzInKTtcblxuICBjb25zdCBpbnB1dHM6IFJzcXJ0SW5wdXRzID0ge3g6ICR4fTtcblxuICByZXR1cm4gRU5HSU5FLnJ1bktlcm5lbChSc3FydCwgaW5wdXRzIGFzIHt9IGFzIE5hbWVkVGVuc29yTWFwKTtcbn1cbmV4cG9ydCBjb25zdCByc3FydCA9IG9wKHtyc3FydF99KTtcbiJdfQ==","/**\n * @license\n * Copyright 2018 Google LLC. All Rights Reserved.\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n * =============================================================================\n */\nimport { isTypedArray } from '../util';\nimport { makeTensor } from './tensor_ops_util';\n/**\n * Creates rank-0 `tf.Tensor` (scalar) with the provided value and dtype.\n *\n * The same functionality can be achieved with `tf.tensor`, but in general\n * we recommend using `tf.scalar` as it makes the code more readable.\n *\n * ```js\n * tf.scalar(3.14).print();\n * ```\n *\n * @param value The value of the scalar.\n * @param dtype The data type.\n *\n * @doc {heading: 'Tensors', subheading: 'Creation'}\n */\nexport function scalar(value, dtype) {\n if (((isTypedArray(value) && dtype !== 'string') || Array.isArray(value)) &&\n dtype !== 'complex64') {\n throw new Error('Error creating a new Scalar: value must be a primitive ' +\n '(number|boolean|string)');\n }\n if (dtype === 'string' && isTypedArray(value) &&\n !(value instanceof Uint8Array)) {\n throw new Error('When making a scalar from encoded string, ' +\n 'the value must be `Uint8Array`.');\n }\n const shape = [];\n const inferredShape = [];\n return makeTensor(value, shape, inferredShape, dtype);\n}\n//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic2NhbGFyLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vLi4vdGZqcy1jb3JlL3NyYy9vcHMvc2NhbGFyLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBOzs7Ozs7Ozs7Ozs7Ozs7R0FlRztBQUlILE9BQU8sRUFBQyxZQUFZLEVBQUMsTUFBTSxTQUFTLENBQUM7QUFDckMsT0FBTyxFQUFDLFVBQVUsRUFBQyxNQUFNLG1CQUFtQixDQUFDO0FBRTdDOzs7Ozs7Ozs7Ozs7OztHQWNHO0FBQ0gsTUFBTSxVQUFVLE1BQU0sQ0FDbEIsS0FBdUMsRUFBRSxLQUFnQjtJQUMzRCxJQUFJLENBQUMsQ0FBQyxZQUFZLENBQUMsS0FBSyxDQUFDLElBQUksS0FBSyxLQUFLLFFBQVEsQ0FBQyxJQUFJLEtBQUssQ0FBQyxPQUFPLENBQUMsS0FBSyxDQUFDLENBQUM7UUFDckUsS0FBSyxLQUFLLFdBQVcsRUFBRTtRQUN6QixNQUFNLElBQUksS0FBSyxDQUNYLHlEQUF5RDtZQUN6RCx5QkFBeUIsQ0FBQyxDQUFDO0tBQ2hDO0lBQ0QsSUFBSSxLQUFLLEtBQUssUUFBUSxJQUFJLFlBQVksQ0FBQyxLQUFLLENBQUM7UUFDekMsQ0FBQyxDQUFDLEtBQUssWUFBWSxVQUFVLENBQUMsRUFBRTtRQUNsQyxNQUFNLElBQUksS0FBSyxDQUNYLDRDQUE0QztZQUM1QyxpQ0FBaUMsQ0FBQyxDQUFDO0tBQ3hDO0lBQ0QsTUFBTSxLQUFLLEdBQWEsRUFBRSxDQUFDO0lBQzNCLE1BQU0sYUFBYSxHQUFhLEVBQUUsQ0FBQztJQUNuQyxPQUFPLFVBQVUsQ0FBQyxLQUFLLEVBQUUsS0FBSyxFQUFFLGFBQWEsRUFBRSxLQUFLLENBQVcsQ0FBQztBQUNsRSxDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiLyoqXG4gKiBAbGljZW5zZVxuICogQ29weXJpZ2h0IDIwMTggR29vZ2xlIExMQy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC5cbiAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSBcIkxpY2Vuc2VcIik7XG4gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuXG4gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXRcbiAqXG4gKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjBcbiAqXG4gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlXG4gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiBcIkFTIElTXCIgQkFTSVMsXG4gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC5cbiAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmRcbiAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLlxuICogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbiAqL1xuXG5pbXBvcnQge1NjYWxhcn0gZnJvbSAnLi4vdGVuc29yJztcbmltcG9ydCB7RGF0YVR5cGV9IGZyb20gJy4uL3R5cGVzJztcbmltcG9ydCB7aXNUeXBlZEFycmF5fSBmcm9tICcuLi91dGlsJztcbmltcG9ydCB7bWFrZVRlbnNvcn0gZnJvbSAnLi90ZW5zb3Jfb3BzX3V0aWwnO1xuXG4vKipcbiAqIENyZWF0ZXMgcmFuay0wIGB0Zi5UZW5zb3JgIChzY2FsYXIpIHdpdGggdGhlIHByb3ZpZGVkIHZhbHVlIGFuZCBkdHlwZS5cbiAqXG4gKiBUaGUgc2FtZSBmdW5jdGlvbmFsaXR5IGNhbiBiZSBhY2hpZXZlZCB3aXRoIGB0Zi50ZW5zb3JgLCBidXQgaW4gZ2VuZXJhbFxuICogd2UgcmVjb21tZW5kIHVzaW5nIGB0Zi5zY2FsYXJgIGFzIGl0IG1ha2VzIHRoZSBjb2RlIG1vcmUgcmVhZGFibGUuXG4gKlxuICogYGBganNcbiAqIHRmLnNjYWxhcigzLjE0KS5wcmludCgpO1xuICogYGBgXG4gKlxuICogQHBhcmFtIHZhbHVlIFRoZSB2YWx1ZSBvZiB0aGUgc2NhbGFyLlxuICogQHBhcmFtIGR0eXBlIFRoZSBkYXRhIHR5cGUuXG4gKlxuICogQGRvYyB7aGVhZGluZzogJ1RlbnNvcnMnLCBzdWJoZWFkaW5nOiAnQ3JlYXRpb24nfVxuICovXG5leHBvcnQgZnVuY3Rpb24gc2NhbGFyKFxuICAgIHZhbHVlOiBudW1iZXJ8Ym9vbGVhbnxzdHJpbmd8VWludDhBcnJheSwgZHR5cGU/OiBEYXRhVHlwZSk6IFNjYWxhciB7XG4gIGlmICgoKGlzVHlwZWRBcnJheSh2YWx1ZSkgJiYgZHR5cGUgIT09ICdzdHJpbmcnKSB8fCBBcnJheS5pc0FycmF5KHZhbHVlKSkgJiZcbiAgICAgIGR0eXBlICE9PSAnY29tcGxleDY0Jykge1xuICAgIHRocm93IG5ldyBFcnJvcihcbiAgICAgICAgJ0Vycm9yIGNyZWF0aW5nIGEgbmV3IFNjYWxhcjogdmFsdWUgbXVzdCBiZSBhIHByaW1pdGl2ZSAnICtcbiAgICAgICAgJyhudW1iZXJ8Ym9vbGVhbnxzdHJpbmcpJyk7XG4gIH1cbiAgaWYgKGR0eXBlID09PSAnc3RyaW5nJyAmJiBpc1R5cGVkQXJyYXkodmFsdWUpICYmXG4gICAgICAhKHZhbHVlIGluc3RhbmNlb2YgVWludDhBcnJheSkpIHtcbiAgICB0aHJvdyBuZXcgRXJyb3IoXG4gICAgICAgICdXaGVuIG1ha2luZyBhIHNjYWxhciBmcm9tIGVuY29kZWQgc3RyaW5nLCAnICtcbiAgICAgICAgJ3RoZSB2YWx1ZSBtdXN0IGJlIGBVaW50OEFycmF5YC4nKTtcbiAgfVxuICBjb25zdCBzaGFwZTogbnVtYmVyW10gPSBbXTtcbiAgY29uc3QgaW5mZXJyZWRTaGFwZTogbnVtYmVyW10gPSBbXTtcbiAgcmV0dXJuIG1ha2VUZW5zb3IodmFsdWUsIHNoYXBlLCBpbmZlcnJlZFNoYXBlLCBkdHlwZSkgYXMgU2NhbGFyO1xufVxuIl19","import { computeStrides, sizeFromShape } from '../util';\n/**\n * Check whether updates.shape = indices.shape[:batchDim] +\n * shape[sliceDim:]\n *\n * @param x The input tensor.\n */\nexport function validateUpdateShape(shape, indices, updates) {\n const sliceDim = (indices.rank > 1) ? indices.shape[indices.rank - 1] : 1;\n const batchDim = (indices.rank > 1) ? indices.rank - 1 : 1;\n const shapeError = 'Must have updates.shape = indices.shape[:batchDim] + ' +\n `shape[sliceDim:], got updates.shape: ${updates.shape}` +\n `, indices.shape: ${indices.shape}, shape: ${shape}` +\n `, sliceDim: ${sliceDim}, and batchDim: ${batchDim}.`;\n if (updates.rank < batchDim) {\n throw new Error(shapeError + ` update.rank < ${batchDim}. `);\n }\n if (shape.length < sliceDim + (updates.rank - batchDim)) {\n throw new Error(shapeError +\n ` Output shape length < ${sliceDim + (updates.rank - batchDim)}`);\n }\n if (updates.rank !== batchDim + shape.length - sliceDim) {\n throw new Error(shapeError + ` update.rank != ${batchDim + shape.length - sliceDim}`);\n }\n for (let d = 0; d < batchDim; ++d) {\n if (updates.shape[d] !== indices.shape[d]) {\n throw new Error(shapeError +\n ` updates.shape[${d}] (${updates.shape[d]}) != indices.shape[${d}] (${indices.shape[d]}).`);\n }\n }\n for (let d = 0; d < updates.rank - batchDim; ++d) {\n if (updates.shape[d + batchDim] !== shape[d + sliceDim]) {\n throw new Error(shapeError +\n ` updates.shape[${d + batchDim}] (${updates.shape[d + batchDim]}) != shape[${d + batchDim}] (${shape[d + batchDim]})`);\n }\n }\n}\n/**\n * Validate scatter nd inputs.\n *\n * @param update The tensor contains the update values.\n * @param indices The tensor contains the indices for the update values.\n * @param shape The shape of the output tensor.\n */\nexport function validateInput(updates, indices, shape) {\n if (indices.rank < 1) {\n throw new Error('tf.scatterND() expects the indices to be rank 1 or higher,' +\n ` but the rank was ${indices.rank}.`);\n }\n if (updates.rank < 1) {\n throw new Error('tf.scatterND() expects the updates to be rank 1 or higher,' +\n ` but the rank was ${updates.rank}.`);\n }\n if (indices.dtype !== 'int32') {\n throw new Error(`The dtype of 'indices' should be int32, but got dtype: ${indices.dtype}`);\n }\n if (shape.length < 1) {\n throw new Error(`Output rank must be greater or equal to 1, but got shape: ${shape}`);\n }\n if (shape.length === 0) {\n if (indices.size === 0) {\n throw new Error(`Indices specified for empty output. indices shape: ${indices.shape}`);\n }\n if (updates.size === 0) {\n throw new Error(`Updates specified for empty output. updates shape: ${updates.shape}`);\n }\n }\n validateUpdateShape(shape, indices, updates);\n}\n/**\n * Calculate the shape information for the output.\n *\n * @param update The tensor contains the update values.\n * @param indices The tensor contains the indices for the update values.\n * @param shape The shape of the output tensor.\n *\n * @returns ScatterShapeInfo\n */\nexport function calculateShapes(updates, indices, shape) {\n // Calculate the number of dimensions in indices\n const indicesRank = indices.shape.length;\n const sliceRank = (indicesRank > 1) ? indices.shape[indicesRank - 1] : 1;\n // Calculate the number of elements that make up each slice of our updated\n // tensor. This allows us to work with flattened tensors and copy over whole\n // slices at a time.\n const totalNd = shape.length;\n let sliceSize = 1;\n for (let i = sliceRank; i < totalNd; ++i) {\n sliceSize *= shape[i];\n }\n const safeSliceDim = (sliceRank < 1) ? 1 : sliceRank;\n const numUpdates = sizeFromShape(indices.shape) / safeSliceDim;\n const strides = [...computeStrides(shape.slice(0, sliceRank)), 1];\n const outputSize = sizeFromShape(shape);\n return { sliceRank, numUpdates, sliceSize, strides, outputSize };\n}\n//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic2NhdHRlcl9uZF91dGlsLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vLi4vdGZqcy1jb3JlL3NyYy9vcHMvc2NhdHRlcl9uZF91dGlsLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQWtCQSxPQUFPLEVBQUMsY0FBYyxFQUFFLGFBQWEsRUFBQyxNQUFNLFNBQVMsQ0FBQztBQUV0RDs7Ozs7R0FLRztBQUNILE1BQU0sVUFBVSxtQkFBbUIsQ0FDL0IsS0FBZSxFQUFFLE9BQWUsRUFBRSxPQUFlO0lBQ25ELE1BQU0sUUFBUSxHQUFHLENBQUMsT0FBTyxDQUFDLElBQUksR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsT0FBTyxDQUFDLEtBQUssQ0FBQyxPQUFPLENBQUMsSUFBSSxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUM7SUFDMUUsTUFBTSxRQUFRLEdBQUcsQ0FBQyxPQUFPLENBQUMsSUFBSSxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxPQUFPLENBQUMsSUFBSSxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDO0lBRTNELE1BQU0sVUFBVSxHQUFHLHVEQUF1RDtRQUN0RSx3Q0FBd0MsT0FBTyxDQUFDLEtBQUssRUFBRTtRQUN2RCxvQkFBb0IsT0FBTyxDQUFDLEtBQUssWUFBWSxLQUFLLEVBQUU7UUFDcEQsZUFBZSxRQUFRLG1CQUFtQixRQUFRLEdBQUcsQ0FBQztJQUUxRCxJQUFJLE9BQU8sQ0FBQyxJQUFJLEdBQUcsUUFBUSxFQUFFO1FBQzNCLE1BQU0sSUFBSSxLQUFLLENBQUMsVUFBVSxHQUFHLGtCQUFrQixRQUFRLElBQUksQ0FBQyxDQUFDO0tBQzlEO0lBQ0QsSUFBSSxLQUFLLENBQUMsTUFBTSxHQUFHLFFBQVEsR0FBRyxDQUFDLE9BQU8sQ0FBQyxJQUFJLEdBQUcsUUFBUSxDQUFDLEVBQUU7UUFDdkQsTUFBTSxJQUFJLEtBQUssQ0FDWCxVQUFVO1lBQ1YsMEJBQTBCLFFBQVEsR0FBRyxDQUFDLE9BQU8sQ0FBQyxJQUFJLEdBQUcsUUFBUSxDQUFDLEVBQUUsQ0FBQyxDQUFDO0tBQ3ZFO0lBQ0QsSUFBSSxPQUFPLENBQUMsSUFBSSxLQUFLLFFBQVEsR0FBRyxLQUFLLENBQUMsTUFBTSxHQUFHLFFBQVEsRUFBRTtRQUN2RCxNQUFNLElBQUksS0FBSyxDQUNYLFVBQVUsR0FBRyxtQkFBbUIsUUFBUSxHQUFHLEtBQUssQ0FBQyxNQUFNLEdBQUcsUUFBUSxFQUFFLENBQUMsQ0FBQztLQUMzRTtJQUNELEtBQUssSUFBSSxDQUFDLEdBQUcsQ0FBQyxFQUFFLENBQUMsR0FBRyxRQUFRLEVBQUUsRUFBRSxDQUFDLEVBQUU7UUFDakMsSUFBSSxPQUFPLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQyxLQUFLLE9BQU8sQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDLEVBQUU7WUFDekMsTUFBTSxJQUFJLEtBQUssQ0FDWCxVQUFVO2dCQUNWLGtCQUFrQixDQUFDLE1BQU0sT0FBTyxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUMsc0JBQXNCLENBQUMsTUFDNUQsT0FBTyxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUM7U0FDL0I7S0FDRjtJQUNELEtBQUssSUFBSSxDQUFDLEdBQUcsQ0FBQyxFQUFFLENBQUMsR0FBRyxPQUFPLENBQUMsSUFBSSxHQUFHLFFBQVEsRUFBRSxFQUFFLENBQUMsRUFBRTtRQUNoRCxJQUFJLE9BQU8sQ0FBQyxLQUFLLENBQUMsQ0FBQyxHQUFHLFFBQVEsQ0FBQyxLQUFLLEtBQUssQ0FBQyxDQUFDLEdBQUcsUUFBUSxDQUFDLEVBQUU7WUFDdkQsTUFBTSxJQUFJLEtBQUssQ0FDWCxVQUFVO2dCQUNWLGtCQUFrQixDQUFDLEdBQUcsUUFBUSxNQUMxQixPQUFPLENBQUMsS0FBSyxDQUFDLENBQUMsR0FBRyxRQUFRLENBQUMsY0FBYyxDQUFDLEdBQUcsUUFBUSxNQUNyRCxLQUFLLENBQUMsQ0FBQyxHQUFHLFFBQVEsQ0FBQyxHQUFHLENBQUMsQ0FBQztTQUNqQztLQUNGO0FBQ0gsQ0FBQztBQVNEOzs7Ozs7R0FNRztBQUNILE1BQU0sVUFBVSxhQUFhLENBQ3pCLE9BQWUsRUFBRSxPQUFlLEVBQUUsS0FBZTtJQUNuRCxJQUFJLE9BQU8sQ0FBQyxJQUFJLEdBQUcsQ0FBQyxFQUFFO1FBQ3BCLE1BQU0sSUFBSSxLQUFLLENBQ1gsNERBQTREO1lBQzVELHFCQUFxQixPQUFPLENBQUMsSUFBSSxHQUFHLENBQUMsQ0FBQztLQUMzQztJQUNELElBQUksT0FBTyxDQUFDLElBQUksR0FBRyxDQUFDLEVBQUU7UUFDcEIsTUFBTSxJQUFJLEtBQUssQ0FDWCw0REFBNEQ7WUFDNUQscUJBQXFCLE9BQU8sQ0FBQyxJQUFJLEdBQUcsQ0FBQyxDQUFDO0tBQzNDO0lBQ0QsSUFBSSxPQUFPLENBQUMsS0FBSyxLQUFLLE9BQU8sRUFBRTtRQUM3QixNQUFNLElBQUksS0FBSyxDQUFDLDBEQUNaLE9BQU8sQ0FBQyxLQUFLLEVBQUUsQ0FBQyxDQUFDO0tBQ3RCO0lBQ0QsSUFBSSxLQUFLLENBQUMsTUFBTSxHQUFHLENBQUMsRUFBRTtRQUNwQixNQUFNLElBQUksS0FBSyxDQUNYLDZEQUE2RCxLQUFLLEVBQUUsQ0FBQyxDQUFDO0tBQzNFO0lBRUQsSUFBSSxLQUFLLENBQUMsTUFBTSxLQUFLLENBQUMsRUFBRTtRQUN0QixJQUFJLE9BQU8sQ0FBQyxJQUFJLEtBQUssQ0FBQyxFQUFFO1lBQ3RCLE1BQU0sSUFBSSxLQUFLLENBQUMsc0RBQ1osT0FBTyxDQUFDLEtBQUssRUFBRSxDQUFDLENBQUM7U0FDdEI7UUFDRCxJQUFJLE9BQU8sQ0FBQyxJQUFJLEtBQUssQ0FBQyxFQUFFO1lBQ3RCLE1BQU0sSUFBSSxLQUFLLENBQUMsc0RBQ1osT0FBTyxDQUFDLEtBQUssRUFBRSxDQUFDLENBQUM7U0FDdEI7S0FDRjtJQUVELG1CQUFtQixDQUFDLEtBQUssRUFBRSxPQUFPLEVBQUUsT0FBTyxDQUFDLENBQUM7QUFDL0MsQ0FBQztBQUVEOzs7Ozs7OztHQVFHO0FBQ0gsTUFBTSxVQUFVLGVBQWUsQ0FDM0IsT0FBbUIsRUFBRSxPQUFtQixFQUN4QyxLQUFlO0lBQ2pCLGdEQUFnRDtJQUNoRCxNQUFNLFdBQVcsR0FBRyxPQUFPLENBQUMsS0FBSyxDQUFDLE1BQU0sQ0FBQztJQUN6QyxNQUFNLFNBQVMsR0FBRyxDQUFDLFdBQVcsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsT0FBTyxDQUFDLEtBQUssQ0FBQyxXQUFXLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQztJQUV6RSwwRUFBMEU7SUFDMUUsNEVBQTRFO0lBQzVFLG9CQUFvQjtJQUNwQixNQUFNLE9BQU8sR0FBRyxLQUFLLENBQUMsTUFBTSxDQUFDO0lBRTdCLElBQUksU0FBUyxHQUFHLENBQUMsQ0FBQztJQUNsQixLQUFLLElBQUksQ0FBQyxHQUFHLFNBQVMsRUFBRSxDQUFDLEdBQUcsT0FBTyxFQUFFLEVBQUUsQ0FBQyxFQUFFO1FBQ3hDLFNBQVMsSUFBSSxLQUFLLENBQUMsQ0FBQyxDQUFDLENBQUM7S0FDdkI7SUFFRCxNQUFNLFlBQVksR0FBRyxDQUFDLFNBQVMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxTQUFTLENBQUM7SUFDckQsTUFBTSxVQUFVLEdBQUcsYUFBYSxDQUFDLE9BQU8sQ0FBQyxLQUFLLENBQUMsR0FBRyxZQUFZLENBQUM7SUFFL0QsTUFBTSxPQUFPLEdBQUcsQ0FBQyxHQUFHLGNBQWMsQ0FBQyxLQUFLLENBQUMsS0FBSyxDQUFDLENBQUMsRUFBRSxTQUFTLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDO0lBQ2xFLE1BQU0sVUFBVSxHQUFHLGFBQWEsQ0FBQyxLQUFLLENBQUMsQ0FBQztJQUN4QyxPQUFPLEVBQUMsU0FBUyxFQUFFLFVBQVUsRUFBRSxTQUFTLEVBQUUsT0FBTyxFQUFFLFVBQVUsRUFBQyxDQUFDO0FBQ2pFLENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyIvKipcbiAqIEBsaWNlbnNlXG4gKiBDb3B5cmlnaHQgMjAxOCBHb29nbGUgTExDLiBBbGwgUmlnaHRzIFJlc2VydmVkLlxuICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlIFwiTGljZW5zZVwiKTtcbiAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS5cbiAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdFxuICpcbiAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMFxuICpcbiAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmVcbiAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuIFwiQVMgSVNcIiBCQVNJUyxcbiAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLlxuICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZFxuICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuXG4gKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuICovXG5pbXBvcnQge1RlbnNvckluZm99IGZyb20gJy4uL2tlcm5lbF9yZWdpc3RyeSc7XG5pbXBvcnQge1RlbnNvcn0gZnJvbSAnLi4vdGVuc29yJztcbmltcG9ydCB7Y29tcHV0ZVN0cmlkZXMsIHNpemVGcm9tU2hhcGV9IGZyb20gJy4uL3V0aWwnO1xuXG4vKipcbiAqIENoZWNrIHdoZXRoZXIgdXBkYXRlcy5zaGFwZSA9IGluZGljZXMuc2hhcGVbOmJhdGNoRGltXSArXG4gKiBzaGFwZVtzbGljZURpbTpdXG4gKlxuICogQHBhcmFtIHggVGhlIGlucHV0IHRlbnNvci5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHZhbGlkYXRlVXBkYXRlU2hhcGUoXG4gICAgc2hhcGU6IG51bWJlcltdLCBpbmRpY2VzOiBUZW5zb3IsIHVwZGF0ZXM6IFRlbnNvcikge1xuICBjb25zdCBzbGljZURpbSA9IChpbmRpY2VzLnJhbmsgPiAxKSA/IGluZGljZXMuc2hhcGVbaW5kaWNlcy5yYW5rIC0gMV0gOiAxO1xuICBjb25zdCBiYXRjaERpbSA9IChpbmRpY2VzLnJhbmsgPiAxKSA/IGluZGljZXMucmFuayAtIDEgOiAxO1xuXG4gIGNvbnN0IHNoYXBlRXJyb3IgPSAnTXVzdCBoYXZlIHVwZGF0ZXMuc2hhcGUgPSBpbmRpY2VzLnNoYXBlWzpiYXRjaERpbV0gKyAnICtcbiAgICAgIGBzaGFwZVtzbGljZURpbTpdLCBnb3QgdXBkYXRlcy5zaGFwZTogJHt1cGRhdGVzLnNoYXBlfWAgK1xuICAgICAgYCwgaW5kaWNlcy5zaGFwZTogJHtpbmRpY2VzLnNoYXBlfSwgc2hhcGU6ICR7c2hhcGV9YCArXG4gICAgICBgLCBzbGljZURpbTogJHtzbGljZURpbX0sIGFuZCBiYXRjaERpbTogJHtiYXRjaERpbX0uYDtcblxuICBpZiAodXBkYXRlcy5yYW5rIDwgYmF0Y2hEaW0pIHtcbiAgICB0aHJvdyBuZXcgRXJyb3Ioc2hhcGVFcnJvciArIGAgdXBkYXRlLnJhbmsgPCAke2JhdGNoRGltfS4gYCk7XG4gIH1cbiAgaWYgKHNoYXBlLmxlbmd0aCA8IHNsaWNlRGltICsgKHVwZGF0ZXMucmFuayAtIGJhdGNoRGltKSkge1xuICAgIHRocm93IG5ldyBFcnJvcihcbiAgICAgICAgc2hhcGVFcnJvciArXG4gICAgICAgIGAgT3V0cHV0IHNoYXBlIGxlbmd0aCA8ICR7c2xpY2VEaW0gKyAodXBkYXRlcy5yYW5rIC0gYmF0Y2hEaW0pfWApO1xuICB9XG4gIGlmICh1cGRhdGVzLnJhbmsgIT09IGJhdGNoRGltICsgc2hhcGUubGVuZ3RoIC0gc2xpY2VEaW0pIHtcbiAgICB0aHJvdyBuZXcgRXJyb3IoXG4gICAgICAgIHNoYXBlRXJyb3IgKyBgIHVwZGF0ZS5yYW5rICE9ICR7YmF0Y2hEaW0gKyBzaGFwZS5sZW5ndGggLSBzbGljZURpbX1gKTtcbiAgfVxuICBmb3IgKGxldCBkID0gMDsgZCA8IGJhdGNoRGltOyArK2QpIHtcbiAgICBpZiAodXBkYXRlcy5zaGFwZVtkXSAhPT0gaW5kaWNlcy5zaGFwZVtkXSkge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKFxuICAgICAgICAgIHNoYXBlRXJyb3IgK1xuICAgICAgICAgIGAgdXBkYXRlcy5zaGFwZVske2R9XSAoJHt1cGRhdGVzLnNoYXBlW2RdfSkgIT0gaW5kaWNlcy5zaGFwZVske2R9XSAoJHtcbiAgICAgICAgICAgICAgaW5kaWNlcy5zaGFwZVtkXX0pLmApO1xuICAgIH1cbiAgfVxuICBmb3IgKGxldCBkID0gMDsgZCA8IHVwZGF0ZXMucmFuayAtIGJhdGNoRGltOyArK2QpIHtcbiAgICBpZiAodXBkYXRlcy5zaGFwZVtkICsgYmF0Y2hEaW1dICE9PSBzaGFwZVtkICsgc2xpY2VEaW1dKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoXG4gICAgICAgICAgc2hhcGVFcnJvciArXG4gICAgICAgICAgYCB1cGRhdGVzLnNoYXBlWyR7ZCArIGJhdGNoRGltfV0gKCR7XG4gICAgICAgICAgICAgIHVwZGF0ZXMuc2hhcGVbZCArIGJhdGNoRGltXX0pICE9IHNoYXBlWyR7ZCArIGJhdGNoRGltfV0gKCR7XG4gICAgICAgICAgICAgIHNoYXBlW2QgKyBiYXRjaERpbV19KWApO1xuICAgIH1cbiAgfVxufVxuXG5leHBvcnQgaW50ZXJmYWNlIFNjYXR0ZXJTaGFwZUluZm8ge1xuICBzbGljZVJhbms6IG51bWJlcjtcbiAgbnVtVXBkYXRlczogbnVtYmVyO1xuICBzbGljZVNpemU6IG51bWJlcjtcbiAgc3RyaWRlczogbnVtYmVyW107XG4gIG91dHB1dFNpemU6IG51bWJlcjtcbn1cbi8qKlxuICogVmFsaWRhdGUgc2NhdHRlciBuZCBpbnB1dHMuXG4gKlxuICogQHBhcmFtIHVwZGF0ZSBUaGUgdGVuc29yIGNvbnRhaW5zIHRoZSB1cGRhdGUgdmFsdWVzLlxuICogQHBhcmFtIGluZGljZXMgVGhlIHRlbnNvciBjb250YWlucyB0aGUgaW5kaWNlcyBmb3IgdGhlIHVwZGF0ZSB2YWx1ZXMuXG4gKiBAcGFyYW0gc2hhcGUgVGhlIHNoYXBlIG9mIHRoZSBvdXRwdXQgdGVuc29yLlxuICovXG5leHBvcnQgZnVuY3Rpb24gdmFsaWRhdGVJbnB1dChcbiAgICB1cGRhdGVzOiBUZW5zb3IsIGluZGljZXM6IFRlbnNvciwgc2hhcGU6IG51bWJlcltdKSB7XG4gIGlmIChpbmRpY2VzLnJhbmsgPCAxKSB7XG4gICAgdGhyb3cgbmV3IEVycm9yKFxuICAgICAgICAndGYuc2NhdHRlck5EKCkgZXhwZWN0cyB0aGUgaW5kaWNlcyB0byBiZSByYW5rIDEgb3IgaGlnaGVyLCcgK1xuICAgICAgICBgIGJ1dCB0aGUgcmFuayB3YXMgJHtpbmRpY2VzLnJhbmt9LmApO1xuICB9XG4gIGlmICh1cGRhdGVzLnJhbmsgPCAxKSB7XG4gICAgdGhyb3cgbmV3IEVycm9yKFxuICAgICAgICAndGYuc2NhdHRlck5EKCkgZXhwZWN0cyB0aGUgdXBkYXRlcyB0byBiZSByYW5rIDEgb3IgaGlnaGVyLCcgK1xuICAgICAgICBgIGJ1dCB0aGUgcmFuayB3YXMgJHt1cGRhdGVzLnJhbmt9LmApO1xuICB9XG4gIGlmIChpbmRpY2VzLmR0eXBlICE9PSAnaW50MzInKSB7XG4gICAgdGhyb3cgbmV3IEVycm9yKGBUaGUgZHR5cGUgb2YgJ2luZGljZXMnIHNob3VsZCBiZSBpbnQzMiwgYnV0IGdvdCBkdHlwZTogJHtcbiAgICAgICAgaW5kaWNlcy5kdHlwZX1gKTtcbiAgfVxuICBpZiAoc2hhcGUubGVuZ3RoIDwgMSkge1xuICAgIHRocm93IG5ldyBFcnJvcihcbiAgICAgICAgYE91dHB1dCByYW5rIG11c3QgYmUgZ3JlYXRlciBvciBlcXVhbCB0byAxLCBidXQgZ290IHNoYXBlOiAke3NoYXBlfWApO1xuICB9XG5cbiAgaWYgKHNoYXBlLmxlbmd0aCA9PT0gMCkge1xuICAgIGlmIChpbmRpY2VzLnNpemUgPT09IDApIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcihgSW5kaWNlcyBzcGVjaWZpZWQgZm9yIGVtcHR5IG91dHB1dC4gaW5kaWNlcyBzaGFwZTogJHtcbiAgICAgICAgICBpbmRpY2VzLnNoYXBlfWApO1xuICAgIH1cbiAgICBpZiAodXBkYXRlcy5zaXplID09PSAwKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoYFVwZGF0ZXMgc3BlY2lmaWVkIGZvciBlbXB0eSBvdXRwdXQuIHVwZGF0ZXMgc2hhcGU6ICR7XG4gICAgICAgICAgdXBkYXRlcy5zaGFwZX1gKTtcbiAgICB9XG4gIH1cblxuICB2YWxpZGF0ZVVwZGF0ZVNoYXBlKHNoYXBlLCBpbmRpY2VzLCB1cGRhdGVzKTtcbn1cblxuLyoqXG4gKiBDYWxjdWxhdGUgdGhlIHNoYXBlIGluZm9ybWF0aW9uIGZvciB0aGUgb3V0cHV0LlxuICpcbiAqIEBwYXJhbSB1cGRhdGUgVGhlIHRlbnNvciBjb250YWlucyB0aGUgdXBkYXRlIHZhbHVlcy5cbiAqIEBwYXJhbSBpbmRpY2VzIFRoZSB0ZW5zb3IgY29udGFpbnMgdGhlIGluZGljZXMgZm9yIHRoZSB1cGRhdGUgdmFsdWVzLlxuICogQHBhcmFtIHNoYXBlIFRoZSBzaGFwZSBvZiB0aGUgb3V0cHV0IHRlbnNvci5cbiAqXG4gKiBAcmV0dXJucyBTY2F0dGVyU2hhcGVJbmZvXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBjYWxjdWxhdGVTaGFwZXMoXG4gICAgdXBkYXRlczogVGVuc29ySW5mbywgaW5kaWNlczogVGVuc29ySW5mbyxcbiAgICBzaGFwZTogbnVtYmVyW10pOiBTY2F0dGVyU2hhcGVJbmZvIHtcbiAgLy8gQ2FsY3VsYXRlIHRoZSBudW1iZXIgb2YgZGltZW5zaW9ucyBpbiBpbmRpY2VzXG4gIGNvbnN0IGluZGljZXNSYW5rID0gaW5kaWNlcy5zaGFwZS5sZW5ndGg7XG4gIGNvbnN0IHNsaWNlUmFuayA9IChpbmRpY2VzUmFuayA+IDEpID8gaW5kaWNlcy5zaGFwZVtpbmRpY2VzUmFuayAtIDFdIDogMTtcblxuICAvLyBDYWxjdWxhdGUgdGhlIG51bWJlciBvZiBlbGVtZW50cyB0aGF0IG1ha2UgdXAgZWFjaCBzbGljZSBvZiBvdXIgdXBkYXRlZFxuICAvLyB0ZW5zb3IuIFRoaXMgYWxsb3dzIHVzIHRvIHdvcmsgd2l0aCBmbGF0dGVuZWQgdGVuc29ycyBhbmQgY29weSBvdmVyIHdob2xlXG4gIC8vIHNsaWNlcyBhdCBhIHRpbWUuXG4gIGNvbnN0IHRvdGFsTmQgPSBzaGFwZS5sZW5ndGg7XG5cbiAgbGV0IHNsaWNlU2l6ZSA9IDE7XG4gIGZvciAobGV0IGkgPSBzbGljZVJhbms7IGkgPCB0b3RhbE5kOyArK2kpIHtcbiAgICBzbGljZVNpemUgKj0gc2hhcGVbaV07XG4gIH1cblxuICBjb25zdCBzYWZlU2xpY2VEaW0gPSAoc2xpY2VSYW5rIDwgMSkgPyAxIDogc2xpY2VSYW5rO1xuICBjb25zdCBudW1VcGRhdGVzID0gc2l6ZUZyb21TaGFwZShpbmRpY2VzLnNoYXBlKSAvIHNhZmVTbGljZURpbTtcblxuICBjb25zdCBzdHJpZGVzID0gWy4uLmNvbXB1dGVTdHJpZGVzKHNoYXBlLnNsaWNlKDAsIHNsaWNlUmFuaykpLCAxXTtcbiAgY29uc3Qgb3V0cHV0U2l6ZSA9IHNpemVGcm9tU2hhcGUoc2hhcGUpO1xuICByZXR1cm4ge3NsaWNlUmFuaywgbnVtVXBkYXRlcywgc2xpY2VTaXplLCBzdHJpZGVzLCBvdXRwdXRTaXplfTtcbn1cbiJdfQ==","/**\n * @license\n * Copyright 2020 Google LLC. All Rights Reserved.\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n * =============================================================================\n */\nimport { ENGINE } from '../engine';\nimport { Selu } from '../kernel_names';\nimport { convertToTensor } from '../tensor_util_env';\nimport { op } from './operation';\n/**\n * Computes scaled exponential linear element-wise.\n *\n * `x < 0 ? scale * alpha * (exp(x) - 1) : scale * x`\n *\n * ```js\n * const x = tf.tensor1d([-1, 2, -3, 4]);\n *\n * x.selu().print(); // or tf.selu(x)\n * ```\n * @param x The input tensor.\n *\n * @doc {heading: 'Operations', subheading: 'Basic math'}\n */\nfunction selu_(x) {\n const $x = convertToTensor(x, 'x', 'selu');\n const inputs = { x: $x };\n return ENGINE.runKernel(Selu, inputs);\n}\nexport const selu = op({ selu_ });\n//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic2VsdS5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uLy4uL3RmanMtY29yZS9zcmMvb3BzL3NlbHUudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUE7Ozs7Ozs7Ozs7Ozs7OztHQWVHO0FBRUgsT0FBTyxFQUFDLE1BQU0sRUFBQyxNQUFNLFdBQVcsQ0FBQztBQUNqQyxPQUFPLEVBQUMsSUFBSSxFQUFhLE1BQU0saUJBQWlCLENBQUM7QUFHakQsT0FBTyxFQUFDLGVBQWUsRUFBQyxNQUFNLG9CQUFvQixDQUFDO0FBR25ELE9BQU8sRUFBQyxFQUFFLEVBQUMsTUFBTSxhQUFhLENBQUM7QUFFL0I7Ozs7Ozs7Ozs7Ozs7R0FhRztBQUNILFNBQVMsS0FBSyxDQUFtQixDQUFlO0lBQzlDLE1BQU0sRUFBRSxHQUFHLGVBQWUsQ0FBQyxDQUFDLEVBQUUsR0FBRyxFQUFFLE1BQU0sQ0FBQyxDQUFDO0lBRTNDLE1BQU0sTUFBTSxHQUFlLEVBQUMsQ0FBQyxFQUFFLEVBQUUsRUFBQyxDQUFDO0lBRW5DLE9BQU8sTUFBTSxDQUFDLFNBQVMsQ0FBQyxJQUFJLEVBQUUsTUFBOEIsQ0FBQyxDQUFDO0FBQ2hFLENBQUM7QUFFRCxNQUFNLENBQUMsTUFBTSxJQUFJLEdBQUcsRUFBRSxDQUFDLEVBQUMsS0FBSyxFQUFDLENBQUMsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbIi8qKlxuICogQGxpY2Vuc2VcbiAqIENvcHlyaWdodCAyMDIwIEdvb2dsZSBMTEMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuXG4gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgXCJMaWNlbnNlXCIpO1xuICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLlxuICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0XG4gKlxuICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wXG4gKlxuICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZVxuICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gXCJBUyBJU1wiIEJBU0lTLFxuICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuXG4gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kXG4gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS5cbiAqID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4gKi9cblxuaW1wb3J0IHtFTkdJTkV9IGZyb20gJy4uL2VuZ2luZSc7XG5pbXBvcnQge1NlbHUsIFNlbHVJbnB1dHN9IGZyb20gJy4uL2tlcm5lbF9uYW1lcyc7XG5pbXBvcnQge1RlbnNvcn0gZnJvbSAnLi4vdGVuc29yJztcbmltcG9ydCB7TmFtZWRUZW5zb3JNYXB9IGZyb20gJy4uL3RlbnNvcl90eXBlcyc7XG5pbXBvcnQge2NvbnZlcnRUb1RlbnNvcn0gZnJvbSAnLi4vdGVuc29yX3V0aWxfZW52JztcbmltcG9ydCB7VGVuc29yTGlrZX0gZnJvbSAnLi4vdHlwZXMnO1xuXG5pbXBvcnQge29wfSBmcm9tICcuL29wZXJhdGlvbic7XG5cbi8qKlxuICogQ29tcHV0ZXMgc2NhbGVkIGV4cG9uZW50aWFsIGxpbmVhciBlbGVtZW50LXdpc2UuXG4gKlxuICogYHggPCAwID8gc2NhbGUgKiBhbHBoYSAqIChleHAoeCkgLSAxKSA6IHNjYWxlICogeGBcbiAqXG4gKiBgYGBqc1xuICogY29uc3QgeCA9IHRmLnRlbnNvcjFkKFstMSwgMiwgLTMsIDRdKTtcbiAqXG4gKiB4LnNlbHUoKS5wcmludCgpOyAgLy8gb3IgdGYuc2VsdSh4KVxuICogYGBgXG4gKiBAcGFyYW0geCBUaGUgaW5wdXQgdGVuc29yLlxuICpcbiAqIEBkb2Mge2hlYWRpbmc6ICdPcGVyYXRpb25zJywgc3ViaGVhZGluZzogJ0Jhc2ljIG1hdGgnfVxuICovXG5mdW5jdGlvbiBzZWx1XzxUIGV4dGVuZHMgVGVuc29yPih4OiBUfFRlbnNvckxpa2UpOiBUIHtcbiAgY29uc3QgJHggPSBjb252ZXJ0VG9UZW5zb3IoeCwgJ3gnLCAnc2VsdScpO1xuXG4gIGNvbnN0IGlucHV0czogU2VsdUlucHV0cyA9IHt4OiAkeH07XG5cbiAgcmV0dXJuIEVOR0lORS5ydW5LZXJuZWwoU2VsdSwgaW5wdXRzIGFzIHt9IGFzIE5hbWVkVGVuc29yTWFwKTtcbn1cblxuZXhwb3J0IGNvbnN0IHNlbHUgPSBvcCh7c2VsdV99KTtcbiJdfQ==","/**\n * @license\n * Copyright 2018 Google LLC. All Rights Reserved.\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n * =============================================================================\n */\nexport const SELU_SCALEALPHA = 1.7580993408473768599402175208123;\nexport const SELU_SCALE = 1.0507009873554804934193349852946;\n//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic2VsdV91dGlsLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vLi4vdGZqcy1jb3JlL3NyYy9vcHMvc2VsdV91dGlsLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBOzs7Ozs7Ozs7Ozs7Ozs7R0FlRztBQUVILE1BQU0sQ0FBQyxNQUFNLGVBQWUsR0FBRyxpQ0FBaUMsQ0FBQztBQUNqRSxNQUFNLENBQUMsTUFBTSxVQUFVLEdBQUcsaUNBQWlDLENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyIvKipcbiAqIEBsaWNlbnNlXG4gKiBDb3B5cmlnaHQgMjAxOCBHb29nbGUgTExDLiBBbGwgUmlnaHRzIFJlc2VydmVkLlxuICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlIFwiTGljZW5zZVwiKTtcbiAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS5cbiAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdFxuICpcbiAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMFxuICpcbiAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmVcbiAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuIFwiQVMgSVNcIiBCQVNJUyxcbiAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLlxuICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZFxuICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuXG4gKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuICovXG5cbmV4cG9ydCBjb25zdCBTRUxVX1NDQUxFQUxQSEEgPSAxLjc1ODA5OTM0MDg0NzM3Njg1OTk0MDIxNzUyMDgxMjM7XG5leHBvcnQgY29uc3QgU0VMVV9TQ0FMRSA9IDEuMDUwNzAwOTg3MzU1NDgwNDkzNDE5MzM0OTg1Mjk0NjtcbiJdfQ==","import { convertToTensor } from '../tensor_util_env';\nimport * as util from '../util';\nimport { conv2d } from './conv2d';\nimport { depthwiseConv2d } from './depthwise_conv2d';\nimport { op } from './operation';\nimport { reshape } from './reshape';\n/**\n * 2-D convolution with separable filters.\n *\n * Performs a depthwise convolution that acts separately on channels followed\n * by a pointwise convolution that mixes channels. Note that this is\n * separability between dimensions [1, 2] and 3, not spatial separability\n * between dimensions 1 and 2.\n *\n * See\n * [https://www.tensorflow.org/api_docs/python/tf/nn/separable_conv2d](\n * https://www.tensorflow.org/api_docs/python/tf/nn/separable_conv2d)\n * for more details.\n *\n * @param x The input tensor, of rank 4 or rank 3, of shape\n * `[batch, height, width, inChannels]`. If rank 3, batch of 1 is\n * assumed.\n * @param depthwiseFilter The depthwise filter tensor, rank 4, of shape\n * `[filterHeight, filterWidth, inChannels, channelMultiplier]`. This is\n * the filter used in the first step.\n * @param pointwiseFilter The pointwise filter tensor, rank 4, of shape\n * `[1, 1, inChannels * channelMultiplier, outChannels]`. This is\n * the filter used in the second step.\n * @param strides The strides of the convolution: `[strideHeight,\n * strideWidth]`. If strides is a single number, then `strideHeight ==\n * strideWidth`.\n * @param pad The type of padding algorithm.\n * - `same` and stride 1: output will be of same size as input,\n * regardless of filter size.\n * - `valid`: output will be smaller than input if filter is larger\n * than 1x1.\n * - For more info, see this guide:\n * [https://www.tensorflow.org/api_docs/python/tf/nn/convolution](\n * https://www.tensorflow.org/api_docs/python/tf/nn/convolution)\n * @param dilations The dilation rates: `[dilationHeight, dilationWidth]`\n * in which we sample input values across the height and width dimensions\n * in atrous convolution. Defaults to `[1, 1]`. If `rate` is a single\n * number, then `dilationHeight == dilationWidth`. If it is greater than\n * 1, then all values of `strides` must be 1.\n * @param dataFormat: An optional string from: \"NHWC\", \"NCHW\". Defaults to\n * \"NHWC\". Specify the data format of the input and output data. With the\n * default format \"NHWC\", the data is stored in the order of: [batch,\n * height, width, channels]. Only \"NHWC\" is currently supported.\n *\n * @doc {heading: 'Operations', subheading: 'Convolution'}\n */\nfunction separableConv2d_(x, depthwiseFilter, pointwiseFilter, strides, pad, dilation = [1, 1], dataFormat = 'NHWC') {\n const $x = convertToTensor(x, 'x', 'separableConv2d');\n const $depthwiseFilter = convertToTensor(depthwiseFilter, 'depthwiseFilter', 'separableConv2d');\n const $pointwiseFilter = convertToTensor(pointwiseFilter, 'pointwiseFilter', 'separableConv2d');\n let x4D = $x;\n let reshapedTo4D = false;\n if ($x.rank === 3) {\n reshapedTo4D = true;\n x4D = reshape($x, [1, $x.shape[0], $x.shape[1], $x.shape[2]]);\n }\n if (dataFormat === 'NCHW') {\n throw new Error('separableConv2d currently does not support dataFormat NCHW; only ' +\n 'NHWC is supported');\n }\n util.assert(x4D.rank === 4, () => `Error in separableConv2d: input must be rank 4, but got ` +\n `rank ${x4D.rank}.`);\n util.assert($depthwiseFilter.rank === 4, () => `Error in separableConv2d: depthwise filter must be rank 4, but ` +\n `got rank ${$depthwiseFilter.rank}.`);\n util.assert($pointwiseFilter.rank === 4, () => `Error in separableConv2d: pointwise filter must be rank 4, but ` +\n `got rank ${$depthwiseFilter.rank}.`);\n util.assert($pointwiseFilter.shape[0] === 1, () => `Error in separableConv2d: the first dimension of pointwise filter ` +\n ` must be 1, but got ${$pointwiseFilter.shape[0]}.`);\n util.assert($pointwiseFilter.shape[1] === 1, () => `Error in separableConv2d: the second dimension of pointwise ` +\n `filter must be 1, but got ${$pointwiseFilter.shape[1]}.`);\n const inChannels = $depthwiseFilter.shape[2];\n const channelMultiplier = $depthwiseFilter.shape[3];\n util.assert($pointwiseFilter.shape[2] === inChannels * channelMultiplier, () => `Error in separableConv2d: the third dimension of pointwise filter ` +\n `must be ${inChannels * channelMultiplier}, ` +\n `but got ${$pointwiseFilter.shape[2]}.`);\n const depthwise = depthwiseConv2d(x4D, $depthwiseFilter, strides, pad, dataFormat, dilation);\n const pointwiseStride = 1;\n const res = conv2d(depthwise, $pointwiseFilter, pointwiseStride, 'valid', dataFormat);\n if (reshapedTo4D) {\n return reshape(res, [res.shape[1], res.shape[2], res.shape[3]]);\n }\n return res;\n}\nexport const separableConv2d = op({ separableConv2d_ });\n//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic2VwYXJhYmxlX2NvbnYyZC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uLy4uL3RmanMtY29yZS9zcmMvb3BzL3NlcGFyYWJsZV9jb252MmQudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBaUJBLE9BQU8sRUFBQyxlQUFlLEVBQUMsTUFBTSxvQkFBb0IsQ0FBQztBQUVuRCxPQUFPLEtBQUssSUFBSSxNQUFNLFNBQVMsQ0FBQztBQUVoQyxPQUFPLEVBQUMsTUFBTSxFQUFDLE1BQU0sVUFBVSxDQUFDO0FBQ2hDLE9BQU8sRUFBQyxlQUFlLEVBQUMsTUFBTSxvQkFBb0IsQ0FBQztBQUNuRCxPQUFPLEVBQUMsRUFBRSxFQUFDLE1BQU0sYUFBYSxDQUFDO0FBQy9CLE9BQU8sRUFBQyxPQUFPLEVBQUMsTUFBTSxXQUFXLENBQUM7QUFFbEM7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7O0dBNENHO0FBQ0gsU0FBUyxnQkFBZ0IsQ0FDckIsQ0FBZSxFQUFFLGVBQW9DLEVBQ3JELGVBQW9DLEVBQUUsT0FBZ0MsRUFDdEUsR0FBbUIsRUFBRSxXQUFvQyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsRUFDL0QsYUFBNEIsTUFBTTtJQUNwQyxNQUFNLEVBQUUsR0FBRyxlQUFlLENBQUMsQ0FBQyxFQUFFLEdBQUcsRUFBRSxpQkFBaUIsQ0FBQyxDQUFDO0lBQ3RELE1BQU0sZ0JBQWdCLEdBQ2xCLGVBQWUsQ0FBQyxlQUFlLEVBQUUsaUJBQWlCLEVBQUUsaUJBQWlCLENBQUMsQ0FBQztJQUMzRSxNQUFNLGdCQUFnQixHQUNsQixlQUFlLENBQUMsZUFBZSxFQUFFLGlCQUFpQixFQUFFLGlCQUFpQixDQUFDLENBQUM7SUFFM0UsSUFBSSxHQUFHLEdBQUcsRUFBYyxDQUFDO0lBQ3pCLElBQUksWUFBWSxHQUFHLEtBQUssQ0FBQztJQUN6QixJQUFJLEVBQUUsQ0FBQyxJQUFJLEtBQUssQ0FBQyxFQUFFO1FBQ2pCLFlBQVksR0FBRyxJQUFJLENBQUM7UUFDcEIsR0FBRyxHQUFHLE9BQU8sQ0FBQyxFQUFFLEVBQUUsQ0FBQyxDQUFDLEVBQUUsRUFBRSxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUMsRUFBRSxFQUFFLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQyxFQUFFLEVBQUUsQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDO0tBQy9EO0lBRUQsSUFBSSxVQUFVLEtBQUssTUFBTSxFQUFFO1FBQ3pCLE1BQU0sSUFBSSxLQUFLLENBQ1gsbUVBQW1FO1lBQ25FLG1CQUFtQixDQUFDLENBQUM7S0FDMUI7SUFFRCxJQUFJLENBQUMsTUFBTSxDQUNQLEdBQUcsQ0FBQyxJQUFJLEtBQUssQ0FBQyxFQUNkLEdBQUcsRUFBRSxDQUFDLDBEQUEwRDtRQUM1RCxRQUFRLEdBQUcsQ0FBQyxJQUFJLEdBQUcsQ0FBQyxDQUFDO0lBQzdCLElBQUksQ0FBQyxNQUFNLENBQ1AsZ0JBQWdCLENBQUMsSUFBSSxLQUFLLENBQUMsRUFDM0IsR0FBRyxFQUFFLENBQUMsaUVBQWlFO1FBQ25FLFlBQVksZ0JBQWdCLENBQUMsSUFBSSxHQUFHLENBQUMsQ0FBQztJQUM5QyxJQUFJLENBQUMsTUFBTSxDQUNQLGdCQUFnQixDQUFDLElBQUksS0FBSyxDQUFDLEVBQzNCLEdBQUcsRUFBRSxDQUFDLGlFQUFpRTtRQUNuRSxZQUFZLGdCQUFnQixDQUFDLElBQUksR0FBRyxDQUFDLENBQUM7SUFDOUMsSUFBSSxDQUFDLE1BQU0sQ0FDUCxnQkFBZ0IsQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDLEtBQUssQ0FBQyxFQUMvQixHQUFHLEVBQUUsQ0FDRCxvRUFBb0U7UUFDcEUsdUJBQXVCLGdCQUFnQixDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUM7SUFDN0QsSUFBSSxDQUFDLE1BQU0sQ0FDUCxnQkFBZ0IsQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDLEtBQUssQ0FBQyxFQUMvQixHQUFHLEVBQUUsQ0FBQyw4REFBOEQ7UUFDaEUsNkJBQTZCLGdCQUFnQixDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUM7SUFFbkUsTUFBTSxVQUFVLEdBQUcsZ0JBQWdCLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQyxDQUFDO0lBQzdDLE1BQU0saUJBQWlCLEdBQUcsZ0JBQWdCLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQyxDQUFDO0lBQ3BELElBQUksQ0FBQyxNQUFNLENBQ1AsZ0JBQWdCLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQyxLQUFLLFVBQVUsR0FBRyxpQkFBaUIsRUFDNUQsR0FBRyxFQUFFLENBQ0Qsb0VBQW9FO1FBQ3BFLFdBQVcsVUFBVSxHQUFHLGlCQUFpQixJQUFJO1FBQzdDLFdBQVcsZ0JBQWdCLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQztJQUVqRCxNQUFNLFNBQVMsR0FBRyxlQUFlLENBQzdCLEdBQUcsRUFBRSxnQkFBZ0IsRUFBRSxPQUFPLEVBQUUsR0FBRyxFQUFFLFVBQVUsRUFBRSxRQUFRLENBQUMsQ0FBQztJQUMvRCxNQUFNLGVBQWUsR0FBRyxDQUFDLENBQUM7SUFDMUIsTUFBTSxHQUFHLEdBQ0wsTUFBTSxDQUFDLFNBQVMsRUFBRSxnQkFBZ0IsRUFBRSxlQUFlLEVBQUUsT0FBTyxFQUFFLFVBQVUsQ0FBQyxDQUFDO0lBRTlFLElBQUksWUFBWSxFQUFFO1FBQ2hCLE9BQU8sT0FBTyxDQUFDLEdBQUcsRUFBRSxDQUFDLEdBQUcsQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDLEVBQUUsR0FBRyxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUMsRUFBRSxHQUFHLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQU0sQ0FBQztLQUN0RTtJQUNELE9BQU8sR0FBUSxDQUFDO0FBQ2xCLENBQUM7QUFFRCxNQUFNLENBQUMsTUFBTSxlQUFlLEdBQUcsRUFBRSxDQUFDLEVBQUMsZ0JBQWdCLEVBQUMsQ0FBQyxDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiLyoqXG4gKiBAbGljZW5zZVxuICogQ29weXJpZ2h0IDIwMjAgR29vZ2xlIExMQy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC5cbiAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSBcIkxpY2Vuc2VcIik7XG4gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuXG4gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXRcbiAqXG4gKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjBcbiAqXG4gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlXG4gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiBcIkFTIElTXCIgQkFTSVMsXG4gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC5cbiAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmRcbiAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLlxuICogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbiAqL1xuaW1wb3J0IHtUZW5zb3IzRCwgVGVuc29yNER9IGZyb20gJy4uL3RlbnNvcic7XG5pbXBvcnQge2NvbnZlcnRUb1RlbnNvcn0gZnJvbSAnLi4vdGVuc29yX3V0aWxfZW52JztcbmltcG9ydCB7VGVuc29yTGlrZX0gZnJvbSAnLi4vdHlwZXMnO1xuaW1wb3J0ICogYXMgdXRpbCBmcm9tICcuLi91dGlsJztcblxuaW1wb3J0IHtjb252MmR9IGZyb20gJy4vY29udjJkJztcbmltcG9ydCB7ZGVwdGh3aXNlQ29udjJkfSBmcm9tICcuL2RlcHRod2lzZV9jb252MmQnO1xuaW1wb3J0IHtvcH0gZnJvbSAnLi9vcGVyYXRpb24nO1xuaW1wb3J0IHtyZXNoYXBlfSBmcm9tICcuL3Jlc2hhcGUnO1xuXG4vKipcbiAqIDItRCBjb252b2x1dGlvbiB3aXRoIHNlcGFyYWJsZSBmaWx0ZXJzLlxuICpcbiAqIFBlcmZvcm1zIGEgZGVwdGh3aXNlIGNvbnZvbHV0aW9uIHRoYXQgYWN0cyBzZXBhcmF0ZWx5IG9uIGNoYW5uZWxzIGZvbGxvd2VkXG4gKiBieSBhIHBvaW50d2lzZSBjb252b2x1dGlvbiB0aGF0IG1peGVzIGNoYW5uZWxzLiBOb3RlIHRoYXQgdGhpcyBpc1xuICogc2VwYXJhYmlsaXR5IGJldHdlZW4gZGltZW5zaW9ucyBbMSwgMl0gYW5kIDMsIG5vdCBzcGF0aWFsIHNlcGFyYWJpbGl0eVxuICogYmV0d2VlbiBkaW1lbnNpb25zIDEgYW5kIDIuXG4gKlxuICogU2VlXG4gKiBbaHR0cHM6Ly93d3cudGVuc29yZmxvdy5vcmcvYXBpX2RvY3MvcHl0aG9uL3RmL25uL3NlcGFyYWJsZV9jb252MmRdKFxuICogICAgIGh0dHBzOi8vd3d3LnRlbnNvcmZsb3cub3JnL2FwaV9kb2NzL3B5dGhvbi90Zi9ubi9zZXBhcmFibGVfY29udjJkKVxuICogZm9yIG1vcmUgZGV0YWlscy5cbiAqXG4gKiBAcGFyYW0geCBUaGUgaW5wdXQgdGVuc29yLCBvZiByYW5rIDQgb3IgcmFuayAzLCBvZiBzaGFwZVxuICogICAgIGBbYmF0Y2gsIGhlaWdodCwgd2lkdGgsIGluQ2hhbm5lbHNdYC4gSWYgcmFuayAzLCBiYXRjaCBvZiAxIGlzXG4gKiBhc3N1bWVkLlxuICogQHBhcmFtIGRlcHRod2lzZUZpbHRlciBUaGUgZGVwdGh3aXNlIGZpbHRlciB0ZW5zb3IsIHJhbmsgNCwgb2Ygc2hhcGVcbiAqICAgICBgW2ZpbHRlckhlaWdodCwgZmlsdGVyV2lkdGgsIGluQ2hhbm5lbHMsIGNoYW5uZWxNdWx0aXBsaWVyXWAuIFRoaXMgaXNcbiAqICAgICB0aGUgZmlsdGVyIHVzZWQgaW4gdGhlIGZpcnN0IHN0ZXAuXG4gKiBAcGFyYW0gcG9pbnR3aXNlRmlsdGVyIFRoZSBwb2ludHdpc2UgZmlsdGVyIHRlbnNvciwgcmFuayA0LCBvZiBzaGFwZVxuICogICAgIGBbMSwgMSwgaW5DaGFubmVscyAqIGNoYW5uZWxNdWx0aXBsaWVyLCBvdXRDaGFubmVsc11gLiBUaGlzIGlzXG4gKiAgICAgdGhlIGZpbHRlciB1c2VkIGluIHRoZSBzZWNvbmQgc3RlcC5cbiAqIEBwYXJhbSBzdHJpZGVzIFRoZSBzdHJpZGVzIG9mIHRoZSBjb252b2x1dGlvbjogYFtzdHJpZGVIZWlnaHQsXG4gKiBzdHJpZGVXaWR0aF1gLiBJZiBzdHJpZGVzIGlzIGEgc2luZ2xlIG51bWJlciwgdGhlbiBgc3RyaWRlSGVpZ2h0ID09XG4gKiBzdHJpZGVXaWR0aGAuXG4gKiBAcGFyYW0gcGFkIFRoZSB0eXBlIG9mIHBhZGRpbmcgYWxnb3JpdGhtLlxuICogICAtIGBzYW1lYCBhbmQgc3RyaWRlIDE6IG91dHB1dCB3aWxsIGJlIG9mIHNhbWUgc2l6ZSBhcyBpbnB1dCxcbiAqICAgICAgIHJlZ2FyZGxlc3Mgb2YgZmlsdGVyIHNpemUuXG4gKiAgIC0gYHZhbGlkYDogb3V0cHV0IHdpbGwgYmUgc21hbGxlciB0aGFuIGlucHV0IGlmIGZpbHRlciBpcyBsYXJnZXJcbiAqICAgICAgIHRoYW4gMXgxLlxuICogICAtIEZvciBtb3JlIGluZm8sIHNlZSB0aGlzIGd1aWRlOlxuICogICAgIFtodHRwczovL3d3dy50ZW5zb3JmbG93Lm9yZy9hcGlfZG9jcy9weXRob24vdGYvbm4vY29udm9sdXRpb25dKFxuICogICAgICAgICAgaHR0cHM6Ly93d3cudGVuc29yZmxvdy5vcmcvYXBpX2RvY3MvcHl0aG9uL3RmL25uL2NvbnZvbHV0aW9uKVxuICogQHBhcmFtIGRpbGF0aW9ucyBUaGUgZGlsYXRpb24gcmF0ZXM6IGBbZGlsYXRpb25IZWlnaHQsIGRpbGF0aW9uV2lkdGhdYFxuICogICAgIGluIHdoaWNoIHdlIHNhbXBsZSBpbnB1dCB2YWx1ZXMgYWNyb3NzIHRoZSBoZWlnaHQgYW5kIHdpZHRoIGRpbWVuc2lvbnNcbiAqICAgICBpbiBhdHJvdXMgY29udm9sdXRpb24uIERlZmF1bHRzIHRvIGBbMSwgMV1gLiBJZiBgcmF0ZWAgaXMgYSBzaW5nbGVcbiAqICAgICBudW1iZXIsIHRoZW4gYGRpbGF0aW9uSGVpZ2h0ID09IGRpbGF0aW9uV2lkdGhgLiBJZiBpdCBpcyBncmVhdGVyIHRoYW5cbiAqICAgICAxLCB0aGVuIGFsbCB2YWx1ZXMgb2YgYHN0cmlkZXNgIG11c3QgYmUgMS5cbiAqIEBwYXJhbSBkYXRhRm9ybWF0OiBBbiBvcHRpb25hbCBzdHJpbmcgZnJvbTogXCJOSFdDXCIsIFwiTkNIV1wiLiBEZWZhdWx0cyB0b1xuICogICAgIFwiTkhXQ1wiLiBTcGVjaWZ5IHRoZSBkYXRhIGZvcm1hdCBvZiB0aGUgaW5wdXQgYW5kIG91dHB1dCBkYXRhLiBXaXRoIHRoZVxuICogICAgIGRlZmF1bHQgZm9ybWF0IFwiTkhXQ1wiLCB0aGUgZGF0YSBpcyBzdG9yZWQgaW4gdGhlIG9yZGVyIG9mOiBbYmF0Y2gsXG4gKiAgICAgaGVpZ2h0LCB3aWR0aCwgY2hhbm5lbHNdLiBPbmx5IFwiTkhXQ1wiIGlzIGN1cnJlbnRseSBzdXBwb3J0ZWQuXG4gKlxuICogQGRvYyB7aGVhZGluZzogJ09wZXJhdGlvbnMnLCBzdWJoZWFkaW5nOiAnQ29udm9sdXRpb24nfVxuICovXG5mdW5jdGlvbiBzZXBhcmFibGVDb252MmRfPFQgZXh0ZW5kcyBUZW5zb3IzRHxUZW5zb3I0RD4oXG4gICAgeDogVHxUZW5zb3JMaWtlLCBkZXB0aHdpc2VGaWx0ZXI6IFRlbnNvcjREfFRlbnNvckxpa2UsXG4gICAgcG9pbnR3aXNlRmlsdGVyOiBUZW5zb3I0RHxUZW5zb3JMaWtlLCBzdHJpZGVzOiBbbnVtYmVyLCBudW1iZXJdfG51bWJlcixcbiAgICBwYWQ6ICd2YWxpZCd8J3NhbWUnLCBkaWxhdGlvbjogW251bWJlciwgbnVtYmVyXXxudW1iZXIgPSBbMSwgMV0sXG4gICAgZGF0YUZvcm1hdDogJ05IV0MnfCdOQ0hXJyA9ICdOSFdDJyk6IFQge1xuICBjb25zdCAkeCA9IGNvbnZlcnRUb1RlbnNvcih4LCAneCcsICdzZXBhcmFibGVDb252MmQnKTtcbiAgY29uc3QgJGRlcHRod2lzZUZpbHRlciA9XG4gICAgICBjb252ZXJ0VG9UZW5zb3IoZGVwdGh3aXNlRmlsdGVyLCAnZGVwdGh3aXNlRmlsdGVyJywgJ3NlcGFyYWJsZUNvbnYyZCcpO1xuICBjb25zdCAkcG9pbnR3aXNlRmlsdGVyID1cbiAgICAgIGNvbnZlcnRUb1RlbnNvcihwb2ludHdpc2VGaWx0ZXIsICdwb2ludHdpc2VGaWx0ZXInLCAnc2VwYXJhYmxlQ29udjJkJyk7XG5cbiAgbGV0IHg0RCA9ICR4IGFzIFRlbnNvcjREO1xuICBsZXQgcmVzaGFwZWRUbzREID0gZmFsc2U7XG4gIGlmICgkeC5yYW5rID09PSAzKSB7XG4gICAgcmVzaGFwZWRUbzREID0gdHJ1ZTtcbiAgICB4NEQgPSByZXNoYXBlKCR4LCBbMSwgJHguc2hhcGVbMF0sICR4LnNoYXBlWzFdLCAkeC5zaGFwZVsyXV0pO1xuICB9XG5cbiAgaWYgKGRhdGFGb3JtYXQgPT09ICdOQ0hXJykge1xuICAgIHRocm93IG5ldyBFcnJvcihcbiAgICAgICAgJ3NlcGFyYWJsZUNvbnYyZCBjdXJyZW50bHkgZG9lcyBub3Qgc3VwcG9ydCBkYXRhRm9ybWF0IE5DSFc7IG9ubHkgJyArXG4gICAgICAgICdOSFdDIGlzIHN1cHBvcnRlZCcpO1xuICB9XG5cbiAgdXRpbC5hc3NlcnQoXG4gICAgICB4NEQucmFuayA9PT0gNCxcbiAgICAgICgpID0+IGBFcnJvciBpbiBzZXBhcmFibGVDb252MmQ6IGlucHV0IG11c3QgYmUgcmFuayA0LCBidXQgZ290IGAgK1xuICAgICAgICAgIGByYW5rICR7eDRELnJhbmt9LmApO1xuICB1dGlsLmFzc2VydChcbiAgICAgICRkZXB0aHdpc2VGaWx0ZXIucmFuayA9PT0gNCxcbiAgICAgICgpID0+IGBFcnJvciBpbiBzZXBhcmFibGVDb252MmQ6IGRlcHRod2lzZSBmaWx0ZXIgbXVzdCBiZSByYW5rIDQsIGJ1dCBgICtcbiAgICAgICAgICBgZ290IHJhbmsgJHskZGVwdGh3aXNlRmlsdGVyLnJhbmt9LmApO1xuICB1dGlsLmFzc2VydChcbiAgICAgICRwb2ludHdpc2VGaWx0ZXIucmFuayA9PT0gNCxcbiAgICAgICgpID0+IGBFcnJvciBpbiBzZXBhcmFibGVDb252MmQ6IHBvaW50d2lzZSBmaWx0ZXIgbXVzdCBiZSByYW5rIDQsIGJ1dCBgICtcbiAgICAgICAgICBgZ290IHJhbmsgJHskZGVwdGh3aXNlRmlsdGVyLnJhbmt9LmApO1xuICB1dGlsLmFzc2VydChcbiAgICAgICRwb2ludHdpc2VGaWx0ZXIuc2hhcGVbMF0gPT09IDEsXG4gICAgICAoKSA9PlxuICAgICAgICAgIGBFcnJvciBpbiBzZXBhcmFibGVDb252MmQ6IHRoZSBmaXJzdCBkaW1lbnNpb24gb2YgcG9pbnR3aXNlIGZpbHRlciBgICtcbiAgICAgICAgICBgIG11c3QgYmUgMSwgYnV0IGdvdCAkeyRwb2ludHdpc2VGaWx0ZXIuc2hhcGVbMF19LmApO1xuICB1dGlsLmFzc2VydChcbiAgICAgICRwb2ludHdpc2VGaWx0ZXIuc2hhcGVbMV0gPT09IDEsXG4gICAgICAoKSA9PiBgRXJyb3IgaW4gc2VwYXJhYmxlQ29udjJkOiB0aGUgc2Vjb25kIGRpbWVuc2lvbiBvZiBwb2ludHdpc2UgYCArXG4gICAgICAgICAgYGZpbHRlciBtdXN0IGJlIDEsIGJ1dCBnb3QgJHskcG9pbnR3aXNlRmlsdGVyLnNoYXBlWzFdfS5gKTtcblxuICBjb25zdCBpbkNoYW5uZWxzID0gJGRlcHRod2lzZUZpbHRlci5zaGFwZVsyXTtcbiAgY29uc3QgY2hhbm5lbE11bHRpcGxpZXIgPSAkZGVwdGh3aXNlRmlsdGVyLnNoYXBlWzNdO1xuICB1dGlsLmFzc2VydChcbiAgICAgICRwb2ludHdpc2VGaWx0ZXIuc2hhcGVbMl0gPT09IGluQ2hhbm5lbHMgKiBjaGFubmVsTXVsdGlwbGllcixcbiAgICAgICgpID0+XG4gICAgICAgICAgYEVycm9yIGluIHNlcGFyYWJsZUNvbnYyZDogdGhlIHRoaXJkIGRpbWVuc2lvbiBvZiBwb2ludHdpc2UgZmlsdGVyIGAgK1xuICAgICAgICAgIGBtdXN0IGJlICR7aW5DaGFubmVscyAqIGNoYW5uZWxNdWx0aXBsaWVyfSwgYCArXG4gICAgICAgICAgYGJ1dCBnb3QgJHskcG9pbnR3aXNlRmlsdGVyLnNoYXBlWzJdfS5gKTtcblxuICBjb25zdCBkZXB0aHdpc2UgPSBkZXB0aHdpc2VDb252MmQoXG4gICAgICB4NEQsICRkZXB0aHdpc2VGaWx0ZXIsIHN0cmlkZXMsIHBhZCwgZGF0YUZvcm1hdCwgZGlsYXRpb24pO1xuICBjb25zdCBwb2ludHdpc2VTdHJpZGUgPSAxO1xuICBjb25zdCByZXMgPVxuICAgICAgY29udjJkKGRlcHRod2lzZSwgJHBvaW50d2lzZUZpbHRlciwgcG9pbnR3aXNlU3RyaWRlLCAndmFsaWQnLCBkYXRhRm9ybWF0KTtcblxuICBpZiAocmVzaGFwZWRUbzREKSB7XG4gICAgcmV0dXJuIHJlc2hhcGUocmVzLCBbcmVzLnNoYXBlWzFdLCByZXMuc2hhcGVbMl0sIHJlcy5zaGFwZVszXV0pIGFzIFQ7XG4gIH1cbiAgcmV0dXJuIHJlcyBhcyBUO1xufVxuXG5leHBvcnQgY29uc3Qgc2VwYXJhYmxlQ29udjJkID0gb3Aoe3NlcGFyYWJsZUNvbnYyZF99KTtcbiJdfQ==","/**\n * @license\n * Copyright 2018 Google LLC. All Rights Reserved.\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n * =============================================================================\n */\nimport { ENGINE } from '../engine';\nimport { Sigmoid } from '../kernel_names';\nimport { convertToTensor } from '../tensor_util_env';\nimport { op } from './operation';\n/**\n * Computes sigmoid element-wise, `1 / (1 + exp(-x))`\n *\n * ```js\n * const x = tf.tensor1d([0, -1, 2, -3]);\n *\n * x.sigmoid().print(); // or tf.sigmoid(x)\n * ```\n * @param x The input tensor.\n *\n * @doc {heading: 'Operations', subheading: 'Basic math'}\n */\nfunction sigmoid_(x) {\n const $x = convertToTensor(x, 'x', 'sigmoid', 'float32');\n const inputs = { x: $x };\n return ENGINE.runKernel(Sigmoid, inputs);\n}\nexport const sigmoid = op({ sigmoid_ });\n//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic2lnbW9pZC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uLy4uL3RmanMtY29yZS9zcmMvb3BzL3NpZ21vaWQudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUE7Ozs7Ozs7Ozs7Ozs7OztHQWVHO0FBRUgsT0FBTyxFQUFDLE1BQU0sRUFBQyxNQUFNLFdBQVcsQ0FBQztBQUNqQyxPQUFPLEVBQUMsT0FBTyxFQUFnQixNQUFNLGlCQUFpQixDQUFDO0FBR3ZELE9BQU8sRUFBQyxlQUFlLEVBQUMsTUFBTSxvQkFBb0IsQ0FBQztBQUduRCxPQUFPLEVBQUMsRUFBRSxFQUFDLE1BQU0sYUFBYSxDQUFDO0FBRS9COzs7Ozs7Ozs7OztHQVdHO0FBQ0gsU0FBUyxRQUFRLENBQW1CLENBQWU7SUFDakQsTUFBTSxFQUFFLEdBQUcsZUFBZSxDQUFDLENBQUMsRUFBRSxHQUFHLEVBQUUsU0FBUyxFQUFFLFNBQVMsQ0FBQyxDQUFDO0lBRXpELE1BQU0sTUFBTSxHQUFrQixFQUFDLENBQUMsRUFBRSxFQUFFLEVBQUMsQ0FBQztJQUV0QyxPQUFPLE1BQU0sQ0FBQyxTQUFTLENBQUMsT0FBTyxFQUFFLE1BQThCLENBQUMsQ0FBQztBQUNuRSxDQUFDO0FBQ0QsTUFBTSxDQUFDLE1BQU0sT0FBTyxHQUFHLEVBQUUsQ0FBQyxFQUFDLFFBQVEsRUFBQyxDQUFDLENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyIvKipcbiAqIEBsaWNlbnNlXG4gKiBDb3B5cmlnaHQgMjAxOCBHb29nbGUgTExDLiBBbGwgUmlnaHRzIFJlc2VydmVkLlxuICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlIFwiTGljZW5zZVwiKTtcbiAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS5cbiAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdFxuICpcbiAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMFxuICpcbiAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmVcbiAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuIFwiQVMgSVNcIiBCQVNJUyxcbiAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLlxuICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZFxuICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuXG4gKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuICovXG5cbmltcG9ydCB7RU5HSU5FfSBmcm9tICcuLi9lbmdpbmUnO1xuaW1wb3J0IHtTaWdtb2lkLCBTaWdtb2lkSW5wdXRzfSBmcm9tICcuLi9rZXJuZWxfbmFtZXMnO1xuaW1wb3J0IHtUZW5zb3J9IGZyb20gJy4uL3RlbnNvcic7XG5pbXBvcnQge05hbWVkVGVuc29yTWFwfSBmcm9tICcuLi90ZW5zb3JfdHlwZXMnO1xuaW1wb3J0IHtjb252ZXJ0VG9UZW5zb3J9IGZyb20gJy4uL3RlbnNvcl91dGlsX2Vudic7XG5pbXBvcnQge1RlbnNvckxpa2V9IGZyb20gJy4uL3R5cGVzJztcblxuaW1wb3J0IHtvcH0gZnJvbSAnLi9vcGVyYXRpb24nO1xuXG4vKipcbiAqIENvbXB1dGVzIHNpZ21vaWQgZWxlbWVudC13aXNlLCBgMSAvICgxICsgZXhwKC14KSlgXG4gKlxuICogYGBganNcbiAqIGNvbnN0IHggPSB0Zi50ZW5zb3IxZChbMCwgLTEsIDIsIC0zXSk7XG4gKlxuICogeC5zaWdtb2lkKCkucHJpbnQoKTsgIC8vIG9yIHRmLnNpZ21vaWQoeClcbiAqIGBgYFxuICogQHBhcmFtIHggVGhlIGlucHV0IHRlbnNvci5cbiAqXG4gKiBAZG9jIHtoZWFkaW5nOiAnT3BlcmF0aW9ucycsIHN1YmhlYWRpbmc6ICdCYXNpYyBtYXRoJ31cbiAqL1xuZnVuY3Rpb24gc2lnbW9pZF88VCBleHRlbmRzIFRlbnNvcj4oeDogVHxUZW5zb3JMaWtlKTogVCB7XG4gIGNvbnN0ICR4ID0gY29udmVydFRvVGVuc29yKHgsICd4JywgJ3NpZ21vaWQnLCAnZmxvYXQzMicpO1xuXG4gIGNvbnN0IGlucHV0czogU2lnbW9pZElucHV0cyA9IHt4OiAkeH07XG5cbiAgcmV0dXJuIEVOR0lORS5ydW5LZXJuZWwoU2lnbW9pZCwgaW5wdXRzIGFzIHt9IGFzIE5hbWVkVGVuc29yTWFwKTtcbn1cbmV4cG9ydCBjb25zdCBzaWdtb2lkID0gb3Aoe3NpZ21vaWRffSk7XG4iXX0=","/**\n * @license\n * Copyright 2018 Google LLC. All Rights Reserved.\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n * =============================================================================\n */\nimport { ENGINE } from '../engine';\nimport { Sign } from '../kernel_names';\nimport { convertToTensor } from '../tensor_util_env';\nimport { op } from './operation';\n/**\n * Returns an element-wise indication of the sign of a number.\n *\n * ```js\n * const x = tf.tensor1d([.6, 1.1, -3.3, NaN, 0]);\n *\n * x.sign().print(); // or tf.sign(x)\n * ```\n * @param x The input Tensor.\n *\n * @doc {heading: 'Operations', subheading: 'Basic math'}\n */\nfunction sign_(x) {\n const $x = convertToTensor(x, 'x', 'sign');\n const inputs = { x: $x };\n return ENGINE.runKernel(Sign, inputs);\n}\nexport const sign = op({ sign_ });\n//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic2lnbi5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uLy4uL3RmanMtY29yZS9zcmMvb3BzL3NpZ24udHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUE7Ozs7Ozs7Ozs7Ozs7OztHQWVHO0FBRUgsT0FBTyxFQUFDLE1BQU0sRUFBQyxNQUFNLFdBQVcsQ0FBQztBQUNqQyxPQUFPLEVBQUMsSUFBSSxFQUFhLE1BQU0saUJBQWlCLENBQUM7QUFHakQsT0FBTyxFQUFDLGVBQWUsRUFBQyxNQUFNLG9CQUFvQixDQUFDO0FBR25ELE9BQU8sRUFBQyxFQUFFLEVBQUMsTUFBTSxhQUFhLENBQUM7QUFFL0I7Ozs7Ozs7Ozs7O0dBV0c7QUFDSCxTQUFTLEtBQUssQ0FBbUIsQ0FBZTtJQUM5QyxNQUFNLEVBQUUsR0FBRyxlQUFlLENBQUMsQ0FBQyxFQUFFLEdBQUcsRUFBRSxNQUFNLENBQUMsQ0FBQztJQUMzQyxNQUFNLE1BQU0sR0FBZSxFQUFDLENBQUMsRUFBRSxFQUFFLEVBQUMsQ0FBQztJQUNuQyxPQUFPLE1BQU0sQ0FBQyxTQUFTLENBQUMsSUFBSSxFQUFFLE1BQThCLENBQUMsQ0FBQztBQUNoRSxDQUFDO0FBQ0QsTUFBTSxDQUFDLE1BQU0sSUFBSSxHQUFHLEVBQUUsQ0FBQyxFQUFDLEtBQUssRUFBQyxDQUFDLENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyIvKipcbiAqIEBsaWNlbnNlXG4gKiBDb3B5cmlnaHQgMjAxOCBHb29nbGUgTExDLiBBbGwgUmlnaHRzIFJlc2VydmVkLlxuICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlIFwiTGljZW5zZVwiKTtcbiAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS5cbiAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdFxuICpcbiAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMFxuICpcbiAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmVcbiAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuIFwiQVMgSVNcIiBCQVNJUyxcbiAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLlxuICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZFxuICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuXG4gKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuICovXG5cbmltcG9ydCB7RU5HSU5FfSBmcm9tICcuLi9lbmdpbmUnO1xuaW1wb3J0IHtTaWduLCBTaWduSW5wdXRzfSBmcm9tICcuLi9rZXJuZWxfbmFtZXMnO1xuaW1wb3J0IHtUZW5zb3J9IGZyb20gJy4uL3RlbnNvcic7XG5pbXBvcnQge05hbWVkVGVuc29yTWFwfSBmcm9tICcuLi90ZW5zb3JfdHlwZXMnO1xuaW1wb3J0IHtjb252ZXJ0VG9UZW5zb3J9IGZyb20gJy4uL3RlbnNvcl91dGlsX2Vudic7XG5pbXBvcnQge1RlbnNvckxpa2V9IGZyb20gJy4uL3R5cGVzJztcblxuaW1wb3J0IHtvcH0gZnJvbSAnLi9vcGVyYXRpb24nO1xuXG4vKipcbiAqIFJldHVybnMgYW4gZWxlbWVudC13aXNlIGluZGljYXRpb24gb2YgdGhlIHNpZ24gb2YgYSBudW1iZXIuXG4gKlxuICogYGBganNcbiAqIGNvbnN0IHggPSB0Zi50ZW5zb3IxZChbLjYsIDEuMSwgLTMuMywgTmFOLCAwXSk7XG4gKlxuICogeC5zaWduKCkucHJpbnQoKTsgIC8vIG9yIHRmLnNpZ24oeClcbiAqIGBgYFxuICogQHBhcmFtIHggVGhlIGlucHV0IFRlbnNvci5cbiAqXG4gKiBAZG9jIHtoZWFkaW5nOiAnT3BlcmF0aW9ucycsIHN1YmhlYWRpbmc6ICdCYXNpYyBtYXRoJ31cbiAqL1xuZnVuY3Rpb24gc2lnbl88VCBleHRlbmRzIFRlbnNvcj4oeDogVHxUZW5zb3JMaWtlKTogVCB7XG4gIGNvbnN0ICR4ID0gY29udmVydFRvVGVuc29yKHgsICd4JywgJ3NpZ24nKTtcbiAgY29uc3QgaW5wdXRzOiBTaWduSW5wdXRzID0ge3g6ICR4fTtcbiAgcmV0dXJuIEVOR0lORS5ydW5LZXJuZWwoU2lnbiwgaW5wdXRzIGFzIHt9IGFzIE5hbWVkVGVuc29yTWFwKTtcbn1cbmV4cG9ydCBjb25zdCBzaWduID0gb3Aoe3NpZ25ffSk7XG4iXX0=","/**\n * @license\n * Copyright 2018 Google LLC. All Rights Reserved.\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n * =============================================================================\n */\nimport { ENGINE } from '../engine';\nimport { Sin } from '../kernel_names';\nimport { convertToTensor } from '../tensor_util_env';\nimport { op } from './operation';\n/**\n * Computes sin of the input Tensor element-wise: `sin(x)`\n *\n * ```js\n * const x = tf.tensor1d([0, Math.PI / 2, Math.PI * 3 / 4]);\n *\n * x.sin().print(); // or tf.sin(x)\n * ```\n * @param x The input tensor.\n *\n * @doc {heading: 'Operations', subheading: 'Basic math'}\n */\nfunction sin_(x) {\n const $x = convertToTensor(x, 'x', 'sin', 'float32');\n const inputs = { x: $x };\n return ENGINE.runKernel(Sin, inputs);\n}\nexport const sin = op({ sin_ });\n//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic2luLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vLi4vdGZqcy1jb3JlL3NyYy9vcHMvc2luLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBOzs7Ozs7Ozs7Ozs7Ozs7R0FlRztBQUVILE9BQU8sRUFBQyxNQUFNLEVBQUMsTUFBTSxXQUFXLENBQUM7QUFDakMsT0FBTyxFQUFDLEdBQUcsRUFBWSxNQUFNLGlCQUFpQixDQUFDO0FBRy9DLE9BQU8sRUFBQyxlQUFlLEVBQUMsTUFBTSxvQkFBb0IsQ0FBQztBQUduRCxPQUFPLEVBQUMsRUFBRSxFQUFDLE1BQU0sYUFBYSxDQUFDO0FBRS9COzs7Ozs7Ozs7OztHQVdHO0FBQ0gsU0FBUyxJQUFJLENBQW1CLENBQWU7SUFDN0MsTUFBTSxFQUFFLEdBQUcsZUFBZSxDQUFDLENBQUMsRUFBRSxHQUFHLEVBQUUsS0FBSyxFQUFFLFNBQVMsQ0FBQyxDQUFDO0lBRXJELE1BQU0sTUFBTSxHQUFjLEVBQUMsQ0FBQyxFQUFFLEVBQUUsRUFBQyxDQUFDO0lBRWxDLE9BQU8sTUFBTSxDQUFDLFNBQVMsQ0FBQyxHQUFHLEVBQUUsTUFBOEIsQ0FBQyxDQUFDO0FBQy9ELENBQUM7QUFDRCxNQUFNLENBQUMsTUFBTSxHQUFHLEdBQUcsRUFBRSxDQUFDLEVBQUMsSUFBSSxFQUFDLENBQUMsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbIi8qKlxuICogQGxpY2Vuc2VcbiAqIENvcHlyaWdodCAyMDE4IEdvb2dsZSBMTEMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuXG4gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgXCJMaWNlbnNlXCIpO1xuICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLlxuICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0XG4gKlxuICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wXG4gKlxuICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZVxuICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gXCJBUyBJU1wiIEJBU0lTLFxuICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuXG4gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kXG4gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS5cbiAqID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4gKi9cblxuaW1wb3J0IHtFTkdJTkV9IGZyb20gJy4uL2VuZ2luZSc7XG5pbXBvcnQge1NpbiwgU2luSW5wdXRzfSBmcm9tICcuLi9rZXJuZWxfbmFtZXMnO1xuaW1wb3J0IHtUZW5zb3J9IGZyb20gJy4uL3RlbnNvcic7XG5pbXBvcnQge05hbWVkVGVuc29yTWFwfSBmcm9tICcuLi90ZW5zb3JfdHlwZXMnO1xuaW1wb3J0IHtjb252ZXJ0VG9UZW5zb3J9IGZyb20gJy4uL3RlbnNvcl91dGlsX2Vudic7XG5pbXBvcnQge1RlbnNvckxpa2V9IGZyb20gJy4uL3R5cGVzJztcblxuaW1wb3J0IHtvcH0gZnJvbSAnLi9vcGVyYXRpb24nO1xuXG4vKipcbiAqIENvbXB1dGVzIHNpbiBvZiB0aGUgaW5wdXQgVGVuc29yIGVsZW1lbnQtd2lzZTogYHNpbih4KWBcbiAqXG4gKiBgYGBqc1xuICogY29uc3QgeCA9IHRmLnRlbnNvcjFkKFswLCBNYXRoLlBJIC8gMiwgTWF0aC5QSSAqIDMgLyA0XSk7XG4gKlxuICogeC5zaW4oKS5wcmludCgpOyAgLy8gb3IgdGYuc2luKHgpXG4gKiBgYGBcbiAqIEBwYXJhbSB4IFRoZSBpbnB1dCB0ZW5zb3IuXG4gKlxuICogQGRvYyB7aGVhZGluZzogJ09wZXJhdGlvbnMnLCBzdWJoZWFkaW5nOiAnQmFzaWMgbWF0aCd9XG4gKi9cbmZ1bmN0aW9uIHNpbl88VCBleHRlbmRzIFRlbnNvcj4oeDogVHxUZW5zb3JMaWtlKTogVCB7XG4gIGNvbnN0ICR4ID0gY29udmVydFRvVGVuc29yKHgsICd4JywgJ3NpbicsICdmbG9hdDMyJyk7XG5cbiAgY29uc3QgaW5wdXRzOiBTaW5JbnB1dHMgPSB7eDogJHh9O1xuXG4gIHJldHVybiBFTkdJTkUucnVuS2VybmVsKFNpbiwgaW5wdXRzIGFzIHt9IGFzIE5hbWVkVGVuc29yTWFwKTtcbn1cbmV4cG9ydCBjb25zdCBzaW4gPSBvcCh7c2luX30pO1xuIl19","/**\n * @license\n * Copyright 2018 Google LLC. All Rights Reserved.\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n * =============================================================================\n */\nimport { ENGINE } from '../engine';\nimport { Sinh } from '../kernel_names';\nimport { convertToTensor } from '../tensor_util_env';\nimport { op } from './operation';\n/**\n * Computes hyperbolic sin of the input `tf.Tensor` element-wise: `sinh(x)`\n *\n * ```js\n * const x = tf.tensor1d([0, 1, -1, .7]);\n *\n * x.sinh().print(); // or tf.sinh(x)\n * ```\n * @param x The input tensor.\n *\n * @doc {heading: 'Operations', subheading: 'Basic math'}\n */\nfunction sinh_(x) {\n const $x = convertToTensor(x, 'x', 'sinh');\n const inputs = { x: $x };\n return ENGINE.runKernel(Sinh, inputs);\n}\nexport const sinh = op({ sinh_ });\n//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic2luaC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uLy4uL3RmanMtY29yZS9zcmMvb3BzL3NpbmgudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUE7Ozs7Ozs7Ozs7Ozs7OztHQWVHO0FBRUgsT0FBTyxFQUFDLE1BQU0sRUFBQyxNQUFNLFdBQVcsQ0FBQztBQUNqQyxPQUFPLEVBQUMsSUFBSSxFQUFhLE1BQU0saUJBQWlCLENBQUM7QUFHakQsT0FBTyxFQUFDLGVBQWUsRUFBQyxNQUFNLG9CQUFvQixDQUFDO0FBR25ELE9BQU8sRUFBQyxFQUFFLEVBQUMsTUFBTSxhQUFhLENBQUM7QUFFL0I7Ozs7Ozs7Ozs7O0dBV0c7QUFDSCxTQUFTLEtBQUssQ0FBbUIsQ0FBZTtJQUM5QyxNQUFNLEVBQUUsR0FBRyxlQUFlLENBQUMsQ0FBQyxFQUFFLEdBQUcsRUFBRSxNQUFNLENBQUMsQ0FBQztJQUMzQyxNQUFNLE1BQU0sR0FBZSxFQUFDLENBQUMsRUFBRSxFQUFFLEVBQUMsQ0FBQztJQUVuQyxPQUFPLE1BQU0sQ0FBQyxTQUFTLENBQUMsSUFBSSxFQUFFLE1BQThCLENBQUMsQ0FBQztBQUNoRSxDQUFDO0FBQ0QsTUFBTSxDQUFDLE1BQU0sSUFBSSxHQUFHLEVBQUUsQ0FBQyxFQUFDLEtBQUssRUFBQyxDQUFDLENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyIvKipcbiAqIEBsaWNlbnNlXG4gKiBDb3B5cmlnaHQgMjAxOCBHb29nbGUgTExDLiBBbGwgUmlnaHRzIFJlc2VydmVkLlxuICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlIFwiTGljZW5zZVwiKTtcbiAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS5cbiAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdFxuICpcbiAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMFxuICpcbiAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmVcbiAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuIFwiQVMgSVNcIiBCQVNJUyxcbiAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLlxuICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZFxuICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuXG4gKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuICovXG5cbmltcG9ydCB7RU5HSU5FfSBmcm9tICcuLi9lbmdpbmUnO1xuaW1wb3J0IHtTaW5oLCBTaW5oSW5wdXRzfSBmcm9tICcuLi9rZXJuZWxfbmFtZXMnO1xuaW1wb3J0IHtUZW5zb3J9IGZyb20gJy4uL3RlbnNvcic7XG5pbXBvcnQge05hbWVkVGVuc29yTWFwfSBmcm9tICcuLi90ZW5zb3JfdHlwZXMnO1xuaW1wb3J0IHtjb252ZXJ0VG9UZW5zb3J9IGZyb20gJy4uL3RlbnNvcl91dGlsX2Vudic7XG5pbXBvcnQge1RlbnNvckxpa2V9IGZyb20gJy4uL3R5cGVzJztcblxuaW1wb3J0IHtvcH0gZnJvbSAnLi9vcGVyYXRpb24nO1xuXG4vKipcbiAqIENvbXB1dGVzIGh5cGVyYm9saWMgc2luIG9mIHRoZSBpbnB1dCBgdGYuVGVuc29yYCBlbGVtZW50LXdpc2U6IGBzaW5oKHgpYFxuICpcbiAqIGBgYGpzXG4gKiBjb25zdCB4ID0gdGYudGVuc29yMWQoWzAsIDEsIC0xLCAuN10pO1xuICpcbiAqIHguc2luaCgpLnByaW50KCk7ICAvLyBvciB0Zi5zaW5oKHgpXG4gKiBgYGBcbiAqIEBwYXJhbSB4IFRoZSBpbnB1dCB0ZW5zb3IuXG4gKlxuICogQGRvYyB7aGVhZGluZzogJ09wZXJhdGlvbnMnLCBzdWJoZWFkaW5nOiAnQmFzaWMgbWF0aCd9XG4gKi9cbmZ1bmN0aW9uIHNpbmhfPFQgZXh0ZW5kcyBUZW5zb3I+KHg6IFR8VGVuc29yTGlrZSk6IFQge1xuICBjb25zdCAkeCA9IGNvbnZlcnRUb1RlbnNvcih4LCAneCcsICdzaW5oJyk7XG4gIGNvbnN0IGlucHV0czogU2luaElucHV0cyA9IHt4OiAkeH07XG5cbiAgcmV0dXJuIEVOR0lORS5ydW5LZXJuZWwoU2luaCwgaW5wdXRzIGFzIHt9IGFzIE5hbWVkVGVuc29yTWFwKTtcbn1cbmV4cG9ydCBjb25zdCBzaW5oID0gb3Aoe3NpbmhffSk7XG4iXX0=","/**\n * @license\n * Copyright 2018 Google LLC. All Rights Reserved.\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n * =============================================================================\n */\nimport { ENGINE } from '../engine';\nimport { Slice } from '../kernel_names';\nimport { convertToTensor } from '../tensor_util_env';\nimport { op } from './operation';\n/**\n * Extracts a slice from a `tf.Tensor` starting at coordinates `begin`\n * and is of size `size`.\n *\n * Also available are stricter rank-specific methods with the same signature\n * as this method that assert that `x` is of the given rank:\n * - `tf.slice1d`\n * - `tf.slice2d`\n * - `tf.slice3d`\n * - `tf.slice4d`\n *\n * ```js\n * const x = tf.tensor1d([1, 2, 3, 4]);\n *\n * x.slice([1], [2]).print();\n * ```\n *\n * ```js\n * const x = tf.tensor2d([1, 2, 3, 4], [2, 2]);\n *\n * x.slice([1, 0], [1, 2]).print();\n * ```\n * @param x The input `tf.Tensor` to slice from.\n * @param begin The coordinates to start the slice from. The length can be\n * less than the rank of x - the rest of the axes will have implicit 0 as\n * start. Can also be a single number, in which case it specifies the\n * first axis.\n * @param size The size of the slice. The length can be less than the rank of\n * x - the rest of the axes will have implicit -1. A value of -1 requests\n * the rest of the dimensions in the axis. Can also be a single number,\n * in which case it specifies the size of the first axis.\n *\n * @doc {heading: 'Tensors', subheading: 'Slicing and Joining'}\n */\nfunction slice_(x, begin, size) {\n const $x = convertToTensor(x, 'x', 'slice', 'string_or_numeric');\n if ($x.rank === 0) {\n throw new Error('Slicing scalar is not possible');\n }\n const inputs = { x: $x };\n const attrs = { begin, size };\n return ENGINE.runKernel(Slice, inputs, attrs);\n}\nexport const slice = op({ slice_ });\n//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic2xpY2UuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi8uLi90ZmpzLWNvcmUvc3JjL29wcy9zbGljZS50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQTs7Ozs7Ozs7Ozs7Ozs7O0dBZUc7QUFFSCxPQUFPLEVBQUMsTUFBTSxFQUFDLE1BQU0sV0FBVyxDQUFDO0FBQ2pDLE9BQU8sRUFBQyxLQUFLLEVBQTBCLE1BQU0saUJBQWlCLENBQUM7QUFJL0QsT0FBTyxFQUFDLGVBQWUsRUFBQyxNQUFNLG9CQUFvQixDQUFDO0FBR25ELE9BQU8sRUFBQyxFQUFFLEVBQUMsTUFBTSxhQUFhLENBQUM7QUFFL0I7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7OztHQWlDRztBQUNILFNBQVMsTUFBTSxDQUNYLENBQWUsRUFBRSxLQUFzQixFQUFFLElBQXNCO0lBQ2pFLE1BQU0sRUFBRSxHQUFHLGVBQWUsQ0FBQyxDQUFDLEVBQUUsR0FBRyxFQUFFLE9BQU8sRUFBRSxtQkFBbUIsQ0FBQyxDQUFDO0lBRWpFLElBQUksRUFBRSxDQUFDLElBQUksS0FBSyxDQUFDLEVBQUU7UUFDakIsTUFBTSxJQUFJLEtBQUssQ0FBQyxnQ0FBZ0MsQ0FBQyxDQUFDO0tBQ25EO0lBRUQsTUFBTSxNQUFNLEdBQWdCLEVBQUMsQ0FBQyxFQUFFLEVBQUUsRUFBQyxDQUFDO0lBQ3BDLE1BQU0sS0FBSyxHQUFlLEVBQUMsS0FBSyxFQUFFLElBQUksRUFBQyxDQUFDO0lBRXhDLE9BQU8sTUFBTSxDQUFDLFNBQVMsQ0FDbkIsS0FBSyxFQUFFLE1BQThCLEVBQUUsS0FBMkIsQ0FBQyxDQUFDO0FBQzFFLENBQUM7QUFFRCxNQUFNLENBQUMsTUFBTSxLQUFLLEdBQUcsRUFBRSxDQUFDLEVBQUMsTUFBTSxFQUFDLENBQUMsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbIi8qKlxuICogQGxpY2Vuc2VcbiAqIENvcHlyaWdodCAyMDE4IEdvb2dsZSBMTEMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuXG4gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgXCJMaWNlbnNlXCIpO1xuICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLlxuICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0XG4gKlxuICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wXG4gKlxuICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZVxuICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gXCJBUyBJU1wiIEJBU0lTLFxuICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuXG4gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kXG4gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS5cbiAqID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4gKi9cblxuaW1wb3J0IHtFTkdJTkV9IGZyb20gJy4uL2VuZ2luZSc7XG5pbXBvcnQge1NsaWNlLCBTbGljZUF0dHJzLCBTbGljZUlucHV0c30gZnJvbSAnLi4va2VybmVsX25hbWVzJztcbmltcG9ydCB7TmFtZWRBdHRyTWFwfSBmcm9tICcuLi9rZXJuZWxfcmVnaXN0cnknO1xuaW1wb3J0IHtUZW5zb3J9IGZyb20gJy4uL3RlbnNvcic7XG5pbXBvcnQge05hbWVkVGVuc29yTWFwfSBmcm9tICcuLi90ZW5zb3JfdHlwZXMnO1xuaW1wb3J0IHtjb252ZXJ0VG9UZW5zb3J9IGZyb20gJy4uL3RlbnNvcl91dGlsX2Vudic7XG5pbXBvcnQge1JhbmssIFRlbnNvckxpa2V9IGZyb20gJy4uL3R5cGVzJztcblxuaW1wb3J0IHtvcH0gZnJvbSAnLi9vcGVyYXRpb24nO1xuXG4vKipcbiAqIEV4dHJhY3RzIGEgc2xpY2UgZnJvbSBhIGB0Zi5UZW5zb3JgIHN0YXJ0aW5nIGF0IGNvb3JkaW5hdGVzIGBiZWdpbmBcbiAqIGFuZCBpcyBvZiBzaXplIGBzaXplYC5cbiAqXG4gKiBBbHNvIGF2YWlsYWJsZSBhcmUgc3RyaWN0ZXIgcmFuay1zcGVjaWZpYyBtZXRob2RzIHdpdGggdGhlIHNhbWUgc2lnbmF0dXJlXG4gKiBhcyB0aGlzIG1ldGhvZCB0aGF0IGFzc2VydCB0aGF0IGB4YCBpcyBvZiB0aGUgZ2l2ZW4gcmFuazpcbiAqICAgLSBgdGYuc2xpY2UxZGBcbiAqICAgLSBgdGYuc2xpY2UyZGBcbiAqICAgLSBgdGYuc2xpY2UzZGBcbiAqICAgLSBgdGYuc2xpY2U0ZGBcbiAqXG4gKiBgYGBqc1xuICogY29uc3QgeCA9IHRmLnRlbnNvcjFkKFsxLCAyLCAzLCA0XSk7XG4gKlxuICogeC5zbGljZShbMV0sIFsyXSkucHJpbnQoKTtcbiAqIGBgYFxuICpcbiAqIGBgYGpzXG4gKiBjb25zdCB4ID0gdGYudGVuc29yMmQoWzEsIDIsIDMsIDRdLCBbMiwgMl0pO1xuICpcbiAqIHguc2xpY2UoWzEsIDBdLCBbMSwgMl0pLnByaW50KCk7XG4gKiBgYGBcbiAqIEBwYXJhbSB4IFRoZSBpbnB1dCBgdGYuVGVuc29yYCB0byBzbGljZSBmcm9tLlxuICogQHBhcmFtIGJlZ2luIFRoZSBjb29yZGluYXRlcyB0byBzdGFydCB0aGUgc2xpY2UgZnJvbS4gVGhlIGxlbmd0aCBjYW4gYmVcbiAqICAgICBsZXNzIHRoYW4gdGhlIHJhbmsgb2YgeCAtIHRoZSByZXN0IG9mIHRoZSBheGVzIHdpbGwgaGF2ZSBpbXBsaWNpdCAwIGFzXG4gKiAgICAgc3RhcnQuIENhbiBhbHNvIGJlIGEgc2luZ2xlIG51bWJlciwgaW4gd2hpY2ggY2FzZSBpdCBzcGVjaWZpZXMgdGhlXG4gKiAgICAgZmlyc3QgYXhpcy5cbiAqIEBwYXJhbSBzaXplIFRoZSBzaXplIG9mIHRoZSBzbGljZS4gVGhlIGxlbmd0aCBjYW4gYmUgbGVzcyB0aGFuIHRoZSByYW5rIG9mXG4gKiAgICAgeCAtIHRoZSByZXN0IG9mIHRoZSBheGVzIHdpbGwgaGF2ZSBpbXBsaWNpdCAtMS4gQSB2YWx1ZSBvZiAtMSByZXF1ZXN0c1xuICogICAgIHRoZSByZXN0IG9mIHRoZSBkaW1lbnNpb25zIGluIHRoZSBheGlzLiBDYW4gYWxzbyBiZSBhIHNpbmdsZSBudW1iZXIsXG4gKiAgICAgaW4gd2hpY2ggY2FzZSBpdCBzcGVjaWZpZXMgdGhlIHNpemUgb2YgdGhlIGZpcnN0IGF4aXMuXG4gKlxuICogQGRvYyB7aGVhZGluZzogJ1RlbnNvcnMnLCBzdWJoZWFkaW5nOiAnU2xpY2luZyBhbmQgSm9pbmluZyd9XG4gKi9cbmZ1bmN0aW9uIHNsaWNlXzxSIGV4dGVuZHMgUmFuaywgVCBleHRlbmRzIFRlbnNvcjxSPj4oXG4gICAgeDogVHxUZW5zb3JMaWtlLCBiZWdpbjogbnVtYmVyfG51bWJlcltdLCBzaXplPzogbnVtYmVyfG51bWJlcltdKTogVCB7XG4gIGNvbnN0ICR4ID0gY29udmVydFRvVGVuc29yKHgsICd4JywgJ3NsaWNlJywgJ3N0cmluZ19vcl9udW1lcmljJyk7XG5cbiAgaWYgKCR4LnJhbmsgPT09IDApIHtcbiAgICB0aHJvdyBuZXcgRXJyb3IoJ1NsaWNpbmcgc2NhbGFyIGlzIG5vdCBwb3NzaWJsZScpO1xuICB9XG5cbiAgY29uc3QgaW5wdXRzOiBTbGljZUlucHV0cyA9IHt4OiAkeH07XG4gIGNvbnN0IGF0dHJzOiBTbGljZUF0dHJzID0ge2JlZ2luLCBzaXplfTtcblxuICByZXR1cm4gRU5HSU5FLnJ1bktlcm5lbChcbiAgICAgIFNsaWNlLCBpbnB1dHMgYXMge30gYXMgTmFtZWRUZW5zb3JNYXAsIGF0dHJzIGFzIHt9IGFzIE5hbWVkQXR0ck1hcCk7XG59XG5cbmV4cG9ydCBjb25zdCBzbGljZSA9IG9wKHtzbGljZV99KTtcbiJdfQ==","/**\n * @license\n * Copyright 2021 Google LLC. All Rights Reserved.\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n * =============================================================================\n */\nimport * as util from '../util';\nconst NEW_AXIS = -2;\nconst SHRINK_AXIS = -1;\nexport function assertParamsValid(input, begin, size) {\n const inputRank = input.shape.length;\n util.assert(inputRank === begin.length, () => `Error in slice${inputRank}D: Length of begin ${begin} must ` +\n `match the rank of the array (${inputRank}).`);\n util.assert(inputRank === size.length, () => `Error in slice${inputRank}D: Length of size ${size} must ` +\n `match the rank of the array (${inputRank}).`);\n for (let i = 0; i < inputRank; ++i) {\n util.assert(begin[i] + size[i] <= input.shape[i], () => `Error in slice${inputRank}D: begin[${i}] + size[${i}] ` +\n `(${begin[i] + size[i]}) would overflow input.shape[${i}] (${input.shape[i]})`);\n }\n}\n/** Converts a binary mask to an array of axes. Used in stridedSlice(). */\nexport function maskToAxes(mask) {\n const axes = [];\n let axis = 0;\n while (mask > 0) {\n if (mask & 1) {\n axes.push(axis);\n }\n mask /= 2;\n axis++;\n }\n return axes;\n}\n/** Computes the output shape given the strided slice params. */\nexport function computeOutShape(begin, end, strides) {\n const size = [];\n for (let axis = 0; axis < begin.length; axis++) {\n size[axis] = Math.ceil((end[axis] - begin[axis]) / strides[axis]);\n }\n return size;\n}\n// Creates full selection at the elided dimensions. If the dimension matches\n// the ellipsis mask, override the current stride value. Otherwise, insert.\nexport function stridesWithElidedDims(strides, ellipsisInsertionIndex, numElidedAxes, inputShape) {\n const newStrides = [...strides];\n for (let i = newStrides.length; i < inputShape.length; i++) {\n newStrides.push(1);\n }\n for (let i = 0; i < numElidedAxes; i++) {\n if (i === 0) {\n newStrides[ellipsisInsertionIndex] = 1;\n }\n else {\n newStrides.splice(ellipsisInsertionIndex, 0 /* num elements to delete */, 1 /* element to add */);\n newStrides.pop();\n }\n }\n return newStrides;\n}\nfunction unnormalizeAxis(ellipsisInsertionIndex, numElidedAxes, normalizedAxis) {\n if (normalizedAxis <= ellipsisInsertionIndex) {\n return normalizedAxis;\n }\n return normalizedAxis - (numElidedAxes - 1);\n}\nfunction getElidedAxes(numElidedAxes, ellipsisInsertionIndex) {\n const elidedAxes = [];\n for (let i = 0; i < numElidedAxes; i++) {\n elidedAxes.push(ellipsisInsertionIndex + i);\n }\n return elidedAxes;\n}\n// Normalize the start, end and strides.\nexport function getNormalizedAxes(inputShape, ellipsisAxes, numInterpolatedAxes, begin, end, strides, beginMask, endMask, ellipsisMask) {\n const inputRank = inputShape.length;\n let normalizedBegin = new Array(inputRank), normalizedEnd = new Array(inputRank), normalizedStrides = new Array(inputRank);\n if (ellipsisAxes.length && numInterpolatedAxes > 0) {\n const fullIndex = ellipsisAxes[0];\n // The ellipsis applies to the masked index as well as any dimensions\n // that are interpolated.\n const numElidedAxes = numInterpolatedAxes + 1;\n normalizedBegin = startIndicesWithElidedDims(beginMask, fullIndex, numElidedAxes, begin, inputShape);\n normalizedEnd = stopIndicesWithElidedDims(endMask, fullIndex, numElidedAxes, end, inputShape);\n normalizedStrides =\n stridesWithElidedDims(strides, fullIndex, numElidedAxes, inputShape);\n }\n else {\n for (let axis = 0; axis < inputRank; axis++) {\n normalizedBegin[axis] = startForAxis(beginMask, begin, strides, inputShape, axis, ellipsisMask);\n normalizedEnd[axis] =\n stopForAxis(endMask, end, strides, inputShape, axis, ellipsisMask);\n normalizedStrides[axis] = stridesForAxis(strides, axis, ellipsisMask);\n }\n }\n return {\n begin: normalizedBegin,\n end: normalizedEnd,\n strides: normalizedStrides\n };\n}\n// Creates full selection at the elided dimensions. If the dimension matches\n// the ellipsis mask, override the current start value. Otherwise, insert.\nexport function startIndicesWithElidedDims(beginMask, ellipsisInsertionIndex, numElidedAxes, originalBegin, inputShape) {\n const newIndices = [...inputShape];\n const elidedAxes = getElidedAxes(numElidedAxes, ellipsisInsertionIndex);\n for (let axis = 0; axis < newIndices.length; axis++) {\n if (elidedAxes.indexOf(axis) > -1) {\n newIndices[axis] = 0;\n }\n else {\n const originalAxis = unnormalizeAxis(ellipsisInsertionIndex, numElidedAxes, axis);\n let originalValue = originalBegin[originalAxis];\n if (beginMask & 1 << originalAxis) {\n originalValue = 0;\n }\n newIndices[axis] = originalValue;\n }\n }\n return newIndices;\n}\n// Creates full selection at the elided dimensions. If the dimension matches\n// the ellipsis mask, override the current stop value. Otherwise, insert.\nexport function stopIndicesWithElidedDims(endMask, ellipsisInsertionIndex, numElidedAxes, originalEnd, inputShape) {\n const newIndices = [...inputShape];\n const elidedAxes = getElidedAxes(numElidedAxes, ellipsisInsertionIndex);\n for (let axis = 0; axis < newIndices.length; axis++) {\n if (elidedAxes.indexOf(axis) > -1) {\n newIndices[axis] = Number.MAX_SAFE_INTEGER;\n }\n else {\n const originalAxis = unnormalizeAxis(ellipsisInsertionIndex, numElidedAxes, axis);\n let originalValue = originalEnd[originalAxis];\n if (endMask & 1 << originalAxis) {\n originalValue = Number.MAX_SAFE_INTEGER;\n }\n newIndices[axis] = originalValue;\n }\n }\n for (let i = 0; i < newIndices.length; i++) {\n // Handle negative indices\n const axisSize = inputShape[i];\n if (newIndices[i] < 0) {\n newIndices[i] += axisSize;\n }\n newIndices[i] = util.clamp(0, newIndices[i], inputShape[i]);\n }\n return newIndices;\n}\nexport function stridesForAxis(strides, axis, ellipsisMask) {\n let stride = strides[axis];\n if (ellipsisMask & (1 << axis) || stride == null) {\n stride = 1;\n }\n return stride;\n}\nexport function startForAxis(beginMask, startIndices, strides, inputShape, axis, ellipsisMask) {\n // Begin with the specified index\n let start = startIndices[axis];\n const stride = strides[axis] || 1;\n // Check the axis bit from right of masked axes, or the begin index is not set\n // for the axis.\n if (beginMask & 1 << axis || ellipsisMask & 1 << axis || start == null) {\n if (stride > 0) {\n // Forward iteration - use the first element. These values will get\n // clamped below (Note: We could have set them to 0 and axis_size-1, but\n // use lowest() and max() to maintain symmetry with StopForAxis())\n start = Number.MIN_SAFE_INTEGER;\n }\n else {\n // Backward iteration - use the last element.\n start = Number.MAX_SAFE_INTEGER;\n }\n }\n // Handle negative indices\n const axisSize = inputShape[axis];\n if (start < 0) {\n start += axisSize;\n }\n // Clamping\n start = util.clamp(0, start, axisSize - 1);\n return start;\n}\nexport function stopForAxis(endMask, stopIndices, strides, inputShape, axis, ellipsisMask) {\n // Begin with the specified index\n let stop = stopIndices[axis];\n const stride = strides[axis] || 1;\n // Check the axis bit from right of masked axes, or if the stop index is not\n // set for this axis.\n if (endMask & (1 << axis) || ellipsisMask & (1 << axis) || stop == null) {\n if (stride > 0) {\n // Forward iteration - use the last element. These values will get\n // clamped below\n stop = Number.MAX_SAFE_INTEGER;\n }\n else {\n // Backward iteration - use the first element.\n stop = Number.MIN_SAFE_INTEGER;\n }\n }\n // Handle negative indices\n const axisSize = inputShape[axis];\n if (stop < 0) {\n stop += axisSize;\n }\n // Clamping\n // Because the end index points one past the last element, we need slightly\n // different clamping ranges depending on the direction.\n if (stride > 0) {\n // Forward iteration\n stop = util.clamp(0, stop, axisSize);\n }\n else {\n // Backward iteration\n stop = util.clamp(-1, stop, axisSize - 1);\n }\n return stop;\n}\n/**\n * Returns true if the slice occupies a continous set of elements in the\n * 'flat' space.\n */\nexport function isSliceContinous(shape, begin, size) {\n // Index of the first axis that has size > 1.\n let firstNonOneAxis = size.length;\n for (let i = 0; i < size.length; i++) {\n if (size[i] > 1) {\n firstNonOneAxis = i;\n break;\n }\n }\n for (let i = firstNonOneAxis + 1; i < size.length; i++) {\n if (begin[i] > 0 || size[i] !== shape[i]) {\n return false;\n }\n }\n return true;\n}\nexport function computeFlatOffset(begin, strides) {\n let flatOffset = begin.length > 0 ? begin[begin.length - 1] : 1;\n for (let i = 0; i < begin.length - 1; i++) {\n flatOffset += begin[i] * strides[i];\n }\n return flatOffset;\n}\nexport function parseSliceParams(x, begin, size) {\n // The following logic allows for more ergonomic calls.\n let begin_;\n const xRank = x.shape.length;\n if (typeof begin === 'number') {\n begin_ = [begin, ...new Array(xRank - 1).fill(0)];\n }\n else if (begin.length < xRank) {\n begin_ = begin.concat(new Array(xRank - begin.length).fill(0));\n }\n else {\n begin_ = begin.slice();\n }\n begin_.forEach(d => {\n util.assert(d !== -1, () => 'slice() does not support negative begin indexing.');\n });\n let size_;\n if (size == null) {\n size_ = new Array(xRank).fill(-1);\n }\n else if (typeof size === 'number') {\n size_ = [size, ...new Array(xRank - 1).fill(-1)];\n }\n else if (size.length < xRank) {\n size_ = size.concat(new Array(xRank - size.length).fill(-1));\n }\n else {\n size_ = size;\n }\n size_ = size_.map((d, i) => {\n if (d >= 0) {\n return d;\n }\n else {\n util.assert(d === -1, () => `Negative size values should be exactly -1 but got ` +\n `${d} for the slice() size at index ${i}.`);\n return x.shape[i] - begin_[i];\n }\n });\n return [begin_, size_];\n}\n// Convert the slicing specification from a sparse representation to a dense\n// representation. This means that all ellipses and newaxis are expanded out.\nexport function sliceInfo(xShape, begin, end, strides, beginMask, endMask, ellipsisMask, newAxisMask, shrinkAxisMask) {\n let stridesNonNull;\n if (strides == null) {\n stridesNonNull = new Array(begin.length);\n stridesNonNull.fill(1);\n }\n else {\n stridesNonNull = strides;\n }\n // Only one non-zero bit is allowed in ellipsisMask, which means ellipsisMask\n // is a power of 2. Use bit compares to ensure ellipsisMask is 0 or a power\n // of 2. When i is a power of 2, i & (i - 1) is always 0.\n // Also ref:\n // https://stackoverflow.com/questions/600293/how-to-check-if-a-number-is-a-power-of-2\n if (ellipsisMask != null && (ellipsisMask & (ellipsisMask - 1)) !== 0) {\n throw new Error('Multiple ellipses in slice is not allowed.');\n }\n // Step 1: Account for ellipsis and new axis.\n // Check for ellipsis and count how many non-newaxis there are after.\n let ellipsisSeen = false;\n const sparseSpec = {\n dims: stridesNonNull.length,\n numAddAxisAfterEllipsis: 0,\n begin: begin.slice(),\n end: end.slice(),\n strides: stridesNonNull.slice(),\n beginMask,\n endMask,\n ellipsisMask,\n newAxisMask,\n shrinkAxisMask\n };\n for (let i = 0; i < sparseSpec.dims; i++) {\n if (ellipsisSeen && ((1 << i) & newAxisMask) !== 0) {\n sparseSpec.numAddAxisAfterEllipsis++;\n }\n if ((1 << i) & ellipsisMask) {\n ellipsisSeen = true;\n }\n }\n // If no ellipsis insert one at the end.\n if (!ellipsisSeen) {\n sparseSpec.ellipsisMask |= (1 << sparseSpec.dims);\n sparseSpec.dims++; // this effects loop iteration below\n }\n // Step 2: Make a sparse spec into a full index spec.\n //\n // The sparse spec deos not correspond to the number of dimensions.\n // Make a dense spec that cooresponds to the number of dimensions.\n //\n // For example suppose foo[...,3:] on foo.shape = [2, 2, 3] then we need to\n // produce the missing beginMask for the first two dimensions i.e. from\n // beginMaskSpec = 0, endMaskSpec = 2, we achieve beginMask = 6 (110),\n // endMask = 7 (111).\n const denseSpec = {\n dims: xShape.length,\n beginMask: 0,\n endMask: 0,\n beginValid: false,\n endValid: false\n };\n buildDenseSpec(sparseSpec, denseSpec);\n // Step 3: Make implicit ranges (non-zero beginMasks and endMasks) explicit\n // and bounds check.\n let isIdentity = true;\n let sliceDim0 = true;\n let isSimpleSlice = true;\n const processingShape = [];\n const finalShape = [];\n for (let i = 0; i < xShape.length; ++i) {\n if (denseSpec.strides[i] === 0) {\n throw Error(`strides[${i}] must be non-zero`);\n }\n const shrinkI = !!(denseSpec.shrinkAxisMask & (1 << i));\n const dimI = xShape[i];\n if (dimI === -1) {\n processingShape.push(shrinkI ? 1 : -1);\n continue;\n }\n const masks = [denseSpec.beginMask & (1 << i), denseSpec.endMask & (1 << i)];\n const validRange = [\n denseSpec.strides[i] > 0 ? 0 : -1,\n denseSpec.strides[i] > 0 ? dimI : dimI - 1\n ];\n if (shrinkI && denseSpec.strides[i] <= 0) {\n throw Error('only stride 1 allowed on non-range indexing.');\n }\n isSimpleSlice = isSimpleSlice && (denseSpec.strides[i] === 1);\n const beginAndEndMasked = !!((denseSpec.beginMask & (1 << i)) && (denseSpec.endMask & (1 << i)));\n if (denseSpec.beginValid && denseSpec.endValid) {\n if (shrinkI) {\n // If we are shrinking, the end index is now possibly incorrect. In\n // particular foo[-1] produces sparseBegin = -1, sparseEnd = 0.\n // and canonical puts these to n-1 and 0, which implies a degenerate\n // interval. Fortunately, it is now safe to re-create end as begin + 1.\n const xFwd = denseSpec.begin[i] < 0 ? dimI + denseSpec.begin[i] :\n denseSpec.begin[i];\n denseSpec.begin[i] = xFwd;\n denseSpec.end[i] = denseSpec.begin[i] + 1;\n if (xFwd < 0 || xFwd >= dimI) {\n throw Error(`slice index ${denseSpec.begin[i]} of dimension ${i} out of bounds.`);\n }\n }\n else {\n denseSpec.begin[i] = canonical(denseSpec.begin[i], 0, denseSpec.strides[i], dimI, masks, validRange);\n denseSpec.end[i] = canonical(denseSpec.end[i], 1, denseSpec.strides[i], dimI, masks, validRange);\n }\n // Update optimization values\n const takeAllInDimension = denseSpec.strides[i] === 1 &&\n denseSpec.begin[i] === 0 && denseSpec.end[i] === dimI;\n isIdentity = isIdentity && takeAllInDimension;\n sliceDim0 = sliceDim0 &&\n ((i === 0 && denseSpec.strides[i] === 1) || takeAllInDimension);\n }\n else {\n isIdentity =\n isIdentity && ((denseSpec.strides[i] === 1) && beginAndEndMasked);\n sliceDim0 = sliceDim0 &&\n ((i === 0 && denseSpec.strides[i] === 1) || beginAndEndMasked);\n }\n // Compute the processing shape (the intermediate Eigen will produce)\n let intervalLength;\n let knownInterval = false;\n if (denseSpec.beginValid && denseSpec.endValid) {\n intervalLength = denseSpec.end[i] - denseSpec.begin[i];\n knownInterval = true;\n }\n else if (shrinkI) {\n // The dimension is still known as 1 for the processingShape, but will be\n // discarded for the final shape.\n intervalLength = 1;\n knownInterval = true;\n }\n else if (beginAndEndMasked) {\n // Even if we don't have values for begin or end, we do know that this\n // dimension covers the whole interval. If we have shape information for\n // this dimension, that tells us the interval length.\n if (dimI >= 0) {\n if (denseSpec.strides[i] < 0) {\n intervalLength = -dimI;\n }\n else {\n intervalLength = dimI;\n }\n knownInterval = true;\n }\n }\n if (knownInterval) {\n let sizeI;\n // Hold zero if the interval is degenerate, otherwise account for\n // remainder\n if (intervalLength === 0 ||\n ((intervalLength < 0) !== (denseSpec.strides[i] < 0))) {\n sizeI = 0;\n }\n else {\n sizeI = Math.trunc(intervalLength / denseSpec.strides[i]) +\n (intervalLength % denseSpec.strides[i] !== 0 ? 1 : 0);\n }\n processingShape.push(sizeI);\n }\n else {\n processingShape.push(-1);\n }\n }\n // Step 4: Compute the final shape\n //\n // newAxis will increase dimension by 1 (with a one-size dimension)\n // slices like foo[3, ...] will reduce dimension by 1.\n // This cannot be done earlier, because it depends on Step 3.\n for (let denseDim = 0; denseDim < denseSpec.finalShapeGatherIndices.length; ++denseDim) {\n const gatherIndex = denseSpec.finalShapeGatherIndices[denseDim];\n if (gatherIndex >= 0) {\n finalShape.push(processingShape[gatherIndex]);\n }\n else if (gatherIndex === NEW_AXIS) {\n finalShape.push(1);\n }\n }\n const finalShapeSparse = finalShape.filter((dim, i) => denseSpec.finalShapeGatherIndices[i] !== NEW_AXIS);\n return {\n finalShapeSparse,\n finalShape,\n isIdentity,\n sliceDim0,\n isSimpleSlice,\n begin: denseSpec.begin,\n end: denseSpec.end,\n strides: denseSpec.strides\n };\n}\nfunction buildDenseSpec(sparse, dense) {\n dense.beginMask = 0;\n dense.endMask = 0;\n dense.shrinkAxisMask = 0;\n let fullIndex = 0;\n dense.beginValid = sparse.begin != null;\n dense.endValid = sparse.end != null;\n dense.begin = new Array(dense.dims);\n dense.end = new Array(dense.dims);\n dense.strides = new Array(dense.dims);\n dense.finalShapeGatherIndices = [];\n dense.finalShapeGatherIndicesSparse = [];\n dense.inputShapeGatherIndicesSparse = new Array(dense.dims);\n for (let i = 0; i < sparse.dims; i++) {\n if ((1 << i) & sparse.ellipsisMask) {\n // Only the bit that has ellipsis will fall in this condition.\n // Expand the ellipsis into the appropriate indices\n // Note: this only works because we guaranteed one ellipsis.\n const nextIndex = Math.min(dense.dims - (sparse.dims - i) + 1 + sparse.numAddAxisAfterEllipsis, dense.dims);\n for (; fullIndex < nextIndex; fullIndex++) {\n // newAxis aren't real axis so you have to skip.\n dense.begin[fullIndex] = 0;\n dense.end[fullIndex] = 0;\n dense.strides[fullIndex] = 1;\n dense.beginMask |= (1 << fullIndex);\n dense.endMask |= (1 << fullIndex);\n dense.finalShapeGatherIndices.push(fullIndex);\n dense.finalShapeGatherIndicesSparse.push(-1);\n dense.inputShapeGatherIndicesSparse[fullIndex] = i;\n }\n }\n else if ((1 << i) & sparse.newAxisMask) {\n // Only the bit that has newAxis will fall in this condition.\n dense.finalShapeGatherIndices.push(NEW_AXIS);\n dense.finalShapeGatherIndicesSparse.push(-1);\n }\n else {\n if (fullIndex === dense.begin.length) {\n throw Error(`Index out of range using input dim ${fullIndex}; input ` +\n `has only ${dense.dims} dims, ${dense.begin.length}.`);\n }\n // Gather slicing spec into appropriate index.\n if (sparse.begin != null) {\n dense.begin[fullIndex] = sparse.begin[i];\n }\n if (sparse.end != null) {\n dense.end[fullIndex] = sparse.end[i];\n }\n dense.strides[fullIndex] = sparse.strides[i];\n if (sparse.beginMask & (1 << i)) {\n dense.beginMask |= (1 << fullIndex);\n }\n if (sparse.endMask & (1 << i)) {\n dense.endMask |= (1 << fullIndex);\n }\n // If shrink, record where to get the dimensionality from (i.e. newAxis)\n // creates a fake 1 size dimension. Also remember shrink axis (now in\n // dense form) so we can ignore dense.end below.\n if (sparse.shrinkAxisMask & (1 << i)) {\n dense.finalShapeGatherIndices.push(SHRINK_AXIS);\n dense.finalShapeGatherIndicesSparse.push(-1);\n dense.shrinkAxisMask |= (1 << fullIndex);\n }\n else {\n dense.finalShapeGatherIndices.push(fullIndex);\n // Remember that where in the sparse shape the dense dim comes from.\n dense.finalShapeGatherIndicesSparse.push(i);\n }\n dense.inputShapeGatherIndicesSparse[fullIndex] = i;\n fullIndex++;\n }\n }\n}\nfunction canonical(x, c, strideI, dimI, masks, validRange) {\n if (masks[c]) {\n return strideI > 0 ? validRange[c] : validRange[(c + 1) & 1];\n }\n else {\n const xFwd = x < 0 ? dimI + x : x; // make negative indices positive\n return xFwd < validRange[0] ? validRange[0] :\n xFwd > validRange[1] ? validRange[1] : xFwd;\n }\n}\n//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic2xpY2VfdXRpbC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uLy4uL3RmanMtY29yZS9zcmMvb3BzL3NsaWNlX3V0aWwudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUE7Ozs7Ozs7Ozs7Ozs7OztHQWVHO0FBR0gsT0FBTyxLQUFLLElBQUksTUFBTSxTQUFTLENBQUM7QUFFaEMsTUFBTSxRQUFRLEdBQUcsQ0FBQyxDQUFDLENBQUM7QUFDcEIsTUFBTSxXQUFXLEdBQUcsQ0FBQyxDQUFDLENBQUM7QUE2RHZCLE1BQU0sVUFBVSxpQkFBaUIsQ0FDN0IsS0FBaUIsRUFBRSxLQUFlLEVBQUUsSUFBYztJQUNwRCxNQUFNLFNBQVMsR0FBRyxLQUFLLENBQUMsS0FBSyxDQUFDLE1BQU0sQ0FBQztJQUNyQyxJQUFJLENBQUMsTUFBTSxDQUNQLFNBQVMsS0FBSyxLQUFLLENBQUMsTUFBTSxFQUMxQixHQUFHLEVBQUUsQ0FBQyxpQkFBaUIsU0FBUyxzQkFBc0IsS0FBSyxRQUFRO1FBQy9ELGdDQUFnQyxTQUFTLElBQUksQ0FBQyxDQUFDO0lBQ3ZELElBQUksQ0FBQyxNQUFNLENBQ1AsU0FBUyxLQUFLLElBQUksQ0FBQyxNQUFNLEVBQ3pCLEdBQUcsRUFBRSxDQUFDLGlCQUFpQixTQUFTLHFCQUFxQixJQUFJLFFBQVE7UUFDN0QsZ0NBQWdDLFNBQVMsSUFBSSxDQUFDLENBQUM7SUFFdkQsS0FBSyxJQUFJLENBQUMsR0FBRyxDQUFDLEVBQUUsQ0FBQyxHQUFHLFNBQVMsRUFBRSxFQUFFLENBQUMsRUFBRTtRQUNsQyxJQUFJLENBQUMsTUFBTSxDQUNQLEtBQUssQ0FBQyxDQUFDLENBQUMsR0FBRyxJQUFJLENBQUMsQ0FBQyxDQUFDLElBQUksS0FBSyxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUMsRUFDcEMsR0FBRyxFQUFFLENBQUMsaUJBQWlCLFNBQVMsWUFBWSxDQUFDLFlBQVksQ0FBQyxJQUFJO1lBQzFELElBQUksS0FBSyxDQUFD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UyxDQUFDLENBQUM7Z0JBQzlDLG9FQUFvRTtnQkFDcEUsS0FBSyxDQUFDLDZCQUE2QixDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsQ0FBQzthQUM3QztZQUNELEtBQUssQ0FBQyw2QkFBNkIsQ0FBQyxTQUFTLENBQUMsR0FBRyxDQUFDLENBQUM7WUFDbkQsU0FBUyxFQUFFLENBQUM7U0FDYjtLQUNGO0FBQ0gsQ0FBQztBQUVELFNBQVMsU0FBUyxDQUNkLENBQVMsRUFBRSxDQUFTLEVBQUUsT0FBZSxFQUFFLElBQVksRUFBRSxLQUFlLEVBQ3BFLFVBQW9CO0lBQ3RCLElBQUksS0FBSyxDQUFDLENBQUMsQ0FBQyxFQUFFO1FBQ1osT0FBTyxPQUFPLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxVQUFVLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLFVBQVUsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQztLQUM5RDtTQUFNO1FBQ0wsTUFBTSxJQUFJLEdBQUcsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUUsaUNBQWlDO1FBQ3JFLE9BQU8sSUFBSSxHQUFHLFVBQVUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsVUFBVSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUM7WUFDZixJQUFJLEdBQUcsVUFBVSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxVQUFVLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQztLQUMzRTtBQUNILENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyIvKipcbiAqIEBsaWNlbnNlXG4gKiBDb3B5cmlnaHQgMjAyMSBHb29nbGUgTExDLiBBbGwgUmlnaHRzIFJlc2VydmVkLlxuICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlIFwiTGljZW5zZVwiKTtcbiAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS5cbiAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdFxuICpcbiAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMFxuICpcbiAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmVcbiAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuIFwiQVMgSVNcIiBCQVNJUyxcbiAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLlxuICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZFxuICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuXG4gKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuICovXG5cbmltcG9ydCB7VGVuc29ySW5mb30gZnJvbSAnLi4va2VybmVsX3JlZ2lzdHJ5JztcbmltcG9ydCAqIGFzIHV0aWwgZnJvbSAnLi4vdXRpbCc7XG5cbmNvbnN0IE5FV19BWElTID0gLTI7XG5jb25zdCBTSFJJTktfQVhJUyA9IC0xO1xuXG4vLyBTcGFyc2Ugc2xpY2luZyBzcGVjaWZpY2F0aW9uXG4vLyBpZiBvbmUgZG9lcyBmb29bMzo1LCAuLi4sIC0zXSwgdGhlIGJlZ2luLCBlbmQgYW5kIHN0cmlkZXMgd2lsbCBoYXZlIGxlbmd0aFxuLy8gb2YgMy5cbmludGVyZmFjZSBTdHJpZGVkU2xpY2VTcGFyc2VTcGVjIHtcbiAgZGltczogbnVtYmVyO1xuICBudW1BZGRBeGlzQWZ0ZXJFbGxpcHNpczogbnVtYmVyO1xuICBiZWdpbjogbnVtYmVyW107XG4gIGVuZDogbnVtYmVyW107XG4gIHN0cmlkZXM6IG51bWJlcltdO1xuICBiZWdpbk1hc2s6IG51bWJlcjtcbiAgZW5kTWFzazogbnVtYmVyO1xuICBlbGxpcHNpc01hc2s6IG51bWJlcjtcbiAgbmV3QXhpc01hc2s6IG51bWJlcjtcbiAgc2hyaW5rQXhpc01hc2s6IG51bWJlcjtcbn1cblxuLy8gRGVuc2Ugc2xpY2luZyBzcGVjaWZpY2F0aW9uXG4vLyBhbGwgZWxsaXBzZXMgYW5kIG5ld2F4aXMgYXJlIGV4cGFuZGVkIG91dC4gU28gaWYgZm9vWzM6NSwgLi4uLCAtM10gd2hlcmUgZm9vXG4vLyBpcyAxMCBkaW1lbnNpb25hbCwgZWFjaCBhcnJheSBvZiBiZWdpbiwgZW5kLCBzdHJpZGVzIHdpbGwgaGF2ZSAxMCBlbnRyaWVzXG4vLyB3aGVyZSBhcyB0aGUgc3BhcnNlIGNhbiBoYXZlIGxlbmd0aCBsZXNzIHRoYW4gdGhlIHJhbmsgb2YgZm9vLlxuaW50ZXJmYWNlIFN0cmlkZWRTbGljZURlbnNlU3BlYyB7XG4gIGRpbXM6IG51bWJlcjtcbiAgYmVnaW5NYXNrPzogbnVtYmVyO1xuICBlbmRNYXNrPzogbnVtYmVyO1xuICBiZWdpblZhbGlkOiBib29sZWFuO1xuICBlbmRWYWxpZDogYm9vbGVhbjtcbiAgYmVnaW4/OiBudW1iZXJbXTtcbiAgZW5kPzogbnVtYmVyW107XG4gIHN0cmlkZXM/OiBudW1iZXJbXTtcbiAgLy8gVGhpcyBhcnJheSBoZWxwcyBjb25zdHJ1Y3QgdGhlIGZpbmFsIHNoYXBlIG9mIHRoZSBzbGljZS5cbiAgLy8gVGhlIGZpbmFsIHRlbnNvciBpcyByZWR1Y2VkIGluIHJhbmsgd2hlbmV2ZXIgYSBzaW5nbGUgaW5kZXggZS5nLiBmb29bM11cbiAgLy8gaXMgY2FsbGVkIGZvci4gVGhlIGZpbmFsIHRlbnNvciBpbmNyZWFzZXMgaW4gcmFuayB3aXRoIG5ld0F4aXMgZW50cmllcy5cbiAgLy8gSWYgYW4gaW5kZXggaW4gdGhpcyBhcnJheSBpcyBwb3NpdGl2ZSwgdGhlIHNpemUgb2YgdGhlIGRpbWVuc2lvbiBpc1xuICAvLyBvYnRhaW5lZCBmcm9tIGNhbm9uaWNhbCBlbmQtYmVnaW4uICBPdGhlcndpc2UsIGlmIGl0IGlzIGEgTkVXX0FYSVMsIGl0IHdpbGxcbiAgLy8gYmUgMS4gQSBzaHJ1bmsgZGltZW5zaW9uIGlzIHNraXBwZWQuXG4gIGZpbmFsU2hhcGVHYXRoZXJJbmRpY2VzPzogbnVtYmVyW107XG4gIC8vIFRoaXMgYXJyYXkgaGFzIHRoZSBzYW1lIHNpemUgYXMgZmluYWxTaGFwZUdhdGhlckluZGljZXMsIGJ1dCBpdCByZW1lbWJlcnNcbiAgLy8gdGhlIHNwYXJzZSBpbmRleCB0aGF0IGEgZGltZW5zaW9uIGNvbWVzIGZyb20sIGluc3RlYWQgb2YgZGVuc2UgaW5kZXguXG4gIC8vIEEgLTEgaW4gdGhpcyB2ZWN0b3IgbWVhbnMgdGhlIGluZGV4IGlzIG5vdCBmcm9tIHRoZSBzcGFyc2UgaW5wdXQuXG4gIGZpbmFsU2hhcGVHYXRoZXJJbmRpY2VzU3BhcnNlPzogbnVtYmVyW107XG4gIGlucHV0U2hhcGVHYXRoZXJJbmRpY2VzU3BhcnNlPzogbnVtYmVyW107XG4gIC8vIFRoZSBkZW5zZSBpbmRleGVkIHNocmluayBtYXNrIGlzIHdoaWNoIHByb2Nlc3NpbmcgZGltZW5zaW9ucyBzaG91bGQgYmVcbiAgLy8gc2hydW5rLiBGb3IgZXhhbXBsZSwgaWYgZm9vLnNoYXBlID0gWzEwLCAxMCwgMTAsIDEwXSwgZm9vWzMsIC4uLiwgNV0gaGFzXG4gIC8vIHNwYXJzZVNocmlua0F4aXNNYXNrIG9mIDUgKDAxMDEpIGFuZCBkZW5zZVNocmlua0F4aXNNYXNrIG9mIDkgKDEwMDEpLFxuICAvLyB5aWVsZGluZyBhIGZpbmFsIHNoYXBlIFsxMCwgMTBdLlxuICBzaHJpbmtBeGlzTWFzaz86IG51bWJlcjtcbn1cblxuZXhwb3J0IHR5cGUgU2xpY2VJbmZvID0ge1xuICBmaW5hbFNoYXBlU3BhcnNlOiBudW1iZXJbXSxcbiAgZmluYWxTaGFwZTogbnVtYmVyW10sXG4gIGlzSWRlbnRpdHk6IGJvb2xlYW4sXG4gIHNsaWNlRGltMDogYm9vbGVhbixcbiAgaXNTaW1wbGVTbGljZTogYm9vbGVhbixcbiAgYmVnaW46IG51bWJlcltdLFxuICBlbmQ6IG51bWJlcltdLFxuICBzdHJpZGVzOiBudW1iZXJbXVxufTtcblxuZXhwb3J0IGZ1bmN0aW9uIGFzc2VydFBhcmFtc1ZhbGlkKFxuICAgIGlucHV0OiBUZW5zb3JJbmZvLCBiZWdpbjogbnVtYmVyW10sIHNpemU6IG51bWJlcltdKTogdm9pZCB7XG4gIGNvbnN0IGlucHV0UmFuayA9IGlucHV0LnNoYXBlLmxlbmd0aDtcbiAgdXRpbC5hc3NlcnQoXG4gICAgICBpbnB1dFJhbmsgPT09IGJlZ2luLmxlbmd0aCxcbiAgICAgICgpID0+IGBFcnJvciBpbiBzbGljZSR7aW5wdXRSYW5rfUQ6IExlbmd0aCBvZiBiZWdpbiAke2JlZ2lufSBtdXN0IGAgK1xuICAgICAgICAgIGBtYXRjaCB0aGUgcmFuayBvZiB0aGUgYXJyYXkgKCR7aW5wdXRSYW5rfSkuYCk7XG4gIHV0aWwuYXNzZXJ0KFxuICAgICAgaW5wdXRSYW5rID09PSBzaXplLmxlbmd0aCxcbiAgICAgICgpID0+IGBFcnJvciBpbiBzbGljZSR7aW5wdXRSYW5rfUQ6IExlbmd0aCBvZiBzaXplICR7c2l6ZX0gbXVzdCBgICtcbiAgICAgICAgICBgbWF0Y2ggdGhlIHJhbmsgb2YgdGhlIGFycmF5ICgke2lucHV0UmFua30pLmApO1xuXG4gIGZvciAobGV0IGkgPSAwOyBpIDwgaW5wdXRSYW5rOyArK2kpIHtcbiAgICB1dGlsLmFzc2VydChcbiAgICAgICAgYmVnaW5baV0gKyBzaXplW2ldIDw9IGlucHV0LnNoYXBlW2ldLFxuICAgICAgICAoKSA9PiBgRXJyb3IgaW4gc2xpY2Uke2lucHV0UmFua31EOiBiZWdpblske2l9XSArIHNpemVbJHtpfV0gYCArXG4gICAgICAgICAgICBgKCR7YmVnaW5baV0gKyBzaXplW2ldfSkgd291bGQgb3ZlcmZsb3cgaW5wdXQuc2hhcGVbJHtpfV0gKCR7XG4gICAgICAgICAgICAgICAgICBpbnB1dC5zaGFwZVtpXX0pYCk7XG4gIH1cbn1cblxuLyoqIENvbnZlcnRzIGEgYmluYXJ5IG1hc2sgdG8gYW4gYXJyYXkgb2YgYXhlcy4gVXNlZCBpbiBzdHJpZGVkU2xpY2UoKS4gKi9cbmV4cG9ydCBmdW5jdGlvbiBtYXNrVG9BeGVzKG1hc2s6IG51bWJlcik6IG51bWJlcltdIHtcbiAgY29uc3QgYXhlcyA9IFtdO1xuICBsZXQgYXhpcyA9IDA7XG4gIHdoaWxlIChtYXNrID4gMCkge1xuICAgIGlmIChtYXNrICYgMSkge1xuICAgICAgYXhlcy5wdXNoKGF4aXMpO1xuICAgIH1cbiAgICBtYXNrIC89IDI7XG4gICAgYXhpcysrO1xuICB9XG4gIHJldHVybiBheGVzO1xufVxuXG4vKiogQ29tcHV0ZXMgdGhlIG91dHB1dCBzaGFwZSBnaXZlbiB0aGUgc3RyaWRlZCBzbGljZSBwYXJhbXMuICovXG5leHBvcnQgZnVuY3Rpb24gY29tcHV0ZU91dFNoYXBlKFxuICAgIGJlZ2luOiBudW1iZXJbXSwgZW5kOiBudW1iZXJbXSwgc3RyaWRlczogbnVtYmVyW10pOiBudW1iZXJbXSB7XG4gIGNvbnN0IHNpemUgPSBbXTtcbiAgZm9yIChsZXQgYXhpcyA9IDA7IGF4aXMgPCBiZWdpbi5sZW5ndGg7IGF4aXMrKykge1xuICAgIHNpemVbYXhpc10gPSBNYXRoLmNlaWwoKGVuZFtheGlzXSAtIGJlZ2luW2F4aXNdKSAvIHN0cmlkZXNbYXhpc10pO1xuICB9XG4gIHJldHVybiBzaXplO1xufVxuXG4vLyBDcmVhdGVzIGZ1bGwgc2VsZWN0aW9uIGF0IHRoZSBlbGlkZWQgZGltZW5zaW9ucy4gSWYgdGhlIGRpbWVuc2lvbiBtYXRjaGVzXG4vLyB0aGUgZWxsaXBzaXMgbWFzaywgb3ZlcnJpZGUgdGhlIGN1cnJlbnQgc3RyaWRlIHZhbHVlLiBPdGhlcndpc2UsIGluc2VydC5cbmV4cG9ydCBmdW5jdGlvbiBzdHJpZGVzV2l0aEVsaWRlZERpbXMoXG4gICAgc3RyaWRlczogbnVtYmVyW10sIGVsbGlwc2lzSW5zZXJ0aW9uSW5kZXg6IG51bWJlciwgbnVtRWxpZGVkQXhlczogbnVtYmVyLFxuICAgIGlucHV0U2hhcGU6IG51bWJlcltdKTogbnVtYmVyW10ge1xuICBjb25zdCBuZXdTdHJpZGVzID0gWy4uLnN0cmlkZXNdO1xuICBmb3IgKGxldCBpID0gbmV3U3RyaWRlcy5sZW5ndGg7IGkgPCBpbnB1dFNoYXBlLmxlbmd0aDsgaSsrKSB7XG4gICAgbmV3U3RyaWRlcy5wdXNoKDEpO1xuICB9XG4gIGZvciAobGV0IGkgPSAwOyBpIDwgbnVtRWxpZGVkQXhlczsgaSsrKSB7XG4gICAgaWYgKGkgPT09IDApIHtcbiAgICAgIG5ld1N0cmlkZXNbZWxsaXBzaXNJbnNlcnRpb25JbmRleF0gPSAxO1xuICAgIH0gZWxzZSB7XG4gICAgICBuZXdTdHJpZGVzLnNwbGljZShcbiAgICAgICAgICBlbGxpcHNpc0luc2VydGlvbkluZGV4LCAwIC8qIG51bSBlbGVtZW50cyB0byBkZWxldGUgKi8sXG4gICAgICAgICAgMSAvKiBlbGVtZW50IHRvIGFkZCAqLyk7XG4gICAgICBuZXdTdHJpZGVzLnBvcCgpO1xuICAgIH1cbiAgfVxuICByZXR1cm4gbmV3U3RyaWRlcztcbn1cblxuZnVuY3Rpb24gdW5ub3JtYWxpemVBeGlzKFxuICAgIGVsbGlwc2lzSW5zZXJ0aW9uSW5kZXg6IG51bWJlciwgbnVtRWxpZGVkQXhlczogbnVtYmVyLFxuICAgIG5vcm1hbGl6ZWRBeGlzOiBudW1iZXIpOiBudW1iZXIge1xuICBpZiAobm9ybWFsaXplZEF4aXMgPD0gZWxsaXBzaXNJbnNlcnRpb25JbmRleCkge1xuICAgIHJldHVybiBub3JtYWxpemVkQXhpcztcbiAgfVxuXG4gIHJldHVybiBub3JtYWxpemVkQXhpcyAtIChudW1FbGlkZWRBeGVzIC0gMSk7XG59XG5cbmZ1bmN0aW9uIGdldEVsaWRlZEF4ZXMobnVtRWxpZGVkQXhlczogbnVtYmVyLCBlbGxpcHNpc0luc2VydGlvbkluZGV4OiBudW1iZXIpIHtcbiAgY29uc3QgZWxpZGVkQXhlcyA9IFtdO1xuICBmb3IgKGxldCBpID0gMDsgaSA8IG51bUVsaWRlZEF4ZXM7IGkrKykge1xuICAgIGVsaWRlZEF4ZXMucHVzaChlbGxpcHNpc0luc2VydGlvbkluZGV4ICsgaSk7XG4gIH1cbiAgcmV0dXJuIGVsaWRlZEF4ZXM7XG59XG5cbi8vIE5vcm1hbGl6ZSB0aGUgc3RhcnQsIGVuZCBhbmQgc3RyaWRlcy5cbmV4cG9ydCBmdW5jdGlvbiBnZXROb3JtYWxpemVkQXhlcyhcbiAgICBpbnB1dFNoYXBlOiBudW1iZXJbXSwgZWxsaXBzaXNBeGVzOiBudW1iZXJbXSwgbnVtSW50ZXJwb2xhdGVkQXhlczogbnVtYmVyLFxuICAgIGJlZ2luOiBudW1iZXJbXSwgZW5kOiBudW1iZXJbXSwgc3RyaWRlczogbnVtYmVyW10sIGJlZ2luTWFzazogbnVtYmVyLFxuICAgIGVuZE1hc2s6IG51bWJlcixcbiAgICBlbGxpcHNpc01hc2s6IG51bWJlcik6IHtiZWdpbjogbnVtYmVyW10sIGVuZDogbnVtYmVyW10sIHN0cmlkZXM6IG51bWJlcltdfSB7XG4gIGNvbnN0IGlucHV0UmFuayA9IGlucHV0U2hhcGUubGVuZ3RoO1xuICBsZXQgbm9ybWFsaXplZEJlZ2luID0gbmV3IEFycmF5KGlucHV0UmFuayksXG4gICAgICBub3JtYWxpemVkRW5kID0gbmV3IEFycmF5KGlucHV0UmFuayksXG4gICAgICBub3JtYWxpemVkU3RyaWRlcyA9IG5ldyBBcnJheShpbnB1dFJhbmspO1xuICBpZiAoZWxsaXBzaXNBeGVzLmxlbmd0aCAmJiBudW1JbnRlcnBvbGF0ZWRBeGVzID4gMCkge1xuICAgIGNvbnN0IGZ1bGxJbmRleCA9IGVsbGlwc2lzQXhlc1swXTtcblxuICAgIC8vIFRoZSBlbGxpcHNpcyBhcHBsaWVzIHRvIHRoZSBtYXNrZWQgaW5kZXggYXMgd2VsbCBhcyBhbnkgZGltZW5zaW9uc1xuICAgIC8vIHRoYXQgYXJlIGludGVycG9sYXRlZC5cbiAgICBjb25zdCBudW1FbGlkZWRBeGVzID0gbnVtSW50ZXJwb2xhdGVkQXhlcyArIDE7XG4gICAgbm9ybWFsaXplZEJlZ2luID0gc3RhcnRJbmRpY2VzV2l0aEVsaWRlZERpbXMoXG4gICAgICAgIGJlZ2luTWFzaywgZnVsbEluZGV4LCBudW1FbGlkZWRBeGVzLCBiZWdpbiwgaW5wdXRTaGFwZSk7XG4gICAgbm9ybWFsaXplZEVuZCA9IHN0b3BJbmRpY2VzV2l0aEVsaWRlZERpbXMoXG4gICAgICAgIGVuZE1hc2ssIGZ1bGxJbmRleCwgbnVtRWxpZGVkQXhlcywgZW5kLCBpbnB1dFNoYXBlKTtcbiAgICBub3JtYWxpemVkU3RyaWRlcyA9XG4gICAgICAgIHN0cmlkZXNXaXRoRWxpZGVkRGltcyhzdHJpZGVzLCBmdWxsSW5kZXgsIG51bUVsaWRlZEF4ZXMsIGlucHV0U2hhcGUpO1xuICB9IGVsc2Uge1xuICAgIGZvciAobGV0IGF4aXMgPSAwOyBheGlzIDwgaW5wdXRSYW5rOyBheGlzKyspIHtcbiAgICAgIG5vcm1hbGl6ZWRCZWdpbltheGlzXSA9IHN0YXJ0Rm9yQXhpcyhcbiAgICAgICAgICBiZWdpbk1hc2ssIGJlZ2luLCBzdHJpZGVzLCBpbnB1dFNoYXBlLCBheGlzLCBlbGxpcHNpc01hc2spO1xuICAgICAgbm9ybWFsaXplZEVuZFtheGlzXSA9XG4gICAgICAgICAgc3RvcEZvckF4aXMoZW5kTWFzaywgZW5kLCBzdHJpZGVzLCBpbnB1dFNoYXBlLCBheGlzLCBlbGxpcHNpc01hc2spO1xuICAgICAgbm9ybWFsaXplZFN0cmlkZXNbYXhpc10gPSBzdHJpZGVzRm9yQXhpcyhzdHJpZGVzLCBheGlzLCBlbGxpcHNpc01hc2spO1xuICAgIH1cbiAgfVxuXG4gIHJldHVybiB7XG4gICAgYmVnaW46IG5vcm1hbGl6ZWRCZWdpbixcbiAgICBlbmQ6IG5vcm1hbGl6ZWRFbmQsXG4gICAgc3RyaWRlczogbm9ybWFsaXplZFN0cmlkZXNcbiAgfTtcbn1cblxuLy8gQ3JlYXRlcyBmdWxsIHNlbGVjdGlvbiBhdCB0aGUgZWxpZGVkIGRpbWVuc2lvbnMuIElmIHRoZSBkaW1lbnNpb24gbWF0Y2hlc1xuLy8gdGhlIGVsbGlwc2lzIG1hc2ssIG92ZXJyaWRlIHRoZSBjdXJyZW50IHN0YXJ0IHZhbHVlLiBPdGhlcndpc2UsIGluc2VydC5cbmV4cG9ydCBmdW5jdGlvbiBzdGFydEluZGljZXNXaXRoRWxpZGVkRGltcyhcbiAgICBiZWdpbk1hc2s6IG51bWJlciwgZWxsaXBzaXNJbnNlcnRpb25JbmRleDogbnVtYmVyLCBudW1FbGlkZWRBeGVzOiBudW1iZXIsXG4gICAgb3JpZ2luYWxCZWdpbjogbnVtYmVyW10sIGlucHV0U2hhcGU6IG51bWJlcltdKTogbnVtYmVyW10ge1xuICBjb25zdCBuZXdJbmRpY2VzID0gWy4uLmlucHV0U2hhcGVdO1xuICBjb25zdCBlbGlkZWRBeGVzID0gZ2V0RWxpZGVkQXhlcyhudW1FbGlkZWRBeGVzLCBlbGxpcHNpc0luc2VydGlvbkluZGV4KTtcblxuICBmb3IgKGxldCBheGlzID0gMDsgYXhpcyA8IG5ld0luZGljZXMubGVuZ3RoOyBheGlzKyspIHtcbiAgICBpZiAoZWxpZGVkQXhlcy5pbmRleE9mKGF4aXMpID4gLTEpIHtcbiAgICAgIG5ld0luZGljZXNbYXhpc10gPSAwO1xuICAgIH0gZWxzZSB7XG4gICAgICBjb25zdCBvcmlnaW5hbEF4aXMgPVxuICAgICAgICAgIHVubm9ybWFsaXplQXhpcyhlbGxpcHNpc0luc2VydGlvbkluZGV4LCBudW1FbGlkZWRBeGVzLCBheGlzKTtcbiAgICAgIGxldCBvcmlnaW5hbFZhbHVlID0gb3JpZ2luYWxCZWdpbltvcmlnaW5hbEF4aXNdO1xuICAgICAgaWYgKGJlZ2luTWFzayAmIDEgPDwgb3JpZ2luYWxBeGlzKSB7XG4gICAgICAgIG9yaWdpbmFsVmFsdWUgPSAwO1xuICAgICAgfVxuXG4gICAgICBuZXdJbmRpY2VzW2F4aXNdID0gb3JpZ2luYWxWYWx1ZTtcbiAgICB9XG4gIH1cbiAgcmV0dXJuIG5ld0luZGljZXM7XG59XG5cbi8vIENyZWF0ZXMgZnVsbCBzZWxlY3Rpb24gYXQgdGhlIGVsaWRlZCBkaW1lbnNpb25zLiBJZiB0aGUgZGltZW5zaW9uIG1hdGNoZXNcbi8vIHRoZSBlbGxpcHNpcyBtYXNrLCBvdmVycmlkZSB0aGUgY3VycmVudCBzdG9wIHZhbHVlLiBPdGhlcndpc2UsIGluc2VydC5cbmV4cG9ydCBmdW5jdGlvbiBzdG9wSW5kaWNlc1dpdGhFbGlkZWREaW1zKFxuICAgIGVuZE1hc2s6IG51bWJlciwgZWxsaXBzaXNJbnNlcnRpb25JbmRleDogbnVtYmVyLCBudW1FbGlkZWRBeGVzOiBudW1iZXIsXG4gICAgb3JpZ2luYWxFbmQ6IG51bWJlcltdLCBpbnB1dFNoYXBlOiBudW1iZXJbXSk6IG51bWJlcltdIHtcbiAgY29uc3QgbmV3SW5kaWNlcyA9IFsuLi5pbnB1dFNoYXBlXTtcbiAgY29uc3QgZWxpZGVkQXhlcyA9IGdldEVsaWRlZEF4ZXMobnVtRWxpZGVkQXhlcywgZWxsaXBzaXNJbnNlcnRpb25JbmRleCk7XG5cbiAgZm9yIChsZXQgYXhpcyA9IDA7IGF4aXMgPCBuZXdJbmRpY2VzLmxlbmd0aDsgYXhpcysrKSB7XG4gICAgaWYgKGVsaWRlZEF4ZXMuaW5kZXhPZihheGlzKSA+IC0xKSB7XG4gICAgICBuZXdJbmRpY2VzW2F4aXNdID0gTnVtYmVyLk1BWF9TQUZFX0lOVEVHRVI7XG4gICAgfSBlbHNlIHtcbiAgICAgIGNvbnN0IG9yaWdpbmFsQXhpcyA9XG4gICAgICAgICAgdW5ub3JtYWxpemVBeGlzKGVsbGlwc2lzSW5zZXJ0aW9uSW5kZXgsIG51bUVsaWRlZEF4ZXMsIGF4aXMpO1xuICAgICAgbGV0IG9yaWdpbmFsVmFsdWUgPSBvcmlnaW5hbEVuZFtvcmlnaW5hbEF4aXNdO1xuICAgICAgaWYgKGVuZE1hc2sgJiAxIDw8IG9yaWdpbmFsQXhpcykge1xuICAgICAgICBvcmlnaW5hbFZhbHVlID0gTnVtYmVyLk1BWF9TQUZFX0lOVEVHRVI7XG4gICAgICB9XG4gICAgICBuZXdJbmRpY2VzW2F4aXNdID0gb3JpZ2luYWxWYWx1ZTtcbiAgICB9XG4gIH1cblxuICBmb3IgKGxldCBpID0gMDsgaSA8IG5ld0luZGljZXMubGVuZ3RoOyBpKyspIHtcbiAgICAvLyBIYW5kbGUgbmVnYXRpdmUgaW5kaWNlc1xuICAgIGNvbnN0IGF4aXNTaXplID0gaW5wdXRTaGFwZVtpXTtcbiAgICBpZiAobmV3SW5kaWNlc1tpXSA8IDApIHtcbiAgICAgIG5ld0luZGljZXNbaV0gKz0gYXhpc1NpemU7XG4gICAgfVxuICAgIG5ld0luZGljZXNbaV0gPSB1dGlsLmNsYW1wKDAsIG5ld0luZGljZXNbaV0sIGlucHV0U2hhcGVbaV0pO1xuICB9XG4gIHJldHVybiBuZXdJbmRpY2VzO1xufVxuXG5leHBvcnQgZnVuY3Rpb24gc3RyaWRlc0ZvckF4aXMoXG4gICAgc3RyaWRlczogbnVtYmVyW10sIGF4aXM6IG51bWJlciwgZWxsaXBzaXNNYXNrOiBudW1iZXIpOiBudW1iZXIge1xuICBsZXQgc3RyaWRlID0gc3RyaWRlc1theGlzXTtcbiAgaWYgKGVsbGlwc2lzTWFzayAmICgxIDw8IGF4aXMpIHx8IHN0cmlkZSA9PSBudWxsKSB7XG4gICAgc3RyaWRlID0gMTtcbiAgfVxuXG4gIHJldHVybiBzdHJpZGU7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBzdGFydEZvckF4aXMoXG4gICAgYmVnaW5NYXNrOiBudW1iZXIsIHN0YXJ0SW5kaWNlczogbnVtYmVyW10sIHN0cmlkZXM6IG51bWJlcltdLFxuICAgIGlucHV0U2hhcGU6IG51bWJlcltdLCBheGlzOiBudW1iZXIsIGVsbGlwc2lzTWFzazogbnVtYmVyKTogbnVtYmVyIHtcbiAgLy8gQmVnaW4gd2l0aCB0aGUgc3BlY2lmaWVkIGluZGV4XG4gIGxldCBzdGFydCA9IHN0YXJ0SW5kaWNlc1theGlzXTtcbiAgY29uc3Qgc3RyaWRlID0gc3RyaWRlc1theGlzXSB8fCAxO1xuXG4gIC8vIENoZWNrIHRoZSBheGlzIGJpdCBmcm9tIHJpZ2h0IG9mIG1hc2tlZCBheGVzLCBvciB0aGUgYmVnaW4gaW5kZXggaXMgbm90IHNldFxuICAvLyBmb3IgdGhlIGF4aXMuXG4gIGlmIChiZWdpbk1hc2sgJiAxIDw8IGF4aXMgfHwgZWxsaXBzaXNNYXNrICYgMSA8PCBheGlzIHx8IHN0YXJ0ID09IG51bGwpIHtcbiAgICBpZiAoc3RyaWRlID4gMCkge1xuICAgICAgLy8gRm9yd2FyZCBpdGVyYXRpb24gLSB1c2UgdGhlIGZpcnN0IGVsZW1lbnQuIFRoZXNlIHZhbHVlcyB3aWxsIGdldFxuICAgICAgLy8gY2xhbXBlZCBiZWxvdyAoTm90ZTogV2UgY291bGQgaGF2ZSBzZXQgdGhlbSB0byAwIGFuZCBheGlzX3NpemUtMSwgYnV0XG4gICAgICAvLyB1c2UgbG93ZXN0KCkgYW5kIG1heCgpIHRvIG1haW50YWluIHN5bW1ldHJ5IHdpdGggU3RvcEZvckF4aXMoKSlcbiAgICAgIHN0YXJ0ID0gTnVtYmVyLk1JTl9TQUZFX0lOVEVHRVI7XG4gICAgfSBlbHNlIHtcbiAgICAgIC8vIEJhY2t3YXJkIGl0ZXJhdGlvbiAtIHVzZSB0aGUgbGFzdCBlbGVtZW50LlxuICAgICAgc3RhcnQgPSBOdW1iZXIuTUFYX1NBRkVfSU5URUdFUjtcbiAgICB9XG4gIH1cblxuICAvLyBIYW5kbGUgbmVnYXRpdmUgaW5kaWNlc1xuICBjb25zdCBheGlzU2l6ZSA9IGlucHV0U2hhcGVbYXhpc107XG4gIGlmIChzdGFydCA8IDApIHtcbiAgICBzdGFydCArPSBheGlzU2l6ZTtcbiAgfVxuXG4gIC8vIENsYW1waW5nXG4gIHN0YXJ0ID0gdXRpbC5jbGFtcCgwLCBzdGFydCwgYXhpc1NpemUgLSAxKTtcblxuICByZXR1cm4gc3RhcnQ7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBzdG9wRm9yQXhpcyhcbiAgICBlbmRNYXNrOiBudW1iZXIsIHN0b3BJbmRpY2VzOiBudW1iZXJbXSwgc3RyaWRlczogbnVtYmVyW10sXG4gICAgaW5wdXRTaGFwZTogbnVtYmVyW10sIGF4aXM6IG51bWJlciwgZWxsaXBzaXNNYXNrOiBudW1iZXIpOiBudW1iZXIge1xuICAvLyBCZWdpbiB3aXRoIHRoZSBzcGVjaWZpZWQgaW5kZXhcbiAgbGV0IHN0b3AgPSBzdG9wSW5kaWNlc1theGlzXTtcbiAgY29uc3Qgc3RyaWRlID0gc3RyaWRlc1theGlzXSB8fCAxO1xuXG4gIC8vIENoZWNrIHRoZSBheGlzIGJpdCBmcm9tIHJpZ2h0IG9mIG1hc2tlZCBheGVzLCBvciBpZiB0aGUgc3RvcCBpbmRleCBpcyBub3RcbiAgLy8gc2V0IGZvciB0aGlzIGF4aXMuXG4gIGlmIChlbmRNYXNrICYgKDEgPDwgYXhpcykgfHwgZWxsaXBzaXNNYXNrICYgKDEgPDwgYXhpcykgfHwgc3RvcCA9PSBudWxsKSB7XG4gICAgaWYgKHN0cmlkZSA+IDApIHtcbiAgICAgIC8vIEZvcndhcmQgaXRlcmF0aW9uIC0gdXNlIHRoZSBsYXN0IGVsZW1lbnQuIFRoZXNlIHZhbHVlcyB3aWxsIGdldFxuICAgICAgLy8gY2xhbXBlZCBiZWxvd1xuICAgICAgc3RvcCA9IE51bWJlci5NQVhfU0FGRV9JTlRFR0VSO1xuICAgIH0gZWxzZSB7XG4gICAgICAvLyBCYWNrd2FyZCBpdGVyYXRpb24gLSB1c2UgdGhlIGZpcnN0IGVsZW1lbnQuXG4gICAgICBzdG9wID0gTnVtYmVyLk1JTl9TQUZFX0lOVEVHRVI7XG4gICAgfVxuICB9XG5cbiAgLy8gSGFuZGxlIG5lZ2F0aXZlIGluZGljZXNcbiAgY29uc3QgYXhpc1NpemUgPSBpbnB1dFNoYXBlW2F4aXNdO1xuICBpZiAoc3RvcCA8IDApIHtcbiAgICBzdG9wICs9IGF4aXNTaXplO1xuICB9XG5cbiAgLy8gQ2xhbXBpbmdcbiAgLy8gQmVjYXVzZSB0aGUgZW5kIGluZGV4IHBvaW50cyBvbmUgcGFzdCB0aGUgbGFzdCBlbGVtZW50LCB3ZSBuZWVkIHNsaWdodGx5XG4gIC8vIGRpZmZlcmVudCBjbGFtcGluZyByYW5nZXMgZGVwZW5kaW5nIG9uIHRoZSBkaXJlY3Rpb24uXG4gIGlmIChzdHJpZGUgPiAwKSB7XG4gICAgLy8gRm9yd2FyZCBpdGVyYXRpb25cbiAgICBzdG9wID0gdXRpbC5jbGFtcCgwLCBzdG9wLCBheGlzU2l6ZSk7XG4gIH0gZWxzZSB7XG4gICAgLy8gQmFja3dhcmQgaXRlcmF0aW9uXG4gICAgc3RvcCA9IHV0aWwuY2xhbXAoLTEsIHN0b3AsIGF4aXNTaXplIC0gMSk7XG4gIH1cblxuICByZXR1cm4gc3RvcDtcbn1cblxuLyoqXG4gKiBSZXR1cm5zIHRydWUgaWYgdGhlIHNsaWNlIG9jY3VwaWVzIGEgY29udGlub3VzIHNldCBvZiBlbGVtZW50cyBpbiB0aGVcbiAqICdmbGF0JyBzcGFjZS5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGlzU2xpY2VDb250aW5vdXMoXG4gICAgc2hhcGU6IG51bWJlcltdLCBiZWdpbjogbnVtYmVyW10sIHNpemU6IG51bWJlcltdKSB7XG4gIC8vIEluZGV4IG9mIHRoZSBmaXJzdCBheGlzIHRoYXQgaGFzIHNpemUgPiAxLlxuICBsZXQgZmlyc3ROb25PbmVBeGlzID0gc2l6ZS5sZW5ndGg7XG4gIGZvciAobGV0IGkgPSAwOyBpIDwgc2l6ZS5sZW5ndGg7IGkrKykge1xuICAgIGlmIChzaXplW2ldID4gMSkge1xuICAgICAgZmlyc3ROb25PbmVBeGlzID0gaTtcbiAgICAgIGJyZWFrO1xuICAgIH1cbiAgfVxuXG4gIGZvciAobGV0IGkgPSBmaXJzdE5vbk9uZUF4aXMgKyAxOyBpIDwgc2l6ZS5sZW5ndGg7IGkrKykge1xuICAgIGlmIChiZWdpbltpXSA+IDAgfHwgc2l6ZVtpXSAhPT0gc2hhcGVbaV0pIHtcbiAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9XG4gIH1cbiAgcmV0dXJuIHRydWU7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBjb21wdXRlRmxhdE9mZnNldChiZWdpbjogbnVtYmVyW10sIHN0cmlkZXM6IG51bWJlcltdKTogbnVtYmVyIHtcbiAgbGV0IGZsYXRPZmZzZXQgPSBiZWdpbi5sZW5ndGggPiAwID8gYmVnaW5bYmVnaW4ubGVuZ3RoIC0gMV0gOiAxO1xuICBmb3IgKGxldCBpID0gMDsgaSA8IGJlZ2luLmxlbmd0aCAtIDE7IGkrKykge1xuICAgIGZsYXRPZmZzZXQgKz0gYmVnaW5baV0gKiBzdHJpZGVzW2ldO1xuICB9XG4gIHJldHVybiBmbGF0T2Zmc2V0O1xufVxuXG5leHBvcnQgZnVuY3Rpb24gcGFyc2VTbGljZVBhcmFtcyhcbiAgICB4OiBUZW5zb3JJbmZvLCBiZWdpbjogbnVtYmVyfG51bWJlcltdLCBzaXplPzogbnVtYmVyfG51bWJlcltdKSB7XG4gIC8vIFRoZSBmb2xsb3dpbmcgbG9naWMgYWxsb3dzIGZvciBtb3JlIGVyZ29ub21pYyBjYWxscy5cbiAgbGV0IGJlZ2luXzogbnVtYmVyW107XG4gIGNvbnN0IHhSYW5rID0geC5zaGFwZS5sZW5ndGg7XG4gIGlmICh0eXBlb2YgYmVnaW4gPT09ICdudW1iZXInKSB7XG4gICAgYmVnaW5fID0gW2JlZ2luLCAuLi5uZXcgQXJyYXkoeFJhbmsgLSAxKS5maWxsKDApXTtcbiAgfSBlbHNlIGlmIChiZWdpbi5sZW5ndGggPCB4UmFuaykge1xuICAgIGJlZ2luXyA9IGJlZ2luLmNvbmNhdChuZXcgQXJyYXkoeFJhbmsgLSBiZWdpbi5sZW5ndGgpLmZpbGwoMCkpO1xuICB9IGVsc2Uge1xuICAgIGJlZ2luXyA9IGJlZ2luLnNsaWNlKCk7XG4gIH1cbiAgYmVnaW5fLmZvckVhY2goZCA9PiB7XG4gICAgdXRpbC5hc3NlcnQoXG4gICAgICAgIGQgIT09IC0xLCAoKSA9PiAnc2xpY2UoKSBkb2VzIG5vdCBzdXBwb3J0IG5lZ2F0aXZlIGJlZ2luIGluZGV4aW5nLicpO1xuICB9KTtcbiAgbGV0IHNpemVfOiBudW1iZXJbXTtcbiAgaWYgKHNpemUgPT0gbnVsbCkge1xuICAgIHNpemVfID0gbmV3IEFycmF5KHhSYW5rKS5maWxsKC0xKTtcbiAgfSBlbHNlIGlmICh0eXBlb2Ygc2l6ZSA9PT0gJ251bWJlcicpIHtcbiAgICBzaXplXyA9IFtzaXplLCAuLi5uZXcgQXJyYXkoeFJhbmsgLSAxKS5maWxsKC0xKV07XG4gIH0gZWxzZSBpZiAoc2l6ZS5sZW5ndGggPCB4UmFuaykge1xuICAgIHNpemVfID0gc2l6ZS5jb25jYXQobmV3IEFycmF5KHhSYW5rIC0gc2l6ZS5sZW5ndGgpLmZpbGwoLTEpKTtcbiAgfSBlbHNlIHtcbiAgICBzaXplXyA9IHNpemU7XG4gIH1cbiAgc2l6ZV8gPSBzaXplXy5tYXAoKGQsIGkpID0+IHtcbiAgICBpZiAoZCA+PSAwKSB7XG4gICAgICByZXR1cm4gZDtcbiAgICB9IGVsc2Uge1xuICAgICAgdXRpbC5hc3NlcnQoXG4gICAgICAgICAgZCA9PT0gLTEsXG4gICAgICAgICAgKCkgPT4gYE5lZ2F0aXZlIHNpemUgdmFsdWVzIHNob3VsZCBiZSBleGFjdGx5IC0xIGJ1dCBnb3QgYCArXG4gICAgICAgICAgICAgIGAke2R9IGZvciB0aGUgc2xpY2UoKSBzaXplIGF0IGluZGV4ICR7aX0uYCk7XG4gICAgICByZXR1cm4geC5zaGFwZVtpXSAtIGJlZ2luX1tpXTtcbiAgICB9XG4gIH0pO1xuICByZXR1cm4gW2JlZ2luXywgc2l6ZV9dO1xufVxuXG4vLyBDb252ZXJ0IHRoZSBzbGljaW5nIHNwZWNpZmljYXRpb24gZnJvbSBhIHNwYXJzZSByZXByZXNlbnRhdGlvbiB0byBhIGRlbnNlXG4vLyByZXByZXNlbnRhdGlvbi4gVGhpcyBtZWFucyB0aGF0IGFsbCBlbGxpcHNlcyBhbmQgbmV3YXhpcyBhcmUgZXhwYW5kZWQgb3V0LlxuZXhwb3J0IGZ1bmN0aW9uIHNsaWNlSW5mbyhcbiAgICB4U2hhcGU6IG51bWJlcltdLCBiZWdpbjogbnVtYmVyW10sIGVuZDogbnVtYmVyW10sIHN0cmlkZXM6IG51bWJlcltdLFxuICAgIGJlZ2luTWFzazogbnVtYmVyLCBlbmRNYXNrOiBudW1iZXIsIGVsbGlwc2lzTWFzazogbnVtYmVyLFxuICAgIG5ld0F4aXNNYXNrOiBudW1iZXIsIHNocmlua0F4aXNNYXNrOiBudW1iZXIpOiBTbGljZUluZm8ge1xuICBsZXQgc3RyaWRlc05vbk51bGw7XG4gIGlmIChzdHJpZGVzID09IG51bGwpIHtcbiAgICBzdHJpZGVzTm9uTnVsbCA9IG5ldyBBcnJheShiZWdpbi5sZW5ndGgpO1xuICAgIHN0cmlkZXNOb25OdWxsLmZpbGwoMSk7XG4gIH0gZWxzZSB7XG4gICAgc3RyaWRlc05vbk51bGwgPSBzdHJpZGVzO1xuICB9XG5cbiAgLy8gT25seSBvbmUgbm9uLXplcm8gYml0IGlzIGFsbG93ZWQgaW4gZWxsaXBzaXNNYXNrLCB3aGljaCBtZWFucyBlbGxpcHNpc01hc2tcbiAgLy8gaXMgYSBwb3dlciBvZiAyLiBVc2UgYml0IGNvbXBhcmVzIHRvIGVuc3VyZSBlbGxpcHNpc01hc2sgaXMgMCBvciBhIHBvd2VyXG4gIC8vIG9mIDIuIFdoZW4gaSBpcyBhIHBvd2VyIG9mIDIsIGkgJiAoaSAtIDEpIGlzIGFsd2F5cyAwLlxuICAvLyBBbHNvIHJlZjpcbiAgLy8gaHR0cHM6Ly9zdGFja292ZXJmbG93LmNvbS9xdWVzdGlvbnMvNjAwMjkzL2hvdy10by1jaGVjay1pZi1hLW51bWJlci1pcy1hLXBvd2VyLW9mLTJcbiAgaWYgKGVsbGlwc2lzTWFzayAhPSBudWxsICYmIChlbGxpcHNpc01hc2sgJiAoZWxsaXBzaXNNYXNrIC0gMSkpICE9PSAwKSB7XG4gICAgdGhyb3cgbmV3IEVycm9yKCdNdWx0aXBsZSBlbGxpcHNlcyBpbiBzbGljZSBpcyBub3QgYWxsb3dlZC4nKTtcbiAgfVxuXG4gIC8vIFN0ZXAgMTogQWNjb3VudCBmb3IgZWxsaXBzaXMgYW5kIG5ldyBheGlzLlxuICAvLyBDaGVjayBmb3IgZWxsaXBzaXMgYW5kIGNvdW50IGhvdyBtYW55IG5vbi1uZXdheGlzIHRoZXJlIGFyZSBhZnRlci5cbiAgbGV0IGVsbGlwc2lzU2VlbiA9IGZhbHNlO1xuXG4gIGNvbnN0IHNwYXJzZVNwZWM6IFN0cmlkZWRTbGljZVNwYXJzZVNwZWMgPSB7XG4gICAgZGltczogc3RyaWRlc05vbk51bGwubGVuZ3RoLFxuICAgIG51bUFkZEF4aXNBZnRlckVsbGlwc2lzOiAwLFxuICAgIGJlZ2luOiBiZWdpbi5zbGljZSgpLFxuICAgIGVuZDogZW5kLnNsaWNlKCksXG4gICAgc3RyaWRlczogc3RyaWRlc05vbk51bGwuc2xpY2UoKSxcbiAgICBiZWdpbk1hc2ssXG4gICAgZW5kTWFzayxcbiAgICBlbGxpcHNpc01hc2ssXG4gICAgbmV3QXhpc01hc2ssXG4gICAgc2hyaW5rQXhpc01hc2tcbiAgfTtcblxuICBmb3IgKGxldCBpID0gMDsgaSA8IHNwYXJzZVNwZWMuZGltczsgaSsrKSB7XG4gICAgaWYgKGVsbGlwc2lzU2VlbiAmJiAoKDEgPDwgaSkgJiBuZXdBeGlzTWFzaykgIT09IDApIHtcbiAgICAgIHNwYXJzZVNwZWMubnVtQWRkQXhpc0FmdGVyRWxsaXBzaXMrKztcbiAgICB9XG4gICAgaWYgKCgxIDw8IGkpICYgZWxsaXBzaXNNYXNrKSB7XG4gICAgICBlbGxpcHNpc1NlZW4gPSB0cnVlO1xuICAgIH1cbiAgfVxuICAvLyBJZiBubyBlbGxpcHNpcyBpbnNlcnQgb25lIGF0IHRoZSBlbmQuXG4gIGlmICghZWxsaXBzaXNTZWVuKSB7XG4gICAgc3BhcnNlU3BlYy5lbGxpcHNpc01hc2sgfD0gKDEgPDwgc3BhcnNlU3BlYy5kaW1zKTtcbiAgICBzcGFyc2VTcGVjLmRpbXMrKzsgIC8vIHRoaXMgZWZmZWN0cyBsb29wIGl0ZXJhdGlvbiBiZWxvd1xuICB9XG5cbiAgLy8gU3RlcCAyOiBNYWtlIGEgc3BhcnNlIHNwZWMgaW50byBhIGZ1bGwgaW5kZXggc3BlYy5cbiAgLy9cbiAgLy8gVGhlIHNwYXJzZSBzcGVjIGRlb3Mgbm90IGNvcnJlc3BvbmQgdG8gdGhlIG51bWJlciBvZiBkaW1lbnNpb25zLlxuICAvLyBNYWtlIGEgZGVuc2Ugc3BlYyB0aGF0IGNvb3Jlc3BvbmRzIHRvIHRoZSBudW1iZXIgb2YgZGltZW5zaW9ucy5cbiAgLy9cbiAgLy8gRm9yIGV4YW1wbGUgc3VwcG9zZSBmb29bLi4uLDM6XSBvbiBmb28uc2hhcGUgPSBbMiwgMiwgM10gdGhlbiB3ZSBuZWVkIHRvXG4gIC8vIHByb2R1Y2UgdGhlIG1pc3NpbmcgYmVnaW5NYXNrIGZvciB0aGUgZmlyc3QgdHdvIGRpbWVuc2lvbnMgaS5lLiBmcm9tXG4gIC8vIGJlZ2luTWFza1NwZWMgPSAwLCBlbmRNYXNrU3BlYyA9IDIsIHdlIGFjaGlldmUgYmVnaW5NYXNrID0gNiAoMTEwKSxcbiAgLy8gZW5kTWFzayA9IDcgKDExMSkuXG4gIGNvbnN0IGRlbnNlU3BlYzogU3RyaWRlZFNsaWNlRGVuc2VTcGVjID0ge1xuICAgIGRpbXM6IHhTaGFwZS5sZW5ndGgsXG4gICAgYmVnaW5NYXNrOiAwLFxuICAgIGVuZE1hc2s6IDAsXG4gICAgYmVnaW5WYWxpZDogZmFsc2UsXG4gICAgZW5kVmFsaWQ6IGZhbHNlXG4gIH07XG5cbiAgYnVpbGREZW5zZVNwZWMoc3BhcnNlU3BlYywgZGVuc2VTcGVjKTtcblxuICAvLyBTdGVwIDM6IE1ha2UgaW1wbGljaXQgcmFuZ2VzIChub24temVybyBiZWdpbk1hc2tzIGFuZCBlbmRNYXNrcykgZXhwbGljaXRcbiAgLy8gYW5kIGJvdW5kcyBjaGVjay5cbiAgbGV0IGlzSWRlbnRpdHkgPSB0cnVlO1xuICBsZXQgc2xpY2VEaW0wID0gdHJ1ZTtcbiAgbGV0IGlzU2ltcGxlU2xpY2UgPSB0cnVlO1xuICBjb25zdCBwcm9jZXNzaW5nU2hhcGUgPSBbXTtcbiAgY29uc3QgZmluYWxTaGFwZSA9IFtdO1xuXG4gIGZvciAobGV0IGkgPSAwOyBpIDwgeFNoYXBlLmxlbmd0aDsgKytpKSB7XG4gICAgaWYgKGRlbnNlU3BlYy5zdHJpZGVzW2ldID09PSAwKSB7XG4gICAgICB0aHJvdyBFcnJvcihgc3RyaWRlc1ske2l9XSBtdXN0IGJlIG5vbi16ZXJvYCk7XG4gICAgfVxuICAgIGNvbnN0IHNocmlua0kgPSAhIShkZW5zZVNwZWMuc2hyaW5rQXhpc01hc2sgJiAoMSA8PCBpKSk7XG4gICAgY29uc3QgZGltSSA9IHhTaGFwZVtpXTtcbiAgICBpZiAoZGltSSA9PT0gLTEpIHtcbiAgICAgIHByb2Nlc3NpbmdTaGFwZS5wdXNoKHNocmlua0kgPyAxIDogLTEpO1xuICAgICAgY29udGludWU7XG4gICAgfVxuXG4gICAgY29uc3QgbWFza3MgPVxuICAgICAgICBbZGVuc2VTcGVjLmJlZ2luTWFzayAmICgxIDw8IGkpLCBkZW5zZVNwZWMuZW5kTWFzayAmICgxIDw8IGkpXTtcbiAgICBjb25zdCB2YWxpZFJhbmdlID0gW1xuICAgICAgZGVuc2VTcGVjLnN0cmlkZXNbaV0gPiAwID8gMCA6IC0xLFxuICAgICAgZGVuc2VTcGVjLnN0cmlkZXNbaV0gPiAwID8gZGltSSA6IGRpbUkgLSAxXG4gICAgXTtcblxuICAgIGlmIChzaHJpbmtJICYmIGRlbnNlU3BlYy5zdHJpZGVzW2ldIDw9IDApIHtcbiAgICAgIHRocm93IEVycm9yKCdvbmx5IHN0cmlkZSAxIGFsbG93ZWQgb24gbm9uLXJhbmdlIGluZGV4aW5nLicpO1xuICAgIH1cblxuICAgIGlzU2ltcGxlU2xpY2UgPSBpc1NpbXBsZVNsaWNlICYmIChkZW5zZVNwZWMuc3RyaWRlc1tpXSA9PT0gMSk7XG5cbiAgICBjb25zdCBiZWdpbkFuZEVuZE1hc2tlZCA9XG4gICAgICAgICEhKChkZW5zZVNwZWMuYmVnaW5NYXNrICYgKDEgPDwgaSkpICYmIChkZW5zZVNwZWMuZW5kTWFzayAmICgxIDw8IGkpKSk7XG5cbiAgICBpZiAoZGVuc2VTcGVjLmJlZ2luVmFsaWQgJiYgZGVuc2VTcGVjLmVuZFZhbGlkKSB7XG4gICAgICBpZiAoc2hyaW5rSSkge1xuICAgICAgICAvLyBJZiB3ZSBhcmUgc2hyaW5raW5nLCB0aGUgZW5kIGluZGV4IGlzIG5vdyBwb3NzaWJseSBpbmNvcnJlY3QuIEluXG4gICAgICAgIC8vIHBhcnRpY3VsYXIgZm9vWy0xXSBwcm9kdWNlcyBzcGFyc2VCZWdpbiA9IC0xLCBzcGFyc2VFbmQgPSAwLlxuICAgICAgICAvLyBhbmQgY2Fub25pY2FsIHB1dHMgdGhlc2UgdG8gbi0xIGFuZCAwLCB3aGljaCBpbXBsaWVzIGEgZGVnZW5lcmF0ZVxuICAgICAgICAvLyBpbnRlcnZhbC4gRm9ydHVuYXRlbHksIGl0IGlzIG5vdyBzYWZlIHRvIHJlLWNyZWF0ZSBlbmQgYXMgYmVnaW4gKyAxLlxuICAgICAgICBjb25zdCB4RndkID0gZGVuc2VTcGVjLmJlZ2luW2ldIDwgMCA/IGRpbUkgKyBkZW5zZVNwZWMuYmVnaW5baV0gOlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRlbnNlU3BlYy5iZWdpbltpXTtcbiAgICAgICAgZGVuc2VTcGVjLmJlZ2luW2ldID0geEZ3ZDtcbiAgICAgICAgZGVuc2VTcGVjLmVuZFtpXSA9IGRlbnNlU3BlYy5iZWdpbltpXSArIDE7XG4gICAgICAgIGlmICh4RndkIDwgMCB8fCB4RndkID49IGRpbUkpIHtcbiAgICAgICAgICB0aHJvdyBFcnJvcihgc2xpY2UgaW5kZXggJHtkZW5zZVNwZWMuYmVnaW5baV19IG9mIGRpbWVuc2lvbiAke1xuICAgICAgICAgICAgICBpfSBvdXQgb2YgYm91bmRzLmApO1xuICAgICAgICB9XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBkZW5zZVNwZWMuYmVnaW5baV0gPSBjYW5vbmljYWwoXG4gICAgICAgICAgICBkZW5zZVNwZWMuYmVnaW5baV0sIDAsIGRlbnNlU3BlYy5zdHJpZGVzW2ldLCBkaW1JLCBtYXNrcyxcbiAgICAgICAgICAgIHZhbGlkUmFuZ2UpO1xuICAgICAgICBkZW5zZVNwZWMuZW5kW2ldID0gY2Fub25pY2FsKFxuICAgICAgICAgICAgZGVuc2VTcGVjLmVuZFtpXSwgMSwgZGVuc2VTcGVjLnN0cmlkZXNbaV0sIGRpbUksIG1hc2tzLCB2YWxpZFJhbmdlKTtcbiAgICAgIH1cbiAgICAgIC8vIFVwZGF0ZSBvcHRpbWl6YXRpb24gdmFsdWVzXG4gICAgICBjb25zdCB0YWtlQWxsSW5EaW1lbnNpb24gPSBkZW5zZVNwZWMuc3RyaWRlc1tpXSA9PT0gMSAmJlxuICAgICAgICAgIGRlbnNlU3BlYy5iZWdpbltpXSA9PT0gMCAmJiBkZW5zZVNwZWMuZW5kW2ldID09PSBkaW1JO1xuICAgICAgaXNJZGVudGl0eSA9IGlzSWRlbnRpdHkgJiYgdGFrZUFsbEluRGltZW5zaW9uO1xuICAgICAgc2xpY2VEaW0wID0gc2xpY2VEaW0wICYmXG4gICAgICAgICAgKChpID09PSAwICYmIGRlbnNlU3BlYy5zdHJpZGVzW2ldID09PSAxKSB8fCB0YWtlQWxsSW5EaW1lbnNpb24pO1xuICAgIH0gZWxzZSB7XG4gICAgICBpc0lkZW50aXR5ID1cbiAgICAgICAgICBpc0lkZW50aXR5ICYmICgoZGVuc2VTcGVjLnN0cmlkZXNbaV0gPT09IDEpICYmIGJlZ2luQW5kRW5kTWFza2VkKTtcbiAgICAgIHNsaWNlRGltMCA9IHNsaWNlRGltMCAmJlxuICAgICAgICAgICgoaSA9PT0gMCAmJiBkZW5zZVNwZWMuc3RyaWRlc1tpXSA9PT0gMSkgfHwgYmVnaW5BbmRFbmRNYXNrZWQpO1xuICAgIH1cbiAgICAvLyBDb21wdXRlIHRoZSBwcm9jZXNzaW5nIHNoYXBlICh0aGUgaW50ZXJtZWRpYXRlIEVpZ2VuIHdpbGwgcHJvZHVjZSlcbiAgICBsZXQgaW50ZXJ2YWxMZW5ndGg7XG4gICAgbGV0IGtub3duSW50ZXJ2YWwgPSBmYWxzZTtcbiAgICBpZiAoZGVuc2VTcGVjLmJlZ2luVmFsaWQgJiYgZGVuc2VTcGVjLmVuZFZhbGlkKSB7XG4gICAgICBpbnRlcnZhbExlbmd0aCA9IGRlbnNlU3BlYy5lbmRbaV0gLSBkZW5zZVNwZWMuYmVnaW5baV07XG4gICAgICBrbm93bkludGVydmFsID0gdHJ1ZTtcbiAgICB9IGVsc2UgaWYgKHNocmlua0kpIHtcbiAgICAgIC8vIFRoZSBkaW1lbnNpb24gaXMgc3RpbGwga25vd24gYXMgMSBmb3IgdGhlIHByb2Nlc3NpbmdTaGFwZSwgYnV0IHdpbGwgYmVcbiAgICAgIC8vIGRpc2NhcmRlZCBmb3IgdGhlIGZpbmFsIHNoYXBlLlxuICAgICAgaW50ZXJ2YWxMZW5ndGggPSAxO1xuICAgICAga25vd25JbnRlcnZhbCA9IHRydWU7XG4gICAgfSBlbHNlIGlmIChiZWdpbkFuZEVuZE1hc2tlZCkge1xuICAgICAgLy8gRXZlbiBpZiB3ZSBkb24ndCBoYXZlIHZhbHVlcyBmb3IgYmVnaW4gb3IgZW5kLCB3ZSBkbyBrbm93IHRoYXQgdGhpc1xuICAgICAgLy8gZGltZW5zaW9uIGNvdmVycyB0aGUgd2hvbGUgaW50ZXJ2YWwuIElmIHdlIGhhdmUgc2hhcGUgaW5mb3JtYXRpb24gZm9yXG4gICAgICAvLyB0aGlzIGRpbWVuc2lvbiwgdGhhdCB0ZWxscyB1cyB0aGUgaW50ZXJ2YWwgbGVuZ3RoLlxuICAgICAgaWYgKGRpbUkgPj0gMCkge1xuICAgICAgICBpZiAoZGVuc2VTcGVjLnN0cmlkZXNbaV0gPCAwKSB7XG4gICAgICAgICAgaW50ZXJ2YWxMZW5ndGggPSAtZGltSTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICBpbnRlcnZhbExlbmd0aCA9IGRpbUk7XG4gICAgICAgIH1cbiAgICAgICAga25vd25JbnRlcnZhbCA9IHRydWU7XG4gICAgICB9XG4gICAgfVxuICAgIGlmIChrbm93bkludGVydmFsKSB7XG4gICAgICBsZXQgc2l6ZUk7XG4gICAgICAvLyBIb2xkIHplcm8gaWYgdGhlIGludGVydmFsIGlzIGRlZ2VuZXJhdGUsIG90aGVyd2lzZSBhY2NvdW50IGZvclxuICAgICAgLy8gcmVtYWluZGVyXG4gICAgICBpZiAoaW50ZXJ2YWxMZW5ndGggPT09IDAgfHxcbiAgICAgICAgICAoKGludGVydmFsTGVuZ3RoIDwgMCkgIT09IChkZW5zZVNwZWMuc3RyaWRlc1tpXSA8IDApKSkge1xuICAgICAgICBzaXplSSA9IDA7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBzaXplSSA9IE1hdGgudHJ1bmMoaW50ZXJ2YWxMZW5ndGggLyBkZW5zZVNwZWMuc3RyaWRlc1tpXSkgK1xuICAgICAgICAgICAgKGludGVydmFsTGVuZ3RoICUgZGVuc2VTcGVjLnN0cmlkZXNbaV0gIT09IDAgPyAxIDogMCk7XG4gICAgICB9XG4gICAgICBwcm9jZXNzaW5nU2hhcGUucHVzaChzaXplSSk7XG4gICAgfSBlbHNlIHtcbiAgICAgIHByb2Nlc3NpbmdTaGFwZS5wdXNoKC0xKTtcbiAgICB9XG4gIH1cblxuICAvLyBTdGVwIDQ6IENvbXB1dGUgdGhlIGZpbmFsIHNoYXBlXG4gIC8vXG4gIC8vIG5ld0F4aXMgd2lsbCBpbmNyZWFzZSBkaW1lbnNpb24gYnkgMSAod2l0aCBhIG9uZS1zaXplIGRpbWVuc2lvbilcbiAgLy8gc2xpY2VzIGxpa2UgZm9vWzMsIC4uLl0gd2lsbCByZWR1Y2UgZGltZW5zaW9uIGJ5IDEuXG4gIC8vIFRoaXMgY2Fubm90IGJlIGRvbmUgZWFybGllciwgYmVjYXVzZSBpdCBkZXBlbmRzIG9uIFN0ZXAgMy5cbiAgZm9yIChsZXQgZGVuc2VEaW0gPSAwOyBkZW5zZURpbSA8IGRlbnNlU3BlYy5maW5hbFNoYXBlR2F0aGVySW5kaWNlcy5sZW5ndGg7XG4gICAgICAgKytkZW5zZURpbSkge1xuICAgIGNvbnN0IGdhdGhlckluZGV4ID0gZGVuc2VTcGVjLmZpbmFsU2hhcGVHYXRoZXJJbmRpY2VzW2RlbnNlRGltXTtcbiAgICBpZiAoZ2F0aGVySW5kZXggPj0gMCkge1xuICAgICAgZmluYWxTaGFwZS5wdXNoKHByb2Nlc3NpbmdTaGFwZVtnYXRoZXJJbmRleF0pO1xuICAgIH0gZWxzZSBpZiAoZ2F0aGVySW5kZXggPT09IE5FV19BWElTKSB7XG4gICAgICBmaW5hbFNoYXBlLnB1c2goMSk7XG4gICAgfVxuICB9XG5cbiAgY29uc3QgZmluYWxTaGFwZVNwYXJzZSA9IGZpbmFsU2hhcGUuZmlsdGVyKFxuICAgICAgKGRpbSwgaSkgPT4gZGVuc2VTcGVjLmZpbmFsU2hhcGVHYXRoZXJJbmRpY2VzW2ldICE9PSBORVdfQVhJUyk7XG5cbiAgcmV0dXJuIHtcbiAgICBmaW5hbFNoYXBlU3BhcnNlLFxuICAgIGZpbmFsU2hhcGUsXG4gICAgaXNJZGVudGl0eSxcbiAgICBzbGljZURpbTAsXG4gICAgaXNTaW1wbGVTbGljZSxcbiAgICBiZWdpbjogZGVuc2VTcGVjLmJlZ2luLFxuICAgIGVuZDogZGVuc2VTcGVjLmVuZCxcbiAgICBzdHJpZGVzOiBkZW5zZVNwZWMuc3RyaWRlc1xuICB9O1xufVxuXG5mdW5jdGlvbiBidWlsZERlbnNlU3BlYyhcbiAgICBzcGFyc2U6IFN0cmlkZWRTbGljZVNwYXJzZVNwZWMsIGRlbnNlOiBTdHJpZGVkU2xpY2VEZW5zZVNwZWMpIHtcbiAgZGVuc2UuYmVnaW5NYXNrID0gMDtcbiAgZGVuc2UuZW5kTWFzayA9IDA7XG4gIGRlbnNlLnNocmlua0F4aXNNYXNrID0gMDtcblxuICBsZXQgZnVsbEluZGV4ID0gMDtcbiAgZGVuc2UuYmVnaW5WYWxpZCA9IHNwYXJzZS5iZWdpbiAhPSBudWxsO1xuICBkZW5zZS5lbmRWYWxpZCA9IHNwYXJzZS5lbmQgIT0gbnVsbDtcblxuICBkZW5zZS5iZWdpbiA9IG5ldyBBcnJheShkZW5zZS5kaW1zKTtcbiAgZGVuc2UuZW5kID0gbmV3IEFycmF5KGRlbnNlLmRpbXMpO1xuICBkZW5zZS5zdHJpZGVzID0gbmV3IEFycmF5KGRlbnNlLmRpbXMpO1xuICBkZW5zZS5maW5hbFNoYXBlR2F0aGVySW5kaWNlcyA9IFtdO1xuICBkZW5zZS5maW5hbFNoYXBlR2F0aGVySW5kaWNlc1NwYXJzZSA9IFtdO1xuICBkZW5zZS5pbnB1dFNoYXBlR2F0aGVySW5kaWNlc1NwYXJzZSA9IG5ldyBBcnJheShkZW5zZS5kaW1zKTtcblxuICBmb3IgKGxldCBpID0gMDsgaSA8IHNwYXJzZS5kaW1zOyBpKyspIHtcbiAgICBpZiAoKDEgPDwgaSkgJiBzcGFyc2UuZWxsaXBzaXNNYXNrKSB7XG4gICAgICAvLyBPbmx5IHRoZSBiaXQgdGhhdCBoYXMgZWxsaXBzaXMgd2lsbCBmYWxsIGluIHRoaXMgY29uZGl0aW9uLlxuICAgICAgLy8gRXhwYW5kIHRoZSBlbGxpcHNpcyBpbnRvIHRoZSBhcHByb3ByaWF0ZSBpbmRpY2VzXG4gICAgICAvLyBOb3RlOiB0aGlzIG9ubHkgd29ya3MgYmVjYXVzZSB3ZSBndWFyYW50ZWVkIG9uZSBlbGxpcHNpcy5cbiAgICAgIGNvbnN0IG5leHRJbmRleCA9IE1hdGgubWluKFxuICAgICAgICAgIGRlbnNlLmRpbXMgLSAoc3BhcnNlLmRpbXMgLSBpKSArIDEgKyBzcGFyc2UubnVtQWRkQXhpc0FmdGVyRWxsaXBzaXMsXG4gICAgICAgICAgZGVuc2UuZGltcyk7XG4gICAgICBmb3IgKDsgZnVsbEluZGV4IDwgbmV4dEluZGV4OyBmdWxsSW5kZXgrKykge1xuICAgICAgICAvLyBuZXdBeGlzIGFyZW4ndCByZWFsIGF4aXMgc28geW91IGhhdmUgdG8gc2tpcC5cbiAgICAgICAgZGVuc2UuYmVnaW5bZnVsbEluZGV4XSA9IDA7XG4gICAgICAgIGRlbnNlLmVuZFtmdWxsSW5kZXhdID0gMDtcbiAgICAgICAgZGVuc2Uuc3RyaWRlc1tmdWxsSW5kZXhdID0gMTtcbiAgICAgICAgZGVuc2UuYmVnaW5NYXNrIHw9ICgxIDw8IGZ1bGxJbmRleCk7XG4gICAgICAgIGRlbnNlLmVuZE1hc2sgfD0gKDEgPDwgZnVsbEluZGV4KTtcbiAgICAgICAgZGVuc2UuZmluYWxTaGFwZUdhdGhlckluZGljZXMucHVzaChmdWxsSW5kZXgpO1xuICAgICAgICBkZW5zZS5maW5hbFNoYXBlR2F0aGVySW5kaWNlc1NwYXJzZS5wdXNoKC0xKTtcbiAgICAgICAgZGVuc2UuaW5wdXRTaGFwZUdhdGhlckluZGljZXNTcGFyc2VbZnVsbEluZGV4XSA9IGk7XG4gICAgICB9XG4gICAgfSBlbHNlIGlmICgoMSA8PCBpKSAmIHNwYXJzZS5uZXdBeGlzTWFzaykge1xuICAgICAgLy8gT25seSB0aGUgYml0IHRoYXQgaGFzIG5ld0F4aXMgd2lsbCBmYWxsIGluIHRoaXMgY29uZGl0aW9uLlxuICAgICAgZGVuc2UuZmluYWxTaGFwZUdhdGhlckluZGljZXMucHVzaChORVdfQVhJUyk7XG4gICAgICBkZW5zZS5maW5hbFNoYXBlR2F0aGVySW5kaWNlc1NwYXJzZS5wdXNoKC0xKTtcbiAgICB9IGVsc2Uge1xuICAgICAgaWYgKGZ1bGxJbmRleCA9PT0gZGVuc2UuYmVnaW4ubGVuZ3RoKSB7XG4gICAgICAgIHRocm93IEVycm9yKFxuICAgICAgICAgICAgYEluZGV4IG91dCBvZiByYW5nZSB1c2luZyBpbnB1dCBkaW0gJHtmdWxsSW5kZXh9OyBpbnB1dCBgICtcbiAgICAgICAgICAgIGBoYXMgb25seSAke2RlbnNlLmRpbXN9IGRpbXMsICR7ZGVuc2UuYmVnaW4ubGVuZ3RofS5gKTtcbiAgICAgIH1cblxuICAgICAgLy8gR2F0aGVyIHNsaWNpbmcgc3BlYyBpbnRvIGFwcHJvcHJpYXRlIGluZGV4LlxuICAgICAgaWYgKHNwYXJzZS5iZWdpbiAhPSBudWxsKSB7XG4gICAgICAgIGRlbnNlLmJlZ2luW2Z1bGxJbmRleF0gPSBzcGFyc2UuYmVnaW5baV07XG4gICAgICB9XG4gICAgICBpZiAoc3BhcnNlLmVuZCAhPSBudWxsKSB7XG4gICAgICAgIGRlbnNlLmVuZFtmdWxsSW5kZXhdID0gc3BhcnNlLmVuZFtpXTtcbiAgICAgIH1cbiAgICAgIGRlbnNlLnN0cmlkZXNbZnVsbEluZGV4XSA9IHNwYXJzZS5zdHJpZGVzW2ldO1xuICAgICAgaWYgKHNwYXJzZS5iZWdpbk1hc2sgJiAoMSA8PCBpKSkge1xuICAgICAgICBkZW5zZS5iZWdpbk1hc2sgfD0gKDEgPDwgZnVsbEluZGV4KTtcbiAgICAgIH1cbiAgICAgIGlmIChzcGFyc2UuZW5kTWFzayAmICgxIDw8IGkpKSB7XG4gICAgICAgIGRlbnNlLmVuZE1hc2sgfD0gKDEgPDwgZnVsbEluZGV4KTtcbiAgICAgIH1cbiAgICAgIC8vIElmIHNocmluaywgcmVjb3JkIHdoZXJlIHRvIGdldCB0aGUgZGltZW5zaW9uYWxpdHkgZnJvbSAoaS5lLiBuZXdBeGlzKVxuICAgICAgLy8gY3JlYXRlcyBhIGZha2UgMSBzaXplIGRpbWVuc2lvbi4gQWxzbyByZW1lbWJlciBzaHJpbmsgYXhpcyAobm93IGluXG4gICAgICAvLyBkZW5zZSBmb3JtKSBzbyB3ZSBjYW4gaWdub3JlIGRlbnNlLmVuZCBiZWxvdy5cbiAgICAgIGlmIChzcGFyc2Uuc2hyaW5rQXhpc01hc2sgJiAoMSA8PCBpKSkge1xuICAgICAgICBkZW5zZS5maW5hbFNoYXBlR2F0aGVySW5kaWNlcy5wdXNoKFNIUklOS19BWElTKTtcbiAgICAgICAgZGVuc2UuZmluYWxTaGFwZUdhdGhlckluZGljZXNTcGFyc2UucHVzaCgtMSk7XG4gICAgICAgIGRlbnNlLnNocmlua0F4aXNNYXNrIHw9ICgxIDw8IGZ1bGxJbmRleCk7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBkZW5zZS5maW5hbFNoYXBlR2F0aGVySW5kaWNlcy5wdXNoKGZ1bGxJbmRleCk7XG4gICAgICAgIC8vIFJlbWVtYmVyIHRoYXQgd2hlcmUgaW4gdGhlIHNwYXJzZSBzaGFwZSB0aGUgZGVuc2UgZGltIGNvbWVzIGZyb20uXG4gICAgICAgIGRlbnNlLmZpbmFsU2hhcGVHYXRoZXJJbmRpY2VzU3BhcnNlLnB1c2goaSk7XG4gICAgICB9XG4gICAgICBkZW5zZS5pbnB1dFNoYXBlR2F0aGVySW5kaWNlc1NwYXJzZVtmdWxsSW5kZXhdID0gaTtcbiAgICAgIGZ1bGxJbmRleCsrO1xuICAgIH1cbiAgfVxufVxuXG5mdW5jdGlvbiBjYW5vbmljYWwoXG4gICAgeDogbnVtYmVyLCBjOiBudW1iZXIsIHN0cmlkZUk6IG51bWJlciwgZGltSTogbnVtYmVyLCBtYXNrczogbnVtYmVyW10sXG4gICAgdmFsaWRSYW5nZTogbnVtYmVyW10pIHtcbiAgaWYgKG1hc2tzW2NdKSB7XG4gICAgcmV0dXJuIHN0cmlkZUkgPiAwID8gdmFsaWRSYW5nZVtjXSA6IHZhbGlkUmFuZ2VbKGMgKyAxKSAmIDFdO1xuICB9IGVsc2Uge1xuICAgIGNvbnN0IHhGd2QgPSB4IDwgMCA/IGRpbUkgKyB4IDogeDsgIC8vIG1ha2UgbmVnYXRpdmUgaW5kaWNlcyBwb3NpdGl2ZVxuICAgIHJldHVybiB4RndkIDwgdmFsaWRSYW5nZVswXSA/IHZhbGlkUmFuZ2VbMF0gOlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHhGd2QgPiB2YWxpZFJhbmdlWzFdID8gdmFsaWRSYW5nZVsxXSA6IHhGd2Q7XG4gIH1cbn1cbiJdfQ==","/**\n * @license\n * Copyright 2018 Google LLC. All Rights Reserved.\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n * =============================================================================\n */\nimport { ENGINE } from '../engine';\nimport { Softmax } from '../kernel_names';\nimport { convertToTensor } from '../tensor_util_env';\nimport { op } from './operation';\n/**\n * Computes the softmax normalized vector given the logits.\n *\n * ```js\n * const a = tf.tensor1d([1, 2, 3]);\n *\n * a.softmax().print(); // or tf.softmax(a)\n * ```\n *\n * ```js\n * const a = tf.tensor2d([2, 4, 6, 1, 2, 3], [2, 3]);\n *\n * a.softmax().print(); // or tf.softmax(a)\n * ```\n *\n * @param logits The logits array.\n * @param dim The dimension softmax would be performed on. Defaults to `-1`\n * which indicates the last dimension.\n *\n * @doc {heading: 'Operations', subheading: 'Normalization'}\n */\nfunction softmax_(logits, dim = -1) {\n const $logits = convertToTensor(logits, 'logits', 'softmax', 'float32');\n if (dim === -1) {\n dim = $logits.rank - 1;\n }\n if (dim !== $logits.rank - 1) {\n throw Error('Softmax along a non-last dimension is not yet supported. ' +\n `Logits was rank ${$logits.rank} and dim was ${dim}`);\n }\n const inputs = { logits: $logits };\n const attrs = { dim };\n return ENGINE.runKernel(Softmax, inputs, attrs);\n}\nexport const softmax = op({ softmax_ });\n//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic29mdG1heC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uLy4uL3RmanMtY29yZS9zcmMvb3BzL3NvZnRtYXgudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUE7Ozs7Ozs7Ozs7Ozs7OztHQWVHO0FBRUgsT0FBTyxFQUFDLE1BQU0sRUFBQyxNQUFNLFdBQVcsQ0FBQztBQUNqQyxPQUFPLEVBQUMsT0FBTyxFQUE4QixNQUFNLGlCQUFpQixDQUFDO0FBSXJFLE9BQU8sRUFBQyxlQUFlLEVBQUMsTUFBTSxvQkFBb0IsQ0FBQztBQUduRCxPQUFPLEVBQUMsRUFBRSxFQUFDLE1BQU0sYUFBYSxDQUFDO0FBRS9COzs7Ozs7Ozs7Ozs7Ozs7Ozs7OztHQW9CRztBQUNILFNBQVMsUUFBUSxDQUFtQixNQUFvQixFQUFFLEdBQUcsR0FBRyxDQUFDLENBQUM7SUFDaEUsTUFBTSxPQUFPLEdBQUcsZUFBZSxDQUFDLE1BQU0sRUFBRSxRQUFRLEVBQUUsU0FBUyxFQUFFLFNBQVMsQ0FBQyxDQUFDO0lBRXhFLElBQUksR0FBRyxLQUFLLENBQUMsQ0FBQyxFQUFFO1FBQ2QsR0FBRyxHQUFHLE9BQU8sQ0FBQyxJQUFJLEdBQUcsQ0FBQyxDQUFDO0tBQ3hCO0lBQ0QsSUFBSSxHQUFHLEtBQUssT0FBTyxDQUFDLElBQUksR0FBRyxDQUFDLEVBQUU7UUFDNUIsTUFBTSxLQUFLLENBQ1AsMkRBQTJEO1lBQzNELG1CQUFtQixPQUFPLENBQUMsSUFBSSxnQkFBZ0IsR0FBRyxFQUFFLENBQUMsQ0FBQztLQUMzRDtJQUVELE1BQU0sTUFBTSxHQUFrQixFQUFDLE1BQU0sRUFBRSxPQUFPLEVBQUMsQ0FBQztJQUNoRCxNQUFNLEtBQUssR0FBaUIsRUFBQyxHQUFHLEVBQUMsQ0FBQztJQUVsQyxPQUFPLE1BQU0sQ0FBQyxTQUFTLENBQ25CLE9BQU8sRUFBRSxNQUE4QixFQUFFLEtBQTJCLENBQUMsQ0FBQztBQUM1RSxDQUFDO0FBRUQsTUFBTSxDQUFDLE1BQU0sT0FBTyxHQUFHLEVBQUUsQ0FBQyxFQUFDLFFBQVEsRUFBQyxDQUFDLENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyIvKipcbiAqIEBsaWNlbnNlXG4gKiBDb3B5cmlnaHQgMjAxOCBHb29nbGUgTExDLiBBbGwgUmlnaHRzIFJlc2VydmVkLlxuICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlIFwiTGljZW5zZVwiKTtcbiAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS5cbiAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdFxuICpcbiAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMFxuICpcbiAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmVcbiAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuIFwiQVMgSVNcIiBCQVNJUyxcbiAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLlxuICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZFxuICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuXG4gKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuICovXG5cbmltcG9ydCB7RU5HSU5FfSBmcm9tICcuLi9lbmdpbmUnO1xuaW1wb3J0IHtTb2Z0bWF4LCBTb2Z0bWF4QXR0cnMsIFNvZnRtYXhJbnB1dHN9IGZyb20gJy4uL2tlcm5lbF9uYW1lcyc7XG5pbXBvcnQge05hbWVkQXR0ck1hcH0gZnJvbSAnLi4va2VybmVsX3JlZ2lzdHJ5JztcbmltcG9ydCB7VGVuc29yfSBmcm9tICcuLi90ZW5zb3InO1xuaW1wb3J0IHtOYW1lZFRlbnNvck1hcH0gZnJvbSAnLi4vdGVuc29yX3R5cGVzJztcbmltcG9ydCB7Y29udmVydFRvVGVuc29yfSBmcm9tICcuLi90ZW5zb3JfdXRpbF9lbnYnO1xuaW1wb3J0IHtUZW5zb3JMaWtlfSBmcm9tICcuLi90eXBlcyc7XG5cbmltcG9ydCB7b3B9IGZyb20gJy4vb3BlcmF0aW9uJztcblxuLyoqXG4gKiBDb21wdXRlcyB0aGUgc29mdG1heCBub3JtYWxpemVkIHZlY3RvciBnaXZlbiB0aGUgbG9naXRzLlxuICpcbiAqIGBgYGpzXG4gKiBjb25zdCBhID0gdGYudGVuc29yMWQoWzEsIDIsIDNdKTtcbiAqXG4gKiBhLnNvZnRtYXgoKS5wcmludCgpOyAgLy8gb3IgdGYuc29mdG1heChhKVxuICogYGBgXG4gKlxuICogYGBganNcbiAqIGNvbnN0IGEgPSB0Zi50ZW5zb3IyZChbMiwgNCwgNiwgMSwgMiwgM10sIFsyLCAzXSk7XG4gKlxuICogYS5zb2Z0bWF4KCkucHJpbnQoKTsgIC8vIG9yIHRmLnNvZnRtYXgoYSlcbiAqIGBgYFxuICpcbiAqIEBwYXJhbSBsb2dpdHMgVGhlIGxvZ2l0cyBhcnJheS5cbiAqIEBwYXJhbSBkaW0gVGhlIGRpbWVuc2lvbiBzb2Z0bWF4IHdvdWxkIGJlIHBlcmZvcm1lZCBvbi4gRGVmYXVsdHMgdG8gYC0xYFxuICogICAgIHdoaWNoIGluZGljYXRlcyB0aGUgbGFzdCBkaW1lbnNpb24uXG4gKlxuICogQGRvYyB7aGVhZGluZzogJ09wZXJhdGlvbnMnLCBzdWJoZWFkaW5nOiAnTm9ybWFsaXphdGlvbid9XG4gKi9cbmZ1bmN0aW9uIHNvZnRtYXhfPFQgZXh0ZW5kcyBUZW5zb3I+KGxvZ2l0czogVHxUZW5zb3JMaWtlLCBkaW0gPSAtMSk6IFQge1xuICBjb25zdCAkbG9naXRzID0gY29udmVydFRvVGVuc29yKGxvZ2l0cywgJ2xvZ2l0cycsICdzb2Z0bWF4JywgJ2Zsb2F0MzInKTtcblxuICBpZiAoZGltID09PSAtMSkge1xuICAgIGRpbSA9ICRsb2dpdHMucmFuayAtIDE7XG4gIH1cbiAgaWYgKGRpbSAhPT0gJGxvZ2l0cy5yYW5rIC0gMSkge1xuICAgIHRocm93IEVycm9yKFxuICAgICAgICAnU29mdG1heCBhbG9uZyBhIG5vbi1sYXN0IGRpbWVuc2lvbiBpcyBub3QgeWV0IHN1cHBvcnRlZC4gJyArXG4gICAgICAgIGBMb2dpdHMgd2FzIHJhbmsgJHskbG9naXRzLnJhbmt9IGFuZCBkaW0gd2FzICR7ZGltfWApO1xuICB9XG5cbiAgY29uc3QgaW5wdXRzOiBTb2Z0bWF4SW5wdXRzID0ge2xvZ2l0czogJGxvZ2l0c307XG4gIGNvbnN0IGF0dHJzOiBTb2Z0bWF4QXR0cnMgPSB7ZGltfTtcblxuICByZXR1cm4gRU5HSU5FLnJ1bktlcm5lbChcbiAgICAgIFNvZnRtYXgsIGlucHV0cyBhcyB7fSBhcyBOYW1lZFRlbnNvck1hcCwgYXR0cnMgYXMge30gYXMgTmFtZWRBdHRyTWFwKTtcbn1cblxuZXhwb3J0IGNvbnN0IHNvZnRtYXggPSBvcCh7c29mdG1heF99KTtcbiJdfQ==","/**\n * @license\n * Copyright 2018 Google LLC. All Rights Reserved.\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n * =============================================================================\n */\nimport { ENGINE } from '../engine';\nimport { Softplus } from '../kernel_names';\nimport { convertToTensor } from '../tensor_util_env';\nimport { op } from './operation';\n/**\n * Computes softplus of the input `tf.Tensor` element-wise: `log(exp(x) + 1)`\n *\n * ```js\n * const x = tf.tensor1d([0, 1, -1, .7]);\n *\n * x.softplus().print(); // or tf.softplus(x)\n * ```\n * @param x The input tensor.\n *\n * @doc {heading: 'Operations', subheading: 'Basic math'}\n */\nfunction softplus_(x) {\n const $x = convertToTensor(x, 'x', 'softplus');\n const inputs = { x: $x };\n return ENGINE.runKernel(Softplus, inputs);\n}\nexport const softplus = op({ softplus_ });\n//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic29mdHBsdXMuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi8uLi90ZmpzLWNvcmUvc3JjL29wcy9zb2Z0cGx1cy50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQTs7Ozs7Ozs7Ozs7Ozs7O0dBZUc7QUFFSCxPQUFPLEVBQUMsTUFBTSxFQUFDLE1BQU0sV0FBVyxDQUFDO0FBQ2pDLE9BQU8sRUFBQyxRQUFRLEVBQWlCLE1BQU0saUJBQWlCLENBQUM7QUFHekQsT0FBTyxFQUFDLGVBQWUsRUFBQyxNQUFNLG9CQUFvQixDQUFDO0FBR25ELE9BQU8sRUFBQyxFQUFFLEVBQUMsTUFBTSxhQUFhLENBQUM7QUFFL0I7Ozs7Ozs7Ozs7O0dBV0c7QUFDSCxTQUFTLFNBQVMsQ0FBbUIsQ0FBZTtJQUNsRCxNQUFNLEVBQUUsR0FBRyxlQUFlLENBQUMsQ0FBQyxFQUFFLEdBQUcsRUFBRSxVQUFVLENBQUMsQ0FBQztJQUUvQyxNQUFNLE1BQU0sR0FBbUIsRUFBQyxDQUFDLEVBQUUsRUFBRSxFQUFDLENBQUM7SUFDdkMsT0FBTyxNQUFNLENBQUMsU0FBUyxDQUFDLFFBQVEsRUFBRSxNQUE4QixDQUFDLENBQUM7QUFDcEUsQ0FBQztBQUNELE1BQU0sQ0FBQyxNQUFNLFFBQVEsR0FBRyxFQUFFLENBQUMsRUFBQyxTQUFTLEVBQUMsQ0FBQyxDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiLyoqXG4gKiBAbGljZW5zZVxuICogQ29weXJpZ2h0IDIwMTggR29vZ2xlIExMQy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC5cbiAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSBcIkxpY2Vuc2VcIik7XG4gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuXG4gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXRcbiAqXG4gKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjBcbiAqXG4gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlXG4gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiBcIkFTIElTXCIgQkFTSVMsXG4gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC5cbiAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmRcbiAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLlxuICogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbiAqL1xuXG5pbXBvcnQge0VOR0lORX0gZnJvbSAnLi4vZW5naW5lJztcbmltcG9ydCB7U29mdHBsdXMsIFNvZnRwbHVzSW5wdXRzfSBmcm9tICcuLi9rZXJuZWxfbmFtZXMnO1xuaW1wb3J0IHtUZW5zb3J9IGZyb20gJy4uL3RlbnNvcic7XG5pbXBvcnQge05hbWVkVGVuc29yTWFwfSBmcm9tICcuLi90ZW5zb3JfdHlwZXMnO1xuaW1wb3J0IHtjb252ZXJ0VG9UZW5zb3J9IGZyb20gJy4uL3RlbnNvcl91dGlsX2Vudic7XG5pbXBvcnQge1RlbnNvckxpa2V9IGZyb20gJy4uL3R5cGVzJztcblxuaW1wb3J0IHtvcH0gZnJvbSAnLi9vcGVyYXRpb24nO1xuXG4vKipcbiAqIENvbXB1dGVzIHNvZnRwbHVzIG9mIHRoZSBpbnB1dCBgdGYuVGVuc29yYCBlbGVtZW50LXdpc2U6IGBsb2coZXhwKHgpICsgMSlgXG4gKlxuICogYGBganNcbiAqIGNvbnN0IHggPSB0Zi50ZW5zb3IxZChbMCwgMSwgLTEsIC43XSk7XG4gKlxuICogeC5zb2Z0cGx1cygpLnByaW50KCk7ICAvLyBvciB0Zi5zb2Z0cGx1cyh4KVxuICogYGBgXG4gKiBAcGFyYW0geCBUaGUgaW5wdXQgdGVuc29yLlxuICpcbiAqIEBkb2Mge2hlYWRpbmc6ICdPcGVyYXRpb25zJywgc3ViaGVhZGluZzogJ0Jhc2ljIG1hdGgnfVxuICovXG5mdW5jdGlvbiBzb2Z0cGx1c188VCBleHRlbmRzIFRlbnNvcj4oeDogVHxUZW5zb3JMaWtlKTogVCB7XG4gIGNvbnN0ICR4ID0gY29udmVydFRvVGVuc29yKHgsICd4JywgJ3NvZnRwbHVzJyk7XG5cbiAgY29uc3QgaW5wdXRzOiBTb2Z0cGx1c0lucHV0cyA9IHt4OiAkeH07XG4gIHJldHVybiBFTkdJTkUucnVuS2VybmVsKFNvZnRwbHVzLCBpbnB1dHMgYXMge30gYXMgTmFtZWRUZW5zb3JNYXApO1xufVxuZXhwb3J0IGNvbnN0IHNvZnRwbHVzID0gb3Aoe3NvZnRwbHVzX30pO1xuIl19","/**\n * @license\n * Copyright 2020 Google LLC. All Rights Reserved.\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n * =============================================================================\n */\nimport { ENGINE } from '../engine';\nimport { SpaceToBatchND } from '../kernel_names';\nimport { convertToTensor } from '../tensor_util_env';\nimport * as util from '../util';\nimport { op } from './operation';\n/**\n * This operation divides \"spatial\" dimensions `[1, ..., M]` of the input into\n * a grid of blocks of shape `blockShape`, and interleaves these blocks with\n * the \"batch\" dimension (0) such that in the output, the spatial\n * dimensions `[1, ..., M]` correspond to the position within the grid,\n * and the batch dimension combines both the position within a spatial block\n * and the original batch position. Prior to division into blocks,\n * the spatial dimensions of the input are optionally zero padded\n * according to `paddings`. See below for a precise description.\n *\n * ```js\n * const x = tf.tensor4d([1, 2, 3, 4], [1, 2, 2, 1]);\n * const blockShape = [2, 2];\n * const paddings = [[0, 0], [0, 0]];\n *\n * x.spaceToBatchND(blockShape, paddings).print();\n * ```\n *\n * @param x A `tf.Tensor`. N-D with `x.shape` = `[batch] + spatialShape +\n * remainingShape`, where spatialShape has `M` dimensions.\n * @param blockShape A 1-D array. Must have shape `[M]`, all values must\n * be >= 1.\n * @param paddings A 2-D array. Must have shape `[M, 2]`, all values must be >=\n * 0. `paddings[i] = [padStart, padEnd]` specifies the amount to zero-pad\n * from input dimension `i + 1`, which corresponds to spatial dimension `i`. It\n * is required that\n * `(inputShape[i + 1] + padStart + padEnd) % blockShape[i] === 0`\n *\n * This operation is equivalent to the following steps:\n *\n * 1. Zero-pad the start and end of dimensions `[1, ..., M]` of the input\n * according to `paddings` to produce `padded` of shape paddedShape.\n *\n * 2. Reshape `padded` to `reshapedPadded` of shape:\n * `[batch] + [paddedShape[1] / blockShape[0], blockShape[0], ...,\n * paddedShape[M] / blockShape[M-1], blockShape[M-1]] + remainingShape`\n *\n * 3. Permute dimensions of `reshapedPadded` to produce `permutedReshapedPadded`\n * of shape: `blockShape + [batch] + [paddedShape[1] / blockShape[0], ...,\n * paddedShape[M] / blockShape[M-1]] + remainingShape`\n *\n * 4. Reshape `permutedReshapedPadded` to flatten `blockShape` into the\n * batch dimension, producing an output tensor of shape:\n * `[batch * prod(blockShape)] + [paddedShape[1] / blockShape[0], ...,\n * paddedShape[M] / blockShape[M-1]] + remainingShape`\n *\n * @doc {heading: 'Tensors', subheading: 'Transformations'}\n */\nfunction spaceToBatchND_(x, blockShape, paddings) {\n const $x = convertToTensor(x, 'x', 'spaceToBatchND');\n util.assert($x.rank >= 1 + blockShape.length, () => `input rank ${$x.rank} should be > than [blockShape] ${blockShape.length}`);\n util.assert(paddings.length === blockShape.length, () => `paddings.shape[0] ${paddings.length} must be equal to [blockShape] ${blockShape.length}`);\n util.assert($x.shape.reduce((a, b, i) => {\n if (i > 0 && i <= blockShape.length) {\n return a &&\n ((b + paddings[i - 1][0] + paddings[i - 1][1]) %\n blockShape[i - 1] ===\n 0);\n }\n return a;\n }, true), () => `input spatial dimensions ${$x.shape.slice(1)} with paddings ${paddings.toString()} must be divisible by blockShapes ${blockShape.toString()}`);\n const inputs = { x: $x };\n const attrs = { blockShape, paddings };\n return ENGINE.runKernel(SpaceToBatchND, inputs, attrs);\n}\nexport const spaceToBatchND = op({ spaceToBatchND_ });\n//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic3BhY2VfdG9fYmF0Y2hfbmQuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi8uLi90ZmpzLWNvcmUvc3JjL29wcy9zcGFjZV90b19iYXRjaF9uZC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQTs7Ozs7Ozs7Ozs7Ozs7O0dBZUc7QUFFSCxPQUFPLEVBQUMsTUFBTSxFQUFDLE1BQU0sV0FBVyxDQUFDO0FBQ2pDLE9BQU8sRUFBQyxjQUFjLEVBQTRDLE1BQU0saUJBQWlCLENBQUM7QUFJMUYsT0FBTyxFQUFDLGVBQWUsRUFBQyxNQUFNLG9CQUFvQixDQUFDO0FBRW5ELE9BQU8sS0FBSyxJQUFJLE1BQU0sU0FBUyxDQUFDO0FBRWhDLE9BQU8sRUFBQyxFQUFFLEVBQUMsTUFBTSxhQUFhLENBQUM7QUFFL0I7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7O0dBK0NHO0FBQ0gsU0FBUyxlQUFlLENBQ3BCLENBQWUsRUFBRSxVQUFvQixFQUFFLFFBQW9CO0lBQzdELE1BQU0sRUFBRSxHQUFHLGVBQWUsQ0FBQyxDQUFDLEVBQUUsR0FBRyxFQUFFLGdCQUFnQixDQUFDLENBQUM7SUFFckQsSUFBSSxDQUFDLE1BQU0sQ0FDUCxFQUFFLENBQUMsSUFBSSxJQUFJLENBQUMsR0FBRyxVQUFVLENBQUMsTUFBTSxFQUNoQyxHQUFHLEVBQUUsQ0FBQyxjQUFjLEVBQUUsQ0FBQyxJQUFJLGtDQUN2QixVQUFVLENBQUMsTUFBTSxFQUFFLENBQUMsQ0FBQztJQUU3QixJQUFJLENBQUMsTUFBTSxDQUNQLFFBQVEsQ0FBQyxNQUFNLEtBQUssVUFBVSxDQUFDLE1BQU0sRUFDckMsR0FBRyxFQUFFLENBQUMscUJBQ0YsUUFBUSxDQUFDLE1BQU0sa0NBQWtDLFVBQVUsQ0FBQyxNQUFNLEVBQUUsQ0FBQyxDQUFDO0lBRTlFLElBQUksQ0FBQyxNQUFNLENBQ1AsRUFBRSxDQUFDLEtBQUssQ0FBQyxNQUFNLENBQ1gsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxFQUFFO1FBQ1YsSUFBSSxDQUFDLEdBQUcsQ0FBQyxJQUFJLENBQUMsSUFBSSxVQUFVLENBQUMsTUFBTSxFQUFFO1lBQ25DLE9BQU8sQ0FBQztnQkFDSixDQUFDLENBQUMsQ0FBQyxHQUFHLFFBQVEsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLEdBQUcsUUFBUSxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQztvQkFDekMsVUFBVSxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUM7b0JBQ3JCLENBQUMsQ0FBQyxDQUFDO1NBQ1Q7UUFDRCxPQUFPLENBQUMsQ0FBQztJQUNYLENBQUMsRUFDRCxJQUFJLENBQUMsRUFDVCxHQUFHLEVBQUUsQ0FBQyw0QkFBNEIsRUFBRSxDQUFDLEtBQUssQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDLGtCQUMvQyxRQUFRLENBQUMsUUFBUSxFQUFFLHFDQUNuQixVQUFVLENBQUMsUUFBUSxFQUFFLEVBQUUsQ0FBQyxDQUFDO0lBRWpDLE1BQU0sTUFBTSxHQUF5QixFQUFDLENBQUMsRUFBRSxFQUFFLEVBQUMsQ0FBQztJQUM3QyxNQUFNLEtBQUssR0FBd0IsRUFBQyxVQUFVLEVBQUUsUUFBUSxFQUFDLENBQUM7SUFFMUQsT0FBTyxNQUFNLENBQUMsU0FBUyxDQUNuQixjQUFjLEVBQUUsTUFBOEIsRUFDOUMsS0FBMkIsQ0FBQyxDQUFDO0FBQ25DLENBQUM7QUFFRCxNQUFNLENBQUMsTUFBTSxjQUFjLEdBQUcsRUFBRSxDQUFDLEVBQUMsZUFBZSxFQUFDLENBQUMsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbIi8qKlxuICogQGxpY2Vuc2VcbiAqIENvcHlyaWdodCAyMDIwIEdvb2dsZSBMTEMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuXG4gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgXCJMaWNlbnNlXCIpO1xuICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLlxuICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0XG4gKlxuICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wXG4gKlxuICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZVxuICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gXCJBUyBJU1wiIEJBU0lTLFxuICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuXG4gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kXG4gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS5cbiAqID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4gKi9cblxuaW1wb3J0IHtFTkdJTkV9IGZyb20gJy4uL2VuZ2luZSc7XG5pbXBvcnQge1NwYWNlVG9CYXRjaE5ELCBTcGFjZVRvQmF0Y2hOREF0dHJzLCBTcGFjZVRvQmF0Y2hORElucHV0c30gZnJvbSAnLi4va2VybmVsX25hbWVzJztcbmltcG9ydCB7TmFtZWRBdHRyTWFwfSBmcm9tICcuLi9rZXJuZWxfcmVnaXN0cnknO1xuaW1wb3J0IHtUZW5zb3J9IGZyb20gJy4uL3RlbnNvcic7XG5pbXBvcnQge05hbWVkVGVuc29yTWFwfSBmcm9tICcuLi90ZW5zb3JfdHlwZXMnO1xuaW1wb3J0IHtjb252ZXJ0VG9UZW5zb3J9IGZyb20gJy4uL3RlbnNvcl91dGlsX2Vudic7XG5pbXBvcnQge1RlbnNvckxpa2V9IGZyb20gJy4uL3R5cGVzJztcbmltcG9ydCAqIGFzIHV0aWwgZnJvbSAnLi4vdXRpbCc7XG5cbmltcG9ydCB7b3B9IGZyb20gJy4vb3BlcmF0aW9uJztcblxuLyoqXG4gKiBUaGlzIG9wZXJhdGlvbiBkaXZpZGVzIFwic3BhdGlhbFwiIGRpbWVuc2lvbnMgYFsxLCAuLi4sIE1dYCBvZiB0aGUgaW5wdXQgaW50b1xuICogYSBncmlkIG9mIGJsb2NrcyBvZiBzaGFwZSBgYmxvY2tTaGFwZWAsIGFuZCBpbnRlcmxlYXZlcyB0aGVzZSBibG9ja3Mgd2l0aFxuICogdGhlIFwiYmF0Y2hcIiBkaW1lbnNpb24gKDApIHN1Y2ggdGhhdCBpbiB0aGUgb3V0cHV0LCB0aGUgc3BhdGlhbFxuICogZGltZW5zaW9ucyBgWzEsIC4uLiwgTV1gIGNvcnJlc3BvbmQgdG8gdGhlIHBvc2l0aW9uIHdpdGhpbiB0aGUgZ3JpZCxcbiAqIGFuZCB0aGUgYmF0Y2ggZGltZW5zaW9uIGNvbWJpbmVzIGJvdGggdGhlIHBvc2l0aW9uIHdpdGhpbiBhIHNwYXRpYWwgYmxvY2tcbiAqIGFuZCB0aGUgb3JpZ2luYWwgYmF0Y2ggcG9zaXRpb24uIFByaW9yIHRvIGRpdmlzaW9uIGludG8gYmxvY2tzLFxuICogdGhlIHNwYXRpYWwgZGltZW5zaW9ucyBvZiB0aGUgaW5wdXQgYXJlIG9wdGlvbmFsbHkgemVybyBwYWRkZWRcbiAqIGFjY29yZGluZyB0byBgcGFkZGluZ3NgLiBTZWUgYmVsb3cgZm9yIGEgcHJlY2lzZSBkZXNjcmlwdGlvbi5cbiAqXG4gKiBgYGBqc1xuICogY29uc3QgeCA9IHRmLnRlbnNvcjRkKFsxLCAyLCAzLCA0XSwgWzEsIDIsIDIsIDFdKTtcbiAqIGNvbnN0IGJsb2NrU2hhcGUgPSBbMiwgMl07XG4gKiBjb25zdCBwYWRkaW5ncyA9IFtbMCwgMF0sIFswLCAwXV07XG4gKlxuICogeC5zcGFjZVRvQmF0Y2hORChibG9ja1NoYXBlLCBwYWRkaW5ncykucHJpbnQoKTtcbiAqIGBgYFxuICpcbiAqIEBwYXJhbSB4IEEgYHRmLlRlbnNvcmAuIE4tRCB3aXRoIGB4LnNoYXBlYCA9IGBbYmF0Y2hdICsgc3BhdGlhbFNoYXBlICtcbiAqIHJlbWFpbmluZ1NoYXBlYCwgd2hlcmUgc3BhdGlhbFNoYXBlIGhhcyBgTWAgZGltZW5zaW9ucy5cbiAqIEBwYXJhbSBibG9ja1NoYXBlIEEgMS1EIGFycmF5LiBNdXN0IGhhdmUgc2hhcGUgYFtNXWAsIGFsbCB2YWx1ZXMgbXVzdFxuICogYmUgPj0gMS5cbiAqIEBwYXJhbSBwYWRkaW5ncyBBIDItRCBhcnJheS4gTXVzdCBoYXZlIHNoYXBlIGBbTSwgMl1gLCBhbGwgdmFsdWVzIG11c3QgYmUgPj1cbiAqICAgICAwLiBgcGFkZGluZ3NbaV0gPSBbcGFkU3RhcnQsIHBhZEVuZF1gIHNwZWNpZmllcyB0aGUgYW1vdW50IHRvIHplcm8tcGFkXG4gKiBmcm9tIGlucHV0IGRpbWVuc2lvbiBgaSArIDFgLCB3aGljaCBjb3JyZXNwb25kcyB0byBzcGF0aWFsIGRpbWVuc2lvbiBgaWAuIEl0XG4gKiBpcyByZXF1aXJlZCB0aGF0XG4gKiBgKGlucHV0U2hhcGVbaSArIDFdICsgcGFkU3RhcnQgKyBwYWRFbmQpICUgYmxvY2tTaGFwZVtpXSA9PT0gMGBcbiAqXG4gKiBUaGlzIG9wZXJhdGlvbiBpcyBlcXVpdmFsZW50IHRvIHRoZSBmb2xsb3dpbmcgc3RlcHM6XG4gKlxuICogMS4gWmVyby1wYWQgdGhlIHN0YXJ0IGFuZCBlbmQgb2YgZGltZW5zaW9ucyBgWzEsIC4uLiwgTV1gIG9mIHRoZSBpbnB1dFxuICogYWNjb3JkaW5nIHRvIGBwYWRkaW5nc2AgdG8gcHJvZHVjZSBgcGFkZGVkYCBvZiBzaGFwZSBwYWRkZWRTaGFwZS5cbiAqXG4gKiAyLiBSZXNoYXBlIGBwYWRkZWRgIHRvIGByZXNoYXBlZFBhZGRlZGAgb2Ygc2hhcGU6XG4gKiBgW2JhdGNoXSArIFtwYWRkZWRTaGFwZVsxXSAvIGJsb2NrU2hhcGVbMF0sIGJsb2NrU2hhcGVbMF0sIC4uLixcbiAqIHBhZGRlZFNoYXBlW01dIC8gYmxvY2tTaGFwZVtNLTFdLCBibG9ja1NoYXBlW00tMV1dICsgcmVtYWluaW5nU2hhcGVgXG4gKlxuICogMy4gUGVybXV0ZSBkaW1lbnNpb25zIG9mIGByZXNoYXBlZFBhZGRlZGAgdG8gcHJvZHVjZSBgcGVybXV0ZWRSZXNoYXBlZFBhZGRlZGBcbiAqIG9mIHNoYXBlOiBgYmxvY2tTaGFwZSArIFtiYXRjaF0gKyBbcGFkZGVkU2hhcGVbMV0gLyBibG9ja1NoYXBlWzBdLCAuLi4sXG4gKiBwYWRkZWRTaGFwZVtNXSAvIGJsb2NrU2hhcGVbTS0xXV0gKyByZW1haW5pbmdTaGFwZWBcbiAqXG4gKiA0LiBSZXNoYXBlIGBwZXJtdXRlZFJlc2hhcGVkUGFkZGVkYCB0byBmbGF0dGVuIGBibG9ja1NoYXBlYCBpbnRvIHRoZVxuICogYmF0Y2ggZGltZW5zaW9uLCBwcm9kdWNpbmcgYW4gb3V0cHV0IHRlbnNvciBvZiBzaGFwZTpcbiAqIGBbYmF0Y2ggKiBwcm9kKGJsb2NrU2hhcGUpXSArIFtwYWRkZWRTaGFwZVsxXSAvIGJsb2NrU2hhcGVbMF0sIC4uLixcbiAqIHBhZGRlZFNoYXBlW01dIC8gYmxvY2tTaGFwZVtNLTFdXSArIHJlbWFpbmluZ1NoYXBlYFxuICpcbiAqIEBkb2Mge2hlYWRpbmc6ICdUZW5zb3JzJywgc3ViaGVhZGluZzogJ1RyYW5zZm9ybWF0aW9ucyd9XG4gKi9cbmZ1bmN0aW9uIHNwYWNlVG9CYXRjaE5EXzxUIGV4dGVuZHMgVGVuc29yPihcbiAgICB4OiBUfFRlbnNvckxpa2UsIGJsb2NrU2hhcGU6IG51bWJlcltdLCBwYWRkaW5nczogbnVtYmVyW11bXSk6IFQge1xuICBjb25zdCAkeCA9IGNvbnZlcnRUb1RlbnNvcih4LCAneCcsICdzcGFjZVRvQmF0Y2hORCcpO1xuXG4gIHV0aWwuYXNzZXJ0KFxuICAgICAgJHgucmFuayA+PSAxICsgYmxvY2tTaGFwZS5sZW5ndGgsXG4gICAgICAoKSA9PiBgaW5wdXQgcmFuayAkeyR4LnJhbmt9IHNob3VsZCBiZSA+IHRoYW4gW2Jsb2NrU2hhcGVdICR7XG4gICAgICAgICAgYmxvY2tTaGFwZS5sZW5ndGh9YCk7XG5cbiAgdXRpbC5hc3NlcnQoXG4gICAgICBwYWRkaW5ncy5sZW5ndGggPT09IGJsb2NrU2hhcGUubGVuZ3RoLFxuICAgICAgKCkgPT4gYHBhZGRpbmdzLnNoYXBlWzBdICR7XG4gICAgICAgICAgcGFkZGluZ3MubGVuZ3RofSBtdXN0IGJlIGVxdWFsIHRvIFtibG9ja1NoYXBlXSAke2Jsb2NrU2hhcGUubGVuZ3RofWApO1xuXG4gIHV0aWwuYXNzZXJ0KFxuICAgICAgJHguc2hhcGUucmVkdWNlKFxuICAgICAgICAgIChhLCBiLCBpKSA9PiB7XG4gICAgICAgICAgICBpZiAoaSA+IDAgJiYgaSA8PSBibG9ja1NoYXBlLmxlbmd0aCkge1xuICAgICAgICAgICAgICByZXR1cm4gYSAmJlxuICAgICAgICAgICAgICAgICAgKChiICsgcGFkZGluZ3NbaSAtIDFdWzBdICsgcGFkZGluZ3NbaSAtIDFdWzFdKSAlXG4gICAgICAgICAgICAgICAgICAgICAgIGJsb2NrU2hhcGVbaSAtIDFdID09PVxuICAgICAgICAgICAgICAgICAgIDApO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgcmV0dXJuIGE7XG4gICAgICAgICAgfSxcbiAgICAgICAgICB0cnVlKSxcbiAgICAgICgpID0+IGBpbnB1dCBzcGF0aWFsIGRpbWVuc2lvbnMgJHskeC5zaGFwZS5zbGljZSgxKX0gd2l0aCBwYWRkaW5ncyAke1xuICAgICAgICAgIHBhZGRpbmdzLnRvU3RyaW5nKCl9IG11c3QgYmUgZGl2aXNpYmxlIGJ5IGJsb2NrU2hhcGVzICR7XG4gICAgICAgICAgYmxvY2tTaGFwZS50b1N0cmluZygpfWApO1xuXG4gIGNvbnN0IGlucHV0czogU3BhY2VUb0JhdGNoTkRJbnB1dHMgPSB7eDogJHh9O1xuICBjb25zdCBhdHRyczogU3BhY2VUb0JhdGNoTkRBdHRycyA9IHtibG9ja1NoYXBlLCBwYWRkaW5nc307XG5cbiAgcmV0dXJuIEVOR0lORS5ydW5LZXJuZWwoXG4gICAgICBTcGFjZVRvQmF0Y2hORCwgaW5wdXRzIGFzIHt9IGFzIE5hbWVkVGVuc29yTWFwLFxuICAgICAgYXR0cnMgYXMge30gYXMgTmFtZWRBdHRyTWFwKTtcbn1cblxuZXhwb3J0IGNvbnN0IHNwYWNlVG9CYXRjaE5EID0gb3Aoe3NwYWNlVG9CYXRjaE5EX30pO1xuIl19","/**\n * @license\n * Copyright 2020 Google LLC. All Rights Reserved.\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n * =============================================================================\n */\nimport { ENGINE } from '../../engine';\nimport { FFT } from '../../kernel_names';\nimport { assert } from '../../util';\nimport { op } from '../operation';\n/**\n * Fast Fourier transform.\n *\n * Computes the 1-dimensional discrete Fourier transform over the inner-most\n * dimension of input.\n *\n * ```js\n * const real = tf.tensor1d([1, 2, 3]);\n * const imag = tf.tensor1d([1, 2, 3]);\n * const x = tf.complex(real, imag);\n *\n * x.fft().print(); // tf.spectral.fft(x).print();\n * ```\n * @param input The complex input to compute an fft over.\n *\n * @doc {heading: 'Operations', subheading: 'Spectral', namespace: 'spectral'}\n */\nfunction fft_(input) {\n assert(input.dtype === 'complex64', () => `The dtype for tf.spectral.fft() must be complex64 ` +\n `but got ${input.dtype}.`);\n const inputs = { input };\n return ENGINE.runKernel(FFT, inputs);\n}\nexport const fft = op({ fft_ });\n//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZmZ0LmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vLi4vLi4vdGZqcy1jb3JlL3NyYy9vcHMvc3BlY3RyYWwvZmZ0LnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBOzs7Ozs7Ozs7Ozs7Ozs7R0FlRztBQUVILE9BQU8sRUFBQyxNQUFNLEVBQUMsTUFBTSxjQUFjLENBQUM7QUFDcEMsT0FBTyxFQUFDLEdBQUcsRUFBWSxNQUFNLG9CQUFvQixDQUFDO0FBR2xELE9BQU8sRUFBQyxNQUFNLEVBQUMsTUFBTSxZQUFZLENBQUM7QUFDbEMsT0FBTyxFQUFDLEVBQUUsRUFBQyxNQUFNLGNBQWMsQ0FBQztBQUVoQzs7Ozs7Ozs7Ozs7Ozs7OztHQWdCRztBQUNILFNBQVMsSUFBSSxDQUFDLEtBQWE7SUFDekIsTUFBTSxDQUNGLEtBQUssQ0FBQyxLQUFLLEtBQUssV0FBVyxFQUMzQixHQUFHLEVBQUUsQ0FBQyxvREFBb0Q7UUFDdEQsV0FBVyxLQUFLLENBQUMsS0FBSyxHQUFHLENBQUMsQ0FBQztJQUVuQyxNQUFNLE1BQU0sR0FBYyxFQUFDLEtBQUssRUFBQyxDQUFDO0lBRWxDLE9BQU8sTUFBTSxDQUFDLFNBQVMsQ0FBQyxHQUFHLEVBQUUsTUFBOEIsQ0FBQyxDQUFDO0FBQy9ELENBQUM7QUFFRCxNQUFNLENBQUMsTUFBTSxHQUFHLEdBQUcsRUFBRSxDQUFDLEVBQUMsSUFBSSxFQUFDLENBQUMsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbIi8qKlxuICogQGxpY2Vuc2VcbiAqIENvcHlyaWdodCAyMDIwIEdvb2dsZSBMTEMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuXG4gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgXCJMaWNlbnNlXCIpO1xuICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLlxuICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0XG4gKlxuICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wXG4gKlxuICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZVxuICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gXCJBUyBJU1wiIEJBU0lTLFxuICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuXG4gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kXG4gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS5cbiAqID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4gKi9cblxuaW1wb3J0IHtFTkdJTkV9IGZyb20gJy4uLy4uL2VuZ2luZSc7XG5pbXBvcnQge0ZGVCwgRkZUSW5wdXRzfSBmcm9tICcuLi8uLi9rZXJuZWxfbmFtZXMnO1xuaW1wb3J0IHtUZW5zb3J9IGZyb20gJy4uLy4uL3RlbnNvcic7XG5pbXBvcnQge05hbWVkVGVuc29yTWFwfSBmcm9tICcuLi8uLi90ZW5zb3JfdHlwZXMnO1xuaW1wb3J0IHthc3NlcnR9IGZyb20gJy4uLy4uL3V0aWwnO1xuaW1wb3J0IHtvcH0gZnJvbSAnLi4vb3BlcmF0aW9uJztcblxuLyoqXG4gKiBGYXN0IEZvdXJpZXIgdHJhbnNmb3JtLlxuICpcbiAqIENvbXB1dGVzIHRoZSAxLWRpbWVuc2lvbmFsIGRpc2NyZXRlIEZvdXJpZXIgdHJhbnNmb3JtIG92ZXIgdGhlIGlubmVyLW1vc3RcbiAqIGRpbWVuc2lvbiBvZiBpbnB1dC5cbiAqXG4gKiBgYGBqc1xuICogY29uc3QgcmVhbCA9IHRmLnRlbnNvcjFkKFsxLCAyLCAzXSk7XG4gKiBjb25zdCBpbWFnID0gdGYudGVuc29yMWQoWzEsIDIsIDNdKTtcbiAqIGNvbnN0IHggPSB0Zi5jb21wbGV4KHJlYWwsIGltYWcpO1xuICpcbiAqIHguZmZ0KCkucHJpbnQoKTsgIC8vIHRmLnNwZWN0cmFsLmZmdCh4KS5wcmludCgpO1xuICogYGBgXG4gKiBAcGFyYW0gaW5wdXQgVGhlIGNvbXBsZXggaW5wdXQgdG8gY29tcHV0ZSBhbiBmZnQgb3Zlci5cbiAqXG4gKiBAZG9jIHtoZWFkaW5nOiAnT3BlcmF0aW9ucycsIHN1YmhlYWRpbmc6ICdTcGVjdHJhbCcsIG5hbWVzcGFjZTogJ3NwZWN0cmFsJ31cbiAqL1xuZnVuY3Rpb24gZmZ0XyhpbnB1dDogVGVuc29yKTogVGVuc29yIHtcbiAgYXNzZXJ0KFxuICAgICAgaW5wdXQuZHR5cGUgPT09ICdjb21wbGV4NjQnLFxuICAgICAgKCkgPT4gYFRoZSBkdHlwZSBmb3IgdGYuc3BlY3RyYWwuZmZ0KCkgbXVzdCBiZSBjb21wbGV4NjQgYCArXG4gICAgICAgICAgYGJ1dCBnb3QgJHtpbnB1dC5kdHlwZX0uYCk7XG5cbiAgY29uc3QgaW5wdXRzOiBGRlRJbnB1dHMgPSB7aW5wdXR9O1xuXG4gIHJldHVybiBFTkdJTkUucnVuS2VybmVsKEZGVCwgaW5wdXRzIGFzIHt9IGFzIE5hbWVkVGVuc29yTWFwKTtcbn1cblxuZXhwb3J0IGNvbnN0IGZmdCA9IG9wKHtmZnRffSk7XG4iXX0=","/**\n * @license\n * Copyright 2020 Google LLC. All Rights Reserved.\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n * =============================================================================\n */\nimport { ENGINE } from '../../engine';\nimport { IFFT } from '../../kernel_names';\nimport { assert } from '../../util';\nimport { op } from '../operation';\n/**\n * Inverse fast Fourier transform.\n *\n * Computes the inverse 1-dimensional discrete Fourier transform over the\n * inner-most dimension of input.\n *\n * ```js\n * const real = tf.tensor1d([1, 2, 3]);\n * const imag = tf.tensor1d([1, 2, 3]);\n * const x = tf.complex(real, imag);\n *\n * x.ifft().print(); // tf.spectral.ifft(x).print();\n * ```\n * @param input The complex input to compute an ifft over.\n *\n * @doc {heading: 'Operations', subheading: 'Spectral', namespace: 'spectral'}\n */\nfunction ifft_(input) {\n assert(input.dtype === 'complex64', () => `The dtype for tf.spectral.ifft() must be complex64 ` +\n `but got ${input.dtype}.`);\n const inputs = { input };\n return ENGINE.runKernel(IFFT, inputs);\n}\nexport const ifft = op({ ifft_ });\n//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaWZmdC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uLy4uLy4uL3RmanMtY29yZS9zcmMvb3BzL3NwZWN0cmFsL2lmZnQudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUE7Ozs7Ozs7Ozs7Ozs7OztHQWVHO0FBRUgsT0FBTyxFQUFDLE1BQU0sRUFBQyxNQUFNLGNBQWMsQ0FBQztBQUNwQyxPQUFPLEVBQUMsSUFBSSxFQUFhLE1BQU0sb0JBQW9CLENBQUM7QUFHcEQsT0FBTyxFQUFDLE1BQU0sRUFBQyxNQUFNLFlBQVksQ0FBQztBQUNsQyxPQUFPLEVBQUMsRUFBRSxFQUFDLE1BQU0sY0FBYyxDQUFDO0FBRWhDOzs7Ozs7Ozs7Ozs7Ozs7O0dBZ0JHO0FBQ0gsU0FBUyxLQUFLLENBQUMsS0FBYTtJQUMxQixNQUFNLENBQ0YsS0FBSyxDQUFDLEtBQUssS0FBSyxXQUFXLEVBQzNCLEdBQUcsRUFBRSxDQUFDLHFEQUFxRDtRQUN2RCxXQUFXLEtBQUssQ0FBQyxLQUFLLEdBQUcsQ0FBQyxDQUFDO0lBRW5DLE1BQU0sTUFBTSxHQUFlLEVBQUMsS0FBSyxFQUFDLENBQUM7SUFFbkMsT0FBTyxNQUFNLENBQUMsU0FBUyxDQUFDLElBQUksRUFBRSxNQUE4QixDQUFDLENBQUM7QUFDaEUsQ0FBQztBQUVELE1BQU0sQ0FBQyxNQUFNLElBQUksR0FBRyxFQUFFLENBQUMsRUFBQyxLQUFLLEVBQUMsQ0FBQyxDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiLyoqXG4gKiBAbGljZW5zZVxuICogQ29weXJpZ2h0IDIwMjAgR29vZ2xlIExMQy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC5cbiAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSBcIkxpY2Vuc2VcIik7XG4gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuXG4gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXRcbiAqXG4gKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjBcbiAqXG4gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlXG4gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiBcIkFTIElTXCIgQkFTSVMsXG4gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC5cbiAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmRcbiAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLlxuICogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbiAqL1xuXG5pbXBvcnQge0VOR0lORX0gZnJvbSAnLi4vLi4vZW5naW5lJztcbmltcG9ydCB7SUZGVCwgSUZGVElucHV0c30gZnJvbSAnLi4vLi4va2VybmVsX25hbWVzJztcbmltcG9ydCB7VGVuc29yfSBmcm9tICcuLi8uLi90ZW5zb3InO1xuaW1wb3J0IHtOYW1lZFRlbnNvck1hcH0gZnJvbSAnLi4vLi4vdGVuc29yX3R5cGVzJztcbmltcG9ydCB7YXNzZXJ0fSBmcm9tICcuLi8uLi91dGlsJztcbmltcG9ydCB7b3B9IGZyb20gJy4uL29wZXJhdGlvbic7XG5cbi8qKlxuICogSW52ZXJzZSBmYXN0IEZvdXJpZXIgdHJhbnNmb3JtLlxuICpcbiAqIENvbXB1dGVzIHRoZSBpbnZlcnNlIDEtZGltZW5zaW9uYWwgZGlzY3JldGUgRm91cmllciB0cmFuc2Zvcm0gb3ZlciB0aGVcbiAqIGlubmVyLW1vc3QgZGltZW5zaW9uIG9mIGlucHV0LlxuICpcbiAqIGBgYGpzXG4gKiBjb25zdCByZWFsID0gdGYudGVuc29yMWQoWzEsIDIsIDNdKTtcbiAqIGNvbnN0IGltYWcgPSB0Zi50ZW5zb3IxZChbMSwgMiwgM10pO1xuICogY29uc3QgeCA9IHRmLmNvbXBsZXgocmVhbCwgaW1hZyk7XG4gKlxuICogeC5pZmZ0KCkucHJpbnQoKTsgIC8vIHRmLnNwZWN0cmFsLmlmZnQoeCkucHJpbnQoKTtcbiAqIGBgYFxuICogQHBhcmFtIGlucHV0IFRoZSBjb21wbGV4IGlucHV0IHRvIGNvbXB1dGUgYW4gaWZmdCBvdmVyLlxuICpcbiAqIEBkb2Mge2hlYWRpbmc6ICdPcGVyYXRpb25zJywgc3ViaGVhZGluZzogJ1NwZWN0cmFsJywgbmFtZXNwYWNlOiAnc3BlY3RyYWwnfVxuICovXG5mdW5jdGlvbiBpZmZ0XyhpbnB1dDogVGVuc29yKTogVGVuc29yIHtcbiAgYXNzZXJ0KFxuICAgICAgaW5wdXQuZHR5cGUgPT09ICdjb21wbGV4NjQnLFxuICAgICAgKCkgPT4gYFRoZSBkdHlwZSBmb3IgdGYuc3BlY3RyYWwuaWZmdCgpIG11c3QgYmUgY29tcGxleDY0IGAgK1xuICAgICAgICAgIGBidXQgZ290ICR7aW5wdXQuZHR5cGV9LmApO1xuXG4gIGNvbnN0IGlucHV0czogSUZGVElucHV0cyA9IHtpbnB1dH07XG5cbiAgcmV0dXJuIEVOR0lORS5ydW5LZXJuZWwoSUZGVCwgaW5wdXRzIGFzIHt9IGFzIE5hbWVkVGVuc29yTWFwKTtcbn1cblxuZXhwb3J0IGNvbnN0IGlmZnQgPSBvcCh7aWZmdF99KTtcbiJdfQ==","/**\n * @license\n * Copyright 2018 Google LLC. All Rights Reserved.\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n * =============================================================================\n */\nimport { complex } from '../complex';\nimport { concat } from '../concat';\nimport { imag } from '../imag';\nimport { mul } from '../mul';\nimport { op } from '../operation';\nimport { real } from '../real';\nimport { reshape } from '../reshape';\nimport { reverse } from '../reverse';\nimport { scalar } from '../scalar';\nimport { slice } from '../slice';\nimport { ifft } from './ifft';\n/**\n * Inversed real value input fast Fourier transform.\n *\n * Computes the 1-dimensional inversed discrete Fourier transform over the\n * inner-most dimension of the real input.\n *\n * ```js\n * const real = tf.tensor1d([1, 2, 3]);\n * const imag = tf.tensor1d([0, 0, 0]);\n * const x = tf.complex(real, imag);\n *\n * x.irfft().print();\n * ```\n * @param input The real value input to compute an irfft over.\n *\n * @doc {heading: 'Operations', subheading: 'Spectral', namespace: 'spectral'}\n */\nfunction irfft_(input) {\n const innerDimensionSize = input.shape[input.shape.length - 1];\n const batch = input.size / innerDimensionSize;\n let ret;\n if (innerDimensionSize <= 2) {\n const complexInput = reshape(input, [batch, innerDimensionSize]);\n ret = ifft(complexInput);\n }\n else {\n // The length of unique components of the DFT of a real-valued signal\n // is 2 * (input_len - 1)\n const outputShape = [batch, 2 * (innerDimensionSize - 1)];\n const realInput = reshape(real(input), [batch, innerDimensionSize]);\n const imagInput = reshape(imag(input), [batch, innerDimensionSize]);\n const realConjugate = reverse(slice(realInput, [0, 1], [batch, innerDimensionSize - 2]), 1);\n const imagConjugate = mul(reverse(slice(imagInput, [0, 1], [batch, innerDimensionSize - 2]), 1), scalar(-1));\n const r = concat([realInput, realConjugate], 1);\n const i = concat([imagInput, imagConjugate], 1);\n const complexInput = reshape(complex(r, i), [outputShape[0], outputShape[1]]);\n ret = ifft(complexInput);\n }\n ret = real(ret);\n // reshape the result if the input is 3D tensor.\n if (input.rank === 3 && input.shape[0] !== 0) {\n const temp = ret;\n const batch = input.shape[0];\n ret = reshape(ret, [batch, ret.shape[0] / batch, ret.shape[1]]);\n temp.dispose();\n }\n return ret;\n}\nexport const irfft = op({ irfft_ });\n//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaXJmZnQuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi8uLi8uLi90ZmpzLWNvcmUvc3JjL29wcy9zcGVjdHJhbC9pcmZmdC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQTs7Ozs7Ozs7Ozs7Ozs7O0dBZUc7QUFHSCxPQUFPLEVBQUMsT0FBTyxFQUFDLE1BQU0sWUFBWSxDQUFDO0FBQ25DLE9BQU8sRUFBQyxNQUFNLEVBQUMsTUFBTSxXQUFXLENBQUM7QUFDakMsT0FBTyxFQUFDLElBQUksRUFBQyxNQUFNLFNBQVMsQ0FBQztBQUM3QixPQUFPLEVBQUMsR0FBRyxFQUFDLE1BQU0sUUFBUSxDQUFDO0FBQzNCLE9BQU8sRUFBQyxFQUFFLEVBQUMsTUFBTSxjQUFjLENBQUM7QUFDaEMsT0FBTyxFQUFDLElBQUksRUFBQyxNQUFNLFNBQVMsQ0FBQztBQUM3QixPQUFPLEVBQUMsT0FBTyxFQUFDLE1BQU0sWUFBWSxDQUFDO0FBQ25DLE9BQU8sRUFBQyxPQUFPLEVBQUMsTUFBTSxZQUFZLENBQUM7QUFDbkMsT0FBTyxFQUFDLE1BQU0sRUFBQyxNQUFNLFdBQVcsQ0FBQztBQUNqQyxPQUFPLEVBQUMsS0FBSyxFQUFDLE1BQU0sVUFBVSxDQUFDO0FBRS9CLE9BQU8sRUFBQyxJQUFJLEVBQUMsTUFBTSxRQUFRLENBQUM7QUFFNUI7Ozs7Ozs7Ozs7Ozs7Ozs7R0FnQkc7QUFDSCxTQUFTLE1BQU0sQ0FBQyxLQUFhO0lBQzNCLE1BQU0sa0JBQWtCLEdBQUcsS0FBSyxDQUFDLEtBQUssQ0FBQyxLQUFLLENBQUMsS0FBSyxDQUFDLE1BQU0sR0FBRyxDQUFDLENBQUMsQ0FBQztJQUMvRCxNQUFNLEtBQUssR0FBRyxLQUFLLENBQUMsSUFBSSxHQUFHLGtCQUFrQixDQUFDO0lBQzlDLElBQUksR0FBVyxDQUFDO0lBQ2hCLElBQUksa0JBQWtCLElBQUksQ0FBQyxFQUFFO1FBQzNCLE1BQU0sWUFBWSxHQUFHLE9BQU8sQ0FBQyxLQUFLLEVBQUUsQ0FBQyxLQUFLLEVBQUUsa0JBQWtCLENBQUMsQ0FBQyxDQUFDO1FBQ2pFLEdBQUcsR0FBRyxJQUFJLENBQUMsWUFBWSxDQUFDLENBQUM7S0FDMUI7U0FBTTtRQUNMLHFFQUFxRTtRQUNyRSx5QkFBeUI7UUFDekIsTUFBTSxXQUFXLEdBQUcsQ0FBQyxLQUFLLEVBQUUsQ0FBQyxHQUFHLENBQUMsa0JBQWtCLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQztRQUMxRCxNQUFNLFNBQVMsR0FBRyxPQUFPLENBQUMsSUFBSSxDQUFDLEtBQUssQ0FBQyxFQUFFLENBQUMsS0FBSyxFQUFFLGtCQUFrQixDQUFDLENBQUMsQ0FBQztRQUNwRSxNQUFNLFNBQVMsR0FBRyxPQUFPLENBQUMsSUFBSSxDQUFDLEtBQUssQ0FBQyxFQUFFLENBQUMsS0FBSyxFQUFFLGtCQUFrQixDQUFDLENBQUMsQ0FBQztRQUVwRSxNQUFNLGFBQWEsR0FDZixPQUFPLENBQUMsS0FBSyxDQUFDLFNBQVMsRUFBRSxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsRUFBRSxDQUFDLEtBQUssRUFBRSxrQkFBa0IsR0FBRyxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDO1FBQzFFLE1BQU0sYUFBYSxHQUFhLEdBQUcsQ0FDL0IsT0FBTyxDQUFDLEtBQUssQ0FBQyxTQUFTLEVBQUUsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxLQUFLLEVBQUUsa0JBQWtCLEdBQUcsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsRUFDckUsTUFBTSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQztRQUVoQixNQUFNLENBQUMsR0FBRyxNQUFNLENBQUMsQ0FBQyxTQUFTLEVBQUUsYUFBYSxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUM7UUFDaEQsTUFBTSxDQUFDLEdBQUcsTUFBTSxDQUFDLENBQUMsU0FBUyxFQUFFLGFBQWEsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDO1FBQ2hELE1BQU0sWUFBWSxHQUNkLE9BQU8sQ0FBQyxPQUFPLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxFQUFFLENBQUMsV0FBVyxDQUFDLENBQUMsQ0FBQyxFQUFFLFdBQVcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUM7UUFDN0QsR0FBRyxHQUFHLElBQUksQ0FBQyxZQUFZLENBQUMsQ0FBQztLQUMxQjtJQUNELEdBQUcsR0FBRyxJQUFJLENBQUMsR0FBRyxDQUFDLENBQUM7SUFDaEIsZ0RBQWdEO0lBQ2hELElBQUksS0FBSyxDQUFDLElBQUksS0FBSyxDQUFDLElBQUksS0FBSyxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUMsS0FBSyxDQUFDLEVBQUU7UUFDNUMsTUFBTSxJQUFJLEdBQUcsR0FBRyxDQUFDO1FBQ2pCLE1BQU0sS0FBSyxHQUFHLEtBQUssQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDLENBQUM7UUFDN0IsR0FBRyxHQUFHLE9BQU8sQ0FBQyxHQUFHLEVBQUUsQ0FBQyxLQUFLLEVBQUUsR0FBRyxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUMsR0FBRyxLQUFLLEVBQUUsR0FBRyxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUM7UUFDaEUsSUFBSSxDQUFDLE9BQU8sRUFBRSxDQUFDO0tBQ2hCO0lBQ0QsT0FBTyxHQUFHLENBQUM7QUFDYixDQUFDO0FBRUQsTUFBTSxDQUFDLE1BQU0sS0FBSyxHQUFHLEVBQUUsQ0FBQyxFQUFDLE1BQU0sRUFBQyxDQUFDLENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyIvKipcbiAqIEBsaWNlbnNlXG4gKiBDb3B5cmlnaHQgMjAxOCBHb29nbGUgTExDLiBBbGwgUmlnaHRzIFJlc2VydmVkLlxuICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlIFwiTGljZW5zZVwiKTtcbiAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS5cbiAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdFxuICpcbiAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMFxuICpcbiAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmVcbiAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuIFwiQVMgSVNcIiBCQVNJUyxcbiAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLlxuICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZFxuICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuXG4gKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuICovXG5cbmltcG9ydCB7VGVuc29yLCBUZW5zb3IyRH0gZnJvbSAnLi4vLi4vdGVuc29yJztcbmltcG9ydCB7Y29tcGxleH0gZnJvbSAnLi4vY29tcGxleCc7XG5pbXBvcnQge2NvbmNhdH0gZnJvbSAnLi4vY29uY2F0JztcbmltcG9ydCB7aW1hZ30gZnJvbSAnLi4vaW1hZyc7XG5pbXBvcnQge211bH0gZnJvbSAnLi4vbXVsJztcbmltcG9ydCB7b3B9IGZyb20gJy4uL29wZXJhdGlvbic7XG5pbXBvcnQge3JlYWx9IGZyb20gJy4uL3JlYWwnO1xuaW1wb3J0IHtyZXNoYXBlfSBmcm9tICcuLi9yZXNoYXBlJztcbmltcG9ydCB7cmV2ZXJzZX0gZnJvbSAnLi4vcmV2ZXJzZSc7XG5pbXBvcnQge3NjYWxhcn0gZnJvbSAnLi4vc2NhbGFyJztcbmltcG9ydCB7c2xpY2V9IGZyb20gJy4uL3NsaWNlJztcblxuaW1wb3J0IHtpZmZ0fSBmcm9tICcuL2lmZnQnO1xuXG4vKipcbiAqIEludmVyc2VkIHJlYWwgdmFsdWUgaW5wdXQgZmFzdCBGb3VyaWVyIHRyYW5zZm9ybS5cbiAqXG4gKiBDb21wdXRlcyB0aGUgMS1kaW1lbnNpb25hbCBpbnZlcnNlZCBkaXNjcmV0ZSBGb3VyaWVyIHRyYW5zZm9ybSBvdmVyIHRoZVxuICogaW5uZXItbW9zdCBkaW1lbnNpb24gb2YgdGhlIHJlYWwgaW5wdXQuXG4gKlxuICogYGBganNcbiAqIGNvbnN0IHJlYWwgPSB0Zi50ZW5zb3IxZChbMSwgMiwgM10pO1xuICogY29uc3QgaW1hZyA9IHRmLnRlbnNvcjFkKFswLCAwLCAwXSk7XG4gKiBjb25zdCB4ID0gdGYuY29tcGxleChyZWFsLCBpbWFnKTtcbiAqXG4gKiB4LmlyZmZ0KCkucHJpbnQoKTtcbiAqIGBgYFxuICogQHBhcmFtIGlucHV0IFRoZSByZWFsIHZhbHVlIGlucHV0IHRvIGNvbXB1dGUgYW4gaXJmZnQgb3Zlci5cbiAqXG4gKiBAZG9jIHtoZWFkaW5nOiAnT3BlcmF0aW9ucycsIHN1YmhlYWRpbmc6ICdTcGVjdHJhbCcsIG5hbWVzcGFjZTogJ3NwZWN0cmFsJ31cbiAqL1xuZnVuY3Rpb24gaXJmZnRfKGlucHV0OiBUZW5zb3IpOiBUZW5zb3Ige1xuICBjb25zdCBpbm5lckRpbWVuc2lvblNpemUgPSBpbnB1dC5zaGFwZVtpbnB1dC5zaGFwZS5sZW5ndGggLSAxXTtcbiAgY29uc3QgYmF0Y2ggPSBpbnB1dC5zaXplIC8gaW5uZXJEaW1lbnNpb25TaXplO1xuICBsZXQgcmV0OiBUZW5zb3I7XG4gIGlmIChpbm5lckRpbWVuc2lvblNpemUgPD0gMikge1xuICAgIGNvbnN0IGNvbXBsZXhJbnB1dCA9IHJlc2hhcGUoaW5wdXQsIFtiYXRjaCwgaW5uZXJEaW1lbnNpb25TaXplXSk7XG4gICAgcmV0ID0gaWZmdChjb21wbGV4SW5wdXQpO1xuICB9IGVsc2Uge1xuICAgIC8vIFRoZSBsZW5ndGggb2YgdW5pcXVlIGNvbXBvbmVudHMgb2YgdGhlIERGVCBvZiBhIHJlYWwtdmFsdWVkIHNpZ25hbFxuICAgIC8vIGlzIDIgKiAoaW5wdXRfbGVuIC0gMSlcbiAgICBjb25zdCBvdXRwdXRTaGFwZSA9IFtiYXRjaCwgMiAqIChpbm5lckRpbWVuc2lvblNpemUgLSAxKV07XG4gICAgY29uc3QgcmVhbElucHV0ID0gcmVzaGFwZShyZWFsKGlucHV0KSwgW2JhdGNoLCBpbm5lckRpbWVuc2lvblNpemVdKTtcbiAgICBjb25zdCBpbWFnSW5wdXQgPSByZXNoYXBlKGltYWcoaW5wdXQpLCBbYmF0Y2gsIGlubmVyRGltZW5zaW9uU2l6ZV0pO1xuXG4gICAgY29uc3QgcmVhbENvbmp1Z2F0ZSA9XG4gICAgICAgIHJldmVyc2Uoc2xpY2UocmVhbElucHV0LCBbMCwgMV0sIFtiYXRjaCwgaW5uZXJEaW1lbnNpb25TaXplIC0gMl0pLCAxKTtcbiAgICBjb25zdCBpbWFnQ29uanVnYXRlOiBUZW5zb3IyRCA9IG11bChcbiAgICAgICAgcmV2ZXJzZShzbGljZShpbWFnSW5wdXQsIFswLCAxXSwgW2JhdGNoLCBpbm5lckRpbWVuc2lvblNpemUgLSAyXSksIDEpLFxuICAgICAgICBzY2FsYXIoLTEpKTtcblxuICAgIGNvbnN0IHIgPSBjb25jYXQoW3JlYWxJbnB1dCwgcmVhbENvbmp1Z2F0ZV0sIDEpO1xuICAgIGNvbnN0IGkgPSBjb25jYXQoW2ltYWdJbnB1dCwgaW1hZ0Nvbmp1Z2F0ZV0sIDEpO1xuICAgIGNvbnN0IGNvbXBsZXhJbnB1dCA9XG4gICAgICAgIHJlc2hhcGUoY29tcGxleChyLCBpKSwgW291dHB1dFNoYXBlWzBdLCBvdXRwdXRTaGFwZVsxXV0pO1xuICAgIHJldCA9IGlmZnQoY29tcGxleElucHV0KTtcbiAgfVxuICByZXQgPSByZWFsKHJldCk7XG4gIC8vIHJlc2hhcGUgdGhlIHJlc3VsdCBpZiB0aGUgaW5wdXQgaXMgM0QgdGVuc29yLlxuICBpZiAoaW5wdXQucmFuayA9PT0gMyAmJiBpbnB1dC5zaGFwZVswXSAhPT0gMCkge1xuICAgIGNvbnN0IHRlbXAgPSByZXQ7XG4gICAgY29uc3QgYmF0Y2ggPSBpbnB1dC5zaGFwZVswXTtcbiAgICByZXQgPSByZXNoYXBlKHJldCwgW2JhdGNoLCByZXQuc2hhcGVbMF0gLyBiYXRjaCwgcmV0LnNoYXBlWzFdXSk7XG4gICAgdGVtcC5kaXNwb3NlKCk7XG4gIH1cbiAgcmV0dXJuIHJldDtcbn1cblxuZXhwb3J0IGNvbnN0IGlyZmZ0ID0gb3Aoe2lyZmZ0X30pO1xuIl19","/**\n * @license\n * Copyright 2018 Google LLC. All Rights Reserved.\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n * =============================================================================\n */\nimport { assert } from '../../util';\nimport { complex } from '../complex';\nimport { concat } from '../concat';\nimport { imag } from '../imag';\nimport { op } from '../operation';\nimport { real } from '../real';\nimport { reshape } from '../reshape';\nimport { slice } from '../slice';\nimport { split } from '../split';\nimport { zeros } from '../zeros';\nimport { zerosLike } from '../zeros_like';\nimport { fft } from './fft';\n/**\n * Real value input fast Fourier transform.\n *\n * Computes the 1-dimensional discrete Fourier transform over the\n * inner-most dimension of the real input.\n *\n * ```js\n * const real = tf.tensor1d([1, 2, 3]);\n *\n * real.rfft().print();\n * ```\n * @param input The real value input to compute an rfft over.\n *\n * @doc {heading: 'Operations', subheading: 'Spectral', namespace: 'spectral'}\n */\nfunction rfft_(input, fftLength) {\n assert(input.dtype === 'float32', () => `The dtype for rfft() must be real value but got ${input.dtype}`);\n let innerDimensionSize = input.shape[input.shape.length - 1];\n const batch = input.size / innerDimensionSize;\n let adjustedInput;\n if (fftLength != null && fftLength < innerDimensionSize) {\n // Need to crop\n const begin = input.shape.map(v => 0);\n const size = input.shape.map(v => v);\n size[input.shape.length - 1] = fftLength;\n adjustedInput = slice(input, begin, size);\n innerDimensionSize = fftLength;\n }\n else if (fftLength != null && fftLength > innerDimensionSize) {\n // Need to pad with zeros\n const zerosShape = input.shape.map(v => v);\n zerosShape[input.shape.length - 1] = fftLength - innerDimensionSize;\n adjustedInput = concat([input, zeros(zerosShape)], input.shape.length - 1);\n innerDimensionSize = fftLength;\n }\n else {\n adjustedInput = input;\n }\n // Complement the input with zero imaginary numbers.\n const zerosInput = zerosLike(adjustedInput);\n const complexInput = reshape(complex(adjustedInput, zerosInput), [batch, innerDimensionSize]);\n const ret = fft(complexInput);\n // Exclude complex conjugations. These conjugations are put symmetrically.\n const half = Math.floor(innerDimensionSize / 2) + 1;\n const realValues = real(ret);\n const imagValues = imag(ret);\n const realComplexConjugate = split(realValues, [half, innerDimensionSize - half], realValues.shape.length - 1);\n const imagComplexConjugate = split(imagValues, [half, innerDimensionSize - half], imagValues.shape.length - 1);\n const outputShape = adjustedInput.shape.slice();\n outputShape[adjustedInput.shape.length - 1] = half;\n return reshape(complex(realComplexConjugate[0], imagComplexConjugate[0]), outputShape);\n}\nexport const rfft = op({ rfft_ });\n//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicmZmdC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uLy4uLy4uL3RmanMtY29yZS9zcmMvb3BzL3NwZWN0cmFsL3JmZnQudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUE7Ozs7Ozs7Ozs7Ozs7OztHQWVHO0FBR0gsT0FBTyxFQUFDLE1BQU0sRUFBQyxNQUFNLFlBQVksQ0FBQztBQUNsQyxPQUFPLEVBQUMsT0FBTyxFQUFDLE1BQU0sWUFBWSxDQUFDO0FBQ25DLE9BQU8sRUFBQyxNQUFNLEVBQUMsTUFBTSxXQUFXLENBQUM7QUFDakMsT0FBTyxFQUFDLElBQUksRUFBQyxNQUFNLFNBQVMsQ0FBQztBQUM3QixPQUFPLEVBQUMsRUFBRSxFQUFDLE1BQU0sY0FBYyxDQUFDO0FBQ2hDLE9BQU8sRUFBQyxJQUFJLEVBQUMsTUFBTSxTQUFTLENBQUM7QUFDN0IsT0FBTyxFQUFDLE9BQU8sRUFBQyxNQUFNLFlBQVksQ0FBQztBQUNuQyxPQUFPLEVBQUMsS0FBSyxFQUFDLE1BQU0sVUFBVSxDQUFDO0FBQy9CLE9BQU8sRUFBQyxLQUFLLEVBQUMsTUFBTSxVQUFVLENBQUM7QUFDL0IsT0FBTyxFQUFDLEtBQUssRUFBQyxNQUFNLFVBQVUsQ0FBQztBQUMvQixPQUFPLEVBQUMsU0FBUyxFQUFDLE1BQU0sZUFBZSxDQUFDO0FBRXhDLE9BQU8sRUFBQyxHQUFHLEVBQUMsTUFBTSxPQUFPLENBQUM7QUFFMUI7Ozs7Ozs7Ozs7Ozs7O0dBY0c7QUFDSCxTQUFTLEtBQUssQ0FBQyxLQUFhLEVBQUUsU0FBa0I7SUFDOUMsTUFBTSxDQUNGLEtBQUssQ0FBQyxLQUFLLEtBQUssU0FBUyxFQUN6QixHQUFHLEVBQUUsQ0FBQyxtREFBbUQsS0FBSyxDQUFDLEtBQUssRUFBRSxDQUFDLENBQUM7SUFFNUUsSUFBSSxrQkFBa0IsR0FBRyxLQUFLLENBQUMsS0FBSyxDQUFDLEtBQUssQ0FBQyxLQUFLLENBQUMsTUFBTSxHQUFHLENBQUMsQ0FBQyxDQUFD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QUFNLENBQUMsTUFBTSxJQUFJLEdBQUcsRUFBRSxDQUFDLEVBQUMsS0FBSyxFQUFDLENBQUMsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbIi8qKlxuICogQGxpY2Vuc2VcbiAqIENvcHlyaWdodCAyMDE4IEdvb2dsZSBMTEMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuXG4gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgXCJMaWNlbnNlXCIpO1xuICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLlxuICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0XG4gKlxuICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wXG4gKlxuICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZVxuICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gXCJBUyBJU1wiIEJBU0lTLFxuICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuXG4gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kXG4gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS5cbiAqID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4gKi9cblxuaW1wb3J0IHtUZW5zb3J9IGZyb20gJy4uLy4uL3RlbnNvcic7XG5pbXBvcnQge2Fzc2VydH0gZnJvbSAnLi4vLi4vdXRpbCc7XG5pbXBvcnQge2NvbXBsZXh9IGZyb20gJy4uL2NvbXBsZXgnO1xuaW1wb3J0IHtjb25jYXR9IGZyb20gJy4uL2NvbmNhdCc7XG5pbXBvcnQge2ltYWd9IGZyb20gJy4uL2ltYWcnO1xuaW1wb3J0IHtvcH0gZnJvbSAnLi4vb3BlcmF0aW9uJztcbmltcG9ydCB7cmVhbH0gZnJvbSAnLi4vcmVhbCc7XG5pbXBvcnQge3Jlc2hhcGV9IGZyb20gJy4uL3Jlc2hhcGUnO1xuaW1wb3J0IHtzbGljZX0gZnJvbSAnLi4vc2xpY2UnO1xuaW1wb3J0IHtzcGxpdH0gZnJvbSAnLi4vc3BsaXQnO1xuaW1wb3J0IHt6ZXJvc30gZnJvbSAnLi4vemVyb3MnO1xuaW1wb3J0IHt6ZXJvc0xpa2V9IGZyb20gJy4uL3plcm9zX2xpa2UnO1xuXG5pbXBvcnQge2ZmdH0gZnJvbSAnLi9mZnQnO1xuXG4vKipcbiAqIFJlYWwgdmFsdWUgaW5wdXQgZmFzdCBGb3VyaWVyIHRyYW5zZm9ybS5cbiAqXG4gKiBDb21wdXRlcyB0aGUgMS1kaW1lbnNpb25hbCBkaXNjcmV0ZSBGb3VyaWVyIHRyYW5zZm9ybSBvdmVyIHRoZVxuICogaW5uZXItbW9zdCBkaW1lbnNpb24gb2YgdGhlIHJlYWwgaW5wdXQuXG4gKlxuICogYGBganNcbiAqIGNvbnN0IHJlYWwgPSB0Zi50ZW5zb3IxZChbMSwgMiwgM10pO1xuICpcbiAqIHJlYWwucmZmdCgpLnByaW50KCk7XG4gKiBgYGBcbiAqIEBwYXJhbSBpbnB1dCBUaGUgcmVhbCB2YWx1ZSBpbnB1dCB0byBjb21wdXRlIGFuIHJmZnQgb3Zlci5cbiAqXG4gKiBAZG9jIHtoZWFkaW5nOiAnT3BlcmF0aW9ucycsIHN1YmhlYWRpbmc6ICdTcGVjdHJhbCcsIG5hbWVzcGFjZTogJ3NwZWN0cmFsJ31cbiAqL1xuZnVuY3Rpb24gcmZmdF8oaW5wdXQ6IFRlbnNvciwgZmZ0TGVuZ3RoPzogbnVtYmVyKTogVGVuc29yIHtcbiAgYXNzZXJ0KFxuICAgICAgaW5wdXQuZHR5cGUgPT09ICdmbG9hdDMyJyxcbiAgICAgICgpID0+IGBUaGUgZHR5cGUgZm9yIHJmZnQoKSBtdXN0IGJlIHJlYWwgdmFsdWUgYnV0IGdvdCAke2lucHV0LmR0eXBlfWApO1xuXG4gIGxldCBpbm5lckRpbWVuc2lvblNpemUgPSBpbnB1dC5zaGFwZVtpbnB1dC5zaGFwZS5sZW5ndGggLSAxXTtcbiAgY29uc3QgYmF0Y2ggPSBpbnB1dC5zaXplIC8gaW5uZXJEaW1lbnNpb25TaXplO1xuXG4gIGxldCBhZGp1c3RlZElucHV0OiBUZW5zb3I7XG4gIGlmIChmZnRMZW5ndGggIT0gbnVsbCAmJiBmZnRMZW5ndGggPCBpbm5lckRpbWVuc2lvblNpemUpIHtcbiAgICAvLyBOZWVkIHRvIGNyb3BcbiAgICBjb25zdCBiZWdpbiA9IGlucHV0LnNoYXBlLm1hcCh2ID0+IDApO1xuICAgIGNvbnN0IHNpemUgPSBpbnB1dC5zaGFwZS5tYXAodiA9PiB2KTtcbiAgICBzaXplW2lucHV0LnNoYXBlLmxlbmd0aCAtIDFdID0gZmZ0TGVuZ3RoO1xuICAgIGFkanVzdGVkSW5wdXQgPSBzbGljZShpbnB1dCwgYmVnaW4sIHNpemUpO1xuICAgIGlubmVyRGltZW5zaW9uU2l6ZSA9IGZmdExlbmd0aDtcbiAgfSBlbHNlIGlmIChmZnRMZW5ndGggIT0gbnVsbCAmJiBmZnRMZW5ndGggPiBpbm5lckRpbWVuc2lvblNpemUpIHtcbiAgICAvLyBOZWVkIHRvIHBhZCB3aXRoIHplcm9zXG4gICAgY29uc3QgemVyb3NTaGFwZSA9IGlucHV0LnNoYXBlLm1hcCh2ID0+IHYpO1xuICAgIHplcm9zU2hhcGVbaW5wdXQuc2hhcGUubGVuZ3RoIC0gMV0gPSBmZnRMZW5ndGggLSBpbm5lckRpbWVuc2lvblNpemU7XG4gICAgYWRqdXN0ZWRJbnB1dCA9IGNvbmNhdChbaW5wdXQsIHplcm9zKHplcm9zU2hhcGUpXSwgaW5wdXQuc2hhcGUubGVuZ3RoIC0gMSk7XG4gICAgaW5uZXJEaW1lbnNpb25TaXplID0gZmZ0TGVuZ3RoO1xuICB9IGVsc2Uge1xuICAgIGFkanVzdGVkSW5wdXQgPSBpbnB1dDtcbiAgfVxuXG4gIC8vIENvbXBsZW1lbnQgdGhlIGlucHV0IHdpdGggemVybyBpbWFnaW5hcnkgbnVtYmVycy5cbiAgY29uc3QgemVyb3NJbnB1dCA9IHplcm9zTGlrZShhZGp1c3RlZElucHV0KTtcbiAgY29uc3QgY29tcGxleElucHV0ID1cbiAgICAgIHJlc2hhcGUoY29tcGxleChhZGp1c3RlZElucHV0LCB6ZXJvc0lucHV0KSwgW2JhdGNoLCBpbm5lckRpbWVuc2lvblNpemVdKTtcblxuICBjb25zdCByZXQgPSBmZnQoY29tcGxleElucHV0KTtcblxuICAvLyBFeGNsdWRlIGNvbXBsZXggY29uanVnYXRpb25zLiBUaGVzZSBjb25qdWdhdGlvbnMgYXJlIHB1dCBzeW1tZXRyaWNhbGx5LlxuICBjb25zdCBoYWxmID0gTWF0aC5mbG9vcihpbm5lckRpbWVuc2lvblNpemUgLyAyKSArIDE7XG4gIGNvbnN0IHJlYWxWYWx1ZXMgPSByZWFsKHJldCk7XG4gIGNvbnN0IGltYWdWYWx1ZXMgPSBpbWFnKHJldCk7XG4gIGNvbnN0IHJlYWxDb21wbGV4Q29uanVnYXRlID0gc3BsaXQoXG4gICAgICByZWFsVmFsdWVzLCBbaGFsZiwgaW5uZXJEaW1lbnNpb25TaXplIC0gaGFsZl0sXG4gICAgICByZWFsVmFsdWVzLnNoYXBlLmxlbmd0aCAtIDEpO1xuICBjb25zdCBpbWFnQ29tcGxleENvbmp1Z2F0ZSA9IHNwbGl0KFxuICAgICAgaW1hZ1ZhbHVlcywgW2hhbGYsIGlubmVyRGltZW5zaW9uU2l6ZSAtIGhhbGZdLFxuICAgICAgaW1hZ1ZhbHVlcy5zaGFwZS5sZW5ndGggLSAxKTtcblxuICBjb25zdCBvdXRwdXRTaGFwZSA9IGFkanVzdGVkSW5wdXQuc2hhcGUuc2xpY2UoKTtcbiAgb3V0cHV0U2hhcGVbYWRqdXN0ZWRJbnB1dC5zaGFwZS5sZW5ndGggLSAxXSA9IGhhbGY7XG5cbiAgcmV0dXJuIHJlc2hhcGUoXG4gICAgICBjb21wbGV4KHJlYWxDb21wbGV4Q29uanVnYXRlWzBdLCBpbWFnQ29tcGxleENvbmp1Z2F0ZVswXSksIG91dHB1dFNoYXBlKTtcbn1cblxuZXhwb3J0IGNvbnN0IHJmZnQgPSBvcCh7cmZmdF99KTtcbiJdfQ==","/**\n * @license\n * Copyright 2020 Google LLC. All Rights Reserved.\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n * =============================================================================\n */\nimport { ENGINE } from '../engine';\nimport { SplitV } from '../kernel_names';\nimport { convertToTensor } from '../tensor_util_env';\nimport { op } from './operation';\n/**\n * Splits a `tf.Tensor` into sub tensors.\n *\n * If `numOrSizeSplits` is a number, splits `x` along dimension `axis`\n * into `numOrSizeSplits` smaller tensors.\n * Requires that `numOrSizeSplits` evenly divides `x.shape[axis]`.\n *\n * If `numOrSizeSplits` is a number array, splits `x` into\n * `numOrSizeSplits.length` pieces. The shape of the `i`-th piece has the\n * same size as `x` except along dimension `axis` where the size is\n * `numOrSizeSplits[i]`.\n *\n * ```js\n * const x = tf.tensor2d([1, 2, 3, 4, 5, 6, 7, 8], [2, 4]);\n * const [a, b] = tf.split(x, 2, 1);\n * a.print();\n * b.print();\n *\n * const [c, d, e] = tf.split(x, [1, 2, 1], 1);\n * c.print();\n * d.print();\n * e.print();\n * ```\n *\n * @param x The input tensor to split.\n * @param numOrSizeSplits Either an integer indicating the number of\n * splits along the axis or an array of integers containing the sizes of\n * each output tensor along the axis. If a number then it must evenly divide\n * `x.shape[axis]`; otherwise the sum of sizes must match `x.shape[axis]`.\n * Can contain one -1 indicating that dimension is to be inferred.\n * @param axis The dimension along which to split. Defaults to 0 (the first\n * dim).\n *\n * @doc {heading: 'Tensors', subheading: 'Slicing and Joining'}\n */\nfunction split_(x, numOrSizeSplits, axis = 0) {\n const $x = convertToTensor(x, 'x', 'split');\n const inputs = { x: $x };\n const attr = { numOrSizeSplits, axis };\n return ENGINE.runKernel(SplitV, inputs, attr);\n}\nexport const split = op({ split_ });\n//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic3BsaXQuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi8uLi90ZmpzLWNvcmUvc3JjL29wcy9zcGxpdC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQTs7Ozs7Ozs7Ozs7Ozs7O0dBZUc7QUFDSCxPQUFPLEVBQUMsTUFBTSxFQUFDLE1BQU0sV0FBVyxDQUFDO0FBQ2pDLE9BQU8sRUFBQyxNQUFNLEVBQTRCLE1BQU0saUJBQWlCLENBQUM7QUFJbEUsT0FBTyxFQUFDLGVBQWUsRUFBQyxNQUFNLG9CQUFvQixDQUFDO0FBR25ELE9BQU8sRUFBQyxFQUFFLEVBQUMsTUFBTSxhQUFhLENBQUM7QUFFL0I7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7R0FrQ0c7QUFDSCxTQUFTLE1BQU0sQ0FDWCxDQUFvQixFQUFFLGVBQWdDLEVBQUUsSUFBSSxHQUFHLENBQUM7SUFDbEUsTUFBTSxFQUFFLEdBQUcsZUFBZSxDQUFDLENBQUMsRUFBRSxHQUFHLEVBQUUsT0FBTyxDQUFDLENBQUM7SUFFNUMsTUFBTSxNQUFNLEdBQWlCLEVBQUMsQ0FBQyxFQUFFLEVBQUUsRUFBQyxDQUFDO0lBQ3JDLE1BQU0sSUFBSSxHQUFnQixFQUFDLGVBQWUsRUFBRSxJQUFJLEVBQUMsQ0FBQztJQUVsRCxPQUFPLE1BQU0sQ0FBQyxTQUFTLENBQ1osTUFBTSxFQUFFLE1BQThCLEVBQ3RDLElBQTBCLENBQWMsQ0FBQztBQUN0RCxDQUFDO0FBRUQsTUFBTSxDQUFDLE1BQU0sS0FBSyxHQUFHLEVBQUUsQ0FBQyxFQUFDLE1BQU0sRUFBQyxDQUFDLENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyIvKipcbiAqIEBsaWNlbnNlXG4gKiBDb3B5cmlnaHQgMjAyMCBHb29nbGUgTExDLiBBbGwgUmlnaHRzIFJlc2VydmVkLlxuICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlIFwiTGljZW5zZVwiKTtcbiAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS5cbiAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdFxuICpcbiAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMFxuICpcbiAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmVcbiAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuIFwiQVMgSVNcIiBCQVNJUyxcbiAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLlxuICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZFxuICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuXG4gKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuICovXG5pbXBvcnQge0VOR0lORX0gZnJvbSAnLi4vZW5naW5lJztcbmltcG9ydCB7U3BsaXRWLCBTcGxpdFZBdHRycywgU3BsaXRWSW5wdXRzfSBmcm9tICcuLi9rZXJuZWxfbmFtZXMnO1xuaW1wb3J0IHtOYW1lZEF0dHJNYXB9IGZyb20gJy4uL2tlcm5lbF9yZWdpc3RyeSc7XG5pbXBvcnQge1RlbnNvcn0gZnJvbSAnLi4vdGVuc29yJztcbmltcG9ydCB7TmFtZWRUZW5zb3JNYXB9IGZyb20gJy4uL3RlbnNvcl90eXBlcyc7XG5pbXBvcnQge2NvbnZlcnRUb1RlbnNvcn0gZnJvbSAnLi4vdGVuc29yX3V0aWxfZW52JztcbmltcG9ydCB7VGVuc29yTGlrZX0gZnJvbSAnLi4vdHlwZXMnO1xuXG5pbXBvcnQge29wfSBmcm9tICcuL29wZXJhdGlvbic7XG5cbi8qKlxuICogU3BsaXRzIGEgYHRmLlRlbnNvcmAgaW50byBzdWIgdGVuc29ycy5cbiAqXG4gKiBJZiBgbnVtT3JTaXplU3BsaXRzYCBpcyBhIG51bWJlciwgc3BsaXRzIGB4YCBhbG9uZyBkaW1lbnNpb24gYGF4aXNgXG4gKiBpbnRvIGBudW1PclNpemVTcGxpdHNgIHNtYWxsZXIgdGVuc29ycy5cbiAqIFJlcXVpcmVzIHRoYXQgYG51bU9yU2l6ZVNwbGl0c2AgZXZlbmx5IGRpdmlkZXMgYHguc2hhcGVbYXhpc11gLlxuICpcbiAqIElmIGBudW1PclNpemVTcGxpdHNgIGlzIGEgbnVtYmVyIGFycmF5LCBzcGxpdHMgYHhgIGludG9cbiAqIGBudW1PclNpemVTcGxpdHMubGVuZ3RoYCBwaWVjZXMuIFRoZSBzaGFwZSBvZiB0aGUgYGlgLXRoIHBpZWNlIGhhcyB0aGVcbiAqIHNhbWUgc2l6ZSBhcyBgeGAgZXhjZXB0IGFsb25nIGRpbWVuc2lvbiBgYXhpc2Agd2hlcmUgdGhlIHNpemUgaXNcbiAqIGBudW1PclNpemVTcGxpdHNbaV1gLlxuICpcbiAqIGBgYGpzXG4gKiBjb25zdCB4ID0gdGYudGVuc29yMmQoWzEsIDIsIDMsIDQsIDUsIDYsIDcsIDhdLCBbMiwgNF0pO1xuICogY29uc3QgW2EsIGJdID0gdGYuc3BsaXQoeCwgMiwgMSk7XG4gKiBhLnByaW50KCk7XG4gKiBiLnByaW50KCk7XG4gKlxuICogY29uc3QgW2MsIGQsIGVdID0gdGYuc3BsaXQoeCwgWzEsIDIsIDFdLCAxKTtcbiAqIGMucHJpbnQoKTtcbiAqIGQucHJpbnQoKTtcbiAqIGUucHJpbnQoKTtcbiAqIGBgYFxuICpcbiAqIEBwYXJhbSB4IFRoZSBpbnB1dCB0ZW5zb3IgdG8gc3BsaXQuXG4gKiBAcGFyYW0gbnVtT3JTaXplU3BsaXRzIEVpdGhlciBhbiBpbnRlZ2VyIGluZGljYXRpbmcgdGhlIG51bWJlciBvZlxuICogc3BsaXRzIGFsb25nIHRoZSBheGlzIG9yIGFuIGFycmF5IG9mIGludGVnZXJzIGNvbnRhaW5pbmcgdGhlIHNpemVzIG9mXG4gKiBlYWNoIG91dHB1dCB0ZW5zb3IgYWxvbmcgdGhlIGF4aXMuIElmIGEgbnVtYmVyIHRoZW4gaXQgbXVzdCBldmVubHkgZGl2aWRlXG4gKiBgeC5zaGFwZVtheGlzXWA7IG90aGVyd2lzZSB0aGUgc3VtIG9mIHNpemVzIG11c3QgbWF0Y2ggYHguc2hhcGVbYXhpc11gLlxuICogQ2FuIGNvbnRhaW4gb25lIC0xIGluZGljYXRpbmcgdGhhdCBkaW1lbnNpb24gaXMgdG8gYmUgaW5mZXJyZWQuXG4gKiBAcGFyYW0gYXhpcyBUaGUgZGltZW5zaW9uIGFsb25nIHdoaWNoIHRvIHNwbGl0LiBEZWZhdWx0cyB0byAwICh0aGUgZmlyc3RcbiAqIGRpbSkuXG4gKlxuICogQGRvYyB7aGVhZGluZzogJ1RlbnNvcnMnLCBzdWJoZWFkaW5nOiAnU2xpY2luZyBhbmQgSm9pbmluZyd9XG4gKi9cbmZ1bmN0aW9uIHNwbGl0XzxUIGV4dGVuZHMgVGVuc29yPihcbiAgICB4OiBUZW5zb3J8VGVuc29yTGlrZSwgbnVtT3JTaXplU3BsaXRzOiBudW1iZXJbXXxudW1iZXIsIGF4aXMgPSAwKTogVFtdIHtcbiAgY29uc3QgJHggPSBjb252ZXJ0VG9UZW5zb3IoeCwgJ3gnLCAnc3BsaXQnKTtcblxuICBjb25zdCBpbnB1dHM6IFNwbGl0VklucHV0cyA9IHt4OiAkeH07XG4gIGNvbnN0IGF0dHI6IFNwbGl0VkF0dHJzID0ge251bU9yU2l6ZVNwbGl0cywgYXhpc307XG5cbiAgcmV0dXJuIEVOR0lORS5ydW5LZXJuZWwoXG4gICAgICAgICAgICAgU3BsaXRWLCBpbnB1dHMgYXMge30gYXMgTmFtZWRUZW5zb3JNYXAsXG4gICAgICAgICAgICAgYXR0ciBhcyB7fSBhcyBOYW1lZEF0dHJNYXApIGFzIHt9IGFzIFRbXTtcbn1cblxuZXhwb3J0IGNvbnN0IHNwbGl0ID0gb3Aoe3NwbGl0X30pO1xuIl19","/**\n * @license\n * Copyright 2018 Google LLC. All Rights Reserved.\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n * =============================================================================\n */\nimport { ENGINE } from '../engine';\nimport { Sqrt } from '../kernel_names';\nimport { convertToTensor } from '../tensor_util_env';\nimport { op } from './operation';\n/**\n * Computes square root of the input `tf.Tensor` element-wise: `y = sqrt(x)`\n *\n * ```js\n * const x = tf.tensor1d([1, 2, 4, -1]);\n *\n * x.sqrt().print(); // or tf.sqrt(x)\n * ```\n * @param x The input tensor.\n *\n * @doc {heading: 'Operations', subheading: 'Basic math'}\n */\nfunction sqrt_(x) {\n const $x = convertToTensor(x, 'x', 'sqrt', 'float32');\n const inputs = { x: $x };\n return ENGINE.runKernel(Sqrt, inputs);\n}\nexport const sqrt = op({ sqrt_ });\n//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic3FydC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uLy4uL3RmanMtY29yZS9zcmMvb3BzL3NxcnQudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUE7Ozs7Ozs7Ozs7Ozs7OztHQWVHO0FBRUgsT0FBTyxFQUFDLE1BQU0sRUFBQyxNQUFNLFdBQVcsQ0FBQztBQUNqQyxPQUFPLEVBQUMsSUFBSSxFQUFhLE1BQU0saUJBQWlCLENBQUM7QUFHakQsT0FBTyxFQUFDLGVBQWUsRUFBQyxNQUFNLG9CQUFvQixDQUFDO0FBR25ELE9BQU8sRUFBQyxFQUFFLEVBQUMsTUFBTSxhQUFhLENBQUM7QUFFL0I7Ozs7Ozs7Ozs7O0dBV0c7QUFDSCxTQUFTLEtBQUssQ0FBbUIsQ0FBZTtJQUM5QyxNQUFNLEVBQUUsR0FBRyxlQUFlLENBQUMsQ0FBQyxFQUFFLEdBQUcsRUFBRSxNQUFNLEVBQUUsU0FBUyxDQUFDLENBQUM7SUFFdEQsTUFBTSxNQUFNLEdBQWUsRUFBQyxDQUFDLEVBQUUsRUFBRSxFQUFDLENBQUM7SUFFbkMsT0FBTyxNQUFNLENBQUMsU0FBUyxDQUFDLElBQUksRUFBRSxNQUE4QixDQUFDLENBQUM7QUFDaEUsQ0FBQztBQUNELE1BQU0sQ0FBQyxNQUFNLElBQUksR0FBRyxFQUFFLENBQUMsRUFBQyxLQUFLLEVBQUMsQ0FBQyxDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiLyoqXG4gKiBAbGljZW5zZVxuICogQ29weXJpZ2h0IDIwMTggR29vZ2xlIExMQy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC5cbiAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSBcIkxpY2Vuc2VcIik7XG4gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuXG4gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXRcbiAqXG4gKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjBcbiAqXG4gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlXG4gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiBcIkFTIElTXCIgQkFTSVMsXG4gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC5cbiAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmRcbiAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLlxuICogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbiAqL1xuXG5pbXBvcnQge0VOR0lORX0gZnJvbSAnLi4vZW5naW5lJztcbmltcG9ydCB7U3FydCwgU3FydElucHV0c30gZnJvbSAnLi4va2VybmVsX25hbWVzJztcbmltcG9ydCB7VGVuc29yfSBmcm9tICcuLi90ZW5zb3InO1xuaW1wb3J0IHtOYW1lZFRlbnNvck1hcH0gZnJvbSAnLi4vdGVuc29yX3R5cGVzJztcbmltcG9ydCB7Y29udmVydFRvVGVuc29yfSBmcm9tICcuLi90ZW5zb3JfdXRpbF9lbnYnO1xuaW1wb3J0IHtUZW5zb3JMaWtlfSBmcm9tICcuLi90eXBlcyc7XG5cbmltcG9ydCB7b3B9IGZyb20gJy4vb3BlcmF0aW9uJztcblxuLyoqXG4gKiBDb21wdXRlcyBzcXVhcmUgcm9vdCBvZiB0aGUgaW5wdXQgYHRmLlRlbnNvcmAgZWxlbWVudC13aXNlOiBgeSA9IHNxcnQoeClgXG4gKlxuICogYGBganNcbiAqIGNvbnN0IHggPSB0Zi50ZW5zb3IxZChbMSwgMiwgNCwgLTFdKTtcbiAqXG4gKiB4LnNxcnQoKS5wcmludCgpOyAgLy8gb3IgdGYuc3FydCh4KVxuICogYGBgXG4gKiBAcGFyYW0geCBUaGUgaW5wdXQgdGVuc29yLlxuICpcbiAqIEBkb2Mge2hlYWRpbmc6ICdPcGVyYXRpb25zJywgc3ViaGVhZGluZzogJ0Jhc2ljIG1hdGgnfVxuICovXG5mdW5jdGlvbiBzcXJ0XzxUIGV4dGVuZHMgVGVuc29yPih4OiBUfFRlbnNvckxpa2UpOiBUIHtcbiAgY29uc3QgJHggPSBjb252ZXJ0VG9UZW5zb3IoeCwgJ3gnLCAnc3FydCcsICdmbG9hdDMyJyk7XG5cbiAgY29uc3QgaW5wdXRzOiBTcXJ0SW5wdXRzID0ge3g6ICR4fTtcblxuICByZXR1cm4gRU5HSU5FLnJ1bktlcm5lbChTcXJ0LCBpbnB1dHMgYXMge30gYXMgTmFtZWRUZW5zb3JNYXApO1xufVxuZXhwb3J0IGNvbnN0IHNxcnQgPSBvcCh7c3FydF99KTtcbiJdfQ==","/**\n * @license\n * Copyright 2019 Google LLC. All Rights Reserved.\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n * =============================================================================\n */\nimport { ENGINE } from '../engine';\nimport { convertToTensor } from '../tensor_util_env';\nimport { op } from './operation';\n/**\n * Computes square of `x` element-wise: `x ^ 2`\n *\n * ```js\n * const x = tf.tensor1d([1, 2, Math.sqrt(2), -1]);\n *\n * x.square().print(); // or tf.square(x)\n * ```\n * @param x The input Tensor.\n *\n * @doc {heading: 'Operations', subheading: 'Basic math'}\n */\nfunction square_(x) {\n const $x = convertToTensor(x, 'x', 'square');\n const attrs = {};\n return ENGINE.runKernel('Square', { x: $x }, attrs);\n}\nexport const square = op({ square_ });\n//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic3F1YXJlLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vLi4vdGZqcy1jb3JlL3NyYy9vcHMvc3F1YXJlLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBOzs7Ozs7Ozs7Ozs7Ozs7R0FlRztBQUVILE9BQU8sRUFBQyxNQUFNLEVBQUMsTUFBTSxXQUFXLENBQUM7QUFFakMsT0FBTyxFQUFDLGVBQWUsRUFBQyxNQUFNLG9CQUFvQixDQUFDO0FBRW5ELE9BQU8sRUFBQyxFQUFFLEVBQUMsTUFBTSxhQUFhLENBQUM7QUFFL0I7Ozs7Ozs7Ozs7O0dBV0c7QUFDSCxTQUFTLE9BQU8sQ0FBbUIsQ0FBZTtJQUNoRCxNQUFNLEVBQUUsR0FBRyxlQUFlLENBQUMsQ0FBQyxFQUFFLEdBQUcsRUFBRSxRQUFRLENBQUMsQ0FBQztJQUM3QyxNQUFNLEtBQUssR0FBRyxFQUFFLENBQUM7SUFDakIsT0FBTyxNQUFNLENBQUMsU0FBUyxDQUFDLFFBQVEsRUFBRSxFQUFDLENBQUMsRUFBRSxFQUFFLEVBQUMsRUFBRSxLQUFLLENBQUMsQ0FBQztBQUNwRCxDQUFDO0FBRUQsTUFBTSxDQUFDLE1BQU0sTUFBTSxHQUFHLEVBQUUsQ0FBQyxFQUFDLE9BQU8sRUFBQyxDQUFDLENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyIvKipcbiAqIEBsaWNlbnNlXG4gKiBDb3B5cmlnaHQgMjAxOSBHb29nbGUgTExDLiBBbGwgUmlnaHRzIFJlc2VydmVkLlxuICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlIFwiTGljZW5zZVwiKTtcbiAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS5cbiAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdFxuICpcbiAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMFxuICpcbiAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmVcbiAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuIFwiQVMgSVNcIiBCQVNJUyxcbiAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLlxuICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZFxuICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuXG4gKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuICovXG5cbmltcG9ydCB7RU5HSU5FfSBmcm9tICcuLi9lbmdpbmUnO1xuaW1wb3J0IHtUZW5zb3J9IGZyb20gJy4uL3RlbnNvcic7XG5pbXBvcnQge2NvbnZlcnRUb1RlbnNvcn0gZnJvbSAnLi4vdGVuc29yX3V0aWxfZW52JztcbmltcG9ydCB7VGVuc29yTGlrZX0gZnJvbSAnLi4vdHlwZXMnO1xuaW1wb3J0IHtvcH0gZnJvbSAnLi9vcGVyYXRpb24nO1xuXG4vKipcbiAqIENvbXB1dGVzIHNxdWFyZSBvZiBgeGAgZWxlbWVudC13aXNlOiBgeCBeIDJgXG4gKlxuICogYGBganNcbiAqIGNvbnN0IHggPSB0Zi50ZW5zb3IxZChbMSwgMiwgTWF0aC5zcXJ0KDIpLCAtMV0pO1xuICpcbiAqIHguc3F1YXJlKCkucHJpbnQoKTsgIC8vIG9yIHRmLnNxdWFyZSh4KVxuICogYGBgXG4gKiBAcGFyYW0geCBUaGUgaW5wdXQgVGVuc29yLlxuICpcbiAqIEBkb2Mge2hlYWRpbmc6ICdPcGVyYXRpb25zJywgc3ViaGVhZGluZzogJ0Jhc2ljIG1hdGgnfVxuICovXG5mdW5jdGlvbiBzcXVhcmVfPFQgZXh0ZW5kcyBUZW5zb3I+KHg6IFR8VGVuc29yTGlrZSk6IFQge1xuICBjb25zdCAkeCA9IGNvbnZlcnRUb1RlbnNvcih4LCAneCcsICdzcXVhcmUnKTtcbiAgY29uc3QgYXR0cnMgPSB7fTtcbiAgcmV0dXJuIEVOR0lORS5ydW5LZXJuZWwoJ1NxdWFyZScsIHt4OiAkeH0sIGF0dHJzKTtcbn1cblxuZXhwb3J0IGNvbnN0IHNxdWFyZSA9IG9wKHtzcXVhcmVffSk7XG4iXX0=","/**\n * @license\n * Copyright 2020 Google LLC. All Rights Reserved.\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n * =============================================================================\n */\nimport { ENGINE } from '../engine';\nimport { SquaredDifference } from '../kernel_names';\nimport { makeTypesMatch } from '../tensor_util';\nimport { convertToTensor } from '../tensor_util_env';\nimport { assertAndGetBroadcastShape } from './broadcast_util';\nimport { op } from './operation';\n/**\n * Returns (a - b) * (a - b) element-wise.\n * Supports broadcasting.\n *\n * ```js\n * const a = tf.tensor1d([1, 4, 3, 16]);\n * const b = tf.tensor1d([1, 2, 9, 4]);\n *\n * a.squaredDifference(b).print(); // or tf.squaredDifference(a, b)\n * ```\n *\n * ```js\n * // Broadcast squared difference a with b.\n * const a = tf.tensor1d([2, 4, 6, 8]);\n * const b = tf.scalar(5);\n *\n * a.squaredDifference(b).print(); // or tf.squaredDifference(a, b)\n * ```\n *\n * @param a The first tensor.\n * @param b The second tensor. Must have the same type as `a`.\n *\n * @doc {heading: 'Operations', subheading: 'Arithmetic'}\n */\nfunction squaredDifference_(a, b) {\n let $a = convertToTensor(a, 'a', 'squaredDifference');\n let $b = convertToTensor(b, 'b', 'squaredDifference');\n [$a, $b] = makeTypesMatch($a, $b);\n assertAndGetBroadcastShape($a.shape, $b.shape);\n const inputs = { a: $a, b: $b };\n const attrs = {};\n return ENGINE.runKernel(SquaredDifference, inputs, attrs);\n}\nexport const squaredDifference = op({ squaredDifference_ });\n//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic3F1YXJlZF9kaWZmZXJlbmNlLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vLi4vdGZqcy1jb3JlL3NyYy9vcHMvc3F1YXJlZF9kaWZmZXJlbmNlLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBOzs7Ozs7Ozs7Ozs7Ozs7R0FlRztBQUVILE9BQU8sRUFBQyxNQUFNLEVBQUMsTUFBTSxXQUFXLENBQUM7QUFDakMsT0FBTyxFQUFDLGlCQUFpQixFQUEwQixNQUFNLGlCQUFpQixDQUFDO0FBRzNFLE9BQU8sRUFBQyxjQUFjLEVBQUMsTUFBTSxnQkFBZ0IsQ0FBQztBQUM5QyxPQUFPLEVBQUMsZUFBZSxFQUFDLE1BQU0sb0JBQW9CLENBQUM7QUFHbkQsT0FBTyxFQUFDLDBCQUEwQixFQUFDLE1BQU0sa0JBQWtCLENBQUM7QUFDNUQsT0FBTyxFQUFDLEVBQUUsRUFBQyxNQUFNLGFBQWEsQ0FBQztBQUUvQjs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7R0F1Qkc7QUFDSCxTQUFTLGtCQUFrQixDQUN2QixDQUFvQixFQUFFLENBQW9CO0lBQzVDLElBQUksRUFBRSxHQUFHLGVBQWUsQ0FBQyxDQUFDLEVBQUUsR0FBRyxFQUFFLG1CQUFtQixDQUFDLENBQUM7SUFDdEQsSUFBSSxFQUFFLEdBQUcsZUFBZSxDQUFDLENBQUMsRUFBRSxHQUFHLEVBQUUsbUJBQW1CLENBQUMsQ0FBQztJQUN0RCxDQUFDLEVBQUUsRUFBRSxFQUFFLENBQUMsR0FBRyxjQUFjLENBQUMsRUFBRSxFQUFFLEVBQUUsQ0FBQyxDQUFDO0lBRWxDLDBCQUEwQixDQUFDLEVBQUUsQ0FBQyxLQUFLLEVBQUUsRUFBRSxDQUFDLEtBQUssQ0FBQyxDQUFDO0lBRS9DLE1BQU0sTUFBTSxHQUE0QixFQUFDLENBQUMsRUFBRSxFQUFFLEVBQUUsQ0FBQyxFQUFFLEVBQUUsRUFBQyxDQUFDO0lBQ3ZELE1BQU0sS0FBSyxHQUFHLEVBQUUsQ0FBQztJQUVqQixPQUFPLE1BQU0sQ0FBQyxTQUFTLENBQ25CLGlCQUFpQixFQUFFLE1BQW1DLEVBQUUsS0FBSyxDQUFDLENBQUM7QUFDckUsQ0FBQztBQUVELE1BQU0sQ0FBQyxNQUFNLGlCQUFpQixHQUFHLEVBQUUsQ0FBQyxFQUFDLGtCQUFrQixFQUFDLENBQUMsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbIi8qKlxuICogQGxpY2Vuc2VcbiAqIENvcHlyaWdodCAyMDIwIEdvb2dsZSBMTEMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuXG4gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgXCJMaWNlbnNlXCIpO1xuICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLlxuICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0XG4gKlxuICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wXG4gKlxuICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZVxuICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gXCJBUyBJU1wiIEJBU0lTLFxuICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuXG4gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kXG4gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS5cbiAqID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4gKi9cblxuaW1wb3J0IHtFTkdJTkV9IGZyb20gJy4uL2VuZ2luZSc7XG5pbXBvcnQge1NxdWFyZWREaWZmZXJlbmNlLCBTcXVhcmVkRGlmZmVyZW5jZUlucHV0c30gZnJvbSAnLi4va2VybmVsX25hbWVzJztcbmltcG9ydCB7VGVuc29yfSBmcm9tICcuLi90ZW5zb3InO1xuaW1wb3J0IHtOYW1lZFRlbnNvck1hcH0gZnJvbSAnLi4vdGVuc29yX3R5cGVzJztcbmltcG9ydCB7bWFrZVR5cGVzTWF0Y2h9IGZyb20gJy4uL3RlbnNvcl91dGlsJztcbmltcG9ydCB7Y29udmVydFRvVGVuc29yfSBmcm9tICcuLi90ZW5zb3JfdXRpbF9lbnYnO1xuaW1wb3J0IHtUZW5zb3JMaWtlfSBmcm9tICcuLi90eXBlcyc7XG5cbmltcG9ydCB7YXNzZXJ0QW5kR2V0QnJvYWRjYXN0U2hhcGV9IGZyb20gJy4vYnJvYWRjYXN0X3V0aWwnO1xuaW1wb3J0IHtvcH0gZnJvbSAnLi9vcGVyYXRpb24nO1xuXG4vKipcbiAqIFJldHVybnMgKGEgLSBiKSAqIChhIC0gYikgZWxlbWVudC13aXNlLlxuICogU3VwcG9ydHMgYnJvYWRjYXN0aW5nLlxuICpcbiAqIGBgYGpzXG4gKiBjb25zdCBhID0gdGYudGVuc29yMWQoWzEsIDQsIDMsIDE2XSk7XG4gKiBjb25zdCBiID0gdGYudGVuc29yMWQoWzEsIDIsIDksIDRdKTtcbiAqXG4gKiBhLnNxdWFyZWREaWZmZXJlbmNlKGIpLnByaW50KCk7ICAvLyBvciB0Zi5zcXVhcmVkRGlmZmVyZW5jZShhLCBiKVxuICogYGBgXG4gKlxuICogYGBganNcbiAqIC8vIEJyb2FkY2FzdCBzcXVhcmVkIGRpZmZlcmVuY2UgIGEgd2l0aCBiLlxuICogY29uc3QgYSA9IHRmLnRlbnNvcjFkKFsyLCA0LCA2LCA4XSk7XG4gKiBjb25zdCBiID0gdGYuc2NhbGFyKDUpO1xuICpcbiAqIGEuc3F1YXJlZERpZmZlcmVuY2UoYikucHJpbnQoKTsgIC8vIG9yIHRmLnNxdWFyZWREaWZmZXJlbmNlKGEsIGIpXG4gKiBgYGBcbiAqXG4gKiBAcGFyYW0gYSBUaGUgZmlyc3QgdGVuc29yLlxuICogQHBhcmFtIGIgVGhlIHNlY29uZCB0ZW5zb3IuIE11c3QgaGF2ZSB0aGUgc2FtZSB0eXBlIGFzIGBhYC5cbiAqXG4gKiBAZG9jIHtoZWFkaW5nOiAnT3BlcmF0aW9ucycsIHN1YmhlYWRpbmc6ICdBcml0aG1ldGljJ31cbiAqL1xuZnVuY3Rpb24gc3F1YXJlZERpZmZlcmVuY2VfPFQgZXh0ZW5kcyBUZW5zb3I+KFxuICAgIGE6IFRlbnNvcnxUZW5zb3JMaWtlLCBiOiBUZW5zb3J8VGVuc29yTGlrZSk6IFQge1xuICBsZXQgJGEgPSBjb252ZXJ0VG9UZW5zb3IoYSwgJ2EnLCAnc3F1YXJlZERpZmZlcmVuY2UnKTtcbiAgbGV0ICRiID0gY29udmVydFRvVGVuc29yKGIsICdiJywgJ3NxdWFyZWREaWZmZXJlbmNlJyk7XG4gIFskYSwgJGJdID0gbWFrZVR5cGVzTWF0Y2goJGEsICRiKTtcblxuICBhc3NlcnRBbmRHZXRCcm9hZGNhc3RTaGFwZSgkYS5zaGFwZSwgJGIuc2hhcGUpO1xuXG4gIGNvbnN0IGlucHV0czogU3F1YXJlZERpZmZlcmVuY2VJbnB1dHMgPSB7YTogJGEsIGI6ICRifTtcbiAgY29uc3QgYXR0cnMgPSB7fTtcblxuICByZXR1cm4gRU5HSU5FLnJ1bktlcm5lbChcbiAgICAgIFNxdWFyZWREaWZmZXJlbmNlLCBpbnB1dHMgYXMgdW5rbm93biBhcyBOYW1lZFRlbnNvck1hcCwgYXR0cnMpO1xufVxuXG5leHBvcnQgY29uc3Qgc3F1YXJlZERpZmZlcmVuY2UgPSBvcCh7c3F1YXJlZERpZmZlcmVuY2VffSk7XG4iXX0=","/**\n * @license\n * Copyright 2020 Google LLC. All Rights Reserved.\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n * =============================================================================\n */\nimport { convertToTensor } from '../tensor_util_env';\nimport { squeezeShape } from '../util';\nimport { op } from './operation';\nimport { reshape } from './reshape';\n/**\n * Removes dimensions of size 1 from the shape of a `tf.Tensor`.\n *\n * ```js\n * const x = tf.tensor([1, 2, 3, 4], [1, 1, 4]);\n * x.squeeze().print();\n * ```\n *\n * @param x The input tensor to be squeezed.\n * @param axis An optional list of numbers. If specified, only\n * squeezes the dimensions listed. The dimension index starts at 0. It\n * is an error to squeeze a dimension that is not 1.\n *\n * @doc {heading: 'Tensors', subheading: 'Transformations'}\n */\nfunction squeeze_(x, axis) {\n const $x = convertToTensor(x, 'x', 'squeeze', 'string_or_numeric');\n return reshape($x, squeezeShape($x.shape, axis).newShape);\n}\nexport const squeeze = op({ squeeze_ });\n//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic3F1ZWV6ZS5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uLy4uL3RmanMtY29yZS9zcmMvb3BzL3NxdWVlemUudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUE7Ozs7Ozs7Ozs7Ozs7OztHQWVHO0FBR0gsT0FBTyxFQUFDLGVBQWUsRUFBQyxNQUFNLG9CQUFvQixDQUFDO0FBRW5ELE9BQU8sRUFBQyxZQUFZLEVBQUMsTUFBTSxTQUFTLENBQUM7QUFFckMsT0FBTyxFQUFDLEVBQUUsRUFBQyxNQUFNLGFBQWEsQ0FBQztBQUMvQixPQUFPLEVBQUMsT0FBTyxFQUFDLE1BQU0sV0FBVyxDQUFDO0FBRWxDOzs7Ozs7Ozs7Ozs7OztHQWNHO0FBQ0gsU0FBUyxRQUFRLENBQW1CLENBQW9CLEVBQUUsSUFBZTtJQUN2RSxNQUFNLEVBQUUsR0FBRyxlQUFlLENBQUMsQ0FBQyxFQUFFLEdBQUcsRUFBRSxTQUFTLEVBQUUsbUJBQW1CLENBQUMsQ0FBQztJQUNuRSxPQUFPLE9BQU8sQ0FBQyxFQUFFLEVBQUUsWUFBWSxDQUFDLEVBQUUsQ0FBQyxLQUFLLEVBQUUsSUFBSSxDQUFDLENBQUMsUUFBUSxDQUFNLENBQUM7QUFDakUsQ0FBQztBQUVELE1BQU0sQ0FBQyxNQUFNLE9BQU8sR0FBRyxFQUFFLENBQUMsRUFBQyxRQUFRLEVBQUMsQ0FBQyxDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiLyoqXG4gKiBAbGljZW5zZVxuICogQ29weXJpZ2h0IDIwMjAgR29vZ2xlIExMQy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC5cbiAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSBcIkxpY2Vuc2VcIik7XG4gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuXG4gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXRcbiAqXG4gKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjBcbiAqXG4gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlXG4gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiBcIkFTIElTXCIgQkFTSVMsXG4gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC5cbiAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmRcbiAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLlxuICogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbiAqL1xuXG5pbXBvcnQge1RlbnNvcn0gZnJvbSAnLi4vdGVuc29yJztcbmltcG9ydCB7Y29udmVydFRvVGVuc29yfSBmcm9tICcuLi90ZW5zb3JfdXRpbF9lbnYnO1xuaW1wb3J0IHtUZW5zb3JMaWtlfSBmcm9tICcuLi90eXBlcyc7XG5pbXBvcnQge3NxdWVlemVTaGFwZX0gZnJvbSAnLi4vdXRpbCc7XG5cbmltcG9ydCB7b3B9IGZyb20gJy4vb3BlcmF0aW9uJztcbmltcG9ydCB7cmVzaGFwZX0gZnJvbSAnLi9yZXNoYXBlJztcblxuLyoqXG4gKiBSZW1vdmVzIGRpbWVuc2lvbnMgb2Ygc2l6ZSAxIGZyb20gdGhlIHNoYXBlIG9mIGEgYHRmLlRlbnNvcmAuXG4gKlxuICogYGBganNcbiAqIGNvbnN0IHggPSB0Zi50ZW5zb3IoWzEsIDIsIDMsIDRdLCBbMSwgMSwgNF0pO1xuICogeC5zcXVlZXplKCkucHJpbnQoKTtcbiAqIGBgYFxuICpcbiAqIEBwYXJhbSB4IFRoZSBpbnB1dCB0ZW5zb3IgdG8gYmUgc3F1ZWV6ZWQuXG4gKiBAcGFyYW0gYXhpcyBBbiBvcHRpb25hbCBsaXN0IG9mIG51bWJlcnMuIElmIHNwZWNpZmllZCwgb25seVxuICogICAgIHNxdWVlemVzIHRoZSBkaW1lbnNpb25zIGxpc3RlZC4gVGhlIGRpbWVuc2lvbiBpbmRleCBzdGFydHMgYXQgMC4gSXRcbiAqIGlzIGFuIGVycm9yIHRvIHNxdWVlemUgYSBkaW1lbnNpb24gdGhhdCBpcyBub3QgMS5cbiAqXG4gKiBAZG9jIHtoZWFkaW5nOiAnVGVuc29ycycsIHN1YmhlYWRpbmc6ICdUcmFuc2Zvcm1hdGlvbnMnfVxuICovXG5mdW5jdGlvbiBzcXVlZXplXzxUIGV4dGVuZHMgVGVuc29yPih4OiBUZW5zb3J8VGVuc29yTGlrZSwgYXhpcz86IG51bWJlcltdKTogVCB7XG4gIGNvbnN0ICR4ID0gY29udmVydFRvVGVuc29yKHgsICd4JywgJ3NxdWVlemUnLCAnc3RyaW5nX29yX251bWVyaWMnKTtcbiAgcmV0dXJuIHJlc2hhcGUoJHgsIHNxdWVlemVTaGFwZSgkeC5zaGFwZSwgYXhpcykubmV3U2hhcGUpIGFzIFQ7XG59XG5cbmV4cG9ydCBjb25zdCBzcXVlZXplID0gb3Aoe3NxdWVlemVffSk7XG4iXX0=","/**\n * @license\n * Copyright 2020 Google LLC. All Rights Reserved.\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n * =============================================================================\n */\nimport { ENGINE } from '../engine';\nimport { Pack } from '../kernel_names';\nimport { convertToTensorArray } from '../tensor_util_env';\nimport * as util from '../util';\nimport { op } from './operation';\n/**\n * Stacks a list of rank-`R` `tf.Tensor`s into one rank-`(R+1)` `tf.Tensor`.\n *\n * ```js\n * const a = tf.tensor1d([1, 2]);\n * const b = tf.tensor1d([3, 4]);\n * const c = tf.tensor1d([5, 6]);\n * tf.stack([a, b, c]).print();\n * ```\n *\n * @param tensors A list of tensor objects with the same shape and dtype.\n * @param axis The axis to stack along. Defaults to 0 (the first dim).\n *\n * @doc {heading: 'Tensors', subheading: 'Slicing and Joining'}\n */\nfunction stack_(tensors, axis = 0) {\n const $tensors = convertToTensorArray(tensors, 'tensors', 'stack', 'string_or_numeric');\n util.assert($tensors.length >= 1, () => 'Pass at least one tensor to tf.stack');\n if ($tensors.length > 0) {\n util.assert(axis <= $tensors[0].rank, () => 'Axis must be <= rank of the tensor');\n }\n const inputs = $tensors;\n const attrs = { axis };\n return ENGINE.runKernel(Pack, inputs, attrs);\n}\nexport const stack = op({ stack_ });\n//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic3RhY2suanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi8uLi90ZmpzLWNvcmUvc3JjL29wcy9zdGFjay50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQTs7Ozs7Ozs7Ozs7Ozs7O0dBZUc7QUFFSCxPQUFPLEVBQUMsTUFBTSxFQUFDLE1BQU0sV0FBVyxDQUFDO0FBQ2pDLE9BQU8sRUFBQyxJQUFJLEVBQXdCLE1BQU0saUJBQWlCLENBQUM7QUFJNUQsT0FBTyxFQUFDLG9CQUFvQixFQUFDLE1BQU0sb0JBQW9CLENBQUM7QUFFeEQsT0FBTyxLQUFLLElBQUksTUFBTSxTQUFTLENBQUM7QUFFaEMsT0FBTyxFQUFDLEVBQUUsRUFBQyxNQUFNLGFBQWEsQ0FBQztBQUUvQjs7Ozs7Ozs7Ozs7Ozs7R0FjRztBQUNILFNBQVMsTUFBTSxDQUNYLE9BQTRCLEVBQUUsSUFBSSxHQUFHLENBQUM7SUFDeEMsTUFBTSxRQUFRLEdBQ1Ysb0JBQW9CLENBQUMsT0FBTyxFQUFFLFNBQVMsRUFBRSxPQUFPLEVBQUUsbUJBQW1CLENBQUMsQ0FBQztJQUUzRSxJQUFJLENBQUMsTUFBTSxDQUNQLFFBQVEsQ0FBQyxNQUFNLElBQUksQ0FBQyxFQUFFLEdBQUcsRUFBRSxDQUFDLHNDQUFzQyxDQUFDLENBQUM7SUFFeEUsSUFBSSxRQUFRLENBQUMsTUFBTSxHQUFHLENBQUMsRUFBRTtRQUN2QixJQUFJLENBQUMsTUFBTSxDQUNQLElBQUksSUFBSSxRQUFRLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxFQUFFLEdBQUcsRUFBRSxDQUFDLG9DQUFvQyxDQUFDLENBQUM7S0FDM0U7SUFFRCxNQUFNLE1BQU0sR0FBZSxRQUFRLENBQUM7SUFDcEMsTUFBTSxLQUFLLEdBQWMsRUFBQyxJQUFJLEVBQUMsQ0FBQztJQUVoQyxPQUFPLE1BQU0sQ0FBQyxTQUFTLENBQ25CLElBQUksRUFBRSxNQUE4QixFQUFFLEtBQTJCLENBQUMsQ0FBQztBQUN6RSxDQUFDO0FBRUQsTUFBTSxDQUFDLE1BQU0sS0FBSyxHQUFHLEVBQUUsQ0FBQyxFQUFDLE1BQU0sRUFBQyxDQUFDLENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyIvKipcbiAqIEBsaWNlbnNlXG4gKiBDb3B5cmlnaHQgMjAyMCBHb29nbGUgTExDLiBBbGwgUmlnaHRzIFJlc2VydmVkLlxuICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlIFwiTGljZW5zZVwiKTtcbiAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS5cbiAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdFxuICpcbiAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMFxuICpcbiAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmVcbiAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuIFwiQVMgSVNcIiBCQVNJUyxcbiAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLlxuICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZFxuICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuXG4gKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuICovXG5cbmltcG9ydCB7RU5HSU5FfSBmcm9tICcuLi9lbmdpbmUnO1xuaW1wb3J0IHtQYWNrLCBQYWNrQXR0cnMsIFBhY2tJbnB1dHN9IGZyb20gJy4uL2tlcm5lbF9uYW1lcyc7XG5pbXBvcnQge05hbWVkQXR0ck1hcH0gZnJvbSAnLi4va2VybmVsX3JlZ2lzdHJ5JztcbmltcG9ydCB7VGVuc29yfSBmcm9tICcuLi90ZW5zb3InO1xuaW1wb3J0IHtOYW1lZFRlbnNvck1hcH0gZnJvbSAnLi4vdGVuc29yX3R5cGVzJztcbmltcG9ydCB7Y29udmVydFRvVGVuc29yQXJyYXl9IGZyb20gJy4uL3RlbnNvcl91dGlsX2Vudic7XG5pbXBvcnQge1RlbnNvckxpa2V9IGZyb20gJy4uL3R5cGVzJztcbmltcG9ydCAqIGFzIHV0aWwgZnJvbSAnLi4vdXRpbCc7XG5cbmltcG9ydCB7b3B9IGZyb20gJy4vb3BlcmF0aW9uJztcblxuLyoqXG4gKiBTdGFja3MgYSBsaXN0IG9mIHJhbmstYFJgIGB0Zi5UZW5zb3JgcyBpbnRvIG9uZSByYW5rLWAoUisxKWAgYHRmLlRlbnNvcmAuXG4gKlxuICogYGBganNcbiAqIGNvbnN0IGEgPSB0Zi50ZW5zb3IxZChbMSwgMl0pO1xuICogY29uc3QgYiA9IHRmLnRlbnNvcjFkKFszLCA0XSk7XG4gKiBjb25zdCBjID0gdGYudGVuc29yMWQoWzUsIDZdKTtcbiAqIHRmLnN0YWNrKFthLCBiLCBjXSkucHJpbnQoKTtcbiAqIGBgYFxuICpcbiAqIEBwYXJhbSB0ZW5zb3JzIEEgbGlzdCBvZiB0ZW5zb3Igb2JqZWN0cyB3aXRoIHRoZSBzYW1lIHNoYXBlIGFuZCBkdHlwZS5cbiAqIEBwYXJhbSBheGlzIFRoZSBheGlzIHRvIHN0YWNrIGFsb25nLiBEZWZhdWx0cyB0byAwICh0aGUgZmlyc3QgZGltKS5cbiAqXG4gKiBAZG9jIHtoZWFkaW5nOiAnVGVuc29ycycsIHN1YmhlYWRpbmc6ICdTbGljaW5nIGFuZCBKb2luaW5nJ31cbiAqL1xuZnVuY3Rpb24gc3RhY2tfPFQgZXh0ZW5kcyBUZW5zb3I+KFxuICAgIHRlbnNvcnM6IEFycmF5PFR8VGVuc29yTGlrZT4sIGF4aXMgPSAwKTogVGVuc29yIHtcbiAgY29uc3QgJHRlbnNvcnMgPVxuICAgICAgY29udmVydFRvVGVuc29yQXJyYXkodGVuc29ycywgJ3RlbnNvcnMnLCAnc3RhY2snLCAnc3RyaW5nX29yX251bWVyaWMnKTtcblxuICB1dGlsLmFzc2VydChcbiAgICAgICR0ZW5zb3JzLmxlbmd0aCA+PSAxLCAoKSA9PiAnUGFzcyBhdCBsZWFzdCBvbmUgdGVuc29yIHRvIHRmLnN0YWNrJyk7XG5cbiAgaWYgKCR0ZW5zb3JzLmxlbmd0aCA+IDApIHtcbiAgICB1dGlsLmFzc2VydChcbiAgICAgICAgYXhpcyA8PSAkdGVuc29yc1swXS5yYW5rLCAoKSA9PiAnQXhpcyBtdXN0IGJlIDw9IHJhbmsgb2YgdGhlIHRlbnNvcicpO1xuICB9XG5cbiAgY29uc3QgaW5wdXRzOiBQYWNrSW5wdXRzID0gJHRlbnNvcnM7XG4gIGNvbnN0IGF0dHJzOiBQYWNrQXR0cnMgPSB7YXhpc307XG5cbiAgcmV0dXJuIEVOR0lORS5ydW5LZXJuZWwoXG4gICAgICBQYWNrLCBpbnB1dHMgYXMge30gYXMgTmFtZWRUZW5zb3JNYXAsIGF0dHJzIGFzIHt9IGFzIE5hbWVkQXR0ck1hcCk7XG59XG5cbmV4cG9ydCBjb25zdCBzdGFjayA9IG9wKHtzdGFja199KTtcbiJdfQ==","/**\n * @license\n * Copyright 2018 Google LLC. All Rights Reserved.\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n * =============================================================================\n */\nimport { ENGINE } from '../engine';\nimport { Step } from '../kernel_names';\nimport { convertToTensor } from '../tensor_util_env';\nimport { op } from './operation';\n/**\n * Computes step of the input `tf.Tensor` element-wise: `x > 0 ? 1 : alpha * x`\n *\n * ```js\n * const x = tf.tensor1d([0, 2, -1, -3]);\n *\n * x.step(.5).print(); // or tf.step(x, .5)\n * ```\n * @param x The input tensor.\n * @param alpha The gradient when input is negative.\n *\n * @doc {heading: 'Operations', subheading: 'Basic math'}\n */\nfunction step_(x, alpha = 0.0) {\n const $x = convertToTensor(x, 'x', 'step');\n const inputs = { x: $x };\n const attrs = { alpha };\n return ENGINE.runKernel(Step, inputs, attrs);\n}\nexport const step = op({ step_ });\n//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic3RlcC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uLy4uL3RmanMtY29yZS9zcmMvb3BzL3N0ZXAudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUE7Ozs7Ozs7Ozs7Ozs7OztHQWVHO0FBRUgsT0FBTyxFQUFDLE1BQU0sRUFBQyxNQUFNLFdBQVcsQ0FBQztBQUNqQyxPQUFPLEVBQUMsSUFBSSxFQUF3QixNQUFNLGlCQUFpQixDQUFDO0FBSTVELE9BQU8sRUFBQyxlQUFlLEVBQUMsTUFBTSxvQkFBb0IsQ0FBQztBQUduRCxPQUFPLEVBQUMsRUFBRSxFQUFDLE1BQU0sYUFBYSxDQUFDO0FBRS9COzs7Ozs7Ozs7Ozs7R0FZRztBQUNILFNBQVMsS0FBSyxDQUFtQixDQUFlLEVBQUUsS0FBSyxHQUFHLEdBQUc7SUFDM0QsTUFBTSxFQUFFLEdBQUcsZUFBZSxDQUFDLENBQUMsRUFBRSxHQUFHLEVBQUUsTUFBTSxDQUFDLENBQUM7SUFFM0MsTUFBTSxNQUFNLEdBQWUsRUFBQyxDQUFDLEVBQUUsRUFBRSxFQUFDLENBQUM7SUFDbkMsTUFBTSxLQUFLLEdBQWMsRUFBQyxLQUFLLEVBQUMsQ0FBQztJQUVqQyxPQUFPLE1BQU0sQ0FBQyxTQUFTLENBQ25CLElBQUksRUFBRSxNQUE4QixFQUFFLEtBQTJCLENBQUMsQ0FBQztBQUN6RSxDQUFDO0FBQ0QsTUFBTSxDQUFDLE1BQU0sSUFBSSxHQUFHLEVBQUUsQ0FBQyxFQUFDLEtBQUssRUFBQyxDQUFDLENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyIvKipcbiAqIEBsaWNlbnNlXG4gKiBDb3B5cmlnaHQgMjAxOCBHb29nbGUgTExDLiBBbGwgUmlnaHRzIFJlc2VydmVkLlxuICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlIFwiTGljZW5zZVwiKTtcbiAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS5cbiAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdFxuICpcbiAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMFxuICpcbiAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmVcbiAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuIFwiQVMgSVNcIiBCQVNJUyxcbiAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLlxuICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZFxuICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuXG4gKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuICovXG5cbmltcG9ydCB7RU5HSU5FfSBmcm9tICcuLi9lbmdpbmUnO1xuaW1wb3J0IHtTdGVwLCBTdGVwQXR0cnMsIFN0ZXBJbnB1dHN9IGZyb20gJy4uL2tlcm5lbF9uYW1lcyc7XG5pbXBvcnQge05hbWVkQXR0ck1hcH0gZnJvbSAnLi4va2VybmVsX3JlZ2lzdHJ5JztcbmltcG9ydCB7VGVuc29yfSBmcm9tICcuLi90ZW5zb3InO1xuaW1wb3J0IHtOYW1lZFRlbnNvck1hcH0gZnJvbSAnLi4vdGVuc29yX3R5cGVzJztcbmltcG9ydCB7Y29udmVydFRvVGVuc29yfSBmcm9tICcuLi90ZW5zb3JfdXRpbF9lbnYnO1xuaW1wb3J0IHtUZW5zb3JMaWtlfSBmcm9tICcuLi90eXBlcyc7XG5cbmltcG9ydCB7b3B9IGZyb20gJy4vb3BlcmF0aW9uJztcblxuLyoqXG4gKiBDb21wdXRlcyBzdGVwIG9mIHRoZSBpbnB1dCBgdGYuVGVuc29yYCBlbGVtZW50LXdpc2U6IGB4ID4gMCA/IDEgOiBhbHBoYSAqIHhgXG4gKlxuICogYGBganNcbiAqIGNvbnN0IHggPSB0Zi50ZW5zb3IxZChbMCwgMiwgLTEsIC0zXSk7XG4gKlxuICogeC5zdGVwKC41KS5wcmludCgpOyAgLy8gb3IgdGYuc3RlcCh4LCAuNSlcbiAqIGBgYFxuICogQHBhcmFtIHggVGhlIGlucHV0IHRlbnNvci5cbiAqIEBwYXJhbSBhbHBoYSBUaGUgZ3JhZGllbnQgd2hlbiBpbnB1dCBpcyBuZWdhdGl2ZS5cbiAqXG4gKiBAZG9jIHtoZWFkaW5nOiAnT3BlcmF0aW9ucycsIHN1YmhlYWRpbmc6ICdCYXNpYyBtYXRoJ31cbiAqL1xuZnVuY3Rpb24gc3RlcF88VCBleHRlbmRzIFRlbnNvcj4oeDogVHxUZW5zb3JMaWtlLCBhbHBoYSA9IDAuMCk6IFQge1xuICBjb25zdCAkeCA9IGNvbnZlcnRUb1RlbnNvcih4LCAneCcsICdzdGVwJyk7XG5cbiAgY29uc3QgaW5wdXRzOiBTdGVwSW5wdXRzID0ge3g6ICR4fTtcbiAgY29uc3QgYXR0cnM6IFN0ZXBBdHRycyA9IHthbHBoYX07XG5cbiAgcmV0dXJuIEVOR0lORS5ydW5LZXJuZWwoXG4gICAgICBTdGVwLCBpbnB1dHMgYXMge30gYXMgTmFtZWRUZW5zb3JNYXAsIGF0dHJzIGFzIHt9IGFzIE5hbWVkQXR0ck1hcCk7XG59XG5leHBvcnQgY29uc3Qgc3RlcCA9IG9wKHtzdGVwX30pO1xuIl19","/**\n * @license\n * Copyright 2018 Google LLC. All Rights Reserved.\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n * =============================================================================\n */\nimport { ENGINE } from '../engine';\nimport { StridedSlice } from '../kernel_names';\nimport { convertToTensor } from '../tensor_util_env';\nimport { op } from './operation';\n/**\n * Extracts a strided slice of a tensor.\n *\n * Roughly speaking, this op extracts a slice of size (end-begin)/stride from\n * the given input tensor (x). Starting at the location specified by begin the\n * slice continues by adding stride to the index until all dimensions are not\n * less than end. Note that a stride can be negative, which causes a reverse\n * slice.\n *\n * ```js\n * const t = tf.tensor3d([1, 1, 1 ,2, 2, 2, 3, 3, 3, 4, 4, 4, 5, 5, 5, 6, 6, 6],\n * [3, 2, 3]);\n * t.stridedSlice([1, 0, 0], [2, 1, 3], [1, 1, 1]).print() // [[[3, 3, 3]]]\n * t.stridedSlice([1, 0, 0], [2, 2, 3], [1, 1, 1]).print() // [[[3, 3, 3],\n * // [4, 4, 4]]]\n * t.stridedSlice([1, -1, 0], [2, -3, 3], [1, -1, 1]).print() // [[[4, 4, 4],\n * // [3, 3, 3]]]\n * ```\n *\n * @param x The tensor to stride slice.\n * @param begin The coordinates to start the slice from.\n * @param end: The coordinates to end the slice at.\n * @param strides: The size of the slice.\n * @param beginMask: If the ith bit of beginMask is set, begin[i] is ignored\n * and the fullest possible range in that dimension is used instead.\n * @param endMask: If the ith bit of endMask is set, end[i] is ignored\n * and the fullest possible range in that dimension is used instead.\n * @param shrinkAxisMask: a bitmask where bit i implies that\n * the ith specification should shrink the dimensionality. begin and end must\n * imply a slice of size 1 in the dimension.\n *\n * @doc {heading: 'Operations', subheading: 'Slicing and Joining'}\n */\nfunction stridedSlice_(x, begin, end, strides, beginMask = 0, endMask = 0, ellipsisMask = 0, newAxisMask = 0, shrinkAxisMask = 0) {\n const $x = convertToTensor(x, 'x', 'stridedSlice', 'string_or_numeric');\n const inputs = { x: $x };\n const attrs = {\n begin,\n end,\n strides,\n beginMask,\n endMask,\n ellipsisMask,\n newAxisMask,\n shrinkAxisMask\n };\n return ENGINE.runKernel(StridedSlice, inputs, attrs);\n}\nexport const stridedSlice = op({ stridedSlice_ });\n//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic3RyaWRlZF9zbGljZS5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uLy4uL3RmanMtY29yZS9zcmMvb3BzL3N0cmlkZWRfc2xpY2UudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUE7Ozs7Ozs7Ozs7Ozs7OztHQWVHO0FBRUgsT0FBTyxFQUFDLE1BQU0sRUFBQyxNQUFNLFdBQVcsQ0FBQztBQUNqQyxPQUFPLEVBQUMsWUFBWSxFQUF3QyxNQUFNLGlCQUFpQixDQUFDO0FBSXBGLE9BQU8sRUFBQyxlQUFlLEVBQUMsTUFBTSxvQkFBb0IsQ0FBQztBQUduRCxPQUFPLEVBQUMsRUFBRSxFQUFDLE1BQU0sYUFBYSxDQUFDO0FBRS9COzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7OztHQWdDRztBQUNILFNBQVMsYUFBYSxDQUNsQixDQUFvQixFQUFFLEtBQWUsRUFBRSxHQUFhLEVBQUUsT0FBa0IsRUFDeEUsU0FBUyxHQUFHLENBQUMsRUFBRSxPQUFPLEdBQUcsQ0FBQyxFQUFFLFlBQVksR0FBRyxDQUFDLEVBQUUsV0FBVyxHQUFHLENBQUMsRUFDN0QsY0FBYyxHQUFHLENBQUM7SUFDcEIsTUFBTSxFQUFFLEdBQUcsZUFBZSxDQUFDLENBQUMsRUFBRSxHQUFHLEVBQUUsY0FBYyxFQUFFLG1CQUFtQixDQUFDLENBQUM7SUFFeEUsTUFBTSxNQUFNLEdBQXVCLEVBQUMsQ0FBQyxFQUFFLEVBQUUsRUFBQyxDQUFDO0lBQzNDLE1BQU0sS0FBSyxHQUFzQjtRQUMvQixLQUFLO1FBQ0wsR0FBRztRQUNILE9BQU87UUFDUCxTQUFTO1FBQ1QsT0FBTztRQUNQLFlBQVk7UUFDWixXQUFXO1FBQ1gsY0FBYztLQUNmLENBQUM7SUFFRixPQUFPLE1BQU0sQ0FBQyxTQUFTLENBQ25CLFlBQVksRUFBRSxNQUE4QixFQUM1QyxLQUEyQixDQUFDLENBQUM7QUFDbkMsQ0FBQztBQUVELE1BQU0sQ0FBQyxNQUFNLFlBQVksR0FBRyxFQUFFLENBQUMsRUFBQyxhQUFhLEVBQUMsQ0FBQyxDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiLyoqXG4gKiBAbGljZW5zZVxuICogQ29weXJpZ2h0IDIwMTggR29vZ2xlIExMQy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC5cbiAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSBcIkxpY2Vuc2VcIik7XG4gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuXG4gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXRcbiAqXG4gKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjBcbiAqXG4gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlXG4gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiBcIkFTIElTXCIgQkFTSVMsXG4gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC5cbiAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmRcbiAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLlxuICogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbiAqL1xuXG5pbXBvcnQge0VOR0lORX0gZnJvbSAnLi4vZW5naW5lJztcbmltcG9ydCB7U3RyaWRlZFNsaWNlLCBTdHJpZGVkU2xpY2VBdHRycywgU3RyaWRlZFNsaWNlSW5wdXRzfSBmcm9tICcuLi9rZXJuZWxfbmFtZXMnO1xuaW1wb3J0IHtOYW1lZEF0dHJNYXB9IGZyb20gJy4uL2tlcm5lbF9yZWdpc3RyeSc7XG5pbXBvcnQge1RlbnNvcn0gZnJvbSAnLi4vdGVuc29yJztcbmltcG9ydCB7TmFtZWRUZW5zb3JNYXB9IGZyb20gJy4uL3RlbnNvcl90eXBlcyc7XG5pbXBvcnQge2NvbnZlcnRUb1RlbnNvcn0gZnJvbSAnLi4vdGVuc29yX3V0aWxfZW52JztcbmltcG9ydCB7VGVuc29yTGlrZX0gZnJvbSAnLi4vdHlwZXMnO1xuXG5pbXBvcnQge29wfSBmcm9tICcuL29wZXJhdGlvbic7XG5cbi8qKlxuICogRXh0cmFjdHMgYSBzdHJpZGVkIHNsaWNlIG9mIGEgdGVuc29yLlxuICpcbiAqIFJvdWdobHkgc3BlYWtpbmcsIHRoaXMgb3AgZXh0cmFjdHMgYSBzbGljZSBvZiBzaXplIChlbmQtYmVnaW4pL3N0cmlkZSBmcm9tXG4gKiB0aGUgZ2l2ZW4gaW5wdXQgdGVuc29yICh4KS4gU3RhcnRpbmcgYXQgdGhlIGxvY2F0aW9uIHNwZWNpZmllZCBieSBiZWdpbiB0aGVcbiAqIHNsaWNlIGNvbnRpbnVlcyBieSBhZGRpbmcgc3RyaWRlIHRvIHRoZSBpbmRleCB1bnRpbCBhbGwgZGltZW5zaW9ucyBhcmUgbm90XG4gKiBsZXNzIHRoYW4gZW5kLiBOb3RlIHRoYXQgYSBzdHJpZGUgY2FuIGJlIG5lZ2F0aXZlLCB3aGljaCBjYXVzZXMgYSByZXZlcnNlXG4gKiBzbGljZS5cbiAqXG4gKiBgYGBqc1xuICogY29uc3QgdCA9IHRmLnRlbnNvcjNkKFsxLCAxLCAxICwyLCAyLCAyLCAzLCAzLCAzLCA0LCA0LCA0LCA1LCA1LCA1LCA2LCA2LCA2XSxcbiAqICAgIFszLCAyLCAzXSk7XG4gKiB0LnN0cmlkZWRTbGljZShbMSwgMCwgMF0sIFsyLCAxLCAzXSwgWzEsIDEsIDFdKS5wcmludCgpICAvLyBbW1szLCAzLCAzXV1dXG4gKiB0LnN0cmlkZWRTbGljZShbMSwgMCwgMF0sIFsyLCAyLCAzXSwgWzEsIDEsIDFdKS5wcmludCgpICAvLyBbW1szLCAzLCAzXSxcbiAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBbNCwgNCwgNF1dXVxuICogdC5zdHJpZGVkU2xpY2UoWzEsIC0xLCAwXSwgWzIsIC0zLCAzXSwgWzEsIC0xLCAxXSkucHJpbnQoKSAvLyBbW1s0LCA0LCA0XSxcbiAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBbMywgMywgM11dXVxuICogYGBgXG4gKlxuICogQHBhcmFtIHggVGhlIHRlbnNvciB0byBzdHJpZGUgc2xpY2UuXG4gKiBAcGFyYW0gYmVnaW4gVGhlIGNvb3JkaW5hdGVzIHRvIHN0YXJ0IHRoZSBzbGljZSBmcm9tLlxuICogQHBhcmFtIGVuZDogVGhlIGNvb3JkaW5hdGVzIHRvIGVuZCB0aGUgc2xpY2UgYXQuXG4gKiBAcGFyYW0gc3RyaWRlczogVGhlIHNpemUgb2YgdGhlIHNsaWNlLlxuICogQHBhcmFtIGJlZ2luTWFzazogSWYgdGhlIGl0aCBiaXQgb2YgYmVnaW5NYXNrIGlzIHNldCwgYmVnaW5baV0gaXMgaWdub3JlZFxuICogICAgICBhbmQgdGhlIGZ1bGxlc3QgcG9zc2libGUgcmFuZ2UgaW4gdGhhdCBkaW1lbnNpb24gaXMgdXNlZCBpbnN0ZWFkLlxuICogQHBhcmFtIGVuZE1hc2s6IElmIHRoZSBpdGggYml0IG9mIGVuZE1hc2sgaXMgc2V0LCBlbmRbaV0gaXMgaWdub3JlZFxuICogICAgICBhbmQgdGhlIGZ1bGxlc3QgcG9zc2libGUgcmFuZ2UgaW4gdGhhdCBkaW1lbnNpb24gaXMgdXNlZCBpbnN0ZWFkLlxuICogQHBhcmFtIHNocmlua0F4aXNNYXNrOiBhIGJpdG1hc2sgd2hlcmUgYml0IGkgaW1wbGllcyB0aGF0XG4gKiB0aGUgaXRoIHNwZWNpZmljYXRpb24gc2hvdWxkIHNocmluayB0aGUgZGltZW5zaW9uYWxpdHkuIGJlZ2luIGFuZCBlbmQgbXVzdFxuICogaW1wbHkgYSBzbGljZSBvZiBzaXplIDEgaW4gdGhlIGRpbWVuc2lvbi5cbiAqXG4gKiBAZG9jIHtoZWFkaW5nOiAnT3BlcmF0aW9ucycsIHN1YmhlYWRpbmc6ICdTbGljaW5nIGFuZCBKb2luaW5nJ31cbiAqL1xuZnVuY3Rpb24gc3RyaWRlZFNsaWNlXyhcbiAgICB4OiBUZW5zb3J8VGVuc29yTGlrZSwgYmVnaW46IG51bWJlcltdLCBlbmQ6IG51bWJlcltdLCBzdHJpZGVzPzogbnVtYmVyW10sXG4gICAgYmVnaW5NYXNrID0gMCwgZW5kTWFzayA9IDAsIGVsbGlwc2lzTWFzayA9IDAsIG5ld0F4aXNNYXNrID0gMCxcbiAgICBzaHJpbmtBeGlzTWFzayA9IDApOiBUZW5zb3Ige1xuICBjb25zdCAkeCA9IGNvbnZlcnRUb1RlbnNvcih4LCAneCcsICdzdHJpZGVkU2xpY2UnLCAnc3RyaW5nX29yX251bWVyaWMnKTtcblxuICBjb25zdCBpbnB1dHM6IFN0cmlkZWRTbGljZUlucHV0cyA9IHt4OiAkeH07XG4gIGNvbnN0IGF0dHJzOiBTdHJpZGVkU2xpY2VBdHRycyA9IHtcbiAgICBiZWdpbixcbiAgICBlbmQsXG4gICAgc3RyaWRlcyxcbiAgICBiZWdpbk1hc2ssXG4gICAgZW5kTWFzayxcbiAgICBlbGxpcHNpc01hc2ssXG4gICAgbmV3QXhpc01hc2ssXG4gICAgc2hyaW5rQXhpc01hc2tcbiAgfTtcblxuICByZXR1cm4gRU5HSU5FLnJ1bktlcm5lbChcbiAgICAgIFN0cmlkZWRTbGljZSwgaW5wdXRzIGFzIHt9IGFzIE5hbWVkVGVuc29yTWFwLFxuICAgICAgYXR0cnMgYXMge30gYXMgTmFtZWRBdHRyTWFwKTtcbn1cblxuZXhwb3J0IGNvbnN0IHN0cmlkZWRTbGljZSA9IG9wKHtzdHJpZGVkU2xpY2VffSk7XG4iXX0=","/**\n * @license\n * Copyright 2020 Google LLC. All Rights Reserved.\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n * =============================================================================\n */\nimport { ENGINE } from '../engine';\nimport { Sub } from '../kernel_names';\nimport { makeTypesMatch } from '../tensor_util';\nimport { convertToTensor } from '../tensor_util_env';\nimport { op } from './operation';\n/**\n * Subtracts two `tf.Tensor`s element-wise, A - B. Supports broadcasting.\n *\n * ```js\n * const a = tf.tensor1d([10, 20, 30, 40]);\n * const b = tf.tensor1d([1, 2, 3, 4]);\n *\n * a.sub(b).print(); // or tf.sub(a, b)\n * ```\n *\n * ```js\n * // Broadcast subtract a with b.\n * const a = tf.tensor1d([10, 20, 30, 40]);\n * const b = tf.scalar(5);\n *\n * a.sub(b).print(); // or tf.sub(a, b)\n * ```\n * @param a The first `tf.Tensor` to subtract from.\n * @param b The second `tf.Tensor` to be subtracted. Must have the same dtype as\n * `a`.\n *\n * @doc {heading: 'Operations', subheading: 'Arithmetic'}\n */\nfunction sub_(a, b) {\n let $a = convertToTensor(a, 'a', 'sub');\n let $b = convertToTensor(b, 'b', 'sub');\n [$a, $b] = makeTypesMatch($a, $b);\n const inputs = { a: $a, b: $b };\n return ENGINE.runKernel(Sub, inputs);\n}\nexport const sub = op({ sub_ });\n//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic3ViLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vLi4vdGZqcy1jb3JlL3NyYy9vcHMvc3ViLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBOzs7Ozs7Ozs7Ozs7Ozs7R0FlRztBQUNILE9BQU8sRUFBQyxNQUFNLEVBQUMsTUFBTSxXQUFXLENBQUM7QUFDakMsT0FBTyxFQUFDLEdBQUcsRUFBWSxNQUFNLGlCQUFpQixDQUFDO0FBRy9DLE9BQU8sRUFBQyxjQUFjLEVBQUMsTUFBTSxnQkFBZ0IsQ0FBQztBQUM5QyxPQUFPLEVBQUMsZUFBZSxFQUFDLE1BQU0sb0JBQW9CLENBQUM7QUFHbkQsT0FBTyxFQUFDLEVBQUUsRUFBQyxNQUFNLGFBQWEsQ0FBQztBQUUvQjs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7OztHQXNCRztBQUNILFNBQVMsSUFBSSxDQUFtQixDQUFvQixFQUFFLENBQW9CO0lBQ3hFLElBQUksRUFBRSxHQUFHLGVBQWUsQ0FBQyxDQUFDLEVBQUUsR0FBRyxFQUFFLEtBQUssQ0FBQyxDQUFDO0lBQ3hDLElBQUksRUFBRSxHQUFHLGVBQWUsQ0FBQyxDQUFDLEVBQUUsR0FBRyxFQUFFLEtBQUssQ0FBQyxDQUFDO0lBQ3hDLENBQUMsRUFBRSxFQUFFLEVBQUUsQ0FBQyxHQUFHLGNBQWMsQ0FBQyxFQUFFLEVBQUUsRUFBRSxDQUFDLENBQUM7SUFFbEMsTUFBTSxNQUFNLEdBQWMsRUFBQyxDQUFDLEVBQUUsRUFBRSxFQUFFLENBQUMsRUFBRSxFQUFFLEVBQUMsQ0FBQztJQUV6QyxPQUFPLE1BQU0sQ0FBQyxTQUFTLENBQUMsR0FBRyxFQUFFLE1BQThCLENBQUMsQ0FBQztBQUMvRCxDQUFDO0FBRUQsTUFBTSxDQUFDLE1BQU0sR0FBRyxHQUFHLEVBQUUsQ0FBQyxFQUFDLElBQUksRUFBQyxDQUFDLENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyIvKipcbiAqIEBsaWNlbnNlXG4gKiBDb3B5cmlnaHQgMjAyMCBHb29nbGUgTExDLiBBbGwgUmlnaHRzIFJlc2VydmVkLlxuICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlIFwiTGljZW5zZVwiKTtcbiAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS5cbiAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdFxuICpcbiAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMFxuICpcbiAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmVcbiAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuIFwiQVMgSVNcIiBCQVNJUyxcbiAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLlxuICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZFxuICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuXG4gKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuICovXG5pbXBvcnQge0VOR0lORX0gZnJvbSAnLi4vZW5naW5lJztcbmltcG9ydCB7U3ViLCBTdWJJbnB1dHN9IGZyb20gJy4uL2tlcm5lbF9uYW1lcyc7XG5pbXBvcnQge1RlbnNvcn0gZnJvbSAnLi4vdGVuc29yJztcbmltcG9ydCB7TmFtZWRUZW5zb3JNYXB9IGZyb20gJy4uL3RlbnNvcl90eXBlcyc7XG5pbXBvcnQge21ha2VUeXBlc01hdGNofSBmcm9tICcuLi90ZW5zb3JfdXRpbCc7XG5pbXBvcnQge2NvbnZlcnRUb1RlbnNvcn0gZnJvbSAnLi4vdGVuc29yX3V0aWxfZW52JztcbmltcG9ydCB7VGVuc29yTGlrZX0gZnJvbSAnLi4vdHlwZXMnO1xuXG5pbXBvcnQge29wfSBmcm9tICcuL29wZXJhdGlvbic7XG5cbi8qKlxuICogU3VidHJhY3RzIHR3byBgdGYuVGVuc29yYHMgZWxlbWVudC13aXNlLCBBIC0gQi4gU3VwcG9ydHMgYnJvYWRjYXN0aW5nLlxuICpcbiAqIGBgYGpzXG4gKiBjb25zdCBhID0gdGYudGVuc29yMWQoWzEwLCAyMCwgMzAsIDQwXSk7XG4gKiBjb25zdCBiID0gdGYudGVuc29yMWQoWzEsIDIsIDMsIDRdKTtcbiAqXG4gKiBhLnN1YihiKS5wcmludCgpOyAgLy8gb3IgdGYuc3ViKGEsIGIpXG4gKiBgYGBcbiAqXG4gKiBgYGBqc1xuICogLy8gQnJvYWRjYXN0IHN1YnRyYWN0IGEgd2l0aCBiLlxuICogY29uc3QgYSA9IHRmLnRlbnNvcjFkKFsxMCwgMjAsIDMwLCA0MF0pO1xuICogY29uc3QgYiA9IHRmLnNjYWxhcig1KTtcbiAqXG4gKiBhLnN1YihiKS5wcmludCgpOyAgLy8gb3IgdGYuc3ViKGEsIGIpXG4gKiBgYGBcbiAqIEBwYXJhbSBhIFRoZSBmaXJzdCBgdGYuVGVuc29yYCB0byBzdWJ0cmFjdCBmcm9tLlxuICogQHBhcmFtIGIgVGhlIHNlY29uZCBgdGYuVGVuc29yYCB0byBiZSBzdWJ0cmFjdGVkLiBNdXN0IGhhdmUgdGhlIHNhbWUgZHR5cGUgYXNcbiAqIGBhYC5cbiAqXG4gKiBAZG9jIHtoZWFkaW5nOiAnT3BlcmF0aW9ucycsIHN1YmhlYWRpbmc6ICdBcml0aG1ldGljJ31cbiAqL1xuZnVuY3Rpb24gc3ViXzxUIGV4dGVuZHMgVGVuc29yPihhOiBUZW5zb3J8VGVuc29yTGlrZSwgYjogVGVuc29yfFRlbnNvckxpa2UpOiBUIHtcbiAgbGV0ICRhID0gY29udmVydFRvVGVuc29yKGEsICdhJywgJ3N1YicpO1xuICBsZXQgJGIgPSBjb252ZXJ0VG9UZW5zb3IoYiwgJ2InLCAnc3ViJyk7XG4gIFskYSwgJGJdID0gbWFrZVR5cGVzTWF0Y2goJGEsICRiKTtcblxuICBjb25zdCBpbnB1dHM6IFN1YklucHV0cyA9IHthOiAkYSwgYjogJGJ9O1xuXG4gIHJldHVybiBFTkdJTkUucnVuS2VybmVsKFN1YiwgaW5wdXRzIGFzIHt9IGFzIE5hbWVkVGVuc29yTWFwKTtcbn1cblxuZXhwb3J0IGNvbnN0IHN1YiA9IG9wKHtzdWJffSk7XG4iXX0=","/**\n * @license\n * Copyright 2018 Google LLC. All Rights Reserved.\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n * =============================================================================\n */\nimport { ENGINE } from '../engine';\nimport { Sum } from '../kernel_names';\nimport { convertToTensor } from '../tensor_util_env';\nimport { cast } from './cast';\nimport { op } from './operation';\n/**\n * Computes the sum of elements across dimensions of a `tf.Tensor`.\n *\n * Reduces the input along the dimensions given in `axes`. Unless `keepDims`\n * is true, the rank of the `tf.Tensor` is reduced by 1 for each entry in\n * `axes`. If `keepDims` is true, the reduced dimensions are retained with\n * length 1. If axes has no entries, all dimensions are reduced, and a\n * `tf.Tensor` with a single element is returned.\n *\n * ```js\n * const x = tf.tensor1d([1, 2, 3]);\n *\n * x.sum().print(); // or tf.sum(x)\n * ```\n *\n * ```js\n * const x = tf.tensor2d([1, 2, 3, 4], [2, 2]);\n *\n * const axis = 1;\n * x.sum(axis).print(); // or tf.sum(x, axis)\n * ```\n *\n * @param x The input tensor to compute the sum over. If the dtype is `bool`\n * it will be converted to `int32` and the output dtype will be `int32`.\n * @param axis The dimension(s) to reduce. By default it reduces\n * all dimensions.\n * @param keepDims If true, retains reduced dimensions with size 1.\n *\n * @doc {heading: 'Operations', subheading: 'Reduction'}\n */\nfunction sum_(x, axis = null, keepDims = false) {\n let $x = convertToTensor(x, 'x', 'sum');\n if ($x.dtype === 'bool') {\n $x = cast($x, 'int32');\n }\n const inputs = { x: $x };\n const attrs = { axis, keepDims };\n return ENGINE.runKernel(Sum, inputs, attrs);\n}\nexport const sum = op({ sum_ });\n//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic3VtLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vLi4vdGZqcy1jb3JlL3NyYy9vcHMvc3VtLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBOzs7Ozs7Ozs7Ozs7Ozs7R0FlRztBQUNILE9BQU8sRUFBQyxNQUFNLEVBQUMsTUFBTSxXQUFXLENBQUM7QUFDakMsT0FBTyxFQUFDLEdBQUcsRUFBc0IsTUFBTSxpQkFBaUIsQ0FBQztBQUl6RCxPQUFPLEVBQUMsZUFBZSxFQUFDLE1BQU0sb0JBQW9CLENBQUM7QUFHbkQsT0FBTyxFQUFDLElBQUksRUFBQyxNQUFNLFFBQVEsQ0FBQztBQUM1QixPQUFPLEVBQUMsRUFBRSxFQUFDLE1BQU0sYUFBYSxDQUFDO0FBRS9COzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7OztHQTZCRztBQUNILFNBQVMsSUFBSSxDQUNULENBQW9CLEVBQUUsT0FBd0IsSUFBSSxFQUFFLFFBQVEsR0FBRyxLQUFLO0lBQ3RFLElBQUksRUFBRSxHQUFHLGVBQWUsQ0FBQyxDQUFDLEVBQUUsR0FBRyxFQUFFLEtBQUssQ0FBQyxDQUFDO0lBQ3hDLElBQUksRUFBRSxDQUFDLEtBQUssS0FBSyxNQUFNLEVBQUU7UUFDdkIsRUFBRSxHQUFHLElBQUksQ0FBQyxFQUFFLEVBQUUsT0FBTyxDQUFDLENBQUM7S0FDeEI7SUFFRCxNQUFNLE1BQU0sR0FBYyxFQUFDLENBQUMsRUFBRSxFQUFFLEVBQUMsQ0FBQztJQUNsQyxNQUFNLEtBQUssR0FBYSxFQUFDLElBQUksRUFBRSxRQUFRLEVBQUMsQ0FBQztJQUV6QyxPQUFPLE1BQU0sQ0FBQyxTQUFTLENBQ25CLEdBQUcsRUFBRSxNQUE4QixFQUFFLEtBQTJCLENBQUMsQ0FBQztBQUN4RSxDQUFDO0FBRUQsTUFBTSxDQUFDLE1BQU0sR0FBRyxHQUFHLEVBQUUsQ0FBQyxFQUFDLElBQUksRUFBQyxDQUFDLENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyIvKipcbiAqIEBsaWNlbnNlXG4gKiBDb3B5cmlnaHQgMjAxOCBHb29nbGUgTExDLiBBbGwgUmlnaHRzIFJlc2VydmVkLlxuICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlIFwiTGljZW5zZVwiKTtcbiAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS5cbiAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdFxuICpcbiAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMFxuICpcbiAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmVcbiAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuIFwiQVMgSVNcIiBCQVNJUyxcbiAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLlxuICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZFxuICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuXG4gKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuICovXG5pbXBvcnQge0VOR0lORX0gZnJvbSAnLi4vZW5naW5lJztcbmltcG9ydCB7U3VtLCBTdW1BdHRycywgU3VtSW5wdXRzfSBmcm9tICcuLi9rZXJuZWxfbmFtZXMnO1xuaW1wb3J0IHtOYW1lZEF0dHJNYXB9IGZyb20gJy4uL2tlcm5lbF9yZWdpc3RyeSc7XG5pbXBvcnQge1RlbnNvcn0gZnJvbSAnLi4vdGVuc29yJztcbmltcG9ydCB7TmFtZWRUZW5zb3JNYXB9IGZyb20gJy4uL3RlbnNvcl90eXBlcyc7XG5pbXBvcnQge2NvbnZlcnRUb1RlbnNvcn0gZnJvbSAnLi4vdGVuc29yX3V0aWxfZW52JztcbmltcG9ydCB7VGVuc29yTGlrZX0gZnJvbSAnLi4vdHlwZXMnO1xuXG5pbXBvcnQge2Nhc3R9IGZyb20gJy4vY2FzdCc7XG5pbXBvcnQge29wfSBmcm9tICcuL29wZXJhdGlvbic7XG5cbi8qKlxuICogQ29tcHV0ZXMgdGhlIHN1bSBvZiBlbGVtZW50cyBhY3Jvc3MgZGltZW5zaW9ucyBvZiBhIGB0Zi5UZW5zb3JgLlxuICpcbiAqIFJlZHVjZXMgdGhlIGlucHV0IGFsb25nIHRoZSBkaW1lbnNpb25zIGdpdmVuIGluIGBheGVzYC4gVW5sZXNzIGBrZWVwRGltc2BcbiAqIGlzIHRydWUsIHRoZSByYW5rIG9mIHRoZSBgdGYuVGVuc29yYCBpcyByZWR1Y2VkIGJ5IDEgZm9yIGVhY2ggZW50cnkgaW5cbiAqIGBheGVzYC4gSWYgYGtlZXBEaW1zYCBpcyB0cnVlLCB0aGUgcmVkdWNlZCBkaW1lbnNpb25zIGFyZSByZXRhaW5lZCB3aXRoXG4gKiBsZW5ndGggMS4gSWYgYXhlcyBoYXMgbm8gZW50cmllcywgYWxsIGRpbWVuc2lvbnMgYXJlIHJlZHVjZWQsIGFuZCBhXG4gKiBgdGYuVGVuc29yYCB3aXRoIGEgc2luZ2xlIGVsZW1lbnQgaXMgcmV0dXJuZWQuXG4gKlxuICogYGBganNcbiAqIGNvbnN0IHggPSB0Zi50ZW5zb3IxZChbMSwgMiwgM10pO1xuICpcbiAqIHguc3VtKCkucHJpbnQoKTsgIC8vIG9yIHRmLnN1bSh4KVxuICogYGBgXG4gKlxuICogYGBganNcbiAqIGNvbnN0IHggPSB0Zi50ZW5zb3IyZChbMSwgMiwgMywgNF0sIFsyLCAyXSk7XG4gKlxuICogY29uc3QgYXhpcyA9IDE7XG4gKiB4LnN1bShheGlzKS5wcmludCgpOyAgLy8gb3IgdGYuc3VtKHgsIGF4aXMpXG4gKiBgYGBcbiAqXG4gKiBAcGFyYW0geCBUaGUgaW5wdXQgdGVuc29yIHRvIGNvbXB1dGUgdGhlIHN1bSBvdmVyLiBJZiB0aGUgZHR5cGUgaXMgYGJvb2xgXG4gKiAgIGl0IHdpbGwgYmUgY29udmVydGVkIHRvIGBpbnQzMmAgYW5kIHRoZSBvdXRwdXQgZHR5cGUgd2lsbCBiZSBgaW50MzJgLlxuICogQHBhcmFtIGF4aXMgVGhlIGRpbWVuc2lvbihzKSB0byByZWR1Y2UuIEJ5IGRlZmF1bHQgaXQgcmVkdWNlc1xuICogICAgIGFsbCBkaW1lbnNpb25zLlxuICogQHBhcmFtIGtlZXBEaW1zIElmIHRydWUsIHJldGFpbnMgcmVkdWNlZCBkaW1lbnNpb25zIHdpdGggc2l6ZSAxLlxuICpcbiAqIEBkb2Mge2hlYWRpbmc6ICdPcGVyYXRpb25zJywgc3ViaGVhZGluZzogJ1JlZHVjdGlvbid9XG4gKi9cbmZ1bmN0aW9uIHN1bV88VCBleHRlbmRzIFRlbnNvcj4oXG4gICAgeDogVGVuc29yfFRlbnNvckxpa2UsIGF4aXM6IG51bWJlcnxudW1iZXJbXSA9IG51bGwsIGtlZXBEaW1zID0gZmFsc2UpOiBUIHtcbiAgbGV0ICR4ID0gY29udmVydFRvVGVuc29yKHgsICd4JywgJ3N1bScpO1xuICBpZiAoJHguZHR5cGUgPT09ICdib29sJykge1xuICAgICR4ID0gY2FzdCgkeCwgJ2ludDMyJyk7XG4gIH1cblxuICBjb25zdCBpbnB1dHM6IFN1bUlucHV0cyA9IHt4OiAkeH07XG4gIGNvbnN0IGF0dHJzOiBTdW1BdHRycyA9IHtheGlzLCBrZWVwRGltc307XG5cbiAgcmV0dXJuIEVOR0lORS5ydW5LZXJuZWwoXG4gICAgICBTdW0sIGlucHV0cyBhcyB7fSBhcyBOYW1lZFRlbnNvck1hcCwgYXR0cnMgYXMge30gYXMgTmFtZWRBdHRyTWFwKTtcbn1cblxuZXhwb3J0IGNvbnN0IHN1bSA9IG9wKHtzdW1ffSk7XG4iXX0=","/**\n * @license\n * Copyright 2018 Google LLC. All Rights Reserved.\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n * =============================================================================\n */\nimport { ENGINE } from '../engine';\nimport { Tan } from '../kernel_names';\nimport { convertToTensor } from '../tensor_util_env';\nimport { op } from './operation';\n/**\n * Computes tan of the input `tf.Tensor` element-wise, `tan(x)`\n *\n * ```js\n * const x = tf.tensor1d([0, Math.PI / 2, Math.PI * 3 / 4]);\n *\n * x.tan().print(); // or tf.tan(x)\n * ```\n * @param x The input tensor.\n *\n * @doc {heading: 'Operations', subheading: 'Basic math'}\n */\nfunction tan_(x) {\n const $x = convertToTensor(x, 'x', 'tan', 'float32');\n const inputs = { x: $x };\n return ENGINE.runKernel(Tan, inputs);\n}\nexport const tan = op({ tan_ });\n//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidGFuLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vLi4vdGZqcy1jb3JlL3NyYy9vcHMvdGFuLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBOzs7Ozs7Ozs7Ozs7Ozs7R0FlRztBQUVILE9BQU8sRUFBQyxNQUFNLEVBQUMsTUFBTSxXQUFXLENBQUM7QUFDakMsT0FBTyxFQUFDLEdBQUcsRUFBWSxNQUFNLGlCQUFpQixDQUFDO0FBRy9DLE9BQU8sRUFBQyxlQUFlLEVBQUMsTUFBTSxvQkFBb0IsQ0FBQztBQUduRCxPQUFPLEVBQUMsRUFBRSxFQUFDLE1BQU0sYUFBYSxDQUFDO0FBRS9COzs7Ozs7Ozs7OztHQVdHO0FBQ0gsU0FBUyxJQUFJLENBQW1CLENBQWU7SUFDN0MsTUFBTSxFQUFFLEdBQUcsZUFBZSxDQUFDLENBQUMsRUFBRSxHQUFHLEVBQUUsS0FBSyxFQUFFLFNBQVMsQ0FBQyxDQUFDO0lBRXJELE1BQU0sTUFBTSxHQUFjLEVBQUMsQ0FBQyxFQUFFLEVBQUUsRUFBQyxDQUFDO0lBRWxDLE9BQU8sTUFBTSxDQUFDLFNBQVMsQ0FBQyxHQUFHLEVBQUUsTUFBOEIsQ0FBQyxDQUFDO0FBQy9ELENBQUM7QUFDRCxNQUFNLENBQUMsTUFBTSxHQUFHLEdBQUcsRUFBRSxDQUFDLEVBQUMsSUFBSSxFQUFDLENBQUMsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbIi8qKlxuICogQGxpY2Vuc2VcbiAqIENvcHlyaWdodCAyMDE4IEdvb2dsZSBMTEMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuXG4gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgXCJMaWNlbnNlXCIpO1xuICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLlxuICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0XG4gKlxuICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wXG4gKlxuICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZVxuICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gXCJBUyBJU1wiIEJBU0lTLFxuICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuXG4gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kXG4gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS5cbiAqID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4gKi9cblxuaW1wb3J0IHtFTkdJTkV9IGZyb20gJy4uL2VuZ2luZSc7XG5pbXBvcnQge1RhbiwgVGFuSW5wdXRzfSBmcm9tICcuLi9rZXJuZWxfbmFtZXMnO1xuaW1wb3J0IHtUZW5zb3J9IGZyb20gJy4uL3RlbnNvcic7XG5pbXBvcnQge05hbWVkVGVuc29yTWFwfSBmcm9tICcuLi90ZW5zb3JfdHlwZXMnO1xuaW1wb3J0IHtjb252ZXJ0VG9UZW5zb3J9IGZyb20gJy4uL3RlbnNvcl91dGlsX2Vudic7XG5pbXBvcnQge1RlbnNvckxpa2V9IGZyb20gJy4uL3R5cGVzJztcblxuaW1wb3J0IHtvcH0gZnJvbSAnLi9vcGVyYXRpb24nO1xuXG4vKipcbiAqIENvbXB1dGVzIHRhbiBvZiB0aGUgaW5wdXQgYHRmLlRlbnNvcmAgZWxlbWVudC13aXNlLCBgdGFuKHgpYFxuICpcbiAqIGBgYGpzXG4gKiBjb25zdCB4ID0gdGYudGVuc29yMWQoWzAsIE1hdGguUEkgLyAyLCBNYXRoLlBJICogMyAvIDRdKTtcbiAqXG4gKiB4LnRhbigpLnByaW50KCk7ICAvLyBvciB0Zi50YW4oeClcbiAqIGBgYFxuICogQHBhcmFtIHggVGhlIGlucHV0IHRlbnNvci5cbiAqXG4gKiBAZG9jIHtoZWFkaW5nOiAnT3BlcmF0aW9ucycsIHN1YmhlYWRpbmc6ICdCYXNpYyBtYXRoJ31cbiAqL1xuZnVuY3Rpb24gdGFuXzxUIGV4dGVuZHMgVGVuc29yPih4OiBUfFRlbnNvckxpa2UpOiBUIHtcbiAgY29uc3QgJHggPSBjb252ZXJ0VG9UZW5zb3IoeCwgJ3gnLCAndGFuJywgJ2Zsb2F0MzInKTtcblxuICBjb25zdCBpbnB1dHM6IFRhbklucHV0cyA9IHt4OiAkeH07XG5cbiAgcmV0dXJuIEVOR0lORS5ydW5LZXJuZWwoVGFuLCBpbnB1dHMgYXMge30gYXMgTmFtZWRUZW5zb3JNYXApO1xufVxuZXhwb3J0IGNvbnN0IHRhbiA9IG9wKHt0YW5ffSk7XG4iXX0=","/**\n * @license\n * Copyright 2018 Google LLC. All Rights Reserved.\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n * =============================================================================\n */\nimport { ENGINE } from '../engine';\nimport { Tanh } from '../kernel_names';\nimport { convertToTensor } from '../tensor_util_env';\nimport { op } from './operation';\n/**\n * Computes hyperbolic tangent of the input `tf.Tensor` element-wise: `tanh(x)`\n *\n * ```js\n * const x = tf.tensor1d([0, 1, -1, 70]);\n *\n * x.tanh().print(); // or tf.tanh(x)\n * ```\n * @param x The input tensor.\n *\n * @doc {heading: 'Operations', subheading: 'Basic math'}\n */\nfunction tanh_(x) {\n const $x = convertToTensor(x, 'x', 'tanh', 'float32');\n const inputs = { x: $x };\n return ENGINE.runKernel(Tanh, inputs);\n}\nexport const tanh = op({ tanh_ });\n//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidGFuaC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uLy4uL3RmanMtY29yZS9zcmMvb3BzL3RhbmgudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUE7Ozs7Ozs7Ozs7Ozs7OztHQWVHO0FBRUgsT0FBTyxFQUFDLE1BQU0sRUFBQyxNQUFNLFdBQVcsQ0FBQztBQUNqQyxPQUFPLEVBQUMsSUFBSSxFQUFhLE1BQU0saUJBQWlCLENBQUM7QUFHakQsT0FBTyxFQUFDLGVBQWUsRUFBQyxNQUFNLG9CQUFvQixDQUFDO0FBR25ELE9BQU8sRUFBQyxFQUFFLEVBQUMsTUFBTSxhQUFhLENBQUM7QUFFL0I7Ozs7Ozs7Ozs7O0dBV0c7QUFDSCxTQUFTLEtBQUssQ0FBbUIsQ0FBZTtJQUM5QyxNQUFNLEVBQUUsR0FBRyxlQUFlLENBQUMsQ0FBQyxFQUFFLEdBQUcsRUFBRSxNQUFNLEVBQUUsU0FBUyxDQUFDLENBQUM7SUFFdEQsTUFBTSxNQUFNLEdBQWUsRUFBQyxDQUFDLEVBQUUsRUFBRSxFQUFDLENBQUM7SUFFbkMsT0FBTyxNQUFNLENBQUMsU0FBUyxDQUFDLElBQUksRUFBRSxNQUE4QixDQUFDLENBQUM7QUFDaEUsQ0FBQztBQUNELE1BQU0sQ0FBQyxNQUFNLElBQUksR0FBRyxFQUFFLENBQUMsRUFBQyxLQUFLLEVBQUMsQ0FBQyxDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiLyoqXG4gKiBAbGljZW5zZVxuICogQ29weXJpZ2h0IDIwMTggR29vZ2xlIExMQy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC5cbiAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSBcIkxpY2Vuc2VcIik7XG4gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuXG4gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXRcbiAqXG4gKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjBcbiAqXG4gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlXG4gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiBcIkFTIElTXCIgQkFTSVMsXG4gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC5cbiAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmRcbiAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLlxuICogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbiAqL1xuXG5pbXBvcnQge0VOR0lORX0gZnJvbSAnLi4vZW5naW5lJztcbmltcG9ydCB7VGFuaCwgVGFuaElucHV0c30gZnJvbSAnLi4va2VybmVsX25hbWVzJztcbmltcG9ydCB7VGVuc29yfSBmcm9tICcuLi90ZW5zb3InO1xuaW1wb3J0IHtOYW1lZFRlbnNvck1hcH0gZnJvbSAnLi4vdGVuc29yX3R5cGVzJztcbmltcG9ydCB7Y29udmVydFRvVGVuc29yfSBmcm9tICcuLi90ZW5zb3JfdXRpbF9lbnYnO1xuaW1wb3J0IHtUZW5zb3JMaWtlfSBmcm9tICcuLi90eXBlcyc7XG5cbmltcG9ydCB7b3B9IGZyb20gJy4vb3BlcmF0aW9uJztcblxuLyoqXG4gKiBDb21wdXRlcyBoeXBlcmJvbGljIHRhbmdlbnQgb2YgdGhlIGlucHV0IGB0Zi5UZW5zb3JgIGVsZW1lbnQtd2lzZTogYHRhbmgoeClgXG4gKlxuICogYGBganNcbiAqIGNvbnN0IHggPSB0Zi50ZW5zb3IxZChbMCwgMSwgLTEsIDcwXSk7XG4gKlxuICogeC50YW5oKCkucHJpbnQoKTsgIC8vIG9yIHRmLnRhbmgoeClcbiAqIGBgYFxuICogQHBhcmFtIHggVGhlIGlucHV0IHRlbnNvci5cbiAqXG4gKiBAZG9jIHtoZWFkaW5nOiAnT3BlcmF0aW9ucycsIHN1YmhlYWRpbmc6ICdCYXNpYyBtYXRoJ31cbiAqL1xuZnVuY3Rpb24gdGFuaF88VCBleHRlbmRzIFRlbnNvcj4oeDogVHxUZW5zb3JMaWtlKTogVCB7XG4gIGNvbnN0ICR4ID0gY29udmVydFRvVGVuc29yKHgsICd4JywgJ3RhbmgnLCAnZmxvYXQzMicpO1xuXG4gIGNvbnN0IGlucHV0czogVGFuaElucHV0cyA9IHt4OiAkeH07XG5cbiAgcmV0dXJuIEVOR0lORS5ydW5LZXJuZWwoVGFuaCwgaW5wdXRzIGFzIHt9IGFzIE5hbWVkVGVuc29yTWFwKTtcbn1cbmV4cG9ydCBjb25zdCB0YW5oID0gb3Aoe3RhbmhffSk7XG4iXX0=","/**\n * @license\n * Copyright 2018 Google LLC. All Rights Reserved.\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n * =============================================================================\n */\nimport { inferShape } from '../tensor_util_env';\nimport { makeTensor } from './tensor_ops_util';\n/**\n * Creates a `tf.Tensor` with the provided values, shape and dtype.\n *\n * ```js\n * // Pass an array of values to create a vector.\n * tf.tensor([1, 2, 3, 4]).print();\n * ```\n *\n * ```js\n * // Pass a nested array of values to make a matrix or a higher\n * // dimensional tensor.\n * tf.tensor([[1, 2], [3, 4]]).print();\n * ```\n *\n * ```js\n * // Pass a flat array and specify a shape yourself.\n * tf.tensor([1, 2, 3, 4], [2, 2]).print();\n * ```\n *\n * @param values The values of the tensor. Can be nested array of numbers,\n * or a flat array, or a `TypedArray`. If the values are strings,\n * they will be encoded as utf-8 and kept as `Uint8Array[]`.\n * @param shape The shape of the tensor. Optional. If not provided,\n * it is inferred from `values`.\n * @param dtype The data type.\n *\n * @doc {heading: 'Tensors', subheading: 'Creation'}\n */\nexport function tensor(values, shape, dtype) {\n const inferredShape = inferShape(values, dtype);\n return makeTensor(values, shape, inferredShape, dtype);\n}\n//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidGVuc29yLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vLi4vdGZqcy1jb3JlL3NyYy9vcHMvdGVuc29yLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBOzs7Ozs7Ozs7Ozs7Ozs7R0FlRztBQUdILE9BQU8sRUFBQyxVQUFVLEVBQUMsTUFBTSxvQkFBb0IsQ0FBQztBQUk5QyxPQUFPLEVBQUMsVUFBVSxFQUFDLE1BQU0sbUJBQW1CLENBQUM7QUFFN0M7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7OztHQTJCRztBQUNILE1BQU0sVUFBVSxNQUFNLENBQ2xCLE1BQWtCLEVBQUUsS0FBbUIsRUFBRSxLQUFnQjtJQUMzRCxNQUFNLGFBQWEsR0FBRyxVQUFVLENBQUMsTUFBTSxFQUFFLEtBQUssQ0FBQyxDQUFDO0lBQ2hELE9BQU8sVUFBVSxDQUFDLE1BQU0sRUFBRSxLQUFLLEVBQUUsYUFBYSxFQUFFLEtBQUssQ0FBYyxDQUFDO0FBQ3RFLENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyIvKipcbiAqIEBsaWNlbnNlXG4gKiBDb3B5cmlnaHQgMjAxOCBHb29nbGUgTExDLiBBbGwgUmlnaHRzIFJlc2VydmVkLlxuICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlIFwiTGljZW5zZVwiKTtcbiAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS5cbiAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdFxuICpcbiAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMFxuICpcbiAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmVcbiAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuIFwiQVMgSVNcIiBCQVNJUyxcbiAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLlxuICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZFxuICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuXG4gKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuICovXG5cbmltcG9ydCB7VGVuc29yfSBmcm9tICcuLi90ZW5zb3InO1xuaW1wb3J0IHtpbmZlclNoYXBlfSBmcm9tICcuLi90ZW5zb3JfdXRpbF9lbnYnO1xuaW1wb3J0IHtUZW5zb3JMaWtlfSBmcm9tICcuLi90eXBlcyc7XG5pbXBvcnQge0RhdGFUeXBlLCBSYW5rLCBTaGFwZU1hcH0gZnJvbSAnLi4vdHlwZXMnO1xuXG5pbXBvcnQge21ha2VUZW5zb3J9IGZyb20gJy4vdGVuc29yX29wc191dGlsJztcblxuLyoqXG4gKiBDcmVhdGVzIGEgYHRmLlRlbnNvcmAgd2l0aCB0aGUgcHJvdmlkZWQgdmFsdWVzLCBzaGFwZSBhbmQgZHR5cGUuXG4gKlxuICogYGBganNcbiAqIC8vIFBhc3MgYW4gYXJyYXkgb2YgdmFsdWVzIHRvIGNyZWF0ZSBhIHZlY3Rvci5cbiAqIHRmLnRlbnNvcihbMSwgMiwgMywgNF0pLnByaW50KCk7XG4gKiBgYGBcbiAqXG4gKiBgYGBqc1xuICogLy8gUGFzcyBhIG5lc3RlZCBhcnJheSBvZiB2YWx1ZXMgdG8gbWFrZSBhIG1hdHJpeCBvciBhIGhpZ2hlclxuICogLy8gZGltZW5zaW9uYWwgdGVuc29yLlxuICogdGYudGVuc29yKFtbMSwgMl0sIFszLCA0XV0pLnByaW50KCk7XG4gKiBgYGBcbiAqXG4gKiBgYGBqc1xuICogLy8gUGFzcyBhIGZsYXQgYXJyYXkgYW5kIHNwZWNpZnkgYSBzaGFwZSB5b3Vyc2VsZi5cbiAqIHRmLnRlbnNvcihbMSwgMiwgMywgNF0sIFsyLCAyXSkucHJpbnQoKTtcbiAqIGBgYFxuICpcbiAqIEBwYXJhbSB2YWx1ZXMgVGhlIHZhbHVlcyBvZiB0aGUgdGVuc29yLiBDYW4gYmUgbmVzdGVkIGFycmF5IG9mIG51bWJlcnMsXG4gKiAgICAgb3IgYSBmbGF0IGFycmF5LCBvciBhIGBUeXBlZEFycmF5YC4gSWYgdGhlIHZhbHVlcyBhcmUgc3RyaW5ncyxcbiAqICAgICB0aGV5IHdpbGwgYmUgZW5jb2RlZCBhcyB1dGYtOCBhbmQga2VwdCBhcyBgVWludDhBcnJheVtdYC5cbiAqIEBwYXJhbSBzaGFwZSBUaGUgc2hhcGUgb2YgdGhlIHRlbnNvci4gT3B0aW9uYWwuIElmIG5vdCBwcm92aWRlZCxcbiAqICAgaXQgaXMgaW5mZXJyZWQgZnJvbSBgdmFsdWVzYC5cbiAqIEBwYXJhbSBkdHlwZSBUaGUgZGF0YSB0eXBlLlxuICpcbiAqIEBkb2Mge2hlYWRpbmc6ICdUZW5zb3JzJywgc3ViaGVhZGluZzogJ0NyZWF0aW9uJ31cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHRlbnNvcjxSIGV4dGVuZHMgUmFuaz4oXG4gICAgdmFsdWVzOiBUZW5zb3JMaWtlLCBzaGFwZT86IFNoYXBlTWFwW1JdLCBkdHlwZT86IERhdGFUeXBlKTogVGVuc29yPFI+IHtcbiAgY29uc3QgaW5mZXJyZWRTaGFwZSA9IGluZmVyU2hhcGUodmFsdWVzLCBkdHlwZSk7XG4gIHJldHVybiBtYWtlVGVuc29yKHZhbHVlcywgc2hhcGUsIGluZmVycmVkU2hhcGUsIGR0eXBlKSBhcyBUZW5zb3I8Uj47XG59XG4iXX0=","/**\n * @license\n * Copyright 2018 Google LLC. All Rights Reserved.\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n * =============================================================================\n */\nimport { inferShape } from '../tensor_util_env';\nimport { assertNonNull } from '../util';\nimport { makeTensor } from './tensor_ops_util';\n/**\n * Creates rank-3 `tf.Tensor` with the provided values, shape and dtype.\n *\n * The same functionality can be achieved with `tf.tensor`, but in general\n * we recommend using `tf.tensor3d` as it makes the code more readable.\n *\n * ```js\n * // Pass a nested array.\n * tf.tensor3d([[[1], [2]], [[3], [4]]]).print();\n * ```\n * ```js\n * // Pass a flat array and specify a shape.\n * tf.tensor3d([1, 2, 3, 4], [2, 2, 1]).print();\n * ```\n *\n * @param values The values of the tensor. Can be nested array of numbers,\n * or a flat array, or a `TypedArray`.\n * @param shape The shape of the tensor. If not provided, it is inferred from\n * `values`.\n * @param dtype The data type.\n *\n * @doc {heading: 'Tensors', subheading: 'Creation'}\n */\nexport function tensor3d(values, shape, dtype) {\n assertNonNull(values);\n if (shape != null && shape.length !== 3) {\n throw new Error('tensor3d() requires shape to have three numbers');\n }\n const inferredShape = inferShape(values, dtype);\n if (inferredShape.length !== 3 && inferredShape.length !== 1) {\n throw new Error('tensor3d() requires values to be number[][][] or flat/TypedArray');\n }\n if (inferredShape.length === 1 && shape == null) {\n throw new Error('tensor3d() requires shape to be provided when `values` ' +\n 'are a flat array');\n }\n return makeTensor(values, shape, inferredShape, dtype);\n}\n//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidGVuc29yM2QuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi8uLi90ZmpzLWNvcmUvc3JjL29wcy90ZW5zb3IzZC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQTs7Ozs7Ozs7Ozs7Ozs7O0dBZUc7QUFHSCxPQUFPLEVBQUMsVUFBVSxFQUFDLE1BQU0sb0JBQW9CLENBQUM7QUFHOUMsT0FBTyxFQUFDLGFBQWEsRUFBQyxNQUFNLFNBQVMsQ0FBQztBQUN0QyxPQUFPLEVBQUMsVUFBVSxFQUFDLE1BQU0sbUJBQW1CLENBQUM7QUFFN0M7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7R0FzQkc7QUFDSCxNQUFNLFVBQVUsUUFBUSxDQUNwQixNQUFvQixFQUFFLEtBQWdDLEVBQ3RELEtBQWdCO0lBQ2xCLGFBQWEsQ0FBQyxNQUFNLENBQUMsQ0FBQztJQUN0QixJQUFJLEtBQUssSUFBSSxJQUFJLElBQUksS0FBSyxDQUFDLE1BQU0sS0FBSyxDQUFDLEVBQUU7UUFDdkMsTUFBTSxJQUFJLEtBQUssQ0FBQyxpREFBaUQsQ0FBQyxDQUFDO0tBQ3BFO0lBQ0QsTUFBTSxhQUFhLEdBQUcsVUFBVSxDQUFDLE1BQU0sRUFBRSxLQUFLLENBQUMsQ0FBQztJQUNoRCxJQUFJLGFBQWEsQ0FBQyxNQUFNLEtBQUssQ0FBQyxJQUFJLGFBQWEsQ0FBQyxNQUFNLEtBQUssQ0FBQyxFQUFFO1FBQzVELE1BQU0sSUFBSSxLQUFLLENBQ1gsa0VBQWtFLENBQUMsQ0FBQztLQUN6RTtJQUNELElBQUksYUFBYSxDQUFDLE1BQU0sS0FBSyxDQUFDLElBQUksS0FBSyxJQUFJLElBQUksRUFBRTtRQUMvQyxNQUFNLElBQUksS0FBSyxDQUNYLHlEQUF5RDtZQUN6RCxrQkFBa0IsQ0FBQyxDQUFDO0tBQ3pCO0lBQ0QsT0FBTyxVQUFVLENBQUMsTUFBTSxFQUFFLEtBQUssRUFBRSxhQUFhLEVBQUUsS0FBSyxDQUFhLENBQUM7QUFDckUsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbIi8qKlxuICogQGxpY2Vuc2VcbiAqIENvcHlyaWdodCAyMDE4IEdvb2dsZSBMTEMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuXG4gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgXCJMaWNlbnNlXCIpO1xuICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLlxuICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0XG4gKlxuICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wXG4gKlxuICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZVxuICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gXCJBUyBJU1wiIEJBU0lTLFxuICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuXG4gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kXG4gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS5cbiAqID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4gKi9cblxuaW1wb3J0IHtUZW5zb3IzRH0gZnJvbSAnLi4vdGVuc29yJztcbmltcG9ydCB7aW5mZXJTaGFwZX0gZnJvbSAnLi4vdGVuc29yX3V0aWxfZW52JztcbmltcG9ydCB7VGVuc29yTGlrZTNEfSBmcm9tICcuLi90eXBlcyc7XG5pbXBvcnQge0RhdGFUeXBlfSBmcm9tICcuLi90eXBlcyc7XG5pbXBvcnQge2Fzc2VydE5vbk51bGx9IGZyb20gJy4uL3V0aWwnO1xuaW1wb3J0IHttYWtlVGVuc29yfSBmcm9tICcuL3RlbnNvcl9vcHNfdXRpbCc7XG5cbi8qKlxuICogQ3JlYXRlcyByYW5rLTMgYHRmLlRlbnNvcmAgd2l0aCB0aGUgcHJvdmlkZWQgdmFsdWVzLCBzaGFwZSBhbmQgZHR5cGUuXG4gKlxuICogVGhlIHNhbWUgZnVuY3Rpb25hbGl0eSBjYW4gYmUgYWNoaWV2ZWQgd2l0aCBgdGYudGVuc29yYCwgYnV0IGluIGdlbmVyYWxcbiAqIHdlIHJlY29tbWVuZCB1c2luZyBgdGYudGVuc29yM2RgIGFzIGl0IG1ha2VzIHRoZSBjb2RlIG1vcmUgcmVhZGFibGUuXG4gKlxuICogIGBgYGpzXG4gKiAvLyBQYXNzIGEgbmVzdGVkIGFycmF5LlxuICogdGYudGVuc29yM2QoW1tbMV0sIFsyXV0sIFtbM10sIFs0XV1dKS5wcmludCgpO1xuICogYGBgXG4gKiBgYGBqc1xuICogLy8gUGFzcyBhIGZsYXQgYXJyYXkgYW5kIHNwZWNpZnkgYSBzaGFwZS5cbiAqIHRmLnRlbnNvcjNkKFsxLCAyLCAzLCA0XSwgWzIsIDIsIDFdKS5wcmludCgpO1xuICogYGBgXG4gKlxuICogQHBhcmFtIHZhbHVlcyBUaGUgdmFsdWVzIG9mIHRoZSB0ZW5zb3IuIENhbiBiZSBuZXN0ZWQgYXJyYXkgb2YgbnVtYmVycyxcbiAqICAgICBvciBhIGZsYXQgYXJyYXksIG9yIGEgYFR5cGVkQXJyYXlgLlxuICogQHBhcmFtIHNoYXBlIFRoZSBzaGFwZSBvZiB0aGUgdGVuc29yLiBJZiBub3QgcHJvdmlkZWQsICBpdCBpcyBpbmZlcnJlZCBmcm9tXG4gKiAgICAgYHZhbHVlc2AuXG4gKiBAcGFyYW0gZHR5cGUgVGhlIGRhdGEgdHlwZS5cbiAqXG4gKiBAZG9jIHtoZWFkaW5nOiAnVGVuc29ycycsIHN1YmhlYWRpbmc6ICdDcmVhdGlvbid9XG4gKi9cbmV4cG9ydCBmdW5jdGlvbiB0ZW5zb3IzZChcbiAgICB2YWx1ZXM6IFRlbnNvckxpa2UzRCwgc2hhcGU/OiBbbnVtYmVyLCBudW1iZXIsIG51bWJlcl0sXG4gICAgZHR5cGU/OiBEYXRhVHlwZSk6IFRlbnNvcjNEIHtcbiAgYXNzZXJ0Tm9uTnVsbCh2YWx1ZXMpO1xuICBpZiAoc2hhcGUgIT0gbnVsbCAmJiBzaGFwZS5sZW5ndGggIT09IDMpIHtcbiAgICB0aHJvdyBuZXcgRXJyb3IoJ3RlbnNvcjNkKCkgcmVxdWlyZXMgc2hhcGUgdG8gaGF2ZSB0aHJlZSBudW1iZXJzJyk7XG4gIH1cbiAgY29uc3QgaW5mZXJyZWRTaGFwZSA9IGluZmVyU2hhcGUodmFsdWVzLCBkdHlwZSk7XG4gIGlmIChpbmZlcnJlZFNoYXBlLmxlbmd0aCAhPT0gMyAmJiBpbmZlcnJlZFNoYXBlLmxlbmd0aCAhPT0gMSkge1xuICAgIHRocm93IG5ldyBFcnJvcihcbiAgICAgICAgJ3RlbnNvcjNkKCkgcmVxdWlyZXMgdmFsdWVzIHRvIGJlIG51bWJlcltdW11bXSBvciBmbGF0L1R5cGVkQXJyYXknKTtcbiAgfVxuICBpZiAoaW5mZXJyZWRTaGFwZS5sZW5ndGggPT09IDEgJiYgc2hhcGUgPT0gbnVsbCkge1xuICAgIHRocm93IG5ldyBFcnJvcihcbiAgICAgICAgJ3RlbnNvcjNkKCkgcmVxdWlyZXMgc2hhcGUgdG8gYmUgcHJvdmlkZWQgd2hlbiBgdmFsdWVzYCAnICtcbiAgICAgICAgJ2FyZSBhIGZsYXQgYXJyYXknKTtcbiAgfVxuICByZXR1cm4gbWFrZVRlbnNvcih2YWx1ZXMsIHNoYXBlLCBpbmZlcnJlZFNoYXBlLCBkdHlwZSkgYXMgVGVuc29yM0Q7XG59XG4iXX0=","/**\n * @license\n * Copyright 2018 Google LLC. All Rights Reserved.\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n * =============================================================================\n */\nimport { ENGINE } from '../engine';\nimport { assert, assertNonNegativeIntegerDimensions, flatten, inferDtype, isTypedArray, sizeFromShape, toTypedArray } from '../util';\n/** This is shared code across all tensor creation methods. */\nexport function makeTensor(values, shape, inferredShape, dtype) {\n if (dtype == null) {\n dtype = inferDtype(values);\n }\n if (dtype === 'complex64') {\n throw new Error(`Cannot construct a complex64 tensor directly. ` +\n `Please use tf.complex(real, imag).`);\n }\n if (!isTypedArray(values) && !Array.isArray(values) &&\n typeof values !== 'number' && typeof values !== 'boolean' &&\n typeof values !== 'string') {\n throw new Error('values passed to tensor(values) must be a number/boolean/string or ' +\n 'an array of numbers/booleans/strings, or a TypedArray');\n }\n if (shape != null) {\n assertNonNegativeIntegerDimensions(shape);\n const providedSize = sizeFromShape(shape);\n const inferredSize = sizeFromShape(inferredShape);\n assert(providedSize === inferredSize, () => `Based on the provided shape, [${shape}], the tensor should have ` +\n `${providedSize} values but has ${inferredSize}`);\n for (let i = 0; i < inferredShape.length; ++i) {\n const inferred = inferredShape[i];\n const flatDimsDontMatch = i === inferredShape.length - 1 ?\n inferred !== sizeFromShape(shape.slice(i)) :\n true;\n assert(inferredShape[i] === shape[i] || !flatDimsDontMatch, () => `Error creating a new Tensor. Inferred shape ` +\n `(${inferredShape}) does not match the provided ` +\n `shape (${shape}). `);\n }\n }\n if (!isTypedArray(values) && !Array.isArray(values)) {\n values = [values];\n }\n shape = shape || inferredShape;\n values = dtype !== 'string' ?\n toTypedArray(values, dtype) :\n flatten(values, [], true);\n return ENGINE.makeTensor(values, shape, dtype);\n}\n//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidGVuc29yX29wc191dGlsLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vLi4vdGZqcy1jb3JlL3NyYy9vcHMvdGVuc29yX29wc191dGlsLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBOzs7Ozs7Ozs7Ozs7Ozs7R0FlRztBQUVILE9BQU8sRUFBQyxNQUFNLEVBQUMsTUFBTSxXQUFXLENBQUM7QUFJakMsT0FBTyxFQUFDLE1BQU0sRUFBRSxrQ0FBa0MsRUFBRSxPQUFPLEVBQUUsVUFBVSxFQUFFLFlBQVksRUFBRSxhQUFhLEVBQUUsWUFBWSxFQUFDLE1BQU0sU0FBUyxDQUFDO0FBRW5JLDhEQUE4RDtBQUM5RCxNQUFNLFVBQVUsVUFBVSxDQUN0QixNQUFrQixFQUFFLEtBQWUsRUFBRSxhQUF1QixFQUM1RCxLQUFnQjtJQUNsQixJQUFJLEtBQUssSUFBSSxJQUFJLEVBQUU7UUFDakIsS0FBSyxHQUFHLFVBQVUsQ0FBQyxNQUFNLENBQUMsQ0FBQztLQUM1QjtJQUNELElBQUksS0FBSyxLQUFLLFdBQVcsRUFBRTtRQUN6QixNQUFNLElBQUksS0FBSyxDQUNYLGdEQUFnRDtZQUNoRCxvQ0FBb0MsQ0FBQyxDQUFDO0tBQzNDO0lBQ0QsSUFBSSxDQUFDLFlBQVksQ0FBQyxNQUFNLENBQUMsSUFBSSxDQUFDLEtBQUssQ0FBQyxPQUFPLENBQUMsTUFBTSxDQUFDO1FBQy9DLE9BQU8sTUFBTSxLQUFLLFFBQVEsSUFBSSxPQUFPLE1BQU0sS0FBSyxTQUFTO1FBQ3pELE9BQU8sTUFBTSxLQUFLLFFBQVEsRUFBRTtRQUM5QixNQUFNLElBQUksS0FBSyxDQUNYLHFFQUFxRTtZQUNyRSx1REFBdUQsQ0FBQyxDQUFDO0tBQzlEO0lBQ0QsSUFBSSxLQUFLLElBQUksSUFBSSxFQUFFO1FBQ2pCLGtDQUFrQyxDQUFDLEtBQUssQ0FBQyxDQUFDO1FBRTFDLE1BQU0sWUFBWSxHQUFHLGFBQWEsQ0FBQyxLQUFLLENBQUMsQ0FBQztRQUMxQyxNQUFNLFlBQVksR0FBRyxhQUFhLENBQUMsYUFBYSxDQUFDLENBQUM7UUFDbEQsTUFBTSxDQUNGLFlBQVksS0FBSyxZQUFZLEVBQzdCLEdBQUcsRUFBRSxDQUNELGlDQUFpQyxLQUFLLDRCQUE0QjtZQUNsRSxHQUFHLFlBQVksbUJBQW1CLFlBQVksRUFBRSxDQUFDLENBQUM7UUFFMUQsS0FBSyxJQUFJLENBQUMsR0FBRyxDQUFDLEVBQUUsQ0FBQyxHQUFHLGFBQWEsQ0FBQyxNQUFNLEVBQUUsRUFBRSxDQUFDLEVBQUU7WUFDN0MsTUFBTSxRQUFRLEdBQUcsYUFBYSxDQUFDLENBQUMsQ0FBQyxDQUFDO1lBQ2xDLE1BQU0saUJBQWlCLEdBQUcsQ0FBQyxLQUFLLGFBQWEsQ0FBQyxNQUFNLEdBQUcsQ0FBQyxDQUFDLENBQUM7Z0JBQ3RELFFBQVEsS0FBSyxhQUFhLENBQUMsS0FBSyxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUM7Z0JBQzVDLElBQUksQ0FBQztZQUNULE1BQU0sQ0FDRixhQUFhLENBQUMsQ0FBQyxDQUFDLEtBQUssS0FBSyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsaUJBQWlCLEVBQ25ELEdBQUcsRUFBRSxDQUFDLDhDQUE4QztnQkFDaEQsSUFBSSxhQUFhLGdDQUFnQztnQkFDakQsVUFBVSxLQUFLLEtBQUssQ0FBQyxDQUFDO1NBQy9CO0tBQ0Y7SUFFRCxJQUFJLENBQUMsWUFBWSxDQUFDLE1BQU0sQ0FBQyxJQUFJLENBQUMsS0FBSyxDQUFDLE9BQU8sQ0FBQyxNQUFNLENBQUMsRUFBRTtRQUNuRCxNQUFNLEdBQUcsQ0FBQyxNQUFNLENBQWEsQ0FBQztLQUMvQjtJQUVELEtBQUssR0FBRyxLQUFLLElBQUksYUFBYSxDQUFDO0lBQy9CLE1BQU0sR0FBRyxLQUFLLEtBQUssUUFBUSxDQUFDLENBQUM7UUFDekIsWUFBWSxDQUFDLE1BQU0sRUFBRSxLQUFLLENBQUMsQ0FBQyxDQUFDO1FBQzdCLE9BQU8sQ0FBQyxNQUFrQixFQUFFLEVBQUUsRUFBRSxJQUFJLENBQWEsQ0FBQztJQUN0RCxPQUFPLE1BQU0sQ0FBQyxVQUFVLENBQUMsTUFBb0IsRUFBRSxLQUFLLEVBQUUsS0FBSyxDQUFDLENBQUM7QUFDL0QsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbIi8qKlxuICogQGxpY2Vuc2VcbiAqIENvcHlyaWdodCAyMDE4IEdvb2dsZSBMTEMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuXG4gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgXCJMaWNlbnNlXCIpO1xuICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLlxuICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0XG4gKlxuICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wXG4gKlxuICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZVxuICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gXCJBUyBJU1wiIEJBU0lTLFxuICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuXG4gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kXG4gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS5cbiAqID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4gKi9cblxuaW1wb3J0IHtFTkdJTkV9IGZyb20gJy4uL2VuZ2luZSc7XG5pbXBvcnQge1RlbnNvcn0gZnJvbSAnLi4vdGVuc29yJztcbmltcG9ydCB7VGVuc29yTGlrZSwgVHlwZWRBcnJheX0gZnJvbSAnLi4vdHlwZXMnO1xuaW1wb3J0IHtEYXRhVHlwZX0gZnJvbSAnLi4vdHlwZXMnO1xuaW1wb3J0IHthc3NlcnQsIGFzc2VydE5vbk5lZ2F0aXZlSW50ZWdlckRpbWVuc2lvbnMsIGZsYXR0ZW4sIGluZmVyRHR5cGUsIGlzVHlwZWRBcnJheSwgc2l6ZUZyb21TaGFwZSwgdG9UeXBlZEFycmF5fSBmcm9tICcuLi91dGlsJztcblxuLyoqIFRoaXMgaXMgc2hhcmVkIGNvZGUgYWNyb3NzIGFsbCB0ZW5zb3IgY3JlYXRpb24gbWV0aG9kcy4gKi9cbmV4cG9ydCBmdW5jdGlvbiBtYWtlVGVuc29yKFxuICAgIHZhbHVlczogVGVuc29yTGlrZSwgc2hhcGU6IG51bWJlcltdLCBpbmZlcnJlZFNoYXBlOiBudW1iZXJbXSxcbiAgICBkdHlwZT86IERhdGFUeXBlKTogVGVuc29yIHtcbiAgaWYgKGR0eXBlID09IG51bGwpIHtcbiAgICBkdHlwZSA9IGluZmVyRHR5cGUodmFsdWVzKTtcbiAgfVxuICBpZiAoZHR5cGUgPT09ICdjb21wbGV4NjQnKSB7XG4gICAgdGhyb3cgbmV3IEVycm9yKFxuICAgICAgICBgQ2Fubm90IGNvbnN0cnVjdCBhIGNvbXBsZXg2NCB0ZW5zb3IgZGlyZWN0bHkuIGAgK1xuICAgICAgICBgUGxlYXNlIHVzZSB0Zi5jb21wbGV4KHJlYWwsIGltYWcpLmApO1xuICB9XG4gIGlmICghaXNUeXBlZEFycmF5KHZhbHVlcykgJiYgIUFycmF5LmlzQXJyYXkodmFsdWVzKSAmJlxuICAgICAgdHlwZW9mIHZhbHVlcyAhPT0gJ251bWJlcicgJiYgdHlwZW9mIHZhbHVlcyAhPT0gJ2Jvb2xlYW4nICYmXG4gICAgICB0eXBlb2YgdmFsdWVzICE9PSAnc3RyaW5nJykge1xuICAgIHRocm93IG5ldyBFcnJvcihcbiAgICAgICAgJ3ZhbHVlcyBwYXNzZWQgdG8gdGVuc29yKHZhbHVlcykgbXVzdCBiZSBhIG51bWJlci9ib29sZWFuL3N0cmluZyBvciAnICtcbiAgICAgICAgJ2FuIGFycmF5IG9mIG51bWJlcnMvYm9vbGVhbnMvc3RyaW5ncywgb3IgYSBUeXBlZEFycmF5Jyk7XG4gIH1cbiAgaWYgKHNoYXBlICE9IG51bGwpIHtcbiAgICBhc3NlcnROb25OZWdhdGl2ZUludGVnZXJEaW1lbnNpb25zKHNoYXBlKTtcblxuICAgIGNvbnN0IHByb3ZpZGVkU2l6ZSA9IHNpemVGcm9tU2hhcGUoc2hhcGUpO1xuICAgIGNvbnN0IGluZmVycmVkU2l6ZSA9IHNpemVGcm9tU2hhcGUoaW5mZXJyZWRTaGFwZSk7XG4gICAgYXNzZXJ0KFxuICAgICAgICBwcm92aWRlZFNpemUgPT09IGluZmVycmVkU2l6ZSxcbiAgICAgICAgKCkgPT5cbiAgICAgICAgICAgIGBCYXNlZCBvbiB0aGUgcHJvdmlkZWQgc2hhcGUsIFske3NoYXBlfV0sIHRoZSB0ZW5zb3Igc2hvdWxkIGhhdmUgYCArXG4gICAgICAgICAgICBgJHtwcm92aWRlZFNpemV9IHZhbHVlcyBidXQgaGFzICR7aW5mZXJyZWRTaXplfWApO1xuXG4gICAgZm9yIChsZXQgaSA9IDA7IGkgPCBpbmZlcnJlZFNoYXBlLmxlbmd0aDsgKytpKSB7XG4gICAgICBjb25zdCBpbmZlcnJlZCA9IGluZmVycmVkU2hhcGVbaV07XG4gICAgICBjb25zdCBmbGF0RGltc0RvbnRNYXRjaCA9IGkgPT09IGluZmVycmVkU2hhcGUubGVuZ3RoIC0gMSA/XG4gICAgICAgICAgaW5mZXJyZWQgIT09IHNpemVGcm9tU2hhcGUoc2hhcGUuc2xpY2UoaSkpIDpcbiAgICAgICAgICB0cnVlO1xuICAgICAgYXNzZXJ0KFxuICAgICAgICAgIGluZmVycmVkU2hhcGVbaV0gPT09IHNoYXBlW2ldIHx8ICFmbGF0RGltc0RvbnRNYXRjaCxcbiAgICAgICAgICAoKSA9PiBgRXJyb3IgY3JlYXRpbmcgYSBuZXcgVGVuc29yLiBJbmZlcnJlZCBzaGFwZSBgICtcbiAgICAgICAgICAgICAgYCgke2luZmVycmVkU2hhcGV9KSBkb2VzIG5vdCBtYXRjaCB0aGUgcHJvdmlkZWQgYCArXG4gICAgICAgICAgICAgIGBzaGFwZSAoJHtzaGFwZX0pLiBgKTtcbiAgICB9XG4gIH1cblxuICBpZiAoIWlzVHlwZWRBcnJheSh2YWx1ZXMpICYmICFBcnJheS5pc0FycmF5KHZhbHVlcykpIHtcbiAgICB2YWx1ZXMgPSBbdmFsdWVzXSBhcyBudW1iZXJbXTtcbiAgfVxuXG4gIHNoYXBlID0gc2hhcGUgfHwgaW5mZXJyZWRTaGFwZTtcbiAgdmFsdWVzID0gZHR5cGUgIT09ICdzdHJpbmcnID9cbiAgICAgIHRvVHlwZWRBcnJheSh2YWx1ZXMsIGR0eXBlKSA6XG4gICAgICBmbGF0dGVuKHZhbHVlcyBhcyBzdHJpbmdbXSwgW10sIHRydWUpIGFzIHN0cmluZ1tdO1xuICByZXR1cm4gRU5HSU5FLm1ha2VUZW5zb3IodmFsdWVzIGFzIFR5cGVkQXJyYXksIHNoYXBlLCBkdHlwZSk7XG59XG4iXX0=","/**\n * @license\n * Copyright 2020 Google LLC. All Rights Reserved.\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n * =============================================================================\n */\nimport { ENGINE } from '../engine';\nimport { Tile } from '../kernel_names';\nimport { convertToTensor } from '../tensor_util_env';\nimport * as util from '../util';\nimport { op } from './operation';\n/**\n * Construct a tensor by repeating it the number of times given by reps.\n *\n * This operation creates a new tensor by replicating `input` `reps`\n * times. The output tensor's `i`th dimension has `input.shape[i] *\n * reps[i]` elements, and the values of `input` are replicated\n * `reps[i]` times along the `i`th dimension. For example, tiling\n * `[a, b, c, d]` by `[2]` produces `[a, b, c, d, a, b, c, d]`.\n *\n * ```js\n * const a = tf.tensor1d([1, 2]);\n *\n * a.tile([2]).print(); // or a.tile([2])\n * ```\n *\n * ```js\n * const a = tf.tensor2d([1, 2, 3, 4], [2, 2]);\n *\n * a.tile([1, 2]).print(); // or a.tile([1, 2])\n * ```\n * @param x The tensor to tile.\n * @param reps Determines the number of replications per dimension.\n *\n * @doc {heading: 'Tensors', subheading: 'Slicing and Joining'}\n */\nfunction tile_(x, reps) {\n const $x = convertToTensor(x, 'x', 'tile', 'string_or_numeric');\n util.assert($x.rank === reps.length, () => `Error in transpose: rank of input ${$x.rank} ` +\n `must match length of reps ${reps}.`);\n const inputs = { x: $x };\n const attrs = { reps };\n return ENGINE.runKernel(Tile, inputs, attrs);\n}\nexport const tile = op({ tile_ });\n//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidGlsZS5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uLy4uL3RmanMtY29yZS9zcmMvb3BzL3RpbGUudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUE7Ozs7Ozs7Ozs7Ozs7OztHQWVHO0FBRUgsT0FBTyxFQUFDLE1BQU0sRUFBQyxNQUFNLFdBQVcsQ0FBQztBQUNqQyxPQUFPLEVBQUMsSUFBSSxFQUF3QixNQUFNLGlCQUFpQixDQUFDO0FBSTVELE9BQU8sRUFBQyxlQUFlLEVBQUMsTUFBTSxvQkFBb0IsQ0FBQztBQUVuRCxPQUFPLEtBQUssSUFBSSxNQUFNLFNBQVMsQ0FBQztBQUVoQyxPQUFPLEVBQUMsRUFBRSxFQUFDLE1BQU0sYUFBYSxDQUFDO0FBRS9COzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7R0F3Qkc7QUFDSCxTQUFTLEtBQUssQ0FBbUIsQ0FBZSxFQUFFLElBQWM7SUFDOUQsTUFBTSxFQUFFLEdBQUcsZUFBZSxDQUFDLENBQUMsRUFBRSxHQUFHLEVBQUUsTUFBTSxFQUFFLG1CQUFtQixDQUFDLENBQUM7SUFDaEUsSUFBSSxDQUFDLE1BQU0sQ0FDUCxFQUFFLENBQUMsSUFBSSxLQUFLLElBQUksQ0FBQyxNQUFNLEVBQ3ZCLEdBQUcsRUFBRSxDQUFDLHFDQUFxQyxFQUFFLENBQUMsSUFBSSxHQUFHO1FBQ2pELDZCQUE2QixJQUFJLEdBQUcsQ0FBQyxDQUFDO0lBRTlDLE1BQU0sTUFBTSxHQUFlLEVBQUMsQ0FBQyxFQUFFLEVBQUUsRUFBQyxDQUFDO0lBQ25DLE1BQU0sS0FBSyxHQUFjLEVBQUMsSUFBSSxFQUFDLENBQUM7SUFFaEMsT0FBTyxNQUFNLENBQUMsU0FBUyxDQUNuQixJQUFJLEVBQUUsTUFBbUMsRUFDekMsS0FBZ0MsQ0FBQyxDQUFDO0FBQ3hDLENBQUM7QUFFRCxNQUFNLENBQUMsTUFBTSxJQUFJLEdBQUcsRUFBRSxDQUFDLEVBQUMsS0FBSyxFQUFDLENBQUMsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbIi8qKlxuICogQGxpY2Vuc2VcbiAqIENvcHlyaWdodCAyMDIwIEdvb2dsZSBMTEMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuXG4gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgXCJMaWNlbnNlXCIpO1xuICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLlxuICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0XG4gKlxuICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wXG4gKlxuICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZVxuICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gXCJBUyBJU1wiIEJBU0lTLFxuICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuXG4gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kXG4gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS5cbiAqID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4gKi9cblxuaW1wb3J0IHtFTkdJTkV9IGZyb20gJy4uL2VuZ2luZSc7XG5pbXBvcnQge1RpbGUsIFRpbGVBdHRycywgVGlsZUlucHV0c30gZnJvbSAnLi4va2VybmVsX25hbWVzJztcbmltcG9ydCB7TmFtZWRBdHRyTWFwfSBmcm9tICcuLi9rZXJuZWxfcmVnaXN0cnknO1xuaW1wb3J0IHtUZW5zb3J9IGZyb20gJy4uL3RlbnNvcic7XG5pbXBvcnQge05hbWVkVGVuc29yTWFwfSBmcm9tICcuLi90ZW5zb3JfdHlwZXMnO1xuaW1wb3J0IHtjb252ZXJ0VG9UZW5zb3J9IGZyb20gJy4uL3RlbnNvcl91dGlsX2Vudic7XG5pbXBvcnQge1RlbnNvckxpa2V9IGZyb20gJy4uL3R5cGVzJztcbmltcG9ydCAqIGFzIHV0aWwgZnJvbSAnLi4vdXRpbCc7XG5cbmltcG9ydCB7b3B9IGZyb20gJy4vb3BlcmF0aW9uJztcblxuLyoqXG4gKiBDb25zdHJ1Y3QgYSB0ZW5zb3IgYnkgcmVwZWF0aW5nIGl0IHRoZSBudW1iZXIgb2YgdGltZXMgZ2l2ZW4gYnkgcmVwcy5cbiAqXG4gKiBUaGlzIG9wZXJhdGlvbiBjcmVhdGVzIGEgbmV3IHRlbnNvciBieSByZXBsaWNhdGluZyBgaW5wdXRgIGByZXBzYFxuICogdGltZXMuIFRoZSBvdXRwdXQgdGVuc29yJ3MgYGlgdGggZGltZW5zaW9uIGhhcyBgaW5wdXQuc2hhcGVbaV0gKlxuICogcmVwc1tpXWAgZWxlbWVudHMsIGFuZCB0aGUgdmFsdWVzIG9mIGBpbnB1dGAgYXJlIHJlcGxpY2F0ZWRcbiAqIGByZXBzW2ldYCB0aW1lcyBhbG9uZyB0aGUgYGlgdGggZGltZW5zaW9uLiBGb3IgZXhhbXBsZSwgdGlsaW5nXG4gKiBgW2EsIGIsIGMsIGRdYCBieSBgWzJdYCBwcm9kdWNlcyBgW2EsIGIsIGMsIGQsIGEsIGIsIGMsIGRdYC5cbiAqXG4gKiBgYGBqc1xuICogY29uc3QgYSA9IHRmLnRlbnNvcjFkKFsxLCAyXSk7XG4gKlxuICogYS50aWxlKFsyXSkucHJpbnQoKTsgICAgLy8gb3IgYS50aWxlKFsyXSlcbiAqIGBgYFxuICpcbiAqIGBgYGpzXG4gKiBjb25zdCBhID0gdGYudGVuc29yMmQoWzEsIDIsIDMsIDRdLCBbMiwgMl0pO1xuICpcbiAqIGEudGlsZShbMSwgMl0pLnByaW50KCk7ICAvLyBvciBhLnRpbGUoWzEsIDJdKVxuICogYGBgXG4gKiBAcGFyYW0geCBUaGUgdGVuc29yIHRvIHRpbGUuXG4gKiBAcGFyYW0gcmVwcyBEZXRlcm1pbmVzIHRoZSBudW1iZXIgb2YgcmVwbGljYXRpb25zIHBlciBkaW1lbnNpb24uXG4gKlxuICogQGRvYyB7aGVhZGluZzogJ1RlbnNvcnMnLCBzdWJoZWFkaW5nOiAnU2xpY2luZyBhbmQgSm9pbmluZyd9XG4gKi9cbmZ1bmN0aW9uIHRpbGVfPFQgZXh0ZW5kcyBUZW5zb3I+KHg6IFR8VGVuc29yTGlrZSwgcmVwczogbnVtYmVyW10pOiBUIHtcbiAgY29uc3QgJHggPSBjb252ZXJ0VG9UZW5zb3IoeCwgJ3gnLCAndGlsZScsICdzdHJpbmdfb3JfbnVtZXJpYycpO1xuICB1dGlsLmFzc2VydChcbiAgICAgICR4LnJhbmsgPT09IHJlcHMubGVuZ3RoLFxuICAgICAgKCkgPT4gYEVycm9yIGluIHRyYW5zcG9zZTogcmFuayBvZiBpbnB1dCAkeyR4LnJhbmt9IGAgK1xuICAgICAgICAgIGBtdXN0IG1hdGNoIGxlbmd0aCBvZiByZXBzICR7cmVwc30uYCk7XG5cbiAgY29uc3QgaW5wdXRzOiBUaWxlSW5wdXRzID0ge3g6ICR4fTtcbiAgY29uc3QgYXR0cnM6IFRpbGVBdHRycyA9IHtyZXBzfTtcblxuICByZXR1cm4gRU5HSU5FLnJ1bktlcm5lbChcbiAgICAgIFRpbGUsIGlucHV0cyBhcyB1bmtub3duIGFzIE5hbWVkVGVuc29yTWFwLFxuICAgICAgYXR0cnMgYXMgdW5rbm93biBhcyBOYW1lZEF0dHJNYXApO1xufVxuXG5leHBvcnQgY29uc3QgdGlsZSA9IG9wKHt0aWxlX30pO1xuIl19","/**\n * @license\n * Copyright 2018 Google LLC. All Rights Reserved.\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n * =============================================================================\n */\nimport { ENGINE } from '../engine';\nimport { TopK } from '../kernel_names';\nimport { convertToTensor } from '../tensor_util_env';\nimport { op } from './operation';\n/**\n * Finds the values and indices of the `k` largest entries along the last\n * dimension.\n *\n * If the input is a vector (rank=1), finds the k largest entries in the vector\n * and outputs their values and indices as vectors. Thus values[j] is the j-th\n * largest entry in input, and its index is indices[j].\n * For higher rank inputs, computes the top k entries along the last dimension.\n *\n * If two elements are equal, the lower-index element appears first.\n *\n * ```js\n * const a = tf.tensor2d([[1, 5], [4, 3]]);\n * const {values, indices} = tf.topk(a);\n * values.print();\n * indices.print();\n * ```\n * @param x 1-D or higher `tf.Tensor` with last dimension being at least `k`.\n * @param k Number of top elements to look for along the last dimension.\n * @param sorted If true, the resulting `k` elements will be sorted by the\n * values in descending order.\n *\n * @doc {heading: 'Operations', subheading: 'Evaluation'}\n */\nfunction topk_(x, k = 1, sorted = true) {\n const $x = convertToTensor(x, 'x', 'topk');\n if ($x.rank === 0) {\n throw new Error('topk() expects the input to be of rank 1 or higher');\n }\n const lastDim = $x.shape[$x.shape.length - 1];\n if (k < 0) {\n throw new Error(`'k' passed to topk() must be >= 0 but got ${k}`);\n }\n if (k > lastDim) {\n throw new Error(`'k' passed to topk() must be <= the last dimension (${lastDim}) ` +\n `but got ${k}`);\n }\n const inputs = { x: $x };\n const attrs = { k, sorted };\n const [values, indices] = ENGINE.runKernel(TopK, inputs, attrs);\n return { values, indices };\n}\nexport const topk = op({ topk_ });\n//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidG9way5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uLy4uL3RmanMtY29yZS9zcmMvb3BzL3RvcGsudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUE7Ozs7Ozs7Ozs7Ozs7OztHQWVHO0FBRUgsT0FBTyxFQUFDLE1BQU0sRUFBQyxNQUFNLFdBQVcsQ0FBQztBQUNqQyxPQUFPLEVBQUMsSUFBSSxFQUF3QixNQUFNLGlCQUFpQixDQUFDO0FBSTVELE9BQU8sRUFBQyxlQUFlLEVBQUMsTUFBTSxvQkFBb0IsQ0FBQztBQUduRCxPQUFPLEVBQUMsRUFBRSxFQUFDLE1BQU0sYUFBYSxDQUFDO0FBRS9COzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7OztHQXVCRztBQUNILFNBQVMsS0FBSyxDQUNWLENBQWUsRUFBRSxDQUFDLEdBQUcsQ0FBQyxFQUFFLE1BQU0sR0FBRyxJQUFJO0lBQ3ZDLE1BQU0sRUFBRSxHQUFHLGVBQWUsQ0FBQyxDQUFDLEVBQUUsR0FBRyxFQUFFLE1BQU0sQ0FBQyxDQUFDO0lBQzNDLElBQUksRUFBRSxDQUFDLElBQUksS0FBSyxDQUFDLEVBQUU7UUFDakIsTUFBTSxJQUFJLEtBQUssQ0FBQyxvREFBb0QsQ0FBQyxDQUFDO0tBQ3ZFO0lBQ0QsTUFBTSxPQUFPLEdBQUcsRUFBRSxDQUFDLEtBQUssQ0FBQyxFQUFFLENBQUMsS0FBSyxDQUFDLE1BQU0sR0FBRyxDQUFDLENBQUMsQ0FBQztJQUU5QyxJQUFJLENBQUMsR0FBRyxDQUFDLEVBQUU7UUFDVCxNQUFNLElBQUksS0FBSyxDQUFDLDZDQUE2QyxDQUFDLEVBQUUsQ0FBQyxDQUFDO0tBQ25FO0lBRUQsSUFBSSxDQUFDLEdBQUcsT0FBTyxFQUFFO1FBQ2YsTUFBTSxJQUFJLEtBQUssQ0FDWCx1REFBdUQsT0FBTyxJQUFJO1lBQ2xFLFdBQVcsQ0FBQyxFQUFFLENBQUMsQ0FBQztLQUNyQjtJQUVELE1BQU0sTUFBTSxHQUFlLEVBQUMsQ0FBQyxFQUFFLEVBQUUsRUFBQyxDQUFDO0lBQ25DLE1BQU0sS0FBSyxHQUFjLEVBQUMsQ0FBQyxFQUFFLE1BQU0sRUFBQyxDQUFDO0lBRXJDLE1BQU0sQ0FBQyxNQUFNLEVBQUUsT0FBTyxDQUFDLEdBQUcsTUFBTSxDQUFDLFNBQVMsQ0FDdEMsSUFBSSxFQUFFLE1BQThCLEVBQUUsS0FBMkIsQ0FBQyxDQUFDO0lBRXZFLE9BQU8sRUFBQyxNQUFNLEVBQUUsT0FBTyxFQUE0QixDQUFDO0FBQ3RELENBQUM7QUFFRCxNQUFNLENBQUMsTUFBTSxJQUFJLEdBQUcsRUFBRSxDQUFDLEVBQUMsS0FBSyxFQUFDLENBQUMsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbIi8qKlxuICogQGxpY2Vuc2VcbiAqIENvcHlyaWdodCAyMDE4IEdvb2dsZSBMTEMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuXG4gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgXCJMaWNlbnNlXCIpO1xuICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLlxuICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0XG4gKlxuICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wXG4gKlxuICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZVxuICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gXCJBUyBJU1wiIEJBU0lTLFxuICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuXG4gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kXG4gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS5cbiAqID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4gKi9cblxuaW1wb3J0IHtFTkdJTkV9IGZyb20gJy4uL2VuZ2luZSc7XG5pbXBvcnQge1RvcEssIFRvcEtBdHRycywgVG9wS0lucHV0c30gZnJvbSAnLi4va2VybmVsX25hbWVzJztcbmltcG9ydCB7TmFtZWRBdHRyTWFwfSBmcm9tICcuLi9rZXJuZWxfcmVnaXN0cnknO1xuaW1wb3J0IHtUZW5zb3J9IGZyb20gJy4uL3RlbnNvcic7XG5pbXBvcnQge05hbWVkVGVuc29yTWFwfSBmcm9tICcuLi90ZW5zb3JfdHlwZXMnO1xuaW1wb3J0IHtjb252ZXJ0VG9UZW5zb3J9IGZyb20gJy4uL3RlbnNvcl91dGlsX2Vudic7XG5pbXBvcnQge1RlbnNvckxpa2V9IGZyb20gJy4uL3R5cGVzJztcblxuaW1wb3J0IHtvcH0gZnJvbSAnLi9vcGVyYXRpb24nO1xuXG4vKipcbiAqIEZpbmRzIHRoZSB2YWx1ZXMgYW5kIGluZGljZXMgb2YgdGhlIGBrYCBsYXJnZXN0IGVudHJpZXMgYWxvbmcgdGhlIGxhc3RcbiAqIGRpbWVuc2lvbi5cbiAqXG4gKiBJZiB0aGUgaW5wdXQgaXMgYSB2ZWN0b3IgKHJhbms9MSksIGZpbmRzIHRoZSBrIGxhcmdlc3QgZW50cmllcyBpbiB0aGUgdmVjdG9yXG4gKiBhbmQgb3V0cHV0cyB0aGVpciB2YWx1ZXMgYW5kIGluZGljZXMgYXMgdmVjdG9ycy4gVGh1cyB2YWx1ZXNbal0gaXMgdGhlIGotdGhcbiAqIGxhcmdlc3QgZW50cnkgaW4gaW5wdXQsIGFuZCBpdHMgaW5kZXggaXMgaW5kaWNlc1tqXS5cbiAqIEZvciBoaWdoZXIgcmFuayBpbnB1dHMsIGNvbXB1dGVzIHRoZSB0b3AgayBlbnRyaWVzIGFsb25nIHRoZSBsYXN0IGRpbWVuc2lvbi5cbiAqXG4gKiBJZiB0d28gZWxlbWVudHMgYXJlIGVxdWFsLCB0aGUgbG93ZXItaW5kZXggZWxlbWVudCBhcHBlYXJzIGZpcnN0LlxuICpcbiAqIGBgYGpzXG4gKiBjb25zdCBhID0gdGYudGVuc29yMmQoW1sxLCA1XSwgWzQsIDNdXSk7XG4gKiBjb25zdCB7dmFsdWVzLCBpbmRpY2VzfSA9IHRmLnRvcGsoYSk7XG4gKiB2YWx1ZXMucHJpbnQoKTtcbiAqIGluZGljZXMucHJpbnQoKTtcbiAqIGBgYFxuICogQHBhcmFtIHggMS1EIG9yIGhpZ2hlciBgdGYuVGVuc29yYCB3aXRoIGxhc3QgZGltZW5zaW9uIGJlaW5nIGF0IGxlYXN0IGBrYC5cbiAqIEBwYXJhbSBrIE51bWJlciBvZiB0b3AgZWxlbWVudHMgdG8gbG9vayBmb3IgYWxvbmcgdGhlIGxhc3QgZGltZW5zaW9uLlxuICogQHBhcmFtIHNvcnRlZCBJZiB0cnVlLCB0aGUgcmVzdWx0aW5nIGBrYCBlbGVtZW50cyB3aWxsIGJlIHNvcnRlZCBieSB0aGVcbiAqICAgICB2YWx1ZXMgaW4gZGVzY2VuZGluZyBvcmRlci5cbiAqXG4gKiBAZG9jIHtoZWFkaW5nOiAnT3BlcmF0aW9ucycsIHN1YmhlYWRpbmc6ICdFdmFsdWF0aW9uJ31cbiAqL1xuZnVuY3Rpb24gdG9wa188VCBleHRlbmRzIFRlbnNvcj4oXG4gICAgeDogVHxUZW5zb3JMaWtlLCBrID0gMSwgc29ydGVkID0gdHJ1ZSk6IHt2YWx1ZXM6IFQsIGluZGljZXM6IFR9IHtcbiAgY29uc3QgJHggPSBjb252ZXJ0VG9UZW5zb3IoeCwgJ3gnLCAndG9waycpO1xuICBpZiAoJHgucmFuayA9PT0gMCkge1xuICAgIHRocm93IG5ldyBFcnJvcigndG9waygpIGV4cGVjdHMgdGhlIGlucHV0IHRvIGJlIG9mIHJhbmsgMSBvciBoaWdoZXInKTtcbiAgfVxuICBjb25zdCBsYXN0RGltID0gJHguc2hhcGVbJHguc2hhcGUubGVuZ3RoIC0gMV07XG5cbiAgaWYgKGsgPCAwKSB7XG4gICAgdGhyb3cgbmV3IEVycm9yKGAnaycgcGFzc2VkIHRvIHRvcGsoKSBtdXN0IGJlID49IDAgYnV0IGdvdCAke2t9YCk7XG4gIH1cblxuICBpZiAoayA+IGxhc3REaW0pIHtcbiAgICB0aHJvdyBuZXcgRXJyb3IoXG4gICAgICAgIGAnaycgcGFzc2VkIHRvIHRvcGsoKSBtdXN0IGJlIDw9IHRoZSBsYXN0IGRpbWVuc2lvbiAoJHtsYXN0RGltfSkgYCArXG4gICAgICAgIGBidXQgZ290ICR7a31gKTtcbiAgfVxuXG4gIGNvbnN0IGlucHV0czogVG9wS0lucHV0cyA9IHt4OiAkeH07XG4gIGNvbnN0IGF0dHJzOiBUb3BLQXR0cnMgPSB7aywgc29ydGVkfTtcblxuICBjb25zdCBbdmFsdWVzLCBpbmRpY2VzXSA9IEVOR0lORS5ydW5LZXJuZWwoXG4gICAgICBUb3BLLCBpbnB1dHMgYXMge30gYXMgTmFtZWRUZW5zb3JNYXAsIGF0dHJzIGFzIHt9IGFzIE5hbWVkQXR0ck1hcCk7XG5cbiAgcmV0dXJuIHt2YWx1ZXMsIGluZGljZXN9IGFzIHt2YWx1ZXM6IFQsIGluZGljZXM6IFR9O1xufVxuXG5leHBvcnQgY29uc3QgdG9wayA9IG9wKHt0b3BrX30pO1xuIl19","/**\n * @license\n * Copyright 2018 Google LLC. All Rights Reserved.\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n * =============================================================================\n */\nimport { ENGINE } from '../engine';\nimport { tidy } from '../globals';\nimport { Transpose } from '../kernel_names';\nimport { convertToTensor } from '../tensor_util_env';\nimport * as util from '../util';\nimport { complex } from './complex';\nimport { imag } from './imag';\nimport { neg } from './neg';\nimport { op } from './operation';\nimport { real } from './real';\n/**\n * Transposes the `tf.Tensor`. Permutes the dimensions according to `perm`.\n *\n * The returned `tf.Tensor`'s dimension `i` will correspond to the input\n * dimension `perm[i]`. If `perm` is not given, it is set to `[n-1...0]`,\n * where `n` is the rank of the input `tf.Tensor`. Hence by default, this\n * operation performs a regular matrix transpose on 2-D input `tf.Tensor`s.\n *\n * ```js\n * const a = tf.tensor2d([1, 2, 3, 4, 5, 6], [2, 3]);\n *\n * a.transpose().print(); // or tf.transpose(a)\n * ```\n *\n * @param x The tensor to transpose.\n * @param perm The permutation of the dimensions of a.\n * @param conjugate Will conjugate complex input if true.\n *\n * @doc {heading: 'Operations', subheading: 'Matrices'}\n */\nfunction transpose_(x, perm, conjugate) {\n const $x = convertToTensor(x, 'x', 'transpose');\n if (perm == null) {\n perm = $x.shape.map((s, i) => i).reverse();\n }\n util.assert($x.rank === perm.length, () => `Error in transpose: rank of input ${$x.rank} ` +\n `must match length of perm ${perm}.`);\n perm.forEach(axis => {\n util.assert(axis >= 0 && axis < $x.rank, () => `All entries in 'perm' must be between 0 and ${$x.rank - 1}` +\n ` but got ${perm}`);\n });\n if ($x.rank <= 1) {\n return $x.clone();\n }\n const inputs = { x: $x };\n const attrs = { perm };\n if ($x.dtype === 'complex64') {\n return tidy(() => {\n let $real = real($x);\n let $imag = imag($x);\n $real = ENGINE.runKernel(Transpose, { x: $real }, attrs);\n $imag = ENGINE.runKernel(Transpose, { x: $imag }, attrs);\n if (conjugate) {\n $imag = neg($imag);\n }\n return complex($real, $imag);\n });\n }\n return ENGINE.runKernel(Transpose, inputs, attrs);\n}\nexport const transpose = op({ transpose_ });\n//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidHJhbnNwb3NlLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vLi4vdGZqcy1jb3JlL3NyYy9vcHMvdHJhbnNwb3NlLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBOzs7Ozs7Ozs7Ozs7Ozs7R0FlRztBQUVILE9BQU8sRUFBQyxNQUFNLEVBQUMsTUFBTSxXQUFXLENBQUM7QUFDakMsT0FBTyxFQUFDLElBQUksRUFBQyxNQUFNLFlBQVksQ0FBQztBQUNoQyxPQUFPLEVBQUMsU0FBUyxFQUFrQyxNQUFNLGlCQUFpQixDQUFDO0FBSTNFLE9BQU8sRUFBQyxlQUFlLEVBQUMsTUFBTSxvQkFBb0IsQ0FBQztBQUVuRCxPQUFPLEtBQUssSUFBSSxNQUFNLFNBQVMsQ0FBQztBQUNoQyxPQUFPLEVBQUMsT0FBTyxFQUFDLE1BQU0sV0FBVyxDQUFDO0FBQ2xDLE9BQU8sRUFBQyxJQUFJLEVBQUMsTUFBTSxRQUFRLENBQUM7QUFDNUIsT0FBTyxFQUFDLEdBQUcsRUFBQyxNQUFNLE9BQU8sQ0FBQztBQUMxQixPQUFPLEVBQUMsRUFBRSxFQUFDLE1BQU0sYUFBYSxDQUFDO0FBQy9CLE9BQU8sRUFBQyxJQUFJLEVBQUMsTUFBTSxRQUFRLENBQUM7QUFFNUI7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7R0FtQkc7QUFDSCxTQUFTLFVBQVUsQ0FDZixDQUFlLEVBQUUsSUFBZSxFQUFFLFNBQW1CO0lBQ3ZELE1BQU0sRUFBRSxHQUFHLGVBQWUsQ0FBQyxDQUFDLEVBQUUsR0FBRyxFQUFFLFdBQVcsQ0FBQyxDQUFDO0lBRWhELElBQUksSUFBSSxJQUFJLElBQUksRUFBRTtRQUNoQixJQUFJLEdBQUcsRUFBRSxDQUFDLEtBQUssQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxFQUFFLEVBQUUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxPQUFPLEVBQUUsQ0FBQztLQUM1QztJQUNELElBQUksQ0FBQyxNQUFNLENBQ1AsRUFBRSxDQUFDLElBQUksS0FBSyxJQUFJLENBQUMsTUFBTSxFQUN2QixHQUFHLEVBQUUsQ0FBQyxxQ0FBcUMsRUFBRSxDQUFDLElBQUksR0FBRztRQUNqRCw2QkFBNkIsSUFBSSxHQUFHLENBQUMsQ0FBQztJQUM5QyxJQUFJLENBQUMsT0FBTyxDQUFDLElBQUksQ0FBQyxFQUFFO1FBQ2xCLElBQUksQ0FBQyxNQUFNLENBQ1AsSUFBSSxJQUFJLENBQUMsSUFBSSxJQUFJLEdBQUcsRUFBRSxDQUFDLElBQUksRUFDM0IsR0FBRyxFQUFFLENBQUMsK0NBQStDLEVBQUUsQ0FBQyxJQUFJLEdBQUcsQ0FBQyxFQUFFO1lBQzlELFlBQVksSUFBSSxFQUFFLENBQUMsQ0FBQztJQUM5QixDQUFDLENBQUMsQ0FBQztJQUVILElBQUksRUFBRSxDQUFDLElBQUksSUFBSSxDQUFDLEVBQUU7UUFDaEIsT0FBTyxFQUFFLENBQUMsS0FBSyxFQUFFLENBQUM7S0FDbkI7SUFFRCxNQUFNLE1BQU0sR0FBb0IsRUFBQyxDQUFDLEVBQUUsRUFBRSxFQUFDLENBQUM7SUFDeEMsTUFBTSxLQUFLLEdBQW1CLEVBQUMsSUFBSSxFQUFDLENBQUM7SUFFckMsSUFBSSxFQUFFLENBQUMsS0FBSyxLQUFLLFdBQVcsRUFBRTtRQUM1QixPQUFPLElBQUksQ0FBQyxHQUFHLEVBQUU7WUFDZixJQUFJLEtBQUssR0FBRyxJQUFJLENBQUMsRUFBRSxDQUFDLENBQUM7WUFDckIsSUFBSSxLQUFLLEdBQUcsSUFBSSxDQUFDLEVBQUUsQ0FBQyxDQUFDO1lBQ3JCLEtBQUssR0FBRyxNQUFNLENBQUMsU0FBUyxDQUNwQixTQUFTLEVBQUUsRUFBQyxDQUFDLEVBQUUsS0FBSyxFQUF5QixFQUM3QyxLQUEyQixDQUFDLENBQUM7WUFDakMsS0FBSyxHQUFHLE1BQU0sQ0FBQyxTQUFTLENBQ3BCLFNBQVMsRUFBRSxFQUFDLENBQUMsRUFBRSxLQUFLLEVBQXlCLEVBQzdDLEtBQTJCLENBQUMsQ0FBQztZQUNqQyxJQUFJLFNBQVMsRUFBRTtnQkFDYixLQUFLLEdBQUcsR0FBRyxDQUFDLEtBQUssQ0FBQyxDQUFDO2FBQ3BCO1lBQ0QsT0FBTyxPQUFPLENBQUMsS0FBSyxFQUFFLEtBQUssQ0FBQyxDQUFDO1FBQy9CLENBQUMsQ0FBQyxDQUFDO0tBQ0o7SUFFRCxPQUFPLE1BQU0sQ0FBQyxTQUFTLENBQ25CLFNBQVMsRUFBRSxNQUE4QixFQUFFLEtBQTJCLENBQUMsQ0FBQztBQUM5RSxDQUFDO0FBRUQsTUFBTSxDQUFDLE1BQU0sU0FBUyxHQUFHLEVBQUUsQ0FBQyxFQUFDLFVBQVUsRUFBQyxDQUFDLENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyIvKipcbiAqIEBsaWNlbnNlXG4gKiBDb3B5cmlnaHQgMjAxOCBHb29nbGUgTExDLiBBbGwgUmlnaHRzIFJlc2VydmVkLlxuICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlIFwiTGljZW5zZVwiKTtcbiAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS5cbiAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdFxuICpcbiAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMFxuICpcbiAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmVcbiAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuIFwiQVMgSVNcIiBCQVNJUyxcbiAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLlxuICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZFxuICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuXG4gKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuICovXG5cbmltcG9ydCB7RU5HSU5FfSBmcm9tICcuLi9lbmdpbmUnO1xuaW1wb3J0IHt0aWR5fSBmcm9tICcuLi9nbG9iYWxzJztcbmltcG9ydCB7VHJhbnNwb3NlLCBUcmFuc3Bvc2VBdHRycywgVHJhbnNwb3NlSW5wdXRzfSBmcm9tICcuLi9rZXJuZWxfbmFtZXMnO1xuaW1wb3J0IHtOYW1lZEF0dHJNYXB9IGZyb20gJy4uL2tlcm5lbF9yZWdpc3RyeSc7XG5pbXBvcnQge1RlbnNvcn0gZnJvbSAnLi4vdGVuc29yJztcbmltcG9ydCB7TmFtZWRUZW5zb3JNYXB9IGZyb20gJy4uL3RlbnNvcl90eXBlcyc7XG5pbXBvcnQge2NvbnZlcnRUb1RlbnNvcn0gZnJvbSAnLi4vdGVuc29yX3V0aWxfZW52JztcbmltcG9ydCB7VGVuc29yTGlrZX0gZnJvbSAnLi4vdHlwZXMnO1xuaW1wb3J0ICogYXMgdXRpbCBmcm9tICcuLi91dGlsJztcbmltcG9ydCB7Y29tcGxleH0gZnJvbSAnLi9jb21wbGV4JztcbmltcG9ydCB7aW1hZ30gZnJvbSAnLi9pbWFnJztcbmltcG9ydCB7bmVnfSBmcm9tICcuL25lZyc7XG5pbXBvcnQge29wfSBmcm9tICcuL29wZXJhdGlvbic7XG5pbXBvcnQge3JlYWx9IGZyb20gJy4vcmVhbCc7XG5cbi8qKlxuICogVHJhbnNwb3NlcyB0aGUgYHRmLlRlbnNvcmAuIFBlcm11dGVzIHRoZSBkaW1lbnNpb25zIGFjY29yZGluZyB0byBgcGVybWAuXG4gKlxuICogVGhlIHJldHVybmVkIGB0Zi5UZW5zb3JgJ3MgZGltZW5zaW9uIGBpYCB3aWxsIGNvcnJlc3BvbmQgdG8gdGhlIGlucHV0XG4gKiBkaW1lbnNpb24gYHBlcm1baV1gLiBJZiBgcGVybWAgaXMgbm90IGdpdmVuLCBpdCBpcyBzZXQgdG8gYFtuLTEuLi4wXWAsXG4gKiB3aGVyZSBgbmAgaXMgdGhlIHJhbmsgb2YgdGhlIGlucHV0IGB0Zi5UZW5zb3JgLiBIZW5jZSBieSBkZWZhdWx0LCB0aGlzXG4gKiBvcGVyYXRpb24gcGVyZm9ybXMgYSByZWd1bGFyIG1hdHJpeCB0cmFuc3Bvc2Ugb24gMi1EIGlucHV0IGB0Zi5UZW5zb3Jgcy5cbiAqXG4gKiBgYGBqc1xuICogY29uc3QgYSA9IHRmLnRlbnNvcjJkKFsxLCAyLCAzLCA0LCA1LCA2XSwgWzIsIDNdKTtcbiAqXG4gKiBhLnRyYW5zcG9zZSgpLnByaW50KCk7ICAvLyBvciB0Zi50cmFuc3Bvc2UoYSlcbiAqIGBgYFxuICpcbiAqIEBwYXJhbSB4IFRoZSB0ZW5zb3IgdG8gdHJhbnNwb3NlLlxuICogQHBhcmFtIHBlcm0gVGhlIHBlcm11dGF0aW9uIG9mIHRoZSBkaW1lbnNpb25zIG9mIGEuXG4gKiBAcGFyYW0gY29uanVnYXRlIFdpbGwgY29uanVnYXRlIGNvbXBsZXggaW5wdXQgaWYgdHJ1ZS5cbiAqXG4gKiBAZG9jIHtoZWFkaW5nOiAnT3BlcmF0aW9ucycsIHN1YmhlYWRpbmc6ICdNYXRyaWNlcyd9XG4gKi9cbmZ1bmN0aW9uIHRyYW5zcG9zZV88VCBleHRlbmRzIFRlbnNvcj4oXG4gICAgeDogVHxUZW5zb3JMaWtlLCBwZXJtPzogbnVtYmVyW10sIGNvbmp1Z2F0ZT86IGJvb2xlYW4pOiBUIHtcbiAgY29uc3QgJHggPSBjb252ZXJ0VG9UZW5zb3IoeCwgJ3gnLCAndHJhbnNwb3NlJyk7XG5cbiAgaWYgKHBlcm0gPT0gbnVsbCkge1xuICAgIHBlcm0gPSAkeC5zaGFwZS5tYXAoKHMsIGkpID0+IGkpLnJldmVyc2UoKTtcbiAgfVxuICB1dGlsLmFzc2VydChcbiAgICAgICR4LnJhbmsgPT09IHBlcm0ubGVuZ3RoLFxuICAgICAgKCkgPT4gYEVycm9yIGluIHRyYW5zcG9zZTogcmFuayBvZiBpbnB1dCAkeyR4LnJhbmt9IGAgK1xuICAgICAgICAgIGBtdXN0IG1hdGNoIGxlbmd0aCBvZiBwZXJtICR7cGVybX0uYCk7XG4gIHBlcm0uZm9yRWFjaChheGlzID0+IHtcbiAgICB1dGlsLmFzc2VydChcbiAgICAgICAgYXhpcyA+PSAwICYmIGF4aXMgPCAkeC5yYW5rLFxuICAgICAgICAoKSA9PiBgQWxsIGVudHJpZXMgaW4gJ3Blcm0nIG11c3QgYmUgYmV0d2VlbiAwIGFuZCAkeyR4LnJhbmsgLSAxfWAgK1xuICAgICAgICAgICAgYCBidXQgZ290ICR7cGVybX1gKTtcbiAgfSk7XG5cbiAgaWYgKCR4LnJhbmsgPD0gMSkge1xuICAgIHJldHVybiAkeC5jbG9uZSgpO1xuICB9XG5cbiAgY29uc3QgaW5wdXRzOiBUcmFuc3Bvc2VJbnB1dHMgPSB7eDogJHh9O1xuICBjb25zdCBhdHRyczogVHJhbnNwb3NlQXR0cnMgPSB7cGVybX07XG5cbiAgaWYgKCR4LmR0eXBlID09PSAnY29tcGxleDY0Jykge1xuICAgIHJldHVybiB0aWR5KCgpID0+IHtcbiAgICAgIGxldCAkcmVhbCA9IHJlYWwoJHgpO1xuICAgICAgbGV0ICRpbWFnID0gaW1hZygkeCk7XG4gICAgICAkcmVhbCA9IEVOR0lORS5ydW5LZXJuZWwoXG4gICAgICAgICAgVHJhbnNwb3NlLCB7eDogJHJlYWx9IGFzIHt9IGFzIE5hbWVkVGVuc29yTWFwLFxuICAgICAgICAgIGF0dHJzIGFzIHt9IGFzIE5hbWVkQXR0ck1hcCk7XG4gICAgICAkaW1hZyA9IEVOR0lORS5ydW5LZXJuZWwoXG4gICAgICAgICAgVHJhbnNwb3NlLCB7eDogJGltYWd9IGFzIHt9IGFzIE5hbWVkVGVuc29yTWFwLFxuICAgICAgICAgIGF0dHJzIGFzIHt9IGFzIE5hbWVkQXR0ck1hcCk7XG4gICAgICBpZiAoY29uanVnYXRlKSB7XG4gICAgICAgICRpbWFnID0gbmVnKCRpbWFnKTtcbiAgICAgIH1cbiAgICAgIHJldHVybiBjb21wbGV4KCRyZWFsLCAkaW1hZyk7XG4gICAgfSk7XG4gIH1cblxuICByZXR1cm4gRU5HSU5FLnJ1bktlcm5lbChcbiAgICAgIFRyYW5zcG9zZSwgaW5wdXRzIGFzIHt9IGFzIE5hbWVkVGVuc29yTWFwLCBhdHRycyBhcyB7fSBhcyBOYW1lZEF0dHJNYXApO1xufVxuXG5leHBvcnQgY29uc3QgdHJhbnNwb3NlID0gb3Aoe3RyYW5zcG9zZV99KTtcbiJdfQ==","/**\n * @license\n * Copyright 2020 Google LLC. All Rights Reserved.\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n * =============================================================================\n */\nimport { ENGINE } from '../engine';\nimport { Unique } from '../kernel_names';\nimport { convertToTensor } from '../tensor_util_env';\nimport { assert } from '../util';\nimport { op } from './operation';\n/**\n * Finds unique elements along an axis of a tensor.\n *\n * It returns a tensor `values` containing all of the unique elements along the\n * `axis` of the given tensor `x` in the same order that they occur along the\n * `axis` in `x`; `x` does not need to be sorted. It also returns a tensor\n * `indices` the same size as the number of the elements in `x` along the `axis`\n * dimension. It contains the index in the unique output `values`.\n *\n * ```js\n * // A 1-D tensor\n * const a = tf.tensor1d([1, 1, 2, 4, 4, 4, 7, 8, 8]);\n * const {values, indices} = tf.unique(a);\n * values.print(); // [1, 2, 4, 7, 8,]\n * indices.print(); // [0, 0, 1, 2, 2, 2, 3, 4, 4]\n * ```\n *\n * ```js\n * // A 2-D tensor with axis=0\n * //\n * // 'a' is: [[1, 0, 0],\n * // [1, 0, 0],\n * // [2, 0, 0]]\n * const a = tf.tensor2d([[1, 0, 0], [1, 0, 0], [2, 0, 0]]);\n * const {values, indices} = tf.unique(a, 0)\n * values.print(); // [[1, 0, 0],\n * // [2, 0, 0]]\n * indices.print(); // [0, 0, 1]\n * ```\n *\n * ```js\n * // A 2-D tensor with axis=1\n * //\n * // 'a' is: [[1, 0, 0],\n * // [1, 0, 0],\n * // [2, 0, 0]]\n * const a = tf.tensor2d([[1, 0, 0], [1, 0, 0], [2, 0, 0]]);\n * const {values, indices} = tf.unique(a, 1)\n * values.print(); // [[1, 0],\n * // [1, 0],\n * // [2, 0]]\n * indices.print(); // [0, 1, 1]\n * ```\n * @param x A tensor (int32, string, bool).\n * @param axis The axis of the tensor to find the unique elements.\n * @returns [uniqueElements, indices] (see above for details)\n *\n * @doc {heading: 'Operations', subheading: 'Evaluation'}\n */\nfunction unique_(x, axis = 0) {\n const $x = convertToTensor(x, 'x', 'unique', 'string_or_numeric');\n assert($x.rank > 0, () => 'The input tensor must be at least 1D');\n const inputs = { x: $x };\n const attrs = { axis };\n const [values, indices] = ENGINE.runKernel(Unique, inputs, attrs);\n return { values, indices };\n}\nexport const unique = op({ unique_ });\n//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidW5pcXVlLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vLi4vdGZqcy1jb3JlL3NyYy9vcHMvdW5pcXVlLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBOzs7Ozs7Ozs7Ozs7Ozs7R0FlRztBQUVILE9BQU8sRUFBQyxNQUFNLEVBQUMsTUFBTSxXQUFXLENBQUM7QUFDakMsT0FBTyxFQUFDLE1BQU0sRUFBNEIsTUFBTSxpQkFBaUIsQ0FBQztBQUlsRSxPQUFPLEVBQUMsZUFBZSxFQUFDLE1BQU0sb0JBQW9CLENBQUM7QUFFbkQsT0FBTyxFQUFDLE1BQU0sRUFBQyxNQUFNLFNBQVMsQ0FBQztBQUUvQixPQUFPLEVBQUMsRUFBRSxFQUFDLE1BQU0sYUFBYSxDQUFDO0FBRS9COzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7R0FnREc7QUFDSCxTQUFTLE9BQU8sQ0FDWixDQUFlLEVBQUUsSUFBSSxHQUFHLENBQUM7SUFDM0IsTUFBTSxFQUFFLEdBQUcsZUFBZSxDQUFDLENBQUMsRUFBRSxHQUFHLEVBQUUsUUFBUSxFQUFFLG1CQUFtQixDQUFDLENBQUM7SUFDbEUsTUFBTSxDQUFDLEVBQUUsQ0FBQyxJQUFJLEdBQUcsQ0FBQyxFQUFFLEdBQUcsRUFBRSxDQUFDLHNDQUFzQyxDQUFDLENBQUM7SUFFbEUsTUFBTSxNQUFNLEdBQWlCLEVBQUMsQ0FBQyxFQUFFLEVBQUUsRUFBQyxDQUFDO0lBQ3JDLE1BQU0sS0FBSyxHQUFnQixFQUFDLElBQUksRUFBQyxDQUFDO0lBQ2xDLE1BQU0sQ0FBQyxNQUFNLEVBQUUsT0FBTyxDQUFDLEdBQUcsTUFBTSxDQUFDLFNBQVMsQ0FDWixNQUFNLEVBQUUsTUFBOEIsRUFDdEMsS0FBMkIsQ0FBa0IsQ0FBQztJQUM1RSxPQUFPLEVBQUMsTUFBTSxFQUFFLE9BQU8sRUFBQyxDQUFDO0FBQzNCLENBQUM7QUFFRCxNQUFNLENBQUMsTUFBTSxNQUFNLEdBQUcsRUFBRSxDQUFDLEVBQUMsT0FBTyxFQUFDLENBQUMsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbIi8qKlxuICogQGxpY2Vuc2VcbiAqIENvcHlyaWdodCAyMDIwIEdvb2dsZSBMTEMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuXG4gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgXCJMaWNlbnNlXCIpO1xuICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLlxuICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0XG4gKlxuICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wXG4gKlxuICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZVxuICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gXCJBUyBJU1wiIEJBU0lTLFxuICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuXG4gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kXG4gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS5cbiAqID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4gKi9cblxuaW1wb3J0IHtFTkdJTkV9IGZyb20gJy4uL2VuZ2luZSc7XG5pbXBvcnQge1VuaXF1ZSwgVW5pcXVlQXR0cnMsIFVuaXF1ZUlucHV0c30gZnJvbSAnLi4va2VybmVsX25hbWVzJztcbmltcG9ydCB7TmFtZWRBdHRyTWFwfSBmcm9tICcuLi9rZXJuZWxfcmVnaXN0cnknO1xuaW1wb3J0IHtUZW5zb3IsIFRlbnNvcjFEfSBmcm9tICcuLi90ZW5zb3InO1xuaW1wb3J0IHtOYW1lZFRlbnNvck1hcH0gZnJvbSAnLi4vdGVuc29yX3R5cGVzJztcbmltcG9ydCB7Y29udmVydFRvVGVuc29yfSBmcm9tICcuLi90ZW5zb3JfdXRpbF9lbnYnO1xuaW1wb3J0IHtUZW5zb3JMaWtlfSBmcm9tICcuLi90eXBlcyc7XG5pbXBvcnQge2Fzc2VydH0gZnJvbSAnLi4vdXRpbCc7XG5cbmltcG9ydCB7b3B9IGZyb20gJy4vb3BlcmF0aW9uJztcblxuLyoqXG4gKiBGaW5kcyB1bmlxdWUgZWxlbWVudHMgYWxvbmcgYW4gYXhpcyBvZiBhIHRlbnNvci5cbiAqXG4gKiBJdCByZXR1cm5zIGEgdGVuc29yIGB2YWx1ZXNgIGNvbnRhaW5pbmcgYWxsIG9mIHRoZSB1bmlxdWUgZWxlbWVudHMgYWxvbmcgdGhlXG4gKiBgYXhpc2Agb2YgdGhlIGdpdmVuIHRlbnNvciBgeGAgaW4gdGhlIHNhbWUgb3JkZXIgdGhhdCB0aGV5IG9jY3VyIGFsb25nIHRoZVxuICogYGF4aXNgIGluIGB4YDsgYHhgIGRvZXMgbm90IG5lZWQgdG8gYmUgc29ydGVkLiBJdCBhbHNvIHJldHVybnMgYSB0ZW5zb3JcbiAqIGBpbmRpY2VzYCB0aGUgc2FtZSBzaXplIGFzIHRoZSBudW1iZXIgb2YgdGhlIGVsZW1lbnRzIGluIGB4YCBhbG9uZyB0aGUgYGF4aXNgXG4gKiBkaW1lbnNpb24uIEl0IGNvbnRhaW5zIHRoZSBpbmRleCBpbiB0aGUgdW5pcXVlIG91dHB1dCBgdmFsdWVzYC5cbiAqXG4gKiBgYGBqc1xuICogLy8gQSAxLUQgdGVuc29yXG4gKiBjb25zdCBhID0gdGYudGVuc29yMWQoWzEsIDEsIDIsIDQsIDQsIDQsIDcsIDgsIDhdKTtcbiAqIGNvbnN0IHt2YWx1ZXMsIGluZGljZXN9ID0gdGYudW5pcXVlKGEpO1xuICogdmFsdWVzLnByaW50KCk7ICAgLy8gWzEsIDIsIDQsIDcsIDgsXVxuICogaW5kaWNlcy5wcmludCgpOyAgLy8gWzAsIDAsIDEsIDIsIDIsIDIsIDMsIDQsIDRdXG4gKiBgYGBcbiAqXG4gKiBgYGBqc1xuICogLy8gQSAyLUQgdGVuc29yIHdpdGggYXhpcz0wXG4gKiAvL1xuICogLy8gJ2EnIGlzOiBbWzEsIDAsIDBdLFxuICogLy8gICAgICAgICAgWzEsIDAsIDBdLFxuICogLy8gICAgICAgICAgWzIsIDAsIDBdXVxuICogY29uc3QgYSA9IHRmLnRlbnNvcjJkKFtbMSwgMCwgMF0sIFsxLCAwLCAwXSwgWzIsIDAsIDBdXSk7XG4gKiBjb25zdCB7dmFsdWVzLCBpbmRpY2VzfSA9IHRmLnVuaXF1ZShhLCAwKVxuICogdmFsdWVzLnByaW50KCk7ICAgLy8gW1sxLCAwLCAwXSxcbiAqICAgICAgICAgICAgICAgICAgIC8vICBbMiwgMCwgMF1dXG4gKiBpbmRpY2VzLnByaW50KCk7ICAvLyBbMCwgMCwgMV1cbiAqIGBgYFxuICpcbiAqIGBgYGpzXG4gKiAvLyBBIDItRCB0ZW5zb3Igd2l0aCBheGlzPTFcbiAqIC8vXG4gKiAvLyAnYScgaXM6IFtbMSwgMCwgMF0sXG4gKiAvLyAgICAgICAgICBbMSwgMCwgMF0sXG4gKiAvLyAgICAgICAgICBbMiwgMCwgMF1dXG4gKiBjb25zdCBhID0gdGYudGVuc29yMmQoW1sxLCAwLCAwXSwgWzEsIDAsIDBdLCBbMiwgMCwgMF1dKTtcbiAqIGNvbnN0IHt2YWx1ZXMsIGluZGljZXN9ID0gdGYudW5pcXVlKGEsIDEpXG4gKiB2YWx1ZXMucHJpbnQoKTsgICAvLyBbWzEsIDBdLFxuICogICAgICAgICAgICAgICAgICAgLy8gIFsxLCAwXSxcbiAqICAgICAgICAgICAgICAgICAgIC8vICBbMiwgMF1dXG4gKiBpbmRpY2VzLnByaW50KCk7ICAvLyBbMCwgMSwgMV1cbiAqIGBgYFxuICogQHBhcmFtIHggQSB0ZW5zb3IgKGludDMyLCBzdHJpbmcsIGJvb2wpLlxuICogQHBhcmFtIGF4aXMgVGhlIGF4aXMgb2YgdGhlIHRlbnNvciB0byBmaW5kIHRoZSB1bmlxdWUgZWxlbWVudHMuXG4gKiBAcmV0dXJucyBbdW5pcXVlRWxlbWVudHMsIGluZGljZXNdIChzZWUgYWJvdmUgZm9yIGRldGFpbHMpXG4gKlxuICogQGRvYyB7aGVhZGluZzogJ09wZXJhdGlvbnMnLCBzdWJoZWFkaW5nOiAnRXZhbHVhdGlvbid9XG4gKi9cbmZ1bmN0aW9uIHVuaXF1ZV88VCBleHRlbmRzIFRlbnNvcj4oXG4gICAgeDogVHxUZW5zb3JMaWtlLCBheGlzID0gMCk6IHt2YWx1ZXM6IFQsIGluZGljZXM6IFRlbnNvcjFEfSB7XG4gIGNvbnN0ICR4ID0gY29udmVydFRvVGVuc29yKHgsICd4JywgJ3VuaXF1ZScsICdzdHJpbmdfb3JfbnVtZXJpYycpO1xuICBhc3NlcnQoJHgucmFuayA+IDAsICgpID0+ICdUaGUgaW5wdXQgdGVuc29yIG11c3QgYmUgYXQgbGVhc3QgMUQnKTtcblxuICBjb25zdCBpbnB1dHM6IFVuaXF1ZUlucHV0cyA9IHt4OiAkeH07XG4gIGNvbnN0IGF0dHJzOiBVbmlxdWVBdHRycyA9IHtheGlzfTtcbiAgY29uc3QgW3ZhbHVlcywgaW5kaWNlc10gPSBFTkdJTkUucnVuS2VybmVsKFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBVbmlxdWUsIGlucHV0cyBhcyB7fSBhcyBOYW1lZFRlbnNvck1hcCxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXR0cnMgYXMge30gYXMgTmFtZWRBdHRyTWFwKSBhcyBbVCwgVGVuc29yMURdO1xuICByZXR1cm4ge3ZhbHVlcywgaW5kaWNlc307XG59XG5cbmV4cG9ydCBjb25zdCB1bmlxdWUgPSBvcCh7dW5pcXVlX30pO1xuIl19","/**\n * @license\n * Copyright 2020 Google LLC. All Rights Reserved.\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n * =============================================================================\n */\nimport { ENGINE } from '../engine';\nimport { UnsortedSegmentSum } from '../kernel_names';\nimport { convertToTensor } from '../tensor_util_env';\nimport { assert, isInt } from '../util';\nimport { op } from './operation';\n/**\n * Computes the sum along segments of a `tf.Tensor`.\n *\n * ```js\n * const x = tf.tensor1d([1, 2, 3, 4]);\n * const segmentIds = tf.tensor1d([1, 2, 0, 1], 'int32');\n * const numSegments = 3;\n *\n * x.unsortedSegmentSum(segmentIds, numSegments).print()\n * //or tf.unsortedSegmentSum(x, segmentIds, numSegments)\n * ```\n * @param x The `tf.Tensor` that will be summed along its segments.\n * @param segmentIds A `tf.Tensor1D` whose rank is equal to the rank of `x`'s\n * dimension along the `axis`. Maps each element of `x` to a segment.\n * @param numSegments The number of distinct `segmentIds`.\n *\n * @doc {heading: 'Operations', subheading: 'Segment'}\n */\nfunction unsortedSegmentSum_(x, segmentIds, numSegments) {\n const $x = convertToTensor(x, 'x', 'unsortedSegmentSum');\n const $segmentIds = convertToTensor(segmentIds, 'segmentIds', 'unsortedSegmentSum', 'int32');\n assert(isInt(numSegments), () => 'numSegments must be of dtype int');\n const inputs = { x: $x, segmentIds: $segmentIds };\n const attrs = { numSegments };\n return ENGINE.runKernel(UnsortedSegmentSum, inputs, attrs);\n}\nexport const unsortedSegmentSum = op({ unsortedSegmentSum_ });\n//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidW5zb3J0ZWRfc2VnbWVudF9zdW0uanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi8uLi90ZmpzLWNvcmUvc3JjL29wcy91bnNvcnRlZF9zZWdtZW50X3N1bS50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQTs7Ozs7Ozs7Ozs7Ozs7O0dBZUc7QUFFSCxPQUFPLEVBQUMsTUFBTSxFQUFDLE1BQU0sV0FBVyxDQUFDO0FBQ2pDLE9BQU8sRUFBQyxrQkFBa0IsRUFBb0QsTUFBTSxpQkFBaUIsQ0FBQztBQUl0RyxPQUFPLEVBQUMsZUFBZSxFQUFDLE1BQU0sb0JBQW9CLENBQUM7QUFFbkQsT0FBTyxFQUFDLE1BQU0sRUFBRSxLQUFLLEVBQUMsTUFBTSxTQUFTLENBQUM7QUFFdEMsT0FBTyxFQUFDLEVBQUUsRUFBQyxNQUFNLGFBQWEsQ0FBQztBQUUvQjs7Ozs7Ozs7Ozs7Ozs7Ozs7R0FpQkc7QUFDSCxTQUFTLG1CQUFtQixDQUN4QixDQUFlLEVBQUUsVUFBK0IsRUFBRSxXQUFtQjtJQUN2RSxNQUFNLEVBQUUsR0FBRyxlQUFlLENBQUMsQ0FBQyxFQUFFLEdBQUcsRUFBRSxvQkFBb0IsQ0FBQyxDQUFDO0lBQ3pELE1BQU0sV0FBVyxHQUNiLGVBQWUsQ0FBQyxVQUFVLEVBQUUsWUFBWSxFQUFFLG9CQUFvQixFQUFFLE9BQU8sQ0FBQyxDQUFDO0lBQzdFLE1BQU0sQ0FBQyxLQUFLLENBQUMsV0FBVyxDQUFDLEVBQUUsR0FBRyxFQUFFLENBQUMsa0NBQWtDLENBQUMsQ0FBQztJQUVyRSxNQUFNLE1BQU0sR0FBNkIsRUFBQyxDQUFDLEVBQUUsRUFBRSxFQUFFLFVBQVUsRUFBRSxXQUFXLEVBQUMsQ0FBQztJQUMxRSxNQUFNLEtBQUssR0FBNEIsRUFBQyxXQUFXLEVBQUMsQ0FBQztJQUVyRCxPQUFPLE1BQU0sQ0FBQyxTQUFTLENBQ25CLGtCQUFrQixFQUFFLE1BQThCLEVBQ2xELEtBQTJCLENBQUMsQ0FBQztBQUNuQyxDQUFDO0FBRUQsTUFBTSxDQUFDLE1BQU0sa0JBQWtCLEdBQUcsRUFBRSxDQUFDLEVBQUMsbUJBQW1CLEVBQUMsQ0FBQyxDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiLyoqXG4gKiBAbGljZW5zZVxuICogQ29weXJpZ2h0IDIwMjAgR29vZ2xlIExMQy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC5cbiAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSBcIkxpY2Vuc2VcIik7XG4gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuXG4gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXRcbiAqXG4gKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjBcbiAqXG4gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlXG4gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiBcIkFTIElTXCIgQkFTSVMsXG4gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC5cbiAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmRcbiAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLlxuICogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbiAqL1xuXG5pbXBvcnQge0VOR0lORX0gZnJvbSAnLi4vZW5naW5lJztcbmltcG9ydCB7VW5zb3J0ZWRTZWdtZW50U3VtLCBVbnNvcnRlZFNlZ21lbnRTdW1BdHRycywgVW5zb3J0ZWRTZWdtZW50U3VtSW5wdXRzfSBmcm9tICcuLi9rZXJuZWxfbmFtZXMnO1xuaW1wb3J0IHtOYW1lZEF0dHJNYXB9IGZyb20gJy4uL2tlcm5lbF9yZWdpc3RyeSc7XG5pbXBvcnQge1RlbnNvciwgVGVuc29yMUR9IGZyb20gJy4uL3RlbnNvcic7XG5pbXBvcnQge05hbWVkVGVuc29yTWFwfSBmcm9tICcuLi90ZW5zb3JfdHlwZXMnO1xuaW1wb3J0IHtjb252ZXJ0VG9UZW5zb3J9IGZyb20gJy4uL3RlbnNvcl91dGlsX2Vudic7XG5pbXBvcnQge1RlbnNvckxpa2V9IGZyb20gJy4uL3R5cGVzJztcbmltcG9ydCB7YXNzZXJ0LCBpc0ludH0gZnJvbSAnLi4vdXRpbCc7XG5cbmltcG9ydCB7b3B9IGZyb20gJy4vb3BlcmF0aW9uJztcblxuLyoqXG4gKiBDb21wdXRlcyB0aGUgc3VtIGFsb25nIHNlZ21lbnRzIG9mIGEgYHRmLlRlbnNvcmAuXG4gKlxuICogYGBganNcbiAqIGNvbnN0IHggPSB0Zi50ZW5zb3IxZChbMSwgMiwgMywgNF0pO1xuICogY29uc3Qgc2VnbWVudElkcyA9IHRmLnRlbnNvcjFkKFsxLCAyLCAwLCAxXSwgJ2ludDMyJyk7XG4gKiBjb25zdCBudW1TZWdtZW50cyA9IDM7XG4gKlxuICogeC51bnNvcnRlZFNlZ21lbnRTdW0oc2VnbWVudElkcywgbnVtU2VnbWVudHMpLnByaW50KClcbiAqIC8vb3IgdGYudW5zb3J0ZWRTZWdtZW50U3VtKHgsIHNlZ21lbnRJZHMsIG51bVNlZ21lbnRzKVxuICogYGBgXG4gKiBAcGFyYW0geCBUaGUgYHRmLlRlbnNvcmAgdGhhdCB3aWxsIGJlIHN1bW1lZCBhbG9uZyBpdHMgc2VnbWVudHMuXG4gKiBAcGFyYW0gc2VnbWVudElkcyBBIGB0Zi5UZW5zb3IxRGAgd2hvc2UgcmFuayBpcyBlcXVhbCB0byB0aGUgcmFuayBvZiBgeGAnc1xuICogZGltZW5zaW9uIGFsb25nIHRoZSBgYXhpc2AuICBNYXBzIGVhY2ggZWxlbWVudCBvZiBgeGAgdG8gYSBzZWdtZW50LlxuICogQHBhcmFtIG51bVNlZ21lbnRzIFRoZSBudW1iZXIgb2YgZGlzdGluY3QgYHNlZ21lbnRJZHNgLlxuICpcbiAqIEBkb2Mge2hlYWRpbmc6ICdPcGVyYXRpb25zJywgc3ViaGVhZGluZzogJ1NlZ21lbnQnfVxuICovXG5mdW5jdGlvbiB1bnNvcnRlZFNlZ21lbnRTdW1fPFQgZXh0ZW5kcyBUZW5zb3I+KFxuICAgIHg6IFR8VGVuc29yTGlrZSwgc2VnbWVudElkczogVGVuc29yMUR8VGVuc29yTGlrZSwgbnVtU2VnbWVudHM6IG51bWJlcik6IFQge1xuICBjb25zdCAkeCA9IGNvbnZlcnRUb1RlbnNvcih4LCAneCcsICd1bnNvcnRlZFNlZ21lbnRTdW0nKTtcbiAgY29uc3QgJHNlZ21lbnRJZHMgPVxuICAgICAgY29udmVydFRvVGVuc29yKHNlZ21lbnRJZHMsICdzZWdtZW50SWRzJywgJ3Vuc29ydGVkU2VnbWVudFN1bScsICdpbnQzMicpO1xuICBhc3NlcnQoaXNJbnQobnVtU2VnbWVudHMpLCAoKSA9PiAnbnVtU2VnbWVudHMgbXVzdCBiZSBvZiBkdHlwZSBpbnQnKTtcblxuICBjb25zdCBpbnB1dHM6IFVuc29ydGVkU2VnbWVudFN1bUlucHV0cyA9IHt4OiAkeCwgc2VnbWVudElkczogJHNlZ21lbnRJZHN9O1xuICBjb25zdCBhdHRyczogVW5zb3J0ZWRTZWdtZW50U3VtQXR0cnMgPSB7bnVtU2VnbWVudHN9O1xuXG4gIHJldHVybiBFTkdJTkUucnVuS2VybmVsKFxuICAgICAgVW5zb3J0ZWRTZWdtZW50U3VtLCBpbnB1dHMgYXMge30gYXMgTmFtZWRUZW5zb3JNYXAsXG4gICAgICBhdHRycyBhcyB7fSBhcyBOYW1lZEF0dHJNYXApO1xufVxuXG5leHBvcnQgY29uc3QgdW5zb3J0ZWRTZWdtZW50U3VtID0gb3Aoe3Vuc29ydGVkU2VnbWVudFN1bV99KTtcbiJdfQ==","/**\n * @license\n * Copyright 2020 Google LLC. All Rights Reserved.\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n * =============================================================================\n */\nimport { ENGINE } from '../engine';\nimport { Unpack } from '../kernel_names';\nimport { convertToTensor } from '../tensor_util_env';\nimport * as util from '../util';\nimport { op } from './operation';\n/**\n * Unstacks a `tf.Tensor` of rank-`R` into a list of rank-`(R-1)` `tf.Tensor`s.\n *\n * ```js\n * const a = tf.tensor2d([1, 2, 3, 4], [2, 2]);\n *\n * tf.unstack(a).forEach(tensor => tensor.print());\n * ```\n *\n * @param x A tensor object.\n * @param axis The axis to unstack along. Defaults to 0 (the first dim).\n *\n * @doc {heading: 'Tensors', subheading: 'Slicing and Joining'}\n */\nfunction unstack_(x, axis = 0) {\n const $x = convertToTensor(x, 'x', 'unstack', 'string_or_numeric');\n util.assert(axis >= -$x.shape.length && axis < $x.shape.length, () => `Axis = ${axis} is not in [-${$x.shape.length}, ${$x.shape.length})`);\n const inputs = { value: $x };\n const attrs = { axis };\n return ENGINE.runKernel(Unpack, inputs, attrs);\n}\nexport const unstack = op({ unstack_ });\n//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidW5zdGFjay5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uLy4uL3RmanMtY29yZS9zcmMvb3BzL3Vuc3RhY2sudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUE7Ozs7Ozs7Ozs7Ozs7OztHQWVHO0FBRUgsT0FBTyxFQUFDLE1BQU0sRUFBQyxNQUFNLFdBQVcsQ0FBQztBQUNqQyxPQUFPLEVBQUMsTUFBTSxFQUE0QixNQUFNLGlCQUFpQixDQUFDO0FBSWxFLE9BQU8sRUFBQyxlQUFlLEVBQUMsTUFBTSxvQkFBb0IsQ0FBQztBQUVuRCxPQUFPLEtBQUssSUFBSSxNQUFNLFNBQVMsQ0FBQztBQUVoQyxPQUFPLEVBQUMsRUFBRSxFQUFDLE1BQU0sYUFBYSxDQUFDO0FBRS9COzs7Ozs7Ozs7Ozs7O0dBYUc7QUFDSCxTQUFTLFFBQVEsQ0FBQyxDQUFvQixFQUFFLElBQUksR0FBRyxDQUFDO0lBQzlDLE1BQU0sRUFBRSxHQUFHLGVBQWUsQ0FBQyxDQUFDLEVBQUUsR0FBRyxFQUFFLFNBQVMsRUFBRSxtQkFBbUIsQ0FBQyxDQUFDO0lBQ25FLElBQUksQ0FBQyxNQUFNLENBQ1AsSUFBSSxJQUFJLENBQUMsRUFBRSxDQUFDLEtBQUssQ0FBQyxNQUFNLElBQUksSUFBSSxHQUFHLEVBQUUsQ0FBQyxLQUFLLENBQUMsTUFBTSxFQUNsRCxHQUFHLEVBQUUsQ0FDRCxVQUFVLElBQUksZ0JBQWdCLEVBQUUsQ0FBQyxLQUFLLENBQUMsTUFBTSxLQUFLLEVBQUUsQ0FBQyxLQUFLLENBQUMsTUFBTSxHQUFHLENBQUMsQ0FBQztJQUU5RSxNQUFNLE1BQU0sR0FBaUIsRUFBQyxLQUFLLEVBQUUsRUFBRSxFQUFDLENBQUM7SUFDekMsTUFBTSxLQUFLLEdBQWdCLEVBQUMsSUFBSSxFQUFDLENBQUM7SUFFbEMsT0FBTyxNQUFNLENBQUMsU0FBUyxDQUNuQixNQUFNLEVBQUUsTUFBOEIsRUFBRSxLQUEyQixDQUFDLENBQUM7QUFDM0UsQ0FBQztBQUVELE1BQU0sQ0FBQyxNQUFNLE9BQU8sR0FBRyxFQUFFLENBQUMsRUFBQyxRQUFRLEVBQUMsQ0FBQyxDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiLyoqXG4gKiBAbGljZW5zZVxuICogQ29weXJpZ2h0IDIwMjAgR29vZ2xlIExMQy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC5cbiAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSBcIkxpY2Vuc2VcIik7XG4gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuXG4gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXRcbiAqXG4gKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjBcbiAqXG4gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlXG4gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiBcIkFTIElTXCIgQkFTSVMsXG4gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC5cbiAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmRcbiAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLlxuICogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbiAqL1xuXG5pbXBvcnQge0VOR0lORX0gZnJvbSAnLi4vZW5naW5lJztcbmltcG9ydCB7VW5wYWNrLCBVbnBhY2tBdHRycywgVW5wYWNrSW5wdXRzfSBmcm9tICcuLi9rZXJuZWxfbmFtZXMnO1xuaW1wb3J0IHtOYW1lZEF0dHJNYXB9IGZyb20gJy4uL2tlcm5lbF9yZWdpc3RyeSc7XG5pbXBvcnQge1RlbnNvcn0gZnJvbSAnLi4vdGVuc29yJztcbmltcG9ydCB7TmFtZWRUZW5zb3JNYXB9IGZyb20gJy4uL3RlbnNvcl90eXBlcyc7XG5pbXBvcnQge2NvbnZlcnRUb1RlbnNvcn0gZnJvbSAnLi4vdGVuc29yX3V0aWxfZW52JztcbmltcG9ydCB7VGVuc29yTGlrZX0gZnJvbSAnLi4vdHlwZXMnO1xuaW1wb3J0ICogYXMgdXRpbCBmcm9tICcuLi91dGlsJztcblxuaW1wb3J0IHtvcH0gZnJvbSAnLi9vcGVyYXRpb24nO1xuXG4vKipcbiAqIFVuc3RhY2tzIGEgYHRmLlRlbnNvcmAgb2YgcmFuay1gUmAgaW50byBhIGxpc3Qgb2YgcmFuay1gKFItMSlgIGB0Zi5UZW5zb3Jgcy5cbiAqXG4gKiBgYGBqc1xuICogY29uc3QgYSA9IHRmLnRlbnNvcjJkKFsxLCAyLCAzLCA0XSwgWzIsIDJdKTtcbiAqXG4gKiB0Zi51bnN0YWNrKGEpLmZvckVhY2godGVuc29yID0+IHRlbnNvci5wcmludCgpKTtcbiAqIGBgYFxuICpcbiAqIEBwYXJhbSB4IEEgdGVuc29yIG9iamVjdC5cbiAqIEBwYXJhbSBheGlzIFRoZSBheGlzIHRvIHVuc3RhY2sgYWxvbmcuIERlZmF1bHRzIHRvIDAgKHRoZSBmaXJzdCBkaW0pLlxuICpcbiAqIEBkb2Mge2hlYWRpbmc6ICdUZW5zb3JzJywgc3ViaGVhZGluZzogJ1NsaWNpbmcgYW5kIEpvaW5pbmcnfVxuICovXG5mdW5jdGlvbiB1bnN0YWNrXyh4OiBUZW5zb3J8VGVuc29yTGlrZSwgYXhpcyA9IDApOiBUZW5zb3JbXSB7XG4gIGNvbnN0ICR4ID0gY29udmVydFRvVGVuc29yKHgsICd4JywgJ3Vuc3RhY2snLCAnc3RyaW5nX29yX251bWVyaWMnKTtcbiAgdXRpbC5hc3NlcnQoXG4gICAgICBheGlzID49IC0keC5zaGFwZS5sZW5ndGggJiYgYXhpcyA8ICR4LnNoYXBlLmxlbmd0aCxcbiAgICAgICgpID0+XG4gICAgICAgICAgYEF4aXMgPSAke2F4aXN9IGlzIG5vdCBpbiBbLSR7JHguc2hhcGUubGVuZ3RofSwgJHskeC5zaGFwZS5sZW5ndGh9KWApO1xuXG4gIGNvbnN0IGlucHV0czogVW5wYWNrSW5wdXRzID0ge3ZhbHVlOiAkeH07XG4gIGNvbnN0IGF0dHJzOiBVbnBhY2tBdHRycyA9IHtheGlzfTtcblxuICByZXR1cm4gRU5HSU5FLnJ1bktlcm5lbChcbiAgICAgIFVucGFjaywgaW5wdXRzIGFzIHt9IGFzIE5hbWVkVGVuc29yTWFwLCBhdHRycyBhcyB7fSBhcyBOYW1lZEF0dHJNYXApO1xufVxuXG5leHBvcnQgY29uc3QgdW5zdGFjayA9IG9wKHt1bnN0YWNrX30pO1xuIl19","/**\n * @license\n * Copyright 2020 Google LLC. All Rights Reserved.\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n * =============================================================================\n */\nimport { ENGINE } from '../engine';\nimport { Select } from '../kernel_names';\nimport { convertToTensor } from '../tensor_util_env';\nimport { broadcastTo } from './broadcast_to';\nimport { assertAndGetBroadcastShape } from './broadcast_util';\nimport { op } from './operation';\n/**\n * Returns the elements, either `a` or `b` depending on the `condition`.\n *\n * If the condition is true, select from `a`, otherwise select from `b`.\n *\n * ```js\n * const cond = tf.tensor1d([false, false, true], 'bool');\n * const a = tf.tensor1d([1 , 2, 3]);\n * const b = tf.tensor1d([-1, -2, -3]);\n *\n * a.where(cond, b).print();\n * ```\n *\n * @param condition The input condition. Must be of dtype bool.\n * @param a If `condition` is rank 1, `a` may have a higher rank but\n * its first dimension must match the size of `condition`.\n * @param b A tensor with the same dtype as `a` and with shape that is\n * compatible with `a`.\n * @return A tensor with same dtype as `a` and `b`, and shape that is\n * broadcastable from `a` and `b`.\n *\n * @doc {heading: 'Operations', subheading: 'Logical'}\n */\nfunction where_(condition, a, b) {\n const $a = convertToTensor(a, 'a', 'where');\n const $b = convertToTensor(b, 'b', 'where');\n const $condition = convertToTensor(condition, 'condition', 'where', 'bool');\n // TODO: move this logic to forward function when the broadcastTo op is\n // implemented in WASM.\n // Find the broadcastable shape for $condition, $a, and $b.\n const broadcastShape = assertAndGetBroadcastShape(assertAndGetBroadcastShape($condition.shape, $a.shape), $b.shape);\n const $broadcastedCondition = broadcastTo($condition, broadcastShape);\n const $broadcastedA = broadcastTo($a, broadcastShape);\n const $broadcastedB = broadcastTo($b, broadcastShape);\n const inputs = {\n condition: $broadcastedCondition,\n t: $broadcastedA,\n e: $broadcastedB\n };\n return ENGINE.runKernel(Select, inputs);\n}\nexport const where = op({ where_ });\n//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoid2hlcmUuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi8uLi90ZmpzLWNvcmUvc3JjL29wcy93aGVyZS50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQTs7Ozs7Ozs7Ozs7Ozs7O0dBZUc7QUFFSCxPQUFPLEVBQUMsTUFBTSxFQUFDLE1BQU0sV0FBVyxDQUFDO0FBQ2pDLE9BQU8sRUFBQyxNQUFNLEVBQWUsTUFBTSxpQkFBaUIsQ0FBQztBQUdyRCxPQUFPLEVBQUMsZUFBZSxFQUFDLE1BQU0sb0JBQW9CLENBQUM7QUFHbkQsT0FBTyxFQUFDLFdBQVcsRUFBQyxNQUFNLGdCQUFnQixDQUFDO0FBQzNDLE9BQU8sRUFBQywwQkFBMEIsRUFBQyxNQUFNLGtCQUFrQixDQUFDO0FBQzVELE9BQU8sRUFBQyxFQUFFLEVBQUMsTUFBTSxhQUFhLENBQUM7QUFFL0I7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7R0FzQkc7QUFDSCxTQUFTLE1BQU0sQ0FDWCxTQUE0QixFQUFFLENBQWUsRUFBRSxDQUFlO0lBQ2hFLE1BQU0sRUFBRSxHQUFHLGVBQWUsQ0FBQyxDQUFDLEVBQUUsR0FBRyxFQUFFLE9BQU8sQ0FBQyxDQUFDO0lBQzVDLE1BQU0sRUFBRSxHQUFHLGVBQWUsQ0FBQyxDQUFDLEVBQUUsR0FBRyxFQUFFLE9BQU8sQ0FBQyxDQUFDO0lBQzVDLE1BQU0sVUFBVSxHQUFHLGVBQWUsQ0FBQyxTQUFTLEVBQUUsV0FBVyxFQUFFLE9BQU8sRUFBRSxNQUFNLENBQUMsQ0FBQztJQUM1RSx1RUFBdUU7SUFDdkUsdUJBQXVCO0lBQ3ZCLDJEQUEyRDtJQUMzRCxNQUFNLGNBQWMsR0FBRywwQkFBMEIsQ0FDN0MsMEJBQTBCLENBQUMsVUFBVSxDQUFDLEtBQUssRUFBRSxFQUFFLENBQUMsS0FBSyxDQUFDLEVBQUUsRUFBRSxDQUFDLEtBQUssQ0FBQyxDQUFDO0lBQ3RFLE1BQU0scUJBQXFCLEdBQUcsV0FBVyxDQUFDLFVBQVUsRUFBRSxjQUFjLENBQUMsQ0FBQztJQUN0RSxNQUFNLGFBQWEsR0FBRyxXQUFXLENBQUMsRUFBRSxFQUFFLGNBQWMsQ0FBQyxDQUFDO0lBQ3RELE1BQU0sYUFBYSxHQUFHLFdBQVcsQ0FBQyxFQUFFLEVBQUUsY0FBYyxDQUFDLENBQUM7SUFFdEQsTUFBTSxNQUFNLEdBQWlCO1FBQzNCLFNBQVMsRUFBRSxxQkFBcUI7UUFDaEMsQ0FBQyxFQUFFLGFBQWE7UUFDaEIsQ0FBQyxFQUFFLGFBQWE7S0FDakIsQ0FBQztJQUNGLE9BQU8sTUFBTSxDQUFDLFNBQVMsQ0FBQyxNQUFNLEVBQUUsTUFBOEIsQ0FBQyxDQUFDO0FBQ2xFLENBQUM7QUFFRCxNQUFNLENBQUMsTUFBTSxLQUFLLEdBQUcsRUFBRSxDQUFDLEVBQUMsTUFBTSxFQUFDLENBQUMsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbIi8qKlxuICogQGxpY2Vuc2VcbiAqIENvcHlyaWdodCAyMDIwIEdvb2dsZSBMTEMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuXG4gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgXCJMaWNlbnNlXCIpO1xuICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLlxuICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0XG4gKlxuICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wXG4gKlxuICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZVxuICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gXCJBUyBJU1wiIEJBU0lTLFxuICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuXG4gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kXG4gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS5cbiAqID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4gKi9cblxuaW1wb3J0IHtFTkdJTkV9IGZyb20gJy4uL2VuZ2luZSc7XG5pbXBvcnQge1NlbGVjdCwgU2VsZWN0SW5wdXRzfSBmcm9tICcuLi9rZXJuZWxfbmFtZXMnO1xuaW1wb3J0IHtUZW5zb3J9IGZyb20gJy4uL3RlbnNvcic7XG5pbXBvcnQge05hbWVkVGVuc29yTWFwfSBmcm9tICcuLi90ZW5zb3JfdHlwZXMnO1xuaW1wb3J0IHtjb252ZXJ0VG9UZW5zb3J9IGZyb20gJy4uL3RlbnNvcl91dGlsX2Vudic7XG5pbXBvcnQge1RlbnNvckxpa2V9IGZyb20gJy4uL3R5cGVzJztcblxuaW1wb3J0IHticm9hZGNhc3RUb30gZnJvbSAnLi9icm9hZGNhc3RfdG8nO1xuaW1wb3J0IHthc3NlcnRBbmRHZXRCcm9hZGNhc3RTaGFwZX0gZnJvbSAnLi9icm9hZGNhc3RfdXRpbCc7XG5pbXBvcnQge29wfSBmcm9tICcuL29wZXJhdGlvbic7XG5cbi8qKlxuICogUmV0dXJucyB0aGUgZWxlbWVudHMsIGVpdGhlciBgYWAgb3IgYGJgIGRlcGVuZGluZyBvbiB0aGUgYGNvbmRpdGlvbmAuXG4gKlxuICogSWYgdGhlIGNvbmRpdGlvbiBpcyB0cnVlLCBzZWxlY3QgZnJvbSBgYWAsIG90aGVyd2lzZSBzZWxlY3QgZnJvbSBgYmAuXG4gKlxuICogYGBganNcbiAqIGNvbnN0IGNvbmQgPSB0Zi50ZW5zb3IxZChbZmFsc2UsIGZhbHNlLCB0cnVlXSwgJ2Jvb2wnKTtcbiAqIGNvbnN0IGEgPSB0Zi50ZW5zb3IxZChbMSAsIDIsIDNdKTtcbiAqIGNvbnN0IGIgPSB0Zi50ZW5zb3IxZChbLTEsIC0yLCAtM10pO1xuICpcbiAqIGEud2hlcmUoY29uZCwgYikucHJpbnQoKTtcbiAqIGBgYFxuICpcbiAqIEBwYXJhbSBjb25kaXRpb24gVGhlIGlucHV0IGNvbmRpdGlvbi4gTXVzdCBiZSBvZiBkdHlwZSBib29sLlxuICogQHBhcmFtIGEgSWYgYGNvbmRpdGlvbmAgaXMgcmFuayAxLCBgYWAgbWF5IGhhdmUgYSBoaWdoZXIgcmFuayBidXRcbiAqICAgICBpdHMgZmlyc3QgZGltZW5zaW9uIG11c3QgbWF0Y2ggdGhlIHNpemUgb2YgYGNvbmRpdGlvbmAuXG4gKiBAcGFyYW0gYiBBIHRlbnNvciB3aXRoIHRoZSBzYW1lIGR0eXBlIGFzIGBhYCBhbmQgd2l0aCBzaGFwZSB0aGF0IGlzXG4gKiAgICAgY29tcGF0aWJsZSB3aXRoIGBhYC5cbiAqIEByZXR1cm4gQSB0ZW5zb3Igd2l0aCBzYW1lIGR0eXBlIGFzIGBhYCBhbmQgYGJgLCBhbmQgc2hhcGUgdGhhdCBpc1xuICogICAgIGJyb2FkY2FzdGFibGUgZnJvbSBgYWAgYW5kIGBiYC5cbiAqXG4gKiBAZG9jIHtoZWFkaW5nOiAnT3BlcmF0aW9ucycsIHN1YmhlYWRpbmc6ICdMb2dpY2FsJ31cbiAqL1xuZnVuY3Rpb24gd2hlcmVfPFQgZXh0ZW5kcyBUZW5zb3I+KFxuICAgIGNvbmRpdGlvbjogVGVuc29yfFRlbnNvckxpa2UsIGE6IFR8VGVuc29yTGlrZSwgYjogVHxUZW5zb3JMaWtlKTogVCB7XG4gIGNvbnN0ICRhID0gY29udmVydFRvVGVuc29yKGEsICdhJywgJ3doZXJlJyk7XG4gIGNvbnN0ICRiID0gY29udmVydFRvVGVuc29yKGIsICdiJywgJ3doZXJlJyk7XG4gIGNvbnN0ICRjb25kaXRpb24gPSBjb252ZXJ0VG9UZW5zb3IoY29uZGl0aW9uLCAnY29uZGl0aW9uJywgJ3doZXJlJywgJ2Jvb2wnKTtcbiAgLy8gVE9ETzogbW92ZSB0aGlzIGxvZ2ljIHRvIGZvcndhcmQgZnVuY3Rpb24gd2hlbiB0aGUgYnJvYWRjYXN0VG8gb3AgaXNcbiAgLy8gaW1wbGVtZW50ZWQgaW4gV0FTTS5cbiAgLy8gRmluZCB0aGUgYnJvYWRjYXN0YWJsZSBzaGFwZSBmb3IgJGNvbmRpdGlvbiwgJGEsIGFuZCAkYi5cbiAgY29uc3QgYnJvYWRjYXN0U2hhcGUgPSBhc3NlcnRBbmRHZXRCcm9hZGNhc3RTaGFwZShcbiAgICAgIGFzc2VydEFuZEdldEJyb2FkY2FzdFNoYXBlKCRjb25kaXRpb24uc2hhcGUsICRhLnNoYXBlKSwgJGIuc2hhcGUpO1xuICBjb25zdCAkYnJvYWRjYXN0ZWRDb25kaXRpb24gPSBicm9hZGNhc3RUbygkY29uZGl0aW9uLCBicm9hZGNhc3RTaGFwZSk7XG4gIGNvbnN0ICRicm9hZGNhc3RlZEEgPSBicm9hZGNhc3RUbygkYSwgYnJvYWRjYXN0U2hhcGUpO1xuICBjb25zdCAkYnJvYWRjYXN0ZWRCID0gYnJvYWRjYXN0VG8oJGIsIGJyb2FkY2FzdFNoYXBlKTtcblxuICBjb25zdCBpbnB1dHM6IFNlbGVjdElucHV0cyA9IHtcbiAgICBjb25kaXRpb246ICRicm9hZGNhc3RlZENvbmRpdGlvbixcbiAgICB0OiAkYnJvYWRjYXN0ZWRBLFxuICAgIGU6ICRicm9hZGNhc3RlZEJcbiAgfTtcbiAgcmV0dXJuIEVOR0lORS5ydW5LZXJuZWwoU2VsZWN0LCBpbnB1dHMgYXMge30gYXMgTmFtZWRUZW5zb3JNYXApO1xufVxuXG5leHBvcnQgY29uc3Qgd2hlcmUgPSBvcCh7d2hlcmVffSk7XG4iXX0=","/**\n * @license\n * Copyright 2018 Google LLC. All Rights Reserved.\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n * =============================================================================\n */\nimport { ENGINE } from '../engine';\nimport { makeZerosTypedArray, sizeFromShape } from '../util';\nimport { complex } from './complex';\n/**\n * Creates a `tf.Tensor` with all elements set to 0.\n *\n * ```js\n * tf.zeros([2, 2]).print();\n * ```\n *\n * @param shape An array of integers defining the output tensor shape.\n * @param dtype The type of an element in the resulting tensor. Can\n * be 'float32', 'int32' or 'bool'. Defaults to 'float'.\n *\n * @doc {heading: 'Tensors', subheading: 'Creation'}\n */\nexport function zeros(shape, dtype = 'float32') {\n if (dtype === 'complex64') {\n const real = zeros(shape, 'float32');\n const imag = zeros(shape, 'float32');\n return complex(real, imag);\n }\n const values = makeZerosTypedArray(sizeFromShape(shape), dtype);\n return ENGINE.makeTensor(values, shape, dtype);\n}\n//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiemVyb3MuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi8uLi90ZmpzLWNvcmUvc3JjL29wcy96ZXJvcy50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQTs7Ozs7Ozs7Ozs7Ozs7O0dBZUc7QUFFSCxPQUFPLEVBQUMsTUFBTSxFQUFDLE1BQU0sV0FBVyxDQUFDO0FBR2pDLE9BQU8sRUFBQyxtQkFBbUIsRUFBRSxhQUFhLEVBQUMsTUFBTSxTQUFTLENBQUM7QUFFM0QsT0FBTyxFQUFDLE9BQU8sRUFBQyxNQUFNLFdBQVcsQ0FBQztBQUVsQzs7Ozs7Ozs7Ozs7O0dBWUc7QUFDSCxNQUFNLFVBQVUsS0FBSyxDQUNqQixLQUFrQixFQUFFLFFBQWtCLFNBQVM7SUFDakQsSUFBSSxLQUFLLEtBQUssV0FBVyxFQUFFO1FBQ3pCLE1BQU0sSUFBSSxHQUFHLEtBQUssQ0FBQyxLQUFLLEVBQUUsU0FBUyxDQUFDLENBQUM7UUFDckMsTUFBTSxJQUFJLEdBQUcsS0FBSyxDQUFDLEtBQUssRUFBRSxTQUFTLENBQUMsQ0FBQztRQUNyQyxPQUFPLE9BQU8sQ0FBQyxJQUFJLEVBQUUsSUFBSSxDQUFDLENBQUM7S0FDNUI7SUFDRCxNQUFNLE1BQU0sR0FBRyxtQkFBbUIsQ0FBQyxhQUFhLENBQUMsS0FBSyxDQUFDLEVBQUUsS0FBSyxDQUFDLENBQUM7SUFDaEUsT0FBTyxNQUFNLENBQUMsVUFBVSxDQUFDLE1BQU0sRUFBRSxLQUFLLEVBQUUsS0FBSyxDQUFjLENBQUM7QUFDOUQsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbIi8qKlxuICogQGxpY2Vuc2VcbiAqIENvcHlyaWdodCAyMDE4IEdvb2dsZSBMTEMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuXG4gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgXCJMaWNlbnNlXCIpO1xuICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLlxuICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0XG4gKlxuICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wXG4gKlxuICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZVxuICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gXCJBUyBJU1wiIEJBU0lTLFxuICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuXG4gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kXG4gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS5cbiAqID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4gKi9cblxuaW1wb3J0IHtFTkdJTkV9IGZyb20gJy4uL2VuZ2luZSc7XG5pbXBvcnQge1RlbnNvcn0gZnJvbSAnLi4vdGVuc29yJztcbmltcG9ydCB7RGF0YVR5cGUsIFJhbmssIFNoYXBlTWFwfSBmcm9tICcuLi90eXBlcyc7XG5pbXBvcnQge21ha2VaZXJvc1R5cGVkQXJyYXksIHNpemVGcm9tU2hhcGV9IGZyb20gJy4uL3V0aWwnO1xuXG5pbXBvcnQge2NvbXBsZXh9IGZyb20gJy4vY29tcGxleCc7XG5cbi8qKlxuICogQ3JlYXRlcyBhIGB0Zi5UZW5zb3JgIHdpdGggYWxsIGVsZW1lbnRzIHNldCB0byAwLlxuICpcbiAqIGBgYGpzXG4gKiB0Zi56ZXJvcyhbMiwgMl0pLnByaW50KCk7XG4gKiBgYGBcbiAqXG4gKiBAcGFyYW0gc2hhcGUgQW4gYXJyYXkgb2YgaW50ZWdlcnMgZGVmaW5pbmcgdGhlIG91dHB1dCB0ZW5zb3Igc2hhcGUuXG4gKiBAcGFyYW0gZHR5cGUgVGhlIHR5cGUgb2YgYW4gZWxlbWVudCBpbiB0aGUgcmVzdWx0aW5nIHRlbnNvci4gQ2FuXG4gKiAgICAgYmUgJ2Zsb2F0MzInLCAnaW50MzInIG9yICdib29sJy4gRGVmYXVsdHMgdG8gJ2Zsb2F0Jy5cbiAqXG4gKiBAZG9jIHtoZWFkaW5nOiAnVGVuc29ycycsIHN1YmhlYWRpbmc6ICdDcmVhdGlvbid9XG4gKi9cbmV4cG9ydCBmdW5jdGlvbiB6ZXJvczxSIGV4dGVuZHMgUmFuaz4oXG4gICAgc2hhcGU6IFNoYXBlTWFwW1JdLCBkdHlwZTogRGF0YVR5cGUgPSAnZmxvYXQzMicpOiBUZW5zb3I8Uj4ge1xuICBpZiAoZHR5cGUgPT09ICdjb21wbGV4NjQnKSB7XG4gICAgY29uc3QgcmVhbCA9IHplcm9zKHNoYXBlLCAnZmxvYXQzMicpO1xuICAgIGNvbnN0IGltYWcgPSB6ZXJvcyhzaGFwZSwgJ2Zsb2F0MzInKTtcbiAgICByZXR1cm4gY29tcGxleChyZWFsLCBpbWFnKTtcbiAgfVxuICBjb25zdCB2YWx1ZXMgPSBtYWtlWmVyb3NUeXBlZEFycmF5KHNpemVGcm9tU2hhcGUoc2hhcGUpLCBkdHlwZSk7XG4gIHJldHVybiBFTkdJTkUubWFrZVRlbnNvcih2YWx1ZXMsIHNoYXBlLCBkdHlwZSkgYXMgVGVuc29yPFI+O1xufVxuIl19","/**\n * @license\n * Copyright 2018 Google LLC. All Rights Reserved.\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n * =============================================================================\n */\nimport { ENGINE } from '../engine';\nimport { ZerosLike } from '../kernel_names';\nimport { convertToTensor } from '../tensor_util_env';\nimport { op } from './operation';\n/**\n * Creates a `tf.Tensor` with all elements set to 0 with the same shape as the\n * given tensor.\n *\n * ```js\n * const x = tf.tensor([1, 2]);\n * tf.zerosLike(x).print();\n * ```\n *\n * @param x The tensor of required shape.\n *\n * @doc {heading: 'Tensors', subheading: 'Creation'}\n */\nfunction zerosLike_(x) {\n const $x = convertToTensor(x, 'x', 'zerosLike');\n const inputs = { x: $x };\n return ENGINE.runKernel(ZerosLike, inputs);\n}\nexport const zerosLike = op({ zerosLike_ });\n//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiemVyb3NfbGlrZS5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uLy4uL3RmanMtY29yZS9zcmMvb3BzL3plcm9zX2xpa2UudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUE7Ozs7Ozs7Ozs7Ozs7OztHQWVHO0FBRUgsT0FBTyxFQUFDLE1BQU0sRUFBQyxNQUFNLFdBQVcsQ0FBQztBQUNqQyxPQUFPLEVBQUMsU0FBUyxFQUFrQixNQUFNLGlCQUFpQixDQUFDO0FBRzNELE9BQU8sRUFBQyxlQUFlLEVBQUMsTUFBTSxvQkFBb0IsQ0FBQztBQUduRCxPQUFPLEVBQUMsRUFBRSxFQUFDLE1BQU0sYUFBYSxDQUFDO0FBRS9COzs7Ozs7Ozs7Ozs7R0FZRztBQUNILFNBQVMsVUFBVSxDQUFtQixDQUFlO0lBQ25ELE1BQU0sRUFBRSxHQUFHLGVBQWUsQ0FBQyxDQUFDLEVBQUUsR0FBRyxFQUFFLFdBQVcsQ0FBQyxDQUFDO0lBQ2hELE1BQU0sTUFBTSxHQUFvQixFQUFDLENBQUMsRUFBRSxFQUFFLEVBQUMsQ0FBQztJQUN4QyxPQUFPLE1BQU0sQ0FBQyxTQUFTLENBQUMsU0FBUyxFQUFFLE1BQThCLENBQUMsQ0FBQztBQUNyRSxDQUFDO0FBQ0QsTUFBTSxDQUFDLE1BQU0sU0FBUyxHQUFHLEVBQUUsQ0FBQyxFQUFDLFVBQVUsRUFBQyxDQUFDLENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyIvKipcbiAqIEBsaWNlbnNlXG4gKiBDb3B5cmlnaHQgMjAxOCBHb29nbGUgTExDLiBBbGwgUmlnaHRzIFJlc2VydmVkLlxuICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlIFwiTGljZW5zZVwiKTtcbiAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS5cbiAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdFxuICpcbiAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMFxuICpcbiAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmVcbiAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuIFwiQVMgSVNcIiBCQVNJUyxcbiAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLlxuICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZFxuICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuXG4gKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuICovXG5cbmltcG9ydCB7RU5HSU5FfSBmcm9tICcuLi9lbmdpbmUnO1xuaW1wb3J0IHtaZXJvc0xpa2UsIFplcm9zTGlrZUlucHV0c30gZnJvbSAnLi4va2VybmVsX25hbWVzJztcbmltcG9ydCB7VGVuc29yfSBmcm9tICcuLi90ZW5zb3InO1xuaW1wb3J0IHtOYW1lZFRlbnNvck1hcH0gZnJvbSAnLi4vdGVuc29yX3R5cGVzJztcbmltcG9ydCB7Y29udmVydFRvVGVuc29yfSBmcm9tICcuLi90ZW5zb3JfdXRpbF9lbnYnO1xuaW1wb3J0IHtUZW5zb3JMaWtlfSBmcm9tICcuLi90eXBlcyc7XG5cbmltcG9ydCB7b3B9IGZyb20gJy4vb3BlcmF0aW9uJztcblxuLyoqXG4gKiBDcmVhdGVzIGEgYHRmLlRlbnNvcmAgd2l0aCBhbGwgZWxlbWVudHMgc2V0IHRvIDAgd2l0aCB0aGUgc2FtZSBzaGFwZSBhcyB0aGVcbiAqIGdpdmVuIHRlbnNvci5cbiAqXG4gKiBgYGBqc1xuICogY29uc3QgeCA9IHRmLnRlbnNvcihbMSwgMl0pO1xuICogdGYuemVyb3NMaWtlKHgpLnByaW50KCk7XG4gKiBgYGBcbiAqXG4gKiBAcGFyYW0geCBUaGUgdGVuc29yIG9mIHJlcXVpcmVkIHNoYXBlLlxuICpcbiAqIEBkb2Mge2hlYWRpbmc6ICdUZW5zb3JzJywgc3ViaGVhZGluZzogJ0NyZWF0aW9uJ31cbiAqL1xuZnVuY3Rpb24gemVyb3NMaWtlXzxUIGV4dGVuZHMgVGVuc29yPih4OiBUfFRlbnNvckxpa2UpOiBUIHtcbiAgY29uc3QgJHggPSBjb252ZXJ0VG9UZW5zb3IoeCwgJ3gnLCAnemVyb3NMaWtlJyk7XG4gIGNvbnN0IGlucHV0czogWmVyb3NMaWtlSW5wdXRzID0ge3g6ICR4fTtcbiAgcmV0dXJuIEVOR0lORS5ydW5LZXJuZWwoWmVyb3NMaWtlLCBpbnB1dHMgYXMge30gYXMgTmFtZWRUZW5zb3JNYXApO1xufVxuZXhwb3J0IGNvbnN0IHplcm9zTGlrZSA9IG9wKHt6ZXJvc0xpa2VffSk7XG4iXX0=","/**\n * @license\n * Copyright 2018 Google LLC. All Rights Reserved.\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n * =============================================================================\n */\nimport { computeStrides, isString, rightPad, sizeFromShape } from './util';\n// Maximum number of values before we decide to show ellipsis.\nconst FORMAT_LIMIT_NUM_VALS = 20;\n// Number of first and last values to show when displaying a, b,...,y, z.\nconst FORMAT_NUM_FIRST_LAST_VALS = 3;\n// Number of significant digits to show.\nconst FORMAT_NUM_SIG_DIGITS = 7;\nexport function tensorToString(vals, shape, dtype, verbose) {\n const strides = computeStrides(shape);\n const padPerCol = computeMaxSizePerColumn(vals, shape, dtype, strides);\n const rank = shape.length;\n const valsLines = subTensorToString(vals, shape, dtype, strides, padPerCol);\n const lines = ['Tensor'];\n if (verbose) {\n lines.push(` dtype: ${dtype}`);\n lines.push(` rank: ${rank}`);\n lines.push(` shape: [${shape}]`);\n lines.push(` values:`);\n }\n lines.push(valsLines.map(l => ' ' + l).join('\\n'));\n return lines.join('\\n');\n}\nfunction computeMaxSizePerColumn(vals, shape, dtype, strides) {\n const n = sizeFromShape(shape);\n const numCols = strides[strides.length - 1];\n const padPerCol = new Array(numCols).fill(0);\n const rank = shape.length;\n const valuesOrTuples = dtype === 'complex64' ? createComplexTuples(vals) : vals;\n if (rank > 1) {\n for (let row = 0; row < n / numCols; row++) {\n const offset = row * numCols;\n for (let j = 0; j < numCols; j++) {\n padPerCol[j] = Math.max(padPerCol[j], valToString(valuesOrTuples[offset + j], 0, dtype).length);\n }\n }\n }\n return padPerCol;\n}\nfunction valToString(val, pad, dtype) {\n let valStr;\n if (Array.isArray(val)) {\n valStr = `${parseFloat(val[0].toFixed(FORMAT_NUM_SIG_DIGITS))} + ` +\n `${parseFloat(val[1].toFixed(FORMAT_NUM_SIG_DIGITS))}j`;\n }\n else if (isString(val)) {\n valStr = `'${val}'`;\n }\n else if (dtype === 'bool') {\n valStr = boolNumToString(val);\n }\n else {\n valStr = parseFloat(val.toFixed(FORMAT_NUM_SIG_DIGITS)).toString();\n }\n return rightPad(valStr, pad);\n}\nfunction boolNumToString(v) {\n return v === 0 ? 'false' : 'true';\n}\nfunction subTensorToString(vals, shape, dtype, strides, padPerCol, isLast = true) {\n const storagePerElement = dtype === 'complex64' ? 2 : 1;\n const size = shape[0];\n const rank = shape.length;\n if (rank === 0) {\n if (dtype === 'complex64') {\n const complexTuple = createComplexTuples(vals);\n return [valToString(complexTuple[0], 0, dtype)];\n }\n if (dtype === 'bool') {\n return [boolNumToString(vals[0])];\n }\n return [vals[0].toString()];\n }\n if (rank === 1) {\n if (size > FORMAT_LIMIT_NUM_VALS) {\n const firstValsSize = FORMAT_NUM_FIRST_LAST_VALS * storagePerElement;\n let firstVals = Array.from(vals.slice(0, firstValsSize));\n let lastVals = Array.from(vals.slice((size - FORMAT_NUM_FIRST_LAST_VALS) * storagePerElement, size * storagePerElement));\n if (dtype === 'complex64') {\n firstVals = createComplexTuples(firstVals);\n lastVals = createComplexTuples(lastVals);\n }\n return [\n '[' +\n firstVals.map((x, i) => valToString(x, padPerCol[i], dtype))\n .join(', ') +\n ', ..., ' +\n lastVals\n .map((x, i) => valToString(x, padPerCol[size - FORMAT_NUM_FIRST_LAST_VALS + i], dtype))\n .join(', ') +\n ']'\n ];\n }\n const displayVals = dtype === 'complex64' ? createComplexTuples(vals) :\n Array.from(vals);\n return [\n '[' +\n displayVals.map((x, i) => valToString(x, padPerCol[i], dtype))\n .join(', ') +\n ']'\n ];\n }\n // The array is rank 2 or more.\n const subshape = shape.slice(1);\n const substrides = strides.slice(1);\n const stride = strides[0] * storagePerElement;\n const lines = [];\n if (size > FORMAT_LIMIT_NUM_VALS) {\n for (let i = 0; i < FORMAT_NUM_FIRST_LAST_VALS; i++) {\n const start = i * stride;\n const end = start + stride;\n lines.push(...subTensorToString(vals.slice(start, end), subshape, dtype, substrides, padPerCol, false /* isLast */));\n }\n lines.push('...');\n for (let i = size - FORMAT_NUM_FIRST_LAST_VALS; i < size; i++) {\n const start = i * stride;\n const end = start + stride;\n lines.push(...subTensorToString(vals.slice(start, end), subshape, dtype, substrides, padPerCol, i === size - 1 /* isLast */));\n }\n }\n else {\n for (let i = 0; i < size; i++) {\n const start = i * stride;\n const end = start + stride;\n lines.push(...subTensorToString(vals.slice(start, end), subshape, dtype, substrides, padPerCol, i === size - 1 /* isLast */));\n }\n }\n const sep = rank === 2 ? ',' : '';\n lines[0] = '[' + lines[0] + sep;\n for (let i = 1; i < lines.length - 1; i++) {\n lines[i] = ' ' + lines[i] + sep;\n }\n let newLineSep = ',\\n';\n for (let i = 2; i < rank; i++) {\n newLineSep += '\\n';\n }\n lines[lines.length - 1] =\n ' ' + lines[lines.length - 1] + ']' + (isLast ? '' : newLineSep);\n return lines;\n}\nfunction createComplexTuples(vals) {\n const complexTuples = [];\n for (let i = 0; i < vals.length; i += 2) {\n complexTuples.push([vals[i], vals[i + 1]]);\n }\n return complexTuples;\n}\n//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidGVuc29yX2Zvcm1hdC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uL3RmanMtY29yZS9zcmMvdGVuc29yX2Zvcm1hdC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQTs7Ozs7Ozs7Ozs7Ozs7O0dBZUc7QUFHSCxPQUFPLEVBQUMsY0FBYyxFQUFFLFFBQVEsRUFBRSxRQUFRLEVBQUUsYUFBYSxFQUFDLE1BQU0sUUFBUSxDQUFDO0FBRXpFLDhEQUE4RDtBQUM5RCxNQUFNLHFCQUFxQixHQUFHLEVBQUUsQ0FBQztBQUNqQyx5RUFBeUU7QUFDekUsTUFBTSwwQkFBMEIsR0FBRyxDQUFDLENBQUM7QUFDckMsd0NBQXdDO0FBQ3hDLE1BQU0scUJBQXFCLEdBQUcsQ0FBQyxDQUFDO0FBRWhDLE1BQU0sVUFBVSxjQUFjLENBQzFCLElBQXlCLEVBQUUsS0FBZSxFQUFFLEtBQWUsRUFDM0QsT0FBZ0I7SUFDbEIsTUFBTSxPQUFPLEdBQUcsY0FBYyxDQUFDLEtBQUssQ0FBQyxDQUFDO0lBQ3RDLE1BQU0sU0FBUyxHQUFHLHVCQUF1QixDQUFDLElBQUksRUFBRSxLQUFLLEVBQUUsS0FBSyxFQUFFLE9BQU8sQ0FBQyxDQUFDO0lBQ3ZFLE1BQU0sSUFBSSxHQUFHLEtBQUssQ0FBQyxNQUFNLENBQUM7SUFDMUIsTUFBTSxTQUFTLEdBQUcsaUJBQWlCLENBQUMsSUFBSSxFQUFFLEtBQUssRUFBRSxLQUFLLEVBQUUsT0FBTyxFQUFFLFNBQVMsQ0FBQyxDQUFDO0lBQzVFLE1BQU0sS0FBSyxHQUFHLENBQUMsUUFBUSxDQUFDLENBQUM7SUFDekIsSUFBSSxPQUFPLEVBQUU7UUFDWCxLQUFLLENBQUMsSUFBSSxDQUFDLFlBQVksS0FBSyxFQUFFLENBQUMsQ0FBQztRQUNoQyxLQUFLLENBQUMsSUFBSSxDQUFDLFdBQVcsSUFBSSxFQUFFLENBQUMsQ0FBQztRQUM5QixLQUFLLENBQUMsSUFBSSxDQUFDLGFBQWEsS0FBSyxHQUFHLENBQUMsQ0FB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Q0FBQyxHQUFHLEdBQUcsR0FBRyxDQUFDLE1BQU0sQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxVQUFVLENBQUMsQ0FBQztJQUNyRSxPQUFPLEtBQUssQ0FBQztBQUNmLENBQUM7QUFFRCxTQUFTLG1CQUFtQixDQUFDLElBQ1U7SUFDckMsTUFBTSxhQUFhLEdBQTRCLEVBQUUsQ0FBQztJQUNsRCxLQUFLLElBQUksQ0FBQyxHQUFHLENBQUMsRUFBRSxDQUFDLEdBQUcsSUFBSSxDQUFDLE1BQU0sRUFBRSxDQUFDLElBQUksQ0FBQyxFQUFFO1FBQ3ZDLGFBQWEsQ0FBQyxJQUFJLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLEVBQUUsSUFBSSxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBcUIsQ0FBQyxDQUFDO0tBQ2hFO0lBQ0QsT0FBTyxhQUFhLENBQUM7QUFDdkIsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbIi8qKlxuICogQGxpY2Vuc2VcbiAqIENvcHlyaWdodCAyMDE4IEdvb2dsZSBMTEMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuXG4gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgXCJMaWNlbnNlXCIpO1xuICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLlxuICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0XG4gKlxuICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wXG4gKlxuICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZVxuICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gXCJBUyBJU1wiIEJBU0lTLFxuICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuXG4gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kXG4gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS5cbiAqID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4gKi9cblxuaW1wb3J0IHtEYXRhVHlwZSwgVHlwZWRBcnJheX0gZnJvbSAnLi90eXBlcyc7XG5pbXBvcnQge2NvbXB1dGVTdHJpZGVzLCBpc1N0cmluZywgcmlnaHRQYWQsIHNpemVGcm9tU2hhcGV9IGZyb20gJy4vdXRpbCc7XG5cbi8vIE1heGltdW0gbnVtYmVyIG9mIHZhbHVlcyBiZWZvcmUgd2UgZGVjaWRlIHRvIHNob3cgZWxsaXBzaXMuXG5jb25zdCBGT1JNQVRfTElNSVRfTlVNX1ZBTFMgPSAyMDtcbi8vIE51bWJlciBvZiBmaXJzdCBhbmQgbGFzdCB2YWx1ZXMgdG8gc2hvdyB3aGVuIGRpc3BsYXlpbmcgYSwgYiwuLi4seSwgei5cbmNvbnN0IEZPUk1BVF9OVU1fRklSU1RfTEFTVF9WQUxTID0gMztcbi8vIE51bWJlciBvZiBzaWduaWZpY2FudCBkaWdpdHMgdG8gc2hvdy5cbmNvbnN0IEZPUk1BVF9OVU1fU0lHX0RJR0lUUyA9IDc7XG5cbmV4cG9ydCBmdW5jdGlvbiB0ZW5zb3JUb1N0cmluZyhcbiAgICB2YWxzOiBUeXBlZEFycmF5fHN0cmluZ1tdLCBzaGFwZTogbnVtYmVyW10sIGR0eXBlOiBEYXRhVHlwZSxcbiAgICB2ZXJib3NlOiBib29sZWFuKSB7XG4gIGNvbnN0IHN0cmlkZXMgPSBjb21wdXRlU3RyaWRlcyhzaGFwZSk7XG4gIGNvbnN0IHBhZFBlckNvbCA9IGNvbXB1dGVNYXhTaXplUGVyQ29sdW1uKHZhbHMsIHNoYXBlLCBkdHlwZSwgc3RyaWRlcyk7XG4gIGNvbnN0IHJhbmsgPSBzaGFwZS5sZW5ndGg7XG4gIGNvbnN0IHZhbHNMaW5lcyA9IHN1YlRlbnNvclRvU3RyaW5nKHZhbHMsIHNoYXBlLCBkdHlwZSwgc3RyaWRlcywgcGFkUGVyQ29sKTtcbiAgY29uc3QgbGluZXMgPSBbJ1RlbnNvciddO1xuICBpZiAodmVyYm9zZSkge1xuICAgIGxpbmVzLnB1c2goYCAgZHR5cGU6ICR7ZHR5cGV9YCk7XG4gICAgbGluZXMucHVzaChgICByYW5rOiAke3Jhbmt9YCk7XG4gICAgbGluZXMucHVzaChgICBzaGFwZTogWyR7c2hhcGV9XWApO1xuICAgIGxpbmVzLnB1c2goYCAgdmFsdWVzOmApO1xuICB9XG4gIGxpbmVzLnB1c2godmFsc0xpbmVzLm1hcChsID0+ICcgICAgJyArIGwpLmpvaW4oJ1xcbicpKTtcbiAgcmV0dXJuIGxpbmVzLmpvaW4oJ1xcbicpO1xufVxuXG5mdW5jdGlvbiBjb21wdXRlTWF4U2l6ZVBlckNvbHVtbihcbiAgICB2YWxzOiBUeXBlZEFycmF5fHN0cmluZ1tdLCBzaGFwZTogbnVtYmVyW10sIGR0eXBlOiBEYXRhVHlwZSxcbiAgICBzdHJpZGVzOiBudW1iZXJbXSk6IG51bWJlcltdIHtcbiAgY29uc3QgbiA9IHNpemVGcm9tU2hhcGUoc2hhcGUpO1xuICBjb25zdCBudW1Db2xzID0gc3RyaWRlc1tzdHJpZGVzLmxlbmd0aCAtIDFdO1xuICBjb25zdCBwYWRQZXJDb2wgPSBuZXcgQXJyYXkobnVtQ29scykuZmlsbCgwKTtcbiAgY29uc3QgcmFuayA9IHNoYXBlLmxlbmd0aDtcbiAgY29uc3QgdmFsdWVzT3JUdXBsZXMgPVxuICAgICAgZHR5cGUgPT09ICdjb21wbGV4NjQnID8gY3JlYXRlQ29tcGxleFR1cGxlcyh2YWxzKSA6IHZhbHM7XG5cbiAgaWYgKHJhbmsgPiAxKSB7XG4gICAgZm9yIChsZXQgcm93ID0gMDsgcm93IDwgbiAvIG51bUNvbHM7IHJvdysrKSB7XG4gICAgICBjb25zdCBvZmZzZXQgPSByb3cgKiBudW1Db2xzO1xuICAgICAgZm9yIChsZXQgaiA9IDA7IGogPCBudW1Db2xzOyBqKyspIHtcbiAgICAgICAgcGFkUGVyQ29sW2pdID0gTWF0aC5tYXgoXG4gICAgICAgICAgICBwYWRQZXJDb2xbal0sXG4gICAgICAgICAgICB2YWxUb1N0cmluZyh2YWx1ZXNPclR1cGxlc1tvZmZzZXQgKyBqXSwgMCwgZHR5cGUpLmxlbmd0aCk7XG4gICAgICB9XG4gICAgfVxuICB9XG4gIHJldHVybiBwYWRQZXJDb2w7XG59XG5cbmZ1bmN0aW9uIHZhbFRvU3RyaW5nKFxuICAgIHZhbDogbnVtYmVyfHN0cmluZ3xbbnVtYmVyLCBudW1iZXJdLCBwYWQ6IG51bWJlciwgZHR5cGU6IERhdGFUeXBlKSB7XG4gIGxldCB2YWxTdHI6IHN0cmluZztcbiAgaWYgKEFycmF5LmlzQXJyYXkodmFsKSkge1xuICAgIHZhbFN0ciA9IGAke3BhcnNlRmxvYXQodmFsWzBdLnRvRml4ZWQoRk9STUFUX05VTV9TSUdfRElHSVRTKSl9ICsgYCArXG4gICAgICAgIGAke3BhcnNlRmxvYXQodmFsWzFdLnRvRml4ZWQoRk9STUFUX05VTV9TSUdfRElHSVRTKSl9amA7XG4gIH0gZWxzZSBpZiAoaXNTdHJpbmcodmFsKSkge1xuICAgIHZhbFN0ciA9IGAnJHt2YWx9J2A7XG4gIH0gZWxzZSBpZiAoZHR5cGUgPT09ICdib29sJykge1xuICAgIHZhbFN0ciA9IGJvb2xOdW1Ub1N0cmluZyh2YWwpO1xuICB9IGVsc2Uge1xuICAgIHZhbFN0ciA9IHBhcnNlRmxvYXQodmFsLnRvRml4ZWQoRk9STUFUX05VTV9TSUdfRElHSVRTKSkudG9TdHJpbmcoKTtcbiAgfVxuXG4gIHJldHVybiByaWdodFBhZCh2YWxTdHIsIHBhZCk7XG59XG5cbmZ1bmN0aW9uIGJvb2xOdW1Ub1N0cmluZyh2OiBudW1iZXIpOiBzdHJpbmcge1xuICByZXR1cm4gdiA9PT0gMCA/ICdmYWxzZScgOiAndHJ1ZSc7XG59XG5cbmZ1bmN0aW9uIHN1YlRlbnNvclRvU3RyaW5nKFxuICAgIHZhbHM6IFR5cGVkQXJyYXl8c3RyaW5nW10sIHNoYXBlOiBudW1iZXJbXSwgZHR5cGU6IERhdGFUeXBlLFxuICAgIHN0cmlkZXM6IG51bWJlcltdLCBwYWRQZXJDb2w6IG51bWJlcltdLCBpc0xhc3QgPSB0cnVlKTogc3RyaW5nW10ge1xuICBjb25zdCBzdG9yYWdlUGVyRWxlbWVudCA9IGR0eXBlID09PSAnY29tcGxleDY0JyA/IDIgOiAxO1xuXG4gIGNvbnN0IHNpemUgPSBzaGFwZVswXTtcbiAgY29uc3QgcmFuayA9IHNoYXBlLmxlbmd0aDtcbiAgaWYgKHJhbmsgPT09IDApIHtcbiAgICBpZiAoZHR5cGUgPT09ICdjb21wbGV4NjQnKSB7XG4gICAgICBjb25zdCBjb21wbGV4VHVwbGUgPSBjcmVhdGVDb21wbGV4VHVwbGVzKHZhbHMpO1xuICAgICAgcmV0dXJuIFt2YWxUb1N0cmluZyhjb21wbGV4VHVwbGVbMF0sIDAsIGR0eXBlKV07XG4gICAgfVxuICAgIGlmIChkdHlwZSA9PT0gJ2Jvb2wnKSB7XG4gICAgICByZXR1cm4gW2Jvb2xOdW1Ub1N0cmluZyh2YWxzWzBdIGFzIG51bWJlcildO1xuICAgIH1cbiAgICByZXR1cm4gW3ZhbHNbMF0udG9TdHJpbmcoKV07XG4gIH1cblxuICBpZiAocmFuayA9PT0gMSkge1xuICAgIGlmIChzaXplID4gRk9STUFUX0xJTUlUX05VTV9WQUxTKSB7XG4gICAgICBjb25zdCBmaXJzdFZhbHNTaXplID0gRk9STUFUX05VTV9GSVJTVF9MQVNUX1ZBTFMgKiBzdG9yYWdlUGVyRWxlbWVudDtcblxuICAgICAgbGV0IGZpcnN0VmFscyA9IEFycmF5LmZyb208bnVtYmVyfHN0cmluZ3xbbnVtYmVyLCBudW1iZXJdPihcbiAgICAgICAgICB2YWxzLnNsaWNlKDAsIGZpcnN0VmFsc1NpemUpKTtcbiAgICAgIGxldCBsYXN0VmFscyA9IEFycmF5LmZyb208bnVtYmVyfHN0cmluZ3xbbnVtYmVyLCBudW1iZXJdPih2YWxzLnNsaWNlKFxuICAgICAgICAgIChzaXplIC0gRk9STUFUX05VTV9GSVJTVF9MQVNUX1ZBTFMpICogc3RvcmFnZVBlckVsZW1lbnQsXG4gICAgICAgICAgc2l6ZSAqIHN0b3JhZ2VQZXJFbGVtZW50KSk7XG4gICAgICBpZiAoZHR5cGUgPT09ICdjb21wbGV4NjQnKSB7XG4gICAgICAgIGZpcnN0VmFscyA9IGNyZWF0ZUNvbXBsZXhUdXBsZXMoZmlyc3RWYWxzKTtcbiAgICAgICAgbGFzdFZhbHMgPSBjcmVhdGVDb21wbGV4VHVwbGVzKGxhc3RWYWxzKTtcbiAgICAgIH1cbiAgICAgIHJldHVybiBbXG4gICAgICAgICdbJyArXG4gICAgICAgIGZpcnN0VmFscy5tYXAoKHgsIGkpID0+IHZhbFRvU3RyaW5nKHgsIHBhZFBlckNvbFtpXSwgZHR5cGUpKVxuICAgICAgICAgICAgLmpvaW4oJywgJykgK1xuICAgICAgICAnLCAuLi4sICcgK1xuICAgICAgICBsYXN0VmFsc1xuICAgICAgICAgICAgLm1hcChcbiAgICAgICAgICAgICAgICAoeCwgaSkgPT4gdmFsVG9TdHJpbmcoXG4gICAgICAgICAgICAgICAgICAgIHgsIHBhZFBlckNvbFtzaXplIC0gRk9STUFUX05VTV9GSVJTVF9MQVNUX1ZBTFMgKyBpXSwgZHR5cGUpKVxuICAgICAgICAgICAgLmpvaW4oJywgJykgK1xuICAgICAgICAnXSdcbiAgICAgIF07XG4gICAgfVxuICAgIGNvbnN0IGRpc3BsYXlWYWxzOiBBcnJheTxudW1iZXJ8c3RyaW5nfFtudW1iZXIsIG51bWJlcl0+ID1cbiAgICAgICAgZHR5cGUgPT09ICdjb21wbGV4NjQnID8gY3JlYXRlQ29tcGxleFR1cGxlcyh2YWxzKSA6XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEFycmF5LmZyb208bnVtYmVyfHN0cmluZz4odmFscyk7XG5cbiAgICByZXR1cm4gW1xuICAgICAgJ1snICtcbiAgICAgIGRpc3BsYXlWYWxzLm1hcCgoeCwgaSkgPT4gdmFsVG9TdHJpbmcoeCwgcGFkUGVyQ29sW2ldLCBkdHlwZSkpXG4gICAgICAgICAgLmpvaW4oJywgJykgK1xuICAgICAgJ10nXG4gICAgXTtcbiAgfVxuXG4gIC8vIFRoZSBhcnJheSBpcyByYW5rIDIgb3IgbW9yZS5cbiAgY29uc3Qgc3Vic2hhcGUgPSBzaGFwZS5zbGljZSgxKTtcbiAgY29uc3Qgc3Vic3RyaWRlcyA9IHN0cmlkZXMuc2xpY2UoMSk7XG4gIGNvbnN0IHN0cmlkZSA9IHN0cmlkZXNbMF0gKiBzdG9yYWdlUGVyRWxlbWVudDtcbiAgY29uc3QgbGluZXM6IHN0cmluZ1tdID0gW107XG4gIGlmIChzaXplID4gRk9STUFUX0xJTUlUX05VTV9WQUxTKSB7XG4gICAgZm9yIChsZXQgaSA9IDA7IGkgPCBGT1JNQVRfTlVNX0ZJUlNUX0xBU1RfVkFMUzsgaSsrKSB7XG4gICAgICBjb25zdCBzdGFydCA9IGkgKiBzdHJpZGU7XG4gICAgICBjb25zdCBlbmQgPSBzdGFydCArIHN0cmlkZTtcbiAgICAgIGxpbmVzLnB1c2goLi4uc3ViVGVuc29yVG9TdHJpbmcoXG4gICAgICAgICAgdmFscy5zbGljZShzdGFydCwgZW5kKSwgc3Vic2hhcGUsIGR0eXBlLCBzdWJzdHJpZGVzLCBwYWRQZXJDb2wsXG4gICAgICAgICAgZmFsc2UgLyogaXNMYXN0ICovKSk7XG4gICAgfVxuICAgIGxpbmVzLnB1c2goJy4uLicpO1xuICAgIGZvciAobGV0IGkgPSBzaXplIC0gRk9STUFUX05VTV9GSVJTVF9MQVNUX1ZBTFM7IGkgPCBzaXplOyBpKyspIHtcbiAgICAgIGNvbnN0IHN0YXJ0ID0gaSAqIHN0cmlkZTtcbiAgICAgIGNvbnN0IGVuZCA9IHN0YXJ0ICsgc3RyaWRlO1xuICAgICAgbGluZXMucHVzaCguLi5zdWJUZW5zb3JUb1N0cmluZyhcbiAgICAgICAgICB2YWxzLnNsaWNlKHN0YXJ0LCBlbmQpLCBzdWJzaGFwZSwgZHR5cGUsIHN1YnN0cmlkZXMsIHBhZFBlckNvbCxcbiAgICAgICAgICBpID09PSBzaXplIC0gMSAvKiBpc0xhc3QgKi8pKTtcbiAgICB9XG4gIH0gZWxzZSB7XG4gICAgZm9yIChsZXQgaSA9IDA7IGkgPCBzaXplOyBpKyspIHtcbiAgICAgIGNvbnN0IHN0YXJ0ID0gaSAqIHN0cmlkZTtcbiAgICAgIGNvbnN0IGVuZCA9IHN0YXJ0ICsgc3RyaWRlO1xuICAgICAgbGluZXMucHVzaCguLi5zdWJUZW5zb3JUb1N0cmluZyhcbiAgICAgICAgICB2YWxzLnNsaWNlKHN0YXJ0LCBlbmQpLCBzdWJzaGFwZSwgZHR5cGUsIHN1YnN0cmlkZXMsIHBhZFBlckNvbCxcbiAgICAgICAgICBpID09PSBzaXplIC0gMSAvKiBpc0xhc3QgKi8pKTtcbiAgICB9XG4gIH1cbiAgY29uc3Qgc2VwID0gcmFuayA9PT0gMiA/ICcsJyA6ICcnO1xuICBsaW5lc1swXSA9ICdbJyArIGxpbmVzWzBdICsgc2VwO1xuICBmb3IgKGxldCBpID0gMTsgaSA8IGxpbmVzLmxlbmd0aCAtIDE7IGkrKykge1xuICAgIGxpbmVzW2ldID0gJyAnICsgbGluZXNbaV0gKyBzZXA7XG4gIH1cbiAgbGV0IG5ld0xpbmVTZXAgPSAnLFxcbic7XG4gIGZvciAobGV0IGkgPSAyOyBpIDwgcmFuazsgaSsrKSB7XG4gICAgbmV3TGluZVNlcCArPSAnXFxuJztcbiAgfVxuICBsaW5lc1tsaW5lcy5sZW5ndGggLSAxXSA9XG4gICAgICAnICcgKyBsaW5lc1tsaW5lcy5sZW5ndGggLSAxXSArICddJyArIChpc0xhc3QgPyAnJyA6IG5ld0xpbmVTZXApO1xuICByZXR1cm4gbGluZXM7XG59XG5cbmZ1bmN0aW9uIGNyZWF0ZUNvbXBsZXhUdXBsZXModmFsczogQXJyYXk8e30+fFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICBUeXBlZEFycmF5KTogQXJyYXk8W251bWJlciwgbnVtYmVyXT4ge1xuICBjb25zdCBjb21wbGV4VHVwbGVzOiBBcnJheTxbbnVtYmVyLCBudW1iZXJdPiA9IFtdO1xuICBmb3IgKGxldCBpID0gMDsgaSA8IHZhbHMubGVuZ3RoOyBpICs9IDIpIHtcbiAgICBjb21wbGV4VHVwbGVzLnB1c2goW3ZhbHNbaV0sIHZhbHNbaSArIDFdXSBhcyBbbnVtYmVyLCBudW1iZXJdKTtcbiAgfVxuICByZXR1cm4gY29tcGxleFR1cGxlcztcbn1cbiJdfQ==","/**\n * @license\n * Copyright 2017 Google LLC. All Rights Reserved.\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n * =============================================================================\n */\n// Workaround for: https://github.com/bazelbuild/rules_nodejs/issues/1265\n/// \nimport { getGlobal } from './global_util';\nimport { tensorToString } from './tensor_format';\nimport * as util from './util';\nimport { computeStrides, toNestedArray } from './util';\n/**\n * A mutable object, similar to `tf.Tensor`, that allows users to set values\n * at locations before converting to an immutable `tf.Tensor`.\n *\n * See `tf.buffer` for creating a tensor buffer.\n *\n * @doc {heading: 'Tensors', subheading: 'Classes'}\n */\nexport class TensorBuffer {\n constructor(shape, dtype, values) {\n this.dtype = dtype;\n this.shape = shape.slice();\n this.size = util.sizeFromShape(shape);\n if (values != null) {\n const n = values.length;\n util.assert(n === this.size, () => `Length of values '${n}' does not match the size ` +\n `inferred by the shape '${this.size}'.`);\n }\n if (dtype === 'complex64') {\n throw new Error(`complex64 dtype TensorBuffers are not supported. Please create ` +\n `a TensorBuffer for the real and imaginary parts separately and ` +\n `call tf.complex(real, imag).`);\n }\n this.values = values || util.getArrayFromDType(dtype, this.size);\n this.strides = computeStrides(shape);\n }\n /**\n * Sets a value in the buffer at a given location.\n *\n * @param value The value to set.\n * @param locs The location indices.\n *\n * @doc {heading: 'Tensors', subheading: 'Creation'}\n */\n set(value, ...locs) {\n if (locs.length === 0) {\n locs = [0];\n }\n util.assert(locs.length === this.rank, () => `The number of provided coordinates (${locs.length}) must ` +\n `match the rank (${this.rank})`);\n const index = this.locToIndex(locs);\n this.values[index] = value;\n }\n /**\n * Returns the value in the buffer at the provided location.\n *\n * @param locs The location indices.\n *\n * @doc {heading: 'Tensors', subheading: 'Creation'}\n */\n get(...locs) {\n if (locs.length === 0) {\n locs = [0];\n }\n let i = 0;\n for (const loc of locs) {\n if (loc < 0 || loc >= this.shape[i]) {\n const msg = `Requested out of range element at ${locs}. ` +\n ` Buffer shape=${this.shape}`;\n throw new Error(msg);\n }\n i++;\n }\n let index = locs[locs.length - 1];\n for (let i = 0; i < locs.length - 1; ++i) {\n index += this.strides[i] * locs[i];\n }\n return this.values[index];\n }\n locToIndex(locs) {\n if (this.rank === 0) {\n return 0;\n }\n else if (this.rank === 1) {\n return locs[0];\n }\n let index = locs[locs.length - 1];\n for (let i = 0; i < locs.length - 1; ++i) {\n index += this.strides[i] * locs[i];\n }\n return index;\n }\n indexToLoc(index) {\n if (this.rank === 0) {\n return [];\n }\n else if (this.rank === 1) {\n return [index];\n }\n const locs = new Array(this.shape.length);\n for (let i = 0; i < locs.length - 1; ++i) {\n locs[i] = Math.floor(index / this.strides[i]);\n index -= locs[i] * this.strides[i];\n }\n locs[locs.length - 1] = index;\n return locs;\n }\n get rank() {\n return this.shape.length;\n }\n /**\n * Creates an immutable `tf.Tensor` object from the buffer.\n *\n * @doc {heading: 'Tensors', subheading: 'Creation'}\n */\n toTensor() {\n return trackerFn().makeTensor(this.values, this.shape, this.dtype);\n }\n}\n// For tracking tensor creation and disposal.\nlet trackerFn = null;\n// Used by chaining methods to call into ops.\nlet opHandler = null;\n// Used to warn about deprecated methods.\nlet deprecationWarningFn = null;\n// This here so that we can use this method on dev branches and keep the\n// functionality at master.\n// tslint:disable-next-line:no-unused-expression\n[deprecationWarningFn];\n/**\n * An external consumer can register itself as the tensor tracker. This way\n * the Tensor class can notify the tracker for every tensor created and\n * disposed.\n */\nexport function setTensorTracker(fn) {\n trackerFn = fn;\n}\n/**\n * An external consumer can register itself as the op handler. This way the\n * Tensor class can have chaining methods that call into ops via the op\n * handler.\n */\nexport function setOpHandler(handler) {\n opHandler = handler;\n}\n/**\n * Sets the deprecation warning function to be used by this file. This way the\n * Tensor class can be a leaf but still use the environment.\n */\nexport function setDeprecationWarningFn(fn) {\n deprecationWarningFn = fn;\n}\n/**\n * A `tf.Tensor` object represents an immutable, multidimensional array of\n * numbers that has a shape and a data type.\n *\n * For performance reasons, functions that create tensors do not necessarily\n * perform a copy of the data passed to them (e.g. if the data is passed as a\n * `Float32Array`), and changes to the data will change the tensor. This is not\n * a feature and is not supported. To avoid this behavior, use the tensor before\n * changing the input data or create a copy with `copy = tf.add(yourTensor, 0)`.\n *\n * See `tf.tensor` for details on how to create a `tf.Tensor`.\n *\n * @doc {heading: 'Tensors', subheading: 'Classes'}\n */\nexport class Tensor {\n constructor(shape, dtype, dataId, id) {\n /** Whether this tensor has been globally kept. */\n this.kept = false;\n this.isDisposedInternal = false;\n this.shape = shape.slice();\n this.dtype = dtype || 'float32';\n this.size = util.sizeFromShape(shape);\n this.strides = computeStrides(shape);\n this.dataId = dataId;\n this.id = id;\n this.rankType = (this.rank < 5 ? this.rank.toString() : 'higher');\n }\n get rank() {\n return this.shape.length;\n }\n /**\n * Returns a promise of `tf.TensorBuffer` that holds the underlying data.\n *\n * @doc {heading: 'Tensors', subheading: 'Classes'}\n */\n async buffer() {\n const vals = await this.data();\n return opHandler.buffer(this.shape, this.dtype, vals);\n }\n /**\n * Returns a `tf.TensorBuffer` that holds the underlying data.\n * @doc {heading: 'Tensors', subheading: 'Classes'}\n */\n bufferSync() {\n return opHandler.buffer(this.shape, this.dtype, this.dataSync());\n }\n /**\n * Returns the tensor data as a nested array. The transfer of data is done\n * asynchronously.\n *\n * @doc {heading: 'Tensors', subheading: 'Classes'}\n */\n async array() {\n const vals = await this.data();\n return toNestedArray(this.shape, vals, this.dtype === 'complex64');\n }\n /**\n * Returns the tensor data as a nested array. The transfer of data is done\n * synchronously.\n *\n * @doc {heading: 'Tensors', subheading: 'Classes'}\n */\n arraySync() {\n return toNestedArray(this.shape, this.dataSync(), this.dtype === 'complex64');\n }\n /**\n * Asynchronously downloads the values from the `tf.Tensor`. Returns a\n * promise of `TypedArray` that resolves when the computation has finished.\n *\n * @doc {heading: 'Tensors', subheading: 'Classes'}\n */\n async data() {\n this.throwIfDisposed();\n const data = trackerFn().read(this.dataId);\n if (this.dtype === 'string') {\n const bytes = await data;\n try {\n return bytes.map(b => util.decodeString(b));\n }\n catch (_a) {\n throw new Error('Failed to decode the string bytes into utf-8. ' +\n 'To get the original bytes, call tensor.bytes().');\n }\n }\n return data;\n }\n /**\n * Copy the tensor's data to a new GPU resource. Comparing to the `dataSync()`\n * and `data()`, this method prevents data from being downloaded to CPU.\n *\n * For WebGL backend, the data will be stored on a densely packed texture.\n * This means that the texture will use the RGBA channels to store value.\n *\n * For WebGPU backend, the data will be stored on a buffer. There is no\n * parameter, so can not use a user-defined size to create the buffer.\n *\n * @param options:\n * For WebGL,\n * - customTexShape: Optional. If set, will use the user defined\n * texture shape to create the texture.\n *\n * @returns For WebGL backend, a GPUData contains the new texture and\n * its information.\n * {\n * tensorRef: The tensor that is associated with this texture,\n * texture: WebGLTexture,\n * texShape: [number, number] // [height, width]\n * }\n *\n * For WebGPU backend, a GPUData contains the new buffer and\n * its information.\n * {\n * tensorRef: The tensor that is associated with this buffer,\n * buffer: GPUBuffer,\n * bufSize: number\n * }\n *\n * Remember to dispose the GPUData after it is used by\n * `res.tensorRef.dispose()`.\n *\n * @doc {heading: 'Tensors', subheading: 'Classes'}\n */\n dataToGPU(options) {\n this.throwIfDisposed();\n return trackerFn().readToGPU(this.dataId, options);\n }\n /**\n * Synchronously downloads the values from the `tf.Tensor`. This blocks the\n * UI thread until the values are ready, which can cause performance issues.\n *\n * @doc {heading: 'Tensors', subheading: 'Classes'}\n */\n dataSync() {\n this.throwIfDisposed();\n const data = trackerFn().readSync(this.dataId);\n if (this.dtype === 'string') {\n try {\n return data.map(b => util.decodeString(b));\n }\n catch (_a) {\n throw new Error('Failed to decode the string bytes into utf-8. ' +\n 'To get the original bytes, call tensor.bytes().');\n }\n }\n return data;\n }\n /** Returns the underlying bytes of the tensor's data. */\n async bytes() {\n this.throwIfDisposed();\n const data = await trackerFn().read(this.dataId);\n if (this.dtype === 'string') {\n return data;\n }\n else {\n return new Uint8Array(data.buffer);\n }\n }\n /**\n * Disposes `tf.Tensor` from memory.\n *\n * @doc {heading: 'Tensors', subheading: 'Classes'}\n */\n dispose() {\n if (this.isDisposed) {\n return;\n }\n trackerFn().disposeTensor(this);\n this.isDisposedInternal = true;\n }\n get isDisposed() {\n return this.isDisposedInternal;\n }\n throwIfDisposed() {\n if (this.isDisposed) {\n throw new Error(`Tensor is disposed.`);\n }\n }\n /**\n * Prints the `tf.Tensor`. See `tf.print` for details.\n *\n * @param verbose Whether to print verbose information about the tensor,\n * including dtype and size.\n *\n * @doc {heading: 'Tensors', subheading: 'Classes'}\n */\n print(verbose = false) {\n return opHandler.print(this, verbose);\n }\n /**\n * Returns a copy of the tensor. See `tf.clone` for details.\n * @doc {heading: 'Tensors', subheading: 'Classes'}\n */\n clone() {\n this.throwIfDisposed();\n return opHandler.clone(this);\n }\n /**\n * Returns a human-readable description of the tensor. Useful for logging.\n *\n * @doc {heading: 'Tensors', subheading: 'Classes'}\n */\n toString(verbose = false) {\n const vals = this.dataSync();\n return tensorToString(vals, this.shape, this.dtype, verbose);\n }\n cast(dtype) {\n this.throwIfDisposed();\n return opHandler.cast(this, dtype);\n }\n variable(trainable = true, name, dtype) {\n this.throwIfDisposed();\n return trackerFn().makeVariable(this, trainable, name, dtype);\n }\n}\nObject.defineProperty(Tensor, Symbol.hasInstance, {\n value: (instance) => {\n // Implementation note: we should use properties of the object that will be\n // defined before the constructor body has finished executing (methods).\n // This is because when this code is transpiled by babel, babel will call\n // classCallCheck before the constructor body is run.\n // See https://github.com/tensorflow/tfjs/issues/3384 for backstory.\n return !!instance && instance.data != null && instance.dataSync != null &&\n instance.throwIfDisposed != null;\n }\n});\nexport function getGlobalTensorClass() {\n // Use getGlobal so that we can augment the Tensor class across package\n // boundaries becase the node resolution alg may result in different modules\n // being returned for this file depending on the path they are loaded from.\n return getGlobal('Tensor', () => {\n return Tensor;\n });\n}\n// Global side effect. Cache global reference to Tensor class\ngetGlobalTensorClass();\n/**\n * A mutable `tf.Tensor`, useful for persisting state, e.g. for training.\n *\n * @doc {heading: 'Tensors', subheading: 'Classes'}\n */\nexport class Variable extends Tensor {\n constructor(initialValue, trainable, name, tensorId) {\n super(initialValue.shape, initialValue.dtype, initialValue.dataId, tensorId);\n this.trainable = trainable;\n this.name = name;\n }\n /**\n * Assign a new `tf.Tensor` to this variable. The new `tf.Tensor` must have\n * the same shape and dtype as the old `tf.Tensor`.\n *\n * @param newValue New tensor to be assigned to this variable.\n *\n * @doc {heading: 'Tensors', subheading: 'Classes'}\n */\n assign(newValue) {\n if (newValue.dtype !== this.dtype) {\n throw new Error(`dtype of the new value (${newValue.dtype}) and ` +\n `previous value (${this.dtype}) must match`);\n }\n if (!util.arraysEqual(newValue.shape, this.shape)) {\n throw new Error(`shape of the new value (${newValue.shape}) and ` +\n `previous value (${this.shape}) must match`);\n }\n trackerFn().disposeTensor(this);\n this.dataId = newValue.dataId;\n trackerFn().incRef(this, null /* backend */);\n }\n dispose() {\n trackerFn().disposeVariable(this);\n this.isDisposedInternal = true;\n }\n}\nObject.defineProperty(Variable, Symbol.hasInstance, {\n value: (instance) => {\n return instance instanceof Tensor && instance.assign != null &&\n instance.assign instanceof Function;\n }\n});\n//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidGVuc29yLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vdGZqcy1jb3JlL3NyYy90ZW5zb3IudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUE7Ozs7Ozs7Ozs7Ozs7OztHQWVHO0FBRUgseUVBQXlFO0FBQ3pFLDRDQUE0QztBQUU1QyxPQUFPLEVBQUMsU0FBUyxFQUFDLE1BQU0sZUFBZSxDQUFDO0FBQ3hDLE9BQU8sRUFBQyxjQUFjLEVBQUMsTUFBTSxpQkFBaUIsQ0FBQztBQUUvQyxPQUFPLEtBQUssSUFBSSxNQUFNLFFBQVEsQ0FBQztBQUMvQixPQUFPLEVBQUMsY0FBYyxFQUFFLGFBQWEsRUFBQyxNQUFNLFFBQVEsQ0FBQztBQVdyRDs7Ozs7OztHQU9HO0FBQ0gsTUFBTSxPQUFPLFlBQVk7SUFNdkIsWUFBWSxLQUFrQixFQUFTLEtBQVEsRUFBRSxNQUF1QjtRQUFqQyxVQUFLLEdBQUwsS0FBSyxDQUFHO1FBQzdDLElBQUksQ0FBQyxLQUFLLEdBQUcsS0FBSyxDQUFDLEtBQUssRUFBaUIsQ0FBQztRQUMxQyxJQUFJLENBQUMsSUFBSSxHQUFHLElBQUksQ0FBQyxhQUFhLENBQUMsS0FBSyxDQUFDLENBQUM7UUFFdEMsSUFBSSxNQUFNLElBQUksSUFBSSxFQUFFO1lBQ2xCLE1BQU0sQ0FBQyxHQUFHLE1BQU0sQ0FBQyxNQUFNLENBQUM7WUFDeEIsSUFBSSxDQUFDLE1BQU0sQ0FDUCxDQUFDLEtBQUssSUFBSSxDQUFDLElBQUksRUFDZixHQUFHLEVBQUUsQ0FBQyxxQkFBcUIsQ0FBQyw0QkFBNEI7Z0JBQ3BELDBCQUEwQixJQUFJLENBQUMsSUFBSSxJQUFJLENBQUMsQ0FBQztTQUNsRDtRQUNELElBQUksS0FBSyxLQUFLLFdBQVcsRUFBRTtZQUN6QixNQUFNLElBQUksS0FBSyxDQUNYLGlFQUFpRTtnQkFDakUsaUVBQWlFO2dCQUNqRSw4QkFBOEIsQ0FBQyxDQUFDO1NBQ3JDO1FBQ0QsSUFBSSxDQUFDLE1BQU0sR0FBRyxNQUFNLElBQUksSUFBSSxDQUFDLGlCQUFpQixDQUFDLEtBQUssRUFBRSxJQUFJLENBQUMsSUFBSSxDQUFDLENBQUM7UUFDakUsSUFBSSxDQUFDLE9BQU8sR0FBRyxjQUFjLENBQUMsS0FBSyxDQUFDLENBQUM7SUFDdkMsQ0FBQztJQUVEOzs7Ozs7O09BT0c7SUFDSCxHQUFHLENBQUMsS0FBd0IsRUFBRSxHQUFHLElBQWM7UUFDN0MsSUFBSSxJQUFJLENBQUMsTUFBTSxLQUFLLENBQUMsRUFBRTtZQUNyQixJQUFJLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQztTQUNaO1FBQ0QsSUFBSSxDQUFDLE1BQU0sQ0FDUCxJQUFJLENBQUMsTUFBTSxLQUFLLElBQUksQ0FBQyxJQUFJLEVBQ3pCLEdBQUcsRUFBRSxDQUFDLHVDQUF1QyxJQUFJLENBQUMsTUFBTSxTQUFTO1lBQzdELG1CQUFtQixJQUFJLENBQUMsSUFBSSxHQUFHLENBQUMsQ0FBQztRQUV6QyxNQUFNLEtBQUssR0FBRyxJQUFJLENBQUMsVUFBVSxDQUFDLElBQUksQ0FBQyxDQUFDO1FBQ3BDLElBQUksQ0FBQyxNQUFNLENBQUMsS0FBSyxDQUFDLEdBQUcsS0FBZSxDQUFDO0lBQ3ZDLENBQUM7SUFFRDs7Ozs7O09BTUc7SUFDSCxHQUFHLENBQUMsR0FBRyxJQUFjO1FBQ25CLElBQUksSUFBSSxDQUFDLE1BQU0sS0FBSyxDQUFDLEVBQUU7WUFDckIsSUFBSSxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUM7U0FDWjtRQUNELElBQUksQ0FBQyxHQUFHLENBQUMsQ0FBQztRQUNWLEtBQUssTUFBTSxHQUFHLElBQUksSUFBSSxFQUFFO1lBQ3RCLElBQUksR0FBRyxHQUFHLENBQUMsSUFBSSxHQUFHLElBQUksSUFBSSxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUMsRUFBRTtnQkFDbkMsTUFBTSxHQUFHLEdBQUcscUNBQXFDLElBQUksSUFBSTtvQkFDckQsa0JBQWtCLElBQUksQ0FBQyxLQUFLLEVBQUUsQ0FBQztnQkFDbkMsTUFBTSxJQUFJLEtBQUssQ0FBQyxHQUFHLENBQUMsQ0FBQzthQUN0QjtZQUNELENBQUMsRUFBRSxDQUFDO1NBQ0w7UUFDRCxJQUFJLEtBQUssR0FBRyxJQUFJLENBQUMsSUFBSSxDQUFDLE1BQU0sR0FBRyxDQUFDLENBQUMsQ0FBQztRQUNsQyxLQUFLLElBQUksQ0FBQyxHQUFHLENBQUMsRUFBRSxDQUFDLEdBQUcsSUFBSSxDQUFDLE1BQU0sR0FBRyxDQUFDLEVBQUUsRUFBRSxDQUFDLEVBQUU7WUFDeEMsS0FBSyxJQUFJLElBQUksQ0FBQyxPQUFPLENBQUMsQ0FBQyxDQUFDLEdBQUcsSUFBSSxDQUFDLENBQUMsQ0FBQyxDQUFDO1NBQ3BDO1FBQ0QsT0FBTyxJQUFJLENBQUMsTUFBTSxDQUFDLEtBQUssQ0FBc0IsQ0FBQztJQUNqRCxDQUFDO0lBRUQsVUFBVSxDQUFDLElBQWM7UUFDdkIsSUFBSSxJQUFJLENBQUMsSUFBSSxLQUFLLENBQUMsRUFBRTtZQUNuQixPQUFPLENBQUMsQ0FBQztTQUNWO2FBQU0sSUFBSSxJQUFJLENBQUMsSUFBSSxLQUFLLENBQUMsRUFBRTtZQUMxQixPQUFPLElBQUksQ0FBQyxDQUFDLENBQUMsQ0FBQztTQUNoQjtRQUNELElBQUksS0FBSyxHQUFHLElBQUksQ0FBQyxJQUFJLENBQUMsTUFBTSxHQUFHLENBQUMsQ0FBQyxDQUFDO1FBQ2xDLEtBQUssSUFBSSxDQUFDLEdBQUcsQ0FBQyxFQUFFLENBQUMsR0FBRyxJQUFJLENBQUMsTUFBTSxHQUFHLENBQUMsRUFBRSxFQUFFLENBQUMsRUFBRTtZQUN4QyxLQUFLLElBQUksSUFBSSxDQUFDLE9BQU8sQ0FBQyxDQUFDLENBQUMsR0FBRyxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUM7U0FDcEM7UUFDRCxPQUFPLEtBQUssQ0FBQztJQUNmLENBQUM7SUFFRCxVQUFVLENBQUMsS0FBYTtRQUN0QixJQUFJLElBQUksQ0FBQyxJQUFJLEtBQUssQ0FBQyxFQUFFO1lBQ25CLE9BQU8sRUFBRSxDQUFDO1NBQ1g7YUFBTSxJQUFJLElBQUksQ0FBQyxJQUFJLEtBQUssQ0FBQyxFQUFFO1lBQzFCLE9BQU8sQ0FBQyxLQUFLLENBQUMsQ0FBQztTQUNoQjtRQUNELE1BQU0sSUFBSSxHQUFhLElBQUksS0FBSyxDQUFDLElBQUksQ0FBQyxLQUFLLENBQUMsTUFBTSxDQUFDLENBQUM7UUFDcEQsS0FBSyxJQUFJLENBQUMsR0FBRyxDQUFDLEVBQUUsQ0FBQyxHQUFHLElBQUksQ0FBQyxNQUFNLEdBQUcsQ0FBQyxFQUFFLEVBQUUsQ0FBQyxFQUFFO1lBQ3hDLElBQUksQ0FBQyxDQUFDLENBQUMsR0FBRyxJQUFJLENBQUMsS0FBSyxDQUFDLEtBQUssR0FBRyxJQUFJLENBQUMsT0FBTyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUM7WUFDOUMsS0FBSyxJQUFJLElBQUksQ0FBQyxDQUFDLENBQUMsR0FBRyxJQUFJLENBQUMsT0FBTyxDQUFDLENBQUMsQ0FBQyxDQUFDO1NBQ3BDO1FBQ0QsSUFBSSxDQUFDLElBQUksQ0FBQyxNQUFNLEdBQUcsQ0FBQyxDQUFDLEdBQUcsS0FBSyxDQUFDO1FBQzlCLE9BQU8sSUFBSSxDQUFDO0lBQ2QsQ0FBQztJQUVELElBQUksSUFBSTtRQUNOLE9BQU8sSUFBSSxDQUFDLEtBQUssQ0FBQyxNQUFNLENBQUM7SUFDM0IsQ0FBQztJQUVEOzs7O09BSUc7SUFDSCxRQUFRO1FBQ04sT0FBTyxTQUFTLEVBQUUsQ0FBQyxVQUFVLENBQUMsSUFBSSxDQUFDLE1BQU0sRUFBRSxJQUFJLENBQUMsS0FBSyxFQUFFLElBQUksQ0FBQyxLQUFLLENBQ3BELENBQUM7SUFDaEIsQ0FBQztDQUNGO0FBNENELDZDQUE2QztBQUM3QyxJQUFJLFNBQVMsR0FBd0IsSUFBSSxDQUFDO0FBQzFDLDZDQUE2QztBQUM3QyxJQUFJLFNBQVMsR0FBYyxJQUFJLENBQUM7QUFDaEMseUNBQXlDO0FBQ3pDLElBQUksb0JBQW9CLEdBQTBCLElBQUksQ0FBQztBQUN2RCx3RUFBd0U7QUFDeEUsMkJBQTJCO0FBQzNCLGdEQUFnRDtBQUNoRCxDQUFDLG9CQUFvQixDQUFDLENBQUM7QUFFdkI7Ozs7R0FJRztBQUNILE1BQU0sVUFBVSxnQkFBZ0IsQ0FBQyxFQUF1QjtJQUN0RCxTQUFTLEdBQUcsRUFBRSxDQUFDO0FBQ2pCLENBQUM7QUFFRDs7OztHQUlHO0FBQ0gsTUFBTSxVQUFVLFlBQVksQ0FBQyxPQUFrQjtJQUM3QyxTQUFTLEdBQUcsT0FBTyxDQUFDO0FBQ3RCLENBQUM7QUFFRDs7O0dBR0c7QUFDSCxNQUFNLFVBQVUsdUJBQXVCLENBQUMsRUFBeUI7SUFDL0Qsb0JBQW9CLEdBQUcsRUFBRSxDQUFDO0FBQzVCLENBQUM7QUFjRDs7Ozs7Ozs7Ozs7OztHQWFHO0FBQ0gsTUFBTSxPQUFPLE1BQU07SUE2QmpCLFlBQVksS0FBa0IsRUFBRSxLQUFlLEVBQUUsTUFBYyxFQUFFLEVBQVU7UUFaM0Usa0RBQWtEO1FBQ2xELFNBQUksR0FBRyxLQUFLLENBQUM7UUFnTEgsdUJBQWtCLEdBQUcsS0FBSyxDQUFDO1FBcEtuQyxJQUFJLENBQUMsS0FBSyxHQUFHLEtBQUssQ0FBQyxLQUFLLEVBQWlCLENBQUM7UUFDMUMsSUFBSSxDQUFDLEtBQUssR0FBRyxLQUFLLElBQUksU0FBUyxDQUFDO1FBQ2hDLElBQUksQ0FBQyxJQUFJLEdBQUcsSUFBSSxDQUFDLGFBQWEsQ0FBQyxLQUFLLENBQUMsQ0FBQztRQUN0QyxJQUFJLENBQUMsT0FBTyxHQUFHLGNBQWMsQ0FBQyxLQUFLLENBQUMsQ0FBQztRQUNyQyxJQUFJLENBQUMsTUFBTSxHQUFHLE1BQU0sQ0FBQztRQUNyQixJQUFJLENBQUMsRUFBRSxHQUFHLEVBQUUsQ0FBQztRQUNiLElBQUksQ0FBQyxRQUFRLEdBQUcsQ0FBQyxJQUFJLENBQUMsSUFBSSxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxRQUFRLEVBQUUsQ0FBQyxDQUFDLENBQUMsUUFBUSxDQUFNLENBQUM7SUFDekUsQ0FBQztJQUVELElBQUksSUFBSTtRQUNOLE9BQU8sSUFBSSxDQUFDLEtBQUssQ0FBQyxNQUFNLENBQUM7SUFDM0IsQ0FBQztJQUVEOzs7O09BSUc7SUFDSCxLQUFLLENBQUMsTUFBTTtRQUNWLE1BQU0sSUFBSSxHQUFHLE1BQU0sSUFBSSxDQUFDLElBQUksRUFBSyxDQUFDO1FBQ2xDLE9BQU8sU0FBUyxDQUFDLE1BQU0sQ0FBQyxJQUFJLENBQUMsS0FBSyxFQUFFLElBQUksQ0FBQyxLQUFVLEVBQUUsSUFBSSxDQUFDLENBQUM7SUFDN0QsQ0FBQztJQUVEOzs7T0FHRztJQUNILFVBQVU7UUFDUixPQUFPLFNBQVMsQ0FBQyxNQUFNLENBQUMsSUFBSSxDQUFDLEtBQUssRUFBRSxJQUFJLENBQUMsS0FBVSxFQUFFLElBQUksQ0FBQyxRQUFRLEVBQUUsQ0FBQyxDQUFDO0lBQ3hFLENBQUM7SUFFRDs7Ozs7T0FLRztJQUNILEtBQUssQ0FBQyxLQUFLO1FBQ1QsTUFBTSxJQUFJLEdBQUcsTUFBTSxJQUFJLENBQUMsSUFBSSxFQUFFLENBQUM7UUFDL0IsT0FBTyxhQUFhLENBQUMsSUFBSSxDQUFDLEtBQUssRUFBRSxJQUFJLEVBQUUsSUFBSSxDQUFDLEtBQUssS0FBSyxXQUFXLENBQ2xELENBQUM7SUFDbEIsQ0FBQztJQUVEOzs7OztPQUtHO0lBQ0gsU0FBUztRQUNQLE9BQU8sYUFBYSxDQUNULElBQUksQ0FBQyxLQUFLLEVBQUUsSUFBSSxDQUFDLFFBQVEsRUFBRSxFQUFFLElBQUksQ0FBQyxLQUFLLEtBQUssV0FBVyxDQUNuRCxDQUFDO0lBQ2xCLENBQUM7SUFFRDs7Ozs7T0FLRztJQUNILEtBQUssQ0FBQyxJQUFJO1FBQ1IsSUFBSSxDQUFDLGVBQWUsRUFBRSxDQUFDO1FBQ3ZCLE1BQU0sSUFBSSxHQUFHLFNBQVMsRUFBRSxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsTUFBTSxDQUFDLENBQUM7UUFDM0MsSUFBSSxJQUFJLENBQUMsS0FBSyxLQUFLLFFBQVEsRUFBRTtZQUMzQixNQUFNLEtBQUssR0FBRyxNQUFNLElBQW9CLENBQUM7WUFDekMsSUFBSTtnQkFDRixPQUFPLEtBQUssQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxJQUFJLENBQUMsWUFBWSxDQUFDLENBQUMsQ0FBQyxDQUFtQixDQUFDO2FBQy9EO1lBQUMsV0FBTTtnQkFDTixNQUFNLElBQUksS0FBSyxDQUNYLGdEQUFnRDtvQkFDaEQsaURBQWlELENBQUMsQ0FBQzthQUN4RDtTQUNGO1FBQ0QsT0FBTyxJQUErQixDQUFDO0lBQ3pDLENBQUM7SUFFRDs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7T0FtQ0c7SUFDSCxTQUFTLENBQUMsT0FBMEI7UUFDbEMsSUFBSSxDQUFDLGVBQWUsRUFBRSxDQUFDO1FBQ3ZCLE9BQU8sU0FBUyxFQUFFLENBQUMsU0FBUyxDQUFDLElBQUksQ0FBQyxNQUFNLEVBQUUsT0FBTyxDQUFDLENBQUM7SUFDckQsQ0FBQztJQUVEOzs7OztPQUtHO0lBQ0gsUUFBUTtRQUNOLElBQUksQ0FBQyxlQUFlLEVBQUUsQ0FBQztRQUN2QixNQUFNLElBQUksR0FBRyxTQUFTLEVBQUUsQ0FBQyxRQUFRLENBQUMsSUFBSSxDQUFDLE1BQU0sQ0FBQyxDQUFDO1FBQy9DLElBQUksSUFBSSxDQUFDLEtBQUssS0FBSyxRQUFRLEVBQUU7WUFDM0IsSUFBSTtnQkFDRixPQUFRLElBQXFCLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsSUFBSSxDQUFDLFlBQVksQ0FBQyxDQUFDLENBQUMsQ0FDekMsQ0FBQzthQUNwQjtZQUFDLFdBQU07Z0JBQ04sTUFBTSxJQUFJLEtBQUssQ0FDWCxnREFBZ0Q7b0JBQ2hELGlEQUFpRCxDQUFDLENBQUM7YUFDeEQ7U0FDRjtRQUNELE9BQU8sSUFBc0IsQ0FBQztJQUNoQyxDQUFDO0lBRUQseURBQXlEO0lBQ3pELEtBQUssQ0FBQyxLQUFLO1FBQ1QsSUFBSSxDQUFDLGVBQWUsRUFBRSxDQUFDO1FBQ3ZCLE1BQU0sSUFBSSxHQUFHLE1BQU0sU0FBUyxFQUFFLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxNQUFNLENBQUMsQ0FBQztRQUNqRCxJQUFJLElBQUksQ0FBQyxLQUFLLEtBQUssUUFBUSxFQUFFO1lBQzNCLE9BQU8sSUFBb0IsQ0FBQztTQUM3QjthQUFNO1lBQ0wsT0FBTyxJQUFJLFVBQVUsQ0FBRSxJQUFtQixDQUFDLE1BQU0sQ0FBQyxDQUFDO1NBQ3BEO0lBQ0gsQ0FBQztJQUVEOzs7O09BSUc7SUFDSCxPQUFPO1FBQ0wsSUFBSSxJQUFJLENBQUMsVUFBVSxFQUFFO1lBQ25CLE9BQU87U0FDUjtRQUNELFNBQVMsRUFBRSxDQUFDLGFBQWEsQ0FBQyxJQUFJLENBQUMsQ0FBQztRQUNoQyxJQUFJLENBQUMsa0JBQWtCLEdBQUcsSUFBSSxDQUFDO0lBQ2pDLENBQUM7SUFHRCxJQUFJLFVBQVU7UUFDWixPQUFPLElBQUksQ0FBQyxrQkFBa0IsQ0FBQztJQUNqQyxDQUFDO0lBRUQsZUFBZTtRQUNiLElBQUksSUFBSSxDQUFDLFVBQVUsRUFBRTtZQUNuQixNQUFNLElBQUksS0FBSyxDQUFDLHFCQUFxQixDQUFDLENBQUM7U0FDeEM7SUFDSCxDQUFDO0lBRUQ7Ozs7Ozs7T0FPRztJQUNILEtBQUssQ0FBQyxPQUFPLEdBQUcsS0FBSztRQUNuQixPQUFPLFNBQVMsQ0FBQyxLQUFLLENBQUMsSUFBSSxFQUFFLE9BQU8sQ0FBQyxDQUFDO0lBQ3hDLENBQUM7SUFFRDs7O09BR0c7SUFDSCxLQUFLO1FBQ0gsSUFBSSxDQUFDLGVBQWUsRUFBRSxDQUFDO1FBQ3ZCLE9BQU8sU0FBUyxDQUFDLEtBQUssQ0FBQyxJQUFJLENBQUMsQ0FBQztJQUMvQixDQUFDO0lBRUQ7Ozs7T0FJRztJQUNILFFBQVEsQ0FBQyxPQUFPLEdBQUcsS0FBSztRQUN0QixNQUFNLElBQUksR0FBRyxJQUFJLENBQUMsUUFBUSxFQUFFLENBQUM7UUFDN0IsT0FBTyxjQUFjLENBQUMsSUFBSSxFQUFFLElBQUksQ0FBQyxLQUFLLEVBQUUsSUFBSSxDQUFDLEtBQUssRUFBRSxPQUFPLENBQUMsQ0FBQztJQUMvRCxDQUFDO0lBRUQsSUFBSSxDQUFpQixLQUFlO1FBQ2xDLElBQUksQ0FBQyxlQUFlLEVBQUUsQ0FBQztRQUN2QixPQUFPLFNBQVMsQ0FBQyxJQUFJLENBQUMsSUFBUyxFQUFFLEtBQUssQ0FBQyxDQUFDO0lBQzFDLENBQUM7SUFDRCxRQUFRLENBQUMsU0FBUyxHQUFHLElBQUksRUFBRSxJQUFhLEVBQUUsS0FBZ0I7UUFDeEQsSUFBSSxDQUFDLGVBQWUsRUFBRSxDQUFDO1FBQ3ZCLE9BQU8sU0FBUyxFQUFFLENBQUMsWUFBWSxDQUFDLElBQUksRUFBRSxTQUFTLEVBQUUsSUFBSSxFQUFFLEtBQUssQ0FDN0MsQ0FBQztJQUNsQixDQUFDO0NBQ0Y7QUFFRCxNQUFNLENBQUMsY0FBYyxDQUFDLE1BQU0sRUFBRSxNQUFNLENBQUMsV0FBVyxFQUFFO0lBQ2hELEtBQUssRUFBRSxDQUFDLFFBQWdCLEVBQUUsRUFBRTtRQUMxQiwyRUFBMkU7UUFDM0Usd0VBQXdFO1FBQ3hFLHlFQUF5RTtRQUN6RSxxREFBcUQ7UUFDckQsb0VBQW9FO1FBQ3BFLE9BQU8sQ0FBQyxDQUFDLFFBQVEsSUFBSSxRQUFRLENBQUMsSUFBSSxJQUFJLElBQUksSUFBSSxRQUFRLENBQUMsUUFBUSxJQUFJLElBQUk7WUFDbkUsUUFBUSxDQUFDLGVBQWUsSUFBSSxJQUFJLENBQUM7SUFDdkMsQ0FBQztDQUNGLENBQUMsQ0FBQztBQUVILE1BQU0sVUFBVSxvQkFBb0I7SUFDbEMsdUVBQXVFO0lBQ3ZFLDRFQUE0RTtJQUM1RSwyRUFBMkU7SUFDM0UsT0FBTyxTQUFTLENBQUMsUUFBUSxFQUFFLEdBQUcsRUFBRTtRQUM5QixPQUFPLE1BQU0sQ0FBQztJQUNoQixDQUFDLENBQUMsQ0FBQztBQUNMLENBQUM7QUFFRCw2REFBNkQ7QUFDN0Qsb0JBQW9CLEVBQUUsQ0FBQztBQThCdkI7Ozs7R0FJRztBQUNILE1BQU0sT0FBTyxRQUFnQyxTQUFRLE1BQVM7SUFHNUQsWUFDSSxZQUF1QixFQUFTLFNBQWtCLEVBQUUsSUFBWSxFQUNoRSxRQUFnQjtRQUNsQixLQUFLLENBQ0QsWUFBWSxDQUFDLEtBQUssRUFBRSxZQUFZLENBQUMsS0FBSyxFQUFFLFlBQVksQ0FBQyxNQUFNLEVBQUUsUUFBUSxDQUFDLENBQUM7UUFIekMsY0FBUyxHQUFULFNBQVMsQ0FBUztRQUlwRCxJQUFJLENBQUMsSUFBSSxHQUFHLElBQUksQ0FBQztJQUNuQixDQUFDO0lBRUQ7Ozs7Ozs7T0FPRztJQUNILE1BQU0sQ0FBQyxRQUFtQjtRQUN4QixJQUFJLFFBQVEsQ0FBQyxLQUFLLEtBQUssSUFBSSxDQUFDLEtBQUssRUFBRTtZQUNqQyxNQUFNLElBQUksS0FBSyxDQUNYLDJCQUEyQixRQUFRLENBQUMsS0FBSyxRQUFRO2dCQUNqRCxtQkFBbUIsSUFBSSxDQUFDLEtBQUssY0FBYyxDQUFDLENBQUM7U0FDbEQ7UUFDRCxJQUFJLENBQUMsSUFBSSxDQUFDLFdBQVcsQ0FBQyxRQUFRLENBQUMsS0FBSyxFQUFFLElBQUksQ0FBQyxLQUFLLENBQUMsRUFBRTtZQUNqRCxNQUFNLElBQUksS0FBSyxDQUNYLDJCQUEyQixRQUFRLENBQUMsS0FBSyxRQUFRO2dCQUNqRCxtQkFBbUIsSUFBSSxDQUFDLEtBQUssY0FBYyxDQUFDLENBQUM7U0FDbEQ7UUFDRCxTQUFTLEVBQUUsQ0FBQyxhQUFhLENBQUMsSUFBSSxDQUFDLENBQUM7UUFDaEMsSUFBSSxDQUFDLE1BQU0sR0FBRyxRQUFRLENBQUMsTUFBTSxDQUFDO1FBQzlCLFNBQVMsRUFBRSxDQUFDLE1BQU0sQ0FBQyxJQUFJLEVBQUUsSUFBSSxDQUFDLGFBQWEsQ0FBQyxDQUFDO0lBQy9DLENBQUM7SUFFRCxPQUFPO1FBQ0wsU0FBUyxFQUFFLENBQUMsZUFBZSxDQUFDLElBQUksQ0FBQyxDQUFDO1FBQ2xDLElBQUksQ0FBQyxrQkFBa0IsR0FBRyxJQUFJLENBQUM7SUFDakMsQ0FBQztDQUNGO0FBRUQsTUFBTSxDQUFDLGNBQWMsQ0FBQyxRQUFRLEVBQUUsTUFBTSxDQUFDLFdBQVcsRUFBRTtJQUNsRCxLQUFLLEVBQUUsQ0FBQyxRQUFrQixFQUFFLEVBQUU7UUFDNUIsT0FBTyxRQUFRLFlBQVksTUFBTSxJQUFJLFFBQVEsQ0FBQyxNQUFNLElBQUksSUFBSTtZQUN4RCxRQUFRLENBQUMsTUFBTSxZQUFZLFFBQVEsQ0FBQztJQUMxQyxDQUFDO0NBQ0YsQ0FBQyxDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiLyoqXG4gKiBAbGljZW5zZVxuICogQ29weXJpZ2h0IDIwMTcgR29vZ2xlIExMQy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC5cbiAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSBcIkxpY2Vuc2VcIik7XG4gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuXG4gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXRcbiAqXG4gKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjBcbiAqXG4gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlXG4gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiBcIkFTIElTXCIgQkFTSVMsXG4gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC5cbiAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmRcbiAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLlxuICogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbiAqL1xuXG4vLyBXb3JrYXJvdW5kIGZvcjogaHR0cHM6Ly9naXRodWIuY29tL2JhemVsYnVpbGQvcnVsZXNfbm9kZWpzL2lzc3Vlcy8xMjY1XG4vLy8gPHJlZmVyZW5jZSB0eXBlcz1cIkB3ZWJncHUvdHlwZXMvZGlzdFwiIC8+XG5cbmltcG9ydCB7Z2V0R2xvYmFsfSBmcm9tICcuL2dsb2JhbF91dGlsJztcbmltcG9ydCB7dGVuc29yVG9TdHJpbmd9IGZyb20gJy4vdGVuc29yX2Zvcm1hdCc7XG5pbXBvcnQge0FycmF5TWFwLCBCYWNrZW5kVmFsdWVzLCBEYXRhVHlwZSwgRGF0YVR5cGVNYXAsIERhdGFWYWx1ZXMsIE51bWVyaWNEYXRhVHlwZSwgUmFuaywgU2hhcGVNYXAsIFNpbmdsZVZhbHVlTWFwLCBUeXBlZEFycmF5fSBmcm9tICcuL3R5cGVzJztcbmltcG9ydCAqIGFzIHV0aWwgZnJvbSAnLi91dGlsJztcbmltcG9ydCB7Y29tcHV0ZVN0cmlkZXMsIHRvTmVzdGVkQXJyYXl9IGZyb20gJy4vdXRpbCc7XG5cbmV4cG9ydCBpbnRlcmZhY2UgVGVuc29yRGF0YTxEIGV4dGVuZHMgRGF0YVR5cGU+IHtcbiAgZGF0YUlkPzogRGF0YUlkO1xuICB2YWx1ZXM/OiBEYXRhVHlwZU1hcFtEXTtcbn1cblxuLy8gVGhpcyBpbnRlcmZhY2UgbWltaWNzIEtlcm5lbEJhY2tlbmQgKGluIGJhY2tlbmQudHMpLCB3aGljaCB3b3VsZCBjcmVhdGUgYVxuLy8gY2lyY3VsYXIgZGVwZW5kZW5jeSBpZiBpbXBvcnRlZC5cbmV4cG9ydCBpbnRlcmZhY2UgQmFja2VuZCB7fVxuXG4vKipcbiAqIEEgbXV0YWJsZSBvYmplY3QsIHNpbWlsYXIgdG8gYHRmLlRlbnNvcmAsIHRoYXQgYWxsb3dzIHVzZXJzIHRvIHNldCB2YWx1ZXNcbiAqIGF0IGxvY2F0aW9ucyBiZWZvcmUgY29udmVydGluZyB0byBhbiBpbW11dGFibGUgYHRmLlRlbnNvcmAuXG4gKlxuICogU2VlIGB0Zi5idWZmZXJgIGZvciBjcmVhdGluZyBhIHRlbnNvciBidWZmZXIuXG4gKlxuICogQGRvYyB7aGVhZGluZzogJ1RlbnNvcnMnLCBzdWJoZWFkaW5nOiAnQ2xhc3Nlcyd9XG4gKi9cbmV4cG9ydCBjbGFzcyBUZW5zb3JCdWZmZXI8UiBleHRlbmRzIFJhbmssIEQgZXh0ZW5kcyBEYXRhVHlwZSA9ICdmbG9hdDMyJz4ge1xuICBzaXplOiBudW1iZXI7XG4gIHNoYXBlOiBTaGFwZU1hcFtSXTtcbiAgc3RyaWRlczogbnVtYmVyW107XG4gIHZhbHVlczogRGF0YVR5cGVNYXBbRF07XG5cbiAgY29uc3RydWN0b3Ioc2hhcGU6IFNoYXBlTWFwW1JdLCBwdWJsaWMgZHR5cGU6IEQsIHZhbHVlcz86IERhdGFUeXBlTWFwW0RdKSB7XG4gICAgdGhpcy5zaGFwZSA9IHNoYXBlLnNsaWNlKCkgYXMgU2hhcGVNYXBbUl07XG4gICAgdGhpcy5zaXplID0gdXRpbC5zaXplRnJvbVNoYXBlKHNoYXBlKTtcblxuICAgIGlmICh2YWx1ZXMgIT0gbnVsbCkge1xuICAgICAgY29uc3QgbiA9IHZhbHVlcy5sZW5ndGg7XG4gICAgICB1dGlsLmFzc2VydChcbiAgICAgICAgICBuID09PSB0aGlzLnNpemUsXG4gICAgICAgICAgKCkgPT4gYExlbmd0aCBvZiB2YWx1ZXMgJyR7bn0nIGRvZXMgbm90IG1hdGNoIHRoZSBzaXplIGAgK1xuICAgICAgICAgICAgICBgaW5mZXJyZWQgYnkgdGhlIHNoYXBlICcke3RoaXMuc2l6ZX0nLmApO1xuICAgIH1cbiAgICBpZiAoZHR5cGUgPT09ICdjb21wbGV4NjQnKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoXG4gICAgICAgICAgYGNvbXBsZXg2NCBkdHlwZSBUZW5zb3JCdWZmZXJzIGFyZSBub3Qgc3VwcG9ydGVkLiBQbGVhc2UgY3JlYXRlIGAgK1xuICAgICAgICAgIGBhIFRlbnNvckJ1ZmZlciBmb3IgdGhlIHJlYWwgYW5kIGltYWdpbmFyeSBwYXJ0cyBzZXBhcmF0ZWx5IGFuZCBgICtcbiAgICAgICAgICBgY2FsbCB0Zi5jb21wbGV4KHJlYWwsIGltYWcpLmApO1xuICAgIH1cbiAgICB0aGlzLnZhbHVlcyA9IHZhbHVlcyB8fCB1dGlsLmdldEFycmF5RnJvbURUeXBlKGR0eXBlLCB0aGlzLnNpemUpO1xuICAgIHRoaXMuc3RyaWRlcyA9IGNvbXB1dGVTdHJpZGVzKHNoYXBlKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBTZXRzIGEgdmFsdWUgaW4gdGhlIGJ1ZmZlciBhdCBhIGdpdmVuIGxvY2F0aW9uLlxuICAgKlxuICAgKiBAcGFyYW0gdmFsdWUgVGhlIHZhbHVlIHRvIHNldC5cbiAgICogQHBhcmFtIGxvY3MgIFRoZSBsb2NhdGlvbiBpbmRpY2VzLlxuICAgKlxuICAgKiBAZG9jIHtoZWFkaW5nOiAnVGVuc29ycycsIHN1YmhlYWRpbmc6ICdDcmVhdGlvbid9XG4gICAqL1xuICBzZXQodmFsdWU6IFNpbmdsZVZhbHVlTWFwW0RdLCAuLi5sb2NzOiBudW1iZXJbXSk6IHZvaWQge1xuICAgIGlmIChsb2NzLmxlbmd0aCA9PT0gMCkge1xuICAgICAgbG9jcyA9IFswXTtcbiAgICB9XG4gICAgdXRpbC5hc3NlcnQoXG4gICAgICAgIGxvY3MubGVuZ3RoID09PSB0aGlzLnJhbmssXG4gICAgICAgICgpID0+IGBUaGUgbnVtYmVyIG9mIHByb3ZpZGVkIGNvb3JkaW5hdGVzICgke2xvY3MubGVuZ3RofSkgbXVzdCBgICtcbiAgICAgICAgICAgIGBtYXRjaCB0aGUgcmFuayAoJHt0aGlzLnJhbmt9KWApO1xuXG4gICAgY29uc3QgaW5kZXggPSB0aGlzLmxvY1RvSW5kZXgobG9jcyk7XG4gICAgdGhpcy52YWx1ZXNbaW5kZXhdID0gdmFsdWUgYXMgbnVtYmVyO1xuICB9XG5cbiAgLyoqXG4gICAqIFJldHVybnMgdGhlIHZhbHVlIGluIHRoZSBidWZmZXIgYXQgdGhlIHByb3ZpZGVkIGxvY2F0aW9uLlxuICAgKlxuICAgKiBAcGFyYW0gbG9jcyBUaGUgbG9jYXRpb24gaW5kaWNlcy5cbiAgICpcbiAgICogQGRvYyB7aGVhZGluZzogJ1RlbnNvcnMnLCBzdWJoZWFkaW5nOiAnQ3JlYXRpb24nfVxuICAgKi9cbiAgZ2V0KC4uLmxvY3M6IG51bWJlcltdKTogU2luZ2xlVmFsdWVNYXBbRF0ge1xuICAgIGlmIChsb2NzLmxlbmd0aCA9PT0gMCkge1xuICAgICAgbG9jcyA9IFswXTtcbiAgICB9XG4gICAgbGV0IGkgPSAwO1xuICAgIGZvciAoY29uc3QgbG9jIG9mIGxvY3MpIHtcbiAgICAgIGlmIChsb2MgPCAwIHx8IGxvYyA+PSB0aGlzLnNoYXBlW2ldKSB7XG4gICAgICAgIGNvbnN0IG1zZyA9IGBSZXF1ZXN0ZWQgb3V0IG9mIHJhbmdlIGVsZW1lbnQgYXQgJHtsb2NzfS4gYCArXG4gICAgICAgICAgICBgICBCdWZmZXIgc2hhcGU9JHt0aGlzLnNoYXBlfWA7XG4gICAgICAgIHRocm93IG5ldyBFcnJvcihtc2cpO1xuICAgICAgfVxuICAgICAgaSsrO1xuICAgIH1cbiAgICBsZXQgaW5kZXggPSBsb2NzW2xvY3MubGVuZ3RoIC0gMV07XG4gICAgZm9yIChsZXQgaSA9IDA7IGkgPCBsb2NzLmxlbmd0aCAtIDE7ICsraSkge1xuICAgICAgaW5kZXggKz0gdGhpcy5zdHJpZGVzW2ldICogbG9jc1tpXTtcbiAgICB9XG4gICAgcmV0dXJuIHRoaXMudmFsdWVzW2luZGV4XSBhcyBTaW5nbGVWYWx1ZU1hcFtEXTtcbiAgfVxuXG4gIGxvY1RvSW5kZXgobG9jczogbnVtYmVyW10pOiBudW1iZXIge1xuICAgIGlmICh0aGlzLnJhbmsgPT09IDApIHtcbiAgICAgIHJldHVybiAwO1xuICAgIH0gZWxzZSBpZiAodGhpcy5yYW5rID09PSAxKSB7XG4gICAgICByZXR1cm4gbG9jc1swXTtcbiAgICB9XG4gICAgbGV0IGluZGV4ID0gbG9jc1tsb2NzLmxlbmd0aCAtIDFdO1xuICAgIGZvciAobGV0IGkgPSAwOyBpIDwgbG9jcy5sZW5ndGggLSAxOyArK2kpIHtcbiAgICAgIGluZGV4ICs9IHRoaXMuc3RyaWRlc1tpXSAqIGxvY3NbaV07XG4gICAgfVxuICAgIHJldHVybiBpbmRleDtcbiAgfVxuXG4gIGluZGV4VG9Mb2MoaW5kZXg6IG51bWJlcik6IG51bWJlcltdIHtcbiAgICBpZiAodGhpcy5yYW5rID09PSAwKSB7XG4gICAgICByZXR1cm4gW107XG4gICAgfSBlbHNlIGlmICh0aGlzLnJhbmsgPT09IDEpIHtcbiAgICAgIHJldHVybiBbaW5kZXhdO1xuICAgIH1cbiAgICBjb25zdCBsb2NzOiBudW1iZXJbXSA9IG5ldyBBcnJheSh0aGlzLnNoYXBlLmxlbmd0aCk7XG4gICAgZm9yIChsZXQgaSA9IDA7IGkgPCBsb2NzLmxlbmd0aCAtIDE7ICsraSkge1xuICAgICAgbG9jc1tpXSA9IE1hdGguZmxvb3IoaW5kZXggLyB0aGlzLnN0cmlkZXNbaV0pO1xuICAgICAgaW5kZXggLT0gbG9jc1tpXSAqIHRoaXMuc3RyaWRlc1tpXTtcbiAgICB9XG4gICAgbG9jc1tsb2NzLmxlbmd0aCAtIDFdID0gaW5kZXg7XG4gICAgcmV0dXJuIGxvY3M7XG4gIH1cblxuICBnZXQgcmFuaygpIHtcbiAgICByZXR1cm4gdGhpcy5zaGFwZS5sZW5ndGg7XG4gIH1cblxuICAvKipcbiAgICogQ3JlYXRlcyBhbiBpbW11dGFibGUgYHRmLlRlbnNvcmAgb2JqZWN0IGZyb20gdGhlIGJ1ZmZlci5cbiAgICpcbiAgICogQGRvYyB7aGVhZGluZzogJ1RlbnNvcnMnLCBzdWJoZWFkaW5nOiAnQ3JlYXRpb24nfVxuICAgKi9cbiAgdG9UZW5zb3IoKTogVGVuc29yPFI+IHtcbiAgICByZXR1cm4gdHJhY2tlckZuKCkubWFrZVRlbnNvcih0aGlzLnZhbHVlcywgdGhpcy5zaGFwZSwgdGhpcy5kdHlwZSkgYXNcbiAgICAgICAgVGVuc29yPFI+O1xuICB9XG59XG5cbmV4cG9ydCBpbnRlcmZhY2UgRGF0YVRvR1BVV2ViR0xPcHRpb24ge1xuICBjdXN0b21UZXhTaGFwZT86IFtudW1iZXIsIG51bWJlcl07XG59XG5cbmV4cG9ydCB0eXBlIERhdGFUb0dQVU9wdGlvbnMgPSBEYXRhVG9HUFVXZWJHTE9wdGlvbjtcblxuZXhwb3J0IGludGVyZmFjZSBHUFVEYXRhIHtcbiAgdGVuc29yUmVmOiBUZW5zb3I7XG4gIHRleHR1cmU/OiBXZWJHTFRleHR1cmU7XG4gIGJ1ZmZlcj86IEdQVUJ1ZmZlcjtcbiAgdGV4U2hhcGU/OiBbbnVtYmVyLCBudW1iZXJdO1xuICBidWZTaXplPzogbnVtYmVyO1xufVxuXG5leHBvcnQgaW50ZXJmYWNlIFRlbnNvclRyYWNrZXIge1xuICBtYWtlVGVuc29yKFxuICAgICAgdmFsdWVzOiBEYXRhVmFsdWVzLCBzaGFwZTogbnVtYmVyW10sIGR0eXBlOiBEYXRhVHlwZSxcbiAgICAgIGJhY2tlbmQ/OiBCYWNrZW5kKTogVGVuc29yO1xuICBtYWtlVmFyaWFibGUoXG4gICAgICBpbml0aWFsVmFsdWU6IFRlbnNvciwgdHJhaW5hYmxlPzogYm9vbGVhbiwgbmFtZT86IHN0cmluZyxcbiAgICAgIGR0eXBlPzogRGF0YVR5cGUpOiBWYXJpYWJsZTtcbiAgaW5jUmVmKGE6IFRlbnNvciwgYmFja2VuZDogQmFja2VuZCk6IHZvaWQ7XG4gIGRpc3Bvc2VUZW5zb3IodDogVGVuc29yKTogdm9pZDtcbiAgZGlzcG9zZVZhcmlhYmxlKHY6IFZhcmlhYmxlKTogdm9pZDtcbiAgcmVhZChkYXRhSWQ6IERhdGFJZCk6IFByb21pc2U8QmFja2VuZFZhbHVlcz47XG4gIHJlYWRTeW5jKGRhdGFJZDogRGF0YUlkKTogQmFja2VuZFZhbHVlcztcbiAgcmVhZFRvR1BVKGRhdGFJZDogRGF0YUlkLCBvcHRpb25zPzogRGF0YVRvR1BVT3B0aW9ucyk6IEdQVURhdGE7XG59XG5cbi8qKlxuICogVGhlIFRlbnNvciBjbGFzcyBjYWxscyBpbnRvIHRoaXMgaGFuZGxlciB0byBkZWxlZ2F0ZSBjaGFpbmluZyBvcGVyYXRpb25zLlxuICovXG5leHBvcnQgaW50ZXJmYWNlIE9wSGFuZGxlciB7XG4gIGNhc3Q8VCBleHRlbmRzIFRlbnNvcj4oeDogVCwgZHR5cGU6IERhdGFUeXBlKTogVDtcbiAgYnVmZmVyPFIgZXh0ZW5kcyBSYW5rLCBEIGV4dGVuZHMgRGF0YVR5cGU+KFxuICAgICAgc2hhcGU6IFNoYXBlTWFwW1JdLCBkdHlwZTogRCxcbiAgICAgIHZhbHVlcz86IERhdGFUeXBlTWFwW0RdKTogVGVuc29yQnVmZmVyPFIsIEQ+O1xuICBwcmludDxUIGV4dGVuZHMgVGVuc29yPih4OiBULCB2ZXJib3NlOiBib29sZWFuKTogdm9pZDtcbiAgY2xvbmU8VCBleHRlbmRzIFRlbnNvcj4oeDogVCk6IFQ7XG4gIC8vIFRPRE8oeWFzc29nYmEpIGJyaW5nIHJlc2hhcGUgYmFjaz9cbn1cblxuLy8gRm9yIHRyYWNraW5nIHRlbnNvciBjcmVhdGlvbiBhbmQgZGlzcG9zYWwuXG5sZXQgdHJhY2tlckZuOiAoKSA9PiBUZW5zb3JUcmFja2VyID0gbnVsbDtcbi8vIFVzZWQgYnkgY2hhaW5pbmcgbWV0aG9kcyB0byBjYWxsIGludG8gb3BzLlxubGV0IG9wSGFuZGxlcjogT3BIYW5kbGVyID0gbnVsbDtcbi8vIFVzZWQgdG8gd2FybiBhYm91dCBkZXByZWNhdGVkIG1ldGhvZHMuXG5sZXQgZGVwcmVjYXRpb25XYXJuaW5nRm46IChtc2c6IHN0cmluZykgPT4gdm9pZCA9IG51bGw7XG4vLyBUaGlzIGhlcmUgc28gdGhhdCB3ZSBjYW4gdXNlIHRoaXMgbWV0aG9kIG9uIGRldiBicmFuY2hlcyBhbmQga2VlcCB0aGVcbi8vIGZ1bmN0aW9uYWxpdHkgYXQgbWFzdGVyLlxuLy8gdHNsaW50OmRpc2FibGUtbmV4dC1saW5lOm5vLXVudXNlZC1leHByZXNzaW9uXG5bZGVwcmVjYXRpb25XYXJuaW5nRm5dO1xuXG4vKipcbiAqIEFuIGV4dGVybmFsIGNvbnN1bWVyIGNhbiByZWdpc3RlciBpdHNlbGYgYXMgdGhlIHRlbnNvciB0cmFja2VyLiBUaGlzIHdheVxuICogdGhlIFRlbnNvciBjbGFzcyBjYW4gbm90aWZ5IHRoZSB0cmFja2VyIGZvciBldmVyeSB0ZW5zb3IgY3JlYXRlZCBhbmRcbiAqIGRpc3Bvc2VkLlxuICovXG5leHBvcnQgZnVuY3Rpb24gc2V0VGVuc29yVHJhY2tlcihmbjogKCkgPT4gVGVuc29yVHJhY2tlcikge1xuICB0cmFja2VyRm4gPSBmbjtcbn1cblxuLyoqXG4gKiBBbiBleHRlcm5hbCBjb25zdW1lciBjYW4gcmVnaXN0ZXIgaXRzZWxmIGFzIHRoZSBvcCBoYW5kbGVyLiBUaGlzIHdheSB0aGVcbiAqIFRlbnNvciBjbGFzcyBjYW4gaGF2ZSBjaGFpbmluZyBtZXRob2RzIHRoYXQgY2FsbCBpbnRvIG9wcyB2aWEgdGhlIG9wXG4gKiBoYW5kbGVyLlxuICovXG5leHBvcnQgZnVuY3Rpb24gc2V0T3BIYW5kbGVyKGhhbmRsZXI6IE9wSGFuZGxlcikge1xuICBvcEhhbmRsZXIgPSBoYW5kbGVyO1xufVxuXG4vKipcbiAqIFNldHMgdGhlIGRlcHJlY2F0aW9uIHdhcm5pbmcgZnVuY3Rpb24gdG8gYmUgdXNlZCBieSB0aGlzIGZpbGUuIFRoaXMgd2F5IHRoZVxuICogVGVuc29yIGNsYXNzIGNhbiBiZSBhIGxlYWYgYnV0IHN0aWxsIHVzZSB0aGUgZW52aXJvbm1lbnQuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBzZXREZXByZWNhdGlvbldhcm5pbmdGbihmbjogKG1zZzogc3RyaW5nKSA9PiB2b2lkKSB7XG4gIGRlcHJlY2F0aW9uV2FybmluZ0ZuID0gZm47XG59XG5cbi8qKlxuICogV2Ugd3JhcCBkYXRhIGlkIHNpbmNlIHdlIHVzZSB3ZWFrIG1hcCB0byBhdm9pZCBtZW1vcnkgbGVha3MuXG4gKiBTaW5jZSB3ZSBoYXZlIG91ciBvd24gbWVtb3J5IG1hbmFnZW1lbnQsIHdlIGhhdmUgYSByZWZlcmVuY2UgY291bnRlclxuICogbWFwcGluZyBhIHRlbnNvciB0byBpdHMgZGF0YSwgc28gdGhlcmUgaXMgYWx3YXlzIGEgcG9pbnRlciAoZXZlbiBpZiB0aGF0XG4gKiBkYXRhIGlzIG90aGVyd2lzZSBnYXJiYWdlIGNvbGxlY3RhYmxlKS5cbiAqIFNlZSBodHRwczovL2RldmVsb3Blci5tb3ppbGxhLm9yZy9lbi1VUy9kb2NzL1dlYi9KYXZhU2NyaXB0L1JlZmVyZW5jZS9cbiAqIEdsb2JhbF9PYmplY3RzL1dlYWtNYXBcbiAqL1xuZXhwb3J0IHR5cGUgRGF0YUlkID0gb2JqZWN0OyAgLy8gb2JqZWN0IGluc3RlYWQgb2Yge30gdG8gZm9yY2Ugbm9uLXByaW1pdGl2ZS5cblxuLy8gRGVjbGFyZSB0aGlzIG5hbWVzcGFjZSB0byBtYWtlIFRlbnNvciBjbGFzcyBhdWdtZW50YXRpb24gd29yayBpbiBnb29nbGUzLlxuZXhwb3J0IGRlY2xhcmUgbmFtZXNwYWNlIFRlbnNvciB7fVxuLyoqXG4gKiBBIGB0Zi5UZW5zb3JgIG9iamVjdCByZXByZXNlbnRzIGFuIGltbXV0YWJsZSwgbXVsdGlkaW1lbnNpb25hbCBhcnJheSBvZlxuICogbnVtYmVycyB0aGF0IGhhcyBhIHNoYXBlIGFuZCBhIGRhdGEgdHlwZS5cbiAqXG4gKiBGb3IgcGVyZm9ybWFuY2UgcmVhc29ucywgZnVuY3Rpb25zIHRoYXQgY3JlYXRlIHRlbnNvcnMgZG8gbm90IG5lY2Vzc2FyaWx5XG4gKiBwZXJmb3JtIGEgY29weSBvZiB0aGUgZGF0YSBwYXNzZWQgdG8gdGhlbSAoZS5nLiBpZiB0aGUgZGF0YSBpcyBwYXNzZWQgYXMgYVxuICogYEZsb2F0MzJBcnJheWApLCBhbmQgY2hhbmdlcyB0byB0aGUgZGF0YSB3aWxsIGNoYW5nZSB0aGUgdGVuc29yLiBUaGlzIGlzIG5vdFxuICogYSBmZWF0dXJlIGFuZCBpcyBub3Qgc3VwcG9ydGVkLiBUbyBhdm9pZCB0aGlzIGJlaGF2aW9yLCB1c2UgdGhlIHRlbnNvciBiZWZvcmVcbiAqIGNoYW5naW5nIHRoZSBpbnB1dCBkYXRhIG9yIGNyZWF0ZSBhIGNvcHkgd2l0aCBgY29weSA9IHRmLmFkZCh5b3VyVGVuc29yLCAwKWAuXG4gKlxuICogU2VlIGB0Zi50ZW5zb3JgIGZvciBkZXRhaWxzIG9uIGhvdyB0byBjcmVhdGUgYSBgdGYuVGVuc29yYC5cbiAqXG4gKiBAZG9jIHtoZWFkaW5nOiAnVGVuc29ycycsIHN1YmhlYWRpbmc6ICdDbGFzc2VzJ31cbiAqL1xuZXhwb3J0IGNsYXNzIFRlbnNvcjxSIGV4dGVuZHMgUmFuayA9IFJhbms+IHtcbiAgLyoqIFVuaXF1ZSBpZCBvZiB0aGlzIHRlbnNvci4gKi9cbiAgcmVhZG9ubHkgaWQ6IG51bWJlcjtcbiAgLyoqXG4gICAqIElkIG9mIHRoZSBidWNrZXQgaG9sZGluZyB0aGUgZGF0YSBmb3IgdGhpcyB0ZW5zb3IuIE11bHRpcGxlIGFycmF5cyBjYW5cbiAgICogcG9pbnQgdG8gdGhlIHNhbWUgYnVja2V0IChlLmcuIHdoZW4gY2FsbGluZyBhcnJheS5yZXNoYXBlKCkpLlxuICAgKi9cbiAgZGF0YUlkOiBEYXRhSWQ7XG4gIC8qKiBUaGUgc2hhcGUgb2YgdGhlIHRlbnNvci4gKi9cbiAgcmVhZG9ubHkgc2hhcGU6IFNoYXBlTWFwW1JdO1xuICAvKiogTnVtYmVyIG9mIGVsZW1lbnRzIGluIHRoZSB0ZW5zb3IuICovXG4gIHJlYWRvbmx5IHNpemU6IG51bWJlcjtcbiAgLyoqIFRoZSBkYXRhIHR5cGUgZm9yIHRoZSBhcnJheS4gKi9cbiAgcmVhZG9ubHkgZHR5cGU6IERhdGFUeXBlO1xuICAvKiogVGhlIHJhbmsgdHlwZSBmb3IgdGhlIGFycmF5IChzZWUgYFJhbmtgIGVudW0pLiAqL1xuICByZWFkb25seSByYW5rVHlwZTogUjtcblxuICAvKiogV2hldGhlciB0aGlzIHRlbnNvciBoYXMgYmVlbiBnbG9iYWxseSBrZXB0LiAqL1xuICBrZXB0ID0gZmFsc2U7XG4gIC8qKiBUaGUgaWQgb2YgdGhlIHNjb3BlIHRoaXMgdGVuc29yIGlzIGJlaW5nIHRyYWNrZWQgaW4uICovXG4gIHNjb3BlSWQ6IG51bWJlcjtcblxuICAvKipcbiAgICogTnVtYmVyIG9mIGVsZW1lbnRzIHRvIHNraXAgaW4gZWFjaCBkaW1lbnNpb24gd2hlbiBpbmRleGluZy4gU2VlXG4gICAqIGh0dHBzOi8vZG9jcy5zY2lweS5vcmcvZG9jL251bXB5L3JlZmVyZW5jZS9nZW5lcmF0ZWQvXFxcbiAgICogbnVtcHkubmRhcnJheS5zdHJpZGVzLmh0bWxcbiAgICovXG4gIHJlYWRvbmx5IHN0cmlkZXM6IG51bWJlcltdO1xuXG4gIGNvbnN0cnVjdG9yKHNoYXBlOiBTaGFwZU1hcFtSXSwgZHR5cGU6IERhdGFUeXBlLCBkYXRhSWQ6IERhdGFJZCwgaWQ6IG51bWJlcikge1xuICAgIHRoaXMuc2hhcGUgPSBzaGFwZS5zbGljZSgpIGFzIFNoYXBlTWFwW1JdO1xuICAgIHRoaXMuZHR5cGUgPSBkdHlwZSB8fCAnZmxvYXQzMic7XG4gICAgdGhpcy5zaXplID0gdXRpbC5zaXplRnJvbVNoYXBlKHNoYXBlKTtcbiAgICB0aGlzLnN0cmlkZXMgPSBjb21wdXRlU3RyaWRlcyhzaGFwZSk7XG4gICAgdGhpcy5kYXRhSWQgPSBkYXRhSWQ7XG4gICAgdGhpcy5pZCA9IGlkO1xuICAgIHRoaXMucmFua1R5cGUgPSAodGhpcy5yYW5rIDwgNSA/IHRoaXMucmFuay50b1N0cmluZygpIDogJ2hpZ2hlcicpIGFzIFI7XG4gIH1cblxuICBnZXQgcmFuaygpOiBudW1iZXIge1xuICAgIHJldHVybiB0aGlzLnNoYXBlLmxlbmd0aDtcbiAgfVxuXG4gIC8qKlxuICAgKiBSZXR1cm5zIGEgcHJvbWlzZSBvZiBgdGYuVGVuc29yQnVmZmVyYCB0aGF0IGhvbGRzIHRoZSB1bmRlcmx5aW5nIGRhdGEuXG4gICAqXG4gICAqIEBkb2Mge2hlYWRpbmc6ICdUZW5zb3JzJywgc3ViaGVhZGluZzogJ0NsYXNzZXMnfVxuICAgKi9cbiAgYXN5bmMgYnVmZmVyPEQgZXh0ZW5kcyBEYXRhVHlwZSA9ICdmbG9hdDMyJz4oKTogUHJvbWlzZTxUZW5zb3JCdWZmZXI8UiwgRD4+IHtcbiAgICBjb25zdCB2YWxzID0gYXdhaXQgdGhpcy5kYXRhPEQ+KCk7XG4gICAgcmV0dXJuIG9wSGFuZGxlci5idWZmZXIodGhpcy5zaGFwZSwgdGhpcy5kdHlwZSBhcyBELCB2YWxzKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBSZXR1cm5zIGEgYHRmLlRlbnNvckJ1ZmZlcmAgdGhhdCBob2xkcyB0aGUgdW5kZXJseWluZyBkYXRhLlxuICAgKiBAZG9jIHtoZWFkaW5nOiAnVGVuc29ycycsIHN1YmhlYWRpbmc6ICdDbGFzc2VzJ31cbiAgICovXG4gIGJ1ZmZlclN5bmM8RCBleHRlbmRzIERhdGFUeXBlID0gJ2Zsb2F0MzInPigpOiBUZW5zb3JCdWZmZXI8UiwgRD4ge1xuICAgIHJldHVybiBvcEhhbmRsZXIuYnVmZmVyKHRoaXMuc2hhcGUsIHRoaXMuZHR5cGUgYXMgRCwgdGhpcy5kYXRhU3luYygpKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBSZXR1cm5zIHRoZSB0ZW5zb3IgZGF0YSBhcyBhIG5lc3RlZCBhcnJheS4gVGhlIHRyYW5zZmVyIG9mIGRhdGEgaXMgZG9uZVxuICAgKiBhc3luY2hyb25vdXNseS5cbiAgICpcbiAgICogQGRvYyB7aGVhZGluZzogJ1RlbnNvcnMnLCBzdWJoZWFkaW5nOiAnQ2xhc3Nlcyd9XG4gICAqL1xuICBhc3luYyBhcnJheSgpOiBQcm9taXNlPEFycmF5TWFwW1JdPiB7XG4gICAgY29uc3QgdmFscyA9IGF3YWl0IHRoaXMuZGF0YSgpO1xuICAgIHJldHVybiB0b05lc3RlZEFycmF5KHRoaXMuc2hhcGUsIHZhbHMsIHRoaXMuZHR5cGUgPT09ICdjb21wbGV4NjQnKSBhc1xuICAgICAgICBBcnJheU1hcFtSXTtcbiAgfVxuXG4gIC8qKlxuICAgKiBSZXR1cm5zIHRoZSB0ZW5zb3IgZGF0YSBhcyBhIG5lc3RlZCBhcnJheS4gVGhlIHRyYW5zZmVyIG9mIGRhdGEgaXMgZG9uZVxuICAgKiBzeW5jaHJvbm91c2x5LlxuICAgKlxuICAgKiBAZG9jIHtoZWFkaW5nOiAnVGVuc29ycycsIHN1YmhlYWRpbmc6ICdDbGFzc2VzJ31cbiAgICovXG4gIGFycmF5U3luYygpOiBBcnJheU1hcFtSXSB7XG4gICAgcmV0dXJuIHRvTmVzdGVkQXJyYXkoXG4gICAgICAgICAgICAgICB0aGlzLnNoYXBlLCB0aGlzLmRhdGFTeW5jKCksIHRoaXMuZHR5cGUgPT09ICdjb21wbGV4NjQnKSBhc1xuICAgICAgICBBcnJheU1hcFtSXTtcbiAgfVxuXG4gIC8qKlxuICAgKiBBc3luY2hyb25vdXNseSBkb3dubG9hZHMgdGhlIHZhbHVlcyBmcm9tIHRoZSBgdGYuVGVuc29yYC4gUmV0dXJucyBhXG4gICAqIHByb21pc2Ugb2YgYFR5cGVkQXJyYXlgIHRoYXQgcmVzb2x2ZXMgd2hlbiB0aGUgY29tcHV0YXRpb24gaGFzIGZpbmlzaGVkLlxuICAgKlxuICAgKiBAZG9jIHtoZWFkaW5nOiAnVGVuc29ycycsIHN1YmhlYWRpbmc6ICdDbGFzc2VzJ31cbiAgICovXG4gIGFzeW5jIGRhdGE8RCBleHRlbmRzIERhdGFUeXBlID0gTnVtZXJpY0RhdGFUeXBlPigpOiBQcm9taXNlPERhdGFUeXBlTWFwW0RdPiB7XG4gICAgdGhpcy50aHJvd0lmRGlzcG9zZWQoKTtcbiAgICBjb25zdCBkYXRhID0gdHJhY2tlckZuKCkucmVhZCh0aGlzLmRhdGFJZCk7XG4gICAgaWYgKHRoaXMuZHR5cGUgPT09ICdzdHJpbmcnKSB7XG4gICAgICBjb25zdCBieXRlcyA9IGF3YWl0IGRhdGEgYXMgVWludDhBcnJheVtdO1xuICAgICAgdHJ5IHtcbiAgICAgICAgcmV0dXJuIGJ5dGVzLm1hcChiID0+IHV0aWwuZGVjb2RlU3RyaW5nKGIpKSBhcyBEYXRhVHlwZU1hcFtEXTtcbiAgICAgIH0gY2F0Y2gge1xuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoXG4gICAgICAgICAgICAnRmFpbGVkIHRvIGRlY29kZSB0aGUgc3RyaW5nIGJ5dGVzIGludG8gdXRmLTguICcgK1xuICAgICAgICAgICAgJ1RvIGdldCB0aGUgb3JpZ2luYWwgYnl0ZXMsIGNhbGwgdGVuc29yLmJ5dGVzKCkuJyk7XG4gICAgICB9XG4gICAgfVxuICAgIHJldHVybiBkYXRhIGFzIFByb21pc2U8RGF0YVR5cGVNYXBbRF0+O1xuICB9XG5cbiAgLyoqXG4gICAqIENvcHkgdGhlIHRlbnNvcidzIGRhdGEgdG8gYSBuZXcgR1BVIHJlc291cmNlLiBDb21wYXJpbmcgdG8gdGhlIGBkYXRhU3luYygpYFxuICAgKiBhbmQgYGRhdGEoKWAsIHRoaXMgbWV0aG9kIHByZXZlbnRzIGRhdGEgZnJvbSBiZWluZyBkb3dubG9hZGVkIHRvIENQVS5cbiAgICpcbiAgICogRm9yIFdlYkdMIGJhY2tlbmQsIHRoZSBkYXRhIHdpbGwgYmUgc3RvcmVkIG9uIGEgZGVuc2VseSBwYWNrZWQgdGV4dHVyZS5cbiAgICogVGhpcyBtZWFucyB0aGF0IHRoZSB0ZXh0dXJlIHdpbGwgdXNlIHRoZSBSR0JBIGNoYW5uZWxzIHRvIHN0b3JlIHZhbHVlLlxuICAgKlxuICAgKiBGb3IgV2ViR1BVIGJhY2tlbmQsIHRoZSBkYXRhIHdpbGwgYmUgc3RvcmVkIG9uIGEgYnVmZmVyLiBUaGVyZSBpcyBub1xuICAgKiBwYXJhbWV0ZXIsIHNvIGNhbiBub3QgdXNlIGEgdXNlci1kZWZpbmVkIHNpemUgdG8gY3JlYXRlIHRoZSBidWZmZXIuXG4gICAqXG4gICAqIEBwYXJhbSBvcHRpb25zOlxuICAgKiAgICAgRm9yIFdlYkdMLFxuICAgKiAgICAgICAgIC0gY3VzdG9tVGV4U2hhcGU6IE9wdGlvbmFsLiBJZiBzZXQsIHdpbGwgdXNlIHRoZSB1c2VyIGRlZmluZWRcbiAgICogICAgIHRleHR1cmUgc2hhcGUgdG8gY3JlYXRlIHRoZSB0ZXh0dXJlLlxuICAgKlxuICAgKiBAcmV0dXJucyBGb3IgV2ViR0wgYmFja2VuZCwgYSBHUFVEYXRhIGNvbnRhaW5zIHRoZSBuZXcgdGV4dHVyZSBhbmRcbiAgICogICAgIGl0cyBpbmZvcm1hdGlvbi5cbiAgICogICAgIHtcbiAgICogICAgICAgIHRlbnNvclJlZjogVGhlIHRlbnNvciB0aGF0IGlzIGFzc29jaWF0ZWQgd2l0aCB0aGlzIHRleHR1cmUsXG4gICAqICAgICAgICB0ZXh0dXJlOiBXZWJHTFRleHR1cmUsXG4gICAqICAgICAgICB0ZXhTaGFwZTogW251bWJlciwgbnVtYmVyXSAvLyBbaGVpZ2h0LCB3aWR0aF1cbiAgICogICAgIH1cbiAgICpcbiAgICogICAgIEZvciBXZWJHUFUgYmFja2VuZCwgYSBHUFVEYXRhIGNvbnRhaW5zIHRoZSBuZXcgYnVmZmVyIGFuZFxuICAgKiAgICAgaXRzIGluZm9ybWF0aW9uLlxuICAgKiAgICAge1xuICAgKiAgICAgICAgdGVuc29yUmVmOiBUaGUgdGVuc29yIHRoYXQgaXMgYXNzb2NpYXRlZCB3aXRoIHRoaXMgYnVmZmVyLFxuICAgKiAgICAgICAgYnVmZmVyOiBHUFVCdWZmZXIsXG4gICAqICAgICAgICBidWZTaXplOiBudW1iZXJcbiAgICogICAgIH1cbiAgICpcbiAgICogICAgIFJlbWVtYmVyIHRvIGRpc3Bvc2UgdGhlIEdQVURhdGEgYWZ0ZXIgaXQgaXMgdXNlZCBieVxuICAgKiAgICAgYHJlcy50ZW5zb3JSZWYuZGlzcG9zZSgpYC5cbiAgICpcbiAgICogQGRvYyB7aGVhZGluZzogJ1RlbnNvcnMnLCBzdWJoZWFkaW5nOiAnQ2xhc3Nlcyd9XG4gICAqL1xuICBkYXRhVG9HUFUob3B0aW9ucz86IERhdGFUb0dQVU9wdGlvbnMpOiBHUFVEYXRhIHtcbiAgICB0aGlzLnRocm93SWZEaXNwb3NlZCgpO1xuICAgIHJldHVybiB0cmFja2VyRm4oKS5yZWFkVG9HUFUodGhpcy5kYXRhSWQsIG9wdGlvbnMpO1xuICB9XG5cbiAgLyoqXG4gICAqIFN5bmNocm9ub3VzbHkgZG93bmxvYWRzIHRoZSB2YWx1ZXMgZnJvbSB0aGUgYHRmLlRlbnNvcmAuIFRoaXMgYmxvY2tzIHRoZVxuICAgKiBVSSB0aHJlYWQgdW50aWwgdGhlIHZhbHVlcyBhcmUgcmVhZHksIHdoaWNoIGNhbiBjYXVzZSBwZXJmb3JtYW5jZSBpc3N1ZXMuXG4gICAqXG4gICAqIEBkb2Mge2hlYWRpbmc6ICdUZW5zb3JzJywgc3ViaGVhZGluZzogJ0NsYXNzZXMnfVxuICAgKi9cbiAgZGF0YVN5bmM8RCBleHRlbmRzIERhdGFUeXBlID0gTnVtZXJpY0RhdGFUeXBlPigpOiBEYXRhVHlwZU1hcFtEXSB7XG4gICAgdGhpcy50aHJvd0lmRGlzcG9zZWQoKTtcbiAgICBjb25zdCBkYXRhID0gdHJhY2tlckZuKCkucmVhZFN5bmModGhpcy5kYXRhSWQpO1xuICAgIGlmICh0aGlzLmR0eXBlID09PSAnc3RyaW5nJykge1xuICAgICAgdHJ5IHtcbiAgICAgICAgcmV0dXJuIChkYXRhIGFzIFVpbnQ4QXJyYXlbXSkubWFwKGIgPT4gdXRpbC5kZWNvZGVTdHJpbmcoYikpIGFzXG4gICAgICAgICAgICBEYXRhVHlwZU1hcFtEXTtcbiAgICAgIH0gY2F0Y2gge1xuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoXG4gICAgICAgICAgICAnRmFpbGVkIHRvIGRlY29kZSB0aGUgc3RyaW5nIGJ5dGVzIGludG8gdXRmLTguICcgK1xuICAgICAgICAgICAgJ1RvIGdldCB0aGUgb3JpZ2luYWwgYnl0ZXMsIGNhbGwgdGVuc29yLmJ5dGVzKCkuJyk7XG4gICAgICB9XG4gICAgfVxuICAgIHJldHVybiBkYXRhIGFzIERhdGFUeXBlTWFwW0RdO1xuICB9XG5cbiAgLyoqIFJldHVybnMgdGhlIHVuZGVybHlpbmcgYnl0ZXMgb2YgdGhlIHRlbnNvcidzIGRhdGEuICovXG4gIGFzeW5jIGJ5dGVzKCk6IFByb21pc2U8VWludDhBcnJheVtdfFVpbnQ4QXJyYXk+IHtcbiAgICB0aGlzLnRocm93SWZEaXNwb3NlZCgpO1xuICAgIGNvbnN0IGRhdGEgPSBhd2FpdCB0cmFja2VyRm4oKS5yZWFkKHRoaXMuZGF0YUlkKTtcbiAgICBpZiAodGhpcy5kdHlwZSA9PT0gJ3N0cmluZycpIHtcbiAgICAgIHJldHVybiBkYXRhIGFzIFVpbnQ4QXJyYXlbXTtcbiAgICB9IGVsc2Uge1xuICAgICAgcmV0dXJuIG5ldyBVaW50OEFycmF5KChkYXRhIGFzIFR5cGVkQXJyYXkpLmJ1ZmZlcik7XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIERpc3Bvc2VzIGB0Zi5UZW5zb3JgIGZyb20gbWVtb3J5LlxuICAgKlxuICAgKiBAZG9jIHtoZWFkaW5nOiAnVGVuc29ycycsIHN1YmhlYWRpbmc6ICdDbGFzc2VzJ31cbiAgICovXG4gIGRpc3Bvc2UoKTogdm9pZCB7XG4gICAgaWYgKHRoaXMuaXNEaXNwb3NlZCkge1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICB0cmFja2VyRm4oKS5kaXNwb3NlVGVuc29yKHRoaXMpO1xuICAgIHRoaXMuaXNEaXNwb3NlZEludGVybmFsID0gdHJ1ZTtcbiAgfVxuXG4gIHByb3RlY3RlZCBpc0Rpc3Bvc2VkSW50ZXJuYWwgPSBmYWxzZTtcbiAgZ2V0IGlzRGlzcG9zZWQoKTogYm9vbGVhbiB7XG4gICAgcmV0dXJuIHRoaXMuaXNEaXNwb3NlZEludGVybmFsO1xuICB9XG5cbiAgdGhyb3dJZkRpc3Bvc2VkKCkge1xuICAgIGlmICh0aGlzLmlzRGlzcG9zZWQpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcihgVGVuc29yIGlzIGRpc3Bvc2VkLmApO1xuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBQcmludHMgdGhlIGB0Zi5UZW5zb3JgLiBTZWUgYHRmLnByaW50YCBmb3IgZGV0YWlscy5cbiAgICpcbiAgICogQHBhcmFtIHZlcmJvc2UgV2hldGhlciB0byBwcmludCB2ZXJib3NlIGluZm9ybWF0aW9uIGFib3V0IHRoZSB0ZW5zb3IsXG4gICAqICAgIGluY2x1ZGluZyBkdHlwZSBhbmQgc2l6ZS5cbiAgICpcbiAgICogQGRvYyB7aGVhZGluZzogJ1RlbnNvcnMnLCBzdWJoZWFkaW5nOiAnQ2xhc3Nlcyd9XG4gICAqL1xuICBwcmludCh2ZXJib3NlID0gZmFsc2UpOiB2b2lkIHtcbiAgICByZXR1cm4gb3BIYW5kbGVyLnByaW50KHRoaXMsIHZlcmJvc2UpO1xuICB9XG5cbiAgLyoqXG4gICAqIFJldHVybnMgYSBjb3B5IG9mIHRoZSB0ZW5zb3IuIFNlZSBgdGYuY2xvbmVgIGZvciBkZXRhaWxzLlxuICAgKiBAZG9jIHtoZWFkaW5nOiAnVGVuc29ycycsIHN1YmhlYWRpbmc6ICdDbGFzc2VzJ31cbiAgICovXG4gIGNsb25lPFQgZXh0ZW5kcyBUZW5zb3I+KHRoaXM6IFQpOiBUIHtcbiAgICB0aGlzLnRocm93SWZEaXNwb3NlZCgpO1xuICAgIHJldHVybiBvcEhhbmRsZXIuY2xvbmUodGhpcyk7XG4gIH1cblxuICAvKipcbiAgICogUmV0dXJucyBhIGh1bWFuLXJlYWRhYmxlIGRlc2NyaXB0aW9uIG9mIHRoZSB0ZW5zb3IuIFVzZWZ1bCBmb3IgbG9nZ2luZy5cbiAgICpcbiAgICogQGRvYyB7aGVhZGluZzogJ1RlbnNvcnMnLCBzdWJoZWFkaW5nOiAnQ2xhc3Nlcyd9XG4gICAqL1xuICB0b1N0cmluZyh2ZXJib3NlID0gZmFsc2UpOiBzdHJpbmcge1xuICAgIGNvbnN0IHZhbHMgPSB0aGlzLmRhdGFTeW5jKCk7XG4gICAgcmV0dXJuIHRlbnNvclRvU3RyaW5nKHZhbHMsIHRoaXMuc2hhcGUsIHRoaXMuZHR5cGUsIHZlcmJvc2UpO1xuICB9XG5cbiAgY2FzdDxUIGV4dGVuZHMgdGhpcz4oZHR5cGU6IERhdGFUeXBlKTogVCB7XG4gICAgdGhpcy50aHJvd0lmRGlzcG9zZWQoKTtcbiAgICByZXR1cm4gb3BIYW5kbGVyLmNhc3QodGhpcyBhcyBULCBkdHlwZSk7XG4gIH1cbiAgdmFyaWFibGUodHJhaW5hYmxlID0gdHJ1ZSwgbmFtZT86IHN0cmluZywgZHR5cGU/OiBEYXRhVHlwZSk6IFZhcmlhYmxlPFI+IHtcbiAgICB0aGlzLnRocm93SWZEaXNwb3NlZCgpO1xuICAgIHJldHVybiB0cmFja2VyRm4oKS5tYWtlVmFyaWFibGUodGhpcywgdHJhaW5hYmxlLCBuYW1lLCBkdHlwZSkgYXNcbiAgICAgICAgVmFyaWFibGU8Uj47XG4gIH1cbn1cblxuT2JqZWN0LmRlZmluZVByb3BlcnR5KFRlbnNvciwgU3ltYm9sLmhhc0luc3RhbmNlLCB7XG4gIHZhbHVlOiAoaW5zdGFuY2U6IFRlbnNvcikgPT4ge1xuICAgIC8vIEltcGxlbWVudGF0aW9uIG5vdGU6IHdlIHNob3VsZCB1c2UgcHJvcGVydGllcyBvZiB0aGUgb2JqZWN0IHRoYXQgd2lsbCBiZVxuICAgIC8vIGRlZmluZWQgYmVmb3JlIHRoZSBjb25zdHJ1Y3RvciBib2R5IGhhcyBmaW5pc2hlZCBleGVjdXRpbmcgKG1ldGhvZHMpLlxuICAgIC8vIFRoaXMgaXMgYmVjYXVzZSB3aGVuIHRoaXMgY29kZSBpcyB0cmFuc3BpbGVkIGJ5IGJhYmVsLCBiYWJlbCB3aWxsIGNhbGxcbiAgICAvLyBjbGFzc0NhbGxDaGVjayBiZWZvcmUgdGhlIGNvbnN0cnVjdG9yIGJvZHkgaXMgcnVuLlxuICAgIC8vIFNlZSBodHRwczovL2dpdGh1Yi5jb20vdGVuc29yZmxvdy90ZmpzL2lzc3Vlcy8zMzg0IGZvciBiYWNrc3RvcnkuXG4gICAgcmV0dXJuICEhaW5zdGFuY2UgJiYgaW5zdGFuY2UuZGF0YSAhPSBudWxsICYmIGluc3RhbmNlLmRhdGFTeW5jICE9IG51bGwgJiZcbiAgICAgICAgaW5zdGFuY2UudGhyb3dJZkRpc3Bvc2VkICE9IG51bGw7XG4gIH1cbn0pO1xuXG5leHBvcnQgZnVuY3Rpb24gZ2V0R2xvYmFsVGVuc29yQ2xhc3MoKSB7XG4gIC8vIFVzZSBnZXRHbG9iYWwgc28gdGhhdCB3ZSBjYW4gYXVnbWVudCB0aGUgVGVuc29yIGNsYXNzIGFjcm9zcyBwYWNrYWdlXG4gIC8vIGJvdW5kYXJpZXMgYmVjYXNlIHRoZSBub2RlIHJlc29sdXRpb24gYWxnIG1heSByZXN1bHQgaW4gZGlmZmVyZW50IG1vZHVsZXNcbiAgLy8gYmVpbmcgcmV0dXJuZWQgZm9yIHRoaXMgZmlsZSBkZXBlbmRpbmcgb24gdGhlIHBhdGggdGhleSBhcmUgbG9hZGVkIGZyb20uXG4gIHJldHVybiBnZXRHbG9iYWwoJ1RlbnNvcicsICgpID0+IHtcbiAgICByZXR1cm4gVGVuc29yO1xuICB9KTtcbn1cblxuLy8gR2xvYmFsIHNpZGUgZWZmZWN0LiBDYWNoZSBnbG9iYWwgcmVmZXJlbmNlIHRvIFRlbnNvciBjbGFzc1xuZ2V0R2xvYmFsVGVuc29yQ2xhc3MoKTtcblxuZXhwb3J0IGludGVyZmFjZSBOdW1lcmljVGVuc29yPFIgZXh0ZW5kcyBSYW5rID0gUmFuaz4gZXh0ZW5kcyBUZW5zb3I8Uj4ge1xuICBkdHlwZTogTnVtZXJpY0RhdGFUeXBlO1xuICBkYXRhU3luYzxEIGV4dGVuZHMgRGF0YVR5cGUgPSBOdW1lcmljRGF0YVR5cGU+KCk6IERhdGFUeXBlTWFwW0RdO1xuICBkYXRhPEQgZXh0ZW5kcyBEYXRhVHlwZSA9IE51bWVyaWNEYXRhVHlwZT4oKTogUHJvbWlzZTxEYXRhVHlwZU1hcFtEXT47XG4gIGRhdGFUb0dQVShvcHRpb25zPzogRGF0YVRvR1BVT3B0aW9ucyk6IEdQVURhdGE7XG59XG5cbmV4cG9ydCBpbnRlcmZhY2UgU3RyaW5nVGVuc29yPFIgZXh0ZW5kcyBSYW5rID0gUmFuaz4gZXh0ZW5kcyBUZW5zb3I8Uj4ge1xuICBkdHlwZTogJ3N0cmluZyc7XG4gIGRhdGFTeW5jPEQgZXh0ZW5kcyBEYXRhVHlwZSA9ICdzdHJpbmcnPigpOiBEYXRhVHlwZU1hcFtEXTtcbiAgZGF0YTxEIGV4dGVuZHMgRGF0YVR5cGUgPSAnc3RyaW5nJz4oKTogUHJvbWlzZTxEYXRhVHlwZU1hcFtEXT47XG59XG5cbi8qKiBAZG9jbGluayBUZW5zb3IgKi9cbmV4cG9ydCB0eXBlIFNjYWxhciA9IFRlbnNvcjxSYW5rLlIwPjtcbi8qKiBAZG9jbGluayBUZW5zb3IgKi9cbmV4cG9ydCB0eXBlIFRlbnNvcjFEID0gVGVuc29yPFJhbmsuUjE+O1xuLyoqIEBkb2NsaW5rIFRlbnNvciAqL1xuZXhwb3J0IHR5cGUgVGVuc29yMkQgPSBUZW5zb3I8UmFuay5SMj47XG4vKiogQGRvY2xpbmsgVGVuc29yICovXG5leHBvcnQgdHlwZSBUZW5zb3IzRCA9IFRlbnNvcjxSYW5rLlIzPjtcbi8qKiBAZG9jbGluayBUZW5zb3IgKi9cbmV4cG9ydCB0eXBlIFRlbnNvcjREID0gVGVuc29yPFJhbmsuUjQ+O1xuLyoqIEBkb2NsaW5rIFRlbnNvciAqL1xuZXhwb3J0IHR5cGUgVGVuc29yNUQgPSBUZW5zb3I8UmFuay5SNT47XG4vKiogQGRvY2xpbmsgVGVuc29yICovXG5leHBvcnQgdHlwZSBUZW5zb3I2RCA9IFRlbnNvcjxSYW5rLlI2PjtcblxuLyoqXG4gKiBBIG11dGFibGUgYHRmLlRlbnNvcmAsIHVzZWZ1bCBmb3IgcGVyc2lzdGluZyBzdGF0ZSwgZS5nLiBmb3IgdHJhaW5pbmcuXG4gKlxuICogQGRvYyB7aGVhZGluZzogJ1RlbnNvcnMnLCBzdWJoZWFkaW5nOiAnQ2xhc3Nlcyd9XG4gKi9cbmV4cG9ydCBjbGFzcyBWYXJpYWJsZTxSIGV4dGVuZHMgUmFuayA9IFJhbms+IGV4dGVuZHMgVGVuc29yPFI+IHtcbiAgbmFtZTogc3RyaW5nO1xuXG4gIGNvbnN0cnVjdG9yKFxuICAgICAgaW5pdGlhbFZhbHVlOiBUZW5zb3I8Uj4sIHB1YmxpYyB0cmFpbmFibGU6IGJvb2xlYW4sIG5hbWU6IHN0cmluZyxcbiAgICAgIHRlbnNvcklkOiBudW1iZXIpIHtcbiAgICBzdXBlcihcbiAgICAgICAgaW5pdGlhbFZhbHVlLnNoYXBlLCBpbml0aWFsVmFsdWUuZHR5cGUsIGluaXRpYWxWYWx1ZS5kYXRhSWQsIHRlbnNvcklkKTtcbiAgICB0aGlzLm5hbWUgPSBuYW1lO1xuICB9XG5cbiAgLyoqXG4gICAqIEFzc2lnbiBhIG5ldyBgdGYuVGVuc29yYCB0byB0aGlzIHZhcmlhYmxlLiBUaGUgbmV3IGB0Zi5UZW5zb3JgIG11c3QgaGF2ZVxuICAgKiB0aGUgc2FtZSBzaGFwZSBhbmQgZHR5cGUgYXMgdGhlIG9sZCBgdGYuVGVuc29yYC5cbiAgICpcbiAgICogQHBhcmFtIG5ld1ZhbHVlIE5ldyB0ZW5zb3IgdG8gYmUgYXNzaWduZWQgdG8gdGhpcyB2YXJpYWJsZS5cbiAgICpcbiAgICogQGRvYyB7aGVhZGluZzogJ1RlbnNvcnMnLCBzdWJoZWFkaW5nOiAnQ2xhc3Nlcyd9XG4gICAqL1xuICBhc3NpZ24obmV3VmFsdWU6IFRlbnNvcjxSPik6IHZvaWQge1xuICAgIGlmIChuZXdWYWx1ZS5kdHlwZSAhPT0gdGhpcy5kdHlwZSkge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKFxuICAgICAgICAgIGBkdHlwZSBvZiB0aGUgbmV3IHZhbHVlICgke25ld1ZhbHVlLmR0eXBlfSkgYW5kIGAgK1xuICAgICAgICAgIGBwcmV2aW91cyB2YWx1ZSAoJHt0aGlzLmR0eXBlfSkgbXVzdCBtYXRjaGApO1xuICAgIH1cbiAgICBpZiAoIXV0aWwuYXJyYXlzRXF1YWwobmV3VmFsdWUuc2hhcGUsIHRoaXMuc2hhcGUpKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoXG4gICAgICAgICAgYHNoYXBlIG9mIHRoZSBuZXcgdmFsdWUgKCR7bmV3VmFsdWUuc2hhcGV9KSBhbmQgYCArXG4gICAgICAgICAgYHByZXZpb3VzIHZhbHVlICgke3RoaXMuc2hhcGV9KSBtdXN0IG1hdGNoYCk7XG4gICAgfVxuICAgIHRyYWNrZXJGbigpLmRpc3Bvc2VUZW5zb3IodGhpcyk7XG4gICAgdGhpcy5kYXRhSWQgPSBuZXdWYWx1ZS5kYXRhSWQ7XG4gICAgdHJhY2tlckZuKCkuaW5jUmVmKHRoaXMsIG51bGwgLyogYmFja2VuZCAqLyk7XG4gIH1cblxuICBkaXNwb3NlKCk6IHZvaWQge1xuICAgIHRyYWNrZXJGbigpLmRpc3Bvc2VWYXJpYWJsZSh0aGlzKTtcbiAgICB0aGlzLmlzRGlzcG9zZWRJbnRlcm5hbCA9IHRydWU7XG4gIH1cbn1cblxuT2JqZWN0LmRlZmluZVByb3BlcnR5KFZhcmlhYmxlLCBTeW1ib2wuaGFzSW5zdGFuY2UsIHtcbiAgdmFsdWU6IChpbnN0YW5jZTogVmFyaWFibGUpID0+IHtcbiAgICByZXR1cm4gaW5zdGFuY2UgaW5zdGFuY2VvZiBUZW5zb3IgJiYgaW5zdGFuY2UuYXNzaWduICE9IG51bGwgJiZcbiAgICAgICAgaW5zdGFuY2UuYXNzaWduIGluc3RhbmNlb2YgRnVuY3Rpb247XG4gIH1cbn0pO1xuIl19","/**\n * @license\n * Copyright 2018 Google LLC. All Rights Reserved.\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n * =============================================================================\n */\nimport { Tensor } from './tensor';\nimport { upcastType } from './types';\nimport { assert } from './util';\nexport function makeTypesMatch(a, b) {\n if (a.dtype === b.dtype) {\n return [a, b];\n }\n const dtype = upcastType(a.dtype, b.dtype);\n return [a.cast(dtype), b.cast(dtype)];\n}\nexport function assertTypesMatch(a, b) {\n assert(a.dtype === b.dtype, () => `The dtypes of the first(${a.dtype}) and` +\n ` second(${b.dtype}) input must match`);\n}\nexport function isTensorInList(tensor, tensorList) {\n return tensorList.some(x => x.id === tensor.id);\n}\n/**\n * Extracts any `Tensor`s found within the provided object.\n *\n * @param container an object that may be a `Tensor` or may directly contain\n * `Tensor`s, such as a `Tensor[]` or `{key: Tensor, ...}`. In general it\n * is safe to pass any object here, except that `Promise`s are not\n * supported.\n * @returns An array of `Tensors` found within the passed object. If the\n * argument is simply a `Tensor', a list containing that `Tensor` is\n * returned. If the object is not a `Tensor` or does not\n * contain `Tensors`, an empty list is returned.\n */\nexport function getTensorsInContainer(result) {\n const list = [];\n const seen = new Set();\n walkTensorContainer(result, list, seen);\n return list;\n}\nfunction walkTensorContainer(container, list, seen) {\n if (container == null) {\n return;\n }\n if (container instanceof Tensor) {\n list.push(container);\n return;\n }\n if (!isIterable(container)) {\n return;\n }\n // Iteration over keys works also for arrays.\n const iterable = container;\n for (const k in iterable) {\n const val = iterable[k];\n if (!seen.has(val)) {\n seen.add(val);\n walkTensorContainer(val, list, seen);\n }\n }\n}\n// tslint:disable-next-line:no-any\nfunction isIterable(obj) {\n return Array.isArray(obj) || typeof obj === 'object';\n}\n//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidGVuc29yX3V0aWwuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi90ZmpzLWNvcmUvc3JjL3RlbnNvcl91dGlsLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBOzs7Ozs7Ozs7Ozs7Ozs7R0FlRztBQUVILE9BQU8sRUFBQyxNQUFNLEVBQUMsTUFBTSxVQUFVLENBQUM7QUFFaEMsT0FBTyxFQUFDLFVBQVUsRUFBQyxNQUFNLFNBQVMsQ0FBQztBQUNuQyxPQUFPLEVBQUMsTUFBTSxFQUFDLE1BQU0sUUFBUSxDQUFDO0FBRTlCLE1BQU0sVUFBVSxjQUFjLENBQW1CLENBQUksRUFBRSxDQUFJO0lBQ3pELElBQUksQ0FBQyxDQUFDLEtBQUssS0FBSyxDQUFDLENBQUMsS0FBSyxFQUFFO1FBQ3ZCLE9BQU8sQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUM7S0FDZjtJQUNELE1BQU0sS0FBSyxHQUFHLFVBQVUsQ0FBQyxDQUFDLENBQUMsS0FBSyxFQUFFLENBQUMsQ0FBQyxLQUFLLENBQUMsQ0FBQztJQUMzQyxPQUFPLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxLQUFLLENBQUMsRUFBRSxDQUFDLENBQUMsSUFBSSxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUM7QUFDeEMsQ0FBQztBQUVELE1BQU0sVUFBVSxnQkFBZ0IsQ0FBQyxDQUFTLEVBQUUsQ0FBUztJQUNuRCxNQUFNLENBQ0YsQ0FBQyxDQUFDLEtBQUssS0FBSyxDQUFDLENBQUMsS0FBSyxFQUNuQixHQUFHLEVBQUUsQ0FBQywyQkFBMkIsQ0FBQyxDQUFDLEtBQUssT0FBTztRQUMzQyxXQUFXLENBQUMsQ0FBQyxLQUFLLG9CQUFvQixDQUFDLENBQUM7QUFDbEQsQ0FBQztBQUVELE1BQU0sVUFBVSxjQUFjLENBQUMsTUFBYyxFQUFFLFVBQW9CO0lBQ2pFLE9BQU8sVUFBVSxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxFQUFFLEtBQUssTUFBTSxDQUFDLEVBQUUsQ0FBQyxDQUFDO0FBQ2xELENBQUM7QUFFRDs7Ozs7Ozs7Ozs7R0FXRztBQUNILE1BQU0sVUFBVSxxQkFBcUIsQ0FBQyxNQUF1QjtJQUMzRCxNQUFNLElBQUksR0FBYSxFQUFFLENBQUM7SUFDMUIsTUFBTSxJQUFJLEdBQUcsSUFBSSxHQUFHLEVBQVcsQ0FBQztJQUNoQyxtQkFBbUIsQ0FBQyxNQUFNLEVBQUUsSUFBSSxFQUFFLElBQUksQ0FBQyxDQUFDO0lBQ3hDLE9BQU8sSUFBSSxDQUFDO0FBQ2QsQ0FBQztBQUVELFNBQVMsbUJBQW1CLENBQ3hCLFNBQTBCLEVBQUUsSUFBYyxFQUFFLElBQWtCO0lBQ2hFLElBQUksU0FBUyxJQUFJLElBQUksRUFBRTtRQUNyQixPQUFPO0tBQ1I7SUFDRCxJQUFJLFNBQVMsWUFBWSxNQUFNLEVBQUU7UUFDL0IsSUFBSSxDQUFDLElBQUksQ0FBQyxTQUFTLENBQUMsQ0FBQztRQUNyQixPQUFPO0tBQ1I7SUFDRCxJQUFJLENBQUMsVUFBVSxDQUFDLFNBQVMsQ0FBQyxFQUFFO1FBQzFCLE9BQU87S0FDUjtJQUNELDZDQUE2QztJQUM3QyxNQUFNLFFBQVEsR0FBRyxTQUFpQyxDQUFDO0lBQ25ELEtBQUssTUFBTSxDQUFDLElBQUksUUFBUSxFQUFFO1FBQ3hCLE1BQU0sR0FBRyxHQUFHLFFBQVEsQ0FBQyxDQUFDLENBQUMsQ0FBQztRQUN4QixJQUFJLENBQUMsSUFBSSxDQUFDLEdBQUcsQ0FBQyxHQUFHLENBQUMsRUFBRTtZQUNsQixJQUFJLENBQUMsR0FBRyxDQUFDLEdBQUcsQ0FBQyxDQUFDO1lBQ2QsbUJBQW1CLENBQUMsR0FBRyxFQUFFLElBQUksRUFBRSxJQUFJLENBQUMsQ0FBQztTQUN0QztLQUNGO0FBQ0gsQ0FBQztBQUVELGtDQUFrQztBQUNsQyxTQUFTLFVBQVUsQ0FBQyxHQUFRO0lBQzFCLE9BQU8sS0FBSyxDQUFDLE9BQU8sQ0FBQyxHQUFHLENBQUMsSUFBSSxPQUFPLEdBQUcsS0FBSyxRQUFRLENBQUM7QUFDdkQsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbIi8qKlxuICogQGxpY2Vuc2VcbiAqIENvcHlyaWdodCAyMDE4IEdvb2dsZSBMTEMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuXG4gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgXCJMaWNlbnNlXCIpO1xuICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLlxuICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0XG4gKlxuICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wXG4gKlxuICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZVxuICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gXCJBUyBJU1wiIEJBU0lTLFxuICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuXG4gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kXG4gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS5cbiAqID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4gKi9cblxuaW1wb3J0IHtUZW5zb3J9IGZyb20gJy4vdGVuc29yJztcbmltcG9ydCB7VGVuc29yQ29udGFpbmVyLCBUZW5zb3JDb250YWluZXJBcnJheX0gZnJvbSAnLi90ZW5zb3JfdHlwZXMnO1xuaW1wb3J0IHt1cGNhc3RUeXBlfSBmcm9tICcuL3R5cGVzJztcbmltcG9ydCB7YXNzZXJ0fSBmcm9tICcuL3V0aWwnO1xuXG5leHBvcnQgZnVuY3Rpb24gbWFrZVR5cGVzTWF0Y2g8VCBleHRlbmRzIFRlbnNvcj4oYTogVCwgYjogVCk6IFtULCBUXSB7XG4gIGlmIChhLmR0eXBlID09PSBiLmR0eXBlKSB7XG4gICAgcmV0dXJuIFthLCBiXTtcbiAgfVxuICBjb25zdCBkdHlwZSA9IHVwY2FzdFR5cGUoYS5kdHlwZSwgYi5kdHlwZSk7XG4gIHJldHVybiBbYS5jYXN0KGR0eXBlKSwgYi5jYXN0KGR0eXBlKV07XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBhc3NlcnRUeXBlc01hdGNoKGE6IFRlbnNvciwgYjogVGVuc29yKTogdm9pZCB7XG4gIGFzc2VydChcbiAgICAgIGEuZHR5cGUgPT09IGIuZHR5cGUsXG4gICAgICAoKSA9PiBgVGhlIGR0eXBlcyBvZiB0aGUgZmlyc3QoJHthLmR0eXBlfSkgYW5kYCArXG4gICAgICAgICAgYCBzZWNvbmQoJHtiLmR0eXBlfSkgaW5wdXQgbXVzdCBtYXRjaGApO1xufVxuXG5leHBvcnQgZnVuY3Rpb24gaXNUZW5zb3JJbkxpc3QodGVuc29yOiBUZW5zb3IsIHRlbnNvckxpc3Q6IFRlbnNvcltdKTogYm9vbGVhbiB7XG4gIHJldHVybiB0ZW5zb3JMaXN0LnNvbWUoeCA9PiB4LmlkID09PSB0ZW5zb3IuaWQpO1xufVxuXG4vKipcbiAqIEV4dHJhY3RzIGFueSBgVGVuc29yYHMgZm91bmQgd2l0aGluIHRoZSBwcm92aWRlZCBvYmplY3QuXG4gKlxuICogQHBhcmFtIGNvbnRhaW5lciBhbiBvYmplY3QgdGhhdCBtYXkgYmUgYSBgVGVuc29yYCBvciBtYXkgZGlyZWN0bHkgY29udGFpblxuICogICBgVGVuc29yYHMsIHN1Y2ggYXMgYSBgVGVuc29yW11gIG9yIGB7a2V5OiBUZW5zb3IsIC4uLn1gLiBJbiBnZW5lcmFsIGl0XG4gKiAgIGlzIHNhZmUgdG8gcGFzcyBhbnkgb2JqZWN0IGhlcmUsIGV4Y2VwdCB0aGF0IGBQcm9taXNlYHMgYXJlIG5vdFxuICogICBzdXBwb3J0ZWQuXG4gKiBAcmV0dXJucyBBbiBhcnJheSBvZiBgVGVuc29yc2AgZm91bmQgd2l0aGluIHRoZSBwYXNzZWQgb2JqZWN0LiBJZiB0aGVcbiAqICAgYXJndW1lbnQgaXMgc2ltcGx5IGEgYFRlbnNvcicsIGEgbGlzdCBjb250YWluaW5nIHRoYXQgYFRlbnNvcmAgaXNcbiAqICAgcmV0dXJuZWQuIElmIHRoZSBvYmplY3QgaXMgbm90IGEgYFRlbnNvcmAgb3IgZG9lcyBub3RcbiAqICAgY29udGFpbiBgVGVuc29yc2AsIGFuIGVtcHR5IGxpc3QgaXMgcmV0dXJuZWQuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBnZXRUZW5zb3JzSW5Db250YWluZXIocmVzdWx0OiBUZW5zb3JDb250YWluZXIpOiBUZW5zb3JbXSB7XG4gIGNvbnN0IGxpc3Q6IFRlbnNvcltdID0gW107XG4gIGNvbnN0IHNlZW4gPSBuZXcgU2V0PHt9fHZvaWQ+KCk7XG4gIHdhbGtUZW5zb3JDb250YWluZXIocmVzdWx0LCBsaXN0LCBzZWVuKTtcbiAgcmV0dXJuIGxpc3Q7XG59XG5cbmZ1bmN0aW9uIHdhbGtUZW5zb3JDb250YWluZXIoXG4gICAgY29udGFpbmVyOiBUZW5zb3JDb250YWluZXIsIGxpc3Q6IFRlbnNvcltdLCBzZWVuOiBTZXQ8e318dm9pZD4pOiB2b2lkIHtcbiAgaWYgKGNvbnRhaW5lciA9PSBudWxsKSB7XG4gICAgcmV0dXJuO1xuICB9XG4gIGlmIChjb250YWluZXIgaW5zdGFuY2VvZiBUZW5zb3IpIHtcbiAgICBsaXN0LnB1c2goY29udGFpbmVyKTtcbiAgICByZXR1cm47XG4gIH1cbiAgaWYgKCFpc0l0ZXJhYmxlKGNvbnRhaW5lcikpIHtcbiAgICByZXR1cm47XG4gIH1cbiAgLy8gSXRlcmF0aW9uIG92ZXIga2V5cyB3b3JrcyBhbHNvIGZvciBhcnJheXMuXG4gIGNvbnN0IGl0ZXJhYmxlID0gY29udGFpbmVyIGFzIFRlbnNvckNvbnRhaW5lckFycmF5O1xuICBmb3IgKGNvbnN0IGsgaW4gaXRlcmFibGUpIHtcbiAgICBjb25zdCB2YWwgPSBpdGVyYWJsZVtrXTtcbiAgICBpZiAoIXNlZW4uaGFzKHZhbCkpIHtcbiAgICAgIHNlZW4uYWRkKHZhbCk7XG4gICAgICB3YWxrVGVuc29yQ29udGFpbmVyKHZhbCwgbGlzdCwgc2Vlbik7XG4gICAgfVxuICB9XG59XG5cbi8vIHRzbGludDpkaXNhYmxlLW5leHQtbGluZTpuby1hbnlcbmZ1bmN0aW9uIGlzSXRlcmFibGUob2JqOiBhbnkpOiBib29sZWFuIHtcbiAgcmV0dXJuIEFycmF5LmlzQXJyYXkob2JqKSB8fCB0eXBlb2Ygb2JqID09PSAnb2JqZWN0Jztcbn1cbiJdfQ==","/**\n * @license\n * Copyright 2018 Google LLC. All Rights Reserved.\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n * =============================================================================\n */\nimport { ENGINE } from './engine';\nimport { env } from './environment';\nimport { Tensor } from './tensor';\nimport { assert, flatten, inferDtype, isTypedArray, toTypedArray } from './util';\nexport function inferShape(val, dtype) {\n let firstElem = val;\n if (isTypedArray(val)) {\n return dtype === 'string' ? [] : [val.length];\n }\n if (!Array.isArray(val)) {\n return []; // Scalar.\n }\n const shape = [];\n while (Array.isArray(firstElem) ||\n isTypedArray(firstElem) && dtype !== 'string') {\n shape.push(firstElem.length);\n firstElem = firstElem[0];\n }\n if (Array.isArray(val) &&\n env().getBool('TENSORLIKE_CHECK_SHAPE_CONSISTENCY')) {\n deepAssertShapeConsistency(val, shape, []);\n }\n return shape;\n}\nfunction deepAssertShapeConsistency(val, shape, indices) {\n indices = indices || [];\n if (!(Array.isArray(val)) && !isTypedArray(val)) {\n assert(shape.length === 0, () => `Element arr[${indices.join('][')}] is a primitive, ` +\n `but should be an array/TypedArray of ${shape[0]} elements`);\n return;\n }\n assert(shape.length > 0, () => `Element arr[${indices.join('][')}] should be a primitive, ` +\n `but is an array of ${val.length} elements`);\n assert(val.length === shape[0], () => `Element arr[${indices.join('][')}] should have ${shape[0]} ` +\n `elements, but has ${val.length} elements`);\n const subShape = shape.slice(1);\n for (let i = 0; i < val.length; ++i) {\n deepAssertShapeConsistency(val[i], subShape, indices.concat(i));\n }\n}\nfunction assertDtype(expectedDtype, actualDType, argName, functionName) {\n if (expectedDtype === 'string_or_numeric') {\n return;\n }\n if (expectedDtype == null) {\n throw new Error(`Expected dtype cannot be null.`);\n }\n if (expectedDtype !== 'numeric' && expectedDtype !== actualDType ||\n expectedDtype === 'numeric' && actualDType === 'string') {\n throw new Error(`Argument '${argName}' passed to '${functionName}' must ` +\n `be ${expectedDtype} tensor, but got ${actualDType} tensor`);\n }\n}\nexport function convertToTensor(x, argName, functionName, parseAsDtype = 'numeric') {\n if (x instanceof Tensor) {\n assertDtype(parseAsDtype, x.dtype, argName, functionName);\n return x;\n }\n let inferredDtype = inferDtype(x);\n // If the user expects a bool/int/float, use that info to update the\n // inferredDtype when it is not a string.\n if (inferredDtype !== 'string' &&\n ['bool', 'int32', 'float32'].indexOf(parseAsDtype) >= 0) {\n inferredDtype = parseAsDtype;\n }\n assertDtype(parseAsDtype, inferredDtype, argName, functionName);\n if ((x == null) ||\n (!isTypedArray(x) && !Array.isArray(x) && typeof x !== 'number' &&\n typeof x !== 'boolean' && typeof x !== 'string')) {\n const type = x == null ? 'null' : x.constructor.name;\n throw new Error(`Argument '${argName}' passed to '${functionName}' must be a ` +\n `Tensor or TensorLike, but got '${type}'`);\n }\n const inferredShape = inferShape(x, inferredDtype);\n if (!isTypedArray(x) && !Array.isArray(x)) {\n x = [x];\n }\n const skipTypedArray = true;\n const values = inferredDtype !== 'string' ?\n toTypedArray(x, inferredDtype) :\n flatten(x, [], skipTypedArray);\n return ENGINE.makeTensor(values, inferredShape, inferredDtype);\n}\nexport function convertToTensorArray(arg, argName, functionName, parseAsDtype = 'numeric') {\n if (!Array.isArray(arg)) {\n throw new Error(`Argument ${argName} passed to ${functionName} must be a ` +\n '`Tensor[]` or `TensorLike[]`');\n }\n const tensors = arg;\n return tensors.map((t, i) => convertToTensor(t, `${argName}[${i}]`, functionName, parseAsDtype));\n}\n//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidGVuc29yX3V0aWxfZW52LmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vdGZqcy1jb3JlL3NyYy90ZW5zb3JfdXRpbF9lbnYudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUE7Ozs7Ozs7Ozs7Ozs7OztHQWVHO0FBRUgsT0FBTyxFQUFDLE1BQU0sRUFBQyxNQUFNLFVBQVUsQ0FBQztBQUNoQyxPQUFPLEVBQUMsR0FBRyxFQUFDLE1BQU0sZUFBZSxDQUFDO0FBQ2xDLE9BQU8sRUFBQyxNQUFNLEVBQUMsTUFBTSxVQUFVLENBQUM7QUFFaEMsT0FBTyxFQUFDLE1BQU0sRUFBRSxPQUFPLEVBQUUsVUFBVSxFQUFFLFlBQVksRUFBRSxZQUFZLEVBQUMsTUFBTSxRQUFRLENBQUM7QUFFL0UsTUFBTSxVQUFVLFVBQVUsQ0FBQyxHQUFlLEVBQUUsS0FBZ0I7SUFDMUQsSUFBSSxTQUFTLEdBQWUsR0FBRyxDQUFDO0lBRWhDLElBQUksWUFBWSxDQUFDLEdBQUcsQ0FBQyxFQUFFO1FBQ3JCLE9BQU8sS0FBSyxLQUFLLFFBQVEsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxNQUFNLENBQUMsQ0FBQztLQUMvQztJQUNELElBQUksQ0FBQyxLQUFLLENBQUMsT0FBTyxDQUFDLEdBQUcsQ0FBQyxFQUFFO1FBQ3ZCLE9BQU8sRUFBRSxDQUFDLENBQUUsVUFBVTtLQUN2QjtJQUNELE1BQU0sS0FBSyxHQUFhLEVBQUUsQ0FBQztJQUUzQixPQUFPLEtBQUssQ0FBQyxPQUFPLENBQUMsU0FBUyxDQUFDO1FBQ3hCLFlBQVksQ0FBQyxTQUFTLENBQUMsSUFBSSxLQUFLLEtBQUssUUFBUSxFQUFFO1FBQ3BELEtBQUssQ0FBQyxJQUFJLENBQUMsU0FBUyxDQUFDLE1BQU0sQ0FBQyxDQUFDO1FBQzdCLFNBQVMsR0FBRyxTQUFTLENBQUMsQ0FBQyxDQUFDLENBQUM7S0FDMUI7SUFDRCxJQUFJLEtBQUssQ0FB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QUFDLFVBQVUsQ0FBQyxNQUFNLEVBQUUsYUFBYSxFQUFFLGFBQWEsQ0FBTSxDQUFDO0FBQ3RFLENBQUM7QUFFRCxNQUFNLFVBQVUsb0JBQW9CLENBQ2hDLEdBQXdCLEVBQUUsT0FBZSxFQUFFLFlBQW9CLEVBQy9ELGVBQXVELFNBQVM7SUFDbEUsSUFBSSxDQUFDLEtBQUssQ0FBQyxPQUFPLENBQUMsR0FBRyxDQUFDLEVBQUU7UUFDdkIsTUFBTSxJQUFJLEtBQUssQ0FDWCxZQUFZLE9BQU8sY0FBYyxZQUFZLGFBQWE7WUFDMUQsOEJBQThCLENBQUMsQ0FBQztLQUNyQztJQUNELE1BQU0sT0FBTyxHQUFHLEdBQVUsQ0FBQztJQUMzQixPQUFPLE9BQU8sQ0FBQyxHQUFHLENBQ2QsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxFQUFFLEVBQUUsQ0FDTCxlQUFlLENBQUMsQ0FBQyxFQUFFLEdBQUcsT0FBTyxJQUFJLENBQUMsR0FBRyxFQUFFLFlBQVksRUFBRSxZQUFZLENBQUMsQ0FBQyxDQUFDO0FBQzlFLENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyIvKipcbiAqIEBsaWNlbnNlXG4gKiBDb3B5cmlnaHQgMjAxOCBHb29nbGUgTExDLiBBbGwgUmlnaHRzIFJlc2VydmVkLlxuICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlIFwiTGljZW5zZVwiKTtcbiAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS5cbiAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdFxuICpcbiAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMFxuICpcbiAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmVcbiAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuIFwiQVMgSVNcIiBCQVNJUyxcbiAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLlxuICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZFxuICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuXG4gKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuICovXG5cbmltcG9ydCB7RU5HSU5FfSBmcm9tICcuL2VuZ2luZSc7XG5pbXBvcnQge2Vudn0gZnJvbSAnLi9lbnZpcm9ubWVudCc7XG5pbXBvcnQge1RlbnNvcn0gZnJvbSAnLi90ZW5zb3InO1xuaW1wb3J0IHtEYXRhVHlwZSwgVGVuc29yTGlrZX0gZnJvbSAnLi90eXBlcyc7XG5pbXBvcnQge2Fzc2VydCwgZmxhdHRlbiwgaW5mZXJEdHlwZSwgaXNUeXBlZEFycmF5LCB0b1R5cGVkQXJyYXl9IGZyb20gJy4vdXRpbCc7XG5cbmV4cG9ydCBmdW5jdGlvbiBpbmZlclNoYXBlKHZhbDogVGVuc29yTGlrZSwgZHR5cGU/OiBEYXRhVHlwZSk6IG51bWJlcltdIHtcbiAgbGV0IGZpcnN0RWxlbTogdHlwZW9mIHZhbCA9IHZhbDtcblxuICBpZiAoaXNUeXBlZEFycmF5KHZhbCkpIHtcbiAgICByZXR1cm4gZHR5cGUgPT09ICdzdHJpbmcnID8gW10gOiBbdmFsLmxlbmd0aF07XG4gIH1cbiAgaWYgKCFBcnJheS5pc0FycmF5KHZhbCkpIHtcbiAgICByZXR1cm4gW107ICAvLyBTY2FsYXIuXG4gIH1cbiAgY29uc3Qgc2hhcGU6IG51bWJlcltdID0gW107XG5cbiAgd2hpbGUgKEFycmF5LmlzQXJyYXkoZmlyc3RFbGVtKSB8fFxuICAgICAgICAgaXNUeXBlZEFycmF5KGZpcnN0RWxlbSkgJiYgZHR5cGUgIT09ICdzdHJpbmcnKSB7XG4gICAgc2hhcGUucHVzaChmaXJzdEVsZW0ubGVuZ3RoKTtcbiAgICBmaXJzdEVsZW0gPSBmaXJzdEVsZW1bMF07XG4gIH1cbiAgaWYgKEFycmF5LmlzQXJyYXkodmFsKSAmJlxuICAgICAgZW52KCkuZ2V0Qm9vbCgnVEVOU09STElLRV9DSEVDS19TSEFQRV9DT05TSVNURU5DWScpKSB7XG4gICAgZGVlcEFzc2VydFNoYXBlQ29uc2lzdGVuY3kodmFsLCBzaGFwZSwgW10pO1xuICB9XG5cbiAgcmV0dXJuIHNoYXBlO1xufVxuXG5mdW5jdGlvbiBkZWVwQXNzZXJ0U2hhcGVDb25zaXN0ZW5jeShcbiAgICB2YWw6IFRlbnNvckxpa2UsIHNoYXBlOiBudW1iZXJbXSwgaW5kaWNlczogbnVtYmVyW10pIHtcbiAgaW5kaWNlcyA9IGluZGljZXMgfHwgW107XG4gIGlmICghKEFycmF5LmlzQXJyYXkodmFsKSkgJiYgIWlzVHlwZWRBcnJheSh2YWwpKSB7XG4gICAgYXNzZXJ0KFxuICAgICAgICBzaGFwZS5sZW5ndGggPT09IDAsXG4gICAgICAgICgpID0+IGBFbGVtZW50IGFyclske2luZGljZXMuam9pbignXVsnKX1dIGlzIGEgcHJpbWl0aXZlLCBgICtcbiAgICAgICAgICAgIGBidXQgc2hvdWxkIGJlIGFuIGFycmF5L1R5cGVkQXJyYXkgb2YgJHtzaGFwZVswXX0gZWxlbWVudHNgKTtcbiAgICByZXR1cm47XG4gIH1cbiAgYXNzZXJ0KFxuICAgICAgc2hhcGUubGVuZ3RoID4gMCxcbiAgICAgICgpID0+IGBFbGVtZW50IGFyclske2luZGljZXMuam9pbignXVsnKX1dIHNob3VsZCBiZSBhIHByaW1pdGl2ZSwgYCArXG4gICAgICAgICAgYGJ1dCBpcyBhbiBhcnJheSBvZiAke3ZhbC5sZW5ndGh9IGVsZW1lbnRzYCk7XG4gIGFzc2VydChcbiAgICAgIHZhbC5sZW5ndGggPT09IHNoYXBlWzBdLFxuICAgICAgKCkgPT4gYEVsZW1lbnQgYXJyWyR7aW5kaWNlcy5qb2luKCddWycpfV0gc2hvdWxkIGhhdmUgJHtzaGFwZVswXX0gYCArXG4gICAgICAgICAgYGVsZW1lbnRzLCBidXQgaGFzICR7dmFsLmxlbmd0aH0gZWxlbWVudHNgKTtcbiAgY29uc3Qgc3ViU2hhcGUgPSBzaGFwZS5zbGljZSgxKTtcbiAgZm9yIChsZXQgaSA9IDA7IGkgPCB2YWwubGVuZ3RoOyArK2kpIHtcbiAgICBkZWVwQXNzZXJ0U2hhcGVDb25zaXN0ZW5jeSh2YWxbaV0sIHN1YlNoYXBlLCBpbmRpY2VzLmNvbmNhdChpKSk7XG4gIH1cbn1cblxuZnVuY3Rpb24gYXNzZXJ0RHR5cGUoXG4gICAgZXhwZWN0ZWREdHlwZTogRGF0YVR5cGV8J251bWVyaWMnfCdzdHJpbmdfb3JfbnVtZXJpYycsXG4gICAgYWN0dWFsRFR5cGU6IERhdGFUeXBlLCBhcmdOYW1lOiBzdHJpbmcsIGZ1bmN0aW9uTmFtZTogc3RyaW5nKSB7XG4gIGlmIChleHBlY3RlZER0eXBlID09PSAnc3RyaW5nX29yX251bWVyaWMnKSB7XG4gICAgcmV0dXJuO1xuICB9XG4gIGlmIChleHBlY3RlZER0eXBlID09IG51bGwpIHtcbiAgICB0aHJvdyBuZXcgRXJyb3IoYEV4cGVjdGVkIGR0eXBlIGNhbm5vdCBiZSBudWxsLmApO1xuICB9XG4gIGlmIChleHBlY3RlZER0eXBlICE9PSAnbnVtZXJpYycgJiYgZXhwZWN0ZWREdHlwZSAhPT0gYWN0dWFsRFR5cGUgfHxcbiAgICAgIGV4cGVjdGVkRHR5cGUgPT09ICdudW1lcmljJyAmJiBhY3R1YWxEVHlwZSA9PT0gJ3N0cmluZycpIHtcbiAgICB0aHJvdyBuZXcgRXJyb3IoXG4gICAgICAgIGBBcmd1bWVudCAnJHthcmdOYW1lfScgcGFzc2VkIHRvICcke2Z1bmN0aW9uTmFtZX0nIG11c3QgYCArXG4gICAgICAgIGBiZSAke2V4cGVjdGVkRHR5cGV9IHRlbnNvciwgYnV0IGdvdCAke2FjdHVhbERUeXBlfSB0ZW5zb3JgKTtcbiAgfVxufVxuXG5leHBvcnQgZnVuY3Rpb24gY29udmVydFRvVGVuc29yPFQgZXh0ZW5kcyBUZW5zb3I+KFxuICAgIHg6IFR8VGVuc29yTGlrZSwgYXJnTmFtZTogc3RyaW5nLCBmdW5jdGlvbk5hbWU6IHN0cmluZyxcbiAgICBwYXJzZUFzRHR5cGU6IERhdGFUeXBlfCdudW1lcmljJ3wnc3RyaW5nX29yX251bWVyaWMnID0gJ251bWVyaWMnKTogVCB7XG4gIGlmICh4IGluc3RhbmNlb2YgVGVuc29yKSB7XG4gICAgYXNzZXJ0RHR5cGUocGFyc2VBc0R0eXBlLCB4LmR0eXBlLCBhcmdOYW1lLCBmdW5jdGlvbk5hbWUpO1xuICAgIHJldHVybiB4O1xuICB9XG4gIGxldCBpbmZlcnJlZER0eXBlID0gaW5mZXJEdHlwZSh4KTtcbiAgLy8gSWYgdGhlIHVzZXIgZXhwZWN0cyBhIGJvb2wvaW50L2Zsb2F0LCB1c2UgdGhhdCBpbmZvIHRvIHVwZGF0ZSB0aGVcbiAgLy8gaW5mZXJyZWREdHlwZSB3aGVuIGl0IGlzIG5vdCBhIHN0cmluZy5cbiAgaWYgKGluZmVycmVkRHR5cGUgIT09ICdzdHJpbmcnICYmXG4gICAgICBbJ2Jvb2wnLCAnaW50MzInLCAnZmxvYXQzMiddLmluZGV4T2YocGFyc2VBc0R0eXBlKSA+PSAwKSB7XG4gICAgaW5mZXJyZWREdHlwZSA9IHBhcnNlQXNEdHlwZSBhcyBEYXRhVHlwZTtcbiAgfVxuICBhc3NlcnREdHlwZShwYXJzZUFzRHR5cGUsIGluZmVycmVkRHR5cGUsIGFyZ05hbWUsIGZ1bmN0aW9uTmFtZSk7XG5cbiAgaWYgKCh4ID09IG51bGwpIHx8XG4gICAgICAoIWlzVHlwZWRBcnJheSh4KSAmJiAhQXJyYXkuaXNBcnJheSh4KSAmJiB0eXBlb2YgeCAhPT0gJ251bWJlcicgJiZcbiAgICAgICB0eXBlb2YgeCAhPT0gJ2Jvb2xlYW4nICYmIHR5cGVvZiB4ICE9PSAnc3RyaW5nJykpIHtcbiAgICBjb25zdCB0eXBlID0geCA9PSBudWxsID8gJ251bGwnIDogKHggYXMge30pLmNvbnN0cnVjdG9yLm5hbWU7XG4gICAgdGhyb3cgbmV3IEVycm9yKFxuICAgICAgICBgQXJndW1lbnQgJyR7YXJnTmFtZX0nIHBhc3NlZCB0byAnJHtmdW5jdGlvbk5hbWV9JyBtdXN0IGJlIGEgYCArXG4gICAgICAgIGBUZW5zb3Igb3IgVGVuc29yTGlrZSwgYnV0IGdvdCAnJHt0eXBlfSdgKTtcbiAgfVxuICBjb25zdCBpbmZlcnJlZFNoYXBlID0gaW5mZXJTaGFwZSh4LCBpbmZlcnJlZER0eXBlKTtcbiAgaWYgKCFpc1R5cGVkQXJyYXkoeCkgJiYgIUFycmF5LmlzQXJyYXkoeCkpIHtcbiAgICB4ID0gW3hdIGFzIG51bWJlcltdO1xuICB9XG4gIGNvbnN0IHNraXBUeXBlZEFycmF5ID0gdHJ1ZTtcbiAgY29uc3QgdmFsdWVzID0gaW5mZXJyZWREdHlwZSAhPT0gJ3N0cmluZycgP1xuICAgICAgdG9UeXBlZEFycmF5KHgsIGluZmVycmVkRHR5cGUgYXMgRGF0YVR5cGUpIDpcbiAgICAgIGZsYXR0ZW4oeCBhcyBzdHJpbmdbXSwgW10sIHNraXBUeXBlZEFycmF5KSBhcyBzdHJpbmdbXTtcbiAgcmV0dXJuIEVOR0lORS5tYWtlVGVuc29yKHZhbHVlcywgaW5mZXJyZWRTaGFwZSwgaW5mZXJyZWREdHlwZSkgYXMgVDtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGNvbnZlcnRUb1RlbnNvckFycmF5PFQgZXh0ZW5kcyBUZW5zb3I+KFxuICAgIGFyZzogQXJyYXk8VHxUZW5zb3JMaWtlPiwgYXJnTmFtZTogc3RyaW5nLCBmdW5jdGlvbk5hbWU6IHN0cmluZyxcbiAgICBwYXJzZUFzRHR5cGU6IERhdGFUeXBlfCdudW1lcmljJ3wnc3RyaW5nX29yX251bWVyaWMnID0gJ251bWVyaWMnKTogVFtdIHtcbiAgaWYgKCFBcnJheS5pc0FycmF5KGFyZykpIHtcbiAgICB0aHJvdyBuZXcgRXJyb3IoXG4gICAgICAgIGBBcmd1bWVudCAke2FyZ05hbWV9IHBhc3NlZCB0byAke2Z1bmN0aW9uTmFtZX0gbXVzdCBiZSBhIGAgK1xuICAgICAgICAnYFRlbnNvcltdYCBvciBgVGVuc29yTGlrZVtdYCcpO1xuICB9XG4gIGNvbnN0IHRlbnNvcnMgPSBhcmcgYXMgVFtdO1xuICByZXR1cm4gdGVuc29ycy5tYXAoXG4gICAgICAodCwgaSkgPT5cbiAgICAgICAgICBjb252ZXJ0VG9UZW5zb3IodCwgYCR7YXJnTmFtZX1bJHtpfV1gLCBmdW5jdGlvbk5hbWUsIHBhcnNlQXNEdHlwZSkpO1xufVxuIl19","/**\n * @license\n * Copyright 2017 Google LLC. All Rights Reserved.\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n * =============================================================================\n */\nexport var Rank;\n(function (Rank) {\n Rank[\"R0\"] = \"R0\";\n Rank[\"R1\"] = \"R1\";\n Rank[\"R2\"] = \"R2\";\n Rank[\"R3\"] = \"R3\";\n Rank[\"R4\"] = \"R4\";\n Rank[\"R5\"] = \"R5\";\n Rank[\"R6\"] = \"R6\";\n})(Rank || (Rank = {}));\n// Looks for upcasting types. Used, for example, in operations with mixed dtype\n// inputs.\nvar UpcastInt32AndMap;\n(function (UpcastInt32AndMap) {\n UpcastInt32AndMap[\"float32\"] = \"float32\";\n UpcastInt32AndMap[\"int32\"] = \"int32\";\n UpcastInt32AndMap[\"bool\"] = \"int32\";\n UpcastInt32AndMap[\"complex64\"] = \"complex64\";\n})(UpcastInt32AndMap || (UpcastInt32AndMap = {}));\nvar UpcastBoolAndMap;\n(function (UpcastBoolAndMap) {\n UpcastBoolAndMap[\"float32\"] = \"float32\";\n UpcastBoolAndMap[\"int32\"] = \"int32\";\n UpcastBoolAndMap[\"bool\"] = \"bool\";\n UpcastBoolAndMap[\"complex64\"] = \"complex64\";\n})(UpcastBoolAndMap || (UpcastBoolAndMap = {}));\nvar UpcastFloat32AndMap;\n(function (UpcastFloat32AndMap) {\n UpcastFloat32AndMap[\"float32\"] = \"float32\";\n UpcastFloat32AndMap[\"int32\"] = \"float32\";\n UpcastFloat32AndMap[\"bool\"] = \"float32\";\n UpcastFloat32AndMap[\"complex64\"] = \"complex64\";\n})(UpcastFloat32AndMap || (UpcastFloat32AndMap = {}));\nvar UpcastComplex64AndMap;\n(function (UpcastComplex64AndMap) {\n UpcastComplex64AndMap[\"float32\"] = \"complex64\";\n UpcastComplex64AndMap[\"int32\"] = \"complex64\";\n UpcastComplex64AndMap[\"bool\"] = \"complex64\";\n UpcastComplex64AndMap[\"complex64\"] = \"complex64\";\n})(UpcastComplex64AndMap || (UpcastComplex64AndMap = {}));\nconst upcastTypeMap = {\n 'float32': UpcastFloat32AndMap,\n 'int32': UpcastInt32AndMap,\n 'bool': UpcastBoolAndMap,\n 'complex64': UpcastComplex64AndMap\n};\nexport function upcastType(typeA, typeB) {\n if (typeA === 'string' || typeB === 'string') {\n if (typeA === 'string' && typeB === 'string') {\n return 'string';\n }\n throw new Error(`Can not upcast ${typeA} with ${typeB}`);\n }\n return upcastTypeMap[typeA][typeB];\n}\n/** Returns the output type after summation. */\nexport function sumOutType(type) {\n return upcastType(type, 'int32');\n}\n//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidHlwZXMuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi90ZmpzLWNvcmUvc3JjL3R5cGVzLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBOzs7Ozs7Ozs7Ozs7Ozs7R0FlRztBQWlESCxNQUFNLENBQU4sSUFBWSxJQVFYO0FBUkQsV0FBWSxJQUFJO0lBQ2QsaUJBQVMsQ0FBQTtJQUNULGlCQUFTLENBQUE7SUFDVCxpQkFBUyxDQUFBO0lBQ1QsaUJBQVMsQ0FBQTtJQUNULGlCQUFTLENBQUE7SUFDVCxpQkFBUyxDQUFBO0lBQ1QsaUJBQVMsQ0FBQTtBQUNYLENBQUMsRUFSVyxJQUFJLEtBQUosSUFBSSxRQVFmO0FBV0QsK0VBQStFO0FBQy9FLFVBQVU7QUFDVixJQUFLLGlCQUtKO0FBTEQsV0FBSyxpQkFBaUI7SUFDcEIsd0NBQXFCLENBQUE7SUFDckIsb0NBQWlCLENBQUE7SUFDakIsbUNBQWdCLENBQUE7SUFDaEIsNENBQXlCLENBQUE7QUFDM0IsQ0FBQyxFQUxJLGlCQUFpQixLQUFqQixpQkFBaUIsUUFLckI7QUFFRCxJQUFLLGdCQUtKO0FBTEQsV0FBSyxnQkFBZ0I7SUFDbkIsdUNBQXFCLENBQUE7SUFDckIsbUNBQWlCLENBQUE7SUFDakIsaUNBQWUsQ0FBQTtJQUNmLDJDQUF5QixDQUFBO0FBQzNCLENBQUMsRUFMSSxnQkFBZ0IsS0FBaEIsZ0JBQWdCLFFBS3BCO0FBRUQsSUFBSyxtQkFLSjtBQUxELFdBQUssbUJBQW1CO0lBQ3RCLDBDQUFxQixDQUFBO0lBQ3JCLHdDQUFtQixDQUFBO0lBQ25CLHVDQUFrQixDQUFBO0lBQ2xCLDhDQUF5QixDQUFBO0FBQzNCLENBQUMsRUFMSSxtQkFBbUIsS0FBbkIsbUJBQW1CLFFBS3ZCO0FBRUQsSUFBSyxxQkFLSjtBQUxELFdBQUsscUJBQXFCO0lBQ3hCLDhDQUF1QixDQUFBO0lBQ3ZCLDRDQUFxQixDQUFBO0lBQ3JCLDJDQUFvQixDQUFBO0lBQ3BCLGdEQUF5QixDQUFBO0FBQzNCLENBQUMsRUFMSSxxQkFBcUIsS0FBckIscUJBQXFCLFFBS3pCO0FBRUQsTUFBTSxhQUFhLEdBQUc7SUFDcEIsU0FBUyxFQUFFLG1CQUFtQjtJQUM5QixPQUFPLEVBQUUsaUJBQWlCO0lBQzFCLE1BQU0sRUFBRSxnQkFBZ0I7SUFDeEIsV0FBVyxFQUFFLHFCQUFxQjtDQUNuQyxDQUFDO0FBRUYsTUFBTSxVQUFVLFVBQVUsQ0FBQyxLQUFlLEVBQUUsS0FBZTtJQUN6RCxJQUFJLEtBQUssS0FBSyxRQUFRLElBQUksS0FBSyxLQUFLLFFBQVEsRUFBRTtRQUM1QyxJQUFJLEtBQUssS0FBSyxRQUFRLElBQUksS0FBSyxLQUFLLFFBQVEsRUFBRTtZQUM1QyxPQUFPLFFBQVEsQ0FBQztTQUNqQjtRQUNELE1BQU0sSUFBSSxLQUFLLENBQUMsa0JBQWtCLEtBQUssU0FBUyxLQUFLLEVBQUUsQ0FBQyxDQUFDO0tBQzFEO0lBQ0QsT0FBTyxhQUFhLENBQUMsS0FBSyxDQUFDLENBQUMsS0FBSyxDQUFDLENBQUM7QUFDckMsQ0FBQztBQUVELCtDQUErQztBQUMvQyxNQUFNLFVBQVUsVUFBVSxDQUFDLElBQWM7SUFDdkMsT0FBTyxVQUFVLENBQUMsSUFBSSxFQUFFLE9BQU8sQ0FBQyxDQUFDO0FBQ25DLENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyIvKipcbiAqIEBsaWNlbnNlXG4gKiBDb3B5cmlnaHQgMjAxNyBHb29nbGUgTExDLiBBbGwgUmlnaHRzIFJlc2VydmVkLlxuICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlIFwiTGljZW5zZVwiKTtcbiAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS5cbiAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdFxuICpcbiAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMFxuICpcbiAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmVcbiAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuIFwiQVMgSVNcIiBCQVNJUyxcbiAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLlxuICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZFxuICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuXG4gKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuICovXG5cbi8qKiBAZG9jYWxpYXMgbnVtYmVyW10gKi9cbmV4cG9ydCBpbnRlcmZhY2UgU2hhcGVNYXAge1xuICBSMDogbnVtYmVyW107XG4gIFIxOiBbbnVtYmVyXTtcbiAgUjI6IFtudW1iZXIsIG51bWJlcl07XG4gIFIzOiBbbnVtYmVyLCBudW1iZXIsIG51bWJlcl07XG4gIFI0OiBbbnVtYmVyLCBudW1iZXIsIG51bWJlciwgbnVtYmVyXTtcbiAgUjU6IFtudW1iZXIsIG51bWJlciwgbnVtYmVyLCBudW1iZXIsIG51bWJlcl07XG4gIFI2OiBbbnVtYmVyLCBudW1iZXIsIG51bWJlciwgbnVtYmVyLCBudW1iZXIsIG51bWJlcl07XG59XG5cbi8qKiBAZG9jYWxpYXMgbnVtYmVyW10gKi9cbmV4cG9ydCBpbnRlcmZhY2UgQXJyYXlNYXAge1xuICBSMDogbnVtYmVyO1xuICBSMTogbnVtYmVyW107XG4gIFIyOiBudW1iZXJbXVtdO1xuICBSMzogbnVtYmVyW11bXVtdO1xuICBSNDogbnVtYmVyW11bXVtdW107XG4gIFI1OiBudW1iZXJbXVtdW11bXVtdO1xuICBSNjogbnVtYmVyW11bXVtdW11bXVtdO1xufVxuXG5leHBvcnQgaW50ZXJmYWNlIERhdGFUeXBlTWFwIHtcbiAgZmxvYXQzMjogRmxvYXQzMkFycmF5O1xuICBpbnQzMjogSW50MzJBcnJheTtcbiAgYm9vbDogVWludDhBcnJheTtcbiAgY29tcGxleDY0OiBGbG9hdDMyQXJyYXk7XG4gIHN0cmluZzogc3RyaW5nW107XG59XG5cbmV4cG9ydCBpbnRlcmZhY2UgU2luZ2xlVmFsdWVNYXAge1xuICBib29sOiBib29sZWFuO1xuICBpbnQzMjogbnVtYmVyO1xuICBmbG9hdDMyOiBudW1iZXI7XG4gIGNvbXBsZXg2NDogbnVtYmVyO1xuICBzdHJpbmc6IHN0cmluZztcbn1cblxuLyoqIEBkb2NhbGlhcyAnZmxvYXQzMid8J2ludDMyJ3wnYm9vbCd8J2NvbXBsZXg2NCd8J3N0cmluZycgKi9cbmV4cG9ydCB0eXBlIERhdGFUeXBlID0ga2V5b2YgRGF0YVR5cGVNYXA7XG5leHBvcnQgdHlwZSBOdW1lcmljRGF0YVR5cGUgPSAnZmxvYXQzMid8J2ludDMyJ3wnYm9vbCd8J2NvbXBsZXg2NCc7XG5leHBvcnQgdHlwZSBUeXBlZEFycmF5ID0gRmxvYXQzMkFycmF5fEludDMyQXJyYXl8VWludDhBcnJheTtcbi8qKiBUZW5zb3IgZGF0YSB1c2VkIGluIHRlbnNvciBjcmVhdGlvbiBhbmQgdXNlci1mYWNpbmcgQVBJLiAqL1xuZXhwb3J0IHR5cGUgRGF0YVZhbHVlcyA9IERhdGFUeXBlTWFwW0RhdGFUeXBlXTtcbi8qKiBUaGUgdW5kZXJseWluZyB0ZW5zb3IgZGF0YSB0aGF0IGdldHMgc3RvcmVkIGluIGEgYmFja2VuZC4gKi9cbmV4cG9ydCB0eXBlIEJhY2tlbmRWYWx1ZXMgPSBGbG9hdDMyQXJyYXl8SW50MzJBcnJheXxVaW50OEFycmF5fFVpbnQ4QXJyYXlbXTtcblxuZXhwb3J0IGVudW0gUmFuayB7XG4gIFIwID0gJ1IwJyxcbiAgUjEgPSAnUjEnLFxuICBSMiA9ICdSMicsXG4gIFIzID0gJ1IzJyxcbiAgUjQgPSAnUjQnLFxuICBSNSA9ICdSNScsXG4gIFI2ID0gJ1I2J1xufVxuXG5leHBvcnQgdHlwZSBGbGF0VmVjdG9yID0gYm9vbGVhbltdfG51bWJlcltdfFR5cGVkQXJyYXk7XG5leHBvcnQgdHlwZSBSZWd1bGFyQXJyYXk8VD4gPVxuICAgIFRbXXxUW11bXXxUW11bXVtdfFRbXVtdW11bXXxUW11bXVtdW11bXXxUW11bXVtdW11bXVtdO1xuXG4vLyB0c2xpbnQ6ZGlzYWJsZS1uZXh0LWxpbmU6bm8tYW55XG5leHBvcnQgaW50ZXJmYWNlIFJlY3Vyc2l2ZUFycmF5PFQgZXh0ZW5kcyBhbnk+IHtcbiAgW2luZGV4OiBudW1iZXJdOiBUfFJlY3Vyc2l2ZUFycmF5PFQ+O1xufVxuXG4vLyBMb29rcyBmb3IgdXBjYXN0aW5nIHR5cGVzLiBVc2VkLCBmb3IgZXhhbXBsZSwgaW4gb3BlcmF0aW9ucyB3aXRoIG1peGVkIGR0eXBlXG4vLyBpbnB1dHMuXG5lbnVtIFVwY2FzdEludDMyQW5kTWFwIHtcbiAgJ2Zsb2F0MzInID0gJ2Zsb2F0MzInLFxuICAnaW50MzInID0gJ2ludDMyJyxcbiAgJ2Jvb2wnID0gJ2ludDMyJyxcbiAgJ2NvbXBsZXg2NCcgPSAnY29tcGxleDY0J1xufVxuXG5lbnVtIFVwY2FzdEJvb2xBbmRNYXAge1xuICAnZmxvYXQzMicgPSAnZmxvYXQzMicsXG4gICdpbnQzMicgPSAnaW50MzInLFxuICAnYm9vbCcgPSAnYm9vbCcsXG4gICdjb21wbGV4NjQnID0gJ2NvbXBsZXg2NCdcbn1cblxuZW51bSBVcGNhc3RGbG9hdDMyQW5kTWFwIHtcbiAgJ2Zsb2F0MzInID0gJ2Zsb2F0MzInLFxuICAnaW50MzInID0gJ2Zsb2F0MzInLFxuICAnYm9vbCcgPSAnZmxvYXQzMicsXG4gICdjb21wbGV4NjQnID0gJ2NvbXBsZXg2NCdcbn1cblxuZW51bSBVcGNhc3RDb21wbGV4NjRBbmRNYXAge1xuICAnZmxvYXQzMicgPSAnY29tcGxleDY0JyxcbiAgJ2ludDMyJyA9ICdjb21wbGV4NjQnLFxuICAnYm9vbCcgPSAnY29tcGxleDY0JyxcbiAgJ2NvbXBsZXg2NCcgPSAnY29tcGxleDY0J1xufVxuXG5jb25zdCB1cGNhc3RUeXBlTWFwID0ge1xuICAnZmxvYXQzMic6IFVwY2FzdEZsb2F0MzJBbmRNYXAsXG4gICdpbnQzMic6IFVwY2FzdEludDMyQW5kTWFwLFxuICAnYm9vbCc6IFVwY2FzdEJvb2xBbmRNYXAsXG4gICdjb21wbGV4NjQnOiBVcGNhc3RDb21wbGV4NjRBbmRNYXBcbn07XG5cbmV4cG9ydCBmdW5jdGlvbiB1cGNhc3RUeXBlKHR5cGVBOiBEYXRhVHlwZSwgdHlwZUI6IERhdGFUeXBlKTogRGF0YVR5cGUge1xuICBpZiAodHlwZUEgPT09ICdzdHJpbmcnIHx8IHR5cGVCID09PSAnc3RyaW5nJykge1xuICAgIGlmICh0eXBlQSA9PT0gJ3N0cmluZycgJiYgdHlwZUIgPT09ICdzdHJpbmcnKSB7XG4gICAgICByZXR1cm4gJ3N0cmluZyc7XG4gICAgfVxuICAgIHRocm93IG5ldyBFcnJvcihgQ2FuIG5vdCB1cGNhc3QgJHt0eXBlQX0gd2l0aCAke3R5cGVCfWApO1xuICB9XG4gIHJldHVybiB1cGNhc3RUeXBlTWFwW3R5cGVBXVt0eXBlQl07XG59XG5cbi8qKiBSZXR1cm5zIHRoZSBvdXRwdXQgdHlwZSBhZnRlciBzdW1tYXRpb24uICovXG5leHBvcnQgZnVuY3Rpb24gc3VtT3V0VHlwZSh0eXBlOiBEYXRhVHlwZSk6IERhdGFUeXBlIHtcbiAgcmV0dXJuIHVwY2FzdFR5cGUodHlwZSwgJ2ludDMyJyk7XG59XG5cbi8qKiBAZG9jYWxpYXMgVHlwZWRBcnJheXxBcnJheSAqL1xuZXhwb3J0IHR5cGUgVGVuc29yTGlrZSA9XG4gICAgVHlwZWRBcnJheXxudW1iZXJ8Ym9vbGVhbnxzdHJpbmd8UmVjdXJzaXZlQXJyYXk8bnVtYmVyfG51bWJlcltdfFR5cGVkQXJyYXk+fFxuICAgIFJlY3Vyc2l2ZUFycmF5PGJvb2xlYW4+fFJlY3Vyc2l2ZUFycmF5PHN0cmluZz58VWludDhBcnJheVtdO1xuZXhwb3J0IHR5cGUgU2NhbGFyTGlrZSA9IG51bWJlcnxib29sZWFufHN0cmluZ3xVaW50OEFycmF5O1xuLyoqIEBkb2NhbGlhcyBUeXBlZEFycmF5fEFycmF5ICovXG5leHBvcnQgdHlwZSBUZW5zb3JMaWtlMUQgPSBUeXBlZEFycmF5fG51bWJlcltdfGJvb2xlYW5bXXxzdHJpbmdbXXxVaW50OEFycmF5W107XG4vKiogQGRvY2FsaWFzIFR5cGVkQXJyYXl8QXJyYXkgKi9cbmV4cG9ydCB0eXBlIFRlbnNvckxpa2UyRCA9IFR5cGVkQXJyYXl8bnVtYmVyW118bnVtYmVyW11bXXxib29sZWFuW118Ym9vbGVhbltdW118XG4gICAgc3RyaW5nW118c3RyaW5nW11bXXxVaW50OEFycmF5W118VWludDhBcnJheVtdW107XG4vKiogQGRvY2FsaWFzIFR5cGVkQXJyYXl8QXJyYXkgKi9cbmV4cG9ydCB0eXBlIFRlbnNvckxpa2UzRCA9IFR5cGVkQXJyYXl8bnVtYmVyW118bnVtYmVyW11bXVtdfGJvb2xlYW5bXXxcbiAgICBib29sZWFuW11bXVtdfHN0cmluZ1tdfHN0cmluZ1tdW11bXXxVaW50OEFycmF5W118VWludDhBcnJheVtdW11bXTtcbi8qKiBAZG9jYWxpYXMgVHlwZWRBcnJheXxBcnJheSAqL1xuZXhwb3J0IHR5cGUgVGVuc29yTGlrZTREID0gVHlwZWRBcnJheXxudW1iZXJbXXxudW1iZXJbXVtdW11bXXxib29sZWFuW118XG4gICAgYm9vbGVhbltdW11bXVtdfHN0cmluZ1tdfHN0cmluZ1tdW11bXVtdfFVpbnQ4QXJyYXlbXXxVaW50OEFycmF5W11bXVtdW107XG4vKiogQGRvY2FsaWFzIFR5cGVkQXJyYXl8QXJyYXkgKi9cbmV4cG9ydCB0eXBlIFRlbnNvckxpa2U1RCA9XG4gICAgVHlwZWRBcnJheXxudW1iZXJbXXxudW1iZXJbXVtdW11bXVtdfGJvb2xlYW5bXXxib29sZWFuW11bXVtdW11bXXxzdHJpbmdbXXxcbiAgICBzdHJpbmdbXVtdW11bXVtdfFVpbnQ4QXJyYXlbXXxVaW50OEFycmF5W11bXVtdW11bXTtcbi8qKiBAZG9jYWxpYXMgVHlwZWRBcnJheXxBcnJheSAqL1xuZXhwb3J0IHR5cGUgVGVuc29yTGlrZTZEID1cbiAgICBUeXBlZEFycmF5fG51bWJlcltdfG51bWJlcltdW11bXVtdW11bXXxib29sZWFuW118Ym9vbGVhbltdW11bXVtdW11bXXxcbiAgICBzdHJpbmdbXXxzdHJpbmdbXVtdW11bXVtdW118VWludDhBcnJheVtdfFVpbnQ4QXJyYXlbXVtdW11bXVtdO1xuXG4vKiogVHlwZSBmb3IgcmVwcmVzZW50aW5nIGltYWdlIGRhdGEgaW4gVWludDhBcnJheSB0eXBlLiAqL1xuZXhwb3J0IGludGVyZmFjZSBQaXhlbERhdGEge1xuICB3aWR0aDogbnVtYmVyO1xuICBoZWlnaHQ6IG51bWJlcjtcbiAgZGF0YTogVWludDhBcnJheTtcbn1cbiJdfQ==","/**\n * @license\n * Copyright 2021 Google LLC. All Rights Reserved.\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n * =============================================================================\n */\n// Workaround for allowing cjs module to be included in bundle created by\n// rollup.\nimport * as LongExports from 'long';\n// tslint:disable-next-line\nconst Long = \n// tslint:disable-next-line\nLongExports.default || LongExports;\nexport function hexToLong(hex) {\n return Long.fromString(hex, true, 16);\n}\n// Some primes between 2^63 and 2^64 for various uses.\n// Hex 0xc3a5c85c97cb3127\nconst k0 = hexToLong('c3a5c85c97cb3127');\n// Hex 0xb492b66fbe98f273\nconst k1 = hexToLong('b492b66fbe98f273');\n// Hex 0x9ae16a3b2f90404f\nconst k2 = hexToLong('9ae16a3b2f90404f');\nfunction shiftMix(val) {\n return val.xor(val.shru(47));\n}\nfunction fetch(s, offset, numBytes) {\n const bytes = s.slice(offset, offset + numBytes);\n return Long.fromBytes(Array.from(bytes), true, true);\n}\nfunction fetch64(s, offset) {\n return fetch(s, offset, 8);\n}\nfunction fetch32(s, offset) {\n return fetch(s, offset, 4);\n}\nfunction rotate64(val, shift) {\n // Avoid shifting by 64: doing so yields an undefined result.\n return shift === 0 ? val : val.shru(shift).or(val.shl(64 - shift));\n}\nfunction hashLen16(u, v, mul = hexToLong('9ddfea08eb382d69')) {\n // Murmur-inspired hashing.\n let a = u.xor(v).mul(mul);\n a = a.xor(a.shru(47));\n let b = v.xor(a).mul(mul);\n b = b.xor(b.shru(47));\n b = b.mul(mul);\n return b;\n}\n// Return a 16-byte hash for 48 bytes. Quick and dirty.\n// Callers do best to use \"random-looking\" values for a and b.\nfunction weakHashLen32WithSeeds(w, x, y, z, a, b) {\n a = a.add(w);\n b = rotate64(b.add(a).add(z), 21);\n const c = a;\n a = a.add(x);\n a = a.add(y);\n b = b.add(rotate64(a, 44));\n return [a.add(z), b.add(c)];\n}\nfunction weakHashLen32WithSeedsStr(s, offset, a, b) {\n return weakHashLen32WithSeeds(fetch64(s, offset), fetch64(s, offset + 8), fetch64(s, offset + 16), fetch64(s, offset + 24), a, b);\n}\nfunction hashLen0to16(s, len = s.length) {\n if (len >= 8) {\n const mul = k2.add(len * 2);\n const a = fetch64(s, 0).add(k2);\n const b = fetch64(s, len - 8);\n const c = rotate64(b, 37).mul(mul).add(a);\n const d = rotate64(a, 25).add(b).mul(mul);\n return hashLen16(c, d, mul);\n }\n if (len >= 4) {\n const mul = k2.add(len * 2);\n const a = fetch32(s, 0);\n return hashLen16(a.shl(3).add(len), fetch32(s, len - 4), mul);\n }\n if (len > 0) {\n const a = s[0];\n const b = s[len >> 1];\n const c = s[len - 1];\n const y = a + (b << 8);\n const z = len + (c << 2);\n return shiftMix(k2.mul(y).xor(k0.mul(z))).mul(k2);\n }\n return k2;\n}\nfunction hashLen17to32(s, len = s.length) {\n const mul = k2.add(len * 2);\n const a = fetch64(s, 0).mul(k1);\n const b = fetch64(s, 8);\n const c = fetch64(s, len - 8).mul(mul);\n const d = fetch64(s, len - 16).mul(k2);\n return hashLen16(rotate64(a.add(b), 43).add(rotate64(c, 30)).add(d), a.add(rotate64(b.add(k2), 18)).add(c), mul);\n}\nfunction hashLen33to64(s, len = s.length) {\n const mul = k2.add(len * 2);\n const a = fetch64(s, 0).mul(k2);\n const b = fetch64(s, 8);\n const c = fetch64(s, len - 8).mul(mul);\n const d = fetch64(s, len - 16).mul(k2);\n const y = rotate64(a.add(b), 43).add(rotate64(c, 30)).add(d);\n const z = hashLen16(y, a.add(rotate64(b.add(k2), 18)).add(c), mul);\n const e = fetch64(s, 16).mul(mul);\n const f = fetch64(s, 24);\n const g = y.add(fetch64(s, len - 32)).mul(mul);\n const h = z.add(fetch64(s, len - 24)).mul(mul);\n return hashLen16(rotate64(e.add(f), 43).add(rotate64(g, 30)).add(h), e.add(rotate64(f.add(a), 18)).add(g), mul);\n}\nexport function fingerPrint64(s, len = s.length) {\n const seed = Long.fromNumber(81, true);\n if (len <= 32) {\n if (len <= 16) {\n return hashLen0to16(s, len);\n }\n else {\n return hashLen17to32(s, len);\n }\n }\n else if (len <= 64) {\n return hashLen33to64(s, len);\n }\n // For strings over 64 bytes we loop. Internal state consists of\n // 56 bytes: v, w, x, y, and z.\n let x = seed;\n let y = seed.mul(k1).add(113);\n let z = shiftMix(y.mul(k2).add(113)).mul(k2);\n let v = [Long.UZERO, Long.UZERO];\n let w = [Long.UZERO, Long.UZERO];\n x = x.mul(k2).add(fetch64(s, 0));\n let offset = 0;\n // Set end so that after the loop we have 1 to 64 bytes left to process.\n const end = ((len - 1) >> 6) * 64;\n const last64 = end + ((len - 1) & 63) - 63;\n do {\n x = rotate64(x.add(y).add(v[0]).add(fetch64(s, offset + 8)), 37).mul(k1);\n y = rotate64(y.add(v[1]).add(fetch64(s, offset + 48)), 42).mul(k1);\n x = x.xor(w[1]);\n y = y.add(v[0]).add(fetch64(s, offset + 40));\n z = rotate64(z.add(w[0]), 33).mul(k1);\n v = weakHashLen32WithSeedsStr(s, offset, v[1].mul(k1), x.add(w[0]));\n w = weakHashLen32WithSeedsStr(s, offset + 32, z.add(w[1]), y.add(fetch64(s, offset + 16)));\n [z, x] = [x, z];\n offset += 64;\n } while (offset !== end);\n const mul = k1.add(z.and(0xff).shl(1));\n // Point to the last 64 bytes of input.\n offset = last64;\n w[0] = w[0].add((len - 1) & 63);\n v[0] = v[0].add(w[0]);\n w[0] = w[0].add(v[0]);\n x = rotate64(x.add(y).add(v[0]).add(fetch64(s, offset + 8)), 37).mul(mul);\n y = rotate64(y.add(v[1]).add(fetch64(s, offset + 48)), 42).mul(mul);\n x = x.xor(w[1].mul(9));\n y = y.add(v[0].mul(9).add(fetch64(s, offset + 40)));\n z = rotate64(z.add(w[0]), 33).mul(mul);\n v = weakHashLen32WithSeedsStr(s, offset, v[1].mul(mul), x.add(w[0]));\n w = weakHashLen32WithSeedsStr(s, offset + 32, z.add(w[1]), y.add(fetch64(s, offset + 16)));\n [z, x] = [x, z];\n return hashLen16(hashLen16(v[0], w[0], mul).add(shiftMix(y).mul(k0)).add(z), hashLen16(v[1], w[1], mul).add(x), mul);\n}\n//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaGFzaF91dGlsLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vdGZqcy1jb3JlL3NyYy9oYXNoX3V0aWwudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUE7Ozs7Ozs7Ozs7Ozs7OztHQWVHO0FBQ0gseUVBQXlFO0FBQ3pFLFVBQVU7QUFDVixPQUFPLEtBQUssV0FBVyxNQUFNLE1BQU0sQ0FBQztBQUNwQywyQkFBMkI7QUFDM0IsTUFBTSxJQUFJO0FBQ04sMkJBQTJCO0FBQzFCLFdBQW1CLENBQUMsT0FBTyxJQUFJLFdBQVcsQ0FBQztBQUVoRCxNQUFNLFVBQVUsU0FBUyxDQUFDLEdBQVc7SUFDbkMsT0FBTyxJQUFJLENBQUMsVUFBVSxDQUFDLEdBQUcsRUFBRSxJQUFJLEVBQUUsRUFBRSxDQUFDLENBQUM7QUFDeEMsQ0FBQztBQUVELHNEQUFzRDtBQUN0RCx5QkFBeUI7QUFDekIsTUFBTSxFQUFFLEdBQVMsU0FBUyxDQUFDLGtCQUFrQixDQUFDLENBQUM7QUFDL0MseUJBQXlCO0FBQ3pCLE1BQU0sRUFBRSxHQUFTLFNBQVMsQ0FBQyxrQkFBa0IsQ0FBQyxDQUFDO0FBQy9DLHlCQUF5QjtBQUN6QixNQUFNLEVBQUUsR0FBUyxTQUFTLENBQUMsa0JBQWtCLENBQUMsQ0FBQztBQUUvQyxTQUFTLFFBQVEsQ0FBQyxHQUFTO0lBQ3pCLE9BQU8sR0FBRyxDQUFDLEdBQUcsQ0FBQyxHQUFHLENBQUMsSUFBSSxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUM7QUFDL0IsQ0FBQztBQUVELFNBQVMsS0FBSyxDQUFDLENBQWEsRUFBRSxNQUFjLEVBQUUsUUFBZ0I7SUFDNUQsTUFBTSxLQUFLLEdBQUcsQ0FBQyxDQUFDLEtBQUssQ0FBQyxNQUFNLEVBQUUsTUFBTSxHQUFHLFFBQVEsQ0FBQyxDQUFDO0lBQ2pELE9BQU8sSUFBSSxDQUFDLFNBQVMsQ0FBQyxLQUFLLENBQUMsSUFBSSxDQUFDLEtBQUssQ0FBQyxFQUFFLElBQUksRUFBRSxJ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QyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsRUFBRSxFQUFFLENBQUMsQ0FBQyxHQUFHLENBQUMsUUFBUSxDQUFDLENBQUMsRUFBRSxFQUFFLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsRUFDbEQsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxRQUFRLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxFQUFFLENBQUMsRUFBRSxFQUFFLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsRUFBRSxHQUFHLENBQUMsQ0FBQztBQUNsRCxDQUFDO0FBRUQsU0FBUyxhQUFhLENBQUMsQ0FBYSxFQUFFLEdBQUcsR0FBRyxDQUFDLENBQUMsTUFBTTtJQUNsRCxNQUFNLEdBQUcsR0FBRyxFQUFFLENBQUMsR0FBRyxDQUFDLEdBQUcsR0FBRyxDQUFDLENBQUMsQ0FBQztJQUM1QixNQUFNLENBQUMsR0FBRyxPQUFPLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxFQUFFLENBQUMsQ0FBQztJQUNoQyxNQUFNLENBQUMsR0FBRyxPQUFPLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDO0lBQ3hCLE1BQU0sQ0FBQyxHQUFHLE9BQU8sQ0FBQyxDQUFDLEVBQUUsR0FBRyxHQUFHLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxHQUFHLENBQUMsQ0FBQztJQUN2QyxNQUFNLENBQUMsR0FBRyxPQUFPLENBQUMsQ0FBQyxFQUFFLEdBQUcsR0FBRyxFQUFFLENBQUMsQ0FBQyxHQUFHLENBQUMsRUFBRSxDQUFDLENBQUM7SUFDdkMsTUFBTSxDQUFDLEdBQUcsUUFBUSxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLEVBQUUsRUFBRSxDQUFDLENBQUMsR0FBRyxDQUFDLFFBQVEsQ0FBQyxDQUFDLEVBQUUsRUFBRSxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUM7SUFDN0QsTUFBTSxDQUFDLEdBQUcsU0FBUyxDQUFDLENBQUMsRUFBRSxDQUFD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QUFNLEdBQUcsR0FBRyxHQUFHLENBQUMsQ0FBQyxHQUFHLEdBQUcsQ0FBQyxDQUFDLEdBQUcsRUFBRSxDQUFDLEdBQUcsRUFBRSxDQUFDO0lBRTNDLEdBQUc7UUFDRCxDQUFDLEdBQUcsUUFBUSxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxPQUFPLENBQUMsQ0FBQyxFQUFFLE1BQU0sR0FBRyxDQUFDLENBQUMsQ0FBQyxFQUFFLEVBQUUsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxFQUFFLENBQUMsQ0FBQztRQUN6RSxDQUFDLEdBQUcsUUFBUSxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLE9BQU8sQ0FBQyxDQUFDLEVBQUUsTUFBTSxHQUFHLEVBQUUsQ0FBQyxDQUFDLEVBQUUsRUFBRSxDQUFDLENBQUMsR0FBRyxDQUFDLEVBQUUsQ0FBQyxDQUFDO1FBQ25FLENBQUMsR0FBRyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDO1FBQ2hCLENBQUMsR0FBRyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxPQUFPLENBQUMsQ0FBQyxFQUFFLE1BQU0sR0FBRyxFQUFFLENBQUMsQ0FBQyxDQUFDO1FBQzdDLENBQUMsR0FBRyxRQUFRLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsRUFBRSxFQUFFLENBQUMsQ0FBQyxHQUFHLENBQUMsRUFBRSxDQUFDLENBQUM7UUFDdEMsQ0FBQyxHQUFHLHlCQUF5QixDQUFDLENBQUMsRUFBRSxNQUFNLEVBQUUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUM7UUFDcEUsQ0FBQyxHQUFHLHlCQUF5QixDQUN6QixDQUFDLEVBQUUsTUFBTSxHQUFHLEVBQUUsRUFBRSxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxHQUFHLENBQUMsT0FBTyxDQUFDLENBQUMsRUFBRSxNQUFNLEdBQUcsRUFBRSxDQUFDLENBQUMsQ0FBQyxDQUFDO1FBRWpFLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDO1FBQ2hCLE1BQU0sSUFBSSxFQUFFLENBQUM7S0FDZCxRQUFRLE1BQU0sS0FBSyxHQUFHLEVBQUU7SUFDekIsTUFBTSxHQUFHLEdBQUcsRUFBRSxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLElBQUksQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDO0lBQ3ZDLHVDQUF1QztJQUN2QyxNQUFNLEdBQUcsTUFBTSxDQUFDO0lBRWhCLENBQUMsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsR0FBRyxHQUFHLENBQUMsQ0FBQyxHQUFHLEVBQUUsQ0FBQyxDQUFDO0lBQ2hDLENBQUMsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDO0lBQ3RCLENBQUMsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDO0lBRXRCLENBQUMsR0FBRyxRQUFRLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLE9BQU8sQ0FBQyxDQUFDLEVBQUUsTUFBTSxHQUFHLENBQUMsQ0FBQyxDQUFDLEVBQUUsRUFBRSxDQUFDLENBQUMsR0FBRyxDQUFDLEdBQUcsQ0FBQyxDQUFDO0lBQzFFLENBQUMsR0FBRyxRQUFRLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsT0FBTyxDQUFDLENBQUMsRUFBRSxNQUFNLEdBQUcsRUFBRSxDQUFDLENBQUMsRUFBRSxFQUFFLENBQUMsQ0FBQyxHQUFHLENBQUMsR0FBRyxDQUFDLENBQUM7SUFDcEUsQ0FBQyxHQUFHLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDO0lBQ3ZCLENBQUMsR0FBRyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLE9BQU8sQ0FBQyxDQUFDLEVBQUUsTUFBTSxHQUFHLEVBQUUsQ0FBQyxDQUFDLENBQUMsQ0FBQztJQUNwRCxDQUFDLEdBQUcsUUFBUSxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLEVBQUUsRUFBRSxDQUFDLENBQUMsR0FBRyxDQUFDLEdBQUcsQ0FBQyxDQUFDO0lBQ3ZDLENBQUMsR0FBRyx5QkFBeUIsQ0FBQyxDQUFDLEVBQUUsTUFBTSxFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsR0FBRyxDQUFDLEVBQUUsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDO0lBQ3JFLENBQUMsR0FBRyx5QkFBeUIsQ0FDekIsQ0FBQyxFQUFFLE1BQU0sR0FBRyxFQUFFLEVBQUUsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsR0FBRyxDQUFDLE9BQU8sQ0FBQyxDQUFDLEVBQUUsTUFBTSxHQUFHLEVBQUUsQ0FBQyxDQUFDLENBQUMsQ0FBQztJQUVqRSxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQztJQUVoQixPQUFPLFNBQVMsQ0FDWixTQUFTLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUMsRUFBRSxHQUFHLENBQUMsQ0FBQyxHQUFHLENBQUMsUUFBUSxDQUFDLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsRUFDMUQsU0FBUyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxDQUFDLEVBQUUsR0FBRyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxFQUFFLEdBQUcsQ0FBQyxDQUFDO0FBQzlDLENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyIvKipcbiAqIEBsaWNlbnNlXG4gKiBDb3B5cmlnaHQgMjAyMSBHb29nbGUgTExDLiBBbGwgUmlnaHRzIFJlc2VydmVkLlxuICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlIFwiTGljZW5zZVwiKTtcbiAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS5cbiAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdFxuICpcbiAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMFxuICpcbiAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmVcbiAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuIFwiQVMgSVNcIiBCQVNJUyxcbiAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLlxuICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZFxuICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuXG4gKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuICovXG4vLyBXb3JrYXJvdW5kIGZvciBhbGxvd2luZyBjanMgbW9kdWxlIHRvIGJlIGluY2x1ZGVkIGluIGJ1bmRsZSBjcmVhdGVkIGJ5XG4vLyByb2xsdXAuXG5pbXBvcnQgKiBhcyBMb25nRXhwb3J0cyBmcm9tICdsb25nJztcbi8vIHRzbGludDpkaXNhYmxlLW5leHQtbGluZVxuY29uc3QgTG9uZzogTG9uZ0V4cG9ydHMuTG9uZ0NvbnN0cnVjdG9yID1cbiAgICAvLyB0c2xpbnQ6ZGlzYWJsZS1uZXh0LWxpbmVcbiAgICAoTG9uZ0V4cG9ydHMgYXMgYW55KS5kZWZhdWx0IHx8IExvbmdFeHBvcnRzO1xuXG5leHBvcnQgZnVuY3Rpb24gaGV4VG9Mb25nKGhleDogc3RyaW5nKTogTG9uZyB7XG4gIHJldHVybiBMb25nLmZyb21TdHJpbmcoaGV4LCB0cnVlLCAxNik7XG59XG5cbi8vIFNvbWUgcHJpbWVzIGJldHdlZW4gMl42MyBhbmQgMl42NCBmb3IgdmFyaW91cyB1c2VzLlxuLy8gSGV4IDB4YzNhNWM4NWM5N2NiMzEyN1xuY29uc3QgazA6IExvbmcgPSBoZXhUb0xvbmcoJ2MzYTVjODVjOTdjYjMxMjcnKTtcbi8vIEhleCAweGI0OTJiNjZmYmU5OGYyNzNcbmNvbnN0IGsxOiBMb25nID0gaGV4VG9Mb25nKCdiNDkyYjY2ZmJlOThmMjczJyk7XG4vLyBIZXggMHg5YWUxNmEzYjJmOTA0MDRmXG5jb25zdCBrMjogTG9uZyA9IGhleFRvTG9uZygnOWFlMTZhM2IyZjkwNDA0ZicpO1xuXG5mdW5jdGlvbiBzaGlmdE1peCh2YWw6IExvbmcpOiBMb25nIHtcbiAgcmV0dXJuIHZhbC54b3IodmFsLnNocnUoNDcpKTtcbn1cblxuZnVuY3Rpb24gZmV0Y2goczogVWludDhBcnJheSwgb2Zmc2V0OiBudW1iZXIsIG51bUJ5dGVzOiBudW1iZXIpOiBMb25nIHtcbiAgY29uc3QgYnl0ZXMgPSBzLnNsaWNlKG9mZnNldCwgb2Zmc2V0ICsgbnVtQnl0ZXMpO1xuICByZXR1cm4gTG9uZy5mcm9tQnl0ZXMoQXJyYXkuZnJvbShieXRlcyksIHRydWUsIHRydWUpO1xufVxuXG5mdW5jdGlvbiBmZXRjaDY0KHM6IFVpbnQ4QXJyYXksIG9mZnNldDogbnVtYmVyKTogTG9uZyB7XG4gIHJldHVybiBmZXRjaChzLCBvZmZzZXQsIDgpO1xufVxuXG5mdW5jdGlvbiBmZXRjaDMyKHM6IFVpbnQ4QXJyYXksIG9mZnNldDogbnVtYmVyKTogTG9uZyB7XG4gIHJldHVybiBmZXRjaChzLCBvZmZzZXQsIDQpO1xufVxuXG5mdW5jdGlvbiByb3RhdGU2NCh2YWw6IExvbmcsIHNoaWZ0OiBudW1iZXIpOiBMb25nIHtcbiAgLy8gQXZvaWQgc2hpZnRpbmcgYnkgNjQ6IGRvaW5nIHNvIHlpZWxkcyBhbiB1bmRlZmluZWQgcmVzdWx0LlxuICByZXR1cm4gc2hpZnQgPT09IDAgPyB2YWwgOiB2YWwuc2hydShzaGlmdCkub3IodmFsLnNobCg2NCAtIHNoaWZ0KSk7XG59XG5cbmZ1bmN0aW9uIGhhc2hMZW4xNih1OiBMb25nLCB2OiBMb25nLCBtdWwgPSBoZXhUb0xvbmcoJzlkZGZlYTA4ZWIzODJkNjknKSkge1xuICAvLyBNdXJtdXItaW5zcGlyZWQgaGFzaGluZy5cbiAgbGV0IGEgPSB1Lnhvcih2KS5tdWwobXVsKTtcbiAgYSA9IGEueG9yKGEuc2hydSg0NykpO1xuICBsZXQgYiA9IHYueG9yKGEpLm11bChtdWwpO1xuICBiID0gYi54b3IoYi5zaHJ1KDQ3KSk7XG4gIGIgPSBiLm11bChtdWwpO1xuICByZXR1cm4gYjtcbn1cblxuLy8gUmV0dXJuIGEgMTYtYnl0ZSBoYXNoIGZvciA0OCBieXRlcy4gIFF1aWNrIGFuZCBkaXJ0eS5cbi8vIENhbGxlcnMgZG8gYmVzdCB0byB1c2UgXCJyYW5kb20tbG9va2luZ1wiIHZhbHVlcyBmb3IgYSBhbmQgYi5cbmZ1bmN0aW9uIHdlYWtIYXNoTGVuMzJXaXRoU2VlZHMoXG4gICAgdzogTG9uZywgeDogTG9uZywgeTogTG9uZywgejogTG9uZywgYTogTG9uZywgYjogTG9uZykge1xuICBhID0gYS5hZGQodyk7XG4gIGIgPSByb3RhdGU2NChiLmFkZChhKS5hZGQoeiksIDIxKTtcbiAgY29uc3QgYyA9IGE7XG4gIGEgPSBhLmFkZCh4KTtcbiAgYSA9IGEuYWRkKHkpO1xuICBiID0gYi5hZGQocm90YXRlNjQoYSwgNDQpKTtcbiAgcmV0dXJuIFthLmFkZCh6KSwgYi5hZGQoYyldO1xufVxuXG5mdW5jdGlvbiB3ZWFrSGFzaExlbjMyV2l0aFNlZWRzU3RyKFxuICAgIHM6IFVpbnQ4QXJyYXksIG9mZnNldDogbnVtYmVyLCBhOiBMb25nLCBiOiBMb25nKSB7XG4gIHJldHVybiB3ZWFrSGFzaExlbjMyV2l0aFNlZWRzKFxuICAgICAgZmV0Y2g2NChzLCBvZmZzZXQpLCBmZXRjaDY0KHMsIG9mZnNldCArIDgpLCBmZXRjaDY0KHMsIG9mZnNldCArIDE2KSxcbiAgICAgIGZldGNoNjQocywgb2Zmc2V0ICsgMjQpLCBhLCBiKTtcbn1cblxuZnVuY3Rpb24gaGFzaExlbjB0bzE2KHM6IFVpbnQ4QXJyYXksIGxlbiA9IHMubGVuZ3RoKTogTG9uZyB7XG4gIGlmIChsZW4gPj0gOCkge1xuICAgIGNvbnN0IG11bCA9IGsyLmFkZChsZW4gKiAyKTtcbiAgICBjb25zdCBhID0gZmV0Y2g2NChzLCAwKS5hZGQoazIpO1xuICAgIGNvbnN0IGIgPSBmZXRjaDY0KHMsIGxlbiAtIDgpO1xuICAgIGNvbnN0IGMgPSByb3RhdGU2NChiLCAzNykubXVsKG11bCkuYWRkKGEpO1xuICAgIGNvbnN0IGQgPSByb3RhdGU2NChhLCAyNSkuYWRkKGIpLm11bChtdWwpO1xuICAgIHJldHVybiBoYXNoTGVuMTYoYywgZCwgbXVsKTtcbiAgfVxuICBpZiAobGVuID49IDQpIHtcbiAgICBjb25zdCBtdWwgPSBrMi5hZGQobGVuICogMik7XG4gICAgY29uc3QgYSA9IGZldGNoMzIocywgMCk7XG4gICAgcmV0dXJuIGhhc2hMZW4xNihhLnNobCgzKS5hZGQobGVuKSwgZmV0Y2gzMihzLCBsZW4gLSA0KSwgbXVsKTtcbiAgfVxuICBpZiAobGVuID4gMCkge1xuICAgIGNvbnN0IGEgPSBzWzBdO1xuICAgIGNvbnN0IGIgPSBzW2xlbiA+PiAxXTtcbiAgICBjb25zdCBjID0gc1tsZW4gLSAxXTtcbiAgICBjb25zdCB5ID0gYSArIChiIDw8IDgpO1xuICAgIGNvbnN0IHogPSBsZW4gKyAoYyA8PCAyKTtcbiAgICByZXR1cm4gc2hpZnRNaXgoazIubXVsKHkpLnhvcihrMC5tdWwoeikpKS5tdWwoazIpO1xuICB9XG4gIHJldHVybiBrMjtcbn1cblxuZnVuY3Rpb24gaGFzaExlbjE3dG8zMihzOiBVaW50OEFycmF5LCBsZW4gPSBzLmxlbmd0aCk6IExvbmcge1xuICBjb25zdCBtdWwgPSBrMi5hZGQobGVuICogMik7XG4gIGNvbnN0IGEgPSBmZXRjaDY0KHMsIDApLm11bChrMSk7XG4gIGNvbnN0IGIgPSBmZXRjaDY0KHMsIDgpO1xuICBjb25zdCBjID0gZmV0Y2g2NChzLCBsZW4gLSA4KS5tdWwobXVsKTtcbiAgY29uc3QgZCA9IGZldGNoNjQocywgbGVuIC0gMTYpLm11bChrMik7XG4gIHJldHVybiBoYXNoTGVuMTYoXG4gICAgICByb3RhdGU2NChhLmFkZChiKSwgNDMpLmFkZChyb3RhdGU2NChjLCAzMCkpLmFkZChkKSxcbiAgICAgIGEuYWRkKHJvdGF0ZTY0KGIuYWRkKGsyKSwgMTgpKS5hZGQoYyksIG11bCk7XG59XG5cbmZ1bmN0aW9uIGhhc2hMZW4zM3RvNjQoczogVWludDhBcnJheSwgbGVuID0gcy5sZW5ndGgpOiBMb25nIHtcbiAgY29uc3QgbXVsID0gazIuYWRkKGxlbiAqIDIpO1xuICBjb25zdCBhID0gZmV0Y2g2NChzLCAwKS5tdWwoazIpO1xuICBjb25zdCBiID0gZmV0Y2g2NChzLCA4KTtcbiAgY29uc3QgYyA9IGZldGNoNjQocywgbGVuIC0gOCkubXVsKG11bCk7XG4gIGNvbnN0IGQgPSBmZXRjaDY0KHMsIGxlbiAtIDE2KS5tdWwoazIpO1xuICBjb25zdCB5ID0gcm90YXRlNjQoYS5hZGQoYiksIDQzKS5hZGQocm90YXRlNjQoYywgMzApKS5hZGQoZCk7XG4gIGNvbnN0IHogPSBoYXNoTGVuMTYoeSwgYS5hZGQocm90YXRlNjQoYi5hZGQoazIpLCAxOCkpLmFkZChjKSwgbXVsKTtcbiAgY29uc3QgZSA9IGZldGNoNjQocywgMTYpLm11bChtdWwpO1xuICBjb25zdCBmID0gZmV0Y2g2NChzLCAyNCk7XG4gIGNvbnN0IGcgPSB5LmFkZChmZXRjaDY0KHMsIGxlbiAtIDMyKSkubXVsKG11bCk7XG4gIGNvbnN0IGggPSB6LmFkZChmZXRjaDY0KHMsIGxlbiAtIDI0KSkubXVsKG11bCk7XG4gIHJldHVybiBoYXNoTGVuMTYoXG4gICAgICByb3RhdGU2NChlLmFkZChmKSwgNDMpLmFkZChyb3RhdGU2NChnLCAzMCkpLmFkZChoKSxcbiAgICAgIGUuYWRkKHJvdGF0ZTY0KGYuYWRkKGEpLCAxOCkpLmFkZChnKSwgbXVsKTtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGZpbmdlclByaW50NjQoczogVWludDhBcnJheSwgbGVuID0gcy5sZW5ndGgpOiBMb25nIHtcbiAgY29uc3Qgc2VlZDogTG9uZyA9IExvbmcuZnJvbU51bWJlcig4MSwgdHJ1ZSk7XG4gIGlmIChsZW4gPD0gMzIpIHtcbiAgICBpZiAobGVuIDw9IDE2KSB7XG4gICAgICByZXR1cm4gaGFzaExlbjB0bzE2KHMsIGxlbik7XG4gICAgfSBlbHNlIHtcbiAgICAgIHJldHVybiBoYXNoTGVuMTd0bzMyKHMsIGxlbik7XG4gICAgfVxuICB9IGVsc2UgaWYgKGxlbiA8PSA2NCkge1xuICAgIHJldHVybiBoYXNoTGVuMzN0bzY0KHMsIGxlbik7XG4gIH1cblxuICAvLyBGb3Igc3RyaW5ncyBvdmVyIDY0IGJ5dGVzIHdlIGxvb3AuICBJbnRlcm5hbCBzdGF0ZSBjb25zaXN0cyBvZlxuICAvLyA1NiBieXRlczogdiwgdywgeCwgeSwgYW5kIHouXG4gIGxldCB4ID0gc2VlZDtcbiAgbGV0IHkgPSBzZWVkLm11bChrMSkuYWRkKDExMyk7XG5cbiAgbGV0IHogPSBzaGlmdE1peCh5Lm11bChrMikuYWRkKDExMykpLm11bChrMik7XG4gIGxldCB2ID0gW0xvbmcuVVpFUk8sIExvbmcuVVpFUk9dO1xuICBsZXQgdyA9IFtMb25nLlVaRVJPLCBMb25nLlVaRVJPXTtcbiAgeCA9IHgubXVsKGsyKS5hZGQoZmV0Y2g2NChzLCAwKSk7XG5cbiAgbGV0IG9mZnNldCA9IDA7XG4gIC8vIFNldCBlbmQgc28gdGhhdCBhZnRlciB0aGUgbG9vcCB3ZSBoYXZlIDEgdG8gNjQgYnl0ZXMgbGVmdCB0byBwcm9jZXNzLlxuICBjb25zdCBlbmQgPSAoKGxlbiAtIDEpID4+IDYpICogNjQ7XG4gIGNvbnN0IGxhc3Q2NCA9IGVuZCArICgobGVuIC0gMSkgJiA2MykgLSA2MztcblxuICBkbyB7XG4gICAgeCA9IHJvdGF0ZTY0KHguYWRkKHkpLmFkZCh2WzBdKS5hZGQoZmV0Y2g2NChzLCBvZmZzZXQgKyA4KSksIDM3KS5tdWwoazEpO1xuICAgIHkgPSByb3RhdGU2NCh5LmFkZCh2WzFdKS5hZGQoZmV0Y2g2NChzLCBvZmZzZXQgKyA0OCkpLCA0MikubXVsKGsxKTtcbiAgICB4ID0geC54b3Iod1sxXSk7XG4gICAgeSA9IHkuYWRkKHZbMF0pLmFkZChmZXRjaDY0KHMsIG9mZnNldCArIDQwKSk7XG4gICAgeiA9IHJvdGF0ZTY0KHouYWRkKHdbMF0pLCAzMykubXVsKGsxKTtcbiAgICB2ID0gd2Vha0hhc2hMZW4zMldpdGhTZWVkc1N0cihzLCBvZmZzZXQsIHZbMV0ubXVsKGsxKSwgeC5hZGQod1swXSkpO1xuICAgIHcgPSB3ZWFrSGFzaExlbjMyV2l0aFNlZWRzU3RyKFxuICAgICAgICBzLCBvZmZzZXQgKyAzMiwgei5hZGQod1sxXSksIHkuYWRkKGZldGNoNjQocywgb2Zmc2V0ICsgMTYpKSk7XG5cbiAgICBbeiwgeF0gPSBbeCwgel07XG4gICAgb2Zmc2V0ICs9IDY0O1xuICB9IHdoaWxlIChvZmZzZXQgIT09IGVuZCk7XG4gIGNvbnN0IG11bCA9IGsxLmFkZCh6LmFuZCgweGZmKS5zaGwoMSkpO1xuICAvLyBQb2ludCB0byB0aGUgbGFzdCA2NCBieXRlcyBvZiBpbnB1dC5cbiAgb2Zmc2V0ID0gbGFzdDY0O1xuXG4gIHdbMF0gPSB3WzBdLmFkZCgobGVuIC0gMSkgJiA2Myk7XG4gIHZbMF0gPSB2WzBdLmFkZCh3WzBdKTtcbiAgd1swXSA9IHdbMF0uYWRkKHZbMF0pO1xuXG4gIHggPSByb3RhdGU2NCh4LmFkZCh5KS5hZGQodlswXSkuYWRkKGZldGNoNjQocywgb2Zmc2V0ICsgOCkpLCAzNykubXVsKG11bCk7XG4gIHkgPSByb3RhdGU2NCh5LmFkZCh2WzFdKS5hZGQoZmV0Y2g2NChzLCBvZmZzZXQgKyA0OCkpLCA0MikubXVsKG11bCk7XG4gIHggPSB4Lnhvcih3WzFdLm11bCg5KSk7XG4gIHkgPSB5LmFkZCh2WzBdLm11bCg5KS5hZGQoZmV0Y2g2NChzLCBvZmZzZXQgKyA0MCkpKTtcbiAgeiA9IHJvdGF0ZTY0KHouYWRkKHdbMF0pLCAzMykubXVsKG11bCk7XG4gIHYgPSB3ZWFrSGFzaExlbjMyV2l0aFNlZWRzU3RyKHMsIG9mZnNldCwgdlsxXS5tdWwobXVsKSwgeC5hZGQod1swXSkpO1xuICB3ID0gd2Vha0hhc2hMZW4zMldpdGhTZWVkc1N0cihcbiAgICAgIHMsIG9mZnNldCArIDMyLCB6LmFkZCh3WzFdKSwgeS5hZGQoZmV0Y2g2NChzLCBvZmZzZXQgKyAxNikpKTtcblxuICBbeiwgeF0gPSBbeCwgel07XG5cbiAgcmV0dXJuIGhhc2hMZW4xNihcbiAgICAgIGhhc2hMZW4xNih2WzBdLCB3WzBdLCBtdWwpLmFkZChzaGlmdE1peCh5KS5tdWwoazApKS5hZGQoeiksXG4gICAgICBoYXNoTGVuMTYodlsxXSwgd1sxXSwgbXVsKS5hZGQoeCksIG11bCk7XG59XG4iXX0=","/**\n * @license\n * Copyright 2017 Google LLC. All Rights Reserved.\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n * =============================================================================\n */\nimport { env } from './environment';\nimport * as base from './util_base';\nexport * from './util_base';\nexport * from './hash_util';\n/**\n * Create typed array for scalar value. Used for storing in `DataStorage`.\n */\nexport function createScalarValue(value, dtype) {\n if (dtype === 'string') {\n return encodeString(value);\n }\n return toTypedArray([value], dtype);\n}\nfunction noConversionNeeded(a, dtype) {\n return (a instanceof Float32Array && dtype === 'float32') ||\n (a instanceof Int32Array && dtype === 'int32') ||\n (a instanceof Uint8Array && dtype === 'bool');\n}\nexport function toTypedArray(a, dtype) {\n if (dtype === 'string') {\n throw new Error('Cannot convert a string[] to a TypedArray');\n }\n if (Array.isArray(a)) {\n a = base.flatten(a);\n }\n if (env().getBool('DEBUG')) {\n base.checkConversionForErrors(a, dtype);\n }\n if (noConversionNeeded(a, dtype)) {\n return a;\n }\n if (dtype == null || dtype === 'float32' || dtype === 'complex64') {\n return new Float32Array(a);\n }\n else if (dtype === 'int32') {\n return new Int32Array(a);\n }\n else if (dtype === 'bool') {\n const bool = new Uint8Array(a.length);\n for (let i = 0; i < bool.length; ++i) {\n if (Math.round(a[i]) !== 0) {\n bool[i] = 1;\n }\n }\n return bool;\n }\n else {\n throw new Error(`Unknown data type ${dtype}`);\n }\n}\n/**\n * Returns the current high-resolution time in milliseconds relative to an\n * arbitrary time in the past. It works across different platforms (node.js,\n * browsers).\n *\n * ```js\n * console.log(tf.util.now());\n * ```\n *\n * @doc {heading: 'Util', namespace: 'util'}\n */\nexport function now() {\n return env().platform.now();\n}\n/**\n * Returns a platform-specific implementation of\n * [`fetch`](https://developer.mozilla.org/en-US/docs/Web/API/Fetch_API).\n *\n * If `fetch` is defined on the global object (`window`, `process`, etc.),\n * `tf.util.fetch` returns that function.\n *\n * If not, `tf.util.fetch` returns a platform-specific solution.\n *\n * ```js\n * const resource = await tf.util.fetch('https://unpkg.com/@tensorflow/tfjs');\n * // handle response\n * ```\n *\n * @doc {heading: 'Util'}\n */\nexport function fetch(path, requestInits) {\n return env().platform.fetch(path, requestInits);\n}\n/**\n * Encodes the provided string into bytes using the provided encoding scheme.\n *\n * @param s The string to encode.\n * @param encoding The encoding scheme. Defaults to utf-8.\n *\n * @doc {heading: 'Util'}\n */\nexport function encodeString(s, encoding = 'utf-8') {\n encoding = encoding || 'utf-8';\n return env().platform.encode(s, encoding);\n}\n/**\n * Decodes the provided bytes into a string using the provided encoding scheme.\n * @param bytes The bytes to decode.\n *\n * @param encoding The encoding scheme. Defaults to utf-8.\n *\n * @doc {heading: 'Util'}\n */\nexport function decodeString(bytes, encoding = 'utf-8') {\n encoding = encoding || 'utf-8';\n return env().platform.decode(bytes, encoding);\n}\n//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidXRpbC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uL3RmanMtY29yZS9zcmMvdXRpbC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQTs7Ozs7Ozs7Ozs7Ozs7O0dBZUc7QUFFSCxPQUFPLEVBQUMsR0FBRyxFQUFDLE1BQU0sZUFBZSxDQUFDO0FBRWxDLE9BQU8sS0FBSyxJQUFJLE1BQU0sYUFBYSxDQUFDO0FBQ3BDLGNBQWMsYUFBYSxDQUFDO0FBQzVCLGNBQWMsYUFBYSxDQUFDO0FBRTVCOztHQUVHO0FBQ0gsTUFBTSxVQUFVLGlCQUFpQixDQUM3QixLQUFlLEVBQUUsS0FBZTtJQUNsQyxJQUFJLEtBQUssS0FBSyxRQUFRLEVBQUU7UUFDdEIsT0FBTyxZQUFZLENBQUMsS0FBSyxDQUFDLENBQUM7S0FDNUI7SUFFRCxPQUFPLFlBQVksQ0FBQyxDQUFDLEtBQUssQ0FBQyxFQUFFLEtBQUssQ0FBQyxDQUFDO0FBQ3RDLENBQUM7QUFFRCxTQUFTLGtCQUFrQixDQUFDLENBQWEsRUFBRSxLQUFlO0lBQ3hELE9BQU8sQ0FBQyxDQUFDLFlBQVksWUFBWSxJQUFJLEtBQUssS0FBSyxTQUFTLENBQUM7UUFDckQsQ0FBQyxDQUFDLFlBQVksVUFBVSxJQUFJLEtBQUssS0FBSyxPQUFPLENBQUM7UUFDOUMsQ0FBQyxDQUFDLFlBQVksVUFBVSxJQUFJLEtBQUssS0FBSyxNQUFNLENBQUMsQ0FBQztBQUNwRCxDQUFDO0FBRUQsTUFBTSxVQUFVLFlBQVksQ0FBQyxDQUFhLEVBQUUsS0FBZTtJQUN6RCxJQUFJLEtBQUssS0FBSyxRQUFRLEVBQUU7UUFDdEIsTUFBTSxJQUFJLEtBQUssQ0FBQywyQ0FBMkMsQ0FBQyxDQUFDO0tBQzlEO0lBQ0QsSUFBSSxLQUFLLENBQUMsT0FBTyxDQUFDLENBQUMsQ0FBQyxFQUFFO1FBQ3BCLENBQUMsR0FBRyxJQUFJLENBQUMsT0FBTyxDQUFDLENBQUMsQ0FBQyxDQUFDO0tBQ3JCO0lBRUQsSUFBSSxHQUFHLEVBQUUsQ0FBQyxPQUFPLENBQUMsT0FBTyxDQUFDLEVBQUU7UUFDMUIsSUFBSSxDQUFDLHdCQUF3QixDQUFDLENBQWEsRUFBRSxLQUFLLENBQUMsQ0FBQztLQUNyRDtJQUNELElBQUksa0JBQWtCLENBQUMsQ0FBQyxFQUFFLEtBQUssQ0FBQyxFQUFFO1FBQ2hDLE9BQU8sQ0FBZSxDQUFDO0tBQ3hCO0lBQ0QsSUFBSSxLQUFLLElBQUksSUFBSSxJQUFJLEtBQUssS0FBSyxTQUFTLElBQUksS0FBSyxLQUFLLFdBQVcsRUFBRTtRQUNqRSxPQUFPLElBQUksWUFBWSxDQUFDLENBQWEsQ0FBQyxDQUFDO0tBQ3hDO1NBQU0sSUFBSSxLQUFLLEtBQUssT0FBTyxFQUFFO1FBQzVCLE9BQU8sSUFBSSxVQUFVLENBQUMsQ0FBYSxDQUFDLENBQUM7S0FDdEM7U0FBTSxJQUFJLEtBQUssS0FBSyxNQUFNLEVBQUU7UUFDM0IsTUFBTSxJQUFJLEdBQUcsSUFBSSxVQUFVLENBQUUsQ0FBYyxDQUFDLE1BQU0sQ0FBQyxDQUFDO1FBQ3BELEtBQUssSUFBSSxDQUFDLEdBQUcsQ0FBQyxFQUFFLENBQUMsR0FBRyxJQUFJLENBQUMsTUFBTSxFQUFFLEVBQUUsQ0FBQyxFQUFFO1lBQ3BDLElBQUksSUFBSSxDQUFDLEtBQUssQ0FBRSxDQUFjLENBQUMsQ0FBQyxDQUFDLENBQUMsS0FBSyxDQUFDLEVBQUU7Z0JBQ3hDLElBQUksQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUM7YUFDYjtTQUNGO1FBQ0QsT0FBTyxJQUFJLENBQUM7S0FDYjtTQUFNO1FBQ0wsTUFBTSxJQUFJLEtBQUssQ0FBQyxxQkFBcUIsS0FBSyxFQUFFLENBQUMsQ0FBQztLQUMvQztBQUNILENBQUM7QUFFRDs7Ozs7Ozs7OztHQVVHO0FBQ0gsTUFBTSxVQUFVLEdBQUc7SUFDakIsT0FBTyxHQUFHLEVBQUUsQ0FBQyxRQUFRLENBQUMsR0FBRyxFQUFFLENBQUM7QUFDOUIsQ0FBQztBQUVEOzs7Ozs7Ozs7Ozs7Ozs7R0FlRztBQUNILE1BQU0sVUFBVSxLQUFLLENBQ2pCLElBQVksRUFBRSxZQUEwQjtJQUMxQyxPQUFPLEdBQUcsRUFBRSxDQUFDLFFBQVEsQ0FBQyxLQUFLLENBQUMsSUFBSSxFQUFFLFlBQVksQ0FBQyxDQUFDO0FBQ2xELENBQUM7QUFFRDs7Ozs7OztHQU9HO0FBQ0gsTUFBTSxVQUFVLFlBQVksQ0FBQyxDQUFTLEVBQUUsUUFBUSxHQUFHLE9BQU87SUFDeEQsUUFBUSxHQUFHLFFBQVEsSUFBSSxPQUFPLENBQUM7SUFDL0IsT0FBTyxHQUFHLEVBQUUsQ0FBQyxRQUFRLENBQUMsTUFBTSxDQUFDLENBQUMsRUFBRSxRQUFRLENBQUMsQ0FBQztBQUM1QyxDQUFDO0FBRUQ7Ozs7Ozs7R0FPRztBQUNILE1BQU0sVUFBVSxZQUFZLENBQUMsS0FBaUIsRUFBRSxRQUFRLEdBQUcsT0FBTztJQUNoRSxRQUFRLEdBQUcsUUFBUSxJQUFJLE9BQU8sQ0FBQztJQUMvQixPQUFPLEdBQUcsRUFBRSxDQUFDLFFBQVEsQ0FBQyxNQUFNLENBQUMsS0FBSyxFQUFFLFFBQVEsQ0FBQyxDQUFDO0FBQ2hELENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyIvKipcbiAqIEBsaWNlbnNlXG4gKiBDb3B5cmlnaHQgMjAxNyBHb29nbGUgTExDLiBBbGwgUmlnaHRzIFJlc2VydmVkLlxuICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlIFwiTGljZW5zZVwiKTtcbiAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS5cbiAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdFxuICpcbiAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMFxuICpcbiAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmVcbiAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuIFwiQVMgSVNcIiBCQVNJUyxcbiAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLlxuICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZFxuICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuXG4gKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuICovXG5cbmltcG9ydCB7ZW52fSBmcm9tICcuL2Vudmlyb25tZW50JztcbmltcG9ydCB7QmFja2VuZFZhbHVlcywgRGF0YVR5cGUsIFRlbnNvckxpa2UsIFR5cGVkQXJyYXl9IGZyb20gJy4vdHlwZXMnO1xuaW1wb3J0ICogYXMgYmFzZSBmcm9tICcuL3V0aWxfYmFzZSc7XG5leHBvcnQgKiBmcm9tICcuL3V0aWxfYmFzZSc7XG5leHBvcnQgKiBmcm9tICcuL2hhc2hfdXRpbCc7XG5cbi8qKlxuICogQ3JlYXRlIHR5cGVkIGFycmF5IGZvciBzY2FsYXIgdmFsdWUuIFVzZWQgZm9yIHN0b3JpbmcgaW4gYERhdGFTdG9yYWdlYC5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGNyZWF0ZVNjYWxhclZhbHVlKFxuICAgIHZhbHVlOiBEYXRhVHlwZSwgZHR5cGU6IERhdGFUeXBlKTogQmFja2VuZFZhbHVlcyB7XG4gIGlmIChkdHlwZSA9PT0gJ3N0cmluZycpIHtcbiAgICByZXR1cm4gZW5jb2RlU3RyaW5nKHZhbHVlKTtcbiAgfVxuXG4gIHJldHVybiB0b1R5cGVkQXJyYXkoW3ZhbHVlXSwgZHR5cGUpO1xufVxuXG5mdW5jdGlvbiBub0NvbnZlcnNpb25OZWVkZWQoYTogVGVuc29yTGlrZSwgZHR5cGU6IERhdGFUeXBlKTogYm9vbGVhbiB7XG4gIHJldHVybiAoYSBpbnN0YW5jZW9mIEZsb2F0MzJBcnJheSAmJiBkdHlwZSA9PT0gJ2Zsb2F0MzInKSB8fFxuICAgICAgKGEgaW5zdGFuY2VvZiBJbnQzMkFycmF5ICYmIGR0eXBlID09PSAnaW50MzInKSB8fFxuICAgICAgKGEgaW5zdGFuY2VvZiBVaW50OEFycmF5ICYmIGR0eXBlID09PSAnYm9vbCcpO1xufVxuXG5leHBvcnQgZnVuY3Rpb24gdG9UeXBlZEFycmF5KGE6IFRlbnNvckxpa2UsIGR0eXBlOiBEYXRhVHlwZSk6IFR5cGVkQXJyYXkge1xuICBpZiAoZHR5cGUgPT09ICdzdHJpbmcnKSB7XG4gICAgdGhyb3cgbmV3IEVycm9yKCdDYW5ub3QgY29udmVydCBhIHN0cmluZ1tdIHRvIGEgVHlwZWRBcnJheScpO1xuICB9XG4gIGlmIChBcnJheS5pc0FycmF5KGEpKSB7XG4gICAgYSA9IGJhc2UuZmxhdHRlbihhKTtcbiAgfVxuXG4gIGlmIChlbnYoKS5nZXRCb29sKCdERUJVRycpKSB7XG4gICAgYmFzZS5jaGVja0NvbnZlcnNpb25Gb3JFcnJvcnMoYSBhcyBudW1iZXJbXSwgZHR5cGUpO1xuICB9XG4gIGlmIChub0NvbnZlcnNpb25OZWVkZWQoYSwgZHR5cGUpKSB7XG4gICAgcmV0dXJuIGEgYXMgVHlwZWRBcnJheTtcbiAgfVxuICBpZiAoZHR5cGUgPT0gbnVsbCB8fCBkdHlwZSA9PT0gJ2Zsb2F0MzInIHx8IGR0eXBlID09PSAnY29tcGxleDY0Jykge1xuICAgIHJldHVybiBuZXcgRmxvYXQzMkFycmF5KGEgYXMgbnVtYmVyW10pO1xuICB9IGVsc2UgaWYgKGR0eXBlID09PSAnaW50MzInKSB7XG4gICAgcmV0dXJuIG5ldyBJbnQzMkFycmF5KGEgYXMgbnVtYmVyW10pO1xuICB9IGVsc2UgaWYgKGR0eXBlID09PSAnYm9vbCcpIHtcbiAgICBjb25zdCBib29sID0gbmV3IFVpbnQ4QXJyYXkoKGEgYXMgbnVtYmVyW10pLmxlbmd0aCk7XG4gICAgZm9yIChsZXQgaSA9IDA7IGkgPCBib29sLmxlbmd0aDsgKytpKSB7XG4gICAgICBpZiAoTWF0aC5yb3VuZCgoYSBhcyBudW1iZXJbXSlbaV0pICE9PSAwKSB7XG4gICAgICAgIGJvb2xbaV0gPSAxO1xuICAgICAgfVxuICAgIH1cbiAgICByZXR1cm4gYm9vbDtcbiAgfSBlbHNlIHtcbiAgICB0aHJvdyBuZXcgRXJyb3IoYFVua25vd24gZGF0YSB0eXBlICR7ZHR5cGV9YCk7XG4gIH1cbn1cblxuLyoqXG4gKiBSZXR1cm5zIHRoZSBjdXJyZW50IGhpZ2gtcmVzb2x1dGlvbiB0aW1lIGluIG1pbGxpc2Vjb25kcyByZWxhdGl2ZSB0byBhblxuICogYXJiaXRyYXJ5IHRpbWUgaW4gdGhlIHBhc3QuIEl0IHdvcmtzIGFjcm9zcyBkaWZmZXJlbnQgcGxhdGZvcm1zIChub2RlLmpzLFxuICogYnJvd3NlcnMpLlxuICpcbiAqIGBgYGpzXG4gKiBjb25zb2xlLmxvZyh0Zi51dGlsLm5vdygpKTtcbiAqIGBgYFxuICpcbiAqIEBkb2Mge2hlYWRpbmc6ICdVdGlsJywgbmFtZXNwYWNlOiAndXRpbCd9XG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBub3coKTogbnVtYmVyIHtcbiAgcmV0dXJuIGVudigpLnBsYXRmb3JtLm5vdygpO1xufVxuXG4vKipcbiAqIFJldHVybnMgYSBwbGF0Zm9ybS1zcGVjaWZpYyBpbXBsZW1lbnRhdGlvbiBvZlxuICogW2BmZXRjaGBdKGh0dHBzOi8vZGV2ZWxvcGVyLm1vemlsbGEub3JnL2VuLVVTL2RvY3MvV2ViL0FQSS9GZXRjaF9BUEkpLlxuICpcbiAqIElmIGBmZXRjaGAgaXMgZGVmaW5lZCBvbiB0aGUgZ2xvYmFsIG9iamVjdCAoYHdpbmRvd2AsIGBwcm9jZXNzYCwgZXRjLiksXG4gKiBgdGYudXRpbC5mZXRjaGAgcmV0dXJucyB0aGF0IGZ1bmN0aW9uLlxuICpcbiAqIElmIG5vdCwgYHRmLnV0aWwuZmV0Y2hgIHJldHVybnMgYSBwbGF0Zm9ybS1zcGVjaWZpYyBzb2x1dGlvbi5cbiAqXG4gKiBgYGBqc1xuICogY29uc3QgcmVzb3VyY2UgPSBhd2FpdCB0Zi51dGlsLmZldGNoKCdodHRwczovL3VucGtnLmNvbS9AdGVuc29yZmxvdy90ZmpzJyk7XG4gKiAvLyBoYW5kbGUgcmVzcG9uc2VcbiAqIGBgYFxuICpcbiAqIEBkb2Mge2hlYWRpbmc6ICdVdGlsJ31cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGZldGNoKFxuICAgIHBhdGg6IHN0cmluZywgcmVxdWVzdEluaXRzPzogUmVxdWVzdEluaXQpOiBQcm9taXNlPFJlc3BvbnNlPiB7XG4gIHJldHVybiBlbnYoKS5wbGF0Zm9ybS5mZXRjaChwYXRoLCByZXF1ZXN0SW5pdHMpO1xufVxuXG4vKipcbiAqIEVuY29kZXMgdGhlIHByb3ZpZGVkIHN0cmluZyBpbnRvIGJ5dGVzIHVzaW5nIHRoZSBwcm92aWRlZCBlbmNvZGluZyBzY2hlbWUuXG4gKlxuICogQHBhcmFtIHMgVGhlIHN0cmluZyB0byBlbmNvZGUuXG4gKiBAcGFyYW0gZW5jb2RpbmcgVGhlIGVuY29kaW5nIHNjaGVtZS4gRGVmYXVsdHMgdG8gdXRmLTguXG4gKlxuICogQGRvYyB7aGVhZGluZzogJ1V0aWwnfVxuICovXG5leHBvcnQgZnVuY3Rpb24gZW5jb2RlU3RyaW5nKHM6IHN0cmluZywgZW5jb2RpbmcgPSAndXRmLTgnKTogVWludDhBcnJheSB7XG4gIGVuY29kaW5nID0gZW5jb2RpbmcgfHwgJ3V0Zi04JztcbiAgcmV0dXJuIGVudigpLnBsYXRmb3JtLmVuY29kZShzLCBlbmNvZGluZyk7XG59XG5cbi8qKlxuICogRGVjb2RlcyB0aGUgcHJvdmlkZWQgYnl0ZXMgaW50byBhIHN0cmluZyB1c2luZyB0aGUgcHJvdmlkZWQgZW5jb2Rpbmcgc2NoZW1lLlxuICogQHBhcmFtIGJ5dGVzIFRoZSBieXRlcyB0byBkZWNvZGUuXG4gKlxuICogQHBhcmFtIGVuY29kaW5nIFRoZSBlbmNvZGluZyBzY2hlbWUuIERlZmF1bHRzIHRvIHV0Zi04LlxuICpcbiAqIEBkb2Mge2hlYWRpbmc6ICdVdGlsJ31cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGRlY29kZVN0cmluZyhieXRlczogVWludDhBcnJheSwgZW5jb2RpbmcgPSAndXRmLTgnKTogc3RyaW5nIHtcbiAgZW5jb2RpbmcgPSBlbmNvZGluZyB8fCAndXRmLTgnO1xuICByZXR1cm4gZW52KCkucGxhdGZvcm0uZGVjb2RlKGJ5dGVzLCBlbmNvZGluZyk7XG59XG4iXX0=","/**\n * @license\n * Copyright 2020 Google LLC. All Rights Reserved.\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n * =============================================================================\n */\n/**\n * Shuffles the array in-place using Fisher-Yates algorithm.\n *\n * ```js\n * const a = [1, 2, 3, 4, 5];\n * tf.util.shuffle(a);\n * console.log(a);\n * ```\n *\n * @param array The array to shuffle in-place.\n *\n * @doc {heading: 'Util', namespace: 'util'}\n */\n// tslint:disable-next-line:no-any\nexport function shuffle(array) {\n let counter = array.length;\n let index = 0;\n // While there are elements in the array\n while (counter > 0) {\n // Pick a random index\n index = (Math.random() * counter) | 0;\n // Decrease counter by 1\n counter--;\n // And swap the last element with it\n swap(array, counter, index);\n }\n}\n/**\n * Shuffles two arrays in-place the same way using Fisher-Yates algorithm.\n *\n * ```js\n * const a = [1,2,3,4,5];\n * const b = [11,22,33,44,55];\n * tf.util.shuffleCombo(a, b);\n * console.log(a, b);\n * ```\n *\n * @param array The first array to shuffle in-place.\n * @param array2 The second array to shuffle in-place with the same permutation\n * as the first array.\n *\n * @doc {heading: 'Util', namespace: 'util'}\n */\nexport function shuffleCombo(\n// tslint:disable-next-line:no-any\narray, \n// tslint:disable-next-line:no-any\narray2) {\n if (array.length !== array2.length) {\n throw new Error(`Array sizes must match to be shuffled together ` +\n `First array length was ${array.length}` +\n `Second array length was ${array2.length}`);\n }\n let counter = array.length;\n let index = 0;\n // While there are elements in the array\n while (counter > 0) {\n // Pick a random index\n index = (Math.random() * counter) | 0;\n // Decrease counter by 1\n counter--;\n // And swap the last element of each array with it\n swap(array, counter, index);\n swap(array2, counter, index);\n }\n}\n/** Clamps a value to a specified range. */\nexport function clamp(min, x, max) {\n return Math.max(min, Math.min(x, max));\n}\nexport function nearestLargerEven(val) {\n return val % 2 === 0 ? val : val + 1;\n}\nexport function swap(object, left, right) {\n const temp = object[left];\n object[left] = object[right];\n object[right] = temp;\n}\nexport function sum(arr) {\n let sum = 0;\n for (let i = 0; i < arr.length; i++) {\n sum += arr[i];\n }\n return sum;\n}\n/**\n * Returns a sample from a uniform [a, b) distribution.\n *\n * @param a The minimum support (inclusive).\n * @param b The maximum support (exclusive).\n * @return A pseudorandom number on the half-open interval [a,b).\n */\nexport function randUniform(a, b) {\n const r = Math.random();\n return (b * r) + (1 - r) * a;\n}\n/** Returns the squared Euclidean distance between two vectors. */\nexport function distSquared(a, b) {\n let result = 0;\n for (let i = 0; i < a.length; i++) {\n const diff = Number(a[i]) - Number(b[i]);\n result += diff * diff;\n }\n return result;\n}\n/**\n * Asserts that the expression is true. Otherwise throws an error with the\n * provided message.\n *\n * ```js\n * const x = 2;\n * tf.util.assert(x === 2, 'x is not 2');\n * ```\n *\n * @param expr The expression to assert (as a boolean).\n * @param msg A function that returns the message to report when throwing an\n * error. We use a function for performance reasons.\n *\n * @doc {heading: 'Util', namespace: 'util'}\n */\nexport function assert(expr, msg) {\n if (!expr) {\n throw new Error(typeof msg === 'string' ? msg : msg());\n }\n}\nexport function assertShapesMatch(shapeA, shapeB, errorMessagePrefix = '') {\n assert(arraysEqual(shapeA, shapeB), () => errorMessagePrefix + ` Shapes ${shapeA} and ${shapeB} must match`);\n}\nexport function assertNonNull(a) {\n assert(a != null, () => `The input to the tensor constructor must be a non-null value.`);\n}\n// NOTE: We explicitly type out what T extends instead of any so that\n// util.flatten on a nested array of number doesn't try to infer T as a\n// number[][], causing us to explicitly type util.flatten().\n/**\n * Flattens an arbitrarily nested array.\n *\n * ```js\n * const a = [[1, 2], [3, 4], [5, [6, [7]]]];\n * const flat = tf.util.flatten(a);\n * console.log(flat);\n * ```\n *\n * @param arr The nested array to flatten.\n * @param result The destination array which holds the elements.\n * @param skipTypedArray If true, avoids flattening the typed arrays. Defaults\n * to false.\n *\n * @doc {heading: 'Util', namespace: 'util'}\n */\nexport function flatten(arr, result = [], skipTypedArray = false) {\n if (result == null) {\n result = [];\n }\n if (Array.isArray(arr) || isTypedArray(arr) && !skipTypedArray) {\n for (let i = 0; i < arr.length; ++i) {\n flatten(arr[i], result, skipTypedArray);\n }\n }\n else {\n result.push(arr);\n }\n return result;\n}\n/**\n * Returns the size (number of elements) of the tensor given its shape.\n *\n * ```js\n * const shape = [3, 4, 2];\n * const size = tf.util.sizeFromShape(shape);\n * console.log(size);\n * ```\n *\n * @doc {heading: 'Util', namespace: 'util'}\n */\nexport function sizeFromShape(shape) {\n if (shape.length === 0) {\n // Scalar.\n return 1;\n }\n let size = shape[0];\n for (let i = 1; i < shape.length; i++) {\n size *= shape[i];\n }\n return size;\n}\nexport function isScalarShape(shape) {\n return shape.length === 0;\n}\nexport function arraysEqual(n1, n2) {\n if (n1 === n2) {\n return true;\n }\n if (n1 == null || n2 == null) {\n return false;\n }\n if (n1.length !== n2.length) {\n return false;\n }\n for (let i = 0; i < n1.length; i++) {\n if (n1[i] !== n2[i]) {\n return false;\n }\n }\n return true;\n}\nexport function isInt(a) {\n return a % 1 === 0;\n}\nexport function tanh(x) {\n // tslint:disable-next-line:no-any\n if (Math.tanh != null) {\n // tslint:disable-next-line:no-any\n return Math.tanh(x);\n }\n if (x === Infinity) {\n return 1;\n }\n else if (x === -Infinity) {\n return -1;\n }\n else {\n const e2x = Math.exp(2 * x);\n return (e2x - 1) / (e2x + 1);\n }\n}\nexport function sizeToSquarishShape(size) {\n const width = Math.ceil(Math.sqrt(size));\n return [width, Math.ceil(size / width)];\n}\n/**\n * Creates a new array with randomized indices to a given quantity.\n *\n * ```js\n * const randomTen = tf.util.createShuffledIndices(10);\n * console.log(randomTen);\n * ```\n *\n * @param number Quantity of how many shuffled indices to create.\n *\n * @doc {heading: 'Util', namespace: 'util'}\n */\nexport function createShuffledIndices(n) {\n const shuffledIndices = new Uint32Array(n);\n for (let i = 0; i < n; ++i) {\n shuffledIndices[i] = i;\n }\n shuffle(shuffledIndices);\n return shuffledIndices;\n}\nexport function rightPad(a, size) {\n if (size <= a.length) {\n return a;\n }\n return a + ' '.repeat(size - a.length);\n}\nexport function repeatedTry(checkFn, delayFn = (counter) => 0, maxCounter, scheduleFn = setTimeout) {\n return new Promise((resolve, reject) => {\n let tryCount = 0;\n const tryFn = () => {\n if (checkFn()) {\n resolve();\n return;\n }\n tryCount++;\n const nextBackoff = delayFn(tryCount);\n if (maxCounter != null && tryCount >= maxCounter) {\n reject();\n return;\n }\n scheduleFn(tryFn, nextBackoff);\n };\n tryFn();\n });\n}\n/**\n * Given the full size of the array and a shape that may contain -1 as the\n * implicit dimension, returns the inferred shape where -1 is replaced.\n * E.g. For shape=[2, -1, 3] and size=24, it will return [2, 4, 3].\n *\n * @param shape The shape, which may contain -1 in some dimension.\n * @param size The full size (number of elements) of the array.\n * @return The inferred shape where -1 is replaced with the inferred size.\n */\nexport function inferFromImplicitShape(shape, size) {\n let shapeProd = 1;\n let implicitIdx = -1;\n for (let i = 0; i < shape.length; ++i) {\n if (shape[i] >= 0) {\n shapeProd *= shape[i];\n }\n else if (shape[i] === -1) {\n if (implicitIdx !== -1) {\n throw Error(`Shapes can only have 1 implicit size. ` +\n `Found -1 at dim ${implicitIdx} and dim ${i}`);\n }\n implicitIdx = i;\n }\n else if (shape[i] < 0) {\n throw Error(`Shapes can not be < 0. Found ${shape[i]} at dim ${i}`);\n }\n }\n if (implicitIdx === -1) {\n if (size > 0 && size !== shapeProd) {\n throw Error(`Size(${size}) must match the product of shape ${shape}`);\n }\n return shape;\n }\n if (shapeProd === 0) {\n throw Error(`Cannot infer the missing size in [${shape}] when ` +\n `there are 0 elements`);\n }\n if (size % shapeProd !== 0) {\n throw Error(`The implicit shape can't be a fractional number. ` +\n `Got ${size} / ${shapeProd}`);\n }\n const newShape = shape.slice();\n newShape[implicitIdx] = size / shapeProd;\n return newShape;\n}\nexport function parseAxisParam(axis, shape) {\n const rank = shape.length;\n // Normalize input\n axis = axis == null ? shape.map((s, i) => i) : [].concat(axis);\n // Check for valid range\n assert(axis.every(ax => ax >= -rank && ax < rank), () => `All values in axis param must be in range [-${rank}, ${rank}) but ` +\n `got axis ${axis}`);\n // Check for only integers\n assert(axis.every(ax => isInt(ax)), () => `All values in axis param must be integers but ` +\n `got axis ${axis}`);\n // Handle negative axis.\n return axis.map(a => a < 0 ? rank + a : a);\n}\n/** Reduces the shape by removing all dimensions of shape 1. */\nexport function squeezeShape(shape, axis) {\n const newShape = [];\n const keptDims = [];\n const isEmptyArray = axis != null && Array.isArray(axis) && axis.length === 0;\n const axes = (axis == null || isEmptyArray) ?\n null :\n parseAxisParam(axis, shape).sort();\n let j = 0;\n for (let i = 0; i < shape.length; ++i) {\n if (axes != null) {\n if (axes[j] === i && shape[i] !== 1) {\n throw new Error(`Can't squeeze axis ${i} since its dim '${shape[i]}' is not 1`);\n }\n if ((axes[j] == null || axes[j] > i) && shape[i] === 1) {\n newShape.push(shape[i]);\n keptDims.push(i);\n }\n if (axes[j] <= i) {\n j++;\n }\n }\n if (shape[i] !== 1) {\n newShape.push(shape[i]);\n keptDims.push(i);\n }\n }\n return { newShape, keptDims };\n}\nexport function getTypedArrayFromDType(dtype, size) {\n let values = null;\n if (dtype == null || dtype === 'float32') {\n values = new Float32Array(size);\n }\n else if (dtype === 'int32') {\n values = new Int32Array(size);\n }\n else if (dtype === 'bool') {\n values = new Uint8Array(size);\n }\n else {\n throw new Error(`Unknown data type ${dtype}`);\n }\n return values;\n}\nexport function getArrayFromDType(dtype, size) {\n let values = null;\n if (dtype == null || dtype === 'float32') {\n values = new Float32Array(size);\n }\n else if (dtype === 'int32') {\n values = new Int32Array(size);\n }\n else if (dtype === 'bool') {\n values = new Uint8Array(size);\n }\n else if (dtype === 'string') {\n values = new Array(size);\n }\n else {\n throw new Error(`Unknown data type ${dtype}`);\n }\n return values;\n}\nexport function checkConversionForErrors(vals, dtype) {\n for (let i = 0; i < vals.length; i++) {\n const num = vals[i];\n if (isNaN(num) || !isFinite(num)) {\n throw Error(`A tensor of type ${dtype} being uploaded contains ${num}.`);\n }\n }\n}\n/** Returns true if the dtype is valid. */\nexport function isValidDtype(dtype) {\n return dtype === 'bool' || dtype === 'complex64' || dtype === 'float32' ||\n dtype === 'int32' || dtype === 'string';\n}\n/**\n * Returns true if the new type can't encode the old type without loss of\n * precision.\n */\nexport function hasEncodingLoss(oldType, newType) {\n if (newType === 'complex64') {\n return false;\n }\n if (newType === 'float32' && oldType !== 'complex64') {\n return false;\n }\n if (newType === 'int32' && oldType !== 'float32' && oldType !== 'complex64') {\n return false;\n }\n if (newType === 'bool' && oldType === 'bool') {\n return false;\n }\n return true;\n}\nexport function isTypedArray(a) {\n return a instanceof Float32Array || a instanceof Int32Array ||\n a instanceof Uint8Array || a instanceof Uint8ClampedArray;\n}\nexport function bytesPerElement(dtype) {\n if (dtype === 'float32' || dtype === 'int32') {\n return 4;\n }\n else if (dtype === 'complex64') {\n return 8;\n }\n else if (dtype === 'bool') {\n return 1;\n }\n else {\n throw new Error(`Unknown dtype ${dtype}`);\n }\n}\n/**\n * Returns the approximate number of bytes allocated in the string array - 2\n * bytes per character. Computing the exact bytes for a native string in JS\n * is not possible since it depends on the encoding of the html page that\n * serves the website.\n */\nexport function bytesFromStringArray(arr) {\n if (arr == null) {\n return 0;\n }\n let bytes = 0;\n arr.forEach(x => bytes += x.length);\n return bytes;\n}\n/** Returns true if the value is a string. */\nexport function isString(value) {\n return typeof value === 'string' || value instanceof String;\n}\nexport function isBoolean(value) {\n return typeof value === 'boolean';\n}\nexport function isNumber(value) {\n return typeof value === 'number';\n}\nexport function inferDtype(values) {\n if (Array.isArray(values)) {\n return inferDtype(values[0]);\n }\n if (values instanceof Float32Array) {\n return 'float32';\n }\n else if (values instanceof Int32Array || values instanceof Uint8Array ||\n values instanceof Uint8ClampedArray) {\n return 'int32';\n }\n else if (isNumber(values)) {\n return 'float32';\n }\n else if (isString(values)) {\n return 'string';\n }\n else if (isBoolean(values)) {\n return 'bool';\n }\n return 'float32';\n}\nexport function isFunction(f) {\n return !!(f && f.constructor && f.call && f.apply);\n}\nexport function nearestDivisor(size, start) {\n for (let i = start; i < size; ++i) {\n if (size % i === 0) {\n return i;\n }\n }\n return size;\n}\nexport function computeStrides(shape) {\n const rank = shape.length;\n if (rank < 2) {\n return [];\n }\n // Last dimension has implicit stride of 1, thus having D-1 (instead of D)\n // strides.\n const strides = new Array(rank - 1);\n strides[rank - 2] = shape[rank - 1];\n for (let i = rank - 3; i >= 0; --i) {\n strides[i] = strides[i + 1] * shape[i + 1];\n }\n return strides;\n}\nfunction createNestedArray(offset, shape, a, isComplex = false) {\n const ret = new Array();\n if (shape.length === 1) {\n const d = shape[0] * (isComplex ? 2 : 1);\n for (let i = 0; i < d; i++) {\n ret[i] = a[offset + i];\n }\n }\n else {\n const d = shape[0];\n const rest = shape.slice(1);\n const len = rest.reduce((acc, c) => acc * c) * (isComplex ? 2 : 1);\n for (let i = 0; i < d; i++) {\n ret[i] = createNestedArray(offset + i * len, rest, a, isComplex);\n }\n }\n return ret;\n}\n// Provide a nested array of TypedArray in given shape.\nexport function toNestedArray(shape, a, isComplex = false) {\n if (shape.length === 0) {\n // Scalar type should return a single number.\n return a[0];\n }\n const size = shape.reduce((acc, c) => acc * c) * (isComplex ? 2 : 1);\n if (size === 0) {\n // A tensor with shape zero should be turned into empty list.\n return [];\n }\n if (size !== a.length) {\n throw new Error(`[${shape}] does not match the input size ${a.length}${isComplex ? ' for a complex tensor' : ''}.`);\n }\n return createNestedArray(0, shape, a, isComplex);\n}\nexport function makeOnesTypedArray(size, dtype) {\n const array = makeZerosTypedArray(size, dtype);\n for (let i = 0; i < array.length; i++) {\n array[i] = 1;\n }\n return array;\n}\nexport function makeZerosTypedArray(size, dtype) {\n if (dtype == null || dtype === 'float32' || dtype === 'complex64') {\n return new Float32Array(size);\n }\n else if (dtype === 'int32') {\n return new Int32Array(size);\n }\n else if (dtype === 'bool') {\n return new Uint8Array(size);\n }\n else {\n throw new Error(`Unknown data type ${dtype}`);\n }\n}\n/**\n * Make nested `TypedArray` filled with zeros.\n * @param shape The shape information for the nested array.\n * @param dtype dtype of the array element.\n */\nexport function makeZerosNestedTypedArray(shape, dtype) {\n const size = shape.reduce((prev, curr) => prev * curr, 1);\n if (dtype == null || dtype === 'float32') {\n return toNestedArray(shape, new Float32Array(size));\n }\n else if (dtype === 'int32') {\n return toNestedArray(shape, new Int32Array(size));\n }\n else if (dtype === 'bool') {\n return toNestedArray(shape, new Uint8Array(size));\n }\n else {\n throw new Error(`Unknown data type ${dtype}`);\n }\n}\nexport function assertNonNegativeIntegerDimensions(shape) {\n shape.forEach(dimSize => {\n assert(Number.isInteger(dimSize) && dimSize >= 0, () => `Tensor must have a shape comprised of positive integers but got ` +\n `shape [${shape}].`);\n });\n}\n/**\n * Computes flat index for a given location (multidimentionsal index) in a\n * Tensor/multidimensional array.\n *\n * @param locs Location in the tensor.\n * @param rank Rank of the tensor.\n * @param strides Tensor strides.\n */\nexport function locToIndex(locs, rank, strides) {\n if (rank === 0) {\n return 0;\n }\n else if (rank === 1) {\n return locs[0];\n }\n let index = locs[locs.length - 1];\n for (let i = 0; i < locs.length - 1; ++i) {\n index += strides[i] * locs[i];\n }\n return index;\n}\n/**\n * Computes the location (multidimensional index) in a\n * tensor/multidimentional array for a given flat index.\n *\n * @param index Index in flat array.\n * @param rank Rank of tensor.\n * @param strides Strides of tensor.\n */\nexport function indexToLoc(index, rank, strides) {\n if (rank === 0) {\n return [];\n }\n else if (rank === 1) {\n return [index];\n }\n const locs = new Array(rank);\n for (let i = 0; i < locs.length - 1; ++i) {\n locs[i] = Math.floor(index / strides[i]);\n index -= locs[i] * strides[i];\n }\n locs[locs.length - 1] = index;\n return locs;\n}\n/**\n * This method asserts whether an object is a Promise instance.\n * @param object\n */\n// tslint:disable-next-line: no-any\nexport function isPromise(object) {\n // We chose to not use 'obj instanceOf Promise' for two reasons:\n // 1. It only reliably works for es6 Promise, not other Promise\n // implementations.\n // 2. It doesn't work with framework that uses zone.js. zone.js monkey\n // patch the async calls, so it is possible the obj (patched) is\n // comparing to a pre-patched Promise.\n return object && object.then && typeof object.then === 'function';\n}\n//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidXRpbF9iYXNlLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vdGZqcy1jb3JlL3NyYy91dGlsX2Jhc2UudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUE7Ozs7Ozs7Ozs7Ozs7OztHQWVHO0FBSUg7Ozs7Ozs7Ozs7OztHQVlHO0FBQ0gsa0NBQWtDO0FBQ2xDLE1BQU0sVUFBVSxPQUFPLENBQUMsS0FDWTtJQUNsQyxJQUFJLE9BQU8sR0FBRyxLQUFLLENBQUMsTUFBTSxDQUFDO0lBQzNCLElBQUksS0FBSyxHQUFHLENBQUMsQ0FBQztJQUNkLHdDQUF3QztJQUN4QyxPQUFPLE9BQU8sR0FBRyxDQUFDLEVBQUU7UUFDbEIsc0JBQXNCO1FBQ3RCLEtBQUssR0FBRyxDQUFDLElBQUksQ0FBQyxNQUFNLEVBQUUsR0FBRyxPQUFPLENBQUMsR0FBRyxDQUFDLENBQUM7UUFDdEMsd0JBQXdCO1FBQ3hCLE9BQU8sRUFBRSxDQUFDO1FBQ1Ysb0NBQW9DO1FBQ3BDLElBQUksQ0FBQyxLQUFLLEVBQUUsT0FBTyxFQUFFLEtBQUssQ0FBQyxDQUFDO0tBQzdCO0FBQ0gsQ0FBQztBQUVEOzs7Ozs7Ozs7Ozs7Ozs7R0FlRztBQUNILE1BQU0sVUFBVSxZQUFZO0FBQ3hCLGtDQUFrQztBQUNsQyxLQUFnRDtBQUNoRCxrQ0FBa0M7QUFDbEMsTUFBaUQ7SUFDbkQsSUFBSSxLQUFLLENBQUMsTUFBTSxLQUFLLE1BQU0sQ0FBQyxNQUFNLEVBQUU7UUFDbEMsTUFBTSxJQUFJLEtBQUssQ0FDWCxpREFBaUQ7WUFDakQsMEJBQTBCLEtBQUssQ0FBQyxNQUFNLEVBQUU7WUFDeEMsMkJBQTJCLE1BQU0sQ0FBQyxNQUFNLEVBQUUsQ0FBQyxDQUFDO0tBQ2pEO0lBQ0QsSUFBSSxPQUFPLEdBQUcsS0FBSyxDQUFDLE1BQU0sQ0FBQztJQUMzQixJQUFJLEtBQUssR0FBRyxDQUFDLENBQUM7SUFDZCx3Q0FBd0M7SUFDeEMsT0FBTyxPQUFPLEdBQUcsQ0FBQyxF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SUFBSSxDQUFDLENBQUMsQ0FBQyxHQUFHLE9BQU8sQ0FBQyxDQUFDLENBQUMsQ0FBQztLQUMvQjtJQUNELElBQUksQ0FBQyxJQUFJLENBQUMsTUFBTSxHQUFHLENBQUMsQ0FBQyxHQUFHLEtBQUssQ0FBQztJQUM5QixPQUFPLElBQUksQ0FBQztBQUNkLENBQUM7QUFFRDs7O0dBR0c7QUFDSCxtQ0FBbUM7QUFDbkMsTUFBTSxVQUFVLFNBQVMsQ0FBQyxNQUFXO0lBQ25DLGlFQUFpRTtJQUNqRSxnRUFBZ0U7SUFDaEUsb0JBQW9CO0lBQ3BCLHVFQUF1RTtJQUN2RSxpRUFBaUU7SUFDakUsdUNBQXVDO0lBQ3ZDLE9BQU8sTUFBTSxJQUFJLE1BQU0sQ0FBQyxJQUFJLElBQUksT0FBTyxNQUFNLENBQUMsSUFBSSxLQUFLLFVBQVUsQ0FBQztBQUNwRSxDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiLyoqXG4gKiBAbGljZW5zZVxuICogQ29weXJpZ2h0IDIwMjAgR29vZ2xlIExMQy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC5cbiAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSBcIkxpY2Vuc2VcIik7XG4gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuXG4gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXRcbiAqXG4gKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjBcbiAqXG4gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlXG4gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiBcIkFTIElTXCIgQkFTSVMsXG4gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC5cbiAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmRcbiAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLlxuICogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbiAqL1xuXG5pbXBvcnQge0RhdGFUeXBlLCBEYXRhVHlwZU1hcCwgRmxhdFZlY3RvciwgTnVtZXJpY0RhdGFUeXBlLCBSZWN1cnNpdmVBcnJheSwgVGVuc29yTGlrZSwgVHlwZWRBcnJheX0gZnJvbSAnLi90eXBlcyc7XG5cbi8qKlxuICogU2h1ZmZsZXMgdGhlIGFycmF5IGluLXBsYWNlIHVzaW5nIEZpc2hlci1ZYXRlcyBhbGdvcml0aG0uXG4gKlxuICogYGBganNcbiAqIGNvbnN0IGEgPSBbMSwgMiwgMywgNCwgNV07XG4gKiB0Zi51dGlsLnNodWZmbGUoYSk7XG4gKiBjb25zb2xlLmxvZyhhKTtcbiAqIGBgYFxuICpcbiAqIEBwYXJhbSBhcnJheSBUaGUgYXJyYXkgdG8gc2h1ZmZsZSBpbi1wbGFjZS5cbiAqXG4gKiBAZG9jIHtoZWFkaW5nOiAnVXRpbCcsIG5hbWVzcGFjZTogJ3V0aWwnfVxuICovXG4vLyB0c2xpbnQ6ZGlzYWJsZS1uZXh0LWxpbmU6bm8tYW55XG5leHBvcnQgZnVuY3Rpb24gc2h1ZmZsZShhcnJheTogYW55W118VWludDMyQXJyYXl8SW50MzJBcnJheXxcbiAgICAgICAgICAgICAgICAgICAgICAgIEZsb2F0MzJBcnJheSk6IHZvaWQge1xuICBsZXQgY291bnRlciA9IGFycmF5Lmxlbmd0aDtcbiAgbGV0IGluZGV4ID0gMDtcbiAgLy8gV2hpbGUgdGhlcmUgYXJlIGVsZW1lbnRzIGluIHRoZSBhcnJheVxuICB3aGlsZSAoY291bnRlciA+IDApIHtcbiAgICAvLyBQaWNrIGEgcmFuZG9tIGluZGV4XG4gICAgaW5kZXggPSAoTWF0aC5yYW5kb20oKSAqIGNvdW50ZXIpIHwgMDtcbiAgICAvLyBEZWNyZWFzZSBjb3VudGVyIGJ5IDFcbiAgICBjb3VudGVyLS07XG4gICAgLy8gQW5kIHN3YXAgdGhlIGxhc3QgZWxlbWVudCB3aXRoIGl0XG4gICAgc3dhcChhcnJheSwgY291bnRlciwgaW5kZXgpO1xuICB9XG59XG5cbi8qKlxuICogU2h1ZmZsZXMgdHdvIGFycmF5cyBpbi1wbGFjZSB0aGUgc2FtZSB3YXkgdXNpbmcgRmlzaGVyLVlhdGVzIGFsZ29yaXRobS5cbiAqXG4gKiBgYGBqc1xuICogY29uc3QgYSA9IFsxLDIsMyw0LDVdO1xuICogY29uc3QgYiA9IFsxMSwyMiwzMyw0NCw1NV07XG4gKiB0Zi51dGlsLnNodWZmbGVDb21ibyhhLCBiKTtcbiAqIGNvbnNvbGUubG9nKGEsIGIpO1xuICogYGBgXG4gKlxuICogQHBhcmFtIGFycmF5IFRoZSBmaXJzdCBhcnJheSB0byBzaHVmZmxlIGluLXBsYWNlLlxuICogQHBhcmFtIGFycmF5MiBUaGUgc2Vjb25kIGFycmF5IHRvIHNodWZmbGUgaW4tcGxhY2Ugd2l0aCB0aGUgc2FtZSBwZXJtdXRhdGlvblxuICogICAgIGFzIHRoZSBmaXJzdCBhcnJheS5cbiAqXG4gKiBAZG9jIHtoZWFkaW5nOiAnVXRpbCcsIG5hbWVzcGFjZTogJ3V0aWwnfVxuICovXG5leHBvcnQgZnVuY3Rpb24gc2h1ZmZsZUNvbWJvKFxuICAgIC8vIHRzbGludDpkaXNhYmxlLW5leHQtbGluZTpuby1hbnlcbiAgICBhcnJheTogYW55W118VWludDMyQXJyYXl8SW50MzJBcnJheXxGbG9hdDMyQXJyYXksXG4gICAgLy8gdHNsaW50OmRpc2FibGUtbmV4dC1saW5lOm5vLWFueVxuICAgIGFycmF5MjogYW55W118VWludDMyQXJyYXl8SW50MzJBcnJheXxGbG9hdDMyQXJyYXkpOiB2b2lkIHtcbiAgaWYgKGFycmF5Lmxlbmd0aCAhPT0gYXJyYXkyLmxlbmd0aCkge1xuICAgIHRocm93IG5ldyBFcnJvcihcbiAgICAgICAgYEFycmF5IHNpemVzIG11c3QgbWF0Y2ggdG8gYmUgc2h1ZmZsZWQgdG9nZXRoZXIgYCArXG4gICAgICAgIGBGaXJzdCBhcnJheSBsZW5ndGggd2FzICR7YXJyYXkubGVuZ3RofWAgK1xuICAgICAgICBgU2Vjb25kIGFycmF5IGxlbmd0aCB3YXMgJHthcnJheTIubGVuZ3RofWApO1xuICB9XG4gIGxldCBjb3VudGVyID0gYXJyYXkubGVuZ3RoO1xuICBsZXQgaW5kZXggPSAwO1xuICAvLyBXaGlsZSB0aGVyZSBhcmUgZWxlbWVudHMgaW4gdGhlIGFycmF5XG4gIHdoaWxlIChjb3VudGVyID4gMCkge1xuICAgIC8vIFBpY2sgYSByYW5kb20gaW5kZXhcbiAgICBpbmRleCA9IChNYXRoLnJhbmRvbSgpICogY291bnRlcikgfCAwO1xuICAgIC8vIERlY3JlYXNlIGNvdW50ZXIgYnkgMVxuICAgIGNvdW50ZXItLTtcbiAgICAvLyBBbmQgc3dhcCB0aGUgbGFzdCBlbGVtZW50IG9mIGVhY2ggYXJyYXkgd2l0aCBpdFxuICAgIHN3YXAoYXJyYXksIGNvdW50ZXIsIGluZGV4KTtcbiAgICBzd2FwKGFycmF5MiwgY291bnRlciwgaW5kZXgpO1xuICB9XG59XG5cbi8qKiBDbGFtcHMgYSB2YWx1ZSB0byBhIHNwZWNpZmllZCByYW5nZS4gKi9cbmV4cG9ydCBmdW5jdGlvbiBjbGFtcChtaW46IG51bWJlciwgeDogbnVtYmVyLCBtYXg6IG51bWJlcik6IG51bWJlciB7XG4gIHJldHVybiBNYXRoLm1heChtaW4sIE1hdGgubWluKHgsIG1heCkpO1xufVxuXG5leHBvcnQgZnVuY3Rpb24gbmVhcmVzdExhcmdlckV2ZW4odmFsOiBudW1iZXIpOiBudW1iZXIge1xuICByZXR1cm4gdmFsICUgMiA9PT0gMCA/IHZhbCA6IHZhbCArIDE7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBzd2FwPFQ+KFxuICAgIG9iamVjdDoge1tpbmRleDogbnVtYmVyXTogVH0sIGxlZnQ6IG51bWJlciwgcmlnaHQ6IG51bWJlcikge1xuICBjb25zdCB0ZW1wID0gb2JqZWN0W2xlZnRdO1xuICBvYmplY3RbbGVmdF0gPSBvYmplY3RbcmlnaHRdO1xuICBvYmplY3RbcmlnaHRdID0gdGVtcDtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIHN1bShhcnI6IG51bWJlcltdKTogbnVtYmVyIHtcbiAgbGV0IHN1bSA9IDA7XG4gIGZvciAobGV0IGkgPSAwOyBpIDwgYXJyLmxlbmd0aDsgaSsrKSB7XG4gICAgc3VtICs9IGFycltpXTtcbiAgfVxuICByZXR1cm4gc3VtO1xufVxuXG4vKipcbiAqIFJldHVybnMgYSBzYW1wbGUgZnJvbSBhIHVuaWZvcm0gW2EsIGIpIGRpc3RyaWJ1dGlvbi5cbiAqXG4gKiBAcGFyYW0gYSBUaGUgbWluaW11bSBzdXBwb3J0IChpbmNsdXNpdmUpLlxuICogQHBhcmFtIGIgVGhlIG1heGltdW0gc3VwcG9ydCAoZXhjbHVzaXZlKS5cbiAqIEByZXR1cm4gQSBwc2V1ZG9yYW5kb20gbnVtYmVyIG9uIHRoZSBoYWxmLW9wZW4gaW50ZXJ2YWwgW2EsYikuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiByYW5kVW5pZm9ybShhOiBudW1iZXIsIGI6IG51bWJlcikge1xuICBjb25zdCByID0gTWF0aC5yYW5kb20oKTtcbiAgcmV0dXJuIChiICogcikgKyAoMSAtIHIpICogYTtcbn1cblxuLyoqIFJldHVybnMgdGhlIHNxdWFyZWQgRXVjbGlkZWFuIGRpc3RhbmNlIGJldHdlZW4gdHdvIHZlY3RvcnMuICovXG5leHBvcnQgZnVuY3Rpb24gZGlzdFNxdWFyZWQoYTogRmxhdFZlY3RvciwgYjogRmxhdFZlY3Rvcik6IG51bWJlciB7XG4gIGxldCByZXN1bHQgPSAwO1xuICBmb3IgKGxldCBpID0gMDsgaSA8IGEubGVuZ3RoOyBpKyspIHtcbiAgICBjb25zdCBkaWZmID0gTnVtYmVyKGFbaV0pIC0gTnVtYmVyKGJbaV0pO1xuICAgIHJlc3VsdCArPSBkaWZmICogZGlmZjtcbiAgfVxuICByZXR1cm4gcmVzdWx0O1xufVxuXG4vKipcbiAqIEFzc2VydHMgdGhhdCB0aGUgZXhwcmVzc2lvbiBpcyB0cnVlLiBPdGhlcndpc2UgdGhyb3dzIGFuIGVycm9yIHdpdGggdGhlXG4gKiBwcm92aWRlZCBtZXNzYWdlLlxuICpcbiAqIGBgYGpzXG4gKiBjb25zdCB4ID0gMjtcbiAqIHRmLnV0aWwuYXNzZXJ0KHggPT09IDIsICd4IGlzIG5vdCAyJyk7XG4gKiBgYGBcbiAqXG4gKiBAcGFyYW0gZXhwciBUaGUgZXhwcmVzc2lvbiB0byBhc3NlcnQgKGFzIGEgYm9vbGVhbikuXG4gKiBAcGFyYW0gbXNnIEEgZnVuY3Rpb24gdGhhdCByZXR1cm5zIHRoZSBtZXNzYWdlIHRvIHJlcG9ydCB3aGVuIHRocm93aW5nIGFuXG4gKiAgICAgZXJyb3IuIFdlIHVzZSBhIGZ1bmN0aW9uIGZvciBwZXJmb3JtYW5jZSByZWFzb25zLlxuICpcbiAqIEBkb2Mge2hlYWRpbmc6ICdVdGlsJywgbmFtZXNwYWNlOiAndXRpbCd9XG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBhc3NlcnQoZXhwcjogYm9vbGVhbiwgbXNnOiAoKSA9PiBzdHJpbmcpIHtcbiAgaWYgKCFleHByKSB7XG4gICAgdGhyb3cgbmV3IEVycm9yKHR5cGVvZiBtc2cgPT09ICdzdHJpbmcnID8gbXNnIDogbXNnKCkpO1xuICB9XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBhc3NlcnRTaGFwZXNNYXRjaChcbiAgICBzaGFwZUE6IG51bWJlcltdLCBzaGFwZUI6IG51bWJlcltdLCBlcnJvck1lc3NhZ2VQcmVmaXggPSAnJyk6IHZvaWQge1xuICBhc3NlcnQoXG4gICAgICBhcnJheXNFcXVhbChzaGFwZUEsIHNoYXBlQiksXG4gICAgICAoKSA9PiBlcnJvck1lc3NhZ2VQcmVmaXggKyBgIFNoYXBlcyAke3NoYXBlQX0gYW5kICR7c2hhcGVCfSBtdXN0IG1hdGNoYCk7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBhc3NlcnROb25OdWxsKGE6IFRlbnNvckxpa2UpOiB2b2lkIHtcbiAgYXNzZXJ0KFxuICAgICAgYSAhPSBudWxsLFxuICAgICAgKCkgPT4gYFRoZSBpbnB1dCB0byB0aGUgdGVuc29yIGNvbnN0cnVjdG9yIG11c3QgYmUgYSBub24tbnVsbCB2YWx1ZS5gKTtcbn1cblxuLy8gTk9URTogV2UgZXhwbGljaXRseSB0eXBlIG91dCB3aGF0IFQgZXh0ZW5kcyBpbnN0ZWFkIG9mIGFueSBzbyB0aGF0XG4vLyB1dGlsLmZsYXR0ZW4gb24gYSBuZXN0ZWQgYXJyYXkgb2YgbnVtYmVyIGRvZXNuJ3QgdHJ5IHRvIGluZmVyIFQgYXMgYVxuLy8gbnVtYmVyW11bXSwgY2F1c2luZyB1cyB0byBleHBsaWNpdGx5IHR5cGUgdXRpbC5mbGF0dGVuPG51bWJlcj4oKS5cbi8qKlxuICogIEZsYXR0ZW5zIGFuIGFyYml0cmFyaWx5IG5lc3RlZCBhcnJheS5cbiAqXG4gKiBgYGBqc1xuICogY29uc3QgYSA9IFtbMSwgMl0sIFszLCA0XSwgWzUsIFs2LCBbN11dXV07XG4gKiBjb25zdCBmbGF0ID0gdGYudXRpbC5mbGF0dGVuKGEpO1xuICogY29uc29sZS5sb2coZmxhdCk7XG4gKiBgYGBcbiAqXG4gKiAgQHBhcmFtIGFyciBUaGUgbmVzdGVkIGFycmF5IHRvIGZsYXR0ZW4uXG4gKiAgQHBhcmFtIHJlc3VsdCBUaGUgZGVzdGluYXRpb24gYXJyYXkgd2hpY2ggaG9sZHMgdGhlIGVsZW1lbnRzLlxuICogIEBwYXJhbSBza2lwVHlwZWRBcnJheSBJZiB0cnVlLCBhdm9pZHMgZmxhdHRlbmluZyB0aGUgdHlwZWQgYXJyYXlzLiBEZWZhdWx0c1xuICogICAgICB0byBmYWxzZS5cbiAqXG4gKiBAZG9jIHtoZWFkaW5nOiAnVXRpbCcsIG5hbWVzcGFjZTogJ3V0aWwnfVxuICovXG5leHBvcnQgZnVuY3Rpb25cbmZsYXR0ZW48VCBleHRlbmRzIG51bWJlcnxib29sZWFufHN0cmluZ3xQcm9taXNlPG51bWJlcj58VHlwZWRBcnJheT4oXG4gICAgYXJyOiBUfFJlY3Vyc2l2ZUFycmF5PFQ+LCByZXN1bHQ6IFRbXSA9IFtdLCBza2lwVHlwZWRBcnJheSA9IGZhbHNlKTogVFtdIHtcbiAgaWYgKHJlc3VsdCA9PSBudWxsKSB7XG4gICAgcmVzdWx0ID0gW107XG4gIH1cbiAgaWYgKEFycmF5LmlzQXJyYXkoYXJyKSB8fCBpc1R5cGVkQXJyYXkoYXJyKSAmJiAhc2tpcFR5cGVkQXJyYXkpIHtcbiAgICBmb3IgKGxldCBpID0gMDsgaSA8IGFyci5sZW5ndGg7ICsraSkge1xuICAgICAgZmxhdHRlbihhcnJbaV0sIHJlc3VsdCwgc2tpcFR5cGVkQXJyYXkpO1xuICAgIH1cbiAgfSBlbHNlIHtcbiAgICByZXN1bHQucHVzaChhcnIgYXMgVCk7XG4gIH1cbiAgcmV0dXJuIHJlc3VsdDtcbn1cblxuLyoqXG4gKiBSZXR1cm5zIHRoZSBzaXplIChudW1iZXIgb2YgZWxlbWVudHMpIG9mIHRoZSB0ZW5zb3IgZ2l2ZW4gaXRzIHNoYXBlLlxuICpcbiAqIGBgYGpzXG4gKiBjb25zdCBzaGFwZSA9IFszLCA0LCAyXTtcbiAqIGNvbnN0IHNpemUgPSB0Zi51dGlsLnNpemVGcm9tU2hhcGUoc2hhcGUpO1xuICogY29uc29sZS5sb2coc2l6ZSk7XG4gKiBgYGBcbiAqXG4gKiBAZG9jIHtoZWFkaW5nOiAnVXRpbCcsIG5hbWVzcGFjZTogJ3V0aWwnfVxuICovXG5leHBvcnQgZnVuY3Rpb24gc2l6ZUZyb21TaGFwZShzaGFwZTogbnVtYmVyW10pOiBudW1iZXIge1xuICBpZiAoc2hhcGUubGVuZ3RoID09PSAwKSB7XG4gICAgLy8gU2NhbGFyLlxuICAgIHJldHVybiAxO1xuICB9XG4gIGxldCBzaXplID0gc2hhcGVbMF07XG4gIGZvciAobGV0IGkgPSAxOyBpIDwgc2hhcGUubGVuZ3RoOyBpKyspIHtcbiAgICBzaXplICo9IHNoYXBlW2ldO1xuICB9XG4gIHJldHVybiBzaXplO1xufVxuXG5leHBvcnQgZnVuY3Rpb24gaXNTY2FsYXJTaGFwZShzaGFwZTogbnVtYmVyW10pOiBib29sZWFuIHtcbiAgcmV0dXJuIHNoYXBlLmxlbmd0aCA9PT0gMDtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGFycmF5c0VxdWFsKG4xOiBGbGF0VmVjdG9yLCBuMjogRmxhdFZlY3Rvcikge1xuICBpZiAobjEgPT09IG4yKSB7XG4gICAgcmV0dXJuIHRydWU7XG4gIH1cbiAgaWYgKG4xID09IG51bGwgfHwgbjIgPT0gbnVsbCkge1xuICAgIHJldHVybiBmYWxzZTtcbiAgfVxuXG4gIGlmIChuMS5sZW5ndGggIT09IG4yLmxlbmd0aCkge1xuICAgIHJldHVybiBmYWxzZTtcbiAgfVxuICBmb3IgKGxldCBpID0gMDsgaSA8IG4xLmxlbmd0aDsgaSsrKSB7XG4gICAgaWYgKG4xW2ldICE9PSBuMltpXSkge1xuICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH1cbiAgfVxuICByZXR1cm4gdHJ1ZTtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGlzSW50KGE6IG51bWJlcik6IGJvb2xlYW4ge1xuICByZXR1cm4gYSAlIDEgPT09IDA7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiB0YW5oKHg6IG51bWJlcik6IG51bWJlciB7XG4gIC8vIHRzbGludDpkaXNhYmxlLW5leHQtbGluZTpuby1hbnlcbiAgaWYgKChNYXRoIGFzIGFueSkudGFuaCAhPSBudWxsKSB7XG4gICAgLy8gdHNsaW50OmRpc2FibGUtbmV4dC1saW5lOm5vLWFueVxuICAgIHJldHVybiAoTWF0aCBhcyBhbnkpLnRhbmgoeCk7XG4gIH1cbiAgaWYgKHggPT09IEluZmluaXR5KSB7XG4gICAgcmV0dXJuIDE7XG4gIH0gZWxzZSBpZiAoeCA9PT0gLUluZmluaXR5KSB7XG4gICAgcmV0dXJuIC0xO1xuICB9IGVsc2Uge1xuICAgIGNvbnN0IGUyeCA9IE1hdGguZXhwKDIgKiB4KTtcbiAgICByZXR1cm4gKGUyeCAtIDEpIC8gKGUyeCArIDEpO1xuICB9XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBzaXplVG9TcXVhcmlzaFNoYXBlKHNpemU6IG51bWJlcik6IFtudW1iZXIsIG51bWJlcl0ge1xuICBjb25zdCB3aWR0aCA9IE1hdGguY2VpbChNYXRoLnNxcnQoc2l6ZSkpO1xuICByZXR1cm4gW3dpZHRoLCBNYXRoLmNlaWwoc2l6ZSAvIHdpZHRoKV07XG59XG5cbi8qKlxuICogQ3JlYXRlcyBhIG5ldyBhcnJheSB3aXRoIHJhbmRvbWl6ZWQgaW5kaWNlcyB0byBhIGdpdmVuIHF1YW50aXR5LlxuICpcbiAqIGBgYGpzXG4gKiBjb25zdCByYW5kb21UZW4gPSB0Zi51dGlsLmNyZWF0ZVNodWZmbGVkSW5kaWNlcygxMCk7XG4gKiBjb25zb2xlLmxvZyhyYW5kb21UZW4pO1xuICogYGBgXG4gKlxuICogQHBhcmFtIG51bWJlciBRdWFudGl0eSBvZiBob3cgbWFueSBzaHVmZmxlZCBpbmRpY2VzIHRvIGNyZWF0ZS5cbiAqXG4gKiBAZG9jIHtoZWFkaW5nOiAnVXRpbCcsIG5hbWVzcGFjZTogJ3V0aWwnfVxuICovXG5leHBvcnQgZnVuY3Rpb24gY3JlYXRlU2h1ZmZsZWRJbmRpY2VzKG46IG51bWJlcik6IFVpbnQzMkFycmF5IHtcbiAgY29uc3Qgc2h1ZmZsZWRJbmRpY2VzID0gbmV3IFVpbnQzMkFycmF5KG4pO1xuICBmb3IgKGxldCBpID0gMDsgaSA8IG47ICsraSkge1xuICAgIHNodWZmbGVkSW5kaWNlc1tpXSA9IGk7XG4gIH1cbiAgc2h1ZmZsZShzaHVmZmxlZEluZGljZXMpO1xuICByZXR1cm4gc2h1ZmZsZWRJbmRpY2VzO1xufVxuXG5leHBvcnQgZnVuY3Rpb24gcmlnaHRQYWQoYTogc3RyaW5nLCBzaXplOiBudW1iZXIpOiBzdHJpbmcge1xuICBpZiAoc2l6ZSA8PSBhLmxlbmd0aCkge1xuICAgIHJldHVybiBhO1xuICB9XG4gIHJldHVybiBhICsgJyAnLnJlcGVhdChzaXplIC0gYS5sZW5ndGgpO1xufVxuXG5leHBvcnQgZnVuY3Rpb24gcmVwZWF0ZWRUcnkoXG4gICAgY2hlY2tGbjogKCkgPT4gYm9vbGVhbiwgZGVsYXlGbiA9IChjb3VudGVyOiBudW1iZXIpID0+IDAsXG4gICAgbWF4Q291bnRlcj86IG51bWJlcixcbiAgICBzY2hlZHVsZUZuOiAoZnVuY3Rpb25SZWY6IEZ1bmN0aW9uLCBkZWxheTogbnVtYmVyKSA9PiB2b2lkID1cbiAgICAgICAgc2V0VGltZW91dCk6IFByb21pc2U8dm9pZD4ge1xuICByZXR1cm4gbmV3IFByb21pc2U8dm9pZD4oKHJlc29sdmUsIHJlamVjdCkgPT4ge1xuICAgIGxldCB0cnlDb3VudCA9IDA7XG5cbiAgICBjb25zdCB0cnlGbiA9ICgpID0+IHtcbiAgICAgIGlmIChjaGVja0ZuKCkpIHtcbiAgICAgICAgcmVzb2x2ZSgpO1xuICAgICAgICByZXR1cm47XG4gICAgICB9XG5cbiAgICAgIHRyeUNvdW50Kys7XG5cbiAgICAgIGNvbnN0IG5leHRCYWNrb2ZmID0gZGVsYXlGbih0cnlDb3VudCk7XG5cbiAgICAgIGlmIChtYXhDb3VudGVyICE9IG51bGwgJiYgdHJ5Q291bnQgPj0gbWF4Q291bnRlcikge1xuICAgICAgICByZWplY3QoKTtcbiAgICAgICAgcmV0dXJuO1xuICAgICAgfVxuICAgICAgc2NoZWR1bGVGbih0cnlGbiwgbmV4dEJhY2tvZmYpO1xuICAgIH07XG5cbiAgICB0cnlGbigpO1xuICB9KTtcbn1cblxuLyoqXG4gKiBHaXZlbiB0aGUgZnVsbCBzaXplIG9mIHRoZSBhcnJheSBhbmQgYSBzaGFwZSB0aGF0IG1heSBjb250YWluIC0xIGFzIHRoZVxuICogaW1wbGljaXQgZGltZW5zaW9uLCByZXR1cm5zIHRoZSBpbmZlcnJlZCBzaGFwZSB3aGVyZSAtMSBpcyByZXBsYWNlZC5cbiAqIEUuZy4gRm9yIHNoYXBlPVsyLCAtMSwgM10gYW5kIHNpemU9MjQsIGl0IHdpbGwgcmV0dXJuIFsyLCA0LCAzXS5cbiAqXG4gKiBAcGFyYW0gc2hhcGUgVGhlIHNoYXBlLCB3aGljaCBtYXkgY29udGFpbiAtMSBpbiBzb21lIGRpbWVuc2lvbi5cbiAqIEBwYXJhbSBzaXplIFRoZSBmdWxsIHNpemUgKG51bWJlciBvZiBlbGVtZW50cykgb2YgdGhlIGFycmF5LlxuICogQHJldHVybiBUaGUgaW5mZXJyZWQgc2hhcGUgd2hlcmUgLTEgaXMgcmVwbGFjZWQgd2l0aCB0aGUgaW5mZXJyZWQgc2l6ZS5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGluZmVyRnJvbUltcGxpY2l0U2hhcGUoXG4gICAgc2hhcGU6IG51bWJlcltdLCBzaXplOiBudW1iZXIpOiBudW1iZXJbXSB7XG4gIGxldCBzaGFwZVByb2QgPSAxO1xuICBsZXQgaW1wbGljaXRJZHggPSAtMTtcblxuICBmb3IgKGxldCBpID0gMDsgaSA8IHNoYXBlLmxlbmd0aDsgKytpKSB7XG4gICAgaWYgKHNoYXBlW2ldID49IDApIHtcbiAgICAgIHNoYXBlUHJvZCAqPSBzaGFwZVtpXTtcbiAgICB9IGVsc2UgaWYgKHNoYXBlW2ldID09PSAtMSkge1xuICAgICAgaWYgKGltcGxpY2l0SWR4ICE9PSAtMSkge1xuICAgICAgICB0aHJvdyBFcnJvcihcbiAgICAgICAgICAgIGBTaGFwZXMgY2FuIG9ubHkgaGF2ZSAxIGltcGxpY2l0IHNpemUuIGAgK1xuICAgICAgICAgICAgYEZvdW5kIC0xIGF0IGRpbSAke2ltcGxpY2l0SWR4fSBhbmQgZGltICR7aX1gKTtcbiAgICAgIH1cbiAgICAgIGltcGxpY2l0SWR4ID0gaTtcbiAgICB9IGVsc2UgaWYgKHNoYXBlW2ldIDwgMCkge1xuICAgICAgdGhyb3cgRXJyb3IoYFNoYXBlcyBjYW4gbm90IGJlIDwgMC4gRm91bmQgJHtzaGFwZVtpXX0gYXQgZGltICR7aX1gKTtcbiAgICB9XG4gIH1cblxuICBpZiAoaW1wbGljaXRJZHggPT09IC0xKSB7XG4gICAgaWYgKHNpemUgPiAwICYmIHNpemUgIT09IHNoYXBlUHJvZCkge1xuICAgICAgdGhyb3cgRXJyb3IoYFNpemUoJHtzaXplfSkgbXVzdCBtYXRjaCB0aGUgcHJvZHVjdCBvZiBzaGFwZSAke3NoYXBlfWApO1xuICAgIH1cbiAgICByZXR1cm4gc2hhcGU7XG4gIH1cblxuICBpZiAoc2hhcGVQcm9kID09PSAwKSB7XG4gICAgdGhyb3cgRXJyb3IoXG4gICAgICAgIGBDYW5ub3QgaW5mZXIgdGhlIG1pc3Npbmcgc2l6ZSBpbiBbJHtzaGFwZX1dIHdoZW4gYCArXG4gICAgICAgIGB0aGVyZSBhcmUgMCBlbGVtZW50c2ApO1xuICB9XG4gIGlmIChzaXplICUgc2hhcGVQcm9kICE9PSAwKSB7XG4gICAgdGhyb3cgRXJyb3IoXG4gICAgICAgIGBUaGUgaW1wbGljaXQgc2hhcGUgY2FuJ3QgYmUgYSBmcmFjdGlvbmFsIG51bWJlci4gYCArXG4gICAgICAgIGBHb3QgJHtzaXplfSAvICR7c2hhcGVQcm9kfWApO1xuICB9XG5cbiAgY29uc3QgbmV3U2hhcGUgPSBzaGFwZS5zbGljZSgpO1xuICBuZXdTaGFwZVtpbXBsaWNpdElkeF0gPSBzaXplIC8gc2hhcGVQcm9kO1xuICByZXR1cm4gbmV3U2hhcGU7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBwYXJzZUF4aXNQYXJhbShcbiAgICBheGlzOiBudW1iZXJ8bnVtYmVyW10sIHNoYXBlOiBudW1iZXJbXSk6IG51bWJlcltdIHtcbiAgY29uc3QgcmFuayA9IHNoYXBlLmxlbmd0aDtcblxuICAvLyBOb3JtYWxpemUgaW5wdXRcbiAgYXhpcyA9IGF4aXMgPT0gbnVsbCA/IHNoYXBlLm1hcCgocywgaSkgPT4gaSkgOiBbXS5jb25jYXQoYXhpcyk7XG5cbiAgLy8gQ2hlY2sgZm9yIHZhbGlkIHJhbmdlXG4gIGFzc2VydChcbiAgICAgIGF4aXMuZXZlcnkoYXggPT4gYXggPj0gLXJhbmsgJiYgYXggPCByYW5rKSxcbiAgICAgICgpID0+XG4gICAgICAgICAgYEFsbCB2YWx1ZXMgaW4gYXhpcyBwYXJhbSBtdXN0IGJlIGluIHJhbmdlIFstJHtyYW5rfSwgJHtyYW5rfSkgYnV0IGAgK1xuICAgICAgICAgIGBnb3QgYXhpcyAke2F4aXN9YCk7XG5cbiAgLy8gQ2hlY2sgZm9yIG9ubHkgaW50ZWdlcnNcbiAgYXNzZXJ0KFxuICAgICAgYXhpcy5ldmVyeShheCA9PiBpc0ludChheCkpLFxuICAgICAgKCkgPT4gYEFsbCB2YWx1ZXMgaW4gYXhpcyBwYXJhbSBtdXN0IGJlIGludGVnZXJzIGJ1dCBgICtcbiAgICAgICAgICBgZ290IGF4aXMgJHtheGlzfWApO1xuXG4gIC8vIEhhbmRsZSBuZWdhdGl2ZSBheGlzLlxuICByZXR1cm4gYXhpcy5tYXAoYSA9PiBhIDwgMCA/IHJhbmsgKyBhIDogYSk7XG59XG5cbi8qKiBSZWR1Y2VzIHRoZSBzaGFwZSBieSByZW1vdmluZyBhbGwgZGltZW5zaW9ucyBvZiBzaGFwZSAxLiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHNxdWVlemVTaGFwZShzaGFwZTogbnVtYmVyW10sIGF4aXM/OiBudW1iZXJbXSk6XG4gICAge25ld1NoYXBlOiBudW1iZXJbXSwga2VwdERpbXM6IG51bWJlcltdfSB7XG4gIGNvbnN0IG5ld1NoYXBlOiBudW1iZXJbXSA9IFtdO1xuICBjb25zdCBrZXB0RGltczogbnVtYmVyW10gPSBbXTtcbiAgY29uc3QgaXNFbXB0eUFycmF5ID0gYXhpcyAhPSBudWxsICYmIEFycmF5LmlzQXJyYXkoYXhpcykgJiYgYXhpcy5sZW5ndGggPT09IDA7XG4gIGNvbnN0IGF4ZXMgPSAoYXhpcyA9PSBudWxsIHx8IGlzRW1wdHlBcnJheSkgP1xuICAgICAgbnVsbCA6XG4gICAgICBwYXJzZUF4aXNQYXJhbShheGlzLCBzaGFwZSkuc29ydCgpO1xuICBsZXQgaiA9IDA7XG4gIGZvciAobGV0IGkgPSAwOyBpIDwgc2hhcGUubGVuZ3RoOyArK2kpIHtcbiAgICBpZiAoYXhlcyAhPSBudWxsKSB7XG4gICAgICBpZiAoYXhlc1tqXSA9PT0gaSAmJiBzaGFwZVtpXSAhPT0gMSkge1xuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoXG4gICAgICAgICAgICBgQ2FuJ3Qgc3F1ZWV6ZSBheGlzICR7aX0gc2luY2UgaXRzIGRpbSAnJHtzaGFwZVtpXX0nIGlzIG5vdCAxYCk7XG4gICAgICB9XG4gICAgICBpZiAoKGF4ZXNbal0gPT0gbnVsbCB8fCBheGVzW2pdID4gaSkgJiYgc2hhcGVbaV0gPT09IDEpIHtcbiAgICAgICAgbmV3U2hhcGUucHVzaChzaGFwZVtpXSk7XG4gICAgICAgIGtlcHREaW1zLnB1c2goaSk7XG4gICAgICB9XG4gICAgICBpZiAoYXhlc1tqXSA8PSBpKSB7XG4gICAgICAgIGorKztcbiAgICAgIH1cbiAgICB9XG4gICAgaWYgKHNoYXBlW2ldICE9PSAxKSB7XG4gICAgICBuZXdTaGFwZS5wdXNoKHNoYXBlW2ldKTtcbiAgICAgIGtlcHREaW1zLnB1c2goaSk7XG4gICAgfVxuICB9XG4gIHJldHVybiB7bmV3U2hhcGUsIGtlcHREaW1zfTtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGdldFR5cGVkQXJyYXlGcm9tRFR5cGU8RCBleHRlbmRzIE51bWVyaWNEYXRhVHlwZT4oXG4gICAgZHR5cGU6IEQsIHNpemU6IG51bWJlcik6IERhdGFUeXBlTWFwW0RdIHtcbiAgbGV0IHZhbHVlcyA9IG51bGw7XG4gIGlmIChkdHlwZSA9PSBudWxsIHx8IGR0eXBlID09PSAnZmxvYXQzMicpIHtcbiAgICB2YWx1ZXMgPSBuZXcgRmxvYXQzMkFycmF5KHNpemUpO1xuICB9IGVsc2UgaWYgKGR0eXBlID09PSAnaW50MzInKSB7XG4gICAgdmFsdWVzID0gbmV3IEludDMyQXJyYXkoc2l6ZSk7XG4gIH0gZWxzZSBpZiAoZHR5cGUgPT09ICdib29sJykge1xuICAgIHZhbHVlcyA9IG5ldyBVaW50OEFycmF5KHNpemUpO1xuICB9IGVsc2Uge1xuICAgIHRocm93IG5ldyBFcnJvcihgVW5rbm93biBkYXRhIHR5cGUgJHtkdHlwZX1gKTtcbiAgfVxuICByZXR1cm4gdmFsdWVzIGFzIERhdGFUeXBlTWFwW0RdO1xufVxuXG5leHBvcnQgZnVuY3Rpb24gZ2V0QXJyYXlGcm9tRFR5cGU8RCBleHRlbmRzIERhdGFUeXBlPihcbiAgICBkdHlwZTogRCwgc2l6ZTogbnVtYmVyKTogRGF0YVR5cGVNYXBbRF0ge1xuICBsZXQgdmFsdWVzID0gbnVsbDtcbiAgaWYgKGR0eXBlID09IG51bGwgfHwgZHR5cGUgPT09ICdmbG9hdDMyJykge1xuICAgIHZhbHVlcyA9IG5ldyBGbG9hdDMyQXJyYXkoc2l6ZSk7XG4gIH0gZWxzZSBpZiAoZHR5cGUgPT09ICdpbnQzMicpIHtcbiAgICB2YWx1ZXMgPSBuZXcgSW50MzJBcnJheShzaXplKTtcbiAgfSBlbHNlIGlmIChkdHlwZSA9PT0gJ2Jvb2wnKSB7XG4gICAgdmFsdWVzID0gbmV3IFVpbnQ4QXJyYXkoc2l6ZSk7XG4gIH0gZWxzZSBpZiAoZHR5cGUgPT09ICdzdHJpbmcnKSB7XG4gICAgdmFsdWVzID0gbmV3IEFycmF5PCdzdHJpbmcnPihzaXplKTtcbiAgfSBlbHNlIHtcbiAgICB0aHJvdyBuZXcgRXJyb3IoYFVua25vd24gZGF0YSB0eXBlICR7ZHR5cGV9YCk7XG4gIH1cbiAgcmV0dXJuIHZhbHVlcyBhcyBEYXRhVHlwZU1hcFtEXTtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGNoZWNrQ29udmVyc2lvbkZvckVycm9yczxEIGV4dGVuZHMgRGF0YVR5cGU+KFxuICAgIHZhbHM6IERhdGFUeXBlTWFwW0RdfG51bWJlcltdLCBkdHlwZTogRCk6IHZvaWQge1xuICBmb3IgKGxldCBpID0gMDsgaSA8IHZhbHMubGVuZ3RoOyBpKyspIHtcbiAgICBjb25zdCBudW0gPSB2YWxzW2ldIGFzIG51bWJlcjtcbiAgICBpZiAoaXNOYU4obnVtKSB8fCAhaXNGaW5pdGUobnVtKSkge1xuICAgICAgdGhyb3cgRXJyb3IoYEEgdGVuc29yIG9mIHR5cGUgJHtkdHlwZX0gYmVpbmcgdXBsb2FkZWQgY29udGFpbnMgJHtudW19LmApO1xuICAgIH1cbiAgfVxufVxuXG4vKiogUmV0dXJucyB0cnVlIGlmIHRoZSBkdHlwZSBpcyB2YWxpZC4gKi9cbmV4cG9ydCBmdW5jdGlvbiBpc1ZhbGlkRHR5cGUoZHR5cGU6IERhdGFUeXBlKTogYm9vbGVhbiB7XG4gIHJldHVybiBkdHlwZSA9PT0gJ2Jvb2wnIHx8IGR0eXBlID09PSAnY29tcGxleDY0JyB8fCBkdHlwZSA9PT0gJ2Zsb2F0MzInIHx8XG4gICAgICBkdHlwZSA9PT0gJ2ludDMyJyB8fCBkdHlwZSA9PT0gJ3N0cmluZyc7XG59XG5cbi8qKlxuICogUmV0dXJucyB0cnVlIGlmIHRoZSBuZXcgdHlwZSBjYW4ndCBlbmNvZGUgdGhlIG9sZCB0eXBlIHdpdGhvdXQgbG9zcyBvZlxuICogcHJlY2lzaW9uLlxuICovXG5leHBvcnQgZnVuY3Rpb24gaGFzRW5jb2RpbmdMb3NzKG9sZFR5cGU6IERhdGFUeXBlLCBuZXdUeXBlOiBEYXRhVHlwZSk6IGJvb2xlYW4ge1xuICBpZiAobmV3VHlwZSA9PT0gJ2NvbXBsZXg2NCcpIHtcbiAgICByZXR1cm4gZmFsc2U7XG4gIH1cbiAgaWYgKG5ld1R5cGUgPT09ICdmbG9hdDMyJyAmJiBvbGRUeXBlICE9PSAnY29tcGxleDY0Jykge1xuICAgIHJldHVybiBmYWxzZTtcbiAgfVxuICBpZiAobmV3VHlwZSA9PT0gJ2ludDMyJyAmJiBvbGRUeXBlICE9PSAnZmxvYXQzMicgJiYgb2xkVHlwZSAhPT0gJ2NvbXBsZXg2NCcpIHtcbiAgICByZXR1cm4gZmFsc2U7XG4gIH1cbiAgaWYgKG5ld1R5cGUgPT09ICdib29sJyAmJiBvbGRUeXBlID09PSAnYm9vbCcpIHtcbiAgICByZXR1cm4gZmFsc2U7XG4gIH1cbiAgcmV0dXJuIHRydWU7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBpc1R5cGVkQXJyYXkoYToge30pOiBhIGlzIEZsb2F0MzJBcnJheXxJbnQzMkFycmF5fFVpbnQ4QXJyYXl8XG4gICAgVWludDhDbGFtcGVkQXJyYXkge1xuICByZXR1cm4gYSBpbnN0YW5jZW9mIEZsb2F0MzJBcnJheSB8fCBhIGluc3RhbmNlb2YgSW50MzJBcnJheSB8fFxuICAgICAgYSBpbnN0YW5jZW9mIFVpbnQ4QXJyYXkgfHwgYSBpbnN0YW5jZW9mIFVpbnQ4Q2xhbXBlZEFycmF5O1xufVxuXG5leHBvcnQgZnVuY3Rpb24gYnl0ZXNQZXJFbGVtZW50KGR0eXBlOiBEYXRhVHlwZSk6IG51bWJlciB7XG4gIGlmIChkdHlwZSA9PT0gJ2Zsb2F0MzInIHx8IGR0eXBlID09PSAnaW50MzInKSB7XG4gICAgcmV0dXJuIDQ7XG4gIH0gZWxzZSBpZiAoZHR5cGUgPT09ICdjb21wbGV4NjQnKSB7XG4gICAgcmV0dXJuIDg7XG4gIH0gZWxzZSBpZiAoZHR5cGUgPT09ICdib29sJykge1xuICAgIHJldHVybiAxO1xuICB9IGVsc2Uge1xuICAgIHRocm93IG5ldyBFcnJvcihgVW5rbm93biBkdHlwZSAke2R0eXBlfWApO1xuICB9XG59XG5cbi8qKlxuICogUmV0dXJucyB0aGUgYXBwcm94aW1hdGUgbnVtYmVyIG9mIGJ5dGVzIGFsbG9jYXRlZCBpbiB0aGUgc3RyaW5nIGFycmF5IC0gMlxuICogYnl0ZXMgcGVyIGNoYXJhY3Rlci4gQ29tcHV0aW5nIHRoZSBleGFjdCBieXRlcyBmb3IgYSBuYXRpdmUgc3RyaW5nIGluIEpTXG4gKiBpcyBub3QgcG9zc2libGUgc2luY2UgaXQgZGVwZW5kcyBvbiB0aGUgZW5jb2Rpbmcgb2YgdGhlIGh0bWwgcGFnZSB0aGF0XG4gKiBzZXJ2ZXMgdGhlIHdlYnNpdGUuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBieXRlc0Zyb21TdHJpbmdBcnJheShhcnI6IFVpbnQ4QXJyYXlbXSk6IG51bWJlciB7XG4gIGlmIChhcnIgPT0gbnVsbCkge1xuICAgIHJldHVybiAwO1xuICB9XG4gIGxldCBieXRlcyA9IDA7XG4gIGFyci5mb3JFYWNoKHggPT4gYnl0ZXMgKz0geC5sZW5ndGgpO1xuICByZXR1cm4gYnl0ZXM7XG59XG5cbi8qKiBSZXR1cm5zIHRydWUgaWYgdGhlIHZhbHVlIGlzIGEgc3RyaW5nLiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGlzU3RyaW5nKHZhbHVlOiB7fSk6IHZhbHVlIGlzIHN0cmluZyB7XG4gIHJldHVybiB0eXBlb2YgdmFsdWUgPT09ICdzdHJpbmcnIHx8IHZhbHVlIGluc3RhbmNlb2YgU3RyaW5nO1xufVxuXG5leHBvcnQgZnVuY3Rpb24gaXNCb29sZWFuKHZhbHVlOiB7fSk6IGJvb2xlYW4ge1xuICByZXR1cm4gdHlwZW9mIHZhbHVlID09PSAnYm9vbGVhbic7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBpc051bWJlcih2YWx1ZToge30pOiBib29sZWFuIHtcbiAgcmV0dXJuIHR5cGVvZiB2YWx1ZSA9PT0gJ251bWJlcic7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBpbmZlckR0eXBlKHZhbHVlczogVGVuc29yTGlrZSk6IERhdGFUeXBlIHtcbiAgaWYgKEFycmF5LmlzQXJyYXkodmFsdWVzKSkge1xuICAgIHJldHVybiBpbmZlckR0eXBlKHZhbHVlc1swXSk7XG4gIH1cbiAgaWYgKHZhbHVlcyBpbnN0YW5jZW9mIEZsb2F0MzJBcnJheSkge1xuICAgIHJldHVybiAnZmxvYXQzMic7XG4gIH0gZWxzZSBpZiAoXG4gICAgICB2YWx1ZXMgaW5zdGFuY2VvZiBJbnQzMkFycmF5IHx8IHZhbHVlcyBpbnN0YW5jZW9mIFVpbnQ4QXJyYXkgfHxcbiAgICAgIHZhbHVlcyBpbnN0YW5jZW9mIFVpbnQ4Q2xhbXBlZEFycmF5KSB7XG4gICAgcmV0dXJuICdpbnQzMic7XG4gIH0gZWxzZSBpZiAoaXNOdW1iZXIodmFsdWVzKSkge1xuICAgIHJldHVybiAnZmxvYXQzMic7XG4gIH0gZWxzZSBpZiAoaXNTdHJpbmcodmFsdWVzKSkge1xuICAgIHJldHVybiAnc3RyaW5nJztcbiAgfSBlbHNlIGlmIChpc0Jvb2xlYW4odmFsdWVzKSkge1xuICAgIHJldHVybiAnYm9vbCc7XG4gIH1cbiAgcmV0dXJuICdmbG9hdDMyJztcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGlzRnVuY3Rpb24oZjogRnVuY3Rpb24pIHtcbiAgcmV0dXJuICEhKGYgJiYgZi5jb25zdHJ1Y3RvciAmJiBmLmNhbGwgJiYgZi5hcHBseSk7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBuZWFyZXN0RGl2aXNvcihzaXplOiBudW1iZXIsIHN0YXJ0OiBudW1iZXIpOiBudW1iZXIge1xuICBmb3IgKGxldCBpID0gc3RhcnQ7IGkgPCBzaXplOyArK2kpIHtcbiAgICBpZiAoc2l6ZSAlIGkgPT09IDApIHtcbiAgICAgIHJldHVybiBpO1xuICAgIH1cbiAgfVxuICByZXR1cm4gc2l6ZTtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGNvbXB1dGVTdHJpZGVzKHNoYXBlOiBudW1iZXJbXSk6IG51bWJlcltdIHtcbiAgY29uc3QgcmFuayA9IHNoYXBlLmxlbmd0aDtcbiAgaWYgKHJhbmsgPCAyKSB7XG4gICAgcmV0dXJuIFtdO1xuICB9XG5cbiAgLy8gTGFzdCBkaW1lbnNpb24gaGFzIGltcGxpY2l0IHN0cmlkZSBvZiAxLCB0aHVzIGhhdmluZyBELTEgKGluc3RlYWQgb2YgRClcbiAgLy8gc3RyaWRlcy5cbiAgY29uc3Qgc3RyaWRlcyA9IG5ldyBBcnJheShyYW5rIC0gMSk7XG4gIHN0cmlkZXNbcmFuayAtIDJdID0gc2hhcGVbcmFuayAtIDFdO1xuICBmb3IgKGxldCBpID0gcmFuayAtIDM7IGkgPj0gMDsgLS1pKSB7XG4gICAgc3RyaWRlc1tpXSA9IHN0cmlkZXNbaSArIDFdICogc2hhcGVbaSArIDFdO1xuICB9XG4gIHJldHVybiBzdHJpZGVzO1xufVxuXG5mdW5jdGlvbiBjcmVhdGVOZXN0ZWRBcnJheShcbiAgICBvZmZzZXQ6IG51bWJlciwgc2hhcGU6IG51bWJlcltdLCBhOiBUeXBlZEFycmF5LCBpc0NvbXBsZXggPSBmYWxzZSkge1xuICBjb25zdCByZXQgPSBuZXcgQXJyYXkoKTtcbiAgaWYgKHNoYXBlLmxlbmd0aCA9PT0gMSkge1xuICAgIGNvbnN0IGQgPSBzaGFwZVswXSAqIChpc0NvbXBsZXggPyAyIDogMSk7XG4gICAgZm9yIChsZXQgaSA9IDA7IGkgPCBkOyBpKyspIHtcbiAgICAgIHJldFtpXSA9IGFbb2Zmc2V0ICsgaV07XG4gICAgfVxuICB9IGVsc2Uge1xuICAgIGNvbnN0IGQgPSBzaGFwZVswXTtcbiAgICBjb25zdCByZXN0ID0gc2hhcGUuc2xpY2UoMSk7XG4gICAgY29uc3QgbGVuID0gcmVzdC5yZWR1Y2UoKGFjYywgYykgPT4gYWNjICogYykgKiAoaXNDb21wbGV4ID8gMiA6IDEpO1xuICAgIGZvciAobGV0IGkgPSAwOyBpIDwgZDsgaSsrKSB7XG4gICAgICByZXRbaV0gPSBjcmVhdGVOZXN0ZWRBcnJheShvZmZzZXQgKyBpICogbGVuLCByZXN0LCBhLCBpc0NvbXBsZXgpO1xuICAgIH1cbiAgfVxuICByZXR1cm4gcmV0O1xufVxuXG4vLyBQcm92aWRlIGEgbmVzdGVkIGFycmF5IG9mIFR5cGVkQXJyYXkgaW4gZ2l2ZW4gc2hhcGUuXG5leHBvcnQgZnVuY3Rpb24gdG9OZXN0ZWRBcnJheShcbiAgICBzaGFwZTogbnVtYmVyW10sIGE6IFR5cGVkQXJyYXksIGlzQ29tcGxleCA9IGZhbHNlKSB7XG4gIGlmIChzaGFwZS5sZW5ndGggPT09IDApIHtcbiAgICAvLyBTY2FsYXIgdHlwZSBzaG91bGQgcmV0dXJuIGEgc2luZ2xlIG51bWJlci5cbiAgICByZXR1cm4gYVswXTtcbiAgfVxuICBjb25zdCBzaXplID0gc2hhcGUucmVkdWNlKChhY2MsIGMpID0+IGFjYyAqIGMpICogKGlzQ29tcGxleCA/IDIgOiAxKTtcbiAgaWYgKHNpemUgPT09IDApIHtcbiAgICAvLyBBIHRlbnNvciB3aXRoIHNoYXBlIHplcm8gc2hvdWxkIGJlIHR1cm5lZCBpbnRvIGVtcHR5IGxpc3QuXG4gICAgcmV0dXJuIFtdO1xuICB9XG4gIGlmIChzaXplICE9PSBhLmxlbmd0aCkge1xuICAgIHRocm93IG5ldyBFcnJvcihgWyR7c2hhcGV9XSBkb2VzIG5vdCBtYXRjaCB0aGUgaW5wdXQgc2l6ZSAke2EubGVuZ3RofSR7XG4gICAgICAgIGlzQ29tcGxleCA/ICcgZm9yIGEgY29tcGxleCB0ZW5zb3InIDogJyd9LmApO1xuICB9XG5cbiAgcmV0dXJuIGNyZWF0ZU5lc3RlZEFycmF5KDAsIHNoYXBlLCBhLCBpc0NvbXBsZXgpO1xufVxuXG5leHBvcnQgZnVuY3Rpb24gbWFrZU9uZXNUeXBlZEFycmF5PEQgZXh0ZW5kcyBEYXRhVHlwZT4oXG4gICAgc2l6ZTogbnVtYmVyLCBkdHlwZTogRCk6IERhdGFUeXBlTWFwW0RdIHtcbiAgY29uc3QgYXJyYXkgPSBtYWtlWmVyb3NUeXBlZEFycmF5KHNpemUsIGR0eXBlKTtcbiAgZm9yIChsZXQgaSA9IDA7IGkgPCBhcnJheS5sZW5ndGg7IGkrKykge1xuICAgIGFycmF5W2ldID0gMTtcbiAgfVxuICByZXR1cm4gYXJyYXk7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBtYWtlWmVyb3NUeXBlZEFycmF5PEQgZXh0ZW5kcyBEYXRhVHlwZT4oXG4gICAgc2l6ZTogbnVtYmVyLCBkdHlwZTogRCk6IERhdGFUeXBlTWFwW0RdIHtcbiAgaWYgKGR0eXBlID09IG51bGwgfHwgZHR5cGUgPT09ICdmbG9hdDMyJyB8fCBkdHlwZSA9PT0gJ2NvbXBsZXg2NCcpIHtcbiAgICByZXR1cm4gbmV3IEZsb2F0MzJBcnJheShzaXplKSBhcyBEYXRhVHlwZU1hcFtEXTtcbiAgfSBlbHNlIGlmIChkdHlwZSA9PT0gJ2ludDMyJykge1xuICAgIHJldHVybiBuZXcgSW50MzJBcnJheShzaXplKSBhcyBEYXRhVHlwZU1hcFtEXTtcbiAgfSBlbHNlIGlmIChkdHlwZSA9PT0gJ2Jvb2wnKSB7XG4gICAgcmV0dXJuIG5ldyBVaW50OEFycmF5KHNpemUpIGFzIERhdGFUeXBlTWFwW0RdO1xuICB9IGVsc2Uge1xuICAgIHRocm93IG5ldyBFcnJvcihgVW5rbm93biBkYXRhIHR5cGUgJHtkdHlwZX1gKTtcbiAgfVxufVxuXG4vKipcbiAqIE1ha2UgbmVzdGVkIGBUeXBlZEFycmF5YCBmaWxsZWQgd2l0aCB6ZXJvcy5cbiAqIEBwYXJhbSBzaGFwZSBUaGUgc2hhcGUgaW5mb3JtYXRpb24gZm9yIHRoZSBuZXN0ZWQgYXJyYXkuXG4gKiBAcGFyYW0gZHR5cGUgZHR5cGUgb2YgdGhlIGFycmF5IGVsZW1lbnQuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBtYWtlWmVyb3NOZXN0ZWRUeXBlZEFycmF5PEQgZXh0ZW5kcyBEYXRhVHlwZT4oXG4gICAgc2hhcGU6IG51bWJlcltdLCBkdHlwZTogRCkge1xuICBjb25zdCBzaXplID0gc2hhcGUucmVkdWNlKChwcmV2LCBjdXJyKSA9PiBwcmV2ICogY3VyciwgMSk7XG4gIGlmIChkdHlwZSA9PSBudWxsIHx8IGR0eXBlID09PSAnZmxvYXQzMicpIHtcbiAgICByZXR1cm4gdG9OZXN0ZWRBcnJheShzaGFwZSwgbmV3IEZsb2F0MzJBcnJheShzaXplKSk7XG4gIH0gZWxzZSBpZiAoZHR5cGUgPT09ICdpbnQzMicpIHtcbiAgICByZXR1cm4gdG9OZXN0ZWRBcnJheShzaGFwZSwgbmV3IEludDMyQXJyYXkoc2l6ZSkpO1xuICB9IGVsc2UgaWYgKGR0eXBlID09PSAnYm9vbCcpIHtcbiAgICByZXR1cm4gdG9OZXN0ZWRBcnJheShzaGFwZSwgbmV3IFVpbnQ4QXJyYXkoc2l6ZSkpO1xuICB9IGVsc2Uge1xuICAgIHRocm93IG5ldyBFcnJvcihgVW5rbm93biBkYXRhIHR5cGUgJHtkdHlwZX1gKTtcbiAgfVxufVxuXG5leHBvcnQgZnVuY3Rpb24gYXNzZXJ0Tm9uTmVnYXRpdmVJbnRlZ2VyRGltZW5zaW9ucyhzaGFwZTogbnVtYmVyW10pIHtcbiAgc2hhcGUuZm9yRWFjaChkaW1TaXplID0+IHtcbiAgICBhc3NlcnQoXG4gICAgICAgIE51bWJlci5pc0ludGVnZXIoZGltU2l6ZSkgJiYgZGltU2l6ZSA+PSAwLFxuICAgICAgICAoKSA9PlxuICAgICAgICAgICAgYFRlbnNvciBtdXN0IGhhdmUgYSBzaGFwZSBjb21wcmlzZWQgb2YgcG9zaXRpdmUgaW50ZWdlcnMgYnV0IGdvdCBgICtcbiAgICAgICAgICAgIGBzaGFwZSBbJHtzaGFwZX1dLmApO1xuICB9KTtcbn1cblxuLyoqXG4gKiBDb21wdXRlcyBmbGF0IGluZGV4IGZvciBhIGdpdmVuIGxvY2F0aW9uIChtdWx0aWRpbWVudGlvbnNhbCBpbmRleCkgaW4gYVxuICogVGVuc29yL211bHRpZGltZW5zaW9uYWwgYXJyYXkuXG4gKlxuICogQHBhcmFtIGxvY3MgTG9jYXRpb24gaW4gdGhlIHRlbnNvci5cbiAqIEBwYXJhbSByYW5rIFJhbmsgb2YgdGhlIHRlbnNvci5cbiAqIEBwYXJhbSBzdHJpZGVzIFRlbnNvciBzdHJpZGVzLlxuICovXG5leHBvcnQgZnVuY3Rpb24gbG9jVG9JbmRleChcbiAgICBsb2NzOiBudW1iZXJbXSwgcmFuazogbnVtYmVyLCBzdHJpZGVzOiBudW1iZXJbXSk6IG51bWJlciB7XG4gIGlmIChyYW5rID09PSAwKSB7XG4gICAgcmV0dXJuIDA7XG4gIH0gZWxzZSBpZiAocmFuayA9PT0gMSkge1xuICAgIHJldHVybiBsb2NzWzBdO1xuICB9XG4gIGxldCBpbmRleCA9IGxvY3NbbG9jcy5sZW5ndGggLSAxXTtcbiAgZm9yIChsZXQgaSA9IDA7IGkgPCBsb2NzLmxlbmd0aCAtIDE7ICsraSkge1xuICAgIGluZGV4ICs9IHN0cmlkZXNbaV0gKiBsb2NzW2ldO1xuICB9XG4gIHJldHVybiBpbmRleDtcbn1cblxuLyoqXG4gKiBDb21wdXRlcyB0aGUgbG9jYXRpb24gKG11bHRpZGltZW5zaW9uYWwgaW5kZXgpIGluIGFcbiAqIHRlbnNvci9tdWx0aWRpbWVudGlvbmFsIGFycmF5IGZvciBhIGdpdmVuIGZsYXQgaW5kZXguXG4gKlxuICogQHBhcmFtIGluZGV4IEluZGV4IGluIGZsYXQgYXJyYXkuXG4gKiBAcGFyYW0gcmFuayBSYW5rIG9mIHRlbnNvci5cbiAqIEBwYXJhbSBzdHJpZGVzIFN0cmlkZXMgb2YgdGVuc29yLlxuICovXG5leHBvcnQgZnVuY3Rpb24gaW5kZXhUb0xvYyhcbiAgICBpbmRleDogbnVtYmVyLCByYW5rOiBudW1iZXIsIHN0cmlkZXM6IG51bWJlcltdKTogbnVtYmVyW10ge1xuICBpZiAocmFuayA9PT0gMCkge1xuICAgIHJldHVybiBbXTtcbiAgfSBlbHNlIGlmIChyYW5rID09PSAxKSB7XG4gICAgcmV0dXJuIFtpbmRleF07XG4gIH1cbiAgY29uc3QgbG9jczogbnVtYmVyW10gPSBuZXcgQXJyYXkocmFuayk7XG4gIGZvciAobGV0IGkgPSAwOyBpIDwgbG9jcy5sZW5ndGggLSAxOyArK2kpIHtcbiAgICBsb2NzW2ldID0gTWF0aC5mbG9vcihpbmRleCAvIHN0cmlkZXNbaV0pO1xuICAgIGluZGV4IC09IGxvY3NbaV0gKiBzdHJpZGVzW2ldO1xuICB9XG4gIGxvY3NbbG9jcy5sZW5ndGggLSAxXSA9IGluZGV4O1xuICByZXR1cm4gbG9jcztcbn1cblxuLyoqXG4gKiBUaGlzIG1ldGhvZCBhc3NlcnRzIHdoZXRoZXIgYW4gb2JqZWN0IGlzIGEgUHJvbWlzZSBpbnN0YW5jZS5cbiAqIEBwYXJhbSBvYmplY3RcbiAqL1xuLy8gdHNsaW50OmRpc2FibGUtbmV4dC1saW5lOiBuby1hbnlcbmV4cG9ydCBmdW5jdGlvbiBpc1Byb21pc2Uob2JqZWN0OiBhbnkpOiBvYmplY3QgaXMgUHJvbWlzZTx1bmtub3duPiB7XG4gIC8vICBXZSBjaG9zZSB0byBub3QgdXNlICdvYmogaW5zdGFuY2VPZiBQcm9taXNlJyBmb3IgdHdvIHJlYXNvbnM6XG4gIC8vICAxLiBJdCBvbmx5IHJlbGlhYmx5IHdvcmtzIGZvciBlczYgUHJvbWlzZSwgbm90IG90aGVyIFByb21pc2VcbiAgLy8gIGltcGxlbWVudGF0aW9ucy5cbiAgLy8gIDIuIEl0IGRvZXNuJ3Qgd29yayB3aXRoIGZyYW1ld29yayB0aGF0IHVzZXMgem9uZS5qcy4gem9uZS5qcyBtb25rZXlcbiAgLy8gIHBhdGNoIHRoZSBhc3luYyBjYWxscywgc28gaXQgaXMgcG9zc2libGUgdGhlIG9iaiAocGF0Y2hlZCkgaXNcbiAgLy8gIGNvbXBhcmluZyB0byBhIHByZS1wYXRjaGVkIFByb21pc2UuXG4gIHJldHVybiBvYmplY3QgJiYgb2JqZWN0LnRoZW4gJiYgdHlwZW9mIG9iamVjdC50aGVuID09PSAnZnVuY3Rpb24nO1xufVxuIl19","/**\n * @license\n * Copyright 2020 Google LLC. All Rights Reserved.\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n * =============================================================================\n */\nimport { Abs } from '../kernel_names';\nimport { cast } from '../ops/cast';\nimport { mul } from '../ops/mul';\nimport { step } from '../ops/step';\nexport const absGradConfig = {\n kernelName: Abs,\n inputsToSave: ['x'],\n gradFunc: (dy, saved) => {\n const [x] = saved;\n return { x: () => mul(dy, step(cast(x, 'float32'), -1)) };\n }\n};\n//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiQWJzX2dyYWQuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi8uLi90ZmpzLWNvcmUvc3JjL2dyYWRpZW50cy9BYnNfZ3JhZC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQTs7Ozs7Ozs7Ozs7Ozs7O0dBZUc7QUFFSCxPQUFPLEVBQUMsR0FBRyxFQUFDLE1BQU0saUJBQWlCLENBQUM7QUFFcEMsT0FBTyxFQUFDLElBQUksRUFBQyxNQUFNLGFBQWEsQ0FBQztBQUNqQyxPQUFPLEVBQUMsR0FBRyxFQUFDLE1BQU0sWUFBWSxDQUFDO0FBQy9CLE9BQU8sRUFBQyxJQUFJLEVBQUMsTUFBTSxhQUFhLENBQUM7QUFHakMsTUFBTSxDQUFDLE1BQU0sYUFBYSxHQUFlO0lBQ3ZDLFVBQVUsRUFBRSxHQUFHO0lBQ2YsWUFBWSxFQUFFLENBQUMsR0FBRyxDQUFDO0lBQ25CLFFBQVEsRUFBRSxDQUFDLEVBQVUsRUFBRSxLQUFlLEVBQUUsRUFBRTtRQUN4QyxNQUFNLENBQUMsQ0FBQyxDQUFDLEdBQUcsS0FBSyxDQUFDO1FBQ2xCLE9BQU8sRUFBQyxDQUFDLEVBQUUsR0FBRyxFQUFFLENBQUMsR0FBRyxDQUFDLEVBQUUsRUFBRSxJQUFJLENBQUMsSUFBSSxDQUFDLENBQUMsRUFBRSxTQUFTLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxDQUFDLEVBQUMsQ0FBQztJQUMxRCxDQUFDO0NBQ0YsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbIi8qKlxuICogQGxpY2Vuc2VcbiAqIENvcHlyaWdodCAyMDIwIEdvb2dsZSBMTEMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuXG4gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgXCJMaWNlbnNlXCIpO1xuICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLlxuICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0XG4gKlxuICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wXG4gKlxuICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZVxuICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gXCJBUyBJU1wiIEJBU0lTLFxuICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuXG4gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kXG4gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS5cbiAqID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4gKi9cblxuaW1wb3J0IHtBYnN9IGZyb20gJy4uL2tlcm5lbF9uYW1lcyc7XG5pbXBvcnQge0dyYWRDb25maWd9IGZyb20gJy4uL2tlcm5lbF9yZWdpc3RyeSc7XG5pbXBvcnQge2Nhc3R9IGZyb20gJy4uL29wcy9jYXN0JztcbmltcG9ydCB7bXVsfSBmcm9tICcuLi9vcHMvbXVsJztcbmltcG9ydCB7c3RlcH0gZnJvbSAnLi4vb3BzL3N0ZXAnO1xuaW1wb3J0IHtUZW5zb3J9IGZyb20gJy4uL3RlbnNvcic7XG5cbmV4cG9ydCBjb25zdCBhYnNHcmFkQ29uZmlnOiBHcmFkQ29uZmlnID0ge1xuICBrZXJuZWxOYW1lOiBBYnMsXG4gIGlucHV0c1RvU2F2ZTogWyd4J10sXG4gIGdyYWRGdW5jOiAoZHk6IFRlbnNvciwgc2F2ZWQ6IFRlbnNvcltdKSA9PiB7XG4gICAgY29uc3QgW3hdID0gc2F2ZWQ7XG4gICAgcmV0dXJuIHt4OiAoKSA9PiBtdWwoZHksIHN0ZXAoY2FzdCh4LCAnZmxvYXQzMicpLCAtMSkpfTtcbiAgfVxufTtcbiJdfQ==","/**\n * @license\n * Copyright 2020 Google LLC. All Rights Reserved.\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n * =============================================================================\n */\nimport { Acos } from '../kernel_names';\nimport { cast } from '../ops/cast';\nimport { div } from '../ops/div';\nimport { neg } from '../ops/neg';\nimport { scalar } from '../ops/scalar';\nimport { sqrt } from '../ops/sqrt';\nimport { square } from '../ops/square';\nimport { sub } from '../ops/sub';\nexport const acosGradConfig = {\n kernelName: Acos,\n inputsToSave: ['x'],\n gradFunc: (dy, saved) => {\n const [x] = saved;\n return {\n x: () => {\n const a = square(cast(x, 'float32'));\n const b = sqrt(sub(scalar(1), a));\n return neg(div(dy, b));\n }\n };\n }\n};\n//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiQWNvc19ncmFkLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vLi4vdGZqcy1jb3JlL3NyYy9ncmFkaWVudHMvQWNvc19ncmFkLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBOzs7Ozs7Ozs7Ozs7Ozs7R0FlRztBQUVILE9BQU8sRUFBQyxJQUFJLEVBQUMsTUFBTSxpQkFBaUIsQ0FBQztBQUVyQyxPQUFPLEVBQUMsSUFBSSxFQUFDLE1BQU0sYUFBYSxDQUFDO0FBQ2pDLE9BQU8sRUFBQyxHQUFHLEVBQUMsTUFBTSxZQUFZLENBQUM7QUFDL0IsT0FBTyxFQUFDLEdBQUcsRUFBQyxNQUFNLFlBQVksQ0FBQztBQUMvQixPQUFPLEVBQUMsTUFBTSxFQUFDLE1BQU0sZUFBZSxDQUFDO0FBQ3JDLE9BQU8sRUFBQyxJQUFJLEVBQUMsTUFBTSxhQUFhLENBQUM7QUFDakMsT0FBTyxFQUFDLE1BQU0sRUFBQyxNQUFNLGVBQWUsQ0FBQztBQUNyQyxPQUFPLEVBQUMsR0FBRyxFQUFDLE1BQU0sWUFBWSxDQUFDO0FBRy9CLE1BQU0sQ0FBQyxNQUFNLGNBQWMsR0FBZTtJQUN4QyxVQUFVLEVBQUUsSUFBSTtJQUNoQixZQUFZLEVBQUUsQ0FBQyxHQUFHLENBQUM7SUFDbkIsUUFBUSxFQUFFLENBQUMsRUFBVSxFQUFFLEtBQWUsRUFBRSxFQUFFO1FBQ3hDLE1BQU0sQ0FBQyxDQUFDLENBQUMsR0FBRyxLQUFLLENBQUM7UUFFbEIsT0FBTztZQUNMLENBQUMsRUFBRSxHQUFHLEVBQUU7Z0JBQ04sTUFBTSxDQUFDLEdBQUcsTUFBTSxDQUFDLElBQUksQ0FBQyxDQUFDLEVBQUUsU0FBUyxDQUFDLENBQUMsQ0FBQztnQkFDckMsTUFBTSxDQUFDLEdBQUcsSUFBSSxDQUFDLEdBQUcsQ0FBQyxNQUFNLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsQ0FBQztnQkFDbEMsT0FBTyxHQUFHLENBQUMsR0FBRyxDQUFDLEVBQUUsRUFBRSxDQUFDLENBQUMsQ0FBQyxDQUFDO1lBQ3pCLENBQUM7U0FFRixDQUFDO0lBQ0osQ0FBQztDQUNGLENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyIvKipcbiAqIEBsaWNlbnNlXG4gKiBDb3B5cmlnaHQgMjAyMCBHb29nbGUgTExDLiBBbGwgUmlnaHRzIFJlc2VydmVkLlxuICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlIFwiTGljZW5zZVwiKTtcbiAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS5cbiAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdFxuICpcbiAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMFxuICpcbiAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmVcbiAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuIFwiQVMgSVNcIiBCQVNJUyxcbiAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLlxuICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZFxuICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuXG4gKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuICovXG5cbmltcG9ydCB7QWNvc30gZnJvbSAnLi4va2VybmVsX25hbWVzJztcbmltcG9ydCB7R3JhZENvbmZpZ30gZnJvbSAnLi4va2VybmVsX3JlZ2lzdHJ5JztcbmltcG9ydCB7Y2FzdH0gZnJvbSAnLi4vb3BzL2Nhc3QnO1xuaW1wb3J0IHtkaXZ9IGZyb20gJy4uL29wcy9kaXYnO1xuaW1wb3J0IHtuZWd9IGZyb20gJy4uL29wcy9uZWcnO1xuaW1wb3J0IHtzY2FsYXJ9IGZyb20gJy4uL29wcy9zY2FsYXInO1xuaW1wb3J0IHtzcXJ0fSBmcm9tICcuLi9vcHMvc3FydCc7XG5pbXBvcnQge3NxdWFyZX0gZnJvbSAnLi4vb3BzL3NxdWFyZSc7XG5pbXBvcnQge3N1Yn0gZnJvbSAnLi4vb3BzL3N1Yic7XG5pbXBvcnQge1RlbnNvcn0gZnJvbSAnLi4vdGVuc29yJztcblxuZXhwb3J0IGNvbnN0IGFjb3NHcmFkQ29uZmlnOiBHcmFkQ29uZmlnID0ge1xuICBrZXJuZWxOYW1lOiBBY29zLFxuICBpbnB1dHNUb1NhdmU6IFsneCddLFxuICBncmFkRnVuYzogKGR5OiBUZW5zb3IsIHNhdmVkOiBUZW5zb3JbXSkgPT4ge1xuICAgIGNvbnN0IFt4XSA9IHNhdmVkO1xuXG4gICAgcmV0dXJuIHtcbiAgICAgIHg6ICgpID0+IHtcbiAgICAgICAgY29uc3QgYSA9IHNxdWFyZShjYXN0KHgsICdmbG9hdDMyJykpO1xuICAgICAgICBjb25zdCBiID0gc3FydChzdWIoc2NhbGFyKDEpLCBhKSk7XG4gICAgICAgIHJldHVybiBuZWcoZGl2KGR5LCBiKSk7XG4gICAgICB9XG5cbiAgICB9O1xuICB9XG59O1xuIl19","/**\n * @license\n * Copyright 2020 Google LLC. All Rights Reserved.\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n * =============================================================================\n */\nimport { Acosh } from '../kernel_names';\nimport { cast } from '../ops/cast';\nimport { div } from '../ops/div';\nimport { sqrt } from '../ops/sqrt';\nimport { square } from '../ops/square';\nimport { sub } from '../ops/sub';\nexport const acoshGradConfig = {\n kernelName: Acosh,\n inputsToSave: ['x'],\n gradFunc: (dy, saved) => {\n const [x] = saved;\n return {\n x: () => {\n const a = sqrt(sub(square(cast(x, 'float32')), 1));\n return div(dy, a);\n }\n };\n }\n};\n//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiQWNvc2hfZ3JhZC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uLy4uL3RmanMtY29yZS9zcmMvZ3JhZGllbnRzL0Fjb3NoX2dyYWQudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUE7Ozs7Ozs7Ozs7Ozs7OztHQWVHO0FBRUgsT0FBTyxFQUFDLEtBQUssRUFBQyxNQUFNLGlCQUFpQixDQUFDO0FBRXRDLE9BQU8sRUFBQyxJQUFJLEVBQUMsTUFBTSxhQUFhLENBQUM7QUFDakMsT0FBTyxFQUFDLEdBQUcsRUFBQyxNQUFNLFlBQVksQ0FBQztBQUMvQixPQUFPLEVBQUMsSUFBSSxFQUFDLE1BQU0sYUFBYSxDQUFDO0FBQ2pDLE9BQU8sRUFBQyxNQUFNLEVBQUMsTUFBTSxlQUFlLENBQUM7QUFDckMsT0FBTyxFQUFDLEdBQUcsRUFBQyxNQUFNLFlBQVksQ0FBQztBQUcvQixNQUFNLENBQUMsTUFBTSxlQUFlLEdBQWU7SUFDekMsVUFBVSxFQUFFLEtBQUs7SUFDakIsWUFBWSxFQUFFLENBQUMsR0FBRyxDQUFDO0lBQ25CLFFBQVEsRUFBRSxDQUFDLEVBQVUsRUFBRSxLQUFlLEVBQUUsRUFBRTtRQUN4QyxNQUFNLENBQUMsQ0FBQyxDQUFDLEdBQUcsS0FBSyxDQUFDO1FBRWxCLE9BQU87WUFDTCxDQUFDLEVBQUUsR0FBRyxFQUFFO2dCQUNOLE1BQU0sQ0FBQyxHQUFHLElBQUksQ0FBQyxHQUFHLENBQUMsTUFBTSxDQUFDLElBQUksQ0FBQyxDQUFDLEVBQUUsU0FBUyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxDQUFDO2dCQUNuRCxPQUFPLEdBQUcsQ0FBQyxFQUFFLEVBQUUsQ0FBQyxDQUFDLENBQUM7WUFDcEIsQ0FBQztTQUNGLENBQUM7SUFDSixDQUFDO0NBQ0YsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbIi8qKlxuICogQGxpY2Vuc2VcbiAqIENvcHlyaWdodCAyMDIwIEdvb2dsZSBMTEMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuXG4gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgXCJMaWNlbnNlXCIpO1xuICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLlxuICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0XG4gKlxuICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wXG4gKlxuICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZVxuICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gXCJBUyBJU1wiIEJBU0lTLFxuICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuXG4gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kXG4gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS5cbiAqID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4gKi9cblxuaW1wb3J0IHtBY29zaH0gZnJvbSAnLi4va2VybmVsX25hbWVzJztcbmltcG9ydCB7R3JhZENvbmZpZ30gZnJvbSAnLi4va2VybmVsX3JlZ2lzdHJ5JztcbmltcG9ydCB7Y2FzdH0gZnJvbSAnLi4vb3BzL2Nhc3QnO1xuaW1wb3J0IHtkaXZ9IGZyb20gJy4uL29wcy9kaXYnO1xuaW1wb3J0IHtzcXJ0fSBmcm9tICcuLi9vcHMvc3FydCc7XG5pbXBvcnQge3NxdWFyZX0gZnJvbSAnLi4vb3BzL3NxdWFyZSc7XG5pbXBvcnQge3N1Yn0gZnJvbSAnLi4vb3BzL3N1Yic7XG5pbXBvcnQge1RlbnNvcn0gZnJvbSAnLi4vdGVuc29yJztcblxuZXhwb3J0IGNvbnN0IGFjb3NoR3JhZENvbmZpZzogR3JhZENvbmZpZyA9IHtcbiAga2VybmVsTmFtZTogQWNvc2gsXG4gIGlucHV0c1RvU2F2ZTogWyd4J10sXG4gIGdyYWRGdW5jOiAoZHk6IFRlbnNvciwgc2F2ZWQ6IFRlbnNvcltdKSA9PiB7XG4gICAgY29uc3QgW3hdID0gc2F2ZWQ7XG5cbiAgICByZXR1cm4ge1xuICAgICAgeDogKCkgPT4ge1xuICAgICAgICBjb25zdCBhID0gc3FydChzdWIoc3F1YXJlKGNhc3QoeCwgJ2Zsb2F0MzInKSksIDEpKTtcbiAgICAgICAgcmV0dXJuIGRpdihkeSwgYSk7XG4gICAgICB9XG4gICAgfTtcbiAgfVxufTtcbiJdfQ==","/**\n * @license\n * Copyright 2020 Google LLC. All Rights Reserved.\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n * =============================================================================\n */\nimport { Add } from '../kernel_names';\nimport * as broadcast_util from '../ops/broadcast_util';\nimport { reshape } from '../ops/reshape';\nimport { sum } from '../ops/sum';\nexport const addGradConfig = {\n kernelName: Add,\n inputsToSave: ['a', 'b'],\n gradFunc: (dy, saved) => {\n const [a, b] = saved;\n const outShape = broadcast_util.assertAndGetBroadcastShape(a.shape, b.shape);\n const derA = () => {\n let res = dy;\n const reduceAxes = broadcast_util.getReductionAxes(a.shape, outShape);\n if (reduceAxes.length > 0) {\n res = sum(res, reduceAxes);\n }\n return reshape(res, a.shape);\n };\n const derB = () => {\n let res = dy;\n const reduceAxes = broadcast_util.getReductionAxes(b.shape, outShape);\n if (reduceAxes.length > 0) {\n res = sum(res, reduceAxes);\n }\n return reshape(res, b.shape);\n };\n return { a: derA, b: derB };\n }\n};\n//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiQWRkX2dyYWQuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi8uLi90ZmpzLWNvcmUvc3JjL2dyYWRpZW50cy9BZGRfZ3JhZC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQTs7Ozs7Ozs7Ozs7Ozs7O0dBZUc7QUFDSCxPQUFPLEVBQUMsR0FBRyxFQUFDLE1BQU0saUJBQWlCLENBQUM7QUFFcEMsT0FBTyxLQUFLLGNBQWMsTUFBTSx1QkFBdUIsQ0FBQztBQUN4RCxPQUFPLEVBQUMsT0FBTyxFQUFDLE1BQU0sZ0JBQWdCLENBQUM7QUFDdkMsT0FBTyxFQUFDLEdBQUcsRUFBQyxNQUFNLFlBQVksQ0FBQztBQUcvQixNQUFNLENBQUMsTUFBTSxhQUFhLEdBQWU7SUFDdkMsVUFBVSxFQUFFLEdBQUc7SUFDZixZQUFZLEVBQUUsQ0FBQyxHQUFHLEVBQUUsR0FBRyxDQUFDO0lBQ3hCLFFBQVEsRUFBRSxDQUFDLEVBQVUsRUFBRSxLQUFlLEVBQUUsRUFBRTtRQUN4QyxNQUFNLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxHQUFHLEtBQUssQ0FBQztRQUNyQixNQUFNLFFBQVEsR0FDVixjQUFjLENBQUMsMEJBQTBCLENBQUMsQ0FBQyxDQUFDLEtBQUssRUFBRSxDQUFDLENBQUMsS0FBSyxDQUFDLENBQUM7UUFFaEUsTUFBTSxJQUFJLEdBQUcsR0FBRyxFQUFFO1lBQ2hCLElBQUksR0FBRyxHQUFHLEVBQUUsQ0FBQztZQUNiLE1BQU0sVUFBVSxHQUFHLGNBQWMsQ0FBQyxnQkFBZ0IsQ0FBQyxDQUFDLENBQUMsS0FBSyxFQUFFLFFBQVEsQ0FBQyxDQUFDO1lBQ3RFLElBQUksVUFBVSxDQUFDLE1BQU0sR0FBRyxDQUFDLEVBQUU7Z0JBQ3pCLEdBQUcsR0FBRyxHQUFHLENBQUMsR0FBRyxFQUFFLFVBQVUsQ0FBQyxDQUFDO2FBQzVCO1lBQ0QsT0FBTyxPQUFPLENBQUMsR0FBRyxFQUFFLENBQUMsQ0FBQyxLQUFLLENBQUMsQ0FBQztRQUMvQixDQUFDLENBQUM7UUFDRixNQUFNLElBQUksR0FBRyxHQUFHLEVBQUU7WUFDaEIsSUFBSSxHQUFHLEdBQUcsRUFBRSxDQUFDO1lBQ2IsTUFBTSxVQUFVLEdBQUcsY0FBYyxDQUFDLGdCQUFnQixDQUFDLENBQUMsQ0FBQyxLQUFLLEVBQUUsUUFBUSxDQUFDLENBQUM7WUFDdEUsSUFBSSxVQUFVLENBQUMsTUFBTSxHQUFHLENBQUMsRUFBRTtnQkFDekIsR0FBRyxHQUFHLEdBQUcsQ0FBQyxHQUFHLEVBQUUsVUFBVSxDQUFDLENBQUM7YUFDNUI7WUFDRCxPQUFPLE9BQU8sQ0FBQyxHQUFHLEVBQUUsQ0FBQyxDQUFDLEtBQUssQ0FBQyxDQUFDO1FBQy9CLENBQUMsQ0FBQztRQUVGLE9BQU8sRUFBQyxDQUFDLEVBQUUsSUFBSSxFQUFFLENBQUMsRUFBRSxJQUFJLEVBQUMsQ0FBQztJQUM1QixDQUFDO0NBQ0YsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbIi8qKlxuICogQGxpY2Vuc2VcbiAqIENvcHlyaWdodCAyMDIwIEdvb2dsZSBMTEMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuXG4gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgXCJMaWNlbnNlXCIpO1xuICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLlxuICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0XG4gKlxuICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wXG4gKlxuICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZVxuICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gXCJBUyBJU1wiIEJBU0lTLFxuICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuXG4gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kXG4gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS5cbiAqID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4gKi9cbmltcG9ydCB7QWRkfSBmcm9tICcuLi9rZXJuZWxfbmFtZXMnO1xuaW1wb3J0IHtHcmFkQ29uZmlnfSBmcm9tICcuLi9rZXJuZWxfcmVnaXN0cnknO1xuaW1wb3J0ICogYXMgYnJvYWRjYXN0X3V0aWwgZnJvbSAnLi4vb3BzL2Jyb2FkY2FzdF91dGlsJztcbmltcG9ydCB7cmVzaGFwZX0gZnJvbSAnLi4vb3BzL3Jlc2hhcGUnO1xuaW1wb3J0IHtzdW19IGZyb20gJy4uL29wcy9zdW0nO1xuaW1wb3J0IHtUZW5zb3J9IGZyb20gJy4uL3RlbnNvcic7XG5cbmV4cG9ydCBjb25zdCBhZGRHcmFkQ29uZmlnOiBHcmFkQ29uZmlnID0ge1xuICBrZXJuZWxOYW1lOiBBZGQsXG4gIGlucHV0c1RvU2F2ZTogWydhJywgJ2InXSxcbiAgZ3JhZEZ1bmM6IChkeTogVGVuc29yLCBzYXZlZDogVGVuc29yW10pID0+IHtcbiAgICBjb25zdCBbYSwgYl0gPSBzYXZlZDtcbiAgICBjb25zdCBvdXRTaGFwZSA9XG4gICAgICAgIGJyb2FkY2FzdF91dGlsLmFzc2VydEFuZEdldEJyb2FkY2FzdFNoYXBlKGEuc2hhcGUsIGIuc2hhcGUpO1xuXG4gICAgY29uc3QgZGVyQSA9ICgpID0+IHtcbiAgICAgIGxldCByZXMgPSBkeTtcbiAgICAgIGNvbnN0IHJlZHVjZUF4ZXMgPSBicm9hZGNhc3RfdXRpbC5nZXRSZWR1Y3Rpb25BeGVzKGEuc2hhcGUsIG91dFNoYXBlKTtcbiAgICAgIGlmIChyZWR1Y2VBeGVzLmxlbmd0aCA+IDApIHtcbiAgICAgICAgcmVzID0gc3VtKHJlcywgcmVkdWNlQXhlcyk7XG4gICAgICB9XG4gICAgICByZXR1cm4gcmVzaGFwZShyZXMsIGEuc2hhcGUpO1xuICAgIH07XG4gICAgY29uc3QgZGVyQiA9ICgpID0+IHtcbiAgICAgIGxldCByZXMgPSBkeTtcbiAgICAgIGNvbnN0IHJlZHVjZUF4ZXMgPSBicm9hZGNhc3RfdXRpbC5nZXRSZWR1Y3Rpb25BeGVzKGIuc2hhcGUsIG91dFNoYXBlKTtcbiAgICAgIGlmIChyZWR1Y2VBeGVzLmxlbmd0aCA+IDApIHtcbiAgICAgICAgcmVzID0gc3VtKHJlcywgcmVkdWNlQXhlcyk7XG4gICAgICB9XG4gICAgICByZXR1cm4gcmVzaGFwZShyZXMsIGIuc2hhcGUpO1xuICAgIH07XG5cbiAgICByZXR1cm4ge2E6IGRlckEsIGI6IGRlckJ9O1xuICB9XG59O1xuIl19","/**\n * @license\n * Copyright 2020 Google LLC. All Rights Reserved.\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n * =============================================================================\n */\nimport { AddN } from '../kernel_names';\nexport const addNGradConfig = {\n kernelName: AddN,\n saveAllInputs: true,\n gradFunc: (dy, saved) => {\n const ders = {};\n saved.forEach((_, i) => {\n ders[i] = () => dy.clone();\n });\n return ders;\n }\n};\n//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiQWRkTl9ncmFkLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vLi4vdGZqcy1jb3JlL3NyYy9ncmFkaWVudHMvQWRkTl9ncmFkLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBOzs7Ozs7Ozs7Ozs7Ozs7R0FlRztBQUVILE9BQU8sRUFBQyxJQUFJLEVBQUMsTUFBTSxpQkFBaUIsQ0FBQztBQUlyQyxNQUFNLENBQUMsTUFBTSxjQUFjLEdBQWU7SUFDeEMsVUFBVSxFQUFFLElBQUk7SUFDaEIsYUFBYSxFQUFFLElBQUk7SUFDbkIsUUFBUSxFQUFFLENBQUMsRUFBVSxFQUFFLEtBQWUsRUFBRSxFQUFFO1FBQ3hDLE1BQU0sSUFBSSxHQUFrQyxFQUFFLENBQUM7UUFDL0MsS0FBSyxDQUFDLE9BQU8sQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLEVBQUUsRUFBRTtZQUNyQixJQUFJLENBQUMsQ0FBQyxDQUFDLEdBQUcsR0FBRyxFQUFFLENBQUMsRUFBRSxDQUFDLEtBQUssRUFBRSxDQUFDO1FBQzdCLENBQUMsQ0FBQyxDQUFDO1FBQ0gsT0FBTyxJQUFJLENBQUM7SUFDZCxDQUFDO0NBQ0YsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbIi8qKlxuICogQGxpY2Vuc2VcbiAqIENvcHlyaWdodCAyMDIwIEdvb2dsZSBMTEMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuXG4gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgXCJMaWNlbnNlXCIpO1xuICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLlxuICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0XG4gKlxuICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wXG4gKlxuICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZVxuICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gXCJBUyBJU1wiIEJBU0lTLFxuICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuXG4gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kXG4gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS5cbiAqID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4gKi9cblxuaW1wb3J0IHtBZGROfSBmcm9tICcuLi9rZXJuZWxfbmFtZXMnO1xuaW1wb3J0IHtHcmFkQ29uZmlnfSBmcm9tICcuLi9rZXJuZWxfcmVnaXN0cnknO1xuaW1wb3J0IHtUZW5zb3J9IGZyb20gJy4uL3RlbnNvcic7XG5cbmV4cG9ydCBjb25zdCBhZGROR3JhZENvbmZpZzogR3JhZENvbmZpZyA9IHtcbiAga2VybmVsTmFtZTogQWRkTixcbiAgc2F2ZUFsbElucHV0czogdHJ1ZSxcbiAgZ3JhZEZ1bmM6IChkeTogVGVuc29yLCBzYXZlZDogVGVuc29yW10pID0+IHtcbiAgICBjb25zdCBkZXJzOiB7W2tleTogc3RyaW5nXTogKCkgPT4gVGVuc29yfSA9IHt9O1xuICAgIHNhdmVkLmZvckVhY2goKF8sIGkpID0+IHtcbiAgICAgIGRlcnNbaV0gPSAoKSA9PiBkeS5jbG9uZSgpO1xuICAgIH0pO1xuICAgIHJldHVybiBkZXJzO1xuICB9XG59O1xuIl19","/**\n * @license\n * Copyright 2020 Google Inc. All Rights Reserved.\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n * =============================================================================\n */\nimport { ArgMax } from '../kernel_names';\nimport { zerosLike } from '../ops/zeros_like';\nexport const argMaxGradConfig = {\n kernelName: ArgMax,\n inputsToSave: ['x'],\n gradFunc: (dy, saved) => {\n const [x] = saved;\n return { x: () => zerosLike(x) };\n }\n};\n//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiQXJnTWF4X2dyYWQuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi8uLi90ZmpzLWNvcmUvc3JjL2dyYWRpZW50cy9BcmdNYXhfZ3JhZC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQTs7Ozs7Ozs7Ozs7Ozs7O0dBZUc7QUFFSCxPQUFPLEVBQUMsTUFBTSxFQUFDLE1BQU0saUJBQWlCLENBQUM7QUFFdkMsT0FBTyxFQUFDLFNBQVMsRUFBQyxNQUFNLG1CQUFtQixDQUFDO0FBRzVDLE1BQU0sQ0FBQyxNQUFNLGdCQUFnQixHQUFlO0lBQzFDLFVBQVUsRUFBRSxNQUFNO0lBQ2xCLFlBQVksRUFBRSxDQUFDLEdBQUcsQ0FBQztJQUNuQixRQUFRLEVBQUUsQ0FBQyxFQUFVLEVBQUUsS0FBZSxFQUFFLEVBQUU7UUFDeEMsTUFBTSxDQUFDLENBQUMsQ0FBQyxHQUFHLEtBQUssQ0FBQztRQUNsQixPQUFPLEVBQUMsQ0FBQyxFQUFFLEdBQUcsRUFBRSxDQUFDLFNBQVMsQ0FBQyxDQUFDLENBQUMsRUFBQyxDQUFDO0lBQ2pDLENBQUM7Q0FDRixDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiLyoqXG4gKiBAbGljZW5zZVxuICogQ29weXJpZ2h0IDIwMjAgR29vZ2xlIEluYy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC5cbiAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSBcIkxpY2Vuc2VcIik7XG4gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuXG4gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXRcbiAqXG4gKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjBcbiAqXG4gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlXG4gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiBcIkFTIElTXCIgQkFTSVMsXG4gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC5cbiAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmRcbiAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLlxuICogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbiAqL1xuXG5pbXBvcnQge0FyZ01heH0gZnJvbSAnLi4va2VybmVsX25hbWVzJztcbmltcG9ydCB7R3JhZENvbmZpZ30gZnJvbSAnLi4va2VybmVsX3JlZ2lzdHJ5JztcbmltcG9ydCB7emVyb3NMaWtlfSBmcm9tICcuLi9vcHMvemVyb3NfbGlrZSc7XG5pbXBvcnQge1RlbnNvcn0gZnJvbSAnLi4vdGVuc29yJztcblxuZXhwb3J0IGNvbnN0IGFyZ01heEdyYWRDb25maWc6IEdyYWRDb25maWcgPSB7XG4gIGtlcm5lbE5hbWU6IEFyZ01heCxcbiAgaW5wdXRzVG9TYXZlOiBbJ3gnXSxcbiAgZ3JhZEZ1bmM6IChkeTogVGVuc29yLCBzYXZlZDogVGVuc29yW10pID0+IHtcbiAgICBjb25zdCBbeF0gPSBzYXZlZDtcbiAgICByZXR1cm4ge3g6ICgpID0+IHplcm9zTGlrZSh4KX07XG4gIH1cbn07XG4iXX0=","/**\n * @license\n * Copyright 2020 Google Inc. All Rights Reserved.\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n * =============================================================================\n */\nimport { ArgMin } from '../kernel_names';\nimport { zerosLike } from '../ops/zeros_like';\nexport const argMinGradConfig = {\n kernelName: ArgMin,\n inputsToSave: ['x'],\n gradFunc: (dy, saved) => {\n const [x] = saved;\n return { x: () => zerosLike(x) };\n }\n};\n//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiQXJnTWluX2dyYWQuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi8uLi90ZmpzLWNvcmUvc3JjL2dyYWRpZW50cy9BcmdNaW5fZ3JhZC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQTs7Ozs7Ozs7Ozs7Ozs7O0dBZUc7QUFFSCxPQUFPLEVBQUMsTUFBTSxFQUFDLE1BQU0saUJBQWlCLENBQUM7QUFFdkMsT0FBTyxFQUFDLFNBQVMsRUFBQyxNQUFNLG1CQUFtQixDQUFDO0FBRzVDLE1BQU0sQ0FBQyxNQUFNLGdCQUFnQixHQUFlO0lBQzFDLFVBQVUsRUFBRSxNQUFNO0lBQ2xCLFlBQVksRUFBRSxDQUFDLEdBQUcsQ0FBQztJQUNuQixRQUFRLEVBQUUsQ0FBQyxFQUFVLEVBQUUsS0FBZSxFQUFFLEVBQUU7UUFDeEMsTUFBTSxDQUFDLENBQUMsQ0FBQyxHQUFHLEtBQUssQ0FBQztRQUNsQixPQUFPLEVBQUMsQ0FBQyxFQUFFLEdBQUcsRUFBRSxDQUFDLFNBQVMsQ0FBQyxDQUFDLENBQUMsRUFBQyxDQUFDO0lBQ2pDLENBQUM7Q0FDRixDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiLyoqXG4gKiBAbGljZW5zZVxuICogQ29weXJpZ2h0IDIwMjAgR29vZ2xlIEluYy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC5cbiAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSBcIkxpY2Vuc2VcIik7XG4gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuXG4gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXRcbiAqXG4gKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjBcbiAqXG4gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlXG4gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiBcIkFTIElTXCIgQkFTSVMsXG4gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC5cbiAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmRcbiAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLlxuICogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbiAqL1xuXG5pbXBvcnQge0FyZ01pbn0gZnJvbSAnLi4va2VybmVsX25hbWVzJztcbmltcG9ydCB7R3JhZENvbmZpZ30gZnJvbSAnLi4va2VybmVsX3JlZ2lzdHJ5JztcbmltcG9ydCB7emVyb3NMaWtlfSBmcm9tICcuLi9vcHMvemVyb3NfbGlrZSc7XG5pbXBvcnQge1RlbnNvcn0gZnJvbSAnLi4vdGVuc29yJztcblxuZXhwb3J0IGNvbnN0IGFyZ01pbkdyYWRDb25maWc6IEdyYWRDb25maWcgPSB7XG4gIGtlcm5lbE5hbWU6IEFyZ01pbixcbiAgaW5wdXRzVG9TYXZlOiBbJ3gnXSxcbiAgZ3JhZEZ1bmM6IChkeTogVGVuc29yLCBzYXZlZDogVGVuc29yW10pID0+IHtcbiAgICBjb25zdCBbeF0gPSBzYXZlZDtcbiAgICByZXR1cm4ge3g6ICgpID0+IHplcm9zTGlrZSh4KX07XG4gIH1cbn07XG4iXX0=","/**\n * @license\n * Copyright 2020 Google LLC. All Rights Reserved.\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n * =============================================================================\n */\nimport { Asin } from '../kernel_names';\nimport { cast } from '../ops/cast';\nimport { div } from '../ops/div';\nimport { scalar } from '../ops/scalar';\nimport { sqrt } from '../ops/sqrt';\nimport { square } from '../ops/square';\nimport { sub } from '../ops/sub';\nexport const asinGradConfig = {\n kernelName: Asin,\n inputsToSave: ['x'],\n gradFunc: (dy, saved) => {\n const [x] = saved;\n return { x: () => div(dy, sqrt(sub(scalar(1), square(cast(x, 'float32'))))) };\n }\n};\n//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiQXNpbl9ncmFkLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vLi4vdGZqcy1jb3JlL3NyYy9ncmFkaWVudHMvQXNpbl9ncmFkLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBOzs7Ozs7Ozs7Ozs7Ozs7R0FlRztBQUVILE9BQU8sRUFBQyxJQUFJLEVBQUMsTUFBTSxpQkFBaUIsQ0FBQztBQUVyQyxPQUFPLEVBQUMsSUFBSSxFQUFDLE1BQU0sYUFBYSxDQUFDO0FBQ2pDLE9BQU8sRUFBQyxHQUFHLEVBQUMsTUFBTSxZQUFZLENBQUM7QUFDL0IsT0FBTyxFQUFDLE1BQU0sRUFBQyxNQUFNLGVBQWUsQ0FBQztBQUNyQyxPQUFPLEVBQUMsSUFBSSxFQUFDLE1BQU0sYUFBYSxDQUFDO0FBQ2pDLE9BQU8sRUFBQyxNQUFNLEVBQUMsTUFBTSxlQUFlLENBQUM7QUFDckMsT0FBTyxFQUFDLEdBQUcsRUFBQyxNQUFNLFlBQVksQ0FBQztBQUcvQixNQUFNLENBQUMsTUFBTSxjQUFjLEdBQWU7SUFDeEMsVUFBVSxFQUFFLElBQUk7SUFDaEIsWUFBWSxFQUFFLENBQUMsR0FBRyxDQUFDO0lBQ25CLFFBQVEsRUFBRSxDQUFDLEVBQVUsRUFBRSxLQUFlLEVBQUUsRUFBRTtRQUN4QyxNQUFNLENBQUMsQ0FBQyxDQUFDLEdBQUcsS0FBSyxDQUFDO1FBQ2xCLE9BQU8sRUFBQyxDQUFDLEVBQUUsR0FBRyxFQUFFLENBQUMsR0FBRyxDQUFDLEVBQUUsRUFBRSxJQUFJLENBQUMsR0FBRyxDQUFDLE1BQU0sQ0FBQyxDQUFDLENBQUMsRUFBRSxNQUFNLENBQUMsSUFBSSxDQUFDLENBQUMsRUFBRSxTQUFTLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxFQUFDLENBQUM7SUFDOUUsQ0FBQztDQUNGLENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyIvKipcbiAqIEBsaWNlbnNlXG4gKiBDb3B5cmlnaHQgMjAyMCBHb29nbGUgTExDLiBBbGwgUmlnaHRzIFJlc2VydmVkLlxuICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlIFwiTGljZW5zZVwiKTtcbiAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS5cbiAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdFxuICpcbiAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMFxuICpcbiAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmVcbiAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuIFwiQVMgSVNcIiBCQVNJUyxcbiAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLlxuICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZFxuICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuXG4gKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuICovXG5cbmltcG9ydCB7QXNpbn0gZnJvbSAnLi4va2VybmVsX25hbWVzJztcbmltcG9ydCB7R3JhZENvbmZpZ30gZnJvbSAnLi4va2VybmVsX3JlZ2lzdHJ5JztcbmltcG9ydCB7Y2FzdH0gZnJvbSAnLi4vb3BzL2Nhc3QnO1xuaW1wb3J0IHtkaXZ9IGZyb20gJy4uL29wcy9kaXYnO1xuaW1wb3J0IHtzY2FsYXJ9IGZyb20gJy4uL29wcy9zY2FsYXInO1xuaW1wb3J0IHtzcXJ0fSBmcm9tICcuLi9vcHMvc3FydCc7XG5pbXBvcnQge3NxdWFyZX0gZnJvbSAnLi4vb3BzL3NxdWFyZSc7XG5pbXBvcnQge3N1Yn0gZnJvbSAnLi4vb3BzL3N1Yic7XG5pbXBvcnQge1RlbnNvcn0gZnJvbSAnLi4vdGVuc29yJztcblxuZXhwb3J0IGNvbnN0IGFzaW5HcmFkQ29uZmlnOiBHcmFkQ29uZmlnID0ge1xuICBrZXJuZWxOYW1lOiBBc2luLFxuICBpbnB1dHNUb1NhdmU6IFsneCddLFxuICBncmFkRnVuYzogKGR5OiBUZW5zb3IsIHNhdmVkOiBUZW5zb3JbXSkgPT4ge1xuICAgIGNvbnN0IFt4XSA9IHNhdmVkO1xuICAgIHJldHVybiB7eDogKCkgPT4gZGl2KGR5LCBzcXJ0KHN1YihzY2FsYXIoMSksIHNxdWFyZShjYXN0KHgsICdmbG9hdDMyJykpKSkpfTtcbiAgfVxufTtcbiJdfQ==","/**\n * @license\n * Copyright 2020 Google LLC. All Rights Reserved.\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n * =============================================================================\n */\nimport { Asinh } from '../kernel_names';\nimport { add } from '../ops/add';\nimport { cast } from '../ops/cast';\nimport { div } from '../ops/div';\nimport { scalar } from '../ops/scalar';\nimport { sqrt } from '../ops/sqrt';\nimport { square } from '../ops/square';\nexport const asinhGradConfig = {\n kernelName: Asinh,\n inputsToSave: ['x'],\n gradFunc: (dy, saved) => {\n const [x] = saved;\n return {\n x: () => {\n const a = sqrt(add(scalar(1), square(cast(x, 'float32'))));\n return div(dy, a);\n }\n };\n }\n};\n//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiQXNpbmhfZ3JhZC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uLy4uL3RmanMtY29yZS9zcmMvZ3JhZGllbnRzL0FzaW5oX2dyYWQudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUE7Ozs7Ozs7Ozs7Ozs7OztHQWVHO0FBRUgsT0FBTyxFQUFDLEtBQUssRUFBQyxNQUFNLGlCQUFpQixDQUFDO0FBRXRDLE9BQU8sRUFBQyxHQUFHLEVBQUMsTUFBTSxZQUFZLENBQUM7QUFDL0IsT0FBTyxFQUFDLElBQUksRUFBQyxNQUFNLGFBQWEsQ0FBQztBQUNqQyxPQUFPLEVBQUMsR0FBRyxFQUFDLE1BQU0sWUFBWSxDQUFDO0FBQy9CLE9BQU8sRUFBQyxNQUFNLEVBQUMsTUFBTSxlQUFlLENBQUM7QUFDckMsT0FBTyxFQUFDLElBQUksRUFBQyxNQUFNLGFBQWEsQ0FBQztBQUNqQyxPQUFPLEVBQUMsTUFBTSxFQUFDLE1BQU0sZUFBZSxDQUFDO0FBR3JDLE1BQU0sQ0FBQyxNQUFNLGVBQWUsR0FBZTtJQUN6QyxVQUFVLEVBQUUsS0FBSztJQUNqQixZQUFZLEVBQUUsQ0FBQyxHQUFHLENBQUM7SUFDbkIsUUFBUSxFQUFFLENBQUMsRUFBVSxFQUFFLEtBQWUsRUFBRSxFQUFFO1FBQ3hDLE1BQU0sQ0FBQyxDQUFDLENBQUMsR0FBRyxLQUFLLENBQUM7UUFFbEIsT0FBTztZQUNMLENBQUMsRUFBRSxHQUFHLEVBQUU7Z0JBQ04sTUFBTSxDQUFDLEdBQUcsSUFBSSxDQUFDLEdBQUcsQ0FBQyxNQUFNLENBQUMsQ0FBQyxDQUFDLEVBQUUsTUFBTSxDQUFDLElBQUksQ0FBQyxDQUFDLEVBQUUsU0FBUyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUM7Z0JBQzNELE9BQU8sR0FBRyxDQUFDLEVBQUUsRUFBRSxDQUFDLENBQUMsQ0FBQztZQUNwQixDQUFDO1NBQ0YsQ0FBQztJQUNKLENBQUM7Q0FDRixDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiLyoqXG4gKiBAbGljZW5zZVxuICogQ29weXJpZ2h0IDIwMjAgR29vZ2xlIExMQy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC5cbiAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSBcIkxpY2Vuc2VcIik7XG4gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuXG4gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXRcbiAqXG4gKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjBcbiAqXG4gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlXG4gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiBcIkFTIElTXCIgQkFTSVMsXG4gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC5cbiAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmRcbiAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLlxuICogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbiAqL1xuXG5pbXBvcnQge0FzaW5ofSBmcm9tICcuLi9rZXJuZWxfbmFtZXMnO1xuaW1wb3J0IHtHcmFkQ29uZmlnfSBmcm9tICcuLi9rZXJuZWxfcmVnaXN0cnknO1xuaW1wb3J0IHthZGR9IGZyb20gJy4uL29wcy9hZGQnO1xuaW1wb3J0IHtjYXN0fSBmcm9tICcuLi9vcHMvY2FzdCc7XG5pbXBvcnQge2Rpdn0gZnJvbSAnLi4vb3BzL2Rpdic7XG5pbXBvcnQge3NjYWxhcn0gZnJvbSAnLi4vb3BzL3NjYWxhcic7XG5pbXBvcnQge3NxcnR9IGZyb20gJy4uL29wcy9zcXJ0JztcbmltcG9ydCB7c3F1YXJlfSBmcm9tICcuLi9vcHMvc3F1YXJlJztcbmltcG9ydCB7VGVuc29yfSBmcm9tICcuLi90ZW5zb3InO1xuXG5leHBvcnQgY29uc3QgYXNpbmhHcmFkQ29uZmlnOiBHcmFkQ29uZmlnID0ge1xuICBrZXJuZWxOYW1lOiBBc2luaCxcbiAgaW5wdXRzVG9TYXZlOiBbJ3gnXSxcbiAgZ3JhZEZ1bmM6IChkeTogVGVuc29yLCBzYXZlZDogVGVuc29yW10pID0+IHtcbiAgICBjb25zdCBbeF0gPSBzYXZlZDtcblxuICAgIHJldHVybiB7XG4gICAgICB4OiAoKSA9PiB7XG4gICAgICAgIGNvbnN0IGEgPSBzcXJ0KGFkZChzY2FsYXIoMSksIHNxdWFyZShjYXN0KHgsICdmbG9hdDMyJykpKSk7XG4gICAgICAgIHJldHVybiBkaXYoZHksIGEpO1xuICAgICAgfVxuICAgIH07XG4gIH1cbn07XG4iXX0=","/**\n * @license\n * Copyright 2020 Google LLC. All Rights Reserved.\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n * =============================================================================\n */\nimport { Atan2 } from '../kernel_names';\nimport { add } from '../ops/add';\nimport { assertAndGetBroadcastShape, getReductionAxes } from '../ops/broadcast_util';\nimport { div } from '../ops/div';\nimport { mul } from '../ops/mul';\nimport { neg } from '../ops/neg';\nimport { reshape } from '../ops/reshape';\nimport { square } from '../ops/square';\nimport { sum } from '../ops/sum';\nexport const atan2GradConfig = {\n kernelName: Atan2,\n inputsToSave: ['a', 'b'],\n gradFunc: (dy, saved) => {\n const [a, b] = saved;\n const outShape = assertAndGetBroadcastShape(a.shape, b.shape);\n const derA = () => {\n const d = add(square(a), square(b));\n let res = mul(dy, div(b, d));\n const reduceAxes = getReductionAxes(a.shape, outShape);\n if (reduceAxes.length > 0) {\n res = sum(res, reduceAxes);\n }\n return reshape(res, a.shape);\n };\n const derB = () => {\n const d = add(square(a), square(b));\n let res = neg(mul(dy, div(a, d)));\n const reduceAxes = getReductionAxes(b.shape, outShape);\n if (reduceAxes.length > 0) {\n res = sum(res, reduceAxes);\n }\n return reshape(res, b.shape);\n };\n return { a: derA, b: derB };\n }\n};\n//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiQXRhbjJfZ3JhZC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uLy4uL3RmanMtY29yZS9zcmMvZ3JhZGllbnRzL0F0YW4yX2dyYWQudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUE7Ozs7Ozs7Ozs7Ozs7OztHQWVHO0FBRUgsT0FBTyxFQUFDLEtBQUssRUFBQyxNQUFNLGlCQUFpQixDQUFDO0FBRXRDLE9BQU8sRUFBQyxHQUFHLEVBQUMsTUFBTSxZQUFZLENBQUM7QUFDL0IsT0FBTyxFQUFDLDBCQUEwQixFQUFFLGdCQUFnQixFQUFDLE1BQU0sdUJBQXVCLENBQUM7QUFDbkYsT0FBTyxFQUFDLEdBQUcsRUFBQyxNQUFNLFlBQVksQ0FBQztBQUMvQixPQUFPLEVBQUMsR0FBRyxFQUFDLE1BQU0sWUFBWSxDQUFDO0FBQy9CLE9BQU8sRUFBQyxHQUFHLEVBQUMsTUFBTSxZQUFZLENBQUM7QUFDL0IsT0FBTyxFQUFDLE9BQU8sRUFBQyxNQUFNLGdCQUFnQixDQUFDO0FBQ3ZDLE9BQU8sRUFBQyxNQUFNLEVBQUMsTUFBTSxlQUFlLENBQUM7QUFDckMsT0FBTyxFQUFDLEdBQUcsRUFBQyxNQUFNLFlBQVksQ0FBQztBQUcvQixNQUFNLENBQUMsTUFBTSxlQUFlLEdBQWU7SUFDekMsVUFBVSxFQUFFLEtBQUs7SUFDakIsWUFBWSxFQUFFLENBQUMsR0FBRyxFQUFFLEdBQUcsQ0FBQztJQUN4QixRQUFRLEVBQUUsQ0FBQyxFQUFVLEVBQUUsS0FBZSxFQUFFLEVBQUU7UUFDeEMsTUFBTSxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsR0FBRyxLQUFLLENBQUM7UUFDckIsTUFBTSxRQUFRLEdBQUcsMEJBQTBCLENBQUMsQ0FBQyxDQUFDLEtBQUssRUFBRSxDQUFDLENBQUMsS0FBSyxDQUFDLENBQUM7UUFFOUQsTUFBTSxJQUFJLEdBQUcsR0FBRyxFQUFFO1lBQ2hCLE1BQU0sQ0FBQyxHQUFHLEdBQUcsQ0FBQyxNQUFNLENBQUMsQ0FBQyxDQUFDLEVBQUUsTUFBTSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUM7WUFDcEMsSUFBSSxHQUFHLEdBQUcsR0FBRyxDQUFDLEVBQUUsRUFBRSxHQUFHLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUM7WUFDN0IsTUFBTSxVQUFVLEdBQUcsZ0JBQWdCLENBQUMsQ0FBQyxDQUFDLEtBQUssRUFBRSxRQUFRLENBQUMsQ0FBQztZQUN2RCxJQUFJLFVBQVUsQ0FBQyxNQUFNLEdBQUcsQ0FBQyxFQUFFO2dCQUN6QixHQUFHLEdBQUcsR0FBRyxDQUFDLEdBQUcsRUFBRSxVQUFVLENBQUMsQ0FBQzthQUM1QjtZQUNELE9BQU8sT0FBTyxDQUFDLEdBQUcsRUFBRSxDQUFDLENBQUMsS0FBSyxDQUFDLENBQUM7UUFDL0IsQ0FBQyxDQUFDO1FBQ0YsTUFBTSxJQUFJLEdBQUcsR0FBRyxFQUFFO1lBQ2hCLE1BQU0sQ0FBQyxHQUFHLEdBQUcsQ0FBQyxNQUFNLENBQUMsQ0FBQyxDQUFDLEVBQUUsTUFBTSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUM7WUFDcEMsSUFBSSxHQUFHLEdBQUcsR0FBRyxDQUFDLEdBQUcsQ0FBQyxFQUFFLEVBQUUsR0FBRyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUM7WUFDbEMsTUFBTSxVQUFVLEdBQUcsZ0JBQWdCLENBQUMsQ0FBQyxDQUFDLEtBQUssRUFBRSxRQUFRLENBQUMsQ0FBQztZQUN2RCxJQUFJLFVBQVUsQ0FBQyxNQUFNLEdBQUcsQ0FBQyxFQUFFO2dCQUN6QixHQUFHLEdBQUcsR0FBRyxDQUFDLEdBQUcsRUFBRSxVQUFVLENBQUMsQ0FBQzthQUM1QjtZQUNELE9BQU8sT0FBTyxDQUFDLEdBQUcsRUFBRSxDQUFDLENBQUMsS0FBSyxDQUFDLENBQUM7UUFDL0IsQ0FBQyxDQUFDO1FBQ0YsT0FBTyxFQUFDLENBQUMsRUFBRSxJQUFJLEVBQUUsQ0FBQyxFQUFFLElBQUksRUFBQyxDQUFDO0lBQzVCLENBQUM7Q0FDRixDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiLyoqXG4gKiBAbGljZW5zZVxuICogQ29weXJpZ2h0IDIwMjAgR29vZ2xlIExMQy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC5cbiAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSBcIkxpY2Vuc2VcIik7XG4gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuXG4gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXRcbiAqXG4gKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjBcbiAqXG4gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlXG4gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiBcIkFTIElTXCIgQkFTSVMsXG4gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC5cbiAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmRcbiAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLlxuICogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbiAqL1xuXG5pbXBvcnQge0F0YW4yfSBmcm9tICcuLi9rZXJuZWxfbmFtZXMnO1xuaW1wb3J0IHtHcmFkQ29uZmlnfSBmcm9tICcuLi9rZXJuZWxfcmVnaXN0cnknO1xuaW1wb3J0IHthZGR9IGZyb20gJy4uL29wcy9hZGQnO1xuaW1wb3J0IHthc3NlcnRBbmRHZXRCcm9hZGNhc3RTaGFwZSwgZ2V0UmVkdWN0aW9uQXhlc30gZnJvbSAnLi4vb3BzL2Jyb2FkY2FzdF91dGlsJztcbmltcG9ydCB7ZGl2fSBmcm9tICcuLi9vcHMvZGl2JztcbmltcG9ydCB7bXVsfSBmcm9tICcuLi9vcHMvbXVsJztcbmltcG9ydCB7bmVnfSBmcm9tICcuLi9vcHMvbmVnJztcbmltcG9ydCB7cmVzaGFwZX0gZnJvbSAnLi4vb3BzL3Jlc2hhcGUnO1xuaW1wb3J0IHtzcXVhcmV9IGZyb20gJy4uL29wcy9zcXVhcmUnO1xuaW1wb3J0IHtzdW19IGZyb20gJy4uL29wcy9zdW0nO1xuaW1wb3J0IHtUZW5zb3J9IGZyb20gJy4uL3RlbnNvcic7XG5cbmV4cG9ydCBjb25zdCBhdGFuMkdyYWRDb25maWc6IEdyYWRDb25maWcgPSB7XG4gIGtlcm5lbE5hbWU6IEF0YW4yLFxuICBpbnB1dHNUb1NhdmU6IFsnYScsICdiJ10sXG4gIGdyYWRGdW5jOiAoZHk6IFRlbnNvciwgc2F2ZWQ6IFRlbnNvcltdKSA9PiB7XG4gICAgY29uc3QgW2EsIGJdID0gc2F2ZWQ7XG4gICAgY29uc3Qgb3V0U2hhcGUgPSBhc3NlcnRBbmRHZXRCcm9hZGNhc3RTaGFwZShhLnNoYXBlLCBiLnNoYXBlKTtcblxuICAgIGNvbnN0IGRlckEgPSAoKSA9PiB7XG4gICAgICBjb25zdCBkID0gYWRkKHNxdWFyZShhKSwgc3F1YXJlKGIpKTtcbiAgICAgIGxldCByZXMgPSBtdWwoZHksIGRpdihiLCBkKSk7XG4gICAgICBjb25zdCByZWR1Y2VBeGVzID0gZ2V0UmVkdWN0aW9uQXhlcyhhLnNoYXBlLCBvdXRTaGFwZSk7XG4gICAgICBpZiAocmVkdWNlQXhlcy5sZW5ndGggPiAwKSB7XG4gICAgICAgIHJlcyA9IHN1bShyZXMsIHJlZHVjZUF4ZXMpO1xuICAgICAgfVxuICAgICAgcmV0dXJuIHJlc2hhcGUocmVzLCBhLnNoYXBlKTtcbiAgICB9O1xuICAgIGNvbnN0IGRlckIgPSAoKSA9PiB7XG4gICAgICBjb25zdCBkID0gYWRkKHNxdWFyZShhKSwgc3F1YXJlKGIpKTtcbiAgICAgIGxldCByZXMgPSBuZWcobXVsKGR5LCBkaXYoYSwgZCkpKTtcbiAgICAgIGNvbnN0IHJlZHVjZUF4ZXMgPSBnZXRSZWR1Y3Rpb25BeGVzKGIuc2hhcGUsIG91dFNoYXBlKTtcbiAgICAgIGlmIChyZWR1Y2VBeGVzLmxlbmd0aCA+IDApIHtcbiAgICAgICAgcmVzID0gc3VtKHJlcywgcmVkdWNlQXhlcyk7XG4gICAgICB9XG4gICAgICByZXR1cm4gcmVzaGFwZShyZXMsIGIuc2hhcGUpO1xuICAgIH07XG4gICAgcmV0dXJuIHthOiBkZXJBLCBiOiBkZXJCfTtcbiAgfVxufTtcbiJdfQ==","/**\n * @license\n * Copyright 2020 Google LLC. All Rights Reserved.\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n * =============================================================================\n */\nimport { Atan } from '../kernel_names';\nimport { add } from '../ops/add';\nimport { cast } from '../ops/cast';\nimport { div } from '../ops/div';\nimport { square } from '../ops/square';\nexport const atanGradConfig = {\n kernelName: Atan,\n inputsToSave: ['x'],\n gradFunc: (dy, saved) => {\n const [x] = saved;\n return { x: () => div(dy, add(square(cast(x, 'float32')), 1)) };\n }\n};\n//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiQXRhbl9ncmFkLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vLi4vdGZqcy1jb3JlL3NyYy9ncmFkaWVudHMvQXRhbl9ncmFkLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBOzs7Ozs7Ozs7Ozs7Ozs7R0FlRztBQUVILE9BQU8sRUFBQyxJQUFJLEVBQUMsTUFBTSxpQkFBaUIsQ0FBQztBQUVyQyxPQUFPLEVBQUMsR0FBRyxFQUFDLE1BQU0sWUFBWSxDQUFDO0FBQy9CLE9BQU8sRUFBQyxJQUFJLEVBQUMsTUFBTSxhQUFhLENBQUM7QUFDakMsT0FBTyxFQUFDLEdBQUcsRUFBQyxNQUFNLFlBQVksQ0FBQztBQUMvQixPQUFPLEVBQUMsTUFBTSxFQUFDLE1BQU0sZUFBZSxDQUFDO0FBR3JDLE1BQU0sQ0FBQyxNQUFNLGNBQWMsR0FBZTtJQUN4QyxVQUFVLEVBQUUsSUFBSTtJQUNoQixZQUFZLEVBQUUsQ0FBQyxHQUFHLENBQUM7SUFDbkIsUUFBUSxFQUFFLENBQUMsRUFBVSxFQUFFLEtBQWUsRUFBRSxFQUFFO1FBQ3hDLE1BQU0sQ0FBQyxDQUFDLENBQUMsR0FBRyxLQUFLLENBQUM7UUFFbEIsT0FBTyxFQUFDLENBQUMsRUFBRSxHQUFHLEVBQUUsQ0FBQyxHQUFHLENBQUMsRUFBRSxFQUFFLEdBQUcsQ0FBQyxNQUFNLENBQUMsSUFBSSxDQUFDLENBQUMsRUFBRSxTQUFTLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLEVBQUMsQ0FBQztJQUNoRSxDQUFDO0NBQ0YsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbIi8qKlxuICogQGxpY2Vuc2VcbiAqIENvcHlyaWdodCAyMDIwIEdvb2dsZSBMTEMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuXG4gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgXCJMaWNlbnNlXCIpO1xuICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLlxuICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0XG4gKlxuICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wXG4gKlxuICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZVxuICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gXCJBUyBJU1wiIEJBU0lTLFxuICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuXG4gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kXG4gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS5cbiAqID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4gKi9cblxuaW1wb3J0IHtBdGFufSBmcm9tICcuLi9rZXJuZWxfbmFtZXMnO1xuaW1wb3J0IHtHcmFkQ29uZmlnfSBmcm9tICcuLi9rZXJuZWxfcmVnaXN0cnknO1xuaW1wb3J0IHthZGR9IGZyb20gJy4uL29wcy9hZGQnO1xuaW1wb3J0IHtjYXN0fSBmcm9tICcuLi9vcHMvY2FzdCc7XG5pbXBvcnQge2Rpdn0gZnJvbSAnLi4vb3BzL2Rpdic7XG5pbXBvcnQge3NxdWFyZX0gZnJvbSAnLi4vb3BzL3NxdWFyZSc7XG5pbXBvcnQge1RlbnNvcn0gZnJvbSAnLi4vdGVuc29yJztcblxuZXhwb3J0IGNvbnN0IGF0YW5HcmFkQ29uZmlnOiBHcmFkQ29uZmlnID0ge1xuICBrZXJuZWxOYW1lOiBBdGFuLFxuICBpbnB1dHNUb1NhdmU6IFsneCddLFxuICBncmFkRnVuYzogKGR5OiBUZW5zb3IsIHNhdmVkOiBUZW5zb3JbXSkgPT4ge1xuICAgIGNvbnN0IFt4XSA9IHNhdmVkO1xuXG4gICAgcmV0dXJuIHt4OiAoKSA9PiBkaXYoZHksIGFkZChzcXVhcmUoY2FzdCh4LCAnZmxvYXQzMicpKSwgMSkpfTtcbiAgfVxufTtcbiJdfQ==","/**\n * @license\n * Copyright 2020 Google LLC. All Rights Reserved.\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n * =============================================================================\n */\nimport { Atanh } from '../kernel_names';\nimport { cast } from '../ops/cast';\nimport { div } from '../ops/div';\nimport { square } from '../ops/square';\nimport { sub } from '../ops/sub';\nimport { scalar } from '../ops/scalar';\nexport const atanhGradConfig = {\n kernelName: Atanh,\n inputsToSave: ['x'],\n gradFunc: (dy, saved) => {\n const [x] = saved;\n return { x: () => div(dy, sub(scalar(1), square(cast(x, 'float32')))) };\n }\n};\n//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiQXRhbmhfZ3JhZC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uLy4uL3RmanMtY29yZS9zcmMvZ3JhZGllbnRzL0F0YW5oX2dyYWQudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUE7Ozs7Ozs7Ozs7Ozs7OztHQWVHO0FBRUgsT0FBTyxFQUFDLEtBQUssRUFBQyxNQUFNLGlCQUFpQixDQUFDO0FBRXRDLE9BQU8sRUFBQyxJQUFJLEVBQUMsTUFBTSxhQUFhLENBQUM7QUFDakMsT0FBTyxFQUFDLEdBQUcsRUFBQyxNQUFNLFlBQVksQ0FBQztBQUMvQixPQUFPLEVBQUMsTUFBTSxFQUFDLE1BQU0sZUFBZSxDQUFDO0FBQ3JDLE9BQU8sRUFBQyxHQUFHLEVBQUMsTUFBTSxZQUFZLENBQUM7QUFDL0IsT0FBTyxFQUFDLE1BQU0sRUFBQyxNQUFNLGVBQWUsQ0FBQztBQUdyQyxNQUFNLENBQUMsTUFBTSxlQUFlLEdBQWU7SUFDekMsVUFBVSxFQUFFLEtBQUs7SUFDakIsWUFBWSxFQUFFLENBQUMsR0FBRyxDQUFDO0lBQ25CLFFBQVEsRUFBRSxDQUFDLEVBQVUsRUFBRSxLQUFlLEVBQUUsRUFBRTtRQUN4QyxNQUFNLENBQUMsQ0FBQyxDQUFDLEdBQUcsS0FBSyxDQUFDO1FBRWxCLE9BQU8sRUFBQyxDQUFDLEVBQUUsR0FBRyxFQUFFLENBQUMsR0FBRyxDQUFDLEVBQUUsRUFBRSxHQUFHLENBQUMsTUFBTSxDQUFDLENBQUMsQ0FBQyxFQUFFLE1BQU0sQ0FBQyxJQUFJLENBQUMsQ0FBQyxFQUFFLFNBQVMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxFQUFDLENBQUM7SUFDeEUsQ0FBQztDQUNGLENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyIvKipcbiAqIEBsaWNlbnNlXG4gKiBDb3B5cmlnaHQgMjAyMCBHb29nbGUgTExDLiBBbGwgUmlnaHRzIFJlc2VydmVkLlxuICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlIFwiTGljZW5zZVwiKTtcbiAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS5cbiAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdFxuICpcbiAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMFxuICpcbiAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmVcbiAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuIFwiQVMgSVNcIiBCQVNJUyxcbiAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLlxuICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZFxuICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuXG4gKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuICovXG5cbmltcG9ydCB7QXRhbmh9IGZyb20gJy4uL2tlcm5lbF9uYW1lcyc7XG5pbXBvcnQge0dyYWRDb25maWd9IGZyb20gJy4uL2tlcm5lbF9yZWdpc3RyeSc7XG5pbXBvcnQge2Nhc3R9IGZyb20gJy4uL29wcy9jYXN0JztcbmltcG9ydCB7ZGl2fSBmcm9tICcuLi9vcHMvZGl2JztcbmltcG9ydCB7c3F1YXJlfSBmcm9tICcuLi9vcHMvc3F1YXJlJztcbmltcG9ydCB7c3VifSBmcm9tICcuLi9vcHMvc3ViJztcbmltcG9ydCB7c2NhbGFyfSBmcm9tICcuLi9vcHMvc2NhbGFyJztcbmltcG9ydCB7VGVuc29yfSBmcm9tICcuLi90ZW5zb3InO1xuXG5leHBvcnQgY29uc3QgYXRhbmhHcmFkQ29uZmlnOiBHcmFkQ29uZmlnID0ge1xuICBrZXJuZWxOYW1lOiBBdGFuaCxcbiAgaW5wdXRzVG9TYXZlOiBbJ3gnXSxcbiAgZ3JhZEZ1bmM6IChkeTogVGVuc29yLCBzYXZlZDogVGVuc29yW10pID0+IHtcbiAgICBjb25zdCBbeF0gPSBzYXZlZDtcblxuICAgIHJldHVybiB7eDogKCkgPT4gZGl2KGR5LCBzdWIoc2NhbGFyKDEpLCBzcXVhcmUoY2FzdCh4LCAnZmxvYXQzMicpKSkpfTtcbiAgfVxufTtcbiJdfQ==","/**\n * @license\n * Copyright 2020 Google LLC. All Rights Reserved.\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n * =============================================================================\n */\nimport { ENGINE } from '../engine';\nimport { AvgPool3DGrad } from '../kernel_names';\nimport { convertToTensor } from '../tensor_util_env';\nimport * as util from '../util';\nimport { checkPadOnDimRoundingMode } from './conv_util';\nimport { op } from './operation';\nimport { reshape } from './reshape';\n/**\n * Computes the backprop of a 3d avg pool.\n *\n * @param dy The dy error, of rank 5 of shape\n * [batchSize, depth, height, width, channels].\n * assumed.\n * @param input The original input image, of rank 5 or rank4 of shape\n * [batchSize, depth, height, width, channels].\n * @param filterSize The filter size:\n * `[filterDepth, filterHeight, filterWidth]`.\n * `filterSize` is a single number,\n * then `filterDepth == filterHeight == filterWidth`.\n * @param strides The strides of the pooling:\n * `[strideDepth, strideHeight, strideWidth]`. If\n * `strides` is a single number, then `strideHeight == strideWidth`.\n * @param pad A string from: 'same', 'valid'. The type of padding algorithm\n * used in the forward prop of the op.\n * @param dimRoundingMode A string from: 'ceil', 'round', 'floor'. If none is\n * provided, it will default to truncate.\n */\nfunction avgPool3dGrad_(dy, input, filterSize, strides, pad, dimRoundingMode) {\n const $dy = convertToTensor(dy, 'dy', 'avgPool3dGrad');\n const $input = convertToTensor(input, 'input', 'avgPool3dGrad');\n let dy5D = $dy;\n let input5D = $input;\n let reshapedTo5D = false;\n if ($input.rank === 4) {\n reshapedTo5D = true;\n dy5D = reshape($dy, [1, $dy.shape[0], $dy.shape[1], $dy.shape[2], $dy.shape[3]]);\n input5D = reshape($input, [\n 1, $input.shape[0], $input.shape[1], $input.shape[2], $input.shape[3]\n ]);\n }\n util.assert(dy5D.rank === 5, () => `Error in avgPool3dGrad: dy must be rank 5 but got rank ` +\n `${dy5D.rank}.`);\n util.assert(input5D.rank === 5, () => `Error in avgPool3dGrad: input must be rank 5 but got rank ` +\n `${input5D.rank}.`);\n checkPadOnDimRoundingMode('avgPool3dGrad', pad, dimRoundingMode);\n const inputs = { dy: dy5D, input: input5D };\n const attrs = { filterSize, strides, pad, dimRoundingMode };\n // tslint:disable-next-line: no-unnecessary-type-assertion\n const res = ENGINE.runKernel(AvgPool3DGrad, inputs, attrs);\n if (reshapedTo5D) {\n return reshape(res, [res.shape[1], res.shape[2], res.shape[3], res.shape[4]]);\n }\n return res;\n}\nexport const avgPool3dGrad = op({ avgPool3dGrad_ });\n//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYXZnX3Bvb2xfM2RfZ3JhZC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uLy4uL3RmanMtY29yZS9zcmMvb3BzL2F2Z19wb29sXzNkX2dyYWQudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQ0E7Ozs7Ozs7Ozs7Ozs7OztHQWVHO0FBRUgsT0FBTyxFQUFDLE1BQU0sRUFBQyxNQUFNLFdBQVcsQ0FBQztBQUNqQyxPQUFPLEVBQUMsYUFBYSxFQUEwQyxNQUFNLGlCQUFpQixDQUFDO0FBSXZGLE9BQU8sRUFBQyxlQUFlLEVBQUMsTUFBTSxvQkFBb0IsQ0FBQztBQUVuRCxPQUFPLEtBQUssSUFBSSxNQUFNLFNBQVMsQ0FBQztBQUVoQyxPQUFPLEVBQUMseUJBQXlCLEVBQUMsTUFBTSxhQUFhLENBQUM7QUFDdEQsT0FBTyxFQUFDLEVBQUUsRUFBQyxNQUFNLGFBQWEsQ0FBQztBQUMvQixPQUFPLEVBQUMsT0FBTyxFQUFDLE1BQU0sV0FBVyxDQUFDO0FBRWxDOzs7Ozs7Ozs7Ozs7Ozs7Ozs7O0dBbUJHO0FBQ0gsU0FBUyxjQUFjLENBQ25CLEVBQWdCLEVBQUUsS0FBbUIsRUFDckMsVUFBMkMsRUFDM0MsT0FBd0MsRUFBRSxHQUEwQixFQUNwRSxlQUF3QztJQUMxQyxNQUFNLEdBQUcsR0FBRyxlQUFlLENBQUMsRUFBRSxFQUFFLElBQUksRUFBRSxlQUFlLENBQUMsQ0FBQztJQUN2RCxNQUFNLE1BQU0sR0FBRyxlQUFlLENBQUMsS0FBSyxFQUFFLE9BQU8sRUFBRSxlQUFlLENBQUMsQ0FBQztJQUVoRSxJQUFJLElBQUksR0FBRyxHQUFlLENBQUM7SUFDM0IsSUFBSSxPQUFPLEdBQUcsTUFBa0IsQ0FBQztJQUNqQyxJQUFJLFlBQVksR0FBRyxLQUFLLENBQUM7SUFFekIsSUFBSSxNQUFNLENBQUMsSUFBSSxLQUFLLENBQUMsRUFBRTtRQUNyQixZQUFZLEdBQUcsSUFBSSxDQUFDO1FBQ3BCLElBQUksR0FBRyxPQUFPLENBQ1YsR0FBRyxFQUFFLENBQUMsQ0FBQyxFQUFFLEdBQUcsQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDLEVBQUUsR0FBRyxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUMsRUFBRSxHQUFHLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQyxFQUFFLEdBQUcsQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDO1FBQ3RFLE9BQU8sR0FBRyxPQUFPLENBQUMsTUFBTSxFQUFFO1lBQ3hCLENBQUMsRUFBRSxNQUFNLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQyxFQUFFLE1BQU0sQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDLEVBQUUsTUFBTSxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUMsRUFBRSxNQUFNLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQztTQUN0RSxDQUFDLENBQUM7S0FDSjtJQUVELElBQUksQ0FBQyxNQUFNLENBQ1AsSUFBSSxDQUFDLElBQUksS0FBSyxDQUFDLEVBQ2YsR0FBRyxFQUFFLENBQUMseURBQXlEO1FBQzNELEdBQUcsSUFBSSxDQUFDLElBQUksR0FBRyxDQUFDLENBQUM7SUFDekIsSUFBSSxDQUFDLE1BQU0sQ0FDUCxPQUFPLENBQUMsSUFBSSxLQUFLLENBQUMsRUFDbEIsR0FBRyxFQUFFLENBQUMsNERBQTREO1FBQzlELEdBQUcsT0FBTyxDQUFDLElBQUksR0FBRyxDQUFDLENBQUM7SUFDNUIseUJBQXlCLENBQUMsZUFBZSxFQUFFLEdBQUcsRUFBRSxlQUFlLENBQUMsQ0FBQztJQUNqRSxNQUFNLE1BQU0sR0FBd0IsRUFBQyxFQUFFLEVBQUUsSUFBSSxFQUFFLEtBQUssRUFBRSxPQUFPLEVBQUMsQ0FBQztJQUMvRCxNQUFNLEtBQUssR0FBdUIsRUFBQyxVQUFVLEVBQUUsT0FBTyxFQUFFLEdBQUcsRUFBRSxlQUFlLEVBQUMsQ0FBQztJQUU5RSwwREFBMEQ7SUFDMUQsTUFBTSxHQUFHLEdBQUcsTUFBTSxDQUFDLFNBQVMsQ0FDWixhQUFhLEVBQUUsTUFBOEIsRUFDN0MsS0FBMkIsQ0FBTSxDQUFDO0lBRWxELElBQUksWUFBWSxFQUFFO1FBQ2hCLE9BQU8sT0FBTyxDQUNILEdBQUcsRUFBRSxDQUFDLEdBQUcsQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDLEVBQUUsR0FBRyxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUMsRUFBRSxHQUFHLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQyxFQUFFLEdBQUcsQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FDbkUsQ0FBQztLQUNQO0lBRUQsT0FBTyxHQUFHLENBQUM7QUFDYixDQUFDO0FBRUQsTUFBTSxDQUFDLE1BQU0sYUFBYSxHQUFHLEVBQUUsQ0FBQyxFQUFDLGNBQWMsRUFBQyxDQUFDLENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyJcbi8qKlxuICogQGxpY2Vuc2VcbiAqIENvcHlyaWdodCAyMDIwIEdvb2dsZSBMTEMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuXG4gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgXCJMaWNlbnNlXCIpO1xuICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLlxuICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0XG4gKlxuICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wXG4gKlxuICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZVxuICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gXCJBUyBJU1wiIEJBU0lTLFxuICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuXG4gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kXG4gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS5cbiAqID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4gKi9cblxuaW1wb3J0IHtFTkdJTkV9IGZyb20gJy4uL2VuZ2luZSc7XG5pbXBvcnQge0F2Z1Bvb2wzREdyYWQsIEF2Z1Bvb2wzREdyYWRBdHRycywgQXZnUG9vbDNER3JhZElucHV0c30gZnJvbSAnLi4va2VybmVsX25hbWVzJztcbmltcG9ydCB7TmFtZWRBdHRyTWFwfSBmcm9tICcuLi9rZXJuZWxfcmVnaXN0cnknO1xuaW1wb3J0IHtUZW5zb3I0RCwgVGVuc29yNUR9IGZyb20gJy4uL3RlbnNvcic7XG5pbXBvcnQge05hbWVkVGVuc29yTWFwfSBmcm9tICcuLi90ZW5zb3JfdHlwZXMnO1xuaW1wb3J0IHtjb252ZXJ0VG9UZW5zb3J9IGZyb20gJy4uL3RlbnNvcl91dGlsX2Vudic7XG5pbXBvcnQge1RlbnNvckxpa2V9IGZyb20gJy4uL3R5cGVzJztcbmltcG9ydCAqIGFzIHV0aWwgZnJvbSAnLi4vdXRpbCc7XG5cbmltcG9ydCB7Y2hlY2tQYWRPbkRpbVJvdW5kaW5nTW9kZX0gZnJvbSAnLi9jb252X3V0aWwnO1xuaW1wb3J0IHtvcH0gZnJvbSAnLi9vcGVyYXRpb24nO1xuaW1wb3J0IHtyZXNoYXBlfSBmcm9tICcuL3Jlc2hhcGUnO1xuXG4vKipcbiAqIENvbXB1dGVzIHRoZSBiYWNrcHJvcCBvZiBhIDNkIGF2ZyBwb29sLlxuICpcbiAqIEBwYXJhbSBkeSBUaGUgZHkgZXJyb3IsIG9mIHJhbmsgNSBvZiBzaGFwZVxuICogICAgIFtiYXRjaFNpemUsIGRlcHRoLCBoZWlnaHQsIHdpZHRoLCBjaGFubmVsc10uXG4gKiBhc3N1bWVkLlxuICogQHBhcmFtIGlucHV0IFRoZSBvcmlnaW5hbCBpbnB1dCBpbWFnZSwgb2YgcmFuayA1IG9yIHJhbms0IG9mIHNoYXBlXG4gKiAgICAgW2JhdGNoU2l6ZSwgZGVwdGgsIGhlaWdodCwgd2lkdGgsIGNoYW5uZWxzXS5cbiAqIEBwYXJhbSBmaWx0ZXJTaXplIFRoZSBmaWx0ZXIgc2l6ZTpcbiAqICAgICBgW2ZpbHRlckRlcHRoLCBmaWx0ZXJIZWlnaHQsIGZpbHRlcldpZHRoXWAuXG4gKiAgICAgYGZpbHRlclNpemVgIGlzIGEgc2luZ2xlIG51bWJlcixcbiAqICAgICB0aGVuIGBmaWx0ZXJEZXB0aCA9PSBmaWx0ZXJIZWlnaHQgPT0gZmlsdGVyV2lkdGhgLlxuICogQHBhcmFtIHN0cmlkZXMgVGhlIHN0cmlkZXMgb2YgdGhlIHBvb2xpbmc6XG4gKiAgICAgYFtzdHJpZGVEZXB0aCwgc3RyaWRlSGVpZ2h0LCBzdHJpZGVXaWR0aF1gLiBJZlxuICogICAgIGBzdHJpZGVzYCBpcyBhIHNpbmdsZSBudW1iZXIsIHRoZW4gYHN0cmlkZUhlaWdodCA9PSBzdHJpZGVXaWR0aGAuXG4gKiBAcGFyYW0gcGFkIEEgc3RyaW5nIGZyb206ICdzYW1lJywgJ3ZhbGlkJy4gVGhlIHR5cGUgb2YgcGFkZGluZyBhbGdvcml0aG1cbiAqICAgICB1c2VkIGluIHRoZSBmb3J3YXJkIHByb3Agb2YgdGhlIG9wLlxuICogQHBhcmFtIGRpbVJvdW5kaW5nTW9kZSBBIHN0cmluZyBmcm9tOiAnY2VpbCcsICdyb3VuZCcsICdmbG9vcicuIElmIG5vbmUgaXNcbiAqICAgICBwcm92aWRlZCwgaXQgd2lsbCBkZWZhdWx0IHRvIHRydW5jYXRlLlxuICovXG5mdW5jdGlvbiBhdmdQb29sM2RHcmFkXzxUIGV4dGVuZHMgVGVuc29yNER8VGVuc29yNUQ+KFxuICAgIGR5OiBUfFRlbnNvckxpa2UsIGlucHV0OiBUfFRlbnNvckxpa2UsXG4gICAgZmlsdGVyU2l6ZTogW251bWJlciwgbnVtYmVyLCBudW1iZXJdfG51bWJlcixcbiAgICBzdHJpZGVzOiBbbnVtYmVyLCBudW1iZXIsIG51bWJlcl18bnVtYmVyLCBwYWQ6ICd2YWxpZCd8J3NhbWUnfG51bWJlcixcbiAgICBkaW1Sb3VuZGluZ01vZGU/OiAnZmxvb3InfCdyb3VuZCd8J2NlaWwnKTogVCB7XG4gIGNvbnN0ICRkeSA9IGNvbnZlcnRUb1RlbnNvcihkeSwgJ2R5JywgJ2F2Z1Bvb2wzZEdyYWQnKTtcbiAgY29uc3QgJGlucHV0ID0gY29udmVydFRvVGVuc29yKGlucHV0LCAnaW5wdXQnLCAnYXZnUG9vbDNkR3JhZCcpO1xuXG4gIGxldCBkeTVEID0gJGR5IGFzIFRlbnNvcjVEO1xuICBsZXQgaW5wdXQ1RCA9ICRpbnB1dCBhcyBUZW5zb3I1RDtcbiAgbGV0IHJlc2hhcGVkVG81RCA9IGZhbHNlO1xuXG4gIGlmICgkaW5wdXQucmFuayA9PT0gNCkge1xuICAgIHJlc2hhcGVkVG81RCA9IHRydWU7XG4gICAgZHk1RCA9IHJlc2hhcGUoXG4gICAgICAgICRkeSwgWzEsICRkeS5zaGFwZVswXSwgJGR5LnNoYXBlWzFdLCAkZHkuc2hhcGVbMl0sICRkeS5zaGFwZVszXV0pO1xuICAgIGlucHV0NUQgPSByZXNoYXBlKCRpbnB1dCwgW1xuICAgICAgMSwgJGlucHV0LnNoYXBlWzBdLCAkaW5wdXQuc2hhcGVbMV0sICRpbnB1dC5zaGFwZVsyXSwgJGlucHV0LnNoYXBlWzNdXG4gICAgXSk7XG4gIH1cblxuICB1dGlsLmFzc2VydChcbiAgICAgIGR5NUQucmFuayA9PT0gNSxcbiAgICAgICgpID0+IGBFcnJvciBpbiBhdmdQb29sM2RHcmFkOiBkeSBtdXN0IGJlIHJhbmsgNSBidXQgZ290IHJhbmsgYCArXG4gICAgICAgICAgYCR7ZHk1RC5yYW5rfS5gKTtcbiAgdXRpbC5hc3NlcnQoXG4gICAgICBpbnB1dDVELnJhbmsgPT09IDUsXG4gICAgICAoKSA9PiBgRXJyb3IgaW4gYXZnUG9vbDNkR3JhZDogaW5wdXQgbXVzdCBiZSByYW5rIDUgYnV0IGdvdCByYW5rIGAgK1xuICAgICAgICAgIGAke2lucHV0NUQucmFua30uYCk7XG4gIGNoZWNrUGFkT25EaW1Sb3VuZGluZ01vZGUoJ2F2Z1Bvb2wzZEdyYWQnLCBwYWQsIGRpbVJvdW5kaW5nTW9kZSk7XG4gIGNvbnN0IGlucHV0czogQXZnUG9vbDNER3JhZElucHV0cyA9IHtkeTogZHk1RCwgaW5wdXQ6IGlucHV0NUR9O1xuICBjb25zdCBhdHRyczogQXZnUG9vbDNER3JhZEF0dHJzID0ge2ZpbHRlclNpemUsIHN0cmlkZXMsIHBhZCwgZGltUm91bmRpbmdNb2RlfTtcblxuICAvLyB0c2xpbnQ6ZGlzYWJsZS1uZXh0LWxpbmU6IG5vLXVubmVjZXNzYXJ5LXR5cGUtYXNzZXJ0aW9uXG4gIGNvbnN0IHJlcyA9IEVOR0lORS5ydW5LZXJuZWwoXG4gICAgICAgICAgICAgICAgICBBdmdQb29sM0RHcmFkLCBpbnB1dHMgYXMge30gYXMgTmFtZWRUZW5zb3JNYXAsXG4gICAgICAgICAgICAgICAgICBhdHRycyBhcyB7fSBhcyBOYW1lZEF0dHJNYXApIGFzIFQ7XG5cbiAgaWYgKHJlc2hhcGVkVG81RCkge1xuICAgIHJldHVybiByZXNoYXBlKFxuICAgICAgICAgICAgICAgcmVzLCBbcmVzLnNoYXBlWzFdLCByZXMuc2hhcGVbMl0sIHJlcy5zaGFwZVszXSwgcmVzLnNoYXBlWzRdXSkgYXNcbiAgICAgICAgVDtcbiAgfVxuXG4gIHJldHVybiByZXM7XG59XG5cbmV4cG9ydCBjb25zdCBhdmdQb29sM2RHcmFkID0gb3Aoe2F2Z1Bvb2wzZEdyYWRffSk7XG4iXX0=","/**\n * @license\n * Copyright 2020 Google LLC. All Rights Reserved.\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n * =============================================================================\n */\nimport { AvgPool3D } from '../kernel_names';\nimport { avgPool3dGrad } from '../ops/avg_pool_3d_grad';\nexport const avgPool3DGradConfig = {\n kernelName: AvgPool3D,\n inputsToSave: ['x'],\n gradFunc: (dy, saved, attrs) => {\n const [x] = saved;\n const { filterSize, strides, pad, dimRoundingMode } = attrs;\n return {\n x: () => avgPool3dGrad(dy, x, filterSize, strides, pad, dimRoundingMode)\n };\n }\n};\n//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiQXZnUG9vbDNEX2dyYWQuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi8uLi90ZmpzLWNvcmUvc3JjL2dyYWRpZW50cy9BdmdQb29sM0RfZ3JhZC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQTs7Ozs7Ozs7Ozs7Ozs7O0dBZUc7QUFFSCxPQUFPLEVBQUMsU0FBUyxFQUFpQixNQUFNLGlCQUFpQixDQUFDO0FBRTFELE9BQU8sRUFBQyxhQUFhLEVBQUMsTUFBTSx5QkFBeUIsQ0FBQztBQUd0RCxNQUFNLENBQUMsTUFBTSxtQkFBbUIsR0FBZTtJQUM3QyxVQUFVLEVBQUUsU0FBUztJQUNyQixZQUFZLEVBQUUsQ0FBQyxHQUFHLENBQUM7SUFDbkIsUUFBUSxFQUFFLENBQUMsRUFBVSxFQUFFLEtBQWUsRUFBRSxLQUFtQixFQUFFLEVBQUU7UUFDN0QsTUFBTSxDQUFDLENBQUMsQ0FBQyxHQUFHLEtBQW1CLENBQUM7UUFDaEMsTUFBTSxFQUFDLFVBQVUsRUFBRSxPQUFPLEVBQUUsR0FBRyxFQUFFLGVBQWUsRUFBQyxHQUM3QyxLQUE2QixDQUFDO1FBRWxDLE9BQU87WUFDTCxDQUFDLEVBQUUsR0FBRyxFQUFFLENBQUMsYUFBYSxDQUNsQixFQUFjLEVBQUUsQ0FBQyxFQUFFLFVBQVUsRUFBRSxPQUFPLEVBQUUsR0FBRyxFQUFFLGVBQWUsQ0FBQztTQUNsRSxDQUFDO0lBQ0osQ0FBQztDQUNGLENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyIvKipcbiAqIEBsaWNlbnNlXG4gKiBDb3B5cmlnaHQgMjAyMCBHb29nbGUgTExDLiBBbGwgUmlnaHRzIFJlc2VydmVkLlxuICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlIFwiTGljZW5zZVwiKTtcbiAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS5cbiAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdFxuICpcbiAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMFxuICpcbiAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmVcbiAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuIFwiQVMgSVNcIiBCQVNJUyxcbiAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLlxuICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZFxuICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuXG4gKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuICovXG5cbmltcG9ydCB7QXZnUG9vbDNELCBBdmdQb29sM0RBdHRyc30gZnJvbSAnLi4va2VybmVsX25hbWVzJztcbmltcG9ydCB7R3JhZENvbmZpZywgTmFtZWRBdHRyTWFwfSBmcm9tICcuLi9rZXJuZWxfcmVnaXN0cnknO1xuaW1wb3J0IHthdmdQb29sM2RHcmFkfSBmcm9tICcuLi9vcHMvYXZnX3Bvb2xfM2RfZ3JhZCc7XG5pbXBvcnQge1RlbnNvciwgVGVuc29yNUR9IGZyb20gJy4uL3RlbnNvcic7XG5cbmV4cG9ydCBjb25zdCBhdmdQb29sM0RHcmFkQ29uZmlnOiBHcmFkQ29uZmlnID0ge1xuICBrZXJuZWxOYW1lOiBBdmdQb29sM0QsXG4gIGlucHV0c1RvU2F2ZTogWyd4J10sXG4gIGdyYWRGdW5jOiAoZHk6IFRlbnNvciwgc2F2ZWQ6IFRlbnNvcltdLCBhdHRyczogTmFtZWRBdHRyTWFwKSA9PiB7XG4gICAgY29uc3QgW3hdID0gc2F2ZWQgYXMgW1RlbnNvcjVEXTtcbiAgICBjb25zdCB7ZmlsdGVyU2l6ZSwgc3RyaWRlcywgcGFkLCBkaW1Sb3VuZGluZ01vZGV9ID1cbiAgICAgICAgYXR0cnMgYXMge30gYXMgQXZnUG9vbDNEQXR0cnM7XG5cbiAgICByZXR1cm4ge1xuICAgICAgeDogKCkgPT4gYXZnUG9vbDNkR3JhZChcbiAgICAgICAgICBkeSBhcyBUZW5zb3I1RCwgeCwgZmlsdGVyU2l6ZSwgc3RyaWRlcywgcGFkLCBkaW1Sb3VuZGluZ01vZGUpXG4gICAgfTtcbiAgfVxufTtcbiJdfQ==","/**\n * @license\n * Copyright 2020 Google LLC. All Rights Reserved.\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n * =============================================================================\n */\nimport { ENGINE } from '../engine';\nimport { AvgPoolGrad } from '../kernel_names';\nimport { convertToTensor } from '../tensor_util_env';\nimport * as util from '../util';\nimport { op } from './operation';\nimport { reshape } from './reshape';\n/**\n * Computes the backprop of an 2D avg pool.\n *\n * @param dy The dy error, of rank 4 or rank 3 of shape\n * [batchSize, height, width, channels]. If rank 3, batch of 1 is\n * assumed.\n * @param input The input image, of rank 4 or rank 3 of shape\n * [batchSize, height, width, channels]. If rank 3, batch of 1 is\n * assumed.\n * @param filterSize The filter size: `[filterHeight, filterWidth]`. If\n * `filterSize` is a single number, then `filterHeight == filterWidth`.\n * @param strides The strides of the pooling: `[strideHeight, strideWidth]`. If\n * `strides` is a single number, then `strideHeight == strideWidth`.\n * @param pad The type of padding algorithm used in the forward prop of the op.\n * 'same', 'valid', for more info, see this guide:\n * [https://www.tensorflow.org/api_docs/python/tf/nn/convolution](\n * https://www.tensorflow.org/api_docs/python/tf/nn/convolution)\n */\nfunction avgPoolGrad_(dy, input, filterSize, strides, pad) {\n const $dy = convertToTensor(dy, 'dy', 'avgPoolGrad');\n const $input = convertToTensor(input, 'input', 'avgPoolGrad');\n util.assert($input.rank === $dy.rank, () => `Rank of input (${$input.rank}) does not match rank of dy (${$dy.rank})`);\n let input4D = $input;\n let dy4D = $dy;\n let reshapedTo4D = false;\n if ($input.rank === 3) {\n reshapedTo4D = true;\n input4D =\n reshape($input, [1, $input.shape[0], $input.shape[1], $input.shape[2]]);\n dy4D = reshape($dy, [1, $dy.shape[0], $dy.shape[1], $dy.shape[2]]);\n }\n util.assert(dy4D.rank === 4, () => `Error in avgPoolGrad: dy must be rank 4 but got rank ` +\n `${dy4D.rank}.`);\n util.assert(input4D.rank === 4, () => `Error in avgPoolGrad: input must be rank 4 but got rank ` +\n `${input4D.rank}.`);\n const inputs = { dy: dy4D, input: input4D };\n const attrs = { filterSize, strides, pad };\n // tslint:disable-next-line: no-unnecessary-type-assertion\n const res = ENGINE.runKernel(AvgPoolGrad, inputs, attrs);\n if (reshapedTo4D) {\n return reshape(res, [res.shape[1], res.shape[2], res.shape[3]]);\n }\n return res;\n}\nexport const avgPoolGrad = op({ avgPoolGrad_ });\n//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYXZnX3Bvb2xfZ3JhZC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uLy4uL3RmanMtY29yZS9zcmMvb3BzL2F2Z19wb29sX2dyYWQudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUE7Ozs7Ozs7Ozs7Ozs7OztHQWVHO0FBRUgsT0FBTyxFQUFDLE1BQU0sRUFBQyxNQUFNLFdBQVcsQ0FBQztBQUNqQyxPQUFPLEVBQUMsV0FBVyxFQUFzQyxNQUFNLGlCQUFpQixDQUFDO0FBSWpGLE9BQU8sRUFBQyxlQUFlLEVBQUMsTUFBTSxvQkFBb0IsQ0FBQztBQUVuRCxPQUFPLEtBQUssSUFBSSxNQUFNLFNBQVMsQ0FBQztBQUdoQyxPQUFPLEVBQUMsRUFBRSxFQUFDLE1BQU0sYUFBYSxDQUFDO0FBQy9CLE9BQU8sRUFBQyxPQUFPLEVBQUMsTUFBTSxXQUFXLENBQUM7QUFFbEM7Ozs7Ozs7Ozs7Ozs7Ozs7O0dBaUJHO0FBQ0gsU0FBUyxZQUFZLENBQ2pCLEVBQWdCLEVBQUUsS0FBbUIsRUFBRSxVQUFtQyxFQUMxRSxPQUFnQyxFQUNoQyxHQUEwQztJQUM1QyxNQUFNLEdBQUcsR0FBRyxlQUFlLENBQUMsRUFBRSxFQUFFLElBQUksRUFBRSxhQUFhLENBQUMsQ0FBQztJQUNyRCxNQUFNLE1BQU0sR0FBRyxlQUFlLENBQUMsS0FBSyxFQUFFLE9BQU8sRUFBRSxhQUFhLENBQUMsQ0FBQztJQUU5RCxJQUFJLENBQUMsTUFBTSxDQUNQLE1BQU0sQ0FBQyxJQUFJLEtBQUssR0FBRyxDQUFDLElBQUksRUFDeEIsR0FBRyxFQUFFLENBQUMsa0JBQWtCLE1BQU0sQ0FBQyxJQUFJLGdDQUMvQixHQUFHLENBQUMsSUFBSSxHQUFHLENBQUMsQ0FBQztJQUVyQixJQUFJLE9BQU8sR0FBRyxNQUFrQixDQUFDO0lBQ2pDLElBQUksSUFBSSxHQUFHLEdBQWUsQ0FBQztJQUMzQixJQUFJLFlBQVksR0FBRyxLQUFLLENBQUM7SUFFekIsSUFBSSxNQUFNLENBQUMsSUFBSSxLQUFLLENBQUMsRUFBRTtRQUNyQixZQUFZLEdBQUcsSUFBSSxDQUFDO1FBQ3BCLE9BQU87WUFDSCxPQUFPLENBQUMsTUFBTSxFQUFFLENBQUMsQ0FBQyxFQUFFLE1BQU0sQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDLEVBQUUsTUFBTSxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUMsRUFBRSxNQUFNLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQztRQUM1RSxJQUFJLEdBQUcsT0FBTyxDQUFDLEdBQUcsRUFBRSxDQUFDLENBQUMsRUFBRSxHQUFHLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQyxFQUFFLEdBQUcsQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDLEVBQUUsR0FBRyxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUM7S0FDcEU7SUFFRCxJQUFJLENBQUMsTUFBTSxDQUNQLElBQUksQ0FBQyxJQUFJLEtBQUssQ0FBQyxFQUNmLEdBQUcsRUFBRSxDQUFDLHVEQUF1RDtRQUN6RCxHQUFHLElBQUksQ0FBQyxJQUFJLEdBQUcsQ0FBQyxDQUFDO0lBQ3pCLElBQUksQ0FBQyxNQUFNLENBQ1AsT0FBTyxDQUFDLElBQUksS0FBSyxDQUFDLEVBQ2xCLEdBQUcsRUFBRSxDQUFDLDBEQUEwRDtRQUM1RCxHQUFHLE9BQU8sQ0FBQyxJQUFJLEdBQUcsQ0FBQyxDQUFDO0lBRTVCLE1BQU0sTUFBTSxHQUFzQixFQUFDLEVBQUUsRUFBRSxJQUFJLEVBQUUsS0FBSyxFQUFFLE9BQU8sRUFBQyxDQUFDO0lBRTdELE1BQU0sS0FBSyxHQUFxQixFQUFDLFVBQVUsRUFBRSxPQUFPLEVBQUUsR0FBRyxFQUFDLENBQUM7SUFFM0QsMERBQTBEO0lBQzFELE1BQU0sR0FBRyxHQUFHLE1BQU0sQ0FBQyxTQUFTLENBQ1osV0FBVyxFQUFFLE1BQThCLEVBQzNDLEtBQTJCLENBQU0sQ0FBQztJQUVsRCxJQUFJLFlBQVksRUFBRTtRQUNoQixPQUFPLE9BQU8sQ0FBQyxHQUFHLEVBQUUsQ0FBQyxHQUFHLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQyxFQUFFLEdBQUcsQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDLEVBQUUsR0FBRyxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFNLENBQUM7S0FDdEU7SUFDRCxPQUFPLEdBQUcsQ0FBQztBQUNiLENBQUM7QUFFRCxNQUFNLENBQUMsTUFBTSxXQUFXLEdBQUcsRUFBRSxDQUFDLEVBQUMsWUFBWSxFQUFDLENBQUMsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbIi8qKlxuICogQGxpY2Vuc2VcbiAqIENvcHlyaWdodCAyMDIwIEdvb2dsZSBMTEMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuXG4gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgXCJMaWNlbnNlXCIpO1xuICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLlxuICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0XG4gKlxuICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wXG4gKlxuICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZVxuICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gXCJBUyBJU1wiIEJBU0lTLFxuICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuXG4gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kXG4gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS5cbiAqID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4gKi9cblxuaW1wb3J0IHtFTkdJTkV9IGZyb20gJy4uL2VuZ2luZSc7XG5pbXBvcnQge0F2Z1Bvb2xHcmFkLCBBdmdQb29sR3JhZEF0dHJzLCBBdmdQb29sR3JhZElucHV0c30gZnJvbSAnLi4va2VybmVsX25hbWVzJztcbmltcG9ydCB7TmFtZWRBdHRyTWFwfSBmcm9tICcuLi9rZXJuZWxfcmVnaXN0cnknO1xuaW1wb3J0IHtUZW5zb3IzRCwgVGVuc29yNER9IGZyb20gJy4uL3RlbnNvcic7XG5pbXBvcnQge05hbWVkVGVuc29yTWFwfSBmcm9tICcuLi90ZW5zb3JfdHlwZXMnO1xuaW1wb3J0IHtjb252ZXJ0VG9UZW5zb3J9IGZyb20gJy4uL3RlbnNvcl91dGlsX2Vudic7XG5pbXBvcnQge1RlbnNvckxpa2V9IGZyb20gJy4uL3R5cGVzJztcbmltcG9ydCAqIGFzIHV0aWwgZnJvbSAnLi4vdXRpbCc7XG5cbmltcG9ydCB7RXhwbGljaXRQYWRkaW5nfSBmcm9tICcuL2NvbnZfdXRpbCc7XG5pbXBvcnQge29wfSBmcm9tICcuL29wZXJhdGlvbic7XG5pbXBvcnQge3Jlc2hhcGV9IGZyb20gJy4vcmVzaGFwZSc7XG5cbi8qKlxuICogQ29tcHV0ZXMgdGhlIGJhY2twcm9wIG9mIGFuIDJEIGF2ZyBwb29sLlxuICpcbiAqIEBwYXJhbSBkeSBUaGUgZHkgZXJyb3IsIG9mIHJhbmsgNCBvciByYW5rIDMgb2Ygc2hhcGVcbiAqICAgICBbYmF0Y2hTaXplLCBoZWlnaHQsIHdpZHRoLCBjaGFubmVsc10uIElmIHJhbmsgMywgYmF0Y2ggb2YgMSBpc1xuICogYXNzdW1lZC5cbiAqIEBwYXJhbSBpbnB1dCBUaGUgaW5wdXQgaW1hZ2UsIG9mIHJhbmsgNCBvciByYW5rIDMgb2Ygc2hhcGVcbiAqICAgICBbYmF0Y2hTaXplLCBoZWlnaHQsIHdpZHRoLCBjaGFubmVsc10uIElmIHJhbmsgMywgYmF0Y2ggb2YgMSBpc1xuICogYXNzdW1lZC5cbiAqIEBwYXJhbSBmaWx0ZXJTaXplIFRoZSBmaWx0ZXIgc2l6ZTogYFtmaWx0ZXJIZWlnaHQsIGZpbHRlcldpZHRoXWAuIElmXG4gKiAgICAgYGZpbHRlclNpemVgIGlzIGEgc2luZ2xlIG51bWJlciwgdGhlbiBgZmlsdGVySGVpZ2h0ID09IGZpbHRlcldpZHRoYC5cbiAqIEBwYXJhbSBzdHJpZGVzIFRoZSBzdHJpZGVzIG9mIHRoZSBwb29saW5nOiBgW3N0cmlkZUhlaWdodCwgc3RyaWRlV2lkdGhdYC4gSWZcbiAqICAgICBgc3RyaWRlc2AgaXMgYSBzaW5nbGUgbnVtYmVyLCB0aGVuIGBzdHJpZGVIZWlnaHQgPT0gc3RyaWRlV2lkdGhgLlxuICogQHBhcmFtIHBhZCBUaGUgdHlwZSBvZiBwYWRkaW5nIGFsZ29yaXRobSB1c2VkIGluIHRoZSBmb3J3YXJkIHByb3Agb2YgdGhlIG9wLlxuICogICAgICdzYW1lJywgJ3ZhbGlkJywgZm9yIG1vcmUgaW5mbywgc2VlIHRoaXMgZ3VpZGU6XG4gKiAgICAgW2h0dHBzOi8vd3d3LnRlbnNvcmZsb3cub3JnL2FwaV9kb2NzL3B5dGhvbi90Zi9ubi9jb252b2x1dGlvbl0oXG4gKiAgICAgICAgIGh0dHBzOi8vd3d3LnRlbnNvcmZsb3cub3JnL2FwaV9kb2NzL3B5dGhvbi90Zi9ubi9jb252b2x1dGlvbilcbiAqL1xuZnVuY3Rpb24gYXZnUG9vbEdyYWRfPFQgZXh0ZW5kcyBUZW5zb3IzRHxUZW5zb3I0RD4oXG4gICAgZHk6IFR8VGVuc29yTGlrZSwgaW5wdXQ6IFR8VGVuc29yTGlrZSwgZmlsdGVyU2l6ZTogW251bWJlciwgbnVtYmVyXXxudW1iZXIsXG4gICAgc3RyaWRlczogW251bWJlciwgbnVtYmVyXXxudW1iZXIsXG4gICAgcGFkOiAndmFsaWQnfCdzYW1lJ3xudW1iZXJ8RXhwbGljaXRQYWRkaW5nKTogVCB7XG4gIGNvbnN0ICRkeSA9IGNvbnZlcnRUb1RlbnNvcihkeSwgJ2R5JywgJ2F2Z1Bvb2xHcmFkJyk7XG4gIGNvbnN0ICRpbnB1dCA9IGNvbnZlcnRUb1RlbnNvcihpbnB1dCwgJ2lucHV0JywgJ2F2Z1Bvb2xHcmFkJyk7XG5cbiAgdXRpbC5hc3NlcnQoXG4gICAgICAkaW5wdXQucmFuayA9PT0gJGR5LnJhbmssXG4gICAgICAoKSA9PiBgUmFuayBvZiBpbnB1dCAoJHskaW5wdXQucmFua30pIGRvZXMgbm90IG1hdGNoIHJhbmsgb2YgZHkgKCR7XG4gICAgICAgICAgJGR5LnJhbmt9KWApO1xuXG4gIGxldCBpbnB1dDREID0gJGlucHV0IGFzIFRlbnNvcjREO1xuICBsZXQgZHk0RCA9ICRkeSBhcyBUZW5zb3I0RDtcbiAgbGV0IHJlc2hhcGVkVG80RCA9IGZhbHNlO1xuXG4gIGlmICgkaW5wdXQucmFuayA9PT0gMykge1xuICAgIHJlc2hhcGVkVG80RCA9IHRydWU7XG4gICAgaW5wdXQ0RCA9XG4gICAgICAgIHJlc2hhcGUoJGlucHV0LCBbMSwgJGlucHV0LnNoYXBlWzBdLCAkaW5wdXQuc2hhcGVbMV0sICRpbnB1dC5zaGFwZVsyXV0pO1xuICAgIGR5NEQgPSByZXNoYXBlKCRkeSwgWzEsICRkeS5zaGFwZVswXSwgJGR5LnNoYXBlWzFdLCAkZHkuc2hhcGVbMl1dKTtcbiAgfVxuXG4gIHV0aWwuYXNzZXJ0KFxuICAgICAgZHk0RC5yYW5rID09PSA0LFxuICAgICAgKCkgPT4gYEVycm9yIGluIGF2Z1Bvb2xHcmFkOiBkeSBtdXN0IGJlIHJhbmsgNCBidXQgZ290IHJhbmsgYCArXG4gICAgICAgICAgYCR7ZHk0RC5yYW5rfS5gKTtcbiAgdXRpbC5hc3NlcnQoXG4gICAgICBpbnB1dDRELnJhbmsgPT09IDQsXG4gICAgICAoKSA9PiBgRXJyb3IgaW4gYXZnUG9vbEdyYWQ6IGlucHV0IG11c3QgYmUgcmFuayA0IGJ1dCBnb3QgcmFuayBgICtcbiAgICAgICAgICBgJHtpbnB1dDRELnJhbmt9LmApO1xuXG4gIGNvbnN0IGlucHV0czogQXZnUG9vbEdyYWRJbnB1dHMgPSB7ZHk6IGR5NEQsIGlucHV0OiBpbnB1dDREfTtcblxuICBjb25zdCBhdHRyczogQXZnUG9vbEdyYWRBdHRycyA9IHtmaWx0ZXJTaXplLCBzdHJpZGVzLCBwYWR9O1xuXG4gIC8vIHRzbGludDpkaXNhYmxlLW5leHQtbGluZTogbm8tdW5uZWNlc3NhcnktdHlwZS1hc3NlcnRpb25cbiAgY29uc3QgcmVzID0gRU5HSU5FLnJ1bktlcm5lbChcbiAgICAgICAgICAgICAgICAgIEF2Z1Bvb2xHcmFkLCBpbnB1dHMgYXMge30gYXMgTmFtZWRUZW5zb3JNYXAsXG4gICAgICAgICAgICAgICAgICBhdHRycyBhcyB7fSBhcyBOYW1lZEF0dHJNYXApIGFzIFQ7XG5cbiAgaWYgKHJlc2hhcGVkVG80RCkge1xuICAgIHJldHVybiByZXNoYXBlKHJlcywgW3Jlcy5zaGFwZVsxXSwgcmVzLnNoYXBlWzJdLCByZXMuc2hhcGVbM11dKSBhcyBUO1xuICB9XG4gIHJldHVybiByZXM7XG59XG5cbmV4cG9ydCBjb25zdCBhdmdQb29sR3JhZCA9IG9wKHthdmdQb29sR3JhZF99KTtcbiJdfQ==","/**\n * @license\n * Copyright 2020 Google LLC. All Rights Reserved.\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n * =============================================================================\n */\nimport { AvgPool } from '../kernel_names';\nimport { avgPoolGrad } from '../ops/avg_pool_grad';\nexport const avgPoolGradConfig = {\n kernelName: AvgPool,\n inputsToSave: ['x'],\n gradFunc: (dy, saved, attrs) => {\n const [x] = saved;\n const { filterSize, strides, pad } = attrs;\n return { x: () => avgPoolGrad(dy, x, filterSize, strides, pad) };\n }\n};\n//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiQXZnUG9vbF9ncmFkLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vLi4vdGZqcy1jb3JlL3NyYy9ncmFkaWVudHMvQXZnUG9vbF9ncmFkLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBOzs7Ozs7Ozs7Ozs7Ozs7R0FlRztBQUVILE9BQU8sRUFBQyxPQUFPLEVBQWUsTUFBTSxpQkFBaUIsQ0FBQztBQUV0RCxPQUFPLEVBQUMsV0FBVyxFQUFDLE1BQU0sc0JBQXNCLENBQUM7QUFHakQsTUFBTSxDQUFDLE1BQU0saUJBQWlCLEdBQWU7SUFDM0MsVUFBVSxFQUFFLE9BQU87SUFDbkIsWUFBWSxFQUFFLENBQUMsR0FBRyxDQUFDO0lBQ25CLFFBQVEsRUFBRSxDQUFDLEVBQVUsRUFBRSxLQUFlLEVBQUUsS0FBbUIsRUFBRSxFQUFFO1FBQzdELE1BQU0sQ0FBQyxDQUFDLENBQUMsR0FBRyxLQUFtQixDQUFDO1FBQ2hDLE1BQU0sRUFBQyxVQUFVLEVBQUUsT0FBTyxFQUFFLEdBQUcsRUFBQyxHQUFHLEtBQTJCLENBQUM7UUFDL0QsT0FBTyxFQUFDLENBQUMsRUFBRSxHQUFHLEVBQUUsQ0FBQyxXQUFXLENBQUMsRUFBYyxFQUFFLENBQUMsRUFBRSxVQUFVLEVBQUUsT0FBTyxFQUFFLEdBQUcsQ0FBQyxFQUFDLENBQUM7SUFDN0UsQ0FBQztDQUNGLENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyIvKipcbiAqIEBsaWNlbnNlXG4gKiBDb3B5cmlnaHQgMjAyMCBHb29nbGUgTExDLiBBbGwgUmlnaHRzIFJlc2VydmVkLlxuICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlIFwiTGljZW5zZVwiKTtcbiAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS5cbiAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdFxuICpcbiAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMFxuICpcbiAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmVcbiAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuIFwiQVMgSVNcIiBCQVNJUyxcbiAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLlxuICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZFxuICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuXG4gKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuICovXG5cbmltcG9ydCB7QXZnUG9vbCwgQXZnUG9vbEF0dHJzfSBmcm9tICcuLi9rZXJuZWxfbmFtZXMnO1xuaW1wb3J0IHtHcmFkQ29uZmlnLCBOYW1lZEF0dHJNYXB9IGZyb20gJy4uL2tlcm5lbF9yZWdpc3RyeSc7XG5pbXBvcnQge2F2Z1Bvb2xHcmFkfSBmcm9tICcuLi9vcHMvYXZnX3Bvb2xfZ3JhZCc7XG5pbXBvcnQge1RlbnNvciwgVGVuc29yNER9IGZyb20gJy4uL3RlbnNvcic7XG5cbmV4cG9ydCBjb25zdCBhdmdQb29sR3JhZENvbmZpZzogR3JhZENvbmZpZyA9IHtcbiAga2VybmVsTmFtZTogQXZnUG9vbCxcbiAgaW5wdXRzVG9TYXZlOiBbJ3gnXSxcbiAgZ3JhZEZ1bmM6IChkeTogVGVuc29yLCBzYXZlZDogVGVuc29yW10sIGF0dHJzOiBOYW1lZEF0dHJNYXApID0+IHtcbiAgICBjb25zdCBbeF0gPSBzYXZlZCBhcyBbVGVuc29yNERdO1xuICAgIGNvbnN0IHtmaWx0ZXJTaXplLCBzdHJpZGVzLCBwYWR9ID0gYXR0cnMgYXMge30gYXMgQXZnUG9vbEF0dHJzO1xuICAgIHJldHVybiB7eDogKCkgPT4gYXZnUG9vbEdyYWQoZHkgYXMgVGVuc29yNEQsIHgsIGZpbHRlclNpemUsIHN0cmlkZXMsIHBhZCl9O1xuICB9XG59O1xuIl19","/**\n * @license\n * Copyright 2020 Google LLC. All Rights Reserved.\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n * =============================================================================\n */\nimport { BatchMatMul } from '../kernel_names';\nimport { matMul } from '../ops/mat_mul';\nexport const batchMatMulGradConfig = {\n kernelName: BatchMatMul,\n inputsToSave: ['a', 'b'],\n gradFunc: (dy, saved, attrs) => {\n const [a, b] = saved;\n const { transposeA, transposeB } = attrs;\n if (!transposeA && !transposeB) {\n return {\n a: () => matMul(dy, b, false, true),\n b: () => matMul(a, dy, true, false)\n };\n }\n else if (!transposeA && transposeB) {\n return {\n a: () => matMul(dy, b, false, false),\n b: () => matMul(dy, a, true, false)\n };\n }\n else if (transposeA && !transposeB) {\n return {\n a: () => matMul(b, dy, false, true),\n b: () => matMul(a, dy, false, false)\n };\n }\n else {\n return {\n a: () => matMul(b, dy, true, true),\n b: () => matMul(dy, a, true, true)\n };\n }\n }\n};\n//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiQmF0Y2hNYXRNdWxfZ3JhZC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uLy4uL3RmanMtY29yZS9zcmMvZ3JhZGllbnRzL0JhdGNoTWF0TXVsX2dyYWQudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUE7Ozs7Ozs7Ozs7Ozs7OztHQWVHO0FBRUgsT0FBTyxFQUFDLFdBQVcsRUFBbUIsTUFBTSxpQkFBaUIsQ0FBQztBQUU5RCxPQUFPLEVBQUMsTUFBTSxFQUFDLE1BQU0sZ0JBQWdCLENBQUM7QUFHdEMsTUFBTSxDQUFDLE1BQU0scUJBQXFCLEdBQWU7SUFDL0MsVUFBVSxFQUFFLFdBQVc7SUFDdkIsWUFBWSxFQUFFLENBQUMsR0FBRyxFQUFFLEdBQUcsQ0FBQztJQUN4QixRQUFRLEVBQUUsQ0FBQyxFQUFVLEVBQUUsS0FBZSxFQUFFLEtBQW1CLEVBQUUsRUFBRTtRQUM3RCxNQUFNLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxHQUFHLEtBQUssQ0FBQztRQUVyQixNQUFNLEVBQUMsVUFBVSxFQUFFLFVBQVUsRUFBQyxHQUFHLEtBQStCLENBQUM7UUFFakUsSUFBSSxDQUFDLFVBQVUsSUFBSSxDQUFDLFVBQVUsRUFBRTtZQUM5QixPQUFPO2dCQUNMLENBQUMsRUFBRSxHQUFHLEVBQUUsQ0FBQyxNQUFNLENBQUMsRUFBRSxFQUFFLENBQUMsRUFBRSxLQUFLLEVBQUUsSUFBSSxDQUFDO2dCQUNuQyxDQUFDLEVBQUUsR0FBRyxFQUFFLENBQUMsTUFBTSxDQUFDLENBQUMsRUFBRSxFQUFFLEVBQUUsSUFBSSxFQUFFLEtBQUssQ0FBQzthQUNwQyxDQUFDO1NBQ0g7YUFBTSxJQUFJLENBQUMsVUFBVSxJQUFJLFVBQVUsRUFBRTtZQUNwQyxPQUFPO2dCQUNMLENBQUMsRUFBRSxHQUFHLEVBQUUsQ0FBQyxNQUFNLENBQUMsRUFBRSxFQUFFLENBQUMsRUFBRSxLQUFLLEVBQUUsS0FBSyxDQUFDO2dCQUNwQyxDQUFDLEVBQUUsR0FBRyxFQUFFLENBQUMsTUFBTSxDQUFDLEVBQUUsRUFBRSxDQUFDLEVBQUUsSUFBSSxFQUFFLEtBQUssQ0FBQzthQUNwQyxDQUFDO1NBQ0g7YUFBTSxJQUFJLFVBQVUsSUFBSSxDQUFDLFVBQVUsRUFBRTtZQUNwQyxPQUFPO2dCQUNMLENBQUMsRUFBRSxHQUFHLEVBQUUsQ0FBQyxNQUFNLENBQUMsQ0FBQyxFQUFFLEVBQUUsRUFBRSxLQUFLLEVBQUUsSUFBSSxDQUFDO2dCQUNuQyxDQUFDLEVBQUUsR0FBRyxFQUFFLENBQUMsTUFBTSxDQUFDLENBQUMsRUFBRSxFQUFFLEVBQUUsS0FBSyxFQUFFLEtBQUssQ0FBQzthQUNyQyxDQUFDO1NBQ0g7YUFBTTtZQUNMLE9BQU87Z0JBQ0wsQ0FBQyxFQUFFLEdBQUcsRUFBRSxDQUFDLE1BQU0sQ0FBQyxDQUFDLEVBQUUsRUFBRSxFQUFFLElBQUksRUFBRSxJQUFJLENBQUM7Z0JBQ2xDLENBQUMsRUFBRSxHQUFHLEVBQUUsQ0FBQyxNQUFNLENBQUMsRUFBRSxFQUFFLENBQUMsRUFBRSxJQUFJLEVBQUUsSUFBSSxDQUFDO2FBQ25DLENBQUM7U0FDSDtJQUNILENBQUM7Q0FDRixDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiLyoqXG4gKiBAbGljZW5zZVxuICogQ29weXJpZ2h0IDIwMjAgR29vZ2xlIExMQy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC5cbiAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSBcIkxpY2Vuc2VcIik7XG4gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuXG4gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXRcbiAqXG4gKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjBcbiAqXG4gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlXG4gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiBcIkFTIElTXCIgQkFTSVMsXG4gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC5cbiAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmRcbiAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLlxuICogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbiAqL1xuXG5pbXBvcnQge0JhdGNoTWF0TXVsLCBCYXRjaE1hdE11bEF0dHJzfSBmcm9tICcuLi9rZXJuZWxfbmFtZXMnO1xuaW1wb3J0IHtHcmFkQ29uZmlnLCBOYW1lZEF0dHJNYXB9IGZyb20gJy4uL2tlcm5lbF9yZWdpc3RyeSc7XG5pbXBvcnQge21hdE11bH0gZnJvbSAnLi4vb3BzL21hdF9tdWwnO1xuaW1wb3J0IHtUZW5zb3J9IGZyb20gJy4uL3RlbnNvcic7XG5cbmV4cG9ydCBjb25zdCBiYXRjaE1hdE11bEdyYWRDb25maWc6IEdyYWRDb25maWcgPSB7XG4gIGtlcm5lbE5hbWU6IEJhdGNoTWF0TXVsLFxuICBpbnB1dHNUb1NhdmU6IFsnYScsICdiJ10sXG4gIGdyYWRGdW5jOiAoZHk6IFRlbnNvciwgc2F2ZWQ6IFRlbnNvcltdLCBhdHRyczogTmFtZWRBdHRyTWFwKSA9PiB7XG4gICAgY29uc3QgW2EsIGJdID0gc2F2ZWQ7XG5cbiAgICBjb25zdCB7dHJhbnNwb3NlQSwgdHJhbnNwb3NlQn0gPSBhdHRycyBhcyB7fSBhcyBCYXRjaE1hdE11bEF0dHJzO1xuXG4gICAgaWYgKCF0cmFuc3Bvc2VBICYmICF0cmFuc3Bvc2VCKSB7XG4gICAgICByZXR1cm4ge1xuICAgICAgICBhOiAoKSA9PiBtYXRNdWwoZHksIGIsIGZhbHNlLCB0cnVlKSxcbiAgICAgICAgYjogKCkgPT4gbWF0TXVsKGEsIGR5LCB0cnVlLCBmYWxzZSlcbiAgICAgIH07XG4gICAgfSBlbHNlIGlmICghdHJhbnNwb3NlQSAmJiB0cmFuc3Bvc2VCKSB7XG4gICAgICByZXR1cm4ge1xuICAgICAgICBhOiAoKSA9PiBtYXRNdWwoZHksIGIsIGZhbHNlLCBmYWxzZSksXG4gICAgICAgIGI6ICgpID0+IG1hdE11bChkeSwgYSwgdHJ1ZSwgZmFsc2UpXG4gICAgICB9O1xuICAgIH0gZWxzZSBpZiAodHJhbnNwb3NlQSAmJiAhdHJhbnNwb3NlQikge1xuICAgICAgcmV0dXJuIHtcbiAgICAgICAgYTogKCkgPT4gbWF0TXVsKGIsIGR5LCBmYWxzZSwgdHJ1ZSksXG4gICAgICAgIGI6ICgpID0+IG1hdE11bChhLCBkeSwgZmFsc2UsIGZhbHNlKVxuICAgICAgfTtcbiAgICB9IGVsc2Uge1xuICAgICAgcmV0dXJuIHtcbiAgICAgICAgYTogKCkgPT4gbWF0TXVsKGIsIGR5LCB0cnVlLCB0cnVlKSxcbiAgICAgICAgYjogKCkgPT4gbWF0TXVsKGR5LCBhLCB0cnVlLCB0cnVlKVxuICAgICAgfTtcbiAgICB9XG4gIH1cbn07XG4iXX0=","/**\n * @license\n * Copyright 2020 Google LLC. All Rights Reserved.\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n * =============================================================================\n */\nimport { BatchToSpaceND } from '../kernel_names';\nimport { spaceToBatchND } from '../ops/space_to_batch_nd';\nexport const batchToSpaceNDGradConfig = {\n kernelName: BatchToSpaceND,\n gradFunc: (dy, saved, attrs) => {\n const { blockShape, crops } = attrs;\n return { x: () => spaceToBatchND(dy, blockShape, crops) };\n }\n};\n//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiQmF0Y2hUb1NwYWNlTkRfZ3JhZC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uLy4uL3RmanMtY29yZS9zcmMvZ3JhZGllbnRzL0JhdGNoVG9TcGFjZU5EX2dyYWQudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUE7Ozs7Ozs7Ozs7Ozs7OztHQWVHO0FBRUgsT0FBTyxFQUFDLGNBQWMsRUFBc0IsTUFBTSxpQkFBaUIsQ0FBQztBQUVwRSxPQUFPLEVBQUMsY0FBYyxFQUFDLE1BQU0sMEJBQTBCLENBQUM7QUFHeEQsTUFBTSxDQUFDLE1BQU0sd0JBQXdCLEdBQWU7SUFDbEQsVUFBVSxFQUFFLGNBQWM7SUFDMUIsUUFBUSxFQUFFLENBQUMsRUFBVSxFQUFFLEtBQWUsRUFBRSxLQUFtQixFQUFFLEVBQUU7UUFDN0QsTUFBTSxFQUFDLFVBQVUsRUFBRSxLQUFLLEVBQUMsR0FBRyxLQUFrQyxDQUFDO1FBQy9ELE9BQU8sRUFBQyxDQUFDLEVBQUUsR0FBRyxFQUFFLENBQUMsY0FBYyxDQUFDLEVBQUUsRUFBRSxVQUFVLEVBQUUsS0FBSyxDQUFDLEVBQUMsQ0FBQztJQUMxRCxDQUFDO0NBQ0YsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbIi8qKlxuICogQGxpY2Vuc2VcbiAqIENvcHlyaWdodCAyMDIwIEdvb2dsZSBMTEMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuXG4gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgXCJMaWNlbnNlXCIpO1xuICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLlxuICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0XG4gKlxuICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wXG4gKlxuICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZVxuICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gXCJBUyBJU1wiIEJBU0lTLFxuICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuXG4gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kXG4gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS5cbiAqID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4gKi9cblxuaW1wb3J0IHtCYXRjaFRvU3BhY2VORCwgQmF0Y2hUb1NwYWNlTkRBdHRyc30gZnJvbSAnLi4va2VybmVsX25hbWVzJztcbmltcG9ydCB7R3JhZENvbmZpZywgTmFtZWRBdHRyTWFwfSBmcm9tICcuLi9rZXJuZWxfcmVnaXN0cnknO1xuaW1wb3J0IHtzcGFjZVRvQmF0Y2hORH0gZnJvbSAnLi4vb3BzL3NwYWNlX3RvX2JhdGNoX25kJztcbmltcG9ydCB7VGVuc29yfSBmcm9tICcuLi90ZW5zb3InO1xuXG5leHBvcnQgY29uc3QgYmF0Y2hUb1NwYWNlTkRHcmFkQ29uZmlnOiBHcmFkQ29uZmlnID0ge1xuICBrZXJuZWxOYW1lOiBCYXRjaFRvU3BhY2VORCxcbiAgZ3JhZEZ1bmM6IChkeTogVGVuc29yLCBzYXZlZDogVGVuc29yW10sIGF0dHJzOiBOYW1lZEF0dHJNYXApID0+IHtcbiAgICBjb25zdCB7YmxvY2tTaGFwZSwgY3JvcHN9ID0gYXR0cnMgYXMge30gYXMgQmF0Y2hUb1NwYWNlTkRBdHRycztcbiAgICByZXR1cm4ge3g6ICgpID0+IHNwYWNlVG9CYXRjaE5EKGR5LCBibG9ja1NoYXBlLCBjcm9wcyl9O1xuICB9XG59O1xuIl19","/**\n * @license\n * Copyright 2020 Google LLC. All Rights Reserved.\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n * =============================================================================\n */\nimport { BroadcastTo } from '../kernel_names';\nimport { sum } from '../ops/sum';\nexport const broadcastToGradConfig = {\n kernelName: BroadcastTo,\n gradFunc: (dy, saved, attrs) => {\n const broadCastToAttrs = attrs;\n const inputShape = broadCastToAttrs.inputShape;\n const outputShape = broadCastToAttrs.shape;\n const reps = Array.from(outputShape);\n for (let i = inputShape.length - 1; i >= 0; i--) {\n if (inputShape[i] === outputShape[i]) {\n reps[i] = 1;\n }\n else if (inputShape[i] !== 1) {\n throw new Error(`broadcastTo(): [${inputShape}] cannot be broadcast to [${outputShape}].`);\n }\n }\n const axes = [];\n for (let i = 0; i < reps.length; i++) {\n if (reps[i] > 1) {\n axes.push(i);\n }\n }\n return { x: () => sum(dy, axes, true /* keepDims */) };\n }\n};\n//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiQnJvYWRjYXN0VG9fZ3JhZC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uLy4uL3RmanMtY29yZS9zcmMvZ3JhZGllbnRzL0Jyb2FkY2FzdFRvX2dyYWQudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUE7Ozs7Ozs7Ozs7Ozs7OztHQWVHO0FBRUgsT0FBTyxFQUFDLFdBQVcsRUFBbUIsTUFBTSxpQkFBaUIsQ0FBQztBQUU5RCxPQUFPLEVBQUMsR0FBRyxFQUFDLE1BQU0sWUFBWSxDQUFDO0FBRy9CLE1BQU0sQ0FBQyxNQUFNLHFCQUFxQixHQUFlO0lBQy9DLFVBQVUsRUFBRSxXQUFXO0lBQ3ZCLFFBQVEsRUFBRSxDQUFDLEVBQVUsRUFBRSxLQUFlLEVBQUUsS0FBbUIsRUFBRSxFQUFFO1FBQzdELE1BQU0sZ0JBQWdCLEdBQ2xCLEtBQW9DLENBQUM7UUFFekMsTUFBTSxVQUFVLEdBQUcsZ0JBQWdCLENBQUMsVUFBVSxDQUFDO1FBQy9DLE1BQU0sV0FBVyxHQUFHLGdCQUFnQixDQUFDLEtBQUssQ0FBQztRQUUzQyxNQUFNLElBQUksR0FBYSxLQUFLLENBQUMsSUFBSSxDQUFDLFdBQVcsQ0FBQyxDQUFDO1FBQy9DLEtBQUssSUFBSSxDQUFDLEdBQUcsVUFBVSxDQUFDLE1BQU0sR0FBRyxDQUFDLEVBQUUsQ0FBQyxJQUFJLENBQUMsRUFBRSxDQUFDLEVBQUUsRUFBRTtZQUMvQyxJQUFJLFVBQVUsQ0FBQyxDQUFDLENBQUMsS0FBSyxXQUFXLENBQUMsQ0FBQyxDQUFDLEVBQUU7Z0JBQ3BDLElBQUksQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUM7YUFDYjtpQkFBTSxJQUFJLFVBQVUsQ0FBQyxDQUFDLENBQUMsS0FBSyxDQUFDLEVBQUU7Z0JBQzlCLE1BQU0sSUFBSSxLQUFLLENBQUMsbUJBQ1osVUFBVSw2QkFBNkIsV0FBVyxJQUFJLENBQUMsQ0FBQzthQUM3RDtTQUNGO1FBQ0QsTUFBTSxJQUFJLEdBQWEsRUFBRSxDQUFDO1FBQzFCLEtBQUssSUFBSSxDQUFDLEdBQUcsQ0FBQyxFQUFFLENBQUMsR0FBRyxJQUFJLENBQUMsTUFBTSxFQUFFLENBQUMsRUFBRSxFQUFFO1lBQ3BDLElBQUksSUFBSSxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsRUFBRTtnQkFDZixJQUFJLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxDQUFDO2FBQ2Q7U0FDRjtRQUVELE9BQU8sRUFBQyxDQUFDLEVBQUUsR0FBRyxFQUFFLENBQUMsR0FBRyxDQUFDLEVBQUUsRUFBRSxJQUFJLEVBQUUsSUFBSSxDQUFDLGNBQWMsQ0FBQyxFQUFDLENBQUM7SUFDdkQsQ0FBQztDQUNGLENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyIvKipcbiAqIEBsaWNlbnNlXG4gKiBDb3B5cmlnaHQgMjAyMCBHb29nbGUgTExDLiBBbGwgUmlnaHRzIFJlc2VydmVkLlxuICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlIFwiTGljZW5zZVwiKTtcbiAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS5cbiAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdFxuICpcbiAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMFxuICpcbiAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmVcbiAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuIFwiQVMgSVNcIiBCQVNJUyxcbiAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLlxuICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZFxuICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuXG4gKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuICovXG5cbmltcG9ydCB7QnJvYWRjYXN0VG8sIEJyb2FkQ2FzdFRvQXR0cnN9IGZyb20gJy4uL2tlcm5lbF9uYW1lcyc7XG5pbXBvcnQge0dyYWRDb25maWcsIE5hbWVkQXR0ck1hcH0gZnJvbSAnLi4va2VybmVsX3JlZ2lzdHJ5JztcbmltcG9ydCB7c3VtfSBmcm9tICcuLi9vcHMvc3VtJztcbmltcG9ydCB7VGVuc29yfSBmcm9tICcuLi90ZW5zb3InO1xuXG5leHBvcnQgY29uc3QgYnJvYWRjYXN0VG9HcmFkQ29uZmlnOiBHcmFkQ29uZmlnID0ge1xuICBrZXJuZWxOYW1lOiBCcm9hZGNhc3RUbyxcbiAgZ3JhZEZ1bmM6IChkeTogVGVuc29yLCBzYXZlZDogVGVuc29yW10sIGF0dHJzOiBOYW1lZEF0dHJNYXApID0+IHtcbiAgICBjb25zdCBicm9hZENhc3RUb0F0dHJzOiBCcm9hZENhc3RUb0F0dHJzID1cbiAgICAgICAgYXR0cnMgYXMgdW5rbm93biBhcyBCcm9hZENhc3RUb0F0dHJzO1xuXG4gICAgY29uc3QgaW5wdXRTaGFwZSA9IGJyb2FkQ2FzdFRvQXR0cnMuaW5wdXRTaGFwZTtcbiAgICBjb25zdCBvdXRwdXRTaGFwZSA9IGJyb2FkQ2FzdFRvQXR0cnMuc2hhcGU7XG5cbiAgICBjb25zdCByZXBzOiBudW1iZXJbXSA9IEFycmF5LmZyb20ob3V0cHV0U2hhcGUpO1xuICAgIGZvciAobGV0IGkgPSBpbnB1dFNoYXBlLmxlbmd0aCAtIDE7IGkgPj0gMDsgaS0tKSB7XG4gICAgICBpZiAoaW5wdXRTaGFwZVtpXSA9PT0gb3V0cHV0U2hhcGVbaV0pIHtcbiAgICAgICAgcmVwc1tpXSA9IDE7XG4gICAgICB9IGVsc2UgaWYgKGlucHV0U2hhcGVbaV0gIT09IDEpIHtcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKGBicm9hZGNhc3RUbygpOiBbJHtcbiAgICAgICAgICAgIGlucHV0U2hhcGV9XSBjYW5ub3QgYmUgYnJvYWRjYXN0IHRvIFske291dHB1dFNoYXBlfV0uYCk7XG4gICAgICB9XG4gICAgfVxuICAgIGNvbnN0IGF4ZXM6IG51bWJlcltdID0gW107XG4gICAgZm9yIChsZXQgaSA9IDA7IGkgPCByZXBzLmxlbmd0aDsgaSsrKSB7XG4gICAgICBpZiAocmVwc1tpXSA+IDEpIHtcbiAgICAgICAgYXhlcy5wdXNoKGkpO1xuICAgICAgfVxuICAgIH1cblxuICAgIHJldHVybiB7eDogKCkgPT4gc3VtKGR5LCBheGVzLCB0cnVlIC8qIGtlZXBEaW1zICovKX07XG4gIH1cbn07XG4iXX0=","/**\n * @license\n * Copyright 2020 Google LLC. All Rights Reserved.\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n * =============================================================================\n */\nimport { Cast } from '../kernel_names';\nexport const castGradConfig = {\n kernelName: Cast,\n gradFunc: (dy) => {\n return { x: () => dy.clone() };\n }\n};\n//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiQ2FzdF9ncmFkLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vLi4vdGZqcy1jb3JlL3NyYy9ncmFkaWVudHMvQ2FzdF9ncmFkLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBOzs7Ozs7Ozs7Ozs7Ozs7R0FlRztBQUVILE9BQU8sRUFBQyxJQUFJLEVBQUMsTUFBTSxpQkFBaUIsQ0FBQztBQUlyQyxNQUFNLENBQUMsTUFBTSxjQUFjLEdBQWU7SUFDeEMsVUFBVSxFQUFFLElBQUk7SUFDaEIsUUFBUSxFQUFFLENBQUMsRUFBVSxFQUFFLEVBQUU7UUFDdkIsT0FBTyxFQUFDLENBQUMsRUFBRSxHQUFHLEVBQUUsQ0FBQyxFQUFFLENBQUMsS0FBSyxFQUFFLEVBQUMsQ0FBQztJQUMvQixDQUFDO0NBQ0YsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbIi8qKlxuICogQGxpY2Vuc2VcbiAqIENvcHlyaWdodCAyMDIwIEdvb2dsZSBMTEMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuXG4gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgXCJMaWNlbnNlXCIpO1xuICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLlxuICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0XG4gKlxuICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wXG4gKlxuICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZVxuICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gXCJBUyBJU1wiIEJBU0lTLFxuICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuXG4gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kXG4gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS5cbiAqID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4gKi9cblxuaW1wb3J0IHtDYXN0fSBmcm9tICcuLi9rZXJuZWxfbmFtZXMnO1xuaW1wb3J0IHtHcmFkQ29uZmlnfSBmcm9tICcuLi9rZXJuZWxfcmVnaXN0cnknO1xuaW1wb3J0IHtUZW5zb3J9IGZyb20gJy4uL3RlbnNvcic7XG5cbmV4cG9ydCBjb25zdCBjYXN0R3JhZENvbmZpZzogR3JhZENvbmZpZyA9IHtcbiAga2VybmVsTmFtZTogQ2FzdCxcbiAgZ3JhZEZ1bmM6IChkeTogVGVuc29yKSA9PiB7XG4gICAgcmV0dXJuIHt4OiAoKSA9PiBkeS5jbG9uZSgpfTtcbiAgfVxufTtcbiJdfQ==","/**\n * @license\n * Copyright 2020 Google LLC. All Rights Reserved.\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n * =============================================================================\n */\nimport { Ceil } from '../kernel_names';\nimport { zerosLike } from '../ops/zeros_like';\nexport const ceilGradConfig = {\n kernelName: Ceil,\n gradFunc: (dy) => {\n // TODO(manrajgrover): Return null for gradients when backprop supports it.\n return { x: () => zerosLike(dy) };\n }\n};\n//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiQ2VpbF9ncmFkLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vLi4vdGZqcy1jb3JlL3NyYy9ncmFkaWVudHMvQ2VpbF9ncmFkLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBOzs7Ozs7Ozs7Ozs7Ozs7R0FlRztBQUVILE9BQU8sRUFBQyxJQUFJLEVBQUMsTUFBTSxpQkFBaUIsQ0FBQztBQUVyQyxPQUFPLEVBQUMsU0FBUyxFQUFDLE1BQU0sbUJBQW1CLENBQUM7QUFHNUMsTUFBTSxDQUFDLE1BQU0sY0FBYyxHQUFlO0lBQ3hDLFVBQVUsRUFBRSxJQUFJO0lBQ2hCLFFBQVEsRUFBRSxDQUFDLEVBQVUsRUFBRSxFQUFFO1FBQ3ZCLDJFQUEyRTtRQUMzRSxPQUFPLEVBQUMsQ0FBQyxFQUFFLEdBQUcsRUFBRSxDQUFDLFNBQVMsQ0FBQyxFQUFFLENBQUMsRUFBQyxDQUFDO0lBQ2xDLENBQUM7Q0FDRixDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiLyoqXG4gKiBAbGljZW5zZVxuICogQ29weXJpZ2h0IDIwMjAgR29vZ2xlIExMQy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC5cbiAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSBcIkxpY2Vuc2VcIik7XG4gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuXG4gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXRcbiAqXG4gKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjBcbiAqXG4gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlXG4gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiBcIkFTIElTXCIgQkFTSVMsXG4gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC5cbiAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmRcbiAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLlxuICogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbiAqL1xuXG5pbXBvcnQge0NlaWx9IGZyb20gJy4uL2tlcm5lbF9uYW1lcyc7XG5pbXBvcnQge0dyYWRDb25maWd9IGZyb20gJy4uL2tlcm5lbF9yZWdpc3RyeSc7XG5pbXBvcnQge3plcm9zTGlrZX0gZnJvbSAnLi4vb3BzL3plcm9zX2xpa2UnO1xuaW1wb3J0IHtUZW5zb3J9IGZyb20gJy4uL3RlbnNvcic7XG5cbmV4cG9ydCBjb25zdCBjZWlsR3JhZENvbmZpZzogR3JhZENvbmZpZyA9IHtcbiAga2VybmVsTmFtZTogQ2VpbCxcbiAgZ3JhZEZ1bmM6IChkeTogVGVuc29yKSA9PiB7XG4gICAgLy8gVE9ETyhtYW5yYWpncm92ZXIpOiBSZXR1cm4gbnVsbCBmb3IgZ3JhZGllbnRzIHdoZW4gYmFja3Byb3Agc3VwcG9ydHMgaXQuXG4gICAgcmV0dXJuIHt4OiAoKSA9PiB6ZXJvc0xpa2UoZHkpfTtcbiAgfVxufTtcbiJdfQ==","/**\n * @license\n * Copyright 2020 Google LLC. All Rights Reserved.\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n * =============================================================================\n */\nimport { ClipByValue } from '../kernel_names';\nimport { greaterEqual } from '../ops/greater_equal';\nimport { lessEqual } from '../ops/less_equal';\nimport { logicalAnd } from '../ops/logical_and';\nimport { where } from '../ops/where';\nimport { zerosLike } from '../ops/zeros_like';\nexport const clipByValueGradConfig = {\n kernelName: ClipByValue,\n inputsToSave: ['x'],\n gradFunc: (dy, saved, attrs) => {\n const [x] = saved;\n const { clipValueMin, clipValueMax } = attrs;\n return {\n x: () => where(logicalAnd(greaterEqual(x, clipValueMin), lessEqual(x, clipValueMax)), dy, zerosLike(dy)),\n };\n }\n};\n//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiQ2xpcEJ5VmFsdWVfZ3JhZC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uLy4uL3RmanMtY29yZS9zcmMvZ3JhZGllbnRzL0NsaXBCeVZhbHVlX2dyYWQudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUE7Ozs7Ozs7Ozs7Ozs7OztHQWVHO0FBRUgsT0FBTyxFQUFDLFdBQVcsRUFBbUIsTUFBTSxpQkFBaUIsQ0FBQztBQUU5RCxPQUFPLEVBQUMsWUFBWSxFQUFDLE1BQU0sc0JBQXNCLENBQUM7QUFDbEQsT0FBTyxFQUFDLFNBQVMsRUFBQyxNQUFNLG1CQUFtQixDQUFDO0FBQzVDLE9BQU8sRUFBQyxVQUFVLEVBQUMsTUFBTSxvQkFBb0IsQ0FBQztBQUM5QyxPQUFPLEVBQUMsS0FBSyxFQUFDLE1BQU0sY0FBYyxDQUFDO0FBQ25DLE9BQU8sRUFBQyxTQUFTLEVBQUMsTUFBTSxtQkFBbUIsQ0FBQztBQUc1QyxNQUFNLENBQUMsTUFBTSxxQkFBcUIsR0FBZTtJQUMvQyxVQUFVLEVBQUUsV0FBVztJQUN2QixZQUFZLEVBQUUsQ0FBQyxHQUFHLENBQUM7SUFDbkIsUUFBUSxFQUFFLENBQUMsRUFBVSxFQUFFLEtBQWUsRUFBRSxLQUFtQixFQUFFLEVBQUU7UUFDN0QsTUFBTSxDQUFDLENBQUMsQ0FBQyxHQUFHLEtBQUssQ0FBQztRQUNsQixNQUFNLEVBQUMsWUFBWSxFQUFFLFlBQVksRUFBQyxHQUFHLEtBQStCLENBQUM7UUFDckUsT0FBTztZQUNMLENBQUMsRUFBRSxHQUFHLEVBQUUsQ0FBQyxLQUFLLENBQ1YsVUFBVSxDQUFDLFlBQVksQ0FBQyxDQUFDLEVBQUUsWUFBWSxDQUFDLEVBQUUsU0FBUyxDQUFDLENBQUMsRUFBRSxZQUFZLENBQUMsQ0FBQyxFQUNyRSxFQUFFLEVBQUUsU0FBUyxDQUFDLEVBQUUsQ0FBQyxDQUFDO1NBQ3ZCLENBQUM7SUFDSixDQUFDO0NBQ0YsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbIi8qKlxuICogQGxpY2Vuc2VcbiAqIENvcHlyaWdodCAyMDIwIEdvb2dsZSBMTEMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuXG4gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgXCJMaWNlbnNlXCIpO1xuICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLlxuICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0XG4gKlxuICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wXG4gKlxuICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZVxuICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gXCJBUyBJU1wiIEJBU0lTLFxuICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuXG4gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kXG4gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS5cbiAqID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4gKi9cblxuaW1wb3J0IHtDbGlwQnlWYWx1ZSwgQ2xpcEJ5VmFsdWVBdHRyc30gZnJvbSAnLi4va2VybmVsX25hbWVzJztcbmltcG9ydCB7R3JhZENvbmZpZywgTmFtZWRBdHRyTWFwfSBmcm9tICcuLi9rZXJuZWxfcmVnaXN0cnknO1xuaW1wb3J0IHtncmVhdGVyRXF1YWx9IGZyb20gJy4uL29wcy9ncmVhdGVyX2VxdWFsJztcbmltcG9ydCB7bGVzc0VxdWFsfSBmcm9tICcuLi9vcHMvbGVzc19lcXVhbCc7XG5pbXBvcnQge2xvZ2ljYWxBbmR9IGZyb20gJy4uL29wcy9sb2dpY2FsX2FuZCc7XG5pbXBvcnQge3doZXJlfSBmcm9tICcuLi9vcHMvd2hlcmUnO1xuaW1wb3J0IHt6ZXJvc0xpa2V9IGZyb20gJy4uL29wcy96ZXJvc19saWtlJztcbmltcG9ydCB7VGVuc29yfSBmcm9tICcuLi90ZW5zb3InO1xuXG5leHBvcnQgY29uc3QgY2xpcEJ5VmFsdWVHcmFkQ29uZmlnOiBHcmFkQ29uZmlnID0ge1xuICBrZXJuZWxOYW1lOiBDbGlwQnlWYWx1ZSxcbiAgaW5wdXRzVG9TYXZlOiBbJ3gnXSxcbiAgZ3JhZEZ1bmM6IChkeTogVGVuc29yLCBzYXZlZDogVGVuc29yW10sIGF0dHJzOiBOYW1lZEF0dHJNYXApID0+IHtcbiAgICBjb25zdCBbeF0gPSBzYXZlZDtcbiAgICBjb25zdCB7Y2xpcFZhbHVlTWluLCBjbGlwVmFsdWVNYXh9ID0gYXR0cnMgYXMge30gYXMgQ2xpcEJ5VmFsdWVBdHRycztcbiAgICByZXR1cm4ge1xuICAgICAgeDogKCkgPT4gd2hlcmUoXG4gICAgICAgICAgbG9naWNhbEFuZChncmVhdGVyRXF1YWwoeCwgY2xpcFZhbHVlTWluKSwgbGVzc0VxdWFsKHgsIGNsaXBWYWx1ZU1heCkpLFxuICAgICAgICAgIGR5LCB6ZXJvc0xpa2UoZHkpKSxcbiAgICB9O1xuICB9XG59O1xuIl19","/**\n * @license\n * Copyright 2020 Google LLC. All Rights Reserved.\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n * =============================================================================\n */\nimport { ComplexAbs } from '../kernel_names';\nimport { absGradConfig } from './Abs_grad';\nexport const complexAbsGradConfig = {\n kernelName: ComplexAbs,\n inputsToSave: ['x'],\n gradFunc: absGradConfig.gradFunc,\n};\n//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiQ29tcGxleEFic19ncmFkLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vLi4vdGZqcy1jb3JlL3NyYy9ncmFkaWVudHMvQ29tcGxleEFic19ncmFkLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBOzs7Ozs7Ozs7Ozs7Ozs7R0FlRztBQUVILE9BQU8sRUFBQyxVQUFVLEVBQUMsTUFBTSxpQkFBaUIsQ0FBQztBQUUzQyxPQUFPLEVBQUMsYUFBYSxFQUFDLE1BQU0sWUFBWSxDQUFDO0FBRXpDLE1BQU0sQ0FBQyxNQUFNLG9CQUFvQixHQUFlO0lBQzlDLFVBQVUsRUFBRSxVQUFVO0lBQ3RCLFlBQVksRUFBRSxDQUFDLEdBQUcsQ0FBQztJQUNuQixRQUFRLEVBQUUsYUFBYSxDQUFDLFFBQVE7Q0FDakMsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbIi8qKlxuICogQGxpY2Vuc2VcbiAqIENvcHlyaWdodCAyMDIwIEdvb2dsZSBMTEMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuXG4gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgXCJMaWNlbnNlXCIpO1xuICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLlxuICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0XG4gKlxuICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wXG4gKlxuICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZVxuICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gXCJBUyBJU1wiIEJBU0lTLFxuICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuXG4gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kXG4gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS5cbiAqID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4gKi9cblxuaW1wb3J0IHtDb21wbGV4QWJzfSBmcm9tICcuLi9rZXJuZWxfbmFtZXMnO1xuaW1wb3J0IHtHcmFkQ29uZmlnfSBmcm9tICcuLi9rZXJuZWxfcmVnaXN0cnknO1xuaW1wb3J0IHthYnNHcmFkQ29uZmlnfSBmcm9tICcuL0Fic19ncmFkJztcblxuZXhwb3J0IGNvbnN0IGNvbXBsZXhBYnNHcmFkQ29uZmlnOiBHcmFkQ29uZmlnID0ge1xuICBrZXJuZWxOYW1lOiBDb21wbGV4QWJzLFxuICBpbnB1dHNUb1NhdmU6IFsneCddLFxuICBncmFkRnVuYzogYWJzR3JhZENvbmZpZy5ncmFkRnVuYyxcbn07XG4iXX0=","/**\n * @license\n * Copyright 2020 Google LLC. All Rights Reserved.\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n * =============================================================================\n */\nimport { Concat } from '../kernel_names';\nimport { split } from '../ops/split';\nimport { parseAxisParam } from '../util';\nexport const concatGradConfig = {\n kernelName: Concat,\n saveAllInputs: true,\n gradFunc: (dy, saved, attrs) => {\n const shapes = saved.map(t => t.shape);\n const { axis } = attrs;\n const $axis = parseAxisParam(axis, saved[0].shape)[0];\n const sizeSplits = shapes.map(s => s[$axis]);\n const derTensors = split(dy, sizeSplits, $axis);\n return derTensors.map(t => () => t);\n }\n};\n//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiQ29uY2F0X2dyYWQuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi8uLi90ZmpzLWNvcmUvc3JjL2dyYWRpZW50cy9Db25jYXRfZ3JhZC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQTs7Ozs7Ozs7Ozs7Ozs7O0dBZUc7QUFDSCxPQUFPLEVBQUMsTUFBTSxFQUFjLE1BQU0saUJBQWlCLENBQUM7QUFFcEQsT0FBTyxFQUFDLEtBQUssRUFBQyxNQUFNLGNBQWMsQ0FBQztBQUVuQyxPQUFPLEVBQUMsY0FBYyxFQUFDLE1BQU0sU0FBUyxDQUFDO0FBRXZDLE1BQU0sQ0FBQyxNQUFNLGdCQUFnQixHQUFlO0lBQzFDLFVBQVUsRUFBRSxNQUFNO0lBQ2xCLGFBQWEsRUFBRSxJQUFJO0lBQ25CLFFBQVEsRUFBRSxDQUFDLEVBQVUsRUFBRSxLQUFlLEVBQUUsS0FBbUIsRUFBRSxFQUFFO1FBQzdELE1BQU0sTUFBTSxHQUFHLEtBQUssQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsS0FBSyxDQUFDLENBQUM7UUFDdkMsTUFBTSxFQUFDLElBQUksRUFBQyxHQUFHLEtBQTBCLENBQUM7UUFDMUMsTUFBTSxLQUFLLEdBQUcsY0FBYyxDQUFDLElBQUksRUFBRSxLQUFLLENBQUMsQ0FBQyxDQUFDLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUM7UUFDdEQsTUFBTSxVQUFVLEdBQUcsTUFBTSxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDO1FBQzdDLE1BQU0sVUFBVSxHQUFHLEtBQUssQ0FBQyxFQUFFLEVBQUUsVUFBVSxFQUFFLEtBQUssQ0FBQyxDQUFDO1FBQ2hELE9BQU8sVUFBVSxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLEdBQUcsRUFBRSxDQUFDLENBQUMsQ0FBTyxDQUFDO0lBQzVDLENBQUM7Q0FDRixDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiLyoqXG4gKiBAbGljZW5zZVxuICogQ29weXJpZ2h0IDIwMjAgR29vZ2xlIExMQy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC5cbiAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSBcIkxpY2Vuc2VcIik7XG4gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuXG4gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXRcbiAqXG4gKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjBcbiAqXG4gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlXG4gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiBcIkFTIElTXCIgQkFTSVMsXG4gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC5cbiAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmRcbiAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLlxuICogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbiAqL1xuaW1wb3J0IHtDb25jYXQsIENvbmNhdEF0dHJzfSBmcm9tICcuLi9rZXJuZWxfbmFtZXMnO1xuaW1wb3J0IHtHcmFkQ29uZmlnLCBOYW1lZEF0dHJNYXB9IGZyb20gJy4uL2tlcm5lbF9yZWdpc3RyeSc7XG5pbXBvcnQge3NwbGl0fSBmcm9tICcuLi9vcHMvc3BsaXQnO1xuaW1wb3J0IHtUZW5zb3J9IGZyb20gJy4uL3RlbnNvcic7XG5pbXBvcnQge3BhcnNlQXhpc1BhcmFtfSBmcm9tICcuLi91dGlsJztcblxuZXhwb3J0IGNvbnN0IGNvbmNhdEdyYWRDb25maWc6IEdyYWRDb25maWcgPSB7XG4gIGtlcm5lbE5hbWU6IENvbmNhdCxcbiAgc2F2ZUFsbElucHV0czogdHJ1ZSxcbiAgZ3JhZEZ1bmM6IChkeTogVGVuc29yLCBzYXZlZDogVGVuc29yW10sIGF0dHJzOiBOYW1lZEF0dHJNYXApID0+IHtcbiAgICBjb25zdCBzaGFwZXMgPSBzYXZlZC5tYXAodCA9PiB0LnNoYXBlKTtcbiAgICBjb25zdCB7YXhpc30gPSBhdHRycyBhcyB7fSBhcyBDb25jYXRBdHRycztcbiAgICBjb25zdCAkYXhpcyA9IHBhcnNlQXhpc1BhcmFtKGF4aXMsIHNhdmVkWzBdLnNoYXBlKVswXTtcbiAgICBjb25zdCBzaXplU3BsaXRzID0gc2hhcGVzLm1hcChzID0+IHNbJGF4aXNdKTtcbiAgICBjb25zdCBkZXJUZW5zb3JzID0gc3BsaXQoZHksIHNpemVTcGxpdHMsICRheGlzKTtcbiAgICByZXR1cm4gZGVyVGVuc29ycy5tYXAodCA9PiAoKSA9PiB0KSBhcyB7fTtcbiAgfVxufTtcbiJdfQ==","/**\n * @license\n * Copyright 2020 Google LLC. All Rights Reserved.\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n * =============================================================================\n */\nimport { Conv2D } from '../kernel_names';\nimport { conv2DBackpropFilter } from '../ops/conv2d_backprop_filter';\nimport { conv2DBackpropInput } from '../ops/conv2d_backprop_input';\nimport * as conv_util from '../ops/conv_util';\nimport * as util from '../util';\nexport const conv2DGradConfig = {\n kernelName: Conv2D,\n inputsToSave: ['x', 'filter'],\n gradFunc: (dy, saved, attrs) => {\n const [x4D, $filter] = saved;\n const { dilations, strides, pad, dataFormat } = attrs;\n util.assert(conv_util.tupleValuesAreOne(dilations), () => 'Error in gradient of conv2D: dilation rates greater than 1 ' +\n `are not yet supported in gradients. Got dilations '${dilations}'`);\n return {\n x: () => conv2DBackpropInput(x4D.shape, dy, $filter, strides, pad, dataFormat),\n filter: () => conv2DBackpropFilter(x4D, dy, $filter.shape, strides, pad, dataFormat)\n };\n }\n};\n//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiQ29udjJEX2dyYWQuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi8uLi90ZmpzLWNvcmUvc3JjL2dyYWRpZW50cy9Db252MkRfZ3JhZC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQTs7Ozs7Ozs7Ozs7Ozs7O0dBZUc7QUFDSCxPQUFPLEVBQUMsTUFBTSxFQUFjLE1BQU0saUJBQWlCLENBQUM7QUFFcEQsT0FBTyxFQUFDLG9CQUFvQixFQUFDLE1BQU0sK0JBQStCLENBQUM7QUFDbkUsT0FBTyxFQUFDLG1CQUFtQixFQUFDLE1BQU0sOEJBQThCLENBQUM7QUFDakUsT0FBTyxLQUFLLFNBQVMsTUFBTSxrQkFBa0IsQ0FBQztBQUU5QyxPQUFPLEtBQUssSUFBSSxNQUFNLFNBQVMsQ0FBQztBQUVoQyxNQUFNLENBQUMsTUFBTSxnQkFBZ0IsR0FBZTtJQUMxQyxVQUFVLEVBQUUsTUFBTTtJQUNsQixZQUFZLEVBQUUsQ0FBQyxHQUFHLEVBQUUsUUFBUSxDQUFDO0lBQzdCLFFBQVEsRUFBRSxDQUFDLEVBQVksRUFBRSxLQUFlLEVBQUUsS0FBbUIsRUFBRSxFQUFFO1FBQy9ELE1BQU0sQ0FBQyxHQUFHLEVBQUUsT0FBTyxDQUFDLEdBQUcsS0FBNkIsQ0FBQztRQUNyRCxNQUFNLEVBQUMsU0FBUyxFQUFFLE9BQU8sRUFBRSxHQUFHLEVBQUUsVUFBVSxFQUFDLEdBQUcsS0FBMEIsQ0FBQztRQUV6RSxJQUFJLENBQUMsTUFBTSxDQUNQLFNBQVMsQ0FBQyxpQkFBaUIsQ0FBQyxTQUFTLENBQUMsRUFDdEMsR0FBRyxFQUFFLENBQUMsNkRBQTZEO1lBQy9ELHNEQUFzRCxTQUFTLEdBQUcsQ0FBQyxDQUFDO1FBRTVFLE9BQU87WUFDTCxDQUFDLEVBQUUsR0FBRyxFQUFFLENBQ0osbUJBQW1CLENBQUMsR0FBRyxDQUFDLEtBQUssRUFBRSxFQUFFLEVBQUUsT0FBTyxFQUFFLE9BQU8sRUFBRSxHQUFHLEVBQUUsVUFBVSxDQUFDO1lBQ3pFLE1BQU0sRUFBRSxHQUFHLEVBQUUsQ0FDVCxvQkFBb0IsQ0FBQyxHQUFHLEVBQUUsRUFBRSxFQUFFLE9BQU8sQ0FBQyxLQUFLLEVBQUUsT0FBTyxFQUFFLEdBQUcsRUFBRSxVQUFVLENBQUM7U0FDM0UsQ0FBQztJQUNKLENBQUM7Q0FDRixDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiLyoqXG4gKiBAbGljZW5zZVxuICogQ29weXJpZ2h0IDIwMjAgR29vZ2xlIExMQy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC5cbiAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSBcIkxpY2Vuc2VcIik7XG4gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuXG4gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXRcbiAqXG4gKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjBcbiAqXG4gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlXG4gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiBcIkFTIElTXCIgQkFTSVMsXG4gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC5cbiAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmRcbiAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLlxuICogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbiAqL1xuaW1wb3J0IHtDb252MkQsIENvbnYyREF0dHJzfSBmcm9tICcuLi9rZXJuZWxfbmFtZXMnO1xuaW1wb3J0IHtHcmFkQ29uZmlnLCBOYW1lZEF0dHJNYXB9IGZyb20gJy4uL2tlcm5lbF9yZWdpc3RyeSc7XG5pbXBvcnQge2NvbnYyREJhY2twcm9wRmlsdGVyfSBmcm9tICcuLi9vcHMvY29udjJkX2JhY2twcm9wX2ZpbHRlcic7XG5pbXBvcnQge2NvbnYyREJhY2twcm9wSW5wdXR9IGZyb20gJy4uL29wcy9jb252MmRfYmFja3Byb3BfaW5wdXQnO1xuaW1wb3J0ICogYXMgY29udl91dGlsIGZyb20gJy4uL29wcy9jb252X3V0aWwnO1xuaW1wb3J0IHtUZW5zb3IsIFRlbnNvcjREfSBmcm9tICcuLi90ZW5zb3InO1xuaW1wb3J0ICogYXMgdXRpbCBmcm9tICcuLi91dGlsJztcblxuZXhwb3J0IGNvbnN0IGNvbnYyREdyYWRDb25maWc6IEdyYWRDb25maWcgPSB7XG4gIGtlcm5lbE5hbWU6IENvbnYyRCxcbiAgaW5wdXRzVG9TYXZlOiBbJ3gnLCAnZmlsdGVyJ10sXG4gIGdyYWRGdW5jOiAoZHk6IFRlbnNvcjRELCBzYXZlZDogVGVuc29yW10sIGF0dHJzOiBOYW1lZEF0dHJNYXApID0+IHtcbiAgICBjb25zdCBbeDRELCAkZmlsdGVyXSA9IHNhdmVkIGFzIFtUZW5zb3I0RCwgVGVuc29yNERdO1xuICAgIGNvbnN0IHtkaWxhdGlvbnMsIHN0cmlkZXMsIHBhZCwgZGF0YUZvcm1hdH0gPSBhdHRycyBhcyB7fSBhcyBDb252MkRBdHRycztcblxuICAgIHV0aWwuYXNzZXJ0KFxuICAgICAgICBjb252X3V0aWwudHVwbGVWYWx1ZXNBcmVPbmUoZGlsYXRpb25zKSxcbiAgICAgICAgKCkgPT4gJ0Vycm9yIGluIGdyYWRpZW50IG9mIGNvbnYyRDogZGlsYXRpb24gcmF0ZXMgZ3JlYXRlciB0aGFuIDEgJyArXG4gICAgICAgICAgICBgYXJlIG5vdCB5ZXQgc3VwcG9ydGVkIGluIGdyYWRpZW50cy4gR290IGRpbGF0aW9ucyAnJHtkaWxhdGlvbnN9J2ApO1xuXG4gICAgcmV0dXJuIHtcbiAgICAgIHg6ICgpID0+XG4gICAgICAgICAgY29udjJEQmFja3Byb3BJbnB1dCh4NEQuc2hhcGUsIGR5LCAkZmlsdGVyLCBzdHJpZGVzLCBwYWQsIGRhdGFGb3JtYXQpLFxuICAgICAgZmlsdGVyOiAoKSA9PlxuICAgICAgICAgIGNvbnYyREJhY2twcm9wRmlsdGVyKHg0RCwgZHksICRmaWx0ZXIuc2hhcGUsIHN0cmlkZXMsIHBhZCwgZGF0YUZvcm1hdClcbiAgICB9O1xuICB9XG59O1xuIl19","/**\n * @license\n * Copyright 2020 Google LLC. All Rights Reserved.\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n * =============================================================================\n */\nimport { Conv2DBackpropInput } from '../kernel_names';\nimport { conv2d } from '../ops/conv2d';\nimport { conv2DBackpropFilter } from '../ops/conv2d_backprop_filter';\nexport const conv2DBackpropInputGradConfig = {\n kernelName: Conv2DBackpropInput,\n inputsToSave: ['dy', 'filter'],\n gradFunc: (ddx, saved, attrs) => {\n const [dy, filter] = saved;\n const { strides, pad, dataFormat, dimRoundingMode } = attrs;\n return {\n dy: () => conv2d(ddx, filter, strides, pad, dataFormat, 1 /* dilations */, dimRoundingMode),\n filter: () => conv2DBackpropFilter(ddx, dy, filter.shape, strides, pad, dataFormat, dimRoundingMode)\n };\n }\n};\n//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiQ29udjJEQmFja3Byb3BJbnB1dF9ncmFkLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vLi4vdGZqcy1jb3JlL3NyYy9ncmFkaWVudHMvQ29udjJEQmFja3Byb3BJbnB1dF9ncmFkLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBOzs7Ozs7Ozs7Ozs7Ozs7R0FlRztBQUNILE9BQU8sRUFBQyxtQkFBbUIsRUFBMkIsTUFBTSxpQkFBaUIsQ0FBQztBQUU5RSxPQUFPLEVBQUMsTUFBTSxFQUFDLE1BQU0sZUFBZSxDQUFDO0FBQ3JDLE9BQU8sRUFBQyxvQkFBb0IsRUFBQyxNQUFNLCtCQUErQixDQUFDO0FBR25FLE1BQU0sQ0FBQyxNQUFNLDZCQUE2QixHQUFlO0lBQ3ZELFVBQVUsRUFBRSxtQkFBbUI7SUFDL0IsWUFBWSxFQUFFLENBQUMsSUFBSSxFQUFFLFFBQVEsQ0FBQztJQUM5QixRQUFRLEVBQUUsQ0FBQyxHQUFhLEVBQUUsS0FBZSxFQUFFLEtBQW1CLEVBQUUsRUFBRTtRQUNoRSxNQUFNLENBQUMsRUFBRSxFQUFFLE1BQU0sQ0FBQyxHQUFHLEtBQTZCLENBQUM7UUFFbkQsTUFBTSxFQUFDLE9BQU8sRUFBRSxHQUFHLEVBQUUsVUFBVSxFQUFFLGVBQWUsRUFBQyxHQUM3QyxLQUF1QyxDQUFDO1FBRTVDLE9BQU87WUFDTCxFQUFFLEVBQUUsR0FBRyxFQUFFLENBQUMsTUFBTSxDQUNaLEdBQUcsRUFBRSxNQUFNLEVBQUUsT0FBTyxFQUFFLEdBQUcsRUFBRSxVQUFVLEVBQUUsQ0FBQyxDQUFDLGVBQWUsRUFDeEQsZUFBZSxDQUFDO1lBQ3BCLE1BQU0sRUFBRSxHQUFHLEVBQUUsQ0FBQyxvQkFBb0IsQ0FDOUIsR0FBRyxFQUFFLEVBQUUsRUFBRSxNQUFNLENBQUMsS0FBSyxFQUFFLE9BQU8sRUFBRSxHQUFHLEVBQUUsVUFBVSxFQUFFLGVBQWUsQ0FBQztTQUN0RSxDQUFDO0lBQ0osQ0FBQztDQUNGLENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyIvKipcbiAqIEBsaWNlbnNlXG4gKiBDb3B5cmlnaHQgMjAyMCBHb29nbGUgTExDLiBBbGwgUmlnaHRzIFJlc2VydmVkLlxuICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlIFwiTGljZW5zZVwiKTtcbiAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS5cbiAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdFxuICpcbiAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMFxuICpcbiAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmVcbiAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuIFwiQVMgSVNcIiBCQVNJUyxcbiAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLlxuICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZFxuICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuXG4gKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuICovXG5pbXBvcnQge0NvbnYyREJhY2twcm9wSW5wdXQsIENvbnYyREJhY2twcm9wSW5wdXRBdHRyc30gZnJvbSAnLi4va2VybmVsX25hbWVzJztcbmltcG9ydCB7R3JhZENvbmZpZywgTmFtZWRBdHRyTWFwfSBmcm9tICcuLi9rZXJuZWxfcmVnaXN0cnknO1xuaW1wb3J0IHtjb252MmR9IGZyb20gJy4uL29wcy9jb252MmQnO1xuaW1wb3J0IHtjb252MkRCYWNrcHJvcEZpbHRlcn0gZnJvbSAnLi4vb3BzL2NvbnYyZF9iYWNrcHJvcF9maWx0ZXInO1xuaW1wb3J0IHtUZW5zb3IsIFRlbnNvcjREfSBmcm9tICcuLi90ZW5zb3InO1xuXG5leHBvcnQgY29uc3QgY29udjJEQmFja3Byb3BJbnB1dEdyYWRDb25maWc6IEdyYWRDb25maWcgPSB7XG4gIGtlcm5lbE5hbWU6IENvbnYyREJhY2twcm9wSW5wdXQsXG4gIGlucHV0c1RvU2F2ZTogWydkeScsICdmaWx0ZXInXSxcbiAgZ3JhZEZ1bmM6IChkZHg6IFRlbnNvcjRELCBzYXZlZDogVGVuc29yW10sIGF0dHJzOiBOYW1lZEF0dHJNYXApID0+IHtcbiAgICBjb25zdCBbZHksIGZpbHRlcl0gPSBzYXZlZCBhcyBbVGVuc29yNEQsIFRlbnNvcjREXTtcblxuICAgIGNvbnN0IHtzdHJpZGVzLCBwYWQsIGRhdGFGb3JtYXQsIGRpbVJvdW5kaW5nTW9kZX0gPVxuICAgICAgICBhdHRycyBhcyB7fSBhcyBDb252MkRCYWNrcHJvcElucHV0QXR0cnM7XG5cbiAgICByZXR1cm4ge1xuICAgICAgZHk6ICgpID0+IGNvbnYyZChcbiAgICAgICAgICBkZHgsIGZpbHRlciwgc3RyaWRlcywgcGFkLCBkYXRhRm9ybWF0LCAxIC8qIGRpbGF0aW9ucyAqLyxcbiAgICAgICAgICBkaW1Sb3VuZGluZ01vZGUpLFxuICAgICAgZmlsdGVyOiAoKSA9PiBjb252MkRCYWNrcHJvcEZpbHRlcihcbiAgICAgICAgICBkZHgsIGR5LCBmaWx0ZXIuc2hhcGUsIHN0cmlkZXMsIHBhZCwgZGF0YUZvcm1hdCwgZGltUm91bmRpbmdNb2RlKVxuICAgIH07XG4gIH1cbn07XG4iXX0=","/**\n * @license\n * Copyright 2020 Google LLC. All Rights Reserved.\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n * =============================================================================\n */\nimport { ENGINE } from '../engine';\nimport { Conv3DBackpropFilterV2 } from '../kernel_names';\nimport * as util from '../util';\nimport { op } from './operation';\nimport { reshape } from './reshape';\n/**\n * Computes the derivative of the filter of a 3D convolution.\n *\n * @param x The input tensor, of rank 5 or rank 4 of shape\n * [batch, depth, height, width, inChannels]. If rank 4, batch of 1 is\n * assumed.\n * @param dy The dy image, of rank 5 or rank 4, of shape\n * [batch, depth, height, width, outDepth]. If rank 4, batch of 1 is\n * assumed.\n * @param filterShape The shape of the filter, length 5,\n * [filterDepth, filterHeight, filterWidth, inDepth, outDepth].\n * @param strides The strides of the convolution: [strideDepth, strideHeight,\n * strideWidth].\n * @param pad A string from: 'same', 'valid'. The type of padding algorithm\n * used in the forward prop of the op.\n */\nfunction conv3DBackpropFilter_(x, dy, filterShape, strides, pad) {\n let x5D = x;\n if (x.rank === 4) {\n x5D = reshape(x, [1, x.shape[0], x.shape[1], x.shape[2], x.shape[3]]);\n }\n let dy5D = dy;\n if (dy5D.rank === 4) {\n dy5D = reshape(dy, [1, dy.shape[0], dy.shape[1], dy.shape[2], dy.shape[3]]);\n }\n util.assert(x5D.rank === 5, () => `Error in conv3dDerFilter: input must be rank 5, but got shape ` +\n `${x5D.shape}.`);\n util.assert(dy5D.rank === 5, () => `Error in conv3dDerFilter: dy must be rank 5, but got shape ` +\n `${dy5D.shape}.`);\n util.assert(filterShape.length === 5, () => `Error in conv3dDerFilter: filterShape must be length 5, but got ` +\n `${filterShape}.`);\n util.assert(x5D.shape[4] === filterShape[3], () => `Error in conv3dDerFilter: depth of input ${x5D.shape[4]}) must ` +\n `match input depth in filter (${filterShape[3]}.`);\n util.assert(dy5D.shape[4] === filterShape[4], () => `Error in conv3dDerFilter: depth of dy (${dy5D.shape[4]}) must ` +\n `match output depth for filter (${filterShape[4]}).`);\n const inputs = { x: x5D, dy: dy5D };\n const attrs = { strides, pad, filterShape };\n // tslint:disable-next-line: no-unnecessary-type-assertion\n return ENGINE.runKernel(Conv3DBackpropFilterV2, inputs, attrs);\n}\nexport const conv3DBackpropFilter = op({ conv3DBackpropFilter_ });\n//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY29udjNkX2JhY2twcm9wX2ZpbHRlci5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uLy4uL3RmanMtY29yZS9zcmMvb3BzL2NvbnYzZF9iYWNrcHJvcF9maWx0ZXIudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUE7Ozs7Ozs7Ozs7Ozs7OztHQWVHO0FBQ0gsT0FBTyxFQUFDLE1BQU0sRUFBQyxNQUFNLFdBQVcsQ0FBQztBQUNqQyxPQUFPLEVBQUMsc0JBQXNCLEVBQTRELE1BQU0saUJBQWlCLENBQUM7QUFJbEgsT0FBTyxLQUFLLElBQUksTUFBTSxTQUFTLENBQUM7QUFFaEMsT0FBTyxFQUFDLEVBQUUsRUFBQyxNQUFNLGFBQWEsQ0FBQztBQUMvQixPQUFPLEVBQUMsT0FBTyxFQUFDLE1BQU0sV0FBVyxDQUFDO0FBRWxDOzs7Ozs7Ozs7Ozs7Ozs7R0FlRztBQUNILFNBQVMscUJBQXFCLENBQzFCLENBQUksRUFBRSxFQUFLLEVBQUUsV0FBcUQsRUFDbEUsT0FBd0MsRUFBRSxHQUFtQjtJQUMvRCxJQUFJLEdBQUcsR0FBRyxDQUFhLENBQUM7SUFDeEIsSUFBSSxDQUFDLENBQUMsSUFBSSxLQUFLLENBQUMsRUFBRTtRQUNoQixHQUFHLEdBQUcsT0FBTyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQztLQUN2RTtJQUNELElBQUksSUFBSSxHQUFHLEVBQWMsQ0FBQztJQUMxQixJQUFJLElBQUksQ0FBQyxJQUFJLEtBQUssQ0FBQyxFQUFFO1FBQ25CLElBQUksR0FBRyxPQUFPLENBQUMsRUFBRSxFQUFFLENBQUMsQ0FBQyxFQUFFLEVBQUUsQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDLEVBQUUsRUFBRSxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUMsRUFBRSxFQUFFLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQyxFQUFFLEVBQUUsQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDO0tBQzdFO0lBQ0QsSUFBSSxDQUFDLE1BQU0sQ0FDUCxHQUFHLENBQUMsSUFBSSxLQUFLLENBQUMsRUFDZCxHQUFHLEVBQUUsQ0FBQyxnRUFBZ0U7UUFDbEUsR0FBRyxHQUFHLENBQUMsS0FBSyxHQUFHLENBQUMsQ0FBQztJQUN6QixJQUFJLENBQUMsTUFBTSxDQUNQLElBQUksQ0FBQyxJQUFJLEtBQUssQ0FBQyxFQUNmLEdBQUcsRUFBRSxDQUFDLDZEQUE2RDtRQUMvRCxHQUFHLElBQUksQ0FBQyxLQUFLLEdBQUcsQ0FBQyxDQUFDO0lBQzFCLElBQUksQ0FBQyxNQUFNLENBQ1AsV0FBVyxDQUFDLE1BQU0sS0FBSyxDQUFDLEVBQ3hCLEdBQUcsRUFBRSxDQUFDLGtFQUFrRTtRQUNwRSxHQUFHLFdBQVcsR0FBRyxDQUFDLENBQUM7SUFDM0IsSUFBSSxDQUFDLE1BQU0sQ0FDUCxHQUFHLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQyxLQUFLLFdBQVcsQ0FBQyxDQUFDLENBQUMsRUFDL0IsR0FBRyxFQUFFLENBQUMsNENBQTRDLEdBQUcsQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDLFNBQVM7UUFDbkUsZ0NBQWdDLFdBQVcsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUM7SUFDM0QsSUFBSSxDQUFDLE1BQU0sQ0FDUCxJQUFJLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQyxLQUFLLFdBQVcsQ0FBQyxDQUFDLENBQUMsRUFDaEMsR0FBRyxFQUFFLENBQUMsMENBQTBDLElBQUksQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDLFNBQVM7UUFDbEUsa0NBQWtDLFdBQVcsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUM7SUFFOUQsTUFBTSxNQUFNLEdBQWlDLEVBQUMsQ0FBQyxFQUFFLEdBQUcsRUFBRSxFQUFFLEVBQUUsSUFBSSxFQUFDLENBQUM7SUFFaEUsTUFBTSxLQUFLLEdBQWdDLEVBQUMsT0FBTyxFQUFFLEdBQUcsRUFBRSxXQUFXLEVBQUMsQ0FBQztJQUV2RSwwREFBMEQ7SUFDMUQsT0FBTyxNQUFNLENBQUMsU0FBUyxDQUNaLHNCQUFzQixFQUFFLE1BQThCLEVBQ3RELEtBQTJCLENBQWEsQ0FBQztBQUN0RCxDQUFDO0FBRUQsTUFBTSxDQUFDLE1BQU0sb0JBQW9CLEdBQUcsRUFBRSxDQUFDLEVBQUMscUJBQXFCLEVBQUMsQ0FBQyxDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiLyoqXG4gKiBAbGljZW5zZVxuICogQ29weXJpZ2h0IDIwMjAgR29vZ2xlIExMQy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC5cbiAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSBcIkxpY2Vuc2VcIik7XG4gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuXG4gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXRcbiAqXG4gKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjBcbiAqXG4gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlXG4gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiBcIkFTIElTXCIgQkFTSVMsXG4gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC5cbiAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmRcbiAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLlxuICogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbiAqL1xuaW1wb3J0IHtFTkdJTkV9IGZyb20gJy4uL2VuZ2luZSc7XG5pbXBvcnQge0NvbnYzREJhY2twcm9wRmlsdGVyVjIsIENvbnYzREJhY2twcm9wRmlsdGVyVjJBdHRycywgQ29udjNEQmFja3Byb3BGaWx0ZXJWMklucHV0c30gZnJvbSAnLi4va2VybmVsX25hbWVzJztcbmltcG9ydCB7TmFtZWRBdHRyTWFwfSBmcm9tICcuLi9rZXJuZWxfcmVnaXN0cnknO1xuaW1wb3J0IHtUZW5zb3I0RCwgVGVuc29yNUR9IGZyb20gJy4uL3RlbnNvcic7XG5pbXBvcnQge05hbWVkVGVuc29yTWFwfSBmcm9tICcuLi90ZW5zb3JfdHlwZXMnO1xuaW1wb3J0ICogYXMgdXRpbCBmcm9tICcuLi91dGlsJztcblxuaW1wb3J0IHtvcH0gZnJvbSAnLi9vcGVyYXRpb24nO1xuaW1wb3J0IHtyZXNoYXBlfSBmcm9tICcuL3Jlc2hhcGUnO1xuXG4vKipcbiAqIENvbXB1dGVzIHRoZSBkZXJpdmF0aXZlIG9mIHRoZSBmaWx0ZXIgb2YgYSAzRCBjb252b2x1dGlvbi5cbiAqXG4gKiBAcGFyYW0geCBUaGUgaW5wdXQgdGVuc29yLCBvZiByYW5rIDUgb3IgcmFuayA0IG9mIHNoYXBlXG4gKiAgICAgW2JhdGNoLCBkZXB0aCwgaGVpZ2h0LCB3aWR0aCwgaW5DaGFubmVsc10uIElmIHJhbmsgNCwgYmF0Y2ggb2YgMSBpc1xuICogICAgIGFzc3VtZWQuXG4gKiBAcGFyYW0gZHkgVGhlIGR5IGltYWdlLCBvZiByYW5rIDUgb3IgcmFuayA0LCBvZiBzaGFwZVxuICogICAgIFtiYXRjaCwgZGVwdGgsIGhlaWdodCwgd2lkdGgsIG91dERlcHRoXS4gSWYgcmFuayA0LCBiYXRjaCBvZiAxIGlzXG4gKiAgICAgYXNzdW1lZC5cbiAqIEBwYXJhbSBmaWx0ZXJTaGFwZSBUaGUgc2hhcGUgb2YgdGhlIGZpbHRlciwgbGVuZ3RoIDUsXG4gKiAgICAgW2ZpbHRlckRlcHRoLCBmaWx0ZXJIZWlnaHQsIGZpbHRlcldpZHRoLCBpbkRlcHRoLCBvdXREZXB0aF0uXG4gKiBAcGFyYW0gc3RyaWRlcyBUaGUgc3RyaWRlcyBvZiB0aGUgY29udm9sdXRpb246IFtzdHJpZGVEZXB0aCwgc3RyaWRlSGVpZ2h0LFxuICogc3RyaWRlV2lkdGhdLlxuICogQHBhcmFtIHBhZCBBIHN0cmluZyBmcm9tOiAnc2FtZScsICd2YWxpZCcuIFRoZSB0eXBlIG9mIHBhZGRpbmcgYWxnb3JpdGhtXG4gKiAgICAgdXNlZCBpbiB0aGUgZm9yd2FyZCBwcm9wIG9mIHRoZSBvcC5cbiAqL1xuZnVuY3Rpb24gY29udjNEQmFja3Byb3BGaWx0ZXJfPFQgZXh0ZW5kcyBUZW5zb3I0RHxUZW5zb3I1RD4oXG4gICAgeDogVCwgZHk6IFQsIGZpbHRlclNoYXBlOiBbbnVtYmVyLCBudW1iZXIsIG51bWJlciwgbnVtYmVyLCBudW1iZXJdLFxuICAgIHN0cmlkZXM6IFtudW1iZXIsIG51bWJlciwgbnVtYmVyXXxudW1iZXIsIHBhZDogJ3ZhbGlkJ3wnc2FtZScpOiBUZW5zb3I1RCB7XG4gIGxldCB4NUQgPSB4IGFzIFRlbnNvcjVEO1xuICBpZiAoeC5yYW5rID09PSA0KSB7XG4gICAgeDVEID0gcmVzaGFwZSh4LCBbMSwgeC5zaGFwZVswXSwgeC5zaGFwZVsxXSwgeC5zaGFwZVsyXSwgeC5zaGFwZVszXV0pO1xuICB9XG4gIGxldCBkeTVEID0gZHkgYXMgVGVuc29yNUQ7XG4gIGlmIChkeTVELnJhbmsgPT09IDQpIHtcbiAgICBkeTVEID0gcmVzaGFwZShkeSwgWzEsIGR5LnNoYXBlWzBdLCBkeS5zaGFwZVsxXSwgZHkuc2hhcGVbMl0sIGR5LnNoYXBlWzNdXSk7XG4gIH1cbiAgdXRpbC5hc3NlcnQoXG4gICAgICB4NUQucmFuayA9PT0gNSxcbiAgICAgICgpID0+IGBFcnJvciBpbiBjb252M2REZXJGaWx0ZXI6IGlucHV0IG11c3QgYmUgcmFuayA1LCBidXQgZ290IHNoYXBlIGAgK1xuICAgICAgICAgIGAke3g1RC5zaGFwZX0uYCk7XG4gIHV0aWwuYXNzZXJ0KFxuICAgICAgZHk1RC5yYW5rID09PSA1LFxuICAgICAgKCkgPT4gYEVycm9yIGluIGNvbnYzZERlckZpbHRlcjogZHkgbXVzdCBiZSByYW5rIDUsIGJ1dCBnb3Qgc2hhcGUgYCArXG4gICAgICAgICAgYCR7ZHk1RC5zaGFwZX0uYCk7XG4gIHV0aWwuYXNzZXJ0KFxuICAgICAgZmlsdGVyU2hhcGUubGVuZ3RoID09PSA1LFxuICAgICAgKCkgPT4gYEVycm9yIGluIGNvbnYzZERlckZpbHRlcjogZmlsdGVyU2hhcGUgbXVzdCBiZSBsZW5ndGggNSwgYnV0IGdvdCBgICtcbiAgICAgICAgICBgJHtmaWx0ZXJTaGFwZX0uYCk7XG4gIHV0aWwuYXNzZXJ0KFxuICAgICAgeDVELnNoYXBlWzRdID09PSBmaWx0ZXJTaGFwZVszXSxcbiAgICAgICgpID0+IGBFcnJvciBpbiBjb252M2REZXJGaWx0ZXI6IGRlcHRoIG9mIGlucHV0ICR7eDVELnNoYXBlWzRdfSkgbXVzdCBgICtcbiAgICAgICAgICBgbWF0Y2ggaW5wdXQgZGVwdGggaW4gZmlsdGVyICgke2ZpbHRlclNoYXBlWzNdfS5gKTtcbiAgdXRpbC5hc3NlcnQoXG4gICAgICBkeTVELnNoYXBlWzRdID09PSBmaWx0ZXJTaGFwZVs0XSxcbiAgICAgICgpID0+IGBFcnJvciBpbiBjb252M2REZXJGaWx0ZXI6IGRlcHRoIG9mIGR5ICgke2R5NUQuc2hhcGVbNF19KSBtdXN0IGAgK1xuICAgICAgICAgIGBtYXRjaCBvdXRwdXQgZGVwdGggZm9yIGZpbHRlciAoJHtmaWx0ZXJTaGFwZVs0XX0pLmApO1xuXG4gIGNvbnN0IGlucHV0czogQ29udjNEQmFja3Byb3BGaWx0ZXJWMklucHV0cyA9IHt4OiB4NUQsIGR5OiBkeTVEfTtcblxuICBjb25zdCBhdHRyczogQ29udjNEQmFja3Byb3BGaWx0ZXJWMkF0dHJzID0ge3N0cmlkZXMsIHBhZCwgZmlsdGVyU2hhcGV9O1xuXG4gIC8vIHRzbGludDpkaXNhYmxlLW5leHQtbGluZTogbm8tdW5uZWNlc3NhcnktdHlwZS1hc3NlcnRpb25cbiAgcmV0dXJuIEVOR0lORS5ydW5LZXJuZWwoXG4gICAgICAgICAgICAgQ29udjNEQmFja3Byb3BGaWx0ZXJWMiwgaW5wdXRzIGFzIHt9IGFzIE5hbWVkVGVuc29yTWFwLFxuICAgICAgICAgICAgIGF0dHJzIGFzIHt9IGFzIE5hbWVkQXR0ck1hcCkgYXMgVGVuc29yNUQ7XG59XG5cbmV4cG9ydCBjb25zdCBjb252M0RCYWNrcHJvcEZpbHRlciA9IG9wKHtjb252M0RCYWNrcHJvcEZpbHRlcl99KTtcbiJdfQ==","/**\n * @license\n * Copyright 2020 Google LLC. All Rights Reserved.\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n * =============================================================================\n */\nimport { Conv3D } from '../kernel_names';\nimport { conv3DBackpropFilter } from '../ops/conv3d_backprop_filter';\nimport { conv3DBackpropInput } from '../ops/conv3d_backprop_input';\nimport { tupleValuesAreOne } from '../ops/conv_util';\nimport * as util from '../util';\nexport const conv3DGradConfig = {\n kernelName: Conv3D,\n inputsToSave: ['x', 'filter'],\n gradFunc: (dy, saved, attrs) => {\n const { dilations, strides, pad } = attrs;\n util.assert(tupleValuesAreOne(dilations), () => 'Error in gradient of conv3D: dilation rates greater than 1 are ' +\n `not yet supported in gradients. Got dilations '${dilations}'`);\n const [x5D, $filter] = saved;\n return {\n x: () => conv3DBackpropInput(x5D.shape, dy, $filter, strides, pad),\n filter: () => conv3DBackpropFilter(x5D, dy, $filter.shape, strides, pad)\n };\n }\n};\n//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiQ29udjNEX2dyYWQuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi8uLi90ZmpzLWNvcmUvc3JjL2dyYWRpZW50cy9Db252M0RfZ3JhZC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQTs7Ozs7Ozs7Ozs7Ozs7O0dBZUc7QUFDSCxPQUFPLEVBQUMsTUFBTSxFQUFjLE1BQU0saUJBQWlCLENBQUM7QUFFcEQsT0FBTyxFQUFDLG9CQUFvQixFQUFDLE1BQU0sK0JBQStCLENBQUM7QUFDbkUsT0FBTyxFQUFDLG1CQUFtQixFQUFDLE1BQU0sOEJBQThCLENBQUM7QUFDakUsT0FBTyxFQUFDLGlCQUFpQixFQUFDLE1BQU0sa0JBQWtCLENBQUM7QUFFbkQsT0FBTyxLQUFLLElBQUksTUFBTSxTQUFTLENBQUM7QUFFaEMsTUFBTSxDQUFDLE1BQU0sZ0JBQWdCLEdBQWU7SUFDMUMsVUFBVSxFQUFFLE1BQU07SUFDbEIsWUFBWSxFQUFFLENBQUMsR0FBRyxFQUFFLFFBQVEsQ0FBQztJQUM3QixRQUFRLEVBQUUsQ0FBQyxFQUFZLEVBQUUsS0FBZSxFQUFFLEtBQW1CLEVBQUUsRUFBRTtRQUMvRCxNQUFNLEVBQUMsU0FBUyxFQUFFLE9BQU8sRUFBRSxHQUFHLEVBQUMsR0FBRyxLQUEwQixDQUFDO1FBQzdELElBQUksQ0FBQyxNQUFNLENBQ1AsaUJBQWlCLENBQUMsU0FBUyxDQUFDLEVBQzVCLEdBQUcsRUFBRSxDQUNELGlFQUFpRTtZQUNqRSxrREFBa0QsU0FBUyxHQUFHLENBQUMsQ0FBQztRQUV4RSxNQUFNLENBQUMsR0FBRyxFQUFFLE9BQU8sQ0FBQyxHQUFHLEtBQUssQ0FBQztRQUU3QixPQUFPO1lBQ0wsQ0FBQyxFQUFFLEdBQUcsRUFBRSxDQUFDLG1CQUFtQixDQUN2QixHQUFnQixDQUFDLEtBQUssRUFBRSxFQUFFLEVBQUUsT0FBbUIsRUFBRSxPQUFPLEVBQUUsR0FBRyxDQUFDO1lBQ25FLE1BQU0sRUFBRSxHQUFHLEVBQUUsQ0FBQyxvQkFBb0IsQ0FDOUIsR0FBZSxFQUFFLEVBQUUsRUFBRyxPQUFvQixDQUFDLEtBQUssRUFBRSxPQUFPLEVBQUUsR0FBRyxDQUFDO1NBQ3BFLENBQUM7SUFDSixDQUFDO0NBQ0YsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbIi8qKlxuICogQGxpY2Vuc2VcbiAqIENvcHlyaWdodCAyMDIwIEdvb2dsZSBMTEMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuXG4gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgXCJMaWNlbnNlXCIpO1xuICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLlxuICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0XG4gKlxuICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wXG4gKlxuICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZVxuICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gXCJBUyBJU1wiIEJBU0lTLFxuICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuXG4gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kXG4gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS5cbiAqID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4gKi9cbmltcG9ydCB7Q29udjNELCBDb252M0RBdHRyc30gZnJvbSAnLi4va2VybmVsX25hbWVzJztcbmltcG9ydCB7R3JhZENvbmZpZywgTmFtZWRBdHRyTWFwfSBmcm9tICcuLi9rZXJuZWxfcmVnaXN0cnknO1xuaW1wb3J0IHtjb252M0RCYWNrcHJvcEZpbHRlcn0gZnJvbSAnLi4vb3BzL2NvbnYzZF9iYWNrcHJvcF9maWx0ZXInO1xuaW1wb3J0IHtjb252M0RCYWNrcHJvcElucHV0fSBmcm9tICcuLi9vcHMvY29udjNkX2JhY2twcm9wX2lucHV0JztcbmltcG9ydCB7dHVwbGVWYWx1ZXNBcmVPbmV9IGZyb20gJy4uL29wcy9jb252X3V0aWwnO1xuaW1wb3J0IHtUZW5zb3IsIFRlbnNvcjVEfSBmcm9tICcuLi90ZW5zb3InO1xuaW1wb3J0ICogYXMgdXRpbCBmcm9tICcuLi91dGlsJztcblxuZXhwb3J0IGNvbnN0IGNvbnYzREdyYWRDb25maWc6IEdyYWRDb25maWcgPSB7XG4gIGtlcm5lbE5hbWU6IENvbnYzRCxcbiAgaW5wdXRzVG9TYXZlOiBbJ3gnLCAnZmlsdGVyJ10sXG4gIGdyYWRGdW5jOiAoZHk6IFRlbnNvcjVELCBzYXZlZDogVGVuc29yW10sIGF0dHJzOiBOYW1lZEF0dHJNYXApID0+IHtcbiAgICBjb25zdCB7ZGlsYXRpb25zLCBzdHJpZGVzLCBwYWR9ID0gYXR0cnMgYXMge30gYXMgQ29udjNEQXR0cnM7XG4gICAgdXRpbC5hc3NlcnQoXG4gICAgICAgIHR1cGxlVmFsdWVzQXJlT25lKGRpbGF0aW9ucyksXG4gICAgICAgICgpID0+XG4gICAgICAgICAgICAnRXJyb3IgaW4gZ3JhZGllbnQgb2YgY29udjNEOiBkaWxhdGlvbiByYXRlcyBncmVhdGVyIHRoYW4gMSBhcmUgJyArXG4gICAgICAgICAgICBgbm90IHlldCBzdXBwb3J0ZWQgaW4gZ3JhZGllbnRzLiBHb3QgZGlsYXRpb25zICcke2RpbGF0aW9uc30nYCk7XG5cbiAgICBjb25zdCBbeDVELCAkZmlsdGVyXSA9IHNhdmVkO1xuXG4gICAgcmV0dXJuIHtcbiAgICAgIHg6ICgpID0+IGNvbnYzREJhY2twcm9wSW5wdXQoXG4gICAgICAgICAgKHg1RCBhcyBUZW5zb3I1RCkuc2hhcGUsIGR5LCAkZmlsdGVyIGFzIFRlbnNvcjVELCBzdHJpZGVzLCBwYWQpLFxuICAgICAgZmlsdGVyOiAoKSA9PiBjb252M0RCYWNrcHJvcEZpbHRlcihcbiAgICAgICAgICB4NUQgYXMgVGVuc29yNUQsIGR5LCAoJGZpbHRlciBhcyBUZW5zb3I1RCkuc2hhcGUsIHN0cmlkZXMsIHBhZClcbiAgICB9O1xuICB9XG59O1xuIl19","/**\n * @license\n * Copyright 2020 Google LLC. All Rights Reserved.\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n * =============================================================================\n */\nimport { Cos } from '../kernel_names';\nimport { cast } from '../ops/cast';\nimport { mul } from '../ops/mul';\nimport { neg } from '../ops/neg';\nimport { sin } from '../ops/sin';\nexport const cosGradConfig = {\n kernelName: Cos,\n inputsToSave: ['x'],\n gradFunc: (dy, saved) => {\n const [x] = saved;\n return { x: () => mul(neg(sin(cast(x, 'float32'))), dy) };\n }\n};\n//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiQ29zX2dyYWQuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi8uLi90ZmpzLWNvcmUvc3JjL2dyYWRpZW50cy9Db3NfZ3JhZC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQTs7Ozs7Ozs7Ozs7Ozs7O0dBZUc7QUFFSCxPQUFPLEVBQUMsR0FBRyxFQUFDLE1BQU0saUJBQWlCLENBQUM7QUFFcEMsT0FBTyxFQUFDLElBQUksRUFBQyxNQUFNLGFBQWEsQ0FBQztBQUNqQyxPQUFPLEVBQUMsR0FBRyxFQUFDLE1BQU0sWUFBWSxDQUFDO0FBQy9CLE9BQU8sRUFBQyxHQUFHLEVBQUMsTUFBTSxZQUFZLENBQUM7QUFDL0IsT0FBTyxFQUFDLEdBQUcsRUFBQyxNQUFNLFlBQVksQ0FBQztBQUcvQixNQUFNLENBQUMsTUFBTSxhQUFhLEdBQWU7SUFDdkMsVUFBVSxFQUFFLEdBQUc7SUFDZixZQUFZLEVBQUUsQ0FBQyxHQUFHLENBQUM7SUFDbkIsUUFBUSxFQUFFLENBQUMsRUFBVSxFQUFFLEtBQWUsRUFBRSxFQUFFO1FBQ3hDLE1BQU0sQ0FBQyxDQUFDLENBQUMsR0FBRyxLQUFLLENBQUM7UUFFbEIsT0FBTyxFQUFDLENBQUMsRUFBRSxHQUFHLEVBQUUsQ0FBQyxHQUFHLENBQUMsR0FBRyxDQUFDLEdBQUcsQ0FBQyxJQUFJLENBQUMsQ0FBQyxFQUFFLFNBQVMsQ0FBQyxDQUFDLENBQUMsRUFBRSxFQUFFLENBQUMsRUFBQyxDQUFDO0lBQzFELENBQUM7Q0FDRixDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiLyoqXG4gKiBAbGljZW5zZVxuICogQ29weXJpZ2h0IDIwMjAgR29vZ2xlIExMQy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC5cbiAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSBcIkxpY2Vuc2VcIik7XG4gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuXG4gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXRcbiAqXG4gKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjBcbiAqXG4gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlXG4gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiBcIkFTIElTXCIgQkFTSVMsXG4gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC5cbiAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmRcbiAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLlxuICogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbiAqL1xuXG5pbXBvcnQge0Nvc30gZnJvbSAnLi4va2VybmVsX25hbWVzJztcbmltcG9ydCB7R3JhZENvbmZpZ30gZnJvbSAnLi4va2VybmVsX3JlZ2lzdHJ5JztcbmltcG9ydCB7Y2FzdH0gZnJvbSAnLi4vb3BzL2Nhc3QnO1xuaW1wb3J0IHttdWx9IGZyb20gJy4uL29wcy9tdWwnO1xuaW1wb3J0IHtuZWd9IGZyb20gJy4uL29wcy9uZWcnO1xuaW1wb3J0IHtzaW59IGZyb20gJy4uL29wcy9zaW4nO1xuaW1wb3J0IHtUZW5zb3J9IGZyb20gJy4uL3RlbnNvcic7XG5cbmV4cG9ydCBjb25zdCBjb3NHcmFkQ29uZmlnOiBHcmFkQ29uZmlnID0ge1xuICBrZXJuZWxOYW1lOiBDb3MsXG4gIGlucHV0c1RvU2F2ZTogWyd4J10sXG4gIGdyYWRGdW5jOiAoZHk6IFRlbnNvciwgc2F2ZWQ6IFRlbnNvcltdKSA9PiB7XG4gICAgY29uc3QgW3hdID0gc2F2ZWQ7XG5cbiAgICByZXR1cm4ge3g6ICgpID0+IG11bChuZWcoc2luKGNhc3QoeCwgJ2Zsb2F0MzInKSkpLCBkeSl9O1xuICB9XG59O1xuIl19","/**\n * @license\n * Copyright 2020 Google LLC. All Rights Reserved.\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n * =============================================================================\n */\nimport { Cosh } from '../kernel_names';\nimport { cast } from '../ops/cast';\nimport { mul } from '../ops/mul';\nimport { sinh } from '../ops/sinh';\nexport const coshGradConfig = {\n kernelName: Cosh,\n inputsToSave: ['x'],\n gradFunc: (dy, saved) => {\n const [x] = saved;\n return { x: () => mul(sinh(cast(x, 'float32')), dy) };\n }\n};\n//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiQ29zaF9ncmFkLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vLi4vdGZqcy1jb3JlL3NyYy9ncmFkaWVudHMvQ29zaF9ncmFkLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBOzs7Ozs7Ozs7Ozs7Ozs7R0FlRztBQUVILE9BQU8sRUFBQyxJQUFJLEVBQUMsTUFBTSxpQkFBaUIsQ0FBQztBQUVyQyxPQUFPLEVBQUMsSUFBSSxFQUFDLE1BQU0sYUFBYSxDQUFDO0FBQ2pDLE9BQU8sRUFBQyxHQUFHLEVBQUMsTUFBTSxZQUFZLENBQUM7QUFDL0IsT0FBTyxFQUFDLElBQUksRUFBQyxNQUFNLGFBQWEsQ0FBQztBQUdqQyxNQUFNLENBQUMsTUFBTSxjQUFjLEdBQWU7SUFDeEMsVUFBVSxFQUFFLElBQUk7SUFDaEIsWUFBWSxFQUFFLENBQUMsR0FBRyxDQUFDO0lBQ25CLFFBQVEsRUFBRSxDQUFDLEVBQVUsRUFBRSxLQUFlLEVBQUUsRUFBRTtRQUN4QyxNQUFNLENBQUMsQ0FBQyxDQUFDLEdBQUcsS0FBSyxDQUFDO1FBRWxCLE9BQU8sRUFBQyxDQUFDLEVBQUUsR0FBRyxFQUFFLENBQUMsR0FBRyxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsQ0FBQyxFQUFFLFNBQVMsQ0FBQyxDQUFDLEVBQUUsRUFBRSxDQUFDLEVBQUMsQ0FBQztJQUN0RCxDQUFDO0NBQ0YsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbIi8qKlxuICogQGxpY2Vuc2VcbiAqIENvcHlyaWdodCAyMDIwIEdvb2dsZSBMTEMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuXG4gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgXCJMaWNlbnNlXCIpO1xuICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLlxuICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0XG4gKlxuICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wXG4gKlxuICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZVxuICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gXCJBUyBJU1wiIEJBU0lTLFxuICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuXG4gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kXG4gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS5cbiAqID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4gKi9cblxuaW1wb3J0IHtDb3NofSBmcm9tICcuLi9rZXJuZWxfbmFtZXMnO1xuaW1wb3J0IHtHcmFkQ29uZmlnfSBmcm9tICcuLi9rZXJuZWxfcmVnaXN0cnknO1xuaW1wb3J0IHtjYXN0fSBmcm9tICcuLi9vcHMvY2FzdCc7XG5pbXBvcnQge211bH0gZnJvbSAnLi4vb3BzL211bCc7XG5pbXBvcnQge3Npbmh9IGZyb20gJy4uL29wcy9zaW5oJztcbmltcG9ydCB7VGVuc29yfSBmcm9tICcuLi90ZW5zb3InO1xuXG5leHBvcnQgY29uc3QgY29zaEdyYWRDb25maWc6IEdyYWRDb25maWcgPSB7XG4gIGtlcm5lbE5hbWU6IENvc2gsXG4gIGlucHV0c1RvU2F2ZTogWyd4J10sXG4gIGdyYWRGdW5jOiAoZHk6IFRlbnNvciwgc2F2ZWQ6IFRlbnNvcltdKSA9PiB7XG4gICAgY29uc3QgW3hdID0gc2F2ZWQ7XG5cbiAgICByZXR1cm4ge3g6ICgpID0+IG11bChzaW5oKGNhc3QoeCwgJ2Zsb2F0MzInKSksIGR5KX07XG4gIH1cbn07XG4iXX0=","/**\n * @license\n * Copyright 2020 Google LLC. All Rights Reserved.\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n * =============================================================================\n */\nimport { Cumsum } from '../kernel_names';\nimport { getAxesPermutation } from '../ops/axis_util';\nimport { cumsum } from '../ops/cumsum';\nimport { transpose } from '../ops/transpose';\nexport const cumsumGradConfig = {\n kernelName: Cumsum,\n inputsToSave: ['x'],\n gradFunc: (dy, saved, attrs) => {\n const [x] = saved;\n const { axis, exclusive, reverse } = attrs;\n return {\n x: () => {\n const permutation = getAxesPermutation([axis], x.rank);\n let out = cumsum(dy, axis, exclusive, !reverse);\n if (permutation != null) {\n out = transpose(out, permutation);\n }\n return out;\n }\n };\n }\n};\n//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiQ3Vtc3VtX2dyYWQuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi8uLi90ZmpzLWNvcmUvc3JjL2dyYWRpZW50cy9DdW1zdW1fZ3JhZC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQTs7Ozs7Ozs7Ozs7Ozs7O0dBZUc7QUFFSCxPQUFPLEVBQUMsTUFBTSxFQUFjLE1BQU0saUJBQWlCLENBQUM7QUFFcEQsT0FBTyxFQUFDLGtCQUFrQixFQUFDLE1BQU0sa0JBQWtCLENBQUM7QUFDcEQsT0FBTyxFQUFDLE1BQU0sRUFBQyxNQUFNLGVBQWUsQ0FBQztBQUNyQyxPQUFPLEVBQUMsU0FBUyxFQUFDLE1BQU0sa0JBQWtCLENBQUM7QUFHM0MsTUFBTSxDQUFDLE1BQU0sZ0JBQWdCLEdBQWU7SUFDMUMsVUFBVSxFQUFFLE1BQU07SUFDbEIsWUFBWSxFQUFFLENBQUMsR0FBRyxDQUFDO0lBQ25CLFFBQVEsRUFBRSxDQUFDLEVBQVUsRUFBRSxLQUFlLEVBQUUsS0FBbUIsRUFBRSxFQUFFO1FBQzdELE1BQU0sQ0FBQyxDQUFDLENBQUMsR0FBRyxLQUFLLENBQUM7UUFDbEIsTUFBTSxFQUFDLElBQUksRUFBRSxTQUFTLEVBQUUsT0FBTyxFQUFDLEdBQWdCLEtBQTBCLENBQUM7UUFFM0UsT0FBTztZQUNMLENBQUMsRUFBRSxHQUFHLEVBQUU7Z0JBQ04sTUFBTSxXQUFXLEdBQUcsa0JBQWtCLENBQUMsQ0FBQyxJQUFJLENBQUMsRUFBRSxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUM7Z0JBRXZELElBQUksR0FBRyxHQUFHLE1BQU0sQ0FBQyxFQUFFLEVBQUUsSUFBSSxFQUFFLFNBQVMsRUFBRSxDQUFDLE9BQU8sQ0FBQyxDQUFDO2dCQUVoRCxJQUFJLFdBQVcsSUFBSSxJQUFJLEVBQUU7b0JBQ3ZCLEdBQUcsR0FBRyxTQUFTLENBQUMsR0FBRyxFQUFFLFdBQVcsQ0FBQyxDQUFDO2lCQUNuQztnQkFFRCxPQUFPLEdBQUcsQ0FBQztZQUNiLENBQUM7U0FDRixDQUFDO0lBQ0osQ0FBQztDQUNGLENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyIvKipcbiAqIEBsaWNlbnNlXG4gKiBDb3B5cmlnaHQgMjAyMCBHb29nbGUgTExDLiBBbGwgUmlnaHRzIFJlc2VydmVkLlxuICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlIFwiTGljZW5zZVwiKTtcbiAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS5cbiAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdFxuICpcbiAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMFxuICpcbiAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmVcbiAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuIFwiQVMgSVNcIiBCQVNJUyxcbiAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLlxuICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZFxuICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuXG4gKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuICovXG5cbmltcG9ydCB7Q3Vtc3VtLCBDdW1zdW1BdHRyc30gZnJvbSAnLi4va2VybmVsX25hbWVzJztcbmltcG9ydCB7R3JhZENvbmZpZywgTmFtZWRBdHRyTWFwfSBmcm9tICcuLi9rZXJuZWxfcmVnaXN0cnknO1xuaW1wb3J0IHtnZXRBeGVzUGVybXV0YXRpb259IGZyb20gJy4uL29wcy9heGlzX3V0aWwnO1xuaW1wb3J0IHtjdW1zdW19IGZyb20gJy4uL29wcy9jdW1zdW0nO1xuaW1wb3J0IHt0cmFuc3Bvc2V9IGZyb20gJy4uL29wcy90cmFuc3Bvc2UnO1xuaW1wb3J0IHtUZW5zb3J9IGZyb20gJy4uL3RlbnNvcic7XG5cbmV4cG9ydCBjb25zdCBjdW1zdW1HcmFkQ29uZmlnOiBHcmFkQ29uZmlnID0ge1xuICBrZXJuZWxOYW1lOiBDdW1zdW0sXG4gIGlucHV0c1RvU2F2ZTogWyd4J10sXG4gIGdyYWRGdW5jOiAoZHk6IFRlbnNvciwgc2F2ZWQ6IFRlbnNvcltdLCBhdHRyczogTmFtZWRBdHRyTWFwKSA9PiB7XG4gICAgY29uc3QgW3hdID0gc2F2ZWQ7XG4gICAgY29uc3Qge2F4aXMsIGV4Y2x1c2l2ZSwgcmV2ZXJzZX06IEN1bXN1bUF0dHJzID0gYXR0cnMgYXMge30gYXMgQ3Vtc3VtQXR0cnM7XG5cbiAgICByZXR1cm4ge1xuICAgICAgeDogKCkgPT4ge1xuICAgICAgICBjb25zdCBwZXJtdXRhdGlvbiA9IGdldEF4ZXNQZXJtdXRhdGlvbihbYXhpc10sIHgucmFuayk7XG5cbiAgICAgICAgbGV0IG91dCA9IGN1bXN1bShkeSwgYXhpcywgZXhjbHVzaXZlLCAhcmV2ZXJzZSk7XG5cbiAgICAgICAgaWYgKHBlcm11dGF0aW9uICE9IG51bGwpIHtcbiAgICAgICAgICBvdXQgPSB0cmFuc3Bvc2Uob3V0LCBwZXJtdXRhdGlvbik7XG4gICAgICAgIH1cblxuICAgICAgICByZXR1cm4gb3V0O1xuICAgICAgfVxuICAgIH07XG4gIH1cbn07XG4iXX0=","/**\n * @license\n * Copyright 2020 Google LLC. All Rights Reserved.\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n * =============================================================================\n */\nimport { DepthwiseConv2dNative } from '../kernel_names';\nimport * as conv_util from '../ops/conv_util';\nimport { depthwiseConv2dNativeBackpropFilter } from '../ops/depthwise_conv2d_native_backprop_filter';\nimport { depthwiseConv2dNativeBackpropInput } from '../ops/depthwise_conv2d_native_backprop_input';\nimport * as util from '../util';\nexport const depthwiseConv2dNativeGradConfig = {\n kernelName: DepthwiseConv2dNative,\n inputsToSave: ['x', 'filter'],\n gradFunc: (dy, saved, attrs) => {\n const { dilations, strides, pad, dimRoundingMode } = attrs;\n const $dilations = dilations == null ? [1, 1] : dilations;\n util.assert(conv_util.tupleValuesAreOne($dilations), () => 'Error in gradient of depthwiseConv2dNative: dilation rates ' +\n `greater than 1 are not yet supported. Got dilations ` +\n `'${$dilations}'`);\n const [x, filter] = saved;\n util.assert(x.rank === 4, () => `Error in gradient of depthwiseConv2dNative: input must be ` +\n `rank 4, but got rank ${x.rank}.`);\n util.assert(filter.rank === 4, () => `Error in gradient of depthwiseConv2dNative: filter must be ` +\n `rank 4, but got rank ${filter.rank}.`);\n util.assert(x.shape[3] === filter.shape[2], () => `Error in gradient of depthwiseConv2d: number of input ` +\n `channels (${x.shape[3]}) must match the inChannels dimension ` +\n `in filter ${filter.shape[2]}.`);\n util.assert(conv_util.eitherStridesOrDilationsAreOne(strides, $dilations), () => 'Error in gradient of depthwiseConv2d: Either strides or ' +\n `dilations must be 1. Got strides ${strides} and dilations ` +\n `'${$dilations}'.`);\n conv_util.checkPadOnDimRoundingMode('depthwiseConv2d', pad, dimRoundingMode);\n return {\n x: () => depthwiseConv2dNativeBackpropInput(x.shape, dy, filter, strides, pad, $dilations, dimRoundingMode),\n filter: () => depthwiseConv2dNativeBackpropFilter(x, dy, filter.shape, strides, pad, $dilations, dimRoundingMode),\n };\n }\n};\n//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiRGVwdGh3aXNlQ29udjJkTmF0aXZlX2dyYWQuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi8uLi90ZmpzLWNvcmUvc3JjL2dyYWRpZW50cy9EZXB0aHdpc2VDb252MmROYXRpdmVfZ3JhZC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQTs7Ozs7Ozs7Ozs7Ozs7O0dBZUc7QUFDSCxPQUFPLEVBQUMscUJBQXFCLEVBQTZCLE1BQU0saUJBQWlCLENBQUM7QUFFbEYsT0FBTyxLQUFLLFNBQVMsTUFBTSxrQkFBa0IsQ0FBQztBQUM5QyxPQUFPLEVBQUMsbUNBQW1DLEVBQUMsTUFBTSxnREFBZ0QsQ0FBQztBQUNuRyxPQUFPLEVBQUMsa0NBQWtDLEVBQUMsTUFBTSwrQ0FBK0MsQ0FBQztBQUVqRyxPQUFPLEtBQUssSUFBSSxNQUFNLFNBQVMsQ0FBQztBQUVoQyxNQUFNLENBQUMsTUFBTSwrQkFBK0IsR0FBZTtJQUN6RCxVQUFVLEVBQUUscUJBQXFCO0lBQ2pDLFlBQVksRUFBRSxDQUFDLEdBQUcsRUFBRSxRQUFRLENBQUM7SUFDN0IsUUFBUSxFQUFFLENBQUMsRUFBWSxFQUFFLEtBQWUsRUFBRSxLQUFtQixFQUFFLEVBQUU7UUFDL0QsTUFBTSxFQUFDLFNBQVMsRUFBRSxPQUFPLEVBQUUsR0FBRyxFQUFFLGVBQWUsRUFBQyxHQUM1QyxLQUF5QyxDQUFDO1FBQzlDLE1BQU0sVUFBVSxHQUFHLFNBQVMsSUFBSSxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBbUIsQ0FBQyxDQUFDLENBQUMsU0FBUyxDQUFDO1FBRTVFLElBQUksQ0FBQyxNQUFNLENBQ1AsU0FBUyxDQUFDLGlCQUFpQixDQUFDLFVBQVUsQ0FBQyxFQUN2QyxHQUFHLEVBQUUsQ0FBQyw2REFBNkQ7WUFDL0Qsc0RBQXNEO1lBQ3RELElBQUksVUFBVSxHQUFHLENBQUMsQ0FBQztRQUUzQixNQUFNLENBQUMsQ0FBQyxFQUFFLE1BQU0sQ0FBQyxHQUFHLEtBQTZCLENBQUM7UUFFbEQsSUFBSSxDQUFDLE1BQU0sQ0FDUCxDQUFDLENBQUMsSUFBSSxLQUFLLENBQUMsRUFDWixHQUFHLEVBQUUsQ0FBQyw0REFBNEQ7WUFDOUQsd0JBQXdCLENBQUMsQ0FBQyxJQUFJLEdBQUcsQ0FBQyxDQUFDO1FBQzNDLElBQUksQ0FBQyxNQUFNLENBQ1AsTUFBTSxDQUFDLElBQUksS0FBSyxDQUFDLEVBQ2pCLEdBQUcsRUFBRSxDQUFDLDZEQUE2RDtZQUMvRCx3QkFBd0IsTUFBTSxDQUFDLElBQUksR0FBRyxDQUFDLENBQUM7UUFDaEQsSUFBSSxDQUFDLE1BQU0sQ0FDUCxDQUFDLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQyxLQUFLLE1BQU0sQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDLEVBQzlCLEdBQUcsRUFBRSxDQUFDLHdEQUF3RDtZQUMxRCxhQUFhLENBQUMsQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDLHdDQUF3QztZQUMvRCxhQUFhLE1BQU0sQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDO1FBRXpDLElBQUksQ0FBQyxNQUFNLENBQ1AsU0FBUyxDQUFDLDhCQUE4QixDQUFDLE9BQU8sRUFBRSxVQUFVLENBQUMsRUFDN0QsR0FBRyxFQUFFLENBQUMsMERBQTBEO1lBQzVELHFDQUFxQyxPQUFPLGlCQUFpQjtZQUM3RCxJQUFJLFVBQVUsSUFBSSxDQUFDLENBQUM7UUFFNUIsU0FBUyxDQUFDLHlCQUF5QixDQUMvQixpQkFBaUIsRUFBRSxHQUFHLEVBQUUsZUFBZSxDQUFDLENBQUM7UUFFN0MsT0FBTztZQUNMLENBQUMsRUFBRSxHQUFHLEVBQUUsQ0FBQyxrQ0FBa0MsQ0FDdkMsQ0FBQyxDQUFDLEtBQUssRUFBRSxFQUFFLEVBQUUsTUFBTSxFQUFFLE9BQU8sRUFBRSxHQUFHLEVBQUUsVUFBVSxFQUFFLGVBQWUsQ0FBQztZQUNuRSxNQUFNLEVBQUUsR0FBRyxFQUFFLENBQUMsbUNBQW1DLENBQzdDLENBQUMsRUFBRSxFQUFFLEVBQUUsTUFBTSxDQUFDLEtBQUssRUFBRSxPQUFPLEVBQUUsR0FBRyxFQUFFLFVBQVUsRUFBRSxlQUFlLENBQUM7U0FDcEUsQ0FBQztJQUNKLENBQUM7Q0FDRixDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiLyoqXG4gKiBAbGljZW5zZVxuICogQ29weXJpZ2h0IDIwMjAgR29vZ2xlIExMQy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC5cbiAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSBcIkxpY2Vuc2VcIik7XG4gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuXG4gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXRcbiAqXG4gKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjBcbiAqXG4gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlXG4gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiBcIkFTIElTXCIgQkFTSVMsXG4gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC5cbiAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmRcbiAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLlxuICogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbiAqL1xuaW1wb3J0IHtEZXB0aHdpc2VDb252MmROYXRpdmUsIERlcHRod2lzZUNvbnYyZE5hdGl2ZUF0dHJzfSBmcm9tICcuLi9rZXJuZWxfbmFtZXMnO1xuaW1wb3J0IHtHcmFkQ29uZmlnLCBOYW1lZEF0dHJNYXB9IGZyb20gJy4uL2tlcm5lbF9yZWdpc3RyeSc7XG5pbXBvcnQgKiBhcyBjb252X3V0aWwgZnJvbSAnLi4vb3BzL2NvbnZfdXRpbCc7XG5pbXBvcnQge2RlcHRod2lzZUNvbnYyZE5hdGl2ZUJhY2twcm9wRmlsdGVyfSBmcm9tICcuLi9vcHMvZGVwdGh3aXNlX2NvbnYyZF9uYXRpdmVfYmFja3Byb3BfZmlsdGVyJztcbmltcG9ydCB7ZGVwdGh3aXNlQ29udjJkTmF0aXZlQmFja3Byb3BJbnB1dH0gZnJvbSAnLi4vb3BzL2RlcHRod2lzZV9jb252MmRfbmF0aXZlX2JhY2twcm9wX2lucHV0JztcbmltcG9ydCB7VGVuc29yLCBUZW5zb3I0RH0gZnJvbSAnLi4vdGVuc29yJztcbmltcG9ydCAqIGFzIHV0aWwgZnJvbSAnLi4vdXRpbCc7XG5cbmV4cG9ydCBjb25zdCBkZXB0aHdpc2VDb252MmROYXRpdmVHcmFkQ29uZmlnOiBHcmFkQ29uZmlnID0ge1xuICBrZXJuZWxOYW1lOiBEZXB0aHdpc2VDb252MmROYXRpdmUsXG4gIGlucHV0c1RvU2F2ZTogWyd4JywgJ2ZpbHRlciddLFxuICBncmFkRnVuYzogKGR5OiBUZW5zb3I0RCwgc2F2ZWQ6IFRlbnNvcltdLCBhdHRyczogTmFtZWRBdHRyTWFwKSA9PiB7XG4gICAgY29uc3Qge2RpbGF0aW9ucywgc3RyaWRlcywgcGFkLCBkaW1Sb3VuZGluZ01vZGV9ID1cbiAgICAgICAgYXR0cnMgYXMge30gYXMgRGVwdGh3aXNlQ29udjJkTmF0aXZlQXR0cnM7XG4gICAgY29uc3QgJGRpbGF0aW9ucyA9IGRpbGF0aW9ucyA9PSBudWxsID8gWzEsIDFdIGFzW251bWJlcixudW1iZXJdIDogZGlsYXRpb25zO1xuXG4gICAgdXRpbC5hc3NlcnQoXG4gICAgICAgIGNvbnZfdXRpbC50dXBsZVZhbHVlc0FyZU9uZSgkZGlsYXRpb25zKSxcbiAgICAgICAgKCkgPT4gJ0Vycm9yIGluIGdyYWRpZW50IG9mIGRlcHRod2lzZUNvbnYyZE5hdGl2ZTogZGlsYXRpb24gcmF0ZXMgJyArXG4gICAgICAgICAgICBgZ3JlYXRlciB0aGFuIDEgYXJlIG5vdCB5ZXQgc3VwcG9ydGVkLiBHb3QgZGlsYXRpb25zIGAgK1xuICAgICAgICAgICAgYCckeyRkaWxhdGlvbnN9J2ApO1xuXG4gICAgY29uc3QgW3gsIGZpbHRlcl0gPSBzYXZlZCBhcyBbVGVuc29yNEQsIFRlbnNvcjREXTtcblxuICAgIHV0aWwuYXNzZXJ0KFxuICAgICAgICB4LnJhbmsgPT09IDQsXG4gICAgICAgICgpID0+IGBFcnJvciBpbiBncmFkaWVudCBvZiBkZXB0aHdpc2VDb252MmROYXRpdmU6IGlucHV0IG11c3QgYmUgYCArXG4gICAgICAgICAgICBgcmFuayA0LCBidXQgZ290IHJhbmsgJHt4LnJhbmt9LmApO1xuICAgIHV0aWwuYXNzZXJ0KFxuICAgICAgICBmaWx0ZXIucmFuayA9PT0gNCxcbiAgICAgICAgKCkgPT4gYEVycm9yIGluIGdyYWRpZW50IG9mIGRlcHRod2lzZUNvbnYyZE5hdGl2ZTogZmlsdGVyIG11c3QgYmUgYCArXG4gICAgICAgICAgICBgcmFuayA0LCBidXQgZ290IHJhbmsgJHtmaWx0ZXIucmFua30uYCk7XG4gICAgdXRpbC5hc3NlcnQoXG4gICAgICAgIHguc2hhcGVbM10gPT09IGZpbHRlci5zaGFwZVsyXSxcbiAgICAgICAgKCkgPT4gYEVycm9yIGluIGdyYWRpZW50IG9mIGRlcHRod2lzZUNvbnYyZDogbnVtYmVyIG9mIGlucHV0IGAgK1xuICAgICAgICAgICAgYGNoYW5uZWxzICgke3guc2hhcGVbM119KSBtdXN0IG1hdGNoIHRoZSBpbkNoYW5uZWxzIGRpbWVuc2lvbiBgICtcbiAgICAgICAgICAgIGBpbiBmaWx0ZXIgJHtmaWx0ZXIuc2hhcGVbMl19LmApO1xuXG4gICAgdXRpbC5hc3NlcnQoXG4gICAgICAgIGNvbnZfdXRpbC5laXRoZXJTdHJpZGVzT3JEaWxhdGlvbnNBcmVPbmUoc3RyaWRlcywgJGRpbGF0aW9ucyksXG4gICAgICAgICgpID0+ICdFcnJvciBpbiBncmFkaWVudCBvZiBkZXB0aHdpc2VDb252MmQ6IEVpdGhlciBzdHJpZGVzIG9yICcgK1xuICAgICAgICAgICAgYGRpbGF0aW9ucyBtdXN0IGJlICAxLiBHb3Qgc3RyaWRlcyAke3N0cmlkZXN9IGFuZCBkaWxhdGlvbnMgYCArXG4gICAgICAgICAgICBgJyR7JGRpbGF0aW9uc30nLmApO1xuXG4gICAgY29udl91dGlsLmNoZWNrUGFkT25EaW1Sb3VuZGluZ01vZGUoXG4gICAgICAgICdkZXB0aHdpc2VDb252MmQnLCBwYWQsIGRpbVJvdW5kaW5nTW9kZSk7XG5cbiAgICByZXR1cm4ge1xuICAgICAgeDogKCkgPT4gZGVwdGh3aXNlQ29udjJkTmF0aXZlQmFja3Byb3BJbnB1dChcbiAgICAgICAgICB4LnNoYXBlLCBkeSwgZmlsdGVyLCBzdHJpZGVzLCBwYWQsICRkaWxhdGlvbnMsIGRpbVJvdW5kaW5nTW9kZSksXG4gICAgICBmaWx0ZXI6ICgpID0+IGRlcHRod2lzZUNvbnYyZE5hdGl2ZUJhY2twcm9wRmlsdGVyKFxuICAgICAgICAgIHgsIGR5LCBmaWx0ZXIuc2hhcGUsIHN0cmlkZXMsIHBhZCwgJGRpbGF0aW9ucywgZGltUm91bmRpbmdNb2RlKSxcbiAgICB9O1xuICB9XG59O1xuIl19","/**\n * @license\n * Copyright 2020 Google LLC. All Rights Reserved.\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n * =============================================================================\n */\nimport { ENGINE } from '../engine';\nimport { Dilation2D, Dilation2DBackpropFilter, Dilation2DBackpropInput } from '../kernel_names';\nexport const dilation2dGradConfig = {\n kernelName: Dilation2D,\n inputsToSave: ['x', 'filter'],\n gradFunc: (dy, saved, attrs) => {\n const [x, filter] = saved;\n const inputInputs = { x, filter, dy };\n const filterInputs = { x, filter, dy };\n return {\n x: () => ENGINE.runKernel(Dilation2DBackpropInput, inputInputs, attrs),\n filter: () => ENGINE.runKernel(Dilation2DBackpropFilter, filterInputs, attrs)\n };\n }\n};\n//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiRGlsYXRpb24yRF9ncmFkLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vLi4vdGZqcy1jb3JlL3NyYy9ncmFkaWVudHMvRGlsYXRpb24yRF9ncmFkLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBOzs7Ozs7Ozs7Ozs7Ozs7R0FlRztBQUNILE9BQU8sRUFBQyxNQUFNLEVBQUMsTUFBTSxXQUFXLENBQUM7QUFDakMsT0FBTyxFQUFDLFVBQVUsRUFBRSx3QkFBd0IsRUFBa0MsdUJBQXVCLEVBQWdDLE1BQU0saUJBQWlCLENBQUM7QUFNN0osTUFBTSxDQUFDLE1BQU0sb0JBQW9CLEdBQWU7SUFDOUMsVUFBVSxFQUFFLFVBQVU7SUFDdEIsWUFBWSxFQUFFLENBQUMsR0FBRyxFQUFFLFFBQVEsQ0FBQztJQUM3QixRQUFRLEVBQUUsQ0FBQyxFQUFZLEVBQUUsS0FBZSxFQUFFLEtBQW1CLEVBQUUsRUFBRTtRQUMvRCxNQUFNLENBQUMsQ0FBQyxFQUFFLE1BQU0sQ0FBQyxHQUFHLEtBQTZCLENBQUM7UUFFbEQsTUFBTSxXQUFXLEdBQWtDLEVBQUMsQ0FBQyxFQUFFLE1BQU0sRUFBRSxFQUFFLEVBQUMsQ0FBQztRQUNuRSxNQUFNLFlBQVksR0FBbUMsRUFBQyxDQUFDLEVBQUUsTUFBTSxFQUFFLEVBQUUsRUFBQyxDQUFDO1FBRXJFLE9BQU87WUFDTCxDQUFDLEVBQUUsR0FBRyxFQUFFLENBQUMsTUFBTSxDQUFDLFNBQVMsQ0FDckIsdUJBQXVCLEVBQUUsV0FBbUMsRUFBRSxLQUFLLENBQUM7WUFDeEUsTUFBTSxFQUFFLEdBQUcsRUFBRSxDQUFDLE1BQU0sQ0FBQyxTQUFTLENBQzFCLHdCQUF3QixFQUFFLFlBQW9DLEVBQUUsS0FBSyxDQUFDO1NBQzNFLENBQUM7SUFDSixDQUFDO0NBQ0YsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbIi8qKlxuICogQGxpY2Vuc2VcbiAqIENvcHlyaWdodCAyMDIwIEdvb2dsZSBMTEMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuXG4gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgXCJMaWNlbnNlXCIpO1xuICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLlxuICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0XG4gKlxuICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wXG4gKlxuICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZVxuICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gXCJBUyBJU1wiIEJBU0lTLFxuICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuXG4gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kXG4gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS5cbiAqID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4gKi9cbmltcG9ydCB7RU5HSU5FfSBmcm9tICcuLi9lbmdpbmUnO1xuaW1wb3J0IHtEaWxhdGlvbjJELCBEaWxhdGlvbjJEQmFja3Byb3BGaWx0ZXIsIERpbGF0aW9uMkRCYWNrcHJvcEZpbHRlcklucHV0cywgRGlsYXRpb24yREJhY2twcm9wSW5wdXQsIERpbGF0aW9uMkRCYWNrcHJvcElucHV0SW5wdXRzfSBmcm9tICcuLi9rZXJuZWxfbmFtZXMnO1xuaW1wb3J0IHtHcmFkQ29uZmlnfSBmcm9tICcuLi9rZXJuZWxfcmVnaXN0cnknO1xuaW1wb3J0IHtOYW1lZEF0dHJNYXB9IGZyb20gJy4uL2tlcm5lbF9yZWdpc3RyeSc7XG5pbXBvcnQge1RlbnNvciwgVGVuc29yM0QsIFRlbnNvcjREfSBmcm9tICcuLi90ZW5zb3InO1xuaW1wb3J0IHtOYW1lZFRlbnNvck1hcH0gZnJvbSAnLi4vdGVuc29yX3R5cGVzJztcblxuZXhwb3J0IGNvbnN0IGRpbGF0aW9uMmRHcmFkQ29uZmlnOiBHcmFkQ29uZmlnID0ge1xuICBrZXJuZWxOYW1lOiBEaWxhdGlvbjJELFxuICBpbnB1dHNUb1NhdmU6IFsneCcsICdmaWx0ZXInXSxcbiAgZ3JhZEZ1bmM6IChkeTogVGVuc29yNEQsIHNhdmVkOiBUZW5zb3JbXSwgYXR0cnM6IE5hbWVkQXR0ck1hcCkgPT4ge1xuICAgIGNvbnN0IFt4LCBmaWx0ZXJdID0gc2F2ZWQgYXMgW1RlbnNvcjRELCBUZW5zb3IzRF07XG5cbiAgICBjb25zdCBpbnB1dElucHV0czogRGlsYXRpb24yREJhY2twcm9wSW5wdXRJbnB1dHMgPSB7eCwgZmlsdGVyLCBkeX07XG4gICAgY29uc3QgZmlsdGVySW5wdXRzOiBEaWxhdGlvbjJEQmFja3Byb3BGaWx0ZXJJbnB1dHMgPSB7eCwgZmlsdGVyLCBkeX07XG5cbiAgICByZXR1cm4ge1xuICAgICAgeDogKCkgPT4gRU5HSU5FLnJ1bktlcm5lbChcbiAgICAgICAgICBEaWxhdGlvbjJEQmFja3Byb3BJbnB1dCwgaW5wdXRJbnB1dHMgYXMge30gYXMgTmFtZWRUZW5zb3JNYXAsIGF0dHJzKSxcbiAgICAgIGZpbHRlcjogKCkgPT4gRU5HSU5FLnJ1bktlcm5lbChcbiAgICAgICAgICBEaWxhdGlvbjJEQmFja3Byb3BGaWx0ZXIsIGZpbHRlcklucHV0cyBhcyB7fSBhcyBOYW1lZFRlbnNvck1hcCwgYXR0cnMpXG4gICAgfTtcbiAgfVxufTtcbiJdfQ==","/**\n * @license\n * Copyright 2020 Google LLC. All Rights Reserved.\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n * =============================================================================\n */\nimport { ENGINE } from '../engine';\nimport { Elu, EluGrad } from '../kernel_names';\nexport const eluGradConfig = {\n kernelName: Elu,\n outputsToSave: [true],\n gradFunc: (dy, saved) => {\n const [y] = saved;\n const inputs = { dy, y };\n return { x: () => ENGINE.runKernel(EluGrad, inputs) };\n }\n};\n//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiRWx1X2dyYWQuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi8uLi90ZmpzLWNvcmUvc3JjL2dyYWRpZW50cy9FbHVfZ3JhZC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQTs7Ozs7Ozs7Ozs7Ozs7O0dBZUc7QUFDSCxPQUFPLEVBQUMsTUFBTSxFQUFDLE1BQU0sV0FBVyxDQUFDO0FBQ2pDLE9BQU8sRUFBQyxHQUFHLEVBQUUsT0FBTyxFQUFnQixNQUFNLGlCQUFpQixDQUFDO0FBSzVELE1BQU0sQ0FBQyxNQUFNLGFBQWEsR0FBZTtJQUN2QyxVQUFVLEVBQUUsR0FBRztJQUNmLGFBQWEsRUFBRSxDQUFDLElBQUksQ0FBQztJQUNyQixRQUFRLEVBQUUsQ0FBQyxFQUFVLEVBQUUsS0FBZSxFQUFFLEVBQUU7UUFDeEMsTUFBTSxDQUFDLENBQUMsQ0FBQyxHQUFHLEtBQUssQ0FBQztRQUVsQixNQUFNLE1BQU0sR0FBa0IsRUFBQyxFQUFFLEVBQUUsQ0FBQyxFQUFDLENBQUM7UUFFdEMsT0FBTyxFQUFDLENBQUMsRUFBRSxHQUFHLEVBQUUsQ0FBQyxNQUFNLENBQUMsU0FBUyxDQUFDLE9BQU8sRUFBRSxNQUE4QixDQUFDLEVBQUMsQ0FBQztJQUM5RSxDQUFDO0NBQ0YsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbIi8qKlxuICogQGxpY2Vuc2VcbiAqIENvcHlyaWdodCAyMDIwIEdvb2dsZSBMTEMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuXG4gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgXCJMaWNlbnNlXCIpO1xuICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLlxuICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0XG4gKlxuICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wXG4gKlxuICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZVxuICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gXCJBUyBJU1wiIEJBU0lTLFxuICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuXG4gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kXG4gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS5cbiAqID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4gKi9cbmltcG9ydCB7RU5HSU5FfSBmcm9tICcuLi9lbmdpbmUnO1xuaW1wb3J0IHtFbHUsIEVsdUdyYWQsIEVsdUdyYWRJbnB1dHN9IGZyb20gJy4uL2tlcm5lbF9uYW1lcyc7XG5pbXBvcnQge0dyYWRDb25maWd9IGZyb20gJy4uL2tlcm5lbF9yZWdpc3RyeSc7XG5pbXBvcnQge1RlbnNvcn0gZnJvbSAnLi4vdGVuc29yJztcbmltcG9ydCB7TmFtZWRUZW5zb3JNYXB9IGZyb20gJy4uL3RlbnNvcl90eXBlcyc7XG5cbmV4cG9ydCBjb25zdCBlbHVHcmFkQ29uZmlnOiBHcmFkQ29uZmlnID0ge1xuICBrZXJuZWxOYW1lOiBFbHUsXG4gIG91dHB1dHNUb1NhdmU6IFt0cnVlXSxcbiAgZ3JhZEZ1bmM6IChkeTogVGVuc29yLCBzYXZlZDogVGVuc29yW10pID0+IHtcbiAgICBjb25zdCBbeV0gPSBzYXZlZDtcblxuICAgIGNvbnN0IGlucHV0czogRWx1R3JhZElucHV0cyA9IHtkeSwgeX07XG5cbiAgICByZXR1cm4ge3g6ICgpID0+IEVOR0lORS5ydW5LZXJuZWwoRWx1R3JhZCwgaW5wdXRzIGFzIHt9IGFzIE5hbWVkVGVuc29yTWFwKX07XG4gIH1cbn07XG4iXX0=","/**\n * @license\n * Copyright 2020 Google LLC. All Rights Reserved.\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n * =============================================================================\n */\nimport { Erf } from '../kernel_names';\nimport { exp } from '../ops/exp';\nimport { mul } from '../ops/mul';\nimport { neg } from '../ops/neg';\nimport { square } from '../ops/square';\nexport const erfGradConfig = {\n kernelName: Erf,\n inputsToSave: ['x'],\n gradFunc: (dy, saved) => {\n const [x] = saved;\n const a = mul(exp(neg(square(x))), 2 / Math.sqrt(Math.PI));\n return { x: () => mul(dy, a) };\n }\n};\n//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiRXJmX2dyYWQuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi8uLi90ZmpzLWNvcmUvc3JjL2dyYWRpZW50cy9FcmZfZ3JhZC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQTs7Ozs7Ozs7Ozs7Ozs7O0dBZUc7QUFFSCxPQUFPLEVBQUMsR0FBRyxFQUFDLE1BQU0saUJBQWlCLENBQUM7QUFFcEMsT0FBTyxFQUFDLEdBQUcsRUFBQyxNQUFNLFlBQVksQ0FBQztBQUMvQixPQUFPLEVBQUMsR0FBRyxFQUFDLE1BQU0sWUFBWSxDQUFDO0FBQy9CLE9BQU8sRUFBQyxHQUFHLEVBQUMsTUFBTSxZQUFZLENBQUM7QUFDL0IsT0FBTyxFQUFDLE1BQU0sRUFBQyxNQUFNLGVBQWUsQ0FBQztBQUdyQyxNQUFNLENBQUMsTUFBTSxhQUFhLEdBQWU7SUFDdkMsVUFBVSxFQUFFLEdBQUc7SUFDZixZQUFZLEVBQUUsQ0FBQyxHQUFHLENBQUM7SUFDbkIsUUFBUSxFQUFFLENBQUMsRUFBVSxFQUFFLEtBQWUsRUFBRSxFQUFFO1FBQ3hDLE1BQU0sQ0FBQyxDQUFDLENBQUMsR0FBRyxLQUFLLENBQUM7UUFDbEIsTUFBTSxDQUFDLEdBQUcsR0FBRyxDQUFDLEdBQUcsQ0FBQyxHQUFHLENBQUMsTUFBTSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLEdBQUcsSUFBSSxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQztRQUMzRCxPQUFPLEVBQUMsQ0FBQyxFQUFFLEdBQUcsRUFBRSxDQUFDLEdBQUcsQ0FBQyxFQUFFLEVBQUUsQ0FBQyxDQUFDLEVBQUMsQ0FBQztJQUMvQixDQUFDO0NBQ0YsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbIi8qKlxuICogQGxpY2Vuc2VcbiAqIENvcHlyaWdodCAyMDIwIEdvb2dsZSBMTEMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuXG4gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgXCJMaWNlbnNlXCIpO1xuICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLlxuICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0XG4gKlxuICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wXG4gKlxuICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZVxuICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gXCJBUyBJU1wiIEJBU0lTLFxuICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuXG4gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kXG4gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS5cbiAqID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4gKi9cblxuaW1wb3J0IHtFcmZ9IGZyb20gJy4uL2tlcm5lbF9uYW1lcyc7XG5pbXBvcnQge0dyYWRDb25maWd9IGZyb20gJy4uL2tlcm5lbF9yZWdpc3RyeSc7XG5pbXBvcnQge2V4cH0gZnJvbSAnLi4vb3BzL2V4cCc7XG5pbXBvcnQge211bH0gZnJvbSAnLi4vb3BzL211bCc7XG5pbXBvcnQge25lZ30gZnJvbSAnLi4vb3BzL25lZyc7XG5pbXBvcnQge3NxdWFyZX0gZnJvbSAnLi4vb3BzL3NxdWFyZSc7XG5pbXBvcnQge1RlbnNvcn0gZnJvbSAnLi4vdGVuc29yJztcblxuZXhwb3J0IGNvbnN0IGVyZkdyYWRDb25maWc6IEdyYWRDb25maWcgPSB7XG4gIGtlcm5lbE5hbWU6IEVyZixcbiAgaW5wdXRzVG9TYXZlOiBbJ3gnXSxcbiAgZ3JhZEZ1bmM6IChkeTogVGVuc29yLCBzYXZlZDogVGVuc29yW10pID0+IHtcbiAgICBjb25zdCBbeF0gPSBzYXZlZDtcbiAgICBjb25zdCBhID0gbXVsKGV4cChuZWcoc3F1YXJlKHgpKSksIDIgLyBNYXRoLnNxcnQoTWF0aC5QSSkpO1xuICAgIHJldHVybiB7eDogKCkgPT4gbXVsKGR5LCBhKX07XG4gIH1cbn07XG4iXX0=","/**\n * @license\n * Copyright 2020 Google LLC. All Rights Reserved.\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n * =============================================================================\n */\nimport { Exp } from '../kernel_names';\nimport { mul } from '../ops/mul';\nexport const expGradConfig = {\n kernelName: Exp,\n outputsToSave: [true],\n gradFunc: (dy, saved) => {\n const [y] = saved;\n return { x: () => mul(dy, y) };\n }\n};\n//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiRXhwX2dyYWQuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi8uLi90ZmpzLWNvcmUvc3JjL2dyYWRpZW50cy9FeHBfZ3JhZC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQTs7Ozs7Ozs7Ozs7Ozs7O0dBZUc7QUFFSCxPQUFPLEVBQUMsR0FBRyxFQUFDLE1BQU0saUJBQWlCLENBQUM7QUFFcEMsT0FBTyxFQUFDLEdBQUcsRUFBQyxNQUFNLFlBQVksQ0FBQztBQUcvQixNQUFNLENBQUMsTUFBTSxhQUFhLEdBQWU7SUFDdkMsVUFBVSxFQUFFLEdBQUc7SUFDZixhQUFhLEVBQUUsQ0FBQyxJQUFJLENBQUM7SUFDckIsUUFBUSxFQUFFLENBQUMsRUFBVSxFQUFFLEtBQWUsRUFBRSxFQUFFO1FBQ3hDLE1BQU0sQ0FBQyxDQUFDLENBQUMsR0FBRyxLQUFLLENBQUM7UUFDbEIsT0FBTyxFQUFDLENBQUMsRUFBRSxHQUFHLEVBQUUsQ0FBQyxHQUFHLENBQUMsRUFBRSxFQUFFLENBQUMsQ0FBQyxFQUFDLENBQUM7SUFDL0IsQ0FBQztDQUNGLENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyIvKipcbiAqIEBsaWNlbnNlXG4gKiBDb3B5cmlnaHQgMjAyMCBHb29nbGUgTExDLiBBbGwgUmlnaHRzIFJlc2VydmVkLlxuICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlIFwiTGljZW5zZVwiKTtcbiAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS5cbiAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdFxuICpcbiAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMFxuICpcbiAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmVcbiAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuIFwiQVMgSVNcIiBCQVNJUyxcbiAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLlxuICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZFxuICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuXG4gKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuICovXG5cbmltcG9ydCB7RXhwfSBmcm9tICcuLi9rZXJuZWxfbmFtZXMnO1xuaW1wb3J0IHtHcmFkQ29uZmlnfSBmcm9tICcuLi9rZXJuZWxfcmVnaXN0cnknO1xuaW1wb3J0IHttdWx9IGZyb20gJy4uL29wcy9tdWwnO1xuaW1wb3J0IHtUZW5zb3J9IGZyb20gJy4uL3RlbnNvcic7XG5cbmV4cG9ydCBjb25zdCBleHBHcmFkQ29uZmlnOiBHcmFkQ29uZmlnID0ge1xuICBrZXJuZWxOYW1lOiBFeHAsXG4gIG91dHB1dHNUb1NhdmU6IFt0cnVlXSxcbiAgZ3JhZEZ1bmM6IChkeTogVGVuc29yLCBzYXZlZDogVGVuc29yW10pID0+IHtcbiAgICBjb25zdCBbeV0gPSBzYXZlZDtcbiAgICByZXR1cm4ge3g6ICgpID0+IG11bChkeSwgeSl9O1xuICB9XG59O1xuIl19","/**\n * @license\n * Copyright 2020 Google LLC. All Rights Reserved.\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n * =============================================================================\n */\nimport { ExpandDims } from '../kernel_names';\nimport { reshape } from '../ops/reshape';\nexport const expandDimsGradConfig = {\n kernelName: ExpandDims,\n inputsToSave: ['input'],\n gradFunc: (dy, saved) => {\n const [input] = saved;\n return { input: () => reshape(dy, input.shape) };\n }\n};\n//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiRXhwYW5kRGltc19ncmFkLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vLi4vdGZqcy1jb3JlL3NyYy9ncmFkaWVudHMvRXhwYW5kRGltc19ncmFkLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBOzs7Ozs7Ozs7Ozs7Ozs7R0FlRztBQUVILE9BQU8sRUFBQyxVQUFVLEVBQUMsTUFBTSxpQkFBaUIsQ0FBQztBQUUzQyxPQUFPLEVBQUMsT0FBTyxFQUFDLE1BQU0sZ0JBQWdCLENBQUM7QUFHdkMsTUFBTSxDQUFDLE1BQU0sb0JBQW9CLEdBQWU7SUFDOUMsVUFBVSxFQUFFLFVBQVU7SUFDdEIsWUFBWSxFQUFFLENBQUMsT0FBTyxDQUFDO0lBQ3ZCLFFBQVEsRUFBRSxDQUFDLEVBQVUsRUFBRSxLQUFlLEVBQUUsRUFBRTtRQUN4QyxNQUFNLENBQUMsS0FBSyxDQUFDLEdBQUcsS0FBSyxDQUFDO1FBQ3RCLE9BQU8sRUFBQyxLQUFLLEVBQUUsR0FBRyxFQUFFLENBQUMsT0FBTyxDQUFDLEVBQUUsRUFBRSxLQUFLLENBQUMsS0FBSyxDQUFDLEVBQUMsQ0FBQztJQUNqRCxDQUFDO0NBQ0YsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbIi8qKlxuICogQGxpY2Vuc2VcbiAqIENvcHlyaWdodCAyMDIwIEdvb2dsZSBMTEMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuXG4gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgXCJMaWNlbnNlXCIpO1xuICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLlxuICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0XG4gKlxuICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wXG4gKlxuICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZVxuICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gXCJBUyBJU1wiIEJBU0lTLFxuICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuXG4gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kXG4gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS5cbiAqID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4gKi9cblxuaW1wb3J0IHtFeHBhbmREaW1zfSBmcm9tICcuLi9rZXJuZWxfbmFtZXMnO1xuaW1wb3J0IHtHcmFkQ29uZmlnfSBmcm9tICcuLi9rZXJuZWxfcmVnaXN0cnknO1xuaW1wb3J0IHtyZXNoYXBlfSBmcm9tICcuLi9vcHMvcmVzaGFwZSc7XG5pbXBvcnQge1RlbnNvcn0gZnJvbSAnLi4vdGVuc29yJztcblxuZXhwb3J0IGNvbnN0IGV4cGFuZERpbXNHcmFkQ29uZmlnOiBHcmFkQ29uZmlnID0ge1xuICBrZXJuZWxOYW1lOiBFeHBhbmREaW1zLFxuICBpbnB1dHNUb1NhdmU6IFsnaW5wdXQnXSxcbiAgZ3JhZEZ1bmM6IChkeTogVGVuc29yLCBzYXZlZDogVGVuc29yW10pID0+IHtcbiAgICBjb25zdCBbaW5wdXRdID0gc2F2ZWQ7XG4gICAgcmV0dXJuIHtpbnB1dDogKCkgPT4gcmVzaGFwZShkeSwgaW5wdXQuc2hhcGUpfTtcbiAgfVxufTtcbiJdfQ==","/**\n * @license\n * Copyright 2020 Google LLC. All Rights Reserved.\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n * =============================================================================\n */\nimport { Expm1 } from '../kernel_names';\nimport { exp } from '../ops/exp';\nimport { mul } from '../ops/mul';\nexport const expm1GradConfig = {\n kernelName: Expm1,\n inputsToSave: ['x'],\n gradFunc: (dy, saved) => {\n const [x] = saved;\n return { x: () => mul(dy, exp(x)) };\n }\n};\n//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiRXhwbTFfZ3JhZC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uLy4uL3RmanMtY29yZS9zcmMvZ3JhZGllbnRzL0V4cG0xX2dyYWQudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUE7Ozs7Ozs7Ozs7Ozs7OztHQWVHO0FBRUgsT0FBTyxFQUFDLEtBQUssRUFBQyxNQUFNLGlCQUFpQixDQUFDO0FBRXRDLE9BQU8sRUFBQyxHQUFHLEVBQUMsTUFBTSxZQUFZLENBQUM7QUFDL0IsT0FBTyxFQUFDLEdBQUcsRUFBQyxNQUFNLFlBQVksQ0FBQztBQUcvQixNQUFNLENBQUMsTUFBTSxlQUFlLEdBQWU7SUFDekMsVUFBVSxFQUFFLEtBQUs7SUFDakIsWUFBWSxFQUFFLENBQUMsR0FBRyxDQUFDO0lBQ25CLFFBQVEsRUFBRSxDQUFDLEVBQVUsRUFBRSxLQUFlLEVBQUUsRUFBRTtRQUN4QyxNQUFNLENBQUMsQ0FBQyxDQUFDLEdBQUcsS0FBSyxDQUFDO1FBQ2xCLE9BQU8sRUFBQyxDQUFDLEVBQUUsR0FBRyxFQUFFLENBQUMsR0FBRyxDQUFDLEVBQUUsRUFBRSxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsRUFBQyxDQUFDO0lBQ3BDLENBQUM7Q0FDRixDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiLyoqXG4gKiBAbGljZW5zZVxuICogQ29weXJpZ2h0IDIwMjAgR29vZ2xlIExMQy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC5cbiAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSBcIkxpY2Vuc2VcIik7XG4gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuXG4gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXRcbiAqXG4gKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjBcbiAqXG4gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlXG4gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiBcIkFTIElTXCIgQkFTSVMsXG4gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC5cbiAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmRcbiAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLlxuICogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbiAqL1xuXG5pbXBvcnQge0V4cG0xfSBmcm9tICcuLi9rZXJuZWxfbmFtZXMnO1xuaW1wb3J0IHtHcmFkQ29uZmlnfSBmcm9tICcuLi9rZXJuZWxfcmVnaXN0cnknO1xuaW1wb3J0IHtleHB9IGZyb20gJy4uL29wcy9leHAnO1xuaW1wb3J0IHttdWx9IGZyb20gJy4uL29wcy9tdWwnO1xuaW1wb3J0IHtUZW5zb3J9IGZyb20gJy4uL3RlbnNvcic7XG5cbmV4cG9ydCBjb25zdCBleHBtMUdyYWRDb25maWc6IEdyYWRDb25maWcgPSB7XG4gIGtlcm5lbE5hbWU6IEV4cG0xLFxuICBpbnB1dHNUb1NhdmU6IFsneCddLFxuICBncmFkRnVuYzogKGR5OiBUZW5zb3IsIHNhdmVkOiBUZW5zb3JbXSkgPT4ge1xuICAgIGNvbnN0IFt4XSA9IHNhdmVkO1xuICAgIHJldHVybiB7eDogKCkgPT4gbXVsKGR5LCBleHAoeCkpfTtcbiAgfVxufTtcbiJdfQ==","/**\n * @license\n * Copyright 2020 Google LLC. All Rights Reserved.\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n * =============================================================================\n */\nimport { Floor } from '../kernel_names';\nimport { zerosLike } from '../ops/zeros_like';\nexport const floorGradConfig = {\n kernelName: Floor,\n gradFunc: (dy) => {\n return { x: () => zerosLike(dy) };\n }\n};\n//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiRmxvb3JfZ3JhZC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uLy4uL3RmanMtY29yZS9zcmMvZ3JhZGllbnRzL0Zsb29yX2dyYWQudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUE7Ozs7Ozs7Ozs7Ozs7OztHQWVHO0FBRUgsT0FBTyxFQUFDLEtBQUssRUFBQyxNQUFNLGlCQUFpQixDQUFDO0FBRXRDLE9BQU8sRUFBQyxTQUFTLEVBQUMsTUFBTSxtQkFBbUIsQ0FBQztBQUc1QyxNQUFNLENBQUMsTUFBTSxlQUFlLEdBQWU7SUFDekMsVUFBVSxFQUFFLEtBQUs7SUFDakIsUUFBUSxFQUFFLENBQUMsRUFBVSxFQUFFLEVBQUU7UUFDdkIsT0FBTyxFQUFDLENBQUMsRUFBRSxHQUFHLEVBQUUsQ0FBQyxTQUFTLENBQUMsRUFBRSxDQUFDLEVBQUMsQ0FBQztJQUNsQyxDQUFDO0NBQ0YsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbIi8qKlxuICogQGxpY2Vuc2VcbiAqIENvcHlyaWdodCAyMDIwIEdvb2dsZSBMTEMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuXG4gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgXCJMaWNlbnNlXCIpO1xuICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLlxuICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0XG4gKlxuICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wXG4gKlxuICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZVxuICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gXCJBUyBJU1wiIEJBU0lTLFxuICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuXG4gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kXG4gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS5cbiAqID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4gKi9cblxuaW1wb3J0IHtGbG9vcn0gZnJvbSAnLi4va2VybmVsX25hbWVzJztcbmltcG9ydCB7R3JhZENvbmZpZ30gZnJvbSAnLi4va2VybmVsX3JlZ2lzdHJ5JztcbmltcG9ydCB7emVyb3NMaWtlfSBmcm9tICcuLi9vcHMvemVyb3NfbGlrZSc7XG5pbXBvcnQge1RlbnNvcn0gZnJvbSAnLi4vdGVuc29yJztcblxuZXhwb3J0IGNvbnN0IGZsb29yR3JhZENvbmZpZzogR3JhZENvbmZpZyA9IHtcbiAga2VybmVsTmFtZTogRmxvb3IsXG4gIGdyYWRGdW5jOiAoZHk6IFRlbnNvcikgPT4ge1xuICAgIHJldHVybiB7eDogKCkgPT4gemVyb3NMaWtlKGR5KX07XG4gIH1cbn07XG4iXX0=","/**\n * @license\n * Copyright 2020 Google LLC. All Rights Reserved.\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n * =============================================================================\n */\nimport { FloorDiv } from '../kernel_names';\nimport { assertAndGetBroadcastShape, getReductionAxes } from '../ops/broadcast_util';\nimport { cast } from '../ops/cast';\nimport { div } from '../ops/div';\nimport { mul } from '../ops/mul';\nimport { neg } from '../ops/neg';\nimport { reshape } from '../ops/reshape';\nimport { square } from '../ops/square';\nimport { sum } from '../ops/sum';\nexport const floorDivGradConfig = {\n kernelName: FloorDiv,\n inputsToSave: ['a', 'b'],\n gradFunc: (dy, saved) => {\n const [a, b] = saved;\n const outShape = assertAndGetBroadcastShape(a.shape, b.shape);\n const derA = () => {\n const res = div(dy, cast(b, 'float32'));\n const reduceAxes = getReductionAxes(a.shape, outShape);\n if (reduceAxes.length > 0) {\n return reshape(sum(res, reduceAxes), a.shape);\n }\n return res;\n };\n const derB = () => {\n let res = mul(dy, cast(a, 'float32'));\n const reduceAxes = getReductionAxes(b.shape, outShape);\n if (reduceAxes.length > 0) {\n res = reshape(sum(res, reduceAxes), b.shape);\n }\n const tmp = square(b);\n return neg(div(res, cast(tmp, 'float32')));\n };\n return { a: derA, b: derB };\n }\n};\n//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiRmxvb3JEaXZfZ3JhZC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uLy4uL3RmanMtY29yZS9zcmMvZ3JhZGllbnRzL0Zsb29yRGl2X2dyYWQudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUE7Ozs7Ozs7Ozs7Ozs7OztHQWVHO0FBRUgsT0FBTyxFQUFDLFFBQVEsRUFBQyxNQUFNLGlCQUFpQixDQUFDO0FBRXpDLE9BQU8sRUFBQywwQkFBMEIsRUFBRSxnQkFBZ0IsRUFBQyxNQUFNLHVCQUF1QixDQUFDO0FBQ25GLE9BQU8sRUFBQyxJQUFJLEVBQUMsTUFBTSxhQUFhLENBQUM7QUFDakMsT0FBTyxFQUFDLEdBQUcsRUFBQyxNQUFNLFlBQVksQ0FBQztBQUMvQixPQUFPLEVBQUMsR0FBRyxFQUFDLE1BQU0sWUFBWSxDQUFDO0FBQy9CLE9BQU8sRUFBQyxHQUFHLEVBQUMsTUFBTSxZQUFZLENBQUM7QUFDL0IsT0FBTyxFQUFDLE9BQU8sRUFBQyxNQUFNLGdCQUFnQixDQUFDO0FBQ3ZDLE9BQU8sRUFBQyxNQUFNLEVBQUMsTUFBTSxlQUFlLENBQUM7QUFDckMsT0FBTyxFQUFDLEdBQUcsRUFBQyxNQUFNLFlBQVksQ0FBQztBQUcvQixNQUFNLENBQUMsTUFBTSxrQkFBa0IsR0FBZTtJQUM1QyxVQUFVLEVBQUUsUUFBUTtJQUNwQixZQUFZLEVBQUUsQ0FBQyxHQUFHLEVBQUUsR0FBRyxDQUFDO0lBQ3hCLFFBQVEsRUFBRSxDQUFDLEVBQVUsRUFBRSxLQUFlLEVBQUUsRUFBRTtRQUN4QyxNQUFNLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxHQUFHLEtBQUssQ0FBQztRQUNyQixNQUFNLFFBQVEsR0FBRywwQkFBMEIsQ0FBQyxDQUFDLENBQUMsS0FBSyxFQUFFLENBQUMsQ0FBQyxLQUFLLENBQUMsQ0FBQztRQUU5RCxNQUFNLElBQUksR0FBRyxHQUFHLEVBQUU7WUFDaEIsTUFBTSxHQUFHLEdBQUcsR0FBRyxDQUFDLEVBQUUsRUFBRSxJQUFJLENBQUMsQ0FBQyxFQUFFLFNBQVMsQ0FBQyxDQUFDLENBQUM7WUFDeEMsTUFBTSxVQUFVLEdBQUcsZ0JBQWdCLENBQUMsQ0FBQyxDQUFDLEtBQUssRUFBRSxRQUFRLENBQUMsQ0FBQztZQUN2RCxJQUFJLFVBQVUsQ0FBQyxNQUFNLEdBQUcsQ0FBQyxFQUFFO2dCQUN6QixPQUFPLE9BQU8sQ0FBQyxHQUFHLENBQUMsR0FBRyxFQUFFLFVBQVUsQ0FBQyxFQUFFLENBQUMsQ0FBQyxLQUFLLENBQUMsQ0FBQzthQUMvQztZQUNELE9BQU8sR0FBRyxDQUFDO1FBQ2IsQ0FBQyxDQUFDO1FBQ0YsTUFBTSxJQUFJLEdBQUcsR0FBRyxFQUFFO1lBQ2hCLElBQUksR0FBRyxHQUFHLEdBQUcsQ0FBQyxFQUFFLEVBQUUsSUFBSSxDQUFDLENBQUMsRUFBRSxTQUFTLENBQUMsQ0FBQyxDQUFDO1lBQ3RDLE1BQU0sVUFBVSxHQUFHLGdCQUFnQixDQUFDLENBQUMsQ0FBQyxLQUFLLEVBQUUsUUFBUSxDQUFDLENBQUM7WUFDdkQsSUFBSSxVQUFVLENBQUMsTUFBTSxHQUFHLENBQUMsRUFBRTtnQkFDekIsR0FBRyxHQUFHLE9BQU8sQ0FBQyxHQUFHLENBQUMsR0FBRyxFQUFFLFVBQVUsQ0FBQyxFQUFFLENBQUMsQ0FBQyxLQUFLLENBQUMsQ0FBQzthQUM5QztZQUNELE1BQU0sR0FBRyxHQUFHLE1BQU0sQ0FBQyxDQUFDLENBQUMsQ0FBQztZQUN0QixPQUFPLEdBQUcsQ0FBQyxHQUFHLENBQUMsR0FBRyxFQUFFLElBQUksQ0FBQyxHQUFHLEVBQUUsU0FBUyxDQUFDLENBQUMsQ0FBQyxDQUFDO1FBQzdDLENBQUMsQ0FBQztRQUNGLE9BQU8sRUFBQyxDQUFDLEVBQUUsSUFBSSxFQUFFLENBQUMsRUFBRSxJQUFJLEVBQUMsQ0FBQztJQUM1QixDQUFDO0NBQ0YsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbIi8qKlxuICogQGxpY2Vuc2VcbiAqIENvcHlyaWdodCAyMDIwIEdvb2dsZSBMTEMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuXG4gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgXCJMaWNlbnNlXCIpO1xuICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLlxuICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0XG4gKlxuICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wXG4gKlxuICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZVxuICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gXCJBUyBJU1wiIEJBU0lTLFxuICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuXG4gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kXG4gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS5cbiAqID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4gKi9cblxuaW1wb3J0IHtGbG9vckRpdn0gZnJvbSAnLi4va2VybmVsX25hbWVzJztcbmltcG9ydCB7R3JhZENvbmZpZ30gZnJvbSAnLi4va2VybmVsX3JlZ2lzdHJ5JztcbmltcG9ydCB7YXNzZXJ0QW5kR2V0QnJvYWRjYXN0U2hhcGUsIGdldFJlZHVjdGlvbkF4ZXN9IGZyb20gJy4uL29wcy9icm9hZGNhc3RfdXRpbCc7XG5pbXBvcnQge2Nhc3R9IGZyb20gJy4uL29wcy9jYXN0JztcbmltcG9ydCB7ZGl2fSBmcm9tICcuLi9vcHMvZGl2JztcbmltcG9ydCB7bXVsfSBmcm9tICcuLi9vcHMvbXVsJztcbmltcG9ydCB7bmVnfSBmcm9tICcuLi9vcHMvbmVnJztcbmltcG9ydCB7cmVzaGFwZX0gZnJvbSAnLi4vb3BzL3Jlc2hhcGUnO1xuaW1wb3J0IHtzcXVhcmV9IGZyb20gJy4uL29wcy9zcXVhcmUnO1xuaW1wb3J0IHtzdW19IGZyb20gJy4uL29wcy9zdW0nO1xuaW1wb3J0IHtUZW5zb3J9IGZyb20gJy4uL3RlbnNvcic7XG5cbmV4cG9ydCBjb25zdCBmbG9vckRpdkdyYWRDb25maWc6IEdyYWRDb25maWcgPSB7XG4gIGtlcm5lbE5hbWU6IEZsb29yRGl2LFxuICBpbnB1dHNUb1NhdmU6IFsnYScsICdiJ10sXG4gIGdyYWRGdW5jOiAoZHk6IFRlbnNvciwgc2F2ZWQ6IFRlbnNvcltdKSA9PiB7XG4gICAgY29uc3QgW2EsIGJdID0gc2F2ZWQ7XG4gICAgY29uc3Qgb3V0U2hhcGUgPSBhc3NlcnRBbmRHZXRCcm9hZGNhc3RTaGFwZShhLnNoYXBlLCBiLnNoYXBlKTtcblxuICAgIGNvbnN0IGRlckEgPSAoKSA9PiB7XG4gICAgICBjb25zdCByZXMgPSBkaXYoZHksIGNhc3QoYiwgJ2Zsb2F0MzInKSk7XG4gICAgICBjb25zdCByZWR1Y2VBeGVzID0gZ2V0UmVkdWN0aW9uQXhlcyhhLnNoYXBlLCBvdXRTaGFwZSk7XG4gICAgICBpZiAocmVkdWNlQXhlcy5sZW5ndGggPiAwKSB7XG4gICAgICAgIHJldHVybiByZXNoYXBlKHN1bShyZXMsIHJlZHVjZUF4ZXMpLCBhLnNoYXBlKTtcbiAgICAgIH1cbiAgICAgIHJldHVybiByZXM7XG4gICAgfTtcbiAgICBjb25zdCBkZXJCID0gKCkgPT4ge1xuICAgICAgbGV0IHJlcyA9IG11bChkeSwgY2FzdChhLCAnZmxvYXQzMicpKTtcbiAgICAgIGNvbnN0IHJlZHVjZUF4ZXMgPSBnZXRSZWR1Y3Rpb25BeGVzKGIuc2hhcGUsIG91dFNoYXBlKTtcbiAgICAgIGlmIChyZWR1Y2VBeGVzLmxlbmd0aCA+IDApIHtcbiAgICAgICAgcmVzID0gcmVzaGFwZShzdW0ocmVzLCByZWR1Y2VBeGVzKSwgYi5zaGFwZSk7XG4gICAgICB9XG4gICAgICBjb25zdCB0bXAgPSBzcXVhcmUoYik7XG4gICAgICByZXR1cm4gbmVnKGRpdihyZXMsIGNhc3QodG1wLCAnZmxvYXQzMicpKSk7XG4gICAgfTtcbiAgICByZXR1cm4ge2E6IGRlckEsIGI6IGRlckJ9O1xuICB9XG59O1xuIl19","/**\n * @license\n * Copyright 2020 Google LLC. All Rights Reserved.\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n * =============================================================================\n */\nimport { FusedBatchNorm } from '../kernel_names';\nimport { add } from '../ops/add';\nimport { getReductionAxes } from '../ops/broadcast_util';\nimport { mul } from '../ops/mul';\nimport { reshape } from '../ops/reshape';\nimport { rsqrt } from '../ops/rsqrt';\nimport { scalar } from '../ops/scalar';\nimport { sub } from '../ops/sub';\nimport { sum } from '../ops/sum';\nimport { tile } from '../ops/tile';\nexport const fusedBatchNormGradConfig = {\n kernelName: FusedBatchNorm,\n inputsToSave: ['x', 'mean', 'variance', 'scale'],\n gradFunc: (dy, saved, attrs) => {\n const { varianceEpsilon } = attrs;\n const [x, mean, variance, scale] = saved;\n const scaleValue = scale == null ? scalar(1) : scale;\n const reductionAxes = getReductionAxes(mean.shape, x.shape);\n const tileShape = [];\n if (mean.rank === 1) {\n for (let i = 0; i < x.shape.length - 1; ++i) {\n tileShape.push(x.shape[i]);\n }\n tileShape.push(1);\n }\n const xMinusMean = sub(x, mean);\n const dyTimesScaleValue = mul(dy, scaleValue);\n const oneOverSqrtVariance = rsqrt(add(variance, scalar(varianceEpsilon)));\n const minusHalfRCube = mul(mul(mul(oneOverSqrtVariance, oneOverSqrtVariance), oneOverSqrtVariance), scalar(-0.5));\n const derX = () => {\n if (mean.rank === 1) {\n return reshape(mul(mul(dy, tile(reshape(oneOverSqrtVariance, [1, 1, 1, mean.shape[0]]), tileShape)), scaleValue), x.shape);\n }\n else {\n return reshape(mul(mul(dy, oneOverSqrtVariance), scaleValue), x.shape);\n }\n };\n const derMean = () => {\n let meanDer = mul(mul(oneOverSqrtVariance, scalar(-1)), dyTimesScaleValue);\n if (mean.rank === 1) {\n meanDer = sum(meanDer, reductionAxes);\n }\n return reshape(meanDer, mean.shape);\n };\n const derVariance = () => {\n let varianceDer = mul(mul(minusHalfRCube, xMinusMean), dyTimesScaleValue);\n if (mean.rank === 1) {\n varianceDer = sum(varianceDer, reductionAxes);\n }\n return reshape(varianceDer, mean.shape);\n };\n const derScale = () => {\n const xMinusMean2TimesRsqrt = mul(xMinusMean, oneOverSqrtVariance);\n let scaleDer = mul(dy, xMinusMean2TimesRsqrt);\n if (mean.rank === 1) {\n scaleDer = sum(scaleDer, reductionAxes);\n }\n return reshape(scaleDer, mean.shape);\n };\n const derOffset = () => {\n let offsetDer = dy;\n if (mean.rank === 1) {\n offsetDer = sum(offsetDer, reductionAxes);\n }\n return reshape(offsetDer, mean.shape);\n };\n return {\n x: derX,\n mean: derMean,\n variance: derVariance,\n scale: derScale,\n offset: derOffset\n };\n }\n};\n//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiRnVzZWRCYXRjaE5vcm1fZ3JhZC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uLy4uL3RmanMtY29yZS9zcmMvZ3JhZGllbnRzL0Z1c2VkQmF0Y2hOb3JtX2dyYWQudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUE7Ozs7Ozs7Ozs7Ozs7OztHQWVHO0FBQ0gsT0FBTyxFQUFDLGNBQWMsRUFBc0IsTUFBTSxpQkFBaUIsQ0FBQztBQUVwRSxPQUFPLEVBQUMsR0FBRyxFQUFDLE1BQU0sWUFBWSxDQUFDO0FBQy9CLE9BQU8sRUFBQyxnQkFBZ0IsRUFBQyxNQUFNLHVCQUF1QixDQUFDO0FBQ3ZELE9BQU8sRUFBQyxHQUFHLEVBQUMsTUFBTSxZQUFZLENBQUM7QUFDL0IsT0FBTyxFQUFDLE9BQU8sRUFBQyxNQUFNLGdCQUFnQixDQUFDO0FBQ3ZDLE9BQU8sRUFBQyxLQUFLLEVBQUMsTUFBTSxjQUFjLENBQUM7QUFDbkMsT0FBTyxFQUFDLE1BQU0sRUFBQyxNQUFNLGVBQWUsQ0FBQztBQUNyQyxPQUFPLEVBQUMsR0FBRyxFQUFDLE1BQU0sWUFBWSxDQUFDO0FBQy9CLE9BQU8sRUFBQyxHQUFHLEVBQUMsTUFBTSxZQUFZLENBQUM7QUFDL0IsT0FBTyxFQUFDLElBQUksRUFBQyxNQUFNLGFBQWEsQ0FBQztBQUlqQyxNQUFNLENBQUMsTUFBTSx3QkFBd0IsR0FBZTtJQUNsRCxVQUFVLEVBQUUsY0FBYztJQUMxQixZQUFZLEVBQUUsQ0FBQyxHQUFHLEVBQUUsTUFBTSxFQUFFLFVBQVUsRUFBRSxPQUFPLENBQUM7SUFDaEQsUUFBUSxFQUFFLENBQ04sRUFBVSxFQUFFLEtBQWUsRUFBRSxLQUFtQixFQUFFLEVBQUU7UUFDdEQsTUFBTSxFQUFDLGVBQWUsRUFBQyxHQUFHLEtBQWtDLENBQUM7UUFDN0QsTUFBTSxDQUFDLENBQUMsRUFBRSxJQUFJLEVBQUUsUUFBUSxFQUFFLEtBQUssQ0FBQyxHQUFHLEtBQUssQ0FBQztRQUV6QyxNQUFN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QUM7UUFDekQsQ0FBQyxDQUFDO1FBQ0YsTUFBTSxRQUFRLEdBQUcsR0FBRyxFQUFFO1lBQ3BCLE1BQU0scUJBQXFCLEdBQUcsR0FBRyxDQUFDLFVBQVUsRUFBRSxtQkFBbUIsQ0FBQyxDQUFDO1lBRW5FLElBQUksUUFBUSxHQUFHLEdBQUcsQ0FBQyxFQUFFLEVBQUUscUJBQXFCLENBQUMsQ0FBQztZQUM5QyxJQUFJLElBQUksQ0FBQyxJQUFJLEtBQUssQ0FBQyxFQUFFO2dCQUNuQixRQUFRLEdBQUcsR0FBRyxDQUFDLFFBQVEsRUFBRSxhQUFhLENBQUMsQ0FBQzthQUN6QztZQUNELE9BQU8sT0FBTyxDQUFDLFFBQVEsRUFBRSxJQUFJLENBQUMsS0FBb0IsQ0FBQyxDQUFDO1FBQ3RELENBQUMsQ0FBQztRQUNGLE1BQU0sU0FBUyxHQUFHLEdBQUcsRUFBRTtZQUNyQixJQUFJLFNBQVMsR0FBRyxFQUFFLENBQUM7WUFDbkIsSUFBSSxJQUFJLENBQUMsSUFBSSxLQUFLLENBQUMsRUFBRTtnQkFDbkIsU0FBUyxHQUFHLEdBQUcsQ0FBQyxTQUFTLEVBQUUsYUFBYSxDQUFDLENBQUM7YUFDM0M7WUFDRCxPQUFPLE9BQU8sQ0FBQyxTQUFTLEVBQUUsSUFBSSxDQUFDLEtBQW9CLENBQUMsQ0FBQztRQUN2RCxDQUFDLENBQUM7UUFFRixPQUFPO1lBQ0wsQ0FBQyxFQUFFLElBQUk7WUFDUCxJQUFJLEVBQUUsT0FBTztZQUNiLFFBQVEsRUFBRSxXQUFXO1lBQ3JCLEtBQUssRUFBRSxRQUFRO1lBQ2YsTUFBTSxFQUFFLFNBQVM7U0FDbEIsQ0FBQztJQUNKLENBQUM7Q0FDRixDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiLyoqXG4gKiBAbGljZW5zZVxuICogQ29weXJpZ2h0IDIwMjAgR29vZ2xlIExMQy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC5cbiAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSBcIkxpY2Vuc2VcIik7XG4gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuXG4gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXRcbiAqXG4gKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjBcbiAqXG4gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlXG4gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiBcIkFTIElTXCIgQkFTSVMsXG4gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC5cbiAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmRcbiAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLlxuICogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbiAqL1xuaW1wb3J0IHtGdXNlZEJhdGNoTm9ybSwgRnVzZWRCYXRjaE5vcm1BdHRyc30gZnJvbSAnLi4va2VybmVsX25hbWVzJztcbmltcG9ydCB7R3JhZENvbmZpZywgTmFtZWRBdHRyTWFwfSBmcm9tICcuLi9rZXJuZWxfcmVnaXN0cnknO1xuaW1wb3J0IHthZGR9IGZyb20gJy4uL29wcy9hZGQnO1xuaW1wb3J0IHtnZXRSZWR1Y3Rpb25BeGVzfSBmcm9tICcuLi9vcHMvYnJvYWRjYXN0X3V0aWwnO1xuaW1wb3J0IHttdWx9IGZyb20gJy4uL29wcy9tdWwnO1xuaW1wb3J0IHtyZXNoYXBlfSBmcm9tICcuLi9vcHMvcmVzaGFwZSc7XG5pbXBvcnQge3JzcXJ0fSBmcm9tICcuLi9vcHMvcnNxcnQnO1xuaW1wb3J0IHtzY2FsYXJ9IGZyb20gJy4uL29wcy9zY2FsYXInO1xuaW1wb3J0IHtzdWJ9IGZyb20gJy4uL29wcy9zdWInO1xuaW1wb3J0IHtzdW19IGZyb20gJy4uL29wcy9zdW0nO1xuaW1wb3J0IHt0aWxlfSBmcm9tICcuLi9vcHMvdGlsZSc7XG5pbXBvcnQge1RlbnNvcn0gZnJvbSAnLi4vdGVuc29yJztcbmltcG9ydCB7UmFuaywgU2hhcGVNYXB9IGZyb20gJy4uL3R5cGVzJztcblxuZXhwb3J0IGNvbnN0IGZ1c2VkQmF0Y2hOb3JtR3JhZENvbmZpZzogR3JhZENvbmZpZyA9IHtcbiAga2VybmVsTmFtZTogRnVzZWRCYXRjaE5vcm0sXG4gIGlucHV0c1RvU2F2ZTogWyd4JywgJ21lYW4nLCAndmFyaWFuY2UnLCAnc2NhbGUnXSxcbiAgZ3JhZEZ1bmM6IDxSIGV4dGVuZHMgUmFuaz4oXG4gICAgICBkeTogVGVuc29yLCBzYXZlZDogVGVuc29yW10sIGF0dHJzOiBOYW1lZEF0dHJNYXApID0+IHtcbiAgICBjb25zdCB7dmFyaWFuY2VFcHNpbG9ufSA9IGF0dHJzIGFzIHt9IGFzIEZ1c2VkQmF0Y2hOb3JtQXR0cnM7XG4gICAgY29uc3QgW3gsIG1lYW4sIHZhcmlhbmNlLCBzY2FsZV0gPSBzYXZlZDtcblxuICAgIGNvbnN0IHNjYWxlVmFsdWUgPSBzY2FsZSA9PSBudWxsID8gc2NhbGFyKDEpIDogc2NhbGU7XG4gICAgY29uc3QgcmVkdWN0aW9uQXhlcyA9IGdldFJlZHVjdGlvbkF4ZXMobWVhbi5zaGFwZSwgeC5zaGFwZSk7XG4gICAgY29uc3QgdGlsZVNoYXBlOiBudW1iZXJbXSA9IFtdO1xuICAgIGlmIChtZWFuLnJhbmsgPT09IDEpIHtcbiAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgeC5zaGFwZS5sZW5ndGggLSAxOyArK2kpIHtcbiAgICAgICAgdGlsZVNoYXBlLnB1c2goeC5zaGFwZVtpXSk7XG4gICAgICB9XG4gICAgICB0aWxlU2hhcGUucHVzaCgxKTtcbiAgICB9XG5cbiAgICBjb25zdCB4TWludXNNZWFuID0gc3ViKHgsIG1lYW4pO1xuICAgIGNvbnN0IGR5VGltZXNTY2FsZVZhbHVlID0gbXVsKGR5LCBzY2FsZVZhbHVlKTtcbiAgICBjb25zdCBvbmVPdmVyU3FydFZhcmlhbmNlID0gcnNxcnQoYWRkKHZhcmlhbmNlLCBzY2FsYXIodmFyaWFuY2VFcHNpbG9uKSkpO1xuICAgIGNvbnN0IG1pbnVzSGFsZlJDdWJlID0gbXVsKFxuICAgICAgICBtdWwobXVsKG9uZU92ZXJTcXJ0VmFyaWFuY2UsIG9uZU92ZXJTcXJ0VmFyaWFuY2UpLCBvbmVPdmVyU3FydFZhcmlhbmNlKSxcbiAgICAgICAgc2NhbGFyKC0wLjUpKTtcblxuICAgIGNvbnN0IGRlclggPSAoKSA9PiB7XG4gICAgICBpZiAobWVhbi5yYW5rID09PSAxKSB7XG4gICAgICAgIHJldHVybiByZXNoYXBlKFxuICAgICAgICAgICAgbXVsKG11bChkeSxcbiAgICAgICAgICAgICAgICAgICAgdGlsZShcbiAgICAgICAgICAgICAgICAgICAgICAgIHJlc2hhcGUob25lT3ZlclNxcnRWYXJpYW5jZSwgWzEsIDEsIDEsIG1lYW4uc2hhcGVbMF1dKSxcbiAgICAgICAgICAgICAgICAgICAgICAgIHRpbGVTaGFwZSkpLFxuICAgICAgICAgICAgICAgIHNjYWxlVmFsdWUpLFxuICAgICAgICAgICAgeC5zaGFwZSk7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICByZXR1cm4gcmVzaGFwZShtdWwobXVsKGR5LCBvbmVPdmVyU3FydFZhcmlhbmNlKSwgc2NhbGVWYWx1ZSksIHguc2hhcGUpO1xuICAgICAgfVxuICAgIH07XG4gICAgY29uc3QgZGVyTWVhbiA9ICgpID0+IHtcbiAgICAgIGxldCBtZWFuRGVyID1cbiAgICAgICAgICBtdWwobXVsKG9uZU92ZXJTcXJ0VmFyaWFuY2UsIHNjYWxhcigtMSkpLCBkeVRpbWVzU2NhbGVWYWx1ZSk7XG4gICAgICBpZiAobWVhbi5yYW5rID09PSAxKSB7XG4gICAgICAgIG1lYW5EZXIgPSBzdW0obWVhbkRlciwgcmVkdWN0aW9uQXhlcyk7XG4gICAgICB9XG4gICAgICByZXR1cm4gcmVzaGFwZShtZWFuRGVyLCBtZWFuLnNoYXBlIGFzIFNoYXBlTWFwW1JdKTtcbiAgICB9O1xuICAgIGNvbnN0IGRlclZhcmlhbmNlID0gKCkgPT4ge1xuICAgICAgbGV0IHZhcmlhbmNlRGVyID0gbXVsKG11bChtaW51c0hhbGZSQ3ViZSwgeE1pbnVzTWVhbiksIGR5VGltZXNTY2FsZVZhbHVlKTtcblxuICAgICAgaWYgKG1lYW4ucmFuayA9PT0gMSkge1xuICAgICAgICB2YXJpYW5jZURlciA9IHN1bSh2YXJpYW5jZURlciwgcmVkdWN0aW9uQXhlcyk7XG4gICAgICB9XG4gICAgICByZXR1cm4gcmVzaGFwZSh2YXJpYW5jZURlciwgbWVhbi5zaGFwZSBhcyBTaGFwZU1hcFtSXSk7XG4gICAgfTtcbiAgICBjb25zdCBkZXJTY2FsZSA9ICgpID0+IHtcbiAgICAgIGNvbnN0IHhNaW51c01lYW4yVGltZXNSc3FydCA9IG11bCh4TWludXNNZWFuLCBvbmVPdmVyU3FydFZhcmlhbmNlKTtcblxuICAgICAgbGV0IHNjYWxlRGVyID0gbXVsKGR5LCB4TWludXNNZWFuMlRpbWVzUnNxcnQpO1xuICAgICAgaWYgKG1lYW4ucmFuayA9PT0gMSkge1xuICAgICAgICBzY2FsZURlciA9IHN1bShzY2FsZURlciwgcmVkdWN0aW9uQXhlcyk7XG4gICAgICB9XG4gICAgICByZXR1cm4gcmVzaGFwZShzY2FsZURlciwgbWVhbi5zaGFwZSBhcyBTaGFwZU1hcFtSXSk7XG4gICAgfTtcbiAgICBjb25zdCBkZXJPZmZzZXQgPSAoKSA9PiB7XG4gICAgICBsZXQgb2Zmc2V0RGVyID0gZHk7XG4gICAgICBpZiAobWVhbi5yYW5rID09PSAxKSB7XG4gICAgICAgIG9mZnNldERlciA9IHN1bShvZmZzZXREZXIsIHJlZHVjdGlvbkF4ZXMpO1xuICAgICAgfVxuICAgICAgcmV0dXJuIHJlc2hhcGUob2Zmc2V0RGVyLCBtZWFuLnNoYXBlIGFzIFNoYXBlTWFwW1JdKTtcbiAgICB9O1xuXG4gICAgcmV0dXJuIHtcbiAgICAgIHg6IGRlclgsXG4gICAgICBtZWFuOiBkZXJNZWFuLFxuICAgICAgdmFyaWFuY2U6IGRlclZhcmlhbmNlLFxuICAgICAgc2NhbGU6IGRlclNjYWxlLFxuICAgICAgb2Zmc2V0OiBkZXJPZmZzZXRcbiAgICB9O1xuICB9XG59O1xuIl19","/**\n * @license\n * Copyright 2020 Google LLC. All Rights Reserved.\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n * =============================================================================\n */\nimport { GatherV2 } from '../kernel_names';\nimport { getUndoAxesPermutation } from '../ops/axis_util';\nimport { reshape } from '../ops/reshape';\nimport { transpose } from '../ops/transpose';\nimport { unsortedSegmentSum } from '../ops/unsorted_segment_sum';\nimport { parseAxisParam } from '../util';\nexport const gatherGradConfig = {\n kernelName: GatherV2,\n inputsToSave: ['x', 'indices'],\n gradFunc: (dy, saved, attrs) => {\n const [x, indices] = saved;\n const { axis } = attrs;\n const parsedAxis = parseAxisParam(axis, x.shape)[0];\n const derX = () => {\n const paramsShape = x.shape;\n const indicesSize = indices.size;\n const outerShape = paramsShape.slice(0, parsedAxis);\n const outerDims = outerShape.length;\n const innerShape = paramsShape.slice(axis, paramsShape.length).slice(1);\n const innerDims = innerShape.length;\n const outerAxesIndices = arrayRange(0, outerDims);\n const innerAxesIndices = arrayRange(outerDims + 1, outerDims + 1 + innerDims);\n const valuesShape = arrayConcat([outerShape, [indicesSize], innerShape]);\n const values = reshape(dy, valuesShape);\n const reshapedIndices = reshape(indices, [indicesSize]);\n const transposeDims = arrayConcat([[outerDims], outerAxesIndices, innerAxesIndices]);\n const valuesTranspose = transpose(values, transposeDims);\n let paramsGrad = unsortedSegmentSum(valuesTranspose, reshapedIndices, x.shape[parsedAxis]);\n const invertTransposeDims = getUndoAxesPermutation(transposeDims);\n paramsGrad = transpose(paramsGrad, invertTransposeDims);\n return paramsGrad;\n };\n return { x: derX, indices: () => indices };\n }\n};\nfunction arrayRange(start, stop) {\n const result = [];\n for (let i = start; i < stop; ++i) {\n result.push(i);\n }\n return result;\n}\nfunction arrayConcat(arrays) {\n const result = [];\n for (let i = 0; i < arrays.length; ++i) {\n for (let j = 0; j < arrays[i].length; ++j) {\n result.push(arrays[i][j]);\n }\n }\n return result;\n}\n//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiR2F0aGVyVjJfZ3JhZC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uLy4uL3RmanMtY29yZS9zcmMvZ3JhZGllbnRzL0dhdGhlclYyX2dyYWQudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUE7Ozs7Ozs7Ozs7Ozs7OztHQWVHO0FBRUgsT0FBTyxFQUFDLFFBQVEsRUFBZ0IsTUFBTSxpQkFBaUIsQ0FBQztBQUV4RCxPQUFPLEVBQUMsc0JBQXNCLEVBQUMsTUFBTSxrQkFBa0IsQ0FBQztBQUN4RCxPQUFPLEVBQUMsT0FBTyxFQUFDLE1BQU0sZ0JBQWdCLENBQUM7QUFDdkMsT0FBTyxFQUFDLFNBQVMsRUFBQyxNQUFNLGtCQUFrQixDQUFDO0FBQzNDLE9BQU8sRUFBQyxrQkFBa0IsRUFBQyxNQUFNLDZCQUE2QixDQUFDO0FBRS9ELE9BQU8sRUFBQyxjQUFjLEVBQUMsTUFBTSxTQUFTLENBQUM7QUFFdkMsTUFBTSxDQUFDLE1BQU0sZ0JBQWdCLEdBQWU7SUFDMUMsVUFBVSxFQUFFLFFBQVE7SUFDcEIsWUFBWSxFQUFFLENBQUMsR0FBRyxFQUFFLFNBQVMsQ0FBQztJQUM5QixRQUFRLEVBQUUsQ0FBQyxFQUFVLEVBQUUsS0FBZSxFQUFFLEtBQW1CLEVBQUUsRUFBRTtRQUM3RCxNQUFNLENBQUMsQ0FBQyxFQUFFLE9BQU8sQ0FBQyxHQUFHLEtBQUssQ0FBQztRQUMzQixNQUFNLEVBQUMsSUFBSSxFQUFDLEdBQUcsS0FBNEIsQ0FBQztRQUU1QyxNQUFNLFVBQVUsR0FBRyxjQUFjLENBQUMsSUFBSSxFQUFFLENBQUMsQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQztRQUVwRCxNQUFNLElBQUksR0FBRyxHQUFHLEVBQUU7WUFDaEIsTUFBTSxXQUFXLEdBQUcsQ0FBQyxDQUFDLEtBQUssQ0FBQztZQUM1QixNQUFNLFdBQVcsR0FBRyxPQUFPLENBQUMsSUFBSSxDQUFDO1lBRWpDLE1BQU0sVUFBVSxHQUFHLFdBQVcsQ0FBQyxLQUFLLENBQUMsQ0FBQyxFQUFFLFVBQVUsQ0FBQyxDQUFDO1lBQ3BELE1BQU0sU0FBUyxHQUFHLFVBQVUsQ0FBQyxNQUFNLENBQUM7WUFDcEMsTUFBTSxVQUFVLEdBQUcsV0FBVyxDQUFDLEtBQUssQ0FBQyxJQUFJLEVBQUUsV0FBVyxDQUFDLE1BQU0sQ0FBQyxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUMsQ0FBQztZQUN4RSxNQUFNLFNBQVMsR0FBRyxVQUFVLENBQUMsTUFBTSxDQUFDO1lBRXBDLE1BQU0sZ0JBQWdCLEdBQUcsVUFBVSxDQUFDLENBQUMsRUFBRSxTQUFTLENBQUMsQ0FBQztZQUNsRCxNQUFNLGdCQUFnQixHQUNsQixVQUFVLENBQUMsU0FBUyxHQUFHLENBQUMsRUFBRSxTQUFTLEdBQUcsQ0FBQyxHQUFHLFNBQVMsQ0FBQyxDQUFDO1lBRXpELE1BQU0sV0FBVyxHQUFHLFdBQVcsQ0FBQyxDQUFDLFVBQVUsRUFBRSxDQUFDLFdBQVcsQ0FBQyxFQUFFLFVBQVUsQ0FBQyxDQUFDLENBQUM7WUFFekUsTUFBTSxNQUFNLEdBQUcsT0FBTyxDQUFDLEVBQUUsRUFBRSxXQUFXLENBQUMsQ0FBQztZQUN4QyxNQUFNLGVBQWUsR0FBRyxPQUFPLENBQUMsT0FBTyxFQUFFLENBQUMsV0FBVyxDQUFDLENBQUMsQ0FBQztZQUV4RCxNQUFNLGFBQWEsR0FDZixXQUFXLENBQUMsQ0FBQyxDQUFDLFNBQVMsQ0FBQyxFQUFFLGdCQUFnQixFQUFFLGdCQUFnQixDQUFDLENBQUMsQ0FBQztZQUNuRSxNQUFNLGVBQWUsR0FBRyxTQUFTLENBQUMsTUFBTSxFQUFFLGFBQWEsQ0FBQyxDQUFDO1lBQ3pELElBQUksVUFBVSxHQUFHLGtCQUFrQixDQUMvQixlQUFlLEVBQUUsZUFBMkIsRUFBRSxDQUFDLENBQUMsS0FBSyxDQUFDLFVBQVUsQ0FBQyxDQUFDLENBQUM7WUFFdkUsTUFBTSxtQkFBbUIsR0FBRyxzQkFBc0IsQ0FBQyxhQUFhLENBQUMsQ0FBQztZQUNsRSxVQUFVLEdBQUcsU0FBUyxDQUFDLFVBQVUsRUFBRSxtQkFBbUIsQ0FBQyxDQUFDO1lBRXhELE9BQU8sVUFBVSxDQUFDO1FBQ3BCLENBQUMsQ0FBQztRQUNGLE9BQU8sRUFBQyxDQUFDLEVBQUUsSUFBSSxFQUFFLE9BQU8sRUFBRSxHQUFHLEVBQUUsQ0FBQyxPQUFPLEVBQUMsQ0FBQztJQUMzQyxDQUFDO0NBQ0YsQ0FBQztBQUVGLFNBQVMsVUFBVSxDQUFDLEtBQWEsRUFBRSxJQUFZO0lBQzdDLE1BQU0sTUFBTSxHQUFHLEVBQUUsQ0FBQztJQUNsQixLQUFLLElBQUksQ0FBQyxHQUFHLEtBQUssRUFBRSxDQUFDLEdBQUcsSUFBSSxFQUFFLEVBQUUsQ0FBQyxFQUFFO1FBQ2pDLE1BQU0sQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUM7S0FDaEI7SUFDRCxPQUFPLE1BQU0sQ0FBQztBQUNoQixDQUFDO0FBRUQsU0FBUyxXQUFXLENBQUMsTUFBa0I7SUFDckMsTUFBTSxNQUFNLEdBQUcsRUFBRSxDQUFDO0lBQ2xCLEtBQUssSUFBSSxDQUFDLEdBQUcsQ0FBQyxFQUFFLENBQUMsR0FBRyxNQUFNLENBQUMsTUFBTSxFQUFFLEVBQUUsQ0FBQyxFQUFFO1FBQ3RDLEtBQUssSUFBSSxDQUFDLEdBQUcsQ0FBQyxFQUFFLENBQUMsR0FBRyxNQUFNLENBQUMsQ0FBQyxDQUFDLENBQUMsTUFBTSxFQUFFLEVBQUUsQ0FBQyxFQUFFO1lBQ3pDLE1BQU0sQ0FBQyxJQUFJLENBQUMsTUFBTSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUM7U0FDM0I7S0FDRjtJQUNELE9BQU8sTUFBTSxDQUFDO0FBQ2hCLENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyIvKipcbiAqIEBsaWNlbnNlXG4gKiBDb3B5cmlnaHQgMjAyMCBHb29nbGUgTExDLiBBbGwgUmlnaHRzIFJlc2VydmVkLlxuICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlIFwiTGljZW5zZVwiKTtcbiAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS5cbiAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdFxuICpcbiAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMFxuICpcbiAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmVcbiAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuIFwiQVMgSVNcIiBCQVNJUyxcbiAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLlxuICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZFxuICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuXG4gKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuICovXG5cbmltcG9ydCB7R2F0aGVyVjIsIEdhdGhlclYyQXR0cnN9IGZyb20gJy4uL2tlcm5lbF9uYW1lcyc7XG5pbXBvcnQge0dyYWRDb25maWcsIE5hbWVkQXR0ck1hcH0gZnJvbSAnLi4va2VybmVsX3JlZ2lzdHJ5JztcbmltcG9ydCB7Z2V0VW5kb0F4ZXNQZXJtdXRhdGlvbn0gZnJvbSAnLi4vb3BzL2F4aXNfdXRpbCc7XG5pbXBvcnQge3Jlc2hhcGV9IGZyb20gJy4uL29wcy9yZXNoYXBlJztcbmltcG9ydCB7dHJhbnNwb3NlfSBmcm9tICcuLi9vcHMvdHJhbnNwb3NlJztcbmltcG9ydCB7dW5zb3J0ZWRTZWdtZW50U3VtfSBmcm9tICcuLi9vcHMvdW5zb3J0ZWRfc2VnbWVudF9zdW0nO1xuaW1wb3J0IHtUZW5zb3IsIFRlbnNvcjFEfSBmcm9tICcuLi90ZW5zb3InO1xuaW1wb3J0IHtwYXJzZUF4aXNQYXJhbX0gZnJvbSAnLi4vdXRpbCc7XG5cbmV4cG9ydCBjb25zdCBnYXRoZXJHcmFkQ29uZmlnOiBHcmFkQ29uZmlnID0ge1xuICBrZXJuZWxOYW1lOiBHYXRoZXJWMixcbiAgaW5wdXRzVG9TYXZlOiBbJ3gnLCAnaW5kaWNlcyddLFxuICBncmFkRnVuYzogKGR5OiBUZW5zb3IsIHNhdmVkOiBUZW5zb3JbXSwgYXR0cnM6IE5hbWVkQXR0ck1hcCkgPT4ge1xuICAgIGNvbnN0IFt4LCBpbmRpY2VzXSA9IHNhdmVkO1xuICAgIGNvbnN0IHtheGlzfSA9IGF0dHJzIGFzIHt9IGFzIEdhdGhlclYyQXR0cnM7XG5cbiAgICBjb25zdCBwYXJzZWRBeGlzID0gcGFyc2VBeGlzUGFyYW0oYXhpcywgeC5zaGFwZSlbMF07XG5cbiAgICBjb25zdCBkZXJYID0gKCkgPT4ge1xuICAgICAgY29uc3QgcGFyYW1zU2hhcGUgPSB4LnNoYXBlO1xuICAgICAgY29uc3QgaW5kaWNlc1NpemUgPSBpbmRpY2VzLnNpemU7XG5cbiAgICAgIGNvbnN0IG91dGVyU2hhcGUgPSBwYXJhbXNTaGFwZS5zbGljZSgwLCBwYXJzZWRBeGlzKTtcbiAgICAgIGNvbnN0IG91dGVyRGltcyA9IG91dGVyU2hhcGUubGVuZ3RoO1xuICAgICAgY29uc3QgaW5uZXJTaGFwZSA9IHBhcmFtc1NoYXBlLnNsaWNlKGF4aXMsIHBhcmFtc1NoYXBlLmxlbmd0aCkuc2xpY2UoMSk7XG4gICAgICBjb25zdCBpbm5lckRpbXMgPSBpbm5lclNoYXBlLmxlbmd0aDtcblxuICAgICAgY29uc3Qgb3V0ZXJBeGVzSW5kaWNlcyA9IGFycmF5UmFuZ2UoMCwgb3V0ZXJEaW1zKTtcbiAgICAgIGNvbnN0IGlubmVyQXhlc0luZGljZXMgPVxuICAgICAgICAgIGFycmF5UmFuZ2Uob3V0ZXJEaW1zICsgMSwgb3V0ZXJEaW1zICsgMSArIGlubmVyRGltcyk7XG5cbiAgICAgIGNvbnN0IHZhbHVlc1NoYXBlID0gYXJyYXlDb25jYXQoW291dGVyU2hhcGUsIFtpbmRpY2VzU2l6ZV0sIGlubmVyU2hhcGVdKTtcblxuICAgICAgY29uc3QgdmFsdWVzID0gcmVzaGFwZShkeSwgdmFsdWVzU2hhcGUpO1xuICAgICAgY29uc3QgcmVzaGFwZWRJbmRpY2VzID0gcmVzaGFwZShpbmRpY2VzLCBbaW5kaWNlc1NpemVdKTtcblxuICAgICAgY29uc3QgdHJhbnNwb3NlRGltcyA9XG4gICAgICAgICAgYXJyYXlDb25jYXQoW1tvdXRlckRpbXNdLCBvdXRlckF4ZXNJbmRpY2VzLCBpbm5lckF4ZXNJbmRpY2VzXSk7XG4gICAgICBjb25zdCB2YWx1ZXNUcmFuc3Bvc2UgPSB0cmFuc3Bvc2UodmFsdWVzLCB0cmFuc3Bvc2VEaW1zKTtcbiAgICAgIGxldCBwYXJhbXNHcmFkID0gdW5zb3J0ZWRTZWdtZW50U3VtKFxuICAgICAgICAgIHZhbHVlc1RyYW5zcG9zZSwgcmVzaGFwZWRJbmRpY2VzIGFzIFRlbnNvcjFELCB4LnNoYXBlW3BhcnNlZEF4aXNdKTtcblxuICAgICAgY29uc3QgaW52ZXJ0VHJhbnNwb3NlRGltcyA9IGdldFVuZG9BeGVzUGVybXV0YXRpb24odHJhbnNwb3NlRGltcyk7XG4gICAgICBwYXJhbXNHcmFkID0gdHJhbnNwb3NlKHBhcmFtc0dyYWQsIGludmVydFRyYW5zcG9zZURpbXMpO1xuXG4gICAgICByZXR1cm4gcGFyYW1zR3JhZDtcbiAgICB9O1xuICAgIHJldHVybiB7eDogZGVyWCwgaW5kaWNlczogKCkgPT4gaW5kaWNlc307XG4gIH1cbn07XG5cbmZ1bmN0aW9uIGFycmF5UmFuZ2Uoc3RhcnQ6IG51bWJlciwgc3RvcDogbnVtYmVyKTogbnVtYmVyW10ge1xuICBjb25zdCByZXN1bHQgPSBbXTtcbiAgZm9yIChsZXQgaSA9IHN0YXJ0OyBpIDwgc3RvcDsgKytpKSB7XG4gICAgcmVzdWx0LnB1c2goaSk7XG4gIH1cbiAgcmV0dXJuIHJlc3VsdDtcbn1cblxuZnVuY3Rpb24gYXJyYXlDb25jYXQoYXJyYXlzOiBudW1iZXJbXVtdKTogbnVtYmVyW10ge1xuICBjb25zdCByZXN1bHQgPSBbXTtcbiAgZm9yIChsZXQgaSA9IDA7IGkgPCBhcnJheXMubGVuZ3RoOyArK2kpIHtcbiAgICBmb3IgKGxldCBqID0gMDsgaiA8IGFycmF5c1tpXS5sZW5ndGg7ICsraikge1xuICAgICAgcmVzdWx0LnB1c2goYXJyYXlzW2ldW2pdKTtcbiAgICB9XG4gIH1cbiAgcmV0dXJuIHJlc3VsdDtcbn1cbiJdfQ==","/**\n * @license\n * Copyright 2020 Google LLC. All Rights Reserved.\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n * =============================================================================\n */\nimport { GreaterEqual } from '../kernel_names';\nimport { zerosLike } from '../ops/zeros_like';\nexport const greaterEqualGradConfig = {\n kernelName: GreaterEqual,\n inputsToSave: ['a', 'b'],\n gradFunc: (dy, saved) => {\n const [a, b] = saved;\n return { a: () => zerosLike(a), b: () => zerosLike(b) };\n }\n};\n//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiR3JlYXRlckVxdWFsX2dyYWQuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi8uLi90ZmpzLWNvcmUvc3JjL2dyYWRpZW50cy9HcmVhdGVyRXF1YWxfZ3JhZC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQTs7Ozs7Ozs7Ozs7Ozs7O0dBZUc7QUFDSCxPQUFPLEVBQUMsWUFBWSxFQUFDLE1BQU0saUJBQWlCLENBQUM7QUFFN0MsT0FBTyxFQUFDLFNBQVMsRUFBQyxNQUFNLG1CQUFtQixDQUFDO0FBRzVDLE1BQU0sQ0FBQyxNQUFNLHNCQUFzQixHQUFlO0lBQ2hELFVBQVUsRUFBRSxZQUFZO0lBQ3hCLFlBQVksRUFBRSxDQUFDLEdBQUcsRUFBRSxHQUFHLENBQUM7SUFDeEIsUUFBUSxFQUFFLENBQUMsRUFBVSxFQUFFLEtBQWUsRUFBRSxFQUFFO1FBQ3hDLE1BQU0sQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLEdBQUcsS0FBSyxDQUFDO1FBQ3JCLE9BQU8sRUFBQyxDQUFDLEVBQUUsR0FBRyxFQUFFLENBQUMsU0FBUyxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsRUFBRSxHQUFHLEVBQUUsQ0FBQyxTQUFTLENBQUMsQ0FBQyxDQUFDLEVBQUMsQ0FBQztJQUN4RCxDQUFDO0NBQ0YsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbIi8qKlxuICogQGxpY2Vuc2VcbiAqIENvcHlyaWdodCAyMDIwIEdvb2dsZSBMTEMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuXG4gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgXCJMaWNlbnNlXCIpO1xuICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLlxuICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0XG4gKlxuICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wXG4gKlxuICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZVxuICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gXCJBUyBJU1wiIEJBU0lTLFxuICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuXG4gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kXG4gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS5cbiAqID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4gKi9cbmltcG9ydCB7R3JlYXRlckVxdWFsfSBmcm9tICcuLi9rZXJuZWxfbmFtZXMnO1xuaW1wb3J0IHtHcmFkQ29uZmlnfSBmcm9tICcuLi9rZXJuZWxfcmVnaXN0cnknO1xuaW1wb3J0IHt6ZXJvc0xpa2V9IGZyb20gJy4uL29wcy96ZXJvc19saWtlJztcbmltcG9ydCB7VGVuc29yfSBmcm9tICcuLi90ZW5zb3InO1xuXG5leHBvcnQgY29uc3QgZ3JlYXRlckVxdWFsR3JhZENvbmZpZzogR3JhZENvbmZpZyA9IHtcbiAga2VybmVsTmFtZTogR3JlYXRlckVxdWFsLFxuICBpbnB1dHNUb1NhdmU6IFsnYScsICdiJ10sXG4gIGdyYWRGdW5jOiAoZHk6IFRlbnNvciwgc2F2ZWQ6IFRlbnNvcltdKSA9PiB7XG4gICAgY29uc3QgW2EsIGJdID0gc2F2ZWQ7XG4gICAgcmV0dXJuIHthOiAoKSA9PiB6ZXJvc0xpa2UoYSksIGI6ICgpID0+IHplcm9zTGlrZShiKX07XG4gIH1cbn07XG4iXX0=","/**\n * @license\n * Copyright 2020 Google LLC. All Rights Reserved.\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n * =============================================================================\n */\nimport { Identity } from '../kernel_names';\nimport { cast } from '../ops/cast';\nexport const identityGradConfig = {\n kernelName: Identity,\n gradFunc: (dy) => {\n return { x: () => cast(dy, 'float32') };\n }\n};\n//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiSWRlbnRpdHlfZ3JhZC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uLy4uL3RmanMtY29yZS9zcmMvZ3JhZGllbnRzL0lkZW50aXR5X2dyYWQudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUE7Ozs7Ozs7Ozs7Ozs7OztHQWVHO0FBRUgsT0FBTyxFQUFDLFFBQVEsRUFBQyxNQUFNLGlCQUFpQixDQUFDO0FBRXpDLE9BQU8sRUFBQyxJQUFJLEVBQUMsTUFBTSxhQUFhLENBQUM7QUFHakMsTUFBTSxDQUFDLE1BQU0sa0JBQWtCLEdBQWU7SUFDNUMsVUFBVSxFQUFFLFFBQVE7SUFDcEIsUUFBUSxFQUFFLENBQUMsRUFBVSxFQUFFLEVBQUU7UUFDdkIsT0FBTyxFQUFDLENBQUMsRUFBRSxHQUFHLEVBQUUsQ0FBQyxJQUFJLENBQUMsRUFBRSxFQUFFLFNBQVMsQ0FBQyxFQUFDLENBQUM7SUFDeEMsQ0FBQztDQUNGLENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyIvKipcbiAqIEBsaWNlbnNlXG4gKiBDb3B5cmlnaHQgMjAyMCBHb29nbGUgTExDLiBBbGwgUmlnaHRzIFJlc2VydmVkLlxuICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlIFwiTGljZW5zZVwiKTtcbiAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS5cbiAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdFxuICpcbiAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMFxuICpcbiAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmVcbiAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuIFwiQVMgSVNcIiBCQVNJUyxcbiAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLlxuICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZFxuICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuXG4gKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuICovXG5cbmltcG9ydCB7SWRlbnRpdHl9IGZyb20gJy4uL2tlcm5lbF9uYW1lcyc7XG5pbXBvcnQge0dyYWRDb25maWd9IGZyb20gJy4uL2tlcm5lbF9yZWdpc3RyeSc7XG5pbXBvcnQge2Nhc3R9IGZyb20gJy4uL29wcy9jYXN0JztcbmltcG9ydCB7VGVuc29yfSBmcm9tICcuLi90ZW5zb3InO1xuXG5leHBvcnQgY29uc3QgaWRlbnRpdHlHcmFkQ29uZmlnOiBHcmFkQ29uZmlnID0ge1xuICBrZXJuZWxOYW1lOiBJZGVudGl0eSxcbiAgZ3JhZEZ1bmM6IChkeTogVGVuc29yKSA9PiB7XG4gICAgcmV0dXJuIHt4OiAoKSA9PiBjYXN0KGR5LCAnZmxvYXQzMicpfTtcbiAgfVxufTtcbiJdfQ==","/**\n * @license\n * Copyright 2020 Google LLC. All Rights Reserved.\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n * =============================================================================\n */\nimport { IsFinite } from '../kernel_names';\nimport { zerosLike } from '../ops/zeros_like';\nexport const isFiniteGradConfig = {\n kernelName: IsFinite,\n gradFunc: (dy) => {\n // TODO(nsthorat): Let gradients be null for cases where we want to stop\n // backpropgation.\n return { x: () => zerosLike(dy) };\n }\n};\n//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiSXNGaW5pdGVfZ3JhZC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uLy4uL3RmanMtY29yZS9zcmMvZ3JhZGllbnRzL0lzRmluaXRlX2dyYWQudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUE7Ozs7Ozs7Ozs7Ozs7OztHQWVHO0FBRUgsT0FBTyxFQUFDLFFBQVEsRUFBQyxNQUFNLGlCQUFpQixDQUFDO0FBRXpDLE9BQU8sRUFBQyxTQUFTLEVBQUMsTUFBTSxtQkFBbUIsQ0FBQztBQUc1QyxNQUFNLENBQUMsTUFBTSxrQkFBa0IsR0FBZTtJQUM1QyxVQUFVLEVBQUUsUUFBUTtJQUNwQixRQUFRLEVBQUUsQ0FBQyxFQUFVLEVBQUUsRUFBRTtRQUN2Qix3RUFBd0U7UUFDeEUsa0JBQWtCO1FBQ2xCLE9BQU8sRUFBQyxDQUFDLEVBQUUsR0FBRyxFQUFFLENBQUMsU0FBUyxDQUFDLEVBQUUsQ0FBQyxFQUFDLENBQUM7SUFDbEMsQ0FBQztDQUNGLENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyIvKipcbiAqIEBsaWNlbnNlXG4gKiBDb3B5cmlnaHQgMjAyMCBHb29nbGUgTExDLiBBbGwgUmlnaHRzIFJlc2VydmVkLlxuICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlIFwiTGljZW5zZVwiKTtcbiAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS5cbiAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdFxuICpcbiAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMFxuICpcbiAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmVcbiAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuIFwiQVMgSVNcIiBCQVNJUyxcbiAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLlxuICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZFxuICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuXG4gKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuICovXG5cbmltcG9ydCB7SXNGaW5pdGV9IGZyb20gJy4uL2tlcm5lbF9uYW1lcyc7XG5pbXBvcnQge0dyYWRDb25maWd9IGZyb20gJy4uL2tlcm5lbF9yZWdpc3RyeSc7XG5pbXBvcnQge3plcm9zTGlrZX0gZnJvbSAnLi4vb3BzL3plcm9zX2xpa2UnO1xuaW1wb3J0IHtUZW5zb3J9IGZyb20gJy4uL3RlbnNvcic7XG5cbmV4cG9ydCBjb25zdCBpc0Zpbml0ZUdyYWRDb25maWc6IEdyYWRDb25maWcgPSB7XG4gIGtlcm5lbE5hbWU6IElzRmluaXRlLFxuICBncmFkRnVuYzogKGR5OiBUZW5zb3IpID0+IHtcbiAgICAvLyBUT0RPKG5zdGhvcmF0KTogTGV0IGdyYWRpZW50cyBiZSBudWxsIGZvciBjYXNlcyB3aGVyZSB3ZSB3YW50IHRvIHN0b3BcbiAgICAvLyBiYWNrcHJvcGdhdGlvbi5cbiAgICByZXR1cm4ge3g6ICgpID0+IHplcm9zTGlrZShkeSl9O1xuICB9XG59O1xuIl19","/**\n * @license\n * Copyright 2020 Google LLC. All Rights Reserved.\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n * =============================================================================\n */\nimport { IsInf } from '../kernel_names';\nimport { zerosLike } from '../ops/zeros_like';\nexport const isInfGradConfig = {\n kernelName: IsInf,\n gradFunc: (dy) => {\n // TODO(nsthorat): Let gradients be null for cases where we want to stop\n // backpropgation.\n return { x: () => zerosLike(dy) };\n }\n};\n//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiSXNJbmZfZ3JhZC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uLy4uL3RmanMtY29yZS9zcmMvZ3JhZGllbnRzL0lzSW5mX2dyYWQudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQ0E7Ozs7Ozs7Ozs7Ozs7OztHQWVHO0FBRUgsT0FBTyxFQUFDLEtBQUssRUFBQyxNQUFNLGlCQUFpQixDQUFDO0FBRXRDLE9BQU8sRUFBQyxTQUFTLEVBQUMsTUFBTSxtQkFBbUIsQ0FBQztBQUc1QyxNQUFNLENBQUMsTUFBTSxlQUFlLEdBQWU7SUFDekMsVUFBVSxFQUFFLEtBQUs7SUFDakIsUUFBUSxFQUFFLENBQUMsRUFBVSxFQUFFLEVBQUU7UUFDdkIsd0VBQXdFO1FBQ3hFLGtCQUFrQjtRQUNsQixPQUFPLEVBQUMsQ0FBQyxFQUFFLEdBQUcsRUFBRSxDQUFDLFNBQVMsQ0FBQyxFQUFFLENBQUMsRUFBQyxDQUFDO0lBQ2xDLENBQUM7Q0FDRixDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiXG4vKipcbiAqIEBsaWNlbnNlXG4gKiBDb3B5cmlnaHQgMjAyMCBHb29nbGUgTExDLiBBbGwgUmlnaHRzIFJlc2VydmVkLlxuICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlIFwiTGljZW5zZVwiKTtcbiAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS5cbiAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdFxuICpcbiAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMFxuICpcbiAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmVcbiAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuIFwiQVMgSVNcIiBCQVNJUyxcbiAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLlxuICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZFxuICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuXG4gKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuICovXG5cbmltcG9ydCB7SXNJbmZ9IGZyb20gJy4uL2tlcm5lbF9uYW1lcyc7XG5pbXBvcnQge0dyYWRDb25maWd9IGZyb20gJy4uL2tlcm5lbF9yZWdpc3RyeSc7XG5pbXBvcnQge3plcm9zTGlrZX0gZnJvbSAnLi4vb3BzL3plcm9zX2xpa2UnO1xuaW1wb3J0IHtUZW5zb3J9IGZyb20gJy4uL3RlbnNvcic7XG5cbmV4cG9ydCBjb25zdCBpc0luZkdyYWRDb25maWc6IEdyYWRDb25maWcgPSB7XG4gIGtlcm5lbE5hbWU6IElzSW5mLFxuICBncmFkRnVuYzogKGR5OiBUZW5zb3IpID0+IHtcbiAgICAvLyBUT0RPKG5zdGhvcmF0KTogTGV0IGdyYWRpZW50cyBiZSBudWxsIGZvciBjYXNlcyB3aGVyZSB3ZSB3YW50IHRvIHN0b3BcbiAgICAvLyBiYWNrcHJvcGdhdGlvbi5cbiAgICByZXR1cm4ge3g6ICgpID0+IHplcm9zTGlrZShkeSl9O1xuICB9XG59O1xuIl19","/**\n * @license\n * Copyright 2020 Google LLC. All Rights Reserved.\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n * =============================================================================\n */\nimport { IsNan } from '../kernel_names';\nimport { zerosLike } from '../ops/zeros_like';\nexport const isNanGradConfig = {\n kernelName: IsNan,\n gradFunc: (dy) => {\n // TODO(nsthorat): Let gradients be null for cases where we want to stop\n // backpropgation.\n return { x: () => zerosLike(dy) };\n }\n};\n//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiSXNOYW5fZ3JhZC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uLy4uL3RmanMtY29yZS9zcmMvZ3JhZGllbnRzL0lzTmFuX2dyYWQudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUE7Ozs7Ozs7Ozs7Ozs7OztHQWVHO0FBRUgsT0FBTyxFQUFDLEtBQUssRUFBQyxNQUFNLGlCQUFpQixDQUFDO0FBRXRDLE9BQU8sRUFBQyxTQUFTLEVBQUMsTUFBTSxtQkFBbUIsQ0FBQztBQUc1QyxNQUFNLENBQUMsTUFBTSxlQUFlLEdBQWU7SUFDekMsVUFBVSxFQUFFLEtBQUs7SUFDakIsUUFBUSxFQUFFLENBQUMsRUFBVSxFQUFFLEVBQUU7UUFDdkIsd0VBQXdFO1FBQ3hFLGtCQUFrQjtRQUNsQixPQUFPLEVBQUMsQ0FBQyxFQUFFLEdBQUcsRUFBRSxDQUFDLFNBQVMsQ0FBQyxFQUFFLENBQUMsRUFBQyxDQUFDO0lBQ2xDLENBQUM7Q0FDRixDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiLyoqXG4gKiBAbGljZW5zZVxuICogQ29weXJpZ2h0IDIwMjAgR29vZ2xlIExMQy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC5cbiAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSBcIkxpY2Vuc2VcIik7XG4gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuXG4gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXRcbiAqXG4gKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjBcbiAqXG4gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlXG4gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiBcIkFTIElTXCIgQkFTSVMsXG4gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC5cbiAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmRcbiAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLlxuICogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbiAqL1xuXG5pbXBvcnQge0lzTmFufSBmcm9tICcuLi9rZXJuZWxfbmFtZXMnO1xuaW1wb3J0IHtHcmFkQ29uZmlnfSBmcm9tICcuLi9rZXJuZWxfcmVnaXN0cnknO1xuaW1wb3J0IHt6ZXJvc0xpa2V9IGZyb20gJy4uL29wcy96ZXJvc19saWtlJztcbmltcG9ydCB7VGVuc29yfSBmcm9tICcuLi90ZW5zb3InO1xuXG5leHBvcnQgY29uc3QgaXNOYW5HcmFkQ29uZmlnOiBHcmFkQ29uZmlnID0ge1xuICBrZXJuZWxOYW1lOiBJc05hbixcbiAgZ3JhZEZ1bmM6IChkeTogVGVuc29yKSA9PiB7XG4gICAgLy8gVE9ETyhuc3Rob3JhdCk6IExldCBncmFkaWVudHMgYmUgbnVsbCBmb3IgY2FzZXMgd2hlcmUgd2Ugd2FudCB0byBzdG9wXG4gICAgLy8gYmFja3Byb3BnYXRpb24uXG4gICAgcmV0dXJuIHt4OiAoKSA9PiB6ZXJvc0xpa2UoZHkpfTtcbiAgfVxufTtcbiJdfQ==","/**\n * @license\n * Copyright 2020 Google LLC. All Rights Reserved.\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n * =============================================================================\n */\nimport { LeakyRelu } from '../kernel_names';\nimport { greater } from '../ops/greater';\nimport { mul } from '../ops/mul';\nimport { where } from '../ops/where';\nexport const leakyReluGradConfig = {\n kernelName: LeakyRelu,\n inputsToSave: ['x'],\n gradFunc: (dy, saved, attrs) => {\n const [x] = saved;\n const { alpha } = attrs;\n const mask = greater(x, 0);\n // Returns `gradients * (features > 0) + alpha * gradients * (features <=\n // 0)`.\n return { x: () => where(mask, dy, mul(dy, alpha)) };\n }\n};\n//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiTGVha3lSZWx1X2dyYWQuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi8uLi90ZmpzLWNvcmUvc3JjL2dyYWRpZW50cy9MZWFreVJlbHVfZ3JhZC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQTs7Ozs7Ozs7Ozs7Ozs7O0dBZUc7QUFDSCxPQUFPLEVBQUMsU0FBUyxFQUFpQixNQUFNLGlCQUFpQixDQUFDO0FBRTFELE9BQU8sRUFBQyxPQUFPLEVBQUMsTUFBTSxnQkFBZ0IsQ0FBQztBQUN2QyxPQUFPLEVBQUMsR0FBRyxFQUFDLE1BQU0sWUFBWSxDQUFDO0FBQy9CLE9BQU8sRUFBQyxLQUFLLEVBQUMsTUFBTSxjQUFjLENBQUM7QUFHbkMsTUFBTSxDQUFDLE1BQU0sbUJBQW1CLEdBQWU7SUFDN0MsVUFBVSxFQUFFLFNBQVM7SUFDckIsWUFBWSxFQUFFLENBQUMsR0FBRyxDQUFDO0lBQ25CLFFBQVEsRUFBRSxDQUFDLEVBQVUsRUFBRSxLQUFlLEVBQUUsS0FBbUIsRUFBRSxFQUFFO1FBQzdELE1BQU0sQ0FBQyxDQUFDLENBQUMsR0FBRyxLQUFLLENBQUM7UUFDbEIsTUFBTSxFQUFDLEtBQUssRUFBQyxHQUFHLEtBQTZCLENBQUM7UUFDOUMsTUFBTSxJQUFJLEdBQUcsT0FBTyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQztRQUUzQix5RUFBeUU7UUFDekUsT0FBTztRQUNQLE9BQU8sRUFBQyxDQUFDLEVBQUUsR0FBRyxFQUFFLENBQUMsS0FBSyxDQUFDLElBQUksRUFBRSxFQUFFLEVBQUUsR0FBRyxDQUFDLEVBQUUsRUFBRSxLQUFLLENBQUMsQ0FBQyxFQUFDLENBQUM7SUFDcEQsQ0FBQztDQUNGLENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyIvKipcbiAqIEBsaWNlbnNlXG4gKiBDb3B5cmlnaHQgMjAyMCBHb29nbGUgTExDLiBBbGwgUmlnaHRzIFJlc2VydmVkLlxuICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlIFwiTGljZW5zZVwiKTtcbiAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS5cbiAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdFxuICpcbiAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMFxuICpcbiAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmVcbiAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuIFwiQVMgSVNcIiBCQVNJUyxcbiAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLlxuICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZFxuICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuXG4gKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuICovXG5pbXBvcnQge0xlYWt5UmVsdSwgTGVha3lSZWx1QXR0cnN9IGZyb20gJy4uL2tlcm5lbF9uYW1lcyc7XG5pbXBvcnQge0dyYWRDb25maWcsIE5hbWVkQXR0ck1hcH0gZnJvbSAnLi4va2VybmVsX3JlZ2lzdHJ5JztcbmltcG9ydCB7Z3JlYXRlcn0gZnJvbSAnLi4vb3BzL2dyZWF0ZXInO1xuaW1wb3J0IHttdWx9IGZyb20gJy4uL29wcy9tdWwnO1xuaW1wb3J0IHt3aGVyZX0gZnJvbSAnLi4vb3BzL3doZXJlJztcbmltcG9ydCB7VGVuc29yfSBmcm9tICcuLi90ZW5zb3InO1xuXG5leHBvcnQgY29uc3QgbGVha3lSZWx1R3JhZENvbmZpZzogR3JhZENvbmZpZyA9IHtcbiAga2VybmVsTmFtZTogTGVha3lSZWx1LFxuICBpbnB1dHNUb1NhdmU6IFsneCddLFxuICBncmFkRnVuYzogKGR5OiBUZW5zb3IsIHNhdmVkOiBUZW5zb3JbXSwgYXR0cnM6IE5hbWVkQXR0ck1hcCkgPT4ge1xuICAgIGNvbnN0IFt4XSA9IHNhdmVkO1xuICAgIGNvbnN0IHthbHBoYX0gPSBhdHRycyBhcyB7fSBhcyBMZWFreVJlbHVBdHRycztcbiAgICBjb25zdCBtYXNrID0gZ3JlYXRlcih4LCAwKTtcblxuICAgIC8vIFJldHVybnMgYGdyYWRpZW50cyAqIChmZWF0dXJlcyA+IDApICsgYWxwaGEgKiBncmFkaWVudHMgKiAoZmVhdHVyZXMgPD1cbiAgICAvLyAwKWAuXG4gICAgcmV0dXJuIHt4OiAoKSA9PiB3aGVyZShtYXNrLCBkeSwgbXVsKGR5LCBhbHBoYSkpfTtcbiAgfVxufTtcbiJdfQ==","/**\n * @license\n * Copyright 2020 Google LLC. All Rights Reserved.\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n * =============================================================================\n */\nimport { Log1p } from '../kernel_names';\nimport { add } from '../ops/add';\nimport { div } from '../ops/div';\nexport const log1pGradConfig = {\n kernelName: Log1p,\n inputsToSave: ['x'],\n gradFunc: (dy, saved) => {\n const [x] = saved;\n return { x: () => div(dy, add(x, 1)) };\n }\n};\n//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiTG9nMXBfZ3JhZC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uLy4uL3RmanMtY29yZS9zcmMvZ3JhZGllbnRzL0xvZzFwX2dyYWQudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUE7Ozs7Ozs7Ozs7Ozs7OztHQWVHO0FBRUgsT0FBTyxFQUFDLEtBQUssRUFBQyxNQUFNLGlCQUFpQixDQUFDO0FBRXRDLE9BQU8sRUFBQyxHQUFHLEVBQUMsTUFBTSxZQUFZLENBQUM7QUFDL0IsT0FBTyxFQUFDLEdBQUcsRUFBQyxNQUFNLFlBQVksQ0FBQztBQUcvQixNQUFNLENBQUMsTUFBTSxlQUFlLEdBQWU7SUFDekMsVUFBVSxFQUFFLEtBQUs7SUFDakIsWUFBWSxFQUFFLENBQUMsR0FBRyxDQUFDO0lBQ25CLFFBQVEsRUFBRSxDQUFDLEVBQVUsRUFBRSxLQUFlLEVBQUUsRUFBRTtRQUN4QyxNQUFNLENBQUMsQ0FBQyxDQUFDLEdBQUcsS0FBSyxDQUFDO1FBQ2xCLE9BQU8sRUFBQyxDQUFDLEVBQUUsR0FBRyxFQUFFLENBQUMsR0FBRyxDQUFDLEVBQUUsRUFBRSxHQUFHLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLEVBQUMsQ0FBQztJQUN2QyxDQUFDO0NBQ0YsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbIi8qKlxuICogQGxpY2Vuc2VcbiAqIENvcHlyaWdodCAyMDIwIEdvb2dsZSBMTEMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuXG4gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgXCJMaWNlbnNlXCIpO1xuICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLlxuICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0XG4gKlxuICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wXG4gKlxuICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZVxuICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gXCJBUyBJU1wiIEJBU0lTLFxuICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuXG4gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kXG4gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS5cbiAqID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4gKi9cblxuaW1wb3J0IHtMb2cxcH0gZnJvbSAnLi4va2VybmVsX25hbWVzJztcbmltcG9ydCB7R3JhZENvbmZpZ30gZnJvbSAnLi4va2VybmVsX3JlZ2lzdHJ5JztcbmltcG9ydCB7YWRkfSBmcm9tICcuLi9vcHMvYWRkJztcbmltcG9ydCB7ZGl2fSBmcm9tICcuLi9vcHMvZGl2JztcbmltcG9ydCB7VGVuc29yfSBmcm9tICcuLi90ZW5zb3InO1xuXG5leHBvcnQgY29uc3QgbG9nMXBHcmFkQ29uZmlnOiBHcmFkQ29uZmlnID0ge1xuICBrZXJuZWxOYW1lOiBMb2cxcCxcbiAgaW5wdXRzVG9TYXZlOiBbJ3gnXSxcbiAgZ3JhZEZ1bmM6IChkeTogVGVuc29yLCBzYXZlZDogVGVuc29yW10pID0+IHtcbiAgICBjb25zdCBbeF0gPSBzYXZlZDtcbiAgICByZXR1cm4ge3g6ICgpID0+IGRpdihkeSwgYWRkKHgsIDEpKX07XG4gIH1cbn07XG4iXX0=","/**\n * @license\n * Copyright 2020 Google LLC. All Rights Reserved.\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n * =============================================================================\n */\nimport { Log } from '../kernel_names';\nimport { cast } from '../ops/cast';\nimport { div } from '../ops/div';\nexport const logGradConfig = {\n kernelName: Log,\n inputsToSave: ['x'],\n gradFunc: (dy, saved) => {\n const [x] = saved;\n return { x: () => div(dy, cast(x, 'float32')) };\n }\n};\n//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiTG9nX2dyYWQuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi8uLi90ZmpzLWNvcmUvc3JjL2dyYWRpZW50cy9Mb2dfZ3JhZC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQTs7Ozs7Ozs7Ozs7Ozs7O0dBZUc7QUFFSCxPQUFPLEVBQUMsR0FBRyxFQUFDLE1BQU0saUJBQWlCLENBQUM7QUFFcEMsT0FBTyxFQUFDLElBQUksRUFBQyxNQUFNLGFBQWEsQ0FBQztBQUNqQyxPQUFPLEVBQUMsR0FBRyxFQUFDLE1BQU0sWUFBWSxDQUFDO0FBRy9CLE1BQU0sQ0FBQyxNQUFNLGFBQWEsR0FBZTtJQUN2QyxVQUFVLEVBQUUsR0FBRztJQUNmLFlBQVksRUFBRSxDQUFDLEdBQUcsQ0FBQztJQUNuQixRQUFRLEVBQUUsQ0FBQyxFQUFVLEVBQUUsS0FBZSxFQUFFLEVBQUU7UUFDeEMsTUFBTSxDQUFDLENBQUMsQ0FBQyxHQUFHLEtBQUssQ0FBQztRQUNsQixPQUFPLEVBQUMsQ0FBQyxFQUFFLEdBQUcsRUFBRSxDQUFDLEdBQUcsQ0FBQyxFQUFFLEVBQUUsSUFBSSxDQUFDLENBQUMsRUFBRSxTQUFTLENBQUMsQ0FBQyxFQUFDLENBQUM7SUFDaEQsQ0FBQztDQUNGLENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyIvKipcbiAqIEBsaWNlbnNlXG4gKiBDb3B5cmlnaHQgMjAyMCBHb29nbGUgTExDLiBBbGwgUmlnaHRzIFJlc2VydmVkLlxuICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlIFwiTGljZW5zZVwiKTtcbiAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS5cbiAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdFxuICpcbiAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMFxuICpcbiAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmVcbiAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuIFwiQVMgSVNcIiBCQVNJUyxcbiAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLlxuICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZFxuICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuXG4gKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuICovXG5cbmltcG9ydCB7TG9nfSBmcm9tICcuLi9rZXJuZWxfbmFtZXMnO1xuaW1wb3J0IHtHcmFkQ29uZmlnfSBmcm9tICcuLi9rZXJuZWxfcmVnaXN0cnknO1xuaW1wb3J0IHtjYXN0fSBmcm9tICcuLi9vcHMvY2FzdCc7XG5pbXBvcnQge2Rpdn0gZnJvbSAnLi4vb3BzL2Rpdic7XG5pbXBvcnQge1RlbnNvcn0gZnJvbSAnLi4vdGVuc29yJztcblxuZXhwb3J0IGNvbnN0IGxvZ0dyYWRDb25maWc6IEdyYWRDb25maWcgPSB7XG4gIGtlcm5lbE5hbWU6IExvZyxcbiAgaW5wdXRzVG9TYXZlOiBbJ3gnXSxcbiAgZ3JhZEZ1bmM6IChkeTogVGVuc29yLCBzYXZlZDogVGVuc29yW10pID0+IHtcbiAgICBjb25zdCBbeF0gPSBzYXZlZDtcbiAgICByZXR1cm4ge3g6ICgpID0+IGRpdihkeSwgY2FzdCh4LCAnZmxvYXQzMicpKX07XG4gIH1cbn07XG4iXX0=","/**\n * @license\n * Copyright 2020 Google LLC. All Rights Reserved.\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n * =============================================================================\n */\nimport { LogSoftmax } from '../kernel_names';\nimport { exp } from '../ops/exp';\nimport { mul } from '../ops/mul';\nimport { sub } from '../ops/sub';\nimport { sum } from '../ops/sum';\nexport const logSoftmaxGradConfig = {\n kernelName: LogSoftmax,\n inputsToSave: [],\n outputsToSave: [true],\n gradFunc: (dy, saved, attrs) => {\n const [value] = saved;\n const { axis } = attrs;\n return {\n logits: () => {\n const keepDims = true;\n const softmax = exp(value);\n return sub(dy, mul(sum(dy, axis, keepDims), softmax));\n }\n };\n }\n};\n//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiTG9nU29mdG1heF9ncmFkLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vLi4vdGZqcy1jb3JlL3NyYy9ncmFkaWVudHMvTG9nU29mdG1heF9ncmFkLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBOzs7Ozs7Ozs7Ozs7Ozs7R0FlRztBQUVILE9BQU8sRUFBQyxVQUFVLEVBQWtCLE1BQU0saUJBQWlCLENBQUM7QUFFNUQsT0FBTyxFQUFDLEdBQUcsRUFBQyxNQUFNLFlBQVksQ0FBQztBQUMvQixPQUFPLEVBQUMsR0FBRyxFQUFDLE1BQU0sWUFBWSxDQUFDO0FBQy9CLE9BQU8sRUFBQyxHQUFHLEVBQUMsTUFBTSxZQUFZLENBQUM7QUFDL0IsT0FBTyxFQUFDLEdBQUcsRUFBQyxNQUFNLFlBQVksQ0FBQztBQUcvQixNQUFNLENBQUMsTUFBTSxvQkFBb0IsR0FBZTtJQUM5QyxVQUFVLEVBQUUsVUFBVTtJQUN0QixZQUFZLEVBQUUsRUFBRTtJQUNoQixhQUFhLEVBQUUsQ0FBQyxJQUFJLENBQUM7SUFDckIsUUFBUSxFQUFFLENBQUMsRUFBVSxFQUFFLEtBQWUsRUFBRSxLQUFtQixFQUFFLEVBQUU7UUFDN0QsTUFBTSxDQUFDLEtBQUssQ0FBQyxHQUFHLEtBQUssQ0FBQztRQUN0QixNQUFNLEVBQUMsSUFBSSxFQUFDLEdBQUcsS0FBOEIsQ0FBQztRQUM5QyxPQUFPO1lBQ0wsTUFBTSxFQUFFLEdBQUcsRUFBRTtnQkFDWCxNQUFNLFFBQVEsR0FBRyxJQUFJLENBQUM7Z0JBQ3RCLE1BQU0sT0FBTyxHQUFHLEdBQUcsQ0FBQyxLQUFLLENBQUMsQ0FBQztnQkFDM0IsT0FBTyxHQUFHLENBQUMsRUFBRSxFQUFFLEdBQUcsQ0FBQyxHQUFHLENBQUMsRUFBRSxFQUFFLElBQUksRUFBRSxRQUFRLENBQUMsRUFBRSxPQUFPLENBQUMsQ0FBQyxDQUFDO1lBQ3hELENBQUM7U0FDRixDQUFDO0lBQ0osQ0FBQztDQUNGLENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyIvKipcbiAqIEBsaWNlbnNlXG4gKiBDb3B5cmlnaHQgMjAyMCBHb29nbGUgTExDLiBBbGwgUmlnaHRzIFJlc2VydmVkLlxuICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlIFwiTGljZW5zZVwiKTtcbiAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS5cbiAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdFxuICpcbiAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMFxuICpcbiAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmVcbiAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuIFwiQVMgSVNcIiBCQVNJUyxcbiAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLlxuICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZFxuICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuXG4gKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuICovXG5cbmltcG9ydCB7TG9nU29mdG1heCwgTG9nU29mdG1heEF0dHJzfSBmcm9tICcuLi9rZXJuZWxfbmFtZXMnO1xuaW1wb3J0IHtHcmFkQ29uZmlnLCBOYW1lZEF0dHJNYXB9IGZyb20gJy4uL2tlcm5lbF9yZWdpc3RyeSc7XG5pbXBvcnQge2V4cH0gZnJvbSAnLi4vb3BzL2V4cCc7XG5pbXBvcnQge211bH0gZnJvbSAnLi4vb3BzL211bCc7XG5pbXBvcnQge3N1Yn0gZnJvbSAnLi4vb3BzL3N1Yic7XG5pbXBvcnQge3N1bX0gZnJvbSAnLi4vb3BzL3N1bSc7XG5pbXBvcnQge1RlbnNvcn0gZnJvbSAnLi4vdGVuc29yJztcblxuZXhwb3J0IGNvbnN0IGxvZ1NvZnRtYXhHcmFkQ29uZmlnOiBHcmFkQ29uZmlnID0ge1xuICBrZXJuZWxOYW1lOiBMb2dTb2Z0bWF4LFxuICBpbnB1dHNUb1NhdmU6IFtdLFxuICBvdXRwdXRzVG9TYXZlOiBbdHJ1ZV0sXG4gIGdyYWRGdW5jOiAoZHk6IFRlbnNvciwgc2F2ZWQ6IFRlbnNvcltdLCBhdHRyczogTmFtZWRBdHRyTWFwKSA9PiB7XG4gICAgY29uc3QgW3ZhbHVlXSA9IHNhdmVkO1xuICAgIGNvbnN0IHtheGlzfSA9IGF0dHJzIGFzIHt9IGFzIExvZ1NvZnRtYXhBdHRycztcbiAgICByZXR1cm4ge1xuICAgICAgbG9naXRzOiAoKSA9PiB7XG4gICAgICAgIGNvbnN0IGtlZXBEaW1zID0gdHJ1ZTtcbiAgICAgICAgY29uc3Qgc29mdG1heCA9IGV4cCh2YWx1ZSk7XG4gICAgICAgIHJldHVybiBzdWIoZHksIG11bChzdW0oZHksIGF4aXMsIGtlZXBEaW1zKSwgc29mdG1heCkpO1xuICAgICAgfVxuICAgIH07XG4gIH1cbn07XG4iXX0=","/**\n * @license\n * Copyright 2020 Google LLC. All Rights Reserved.\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n * =============================================================================\n */\nimport { ENGINE } from '../engine';\nimport { LRNGrad } from '../kernel_names';\nimport { op } from './operation';\nfunction localResponseNormalizationBackprop_(x, y, dy, depthRadius = 5, bias = 1, alpha = 1, beta = 0.5) {\n const inputs = { x, y, dy };\n const attrs = { depthRadius, bias, alpha, beta };\n return ENGINE.runKernel(LRNGrad, inputs, attrs);\n}\nexport const localResponseNormalizationBackprop = op({ localResponseNormalizationBackprop_ });\n//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibG9jYWxfcmVzcG9uc2Vfbm9ybWFsaXphdGlvbl9iYWNrcHJvcC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uLy4uL3RmanMtY29yZS9zcmMvb3BzL2xvY2FsX3Jlc3BvbnNlX25vcm1hbGl6YXRpb25fYmFja3Byb3AudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUE7Ozs7Ozs7Ozs7Ozs7OztHQWVHO0FBRUgsT0FBTyxFQUFDLE1BQU0sRUFBQyxNQUFNLFdBQVcsQ0FBQztBQUNqQyxPQUFPLEVBQUMsT0FBTyxFQUE4QixNQUFNLGlCQUFpQixDQUFDO0FBS3JFLE9BQU8sRUFBQyxFQUFFLEVBQUMsTUFBTSxhQUFhLENBQUM7QUFFL0IsU0FBUyxtQ0FBbUMsQ0FDeEMsQ0FBSSxFQUFFLENBQUksRUFBRSxFQUFLLEVBQUUsV0FBVyxHQUFHLENBQUMsRUFBRSxJQUFJLEdBQUcsQ0FBQyxFQUFFLEtBQUssR0FBRyxDQUFDLEVBQUUsSUFBSSxHQUFHLEdBQUc7SUFDckUsTUFBTSxNQUFNLEdBQWtCLEVBQUMsQ0FBQyxFQUFFLENBQUMsRUFBRSxFQUFFLEVBQUMsQ0FBQztJQUV6QyxNQUFNLEtBQUssR0FBaUIsRUFBQyxXQUFXLEVBQUUsSUFBSSxFQUFFLEtBQUssRUFBRSxJQUFJLEVBQUMsQ0FBQztJQUU3RCxPQUFPLE1BQU0sQ0FBQyxTQUFTLENBQ25CLE9BQU8sRUFBRSxNQUE4QixFQUFFLEtBQTJCLENBQUMsQ0FBQztBQUM1RSxDQUFDO0FBRUQsTUFBTSxDQUFDLE1BQU0sa0NBQWtDLEdBQzNDLEVBQUUsQ0FBQyxFQUFDLG1DQUFtQyxFQUFDLENBQUMsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbIi8qKlxuICogQGxpY2Vuc2VcbiAqIENvcHlyaWdodCAyMDIwIEdvb2dsZSBMTEMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuXG4gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgXCJMaWNlbnNlXCIpO1xuICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLlxuICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0XG4gKlxuICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wXG4gKlxuICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZVxuICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gXCJBUyBJU1wiIEJBU0lTLFxuICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuXG4gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kXG4gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS5cbiAqID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4gKi9cblxuaW1wb3J0IHtFTkdJTkV9IGZyb20gJy4uL2VuZ2luZSc7XG5pbXBvcnQge0xSTkdyYWQsIExSTkdyYWRBdHRycywgTFJOR3JhZElucHV0c30gZnJvbSAnLi4va2VybmVsX25hbWVzJztcbmltcG9ydCB7TmFtZWRBdHRyTWFwfSBmcm9tICcuLi9rZXJuZWxfcmVnaXN0cnknO1xuaW1wb3J0IHtUZW5zb3I0RH0gZnJvbSAnLi4vdGVuc29yJztcbmltcG9ydCB7TmFtZWRUZW5zb3JNYXB9IGZyb20gJy4uL3RlbnNvcl90eXBlcyc7XG5cbmltcG9ydCB7b3B9IGZyb20gJy4vb3BlcmF0aW9uJztcblxuZnVuY3Rpb24gbG9jYWxSZXNwb25zZU5vcm1hbGl6YXRpb25CYWNrcHJvcF88VCBleHRlbmRzIFRlbnNvcjREPihcbiAgICB4OiBULCB5OiBULCBkeTogVCwgZGVwdGhSYWRpdXMgPSA1LCBiaWFzID0gMSwgYWxwaGEgPSAxLCBiZXRhID0gMC41KTogVCB7XG4gIGNvbnN0IGlucHV0czogTFJOR3JhZElucHV0cyA9IHt4LCB5LCBkeX07XG5cbiAgY29uc3QgYXR0cnM6IExSTkdyYWRBdHRycyA9IHtkZXB0aFJhZGl1cywgYmlhcywgYWxwaGEsIGJldGF9O1xuXG4gIHJldHVybiBFTkdJTkUucnVuS2VybmVsKFxuICAgICAgTFJOR3JhZCwgaW5wdXRzIGFzIHt9IGFzIE5hbWVkVGVuc29yTWFwLCBhdHRycyBhcyB7fSBhcyBOYW1lZEF0dHJNYXApO1xufVxuXG5leHBvcnQgY29uc3QgbG9jYWxSZXNwb25zZU5vcm1hbGl6YXRpb25CYWNrcHJvcCA9XG4gICAgb3Aoe2xvY2FsUmVzcG9uc2VOb3JtYWxpemF0aW9uQmFja3Byb3BffSk7XG4iXX0=","/**\n * @license\n * Copyright 2020 Google LLC. All Rights Reserved.\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n * =============================================================================\n */\nimport { LRN } from '../kernel_names';\nimport { localResponseNormalizationBackprop } from '../ops/local_response_normalization_backprop';\nexport const lrnGradConfig = {\n kernelName: LRN,\n inputsToSave: ['x'],\n outputsToSave: [true],\n gradFunc: (dy, saved, attrs) => {\n const [x, y] = saved;\n const { depthRadius, bias, alpha, beta } = attrs;\n return {\n x: () => localResponseNormalizationBackprop(x, y, dy, depthRadius, bias, alpha, beta)\n };\n }\n};\n//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiTFJOX2dyYWQuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi8uLi90ZmpzLWNvcmUvc3JjL2dyYWRpZW50cy9MUk5fZ3JhZC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQTs7Ozs7Ozs7Ozs7Ozs7O0dBZUc7QUFDSCxPQUFPLEVBQUMsR0FBRyxFQUFXLE1BQU0saUJBQWlCLENBQUM7QUFFOUMsT0FBTyxFQUFDLGtDQUFrQyxFQUFDLE1BQU0sOENBQThDLENBQUM7QUFHaEcsTUFBTSxDQUFDLE1BQU0sYUFBYSxHQUFlO0lBQ3ZDLFVBQVUsRUFBRSxHQUFHO0lBQ2YsWUFBWSxFQUFFLENBQUMsR0FBRyxDQUFDO0lBQ25CLGFBQWEsRUFBRSxDQUFDLElBQUksQ0FBQztJQUNyQixRQUFRLEVBQUUsQ0FBQyxFQUFZLEVBQUUsS0FBZSxFQUFFLEtBQW1CLEVBQUUsRUFBRTtRQUMvRCxNQUFNLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxHQUFHLEtBQTZCLENBQUM7UUFDN0MsTUFBTSxFQUFDLFdBQVcsRUFBRSxJQUFJLEVBQUUsS0FBSyxFQUFFLElBQUksRUFBQyxHQUFHLEtBQXVCLENBQUM7UUFFakUsT0FBTztZQUNMLENBQUMsRUFBRSxHQUFHLEVBQUUsQ0FBQyxrQ0FBa0MsQ0FDdkMsQ0FBQyxFQUFFLENBQUMsRUFBRSxFQUFFLEVBQUUsV0FBVyxFQUFFLElBQUksRUFBRSxLQUFLLEVBQUUsSUFBSSxDQUFDO1NBQzlDLENBQUM7SUFDSixDQUFDO0NBQ0YsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbIi8qKlxuICogQGxpY2Vuc2VcbiAqIENvcHlyaWdodCAyMDIwIEdvb2dsZSBMTEMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuXG4gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgXCJMaWNlbnNlXCIpO1xuICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLlxuICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0XG4gKlxuICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wXG4gKlxuICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZVxuICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gXCJBUyBJU1wiIEJBU0lTLFxuICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuXG4gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kXG4gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS5cbiAqID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4gKi9cbmltcG9ydCB7TFJOLCBMUk5BdHRyc30gZnJvbSAnLi4va2VybmVsX25hbWVzJztcbmltcG9ydCB7R3JhZENvbmZpZywgTmFtZWRBdHRyTWFwfSBmcm9tICcuLi9rZXJuZWxfcmVnaXN0cnknO1xuaW1wb3J0IHtsb2NhbFJlc3BvbnNlTm9ybWFsaXphdGlvbkJhY2twcm9wfSBmcm9tICcuLi9vcHMvbG9jYWxfcmVzcG9uc2Vfbm9ybWFsaXphdGlvbl9iYWNrcHJvcCc7XG5pbXBvcnQge1RlbnNvciwgVGVuc29yNER9IGZyb20gJy4uL3RlbnNvcic7XG5cbmV4cG9ydCBjb25zdCBscm5HcmFkQ29uZmlnOiBHcmFkQ29uZmlnID0ge1xuICBrZXJuZWxOYW1lOiBMUk4sXG4gIGlucHV0c1RvU2F2ZTogWyd4J10sXG4gIG91dHB1dHNUb1NhdmU6IFt0cnVlXSxcbiAgZ3JhZEZ1bmM6IChkeTogVGVuc29yNEQsIHNhdmVkOiBUZW5zb3JbXSwgYXR0cnM6IE5hbWVkQXR0ck1hcCkgPT4ge1xuICAgIGNvbnN0IFt4LCB5XSA9IHNhdmVkIGFzIFtUZW5zb3I0RCwgVGVuc29yNERdO1xuICAgIGNvbnN0IHtkZXB0aFJhZGl1cywgYmlhcywgYWxwaGEsIGJldGF9ID0gYXR0cnMgYXMge30gYXMgTFJOQXR0cnM7XG5cbiAgICByZXR1cm4ge1xuICAgICAgeDogKCkgPT4gbG9jYWxSZXNwb25zZU5vcm1hbGl6YXRpb25CYWNrcHJvcChcbiAgICAgICAgICB4LCB5LCBkeSwgZGVwdGhSYWRpdXMsIGJpYXMsIGFscGhhLCBiZXRhKVxuICAgIH07XG4gIH1cbn07XG4iXX0=","/**\n * @license\n * Copyright 2020 Google LLC. All Rights Reserved.\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n * =============================================================================\n */\nimport * as axis_util from '../ops/axis_util';\nimport { cast } from '../ops/cast';\nimport { equal } from '../ops/equal';\nimport { mul } from '../ops/mul';\nimport { reshape } from '../ops/reshape';\n/**\n * Gradient helper function for the min and max operations.\n */\nexport function gradForMinAndMax(dy, y, xOrig, origAxes) {\n if (y.rank < xOrig.rank) {\n y = reshape(y, axis_util.expandShapeToKeepDim(y.shape, origAxes));\n }\n if (dy.rank < xOrig.rank) {\n dy = reshape(dy, axis_util.expandShapeToKeepDim(dy.shape, origAxes));\n }\n return {\n x: () => {\n const dx = mul(dy, cast(equal(xOrig, y), dy.dtype));\n return dx;\n }\n };\n}\n//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibWluX21heF9ncmFkX3V0aWwuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi8uLi90ZmpzLWNvcmUvc3JjL2dyYWRpZW50cy9taW5fbWF4X2dyYWRfdXRpbC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQTs7Ozs7Ozs7Ozs7Ozs7O0dBZUc7QUFFSCxPQUFPLEtBQUssU0FBUyxNQUFNLGtCQUFrQixDQUFDO0FBQzlDLE9BQU8sRUFBQyxJQUFJLEVBQUMsTUFBTSxhQUFhLENBQUM7QUFDakMsT0FBTyxFQUFDLEtBQUssRUFBQyxNQUFNLGNBQWMsQ0FBQztBQUNuQyxPQUFPLEVBQUMsR0FBRyxFQUFDLE1BQU0sWUFBWSxDQUFDO0FBQy9CLE9BQU8sRUFBQyxPQUFPLEVBQUMsTUFBTSxnQkFBZ0IsQ0FBQztBQUd2Qzs7R0FFRztBQUNILE1BQU0sVUFBVSxnQkFBZ0IsQ0FDNUIsRUFBSyxFQUFFLENBQUksRUFBRSxLQUFhLEVBQUUsUUFBa0I7SUFDaEQsSUFBSSxDQUFDLENBQUMsSUFBSSxHQUFHLEtBQUssQ0FBQyxJQUFJLEVBQUU7UUFDdkIsQ0FBQyxHQUFHLE9BQU8sQ0FBQyxDQUFDLEVBQUUsU0FBUyxDQUFDLG9CQUFvQixDQUFDLENBQUMsQ0FBQyxLQUFLLEVBQUUsUUFBUSxDQUFDLENBQU0sQ0FBQztLQUN4RTtJQUNELElBQUksRUFBRSxDQUFDLElBQUksR0FBRyxLQUFLLENBQUMsSUFBSSxFQUFFO1FBQ3hCLEVBQUUsR0FBRyxPQUFPLENBQUMsRUFBRSxFQUFFLFNBQVMsQ0FBQyxvQkFBb0IsQ0FBQyxFQUFFLENBQUMsS0FBSyxFQUFFLFFBQVEsQ0FBQyxDQUFNLENBQUM7S0FDM0U7SUFDRCxPQUFPO1FBQ0wsQ0FBQyxFQUFFLEdBQUcsRUFBRTtZQUNOLE1BQU0sRUFBRSxHQUFHLEdBQUcsQ0FBQyxFQUFFLEVBQUUsSUFBSSxDQUFDLEtBQUssQ0FBQyxLQUFLLEVBQUUsQ0FBQyxDQUFDLEVBQUUsRUFBRSxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUM7WUFDcEQsT0FBTyxFQUFFLENBQUM7UUFDWixDQUFDO0tBQ0YsQ0FBQztBQUNKLENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyIvKipcbiAqIEBsaWNlbnNlXG4gKiBDb3B5cmlnaHQgMjAyMCBHb29nbGUgTExDLiBBbGwgUmlnaHRzIFJlc2VydmVkLlxuICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlIFwiTGljZW5zZVwiKTtcbiAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS5cbiAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdFxuICpcbiAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMFxuICpcbiAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmVcbiAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuIFwiQVMgSVNcIiBCQVNJUyxcbiAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLlxuICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZFxuICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuXG4gKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuICovXG5cbmltcG9ydCAqIGFzIGF4aXNfdXRpbCBmcm9tICcuLi9vcHMvYXhpc191dGlsJztcbmltcG9ydCB7Y2FzdH0gZnJvbSAnLi4vb3BzL2Nhc3QnO1xuaW1wb3J0IHtlcXVhbH0gZnJvbSAnLi4vb3BzL2VxdWFsJztcbmltcG9ydCB7bXVsfSBmcm9tICcuLi9vcHMvbXVsJztcbmltcG9ydCB7cmVzaGFwZX0gZnJvbSAnLi4vb3BzL3Jlc2hhcGUnO1xuaW1wb3J0IHtUZW5zb3J9IGZyb20gJy4uL3RlbnNvcic7XG5cbi8qKlxuICogR3JhZGllbnQgaGVscGVyIGZ1bmN0aW9uIGZvciB0aGUgbWluIGFuZCBtYXggb3BlcmF0aW9ucy5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGdyYWRGb3JNaW5BbmRNYXg8VCBleHRlbmRzIFRlbnNvcj4oXG4gICAgZHk6IFQsIHk6IFQsIHhPcmlnOiBUZW5zb3IsIG9yaWdBeGVzOiBudW1iZXJbXSkge1xuICBpZiAoeS5yYW5rIDwgeE9yaWcucmFuaykge1xuICAgIHkgPSByZXNoYXBlKHksIGF4aXNfdXRpbC5leHBhbmRTaGFwZVRvS2VlcERpbSh5LnNoYXBlLCBvcmlnQXhlcykpIGFzIFQ7XG4gIH1cbiAgaWYgKGR5LnJhbmsgPCB4T3JpZy5yYW5rKSB7XG4gICAgZHkgPSByZXNoYXBlKGR5LCBheGlzX3V0aWwuZXhwYW5kU2hhcGVUb0tlZXBEaW0oZHkuc2hhcGUsIG9yaWdBeGVzKSkgYXMgVDtcbiAgfVxuICByZXR1cm4ge1xuICAgIHg6ICgpID0+IHtcbiAgICAgIGNvbnN0IGR4ID0gbXVsKGR5LCBjYXN0KGVxdWFsKHhPcmlnLCB5KSwgZHkuZHR5cGUpKTtcbiAgICAgIHJldHVybiBkeDtcbiAgICB9XG4gIH07XG59XG4iXX0=","/**\n * @license\n * Copyright 2020 Google LLC. All Rights Reserved.\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n * =============================================================================\n */\nimport { Max } from '../kernel_names';\nimport * as util from '../util';\nimport { gradForMinAndMax } from './min_max_grad_util';\nexport const maxGradConfig = {\n kernelName: Max,\n inputsToSave: ['x'],\n outputsToSave: [true],\n gradFunc: (dy, saved, attrs) => {\n const maxAttrs = attrs;\n const { reductionIndices } = maxAttrs;\n const x = saved[0];\n const y = saved[1];\n const origAxes = util.parseAxisParam(reductionIndices, x.shape);\n const maxGrad = gradForMinAndMax(dy, y, x, origAxes);\n return {\n x: () => {\n return maxGrad['x']();\n }\n };\n }\n};\n//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiTWF4X2dyYWQuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi8uLi90ZmpzLWNvcmUvc3JjL2dyYWRpZW50cy9NYXhfZ3JhZC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQTs7Ozs7Ozs7Ozs7Ozs7O0dBZUc7QUFFSCxPQUFPLEVBQUMsR0FBRyxFQUFXLE1BQU0saUJBQWlCLENBQUM7QUFHOUMsT0FBTyxLQUFLLElBQUksTUFBTSxTQUFTLENBQUM7QUFFaEMsT0FBTyxFQUFDLGdCQUFnQixFQUFDLE1BQU0scUJBQXFCLENBQUM7QUFFckQsTUFBTSxDQUFDLE1BQU0sYUFBYSxHQUFlO0lBQ3ZDLFVBQVUsRUFBRSxHQUFHO0lBQ2YsWUFBWSxFQUFFLENBQUMsR0FBRyxDQUFDO0lBQ25CLGFBQWEsRUFBRSxDQUFDLElBQUksQ0FBQztJQUNyQixRQUFRLEVBQUUsQ0FBQyxFQUFVLEVBQUUsS0FBZSxFQUFFLEtBQW1CLEVBQUUsRUFBRTtRQUM3RCxNQUFNLFFBQVEsR0FBYSxLQUF1QixDQUFDO1FBQ25ELE1BQU0sRUFBQyxnQkFBZ0IsRUFBQyxHQUFHLFFBQVEsQ0FBQztRQUNwQyxNQUFNLENBQUMsR0FBRyxLQUFLLENBQUMsQ0FBQyxDQUFDLENBQUM7UUFDbkIsTUFBTSxDQUFDLEdBQUcsS0FBSyxDQUFDLENBQUMsQ0FBQyxDQUFDO1FBQ25CLE1BQU0sUUFBUSxHQUFHLElBQUksQ0FBQyxjQUFjLENBQUMsZ0JBQWdCLEVBQUUsQ0FBQyxDQUFDLEtBQUssQ0FBQyxDQUFDO1FBQ2hFLE1BQU0sT0FBTyxHQUFHLGdCQUFnQixDQUFDLEVBQUUsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLFFBQVEsQ0FBQyxDQUFDO1FBQ3JELE9BQU87WUFDTCxDQUFDLEVBQUUsR0FBRyxFQUFFO2dCQUNOLE9BQU8sT0FBTyxDQUFDLEdBQUcsQ0FBQyxFQUFFLENBQUM7WUFDeEIsQ0FBQztTQUNGLENBQUM7SUFDSixDQUFDO0NBQ0YsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbIi8qKlxuICogQGxpY2Vuc2VcbiAqIENvcHlyaWdodCAyMDIwIEdvb2dsZSBMTEMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuXG4gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgXCJMaWNlbnNlXCIpO1xuICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLlxuICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0XG4gKlxuICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wXG4gKlxuICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZVxuICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gXCJBUyBJU1wiIEJBU0lTLFxuICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuXG4gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kXG4gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS5cbiAqID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4gKi9cblxuaW1wb3J0IHtNYXgsIE1heEF0dHJzfSBmcm9tICcuLi9rZXJuZWxfbmFtZXMnO1xuaW1wb3J0IHtHcmFkQ29uZmlnLCBOYW1lZEF0dHJNYXB9IGZyb20gJy4uL2tlcm5lbF9yZWdpc3RyeSc7XG5pbXBvcnQge1RlbnNvcn0gZnJvbSAnLi4vdGVuc29yJztcbmltcG9ydCAqIGFzIHV0aWwgZnJvbSAnLi4vdXRpbCc7XG5cbmltcG9ydCB7Z3JhZEZvck1pbkFuZE1heH0gZnJvbSAnLi9taW5fbWF4X2dyYWRfdXRpbCc7XG5cbmV4cG9ydCBjb25zdCBtYXhHcmFkQ29uZmlnOiBHcmFkQ29uZmlnID0ge1xuICBrZXJuZWxOYW1lOiBNYXgsXG4gIGlucHV0c1RvU2F2ZTogWyd4J10sXG4gIG91dHB1dHNUb1NhdmU6IFt0cnVlXSxcbiAgZ3JhZEZ1bmM6IChkeTogVGVuc29yLCBzYXZlZDogVGVuc29yW10sIGF0dHJzOiBOYW1lZEF0dHJNYXApID0+IHtcbiAgICBjb25zdCBtYXhBdHRyczogTWF4QXR0cnMgPSBhdHRycyBhcyB7fSBhcyBNYXhBdHRycztcbiAgICBjb25zdCB7cmVkdWN0aW9uSW5kaWNlc30gPSBtYXhBdHRycztcbiAgICBjb25zdCB4ID0gc2F2ZWRbMF07XG4gICAgY29uc3QgeSA9IHNhdmVkWzFdO1xuICAgIGNvbnN0IG9yaWdBeGVzID0gdXRpbC5wYXJzZUF4aXNQYXJhbShyZWR1Y3Rpb25JbmRpY2VzLCB4LnNoYXBlKTtcbiAgICBjb25zdCBtYXhHcmFkID0gZ3JhZEZvck1pbkFuZE1heChkeSwgeSwgeCwgb3JpZ0F4ZXMpO1xuICAgIHJldHVybiB7XG4gICAgICB4OiAoKSA9PiB7XG4gICAgICAgIHJldHVybiBtYXhHcmFkWyd4J10oKTtcbiAgICAgIH1cbiAgICB9O1xuICB9XG59O1xuIl19","/**\n * @license\n * Copyright 2020 Google LLC. All Rights Reserved.\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n * =============================================================================\n */\nimport { Maximum } from '../kernel_names';\nimport { cast } from '../ops/cast';\nimport { greaterEqual } from '../ops/greater_equal';\nimport { less } from '../ops/less';\nimport { mul } from '../ops/mul';\nexport const maximumGradConfig = {\n kernelName: Maximum,\n inputsToSave: ['a', 'b'],\n gradFunc: (dy, saved) => {\n const [a, b] = saved;\n const derA = () => mul(dy, cast(greaterEqual(a, b), 'float32'));\n const derB = () => mul(dy, cast(less(a, b), 'float32'));\n return { a: derA, b: derB };\n }\n};\n//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiTWF4aW11bV9ncmFkLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vLi4vdGZqcy1jb3JlL3NyYy9ncmFkaWVudHMvTWF4aW11bV9ncmFkLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBOzs7Ozs7Ozs7Ozs7Ozs7R0FlRztBQUVILE9BQU8sRUFBQyxPQUFPLEVBQUMsTUFBTSxpQkFBaUIsQ0FBQztBQUV4QyxPQUFPLEVBQUMsSUFBSSxFQUFDLE1BQU0sYUFBYSxDQUFDO0FBQ2pDLE9BQU8sRUFBQyxZQUFZLEVBQUMsTUFBTSxzQkFBc0IsQ0FBQztBQUNsRCxPQUFPLEVBQUMsSUFBSSxFQUFDLE1BQU0sYUFBYSxDQUFDO0FBQ2pDLE9BQU8sRUFBQyxHQUFHLEVBQUMsTUFBTSxZQUFZLENBQUM7QUFHL0IsTUFBTSxDQUFDLE1BQU0saUJBQWlCLEdBQWU7SUFDM0MsVUFBVSxFQUFFLE9BQU87SUFDbkIsWUFBWSxFQUFFLENBQUMsR0FBRyxFQUFFLEdBQUcsQ0FBQztJQUN4QixRQUFRLEVBQUUsQ0FBQyxFQUFVLEVBQUUsS0FBZSxFQUFFLEVBQUU7UUFDeEMsTUFBTSxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsR0FBRyxLQUFLLENBQUM7UUFDckIsTUFBTSxJQUFJLEdBQUcsR0FBRyxFQUFFLENBQUMsR0FBRyxDQUFDLEVBQUUsRUFBRSxJQUFJLENBQUMsWUFBWSxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsRUFBRSxTQUFTLENBQUMsQ0FBQyxDQUFDO1FBQ2hFLE1BQU0sSUFBSSxHQUFHLEdBQUcsRUFBRSxDQUFDLEdBQUcsQ0FBQyxFQUFFLEVBQUUsSUFBSSxDQUFDLElBQUksQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLEVBQUUsU0FBUyxDQUFDLENBQUMsQ0FBQztRQUN4RCxPQUFPLEVBQUMsQ0FBQyxFQUFFLElBQUksRUFBRSxDQUFDLEVBQUUsSUFBSSxFQUFDLENBQUM7SUFDNUIsQ0FBQztDQUNGLENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyIvKipcbiAqIEBsaWNlbnNlXG4gKiBDb3B5cmlnaHQgMjAyMCBHb29nbGUgTExDLiBBbGwgUmlnaHRzIFJlc2VydmVkLlxuICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlIFwiTGljZW5zZVwiKTtcbiAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS5cbiAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdFxuICpcbiAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMFxuICpcbiAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmVcbiAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuIFwiQVMgSVNcIiBCQVNJUyxcbiAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLlxuICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZFxuICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuXG4gKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuICovXG5cbmltcG9ydCB7TWF4aW11bX0gZnJvbSAnLi4va2VybmVsX25hbWVzJztcbmltcG9ydCB7R3JhZENvbmZpZ30gZnJvbSAnLi4va2VybmVsX3JlZ2lzdHJ5JztcbmltcG9ydCB7Y2FzdH0gZnJvbSAnLi4vb3BzL2Nhc3QnO1xuaW1wb3J0IHtncmVhdGVyRXF1YWx9IGZyb20gJy4uL29wcy9ncmVhdGVyX2VxdWFsJztcbmltcG9ydCB7bGVzc30gZnJvbSAnLi4vb3BzL2xlc3MnO1xuaW1wb3J0IHttdWx9IGZyb20gJy4uL29wcy9tdWwnO1xuaW1wb3J0IHtUZW5zb3J9IGZyb20gJy4uL3RlbnNvcic7XG5cbmV4cG9ydCBjb25zdCBtYXhpbXVtR3JhZENvbmZpZzogR3JhZENvbmZpZyA9IHtcbiAga2VybmVsTmFtZTogTWF4aW11bSxcbiAgaW5wdXRzVG9TYXZlOiBbJ2EnLCAnYiddLFxuICBncmFkRnVuYzogKGR5OiBUZW5zb3IsIHNhdmVkOiBUZW5zb3JbXSkgPT4ge1xuICAgIGNvbnN0IFthLCBiXSA9IHNhdmVkO1xuICAgIGNvbnN0IGRlckEgPSAoKSA9PiBtdWwoZHksIGNhc3QoZ3JlYXRlckVxdWFsKGEsIGIpLCAnZmxvYXQzMicpKTtcbiAgICBjb25zdCBkZXJCID0gKCkgPT4gbXVsKGR5LCBjYXN0KGxlc3MoYSwgYiksICdmbG9hdDMyJykpO1xuICAgIHJldHVybiB7YTogZGVyQSwgYjogZGVyQn07XG4gIH1cbn07XG4iXX0=","/**\n * @license\n * Copyright 2020 Google LLC. All Rights Reserved.\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n * =============================================================================\n */\nimport { ENGINE } from '../engine';\nimport { MaxPool3DGrad } from '../kernel_names';\nimport { convertToTensor } from '../tensor_util_env';\nimport * as util from '../util';\nimport { checkPadOnDimRoundingMode } from './conv_util';\nimport { op } from './operation';\nimport { reshape } from './reshape';\n/**\n * Computes the backprop of a 3d max pool.\n *\n * @param dy The dy error, of rank 5 of shape\n * [batchSize, depth, height, width, channels].\n * assumed.\n * @param input The original input image, of rank 5 or rank 4 of shape\n * [batchSize, depth, height, width, channels].\n * @param output The original output image, of rank 5 of shape\n * [batchSize, outDepth, outHeight, outWidth, channels].\n * @param filterSize The filter size:\n * `[filterDepth, filterHeight, filterWidth]`.\n * `filterSize` is a single number,\n * then `filterDepth == filterHeight == filterWidth`.\n * @param strides The strides of the pooling:\n * `[strideDepth, strideHeight, strideWidth]`. If\n * `strides` is a single number, then `strideHeight == strideWidth`.\n * @param pad A string from: 'same', 'valid'. The type of padding algorithm\n * used in the forward prop of the op.\n * @param dimRoundingMode A string from: 'ceil', 'round', 'floor'. If none is\n * provided, it will default to truncate.\n */\nfunction maxPool3dGrad_(dy, input, output, filterSize, strides, pad, dimRoundingMode) {\n const $dy = convertToTensor(dy, 'dy', 'maxPool3dGrad');\n const $input = convertToTensor(input, 'input', 'maxPool3dGrad');\n const $output = convertToTensor(output, 'output', 'maxPool3dGrad');\n let dy5D = $dy;\n let input5D = $input;\n let output5D = $output;\n let reshapedTo5D = false;\n if ($input.rank === 4) {\n reshapedTo5D = true;\n dy5D = reshape($dy, [1, $dy.shape[0], $dy.shape[1], $dy.shape[2], $dy.shape[3]]);\n input5D = reshape($input, [\n 1, $input.shape[0], $input.shape[1], $input.shape[2], $input.shape[3]\n ]);\n output5D = reshape($output, [\n 1, $output.shape[0], $output.shape[1], $output.shape[2], $output.shape[3]\n ]);\n }\n util.assert(dy5D.rank === 5, () => `Error in maxPool3dGrad: dy must be rank 5 but got rank ` +\n `${dy5D.rank}.`);\n util.assert(input5D.rank === 5, () => `Error in maxPool3dGrad: input must be rank 5 but got rank ` +\n `${input5D.rank}.`);\n util.assert(output5D.rank === 5, () => `Error in maxPool3dGrad: output must be rank 5 but got rank ` +\n `${output5D.rank}.`);\n checkPadOnDimRoundingMode('maxPool3dGrad', pad, dimRoundingMode);\n const inputs = { dy: dy5D, input: input5D, output: output5D };\n const attrs = { filterSize, strides, pad, dimRoundingMode };\n // tslint:disable-next-line: no-unnecessary-type-assertion\n const res = ENGINE.runKernel(MaxPool3DGrad, inputs, attrs);\n if (reshapedTo5D) {\n return reshape(res, [res.shape[1], res.shape[2], res.shape[3], res.shape[4]]);\n }\n return res;\n}\nexport const maxPool3dGrad = op({ maxPool3dGrad_ });\n//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibWF4X3Bvb2xfM2RfZ3JhZC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uLy4uL3RmanMtY29yZS9zcmMvb3BzL21heF9wb29sXzNkX2dyYWQudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUE7Ozs7Ozs7Ozs7Ozs7OztHQWVHO0FBRUgsT0FBTyxFQUFDLE1BQU0sRUFBQyxNQUFNLFdBQVcsQ0FBQztBQUNqQyxPQUFPLEVBQUMsYUFBYSxFQUEwQyxNQUFNLGlCQUFpQixDQUFDO0FBSXZGLE9BQU8sRUFBQyxlQUFlLEVBQUMsTUFBTSxvQkFBb0IsQ0FBQztBQUVuRCxPQUFPLEtBQUssSUFBSSxNQUFNLFNBQVMsQ0FBQztBQUVoQyxPQUFPLEVBQUMseUJBQXlCLEVBQUMsTUFBTSxhQUFhLENBQUM7QUFDdEQsT0FBTyxFQUFDLEVBQUUsRUFBQyxNQUFNLGFBQWEsQ0FBQztBQUMvQixPQUFPLEVBQUMsT0FBTyxFQUFDLE1BQU0sV0FBVyxDQUFDO0FBRWxDOzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7R0FxQkc7QUFDSCxTQUFTLGNBQWMsQ0FDbkIsRUFBZ0IsRUFBRSxLQUFtQixFQUFFLE1BQW9CLEVBQzNELFVBQTJDLEVBQzNDLE9BQXdDLEVBQUUsR0FBMEIsRUFDcEUsZUFBd0M7SUFDMUMsTUFBTSxHQUFHLEdBQUcsZUFBZSxDQUFDLEVBQUUsRUFBRSxJQUFJLEVBQUUsZUFBZSxDQUFDLENBQUM7SUFDdkQsTUFBTSxNQUFNLEdBQUcsZUFBZSxDQUFDLEtBQUssRUFBRSxPQUFPLEVBQUUsZUFBZSxDQUFDLENBQUM7SUFDaEUsTUFBTSxPQUFPLEdBQUcsZUFBZSxDQUFDLE1BQU0sRUFBRSxRQUFRLEVBQUUsZUFBZSxDQUFDLENBQUM7SUFFbkUsSUFBSSxJQUFJLEdBQUcsR0FBZSxDQUFDO0lBQzNCLElBQUksT0FBTyxHQUFHLE1BQWtCLENBQUM7SUFDakMsSUFBSSxRQUFRLEdBQUcsT0FBbUIsQ0FBQztJQUNuQyxJQUFJLFlBQVksR0FBRyxLQUFLLENBQUM7SUFFekIsSUFBSSxNQUFNLENBQUMsSUFBSSxLQUFLLENBQUMsRUFBRTtRQUNyQixZQUFZLEdBQUcsSUFBSSxDQUFDO1FBQ3BCLElBQUksR0FBRyxPQUFPLENBQ1YsR0FBRyxFQUFFLENBQUMsQ0FBQyxFQUFFLEdBQUcsQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDLEVBQUUsR0FBRyxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUMsRUFBRSxHQUFHLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQyxFQUFFLEdBQUcsQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDO1FBQ3RFLE9BQU8sR0FBRyxPQUFPLENBQUMsTUFBTSxFQUFFO1lBQ3hCLENBQUMsRUFBRSxNQUFNLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQyxFQUFFLE1BQU0sQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDLEVBQUUsTUFBTSxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUMsRUFBRSxNQUFNLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQztTQUN0RSxDQUFDLENBQUM7UUFDSCxRQUFRLEdBQUcsT0FBTyxDQUFDLE9BQU8sRUFBRTtZQUMxQixDQUFDLEVBQUUsT0FBTyxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUMsRUFBRSxPQUFPLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQyxFQUFFLE9BQU8sQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDLEVBQUUsT0FBTyxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUM7U0FDMUUsQ0FBQyxDQUFDO0tBQ0o7SUFFRCxJQUFJLENBQUMsTUFBTSxDQUNQLElBQUksQ0FBQyxJQUFJLEtBQUssQ0FBQyxFQUNmLEdBQUcsRUFBRSxDQUFDLHlEQUF5RDtRQUMzRCxHQUFHLElBQUksQ0FBQyxJQUFJLEdBQUcsQ0FBQyxDQUFDO0lBQ3pCLElBQUksQ0FBQyxNQUFNLENBQ1AsT0FBTyxDQUFDLElBQUksS0FBSyxDQUFDLEVBQ2xCLEdBQUcsRUFBRSxDQUFDLDREQUE0RDtRQUM5RCxHQUFHLE9BQU8sQ0FBQyxJQUFJLEdBQUcsQ0FBQyxDQUFDO0lBQzVCLElBQUksQ0FBQyxNQUFNLENBQ1AsUUFBUSxDQUFDLElBQUksS0FBSyxDQUFDLEVBQ25CLEdBQUcsRUFBRSxDQUFDLDZEQUE2RDtRQUMvRCxHQUFHLFFBQVEsQ0FBQyxJQUFJLEdBQUcsQ0FBQyxDQUFDO0lBQzdCLHlCQUF5QixDQUFDLGVBQWUsRUFBRSxHQUFHLEVBQUUsZUFBZSxDQUFDLENBQUM7SUFDakUsTUFBTSxNQUFNLEdBQ2MsRUFBQyxFQUFFLEVBQUUsSUFBSSxFQUFFLEtBQUssRUFBRSxPQUFPLEVBQUUsTUFBTSxFQUFFLFFBQVEsRUFBQyxDQUFDO0lBQ3ZFLE1BQU0sS0FBSyxHQUF1QixFQUFDLFVBQVUsRUFBRSxPQUFPLEVBQUUsR0FBRyxFQUFFLGVBQWUsRUFBQyxDQUFDO0lBRTlFLDBEQUEwRDtJQUMxRCxNQUFNLEdBQUcsR0FBRyxNQUFNLENBQUMsU0FBUyxDQUNaLGFBQWEsRUFBRSxNQUE4QixFQUM3QyxLQUEyQixDQUFNLENBQUM7SUFFbEQsSUFBSSxZQUFZLEVBQUU7UUFDaEIsT0FBTyxPQUFPLENBQ0gsR0FBRyxFQUFFLENBQUMsR0FBRyxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUMsRUFBRSxHQUFHLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQyxFQUFFLEdBQUcsQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDLEVBQUUsR0FBRyxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUNuRSxDQUFDO0tBQ1A7SUFFRCxPQUFPLEdBQUcsQ0FBQztBQUNiLENBQUM7QUFFRCxNQUFNLENBQUMsTUFBTSxhQUFhLEdBQUcsRUFBRSxDQUFDLEVBQUMsY0FBYyxFQUFDLENBQUMsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbIi8qKlxuICogQGxpY2Vuc2VcbiAqIENvcHlyaWdodCAyMDIwIEdvb2dsZSBMTEMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuXG4gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgXCJMaWNlbnNlXCIpO1xuICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLlxuICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0XG4gKlxuICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wXG4gKlxuICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZVxuICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gXCJBUyBJU1wiIEJBU0lTLFxuICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuXG4gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kXG4gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS5cbiAqID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4gKi9cblxuaW1wb3J0IHtFTkdJTkV9IGZyb20gJy4uL2VuZ2luZSc7XG5pbXBvcnQge01heFBvb2wzREdyYWQsIE1heFBvb2wzREdyYWRBdHRycywgTWF4UG9vbDNER3JhZElucHV0c30gZnJvbSAnLi4va2VybmVsX25hbWVzJztcbmltcG9ydCB7TmFtZWRBdHRyTWFwfSBmcm9tICcuLi9rZXJuZWxfcmVnaXN0cnknO1xuaW1wb3J0IHtUZW5zb3I0RCwgVGVuc29yNUR9IGZyb20gJy4uL3RlbnNvcic7XG5pbXBvcnQge05hbWVkVGVuc29yTWFwfSBmcm9tICcuLi90ZW5zb3JfdHlwZXMnO1xuaW1wb3J0IHtjb252ZXJ0VG9UZW5zb3J9IGZyb20gJy4uL3RlbnNvcl91dGlsX2Vudic7XG5pbXBvcnQge1RlbnNvckxpa2V9IGZyb20gJy4uL3R5cGVzJztcbmltcG9ydCAqIGFzIHV0aWwgZnJvbSAnLi4vdXRpbCc7XG5cbmltcG9ydCB7Y2hlY2tQYWRPbkRpbVJvdW5kaW5nTW9kZX0gZnJvbSAnLi9jb252X3V0aWwnO1xuaW1wb3J0IHtvcH0gZnJvbSAnLi9vcGVyYXRpb24nO1xuaW1wb3J0IHtyZXNoYXBlfSBmcm9tICcuL3Jlc2hhcGUnO1xuXG4vKipcbiAqIENvbXB1dGVzIHRoZSBiYWNrcHJvcCBvZiBhIDNkIG1heCBwb29sLlxuICpcbiAqIEBwYXJhbSBkeSBUaGUgZHkgZXJyb3IsIG9mIHJhbmsgNSBvZiBzaGFwZVxuICogICAgIFtiYXRjaFNpemUsIGRlcHRoLCBoZWlnaHQsIHdpZHRoLCBjaGFubmVsc10uXG4gKiBhc3N1bWVkLlxuICogQHBhcmFtIGlucHV0IFRoZSBvcmlnaW5hbCBpbnB1dCBpbWFnZSwgb2YgcmFuayA1IG9yIHJhbmsgNCBvZiBzaGFwZVxuICogICAgIFtiYXRjaFNpemUsIGRlcHRoLCBoZWlnaHQsIHdpZHRoLCBjaGFubmVsc10uXG4gKiBAcGFyYW0gb3V0cHV0IFRoZSBvcmlnaW5hbCBvdXRwdXQgaW1hZ2UsIG9mIHJhbmsgNSBvZiBzaGFwZVxuICogICAgIFtiYXRjaFNpemUsIG91dERlcHRoLCBvdXRIZWlnaHQsIG91dFdpZHRoLCBjaGFubmVsc10uXG4gKiBAcGFyYW0gZmlsdGVyU2l6ZSBUaGUgZmlsdGVyIHNpemU6XG4gKiAgICAgYFtmaWx0ZXJEZXB0aCwgZmlsdGVySGVpZ2h0LCBmaWx0ZXJXaWR0aF1gLlxuICogICAgIGBmaWx0ZXJTaXplYCBpcyBhIHNpbmdsZSBudW1iZXIsXG4gKiAgICAgdGhlbiBgZmlsdGVyRGVwdGggPT0gZmlsdGVySGVpZ2h0ID09IGZpbHRlcldpZHRoYC5cbiAqIEBwYXJhbSBzdHJpZGVzIFRoZSBzdHJpZGVzIG9mIHRoZSBwb29saW5nOlxuICogICAgIGBbc3RyaWRlRGVwdGgsIHN0cmlkZUhlaWdodCwgc3RyaWRlV2lkdGhdYC4gSWZcbiAqICAgICBgc3RyaWRlc2AgaXMgYSBzaW5nbGUgbnVtYmVyLCB0aGVuIGBzdHJpZGVIZWlnaHQgPT0gc3RyaWRlV2lkdGhgLlxuICogQHBhcmFtIHBhZCBBIHN0cmluZyBmcm9tOiAnc2FtZScsICd2YWxpZCcuIFRoZSB0eXBlIG9mIHBhZGRpbmcgYWxnb3JpdGhtXG4gKiAgICAgdXNlZCBpbiB0aGUgZm9yd2FyZCBwcm9wIG9mIHRoZSBvcC5cbiAqIEBwYXJhbSBkaW1Sb3VuZGluZ01vZGUgQSBzdHJpbmcgZnJvbTogJ2NlaWwnLCAncm91bmQnLCAnZmxvb3InLiBJZiBub25lIGlzXG4gKiAgICAgcHJvdmlkZWQsIGl0IHdpbGwgZGVmYXVsdCB0byB0cnVuY2F0ZS5cbiAqL1xuZnVuY3Rpb24gbWF4UG9vbDNkR3JhZF88VCBleHRlbmRzIFRlbnNvcjREfFRlbnNvcjVEPihcbiAgICBkeTogVHxUZW5zb3JMaWtlLCBpbnB1dDogVHxUZW5zb3JMaWtlLCBvdXRwdXQ6IFR8VGVuc29yTGlrZSxcbiAgICBmaWx0ZXJTaXplOiBbbnVtYmVyLCBudW1iZXIsIG51bWJlcl18bnVtYmVyLFxuICAgIHN0cmlkZXM6IFtudW1iZXIsIG51bWJlciwgbnVtYmVyXXxudW1iZXIsIHBhZDogJ3ZhbGlkJ3wnc2FtZSd8bnVtYmVyLFxuICAgIGRpbVJvdW5kaW5nTW9kZT86ICdmbG9vcid8J3JvdW5kJ3wnY2VpbCcpOiBUIHtcbiAgY29uc3QgJGR5ID0gY29udmVydFRvVGVuc29yKGR5LCAnZHknLCAnbWF4UG9vbDNkR3JhZCcpO1xuICBjb25zdCAkaW5wdXQgPSBjb252ZXJ0VG9UZW5zb3IoaW5wdXQsICdpbnB1dCcsICdtYXhQb29sM2RHcmFkJyk7XG4gIGNvbnN0ICRvdXRwdXQgPSBjb252ZXJ0VG9UZW5zb3Iob3V0cHV0LCAnb3V0cHV0JywgJ21heFBvb2wzZEdyYWQnKTtcblxuICBsZXQgZHk1RCA9ICRkeSBhcyBUZW5zb3I1RDtcbiAgbGV0IGlucHV0NUQgPSAkaW5wdXQgYXMgVGVuc29yNUQ7XG4gIGxldCBvdXRwdXQ1RCA9ICRvdXRwdXQgYXMgVGVuc29yNUQ7XG4gIGxldCByZXNoYXBlZFRvNUQgPSBmYWxzZTtcblxuICBpZiAoJGlucHV0LnJhbmsgPT09IDQpIHtcbiAgICByZXNoYXBlZFRvNUQgPSB0cnVlO1xuICAgIGR5NUQgPSByZXNoYXBlKFxuICAgICAgICAkZHksIFsxLCAkZHkuc2hhcGVbMF0sICRkeS5zaGFwZVsxXSwgJGR5LnNoYXBlWzJdLCAkZHkuc2hhcGVbM11dKTtcbiAgICBpbnB1dDVEID0gcmVzaGFwZSgkaW5wdXQsIFtcbiAgICAgIDEsICRpbnB1dC5zaGFwZVswXSwgJGlucHV0LnNoYXBlWzFdLCAkaW5wdXQuc2hhcGVbMl0sICRpbnB1dC5zaGFwZVszXVxuICAgIF0pO1xuICAgIG91dHB1dDVEID0gcmVzaGFwZSgkb3V0cHV0LCBbXG4gICAgICAxLCAkb3V0cHV0LnNoYXBlWzBdLCAkb3V0cHV0LnNoYXBlWzFdLCAkb3V0cHV0LnNoYXBlWzJdLCAkb3V0cHV0LnNoYXBlWzNdXG4gICAgXSk7XG4gIH1cblxuICB1dGlsLmFzc2VydChcbiAgICAgIGR5NUQucmFuayA9PT0gNSxcbiAgICAgICgpID0+IGBFcnJvciBpbiBtYXhQb29sM2RHcmFkOiBkeSBtdXN0IGJlIHJhbmsgNSBidXQgZ290IHJhbmsgYCArXG4gICAgICAgICAgYCR7ZHk1RC5yYW5rfS5gKTtcbiAgdXRpbC5hc3NlcnQoXG4gICAgICBpbnB1dDVELnJhbmsgPT09IDUsXG4gICAgICAoKSA9PiBgRXJyb3IgaW4gbWF4UG9vbDNkR3JhZDogaW5wdXQgbXVzdCBiZSByYW5rIDUgYnV0IGdvdCByYW5rIGAgK1xuICAgICAgICAgIGAke2lucHV0NUQucmFua30uYCk7XG4gIHV0aWwuYXNzZXJ0KFxuICAgICAgb3V0cHV0NUQucmFuayA9PT0gNSxcbiAgICAgICgpID0+IGBFcnJvciBpbiBtYXhQb29sM2RHcmFkOiBvdXRwdXQgbXVzdCBiZSByYW5rIDUgYnV0IGdvdCByYW5rIGAgK1xuICAgICAgICAgIGAke291dHB1dDVELnJhbmt9LmApO1xuICBjaGVja1BhZE9uRGltUm91bmRpbmdNb2RlKCdtYXhQb29sM2RHcmFkJywgcGFkLCBkaW1Sb3VuZGluZ01vZGUpO1xuICBjb25zdCBpbnB1dHM6XG4gICAgICBNYXhQb29sM0RHcmFkSW5wdXRzID0ge2R5OiBkeTVELCBpbnB1dDogaW5wdXQ1RCwgb3V0cHV0OiBvdXRwdXQ1RH07XG4gIGNvbnN0IGF0dHJzOiBNYXhQb29sM0RHcmFkQXR0cnMgPSB7ZmlsdGVyU2l6ZSwgc3RyaWRlcywgcGFkLCBkaW1Sb3VuZGluZ01vZGV9O1xuXG4gIC8vIHRzbGludDpkaXNhYmxlLW5leHQtbGluZTogbm8tdW5uZWNlc3NhcnktdHlwZS1hc3NlcnRpb25cbiAgY29uc3QgcmVzID0gRU5HSU5FLnJ1bktlcm5lbChcbiAgICAgICAgICAgICAgICAgIE1heFBvb2wzREdyYWQsIGlucHV0cyBhcyB7fSBhcyBOYW1lZFRlbnNvck1hcCxcbiAgICAgICAgICAgICAgICAgIGF0dHJzIGFzIHt9IGFzIE5hbWVkQXR0ck1hcCkgYXMgVDtcblxuICBpZiAocmVzaGFwZWRUbzVEKSB7XG4gICAgcmV0dXJuIHJlc2hhcGUoXG4gICAgICAgICAgICAgICByZXMsIFtyZXMuc2hhcGVbMV0sIHJlcy5zaGFwZVsyXSwgcmVzLnNoYXBlWzNdLCByZXMuc2hhcGVbNF1dKSBhc1xuICAgICAgICBUO1xuICB9XG5cbiAgcmV0dXJuIHJlcztcbn1cblxuZXhwb3J0IGNvbnN0IG1heFBvb2wzZEdyYWQgPSBvcCh7bWF4UG9vbDNkR3JhZF99KTtcbiJdfQ==","/**\n * @license\n * Copyright 2020 Google LLC. All Rights Reserved.\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n * =============================================================================\n */\nimport { MaxPool3D } from '../kernel_names';\nimport { maxPool3dGrad } from '../ops/max_pool_3d_grad';\nexport const maxPool3DGradConfig = {\n kernelName: MaxPool3D,\n inputsToSave: ['x'],\n outputsToSave: [true],\n gradFunc: (dy, saved, attrs) => {\n const [x, y] = saved;\n const { filterSize, strides, pad, dimRoundingMode } = attrs;\n return {\n x: () => maxPool3dGrad(dy, x, y, filterSize, strides, pad, dimRoundingMode)\n };\n }\n};\n//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiTWF4UG9vbDNEX2dyYWQuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi8uLi90ZmpzLWNvcmUvc3JjL2dyYWRpZW50cy9NYXhQb29sM0RfZ3JhZC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQTs7Ozs7Ozs7Ozs7Ozs7O0dBZUc7QUFFSCxPQUFPLEVBQUMsU0FBUyxFQUFpQixNQUFNLGlCQUFpQixDQUFDO0FBRTFELE9BQU8sRUFBQyxhQUFhLEVBQUMsTUFBTSx5QkFBeUIsQ0FBQztBQUd0RCxNQUFNLENBQUMsTUFBTSxtQkFBbUIsR0FBZTtJQUM3QyxVQUFVLEVBQUUsU0FBUztJQUNyQixZQUFZLEVBQUUsQ0FBQyxHQUFHLENBQUM7SUFDbkIsYUFBYSxFQUFFLENBQUMsSUFBSSxDQUFDO0lBQ3JCLFFBQVEsRUFBRSxDQUFDLEVBQVUsRUFBRSxLQUFlLEVBQUUsS0FBbUIsRUFBRSxFQUFFO1FBQzdELE1BQU0sQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLEdBQUcsS0FBNkIsQ0FBQztRQUM3QyxNQUFNLEVBQUMsVUFBVSxFQUFFLE9BQU8sRUFBRSxHQUFHLEVBQUUsZUFBZSxFQUFDLEdBQzdDLEtBQTZCLENBQUM7UUFFbEMsT0FBTztZQUNMLENBQUMsRUFBRSxHQUFHLEVBQUUsQ0FBQyxhQUFhLENBQ2xCLEVBQWMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLFVBQVUsRUFBRSxPQUFPLEVBQUUsR0FBRyxFQUFFLGVBQWUsQ0FBQztTQUNyRSxDQUFDO0lBQ0osQ0FBQztDQUNGLENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyIvKipcbiAqIEBsaWNlbnNlXG4gKiBDb3B5cmlnaHQgMjAyMCBHb29nbGUgTExDLiBBbGwgUmlnaHRzIFJlc2VydmVkLlxuICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlIFwiTGljZW5zZVwiKTtcbiAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS5cbiAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdFxuICpcbiAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMFxuICpcbiAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmVcbiAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuIFwiQVMgSVNcIiBCQVNJUyxcbiAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLlxuICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZFxuICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuXG4gKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuICovXG5cbmltcG9ydCB7TWF4UG9vbDNELCBNYXhQb29sM0RBdHRyc30gZnJvbSAnLi4va2VybmVsX25hbWVzJztcbmltcG9ydCB7R3JhZENvbmZpZywgTmFtZWRBdHRyTWFwfSBmcm9tICcuLi9rZXJuZWxfcmVnaXN0cnknO1xuaW1wb3J0IHttYXhQb29sM2RHcmFkfSBmcm9tICcuLi9vcHMvbWF4X3Bvb2xfM2RfZ3JhZCc7XG5pbXBvcnQge1RlbnNvciwgVGVuc29yNUR9IGZyb20gJy4uL3RlbnNvcic7XG5cbmV4cG9ydCBjb25zdCBtYXhQb29sM0RHcmFkQ29uZmlnOiBHcmFkQ29uZmlnID0ge1xuICBrZXJuZWxOYW1lOiBNYXhQb29sM0QsXG4gIGlucHV0c1RvU2F2ZTogWyd4J10sXG4gIG91dHB1dHNUb1NhdmU6IFt0cnVlXSxcbiAgZ3JhZEZ1bmM6IChkeTogVGVuc29yLCBzYXZlZDogVGVuc29yW10sIGF0dHJzOiBOYW1lZEF0dHJNYXApID0+IHtcbiAgICBjb25zdCBbeCwgeV0gPSBzYXZlZCBhcyBbVGVuc29yNUQsIFRlbnNvcjVEXTtcbiAgICBjb25zdCB7ZmlsdGVyU2l6ZSwgc3RyaWRlcywgcGFkLCBkaW1Sb3VuZGluZ01vZGV9ID1cbiAgICAgICAgYXR0cnMgYXMge30gYXMgTWF4UG9vbDNEQXR0cnM7XG5cbiAgICByZXR1cm4ge1xuICAgICAgeDogKCkgPT4gbWF4UG9vbDNkR3JhZChcbiAgICAgICAgICBkeSBhcyBUZW5zb3I1RCwgeCwgeSwgZmlsdGVyU2l6ZSwgc3RyaWRlcywgcGFkLCBkaW1Sb3VuZGluZ01vZGUpXG4gICAgfTtcbiAgfVxufTtcbiJdfQ==","/**\n * @license\n * Copyright 2020 Google LLC. All Rights Reserved.\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n * =============================================================================\n */\nimport { ENGINE } from '../engine';\nimport { MaxPoolGrad } from '../kernel_names';\nimport { convertToTensor } from '../tensor_util_env';\nimport * as util from '../util';\nimport * as conv_util from './conv_util';\nimport { op } from './operation';\n/**\n * Computes the backprop of a 2D max pool.\n *\n * @param dy The dy error, of rank 4 or rank 3 of shape\n * [batchSize, height, width, channels]. If rank 3, batch of 1 is\n * assumed.\n * @param input The original input image, of rank 4, of shape\n * [batchSize, height, width, channels].\n * @param output The original output image, of rank 4, of shape\n * [batchSize, outHeight, outWidth, channels].\n * @param filterSize The filter size: `[filterHeight, filterWidth]`. If\n * `filterSize` is a single number, then `filterHeight == filterWidth`.\n * @param strides The strides of the pooling: `[strideHeight, strideWidth]`. If\n * `strides` is a single number, then `strideHeight == strideWidth`.\n * @param pad The type of padding algorithm used in the forward prop of the op.\n * 'same', 'valid', for more info, see this guide:\n * [https://www.tensorflow.org/api_docs/python/tf/nn/convolution](\n * https://www.tensorflow.org/api_docs/python/tf/nn/convolution)\n * @param dimRoundingMode A string from: 'ceil', 'round', 'floor'. If none is\n * provided, it will default to truncate.\n */\nfunction maxPoolGrad_(dy, input, output, filterSize, strides, pad, dimRoundingMode) {\n const $dy = convertToTensor(dy, 'dy', 'maxPoolGrad');\n const $input = convertToTensor(input, 'input', 'maxPoolGrad');\n const $output = convertToTensor(output, 'output', 'maxPoolGrad');\n util.assert($input.rank === $dy.rank, () => `Rank of input (${$input.rank}) does not match rank of dy ` +\n `(${$dy.rank})`);\n util.assert($dy.rank === 4, () => `Error in maxPoolGrad: dy must be rank 4 but got rank ` +\n `${$dy.rank}.`);\n util.assert($input.rank === 4, () => `Error in maxPoolGrad: input must be rank 4 but got rank ` +\n `${$input.rank}.`);\n conv_util.checkPadOnDimRoundingMode('maxPoolGrad', pad, dimRoundingMode);\n const inputs = { dy: $dy, input: $input, output: $output };\n const attrs = { filterSize, strides, pad, dimRoundingMode };\n // tslint:disable-next-line: no-unnecessary-type-assertion\n return ENGINE.runKernel(MaxPoolGrad, inputs, attrs);\n}\nexport const maxPoolGrad = op({ maxPoolGrad_ });\n//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibWF4X3Bvb2xfZ3JhZC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uLy4uL3RmanMtY29yZS9zcmMvb3BzL21heF9wb29sX2dyYWQudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUE7Ozs7Ozs7Ozs7Ozs7OztHQWVHO0FBRUgsT0FBTyxFQUFDLE1BQU0sRUFBQyxNQUFNLFdBQVcsQ0FBQztBQUNqQyxPQUFPLEVBQUMsV0FBVyxFQUFzQyxNQUFNLGlCQUFpQixDQUFDO0FBSWpGLE9BQU8sRUFBQyxlQUFlLEVBQUMsTUFBTSxvQkFBb0IsQ0FBQztBQUVuRCxPQUFPLEtBQUssSUFBSSxNQUFNLFNBQVMsQ0FBQztBQUVoQyxPQUFPLEtBQUssU0FBUyxNQUFNLGFBQWEsQ0FBQztBQUN6QyxPQUFPLEVBQUMsRUFBRSxFQUFDLE1BQU0sYUFBYSxDQUFDO0FBRS9COzs7Ozs7Ozs7Ozs7Ozs7Ozs7OztHQW9CRztBQUNILFNBQVMsWUFBWSxDQUNqQixFQUF1QixFQUFFLEtBQTBCLEVBQ25ELE1BQTJCLEVBQUUsVUFBbUMsRUFDaEUsT0FBZ0MsRUFDaEMsR0FBb0QsRUFDcEQsZUFBd0M7SUFDMUMsTUFBTSxHQUFHLEdBQUcsZUFBZSxDQUFDLEVBQUUsRUFBRSxJQUFJLEVBQUUsYUFBYSxDQUFDLENBQUM7SUFDckQsTUFBTSxNQUFNLEdBQUcsZUFBZSxDQUFDLEtBQUssRUFBRSxPQUFPLEVBQUUsYUFBYSxDQUFDLENBQUM7SUFDOUQsTUFBTSxPQUFPLEdBQUcsZUFBZSxDQUFDLE1BQU0sRUFBRSxRQUFRLEVBQUUsYUFBYSxDQUFDLENBQUM7SUFFakUsSUFBSSxDQUFDLE1BQU0sQ0FDUCxNQUFNLENBQUMsSUFBSSxLQUFLLEdBQUcsQ0FBQyxJQUFJLEVBQ3hCLEdBQUcsRUFBRSxDQUFDLGtCQUFrQixNQUFNLENBQUMsSUFBSSw4QkFBOEI7UUFDN0QsSUFBSSxHQUFHLENBQUMsSUFBSSxHQUFHLENBQUMsQ0FBQztJQUV6QixJQUFJLENBQUMsTUFBTSxDQUNQLEdBQUcsQ0FBQyxJQUFJLEtBQUssQ0FBQyxFQUNkLEdBQUcsRUFBRSxDQUFDLHVEQUF1RDtRQUN6RCxHQUFHLEdBQUcsQ0FBQyxJQUFJLEdBQUcsQ0FBQyxDQUFDO0lBQ3hCLElBQUksQ0FBQyxNQUFNLENBQ1AsTUFBTSxDQUFDLElBQUksS0FBSyxDQUFDLEVBQ2pCLEdBQUcsRUFBRSxDQUFDLDBEQUEwRDtRQUM1RCxHQUFHLE1BQU0sQ0FBQyxJQUFJLEdBQUcsQ0FBQyxDQUFDO0lBQzNCLFNBQVMsQ0FBQyx5QkFBeUIsQ0FBQyxhQUFhLEVBQUUsR0FBRyxFQUFFLGVBQWUsQ0FBQyxDQUFDO0lBQ3pFLE1BQU0sTUFBTSxHQUFzQixFQUFDLEVBQUUsRUFBRSxHQUFHLEVBQUUsS0FBSyxFQUFFLE1BQU0sRUFBRSxNQUFNLEVBQUUsT0FBTyxFQUFDLENBQUM7SUFDNUUsTUFBTSxLQUFLLEdBQXFCLEVBQUMsVUFBVSxFQUFFLE9BQU8sRUFBRSxHQUFHLEVBQUUsZUFBZSxFQUFDLENBQUM7SUFFNUUsMERBQTBEO0lBQzFELE9BQU8sTUFBTSxDQUFDLFNBQVMsQ0FDWixXQUFXLEVBQUUsTUFBOEIsRUFDM0MsS0FBMkIsQ0FBYSxDQUFDO0FBQ3RELENBQUM7QUFFRCxNQUFNLENBQUMsTUFBTSxXQUFXLEdBQUcsRUFBRSxDQUFDLEVBQUMsWUFBWSxFQUFDLENBQUMsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbIi8qKlxuICogQGxpY2Vuc2VcbiAqIENvcHlyaWdodCAyMDIwIEdvb2dsZSBMTEMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuXG4gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgXCJMaWNlbnNlXCIpO1xuICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLlxuICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0XG4gKlxuICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wXG4gKlxuICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZVxuICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gXCJBUyBJU1wiIEJBU0lTLFxuICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuXG4gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kXG4gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS5cbiAqID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4gKi9cblxuaW1wb3J0IHtFTkdJTkV9IGZyb20gJy4uL2VuZ2luZSc7XG5pbXBvcnQge01heFBvb2xHcmFkLCBNYXhQb29sR3JhZEF0dHJzLCBNYXhQb29sR3JhZElucHV0c30gZnJvbSAnLi4va2VybmVsX25hbWVzJztcbmltcG9ydCB7TmFtZWRBdHRyTWFwfSBmcm9tICcuLi9rZXJuZWxfcmVnaXN0cnknO1xuaW1wb3J0IHtUZW5zb3I0RH0gZnJvbSAnLi4vdGVuc29yJztcbmltcG9ydCB7TmFtZWRUZW5zb3JNYXB9IGZyb20gJy4uL3RlbnNvcl90eXBlcyc7XG5pbXBvcnQge2NvbnZlcnRUb1RlbnNvcn0gZnJvbSAnLi4vdGVuc29yX3V0aWxfZW52JztcbmltcG9ydCB7VGVuc29yTGlrZX0gZnJvbSAnLi4vdHlwZXMnO1xuaW1wb3J0ICogYXMgdXRpbCBmcm9tICcuLi91dGlsJztcblxuaW1wb3J0ICogYXMgY29udl91dGlsIGZyb20gJy4vY29udl91dGlsJztcbmltcG9ydCB7b3B9IGZyb20gJy4vb3BlcmF0aW9uJztcblxuLyoqXG4gKiBDb21wdXRlcyB0aGUgYmFja3Byb3Agb2YgYSAyRCBtYXggcG9vbC5cbiAqXG4gKiBAcGFyYW0gZHkgVGhlIGR5IGVycm9yLCBvZiByYW5rIDQgb3IgcmFuayAzIG9mIHNoYXBlXG4gKiAgICAgW2JhdGNoU2l6ZSwgaGVpZ2h0LCB3aWR0aCwgY2hhbm5lbHNdLiBJZiByYW5rIDMsIGJhdGNoIG9mIDEgaXNcbiAqIGFzc3VtZWQuXG4gKiBAcGFyYW0gaW5wdXQgVGhlIG9yaWdpbmFsIGlucHV0IGltYWdlLCBvZiByYW5rIDQsIG9mIHNoYXBlXG4gKiAgICAgW2JhdGNoU2l6ZSwgaGVpZ2h0LCB3aWR0aCwgY2hhbm5lbHNdLlxuICogQHBhcmFtIG91dHB1dCBUaGUgb3JpZ2luYWwgb3V0cHV0IGltYWdlLCBvZiByYW5rIDQsIG9mIHNoYXBlXG4gKiAgICAgW2JhdGNoU2l6ZSwgb3V0SGVpZ2h0LCBvdXRXaWR0aCwgY2hhbm5lbHNdLlxuICogQHBhcmFtIGZpbHRlclNpemUgVGhlIGZpbHRlciBzaXplOiBgW2ZpbHRlckhlaWdodCwgZmlsdGVyV2lkdGhdYC4gSWZcbiAqICAgICBgZmlsdGVyU2l6ZWAgaXMgYSBzaW5nbGUgbnVtYmVyLCB0aGVuIGBmaWx0ZXJIZWlnaHQgPT0gZmlsdGVyV2lkdGhgLlxuICogQHBhcmFtIHN0cmlkZXMgVGhlIHN0cmlkZXMgb2YgdGhlIHBvb2xpbmc6IGBbc3RyaWRlSGVpZ2h0LCBzdHJpZGVXaWR0aF1gLiBJZlxuICogICAgIGBzdHJpZGVzYCBpcyBhIHNpbmdsZSBudW1iZXIsIHRoZW4gYHN0cmlkZUhlaWdodCA9PSBzdHJpZGVXaWR0aGAuXG4gKiBAcGFyYW0gcGFkIFRoZSB0eXBlIG9mIHBhZGRpbmcgYWxnb3JpdGhtIHVzZWQgaW4gdGhlIGZvcndhcmQgcHJvcCBvZiB0aGUgb3AuXG4gKiAgICAgJ3NhbWUnLCAndmFsaWQnLCBmb3IgbW9yZSBpbmZvLCBzZWUgdGhpcyBndWlkZTpcbiAqICAgICBbaHR0cHM6Ly93d3cudGVuc29yZmxvdy5vcmcvYXBpX2RvY3MvcHl0aG9uL3RmL25uL2NvbnZvbHV0aW9uXShcbiAqICAgICAgICAgIGh0dHBzOi8vd3d3LnRlbnNvcmZsb3cub3JnL2FwaV9kb2NzL3B5dGhvbi90Zi9ubi9jb252b2x1dGlvbilcbiAqIEBwYXJhbSBkaW1Sb3VuZGluZ01vZGUgQSBzdHJpbmcgZnJvbTogJ2NlaWwnLCAncm91bmQnLCAnZmxvb3InLiBJZiBub25lIGlzXG4gKiAgICAgcHJvdmlkZWQsIGl0IHdpbGwgZGVmYXVsdCB0byB0cnVuY2F0ZS5cbiAqL1xuZnVuY3Rpb24gbWF4UG9vbEdyYWRfKFxuICAgIGR5OiBUZW5zb3I0RHxUZW5zb3JMaWtlLCBpbnB1dDogVGVuc29yNER8VGVuc29yTGlrZSxcbiAgICBvdXRwdXQ6IFRlbnNvcjREfFRlbnNvckxpa2UsIGZpbHRlclNpemU6IFtudW1iZXIsIG51bWJlcl18bnVtYmVyLFxuICAgIHN0cmlkZXM6IFtudW1iZXIsIG51bWJlcl18bnVtYmVyLFxuICAgIHBhZDogJ3ZhbGlkJ3wnc2FtZSd8bnVtYmVyfGNvbnZfdXRpbC5FeHBsaWNpdFBhZGRpbmcsXG4gICAgZGltUm91bmRpbmdNb2RlPzogJ2Zsb29yJ3wncm91bmQnfCdjZWlsJyk6IFRlbnNvcjREIHtcbiAgY29uc3QgJGR5ID0gY29udmVydFRvVGVuc29yKGR5LCAnZHknLCAnbWF4UG9vbEdyYWQnKTtcbiAgY29uc3QgJGlucHV0ID0gY29udmVydFRvVGVuc29yKGlucHV0LCAnaW5wdXQnLCAnbWF4UG9vbEdyYWQnKTtcbiAgY29uc3QgJG91dHB1dCA9IGNvbnZlcnRUb1RlbnNvcihvdXRwdXQsICdvdXRwdXQnLCAnbWF4UG9vbEdyYWQnKTtcblxuICB1dGlsLmFzc2VydChcbiAgICAgICRpbnB1dC5yYW5rID09PSAkZHkucmFuayxcbiAgICAgICgpID0+IGBSYW5rIG9mIGlucHV0ICgkeyRpbnB1dC5yYW5rfSkgZG9lcyBub3QgbWF0Y2ggcmFuayBvZiBkeSBgICtcbiAgICAgICAgICBgKCR7JGR5LnJhbmt9KWApO1xuXG4gIHV0aWwuYXNzZXJ0KFxuICAgICAgJGR5LnJhbmsgPT09IDQsXG4gICAgICAoKSA9PiBgRXJyb3IgaW4gbWF4UG9vbEdyYWQ6IGR5IG11c3QgYmUgcmFuayA0IGJ1dCBnb3QgcmFuayBgICtcbiAgICAgICAgICBgJHskZHkucmFua30uYCk7XG4gIHV0aWwuYXNzZXJ0KFxuICAgICAgJGlucHV0LnJhbmsgPT09IDQsXG4gICAgICAoKSA9PiBgRXJyb3IgaW4gbWF4UG9vbEdyYWQ6IGlucHV0IG11c3QgYmUgcmFuayA0IGJ1dCBnb3QgcmFuayBgICtcbiAgICAgICAgICBgJHskaW5wdXQucmFua30uYCk7XG4gIGNvbnZfdXRpbC5jaGVja1BhZE9uRGltUm91bmRpbmdNb2RlKCdtYXhQb29sR3JhZCcsIHBhZCwgZGltUm91bmRpbmdNb2RlKTtcbiAgY29uc3QgaW5wdXRzOiBNYXhQb29sR3JhZElucHV0cyA9IHtkeTogJGR5LCBpbnB1dDogJGlucHV0LCBvdXRwdXQ6ICRvdXRwdXR9O1xuICBjb25zdCBhdHRyczogTWF4UG9vbEdyYWRBdHRycyA9IHtmaWx0ZXJTaXplLCBzdHJpZGVzLCBwYWQsIGRpbVJvdW5kaW5nTW9kZX07XG5cbiAgLy8gdHNsaW50OmRpc2FibGUtbmV4dC1saW5lOiBuby11bm5lY2Vzc2FyeS10eXBlLWFzc2VydGlvblxuICByZXR1cm4gRU5HSU5FLnJ1bktlcm5lbChcbiAgICAgICAgICAgICBNYXhQb29sR3JhZCwgaW5wdXRzIGFzIHt9IGFzIE5hbWVkVGVuc29yTWFwLFxuICAgICAgICAgICAgIGF0dHJzIGFzIHt9IGFzIE5hbWVkQXR0ck1hcCkgYXMgVGVuc29yNEQ7XG59XG5cbmV4cG9ydCBjb25zdCBtYXhQb29sR3JhZCA9IG9wKHttYXhQb29sR3JhZF99KTtcbiJdfQ==","/**\n * @license\n * Copyright 2020 Google LLC. All Rights Reserved.\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n * =============================================================================\n */\nimport { MaxPool } from '../kernel_names';\nimport { maxPoolGrad } from '../ops/max_pool_grad';\nexport const maxPoolGradConfig = {\n kernelName: MaxPool,\n inputsToSave: ['x'],\n outputsToSave: [true],\n gradFunc: (dy, saved, attrs) => {\n const [x, y] = saved;\n const { filterSize, strides, pad } = attrs;\n return {\n x: () => maxPoolGrad(dy, x, y, filterSize, strides, pad)\n };\n }\n};\n//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiTWF4UG9vbF9ncmFkLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vLi4vdGZqcy1jb3JlL3NyYy9ncmFkaWVudHMvTWF4UG9vbF9ncmFkLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBOzs7Ozs7Ozs7Ozs7Ozs7R0FlRztBQUVILE9BQU8sRUFBQyxPQUFPLEVBQWUsTUFBTSxpQkFBaUIsQ0FBQztBQUV0RCxPQUFPLEVBQUMsV0FBVyxFQUFDLE1BQU0sc0JBQXNCLENBQUM7QUFHakQsTUFBTSxDQUFDLE1BQU0saUJBQWlCLEdBQWU7SUFDM0MsVUFBVSxFQUFFLE9BQU87SUFDbkIsWUFBWSxFQUFFLENBQUMsR0FBRyxDQUFDO0lBQ25CLGFBQWEsRUFBRSxDQUFDLElBQUksQ0FBQztJQUNyQixRQUFRLEVBQUUsQ0FBQyxFQUFVLEVBQUUsS0FBZSxFQUFFLEtBQW1CLEVBQUUsRUFBRTtRQUM3RCxNQUFNLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxHQUFHLEtBQTZCLENBQUM7UUFDN0MsTUFBTSxFQUFDLFVBQVUsRUFBRSxPQUFPLEVBQUUsR0FBRyxFQUFDLEdBQUcsS0FBMkIsQ0FBQztRQUUvRCxPQUFPO1lBQ0wsQ0FBQyxFQUFFLEdBQUcsRUFBRSxDQUFDLFdBQVcsQ0FBQyxFQUFjLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxVQUFVLEVBQUUsT0FBTyxFQUFFLEdBQUcsQ0FBQztTQUNyRSxDQUFDO0lBQ0osQ0FBQztDQUNGLENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyIvKipcbiAqIEBsaWNlbnNlXG4gKiBDb3B5cmlnaHQgMjAyMCBHb29nbGUgTExDLiBBbGwgUmlnaHRzIFJlc2VydmVkLlxuICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlIFwiTGljZW5zZVwiKTtcbiAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS5cbiAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdFxuICpcbiAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMFxuICpcbiAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmVcbiAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuIFwiQVMgSVNcIiBCQVNJUyxcbiAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLlxuICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZFxuICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuXG4gKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuICovXG5cbmltcG9ydCB7TWF4UG9vbCwgTWF4UG9vbEF0dHJzfSBmcm9tICcuLi9rZXJuZWxfbmFtZXMnO1xuaW1wb3J0IHtHcmFkQ29uZmlnLCBOYW1lZEF0dHJNYXB9IGZyb20gJy4uL2tlcm5lbF9yZWdpc3RyeSc7XG5pbXBvcnQge21heFBvb2xHcmFkfSBmcm9tICcuLi9vcHMvbWF4X3Bvb2xfZ3JhZCc7XG5pbXBvcnQge1RlbnNvciwgVGVuc29yNER9IGZyb20gJy4uL3RlbnNvcic7XG5cbmV4cG9ydCBjb25zdCBtYXhQb29sR3JhZENvbmZpZzogR3JhZENvbmZpZyA9IHtcbiAga2VybmVsTmFtZTogTWF4UG9vbCxcbiAgaW5wdXRzVG9TYXZlOiBbJ3gnXSxcbiAgb3V0cHV0c1RvU2F2ZTogW3RydWVdLFxuICBncmFkRnVuYzogKGR5OiBUZW5zb3IsIHNhdmVkOiBUZW5zb3JbXSwgYXR0cnM6IE5hbWVkQXR0ck1hcCkgPT4ge1xuICAgIGNvbnN0IFt4LCB5XSA9IHNhdmVkIGFzIFtUZW5zb3I0RCwgVGVuc29yNERdO1xuICAgIGNvbnN0IHtmaWx0ZXJTaXplLCBzdHJpZGVzLCBwYWR9ID0gYXR0cnMgYXMge30gYXMgTWF4UG9vbEF0dHJzO1xuXG4gICAgcmV0dXJuIHtcbiAgICAgIHg6ICgpID0+IG1heFBvb2xHcmFkKGR5IGFzIFRlbnNvcjRELCB4LCB5LCBmaWx0ZXJTaXplLCBzdHJpZGVzLCBwYWQpXG4gICAgfTtcbiAgfVxufTtcbiJdfQ==","/**\n * @license\n * Copyright 2020 Google LLC. All Rights Reserved.\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n * =============================================================================\n */\nimport { Mean } from '../kernel_names';\nimport { computeOutAndReduceShapes } from '../ops/axis_util';\nimport { div } from '../ops/div';\nimport { mul } from '../ops/mul';\nimport { ones } from '../ops/ones';\nimport { reshape } from '../ops/reshape';\nimport * as util from '../util';\nexport const meanGradConfig = {\n kernelName: Mean,\n inputsToSave: ['x'],\n gradFunc: (dy, saved, attrs) => {\n const [x] = saved;\n const { axis } = attrs;\n const axes = util.parseAxisParam(axis, x.shape);\n const shapes = computeOutAndReduceShapes(x.shape, axes);\n const reduceShape = shapes[1];\n const reduceSize = util.sizeFromShape(reduceShape);\n const derX = () => {\n const expandedDyShape = x.shape.slice();\n axes.forEach(axis => {\n expandedDyShape[axis] = 1;\n });\n const expandedDy = reshape(dy, expandedDyShape);\n const res = div(mul(expandedDy, ones(x.shape, 'float32')), reduceSize);\n return res;\n };\n return { x: derX };\n }\n};\n//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiTWVhbl9ncmFkLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vLi4vdGZqcy1jb3JlL3NyYy9ncmFkaWVudHMvTWVhbl9ncmFkLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBOzs7Ozs7Ozs7Ozs7Ozs7R0FlRztBQUVILE9BQU8sRUFBQyxJQUFJLEVBQVksTUFBTSxpQkFBaUIsQ0FBQztBQUVoRCxPQUFPLEVBQUMseUJBQXlCLEVBQUMsTUFBTSxrQkFBa0IsQ0FBQztBQUMzRCxPQUFPLEVBQUMsR0FBRyxFQUFDLE1BQU0sWUFBWSxDQUFDO0FBQy9CLE9BQU8sRUFBQyxHQUFHLEVBQUMsTUFBTSxZQUFZLENBQUM7QUFDL0IsT0FBTyxFQUFDLElBQUksRUFBQyxNQUFNLGFBQWEsQ0FBQztBQUNqQyxPQUFPLEVBQUMsT0FBTyxFQUFDLE1BQU0sZ0JBQWdCLENBQUM7QUFFdkMsT0FBTyxLQUFLLElBQUksTUFBTSxTQUFTLENBQUM7QUFFaEMsTUFBTSxDQUFDLE1BQU0sY0FBYyxHQUFlO0lBQ3hDLFVBQVUsRUFBRSxJQUFJO0lBQ2hCLFlBQVksRUFBRSxDQUFDLEdBQUcsQ0FBQztJQUNuQixRQUFRLEVBQUUsQ0FBQyxFQUFVLEVBQUUsS0FBZSxFQUFFLEtBQW1CLEVBQUUsRUFBRTtRQUM3RCxNQUFNLENBQUMsQ0FBQyxDQUFDLEdBQUcsS0FBSyxDQUFDO1FBQ2xCLE1BQU0sRUFBQyxJQUFJLEVBQUMsR0FBRyxLQUF3QixDQUFDO1FBQ3hDLE1BQU0sSUFBSSxHQUFHLElBQUksQ0FBQyxjQUFjLENBQUMsSUFBSSxFQUFFLENBQUMsQ0FBQyxLQUFLLENBQUMsQ0FBQztRQUNoRCxNQUFNLE1BQU0sR0FBRyx5QkFBeUIsQ0FBQyxDQUFDLENBQUMsS0FBSyxFQUFFLElBQUksQ0FBQyxDQUFDO1FBQ3hELE1BQU0sV0FBVyxHQUFHLE1BQU0sQ0FBQyxDQUFDLENBQUMsQ0FBQztRQUM5QixNQUFNLFVBQVUsR0FBRyxJQUFJLENBQUMsYUFBYSxDQUFDLFdBQVcsQ0FBQyxDQUFDO1FBRW5ELE1BQU0sSUFBSSxHQUFHLEdBQUcsRUFBRTtZQUNoQixNQUFNLGVBQWUsR0FBRyxDQUFDLENBQUMsS0FBSyxDQUFDLEtBQUssRUFBRSxDQUFDO1lBQ3hDLElBQUksQ0FBQyxPQUFPLENBQUMsSUFBSSxDQUFDLEVBQUU7Z0JBQ2xCLGVBQWUsQ0FBQyxJQUFJLENBQUMsR0FBRyxDQUFDLENBQUM7WUFDNUIsQ0FBQyxDQUFDLENBQUM7WUFDSCxNQUFNLFVBQVUsR0FBRyxPQUFPLENBQUMsRUFBRSxFQUFFLGVBQWUsQ0FBQyxDQUFDO1lBQ2hELE1BQU0sR0FBRyxHQUFHLEdBQUcsQ0FBQyxHQUFHLENBQUMsVUFBVSxFQUFFLElBQUksQ0FBQyxDQUFDLENBQUMsS0FBSyxFQUFFLFNBQVMsQ0FBQyxDQUFDLEVBQUUsVUFBVSxDQUFDLENBQUM7WUFDdkUsT0FBTyxHQUFHLENBQUM7UUFDYixDQUFDLENBQUM7UUFFRixPQUFPLEVBQUMsQ0FBQyxFQUFFLElBQUksRUFBQyxDQUFDO0lBQ25CLENBQUM7Q0FDRixDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiLyoqXG4gKiBAbGljZW5zZVxuICogQ29weXJpZ2h0IDIwMjAgR29vZ2xlIExMQy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC5cbiAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSBcIkxpY2Vuc2VcIik7XG4gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuXG4gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXRcbiAqXG4gKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjBcbiAqXG4gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlXG4gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiBcIkFTIElTXCIgQkFTSVMsXG4gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC5cbiAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmRcbiAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLlxuICogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbiAqL1xuXG5pbXBvcnQge01lYW4sIE1lYW5BdHRyc30gZnJvbSAnLi4va2VybmVsX25hbWVzJztcbmltcG9ydCB7R3JhZENvbmZpZywgTmFtZWRBdHRyTWFwfSBmcm9tICcuLi9rZXJuZWxfcmVnaXN0cnknO1xuaW1wb3J0IHtjb21wdXRlT3V0QW5kUmVkdWNlU2hhcGVzfSBmcm9tICcuLi9vcHMvYXhpc191dGlsJztcbmltcG9ydCB7ZGl2fSBmcm9tICcuLi9vcHMvZGl2JztcbmltcG9ydCB7bXVsfSBmcm9tICcuLi9vcHMvbXVsJztcbmltcG9ydCB7b25lc30gZnJvbSAnLi4vb3BzL29uZXMnO1xuaW1wb3J0IHtyZXNoYXBlfSBmcm9tICcuLi9vcHMvcmVzaGFwZSc7XG5pbXBvcnQge1RlbnNvcn0gZnJvbSAnLi4vdGVuc29yJztcbmltcG9ydCAqIGFzIHV0aWwgZnJvbSAnLi4vdXRpbCc7XG5cbmV4cG9ydCBjb25zdCBtZWFuR3JhZENvbmZpZzogR3JhZENvbmZpZyA9IHtcbiAga2VybmVsTmFtZTogTWVhbixcbiAgaW5wdXRzVG9TYXZlOiBbJ3gnXSxcbiAgZ3JhZEZ1bmM6IChkeTogVGVuc29yLCBzYXZlZDogVGVuc29yW10sIGF0dHJzOiBOYW1lZEF0dHJNYXApID0+IHtcbiAgICBjb25zdCBbeF0gPSBzYXZlZDtcbiAgICBjb25zdCB7YXhpc30gPSBhdHRycyBhcyB7fSBhcyBNZWFuQXR0cnM7XG4gICAgY29uc3QgYXhlcyA9IHV0aWwucGFyc2VBeGlzUGFyYW0oYXhpcywgeC5zaGFwZSk7XG4gICAgY29uc3Qgc2hhcGVzID0gY29tcHV0ZU91dEFuZFJlZHVjZVNoYXBlcyh4LnNoYXBlLCBheGVzKTtcbiAgICBjb25zdCByZWR1Y2VTaGFwZSA9IHNoYXBlc1sxXTtcbiAgICBjb25zdCByZWR1Y2VTaXplID0gdXRpbC5zaXplRnJvbVNoYXBlKHJlZHVjZVNoYXBlKTtcblxuICAgIGNvbnN0IGRlclggPSAoKSA9PiB7XG4gICAgICBjb25zdCBleHBhbmRlZER5U2hhcGUgPSB4LnNoYXBlLnNsaWNlKCk7XG4gICAgICBheGVzLmZvckVhY2goYXhpcyA9PiB7XG4gICAgICAgIGV4cGFuZGVkRHlTaGFwZVtheGlzXSA9IDE7XG4gICAgICB9KTtcbiAgICAgIGNvbnN0IGV4cGFuZGVkRHkgPSByZXNoYXBlKGR5LCBleHBhbmRlZER5U2hhcGUpO1xuICAgICAgY29uc3QgcmVzID0gZGl2KG11bChleHBhbmRlZER5LCBvbmVzKHguc2hhcGUsICdmbG9hdDMyJykpLCByZWR1Y2VTaXplKTtcbiAgICAgIHJldHVybiByZXM7XG4gICAgfTtcblxuICAgIHJldHVybiB7eDogZGVyWH07XG4gIH1cbn07XG4iXX0=","/**\n * @license\n * Copyright 2020 Google LLC. All Rights Reserved.\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n * =============================================================================\n */\nimport { Min } from '../kernel_names';\nimport * as util from '../util';\nimport { gradForMinAndMax } from './min_max_grad_util';\nexport const minGradConfig = {\n kernelName: Min,\n inputsToSave: ['x'],\n outputsToSave: [true],\n gradFunc: (dy, saved, attrs) => {\n const minAttrs = attrs;\n const { axis } = minAttrs;\n const [x, y] = saved;\n const origAxes = util.parseAxisParam(axis, x.shape);\n const minGrad = gradForMinAndMax(dy, y, x, origAxes);\n return {\n x: () => {\n return minGrad['x']();\n }\n };\n }\n};\n//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiTWluX2dyYWQuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi8uLi90ZmpzLWNvcmUvc3JjL2dyYWRpZW50cy9NaW5fZ3JhZC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQTs7Ozs7Ozs7Ozs7Ozs7O0dBZUc7QUFFSCxPQUFPLEVBQUMsR0FBRyxFQUFXLE1BQU0saUJBQWlCLENBQUM7QUFHOUMsT0FBTyxLQUFLLElBQUksTUFBTSxTQUFTLENBQUM7QUFFaEMsT0FBTyxFQUFDLGdCQUFnQixFQUFDLE1BQU0scUJBQXFCLENBQUM7QUFFckQsTUFBTSxDQUFDLE1BQU0sYUFBYSxHQUFlO0lBQ3ZDLFVBQVUsRUFBRSxHQUFHO0lBQ2YsWUFBWSxFQUFFLENBQUMsR0FBRyxDQUFDO0lBQ25CLGFBQWEsRUFBRSxDQUFDLElBQUksQ0FBQztJQUNyQixRQUFRLEVBQUUsQ0FBQyxFQUFVLEVBQUUsS0FBZSxFQUFFLEtBQW1CLEVBQUUsRUFBRTtRQUM3RCxNQUFNLFFBQVEsR0FBYSxLQUF1QixDQUFDO1FBQ25ELE1BQU0sRUFBQyxJQUFJLEVBQUMsR0FBRyxRQUFRLENBQUM7UUFDeEIsTUFBTSxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsR0FBRyxLQUFLLENBQUM7UUFDckIsTUFBTSxRQUFRLEdBQUcsSUFBSSxDQUFDLGNBQWMsQ0FBQyxJQUFJLEVBQUUsQ0FBQyxDQUFDLEtBQUssQ0FBQyxDQUFDO1FBQ3BELE1BQU0sT0FBTyxHQUFHLGdCQUFnQixDQUFDLEVBQUUsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLFFBQVEsQ0FBQyxDQUFDO1FBQ3JELE9BQU87WUFDTCxDQUFDLEVBQUUsR0FBRyxFQUFFO2dCQUNOLE9BQU8sT0FBTyxDQUFDLEdBQUcsQ0FBQyxFQUFFLENBQUM7WUFDeEIsQ0FBQztTQUNGLENBQUM7SUFDSixDQUFDO0NBQ0YsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbIi8qKlxuICogQGxpY2Vuc2VcbiAqIENvcHlyaWdodCAyMDIwIEdvb2dsZSBMTEMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuXG4gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgXCJMaWNlbnNlXCIpO1xuICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLlxuICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0XG4gKlxuICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wXG4gKlxuICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZVxuICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gXCJBUyBJU1wiIEJBU0lTLFxuICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuXG4gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kXG4gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS5cbiAqID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4gKi9cblxuaW1wb3J0IHtNaW4sIE1pbkF0dHJzfSBmcm9tICcuLi9rZXJuZWxfbmFtZXMnO1xuaW1wb3J0IHtHcmFkQ29uZmlnLCBOYW1lZEF0dHJNYXB9IGZyb20gJy4uL2tlcm5lbF9yZWdpc3RyeSc7XG5pbXBvcnQge1RlbnNvcn0gZnJvbSAnLi4vdGVuc29yJztcbmltcG9ydCAqIGFzIHV0aWwgZnJvbSAnLi4vdXRpbCc7XG5cbmltcG9ydCB7Z3JhZEZvck1pbkFuZE1heH0gZnJvbSAnLi9taW5fbWF4X2dyYWRfdXRpbCc7XG5cbmV4cG9ydCBjb25zdCBtaW5HcmFkQ29uZmlnOiBHcmFkQ29uZmlnID0ge1xuICBrZXJuZWxOYW1lOiBNaW4sXG4gIGlucHV0c1RvU2F2ZTogWyd4J10sXG4gIG91dHB1dHNUb1NhdmU6IFt0cnVlXSxcbiAgZ3JhZEZ1bmM6IChkeTogVGVuc29yLCBzYXZlZDogVGVuc29yW10sIGF0dHJzOiBOYW1lZEF0dHJNYXApID0+IHtcbiAgICBjb25zdCBtaW5BdHRyczogTWluQXR0cnMgPSBhdHRycyBhcyB7fSBhcyBNaW5BdHRycztcbiAgICBjb25zdCB7YXhpc30gPSBtaW5BdHRycztcbiAgICBjb25zdCBbeCwgeV0gPSBzYXZlZDtcbiAgICBjb25zdCBvcmlnQXhlcyA9IHV0aWwucGFyc2VBeGlzUGFyYW0oYXhpcywgeC5zaGFwZSk7XG4gICAgY29uc3QgbWluR3JhZCA9IGdyYWRGb3JNaW5BbmRNYXgoZHksIHksIHgsIG9yaWdBeGVzKTtcbiAgICByZXR1cm4ge1xuICAgICAgeDogKCkgPT4ge1xuICAgICAgICByZXR1cm4gbWluR3JhZFsneCddKCk7XG4gICAgICB9XG4gICAgfTtcbiAgfVxufTtcbiJdfQ==","/**\n * @license\n * Copyright 2020 Google LLC. All Rights Reserved.\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n * =============================================================================\n */\nimport { Minimum } from '../kernel_names';\nimport { cast } from '../ops/cast';\nimport { greater } from '../ops/greater';\nimport { lessEqual } from '../ops/less_equal';\nimport { mul } from '../ops/mul';\nexport const minimumGradConfig = {\n kernelName: Minimum,\n inputsToSave: ['a', 'b'],\n gradFunc: (dy, saved) => {\n const [a, b] = saved;\n const derA = () => mul(dy, cast(lessEqual(a, b), 'float32'));\n const derB = () => mul(dy, cast(greater(a, b), 'float32'));\n return { a: derA, b: derB };\n }\n};\n//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiTWluaW11bV9ncmFkLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vLi4vdGZqcy1jb3JlL3NyYy9ncmFkaWVudHMvTWluaW11bV9ncmFkLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBOzs7Ozs7Ozs7Ozs7Ozs7R0FlRztBQUVILE9BQU8sRUFBQyxPQUFPLEVBQUMsTUFBTSxpQkFBaUIsQ0FBQztBQUV4QyxPQUFPLEVBQUMsSUFBSSxFQUFDLE1BQU0sYUFBYSxDQUFDO0FBQ2pDLE9BQU8sRUFBQyxPQUFPLEVBQUMsTUFBTSxnQkFBZ0IsQ0FBQztBQUN2QyxPQUFPLEVBQUMsU0FBUyxFQUFDLE1BQU0sbUJBQW1CLENBQUM7QUFDNUMsT0FBTyxFQUFDLEdBQUcsRUFBQyxNQUFNLFlBQVksQ0FBQztBQUcvQixNQUFNLENBQUMsTUFBTSxpQkFBaUIsR0FBZTtJQUMzQyxVQUFVLEVBQUUsT0FBTztJQUNuQixZQUFZLEVBQUUsQ0FBQyxHQUFHLEVBQUUsR0FBRyxDQUFDO0lBQ3hCLFFBQVEsRUFBRSxDQUFDLEVBQVUsRUFBRSxLQUFlLEVBQUUsRUFBRTtRQUN4QyxNQUFNLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxHQUFHLEtBQUssQ0FBQztRQUNyQixNQUFNLElBQUksR0FBRyxHQUFHLEVBQUUsQ0FBQyxHQUFHLENBQUMsRUFBRSxFQUFFLElBQUksQ0FBQyxTQUFTLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxFQUFFLFNBQVMsQ0FBQyxDQUFDLENBQUM7UUFDN0QsTUFBTSxJQUFJLEdBQUcsR0FBRyxFQUFFLENBQUMsR0FBRyxDQUFDLEVBQUUsRUFBRSxJQUFJLENBQUMsT0FBTyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsRUFBRSxTQUFTLENBQUMsQ0FBQyxDQUFDO1FBQzNELE9BQU8sRUFBQyxDQUFDLEVBQUUsSUFBSSxFQUFFLENBQUMsRUFBRSxJQUFJLEVBQUMsQ0FBQztJQUM1QixDQUFDO0NBQ0YsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbIi8qKlxuICogQGxpY2Vuc2VcbiAqIENvcHlyaWdodCAyMDIwIEdvb2dsZSBMTEMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuXG4gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgXCJMaWNlbnNlXCIpO1xuICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLlxuICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0XG4gKlxuICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wXG4gKlxuICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZVxuICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gXCJBUyBJU1wiIEJBU0lTLFxuICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuXG4gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kXG4gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS5cbiAqID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4gKi9cblxuaW1wb3J0IHtNaW5pbXVtfSBmcm9tICcuLi9rZXJuZWxfbmFtZXMnO1xuaW1wb3J0IHtHcmFkQ29uZmlnfSBmcm9tICcuLi9rZXJuZWxfcmVnaXN0cnknO1xuaW1wb3J0IHtjYXN0fSBmcm9tICcuLi9vcHMvY2FzdCc7XG5pbXBvcnQge2dyZWF0ZXJ9IGZyb20gJy4uL29wcy9ncmVhdGVyJztcbmltcG9ydCB7bGVzc0VxdWFsfSBmcm9tICcuLi9vcHMvbGVzc19lcXVhbCc7XG5pbXBvcnQge211bH0gZnJvbSAnLi4vb3BzL211bCc7XG5pbXBvcnQge1RlbnNvcn0gZnJvbSAnLi4vdGVuc29yJztcblxuZXhwb3J0IGNvbnN0IG1pbmltdW1HcmFkQ29uZmlnOiBHcmFkQ29uZmlnID0ge1xuICBrZXJuZWxOYW1lOiBNaW5pbXVtLFxuICBpbnB1dHNUb1NhdmU6IFsnYScsICdiJ10sXG4gIGdyYWRGdW5jOiAoZHk6IFRlbnNvciwgc2F2ZWQ6IFRlbnNvcltdKSA9PiB7XG4gICAgY29uc3QgW2EsIGJdID0gc2F2ZWQ7XG4gICAgY29uc3QgZGVyQSA9ICgpID0+IG11bChkeSwgY2FzdChsZXNzRXF1YWwoYSwgYiksICdmbG9hdDMyJykpO1xuICAgIGNvbnN0IGRlckIgPSAoKSA9PiBtdWwoZHksIGNhc3QoZ3JlYXRlcihhLCBiKSwgJ2Zsb2F0MzInKSk7XG4gICAgcmV0dXJuIHthOiBkZXJBLCBiOiBkZXJCfTtcbiAgfVxufTtcbiJdfQ==","/**\n * @license\n * Copyright 2020 Google LLC. All Rights Reserved.\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n * =============================================================================\n */\nimport { MirrorPad } from '../kernel_names';\nimport { slice } from '../ops/slice';\nexport const mirrorPadGradConfig = {\n kernelName: MirrorPad,\n inputsToSave: ['x'],\n gradFunc: (dy, saved, attrs) => {\n // Pad introduces values around the original tensor, so the gradient\n // slices the original shape out of the gradient.\n const x = saved[0];\n const { paddings } = attrs;\n const begin = paddings.map(p => p[0]);\n return { x: () => slice(dy, begin, x.shape) };\n }\n};\n//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiTWlycm9yUGFkX2dyYWQuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi8uLi90ZmpzLWNvcmUvc3JjL2dyYWRpZW50cy9NaXJyb3JQYWRfZ3JhZC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQTs7Ozs7Ozs7Ozs7Ozs7O0dBZUc7QUFFSCxPQUFPLEVBQUMsU0FBUyxFQUFpQixNQUFNLGlCQUFpQixDQUFDO0FBRTFELE9BQU8sRUFBQyxLQUFLLEVBQUMsTUFBTSxjQUFjLENBQUM7QUFHbkMsTUFBTSxDQUFDLE1BQU0sbUJBQW1CLEdBQWU7SUFDN0MsVUFBVSxFQUFFLFNBQVM7SUFDckIsWUFBWSxFQUFFLENBQUMsR0FBRyxDQUFDO0lBQ25CLFFBQVEsRUFBRSxDQUFDLEVBQVUsRUFBRSxLQUFlLEVBQUUsS0FBbUIsRUFBRSxFQUFFO1FBQzdELG9FQUFvRTtRQUNwRSxpREFBaUQ7UUFDakQsTUFBTSxDQUFDLEdBQUcsS0FBSyxDQUFDLENBQUMsQ0FBQyxDQUFDO1FBQ25CLE1BQU0sRUFBQyxRQUFRLEVBQUMsR0FBRyxLQUFrQyxDQUFDO1FBQ3RELE1BQU0sS0FBSyxHQUFHLFFBQVEsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQztRQUN0QyxPQUFPLEVBQUMsQ0FBQyxFQUFFLEdBQUcsRUFBRSxDQUFDLEtBQUssQ0FBQyxFQUFFLEVBQUUsS0FBSyxFQUFFLENBQUMsQ0FBQyxLQUFLLENBQUMsRUFBQyxDQUFDO0lBQzlDLENBQUM7Q0FDRixDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiLyoqXG4gKiBAbGljZW5zZVxuICogQ29weXJpZ2h0IDIwMjAgR29vZ2xlIExMQy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC5cbiAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSBcIkxpY2Vuc2VcIik7XG4gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuXG4gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXRcbiAqXG4gKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjBcbiAqXG4gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlXG4gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiBcIkFTIElTXCIgQkFTSVMsXG4gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC5cbiAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmRcbiAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLlxuICogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbiAqL1xuXG5pbXBvcnQge01pcnJvclBhZCwgTWlycm9yUGFkQXR0cnN9IGZyb20gJy4uL2tlcm5lbF9uYW1lcyc7XG5pbXBvcnQge0dyYWRDb25maWcsIE5hbWVkQXR0ck1hcH0gZnJvbSAnLi4va2VybmVsX3JlZ2lzdHJ5JztcbmltcG9ydCB7c2xpY2V9IGZyb20gJy4uL29wcy9zbGljZSc7XG5pbXBvcnQge1RlbnNvcn0gZnJvbSAnLi4vdGVuc29yJztcblxuZXhwb3J0IGNvbnN0IG1pcnJvclBhZEdyYWRDb25maWc6IEdyYWRDb25maWcgPSB7XG4gIGtlcm5lbE5hbWU6IE1pcnJvclBhZCxcbiAgaW5wdXRzVG9TYXZlOiBbJ3gnXSxcbiAgZ3JhZEZ1bmM6IChkeTogVGVuc29yLCBzYXZlZDogVGVuc29yW10sIGF0dHJzOiBOYW1lZEF0dHJNYXApID0+IHtcbiAgICAvLyBQYWQgaW50cm9kdWNlcyB2YWx1ZXMgYXJvdW5kIHRoZSBvcmlnaW5hbCB0ZW5zb3IsIHNvIHRoZSBncmFkaWVudFxuICAgIC8vIHNsaWNlcyB0aGUgb3JpZ2luYWwgc2hhcGUgb3V0IG9mIHRoZSBncmFkaWVudC5cbiAgICBjb25zdCB4ID0gc2F2ZWRbMF07XG4gICAgY29uc3Qge3BhZGRpbmdzfSA9IGF0dHJzIGFzIHVua25vd24gYXMgTWlycm9yUGFkQXR0cnM7XG4gICAgY29uc3QgYmVnaW4gPSBwYWRkaW5ncy5tYXAocCA9PiBwWzBdKTtcbiAgICByZXR1cm4ge3g6ICgpID0+IHNsaWNlKGR5LCBiZWdpbiwgeC5zaGFwZSl9O1xuICB9XG59O1xuIl19","/**\n * @license\n * Copyright 2020 Google LLC. All Rights Reserved.\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n * =============================================================================\n */\nimport { Mod } from '../kernel_names';\nimport { assertAndGetBroadcastShape, getReductionAxes } from '../ops/broadcast_util';\nimport { div } from '../ops/div';\nimport { floor } from '../ops/floor';\nimport { mul } from '../ops/mul';\nimport { neg } from '../ops/neg';\nimport { reshape } from '../ops/reshape';\nimport { sum } from '../ops/sum';\nexport const modGradConfig = {\n kernelName: Mod,\n inputsToSave: ['a', 'b'],\n gradFunc: (dy, saved) => {\n const [a, b] = saved;\n const outShape = assertAndGetBroadcastShape(a.shape, b.shape);\n const derA = () => {\n const reduceAxes = getReductionAxes(a.shape, outShape);\n if (reduceAxes.length > 0) {\n return reshape(sum(dy, reduceAxes), a.shape);\n }\n return dy;\n };\n const derB = () => {\n const res = mul(dy, neg(floor(div(a, b))));\n const reduceAxes = getReductionAxes(b.shape, outShape);\n if (reduceAxes.length > 0) {\n return reshape(sum(res, reduceAxes), b.shape);\n }\n return res;\n };\n return { a: derA, b: derB };\n }\n};\n//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiTW9kX2dyYWQuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi8uLi90ZmpzLWNvcmUvc3JjL2dyYWRpZW50cy9Nb2RfZ3JhZC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQTs7Ozs7Ozs7Ozs7Ozs7O0dBZUc7QUFFSCxPQUFPLEVBQUMsR0FBRyxFQUFDLE1BQU0saUJBQWlCLENBQUM7QUFFcEMsT0FBTyxFQUFDLDBCQUEwQixFQUFFLGdCQUFnQixFQUFDLE1BQU0sdUJBQXVCLENBQUM7QUFDbkYsT0FBTyxFQUFDLEdBQUcsRUFBQyxNQUFNLFlBQVksQ0FBQztBQUMvQixPQUFPLEVBQUMsS0FBSyxFQUFDLE1BQU0sY0FBYyxDQUFDO0FBQ25DLE9BQU8sRUFBQyxHQUFHLEVBQUMsTUFBTSxZQUFZLENBQUM7QUFDL0IsT0FBTyxFQUFDLEdBQUcsRUFBQyxNQUFNLFlBQVksQ0FBQztBQUMvQixPQUFPLEVBQUMsT0FBTyxFQUFDLE1BQU0sZ0JBQWdCLENBQUM7QUFDdkMsT0FBTyxFQUFDLEdBQUcsRUFBQyxNQUFNLFlBQVksQ0FBQztBQUcvQixNQUFNLENBQUMsTUFBTSxhQUFhLEdBQWU7SUFDdkMsVUFBVSxFQUFFLEdBQUc7SUFDZixZQUFZLEVBQUUsQ0FBQyxHQUFHLEVBQUUsR0FBRyxDQUFDO0lBQ3hCLFFBQVEsRUFBRSxDQUFDLEVBQVUsRUFBRSxLQUFlLEVBQUUsRUFBRTtRQUN4QyxNQUFNLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxHQUFHLEtBQUssQ0FBQztRQUNyQixNQUFNLFFBQVEsR0FBRywwQkFBMEIsQ0FBQyxDQUFDLENBQUMsS0FBSyxFQUFFLENBQUMsQ0FBQyxLQUFLLENBQUMsQ0FBQztRQUU5RCxNQUFNLElBQUksR0FBRyxHQUFHLEVBQUU7WUFDaEIsTUFBTSxVQUFVLEdBQUcsZ0JBQWdCLENBQUMsQ0FBQyxDQUFDLEtBQUssRUFBRSxRQUFRLENBQUMsQ0FBQztZQUN2RCxJQUFJLFVBQVUsQ0FBQyxNQUFNLEdBQUcsQ0FBQyxFQUFFO2dCQUN6QixPQUFPLE9BQU8sQ0FBQyxHQUFHLENBQUMsRUFBRSxFQUFFLFVBQVUsQ0FBQyxFQUFFLENBQUMsQ0FBQyxLQUFLLENBQUMsQ0FBQzthQUM5QztZQUNELE9BQU8sRUFBRSxDQUFDO1FBQ1osQ0FBQyxDQUFDO1FBQ0YsTUFBTSxJQUFJLEdBQUcsR0FBRyxFQUFFO1lBQ2hCLE1BQU0sR0FBRyxHQUFHLEdBQUcsQ0FBQyxFQUFFLEVBQUUsR0FBRyxDQUFDLEtBQUssQ0FBQyxHQUFHLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDO1lBQzNDLE1BQU0sVUFBVSxHQUFHLGdCQUFnQixDQUFDLENBQUMsQ0FBQyxLQUFLLEVBQUUsUUFBUSxDQUFDLENBQUM7WUFDdkQsSUFBSSxVQUFVLENBQUMsTUFBTSxHQUFHLENBQUMsRUFBRTtnQkFDekIsT0FBTyxPQUFPLENBQUMsR0FBRyxDQUFDLEdBQUcsRUFBRSxVQUFVLENBQUMsRUFBRSxDQUFDLENBQUMsS0FBSyxDQUFDLENBQUM7YUFDL0M7WUFDRCxPQUFPLEdBQUcsQ0FBQztRQUNiLENBQUMsQ0FBQztRQUNGLE9BQU8sRUFBQyxDQUFDLEVBQUUsSUFBSSxFQUFFLENBQUMsRUFBRSxJQUFJLEVBQUMsQ0FBQztJQUM1QixDQUFDO0NBQ0YsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbIi8qKlxuICogQGxpY2Vuc2VcbiAqIENvcHlyaWdodCAyMDIwIEdvb2dsZSBMTEMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuXG4gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgXCJMaWNlbnNlXCIpO1xuICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLlxuICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0XG4gKlxuICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wXG4gKlxuICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZVxuICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gXCJBUyBJU1wiIEJBU0lTLFxuICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuXG4gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kXG4gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS5cbiAqID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4gKi9cblxuaW1wb3J0IHtNb2R9IGZyb20gJy4uL2tlcm5lbF9uYW1lcyc7XG5pbXBvcnQge0dyYWRDb25maWd9IGZyb20gJy4uL2tlcm5lbF9yZWdpc3RyeSc7XG5pbXBvcnQge2Fzc2VydEFuZEdldEJyb2FkY2FzdFNoYXBlLCBnZXRSZWR1Y3Rpb25BeGVzfSBmcm9tICcuLi9vcHMvYnJvYWRjYXN0X3V0aWwnO1xuaW1wb3J0IHtkaXZ9IGZyb20gJy4uL29wcy9kaXYnO1xuaW1wb3J0IHtmbG9vcn0gZnJvbSAnLi4vb3BzL2Zsb29yJztcbmltcG9ydCB7bXVsfSBmcm9tICcuLi9vcHMvbXVsJztcbmltcG9ydCB7bmVnfSBmcm9tICcuLi9vcHMvbmVnJztcbmltcG9ydCB7cmVzaGFwZX0gZnJvbSAnLi4vb3BzL3Jlc2hhcGUnO1xuaW1wb3J0IHtzdW19IGZyb20gJy4uL29wcy9zdW0nO1xuaW1wb3J0IHtUZW5zb3J9IGZyb20gJy4uL3RlbnNvcic7XG5cbmV4cG9ydCBjb25zdCBtb2RHcmFkQ29uZmlnOiBHcmFkQ29uZmlnID0ge1xuICBrZXJuZWxOYW1lOiBNb2QsXG4gIGlucHV0c1RvU2F2ZTogWydhJywgJ2InXSxcbiAgZ3JhZEZ1bmM6IChkeTogVGVuc29yLCBzYXZlZDogVGVuc29yW10pID0+IHtcbiAgICBjb25zdCBbYSwgYl0gPSBzYXZlZDtcbiAgICBjb25zdCBvdXRTaGFwZSA9IGFzc2VydEFuZEdldEJyb2FkY2FzdFNoYXBlKGEuc2hhcGUsIGIuc2hhcGUpO1xuXG4gICAgY29uc3QgZGVyQSA9ICgpID0+IHtcbiAgICAgIGNvbnN0IHJlZHVjZUF4ZXMgPSBnZXRSZWR1Y3Rpb25BeGVzKGEuc2hhcGUsIG91dFNoYXBlKTtcbiAgICAgIGlmIChyZWR1Y2VBeGVzLmxlbmd0aCA+IDApIHtcbiAgICAgICAgcmV0dXJuIHJlc2hhcGUoc3VtKGR5LCByZWR1Y2VBeGVzKSwgYS5zaGFwZSk7XG4gICAgICB9XG4gICAgICByZXR1cm4gZHk7XG4gICAgfTtcbiAgICBjb25zdCBkZXJCID0gKCkgPT4ge1xuICAgICAgY29uc3QgcmVzID0gbXVsKGR5LCBuZWcoZmxvb3IoZGl2KGEsIGIpKSkpO1xuICAgICAgY29uc3QgcmVkdWNlQXhlcyA9IGdldFJlZHVjdGlvbkF4ZXMoYi5zaGFwZSwgb3V0U2hhcGUpO1xuICAgICAgaWYgKHJlZHVjZUF4ZXMubGVuZ3RoID4gMCkge1xuICAgICAgICByZXR1cm4gcmVzaGFwZShzdW0ocmVzLCByZWR1Y2VBeGVzKSwgYi5zaGFwZSk7XG4gICAgICB9XG4gICAgICByZXR1cm4gcmVzO1xuICAgIH07XG4gICAgcmV0dXJuIHthOiBkZXJBLCBiOiBkZXJCfTtcbiAgfVxufTtcbiJdfQ==","/**\n * @license\n * Copyright 2020 Google LLC. All Rights Reserved.\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n * =============================================================================\n */\nimport { Multiply } from '../kernel_names';\nimport { assertAndGetBroadcastShape, getReductionAxes } from '../ops/broadcast_util';\nimport { cast } from '../ops/cast';\nimport { mul } from '../ops/mul';\nimport { reshape } from '../ops/reshape';\nimport { sum } from '../ops/sum';\nexport const multiplyGradConfig = {\n kernelName: Multiply,\n inputsToSave: ['a', 'b'],\n gradFunc: (dy, saved) => {\n const [a, b] = saved;\n const outShape = assertAndGetBroadcastShape(a.shape, b.shape);\n const derA = () => {\n const res = mul(dy, cast(b, 'float32'));\n const reduceAxes = getReductionAxes(a.shape, outShape);\n if (reduceAxes.length > 0) {\n return reshape(sum(res, reduceAxes), a.shape);\n }\n return res;\n };\n const derB = () => {\n const res = mul(dy, cast(a, 'float32'));\n const reduceAxes = getReductionAxes(b.shape, outShape);\n if (reduceAxes.length > 0) {\n return reshape(sum(res, reduceAxes), b.shape);\n }\n return res;\n };\n return { a: derA, b: derB };\n }\n};\n//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiTXVsdGlwbHlfZ3JhZC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uLy4uL3RmanMtY29yZS9zcmMvZ3JhZGllbnRzL011bHRpcGx5X2dyYWQudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUE7Ozs7Ozs7Ozs7Ozs7OztHQWVHO0FBRUgsT0FBTyxFQUFDLFFBQVEsRUFBQyxNQUFNLGlCQUFpQixDQUFDO0FBRXpDLE9BQU8sRUFBQywwQkFBMEIsRUFBRSxnQkFBZ0IsRUFBQyxNQUFNLHVCQUF1QixDQUFDO0FBQ25GLE9BQU8sRUFBQyxJQUFJLEVBQUMsTUFBTSxhQUFhLENBQUM7QUFDakMsT0FBTyxFQUFDLEdBQUcsRUFBQyxNQUFNLFlBQVksQ0FBQztBQUMvQixPQUFPLEVBQUMsT0FBTyxFQUFDLE1BQU0sZ0JBQWdCLENBQUM7QUFDdkMsT0FBTyxFQUFDLEdBQUcsRUFBQyxNQUFNLFlBQVksQ0FBQztBQUcvQixNQUFNLENBQUMsTUFBTSxrQkFBa0IsR0FBZTtJQUM1QyxVQUFVLEVBQUUsUUFBUTtJQUNwQixZQUFZLEVBQUUsQ0FBQyxHQUFHLEVBQUUsR0FBRyxDQUFDO0lBQ3hCLFFBQVEsRUFBRSxDQUFDLEVBQVUsRUFBRSxLQUFlLEVBQUUsRUFBRTtRQUN4QyxNQUFNLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxHQUFHLEtBQUssQ0FBQztRQUNyQixNQUFNLFFBQVEsR0FBRywwQkFBMEIsQ0FBQyxDQUFDLENBQUMsS0FBSyxFQUFFLENBQUMsQ0FBQyxLQUFLLENBQUMsQ0FBQztRQUU5RCxNQUFNLElBQUksR0FBRyxHQUFHLEVBQUU7WUFDaEIsTUFBTSxHQUFHLEdBQUcsR0FBRyxDQUFDLEVBQUUsRUFBRSxJQUFJLENBQUMsQ0FBQyxFQUFFLFNBQVMsQ0FBQyxDQUFDLENBQUM7WUFDeEMsTUFBTSxVQUFVLEdBQUcsZ0JBQWdCLENBQUMsQ0FBQyxDQUFDLEtBQUssRUFBRSxRQUFRLENBQUMsQ0FBQztZQUN2RCxJQUFJLFVBQVUsQ0FBQyxNQUFNLEdBQUcsQ0FBQyxFQUFFO2dCQUN6QixPQUFPLE9BQU8sQ0FBQyxHQUFHLENBQUMsR0FBRyxFQUFFLFVBQVUsQ0FBQyxFQUFFLENBQUMsQ0FBQyxLQUFLLENBQUMsQ0FBQzthQUMvQztZQUNELE9BQU8sR0FBRyxDQUFDO1FBQ2IsQ0FBQyxDQUFDO1FBQ0YsTUFBTSxJQUFJLEdBQUcsR0FBRyxFQUFFO1lBQ2hCLE1BQU0sR0FBRyxHQUFHLEdBQUcsQ0FBQyxFQUFFLEVBQUUsSUFBSSxDQUFDLENBQUMsRUFBRSxTQUFTLENBQUMsQ0FBQyxDQUFDO1lBQ3hDLE1BQU0sVUFBVSxHQUFHLGdCQUFnQixDQUFDLENBQUMsQ0FBQyxLQUFLLEVBQUUsUUFBUSxDQUFDLENBQUM7WUFDdkQsSUFBSSxVQUFVLENBQUMsTUFBTSxHQUFHLENBQUMsRUFBRTtnQkFDekIsT0FBTyxPQUFPLENBQUMsR0FBRyxDQUFDLEdBQUcsRUFBRSxVQUFVLENBQUMsRUFBRSxDQUFDLENBQUMsS0FBSyxDQUFDLENBQUM7YUFDL0M7WUFDRCxPQUFPLEdBQUcsQ0FBQztRQUNiLENBQUMsQ0FBQztRQUNGLE9BQU8sRUFBQyxDQUFDLEVBQUUsSUFBSSxFQUFFLENBQUMsRUFBRSxJQUFJLEVBQUMsQ0FBQztJQUM1QixDQUFDO0NBQ0YsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbIi8qKlxuICogQGxpY2Vuc2VcbiAqIENvcHlyaWdodCAyMDIwIEdvb2dsZSBMTEMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuXG4gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgXCJMaWNlbnNlXCIpO1xuICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLlxuICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0XG4gKlxuICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wXG4gKlxuICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZVxuICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gXCJBUyBJU1wiIEJBU0lTLFxuICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuXG4gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kXG4gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS5cbiAqID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4gKi9cblxuaW1wb3J0IHtNdWx0aXBseX0gZnJvbSAnLi4va2VybmVsX25hbWVzJztcbmltcG9ydCB7R3JhZENvbmZpZ30gZnJvbSAnLi4va2VybmVsX3JlZ2lzdHJ5JztcbmltcG9ydCB7YXNzZXJ0QW5kR2V0QnJvYWRjYXN0U2hhcGUsIGdldFJlZHVjdGlvbkF4ZXN9IGZyb20gJy4uL29wcy9icm9hZGNhc3RfdXRpbCc7XG5pbXBvcnQge2Nhc3R9IGZyb20gJy4uL29wcy9jYXN0JztcbmltcG9ydCB7bXVsfSBmcm9tICcuLi9vcHMvbXVsJztcbmltcG9ydCB7cmVzaGFwZX0gZnJvbSAnLi4vb3BzL3Jlc2hhcGUnO1xuaW1wb3J0IHtzdW19IGZyb20gJy4uL29wcy9zdW0nO1xuaW1wb3J0IHtUZW5zb3J9IGZyb20gJy4uL3RlbnNvcic7XG5cbmV4cG9ydCBjb25zdCBtdWx0aXBseUdyYWRDb25maWc6IEdyYWRDb25maWcgPSB7XG4gIGtlcm5lbE5hbWU6IE11bHRpcGx5LFxuICBpbnB1dHNUb1NhdmU6IFsnYScsICdiJ10sXG4gIGdyYWRGdW5jOiAoZHk6IFRlbnNvciwgc2F2ZWQ6IFRlbnNvcltdKSA9PiB7XG4gICAgY29uc3QgW2EsIGJdID0gc2F2ZWQ7XG4gICAgY29uc3Qgb3V0U2hhcGUgPSBhc3NlcnRBbmRHZXRCcm9hZGNhc3RTaGFwZShhLnNoYXBlLCBiLnNoYXBlKTtcblxuICAgIGNvbnN0IGRlckEgPSAoKSA9PiB7XG4gICAgICBjb25zdCByZXMgPSBtdWwoZHksIGNhc3QoYiwgJ2Zsb2F0MzInKSk7XG4gICAgICBjb25zdCByZWR1Y2VBeGVzID0gZ2V0UmVkdWN0aW9uQXhlcyhhLnNoYXBlLCBvdXRTaGFwZSk7XG4gICAgICBpZiAocmVkdWNlQXhlcy5sZW5ndGggPiAwKSB7XG4gICAgICAgIHJldHVybiByZXNoYXBlKHN1bShyZXMsIHJlZHVjZUF4ZXMpLCBhLnNoYXBlKTtcbiAgICAgIH1cbiAgICAgIHJldHVybiByZXM7XG4gICAgfTtcbiAgICBjb25zdCBkZXJCID0gKCkgPT4ge1xuICAgICAgY29uc3QgcmVzID0gbXVsKGR5LCBjYXN0KGEsICdmbG9hdDMyJykpO1xuICAgICAgY29uc3QgcmVkdWNlQXhlcyA9IGdldFJlZHVjdGlvbkF4ZXMoYi5zaGFwZSwgb3V0U2hhcGUpO1xuICAgICAgaWYgKHJlZHVjZUF4ZXMubGVuZ3RoID4gMCkge1xuICAgICAgICByZXR1cm4gcmVzaGFwZShzdW0ocmVzLCByZWR1Y2VBeGVzKSwgYi5zaGFwZSk7XG4gICAgICB9XG4gICAgICByZXR1cm4gcmVzO1xuICAgIH07XG4gICAgcmV0dXJuIHthOiBkZXJBLCBiOiBkZXJCfTtcbiAgfVxufTtcbiJdfQ==","/**\n * @license\n * Copyright 2020 Google LLC. All Rights Reserved.\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n * =============================================================================\n */\nimport { Neg } from '../kernel_names';\nimport { neg } from '../ops/neg';\nexport const negGradConfig = {\n kernelName: Neg,\n gradFunc: (dy) => {\n return { x: () => neg(dy) };\n }\n};\n//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiTmVnX2dyYWQuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi8uLi90ZmpzLWNvcmUvc3JjL2dyYWRpZW50cy9OZWdfZ3JhZC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQTs7Ozs7Ozs7Ozs7Ozs7O0dBZUc7QUFFSCxPQUFPLEVBQUMsR0FBRyxFQUFDLE1BQU0saUJBQWlCLENBQUM7QUFFcEMsT0FBTyxFQUFDLEdBQUcsRUFBQyxNQUFNLFlBQVksQ0FBQztBQUcvQixNQUFNLENBQUMsTUFBTSxhQUFhLEdBQWU7SUFDdkMsVUFBVSxFQUFFLEdBQUc7SUFDZixRQUFRLEVBQUUsQ0FBQyxFQUFVLEVBQUUsRUFBRTtRQUN2QixPQUFPLEVBQUMsQ0FBQyxFQUFFLEdBQUcsRUFBRSxDQUFDLEdBQUcsQ0FBQyxFQUFFLENBQUMsRUFBQyxDQUFDO0lBQzVCLENBQUM7Q0FDRixDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiLyoqXG4gKiBAbGljZW5zZVxuICogQ29weXJpZ2h0IDIwMjAgR29vZ2xlIExMQy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC5cbiAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSBcIkxpY2Vuc2VcIik7XG4gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuXG4gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXRcbiAqXG4gKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjBcbiAqXG4gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlXG4gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiBcIkFTIElTXCIgQkFTSVMsXG4gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC5cbiAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmRcbiAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLlxuICogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbiAqL1xuXG5pbXBvcnQge05lZ30gZnJvbSAnLi4va2VybmVsX25hbWVzJztcbmltcG9ydCB7R3JhZENvbmZpZ30gZnJvbSAnLi4va2VybmVsX3JlZ2lzdHJ5JztcbmltcG9ydCB7bmVnfSBmcm9tICcuLi9vcHMvbmVnJztcbmltcG9ydCB7VGVuc29yfSBmcm9tICcuLi90ZW5zb3InO1xuXG5leHBvcnQgY29uc3QgbmVnR3JhZENvbmZpZzogR3JhZENvbmZpZyA9IHtcbiAga2VybmVsTmFtZTogTmVnLFxuICBncmFkRnVuYzogKGR5OiBUZW5zb3IpID0+IHtcbiAgICByZXR1cm4ge3g6ICgpID0+IG5lZyhkeSl9O1xuICB9XG59O1xuIl19","/**\n * @license\n * Copyright 2020 Google LLC. All Rights Reserved.\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n * =============================================================================\n */\nimport { OneHot } from '../kernel_names';\nimport { zeros } from '../ops/zeros';\nexport const oneHotGradConfig = {\n kernelName: OneHot,\n inputsToSave: ['indices'],\n gradFunc: (dy, saved) => {\n const indices = saved[0];\n return { indices: () => zeros(indices.shape, 'float32') };\n }\n};\n//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiT25lSG90X2dyYWQuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi8uLi90ZmpzLWNvcmUvc3JjL2dyYWRpZW50cy9PbmVIb3RfZ3JhZC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQTs7Ozs7Ozs7Ozs7Ozs7O0dBZUc7QUFFSCxPQUFPLEVBQUMsTUFBTSxFQUFDLE1BQU0saUJBQWlCLENBQUM7QUFFdkMsT0FBTyxFQUFDLEtBQUssRUFBQyxNQUFNLGNBQWMsQ0FBQztBQUduQyxNQUFNLENBQUMsTUFBTSxnQkFBZ0IsR0FBZTtJQUMxQyxVQUFVLEVBQUUsTUFBTTtJQUNsQixZQUFZLEVBQUUsQ0FBQyxTQUFTLENBQUM7SUFDekIsUUFBUSxFQUFFLENBQUMsRUFBVSxFQUFFLEtBQWUsRUFBRSxFQUFFO1FBQ3hDLE1BQU0sT0FBTyxHQUFHLEtBQUssQ0FBQyxDQUFDLENBQUMsQ0FBQztRQUN6QixPQUFPLEVBQUMsT0FBTyxFQUFFLEdBQUcsRUFBRSxDQUFDLEtBQUssQ0FBQyxPQUFPLENBQUMsS0FBSyxFQUFFLFNBQVMsQ0FBQyxFQUFDLENBQUM7SUFDMUQsQ0FBQztDQUNGLENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyIvKipcbiAqIEBsaWNlbnNlXG4gKiBDb3B5cmlnaHQgMjAyMCBHb29nbGUgTExDLiBBbGwgUmlnaHRzIFJlc2VydmVkLlxuICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlIFwiTGljZW5zZVwiKTtcbiAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS5cbiAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdFxuICpcbiAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMFxuICpcbiAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmVcbiAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuIFwiQVMgSVNcIiBCQVNJUyxcbiAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLlxuICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZFxuICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuXG4gKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuICovXG5cbmltcG9ydCB7T25lSG90fSBmcm9tICcuLi9rZXJuZWxfbmFtZXMnO1xuaW1wb3J0IHtHcmFkQ29uZmlnfSBmcm9tICcuLi9rZXJuZWxfcmVnaXN0cnknO1xuaW1wb3J0IHt6ZXJvc30gZnJvbSAnLi4vb3BzL3plcm9zJztcbmltcG9ydCB7VGVuc29yfSBmcm9tICcuLi90ZW5zb3InO1xuXG5leHBvcnQgY29uc3Qgb25lSG90R3JhZENvbmZpZzogR3JhZENvbmZpZyA9IHtcbiAga2VybmVsTmFtZTogT25lSG90LFxuICBpbnB1dHNUb1NhdmU6IFsnaW5kaWNlcyddLFxuICBncmFkRnVuYzogKGR5OiBUZW5zb3IsIHNhdmVkOiBUZW5zb3JbXSkgPT4ge1xuICAgIGNvbnN0IGluZGljZXMgPSBzYXZlZFswXTtcbiAgICByZXR1cm4ge2luZGljZXM6ICgpID0+IHplcm9zKGluZGljZXMuc2hhcGUsICdmbG9hdDMyJyl9O1xuICB9XG59O1xuIl19","/**\n * @license\n * Copyright 2020 Google LLC. All Rights Reserved.\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n * =============================================================================\n */\nimport { OnesLike } from '../kernel_names';\nimport { zerosLike } from '../ops/zeros_like';\nexport const onesLikeGradConfig = {\n kernelName: OnesLike,\n gradFunc: (dy) => {\n return { x: () => zerosLike(dy) };\n }\n};\n//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiT25lc0xpa2VfZ3JhZC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uLy4uL3RmanMtY29yZS9zcmMvZ3JhZGllbnRzL09uZXNMaWtlX2dyYWQudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUE7Ozs7Ozs7Ozs7Ozs7OztHQWVHO0FBRUgsT0FBTyxFQUFDLFFBQVEsRUFBQyxNQUFNLGlCQUFpQixDQUFDO0FBRXpDLE9BQU8sRUFBQyxTQUFTLEVBQUMsTUFBTSxtQkFBbUIsQ0FBQztBQUc1QyxNQUFNLENBQUMsTUFBTSxrQkFBa0IsR0FBZTtJQUM1QyxVQUFVLEVBQUUsUUFBUTtJQUNwQixRQUFRLEVBQUUsQ0FBQyxFQUFVLEVBQUUsRUFBRTtRQUN2QixPQUFPLEVBQUMsQ0FBQyxFQUFFLEdBQUcsRUFBRSxDQUFDLFNBQVMsQ0FBQyxFQUFFLENBQUMsRUFBQyxDQUFDO0lBQ2xDLENBQUM7Q0FDRixDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiLyoqXG4gKiBAbGljZW5zZVxuICogQ29weXJpZ2h0IDIwMjAgR29vZ2xlIExMQy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC5cbiAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSBcIkxpY2Vuc2VcIik7XG4gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuXG4gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXRcbiAqXG4gKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjBcbiAqXG4gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlXG4gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiBcIkFTIElTXCIgQkFTSVMsXG4gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC5cbiAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmRcbiAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLlxuICogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbiAqL1xuXG5pbXBvcnQge09uZXNMaWtlfSBmcm9tICcuLi9rZXJuZWxfbmFtZXMnO1xuaW1wb3J0IHtHcmFkQ29uZmlnfSBmcm9tICcuLi9rZXJuZWxfcmVnaXN0cnknO1xuaW1wb3J0IHt6ZXJvc0xpa2V9IGZyb20gJy4uL29wcy96ZXJvc19saWtlJztcbmltcG9ydCB7VGVuc29yfSBmcm9tICcuLi90ZW5zb3InO1xuXG5leHBvcnQgY29uc3Qgb25lc0xpa2VHcmFkQ29uZmlnOiBHcmFkQ29uZmlnID0ge1xuICBrZXJuZWxOYW1lOiBPbmVzTGlrZSxcbiAgZ3JhZEZ1bmM6IChkeTogVGVuc29yKSA9PiB7XG4gICAgcmV0dXJuIHt4OiAoKSA9PiB6ZXJvc0xpa2UoZHkpfTtcbiAgfVxufTtcbiJdfQ==","/**\n * @license\n * Copyright 2020 Google LLC. All Rights Reserved.\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n * =============================================================================\n */\nimport { Pack } from '../kernel_names';\nimport { unstack } from '../ops/unstack';\nexport const packGradConfig = {\n kernelName: Pack,\n saveAllInputs: true,\n gradFunc: (dy, saved, attrs) => {\n const { axis } = attrs;\n const derTensors = unstack(dy, axis);\n return derTensors.map(t => () => t);\n }\n};\n//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiUGFja19ncmFkLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vLi4vdGZqcy1jb3JlL3NyYy9ncmFkaWVudHMvUGFja19ncmFkLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBOzs7Ozs7Ozs7Ozs7Ozs7R0FlRztBQUVILE9BQU8sRUFBQyxJQUFJLEVBQVksTUFBTSxpQkFBaUIsQ0FBQztBQUVoRCxPQUFPLEVBQUMsT0FBTyxFQUFDLE1BQU0sZ0JBQWdCLENBQUM7QUFHdkMsTUFBTSxDQUFDLE1BQU0sY0FBYyxHQUFlO0lBQ3hDLFVBQVUsRUFBRSxJQUFJO0lBQ2hCLGFBQWEsRUFBRSxJQUFJO0lBQ25CLFFBQVEsRUFBRSxDQUFDLEVBQVUsRUFBRSxLQUFlLEVBQUUsS0FBbUIsRUFBRSxFQUFFO1FBQzdELE1BQU0sRUFBQyxJQUFJLEVBQUMsR0FBRyxLQUF3QixDQUFDO1FBQ3hDLE1BQU0sVUFBVSxHQUFHLE9BQU8sQ0FBQyxFQUFFLEVBQUUsSUFBSSxDQUFDLENBQUM7UUFDckMsT0FBTyxVQUFVLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsR0FBRyxFQUFFLENBQUMsQ0FBQyxDQUFPLENBQUM7SUFDNUMsQ0FBQztDQUNGLENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyIvKipcbiAqIEBsaWNlbnNlXG4gKiBDb3B5cmlnaHQgMjAyMCBHb29nbGUgTExDLiBBbGwgUmlnaHRzIFJlc2VydmVkLlxuICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlIFwiTGljZW5zZVwiKTtcbiAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS5cbiAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdFxuICpcbiAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMFxuICpcbiAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmVcbiAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuIFwiQVMgSVNcIiBCQVNJUyxcbiAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLlxuICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZFxuICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuXG4gKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuICovXG5cbmltcG9ydCB7UGFjaywgUGFja0F0dHJzfSBmcm9tICcuLi9rZXJuZWxfbmFtZXMnO1xuaW1wb3J0IHtHcmFkQ29uZmlnLCBOYW1lZEF0dHJNYXB9IGZyb20gJy4uL2tlcm5lbF9yZWdpc3RyeSc7XG5pbXBvcnQge3Vuc3RhY2t9IGZyb20gJy4uL29wcy91bnN0YWNrJztcbmltcG9ydCB7VGVuc29yfSBmcm9tICcuLi90ZW5zb3InO1xuXG5leHBvcnQgY29uc3QgcGFja0dyYWRDb25maWc6IEdyYWRDb25maWcgPSB7XG4gIGtlcm5lbE5hbWU6IFBhY2ssXG4gIHNhdmVBbGxJbnB1dHM6IHRydWUsXG4gIGdyYWRGdW5jOiAoZHk6IFRlbnNvciwgc2F2ZWQ6IFRlbnNvcltdLCBhdHRyczogTmFtZWRBdHRyTWFwKSA9PiB7XG4gICAgY29uc3Qge2F4aXN9ID0gYXR0cnMgYXMge30gYXMgUGFja0F0dHJzO1xuICAgIGNvbnN0IGRlclRlbnNvcnMgPSB1bnN0YWNrKGR5LCBheGlzKTtcbiAgICByZXR1cm4gZGVyVGVuc29ycy5tYXAodCA9PiAoKSA9PiB0KSBhcyB7fTtcbiAgfVxufTtcbiJdfQ==","/**\n * @license\n * Copyright 2020 Google LLC. All Rights Reserved.\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n * =============================================================================\n */\nimport { PadV2 } from '../kernel_names';\nimport { slice } from '../ops/slice';\nexport const padV2GradConfig = {\n kernelName: PadV2,\n inputsToSave: ['x'],\n gradFunc: (dy, saved, attrs) => {\n // Pad introduces values around the original tensor, so the gradient\n // slices the original shape out of the gradient.\n const x = saved[0];\n const { paddings } = attrs;\n const begin = paddings.map(p => p[0]);\n return { x: () => slice(dy, begin, x.shape) };\n }\n};\n//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiUGFkVjJfZ3JhZC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uLy4uL3RmanMtY29yZS9zcmMvZ3JhZGllbnRzL1BhZFYyX2dyYWQudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUE7Ozs7Ozs7Ozs7Ozs7OztHQWVHO0FBRUgsT0FBTyxFQUFDLEtBQUssRUFBYSxNQUFNLGlCQUFpQixDQUFDO0FBRWxELE9BQU8sRUFBQyxLQUFLLEVBQUMsTUFBTSxjQUFjLENBQUM7QUFHbkMsTUFBTSxDQUFDLE1BQU0sZUFBZSxHQUFlO0lBQ3pDLFVBQVUsRUFBRSxLQUFLO0lBQ2pCLFlBQVksRUFBRSxDQUFDLEdBQUcsQ0FBQztJQUNuQixRQUFRLEVBQUUsQ0FBQyxFQUFVLEVBQUUsS0FBZSxFQUFFLEtBQW1CLEVBQUUsRUFBRTtRQUM3RCxvRUFBb0U7UUFDcEUsaURBQWlEO1FBQ2pELE1BQU0sQ0FBQyxHQUFHLEtBQUssQ0FBQyxDQUFDLENBQUMsQ0FBQztRQUNuQixNQUFNLEVBQUMsUUFBUSxFQUFDLEdBQUcsS0FBOEIsQ0FBQztRQUNsRCxNQUFNLEtBQUssR0FBRyxRQUFRLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUM7UUFDdEMsT0FBTyxFQUFDLENBQUMsRUFBRSxHQUFHLEVBQUUsQ0FBQyxLQUFLLENBQUMsRUFBRSxFQUFFLEtBQUssRUFBRSxDQUFDLENBQUMsS0FBSyxDQUFDLEVBQUMsQ0FBQztJQUM5QyxDQUFDO0NBQ0YsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbIi8qKlxuICogQGxpY2Vuc2VcbiAqIENvcHlyaWdodCAyMDIwIEdvb2dsZSBMTEMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuXG4gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgXCJMaWNlbnNlXCIpO1xuICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLlxuICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0XG4gKlxuICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wXG4gKlxuICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZVxuICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gXCJBUyBJU1wiIEJBU0lTLFxuICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuXG4gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kXG4gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS5cbiAqID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4gKi9cblxuaW1wb3J0IHtQYWRWMiwgUGFkVjJBdHRyc30gZnJvbSAnLi4va2VybmVsX25hbWVzJztcbmltcG9ydCB7R3JhZENvbmZpZywgTmFtZWRBdHRyTWFwfSBmcm9tICcuLi9rZXJuZWxfcmVnaXN0cnknO1xuaW1wb3J0IHtzbGljZX0gZnJvbSAnLi4vb3BzL3NsaWNlJztcbmltcG9ydCB7VGVuc29yfSBmcm9tICcuLi90ZW5zb3InO1xuXG5leHBvcnQgY29uc3QgcGFkVjJHcmFkQ29uZmlnOiBHcmFkQ29uZmlnID0ge1xuICBrZXJuZWxOYW1lOiBQYWRWMixcbiAgaW5wdXRzVG9TYXZlOiBbJ3gnXSxcbiAgZ3JhZEZ1bmM6IChkeTogVGVuc29yLCBzYXZlZDogVGVuc29yW10sIGF0dHJzOiBOYW1lZEF0dHJNYXApID0+IHtcbiAgICAvLyBQYWQgaW50cm9kdWNlcyB2YWx1ZXMgYXJvdW5kIHRoZSBvcmlnaW5hbCB0ZW5zb3IsIHNvIHRoZSBncmFkaWVudFxuICAgIC8vIHNsaWNlcyB0aGUgb3JpZ2luYWwgc2hhcGUgb3V0IG9mIHRoZSBncmFkaWVudC5cbiAgICBjb25zdCB4ID0gc2F2ZWRbMF07XG4gICAgY29uc3Qge3BhZGRpbmdzfSA9IGF0dHJzIGFzIHVua25vd24gYXMgUGFkVjJBdHRycztcbiAgICBjb25zdCBiZWdpbiA9IHBhZGRpbmdzLm1hcChwID0+IHBbMF0pO1xuICAgIHJldHVybiB7eDogKCkgPT4gc2xpY2UoZHksIGJlZ2luLCB4LnNoYXBlKX07XG4gIH1cbn07XG4iXX0=","/**\n * @license\n * Copyright 2020 Google LLC. All Rights Reserved.\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n * =============================================================================\n */\nimport { Pow } from '../kernel_names';\nimport * as broadcast_util from '../ops/broadcast_util';\nimport { cast } from '../ops/cast';\nimport { greater } from '../ops/greater';\nimport { log } from '../ops/log';\nimport { mul } from '../ops/mul';\nimport { pow } from '../ops/pow';\nimport { reshape } from '../ops/reshape';\nimport { scalar } from '../ops/scalar';\nimport { sub } from '../ops/sub';\nimport { sum } from '../ops/sum';\nimport { where } from '../ops/where';\nimport { zerosLike } from '../ops/zeros_like';\nexport const powGradConfig = {\n kernelName: Pow,\n inputsToSave: ['a', 'b'],\n outputsToSave: [true],\n gradFunc: (dy, saved) => {\n const [a, b, y] = saved;\n const base = a;\n const exp = b;\n const outShape = broadcast_util.assertAndGetBroadcastShape(base.shape, exp.shape);\n const derBase = () => {\n const expFloat = cast(exp, 'float32');\n let res = mul(dy, mul(expFloat, pow(base, sub(expFloat, scalar(1)))));\n const reduceAxes = broadcast_util.getReductionAxes(base.shape, outShape);\n if (reduceAxes.length > 0) {\n res = sum(res, reduceAxes);\n }\n return reshape(res, base.shape);\n };\n const derExp = () => {\n const condition = greater(base, 0);\n const logBase = where(condition, log(base), zerosLike(base));\n let res = mul(dy, mul(y, logBase));\n const reduceAxes = broadcast_util.getReductionAxes(exp.shape, outShape);\n if (reduceAxes.length > 0) {\n res = sum(res, reduceAxes);\n }\n return reshape(res, exp.shape);\n };\n return { a: derBase, b: derExp };\n }\n};\n//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiUG93X2dyYWQuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi8uLi90ZmpzLWNvcmUvc3JjL2dyYWRpZW50cy9Qb3dfZ3JhZC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQTs7Ozs7Ozs7Ozs7Ozs7O0dBZUc7QUFDSCxPQUFPLEVBQUMsR0FBRyxFQUFDLE1BQU0saUJBQWlCLENBQUM7QUFFcEMsT0FBTyxLQUFLLGNBQWMsTUFBTSx1QkFBdUIsQ0FBQztBQUN4RCxPQUFPLEVBQUMsSUFBSSxFQUFDLE1BQU0sYUFBYSxDQUFDO0FBQ2pDLE9BQU8sRUFBQyxPQUFPLEVBQUMsTUFBTSxnQkFBZ0IsQ0FBQztBQUN2QyxPQUFPLEVBQUMsR0FBRyxFQUFDLE1BQU0sWUFBWSxDQUFDO0FBQy9CLE9BQU8sRUFBQyxHQUFHLEVBQUMsTUFBTSxZQUFZLENBQUM7QUFDL0IsT0FBTyxFQUFDLEdBQUcsRUFBQyxNQUFNLFlBQVksQ0FBQztBQUMvQixPQUFPLEVBQUMsT0FBTyxFQUFDLE1BQU0sZ0JBQWdCLENBQUM7QUFDdkMsT0FBTyxFQUFDLE1BQU0sRUFBQyxNQUFNLGVBQWUsQ0FBQztBQUNyQyxPQUFPLEVBQUMsR0FBRyxFQUFDLE1BQU0sWUFBWSxDQUFDO0FBQy9CLE9BQU8sRUFBQyxHQUFHLEVBQUMsTUFBTSxZQUFZLENBQUM7QUFDL0IsT0FBTyxFQUFDLEtBQUssRUFBQyxNQUFNLGNBQWMsQ0FBQztBQUNuQyxPQUFPLEVBQUMsU0FBUyxFQUFDLE1BQU0sbUJBQW1CLENBQUM7QUFHNUMsTUFBTSxDQUFDLE1BQU0sYUFBYSxHQUFlO0lBQ3ZDLFVBQVUsRUFBRSxHQUFHO0lBQ2YsWUFBWSxFQUFFLENBQUMsR0FBRyxFQUFFLEdBQUcsQ0FBQztJQUN4QixhQUFhLEVBQUUsQ0FBQyxJQUFJLENBQUM7SUFDckIsUUFBUSxFQUFFLENBQUMsRUFBVSxFQUFFLEtBQWUsRUFBRSxFQUFFO1FBQ3hDLE1BQU0sQ0FBQyxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsQ0FBQyxHQUFHLEtBQUssQ0FBQztRQUN4QixNQUFNLElBQUksR0FBRyxDQUFDLENBQUM7UUFDZixNQUFNLEdBQUcsR0FBRyxDQUFDLENBQUM7UUFDZCxNQUFNLFFBQVEsR0FDVixjQUFjLENBQUMsMEJBQTBCLENBQUMsSUFBSSxDQUFDLEtBQUssRUFBRSxHQUFHLENBQUMsS0FBSyxDQUFDLENBQUM7UUFFckUsTUFBTSxPQUFPLEdBQUcsR0FBRyxFQUFFO1lBQ25CLE1BQU0sUUFBUSxHQUFHLElBQUksQ0FBQyxHQUFHLEVBQUUsU0FBUyxDQUFDLENBQUM7WUFDdEMsSUFBSSxHQUFHLEdBQUcsR0FBRyxDQUFDLEVBQUUsRUFBRSxHQUFHLENBQUMsUUFBUSxFQUFFLEdBQUcsQ0FBQyxJQUFJLEVBQUUsR0FBRyxDQUFDLFFBQVEsRUFBRSxNQUFNLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQztZQUN0RSxNQUFNLFVBQVUsR0FBRyxjQUFjLENBQUMsZ0JBQWdCLENBQUMsSUFBSSxDQUFDLEtBQUssRUFBRSxRQUFRLENBQUMsQ0FBQztZQUN6RSxJQUFJLFVBQVUsQ0FBQyxNQUFNLEdBQUcsQ0FBQyxFQUFFO2dCQUN6QixHQUFHLEdBQUcsR0FBRyxDQUFDLEdBQUcsRUFBRSxVQUFVLENBQUMsQ0FBQzthQUM1QjtZQUNELE9BQU8sT0FBTyxDQUFDLEdBQUcsRUFBRSxJQUFJLENBQUMsS0FBSyxDQUFDLENBQUM7UUFDbEMsQ0FBQyxDQUFDO1FBQ0YsTUFBTSxNQUFNLEdBQUcsR0FBRyxFQUFFO1lBQ2xCLE1BQU0sU0FBUyxHQUFHLE9BQU8sQ0FBQyxJQUFJLEVBQUUsQ0FBQyxDQUFDLENBQUM7WUFDbkMsTUFBTSxPQUFPLEdBQUcsS0FBSyxDQUFDLFNBQVMsRUFBRSxHQUFHLENBQUMsSUFBSSxDQUFDLEVBQUUsU0FBUyxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUM7WUFDN0QsSUFBSSxHQUFHLEdBQUcsR0FBRyxDQUFDLEVBQUUsRUFBRSxHQUFHLENBQUMsQ0FBQyxFQUFFLE9BQU8sQ0FBQyxDQUFDLENBQUM7WUFDbkMsTUFBTSxVQUFVLEdBQUcsY0FBYyxDQUFDLGdCQUFnQixDQUFDLEdBQUcsQ0FBQyxLQUFLLEVBQUUsUUFBUSxDQUFDLENBQUM7WUFDeEUsSUFBSSxVQUFVLENBQUMsTUFBTSxHQUFHLENBQUMsRUFBRTtnQkFDekIsR0FBRyxHQUFHLEdBQUcsQ0FBQyxHQUFHLEVBQUUsVUFBVSxDQUFDLENBQUM7YUFDNUI7WUFDRCxPQUFPLE9BQU8sQ0FBQyxHQUFHLEVBQUUsR0FBRyxDQUFDLEtBQUssQ0FBQyxDQUFDO1FBQ2pDLENBQUMsQ0FBQztRQUNGLE9BQU8sRUFBQyxDQUFDLEVBQUUsT0FBTyxFQUFFLENBQUMsRUFBRSxNQUFNLEVBQUMsQ0FBQztJQUNqQyxDQUFDO0NBQ0YsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbIi8qKlxuICogQGxpY2Vuc2VcbiAqIENvcHlyaWdodCAyMDIwIEdvb2dsZSBMTEMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuXG4gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgXCJMaWNlbnNlXCIpO1xuICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLlxuICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0XG4gKlxuICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wXG4gKlxuICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZVxuICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gXCJBUyBJU1wiIEJBU0lTLFxuICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuXG4gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kXG4gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS5cbiAqID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4gKi9cbmltcG9ydCB7UG93fSBmcm9tICcuLi9rZXJuZWxfbmFtZXMnO1xuaW1wb3J0IHtHcmFkQ29uZmlnfSBmcm9tICcuLi9rZXJuZWxfcmVnaXN0cnknO1xuaW1wb3J0ICogYXMgYnJvYWRjYXN0X3V0aWwgZnJvbSAnLi4vb3BzL2Jyb2FkY2FzdF91dGlsJztcbmltcG9ydCB7Y2FzdH0gZnJvbSAnLi4vb3BzL2Nhc3QnO1xuaW1wb3J0IHtncmVhdGVyfSBmcm9tICcuLi9vcHMvZ3JlYXRlcic7XG5pbXBvcnQge2xvZ30gZnJvbSAnLi4vb3BzL2xvZyc7XG5pbXBvcnQge211bH0gZnJvbSAnLi4vb3BzL211bCc7XG5pbXBvcnQge3Bvd30gZnJvbSAnLi4vb3BzL3Bvdyc7XG5pbXBvcnQge3Jlc2hhcGV9IGZyb20gJy4uL29wcy9yZXNoYXBlJztcbmltcG9ydCB7c2NhbGFyfSBmcm9tICcuLi9vcHMvc2NhbGFyJztcbmltcG9ydCB7c3VifSBmcm9tICcuLi9vcHMvc3ViJztcbmltcG9ydCB7c3VtfSBmcm9tICcuLi9vcHMvc3VtJztcbmltcG9ydCB7d2hlcmV9IGZyb20gJy4uL29wcy93aGVyZSc7XG5pbXBvcnQge3plcm9zTGlrZX0gZnJvbSAnLi4vb3BzL3plcm9zX2xpa2UnO1xuaW1wb3J0IHtUZW5zb3J9IGZyb20gJy4uL3RlbnNvcic7XG5cbmV4cG9ydCBjb25zdCBwb3dHcmFkQ29uZmlnOiBHcmFkQ29uZmlnID0ge1xuICBrZXJuZWxOYW1lOiBQb3csXG4gIGlucHV0c1RvU2F2ZTogWydhJywgJ2InXSxcbiAgb3V0cHV0c1RvU2F2ZTogW3RydWVdLFxuICBncmFkRnVuYzogKGR5OiBUZW5zb3IsIHNhdmVkOiBUZW5zb3JbXSkgPT4ge1xuICAgIGNvbnN0IFthLCBiLCB5XSA9IHNhdmVkO1xuICAgIGNvbnN0IGJhc2UgPSBhO1xuICAgIGNvbnN0IGV4cCA9IGI7XG4gICAgY29uc3Qgb3V0U2hhcGUgPVxuICAgICAgICBicm9hZGNhc3RfdXRpbC5hc3NlcnRBbmRHZXRCcm9hZGNhc3RTaGFwZShiYXNlLnNoYXBlLCBleHAuc2hhcGUpO1xuXG4gICAgY29uc3QgZGVyQmFzZSA9ICgpID0+IHtcbiAgICAgIGNvbnN0IGV4cEZsb2F0ID0gY2FzdChleHAsICdmbG9hdDMyJyk7XG4gICAgICBsZXQgcmVzID0gbXVsKGR5LCBtdWwoZXhwRmxvYXQsIHBvdyhiYXNlLCBzdWIoZXhwRmxvYXQsIHNjYWxhcigxKSkpKSk7XG4gICAgICBjb25zdCByZWR1Y2VBeGVzID0gYnJvYWRjYXN0X3V0aWwuZ2V0UmVkdWN0aW9uQXhlcyhiYXNlLnNoYXBlLCBvdXRTaGFwZSk7XG4gICAgICBpZiAocmVkdWNlQXhlcy5sZW5ndGggPiAwKSB7XG4gICAgICAgIHJlcyA9IHN1bShyZXMsIHJlZHVjZUF4ZXMpO1xuICAgICAgfVxuICAgICAgcmV0dXJuIHJlc2hhcGUocmVzLCBiYXNlLnNoYXBlKTtcbiAgICB9O1xuICAgIGNvbnN0IGRlckV4cCA9ICgpID0+IHtcbiAgICAgIGNvbnN0IGNvbmRpdGlvbiA9IGdyZWF0ZXIoYmFzZSwgMCk7XG4gICAgICBjb25zdCBsb2dCYXNlID0gd2hlcmUoY29uZGl0aW9uLCBsb2coYmFzZSksIHplcm9zTGlrZShiYXNlKSk7XG4gICAgICBsZXQgcmVzID0gbXVsKGR5LCBtdWwoeSwgbG9nQmFzZSkpO1xuICAgICAgY29uc3QgcmVkdWNlQXhlcyA9IGJyb2FkY2FzdF91dGlsLmdldFJlZHVjdGlvbkF4ZXMoZXhwLnNoYXBlLCBvdXRTaGFwZSk7XG4gICAgICBpZiAocmVkdWNlQXhlcy5sZW5ndGggPiAwKSB7XG4gICAgICAgIHJlcyA9IHN1bShyZXMsIHJlZHVjZUF4ZXMpO1xuICAgICAgfVxuICAgICAgcmV0dXJuIHJlc2hhcGUocmVzLCBleHAuc2hhcGUpO1xuICAgIH07XG4gICAgcmV0dXJuIHthOiBkZXJCYXNlLCBiOiBkZXJFeHB9O1xuICB9XG59O1xuIl19","/**\n * @license\n * Copyright 2020 Google LLC. All Rights Reserved.\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n * =============================================================================\n */\nimport { Prelu } from '../kernel_names';\nimport { getReductionAxes } from '../ops/broadcast_util';\nimport { greater } from '../ops/greater';\nimport { mul } from '../ops/mul';\nimport { reshape } from '../ops/reshape';\nimport { sum } from '../ops/sum';\nimport { where } from '../ops/where';\nimport { zerosLike } from '../ops/zeros_like';\nexport const preluGradConfig = {\n kernelName: Prelu,\n inputsToSave: ['x', 'alpha'],\n gradFunc: (dy, saved) => {\n const [x, alpha] = saved;\n const mask = greater(x, 0);\n return {\n x: () => where(mask, dy, mul(dy, alpha)),\n alpha: () => {\n let res = where(mask, zerosLike(dy), mul(dy, x));\n const reduceAxes = getReductionAxes(alpha.shape, dy.shape);\n if (reduceAxes.length > 0) {\n res = sum(res, reduceAxes);\n }\n return reshape(res, alpha.shape);\n }\n };\n }\n};\n//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiUHJlbHVfZ3JhZC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uLy4uL3RmanMtY29yZS9zcmMvZ3JhZGllbnRzL1ByZWx1X2dyYWQudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUE7Ozs7Ozs7Ozs7Ozs7OztHQWVHO0FBQ0gsT0FBTyxFQUFDLEtBQUssRUFBQyxNQUFNLGlCQUFpQixDQUFDO0FBRXRDLE9BQU8sRUFBQyxnQkFBZ0IsRUFBQyxNQUFNLHVCQUF1QixDQUFDO0FBQ3ZELE9BQU8sRUFBQyxPQUFPLEVBQUMsTUFBTSxnQkFBZ0IsQ0FBQztBQUN2QyxPQUFPLEVBQUMsR0FBRyxFQUFDLE1BQU0sWUFBWSxDQUFDO0FBQy9CLE9BQU8sRUFBQyxPQUFPLEVBQUMsTUFBTSxnQkFBZ0IsQ0FBQztBQUN2QyxPQUFPLEVBQUMsR0FBRyxFQUFDLE1BQU0sWUFBWSxDQUFDO0FBQy9CLE9BQU8sRUFBQyxLQUFLLEVBQUMsTUFBTSxjQUFjLENBQUM7QUFDbkMsT0FBTyxFQUFDLFNBQVMsRUFBQyxNQUFNLG1CQUFtQixDQUFDO0FBRzVDLE1BQU0sQ0FBQyxNQUFNLGVBQWUsR0FBZTtJQUN6QyxVQUFVLEVBQUUsS0FBSztJQUNqQixZQUFZLEVBQUUsQ0FBQyxHQUFHLEVBQUUsT0FBTyxDQUFDO0lBQzVCLFFBQVEsRUFBRSxDQUFDLEVBQVUsRUFBRSxLQUFlLEVBQUUsRUFBRTtRQUN4QyxNQUFNLENBQUMsQ0FBQyxFQUFFLEtBQUssQ0FBQyxHQUFHLEtBQUssQ0FBQztRQUN6QixNQUFNLElBQUksR0FBRyxPQUFPLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDO1FBRTNCLE9BQU87WUFDTCxDQUFDLEVBQUUsR0FBRyxFQUFFLENBQUMsS0FBSyxDQUFDLElBQUksRUFBRSxFQUFFLEVBQUUsR0FBRyxDQUFDLEVBQUUsRUFBRSxLQUFLLENBQUMsQ0FBQztZQUN4QyxLQUFLLEVBQUUsR0FBRyxFQUFFO2dCQUNWLElBQUksR0FBRyxHQUFHLEtBQUssQ0FBQyxJQUFJLEVBQUUsU0FBUyxDQUFDLEVBQUUsQ0FBQyxFQUFFLEdBQUcsQ0FBQyxFQUFFLEVBQUUsQ0FBQyxDQUFDLENBQUMsQ0FBQztnQkFDakQsTUFBTSxVQUFVLEdBQUcsZ0JBQWdCLENBQUMsS0FBSyxDQUFDLEtBQUssRUFBRSxFQUFFLENBQUMsS0FBSyxDQUFDLENBQUM7Z0JBQzNELElBQUksVUFBVSxDQUFDLE1BQU0sR0FBRyxDQUFDLEVBQUU7b0JBQ3pCLEdBQUcsR0FBRyxHQUFHLENBQUMsR0FBRyxFQUFFLFVBQVUsQ0FBQyxDQUFDO2lCQUM1QjtnQkFDRCxPQUFPLE9BQU8sQ0FBQyxHQUFHLEVBQUUsS0FBSyxDQUFDLEtBQUssQ0FBQyxDQUFDO1lBQ25DLENBQUM7U0FDRixDQUFDO0lBQ0osQ0FBQztDQUNGLENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyIvKipcbiAqIEBsaWNlbnNlXG4gKiBDb3B5cmlnaHQgMjAyMCBHb29nbGUgTExDLiBBbGwgUmlnaHRzIFJlc2VydmVkLlxuICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlIFwiTGljZW5zZVwiKTtcbiAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS5cbiAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdFxuICpcbiAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMFxuICpcbiAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmVcbiAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuIFwiQVMgSVNcIiBCQVNJUyxcbiAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLlxuICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZFxuICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuXG4gKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuICovXG5pbXBvcnQge1ByZWx1fSBmcm9tICcuLi9rZXJuZWxfbmFtZXMnO1xuaW1wb3J0IHtHcmFkQ29uZmlnfSBmcm9tICcuLi9rZXJuZWxfcmVnaXN0cnknO1xuaW1wb3J0IHtnZXRSZWR1Y3Rpb25BeGVzfSBmcm9tICcuLi9vcHMvYnJvYWRjYXN0X3V0aWwnO1xuaW1wb3J0IHtncmVhdGVyfSBmcm9tICcuLi9vcHMvZ3JlYXRlcic7XG5pbXBvcnQge211bH0gZnJvbSAnLi4vb3BzL211bCc7XG5pbXBvcnQge3Jlc2hhcGV9IGZyb20gJy4uL29wcy9yZXNoYXBlJztcbmltcG9ydCB7c3VtfSBmcm9tICcuLi9vcHMvc3VtJztcbmltcG9ydCB7d2hlcmV9IGZyb20gJy4uL29wcy93aGVyZSc7XG5pbXBvcnQge3plcm9zTGlrZX0gZnJvbSAnLi4vb3BzL3plcm9zX2xpa2UnO1xuaW1wb3J0IHtUZW5zb3J9IGZyb20gJy4uL3RlbnNvcic7XG5cbmV4cG9ydCBjb25zdCBwcmVsdUdyYWRDb25maWc6IEdyYWRDb25maWcgPSB7XG4gIGtlcm5lbE5hbWU6IFByZWx1LFxuICBpbnB1dHNUb1NhdmU6IFsneCcsICdhbHBoYSddLFxuICBncmFkRnVuYzogKGR5OiBUZW5zb3IsIHNhdmVkOiBUZW5zb3JbXSkgPT4ge1xuICAgIGNvbnN0IFt4LCBhbHBoYV0gPSBzYXZlZDtcbiAgICBjb25zdCBtYXNrID0gZ3JlYXRlcih4LCAwKTtcblxuICAgIHJldHVybiB7XG4gICAgICB4OiAoKSA9PiB3aGVyZShtYXNrLCBkeSwgbXVsKGR5LCBhbHBoYSkpLFxuICAgICAgYWxwaGE6ICgpID0+IHtcbiAgICAgICAgbGV0IHJlcyA9IHdoZXJlKG1hc2ssIHplcm9zTGlrZShkeSksIG11bChkeSwgeCkpO1xuICAgICAgICBjb25zdCByZWR1Y2VBeGVzID0gZ2V0UmVkdWN0aW9uQXhlcyhhbHBoYS5zaGFwZSwgZHkuc2hhcGUpO1xuICAgICAgICBpZiAocmVkdWNlQXhlcy5sZW5ndGggPiAwKSB7XG4gICAgICAgICAgcmVzID0gc3VtKHJlcywgcmVkdWNlQXhlcyk7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHJlc2hhcGUocmVzLCBhbHBoYS5zaGFwZSk7XG4gICAgICB9XG4gICAgfTtcbiAgfVxufTtcbiJdfQ==","/**\n * @license\n * Copyright 2022 Google Inc. All Rights Reserved.\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n * =============================================================================\n */\nimport { backend_util } from '../base';\nimport { Prod } from '../kernel_names';\nimport { cumprod } from '../ops/cumprod';\nimport { mul } from '../ops/mul';\nimport { reshape } from '../ops/reshape';\nimport { transpose } from '../ops/transpose';\n// Gradient for product operation on a single axis.\nfunction prodGradFn_(x, dy, axis) {\n // The gradient tensor (dy) has a set of axes removed, so we create re-shaped\n // versions (of size 1) for the removed axis; this supports broadcasting over\n // those dimensions.\n const expandedYShape = x.shape.slice();\n expandedYShape[axis] = 1;\n // The actual gradient computation.\n const expandedDy = reshape(dy, expandedYShape);\n const xCumProd = cumprod(x, axis, true, false);\n const xCumRevProd = cumprod(x, axis, true, true);\n const dx = mul(xCumProd, xCumRevProd);\n return mul(expandedDy, dx);\n}\n// Support gradients when the product is done on many axes at once.\n// This done py pushing all the axes on which the product is applied into a\n// single axis.\nfunction prodsGradFn_(x, dy, axis) {\n // Move all axes for doing prod over to the end of the tensor.\n const xRank = x.shape.length;\n const finalProdAxis = xRank - axis.length;\n const xPermutation = backend_util.getAxesPermutation(axis, xRank);\n let permutedX = x;\n if (xPermutation != null) {\n permutedX = transpose(x, xPermutation);\n }\n // Reshape all the prod dimensions into a single one, and do compute prod\n // gradients on that.\n const newShape = permutedX.shape.slice();\n const removedShape = newShape.splice(xRank - axis.length, axis.length);\n const endPartShape = removedShape.reduce((p, c) => p * c, 1);\n newShape.push(endPartShape);\n const reshapedPermutedX = permutedX.reshape(newShape);\n let prodGrad = prodGradFn_(reshapedPermutedX, dy, finalProdAxis);\n // Undo the re-shaping now we have the dx vector, and permute back to\n // original axes order.\n prodGrad = prodGrad.reshape(permutedX.shape);\n if (xPermutation != null) {\n const undoPermutation = backend_util.getUndoAxesPermutation(xPermutation);\n prodGrad = transpose(prodGrad, undoPermutation);\n }\n return prodGrad;\n}\n// Running example:\n// [\n// [\n// [3.0, 4.0],\n// [5.0, 6.0],\n// [7.0, 8.0]\n// ],\n// [\n// [3.0, 5.0],\n// [0.0, 6.0],\n// [5.0, 6.0]\n// ]\n// ]\n//\nexport const prodGradConfig = {\n kernelName: Prod,\n inputsToSave: ['x'],\n gradFunc: (dy, saved, attrs) => {\n const [x] = saved;\n const { axis } = attrs;\n let axisArr = [];\n if (axis === undefined || axis === null) {\n axisArr = x.shape.map((_, i) => i);\n }\n else if (typeof axis === 'number') {\n axisArr = [axis];\n }\n else {\n axisArr = axis;\n }\n return { x: () => prodsGradFn_(x, dy, axisArr) };\n }\n};\n//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiUHJvZF9ncmFkLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vLi4vdGZqcy1jb3JlL3NyYy9ncmFkaWVudHMvUHJvZF9ncmFkLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBOzs7Ozs7Ozs7Ozs7Ozs7R0FlRztBQUVILE9BQU8sRUFBQyxZQUFZLEVBQUMsTUFBTSxTQUFTLENBQUM7QUFDckMsT0FBTyxFQUFDLElBQUksRUFBWSxNQUFNLGlCQUFpQixDQUFDO0FBRWhELE9BQU8sRUFBQyxPQUFPLEVBQUMsTUFBTSxnQkFBZ0IsQ0FBQztBQUN2QyxPQUFPLEVBQUMsR0FBRyxFQUFDLE1BQU0sWUFBWSxDQUFDO0FBQy9CLE9BQU8sRUFBQyxPQUFPLEVBQUMsTUFBTSxnQkFBZ0IsQ0FBQztBQUN2QyxPQUFPLEVBQUMsU0FBUyxFQUFDLE1BQU0sa0JBQWtCLENBQUM7QUFHM0MsbURBQW1EO0FBQ25ELFNBQVMsV0FBVyxDQUFDLENBQVMsRUFBRSxFQUFVLEVBQUUsSUFBWTtJQUN0RCw2RUFBNkU7SUFDN0UsNkVBQTZFO0lBQzdFLG9CQUFvQjtJQUNwQixNQUFNLGNBQWMsR0FBRyxDQUFDLENBQUMsS0FBSyxDQUFDLEtBQUssRUFBRSxDQUFDO0lBQ3ZDLGNBQWMsQ0FBQyxJQUFJLENBQUMsR0FBRyxDQUFDLENBQUM7SUFFekIsbUNBQW1DO0lBQ25DLE1BQU0sVUFBVSxHQUFHLE9BQU8sQ0FBQyxFQUFFLEVBQUUsY0FBYyxDQUFDLENBQUM7SUFDL0MsTUFBTSxRQUFRLEdBQUcsT0FBTyxDQUFDLENBQUMsRUFBRSxJQUFJLEVBQUUsSUFBSSxFQUFFLEtBQUssQ0FBQyxDQUFDO0lBQy9DLE1BQU0sV0FBVyxHQUFHLE9BQU8sQ0FBQyxDQUFDLEVBQUUsSUFBSSxFQUFFLElBQUksRUFBRSxJQUFJLENBQUMsQ0FBQztJQUNqRCxNQUFNLEVBQUUsR0FBRyxHQUFHLENBQUMsUUFBUSxFQUFFLFdBQVcsQ0FBQyxDQUFDO0lBQ3RDLE9B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O1lBQ0wsT0FBTyxHQUFHLElBQUksQ0FBQztTQUNoQjtRQUNELE9BQU8sRUFBQyxDQUFDLEVBQUUsR0FBRyxFQUFFLENBQUMsWUFBWSxDQUFDLENBQUMsRUFBRSxFQUFZLEVBQUUsT0FBTyxDQUFDLEVBQUMsQ0FBQztJQUMzRCxDQUFDO0NBQ0YsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbIi8qKlxuICogQGxpY2Vuc2VcbiAqIENvcHlyaWdodCAyMDIyIEdvb2dsZSBJbmMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuXG4gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgXCJMaWNlbnNlXCIpO1xuICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLlxuICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0XG4gKlxuICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wXG4gKlxuICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZVxuICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gXCJBUyBJU1wiIEJBU0lTLFxuICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuXG4gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kXG4gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS5cbiAqID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4gKi9cblxuaW1wb3J0IHtiYWNrZW5kX3V0aWx9IGZyb20gJy4uL2Jhc2UnO1xuaW1wb3J0IHtQcm9kLCBQcm9kQXR0cnN9IGZyb20gJy4uL2tlcm5lbF9uYW1lcyc7XG5pbXBvcnQge0dyYWRDb25maWcsIE5hbWVkQXR0ck1hcH0gZnJvbSAnLi4va2VybmVsX3JlZ2lzdHJ5JztcbmltcG9ydCB7Y3VtcHJvZH0gZnJvbSAnLi4vb3BzL2N1bXByb2QnO1xuaW1wb3J0IHttdWx9IGZyb20gJy4uL29wcy9tdWwnO1xuaW1wb3J0IHtyZXNoYXBlfSBmcm9tICcuLi9vcHMvcmVzaGFwZSc7XG5pbXBvcnQge3RyYW5zcG9zZX0gZnJvbSAnLi4vb3BzL3RyYW5zcG9zZSc7XG5pbXBvcnQge1RlbnNvcn0gZnJvbSAnLi4vdGVuc29yJztcblxuLy8gR3JhZGllbnQgZm9yIHByb2R1Y3Qgb3BlcmF0aW9uIG9uIGEgc2luZ2xlIGF4aXMuXG5mdW5jdGlvbiBwcm9kR3JhZEZuXyh4OiBUZW5zb3IsIGR5OiBUZW5zb3IsIGF4aXM6IG51bWJlcik6IFRlbnNvciB7XG4gIC8vIFRoZSBncmFkaWVudCB0ZW5zb3IgKGR5KSBoYXMgYSBzZXQgb2YgYXhlcyByZW1vdmVkLCBzbyB3ZSBjcmVhdGUgcmUtc2hhcGVkXG4gIC8vIHZlcnNpb25zIChvZiBzaXplIDEpIGZvciB0aGUgcmVtb3ZlZCBheGlzOyB0aGlzIHN1cHBvcnRzIGJyb2FkY2FzdGluZyBvdmVyXG4gIC8vIHRob3NlIGRpbWVuc2lvbnMuXG4gIGNvbnN0IGV4cGFuZGVkWVNoYXBlID0geC5zaGFwZS5zbGljZSgpO1xuICBleHBhbmRlZFlTaGFwZVtheGlzXSA9IDE7XG5cbiAgLy8gVGhlIGFjdHVhbCBncmFkaWVudCBjb21wdXRhdGlvbi5cbiAgY29uc3QgZXhwYW5kZWREeSA9IHJlc2hhcGUoZHksIGV4cGFuZGVkWVNoYXBlKTtcbiAgY29uc3QgeEN1bVByb2QgPSBjdW1wcm9kKHgsIGF4aXMsIHRydWUsIGZhbHNlKTtcbiAgY29uc3QgeEN1bVJldlByb2QgPSBjdW1wcm9kKHgsIGF4aXMsIHRydWUsIHRydWUpO1xuICBjb25zdCBkeCA9IG11bCh4Q3VtUHJvZCwgeEN1bVJldlByb2QpO1xuICByZXR1cm4gbXVsKGV4cGFuZGVkRHksIGR4KTtcbn1cblxuLy8gU3VwcG9ydCBncmFkaWVudHMgd2hlbiB0aGUgcHJvZHVjdCBpcyBkb25lIG9uIG1hbnkgYXhlcyBhdCBvbmNlLlxuLy8gVGhpcyBkb25lIHB5IHB1c2hpbmcgYWxsIHRoZSBheGVzIG9uIHdoaWNoIHRoZSBwcm9kdWN0IGlzIGFwcGxpZWQgaW50byBhXG4vLyBzaW5nbGUgYXhpcy5cbmZ1bmN0aW9uIHByb2RzR3JhZEZuXyh4OiBUZW5zb3IsIGR5OiBUZW5zb3IsIGF4aXM6IG51bWJlcltdKTogVGVuc29yIHtcbiAgLy8gTW92ZSBhbGwgYXhlcyBmb3IgZG9pbmcgcHJvZCBvdmVyIHRvIHRoZSBlbmQgb2YgdGhlIHRlbnNvci5cbiAgY29uc3QgeFJhbmsgPSB4LnNoYXBlLmxlbmd0aDtcbiAgY29uc3QgZmluYWxQcm9kQXhpcyA9IHhSYW5rIC0gYXhpcy5sZW5ndGg7XG4gIGNvbnN0IHhQZXJtdXRhdGlvbiA9IGJhY2tlbmRfdXRpbC5nZXRBeGVzUGVybXV0YXRpb24oYXhpcywgeFJhbmspO1xuICBsZXQgcGVybXV0ZWRYID0geDtcbiAgaWYgKHhQZXJtdXRhdGlvbiAhPSBudWxsKSB7XG4gICAgcGVybXV0ZWRYID0gdHJhbnNwb3NlKHgsIHhQZXJtdXRhdGlvbik7XG4gIH1cblxuICAvLyBSZXNoYXBlIGFsbCB0aGUgcHJvZCBkaW1lbnNpb25zIGludG8gYSBzaW5nbGUgb25lLCBhbmQgZG8gY29tcHV0ZSBwcm9kXG4gIC8vIGdyYWRpZW50cyBvbiB0aGF0LlxuICBjb25zdCBuZXdTaGFwZSA9IHBlcm11dGVkWC5zaGFwZS5zbGljZSgpO1xuICBjb25zdCByZW1vdmVkU2hhcGUgPSBuZXdTaGFwZS5zcGxpY2UoeFJhbmsgLSBheGlzLmxlbmd0aCwgYXhpcy5sZW5ndGgpO1xuICBjb25zdCBlbmRQYXJ0U2hhcGUgPSByZW1vdmVkU2hhcGUucmVkdWNlKChwLCBjKSA9PiBwICogYywgMSk7XG4gIG5ld1NoYXBlLnB1c2goZW5kUGFydFNoYXBlKTtcbiAgY29uc3QgcmVzaGFwZWRQZXJtdXRlZFggPSBwZXJtdXRlZFgucmVzaGFwZShuZXdTaGFwZSk7XG4gIGxldCBwcm9kR3JhZCA9IHByb2RHcmFkRm5fKHJlc2hhcGVkUGVybXV0ZWRYLCBkeSwgZmluYWxQcm9kQXhpcyk7XG5cbiAgLy8gVW5kbyB0aGUgcmUtc2hhcGluZyBub3cgd2UgaGF2ZSB0aGUgZHggdmVjdG9yLCBhbmQgcGVybXV0ZSBiYWNrIHRvXG4gIC8vIG9yaWdpbmFsIGF4ZXMgb3JkZXIuXG4gIHByb2RHcmFkID0gcHJvZEdyYWQucmVzaGFwZShwZXJtdXRlZFguc2hhcGUpO1xuICBpZiAoeFBlcm11dGF0aW9uICE9IG51bGwpIHtcbiAgICBjb25zdCB1bmRvUGVybXV0YXRpb24gPSBiYWNrZW5kX3V0aWwuZ2V0VW5kb0F4ZXNQZXJtdXRhdGlvbih4UGVybXV0YXRpb24pO1xuICAgIHByb2RHcmFkID0gdHJhbnNwb3NlKHByb2RHcmFkLCB1bmRvUGVybXV0YXRpb24pO1xuICB9XG4gIHJldHVybiBwcm9kR3JhZDtcbn1cblxuLy8gUnVubmluZyBleGFtcGxlOlxuLy8gW1xuLy8gICBbXG4vLyAgICAgWzMuMCwgNC4wXSxcbi8vICAgICBbNS4wLCA2LjBdLFxuLy8gICAgIFs3LjAsIDguMF1cbi8vICAgXSxcbi8vICAgW1xuLy8gICAgIFszLjAsIDUuMF0sXG4vLyAgICAgWzAuMCwgNi4wXSxcbi8vICAgICBbNS4wLCA2LjBdXG4vLyAgIF1cbi8vIF1cbi8vXG5leHBvcnQgY29uc3QgcHJvZEdyYWRDb25maWc6IEdyYWRDb25maWcgPSB7XG4gIGtlcm5lbE5hbWU6IFByb2QsXG4gIGlucHV0c1RvU2F2ZTogWyd4J10sXG4gIGdyYWRGdW5jOiAoZHk6IFRlbnNvcnxUZW5zb3JbXSwgc2F2ZWQ6IFRlbnNvcltdLCBhdHRyczogTmFtZWRBdHRyTWFwKSA9PiB7XG4gICAgY29uc3QgW3hdID0gc2F2ZWQ7XG4gICAgY29uc3Qge2F4aXN9ID0gKGF0dHJzIGFzIHt9KSBhcyBQcm9kQXR0cnM7XG4gICAgbGV0IGF4aXNBcnIgPSBbXSBhcyBudW1iZXJbXTtcbiAgICBpZiAoYXhpcyA9PT0gdW5kZWZpbmVkIHx8IGF4aXMgPT09IG51bGwpIHtcbiAgICAgIGF4aXNBcnIgPSB4LnNoYXBlLm1hcCgoXywgaSkgPT4gaSk7XG4gICAgfSBlbHNlIGlmICh0eXBlb2YgYXhpcyA9PT0gJ251bWJlcicpIHtcbiAgICAgIGF4aXNBcnIgPSBbYXhpc107XG4gICAgfSBlbHNlIHtcbiAgICAgIGF4aXNBcnIgPSBheGlzO1xuICAgIH1cbiAgICByZXR1cm4ge3g6ICgpID0+IHByb2RzR3JhZEZuXyh4LCBkeSBhcyBUZW5zb3IsIGF4aXNBcnIpfTtcbiAgfVxufTtcbiJdfQ==","/**\n * @license\n * Copyright 2020 Google LLC. All Rights Reserved.\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n * =============================================================================\n */\nimport { RealDiv } from '../kernel_names';\nimport * as broadcast_util from '../ops/broadcast_util';\nimport { cast } from '../ops/cast';\nimport { div } from '../ops/div';\nimport { mul } from '../ops/mul';\nimport { neg } from '../ops/neg';\nimport { reshape } from '../ops/reshape';\nimport { square } from '../ops/square';\nimport { sum } from '../ops/sum';\nexport const divGradConfig = {\n kernelName: RealDiv,\n inputsToSave: ['a', 'b'],\n gradFunc: (dy, saved) => {\n const [a, b] = saved;\n const outShape = broadcast_util.assertAndGetBroadcastShape(a.shape, b.shape);\n const derA = () => {\n const res = div(dy, cast(b, 'float32'));\n const reduceAxes = broadcast_util.getReductionAxes(a.shape, outShape);\n if (reduceAxes.length > 0) {\n return reshape(sum(res, reduceAxes), a.shape);\n }\n return res;\n };\n const derB = () => {\n let res = mul(dy, cast(a, 'float32'));\n const reduceAxes = broadcast_util.getReductionAxes(b.shape, outShape);\n if (reduceAxes.length > 0) {\n res = reshape(sum(res, reduceAxes), b.shape);\n }\n const tmp = square(b);\n return neg(div(res, cast(tmp, 'float32')));\n };\n return { a: derA, b: derB };\n }\n};\n//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiUmVhbERpdl9ncmFkLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vLi4vdGZqcy1jb3JlL3NyYy9ncmFkaWVudHMvUmVhbERpdl9ncmFkLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBOzs7Ozs7Ozs7Ozs7Ozs7R0FlRztBQUVILE9BQU8sRUFBQyxPQUFPLEVBQUMsTUFBTSxpQkFBaUIsQ0FBQztBQUV4QyxPQUFPLEtBQUssY0FBYyxNQUFNLHVCQUF1QixDQUFDO0FBQ3hELE9BQU8sRUFBQyxJQUFJLEVBQUMsTUFBTSxhQUFhLENBQUM7QUFDakMsT0FBTyxFQUFDLEdBQUcsRUFBQyxNQUFNLFlBQVksQ0FBQztBQUMvQixPQUFPLEVBQUMsR0FBRyxFQUFDLE1BQU0sWUFBWSxDQUFDO0FBQy9CLE9BQU8sRUFBQyxHQUFHLEVBQUMsTUFBTSxZQUFZLENBQUM7QUFDL0IsT0FBTyxFQUFDLE9BQU8sRUFBQyxNQUFNLGdCQUFnQixDQUFDO0FBQ3ZDLE9BQU8sRUFBQyxNQUFNLEVBQUMsTUFBTSxlQUFlLENBQUM7QUFDckMsT0FBTyxFQUFDLEdBQUcsRUFBQyxNQUFNLFlBQVksQ0FBQztBQUcvQixNQUFNLENBQUMsTUFBTSxhQUFhLEdBQWU7SUFDdkMsVUFBVSxFQUFFLE9BQU87SUFDbkIsWUFBWSxFQUFFLENBQUMsR0FBRyxFQUFFLEdBQUcsQ0FBQztJQUN4QixRQUFRLEVBQUUsQ0FBQyxFQUFVLEVBQUUsS0FBZSxFQUFFLEVBQUU7UUFDeEMsTUFBTSxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsR0FBRyxLQUFLLENBQUM7UUFDckIsTUFBTSxRQUFRLEdBQ1YsY0FBYyxDQUFDLDBCQUEwQixDQUFDLENBQUMsQ0FBQyxLQUFLLEVBQUUsQ0FBQyxDQUFDLEtBQUssQ0FBQyxDQUFDO1FBQ2hFLE1BQU0sSUFBSSxHQUFHLEdBQUcsRUFBRTtZQUNoQixNQUFNLEdBQUcsR0FBRyxHQUFHLENBQUMsRUFBRSxFQUFFLElBQUksQ0FBQyxDQUFDLEVBQUUsU0FBUyxDQUFDLENBQUMsQ0FBQztZQUN4QyxNQUFNLFVBQVUsR0FBRyxjQUFjLENBQUMsZ0JBQWdCLENBQUMsQ0FBQyxDQUFDLEtBQUssRUFBRSxRQUFRLENBQUMsQ0FBQztZQUN0RSxJQUFJLFVBQVUsQ0FBQyxNQUFNLEdBQUcsQ0FBQyxFQUFFO2dCQUN6QixPQUFPLE9BQU8sQ0FBQyxHQUFHLENBQUMsR0FBRyxFQUFFLFVBQVUsQ0FBQyxFQUFFLENBQUMsQ0FBQyxLQUFLLENBQUMsQ0FBQzthQUMvQztZQUNELE9BQU8sR0FBRyxDQUFDO1FBQ2IsQ0FBQyxDQUFDO1FBQ0YsTUFBTSxJQUFJLEdBQUcsR0FBRyxFQUFFO1lBQ2hCLElBQUksR0FBRyxHQUFHLEdBQUcsQ0FBQyxFQUFFLEVBQUUsSUFBSSxDQUFDLENBQUMsRUFBRSxTQUFTLENBQUMsQ0FBQyxDQUFDO1lBQ3RDLE1BQU0sVUFBVSxHQUFHLGNBQWMsQ0FBQyxnQkFBZ0IsQ0FBQyxDQUFDLENBQUMsS0FBSyxFQUFFLFFBQVEsQ0FBQyxDQUFDO1lBQ3RFLElBQUksVUFBVSxDQUFDLE1BQU0sR0FBRyxDQUFDLEVBQUU7Z0JBQ3pCLEdBQUcsR0FBRyxPQUFPLENBQUMsR0FBRyxDQUFDLEdBQUcsRUFBRSxVQUFVLENBQUMsRUFBRSxDQUFDLENBQUMsS0FBSyxDQUFDLENBQUM7YUFDOUM7WUFDRCxNQUFNLEdBQUcsR0FBRyxNQUFNLENBQUMsQ0FBQyxDQUFDLENBQUM7WUFDdEIsT0FBTyxHQUFHLENBQUMsR0FBRyxDQUFDLEdBQUcsRUFBRSxJQUFJLENBQUMsR0FBRyxFQUFFLFNBQVMsQ0FBQyxDQUFDLENBQUMsQ0FBQztRQUM3QyxDQUFDLENBQUM7UUFDRixPQUFPLEVBQUMsQ0FBQyxFQUFFLElBQUksRUFBRSxDQUFDLEVBQUUsSUFBSSxFQUFDLENBQUM7SUFDNUIsQ0FBQztDQUNGLENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyIvKipcbiAqIEBsaWNlbnNlXG4gKiBDb3B5cmlnaHQgMjAyMCBHb29nbGUgTExDLiBBbGwgUmlnaHRzIFJlc2VydmVkLlxuICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlIFwiTGljZW5zZVwiKTtcbiAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS5cbiAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdFxuICpcbiAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMFxuICpcbiAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmVcbiAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuIFwiQVMgSVNcIiBCQVNJUyxcbiAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLlxuICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZFxuICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuXG4gKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuICovXG5cbmltcG9ydCB7UmVhbERpdn0gZnJvbSAnLi4va2VybmVsX25hbWVzJztcbmltcG9ydCB7R3JhZENvbmZpZ30gZnJvbSAnLi4va2VybmVsX3JlZ2lzdHJ5JztcbmltcG9ydCAqIGFzIGJyb2FkY2FzdF91dGlsIGZyb20gJy4uL29wcy9icm9hZGNhc3RfdXRpbCc7XG5pbXBvcnQge2Nhc3R9IGZyb20gJy4uL29wcy9jYXN0JztcbmltcG9ydCB7ZGl2fSBmcm9tICcuLi9vcHMvZGl2JztcbmltcG9ydCB7bXVsfSBmcm9tICcuLi9vcHMvbXVsJztcbmltcG9ydCB7bmVnfSBmcm9tICcuLi9vcHMvbmVnJztcbmltcG9ydCB7cmVzaGFwZX0gZnJvbSAnLi4vb3BzL3Jlc2hhcGUnO1xuaW1wb3J0IHtzcXVhcmV9IGZyb20gJy4uL29wcy9zcXVhcmUnO1xuaW1wb3J0IHtzdW19IGZyb20gJy4uL29wcy9zdW0nO1xuaW1wb3J0IHtUZW5zb3J9IGZyb20gJy4uL3RlbnNvcic7XG5cbmV4cG9ydCBjb25zdCBkaXZHcmFkQ29uZmlnOiBHcmFkQ29uZmlnID0ge1xuICBrZXJuZWxOYW1lOiBSZWFsRGl2LFxuICBpbnB1dHNUb1NhdmU6IFsnYScsICdiJ10sXG4gIGdyYWRGdW5jOiAoZHk6IFRlbnNvciwgc2F2ZWQ6IFRlbnNvcltdKSA9PiB7XG4gICAgY29uc3QgW2EsIGJdID0gc2F2ZWQ7XG4gICAgY29uc3Qgb3V0U2hhcGUgPVxuICAgICAgICBicm9hZGNhc3RfdXRpbC5hc3NlcnRBbmRHZXRCcm9hZGNhc3RTaGFwZShhLnNoYXBlLCBiLnNoYXBlKTtcbiAgICBjb25zdCBkZXJBID0gKCkgPT4ge1xuICAgICAgY29uc3QgcmVzID0gZGl2KGR5LCBjYXN0KGIsICdmbG9hdDMyJykpO1xuICAgICAgY29uc3QgcmVkdWNlQXhlcyA9IGJyb2FkY2FzdF91dGlsLmdldFJlZHVjdGlvbkF4ZXMoYS5zaGFwZSwgb3V0U2hhcGUpO1xuICAgICAgaWYgKHJlZHVjZUF4ZXMubGVuZ3RoID4gMCkge1xuICAgICAgICByZXR1cm4gcmVzaGFwZShzdW0ocmVzLCByZWR1Y2VBeGVzKSwgYS5zaGFwZSk7XG4gICAgICB9XG4gICAgICByZXR1cm4gcmVzO1xuICAgIH07XG4gICAgY29uc3QgZGVyQiA9ICgpID0+IHtcbiAgICAgIGxldCByZXMgPSBtdWwoZHksIGNhc3QoYSwgJ2Zsb2F0MzInKSk7XG4gICAgICBjb25zdCByZWR1Y2VBeGVzID0gYnJvYWRjYXN0X3V0aWwuZ2V0UmVkdWN0aW9uQXhlcyhiLnNoYXBlLCBvdXRTaGFwZSk7XG4gICAgICBpZiAocmVkdWNlQXhlcy5sZW5ndGggPiAwKSB7XG4gICAgICAgIHJlcyA9IHJlc2hhcGUoc3VtKHJlcywgcmVkdWNlQXhlcyksIGIuc2hhcGUpO1xuICAgICAgfVxuICAgICAgY29uc3QgdG1wID0gc3F1YXJlKGIpO1xuICAgICAgcmV0dXJuIG5lZyhkaXYocmVzLCBjYXN0KHRtcCwgJ2Zsb2F0MzInKSkpO1xuICAgIH07XG4gICAgcmV0dXJuIHthOiBkZXJBLCBiOiBkZXJCfTtcbiAgfVxufTtcbiJdfQ==","/**\n * @license\n * Copyright 2020 Google LLC. All Rights Reserved.\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n * =============================================================================\n */\nimport { Reciprocal } from '../kernel_names';\nimport { div } from '../ops/div';\nimport { neg } from '../ops/neg';\nimport { square } from '../ops/square';\nexport const reciprocalGradConfig = {\n kernelName: Reciprocal,\n inputsToSave: ['x'],\n gradFunc: (dy, saved) => {\n const [x] = saved;\n return { x: () => div(dy, neg(square(x))) };\n }\n};\n//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiUmVjaXByb2NhbF9ncmFkLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vLi4vdGZqcy1jb3JlL3NyYy9ncmFkaWVudHMvUmVjaXByb2NhbF9ncmFkLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBOzs7Ozs7Ozs7Ozs7Ozs7R0FlRztBQUVILE9BQU8sRUFBQyxVQUFVLEVBQUMsTUFBTSxpQkFBaUIsQ0FBQztBQUUzQyxPQUFPLEVBQUMsR0FBRyxFQUFDLE1BQU0sWUFBWSxDQUFDO0FBQy9CLE9BQU8sRUFBQyxHQUFHLEVBQUMsTUFBTSxZQUFZLENBQUM7QUFDL0IsT0FBTyxFQUFDLE1BQU0sRUFBQyxNQUFNLGVBQWUsQ0FBQztBQUdyQyxNQUFNLENBQUMsTUFBTSxvQkFBb0IsR0FBZTtJQUM5QyxVQUFVLEVBQUUsVUFBVTtJQUN0QixZQUFZLEVBQUUsQ0FBQyxHQUFHLENBQUM7SUFDbkIsUUFBUSxFQUFFLENBQUMsRUFBVSxFQUFFLEtBQWUsRUFBRSxFQUFFO1FBQ3hDLE1BQU0sQ0FBQyxDQUFDLENBQUMsR0FBRyxLQUFLLENBQUM7UUFDbEIsT0FBTyxFQUFDLENBQUMsRUFBRSxHQUFHLEVBQUUsQ0FBQyxHQUFHLENBQUMsRUFBRSxFQUFFLEdBQUcsQ0FBQyxNQUFNLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxFQUFDLENBQUM7SUFDNUMsQ0FBQztDQUNGLENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyIvKipcbiAqIEBsaWNlbnNlXG4gKiBDb3B5cmlnaHQgMjAyMCBHb29nbGUgTExDLiBBbGwgUmlnaHRzIFJlc2VydmVkLlxuICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlIFwiTGljZW5zZVwiKTtcbiAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS5cbiAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdFxuICpcbiAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMFxuICpcbiAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmVcbiAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuIFwiQVMgSVNcIiBCQVNJUyxcbiAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLlxuICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZFxuICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuXG4gKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuICovXG5cbmltcG9ydCB7UmVjaXByb2NhbH0gZnJvbSAnLi4va2VybmVsX25hbWVzJztcbmltcG9ydCB7R3JhZENvbmZpZ30gZnJvbSAnLi4va2VybmVsX3JlZ2lzdHJ5JztcbmltcG9ydCB7ZGl2fSBmcm9tICcuLi9vcHMvZGl2JztcbmltcG9ydCB7bmVnfSBmcm9tICcuLi9vcHMvbmVnJztcbmltcG9ydCB7c3F1YXJlfSBmcm9tICcuLi9vcHMvc3F1YXJlJztcbmltcG9ydCB7VGVuc29yfSBmcm9tICcuLi90ZW5zb3InO1xuXG5leHBvcnQgY29uc3QgcmVjaXByb2NhbEdyYWRDb25maWc6IEdyYWRDb25maWcgPSB7XG4gIGtlcm5lbE5hbWU6IFJlY2lwcm9jYWwsXG4gIGlucHV0c1RvU2F2ZTogWyd4J10sXG4gIGdyYWRGdW5jOiAoZHk6IFRlbnNvciwgc2F2ZWQ6IFRlbnNvcltdKSA9PiB7XG4gICAgY29uc3QgW3hdID0gc2F2ZWQ7XG4gICAgcmV0dXJuIHt4OiAoKSA9PiBkaXYoZHksIG5lZyhzcXVhcmUoeCkpKX07XG4gIH1cbn07XG4iXX0=","/**\n * @license\n * Copyright 2020 Google LLC. All Rights Reserved.\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n * =============================================================================\n */\nimport { Relu6 } from '../kernel_names';\nimport { cast } from '../ops/cast';\nimport { lessEqual } from '../ops/less_equal';\nimport { mul } from '../ops/mul';\nimport { step } from '../ops/step';\nexport const relu6GradConfig = {\n kernelName: Relu6,\n inputsToSave: ['x'],\n gradFunc: (dy, saved) => {\n const [x] = saved;\n const mask = mul(lessEqual(x, 6), step(x));\n return { x: () => mul(dy, cast(mask, 'float32')) };\n }\n};\n//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiUmVsdTZfZ3JhZC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uLy4uL3RmanMtY29yZS9zcmMvZ3JhZGllbnRzL1JlbHU2X2dyYWQudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUE7Ozs7Ozs7Ozs7Ozs7OztHQWVHO0FBQ0gsT0FBTyxFQUFDLEtBQUssRUFBQyxNQUFNLGlCQUFpQixDQUFDO0FBRXRDLE9BQU8sRUFBQyxJQUFJLEVBQUMsTUFBTSxhQUFhLENBQUM7QUFDakMsT0FBTyxFQUFDLFNBQVMsRUFBQyxNQUFNLG1CQUFtQixDQUFDO0FBQzVDLE9BQU8sRUFBQyxHQUFHLEVBQUMsTUFBTSxZQUFZLENBQUM7QUFDL0IsT0FBTyxFQUFDLElBQUksRUFBQyxNQUFNLGFBQWEsQ0FBQztBQUdqQyxNQUFNLENBQUMsTUFBTSxlQUFlLEdBQWU7SUFDekMsVUFBVSxFQUFFLEtBQUs7SUFDakIsWUFBWSxFQUFFLENBQUMsR0FBRyxDQUFDO0lBQ25CLFFBQVEsRUFBRSxDQUFDLEVBQVUsRUFBRSxLQUFlLEVBQUUsRUFBRTtRQUN4QyxNQUFNLENBQUMsQ0FBQyxDQUFDLEdBQUcsS0FBSyxDQUFDO1FBQ2xCLE1BQU0sSUFBSSxHQUFHLEdBQUcsQ0FBQyxTQUFTLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxFQUFFLElBQUksQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDO1FBRTNDLE9BQU8sRUFBQyxDQUFDLEVBQUUsR0FBRyxFQUFFLENBQUMsR0FBRyxDQUFDLEVBQUUsRUFBRSxJQUFJLENBQUMsSUFBSSxFQUFFLFNBQVMsQ0FBQyxDQUFDLEVBQUMsQ0FBQztJQUNuRCxDQUFDO0NBQ0YsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbIi8qKlxuICogQGxpY2Vuc2VcbiAqIENvcHlyaWdodCAyMDIwIEdvb2dsZSBMTEMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuXG4gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgXCJMaWNlbnNlXCIpO1xuICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLlxuICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0XG4gKlxuICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wXG4gKlxuICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZVxuICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gXCJBUyBJU1wiIEJBU0lTLFxuICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuXG4gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kXG4gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS5cbiAqID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4gKi9cbmltcG9ydCB7UmVsdTZ9IGZyb20gJy4uL2tlcm5lbF9uYW1lcyc7XG5pbXBvcnQge0dyYWRDb25maWd9IGZyb20gJy4uL2tlcm5lbF9yZWdpc3RyeSc7XG5pbXBvcnQge2Nhc3R9IGZyb20gJy4uL29wcy9jYXN0JztcbmltcG9ydCB7bGVzc0VxdWFsfSBmcm9tICcuLi9vcHMvbGVzc19lcXVhbCc7XG5pbXBvcnQge211bH0gZnJvbSAnLi4vb3BzL211bCc7XG5pbXBvcnQge3N0ZXB9IGZyb20gJy4uL29wcy9zdGVwJztcbmltcG9ydCB7VGVuc29yfSBmcm9tICcuLi90ZW5zb3InO1xuXG5leHBvcnQgY29uc3QgcmVsdTZHcmFkQ29uZmlnOiBHcmFkQ29uZmlnID0ge1xuICBrZXJuZWxOYW1lOiBSZWx1NixcbiAgaW5wdXRzVG9TYXZlOiBbJ3gnXSxcbiAgZ3JhZEZ1bmM6IChkeTogVGVuc29yLCBzYXZlZDogVGVuc29yW10pID0+IHtcbiAgICBjb25zdCBbeF0gPSBzYXZlZDtcbiAgICBjb25zdCBtYXNrID0gbXVsKGxlc3NFcXVhbCh4LCA2KSwgc3RlcCh4KSk7XG5cbiAgICByZXR1cm4ge3g6ICgpID0+IG11bChkeSwgY2FzdChtYXNrLCAnZmxvYXQzMicpKX07XG4gIH1cbn07XG4iXX0=","/**\n * @license\n * Copyright 2020 Google LLC. All Rights Reserved.\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n * =============================================================================\n */\nimport { Relu } from '../kernel_names';\nimport { cast } from '../ops/cast';\nimport { mul } from '../ops/mul';\nimport { step } from '../ops/step';\nexport const reluGradConfig = {\n kernelName: Relu,\n inputsToSave: ['x'],\n gradFunc: (dy, saved) => {\n const [x] = saved;\n return { x: () => mul(dy, cast(step(x), 'float32')) };\n }\n};\n//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiUmVsdV9ncmFkLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vLi4vdGZqcy1jb3JlL3NyYy9ncmFkaWVudHMvUmVsdV9ncmFkLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBOzs7Ozs7Ozs7Ozs7Ozs7R0FlRztBQUNILE9BQU8sRUFBQyxJQUFJLEVBQUMsTUFBTSxpQkFBaUIsQ0FBQztBQUVyQyxPQUFPLEVBQUMsSUFBSSxFQUFDLE1BQU0sYUFBYSxDQUFDO0FBQ2pDLE9BQU8sRUFBQyxHQUFHLEVBQUMsTUFBTSxZQUFZLENBQUM7QUFDL0IsT0FBTyxFQUFDLElBQUksRUFBQyxNQUFNLGFBQWEsQ0FBQztBQUdqQyxNQUFNLENBQUMsTUFBTSxjQUFjLEdBQWU7SUFDeEMsVUFBVSxFQUFFLElBQUk7SUFDaEIsWUFBWSxFQUFFLENBQUMsR0FBRyxDQUFDO0lBQ25CLFFBQVEsRUFBRSxDQUFDLEVBQVUsRUFBRSxLQUFlLEVBQUUsRUFBRTtRQUN4QyxNQUFNLENBQUMsQ0FBQyxDQUFDLEdBQUcsS0FBSyxDQUFDO1FBQ2xCLE9BQU8sRUFBQyxDQUFDLEVBQUUsR0FBRyxFQUFFLENBQUMsR0FBRyxDQUFDLEVBQUUsRUFBRSxJQUFJLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxFQUFFLFNBQVMsQ0FBQyxDQUFDLEVBQUMsQ0FBQztJQUN0RCxDQUFDO0NBQ0YsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbIi8qKlxuICogQGxpY2Vuc2VcbiAqIENvcHlyaWdodCAyMDIwIEdvb2dsZSBMTEMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuXG4gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgXCJMaWNlbnNlXCIpO1xuICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLlxuICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0XG4gKlxuICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wXG4gKlxuICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZVxuICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gXCJBUyBJU1wiIEJBU0lTLFxuICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuXG4gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kXG4gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS5cbiAqID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4gKi9cbmltcG9ydCB7UmVsdX0gZnJvbSAnLi4va2VybmVsX25hbWVzJztcbmltcG9ydCB7R3JhZENvbmZpZ30gZnJvbSAnLi4va2VybmVsX3JlZ2lzdHJ5JztcbmltcG9ydCB7Y2FzdH0gZnJvbSAnLi4vb3BzL2Nhc3QnO1xuaW1wb3J0IHttdWx9IGZyb20gJy4uL29wcy9tdWwnO1xuaW1wb3J0IHtzdGVwfSBmcm9tICcuLi9vcHMvc3RlcCc7XG5pbXBvcnQge1RlbnNvcn0gZnJvbSAnLi4vdGVuc29yJztcblxuZXhwb3J0IGNvbnN0IHJlbHVHcmFkQ29uZmlnOiBHcmFkQ29uZmlnID0ge1xuICBrZXJuZWxOYW1lOiBSZWx1LFxuICBpbnB1dHNUb1NhdmU6IFsneCddLFxuICBncmFkRnVuYzogKGR5OiBUZW5zb3IsIHNhdmVkOiBUZW5zb3JbXSkgPT4ge1xuICAgIGNvbnN0IFt4XSA9IHNhdmVkO1xuICAgIHJldHVybiB7eDogKCkgPT4gbXVsKGR5LCBjYXN0KHN0ZXAoeCksICdmbG9hdDMyJykpfTtcbiAgfVxufTtcbiJdfQ==","/**\n * @license\n * Copyright 2020 Google Inc. All Rights Reserved.\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n * =============================================================================\n */\nimport { Reshape } from '../kernel_names';\nimport { reshape } from '../ops/reshape';\nexport const reshapeGradConfig = {\n kernelName: Reshape,\n inputsToSave: ['x'],\n gradFunc: (dy, saved) => {\n const [x] = saved;\n return { x: () => reshape(dy, x.shape) };\n }\n};\n//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiUmVzaGFwZV9ncmFkLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vLi4vdGZqcy1jb3JlL3NyYy9ncmFkaWVudHMvUmVzaGFwZV9ncmFkLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBOzs7Ozs7Ozs7Ozs7Ozs7R0FlRztBQUNILE9BQU8sRUFBQyxPQUFPLEVBQUMsTUFBTSxpQkFBaUIsQ0FBQztBQUV4QyxPQUFPLEVBQUMsT0FBTyxFQUFDLE1BQU0sZ0JBQWdCLENBQUM7QUFHdkMsTUFBTSxDQUFDLE1BQU0saUJBQWlCLEdBQWU7SUFDM0MsVUFBVSxFQUFFLE9BQU87SUFDbkIsWUFBWSxFQUFFLENBQUMsR0FBRyxDQUFDO0lBQ25CLFFBQVEsRUFBRSxDQUFDLEVBQVUsRUFBRSxLQUFlLEVBQUUsRUFBRTtRQUN4QyxNQUFNLENBQUMsQ0FBQyxDQUFDLEdBQUcsS0FBSyxDQUFDO1FBQ2xCLE9BQU8sRUFBQyxDQUFDLEVBQUUsR0FBRyxFQUFFLENBQUMsT0FBTyxDQUFDLEVBQUUsRUFBRSxDQUFDLENBQUMsS0FBSyxDQUFDLEVBQUMsQ0FBQztJQUN6QyxDQUFDO0NBQ0YsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbIi8qKlxuICogQGxpY2Vuc2VcbiAqIENvcHlyaWdodCAyMDIwIEdvb2dsZSBJbmMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuXG4gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgXCJMaWNlbnNlXCIpO1xuICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLlxuICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0XG4gKlxuICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wXG4gKlxuICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZVxuICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gXCJBUyBJU1wiIEJBU0lTLFxuICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuXG4gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kXG4gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS5cbiAqID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4gKi9cbmltcG9ydCB7UmVzaGFwZX0gZnJvbSAnLi4va2VybmVsX25hbWVzJztcbmltcG9ydCB7R3JhZENvbmZpZ30gZnJvbSAnLi4va2VybmVsX3JlZ2lzdHJ5JztcbmltcG9ydCB7cmVzaGFwZX0gZnJvbSAnLi4vb3BzL3Jlc2hhcGUnO1xuaW1wb3J0IHtUZW5zb3J9IGZyb20gJy4uL3RlbnNvcic7XG5cbmV4cG9ydCBjb25zdCByZXNoYXBlR3JhZENvbmZpZzogR3JhZENvbmZpZyA9IHtcbiAga2VybmVsTmFtZTogUmVzaGFwZSxcbiAgaW5wdXRzVG9TYXZlOiBbJ3gnXSxcbiAgZ3JhZEZ1bmM6IChkeTogVGVuc29yLCBzYXZlZDogVGVuc29yW10pID0+IHtcbiAgICBjb25zdCBbeF0gPSBzYXZlZDtcbiAgICByZXR1cm4ge3g6ICgpID0+IHJlc2hhcGUoZHksIHguc2hhcGUpfTtcbiAgfVxufTtcbiJdfQ==","/**\n * @license\n * Copyright 2020 Google LLC. All Rights Reserved.\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n * =============================================================================\n */\nimport { ENGINE } from '../engine';\nimport { ResizeBilinear, ResizeBilinearGrad } from '../kernel_names';\nexport const resizeBilinearGradConfig = {\n kernelName: ResizeBilinear,\n inputsToSave: ['images'],\n gradFunc: (dy, saved, attrs) => {\n const [images] = saved;\n const inputs = { dy, images };\n const imagesDer = () => \n // tslint:disable-next-line: no-unnecessary-type-assertion\n ENGINE.runKernel(ResizeBilinearGrad, inputs, attrs);\n return { images: imagesDer };\n }\n};\n//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiUmVzaXplQmlsaW5lYXJfZ3JhZC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uLy4uL3RmanMtY29yZS9zcmMvZ3JhZGllbnRzL1Jlc2l6ZUJpbGluZWFyX2dyYWQudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUE7Ozs7Ozs7Ozs7Ozs7OztHQWVHO0FBQ0gsT0FBTyxFQUFDLE1BQU0sRUFBQyxNQUFNLFdBQVcsQ0FBQztBQUNqQyxPQUFPLEVBQUMsY0FBYyxFQUFFLGtCQUFrQixFQUEyQixNQUFNLGlCQUFpQixDQUFDO0FBTTdGLE1BQU0sQ0FBQyxNQUFNLHdCQUF3QixHQUFlO0lBQ2xELFVBQVUsRUFBRSxjQUFjO0lBQzFCLFlBQVksRUFBRSxDQUFDLFFBQVEsQ0FBQztJQUN4QixRQUFRLEVBQUUsQ0FBQyxFQUFZLEVBQUUsS0FBZSxFQUFFLEtBQW1CLEVBQUUsRUFBRTtRQUMvRCxNQUFNLENBQUMsTUFBTSxDQUFDLEdBQUcsS0FBSyxDQUFDO1FBRXZCLE1BQU0sTUFBTSxHQUE2QixFQUFDLEVBQUUsRUFBRSxNQUFNLEVBQUMsQ0FBQztRQUN0RCxNQUFNLFNBQVMsR0FBRyxHQUFHLEVBQUU7UUFDbkIsMERBQTBEO1FBQzFELE1BQU0sQ0FBQyxTQUFTLENBQ1osa0JBQWtCLEVBQUUsTUFBOEIsRUFBRSxLQUFLLENBQ3JELENBQUM7UUFFYixPQUFPLEVBQUMsTUFBTSxFQUFFLFNBQVMsRUFBQyxDQUFDO0lBQzdCLENBQUM7Q0FDRixDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiLyoqXG4gKiBAbGljZW5zZVxuICogQ29weXJpZ2h0IDIwMjAgR29vZ2xlIExMQy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC5cbiAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSBcIkxpY2Vuc2VcIik7XG4gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuXG4gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXRcbiAqXG4gKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjBcbiAqXG4gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlXG4gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiBcIkFTIElTXCIgQkFTSVMsXG4gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC5cbiAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmRcbiAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLlxuICogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbiAqL1xuaW1wb3J0IHtFTkdJTkV9IGZyb20gJy4uL2VuZ2luZSc7XG5pbXBvcnQge1Jlc2l6ZUJpbGluZWFyLCBSZXNpemVCaWxpbmVhckdyYWQsIFJlc2l6ZUJpbGluZWFyR3JhZElucHV0c30gZnJvbSAnLi4va2VybmVsX25hbWVzJztcbmltcG9ydCB7R3JhZENvbmZpZ30gZnJvbSAnLi4va2VybmVsX3JlZ2lzdHJ5JztcbmltcG9ydCB7TmFtZWRBdHRyTWFwfSBmcm9tICcuLi9rZXJuZWxfcmVnaXN0cnknO1xuaW1wb3J0IHtUZW5zb3IsIFRlbnNvcjREfSBmcm9tICcuLi90ZW5zb3InO1xuaW1wb3J0IHtOYW1lZFRlbnNvck1hcH0gZnJvbSAnLi4vdGVuc29yX3R5cGVzJztcblxuZXhwb3J0IGNvbnN0IHJlc2l6ZUJpbGluZWFyR3JhZENvbmZpZzogR3JhZENvbmZpZyA9IHtcbiAga2VybmVsTmFtZTogUmVzaXplQmlsaW5lYXIsXG4gIGlucHV0c1RvU2F2ZTogWydpbWFnZXMnXSxcbiAgZ3JhZEZ1bmM6IChkeTogVGVuc29yNEQsIHNhdmVkOiBUZW5zb3JbXSwgYXR0cnM6IE5hbWVkQXR0ck1hcCkgPT4ge1xuICAgIGNvbnN0IFtpbWFnZXNdID0gc2F2ZWQ7XG5cbiAgICBjb25zdCBpbnB1dHM6IFJlc2l6ZUJpbGluZWFyR3JhZElucHV0cyA9IHtkeSwgaW1hZ2VzfTtcbiAgICBjb25zdCBpbWFnZXNEZXIgPSAoKSA9PlxuICAgICAgICAvLyB0c2xpbnQ6ZGlzYWJsZS1uZXh0LWxpbmU6IG5vLXVubmVjZXNzYXJ5LXR5cGUtYXNzZXJ0aW9uXG4gICAgICAgIEVOR0lORS5ydW5LZXJuZWwoXG4gICAgICAgICAgICBSZXNpemVCaWxpbmVhckdyYWQsIGlucHV0cyBhcyB7fSBhcyBOYW1lZFRlbnNvck1hcCwgYXR0cnMpIGFzXG4gICAgICAgIFRlbnNvcjREO1xuXG4gICAgcmV0dXJuIHtpbWFnZXM6IGltYWdlc0Rlcn07XG4gIH1cbn07XG4iXX0=","/**\n * @license\n * Copyright 2020 Google LLC. All Rights Reserved.\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n * =============================================================================\n */\nimport { ENGINE } from '../engine';\nimport { ResizeNearestNeighbor, ResizeNearestNeighborGrad } from '../kernel_names';\nexport const resizeNearestNeighborGradConfig = {\n kernelName: ResizeNearestNeighbor,\n inputsToSave: ['images'],\n gradFunc: (dy, saved, attrs) => {\n const [images] = saved;\n const inputs = { dy, images };\n const imagesDer = () => \n // tslint:disable-next-line: no-unnecessary-type-assertion\n ENGINE.runKernel(ResizeNearestNeighborGrad, inputs, attrs);\n return { images: imagesDer };\n }\n};\n//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiUmVzaXplTmVhcmVzdE5laWdoYm9yX2dyYWQuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi8uLi90ZmpzLWNvcmUvc3JjL2dyYWRpZW50cy9SZXNpemVOZWFyZXN0TmVpZ2hib3JfZ3JhZC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQTs7Ozs7Ozs7Ozs7Ozs7O0dBZUc7QUFDSCxPQUFPLEVBQUMsTUFBTSxFQUFDLE1BQU0sV0FBVyxDQUFDO0FBQ2pDLE9BQU8sRUFBQyxxQkFBcUIsRUFBRSx5QkFBeUIsRUFBa0MsTUFBTSxpQkFBaUIsQ0FBQztBQU1sSCxNQUFNLENBQUMsTUFBTSwrQkFBK0IsR0FBZTtJQUN6RCxVQUFVLEVBQUUscUJBQXFCO0lBQ2pDLFlBQVksRUFBRSxDQUFDLFFBQVEsQ0FBQztJQUN4QixRQUFRLEVBQUUsQ0FBQyxFQUFZLEVBQUUsS0FBZSxFQUFFLEtBQW1CLEVBQUUsRUFBRTtRQUMvRCxNQUFNLENBQUMsTUFBTSxDQUFDLEdBQUcsS0FBSyxDQUFDO1FBRXZCLE1BQU0sTUFBTSxHQUFvQyxFQUFDLEVBQUUsRUFBRSxNQUFNLEVBQUMsQ0FBQztRQUM3RCxNQUFNLFNBQVMsR0FBRyxHQUFHLEVBQUU7UUFDbkIsMERBQTBEO1FBQzFELE1BQU0sQ0FBQyxTQUFTLENBQ1oseUJBQXlCLEVBQUUsTUFBOEIsRUFBRSxLQUFLLENBQzVELENBQUM7UUFFYixPQUFPLEVBQUMsTUFBTSxFQUFFLFNBQVMsRUFBQyxDQUFDO0lBQzdCLENBQUM7Q0FDRixDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiLyoqXG4gKiBAbGljZW5zZVxuICogQ29weXJpZ2h0IDIwMjAgR29vZ2xlIExMQy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC5cbiAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSBcIkxpY2Vuc2VcIik7XG4gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuXG4gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXRcbiAqXG4gKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjBcbiAqXG4gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlXG4gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiBcIkFTIElTXCIgQkFTSVMsXG4gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC5cbiAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmRcbiAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLlxuICogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbiAqL1xuaW1wb3J0IHtFTkdJTkV9IGZyb20gJy4uL2VuZ2luZSc7XG5pbXBvcnQge1Jlc2l6ZU5lYXJlc3ROZWlnaGJvciwgUmVzaXplTmVhcmVzdE5laWdoYm9yR3JhZCwgUmVzaXplTmVhcmVzdE5laWdoYm9yR3JhZElucHV0c30gZnJvbSAnLi4va2VybmVsX25hbWVzJztcbmltcG9ydCB7R3JhZENvbmZpZ30gZnJvbSAnLi4va2VybmVsX3JlZ2lzdHJ5JztcbmltcG9ydCB7TmFtZWRBdHRyTWFwfSBmcm9tICcuLi9rZXJuZWxfcmVnaXN0cnknO1xuaW1wb3J0IHtUZW5zb3IsIFRlbnNvcjREfSBmcm9tICcuLi90ZW5zb3InO1xuaW1wb3J0IHtOYW1lZFRlbnNvck1hcH0gZnJvbSAnLi4vdGVuc29yX3R5cGVzJztcblxuZXhwb3J0IGNvbnN0IHJlc2l6ZU5lYXJlc3ROZWlnaGJvckdyYWRDb25maWc6IEdyYWRDb25maWcgPSB7XG4gIGtlcm5lbE5hbWU6IFJlc2l6ZU5lYXJlc3ROZWlnaGJvcixcbiAgaW5wdXRzVG9TYXZlOiBbJ2ltYWdlcyddLFxuICBncmFkRnVuYzogKGR5OiBUZW5zb3I0RCwgc2F2ZWQ6IFRlbnNvcltdLCBhdHRyczogTmFtZWRBdHRyTWFwKSA9PiB7XG4gICAgY29uc3QgW2ltYWdlc10gPSBzYXZlZDtcblxuICAgIGNvbnN0IGlucHV0czogUmVzaXplTmVhcmVzdE5laWdoYm9yR3JhZElucHV0cyA9IHtkeSwgaW1hZ2VzfTtcbiAgICBjb25zdCBpbWFnZXNEZXIgPSAoKSA9PlxuICAgICAgICAvLyB0c2xpbnQ6ZGlzYWJsZS1uZXh0LWxpbmU6IG5vLXVubmVjZXNzYXJ5LXR5cGUtYXNzZXJ0aW9uXG4gICAgICAgIEVOR0lORS5ydW5LZXJuZWwoXG4gICAgICAgICAgICBSZXNpemVOZWFyZXN0TmVpZ2hib3JHcmFkLCBpbnB1dHMgYXMge30gYXMgTmFtZWRUZW5zb3JNYXAsIGF0dHJzKSBhc1xuICAgICAgICBUZW5zb3I0RDtcblxuICAgIHJldHVybiB7aW1hZ2VzOiBpbWFnZXNEZXJ9O1xuICB9XG59O1xuIl19","/**\n * @license\n * Copyright 2020 Google LLC. All Rights Reserved.\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n * =============================================================================\n */\nimport { Reverse } from '../kernel_names';\nimport { reverse } from '../ops/reverse';\nimport { parseAxisParam } from '../util';\nexport const reverseGradConfig = {\n kernelName: Reverse,\n gradFunc: (dy, saved, attrs) => {\n const { dims } = attrs;\n const axes = parseAxisParam(dims, dy.shape);\n return { x: () => reverse(dy, axes) };\n }\n};\n//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiUmV2ZXJzZV9ncmFkLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vLi4vdGZqcy1jb3JlL3NyYy9ncmFkaWVudHMvUmV2ZXJzZV9ncmFkLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBOzs7Ozs7Ozs7Ozs7Ozs7R0FlRztBQUNILE9BQU8sRUFBQyxPQUFPLEVBQWUsTUFBTSxpQkFBaUIsQ0FBQztBQUV0RCxPQUFPLEVBQUMsT0FBTyxFQUFDLE1BQU0sZ0JBQWdCLENBQUM7QUFFdkMsT0FBTyxFQUFDLGNBQWMsRUFBQyxNQUFNLFNBQVMsQ0FBQztBQUV2QyxNQUFNLENBQUMsTUFBTSxpQkFBaUIsR0FBZTtJQUMzQyxVQUFVLEVBQUUsT0FBTztJQUNuQixRQUFRLEVBQUUsQ0FBQyxFQUFVLEVBQUUsS0FBZSxFQUFFLEtBQW1CLEVBQUUsRUFBRTtRQUM3RCxNQUFNLEVBQUMsSUFBSSxFQUFDLEdBQUcsS0FBMkIsQ0FBQztRQUMzQyxNQUFNLElBQUksR0FBRyxjQUFjLENBQUMsSUFBSSxFQUFFLEVBQUUsQ0FBQyxLQUFLLENBQUMsQ0FBQztRQUM1QyxPQUFPLEVBQUMsQ0FBQyxFQUFFLEdBQUcsRUFBRSxDQUFDLE9BQU8sQ0FBQyxFQUFFLEVBQUUsSUFBSSxDQUFDLEVBQUMsQ0FBQztJQUN0QyxDQUFDO0NBQ0YsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbIi8qKlxuICogQGxpY2Vuc2VcbiAqIENvcHlyaWdodCAyMDIwIEdvb2dsZSBMTEMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuXG4gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgXCJMaWNlbnNlXCIpO1xuICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLlxuICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0XG4gKlxuICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wXG4gKlxuICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZVxuICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gXCJBUyBJU1wiIEJBU0lTLFxuICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuXG4gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kXG4gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS5cbiAqID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4gKi9cbmltcG9ydCB7UmV2ZXJzZSwgUmV2ZXJzZUF0dHJzfSBmcm9tICcuLi9rZXJuZWxfbmFtZXMnO1xuaW1wb3J0IHtHcmFkQ29uZmlnLCBOYW1lZEF0dHJNYXB9IGZyb20gJy4uL2tlcm5lbF9yZWdpc3RyeSc7XG5pbXBvcnQge3JldmVyc2V9IGZyb20gJy4uL29wcy9yZXZlcnNlJztcbmltcG9ydCB7VGVuc29yfSBmcm9tICcuLi90ZW5zb3InO1xuaW1wb3J0IHtwYXJzZUF4aXNQYXJhbX0gZnJvbSAnLi4vdXRpbCc7XG5cbmV4cG9ydCBjb25zdCByZXZlcnNlR3JhZENvbmZpZzogR3JhZENvbmZpZyA9IHtcbiAga2VybmVsTmFtZTogUmV2ZXJzZSxcbiAgZ3JhZEZ1bmM6IChkeTogVGVuc29yLCBzYXZlZDogVGVuc29yW10sIGF0dHJzOiBOYW1lZEF0dHJNYXApID0+IHtcbiAgICBjb25zdCB7ZGltc30gPSBhdHRycyBhcyB7fSBhcyBSZXZlcnNlQXR0cnM7XG4gICAgY29uc3QgYXhlcyA9IHBhcnNlQXhpc1BhcmFtKGRpbXMsIGR5LnNoYXBlKTtcbiAgICByZXR1cm4ge3g6ICgpID0+IHJldmVyc2UoZHksIGF4ZXMpfTtcbiAgfVxufTtcbiJdfQ==","/**\n * @license\n * Copyright 2020 Google LLC. All Rights Reserved.\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n * =============================================================================\n */\nimport { Round } from '../kernel_names';\nimport { zerosLike } from '../ops/zeros_like';\nexport const roundGradConfig = {\n kernelName: Round,\n gradFunc: (dy) => {\n // TODO(nsthorat): Let gradients be null for cases where we want to stop\n // backpropgation.\n return { x: () => zerosLike(dy) };\n }\n};\n//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiUm91bmRfZ3JhZC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uLy4uL3RmanMtY29yZS9zcmMvZ3JhZGllbnRzL1JvdW5kX2dyYWQudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUE7Ozs7Ozs7Ozs7Ozs7OztHQWVHO0FBRUgsT0FBTyxFQUFDLEtBQUssRUFBQyxNQUFNLGlCQUFpQixDQUFDO0FBRXRDLE9BQU8sRUFBQyxTQUFTLEVBQUMsTUFBTSxtQkFBbUIsQ0FBQztBQUc1QyxNQUFNLENBQUMsTUFBTSxlQUFlLEdBQWU7SUFDekMsVUFBVSxFQUFFLEtBQUs7SUFDakIsUUFBUSxFQUFFLENBQUMsRUFBVSxFQUFFLEVBQUU7UUFDdkIsd0VBQXdFO1FBQ3hFLGtCQUFrQjtRQUNsQixPQUFPLEVBQUMsQ0FBQyxFQUFFLEdBQUcsRUFBRSxDQUFDLFNBQVMsQ0FBQyxFQUFFLENBQUMsRUFBQyxDQUFDO0lBQ2xDLENBQUM7Q0FDRixDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiLyoqXG4gKiBAbGljZW5zZVxuICogQ29weXJpZ2h0IDIwMjAgR29vZ2xlIExMQy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC5cbiAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSBcIkxpY2Vuc2VcIik7XG4gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuXG4gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXRcbiAqXG4gKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjBcbiAqXG4gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlXG4gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiBcIkFTIElTXCIgQkFTSVMsXG4gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC5cbiAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmRcbiAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLlxuICogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbiAqL1xuXG5pbXBvcnQge1JvdW5kfSBmcm9tICcuLi9rZXJuZWxfbmFtZXMnO1xuaW1wb3J0IHtHcmFkQ29uZmlnfSBmcm9tICcuLi9rZXJuZWxfcmVnaXN0cnknO1xuaW1wb3J0IHt6ZXJvc0xpa2V9IGZyb20gJy4uL29wcy96ZXJvc19saWtlJztcbmltcG9ydCB7VGVuc29yfSBmcm9tICcuLi90ZW5zb3InO1xuXG5leHBvcnQgY29uc3Qgcm91bmRHcmFkQ29uZmlnOiBHcmFkQ29uZmlnID0ge1xuICBrZXJuZWxOYW1lOiBSb3VuZCxcbiAgZ3JhZEZ1bmM6IChkeTogVGVuc29yKSA9PiB7XG4gICAgLy8gVE9ETyhuc3Rob3JhdCk6IExldCBncmFkaWVudHMgYmUgbnVsbCBmb3IgY2FzZXMgd2hlcmUgd2Ugd2FudCB0byBzdG9wXG4gICAgLy8gYmFja3Byb3BnYXRpb24uXG4gICAgcmV0dXJuIHt4OiAoKSA9PiB6ZXJvc0xpa2UoZHkpfTtcbiAgfVxufTtcbiJdfQ==","/**\n * @license\n * Copyright 2020 Google LLC. All Rights Reserved.\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n * =============================================================================\n */\nimport { Rsqrt } from '../kernel_names';\nimport { div } from '../ops/div';\nimport { mul } from '../ops/mul';\nimport { neg } from '../ops/neg';\nimport { pow } from '../ops/pow';\nexport const rsqrtGradConfig = {\n kernelName: Rsqrt,\n inputsToSave: ['x'],\n gradFunc: (dy, saved) => {\n const [x] = saved;\n return { x: () => neg(div(dy, mul(pow(x, 1.5), 2))) };\n }\n};\n//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiUnNxcnRfZ3JhZC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uLy4uL3RmanMtY29yZS9zcmMvZ3JhZGllbnRzL1JzcXJ0X2dyYWQudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUE7Ozs7Ozs7Ozs7Ozs7OztHQWVHO0FBRUgsT0FBTyxFQUFDLEtBQUssRUFBQyxNQUFNLGlCQUFpQixDQUFDO0FBRXRDLE9BQU8sRUFBQyxHQUFHLEVBQUMsTUFBTSxZQUFZLENBQUM7QUFDL0IsT0FBTyxFQUFDLEdBQUcsRUFBQyxNQUFNLFlBQVksQ0FBQztBQUMvQixPQUFPLEVBQUMsR0FBRyxFQUFDLE1BQU0sWUFBWSxDQUFDO0FBQy9CLE9BQU8sRUFBQyxHQUFHLEVBQUMsTUFBTSxZQUFZLENBQUM7QUFHL0IsTUFBTSxDQUFDLE1BQU0sZUFBZSxHQUFlO0lBQ3pDLFVBQVUsRUFBRSxLQUFLO0lBQ2pCLFlBQVksRUFBRSxDQUFDLEdBQUcsQ0FBQztJQUNuQixRQUFRLEVBQUUsQ0FBQyxFQUFVLEVBQUUsS0FBZSxFQUFFLEVBQUU7UUFDeEMsTUFBTSxDQUFDLENBQUMsQ0FBQyxHQUFHLEtBQUssQ0FBQztRQUNsQixPQUFPLEVBQUMsQ0FBQyxFQUFFLEdBQUcsRUFBRSxDQUFDLEdBQUcsQ0FBQyxHQUFHLENBQUMsRUFBRSxFQUFFLEdBQUcsQ0FBQyxHQUFHLENBQUMsQ0FBQyxFQUFFLEdBQUcsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUMsRUFBQyxDQUFDO0lBQ3RELENBQUM7Q0FDRixDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiLyoqXG4gKiBAbGljZW5zZVxuICogQ29weXJpZ2h0IDIwMjAgR29vZ2xlIExMQy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC5cbiAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSBcIkxpY2Vuc2VcIik7XG4gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuXG4gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXRcbiAqXG4gKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjBcbiAqXG4gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlXG4gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiBcIkFTIElTXCIgQkFTSVMsXG4gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC5cbiAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmRcbiAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLlxuICogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbiAqL1xuXG5pbXBvcnQge1JzcXJ0fSBmcm9tICcuLi9rZXJuZWxfbmFtZXMnO1xuaW1wb3J0IHtHcmFkQ29uZmlnfSBmcm9tICcuLi9rZXJuZWxfcmVnaXN0cnknO1xuaW1wb3J0IHtkaXZ9IGZyb20gJy4uL29wcy9kaXYnO1xuaW1wb3J0IHttdWx9IGZyb20gJy4uL29wcy9tdWwnO1xuaW1wb3J0IHtuZWd9IGZyb20gJy4uL29wcy9uZWcnO1xuaW1wb3J0IHtwb3d9IGZyb20gJy4uL29wcy9wb3cnO1xuaW1wb3J0IHtUZW5zb3J9IGZyb20gJy4uL3RlbnNvcic7XG5cbmV4cG9ydCBjb25zdCByc3FydEdyYWRDb25maWc6IEdyYWRDb25maWcgPSB7XG4gIGtlcm5lbE5hbWU6IFJzcXJ0LFxuICBpbnB1dHNUb1NhdmU6IFsneCddLFxuICBncmFkRnVuYzogKGR5OiBUZW5zb3IsIHNhdmVkOiBUZW5zb3JbXSkgPT4ge1xuICAgIGNvbnN0IFt4XSA9IHNhdmVkO1xuICAgIHJldHVybiB7eDogKCkgPT4gbmVnKGRpdihkeSwgbXVsKHBvdyh4LCAxLjUpLCAyKSkpfTtcbiAgfVxufTtcbiJdfQ==","/**\n * @license\n * Copyright 2020 Google LLC. All Rights Reserved.\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n * =============================================================================\n */\nimport { Select } from '../kernel_names';\nimport { cast } from '../ops/cast';\nimport { logicalNot } from '../ops/logical_not';\nimport { mul } from '../ops/mul';\nimport { zerosLike } from '../ops/zeros_like';\nexport const selectGradConfig = {\n kernelName: Select,\n inputsToSave: ['condition'],\n gradFunc: (dy, saved) => {\n const [condition] = saved;\n return {\n // TODO(julianoks): Return null for condition gradient\n // when backprop supports it.\n condition: () => cast(zerosLike(condition), 'float32'),\n t: () => mul(dy, cast(condition, dy.dtype)),\n e: () => mul(dy, cast(logicalNot(condition), dy.dtype))\n };\n }\n};\n//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiU2VsZWN0X2dyYWQuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi8uLi90ZmpzLWNvcmUvc3JjL2dyYWRpZW50cy9TZWxlY3RfZ3JhZC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQTs7Ozs7Ozs7Ozs7Ozs7O0dBZUc7QUFFSCxPQUFPLEVBQUMsTUFBTSxFQUFDLE1BQU0saUJBQWlCLENBQUM7QUFFdkMsT0FBTyxFQUFDLElBQUksRUFBQyxNQUFNLGFBQWEsQ0FBQztBQUNqQyxPQUFPLEVBQUMsVUFBVSxFQUFDLE1BQU0sb0JBQW9CLENBQUM7QUFDOUMsT0FBTyxFQUFDLEdBQUcsRUFBQyxNQUFNLFlBQVksQ0FBQztBQUMvQixPQUFPLEVBQUMsU0FBUyxFQUFDLE1BQU0sbUJBQW1CLENBQUM7QUFHNUMsTUFBTSxDQUFDLE1BQU0sZ0JBQWdCLEdBQWU7SUFDMUMsVUFBVSxFQUFFLE1BQU07SUFDbEIsWUFBWSxFQUFFLENBQUMsV0FBVyxDQUFDO0lBQzNCLFFBQVEsRUFBRSxDQUFDLEVBQVUsRUFBRSxLQUFlLEVBQUUsRUFBRTtRQUN4QyxNQUFNLENBQUMsU0FBUyxDQUFDLEdBQUcsS0FBSyxDQUFDO1FBQzFCLE9BQU87WUFDTCxzREFBc0Q7WUFDdEQsNkJBQTZCO1lBQzdCLFNBQVMsRUFBRSxHQUFHLEVBQUUsQ0FBQyxJQUFJLENBQUMsU0FBUyxDQUFDLFNBQVMsQ0FBQyxFQUFFLFNBQVMsQ0FBQztZQUN0RCxDQUFDLEVBQUUsR0FBRyxFQUFFLENBQUMsR0FBRyxDQUFDLEVBQUUsRUFBRSxJQUFJLENBQUMsU0FBUyxFQUFFLEVBQUUsQ0FBQyxLQUFLLENBQUMsQ0FBQztZQUMzQyxDQUFDLEVBQUUsR0FBRyxFQUFFLENBQUMsR0FBRyxDQUFDLEVBQUUsRUFBRSxJQUFJLENBQUMsVUFBVSxDQUFDLFNBQVMsQ0FBQyxFQUFFLEVBQUUsQ0FBQyxLQUFLLENBQUMsQ0FBQztTQUN4RCxDQUFDO0lBQ0osQ0FBQztDQUNGLENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyIvKipcbiAqIEBsaWNlbnNlXG4gKiBDb3B5cmlnaHQgMjAyMCBHb29nbGUgTExDLiBBbGwgUmlnaHRzIFJlc2VydmVkLlxuICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlIFwiTGljZW5zZVwiKTtcbiAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS5cbiAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdFxuICpcbiAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMFxuICpcbiAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmVcbiAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuIFwiQVMgSVNcIiBCQVNJUyxcbiAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLlxuICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZFxuICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuXG4gKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuICovXG5cbmltcG9ydCB7U2VsZWN0fSBmcm9tICcuLi9rZXJuZWxfbmFtZXMnO1xuaW1wb3J0IHtHcmFkQ29uZmlnfSBmcm9tICcuLi9rZXJuZWxfcmVnaXN0cnknO1xuaW1wb3J0IHtjYXN0fSBmcm9tICcuLi9vcHMvY2FzdCc7XG5pbXBvcnQge2xvZ2ljYWxOb3R9IGZyb20gJy4uL29wcy9sb2dpY2FsX25vdCc7XG5pbXBvcnQge211bH0gZnJvbSAnLi4vb3BzL211bCc7XG5pbXBvcnQge3plcm9zTGlrZX0gZnJvbSAnLi4vb3BzL3plcm9zX2xpa2UnO1xuaW1wb3J0IHtUZW5zb3J9IGZyb20gJy4uL3RlbnNvcic7XG5cbmV4cG9ydCBjb25zdCBzZWxlY3RHcmFkQ29uZmlnOiBHcmFkQ29uZmlnID0ge1xuICBrZXJuZWxOYW1lOiBTZWxlY3QsXG4gIGlucHV0c1RvU2F2ZTogWydjb25kaXRpb24nXSxcbiAgZ3JhZEZ1bmM6IChkeTogVGVuc29yLCBzYXZlZDogVGVuc29yW10pID0+IHtcbiAgICBjb25zdCBbY29uZGl0aW9uXSA9IHNhdmVkO1xuICAgIHJldHVybiB7XG4gICAgICAvLyBUT0RPKGp1bGlhbm9rcyk6IFJldHVybiBudWxsIGZvciBjb25kaXRpb24gZ3JhZGllbnRcbiAgICAgIC8vIHdoZW4gYmFja3Byb3Agc3VwcG9ydHMgaXQuXG4gICAgICBjb25kaXRpb246ICgpID0+IGNhc3QoemVyb3NMaWtlKGNvbmRpdGlvbiksICdmbG9hdDMyJyksXG4gICAgICB0OiAoKSA9PiBtdWwoZHksIGNhc3QoY29uZGl0aW9uLCBkeS5kdHlwZSkpLFxuICAgICAgZTogKCkgPT4gbXVsKGR5LCBjYXN0KGxvZ2ljYWxOb3QoY29uZGl0aW9uKSwgZHkuZHR5cGUpKVxuICAgIH07XG4gIH1cbn07XG4iXX0=","/**\n * @license\n * Copyright 2020 Google LLC. All Rights Reserved.\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n * =============================================================================\n */\nimport { Selu } from '../kernel_names';\nimport { cast } from '../ops/cast';\nimport { exp } from '../ops/exp';\nimport { greater } from '../ops/greater';\nimport { mul } from '../ops/mul';\nimport { scalar } from '../ops/scalar';\nimport { SELU_SCALE, SELU_SCALEALPHA } from '../ops/selu_util';\nimport { where } from '../ops/where';\nexport const seluGradConfig = {\n kernelName: Selu,\n inputsToSave: ['x'],\n gradFunc: (dy, saved) => {\n const [x] = saved;\n return {\n x: () => {\n const mask = greater(x, scalar(0));\n const scaleAlpha = scalar(SELU_SCALEALPHA);\n const scale = scalar(SELU_SCALE);\n const greaterThanZeroDer = mul(dy, scale);\n const lessEqualZeroDer = mul(mul(dy, scaleAlpha), exp(cast(x, 'float32')));\n return where(mask, greaterThanZeroDer, lessEqualZeroDer);\n }\n };\n }\n};\n//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiU2VsdV9ncmFkLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vLi4vdGZqcy1jb3JlL3NyYy9ncmFkaWVudHMvU2VsdV9ncmFkLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBOzs7Ozs7Ozs7Ozs7Ozs7R0FlRztBQUNILE9BQU8sRUFBQyxJQUFJLEVBQUMsTUFBTSxpQkFBaUIsQ0FBQztBQUVyQyxPQUFPLEVBQUMsSUFBSSxFQUFDLE1BQU0sYUFBYSxDQUFDO0FBQ2pDLE9BQU8sRUFBQyxHQUFHLEVBQUMsTUFBTSxZQUFZLENBQUM7QUFDL0IsT0FBTyxFQUFDLE9BQU8sRUFBQyxNQUFNLGdCQUFnQixDQUFDO0FBQ3ZDLE9BQU8sRUFBQyxHQUFHLEVBQUMsTUFBTSxZQUFZLENBQUM7QUFDL0IsT0FBTyxFQUFDLE1BQU0sRUFBQyxNQUFNLGVBQWUsQ0FBQztBQUNyQyxPQUFPLEVBQUMsVUFBVSxFQUFFLGVBQWUsRUFBQyxNQUFNLGtCQUFrQixDQUFDO0FBQzdELE9BQU8sRUFBQyxLQUFLLEVBQUMsTUFBTSxjQUFjLENBQUM7QUFHbkMsTUFBTSxDQUFDLE1BQU0sY0FBYyxHQUFlO0lBQ3hDLFVBQVUsRUFBRSxJQUFJO0lBQ2hCLFlBQVksRUFBRSxDQUFDLEdBQUcsQ0FBQztJQUNuQixRQUFRLEVBQUUsQ0FBQyxFQUFVLEVBQUUsS0FBZSxFQUFFLEVBQUU7UUFDeEMsTUFBTSxDQUFDLENBQUMsQ0FBQyxHQUFHLEtBQUssQ0FBQztRQUNsQixPQUFPO1lBQ0wsQ0FBQyxFQUFFLEdBQUcsRUFBRTtnQkFDTixNQUFNLElBQUksR0FBRyxPQUFPLENBQUMsQ0FBQyxFQUFFLE1BQU0sQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDO2dCQUVuQyxNQUFNLFVBQVUsR0FBRyxNQUFNLENBQUMsZUFBZSxDQUFDLENBQUM7Z0JBQzNDLE1BQU0sS0FBSyxHQUFHLE1BQU0sQ0FBQyxVQUFVLENBQUMsQ0FBQztnQkFFakMsTUFBTSxrQkFBa0IsR0FBRyxHQUFHLENBQUMsRUFBRSxFQUFFLEtBQUssQ0FBQyxDQUFDO2dCQUMxQyxNQUFNLGdCQUFnQixHQUNsQixHQUFHLENBQUMsR0FBRyxDQUFDLEVBQUUsRUFBRSxVQUFVLENBQUMsRUFBRSxHQUFHLENBQUMsSUFBSSxDQUFDLENBQUMsRUFBRSxTQUFTLENBQUMsQ0FBQyxDQUFDLENBQUM7Z0JBRXRELE9BQU8sS0FBSyxDQUFDLElBQUksRUFBRSxrQkFBa0IsRUFBRSxnQkFBZ0IsQ0FBQyxDQUFDO1lBQzNELENBQUM7U0FDRixDQUFDO0lBQ0osQ0FBQztDQUNGLENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyIvKipcbiAqIEBsaWNlbnNlXG4gKiBDb3B5cmlnaHQgMjAyMCBHb29nbGUgTExDLiBBbGwgUmlnaHRzIFJlc2VydmVkLlxuICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlIFwiTGljZW5zZVwiKTtcbiAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS5cbiAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdFxuICpcbiAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMFxuICpcbiAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmVcbiAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuIFwiQVMgSVNcIiBCQVNJUyxcbiAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLlxuICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZFxuICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuXG4gKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuICovXG5pbXBvcnQge1NlbHV9IGZyb20gJy4uL2tlcm5lbF9uYW1lcyc7XG5pbXBvcnQge0dyYWRDb25maWd9IGZyb20gJy4uL2tlcm5lbF9yZWdpc3RyeSc7XG5pbXBvcnQge2Nhc3R9IGZyb20gJy4uL29wcy9jYXN0JztcbmltcG9ydCB7ZXhwfSBmcm9tICcuLi9vcHMvZXhwJztcbmltcG9ydCB7Z3JlYXRlcn0gZnJvbSAnLi4vb3BzL2dyZWF0ZXInO1xuaW1wb3J0IHttdWx9IGZyb20gJy4uL29wcy9tdWwnO1xuaW1wb3J0IHtzY2FsYXJ9IGZyb20gJy4uL29wcy9zY2FsYXInO1xuaW1wb3J0IHtTRUxVX1NDQUxFLCBTRUxVX1NDQUxFQUxQSEF9IGZyb20gJy4uL29wcy9zZWx1X3V0aWwnO1xuaW1wb3J0IHt3aGVyZX0gZnJvbSAnLi4vb3BzL3doZXJlJztcbmltcG9ydCB7VGVuc29yfSBmcm9tICcuLi90ZW5zb3InO1xuXG5leHBvcnQgY29uc3Qgc2VsdUdyYWRDb25maWc6IEdyYWRDb25maWcgPSB7XG4gIGtlcm5lbE5hbWU6IFNlbHUsXG4gIGlucHV0c1RvU2F2ZTogWyd4J10sXG4gIGdyYWRGdW5jOiAoZHk6IFRlbnNvciwgc2F2ZWQ6IFRlbnNvcltdKSA9PiB7XG4gICAgY29uc3QgW3hdID0gc2F2ZWQ7XG4gICAgcmV0dXJuIHtcbiAgICAgIHg6ICgpID0+IHtcbiAgICAgICAgY29uc3QgbWFzayA9IGdyZWF0ZXIoeCwgc2NhbGFyKDApKTtcblxuICAgICAgICBjb25zdCBzY2FsZUFscGhhID0gc2NhbGFyKFNFTFVfU0NBTEVBTFBIQSk7XG4gICAgICAgIGNvbnN0IHNjYWxlID0gc2NhbGFyKFNFTFVfU0NBTEUpO1xuXG4gICAgICAgIGNvbnN0IGdyZWF0ZXJUaGFuWmVyb0RlciA9IG11bChkeSwgc2NhbGUpO1xuICAgICAgICBjb25zdCBsZXNzRXF1YWxaZXJvRGVyID1cbiAgICAgICAgICAgIG11bChtdWwoZHksIHNjYWxlQWxwaGEpLCBleHAoY2FzdCh4LCAnZmxvYXQzMicpKSk7XG5cbiAgICAgICAgcmV0dXJuIHdoZXJlKG1hc2ssIGdyZWF0ZXJUaGFuWmVyb0RlciwgbGVzc0VxdWFsWmVyb0Rlcik7XG4gICAgICB9XG4gICAgfTtcbiAgfVxufTtcbiJdfQ==","/**\n * @license\n * Copyright 2020 Google LLC. All Rights Reserved.\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n * =============================================================================\n */\nimport { Sigmoid } from '../kernel_names';\nimport { mul } from '../ops/mul';\nimport { scalar } from '../ops/scalar';\nimport { sub } from '../ops/sub';\nexport const sigmoidGradConfig = {\n kernelName: Sigmoid,\n outputsToSave: [true],\n gradFunc: (dy, saved) => {\n const [y] = saved;\n return { x: () => mul(dy, mul(y, sub(scalar(1), y))) };\n }\n};\n//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiU2lnbW9pZF9ncmFkLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vLi4vdGZqcy1jb3JlL3NyYy9ncmFkaWVudHMvU2lnbW9pZF9ncmFkLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBOzs7Ozs7Ozs7Ozs7Ozs7R0FlRztBQUVILE9BQU8sRUFBQyxPQUFPLEVBQUMsTUFBTSxpQkFBaUIsQ0FBQztBQUV4QyxPQUFPLEVBQUMsR0FBRyxFQUFDLE1BQU0sWUFBWSxDQUFDO0FBQy9CLE9BQU8sRUFBQyxNQUFNLEVBQUMsTUFBTSxlQUFlLENBQUM7QUFDckMsT0FBTyxFQUFDLEdBQUcsRUFBQyxNQUFNLFlBQVksQ0FBQztBQUcvQixNQUFNLENBQUMsTUFBTSxpQkFBaUIsR0FBZTtJQUMzQyxVQUFVLEVBQUUsT0FBTztJQUNuQixhQUFhLEVBQUUsQ0FBQyxJQUFJLENBQUM7SUFDckIsUUFBUSxFQUFFLENBQUMsRUFBVSxFQUFFLEtBQWUsRUFBRSxFQUFFO1FBQ3hDLE1BQU0sQ0FBQyxDQUFDLENBQUMsR0FBRyxLQUFLLENBQUM7UUFFbEIsT0FBTyxFQUFDLENBQUMsRUFBRSxHQUFHLEVBQUUsQ0FBQyxHQUFHLENBQUMsRUFBRSxFQUFFLEdBQUcsQ0FBQyxDQUFDLEVBQUUsR0FBRyxDQUFDLE1BQU0sQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxDQUFDLEVBQUMsQ0FBQztJQUN2RCxDQUFDO0NBQ0YsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbIi8qKlxuICogQGxpY2Vuc2VcbiAqIENvcHlyaWdodCAyMDIwIEdvb2dsZSBMTEMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuXG4gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgXCJMaWNlbnNlXCIpO1xuICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLlxuICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0XG4gKlxuICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wXG4gKlxuICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZVxuICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gXCJBUyBJU1wiIEJBU0lTLFxuICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuXG4gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kXG4gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS5cbiAqID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4gKi9cblxuaW1wb3J0IHtTaWdtb2lkfSBmcm9tICcuLi9rZXJuZWxfbmFtZXMnO1xuaW1wb3J0IHtHcmFkQ29uZmlnfSBmcm9tICcuLi9rZXJuZWxfcmVnaXN0cnknO1xuaW1wb3J0IHttdWx9IGZyb20gJy4uL29wcy9tdWwnO1xuaW1wb3J0IHtzY2FsYXJ9IGZyb20gJy4uL29wcy9zY2FsYXInO1xuaW1wb3J0IHtzdWJ9IGZyb20gJy4uL29wcy9zdWInO1xuaW1wb3J0IHtUZW5zb3J9IGZyb20gJy4uL3RlbnNvcic7XG5cbmV4cG9ydCBjb25zdCBzaWdtb2lkR3JhZENvbmZpZzogR3JhZENvbmZpZyA9IHtcbiAga2VybmVsTmFtZTogU2lnbW9pZCxcbiAgb3V0cHV0c1RvU2F2ZTogW3RydWVdLFxuICBncmFkRnVuYzogKGR5OiBUZW5zb3IsIHNhdmVkOiBUZW5zb3JbXSkgPT4ge1xuICAgIGNvbnN0IFt5XSA9IHNhdmVkO1xuXG4gICAgcmV0dXJuIHt4OiAoKSA9PiBtdWwoZHksIG11bCh5LCBzdWIoc2NhbGFyKDEpLCB5KSkpfTtcbiAgfVxufTtcbiJdfQ==","/**\n * @license\n * Copyright 2020 Google LLC. All Rights Reserved.\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n * =============================================================================\n */\nimport { Sign } from '../kernel_names';\nimport { zerosLike } from '../ops/zeros_like';\nexport const signGradConfig = {\n kernelName: Sign,\n gradFunc: (dy) => {\n return { x: () => zerosLike(dy) };\n }\n};\n//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiU2lnbl9ncmFkLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vLi4vdGZqcy1jb3JlL3NyYy9ncmFkaWVudHMvU2lnbl9ncmFkLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBOzs7Ozs7Ozs7Ozs7Ozs7R0FlRztBQUVILE9BQU8sRUFBQyxJQUFJLEVBQUMsTUFBTSxpQkFBaUIsQ0FBQztBQUVyQyxPQUFPLEVBQUMsU0FBUyxFQUFDLE1BQU0sbUJBQW1CLENBQUM7QUFHNUMsTUFBTSxDQUFDLE1BQU0sY0FBYyxHQUFlO0lBQ3hDLFVBQVUsRUFBRSxJQUFJO0lBQ2hCLFFBQVEsRUFBRSxDQUFDLEVBQVUsRUFBRSxFQUFFO1FBQ3ZCLE9BQU8sRUFBQyxDQUFDLEVBQUUsR0FBRyxFQUFFLENBQUMsU0FBUyxDQUFDLEVBQUUsQ0FBQyxFQUFDLENBQUM7SUFDbEMsQ0FBQztDQUNGLENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyIvKipcbiAqIEBsaWNlbnNlXG4gKiBDb3B5cmlnaHQgMjAyMCBHb29nbGUgTExDLiBBbGwgUmlnaHRzIFJlc2VydmVkLlxuICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlIFwiTGljZW5zZVwiKTtcbiAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS5cbiAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdFxuICpcbiAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMFxuICpcbiAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmVcbiAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuIFwiQVMgSVNcIiBCQVNJUyxcbiAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLlxuICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZFxuICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuXG4gKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuICovXG5cbmltcG9ydCB7U2lnbn0gZnJvbSAnLi4va2VybmVsX25hbWVzJztcbmltcG9ydCB7R3JhZENvbmZpZ30gZnJvbSAnLi4va2VybmVsX3JlZ2lzdHJ5JztcbmltcG9ydCB7emVyb3NMaWtlfSBmcm9tICcuLi9vcHMvemVyb3NfbGlrZSc7XG5pbXBvcnQge1RlbnNvcn0gZnJvbSAnLi4vdGVuc29yJztcblxuZXhwb3J0IGNvbnN0IHNpZ25HcmFkQ29uZmlnOiBHcmFkQ29uZmlnID0ge1xuICBrZXJuZWxOYW1lOiBTaWduLFxuICBncmFkRnVuYzogKGR5OiBUZW5zb3IpID0+IHtcbiAgICByZXR1cm4ge3g6ICgpID0+IHplcm9zTGlrZShkeSl9O1xuICB9XG59O1xuIl19","/**\n * @license\n * Copyright 2020 Google LLC. All Rights Reserved.\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n * =============================================================================\n */\nimport { Sin } from '../kernel_names';\nimport { cast } from '../ops/cast';\nimport { cos } from '../ops/cos';\nimport { mul } from '../ops/mul';\nexport const sinGradConfig = {\n kernelName: Sin,\n inputsToSave: ['x'],\n gradFunc: (dy, saved) => {\n const [x] = saved;\n return { x: () => mul(cos(cast(x, 'float32')), dy) };\n }\n};\n//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiU2luX2dyYWQuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi8uLi90ZmpzLWNvcmUvc3JjL2dyYWRpZW50cy9TaW5fZ3JhZC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQTs7Ozs7Ozs7Ozs7Ozs7O0dBZUc7QUFFSCxPQUFPLEVBQUMsR0FBRyxFQUFDLE1BQU0saUJBQWlCLENBQUM7QUFFcEMsT0FBTyxFQUFDLElBQUksRUFBQyxNQUFNLGFBQWEsQ0FBQztBQUNqQyxPQUFPLEVBQUMsR0FBRyxFQUFDLE1BQU0sWUFBWSxDQUFDO0FBQy9CLE9BQU8sRUFBQyxHQUFHLEVBQUMsTUFBTSxZQUFZLENBQUM7QUFHL0IsTUFBTSxDQUFDLE1BQU0sYUFBYSxHQUFlO0lBQ3ZDLFVBQVUsRUFBRSxHQUFHO0lBQ2YsWUFBWSxFQUFFLENBQUMsR0FBRyxDQUFDO0lBQ25CLFFBQVEsRUFBRSxDQUFDLEVBQVUsRUFBRSxLQUFlLEVBQUUsRUFBRTtRQUN4QyxNQUFNLENBQUMsQ0FBQyxDQUFDLEdBQUcsS0FBSyxDQUFDO1FBQ2xCLE9BQU8sRUFBQyxDQUFDLEVBQUUsR0FBRyxFQUFFLENBQUMsR0FBRyxDQUFDLEdBQUcsQ0FBQyxJQUFJLENBQUMsQ0FBQyxFQUFFLFNBQVMsQ0FBQyxDQUFDLEVBQUUsRUFBRSxDQUFDLEVBQUMsQ0FBQztJQUNyRCxDQUFDO0NBQ0YsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbIi8qKlxuICogQGxpY2Vuc2VcbiAqIENvcHlyaWdodCAyMDIwIEdvb2dsZSBMTEMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuXG4gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgXCJMaWNlbnNlXCIpO1xuICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLlxuICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0XG4gKlxuICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wXG4gKlxuICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZVxuICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gXCJBUyBJU1wiIEJBU0lTLFxuICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuXG4gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kXG4gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS5cbiAqID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4gKi9cblxuaW1wb3J0IHtTaW59IGZyb20gJy4uL2tlcm5lbF9uYW1lcyc7XG5pbXBvcnQge0dyYWRDb25maWd9IGZyb20gJy4uL2tlcm5lbF9yZWdpc3RyeSc7XG5pbXBvcnQge2Nhc3R9IGZyb20gJy4uL29wcy9jYXN0JztcbmltcG9ydCB7Y29zfSBmcm9tICcuLi9vcHMvY29zJztcbmltcG9ydCB7bXVsfSBmcm9tICcuLi9vcHMvbXVsJztcbmltcG9ydCB7VGVuc29yfSBmcm9tICcuLi90ZW5zb3InO1xuXG5leHBvcnQgY29uc3Qgc2luR3JhZENvbmZpZzogR3JhZENvbmZpZyA9IHtcbiAga2VybmVsTmFtZTogU2luLFxuICBpbnB1dHNUb1NhdmU6IFsneCddLFxuICBncmFkRnVuYzogKGR5OiBUZW5zb3IsIHNhdmVkOiBUZW5zb3JbXSkgPT4ge1xuICAgIGNvbnN0IFt4XSA9IHNhdmVkO1xuICAgIHJldHVybiB7eDogKCkgPT4gbXVsKGNvcyhjYXN0KHgsICdmbG9hdDMyJykpLCBkeSl9O1xuICB9XG59O1xuIl19","/**\n * @license\n * Copyright 2020 Google LLC. All Rights Reserved.\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n * =============================================================================\n */\nimport { Sinh } from '../kernel_names';\nimport { cast } from '../ops/cast';\nimport { cosh } from '../ops/cosh';\nimport { mul } from '../ops/mul';\nexport const sinhGradConfig = {\n kernelName: Sinh,\n inputsToSave: ['x'],\n gradFunc: (dy, saved) => {\n const [x] = saved;\n return { x: () => mul(cosh(cast(x, 'float32')), dy) };\n }\n};\n//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiU2luaF9ncmFkLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vLi4vdGZqcy1jb3JlL3NyYy9ncmFkaWVudHMvU2luaF9ncmFkLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBOzs7Ozs7Ozs7Ozs7Ozs7R0FlRztBQUVILE9BQU8sRUFBQyxJQUFJLEVBQUMsTUFBTSxpQkFBaUIsQ0FBQztBQUVyQyxPQUFPLEVBQUMsSUFBSSxFQUFDLE1BQU0sYUFBYSxDQUFDO0FBQ2pDLE9BQU8sRUFBQyxJQUFJLEVBQUMsTUFBTSxhQUFhLENBQUM7QUFDakMsT0FBTyxFQUFDLEdBQUcsRUFBQyxNQUFNLFlBQVksQ0FBQztBQUcvQixNQUFNLENBQUMsTUFBTSxjQUFjLEdBQWU7SUFDeEMsVUFBVSxFQUFFLElBQUk7SUFDaEIsWUFBWSxFQUFFLENBQUMsR0FBRyxDQUFDO0lBQ25CLFFBQVEsRUFBRSxDQUFDLEVBQVUsRUFBRSxLQUFlLEVBQUUsRUFBRTtRQUN4QyxNQUFNLENBQUMsQ0FBQyxDQUFDLEdBQUcsS0FBSyxDQUFDO1FBRWxCLE9BQU8sRUFBQyxDQUFDLEVBQUUsR0FBRyxFQUFFLENBQUMsR0FBRyxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsQ0FBQyxFQUFFLFNBQVMsQ0FBQyxDQUFDLEVBQUUsRUFBRSxDQUFDLEVBQUMsQ0FBQztJQUN0RCxDQUFDO0NBQ0YsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbIi8qKlxuICogQGxpY2Vuc2VcbiAqIENvcHlyaWdodCAyMDIwIEdvb2dsZSBMTEMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuXG4gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgXCJMaWNlbnNlXCIpO1xuICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLlxuICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0XG4gKlxuICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wXG4gKlxuICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZVxuICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gXCJBUyBJU1wiIEJBU0lTLFxuICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuXG4gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kXG4gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS5cbiAqID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4gKi9cblxuaW1wb3J0IHtTaW5ofSBmcm9tICcuLi9rZXJuZWxfbmFtZXMnO1xuaW1wb3J0IHtHcmFkQ29uZmlnfSBmcm9tICcuLi9rZXJuZWxfcmVnaXN0cnknO1xuaW1wb3J0IHtjYXN0fSBmcm9tICcuLi9vcHMvY2FzdCc7XG5pbXBvcnQge2Nvc2h9IGZyb20gJy4uL29wcy9jb3NoJztcbmltcG9ydCB7bXVsfSBmcm9tICcuLi9vcHMvbXVsJztcbmltcG9ydCB7VGVuc29yfSBmcm9tICcuLi90ZW5zb3InO1xuXG5leHBvcnQgY29uc3Qgc2luaEdyYWRDb25maWc6IEdyYWRDb25maWcgPSB7XG4gIGtlcm5lbE5hbWU6IFNpbmgsXG4gIGlucHV0c1RvU2F2ZTogWyd4J10sXG4gIGdyYWRGdW5jOiAoZHk6IFRlbnNvciwgc2F2ZWQ6IFRlbnNvcltdKSA9PiB7XG4gICAgY29uc3QgW3hdID0gc2F2ZWQ7XG5cbiAgICByZXR1cm4ge3g6ICgpID0+IG11bChjb3NoKGNhc3QoeCwgJ2Zsb2F0MzInKSksIGR5KX07XG4gIH1cbn07XG4iXX0=","/**\n * @license\n * Copyright 2020 Google LLC. All Rights Reserved.\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n * =============================================================================\n */\nimport { Slice } from '../kernel_names';\nimport { pad } from '../ops/pad';\nimport { parseSliceParams } from '../ops/slice_util';\nexport const sliceGradConfig = {\n kernelName: Slice,\n inputsToSave: ['x'],\n gradFunc: (dy, saved, attrs) => {\n const [x] = saved;\n const { begin, size } = attrs;\n const inputShape = x.shape;\n const [begin_, size_] = parseSliceParams(x, begin, size);\n // Create an Nx2 padding where the first column represents how many\n // zeros are prepended (at start) for each dimension, and the second\n // column indicates how many zeros are appended (at end).\n // The number of zeros to append is the shape of the input\n // elementwise-subtracted by both the begin vector and sizes vector.\n const paddings = [];\n for (let i = 0; i < dy.rank; i++) {\n paddings.push([begin_[i], inputShape[i] - begin_[i] - size_[i]]);\n }\n return { x: () => pad(dy, paddings) };\n }\n};\n//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiU2xpY2VfZ3JhZC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uLy4uL3RmanMtY29yZS9zcmMvZ3JhZGllbnRzL1NsaWNlX2dyYWQudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUE7Ozs7Ozs7Ozs7Ozs7OztHQWVHO0FBRUgsT0FBTyxFQUFDLEtBQUssRUFBYSxNQUFNLGlCQUFpQixDQUFDO0FBRWxELE9BQU8sRUFBQyxHQUFHLEVBQUMsTUFBTSxZQUFZLENBQUM7QUFDL0IsT0FBTyxFQUFDLGdCQUFnQixFQUFDLE1BQU0sbUJBQW1CLENBQUM7QUFHbkQsTUFBTSxDQUFDLE1BQU0sZUFBZSxHQUFlO0lBQ3pDLFVBQVUsRUFBRSxLQUFLO0lBQ2pCLFlBQVksRUFBRSxDQUFDLEdBQUcsQ0FBQztJQUNuQixRQUFRLEVBQUUsQ0FBQyxFQUFVLEVBQUUsS0FBZSxFQUFFLEtBQW1CLEVBQUUsRUFBRTtRQUM3RCxNQUFNLENBQUMsQ0FBQyxDQUFDLEdBQUcsS0FBSyxDQUFDO1FBQ2xCLE1BQU0sRUFBQyxLQUFLLEVBQUUsSUFBSSxFQUFDLEdBQUcsS0FBeUIsQ0FBQztRQUVoRCxNQUFNLFVBQVUsR0FBRyxDQUFDLENBQUMsS0FBSyxDQUFDO1FBQzNCLE1BQU0sQ0FBQyxNQUFNLEVBQUUsS0FBSyxDQUFDLEdBQUcsZ0JBQWdCLENBQUMsQ0FBQyxFQUFFLEtBQUssRUFBRSxJQUFJLENBQUMsQ0FBQztRQUV6RCxtRUFBbUU7UUFDbkUsb0VBQW9FO1FBQ3BFLHlEQUF5RDtRQUV6RCwwREFBMEQ7UUFDMUQsb0VBQW9FO1FBQ3BFLE1BQU0sUUFBUSxHQUE0QixFQUFFLENBQUM7UUFDN0MsS0FBSyxJQUFJLENBQUMsR0FBRyxDQUFDLEVBQUUsQ0FBQyxHQUFHLEVBQUUsQ0FBQyxJQUFJLEVBQUUsQ0FBQyxFQUFFLEVBQUU7WUFDaEMsUUFBUSxDQUFDLElBQUksQ0FBQyxDQUFDLE1BQU0sQ0FBQyxDQUFDLENBQUMsRUFBRSxVQUFVLENBQUMsQ0FBQyxDQUFDLEdBQUcsTUFBTSxDQUFDLENBQUMsQ0FBQyxHQUFHLEtBQUssQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUM7U0FDbEU7UUFDRCxPQUFPLEVBQUMsQ0FBQyxFQUFFLEdBQUcsRUFBRSxDQUFDLEdBQUcsQ0FBQyxFQUFFLEVBQUUsUUFBUSxDQUFDLEVBQUMsQ0FBQztJQUN0QyxDQUFDO0NBQ0YsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbIi8qKlxuICogQGxpY2Vuc2VcbiAqIENvcHlyaWdodCAyMDIwIEdvb2dsZSBMTEMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuXG4gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgXCJMaWNlbnNlXCIpO1xuICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLlxuICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0XG4gKlxuICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wXG4gKlxuICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZVxuICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gXCJBUyBJU1wiIEJBU0lTLFxuICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuXG4gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kXG4gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS5cbiAqID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4gKi9cblxuaW1wb3J0IHtTbGljZSwgU2xpY2VBdHRyc30gZnJvbSAnLi4va2VybmVsX25hbWVzJztcbmltcG9ydCB7R3JhZENvbmZpZywgTmFtZWRBdHRyTWFwfSBmcm9tICcuLi9rZXJuZWxfcmVnaXN0cnknO1xuaW1wb3J0IHtwYWR9IGZyb20gJy4uL29wcy9wYWQnO1xuaW1wb3J0IHtwYXJzZVNsaWNlUGFyYW1zfSBmcm9tICcuLi9vcHMvc2xpY2VfdXRpbCc7XG5pbXBvcnQge1RlbnNvcn0gZnJvbSAnLi4vdGVuc29yJztcblxuZXhwb3J0IGNvbnN0IHNsaWNlR3JhZENvbmZpZzogR3JhZENvbmZpZyA9IHtcbiAga2VybmVsTmFtZTogU2xpY2UsXG4gIGlucHV0c1RvU2F2ZTogWyd4J10sXG4gIGdyYWRGdW5jOiAoZHk6IFRlbnNvciwgc2F2ZWQ6IFRlbnNvcltdLCBhdHRyczogTmFtZWRBdHRyTWFwKSA9PiB7XG4gICAgY29uc3QgW3hdID0gc2F2ZWQ7XG4gICAgY29uc3Qge2JlZ2luLCBzaXplfSA9IGF0dHJzIGFzIHt9IGFzIFNsaWNlQXR0cnM7XG5cbiAgICBjb25zdCBpbnB1dFNoYXBlID0geC5zaGFwZTtcbiAgICBjb25zdCBbYmVnaW5fLCBzaXplX10gPSBwYXJzZVNsaWNlUGFyYW1zKHgsIGJlZ2luLCBzaXplKTtcblxuICAgIC8vIENyZWF0ZSBhbiBOeDIgcGFkZGluZyB3aGVyZSB0aGUgZmlyc3QgY29sdW1uIHJlcHJlc2VudHMgaG93IG1hbnlcbiAgICAvLyB6ZXJvcyBhcmUgcHJlcGVuZGVkIChhdCBzdGFydCkgZm9yIGVhY2ggZGltZW5zaW9uLCBhbmQgdGhlIHNlY29uZFxuICAgIC8vIGNvbHVtbiBpbmRpY2F0ZXMgaG93IG1hbnkgemVyb3MgYXJlIGFwcGVuZGVkIChhdCBlbmQpLlxuXG4gICAgLy8gVGhlIG51bWJlciBvZiB6ZXJvcyB0byBhcHBlbmQgaXMgdGhlIHNoYXBlIG9mIHRoZSBpbnB1dFxuICAgIC8vIGVsZW1lbnR3aXNlLXN1YnRyYWN0ZWQgYnkgYm90aCB0aGUgYmVnaW4gdmVjdG9yIGFuZCBzaXplcyB2ZWN0b3IuXG4gICAgY29uc3QgcGFkZGluZ3M6IEFycmF5PFtudW1iZXIsIG51bWJlcl0+ID0gW107XG4gICAgZm9yIChsZXQgaSA9IDA7IGkgPCBkeS5yYW5rOyBpKyspIHtcbiAgICAgIHBhZGRpbmdzLnB1c2goW2JlZ2luX1tpXSwgaW5wdXRTaGFwZVtpXSAtIGJlZ2luX1tpXSAtIHNpemVfW2ldXSk7XG4gICAgfVxuICAgIHJldHVybiB7eDogKCkgPT4gcGFkKGR5LCBwYWRkaW5ncyl9O1xuICB9XG59O1xuIl19","/**\n * @license\n * Copyright 2020 Google LLC. All Rights Reserved.\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n * =============================================================================\n */\nimport { Softmax } from '../kernel_names';\nimport { mul } from '../ops/mul';\nimport { sub } from '../ops/sub';\nimport { sum } from '../ops/sum';\nexport const softmaxGradConfig = {\n kernelName: Softmax,\n outputsToSave: [true],\n gradFunc: (dy, saved, attrs) => {\n const [y] = saved;\n const { dim } = attrs;\n const keepDims = true;\n const dyTimesY = mul(dy, y);\n return {\n logits: () => sub(dyTimesY, mul(sum(dyTimesY, [dim], keepDims), y))\n };\n }\n};\n//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiU29mdG1heF9ncmFkLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vLi4vdGZqcy1jb3JlL3NyYy9ncmFkaWVudHMvU29mdG1heF9ncmFkLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBOzs7Ozs7Ozs7Ozs7Ozs7R0FlRztBQUVILE9BQU8sRUFBQyxPQUFPLEVBQWUsTUFBTSxpQkFBaUIsQ0FBQztBQUV0RCxPQUFPLEVBQUMsR0FBRyxFQUFDLE1BQU0sWUFBWSxDQUFDO0FBQy9CLE9BQU8sRUFBQyxHQUFHLEVBQUMsTUFBTSxZQUFZLENBQUM7QUFDL0IsT0FBTyxFQUFDLEdBQUcsRUFBQyxNQUFNLFlBQVksQ0FBQztBQUcvQixNQUFNLENBQUMsTUFBTSxpQkFBaUIsR0FBZTtJQUMzQyxVQUFVLEVBQUUsT0FBTztJQUNuQixhQUFhLEVBQUUsQ0FBQyxJQUFJLENBQUM7SUFDckIsUUFBUSxFQUFFLENBQUMsRUFBVSxFQUFFLEtBQWUsRUFBRSxLQUFtQixFQUFFLEVBQUU7UUFDN0QsTUFBTSxDQUFDLENBQUMsQ0FBQyxHQUFHLEtBQUssQ0FBQztRQUNsQixNQUFNLEVBQUMsR0FBRyxFQUFDLEdBQUcsS0FBMkIsQ0FBQztRQUMxQyxNQUFNLFFBQVEsR0FBRyxJQUFJLENBQUM7UUFFdEIsTUFBTSxRQUFRLEdBQUcsR0FBRyxDQUFDLEVBQUUsRUFBRSxDQUFDLENBQUMsQ0FBQztRQUM1QixPQUFPO1lBQ0wsTUFBTSxFQUFFLEdBQUcsRUFBRSxDQUFDLEdBQUcsQ0FBQyxRQUFRLEVBQUUsR0FBRyxDQUFDLEdBQUcsQ0FBQyxRQUFRLEVBQUUsQ0FBQyxHQUFHLENBQUMsRUFBRSxRQUFRLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQztTQUNwRSxDQUFDO0lBQ0osQ0FBQztDQUNGLENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyIvKipcbiAqIEBsaWNlbnNlXG4gKiBDb3B5cmlnaHQgMjAyMCBHb29nbGUgTExDLiBBbGwgUmlnaHRzIFJlc2VydmVkLlxuICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlIFwiTGljZW5zZVwiKTtcbiAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS5cbiAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdFxuICpcbiAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMFxuICpcbiAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmVcbiAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuIFwiQVMgSVNcIiBCQVNJUyxcbiAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLlxuICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZFxuICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuXG4gKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuICovXG5cbmltcG9ydCB7U29mdG1heCwgU29mdG1heEF0dHJzfSBmcm9tICcuLi9rZXJuZWxfbmFtZXMnO1xuaW1wb3J0IHtHcmFkQ29uZmlnLCBOYW1lZEF0dHJNYXB9IGZyb20gJy4uL2tlcm5lbF9yZWdpc3RyeSc7XG5pbXBvcnQge211bH0gZnJvbSAnLi4vb3BzL211bCc7XG5pbXBvcnQge3N1Yn0gZnJvbSAnLi4vb3BzL3N1Yic7XG5pbXBvcnQge3N1bX0gZnJvbSAnLi4vb3BzL3N1bSc7XG5pbXBvcnQge1RlbnNvcn0gZnJvbSAnLi4vdGVuc29yJztcblxuZXhwb3J0IGNvbnN0IHNvZnRtYXhHcmFkQ29uZmlnOiBHcmFkQ29uZmlnID0ge1xuICBrZXJuZWxOYW1lOiBTb2Z0bWF4LFxuICBvdXRwdXRzVG9TYXZlOiBbdHJ1ZV0sXG4gIGdyYWRGdW5jOiAoZHk6IFRlbnNvciwgc2F2ZWQ6IFRlbnNvcltdLCBhdHRyczogTmFtZWRBdHRyTWFwKSA9PiB7XG4gICAgY29uc3QgW3ldID0gc2F2ZWQ7XG4gICAgY29uc3Qge2RpbX0gPSBhdHRycyBhcyB7fSBhcyBTb2Z0bWF4QXR0cnM7XG4gICAgY29uc3Qga2VlcERpbXMgPSB0cnVlO1xuXG4gICAgY29uc3QgZHlUaW1lc1kgPSBtdWwoZHksIHkpO1xuICAgIHJldHVybiB7XG4gICAgICBsb2dpdHM6ICgpID0+IHN1YihkeVRpbWVzWSwgbXVsKHN1bShkeVRpbWVzWSwgW2RpbV0sIGtlZXBEaW1zKSwgeSkpXG4gICAgfTtcbiAgfVxufTtcbiJdfQ==","/**\n * @license\n * Copyright 2020 Google LLC. All Rights Reserved.\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n * =============================================================================\n */\nimport { Softplus } from '../kernel_names';\nimport { mul } from '../ops/mul';\nimport { sigmoid } from '../ops/sigmoid';\nexport const softplusGradConfig = {\n kernelName: Softplus,\n inputsToSave: ['x'],\n gradFunc: (dy, saved) => {\n const [x] = saved;\n return { x: () => mul(dy, sigmoid(x)) };\n }\n};\n//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiU29mdHBsdXNfZ3JhZC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uLy4uL3RmanMtY29yZS9zcmMvZ3JhZGllbnRzL1NvZnRwbHVzX2dyYWQudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUE7Ozs7Ozs7Ozs7Ozs7OztHQWVHO0FBRUgsT0FBTyxFQUFDLFFBQVEsRUFBQyxNQUFNLGlCQUFpQixDQUFDO0FBRXpDLE9BQU8sRUFBQyxHQUFHLEVBQUMsTUFBTSxZQUFZLENBQUM7QUFDL0IsT0FBTyxFQUFDLE9BQU8sRUFBQyxNQUFNLGdCQUFnQixDQUFDO0FBR3ZDLE1BQU0sQ0FBQyxNQUFNLGtCQUFrQixHQUFlO0lBQzVDLFVBQVUsRUFBRSxRQUFRO0lBQ3BCLFlBQVksRUFBRSxDQUFDLEdBQUcsQ0FBQztJQUNuQixRQUFRLEVBQUUsQ0FBQyxFQUFVLEVBQUUsS0FBZSxFQUFFLEVBQUU7UUFDeEMsTUFBTSxDQUFDLENBQUMsQ0FBQyxHQUFHLEtBQUssQ0FBQztRQUVsQixPQUFPLEVBQUMsQ0FBQyxFQUFFLEdBQUcsRUFBRSxDQUFDLEdBQUcsQ0FBQyxFQUFFLEVBQUUsT0FBTyxDQUFDLENBQUMsQ0FBQyxDQUFDLEVBQUMsQ0FBQztJQUN4QyxDQUFDO0NBQ0YsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbIi8qKlxuICogQGxpY2Vuc2VcbiAqIENvcHlyaWdodCAyMDIwIEdvb2dsZSBMTEMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuXG4gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgXCJMaWNlbnNlXCIpO1xuICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLlxuICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0XG4gKlxuICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wXG4gKlxuICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZVxuICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gXCJBUyBJU1wiIEJBU0lTLFxuICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuXG4gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kXG4gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS5cbiAqID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4gKi9cblxuaW1wb3J0IHtTb2Z0cGx1c30gZnJvbSAnLi4va2VybmVsX25hbWVzJztcbmltcG9ydCB7R3JhZENvbmZpZ30gZnJvbSAnLi4va2VybmVsX3JlZ2lzdHJ5JztcbmltcG9ydCB7bXVsfSBmcm9tICcuLi9vcHMvbXVsJztcbmltcG9ydCB7c2lnbW9pZH0gZnJvbSAnLi4vb3BzL3NpZ21vaWQnO1xuaW1wb3J0IHtUZW5zb3J9IGZyb20gJy4uL3RlbnNvcic7XG5cbmV4cG9ydCBjb25zdCBzb2Z0cGx1c0dyYWRDb25maWc6IEdyYWRDb25maWcgPSB7XG4gIGtlcm5lbE5hbWU6IFNvZnRwbHVzLFxuICBpbnB1dHNUb1NhdmU6IFsneCddLFxuICBncmFkRnVuYzogKGR5OiBUZW5zb3IsIHNhdmVkOiBUZW5zb3JbXSkgPT4ge1xuICAgIGNvbnN0IFt4XSA9IHNhdmVkO1xuXG4gICAgcmV0dXJuIHt4OiAoKSA9PiBtdWwoZHksIHNpZ21vaWQoeCkpfTtcbiAgfVxufTtcbiJdfQ==","/**\n * @license\n * Copyright 2020 Google LLC. All Rights Reserved.\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n * =============================================================================\n */\nimport { SpaceToBatchND } from '../kernel_names';\nimport { batchToSpaceND } from '../ops/batch_to_space_nd';\nexport const spaceToBatchNDGradConfig = {\n kernelName: SpaceToBatchND,\n gradFunc: (dy, saved, attrs) => {\n const { blockShape, paddings } = attrs;\n return { x: () => batchToSpaceND(dy, blockShape, paddings) };\n }\n};\n//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiU3BhY2VUb0JhdGNoTkRfZ3JhZC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uLy4uL3RmanMtY29yZS9zcmMvZ3JhZGllbnRzL1NwYWNlVG9CYXRjaE5EX2dyYWQudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUE7Ozs7Ozs7Ozs7Ozs7OztHQWVHO0FBRUgsT0FBTyxFQUFDLGNBQWMsRUFBc0IsTUFBTSxpQkFBaUIsQ0FBQztBQUVwRSxPQUFPLEVBQUMsY0FBYyxFQUFDLE1BQU0sMEJBQTBCLENBQUM7QUFHeEQsTUFBTSxDQUFDLE1BQU0sd0JBQXdCLEdBQWU7SUFDbEQsVUFBVSxFQUFFLGNBQWM7SUFDMUIsUUFBUSxFQUFFLENBQUMsRUFBVSxFQUFFLEtBQWUsRUFBRSxLQUFtQixFQUFFLEVBQUU7UUFDN0QsTUFBTSxFQUFDLFVBQVUsRUFBRSxRQUFRLEVBQUMsR0FBRyxLQUFrQyxDQUFDO1FBQ2xFLE9BQU8sRUFBQyxDQUFDLEVBQUUsR0FBRyxFQUFFLENBQUMsY0FBYyxDQUFDLEVBQUUsRUFBRSxVQUFVLEVBQUUsUUFBUSxDQUFDLEVBQUMsQ0FBQztJQUM3RCxDQUFDO0NBQ0YsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbIi8qKlxuICogQGxpY2Vuc2VcbiAqIENvcHlyaWdodCAyMDIwIEdvb2dsZSBMTEMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuXG4gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgXCJMaWNlbnNlXCIpO1xuICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLlxuICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0XG4gKlxuICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wXG4gKlxuICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZVxuICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gXCJBUyBJU1wiIEJBU0lTLFxuICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuXG4gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kXG4gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS5cbiAqID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4gKi9cblxuaW1wb3J0IHtTcGFjZVRvQmF0Y2hORCwgU3BhY2VUb0JhdGNoTkRBdHRyc30gZnJvbSAnLi4va2VybmVsX25hbWVzJztcbmltcG9ydCB7R3JhZENvbmZpZywgTmFtZWRBdHRyTWFwfSBmcm9tICcuLi9rZXJuZWxfcmVnaXN0cnknO1xuaW1wb3J0IHtiYXRjaFRvU3BhY2VORH0gZnJvbSAnLi4vb3BzL2JhdGNoX3RvX3NwYWNlX25kJztcbmltcG9ydCB7VGVuc29yfSBmcm9tICcuLi90ZW5zb3InO1xuXG5leHBvcnQgY29uc3Qgc3BhY2VUb0JhdGNoTkRHcmFkQ29uZmlnOiBHcmFkQ29uZmlnID0ge1xuICBrZXJuZWxOYW1lOiBTcGFjZVRvQmF0Y2hORCxcbiAgZ3JhZEZ1bmM6IChkeTogVGVuc29yLCBzYXZlZDogVGVuc29yW10sIGF0dHJzOiBOYW1lZEF0dHJNYXApID0+IHtcbiAgICBjb25zdCB7YmxvY2tTaGFwZSwgcGFkZGluZ3N9ID0gYXR0cnMgYXMge30gYXMgU3BhY2VUb0JhdGNoTkRBdHRycztcbiAgICByZXR1cm4ge3g6ICgpID0+IGJhdGNoVG9TcGFjZU5EKGR5LCBibG9ja1NoYXBlLCBwYWRkaW5ncyl9O1xuICB9XG59O1xuIl19","/**\n * @license\n * Copyright 2020 Google LLC. All Rights Reserved.\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n * =============================================================================\n */\nimport { SplitV } from '../kernel_names';\nimport { concat } from '../ops/concat';\nexport const splitVGradConfig = {\n kernelName: SplitV,\n gradFunc: (dy, saved, attrs) => {\n const { axis } = attrs;\n return { x: () => concat(dy, axis) };\n }\n};\n//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiU3BsaXRWX2dyYWQuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi8uLi90ZmpzLWNvcmUvc3JjL2dyYWRpZW50cy9TcGxpdFZfZ3JhZC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQTs7Ozs7Ozs7Ozs7Ozs7O0dBZUc7QUFDSCxPQUFPLEVBQUMsTUFBTSxFQUFjLE1BQU0saUJBQWlCLENBQUM7QUFFcEQsT0FBTyxFQUFDLE1BQU0sRUFBQyxNQUFNLGVBQWUsQ0FBQztBQUdyQyxNQUFNLENBQUMsTUFBTSxnQkFBZ0IsR0FBZTtJQUMxQyxVQUFVLEVBQUUsTUFBTTtJQUNsQixRQUFRLEVBQUUsQ0FBQyxFQUFZLEVBQUUsS0FBZSxFQUFFLEtBQW1CLEVBQUUsRUFBRTtRQUMvRCxNQUFNLEVBQUMsSUFBSSxFQUFDLEdBQUcsS0FBMEIsQ0FBQztRQUUxQyxPQUFPLEVBQUMsQ0FBQyxFQUFFLEdBQUcsRUFBRSxDQUFDLE1BQU0sQ0FBQyxFQUFFLEVBQUUsSUFBSSxDQUFDLEVBQUMsQ0FBQztJQUNyQyxDQUFDO0NBQ0YsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbIi8qKlxuICogQGxpY2Vuc2VcbiAqIENvcHlyaWdodCAyMDIwIEdvb2dsZSBMTEMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuXG4gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgXCJMaWNlbnNlXCIpO1xuICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLlxuICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0XG4gKlxuICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wXG4gKlxuICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZVxuICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gXCJBUyBJU1wiIEJBU0lTLFxuICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuXG4gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kXG4gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS5cbiAqID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4gKi9cbmltcG9ydCB7U3BsaXRWLCBTcGxpdFZBdHRyc30gZnJvbSAnLi4va2VybmVsX25hbWVzJztcbmltcG9ydCB7R3JhZENvbmZpZywgTmFtZWRBdHRyTWFwfSBmcm9tICcuLi9rZXJuZWxfcmVnaXN0cnknO1xuaW1wb3J0IHtjb25jYXR9IGZyb20gJy4uL29wcy9jb25jYXQnO1xuaW1wb3J0IHtUZW5zb3J9IGZyb20gJy4uL3RlbnNvcic7XG5cbmV4cG9ydCBjb25zdCBzcGxpdFZHcmFkQ29uZmlnOiBHcmFkQ29uZmlnID0ge1xuICBrZXJuZWxOYW1lOiBTcGxpdFYsXG4gIGdyYWRGdW5jOiAoZHk6IFRlbnNvcltdLCBzYXZlZDogVGVuc29yW10sIGF0dHJzOiBOYW1lZEF0dHJNYXApID0+IHtcbiAgICBjb25zdCB7YXhpc30gPSBhdHRycyBhcyB7fSBhcyBTcGxpdFZBdHRycztcblxuICAgIHJldHVybiB7eDogKCkgPT4gY29uY2F0KGR5LCBheGlzKX07XG4gIH1cbn07XG4iXX0=","/**\n * @license\n * Copyright 2020 Google LLC. All Rights Reserved.\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n * =============================================================================\n */\nimport { Sqrt } from '../kernel_names';\nimport { cast } from '../ops/cast';\nimport { div } from '../ops/div';\nimport { mul } from '../ops/mul';\nimport { sqrt } from '../ops/sqrt';\nexport const sqrtGradConfig = {\n kernelName: Sqrt,\n inputsToSave: ['x'],\n gradFunc: (dy, saved) => {\n const [x] = saved;\n return { x: () => div(dy, mul(sqrt(cast(x, 'float32')), 2)) };\n }\n};\n//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiU3FydF9ncmFkLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vLi4vdGZqcy1jb3JlL3NyYy9ncmFkaWVudHMvU3FydF9ncmFkLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBOzs7Ozs7Ozs7Ozs7Ozs7R0FlRztBQUVILE9BQU8sRUFBQyxJQUFJLEVBQUMsTUFBTSxpQkFBaUIsQ0FBQztBQUVyQyxPQUFPLEVBQUMsSUFBSSxFQUFDLE1BQU0sYUFBYSxDQUFDO0FBQ2pDLE9BQU8sRUFBQyxHQUFHLEVBQUMsTUFBTSxZQUFZLENBQUM7QUFDL0IsT0FBTyxFQUFDLEdBQUcsRUFBQyxNQUFNLFlBQVksQ0FBQztBQUMvQixPQUFPLEVBQUMsSUFBSSxFQUFDLE1BQU0sYUFBYSxDQUFDO0FBR2pDLE1BQU0sQ0FBQyxNQUFNLGNBQWMsR0FBZTtJQUN4QyxVQUFVLEVBQUUsSUFBSTtJQUNoQixZQUFZLEVBQUUsQ0FBQyxHQUFHLENBQUM7SUFDbkIsUUFBUSxFQUFFLENBQUMsRUFBVSxFQUFFLEtBQWUsRUFBRSxFQUFFO1FBQ3hDLE1BQU0sQ0FBQyxDQUFDLENBQUMsR0FBRyxLQUFLLENBQUM7UUFFbEIsT0FBTyxFQUFDLENBQUMsRUFBRSxHQUFHLEVBQUUsQ0FBQyxHQUFHLENBQUMsRUFBRSxFQUFFLEdBQUcsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLENBQUMsRUFBRSxTQUFTLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLEVBQUMsQ0FBQztJQUM5RCxDQUFDO0NBQ0YsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbIi8qKlxuICogQGxpY2Vuc2VcbiAqIENvcHlyaWdodCAyMDIwIEdvb2dsZSBMTEMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuXG4gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgXCJMaWNlbnNlXCIpO1xuICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLlxuICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0XG4gKlxuICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wXG4gKlxuICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZVxuICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gXCJBUyBJU1wiIEJBU0lTLFxuICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuXG4gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kXG4gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS5cbiAqID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4gKi9cblxuaW1wb3J0IHtTcXJ0fSBmcm9tICcuLi9rZXJuZWxfbmFtZXMnO1xuaW1wb3J0IHtHcmFkQ29uZmlnfSBmcm9tICcuLi9rZXJuZWxfcmVnaXN0cnknO1xuaW1wb3J0IHtjYXN0fSBmcm9tICcuLi9vcHMvY2FzdCc7XG5pbXBvcnQge2Rpdn0gZnJvbSAnLi4vb3BzL2Rpdic7XG5pbXBvcnQge211bH0gZnJvbSAnLi4vb3BzL211bCc7XG5pbXBvcnQge3NxcnR9IGZyb20gJy4uL29wcy9zcXJ0JztcbmltcG9ydCB7VGVuc29yfSBmcm9tICcuLi90ZW5zb3InO1xuXG5leHBvcnQgY29uc3Qgc3FydEdyYWRDb25maWc6IEdyYWRDb25maWcgPSB7XG4gIGtlcm5lbE5hbWU6IFNxcnQsXG4gIGlucHV0c1RvU2F2ZTogWyd4J10sXG4gIGdyYWRGdW5jOiAoZHk6IFRlbnNvciwgc2F2ZWQ6IFRlbnNvcltdKSA9PiB7XG4gICAgY29uc3QgW3hdID0gc2F2ZWQ7XG5cbiAgICByZXR1cm4ge3g6ICgpID0+IGRpdihkeSwgbXVsKHNxcnQoY2FzdCh4LCAnZmxvYXQzMicpKSwgMikpfTtcbiAgfVxufTtcbiJdfQ==","/**\n * @license\n * Copyright 2019 Google LLC. All Rights Reserved.\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n * =============================================================================\n */\nimport { Square } from '../kernel_names';\nimport { cast } from '../ops/cast';\nimport { mul } from '../ops/mul';\nexport const squareGradConfig = {\n kernelName: Square,\n inputsToSave: ['x'],\n gradFunc: (dy, saved) => {\n const [x] = saved;\n return { x: () => mul(dy, mul(cast(x, 'float32'), 2)) };\n }\n};\n//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiU3F1YXJlX2dyYWQuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi8uLi90ZmpzLWNvcmUvc3JjL2dyYWRpZW50cy9TcXVhcmVfZ3JhZC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQTs7Ozs7Ozs7Ozs7Ozs7O0dBZUc7QUFFSCxPQUFPLEVBQUMsTUFBTSxFQUFDLE1BQU0saUJBQWlCLENBQUM7QUFFdkMsT0FBTyxFQUFDLElBQUksRUFBQyxNQUFNLGFBQWEsQ0FBQztBQUNqQyxPQUFPLEVBQUMsR0FBRyxFQUFDLE1BQU0sWUFBWSxDQUFDO0FBRy9CLE1BQU0sQ0FBQyxNQUFNLGdCQUFnQixHQUFlO0lBQzFDLFVBQVUsRUFBRSxNQUFNO0lBQ2xCLFlBQVksRUFBRSxDQUFDLEdBQUcsQ0FBQztJQUNuQixRQUFRLEVBQUUsQ0FBQyxFQUFVLEVBQUUsS0FBZSxFQUFFLEVBQUU7UUFDeEMsTUFBTSxDQUFDLENBQUMsQ0FBQyxHQUFHLEtBQUssQ0FBQztRQUNsQixPQUFPLEVBQUMsQ0FBQyxFQUFFLEdBQUcsRUFBRSxDQUFDLEdBQUcsQ0FBQyxFQUFFLEVBQUUsR0FBRyxDQUFDLElBQUksQ0FBQyxDQUFDLEVBQUUsU0FBUyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsRUFBQyxDQUFDO0lBQ3hELENBQUM7Q0FDRixDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiLyoqXG4gKiBAbGljZW5zZVxuICogQ29weXJpZ2h0IDIwMTkgR29vZ2xlIExMQy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC5cbiAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSBcIkxpY2Vuc2VcIik7XG4gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuXG4gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXRcbiAqXG4gKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjBcbiAqXG4gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlXG4gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiBcIkFTIElTXCIgQkFTSVMsXG4gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC5cbiAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmRcbiAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLlxuICogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbiAqL1xuXG5pbXBvcnQge1NxdWFyZX0gZnJvbSAnLi4va2VybmVsX25hbWVzJztcbmltcG9ydCB7R3JhZENvbmZpZ30gZnJvbSAnLi4va2VybmVsX3JlZ2lzdHJ5JztcbmltcG9ydCB7Y2FzdH0gZnJvbSAnLi4vb3BzL2Nhc3QnO1xuaW1wb3J0IHttdWx9IGZyb20gJy4uL29wcy9tdWwnO1xuaW1wb3J0IHtUZW5zb3J9IGZyb20gJy4uL3RlbnNvcic7XG5cbmV4cG9ydCBjb25zdCBzcXVhcmVHcmFkQ29uZmlnOiBHcmFkQ29uZmlnID0ge1xuICBrZXJuZWxOYW1lOiBTcXVhcmUsXG4gIGlucHV0c1RvU2F2ZTogWyd4J10sXG4gIGdyYWRGdW5jOiAoZHk6IFRlbnNvciwgc2F2ZWQ6IFRlbnNvcltdKSA9PiB7XG4gICAgY29uc3QgW3hdID0gc2F2ZWQ7XG4gICAgcmV0dXJuIHt4OiAoKSA9PiBtdWwoZHksIG11bChjYXN0KHgsICdmbG9hdDMyJyksIDIpKX07XG4gIH1cbn07XG4iXX0=","/**\n * @license\n * Copyright 2020 Google LLC. All Rights Reserved.\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n * =============================================================================\n */\nimport { SquaredDifference } from '../kernel_names';\nimport { mul } from '../ops/mul';\nimport { scalar } from '../ops/scalar';\nimport { sub } from '../ops/sub';\nexport const squaredDifferenceGradConfig = {\n kernelName: SquaredDifference,\n inputsToSave: ['a', 'b'],\n gradFunc: (dy, saved) => {\n const [a, b] = saved;\n const two = scalar(2);\n const derA = () => mul(dy, mul(two, sub(a, b)));\n const derB = () => mul(dy, mul(two, sub(b, a)));\n return { a: derA, b: derB };\n }\n};\n//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiU3F1YXJlZERpZmZlcmVuY2VfZ3JhZC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uLy4uL3RmanMtY29yZS9zcmMvZ3JhZGllbnRzL1NxdWFyZWREaWZmZXJlbmNlX2dyYWQudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUE7Ozs7Ozs7Ozs7Ozs7OztHQWVHO0FBRUgsT0FBTyxFQUFDLGlCQUFpQixFQUFDLE1BQU0saUJBQWlCLENBQUM7QUFFbEQsT0FBTyxFQUFDLEdBQUcsRUFBQyxNQUFNLFlBQVksQ0FBQztBQUMvQixPQUFPLEVBQUMsTUFBTSxFQUFDLE1BQU0sZUFBZSxDQUFDO0FBQ3JDLE9BQU8sRUFBQyxHQUFHLEVBQUMsTUFBTSxZQUFZLENBQUM7QUFHL0IsTUFBTSxDQUFDLE1BQU0sMkJBQTJCLEdBQWU7SUFDckQsVUFBVSxFQUFFLGlCQUFpQjtJQUM3QixZQUFZLEVBQUUsQ0FBQyxHQUFHLEVBQUUsR0FBRyxDQUFDO0lBQ3hCLFFBQVEsRUFBRSxDQUFDLEVBQVUsRUFBRSxLQUFlLEVBQUUsRUFBRTtRQUN4QyxNQUFNLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxHQUFHLEtBQUssQ0FBQztRQUNyQixNQUFNLEdBQUcsR0FBRyxNQUFNLENBQUMsQ0FBQyxDQUFDLENBQUM7UUFDdEIsTUFBTSxJQUFJLEdBQUcsR0FBRyxFQUFFLENBQUMsR0FBRyxDQUFDLEVBQUUsRUFBRSxHQUFHLENBQUMsR0FBRyxFQUFFLEdBQUcsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDO1FBQ2hELE1BQU0sSUFBSSxHQUFHLEdBQUcsRUFBRSxDQUFDLEdBQUcsQ0FBQyxFQUFFLEVBQUUsR0FBRyxDQUFDLEdBQUcsRUFBRSxHQUFHLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQztRQUNoRCxPQUFPLEVBQUMsQ0FBQyxFQUFFLElBQUksRUFBRSxDQUFDLEVBQUUsSUFBSSxFQUFDLENBQUM7SUFDNUIsQ0FBQztDQUNGLENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyIvKipcbiAqIEBsaWNlbnNlXG4gKiBDb3B5cmlnaHQgMjAyMCBHb29nbGUgTExDLiBBbGwgUmlnaHRzIFJlc2VydmVkLlxuICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlIFwiTGljZW5zZVwiKTtcbiAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS5cbiAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdFxuICpcbiAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMFxuICpcbiAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmVcbiAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuIFwiQVMgSVNcIiBCQVNJUyxcbiAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLlxuICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZFxuICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuXG4gKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuICovXG5cbmltcG9ydCB7U3F1YXJlZERpZmZlcmVuY2V9IGZyb20gJy4uL2tlcm5lbF9uYW1lcyc7XG5pbXBvcnQge0dyYWRDb25maWd9IGZyb20gJy4uL2tlcm5lbF9yZWdpc3RyeSc7XG5pbXBvcnQge211bH0gZnJvbSAnLi4vb3BzL211bCc7XG5pbXBvcnQge3NjYWxhcn0gZnJvbSAnLi4vb3BzL3NjYWxhcic7XG5pbXBvcnQge3N1Yn0gZnJvbSAnLi4vb3BzL3N1Yic7XG5pbXBvcnQge1RlbnNvcn0gZnJvbSAnLi4vdGVuc29yJztcblxuZXhwb3J0IGNvbnN0IHNxdWFyZWREaWZmZXJlbmNlR3JhZENvbmZpZzogR3JhZENvbmZpZyA9IHtcbiAga2VybmVsTmFtZTogU3F1YXJlZERpZmZlcmVuY2UsXG4gIGlucHV0c1RvU2F2ZTogWydhJywgJ2InXSxcbiAgZ3JhZEZ1bmM6IChkeTogVGVuc29yLCBzYXZlZDogVGVuc29yW10pID0+IHtcbiAgICBjb25zdCBbYSwgYl0gPSBzYXZlZDtcbiAgICBjb25zdCB0d28gPSBzY2FsYXIoMik7XG4gICAgY29uc3QgZGVyQSA9ICgpID0+IG11bChkeSwgbXVsKHR3bywgc3ViKGEsIGIpKSk7XG4gICAgY29uc3QgZGVyQiA9ICgpID0+IG11bChkeSwgbXVsKHR3bywgc3ViKGIsIGEpKSk7XG4gICAgcmV0dXJuIHthOiBkZXJBLCBiOiBkZXJCfTtcbiAgfVxufTtcbiJdfQ==","/**\n * @license\n * Copyright 2020 Google LLC. All Rights Reserved.\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n * =============================================================================\n */\nimport { Step } from '../kernel_names';\nimport { zerosLike } from '../ops/zeros_like';\nexport const stepGradConfig = {\n kernelName: Step,\n gradFunc: (dy) => {\n // TODO(manrajgrover): Return null for gradients when backprop supports\n // it.\n return { x: () => zerosLike(dy) };\n }\n};\n//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiU3RlcF9ncmFkLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vLi4vdGZqcy1jb3JlL3NyYy9ncmFkaWVudHMvU3RlcF9ncmFkLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBOzs7Ozs7Ozs7Ozs7Ozs7R0FlRztBQUVILE9BQU8sRUFBQyxJQUFJLEVBQUMsTUFBTSxpQkFBaUIsQ0FBQztBQUVyQyxPQUFPLEVBQUMsU0FBUyxFQUFDLE1BQU0sbUJBQW1CLENBQUM7QUFHNUMsTUFBTSxDQUFDLE1BQU0sY0FBYyxHQUFlO0lBQ3hDLFVBQVUsRUFBRSxJQUFJO0lBQ2hCLFFBQVEsRUFBRSxDQUFDLEVBQVUsRUFBRSxFQUFFO1FBQ3ZCLHVFQUF1RTtRQUN2RSxNQUFNO1FBQ04sT0FBTyxFQUFDLENBQUMsRUFBRSxHQUFHLEVBQUUsQ0FBQyxTQUFTLENBQUMsRUFBRSxDQUFDLEVBQUMsQ0FBQztJQUNsQyxDQUFDO0NBQ0YsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbIi8qKlxuICogQGxpY2Vuc2VcbiAqIENvcHlyaWdodCAyMDIwIEdvb2dsZSBMTEMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuXG4gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgXCJMaWNlbnNlXCIpO1xuICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLlxuICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0XG4gKlxuICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wXG4gKlxuICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZVxuICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gXCJBUyBJU1wiIEJBU0lTLFxuICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuXG4gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kXG4gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS5cbiAqID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4gKi9cblxuaW1wb3J0IHtTdGVwfSBmcm9tICcuLi9rZXJuZWxfbmFtZXMnO1xuaW1wb3J0IHtHcmFkQ29uZmlnfSBmcm9tICcuLi9rZXJuZWxfcmVnaXN0cnknO1xuaW1wb3J0IHt6ZXJvc0xpa2V9IGZyb20gJy4uL29wcy96ZXJvc19saWtlJztcbmltcG9ydCB7VGVuc29yfSBmcm9tICcuLi90ZW5zb3InO1xuXG5leHBvcnQgY29uc3Qgc3RlcEdyYWRDb25maWc6IEdyYWRDb25maWcgPSB7XG4gIGtlcm5lbE5hbWU6IFN0ZXAsXG4gIGdyYWRGdW5jOiAoZHk6IFRlbnNvcikgPT4ge1xuICAgIC8vIFRPRE8obWFucmFqZ3JvdmVyKTogUmV0dXJuIG51bGwgZm9yIGdyYWRpZW50cyB3aGVuIGJhY2twcm9wIHN1cHBvcnRzXG4gICAgLy8gaXQuXG4gICAgcmV0dXJuIHt4OiAoKSA9PiB6ZXJvc0xpa2UoZHkpfTtcbiAgfVxufTtcbiJdfQ==","/**\n * @license\n * Copyright 2020 Google LLC. All Rights Reserved.\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n * =============================================================================\n */\nimport { Sub } from '../kernel_names';\nimport * as broadcast_util from '../ops/broadcast_util';\nimport { neg } from '../ops/neg';\nimport { reshape } from '../ops/reshape';\nimport { sum } from '../ops/sum';\nexport const subGradConfig = {\n kernelName: Sub,\n inputsToSave: ['a', 'b'],\n gradFunc: (dy, saved) => {\n const [a, b] = saved;\n const outShape = broadcast_util.assertAndGetBroadcastShape(a.shape, b.shape);\n const derA = () => {\n let res = dy;\n const reduceAxes = broadcast_util.getReductionAxes(a.shape, outShape);\n if (reduceAxes.length > 0) {\n res = sum(res, reduceAxes);\n }\n return reshape(res, a.shape);\n };\n const derB = () => {\n let res = dy;\n const reduceAxes = broadcast_util.getReductionAxes(b.shape, outShape);\n if (reduceAxes.length > 0) {\n res = sum(res, reduceAxes);\n }\n return reshape(neg(res), b.shape);\n };\n return { a: derA, b: derB };\n }\n};\n//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiU3ViX2dyYWQuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi8uLi90ZmpzLWNvcmUvc3JjL2dyYWRpZW50cy9TdWJfZ3JhZC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQTs7Ozs7Ozs7Ozs7Ozs7O0dBZUc7QUFDSCxPQUFPLEVBQUMsR0FBRyxFQUFDLE1BQU0saUJBQWlCLENBQUM7QUFFcEMsT0FBTyxLQUFLLGNBQWMsTUFBTSx1QkFBdUIsQ0FBQztBQUN4RCxPQUFPLEVBQUMsR0FBRyxFQUFDLE1BQU0sWUFBWSxDQUFDO0FBQy9CLE9BQU8sRUFBQyxPQUFPLEVBQUMsTUFBTSxnQkFBZ0IsQ0FBQztBQUN2QyxPQUFPLEVBQUMsR0FBRyxFQUFDLE1BQU0sWUFBWSxDQUFDO0FBRy9CLE1BQU0sQ0FBQyxNQUFNLGFBQWEsR0FBZTtJQUN2QyxVQUFVLEVBQUUsR0FBRztJQUNmLFlBQVksRUFBRSxDQUFDLEdBQUcsRUFBRSxHQUFHLENBQUM7SUFDeEIsUUFBUSxFQUFFLENBQUMsRUFBVSxFQUFFLEtBQWUsRUFBRSxFQUFFO1FBQ3hDLE1BQU0sQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLEdBQUcsS0FBSyxDQUFDO1FBQ3JCLE1BQU0sUUFBUSxHQUNWLGNBQWMsQ0FBQywwQkFBMEIsQ0FBQyxDQUFDLENBQUMsS0FBSyxFQUFFLENBQUMsQ0FBQyxLQUFLLENBQUMsQ0FBQztRQUVoRSxNQUFNLElBQUksR0FBRyxHQUFHLEVBQUU7WUFDaEIsSUFBSSxHQUFHLEdBQUcsRUFBRSxDQUFDO1lBQ2IsTUFBTSxVQUFVLEdBQUcsY0FBYyxDQUFDLGdCQUFnQixDQUFDLENBQUMsQ0FBQyxLQUFLLEVBQUUsUUFBUSxDQUFDLENBQUM7WUFDdEUsSUFBSSxVQUFVLENBQUMsTUFBTSxHQUFHLENBQUMsRUFBRTtnQkFDekIsR0FBRyxHQUFHLEdBQUcsQ0FBQyxHQUFHLEVBQUUsVUFBVSxDQUFDLENBQUM7YUFDNUI7WUFDRCxPQUFPLE9BQU8sQ0FBQyxHQUFHLEVBQUUsQ0FBQyxDQUFDLEtBQUssQ0FBQyxDQUFDO1FBQy9CLENBQUMsQ0FBQztRQUNGLE1BQU0sSUFBSSxHQUFHLEdBQUcsRUFBRTtZQUNoQixJQUFJLEdBQUcsR0FBRyxFQUFFLENBQUM7WUFDYixNQUFNLFVBQVUsR0FBRyxjQUFjLENBQUMsZ0JBQWdCLENBQUMsQ0FBQyxDQUFDLEtBQUssRUFBRSxRQUFRLENBQUMsQ0FBQztZQUN0RSxJQUFJLFVBQVUsQ0FBQyxNQUFNLEdBQUcsQ0FBQyxFQUFFO2dCQUN6QixHQUFHLEdBQUcsR0FBRyxDQUFDLEdBQUcsRUFBRSxVQUFVLENBQUMsQ0FBQzthQUM1QjtZQUNELE9BQU8sT0FBTyxDQUFDLEdBQUcsQ0FBQyxHQUFHLENBQUMsRUFBRSxDQUFDLENBQUMsS0FBSyxDQUFDLENBQUM7UUFDcEMsQ0FBQyxDQUFDO1FBRUYsT0FBTyxFQUFDLENBQUMsRUFBRSxJQUFJLEVBQUUsQ0FBQyxFQUFFLElBQUksRUFBQyxDQUFDO0lBQzVCLENBQUM7Q0FDRixDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiLyoqXG4gKiBAbGljZW5zZVxuICogQ29weXJpZ2h0IDIwMjAgR29vZ2xlIExMQy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC5cbiAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSBcIkxpY2Vuc2VcIik7XG4gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuXG4gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXRcbiAqXG4gKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjBcbiAqXG4gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlXG4gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiBcIkFTIElTXCIgQkFTSVMsXG4gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC5cbiAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmRcbiAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLlxuICogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbiAqL1xuaW1wb3J0IHtTdWJ9IGZyb20gJy4uL2tlcm5lbF9uYW1lcyc7XG5pbXBvcnQge0dyYWRDb25maWd9IGZyb20gJy4uL2tlcm5lbF9yZWdpc3RyeSc7XG5pbXBvcnQgKiBhcyBicm9hZGNhc3RfdXRpbCBmcm9tICcuLi9vcHMvYnJvYWRjYXN0X3V0aWwnO1xuaW1wb3J0IHtuZWd9IGZyb20gJy4uL29wcy9uZWcnO1xuaW1wb3J0IHtyZXNoYXBlfSBmcm9tICcuLi9vcHMvcmVzaGFwZSc7XG5pbXBvcnQge3N1bX0gZnJvbSAnLi4vb3BzL3N1bSc7XG5pbXBvcnQge1RlbnNvcn0gZnJvbSAnLi4vdGVuc29yJztcblxuZXhwb3J0IGNvbnN0IHN1YkdyYWRDb25maWc6IEdyYWRDb25maWcgPSB7XG4gIGtlcm5lbE5hbWU6IFN1YixcbiAgaW5wdXRzVG9TYXZlOiBbJ2EnLCAnYiddLFxuICBncmFkRnVuYzogKGR5OiBUZW5zb3IsIHNhdmVkOiBUZW5zb3JbXSkgPT4ge1xuICAgIGNvbnN0IFthLCBiXSA9IHNhdmVkO1xuICAgIGNvbnN0IG91dFNoYXBlID1cbiAgICAgICAgYnJvYWRjYXN0X3V0aWwuYXNzZXJ0QW5kR2V0QnJvYWRjYXN0U2hhcGUoYS5zaGFwZSwgYi5zaGFwZSk7XG5cbiAgICBjb25zdCBkZXJBID0gKCkgPT4ge1xuICAgICAgbGV0IHJlcyA9IGR5O1xuICAgICAgY29uc3QgcmVkdWNlQXhlcyA9IGJyb2FkY2FzdF91dGlsLmdldFJlZHVjdGlvbkF4ZXMoYS5zaGFwZSwgb3V0U2hhcGUpO1xuICAgICAgaWYgKHJlZHVjZUF4ZXMubGVuZ3RoID4gMCkge1xuICAgICAgICByZXMgPSBzdW0ocmVzLCByZWR1Y2VBeGVzKTtcbiAgICAgIH1cbiAgICAgIHJldHVybiByZXNoYXBlKHJlcywgYS5zaGFwZSk7XG4gICAgfTtcbiAgICBjb25zdCBkZXJCID0gKCkgPT4ge1xuICAgICAgbGV0IHJlcyA9IGR5O1xuICAgICAgY29uc3QgcmVkdWNlQXhlcyA9IGJyb2FkY2FzdF91dGlsLmdldFJlZHVjdGlvbkF4ZXMoYi5zaGFwZSwgb3V0U2hhcGUpO1xuICAgICAgaWYgKHJlZHVjZUF4ZXMubGVuZ3RoID4gMCkge1xuICAgICAgICByZXMgPSBzdW0ocmVzLCByZWR1Y2VBeGVzKTtcbiAgICAgIH1cbiAgICAgIHJldHVybiByZXNoYXBlKG5lZyhyZXMpLCBiLnNoYXBlKTtcbiAgICB9O1xuXG4gICAgcmV0dXJuIHthOiBkZXJBLCBiOiBkZXJCfTtcbiAgfVxufTtcbiJdfQ==","/**\n * @license\n * Copyright 2020 Google Inc. All Rights Reserved.\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n * =============================================================================\n */\nimport { Sum } from '../kernel_names';\nimport { mul } from '../ops/mul';\nimport { ones } from '../ops/ones';\nimport { reshape } from '../ops/reshape';\nimport { parseAxisParam } from '../util';\nexport const sumGradConfig = {\n kernelName: Sum,\n inputsToSave: ['x'],\n gradFunc: (dy, saved, attrs) => {\n const [x] = saved;\n const expandedDyShape = x.shape.slice();\n const { axis } = attrs;\n const axes = parseAxisParam(axis, x.shape);\n axes.forEach(axis => {\n expandedDyShape[axis] = 1;\n });\n const expandedDy = reshape(dy, expandedDyShape);\n const derX = mul(expandedDy, ones(x.shape, 'float32'));\n return { x: () => derX };\n }\n};\n//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiU3VtX2dyYWQuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi8uLi90ZmpzLWNvcmUvc3JjL2dyYWRpZW50cy9TdW1fZ3JhZC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQTs7Ozs7Ozs7Ozs7Ozs7O0dBZUc7QUFFSCxPQUFPLEVBQUMsR0FBRyxFQUFXLE1BQU0saUJBQWlCLENBQUM7QUFFOUMsT0FBTyxFQUFDLEdBQUcsRUFBQyxNQUFNLFlBQVksQ0FBQztBQUMvQixPQUFPLEVBQUMsSUFBSSxFQUFDLE1BQU0sYUFBYSxDQUFDO0FBQ2pDLE9BQU8sRUFBQyxPQUFPLEVBQUMsTUFBTSxnQkFBZ0IsQ0FBQztBQUV2QyxPQUFPLEVBQUMsY0FBYyxFQUFDLE1BQU0sU0FBUyxDQUFDO0FBRXZDLE1BQU0sQ0FBQyxNQUFNLGFBQWEsR0FBZTtJQUN2QyxVQUFVLEVBQUUsR0FBRztJQUNmLFlBQVksRUFBRSxDQUFDLEdBQUcsQ0FBQztJQUNuQixRQUFRLEVBQUUsQ0FBQyxFQUFVLEVBQUUsS0FBZSxFQUFFLEtBQW1CLEVBQUUsRUFBRTtRQUM3RCxNQUFNLENBQUMsQ0FBQyxDQUFDLEdBQUcsS0FBSyxDQUFDO1FBQ2xCLE1BQU0sZUFBZSxHQUFHLENBQUMsQ0FBQyxLQUFLLENBQUMsS0FBSyxFQUFFLENBQUM7UUFDeEMsTUFBTSxFQUFDLElBQUksRUFBQyxHQUFHLEtBQXVCLENBQUM7UUFFdkMsTUFBTSxJQUFJLEdBQUcsY0FBYyxDQUFDLElBQUksRUFBRSxDQUFDLENBQUMsS0FBSyxDQUFDLENBQUM7UUFDM0MsSUFBSSxDQUFDLE9BQU8sQ0FBQyxJQUFJLENBQUMsRUFBRTtZQUNsQixlQUFlLENBQUMsSUFBSSxDQUFDLEdBQUcsQ0FBQyxDQUFDO1FBQzVCLENBQUMsQ0FBQyxDQUFDO1FBQ0gsTUFBTSxVQUFVLEdBQUcsT0FBTyxDQUFDLEVBQUUsRUFBRSxlQUFlLENBQUMsQ0FBQztRQUNoRCxNQUFNLElBQUksR0FBRyxHQUFHLENBQUMsVUFBVSxFQUFFLElBQUksQ0FBQyxDQUFDLENBQUMsS0FBSyxFQUFFLFNBQVMsQ0FBQyxDQUFDLENBQUM7UUFFdkQsT0FBTyxFQUFDLENBQUMsRUFBRSxHQUFHLEVBQUUsQ0FBQyxJQUFJLEVBQUMsQ0FBQztJQUN6QixDQUFDO0NBQ0YsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbIi8qKlxuICogQGxpY2Vuc2VcbiAqIENvcHlyaWdodCAyMDIwIEdvb2dsZSBJbmMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuXG4gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgXCJMaWNlbnNlXCIpO1xuICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLlxuICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0XG4gKlxuICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wXG4gKlxuICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZVxuICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gXCJBUyBJU1wiIEJBU0lTLFxuICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuXG4gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kXG4gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS5cbiAqID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4gKi9cblxuaW1wb3J0IHtTdW0sIFN1bUF0dHJzfSBmcm9tICcuLi9rZXJuZWxfbmFtZXMnO1xuaW1wb3J0IHtHcmFkQ29uZmlnLCBOYW1lZEF0dHJNYXB9IGZyb20gJy4uL2tlcm5lbF9yZWdpc3RyeSc7XG5pbXBvcnQge211bH0gZnJvbSAnLi4vb3BzL211bCc7XG5pbXBvcnQge29uZXN9IGZyb20gJy4uL29wcy9vbmVzJztcbmltcG9ydCB7cmVzaGFwZX0gZnJvbSAnLi4vb3BzL3Jlc2hhcGUnO1xuaW1wb3J0IHtUZW5zb3J9IGZyb20gJy4uL3RlbnNvcic7XG5pbXBvcnQge3BhcnNlQXhpc1BhcmFtfSBmcm9tICcuLi91dGlsJztcblxuZXhwb3J0IGNvbnN0IHN1bUdyYWRDb25maWc6IEdyYWRDb25maWcgPSB7XG4gIGtlcm5lbE5hbWU6IFN1bSxcbiAgaW5wdXRzVG9TYXZlOiBbJ3gnXSxcbiAgZ3JhZEZ1bmM6IChkeTogVGVuc29yLCBzYXZlZDogVGVuc29yW10sIGF0dHJzOiBOYW1lZEF0dHJNYXApID0+IHtcbiAgICBjb25zdCBbeF0gPSBzYXZlZDtcbiAgICBjb25zdCBleHBhbmRlZER5U2hhcGUgPSB4LnNoYXBlLnNsaWNlKCk7XG4gICAgY29uc3Qge2F4aXN9ID0gYXR0cnMgYXMge30gYXMgU3VtQXR0cnM7XG5cbiAgICBjb25zdCBheGVzID0gcGFyc2VBeGlzUGFyYW0oYXhpcywgeC5zaGFwZSk7XG4gICAgYXhlcy5mb3JFYWNoKGF4aXMgPT4ge1xuICAgICAgZXhwYW5kZWREeVNoYXBlW2F4aXNdID0gMTtcbiAgICB9KTtcbiAgICBjb25zdCBleHBhbmRlZER5ID0gcmVzaGFwZShkeSwgZXhwYW5kZWREeVNoYXBlKTtcbiAgICBjb25zdCBkZXJYID0gbXVsKGV4cGFuZGVkRHksIG9uZXMoeC5zaGFwZSwgJ2Zsb2F0MzInKSk7XG5cbiAgICByZXR1cm4ge3g6ICgpID0+IGRlclh9O1xuICB9XG59O1xuIl19","/**\n * @license\n * Copyright 2020 Google LLC. All Rights Reserved.\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n * =============================================================================\n */\nimport { Tan } from '../kernel_names';\nimport { cos } from '../ops/cos';\nimport { div } from '../ops/div';\nimport { square } from '../ops/square';\nexport const tanGradConfig = {\n kernelName: Tan,\n inputsToSave: ['x'],\n gradFunc: (dy, saved) => {\n const [x] = saved;\n return { x: () => div(dy, square(cos(x))) };\n }\n};\n//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiVGFuX2dyYWQuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi8uLi90ZmpzLWNvcmUvc3JjL2dyYWRpZW50cy9UYW5fZ3JhZC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQTs7Ozs7Ozs7Ozs7Ozs7O0dBZUc7QUFFSCxPQUFPLEVBQUMsR0FBRyxFQUFDLE1BQU0saUJBQWlCLENBQUM7QUFFcEMsT0FBTyxFQUFDLEdBQUcsRUFBQyxNQUFNLFlBQVksQ0FBQztBQUMvQixPQUFPLEVBQUMsR0FBRyxFQUFDLE1BQU0sWUFBWSxDQUFDO0FBQy9CLE9BQU8sRUFBQyxNQUFNLEVBQUMsTUFBTSxlQUFlLENBQUM7QUFHckMsTUFBTSxDQUFDLE1BQU0sYUFBYSxHQUFlO0lBQ3ZDLFVBQVUsRUFBRSxHQUFHO0lBQ2YsWUFBWSxFQUFFLENBQUMsR0FBRyxDQUFDO0lBQ25CLFFBQVEsRUFBRSxDQUFDLEVBQVUsRUFBRSxLQUFlLEVBQUUsRUFBRTtRQUN4QyxNQUFNLENBQUMsQ0FBQyxDQUFDLEdBQUcsS0FBSyxDQUFDO1FBRWxCLE9BQU8sRUFBQyxDQUFDLEVBQUUsR0FBRyxFQUFFLENBQUMsR0FBRyxDQUFDLEVBQUUsRUFBRSxNQUFNLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsRUFBQyxDQUFDO0lBQzVDLENBQUM7Q0FDRixDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiLyoqXG4gKiBAbGljZW5zZVxuICogQ29weXJpZ2h0IDIwMjAgR29vZ2xlIExMQy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC5cbiAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSBcIkxpY2Vuc2VcIik7XG4gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuXG4gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXRcbiAqXG4gKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjBcbiAqXG4gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlXG4gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiBcIkFTIElTXCIgQkFTSVMsXG4gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC5cbiAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmRcbiAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLlxuICogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbiAqL1xuXG5pbXBvcnQge1Rhbn0gZnJvbSAnLi4va2VybmVsX25hbWVzJztcbmltcG9ydCB7R3JhZENvbmZpZ30gZnJvbSAnLi4va2VybmVsX3JlZ2lzdHJ5JztcbmltcG9ydCB7Y29zfSBmcm9tICcuLi9vcHMvY29zJztcbmltcG9ydCB7ZGl2fSBmcm9tICcuLi9vcHMvZGl2JztcbmltcG9ydCB7c3F1YXJlfSBmcm9tICcuLi9vcHMvc3F1YXJlJztcbmltcG9ydCB7VGVuc29yfSBmcm9tICcuLi90ZW5zb3InO1xuXG5leHBvcnQgY29uc3QgdGFuR3JhZENvbmZpZzogR3JhZENvbmZpZyA9IHtcbiAga2VybmVsTmFtZTogVGFuLFxuICBpbnB1dHNUb1NhdmU6IFsneCddLFxuICBncmFkRnVuYzogKGR5OiBUZW5zb3IsIHNhdmVkOiBUZW5zb3JbXSkgPT4ge1xuICAgIGNvbnN0IFt4XSA9IHNhdmVkO1xuXG4gICAgcmV0dXJuIHt4OiAoKSA9PiBkaXYoZHksIHNxdWFyZShjb3MoeCkpKX07XG4gIH1cbn07XG4iXX0=","/**\n * @license\n * Copyright 2020 Google LLC. All Rights Reserved.\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n * =============================================================================\n */\nimport { Tanh } from '../kernel_names';\nimport { mul } from '../ops/mul';\nimport { scalar } from '../ops/scalar';\nimport { square } from '../ops/square';\nimport { sub } from '../ops/sub';\nexport const tanhGradConfig = {\n kernelName: Tanh,\n outputsToSave: [true],\n gradFunc: (dy, saved) => {\n const [y] = saved;\n return { x: () => mul(sub(scalar(1), square(y)), dy) };\n }\n};\n//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiVGFuaF9ncmFkLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vLi4vdGZqcy1jb3JlL3NyYy9ncmFkaWVudHMvVGFuaF9ncmFkLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBOzs7Ozs7Ozs7Ozs7Ozs7R0FlRztBQUVILE9BQU8sRUFBQyxJQUFJLEVBQUMsTUFBTSxpQkFBaUIsQ0FBQztBQUVyQyxPQUFPLEVBQUMsR0FBRyxFQUFDLE1BQU0sWUFBWSxDQUFDO0FBQy9CLE9BQU8sRUFBQyxNQUFNLEVBQUMsTUFBTSxlQUFlLENBQUM7QUFDckMsT0FBTyxFQUFDLE1BQU0sRUFBQyxNQUFNLGVBQWUsQ0FBQztBQUNyQyxPQUFPLEVBQUMsR0FBRyxFQUFDLE1BQU0sWUFBWSxDQUFDO0FBRy9CLE1BQU0sQ0FBQyxNQUFNLGNBQWMsR0FBZTtJQUN4QyxVQUFVLEVBQUUsSUFBSTtJQUNoQixhQUFhLEVBQUUsQ0FBQyxJQUFJLENBQUM7SUFDckIsUUFBUSxFQUFFLENBQUMsRUFBVSxFQUFFLEtBQWUsRUFBRSxFQUFFO1FBQ3hDLE1BQU0sQ0FBQyxDQUFDLENBQUMsR0FBRyxLQUFLLENBQUM7UUFFbEIsT0FBTyxFQUFDLENBQUMsRUFBRSxHQUFHLEVBQUUsQ0FBQyxHQUFHLENBQUMsR0FBRyxDQUFDLE1BQU0sQ0FBQyxDQUFDLENBQUMsRUFBRSxNQUFNLENBQUMsQ0FBQyxDQUFDLENBQUMsRUFBRSxFQUFFLENBQUMsRUFBQyxDQUFDO0lBQ3ZELENBQUM7Q0FDRixDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiLyoqXG4gKiBAbGljZW5zZVxuICogQ29weXJpZ2h0IDIwMjAgR29vZ2xlIExMQy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC5cbiAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSBcIkxpY2Vuc2VcIik7XG4gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuXG4gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXRcbiAqXG4gKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjBcbiAqXG4gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlXG4gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiBcIkFTIElTXCIgQkFTSVMsXG4gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC5cbiAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmRcbiAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLlxuICogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbiAqL1xuXG5pbXBvcnQge1Rhbmh9IGZyb20gJy4uL2tlcm5lbF9uYW1lcyc7XG5pbXBvcnQge0dyYWRDb25maWd9IGZyb20gJy4uL2tlcm5lbF9yZWdpc3RyeSc7XG5pbXBvcnQge211bH0gZnJvbSAnLi4vb3BzL211bCc7XG5pbXBvcnQge3NjYWxhcn0gZnJvbSAnLi4vb3BzL3NjYWxhcic7XG5pbXBvcnQge3NxdWFyZX0gZnJvbSAnLi4vb3BzL3NxdWFyZSc7XG5pbXBvcnQge3N1Yn0gZnJvbSAnLi4vb3BzL3N1Yic7XG5pbXBvcnQge1RlbnNvcn0gZnJvbSAnLi4vdGVuc29yJztcblxuZXhwb3J0IGNvbnN0IHRhbmhHcmFkQ29uZmlnOiBHcmFkQ29uZmlnID0ge1xuICBrZXJuZWxOYW1lOiBUYW5oLFxuICBvdXRwdXRzVG9TYXZlOiBbdHJ1ZV0sXG4gIGdyYWRGdW5jOiAoZHk6IFRlbnNvciwgc2F2ZWQ6IFRlbnNvcltdKSA9PiB7XG4gICAgY29uc3QgW3ldID0gc2F2ZWQ7XG5cbiAgICByZXR1cm4ge3g6ICgpID0+IG11bChzdWIoc2NhbGFyKDEpLCBzcXVhcmUoeSkpLCBkeSl9O1xuICB9XG59O1xuIl19","/**\n * @license\n * Copyright 2020 Google LLC. All Rights Reserved.\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n * =============================================================================\n */\nimport { Tile } from '../kernel_names';\nimport { add } from '../ops/add';\nimport { slice } from '../ops/slice';\nimport { zerosLike } from '../ops/zeros_like';\nexport const tileGradConfig = {\n kernelName: Tile,\n inputsToSave: ['x'],\n gradFunc: (dy, saved, attrs) => {\n const [x] = saved;\n const { reps } = attrs;\n const derX = () => {\n let xGrad = zerosLike(x);\n // TODO(cais): Maybe reduce memory footprint by avoiding repeated\n // slicing.\n if (x.rank === 1) {\n for (let i = 0; i < reps[0]; ++i) {\n xGrad = add(xGrad, slice(dy, [i * x.shape[0]], [x.shape[0]]));\n }\n }\n else if (x.rank === 2) {\n for (let i = 0; i < reps[0]; ++i) {\n for (let j = 0; j < reps[1]; ++j) {\n xGrad = add(xGrad, slice(dy, [i * x.shape[0], j * x.shape[1]], [\n x.shape[0], x.shape[1]\n ]));\n }\n }\n }\n else if (x.rank === 3) {\n for (let i = 0; i < reps[0]; ++i) {\n for (let j = 0; j < reps[1]; ++j) {\n for (let k = 0; k < reps[2]; ++k) {\n xGrad =\n add(xGrad, slice(dy, [i * x.shape[0], j * x.shape[1], k * x.shape[2]], [x.shape[0], x.shape[1], x.shape[2]]));\n }\n }\n }\n }\n else if (x.rank === 4) {\n for (let i = 0; i < reps[0]; ++i) {\n for (let j = 0; j < reps[1]; ++j) {\n for (let k = 0; k < reps[2]; ++k) {\n for (let l = 0; l < reps[3]; ++l) {\n xGrad =\n add(xGrad, slice(dy, [\n i * x.shape[0], j * x.shape[1], k * x.shape[2],\n l * x.shape[3]\n ], [x.shape[0], x.shape[1], x.shape[2], x.shape[3]]));\n }\n }\n }\n }\n }\n else {\n throw new Error(`Gradient for tile operation is not implemented for rank-` +\n `${x.rank} tensors yet.`);\n }\n return xGrad;\n };\n return { x: derX };\n },\n};\n//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiVGlsZV9ncmFkLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vLi4vdGZqcy1jb3JlL3NyYy9ncmFkaWVudHMvVGlsZV9ncmFkLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBOzs7Ozs7Ozs7Ozs7Ozs7R0FlRztBQUVILE9BQU8sRUFBQyxJQUFJLEVBQVksTUFBTSxpQkFBaUIsQ0FBQztBQUVoRCxPQUFPLEVBQUMsR0FBRyxFQUFDLE1BQU0sWUFBWSxDQUFDO0FBQy9CLE9BQU8sRUFBQyxLQUFLLEVBQUMsTUFBTSxjQUFjLENBQUM7QUFDbkMsT0FBTyxFQUFDLFNBQVMsRUFBQyxNQUFNLG1CQUFtQixDQUFDO0FBRzVDLE1BQU0sQ0FBQyxNQUFNLGNBQWMsR0FBZTtJQUN4QyxVQUFVLEVBQUUsSUFBSTtJQUNoQixZQUFZLEVBQUUsQ0FBQyxHQUFHLENBQUM7SUFDbkIsUUFBUSxFQUFFLENBQUMsRUFBVSxFQUFFLEtBQWUsRUFBRSxLQUFtQixFQUFFLEVBQUU7UUFDN0QsTUFBTSxDQUFDLENBQUMsQ0FBQyxHQUFHLEtBQUssQ0FBQztRQUNsQixNQUFNLEVBQUMsSUFBSSxFQUFDLEdBQUcsS0FBNkIsQ0FBQztRQUU3QyxNQUFNLElBQUksR0FBRyxHQUFHLEVBQUU7WUFDaEIsSUFBSSxLQUFLLEdBQUcsU0FBUyxDQUFDLENBQUMsQ0FBQyxDQUFDO1lBQ3pCLGlFQUFpRTtZQUNqRSxXQUFXO1lBQ1gsSUFBSSxDQUFDLENBQUMsSUFBSSxLQUFLLENBQUMsRUFBRTtnQkFDaEIsS0FBSyxJQUFJLENBQUMsR0FBRyxDQUFDLEVBQUUsQ0FBQyxHQUFHLElBQUksQ0FBQyxDQUFDLENBQUMsRUFBRSxFQUFFLENBQUMsRUFBRTtvQkFDaEMsS0FBSyxHQUFHLEdBQUcsQ0FBQyxLQUFLLEVBQUUsS0FBSyxDQUFDLEVBQUUsRUFBRSxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDO2lCQUMvRDthQUNGO2lCQUFNLElBQUksQ0FBQyxDQUFDLElBQUksS0FBSyxDQUFDLEVBQUU7Z0JBQ3ZCLEtBQUssSUFBSSxDQUFDLEdBQUcsQ0FBQyxFQUFFLENBQUMsR0FBRyxJQUFJLENBQUMsQ0FBQyxDQUFDLEVBQUUsRUFBRSxDQUFDLEVBQUU7b0JBQ2hDLEtBQUssSUFBSSxDQUFDLEdBQUcsQ0FBQyxFQUFFLENBQUMsR0FBRyxJQUFJLENBQUMsQ0FBQyxDQUFDLEVBQUUsRUFBRSxDQUFDLEVBQUU7d0JBQ2hDLEtBQUssR0FBRyxHQUFHLENBQUMsS0FBSyxFQUFFLEtBQUssQ0FBQyxFQUFFLEVBQUUsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLEdBQUcsQ0FBQyxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUMsQ0FBQyxFQUFFOzRCQUNqRCxDQUFDLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDO3lCQUN2QixDQUFDLENBQUMsQ0FBQztxQkFDakI7aUJBQ0Y7YUFDRjtpQkFBTSxJQUFJLENBQUMsQ0FBQyxJQUFJLEtBQUssQ0FBQyxFQUFFO2dCQUN2QixLQUFLLElBQUksQ0FBQyxHQUFHLENBQUMsRUFBRSxDQUFDLEdBQUcsSUFBSSxDQUFDLENBQUMsQ0FBQyxFQUFFLEVBQUUsQ0FBQyxFQUFFO29CQUNoQyxLQUFLLElBQUksQ0FBQyxHQUFHLENBQUMsRUFBRSxDQUFDLEdBQUcsSUFBSSxDQUFDLENBQUMsQ0FBQyxFQUFFLEVBQUUsQ0FBQyxFQUFFO3dCQUNoQyxLQUFLLElBQUksQ0FBQyxHQUFHLENBQUMsRUFBRSxDQUFDLEdBQUcsSUFBSSxDQUFDLENBQUMsQ0FBQyxFQUFFLEVBQUUsQ0FBQyxFQUFFOzRCQUNoQyxLQUFLO2dDQUNELEdBQUcsQ0FBQyxLQUFLLEVBQ0wsS0FBSyxDQUNELEVBQUUsRUFBRSxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsR0FBRyxDQUFDLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsR0FBRyxDQUFDLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQyxDQUFDLEVBQ3BELENBQUMsQ0FBQyxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUM7eUJBQ3BEO3FCQUNGO2lCQUNGO2FBQ0Y7aUJBQU0sSUFBSSxDQUFDLENBQUMsSUFBSSxLQUFLLENBQUMsRUFBRTtnQkFDdkIsS0FBSyxJQUFJLENBQUMsR0FBRyxDQUFDLEVBQUUsQ0FBQyxHQUFHLElBQUksQ0FBQyxDQUFDLENBQUMsRUFBRSxFQUFFLENBQUMsRUFBRTtvQkFDaEMsS0FBSyxJQUFJLENBQUMsR0FBRyxDQUFDLEVBQUUsQ0FBQyxHQUFHLElBQUksQ0FBQyxDQUFDLENBQUMsRUFBRSxFQUFFLENBQUMsRUFBRTt3QkFDaEMsS0FBSyxJQUFJLENBQUMsR0FBRyxDQUFDLEVBQUUsQ0FBQyxHQUFHLElBQUksQ0FBQyxDQUFDLENBQUMsRUFBRSxFQUFFLENBQUMsRUFBRTs0QkFDaEMsS0FBSyxJQUFJLENBQUMsR0FBRyxDQUFDLEVBQUUsQ0FBQyxHQUFHLElBQUksQ0FBQyxDQUFDLENBQUMsRUFBRSxFQUFFLENBQUMsRUFBRTtnQ0FDaEMsS0FBSztvQ0FDRCxHQUFHLENBQUMsS0FBSyxFQUNMLEtBQUssQ0FDRCxFQUFFLEVBQ0Y7d0NBQ0UsQ0FBQyxHQUFHLENBQUMsQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxHQUFHLENBQUMsQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxHQUFHLENBQUMsQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDO3dDQUM5QyxDQUFDLEdBQUcsQ0FBQyxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUM7cUNBQ2YsRUFDRCxDQUFDLENBQUMsQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUM7NkJBQ2hFO3lCQUNGO3FCQUNGO2lCQUNGO2FBQ0Y7aUJBQU07Z0JBQ0wsTUFBTSxJQUFJLEtBQUssQ0FDWCwwREFBMEQ7b0JBQzFELEdBQUcsQ0FBQyxDQUFDLElBQUksZUFBZSxDQUFDLENBQUM7YUFDL0I7WUFDRCxPQUFPLEtBQUssQ0FBQztRQUNmLENBQUMsQ0FBQztRQUNGLE9BQU8sRUFBQyxDQUFDLEVBQUUsSUFBSSxFQUFDLENBQUM7SUFDbkIsQ0FBQztDQUNGLENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyIvKipcbiAqIEBsaWNlbnNlXG4gKiBDb3B5cmlnaHQgMjAyMCBHb29nbGUgTExDLiBBbGwgUmlnaHRzIFJlc2VydmVkLlxuICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlIFwiTGljZW5zZVwiKTtcbiAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS5cbiAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdFxuICpcbiAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMFxuICpcbiAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmVcbiAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuIFwiQVMgSVNcIiBCQVNJUyxcbiAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLlxuICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZFxuICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuXG4gKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuICovXG5cbmltcG9ydCB7VGlsZSwgVGlsZUF0dHJzfSBmcm9tICcuLi9rZXJuZWxfbmFtZXMnO1xuaW1wb3J0IHtHcmFkQ29uZmlnLCBOYW1lZEF0dHJNYXB9IGZyb20gJy4uL2tlcm5lbF9yZWdpc3RyeSc7XG5pbXBvcnQge2FkZH0gZnJvbSAnLi4vb3BzL2FkZCc7XG5pbXBvcnQge3NsaWNlfSBmcm9tICcuLi9vcHMvc2xpY2UnO1xuaW1wb3J0IHt6ZXJvc0xpa2V9IGZyb20gJy4uL29wcy96ZXJvc19saWtlJztcbmltcG9ydCB7VGVuc29yfSBmcm9tICcuLi90ZW5zb3InO1xuXG5leHBvcnQgY29uc3QgdGlsZUdyYWRDb25maWc6IEdyYWRDb25maWcgPSB7XG4gIGtlcm5lbE5hbWU6IFRpbGUsXG4gIGlucHV0c1RvU2F2ZTogWyd4J10sXG4gIGdyYWRGdW5jOiAoZHk6IFRlbnNvciwgc2F2ZWQ6IFRlbnNvcltdLCBhdHRyczogTmFtZWRBdHRyTWFwKSA9PiB7XG4gICAgY29uc3QgW3hdID0gc2F2ZWQ7XG4gICAgY29uc3Qge3JlcHN9ID0gYXR0cnMgYXMgdW5rbm93biBhcyBUaWxlQXR0cnM7XG5cbiAgICBjb25zdCBkZXJYID0gKCkgPT4ge1xuICAgICAgbGV0IHhHcmFkID0gemVyb3NMaWtlKHgpO1xuICAgICAgLy8gVE9ETyhjYWlzKTogTWF5YmUgcmVkdWNlIG1lbW9yeSBmb290cHJpbnQgYnkgYXZvaWRpbmcgcmVwZWF0ZWRcbiAgICAgIC8vIHNsaWNpbmcuXG4gICAgICBpZiAoeC5yYW5rID09PSAxKSB7XG4gICAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgcmVwc1swXTsgKytpKSB7XG4gICAgICAgICAgeEdyYWQgPSBhZGQoeEdyYWQsIHNsaWNlKGR5LCBbaSAqIHguc2hhcGVbMF1dLCBbeC5zaGFwZVswXV0pKTtcbiAgICAgICAgfVxuICAgICAgfSBlbHNlIGlmICh4LnJhbmsgPT09IDIpIHtcbiAgICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCByZXBzWzBdOyArK2kpIHtcbiAgICAgICAgICBmb3IgKGxldCBqID0gMDsgaiA8IHJlcHNbMV07ICsraikge1xuICAgICAgICAgICAgeEdyYWQgPSBhZGQoeEdyYWQsIHNsaWNlKGR5LCBbaSAqIHguc2hhcGVbMF0sIGogKiB4LnNoYXBlWzFdXSwgW1xuICAgICAgICAgICAgICAgICAgICAgICAgICB4LnNoYXBlWzBdLCB4LnNoYXBlWzFdXG4gICAgICAgICAgICAgICAgICAgICAgICBdKSk7XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICB9IGVsc2UgaWYgKHgucmFuayA9PT0gMykge1xuICAgICAgICBmb3IgKGxldCBpID0gMDsgaSA8IHJlcHNbMF07ICsraSkge1xuICAgICAgICAgIGZvciAobGV0IGogPSAwOyBqIDwgcmVwc1sxXTsgKytqKSB7XG4gICAgICAgICAgICBmb3IgKGxldCBrID0gMDsgayA8IHJlcHNbMl07ICsraykge1xuICAgICAgICAgICAgICB4R3JhZCA9XG4gICAgICAgICAgICAgICAgICBhZGQoeEdyYWQsXG4gICAgICAgICAgICAgICAgICAgICAgc2xpY2UoXG4gICAgICAgICAgICAgICAgICAgICAgICAgIGR5LCBbaSAqIHguc2hhcGVbMF0sIGogKiB4LnNoYXBlWzFdLCBrICogeC5zaGFwZVsyXV0sXG4gICAgICAgICAgICAgICAgICAgICAgICAgIFt4LnNoYXBlWzBdLCB4LnNoYXBlWzFdLCB4LnNoYXBlWzJdXSkpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgfSBlbHNlIGlmICh4LnJhbmsgPT09IDQpIHtcbiAgICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCByZXBzWzBdOyArK2kpIHtcbiAgICAgICAgICBmb3IgKGxldCBqID0gMDsgaiA8IHJlcHNbMV07ICsraikge1xuICAgICAgICAgICAgZm9yIChsZXQgayA9IDA7IGsgPCByZXBzWzJdOyArK2spIHtcbiAgICAgICAgICAgICAgZm9yIChsZXQgbCA9IDA7IGwgPCByZXBzWzNdOyArK2wpIHtcbiAgICAgICAgICAgICAgICB4R3JhZCA9XG4gICAgICAgICAgICAgICAgICAgIGFkZCh4R3JhZCxcbiAgICAgICAgICAgICAgICAgICAgICAgIHNsaWNlKFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGR5LFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIFtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGkgKiB4LnNoYXBlWzBdLCBqICogeC5zaGFwZVsxXSwgayAqIHguc2hhcGVbMl0sXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsICogeC5zaGFwZVszXVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIF0sXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgW3guc2hhcGVbMF0sIHguc2hhcGVbMV0sIHguc2hhcGVbMl0sIHguc2hhcGVbM11dKSk7XG4gICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHRocm93IG5ldyBFcnJvcihcbiAgICAgICAgICAgIGBHcmFkaWVudCBmb3IgdGlsZSBvcGVyYXRpb24gaXMgbm90IGltcGxlbWVudGVkIGZvciByYW5rLWAgK1xuICAgICAgICAgICAgYCR7eC5yYW5rfSB0ZW5zb3JzIHlldC5gKTtcbiAgICAgIH1cbiAgICAgIHJldHVybiB4R3JhZDtcbiAgICB9O1xuICAgIHJldHVybiB7eDogZGVyWH07XG4gIH0sXG59O1xuIl19","/**\n * @license\n * Copyright 2020 Google LLC. All Rights Reserved.\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n * =============================================================================\n */\nimport { Transpose } from '../kernel_names';\nimport * as axis_util from '../ops/axis_util';\nimport { transpose } from '../ops/transpose';\nexport const transposeGradConfig = {\n kernelName: Transpose,\n gradFunc: (dy, saved, attrs) => {\n const transposeAttrs = attrs;\n const { perm } = transposeAttrs;\n const undoPerm = axis_util.getUndoAxesPermutation(perm);\n return { x: () => transpose(dy, undoPerm) };\n }\n};\n//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiVHJhbnNwb3NlX2dyYWQuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi8uLi90ZmpzLWNvcmUvc3JjL2dyYWRpZW50cy9UcmFuc3Bvc2VfZ3JhZC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQTs7Ozs7Ozs7Ozs7Ozs7O0dBZUc7QUFFSCxPQUFPLEVBQUMsU0FBUyxFQUFpQixNQUFNLGlCQUFpQixDQUFDO0FBRTFELE9BQU8sS0FBSyxTQUFTLE1BQU0sa0JBQWtCLENBQUM7QUFDOUMsT0FBTyxFQUFDLFNBQVMsRUFBQyxNQUFNLGtCQUFrQixDQUFDO0FBRzNDLE1BQU0sQ0FBQyxNQUFNLG1CQUFtQixHQUFlO0lBQzdDLFVBQVUsRUFBRSxTQUFTO0lBQ3JCLFFBQVEsRUFBRSxDQUFDLEVBQVUsRUFBRSxLQUFlLEVBQUUsS0FBbUIsRUFBRSxFQUFFO1FBQzdELE1BQU0sY0FBYyxHQUFtQixLQUE2QixDQUFDO1FBQ3JFLE1BQU0sRUFBQyxJQUFJLEVBQUMsR0FBRyxjQUFjLENBQUM7UUFDOUIsTUFBTSxRQUFRLEdBQUcsU0FBUyxDQUFDLHNCQUFzQixDQUFDLElBQUksQ0FBQyxDQUFDO1FBQ3hELE9BQU8sRUFBQyxDQUFDLEVBQUUsR0FBRyxFQUFFLENBQUMsU0FBUyxDQUFDLEVBQUUsRUFBRSxRQUFRLENBQUMsRUFBQyxDQUFDO0lBQzVDLENBQUM7Q0FDRixDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiLyoqXG4gKiBAbGljZW5zZVxuICogQ29weXJpZ2h0IDIwMjAgR29vZ2xlIExMQy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC5cbiAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSBcIkxpY2Vuc2VcIik7XG4gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuXG4gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXRcbiAqXG4gKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjBcbiAqXG4gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlXG4gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiBcIkFTIElTXCIgQkFTSVMsXG4gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC5cbiAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmRcbiAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLlxuICogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbiAqL1xuXG5pbXBvcnQge1RyYW5zcG9zZSwgVHJhbnNwb3NlQXR0cnN9IGZyb20gJy4uL2tlcm5lbF9uYW1lcyc7XG5pbXBvcnQge0dyYWRDb25maWcsIE5hbWVkQXR0ck1hcH0gZnJvbSAnLi4va2VybmVsX3JlZ2lzdHJ5JztcbmltcG9ydCAqIGFzIGF4aXNfdXRpbCBmcm9tICcuLi9vcHMvYXhpc191dGlsJztcbmltcG9ydCB7dHJhbnNwb3NlfSBmcm9tICcuLi9vcHMvdHJhbnNwb3NlJztcbmltcG9ydCB7VGVuc29yfSBmcm9tICcuLi90ZW5zb3InO1xuXG5leHBvcnQgY29uc3QgdHJhbnNwb3NlR3JhZENvbmZpZzogR3JhZENvbmZpZyA9IHtcbiAga2VybmVsTmFtZTogVHJhbnNwb3NlLFxuICBncmFkRnVuYzogKGR5OiBUZW5zb3IsIHNhdmVkOiBUZW5zb3JbXSwgYXR0cnM6IE5hbWVkQXR0ck1hcCkgPT4ge1xuICAgIGNvbnN0IHRyYW5zcG9zZUF0dHJzOiBUcmFuc3Bvc2VBdHRycyA9IGF0dHJzIGFzIHt9IGFzIFRyYW5zcG9zZUF0dHJzO1xuICAgIGNvbnN0IHtwZXJtfSA9IHRyYW5zcG9zZUF0dHJzO1xuICAgIGNvbnN0IHVuZG9QZXJtID0gYXhpc191dGlsLmdldFVuZG9BeGVzUGVybXV0YXRpb24ocGVybSk7XG4gICAgcmV0dXJuIHt4OiAoKSA9PiB0cmFuc3Bvc2UoZHksIHVuZG9QZXJtKX07XG4gIH1cbn07XG4iXX0=","/**\n * @license\n * Copyright 2020 Google Inc. All Rights Reserved.\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n * =============================================================================\n */\nimport { Unpack } from '../kernel_names';\nimport { stack } from '../ops/stack';\nexport const unpackGradConfig = {\n kernelName: Unpack,\n gradFunc: (dy, saved, attrs) => {\n const unpackAttrs = attrs;\n const { axis } = unpackAttrs;\n return { value: () => stack(dy, axis) };\n }\n};\n//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiVW5wYWNrX2dyYWQuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi8uLi90ZmpzLWNvcmUvc3JjL2dyYWRpZW50cy9VbnBhY2tfZ3JhZC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQTs7Ozs7Ozs7Ozs7Ozs7O0dBZUc7QUFDSCxPQUFPLEVBQUMsTUFBTSxFQUFjLE1BQU0saUJBQWlCLENBQUM7QUFFcEQsT0FBTyxFQUFDLEtBQUssRUFBQyxNQUFNLGNBQWMsQ0FBQztBQUduQyxNQUFNLENBQUMsTUFBTSxnQkFBZ0IsR0FBZTtJQUMxQyxVQUFVLEVBQUUsTUFBTTtJQUNsQixRQUFRLEVBQUUsQ0FBQyxFQUFZLEVBQUUsS0FBZSxFQUFFLEtBQW1CLEVBQUUsRUFBRTtRQUMvRCxNQUFNLFdBQVcsR0FBZ0IsS0FBMEIsQ0FBQztRQUM1RCxNQUFNLEVBQUMsSUFBSSxFQUFDLEdBQUcsV0FBVyxDQUFDO1FBQzNCLE9BQU8sRUFBQyxLQUFLLEVBQUUsR0FBRyxFQUFFLENBQUMsS0FBSyxDQUFDLEVBQUUsRUFBRSxJQUFJLENBQUMsRUFBQyxDQUFDO0lBQ3hDLENBQUM7Q0FDRixDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiLyoqXG4gKiBAbGljZW5zZVxuICogQ29weXJpZ2h0IDIwMjAgR29vZ2xlIEluYy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC5cbiAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSBcIkxpY2Vuc2VcIik7XG4gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuXG4gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXRcbiAqXG4gKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjBcbiAqXG4gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlXG4gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiBcIkFTIElTXCIgQkFTSVMsXG4gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC5cbiAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmRcbiAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLlxuICogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbiAqL1xuaW1wb3J0IHtVbnBhY2ssIFVucGFja0F0dHJzfSBmcm9tICcuLi9rZXJuZWxfbmFtZXMnO1xuaW1wb3J0IHtHcmFkQ29uZmlnLCBOYW1lZEF0dHJNYXB9IGZyb20gJy4uL2tlcm5lbF9yZWdpc3RyeSc7XG5pbXBvcnQge3N0YWNrfSBmcm9tICcuLi9vcHMvc3RhY2snO1xuaW1wb3J0IHtUZW5zb3J9IGZyb20gJy4uL3RlbnNvcic7XG5cbmV4cG9ydCBjb25zdCB1bnBhY2tHcmFkQ29uZmlnOiBHcmFkQ29uZmlnID0ge1xuICBrZXJuZWxOYW1lOiBVbnBhY2ssXG4gIGdyYWRGdW5jOiAoZHk6IFRlbnNvcltdLCBzYXZlZDogVGVuc29yW10sIGF0dHJzOiBOYW1lZEF0dHJNYXApID0+IHtcbiAgICBjb25zdCB1bnBhY2tBdHRyczogVW5wYWNrQXR0cnMgPSBhdHRycyBhcyB7fSBhcyBVbnBhY2tBdHRycztcbiAgICBjb25zdCB7YXhpc30gPSB1bnBhY2tBdHRycztcbiAgICByZXR1cm4ge3ZhbHVlOiAoKSA9PiBzdGFjayhkeSwgYXhpcyl9O1xuICB9XG59O1xuIl19","/**\n * @license\n * Copyright 2020 Google LLC. All Rights Reserved.\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n * =============================================================================\n */\nimport { UnsortedSegmentSum } from '../kernel_names';\nimport { expandDims } from '../ops/expand_dims';\nimport { gather } from '../ops/gather';\nimport { greaterEqual } from '../ops/greater_equal';\nimport { logicalAnd } from '../ops/logical_and';\nimport { maximum } from '../ops/maximum';\nimport { ones } from '../ops/ones';\nimport { scalar } from '../ops/scalar';\nimport { where } from '../ops/where';\nimport { zerosLike } from '../ops/zeros_like';\nexport const unsortedSegmentSumGradConfig = {\n kernelName: UnsortedSegmentSum,\n inputsToSave: ['segmentIds'],\n gradFunc: (dy, saved) => {\n const [segmentIds] = saved;\n const derX = () => {\n return gatherDropNegatives(dy, segmentIds);\n };\n return { x: derX };\n }\n};\nfunction gatherDropNegatives(x, indices) {\n // Helper function for unsorted segment ops. Gathers params for\n // positive segment ids and gathers 0 for inputs with negative segment id.\n // Mirrors _GatherDropNegatives from tensorflow/python/ops/math_grad.py\n const zeroClippedIndices = maximum(indices, zerosLike(indices));\n const gathered = gather(x, zeroClippedIndices);\n let isPositive = greaterEqual(indices, scalar(0, 'int32'));\n const numIters = gathered.rank - isPositive.rank;\n for (let i = 0; i < numIters; ++i) {\n isPositive = expandDims(isPositive, i + 1);\n }\n isPositive = logicalAnd(isPositive, ones(gathered.shape, 'bool'));\n const zeroSlice = zerosLike(gathered);\n return where(isPositive, gathered, zeroSlice);\n}\n//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiVW5zb3J0ZWRTZWdtZW50U3VtX2dyYWQuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi8uLi90ZmpzLWNvcmUvc3JjL2dyYWRpZW50cy9VbnNvcnRlZFNlZ21lbnRTdW1fZ3JhZC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQTs7Ozs7Ozs7Ozs7Ozs7O0dBZUc7QUFFSCxPQUFPLEVBQUMsa0JBQWtCLEVBQUMsTUFBTSxpQkFBaUIsQ0FBQztBQUVuRCxPQUFPLEVBQUMsVUFBVSxFQUFDLE1BQU0sb0JBQW9CLENBQUM7QUFDOUMsT0FBTyxFQUFDLE1BQU0sRUFBQyxNQUFNLGVBQWUsQ0FBQztBQUNyQyxPQUFPLEVBQUMsWUFBWSxFQUFDLE1BQU0sc0JBQXNCLENBQUM7QUFDbEQsT0FBTyxFQUFDLFVBQVUsRUFBQyxNQUFNLG9CQUFvQixDQUFDO0FBQzlDLE9BQU8sRUFBQyxPQUFPLEVBQUMsTUFBTSxnQkFBZ0IsQ0FBQztBQUN2QyxPQUFPLEVBQUMsSUFBSSxFQUFDLE1BQU0sYUFBYSxDQUFDO0FBQ2pDLE9BQU8sRUFBQyxNQUFNLEVBQUMsTUFBTSxlQUFlLENBQUM7QUFDckMsT0FBTyxFQUFDLEtBQUssRUFBQyxNQUFNLGNBQWMsQ0FBQztBQUNuQyxPQUFPLEVBQUMsU0FBUyxFQUFDLE1BQU0sbUJBQW1CLENBQUM7QUFHNUMsTUFBTSxDQUFDLE1BQU0sNEJBQTRCLEdBQWU7SUFDdEQsVUFBVSxFQUFFLGtCQUFrQjtJQUM5QixZQUFZLEVBQUUsQ0FBQyxZQUFZLENBQUM7SUFDNUIsUUFBUSxFQUFFLENBQUMsRUFBVSxFQUFFLEtBQWUsRUFBRSxFQUFFO1FBQ3hDLE1BQU0sQ0FBQyxVQUFVLENBQUMsR0FBRyxLQUFLLENBQUM7UUFFM0IsTUFBTSxJQUFJLEdBQUcsR0FBRyxFQUFFO1lBQ2hCLE9BQU8sbUJBQW1CLENBQUMsRUFBRSxFQUFFLFVBQXNCLENBQUMsQ0FBQztRQUN6RCxDQUFDLENBQUM7UUFDRixPQUFPLEVBQUMsQ0FBQyxFQUFFLElBQUksRUFBQyxDQUFDO0lBQ25CLENBQUM7Q0FDRixDQUFDO0FBRUYsU0FBUyxtQkFBbUIsQ0FBbUIsQ0FBSSxFQUFFLE9BQWlCO0lBQ3BFLCtEQUErRDtJQUMvRCwwRUFBMEU7SUFDMUUsdUVBQXVFO0lBQ3ZFLE1BQU0sa0JBQWtCLEdBQUcsT0FBTyxDQUFDLE9BQU8sRUFBRSxTQUFTLENBQUMsT0FBTyxDQUFDLENBQUMsQ0FBQztJQUNoRSxNQUFNLFFBQVEsR0FBRyxNQUFNLENBQUMsQ0FBQyxFQUFFLGtCQUE4QixDQUFDLENBQUM7SUFDM0QsSUFBSSxVQUFVLEdBQUcsWUFBWSxDQUFDLE9BQU8sRUFBRSxNQUFNLENBQUMsQ0FBQyxFQUFFLE9BQU8sQ0FBQyxDQUFDLENBQUM7SUFDM0QsTUFBTSxRQUFRLEdBQUcsUUFBUSxDQUFDLElBQUksR0FBRyxVQUFVLENBQUMsSUFBSSxDQUFDO0lBQ2pELEtBQUssSUFBSSxDQUFDLEdBQUcsQ0FBQyxFQUFFLENBQUMsR0FBRyxRQUFRLEVBQUUsRUFBRSxDQUFDLEVBQUU7UUFDakMsVUFBVSxHQUFHLFVBQVUsQ0FBQyxVQUFVLEVBQUUsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDO0tBQzVDO0lBQ0QsVUFBVSxHQUFHLFVBQVUsQ0FBQyxVQUFVLEVBQUUsSUFBSSxDQUFDLFFBQVEsQ0FBQyxLQUFLLEVBQUUsTUFBTSxDQUFDLENBQUMsQ0FBQztJQUNsRSxNQUFNLFNBQVMsR0FBRyxTQUFTLENBQUMsUUFBUSxDQUFDLENBQUM7SUFDdEMsT0FBTyxLQUFLLENBQUMsVUFBVSxFQUFFLFFBQVEsRUFBRSxTQUFTLENBQUMsQ0FBQztBQUNoRCxDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiLyoqXG4gKiBAbGljZW5zZVxuICogQ29weXJpZ2h0IDIwMjAgR29vZ2xlIExMQy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC5cbiAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSBcIkxpY2Vuc2VcIik7XG4gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuXG4gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXRcbiAqXG4gKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjBcbiAqXG4gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlXG4gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiBcIkFTIElTXCIgQkFTSVMsXG4gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC5cbiAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmRcbiAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLlxuICogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbiAqL1xuXG5pbXBvcnQge1Vuc29ydGVkU2VnbWVudFN1bX0gZnJvbSAnLi4va2VybmVsX25hbWVzJztcbmltcG9ydCB7R3JhZENvbmZpZ30gZnJvbSAnLi4va2VybmVsX3JlZ2lzdHJ5JztcbmltcG9ydCB7ZXhwYW5kRGltc30gZnJvbSAnLi4vb3BzL2V4cGFuZF9kaW1zJztcbmltcG9ydCB7Z2F0aGVyfSBmcm9tICcuLi9vcHMvZ2F0aGVyJztcbmltcG9ydCB7Z3JlYXRlckVxdWFsfSBmcm9tICcuLi9vcHMvZ3JlYXRlcl9lcXVhbCc7XG5pbXBvcnQge2xvZ2ljYWxBbmR9IGZyb20gJy4uL29wcy9sb2dpY2FsX2FuZCc7XG5pbXBvcnQge21heGltdW19IGZyb20gJy4uL29wcy9tYXhpbXVtJztcbmltcG9ydCB7b25lc30gZnJvbSAnLi4vb3BzL29uZXMnO1xuaW1wb3J0IHtzY2FsYXJ9IGZyb20gJy4uL29wcy9zY2FsYXInO1xuaW1wb3J0IHt3aGVyZX0gZnJvbSAnLi4vb3BzL3doZXJlJztcbmltcG9ydCB7emVyb3NMaWtlfSBmcm9tICcuLi9vcHMvemVyb3NfbGlrZSc7XG5pbXBvcnQge1RlbnNvciwgVGVuc29yMUR9IGZyb20gJy4uL3RlbnNvcic7XG5cbmV4cG9ydCBjb25zdCB1bnNvcnRlZFNlZ21lbnRTdW1HcmFkQ29uZmlnOiBHcmFkQ29uZmlnID0ge1xuICBrZXJuZWxOYW1lOiBVbnNvcnRlZFNlZ21lbnRTdW0sXG4gIGlucHV0c1RvU2F2ZTogWydzZWdtZW50SWRzJ10sXG4gIGdyYWRGdW5jOiAoZHk6IFRlbnNvciwgc2F2ZWQ6IFRlbnNvcltdKSA9PiB7XG4gICAgY29uc3QgW3NlZ21lbnRJZHNdID0gc2F2ZWQ7XG5cbiAgICBjb25zdCBkZXJYID0gKCkgPT4ge1xuICAgICAgcmV0dXJuIGdhdGhlckRyb3BOZWdhdGl2ZXMoZHksIHNlZ21lbnRJZHMgYXMgVGVuc29yMUQpO1xuICAgIH07XG4gICAgcmV0dXJuIHt4OiBkZXJYfTtcbiAgfVxufTtcblxuZnVuY3Rpb24gZ2F0aGVyRHJvcE5lZ2F0aXZlczxUIGV4dGVuZHMgVGVuc29yPih4OiBULCBpbmRpY2VzOiBUZW5zb3IxRCkge1xuICAvLyBIZWxwZXIgZnVuY3Rpb24gZm9yIHVuc29ydGVkIHNlZ21lbnQgb3BzLiBHYXRoZXJzIHBhcmFtcyBmb3JcbiAgLy8gcG9zaXRpdmUgc2VnbWVudCBpZHMgYW5kIGdhdGhlcnMgMCBmb3IgaW5wdXRzIHdpdGggbmVnYXRpdmUgc2VnbWVudCBpZC5cbiAgLy8gTWlycm9ycyBfR2F0aGVyRHJvcE5lZ2F0aXZlcyBmcm9tIHRlbnNvcmZsb3cvcHl0aG9uL29wcy9tYXRoX2dyYWQucHlcbiAgY29uc3QgemVyb0NsaXBwZWRJbmRpY2VzID0gbWF4aW11bShpbmRpY2VzLCB6ZXJvc0xpa2UoaW5kaWNlcykpO1xuICBjb25zdCBnYXRoZXJlZCA9IGdhdGhlcih4LCB6ZXJvQ2xpcHBlZEluZGljZXMgYXMgVGVuc29yMUQpO1xuICBsZXQgaXNQb3NpdGl2ZSA9IGdyZWF0ZXJFcXVhbChpbmRpY2VzLCBzY2FsYXIoMCwgJ2ludDMyJykpO1xuICBjb25zdCBudW1JdGVycyA9IGdhdGhlcmVkLnJhbmsgLSBpc1Bvc2l0aXZlLnJhbms7XG4gIGZvciAobGV0IGkgPSAwOyBpIDwgbnVtSXRlcnM7ICsraSkge1xuICAgIGlzUG9zaXRpdmUgPSBleHBhbmREaW1zKGlzUG9zaXRpdmUsIGkgKyAxKTtcbiAgfVxuICBpc1Bvc2l0aXZlID0gbG9naWNhbEFuZChpc1Bvc2l0aXZlLCBvbmVzKGdhdGhlcmVkLnNoYXBlLCAnYm9vbCcpKTtcbiAgY29uc3QgemVyb1NsaWNlID0gemVyb3NMaWtlKGdhdGhlcmVkKTtcbiAgcmV0dXJuIHdoZXJlKGlzUG9zaXRpdmUsIGdhdGhlcmVkLCB6ZXJvU2xpY2UpO1xufVxuIl19","/**\n * @license\n * Copyright 2020 Google LLC. All Rights Reserved.\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n * =============================================================================\n */\nimport { ZerosLike } from '../kernel_names';\nimport { zerosLike } from '../ops/zeros_like';\nexport const zerosLikeGradConfig = {\n kernelName: ZerosLike,\n gradFunc: (dy) => {\n return { x: () => zerosLike(dy) };\n }\n};\n//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiWmVyb3NMaWtlX2dyYWQuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi8uLi90ZmpzLWNvcmUvc3JjL2dyYWRpZW50cy9aZXJvc0xpa2VfZ3JhZC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQTs7Ozs7Ozs7Ozs7Ozs7O0dBZUc7QUFFSCxPQUFPLEVBQUMsU0FBUyxFQUFDLE1BQU0saUJBQWlCLENBQUM7QUFFMUMsT0FBTyxFQUFDLFNBQVMsRUFBQyxNQUFNLG1CQUFtQixDQUFDO0FBRzVDLE1BQU0sQ0FBQyxNQUFNLG1CQUFtQixHQUFlO0lBQzdDLFVBQVUsRUFBRSxTQUFTO0lBQ3JCLFFBQVEsRUFBRSxDQUFDLEVBQVUsRUFBRSxFQUFFO1FBQ3ZCLE9BQU8sRUFBQyxDQUFDLEVBQUUsR0FBRyxFQUFFLENBQUMsU0FBUyxDQUFDLEVBQUUsQ0FBQyxFQUFDLENBQUM7SUFDbEMsQ0FBQztDQUNGLENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyIvKipcbiAqIEBsaWNlbnNlXG4gKiBDb3B5cmlnaHQgMjAyMCBHb29nbGUgTExDLiBBbGwgUmlnaHRzIFJlc2VydmVkLlxuICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlIFwiTGljZW5zZVwiKTtcbiAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS5cbiAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdFxuICpcbiAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMFxuICpcbiAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmVcbiAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuIFwiQVMgSVNcIiBCQVNJUyxcbiAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLlxuICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZFxuICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuXG4gKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuICovXG5cbmltcG9ydCB7WmVyb3NMaWtlfSBmcm9tICcuLi9rZXJuZWxfbmFtZXMnO1xuaW1wb3J0IHtHcmFkQ29uZmlnfSBmcm9tICcuLi9rZXJuZWxfcmVnaXN0cnknO1xuaW1wb3J0IHt6ZXJvc0xpa2V9IGZyb20gJy4uL29wcy96ZXJvc19saWtlJztcbmltcG9ydCB7VGVuc29yfSBmcm9tICcuLi90ZW5zb3InO1xuXG5leHBvcnQgY29uc3QgemVyb3NMaWtlR3JhZENvbmZpZzogR3JhZENvbmZpZyA9IHtcbiAga2VybmVsTmFtZTogWmVyb3NMaWtlLFxuICBncmFkRnVuYzogKGR5OiBUZW5zb3IpID0+IHtcbiAgICByZXR1cm4ge3g6ICgpID0+IHplcm9zTGlrZShkeSl9O1xuICB9XG59O1xuIl19","/**\n * @license\n * Copyright 2020 Google LLC. All Rights Reserved.\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n * =============================================================================\n */\nimport { absGradConfig } from './gradients/Abs_grad';\nimport { acosGradConfig } from './gradients/Acos_grad';\nimport { acoshGradConfig } from './gradients/Acosh_grad';\nimport { addGradConfig } from './gradients/Add_grad';\nimport { addNGradConfig } from './gradients/AddN_grad';\nimport { argMaxGradConfig } from './gradients/ArgMax_grad';\nimport { argMinGradConfig } from './gradients/ArgMin_grad';\nimport { asinGradConfig } from './gradients/Asin_grad';\nimport { asinhGradConfig } from './gradients/Asinh_grad';\nimport { atan2GradConfig } from './gradients/Atan2_grad';\nimport { atanGradConfig } from './gradients/Atan_grad';\nimport { atanhGradConfig } from './gradients/Atanh_grad';\nimport { avgPool3DGradConfig } from './gradients/AvgPool3D_grad';\nimport { avgPoolGradConfig } from './gradients/AvgPool_grad';\nimport { batchMatMulGradConfig } from './gradients/BatchMatMul_grad';\nimport { batchToSpaceNDGradConfig } from './gradients/BatchToSpaceND_grad';\nimport { broadcastToGradConfig } from './gradients/BroadcastTo_grad';\nimport { castGradConfig } from './gradients/Cast_grad';\nimport { ceilGradConfig } from './gradients/Ceil_grad';\nimport { clipByValueGradConfig } from './gradients/ClipByValue_grad';\nimport { complexAbsGradConfig } from './gradients/ComplexAbs_grad';\nimport { concatGradConfig } from './gradients/Concat_grad';\nimport { conv2DGradConfig } from './gradients/Conv2D_grad';\nimport { conv2DBackpropInputGradConfig } from './gradients/Conv2DBackpropInput_grad';\nimport { conv3DGradConfig } from './gradients/Conv3D_grad';\nimport { cosGradConfig } from './gradients/Cos_grad';\nimport { coshGradConfig } from './gradients/Cosh_grad';\nimport { cumsumGradConfig } from './gradients/Cumsum_grad';\nimport { depthwiseConv2dNativeGradConfig } from './gradients/DepthwiseConv2dNative_grad';\nimport { dilation2dGradConfig } from './gradients/Dilation2D_grad';\nimport { eluGradConfig } from './gradients/Elu_grad';\nimport { erfGradConfig } from './gradients/Erf_grad';\nimport { expGradConfig } from './gradients/Exp_grad';\nimport { expandDimsGradConfig } from './gradients/ExpandDims_grad';\nimport { expm1GradConfig } from './gradients/Expm1_grad';\nimport { floorGradConfig } from './gradients/Floor_grad';\nimport { floorDivGradConfig } from './gradients/FloorDiv_grad';\nimport { fusedBatchNormGradConfig } from './gradients/FusedBatchNorm_grad';\nimport { gatherGradConfig } from './gradients/GatherV2_grad';\nimport { greaterEqualGradConfig } from './gradients/GreaterEqual_grad';\nimport { identityGradConfig } from './gradients/Identity_grad';\nimport { isFiniteGradConfig } from './gradients/IsFinite_grad';\nimport { isInfGradConfig } from './gradients/IsInf_grad';\nimport { isNanGradConfig } from './gradients/IsNan_grad';\nimport { leakyReluGradConfig } from './gradients/LeakyRelu_grad';\nimport { log1pGradConfig } from './gradients/Log1p_grad';\nimport { logGradConfig } from './gradients/Log_grad';\nimport { logSoftmaxGradConfig } from './gradients/LogSoftmax_grad';\nimport { lrnGradConfig } from './gradients/LRN_grad';\nimport { maxGradConfig } from './gradients/Max_grad';\nimport { maximumGradConfig } from './gradients/Maximum_grad';\nimport { maxPool3DGradConfig } from './gradients/MaxPool3D_grad';\nimport { maxPoolGradConfig } from './gradients/MaxPool_grad';\nimport { meanGradConfig } from './gradients/Mean_grad';\nimport { minGradConfig } from './gradients/Min_grad';\nimport { minimumGradConfig } from './gradients/Minimum_grad';\nimport { mirrorPadGradConfig } from './gradients/MirrorPad_grad';\nimport { modGradConfig } from './gradients/Mod_grad';\nimport { multiplyGradConfig } from './gradients/Multiply_grad';\nimport { negGradConfig } from './gradients/Neg_grad';\nimport { oneHotGradConfig } from './gradients/OneHot_grad';\nimport { onesLikeGradConfig } from './gradients/OnesLike_grad';\nimport { packGradConfig } from './gradients/Pack_grad';\nimport { padV2GradConfig } from './gradients/PadV2_grad';\nimport { powGradConfig } from './gradients/Pow_grad';\nimport { preluGradConfig } from './gradients/Prelu_grad';\nimport { prodGradConfig } from './gradients/Prod_grad';\nimport { divGradConfig } from './gradients/RealDiv_grad';\nimport { reciprocalGradConfig } from './gradients/Reciprocal_grad';\nimport { relu6GradConfig } from './gradients/Relu6_grad';\nimport { reluGradConfig } from './gradients/Relu_grad';\nimport { reshapeGradConfig } from './gradients/Reshape_grad';\nimport { resizeBilinearGradConfig } from './gradients/ResizeBilinear_grad';\nimport { resizeNearestNeighborGradConfig } from './gradients/ResizeNearestNeighbor_grad';\nimport { reverseGradConfig } from './gradients/Reverse_grad';\nimport { roundGradConfig } from './gradients/Round_grad';\nimport { rsqrtGradConfig } from './gradients/Rsqrt_grad';\nimport { selectGradConfig } from './gradients/Select_grad';\nimport { seluGradConfig } from './gradients/Selu_grad';\nimport { sigmoidGradConfig } from './gradients/Sigmoid_grad';\nimport { signGradConfig } from './gradients/Sign_grad';\nimport { sinGradConfig } from './gradients/Sin_grad';\nimport { sinhGradConfig } from './gradients/Sinh_grad';\nimport { sliceGradConfig } from './gradients/Slice_grad';\nimport { softmaxGradConfig } from './gradients/Softmax_grad';\nimport { softplusGradConfig } from './gradients/Softplus_grad';\nimport { spaceToBatchNDGradConfig } from './gradients/SpaceToBatchND_grad';\nimport { splitVGradConfig } from './gradients/SplitV_grad';\nimport { sqrtGradConfig } from './gradients/Sqrt_grad';\nimport { squareGradConfig } from './gradients/Square_grad';\nimport { squaredDifferenceGradConfig } from './gradients/SquaredDifference_grad';\nimport { stepGradConfig } from './gradients/Step_grad';\nimport { subGradConfig } from './gradients/Sub_grad';\nimport { sumGradConfig } from './gradients/Sum_grad';\nimport { tanGradConfig } from './gradients/Tan_grad';\nimport { tanhGradConfig } from './gradients/Tanh_grad';\nimport { tileGradConfig } from './gradients/Tile_grad';\nimport { transposeGradConfig } from './gradients/Transpose_grad';\nimport { unpackGradConfig } from './gradients/Unpack_grad';\nimport { unsortedSegmentSumGradConfig } from './gradients/UnsortedSegmentSum_grad';\nimport { zerosLikeGradConfig } from './gradients/ZerosLike_grad';\nimport { registerGradient } from './kernel_registry';\n// Export all kernel configs here so that the package can auto register them\nconst gradConfigs = [\n absGradConfig,\n acosGradConfig,\n acoshGradConfig,\n addGradConfig,\n addNGradConfig,\n argMaxGradConfig,\n argMinGradConfig,\n asinGradConfig,\n asinhGradConfig,\n atan2GradConfig,\n atanGradConfig,\n atanhGradConfig,\n avgPool3DGradConfig,\n avgPoolGradConfig,\n batchMatMulGradConfig,\n batchToSpaceNDGradConfig,\n broadcastToGradConfig,\n castGradConfig,\n ceilGradConfig,\n clipByValueGradConfig,\n complexAbsGradConfig,\n concatGradConfig,\n conv2DBackpropInputGradConfig,\n conv2DGradConfig,\n conv3DGradConfig,\n cosGradConfig,\n coshGradConfig,\n cumsumGradConfig,\n depthwiseConv2dNativeGradConfig,\n dilation2dGradConfig,\n divGradConfig,\n eluGradConfig,\n erfGradConfig,\n expGradConfig,\n expandDimsGradConfig,\n expm1GradConfig,\n floorDivGradConfig,\n floorGradConfig,\n fusedBatchNormGradConfig,\n gatherGradConfig,\n greaterEqualGradConfig,\n identityGradConfig,\n isFiniteGradConfig,\n isInfGradConfig,\n isNanGradConfig,\n leakyReluGradConfig,\n log1pGradConfig,\n logGradConfig,\n logSoftmaxGradConfig,\n lrnGradConfig,\n maxGradConfig,\n maxGradConfig,\n maximumGradConfig,\n maxPool3DGradConfig,\n maxPoolGradConfig,\n meanGradConfig,\n minGradConfig,\n minimumGradConfig,\n mirrorPadGradConfig,\n modGradConfig,\n multiplyGradConfig,\n negGradConfig,\n oneHotGradConfig,\n onesLikeGradConfig,\n packGradConfig,\n padV2GradConfig,\n padV2GradConfig,\n powGradConfig,\n preluGradConfig,\n prodGradConfig,\n reciprocalGradConfig,\n relu6GradConfig,\n reluGradConfig,\n reshapeGradConfig,\n resizeBilinearGradConfig,\n resizeNearestNeighborGradConfig,\n reverseGradConfig,\n roundGradConfig,\n rsqrtGradConfig,\n selectGradConfig,\n seluGradConfig,\n sigmoidGradConfig,\n signGradConfig,\n sinGradConfig,\n sinhGradConfig,\n sliceGradConfig,\n softmaxGradConfig,\n softplusGradConfig,\n spaceToBatchNDGradConfig,\n spaceToBatchNDGradConfig,\n splitVGradConfig,\n splitVGradConfig,\n sqrtGradConfig,\n squaredDifferenceGradConfig,\n squareGradConfig,\n stepGradConfig,\n subGradConfig,\n sumGradConfig,\n tanGradConfig,\n tanhGradConfig,\n tileGradConfig,\n transposeGradConfig,\n unpackGradConfig,\n unsortedSegmentSumGradConfig,\n zerosLikeGradConfig\n];\nfor (const gradientConfig of gradConfigs) {\n registerGradient(gradientConfig);\n}\n//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicmVnaXN0ZXJfYWxsX2dyYWRpZW50cy5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uL3RmanMtY29yZS9zcmMvcmVnaXN0ZXJfYWxsX2dyYWRpZW50cy50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQTs7Ozs7Ozs7Ozs7Ozs7O0dBZUc7QUFDSCxPQUFPLEVBQUMsYUFBYSxFQUFDLE1BQU0sc0JBQXNCLENBQUM7QUFDbkQsT0FBTyxFQUFDLGNBQWMsRUFBQyxNQUFNLHVCQUF1QixDQUFDO0FBQ3JELE9BQU8sRUFBQyxlQUFlLEVBQUMsTUFBTSx3QkFBd0IsQ0FBQztBQUN2RCxPQUFPLEVBQUMsYUFBYSxFQUFDLE1BQU0sc0JBQXNCLENBQUM7QUFDbkQsT0FBTyxFQUFDLGNBQWMsRUFBQyxNQUFNLHVCQUF1QixDQUFDO0FBQ3JELE9BQU8sRUFBQyxnQkFBZ0IsRUFBQyxNQUFNLHlCQUF5QixDQUFDO0FBQ3pELE9BQU8sRUFBQyxnQkFBZ0IsRUFBQyxNQUFNLHlCQUF5QixDQUFDO0FBQ3pELE9BQU8sRUFBQyxjQUFjLEVBQUMsTUFBTSx1QkFBdUIsQ0FBQztBQUNyRCxPQUFPLEVBQUMsZUFBZSxFQUFDLE1BQU0sd0JBQXdCLENBQUM7QUFDdkQsT0FBTyxFQUFDLGVBQWUsRUFBQyxNQUFNLHdCQUF3QixDQUFDO0FBQ3ZELE9BQU8sRUFBQyxjQUFjLEVBQUMsTUFBTSx1QkFBdUIsQ0FBQztBQUNyRCxPQUFPLEVBQUMsZUFBZSxFQUFDLE1BQU0sd0JBQXdCLENBQUM7QUFDdkQsT0FBTyxFQUFDLG1CQUFtQixFQUFDLE1BQU0sNEJBQTRCLENBQUM7QUFDL0QsT0FBTyxFQUFDLGlCQUFpQixFQUFDLE1BQU0sMEJBQTBCLENBQUM7QUFDM0QsT0FBTyxFQUFDLHFCQUFxQixFQUFDLE1BQU0sOEJBQThCLENBQUM7QUFDbkUsT0FBTyxFQUFDLHdCQUF3QixFQUFDLE1BQU0saUNBQWlDLENBQUM7QUFDekUsT0FBTyxFQUFDLHFCQUFx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QUFrQjtJQUNsQixhQUFhO0lBQ2IsZ0JBQWdCO0lBQ2hCLGtCQUFrQjtJQUNsQixjQUFjO0lBQ2QsZUFBZTtJQUNmLGVBQWU7SUFDZixhQUFhO0lBQ2IsZUFBZTtJQUNmLGNBQWM7SUFDZCxvQkFBb0I7SUFDcEIsZUFBZTtJQUNmLGNBQWM7SUFDZCxpQkFBaUI7SUFDakIsd0JBQXdCO0lBQ3hCLCtCQUErQjtJQUMvQixpQkFBaUI7SUFDakIsZUFBZTtJQUNmLGVBQWU7SUFDZixnQkFBZ0I7SUFDaEIsY0FBYztJQUNkLGlCQUFpQjtJQUNqQixjQUFjO0lBQ2QsYUFBYTtJQUNiLGNBQWM7SUFDZCxlQUFlO0lBQ2YsaUJBQWlCO0lBQ2pCLGtCQUFrQjtJQUNsQix3QkFBd0I7SUFDeEIsd0JBQXdCO0lBQ3hCLGdCQUFnQjtJQUNoQixnQkFBZ0I7SUFDaEIsY0FBYztJQUNkLDJCQUEyQjtJQUMzQixnQkFBZ0I7SUFDaEIsY0FBYztJQUNkLGFBQWE7SUFDYixhQUFhO0lBQ2IsYUFBYTtJQUNiLGNBQWM7SUFDZCxjQUFjO0lBQ2QsbUJBQW1CO0lBQ25CLGdCQUFnQjtJQUNoQiw0QkFBNEI7SUFDNUIsbUJBQW1CO0NBQ3BCLENBQUM7QUFFRixLQUFLLE1BQU0sY0FBYyxJQUFJLFdBQVcsRUFBRTtJQUN4QyxnQkFBZ0IsQ0FBQyxjQUFjLENBQUMsQ0FBQztDQUNsQyIsInNvdXJjZXNDb250ZW50IjpbIi8qKlxuICogQGxpY2Vuc2VcbiAqIENvcHlyaWdodCAyMDIwIEdvb2dsZSBMTEMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuXG4gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgXCJMaWNlbnNlXCIpO1xuICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLlxuICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0XG4gKlxuICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wXG4gKlxuICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZVxuICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gXCJBUyBJU1wiIEJBU0lTLFxuICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuXG4gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kXG4gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS5cbiAqID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4gKi9cbmltcG9ydCB7YWJzR3JhZENvbmZpZ30gZnJvbSAnLi9ncmFkaWVudHMvQWJzX2dyYWQnO1xuaW1wb3J0IHthY29zR3JhZENvbmZpZ30gZnJvbSAnLi9ncmFkaWVudHMvQWNvc19ncmFkJztcbmltcG9ydCB7YWNvc2hHcmFkQ29uZmlnfSBmcm9tICcuL2dyYWRpZW50cy9BY29zaF9ncmFkJztcbmltcG9ydCB7YWRkR3JhZENvbmZpZ30gZnJvbSAnLi9ncmFkaWVudHMvQWRkX2dyYWQnO1xuaW1wb3J0IHthZGROR3JhZENvbmZpZ30gZnJvbSAnLi9ncmFkaWVudHMvQWRkTl9ncmFkJztcbmltcG9ydCB7YXJnTWF4R3JhZENvbmZpZ30gZnJvbSAnLi9ncmFkaWVudHMvQXJnTWF4X2dyYWQnO1xuaW1wb3J0IHthcmdNaW5HcmFkQ29uZmlnfSBmcm9tICcuL2dyYWRpZW50cy9BcmdNaW5fZ3JhZCc7XG5pbXBvcnQge2FzaW5HcmFkQ29uZmlnfSBmcm9tICcuL2dyYWRpZW50cy9Bc2luX2dyYWQnO1xuaW1wb3J0IHthc2luaEdyYWRDb25maWd9IGZyb20gJy4vZ3JhZGllbnRzL0FzaW5oX2dyYWQnO1xuaW1wb3J0IHthdGFuMkdyYWRDb25maWd9IGZyb20gJy4vZ3JhZGllbnRzL0F0YW4yX2dyYWQnO1xuaW1wb3J0IHthdGFuR3JhZENvbmZpZ30gZnJvbSAnLi9ncmFkaWVudHMvQXRhbl9ncmFkJztcbmltcG9ydCB7YXRhbmhHcmFkQ29uZmlnfSBmcm9tICcuL2dyYWRpZW50cy9BdGFuaF9ncmFkJztcbmltcG9ydCB7YXZnUG9vbDNER3JhZENvbmZpZ30gZnJvbSAnLi9ncmFkaWVudHMvQXZnUG9vbDNEX2dyYWQnO1xuaW1wb3J0IHthdmdQb29sR3JhZENvbmZpZ30gZnJvbSAnLi9ncmFkaWVudHMvQXZnUG9vbF9ncmFkJztcbmltcG9ydCB7YmF0Y2hNYXRNdWxHcmFkQ29uZmlnfSBmcm9tICcuL2dyYWRpZW50cy9CYXRjaE1hdE11bF9ncmFkJztcbmltcG9ydCB7YmF0Y2hUb1NwYWNlTkRHcmFkQ29uZmlnfSBmcm9tICcuL2dyYWRpZW50cy9CYXRjaFRvU3BhY2VORF9ncmFkJztcbmltcG9ydCB7YnJvYWRjYXN0VG9HcmFkQ29uZmlnfSBmcm9tICcuL2dyYWRpZW50cy9Ccm9hZGNhc3RUb19ncmFkJztcbmltcG9ydCB7Y2FzdEdyYWRDb25maWd9IGZyb20gJy4vZ3JhZGllbnRzL0Nhc3RfZ3JhZCc7XG5pbXBvcnQge2NlaWxHcmFkQ29uZmlnfSBmcm9tICcuL2dyYWRpZW50cy9DZWlsX2dyYWQnO1xuaW1wb3J0IHtjbGlwQnlWYWx1ZUdyYWRDb25maWd9IGZyb20gJy4vZ3JhZGllbnRzL0NsaXBCeVZhbHVlX2dyYWQnO1xuaW1wb3J0IHtjb21wbGV4QWJzR3JhZENvbmZpZ30gZnJvbSAnLi9ncmFkaWVudHMvQ29tcGxleEFic19ncmFkJztcbmltcG9ydCB7Y29uY2F0R3JhZENvbmZpZ30gZnJvbSAnLi9ncmFkaWVudHMvQ29uY2F0X2dyYWQnO1xuaW1wb3J0IHtjb252MkRHcmFkQ29uZmlnfSBmcm9tICcuL2dyYWRpZW50cy9Db252MkRfZ3JhZCc7XG5pbXBvcnQge2NvbnYyREJhY2twcm9wSW5wdXRHcmFkQ29uZmlnfSBmcm9tICcuL2dyYWRpZW50cy9Db252MkRCYWNrcHJvcElucHV0X2dyYWQnO1xuaW1wb3J0IHtjb252M0RHcmFkQ29uZmlnfSBmcm9tICcuL2dyYWRpZW50cy9Db252M0RfZ3JhZCc7XG5pbXBvcnQge2Nvc0dyYWRDb25maWd9IGZyb20gJy4vZ3JhZGllbnRzL0Nvc19ncmFkJztcbmltcG9ydCB7Y29zaEdyYWRDb25maWd9IGZyb20gJy4vZ3JhZGllbnRzL0Nvc2hfZ3JhZCc7XG5pbXBvcnQge2N1bXN1bUdyYWRDb25maWd9IGZyb20gJy4vZ3JhZGllbnRzL0N1bXN1bV9ncmFkJztcbmltcG9ydCB7ZGVwdGh3aXNlQ29udjJkTmF0aXZlR3JhZENvbmZpZ30gZnJvbSAnLi9ncmFkaWVudHMvRGVwdGh3aXNlQ29udjJkTmF0aXZlX2dyYWQnO1xuaW1wb3J0IHtkaWxhdGlvbjJkR3JhZENvbmZpZ30gZnJvbSAnLi9ncmFkaWVudHMvRGlsYXRpb24yRF9ncmFkJztcbmltcG9ydCB7ZWx1R3JhZENvbmZpZ30gZnJvbSAnLi9ncmFkaWVudHMvRWx1X2dyYWQnO1xuaW1wb3J0IHtlcmZHcmFkQ29uZmlnfSBmcm9tICcuL2dyYWRpZW50cy9FcmZfZ3JhZCc7XG5pbXBvcnQge2V4cEdyYWRDb25maWd9IGZyb20gJy4vZ3JhZGllbnRzL0V4cF9ncmFkJztcbmltcG9ydCB7ZXhwYW5kRGltc0dyYWRDb25maWd9IGZyb20gJy4vZ3JhZGllbnRzL0V4cGFuZERpbXNfZ3JhZCc7XG5pbXBvcnQge2V4cG0xR3JhZENvbmZpZ30gZnJvbSAnLi9ncmFkaWVudHMvRXhwbTFfZ3JhZCc7XG5pbXBvcnQge2Zsb29yR3JhZENvbmZpZ30gZnJvbSAnLi9ncmFkaWVudHMvRmxvb3JfZ3JhZCc7XG5pbXBvcnQge2Zsb29yRGl2R3JhZENvbmZpZ30gZnJvbSAnLi9ncmFkaWVudHMvRmxvb3JEaXZfZ3JhZCc7XG5pbXBvcnQge2Z1c2VkQmF0Y2hOb3JtR3JhZENvbmZpZ30gZnJvbSAnLi9ncmFkaWVudHMvRnVzZWRCYXRjaE5vcm1fZ3JhZCc7XG5pbXBvcnQge2dhdGhlckdyYWRDb25maWd9IGZyb20gJy4vZ3JhZGllbnRzL0dhdGhlclYyX2dyYWQnO1xuaW1wb3J0IHtncmVhdGVyRXF1YWxHcmFkQ29uZmlnfSBmcm9tICcuL2dyYWRpZW50cy9HcmVhdGVyRXF1YWxfZ3JhZCc7XG5pbXBvcnQge2lkZW50aXR5R3JhZENvbmZpZ30gZnJvbSAnLi9ncmFkaWVudHMvSWRlbnRpdHlfZ3JhZCc7XG5pbXBvcnQge2lzRmluaXRlR3JhZENvbmZpZ30gZnJvbSAnLi9ncmFkaWVudHMvSXNGaW5pdGVfZ3JhZCc7XG5pbXBvcnQge2lzSW5mR3JhZENvbmZpZ30gZnJvbSAnLi9ncmFkaWVudHMvSXNJbmZfZ3JhZCc7XG5pbXBvcnQge2lzTmFuR3JhZENvbmZpZ30gZnJvbSAnLi9ncmFkaWVudHMvSXNOYW5fZ3JhZCc7XG5pbXBvcnQge2xlYWt5UmVsdUdyYWRDb25maWd9IGZyb20gJy4vZ3JhZGllbnRzL0xlYWt5UmVsdV9ncmFkJztcbmltcG9ydCB7bG9nMXBHcmFkQ29uZmlnfSBmcm9tICcuL2dyYWRpZW50cy9Mb2cxcF9ncmFkJztcbmltcG9ydCB7bG9nR3JhZENvbmZpZ30gZnJvbSAnLi9ncmFkaWVudHMvTG9nX2dyYWQnO1xuaW1wb3J0IHtsb2dTb2Z0bWF4R3JhZENvbmZpZ30gZnJvbSAnLi9ncmFkaWVudHMvTG9nU29mdG1heF9ncmFkJztcbmltcG9ydCB7bHJuR3JhZENvbmZpZ30gZnJvbSAnLi9ncmFkaWVudHMvTFJOX2dyYWQnO1xuaW1wb3J0IHttYXhHcmFkQ29uZmlnfSBmcm9tICcuL2dyYWRpZW50cy9NYXhfZ3JhZCc7XG5pbXBvcnQge21heGltdW1HcmFkQ29uZmlnfSBmcm9tICcuL2dyYWRpZW50cy9NYXhpbXVtX2dyYWQnO1xuaW1wb3J0IHttYXhQb29sM0RHcmFkQ29uZmlnfSBmcm9tICcuL2dyYWRpZW50cy9NYXhQb29sM0RfZ3JhZCc7XG5pbXBvcnQge21heFBvb2xHcmFkQ29uZmlnfSBmcm9tICcuL2dyYWRpZW50cy9NYXhQb29sX2dyYWQnO1xuaW1wb3J0IHttZWFuR3JhZENvbmZpZ30gZnJvbSAnLi9ncmFkaWVudHMvTWVhbl9ncmFkJztcbmltcG9ydCB7bWluR3JhZENvbmZpZ30gZnJvbSAnLi9ncmFkaWVudHMvTWluX2dyYWQnO1xuaW1wb3J0IHttaW5pbXVtR3JhZENvbmZpZ30gZnJvbSAnLi9ncmFkaWVudHMvTWluaW11bV9ncmFkJztcbmltcG9ydCB7bWlycm9yUGFkR3JhZENvbmZpZ30gZnJvbSAnLi9ncmFkaWVudHMvTWlycm9yUGFkX2dyYWQnO1xuaW1wb3J0IHttb2RHcmFkQ29uZmlnfSBmcm9tICcuL2dyYWRpZW50cy9Nb2RfZ3JhZCc7XG5pbXBvcnQge211bHRpcGx5R3JhZENvbmZpZ30gZnJvbSAnLi9ncmFkaWVudHMvTXVsdGlwbHlfZ3JhZCc7XG5pbXBvcnQge25lZ0dyYWRDb25maWd9IGZyb20gJy4vZ3JhZGllbnRzL05lZ19ncmFkJztcbmltcG9ydCB7b25lSG90R3JhZENvbmZpZ30gZnJvbSAnLi9ncmFkaWVudHMvT25lSG90X2dyYWQnO1xuaW1wb3J0IHtvbmVzTGlrZUdyYWRDb25maWd9IGZyb20gJy4vZ3JhZGllbnRzL09uZXNMaWtlX2dyYWQnO1xuaW1wb3J0IHtwYWNrR3JhZENvbmZpZ30gZnJvbSAnLi9ncmFkaWVudHMvUGFja19ncmFkJztcbmltcG9ydCB7cGFkVjJHcmFkQ29uZmlnfSBmcm9tICcuL2dyYWRpZW50cy9QYWRWMl9ncmFkJztcbmltcG9ydCB7cG93R3JhZENvbmZpZ30gZnJvbSAnLi9ncmFkaWVudHMvUG93X2dyYWQnO1xuaW1wb3J0IHtwcmVsdUdyYWRDb25maWd9IGZyb20gJy4vZ3JhZGllbnRzL1ByZWx1X2dyYWQnO1xuaW1wb3J0IHtwcm9kR3JhZENvbmZpZ30gZnJvbSAnLi9ncmFkaWVudHMvUHJvZF9ncmFkJztcbmltcG9ydCB7ZGl2R3JhZENvbmZpZ30gZnJvbSAnLi9ncmFkaWVudHMvUmVhbERpdl9ncmFkJztcbmltcG9ydCB7cmVjaXByb2NhbEdyYWRDb25maWd9IGZyb20gJy4vZ3JhZGllbnRzL1JlY2lwcm9jYWxfZ3JhZCc7XG5pbXBvcnQge3JlbHU2R3JhZENvbmZpZ30gZnJvbSAnLi9ncmFkaWVudHMvUmVsdTZfZ3JhZCc7XG5pbXBvcnQge3JlbHVHcmFkQ29uZmlnfSBmcm9tICcuL2dyYWRpZW50cy9SZWx1X2dyYWQnO1xuaW1wb3J0IHtyZXNoYXBlR3JhZENvbmZpZ30gZnJvbSAnLi9ncmFkaWVudHMvUmVzaGFwZV9ncmFkJztcbmltcG9ydCB7cmVzaXplQmlsaW5lYXJHcmFkQ29uZmlnfSBmcm9tICcuL2dyYWRpZW50cy9SZXNpemVCaWxpbmVhcl9ncmFkJztcbmltcG9ydCB7cmVzaXplTmVhcmVzdE5laWdoYm9yR3JhZENvbmZpZ30gZnJvbSAnLi9ncmFkaWVudHMvUmVzaXplTmVhcmVzdE5laWdoYm9yX2dyYWQnO1xuaW1wb3J0IHtyZXZlcnNlR3JhZENvbmZpZ30gZnJvbSAnLi9ncmFkaWVudHMvUmV2ZXJzZV9ncmFkJztcbmltcG9ydCB7cm91bmRHcmFkQ29uZmlnfSBmcm9tICcuL2dyYWRpZW50cy9Sb3VuZF9ncmFkJztcbmltcG9ydCB7cnNxcnRHcmFkQ29uZmlnfSBmcm9tICcuL2dyYWRpZW50cy9Sc3FydF9ncmFkJztcbmltcG9ydCB7c2VsZWN0R3JhZENvbmZpZ30gZnJvbSAnLi9ncmFkaWVudHMvU2VsZWN0X2dyYWQnO1xuaW1wb3J0IHtzZWx1R3JhZENvbmZpZ30gZnJvbSAnLi9ncmFkaWVudHMvU2VsdV9ncmFkJztcbmltcG9ydCB7c2lnbW9pZEdyYWRDb25maWd9IGZyb20gJy4vZ3JhZGllbnRzL1NpZ21vaWRfZ3JhZCc7XG5pbXBvcnQge3NpZ25HcmFkQ29uZmlnfSBmcm9tICcuL2dyYWRpZW50cy9TaWduX2dyYWQnO1xuaW1wb3J0IHtzaW5HcmFkQ29uZmlnfSBmcm9tICcuL2dyYWRpZW50cy9TaW5fZ3JhZCc7XG5pbXBvcnQge3NpbmhHcmFkQ29uZmlnfSBmcm9tICcuL2dyYWRpZW50cy9TaW5oX2dyYWQnO1xuaW1wb3J0IHtzbGljZUdyYWRDb25maWd9IGZyb20gJy4vZ3JhZGllbnRzL1NsaWNlX2dyYWQnO1xuaW1wb3J0IHtzb2Z0bWF4R3JhZENvbmZpZ30gZnJvbSAnLi9ncmFkaWVudHMvU29mdG1heF9ncmFkJztcbmltcG9ydCB7c29mdHBsdXNHcmFkQ29uZmlnfSBmcm9tICcuL2dyYWRpZW50cy9Tb2Z0cGx1c19ncmFkJztcbmltcG9ydCB7c3BhY2VUb0JhdGNoTkRHcmFkQ29uZmlnfSBmcm9tICcuL2dyYWRpZW50cy9TcGFjZVRvQmF0Y2hORF9ncmFkJztcbmltcG9ydCB7c3BsaXRWR3JhZENvbmZpZ30gZnJvbSAnLi9ncmFkaWVudHMvU3BsaXRWX2dyYWQnO1xuaW1wb3J0IHtzcXJ0R3JhZENvbmZpZ30gZnJvbSAnLi9ncmFkaWVudHMvU3FydF9ncmFkJztcbmltcG9ydCB7c3F1YXJlR3JhZENvbmZpZ30gZnJvbSAnLi9ncmFkaWVudHMvU3F1YXJlX2dyYWQnO1xuaW1wb3J0IHtzcXVhcmVkRGlmZmVyZW5jZUdyYWRDb25maWd9IGZyb20gJy4vZ3JhZGllbnRzL1NxdWFyZWREaWZmZXJlbmNlX2dyYWQnO1xuaW1wb3J0IHtzdGVwR3JhZENvbmZpZ30gZnJvbSAnLi9ncmFkaWVudHMvU3RlcF9ncmFkJztcbmltcG9ydCB7c3ViR3JhZENvbmZpZ30gZnJvbSAnLi9ncmFkaWVudHMvU3ViX2dyYWQnO1xuaW1wb3J0IHtzdW1HcmFkQ29uZmlnfSBmcm9tICcuL2dyYWRpZW50cy9TdW1fZ3JhZCc7XG5pbXBvcnQge3RhbkdyYWRDb25maWd9IGZyb20gJy4vZ3JhZGllbnRzL1Rhbl9ncmFkJztcbmltcG9ydCB7dGFuaEdyYWRDb25maWd9IGZyb20gJy4vZ3JhZGllbnRzL1RhbmhfZ3JhZCc7XG5pbXBvcnQge3RpbGVHcmFkQ29uZmlnfSBmcm9tICcuL2dyYWRpZW50cy9UaWxlX2dyYWQnO1xuaW1wb3J0IHt0cmFuc3Bvc2VHcmFkQ29uZmlnfSBmcm9tICcuL2dyYWRpZW50cy9UcmFuc3Bvc2VfZ3JhZCc7XG5pbXBvcnQge3VucGFja0dyYWRDb25maWd9IGZyb20gJy4vZ3JhZGllbnRzL1VucGFja19ncmFkJztcbmltcG9ydCB7dW5zb3J0ZWRTZWdtZW50U3VtR3JhZENvbmZpZ30gZnJvbSAnLi9ncmFkaWVudHMvVW5zb3J0ZWRTZWdtZW50U3VtX2dyYWQnO1xuaW1wb3J0IHt6ZXJvc0xpa2VHcmFkQ29uZmlnfSBmcm9tICcuL2dyYWRpZW50cy9aZXJvc0xpa2VfZ3JhZCc7XG5pbXBvcnQge0dyYWRDb25maWd9IGZyb20gJy4va2VybmVsX3JlZ2lzdHJ5JztcbmltcG9ydCB7cmVnaXN0ZXJHcmFkaWVudH0gZnJvbSAnLi9rZXJuZWxfcmVnaXN0cnknO1xuXG4vLyBFeHBvcnQgYWxsIGtlcm5lbCBjb25maWdzIGhlcmUgc28gdGhhdCB0aGUgcGFja2FnZSBjYW4gYXV0byByZWdpc3RlciB0aGVtXG5jb25zdCBncmFkQ29uZmlnczogR3JhZENvbmZpZ1tdID0gW1xuICBhYnNHcmFkQ29uZmlnLFxuICBhY29zR3JhZENvbmZpZyxcbiAgYWNvc2hHcmFkQ29uZmlnLFxuICBhZGRHcmFkQ29uZmlnLFxuICBhZGROR3JhZENvbmZpZyxcbiAgYXJnTWF4R3JhZENvbmZpZyxcbiAgYXJnTWluR3JhZENvbmZpZyxcbiAgYXNpbkdyYWRDb25maWcsXG4gIGFzaW5oR3JhZENvbmZpZyxcbiAgYXRhbjJHcmFkQ29uZmlnLFxuICBhdGFuR3JhZENvbmZpZyxcbiAgYXRhbmhHcmFkQ29uZmlnLFxuICBhdmdQb29sM0RHcmFkQ29uZmlnLFxuICBhdmdQb29sR3JhZENvbmZpZyxcbiAgYmF0Y2hNYXRNdWxHcmFkQ29uZmlnLFxuICBiYXRjaFRvU3BhY2VOREdyYWRDb25maWcsXG4gIGJyb2FkY2FzdFRvR3JhZENvbmZpZyxcbiAgY2FzdEdyYWRDb25maWcsXG4gIGNlaWxHcmFkQ29uZmlnLFxuICBjbGlwQnlWYWx1ZUdyYWRDb25maWcsXG4gIGNvbXBsZXhBYnNHcmFkQ29uZmlnLFxuICBjb25jYXRHcmFkQ29uZmlnLFxuICBjb252MkRCYWNrcHJvcElucHV0R3JhZENvbmZpZyxcbiAgY29udjJER3JhZENvbmZpZyxcbiAgY29udjNER3JhZENvbmZpZyxcbiAgY29zR3JhZENvbmZpZyxcbiAgY29zaEdyYWRDb25maWcsXG4gIGN1bXN1bUdyYWRDb25maWcsXG4gIGRlcHRod2lzZUNvbnYyZE5hdGl2ZUdyYWRDb25maWcsXG4gIGRpbGF0aW9uMmRHcmFkQ29uZmlnLFxuICBkaXZHcmFkQ29uZmlnLFxuICBlbHVHcmFkQ29uZmlnLFxuICBlcmZHcmFkQ29uZmlnLFxuICBleHBHcmFkQ29uZmlnLFxuICBleHBhbmREaW1zR3JhZENvbmZpZyxcbiAgZXhwbTFHcmFkQ29uZmlnLFxuICBmbG9vckRpdkdyYWRDb25maWcsXG4gIGZsb29yR3JhZENvbmZpZyxcbiAgZnVzZWRCYXRjaE5vcm1HcmFkQ29uZmlnLFxuICBnYXRoZXJHcmFkQ29uZmlnLFxuICBncmVhdGVyRXF1YWxHcmFkQ29uZmlnLFxuICBpZGVudGl0eUdyYWRDb25maWcsXG4gIGlzRmluaXRlR3JhZENvbmZpZyxcbiAgaXNJbmZHcmFkQ29uZmlnLFxuICBpc05hbkdyYWRDb25maWcsXG4gIGxlYWt5UmVsdUdyYWRDb25maWcsXG4gIGxvZzFwR3JhZENvbmZpZyxcbiAgbG9nR3JhZENvbmZpZyxcbiAgbG9nU29mdG1heEdyYWRDb25maWcsXG4gIGxybkdyYWRDb25maWcsXG4gIG1heEdyYWRDb25maWcsXG4gIG1heEdyYWRDb25maWcsXG4gIG1heGltdW1HcmFkQ29uZmlnLFxuICBtYXhQb29sM0RHcmFkQ29uZmlnLFxuICBtYXhQb29sR3JhZENvbmZpZyxcbiAgbWVhbkdyYWRDb25maWcsXG4gIG1pbkdyYWRDb25maWcsXG4gIG1pbmltdW1HcmFkQ29uZmlnLFxuICBtaXJyb3JQYWRHcmFkQ29uZmlnLFxuICBtb2RHcmFkQ29uZmlnLFxuICBtdWx0aXBseUdyYWRDb25maWcsXG4gIG5lZ0dyYWRDb25maWcsXG4gIG9uZUhvdEdyYWRDb25maWcsXG4gIG9uZXNMaWtlR3JhZENvbmZpZyxcbiAgcGFja0dyYWRDb25maWcsXG4gIHBhZFYyR3JhZENvbmZpZyxcbiAgcGFkVjJHcmFkQ29uZmlnLFxuICBwb3dHcmFkQ29uZmlnLFxuICBwcmVsdUdyYWRDb25maWcsXG4gIHByb2RHcmFkQ29uZmlnLFxuICByZWNpcHJvY2FsR3JhZENvbmZpZyxcbiAgcmVsdTZHcmFkQ29uZmlnLFxuICByZWx1R3JhZENvbmZpZyxcbiAgcmVzaGFwZUdyYWRDb25maWcsXG4gIHJlc2l6ZUJpbGluZWFyR3JhZENvbmZpZyxcbiAgcmVzaXplTmVhcmVzdE5laWdoYm9yR3JhZENvbmZpZyxcbiAgcmV2ZXJzZUdyYWRDb25maWcsXG4gIHJvdW5kR3JhZENvbmZpZyxcbiAgcnNxcnRHcmFkQ29uZmlnLFxuICBzZWxlY3RHcmFkQ29uZmlnLFxuICBzZWx1R3JhZENvbmZpZyxcbiAgc2lnbW9pZEdyYWRDb25maWcsXG4gIHNpZ25HcmFkQ29uZmlnLFxuICBzaW5HcmFkQ29uZmlnLFxuICBzaW5oR3JhZENvbmZpZyxcbiAgc2xpY2VHcmFkQ29uZmlnLFxuICBzb2Z0bWF4R3JhZENvbmZpZyxcbiAgc29mdHBsdXNHcmFkQ29uZmlnLFxuICBzcGFjZVRvQmF0Y2hOREdyYWRDb25maWcsXG4gIHNwYWNlVG9CYXRjaE5ER3JhZENvbmZpZyxcbiAgc3BsaXRWR3JhZENvbmZpZyxcbiAgc3BsaXRWR3JhZENvbmZpZyxcbiAgc3FydEdyYWRDb25maWcsXG4gIHNxdWFyZWREaWZmZXJlbmNlR3JhZENvbmZpZyxcbiAgc3F1YXJlR3JhZENvbmZpZyxcbiAgc3RlcEdyYWRDb25maWcsXG4gIHN1YkdyYWRDb25maWcsXG4gIHN1bUdyYWRDb25maWcsXG4gIHRhbkdyYWRDb25maWcsXG4gIHRhbmhHcmFkQ29uZmlnLFxuICB0aWxlR3JhZENvbmZpZyxcbiAgdHJhbnNwb3NlR3JhZENvbmZpZyxcbiAgdW5wYWNrR3JhZENvbmZpZyxcbiAgdW5zb3J0ZWRTZWdtZW50U3VtR3JhZENvbmZpZyxcbiAgemVyb3NMaWtlR3JhZENvbmZpZ1xuXTtcblxuZm9yIChjb25zdCBncmFkaWVudENvbmZpZyBvZiBncmFkQ29uZmlncykge1xuICByZWdpc3RlckdyYWRpZW50KGdyYWRpZW50Q29uZmlnKTtcbn1cbiJdfQ==","/**\n * @license\n * Copyright 2020 Google LLC. All Rights Reserved.\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n * =============================================================================\n */\n// TODO update import path once op is modularized.\nimport { abs } from '../../ops/ops';\nimport { getGlobalTensorClass } from '../../tensor';\ngetGlobalTensorClass().prototype.abs = function () {\n this.throwIfDisposed();\n return abs(this);\n};\n//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYWJzLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vLi4vLi4vdGZqcy1jb3JlL3NyYy9wdWJsaWMvY2hhaW5lZF9vcHMvYWJzLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBOzs7Ozs7Ozs7Ozs7Ozs7R0FlRztBQUVILGtEQUFrRDtBQUNsRCxPQUFPLEVBQUMsR0FBRyxFQUFDLE1BQU0sZUFBZSxDQUFDO0FBQ2xDLE9BQU8sRUFBQyxvQkFBb0IsRUFBUyxNQUFNLGNBQWMsQ0FBQztBQVMxRCxvQkFBb0IsRUFBRSxDQUFDLFNBQVMsQ0FBQyxHQUFHLEdBQUc7SUFDckMsSUFBSSxDQUFDLGVBQWUsRUFBRSxDQUFDO0lBQ3ZCLE9BQU8sR0FBRyxDQUFDLElBQUksQ0FBQyxDQUFDO0FBQ25CLENBQUMsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbIi8qKlxuICogQGxpY2Vuc2VcbiAqIENvcHlyaWdodCAyMDIwIEdvb2dsZSBMTEMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuXG4gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgXCJMaWNlbnNlXCIpO1xuICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLlxuICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0XG4gKlxuICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wXG4gKlxuICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZVxuICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gXCJBUyBJU1wiIEJBU0lTLFxuICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuXG4gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kXG4gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS5cbiAqID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4gKi9cblxuLy8gVE9ETyB1cGRhdGUgaW1wb3J0IHBhdGggb25jZSBvcCBpcyBtb2R1bGFyaXplZC5cbmltcG9ydCB7YWJzfSBmcm9tICcuLi8uLi9vcHMvb3BzJztcbmltcG9ydCB7Z2V0R2xvYmFsVGVuc29yQ2xhc3MsIFRlbnNvcn0gZnJvbSAnLi4vLi4vdGVuc29yJztcbmltcG9ydCB7UmFua30gZnJvbSAnLi4vLi4vdHlwZXMnO1xuXG5kZWNsYXJlIG1vZHVsZSAnLi4vLi4vdGVuc29yJyB7XG4gIGludGVyZmFjZSBUZW5zb3I8UiBleHRlbmRzIFJhbmsgPSBSYW5rPiB7XG4gICAgYWJzPFQgZXh0ZW5kcyBUZW5zb3I+KHRoaXM6IFQpOiBUO1xuICB9XG59XG5cbmdldEdsb2JhbFRlbnNvckNsYXNzKCkucHJvdG90eXBlLmFicyA9IGZ1bmN0aW9uPFQgZXh0ZW5kcyBUZW5zb3I+KHRoaXM6IFQpIHtcbiAgdGhpcy50aHJvd0lmRGlzcG9zZWQoKTtcbiAgcmV0dXJuIGFicyh0aGlzKTtcbn07XG4iXX0=","/**\n * @license\n * Copyright 2020 Google LLC. All Rights Reserved.\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n * =============================================================================\n */\n// TODO update import path once op is modularized.\nimport { acos } from '../../ops/ops';\nimport { getGlobalTensorClass } from '../../tensor';\ngetGlobalTensorClass().prototype.acos = function () {\n this.throwIfDisposed();\n return acos(this);\n};\n//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYWNvcy5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uLy4uLy4uL3RmanMtY29yZS9zcmMvcHVibGljL2NoYWluZWRfb3BzL2Fjb3MudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUE7Ozs7Ozs7Ozs7Ozs7OztHQWVHO0FBRUgsa0RBQWtEO0FBQ2xELE9BQU8sRUFBQyxJQUFJLEVBQUMsTUFBTSxlQUFlLENBQUM7QUFDbkMsT0FBTyxFQUFDLG9CQUFvQixFQUFTLE1BQU0sY0FBYyxDQUFDO0FBUzFELG9CQUFvQixFQUFFLENBQUMsU0FBUyxDQUFDLElBQUksR0FBRztJQUN0QyxJQUFJLENBQUMsZUFBZSxFQUFFLENBQUM7SUFDdkIsT0FBTyxJQUFJLENBQUMsSUFBSSxDQUFDLENBQUM7QUFDcEIsQ0FBQyxDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiLyoqXG4gKiBAbGljZW5zZVxuICogQ29weXJpZ2h0IDIwMjAgR29vZ2xlIExMQy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC5cbiAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSBcIkxpY2Vuc2VcIik7XG4gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuXG4gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXRcbiAqXG4gKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjBcbiAqXG4gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlXG4gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiBcIkFTIElTXCIgQkFTSVMsXG4gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC5cbiAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmRcbiAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLlxuICogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbiAqL1xuXG4vLyBUT0RPIHVwZGF0ZSBpbXBvcnQgcGF0aCBvbmNlIG9wIGlzIG1vZHVsYXJpemVkLlxuaW1wb3J0IHthY29zfSBmcm9tICcuLi8uLi9vcHMvb3BzJztcbmltcG9ydCB7Z2V0R2xvYmFsVGVuc29yQ2xhc3MsIFRlbnNvcn0gZnJvbSAnLi4vLi4vdGVuc29yJztcbmltcG9ydCB7UmFua30gZnJvbSAnLi4vLi4vdHlwZXMnO1xuXG5kZWNsYXJlIG1vZHVsZSAnLi4vLi4vdGVuc29yJyB7XG4gIGludGVyZmFjZSBUZW5zb3I8UiBleHRlbmRzIFJhbmsgPSBSYW5rPiB7XG4gICAgYWNvczxUIGV4dGVuZHMgVGVuc29yPih0aGlzOiBUKTogVDtcbiAgfVxufVxuXG5nZXRHbG9iYWxUZW5zb3JDbGFzcygpLnByb3RvdHlwZS5hY29zID0gZnVuY3Rpb248VCBleHRlbmRzIFRlbnNvcj4odGhpczogVCkge1xuICB0aGlzLnRocm93SWZEaXNwb3NlZCgpO1xuICByZXR1cm4gYWNvcyh0aGlzKTtcbn07XG4iXX0=","/**\n * @license\n * Copyright 2020 Google LLC. All Rights Reserved.\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n * =============================================================================\n */\n// TODO update import path once op is modularized.\nimport { acosh } from '../../ops/ops';\nimport { getGlobalTensorClass } from '../../tensor';\ngetGlobalTensorClass().prototype.acosh = function () {\n this.throwIfDisposed();\n return acosh(this);\n};\n//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYWNvc2guanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi8uLi8uLi90ZmpzLWNvcmUvc3JjL3B1YmxpYy9jaGFpbmVkX29wcy9hY29zaC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQTs7Ozs7Ozs7Ozs7Ozs7O0dBZUc7QUFFSCxrREFBa0Q7QUFDbEQsT0FBTyxFQUFDLEtBQUssRUFBQyxNQUFNLGVBQWUsQ0FBQztBQUNwQyxPQUFPLEVBQUMsb0JBQW9CLEVBQVMsTUFBTSxjQUFjLENBQUM7QUFTMUQsb0JBQW9CLEVBQUUsQ0FBQyxTQUFTLENBQUMsS0FBSyxHQUFHO0lBQ3ZDLElBQUksQ0FBQyxlQUFlLEVBQUUsQ0FBQztJQUN2QixPQUFPLEtBQUssQ0FBQyxJQUFJLENBQUMsQ0FBQztBQUNyQixDQUFDLENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyIvKipcbiAqIEBsaWNlbnNlXG4gKiBDb3B5cmlnaHQgMjAyMCBHb29nbGUgTExDLiBBbGwgUmlnaHRzIFJlc2VydmVkLlxuICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlIFwiTGljZW5zZVwiKTtcbiAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS5cbiAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdFxuICpcbiAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMFxuICpcbiAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmVcbiAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuIFwiQVMgSVNcIiBCQVNJUyxcbiAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLlxuICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZFxuICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuXG4gKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuICovXG5cbi8vIFRPRE8gdXBkYXRlIGltcG9ydCBwYXRoIG9uY2Ugb3AgaXMgbW9kdWxhcml6ZWQuXG5pbXBvcnQge2Fjb3NofSBmcm9tICcuLi8uLi9vcHMvb3BzJztcbmltcG9ydCB7Z2V0R2xvYmFsVGVuc29yQ2xhc3MsIFRlbnNvcn0gZnJvbSAnLi4vLi4vdGVuc29yJztcbmltcG9ydCB7UmFua30gZnJvbSAnLi4vLi4vdHlwZXMnO1xuXG5kZWNsYXJlIG1vZHVsZSAnLi4vLi4vdGVuc29yJyB7XG4gIGludGVyZmFjZSBUZW5zb3I8UiBleHRlbmRzIFJhbmsgPSBSYW5rPiB7XG4gICAgYWNvc2g8VCBleHRlbmRzIFRlbnNvcj4odGhpczogVCk6IFQ7XG4gIH1cbn1cblxuZ2V0R2xvYmFsVGVuc29yQ2xhc3MoKS5wcm90b3R5cGUuYWNvc2ggPSBmdW5jdGlvbjxUIGV4dGVuZHMgVGVuc29yPih0aGlzOiBUKSB7XG4gIHRoaXMudGhyb3dJZkRpc3Bvc2VkKCk7XG4gIHJldHVybiBhY29zaCh0aGlzKTtcbn07XG4iXX0=","/**\n * @license\n * Copyright 2020 Google LLC. All Rights Reserved.\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n * =============================================================================\n */\nimport { add } from '../../ops/add';\nimport { getGlobalTensorClass } from '../../tensor';\ngetGlobalTensorClass().prototype.add = function (b) {\n this.throwIfDisposed();\n return add(this, b);\n};\n//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYWRkLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vLi4vLi4vdGZqcy1jb3JlL3NyYy9wdWJsaWMvY2hhaW5lZF9vcHMvYWRkLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBOzs7Ozs7Ozs7Ozs7Ozs7R0FlRztBQUVILE9BQU8sRUFBQyxHQUFHLEVBQUMsTUFBTSxlQUFlLENBQUM7QUFDbEMsT0FBTyxFQUFDLG9CQUFvQixFQUFTLE1BQU0sY0FBYyxDQUFDO0FBUzFELG9CQUFvQixFQUFFLENBQUMsU0FBUyxDQUFDLEdBQUcsR0FBRyxVQUNuQyxDQUFvQjtJQUN0QixJQUFJLENBQUMsZUFBZSxFQUFFLENBQUM7SUFDdkIsT0FBTyxHQUFHLENBQUMsSUFBSSxFQUFFLENBQUMsQ0FBQyxDQUFDO0FBQ3RCLENBQUMsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbIi8qKlxuICogQGxpY2Vuc2VcbiAqIENvcHlyaWdodCAyMDIwIEdvb2dsZSBMTEMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuXG4gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgXCJMaWNlbnNlXCIpO1xuICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLlxuICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0XG4gKlxuICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wXG4gKlxuICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZVxuICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gXCJBUyBJU1wiIEJBU0lTLFxuICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuXG4gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kXG4gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS5cbiAqID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4gKi9cblxuaW1wb3J0IHthZGR9IGZyb20gJy4uLy4uL29wcy9hZGQnO1xuaW1wb3J0IHtnZXRHbG9iYWxUZW5zb3JDbGFzcywgVGVuc29yfSBmcm9tICcuLi8uLi90ZW5zb3InO1xuaW1wb3J0IHtSYW5rLCBUZW5zb3JMaWtlfSBmcm9tICcuLi8uLi90eXBlcyc7XG5cbmRlY2xhcmUgbW9kdWxlICcuLi8uLi90ZW5zb3InIHtcbiAgaW50ZXJmYWNlIFRlbnNvcjxSIGV4dGVuZHMgUmFuayA9IFJhbms+IHtcbiAgICBhZGQ8VCBleHRlbmRzIFRlbnNvcj4oYjogVGVuc29yfFRlbnNvckxpa2UpOiBUO1xuICB9XG59XG5cbmdldEdsb2JhbFRlbnNvckNsYXNzKCkucHJvdG90eXBlLmFkZCA9IGZ1bmN0aW9uPFQgZXh0ZW5kcyBUZW5zb3I+KFxuICAgIGI6IFRlbnNvcnxUZW5zb3JMaWtlKTogVCB7XG4gIHRoaXMudGhyb3dJZkRpc3Bvc2VkKCk7XG4gIHJldHVybiBhZGQodGhpcywgYik7XG59O1xuIl19","/**\n * @license\n * Copyright 2020 Google LLC. All Rights Reserved.\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n * =============================================================================\n */\nimport { all } from '../../ops/all';\nimport { getGlobalTensorClass } from '../../tensor';\ngetGlobalTensorClass().prototype.all = function (axis, keepDims) {\n this.throwIfDisposed();\n return all(this, axis, keepDims);\n};\n//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYWxsLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vLi4vLi4vdGZqcy1jb3JlL3NyYy9wdWJsaWMvY2hhaW5lZF9vcHMvYWxsLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBOzs7Ozs7Ozs7Ozs7Ozs7R0FlRztBQUNILE9BQU8sRUFBQyxHQUFHLEVBQUMsTUFBTSxlQUFlLENBQUM7QUFDbEMsT0FBTyxFQUFDLG9CQUFvQixFQUFTLE1BQU0sY0FBYyxDQUFDO0FBVTFELG9CQUFvQixFQUFFLENBQUMsU0FBUyxDQUFDLEdBQUcsR0FBRyxVQUMxQixJQUFzQixFQUFFLFFBQWtCO0lBQ3JELElBQUksQ0FBQyxlQUFlLEVBQUUsQ0FBQztJQUN2QixPQUFPLEdBQUcsQ0FBQyxJQUFJLEVBQUUsSUFBSSxFQUFFLFFBQVEsQ0FBQyxDQUFDO0FBQ25DLENBQUMsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbIi8qKlxuICogQGxpY2Vuc2VcbiAqIENvcHlyaWdodCAyMDIwIEdvb2dsZSBMTEMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuXG4gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgXCJMaWNlbnNlXCIpO1xuICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLlxuICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0XG4gKlxuICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wXG4gKlxuICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZVxuICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gXCJBUyBJU1wiIEJBU0lTLFxuICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuXG4gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kXG4gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS5cbiAqID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4gKi9cbmltcG9ydCB7YWxsfSBmcm9tICcuLi8uLi9vcHMvYWxsJztcbmltcG9ydCB7Z2V0R2xvYmFsVGVuc29yQ2xhc3MsIFRlbnNvcn0gZnJvbSAnLi4vLi4vdGVuc29yJztcbmltcG9ydCB7UmFua30gZnJvbSAnLi4vLi4vdHlwZXMnO1xuXG5kZWNsYXJlIG1vZHVsZSAnLi4vLi4vdGVuc29yJyB7XG4gIGludGVyZmFjZSBUZW5zb3I8UiBleHRlbmRzIFJhbmsgPSBSYW5rPiB7XG4gICAgYWxsPFQgZXh0ZW5kcyBUZW5zb3I+KHRoaXM6IFQsIGF4aXM/OiBudW1iZXJ8bnVtYmVyW10sIGtlZXBEaW1zPzogYm9vbGVhbik6XG4gICAgICAgIFQ7XG4gIH1cbn1cblxuZ2V0R2xvYmFsVGVuc29yQ2xhc3MoKS5wcm90b3R5cGUuYWxsID0gZnVuY3Rpb248VCBleHRlbmRzIFRlbnNvcj4oXG4gICAgdGhpczogVCwgYXhpcz86IG51bWJlcnxudW1iZXJbXSwga2VlcERpbXM/OiBib29sZWFuKTogVCB7XG4gIHRoaXMudGhyb3dJZkRpc3Bvc2VkKCk7XG4gIHJldHVybiBhbGwodGhpcywgYXhpcywga2VlcERpbXMpO1xufTtcbiJdfQ==","/**\n * @license\n * Copyright 2020 Google LLC. All Rights Reserved.\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n * =============================================================================\n */\nimport { any } from '../../ops/any';\nimport { getGlobalTensorClass } from '../../tensor';\ngetGlobalTensorClass().prototype.any = function (axis, keepDims) {\n this.throwIfDisposed();\n return any(this, axis, keepDims);\n};\n//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYW55LmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vLi4vLi4vdGZqcy1jb3JlL3NyYy9wdWJsaWMvY2hhaW5lZF9vcHMvYW55LnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBOzs7Ozs7Ozs7Ozs7Ozs7R0FlRztBQUNILE9BQU8sRUFBQyxHQUFHLEVBQUMsTUFBTSxlQUFlLENBQUM7QUFDbEMsT0FBTyxFQUFDLG9CQUFvQixFQUFTLE1BQU0sY0FBYyxDQUFDO0FBVTFELG9CQUFvQixFQUFFLENBQUMsU0FBUyxDQUFDLEdBQUcsR0FBRyxVQUMxQixJQUFzQixFQUFFLFFBQWtCO0lBQ3JELElBQUksQ0FBQyxlQUFlLEVBQUUsQ0FBQztJQUN2QixPQUFPLEdBQUcsQ0FBQyxJQUFJLEVBQUUsSUFBSSxFQUFFLFFBQVEsQ0FBQyxDQUFDO0FBQ25DLENBQUMsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbIi8qKlxuICogQGxpY2Vuc2VcbiAqIENvcHlyaWdodCAyMDIwIEdvb2dsZSBMTEMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuXG4gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgXCJMaWNlbnNlXCIpO1xuICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLlxuICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0XG4gKlxuICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wXG4gKlxuICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZVxuICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gXCJBUyBJU1wiIEJBU0lTLFxuICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuXG4gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kXG4gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS5cbiAqID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4gKi9cbmltcG9ydCB7YW55fSBmcm9tICcuLi8uLi9vcHMvYW55JztcbmltcG9ydCB7Z2V0R2xvYmFsVGVuc29yQ2xhc3MsIFRlbnNvcn0gZnJvbSAnLi4vLi4vdGVuc29yJztcbmltcG9ydCB7UmFua30gZnJvbSAnLi4vLi4vdHlwZXMnO1xuXG5kZWNsYXJlIG1vZHVsZSAnLi4vLi4vdGVuc29yJyB7XG4gIGludGVyZmFjZSBUZW5zb3I8UiBleHRlbmRzIFJhbmsgPSBSYW5rPiB7XG4gICAgYW55PFQgZXh0ZW5kcyBUZW5zb3I+KHRoaXM6IFQsIGF4aXM/OiBudW1iZXJ8bnVtYmVyW10sIGtlZXBEaW1zPzogYm9vbGVhbik6XG4gICAgICAgIFQ7XG4gIH1cbn1cblxuZ2V0R2xvYmFsVGVuc29yQ2xhc3MoKS5wcm90b3R5cGUuYW55ID0gZnVuY3Rpb248VCBleHRlbmRzIFRlbnNvcj4oXG4gICAgdGhpczogVCwgYXhpcz86IG51bWJlcnxudW1iZXJbXSwga2VlcERpbXM/OiBib29sZWFuKTogVCB7XG4gIHRoaXMudGhyb3dJZkRpc3Bvc2VkKCk7XG4gIHJldHVybiBhbnkodGhpcywgYXhpcywga2VlcERpbXMpO1xufTtcbiJdfQ==","/**\n * @license\n * Copyright 2020 Google LLC. All Rights Reserved.\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n * =============================================================================\n */\nimport { argMax } from '../../ops/arg_max';\nimport { getGlobalTensorClass } from '../../tensor';\ngetGlobalTensorClass().prototype.argMax = function (axis) {\n this.throwIfDisposed();\n return argMax(this, axis);\n};\n//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYXJnX21heC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uLy4uLy4uL3RmanMtY29yZS9zcmMvcHVibGljL2NoYWluZWRfb3BzL2FyZ19tYXgudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUE7Ozs7Ozs7Ozs7Ozs7OztHQWVHO0FBQ0gsT0FBTyxFQUFDLE1BQU0sRUFBQyxNQUFNLG1CQUFtQixDQUFDO0FBQ3pDLE9BQU8sRUFBQyxvQkFBb0IsRUFBUyxNQUFNLGNBQWMsQ0FBQztBQVMxRCxvQkFBb0IsRUFBRSxDQUFDLFNBQVMsQ0FBQyxNQUFNLEdBQUcsVUFDdEMsSUFBYTtJQUNmLElBQUksQ0FBQyxlQUFlLEVBQUUsQ0FBQztJQUN2QixPQUFPLE1BQU0sQ0FBQyxJQUFJLEVBQUUsSUFBSSxDQUFDLENBQUM7QUFDNUIsQ0FBQyxDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiLyoqXG4gKiBAbGljZW5zZVxuICogQ29weXJpZ2h0IDIwMjAgR29vZ2xlIExMQy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC5cbiAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSBcIkxpY2Vuc2VcIik7XG4gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuXG4gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXRcbiAqXG4gKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjBcbiAqXG4gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlXG4gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiBcIkFTIElTXCIgQkFTSVMsXG4gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC5cbiAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmRcbiAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLlxuICogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbiAqL1xuaW1wb3J0IHthcmdNYXh9IGZyb20gJy4uLy4uL29wcy9hcmdfbWF4JztcbmltcG9ydCB7Z2V0R2xvYmFsVGVuc29yQ2xhc3MsIFRlbnNvcn0gZnJvbSAnLi4vLi4vdGVuc29yJztcbmltcG9ydCB7UmFua30gZnJvbSAnLi4vLi4vdHlwZXMnO1xuXG5kZWNsYXJlIG1vZHVsZSAnLi4vLi4vdGVuc29yJyB7XG4gIGludGVyZmFjZSBUZW5zb3I8UiBleHRlbmRzIFJhbmsgPSBSYW5rPiB7XG4gICAgYXJnTWF4PFQgZXh0ZW5kcyBUZW5zb3I+KGF4aXM/OiBudW1iZXIpOiBUO1xuICB9XG59XG5cbmdldEdsb2JhbFRlbnNvckNsYXNzKCkucHJvdG90eXBlLmFyZ01heCA9IGZ1bmN0aW9uPFQgZXh0ZW5kcyBUZW5zb3I+KFxuICAgIGF4aXM/OiBudW1iZXIpOiBUIHtcbiAgdGhpcy50aHJvd0lmRGlzcG9zZWQoKTtcbiAgcmV0dXJuIGFyZ01heCh0aGlzLCBheGlzKTtcbn07XG4iXX0=","/**\n * @license\n * Copyright 2020 Google LLC. All Rights Reserved.\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n * =============================================================================\n */\nimport { argMin } from '../../ops/arg_min';\nimport { getGlobalTensorClass } from '../../tensor';\ngetGlobalTensorClass().prototype.argMin = function (axis) {\n this.throwIfDisposed();\n return argMin(this, axis);\n};\n//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYXJnX21pbi5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uLy4uLy4uL3RmanMtY29yZS9zcmMvcHVibGljL2NoYWluZWRfb3BzL2FyZ19taW4udHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUE7Ozs7Ozs7Ozs7Ozs7OztHQWVHO0FBQ0gsT0FBTyxFQUFDLE1BQU0sRUFBQyxNQUFNLG1CQUFtQixDQUFDO0FBQ3pDLE9BQU8sRUFBQyxvQkFBb0IsRUFBUyxNQUFNLGNBQWMsQ0FBQztBQVMxRCxvQkFBb0IsRUFBRSxDQUFDLFNBQVMsQ0FBQyxNQUFNLEdBQUcsVUFDdEMsSUFBWTtJQUNkLElBQUksQ0FBQyxlQUFlLEVBQUUsQ0FBQztJQUN2QixPQUFPLE1BQU0sQ0FBQyxJQUFJLEVBQUUsSUFBSSxDQUFDLENBQUM7QUFDNUIsQ0FBQyxDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiLyoqXG4gKiBAbGljZW5zZVxuICogQ29weXJpZ2h0IDIwMjAgR29vZ2xlIExMQy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC5cbiAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSBcIkxpY2Vuc2VcIik7XG4gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuXG4gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXRcbiAqXG4gKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjBcbiAqXG4gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlXG4gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiBcIkFTIElTXCIgQkFTSVMsXG4gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC5cbiAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmRcbiAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLlxuICogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbiAqL1xuaW1wb3J0IHthcmdNaW59IGZyb20gJy4uLy4uL29wcy9hcmdfbWluJztcbmltcG9ydCB7Z2V0R2xvYmFsVGVuc29yQ2xhc3MsIFRlbnNvcn0gZnJvbSAnLi4vLi4vdGVuc29yJztcbmltcG9ydCB7UmFua30gZnJvbSAnLi4vLi4vdHlwZXMnO1xuXG5kZWNsYXJlIG1vZHVsZSAnLi4vLi4vdGVuc29yJyB7XG4gIGludGVyZmFjZSBUZW5zb3I8UiBleHRlbmRzIFJhbmsgPSBSYW5rPiB7XG4gICAgYXJnTWluPFQgZXh0ZW5kcyBUZW5zb3I+KGF4aXM/OiBudW1iZXIpOiBUO1xuICB9XG59XG5cbmdldEdsb2JhbFRlbnNvckNsYXNzKCkucHJvdG90eXBlLmFyZ01pbiA9IGZ1bmN0aW9uPFQgZXh0ZW5kcyBUZW5zb3I+KFxuICAgIGF4aXM6IG51bWJlcik6IFQge1xuICB0aGlzLnRocm93SWZEaXNwb3NlZCgpO1xuICByZXR1cm4gYXJnTWluKHRoaXMsIGF4aXMpO1xufTtcbiJdfQ==","/**\n * @license\n * Copyright 2020 Google LLC. All Rights Reserved.\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n * =============================================================================\n */\nimport { reshape } from '../../ops/reshape';\nimport { getGlobalTensorClass } from '../../tensor';\nimport { assert } from '../../util';\n/**\n * Converts a size-1 `tf.Tensor` to a `tf.Scalar`.\n * @doc {heading: 'Tensors', subheading: 'Classes'}\n */\ngetGlobalTensorClass().prototype.asScalar = function () {\n this.throwIfDisposed();\n assert(this.size === 1, () => 'The array must have only 1 element.');\n return reshape(this, []);\n};\n//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYXNfc2NhbGFyLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vLi4vLi4vdGZqcy1jb3JlL3NyYy9wdWJsaWMvY2hhaW5lZF9vcHMvYXNfc2NhbGFyLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBOzs7Ozs7Ozs7Ozs7Ozs7R0FlRztBQUVILE9BQU8sRUFBQyxPQUFPLEVBQUMsTUFBTSxtQkFBbUIsQ0FBQztBQUMxQyxPQUFPLEVBQUMsb0JBQW9CLEVBQWlCLE1BQU0sY0FBYyxDQUFDO0FBRWxFLE9BQU8sRUFBQyxNQUFNLEVBQUMsTUFBTSxZQUFZLENBQUM7QUFRbEM7OztHQUdHO0FBQ0gsb0JBQW9CLEVBQUUsQ0FBQyxTQUFTLENBQUMsUUFBUSxHQUFHO0lBRTFDLElBQUksQ0FBQyxlQUFlLEVBQUUsQ0FBQztJQUN2QixNQUFNLENBQUMsSUFBSSxDQUFDLElBQUksS0FBSyxDQUFDLEVBQUUsR0FBRyxFQUFFLENBQUMscUNBQXFDLENBQUMsQ0FBQztJQUNyRSxPQUFPLE9BQU8sQ0FBQyxJQUFJLEVBQUUsRUFBRSxDQUFDLENBQUM7QUFDM0IsQ0FBQyxDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiLyoqXG4gKiBAbGljZW5zZVxuICogQ29weXJpZ2h0IDIwMjAgR29vZ2xlIExMQy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC5cbiAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSBcIkxpY2Vuc2VcIik7XG4gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuXG4gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXRcbiAqXG4gKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjBcbiAqXG4gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlXG4gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiBcIkFTIElTXCIgQkFTSVMsXG4gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC5cbiAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmRcbiAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLlxuICogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbiAqL1xuXG5pbXBvcnQge3Jlc2hhcGV9IGZyb20gJy4uLy4uL29wcy9yZXNoYXBlJztcbmltcG9ydCB7Z2V0R2xvYmFsVGVuc29yQ2xhc3MsIFNjYWxhciwgVGVuc29yfSBmcm9tICcuLi8uLi90ZW5zb3InO1xuaW1wb3J0IHtSYW5rfSBmcm9tICcuLi8uLi90eXBlcyc7XG5pbXBvcnQge2Fzc2VydH0gZnJvbSAnLi4vLi4vdXRpbCc7XG5cbmRlY2xhcmUgbW9kdWxlICcuLi8uLi90ZW5zb3InIHtcbiAgaW50ZXJmYWNlIFRlbnNvcjxSIGV4dGVuZHMgUmFuayA9IFJhbms+IHtcbiAgICBhc1NjYWxhcjxUIGV4dGVuZHMgVGVuc29yPigpOiBTY2FsYXI7XG4gIH1cbn1cblxuLyoqXG4gKiBDb252ZXJ0cyBhIHNpemUtMSBgdGYuVGVuc29yYCB0byBhIGB0Zi5TY2FsYXJgLlxuICogQGRvYyB7aGVhZGluZzogJ1RlbnNvcnMnLCBzdWJoZWFkaW5nOiAnQ2xhc3Nlcyd9XG4gKi9cbmdldEdsb2JhbFRlbnNvckNsYXNzKCkucHJvdG90eXBlLmFzU2NhbGFyID0gZnVuY3Rpb248VCBleHRlbmRzIFRlbnNvcj4odGhpczogVCk6XG4gICAgU2NhbGFyIHtcbiAgdGhpcy50aHJvd0lmRGlzcG9zZWQoKTtcbiAgYXNzZXJ0KHRoaXMuc2l6ZSA9PT0gMSwgKCkgPT4gJ1RoZSBhcnJheSBtdXN0IGhhdmUgb25seSAxIGVsZW1lbnQuJyk7XG4gIHJldHVybiByZXNoYXBlKHRoaXMsIFtdKTtcbn07XG4iXX0=","/**\n * @license\n * Copyright 2020 Google LLC. All Rights Reserved.\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n * =============================================================================\n */\n// TODO update import path once op is modularized.\nimport { cast } from '../../ops/ops';\nimport { getGlobalTensorClass } from '../../tensor';\n/**\n * Casts a `tf.Tensor` to a specified dtype.\n *\n * @param dtype Data-type to cast the tensor to.\n *\n * @doc {heading: 'Tensors', subheading: 'Classes'}\n */\ngetGlobalTensorClass().prototype.asType = function (dtype) {\n this.throwIfDisposed();\n return cast(this, dtype);\n};\n//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYXNfdHlwZS5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uLy4uLy4uL3RmanMtY29yZS9zcmMvcHVibGljL2NoYWluZWRfb3BzL2FzX3R5cGUudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUE7Ozs7Ozs7Ozs7Ozs7OztHQWVHO0FBRUgsa0RBQWtEO0FBQ2xELE9BQU8sRUFBQyxJQUFJLEVBQUMsTUFBTSxlQUFlLENBQUM7QUFDbkMsT0FBTyxFQUFDLG9CQUFvQixFQUFTLE1BQU0sY0FBYyxDQUFDO0FBUzFEOzs7Ozs7R0FNRztBQUNILG9CQUFvQixFQUFFLENBQUMsU0FBUyxDQUFDLE1BQU0sR0FBRyxVQUM3QixLQUFlO0lBQzFCLElBQUksQ0FBQyxlQUFlLEVBQUUsQ0FBQztJQUN2QixPQUFPLElBQUksQ0FBSSxJQUFJLEVBQUUsS0FBSyxDQUFDLENBQUM7QUFDOUIsQ0FBQyxDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiLyoqXG4gKiBAbGljZW5zZVxuICogQ29weXJpZ2h0IDIwMjAgR29vZ2xlIExMQy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC5cbiAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSBcIkxpY2Vuc2VcIik7XG4gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuXG4gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXRcbiAqXG4gKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjBcbiAqXG4gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlXG4gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiBcIkFTIElTXCIgQkFTSVMsXG4gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC5cbiAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmRcbiAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLlxuICogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbiAqL1xuXG4vLyBUT0RPIHVwZGF0ZSBpbXBvcnQgcGF0aCBvbmNlIG9wIGlzIG1vZHVsYXJpemVkLlxuaW1wb3J0IHtjYXN0fSBmcm9tICcuLi8uLi9vcHMvb3BzJztcbmltcG9ydCB7Z2V0R2xvYmFsVGVuc29yQ2xhc3MsIFRlbnNvcn0gZnJvbSAnLi4vLi4vdGVuc29yJztcbmltcG9ydCB7RGF0YVR5cGUsIFJhbmt9IGZyb20gJy4uLy4uL3R5cGVzJztcblxuZGVjbGFyZSBtb2R1bGUgJy4uLy4uL3RlbnNvcicge1xuICBpbnRlcmZhY2UgVGVuc29yPFIgZXh0ZW5kcyBSYW5rID0gUmFuaz4ge1xuICAgIGFzVHlwZTxUIGV4dGVuZHMgVGVuc29yPih0aGlzOiBULCBkdHlwZTogRGF0YVR5cGUpOiBUO1xuICB9XG59XG5cbi8qKlxuICogQ2FzdHMgYSBgdGYuVGVuc29yYCB0byBhIHNwZWNpZmllZCBkdHlwZS5cbiAqXG4gKiBAcGFyYW0gZHR5cGUgRGF0YS10eXBlIHRvIGNhc3QgdGhlIHRlbnNvciB0by5cbiAqXG4gKiBAZG9jIHtoZWFkaW5nOiAnVGVuc29ycycsIHN1YmhlYWRpbmc6ICdDbGFzc2VzJ31cbiAqL1xuZ2V0R2xvYmFsVGVuc29yQ2xhc3MoKS5wcm90b3R5cGUuYXNUeXBlID0gZnVuY3Rpb248VCBleHRlbmRzIFRlbnNvcj4oXG4gICAgdGhpczogVCwgZHR5cGU6IERhdGFUeXBlKTogVCB7XG4gIHRoaXMudGhyb3dJZkRpc3Bvc2VkKCk7XG4gIHJldHVybiBjYXN0PFQ+KHRoaXMsIGR0eXBlKTtcbn07XG4iXX0=","/**\n * @license\n * Copyright 2020 Google LLC. All Rights Reserved.\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n * =============================================================================\n */\nimport { reshape } from '../../ops/reshape';\nimport { getGlobalTensorClass } from '../../tensor';\n/**\n * Converts a `tf.Tensor` to a `tf.Tensor1D`.\n * @doc {heading: 'Tensors', subheading: 'Classes'}\n */\ngetGlobalTensorClass().prototype.as1D = function () {\n this.throwIfDisposed();\n return reshape(this, [this.size]);\n};\n//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYXMxZC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uLy4uLy4uL3RmanMtY29yZS9zcmMvcHVibGljL2NoYWluZWRfb3BzL2FzMWQudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUE7Ozs7Ozs7Ozs7Ozs7OztHQWVHO0FBRUgsT0FBTyxFQUFDLE9BQU8sRUFBQyxNQUFNLG1CQUFtQixDQUFDO0FBQzFDLE9BQU8sRUFBQyxvQkFBb0IsRUFBUyxNQUFNLGNBQWMsQ0FBQztBQVMxRDs7O0dBR0c7QUFDSCxvQkFBb0IsRUFBRSxDQUFDLFNBQVMsQ0FBQyxJQUFJLEdBQUc7SUFDdEMsSUFBSSxDQUFDLGVBQWUsRUFBRSxDQUFDO0lBQ3ZCLE9BQU8sT0FBTyxDQUFDLElBQUksRUFBRSxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsQ0FBTSxDQUFDO0FBQ3pDLENBQUMsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbIi8qKlxuICogQGxpY2Vuc2VcbiAqIENvcHlyaWdodCAyMDIwIEdvb2dsZSBMTEMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuXG4gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgXCJMaWNlbnNlXCIpO1xuICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLlxuICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0XG4gKlxuICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wXG4gKlxuICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZVxuICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gXCJBUyBJU1wiIEJBU0lTLFxuICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuXG4gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kXG4gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS5cbiAqID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4gKi9cblxuaW1wb3J0IHtyZXNoYXBlfSBmcm9tICcuLi8uLi9vcHMvcmVzaGFwZSc7XG5pbXBvcnQge2dldEdsb2JhbFRlbnNvckNsYXNzLCBUZW5zb3J9IGZyb20gJy4uLy4uL3RlbnNvcic7XG5pbXBvcnQge1Jhbmt9IGZyb20gJy4uLy4uL3R5cGVzJztcblxuZGVjbGFyZSBtb2R1bGUgJy4uLy4uL3RlbnNvcicge1xuICBpbnRlcmZhY2UgVGVuc29yPFIgZXh0ZW5kcyBSYW5rID0gUmFuaz4ge1xuICAgIGFzMUQ8VCBleHRlbmRzIFRlbnNvcj4oKTogVGVuc29yMUQ7XG4gIH1cbn1cblxuLyoqXG4gKiBDb252ZXJ0cyBhIGB0Zi5UZW5zb3JgIHRvIGEgYHRmLlRlbnNvcjFEYC5cbiAqIEBkb2Mge2hlYWRpbmc6ICdUZW5zb3JzJywgc3ViaGVhZGluZzogJ0NsYXNzZXMnfVxuICovXG5nZXRHbG9iYWxUZW5zb3JDbGFzcygpLnByb3RvdHlwZS5hczFEID0gZnVuY3Rpb248VCBleHRlbmRzIFRlbnNvcj4oKTogVCB7XG4gIHRoaXMudGhyb3dJZkRpc3Bvc2VkKCk7XG4gIHJldHVybiByZXNoYXBlKHRoaXMsIFt0aGlzLnNpemVdKSBhcyBUO1xufTtcbiJdfQ==","/**\n * @license\n * Copyright 2020 Google LLC. All Rights Reserved.\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n * =============================================================================\n */\nimport { reshape } from '../../ops/reshape';\nimport { getGlobalTensorClass } from '../../tensor';\n/**\n * Converts a `tf.Tensor` to a `tf.Tensor2D`.\n *\n * @param rows Number of rows in `tf.Tensor2D`.\n * @param columns Number of columns in `tf.Tensor2D`.\n * @doc {heading: 'Tensors', subheading: 'Classes'}\n */\ngetGlobalTensorClass().prototype.as2D = function (rows, columns) {\n this.throwIfDisposed();\n return reshape(this, [rows, columns]);\n};\n//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYXMyZC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uLy4uLy4uL3RmanMtY29yZS9zcmMvcHVibGljL2NoYWluZWRfb3BzL2FzMmQudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUE7Ozs7Ozs7Ozs7Ozs7OztHQWVHO0FBRUgsT0FBTyxFQUFDLE9BQU8sRUFBQyxNQUFNLG1CQUFtQixDQUFDO0FBQzFDLE9BQU8sRUFBQyxvQkFBb0IsRUFBUyxNQUFNLGNBQWMsQ0FBQztBQVMxRDs7Ozs7O0dBTUc7QUFDSCxvQkFBb0IsRUFBRSxDQUFDLFNBQVMsQ0FBQyxJQUFJLEdBQUcsVUFDcEMsSUFBWSxFQUFFLE9BQWU7SUFDL0IsSUFBSSxDQUFDLGVBQWUsRUFBRSxDQUFDO0lBQ3ZCLE9BQU8sT0FBTyxDQUFDLElBQUksRUFBRSxDQUFDLElBQUksRUFBRSxPQUFPLENBQUMsQ0FBTSxDQUFDO0FBQzdDLENBQUMsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbIi8qKlxuICogQGxpY2Vuc2VcbiAqIENvcHlyaWdodCAyMDIwIEdvb2dsZSBMTEMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuXG4gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgXCJMaWNlbnNlXCIpO1xuICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLlxuICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0XG4gKlxuICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wXG4gKlxuICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZVxuICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gXCJBUyBJU1wiIEJBU0lTLFxuICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuXG4gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kXG4gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS5cbiAqID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4gKi9cblxuaW1wb3J0IHtyZXNoYXBlfSBmcm9tICcuLi8uLi9vcHMvcmVzaGFwZSc7XG5pbXBvcnQge2dldEdsb2JhbFRlbnNvckNsYXNzLCBUZW5zb3J9IGZyb20gJy4uLy4uL3RlbnNvcic7XG5pbXBvcnQge1Jhbmt9IGZyb20gJy4uLy4uL3R5cGVzJztcblxuZGVjbGFyZSBtb2R1bGUgJy4uLy4uL3RlbnNvcicge1xuICBpbnRlcmZhY2UgVGVuc29yPFIgZXh0ZW5kcyBSYW5rID0gUmFuaz4ge1xuICAgIGFzMkQ8VCBleHRlbmRzIFRlbnNvcj4ocm93czogbnVtYmVyLCBjb2x1bW5zOiBudW1iZXIpOiBUZW5zb3IyRDtcbiAgfVxufVxuXG4vKipcbiAqIENvbnZlcnRzIGEgYHRmLlRlbnNvcmAgdG8gYSBgdGYuVGVuc29yMkRgLlxuICpcbiAqIEBwYXJhbSByb3dzIE51bWJlciBvZiByb3dzIGluIGB0Zi5UZW5zb3IyRGAuXG4gKiBAcGFyYW0gY29sdW1ucyBOdW1iZXIgb2YgY29sdW1ucyBpbiBgdGYuVGVuc29yMkRgLlxuICogQGRvYyB7aGVhZGluZzogJ1RlbnNvcnMnLCBzdWJoZWFkaW5nOiAnQ2xhc3Nlcyd9XG4gKi9cbmdldEdsb2JhbFRlbnNvckNsYXNzKCkucHJvdG90eXBlLmFzMkQgPSBmdW5jdGlvbjxUIGV4dGVuZHMgVGVuc29yPihcbiAgICByb3dzOiBudW1iZXIsIGNvbHVtbnM6IG51bWJlcik6IFQge1xuICB0aGlzLnRocm93SWZEaXNwb3NlZCgpO1xuICByZXR1cm4gcmVzaGFwZSh0aGlzLCBbcm93cywgY29sdW1uc10pIGFzIFQ7XG59O1xuIl19","/**\n * @license\n * Copyright 2020 Google LLC. All Rights Reserved.\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n * =============================================================================\n */\nimport { reshape } from '../../ops/reshape';\nimport { getGlobalTensorClass } from '../../tensor';\n/**\n * Converts a `tf.Tensor` to a `tf.Tensor3D`.\n *\n * @param rows Number of rows in `tf.Tensor3D`.\n * @param columns Number of columns in `tf.Tensor3D`.\n * @param depth Depth of `tf.Tensor3D`.\n * @doc {heading: 'Tensors', subheading: 'Classes'}\n */\ngetGlobalTensorClass().prototype.as3D = function (rows, columns, depth) {\n this.throwIfDisposed();\n return reshape(this, [rows, columns, depth]);\n};\n//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYXMzZC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uLy4uLy4uL3RmanMtY29yZS9zcmMvcHVibGljL2NoYWluZWRfb3BzL2FzM2QudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUE7Ozs7Ozs7Ozs7Ozs7OztHQWVHO0FBRUgsT0FBTyxFQUFDLE9BQU8sRUFBQyxNQUFNLG1CQUFtQixDQUFDO0FBQzFDLE9BQU8sRUFBQyxvQkFBb0IsRUFBUyxNQUFNLGNBQWMsQ0FBQztBQVUxRDs7Ozs7OztHQU9HO0FBQ0gsb0JBQW9CLEVBQUUsQ0FBQyxTQUFTLENBQUMsSUFBSSxHQUFHLFVBQ3BDLElBQVksRUFBRSxPQUFlLEVBQUUsS0FBYTtJQUM5QyxJQUFJLENBQUMsZUFBZSxFQUFFLENBQUM7SUFDdkIsT0FBTyxPQUFPLENBQUMsSUFBSSxFQUFFLENBQUMsSUFBSSxFQUFFLE9BQU8sRUFBRSxLQUFLLENBQUMsQ0FBTSxDQUFDO0FBQ3BELENBQUMsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbIi8qKlxuICogQGxpY2Vuc2VcbiAqIENvcHlyaWdodCAyMDIwIEdvb2dsZSBMTEMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuXG4gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgXCJMaWNlbnNlXCIpO1xuICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLlxuICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0XG4gKlxuICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wXG4gKlxuICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZVxuICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gXCJBUyBJU1wiIEJBU0lTLFxuICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuXG4gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kXG4gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS5cbiAqID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4gKi9cblxuaW1wb3J0IHtyZXNoYXBlfSBmcm9tICcuLi8uLi9vcHMvcmVzaGFwZSc7XG5pbXBvcnQge2dldEdsb2JhbFRlbnNvckNsYXNzLCBUZW5zb3J9IGZyb20gJy4uLy4uL3RlbnNvcic7XG5pbXBvcnQge1Jhbmt9IGZyb20gJy4uLy4uL3R5cGVzJztcblxuZGVjbGFyZSBtb2R1bGUgJy4uLy4uL3RlbnNvcicge1xuICBpbnRlcmZhY2UgVGVuc29yPFIgZXh0ZW5kcyBSYW5rID0gUmFuaz4ge1xuICAgIGFzM0Q8VCBleHRlbmRzIFRlbnNvcj4ocm93czogbnVtYmVyLCBjb2x1bW5zOiBudW1iZXIsIGRlcHRoOiBudW1iZXIpOlxuICAgICAgICBUZW5zb3IzRDtcbiAgfVxufVxuXG4vKipcbiAqIENvbnZlcnRzIGEgYHRmLlRlbnNvcmAgdG8gYSBgdGYuVGVuc29yM0RgLlxuICpcbiAqIEBwYXJhbSByb3dzIE51bWJlciBvZiByb3dzIGluIGB0Zi5UZW5zb3IzRGAuXG4gKiBAcGFyYW0gY29sdW1ucyBOdW1iZXIgb2YgY29sdW1ucyBpbiBgdGYuVGVuc29yM0RgLlxuICogQHBhcmFtIGRlcHRoIERlcHRoIG9mIGB0Zi5UZW5zb3IzRGAuXG4gKiBAZG9jIHtoZWFkaW5nOiAnVGVuc29ycycsIHN1YmhlYWRpbmc6ICdDbGFzc2VzJ31cbiAqL1xuZ2V0R2xvYmFsVGVuc29yQ2xhc3MoKS5wcm90b3R5cGUuYXMzRCA9IGZ1bmN0aW9uPFQgZXh0ZW5kcyBUZW5zb3I+KFxuICAgIHJvd3M6IG51bWJlciwgY29sdW1uczogbnVtYmVyLCBkZXB0aDogbnVtYmVyKTogVCB7XG4gIHRoaXMudGhyb3dJZkRpc3Bvc2VkKCk7XG4gIHJldHVybiByZXNoYXBlKHRoaXMsIFtyb3dzLCBjb2x1bW5zLCBkZXB0aF0pIGFzIFQ7XG59O1xuIl19","/**\n * @license\n * Copyright 2020 Google LLC. All Rights Reserved.\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n * =============================================================================\n */\nimport { reshape } from '../../ops/reshape';\nimport { getGlobalTensorClass } from '../../tensor';\n/**\n * Converts a `tf.Tensor` to a `tf.Tensor4D`.\n *\n * @param rows Number of rows in `tf.Tensor4D`.\n * @param columns Number of columns in `tf.Tensor4D`.\n * @param depth Depth of `tf.Tensor4D`.\n * @param depth2 4th dimension of `tf.Tensor4D`.\n * @doc {heading: 'Tensors', subheading: 'Classes'}\n */\ngetGlobalTensorClass().prototype.as4D = function (rows, columns, depth, depth2) {\n this.throwIfDisposed();\n return reshape(this, [rows, columns, depth, depth2]);\n};\n//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYXM0ZC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uLy4uLy4uL3RmanMtY29yZS9zcmMvcHVibGljL2NoYWluZWRfb3BzL2FzNGQudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUE7Ozs7Ozs7Ozs7Ozs7OztHQWVHO0FBRUgsT0FBTyxFQUFDLE9BQU8sRUFBQyxNQUFNLG1CQUFtQixDQUFDO0FBQzFDLE9BQU8sRUFBQyxvQkFBb0IsRUFBUyxNQUFNLGNBQWMsQ0FBQztBQVUxRDs7Ozs7Ozs7R0FRRztBQUNILG9CQUFvQixFQUFFLENBQUMsU0FBUyxDQUFDLElBQUksR0FBRyxVQUNwQyxJQUFZLEVBQUUsT0FBZSxFQUFFLEtBQWEsRUFBRSxNQUFjO0lBQzlELElBQUksQ0FBQyxlQUFlLEVBQUUsQ0FBQztJQUN2QixPQUFPLE9BQU8sQ0FBQyxJQUFJLEVBQUUsQ0FBQyxJQUFJLEVBQUUsT0FBTyxFQUFFLEtBQUssRUFBRSxNQUFNLENBQUMsQ0FBTSxDQUFDO0FBQzVELENBQUMsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbIi8qKlxuICogQGxpY2Vuc2VcbiAqIENvcHlyaWdodCAyMDIwIEdvb2dsZSBMTEMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuXG4gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgXCJMaWNlbnNlXCIpO1xuICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLlxuICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0XG4gKlxuICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wXG4gKlxuICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZVxuICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gXCJBUyBJU1wiIEJBU0lTLFxuICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuXG4gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kXG4gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS5cbiAqID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4gKi9cblxuaW1wb3J0IHtyZXNoYXBlfSBmcm9tICcuLi8uLi9vcHMvcmVzaGFwZSc7XG5pbXBvcnQge2dldEdsb2JhbFRlbnNvckNsYXNzLCBUZW5zb3J9IGZyb20gJy4uLy4uL3RlbnNvcic7XG5pbXBvcnQge1Jhbmt9IGZyb20gJy4uLy4uL3R5cGVzJztcblxuZGVjbGFyZSBtb2R1bGUgJy4uLy4uL3RlbnNvcicge1xuICBpbnRlcmZhY2UgVGVuc29yPFIgZXh0ZW5kcyBSYW5rID0gUmFuaz4ge1xuICAgIGFzNEQ8VCBleHRlbmRzIFRlbnNvcj4oXG4gICAgICAgIHJvd3M6IG51bWJlciwgY29sdW1uczogbnVtYmVyLCBkZXB0aDogbnVtYmVyLCBkZXB0aDI6IG51bWJlcik6IFRlbnNvcjREO1xuICB9XG59XG5cbi8qKlxuICogQ29udmVydHMgYSBgdGYuVGVuc29yYCB0byBhIGB0Zi5UZW5zb3I0RGAuXG4gKlxuICogQHBhcmFtIHJvd3MgTnVtYmVyIG9mIHJvd3MgaW4gYHRmLlRlbnNvcjREYC5cbiAqIEBwYXJhbSBjb2x1bW5zIE51bWJlciBvZiBjb2x1bW5zIGluIGB0Zi5UZW5zb3I0RGAuXG4gKiBAcGFyYW0gZGVwdGggRGVwdGggb2YgYHRmLlRlbnNvcjREYC5cbiAqIEBwYXJhbSBkZXB0aDIgNHRoIGRpbWVuc2lvbiBvZiBgdGYuVGVuc29yNERgLlxuICogQGRvYyB7aGVhZGluZzogJ1RlbnNvcnMnLCBzdWJoZWFkaW5nOiAnQ2xhc3Nlcyd9XG4gKi9cbmdldEdsb2JhbFRlbnNvckNsYXNzKCkucHJvdG90eXBlLmFzNEQgPSBmdW5jdGlvbjxUIGV4dGVuZHMgVGVuc29yPihcbiAgICByb3dzOiBudW1iZXIsIGNvbHVtbnM6IG51bWJlciwgZGVwdGg6IG51bWJlciwgZGVwdGgyOiBudW1iZXIpOiBUIHtcbiAgdGhpcy50aHJvd0lmRGlzcG9zZWQoKTtcbiAgcmV0dXJuIHJlc2hhcGUodGhpcywgW3Jvd3MsIGNvbHVtbnMsIGRlcHRoLCBkZXB0aDJdKSBhcyBUO1xufTtcbiJdfQ==","/**\n * @license\n * Copyright 2020 Google LLC. All Rights Reserved.\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n * =============================================================================\n */\nimport { reshape } from '../../ops/reshape';\nimport { getGlobalTensorClass } from '../../tensor';\n/**\n * Converts a `tf.Tensor` to a `tf.Tensor5D`.\n *\n * @param rows Number of rows in `tf.Tensor5D`.\n * @param columns Number of columns in `tf.Tensor5D`.\n * @param depth Depth of `tf.Tensor5D`.\n * @param depth2 4th dimension of `tf.Tensor5D`.\n * @param depth3 5th dimension of 'tf.Tensor5D'\n *\n * @doc {heading: 'Tensors', subheading: 'Classes'}\n */\ngetGlobalTensorClass().prototype.as5D = function (rows, columns, depth, depth2, depth3) {\n this.throwIfDisposed();\n return reshape(this, [rows, columns, depth, depth2, depth3]);\n};\n//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYXM1ZC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uLy4uLy4uL3RmanMtY29yZS9zcmMvcHVibGljL2NoYWluZWRfb3BzL2FzNWQudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUE7Ozs7Ozs7Ozs7Ozs7OztHQWVHO0FBRUgsT0FBTyxFQUFDLE9BQU8sRUFBQyxNQUFNLG1CQUFtQixDQUFDO0FBQzFDLE9BQU8sRUFBQyxvQkFBb0IsRUFBUyxNQUFNLGNBQWMsQ0FBQztBQVcxRDs7Ozs7Ozs7OztHQVVHO0FBQ0gsb0JBQW9CLEVBQUUsQ0FBQyxTQUFTLENBQUMsSUFBSSxHQUFHLFVBQ3BDLElBQVksRUFBRSxPQUFlLEVBQUUsS0FBYSxFQUFFLE1BQWMsRUFDNUQsTUFBYztJQUNoQixJQUFJLENBQUMsZUFBZSxFQUFFLENBQUM7SUFDdkIsT0FBTyxPQUFPLENBQUMsSUFBSSxFQUFFLENBQUMsSUFBSSxFQUFFLE9BQU8sRUFBRSxLQUFLLEVBQUUsTUFBTSxFQUFFLE1BQU0sQ0FBQyxDQUFNLENBQUM7QUFDcEUsQ0FBQyxDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiLyoqXG4gKiBAbGljZW5zZVxuICogQ29weXJpZ2h0IDIwMjAgR29vZ2xlIExMQy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC5cbiAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSBcIkxpY2Vuc2VcIik7XG4gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuXG4gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXRcbiAqXG4gKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjBcbiAqXG4gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlXG4gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiBcIkFTIElTXCIgQkFTSVMsXG4gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC5cbiAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmRcbiAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLlxuICogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbiAqL1xuXG5pbXBvcnQge3Jlc2hhcGV9IGZyb20gJy4uLy4uL29wcy9yZXNoYXBlJztcbmltcG9ydCB7Z2V0R2xvYmFsVGVuc29yQ2xhc3MsIFRlbnNvcn0gZnJvbSAnLi4vLi4vdGVuc29yJztcbmltcG9ydCB7UmFua30gZnJvbSAnLi4vLi4vdHlwZXMnO1xuXG5kZWNsYXJlIG1vZHVsZSAnLi4vLi4vdGVuc29yJyB7XG4gIGludGVyZmFjZSBUZW5zb3I8UiBleHRlbmRzIFJhbmsgPSBSYW5rPiB7XG4gICAgYXM1RDxUIGV4dGVuZHMgVGVuc29yPihcbiAgICAgICAgcm93czogbnVtYmVyLCBjb2x1bW5zOiBudW1iZXIsIGRlcHRoOiBudW1iZXIsIGRlcHRoMjogbnVtYmVyLFxuICAgICAgICBkZXB0aDM6IG51bWJlcik6IFRlbnNvcjVEO1xuICB9XG59XG5cbi8qKlxuICogQ29udmVydHMgYSBgdGYuVGVuc29yYCB0byBhIGB0Zi5UZW5zb3I1RGAuXG4gKlxuICogQHBhcmFtIHJvd3MgTnVtYmVyIG9mIHJvd3MgaW4gYHRmLlRlbnNvcjVEYC5cbiAqIEBwYXJhbSBjb2x1bW5zIE51bWJlciBvZiBjb2x1bW5zIGluIGB0Zi5UZW5zb3I1RGAuXG4gKiBAcGFyYW0gZGVwdGggRGVwdGggb2YgYHRmLlRlbnNvcjVEYC5cbiAqIEBwYXJhbSBkZXB0aDIgNHRoIGRpbWVuc2lvbiBvZiBgdGYuVGVuc29yNURgLlxuICogQHBhcmFtIGRlcHRoMyA1dGggZGltZW5zaW9uIG9mICd0Zi5UZW5zb3I1RCdcbiAqXG4gKiBAZG9jIHtoZWFkaW5nOiAnVGVuc29ycycsIHN1YmhlYWRpbmc6ICdDbGFzc2VzJ31cbiAqL1xuZ2V0R2xvYmFsVGVuc29yQ2xhc3MoKS5wcm90b3R5cGUuYXM1RCA9IGZ1bmN0aW9uPFQgZXh0ZW5kcyBUZW5zb3I+KFxuICAgIHJvd3M6IG51bWJlciwgY29sdW1uczogbnVtYmVyLCBkZXB0aDogbnVtYmVyLCBkZXB0aDI6IG51bWJlcixcbiAgICBkZXB0aDM6IG51bWJlcik6IFQge1xuICB0aGlzLnRocm93SWZEaXNwb3NlZCgpO1xuICByZXR1cm4gcmVzaGFwZSh0aGlzLCBbcm93cywgY29sdW1ucywgZGVwdGgsIGRlcHRoMiwgZGVwdGgzXSkgYXMgVDtcbn07XG4iXX0=","/**\n * @license\n * Copyright 2020 Google LLC. All Rights Reserved.\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n * =============================================================================\n */\n// TODO update import path once op is modularized.\nimport { asin } from '../../ops/ops';\nimport { getGlobalTensorClass } from '../../tensor';\ngetGlobalTensorClass().prototype.asin = function () {\n this.throwIfDisposed();\n return asin(this);\n};\n//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYXNpbi5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uLy4uLy4uL3RmanMtY29yZS9zcmMvcHVibGljL2NoYWluZWRfb3BzL2FzaW4udHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUE7Ozs7Ozs7Ozs7Ozs7OztHQWVHO0FBRUgsa0RBQWtEO0FBQ2xELE9BQU8sRUFBQyxJQUFJLEVBQUMsTUFBTSxlQUFlLENBQUM7QUFDbkMsT0FBTyxFQUFDLG9CQUFvQixFQUFTLE1BQU0sY0FBYyxDQUFDO0FBUzFELG9CQUFvQixFQUFFLENBQUMsU0FBUyxDQUFDLElBQUksR0FBRztJQUN0QyxJQUFJLENBQUMsZUFBZSxFQUFFLENBQUM7SUFDdkIsT0FBTyxJQUFJLENBQUMsSUFBSSxDQUFDLENBQUM7QUFDcEIsQ0FBQyxDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiLyoqXG4gKiBAbGljZW5zZVxuICogQ29weXJpZ2h0IDIwMjAgR29vZ2xlIExMQy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC5cbiAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSBcIkxpY2Vuc2VcIik7XG4gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuXG4gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXRcbiAqXG4gKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjBcbiAqXG4gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlXG4gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiBcIkFTIElTXCIgQkFTSVMsXG4gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC5cbiAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmRcbiAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLlxuICogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbiAqL1xuXG4vLyBUT0RPIHVwZGF0ZSBpbXBvcnQgcGF0aCBvbmNlIG9wIGlzIG1vZHVsYXJpemVkLlxuaW1wb3J0IHthc2lufSBmcm9tICcuLi8uLi9vcHMvb3BzJztcbmltcG9ydCB7Z2V0R2xvYmFsVGVuc29yQ2xhc3MsIFRlbnNvcn0gZnJvbSAnLi4vLi4vdGVuc29yJztcbmltcG9ydCB7UmFua30gZnJvbSAnLi4vLi4vdHlwZXMnO1xuXG5kZWNsYXJlIG1vZHVsZSAnLi4vLi4vdGVuc29yJyB7XG4gIGludGVyZmFjZSBUZW5zb3I8UiBleHRlbmRzIFJhbmsgPSBSYW5rPiB7XG4gICAgYXNpbjxUIGV4dGVuZHMgVGVuc29yPih0aGlzOiBUKTogVDtcbiAgfVxufVxuXG5nZXRHbG9iYWxUZW5zb3JDbGFzcygpLnByb3RvdHlwZS5hc2luID0gZnVuY3Rpb248VCBleHRlbmRzIFRlbnNvcj4odGhpczogVCk6IFQge1xuICB0aGlzLnRocm93SWZEaXNwb3NlZCgpO1xuICByZXR1cm4gYXNpbih0aGlzKTtcbn07XG4iXX0=","/**\n * @license\n * Copyright 2020 Google LLC. All Rights Reserved.\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n * =============================================================================\n */\n// TODO update import path once op is modularized.\nimport { asinh } from '../../ops/ops';\nimport { getGlobalTensorClass } from '../../tensor';\ngetGlobalTensorClass().prototype.asinh = function () {\n this.throwIfDisposed();\n return asinh(this);\n};\n//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYXNpbmguanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi8uLi8uLi90ZmpzLWNvcmUvc3JjL3B1YmxpYy9jaGFpbmVkX29wcy9hc2luaC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQTs7Ozs7Ozs7Ozs7Ozs7O0dBZUc7QUFFSCxrREFBa0Q7QUFDbEQsT0FBTyxFQUFDLEtBQUssRUFBQyxNQUFNLGVBQWUsQ0FBQztBQUNwQyxPQUFPLEVBQUMsb0JBQW9CLEVBQVMsTUFBTSxjQUFjLENBQUM7QUFTMUQsb0JBQW9CLEVBQUUsQ0FBQyxTQUFTLENBQUMsS0FBSyxHQUFHO0lBRXZDLElBQUksQ0FBQyxlQUFlLEVBQUUsQ0FBQztJQUN2QixPQUFPLEtBQUssQ0FBQyxJQUFJLENBQUMsQ0FBQztBQUNyQixDQUFDLENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyIvKipcbiAqIEBsaWNlbnNlXG4gKiBDb3B5cmlnaHQgMjAyMCBHb29nbGUgTExDLiBBbGwgUmlnaHRzIFJlc2VydmVkLlxuICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlIFwiTGljZW5zZVwiKTtcbiAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS5cbiAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdFxuICpcbiAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMFxuICpcbiAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmVcbiAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuIFwiQVMgSVNcIiBCQVNJUyxcbiAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLlxuICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZFxuICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuXG4gKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuICovXG5cbi8vIFRPRE8gdXBkYXRlIGltcG9ydCBwYXRoIG9uY2Ugb3AgaXMgbW9kdWxhcml6ZWQuXG5pbXBvcnQge2FzaW5ofSBmcm9tICcuLi8uLi9vcHMvb3BzJztcbmltcG9ydCB7Z2V0R2xvYmFsVGVuc29yQ2xhc3MsIFRlbnNvcn0gZnJvbSAnLi4vLi4vdGVuc29yJztcbmltcG9ydCB7UmFua30gZnJvbSAnLi4vLi4vdHlwZXMnO1xuXG5kZWNsYXJlIG1vZHVsZSAnLi4vLi4vdGVuc29yJyB7XG4gIGludGVyZmFjZSBUZW5zb3I8UiBleHRlbmRzIFJhbmsgPSBSYW5rPiB7XG4gICAgYXNpbmg8VCBleHRlbmRzIFRlbnNvcj4odGhpczogVCk6IFQ7XG4gIH1cbn1cblxuZ2V0R2xvYmFsVGVuc29yQ2xhc3MoKS5wcm90b3R5cGUuYXNpbmggPSBmdW5jdGlvbjxUIGV4dGVuZHMgVGVuc29yPih0aGlzOiBUKTpcbiAgICBUIHtcbiAgdGhpcy50aHJvd0lmRGlzcG9zZWQoKTtcbiAgcmV0dXJuIGFzaW5oKHRoaXMpO1xufTtcbiJdfQ==","/**\n * @license\n * Copyright 2020 Google LLC. All Rights Reserved.\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n * =============================================================================\n */\n// TODO update import path once op is modularized.\nimport { atan } from '../../ops/ops';\nimport { getGlobalTensorClass } from '../../tensor';\ngetGlobalTensorClass().prototype.atan = function () {\n this.throwIfDisposed();\n return atan(this);\n};\n//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYXRhbi5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uLy4uLy4uL3RmanMtY29yZS9zcmMvcHVibGljL2NoYWluZWRfb3BzL2F0YW4udHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUE7Ozs7Ozs7Ozs7Ozs7OztHQWVHO0FBRUgsa0RBQWtEO0FBQ2xELE9BQU8sRUFBQyxJQUFJLEVBQUMsTUFBTSxlQUFlLENBQUM7QUFDbkMsT0FBTyxFQUFDLG9CQUFvQixFQUFTLE1BQU0sY0FBYyxDQUFDO0FBUzFELG9CQUFvQixFQUFFLENBQUMsU0FBUyxDQUFDLElBQUksR0FBRztJQUN0QyxJQUFJLENBQUMsZUFBZSxFQUFFLENBQUM7SUFDdkIsT0FBTyxJQUFJLENBQUMsSUFBSSxDQUFDLENBQUM7QUFDcEIsQ0FBQyxDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiLyoqXG4gKiBAbGljZW5zZVxuICogQ29weXJpZ2h0IDIwMjAgR29vZ2xlIExMQy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC5cbiAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSBcIkxpY2Vuc2VcIik7XG4gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuXG4gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXRcbiAqXG4gKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjBcbiAqXG4gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlXG4gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiBcIkFTIElTXCIgQkFTSVMsXG4gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC5cbiAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmRcbiAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLlxuICogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbiAqL1xuXG4vLyBUT0RPIHVwZGF0ZSBpbXBvcnQgcGF0aCBvbmNlIG9wIGlzIG1vZHVsYXJpemVkLlxuaW1wb3J0IHthdGFufSBmcm9tICcuLi8uLi9vcHMvb3BzJztcbmltcG9ydCB7Z2V0R2xvYmFsVGVuc29yQ2xhc3MsIFRlbnNvcn0gZnJvbSAnLi4vLi4vdGVuc29yJztcbmltcG9ydCB7UmFua30gZnJvbSAnLi4vLi4vdHlwZXMnO1xuXG5kZWNsYXJlIG1vZHVsZSAnLi4vLi4vdGVuc29yJyB7XG4gIGludGVyZmFjZSBUZW5zb3I8UiBleHRlbmRzIFJhbmsgPSBSYW5rPiB7XG4gICAgYXRhbjxUIGV4dGVuZHMgVGVuc29yPih0aGlzOiBUKTogVDtcbiAgfVxufVxuXG5nZXRHbG9iYWxUZW5zb3JDbGFzcygpLnByb3RvdHlwZS5hdGFuID0gZnVuY3Rpb248VCBleHRlbmRzIFRlbnNvcj4odGhpczogVCk6IFQge1xuICB0aGlzLnRocm93SWZEaXNwb3NlZCgpO1xuICByZXR1cm4gYXRhbih0aGlzKTtcbn07XG4iXX0=","/**\n * @license\n * Copyright 2020 Google LLC. All Rights Reserved.\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n * =============================================================================\n */\nimport { atan2 } from '../../ops/atan2';\nimport { getGlobalTensorClass } from '../../tensor';\ngetGlobalTensorClass().prototype.atan2 = function (b) {\n this.throwIfDisposed();\n return atan2(this, b);\n};\n//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYXRhbjIuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi8uLi8uLi90ZmpzLWNvcmUvc3JjL3B1YmxpYy9jaGFpbmVkX29wcy9hdGFuMi50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQTs7Ozs7Ozs7Ozs7Ozs7O0dBZUc7QUFDSCxPQUFPLEVBQUMsS0FBSyxFQUFDLE1BQU0saUJBQWlCLENBQUM7QUFDdEMsT0FBTyxFQUFDLG9CQUFvQixFQUFTLE1BQU0sY0FBYyxDQUFDO0FBUzFELG9CQUFvQixFQUFFLENBQUMsU0FBUyxDQUFDLEtBQUssR0FBRyxVQUNyQyxDQUFvQjtJQUN0QixJQUFJLENBQUMsZUFBZSxFQUFFLENBQUM7SUFDdkIsT0FBTyxLQUFLLENBQUMsSUFBSSxFQUFFLENBQUMsQ0FBQyxDQUFDO0FBQ3hCLENBQUMsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbIi8qKlxuICogQGxpY2Vuc2VcbiAqIENvcHlyaWdodCAyMDIwIEdvb2dsZSBMTEMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuXG4gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgXCJMaWNlbnNlXCIpO1xuICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLlxuICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0XG4gKlxuICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wXG4gKlxuICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZVxuICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gXCJBUyBJU1wiIEJBU0lTLFxuICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuXG4gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kXG4gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS5cbiAqID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4gKi9cbmltcG9ydCB7YXRhbjJ9IGZyb20gJy4uLy4uL29wcy9hdGFuMic7XG5pbXBvcnQge2dldEdsb2JhbFRlbnNvckNsYXNzLCBUZW5zb3J9IGZyb20gJy4uLy4uL3RlbnNvcic7XG5pbXBvcnQge1JhbmssIFRlbnNvckxpa2V9IGZyb20gJy4uLy4uL3R5cGVzJztcblxuZGVjbGFyZSBtb2R1bGUgJy4uLy4uL3RlbnNvcicge1xuICBpbnRlcmZhY2UgVGVuc29yPFIgZXh0ZW5kcyBSYW5rID0gUmFuaz4ge1xuICAgIGF0YW4yPFQgZXh0ZW5kcyBUZW5zb3I+KGI6IFRlbnNvcnxUZW5zb3JMaWtlKTogVDtcbiAgfVxufVxuXG5nZXRHbG9iYWxUZW5zb3JDbGFzcygpLnByb3RvdHlwZS5hdGFuMiA9IGZ1bmN0aW9uPFQgZXh0ZW5kcyBUZW5zb3I+KFxuICAgIGI6IFRlbnNvcnxUZW5zb3JMaWtlKTogVCB7XG4gIHRoaXMudGhyb3dJZkRpc3Bvc2VkKCk7XG4gIHJldHVybiBhdGFuMih0aGlzLCBiKTtcbn07XG4iXX0=","/**\n * @license\n * Copyright 2020 Google LLC. All Rights Reserved.\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n * =============================================================================\n */\n// TODO update import path once op is modularized.\nimport { atanh } from '../../ops/ops';\nimport { getGlobalTensorClass } from '../../tensor';\ngetGlobalTensorClass().prototype.atanh = function () {\n this.throwIfDisposed();\n return atanh(this);\n};\n//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYXRhbmguanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi8uLi8uLi90ZmpzLWNvcmUvc3JjL3B1YmxpYy9jaGFpbmVkX29wcy9hdGFuaC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQTs7Ozs7Ozs7Ozs7Ozs7O0dBZUc7QUFFSCxrREFBa0Q7QUFDbEQsT0FBTyxFQUFDLEtBQUssRUFBQyxNQUFNLGVBQWUsQ0FBQztBQUNwQyxPQUFPLEVBQUMsb0JBQW9CLEVBQVMsTUFBTSxjQUFjLENBQUM7QUFTMUQsb0JBQW9CLEVBQUUsQ0FBQyxTQUFTLENBQUMsS0FBSyxHQUFHO0lBRXZDLElBQUksQ0FBQyxlQUFlLEVBQUUsQ0FBQztJQUN2QixPQUFPLEtBQUssQ0FBQyxJQUFJLENBQUMsQ0FBQztBQUNyQixDQUFDLENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyIvKipcbiAqIEBsaWNlbnNlXG4gKiBDb3B5cmlnaHQgMjAyMCBHb29nbGUgTExDLiBBbGwgUmlnaHRzIFJlc2VydmVkLlxuICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlIFwiTGljZW5zZVwiKTtcbiAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS5cbiAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdFxuICpcbiAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMFxuICpcbiAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmVcbiAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuIFwiQVMgSVNcIiBCQVNJUyxcbiAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLlxuICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZFxuICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuXG4gKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuICovXG5cbi8vIFRPRE8gdXBkYXRlIGltcG9ydCBwYXRoIG9uY2Ugb3AgaXMgbW9kdWxhcml6ZWQuXG5pbXBvcnQge2F0YW5ofSBmcm9tICcuLi8uLi9vcHMvb3BzJztcbmltcG9ydCB7Z2V0R2xvYmFsVGVuc29yQ2xhc3MsIFRlbnNvcn0gZnJvbSAnLi4vLi4vdGVuc29yJztcbmltcG9ydCB7UmFua30gZnJvbSAnLi4vLi4vdHlwZXMnO1xuXG5kZWNsYXJlIG1vZHVsZSAnLi4vLi4vdGVuc29yJyB7XG4gIGludGVyZmFjZSBUZW5zb3I8UiBleHRlbmRzIFJhbmsgPSBSYW5rPiB7XG4gICAgYXRhbmg8VCBleHRlbmRzIFRlbnNvcj4odGhpczogVCk6IFQ7XG4gIH1cbn1cblxuZ2V0R2xvYmFsVGVuc29yQ2xhc3MoKS5wcm90b3R5cGUuYXRhbmggPSBmdW5jdGlvbjxUIGV4dGVuZHMgVGVuc29yPih0aGlzOiBUKTpcbiAgICBUIHtcbiAgdGhpcy50aHJvd0lmRGlzcG9zZWQoKTtcbiAgcmV0dXJuIGF0YW5oKHRoaXMpO1xufTtcbiJdfQ==","import { avgPool } from '../../ops/avg_pool';\nimport { getGlobalTensorClass } from '../../tensor';\ngetGlobalTensorClass().prototype.avgPool =\n function (filterSize, strides, pad, dimRoundingMode) {\n this.throwIfDisposed();\n return avgPool(this, filterSize, strides, pad, dimRoundingMode);\n };\n//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYXZnX3Bvb2wuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi8uLi8uLi90ZmpzLWNvcmUvc3JjL3B1YmxpYy9jaGFpbmVkX29wcy9hdmdfcG9vbC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFpQkEsT0FBTyxFQUFDLE9BQU8sRUFBQyxNQUFNLG9CQUFvQixDQUFDO0FBQzNDLE9BQU8sRUFBQyxvQkFBb0IsRUFBcUIsTUFBTSxjQUFjLENBQUM7QUFZdEUsb0JBQW9CLEVBQUUsQ0FBQyxTQUFTLENBQUMsT0FBTztJQUNwQyxVQUNhLFVBQW1DLEVBQzVDLE9BQWdDLEVBQ2hDLEdBQTBDLEVBQzFDLGVBQXdDO1FBQzlDLElBQUksQ0FBQyxlQUFlLEVBQUUsQ0FBQztRQUN2QixPQUFPLE9BQU8sQ0FBQyxJQUFJLEVBQUUsVUFBVSxFQUFFLE9BQU8sRUFBRSxHQUFHLEVBQUUsZUFBZSxDQUFDLENBQUM7SUFDbEUsQ0FBQyxDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiLyoqXG4gKiBAbGljZW5zZVxuICogQ29weXJpZ2h0IDIwMjAgR29vZ2xlIExMQy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC5cbiAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSBcIkxpY2Vuc2VcIik7XG4gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuXG4gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXRcbiAqXG4gKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjBcbiAqXG4gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlXG4gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiBcIkFTIElTXCIgQkFTSVMsXG4gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC5cbiAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmRcbiAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLlxuICogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbiAqL1xuaW1wb3J0IHtFeHBsaWNpdFBhZGRpbmd9IGZyb20gJy4uLy4uL29wcy9jb252X3V0aWwnO1xuaW1wb3J0IHthdmdQb29sfSBmcm9tICcuLi8uLi9vcHMvYXZnX3Bvb2wnO1xuaW1wb3J0IHtnZXRHbG9iYWxUZW5zb3JDbGFzcywgVGVuc29yM0QsIFRlbnNvcjREfSBmcm9tICcuLi8uLi90ZW5zb3InO1xuaW1wb3J0IHtSYW5rfSBmcm9tICcuLi8uLi90eXBlcyc7XG5cbmRlY2xhcmUgbW9kdWxlICcuLi8uLi90ZW5zb3InIHtcbiAgaW50ZXJmYWNlIFRlbnNvcjxSIGV4dGVuZHMgUmFuayA9IFJhbms+IHtcbiAgICBhdmdQb29sPFQgZXh0ZW5kcyBUZW5zb3IzRHxUZW5zb3I0RD4oXG4gICAgICAgIGZpbHRlclNpemU6IFtudW1iZXIsIG51bWJlcl18bnVtYmVyLCBzdHJpZGVzOiBbbnVtYmVyLCBudW1iZXJdfG51bWJlcixcbiAgICAgICAgcGFkOiAndmFsaWQnfCdzYW1lJ3xudW1iZXJ8RXhwbGljaXRQYWRkaW5nLFxuICAgICAgICBkaW1Sb3VuZGluZ01vZGU/OiAnZmxvb3InfCdyb3VuZCd8J2NlaWwnKTogVDtcbiAgfVxufVxuXG5nZXRHbG9iYWxUZW5zb3JDbGFzcygpLnByb3RvdHlwZS5hdmdQb29sID1cbiAgICBmdW5jdGlvbjxUIGV4dGVuZHMgVGVuc29yM0R8VGVuc29yNEQ+KFxuICAgICAgICB0aGlzOiBULCBmaWx0ZXJTaXplOiBbbnVtYmVyLCBudW1iZXJdfG51bWJlcixcbiAgICAgICAgc3RyaWRlczogW251bWJlciwgbnVtYmVyXXxudW1iZXIsXG4gICAgICAgIHBhZDogJ3ZhbGlkJ3wnc2FtZSd8bnVtYmVyfEV4cGxpY2l0UGFkZGluZyxcbiAgICAgICAgZGltUm91bmRpbmdNb2RlPzogJ2Zsb29yJ3wncm91bmQnfCdjZWlsJyk6IFQge1xuICB0aGlzLnRocm93SWZEaXNwb3NlZCgpO1xuICByZXR1cm4gYXZnUG9vbCh0aGlzLCBmaWx0ZXJTaXplLCBzdHJpZGVzLCBwYWQsIGRpbVJvdW5kaW5nTW9kZSk7XG59O1xuIl19","/**\n * @license\n * Copyright 2020 Google LLC. All Rights Reserved.\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n * =============================================================================\n */\nimport { batchToSpaceND } from '../../ops/batch_to_space_nd';\nimport { getGlobalTensorClass } from '../../tensor';\ngetGlobalTensorClass().prototype.batchToSpaceND = function (blockShape, crops) {\n this.throwIfDisposed();\n return batchToSpaceND(this, blockShape, crops);\n};\n//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYmF0Y2hfdG9fc3BhY2VfbmQuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi8uLi8uLi90ZmpzLWNvcmUvc3JjL3B1YmxpYy9jaGFpbmVkX29wcy9iYXRjaF90b19zcGFjZV9uZC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQTs7Ozs7Ozs7Ozs7Ozs7O0dBZUc7QUFDSCxPQUFPLEVBQUMsY0FBYyxFQUFDLE1BQU0sNkJBQTZCLENBQUM7QUFDM0QsT0FBTyxFQUFDLG9CQUFvQixFQUFTLE1BQU0sY0FBYyxDQUFDO0FBVTFELG9CQUFvQixFQUFFLENBQUMsU0FBUyxDQUFDLGNBQWMsR0FBRyxVQUM5QyxVQUFvQixFQUFFLEtBQWlCO0lBQ3pDLElBQUksQ0FBQyxlQUFlLEVBQUUsQ0FBQztJQUN2QixPQUFPLGNBQWMsQ0FBQyxJQUFJLEVBQUUsVUFBVSxFQUFFLEtBQUssQ0FBQyxDQUFDO0FBQ2pELENBQUMsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbIi8qKlxuICogQGxpY2Vuc2VcbiAqIENvcHlyaWdodCAyMDIwIEdvb2dsZSBMTEMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuXG4gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgXCJMaWNlbnNlXCIpO1xuICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLlxuICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0XG4gKlxuICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wXG4gKlxuICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZVxuICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gXCJBUyBJU1wiIEJBU0lTLFxuICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuXG4gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kXG4gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS5cbiAqID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4gKi9cbmltcG9ydCB7YmF0Y2hUb1NwYWNlTkR9IGZyb20gJy4uLy4uL29wcy9iYXRjaF90b19zcGFjZV9uZCc7XG5pbXBvcnQge2dldEdsb2JhbFRlbnNvckNsYXNzLCBUZW5zb3J9IGZyb20gJy4uLy4uL3RlbnNvcic7XG5pbXBvcnQge1Jhbmt9IGZyb20gJy4uLy4uL3R5cGVzJztcblxuZGVjbGFyZSBtb2R1bGUgJy4uLy4uL3RlbnNvcicge1xuICBpbnRlcmZhY2UgVGVuc29yPFIgZXh0ZW5kcyBSYW5rID0gUmFuaz4ge1xuICAgIGJhdGNoVG9TcGFjZU5EPFIgZXh0ZW5kcyBSYW5rPihibG9ja1NoYXBlOiBudW1iZXJbXSwgY3JvcHM6IG51bWJlcltdW10pOlxuICAgICAgICBUZW5zb3I8Uj47XG4gIH1cbn1cblxuZ2V0R2xvYmFsVGVuc29yQ2xhc3MoKS5wcm90b3R5cGUuYmF0Y2hUb1NwYWNlTkQgPSBmdW5jdGlvbjxSIGV4dGVuZHMgUmFuaz4oXG4gICAgYmxvY2tTaGFwZTogbnVtYmVyW10sIGNyb3BzOiBudW1iZXJbXVtdKTogVGVuc29yPFI+IHtcbiAgdGhpcy50aHJvd0lmRGlzcG9zZWQoKTtcbiAgcmV0dXJuIGJhdGNoVG9TcGFjZU5EKHRoaXMsIGJsb2NrU2hhcGUsIGNyb3BzKTtcbn07XG4iXX0=","/**\n * @license\n * Copyright 2020 Google LLC. All Rights Reserved.\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n * =============================================================================\n */\nimport { batchNorm } from '../../ops/batchnorm';\nimport { getGlobalTensorClass } from '../../tensor';\ngetGlobalTensorClass().prototype.batchNorm = function (mean, variance, offset, scale, varianceEpsilon) {\n this.throwIfDisposed();\n return batchNorm(this, mean, variance, offset, scale, varianceEpsilon);\n};\n//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYmF0Y2hub3JtLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vLi4vLi4vdGZqcy1jb3JlL3NyYy9wdWJsaWMvY2hhaW5lZF9vcHMvYmF0Y2hub3JtLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBOzs7Ozs7Ozs7Ozs7Ozs7R0FlRztBQUNILE9BQU8sRUFBQyxTQUFTLEVBQUMsTUFBTSxxQkFBcUIsQ0FBQztBQUM5QyxPQUFPLEVBQUMsb0JBQW9CLEVBQW1CLE1BQU0sY0FBYyxDQUFDO0FBY3BFLG9CQUFvQixFQUFFLENBQUMsU0FBUyxDQUFDLFNBQVMsR0FBRyxVQUN6QyxJQUFtQyxFQUNuQyxRQUF1QyxFQUN2QyxNQUFzQyxFQUN0QyxLQUFxQyxFQUNyQyxlQUF3QjtJQUMxQixJQUFJLENBQUMsZUFBZSxFQUFFLENBQUM7SUFDdkIsT0FBTyxTQUFTLENBQUMsSUFBSSxFQUFFLElBQUksRUFBRSxRQUFRLEVBQUUsTUFBTSxFQUFFLEtBQUssRUFBRSxlQUFlLENBQUMsQ0FBQztBQUN6RSxDQUFDLENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyIvKipcbiAqIEBsaWNlbnNlXG4gKiBDb3B5cmlnaHQgMjAyMCBHb29nbGUgTExDLiBBbGwgUmlnaHRzIFJlc2VydmVkLlxuICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlIFwiTGljZW5zZVwiKTtcbiAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS5cbiAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdFxuICpcbiAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMFxuICpcbiAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmVcbiAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuIFwiQVMgSVNcIiBCQVNJUyxcbiAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLlxuICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZFxuICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuXG4gKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuICovXG5pbXBvcnQge2JhdGNoTm9ybX0gZnJvbSAnLi4vLi4vb3BzL2JhdGNobm9ybSc7XG5pbXBvcnQge2dldEdsb2JhbFRlbnNvckNsYXNzLCBUZW5zb3IsIFRlbnNvcjFEfSBmcm9tICcuLi8uLi90ZW5zb3InO1xuaW1wb3J0IHtSYW5rLCBUZW5zb3JMaWtlfSBmcm9tICcuLi8uLi90eXBlcyc7XG5cbmRlY2xhcmUgbW9kdWxlICcuLi8uLi90ZW5zb3InIHtcbiAgaW50ZXJmYWNlIFRlbnNvcjxSIGV4dGVuZHMgUmFuayA9IFJhbms+IHtcbiAgICBiYXRjaE5vcm08VCBleHRlbmRzIFRlbnNvcj4oXG4gICAgICAgIG1lYW46IFRlbnNvcjxSPnxUZW5zb3IxRHxUZW5zb3JMaWtlLFxuICAgICAgICB2YXJpYW5jZTogVGVuc29yPFI+fFRlbnNvcjFEfFRlbnNvckxpa2UsXG4gICAgICAgIG9mZnNldD86IFRlbnNvcjxSPnxUZW5zb3IxRHxUZW5zb3JMaWtlLFxuICAgICAgICBzY2FsZT86IFRlbnNvcjxSPnxUZW5zb3IxRHxUZW5zb3JMaWtlLFxuICAgICAgICB2YXJpYW5jZUVwc2lsb24/OiBudW1iZXIpOiBUZW5zb3I8Uj47XG4gIH1cbn1cblxuZ2V0R2xvYmFsVGVuc29yQ2xhc3MoKS5wcm90b3R5cGUuYmF0Y2hOb3JtID0gZnVuY3Rpb248UiBleHRlbmRzIFJhbms+KFxuICAgIG1lYW46IFRlbnNvcjxSPnxUZW5zb3IxRHxUZW5zb3JMaWtlLFxuICAgIHZhcmlhbmNlOiBUZW5zb3I8Uj58VGVuc29yMUR8VGVuc29yTGlrZSxcbiAgICBvZmZzZXQ/OiBUZW5zb3I8Uj58VGVuc29yMUR8VGVuc29yTGlrZSxcbiAgICBzY2FsZT86IFRlbnNvcjxSPnxUZW5zb3IxRHxUZW5zb3JMaWtlLFxuICAgIHZhcmlhbmNlRXBzaWxvbj86IG51bWJlcik6IFRlbnNvcjxSPiB7XG4gIHRoaXMudGhyb3dJZkRpc3Bvc2VkKCk7XG4gIHJldHVybiBiYXRjaE5vcm0odGhpcywgbWVhbiwgdmFyaWFuY2UsIG9mZnNldCwgc2NhbGUsIHZhcmlhbmNlRXBzaWxvbik7XG59O1xuIl19","/**\n * @license\n * Copyright 2020 Google LLC. All Rights Reserved.\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n * =============================================================================\n */\nimport { broadcastTo } from '../../ops/broadcast_to';\nimport { getGlobalTensorClass } from '../../tensor';\ngetGlobalTensorClass().prototype.broadcastTo = function (shape) {\n this.throwIfDisposed();\n return broadcastTo(this, shape);\n};\n//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYnJvYWRjYXN0X3RvLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vLi4vLi4vdGZqcy1jb3JlL3NyYy9wdWJsaWMvY2hhaW5lZF9vcHMvYnJvYWRjYXN0X3RvLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBOzs7Ozs7Ozs7Ozs7Ozs7R0FlRztBQUVILE9BQU8sRUFBQyxXQUFXLEVBQUMsTUFBTSx3QkFBd0IsQ0FBQztBQUNuRCxPQUFPLEVBQUMsb0JBQW9CLEVBQVMsTUFBTSxjQUFjLENBQUM7QUFTMUQsb0JBQW9CLEVBQUUsQ0FBQyxTQUFTLENBQUMsV0FBVyxHQUFHLFVBQzNDLEtBQWtCO0lBQ3BCLElBQUksQ0FBQyxlQUFlLEVBQUUsQ0FBQztJQUN2QixPQUFPLFdBQVcsQ0FBQyxJQUFJLEVBQUUsS0FBSyxDQUFDLENBQUM7QUFDbEMsQ0FBQyxDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiLyoqXG4gKiBAbGljZW5zZVxuICogQ29weXJpZ2h0IDIwMjAgR29vZ2xlIExMQy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC5cbiAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSBcIkxpY2Vuc2VcIik7XG4gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuXG4gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXRcbiAqXG4gKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjBcbiAqXG4gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlXG4gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiBcIkFTIElTXCIgQkFTSVMsXG4gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC5cbiAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmRcbiAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLlxuICogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbiAqL1xuXG5pbXBvcnQge2Jyb2FkY2FzdFRvfSBmcm9tICcuLi8uLi9vcHMvYnJvYWRjYXN0X3RvJztcbmltcG9ydCB7Z2V0R2xvYmFsVGVuc29yQ2xhc3MsIFRlbnNvcn0gZnJvbSAnLi4vLi4vdGVuc29yJztcbmltcG9ydCB7UmFuaywgU2hhcGVNYXB9IGZyb20gJy4uLy4uL3R5cGVzJztcblxuZGVjbGFyZSBtb2R1bGUgJy4uLy4uL3RlbnNvcicge1xuICBpbnRlcmZhY2UgVGVuc29yPFIgZXh0ZW5kcyBSYW5rID0gUmFuaz4ge1xuICAgIGJyb2FkY2FzdFRvPFIgZXh0ZW5kcyBSYW5rPihzaGFwZTogU2hhcGVNYXBbUl0pOiBUZW5zb3I8Uj47XG4gIH1cbn1cblxuZ2V0R2xvYmFsVGVuc29yQ2xhc3MoKS5wcm90b3R5cGUuYnJvYWRjYXN0VG8gPSBmdW5jdGlvbjxSIGV4dGVuZHMgUmFuaz4oXG4gICAgc2hhcGU6IFNoYXBlTWFwW1JdKTogVGVuc29yPFI+IHtcbiAgdGhpcy50aHJvd0lmRGlzcG9zZWQoKTtcbiAgcmV0dXJuIGJyb2FkY2FzdFRvKHRoaXMsIHNoYXBlKTtcbn07XG4iXX0=","/**\n * @license\n * Copyright 2020 Google LLC. All Rights Reserved.\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n * =============================================================================\n */\n// TODO update import path once op is modularized.\nimport { cast } from '../../ops/ops';\nimport { getGlobalTensorClass } from '../../tensor';\ngetGlobalTensorClass().prototype.cast = function (dtype) {\n this.throwIfDisposed();\n return cast(this, dtype);\n};\n//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY2FzdC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uLy4uLy4uL3RmanMtY29yZS9zcmMvcHVibGljL2NoYWluZWRfb3BzL2Nhc3QudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUE7Ozs7Ozs7Ozs7Ozs7OztHQWVHO0FBRUgsa0RBQWtEO0FBQ2xELE9BQU8sRUFBQyxJQUFJLEVBQUMsTUFBTSxlQUFlLENBQUM7QUFDbkMsT0FBTyxFQUFDLG9CQUFvQixFQUFTLE1BQU0sY0FBYyxDQUFDO0FBUzFELG9CQUFvQixFQUFFLENBQUMsU0FBUyxDQUFDLElBQUksR0FBRyxVQUNwQyxLQUFlO0lBQ2pCLElBQUksQ0FBQyxlQUFlLEVBQUUsQ0FBQztJQUN2QixPQUFPLElBQUksQ0FBQyxJQUFJLEVBQUUsS0FBSyxDQUFNLENBQUM7QUFDaEMsQ0FBQyxDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiLyoqXG4gKiBAbGljZW5zZVxuICogQ29weXJpZ2h0IDIwMjAgR29vZ2xlIExMQy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC5cbiAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSBcIkxpY2Vuc2VcIik7XG4gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuXG4gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXRcbiAqXG4gKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjBcbiAqXG4gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlXG4gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiBcIkFTIElTXCIgQkFTSVMsXG4gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC5cbiAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmRcbiAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLlxuICogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbiAqL1xuXG4vLyBUT0RPIHVwZGF0ZSBpbXBvcnQgcGF0aCBvbmNlIG9wIGlzIG1vZHVsYXJpemVkLlxuaW1wb3J0IHtjYXN0fSBmcm9tICcuLi8uLi9vcHMvb3BzJztcbmltcG9ydCB7Z2V0R2xvYmFsVGVuc29yQ2xhc3MsIFRlbnNvcn0gZnJvbSAnLi4vLi4vdGVuc29yJztcbmltcG9ydCB7RGF0YVR5cGUsIFJhbmt9IGZyb20gJy4uLy4uL3R5cGVzJztcblxuZGVjbGFyZSBtb2R1bGUgJy4uLy4uL3RlbnNvcicge1xuICBpbnRlcmZhY2UgVGVuc29yPFIgZXh0ZW5kcyBSYW5rID0gUmFuaz4ge1xuICAgIGNhc3Q8VCBleHRlbmRzIFRlbnNvcj4oZHR5cGU6IERhdGFUeXBlKTogVDtcbiAgfVxufVxuXG5nZXRHbG9iYWxUZW5zb3JDbGFzcygpLnByb3RvdHlwZS5jYXN0ID0gZnVuY3Rpb248VCBleHRlbmRzIFRlbnNvcj4oXG4gICAgZHR5cGU6IERhdGFUeXBlKTogVCB7XG4gIHRoaXMudGhyb3dJZkRpc3Bvc2VkKCk7XG4gIHJldHVybiBjYXN0KHRoaXMsIGR0eXBlKSBhcyBUO1xufTtcbiJdfQ==","/**\n * @license\n * Copyright 2020 Google LLC. All Rights Reserved.\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n * =============================================================================\n */\n// TODO update import path once op is modularized.\nimport { ceil } from '../../ops/ops';\nimport { getGlobalTensorClass } from '../../tensor';\ngetGlobalTensorClass().prototype.ceil = function () {\n this.throwIfDisposed();\n return ceil(this);\n};\n//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY2VpbC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uLy4uLy4uL3RmanMtY29yZS9zcmMvcHVibGljL2NoYWluZWRfb3BzL2NlaWwudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUE7Ozs7Ozs7Ozs7Ozs7OztHQWVHO0FBRUgsa0RBQWtEO0FBQ2xELE9BQU8sRUFBQyxJQUFJLEVBQUMsTUFBTSxlQUFlLENBQUM7QUFDbkMsT0FBTyxFQUFDLG9CQUFvQixFQUFTLE1BQU0sY0FBYyxDQUFDO0FBUzFELG9CQUFvQixFQUFFLENBQUMsU0FBUyxDQUFDLElBQUksR0FBRztJQUN0QyxJQUFJLENBQUMsZUFBZSxFQUFFLENBQUM7SUFDdkIsT0FBTyxJQUFJLENBQUMsSUFBSSxDQUFDLENBQUM7QUFDcEIsQ0FBQyxDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiLyoqXG4gKiBAbGljZW5zZVxuICogQ29weXJpZ2h0IDIwMjAgR29vZ2xlIExMQy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC5cbiAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSBcIkxpY2Vuc2VcIik7XG4gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuXG4gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXRcbiAqXG4gKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjBcbiAqXG4gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlXG4gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiBcIkFTIElTXCIgQkFTSVMsXG4gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC5cbiAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmRcbiAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLlxuICogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbiAqL1xuXG4vLyBUT0RPIHVwZGF0ZSBpbXBvcnQgcGF0aCBvbmNlIG9wIGlzIG1vZHVsYXJpemVkLlxuaW1wb3J0IHtjZWlsfSBmcm9tICcuLi8uLi9vcHMvb3BzJztcbmltcG9ydCB7Z2V0R2xvYmFsVGVuc29yQ2xhc3MsIFRlbnNvcn0gZnJvbSAnLi4vLi4vdGVuc29yJztcbmltcG9ydCB7UmFua30gZnJvbSAnLi4vLi4vdHlwZXMnO1xuXG5kZWNsYXJlIG1vZHVsZSAnLi4vLi4vdGVuc29yJyB7XG4gIGludGVyZmFjZSBUZW5zb3I8UiBleHRlbmRzIFJhbmsgPSBSYW5rPiB7XG4gICAgY2VpbDxUIGV4dGVuZHMgVGVuc29yPih0aGlzOiBUKTogVDtcbiAgfVxufVxuXG5nZXRHbG9iYWxUZW5zb3JDbGFzcygpLnByb3RvdHlwZS5jZWlsID0gZnVuY3Rpb248VCBleHRlbmRzIFRlbnNvcj4odGhpczogVCk6IFQge1xuICB0aGlzLnRocm93SWZEaXNwb3NlZCgpO1xuICByZXR1cm4gY2VpbCh0aGlzKTtcbn07XG4iXX0=","/**\n * @license\n * Copyright 2020 Google LLC. All Rights Reserved.\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n * =============================================================================\n */\n// TODO update import path once op is modularized.\nimport { clipByValue } from '../../ops/ops';\nimport { getGlobalTensorClass } from '../../tensor';\ngetGlobalTensorClass().prototype.clipByValue = function (min, max) {\n this.throwIfDisposed();\n return clipByValue(this, min, max);\n};\n//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY2xpcF9ieV92YWx1ZS5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uLy4uLy4uL3RmanMtY29yZS9zcmMvcHVibGljL2NoYWluZWRfb3BzL2NsaXBfYnlfdmFsdWUudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUE7Ozs7Ozs7Ozs7Ozs7OztHQWVHO0FBRUgsa0RBQWtEO0FBQ2xELE9BQU8sRUFBQyxXQUFXLEVBQUMsTUFBTSxlQUFlLENBQUM7QUFDMUMsT0FBTyxFQUFDLG9CQUFvQixFQUFTLE1BQU0sY0FBYyxDQUFDO0FBUzFELG9CQUFvQixFQUFFLENBQUMsU0FBUyxDQUFDLFdBQVcsR0FBRyxVQUMzQyxHQUFXLEVBQUUsR0FBVztJQUMxQixJQUFJLENBQUMsZUFBZSxFQUFFLENBQUM7SUFDdkIsT0FBTyxXQUFXLENBQUMsSUFBSSxFQUFFLEdBQUcsRUFBRSxHQUFHLENBQU0sQ0FBQztBQUMxQyxDQUFDLENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyIvKipcbiAqIEBsaWNlbnNlXG4gKiBDb3B5cmlnaHQgMjAyMCBHb29nbGUgTExDLiBBbGwgUmlnaHRzIFJlc2VydmVkLlxuICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlIFwiTGljZW5zZVwiKTtcbiAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS5cbiAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdFxuICpcbiAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMFxuICpcbiAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmVcbiAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuIFwiQVMgSVNcIiBCQVNJUyxcbiAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLlxuICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZFxuICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuXG4gKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuICovXG5cbi8vIFRPRE8gdXBkYXRlIGltcG9ydCBwYXRoIG9uY2Ugb3AgaXMgbW9kdWxhcml6ZWQuXG5pbXBvcnQge2NsaXBCeVZhbHVlfSBmcm9tICcuLi8uLi9vcHMvb3BzJztcbmltcG9ydCB7Z2V0R2xvYmFsVGVuc29yQ2xhc3MsIFRlbnNvcn0gZnJvbSAnLi4vLi4vdGVuc29yJztcbmltcG9ydCB7UmFua30gZnJvbSAnLi4vLi4vdHlwZXMnO1xuXG5kZWNsYXJlIG1vZHVsZSAnLi4vLi4vdGVuc29yJyB7XG4gIGludGVyZmFjZSBUZW5zb3I8UiBleHRlbmRzIFJhbmsgPSBSYW5rPiB7XG4gICAgY2xpcEJ5VmFsdWU8VCBleHRlbmRzIFRlbnNvcj4obWluOiBudW1iZXIsIG1heDogbnVtYmVyKTogVGVuc29yO1xuICB9XG59XG5cbmdldEdsb2JhbFRlbnNvckNsYXNzKCkucHJvdG90eXBlLmNsaXBCeVZhbHVlID0gZnVuY3Rpb248VCBleHRlbmRzIFRlbnNvcj4oXG4gICAgbWluOiBudW1iZXIsIG1heDogbnVtYmVyKTogVCB7XG4gIHRoaXMudGhyb3dJZkRpc3Bvc2VkKCk7XG4gIHJldHVybiBjbGlwQnlWYWx1ZSh0aGlzLCBtaW4sIG1heCkgYXMgVDtcbn07XG4iXX0=","/**\n * @license\n * Copyright 2020 Google LLC. All Rights Reserved.\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n * =============================================================================\n */\nimport { concat } from '../../ops/concat';\nimport { getGlobalTensorClass, Tensor } from '../../tensor';\ngetGlobalTensorClass().prototype.concat = function (x, axis) {\n this.throwIfDisposed();\n if (x instanceof Tensor) {\n x = [x];\n }\n return concat([this, ...x], axis);\n};\n//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY29uY2F0LmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vLi4vLi4vdGZqcy1jb3JlL3NyYy9wdWJsaWMvY2hhaW5lZF9vcHMvY29uY2F0LnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBOzs7Ozs7Ozs7Ozs7Ozs7R0FlRztBQUNILE9BQU8sRUFBQyxNQUFNLEVBQUMsTUFBTSxrQkFBa0IsQ0FBQztBQUN4QyxPQUFPLEVBQUMsb0JBQW9CLEVBQUUsTUFBTSxFQUFDLE1BQU0sY0FBYyxDQUFDO0FBUzFELG9CQUFvQixFQUFFLENBQUMsU0FBUyxDQUFDLE1BQU0sR0FBRyxVQUN0QyxDQUF3QixFQUFFLElBQWE7SUFDekMsSUFBSSxDQUFDLGVBQWUsRUFBRSxDQUFDO0lBQ3ZCLElBQUksQ0FBQyxZQUFZLE1BQU0sRUFBRTtRQUN2QixDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQztLQUNUO0lBQ0QsT0FBTyxNQUFNLENBQUMsQ0FBQyxJQUFJLEVBQUUsR0FBRyxDQUFDLENBQUMsRUFBRSxJQUFJLENBQU0sQ0FBQztBQUN6QyxDQUFDLENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyIvKipcbiAqIEBsaWNlbnNlXG4gKiBDb3B5cmlnaHQgMjAyMCBHb29nbGUgTExDLiBBbGwgUmlnaHRzIFJlc2VydmVkLlxuICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlIFwiTGljZW5zZVwiKTtcbiAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS5cbiAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdFxuICpcbiAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMFxuICpcbiAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmVcbiAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuIFwiQVMgSVNcIiBCQVNJUyxcbiAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLlxuICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZFxuICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuXG4gKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuICovXG5pbXBvcnQge2NvbmNhdH0gZnJvbSAnLi4vLi4vb3BzL2NvbmNhdCc7XG5pbXBvcnQge2dldEdsb2JhbFRlbnNvckNsYXNzLCBUZW5zb3J9IGZyb20gJy4uLy4uL3RlbnNvcic7XG5pbXBvcnQge1JhbmssIFRlbnNvckxpa2V9IGZyb20gJy4uLy4uL3R5cGVzJztcblxuZGVjbGFyZSBtb2R1bGUgJy4uLy4uL3RlbnNvcicge1xuICBpbnRlcmZhY2UgVGVuc29yPFIgZXh0ZW5kcyBSYW5rID0gUmFuaz4ge1xuICAgIGNvbmNhdDxUIGV4dGVuZHMgVGVuc29yPih0ZW5zb3JzOiBUfEFycmF5PFR8VGVuc29yTGlrZT4sIGF4aXM/OiBudW1iZXIpOiBUO1xuICB9XG59XG5cbmdldEdsb2JhbFRlbnNvckNsYXNzKCkucHJvdG90eXBlLmNvbmNhdCA9IGZ1bmN0aW9uPFQgZXh0ZW5kcyBUZW5zb3I+KFxuICAgIHg6IFR8QXJyYXk8VHxUZW5zb3JMaWtlPiwgYXhpcz86IG51bWJlcik6IFQge1xuICB0aGlzLnRocm93SWZEaXNwb3NlZCgpO1xuICBpZiAoeCBpbnN0YW5jZW9mIFRlbnNvcikge1xuICAgIHggPSBbeF07XG4gIH1cbiAgcmV0dXJuIGNvbmNhdChbdGhpcywgLi4ueF0sIGF4aXMpIGFzIFQ7XG59O1xuIl19","/**\n * @license\n * Copyright 2020 Google LLC. All Rights Reserved.\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n * =============================================================================\n */\nimport { conv1d } from '../../ops/conv1d';\nimport { getGlobalTensorClass } from '../../tensor';\ngetGlobalTensorClass().prototype.conv1d = function (filter, stride, pad, dataFormat, dilation, dimRoundingMode) {\n this.throwIfDisposed();\n return conv1d(this, filter, stride, pad, dataFormat, dilation, dimRoundingMode);\n};\n//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY29udjFkLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vLi4vLi4vdGZqcy1jb3JlL3NyYy9wdWJsaWMvY2hhaW5lZF9vcHMvY29udjFkLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBOzs7Ozs7Ozs7Ozs7Ozs7R0FlRztBQUNILE9BQU8sRUFBQyxNQUFNLEVBQUMsTUFBTSxrQkFBa0IsQ0FBQztBQUV4QyxPQUFPLEVBQUMsb0JBQW9CLEVBQXFCLE1BQU0sY0FBYyxDQUFDO0FBWXRFLG9CQUFvQixFQUFFLENBQUMsU0FBUyxDQUFDLE1BQU0sR0FBRyxVQUN0QyxNQUE2QixFQUFFLE1BQWMsRUFDN0MsR0FBMEMsRUFBRSxVQUF3QixFQUNwRSxRQUFpQixFQUFFLGVBQXdDO0lBQzdELElBQUksQ0FBQyxlQUFlLEVBQUUsQ0FBQztJQUN2QixPQUFPLE1BQU0sQ0FDRixJQUFJLEVBQUUsTUFBTSxFQUFFLE1BQU0sRUFBRSxHQUFHLEVBQUUsVUFBVSxFQUFFLFFBQVEsRUFDL0MsZUFBZSxDQUFNLENBQUM7QUFDbkMsQ0FBQyxDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiLyoqXG4gKiBAbGljZW5zZVxuICogQ29weXJpZ2h0IDIwMjAgR29vZ2xlIExMQy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC5cbiAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSBcIkxpY2Vuc2VcIik7XG4gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuXG4gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXRcbiAqXG4gKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjBcbiAqXG4gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlXG4gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiBcIkFTIElTXCIgQkFTSVMsXG4gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC5cbiAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmRcbiAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLlxuICogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbiAqL1xuaW1wb3J0IHtjb252MWR9IGZyb20gJy4uLy4uL29wcy9jb252MWQnO1xuaW1wb3J0IHtFeHBsaWNpdFBhZGRpbmd9IGZyb20gJy4uLy4uL29wcy9jb252X3V0aWwnO1xuaW1wb3J0IHtnZXRHbG9iYWxUZW5zb3JDbGFzcywgVGVuc29yMkQsIFRlbnNvcjNEfSBmcm9tICcuLi8uLi90ZW5zb3InO1xuaW1wb3J0IHtSYW5rLCBUZW5zb3JMaWtlM0R9IGZyb20gJy4uLy4uL3R5cGVzJztcblxuZGVjbGFyZSBtb2R1bGUgJy4uLy4uL3RlbnNvcicge1xuICBpbnRlcmZhY2UgVGVuc29yPFIgZXh0ZW5kcyBSYW5rID0gUmFuaz4ge1xuICAgIGNvbnYxZDxUIGV4dGVuZHMgVGVuc29yMkR8VGVuc29yM0Q+KFxuICAgICAgICBmaWx0ZXI6IFRlbnNvcjNEfFRlbnNvckxpa2UzRCwgc3RyaWRlOiBudW1iZXIsXG4gICAgICAgIHBhZDogJ3ZhbGlkJ3wnc2FtZSd8bnVtYmVyfEV4cGxpY2l0UGFkZGluZywgZGF0YUZvcm1hdD86ICdOV0MnfCdOQ1cnLFxuICAgICAgICBkaWxhdGlvbj86IG51bWJlciwgZGltUm91bmRpbmdNb2RlPzogJ2Zsb29yJ3wncm91bmQnfCdjZWlsJyk6IFQ7XG4gIH1cbn1cblxuZ2V0R2xvYmFsVGVuc29yQ2xhc3MoKS5wcm90b3R5cGUuY29udjFkID0gZnVuY3Rpb248VCBleHRlbmRzIFRlbnNvcjJEfFRlbnNvcjNEPihcbiAgICBmaWx0ZXI6IFRlbnNvcjNEfFRlbnNvckxpa2UzRCwgc3RyaWRlOiBudW1iZXIsXG4gICAgcGFkOiAndmFsaWQnfCdzYW1lJ3xudW1iZXJ8RXhwbGljaXRQYWRkaW5nLCBkYXRhRm9ybWF0PzogJ05XQyd8J05DVycsXG4gICAgZGlsYXRpb24/OiBudW1iZXIsIGRpbVJvdW5kaW5nTW9kZT86ICdmbG9vcid8J3JvdW5kJ3wnY2VpbCcpOiBUIHtcbiAgdGhpcy50aHJvd0lmRGlzcG9zZWQoKTtcbiAgcmV0dXJuIGNvbnYxZChcbiAgICAgICAgICAgICB0aGlzLCBmaWx0ZXIsIHN0cmlkZSwgcGFkLCBkYXRhRm9ybWF0LCBkaWxhdGlvbixcbiAgICAgICAgICAgICBkaW1Sb3VuZGluZ01vZGUpIGFzIFQ7XG59O1xuIl19","/**\n * @license\n * Copyright 2020 Google LLC. All Rights Reserved.\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n * =============================================================================\n */\nimport { conv2dTranspose } from '../../ops/conv2d_transpose';\nimport { getGlobalTensorClass } from '../../tensor';\ngetGlobalTensorClass().prototype.conv2dTranspose =\n function (filter, outputShape, strides, pad, dimRoundingMode) {\n this.throwIfDisposed();\n return conv2dTranspose(this, filter, outputShape, strides, pad, dimRoundingMode);\n };\n//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY29udjJkX3RyYW5zcG9zZS5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uLy4uLy4uL3RmanMtY29yZS9zcmMvcHVibGljL2NoYWluZWRfb3BzL2NvbnYyZF90cmFuc3Bvc2UudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUE7Ozs7Ozs7Ozs7Ozs7OztHQWVHO0FBQ0gsT0FBTyxFQUFDLGVBQWUsRUFBQyxNQUFNLDRCQUE0QixDQUFDO0FBQzNELE9BQU8sRUFBQyxvQkFBb0IsRUFBcUIsTUFBTSxjQUFjLENBQUM7QUFhdEUsb0JBQW9CLEVBQUUsQ0FBQyxTQUFTLENBQUMsZUFBZTtJQUM1QyxVQUNJLE1BQTZCLEVBQzdCLFdBQXNFLEVBQ3RFLE9BQWdDLEVBQUUsR0FBMEIsRUFDNUQsZUFBd0M7UUFDOUMsSUFBSSxDQUFDLGVBQWUsRUFBRSxDQUFDO1FBQ3ZCLE9BQU8sZUFBZSxDQUNYLElBQUksRUFBRSxNQUFNLEVBQUUsV0FBVyxFQUFFLE9BQU8sRUFBRSxHQUFHLEVBQUUsZUFBZSxDQUFNLENBQUM7SUFDNUUsQ0FBQyxDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiLyoqXG4gKiBAbGljZW5zZVxuICogQ29weXJpZ2h0IDIwMjAgR29vZ2xlIExMQy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC5cbiAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSBcIkxpY2Vuc2VcIik7XG4gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuXG4gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXRcbiAqXG4gKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjBcbiAqXG4gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlXG4gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiBcIkFTIElTXCIgQkFTSVMsXG4gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC5cbiAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmRcbiAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLlxuICogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbiAqL1xuaW1wb3J0IHtjb252MmRUcmFuc3Bvc2V9IGZyb20gJy4uLy4uL29wcy9jb252MmRfdHJhbnNwb3NlJztcbmltcG9ydCB7Z2V0R2xvYmFsVGVuc29yQ2xhc3MsIFRlbnNvcjNELCBUZW5zb3I0RH0gZnJvbSAnLi4vLi4vdGVuc29yJztcbmltcG9ydCB7UmFuaywgVGVuc29yTGlrZTREfSBmcm9tICcuLi8uLi90eXBlcyc7XG5cbmRlY2xhcmUgbW9kdWxlICcuLi8uLi90ZW5zb3InIHtcbiAgaW50ZXJmYWNlIFRlbnNvcjxSIGV4dGVuZHMgUmFuayA9IFJhbms+IHtcbiAgICBjb252MmRUcmFuc3Bvc2U8VCBleHRlbmRzIFRlbnNvcjNEfFRlbnNvcjREPihcbiAgICAgICAgZmlsdGVyOiBUZW5zb3I0RHxUZW5zb3JMaWtlNEQsXG4gICAgICAgIG91dHB1dFNoYXBlOiBbbnVtYmVyLCBudW1iZXIsIG51bWJlciwgbnVtYmVyXXxbbnVtYmVyLCBudW1iZXIsIG51bWJlcl0sXG4gICAgICAgIHN0cmlkZXM6IFtudW1iZXIsIG51bWJlcl18bnVtYmVyLCBwYWQ6ICd2YWxpZCd8J3NhbWUnfG51bWJlcixcbiAgICAgICAgZGltUm91bmRpbmdNb2RlPzogJ2Zsb29yJ3wncm91bmQnfCdjZWlsJyk6IFQ7XG4gIH1cbn1cblxuZ2V0R2xvYmFsVGVuc29yQ2xhc3MoKS5wcm90b3R5cGUuY29udjJkVHJhbnNwb3NlID1cbiAgICBmdW5jdGlvbjxUIGV4dGVuZHMgVGVuc29yM0R8VGVuc29yNEQ+KFxuICAgICAgICBmaWx0ZXI6IFRlbnNvcjREfFRlbnNvckxpa2U0RCxcbiAgICAgICAgb3V0cHV0U2hhcGU6IFtudW1iZXIsIG51bWJlciwgbnVtYmVyLCBudW1iZXJdfFtudW1iZXIsIG51bWJlciwgbnVtYmVyXSxcbiAgICAgICAgc3RyaWRlczogW251bWJlciwgbnVtYmVyXXxudW1iZXIsIHBhZDogJ3ZhbGlkJ3wnc2FtZSd8bnVtYmVyLFxuICAgICAgICBkaW1Sb3VuZGluZ01vZGU/OiAnZmxvb3InfCdyb3VuZCd8J2NlaWwnKTogVCB7XG4gIHRoaXMudGhyb3dJZkRpc3Bvc2VkKCk7XG4gIHJldHVybiBjb252MmRUcmFuc3Bvc2UoXG4gICAgICAgICAgICAgdGhpcywgZmlsdGVyLCBvdXRwdXRTaGFwZSwgc3RyaWRlcywgcGFkLCBkaW1Sb3VuZGluZ01vZGUpIGFzIFQ7XG59O1xuIl19","/**\n * @license\n * Copyright 2020 Google LLC. All Rights Reserved.\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n * =============================================================================\n */\nimport { conv2d } from '../../ops/conv2d';\nimport { getGlobalTensorClass } from '../../tensor';\ngetGlobalTensorClass().prototype.conv2d = function (filter, strides, pad, dataFormat, dilations, dimRoundingMode) {\n this.throwIfDisposed();\n return conv2d(this, filter, strides, pad, dataFormat, dilations, dimRoundingMode);\n};\n//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY29udjJkLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vLi4vLi4vdGZqcy1jb3JlL3NyYy9wdWJsaWMvY2hhaW5lZF9vcHMvY29udjJkLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBOzs7Ozs7Ozs7Ozs7Ozs7R0FlRztBQUNILE9BQU8sRUFBQyxNQUFNLEVBQUMsTUFBTSxrQkFBa0IsQ0FBQztBQUN4QyxPQUFPLEVBQUMsb0JBQW9CLEVBQXFCLE1BQU0sY0FBYyxDQUFDO0FBYXRFLG9CQUFvQixFQUFFLENBQUMsU0FBUyxDQUFDLE1BQU0sR0FBRyxVQUN0QyxNQUE2QixFQUFFLE9BQWdDLEVBQy9ELEdBQTBCLEVBQUUsVUFBMEIsRUFDdEQsU0FBbUMsRUFDbkMsZUFBd0M7SUFDMUMsSUFBSSxDQUFDLGVBQWUsRUFBRSxDQUFDO0lBQ3ZCLE9BQU8sTUFBTSxDQUNGLElBQUksRUFBRSxNQUFNLEVBQUUsT0FBTyxFQUFFLEdBQUcsRUFBRSxVQUFVLEVBQUUsU0FBUyxFQUNqRCxlQUFlLENBQU0sQ0FBQztBQUNuQyxDQUFDLENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyIvKipcbiAqIEBsaWNlbnNlXG4gKiBDb3B5cmlnaHQgMjAyMCBHb29nbGUgTExDLiBBbGwgUmlnaHRzIFJlc2VydmVkLlxuICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlIFwiTGljZW5zZVwiKTtcbiAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS5cbiAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdFxuICpcbiAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMFxuICpcbiAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmVcbiAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuIFwiQVMgSVNcIiBCQVNJUyxcbiAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLlxuICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZFxuICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuXG4gKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuICovXG5pbXBvcnQge2NvbnYyZH0gZnJvbSAnLi4vLi4vb3BzL2NvbnYyZCc7XG5pbXBvcnQge2dldEdsb2JhbFRlbnNvckNsYXNzLCBUZW5zb3IzRCwgVGVuc29yNER9IGZyb20gJy4uLy4uL3RlbnNvcic7XG5pbXBvcnQge1JhbmssIFRlbnNvckxpa2U0RH0gZnJvbSAnLi4vLi4vdHlwZXMnO1xuXG5kZWNsYXJlIG1vZHVsZSAnLi4vLi4vdGVuc29yJyB7XG4gIGludGVyZmFjZSBUZW5zb3I8UiBleHRlbmRzIFJhbmsgPSBSYW5rPiB7XG4gICAgY29udjJkPFQgZXh0ZW5kcyBUZW5zb3IzRHxUZW5zb3I0RD4oXG4gICAgICAgIGZpbHRlcjogVGVuc29yNER8VGVuc29yTGlrZTRELCBzdHJpZGVzOiBbbnVtYmVyLCBudW1iZXJdfG51bWJlcixcbiAgICAgICAgcGFkOiAndmFsaWQnfCdzYW1lJ3xudW1iZXIsIGRhdGFGb3JtYXQ/OiAnTkhXQyd8J05DSFcnLFxuICAgICAgICBkaWxhdGlvbnM/OiBbbnVtYmVyLCBudW1iZXJdfG51bWJlcixcbiAgICAgICAgZGltUm91bmRpbmdNb2RlPzogJ2Zsb29yJ3wncm91bmQnfCdjZWlsJyk6IFQ7XG4gIH1cbn1cblxuZ2V0R2xvYmFsVGVuc29yQ2xhc3MoKS5wcm90b3R5cGUuY29udjJkID0gZnVuY3Rpb248VCBleHRlbmRzIFRlbnNvcjNEfFRlbnNvcjREPihcbiAgICBmaWx0ZXI6IFRlbnNvcjREfFRlbnNvckxpa2U0RCwgc3RyaWRlczogW251bWJlciwgbnVtYmVyXXxudW1iZXIsXG4gICAgcGFkOiAndmFsaWQnfCdzYW1lJ3xudW1iZXIsIGRhdGFGb3JtYXQ/OiAnTkhXQyd8J05DSFcnLFxuICAgIGRpbGF0aW9ucz86IFtudW1iZXIsIG51bWJlcl18bnVtYmVyLFxuICAgIGRpbVJvdW5kaW5nTW9kZT86ICdmbG9vcid8J3JvdW5kJ3wnY2VpbCcpOiBUIHtcbiAgdGhpcy50aHJvd0lmRGlzcG9zZWQoKTtcbiAgcmV0dXJuIGNvbnYyZChcbiAgICAgICAgICAgICB0aGlzLCBmaWx0ZXIsIHN0cmlkZXMsIHBhZCwgZGF0YUZvcm1hdCwgZGlsYXRpb25zLFxuICAgICAgICAgICAgIGRpbVJvdW5kaW5nTW9kZSkgYXMgVDtcbn07XG4iXX0=","/**\n * @license\n * Copyright 2020 Google LLC. All Rights Reserved.\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n * =============================================================================\n */\n// TODO update import path once op is modularized.\nimport { cos } from '../../ops/ops';\nimport { getGlobalTensorClass } from '../../tensor';\ngetGlobalTensorClass().prototype.cos = function () {\n this.throwIfDisposed();\n return cos(this);\n};\n//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY29zLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vLi4vLi4vdGZqcy1jb3JlL3NyYy9wdWJsaWMvY2hhaW5lZF9vcHMvY29zLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBOzs7Ozs7Ozs7Ozs7Ozs7R0FlRztBQUVILGtEQUFrRDtBQUNsRCxPQUFPLEVBQUMsR0FBRyxFQUFDLE1BQU0sZUFBZSxDQUFDO0FBQ2xDLE9BQU8sRUFBQyxvQkFBb0IsRUFBUyxNQUFNLGNBQWMsQ0FBQztBQVMxRCxvQkFBb0IsRUFBRSxDQUFDLFNBQVMsQ0FBQyxHQUFHLEdBQUc7SUFDckMsSUFBSSxDQUFDLGVBQWUsRUFBRSxDQUFDO0lBQ3ZCLE9BQU8sR0FBRyxDQUFDLElBQUksQ0FBQyxDQUFDO0FBQ25CLENBQUMsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbIi8qKlxuICogQGxpY2Vuc2VcbiAqIENvcHlyaWdodCAyMDIwIEdvb2dsZSBMTEMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuXG4gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgXCJMaWNlbnNlXCIpO1xuICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLlxuICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0XG4gKlxuICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wXG4gKlxuICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZVxuICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gXCJBUyBJU1wiIEJBU0lTLFxuICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuXG4gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kXG4gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS5cbiAqID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4gKi9cblxuLy8gVE9ETyB1cGRhdGUgaW1wb3J0IHBhdGggb25jZSBvcCBpcyBtb2R1bGFyaXplZC5cbmltcG9ydCB7Y29zfSBmcm9tICcuLi8uLi9vcHMvb3BzJztcbmltcG9ydCB7Z2V0R2xvYmFsVGVuc29yQ2xhc3MsIFRlbnNvcn0gZnJvbSAnLi4vLi4vdGVuc29yJztcbmltcG9ydCB7UmFua30gZnJvbSAnLi4vLi4vdHlwZXMnO1xuXG5kZWNsYXJlIG1vZHVsZSAnLi4vLi4vdGVuc29yJyB7XG4gIGludGVyZmFjZSBUZW5zb3I8UiBleHRlbmRzIFJhbmsgPSBSYW5rPiB7XG4gICAgY29zPFQgZXh0ZW5kcyBUZW5zb3I+KHRoaXM6IFQpOiBUO1xuICB9XG59XG5cbmdldEdsb2JhbFRlbnNvckNsYXNzKCkucHJvdG90eXBlLmNvcyA9IGZ1bmN0aW9uPFQgZXh0ZW5kcyBUZW5zb3I+KHRoaXM6IFQpOiBUIHtcbiAgdGhpcy50aHJvd0lmRGlzcG9zZWQoKTtcbiAgcmV0dXJuIGNvcyh0aGlzKTtcbn07XG4iXX0=","/**\n * @license\n * Copyright 2020 Google LLC. All Rights Reserved.\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n * =============================================================================\n */\n// TODO update import path once op is modularized.\nimport { cosh } from '../../ops/ops';\nimport { getGlobalTensorClass } from '../../tensor';\ngetGlobalTensorClass().prototype.cosh = function () {\n this.throwIfDisposed();\n return cosh(this);\n};\n//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY29zaC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uLy4uLy4uL3RmanMtY29yZS9zcmMvcHVibGljL2NoYWluZWRfb3BzL2Nvc2gudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUE7Ozs7Ozs7Ozs7Ozs7OztHQWVHO0FBRUgsa0RBQWtEO0FBQ2xELE9BQU8sRUFBQyxJQUFJLEVBQUMsTUFBTSxlQUFlLENBQUM7QUFDbkMsT0FBTyxFQUFDLG9CQUFvQixFQUFTLE1BQU0sY0FBYyxDQUFDO0FBUzFELG9CQUFvQixFQUFFLENBQUMsU0FBUyxDQUFDLElBQUksR0FBRztJQUN0QyxJQUFJLENBQUMsZUFBZSxFQUFFLENBQUM7SUFDdkIsT0FBTyxJQUFJLENBQUMsSUFBSSxDQUFDLENBQUM7QUFDcEIsQ0FBQyxDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiLyoqXG4gKiBAbGljZW5zZVxuICogQ29weXJpZ2h0IDIwMjAgR29vZ2xlIExMQy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC5cbiAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSBcIkxpY2Vuc2VcIik7XG4gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuXG4gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXRcbiAqXG4gKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjBcbiAqXG4gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlXG4gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiBcIkFTIElTXCIgQkFTSVMsXG4gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC5cbiAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmRcbiAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLlxuICogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbiAqL1xuXG4vLyBUT0RPIHVwZGF0ZSBpbXBvcnQgcGF0aCBvbmNlIG9wIGlzIG1vZHVsYXJpemVkLlxuaW1wb3J0IHtjb3NofSBmcm9tICcuLi8uLi9vcHMvb3BzJztcbmltcG9ydCB7Z2V0R2xvYmFsVGVuc29yQ2xhc3MsIFRlbnNvcn0gZnJvbSAnLi4vLi4vdGVuc29yJztcbmltcG9ydCB7UmFua30gZnJvbSAnLi4vLi4vdHlwZXMnO1xuXG5kZWNsYXJlIG1vZHVsZSAnLi4vLi4vdGVuc29yJyB7XG4gIGludGVyZmFjZSBUZW5zb3I8UiBleHRlbmRzIFJhbmsgPSBSYW5rPiB7XG4gICAgY29zaDxUIGV4dGVuZHMgVGVuc29yPih0aGlzOiBUKTogVDtcbiAgfVxufVxuXG5nZXRHbG9iYWxUZW5zb3JDbGFzcygpLnByb3RvdHlwZS5jb3NoID0gZnVuY3Rpb248VCBleHRlbmRzIFRlbnNvcj4odGhpczogVCk6IFQge1xuICB0aGlzLnRocm93SWZEaXNwb3NlZCgpO1xuICByZXR1cm4gY29zaCh0aGlzKTtcbn07XG4iXX0=","/**\n * @license\n * Copyright 2022 Google LLC. All Rights Reserved.\n * Licensed under the Apache License, Version 2.0 (the 'License');\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an 'AS IS' BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n * =============================================================================\n */\nimport { cumprod } from '../../ops/cumprod';\nimport { getGlobalTensorClass } from '../../tensor';\ngetGlobalTensorClass().prototype.cumprod = function (axis, exclusive, reverse) {\n this.throwIfDisposed();\n return cumprod(this, axis, exclusive, reverse);\n};\n//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY3VtcHJvZC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uLy4uLy4uL3RmanMtY29yZS9zcmMvcHVibGljL2NoYWluZWRfb3BzL2N1bXByb2QudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUE7Ozs7Ozs7Ozs7Ozs7OztHQWVHO0FBQ0gsT0FBTyxFQUFFLE9BQU8sRUFBRSxNQUFNLG1CQUFtQixDQUFDO0FBQzVDLE9BQU8sRUFBRSxvQkFBb0IsRUFBVSxNQUFNLGNBQWMsQ0FBQztBQWE1RCxvQkFBb0IsRUFBRSxDQUFDLFNBQVMsQ0FBQyxPQUFPLEdBQUcsVUFDekMsSUFBYSxFQUNiLFNBQW1CLEVBQ25CLE9BQWlCO0lBRWpCLElBQUksQ0FBQyxlQUFlLEVBQUUsQ0FBQztJQUN2QixPQUFPLE9BQU8sQ0FBQyxJQUFJLEVBQUUsSUFBSSxFQUFFLFNBQVMsRUFBRSxPQUFPLENBQUMsQ0FBQztBQUNqRCxDQUFDLENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyIvKipcbiAqIEBsaWNlbnNlXG4gKiBDb3B5cmlnaHQgMjAyMiBHb29nbGUgTExDLiBBbGwgUmlnaHRzIFJlc2VydmVkLlxuICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICdMaWNlbnNlJyk7XG4gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuXG4gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXRcbiAqXG4gKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjBcbiAqXG4gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlXG4gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAnQVMgSVMnIEJBU0lTLFxuICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuXG4gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kXG4gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS5cbiAqID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4gKi9cbmltcG9ydCB7IGN1bXByb2QgfSBmcm9tICcuLi8uLi9vcHMvY3VtcHJvZCc7XG5pbXBvcnQgeyBnZXRHbG9iYWxUZW5zb3JDbGFzcywgVGVuc29yIH0gZnJvbSAnLi4vLi4vdGVuc29yJztcbmltcG9ydCB7IFJhbmsgfSBmcm9tICcuLi8uLi90eXBlcyc7XG5cbmRlY2xhcmUgbW9kdWxlICcuLi8uLi90ZW5zb3InIHtcbiAgaW50ZXJmYWNlIFRlbnNvcjxSIGV4dGVuZHMgUmFuayA9IFJhbms+IHtcbiAgICBjdW1wcm9kPFIgZXh0ZW5kcyBSYW5rPihcbiAgICAgIGF4aXM/OiBudW1iZXIsXG4gICAgICBleGNsdXNpdmU/OiBib29sZWFuLFxuICAgICAgcmV2ZXJzZT86IGJvb2xlYW5cbiAgICApOiBUZW5zb3I8Uj47XG4gIH1cbn1cblxuZ2V0R2xvYmFsVGVuc29yQ2xhc3MoKS5wcm90b3R5cGUuY3VtcHJvZCA9IGZ1bmN0aW9uIDxSIGV4dGVuZHMgUmFuaz4oXG4gIGF4aXM/OiBudW1iZXIsXG4gIGV4Y2x1c2l2ZT86IGJvb2xlYW4sXG4gIHJldmVyc2U/OiBib29sZWFuXG4pOiBUZW5zb3I8Uj4ge1xuICB0aGlzLnRocm93SWZEaXNwb3NlZCgpO1xuICByZXR1cm4gY3VtcHJvZCh0aGlzLCBheGlzLCBleGNsdXNpdmUsIHJldmVyc2UpO1xufTtcbiJdfQ==","/**\n * @license\n * Copyright 2020 Google LLC. All Rights Reserved.\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n * =============================================================================\n */\nimport { cumsum } from '../../ops/cumsum';\nimport { getGlobalTensorClass } from '../../tensor';\ngetGlobalTensorClass().prototype.cumsum = function (axis, exclusive, reverse) {\n this.throwIfDisposed();\n return cumsum(this, axis, exclusive, reverse);\n};\n//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY3Vtc3VtLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vLi4vLi4vdGZqcy1jb3JlL3NyYy9wdWJsaWMvY2hhaW5lZF9vcHMvY3Vtc3VtLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBOzs7Ozs7Ozs7Ozs7Ozs7R0FlRztBQUNILE9BQU8sRUFBQyxNQUFNLEVBQUMsTUFBTSxrQkFBa0IsQ0FBQztBQUN4QyxPQUFPLEVBQUMsb0JBQW9CLEVBQVMsTUFBTSxjQUFjLENBQUM7QUFVMUQsb0JBQW9CLEVBQUUsQ0FBQyxTQUFTLENBQUMsTUFBTSxHQUFHLFVBQ3RDLElBQWEsRUFBRSxTQUFtQixFQUFFLE9BQWlCO0lBQ3ZELElBQUksQ0FBQyxlQUFlLEVBQUUsQ0FBQztJQUN2QixPQUFPLE1BQU0sQ0FBQyxJQUFJLEVBQUUsSUFBSSxFQUFFLFNBQVMsRUFBRSxPQUFPLENBQUMsQ0FBQztBQUNoRCxDQUFDLENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyIvKipcbiAqIEBsaWNlbnNlXG4gKiBDb3B5cmlnaHQgMjAyMCBHb29nbGUgTExDLiBBbGwgUmlnaHRzIFJlc2VydmVkLlxuICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlIFwiTGljZW5zZVwiKTtcbiAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS5cbiAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdFxuICpcbiAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMFxuICpcbiAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmVcbiAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuIFwiQVMgSVNcIiBCQVNJUyxcbiAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLlxuICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZFxuICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuXG4gKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuICovXG5pbXBvcnQge2N1bXN1bX0gZnJvbSAnLi4vLi4vb3BzL2N1bXN1bSc7XG5pbXBvcnQge2dldEdsb2JhbFRlbnNvckNsYXNzLCBUZW5zb3J9IGZyb20gJy4uLy4uL3RlbnNvcic7XG5pbXBvcnQge1Jhbmt9IGZyb20gJy4uLy4uL3R5cGVzJztcblxuZGVjbGFyZSBtb2R1bGUgJy4uLy4uL3RlbnNvcicge1xuICBpbnRlcmZhY2UgVGVuc29yPFIgZXh0ZW5kcyBSYW5rID0gUmFuaz4ge1xuICAgIGN1bXN1bTxSIGV4dGVuZHMgUmFuaz4oXG4gICAgICAgIGF4aXM/OiBudW1iZXIsIGV4Y2x1c2l2ZT86IGJvb2xlYW4sIHJldmVyc2U/OiBib29sZWFuKTogVGVuc29yPFI+O1xuICB9XG59XG5cbmdldEdsb2JhbFRlbnNvckNsYXNzKCkucHJvdG90eXBlLmN1bXN1bSA9IGZ1bmN0aW9uPFIgZXh0ZW5kcyBSYW5rPihcbiAgICBheGlzPzogbnVtYmVyLCBleGNsdXNpdmU/OiBib29sZWFuLCByZXZlcnNlPzogYm9vbGVhbik6IFRlbnNvcjxSPiB7XG4gIHRoaXMudGhyb3dJZkRpc3Bvc2VkKCk7XG4gIHJldHVybiBjdW1zdW0odGhpcywgYXhpcywgZXhjbHVzaXZlLCByZXZlcnNlKTtcbn07XG4iXX0=","/**\n * @license\n * Copyright 2020 Google LLC. All Rights Reserved.\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n * =============================================================================\n */\nimport { depthToSpace } from '../../ops/depth_to_space';\nimport { getGlobalTensorClass } from '../../tensor';\ngetGlobalTensorClass().prototype.depthToSpace = function (blockSize, dataFormat) {\n this.throwIfDisposed();\n return depthToSpace(this, blockSize, dataFormat);\n};\n//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZGVwdGhfdG9fc3BhY2UuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi8uLi8uLi90ZmpzLWNvcmUvc3JjL3B1YmxpYy9jaGFpbmVkX29wcy9kZXB0aF90b19zcGFjZS50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQTs7Ozs7Ozs7Ozs7Ozs7O0dBZUc7QUFDSCxPQUFPLEVBQUMsWUFBWSxFQUFDLE1BQU0sMEJBQTBCLENBQUM7QUFDdEQsT0FBTyxFQUFDLG9CQUFvQixFQUFXLE1BQU0sY0FBYyxDQUFDO0FBVTVELG9CQUFvQixFQUFFLENBQUMsU0FBUyxDQUFDLFlBQVksR0FBRyxVQUM1QyxTQUFpQixFQUFFLFVBQXlCO0lBQzlDLElBQUksQ0FBQyxlQUFlLEVBQUUsQ0FBQztJQUN2QixPQUFPLFlBQVksQ0FBQyxJQUFJLEVBQUUsU0FBUyxFQUFFLFVBQVUsQ0FBTSxDQUFDO0FBQ3hELENBQUMsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbIi8qKlxuICogQGxpY2Vuc2VcbiAqIENvcHlyaWdodCAyMDIwIEdvb2dsZSBMTEMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuXG4gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgXCJMaWNlbnNlXCIpO1xuICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLlxuICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0XG4gKlxuICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wXG4gKlxuICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZVxuICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gXCJBUyBJU1wiIEJBU0lTLFxuICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuXG4gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kXG4gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS5cbiAqID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4gKi9cbmltcG9ydCB7ZGVwdGhUb1NwYWNlfSBmcm9tICcuLi8uLi9vcHMvZGVwdGhfdG9fc3BhY2UnO1xuaW1wb3J0IHtnZXRHbG9iYWxUZW5zb3JDbGFzcywgVGVuc29yNER9IGZyb20gJy4uLy4uL3RlbnNvcic7XG5pbXBvcnQge1Jhbmt9IGZyb20gJy4uLy4uL3R5cGVzJztcblxuZGVjbGFyZSBtb2R1bGUgJy4uLy4uL3RlbnNvcicge1xuICBpbnRlcmZhY2UgVGVuc29yPFIgZXh0ZW5kcyBSYW5rID0gUmFuaz4ge1xuICAgIGRlcHRoVG9TcGFjZTxUIGV4dGVuZHMgVGVuc29yNEQ+KFxuICAgICAgICBibG9ja1NpemU6IG51bWJlciwgZGF0YUZvcm1hdDogJ05IV0MnfCdOQ0hXJyk6IFQ7XG4gIH1cbn1cblxuZ2V0R2xvYmFsVGVuc29yQ2xhc3MoKS5wcm90b3R5cGUuZGVwdGhUb1NwYWNlID0gZnVuY3Rpb248VCBleHRlbmRzIFRlbnNvcjREPihcbiAgICBibG9ja1NpemU6IG51bWJlciwgZGF0YUZvcm1hdDogJ05IV0MnfCdOQ0hXJyk6IFQge1xuICB0aGlzLnRocm93SWZEaXNwb3NlZCgpO1xuICByZXR1cm4gZGVwdGhUb1NwYWNlKHRoaXMsIGJsb2NrU2l6ZSwgZGF0YUZvcm1hdCkgYXMgVDtcbn07XG4iXX0=","/**\n * @license\n * Copyright 2020 Google LLC. All Rights Reserved.\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n * =============================================================================\n */\nimport { depthwiseConv2d } from '../../ops/depthwise_conv2d';\nimport { getGlobalTensorClass } from '../../tensor';\ngetGlobalTensorClass().prototype.depthwiseConv2d =\n function (filter, strides, pad, dataFormat, dilations, dimRoundingMode) {\n this.throwIfDisposed();\n return depthwiseConv2d(this, filter, strides, pad, dataFormat, dilations, dimRoundingMode);\n };\n//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZGVwdGh3aXNlX2NvbnYyZC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uLy4uLy4uL3RmanMtY29yZS9zcmMvcHVibGljL2NoYWluZWRfb3BzL2RlcHRod2lzZV9jb252MmQudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUE7Ozs7Ozs7Ozs7Ozs7OztHQWVHO0FBQ0gsT0FBTyxFQUFDLGVBQWUsRUFBQyxNQUFNLDRCQUE0QixDQUFDO0FBQzNELE9BQU8sRUFBQyxvQkFBb0IsRUFBcUIsTUFBTSxjQUFjLENBQUM7QUFhdEUsb0JBQW9CLEVBQUUsQ0FBQyxTQUFTLENBQUMsZUFBZTtJQUM1QyxVQUNJLE1BQTZCLEVBQUUsT0FBZ0MsRUFDL0QsR0FBMEIsRUFBRSxVQUEwQixFQUN0RCxTQUFtQyxFQUNuQyxlQUF3QztRQUM5QyxJQUFJLENBQUMsZUFBZSxFQUFFLENBQUM7UUFDdkIsT0FBTyxlQUFlLENBQ1gsSUFBSSxFQUFFLE1BQU0sRUFBRSxPQUFPLEVBQUUsR0FBRyxFQUFFLFVBQVUsRUFBRSxTQUFTLEVBQ2pELGVBQWUsQ0FBTSxDQUFDO0lBQ25DLENBQUMsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbIi8qKlxuICogQGxpY2Vuc2VcbiAqIENvcHlyaWdodCAyMDIwIEdvb2dsZSBMTEMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuXG4gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgXCJMaWNlbnNlXCIpO1xuICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLlxuICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0XG4gKlxuICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wXG4gKlxuICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZVxuICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gXCJBUyBJU1wiIEJBU0lTLFxuICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuXG4gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kXG4gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS5cbiAqID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4gKi9cbmltcG9ydCB7ZGVwdGh3aXNlQ29udjJkfSBmcm9tICcuLi8uLi9vcHMvZGVwdGh3aXNlX2NvbnYyZCc7XG5pbXBvcnQge2dldEdsb2JhbFRlbnNvckNsYXNzLCBUZW5zb3IzRCwgVGVuc29yNER9IGZyb20gJy4uLy4uL3RlbnNvcic7XG5pbXBvcnQge1JhbmssIFRlbnNvckxpa2U0RH0gZnJvbSAnLi4vLi4vdHlwZXMnO1xuXG5kZWNsYXJlIG1vZHVsZSAnLi4vLi4vdGVuc29yJyB7XG4gIGludGVyZmFjZSBUZW5zb3I8UiBleHRlbmRzIFJhbmsgPSBSYW5rPiB7XG4gICAgZGVwdGh3aXNlQ29udjJkPFQgZXh0ZW5kcyBUZW5zb3IzRHxUZW5zb3I0RD4oXG4gICAgICAgIGZpbHRlcjogVGVuc29yNER8VGVuc29yTGlrZTRELCBzdHJpZGVzOiBbbnVtYmVyLCBudW1iZXJdfG51bWJlcixcbiAgICAgICAgcGFkOiAndmFsaWQnfCdzYW1lJ3xudW1iZXIsIGRhdGFGb3JtYXQ/OiAnTkhXQyd8J05DSFcnLFxuICAgICAgICBkaWxhdGlvbnM/OiBbbnVtYmVyLCBudW1iZXJdfG51bWJlcixcbiAgICAgICAgZGltUm91bmRpbmdNb2RlPzogJ2Zsb29yJ3wncm91bmQnfCdjZWlsJyk6IFQ7XG4gIH1cbn1cblxuZ2V0R2xvYmFsVGVuc29yQ2xhc3MoKS5wcm90b3R5cGUuZGVwdGh3aXNlQ29udjJkID1cbiAgICBmdW5jdGlvbjxUIGV4dGVuZHMgVGVuc29yM0R8VGVuc29yNEQ+KFxuICAgICAgICBmaWx0ZXI6IFRlbnNvcjREfFRlbnNvckxpa2U0RCwgc3RyaWRlczogW251bWJlciwgbnVtYmVyXXxudW1iZXIsXG4gICAgICAgIHBhZDogJ3ZhbGlkJ3wnc2FtZSd8bnVtYmVyLCBkYXRhRm9ybWF0PzogJ05IV0MnfCdOQ0hXJyxcbiAgICAgICAgZGlsYXRpb25zPzogW251bWJlciwgbnVtYmVyXXxudW1iZXIsXG4gICAgICAgIGRpbVJvdW5kaW5nTW9kZT86ICdmbG9vcid8J3JvdW5kJ3wnY2VpbCcpOiBUIHtcbiAgdGhpcy50aHJvd0lmRGlzcG9zZWQoKTtcbiAgcmV0dXJuIGRlcHRod2lzZUNvbnYyZChcbiAgICAgICAgICAgICB0aGlzLCBmaWx0ZXIsIHN0cmlkZXMsIHBhZCwgZGF0YUZvcm1hdCwgZGlsYXRpb25zLFxuICAgICAgICAgICAgIGRpbVJvdW5kaW5nTW9kZSkgYXMgVDtcbn07XG4iXX0=","/**\n * @license\n * Copyright 2020 Google LLC. All Rights Reserved.\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n * =============================================================================\n */\nimport { dilation2d } from '../../ops/dilation2d';\nimport { getGlobalTensorClass } from '../../tensor';\ngetGlobalTensorClass().prototype.dilation2d =\n function (filter, strides, pad, dilations, dataFormat) {\n this.throwIfDisposed();\n return dilation2d(this, filter, strides, pad, dilations, dataFormat);\n };\n//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZGlsYXRpb24yZC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uLy4uLy4uL3RmanMtY29yZS9zcmMvcHVibGljL2NoYWluZWRfb3BzL2RpbGF0aW9uMmQudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUE7Ozs7Ozs7Ozs7Ozs7OztHQWVHO0FBQ0gsT0FBTyxFQUFDLFVBQVUsRUFBQyxNQUFNLHNCQUFzQixDQUFDO0FBQ2hELE9BQU8sRUFBQyxvQkFBb0IsRUFBcUIsTUFBTSxjQUFjLENBQUM7QUFZdEUsb0JBQW9CLEVBQUUsQ0FBQyxTQUFTLENBQUMsVUFBVTtJQUN2QyxVQUNJLE1BQTZCLEVBQUUsT0FBZ0MsRUFDL0QsR0FBbUIsRUFBRSxTQUFtQyxFQUN4RCxVQUFtQjtRQUN6QixJQUFJLENBQUMsZUFBZSxFQUFFLENBQUM7UUFDdkIsT0FBTyxVQUFVLENBQUMsSUFBSSxFQUFFLE1BQU0sRUFBRSxPQUFPLEVBQUUsR0FBRyxFQUFFLFNBQVMsRUFBRSxVQUFVLENBQU0sQ0FBQztJQUM1RSxDQUFDLENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyIvKipcbiAqIEBsaWNlbnNlXG4gKiBDb3B5cmlnaHQgMjAyMCBHb29nbGUgTExDLiBBbGwgUmlnaHRzIFJlc2VydmVkLlxuICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlIFwiTGljZW5zZVwiKTtcbiAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS5cbiAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdFxuICpcbiAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMFxuICpcbiAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmVcbiAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuIFwiQVMgSVNcIiBCQVNJUyxcbiAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLlxuICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZFxuICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuXG4gKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuICovXG5pbXBvcnQge2RpbGF0aW9uMmR9IGZyb20gJy4uLy4uL29wcy9kaWxhdGlvbjJkJztcbmltcG9ydCB7Z2V0R2xvYmFsVGVuc29yQ2xhc3MsIFRlbnNvcjNELCBUZW5zb3I0RH0gZnJvbSAnLi4vLi4vdGVuc29yJztcbmltcG9ydCB7UmFuaywgVGVuc29yTGlrZTNEfSBmcm9tICcuLi8uLi90eXBlcyc7XG5cbmRlY2xhcmUgbW9kdWxlICcuLi8uLi90ZW5zb3InIHtcbiAgaW50ZXJmYWNlIFRlbnNvcjxSIGV4dGVuZHMgUmFuayA9IFJhbms+IHtcbiAgICBkaWxhdGlvbjJkPFQgZXh0ZW5kcyBUZW5zb3IzRHxUZW5zb3I0RD4oXG4gICAgICAgIGZpbHRlcjogVGVuc29yM0R8VGVuc29yTGlrZTNELCBzdHJpZGVzOiBbbnVtYmVyLCBudW1iZXJdfG51bWJlcixcbiAgICAgICAgcGFkOiAndmFsaWQnfCdzYW1lJywgZGlsYXRpb25zPzogW251bWJlciwgbnVtYmVyXXxudW1iZXIsXG4gICAgICAgIGRhdGFGb3JtYXQ/OiAnTkhXQycpOiBUO1xuICB9XG59XG5cbmdldEdsb2JhbFRlbnNvckNsYXNzKCkucHJvdG90eXBlLmRpbGF0aW9uMmQgPVxuICAgIGZ1bmN0aW9uPFQgZXh0ZW5kcyBUZW5zb3IzRHxUZW5zb3I0RD4oXG4gICAgICAgIGZpbHRlcjogVGVuc29yM0R8VGVuc29yTGlrZTNELCBzdHJpZGVzOiBbbnVtYmVyLCBudW1iZXJdfG51bWJlcixcbiAgICAgICAgcGFkOiAndmFsaWQnfCdzYW1lJywgZGlsYXRpb25zPzogW251bWJlciwgbnVtYmVyXXxudW1iZXIsXG4gICAgICAgIGRhdGFGb3JtYXQ/OiAnTkhXQycpOiBUIHtcbiAgdGhpcy50aHJvd0lmRGlzcG9zZWQoKTtcbiAgcmV0dXJuIGRpbGF0aW9uMmQodGhpcywgZmlsdGVyLCBzdHJpZGVzLCBwYWQsIGRpbGF0aW9ucywgZGF0YUZvcm1hdCkgYXMgVDtcbn07XG4iXX0=","/**\n * @license\n * Copyright 2020 Google LLC. All Rights Reserved.\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n * =============================================================================\n */\nimport { divNoNan } from '../../ops/div_no_nan';\nimport { getGlobalTensorClass } from '../../tensor';\ngetGlobalTensorClass().prototype.divNoNan = function (b) {\n this.throwIfDisposed();\n return divNoNan(this, b);\n};\n//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZGl2X25vX25hbi5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uLy4uLy4uL3RmanMtY29yZS9zcmMvcHVibGljL2NoYWluZWRfb3BzL2Rpdl9ub19uYW4udHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUE7Ozs7Ozs7Ozs7Ozs7OztHQWVHO0FBRUgsT0FBTyxFQUFDLFFBQVEsRUFBQyxNQUFNLHNCQUFzQixDQUFDO0FBQzlDLE9BQU8sRUFBQyxvQkFBb0IsRUFBUyxNQUFNLGNBQWMsQ0FBQztBQVMxRCxvQkFBb0IsRUFBRSxDQUFDLFNBQVMsQ0FBQyxRQUFRLEdBQUcsVUFDeEMsQ0FBb0I7SUFDdEIsSUFBSSxDQUFDLGVBQWUsRUFBRSxDQUFDO0lBQ3ZCLE9BQU8sUUFBUSxDQUFDLElBQUksRUFBRSxDQUFDLENBQUMsQ0FBQztBQUMzQixDQUFDLENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyIvKipcbiAqIEBsaWNlbnNlXG4gKiBDb3B5cmlnaHQgMjAyMCBHb29nbGUgTExDLiBBbGwgUmlnaHRzIFJlc2VydmVkLlxuICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlIFwiTGljZW5zZVwiKTtcbiAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS5cbiAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdFxuICpcbiAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMFxuICpcbiAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmVcbiAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuIFwiQVMgSVNcIiBCQVNJUyxcbiAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLlxuICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZFxuICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuXG4gKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuICovXG5cbmltcG9ydCB7ZGl2Tm9OYW59IGZyb20gJy4uLy4uL29wcy9kaXZfbm9fbmFuJztcbmltcG9ydCB7Z2V0R2xvYmFsVGVuc29yQ2xhc3MsIFRlbnNvcn0gZnJvbSAnLi4vLi4vdGVuc29yJztcbmltcG9ydCB7UmFuaywgVGVuc29yTGlrZX0gZnJvbSAnLi4vLi4vdHlwZXMnO1xuXG5kZWNsYXJlIG1vZHVsZSAnLi4vLi4vdGVuc29yJyB7XG4gIGludGVyZmFjZSBUZW5zb3I8UiBleHRlbmRzIFJhbmsgPSBSYW5rPiB7XG4gICAgZGl2Tm9OYW48VCBleHRlbmRzIFRlbnNvcj4oYjogVGVuc29yfFRlbnNvckxpa2UpOiBUO1xuICB9XG59XG5cbmdldEdsb2JhbFRlbnNvckNsYXNzKCkucHJvdG90eXBlLmRpdk5vTmFuID0gZnVuY3Rpb248VCBleHRlbmRzIFRlbnNvcj4oXG4gICAgYjogVGVuc29yfFRlbnNvckxpa2UpOiBUIHtcbiAgdGhpcy50aHJvd0lmRGlzcG9zZWQoKTtcbiAgcmV0dXJuIGRpdk5vTmFuKHRoaXMsIGIpO1xufTtcbiJdfQ==","/**\n * @license\n * Copyright 2020 Google LLC. All Rights Reserved.\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n * =============================================================================\n */\nimport { div } from '../../ops/div';\nimport { getGlobalTensorClass } from '../../tensor';\ngetGlobalTensorClass().prototype.div = function (b) {\n this.throwIfDisposed();\n return div(this, b);\n};\n//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZGl2LmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vLi4vLi4vdGZqcy1jb3JlL3NyYy9wdWJsaWMvY2hhaW5lZF9vcHMvZGl2LnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBOzs7Ozs7Ozs7Ozs7Ozs7R0FlRztBQUVILE9BQU8sRUFBQyxHQUFHLEVBQUMsTUFBTSxlQUFlLENBQUM7QUFDbEMsT0FBTyxFQUFDLG9CQUFvQixFQUFTLE1BQU0sY0FBYyxDQUFDO0FBUzFELG9CQUFvQixFQUFFLENBQUMsU0FBUyxDQUFDLEdBQUcsR0FBRyxVQUNuQyxDQUFvQjtJQUN0QixJQUFJLENBQUMsZUFBZSxFQUFFLENBQUM7SUFDdkIsT0FBTyxHQUFHLENBQUMsSUFBSSxFQUFFLENBQUMsQ0FBQyxDQUFDO0FBQ3RCLENBQUMsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbIi8qKlxuICogQGxpY2Vuc2VcbiAqIENvcHlyaWdodCAyMDIwIEdvb2dsZSBMTEMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuXG4gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgXCJMaWNlbnNlXCIpO1xuICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLlxuICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0XG4gKlxuICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wXG4gKlxuICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZVxuICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gXCJBUyBJU1wiIEJBU0lTLFxuICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuXG4gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kXG4gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS5cbiAqID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4gKi9cblxuaW1wb3J0IHtkaXZ9IGZyb20gJy4uLy4uL29wcy9kaXYnO1xuaW1wb3J0IHtnZXRHbG9iYWxUZW5zb3JDbGFzcywgVGVuc29yfSBmcm9tICcuLi8uLi90ZW5zb3InO1xuaW1wb3J0IHtSYW5rLCBUZW5zb3JMaWtlfSBmcm9tICcuLi8uLi90eXBlcyc7XG5cbmRlY2xhcmUgbW9kdWxlICcuLi8uLi90ZW5zb3InIHtcbiAgaW50ZXJmYWNlIFRlbnNvcjxSIGV4dGVuZHMgUmFuayA9IFJhbms+IHtcbiAgICBkaXY8VCBleHRlbmRzIFRlbnNvcj4oYjogVGVuc29yfFRlbnNvckxpa2UpOiBUO1xuICB9XG59XG5cbmdldEdsb2JhbFRlbnNvckNsYXNzKCkucHJvdG90eXBlLmRpdiA9IGZ1bmN0aW9uPFQgZXh0ZW5kcyBUZW5zb3I+KFxuICAgIGI6IFRlbnNvcnxUZW5zb3JMaWtlKTogVCB7XG4gIHRoaXMudGhyb3dJZkRpc3Bvc2VkKCk7XG4gIHJldHVybiBkaXYodGhpcywgYik7XG59O1xuIl19","/**\n * @license\n * Copyright 2020 Google LLC. All Rights Reserved.\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n * =============================================================================\n */\nimport { dot } from '../../ops/dot';\nimport { getGlobalTensorClass } from '../../tensor';\ngetGlobalTensorClass().prototype.dot = function (b) {\n this.throwIfDisposed();\n return dot(this, b);\n};\n//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZG90LmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vLi4vLi4vdGZqcy1jb3JlL3NyYy9wdWJsaWMvY2hhaW5lZF9vcHMvZG90LnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBOzs7Ozs7Ozs7Ozs7Ozs7R0FlRztBQUNILE9BQU8sRUFBQyxHQUFHLEVBQUMsTUFBTSxlQUFlLENBQUM7QUFDbEMsT0FBTyxFQUFDLG9CQUFvQixFQUFTLE1BQU0sY0FBYyxDQUFDO0FBUzFELG9CQUFvQixFQUFFLENBQUMsU0FBUyxDQUFDLEdBQUcsR0FBRyxVQUNuQyxDQUFlO0lBQ2pCLElBQUksQ0FBQyxlQUFlLEVBQUUsQ0FBQztJQUN2QixPQUFPLEdBQUcsQ0FBQyxJQUFJLEVBQUUsQ0FBQyxDQUFDLENBQUM7QUFDdEIsQ0FBQyxDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiLyoqXG4gKiBAbGljZW5zZVxuICogQ29weXJpZ2h0IDIwMjAgR29vZ2xlIExMQy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC5cbiAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSBcIkxpY2Vuc2VcIik7XG4gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuXG4gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXRcbiAqXG4gKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjBcbiAqXG4gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlXG4gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiBcIkFTIElTXCIgQkFTSVMsXG4gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC5cbiAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmRcbiAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLlxuICogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbiAqL1xuaW1wb3J0IHtkb3R9IGZyb20gJy4uLy4uL29wcy9kb3QnO1xuaW1wb3J0IHtnZXRHbG9iYWxUZW5zb3JDbGFzcywgVGVuc29yfSBmcm9tICcuLi8uLi90ZW5zb3InO1xuaW1wb3J0IHtSYW5rLCBUZW5zb3JMaWtlfSBmcm9tICcuLi8uLi90eXBlcyc7XG5cbmRlY2xhcmUgbW9kdWxlICcuLi8uLi90ZW5zb3InIHtcbiAgaW50ZXJmYWNlIFRlbnNvcjxSIGV4dGVuZHMgUmFuayA9IFJhbms+IHtcbiAgICBkb3Q8VCBleHRlbmRzIFRlbnNvcj4oYjogVGVuc29yfFRlbnNvckxpa2UpOiBUZW5zb3I7XG4gIH1cbn1cblxuZ2V0R2xvYmFsVGVuc29yQ2xhc3MoKS5wcm90b3R5cGUuZG90ID0gZnVuY3Rpb248VCBleHRlbmRzIFRlbnNvcj4oXG4gICAgYjogVHxUZW5zb3JMaWtlKTogVGVuc29yIHtcbiAgdGhpcy50aHJvd0lmRGlzcG9zZWQoKTtcbiAgcmV0dXJuIGRvdCh0aGlzLCBiKTtcbn07XG4iXX0=","/**\n * @license\n * Copyright 2020 Google LLC. All Rights Reserved.\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n * =============================================================================\n */\nimport { elu } from '../../ops/elu';\nimport { getGlobalTensorClass } from '../../tensor';\ngetGlobalTensorClass().prototype.elu = function () {\n this.throwIfDisposed();\n return elu(this);\n};\n//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZWx1LmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vLi4vLi4vdGZqcy1jb3JlL3NyYy9wdWJsaWMvY2hhaW5lZF9vcHMvZWx1LnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBOzs7Ozs7Ozs7Ozs7Ozs7R0FlRztBQUNILE9BQU8sRUFBQyxHQUFHLEVBQUMsTUFBTSxlQUFlLENBQUM7QUFDbEMsT0FBTyxFQUFDLG9CQUFvQixFQUFTLE1BQU0sY0FBYyxDQUFDO0FBUzFELG9CQUFvQixFQUFFLENBQUMsU0FBUyxDQUFDLEdBQUcsR0FBRztJQUNyQyxJQUFJLENBQUMsZUFBZSxFQUFFLENBQUM7SUFDdkIsT0FBTyxHQUFHLENBQUMsSUFBSSxDQUFDLENBQUM7QUFDbkIsQ0FBQyxDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiLyoqXG4gKiBAbGljZW5zZVxuICogQ29weXJpZ2h0IDIwMjAgR29vZ2xlIExMQy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC5cbiAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSBcIkxpY2Vuc2VcIik7XG4gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuXG4gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXRcbiAqXG4gKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjBcbiAqXG4gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlXG4gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiBcIkFTIElTXCIgQkFTSVMsXG4gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC5cbiAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmRcbiAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLlxuICogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbiAqL1xuaW1wb3J0IHtlbHV9IGZyb20gJy4uLy4uL29wcy9lbHUnO1xuaW1wb3J0IHtnZXRHbG9iYWxUZW5zb3JDbGFzcywgVGVuc29yfSBmcm9tICcuLi8uLi90ZW5zb3InO1xuaW1wb3J0IHtSYW5rfSBmcm9tICcuLi8uLi90eXBlcyc7XG5cbmRlY2xhcmUgbW9kdWxlICcuLi8uLi90ZW5zb3InIHtcbiAgaW50ZXJmYWNlIFRlbnNvcjxSIGV4dGVuZHMgUmFuayA9IFJhbms+IHtcbiAgICBlbHU8VCBleHRlbmRzIFRlbnNvcj4oKTogVDtcbiAgfVxufVxuXG5nZXRHbG9iYWxUZW5zb3JDbGFzcygpLnByb3RvdHlwZS5lbHUgPSBmdW5jdGlvbjxUIGV4dGVuZHMgVGVuc29yPih0aGlzOiBUKTogVCB7XG4gIHRoaXMudGhyb3dJZkRpc3Bvc2VkKCk7XG4gIHJldHVybiBlbHUodGhpcyk7XG59O1xuIl19","/**\n * @license\n * Copyright 2020 Google LLC. All Rights Reserved.\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n * =============================================================================\n */\nimport { equal } from '../../ops/equal';\nimport { getGlobalTensorClass } from '../../tensor';\ngetGlobalTensorClass().prototype.equal = function (b) {\n this.throwIfDisposed();\n return equal(this, b);\n};\n//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZXF1YWwuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi8uLi8uLi90ZmpzLWNvcmUvc3JjL3B1YmxpYy9jaGFpbmVkX29wcy9lcXVhbC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQTs7Ozs7Ozs7Ozs7Ozs7O0dBZUc7QUFDSCxPQUFPLEVBQUMsS0FBSyxFQUFDLE1BQU0saUJBQWlCLENBQUM7QUFDdEMsT0FBTyxFQUFDLG9CQUFvQixFQUFTLE1BQU0sY0FBYyxDQUFDO0FBUzFELG9CQUFvQixFQUFFLENBQUMsU0FBUyxDQUFDLEtBQUssR0FBRyxVQUNyQyxDQUFvQjtJQUN0QixJQUFJLENBQUMsZUFBZSxFQUFFLENBQUM7SUFDdkIsT0FBTyxLQUFLLENBQUMsSUFBSSxFQUFFLENBQUMsQ0FBQyxDQUFDO0FBQ3hCLENBQUMsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbIi8qKlxuICogQGxpY2Vuc2VcbiAqIENvcHlyaWdodCAyMDIwIEdvb2dsZSBMTEMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuXG4gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgXCJMaWNlbnNlXCIpO1xuICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLlxuICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0XG4gKlxuICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wXG4gKlxuICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZVxuICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gXCJBUyBJU1wiIEJBU0lTLFxuICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuXG4gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kXG4gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS5cbiAqID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4gKi9cbmltcG9ydCB7ZXF1YWx9IGZyb20gJy4uLy4uL29wcy9lcXVhbCc7XG5pbXBvcnQge2dldEdsb2JhbFRlbnNvckNsYXNzLCBUZW5zb3J9IGZyb20gJy4uLy4uL3RlbnNvcic7XG5pbXBvcnQge1JhbmssIFRlbnNvckxpa2V9IGZyb20gJy4uLy4uL3R5cGVzJztcblxuZGVjbGFyZSBtb2R1bGUgJy4uLy4uL3RlbnNvcicge1xuICBpbnRlcmZhY2UgVGVuc29yPFIgZXh0ZW5kcyBSYW5rID0gUmFuaz4ge1xuICAgIGVxdWFsPFQgZXh0ZW5kcyBUZW5zb3I+KGI6IFRlbnNvcnxUZW5zb3JMaWtlKTogVDtcbiAgfVxufVxuXG5nZXRHbG9iYWxUZW5zb3JDbGFzcygpLnByb3RvdHlwZS5lcXVhbCA9IGZ1bmN0aW9uPFQgZXh0ZW5kcyBUZW5zb3I+KFxuICAgIGI6IFRlbnNvcnxUZW5zb3JMaWtlKTogVCB7XG4gIHRoaXMudGhyb3dJZkRpc3Bvc2VkKCk7XG4gIHJldHVybiBlcXVhbCh0aGlzLCBiKTtcbn07XG4iXX0=","/**\n * @license\n * Copyright 2020 Google LLC. All Rights Reserved.\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n * =============================================================================\n */\n// TODO update import path once op is modularized.\nimport { erf } from '../../ops/ops';\nimport { getGlobalTensorClass } from '../../tensor';\ngetGlobalTensorClass().prototype.erf = function () {\n this.throwIfDisposed();\n return erf(this);\n};\n//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZXJmLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vLi4vLi4vdGZqcy1jb3JlL3NyYy9wdWJsaWMvY2hhaW5lZF9vcHMvZXJmLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBOzs7Ozs7Ozs7Ozs7Ozs7R0FlRztBQUVILGtEQUFrRDtBQUNsRCxPQUFPLEVBQUMsR0FBRyxFQUFDLE1BQU0sZUFBZSxDQUFDO0FBQ2xDLE9BQU8sRUFBQyxvQkFBb0IsRUFBUyxNQUFNLGNBQWMsQ0FBQztBQVMxRCxvQkFBb0IsRUFBRSxDQUFDLFNBQVMsQ0FBQyxHQUFHLEdBQUc7SUFDckMsSUFBSSxDQUFDLGVBQWUsRUFBRSxDQUFDO0lBQ3ZCLE9BQU8sR0FBRyxDQUFDLElBQUksQ0FBQyxDQUFDO0FBQ25CLENBQUMsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbIi8qKlxuICogQGxpY2Vuc2VcbiAqIENvcHlyaWdodCAyMDIwIEdvb2dsZSBMTEMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuXG4gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgXCJMaWNlbnNlXCIpO1xuICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLlxuICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0XG4gKlxuICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wXG4gKlxuICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZVxuICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gXCJBUyBJU1wiIEJBU0lTLFxuICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuXG4gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kXG4gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS5cbiAqID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4gKi9cblxuLy8gVE9ETyB1cGRhdGUgaW1wb3J0IHBhdGggb25jZSBvcCBpcyBtb2R1bGFyaXplZC5cbmltcG9ydCB7ZXJmfSBmcm9tICcuLi8uLi9vcHMvb3BzJztcbmltcG9ydCB7Z2V0R2xvYmFsVGVuc29yQ2xhc3MsIFRlbnNvcn0gZnJvbSAnLi4vLi4vdGVuc29yJztcbmltcG9ydCB7UmFua30gZnJvbSAnLi4vLi4vdHlwZXMnO1xuXG5kZWNsYXJlIG1vZHVsZSAnLi4vLi4vdGVuc29yJyB7XG4gIGludGVyZmFjZSBUZW5zb3I8UiBleHRlbmRzIFJhbmsgPSBSYW5rPiB7XG4gICAgZXJmPFQgZXh0ZW5kcyBUZW5zb3I+KHRoaXM6IFQpOiBUO1xuICB9XG59XG5cbmdldEdsb2JhbFRlbnNvckNsYXNzKCkucHJvdG90eXBlLmVyZiA9IGZ1bmN0aW9uPFQgZXh0ZW5kcyBUZW5zb3I+KHRoaXM6IFQpOiBUIHtcbiAgdGhpcy50aHJvd0lmRGlzcG9zZWQoKTtcbiAgcmV0dXJuIGVyZih0aGlzKTtcbn07XG4iXX0=","/**\n * @license\n * Copyright 2021 Google LLC. All Rights Reserved.\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n * =============================================================================\n */\nimport { euclideanNorm } from '../../ops/euclidean_norm';\nimport { getGlobalTensorClass } from '../../tensor';\ngetGlobalTensorClass().prototype.euclideanNorm = function (axis, keepDims) {\n this.throwIfDisposed();\n return euclideanNorm(this, axis, keepDims);\n};\n//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZXVjbGlkZWFuX25vcm0uanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi8uLi8uLi90ZmpzLWNvcmUvc3JjL3B1YmxpYy9jaGFpbmVkX29wcy9ldWNsaWRlYW5fbm9ybS50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQTs7Ozs7Ozs7Ozs7Ozs7O0dBZUc7QUFFSCxPQUFPLEVBQUMsYUFBYSxFQUFDLE1BQU0sMEJBQTBCLENBQUM7QUFDdkQsT0FBTyxFQUFDLG9CQUFvQixFQUFTLE1BQU0sY0FBYyxDQUFDO0FBVTFELG9CQUFvQixFQUFFLENBQUMsU0FBUyxDQUFDLGFBQWEsR0FBRyxVQUNwQyxJQUFzQixFQUFFLFFBQWtCO0lBQ3JELElBQUksQ0FBQyxlQUFlLEVBQUUsQ0FBQztJQUN2QixPQUFPLGFBQWEsQ0FBQyxJQUFJLEVBQUUsSUFBSSxFQUFFLFFBQVEsQ0FBTSxDQUFDO0FBQ2xELENBQUMsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbIi8qKlxuICogQGxpY2Vuc2VcbiAqIENvcHlyaWdodCAyMDIxIEdvb2dsZSBMTEMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuXG4gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgXCJMaWNlbnNlXCIpO1xuICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLlxuICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0XG4gKlxuICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wXG4gKlxuICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZVxuICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gXCJBUyBJU1wiIEJBU0lTLFxuICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuXG4gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kXG4gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS5cbiAqID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4gKi9cblxuaW1wb3J0IHtldWNsaWRlYW5Ob3JtfSBmcm9tICcuLi8uLi9vcHMvZXVjbGlkZWFuX25vcm0nO1xuaW1wb3J0IHtnZXRHbG9iYWxUZW5zb3JDbGFzcywgVGVuc29yfSBmcm9tICcuLi8uLi90ZW5zb3InO1xuaW1wb3J0IHtSYW5rfSBmcm9tICcuLi8uLi90eXBlcyc7XG5cbmRlY2xhcmUgbW9kdWxlICcuLi8uLi90ZW5zb3InIHtcbiAgaW50ZXJmYWNlIFRlbnNvcjxSIGV4dGVuZHMgUmFuayA9IFJhbms+IHtcbiAgICBldWNsaWRlYW5Ob3JtPFQgZXh0ZW5kcyBUZW5zb3I+KFxuICAgICAgICB0aGlzOiBULCBheGlzPzogbnVtYmVyfG51bWJlcltdLCBrZWVwRGltcz86IGJvb2xlYW4pOiBUO1xuICB9XG59XG5cbmdldEdsb2JhbFRlbnNvckNsYXNzKCkucHJvdG90eXBlLmV1Y2xpZGVhbk5vcm0gPSBmdW5jdGlvbjxUIGV4dGVuZHMgVGVuc29yPihcbiAgICB0aGlzOiBULCBheGlzPzogbnVtYmVyfG51bWJlcltdLCBrZWVwRGltcz86IGJvb2xlYW4pOiBUIHtcbiAgdGhpcy50aHJvd0lmRGlzcG9zZWQoKTtcbiAgcmV0dXJuIGV1Y2xpZGVhbk5vcm0odGhpcywgYXhpcywga2VlcERpbXMpIGFzIFQ7XG59O1xuIl19","/**\n * @license\n * Copyright 2020 Google LLC. All Rights Reserved.\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n * =============================================================================\n */\n// TODO update import path once op is modularized.\nimport { exp } from '../../ops/ops';\nimport { getGlobalTensorClass } from '../../tensor';\ngetGlobalTensorClass().prototype.exp = function () {\n this.throwIfDisposed();\n return exp(this);\n};\n//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZXhwLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vLi4vLi4vdGZqcy1jb3JlL3NyYy9wdWJsaWMvY2hhaW5lZF9vcHMvZXhwLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBOzs7Ozs7Ozs7Ozs7Ozs7R0FlRztBQUVILGtEQUFrRDtBQUNsRCxPQUFPLEVBQUMsR0FBRyxFQUFDLE1BQU0sZUFBZSxDQUFDO0FBQ2xDLE9BQU8sRUFBQyxvQkFBb0IsRUFBUyxNQUFNLGNBQWMsQ0FBQztBQVMxRCxvQkFBb0IsRUFBRSxDQUFDLFNBQVMsQ0FBQyxHQUFHLEdBQUc7SUFDckMsSUFBSSxDQUFDLGVBQWUsRUFBRSxDQUFDO0lBQ3ZCLE9BQU8sR0FBRyxDQUFDLElBQUksQ0FBQyxDQUFDO0FBQ25CLENBQUMsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbIi8qKlxuICogQGxpY2Vuc2VcbiAqIENvcHlyaWdodCAyMDIwIEdvb2dsZSBMTEMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuXG4gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgXCJMaWNlbnNlXCIpO1xuICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLlxuICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0XG4gKlxuICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wXG4gKlxuICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZVxuICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gXCJBUyBJU1wiIEJBU0lTLFxuICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuXG4gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kXG4gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS5cbiAqID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4gKi9cblxuLy8gVE9ETyB1cGRhdGUgaW1wb3J0IHBhdGggb25jZSBvcCBpcyBtb2R1bGFyaXplZC5cbmltcG9ydCB7ZXhwfSBmcm9tICcuLi8uLi9vcHMvb3BzJztcbmltcG9ydCB7Z2V0R2xvYmFsVGVuc29yQ2xhc3MsIFRlbnNvcn0gZnJvbSAnLi4vLi4vdGVuc29yJztcbmltcG9ydCB7UmFua30gZnJvbSAnLi4vLi4vdHlwZXMnO1xuXG5kZWNsYXJlIG1vZHVsZSAnLi4vLi4vdGVuc29yJyB7XG4gIGludGVyZmFjZSBUZW5zb3I8UiBleHRlbmRzIFJhbmsgPSBSYW5rPiB7XG4gICAgZXhwPFQgZXh0ZW5kcyBUZW5zb3I+KHRoaXM6IFQpOiBUO1xuICB9XG59XG5cbmdldEdsb2JhbFRlbnNvckNsYXNzKCkucHJvdG90eXBlLmV4cCA9IGZ1bmN0aW9uPFQgZXh0ZW5kcyBUZW5zb3I+KHRoaXM6IFQpOiBUIHtcbiAgdGhpcy50aHJvd0lmRGlzcG9zZWQoKTtcbiAgcmV0dXJuIGV4cCh0aGlzKTtcbn07XG4iXX0=","/**\n * @license\n * Copyright 2020 Google LLC. All Rights Reserved.\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n * =============================================================================\n */\nimport { expandDims } from '../../ops/expand_dims';\nimport { getGlobalTensorClass } from '../../tensor';\ngetGlobalTensorClass().prototype.expandDims = function (axis) {\n this.throwIfDisposed();\n return expandDims(this, axis);\n};\n//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZXhwYW5kX2RpbXMuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi8uLi8uLi90ZmpzLWNvcmUvc3JjL3B1YmxpYy9jaGFpbmVkX29wcy9leHBhbmRfZGltcy50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQTs7Ozs7Ozs7Ozs7Ozs7O0dBZUc7QUFDSCxPQUFPLEVBQUMsVUFBVSxFQUFDLE1BQU0sdUJBQXVCLENBQUM7QUFDakQsT0FBTyxFQUFDLG9CQUFvQixFQUFTLE1BQU0sY0FBYyxDQUFDO0FBUzFELG9CQUFvQixFQUFFLENBQUMsU0FBUyxDQUFDLFVBQVUsR0FBRyxVQUMxQyxJQUFhO0lBQ2YsSUFBSSxDQUFDLGVBQWUsRUFBRSxDQUFDO0lBQ3ZCLE9BQU8sVUFBVSxDQUFDLElBQUksRUFBRSxJQUFJLENBQUMsQ0FBQztBQUNoQyxDQUFDLENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyIvKipcbiAqIEBsaWNlbnNlXG4gKiBDb3B5cmlnaHQgMjAyMCBHb29nbGUgTExDLiBBbGwgUmlnaHRzIFJlc2VydmVkLlxuICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlIFwiTGljZW5zZVwiKTtcbiAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS5cbiAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdFxuICpcbiAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMFxuICpcbiAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmVcbiAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuIFwiQVMgSVNcIiBCQVNJUyxcbiAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLlxuICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZFxuICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuXG4gKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuICovXG5pbXBvcnQge2V4cGFuZERpbXN9IGZyb20gJy4uLy4uL29wcy9leHBhbmRfZGltcyc7XG5pbXBvcnQge2dldEdsb2JhbFRlbnNvckNsYXNzLCBUZW5zb3J9IGZyb20gJy4uLy4uL3RlbnNvcic7XG5pbXBvcnQge1Jhbmt9IGZyb20gJy4uLy4uL3R5cGVzJztcblxuZGVjbGFyZSBtb2R1bGUgJy4uLy4uL3RlbnNvcicge1xuICBpbnRlcmZhY2UgVGVuc29yPFIgZXh0ZW5kcyBSYW5rID0gUmFuaz4ge1xuICAgIGV4cGFuZERpbXM8VCBleHRlbmRzIFRlbnNvcj4oYXhpcz86IG51bWJlcik6IFQ7XG4gIH1cbn1cblxuZ2V0R2xvYmFsVGVuc29yQ2xhc3MoKS5wcm90b3R5cGUuZXhwYW5kRGltcyA9IGZ1bmN0aW9uPFQgZXh0ZW5kcyBUZW5zb3I+KFxuICAgIGF4aXM/OiBudW1iZXIpOiBUIHtcbiAgdGhpcy50aHJvd0lmRGlzcG9zZWQoKTtcbiAgcmV0dXJuIGV4cGFuZERpbXModGhpcywgYXhpcyk7XG59O1xuIl19","/**\n * @license\n * Copyright 2020 Google LLC. All Rights Reserved.\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n * =============================================================================\n */\n// TODO update import path once op is modularized.\nimport { expm1 } from '../../ops/ops';\nimport { getGlobalTensorClass } from '../../tensor';\ngetGlobalTensorClass().prototype.expm1 = function () {\n this.throwIfDisposed();\n return expm1(this);\n};\n//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZXhwbTEuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi8uLi8uLi90ZmpzLWNvcmUvc3JjL3B1YmxpYy9jaGFpbmVkX29wcy9leHBtMS50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQTs7Ozs7Ozs7Ozs7Ozs7O0dBZUc7QUFFSCxrREFBa0Q7QUFDbEQsT0FBTyxFQUFDLEtBQUssRUFBQyxNQUFNLGVBQWUsQ0FBQztBQUNwQyxPQUFPLEVBQUMsb0JBQW9CLEVBQVMsTUFBTSxjQUFjLENBQUM7QUFTMUQsb0JBQW9CLEVBQUUsQ0FBQyxTQUFTLENBQUMsS0FBSyxHQUFHO0lBRXZDLElBQUksQ0FBQyxlQUFlLEVBQUUsQ0FBQztJQUN2QixPQUFPLEtBQUssQ0FBQyxJQUFJLENBQUMsQ0FBQztBQUNyQixDQUFDLENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyIvKipcbiAqIEBsaWNlbnNlXG4gKiBDb3B5cmlnaHQgMjAyMCBHb29nbGUgTExDLiBBbGwgUmlnaHRzIFJlc2VydmVkLlxuICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlIFwiTGljZW5zZVwiKTtcbiAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS5cbiAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdFxuICpcbiAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMFxuICpcbiAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmVcbiAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuIFwiQVMgSVNcIiBCQVNJUyxcbiAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLlxuICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZFxuICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuXG4gKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuICovXG5cbi8vIFRPRE8gdXBkYXRlIGltcG9ydCBwYXRoIG9uY2Ugb3AgaXMgbW9kdWxhcml6ZWQuXG5pbXBvcnQge2V4cG0xfSBmcm9tICcuLi8uLi9vcHMvb3BzJztcbmltcG9ydCB7Z2V0R2xvYmFsVGVuc29yQ2xhc3MsIFRlbnNvcn0gZnJvbSAnLi4vLi4vdGVuc29yJztcbmltcG9ydCB7UmFua30gZnJvbSAnLi4vLi4vdHlwZXMnO1xuXG5kZWNsYXJlIG1vZHVsZSAnLi4vLi4vdGVuc29yJyB7XG4gIGludGVyZmFjZSBUZW5zb3I8UiBleHRlbmRzIFJhbmsgPSBSYW5rPiB7XG4gICAgZXhwbTE8VCBleHRlbmRzIFRlbnNvcj4odGhpczogVCk6IFQ7XG4gIH1cbn1cblxuZ2V0R2xvYmFsVGVuc29yQ2xhc3MoKS5wcm90b3R5cGUuZXhwbTEgPSBmdW5jdGlvbjxUIGV4dGVuZHMgVGVuc29yPih0aGlzOiBUKTpcbiAgICBUIHtcbiAgdGhpcy50aHJvd0lmRGlzcG9zZWQoKTtcbiAgcmV0dXJuIGV4cG0xKHRoaXMpO1xufTtcbiJdfQ==","/**\n * @license\n * Copyright 2020 Google LLC. All Rights Reserved.\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n * =============================================================================\n */\n// TODO update import path once op is modularized.\nimport { fft } from '../../ops/ops';\nimport { getGlobalTensorClass } from '../../tensor';\ngetGlobalTensorClass().prototype.fft = function () {\n this.throwIfDisposed();\n return fft(this);\n};\n//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZmZ0LmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vLi4vLi4vdGZqcy1jb3JlL3NyYy9wdWJsaWMvY2hhaW5lZF9vcHMvZmZ0LnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBOzs7Ozs7Ozs7Ozs7Ozs7R0FlRztBQUVILGtEQUFrRDtBQUNsRCxPQUFPLEVBQUMsR0FBRyxFQUFDLE1BQU0sZUFBZSxDQUFDO0FBQ2xDLE9BQU8sRUFBQyxvQkFBb0IsRUFBUyxNQUFNLGNBQWMsQ0FBQztBQVMxRCxvQkFBb0IsRUFBRSxDQUFDLFNBQVMsQ0FBQyxHQUFHLEdBQUc7SUFFckMsSUFBSSxDQUFDLGVBQWUsRUFBRSxDQUFDO0lBQ3ZCLE9BQU8sR0FBRyxDQUFDLElBQUksQ0FBTSxDQUFDO0FBQ3hCLENBQUMsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbIi8qKlxuICogQGxpY2Vuc2VcbiAqIENvcHlyaWdodCAyMDIwIEdvb2dsZSBMTEMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuXG4gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgXCJMaWNlbnNlXCIpO1xuICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLlxuICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0XG4gKlxuICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wXG4gKlxuICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZVxuICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gXCJBUyBJU1wiIEJBU0lTLFxuICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuXG4gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kXG4gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS5cbiAqID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4gKi9cblxuLy8gVE9ETyB1cGRhdGUgaW1wb3J0IHBhdGggb25jZSBvcCBpcyBtb2R1bGFyaXplZC5cbmltcG9ydCB7ZmZ0fSBmcm9tICcuLi8uLi9vcHMvb3BzJztcbmltcG9ydCB7Z2V0R2xvYmFsVGVuc29yQ2xhc3MsIFRlbnNvcn0gZnJvbSAnLi4vLi4vdGVuc29yJztcbmltcG9ydCB7UmFua30gZnJvbSAnLi4vLi4vdHlwZXMnO1xuXG5kZWNsYXJlIG1vZHVsZSAnLi4vLi4vdGVuc29yJyB7XG4gIGludGVyZmFjZSBUZW5zb3I8UiBleHRlbmRzIFJhbmsgPSBSYW5rPiB7XG4gICAgZmZ0PFQgZXh0ZW5kcyBUZW5zb3I+KHRoaXM6IFRlbnNvcik6IFRlbnNvcjtcbiAgfVxufVxuXG5nZXRHbG9iYWxUZW5zb3JDbGFzcygpLnByb3RvdHlwZS5mZnQgPSBmdW5jdGlvbjxUIGV4dGVuZHMgVGVuc29yPih0aGlzOiBUZW5zb3IpOlxuICAgIFQge1xuICB0aGlzLnRocm93SWZEaXNwb3NlZCgpO1xuICByZXR1cm4gZmZ0KHRoaXMpIGFzIFQ7XG59O1xuIl19","/**\n * @license\n * Copyright 2020 Google LLC. All Rights Reserved.\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n * =============================================================================\n */\nimport { reshape } from '../../ops/reshape';\nimport { getGlobalTensorClass } from '../../tensor';\n/**\n * Flatten a Tensor to a 1D array.\n * @doc {heading: 'Tensors', subheading: 'Classes'}\n */\ngetGlobalTensorClass().prototype.flatten = function () {\n this.throwIfDisposed();\n return reshape(this, [this.size]);\n};\n//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZmxhdHRlbi5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uLy4uLy4uL3RmanMtY29yZS9zcmMvcHVibGljL2NoYWluZWRfb3BzL2ZsYXR0ZW4udHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUE7Ozs7Ozs7Ozs7Ozs7OztHQWVHO0FBRUgsT0FBTyxFQUFDLE9BQU8sRUFBQyxNQUFNLG1CQUFtQixDQUFDO0FBQzFDLE9BQU8sRUFBQyxvQkFBb0IsRUFBUyxNQUFNLGNBQWMsQ0FBQztBQVMxRDs7O0dBR0c7QUFDSCxvQkFBb0IsRUFBRSxDQUFDLFNBQVMsQ0FBQyxPQUFPLEdBQUc7SUFDekMsSUFBSSxDQUFDLGVBQWUsRUFBRSxDQUFDO0lBQ3ZCLE9BQU8sT0FBTyxDQUFDLElBQUksRUFBRSxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsQ0FBTSxDQUFDO0FBQ3pDLENBQUMsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbIi8qKlxuICogQGxpY2Vuc2VcbiAqIENvcHlyaWdodCAyMDIwIEdvb2dsZSBMTEMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuXG4gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgXCJMaWNlbnNlXCIpO1xuICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLlxuICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0XG4gKlxuICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wXG4gKlxuICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZVxuICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gXCJBUyBJU1wiIEJBU0lTLFxuICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuXG4gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kXG4gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS5cbiAqID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4gKi9cblxuaW1wb3J0IHtyZXNoYXBlfSBmcm9tICcuLi8uLi9vcHMvcmVzaGFwZSc7XG5pbXBvcnQge2dldEdsb2JhbFRlbnNvckNsYXNzLCBUZW5zb3J9IGZyb20gJy4uLy4uL3RlbnNvcic7XG5pbXBvcnQge1Jhbmt9IGZyb20gJy4uLy4uL3R5cGVzJztcblxuZGVjbGFyZSBtb2R1bGUgJy4uLy4uL3RlbnNvcicge1xuICBpbnRlcmZhY2UgVGVuc29yPFIgZXh0ZW5kcyBSYW5rID0gUmFuaz4ge1xuICAgIGZsYXR0ZW48VCBleHRlbmRzIFRlbnNvcj4oKTogVGVuc29yMUQ7XG4gIH1cbn1cblxuLyoqXG4gKiBGbGF0dGVuIGEgVGVuc29yIHRvIGEgMUQgYXJyYXkuXG4gKiBAZG9jIHtoZWFkaW5nOiAnVGVuc29ycycsIHN1YmhlYWRpbmc6ICdDbGFzc2VzJ31cbiAqL1xuZ2V0R2xvYmFsVGVuc29yQ2xhc3MoKS5wcm90b3R5cGUuZmxhdHRlbiA9IGZ1bmN0aW9uPFQgZXh0ZW5kcyBUZW5zb3I+KCk6IFQge1xuICB0aGlzLnRocm93SWZEaXNwb3NlZCgpO1xuICByZXR1cm4gcmVzaGFwZSh0aGlzLCBbdGhpcy5zaXplXSkgYXMgVDtcbn07XG4iXX0=","/**\n * @license\n * Copyright 2020 Google LLC. All Rights Reserved.\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n * =============================================================================\n */\n// TODO update import path once op is modularized.\nimport { floor } from '../../ops/ops';\nimport { getGlobalTensorClass } from '../../tensor';\ngetGlobalTensorClass().prototype.floor = function () {\n this.throwIfDisposed();\n return floor(this);\n};\n//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZmxvb3IuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi8uLi8uLi90ZmpzLWNvcmUvc3JjL3B1YmxpYy9jaGFpbmVkX29wcy9mbG9vci50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQTs7Ozs7Ozs7Ozs7Ozs7O0dBZUc7QUFFSCxrREFBa0Q7QUFDbEQsT0FBTyxFQUFDLEtBQUssRUFBQyxNQUFNLGVBQWUsQ0FBQztBQUNwQyxPQUFPLEVBQUMsb0JBQW9CLEVBQVMsTUFBTSxjQUFjLENBQUM7QUFTMUQsb0JBQW9CLEVBQUUsQ0FBQyxTQUFTLENBQUMsS0FBSyxHQUFHO0lBRXZDLElBQUksQ0FBQyxlQUFlLEVBQUUsQ0FBQztJQUN2QixPQUFPLEtBQUssQ0FBQyxJQUFJLENBQUMsQ0FBQztBQUNyQixDQUFDLENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyIvKipcbiAqIEBsaWNlbnNlXG4gKiBDb3B5cmlnaHQgMjAyMCBHb29nbGUgTExDLiBBbGwgUmlnaHRzIFJlc2VydmVkLlxuICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlIFwiTGljZW5zZVwiKTtcbiAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS5cbiAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdFxuICpcbiAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMFxuICpcbiAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmVcbiAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuIFwiQVMgSVNcIiBCQVNJUyxcbiAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLlxuICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZFxuICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuXG4gKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuICovXG5cbi8vIFRPRE8gdXBkYXRlIGltcG9ydCBwYXRoIG9uY2Ugb3AgaXMgbW9kdWxhcml6ZWQuXG5pbXBvcnQge2Zsb29yfSBmcm9tICcuLi8uLi9vcHMvb3BzJztcbmltcG9ydCB7Z2V0R2xvYmFsVGVuc29yQ2xhc3MsIFRlbnNvcn0gZnJvbSAnLi4vLi4vdGVuc29yJztcbmltcG9ydCB7UmFua30gZnJvbSAnLi4vLi4vdHlwZXMnO1xuXG5kZWNsYXJlIG1vZHVsZSAnLi4vLi4vdGVuc29yJyB7XG4gIGludGVyZmFjZSBUZW5zb3I8UiBleHRlbmRzIFJhbmsgPSBSYW5rPiB7XG4gICAgZmxvb3I8VCBleHRlbmRzIFRlbnNvcj4odGhpczogVCk6IFQ7XG4gIH1cbn1cblxuZ2V0R2xvYmFsVGVuc29yQ2xhc3MoKS5wcm90b3R5cGUuZmxvb3IgPSBmdW5jdGlvbjxUIGV4dGVuZHMgVGVuc29yPih0aGlzOiBUKTpcbiAgICBUIHtcbiAgdGhpcy50aHJvd0lmRGlzcG9zZWQoKTtcbiAgcmV0dXJuIGZsb29yKHRoaXMpO1xufTtcbiJdfQ==","/**\n * @license\n * Copyright 2020 Google LLC. All Rights Reserved.\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n * =============================================================================\n */\nimport { floorDiv } from '../../ops/floorDiv';\nimport { getGlobalTensorClass } from '../../tensor';\ngetGlobalTensorClass().prototype.floorDiv = function (b) {\n this.throwIfDisposed();\n return floorDiv(this, b);\n};\n//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZmxvb3JEaXYuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi8uLi8uLi90ZmpzLWNvcmUvc3JjL3B1YmxpYy9jaGFpbmVkX29wcy9mbG9vckRpdi50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQTs7Ozs7Ozs7Ozs7Ozs7O0dBZUc7QUFDSCxPQUFPLEVBQUMsUUFBUSxFQUFDLE1BQU0sb0JBQW9CLENBQUM7QUFDNUMsT0FBTyxFQUFDLG9CQUFvQixFQUFTLE1BQU0sY0FBYyxDQUFDO0FBUzFELG9CQUFvQixFQUFFLENBQUMsU0FBUyxDQUFDLFFBQVEsR0FBRyxVQUN4QyxDQUFvQjtJQUN0QixJQUFJLENBQUMsZUFBZSxFQUFFLENBQUM7SUFDdkIsT0FBTyxRQUFRLENBQUMsSUFBSSxFQUFFLENBQUMsQ0FBQyxDQUFDO0FBQzNCLENBQUMsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbIi8qKlxuICogQGxpY2Vuc2VcbiAqIENvcHlyaWdodCAyMDIwIEdvb2dsZSBMTEMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuXG4gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgXCJMaWNlbnNlXCIpO1xuICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLlxuICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0XG4gKlxuICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wXG4gKlxuICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZVxuICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gXCJBUyBJU1wiIEJBU0lTLFxuICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuXG4gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kXG4gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS5cbiAqID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4gKi9cbmltcG9ydCB7Zmxvb3JEaXZ9IGZyb20gJy4uLy4uL29wcy9mbG9vckRpdic7XG5pbXBvcnQge2dldEdsb2JhbFRlbnNvckNsYXNzLCBUZW5zb3J9IGZyb20gJy4uLy4uL3RlbnNvcic7XG5pbXBvcnQge1JhbmssIFRlbnNvckxpa2V9IGZyb20gJy4uLy4uL3R5cGVzJztcblxuZGVjbGFyZSBtb2R1bGUgJy4uLy4uL3RlbnNvcicge1xuICBpbnRlcmZhY2UgVGVuc29yPFIgZXh0ZW5kcyBSYW5rID0gUmFuaz4ge1xuICAgIGZsb29yRGl2PFQgZXh0ZW5kcyBUZW5zb3I+KGI6IFRlbnNvcnxUZW5zb3JMaWtlKTogVDtcbiAgfVxufVxuXG5nZXRHbG9iYWxUZW5zb3JDbGFzcygpLnByb3RvdHlwZS5mbG9vckRpdiA9IGZ1bmN0aW9uPFQgZXh0ZW5kcyBUZW5zb3I+KFxuICAgIGI6IFRlbnNvcnxUZW5zb3JMaWtlKTogVCB7XG4gIHRoaXMudGhyb3dJZkRpc3Bvc2VkKCk7XG4gIHJldHVybiBmbG9vckRpdih0aGlzLCBiKTtcbn07XG4iXX0=","/**\n * @license\n * Copyright 2020 Google LLC. All Rights Reserved.\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n * =============================================================================\n */\nimport { gather } from '../../ops/gather';\nimport { getGlobalTensorClass } from '../../tensor';\ngetGlobalTensorClass().prototype.gather = function (indices, axis) {\n this.throwIfDisposed();\n return gather(this, indices, axis);\n};\n//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZ2F0aGVyLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vLi4vLi4vdGZqcy1jb3JlL3NyYy9wdWJsaWMvY2hhaW5lZF9vcHMvZ2F0aGVyLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBOzs7Ozs7Ozs7Ozs7Ozs7R0FlRztBQUVILE9BQU8sRUFBQyxNQUFNLEVBQUMsTUFBTSxrQkFBa0IsQ0FBQztBQUN4QyxPQUFPLEVBQUMsb0JBQW9CLEVBQVMsTUFBTSxjQUFjLENBQUM7QUFVMUQsb0JBQW9CLEVBQUUsQ0FBQyxTQUFTLENBQUMsTUFBTSxHQUFHLFVBQzdCLE9BQTBCLEVBQUUsSUFBYTtJQUNwRCxJQUFJLENBQUMsZUFBZSxFQUFFLENBQUM7SUFDdkIsT0FBTyxNQUFNLENBQUMsSUFBSSxFQUFFLE9BQU8sRUFBRSxJQUFJLENBQUMsQ0FBQztBQUNyQyxDQUFDLENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyIvKipcbiAqIEBsaWNlbnNlXG4gKiBDb3B5cmlnaHQgMjAyMCBHb29nbGUgTExDLiBBbGwgUmlnaHRzIFJlc2VydmVkLlxuICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlIFwiTGljZW5zZVwiKTtcbiAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS5cbiAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdFxuICpcbiAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMFxuICpcbiAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmVcbiAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuIFwiQVMgSVNcIiBCQVNJUyxcbiAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLlxuICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZFxuICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuXG4gKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuICovXG5cbmltcG9ydCB7Z2F0aGVyfSBmcm9tICcuLi8uLi9vcHMvZ2F0aGVyJztcbmltcG9ydCB7Z2V0R2xvYmFsVGVuc29yQ2xhc3MsIFRlbnNvcn0gZnJvbSAnLi4vLi4vdGVuc29yJztcbmltcG9ydCB7UmFuaywgVGVuc29yTGlrZX0gZnJvbSAnLi4vLi4vdHlwZXMnO1xuXG5kZWNsYXJlIG1vZHVsZSAnLi4vLi4vdGVuc29yJyB7XG4gIGludGVyZmFjZSBUZW5zb3I8UiBleHRlbmRzIFJhbmsgPSBSYW5rPiB7XG4gICAgZ2F0aGVyPFQgZXh0ZW5kcyBUZW5zb3I+KFxuICAgICAgICB0aGlzOiBULCBpbmRpY2VzOiBUZW5zb3J8VGVuc29yTGlrZSwgYXhpcz86IG51bWJlcik6IFQ7XG4gIH1cbn1cblxuZ2V0R2xvYmFsVGVuc29yQ2xhc3MoKS5wcm90b3R5cGUuZ2F0aGVyID0gZnVuY3Rpb248VCBleHRlbmRzIFRlbnNvcj4oXG4gICAgdGhpczogVCwgaW5kaWNlczogVGVuc29yfFRlbnNvckxpa2UsIGF4aXM/OiBudW1iZXIpOiBUIHtcbiAgdGhpcy50aHJvd0lmRGlzcG9zZWQoKTtcbiAgcmV0dXJuIGdhdGhlcih0aGlzLCBpbmRpY2VzLCBheGlzKTtcbn07XG4iXX0=","/**\n * @license\n * Copyright 2020 Google LLC. All Rights Reserved.\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n * =============================================================================\n */\nimport { greaterEqual } from '../../ops/greater_equal';\nimport { getGlobalTensorClass } from '../../tensor';\ngetGlobalTensorClass().prototype.greaterEqual = function (b) {\n this.throwIfDisposed();\n return greaterEqual(this, b);\n};\n//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZ3JlYXRlcl9lcXVhbC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uLy4uLy4uL3RmanMtY29yZS9zcmMvcHVibGljL2NoYWluZWRfb3BzL2dyZWF0ZXJfZXF1YWwudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUE7Ozs7Ozs7Ozs7Ozs7OztHQWVHO0FBQ0gsT0FBTyxFQUFDLFlBQVksRUFBQyxNQUFNLHlCQUF5QixDQUFDO0FBQ3JELE9BQU8sRUFBQyxvQkFBb0IsRUFBUyxNQUFNLGNBQWMsQ0FBQztBQVMxRCxvQkFBb0IsRUFBRSxDQUFDLFNBQVMsQ0FBQyxZQUFZLEdBQUcsVUFDNUMsQ0FBb0I7SUFDdEIsSUFBSSxDQUFDLGVBQWUsRUFBRSxDQUFDO0lBQ3ZCLE9BQU8sWUFBWSxDQUFDLElBQUksRUFBRSxDQUFDLENBQUMsQ0FBQztBQUMvQixDQUFDLENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyIvKipcbiAqIEBsaWNlbnNlXG4gKiBDb3B5cmlnaHQgMjAyMCBHb29nbGUgTExDLiBBbGwgUmlnaHRzIFJlc2VydmVkLlxuICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlIFwiTGljZW5zZVwiKTtcbiAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS5cbiAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdFxuICpcbiAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMFxuICpcbiAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmVcbiAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuIFwiQVMgSVNcIiBCQVNJUyxcbiAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLlxuICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZFxuICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuXG4gKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuICovXG5pbXBvcnQge2dyZWF0ZXJFcXVhbH0gZnJvbSAnLi4vLi4vb3BzL2dyZWF0ZXJfZXF1YWwnO1xuaW1wb3J0IHtnZXRHbG9iYWxUZW5zb3JDbGFzcywgVGVuc29yfSBmcm9tICcuLi8uLi90ZW5zb3InO1xuaW1wb3J0IHtSYW5rLCBUZW5zb3JMaWtlfSBmcm9tICcuLi8uLi90eXBlcyc7XG5cbmRlY2xhcmUgbW9kdWxlICcuLi8uLi90ZW5zb3InIHtcbiAgaW50ZXJmYWNlIFRlbnNvcjxSIGV4dGVuZHMgUmFuayA9IFJhbms+IHtcbiAgICBncmVhdGVyRXF1YWw8VCBleHRlbmRzIFRlbnNvcj4oYjogVGVuc29yfFRlbnNvckxpa2UpOiBUO1xuICB9XG59XG5cbmdldEdsb2JhbFRlbnNvckNsYXNzKCkucHJvdG90eXBlLmdyZWF0ZXJFcXVhbCA9IGZ1bmN0aW9uPFQgZXh0ZW5kcyBUZW5zb3I+KFxuICAgIGI6IFRlbnNvcnxUZW5zb3JMaWtlKTogVCB7XG4gIHRoaXMudGhyb3dJZkRpc3Bvc2VkKCk7XG4gIHJldHVybiBncmVhdGVyRXF1YWwodGhpcywgYik7XG59O1xuIl19","/**\n * @license\n * Copyright 2020 Google LLC. All Rights Reserved.\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n * =============================================================================\n */\nimport { greater } from '../../ops/greater';\nimport { getGlobalTensorClass } from '../../tensor';\ngetGlobalTensorClass().prototype.greater = function (b) {\n this.throwIfDisposed();\n return greater(this, b);\n};\n//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZ3JlYXRlci5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uLy4uLy4uL3RmanMtY29yZS9zcmMvcHVibGljL2NoYWluZWRfb3BzL2dyZWF0ZXIudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUE7Ozs7Ozs7Ozs7Ozs7OztHQWVHO0FBQ0gsT0FBTyxFQUFDLE9BQU8sRUFBQyxNQUFNLG1CQUFtQixDQUFDO0FBQzFDLE9BQU8sRUFBQyxvQkFBb0IsRUFBUyxNQUFNLGNBQWMsQ0FBQztBQVMxRCxvQkFBb0IsRUFBRSxDQUFDLFNBQVMsQ0FBQyxPQUFPLEdBQUcsVUFDdkMsQ0FBb0I7SUFDdEIsSUFBSSxDQUFDLGVBQWUsRUFBRSxDQUFDO0lBQ3ZCLE9BQU8sT0FBTyxDQUFDLElBQUksRUFBRSxDQUFDLENBQUMsQ0FBQztBQUMxQixDQUFDLENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyIvKipcbiAqIEBsaWNlbnNlXG4gKiBDb3B5cmlnaHQgMjAyMCBHb29nbGUgTExDLiBBbGwgUmlnaHRzIFJlc2VydmVkLlxuICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlIFwiTGljZW5zZVwiKTtcbiAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS5cbiAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdFxuICpcbiAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMFxuICpcbiAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmVcbiAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuIFwiQVMgSVNcIiBCQVNJUyxcbiAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLlxuICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZFxuICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuXG4gKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuICovXG5pbXBvcnQge2dyZWF0ZXJ9IGZyb20gJy4uLy4uL29wcy9ncmVhdGVyJztcbmltcG9ydCB7Z2V0R2xvYmFsVGVuc29yQ2xhc3MsIFRlbnNvcn0gZnJvbSAnLi4vLi4vdGVuc29yJztcbmltcG9ydCB7UmFuaywgVGVuc29yTGlrZX0gZnJvbSAnLi4vLi4vdHlwZXMnO1xuXG5kZWNsYXJlIG1vZHVsZSAnLi4vLi4vdGVuc29yJyB7XG4gIGludGVyZmFjZSBUZW5zb3I8UiBleHRlbmRzIFJhbmsgPSBSYW5rPiB7XG4gICAgZ3JlYXRlcjxUIGV4dGVuZHMgVGVuc29yPihiOiBUZW5zb3J8VGVuc29yTGlrZSk6IFQ7XG4gIH1cbn1cblxuZ2V0R2xvYmFsVGVuc29yQ2xhc3MoKS5wcm90b3R5cGUuZ3JlYXRlciA9IGZ1bmN0aW9uPFQgZXh0ZW5kcyBUZW5zb3I+KFxuICAgIGI6IFRlbnNvcnxUZW5zb3JMaWtlKTogVCB7XG4gIHRoaXMudGhyb3dJZkRpc3Bvc2VkKCk7XG4gIHJldHVybiBncmVhdGVyKHRoaXMsIGIpO1xufTtcbiJdfQ==","/**\n * @license\n * Copyright 2020 Google LLC. All Rights Reserved.\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n * =============================================================================\n */\n// TODO update import path once op is modularized.\nimport { ifft } from '../../ops/ops';\nimport { getGlobalTensorClass } from '../../tensor';\ngetGlobalTensorClass().prototype.ifft = function () {\n this.throwIfDisposed();\n return ifft(this);\n};\n//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaWZmdC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uLy4uLy4uL3RmanMtY29yZS9zcmMvcHVibGljL2NoYWluZWRfb3BzL2lmZnQudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUE7Ozs7Ozs7Ozs7Ozs7OztHQWVHO0FBRUgsa0RBQWtEO0FBQ2xELE9BQU8sRUFBQyxJQUFJLEVBQUMsTUFBTSxlQUFlLENBQUM7QUFDbkMsT0FBTyxFQUFDLG9CQUFvQixFQUFTLE1BQU0sY0FBYyxDQUFDO0FBUzFELG9CQUFvQixFQUFFLENBQUMsU0FBUyxDQUFDLElBQUksR0FBRztJQUV0QyxJQUFJLENBQUMsZUFBZSxFQUFFLENBQUM7SUFDdkIsT0FBTyxJQUFJLENBQUMsSUFBSSxDQUFNLENBQUM7QUFDekIsQ0FBQyxDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiLyoqXG4gKiBAbGljZW5zZVxuICogQ29weXJpZ2h0IDIwMjAgR29vZ2xlIExMQy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC5cbiAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSBcIkxpY2Vuc2VcIik7XG4gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuXG4gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXRcbiAqXG4gKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjBcbiAqXG4gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlXG4gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiBcIkFTIElTXCIgQkFTSVMsXG4gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC5cbiAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmRcbiAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLlxuICogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbiAqL1xuXG4vLyBUT0RPIHVwZGF0ZSBpbXBvcnQgcGF0aCBvbmNlIG9wIGlzIG1vZHVsYXJpemVkLlxuaW1wb3J0IHtpZmZ0fSBmcm9tICcuLi8uLi9vcHMvb3BzJztcbmltcG9ydCB7Z2V0R2xvYmFsVGVuc29yQ2xhc3MsIFRlbnNvcn0gZnJvbSAnLi4vLi4vdGVuc29yJztcbmltcG9ydCB7UmFua30gZnJvbSAnLi4vLi4vdHlwZXMnO1xuXG5kZWNsYXJlIG1vZHVsZSAnLi4vLi4vdGVuc29yJyB7XG4gIGludGVyZmFjZSBUZW5zb3I8UiBleHRlbmRzIFJhbmsgPSBSYW5rPiB7XG4gICAgaWZmdDxUIGV4dGVuZHMgVGVuc29yPih0aGlzOiBUZW5zb3IpOiBUZW5zb3I7XG4gIH1cbn1cblxuZ2V0R2xvYmFsVGVuc29yQ2xhc3MoKS5wcm90b3R5cGUuaWZmdCA9IGZ1bmN0aW9uPFQgZXh0ZW5kcyBUZW5zb3I+KFxuICAgIHRoaXM6IFRlbnNvcik6IFQge1xuICB0aGlzLnRocm93SWZEaXNwb3NlZCgpO1xuICByZXR1cm4gaWZmdCh0aGlzKSBhcyBUO1xufTtcbiJdfQ==","/**\n * @license\n * Copyright 2020 Google LLC. All Rights Reserved.\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n * =============================================================================\n */\n// TODO update import path once op is modularized.\nimport { irfft } from '../../ops/ops';\nimport { getGlobalTensorClass } from '../../tensor';\ngetGlobalTensorClass().prototype.irfft = function () {\n this.throwIfDisposed();\n return irfft(this);\n};\n//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaXJmZnQuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi8uLi8uLi90ZmpzLWNvcmUvc3JjL3B1YmxpYy9jaGFpbmVkX29wcy9pcmZmdC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQTs7Ozs7Ozs7Ozs7Ozs7O0dBZUc7QUFFSCxrREFBa0Q7QUFDbEQsT0FBTyxFQUFDLEtBQUssRUFBQyxNQUFNLGVBQWUsQ0FBQztBQUNwQyxPQUFPLEVBQUMsb0JBQW9CLEVBQVMsTUFBTSxjQUFjLENBQUM7QUFTMUQsb0JBQW9CLEVBQUUsQ0FBQyxTQUFTLENBQUMsS0FBSyxHQUFHO0lBRXZDLElBQUksQ0FBQyxlQUFlLEVBQUUsQ0FBQztJQUN2QixPQUFPLEtBQUssQ0FBQyxJQUFJLENBQU0sQ0FBQztBQUMxQixDQUFDLENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyIvKipcbiAqIEBsaWNlbnNlXG4gKiBDb3B5cmlnaHQgMjAyMCBHb29nbGUgTExDLiBBbGwgUmlnaHRzIFJlc2VydmVkLlxuICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlIFwiTGljZW5zZVwiKTtcbiAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS5cbiAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdFxuICpcbiAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMFxuICpcbiAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmVcbiAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuIFwiQVMgSVNcIiBCQVNJUyxcbiAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLlxuICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZFxuICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuXG4gKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuICovXG5cbi8vIFRPRE8gdXBkYXRlIGltcG9ydCBwYXRoIG9uY2Ugb3AgaXMgbW9kdWxhcml6ZWQuXG5pbXBvcnQge2lyZmZ0fSBmcm9tICcuLi8uLi9vcHMvb3BzJztcbmltcG9ydCB7Z2V0R2xvYmFsVGVuc29yQ2xhc3MsIFRlbnNvcn0gZnJvbSAnLi4vLi4vdGVuc29yJztcbmltcG9ydCB7UmFua30gZnJvbSAnLi4vLi4vdHlwZXMnO1xuXG5kZWNsYXJlIG1vZHVsZSAnLi4vLi4vdGVuc29yJyB7XG4gIGludGVyZmFjZSBUZW5zb3I8UiBleHRlbmRzIFJhbmsgPSBSYW5rPiB7XG4gICAgaXJmZnQ8VCBleHRlbmRzIFRlbnNvcj4odGhpczogVGVuc29yKTogVGVuc29yO1xuICB9XG59XG5cbmdldEdsb2JhbFRlbnNvckNsYXNzKCkucHJvdG90eXBlLmlyZmZ0ID0gZnVuY3Rpb248VCBleHRlbmRzIFRlbnNvcj4oXG4gICAgdGhpczogVGVuc29yKTogVCB7XG4gIHRoaXMudGhyb3dJZkRpc3Bvc2VkKCk7XG4gIHJldHVybiBpcmZmdCh0aGlzKSBhcyBUO1xufTtcbiJdfQ==","/**\n * @license\n * Copyright 2020 Google LLC. All Rights Reserved.\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n * =============================================================================\n */\n// TODO update import path once op is modularized.\nimport { isFinite } from '../../ops/ops';\nimport { getGlobalTensorClass } from '../../tensor';\ngetGlobalTensorClass().prototype.isFinite = function () {\n this.throwIfDisposed();\n return isFinite(this);\n};\n//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaXNfZmluaXRlLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vLi4vLi4vdGZqcy1jb3JlL3NyYy9wdWJsaWMvY2hhaW5lZF9vcHMvaXNfZmluaXRlLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBOzs7Ozs7Ozs7Ozs7Ozs7R0FlRztBQUVILGtEQUFrRDtBQUNsRCxPQUFPLEVBQUMsUUFBUSxFQUFDLE1BQU0sZUFBZSxDQUFDO0FBQ3ZDLE9BQU8sRUFBQyxvQkFBb0IsRUFBUyxNQUFNLGNBQWMsQ0FBQztBQVMxRCxvQkFBb0IsRUFBRSxDQUFDLFNBQVMsQ0FBQyxRQUFRLEdBQUc7SUFFMUMsSUFBSSxDQUFDLGVBQWUsRUFBRSxDQUFDO0lBQ3ZCLE9BQU8sUUFBUSxDQUFDLElBQUksQ0FBQyxDQUFDO0FBQ3hCLENBQUMsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbIi8qKlxuICogQGxpY2Vuc2VcbiAqIENvcHlyaWdodCAyMDIwIEdvb2dsZSBMTEMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuXG4gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgXCJMaWNlbnNlXCIpO1xuICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLlxuICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0XG4gKlxuICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wXG4gKlxuICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZVxuICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gXCJBUyBJU1wiIEJBU0lTLFxuICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuXG4gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kXG4gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS5cbiAqID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4gKi9cblxuLy8gVE9ETyB1cGRhdGUgaW1wb3J0IHBhdGggb25jZSBvcCBpcyBtb2R1bGFyaXplZC5cbmltcG9ydCB7aXNGaW5pdGV9IGZyb20gJy4uLy4uL29wcy9vcHMnO1xuaW1wb3J0IHtnZXRHbG9iYWxUZW5zb3JDbGFzcywgVGVuc29yfSBmcm9tICcuLi8uLi90ZW5zb3InO1xuaW1wb3J0IHtSYW5rfSBmcm9tICcuLi8uLi90eXBlcyc7XG5cbmRlY2xhcmUgbW9kdWxlICcuLi8uLi90ZW5zb3InIHtcbiAgaW50ZXJmYWNlIFRlbnNvcjxSIGV4dGVuZHMgUmFuayA9IFJhbms+IHtcbiAgICBpc0Zpbml0ZTxUIGV4dGVuZHMgVGVuc29yPih0aGlzOiBUKTogVDtcbiAgfVxufVxuXG5nZXRHbG9iYWxUZW5zb3JDbGFzcygpLnByb3RvdHlwZS5pc0Zpbml0ZSA9IGZ1bmN0aW9uPFQgZXh0ZW5kcyBUZW5zb3I+KHRoaXM6IFQpOlxuICAgIFQge1xuICB0aGlzLnRocm93SWZEaXNwb3NlZCgpO1xuICByZXR1cm4gaXNGaW5pdGUodGhpcyk7XG59O1xuIl19","/**\n * @license\n * Copyright 2020 Google LLC. All Rights Reserved.\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n * =============================================================================\n */\n// TODO update import path once op is modularized.\nimport { isInf } from '../../ops/ops';\nimport { getGlobalTensorClass } from '../../tensor';\ngetGlobalTensorClass().prototype.isInf = function () {\n this.throwIfDisposed();\n return isInf(this);\n};\n//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaXNfaW5mLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vLi4vLi4vdGZqcy1jb3JlL3NyYy9wdWJsaWMvY2hhaW5lZF9vcHMvaXNfaW5mLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBOzs7Ozs7Ozs7Ozs7Ozs7R0FlRztBQUVILGtEQUFrRDtBQUNsRCxPQUFPLEVBQUMsS0FBSyxFQUFDLE1BQU0sZUFBZSxDQUFDO0FBQ3BDLE9BQU8sRUFBQyxvQkFBb0IsRUFBUyxNQUFNLGNBQWMsQ0FBQztBQVMxRCxvQkFBb0IsRUFBRSxDQUFDLFNBQVMsQ0FBQyxLQUFLLEdBQUc7SUFFdkMsSUFBSSxDQUFDLGVBQWUsRUFBRSxDQUFDO0lBQ3ZCLE9BQU8sS0FBSyxDQUFDLElBQUksQ0FBQyxDQUFDO0FBQ3JCLENBQUMsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbIi8qKlxuICogQGxpY2Vuc2VcbiAqIENvcHlyaWdodCAyMDIwIEdvb2dsZSBMTEMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuXG4gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgXCJMaWNlbnNlXCIpO1xuICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLlxuICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0XG4gKlxuICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wXG4gKlxuICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZVxuICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gXCJBUyBJU1wiIEJBU0lTLFxuICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuXG4gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kXG4gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS5cbiAqID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4gKi9cblxuLy8gVE9ETyB1cGRhdGUgaW1wb3J0IHBhdGggb25jZSBvcCBpcyBtb2R1bGFyaXplZC5cbmltcG9ydCB7aXNJbmZ9IGZyb20gJy4uLy4uL29wcy9vcHMnO1xuaW1wb3J0IHtnZXRHbG9iYWxUZW5zb3JDbGFzcywgVGVuc29yfSBmcm9tICcuLi8uLi90ZW5zb3InO1xuaW1wb3J0IHtSYW5rfSBmcm9tICcuLi8uLi90eXBlcyc7XG5cbmRlY2xhcmUgbW9kdWxlICcuLi8uLi90ZW5zb3InIHtcbiAgaW50ZXJmYWNlIFRlbnNvcjxSIGV4dGVuZHMgUmFuayA9IFJhbms+IHtcbiAgICBpc0luZjxUIGV4dGVuZHMgVGVuc29yPih0aGlzOiBUKTogVDtcbiAgfVxufVxuXG5nZXRHbG9iYWxUZW5zb3JDbGFzcygpLnByb3RvdHlwZS5pc0luZiA9IGZ1bmN0aW9uPFQgZXh0ZW5kcyBUZW5zb3I+KHRoaXM6IFQpOlxuICAgIFQge1xuICB0aGlzLnRocm93SWZEaXNwb3NlZCgpO1xuICByZXR1cm4gaXNJbmYodGhpcyk7XG59O1xuIl19","/**\n * @license\n * Copyright 2020 Google LLC. All Rights Reserved.\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n * =============================================================================\n */\n// TODO update import path once op is modularized.\nimport { isNaN } from '../../ops/ops';\nimport { getGlobalTensorClass } from '../../tensor';\ngetGlobalTensorClass().prototype.isNaN = function () {\n this.throwIfDisposed();\n return isNaN(this);\n};\n//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaXNfbmFuLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vLi4vLi4vdGZqcy1jb3JlL3NyYy9wdWJsaWMvY2hhaW5lZF9vcHMvaXNfbmFuLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBOzs7Ozs7Ozs7Ozs7Ozs7R0FlRztBQUVILGtEQUFrRDtBQUNsRCxPQUFPLEVBQUMsS0FBSyxFQUFDLE1BQU0sZUFBZSxDQUFDO0FBQ3BDLE9BQU8sRUFBQyxvQkFBb0IsRUFBUyxNQUFNLGNBQWMsQ0FBQztBQVMxRCxvQkFBb0IsRUFBRSxDQUFDLFNBQVMsQ0FBQyxLQUFLLEdBQUc7SUFFdkMsSUFBSSxDQUFDLGVBQWUsRUFBRSxDQUFDO0lBQ3ZCLE9BQU8sS0FBSyxDQUFDLElBQUksQ0FBQyxDQUFDO0FBQ3JCLENBQUMsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbIi8qKlxuICogQGxpY2Vuc2VcbiAqIENvcHlyaWdodCAyMDIwIEdvb2dsZSBMTEMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuXG4gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgXCJMaWNlbnNlXCIpO1xuICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLlxuICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0XG4gKlxuICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wXG4gKlxuICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZVxuICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gXCJBUyBJU1wiIEJBU0lTLFxuICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuXG4gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kXG4gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS5cbiAqID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4gKi9cblxuLy8gVE9ETyB1cGRhdGUgaW1wb3J0IHBhdGggb25jZSBvcCBpcyBtb2R1bGFyaXplZC5cbmltcG9ydCB7aXNOYU59IGZyb20gJy4uLy4uL29wcy9vcHMnO1xuaW1wb3J0IHtnZXRHbG9iYWxUZW5zb3JDbGFzcywgVGVuc29yfSBmcm9tICcuLi8uLi90ZW5zb3InO1xuaW1wb3J0IHtSYW5rfSBmcm9tICcuLi8uLi90eXBlcyc7XG5cbmRlY2xhcmUgbW9kdWxlICcuLi8uLi90ZW5zb3InIHtcbiAgaW50ZXJmYWNlIFRlbnNvcjxSIGV4dGVuZHMgUmFuayA9IFJhbms+IHtcbiAgICBpc05hTjxUIGV4dGVuZHMgVGVuc29yPih0aGlzOiBUKTogVDtcbiAgfVxufVxuXG5nZXRHbG9iYWxUZW5zb3JDbGFzcygpLnByb3RvdHlwZS5pc05hTiA9IGZ1bmN0aW9uPFQgZXh0ZW5kcyBUZW5zb3I+KHRoaXM6IFQpOlxuICAgIFQge1xuICB0aGlzLnRocm93SWZEaXNwb3NlZCgpO1xuICByZXR1cm4gaXNOYU4odGhpcyk7XG59O1xuIl19","/**\n * @license\n * Copyright 2020 Google LLC. All Rights Reserved.\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n * =============================================================================\n */\nimport { leakyRelu } from '../../ops/leaky_relu';\nimport { getGlobalTensorClass } from '../../tensor';\ngetGlobalTensorClass().prototype.leakyRelu = function (alpha) {\n this.throwIfDisposed();\n return leakyRelu(this, alpha);\n};\n//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibGVha3lfcmVsdS5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uLy4uLy4uL3RmanMtY29yZS9zcmMvcHVibGljL2NoYWluZWRfb3BzL2xlYWt5X3JlbHUudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUE7Ozs7Ozs7Ozs7Ozs7OztHQWVHO0FBQ0gsT0FBTyxFQUFDLFNBQVMsRUFBQyxNQUFNLHNCQUFzQixDQUFDO0FBQy9DLE9BQU8sRUFBQyxvQkFBb0IsRUFBUyxNQUFNLGNBQWMsQ0FBQztBQVMxRCxvQkFBb0IsRUFBRSxDQUFDLFNBQVMsQ0FBQyxTQUFTLEdBQUcsVUFDaEMsS0FBYTtJQUN4QixJQUFJLENBQUMsZUFBZSxFQUFFLENBQUM7SUFDdkIsT0FBTyxTQUFTLENBQUMsSUFBSSxFQUFFLEtBQUssQ0FBQyxDQUFDO0FBQ2hDLENBQUMsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbIi8qKlxuICogQGxpY2Vuc2VcbiAqIENvcHlyaWdodCAyMDIwIEdvb2dsZSBMTEMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuXG4gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgXCJMaWNlbnNlXCIpO1xuICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLlxuICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0XG4gKlxuICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wXG4gKlxuICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZVxuICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gXCJBUyBJU1wiIEJBU0lTLFxuICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuXG4gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kXG4gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS5cbiAqID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4gKi9cbmltcG9ydCB7bGVha3lSZWx1fSBmcm9tICcuLi8uLi9vcHMvbGVha3lfcmVsdSc7XG5pbXBvcnQge2dldEdsb2JhbFRlbnNvckNsYXNzLCBUZW5zb3J9IGZyb20gJy4uLy4uL3RlbnNvcic7XG5pbXBvcnQge1Jhbmt9IGZyb20gJy4uLy4uL3R5cGVzJztcblxuZGVjbGFyZSBtb2R1bGUgJy4uLy4uL3RlbnNvcicge1xuICBpbnRlcmZhY2UgVGVuc29yPFIgZXh0ZW5kcyBSYW5rID0gUmFuaz4ge1xuICAgIGxlYWt5UmVsdTxUIGV4dGVuZHMgVGVuc29yPihhbHBoYTogbnVtYmVyKTogVDtcbiAgfVxufVxuXG5nZXRHbG9iYWxUZW5zb3JDbGFzcygpLnByb3RvdHlwZS5sZWFreVJlbHUgPSBmdW5jdGlvbjxUIGV4dGVuZHMgVGVuc29yPihcbiAgICB0aGlzOiBULCBhbHBoYTogbnVtYmVyKTogVCB7XG4gIHRoaXMudGhyb3dJZkRpc3Bvc2VkKCk7XG4gIHJldHVybiBsZWFreVJlbHUodGhpcywgYWxwaGEpO1xufTtcbiJdfQ==","/**\n * @license\n * Copyright 2020 Google LLC. All Rights Reserved.\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n * =============================================================================\n */\nimport { lessEqual } from '../../ops/less_equal';\nimport { getGlobalTensorClass } from '../../tensor';\ngetGlobalTensorClass().prototype.lessEqual = function (b) {\n this.throwIfDisposed();\n return lessEqual(this, b);\n};\n//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibGVzc19lcXVhbC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uLy4uLy4uL3RmanMtY29yZS9zcmMvcHVibGljL2NoYWluZWRfb3BzL2xlc3NfZXF1YWwudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUE7Ozs7Ozs7Ozs7Ozs7OztHQWVHO0FBQ0gsT0FBTyxFQUFDLFNBQVMsRUFBQyxNQUFNLHNCQUFzQixDQUFDO0FBQy9DLE9BQU8sRUFBQyxvQkFBb0IsRUFBUyxNQUFNLGNBQWMsQ0FBQztBQVMxRCxvQkFBb0IsRUFBRSxDQUFDLFNBQVMsQ0FBQyxTQUFTLEdBQUcsVUFDekMsQ0FBb0I7SUFDdEIsSUFBSSxDQUFDLGVBQWUsRUFBRSxDQUFDO0lBQ3ZCLE9BQU8sU0FBUyxDQUFDLElBQUksRUFBRSxDQUFDLENBQUMsQ0FBQztBQUM1QixDQUFDLENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyIvKipcbiAqIEBsaWNlbnNlXG4gKiBDb3B5cmlnaHQgMjAyMCBHb29nbGUgTExDLiBBbGwgUmlnaHRzIFJlc2VydmVkLlxuICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlIFwiTGljZW5zZVwiKTtcbiAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS5cbiAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdFxuICpcbiAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMFxuICpcbiAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmVcbiAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuIFwiQVMgSVNcIiBCQVNJUyxcbiAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLlxuICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZFxuICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuXG4gKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuICovXG5pbXBvcnQge2xlc3NFcXVhbH0gZnJvbSAnLi4vLi4vb3BzL2xlc3NfZXF1YWwnO1xuaW1wb3J0IHtnZXRHbG9iYWxUZW5zb3JDbGFzcywgVGVuc29yfSBmcm9tICcuLi8uLi90ZW5zb3InO1xuaW1wb3J0IHtSYW5rLCBUZW5zb3JMaWtlfSBmcm9tICcuLi8uLi90eXBlcyc7XG5cbmRlY2xhcmUgbW9kdWxlICcuLi8uLi90ZW5zb3InIHtcbiAgaW50ZXJmYWNlIFRlbnNvcjxSIGV4dGVuZHMgUmFuayA9IFJhbms+IHtcbiAgICBsZXNzRXF1YWw8VCBleHRlbmRzIFRlbnNvcj4oYjogVGVuc29yfFRlbnNvckxpa2UpOiBUO1xuICB9XG59XG5cbmdldEdsb2JhbFRlbnNvckNsYXNzKCkucHJvdG90eXBlLmxlc3NFcXVhbCA9IGZ1bmN0aW9uPFQgZXh0ZW5kcyBUZW5zb3I+KFxuICAgIGI6IFRlbnNvcnxUZW5zb3JMaWtlKTogVCB7XG4gIHRoaXMudGhyb3dJZkRpc3Bvc2VkKCk7XG4gIHJldHVybiBsZXNzRXF1YWwodGhpcywgYik7XG59O1xuIl19","/**\n * @license\n * Copyright 2020 Google LLC. All Rights Reserved.\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n * =============================================================================\n */\nimport { less } from '../../ops/less';\nimport { getGlobalTensorClass } from '../../tensor';\ngetGlobalTensorClass().prototype.less = function (b) {\n this.throwIfDisposed();\n return less(this, b);\n};\n//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibGVzcy5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uLy4uLy4uL3RmanMtY29yZS9zcmMvcHVibGljL2NoYWluZWRfb3BzL2xlc3MudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUE7Ozs7Ozs7Ozs7Ozs7OztHQWVHO0FBQ0gsT0FBTyxFQUFDLElBQUksRUFBQyxNQUFNLGdCQUFnQixDQUFDO0FBQ3BDLE9BQU8sRUFBQyxvQkFBb0IsRUFBUyxNQUFNLGNBQWMsQ0FBQztBQVMxRCxvQkFBb0IsRUFBRSxDQUFDLFNBQVMsQ0FBQyxJQUFJLEdBQUcsVUFDcEMsQ0FBb0I7SUFDdEIsSUFBSSxDQUFDLGVBQWUsRUFBRSxDQUFDO0lBQ3ZCLE9BQU8sSUFBSSxDQUFDLElBQUksRUFBRSxDQUFDLENBQUMsQ0FBQztBQUN2QixDQUFDLENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyIvKipcbiAqIEBsaWNlbnNlXG4gKiBDb3B5cmlnaHQgMjAyMCBHb29nbGUgTExDLiBBbGwgUmlnaHRzIFJlc2VydmVkLlxuICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlIFwiTGljZW5zZVwiKTtcbiAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS5cbiAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdFxuICpcbiAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMFxuICpcbiAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmVcbiAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuIFwiQVMgSVNcIiBCQVNJUyxcbiAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLlxuICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZFxuICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuXG4gKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuICovXG5pbXBvcnQge2xlc3N9IGZyb20gJy4uLy4uL29wcy9sZXNzJztcbmltcG9ydCB7Z2V0R2xvYmFsVGVuc29yQ2xhc3MsIFRlbnNvcn0gZnJvbSAnLi4vLi4vdGVuc29yJztcbmltcG9ydCB7UmFuaywgVGVuc29yTGlrZX0gZnJvbSAnLi4vLi4vdHlwZXMnO1xuXG5kZWNsYXJlIG1vZHVsZSAnLi4vLi4vdGVuc29yJyB7XG4gIGludGVyZmFjZSBUZW5zb3I8UiBleHRlbmRzIFJhbmsgPSBSYW5rPiB7XG4gICAgbGVzczxUIGV4dGVuZHMgVGVuc29yPihiOiBUZW5zb3J8VGVuc29yTGlrZSk6IFQ7XG4gIH1cbn1cblxuZ2V0R2xvYmFsVGVuc29yQ2xhc3MoKS5wcm90b3R5cGUubGVzcyA9IGZ1bmN0aW9uPFQgZXh0ZW5kcyBUZW5zb3I+KFxuICAgIGI6IFRlbnNvcnxUZW5zb3JMaWtlKTogVCB7XG4gIHRoaXMudGhyb3dJZkRpc3Bvc2VkKCk7XG4gIHJldHVybiBsZXNzKHRoaXMsIGIpO1xufTtcbiJdfQ==","/**\n * @license\n * Copyright 2020 Google LLC. All Rights Reserved.\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n * =============================================================================\n */\nimport { localResponseNormalization } from '../../ops/local_response_normalization';\nimport { getGlobalTensorClass } from '../../tensor';\ngetGlobalTensorClass().prototype.localResponseNormalization =\n function (depthRadius, bias, alpha, beta) {\n this.throwIfDisposed();\n return localResponseNormalization(this, depthRadius, bias, alpha, beta);\n };\n//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibG9jYWxfcmVzcG9uc2Vfbm9ybWFsaXphdGlvbi5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uLy4uLy4uL3RmanMtY29yZS9zcmMvcHVibGljL2NoYWluZWRfb3BzL2xvY2FsX3Jlc3BvbnNlX25vcm1hbGl6YXRpb24udHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUE7Ozs7Ozs7Ozs7Ozs7OztHQWVHO0FBQ0gsT0FBTyxFQUFDLDBCQUEwQixFQUFDLE1BQU0sd0NBQXdDLENBQUM7QUFDbEYsT0FBTyxFQUFDLG9CQUFvQixFQUFTLE1BQU0sY0FBYyxDQUFDO0FBVTFELG9CQUFvQixFQUFFLENBQUMsU0FBUyxDQUFDLDBCQUEwQjtJQUN2RCxVQUNJLFdBQW9CLEVBQUUsSUFBYSxFQUFFLEtBQWMsRUFBRSxJQUFhO1FBQ3hFLElBQUksQ0FBQyxlQUFlLEVBQUUsQ0FBQztRQUN2QixPQUFPLDBCQUEwQixDQUFDLElBQUksRUFBRSxXQUFXLEVBQUUsSUFBSSxFQUFFLEtBQUssRUFBRSxJQUFJLENBQU0sQ0FBQztJQUMvRSxDQUFDLENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyIvKipcbiAqIEBsaWNlbnNlXG4gKiBDb3B5cmlnaHQgMjAyMCBHb29nbGUgTExDLiBBbGwgUmlnaHRzIFJlc2VydmVkLlxuICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlIFwiTGljZW5zZVwiKTtcbiAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS5cbiAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdFxuICpcbiAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMFxuICpcbiAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmVcbiAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuIFwiQVMgSVNcIiBCQVNJUyxcbiAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLlxuICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZFxuICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuXG4gKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuICovXG5pbXBvcnQge2xvY2FsUmVzcG9uc2VOb3JtYWxpemF0aW9ufSBmcm9tICcuLi8uLi9vcHMvbG9jYWxfcmVzcG9uc2Vfbm9ybWFsaXphdGlvbic7XG5pbXBvcnQge2dldEdsb2JhbFRlbnNvckNsYXNzLCBUZW5zb3J9IGZyb20gJy4uLy4uL3RlbnNvcic7XG5pbXBvcnQge1Jhbmt9IGZyb20gJy4uLy4uL3R5cGVzJztcblxuZGVjbGFyZSBtb2R1bGUgJy4uLy4uL3RlbnNvcicge1xuICBpbnRlcmZhY2UgVGVuc29yPFIgZXh0ZW5kcyBSYW5rID0gUmFuaz4ge1xuICAgIGxvY2FsUmVzcG9uc2VOb3JtYWxpemF0aW9uPFQgZXh0ZW5kcyBUZW5zb3I+KFxuICAgICAgICBkZXB0aFJhZGl1cz86IG51bWJlciwgYmlhcz86IG51bWJlciwgYWxwaGE/OiBudW1iZXIsIGJldGE/OiBudW1iZXIpOiBUO1xuICB9XG59XG5cbmdldEdsb2JhbFRlbnNvckNsYXNzKCkucHJvdG90eXBlLmxvY2FsUmVzcG9uc2VOb3JtYWxpemF0aW9uID1cbiAgICBmdW5jdGlvbjxUIGV4dGVuZHMgVGVuc29yPihcbiAgICAgICAgZGVwdGhSYWRpdXM/OiBudW1iZXIsIGJpYXM/OiBudW1iZXIsIGFscGhhPzogbnVtYmVyLCBiZXRhPzogbnVtYmVyKTogVCB7XG4gIHRoaXMudGhyb3dJZkRpc3Bvc2VkKCk7XG4gIHJldHVybiBsb2NhbFJlc3BvbnNlTm9ybWFsaXphdGlvbih0aGlzLCBkZXB0aFJhZGl1cywgYmlhcywgYWxwaGEsIGJldGEpIGFzIFQ7XG59O1xuIl19","/**\n * @license\n * Copyright 2020 Google LLC. All Rights Reserved.\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n * =============================================================================\n */\n// TODO update import path once op is modularized.\nimport { logSigmoid } from '../../ops/ops';\nimport { getGlobalTensorClass } from '../../tensor';\ngetGlobalTensorClass().prototype.logSigmoid = function () {\n this.throwIfDisposed();\n return logSigmoid(this);\n};\n//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibG9nX3NpZ21vaWQuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi8uLi8uLi90ZmpzLWNvcmUvc3JjL3B1YmxpYy9jaGFpbmVkX29wcy9sb2dfc2lnbW9pZC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQTs7Ozs7Ozs7Ozs7Ozs7O0dBZUc7QUFFSCxrREFBa0Q7QUFDbEQsT0FBTyxFQUFDLFVBQVUsRUFBQyxNQUFNLGVBQWUsQ0FBQztBQUN6QyxPQUFPLEVBQUMsb0JBQW9CLEVBQVMsTUFBTSxjQUFjLENBQUM7QUFTMUQsb0JBQW9CLEVBQUUsQ0FBQyxTQUFTLENBQUMsVUFBVSxHQUFHO0lBRTVDLElBQUksQ0FBQyxlQUFlLEVBQUUsQ0FBQztJQUN2QixPQUFPLFVBQVUsQ0FBQyxJQUFJLENBQUMsQ0FBQztBQUMxQixDQUFDLENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyIvKipcbiAqIEBsaWNlbnNlXG4gKiBDb3B5cmlnaHQgMjAyMCBHb29nbGUgTExDLiBBbGwgUmlnaHRzIFJlc2VydmVkLlxuICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlIFwiTGljZW5zZVwiKTtcbiAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS5cbiAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdFxuICpcbiAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMFxuICpcbiAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmVcbiAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuIFwiQVMgSVNcIiBCQVNJUyxcbiAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLlxuICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZFxuICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuXG4gKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuICovXG5cbi8vIFRPRE8gdXBkYXRlIGltcG9ydCBwYXRoIG9uY2Ugb3AgaXMgbW9kdWxhcml6ZWQuXG5pbXBvcnQge2xvZ1NpZ21vaWR9IGZyb20gJy4uLy4uL29wcy9vcHMnO1xuaW1wb3J0IHtnZXRHbG9iYWxUZW5zb3JDbGFzcywgVGVuc29yfSBmcm9tICcuLi8uLi90ZW5zb3InO1xuaW1wb3J0IHtSYW5rfSBmcm9tICcuLi8uLi90eXBlcyc7XG5cbmRlY2xhcmUgbW9kdWxlICcuLi8uLi90ZW5zb3InIHtcbiAgaW50ZXJmYWNlIFRlbnNvcjxSIGV4dGVuZHMgUmFuayA9IFJhbms+IHtcbiAgICBsb2dTaWdtb2lkPFQgZXh0ZW5kcyBUZW5zb3I+KHRoaXM6IFQpOiBUO1xuICB9XG59XG5cbmdldEdsb2JhbFRlbnNvckNsYXNzKCkucHJvdG90eXBlLmxvZ1NpZ21vaWQgPSBmdW5jdGlvbjxUIGV4dGVuZHMgVGVuc29yPihcbiAgICB0aGlzOiBUKTogVCB7XG4gIHRoaXMudGhyb3dJZkRpc3Bvc2VkKCk7XG4gIHJldHVybiBsb2dTaWdtb2lkKHRoaXMpO1xufTtcbiJdfQ==","/**\n * @license\n * Copyright 2020 Google LLC. All Rights Reserved.\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n * =============================================================================\n */\n// TODO update import path once op is modularized.\nimport { logSoftmax } from '../../ops/ops';\nimport { getGlobalTensorClass } from '../../tensor';\ngetGlobalTensorClass().prototype.logSoftmax = function (axis) {\n this.throwIfDisposed();\n return logSoftmax(this, axis);\n};\n//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibG9nX3NvZnRtYXguanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi8uLi8uLi90ZmpzLWNvcmUvc3JjL3B1YmxpYy9jaGFpbmVkX29wcy9sb2dfc29mdG1heC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQTs7Ozs7Ozs7Ozs7Ozs7O0dBZUc7QUFFSCxrREFBa0Q7QUFDbEQsT0FBTyxFQUFDLFVBQVUsRUFBQyxNQUFNLGVBQWUsQ0FBQztBQUN6QyxPQUFPLEVBQUMsb0JBQW9CLEVBQVMsTUFBTSxjQUFjLENBQUM7QUFTMUQsb0JBQW9CLEVBQUUsQ0FBQyxTQUFTLENBQUMsVUFBVSxHQUFHLFVBQ2pDLElBQWE7SUFDeEIsSUFBSSxDQUFDLGVBQWUsRUFBRSxDQUFDO0lBQ3ZCLE9BQU8sVUFBVSxDQUFDLElBQUksRUFBRSxJQUFJLENBQUMsQ0FBQztBQUNoQyxDQUFDLENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyIvKipcbiAqIEBsaWNlbnNlXG4gKiBDb3B5cmlnaHQgMjAyMCBHb29nbGUgTExDLiBBbGwgUmlnaHRzIFJlc2VydmVkLlxuICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlIFwiTGljZW5zZVwiKTtcbiAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS5cbiAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdFxuICpcbiAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMFxuICpcbiAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmVcbiAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuIFwiQVMgSVNcIiBCQVNJUyxcbiAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLlxuICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZFxuICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuXG4gKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuICovXG5cbi8vIFRPRE8gdXBkYXRlIGltcG9ydCBwYXRoIG9uY2Ugb3AgaXMgbW9kdWxhcml6ZWQuXG5pbXBvcnQge2xvZ1NvZnRtYXh9IGZyb20gJy4uLy4uL29wcy9vcHMnO1xuaW1wb3J0IHtnZXRHbG9iYWxUZW5zb3JDbGFzcywgVGVuc29yfSBmcm9tICcuLi8uLi90ZW5zb3InO1xuaW1wb3J0IHtSYW5rfSBmcm9tICcuLi8uLi90eXBlcyc7XG5cbmRlY2xhcmUgbW9kdWxlICcuLi8uLi90ZW5zb3InIHtcbiAgaW50ZXJmYWNlIFRlbnNvcjxSIGV4dGVuZHMgUmFuayA9IFJhbms+IHtcbiAgICBsb2dTb2Z0bWF4PFQgZXh0ZW5kcyBUZW5zb3I+KHRoaXM6IFQsIGF4aXM/OiBudW1iZXIpOiBUO1xuICB9XG59XG5cbmdldEdsb2JhbFRlbnNvckNsYXNzKCkucHJvdG90eXBlLmxvZ1NvZnRtYXggPSBmdW5jdGlvbjxUIGV4dGVuZHMgVGVuc29yPihcbiAgICB0aGlzOiBULCBheGlzPzogbnVtYmVyKTogVCB7XG4gIHRoaXMudGhyb3dJZkRpc3Bvc2VkKCk7XG4gIHJldHVybiBsb2dTb2Z0bWF4KHRoaXMsIGF4aXMpO1xufTtcbiJdfQ==","/**\n * @license\n * Copyright 2020 Google LLC. All Rights Reserved.\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n * =============================================================================\n */\nimport { logSumExp } from '../../ops/log_sum_exp';\nimport { getGlobalTensorClass } from '../../tensor';\ngetGlobalTensorClass().prototype.logSumExp = function (axis, keepDims) {\n this.throwIfDisposed();\n return logSumExp(this, axis, keepDims);\n};\n//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibG9nX3N1bV9leHAuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi8uLi8uLi90ZmpzLWNvcmUvc3JjL3B1YmxpYy9jaGFpbmVkX29wcy9sb2dfc3VtX2V4cC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQTs7Ozs7Ozs7Ozs7Ozs7O0dBZUc7QUFDSCxPQUFPLEVBQUMsU0FBUyxFQUFDLE1BQU0sdUJBQXVCLENBQUM7QUFDaEQsT0FBTyxFQUFDLG9CQUFvQixFQUFTLE1BQU0sY0FBYyxDQUFDO0FBVTFELG9CQUFvQixFQUFFLENBQUMsU0FBUyxDQUFDLFNBQVMsR0FBRyxVQUNoQyxJQUFzQixFQUFFLFFBQWtCO0lBQ3JELElBQUksQ0FBQyxlQUFlLEVBQUUsQ0FBQztJQUN2QixPQUFPLFNBQVMsQ0FBQyxJQUFJLEVBQUUsSUFBSSxFQUFFLFFBQVEsQ0FBQyxDQUFDO0FBQ3pDLENBQUMsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbIi8qKlxuICogQGxpY2Vuc2VcbiAqIENvcHlyaWdodCAyMDIwIEdvb2dsZSBMTEMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuXG4gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgXCJMaWNlbnNlXCIpO1xuICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLlxuICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0XG4gKlxuICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wXG4gKlxuICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZVxuICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gXCJBUyBJU1wiIEJBU0lTLFxuICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuXG4gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kXG4gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS5cbiAqID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4gKi9cbmltcG9ydCB7bG9nU3VtRXhwfSBmcm9tICcuLi8uLi9vcHMvbG9nX3N1bV9leHAnO1xuaW1wb3J0IHtnZXRHbG9iYWxUZW5zb3JDbGFzcywgVGVuc29yfSBmcm9tICcuLi8uLi90ZW5zb3InO1xuaW1wb3J0IHtSYW5rfSBmcm9tICcuLi8uLi90eXBlcyc7XG5cbmRlY2xhcmUgbW9kdWxlICcuLi8uLi90ZW5zb3InIHtcbiAgaW50ZXJmYWNlIFRlbnNvcjxSIGV4dGVuZHMgUmFuayA9IFJhbms+IHtcbiAgICBsb2dTdW1FeHA8VCBleHRlbmRzIFRlbnNvcj4oXG4gICAgICAgIHRoaXM6IFQsIGF4aXM/OiBudW1iZXJ8bnVtYmVyW10sIGtlZXBEaW1zPzogYm9vbGVhbik6IFQ7XG4gIH1cbn1cblxuZ2V0R2xvYmFsVGVuc29yQ2xhc3MoKS5wcm90b3R5cGUubG9nU3VtRXhwID0gZnVuY3Rpb248VCBleHRlbmRzIFRlbnNvcj4oXG4gICAgdGhpczogVCwgYXhpcz86IG51bWJlcnxudW1iZXJbXSwga2VlcERpbXM/OiBib29sZWFuKTogVCB7XG4gIHRoaXMudGhyb3dJZkRpc3Bvc2VkKCk7XG4gIHJldHVybiBsb2dTdW1FeHAodGhpcywgYXhpcywga2VlcERpbXMpO1xufTtcbiJdfQ==","/**\n * @license\n * Copyright 2020 Google LLC. All Rights Reserved.\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n * =============================================================================\n */\n// TODO update import path once op is modularized.\nimport { log } from '../../ops/ops';\nimport { getGlobalTensorClass } from '../../tensor';\ngetGlobalTensorClass().prototype.log = function () {\n this.throwIfDisposed();\n return log(this);\n};\n//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibG9nLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vLi4vLi4vdGZqcy1jb3JlL3NyYy9wdWJsaWMvY2hhaW5lZF9vcHMvbG9nLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBOzs7Ozs7Ozs7Ozs7Ozs7R0FlRztBQUVILGtEQUFrRDtBQUNsRCxPQUFPLEVBQUMsR0FBRyxFQUFDLE1BQU0sZUFBZSxDQUFDO0FBQ2xDLE9BQU8sRUFBQyxvQkFBb0IsRUFBUyxNQUFNLGNBQWMsQ0FBQztBQVMxRCxvQkFBb0IsRUFBRSxDQUFDLFNBQVMsQ0FBQyxHQUFHLEdBQUc7SUFDckMsSUFBSSxDQUFDLGVBQWUsRUFBRSxDQUFDO0lBQ3ZCLE9BQU8sR0FBRyxDQUFDLElBQUksQ0FBQyxDQUFDO0FBQ25CLENBQUMsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbIi8qKlxuICogQGxpY2Vuc2VcbiAqIENvcHlyaWdodCAyMDIwIEdvb2dsZSBMTEMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuXG4gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgXCJMaWNlbnNlXCIpO1xuICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLlxuICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0XG4gKlxuICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wXG4gKlxuICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZVxuICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gXCJBUyBJU1wiIEJBU0lTLFxuICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuXG4gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kXG4gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS5cbiAqID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4gKi9cblxuLy8gVE9ETyB1cGRhdGUgaW1wb3J0IHBhdGggb25jZSBvcCBpcyBtb2R1bGFyaXplZC5cbmltcG9ydCB7bG9nfSBmcm9tICcuLi8uLi9vcHMvb3BzJztcbmltcG9ydCB7Z2V0R2xvYmFsVGVuc29yQ2xhc3MsIFRlbnNvcn0gZnJvbSAnLi4vLi4vdGVuc29yJztcbmltcG9ydCB7UmFua30gZnJvbSAnLi4vLi4vdHlwZXMnO1xuXG5kZWNsYXJlIG1vZHVsZSAnLi4vLi4vdGVuc29yJyB7XG4gIGludGVyZmFjZSBUZW5zb3I8UiBleHRlbmRzIFJhbmsgPSBSYW5rPiB7XG4gICAgbG9nPFQgZXh0ZW5kcyBUZW5zb3I+KHRoaXM6IFQpOiBUO1xuICB9XG59XG5cbmdldEdsb2JhbFRlbnNvckNsYXNzKCkucHJvdG90eXBlLmxvZyA9IGZ1bmN0aW9uPFQgZXh0ZW5kcyBUZW5zb3I+KHRoaXM6IFQpOiBUIHtcbiAgdGhpcy50aHJvd0lmRGlzcG9zZWQoKTtcbiAgcmV0dXJuIGxvZyh0aGlzKTtcbn07XG4iXX0=","/**\n * @license\n * Copyright 2020 Google LLC. All Rights Reserved.\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n * =============================================================================\n */\n// TODO update import path once op is modularized.\nimport { log1p } from '../../ops/ops';\nimport { getGlobalTensorClass } from '../../tensor';\ngetGlobalTensorClass().prototype.log1p = function () {\n this.throwIfDisposed();\n return log1p(this);\n};\n//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibG9nMXAuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi8uLi8uLi90ZmpzLWNvcmUvc3JjL3B1YmxpYy9jaGFpbmVkX29wcy9sb2cxcC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQTs7Ozs7Ozs7Ozs7Ozs7O0dBZUc7QUFFSCxrREFBa0Q7QUFDbEQsT0FBTyxFQUFDLEtBQUssRUFBQyxNQUFNLGVBQWUsQ0FBQztBQUNwQyxPQUFPLEVBQUMsb0JBQW9CLEVBQVMsTUFBTSxjQUFjLENBQUM7QUFTMUQsb0JBQW9CLEVBQUUsQ0FBQyxTQUFTLENBQUMsS0FBSyxHQUFHO0lBRXZDLElBQUksQ0FBQyxlQUFlLEVBQUUsQ0FBQztJQUN2QixPQUFPLEtBQUssQ0FBQyxJQUFJLENBQUMsQ0FBQztBQUNyQixDQUFDLENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyIvKipcbiAqIEBsaWNlbnNlXG4gKiBDb3B5cmlnaHQgMjAyMCBHb29nbGUgTExDLiBBbGwgUmlnaHRzIFJlc2VydmVkLlxuICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlIFwiTGljZW5zZVwiKTtcbiAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS5cbiAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdFxuICpcbiAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMFxuICpcbiAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmVcbiAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuIFwiQVMgSVNcIiBCQVNJUyxcbiAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLlxuICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZFxuICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuXG4gKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuICovXG5cbi8vIFRPRE8gdXBkYXRlIGltcG9ydCBwYXRoIG9uY2Ugb3AgaXMgbW9kdWxhcml6ZWQuXG5pbXBvcnQge2xvZzFwfSBmcm9tICcuLi8uLi9vcHMvb3BzJztcbmltcG9ydCB7Z2V0R2xvYmFsVGVuc29yQ2xhc3MsIFRlbnNvcn0gZnJvbSAnLi4vLi4vdGVuc29yJztcbmltcG9ydCB7UmFua30gZnJvbSAnLi4vLi4vdHlwZXMnO1xuXG5kZWNsYXJlIG1vZHVsZSAnLi4vLi4vdGVuc29yJyB7XG4gIGludGVyZmFjZSBUZW5zb3I8UiBleHRlbmRzIFJhbmsgPSBSYW5rPiB7XG4gICAgbG9nMXA8VCBleHRlbmRzIFRlbnNvcj4odGhpczogVCk6IFQ7XG4gIH1cbn1cblxuZ2V0R2xvYmFsVGVuc29yQ2xhc3MoKS5wcm90b3R5cGUubG9nMXAgPSBmdW5jdGlvbjxUIGV4dGVuZHMgVGVuc29yPih0aGlzOiBUKTpcbiAgICBUIHtcbiAgdGhpcy50aHJvd0lmRGlzcG9zZWQoKTtcbiAgcmV0dXJuIGxvZzFwKHRoaXMpO1xufTtcbiJdfQ==","/**\n * @license\n * Copyright 2020 Google LLC. All Rights Reserved.\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n * =============================================================================\n */\nimport { logicalAnd } from '../../ops/logical_and';\nimport { getGlobalTensorClass } from '../../tensor';\ngetGlobalTensorClass().prototype.logicalAnd = function (b) {\n this.throwIfDisposed();\n return logicalAnd(this, b);\n};\n//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibG9naWNhbF9hbmQuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi8uLi8uLi90ZmpzLWNvcmUvc3JjL3B1YmxpYy9jaGFpbmVkX29wcy9sb2dpY2FsX2FuZC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQTs7Ozs7Ozs7Ozs7Ozs7O0dBZUc7QUFDSCxPQUFPLEVBQUMsVUFBVSxFQUFDLE1BQU0sdUJBQXVCLENBQUM7QUFDakQsT0FBTyxFQUFDLG9CQUFvQixFQUFTLE1BQU0sY0FBYyxDQUFDO0FBUzFELG9CQUFvQixFQUFFLENBQUMsU0FBUyxDQUFDLFVBQVUsR0FBRyxVQUMxQyxDQUFvQjtJQUN0QixJQUFJLENBQUMsZUFBZSxFQUFFLENBQUM7SUFDdkIsT0FBTyxVQUFVLENBQUMsSUFBSSxFQUFFLENBQUMsQ0FBQyxDQUFDO0FBQzdCLENBQUMsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbIi8qKlxuICogQGxpY2Vuc2VcbiAqIENvcHlyaWdodCAyMDIwIEdvb2dsZSBMTEMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuXG4gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgXCJMaWNlbnNlXCIpO1xuICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLlxuICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0XG4gKlxuICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wXG4gKlxuICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZVxuICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gXCJBUyBJU1wiIEJBU0lTLFxuICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuXG4gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kXG4gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS5cbiAqID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4gKi9cbmltcG9ydCB7bG9naWNhbEFuZH0gZnJvbSAnLi4vLi4vb3BzL2xvZ2ljYWxfYW5kJztcbmltcG9ydCB7Z2V0R2xvYmFsVGVuc29yQ2xhc3MsIFRlbnNvcn0gZnJvbSAnLi4vLi4vdGVuc29yJztcbmltcG9ydCB7UmFuaywgVGVuc29yTGlrZX0gZnJvbSAnLi4vLi4vdHlwZXMnO1xuXG5kZWNsYXJlIG1vZHVsZSAnLi4vLi4vdGVuc29yJyB7XG4gIGludGVyZmFjZSBUZW5zb3I8UiBleHRlbmRzIFJhbmsgPSBSYW5rPiB7XG4gICAgbG9naWNhbEFuZDxUIGV4dGVuZHMgVGVuc29yPihiOiBUZW5zb3J8VGVuc29yTGlrZSk6IFQ7XG4gIH1cbn1cblxuZ2V0R2xvYmFsVGVuc29yQ2xhc3MoKS5wcm90b3R5cGUubG9naWNhbEFuZCA9IGZ1bmN0aW9uPFQgZXh0ZW5kcyBUZW5zb3I+KFxuICAgIGI6IFRlbnNvcnxUZW5zb3JMaWtlKTogVCB7XG4gIHRoaXMudGhyb3dJZkRpc3Bvc2VkKCk7XG4gIHJldHVybiBsb2dpY2FsQW5kKHRoaXMsIGIpO1xufTtcbiJdfQ==","/**\n * @license\n * Copyright 2020 Google LLC. All Rights Reserved.\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n * =============================================================================\n */\nimport { logicalNot } from '../../ops/logical_not';\nimport { getGlobalTensorClass } from '../../tensor';\ngetGlobalTensorClass().prototype.logicalNot = function () {\n this.throwIfDisposed();\n return logicalNot(this);\n};\n//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibG9naWNhbF9ub3QuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi8uLi8uLi90ZmpzLWNvcmUvc3JjL3B1YmxpYy9jaGFpbmVkX29wcy9sb2dpY2FsX25vdC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQTs7Ozs7Ozs7Ozs7Ozs7O0dBZUc7QUFDSCxPQUFPLEVBQUMsVUFBVSxFQUFDLE1BQU0sdUJBQXVCLENBQUM7QUFDakQsT0FBTyxFQUFDLG9CQUFvQixFQUFTLE1BQU0sY0FBYyxDQUFDO0FBUzFELG9CQUFvQixFQUFFLENBQUMsU0FBUyxDQUFDLFVBQVUsR0FBRztJQUM1QyxJQUFJLENBQUMsZUFBZSxFQUFFLENBQUM7SUFDdkIsT0FBTyxVQUFVLENBQUMsSUFBSSxDQUFNLENBQUM7QUFDL0IsQ0FBQyxDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiLyoqXG4gKiBAbGljZW5zZVxuICogQ29weXJpZ2h0IDIwMjAgR29vZ2xlIExMQy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC5cbiAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSBcIkxpY2Vuc2VcIik7XG4gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuXG4gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXRcbiAqXG4gKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjBcbiAqXG4gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlXG4gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiBcIkFTIElTXCIgQkFTSVMsXG4gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC5cbiAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmRcbiAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLlxuICogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbiAqL1xuaW1wb3J0IHtsb2dpY2FsTm90fSBmcm9tICcuLi8uLi9vcHMvbG9naWNhbF9ub3QnO1xuaW1wb3J0IHtnZXRHbG9iYWxUZW5zb3JDbGFzcywgVGVuc29yfSBmcm9tICcuLi8uLi90ZW5zb3InO1xuaW1wb3J0IHtSYW5rfSBmcm9tICcuLi8uLi90eXBlcyc7XG5cbmRlY2xhcmUgbW9kdWxlICcuLi8uLi90ZW5zb3InIHtcbiAgaW50ZXJmYWNlIFRlbnNvcjxSIGV4dGVuZHMgUmFuayA9IFJhbms+IHtcbiAgICBsb2dpY2FsTm90PFQgZXh0ZW5kcyBUZW5zb3I+KCk6IFQ7XG4gIH1cbn1cblxuZ2V0R2xvYmFsVGVuc29yQ2xhc3MoKS5wcm90b3R5cGUubG9naWNhbE5vdCA9IGZ1bmN0aW9uPFQgZXh0ZW5kcyBUZW5zb3I+KCk6IFQge1xuICB0aGlzLnRocm93SWZEaXNwb3NlZCgpO1xuICByZXR1cm4gbG9naWNhbE5vdCh0aGlzKSBhcyBUO1xufTtcbiJdfQ==","/**\n * @license\n * Copyright 2020 Google LLC. All Rights Reserved.\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n * =============================================================================\n */\nimport { logicalOr } from '../../ops/logical_or';\nimport { getGlobalTensorClass } from '../../tensor';\ngetGlobalTensorClass().prototype.logicalOr = function (b) {\n this.throwIfDisposed();\n return logicalOr(this, b);\n};\n//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibG9naWNhbF9vci5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uLy4uLy4uL3RmanMtY29yZS9zcmMvcHVibGljL2NoYWluZWRfb3BzL2xvZ2ljYWxfb3IudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUE7Ozs7Ozs7Ozs7Ozs7OztHQWVHO0FBQ0gsT0FBTyxFQUFDLFNBQVMsRUFBQyxNQUFNLHNCQUFzQixDQUFDO0FBQy9DLE9BQU8sRUFBQyxvQkFBb0IsRUFBUyxNQUFNLGNBQWMsQ0FBQztBQVMxRCxvQkFBb0IsRUFBRSxDQUFDLFNBQVMsQ0FBQyxTQUFTLEdBQUcsVUFDekMsQ0FBb0I7SUFDdEIsSUFBSSxDQUFDLGVBQWUsRUFBRSxDQUFDO0lBQ3ZCLE9BQU8sU0FBUyxDQUFDLElBQUksRUFBRSxDQUFDLENBQUMsQ0FBQztBQUM1QixDQUFDLENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyIvKipcbiAqIEBsaWNlbnNlXG4gKiBDb3B5cmlnaHQgMjAyMCBHb29nbGUgTExDLiBBbGwgUmlnaHRzIFJlc2VydmVkLlxuICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlIFwiTGljZW5zZVwiKTtcbiAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS5cbiAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdFxuICpcbiAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMFxuICpcbiAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmVcbiAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuIFwiQVMgSVNcIiBCQVNJUyxcbiAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLlxuICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZFxuICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuXG4gKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuICovXG5pbXBvcnQge2xvZ2ljYWxPcn0gZnJvbSAnLi4vLi4vb3BzL2xvZ2ljYWxfb3InO1xuaW1wb3J0IHtnZXRHbG9iYWxUZW5zb3JDbGFzcywgVGVuc29yfSBmcm9tICcuLi8uLi90ZW5zb3InO1xuaW1wb3J0IHtSYW5rLCBUZW5zb3JMaWtlfSBmcm9tICcuLi8uLi90eXBlcyc7XG5cbmRlY2xhcmUgbW9kdWxlICcuLi8uLi90ZW5zb3InIHtcbiAgaW50ZXJmYWNlIFRlbnNvcjxSIGV4dGVuZHMgUmFuayA9IFJhbms+IHtcbiAgICBsb2dpY2FsT3I8VCBleHRlbmRzIFRlbnNvcj4oYjogVGVuc29yfFRlbnNvckxpa2UpOiBUO1xuICB9XG59XG5cbmdldEdsb2JhbFRlbnNvckNsYXNzKCkucHJvdG90eXBlLmxvZ2ljYWxPciA9IGZ1bmN0aW9uPFQgZXh0ZW5kcyBUZW5zb3I+KFxuICAgIGI6IFRlbnNvcnxUZW5zb3JMaWtlKTogVCB7XG4gIHRoaXMudGhyb3dJZkRpc3Bvc2VkKCk7XG4gIHJldHVybiBsb2dpY2FsT3IodGhpcywgYik7XG59O1xuIl19","/**\n * @license\n * Copyright 2020 Google LLC. All Rights Reserved.\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n * =============================================================================\n */\nimport { logicalXor } from '../../ops/logical_xor';\nimport { getGlobalTensorClass } from '../../tensor';\ngetGlobalTensorClass().prototype.logicalXor = function (b) {\n this.throwIfDisposed();\n return logicalXor(this, b);\n};\n//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibG9naWNhbF94b3IuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi8uLi8uLi90ZmpzLWNvcmUvc3JjL3B1YmxpYy9jaGFpbmVkX29wcy9sb2dpY2FsX3hvci50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQTs7Ozs7Ozs7Ozs7Ozs7O0dBZUc7QUFDSCxPQUFPLEVBQUMsVUFBVSxFQUFDLE1BQU0sdUJBQXVCLENBQUM7QUFDakQsT0FBTyxFQUFDLG9CQUFvQixFQUFTLE1BQU0sY0FBYyxDQUFDO0FBUzFELG9CQUFvQixFQUFFLENBQUMsU0FBUyxDQUFDLFVBQVUsR0FBRyxVQUMxQyxDQUFvQjtJQUN0QixJQUFJLENBQUMsZUFBZSxFQUFFLENBQUM7SUFDdkIsT0FBTyxVQUFVLENBQUMsSUFBSSxFQUFFLENBQUMsQ0FBQyxDQUFDO0FBQzdCLENBQUMsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbIi8qKlxuICogQGxpY2Vuc2VcbiAqIENvcHlyaWdodCAyMDIwIEdvb2dsZSBMTEMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuXG4gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgXCJMaWNlbnNlXCIpO1xuICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLlxuICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0XG4gKlxuICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wXG4gKlxuICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZVxuICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gXCJBUyBJU1wiIEJBU0lTLFxuICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuXG4gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kXG4gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS5cbiAqID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4gKi9cbmltcG9ydCB7bG9naWNhbFhvcn0gZnJvbSAnLi4vLi4vb3BzL2xvZ2ljYWxfeG9yJztcbmltcG9ydCB7Z2V0R2xvYmFsVGVuc29yQ2xhc3MsIFRlbnNvcn0gZnJvbSAnLi4vLi4vdGVuc29yJztcbmltcG9ydCB7UmFuaywgVGVuc29yTGlrZX0gZnJvbSAnLi4vLi4vdHlwZXMnO1xuXG5kZWNsYXJlIG1vZHVsZSAnLi4vLi4vdGVuc29yJyB7XG4gIGludGVyZmFjZSBUZW5zb3I8UiBleHRlbmRzIFJhbmsgPSBSYW5rPiB7XG4gICAgbG9naWNhbFhvcjxUIGV4dGVuZHMgVGVuc29yPihiOiBUZW5zb3J8VGVuc29yTGlrZSk6IFQ7XG4gIH1cbn1cblxuZ2V0R2xvYmFsVGVuc29yQ2xhc3MoKS5wcm90b3R5cGUubG9naWNhbFhvciA9IGZ1bmN0aW9uPFQgZXh0ZW5kcyBUZW5zb3I+KFxuICAgIGI6IFRlbnNvcnxUZW5zb3JMaWtlKTogVCB7XG4gIHRoaXMudGhyb3dJZkRpc3Bvc2VkKCk7XG4gIHJldHVybiBsb2dpY2FsWG9yKHRoaXMsIGIpO1xufTtcbiJdfQ==","/**\n * @license\n * Copyright 2020 Google LLC. All Rights Reserved.\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n * =============================================================================\n */\nimport { matMul } from '../../ops/mat_mul';\nimport { getGlobalTensorClass } from '../../tensor';\ngetGlobalTensorClass().prototype.matMul = function (b, transposeA, transposeB) {\n this.throwIfDisposed();\n return matMul(this, b, transposeA, transposeB);\n};\n//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibWF0X211bC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uLy4uLy4uL3RmanMtY29yZS9zcmMvcHVibGljL2NoYWluZWRfb3BzL21hdF9tdWwudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUE7Ozs7Ozs7Ozs7Ozs7OztHQWVHO0FBQ0gsT0FBTyxFQUFDLE1BQU0sRUFBQyxNQUFNLG1CQUFtQixDQUFDO0FBQ3pDLE9BQU8sRUFBQyxvQkFBb0IsRUFBUyxNQUFNLGNBQWMsQ0FBQztBQVcxRCxvQkFBb0IsRUFBRSxDQUFDLFNBQVMsQ0FBQyxNQUFNLEdBQUcsVUFDN0IsQ0FBb0IsRUFBRSxVQUFvQixFQUNuRCxVQUFvQjtJQUN0QixJQUFJLENBQUMsZUFBZSxFQUFFLENBQUM7SUFDdkIsT0FBTyxNQUFNLENBQUMsSUFBSSxFQUFFLENBQUMsRUFBRSxVQUFVLEVBQUUsVUFBVSxDQUFDLENBQUM7QUFDakQsQ0FBQyxDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiLyoqXG4gKiBAbGljZW5zZVxuICogQ29weXJpZ2h0IDIwMjAgR29vZ2xlIExMQy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC5cbiAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSBcIkxpY2Vuc2VcIik7XG4gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuXG4gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXRcbiAqXG4gKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjBcbiAqXG4gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlXG4gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiBcIkFTIElTXCIgQkFTSVMsXG4gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC5cbiAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmRcbiAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLlxuICogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbiAqL1xuaW1wb3J0IHttYXRNdWx9IGZyb20gJy4uLy4uL29wcy9tYXRfbXVsJztcbmltcG9ydCB7Z2V0R2xvYmFsVGVuc29yQ2xhc3MsIFRlbnNvcn0gZnJvbSAnLi4vLi4vdGVuc29yJztcbmltcG9ydCB7UmFuaywgVGVuc29yTGlrZX0gZnJvbSAnLi4vLi4vdHlwZXMnO1xuXG5kZWNsYXJlIG1vZHVsZSAnLi4vLi4vdGVuc29yJyB7XG4gIGludGVyZmFjZSBUZW5zb3I8UiBleHRlbmRzIFJhbmsgPSBSYW5rPiB7XG4gICAgbWF0TXVsPFQgZXh0ZW5kcyBUZW5zb3I+KFxuICAgICAgICBiOiBUZW5zb3J8VGVuc29yTGlrZSwgdHJhbnNwb3NlQT86IGJvb2xlYW4sXG4gICAgICAgIHRyYW5zcG9zZUI/OiBib29sZWFuKTogVGVuc29yO1xuICB9XG59XG5cbmdldEdsb2JhbFRlbnNvckNsYXNzKCkucHJvdG90eXBlLm1hdE11bCA9IGZ1bmN0aW9uPFQgZXh0ZW5kcyBUZW5zb3I+KFxuICAgIHRoaXM6IFQsIGI6IFRlbnNvcnxUZW5zb3JMaWtlLCB0cmFuc3Bvc2VBPzogYm9vbGVhbixcbiAgICB0cmFuc3Bvc2VCPzogYm9vbGVhbik6IFRlbnNvciB7XG4gIHRoaXMudGhyb3dJZkRpc3Bvc2VkKCk7XG4gIHJldHVybiBtYXRNdWwodGhpcywgYiwgdHJhbnNwb3NlQSwgdHJhbnNwb3NlQik7XG59O1xuIl19","import { maxPool } from '../../ops/max_pool';\nimport { getGlobalTensorClass } from '../../tensor';\ngetGlobalTensorClass().prototype.maxPool =\n function (filterSize, strides, pad, dimRoundingMode) {\n this.throwIfDisposed();\n return maxPool(this, filterSize, strides, pad, dimRoundingMode);\n };\n//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibWF4X3Bvb2wuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi8uLi8uLi90ZmpzLWNvcmUvc3JjL3B1YmxpYy9jaGFpbmVkX29wcy9tYXhfcG9vbC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFpQkEsT0FBTyxFQUFDLE9BQU8sRUFBQyxNQUFNLG9CQUFvQixDQUFDO0FBQzNDLE9BQU8sRUFBQyxvQkFBb0IsRUFBcUIsTUFBTSxjQUFjLENBQUM7QUFZdEUsb0JBQW9CLEVBQUUsQ0FBQyxTQUFTLENBQUMsT0FBTztJQUNwQyxVQUNhLFVBQW1DLEVBQzVDLE9BQWdDLEVBQ2hDLEdBQTBDLEVBQzFDLGVBQXdDO1FBQzlDLElBQUksQ0FBQyxlQUFlLEVBQUUsQ0FBQztRQUN2QixPQUFPLE9BQU8sQ0FBQyxJQUFJLEVBQUUsVUFBVSxFQUFFLE9BQU8sRUFBRSxHQUFHLEVBQUUsZUFBZSxDQUFDLENBQUM7SUFDbEUsQ0FBQyxDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiLyoqXG4gKiBAbGljZW5zZVxuICogQ29weXJpZ2h0IDIwMjAgR29vZ2xlIExMQy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC5cbiAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSBcIkxpY2Vuc2VcIik7XG4gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuXG4gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXRcbiAqXG4gKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjBcbiAqXG4gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlXG4gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiBcIkFTIElTXCIgQkFTSVMsXG4gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC5cbiAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmRcbiAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLlxuICogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbiAqL1xuaW1wb3J0IHtFeHBsaWNpdFBhZGRpbmd9IGZyb20gJy4uLy4uL29wcy9jb252X3V0aWwnO1xuaW1wb3J0IHttYXhQb29sfSBmcm9tICcuLi8uLi9vcHMvbWF4X3Bvb2wnO1xuaW1wb3J0IHtnZXRHbG9iYWxUZW5zb3JDbGFzcywgVGVuc29yM0QsIFRlbnNvcjREfSBmcm9tICcuLi8uLi90ZW5zb3InO1xuaW1wb3J0IHtSYW5rfSBmcm9tICcuLi8uLi90eXBlcyc7XG5cbmRlY2xhcmUgbW9kdWxlICcuLi8uLi90ZW5zb3InIHtcbiAgaW50ZXJmYWNlIFRlbnNvcjxSIGV4dGVuZHMgUmFuayA9IFJhbms+IHtcbiAgICBtYXhQb29sPFQgZXh0ZW5kcyBUZW5zb3IzRHxUZW5zb3I0RD4oXG4gICAgICAgIGZpbHRlclNpemU6IFtudW1iZXIsIG51bWJlcl18bnVtYmVyLCBzdHJpZGVzOiBbbnVtYmVyLCBudW1iZXJdfG51bWJlcixcbiAgICAgICAgcGFkOiAndmFsaWQnfCdzYW1lJ3xudW1iZXJ8RXhwbGljaXRQYWRkaW5nLFxuICAgICAgICBkaW1Sb3VuZGluZ01vZGU/OiAnZmxvb3InfCdyb3VuZCd8J2NlaWwnKTogVDtcbiAgfVxufVxuXG5nZXRHbG9iYWxUZW5zb3JDbGFzcygpLnByb3RvdHlwZS5tYXhQb29sID1cbiAgICBmdW5jdGlvbjxUIGV4dGVuZHMgVGVuc29yM0R8VGVuc29yNEQ+KFxuICAgICAgICB0aGlzOiBULCBmaWx0ZXJTaXplOiBbbnVtYmVyLCBudW1iZXJdfG51bWJlcixcbiAgICAgICAgc3RyaWRlczogW251bWJlciwgbnVtYmVyXXxudW1iZXIsXG4gICAgICAgIHBhZDogJ3ZhbGlkJ3wnc2FtZSd8bnVtYmVyfEV4cGxpY2l0UGFkZGluZyxcbiAgICAgICAgZGltUm91bmRpbmdNb2RlPzogJ2Zsb29yJ3wncm91bmQnfCdjZWlsJyk6IFQge1xuICB0aGlzLnRocm93SWZEaXNwb3NlZCgpO1xuICByZXR1cm4gbWF4UG9vbCh0aGlzLCBmaWx0ZXJTaXplLCBzdHJpZGVzLCBwYWQsIGRpbVJvdW5kaW5nTW9kZSk7XG59O1xuIl19","/**\n * @license\n * Copyright 2020 Google LLC. All Rights Reserved.\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n * =============================================================================\n */\nimport { max } from '../../ops/max';\nimport { getGlobalTensorClass } from '../../tensor';\ngetGlobalTensorClass().prototype.max = function (axis, keepDims) {\n this.throwIfDisposed();\n return max(this, axis, keepDims);\n};\n//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibWF4LmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vLi4vLi4vdGZqcy1jb3JlL3NyYy9wdWJsaWMvY2hhaW5lZF9vcHMvbWF4LnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBOzs7Ozs7Ozs7Ozs7Ozs7R0FlRztBQUVILE9BQU8sRUFBQyxHQUFHLEVBQUMsTUFBTSxlQUFlLENBQUM7QUFDbEMsT0FBTyxFQUFDLG9CQUFvQixFQUFTLE1BQU0sY0FBYyxDQUFDO0FBUzFELG9CQUFvQixFQUFFLENBQUMsU0FBUyxDQUFDLEdBQUcsR0FBRyxVQUNuQyxJQUFzQixFQUFFLFFBQWtCO0lBQzVDLElBQUksQ0FBQyxlQUFlLEVBQUUsQ0FBQztJQUN2QixPQUFPLEdBQUcsQ0FBQyxJQUFJLEVBQUUsSUFBSSxFQUFFLFFBQVEsQ0FBQyxDQUFDO0FBQ25DLENBQUMsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbIi8qKlxuICogQGxpY2Vuc2VcbiAqIENvcHlyaWdodCAyMDIwIEdvb2dsZSBMTEMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuXG4gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgXCJMaWNlbnNlXCIpO1xuICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLlxuICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0XG4gKlxuICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wXG4gKlxuICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZVxuICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gXCJBUyBJU1wiIEJBU0lTLFxuICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuXG4gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kXG4gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS5cbiAqID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4gKi9cblxuaW1wb3J0IHttYXh9IGZyb20gJy4uLy4uL29wcy9tYXgnO1xuaW1wb3J0IHtnZXRHbG9iYWxUZW5zb3JDbGFzcywgVGVuc29yfSBmcm9tICcuLi8uLi90ZW5zb3InO1xuaW1wb3J0IHtSYW5rfSBmcm9tICcuLi8uLi90eXBlcyc7XG5cbmRlY2xhcmUgbW9kdWxlICcuLi8uLi90ZW5zb3InIHtcbiAgaW50ZXJmYWNlIFRlbnNvcjxSIGV4dGVuZHMgUmFuayA9IFJhbms+IHtcbiAgICBtYXg8VCBleHRlbmRzIFRlbnNvcj4oYXhpcz86IG51bWJlcnxudW1iZXJbXSwga2VlcERpbXM/OiBib29sZWFuKTogVDtcbiAgfVxufVxuXG5nZXRHbG9iYWxUZW5zb3JDbGFzcygpLnByb3RvdHlwZS5tYXggPSBmdW5jdGlvbjxUIGV4dGVuZHMgVGVuc29yPihcbiAgICBheGlzPzogbnVtYmVyfG51bWJlcltdLCBrZWVwRGltcz86IGJvb2xlYW4pOiBUIHtcbiAgdGhpcy50aHJvd0lmRGlzcG9zZWQoKTtcbiAgcmV0dXJuIG1heCh0aGlzLCBheGlzLCBrZWVwRGltcyk7XG59O1xuIl19","/**\n * @license\n * Copyright 2020 Google LLC. All Rights Reserved.\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n * =============================================================================\n */\nimport { maximum } from '../../ops/maximum';\nimport { getGlobalTensorClass } from '../../tensor';\ngetGlobalTensorClass().prototype.maximum = function (b) {\n this.throwIfDisposed();\n return maximum(this, b);\n};\n//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibWF4aW11bS5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uLy4uLy4uL3RmanMtY29yZS9zcmMvcHVibGljL2NoYWluZWRfb3BzL21heGltdW0udHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUE7Ozs7Ozs7Ozs7Ozs7OztHQWVHO0FBQ0gsT0FBTyxFQUFDLE9BQU8sRUFBQyxNQUFNLG1CQUFtQixDQUFDO0FBQzFDLE9BQU8sRUFBQyxvQkFBb0IsRUFBUyxNQUFNLGNBQWMsQ0FBQztBQVMxRCxvQkFBb0IsRUFBRSxDQUFDLFNBQVMsQ0FBQyxPQUFPLEdBQUcsVUFDdkMsQ0FBb0I7SUFDdEIsSUFBSSxDQUFDLGVBQWUsRUFBRSxDQUFDO0lBQ3ZCLE9BQU8sT0FBTyxDQUFDLElBQUksRUFBRSxDQUFDLENBQUMsQ0FBQztBQUMxQixDQUFDLENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyIvKipcbiAqIEBsaWNlbnNlXG4gKiBDb3B5cmlnaHQgMjAyMCBHb29nbGUgTExDLiBBbGwgUmlnaHRzIFJlc2VydmVkLlxuICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlIFwiTGljZW5zZVwiKTtcbiAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS5cbiAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdFxuICpcbiAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMFxuICpcbiAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmVcbiAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuIFwiQVMgSVNcIiBCQVNJUyxcbiAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLlxuICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZFxuICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuXG4gKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuICovXG5pbXBvcnQge21heGltdW19IGZyb20gJy4uLy4uL29wcy9tYXhpbXVtJztcbmltcG9ydCB7Z2V0R2xvYmFsVGVuc29yQ2xhc3MsIFRlbnNvcn0gZnJvbSAnLi4vLi4vdGVuc29yJztcbmltcG9ydCB7UmFuaywgVGVuc29yTGlrZX0gZnJvbSAnLi4vLi4vdHlwZXMnO1xuXG5kZWNsYXJlIG1vZHVsZSAnLi4vLi4vdGVuc29yJyB7XG4gIGludGVyZmFjZSBUZW5zb3I8UiBleHRlbmRzIFJhbmsgPSBSYW5rPiB7XG4gICAgbWF4aW11bTxUIGV4dGVuZHMgVGVuc29yPihiOiBUZW5zb3J8VGVuc29yTGlrZSk6IFQ7XG4gIH1cbn1cblxuZ2V0R2xvYmFsVGVuc29yQ2xhc3MoKS5wcm90b3R5cGUubWF4aW11bSA9IGZ1bmN0aW9uPFQgZXh0ZW5kcyBUZW5zb3I+KFxuICAgIGI6IFRlbnNvcnxUZW5zb3JMaWtlKTogVCB7XG4gIHRoaXMudGhyb3dJZkRpc3Bvc2VkKCk7XG4gIHJldHVybiBtYXhpbXVtKHRoaXMsIGIpO1xufTtcbiJdfQ==","/**\n * @license\n * Copyright 2020 Google LLC. All Rights Reserved.\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n * =============================================================================\n */\nimport { mean } from '../../ops/mean';\nimport { getGlobalTensorClass } from '../../tensor';\ngetGlobalTensorClass().prototype.mean = function (axis, keepDims) {\n this.throwIfDisposed();\n return mean(this, axis, keepDims);\n};\n//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibWVhbi5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uLy4uLy4uL3RmanMtY29yZS9zcmMvcHVibGljL2NoYWluZWRfb3BzL21lYW4udHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUE7Ozs7Ozs7Ozs7Ozs7OztHQWVHO0FBQ0gsT0FBTyxFQUFDLElBQUksRUFBQyxNQUFNLGdCQUFnQixDQUFDO0FBQ3BDLE9BQU8sRUFBQyxvQkFBb0IsRUFBUyxNQUFNLGNBQWMsQ0FBQztBQVMxRCxvQkFBb0IsRUFBRSxDQUFDLFNBQVMsQ0FBQyxJQUFJLEdBQUcsVUFDcEMsSUFBc0IsRUFBRSxRQUFrQjtJQUM1QyxJQUFJLENBQUMsZUFBZSxFQUFFLENBQUM7SUFDdkIsT0FBTyxJQUFJLENBQUMsSUFBSSxFQUFFLElBQUksRUFBRSxRQUFRLENBQUMsQ0FBQztBQUNwQyxDQUFDLENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyIvKipcbiAqIEBsaWNlbnNlXG4gKiBDb3B5cmlnaHQgMjAyMCBHb29nbGUgTExDLiBBbGwgUmlnaHRzIFJlc2VydmVkLlxuICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlIFwiTGljZW5zZVwiKTtcbiAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS5cbiAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdFxuICpcbiAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMFxuICpcbiAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmVcbiAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuIFwiQVMgSVNcIiBCQVNJUyxcbiAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLlxuICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZFxuICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuXG4gKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuICovXG5pbXBvcnQge21lYW59IGZyb20gJy4uLy4uL29wcy9tZWFuJztcbmltcG9ydCB7Z2V0R2xvYmFsVGVuc29yQ2xhc3MsIFRlbnNvcn0gZnJvbSAnLi4vLi4vdGVuc29yJztcbmltcG9ydCB7UmFua30gZnJvbSAnLi4vLi4vdHlwZXMnO1xuXG5kZWNsYXJlIG1vZHVsZSAnLi4vLi4vdGVuc29yJyB7XG4gIGludGVyZmFjZSBUZW5zb3I8UiBleHRlbmRzIFJhbmsgPSBSYW5rPiB7XG4gICAgbWVhbjxUIGV4dGVuZHMgVGVuc29yPihheGlzPzogbnVtYmVyfG51bWJlcltdLCBrZWVwRGltcz86IGJvb2xlYW4pOiBUO1xuICB9XG59XG5cbmdldEdsb2JhbFRlbnNvckNsYXNzKCkucHJvdG90eXBlLm1lYW4gPSBmdW5jdGlvbjxUIGV4dGVuZHMgVGVuc29yPihcbiAgICBheGlzPzogbnVtYmVyfG51bWJlcltdLCBrZWVwRGltcz86IGJvb2xlYW4pOiBUIHtcbiAgdGhpcy50aHJvd0lmRGlzcG9zZWQoKTtcbiAgcmV0dXJuIG1lYW4odGhpcywgYXhpcywga2VlcERpbXMpO1xufTtcbiJdfQ==","/**\n * @license\n * Copyright 2020 Google LLC. All Rights Reserved.\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n * =============================================================================\n */\nimport { min } from '../../ops/min';\nimport { getGlobalTensorClass } from '../../tensor';\ngetGlobalTensorClass().prototype.min = function (axis, keepDims) {\n this.throwIfDisposed();\n return min(this, axis, keepDims);\n};\n//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibWluLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vLi4vLi4vdGZqcy1jb3JlL3NyYy9wdWJsaWMvY2hhaW5lZF9vcHMvbWluLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBOzs7Ozs7Ozs7Ozs7Ozs7R0FlRztBQUVILE9BQU8sRUFBQyxHQUFHLEVBQUMsTUFBTSxlQUFlLENBQUM7QUFDbEMsT0FBTyxFQUFDLG9CQUFvQixFQUFTLE1BQU0sY0FBYyxDQUFDO0FBUzFELG9CQUFvQixFQUFFLENBQUMsU0FBUyxDQUFDLEdBQUcsR0FBRyxVQUNuQyxJQUFzQixFQUFFLFFBQWtCO0lBQzVDLElBQUksQ0FBQyxlQUFlLEVBQUUsQ0FBQztJQUN2QixPQUFPLEdBQUcsQ0FBQyxJQUFJLEVBQUUsSUFBSSxFQUFFLFFBQVEsQ0FBQyxDQUFDO0FBQ25DLENBQUMsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbIi8qKlxuICogQGxpY2Vuc2VcbiAqIENvcHlyaWdodCAyMDIwIEdvb2dsZSBMTEMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuXG4gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgXCJMaWNlbnNlXCIpO1xuICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLlxuICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0XG4gKlxuICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wXG4gKlxuICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZVxuICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gXCJBUyBJU1wiIEJBU0lTLFxuICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuXG4gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kXG4gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS5cbiAqID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4gKi9cblxuaW1wb3J0IHttaW59IGZyb20gJy4uLy4uL29wcy9taW4nO1xuaW1wb3J0IHtnZXRHbG9iYWxUZW5zb3JDbGFzcywgVGVuc29yfSBmcm9tICcuLi8uLi90ZW5zb3InO1xuaW1wb3J0IHtSYW5rfSBmcm9tICcuLi8uLi90eXBlcyc7XG5cbmRlY2xhcmUgbW9kdWxlICcuLi8uLi90ZW5zb3InIHtcbiAgaW50ZXJmYWNlIFRlbnNvcjxSIGV4dGVuZHMgUmFuayA9IFJhbms+IHtcbiAgICBtaW48VCBleHRlbmRzIFRlbnNvcj4oYXhpcz86IG51bWJlcnxudW1iZXJbXSwga2VlcERpbXM/OiBib29sZWFuKTogVDtcbiAgfVxufVxuXG5nZXRHbG9iYWxUZW5zb3JDbGFzcygpLnByb3RvdHlwZS5taW4gPSBmdW5jdGlvbjxUIGV4dGVuZHMgVGVuc29yPihcbiAgICBheGlzPzogbnVtYmVyfG51bWJlcltdLCBrZWVwRGltcz86IGJvb2xlYW4pOiBUIHtcbiAgdGhpcy50aHJvd0lmRGlzcG9zZWQoKTtcbiAgcmV0dXJuIG1pbih0aGlzLCBheGlzLCBrZWVwRGltcyk7XG59O1xuIl19","/**\n * @license\n * Copyright 2020 Google LLC. All Rights Reserved.\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n * =============================================================================\n */\nimport { minimum } from '../../ops/minimum';\nimport { getGlobalTensorClass } from '../../tensor';\ngetGlobalTensorClass().prototype.minimum = function (b) {\n this.throwIfDisposed();\n return minimum(this, b);\n};\n//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibWluaW11bS5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uLy4uLy4uL3RmanMtY29yZS9zcmMvcHVibGljL2NoYWluZWRfb3BzL21pbmltdW0udHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUE7Ozs7Ozs7Ozs7Ozs7OztHQWVHO0FBQ0gsT0FBTyxFQUFDLE9BQU8sRUFBQyxNQUFNLG1CQUFtQixDQUFDO0FBQzFDLE9BQU8sRUFBQyxvQkFBb0IsRUFBUyxNQUFNLGNBQWMsQ0FBQztBQVMxRCxvQkFBb0IsRUFBRSxDQUFDLFNBQVMsQ0FBQyxPQUFPLEdBQUcsVUFDdkMsQ0FBb0I7SUFDdEIsSUFBSSxDQUFDLGVBQWUsRUFBRSxDQUFDO0lBQ3ZCLE9BQU8sT0FBTyxDQUFDLElBQUksRUFBRSxDQUFDLENBQUMsQ0FBQztBQUMxQixDQUFDLENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyIvKipcbiAqIEBsaWNlbnNlXG4gKiBDb3B5cmlnaHQgMjAyMCBHb29nbGUgTExDLiBBbGwgUmlnaHRzIFJlc2VydmVkLlxuICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlIFwiTGljZW5zZVwiKTtcbiAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS5cbiAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdFxuICpcbiAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMFxuICpcbiAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmVcbiAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuIFwiQVMgSVNcIiBCQVNJUyxcbiAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLlxuICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZFxuICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuXG4gKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuICovXG5pbXBvcnQge21pbmltdW19IGZyb20gJy4uLy4uL29wcy9taW5pbXVtJztcbmltcG9ydCB7Z2V0R2xvYmFsVGVuc29yQ2xhc3MsIFRlbnNvcn0gZnJvbSAnLi4vLi4vdGVuc29yJztcbmltcG9ydCB7UmFuaywgVGVuc29yTGlrZX0gZnJvbSAnLi4vLi4vdHlwZXMnO1xuXG5kZWNsYXJlIG1vZHVsZSAnLi4vLi4vdGVuc29yJyB7XG4gIGludGVyZmFjZSBUZW5zb3I8UiBleHRlbmRzIFJhbmsgPSBSYW5rPiB7XG4gICAgbWluaW11bTxUIGV4dGVuZHMgVGVuc29yPihiOiBUZW5zb3J8VGVuc29yTGlrZSk6IFQ7XG4gIH1cbn1cblxuZ2V0R2xvYmFsVGVuc29yQ2xhc3MoKS5wcm90b3R5cGUubWluaW11bSA9IGZ1bmN0aW9uPFQgZXh0ZW5kcyBUZW5zb3I+KFxuICAgIGI6IFRlbnNvcnxUZW5zb3JMaWtlKTogVCB7XG4gIHRoaXMudGhyb3dJZkRpc3Bvc2VkKCk7XG4gIHJldHVybiBtaW5pbXVtKHRoaXMsIGIpO1xufTtcbiJdfQ==","/**\n * @license\n * Copyright 2020 Google LLC. All Rights Reserved.\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n * =============================================================================\n */\nimport { mirrorPad } from '../../ops/mirror_pad';\nimport { getGlobalTensorClass } from '../../tensor';\ngetGlobalTensorClass().prototype.mirrorPad = function (paddings, mode) {\n this.throwIfDisposed();\n return mirrorPad(this, paddings, mode);\n};\n//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibWlycm9yX3BhZC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uLy4uLy4uL3RmanMtY29yZS9zcmMvcHVibGljL2NoYWluZWRfb3BzL21pcnJvcl9wYWQudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUE7Ozs7Ozs7Ozs7Ozs7OztHQWVHO0FBRUgsT0FBTyxFQUFDLFNBQVMsRUFBQyxNQUFNLHNCQUFzQixDQUFDO0FBQy9DLE9BQU8sRUFBQyxvQkFBb0IsRUFBUyxNQUFNLGNBQWMsQ0FBQztBQVUxRCxvQkFBb0IsRUFBRSxDQUFDLFNBQVMsQ0FBQyxTQUFTLEdBQUcsVUFDaEMsUUFBaUMsRUFDMUMsSUFBMkI7SUFDN0IsSUFBSSxDQUFDLGVBQWUsRUFBRSxDQUFDO0lBQ3ZCLE9BQU8sU0FBUyxDQUFDLElBQUksRUFBRSxRQUFRLEVBQUUsSUFBSSxDQUFDLENBQUM7QUFDekMsQ0FBQyxDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiLyoqXG4gKiBAbGljZW5zZVxuICogQ29weXJpZ2h0IDIwMjAgR29vZ2xlIExMQy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC5cbiAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSBcIkxpY2Vuc2VcIik7XG4gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuXG4gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXRcbiAqXG4gKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjBcbiAqXG4gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlXG4gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiBcIkFTIElTXCIgQkFTSVMsXG4gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC5cbiAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmRcbiAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLlxuICogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbiAqL1xuXG5pbXBvcnQge21pcnJvclBhZH0gZnJvbSAnLi4vLi4vb3BzL21pcnJvcl9wYWQnO1xuaW1wb3J0IHtnZXRHbG9iYWxUZW5zb3JDbGFzcywgVGVuc29yfSBmcm9tICcuLi8uLi90ZW5zb3InO1xuaW1wb3J0IHtSYW5rfSBmcm9tICcuLi8uLi90eXBlcyc7XG5cbmRlY2xhcmUgbW9kdWxlICcuLi8uLi90ZW5zb3InIHtcbiAgaW50ZXJmYWNlIFRlbnNvcjxSIGV4dGVuZHMgUmFuayA9IFJhbms+IHtcbiAgICBtaXJyb3JQYWQ8VCBleHRlbmRzIFRlbnNvcj4oXG4gICAgICAgIHBhZGRpbmdzOiBBcnJheTxbbnVtYmVyLCBudW1iZXJdPiwgbW9kZTogJ3JlZmxlY3QnfCdzeW1tZXRyaWMnKTogVDtcbiAgfVxufVxuXG5nZXRHbG9iYWxUZW5zb3JDbGFzcygpLnByb3RvdHlwZS5taXJyb3JQYWQgPSBmdW5jdGlvbjxUIGV4dGVuZHMgVGVuc29yPihcbiAgICB0aGlzOiBULCBwYWRkaW5nczogQXJyYXk8W251bWJlciwgbnVtYmVyXT4sXG4gICAgbW9kZTogJ3JlZmxlY3QnfCdzeW1tZXRyaWMnKTogVCB7XG4gIHRoaXMudGhyb3dJZkRpc3Bvc2VkKCk7XG4gIHJldHVybiBtaXJyb3JQYWQodGhpcywgcGFkZGluZ3MsIG1vZGUpO1xufTtcbiJdfQ==","/**\n * @license\n * Copyright 2020 Google LLC. All Rights Reserved.\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n * =============================================================================\n */\nimport { mod } from '../../ops/mod';\nimport { getGlobalTensorClass } from '../../tensor';\ngetGlobalTensorClass().prototype.mod = function (b) {\n this.throwIfDisposed();\n return mod(this, b);\n};\n//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibW9kLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vLi4vLi4vdGZqcy1jb3JlL3NyYy9wdWJsaWMvY2hhaW5lZF9vcHMvbW9kLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBOzs7Ozs7Ozs7Ozs7Ozs7R0FlRztBQUNILE9BQU8sRUFBQyxHQUFHLEVBQUMsTUFBTSxlQUFlLENBQUM7QUFDbEMsT0FBTyxFQUFDLG9CQUFvQixFQUFTLE1BQU0sY0FBYyxDQUFDO0FBUzFELG9CQUFvQixFQUFFLENBQUMsU0FBUyxDQUFDLEdBQUcsR0FBRyxVQUNuQyxDQUFvQjtJQUN0QixJQUFJLENBQUMsZUFBZSxFQUFFLENBQUM7SUFDdkIsT0FBTyxHQUFHLENBQUMsSUFBSSxFQUFFLENBQUMsQ0FBQyxDQUFDO0FBQ3RCLENBQUMsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbIi8qKlxuICogQGxpY2Vuc2VcbiAqIENvcHlyaWdodCAyMDIwIEdvb2dsZSBMTEMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuXG4gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgXCJMaWNlbnNlXCIpO1xuICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLlxuICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0XG4gKlxuICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wXG4gKlxuICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZVxuICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gXCJBUyBJU1wiIEJBU0lTLFxuICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuXG4gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kXG4gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS5cbiAqID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4gKi9cbmltcG9ydCB7bW9kfSBmcm9tICcuLi8uLi9vcHMvbW9kJztcbmltcG9ydCB7Z2V0R2xvYmFsVGVuc29yQ2xhc3MsIFRlbnNvcn0gZnJvbSAnLi4vLi4vdGVuc29yJztcbmltcG9ydCB7UmFuaywgVGVuc29yTGlrZX0gZnJvbSAnLi4vLi4vdHlwZXMnO1xuXG5kZWNsYXJlIG1vZHVsZSAnLi4vLi4vdGVuc29yJyB7XG4gIGludGVyZmFjZSBUZW5zb3I8UiBleHRlbmRzIFJhbmsgPSBSYW5rPiB7XG4gICAgbW9kPFQgZXh0ZW5kcyBUZW5zb3I+KGI6IFRlbnNvcnxUZW5zb3JMaWtlKTogVDtcbiAgfVxufVxuXG5nZXRHbG9iYWxUZW5zb3JDbGFzcygpLnByb3RvdHlwZS5tb2QgPSBmdW5jdGlvbjxUIGV4dGVuZHMgVGVuc29yPihcbiAgICBiOiBUZW5zb3J8VGVuc29yTGlrZSk6IFQge1xuICB0aGlzLnRocm93SWZEaXNwb3NlZCgpO1xuICByZXR1cm4gbW9kKHRoaXMsIGIpO1xufTtcbiJdfQ==","/**\n * @license\n * Copyright 2020 Google LLC. All Rights Reserved.\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n * =============================================================================\n */\nimport { mul } from '../../ops/mul';\nimport { getGlobalTensorClass } from '../../tensor';\ngetGlobalTensorClass().prototype.mul = function (b) {\n this.throwIfDisposed();\n return mul(this, b);\n};\n//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibXVsLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vLi4vLi4vdGZqcy1jb3JlL3NyYy9wdWJsaWMvY2hhaW5lZF9vcHMvbXVsLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBOzs7Ozs7Ozs7Ozs7Ozs7R0FlRztBQUNILE9BQU8sRUFBQyxHQUFHLEVBQUMsTUFBTSxlQUFlLENBQUM7QUFDbEMsT0FBTyxFQUFDLG9CQUFvQixFQUFTLE1BQU0sY0FBYyxDQUFDO0FBUzFELG9CQUFvQixFQUFFLENBQUMsU0FBUyxDQUFDLEdBQUcsR0FBRyxVQUNuQyxDQUFvQjtJQUN0QixJQUFJLENBQUMsZUFBZSxFQUFFLENBQUM7SUFDdkIsT0FBTyxHQUFHLENBQUMsSUFBSSxFQUFFLENBQUMsQ0FBQyxDQUFDO0FBQ3RCLENBQUMsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbIi8qKlxuICogQGxpY2Vuc2VcbiAqIENvcHlyaWdodCAyMDIwIEdvb2dsZSBMTEMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuXG4gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgXCJMaWNlbnNlXCIpO1xuICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLlxuICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0XG4gKlxuICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wXG4gKlxuICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZVxuICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gXCJBUyBJU1wiIEJBU0lTLFxuICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuXG4gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kXG4gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS5cbiAqID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4gKi9cbmltcG9ydCB7bXVsfSBmcm9tICcuLi8uLi9vcHMvbXVsJztcbmltcG9ydCB7Z2V0R2xvYmFsVGVuc29yQ2xhc3MsIFRlbnNvcn0gZnJvbSAnLi4vLi4vdGVuc29yJztcbmltcG9ydCB7UmFuaywgVGVuc29yTGlrZX0gZnJvbSAnLi4vLi4vdHlwZXMnO1xuXG5kZWNsYXJlIG1vZHVsZSAnLi4vLi4vdGVuc29yJyB7XG4gIGludGVyZmFjZSBUZW5zb3I8UiBleHRlbmRzIFJhbmsgPSBSYW5rPiB7XG4gICAgbXVsPFQgZXh0ZW5kcyBUZW5zb3I+KGI6IFRlbnNvcnxUZW5zb3JMaWtlKTogVDtcbiAgfVxufVxuXG5nZXRHbG9iYWxUZW5zb3JDbGFzcygpLnByb3RvdHlwZS5tdWwgPSBmdW5jdGlvbjxUIGV4dGVuZHMgVGVuc29yPihcbiAgICBiOiBUZW5zb3J8VGVuc29yTGlrZSk6IFQge1xuICB0aGlzLnRocm93SWZEaXNwb3NlZCgpO1xuICByZXR1cm4gbXVsKHRoaXMsIGIpO1xufTtcbiJdfQ==","/**\n * @license\n * Copyright 2020 Google LLC. All Rights Reserved.\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n * =============================================================================\n */\n// TODO update import path once op is modularized.\nimport { neg } from '../../ops/ops';\nimport { getGlobalTensorClass } from '../../tensor';\ngetGlobalTensorClass().prototype.neg = function () {\n this.throwIfDisposed();\n return neg(this);\n};\n//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibmVnLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vLi4vLi4vdGZqcy1jb3JlL3NyYy9wdWJsaWMvY2hhaW5lZF9vcHMvbmVnLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBOzs7Ozs7Ozs7Ozs7Ozs7R0FlRztBQUVILGtEQUFrRDtBQUNsRCxPQUFPLEVBQUMsR0FBRyxFQUFDLE1BQU0sZUFBZSxDQUFDO0FBQ2xDLE9BQU8sRUFBQyxvQkFBb0IsRUFBUyxNQUFNLGNBQWMsQ0FBQztBQVMxRCxvQkFBb0IsRUFBRSxDQUFDLFNBQVMsQ0FBQyxHQUFHLEdBQUc7SUFDckMsSUFBSSxDQUFDLGVBQWUsRUFBRSxDQUFDO0lBQ3ZCLE9BQU8sR0FBRyxDQUFDLElBQUksQ0FBQyxDQUFDO0FBQ25CLENBQUMsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbIi8qKlxuICogQGxpY2Vuc2VcbiAqIENvcHlyaWdodCAyMDIwIEdvb2dsZSBMTEMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuXG4gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgXCJMaWNlbnNlXCIpO1xuICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLlxuICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0XG4gKlxuICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wXG4gKlxuICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZVxuICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gXCJBUyBJU1wiIEJBU0lTLFxuICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuXG4gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kXG4gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS5cbiAqID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4gKi9cblxuLy8gVE9ETyB1cGRhdGUgaW1wb3J0IHBhdGggb25jZSBvcCBpcyBtb2R1bGFyaXplZC5cbmltcG9ydCB7bmVnfSBmcm9tICcuLi8uLi9vcHMvb3BzJztcbmltcG9ydCB7Z2V0R2xvYmFsVGVuc29yQ2xhc3MsIFRlbnNvcn0gZnJvbSAnLi4vLi4vdGVuc29yJztcbmltcG9ydCB7UmFua30gZnJvbSAnLi4vLi4vdHlwZXMnO1xuXG5kZWNsYXJlIG1vZHVsZSAnLi4vLi4vdGVuc29yJyB7XG4gIGludGVyZmFjZSBUZW5zb3I8UiBleHRlbmRzIFJhbmsgPSBSYW5rPiB7XG4gICAgbmVnPFQgZXh0ZW5kcyBUZW5zb3I+KHRoaXM6IFQpOiBUO1xuICB9XG59XG5cbmdldEdsb2JhbFRlbnNvckNsYXNzKCkucHJvdG90eXBlLm5lZyA9IGZ1bmN0aW9uPFQgZXh0ZW5kcyBUZW5zb3I+KHRoaXM6IFQpOiBUIHtcbiAgdGhpcy50aHJvd0lmRGlzcG9zZWQoKTtcbiAgcmV0dXJuIG5lZyh0aGlzKTtcbn07XG4iXX0=","/**\n * @license\n * Copyright 2020 Google LLC. All Rights Reserved.\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n * =============================================================================\n */\n// TODO update import path once op is modularized.\nimport { norm } from '../../ops/ops';\nimport { getGlobalTensorClass } from '../../tensor';\ngetGlobalTensorClass().prototype.norm = function (ord, axis, keepDims) {\n this.throwIfDisposed();\n return norm(this, ord, axis, keepDims);\n};\n//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibm9ybS5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uLy4uLy4uL3RmanMtY29yZS9zcmMvcHVibGljL2NoYWluZWRfb3BzL25vcm0udHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUE7Ozs7Ozs7Ozs7Ozs7OztHQWVHO0FBRUgsa0RBQWtEO0FBQ2xELE9BQU8sRUFBQyxJQUFJLEVBQUMsTUFBTSxlQUFlLENBQUM7QUFDbkMsT0FBTyxFQUFDLG9CQUFvQixFQUFTLE1BQU0sY0FBYyxDQUFDO0FBVzFELG9CQUFvQixFQUFFLENBQUMsU0FBUyxDQUFDLElBQUksR0FBRyxVQUNwQyxHQUE4QixFQUFFLElBQXNCLEVBQ3RELFFBQWtCO0lBQ3BCLElBQUksQ0FBQyxlQUFlLEVBQUUsQ0FBQztJQUN2QixPQUFPLElBQUksQ0FBQyxJQUFJLEVBQUUsR0FBRyxFQUFFLElBQUksRUFBRSxRQUFRLENBQU0sQ0FBQztBQUM5QyxDQUFDLENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyIvKipcbiAqIEBsaWNlbnNlXG4gKiBDb3B5cmlnaHQgMjAyMCBHb29nbGUgTExDLiBBbGwgUmlnaHRzIFJlc2VydmVkLlxuICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlIFwiTGljZW5zZVwiKTtcbiAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS5cbiAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdFxuICpcbiAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMFxuICpcbiAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmVcbiAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuIFwiQVMgSVNcIiBCQVNJUyxcbiAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLlxuICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZFxuICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuXG4gKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuICovXG5cbi8vIFRPRE8gdXBkYXRlIGltcG9ydCBwYXRoIG9uY2Ugb3AgaXMgbW9kdWxhcml6ZWQuXG5pbXBvcnQge25vcm19IGZyb20gJy4uLy4uL29wcy9vcHMnO1xuaW1wb3J0IHtnZXRHbG9iYWxUZW5zb3JDbGFzcywgVGVuc29yfSBmcm9tICcuLi8uLi90ZW5zb3InO1xuaW1wb3J0IHtSYW5rfSBmcm9tICcuLi8uLi90eXBlcyc7XG5cbmRlY2xhcmUgbW9kdWxlICcuLi8uLi90ZW5zb3InIHtcbiAgaW50ZXJmYWNlIFRlbnNvcjxSIGV4dGVuZHMgUmFuayA9IFJhbms+IHtcbiAgICBub3JtPFQgZXh0ZW5kcyBUZW5zb3I+KFxuICAgICAgICBvcmQ/OiBudW1iZXJ8J2V1Y2xpZGVhbid8J2ZybycsIGF4aXM/OiBudW1iZXJ8bnVtYmVyW10sXG4gICAgICAgIGtlZXBEaW1zPzogYm9vbGVhbik6IFRlbnNvcjtcbiAgfVxufVxuXG5nZXRHbG9iYWxUZW5zb3JDbGFzcygpLnByb3RvdHlwZS5ub3JtID0gZnVuY3Rpb248VCBleHRlbmRzIFRlbnNvcj4oXG4gICAgb3JkPzogbnVtYmVyfCdldWNsaWRlYW4nfCdmcm8nLCBheGlzPzogbnVtYmVyfG51bWJlcltdLFxuICAgIGtlZXBEaW1zPzogYm9vbGVhbikge1xuICB0aGlzLnRocm93SWZEaXNwb3NlZCgpO1xuICByZXR1cm4gbm9ybSh0aGlzLCBvcmQsIGF4aXMsIGtlZXBEaW1zKSBhcyBUO1xufTtcbiJdfQ==","/**\n * @license\n * Copyright 2020 Google LLC. All Rights Reserved.\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n * =============================================================================\n */\nimport { notEqual } from '../../ops/not_equal';\nimport { getGlobalTensorClass } from '../../tensor';\ngetGlobalTensorClass().prototype.notEqual = function (b) {\n this.throwIfDisposed();\n return notEqual(this, b);\n};\n//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibm90X2VxdWFsLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vLi4vLi4vdGZqcy1jb3JlL3NyYy9wdWJsaWMvY2hhaW5lZF9vcHMvbm90X2VxdWFsLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBOzs7Ozs7Ozs7Ozs7Ozs7R0FlRztBQUNILE9BQU8sRUFBQyxRQUFRLEVBQUMsTUFBTSxxQkFBcUIsQ0FBQztBQUM3QyxPQUFPLEVBQUMsb0JBQW9CLEVBQVMsTUFBTSxjQUFjLENBQUM7QUFTMUQsb0JBQW9CLEVBQUUsQ0FBQyxTQUFTLENBQUMsUUFBUSxHQUFHLFVBQ3hDLENBQW9CO0lBQ3RCLElBQUksQ0FBQyxlQUFlLEVBQUUsQ0FBQztJQUN2QixPQUFPLFFBQVEsQ0FBQyxJQUFJLEVBQUUsQ0FBQyxDQUFDLENBQUM7QUFDM0IsQ0FBQyxDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiLyoqXG4gKiBAbGljZW5zZVxuICogQ29weXJpZ2h0IDIwMjAgR29vZ2xlIExMQy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC5cbiAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSBcIkxpY2Vuc2VcIik7XG4gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuXG4gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXRcbiAqXG4gKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjBcbiAqXG4gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlXG4gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiBcIkFTIElTXCIgQkFTSVMsXG4gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC5cbiAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmRcbiAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLlxuICogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbiAqL1xuaW1wb3J0IHtub3RFcXVhbH0gZnJvbSAnLi4vLi4vb3BzL25vdF9lcXVhbCc7XG5pbXBvcnQge2dldEdsb2JhbFRlbnNvckNsYXNzLCBUZW5zb3J9IGZyb20gJy4uLy4uL3RlbnNvcic7XG5pbXBvcnQge1JhbmssIFRlbnNvckxpa2V9IGZyb20gJy4uLy4uL3R5cGVzJztcblxuZGVjbGFyZSBtb2R1bGUgJy4uLy4uL3RlbnNvcicge1xuICBpbnRlcmZhY2UgVGVuc29yPFIgZXh0ZW5kcyBSYW5rID0gUmFuaz4ge1xuICAgIG5vdEVxdWFsPFQgZXh0ZW5kcyBUZW5zb3I+KGI6IFRlbnNvcnxUZW5zb3JMaWtlKTogVDtcbiAgfVxufVxuXG5nZXRHbG9iYWxUZW5zb3JDbGFzcygpLnByb3RvdHlwZS5ub3RFcXVhbCA9IGZ1bmN0aW9uPFQgZXh0ZW5kcyBUZW5zb3I+KFxuICAgIGI6IFRlbnNvcnxUZW5zb3JMaWtlKTogVCB7XG4gIHRoaXMudGhyb3dJZkRpc3Bvc2VkKCk7XG4gIHJldHVybiBub3RFcXVhbCh0aGlzLCBiKTtcbn07XG4iXX0=","/**\n * @license\n * Copyright 2020 Google LLC. All Rights Reserved.\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n * =============================================================================\n */\nimport { oneHot } from '../../ops/one_hot';\nimport { getGlobalTensorClass } from '../../tensor';\ngetGlobalTensorClass().prototype.oneHot = function (depth, onValue = 1, offValue = 0) {\n this.throwIfDisposed();\n return oneHot(this, depth, onValue, offValue);\n};\n//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoib25lX2hvdC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uLy4uLy4uL3RmanMtY29yZS9zcmMvcHVibGljL2NoYWluZWRfb3BzL29uZV9ob3QudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUE7Ozs7Ozs7Ozs7Ozs7OztHQWVHO0FBRUgsT0FBTyxFQUFDLE1BQU0sRUFBQyxNQUFNLG1CQUFtQixDQUFDO0FBQ3pDLE9BQU8sRUFBQyxvQkFBb0IsRUFBUyxNQUFNLGNBQWMsQ0FBQztBQVMxRCxvQkFBb0IsRUFBRSxDQUFDLFNBQVMsQ0FBQyxNQUFNLEdBQUcsVUFDdEMsS0FBYSxFQUFFLE9BQU8sR0FBRyxDQUFDLEVBQUUsUUFBUSxHQUFHLENBQUM7SUFDMUMsSUFBSSxDQUFDLGVBQWUsRUFBRSxDQUFDO0lBQ3ZCLE9BQU8sTUFBTSxDQUFDLElBQUksRUFBRSxLQUFLLEVBQUUsT0FBTyxFQUFFLFFBQVEsQ0FBQyxDQUFDO0FBQ2hELENBQUMsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbIi8qKlxuICogQGxpY2Vuc2VcbiAqIENvcHlyaWdodCAyMDIwIEdvb2dsZSBMTEMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuXG4gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgXCJMaWNlbnNlXCIpO1xuICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLlxuICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0XG4gKlxuICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wXG4gKlxuICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZVxuICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gXCJBUyBJU1wiIEJBU0lTLFxuICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuXG4gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kXG4gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS5cbiAqID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4gKi9cblxuaW1wb3J0IHtvbmVIb3R9IGZyb20gJy4uLy4uL29wcy9vbmVfaG90JztcbmltcG9ydCB7Z2V0R2xvYmFsVGVuc29yQ2xhc3MsIFRlbnNvcn0gZnJvbSAnLi4vLi4vdGVuc29yJztcbmltcG9ydCB7UmFua30gZnJvbSAnLi4vLi4vdHlwZXMnO1xuXG5kZWNsYXJlIG1vZHVsZSAnLi4vLi4vdGVuc29yJyB7XG4gIGludGVyZmFjZSBUZW5zb3I8UiBleHRlbmRzIFJhbmsgPSBSYW5rPiB7XG4gICAgb25lSG90KGRlcHRoOiBudW1iZXIsIG9uVmFsdWU6IG51bWJlciwgb2ZmVmFsdWU6IG51bWJlcik6IFRlbnNvcjtcbiAgfVxufVxuXG5nZXRHbG9iYWxUZW5zb3JDbGFzcygpLnByb3RvdHlwZS5vbmVIb3QgPSBmdW5jdGlvbihcbiAgICBkZXB0aDogbnVtYmVyLCBvblZhbHVlID0gMSwgb2ZmVmFsdWUgPSAwKTogVGVuc29yIHtcbiAgdGhpcy50aHJvd0lmRGlzcG9zZWQoKTtcbiAgcmV0dXJuIG9uZUhvdCh0aGlzLCBkZXB0aCwgb25WYWx1ZSwgb2ZmVmFsdWUpO1xufTtcbiJdfQ==","/**\n * @license\n * Copyright 2020 Google LLC. All Rights Reserved.\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n * =============================================================================\n */\n// TODO update import path once op is modularized.\nimport { onesLike } from '../../ops/ops';\nimport { getGlobalTensorClass } from '../../tensor';\ngetGlobalTensorClass().prototype.onesLike = function () {\n this.throwIfDisposed();\n return onesLike(this);\n};\n//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoib25lc19saWtlLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vLi4vLi4vdGZqcy1jb3JlL3NyYy9wdWJsaWMvY2hhaW5lZF9vcHMvb25lc19saWtlLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBOzs7Ozs7Ozs7Ozs7Ozs7R0FlRztBQUVILGtEQUFrRDtBQUNsRCxPQUFPLEVBQUMsUUFBUSxFQUFDLE1BQU0sZUFBZSxDQUFDO0FBQ3ZDLE9BQU8sRUFBQyxvQkFBb0IsRUFBUyxNQUFNLGNBQWMsQ0FBQztBQVMxRCxvQkFBb0IsRUFBRSxDQUFDLFNBQVMsQ0FBQyxRQUFRLEdBQUc7SUFFMUMsSUFBSSxDQUFDLGVBQWUsRUFBRSxDQUFDO0lBQ3ZCLE9BQU8sUUFBUSxDQUFDLElBQUksQ0FBQyxDQUFDO0FBQ3hCLENBQUMsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbIi8qKlxuICogQGxpY2Vuc2VcbiAqIENvcHlyaWdodCAyMDIwIEdvb2dsZSBMTEMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuXG4gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgXCJMaWNlbnNlXCIpO1xuICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLlxuICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0XG4gKlxuICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wXG4gKlxuICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZVxuICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gXCJBUyBJU1wiIEJBU0lTLFxuICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuXG4gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kXG4gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS5cbiAqID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4gKi9cblxuLy8gVE9ETyB1cGRhdGUgaW1wb3J0IHBhdGggb25jZSBvcCBpcyBtb2R1bGFyaXplZC5cbmltcG9ydCB7b25lc0xpa2V9IGZyb20gJy4uLy4uL29wcy9vcHMnO1xuaW1wb3J0IHtnZXRHbG9iYWxUZW5zb3JDbGFzcywgVGVuc29yfSBmcm9tICcuLi8uLi90ZW5zb3InO1xuaW1wb3J0IHtSYW5rfSBmcm9tICcuLi8uLi90eXBlcyc7XG5cbmRlY2xhcmUgbW9kdWxlICcuLi8uLi90ZW5zb3InIHtcbiAgaW50ZXJmYWNlIFRlbnNvcjxSIGV4dGVuZHMgUmFuayA9IFJhbms+IHtcbiAgICBvbmVzTGlrZTxUIGV4dGVuZHMgVGVuc29yPih0aGlzOiBUKTogVDtcbiAgfVxufVxuXG5nZXRHbG9iYWxUZW5zb3JDbGFzcygpLnByb3RvdHlwZS5vbmVzTGlrZSA9IGZ1bmN0aW9uPFQgZXh0ZW5kcyBUZW5zb3I+KHRoaXM6IFQpOlxuICAgIFQge1xuICB0aGlzLnRocm93SWZEaXNwb3NlZCgpO1xuICByZXR1cm4gb25lc0xpa2UodGhpcyk7XG59O1xuIl19","/**\n * @license\n * Copyright 2020 Google LLC. All Rights Reserved.\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n * =============================================================================\n */\nimport { pad } from '../../ops/pad';\nimport { getGlobalTensorClass } from '../../tensor';\ngetGlobalTensorClass().prototype.pad = function (paddings, constantValue) {\n this.throwIfDisposed();\n return pad(this, paddings, constantValue);\n};\n//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicGFkLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vLi4vLi4vdGZqcy1jb3JlL3NyYy9wdWJsaWMvY2hhaW5lZF9vcHMvcGFkLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBOzs7Ozs7Ozs7Ozs7Ozs7R0FlRztBQUVILE9BQU8sRUFBQyxHQUFHLEVBQUMsTUFBTSxlQUFlLENBQUM7QUFDbEMsT0FBTyxFQUFDLG9CQUFvQixFQUFTLE1BQU0sY0FBYyxDQUFDO0FBVTFELG9CQUFvQixFQUFFLENBQUMsU0FBUyxDQUFDLEdBQUcsR0FBRyxVQUMxQixRQUFpQyxFQUFFLGFBQXFCO0lBQ25FLElBQUksQ0FBQyxlQUFlLEVBQUUsQ0FBQztJQUN2QixPQUFPLEdBQUcsQ0FBQyxJQUFJLEVBQUUsUUFBUSxFQUFFLGFBQWEsQ0FBQyxDQUFDO0FBQzVDLENBQUMsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbIi8qKlxuICogQGxpY2Vuc2VcbiAqIENvcHlyaWdodCAyMDIwIEdvb2dsZSBMTEMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuXG4gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgXCJMaWNlbnNlXCIpO1xuICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLlxuICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0XG4gKlxuICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wXG4gKlxuICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZVxuICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gXCJBUyBJU1wiIEJBU0lTLFxuICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuXG4gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kXG4gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS5cbiAqID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4gKi9cblxuaW1wb3J0IHtwYWR9IGZyb20gJy4uLy4uL29wcy9wYWQnO1xuaW1wb3J0IHtnZXRHbG9iYWxUZW5zb3JDbGFzcywgVGVuc29yfSBmcm9tICcuLi8uLi90ZW5zb3InO1xuaW1wb3J0IHtSYW5rfSBmcm9tICcuLi8uLi90eXBlcyc7XG5cbmRlY2xhcmUgbW9kdWxlICcuLi8uLi90ZW5zb3InIHtcbiAgaW50ZXJmYWNlIFRlbnNvcjxSIGV4dGVuZHMgUmFuayA9IFJhbms+IHtcbiAgICBwYWQ8VCBleHRlbmRzIFRlbnNvcj4oXG4gICAgICAgIHBhZGRpbmdzOiBBcnJheTxbbnVtYmVyLCBudW1iZXJdPiwgY29uc3RhbnRWYWx1ZT86IG51bWJlcik6IFQ7XG4gIH1cbn1cblxuZ2V0R2xvYmFsVGVuc29yQ2xhc3MoKS5wcm90b3R5cGUucGFkID0gZnVuY3Rpb248VCBleHRlbmRzIFRlbnNvcj4oXG4gICAgdGhpczogVCwgcGFkZGluZ3M6IEFycmF5PFtudW1iZXIsIG51bWJlcl0+LCBjb25zdGFudFZhbHVlOiBudW1iZXIpOiBUIHtcbiAgdGhpcy50aHJvd0lmRGlzcG9zZWQoKTtcbiAgcmV0dXJuIHBhZCh0aGlzLCBwYWRkaW5ncywgY29uc3RhbnRWYWx1ZSk7XG59O1xuIl19","import { pool } from '../../ops/pool';\nimport { getGlobalTensorClass } from '../../tensor';\ngetGlobalTensorClass().prototype.pool = function (windowShape, poolingType, padding, dilationRate, strides, dimRoundingMode) {\n this.throwIfDisposed();\n return pool(this, windowShape, poolingType, padding, dilationRate, strides, dimRoundingMode);\n};\n//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicG9vbC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uLy4uLy4uL3RmanMtY29yZS9zcmMvcHVibGljL2NoYWluZWRfb3BzL3Bvb2wudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBaUJBLE9BQU8sRUFBQyxJQUFJLEVBQUMsTUFBTSxnQkFBZ0IsQ0FBQztBQUNwQyxPQUFPLEVBQUMsb0JBQW9CLEVBQXFCLE1BQU0sY0FBYyxDQUFDO0FBY3RFLG9CQUFvQixFQUFFLENBQUMsU0FBUyxDQUFDLElBQUksR0FBRyxVQUMzQixXQUFvQyxFQUFFLFdBQXdCLEVBQ3ZFLE9BQThDLEVBQzlDLFlBQXNDLEVBQ3RDLE9BQWlDLEVBQ2pDLGVBQXdDO0lBQzFDLElBQUksQ0FBQyxlQUFlLEVBQUUsQ0FBQztJQUN2QixPQUFPLElBQUksQ0FBQyxJQUFJLEVBQUUsV0FBVyxFQUFFLFdBQVcsRUFBRSxPQUFPLEVBQUUsWUFBWSxFQUFFLE9BQU8sRUFDOUQsZUFBZSxDQUFDLENBQUM7QUFDL0IsQ0FBQyxDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiLyoqXG4gKiBAbGljZW5zZVxuICogQ29weXJpZ2h0IDIwMjAgR29vZ2xlIExMQy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC5cbiAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSBcIkxpY2Vuc2VcIik7XG4gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuXG4gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXRcbiAqXG4gKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjBcbiAqXG4gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlXG4gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiBcIkFTIElTXCIgQkFTSVMsXG4gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC5cbiAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmRcbiAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLlxuICogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbiAqL1xuaW1wb3J0IHtFeHBsaWNpdFBhZGRpbmd9IGZyb20gJy4uLy4uL29wcy9jb252X3V0aWwnO1xuaW1wb3J0IHtwb29sfSBmcm9tICcuLi8uLi9vcHMvcG9vbCc7XG5pbXBvcnQge2dldEdsb2JhbFRlbnNvckNsYXNzLCBUZW5zb3IzRCwgVGVuc29yNER9IGZyb20gJy4uLy4uL3RlbnNvcic7XG5pbXBvcnQge1Jhbmt9IGZyb20gJy4uLy4uL3R5cGVzJztcblxuZGVjbGFyZSBtb2R1bGUgJy4uLy4uL3RlbnNvcicge1xuICBpbnRlcmZhY2UgVGVuc29yPFIgZXh0ZW5kcyBSYW5rID0gUmFuaz4ge1xuICAgIHBvb2w8VCBleHRlbmRzIFRlbnNvcjNEfFRlbnNvcjREPihcbiAgICAgICAgd2luZG93U2hhcGU6IFtudW1iZXIsIG51bWJlcl18bnVtYmVyLCBwb29saW5nVHlwZTogJ2F2Zyd8J21heCcsXG4gICAgICAgIHBhZGRpbmc6ICd2YWxpZCd8J3NhbWUnfG51bWJlcnxFeHBsaWNpdFBhZGRpbmcsXG4gICAgICAgIGRpYXRpb25SYXRlPzogW251bWJlciwgbnVtYmVyXXxudW1iZXIsXG4gICAgICAgIHN0cmlkZXM/OiBbbnVtYmVyLCBudW1iZXJdfG51bWJlcixcbiAgICAgICAgZGltUm91bmRpbmdNb2RlPzogJ2Zsb29yJ3wncm91bmQnfCdjZWlsJyk6IFQ7XG4gIH1cbn1cblxuZ2V0R2xvYmFsVGVuc29yQ2xhc3MoKS5wcm90b3R5cGUucG9vbCA9IGZ1bmN0aW9uPFQgZXh0ZW5kcyBUZW5zb3IzRHxUZW5zb3I0RD4oXG4gICAgdGhpczogVCwgd2luZG93U2hhcGU6IFtudW1iZXIsIG51bWJlcl18bnVtYmVyLCBwb29saW5nVHlwZTogJ21heCd8J2F2ZycsXG4gICAgcGFkZGluZzogJ3ZhbGlkJ3wnc2FtZSd8bnVtYmVyfEV4cGxpY2l0UGFkZGluZyxcbiAgICBkaWxhdGlvblJhdGU/OiBbbnVtYmVyLCBudW1iZXJdfG51bWJlcixcbiAgICBzdHJpZGVzPzogW251bWJlciwgbnVtYmVyXXxudW1iZXIsXG4gICAgZGltUm91bmRpbmdNb2RlPzogJ2Zsb29yJ3wncm91bmQnfCdjZWlsJyk6IFQge1xuICB0aGlzLnRocm93SWZEaXNwb3NlZCgpO1xuICByZXR1cm4gcG9vbCh0aGlzLCB3aW5kb3dTaGFwZSwgcG9vbGluZ1R5cGUsIHBhZGRpbmcsIGRpbGF0aW9uUmF0ZSwgc3RyaWRlcyxcbiAgICAgICAgICAgICAgZGltUm91bmRpbmdNb2RlKTtcbn07XG4iXX0=","/**\n * @license\n * Copyright 2020 Google LLC. All Rights Reserved.\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n * =============================================================================\n */\nimport { pow } from '../../ops/pow';\nimport { getGlobalTensorClass } from '../../tensor';\ngetGlobalTensorClass().prototype.pow = function (exp) {\n this.throwIfDisposed();\n return pow(this, exp);\n};\n//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicG93LmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vLi4vLi4vdGZqcy1jb3JlL3NyYy9wdWJsaWMvY2hhaW5lZF9vcHMvcG93LnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBOzs7Ozs7Ozs7Ozs7Ozs7R0FlRztBQUNILE9BQU8sRUFBQyxHQUFHLEVBQUMsTUFBTSxlQUFlLENBQUM7QUFDbEMsT0FBTyxFQUFDLG9CQUFvQixFQUFTLE1BQU0sY0FBYyxDQUFDO0FBUzFELG9CQUFvQixFQUFFLENBQUMsU0FBUyxDQUFDLEdBQUcsR0FBRyxVQUNuQyxHQUFzQjtJQUN4QixJQUFJLENBQUMsZUFBZSxFQUFFLENBQUM7SUFDdkIsT0FBTyxHQUFHLENBQUMsSUFBSSxFQUFFLEdBQUcsQ0FBQyxDQUFDO0FBQ3hCLENBQUMsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbIi8qKlxuICogQGxpY2Vuc2VcbiAqIENvcHlyaWdodCAyMDIwIEdvb2dsZSBMTEMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuXG4gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgXCJMaWNlbnNlXCIpO1xuICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLlxuICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0XG4gKlxuICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wXG4gKlxuICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZVxuICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gXCJBUyBJU1wiIEJBU0lTLFxuICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuXG4gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kXG4gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS5cbiAqID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4gKi9cbmltcG9ydCB7cG93fSBmcm9tICcuLi8uLi9vcHMvcG93JztcbmltcG9ydCB7Z2V0R2xvYmFsVGVuc29yQ2xhc3MsIFRlbnNvcn0gZnJvbSAnLi4vLi4vdGVuc29yJztcbmltcG9ydCB7UmFuaywgVGVuc29yTGlrZX0gZnJvbSAnLi4vLi4vdHlwZXMnO1xuXG5kZWNsYXJlIG1vZHVsZSAnLi4vLi4vdGVuc29yJyB7XG4gIGludGVyZmFjZSBUZW5zb3I8UiBleHRlbmRzIFJhbmsgPSBSYW5rPiB7XG4gICAgcG93PFQgZXh0ZW5kcyBUZW5zb3I+KGV4cDogVGVuc29yfFRlbnNvckxpa2UpOiBUO1xuICB9XG59XG5cbmdldEdsb2JhbFRlbnNvckNsYXNzKCkucHJvdG90eXBlLnBvdyA9IGZ1bmN0aW9uPFQgZXh0ZW5kcyBUZW5zb3I+KFxuICAgIGV4cDogVGVuc29yfFRlbnNvckxpa2UpOiBUIHtcbiAgdGhpcy50aHJvd0lmRGlzcG9zZWQoKTtcbiAgcmV0dXJuIHBvdyh0aGlzLCBleHApO1xufTtcbiJdfQ==","/**\n * @license\n * Copyright 2020 Google LLC. All Rights Reserved.\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n * =============================================================================\n */\nimport { prelu } from '../../ops/prelu';\nimport { getGlobalTensorClass } from '../../tensor';\ngetGlobalTensorClass().prototype.prelu = function (alpha) {\n this.throwIfDisposed();\n return prelu(this, alpha);\n};\n//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicHJlbHUuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi8uLi8uLi90ZmpzLWNvcmUvc3JjL3B1YmxpYy9jaGFpbmVkX29wcy9wcmVsdS50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQTs7Ozs7Ozs7Ozs7Ozs7O0dBZUc7QUFDSCxPQUFPLEVBQUMsS0FBSyxFQUFDLE1BQU0saUJBQWlCLENBQUM7QUFDdEMsT0FBTyxFQUFDLG9CQUFvQixFQUFTLE1BQU0sY0FBYyxDQUFDO0FBUzFELG9CQUFvQixFQUFFLENBQUMsU0FBUyxDQUFDLEtBQUssR0FBRyxVQUM1QixLQUFtQjtJQUM5QixJQUFJLENBQUMsZUFBZSxFQUFFLENBQUM7SUFDdkIsT0FBTyxLQUFLLENBQUMsSUFBSSxFQUFFLEtBQUssQ0FBQyxDQUFDO0FBQzVCLENBQUMsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbIi8qKlxuICogQGxpY2Vuc2VcbiAqIENvcHlyaWdodCAyMDIwIEdvb2dsZSBMTEMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuXG4gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgXCJMaWNlbnNlXCIpO1xuICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLlxuICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0XG4gKlxuICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wXG4gKlxuICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZVxuICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gXCJBUyBJU1wiIEJBU0lTLFxuICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuXG4gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kXG4gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS5cbiAqID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4gKi9cbmltcG9ydCB7cHJlbHV9IGZyb20gJy4uLy4uL29wcy9wcmVsdSc7XG5pbXBvcnQge2dldEdsb2JhbFRlbnNvckNsYXNzLCBUZW5zb3J9IGZyb20gJy4uLy4uL3RlbnNvcic7XG5pbXBvcnQge1JhbmssIFRlbnNvckxpa2V9IGZyb20gJy4uLy4uL3R5cGVzJztcblxuZGVjbGFyZSBtb2R1bGUgJy4uLy4uL3RlbnNvcicge1xuICBpbnRlcmZhY2UgVGVuc29yPFIgZXh0ZW5kcyBSYW5rID0gUmFuaz4ge1xuICAgIHByZWx1PFQgZXh0ZW5kcyBUZW5zb3I+KGFscGhhOiBUfFRlbnNvckxpa2UpOiBUO1xuICB9XG59XG5cbmdldEdsb2JhbFRlbnNvckNsYXNzKCkucHJvdG90eXBlLnByZWx1ID0gZnVuY3Rpb248VCBleHRlbmRzIFRlbnNvcj4oXG4gICAgdGhpczogVCwgYWxwaGE6IFR8VGVuc29yTGlrZSk6IFQge1xuICB0aGlzLnRocm93SWZEaXNwb3NlZCgpO1xuICByZXR1cm4gcHJlbHUodGhpcywgYWxwaGEpO1xufTtcbiJdfQ==","/**\n * @license\n * Copyright 2020 Google LLC. All Rights Reserved.\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n * =============================================================================\n */\nimport { prod } from '../../ops/prod';\nimport { getGlobalTensorClass } from '../../tensor';\ngetGlobalTensorClass().prototype.prod = function (axis, keepDims) {\n this.throwIfDisposed();\n return prod(this, axis, keepDims);\n};\n//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicHJvZC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uLy4uLy4uL3RmanMtY29yZS9zcmMvcHVibGljL2NoYWluZWRfb3BzL3Byb2QudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUE7Ozs7Ozs7Ozs7Ozs7OztHQWVHO0FBQ0gsT0FBTyxFQUFDLElBQUksRUFBQyxNQUFNLGdCQUFnQixDQUFDO0FBQ3BDLE9BQU8sRUFBQyxvQkFBb0IsRUFBUyxNQUFNLGNBQWMsQ0FBQztBQVUxRCxvQkFBb0IsRUFBRSxDQUFDLFNBQVMsQ0FBQyxJQUFJLEdBQUcsVUFDM0IsSUFBc0IsRUFBRSxRQUFrQjtJQUNyRCxJQUFJLENBQUMsZUFBZSxFQUFFLENBQUM7SUFDdkIsT0FBTyxJQUFJLENBQUMsSUFBSSxFQUFFLElBQUksRUFBRSxRQUFRLENBQUMsQ0FBQztBQUNwQyxDQUFDLENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyIvKipcbiAqIEBsaWNlbnNlXG4gKiBDb3B5cmlnaHQgMjAyMCBHb29nbGUgTExDLiBBbGwgUmlnaHRzIFJlc2VydmVkLlxuICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlIFwiTGljZW5zZVwiKTtcbiAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS5cbiAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdFxuICpcbiAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMFxuICpcbiAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmVcbiAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuIFwiQVMgSVNcIiBCQVNJUyxcbiAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLlxuICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZFxuICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuXG4gKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuICovXG5pbXBvcnQge3Byb2R9IGZyb20gJy4uLy4uL29wcy9wcm9kJztcbmltcG9ydCB7Z2V0R2xvYmFsVGVuc29yQ2xhc3MsIFRlbnNvcn0gZnJvbSAnLi4vLi4vdGVuc29yJztcbmltcG9ydCB7UmFua30gZnJvbSAnLi4vLi4vdHlwZXMnO1xuXG5kZWNsYXJlIG1vZHVsZSAnLi4vLi4vdGVuc29yJyB7XG4gIGludGVyZmFjZSBUZW5zb3I8UiBleHRlbmRzIFJhbmsgPSBSYW5rPiB7XG4gICAgcHJvZDxUIGV4dGVuZHMgVGVuc29yPih0aGlzOiBULCBheGlzPzogbnVtYmVyfG51bWJlcltdLCBrZWVwRGltcz86IGJvb2xlYW4pOlxuICAgICAgICBUO1xuICB9XG59XG5cbmdldEdsb2JhbFRlbnNvckNsYXNzKCkucHJvdG90eXBlLnByb2QgPSBmdW5jdGlvbjxUIGV4dGVuZHMgVGVuc29yPihcbiAgICB0aGlzOiBULCBheGlzPzogbnVtYmVyfG51bWJlcltdLCBrZWVwRGltcz86IGJvb2xlYW4pOiBUIHtcbiAgdGhpcy50aHJvd0lmRGlzcG9zZWQoKTtcbiAgcmV0dXJuIHByb2QodGhpcywgYXhpcywga2VlcERpbXMpO1xufTtcbiJdfQ==","/**\n * @license\n * Copyright 2020 Google LLC. All Rights Reserved.\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n * =============================================================================\n */\n// TODO update import path once op is modularized.\nimport { reciprocal } from '../../ops/ops';\nimport { getGlobalTensorClass } from '../../tensor';\ngetGlobalTensorClass().prototype.reciprocal = function () {\n this.throwIfDisposed();\n return reciprocal(this);\n};\n//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicmVjaXByb2NhbC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uLy4uLy4uL3RmanMtY29yZS9zcmMvcHVibGljL2NoYWluZWRfb3BzL3JlY2lwcm9jYWwudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUE7Ozs7Ozs7Ozs7Ozs7OztHQWVHO0FBRUgsa0RBQWtEO0FBQ2xELE9BQU8sRUFBQyxVQUFVLEVBQUMsTUFBTSxlQUFlLENBQUM7QUFDekMsT0FBTyxFQUFDLG9CQUFvQixFQUFTLE1BQU0sY0FBYyxDQUFDO0FBUzFELG9CQUFvQixFQUFFLENBQUMsU0FBUyxDQUFDLFVBQVUsR0FBRztJQUU1QyxJQUFJLENBQUMsZUFBZSxFQUFFLENBQUM7SUFDdkIsT0FBTyxVQUFVLENBQUMsSUFBSSxDQUFDLENBQUM7QUFDMUIsQ0FBQyxDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiLyoqXG4gKiBAbGljZW5zZVxuICogQ29weXJpZ2h0IDIwMjAgR29vZ2xlIExMQy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC5cbiAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSBcIkxpY2Vuc2VcIik7XG4gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuXG4gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXRcbiAqXG4gKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjBcbiAqXG4gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlXG4gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiBcIkFTIElTXCIgQkFTSVMsXG4gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC5cbiAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmRcbiAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLlxuICogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbiAqL1xuXG4vLyBUT0RPIHVwZGF0ZSBpbXBvcnQgcGF0aCBvbmNlIG9wIGlzIG1vZHVsYXJpemVkLlxuaW1wb3J0IHtyZWNpcHJvY2FsfSBmcm9tICcuLi8uLi9vcHMvb3BzJztcbmltcG9ydCB7Z2V0R2xvYmFsVGVuc29yQ2xhc3MsIFRlbnNvcn0gZnJvbSAnLi4vLi4vdGVuc29yJztcbmltcG9ydCB7UmFua30gZnJvbSAnLi4vLi4vdHlwZXMnO1xuXG5kZWNsYXJlIG1vZHVsZSAnLi4vLi4vdGVuc29yJyB7XG4gIGludGVyZmFjZSBUZW5zb3I8UiBleHRlbmRzIFJhbmsgPSBSYW5rPiB7XG4gICAgcmVjaXByb2NhbDxUIGV4dGVuZHMgVGVuc29yPih0aGlzOiBUKTogVDtcbiAgfVxufVxuXG5nZXRHbG9iYWxUZW5zb3JDbGFzcygpLnByb3RvdHlwZS5yZWNpcHJvY2FsID0gZnVuY3Rpb248VCBleHRlbmRzIFRlbnNvcj4oXG4gICAgdGhpczogVCk6IFQge1xuICB0aGlzLnRocm93SWZEaXNwb3NlZCgpO1xuICByZXR1cm4gcmVjaXByb2NhbCh0aGlzKTtcbn07XG4iXX0=","/**\n * @license\n * Copyright 2020 Google LLC. All Rights Reserved.\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n * =============================================================================\n */\nimport { relu } from '../../ops/relu';\nimport { getGlobalTensorClass } from '../../tensor';\ngetGlobalTensorClass().prototype.relu = function () {\n this.throwIfDisposed();\n return relu(this);\n};\n//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicmVsdS5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uLy4uLy4uL3RmanMtY29yZS9zcmMvcHVibGljL2NoYWluZWRfb3BzL3JlbHUudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUE7Ozs7Ozs7Ozs7Ozs7OztHQWVHO0FBQ0gsT0FBTyxFQUFDLElBQUksRUFBQyxNQUFNLGdCQUFnQixDQUFDO0FBQ3BDLE9BQU8sRUFBQyxvQkFBb0IsRUFBUyxNQUFNLGNBQWMsQ0FBQztBQVMxRCxvQkFBb0IsRUFBRSxDQUFDLFNBQVMsQ0FBQyxJQUFJLEdBQUc7SUFDdEMsSUFBSSxDQUFDLGVBQWUsRUFBRSxDQUFDO0lBQ3ZCLE9BQU8sSUFBSSxDQUFDLElBQUksQ0FBQyxDQUFDO0FBQ3BCLENBQUMsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbIi8qKlxuICogQGxpY2Vuc2VcbiAqIENvcHlyaWdodCAyMDIwIEdvb2dsZSBMTEMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuXG4gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgXCJMaWNlbnNlXCIpO1xuICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLlxuICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0XG4gKlxuICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wXG4gKlxuICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZVxuICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gXCJBUyBJU1wiIEJBU0lTLFxuICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuXG4gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kXG4gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS5cbiAqID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4gKi9cbmltcG9ydCB7cmVsdX0gZnJvbSAnLi4vLi4vb3BzL3JlbHUnO1xuaW1wb3J0IHtnZXRHbG9iYWxUZW5zb3JDbGFzcywgVGVuc29yfSBmcm9tICcuLi8uLi90ZW5zb3InO1xuaW1wb3J0IHtSYW5rfSBmcm9tICcuLi8uLi90eXBlcyc7XG5cbmRlY2xhcmUgbW9kdWxlICcuLi8uLi90ZW5zb3InIHtcbiAgaW50ZXJmYWNlIFRlbnNvcjxSIGV4dGVuZHMgUmFuayA9IFJhbms+IHtcbiAgICByZWx1PFQgZXh0ZW5kcyBUZW5zb3I+KCk6IFQ7XG4gIH1cbn1cblxuZ2V0R2xvYmFsVGVuc29yQ2xhc3MoKS5wcm90b3R5cGUucmVsdSA9IGZ1bmN0aW9uPFQgZXh0ZW5kcyBUZW5zb3I+KHRoaXM6IFQpOiBUIHtcbiAgdGhpcy50aHJvd0lmRGlzcG9zZWQoKTtcbiAgcmV0dXJuIHJlbHUodGhpcyk7XG59O1xuIl19","/**\n * @license\n * Copyright 2020 Google LLC. All Rights Reserved.\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n * =============================================================================\n */\nimport { relu6 } from '../../ops/relu6';\nimport { getGlobalTensorClass } from '../../tensor';\ngetGlobalTensorClass().prototype.relu6 = function () {\n this.throwIfDisposed();\n return relu6(this);\n};\n//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicmVsdTYuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi8uLi8uLi90ZmpzLWNvcmUvc3JjL3B1YmxpYy9jaGFpbmVkX29wcy9yZWx1Ni50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQTs7Ozs7Ozs7Ozs7Ozs7O0dBZUc7QUFDSCxPQUFPLEVBQUMsS0FBSyxFQUFDLE1BQU0saUJBQWlCLENBQUM7QUFDdEMsT0FBTyxFQUFDLG9CQUFvQixFQUFTLE1BQU0sY0FBYyxDQUFDO0FBUzFELG9CQUFvQixFQUFFLENBQUMsU0FBUyxDQUFDLEtBQUssR0FBRztJQUV2QyxJQUFJLENBQUMsZUFBZSxFQUFFLENBQUM7SUFDdkIsT0FBTyxLQUFLLENBQUMsSUFBSSxDQUFDLENBQUM7QUFDckIsQ0FBQyxDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiLyoqXG4gKiBAbGljZW5zZVxuICogQ29weXJpZ2h0IDIwMjAgR29vZ2xlIExMQy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC5cbiAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSBcIkxpY2Vuc2VcIik7XG4gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuXG4gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXRcbiAqXG4gKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjBcbiAqXG4gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlXG4gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiBcIkFTIElTXCIgQkFTSVMsXG4gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC5cbiAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmRcbiAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLlxuICogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbiAqL1xuaW1wb3J0IHtyZWx1Nn0gZnJvbSAnLi4vLi4vb3BzL3JlbHU2JztcbmltcG9ydCB7Z2V0R2xvYmFsVGVuc29yQ2xhc3MsIFRlbnNvcn0gZnJvbSAnLi4vLi4vdGVuc29yJztcbmltcG9ydCB7UmFua30gZnJvbSAnLi4vLi4vdHlwZXMnO1xuXG5kZWNsYXJlIG1vZHVsZSAnLi4vLi4vdGVuc29yJyB7XG4gIGludGVyZmFjZSBUZW5zb3I8UiBleHRlbmRzIFJhbmsgPSBSYW5rPiB7XG4gICAgcmVsdTY8VCBleHRlbmRzIFRlbnNvcj4oKTogVDtcbiAgfVxufVxuXG5nZXRHbG9iYWxUZW5zb3JDbGFzcygpLnByb3RvdHlwZS5yZWx1NiA9IGZ1bmN0aW9uPFQgZXh0ZW5kcyBUZW5zb3I+KHRoaXM6IFQpOlxuICAgIFQge1xuICB0aGlzLnRocm93SWZEaXNwb3NlZCgpO1xuICByZXR1cm4gcmVsdTYodGhpcyk7XG59O1xuIl19","/**\n * @license\n * Copyright 2020 Google LLC. All Rights Reserved.\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n * =============================================================================\n */\nimport { reshape } from '../../ops/reshape';\nimport { getGlobalTensorClass } from '../../tensor';\n/**\n * Reshapes the tensor into the shape of the provided tensor.\n *\n * @param x The tensor of required shape.\n *\n * @doc {heading: 'Tensors', subheading: 'Classes'}\n */\ngetGlobalTensorClass().prototype.reshapeAs = function (x) {\n this.throwIfDisposed();\n return reshape(this, x.shape);\n};\n//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicmVzaGFwZV9hcy5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uLy4uLy4uL3RmanMtY29yZS9zcmMvcHVibGljL2NoYWluZWRfb3BzL3Jlc2hhcGVfYXMudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUE7Ozs7Ozs7Ozs7Ozs7OztHQWVHO0FBRUgsT0FBTyxFQUFDLE9BQU8sRUFBQyxNQUFNLG1CQUFtQixDQUFDO0FBQzFDLE9BQU8sRUFBQyxvQkFBb0IsRUFBUyxNQUFNLGNBQWMsQ0FBQztBQVMxRDs7Ozs7O0dBTUc7QUFDSCxvQkFBb0IsRUFBRSxDQUFDLFNBQVMsQ0FBQyxTQUFTLEdBQUcsVUFBMkIsQ0FBSTtJQUUxRSxJQUFJLENBQUMsZUFBZSxFQUFFLENBQUM7SUFDdkIsT0FBTyxPQUFPLENBQUMsSUFBSSxFQUFFLENBQUMsQ0FBQyxLQUFLLENBQU0sQ0FBQztBQUNyQyxDQUFDLENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyIvKipcbiAqIEBsaWNlbnNlXG4gKiBDb3B5cmlnaHQgMjAyMCBHb29nbGUgTExDLiBBbGwgUmlnaHRzIFJlc2VydmVkLlxuICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlIFwiTGljZW5zZVwiKTtcbiAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS5cbiAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdFxuICpcbiAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMFxuICpcbiAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmVcbiAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuIFwiQVMgSVNcIiBCQVNJUyxcbiAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLlxuICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZFxuICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuXG4gKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuICovXG5cbmltcG9ydCB7cmVzaGFwZX0gZnJvbSAnLi4vLi4vb3BzL3Jlc2hhcGUnO1xuaW1wb3J0IHtnZXRHbG9iYWxUZW5zb3JDbGFzcywgVGVuc29yfSBmcm9tICcuLi8uLi90ZW5zb3InO1xuaW1wb3J0IHtSYW5rfSBmcm9tICcuLi8uLi90eXBlcyc7XG5cbmRlY2xhcmUgbW9kdWxlICcuLi8uLi90ZW5zb3InIHtcbiAgaW50ZXJmYWNlIFRlbnNvcjxSIGV4dGVuZHMgUmFuayA9IFJhbms+IHtcbiAgICByZXNoYXBlQXM8VCBleHRlbmRzIFRlbnNvcj4oeDogVCk6IFQ7XG4gIH1cbn1cblxuLyoqXG4gKiBSZXNoYXBlcyB0aGUgdGVuc29yIGludG8gdGhlIHNoYXBlIG9mIHRoZSBwcm92aWRlZCB0ZW5zb3IuXG4gKlxuICogQHBhcmFtIHggVGhlIHRlbnNvciBvZiByZXF1aXJlZCBzaGFwZS5cbiAqXG4gKiBAZG9jIHtoZWFkaW5nOiAnVGVuc29ycycsIHN1YmhlYWRpbmc6ICdDbGFzc2VzJ31cbiAqL1xuZ2V0R2xvYmFsVGVuc29yQ2xhc3MoKS5wcm90b3R5cGUucmVzaGFwZUFzID0gZnVuY3Rpb248VCBleHRlbmRzIFRlbnNvcj4oeDogVCk6XG4gICAgVCB7XG4gIHRoaXMudGhyb3dJZkRpc3Bvc2VkKCk7XG4gIHJldHVybiByZXNoYXBlKHRoaXMsIHguc2hhcGUpIGFzIFQ7XG59O1xuIl19","/**\n * @license\n * Copyright 2020 Google LLC. All Rights Reserved.\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n * =============================================================================\n */\nimport { reshape } from '../../ops/reshape';\nimport { getGlobalTensorClass } from '../../tensor';\ngetGlobalTensorClass().prototype.reshape = function (shape) {\n this.throwIfDisposed();\n return reshape(this, shape);\n};\n//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicmVzaGFwZS5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uLy4uLy4uL3RmanMtY29yZS9zcmMvcHVibGljL2NoYWluZWRfb3BzL3Jlc2hhcGUudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUE7Ozs7Ozs7Ozs7Ozs7OztHQWVHO0FBQ0gsT0FBTyxFQUFDLE9BQU8sRUFBQyxNQUFNLG1CQUFtQixDQUFDO0FBQzFDLE9BQU8sRUFBQyxvQkFBb0IsRUFBUyxNQUFNLGNBQWMsQ0FBQztBQVMxRCxvQkFBb0IsRUFBRSxDQUFDLFNBQVMsQ0FBQyxPQUFPLEdBQUcsVUFDdkMsS0FBZTtJQUNqQixJQUFJLENBQUMsZUFBZSxFQUFFLENBQUM7SUFDdkIsT0FBTyxPQUFPLENBQUMsSUFBSSxFQUFFLEtBQUssQ0FBTSxDQUFDO0FBQ25DLENBQUMsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbIi8qKlxuICogQGxpY2Vuc2VcbiAqIENvcHlyaWdodCAyMDIwIEdvb2dsZSBMTEMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuXG4gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgXCJMaWNlbnNlXCIpO1xuICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLlxuICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0XG4gKlxuICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wXG4gKlxuICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZVxuICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gXCJBUyBJU1wiIEJBU0lTLFxuICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuXG4gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kXG4gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS5cbiAqID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4gKi9cbmltcG9ydCB7cmVzaGFwZX0gZnJvbSAnLi4vLi4vb3BzL3Jlc2hhcGUnO1xuaW1wb3J0IHtnZXRHbG9iYWxUZW5zb3JDbGFzcywgVGVuc29yfSBmcm9tICcuLi8uLi90ZW5zb3InO1xuaW1wb3J0IHtSYW5rfSBmcm9tICcuLi8uLi90eXBlcyc7XG5cbmRlY2xhcmUgbW9kdWxlICcuLi8uLi90ZW5zb3InIHtcbiAgaW50ZXJmYWNlIFRlbnNvcjxSIGV4dGVuZHMgUmFuayA9IFJhbms+IHtcbiAgICByZXNoYXBlPFQgZXh0ZW5kcyBUZW5zb3I+KHNoYXBlOiBudW1iZXJbXSk6IFQ7XG4gIH1cbn1cblxuZ2V0R2xvYmFsVGVuc29yQ2xhc3MoKS5wcm90b3R5cGUucmVzaGFwZSA9IGZ1bmN0aW9uPFQgZXh0ZW5kcyBUZW5zb3I+KFxuICAgIHNoYXBlOiBudW1iZXJbXSk6IFQge1xuICB0aGlzLnRocm93SWZEaXNwb3NlZCgpO1xuICByZXR1cm4gcmVzaGFwZSh0aGlzLCBzaGFwZSkgYXMgVDtcbn07XG4iXX0=","/**\n * @license\n * Copyright 2020 Google LLC. All Rights Reserved.\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n * =============================================================================\n */\nimport { resizeBilinear } from '../../ops/image/resize_bilinear';\nimport { getGlobalTensorClass } from '../../tensor';\ngetGlobalTensorClass().prototype.resizeBilinear =\n function (newShape2D, alignCorners, halfPixelCenters) {\n this.throwIfDisposed();\n return resizeBilinear(this, newShape2D, alignCorners, halfPixelCenters);\n };\n//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicmVzaXplX2JpbGluZWFyLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vLi4vLi4vdGZqcy1jb3JlL3NyYy9wdWJsaWMvY2hhaW5lZF9vcHMvcmVzaXplX2JpbGluZWFyLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBOzs7Ozs7Ozs7Ozs7Ozs7R0FlRztBQUNILE9BQU8sRUFBQyxjQUFjLEVBQUMsTUFBTSxpQ0FBaUMsQ0FBQztBQUMvRCxPQUFPLEVBQUMsb0JBQW9CLEVBQXFCLE1BQU0sY0FBYyxDQUFDO0FBV3RFLG9CQUFvQixFQUFFLENBQUMsU0FBUyxDQUFDLGNBQWM7SUFDM0MsVUFDYSxVQUE0QixFQUFFLFlBQXNCLEVBQzdELGdCQUEwQjtRQUNoQyxJQUFJLENBQUMsZUFBZSxFQUFFLENBQUM7UUFDdkIsT0FBTyxjQUFjLENBQUMsSUFBSSxFQUFFLFVBQVUsRUFBRSxZQUFZLEVBQUUsZ0JBQWdCLENBQUMsQ0FBQztJQUMxRSxDQUFDLENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyIvKipcbiAqIEBsaWNlbnNlXG4gKiBDb3B5cmlnaHQgMjAyMCBHb29nbGUgTExDLiBBbGwgUmlnaHRzIFJlc2VydmVkLlxuICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlIFwiTGljZW5zZVwiKTtcbiAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS5cbiAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdFxuICpcbiAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMFxuICpcbiAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmVcbiAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuIFwiQVMgSVNcIiBCQVNJUyxcbiAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLlxuICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZFxuICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuXG4gKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuICovXG5pbXBvcnQge3Jlc2l6ZUJpbGluZWFyfSBmcm9tICcuLi8uLi9vcHMvaW1hZ2UvcmVzaXplX2JpbGluZWFyJztcbmltcG9ydCB7Z2V0R2xvYmFsVGVuc29yQ2xhc3MsIFRlbnNvcjNELCBUZW5zb3I0RH0gZnJvbSAnLi4vLi4vdGVuc29yJztcbmltcG9ydCB7UmFua30gZnJvbSAnLi4vLi4vdHlwZXMnO1xuXG5kZWNsYXJlIG1vZHVsZSAnLi4vLi4vdGVuc29yJyB7XG4gIGludGVyZmFjZSBUZW5zb3I8UiBleHRlbmRzIFJhbmsgPSBSYW5rPiB7XG4gICAgcmVzaXplQmlsaW5lYXI8VCBleHRlbmRzIFRlbnNvcjNEfFRlbnNvcjREPihcbiAgICAgICAgbmV3U2hhcGUyRDogW251bWJlciwgbnVtYmVyXSwgYWxpZ25Db3JuZXJzPzogYm9vbGVhbixcbiAgICAgICAgaGFsZlBpeGVsQ2VudGVycz86IGJvb2xlYW4pOiBUO1xuICB9XG59XG5cbmdldEdsb2JhbFRlbnNvckNsYXNzKCkucHJvdG90eXBlLnJlc2l6ZUJpbGluZWFyID1cbiAgICBmdW5jdGlvbjxUIGV4dGVuZHMgVGVuc29yM0R8VGVuc29yNEQ+KFxuICAgICAgICB0aGlzOiBULCBuZXdTaGFwZTJEOiBbbnVtYmVyLCBudW1iZXJdLCBhbGlnbkNvcm5lcnM/OiBib29sZWFuLFxuICAgICAgICBoYWxmUGl4ZWxDZW50ZXJzPzogYm9vbGVhbik6IFQge1xuICB0aGlzLnRocm93SWZEaXNwb3NlZCgpO1xuICByZXR1cm4gcmVzaXplQmlsaW5lYXIodGhpcywgbmV3U2hhcGUyRCwgYWxpZ25Db3JuZXJzLCBoYWxmUGl4ZWxDZW50ZXJzKTtcbn07XG4iXX0=","/**\n * @license\n * Copyright 2020 Google LLC. All Rights Reserved.\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n * =============================================================================\n */\nimport { resizeNearestNeighbor } from '../../ops/image/resize_nearest_neighbor';\nimport { getGlobalTensorClass } from '../../tensor';\ngetGlobalTensorClass().prototype.resizeNearestNeighbor =\n function (newShape2D, alignCorners, halfFloatCenters) {\n this.throwIfDisposed();\n return resizeNearestNeighbor(this, newShape2D, alignCorners, halfFloatCenters);\n };\n//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicmVzaXplX25lYXJlc3RfbmVpZ2hib3IuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi8uLi8uLi90ZmpzLWNvcmUvc3JjL3B1YmxpYy9jaGFpbmVkX29wcy9yZXNpemVfbmVhcmVzdF9uZWlnaGJvci50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQTs7Ozs7Ozs7Ozs7Ozs7O0dBZUc7QUFDSCxPQUFPLEVBQUMscUJBQXFCLEVBQUMsTUFBTSx5Q0FBeUMsQ0FBQztBQUM5RSxPQUFPLEVBQUMsb0JBQW9CLEVBQXFCLE1BQU0sY0FBYyxDQUFDO0FBV3RFLG9CQUFvQixFQUFFLENBQUMsU0FBUyxDQUFDLHFCQUFxQjtJQUNsRCxVQUNhLFVBQTRCLEVBQUUsWUFBc0IsRUFDN0QsZ0JBQTBCO1FBQ2hDLElBQUksQ0FBQyxlQUFlLEVBQUUsQ0FBQztRQUN2QixPQUFPLHFCQUFxQixDQUN4QixJQUFJLEVBQUUsVUFBVSxFQUFFLFlBQVksRUFBRSxnQkFBZ0IsQ0FBQyxDQUFDO0lBQ3hELENBQUMsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbIi8qKlxuICogQGxpY2Vuc2VcbiAqIENvcHlyaWdodCAyMDIwIEdvb2dsZSBMTEMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuXG4gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgXCJMaWNlbnNlXCIpO1xuICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLlxuICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0XG4gKlxuICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wXG4gKlxuICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZVxuICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gXCJBUyBJU1wiIEJBU0lTLFxuICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuXG4gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kXG4gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS5cbiAqID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4gKi9cbmltcG9ydCB7cmVzaXplTmVhcmVzdE5laWdoYm9yfSBmcm9tICcuLi8uLi9vcHMvaW1hZ2UvcmVzaXplX25lYXJlc3RfbmVpZ2hib3InO1xuaW1wb3J0IHtnZXRHbG9iYWxUZW5zb3JDbGFzcywgVGVuc29yM0QsIFRlbnNvcjREfSBmcm9tICcuLi8uLi90ZW5zb3InO1xuaW1wb3J0IHtSYW5rfSBmcm9tICcuLi8uLi90eXBlcyc7XG5cbmRlY2xhcmUgbW9kdWxlICcuLi8uLi90ZW5zb3InIHtcbiAgaW50ZXJmYWNlIFRlbnNvcjxSIGV4dGVuZHMgUmFuayA9IFJhbms+IHtcbiAgICByZXNpemVOZWFyZXN0TmVpZ2hib3I8VCBleHRlbmRzIFRlbnNvcjNEfFRlbnNvcjREPihcbiAgICAgICAgbmV3U2hhcGUyRDogW251bWJlciwgbnVtYmVyXSwgYWxpZ25Db3JuZXJzPzogYm9vbGVhbixcbiAgICAgICAgaGFsZkZsb2F0Q2VudGVycz86IGJvb2xlYW4pOiBUO1xuICB9XG59XG5cbmdldEdsb2JhbFRlbnNvckNsYXNzKCkucHJvdG90eXBlLnJlc2l6ZU5lYXJlc3ROZWlnaGJvciA9XG4gICAgZnVuY3Rpb248VCBleHRlbmRzIFRlbnNvcjNEfFRlbnNvcjREPihcbiAgICAgICAgdGhpczogVCwgbmV3U2hhcGUyRDogW251bWJlciwgbnVtYmVyXSwgYWxpZ25Db3JuZXJzPzogYm9vbGVhbixcbiAgICAgICAgaGFsZkZsb2F0Q2VudGVycz86IGJvb2xlYW4pOiBUIHtcbiAgdGhpcy50aHJvd0lmRGlzcG9zZWQoKTtcbiAgcmV0dXJuIHJlc2l6ZU5lYXJlc3ROZWlnaGJvcihcbiAgICAgIHRoaXMsIG5ld1NoYXBlMkQsIGFsaWduQ29ybmVycywgaGFsZkZsb2F0Q2VudGVycyk7XG59O1xuIl19","/**\n * @license\n * Copyright 2020 Google LLC. All Rights Reserved.\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n * =============================================================================\n */\nimport { reverse } from '../../ops/reverse';\nimport { getGlobalTensorClass } from '../../tensor';\ngetGlobalTensorClass().prototype.reverse = function (axis) {\n this.throwIfDisposed();\n return reverse(this, axis);\n};\n//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicmV2ZXJzZS5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uLy4uLy4uL3RmanMtY29yZS9zcmMvcHVibGljL2NoYWluZWRfb3BzL3JldmVyc2UudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUE7Ozs7Ozs7Ozs7Ozs7OztHQWVHO0FBQ0gsT0FBTyxFQUFDLE9BQU8sRUFBQyxNQUFNLG1CQUFtQixDQUFDO0FBQzFDLE9BQU8sRUFBQyxvQkFBb0IsRUFBUyxNQUFNLGNBQWMsQ0FBQztBQVMxRCxvQkFBb0IsRUFBRSxDQUFDLFNBQVMsQ0FBQyxPQUFPLEdBQUcsVUFDOUIsSUFBc0I7SUFDakMsSUFBSSxDQUFDLGVBQWUsRUFBRSxDQUFDO0lBQ3ZCLE9BQU8sT0FBTyxDQUFDLElBQUksRUFBRSxJQUFJLENBQUMsQ0FBQztBQUM3QixDQUFDLENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyIvKipcbiAqIEBsaWNlbnNlXG4gKiBDb3B5cmlnaHQgMjAyMCBHb29nbGUgTExDLiBBbGwgUmlnaHRzIFJlc2VydmVkLlxuICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlIFwiTGljZW5zZVwiKTtcbiAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS5cbiAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdFxuICpcbiAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMFxuICpcbiAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmVcbiAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuIFwiQVMgSVNcIiBCQVNJUyxcbiAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLlxuICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZFxuICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuXG4gKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuICovXG5pbXBvcnQge3JldmVyc2V9IGZyb20gJy4uLy4uL29wcy9yZXZlcnNlJztcbmltcG9ydCB7Z2V0R2xvYmFsVGVuc29yQ2xhc3MsIFRlbnNvcn0gZnJvbSAnLi4vLi4vdGVuc29yJztcbmltcG9ydCB7UmFua30gZnJvbSAnLi4vLi4vdHlwZXMnO1xuXG5kZWNsYXJlIG1vZHVsZSAnLi4vLi4vdGVuc29yJyB7XG4gIGludGVyZmFjZSBUZW5zb3I8UiBleHRlbmRzIFJhbmsgPSBSYW5rPiB7XG4gICAgcmV2ZXJzZTxUIGV4dGVuZHMgVGVuc29yPih0aGlzOiBULCBheGlzPzogbnVtYmVyfG51bWJlcltdKTogVDtcbiAgfVxufVxuXG5nZXRHbG9iYWxUZW5zb3JDbGFzcygpLnByb3RvdHlwZS5yZXZlcnNlID0gZnVuY3Rpb248VCBleHRlbmRzIFRlbnNvcj4oXG4gICAgdGhpczogVCwgYXhpcz86IG51bWJlcnxudW1iZXJbXSk6IFQge1xuICB0aGlzLnRocm93SWZEaXNwb3NlZCgpO1xuICByZXR1cm4gcmV2ZXJzZSh0aGlzLCBheGlzKTtcbn07XG4iXX0=","/**\n * @license\n * Copyright 2020 Google LLC. All Rights Reserved.\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n * =============================================================================\n */\n// TODO update import path once op is modularized.\nimport { rfft } from '../../ops/ops';\nimport { getGlobalTensorClass } from '../../tensor';\ngetGlobalTensorClass().prototype.rfft = function () {\n this.throwIfDisposed();\n return rfft(this);\n};\n//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicmZmdC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uLy4uLy4uL3RmanMtY29yZS9zcmMvcHVibGljL2NoYWluZWRfb3BzL3JmZnQudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUE7Ozs7Ozs7Ozs7Ozs7OztHQWVHO0FBRUgsa0RBQWtEO0FBQ2xELE9BQU8sRUFBQyxJQUFJLEVBQUMsTUFBTSxlQUFlLENBQUM7QUFDbkMsT0FBTyxFQUFDLG9CQUFvQixFQUFTLE1BQU0sY0FBYyxDQUFDO0FBUzFELG9CQUFvQixFQUFFLENBQUMsU0FBUyxDQUFDLElBQUksR0FBRztJQUV0QyxJQUFJLENBQUMsZUFBZSxFQUFFLENBQUM7SUFDdkIsT0FBTyxJQUFJLENBQUMsSUFBSSxDQUFNLENBQUM7QUFDekIsQ0FBQyxDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiLyoqXG4gKiBAbGljZW5zZVxuICogQ29weXJpZ2h0IDIwMjAgR29vZ2xlIExMQy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC5cbiAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSBcIkxpY2Vuc2VcIik7XG4gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuXG4gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXRcbiAqXG4gKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjBcbiAqXG4gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlXG4gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiBcIkFTIElTXCIgQkFTSVMsXG4gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC5cbiAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmRcbiAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLlxuICogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbiAqL1xuXG4vLyBUT0RPIHVwZGF0ZSBpbXBvcnQgcGF0aCBvbmNlIG9wIGlzIG1vZHVsYXJpemVkLlxuaW1wb3J0IHtyZmZ0fSBmcm9tICcuLi8uLi9vcHMvb3BzJztcbmltcG9ydCB7Z2V0R2xvYmFsVGVuc29yQ2xhc3MsIFRlbnNvcn0gZnJvbSAnLi4vLi4vdGVuc29yJztcbmltcG9ydCB7UmFua30gZnJvbSAnLi4vLi4vdHlwZXMnO1xuXG5kZWNsYXJlIG1vZHVsZSAnLi4vLi4vdGVuc29yJyB7XG4gIGludGVyZmFjZSBUZW5zb3I8UiBleHRlbmRzIFJhbmsgPSBSYW5rPiB7XG4gICAgcmZmdDxUIGV4dGVuZHMgVGVuc29yPih0aGlzOiBUZW5zb3IpOiBUZW5zb3I7XG4gIH1cbn1cblxuZ2V0R2xvYmFsVGVuc29yQ2xhc3MoKS5wcm90b3R5cGUucmZmdCA9IGZ1bmN0aW9uPFQgZXh0ZW5kcyBUZW5zb3I+KFxuICAgIHRoaXM6IFRlbnNvcik6IFQge1xuICB0aGlzLnRocm93SWZEaXNwb3NlZCgpO1xuICByZXR1cm4gcmZmdCh0aGlzKSBhcyBUO1xufTtcbiJdfQ==","/**\n * @license\n * Copyright 2020 Google LLC. All Rights Reserved.\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n * =============================================================================\n */\n// TODO update import path once op is modularized.\nimport { round } from '../../ops/ops';\nimport { getGlobalTensorClass } from '../../tensor';\ngetGlobalTensorClass().prototype.round = function () {\n this.throwIfDisposed();\n return round(this);\n};\n//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicm91bmQuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi8uLi8uLi90ZmpzLWNvcmUvc3JjL3B1YmxpYy9jaGFpbmVkX29wcy9yb3VuZC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQTs7Ozs7Ozs7Ozs7Ozs7O0dBZUc7QUFFSCxrREFBa0Q7QUFDbEQsT0FBTyxFQUFDLEtBQUssRUFBQyxNQUFNLGVBQWUsQ0FBQztBQUNwQyxPQUFPLEVBQUMsb0JBQW9CLEVBQVMsTUFBTSxjQUFjLENBQUM7QUFTMUQsb0JBQW9CLEVBQUUsQ0FBQyxTQUFTLENBQUMsS0FBSyxHQUFHO0lBRXZDLElBQUksQ0FBQyxlQUFlLEVBQUUsQ0FBQztJQUN2QixPQUFPLEtBQUssQ0FBQyxJQUFJLENBQUMsQ0FBQztBQUNyQixDQUFDLENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyIvKipcbiAqIEBsaWNlbnNlXG4gKiBDb3B5cmlnaHQgMjAyMCBHb29nbGUgTExDLiBBbGwgUmlnaHRzIFJlc2VydmVkLlxuICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlIFwiTGljZW5zZVwiKTtcbiAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS5cbiAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdFxuICpcbiAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMFxuICpcbiAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmVcbiAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuIFwiQVMgSVNcIiBCQVNJUyxcbiAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLlxuICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZFxuICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuXG4gKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuICovXG5cbi8vIFRPRE8gdXBkYXRlIGltcG9ydCBwYXRoIG9uY2Ugb3AgaXMgbW9kdWxhcml6ZWQuXG5pbXBvcnQge3JvdW5kfSBmcm9tICcuLi8uLi9vcHMvb3BzJztcbmltcG9ydCB7Z2V0R2xvYmFsVGVuc29yQ2xhc3MsIFRlbnNvcn0gZnJvbSAnLi4vLi4vdGVuc29yJztcbmltcG9ydCB7UmFua30gZnJvbSAnLi4vLi4vdHlwZXMnO1xuXG5kZWNsYXJlIG1vZHVsZSAnLi4vLi4vdGVuc29yJyB7XG4gIGludGVyZmFjZSBUZW5zb3I8UiBleHRlbmRzIFJhbmsgPSBSYW5rPiB7XG4gICAgcm91bmQ8VCBleHRlbmRzIFRlbnNvcj4odGhpczogVCk6IFQ7XG4gIH1cbn1cblxuZ2V0R2xvYmFsVGVuc29yQ2xhc3MoKS5wcm90b3R5cGUucm91bmQgPSBmdW5jdGlvbjxUIGV4dGVuZHMgVGVuc29yPih0aGlzOiBUKTpcbiAgICBUIHtcbiAgdGhpcy50aHJvd0lmRGlzcG9zZWQoKTtcbiAgcmV0dXJuIHJvdW5kKHRoaXMpO1xufTtcbiJdfQ==","/**\n * @license\n * Copyright 2020 Google LLC. All Rights Reserved.\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n * =============================================================================\n */\n// TODO update import path once op is modularized.\nimport { rsqrt } from '../../ops/ops';\nimport { getGlobalTensorClass } from '../../tensor';\ngetGlobalTensorClass().prototype.rsqrt = function () {\n this.throwIfDisposed();\n return rsqrt(this);\n};\n//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicnNxcnQuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi8uLi8uLi90ZmpzLWNvcmUvc3JjL3B1YmxpYy9jaGFpbmVkX29wcy9yc3FydC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQTs7Ozs7Ozs7Ozs7Ozs7O0dBZUc7QUFFSCxrREFBa0Q7QUFDbEQsT0FBTyxFQUFDLEtBQUssRUFBQyxNQUFNLGVBQWUsQ0FBQztBQUNwQyxPQUFPLEVBQUMsb0JBQW9CLEVBQVMsTUFBTSxjQUFjLENBQUM7QUFTMUQsb0JBQW9CLEVBQUUsQ0FBQyxTQUFTLENBQUMsS0FBSyxHQUFHO0lBRXZDLElBQUksQ0FBQyxlQUFlLEVBQUUsQ0FBQztJQUN2QixPQUFPLEtBQUssQ0FBQyxJQUFJLENBQUMsQ0FBQztBQUNyQixDQUFDLENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyIvKipcbiAqIEBsaWNlbnNlXG4gKiBDb3B5cmlnaHQgMjAyMCBHb29nbGUgTExDLiBBbGwgUmlnaHRzIFJlc2VydmVkLlxuICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlIFwiTGljZW5zZVwiKTtcbiAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS5cbiAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdFxuICpcbiAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMFxuICpcbiAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmVcbiAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuIFwiQVMgSVNcIiBCQVNJUyxcbiAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLlxuICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZFxuICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuXG4gKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuICovXG5cbi8vIFRPRE8gdXBkYXRlIGltcG9ydCBwYXRoIG9uY2Ugb3AgaXMgbW9kdWxhcml6ZWQuXG5pbXBvcnQge3JzcXJ0fSBmcm9tICcuLi8uLi9vcHMvb3BzJztcbmltcG9ydCB7Z2V0R2xvYmFsVGVuc29yQ2xhc3MsIFRlbnNvcn0gZnJvbSAnLi4vLi4vdGVuc29yJztcbmltcG9ydCB7UmFua30gZnJvbSAnLi4vLi4vdHlwZXMnO1xuXG5kZWNsYXJlIG1vZHVsZSAnLi4vLi4vdGVuc29yJyB7XG4gIGludGVyZmFjZSBUZW5zb3I8UiBleHRlbmRzIFJhbmsgPSBSYW5rPiB7XG4gICAgcnNxcnQ8VCBleHRlbmRzIFRlbnNvcj4odGhpczogVCk6IFQ7XG4gIH1cbn1cblxuZ2V0R2xvYmFsVGVuc29yQ2xhc3MoKS5wcm90b3R5cGUucnNxcnQgPSBmdW5jdGlvbjxUIGV4dGVuZHMgVGVuc29yPih0aGlzOiBUKTpcbiAgICBUIHtcbiAgdGhpcy50aHJvd0lmRGlzcG9zZWQoKTtcbiAgcmV0dXJuIHJzcXJ0KHRoaXMpO1xufTtcbiJdfQ==","/**\n * @license\n * Copyright 2020 Google LLC. All Rights Reserved.\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n * =============================================================================\n */\nimport { selu } from '../../ops/selu';\nimport { getGlobalTensorClass } from '../../tensor';\ngetGlobalTensorClass().prototype.selu = function () {\n this.throwIfDisposed();\n return selu(this);\n};\n//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic2VsdS5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uLy4uLy4uL3RmanMtY29yZS9zcmMvcHVibGljL2NoYWluZWRfb3BzL3NlbHUudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUE7Ozs7Ozs7Ozs7Ozs7OztHQWVHO0FBQ0gsT0FBTyxFQUFDLElBQUksRUFBQyxNQUFNLGdCQUFnQixDQUFDO0FBQ3BDLE9BQU8sRUFBQyxvQkFBb0IsRUFBUyxNQUFNLGNBQWMsQ0FBQztBQVMxRCxvQkFBb0IsRUFBRSxDQUFDLFNBQVMsQ0FBQyxJQUFJLEdBQUc7SUFDdEMsSUFBSSxDQUFDLGVBQWUsRUFBRSxDQUFDO0lBQ3ZCLE9BQU8sSUFBSSxDQUFDLElBQUksQ0FBQyxDQUFDO0FBQ3BCLENBQUMsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbIi8qKlxuICogQGxpY2Vuc2VcbiAqIENvcHlyaWdodCAyMDIwIEdvb2dsZSBMTEMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuXG4gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgXCJMaWNlbnNlXCIpO1xuICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLlxuICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0XG4gKlxuICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wXG4gKlxuICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZVxuICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gXCJBUyBJU1wiIEJBU0lTLFxuICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuXG4gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kXG4gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS5cbiAqID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4gKi9cbmltcG9ydCB7c2VsdX0gZnJvbSAnLi4vLi4vb3BzL3NlbHUnO1xuaW1wb3J0IHtnZXRHbG9iYWxUZW5zb3JDbGFzcywgVGVuc29yfSBmcm9tICcuLi8uLi90ZW5zb3InO1xuaW1wb3J0IHtSYW5rfSBmcm9tICcuLi8uLi90eXBlcyc7XG5cbmRlY2xhcmUgbW9kdWxlICcuLi8uLi90ZW5zb3InIHtcbiAgaW50ZXJmYWNlIFRlbnNvcjxSIGV4dGVuZHMgUmFuayA9IFJhbms+IHtcbiAgICBzZWx1PFQgZXh0ZW5kcyBUZW5zb3I+KCk6IFQ7XG4gIH1cbn1cblxuZ2V0R2xvYmFsVGVuc29yQ2xhc3MoKS5wcm90b3R5cGUuc2VsdSA9IGZ1bmN0aW9uPFQgZXh0ZW5kcyBUZW5zb3I+KHRoaXM6IFQpOiBUIHtcbiAgdGhpcy50aHJvd0lmRGlzcG9zZWQoKTtcbiAgcmV0dXJuIHNlbHUodGhpcyk7XG59O1xuIl19","/**\n * @license\n * Copyright 2020 Google LLC. All Rights Reserved.\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n * =============================================================================\n */\nimport { separableConv2d } from '../../ops/separable_conv2d';\nimport { getGlobalTensorClass } from '../../tensor';\ngetGlobalTensorClass().prototype.separableConv2d =\n function (depthwiseFilter, pointwiseFilter, strides, pad, dilation, dataFormat) {\n this.throwIfDisposed();\n return separableConv2d(this, depthwiseFilter, pointwiseFilter, strides, pad, dilation, dataFormat);\n };\n//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic2VwYXJhYmxlX2NvbnYyZC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uLy4uLy4uL3RmanMtY29yZS9zcmMvcHVibGljL2NoYWluZWRfb3BzL3NlcGFyYWJsZV9jb252MmQudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUE7Ozs7Ozs7Ozs7Ozs7OztHQWVHO0FBQ0gsT0FBTyxFQUFDLGVBQWUsRUFBQyxNQUFNLDRCQUE0QixDQUFDO0FBQzNELE9BQU8sRUFBQyxvQkFBb0IsRUFBcUIsTUFBTSxjQUFjLENBQUM7QUFhdEUsb0JBQW9CLEVBQUUsQ0FBQyxTQUFTLENBQUMsZUFBZTtJQUM1QyxVQUNJLGVBQXNDLEVBQ3RDLGVBQW9DLEVBQUUsT0FBZ0MsRUFDdEUsR0FBbUIsRUFBRSxRQUFrQyxFQUN2RCxVQUEwQjtRQUNoQyxJQUFJLENBQUMsZUFBZSxFQUFFLENBQUM7UUFDdkIsT0FBTyxlQUFlLENBQ1gsSUFBSSxFQUFFLGVBQWUsRUFBRSxlQUFlLEVBQUUsT0FBTyxFQUFFLEdBQUcsRUFBRSxRQUFRLEVBQzlELFVBQVUsQ0FBTSxDQUFDO0lBQzlCLENBQUMsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbIi8qKlxuICogQGxpY2Vuc2VcbiAqIENvcHlyaWdodCAyMDIwIEdvb2dsZSBMTEMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuXG4gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgXCJMaWNlbnNlXCIpO1xuICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLlxuICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0XG4gKlxuICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wXG4gKlxuICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZVxuICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gXCJBUyBJU1wiIEJBU0lTLFxuICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuXG4gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kXG4gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS5cbiAqID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4gKi9cbmltcG9ydCB7c2VwYXJhYmxlQ29udjJkfSBmcm9tICcuLi8uLi9vcHMvc2VwYXJhYmxlX2NvbnYyZCc7XG5pbXBvcnQge2dldEdsb2JhbFRlbnNvckNsYXNzLCBUZW5zb3IzRCwgVGVuc29yNER9IGZyb20gJy4uLy4uL3RlbnNvcic7XG5pbXBvcnQge1JhbmssIFRlbnNvckxpa2UsIFRlbnNvckxpa2U0RH0gZnJvbSAnLi4vLi4vdHlwZXMnO1xuXG5kZWNsYXJlIG1vZHVsZSAnLi4vLi4vdGVuc29yJyB7XG4gIGludGVyZmFjZSBUZW5zb3I8UiBleHRlbmRzIFJhbmsgPSBSYW5rPiB7XG4gICAgc2VwYXJhYmxlQ29udjJkPFQgZXh0ZW5kcyBUZW5zb3IzRHxUZW5zb3I0RD4oXG4gICAgICAgIGRlcHRod2lzZUZpbHRlcjogVGVuc29yNER8VGVuc29yTGlrZTRELFxuICAgICAgICBwb2ludHdpc2VGaWx0ZXI6IFRlbnNvcjREfFRlbnNvckxpa2UsIHN0cmlkZXM6IFtudW1iZXIsIG51bWJlcl18bnVtYmVyLFxuICAgICAgICBwYWQ6ICd2YWxpZCd8J3NhbWUnLCBkaWxhdGlvbj86IFtudW1iZXIsIG51bWJlcl18bnVtYmVyLFxuICAgICAgICBkYXRhRm9ybWF0PzogJ05IV0MnfCdOQ0hXJyk6IFQ7XG4gIH1cbn1cblxuZ2V0R2xvYmFsVGVuc29yQ2xhc3MoKS5wcm90b3R5cGUuc2VwYXJhYmxlQ29udjJkID1cbiAgICBmdW5jdGlvbjxUIGV4dGVuZHMgVGVuc29yM0R8VGVuc29yNEQ+KFxuICAgICAgICBkZXB0aHdpc2VGaWx0ZXI6IFRlbnNvcjREfFRlbnNvckxpa2U0RCxcbiAgICAgICAgcG9pbnR3aXNlRmlsdGVyOiBUZW5zb3I0RHxUZW5zb3JMaWtlLCBzdHJpZGVzOiBbbnVtYmVyLCBudW1iZXJdfG51bWJlcixcbiAgICAgICAgcGFkOiAndmFsaWQnfCdzYW1lJywgZGlsYXRpb24/OiBbbnVtYmVyLCBudW1iZXJdfG51bWJlcixcbiAgICAgICAgZGF0YUZvcm1hdD86ICdOSFdDJ3wnTkNIVycpOiBUIHtcbiAgdGhpcy50aHJvd0lmRGlzcG9zZWQoKTtcbiAgcmV0dXJuIHNlcGFyYWJsZUNvbnYyZChcbiAgICAgICAgICAgICB0aGlzLCBkZXB0aHdpc2VGaWx0ZXIsIHBvaW50d2lzZUZpbHRlciwgc3RyaWRlcywgcGFkLCBkaWxhdGlvbixcbiAgICAgICAgICAgICBkYXRhRm9ybWF0KSBhcyBUO1xufTtcbiJdfQ==","/**\n * @license\n * Copyright 2020 Google LLC. All Rights Reserved.\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n * =============================================================================\n */\n// TODO update import path once op is modularized.\nimport { sigmoid } from '../../ops/ops';\nimport { getGlobalTensorClass } from '../../tensor';\ngetGlobalTensorClass().prototype.sigmoid = function () {\n this.throwIfDisposed();\n return sigmoid(this);\n};\n//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic2lnbW9pZC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uLy4uLy4uL3RmanMtY29yZS9zcmMvcHVibGljL2NoYWluZWRfb3BzL3NpZ21vaWQudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUE7Ozs7Ozs7Ozs7Ozs7OztHQWVHO0FBRUgsa0RBQWtEO0FBQ2xELE9BQU8sRUFBQyxPQUFPLEVBQUMsTUFBTSxlQUFlLENBQUM7QUFDdEMsT0FBTyxFQUFDLG9CQUFvQixFQUFTLE1BQU0sY0FBYyxDQUFDO0FBUzFELG9CQUFvQixFQUFFLENBQUMsU0FBUyxDQUFDLE9BQU8sR0FBRztJQUV6QyxJQUFJLENBQUMsZUFBZSxFQUFFLENBQUM7SUFDdkIsT0FBTyxPQUFPLENBQUMsSUFBSSxDQUFDLENBQUM7QUFDdkIsQ0FBQyxDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiLyoqXG4gKiBAbGljZW5zZVxuICogQ29weXJpZ2h0IDIwMjAgR29vZ2xlIExMQy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC5cbiAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSBcIkxpY2Vuc2VcIik7XG4gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuXG4gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXRcbiAqXG4gKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjBcbiAqXG4gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlXG4gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiBcIkFTIElTXCIgQkFTSVMsXG4gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC5cbiAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmRcbiAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLlxuICogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbiAqL1xuXG4vLyBUT0RPIHVwZGF0ZSBpbXBvcnQgcGF0aCBvbmNlIG9wIGlzIG1vZHVsYXJpemVkLlxuaW1wb3J0IHtzaWdtb2lkfSBmcm9tICcuLi8uLi9vcHMvb3BzJztcbmltcG9ydCB7Z2V0R2xvYmFsVGVuc29yQ2xhc3MsIFRlbnNvcn0gZnJvbSAnLi4vLi4vdGVuc29yJztcbmltcG9ydCB7UmFua30gZnJvbSAnLi4vLi4vdHlwZXMnO1xuXG5kZWNsYXJlIG1vZHVsZSAnLi4vLi4vdGVuc29yJyB7XG4gIGludGVyZmFjZSBUZW5zb3I8UiBleHRlbmRzIFJhbmsgPSBSYW5rPiB7XG4gICAgc2lnbW9pZDxUIGV4dGVuZHMgVGVuc29yPih0aGlzOiBUKTogVDtcbiAgfVxufVxuXG5nZXRHbG9iYWxUZW5zb3JDbGFzcygpLnByb3RvdHlwZS5zaWdtb2lkID0gZnVuY3Rpb248VCBleHRlbmRzIFRlbnNvcj4odGhpczogVCk6XG4gICAgVCB7XG4gIHRoaXMudGhyb3dJZkRpc3Bvc2VkKCk7XG4gIHJldHVybiBzaWdtb2lkKHRoaXMpO1xufTtcbiJdfQ==","/**\n * @license\n * Copyright 2020 Google LLC. All Rights Reserved.\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n * =============================================================================\n */\n// TODO update import path once op is modularized.\nimport { sign } from '../../ops/ops';\nimport { getGlobalTensorClass } from '../../tensor';\ngetGlobalTensorClass().prototype.sign = function () {\n this.throwIfDisposed();\n return sign(this);\n};\n//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic2lnbi5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uLy4uLy4uL3RmanMtY29yZS9zcmMvcHVibGljL2NoYWluZWRfb3BzL3NpZ24udHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUE7Ozs7Ozs7Ozs7Ozs7OztHQWVHO0FBRUgsa0RBQWtEO0FBQ2xELE9BQU8sRUFBQyxJQUFJLEVBQUMsTUFBTSxlQUFlLENBQUM7QUFDbkMsT0FBTyxFQUFDLG9CQUFvQixFQUFTLE1BQU0sY0FBYyxDQUFDO0FBUzFELG9CQUFvQixFQUFFLENBQUMsU0FBUyxDQUFDLElBQUksR0FBRztJQUN0QyxJQUFJLENBQUMsZUFBZSxFQUFFLENBQUM7SUFDdkIsT0FBTyxJQUFJLENBQUMsSUFBSSxDQUFDLENBQUM7QUFDcEIsQ0FBQyxDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiLyoqXG4gKiBAbGljZW5zZVxuICogQ29weXJpZ2h0IDIwMjAgR29vZ2xlIExMQy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC5cbiAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSBcIkxpY2Vuc2VcIik7XG4gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuXG4gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXRcbiAqXG4gKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjBcbiAqXG4gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlXG4gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiBcIkFTIElTXCIgQkFTSVMsXG4gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC5cbiAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmRcbiAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLlxuICogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbiAqL1xuXG4vLyBUT0RPIHVwZGF0ZSBpbXBvcnQgcGF0aCBvbmNlIG9wIGlzIG1vZHVsYXJpemVkLlxuaW1wb3J0IHtzaWdufSBmcm9tICcuLi8uLi9vcHMvb3BzJztcbmltcG9ydCB7Z2V0R2xvYmFsVGVuc29yQ2xhc3MsIFRlbnNvcn0gZnJvbSAnLi4vLi4vdGVuc29yJztcbmltcG9ydCB7UmFua30gZnJvbSAnLi4vLi4vdHlwZXMnO1xuXG5kZWNsYXJlIG1vZHVsZSAnLi4vLi4vdGVuc29yJyB7XG4gIGludGVyZmFjZSBUZW5zb3I8UiBleHRlbmRzIFJhbmsgPSBSYW5rPiB7XG4gICAgc2lnbjxUIGV4dGVuZHMgVGVuc29yPih0aGlzOiBUKTogVDtcbiAgfVxufVxuXG5nZXRHbG9iYWxUZW5zb3JDbGFzcygpLnByb3RvdHlwZS5zaWduID0gZnVuY3Rpb248VCBleHRlbmRzIFRlbnNvcj4odGhpczogVCk6IFQge1xuICB0aGlzLnRocm93SWZEaXNwb3NlZCgpO1xuICByZXR1cm4gc2lnbih0aGlzKTtcbn07XG4iXX0=","/**\n * @license\n * Copyright 2020 Google LLC. All Rights Reserved.\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n * =============================================================================\n */\n// TODO update import path once op is modularized.\nimport { sin } from '../../ops/ops';\nimport { getGlobalTensorClass } from '../../tensor';\ngetGlobalTensorClass().prototype.sin = function () {\n this.throwIfDisposed();\n return sin(this);\n};\n//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic2luLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vLi4vLi4vdGZqcy1jb3JlL3NyYy9wdWJsaWMvY2hhaW5lZF9vcHMvc2luLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBOzs7Ozs7Ozs7Ozs7Ozs7R0FlRztBQUVILGtEQUFrRDtBQUNsRCxPQUFPLEVBQUMsR0FBRyxFQUFDLE1BQU0sZUFBZSxDQUFDO0FBQ2xDLE9BQU8sRUFBQyxvQkFBb0IsRUFBUyxNQUFNLGNBQWMsQ0FBQztBQVMxRCxvQkFBb0IsRUFBRSxDQUFDLFNBQVMsQ0FBQyxHQUFHLEdBQUc7SUFDckMsSUFBSSxDQUFDLGVBQWUsRUFBRSxDQUFDO0lBQ3ZCLE9BQU8sR0FBRyxDQUFDLElBQUksQ0FBQyxDQUFDO0FBQ25CLENBQUMsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbIi8qKlxuICogQGxpY2Vuc2VcbiAqIENvcHlyaWdodCAyMDIwIEdvb2dsZSBMTEMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuXG4gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgXCJMaWNlbnNlXCIpO1xuICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLlxuICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0XG4gKlxuICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wXG4gKlxuICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZVxuICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gXCJBUyBJU1wiIEJBU0lTLFxuICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuXG4gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kXG4gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS5cbiAqID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4gKi9cblxuLy8gVE9ETyB1cGRhdGUgaW1wb3J0IHBhdGggb25jZSBvcCBpcyBtb2R1bGFyaXplZC5cbmltcG9ydCB7c2lufSBmcm9tICcuLi8uLi9vcHMvb3BzJztcbmltcG9ydCB7Z2V0R2xvYmFsVGVuc29yQ2xhc3MsIFRlbnNvcn0gZnJvbSAnLi4vLi4vdGVuc29yJztcbmltcG9ydCB7UmFua30gZnJvbSAnLi4vLi4vdHlwZXMnO1xuXG5kZWNsYXJlIG1vZHVsZSAnLi4vLi4vdGVuc29yJyB7XG4gIGludGVyZmFjZSBUZW5zb3I8UiBleHRlbmRzIFJhbmsgPSBSYW5rPiB7XG4gICAgc2luPFQgZXh0ZW5kcyBUZW5zb3I+KHRoaXM6IFQpOiBUO1xuICB9XG59XG5cbmdldEdsb2JhbFRlbnNvckNsYXNzKCkucHJvdG90eXBlLnNpbiA9IGZ1bmN0aW9uPFQgZXh0ZW5kcyBUZW5zb3I+KHRoaXM6IFQpOiBUIHtcbiAgdGhpcy50aHJvd0lmRGlzcG9zZWQoKTtcbiAgcmV0dXJuIHNpbih0aGlzKTtcbn07XG4iXX0=","/**\n * @license\n * Copyright 2020 Google LLC. All Rights Reserved.\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n * =============================================================================\n */\n// TODO update import path once op is modularized.\nimport { sinh } from '../../ops/ops';\nimport { getGlobalTensorClass } from '../../tensor';\ngetGlobalTensorClass().prototype.sinh = function () {\n this.throwIfDisposed();\n return sinh(this);\n};\n//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic2luaC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uLy4uLy4uL3RmanMtY29yZS9zcmMvcHVibGljL2NoYWluZWRfb3BzL3NpbmgudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUE7Ozs7Ozs7Ozs7Ozs7OztHQWVHO0FBRUgsa0RBQWtEO0FBQ2xELE9BQU8sRUFBQyxJQUFJLEVBQUMsTUFBTSxlQUFlLENBQUM7QUFDbkMsT0FBTyxFQUFDLG9CQUFvQixFQUFTLE1BQU0sY0FBYyxDQUFDO0FBUzFELG9CQUFvQixFQUFFLENBQUMsU0FBUyxDQUFDLElBQUksR0FBRztJQUN0QyxJQUFJLENBQUMsZUFBZSxFQUFFLENBQUM7SUFDdkIsT0FBTyxJQUFJLENBQUMsSUFBSSxDQUFDLENBQUM7QUFDcEIsQ0FBQyxDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiLyoqXG4gKiBAbGljZW5zZVxuICogQ29weXJpZ2h0IDIwMjAgR29vZ2xlIExMQy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC5cbiAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSBcIkxpY2Vuc2VcIik7XG4gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuXG4gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXRcbiAqXG4gKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjBcbiAqXG4gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlXG4gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiBcIkFTIElTXCIgQkFTSVMsXG4gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC5cbiAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmRcbiAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLlxuICogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbiAqL1xuXG4vLyBUT0RPIHVwZGF0ZSBpbXBvcnQgcGF0aCBvbmNlIG9wIGlzIG1vZHVsYXJpemVkLlxuaW1wb3J0IHtzaW5ofSBmcm9tICcuLi8uLi9vcHMvb3BzJztcbmltcG9ydCB7Z2V0R2xvYmFsVGVuc29yQ2xhc3MsIFRlbnNvcn0gZnJvbSAnLi4vLi4vdGVuc29yJztcbmltcG9ydCB7UmFua30gZnJvbSAnLi4vLi4vdHlwZXMnO1xuXG5kZWNsYXJlIG1vZHVsZSAnLi4vLi4vdGVuc29yJyB7XG4gIGludGVyZmFjZSBUZW5zb3I8UiBleHRlbmRzIFJhbmsgPSBSYW5rPiB7XG4gICAgc2luaDxUIGV4dGVuZHMgVGVuc29yPih0aGlzOiBUKTogVDtcbiAgfVxufVxuXG5nZXRHbG9iYWxUZW5zb3JDbGFzcygpLnByb3RvdHlwZS5zaW5oID0gZnVuY3Rpb248VCBleHRlbmRzIFRlbnNvcj4odGhpczogVCk6IFQge1xuICB0aGlzLnRocm93SWZEaXNwb3NlZCgpO1xuICByZXR1cm4gc2luaCh0aGlzKTtcbn07XG4iXX0=","/**\n * @license\n * Copyright 2020 Google LLC. All Rights Reserved.\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n * =============================================================================\n */\n// TODO update import path once op is modularized.\nimport { slice } from '../../ops/ops';\nimport { getGlobalTensorClass } from '../../tensor';\ngetGlobalTensorClass().prototype.slice = function (begin, size) {\n this.throwIfDisposed();\n return slice(this, begin, size);\n};\n//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic2xpY2UuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi8uLi8uLi90ZmpzLWNvcmUvc3JjL3B1YmxpYy9jaGFpbmVkX29wcy9zbGljZS50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQTs7Ozs7Ozs7Ozs7Ozs7O0dBZUc7QUFFSCxrREFBa0Q7QUFDbEQsT0FBTyxFQUFDLEtBQUssRUFBQyxNQUFNLGVBQWUsQ0FBQztBQUNwQyxPQUFPLEVBQUMsb0JBQW9CLEVBQVMsTUFBTSxjQUFjLENBQUM7QUFVMUQsb0JBQW9CLEVBQUUsQ0FBQyxTQUFTLENBQUMsS0FBSyxHQUFHLFVBQzVCLEtBQXNCLEVBQUUsSUFBc0I7SUFDekQsSUFBSSxDQUFDLGVBQWUsRUFBRSxDQUFDO0lBQ3ZCLE9BQU8sS0FBSyxDQUFDLElBQUksRUFBRSxLQUFLLEVBQUUsSUFBSSxDQUFDLENBQUM7QUFDbEMsQ0FBQyxDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiLyoqXG4gKiBAbGljZW5zZVxuICogQ29weXJpZ2h0IDIwMjAgR29vZ2xlIExMQy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC5cbiAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSBcIkxpY2Vuc2VcIik7XG4gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuXG4gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXRcbiAqXG4gKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjBcbiAqXG4gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlXG4gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiBcIkFTIElTXCIgQkFTSVMsXG4gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC5cbiAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmRcbiAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLlxuICogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbiAqL1xuXG4vLyBUT0RPIHVwZGF0ZSBpbXBvcnQgcGF0aCBvbmNlIG9wIGlzIG1vZHVsYXJpemVkLlxuaW1wb3J0IHtzbGljZX0gZnJvbSAnLi4vLi4vb3BzL29wcyc7XG5pbXBvcnQge2dldEdsb2JhbFRlbnNvckNsYXNzLCBUZW5zb3J9IGZyb20gJy4uLy4uL3RlbnNvcic7XG5pbXBvcnQge1Jhbmt9IGZyb20gJy4uLy4uL3R5cGVzJztcblxuZGVjbGFyZSBtb2R1bGUgJy4uLy4uL3RlbnNvcicge1xuICBpbnRlcmZhY2UgVGVuc29yPFIgZXh0ZW5kcyBSYW5rID0gUmFuaz4ge1xuICAgIHNsaWNlPFQgZXh0ZW5kcyBUZW5zb3I+KFxuICAgICAgICB0aGlzOiBULCBiZWdpbjogbnVtYmVyfG51bWJlcltdLCBzaXplPzogbnVtYmVyfG51bWJlcltdKTogVDtcbiAgfVxufVxuXG5nZXRHbG9iYWxUZW5zb3JDbGFzcygpLnByb3RvdHlwZS5zbGljZSA9IGZ1bmN0aW9uPFQgZXh0ZW5kcyBUZW5zb3I+KFxuICAgIHRoaXM6IFQsIGJlZ2luOiBudW1iZXJ8bnVtYmVyW10sIHNpemU/OiBudW1iZXJ8bnVtYmVyW10pOiBUIHtcbiAgdGhpcy50aHJvd0lmRGlzcG9zZWQoKTtcbiAgcmV0dXJuIHNsaWNlKHRoaXMsIGJlZ2luLCBzaXplKTtcbn07XG4iXX0=","/**\n * @license\n * Copyright 2020 Google LLC. All Rights Reserved.\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n * =============================================================================\n */\n// TODO update import path once op is modularized.\nimport { softmax } from '../../ops/ops';\nimport { getGlobalTensorClass } from '../../tensor';\ngetGlobalTensorClass().prototype.softmax = function (dim) {\n this.throwIfDisposed();\n return softmax(this, dim);\n};\n//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic29mdG1heC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uLy4uLy4uL3RmanMtY29yZS9zcmMvcHVibGljL2NoYWluZWRfb3BzL3NvZnRtYXgudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUE7Ozs7Ozs7Ozs7Ozs7OztHQWVHO0FBRUgsa0RBQWtEO0FBQ2xELE9BQU8sRUFBQyxPQUFPLEVBQUMsTUFBTSxlQUFlLENBQUM7QUFDdEMsT0FBTyxFQUFDLG9CQUFvQixFQUFTLE1BQU0sY0FBYyxDQUFDO0FBUzFELG9CQUFvQixFQUFFLENBQUMsU0FBUyxDQUFDLE9BQU8sR0FBRyxVQUM5QixHQUFXO0lBQ3RCLElBQUksQ0FBQyxlQUFlLEVBQUUsQ0FBQztJQUN2QixPQUFPLE9BQU8sQ0FBQyxJQUFJLEVBQUUsR0FBRyxDQUFDLENBQUM7QUFDNUIsQ0FBQyxDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiLyoqXG4gKiBAbGljZW5zZVxuICogQ29weXJpZ2h0IDIwMjAgR29vZ2xlIExMQy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC5cbiAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSBcIkxpY2Vuc2VcIik7XG4gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuXG4gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXRcbiAqXG4gKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjBcbiAqXG4gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlXG4gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiBcIkFTIElTXCIgQkFTSVMsXG4gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC5cbiAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmRcbiAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLlxuICogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbiAqL1xuXG4vLyBUT0RPIHVwZGF0ZSBpbXBvcnQgcGF0aCBvbmNlIG9wIGlzIG1vZHVsYXJpemVkLlxuaW1wb3J0IHtzb2Z0bWF4fSBmcm9tICcuLi8uLi9vcHMvb3BzJztcbmltcG9ydCB7Z2V0R2xvYmFsVGVuc29yQ2xhc3MsIFRlbnNvcn0gZnJvbSAnLi4vLi4vdGVuc29yJztcbmltcG9ydCB7UmFua30gZnJvbSAnLi4vLi4vdHlwZXMnO1xuXG5kZWNsYXJlIG1vZHVsZSAnLi4vLi4vdGVuc29yJyB7XG4gIGludGVyZmFjZSBUZW5zb3I8UiBleHRlbmRzIFJhbmsgPSBSYW5rPiB7XG4gICAgc29mdG1heDxUIGV4dGVuZHMgVGVuc29yPih0aGlzOiBULCBkaW0/OiBudW1iZXIpOiBUO1xuICB9XG59XG5cbmdldEdsb2JhbFRlbnNvckNsYXNzKCkucHJvdG90eXBlLnNvZnRtYXggPSBmdW5jdGlvbjxUIGV4dGVuZHMgVGVuc29yPihcbiAgICB0aGlzOiBULCBkaW06IG51bWJlcik6IFQge1xuICB0aGlzLnRocm93SWZEaXNwb3NlZCgpO1xuICByZXR1cm4gc29mdG1heCh0aGlzLCBkaW0pO1xufTtcbiJdfQ==","/**\n * @license\n * Copyright 2020 Google LLC. All Rights Reserved.\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n * =============================================================================\n */\n// TODO update import path once op is modularized.\nimport { softplus } from '../../ops/ops';\nimport { getGlobalTensorClass } from '../../tensor';\ngetGlobalTensorClass().prototype.softplus = function () {\n this.throwIfDisposed();\n return softplus(this);\n};\n//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic29mdHBsdXMuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi8uLi8uLi90ZmpzLWNvcmUvc3JjL3B1YmxpYy9jaGFpbmVkX29wcy9zb2Z0cGx1cy50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQTs7Ozs7Ozs7Ozs7Ozs7O0dBZUc7QUFFSCxrREFBa0Q7QUFDbEQsT0FBTyxFQUFDLFFBQVEsRUFBQyxNQUFNLGVBQWUsQ0FBQztBQUN2QyxPQUFPLEVBQUMsb0JBQW9CLEVBQVMsTUFBTSxjQUFjLENBQUM7QUFTMUQsb0JBQW9CLEVBQUUsQ0FBQyxTQUFTLENBQUMsUUFBUSxHQUFHO0lBRTFDLElBQUksQ0FBQyxlQUFlLEVBQUUsQ0FBQztJQUN2QixPQUFPLFFBQVEsQ0FBQyxJQUFJLENBQUMsQ0FBQztBQUN4QixDQUFDLENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyIvKipcbiAqIEBsaWNlbnNlXG4gKiBDb3B5cmlnaHQgMjAyMCBHb29nbGUgTExDLiBBbGwgUmlnaHRzIFJlc2VydmVkLlxuICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlIFwiTGljZW5zZVwiKTtcbiAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS5cbiAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdFxuICpcbiAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMFxuICpcbiAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmVcbiAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuIFwiQVMgSVNcIiBCQVNJUyxcbiAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLlxuICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZFxuICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuXG4gKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuICovXG5cbi8vIFRPRE8gdXBkYXRlIGltcG9ydCBwYXRoIG9uY2Ugb3AgaXMgbW9kdWxhcml6ZWQuXG5pbXBvcnQge3NvZnRwbHVzfSBmcm9tICcuLi8uLi9vcHMvb3BzJztcbmltcG9ydCB7Z2V0R2xvYmFsVGVuc29yQ2xhc3MsIFRlbnNvcn0gZnJvbSAnLi4vLi4vdGVuc29yJztcbmltcG9ydCB7UmFua30gZnJvbSAnLi4vLi4vdHlwZXMnO1xuXG5kZWNsYXJlIG1vZHVsZSAnLi4vLi4vdGVuc29yJyB7XG4gIGludGVyZmFjZSBUZW5zb3I8UiBleHRlbmRzIFJhbmsgPSBSYW5rPiB7XG4gICAgc29mdHBsdXM8VCBleHRlbmRzIFRlbnNvcj4odGhpczogVCk6IFQ7XG4gIH1cbn1cblxuZ2V0R2xvYmFsVGVuc29yQ2xhc3MoKS5wcm90b3R5cGUuc29mdHBsdXMgPSBmdW5jdGlvbjxUIGV4dGVuZHMgVGVuc29yPih0aGlzOiBUKTpcbiAgICBUIHtcbiAgdGhpcy50aHJvd0lmRGlzcG9zZWQoKTtcbiAgcmV0dXJuIHNvZnRwbHVzKHRoaXMpO1xufTtcbiJdfQ==","/**\n * @license\n * Copyright 2020 Google LLC. All Rights Reserved.\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n * =============================================================================\n */\nimport { spaceToBatchND } from '../../ops/space_to_batch_nd';\nimport { getGlobalTensorClass } from '../../tensor';\ngetGlobalTensorClass().prototype.spaceToBatchND = function (blockShape, paddings) {\n this.throwIfDisposed();\n return spaceToBatchND(this, blockShape, paddings);\n};\n//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic3BhY2VfdG9fYmF0Y2hfbmQuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi8uLi8uLi90ZmpzLWNvcmUvc3JjL3B1YmxpYy9jaGFpbmVkX29wcy9zcGFjZV90b19iYXRjaF9uZC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQTs7Ozs7Ozs7Ozs7Ozs7O0dBZUc7QUFDSCxPQUFPLEVBQUMsY0FBYyxFQUFDLE1BQU0sNkJBQTZCLENBQUM7QUFDM0QsT0FBTyxFQUFDLG9CQUFvQixFQUFTLE1BQU0sY0FBYyxDQUFDO0FBVTFELG9CQUFvQixFQUFFLENBQUMsU0FBUyxDQUFDLGNBQWMsR0FBRyxVQUM5QyxVQUFvQixFQUFFLFFBQW9CO0lBQzVDLElBQUksQ0FBQyxlQUFlLEVBQUUsQ0FBQztJQUN2QixPQUFPLGNBQWMsQ0FBQyxJQUFJLEVBQUUsVUFBVSxFQUFFLFFBQVEsQ0FBQyxDQUFDO0FBQ3BELENBQUMsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbIi8qKlxuICogQGxpY2Vuc2VcbiAqIENvcHlyaWdodCAyMDIwIEdvb2dsZSBMTEMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuXG4gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgXCJMaWNlbnNlXCIpO1xuICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLlxuICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0XG4gKlxuICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wXG4gKlxuICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZVxuICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gXCJBUyBJU1wiIEJBU0lTLFxuICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuXG4gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kXG4gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS5cbiAqID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4gKi9cbmltcG9ydCB7c3BhY2VUb0JhdGNoTkR9IGZyb20gJy4uLy4uL29wcy9zcGFjZV90b19iYXRjaF9uZCc7XG5pbXBvcnQge2dldEdsb2JhbFRlbnNvckNsYXNzLCBUZW5zb3J9IGZyb20gJy4uLy4uL3RlbnNvcic7XG5pbXBvcnQge1Jhbmt9IGZyb20gJy4uLy4uL3R5cGVzJztcblxuZGVjbGFyZSBtb2R1bGUgJy4uLy4uL3RlbnNvcicge1xuICBpbnRlcmZhY2UgVGVuc29yPFIgZXh0ZW5kcyBSYW5rID0gUmFuaz4ge1xuICAgIHNwYWNlVG9CYXRjaE5EPFIgZXh0ZW5kcyBSYW5rPihibG9ja1NoYXBlOiBudW1iZXJbXSwgcGFkZGluZ3M6IG51bWJlcltdW10pOlxuICAgICAgICBUZW5zb3I8Uj47XG4gIH1cbn1cblxuZ2V0R2xvYmFsVGVuc29yQ2xhc3MoKS5wcm90b3R5cGUuc3BhY2VUb0JhdGNoTkQgPSBmdW5jdGlvbjxSIGV4dGVuZHMgUmFuaz4oXG4gICAgYmxvY2tTaGFwZTogbnVtYmVyW10sIHBhZGRpbmdzOiBudW1iZXJbXVtdKTogVGVuc29yPFI+IHtcbiAgdGhpcy50aHJvd0lmRGlzcG9zZWQoKTtcbiAgcmV0dXJuIHNwYWNlVG9CYXRjaE5EKHRoaXMsIGJsb2NrU2hhcGUsIHBhZGRpbmdzKTtcbn07XG4iXX0=","/**\n * @license\n * Copyright 2020 Google LLC. All Rights Reserved.\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n * =============================================================================\n */\nimport { split } from '../../ops/split';\nimport { getGlobalTensorClass } from '../../tensor';\ngetGlobalTensorClass().prototype.split = function (numOrSizeSplits, axis) {\n this.throwIfDisposed();\n return split(this, numOrSizeSplits, axis);\n};\n//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic3BsaXQuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi8uLi8uLi90ZmpzLWNvcmUvc3JjL3B1YmxpYy9jaGFpbmVkX29wcy9zcGxpdC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQTs7Ozs7Ozs7Ozs7Ozs7O0dBZUc7QUFDSCxPQUFPLEVBQUMsS0FBSyxFQUFDLE1BQU0saUJBQWlCLENBQUM7QUFDdEMsT0FBTyxFQUFDLG9CQUFvQixFQUFTLE1BQU0sY0FBYyxDQUFDO0FBVTFELG9CQUFvQixFQUFFLENBQUMsU0FBUyxDQUFDLEtBQUssR0FBRyxVQUNyQyxlQUFnQyxFQUFFLElBQWE7SUFDakQsSUFBSSxDQUFDLGVBQWUsRUFBRSxDQUFDO0lBQ3ZCLE9BQU8sS0FBSyxDQUFDLElBQUksRUFBRSxlQUFlLEVBQUUsSUFBSSxDQUFDLENBQUM7QUFDNUMsQ0FBQyxDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiLyoqXG4gKiBAbGljZW5zZVxuICogQ29weXJpZ2h0IDIwMjAgR29vZ2xlIExMQy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC5cbiAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSBcIkxpY2Vuc2VcIik7XG4gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuXG4gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXRcbiAqXG4gKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjBcbiAqXG4gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlXG4gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiBcIkFTIElTXCIgQkFTSVMsXG4gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC5cbiAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmRcbiAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLlxuICogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbiAqL1xuaW1wb3J0IHtzcGxpdH0gZnJvbSAnLi4vLi4vb3BzL3NwbGl0JztcbmltcG9ydCB7Z2V0R2xvYmFsVGVuc29yQ2xhc3MsIFRlbnNvcn0gZnJvbSAnLi4vLi4vdGVuc29yJztcbmltcG9ydCB7UmFua30gZnJvbSAnLi4vLi4vdHlwZXMnO1xuXG5kZWNsYXJlIG1vZHVsZSAnLi4vLi4vdGVuc29yJyB7XG4gIGludGVyZmFjZSBUZW5zb3I8UiBleHRlbmRzIFJhbmsgPSBSYW5rPiB7XG4gICAgc3BsaXQ8VCBleHRlbmRzIFRlbnNvcj4obnVtT3JTaXplU3BsaXRzOiBudW1iZXJbXXxudW1iZXIsIGF4aXM/OiBudW1iZXIpOlxuICAgICAgICBUW107XG4gIH1cbn1cblxuZ2V0R2xvYmFsVGVuc29yQ2xhc3MoKS5wcm90b3R5cGUuc3BsaXQgPSBmdW5jdGlvbjxUIGV4dGVuZHMgVGVuc29yPihcbiAgICBudW1PclNpemVTcGxpdHM6IG51bWJlcltdfG51bWJlciwgYXhpcz86IG51bWJlcik6IFRbXSB7XG4gIHRoaXMudGhyb3dJZkRpc3Bvc2VkKCk7XG4gIHJldHVybiBzcGxpdCh0aGlzLCBudW1PclNpemVTcGxpdHMsIGF4aXMpO1xufTtcbiJdfQ==","/**\n * @license\n * Copyright 2020 Google LLC. All Rights Reserved.\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n * =============================================================================\n */\n// TODO update import path once op is modularized.\nimport { sqrt } from '../../ops/ops';\nimport { getGlobalTensorClass } from '../../tensor';\ngetGlobalTensorClass().prototype.sqrt = function () {\n this.throwIfDisposed();\n return sqrt(this);\n};\n//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic3FydC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uLy4uLy4uL3RmanMtY29yZS9zcmMvcHVibGljL2NoYWluZWRfb3BzL3NxcnQudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUE7Ozs7Ozs7Ozs7Ozs7OztHQWVHO0FBRUgsa0RBQWtEO0FBQ2xELE9BQU8sRUFBQyxJQUFJLEVBQUMsTUFBTSxlQUFlLENBQUM7QUFDbkMsT0FBTyxFQUFDLG9CQUFvQixFQUFTLE1BQU0sY0FBYyxDQUFDO0FBUzFELG9CQUFvQixFQUFFLENBQUMsU0FBUyxDQUFDLElBQUksR0FBRztJQUN0QyxJQUFJLENBQUMsZUFBZSxFQUFFLENBQUM7SUFDdkIsT0FBTyxJQUFJLENBQUMsSUFBSSxDQUFDLENBQUM7QUFDcEIsQ0FBQyxDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiLyoqXG4gKiBAbGljZW5zZVxuICogQ29weXJpZ2h0IDIwMjAgR29vZ2xlIExMQy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC5cbiAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSBcIkxpY2Vuc2VcIik7XG4gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuXG4gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXRcbiAqXG4gKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjBcbiAqXG4gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlXG4gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiBcIkFTIElTXCIgQkFTSVMsXG4gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC5cbiAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmRcbiAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLlxuICogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbiAqL1xuXG4vLyBUT0RPIHVwZGF0ZSBpbXBvcnQgcGF0aCBvbmNlIG9wIGlzIG1vZHVsYXJpemVkLlxuaW1wb3J0IHtzcXJ0fSBmcm9tICcuLi8uLi9vcHMvb3BzJztcbmltcG9ydCB7Z2V0R2xvYmFsVGVuc29yQ2xhc3MsIFRlbnNvcn0gZnJvbSAnLi4vLi4vdGVuc29yJztcbmltcG9ydCB7UmFua30gZnJvbSAnLi4vLi4vdHlwZXMnO1xuXG5kZWNsYXJlIG1vZHVsZSAnLi4vLi4vdGVuc29yJyB7XG4gIGludGVyZmFjZSBUZW5zb3I8UiBleHRlbmRzIFJhbmsgPSBSYW5rPiB7XG4gICAgc3FydDxUIGV4dGVuZHMgVGVuc29yPih0aGlzOiBUKTogVDtcbiAgfVxufVxuXG5nZXRHbG9iYWxUZW5zb3JDbGFzcygpLnByb3RvdHlwZS5zcXJ0ID0gZnVuY3Rpb248VCBleHRlbmRzIFRlbnNvcj4odGhpczogVCk6IFQge1xuICB0aGlzLnRocm93SWZEaXNwb3NlZCgpO1xuICByZXR1cm4gc3FydCh0aGlzKTtcbn07XG4iXX0=","/**\n * @license\n * Copyright 2020 Google LLC. All Rights Reserved.\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n * =============================================================================\n */\n// TODO update import path once op is modularized.\nimport { square } from '../../ops/ops';\nimport { getGlobalTensorClass } from '../../tensor';\ngetGlobalTensorClass().prototype.square = function () {\n this.throwIfDisposed();\n return square(this);\n};\n//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic3F1YXJlLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vLi4vLi4vdGZqcy1jb3JlL3NyYy9wdWJsaWMvY2hhaW5lZF9vcHMvc3F1YXJlLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBOzs7Ozs7Ozs7Ozs7Ozs7R0FlRztBQUVILGtEQUFrRDtBQUNsRCxPQUFPLEVBQUMsTUFBTSxFQUFDLE1BQU0sZUFBZSxDQUFDO0FBQ3JDLE9BQU8sRUFBQyxvQkFBb0IsRUFBUyxNQUFNLGNBQWMsQ0FBQztBQVMxRCxvQkFBb0IsRUFBRSxDQUFDLFNBQVMsQ0FBQyxNQUFNLEdBQUc7SUFFeEMsSUFBSSxDQUFDLGVBQWUsRUFBRSxDQUFDO0lBQ3ZCLE9BQU8sTUFBTSxDQUFDLElBQUksQ0FBQyxDQUFDO0FBQ3RCLENBQUMsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbIi8qKlxuICogQGxpY2Vuc2VcbiAqIENvcHlyaWdodCAyMDIwIEdvb2dsZSBMTEMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuXG4gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgXCJMaWNlbnNlXCIpO1xuICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLlxuICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0XG4gKlxuICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wXG4gKlxuICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZVxuICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gXCJBUyBJU1wiIEJBU0lTLFxuICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuXG4gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kXG4gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS5cbiAqID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4gKi9cblxuLy8gVE9ETyB1cGRhdGUgaW1wb3J0IHBhdGggb25jZSBvcCBpcyBtb2R1bGFyaXplZC5cbmltcG9ydCB7c3F1YXJlfSBmcm9tICcuLi8uLi9vcHMvb3BzJztcbmltcG9ydCB7Z2V0R2xvYmFsVGVuc29yQ2xhc3MsIFRlbnNvcn0gZnJvbSAnLi4vLi4vdGVuc29yJztcbmltcG9ydCB7UmFua30gZnJvbSAnLi4vLi4vdHlwZXMnO1xuXG5kZWNsYXJlIG1vZHVsZSAnLi4vLi4vdGVuc29yJyB7XG4gIGludGVyZmFjZSBUZW5zb3I8UiBleHRlbmRzIFJhbmsgPSBSYW5rPiB7XG4gICAgc3F1YXJlPFQgZXh0ZW5kcyBUZW5zb3I+KHRoaXM6IFQpOiBUO1xuICB9XG59XG5cbmdldEdsb2JhbFRlbnNvckNsYXNzKCkucHJvdG90eXBlLnNxdWFyZSA9IGZ1bmN0aW9uPFQgZXh0ZW5kcyBUZW5zb3I+KHRoaXM6IFQpOlxuICAgIFQge1xuICB0aGlzLnRocm93SWZEaXNwb3NlZCgpO1xuICByZXR1cm4gc3F1YXJlKHRoaXMpO1xufTtcbiJdfQ==","/**\n * @license\n * Copyright 2020 Google LLC. All Rights Reserved.\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n * =============================================================================\n */\nimport { squaredDifference } from '../../ops/squared_difference';\nimport { getGlobalTensorClass } from '../../tensor';\ngetGlobalTensorClass().prototype.squaredDifference = function (b) {\n this.throwIfDisposed();\n return squaredDifference(this, b);\n};\n//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic3F1YXJlZF9kaWZmZXJlbmNlLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vLi4vLi4vdGZqcy1jb3JlL3NyYy9wdWJsaWMvY2hhaW5lZF9vcHMvc3F1YXJlZF9kaWZmZXJlbmNlLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBOzs7Ozs7Ozs7Ozs7Ozs7R0FlRztBQUVILE9BQU8sRUFBQyxpQkFBaUIsRUFBQyxNQUFNLDhCQUE4QixDQUFDO0FBQy9ELE9BQU8sRUFBQyxvQkFBb0IsRUFBUyxNQUFNLGNBQWMsQ0FBQztBQVMxRCxvQkFBb0IsRUFBRSxDQUFDLFNBQVMsQ0FBQyxpQkFBaUIsR0FBRyxVQUNqRCxDQUFvQjtJQUN0QixJQUFJLENBQUMsZUFBZSxFQUFFLENBQUM7SUFDdkIsT0FBTyxpQkFBaUIsQ0FBQyxJQUFJLEVBQUUsQ0FBQyxDQUFDLENBQUM7QUFDcEMsQ0FBQyxDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiLyoqXG4gKiBAbGljZW5zZVxuICogQ29weXJpZ2h0IDIwMjAgR29vZ2xlIExMQy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC5cbiAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSBcIkxpY2Vuc2VcIik7XG4gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuXG4gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXRcbiAqXG4gKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjBcbiAqXG4gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlXG4gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiBcIkFTIElTXCIgQkFTSVMsXG4gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC5cbiAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmRcbiAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLlxuICogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbiAqL1xuXG5pbXBvcnQge3NxdWFyZWREaWZmZXJlbmNlfSBmcm9tICcuLi8uLi9vcHMvc3F1YXJlZF9kaWZmZXJlbmNlJztcbmltcG9ydCB7Z2V0R2xvYmFsVGVuc29yQ2xhc3MsIFRlbnNvcn0gZnJvbSAnLi4vLi4vdGVuc29yJztcbmltcG9ydCB7UmFuaywgVGVuc29yTGlrZX0gZnJvbSAnLi4vLi4vdHlwZXMnO1xuXG5kZWNsYXJlIG1vZHVsZSAnLi4vLi4vdGVuc29yJyB7XG4gIGludGVyZmFjZSBUZW5zb3I8UiBleHRlbmRzIFJhbmsgPSBSYW5rPiB7XG4gICAgc3F1YXJlZERpZmZlcmVuY2U8VCBleHRlbmRzIFRlbnNvcj4oYjogVGVuc29yfFRlbnNvckxpa2UpOiBUO1xuICB9XG59XG5cbmdldEdsb2JhbFRlbnNvckNsYXNzKCkucHJvdG90eXBlLnNxdWFyZWREaWZmZXJlbmNlID0gZnVuY3Rpb248VCBleHRlbmRzIFRlbnNvcj4oXG4gICAgYjogVGVuc29yfFRlbnNvckxpa2UpOiBUIHtcbiAgdGhpcy50aHJvd0lmRGlzcG9zZWQoKTtcbiAgcmV0dXJuIHNxdWFyZWREaWZmZXJlbmNlKHRoaXMsIGIpO1xufTtcbiJdfQ==","/**\n * @license\n * Copyright 2020 Google LLC. All Rights Reserved.\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n * =============================================================================\n */\nimport { squeeze } from '../../ops/squeeze';\nimport { getGlobalTensorClass } from '../../tensor';\ngetGlobalTensorClass().prototype.squeeze = function (axis) {\n this.throwIfDisposed();\n return squeeze(this, axis);\n};\n//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic3F1ZWV6ZS5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uLy4uLy4uL3RmanMtY29yZS9zcmMvcHVibGljL2NoYWluZWRfb3BzL3NxdWVlemUudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUE7Ozs7Ozs7Ozs7Ozs7OztHQWVHO0FBQ0gsT0FBTyxFQUFDLE9BQU8sRUFBQyxNQUFNLG1CQUFtQixDQUFDO0FBQzFDLE9BQU8sRUFBQyxvQkFBb0IsRUFBUyxNQUFNLGNBQWMsQ0FBQztBQVMxRCxvQkFBb0IsRUFBRSxDQUFDLFNBQVMsQ0FBQyxPQUFPLEdBQUcsVUFDdkMsSUFBZTtJQUNqQixJQUFJLENBQUMsZUFBZSxFQUFFLENBQUM7SUFDdkIsT0FBTyxPQUFPLENBQUMsSUFBSSxFQUFFLElBQUksQ0FBQyxDQUFDO0FBQzdCLENBQUMsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbIi8qKlxuICogQGxpY2Vuc2VcbiAqIENvcHlyaWdodCAyMDIwIEdvb2dsZSBMTEMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuXG4gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgXCJMaWNlbnNlXCIpO1xuICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLlxuICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0XG4gKlxuICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wXG4gKlxuICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZVxuICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gXCJBUyBJU1wiIEJBU0lTLFxuICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuXG4gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kXG4gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS5cbiAqID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4gKi9cbmltcG9ydCB7c3F1ZWV6ZX0gZnJvbSAnLi4vLi4vb3BzL3NxdWVlemUnO1xuaW1wb3J0IHtnZXRHbG9iYWxUZW5zb3JDbGFzcywgVGVuc29yfSBmcm9tICcuLi8uLi90ZW5zb3InO1xuaW1wb3J0IHtSYW5rfSBmcm9tICcuLi8uLi90eXBlcyc7XG5cbmRlY2xhcmUgbW9kdWxlICcuLi8uLi90ZW5zb3InIHtcbiAgaW50ZXJmYWNlIFRlbnNvcjxSIGV4dGVuZHMgUmFuayA9IFJhbms+IHtcbiAgICBzcXVlZXplPFQgZXh0ZW5kcyBUZW5zb3I+KGF4aXM/OiBudW1iZXJbXSk6IFQ7XG4gIH1cbn1cblxuZ2V0R2xvYmFsVGVuc29yQ2xhc3MoKS5wcm90b3R5cGUuc3F1ZWV6ZSA9IGZ1bmN0aW9uPFQgZXh0ZW5kcyBUZW5zb3I+KFxuICAgIGF4aXM/OiBudW1iZXJbXSk6IFQge1xuICB0aGlzLnRocm93SWZEaXNwb3NlZCgpO1xuICByZXR1cm4gc3F1ZWV6ZSh0aGlzLCBheGlzKTtcbn07XG4iXX0=","/**\n * @license\n * Copyright 2020 Google LLC. All Rights Reserved.\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n * =============================================================================\n */\nimport { stack } from '../../ops/stack';\nimport { getGlobalTensorClass, Tensor } from '../../tensor';\ngetGlobalTensorClass().prototype.stack = function (x, axis) {\n this.throwIfDisposed();\n const tensorsToBeStacked = x instanceof Tensor ? [this, x] : [this, ...x];\n return stack(tensorsToBeStacked, axis);\n};\n//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic3RhY2suanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi8uLi8uLi90ZmpzLWNvcmUvc3JjL3B1YmxpYy9jaGFpbmVkX29wcy9zdGFjay50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQTs7Ozs7Ozs7Ozs7Ozs7O0dBZUc7QUFDSCxPQUFPLEVBQUMsS0FBSyxFQUFDLE1BQU0saUJBQWlCLENBQUM7QUFDdEMsT0FBTyxFQUFDLG9CQUFvQixFQUFFLE1BQU0sRUFBQyxNQUFNLGNBQWMsQ0FBQztBQVMxRCxvQkFBb0IsRUFBRSxDQUFDLFNBQVMsQ0FBQyxLQUFLLEdBQUcsVUFDckMsQ0FBa0IsRUFBRSxJQUFhO0lBQ25DLElBQUksQ0FBQyxlQUFlLEVBQUUsQ0FBQztJQUN2QixNQUFNLGtCQUFrQixHQUFHLENBQUMsWUFBWSxNQUFNLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksRUFBRSxHQUFHLENBQUMsQ0FBQyxDQUFDO0lBQzFFLE9BQU8sS0FBSyxDQUFDLGtCQUFrQixFQUFFLElBQUksQ0FBTSxDQUFDO0FBQzlDLENBQUMsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbIi8qKlxuICogQGxpY2Vuc2VcbiAqIENvcHlyaWdodCAyMDIwIEdvb2dsZSBMTEMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuXG4gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgXCJMaWNlbnNlXCIpO1xuICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLlxuICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0XG4gKlxuICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wXG4gKlxuICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZVxuICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gXCJBUyBJU1wiIEJBU0lTLFxuICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuXG4gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kXG4gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS5cbiAqID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4gKi9cbmltcG9ydCB7c3RhY2t9IGZyb20gJy4uLy4uL29wcy9zdGFjayc7XG5pbXBvcnQge2dldEdsb2JhbFRlbnNvckNsYXNzLCBUZW5zb3J9IGZyb20gJy4uLy4uL3RlbnNvcic7XG5pbXBvcnQge1Jhbmt9IGZyb20gJy4uLy4uL3R5cGVzJztcblxuZGVjbGFyZSBtb2R1bGUgJy4uLy4uL3RlbnNvcicge1xuICBpbnRlcmZhY2UgVGVuc29yPFIgZXh0ZW5kcyBSYW5rID0gUmFuaz4ge1xuICAgIHN0YWNrPFQgZXh0ZW5kcyBUZW5zb3I+KHg6IFRlbnNvcnxUZW5zb3JbXSwgYXhpcz86IG51bWJlcik6IFQ7XG4gIH1cbn1cblxuZ2V0R2xvYmFsVGVuc29yQ2xhc3MoKS5wcm90b3R5cGUuc3RhY2sgPSBmdW5jdGlvbjxUIGV4dGVuZHMgVGVuc29yPihcbiAgICB4OiBUZW5zb3J8VGVuc29yW10sIGF4aXM/OiBudW1iZXIpOiBUIHtcbiAgdGhpcy50aHJvd0lmRGlzcG9zZWQoKTtcbiAgY29uc3QgdGVuc29yc1RvQmVTdGFja2VkID0geCBpbnN0YW5jZW9mIFRlbnNvciA/IFt0aGlzLCB4XSA6IFt0aGlzLCAuLi54XTtcbiAgcmV0dXJuIHN0YWNrKHRlbnNvcnNUb0JlU3RhY2tlZCwgYXhpcykgYXMgVDtcbn07XG4iXX0=","/**\n * @license\n * Copyright 2020 Google LLC. All Rights Reserved.\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n * =============================================================================\n */\n// TODO update import path once op is modularized.\nimport { step } from '../../ops/ops';\nimport { getGlobalTensorClass } from '../../tensor';\ngetGlobalTensorClass().prototype.step = function (alpha) {\n this.throwIfDisposed();\n return step(this, alpha);\n};\n//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic3RlcC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uLy4uLy4uL3RmanMtY29yZS9zcmMvcHVibGljL2NoYWluZWRfb3BzL3N0ZXAudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUE7Ozs7Ozs7Ozs7Ozs7OztHQWVHO0FBRUgsa0RBQWtEO0FBQ2xELE9BQU8sRUFBQyxJQUFJLEVBQUMsTUFBTSxlQUFlLENBQUM7QUFDbkMsT0FBTyxFQUFDLG9CQUFvQixFQUFTLE1BQU0sY0FBYyxDQUFDO0FBUzFELG9CQUFvQixFQUFFLENBQUMsU0FBUyxDQUFDLElBQUksR0FBRyxVQUMzQixLQUFjO0lBQ3pCLElBQUksQ0FBQyxlQUFlLEVBQUUsQ0FBQztJQUN2QixPQUFPLElBQUksQ0FBQyxJQUFJLEVBQUUsS0FBSyxDQUFDLENBQUM7QUFDM0IsQ0FBQyxDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiLyoqXG4gKiBAbGljZW5zZVxuICogQ29weXJpZ2h0IDIwMjAgR29vZ2xlIExMQy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC5cbiAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSBcIkxpY2Vuc2VcIik7XG4gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuXG4gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXRcbiAqXG4gKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjBcbiAqXG4gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlXG4gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiBcIkFTIElTXCIgQkFTSVMsXG4gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC5cbiAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmRcbiAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLlxuICogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbiAqL1xuXG4vLyBUT0RPIHVwZGF0ZSBpbXBvcnQgcGF0aCBvbmNlIG9wIGlzIG1vZHVsYXJpemVkLlxuaW1wb3J0IHtzdGVwfSBmcm9tICcuLi8uLi9vcHMvb3BzJztcbmltcG9ydCB7Z2V0R2xvYmFsVGVuc29yQ2xhc3MsIFRlbnNvcn0gZnJvbSAnLi4vLi4vdGVuc29yJztcbmltcG9ydCB7UmFua30gZnJvbSAnLi4vLi4vdHlwZXMnO1xuXG5kZWNsYXJlIG1vZHVsZSAnLi4vLi4vdGVuc29yJyB7XG4gIGludGVyZmFjZSBUZW5zb3I8UiBleHRlbmRzIFJhbmsgPSBSYW5rPiB7XG4gICAgc3RlcDxUIGV4dGVuZHMgVGVuc29yPih0aGlzOiBULCBhbHBoYT86IG51bWJlcik6IFQ7XG4gIH1cbn1cblxuZ2V0R2xvYmFsVGVuc29yQ2xhc3MoKS5wcm90b3R5cGUuc3RlcCA9IGZ1bmN0aW9uPFQgZXh0ZW5kcyBUZW5zb3I+KFxuICAgIHRoaXM6IFQsIGFscGhhPzogbnVtYmVyKSB7XG4gIHRoaXMudGhyb3dJZkRpc3Bvc2VkKCk7XG4gIHJldHVybiBzdGVwKHRoaXMsIGFscGhhKTtcbn07XG4iXX0=","/**\n * @license\n * Copyright 2020 Google LLC. All Rights Reserved.\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n * =============================================================================\n */\n// TODO update import path once op is modularized.\nimport { stridedSlice } from '../../ops/ops';\nimport { getGlobalTensorClass } from '../../tensor';\ngetGlobalTensorClass().prototype.stridedSlice = function (begin, end, strides, beginMask, endMask, ellipsisMask, newAxisMask, shrinkAxisMask) {\n this.throwIfDisposed();\n return stridedSlice(this, begin, end, strides, beginMask, endMask, ellipsisMask, newAxisMask, shrinkAxisMask);\n};\n//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic3RyaWRlZF9zbGljZS5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uLy4uLy4uL3RmanMtY29yZS9zcmMvcHVibGljL2NoYWluZWRfb3BzL3N0cmlkZWRfc2xpY2UudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUE7Ozs7Ozs7Ozs7Ozs7OztHQWVHO0FBRUgsa0RBQWtEO0FBQ2xELE9BQU8sRUFBQyxZQUFZLEVBQUMsTUFBTSxlQUFlLENBQUM7QUFDM0MsT0FBTyxFQUFDLG9CQUFvQixFQUFTLE1BQU0sY0FBYyxDQUFDO0FBWTFELG9CQUFvQixFQUFFLENBQUMsU0FBUyxDQUFDLFlBQVksR0FBRyxVQUM5QixLQUFlLEVBQUUsR0FBYSxFQUFFLE9BQWlCLEVBQy9ELFNBQWtCLEVBQUUsT0FBZ0IsRUFBRSxZQUFxQixFQUMzRCxXQUFvQixFQUFFLGNBQXVCO0lBQy9DLElBQUksQ0FBQyxlQUFlLEVBQUUsQ0FBQztJQUN2QixPQUFPLFlBQVksQ0FDUixJQUFJLEVBQUUsS0FBSyxFQUFFLEdBQUcsRUFBRSxPQUFPLEVBQUUsU0FBUyxFQUFFLE9BQU8sRUFBRSxZQUFZLEVBQzNELFdBQVcsRUFBRSxjQUFjLENBQU0sQ0FBQztBQUMvQyxDQUFDLENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyIvKipcbiAqIEBsaWNlbnNlXG4gKiBDb3B5cmlnaHQgMjAyMCBHb29nbGUgTExDLiBBbGwgUmlnaHRzIFJlc2VydmVkLlxuICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlIFwiTGljZW5zZVwiKTtcbiAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS5cbiAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdFxuICpcbiAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMFxuICpcbiAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmVcbiAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuIFwiQVMgSVNcIiBCQVNJUyxcbiAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLlxuICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZFxuICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuXG4gKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuICovXG5cbi8vIFRPRE8gdXBkYXRlIGltcG9ydCBwYXRoIG9uY2Ugb3AgaXMgbW9kdWxhcml6ZWQuXG5pbXBvcnQge3N0cmlkZWRTbGljZX0gZnJvbSAnLi4vLi4vb3BzL29wcyc7XG5pbXBvcnQge2dldEdsb2JhbFRlbnNvckNsYXNzLCBUZW5zb3J9IGZyb20gJy4uLy4uL3RlbnNvcic7XG5pbXBvcnQge1Jhbmt9IGZyb20gJy4uLy4uL3R5cGVzJztcblxuZGVjbGFyZSBtb2R1bGUgJy4uLy4uL3RlbnNvcicge1xuICBpbnRlcmZhY2UgVGVuc29yPFIgZXh0ZW5kcyBSYW5rID0gUmFuaz4ge1xuICAgIHN0cmlkZWRTbGljZTxUIGV4dGVuZHMgVGVuc29yPihcbiAgICAgICAgdGhpczogVGVuc29yLCBiZWdpbjogbnVtYmVyW10sIGVuZDogbnVtYmVyW10sIHN0cmlkZXM6IG51bWJlcltdLFxuICAgICAgICBiZWdpbk1hc2s/OiBudW1iZXIsIGVuZE1hc2s/OiBudW1iZXIsIGVsbGlwc2lzTWFzaz86IG51bWJlcixcbiAgICAgICAgbmV3QXhpc01hc2s/OiBudW1iZXIsIHNocmlua0F4aXNNYXNrPzogbnVtYmVyKTogVGVuc29yO1xuICB9XG59XG5cbmdldEdsb2JhbFRlbnNvckNsYXNzKCkucHJvdG90eXBlLnN0cmlkZWRTbGljZSA9IGZ1bmN0aW9uPFQgZXh0ZW5kcyBUZW5zb3I+KFxuICAgIHRoaXM6IFRlbnNvciwgYmVnaW46IG51bWJlcltdLCBlbmQ6IG51bWJlcltdLCBzdHJpZGVzOiBudW1iZXJbXSxcbiAgICBiZWdpbk1hc2s/OiBudW1iZXIsIGVuZE1hc2s/OiBudW1iZXIsIGVsbGlwc2lzTWFzaz86IG51bWJlcixcbiAgICBuZXdBeGlzTWFzaz86IG51bWJlciwgc2hyaW5rQXhpc01hc2s/OiBudW1iZXIpOiBUIHtcbiAgdGhpcy50aHJvd0lmRGlzcG9zZWQoKTtcbiAgcmV0dXJuIHN0cmlkZWRTbGljZShcbiAgICAgICAgICAgICB0aGlzLCBiZWdpbiwgZW5kLCBzdHJpZGVzLCBiZWdpbk1hc2ssIGVuZE1hc2ssIGVsbGlwc2lzTWFzayxcbiAgICAgICAgICAgICBuZXdBeGlzTWFzaywgc2hyaW5rQXhpc01hc2spIGFzIFQ7XG59O1xuIl19","/**\n * @license\n * Copyright 2020 Google LLC. All Rights Reserved.\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n * =============================================================================\n */\nimport { sub } from '../../ops/sub';\nimport { getGlobalTensorClass } from '../../tensor';\ngetGlobalTensorClass().prototype.sub = function (b) {\n this.throwIfDisposed();\n return sub(this, b);\n};\n//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic3ViLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vLi4vLi4vdGZqcy1jb3JlL3NyYy9wdWJsaWMvY2hhaW5lZF9vcHMvc3ViLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBOzs7Ozs7Ozs7Ozs7Ozs7R0FlRztBQUNILE9BQU8sRUFBQyxHQUFHLEVBQUMsTUFBTSxlQUFlLENBQUM7QUFDbEMsT0FBTyxFQUFDLG9CQUFvQixFQUFTLE1BQU0sY0FBYyxDQUFDO0FBUzFELG9CQUFvQixFQUFFLENBQUMsU0FBUyxDQUFDLEdBQUcsR0FBRyxVQUNuQyxDQUFvQjtJQUN0QixJQUFJLENBQUMsZUFBZSxFQUFFLENBQUM7SUFDdkIsT0FBTyxHQUFHLENBQUMsSUFBSSxFQUFFLENBQUMsQ0FBQyxDQUFDO0FBQ3RCLENBQUMsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbIi8qKlxuICogQGxpY2Vuc2VcbiAqIENvcHlyaWdodCAyMDIwIEdvb2dsZSBMTEMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuXG4gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgXCJMaWNlbnNlXCIpO1xuICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLlxuICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0XG4gKlxuICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wXG4gKlxuICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZVxuICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gXCJBUyBJU1wiIEJBU0lTLFxuICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuXG4gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kXG4gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS5cbiAqID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4gKi9cbmltcG9ydCB7c3VifSBmcm9tICcuLi8uLi9vcHMvc3ViJztcbmltcG9ydCB7Z2V0R2xvYmFsVGVuc29yQ2xhc3MsIFRlbnNvcn0gZnJvbSAnLi4vLi4vdGVuc29yJztcbmltcG9ydCB7UmFuaywgVGVuc29yTGlrZX0gZnJvbSAnLi4vLi4vdHlwZXMnO1xuXG5kZWNsYXJlIG1vZHVsZSAnLi4vLi4vdGVuc29yJyB7XG4gIGludGVyZmFjZSBUZW5zb3I8UiBleHRlbmRzIFJhbmsgPSBSYW5rPiB7XG4gICAgc3ViPFQgZXh0ZW5kcyBUZW5zb3I+KGI6IFRlbnNvcnxUZW5zb3JMaWtlKTogVDtcbiAgfVxufVxuXG5nZXRHbG9iYWxUZW5zb3JDbGFzcygpLnByb3RvdHlwZS5zdWIgPSBmdW5jdGlvbjxUIGV4dGVuZHMgVGVuc29yPihcbiAgICBiOiBUZW5zb3J8VGVuc29yTGlrZSk6IFQge1xuICB0aGlzLnRocm93SWZEaXNwb3NlZCgpO1xuICByZXR1cm4gc3ViKHRoaXMsIGIpO1xufTtcbiJdfQ==","/**\n * @license\n * Copyright 2020 Google LLC. All Rights Reserved.\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n * =============================================================================\n */\nimport { sum } from '../../ops/sum';\nimport { getGlobalTensorClass } from '../../tensor';\ngetGlobalTensorClass().prototype.sum = function (axis, keepDims) {\n this.throwIfDisposed();\n return sum(this, axis, keepDims);\n};\n//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic3VtLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vLi4vLi4vdGZqcy1jb3JlL3NyYy9wdWJsaWMvY2hhaW5lZF9vcHMvc3VtLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBOzs7Ozs7Ozs7Ozs7Ozs7R0FlRztBQUNILE9BQU8sRUFBQyxHQUFHLEVBQUMsTUFBTSxlQUFlLENBQUM7QUFDbEMsT0FBTyxFQUFDLG9CQUFvQixFQUFTLE1BQU0sY0FBYyxDQUFDO0FBUzFELG9CQUFvQixFQUFFLENBQUMsU0FBUyxDQUFDLEdBQUcsR0FBRyxVQUNuQyxJQUFzQixFQUFFLFFBQWtCO0lBQzVDLElBQUksQ0FBQyxlQUFlLEVBQUUsQ0FBQztJQUN2QixPQUFPLEdBQUcsQ0FBQyxJQUFJLEVBQUUsSUFBSSxFQUFFLFFBQVEsQ0FBQyxDQUFDO0FBQ25DLENBQUMsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbIi8qKlxuICogQGxpY2Vuc2VcbiAqIENvcHlyaWdodCAyMDIwIEdvb2dsZSBMTEMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuXG4gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgXCJMaWNlbnNlXCIpO1xuICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLlxuICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0XG4gKlxuICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wXG4gKlxuICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZVxuICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gXCJBUyBJU1wiIEJBU0lTLFxuICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuXG4gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kXG4gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS5cbiAqID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4gKi9cbmltcG9ydCB7c3VtfSBmcm9tICcuLi8uLi9vcHMvc3VtJztcbmltcG9ydCB7Z2V0R2xvYmFsVGVuc29yQ2xhc3MsIFRlbnNvcn0gZnJvbSAnLi4vLi4vdGVuc29yJztcbmltcG9ydCB7UmFua30gZnJvbSAnLi4vLi4vdHlwZXMnO1xuXG5kZWNsYXJlIG1vZHVsZSAnLi4vLi4vdGVuc29yJyB7XG4gIGludGVyZmFjZSBUZW5zb3I8UiBleHRlbmRzIFJhbmsgPSBSYW5rPiB7XG4gICAgc3VtPFQgZXh0ZW5kcyBUZW5zb3I+KGF4aXM/OiBudW1iZXJ8bnVtYmVyW10sIGtlZXBEaW1zPzogYm9vbGVhbik6IFQ7XG4gIH1cbn1cblxuZ2V0R2xvYmFsVGVuc29yQ2xhc3MoKS5wcm90b3R5cGUuc3VtID0gZnVuY3Rpb248VCBleHRlbmRzIFRlbnNvcj4oXG4gICAgYXhpcz86IG51bWJlcnxudW1iZXJbXSwga2VlcERpbXM/OiBib29sZWFuKTogVCB7XG4gIHRoaXMudGhyb3dJZkRpc3Bvc2VkKCk7XG4gIHJldHVybiBzdW0odGhpcywgYXhpcywga2VlcERpbXMpO1xufTtcbiJdfQ==","/**\n * @license\n * Copyright 2020 Google LLC. All Rights Reserved.\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n * =============================================================================\n */\n// TODO update import path once op is modularized.\nimport { tan } from '../../ops/ops';\nimport { getGlobalTensorClass } from '../../tensor';\ngetGlobalTensorClass().prototype.tan = function () {\n this.throwIfDisposed();\n return tan(this);\n};\n//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidGFuLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vLi4vLi4vdGZqcy1jb3JlL3NyYy9wdWJsaWMvY2hhaW5lZF9vcHMvdGFuLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBOzs7Ozs7Ozs7Ozs7Ozs7R0FlRztBQUVILGtEQUFrRDtBQUNsRCxPQUFPLEVBQUMsR0FBRyxFQUFDLE1BQU0sZUFBZSxDQUFDO0FBQ2xDLE9BQU8sRUFBQyxvQkFBb0IsRUFBUyxNQUFNLGNBQWMsQ0FBQztBQVMxRCxvQkFBb0IsRUFBRSxDQUFDLFNBQVMsQ0FBQyxHQUFHLEdBQUc7SUFDckMsSUFBSSxDQUFDLGVBQWUsRUFBRSxDQUFDO0lBQ3ZCLE9BQU8sR0FBRyxDQUFDLElBQUksQ0FBQyxDQUFDO0FBQ25CLENBQUMsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbIi8qKlxuICogQGxpY2Vuc2VcbiAqIENvcHlyaWdodCAyMDIwIEdvb2dsZSBMTEMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuXG4gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgXCJMaWNlbnNlXCIpO1xuICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLlxuICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0XG4gKlxuICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wXG4gKlxuICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZVxuICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gXCJBUyBJU1wiIEJBU0lTLFxuICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuXG4gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kXG4gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS5cbiAqID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4gKi9cblxuLy8gVE9ETyB1cGRhdGUgaW1wb3J0IHBhdGggb25jZSBvcCBpcyBtb2R1bGFyaXplZC5cbmltcG9ydCB7dGFufSBmcm9tICcuLi8uLi9vcHMvb3BzJztcbmltcG9ydCB7Z2V0R2xvYmFsVGVuc29yQ2xhc3MsIFRlbnNvcn0gZnJvbSAnLi4vLi4vdGVuc29yJztcbmltcG9ydCB7UmFua30gZnJvbSAnLi4vLi4vdHlwZXMnO1xuXG5kZWNsYXJlIG1vZHVsZSAnLi4vLi4vdGVuc29yJyB7XG4gIGludGVyZmFjZSBUZW5zb3I8UiBleHRlbmRzIFJhbmsgPSBSYW5rPiB7XG4gICAgdGFuPFQgZXh0ZW5kcyBUZW5zb3I+KHRoaXM6IFQpOiBUO1xuICB9XG59XG5cbmdldEdsb2JhbFRlbnNvckNsYXNzKCkucHJvdG90eXBlLnRhbiA9IGZ1bmN0aW9uPFQgZXh0ZW5kcyBUZW5zb3I+KHRoaXM6IFQpOiBUIHtcbiAgdGhpcy50aHJvd0lmRGlzcG9zZWQoKTtcbiAgcmV0dXJuIHRhbih0aGlzKTtcbn07XG4iXX0=","/**\n * @license\n * Copyright 2020 Google LLC. All Rights Reserved.\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n * =============================================================================\n */\n// TODO update import path once op is modularized.\nimport { tanh } from '../../ops/ops';\nimport { getGlobalTensorClass } from '../../tensor';\ngetGlobalTensorClass().prototype.tanh = function () {\n this.throwIfDisposed();\n return tanh(this);\n};\n//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidGFuaC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uLy4uLy4uL3RmanMtY29yZS9zcmMvcHVibGljL2NoYWluZWRfb3BzL3RhbmgudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUE7Ozs7Ozs7Ozs7Ozs7OztHQWVHO0FBRUgsa0RBQWtEO0FBQ2xELE9BQU8sRUFBQyxJQUFJLEVBQUMsTUFBTSxlQUFlLENBQUM7QUFDbkMsT0FBTyxFQUFDLG9CQUFvQixFQUFTLE1BQU0sY0FBYyxDQUFDO0FBUzFELG9CQUFvQixFQUFFLENBQUMsU0FBUyxDQUFDLElBQUksR0FBRztJQUN0QyxJQUFJLENBQUMsZUFBZSxFQUFFLENBQUM7SUFDdkIsT0FBTyxJQUFJLENBQUMsSUFBSSxDQUFDLENBQUM7QUFDcEIsQ0FBQyxDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiLyoqXG4gKiBAbGljZW5zZVxuICogQ29weXJpZ2h0IDIwMjAgR29vZ2xlIExMQy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC5cbiAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSBcIkxpY2Vuc2VcIik7XG4gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuXG4gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXRcbiAqXG4gKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjBcbiAqXG4gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlXG4gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiBcIkFTIElTXCIgQkFTSVMsXG4gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC5cbiAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmRcbiAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLlxuICogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbiAqL1xuXG4vLyBUT0RPIHVwZGF0ZSBpbXBvcnQgcGF0aCBvbmNlIG9wIGlzIG1vZHVsYXJpemVkLlxuaW1wb3J0IHt0YW5ofSBmcm9tICcuLi8uLi9vcHMvb3BzJztcbmltcG9ydCB7Z2V0R2xvYmFsVGVuc29yQ2xhc3MsIFRlbnNvcn0gZnJvbSAnLi4vLi4vdGVuc29yJztcbmltcG9ydCB7UmFua30gZnJvbSAnLi4vLi4vdHlwZXMnO1xuXG5kZWNsYXJlIG1vZHVsZSAnLi4vLi4vdGVuc29yJyB7XG4gIGludGVyZmFjZSBUZW5zb3I8UiBleHRlbmRzIFJhbmsgPSBSYW5rPiB7XG4gICAgdGFuaDxUIGV4dGVuZHMgVGVuc29yPih0aGlzOiBUKTogVDtcbiAgfVxufVxuXG5nZXRHbG9iYWxUZW5zb3JDbGFzcygpLnByb3RvdHlwZS50YW5oID0gZnVuY3Rpb248VCBleHRlbmRzIFRlbnNvcj4odGhpczogVCk6IFQge1xuICB0aGlzLnRocm93SWZEaXNwb3NlZCgpO1xuICByZXR1cm4gdGFuaCh0aGlzKTtcbn07XG4iXX0=","/**\n * @license\n * Copyright 2020 Google LLC. All Rights Reserved.\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n * =============================================================================\n */\nimport { tile } from '../../ops/tile';\nimport { getGlobalTensorClass } from '../../tensor';\ngetGlobalTensorClass().prototype.tile = function (reps) {\n this.throwIfDisposed();\n return tile(this, reps);\n};\n//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidGlsZS5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uLy4uLy4uL3RmanMtY29yZS9zcmMvcHVibGljL2NoYWluZWRfb3BzL3RpbGUudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUE7Ozs7Ozs7Ozs7Ozs7OztHQWVHO0FBRUgsT0FBTyxFQUFDLElBQUksRUFBQyxNQUFNLGdCQUFnQixDQUFDO0FBQ3BDLE9BQU8sRUFBQyxvQkFBb0IsRUFBUyxNQUFNLGNBQWMsQ0FBQztBQVMxRCxvQkFBb0IsRUFBRSxDQUFDLFNBQVMsQ0FBQyxJQUFJLEdBQUcsVUFDcEMsSUFBYztJQUNoQixJQUFJLENBQUMsZUFBZSxFQUFFLENBQUM7SUFDdkIsT0FBTyxJQUFJLENBQUMsSUFBSSxFQUFFLElBQUksQ0FBTSxDQUFDO0FBQy9CLENBQUMsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbIi8qKlxuICogQGxpY2Vuc2VcbiAqIENvcHlyaWdodCAyMDIwIEdvb2dsZSBMTEMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuXG4gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgXCJMaWNlbnNlXCIpO1xuICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLlxuICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0XG4gKlxuICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wXG4gKlxuICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZVxuICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gXCJBUyBJU1wiIEJBU0lTLFxuICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuXG4gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kXG4gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS5cbiAqID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4gKi9cblxuaW1wb3J0IHt0aWxlfSBmcm9tICcuLi8uLi9vcHMvdGlsZSc7XG5pbXBvcnQge2dldEdsb2JhbFRlbnNvckNsYXNzLCBUZW5zb3J9IGZyb20gJy4uLy4uL3RlbnNvcic7XG5pbXBvcnQge1Jhbmt9IGZyb20gJy4uLy4uL3R5cGVzJztcblxuZGVjbGFyZSBtb2R1bGUgJy4uLy4uL3RlbnNvcicge1xuICBpbnRlcmZhY2UgVGVuc29yPFIgZXh0ZW5kcyBSYW5rID0gUmFuaz4ge1xuICAgIHRpbGU8VCBleHRlbmRzIFRlbnNvcj4oYjogbnVtYmVyW10pOiBUO1xuICB9XG59XG5cbmdldEdsb2JhbFRlbnNvckNsYXNzKCkucHJvdG90eXBlLnRpbGUgPSBmdW5jdGlvbjxUIGV4dGVuZHMgVGVuc29yPihcbiAgICByZXBzOiBudW1iZXJbXSk6IFQge1xuICB0aGlzLnRocm93SWZEaXNwb3NlZCgpO1xuICByZXR1cm4gdGlsZSh0aGlzLCByZXBzKSBhcyBUO1xufTtcbiJdfQ==","/**\n * @license\n * Copyright 2020 Google LLC. All Rights Reserved.\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n * =============================================================================\n */\n// TODO update import path once op is modularized.\nimport { cast } from '../../ops/ops';\nimport { getGlobalTensorClass } from '../../tensor';\n/**\n * Casts the array to type `bool`\n *\n * @doc {heading: 'Tensors', subheading: 'Classes'}\n */\ngetGlobalTensorClass().prototype.toBool = function () {\n this.throwIfDisposed();\n return cast(this, 'bool');\n};\n//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidG9fYm9vbC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uLy4uLy4uL3RmanMtY29yZS9zcmMvcHVibGljL2NoYWluZWRfb3BzL3RvX2Jvb2wudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUE7Ozs7Ozs7Ozs7Ozs7OztHQWVHO0FBRUgsa0RBQWtEO0FBQ2xELE9BQU8sRUFBQyxJQUFJLEVBQUMsTUFBTSxlQUFlLENBQUM7QUFDbkMsT0FBTyxFQUFDLG9CQUFvQixFQUFTLE1BQU0sY0FBYyxDQUFDO0FBUzFEOzs7O0dBSUc7QUFDSCxvQkFBb0IsRUFBRSxDQUFDLFNBQVMsQ0FBQyxNQUFNLEdBQUc7SUFFeEMsSUFBSSxDQUFDLGVBQWUsRUFBRSxDQUFDO0lBQ3ZCLE9BQU8sSUFBSSxDQUFJLElBQUksRUFBRSxNQUFNLENBQUMsQ0FBQztBQUMvQixDQUFDLENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyIvKipcbiAqIEBsaWNlbnNlXG4gKiBDb3B5cmlnaHQgMjAyMCBHb29nbGUgTExDLiBBbGwgUmlnaHRzIFJlc2VydmVkLlxuICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlIFwiTGljZW5zZVwiKTtcbiAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS5cbiAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdFxuICpcbiAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMFxuICpcbiAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmVcbiAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuIFwiQVMgSVNcIiBCQVNJUyxcbiAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLlxuICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZFxuICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuXG4gKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuICovXG5cbi8vIFRPRE8gdXBkYXRlIGltcG9ydCBwYXRoIG9uY2Ugb3AgaXMgbW9kdWxhcml6ZWQuXG5pbXBvcnQge2Nhc3R9IGZyb20gJy4uLy4uL29wcy9vcHMnO1xuaW1wb3J0IHtnZXRHbG9iYWxUZW5zb3JDbGFzcywgVGVuc29yfSBmcm9tICcuLi8uLi90ZW5zb3InO1xuaW1wb3J0IHtSYW5rfSBmcm9tICcuLi8uLi90eXBlcyc7XG5cbmRlY2xhcmUgbW9kdWxlICcuLi8uLi90ZW5zb3InIHtcbiAgaW50ZXJmYWNlIFRlbnNvcjxSIGV4dGVuZHMgUmFuayA9IFJhbms+IHtcbiAgICB0b0Jvb2w8VCBleHRlbmRzIFRlbnNvcj4odGhpczogVCk6IFQ7XG4gIH1cbn1cblxuLyoqXG4gKiBDYXN0cyB0aGUgYXJyYXkgdG8gdHlwZSBgYm9vbGBcbiAqXG4gKiBAZG9jIHtoZWFkaW5nOiAnVGVuc29ycycsIHN1YmhlYWRpbmc6ICdDbGFzc2VzJ31cbiAqL1xuZ2V0R2xvYmFsVGVuc29yQ2xhc3MoKS5wcm90b3R5cGUudG9Cb29sID0gZnVuY3Rpb248VCBleHRlbmRzIFRlbnNvcj4odGhpczogVCk6XG4gICAgVCB7XG4gIHRoaXMudGhyb3dJZkRpc3Bvc2VkKCk7XG4gIHJldHVybiBjYXN0PFQ+KHRoaXMsICdib29sJyk7XG59O1xuIl19","/**\n * @license\n * Copyright 2020 Google LLC. All Rights Reserved.\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n * =============================================================================\n */\n// TODO update import path once op is modularized.\nimport { cast } from '../../ops/ops';\nimport { getGlobalTensorClass } from '../../tensor';\n/**\n * Casts the array to type `float32`\n *\n * @doc {heading: 'Tensors', subheading: 'Classes'}\n */\ngetGlobalTensorClass().prototype.toFloat = function () {\n this.throwIfDisposed();\n return cast(this, 'float32');\n};\n//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidG9fZmxvYXQuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi8uLi8uLi90ZmpzLWNvcmUvc3JjL3B1YmxpYy9jaGFpbmVkX29wcy90b19mbG9hdC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQTs7Ozs7Ozs7Ozs7Ozs7O0dBZUc7QUFFSCxrREFBa0Q7QUFDbEQsT0FBTyxFQUFDLElBQUksRUFBQyxNQUFNLGVBQWUsQ0FBQztBQUNuQyxPQUFPLEVBQUMsb0JBQW9CLEVBQVMsTUFBTSxjQUFjLENBQUM7QUFTMUQ7Ozs7R0FJRztBQUNILG9CQUFvQixFQUFFLENBQUMsU0FBUyxDQUFDLE9BQU8sR0FBRztJQUV6QyxJQUFJLENBQUMsZUFBZSxFQUFFLENBQUM7SUFDdkIsT0FBTyxJQUFJLENBQUksSUFBSSxFQUFFLFNBQVMsQ0FBQyxDQUFDO0FBQ2xDLENBQUMsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbIi8qKlxuICogQGxpY2Vuc2VcbiAqIENvcHlyaWdodCAyMDIwIEdvb2dsZSBMTEMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuXG4gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgXCJMaWNlbnNlXCIpO1xuICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLlxuICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0XG4gKlxuICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wXG4gKlxuICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZVxuICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gXCJBUyBJU1wiIEJBU0lTLFxuICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuXG4gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kXG4gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS5cbiAqID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4gKi9cblxuLy8gVE9ETyB1cGRhdGUgaW1wb3J0IHBhdGggb25jZSBvcCBpcyBtb2R1bGFyaXplZC5cbmltcG9ydCB7Y2FzdH0gZnJvbSAnLi4vLi4vb3BzL29wcyc7XG5pbXBvcnQge2dldEdsb2JhbFRlbnNvckNsYXNzLCBUZW5zb3J9IGZyb20gJy4uLy4uL3RlbnNvcic7XG5pbXBvcnQge1Jhbmt9IGZyb20gJy4uLy4uL3R5cGVzJztcblxuZGVjbGFyZSBtb2R1bGUgJy4uLy4uL3RlbnNvcicge1xuICBpbnRlcmZhY2UgVGVuc29yPFIgZXh0ZW5kcyBSYW5rID0gUmFuaz4ge1xuICAgIHRvRmxvYXQ8VCBleHRlbmRzIFRlbnNvcj4odGhpczogVCk6IFQ7XG4gIH1cbn1cblxuLyoqXG4gKiBDYXN0cyB0aGUgYXJyYXkgdG8gdHlwZSBgZmxvYXQzMmBcbiAqXG4gKiBAZG9jIHtoZWFkaW5nOiAnVGVuc29ycycsIHN1YmhlYWRpbmc6ICdDbGFzc2VzJ31cbiAqL1xuZ2V0R2xvYmFsVGVuc29yQ2xhc3MoKS5wcm90b3R5cGUudG9GbG9hdCA9IGZ1bmN0aW9uPFQgZXh0ZW5kcyBUZW5zb3I+KHRoaXM6IFQpOlxuICAgIFQge1xuICB0aGlzLnRocm93SWZEaXNwb3NlZCgpO1xuICByZXR1cm4gY2FzdDxUPih0aGlzLCAnZmxvYXQzMicpO1xufTtcbiJdfQ==","/**\n * @license\n * Copyright 2020 Google LLC. All Rights Reserved.\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n * =============================================================================\n */\n// TODO update import path once op is modularized.\nimport { cast } from '../../ops/ops';\nimport { getGlobalTensorClass } from '../../tensor';\n/**\n * Casts the array to type `int32`\n *\n * @doc {heading: 'Tensors', subheading: 'Classes'}\n */\ngetGlobalTensorClass().prototype.toInt = function () {\n this.throwIfDisposed();\n return cast(this, 'int32');\n};\n//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidG9faW50LmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vLi4vLi4vdGZqcy1jb3JlL3NyYy9wdWJsaWMvY2hhaW5lZF9vcHMvdG9faW50LnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBOzs7Ozs7Ozs7Ozs7Ozs7R0FlRztBQUVILGtEQUFrRDtBQUNsRCxPQUFPLEVBQUMsSUFBSSxFQUFDLE1BQU0sZUFBZSxDQUFDO0FBQ25DLE9BQU8sRUFBQyxvQkFBb0IsRUFBUyxNQUFNLGNBQWMsQ0FBQztBQVMxRDs7OztHQUlHO0FBQ0gsb0JBQW9CLEVBQUUsQ0FBQyxTQUFTLENBQUMsS0FBSyxHQUFHO0lBRXZDLElBQUksQ0FBQyxlQUFlLEVBQUUsQ0FBQztJQUN2QixPQUFPLElBQUksQ0FBSSxJQUFJLEVBQUUsT0FBTyxDQUFDLENBQUM7QUFDaEMsQ0FBQyxDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiLyoqXG4gKiBAbGljZW5zZVxuICogQ29weXJpZ2h0IDIwMjAgR29vZ2xlIExMQy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC5cbiAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSBcIkxpY2Vuc2VcIik7XG4gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuXG4gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXRcbiAqXG4gKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjBcbiAqXG4gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlXG4gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiBcIkFTIElTXCIgQkFTSVMsXG4gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC5cbiAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmRcbiAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLlxuICogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbiAqL1xuXG4vLyBUT0RPIHVwZGF0ZSBpbXBvcnQgcGF0aCBvbmNlIG9wIGlzIG1vZHVsYXJpemVkLlxuaW1wb3J0IHtjYXN0fSBmcm9tICcuLi8uLi9vcHMvb3BzJztcbmltcG9ydCB7Z2V0R2xvYmFsVGVuc29yQ2xhc3MsIFRlbnNvcn0gZnJvbSAnLi4vLi4vdGVuc29yJztcbmltcG9ydCB7UmFua30gZnJvbSAnLi4vLi4vdHlwZXMnO1xuXG5kZWNsYXJlIG1vZHVsZSAnLi4vLi4vdGVuc29yJyB7XG4gIGludGVyZmFjZSBUZW5zb3I8UiBleHRlbmRzIFJhbmsgPSBSYW5rPiB7XG4gICAgdG9JbnQ8VCBleHRlbmRzIFRlbnNvcj4odGhpczogVCk6IFQ7XG4gIH1cbn1cblxuLyoqXG4gKiBDYXN0cyB0aGUgYXJyYXkgdG8gdHlwZSBgaW50MzJgXG4gKlxuICogQGRvYyB7aGVhZGluZzogJ1RlbnNvcnMnLCBzdWJoZWFkaW5nOiAnQ2xhc3Nlcyd9XG4gKi9cbmdldEdsb2JhbFRlbnNvckNsYXNzKCkucHJvdG90eXBlLnRvSW50ID0gZnVuY3Rpb248VCBleHRlbmRzIFRlbnNvcj4odGhpczogVCk6XG4gICAgVCB7XG4gIHRoaXMudGhyb3dJZkRpc3Bvc2VkKCk7XG4gIHJldHVybiBjYXN0PFQ+KHRoaXMsICdpbnQzMicpO1xufTtcbiJdfQ==","/**\n * @license\n * Copyright 2020 Google LLC. All Rights Reserved.\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n * =============================================================================\n */\nimport { topk } from '../../ops/topk';\nimport { getGlobalTensorClass } from '../../tensor';\ngetGlobalTensorClass().prototype.topk = function (k, sorted) {\n this.throwIfDisposed();\n return topk(this, k, sorted);\n};\n//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidG9way5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uLy4uLy4uL3RmanMtY29yZS9zcmMvcHVibGljL2NoYWluZWRfb3BzL3RvcGsudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUE7Ozs7Ozs7Ozs7Ozs7OztHQWVHO0FBRUgsT0FBTyxFQUFDLElBQUksRUFBQyxNQUFNLGdCQUFnQixDQUFDO0FBQ3BDLE9BQU8sRUFBQyxvQkFBb0IsRUFBUyxNQUFNLGNBQWMsQ0FBQztBQVUxRCxvQkFBb0IsRUFBRSxDQUFDLFNBQVMsQ0FBQyxJQUFJLEdBQUcsVUFDM0IsQ0FBVSxFQUFFLE1BQWdCO0lBQ3ZDLElBQUksQ0FBQyxlQUFlLEVBQUUsQ0FBQztJQUN2QixPQUFPLElBQUksQ0FBQyxJQUFJLEVBQUUsQ0FBQyxFQUFFLE1BQU0sQ0FBNEIsQ0FBQztBQUMxRCxDQUFDLENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyIvKipcbiAqIEBsaWNlbnNlXG4gKiBDb3B5cmlnaHQgMjAyMCBHb29nbGUgTExDLiBBbGwgUmlnaHRzIFJlc2VydmVkLlxuICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlIFwiTGljZW5zZVwiKTtcbiAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS5cbiAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdFxuICpcbiAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMFxuICpcbiAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmVcbiAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuIFwiQVMgSVNcIiBCQVNJUyxcbiAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLlxuICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZFxuICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuXG4gKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuICovXG5cbmltcG9ydCB7dG9wa30gZnJvbSAnLi4vLi4vb3BzL3RvcGsnO1xuaW1wb3J0IHtnZXRHbG9iYWxUZW5zb3JDbGFzcywgVGVuc29yfSBmcm9tICcuLi8uLi90ZW5zb3InO1xuaW1wb3J0IHtSYW5rfSBmcm9tICcuLi8uLi90eXBlcyc7XG5cbmRlY2xhcmUgbW9kdWxlICcuLi8uLi90ZW5zb3InIHtcbiAgaW50ZXJmYWNlIFRlbnNvcjxSIGV4dGVuZHMgUmFuayA9IFJhbms+IHtcbiAgICB0b3BrPFQgZXh0ZW5kcyBUZW5zb3I+KHRoaXM6IFQsIGs/OiBudW1iZXIsIHNvcnRlZD86IGJvb2xlYW4pOlxuICAgICAgICB7dmFsdWVzOiBULCBpbmRpY2VzOiBUfTtcbiAgfVxufVxuXG5nZXRHbG9iYWxUZW5zb3JDbGFzcygpLnByb3RvdHlwZS50b3BrID0gZnVuY3Rpb248VCBleHRlbmRzIFRlbnNvcj4oXG4gICAgdGhpczogVCwgaz86IG51bWJlciwgc29ydGVkPzogYm9vbGVhbik6IHt2YWx1ZXM6IFQsIGluZGljZXM6IFR9IHtcbiAgdGhpcy50aHJvd0lmRGlzcG9zZWQoKTtcbiAgcmV0dXJuIHRvcGsodGhpcywgaywgc29ydGVkKSBhcyB7dmFsdWVzOiBULCBpbmRpY2VzOiBUfTtcbn07XG4iXX0=","/**\n * @license\n * Copyright 2020 Google LLC. All Rights Reserved.\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n * =============================================================================\n */\nimport { transpose } from '../../ops/transpose';\nimport { getGlobalTensorClass } from '../../tensor';\ngetGlobalTensorClass().prototype.transpose = function (perm) {\n this.throwIfDisposed();\n return transpose(this, perm);\n};\n//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidHJhbnNwb3NlLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vLi4vLi4vdGZqcy1jb3JlL3NyYy9wdWJsaWMvY2hhaW5lZF9vcHMvdHJhbnNwb3NlLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBOzs7Ozs7Ozs7Ozs7Ozs7R0FlRztBQUVILE9BQU8sRUFBQyxTQUFTLEVBQUMsTUFBTSxxQkFBcUIsQ0FBQztBQUM5QyxPQUFPLEVBQUMsb0JBQW9CLEVBQVMsTUFBTSxjQUFjLENBQUM7QUFTMUQsb0JBQW9CLEVBQUUsQ0FBQyxTQUFTLENBQUMsU0FBUyxHQUFHLFVBQ2hDLElBQWU7SUFDMUIsSUFBSSxDQUFDLGVBQWUsRUFBRSxDQUFDO0lBQ3ZCLE9BQU8sU0FBUyxDQUFDLElBQUksRUFBRSxJQUFJLENBQUMsQ0FBQztBQUMvQixDQUFDLENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyIvKipcbiAqIEBsaWNlbnNlXG4gKiBDb3B5cmlnaHQgMjAyMCBHb29nbGUgTExDLiBBbGwgUmlnaHRzIFJlc2VydmVkLlxuICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlIFwiTGljZW5zZVwiKTtcbiAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS5cbiAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdFxuICpcbiAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMFxuICpcbiAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmVcbiAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuIFwiQVMgSVNcIiBCQVNJUyxcbiAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLlxuICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZFxuICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuXG4gKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuICovXG5cbmltcG9ydCB7dHJhbnNwb3NlfSBmcm9tICcuLi8uLi9vcHMvdHJhbnNwb3NlJztcbmltcG9ydCB7Z2V0R2xvYmFsVGVuc29yQ2xhc3MsIFRlbnNvcn0gZnJvbSAnLi4vLi4vdGVuc29yJztcbmltcG9ydCB7UmFua30gZnJvbSAnLi4vLi4vdHlwZXMnO1xuXG5kZWNsYXJlIG1vZHVsZSAnLi4vLi4vdGVuc29yJyB7XG4gIGludGVyZmFjZSBUZW5zb3I8UiBleHRlbmRzIFJhbmsgPSBSYW5rPiB7XG4gICAgdHJhbnNwb3NlPFQgZXh0ZW5kcyBUZW5zb3I+KHBlcm0/OiBudW1iZXJbXSk6IFQ7XG4gIH1cbn1cblxuZ2V0R2xvYmFsVGVuc29yQ2xhc3MoKS5wcm90b3R5cGUudHJhbnNwb3NlID0gZnVuY3Rpb248VCBleHRlbmRzIFRlbnNvcj4oXG4gICAgdGhpczogVCwgcGVybT86IG51bWJlcltdKTogVCB7XG4gIHRoaXMudGhyb3dJZkRpc3Bvc2VkKCk7XG4gIHJldHVybiB0cmFuc3Bvc2UodGhpcywgcGVybSk7XG59O1xuIl19","/**\n * @license\n * Copyright 2020 Google LLC. All Rights Reserved.\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n * =============================================================================\n */\nimport { unique } from '../../ops/unique';\nimport { getGlobalTensorClass } from '../../tensor';\ngetGlobalTensorClass().prototype.unique = function (axis) {\n this.throwIfDisposed();\n return unique(this, axis);\n};\n//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidW5pcXVlLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vLi4vLi4vdGZqcy1jb3JlL3NyYy9wdWJsaWMvY2hhaW5lZF9vcHMvdW5pcXVlLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBOzs7Ozs7Ozs7Ozs7Ozs7R0FlRztBQUVILE9BQU8sRUFBQyxNQUFNLEVBQUMsTUFBTSxrQkFBa0IsQ0FBQztBQUN4QyxPQUFPLEVBQUMsb0JBQW9CLEVBQVMsTUFBTSxjQUFjLENBQUM7QUFTMUQsb0JBQW9CLEVBQUUsQ0FBQyxTQUFTLENBQUMsTUFBTSxHQUFHLFVBQzdCLElBQWE7SUFDeEIsSUFBSSxDQUFDLGVBQWUsRUFBRSxDQUFDO0lBQ3ZCLE9BQU8sTUFBTSxDQUFDLElBQUksRUFBRSxJQUFJLENBQTRCLENBQUM7QUFDdkQsQ0FBQyxDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiLyoqXG4gKiBAbGljZW5zZVxuICogQ29weXJpZ2h0IDIwMjAgR29vZ2xlIExMQy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC5cbiAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSBcIkxpY2Vuc2VcIik7XG4gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuXG4gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXRcbiAqXG4gKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjBcbiAqXG4gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlXG4gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiBcIkFTIElTXCIgQkFTSVMsXG4gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC5cbiAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmRcbiAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLlxuICogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbiAqL1xuXG5pbXBvcnQge3VuaXF1ZX0gZnJvbSAnLi4vLi4vb3BzL3VuaXF1ZSc7XG5pbXBvcnQge2dldEdsb2JhbFRlbnNvckNsYXNzLCBUZW5zb3J9IGZyb20gJy4uLy4uL3RlbnNvcic7XG5pbXBvcnQge1Jhbmt9IGZyb20gJy4uLy4uL3R5cGVzJztcblxuZGVjbGFyZSBtb2R1bGUgJy4uLy4uL3RlbnNvcicge1xuICBpbnRlcmZhY2UgVGVuc29yPFIgZXh0ZW5kcyBSYW5rID0gUmFuaz4ge1xuICAgIHVuaXF1ZTxUIGV4dGVuZHMgVGVuc29yPih0aGlzOiBULCBheGlzPzogbnVtYmVyKToge3ZhbHVlczogVCwgaW5kaWNlczogVH07XG4gIH1cbn1cblxuZ2V0R2xvYmFsVGVuc29yQ2xhc3MoKS5wcm90b3R5cGUudW5pcXVlID0gZnVuY3Rpb248VCBleHRlbmRzIFRlbnNvcj4oXG4gICAgdGhpczogVCwgYXhpcz86IG51bWJlcik6IHt2YWx1ZXM6IFQsIGluZGljZXM6IFR9IHtcbiAgdGhpcy50aHJvd0lmRGlzcG9zZWQoKTtcbiAgcmV0dXJuIHVuaXF1ZSh0aGlzLCBheGlzKSBhcyB7dmFsdWVzOiBULCBpbmRpY2VzOiBUfTtcbn07XG4iXX0=","/**\n * @license\n * Copyright 2020 Google LLC. All Rights Reserved.\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n * =============================================================================\n */\nimport { unsortedSegmentSum } from '../../ops/unsorted_segment_sum';\nimport { getGlobalTensorClass } from '../../tensor';\ngetGlobalTensorClass().prototype.unsortedSegmentSum =\n function (segmentIds, numSegments) {\n this.throwIfDisposed();\n return unsortedSegmentSum(this, segmentIds, numSegments);\n };\n//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidW5zb3J0ZWRfc2VnbWVudF9zdW0uanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi8uLi8uLi90ZmpzLWNvcmUvc3JjL3B1YmxpYy9jaGFpbmVkX29wcy91bnNvcnRlZF9zZWdtZW50X3N1bS50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQTs7Ozs7Ozs7Ozs7Ozs7O0dBZUc7QUFFSCxPQUFPLEVBQUMsa0JBQWtCLEVBQUMsTUFBTSxnQ0FBZ0MsQ0FBQztBQUNsRSxPQUFPLEVBQUMsb0JBQW9CLEVBQW1CLE1BQU0sY0FBYyxDQUFDO0FBVXBFLG9CQUFvQixFQUFFLENBQUMsU0FBUyxDQUFDLGtCQUFrQjtJQUMvQyxVQUNhLFVBQWlDLEVBQUUsV0FBbUI7UUFDckUsSUFBSSxDQUFDLGVBQWUsRUFBRSxDQUFDO1FBQ3ZCLE9BQU8sa0JBQWtCLENBQUMsSUFBSSxFQUFFLFVBQVUsRUFBRSxXQUFXLENBQUMsQ0FBQztJQUMzRCxDQUFDLENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyIvKipcbiAqIEBsaWNlbnNlXG4gKiBDb3B5cmlnaHQgMjAyMCBHb29nbGUgTExDLiBBbGwgUmlnaHRzIFJlc2VydmVkLlxuICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlIFwiTGljZW5zZVwiKTtcbiAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS5cbiAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdFxuICpcbiAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMFxuICpcbiAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmVcbiAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuIFwiQVMgSVNcIiBCQVNJUyxcbiAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLlxuICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZFxuICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuXG4gKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuICovXG5cbmltcG9ydCB7dW5zb3J0ZWRTZWdtZW50U3VtfSBmcm9tICcuLi8uLi9vcHMvdW5zb3J0ZWRfc2VnbWVudF9zdW0nO1xuaW1wb3J0IHtnZXRHbG9iYWxUZW5zb3JDbGFzcywgVGVuc29yLCBUZW5zb3IxRH0gZnJvbSAnLi4vLi4vdGVuc29yJztcbmltcG9ydCB7UmFuaywgVGVuc29yTGlrZTFEfSBmcm9tICcuLi8uLi90eXBlcyc7XG5cbmRlY2xhcmUgbW9kdWxlICcuLi8uLi90ZW5zb3InIHtcbiAgaW50ZXJmYWNlIFRlbnNvcjxSIGV4dGVuZHMgUmFuayA9IFJhbms+IHtcbiAgICB1bnNvcnRlZFNlZ21lbnRTdW08VCBleHRlbmRzIFRlbnNvcj4oXG4gICAgICAgIHRoaXM6IFQsIHNlZ21lbnRJZHM6IFRlbnNvcjFEfFRlbnNvckxpa2UxRCwgbnVtU2VnbWVudHM6IG51bWJlcik6IFQ7XG4gIH1cbn1cblxuZ2V0R2xvYmFsVGVuc29yQ2xhc3MoKS5wcm90b3R5cGUudW5zb3J0ZWRTZWdtZW50U3VtID1cbiAgICBmdW5jdGlvbjxUIGV4dGVuZHMgVGVuc29yPihcbiAgICAgICAgdGhpczogVCwgc2VnbWVudElkczogVGVuc29yMUR8VGVuc29yTGlrZTFELCBudW1TZWdtZW50czogbnVtYmVyKTogVCB7XG4gIHRoaXMudGhyb3dJZkRpc3Bvc2VkKCk7XG4gIHJldHVybiB1bnNvcnRlZFNlZ21lbnRTdW0odGhpcywgc2VnbWVudElkcywgbnVtU2VnbWVudHMpO1xufTtcbiJdfQ==","/**\n * @license\n * Copyright 2020 Google LLC. All Rights Reserved.\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n * =============================================================================\n */\nimport { unstack } from '../../ops/unstack';\nimport { getGlobalTensorClass } from '../../tensor';\ngetGlobalTensorClass().prototype.unstack = function (axis) {\n this.throwIfDisposed();\n return unstack(this, axis);\n};\n//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidW5zdGFjay5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uLy4uLy4uL3RmanMtY29yZS9zcmMvcHVibGljL2NoYWluZWRfb3BzL3Vuc3RhY2sudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUE7Ozs7Ozs7Ozs7Ozs7OztHQWVHO0FBQ0gsT0FBTyxFQUFDLE9BQU8sRUFBQyxNQUFNLG1CQUFtQixDQUFDO0FBQzFDLE9BQU8sRUFBQyxvQkFBb0IsRUFBUyxNQUFNLGNBQWMsQ0FBQztBQVMxRCxvQkFBb0IsRUFBRSxDQUFDLFNBQVMsQ0FBQyxPQUFPLEdBQUcsVUFDdkMsSUFBYTtJQUNmLElBQUksQ0FBQyxlQUFlLEVBQUUsQ0FBQztJQUN2QixPQUFPLE9BQU8sQ0FBQyxJQUFJLEVBQUUsSUFBSSxDQUFRLENBQUM7QUFDcEMsQ0FBQyxDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiLyoqXG4gKiBAbGljZW5zZVxuICogQ29weXJpZ2h0IDIwMjAgR29vZ2xlIExMQy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC5cbiAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSBcIkxpY2Vuc2VcIik7XG4gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuXG4gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXRcbiAqXG4gKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjBcbiAqXG4gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlXG4gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiBcIkFTIElTXCIgQkFTSVMsXG4gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC5cbiAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmRcbiAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLlxuICogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbiAqL1xuaW1wb3J0IHt1bnN0YWNrfSBmcm9tICcuLi8uLi9vcHMvdW5zdGFjayc7XG5pbXBvcnQge2dldEdsb2JhbFRlbnNvckNsYXNzLCBUZW5zb3J9IGZyb20gJy4uLy4uL3RlbnNvcic7XG5pbXBvcnQge1Jhbmt9IGZyb20gJy4uLy4uL3R5cGVzJztcblxuZGVjbGFyZSBtb2R1bGUgJy4uLy4uL3RlbnNvcicge1xuICBpbnRlcmZhY2UgVGVuc29yPFIgZXh0ZW5kcyBSYW5rID0gUmFuaz4ge1xuICAgIHVuc3RhY2s8VCBleHRlbmRzIFRlbnNvcj4oYXhpcz86IG51bWJlcik6IFRbXTtcbiAgfVxufVxuXG5nZXRHbG9iYWxUZW5zb3JDbGFzcygpLnByb3RvdHlwZS51bnN0YWNrID0gZnVuY3Rpb248VCBleHRlbmRzIFRlbnNvcj4oXG4gICAgYXhpcz86IG51bWJlcik6IFRbXSB7XG4gIHRoaXMudGhyb3dJZkRpc3Bvc2VkKCk7XG4gIHJldHVybiB1bnN0YWNrKHRoaXMsIGF4aXMpIGFzIFRbXTtcbn07XG4iXX0=","/**\n * @license\n * Copyright 2020 Google LLC. All Rights Reserved.\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n * =============================================================================\n */\nimport { where } from '../../ops/where';\nimport { getGlobalTensorClass } from '../../tensor';\ngetGlobalTensorClass().prototype.where = function (condition, x) {\n this.throwIfDisposed();\n return where(condition, this, x);\n};\n//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoid2hlcmUuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi8uLi8uLi90ZmpzLWNvcmUvc3JjL3B1YmxpYy9jaGFpbmVkX29wcy93aGVyZS50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQTs7Ozs7Ozs7Ozs7Ozs7O0dBZUc7QUFFSCxPQUFPLEVBQUMsS0FBSyxFQUFDLE1BQU0saUJBQWlCLENBQUM7QUFDdEMsT0FBTyxFQUFDLG9CQUFvQixFQUFTLE1BQU0sY0FBYyxDQUFDO0FBVTFELG9CQUFvQixFQUFFLENBQUMsU0FBUyxDQUFDLEtBQUssR0FBRyxVQUNyQyxTQUE0QixFQUFFLENBQW9CO0lBQ3BELElBQUksQ0FBQyxlQUFlLEVBQUUsQ0FBQztJQUN2QixPQUFPLEtBQUssQ0FBQyxTQUFTLEVBQUUsSUFBSSxFQUFFLENBQUMsQ0FBTSxDQUFDO0FBQ3hDLENBQUMsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbIi8qKlxuICogQGxpY2Vuc2VcbiAqIENvcHlyaWdodCAyMDIwIEdvb2dsZSBMTEMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuXG4gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgXCJMaWNlbnNlXCIpO1xuICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLlxuICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0XG4gKlxuICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wXG4gKlxuICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZVxuICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gXCJBUyBJU1wiIEJBU0lTLFxuICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuXG4gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kXG4gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS5cbiAqID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4gKi9cblxuaW1wb3J0IHt3aGVyZX0gZnJvbSAnLi4vLi4vb3BzL3doZXJlJztcbmltcG9ydCB7Z2V0R2xvYmFsVGVuc29yQ2xhc3MsIFRlbnNvcn0gZnJvbSAnLi4vLi4vdGVuc29yJztcbmltcG9ydCB7UmFuaywgVGVuc29yTGlrZX0gZnJvbSAnLi4vLi4vdHlwZXMnO1xuXG5kZWNsYXJlIG1vZHVsZSAnLi4vLi4vdGVuc29yJyB7XG4gIGludGVyZmFjZSBUZW5zb3I8UiBleHRlbmRzIFJhbmsgPSBSYW5rPiB7XG4gICAgd2hlcmU8VCBleHRlbmRzIFRlbnNvcj4oY29uZGl0aW9uOiBUZW5zb3J8VGVuc29yTGlrZSwgeDogVGVuc29yfFRlbnNvckxpa2UpOlxuICAgICAgICBUO1xuICB9XG59XG5cbmdldEdsb2JhbFRlbnNvckNsYXNzKCkucHJvdG90eXBlLndoZXJlID0gZnVuY3Rpb248VCBleHRlbmRzIFRlbnNvcj4oXG4gICAgY29uZGl0aW9uOiBUZW5zb3J8VGVuc29yTGlrZSwgeDogVGVuc29yfFRlbnNvckxpa2UpOiBUIHtcbiAgdGhpcy50aHJvd0lmRGlzcG9zZWQoKTtcbiAgcmV0dXJuIHdoZXJlKGNvbmRpdGlvbiwgdGhpcywgeCkgYXMgVDtcbn07XG4iXX0=","/**\n * @license\n * Copyright 2020 Google LLC. All Rights Reserved.\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n * =============================================================================\n */\n// TODO update import path once op is modularized.\nimport { zerosLike } from '../../ops/ops';\nimport { getGlobalTensorClass } from '../../tensor';\ngetGlobalTensorClass().prototype.zerosLike = function () {\n this.throwIfDisposed();\n return zerosLike(this);\n};\n//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiemVyb3NfbGlrZS5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uLy4uLy4uL3RmanMtY29yZS9zcmMvcHVibGljL2NoYWluZWRfb3BzL3plcm9zX2xpa2UudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUE7Ozs7Ozs7Ozs7Ozs7OztHQWVHO0FBRUgsa0RBQWtEO0FBQ2xELE9BQU8sRUFBQyxTQUFTLEVBQUMsTUFBTSxlQUFlLENBQUM7QUFDeEMsT0FBTyxFQUFDLG9CQUFvQixFQUFTLE1BQU0sY0FBYyxDQUFDO0FBUzFELG9CQUFvQixFQUFFLENBQUMsU0FBUyxDQUFDLFNBQVMsR0FBRztJQUUzQyxJQUFJLENBQUMsZUFBZSxFQUFFLENBQUM7SUFDdkIsT0FBTyxTQUFTLENBQUMsSUFBSSxDQUFDLENBQUM7QUFDekIsQ0FBQyxDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiLyoqXG4gKiBAbGljZW5zZVxuICogQ29weXJpZ2h0IDIwMjAgR29vZ2xlIExMQy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC5cbiAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSBcIkxpY2Vuc2VcIik7XG4gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuXG4gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXRcbiAqXG4gKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjBcbiAqXG4gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlXG4gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiBcIkFTIElTXCIgQkFTSVMsXG4gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC5cbiAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmRcbiAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLlxuICogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbiAqL1xuXG4vLyBUT0RPIHVwZGF0ZSBpbXBvcnQgcGF0aCBvbmNlIG9wIGlzIG1vZHVsYXJpemVkLlxuaW1wb3J0IHt6ZXJvc0xpa2V9IGZyb20gJy4uLy4uL29wcy9vcHMnO1xuaW1wb3J0IHtnZXRHbG9iYWxUZW5zb3JDbGFzcywgVGVuc29yfSBmcm9tICcuLi8uLi90ZW5zb3InO1xuaW1wb3J0IHtSYW5rfSBmcm9tICcuLi8uLi90eXBlcyc7XG5cbmRlY2xhcmUgbW9kdWxlICcuLi8uLi90ZW5zb3InIHtcbiAgaW50ZXJmYWNlIFRlbnNvcjxSIGV4dGVuZHMgUmFuayA9IFJhbms+IHtcbiAgICB6ZXJvc0xpa2U8VCBleHRlbmRzIFRlbnNvcj4odGhpczogVCk6IFQ7XG4gIH1cbn1cblxuZ2V0R2xvYmFsVGVuc29yQ2xhc3MoKS5wcm90b3R5cGUuemVyb3NMaWtlID0gZnVuY3Rpb248VCBleHRlbmRzIFRlbnNvcj4oXG4gICAgdGhpczogVCk6IFQge1xuICB0aGlzLnRocm93SWZEaXNwb3NlZCgpO1xuICByZXR1cm4gemVyb3NMaWtlKHRoaXMpO1xufTtcbiJdfQ==","/**\n * @license\n * Copyright 2018 Google LLC\n *\n * Use of this source code is governed by an MIT-style\n * license that can be found in the LICENSE file or at\n * https://opensource.org/licenses/MIT.\n * =============================================================================\n */\n/**\n * Explicit error types.\n *\n * See the following link for more information about why the code includes\n * calls to setPrototypeOf:\n *\n * https://github.com/Microsoft/TypeScript-wiki/blob/master/Breaking-Changes.md#extending-built-ins-like-error-array-and-map-may-no-longer-work\n */\n// tslint:enable\n/**\n * Equivalent of Python's AttributeError.\n */\nexport class AttributeError extends Error {\n constructor(message) {\n super(message);\n // Set the prototype explicitly.\n Object.setPrototypeOf(this, AttributeError.prototype);\n }\n}\n/**\n * Equivalent of Python's RuntimeError.\n */\nexport class RuntimeError extends Error {\n constructor(message) {\n super(message);\n // Set the prototype explicitly.\n Object.setPrototypeOf(this, RuntimeError.prototype);\n }\n}\n/**\n * Equivalent of Python's ValueError.\n */\nexport class ValueError extends Error {\n constructor(message) {\n super(message);\n // Set the prototype explicitly.\n Object.setPrototypeOf(this, ValueError.prototype);\n }\n}\n/**\n * Equivalent of Python's NotImplementedError.\n */\nexport class NotImplementedError extends Error {\n constructor(message) {\n super(message);\n // Set the prototype explicitly.\n Object.setPrototypeOf(this, NotImplementedError.prototype);\n }\n}\n/**\n * Equivalent of Python's AssertionError.\n */\nexport class AssertionError extends Error {\n constructor(message) {\n super(message);\n // Set the prototype explicitly.\n Object.setPrototypeOf(this, AssertionError.prototype);\n }\n}\n/**\n * Equivalent of Python's IndexError.\n */\nexport class IndexError extends Error {\n constructor(message) {\n super(message);\n // Set the prototype explicitly.\n Object.setPrototypeOf(this, IndexError.prototype);\n }\n}\n//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZXJyb3JzLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vdGZqcy1sYXllcnMvc3JjL2Vycm9ycy50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQTs7Ozs7Ozs7R0FRRztBQUVIOzs7Ozs7O0dBT0c7QUFDSCxnQkFBZ0I7QUFFaEI7O0dBRUc7QUFDSCxNQUFNLE9BQU8sY0FBZSxTQUFRLEtBQUs7SUFDdkMsWUFBWSxPQUFnQjtRQUMxQixLQUFLLENBQUMsT0FBTyxDQUFDLENBQUM7UUFDZixnQ0FBZ0M7UUFDaEMsTUFBTSxDQUFDLGNBQWMsQ0FBQyxJQUFJLEVBQUUsY0FBYyxDQUFDLFNBQVMsQ0FBQyxDQUFDO0lBQ3hELENBQUM7Q0FDRjtBQUVEOztHQUVHO0FBQ0gsTUFBTSxPQUFPLFlBQWEsU0FBUSxLQUFLO0lBQ3JDLFlBQVksT0FBZ0I7UUFDMUIsS0FBSyxDQUFDLE9BQU8sQ0FBQyxDQUFDO1FBQ2YsZ0NBQWdDO1FBQ2hDLE1BQU0sQ0FBQyxjQUFjLENBQUMsSUFBSSxFQUFFLFlBQVksQ0FBQyxTQUFTLENBQUMsQ0FBQztJQUN0RCxDQUFDO0NBQ0Y7QUFFRDs7R0FFRztBQUNILE1BQU0sT0FBTyxVQUFXLFNBQVEsS0FBSztJQUNuQyxZQUFZLE9BQWdCO1FBQzFCLEtBQUssQ0FBQyxPQUFPLENBQUMsQ0FBQztRQUNmLGdDQUFnQztRQUNoQyxNQUFNLENBQUMsY0FBYyxDQUFDLElBQUksRUFBRSxVQUFVLENBQUMsU0FBUyxDQUFDLENBQUM7SUFDcEQsQ0FBQztDQUNGO0FBRUQ7O0dBRUc7QUFDSCxNQUFNLE9BQU8sbUJBQW9CLFNBQVEsS0FBSztJQUM1QyxZQUFZLE9BQWdCO1FBQzFCLEtBQUssQ0FBQyxPQUFPLENBQUMsQ0FBQztRQUNmLGdDQUFnQztRQUNoQyxNQUFNLENBQUMsY0FBYyxDQUFDLElBQUksRUFBRSxtQkFBbUIsQ0FBQyxTQUFTLENBQUMsQ0FBQztJQUM3RCxDQUFDO0NBQ0Y7QUFFRDs7R0FFRztBQUNILE1BQU0sT0FBTyxjQUFlLFNBQVEsS0FBSztJQUN2QyxZQUFZLE9BQWdCO1FBQzFCLEtBQUssQ0FBQyxPQUFPLENBQUMsQ0FBQztRQUNmLGdDQUFnQztRQUNoQyxNQUFNLENBQUMsY0FBYyxDQUFDLElBQUksRUFBRSxjQUFjLENBQUMsU0FBUyxDQUFDLENBQUM7SUFDeEQsQ0FBQztDQUNGO0FBRUQ7O0dBRUc7QUFDSCxNQUFNLE9BQU8sVUFBVyxTQUFRLEtBQUs7SUFDbkMsWUFBWSxPQUFnQjtRQUMxQixLQUFLLENBQUMsT0FBTyxDQUFDLENBQUM7UUFDZixnQ0FBZ0M7UUFDaEMsTUFBTSxDQUFDLGNBQWMsQ0FBQyxJQUFJLEVBQUUsVUFBVSxDQUFDLFNBQVMsQ0FBQyxDQUFDO0lBQ3BELENBQUM7Q0FDRiIsInNvdXJjZXNDb250ZW50IjpbIi8qKlxuICogQGxpY2Vuc2VcbiAqIENvcHlyaWdodCAyMDE4IEdvb2dsZSBMTENcbiAqXG4gKiBVc2Ugb2YgdGhpcyBzb3VyY2UgY29kZSBpcyBnb3Zlcm5lZCBieSBhbiBNSVQtc3R5bGVcbiAqIGxpY2Vuc2UgdGhhdCBjYW4gYmUgZm91bmQgaW4gdGhlIExJQ0VOU0UgZmlsZSBvciBhdFxuICogaHR0cHM6Ly9vcGVuc291cmNlLm9yZy9saWNlbnNlcy9NSVQuXG4gKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuICovXG5cbi8qKlxuICogRXhwbGljaXQgZXJyb3IgdHlwZXMuXG4gKlxuICogU2VlIHRoZSBmb2xsb3dpbmcgbGluayBmb3IgbW9yZSBpbmZvcm1hdGlvbiBhYm91dCB3aHkgdGhlIGNvZGUgaW5jbHVkZXNcbiAqIGNhbGxzIHRvIHNldFByb3RvdHlwZU9mOlxuICpcbiAqIGh0dHBzOi8vZ2l0aHViLmNvbS9NaWNyb3NvZnQvVHlwZVNjcmlwdC13aWtpL2Jsb2IvbWFzdGVyL0JyZWFraW5nLUNoYW5nZXMubWQjZXh0ZW5kaW5nLWJ1aWx0LWlucy1saWtlLWVycm9yLWFycmF5LWFuZC1tYXAtbWF5LW5vLWxvbmdlci13b3JrXG4gKi9cbi8vIHRzbGludDplbmFibGVcblxuLyoqXG4gKiBFcXVpdmFsZW50IG9mIFB5dGhvbidzIEF0dHJpYnV0ZUVycm9yLlxuICovXG5leHBvcnQgY2xhc3MgQXR0cmlidXRlRXJyb3IgZXh0ZW5kcyBFcnJvciB7XG4gIGNvbnN0cnVjdG9yKG1lc3NhZ2U/OiBzdHJpbmcpIHtcbiAgICBzdXBlcihtZXNzYWdlKTtcbiAgICAvLyBTZXQgdGhlIHByb3RvdHlwZSBleHBsaWNpdGx5LlxuICAgIE9iamVjdC5zZXRQcm90b3R5cGVPZih0aGlzLCBBdHRyaWJ1dGVFcnJvci5wcm90b3R5cGUpO1xuICB9XG59XG5cbi8qKlxuICogRXF1aXZhbGVudCBvZiBQeXRob24ncyBSdW50aW1lRXJyb3IuXG4gKi9cbmV4cG9ydCBjbGFzcyBSdW50aW1lRXJyb3IgZXh0ZW5kcyBFcnJvciB7XG4gIGNvbnN0cnVjdG9yKG1lc3NhZ2U/OiBzdHJpbmcpIHtcbiAgICBzdXBlcihtZXNzYWdlKTtcbiAgICAvLyBTZXQgdGhlIHByb3RvdHlwZSBleHBsaWNpdGx5LlxuICAgIE9iamVjdC5zZXRQcm90b3R5cGVPZih0aGlzLCBSdW50aW1lRXJyb3IucHJvdG90eXBlKTtcbiAgfVxufVxuXG4vKipcbiAqIEVxdWl2YWxlbnQgb2YgUHl0aG9uJ3MgVmFsdWVFcnJvci5cbiAqL1xuZXhwb3J0IGNsYXNzIFZhbHVlRXJyb3IgZXh0ZW5kcyBFcnJvciB7XG4gIGNvbnN0cnVjdG9yKG1lc3NhZ2U/OiBzdHJpbmcpIHtcbiAgICBzdXBlcihtZXNzYWdlKTtcbiAgICAvLyBTZXQgdGhlIHByb3RvdHlwZSBleHBsaWNpdGx5LlxuICAgIE9iamVjdC5zZXRQcm90b3R5cGVPZih0aGlzLCBWYWx1ZUVycm9yLnByb3RvdHlwZSk7XG4gIH1cbn1cblxuLyoqXG4gKiBFcXVpdmFsZW50IG9mIFB5dGhvbidzIE5vdEltcGxlbWVudGVkRXJyb3IuXG4gKi9cbmV4cG9ydCBjbGFzcyBOb3RJbXBsZW1lbnRlZEVycm9yIGV4dGVuZHMgRXJyb3Ige1xuICBjb25zdHJ1Y3RvcihtZXNzYWdlPzogc3RyaW5nKSB7XG4gICAgc3VwZXIobWVzc2FnZSk7XG4gICAgLy8gU2V0IHRoZSBwcm90b3R5cGUgZXhwbGljaXRseS5cbiAgICBPYmplY3Quc2V0UHJvdG90eXBlT2YodGhpcywgTm90SW1wbGVtZW50ZWRFcnJvci5wcm90b3R5cGUpO1xuICB9XG59XG5cbi8qKlxuICogRXF1aXZhbGVudCBvZiBQeXRob24ncyBBc3NlcnRpb25FcnJvci5cbiAqL1xuZXhwb3J0IGNsYXNzIEFzc2VydGlvbkVycm9yIGV4dGVuZHMgRXJyb3Ige1xuICBjb25zdHJ1Y3RvcihtZXNzYWdlPzogc3RyaW5nKSB7XG4gICAgc3VwZXIobWVzc2FnZSk7XG4gICAgLy8gU2V0IHRoZSBwcm90b3R5cGUgZXhwbGljaXRseS5cbiAgICBPYmplY3Quc2V0UHJvdG90eXBlT2YodGhpcywgQXNzZXJ0aW9uRXJyb3IucHJvdG90eXBlKTtcbiAgfVxufVxuXG4vKipcbiAqIEVxdWl2YWxlbnQgb2YgUHl0aG9uJ3MgSW5kZXhFcnJvci5cbiAqL1xuZXhwb3J0IGNsYXNzIEluZGV4RXJyb3IgZXh0ZW5kcyBFcnJvciB7XG4gIGNvbnN0cnVjdG9yKG1lc3NhZ2U/OiBzdHJpbmcpIHtcbiAgICBzdXBlcihtZXNzYWdlKTtcbiAgICAvLyBTZXQgdGhlIHByb3RvdHlwZSBleHBsaWNpdGx5LlxuICAgIE9iamVjdC5zZXRQcm90b3R5cGVPZih0aGlzLCBJbmRleEVycm9yLnByb3RvdHlwZSk7XG4gIH1cbn1cbiJdfQ==","/**\n * @license\n * Copyright 2022 Google LLC\n *\n * Use of this source code is governed by an MIT-style\n * license that can be found in the LICENSE file or at\n * https://opensource.org/licenses/MIT.\n * =============================================================================\n */\n/**\n * LruCache: A mapping from the String to T. If the number of the entries is\n * exceeding the `maxEntries`, the LruCache will delete the least recently\n * used entry.\n */\nexport class LruCache {\n constructor(maxEntries) {\n this.maxEntries = maxEntries || 100;\n this.cache = new Map();\n }\n /**\n * Get the entry for the key and mark it as used recently.\n */\n get(key) {\n let entry;\n if (this.cache.has(key)) {\n entry = this.cache.get(key);\n this.cache.delete(key);\n this.cache.set(key, entry);\n }\n return entry;\n }\n /**\n * Put the entry into the cache. If the key already existed, mark the key as\n * used recently.\n */\n put(key, value) {\n if (this.cache.has(key)) {\n this.cache.delete(key);\n }\n else if (this.cache.size >= this.maxEntries) {\n const keyToDelete = this.cache.keys().next().value;\n this.cache.delete(keyToDelete);\n }\n this.cache.set(key, value);\n }\n /**\n * Get the MaxEntries of the cache.\n */\n getMaxEntries() {\n return this.maxEntries;\n }\n /**\n * Set the MaxEntries of the cache. If the maxEntries is decreased, reduce\n * entries in the cache.\n */\n setMaxEntries(maxEntries) {\n if (maxEntries < 0) {\n throw new Error(`The maxEntries of LRU caches must be at least 0, but got ${maxEntries}.`);\n }\n if (this.maxEntries > maxEntries) {\n for (let i = 0; i < this.maxEntries - maxEntries; i++) {\n const keyToDelete = this.cache.keys().next().value;\n this.cache.delete(keyToDelete);\n }\n }\n this.maxEntries = maxEntries;\n }\n}\n//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZXhlY3V0b3JfdXRpbHMuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi8uLi90ZmpzLWxheWVycy9zcmMvdXRpbHMvZXhlY3V0b3JfdXRpbHMudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUE7Ozs7Ozs7O0dBUUc7QUFDSDs7OztHQUlHO0FBRUgsTUFBTSxPQUFPLFFBQVE7SUFJbkIsWUFBWSxVQUFtQjtRQUM3QixJQUFJLENBQUMsVUFBVSxHQUFHLFVBQVUsSUFBSSxHQUFHLENBQUM7UUFDcEMsSUFBSSxDQUFDLEtBQUssR0FBRyxJQUFJLEdBQUcsRUFBYSxDQUFDO0lBQ3BDLENBQUM7SUFFRDs7T0FFRztJQUNJLEdBQUcsQ0FBQyxHQUFXO1FBQ3BCLElBQUksS0FBUSxDQUFDO1FBQ2IsSUFBSSxJQUFJLENBQUMsS0FBSyxDQUFDLEdBQUcsQ0FBQyxHQUFHLENBQUMsRUFBRTtZQUN2QixLQUFLLEdBQUcsSUFBSSxDQUFDLEtBQUssQ0FBQyxHQUFHLENBQUMsR0FBRyxDQUFDLENBQUM7WUFDNUIsSUFBSSxDQUFDLEtBQUssQ0FBQyxNQUFNLENBQUMsR0FBRyxDQUFDLENBQUM7WUFDdkIsSUFBSSxDQUFDLEtBQUssQ0FBQyxHQUFHLENBQUMsR0FBRyxFQUFFLEtBQUssQ0FBQyxDQUFDO1NBQzVCO1FBQ0QsT0FBTyxLQUFLLENBQUM7SUFDZixDQUFDO0lBRUQ7OztPQUdHO0lBQ0ksR0FBRyxDQUFDLEdBQVcsRUFBRSxLQUFRO1FBQzlCLElBQUksSUFBSSxDQUFDLEtBQUssQ0FBQyxHQUFHLENBQUMsR0FBRyxDQUFDLEVBQUU7WUFDdkIsSUFBSSxDQUFDLEtBQUssQ0FBQyxNQUFNLENBQUMsR0FBRyxDQUFDLENBQUM7U0FDeEI7YUFBTSxJQUFJLElBQUksQ0FBQyxLQUFLLENBQUMsSUFBSSxJQUFJLElBQUksQ0FBQyxVQUFVLEVBQUU7WUFDN0MsTUFBTSxXQUFXLEdBQUcsSUFBSSxDQUFDLEtBQUssQ0FBQyxJQUFJLEVBQUUsQ0FBQyxJQUFJLEVBQUUsQ0FBQyxLQUFLLENBQUM7WUFDbkQsSUFBSSxDQUFDLEtBQUssQ0FBQyxNQUFNLENBQUMsV0FBVyxDQUFDLENBQUM7U0FDaEM7UUFDRCxJQUFJLENBQUMsS0FBSyxDQUFDLEdBQUcsQ0FBQyxHQUFHLEVBQUUsS0FBSyxDQUFDLENBQUM7SUFDN0IsQ0FBQztJQUVEOztPQUVHO0lBQ0ksYUFBYTtRQUNsQixPQUFPLElBQUksQ0FBQyxVQUFVLENBQUM7SUFDekIsQ0FBQztJQUVEOzs7T0FHRztJQUNJLGFBQWEsQ0FBQyxVQUFrQjtRQUNyQyxJQUFJLFVBQVUsR0FBRyxDQUFDLEVBQUU7WUFDbEIsTUFBTSxJQUFJLEtBQUssQ0FDWCw0REFDSSxVQUFVLEdBQUcsQ0FBQyxDQUFDO1NBQ3hCO1FBRUQsSUFBSSxJQUFJLENBQUMsVUFBVSxHQUFHLFVBQVUsRUFBRTtZQUNoQyxLQUFLLElBQUksQ0FBQyxHQUFHLENBQUMsRUFBRSxDQUFDLEdBQUcsSUFBSSxDQUFDLFVBQVUsR0FBRyxVQUFVLEVBQUUsQ0FBQyxFQUFFLEVBQUU7Z0JBQ3JELE1BQU0sV0FBVyxHQUFHLElBQUksQ0FBQyxLQUFLLENBQUMsSUFBSSxFQUFFLENBQUMsSUFBSSxFQUFFLENBQUMsS0FBSyxDQUFDO2dCQUNuRCxJQUFJLENBQUMsS0FBSyxDQUFDLE1BQU0sQ0FBQyxXQUFXLENBQUMsQ0FBQzthQUNoQztTQUNGO1FBRUQsSUFBSSxDQUFDLFVBQVUsR0FBRyxVQUFVLENBQUM7SUFDL0IsQ0FBQztDQUNGIiwic291cmNlc0NvbnRlbnQiOlsiLyoqXG4gKiBAbGljZW5zZVxuICogQ29weXJpZ2h0IDIwMjIgR29vZ2xlIExMQ1xuICpcbiAqIFVzZSBvZiB0aGlzIHNvdXJjZSBjb2RlIGlzIGdvdmVybmVkIGJ5IGFuIE1JVC1zdHlsZVxuICogbGljZW5zZSB0aGF0IGNhbiBiZSBmb3VuZCBpbiB0aGUgTElDRU5TRSBmaWxlIG9yIGF0XG4gKiBodHRwczovL29wZW5zb3VyY2Uub3JnL2xpY2Vuc2VzL01JVC5cbiAqID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4gKi9cbi8qKlxuICogTHJ1Q2FjaGU6IEEgbWFwcGluZyBmcm9tIHRoZSBTdHJpbmcgdG8gVC4gSWYgdGhlIG51bWJlciBvZiB0aGUgZW50cmllcyBpc1xuICogZXhjZWVkaW5nIHRoZSBgbWF4RW50cmllc2AsIHRoZSBMcnVDYWNoZSB3aWxsIGRlbGV0ZSB0aGUgbGVhc3QgcmVjZW50bHlcbiAqIHVzZWQgZW50cnkuXG4gKi9cblxuZXhwb3J0IGNsYXNzIExydUNhY2hlPFQ+IHtcbiAgcHJpdmF0ZSBjYWNoZTogTWFwPHN0cmluZywgVD47XG4gIHByaXZhdGUgbWF4RW50cmllczogbnVtYmVyO1xuXG4gIGNvbnN0cnVjdG9yKG1heEVudHJpZXM/OiBudW1iZXIpIHtcbiAgICB0aGlzLm1heEVudHJpZXMgPSBtYXhFbnRyaWVzIHx8IDEwMDtcbiAgICB0aGlzLmNhY2hlID0gbmV3IE1hcDxzdHJpbmcsIFQ+KCk7XG4gIH1cblxuICAvKipcbiAgICogR2V0IHRoZSBlbnRyeSBmb3IgdGhlIGtleSBhbmQgbWFyayBpdCBhcyB1c2VkIHJlY2VudGx5LlxuICAgKi9cbiAgcHVibGljIGdldChrZXk6IHN0cmluZyk6IFQge1xuICAgIGxldCBlbnRyeTogVDtcbiAgICBpZiAodGhpcy5jYWNoZS5oYXMoa2V5KSkge1xuICAgICAgZW50cnkgPSB0aGlzLmNhY2hlLmdldChrZXkpO1xuICAgICAgdGhpcy5jYWNoZS5kZWxldGUoa2V5KTtcbiAgICAgIHRoaXMuY2FjaGUuc2V0KGtleSwgZW50cnkpO1xuICAgIH1cbiAgICByZXR1cm4gZW50cnk7XG4gIH1cblxuICAvKipcbiAgICogUHV0IHRoZSBlbnRyeSBpbnRvIHRoZSBjYWNoZS4gSWYgdGhlIGtleSBhbHJlYWR5IGV4aXN0ZWQsIG1hcmsgdGhlIGtleSBhc1xuICAgKiB1c2VkIHJlY2VudGx5LlxuICAgKi9cbiAgcHVibGljIHB1dChrZXk6IHN0cmluZywgdmFsdWU6IFQpOiB2b2lkIHtcbiAgICBpZiAodGhpcy5jYWNoZS5oYXMoa2V5KSkge1xuICAgICAgdGhpcy5jYWNoZS5kZWxldGUoa2V5KTtcbiAgICB9IGVsc2UgaWYgKHRoaXMuY2FjaGUuc2l6ZSA+PSB0aGlzLm1heEVudHJpZXMpIHtcbiAgICAgIGNvbnN0IGtleVRvRGVsZXRlID0gdGhpcy5jYWNoZS5rZXlzKCkubmV4dCgpLnZhbHVlO1xuICAgICAgdGhpcy5jYWNoZS5kZWxldGUoa2V5VG9EZWxldGUpO1xuICAgIH1cbiAgICB0aGlzLmNhY2hlLnNldChrZXksIHZhbHVlKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBHZXQgdGhlIE1heEVudHJpZXMgb2YgdGhlIGNhY2hlLlxuICAgKi9cbiAgcHVibGljIGdldE1heEVudHJpZXMoKTogbnVtYmVyIHtcbiAgICByZXR1cm4gdGhpcy5tYXhFbnRyaWVzO1xuICB9XG5cbiAgLyoqXG4gICAqIFNldCB0aGUgTWF4RW50cmllcyBvZiB0aGUgY2FjaGUuIElmIHRoZSBtYXhFbnRyaWVzIGlzIGRlY3JlYXNlZCwgcmVkdWNlXG4gICAqIGVudHJpZXMgaW4gdGhlIGNhY2hlLlxuICAgKi9cbiAgcHVibGljIHNldE1heEVudHJpZXMobWF4RW50cmllczogbnVtYmVyKTogdm9pZCB7XG4gICAgaWYgKG1heEVudHJpZXMgPCAwKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoXG4gICAgICAgICAgYFRoZSBtYXhFbnRyaWVzIG9mIExSVSBjYWNoZXMgbXVzdCBiZSBhdCBsZWFzdCAwLCBidXQgZ290ICR7XG4gICAgICAgICAgICAgIG1heEVudHJpZXN9LmApO1xuICAgIH1cblxuICAgIGlmICh0aGlzLm1heEVudHJpZXMgPiBtYXhFbnRyaWVzKSB7XG4gICAgICBmb3IgKGxldCBpID0gMDsgaSA8IHRoaXMubWF4RW50cmllcyAtIG1heEVudHJpZXM7IGkrKykge1xuICAgICAgICBjb25zdCBrZXlUb0RlbGV0ZSA9IHRoaXMuY2FjaGUua2V5cygpLm5leHQoKS52YWx1ZTtcbiAgICAgICAgdGhpcy5jYWNoZS5kZWxldGUoa2V5VG9EZWxldGUpO1xuICAgICAgfVxuICAgIH1cblxuICAgIHRoaXMubWF4RW50cmllcyA9IG1heEVudHJpZXM7XG4gIH1cbn1cbiJdfQ==","/**\n * @license\n * Copyright 2018 Google LLC\n *\n * Use of this source code is governed by an MIT-style\n * license that can be found in the LICENSE file or at\n * https://opensource.org/licenses/MIT.\n * =============================================================================\n */\n/* Original source: utils/generic_utils.py */\nimport { util } from '@tensorflow/tfjs-core';\nimport { AssertionError, ValueError } from '../errors';\n// tslint:enable\n/**\n * If `value` is an Array, equivalent to Python's `value * numValues`.\n * If `value` is not an Array, equivalent to Python's `[value] * numValues`\n */\n// tslint:disable-next-line:no-any\nexport function pyListRepeat(value, numValues) {\n if (Array.isArray(value)) {\n // tslint:disable-next-line:no-any\n let newArray = [];\n for (let i = 0; i < numValues; i++) {\n newArray = newArray.concat(value);\n }\n return newArray;\n }\n else {\n const newArray = new Array(numValues);\n newArray.fill(value);\n return newArray;\n }\n}\nexport function assert(val, message) {\n if (!val) {\n throw new AssertionError(message);\n }\n}\n/**\n * Count the number of elements of the `array` that are equal to `reference`.\n */\nexport function count(array, refernce) {\n let counter = 0;\n for (const item of array) {\n if (item === refernce) {\n counter++;\n }\n }\n return counter;\n}\n/**\n * If an array is of length 1, just return the first element. Otherwise, return\n * the full array.\n * @param tensors\n */\nexport function singletonOrArray(xs) {\n if (xs.length === 1) {\n return xs[0];\n }\n return xs;\n}\n/**\n * Normalizes a list/tensor into a list.\n *\n * If a tensor is passed, we return\n * a list of size 1 containing the tensor.\n *\n * @param x target object to be normalized.\n */\n// tslint:disable-next-line:no-any\nexport function toList(x) {\n if (Array.isArray(x)) {\n return x;\n }\n return [x];\n}\n/**\n * Generate a UID for a list\n */\n// tslint:disable-next-line:no-any\nexport function objectListUid(objs) {\n const objectList = toList(objs);\n let retVal = '';\n for (const obj of objectList) {\n if (obj.id == null) {\n throw new ValueError(`Object ${obj} passed to objectListUid without an id`);\n }\n if (retVal !== '') {\n retVal = retVal + ', ';\n }\n retVal = `${retVal}${Math.abs(obj.id)}`;\n }\n return retVal;\n}\n/**\n * Converts string to snake-case.\n * @param name\n */\nexport function toSnakeCase(name) {\n const intermediate = name.replace(/(.)([A-Z][a-z0-9]+)/g, '$1_$2');\n const insecure = intermediate.replace(/([a-z])([A-Z])/g, '$1_$2').toLowerCase();\n /*\n If the class is private the name starts with \"_\" which is not secure\n for creating scopes. We prefix the name with \"private\" in this case.\n */\n if (insecure[0] !== '_') {\n return insecure;\n }\n return 'private' + insecure;\n}\nexport function toCamelCase(identifier) {\n // quick return for empty string or single character strings\n if (identifier.length <= 1) {\n return identifier;\n }\n // Check for the underscore indicating snake_case\n if (identifier.indexOf('_') === -1) {\n return identifier;\n }\n return identifier.replace(/[_]+(\\w|$)/g, (m, p1) => p1.toUpperCase());\n}\n// tslint:disable-next-line:no-any\nlet _GLOBAL_CUSTOM_OBJECTS = {};\nexport function serializeKerasObject(instance) {\n if (instance === null || instance === undefined) {\n return null;\n }\n const dict = {};\n dict['className'] = instance.getClassName();\n dict['config'] = instance.getConfig();\n return dict;\n}\n/**\n * Replace ndarray-style scalar objects in serialization objects with numbers.\n *\n * Background: In some versions of tf.keras, certain scalar values in the HDF5\n * model save file can be serialized as: `{'type': 'ndarray', 'value': num}`,\n * where in `num` is a plain number. This method converts such serialization\n * to a `number`.\n *\n * @param config The keras-format serialization object to be processed\n * (in place).\n */\nfunction convertNDArrayScalarsInConfig(config) {\n if (config == null || typeof config !== 'object') {\n return;\n }\n else if (Array.isArray(config)) {\n config.forEach(configItem => convertNDArrayScalarsInConfig(configItem));\n }\n else {\n const fields = Object.keys(config);\n for (const field of fields) {\n const value = config[field];\n if (value != null && typeof value === 'object') {\n if (!Array.isArray(value) && value['type'] === 'ndarray' &&\n typeof value['value'] === 'number') {\n config[field] = value['value'];\n }\n else {\n convertNDArrayScalarsInConfig(value);\n }\n }\n }\n }\n}\n/**\n * Deserialize a saved Keras Object\n * @param identifier either a string ID or a saved Keras dictionary\n * @param moduleObjects a list of Python class names to object constructors\n * @param customObjects a list of Python class names to object constructors\n * @param printableModuleName debug text for the object being reconstituted\n * @param fastWeightInit Optional flag to use fast weight initialization\n * during deserialization. This is applicable to cases in which\n * the initialization will be immediately overwritten by loaded weight\n * values. Default: `false`.\n * @returns a TensorFlow.js Layers object\n */\n// tslint:disable:no-any\nexport function deserializeKerasObject(identifier, moduleObjects = {}, customObjects = {}, printableModuleName = 'object', fastWeightInit = false) {\n // tslint:enable\n if (typeof identifier === 'string') {\n const functionName = identifier;\n let fn;\n if (functionName in customObjects) {\n fn = customObjects[functionName];\n }\n else if (functionName in _GLOBAL_CUSTOM_OBJECTS) {\n fn = _GLOBAL_CUSTOM_OBJECTS[functionName];\n }\n else {\n fn = moduleObjects[functionName];\n if (fn == null) {\n throw new ValueError(`Unknown ${printableModuleName}: ${identifier}. ` +\n `This may be due to one of the following reasons:\\n` +\n `1. The ${printableModuleName} is defined in Python, in which ` +\n `case it needs to be ported to TensorFlow.js or your JavaScript ` +\n `code.\\n` +\n `2. The custom ${printableModuleName} is defined in JavaScript, ` +\n `but is not registered properly with ` +\n `tf.serialization.registerClass().`);\n // TODO(cais): Add link to tutorial page on custom layers.\n }\n }\n return fn;\n }\n else {\n // In this case we are dealing with a Keras config dictionary.\n const config = identifier;\n if (config['className'] == null || config['config'] == null) {\n throw new ValueError(`${printableModuleName}: Improper config format: ` +\n `${JSON.stringify(config)}.\\n` +\n `'className' and 'config' must set.`);\n }\n const className = config['className'];\n let cls, fromConfig;\n if (className in customObjects) {\n [cls, fromConfig] = customObjects[className];\n }\n else if (className in _GLOBAL_CUSTOM_OBJECTS) {\n [cls, fromConfig] = _GLOBAL_CUSTOM_OBJECTS['className'];\n }\n else if (className in moduleObjects) {\n [cls, fromConfig] = moduleObjects[className];\n }\n if (cls == null) {\n throw new ValueError(`Unknown ${printableModuleName}: ${className}. ` +\n `This may be due to one of the following reasons:\\n` +\n `1. The ${printableModuleName} is defined in Python, in which ` +\n `case it needs to be ported to TensorFlow.js or your JavaScript ` +\n `code.\\n` +\n `2. The custom ${printableModuleName} is defined in JavaScript, ` +\n `but is not registered properly with ` +\n `tf.serialization.registerClass().`);\n // TODO(cais): Add link to tutorial page on custom layers.\n }\n if (fromConfig != null) {\n // Porting notes: Instead of checking to see whether fromConfig accepts\n // customObjects, we create a customObjects dictionary and tack it on to\n // config['config'] as config['config'].customObjects. Objects can use it,\n // if they want.\n // tslint:disable-next-line:no-any\n const customObjectsCombined = {};\n for (const key of Object.keys(_GLOBAL_CUSTOM_OBJECTS)) {\n customObjectsCombined[key] = _GLOBAL_CUSTOM_OBJECTS[key];\n }\n for (const key of Object.keys(customObjects)) {\n customObjectsCombined[key] = customObjects[key];\n }\n // Add the customObjects to config\n const nestedConfig = config['config'];\n nestedConfig['customObjects'] = customObjectsCombined;\n const backupCustomObjects = Object.assign({}, _GLOBAL_CUSTOM_OBJECTS);\n for (const key of Object.keys(customObjects)) {\n _GLOBAL_CUSTOM_OBJECTS[key] = customObjects[key];\n }\n convertNDArrayScalarsInConfig(config['config']);\n const returnObj = fromConfig(cls, config['config'], customObjects, fastWeightInit);\n _GLOBAL_CUSTOM_OBJECTS = Object.assign({}, backupCustomObjects);\n return returnObj;\n }\n else {\n // Then `cls` may be a function returning a class.\n // In this case by convention `config` holds\n // the kwargs of the function.\n const backupCustomObjects = Object.assign({}, _GLOBAL_CUSTOM_OBJECTS);\n for (const key of Object.keys(customObjects)) {\n _GLOBAL_CUSTOM_OBJECTS[key] = customObjects[key];\n }\n // In python this is **config['config'], for tfjs-layers we require\n // classes that use this fall-through construction method to take\n // a config interface that mimics the expansion of named parameters.\n const returnObj = new cls(config['config']);\n _GLOBAL_CUSTOM_OBJECTS = Object.assign({}, backupCustomObjects);\n return returnObj;\n }\n }\n}\n/**\n * Compares two numbers for sorting.\n * @param a\n * @param b\n */\nexport function numberCompare(a, b) {\n return (a < b) ? -1 : ((a > b) ? 1 : 0);\n}\n/**\n * Comparison of two numbers for reverse sorting.\n * @param a\n * @param b\n */\nexport function reverseNumberCompare(a, b) {\n return -1 * numberCompare(a, b);\n}\n/**\n * Convert a string into the corresponding DType.\n * @param dtype\n * @returns An instance of DType.\n */\nexport function stringToDType(dtype) {\n switch (dtype) {\n case 'float32':\n return 'float32';\n default:\n throw new ValueError(`Invalid dtype: ${dtype}`);\n }\n}\n/**\n * Test the element-by-element equality of two Arrays of strings.\n * @param xs First array of strings.\n * @param ys Second array of strings.\n * @returns Wether the two arrays are all equal, element by element.\n */\nexport function stringsEqual(xs, ys) {\n if (xs == null || ys == null) {\n return xs === ys;\n }\n if (xs.length !== ys.length) {\n return false;\n }\n for (let i = 0; i < xs.length; ++i) {\n if (xs[i] !== ys[i]) {\n return false;\n }\n }\n return true;\n}\n/**\n * Get the unique elements of an array.\n * @param xs Array.\n * @returns An Array consisting of the unique elements in `xs`.\n */\nexport function unique(xs) {\n if (xs == null) {\n return xs;\n }\n const out = [];\n // TODO(cais): Maybe improve performance by sorting.\n for (const x of xs) {\n if (out.indexOf(x) === -1) {\n out.push(x);\n }\n }\n return out;\n}\n/**\n * Determine if an Object is empty (i.e., does not have own properties).\n * @param obj Object\n * @returns Whether the Object is empty.\n * @throws ValueError: If object is `null` or `undefined`.\n */\nexport function isObjectEmpty(obj) {\n if (obj == null) {\n throw new ValueError(`Invalid value in obj: ${JSON.stringify(obj)}`);\n }\n for (const key in obj) {\n if (obj.hasOwnProperty(key)) {\n return false;\n }\n }\n return true;\n}\n/**\n * Helper function used to build type union/enum run-time checkers.\n * @param values The list of allowed values.\n * @param label A string name for the type\n * @param value The value to test.\n * @throws ValueError: If the value is not in values nor `undefined`/`null`.\n */\nexport function checkStringTypeUnionValue(values, label, value) {\n if (value == null) {\n return;\n }\n if (values.indexOf(value) < 0) {\n throw new ValueError(`${value} is not a valid ${label}. Valid values are ${values} or null/undefined.`);\n }\n}\n/**\n * Helper function for verifying the types of inputs.\n *\n * Ensures that the elements of `x` are all of type `expectedType`.\n * Also verifies that the length of `x` is within bounds.\n *\n * @param x Object to test.\n * @param expectedType The string expected type of all of the elements in the\n * Array.\n * @param minLength Return false if x.length is less than this.\n * @param maxLength Return false if x.length is greater than this.\n * @returns true if and only if `x` is an `Array` with\n * length >= `minLength` and <= `maxLength`.\n */\n// tslint:disable:no-any\nexport function checkArrayTypeAndLength(x, expectedType, minLength = 0, maxLength = Infinity) {\n assert(minLength >= 0);\n assert(maxLength >= minLength);\n return (Array.isArray(x) && x.length >= minLength && x.length <= maxLength &&\n x.every(e => typeof e === expectedType));\n}\n// tslint:enable:no-any\n/**\n * Assert that a value or an array of value are positive integer.\n *\n * @param value The value being asserted on. May be a single number or an array\n * of numbers.\n * @param name Name of the value, used to make the error message.\n */\nexport function assertPositiveInteger(value, name) {\n if (Array.isArray(value)) {\n util.assert(value.length > 0, () => `${name} is unexpectedly an empty array.`);\n value.forEach((v, i) => assertPositiveInteger(v, `element ${i + 1} of ${name}`));\n }\n else {\n util.assert(Number.isInteger(value) && value > 0, () => `Expected ${name} to be a positive integer, but got ` +\n `${formatAsFriendlyString(value)}.`);\n }\n}\n/**\n * Format a value into a display-friendly, human-readable fashion.\n *\n * - `null` is formatted as `'null'`\n * - Strings are formated with flanking pair of quotes.\n * - Arrays are formatted with flanking pair of square brackets.\n *\n * @param value The value to display.\n * @return Formatted string.\n */\n// tslint:disable-next-line:no-any\nexport function formatAsFriendlyString(value) {\n if (value === null) {\n return 'null';\n }\n else if (Array.isArray(value)) {\n return '[' + value.map(v => formatAsFriendlyString(v)).join(',') + ']';\n }\n else if (typeof value === 'string') {\n return `\"${value}\"`;\n }\n else {\n return `${value}`;\n }\n}\n/**\n * Returns a function `f2` (decorator) which wraps the original function\n * `f`. `f2` guarantees that `f` can be called at most once\n * every `waitMs` ms. If `f2` is called more often, it will return\n * the last returned result of `f`.\n *\n * @param f The original function `f` to wrap.\n * @param waitMs The time between two consecutive calls to `f` in ms.\n */\nexport function debounce(f, waitMs, nowFunc) {\n let lastTime = nowFunc != null ? nowFunc() : util.now();\n let lastResult;\n const f2 = (...args) => {\n const now = nowFunc != null ? nowFunc() : util.now();\n if (now - lastTime < waitMs) {\n return lastResult;\n }\n lastTime = now;\n lastResult = f(...args);\n return lastResult;\n };\n return f2;\n}\n/**\n * Returns the fusable activation given a layers identifier.\n *\n * @param activationName The layers identifier string.\n * @return The name of the fusable activation.\n */\nexport function mapActivationToFusedKernel(activationName) {\n if (activationName === 'relu') {\n return 'relu';\n }\n if (activationName === 'linear') {\n return 'linear';\n }\n if (activationName === 'elu') {\n return 'elu';\n }\n return null;\n}\n/**\n * Returns the cartesian product of sets of values.\n * This works the same as itertools.product in Python.\n *\n * Example:\n *\n * filters = [128, 256, 512]\n * paddings = ['same', 'valid']\n *\n * product = [ [128, 'same'], [128, 'valid'], [256, 'same'], [256, 'valid'],\n * [512, 'same'], [512, 'valid']]\n *\n * @param arrayOfValues List/array of values.\n * @return The cartesian product.\n */\nexport function getCartesianProductOfValues(...arrayOfValues) {\n assert(arrayOfValues.length > 0, 'arrayOfValues is empty');\n for (const values of arrayOfValues) {\n assert(Array.isArray(values), 'one of the values is not an array');\n assert(values.length > 0, 'one of the values is empty');\n }\n return arrayOfValues.reduce((products, values) => {\n if (products.length === 0) {\n return values.map(value => [value]);\n }\n return values\n .map(value => {\n return products.map((prevValue) => [...prevValue, value]);\n })\n .reduce((flattenedProduct, unflattenedProduct) => {\n return flattenedProduct.concat(unflattenedProduct);\n }, []);\n }, []);\n}\n//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZ2VuZXJpY191dGlscy5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uLy4uL3RmanMtbGF5ZXJzL3NyYy91dGlscy9nZW5lcmljX3V0aWxzLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBOzs7Ozs7OztHQVFHO0FBRUgsNkNBQTZDO0FBRTdDLE9BQU8sRUFBaUMsSUFBSSxFQUFDLE1BQU0sdUJBQXVCLENBQUM7QUFFM0UsT0FBTyxFQUFDLGNBQWMsRUFBRSxVQUFVLEVBQUMsTUFBTSxXQUFXLENBQUM7QUFFckQsZ0JBQWdCO0FBRWhCOzs7R0FHRztBQUNILGtDQUFrQztBQUNsQyxNQUFNLFVBQVUsWUFBWSxDQUFDLEtBQVUsRUFBRSxTQUFpQjtJQUN4RCxJQUFJLEtBQUssQ0FBQyxPQUFPLENBQUMsS0FBSyxDQUFDLEVBQUU7UUFDeEIsa0NBQWtDO1FBQ2xDLElBQUksUUFBUSxHQUFVLEVBQUUsQ0FBQztRQUN6QixLQUFLLElBQUksQ0FBQyxHQUFHLENBQUMsRUFBRSxDQUFDLEdBQUcsU0FBUyxFQUFFLENBQUMsRUFBRSxFQUFFO1lBQ2xDLFFBQVEsR0FBRyxRQUFRLENBQUMsTUFBTSxDQUFDLEtBQUssQ0FBQyxDQUFDO1NBQ25DO1FBQ0QsT0FBTyxRQUFRLENBQUM7S0FDakI7U0FBTTtRQUNMLE1BQU0sUUFBUSxHQUFHLElBQUksS0FBSyxDQUFDLFNBQVMsQ0FBQyxDQUFDO1FBQ3RDLFFBQVEsQ0FBQyxJQUFJLENBQUMsS0FBSyxDQUFDLENBQUM7UUFDckIsT0FBTyxRQUFRLENBQUM7S0FDakI7QUFDSCxDQUFDO0FBRUQsTUFBTSxVQUFVLE1BQU0sQ0FBQyxHQUFZLEVBQUUsT0FBZ0I7SUFDbkQsSUFBSSxDQUFDLEdBQUcsRUFBRTtRQUNSLE1BQU0sSUFBSSxjQUFjLENBQUMsT0FBTyxDQUFDLENBQUM7S0FDbkM7QUFDSCxDQUFDO0FBRUQ7O0dBRUc7QUFDSCxNQUFNLFVBQVUsS0FBSyxDQUFJLEtBQVUsRUFBRSxR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QyxDQUFDO1NBQ3JDO1FBRUQsT0FBTyxNQUFNO2FBQ1IsR0FBRyxDQUFDLEtBQUssQ0FBQyxFQUFFO1lBQ1gsT0FBTyxRQUFRLENBQUMsR0FBRyxDQUFDLENBQUMsU0FBUyxFQUFFLEVBQUUsQ0FBQyxDQUFDLEdBQUcsU0FBUyxFQUFFLEtBQUssQ0FBQyxDQUFDLENBQUM7UUFDNUQsQ0FBQyxDQUFDO2FBQ0QsTUFBTSxDQUFDLENBQUMsZ0JBQWdCLEVBQUUsa0JBQWtCLEVBQUUsRUFBRTtZQUMvQyxPQUFPLGdCQUFnQixDQUFDLE1BQU0sQ0FBQyxrQkFBa0IsQ0FBQyxDQUFDO1FBQ3JELENBQUMsRUFBRSxFQUFFLENBQUMsQ0FBQztJQUNiLENBQUMsRUFBRSxFQUFvQixDQUFDLENBQUM7QUFDM0IsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbIi8qKlxuICogQGxpY2Vuc2VcbiAqIENvcHlyaWdodCAyMDE4IEdvb2dsZSBMTENcbiAqXG4gKiBVc2Ugb2YgdGhpcyBzb3VyY2UgY29kZSBpcyBnb3Zlcm5lZCBieSBhbiBNSVQtc3R5bGVcbiAqIGxpY2Vuc2UgdGhhdCBjYW4gYmUgZm91bmQgaW4gdGhlIExJQ0VOU0UgZmlsZSBvciBhdFxuICogaHR0cHM6Ly9vcGVuc291cmNlLm9yZy9saWNlbnNlcy9NSVQuXG4gKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuICovXG5cbi8qIE9yaWdpbmFsIHNvdXJjZTogdXRpbHMvZ2VuZXJpY191dGlscy5weSAqL1xuXG5pbXBvcnQge0RhdGFUeXBlLCBmdXNlZCwgc2VyaWFsaXphdGlvbiwgdXRpbH0gZnJvbSAnQHRlbnNvcmZsb3cvdGZqcy1jb3JlJztcblxuaW1wb3J0IHtBc3NlcnRpb25FcnJvciwgVmFsdWVFcnJvcn0gZnJvbSAnLi4vZXJyb3JzJztcblxuLy8gdHNsaW50OmVuYWJsZVxuXG4vKipcbiAqIElmIGB2YWx1ZWAgaXMgYW4gQXJyYXksIGVxdWl2YWxlbnQgdG8gUHl0aG9uJ3MgYHZhbHVlICogbnVtVmFsdWVzYC5cbiAqIElmIGB2YWx1ZWAgaXMgbm90IGFuIEFycmF5LCBlcXVpdmFsZW50IHRvIFB5dGhvbidzIGBbdmFsdWVdICogbnVtVmFsdWVzYFxuICovXG4vLyB0c2xpbnQ6ZGlzYWJsZS1uZXh0LWxpbmU6bm8tYW55XG5leHBvcnQgZnVuY3Rpb24gcHlMaXN0UmVwZWF0KHZhbHVlOiBhbnksIG51bVZhbHVlczogbnVtYmVyKTogYW55W10ge1xuICBpZiAoQXJyYXkuaXNBcnJheSh2YWx1ZSkpIHtcbiAgICAvLyB0c2xpbnQ6ZGlzYWJsZS1uZXh0LWxpbmU6bm8tYW55XG4gICAgbGV0IG5ld0FycmF5OiBhbnlbXSA9IFtdO1xuICAgIGZvciAobGV0IGkgPSAwOyBpIDwgbnVtVmFsdWVzOyBpKyspIHtcbiAgICAgIG5ld0FycmF5ID0gbmV3QXJyYXkuY29uY2F0KHZhbHVlKTtcbiAgICB9XG4gICAgcmV0dXJuIG5ld0FycmF5O1xuICB9IGVsc2Uge1xuICAgIGNvbnN0IG5ld0FycmF5ID0gbmV3IEFycmF5KG51bVZhbHVlcyk7XG4gICAgbmV3QXJyYXkuZmlsbCh2YWx1ZSk7XG4gICAgcmV0dXJuIG5ld0FycmF5O1xuICB9XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBhc3NlcnQodmFsOiBib29sZWFuLCBtZXNzYWdlPzogc3RyaW5nKTogdm9pZCB7XG4gIGlmICghdmFsKSB7XG4gICAgdGhyb3cgbmV3IEFzc2VydGlvbkVycm9yKG1lc3NhZ2UpO1xuICB9XG59XG5cbi8qKlxuICogQ291bnQgdGhlIG51bWJlciBvZiBlbGVtZW50cyBvZiB0aGUgYGFycmF5YCB0aGF0IGFyZSBlcXVhbCB0byBgcmVmZXJlbmNlYC5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGNvdW50PFQ+KGFycmF5OiBUW10sIHJlZmVybmNlOiBUKSB7XG4gIGxldCBjb3VudGVyID0gMDtcbiAgZm9yIChjb25zdCBpdGVtIG9mIGFycmF5KSB7XG4gICAgaWYgKGl0ZW0gPT09IHJlZmVybmNlKSB7XG4gICAgICBjb3VudGVyKys7XG4gICAgfVxuICB9XG4gIHJldHVybiBjb3VudGVyO1xufVxuXG4vKipcbiAqIElmIGFuIGFycmF5IGlzIG9mIGxlbmd0aCAxLCBqdXN0IHJldHVybiB0aGUgZmlyc3QgZWxlbWVudC4gT3RoZXJ3aXNlLCByZXR1cm5cbiAqIHRoZSBmdWxsIGFycmF5LlxuICogQHBhcmFtIHRlbnNvcnNcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHNpbmdsZXRvbk9yQXJyYXk8VD4oeHM6IFRbXSk6IFR8VFtdIHtcbiAgaWYgKHhzLmxlbmd0aCA9PT0gMSkge1xuICAgIHJldHVybiB4c1swXTtcbiAgfVxuICByZXR1cm4geHM7XG59XG5cbi8qKlxuICogTm9ybWFsaXplcyBhIGxpc3QvdGVuc29yIGludG8gYSBsaXN0LlxuICpcbiAqIElmIGEgdGVuc29yIGlzIHBhc3NlZCwgd2UgcmV0dXJuXG4gKiBhIGxpc3Qgb2Ygc2l6ZSAxIGNvbnRhaW5pbmcgdGhlIHRlbnNvci5cbiAqXG4gKiBAcGFyYW0geCB0YXJnZXQgb2JqZWN0IHRvIGJlIG5vcm1hbGl6ZWQuXG4gKi9cbi8vIHRzbGludDpkaXNhYmxlLW5leHQtbGluZTpuby1hbnlcbmV4cG9ydCBmdW5jdGlvbiB0b0xpc3QoeDogYW55KTogYW55W10ge1xuICBpZiAoQXJyYXkuaXNBcnJheSh4KSkge1xuICAgIHJldHVybiB4O1xuICB9XG4gIHJldHVybiBbeF07XG59XG5cbi8qKlxuICogR2VuZXJhdGUgYSBVSUQgZm9yIGEgbGlzdFxuICovXG4vLyB0c2xpbnQ6ZGlzYWJsZS1uZXh0LWxpbmU6bm8tYW55XG5leHBvcnQgZnVuY3Rpb24gb2JqZWN0TGlzdFVpZChvYmpzOiBhbnl8YW55W10pOiBzdHJpbmcge1xuICBjb25zdCBvYmplY3RMaXN0ID0gdG9MaXN0KG9ianMpO1xuICBsZXQgcmV0VmFsID0gJyc7XG4gIGZvciAoY29uc3Qgb2JqIG9mIG9iamVjdExpc3QpIHtcbiAgICBpZiAob2JqLmlkID09IG51bGwpIHtcbiAgICAgIHRocm93IG5ldyBWYWx1ZUVycm9yKFxuICAgICAgICAgIGBPYmplY3QgJHtvYmp9IHBhc3NlZCB0byBvYmplY3RMaXN0VWlkIHdpdGhvdXQgYW4gaWRgKTtcbiAgICB9XG4gICAgaWYgKHJldFZhbCAhPT0gJycpIHtcbiAgICAgIHJldFZhbCA9IHJldFZhbCArICcsICc7XG4gICAgfVxuICAgIHJldFZhbCA9IGAke3JldFZhbH0ke01hdGguYWJzKG9iai5pZCl9YDtcbiAgfVxuICByZXR1cm4gcmV0VmFsO1xufVxuLyoqXG4gKiBDb252ZXJ0cyBzdHJpbmcgdG8gc25ha2UtY2FzZS5cbiAqIEBwYXJhbSBuYW1lXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiB0b1NuYWtlQ2FzZShuYW1lOiBzdHJpbmcpOiBzdHJpbmcge1xuICBjb25zdCBpbnRlcm1lZGlhdGUgPSBuYW1lLnJlcGxhY2UoLyguKShbQS1aXVthLXowLTldKykvZywgJyQxXyQyJyk7XG4gIGNvbnN0IGluc2VjdXJlID1cbiAgICAgIGludGVybWVkaWF0ZS5yZXBsYWNlKC8oW2Etel0pKFtBLVpdKS9nLCAnJDFfJDInKS50b0xvd2VyQ2FzZSgpO1xuICAvKlxuICAgSWYgdGhlIGNsYXNzIGlzIHByaXZhdGUgdGhlIG5hbWUgc3RhcnRzIHdpdGggXCJfXCIgd2hpY2ggaXMgbm90IHNlY3VyZVxuICAgZm9yIGNyZWF0aW5nIHNjb3Blcy4gV2UgcHJlZml4IHRoZSBuYW1lIHdpdGggXCJwcml2YXRlXCIgaW4gdGhpcyBjYXNlLlxuICAgKi9cbiAgaWYgKGluc2VjdXJlWzBdICE9PSAnXycpIHtcbiAgICByZXR1cm4gaW5zZWN1cmU7XG4gIH1cbiAgcmV0dXJuICdwcml2YXRlJyArIGluc2VjdXJlO1xufVxuXG5leHBvcnQgZnVuY3Rpb24gdG9DYW1lbENhc2UoaWRlbnRpZmllcjogc3RyaW5nKTogc3RyaW5nIHtcbiAgLy8gcXVpY2sgcmV0dXJuIGZvciBlbXB0eSBzdHJpbmcgb3Igc2luZ2xlIGNoYXJhY3RlciBzdHJpbmdzXG4gIGlmIChpZGVudGlmaWVyLmxlbmd0aCA8PSAxKSB7XG4gICAgcmV0dXJuIGlkZW50aWZpZXI7XG4gIH1cbiAgLy8gQ2hlY2sgZm9yIHRoZSB1bmRlcnNjb3JlIGluZGljYXRpbmcgc25ha2VfY2FzZVxuICBpZiAoaWRlbnRpZmllci5pbmRleE9mKCdfJykgPT09IC0xKSB7XG4gICAgcmV0dXJuIGlkZW50aWZpZXI7XG4gIH1cbiAgcmV0dXJuIGlkZW50aWZpZXIucmVwbGFjZSgvW19dKyhcXHd8JCkvZywgKG0sIHAxKSA9PiBwMS50b1VwcGVyQ2FzZSgpKTtcbn1cblxuLy8gdHNsaW50OmRpc2FibGUtbmV4dC1saW5lOm5vLWFueVxubGV0IF9HTE9CQUxfQ1VTVE9NX09CSkVDVFMgPSB7fSBhcyB7W29iak5hbWU6IHN0cmluZ106IGFueX07XG5cbmV4cG9ydCBmdW5jdGlvbiBzZXJpYWxpemVLZXJhc09iamVjdChpbnN0YW5jZTogc2VyaWFsaXphdGlvbi5TZXJpYWxpemFibGUpOlxuICAgIHNlcmlhbGl6YXRpb24uQ29uZmlnRGljdFZhbHVlIHtcbiAgaWYgKGluc3RhbmNlID09PSBudWxsIHx8IGluc3RhbmNlID09PSB1bmRlZmluZWQpIHtcbiAgICByZXR1cm4gbnVsbDtcbiAgfVxuICBjb25zdCBkaWN0OiBzZXJpYWxpemF0aW9uLkNvbmZpZ0RpY3RWYWx1ZSA9IHt9O1xuICBkaWN0WydjbGFzc05hbWUnXSA9IGluc3RhbmNlLmdldENsYXNzTmFtZSgpO1xuICBkaWN0Wydjb25maWcnXSA9IGluc3RhbmNlLmdldENvbmZpZygpO1xuICByZXR1cm4gZGljdDtcbn1cblxuLyoqXG4gKiBSZXBsYWNlIG5kYXJyYXktc3R5bGUgc2NhbGFyIG9iamVjdHMgaW4gc2VyaWFsaXphdGlvbiBvYmplY3RzIHdpdGggbnVtYmVycy5cbiAqXG4gKiBCYWNrZ3JvdW5kOiBJbiBzb21lIHZlcnNpb25zIG9mIHRmLmtlcmFzLCBjZXJ0YWluIHNjYWxhciB2YWx1ZXMgaW4gdGhlIEhERjVcbiAqIG1vZGVsIHNhdmUgZmlsZSBjYW4gYmUgc2VyaWFsaXplZCBhczogYHsndHlwZSc6ICduZGFycmF5JywgJ3ZhbHVlJzogbnVtfWAsXG4gKiB3aGVyZSBpbiBgbnVtYCBpcyBhIHBsYWluIG51bWJlci4gVGhpcyBtZXRob2QgY29udmVydHMgc3VjaCBzZXJpYWxpemF0aW9uXG4gKiB0byBhIGBudW1iZXJgLlxuICpcbiAqIEBwYXJhbSBjb25maWcgVGhlIGtlcmFzLWZvcm1hdCBzZXJpYWxpemF0aW9uIG9iamVjdCB0byBiZSBwcm9jZXNzZWRcbiAqICAgKGluIHBsYWNlKS5cbiAqL1xuZnVuY3Rpb24gY29udmVydE5EQXJyYXlTY2FsYXJzSW5Db25maWcoY29uZmlnOiBzZXJpYWxpemF0aW9uLkNvbmZpZ0RpY3RWYWx1ZSk6XG4gICAgdm9pZCB7XG4gIGlmIChjb25maWcgPT0gbnVsbCB8fCB0eXBlb2YgY29uZmlnICE9PSAnb2JqZWN0Jykge1xuICAgIHJldHVybjtcbiAgfSBlbHNlIGlmIChBcnJheS5pc0FycmF5KGNvbmZpZykpIHtcbiAgICBjb25maWcuZm9yRWFjaChjb25maWdJdGVtID0+IGNvbnZlcnROREFycmF5U2NhbGFyc0luQ29uZmlnKGNvbmZpZ0l0ZW0pKTtcbiAgfSBlbHNlIHtcbiAgICBjb25zdCBmaWVsZHMgPSBPYmplY3Qua2V5cyhjb25maWcpO1xuICAgIGZvciAoY29uc3QgZmllbGQgb2YgZmllbGRzKSB7XG4gICAgICBjb25zdCB2YWx1ZSA9IGNvbmZpZ1tmaWVsZF07XG4gICAgICBpZiAodmFsdWUgIT0gbnVsbCAmJiB0eXBlb2YgdmFsdWUgPT09ICdvYmplY3QnKSB7XG4gICAgICAgIGlmICghQXJyYXkuaXNBcnJheSh2YWx1ZSkgJiYgdmFsdWVbJ3R5cGUnXSA9PT0gJ25kYXJyYXknICYmXG4gICAgICAgICAgICB0eXBlb2YgdmFsdWVbJ3ZhbHVlJ10gPT09ICdudW1iZXInKSB7XG4gICAgICAgICAgY29uZmlnW2ZpZWxkXSA9IHZhbHVlWyd2YWx1ZSddO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIGNvbnZlcnROREFycmF5U2NhbGFyc0luQ29uZmlnKHZhbHVlIGFzIHNlcmlhbGl6YXRpb24uQ29uZmlnRGljdCk7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9XG4gIH1cbn1cblxuLyoqXG4gKiBEZXNlcmlhbGl6ZSBhIHNhdmVkIEtlcmFzIE9iamVjdFxuICogQHBhcmFtIGlkZW50aWZpZXIgZWl0aGVyIGEgc3RyaW5nIElEIG9yIGEgc2F2ZWQgS2VyYXMgZGljdGlvbmFyeVxuICogQHBhcmFtIG1vZHVsZU9iamVjdHMgYSBsaXN0IG9mIFB5dGhvbiBjbGFzcyBuYW1lcyB0byBvYmplY3QgY29uc3RydWN0b3JzXG4gKiBAcGFyYW0gY3VzdG9tT2JqZWN0cyBhIGxpc3Qgb2YgUHl0aG9uIGNsYXNzIG5hbWVzIHRvIG9iamVjdCBjb25zdHJ1Y3RvcnNcbiAqIEBwYXJhbSBwcmludGFibGVNb2R1bGVOYW1lIGRlYnVnIHRleHQgZm9yIHRoZSBvYmplY3QgYmVpbmcgcmVjb25zdGl0dXRlZFxuICogQHBhcmFtIGZhc3RXZWlnaHRJbml0IE9wdGlvbmFsIGZsYWcgdG8gdXNlIGZhc3Qgd2VpZ2h0IGluaXRpYWxpemF0aW9uXG4gKiAgIGR1cmluZyBkZXNlcmlhbGl6YXRpb24uIFRoaXMgaXMgYXBwbGljYWJsZSB0byBjYXNlcyBpbiB3aGljaFxuICogICB0aGUgaW5pdGlhbGl6YXRpb24gd2lsbCBiZSBpbW1lZGlhdGVseSBvdmVyd3JpdHRlbiBieSBsb2FkZWQgd2VpZ2h0XG4gKiAgIHZhbHVlcy4gRGVmYXVsdDogYGZhbHNlYC5cbiAqIEByZXR1cm5zIGEgVGVuc29yRmxvdy5qcyBMYXllcnMgb2JqZWN0XG4gKi9cbi8vIHRzbGludDpkaXNhYmxlOm5vLWFueVxuZXhwb3J0IGZ1bmN0aW9uIGRlc2VyaWFsaXplS2VyYXNPYmplY3QoXG4gICAgaWRlbnRpZmllcjogc3RyaW5nfHNlcmlhbGl6YXRpb24uQ29uZmlnRGljdCxcbiAgICBtb2R1bGVPYmplY3RzID0ge30gYXMge1tvYmpOYW1lOiBzdHJpbmddOiBhbnl9LFxuICAgIGN1c3RvbU9iamVjdHMgPSB7fSBhcyB7W29iak5hbWU6IHN0cmluZ106IGFueX0sXG4gICAgcHJpbnRhYmxlTW9kdWxlTmFtZSA9ICdvYmplY3QnLCBmYXN0V2VpZ2h0SW5pdCA9IGZhbHNlKTogYW55IHtcbiAgLy8gdHNsaW50OmVuYWJsZVxuICBpZiAodHlwZW9mIGlkZW50aWZpZXIgPT09ICdzdHJpbmcnKSB7XG4gICAgY29uc3QgZnVuY3Rpb25OYW1lID0gaWRlbnRpZmllcjtcbiAgICBsZXQgZm47XG4gICAgaWYgKGZ1bmN0aW9uTmFtZSBpbiBjdXN0b21PYmplY3RzKSB7XG4gICAgICBmbiA9IGN1c3RvbU9iamVjdHNbZnVuY3Rpb25OYW1lXTtcbiAgICB9IGVsc2UgaWYgKGZ1bmN0aW9uTmFtZSBpbiBfR0xPQkFMX0NVU1RPTV9PQkpFQ1RTKSB7XG4gICAgICBmbiA9IF9HTE9CQUxfQ1VTVE9NX09CSkVDVFNbZnVuY3Rpb25OYW1lXTtcbiAgICB9IGVsc2Uge1xuICAgICAgZm4gPSBtb2R1bGVPYmplY3RzW2Z1bmN0aW9uTmFtZV07XG4gICAgICBpZiAoZm4gPT0gbnVsbCkge1xuICAgICAgICB0aHJvdyBuZXcgVmFsdWVFcnJvcihcbiAgICAgICAgICAgIGBVbmtub3duICR7cHJpbnRhYmxlTW9kdWxlTmFtZX06ICR7aWRlbnRpZmllcn0uIGAgK1xuICAgICAgICAgICAgYFRoaXMgbWF5IGJlIGR1ZSB0byBvbmUgb2YgdGhlIGZvbGxvd2luZyByZWFzb25zOlxcbmAgK1xuICAgICAgICAgICAgYDEuIFRoZSAke3ByaW50YWJsZU1vZHVsZU5hbWV9IGlzIGRlZmluZWQgaW4gUHl0aG9uLCBpbiB3aGljaCBgICtcbiAgICAgICAgICAgIGBjYXNlIGl0IG5lZWRzIHRvIGJlIHBvcnRlZCB0byBUZW5zb3JGbG93LmpzIG9yIHlvdXIgSmF2YVNjcmlwdCBgICtcbiAgICAgICAgICAgIGBjb2RlLlxcbmAgK1xuICAgICAgICAgICAgYDIuIFRoZSBjdXN0b20gJHtwcmludGFibGVNb2R1bGVOYW1lfSBpcyBkZWZpbmVkIGluIEphdmFTY3JpcHQsIGAgK1xuICAgICAgICAgICAgYGJ1dCBpcyBub3QgcmVnaXN0ZXJlZCBwcm9wZXJseSB3aXRoIGAgK1xuICAgICAgICAgICAgYHRmLnNlcmlhbGl6YXRpb24ucmVnaXN0ZXJDbGFzcygpLmApO1xuICAgICAgICAvLyBUT0RPKGNhaXMpOiBBZGQgbGluayB0byB0dXRvcmlhbCBwYWdlIG9uIGN1c3RvbSBsYXllcnMuXG4gICAgICB9XG4gICAgfVxuICAgIHJldHVybiBmbjtcbiAgfSBlbHNlIHtcbiAgICAvLyBJbiB0aGlzIGNhc2Ugd2UgYXJlIGRlYWxpbmcgd2l0aCBhIEtlcmFzIGNvbmZpZyBkaWN0aW9uYXJ5LlxuICAgIGNvbnN0IGNvbmZpZyA9IGlkZW50aWZpZXI7XG4gICAgaWYgKGNvbmZpZ1snY2xhc3NOYW1lJ10gPT0gbnVsbCB8fCBjb25maWdbJ2NvbmZpZyddID09IG51bGwpIHtcbiAgICAgIHRocm93IG5ldyBWYWx1ZUVycm9yKFxuICAgICAgICAgIGAke3ByaW50YWJsZU1vZHVsZU5hbWV9OiBJbXByb3BlciBjb25maWcgZm9ybWF0OiBgICtcbiAgICAgICAgICBgJHtKU09OLnN0cmluZ2lmeShjb25maWcpfS5cXG5gICtcbiAgICAgICAgICBgJ2NsYXNzTmFtZScgYW5kICdjb25maWcnIG11c3Qgc2V0LmApO1xuICAgIH1cbiAgICBjb25zdCBjbGFzc05hbWUgPSBjb25maWdbJ2NsYXNzTmFtZSddIGFzIHN0cmluZztcbiAgICBsZXQgY2xzLCBmcm9tQ29uZmlnO1xuICAgIGlmIChjbGFzc05hbWUgaW4gY3VzdG9tT2JqZWN0cykge1xuICAgICAgW2NscywgZnJvbUNvbmZpZ10gPSBjdXN0b21PYmplY3RzW2NsYXNzTmFtZV07XG4gICAgfSBlbHNlIGlmIChjbGFzc05hbWUgaW4gX0dMT0JBTF9DVVNUT01fT0JKRUNUUykge1xuICAgICAgW2NscywgZnJvbUNvbmZpZ10gPSBfR0xPQkFMX0NVU1RPTV9PQkpFQ1RTWydjbGFzc05hbWUnXTtcbiAgICB9IGVsc2UgaWYgKGNsYXNzTmFtZSBpbiBtb2R1bGVPYmplY3RzKSB7XG4gICAgICBbY2xzLCBmcm9tQ29uZmlnXSA9IG1vZHVsZU9iamVjdHNbY2xhc3NOYW1lXTtcbiAgICB9XG4gICAgaWYgKGNscyA9PSBudWxsKSB7XG4gICAgICB0aHJvdyBuZXcgVmFsdWVFcnJvcihcbiAgICAgICAgICBgVW5rbm93biAke3ByaW50YWJsZU1vZHVsZU5hbWV9OiAke2NsYXNzTmFtZX0uIGAgK1xuICAgICAgICAgIGBUaGlzIG1heSBiZSBkdWUgdG8gb25lIG9mIHRoZSBmb2xsb3dpbmcgcmVhc29uczpcXG5gICtcbiAgICAgICAgICBgMS4gVGhlICR7cHJpbnRhYmxlTW9kdWxlTmFtZX0gaXMgZGVmaW5lZCBpbiBQeXRob24sIGluIHdoaWNoIGAgK1xuICAgICAgICAgIGBjYXNlIGl0IG5lZWRzIHRvIGJlIHBvcnRlZCB0byBUZW5zb3JGbG93LmpzIG9yIHlvdXIgSmF2YVNjcmlwdCBgICtcbiAgICAgICAgICBgY29kZS5cXG5gICtcbiAgICAgICAgICBgMi4gVGhlIGN1c3RvbSAke3ByaW50YWJsZU1vZHVsZU5hbWV9IGlzIGRlZmluZWQgaW4gSmF2YVNjcmlwdCwgYCArXG4gICAgICAgICAgYGJ1dCBpcyBub3QgcmVnaXN0ZXJlZCBwcm9wZXJseSB3aXRoIGAgK1xuICAgICAgICAgIGB0Zi5zZXJpYWxpemF0aW9uLnJlZ2lzdGVyQ2xhc3MoKS5gKTtcbiAgICAgIC8vIFRPRE8oY2Fpcyk6IEFkZCBsaW5rIHRvIHR1dG9yaWFsIHBhZ2Ugb24gY3VzdG9tIGxheWVycy5cbiAgICB9XG4gICAgaWYgKGZyb21Db25maWcgIT0gbnVsbCkge1xuICAgICAgLy8gUG9ydGluZyBub3RlczogSW5zdGVhZCBvZiBjaGVja2luZyB0byBzZWUgd2hldGhlciBmcm9tQ29uZmlnIGFjY2VwdHNcbiAgICAgIC8vIGN1c3RvbU9iamVjdHMsIHdlIGNyZWF0ZSBhIGN1c3RvbU9iamVjdHMgZGljdGlvbmFyeSBhbmQgdGFjayBpdCBvbiB0b1xuICAgICAgLy8gY29uZmlnWydjb25maWcnXSBhcyBjb25maWdbJ2NvbmZpZyddLmN1c3RvbU9iamVjdHMuIE9iamVjdHMgY2FuIHVzZSBpdCxcbiAgICAgIC8vIGlmIHRoZXkgd2FudC5cblxuICAgICAgLy8gdHNsaW50OmRpc2FibGUtbmV4dC1saW5lOm5vLWFueVxuICAgICAgY29uc3QgY3VzdG9tT2JqZWN0c0NvbWJpbmVkID0ge30gYXMge1tvYmpOYW1lOiBzdHJpbmddOiBhbnl9O1xuICAgICAgZm9yIChjb25zdCBrZXkgb2YgT2JqZWN0LmtleXMoX0dMT0JBTF9DVVNUT01fT0JKRUNUUykpIHtcbiAgICAgICAgY3VzdG9tT2JqZWN0c0NvbWJpbmVkW2tleV0gPSBfR0xPQkFMX0NVU1RPTV9PQkpFQ1RTW2tleV07XG4gICAgICB9XG4gICAgICBmb3IgKGNvbnN0IGtleSBvZiBPYmplY3Qua2V5cyhjdXN0b21PYmplY3RzKSkge1xuICAgICAgICBjdXN0b21PYmplY3RzQ29tYmluZWRba2V5XSA9IGN1c3RvbU9iamVjdHNba2V5XTtcbiAgICAgIH1cbiAgICAgIC8vIEFkZCB0aGUgY3VzdG9tT2JqZWN0cyB0byBjb25maWdcbiAgICAgIGNvbnN0IG5lc3RlZENvbmZpZyA9IGNvbmZpZ1snY29uZmlnJ10gYXMgc2VyaWFsaXphdGlvbi5Db25maWdEaWN0O1xuICAgICAgbmVzdGVkQ29uZmlnWydjdXN0b21PYmplY3RzJ10gPSBjdXN0b21PYmplY3RzQ29tYmluZWQ7XG5cbiAgICAgIGNvbnN0IGJhY2t1cEN1c3RvbU9iamVjdHMgPSB7Li4uX0dMT0JBTF9DVVNUT01fT0JKRUNUU307XG4gICAgICBmb3IgKGNvbnN0IGtleSBvZiBPYmplY3Qua2V5cyhjdXN0b21PYmplY3RzKSkge1xuICAgICAgICBfR0xPQkFMX0NVU1RPTV9PQkpFQ1RTW2tleV0gPSBjdXN0b21PYmplY3RzW2tleV07XG4gICAgICB9XG4gICAgICBjb252ZXJ0TkRBcnJheVNjYWxhcnNJbkNvbmZpZyhjb25maWdbJ2NvbmZpZyddKTtcbiAgICAgIGNvbnN0IHJldHVybk9iaiA9XG4gICAgICAgICAgZnJvbUNvbmZpZyhjbHMsIGNvbmZpZ1snY29uZmlnJ10sIGN1c3RvbU9iamVjdHMsIGZhc3RXZWlnaHRJbml0KTtcbiAgICAgIF9HTE9CQUxfQ1VTVE9NX09CSkVDVFMgPSB7Li4uYmFja3VwQ3VzdG9tT2JqZWN0c307XG5cbiAgICAgIHJldHVybiByZXR1cm5PYmo7XG4gICAgfSBlbHNlIHtcbiAgICAgIC8vIFRoZW4gYGNsc2AgbWF5IGJlIGEgZnVuY3Rpb24gcmV0dXJuaW5nIGEgY2xhc3MuXG4gICAgICAvLyBJbiB0aGlzIGNhc2UgYnkgY29udmVudGlvbiBgY29uZmlnYCBob2xkc1xuICAgICAgLy8gdGhlIGt3YXJncyBvZiB0aGUgZnVuY3Rpb24uXG4gICAgICBjb25zdCBiYWNrdXBDdXN0b21PYmplY3RzID0gey4uLl9HTE9CQUxfQ1VTVE9NX09CSkVDVFN9O1xuICAgICAgZm9yIChjb25zdCBrZXkgb2YgT2JqZWN0LmtleXMoY3VzdG9tT2JqZWN0cykpIHtcbiAgICAgICAgX0dMT0JBTF9DVVNUT01fT0JKRUNUU1trZXldID0gY3VzdG9tT2JqZWN0c1trZXldO1xuICAgICAgfVxuICAgICAgLy8gSW4gcHl0aG9uIHRoaXMgaXMgKipjb25maWdbJ2NvbmZpZyddLCBmb3IgdGZqcy1sYXllcnMgd2UgcmVxdWlyZVxuICAgICAgLy8gY2xhc3NlcyB0aGF0IHVzZSB0aGlzIGZhbGwtdGhyb3VnaCBjb25zdHJ1Y3Rpb24gbWV0aG9kIHRvIHRha2VcbiAgICAgIC8vIGEgY29uZmlnIGludGVyZmFjZSB0aGF0IG1pbWljcyB0aGUgZXhwYW5zaW9uIG9mIG5hbWVkIHBhcmFtZXRlcnMuXG4gICAgICBjb25zdCByZXR1cm5PYmogPSBuZXcgY2xzKGNvbmZpZ1snY29uZmlnJ10pO1xuICAgICAgX0dMT0JBTF9DVVNUT01fT0JKRUNUUyA9IHsuLi5iYWNrdXBDdXN0b21PYmplY3RzfTtcbiAgICAgIHJldHVybiByZXR1cm5PYmo7XG4gICAgfVxuICB9XG59XG5cbi8qKlxuICogQ29tcGFyZXMgdHdvIG51bWJlcnMgZm9yIHNvcnRpbmcuXG4gKiBAcGFyYW0gYVxuICogQHBhcmFtIGJcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIG51bWJlckNvbXBhcmUoYTogbnVtYmVyLCBiOiBudW1iZXIpIHtcbiAgcmV0dXJuIChhIDwgYikgPyAtMSA6ICgoYSA+IGIpID8gMSA6IDApO1xufVxuXG4vKipcbiAqIENvbXBhcmlzb24gb2YgdHdvIG51bWJlcnMgZm9yIHJldmVyc2Ugc29ydGluZy5cbiAqIEBwYXJhbSBhXG4gKiBAcGFyYW0gYlxuICovXG5leHBvcnQgZnVuY3Rpb24gcmV2ZXJzZU51bWJlckNvbXBhcmUoYTogbnVtYmVyLCBiOiBudW1iZXIpIHtcbiAgcmV0dXJuIC0xICogbnVtYmVyQ29tcGFyZShhLCBiKTtcbn1cblxuLyoqXG4gKiBDb252ZXJ0IGEgc3RyaW5nIGludG8gdGhlIGNvcnJlc3BvbmRpbmcgRFR5cGUuXG4gKiBAcGFyYW0gZHR5cGVcbiAqIEByZXR1cm5zIEFuIGluc3RhbmNlIG9mIERUeXBlLlxuICovXG5leHBvcnQgZnVuY3Rpb24gc3RyaW5nVG9EVHlwZShkdHlwZTogc3RyaW5nKTogRGF0YVR5cGUge1xuICBzd2l0Y2ggKGR0eXBlKSB7XG4gICAgY2FzZSAnZmxvYXQzMic6XG4gICAgICByZXR1cm4gJ2Zsb2F0MzInO1xuICAgIGRlZmF1bHQ6XG4gICAgICB0aHJvdyBuZXcgVmFsdWVFcnJvcihgSW52YWxpZCBkdHlwZTogJHtkdHlwZX1gKTtcbiAgfVxufVxuXG4vKipcbiAqIFRlc3QgdGhlIGVsZW1lbnQtYnktZWxlbWVudCBlcXVhbGl0eSBvZiB0d28gQXJyYXlzIG9mIHN0cmluZ3MuXG4gKiBAcGFyYW0geHMgRmlyc3QgYXJyYXkgb2Ygc3RyaW5ncy5cbiAqIEBwYXJhbSB5cyBTZWNvbmQgYXJyYXkgb2Ygc3RyaW5ncy5cbiAqIEByZXR1cm5zIFdldGhlciB0aGUgdHdvIGFycmF5cyBhcmUgYWxsIGVxdWFsLCBlbGVtZW50IGJ5IGVsZW1lbnQuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBzdHJpbmdzRXF1YWwoeHM6IHN0cmluZ1tdLCB5czogc3RyaW5nW10pOiBib29sZWFuIHtcbiAgaWYgKHhzID09IG51bGwgfHwgeXMgPT0gbnVsbCkge1xuICAgIHJldHVybiB4cyA9PT0geXM7XG4gIH1cbiAgaWYgKHhzLmxlbmd0aCAhPT0geXMubGVuZ3RoKSB7XG4gICAgcmV0dXJuIGZhbHNlO1xuICB9XG4gIGZvciAobGV0IGkgPSAwOyBpIDwgeHMubGVuZ3RoOyArK2kpIHtcbiAgICBpZiAoeHNbaV0gIT09IHlzW2ldKSB7XG4gICAgICByZXR1cm4gZmFsc2U7XG4gICAgfVxuICB9XG4gIHJldHVybiB0cnVlO1xufVxuXG4vKipcbiAqIEdldCB0aGUgdW5pcXVlIGVsZW1lbnRzIG9mIGFuIGFycmF5LlxuICogQHBhcmFtIHhzIEFycmF5LlxuICogQHJldHVybnMgQW4gQXJyYXkgY29uc2lzdGluZyBvZiB0aGUgdW5pcXVlIGVsZW1lbnRzIGluIGB4c2AuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiB1bmlxdWU8VD4oeHM6IFRbXSk6IFRbXSB7XG4gIGlmICh4cyA9PSBudWxsKSB7XG4gICAgcmV0dXJuIHhzO1xuICB9XG4gIGNvbnN0IG91dDogVFtdID0gW107XG4gIC8vIFRPRE8oY2Fpcyk6IE1heWJlIGltcHJvdmUgcGVyZm9ybWFuY2UgYnkgc29ydGluZy5cbiAgZm9yIChjb25zdCB4IG9mIHhzKSB7XG4gICAgaWYgKG91dC5pbmRleE9mKHgpID09PSAtMSkge1xuICAgICAgb3V0LnB1c2goeCk7XG4gICAgfVxuICB9XG4gIHJldHVybiBvdXQ7XG59XG5cbi8qKlxuICogRGV0ZXJtaW5lIGlmIGFuIE9iamVjdCBpcyBlbXB0eSAoaS5lLiwgZG9lcyBub3QgaGF2ZSBvd24gcHJvcGVydGllcykuXG4gKiBAcGFyYW0gb2JqIE9iamVjdFxuICogQHJldHVybnMgV2hldGhlciB0aGUgT2JqZWN0IGlzIGVtcHR5LlxuICogQHRocm93cyBWYWx1ZUVycm9yOiBJZiBvYmplY3QgaXMgYG51bGxgIG9yIGB1bmRlZmluZWRgLlxuICovXG5leHBvcnQgZnVuY3Rpb24gaXNPYmplY3RFbXB0eShvYmo6IHt9KTogYm9vbGVhbiB7XG4gIGlmIChvYmogPT0gbnVsbCkge1xuICAgIHRocm93IG5ldyBWYWx1ZUVycm9yKGBJbnZhbGlkIHZhbHVlIGluIG9iajogJHtKU09OLnN0cmluZ2lmeShvYmopfWApO1xuICB9XG4gIGZvciAoY29uc3Qga2V5IGluIG9iaikge1xuICAgIGlmIChvYmouaGFzT3duUHJvcGVydHkoa2V5KSkge1xuICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH1cbiAgfVxuICByZXR1cm4gdHJ1ZTtcbn1cblxuLyoqXG4gKiBIZWxwZXIgZnVuY3Rpb24gdXNlZCB0byBidWlsZCB0eXBlIHVuaW9uL2VudW0gcnVuLXRpbWUgY2hlY2tlcnMuXG4gKiBAcGFyYW0gdmFsdWVzIFRoZSBsaXN0IG9mIGFsbG93ZWQgdmFsdWVzLlxuICogQHBhcmFtIGxhYmVsIEEgc3RyaW5nIG5hbWUgZm9yIHRoZSB0eXBlXG4gKiBAcGFyYW0gdmFsdWUgVGhlIHZhbHVlIHRvIHRlc3QuXG4gKiBAdGhyb3dzIFZhbHVlRXJyb3I6IElmIHRoZSB2YWx1ZSBpcyBub3QgaW4gdmFsdWVzIG5vciBgdW5kZWZpbmVkYC9gbnVsbGAuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBjaGVja1N0cmluZ1R5cGVVbmlvblZhbHVlKFxuICAgIHZhbHVlczogc3RyaW5nW10sIGxhYmVsOiBzdHJpbmcsIHZhbHVlOiBzdHJpbmcpOiB2b2lkIHtcbiAgaWYgKHZhbHVlID09IG51bGwpIHtcbiAgICByZXR1cm47XG4gIH1cbiAgaWYgKHZhbHVlcy5pbmRleE9mKHZhbHVlKSA8IDApIHtcbiAgICB0aHJvdyBuZXcgVmFsdWVFcnJvcihgJHt2YWx1ZX0gaXMgbm90IGEgdmFsaWQgJHtsYWJlbH0uICBWYWxpZCB2YWx1ZXMgYXJlICR7XG4gICAgICAgIHZhbHVlc30gb3IgbnVsbC91bmRlZmluZWQuYCk7XG4gIH1cbn1cblxuLyoqXG4gKiBIZWxwZXIgZnVuY3Rpb24gZm9yIHZlcmlmeWluZyB0aGUgdHlwZXMgb2YgaW5wdXRzLlxuICpcbiAqIEVuc3VyZXMgdGhhdCB0aGUgZWxlbWVudHMgb2YgYHhgIGFyZSBhbGwgb2YgdHlwZSBgZXhwZWN0ZWRUeXBlYC5cbiAqIEFsc28gdmVyaWZpZXMgdGhhdCB0aGUgbGVuZ3RoIG9mIGB4YCBpcyB3aXRoaW4gYm91bmRzLlxuICpcbiAqIEBwYXJhbSB4IE9iamVjdCB0byB0ZXN0LlxuICogQHBhcmFtIGV4cGVjdGVkVHlwZSBUaGUgc3RyaW5nIGV4cGVjdGVkIHR5cGUgb2YgYWxsIG9mIHRoZSBlbGVtZW50cyBpbiB0aGVcbiAqIEFycmF5LlxuICogQHBhcmFtIG1pbkxlbmd0aCBSZXR1cm4gZmFsc2UgaWYgeC5sZW5ndGggaXMgbGVzcyB0aGFuIHRoaXMuXG4gKiBAcGFyYW0gbWF4TGVuZ3RoIFJldHVybiBmYWxzZSBpZiB4Lmxlbmd0aCBpcyBncmVhdGVyIHRoYW4gdGhpcy5cbiAqIEByZXR1cm5zIHRydWUgaWYgYW5kIG9ubHkgaWYgYHhgIGlzIGFuIGBBcnJheTxleHBlY3RlZFR5cGU+YCB3aXRoXG4gKiBsZW5ndGggPj0gYG1pbkxlbmd0aGAgYW5kIDw9IGBtYXhMZW5ndGhgLlxuICovXG4vLyB0c2xpbnQ6ZGlzYWJsZTpuby1hbnlcbmV4cG9ydCBmdW5jdGlvbiBjaGVja0FycmF5VHlwZUFuZExlbmd0aChcbiAgICB4OiBhbnksIGV4cGVjdGVkVHlwZTogc3RyaW5nLCBtaW5MZW5ndGggPSAwLFxuICAgIG1heExlbmd0aCA9IEluZmluaXR5KTogYm9vbGVhbiB7XG4gIGFzc2VydChtaW5MZW5ndGggPj0gMCk7XG4gIGFzc2VydChtYXhMZW5ndGggPj0gbWluTGVuZ3RoKTtcbiAgcmV0dXJuIChcbiAgICAgIEFycmF5LmlzQXJyYXkoeCkgJiYgeC5sZW5ndGggPj0gbWluTGVuZ3RoICYmIHgubGVuZ3RoIDw9IG1heExlbmd0aCAmJlxuICAgICAgeC5ldmVyeShlID0+IHR5cGVvZiBlID09PSBleHBlY3RlZFR5cGUpKTtcbn1cbi8vIHRzbGludDplbmFibGU6bm8tYW55XG5cbi8qKlxuICogQXNzZXJ0IHRoYXQgYSB2YWx1ZSBvciBhbiBhcnJheSBvZiB2YWx1ZSBhcmUgcG9zaXRpdmUgaW50ZWdlci5cbiAqXG4gKiBAcGFyYW0gdmFsdWUgVGhlIHZhbHVlIGJlaW5nIGFzc2VydGVkIG9uLiBNYXkgYmUgYSBzaW5nbGUgbnVtYmVyIG9yIGFuIGFycmF5XG4gKiAgIG9mIG51bWJlcnMuXG4gKiBAcGFyYW0gbmFtZSBOYW1lIG9mIHRoZSB2YWx1ZSwgdXNlZCB0byBtYWtlIHRoZSBlcnJvciBtZXNzYWdlLlxuICovXG5leHBvcnQgZnVuY3Rpb24gYXNzZXJ0UG9zaXRpdmVJbnRlZ2VyKHZhbHVlOiBudW1iZXJ8bnVtYmVyW10sIG5hbWU6IHN0cmluZykge1xuICBpZiAoQXJyYXkuaXNBcnJheSh2YWx1ZSkpIHtcbiAgICB1dGlsLmFzc2VydChcbiAgICAgICAgdmFsdWUubGVuZ3RoID4gMCwgKCkgPT4gYCR7bmFtZX0gaXMgdW5leHBlY3RlZGx5IGFuIGVtcHR5IGFycmF5LmApO1xuICAgIHZhbHVlLmZvckVhY2goXG4gICAgICAgICh2LCBpKSA9PiBhc3NlcnRQb3NpdGl2ZUludGVnZXIodiwgYGVsZW1lbnQgJHtpICsgMX0gb2YgJHtuYW1lfWApKTtcbiAgfSBlbHNlIHtcbiAgICB1dGlsLmFzc2VydChcbiAgICAgICAgTnVtYmVyLmlzSW50ZWdlcih2YWx1ZSkgJiYgdmFsdWUgPiAwLFxuICAgICAgICAoKSA9PiBgRXhwZWN0ZWQgJHtuYW1lfSB0byBiZSBhIHBvc2l0aXZlIGludGVnZXIsIGJ1dCBnb3QgYCArXG4gICAgICAgICAgICBgJHtmb3JtYXRBc0ZyaWVuZGx5U3RyaW5nKHZhbHVlKX0uYCk7XG4gIH1cbn1cblxuLyoqXG4gKiBGb3JtYXQgYSB2YWx1ZSBpbnRvIGEgZGlzcGxheS1mcmllbmRseSwgaHVtYW4tcmVhZGFibGUgZmFzaGlvbi5cbiAqXG4gKiAtIGBudWxsYCBpcyBmb3JtYXR0ZWQgYXMgYCdudWxsJ2BcbiAqIC0gU3RyaW5ncyBhcmUgZm9ybWF0ZWQgd2l0aCBmbGFua2luZyBwYWlyIG9mIHF1b3Rlcy5cbiAqIC0gQXJyYXlzIGFyZSBmb3JtYXR0ZWQgd2l0aCBmbGFua2luZyBwYWlyIG9mIHNxdWFyZSBicmFja2V0cy5cbiAqXG4gKiBAcGFyYW0gdmFsdWUgVGhlIHZhbHVlIHRvIGRpc3BsYXkuXG4gKiBAcmV0dXJuIEZvcm1hdHRlZCBzdHJpbmcuXG4gKi9cbi8vIHRzbGludDpkaXNhYmxlLW5leHQtbGluZTpuby1hbnlcbmV4cG9ydCBmdW5jdGlvbiBmb3JtYXRBc0ZyaWVuZGx5U3RyaW5nKHZhbHVlOiBhbnkpOiBzdHJpbmcge1xuICBpZiAodmFsdWUgPT09IG51bGwpIHtcbiAgICByZXR1cm4gJ251bGwnO1xuICB9IGVsc2UgaWYgKEFycmF5LmlzQXJyYXkodmFsdWUpKSB7XG4gICAgcmV0dXJuICdbJyArIHZhbHVlLm1hcCh2ID0+IGZvcm1hdEFzRnJpZW5kbHlTdHJpbmcodikpLmpvaW4oJywnKSArICddJztcbiAgfSBlbHNlIGlmICh0eXBlb2YgdmFsdWUgPT09ICdzdHJpbmcnKSB7XG4gICAgcmV0dXJuIGBcIiR7dmFsdWV9XCJgO1xuICB9IGVsc2Uge1xuICAgIHJldHVybiBgJHt2YWx1ZX1gO1xuICB9XG59XG5cbi8qKlxuICogUmV0dXJucyBhIGZ1bmN0aW9uIGBmMmAgKGRlY29yYXRvcikgd2hpY2ggd3JhcHMgdGhlIG9yaWdpbmFsIGZ1bmN0aW9uXG4gKiBgZmAuIGBmMmAgZ3VhcmFudGVlcyB0aGF0IGBmYCBjYW4gYmUgY2FsbGVkIGF0IG1vc3Qgb25jZVxuICogZXZlcnkgYHdhaXRNc2AgbXMuIElmIGBmMmAgaXMgY2FsbGVkIG1vcmUgb2Z0ZW4sIGl0IHdpbGwgcmV0dXJuXG4gKiB0aGUgbGFzdCByZXR1cm5lZCByZXN1bHQgb2YgYGZgLlxuICpcbiAqIEBwYXJhbSBmIFRoZSBvcmlnaW5hbCBmdW5jdGlvbiBgZmAgdG8gd3JhcC5cbiAqIEBwYXJhbSB3YWl0TXMgVGhlIHRpbWUgYmV0d2VlbiB0d28gY29uc2VjdXRpdmUgY2FsbHMgdG8gYGZgIGluIG1zLlxuICovXG5leHBvcnQgZnVuY3Rpb24gZGVib3VuY2U8VD4oXG4gICAgZjogKC4uLmFyZ3M6IEFycmF5PHt9PikgPT4gVCwgd2FpdE1zOiBudW1iZXIsXG4gICAgbm93RnVuYz86IEZ1bmN0aW9uKTogKC4uLmFyZ3M6IEFycmF5PHt9PikgPT4gVCB7XG4gIGxldCBsYXN0VGltZSA9IG5vd0Z1bmMgIT0gbnVsbCA/IG5vd0Z1bmMoKSA6IHV0aWwubm93KCk7XG4gIGxldCBsYXN0UmVzdWx0OiBUO1xuICBjb25zdCBmMiA9ICguLi5hcmdzOiBBcnJheTx7fT4pID0+IHtcbiAgICBjb25zdCBub3cgPSBub3dGdW5jICE9IG51bGwgPyBub3dGdW5jKCkgOiB1dGlsLm5vdygpO1xuICAgIGlmIChub3cgLSBsYXN0VGltZSA8IHdhaXRNcykge1xuICAgICAgcmV0dXJuIGxhc3RSZXN1bHQ7XG4gICAgfVxuICAgIGxhc3RUaW1lID0gbm93O1xuICAgIGxhc3RSZXN1bHQgPSBmKC4uLmFyZ3MpO1xuICAgIHJldHVybiBsYXN0UmVzdWx0O1xuICB9O1xuICByZXR1cm4gZjI7XG59XG5cbi8qKlxuICogUmV0dXJucyB0aGUgZnVzYWJsZSBhY3RpdmF0aW9uIGdpdmVuIGEgbGF5ZXJzIGlkZW50aWZpZXIuXG4gKlxuICogQHBhcmFtIGFjdGl2YXRpb25OYW1lIFRoZSBsYXllcnMgaWRlbnRpZmllciBzdHJpbmcuXG4gKiBAcmV0dXJuIFRoZSBuYW1lIG9mIHRoZSBmdXNhYmxlIGFjdGl2YXRpb24uXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBtYXBBY3RpdmF0aW9uVG9GdXNlZEtlcm5lbChhY3RpdmF0aW9uTmFtZTogc3RyaW5nKTpcbiAgICBmdXNlZC5BY3RpdmF0aW9uIHtcbiAgaWYgKGFjdGl2YXRpb25OYW1lID09PSAncmVsdScpIHtcbiAgICByZXR1cm4gJ3JlbHUnO1xuICB9XG4gIGlmIChhY3RpdmF0aW9uTmFtZSA9PT0gJ2xpbmVhcicpIHtcbiAgICByZXR1cm4gJ2xpbmVhcic7XG4gIH1cbiAgaWYgKGFjdGl2YXRpb25OYW1lID09PSAnZWx1Jykge1xuICAgIHJldHVybiAnZWx1JztcbiAgfVxuICByZXR1cm4gbnVsbDtcbn1cblxudHlwZSBQb3NzaWJsZVZhbHVlcyA9IEFycmF5PEFycmF5PGJvb2xlYW58c3RyaW5nfG51bWJlcj4+O1xuXG4vKipcbiAqIFJldHVybnMgdGhlIGNhcnRlc2lhbiBwcm9kdWN0IG9mIHNldHMgb2YgdmFsdWVzLlxuICogVGhpcyB3b3JrcyB0aGUgc2FtZSBhcyBpdGVydG9vbHMucHJvZHVjdCBpbiBQeXRob24uXG4gKlxuICogRXhhbXBsZTpcbiAqXG4gKiBmaWx0ZXJzID0gWzEyOCwgMjU2LCA1MTJdXG4gKiBwYWRkaW5ncyA9IFsnc2FtZScsICd2YWxpZCddXG4gKlxuICogcHJvZHVjdCA9IFsgWzEyOCwgJ3NhbWUnXSwgWzEyOCwgJ3ZhbGlkJ10sIFsyNTYsICdzYW1lJ10sIFsyNTYsICd2YWxpZCddLFxuICogWzUxMiwgJ3NhbWUnXSwgWzUxMiwgJ3ZhbGlkJ11dXG4gKlxuICogQHBhcmFtIGFycmF5T2ZWYWx1ZXMgTGlzdC9hcnJheSBvZiB2YWx1ZXMuXG4gKiBAcmV0dXJuIFRoZSBjYXJ0ZXNpYW4gcHJvZHVjdC5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGdldENhcnRlc2lhblByb2R1Y3RPZlZhbHVlcyguLi5hcnJheU9mVmFsdWVzOiBQb3NzaWJsZVZhbHVlcyk6XG4gICAgUG9zc2libGVWYWx1ZXMge1xuICBhc3NlcnQoYXJyYXlPZlZhbHVlcy5sZW5ndGggPiAwLCAnYXJyYXlPZlZhbHVlcyBpcyBlbXB0eScpO1xuXG4gIGZvciAoY29uc3QgdmFsdWVzIG9mIGFycmF5T2ZWYWx1ZXMpIHtcbiAgICBhc3NlcnQoQXJyYXkuaXNBcnJheSh2YWx1ZXMpLCAnb25lIG9mIHRoZSB2YWx1ZXMgaXMgbm90IGFuIGFycmF5Jyk7XG4gICAgYXNzZXJ0KHZhbHVlcy5sZW5ndGggPiAwLCAnb25lIG9mIHRoZSB2YWx1ZXMgaXMgZW1wdHknKTtcbiAgfVxuXG4gIHJldHVybiBhcnJheU9mVmFsdWVzLnJlZHVjZSgocHJvZHVjdHMsIHZhbHVlcykgPT4ge1xuICAgIGlmIChwcm9kdWN0cy5sZW5ndGggPT09IDApIHtcbiAgICAgIHJldHVybiB2YWx1ZXMubWFwKHZhbHVlID0+IFt2YWx1ZV0pO1xuICAgIH1cblxuICAgIHJldHVybiB2YWx1ZXNcbiAgICAgICAgLm1hcCh2YWx1ZSA9PiB7XG4gICAgICAgICAgcmV0dXJuIHByb2R1Y3RzLm1hcCgocHJldlZhbHVlKSA9PiBbLi4ucHJldlZhbHVlLCB2YWx1ZV0pO1xuICAgICAgICB9KVxuICAgICAgICAucmVkdWNlKChmbGF0dGVuZWRQcm9kdWN0LCB1bmZsYXR0ZW5lZFByb2R1Y3QpID0+IHtcbiAgICAgICAgICByZXR1cm4gZmxhdHRlbmVkUHJvZHVjdC5jb25jYXQodW5mbGF0dGVuZWRQcm9kdWN0KTtcbiAgICAgICAgfSwgW10pO1xuICB9LCBbXSBhcyBQb3NzaWJsZVZhbHVlcyk7XG59XG4iXX0=","/**\n * @license\n * Copyright 2018 Google LLC\n *\n * Use of this source code is governed by an MIT-style\n * license that can be found in the LICENSE file or at\n * https://opensource.org/licenses/MIT.\n * =============================================================================\n */\n/**\n * Utilities related to persistent state in the backend.\n */\n/**\n * An ID to track `tf.SymbolicTensor`s and derived classes.\n * Required in different places in engine/topology.ts to identify unique\n * tensors.\n */\nlet _nextUniqueTensorId = 0;\nexport function getNextUniqueTensorId() {\n return _nextUniqueTensorId++;\n}\nconst _uidPrefixes = {};\n/**\n * Provides a unique UID given a string prefix.\n *\n * @param prefix\n */\nexport function getUid(prefix = '') {\n if (!(prefix in _uidPrefixes)) {\n _uidPrefixes[prefix] = 0;\n }\n _uidPrefixes[prefix] += 1;\n return prefix + _uidPrefixes[prefix].toString();\n}\n//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic3RhdGUuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi8uLi90ZmpzLWxheWVycy9zcmMvYmFja2VuZC9zdGF0ZS50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQTs7Ozs7Ozs7R0FRRztBQUVIOztHQUVHO0FBRUg7Ozs7R0FJRztBQUNILElBQUksbUJBQW1CLEdBQUcsQ0FBQyxDQUFDO0FBRTVCLE1BQU0sVUFBVSxxQkFBcUI7SUFDbkMsT0FBTyxtQkFBbUIsRUFBRSxDQUFDO0FBQy9CLENBQUM7QUFFRCxNQUFNLFlBQVksR0FBK0IsRUFBRSxDQUFDO0FBRXBEOzs7O0dBSUc7QUFDSCxNQUFNLFVBQVUsTUFBTSxDQUFDLE1BQU0sR0FBRyxFQUFFO0lBQ2hDLElBQUksQ0FBQyxDQUFDLE1BQU0sSUFBSSxZQUFZLENBQUMsRUFBRTtRQUM3QixZQUFZLENBQUMsTUFBTSxDQUFDLEdBQUcsQ0FBQyxDQUFDO0tBQzFCO0lBQ0QsWUFBWSxDQUFDLE1BQU0sQ0FBQyxJQUFJLENBQUMsQ0FBQztJQUMxQixPQUFPLE1BQU0sR0FBRyxZQUFZLENBQUMsTUFBTSxDQUFDLENBQUMsUUFBUSxFQUFFLENBQUM7QUFDbEQsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbIi8qKlxuICogQGxpY2Vuc2VcbiAqIENvcHlyaWdodCAyMDE4IEdvb2dsZSBMTENcbiAqXG4gKiBVc2Ugb2YgdGhpcyBzb3VyY2UgY29kZSBpcyBnb3Zlcm5lZCBieSBhbiBNSVQtc3R5bGVcbiAqIGxpY2Vuc2UgdGhhdCBjYW4gYmUgZm91bmQgaW4gdGhlIExJQ0VOU0UgZmlsZSBvciBhdFxuICogaHR0cHM6Ly9vcGVuc291cmNlLm9yZy9saWNlbnNlcy9NSVQuXG4gKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuICovXG5cbi8qKlxuICogVXRpbGl0aWVzIHJlbGF0ZWQgdG8gcGVyc2lzdGVudCBzdGF0ZSBpbiB0aGUgYmFja2VuZC5cbiAqL1xuXG4vKipcbiAqIEFuIElEIHRvIHRyYWNrIGB0Zi5TeW1ib2xpY1RlbnNvcmBzIGFuZCBkZXJpdmVkIGNsYXNzZXMuXG4gKiBSZXF1aXJlZCBpbiBkaWZmZXJlbnQgcGxhY2VzIGluIGVuZ2luZS90b3BvbG9neS50cyB0byBpZGVudGlmeSB1bmlxdWVcbiAqIHRlbnNvcnMuXG4gKi9cbmxldCBfbmV4dFVuaXF1ZVRlbnNvcklkID0gMDtcblxuZXhwb3J0IGZ1bmN0aW9uIGdldE5leHRVbmlxdWVUZW5zb3JJZCgpOiBudW1iZXIge1xuICByZXR1cm4gX25leHRVbmlxdWVUZW5zb3JJZCsrO1xufVxuXG5jb25zdCBfdWlkUHJlZml4ZXM6IHtbcHJlZml4OiBzdHJpbmddOiBudW1iZXJ9ID0ge307XG5cbi8qKlxuICogUHJvdmlkZXMgYSB1bmlxdWUgVUlEIGdpdmVuIGEgc3RyaW5nIHByZWZpeC5cbiAqXG4gKiBAcGFyYW0gcHJlZml4XG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBnZXRVaWQocHJlZml4ID0gJycpOiBzdHJpbmcge1xuICBpZiAoIShwcmVmaXggaW4gX3VpZFByZWZpeGVzKSkge1xuICAgIF91aWRQcmVmaXhlc1twcmVmaXhdID0gMDtcbiAgfVxuICBfdWlkUHJlZml4ZXNbcHJlZml4XSArPSAxO1xuICByZXR1cm4gcHJlZml4ICsgX3VpZFByZWZpeGVzW3ByZWZpeF0udG9TdHJpbmcoKTtcbn1cbiJdfQ==","/**\n * @license\n * Copyright 2018 Google LLC\n *\n * Use of this source code is governed by an MIT-style\n * license that can be found in the LICENSE file or at\n * https://opensource.org/licenses/MIT.\n * =============================================================================\n */\nexport const VALID_DATA_FORMAT_VALUES = ['channelsFirst', 'channelsLast'];\nexport const VALID_INTERPOLATION_FORMAT_VALUES = ['nearest', 'bilinear'];\nexport const VALID_PADDING_MODE_VALUES = ['valid', 'same', 'causal'];\nexport const VALID_POOL_MODE_VALUES = ['max', 'avg'];\nexport const VALID_BIDIRECTIONAL_MERGE_MODES = ['sum', 'mul', 'concat', 'ave'];\nexport const VALID_SAMPLE_WEIGHT_MODES = ['temporal'];\n//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY29tbW9uLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vLi4vdGZqcy1sYXllcnMvc3JjL2tlcmFzX2Zvcm1hdC9jb21tb24udHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUE7Ozs7Ozs7O0dBUUc7QUFhSCxNQUFNLENBQUMsTUFBTSx3QkFBd0IsR0FBRyxDQUFDLGVBQWUsRUFBRSxjQUFjLENBQUMsQ0FBQztBQUcxRSxNQUFNLENBQUMsTUFBTSxpQ0FBaUMsR0FBRyxDQUFDLFNBQVMsRUFBRSxVQUFVLENBQUMsQ0FBQztBQU16RSxNQUFNLENBQUMsTUFBTSx5QkFBeUIsR0FBRyxDQUFDLE9BQU8sRUFBRSxNQUFNLEVBQUUsUUFBUSxDQUFDLENBQUM7QUFJckUsTUFBTSxDQUFDLE1BQU0sc0JBQXNCLEdBQUcsQ0FBQyxLQUFLLEVBQUUsS0FBSyxDQUFDLENBQUM7QUFJckQsTUFBTSxDQUFDLE1BQU0sK0JBQStCLEdBQUcsQ0FBQyxLQUFLLEVBQUUsS0FBSyxFQUFFLFFBQVEsRUFBRSxLQUFLLENBQUMsQ0FBQztBQUkvRSxNQUFNLENBQUMsTUFBTSx5QkFBeUIsR0FBRyxDQUFDLFVBQVUsQ0FBQyxDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiLyoqXG4gKiBAbGljZW5zZVxuICogQ29weXJpZ2h0IDIwMTggR29vZ2xlIExMQ1xuICpcbiAqIFVzZSBvZiB0aGlzIHNvdXJjZSBjb2RlIGlzIGdvdmVybmVkIGJ5IGFuIE1JVC1zdHlsZVxuICogbGljZW5zZSB0aGF0IGNhbiBiZSBmb3VuZCBpbiB0aGUgTElDRU5TRSBmaWxlIG9yIGF0XG4gKiBodHRwczovL29wZW5zb3VyY2Uub3JnL2xpY2Vuc2VzL01JVC5cbiAqID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4gKi9cblxuLy8gVE9ETyhodWFuKTogYWRkIGxheWVyLXNwZWNpZmljIGlucHV0IHNoYXBlIHR5cGVzIChzZWU6IGh0dHBzOi8vZ2l0aHViLmNvbS90ZW5zb3JmbG93L3RmanMtbGF5ZXJzL3B1bGwvNDkyKVxuLyoqIEBkb2NhbGlhcyAobnVsbCB8IG51bWJlcilbXSAqL1xuZXhwb3J0IHR5cGUgU2hhcGUgPSBBcnJheTxudWxsIHwgbnVtYmVyPjtcblxuLy8gVGhlIHRmanMtY29yZSB2ZXJzaW9uIG9mIERhdGFUeXBlIG11c3Qgc3RheSBzeW5jZWQgd2l0aCB0aGlzLlxuZXhwb3J0IHR5cGUgRGF0YVR5cGUgPSAnZmxvYXQzMid8J2ludDMyJ3wnYm9vbCd8J2NvbXBsZXg2NCd8J3N0cmluZyc7XG5cbi8vIFRPRE8oc29lcmdlbCk6IE1vdmUgdGhlIENhbWVsQ2FzZSB2ZXJzaW9ucyBiYWNrIG91dCBvZiBrZXJhc19mb3JtYXRcbi8vIGUuZy4gdG8gc3JjL2NvbW1vbi50cy4gIE1heWJlIGV2ZW4gZHVwbGljYXRlICphbGwqIG9mIHRoZXNlIHRvIGJlIHBlZGFudGljP1xuLyoqIEBkb2NpbmxpbmUgKi9cbmV4cG9ydCB0eXBlIERhdGFGb3JtYXQgPSAnY2hhbm5lbHNGaXJzdCd8J2NoYW5uZWxzTGFzdCc7XG5leHBvcnQgY29uc3QgVkFMSURfREFUQV9GT1JNQVRfVkFMVUVTID0gWydjaGFubmVsc0ZpcnN0JywgJ2NoYW5uZWxzTGFzdCddO1xuXG5leHBvcnQgdHlwZSBJbnRlcnBvbGF0aW9uRm9ybWF0ID0gJ25lYXJlc3QnfCdiaWxpbmVhcic7XG5leHBvcnQgY29uc3QgVkFMSURfSU5URVJQT0xBVElPTl9GT1JNQVRfVkFMVUVTID0gWyduZWFyZXN0JywgJ2JpbGluZWFyJ107XG4vLyBUaGVzZSBjb25zdGFudHMgaGF2ZSBhIHNuYWtlIHZzLiBjYW1lbCBkaXN0aW5jdGlvbi5cbmV4cG9ydCB0eXBlIERhdGFGb3JtYXRTZXJpYWxpemF0aW9uID0gJ2NoYW5uZWxzX2ZpcnN0J3wnY2hhbm5lbHNfbGFzdCc7XG5cbi8qKiBAZG9jaW5saW5lICovXG5leHBvcnQgdHlwZSBQYWRkaW5nTW9kZSA9ICd2YWxpZCd8J3NhbWUnfCdjYXVzYWwnO1xuZXhwb3J0IGNvbnN0IFZBTElEX1BBRERJTkdfTU9ERV9WQUxVRVMgPSBbJ3ZhbGlkJywgJ3NhbWUnLCAnY2F1c2FsJ107XG5cbi8qKiBAZG9jaW5saW5lICovXG5leHBvcnQgdHlwZSBQb29sTW9kZSA9ICdtYXgnfCdhdmcnO1xuZXhwb3J0IGNvbnN0IFZBTElEX1BPT0xfTU9ERV9WQUxVRVMgPSBbJ21heCcsICdhdmcnXTtcblxuLyoqIEBkb2NpbmxpbmUgKi9cbmV4cG9ydCB0eXBlIEJpZGlyZWN0aW9uYWxNZXJnZU1vZGUgPSAnc3VtJ3wnbXVsJ3wnY29uY2F0J3wnYXZlJztcbmV4cG9ydCBjb25zdCBWQUxJRF9CSURJUkVDVElPTkFMX01FUkdFX01PREVTID0gWydzdW0nLCAnbXVsJywgJ2NvbmNhdCcsICdhdmUnXTtcblxuLyoqIEBkb2NpbmxpbmUgKi9cbmV4cG9ydCB0eXBlIFNhbXBsZVdlaWdodE1vZGUgPSAndGVtcG9yYWwnO1xuZXhwb3J0IGNvbnN0IFZBTElEX1NBTVBMRV9XRUlHSFRfTU9ERVMgPSBbJ3RlbXBvcmFsJ107XG4iXX0=","/**\n * @license\n * Copyright 2018 Google LLC\n *\n * Use of this source code is governed by an MIT-style\n * license that can be found in the LICENSE file or at\n * https://opensource.org/licenses/MIT.\n * =============================================================================\n */\n/**\n * Common functions for TensorFlow.js Layers.\n */\nimport { VALID_DATA_FORMAT_VALUES, VALID_INTERPOLATION_FORMAT_VALUES, VALID_PADDING_MODE_VALUES, VALID_POOL_MODE_VALUES } from './keras_format/common';\nimport { checkStringTypeUnionValue } from './utils/generic_utils';\n// A map from the requested scoped name of a Tensor to the number of Tensors\n// wanting that name so far. This allows enforcing name uniqueness by appending\n// an incrementing index, e.g. scope/name, scope/name_1, scope/name_2, etc.\nconst nameMap = new Map();\nexport function checkDataFormat(value) {\n checkStringTypeUnionValue(VALID_DATA_FORMAT_VALUES, 'DataFormat', value);\n}\nexport function checkInterpolationFormat(value) {\n checkStringTypeUnionValue(VALID_INTERPOLATION_FORMAT_VALUES, 'InterpolationFormat', value);\n}\nexport function checkPaddingMode(value) {\n checkStringTypeUnionValue(VALID_PADDING_MODE_VALUES, 'PaddingMode', value);\n}\nexport function checkPoolMode(value) {\n checkStringTypeUnionValue(VALID_POOL_MODE_VALUES, 'PoolMode', value);\n}\nconst _nameScopeStack = [];\nconst _nameScopeDivider = '/';\n/**\n * Enter namescope, which can be nested.\n */\nexport function nameScope(name, fn) {\n _nameScopeStack.push(name);\n try {\n const val = fn();\n _nameScopeStack.pop();\n return val;\n }\n catch (e) {\n _nameScopeStack.pop();\n throw e;\n }\n}\n/**\n * Get the current namescope as a flat, concatenated string.\n */\nfunction currentNameScopePrefix() {\n if (_nameScopeStack.length === 0) {\n return '';\n }\n else {\n return _nameScopeStack.join(_nameScopeDivider) + _nameScopeDivider;\n }\n}\n/**\n * Get the name a Tensor (or Variable) would have if not uniqueified.\n * @param tensorName\n * @return Scoped name string.\n */\nexport function getScopedTensorName(tensorName) {\n if (!isValidTensorName(tensorName)) {\n throw new Error('Not a valid tensor name: \\'' + tensorName + '\\'');\n }\n return currentNameScopePrefix() + tensorName;\n}\n/**\n * Get unique names for Tensors and Variables.\n * @param scopedName The fully-qualified name of the Tensor, i.e. as produced by\n * `getScopedTensorName()`.\n * @return A unique version of the given fully scoped name.\n * If this is the first time that the scoped name is seen in this session,\n * then the given `scopedName` is returned unaltered. If the same name is\n * seen again (producing a collision), an incrementing suffix is added to the\n * end of the name, so it takes the form 'scope/name_1', 'scope/name_2', etc.\n */\nexport function getUniqueTensorName(scopedName) {\n if (!isValidTensorName(scopedName)) {\n throw new Error('Not a valid tensor name: \\'' + scopedName + '\\'');\n }\n if (!nameMap.has(scopedName)) {\n nameMap.set(scopedName, 0);\n }\n const index = nameMap.get(scopedName);\n nameMap.set(scopedName, nameMap.get(scopedName) + 1);\n if (index > 0) {\n const result = `${scopedName}_${index}`;\n // Mark the composed name as used in case someone wants\n // to call getUniqueTensorName(\"name_1\").\n nameMap.set(result, 1);\n return result;\n }\n else {\n return scopedName;\n }\n}\nconst tensorNameRegex = new RegExp(/^[A-Za-z0-9][-A-Za-z0-9\\._\\/]*$/);\n/**\n * Determine whether a string is a valid tensor name.\n * @param name\n * @returns A Boolean indicating whether `name` is a valid tensor name.\n */\nexport function isValidTensorName(name) {\n return !!name.match(tensorNameRegex);\n}\n//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY29tbW9uLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vdGZqcy1sYXllcnMvc3JjL2NvbW1vbi50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQTs7Ozs7Ozs7R0FRRztBQUVIOztHQUVHO0FBQ0gsT0FBTyxFQUFDLHdCQUF3QixFQUFFLGlDQUFpQyxFQUFFLHlCQUF5QixFQUFFLHNCQUFzQixFQUFDLE1BQU0sdUJBQXVCLENBQUM7QUFDckosT0FBTyxFQUFDLHlCQUF5QixFQUFDLE1BQU0sdUJBQXVCLENBQUM7QUFFaEUsNEVBQTRFO0FBQzVFLGdGQUFnRjtBQUNoRiwyRUFBMkU7QUFDM0UsTUFBTSxPQUFPLEdBQXdCLElBQUksR0FBRyxFQUFrQixDQUFDO0FBRS9ELE1BQU0sVUFBVSxlQUFlLENBQUMsS0FBYztJQUM1Qyx5QkFBeUIsQ0FBQyx3QkFBd0IsRUFBRSxZQUFZLEVBQUUsS0FBSyxDQUFDLENBQUM7QUFDM0UsQ0FBQztBQUVELE1BQU0sVUFBVSx3QkFBd0IsQ0FBQyxLQUFjO0lBQ3JELHlCQUF5QixDQUNyQixpQ0FBaUMsRUFBRSxxQkFBcUIsRUFBRSxLQUFLLENBQUMsQ0FBQztBQUN2RSxDQUFDO0FBRUQsTUFBTSxVQUFVLGdCQUFnQixDQUFDLEtBQWM7SUFDN0MseUJBQXlCLENBQUMseUJBQXlCLEVBQUUsYUFBYSxFQUFFLEtBQUssQ0FBQyxDQUFDO0FBQzdFLENBQUM7QUFFRCxNQUFNLFVBQVUsYUFBYSxDQUFDLEtBQWM7SUFDMUMseUJBQXlCLENBQUMsc0JBQXNCLEVBQUUsVUFBVSxFQUFFLEtBQUssQ0FBQyxDQUFDO0FBQ3ZFLENBQUM7QUFFRCxNQUFNLGVBQWUsR0FBYSxFQUFFLENBQUM7QUFDckMsTUFBTSxpQkFBaUIsR0FBRyxHQUFHLENBQUM7QUFFOUI7O0dBRUc7QUFDSCxNQUFNLFVBQVUsU0FBUyxDQUFJLElBQVksRUFBRSxFQUFXO0lBQ3BELGVBQWUsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLENBQUM7SUFDM0IsSUFBSTtRQUNGLE1BQU0sR0FBRyxHQUFNLEVBQUUsRUFBRSxDQUFDO1FBQ3BCLGVBQWUsQ0FBQyxHQUFHLEVBQUUsQ0FBQztRQUN0QixPQUFPLEdBQUcsQ0FBQztLQUNaO0lBQUMsT0FBTyxDQUFDLEVBQUU7UUFDVixlQUFlLENBQUMsR0FBRyxFQUFFLENBQUM7UUFDdEIsTUFBTSxDQUFDLENBQUM7S0FDVDtBQUNILENBQUM7QUFFRDs7R0FFRztBQUNILFNBQVMsc0JBQXNCO0lBQzdCLElBQUksZUFBZSxDQUFDLE1BQU0sS0FBSyxDQUFDLEVBQUU7UUFDaEMsT0FBTyxFQUFFLENBQUM7S0FDWDtTQUFNO1FBQ0wsT0FBTyxlQUFlLENBQUMsSUFBSSxDQUFDLGlCQUFpQixDQUFDLEdBQUcsaUJBQWlCLENBQUM7S0FDcEU7QUFDSCxDQUFDO0FBRUQ7Ozs7R0FJRztBQUNILE1BQU0sVUFBVSxtQkFBbUIsQ0FBQyxVQUFrQjtJQUNwRCxJQUFJLENBQUMsaUJBQWlCLENBQUMsVUFBVSxDQUFDLEVBQUU7UUFDbEMsTUFBTSxJQUFJLEtBQUssQ0FBQyw2QkFBNkIsR0FBRyxVQUFVLEdBQUcsSUFBSSxDQUFDLENBQUM7S0FDcEU7SUFDRCxPQUFPLHNCQUFzQixFQUFFLEdBQUcsVUFBVSxDQUFDO0FBQy9DLENBQUM7QUFFRDs7Ozs7Ozs7O0dBU0c7QUFDSCxNQUFNLFVBQVUsbUJBQW1CLENBQUMsVUFBa0I7SUFDcEQsSUFBSSxDQUFDLGlCQUFpQixDQUFDLFVBQVUsQ0FBQyxFQUFFO1FBQ2xDLE1BQU0sSUFBSSxLQUFLLENBQUMsNkJBQTZCLEdBQUcsVUFBVSxHQUFHLElBQUksQ0FBQyxDQUFDO0tBQ3BFO0lBQ0QsSUFBSSxDQUFDLE9BQU8sQ0FBQyxHQUFHLENBQUMsVUFBVSxDQUFDLEVBQUU7UUFDNUIsT0FBTyxDQUFDLEdBQUcsQ0FBQyxVQUFVLEVBQUUsQ0FBQyxDQUFDLENBQUM7S0FDNUI7SUFDRCxNQUFNLEtBQUssR0FBRyxPQUFPLENBQUMsR0FBRyxDQUFDLFVBQVUsQ0FBQyxDQUFDO0lBQ3RDLE9BQU8sQ0FBQyxHQUFHLENBQUMsVUFBVSxFQUFFLE9BQU8sQ0FBQyxHQUFHLENBQUMsVUFBVSxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUM7SUFFckQsSUFBSSxLQUFLLEdBQUcsQ0FBQyxFQUFFO1FBQ2IsTUFBTSxNQUFNLEdBQUcsR0FBRyxVQUFVLElBQUksS0FBSyxFQUFFLENBQUM7UUFDeEMsdURBQXVEO1FBQ3ZELHlDQUF5QztRQUN6QyxPQUFPLENBQUMsR0FBRyxDQUFDLE1BQU0sRUFBRSxDQUFDLENBQUMsQ0FBQztRQUN2QixPQUFPLE1BQU0sQ0FBQztLQUNmO1NBQU07UUFDTCxPQUFPLFVBQVUsQ0FBQztLQUNuQjtBQUNILENBQUM7QUFFRCxNQUFNLGVBQWUsR0FBRyxJQUFJLE1BQU0sQ0FBQyxpQ0FBaUMsQ0FBQyxDQUFDO0FBRXRFOzs7O0dBSUc7QUFDSCxNQUFNLFVBQVUsaUJBQWlCLENBQUMsSUFBWTtJQUM1QyxPQUFPLENBQUMsQ0FBQyxJQUFJLENBQUMsS0FBSyxDQUFDLGVBQWUsQ0FBQyxDQUFDO0FBQ3ZDLENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyIvKipcbiAqIEBsaWNlbnNlXG4gKiBDb3B5cmlnaHQgMjAxOCBHb29nbGUgTExDXG4gKlxuICogVXNlIG9mIHRoaXMgc291cmNlIGNvZGUgaXMgZ292ZXJuZWQgYnkgYW4gTUlULXN0eWxlXG4gKiBsaWNlbnNlIHRoYXQgY2FuIGJlIGZvdW5kIGluIHRoZSBMSUNFTlNFIGZpbGUgb3IgYXRcbiAqIGh0dHBzOi8vb3BlbnNvdXJjZS5vcmcvbGljZW5zZXMvTUlULlxuICogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbiAqL1xuXG4vKipcbiAqIENvbW1vbiBmdW5jdGlvbnMgZm9yIFRlbnNvckZsb3cuanMgTGF5ZXJzLlxuICovXG5pbXBvcnQge1ZBTElEX0RBVEFfRk9STUFUX1ZBTFVFUywgVkFMSURfSU5URVJQT0xBVElPTl9GT1JNQVRfVkFMVUVTLCBWQUxJRF9QQURESU5HX01PREVfVkFMVUVTLCBWQUxJRF9QT09MX01PREVfVkFMVUVTfSBmcm9tICcuL2tlcmFzX2Zvcm1hdC9jb21tb24nO1xuaW1wb3J0IHtjaGVja1N0cmluZ1R5cGVVbmlvblZhbHVlfSBmcm9tICcuL3V0aWxzL2dlbmVyaWNfdXRpbHMnO1xuXG4vLyBBIG1hcCBmcm9tIHRoZSByZXF1ZXN0ZWQgc2NvcGVkIG5hbWUgb2YgYSBUZW5zb3IgdG8gdGhlIG51bWJlciBvZiBUZW5zb3JzXG4vLyB3YW50aW5nIHRoYXQgbmFtZSBzbyBmYXIuICBUaGlzIGFsbG93cyBlbmZvcmNpbmcgbmFtZSB1bmlxdWVuZXNzIGJ5IGFwcGVuZGluZ1xuLy8gYW4gaW5jcmVtZW50aW5nIGluZGV4LCBlLmcuIHNjb3BlL25hbWUsIHNjb3BlL25hbWVfMSwgc2NvcGUvbmFtZV8yLCBldGMuXG5jb25zdCBuYW1lTWFwOiBNYXA8c3RyaW5nLCBudW1iZXI+ID0gbmV3IE1hcDxzdHJpbmcsIG51bWJlcj4oKTtcblxuZXhwb3J0IGZ1bmN0aW9uIGNoZWNrRGF0YUZvcm1hdCh2YWx1ZT86IHN0cmluZyk6IHZvaWQge1xuICBjaGVja1N0cmluZ1R5cGVVbmlvblZhbHVlKFZBTElEX0RBVEFfRk9STUFUX1ZBTFVFUywgJ0RhdGFGb3JtYXQnLCB2YWx1ZSk7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBjaGVja0ludGVycG9sYXRpb25Gb3JtYXQodmFsdWU/OiBzdHJpbmcpOiB2b2lkIHtcbiAgY2hlY2tTdHJpbmdUeXBlVW5pb25WYWx1ZShcbiAgICAgIFZBTElEX0lOVEVSUE9MQVRJT05fRk9STUFUX1ZBTFVFUywgJ0ludGVycG9sYXRpb25Gb3JtYXQnLCB2YWx1ZSk7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBjaGVja1BhZGRpbmdNb2RlKHZhbHVlPzogc3RyaW5nKTogdm9pZCB7XG4gIGNoZWNrU3RyaW5nVHlwZVVuaW9uVmFsdWUoVkFMSURfUEFERElOR19NT0RFX1ZBTFVFUywgJ1BhZGRpbmdNb2RlJywgdmFsdWUpO1xufVxuXG5leHBvcnQgZnVuY3Rpb24gY2hlY2tQb29sTW9kZSh2YWx1ZT86IHN0cmluZyk6IHZvaWQge1xuICBjaGVja1N0cmluZ1R5cGVVbmlvblZhbHVlKFZBTElEX1BPT0xfTU9ERV9WQUxVRVMsICdQb29sTW9kZScsIHZhbHVlKTtcbn1cblxuY29uc3QgX25hbWVTY29wZVN0YWNrOiBzdHJpbmdbXSA9IFtdO1xuY29uc3QgX25hbWVTY29wZURpdmlkZXIgPSAnLyc7XG5cbi8qKlxuICogRW50ZXIgbmFtZXNjb3BlLCB3aGljaCBjYW4gYmUgbmVzdGVkLlxuICovXG5leHBvcnQgZnVuY3Rpb24gbmFtZVNjb3BlPFQ+KG5hbWU6IHN0cmluZywgZm46ICgpID0+IFQpOiBUIHtcbiAgX25hbWVTY29wZVN0YWNrLnB1c2gobmFtZSk7XG4gIHRyeSB7XG4gICAgY29uc3QgdmFsOiBUID0gZm4oKTtcbiAgICBfbmFtZVNjb3BlU3RhY2sucG9wKCk7XG4gICAgcmV0dXJuIHZhbDtcbiAgfSBjYXRjaCAoZSkge1xuICAgIF9uYW1lU2NvcGVTdGFjay5wb3AoKTtcbiAgICB0aHJvdyBlO1xuICB9XG59XG5cbi8qKlxuICogR2V0IHRoZSBjdXJyZW50IG5hbWVzY29wZSBhcyBhIGZsYXQsIGNvbmNhdGVuYXRlZCBzdHJpbmcuXG4gKi9cbmZ1bmN0aW9uIGN1cnJlbnROYW1lU2NvcGVQcmVmaXgoKTogc3RyaW5nIHtcbiAgaWYgKF9uYW1lU2NvcGVTdGFjay5sZW5ndGggPT09IDApIHtcbiAgICByZXR1cm4gJyc7XG4gIH0gZWxzZSB7XG4gICAgcmV0dXJuIF9uYW1lU2NvcGVTdGFjay5qb2luKF9uYW1lU2NvcGVEaXZpZGVyKSArIF9uYW1lU2NvcGVEaXZpZGVyO1xuICB9XG59XG5cbi8qKlxuICogR2V0IHRoZSBuYW1lIGEgVGVuc29yIChvciBWYXJpYWJsZSkgd291bGQgaGF2ZSBpZiBub3QgdW5pcXVlaWZpZWQuXG4gKiBAcGFyYW0gdGVuc29yTmFtZVxuICogQHJldHVybiBTY29wZWQgbmFtZSBzdHJpbmcuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBnZXRTY29wZWRUZW5zb3JOYW1lKHRlbnNvck5hbWU6IHN0cmluZyk6IHN0cmluZyB7XG4gIGlmICghaXNWYWxpZFRlbnNvck5hbWUodGVuc29yTmFtZSkpIHtcbiAgICB0aHJvdyBuZXcgRXJyb3IoJ05vdCBhIHZhbGlkIHRlbnNvciBuYW1lOiBcXCcnICsgdGVuc29yTmFtZSArICdcXCcnKTtcbiAgfVxuICByZXR1cm4gY3VycmVudE5hbWVTY29wZVByZWZpeCgpICsgdGVuc29yTmFtZTtcbn1cblxuLyoqXG4gKiBHZXQgdW5pcXVlIG5hbWVzIGZvciBUZW5zb3JzIGFuZCBWYXJpYWJsZXMuXG4gKiBAcGFyYW0gc2NvcGVkTmFtZSBUaGUgZnVsbHktcXVhbGlmaWVkIG5hbWUgb2YgdGhlIFRlbnNvciwgaS5lLiBhcyBwcm9kdWNlZCBieVxuICogIGBnZXRTY29wZWRUZW5zb3JOYW1lKClgLlxuICogQHJldHVybiBBIHVuaXF1ZSB2ZXJzaW9uIG9mIHRoZSBnaXZlbiBmdWxseSBzY29wZWQgbmFtZS5cbiAqICAgSWYgdGhpcyBpcyB0aGUgZmlyc3QgdGltZSB0aGF0IHRoZSBzY29wZWQgbmFtZSBpcyBzZWVuIGluIHRoaXMgc2Vzc2lvbixcbiAqICAgdGhlbiB0aGUgZ2l2ZW4gYHNjb3BlZE5hbWVgIGlzIHJldHVybmVkIHVuYWx0ZXJlZC4gIElmIHRoZSBzYW1lIG5hbWUgaXNcbiAqICAgc2VlbiBhZ2FpbiAocHJvZHVjaW5nIGEgY29sbGlzaW9uKSwgYW4gaW5jcmVtZW50aW5nIHN1ZmZpeCBpcyBhZGRlZCB0byB0aGVcbiAqICAgZW5kIG9mIHRoZSBuYW1lLCBzbyBpdCB0YWtlcyB0aGUgZm9ybSAnc2NvcGUvbmFtZV8xJywgJ3Njb3BlL25hbWVfMicsIGV0Yy5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGdldFVuaXF1ZVRlbnNvck5hbWUoc2NvcGVkTmFtZTogc3RyaW5nKTogc3RyaW5nIHtcbiAgaWYgKCFpc1ZhbGlkVGVuc29yTmFtZShzY29wZWROYW1lKSkge1xuICAgIHRocm93IG5ldyBFcnJvcignTm90IGEgdmFsaWQgdGVuc29yIG5hbWU6IFxcJycgKyBzY29wZWROYW1lICsgJ1xcJycpO1xuICB9XG4gIGlmICghbmFtZU1hcC5oYXMoc2NvcGVkTmFtZSkpIHtcbiAgICBuYW1lTWFwLnNldChzY29wZWROYW1lLCAwKTtcbiAgfVxuICBjb25zdCBpbmRleCA9IG5hbWVNYXAuZ2V0KHNjb3BlZE5hbWUpO1xuICBuYW1lTWFwLnNldChzY29wZWROYW1lLCBuYW1lTWFwLmdldChzY29wZWROYW1lKSArIDEpO1xuXG4gIGlmIChpbmRleCA+IDApIHtcbiAgICBjb25zdCByZXN1bHQgPSBgJHtzY29wZWROYW1lfV8ke2luZGV4fWA7XG4gICAgLy8gTWFyayB0aGUgY29tcG9zZWQgbmFtZSBhcyB1c2VkIGluIGNhc2Ugc29tZW9uZSB3YW50c1xuICAgIC8vIHRvIGNhbGwgZ2V0VW5pcXVlVGVuc29yTmFtZShcIm5hbWVfMVwiKS5cbiAgICBuYW1lTWFwLnNldChyZXN1bHQsIDEpO1xuICAgIHJldHVybiByZXN1bHQ7XG4gIH0gZWxzZSB7XG4gICAgcmV0dXJuIHNjb3BlZE5hbWU7XG4gIH1cbn1cblxuY29uc3QgdGVuc29yTmFtZVJlZ2V4ID0gbmV3IFJlZ0V4cCgvXltBLVphLXowLTldWy1BLVphLXowLTlcXC5fXFwvXSokLyk7XG5cbi8qKlxuICogRGV0ZXJtaW5lIHdoZXRoZXIgYSBzdHJpbmcgaXMgYSB2YWxpZCB0ZW5zb3IgbmFtZS5cbiAqIEBwYXJhbSBuYW1lXG4gKiBAcmV0dXJucyBBIEJvb2xlYW4gaW5kaWNhdGluZyB3aGV0aGVyIGBuYW1lYCBpcyBhIHZhbGlkIHRlbnNvciBuYW1lLlxuICovXG5leHBvcnQgZnVuY3Rpb24gaXNWYWxpZFRlbnNvck5hbWUobmFtZTogc3RyaW5nKTogYm9vbGVhbiB7XG4gIHJldHVybiAhIW5hbWUubWF0Y2godGVuc29yTmFtZVJlZ2V4KTtcbn1cbiJdfQ==","/**\n * @license\n * Copyright 2018 Google LLC\n *\n * Use of this source code is governed by an MIT-style\n * license that can be found in the LICENSE file or at\n * https://opensource.org/licenses/MIT.\n * =============================================================================\n */\n/**\n * Math utility functions.\n *\n * This file contains some frequently used math function that operates on\n * number[] or Float32Array and return a number. Many of these functions are\n * not-so-thick wrappers around TF.js Core functions. But they offer the\n * convenience of\n * 1) not having to convert the inputs into Tensors,\n * 2) not having to convert the returned Tensors to numbers.\n */\nimport { ValueError } from '../errors';\n/**\n * Determine if a number is an integer.\n */\nexport function isInteger(x) {\n return x === parseInt(x.toString(), 10);\n}\n/**\n * Calculate the product of an array of numbers.\n * @param array The array to calculate the product over.\n * @param begin Beginning index, inclusive.\n * @param end Ending index, exclusive.\n * @return The product.\n */\nexport function arrayProd(array, begin, end) {\n if (begin == null) {\n begin = 0;\n }\n if (end == null) {\n end = array.length;\n }\n let prod = 1;\n for (let i = begin; i < end; ++i) {\n prod *= array[i];\n }\n return prod;\n}\n/**\n * Compute minimum value.\n * @param array\n * @return minimum value.\n */\nexport function min(array) {\n // same behavior as tf.min()\n if (array.length === 0) {\n return Number.NaN;\n }\n let min = Number.POSITIVE_INFINITY;\n for (let i = 0; i < array.length; i++) {\n const value = array[i];\n if (value < min) {\n min = value;\n }\n }\n return min;\n}\n/**\n * Compute maximum value.\n * @param array\n * @return maximum value\n */\nexport function max(array) {\n // same behavior as tf.max()\n if (array.length === 0) {\n return Number.NaN;\n }\n let max = Number.NEGATIVE_INFINITY;\n for (let i = 0; i < array.length; i++) {\n const value = array[i];\n if (value > max) {\n max = value;\n }\n }\n return max;\n}\n/**\n * Compute sum of array.\n * @param array\n * @return The sum.\n */\nexport function sum(array) {\n let sum = 0;\n for (let i = 0; i < array.length; i++) {\n const value = array[i];\n sum += value;\n }\n return sum;\n}\n/**\n * Compute mean of array.\n * @param array\n * @return The mean.\n */\nexport function mean(array) {\n return sum(array) / array.length;\n}\n/**\n * Compute variance of array.\n * @param array\n * @return The variance.\n */\nexport function variance(array) {\n const meanValue = mean(array);\n const demeaned = array.map((value) => value - meanValue);\n let sumSquare = 0;\n for (let i = 0; i < demeaned.length; i++) {\n const value = demeaned[i];\n sumSquare += value * value;\n }\n return sumSquare / array.length;\n}\n/**\n * Compute median of array.\n * @param array\n * @return The median value.\n */\nexport function median(array) {\n const arraySorted = array.slice().sort((a, b) => a - b);\n const lowIdx = Math.floor((arraySorted.length - 1) / 2);\n const highIdx = Math.ceil((arraySorted.length - 1) / 2);\n if (lowIdx === highIdx) {\n return arraySorted[lowIdx];\n }\n return (arraySorted[lowIdx] + arraySorted[highIdx]) / 2;\n}\n/**\n * Generate an array of integers in [begin, end).\n * @param begin Beginning integer, inclusive.\n * @param end Ending integer, exclusive.\n * @returns Range array.\n * @throws ValueError, iff `end` < `begin`.\n */\nexport function range(begin, end) {\n if (end < begin) {\n throw new ValueError(`end (${end}) < begin (${begin}) is forbidden.`);\n }\n const out = [];\n for (let i = begin; i < end; ++i) {\n out.push(i);\n }\n return out;\n}\n//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibWF0aF91dGlscy5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uLy4uL3RmanMtbGF5ZXJzL3NyYy91dGlscy9tYXRoX3V0aWxzLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBOzs7Ozs7OztHQVFHO0FBRUg7Ozs7Ozs7OztHQVNHO0FBRUgsT0FBTyxFQUFDLFVBQVUsRUFBQyxNQUFNLFdBQVcsQ0FBQztBQUlyQzs7R0FFRztBQUNILE1BQU0sVUFBVSxTQUFTLENBQUMsQ0FBUztJQUNqQyxPQUFPLENBQUMsS0FBSyxRQUFRLENBQUMsQ0FBQyxDQUFDLFFBQVEsRUFBRSxFQUFFLEVBQUUsQ0FBQyxDQUFDO0FBQzFDLENBQUM7QUFFRDs7Ozs7O0dBTUc7QUFDSCxNQUFNLFVBQVUsU0FBUyxDQUNyQixLQUEwQixFQUFFLEtBQWMsRUFBRSxHQUFZO0lBQzFELElBQUksS0FBSyxJQUFJLElBQUksRUFBRTtRQUNqQixLQUFLLEdBQUcsQ0FBQyxDQUFDO0tBQ1g7SUFDRCxJQUFJLEdBQUcsSUFBSSxJQUFJLEVBQUU7UUFDZixHQUFHLEdBQUcsS0FBSyxDQUFDLE1BQU0sQ0FBQztLQUNwQjtJQUVELElBQUksSUFBSSxHQUFHLENBQUMsQ0FBQztJQUNiLEtBQUssSUFBSSxDQUFDLEdBQUcsS0FBSyxFQUFFLENBQUMsR0FBRyxHQUFHLEVBQUUsRUFBRSxDQUFDLEVBQUU7UUFDaEMsSUFBSSxJQUFJLEtBQUssQ0FBQyxDQUFDLENBQUMsQ0FBQztLQUNsQjtJQUNELE9BQU8sSUFBSSxDQUFDO0FBQ2QsQ0FBQztBQUVEOzs7O0dBSUc7QUFDSCxNQUFNLFVBQVUsR0FBRyxDQUFDLEtBQTRCO0lBQzlDLDRCQUE0QjtJQUM1QixJQUFJLEtBQUssQ0FBQyxNQUFNLEtBQUssQ0FBQyxFQUFFO1FBQ3RCLE9BQU8sTUFBTSxDQUFDLEdBQUcsQ0FBQztLQUNuQjtJQUNELElBQUksR0FBRyxHQUFHLE1BQU0sQ0FBQyxpQkFBaUIsQ0FBQztJQUNu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TyxFQUFFO1FBQ3RCLE9BQU8sV0FBVyxDQUFDLE1BQU0sQ0FBQyxDQUFDO0tBQzVCO0lBQ0QsT0FBTyxDQUFDLFdBQVcsQ0FBQyxNQUFNLENBQUMsR0FBRyxXQUFXLENBQUMsT0FBTyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUM7QUFDMUQsQ0FBQztBQUVEOzs7Ozs7R0FNRztBQUNILE1BQU0sVUFBVSxLQUFLLENBQUMsS0FBYSxFQUFFLEdBQVc7SUFDOUMsSUFBSSxHQUFHLEdBQUcsS0FBSyxFQUFFO1FBQ2YsTUFBTSxJQUFJLFVBQVUsQ0FBQyxRQUFRLEdBQUcsY0FBYyxLQUFLLGlCQUFpQixDQUFDLENBQUM7S0FDdkU7SUFDRCxNQUFNLEdBQUcsR0FBYSxFQUFFLENBQUM7SUFDekIsS0FBSyxJQUFJLENBQUMsR0FBRyxLQUFLLEVBQUUsQ0FBQyxHQUFHLEdBQUcsRUFBRSxFQUFFLENBQUMsRUFBRTtRQUNoQyxHQUFHLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxDQUFDO0tBQ2I7SUFDRCxPQUFPLEdBQUcsQ0FBQztBQUNiLENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyIvKipcbiAqIEBsaWNlbnNlXG4gKiBDb3B5cmlnaHQgMjAxOCBHb29nbGUgTExDXG4gKlxuICogVXNlIG9mIHRoaXMgc291cmNlIGNvZGUgaXMgZ292ZXJuZWQgYnkgYW4gTUlULXN0eWxlXG4gKiBsaWNlbnNlIHRoYXQgY2FuIGJlIGZvdW5kIGluIHRoZSBMSUNFTlNFIGZpbGUgb3IgYXRcbiAqIGh0dHBzOi8vb3BlbnNvdXJjZS5vcmcvbGljZW5zZXMvTUlULlxuICogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbiAqL1xuXG4vKipcbiAqIE1hdGggdXRpbGl0eSBmdW5jdGlvbnMuXG4gKlxuICogVGhpcyBmaWxlIGNvbnRhaW5zIHNvbWUgZnJlcXVlbnRseSB1c2VkIG1hdGggZnVuY3Rpb24gdGhhdCBvcGVyYXRlcyBvblxuICogbnVtYmVyW10gb3IgRmxvYXQzMkFycmF5IGFuZCByZXR1cm4gYSBudW1iZXIuIE1hbnkgb2YgdGhlc2UgZnVuY3Rpb25zIGFyZVxuICogbm90LXNvLXRoaWNrIHdyYXBwZXJzIGFyb3VuZCBURi5qcyBDb3JlIGZ1bmN0aW9ucy4gQnV0IHRoZXkgb2ZmZXIgdGhlXG4gKiBjb252ZW5pZW5jZSBvZlxuICogMSkgbm90IGhhdmluZyB0byBjb252ZXJ0IHRoZSBpbnB1dHMgaW50byBUZW5zb3JzLFxuICogMikgbm90IGhhdmluZyB0byBjb252ZXJ0IHRoZSByZXR1cm5lZCBUZW5zb3JzIHRvIG51bWJlcnMuXG4gKi9cblxuaW1wb3J0IHtWYWx1ZUVycm9yfSBmcm9tICcuLi9lcnJvcnMnO1xuXG5leHBvcnQgdHlwZSBBcnJheVR5cGVzID0gVWludDhBcnJheXxJbnQzMkFycmF5fEZsb2F0MzJBcnJheTtcblxuLyoqXG4gKiBEZXRlcm1pbmUgaWYgYSBudW1iZXIgaXMgYW4gaW50ZWdlci5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGlzSW50ZWdlcih4OiBudW1iZXIpOiBib29sZWFuIHtcbiAgcmV0dXJuIHggPT09IHBhcnNlSW50KHgudG9TdHJpbmcoKSwgMTApO1xufVxuXG4vKipcbiAqIENhbGN1bGF0ZSB0aGUgcHJvZHVjdCBvZiBhbiBhcnJheSBvZiBudW1iZXJzLlxuICogQHBhcmFtIGFycmF5IFRoZSBhcnJheSB0byBjYWxjdWxhdGUgdGhlIHByb2R1Y3Qgb3Zlci5cbiAqIEBwYXJhbSBiZWdpbiBCZWdpbm5pbmcgaW5kZXgsIGluY2x1c2l2ZS5cbiAqIEBwYXJhbSBlbmQgRW5kaW5nIGluZGV4LCBleGNsdXNpdmUuXG4gKiBAcmV0dXJuIFRoZSBwcm9kdWN0LlxuICovXG5leHBvcnQgZnVuY3Rpb24gYXJyYXlQcm9kKFxuICAgIGFycmF5OiBudW1iZXJbXXxBcnJheVR5cGVzLCBiZWdpbj86IG51bWJlciwgZW5kPzogbnVtYmVyKTogbnVtYmVyIHtcbiAgaWYgKGJlZ2luID09IG51bGwpIHtcbiAgICBiZWdpbiA9IDA7XG4gIH1cbiAgaWYgKGVuZCA9PSBudWxsKSB7XG4gICAgZW5kID0gYXJyYXkubGVuZ3RoO1xuICB9XG5cbiAgbGV0IHByb2QgPSAxO1xuICBmb3IgKGxldCBpID0gYmVnaW47IGkgPCBlbmQ7ICsraSkge1xuICAgIHByb2QgKj0gYXJyYXlbaV07XG4gIH1cbiAgcmV0dXJuIHByb2Q7XG59XG5cbi8qKlxuICogQ29tcHV0ZSBtaW5pbXVtIHZhbHVlLlxuICogQHBhcmFtIGFycmF5XG4gKiBAcmV0dXJuIG1pbmltdW0gdmFsdWUuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBtaW4oYXJyYXk6IG51bWJlcltdfEZsb2F0MzJBcnJheSk6IG51bWJlciB7XG4gIC8vIHNhbWUgYmVoYXZpb3IgYXMgdGYubWluKClcbiAgaWYgKGFycmF5Lmxlbmd0aCA9PT0gMCkge1xuICAgIHJldHVybiBOdW1iZXIuTmFOO1xuICB9XG4gIGxldCBtaW4gPSBOdW1iZXIuUE9TSVRJVkVfSU5GSU5JVFk7XG4gIGZvciAobGV0IGkgPSAwOyBpIDwgYXJyYXkubGVuZ3RoOyBpKyspIHtcbiAgICBjb25zdCB2YWx1ZSA9IGFycmF5W2ldO1xuICAgIGlmICh2YWx1ZSA8IG1pbikge1xuICAgICAgbWluID0gdmFsdWU7XG4gICAgfVxuICB9XG4gIHJldHVybiBtaW47XG59XG5cbi8qKlxuICogQ29tcHV0ZSBtYXhpbXVtIHZhbHVlLlxuICogQHBhcmFtIGFycmF5XG4gKiBAcmV0dXJuIG1heGltdW0gdmFsdWVcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIG1heChhcnJheTogbnVtYmVyW118RmxvYXQzMkFycmF5KTogbnVtYmVyIHtcbiAgLy8gc2FtZSBiZWhhdmlvciBhcyB0Zi5tYXgoKVxuICBpZiAoYXJyYXkubGVuZ3RoID09PSAwKSB7XG4gICAgcmV0dXJuIE51bWJlci5OYU47XG4gIH1cbiAgbGV0IG1heCA9IE51bWJlci5ORUdBVElWRV9JTkZJTklUWTtcbiAgZm9yIChsZXQgaSA9IDA7IGkgPCBhcnJheS5sZW5ndGg7IGkrKykge1xuICAgIGNvbnN0IHZhbHVlID0gYXJyYXlbaV07XG4gICAgaWYgKHZhbHVlID4gbWF4KSB7XG4gICAgICBtYXggPSB2YWx1ZTtcbiAgICB9XG4gIH1cbiAgcmV0dXJuIG1heDtcbn1cblxuLyoqXG4gKiBDb21wdXRlIHN1bSBvZiBhcnJheS5cbiAqIEBwYXJhbSBhcnJheVxuICogQHJldHVybiBUaGUgc3VtLlxuICovXG5leHBvcnQgZnVuY3Rpb24gc3VtKGFycmF5OiBudW1iZXJbXXxGbG9hdDMyQXJyYXkpOiBudW1iZXIge1xuICBsZXQgc3VtID0gMDtcbiAgZm9yIChsZXQgaSA9IDA7IGkgPCBhcnJheS5sZW5ndGg7IGkrKykge1xuICAgIGNvbnN0IHZhbHVlID0gYXJyYXlbaV07XG4gICAgc3VtICs9IHZhbHVlO1xuICB9XG4gIHJldHVybiBzdW07XG59XG5cbi8qKlxuICogQ29tcHV0ZSBtZWFuIG9mIGFycmF5LlxuICogQHBhcmFtIGFycmF5XG4gKiBAcmV0dXJuIFRoZSBtZWFuLlxuICovXG5leHBvcnQgZnVuY3Rpb24gbWVhbihhcnJheTogbnVtYmVyW118RmxvYXQzMkFycmF5KTogbnVtYmVyIHtcbiAgcmV0dXJuIHN1bShhcnJheSkgLyBhcnJheS5sZW5ndGg7XG59XG5cbi8qKlxuICogQ29tcHV0ZSB2YXJpYW5jZSBvZiBhcnJheS5cbiAqIEBwYXJhbSBhcnJheVxuICogQHJldHVybiBUaGUgdmFyaWFuY2UuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiB2YXJpYW5jZShhcnJheTogbnVtYmVyW118RmxvYXQzMkFycmF5KTogbnVtYmVyIHtcbiAgY29uc3QgbWVhblZhbHVlID0gbWVhbihhcnJheSk7XG4gIGNvbnN0IGRlbWVhbmVkID0gYXJyYXkubWFwKCh2YWx1ZTogbnVtYmVyKSA9PiB2YWx1ZSAtIG1lYW5WYWx1ZSk7XG4gIGxldCBzdW1TcXVhcmUgPSAwO1xuICBmb3IgKGxldCBpID0gMDsgaSA8IGRlbWVhbmVkLmxlbmd0aDsgaSsrKSB7XG4gICAgY29uc3QgdmFsdWUgPSBkZW1lYW5lZFtpXTtcbiAgICBzdW1TcXVhcmUgKz0gdmFsdWUgKiB2YWx1ZTtcbiAgfVxuICByZXR1cm4gc3VtU3F1YXJlIC8gYXJyYXkubGVuZ3RoO1xufVxuXG4vKipcbiAqIENvbXB1dGUgbWVkaWFuIG9mIGFycmF5LlxuICogQHBhcmFtIGFycmF5XG4gKiBAcmV0dXJuIFRoZSBtZWRpYW4gdmFsdWUuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBtZWRpYW4oYXJyYXk6IG51bWJlcltdfEZsb2F0MzJBcnJheSk6IG51bWJlciB7XG4gIGNvbnN0IGFycmF5U29ydGVkID0gYXJyYXkuc2xpY2UoKS5zb3J0KChhLCBiKSA9PiBhIC0gYik7XG4gIGNvbnN0IGxvd0lkeCA9IE1hdGguZmxvb3IoKGFycmF5U29ydGVkLmxlbmd0aCAtIDEpIC8gMik7XG4gIGNvbnN0IGhpZ2hJZHggPSBNYXRoLmNlaWwoKGFycmF5U29ydGVkLmxlbmd0aCAtIDEpIC8gMik7XG4gIGlmIChsb3dJZHggPT09IGhpZ2hJZHgpIHtcbiAgICByZXR1cm4gYXJyYXlTb3J0ZWRbbG93SWR4XTtcbiAgfVxuICByZXR1cm4gKGFycmF5U29ydGVkW2xvd0lkeF0gKyBhcnJheVNvcnRlZFtoaWdoSWR4XSkgLyAyO1xufVxuXG4vKipcbiAqIEdlbmVyYXRlIGFuIGFycmF5IG9mIGludGVnZXJzIGluIFtiZWdpbiwgZW5kKS5cbiAqIEBwYXJhbSBiZWdpbiBCZWdpbm5pbmcgaW50ZWdlciwgaW5jbHVzaXZlLlxuICogQHBhcmFtIGVuZCBFbmRpbmcgaW50ZWdlciwgZXhjbHVzaXZlLlxuICogQHJldHVybnMgUmFuZ2UgYXJyYXkuXG4gKiBAdGhyb3dzIFZhbHVlRXJyb3IsIGlmZiBgZW5kYCA8IGBiZWdpbmAuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiByYW5nZShiZWdpbjogbnVtYmVyLCBlbmQ6IG51bWJlcik6IG51bWJlcltdIHtcbiAgaWYgKGVuZCA8IGJlZ2luKSB7XG4gICAgdGhyb3cgbmV3IFZhbHVlRXJyb3IoYGVuZCAoJHtlbmR9KSA8IGJlZ2luICgke2JlZ2lufSkgaXMgZm9yYmlkZGVuLmApO1xuICB9XG4gIGNvbnN0IG91dDogbnVtYmVyW10gPSBbXTtcbiAgZm9yIChsZXQgaSA9IGJlZ2luOyBpIDwgZW5kOyArK2kpIHtcbiAgICBvdXQucHVzaChpKTtcbiAgfVxuICByZXR1cm4gb3V0O1xufVxuIl19","/**\n * @license\n * Copyright 2018 Google LLC\n *\n * Use of this source code is governed by an MIT-style\n * license that can be found in the LICENSE file or at\n * https://opensource.org/licenses/MIT.\n * =============================================================================\n */\nimport { backend } from '@tensorflow/tfjs-core';\nlet _epsilon;\n/**\n * Returns the value of the fuzz factor used in numeric expressions.\n */\nexport function epsilon() {\n if (_epsilon == null) {\n _epsilon = backend().epsilon();\n }\n return _epsilon;\n}\n/**\n * Sets the value of the fuzz factor used in numeric expressions.\n * @param e New value of epsilon.\n */\nexport function setEpsilon(e) {\n _epsilon = e;\n}\n/**\n * Returns the default image data format convention.\n */\nexport function imageDataFormat() {\n return 'channelsLast';\n}\n//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY29tbW9uLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vLi4vdGZqcy1sYXllcnMvc3JjL2JhY2tlbmQvY29tbW9uLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBOzs7Ozs7OztHQVFHO0FBRUgsT0FBTyxFQUFDLE9BQU8sRUFBQyxNQUFNLHVCQUF1QixDQUFDO0FBRzlDLElBQUksUUFBZ0IsQ0FBQztBQUVyQjs7R0FFRztBQUNILE1BQU0sVUFBVSxPQUFPO0lBQ3JCLElBQUksUUFBUSxJQUFJLElBQUksRUFBRTtRQUNwQixRQUFRLEdBQUcsT0FBTyxFQUFFLENBQUMsT0FBTyxFQUFFLENBQUM7S0FDaEM7SUFDRCxPQUFPLFFBQVEsQ0FBQztBQUNsQixDQUFDO0FBRUQ7OztHQUdHO0FBQ0gsTUFBTSxVQUFVLFVBQVUsQ0FBQyxDQUFTO0lBQ2xDLFFBQVEsR0FBRyxDQUFDLENBQUM7QUFDZixDQUFDO0FBRUQ7O0dBRUc7QUFDSCxNQUFNLFVBQVUsZUFBZTtJQUM3QixPQUFPLGNBQWMsQ0FBQztBQUN4QixDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiLyoqXG4gKiBAbGljZW5zZVxuICogQ29weXJpZ2h0IDIwMTggR29vZ2xlIExMQ1xuICpcbiAqIFVzZSBvZiB0aGlzIHNvdXJjZSBjb2RlIGlzIGdvdmVybmVkIGJ5IGFuIE1JVC1zdHlsZVxuICogbGljZW5zZSB0aGF0IGNhbiBiZSBmb3VuZCBpbiB0aGUgTElDRU5TRSBmaWxlIG9yIGF0XG4gKiBodHRwczovL29wZW5zb3VyY2Uub3JnL2xpY2Vuc2VzL01JVC5cbiAqID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4gKi9cblxuaW1wb3J0IHtiYWNrZW5kfSBmcm9tICdAdGVuc29yZmxvdy90ZmpzLWNvcmUnO1xuaW1wb3J0IHtEYXRhRm9ybWF0fSBmcm9tICcuLi9rZXJhc19mb3JtYXQvY29tbW9uJztcblxubGV0IF9lcHNpbG9uOiBudW1iZXI7XG5cbi8qKlxuICogUmV0dXJucyB0aGUgdmFsdWUgb2YgdGhlIGZ1enogZmFjdG9yIHVzZWQgaW4gbnVtZXJpYyBleHByZXNzaW9ucy5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGVwc2lsb24oKSB7XG4gIGlmIChfZXBzaWxvbiA9PSBudWxsKSB7XG4gICAgX2Vwc2lsb24gPSBiYWNrZW5kKCkuZXBzaWxvbigpO1xuICB9XG4gIHJldHVybiBfZXBzaWxvbjtcbn1cblxuLyoqXG4gKiBTZXRzIHRoZSB2YWx1ZSBvZiB0aGUgZnV6eiBmYWN0b3IgdXNlZCBpbiBudW1lcmljIGV4cHJlc3Npb25zLlxuICogQHBhcmFtIGUgTmV3IHZhbHVlIG9mIGVwc2lsb24uXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBzZXRFcHNpbG9uKGU6IG51bWJlcikge1xuICBfZXBzaWxvbiA9IGU7XG59XG5cbi8qKlxuICogUmV0dXJucyB0aGUgZGVmYXVsdCBpbWFnZSBkYXRhIGZvcm1hdCBjb252ZW50aW9uLlxuICovXG5leHBvcnQgZnVuY3Rpb24gaW1hZ2VEYXRhRm9ybWF0KCk6IERhdGFGb3JtYXQge1xuICByZXR1cm4gJ2NoYW5uZWxzTGFzdCc7XG59XG4iXX0=","/**\n * @license\n * Copyright 2018 Google LLC\n *\n * Use of this source code is governed by an MIT-style\n * license that can be found in the LICENSE file or at\n * https://opensource.org/licenses/MIT.\n * =============================================================================\n */\n/**\n * deeplearn.js backend.\n */\nimport * as tfc from '@tensorflow/tfjs-core';\nimport { onesLike as coreOnesLike, scalar, tensor1d, tidy, where, zerosLike as coreZerosLike } from '@tensorflow/tfjs-core';\nimport { checkDataFormat } from '../common';\nimport { NotImplementedError, ValueError } from '../errors';\nimport * as math_utils from '../utils/math_utils';\nimport { imageDataFormat } from './common';\n// tslint:enable\n/* Setting and getting backend from deeplearn.js. */\n// Default deeplearn.js backend is WebGL (GPU).\nlet backend = 'webgl';\nexport function setBackend(requestedBackend) {\n tfc.setBackend(requestedBackend);\n backend = requestedBackend;\n}\nexport function getBackend() {\n return backend;\n}\n/**\n * Indicates whether the backend is operating symbolically.\n *\n * This function will be used to determine how to interpret user code. If\n * it returns true, calls to the backend construct a symbolic graph; if\n * it returns false, calls to the backend execute immediately.\n */\nexport function isBackendSymbolic() {\n return false;\n}\n/**\n * Get the number of elements in a Tensor.\n * @param x The Tensor.\n * @return Number of elements in `x`.\n */\nexport function countParams(x) {\n const shape = x.shape;\n if (shape.length > 0) {\n return shape.reduce((a, b) => a * b);\n }\n else {\n // Scalar.\n return 1;\n }\n}\n/**\n * Casts a tensor to a different dtype and returns it.\n * @param x Input tensor.\n * @param dtype String: 'float32'|'int32'|'bool'.\n * @returns Tensor of the specified `dtype`.\n */\nexport function cast(x, dtype) {\n return tfc.cast(x, dtype);\n}\n/**\n * Adds a 1-sized dimension at index \"axis\".\n * @param x Input tensor.\n * @param axis Position where to add the new axis.\n * @returns Result of the dimension expansion.\n */\nexport function expandDims(x, axis = -1) {\n const outShape = x.shape.slice();\n if (axis < 0) {\n axis = outShape.length + axis + 1;\n }\n outShape.splice(axis, 0, 1);\n return tfc.reshape(x, outShape);\n}\n/**\n * Repeats a 2D tensor.\n *\n * If `x` has shape `[samples, dim]` and `n` is 2, for example, the output\n * will have shape `[samples, 2, dim]`.\n *\n * @param x Input tensor.\n * @param n Integer, number of times to repeat.\n * @returns The result of the repeat operation.\n * @throws ValueError: If input tensor is not 2D.\n */\nexport function repeat(x, n) {\n return tidy(() => {\n if (x.shape.length !== 2) {\n throw new ValueError(`repeat() expects a rank-2 tensor, but received a ` +\n `rank-${x.shape.length} tensor.`);\n }\n const y = expandDims(x, 1);\n return tile(y, [1, n, 1]);\n });\n}\n/**\n * Flatten a Tensor into 1D.\n * @param x Input tensor.\n * @return The result of the flattening `x`.\n */\nexport function flatten(x) {\n const newShape = [math_utils.arrayProd(x.shape)];\n return tfc.reshape(x, newShape);\n}\n/**\n * Turn a nD tensor into a 2D tensor with same 0th dimension.\n * In other words, it flattens each data samples of a batch.\n *\n * @param x The tensor to flatten. The rank of this tensor is required to be 2\n * or higher.\n * @return The result of the flattening.\n */\nexport function batchFlatten(x) {\n if (x.rank <= 1) {\n throw new ValueError(`batchFlatten requires a minimum rank of 2. Got rank: ${x.rank}.`);\n }\n const newShape = [x.shape[0], math_utils.arrayProd(x.shape, 1)];\n return tfc.reshape(x, newShape);\n}\n/**\n * Do slicing along the first axis.\n * @param array input `tf.Tensor`.\n * @param start starting index, inclusive.\n * @param size size of the slice along the first axis.\n * @returns result of the slicing.\n * @throws ValueError: If `array` is of an unsupported subtype of `tf.Tensor`.\n */\nexport function sliceAlongFirstAxis(array, start, size) {\n return tidy(() => {\n switch (array.rank) {\n case 1:\n return tfc.slice1d(array, start, size);\n case 2:\n return tfc.slice2d(array, [start, 0], [size, array.shape[1]]);\n case 3:\n return tfc.slice3d(array, [start, 0, 0], [size, array.shape[1], array.shape[2]]);\n case 4:\n return tfc.slice4d(array, [start, 0, 0, 0], [size, array.shape[1], array.shape[2], array.shape[3]]);\n case 5:\n return tfc.slice(array, [start, 0, 0, 0, 0], [\n size, array.shape[1], array.shape[2], array.shape[3], array.shape[4]\n ]);\n case 6:\n return tfc.slice(array, [start, 0, 0, 0, 0, 0], [\n size, array.shape[1], array.shape[2], array.shape[3], array.shape[4],\n array.shape[5]\n ]);\n default:\n throw new ValueError(`sliceAlongFirstAxis() received an unsupported tensor rank: ` +\n `${array.rank}`);\n }\n });\n}\n/**\n * Do slicing along the last axis.\n * @param array input `tf.Tensor`.\n * @param start starting index, inclusive.\n * @param size size of the slice along the last axis.\n * @returns result of the slicing.\n * @throws ValueError: If `array` is of an unsupported subtype of `tf.Tensor`.\n */\nexport function sliceAlongLastAxis(array, start, size) {\n return tidy(() => {\n switch (array.rank) {\n case 1:\n return tfc.slice1d(array, start, size);\n case 2:\n return tfc.slice2d(array, [0, start], [array.shape[0], size]);\n case 3:\n return tfc.slice3d(array, [0, 0, start], [array.shape[0], array.shape[1], size]);\n case 4:\n return tfc.slice4d(array, [0, 0, 0, start], [array.shape[0], array.shape[1], array.shape[2], size]);\n default:\n throw new ValueError(`sliceAlongLastAxis() received an unsupported tensor rank: ` +\n `${array.rank}`);\n }\n });\n}\n/**\n * Do slicing along the sepcified axis.\n * @param array input `tf.Tensor`.\n * @param start starting index, inclusive.\n * @param size of the slice along the chosen axis.\n * @param choose an axis.\n * @returns result of the slicing.\n * @throws ValueError: If `array` is of an unsupported subtype of `tf.Tensor`.\n */\nexport function sliceAlongAxis(array, start, size, axis) {\n return tidy(() => {\n switch (array.rank) {\n case 1:\n return tfc.slice1d(array, start, size);\n case 2:\n switch (axis) {\n case 1:\n return sliceAlongFirstAxis(array, start, size);\n case 2:\n return sliceAlongLastAxis(array, start, size);\n default:\n throw new ValueError(`The axis is not within the rank of the tensor ` +\n `${axis}`);\n }\n case 3:\n switch (axis) {\n case 1:\n return sliceAlongFirstAxis(array, start, size);\n case 2:\n return tfc.slice3d(array, [0, start, 0], [array.shape[0], size, array.shape[2]]);\n case 3:\n return sliceAlongLastAxis(array, start, size);\n default:\n throw new ValueError(`The axis is not within the rank of the tensor ` +\n `${axis}`);\n }\n case 4:\n switch (axis) {\n case 1:\n return sliceAlongFirstAxis(array, start, size);\n case 2:\n return tfc.slice4d(array, [0, start, 0, 0], [array.shape[0], size, array.shape[2], array.shape[3]]);\n case 3:\n return tfc.slice4d(array, [0, 0, start, 0], [array.shape[0], array.shape[1], size, array.shape[3]]);\n case 4:\n return sliceAlongLastAxis(array, start, size);\n default:\n throw new ValueError(`The axis is not within the rank of the tensor ` +\n `${axis}`);\n }\n default:\n throw new ValueError(`sliceAlongLastAxis() received an unsupported tensor rank: ` +\n `${array.rank}`);\n }\n });\n}\n/**\n * Concatenates a list of tensors alongside the specified axis.\n * @param tensors `Array` of tensors to concatenate.\n * @param axis Concatenation axis.\n * @returns The result of the concatenation.\n */\nexport function concatenate(tensors, axis = -1) {\n let rank;\n if (axis < 0) {\n rank = tensors[0].rank;\n if (rank !== 0) {\n axis = rank;\n }\n else {\n axis = 0;\n }\n }\n if (axis === tensors[0].rank) {\n // Porting Note: This is necessary because tfc.concat() requires axis to be\n // in the interval [-rank, rank).\n axis = -1;\n }\n // Porting Note: Sparse concat is not supported yet.\n return tfc.concat(tensors, axis);\n}\n/**\n * Concatenate two arrays along the first dimension.\n * @param a The 1st `tf.Tensor` to concatenate.\n * @param b The 2nd `tf.Tensor` to concatenate.\n * @returns Result of the concatenation.\n * @throws ValueError: If `a` is of an unsupported subtype of `tf.Tensor`.\n */\nexport function concatAlongFirstAxis(a, b) {\n switch (a.rank) {\n case 1:\n return tfc.concat1d([a, b]);\n case 2:\n return tfc.concat2d([a, b], 0);\n case 3:\n return tfc.concat3d([a, b], 0);\n case 4:\n return tfc.concat4d([a, b], 0);\n default:\n throw new ValueError(`concatAlongFirstAxis() received an unsupported ` +\n `tensor rank: ${a.rank}`);\n }\n}\n/**\n * Creates a tensor by tiling `x` by `n`.\n * @param x A tensor.\n * @param n An Array of integers or a single integer. If an Array, the length\n * must be the same as the number of dimensions in `x`. If a single integer,\n * it will be treated as an Array of length 1.\n */\nexport function tile(x, n) {\n if (!Array.isArray(n)) {\n n = [n];\n }\n if (x.rank !== n.length) {\n throw new ValueError(`The length of input n (${n.length}) does not match ` +\n `the number of dimensions in input x (${x.rank})`);\n }\n return tfc.tile(x, n);\n}\n/* Creation of random tensors. */\n/**\n * Get a tensor with normal distribution of values.\n *\n * @param shape Shape of the tensor.\n * @param mean mean value of the normal distribution.\n * @param stddev standard deviation of the normal distribution.\n * @param dtype\n * @param seed\n * @return The normal tensor.\n */\nexport function randomNormal(shape, mean = 0.0, stddev = 1.0, dtype, seed) {\n return tfc.randomNormal(shape, mean, stddev, dtype, seed);\n}\n/* Linear Algebra */\n/**\n * Multiply two tensors and returns the result as a tensor.\n *\n * For 2D tensors, this is equivalent to matrix multiplication (matMul).\n * For tensors of higher ranks, it follows the Theano behavior,\n * (e.g. `(2, 3) * (4, 3, 5) -> (2, 4, 5)`). From the Theano documentation:\n *\n * For N dimensions it is a sum product over the last axis of x and the\n * second-to-last of y:\n *\n * @param a A tensor of at least rank 2.\n * @param b A tensor of at least rank 2.\n * @param activation (optional) A string identifying the activation\n * function.\n * @return Result of the dot operation.\n */\nexport function dot(a, b, activation, bias) {\n if ((a.rank < 2) || (b.rank < 2)) {\n throw new NotImplementedError(`dot requires both inputs to be rank >= 2` +\n ` but got x shape = ${a.shape} and y shape = ${b.shape}`);\n }\n if (b.rank >= 3) {\n const xLastDim = a.shape.slice(-1)[0];\n const ySecondLastDim = b.shape.slice(-2)[0];\n if (xLastDim !== ySecondLastDim) {\n throw new NotImplementedError(`If rank y >= 3, then the second last dim` +\n ` of y must equal the last dim of x but got x shape = ${a.shape} and ` +\n ` y shape = ${b.shape}`);\n }\n }\n // Handle basic 2D x 2D case.\n if ((a.rank === 2) && (b.rank === 2)) {\n const transposeA = false;\n const transposeB = false;\n // tfc.fused.matMul only fuses certain activation functions. Unsupported\n // activation functions are treated as 'linear' activations, which is\n // equivalent to a no-op.\n return tfc.fused.matMul({\n a,\n b: b,\n transposeA,\n transposeB,\n bias: bias ? reshapeBias(a.rank, bias, imageDataFormat()) : null,\n activation\n });\n }\n else {\n // Reshape x into the analogous 2D Tensor.\n const aFirstDims = a.shape.slice(); // Holds all but the last dim of x.\n const aLastDim = aFirstDims.pop();\n a = tfc.reshape(a, [-1, aLastDim]);\n // Reshape y into the analogous 2D Tensor, and keep track of the\n // required dimensions to reproduce the output shape.\n const bShape = b.shape.slice();\n const bLastDim = bShape.pop();\n const ySecondLastDim = bShape.pop();\n const yOtherDims = [...bShape, bLastDim];\n // permutation should be like [r-2, 0, 1, 2, ... r-4, r-3, r-1]\n // where r is the rank of y.\n const perm = Array.from({ length: b.rank }, (_, i) => {\n if (i === 0) {\n return b.rank - 2;\n }\n else if (i <= b.rank - 2) {\n return i - 1;\n }\n return i;\n });\n b = tfc.reshape(tfc.transpose(b, perm), [ySecondLastDim, -1]);\n // Multiply x and y as 2D Tensors, and then reshape back to original.\n const outputShape = [...aFirstDims, ...yOtherDims];\n const transposeA = false;\n const transposeB = false;\n return tfc.reshape(tfc.fused.matMul({\n a,\n b,\n transposeA,\n transposeB,\n bias: bias ? reshapeBias(a.rank, bias, imageDataFormat()) : null,\n activation\n }), outputShape);\n }\n}\n/**\n * Compute the sign Tensor of an input Tensor.\n *\n * Elements of the input `tf.Tensor` that are === 0 are mapped to 0.\n * Elements of the input `tf.Tensor` that are > 0 are mapped to 1.\n * Elements of the input `tf.Tensor` that are < 0 are mapped to -1.\n *\n * @param x Input `tf.Tensor`.\n * @return The sign `tf.Tensor`.\n */\nexport function sign(x) {\n // TODO(cais): Move to the core.\n return tidy(() => {\n const zerosLikeX = coreZerosLike(x);\n const onesLikeX = coreOnesLike(x);\n return where(tfc.equal(x, zerosLikeX), zerosLikeX, where(tfc.greater(x, coreZerosLike(x)), onesLikeX, tfc.mul(-1, onesLikeX)));\n });\n}\n/**\n * Computes the one-hot representation of an integer tensor.\n * @param indices nD integer tensor of shape\n * `(batch_size, dim1, dim2, ... dim(n-1))`\n * @param numClasses Integer, number of classes to consider.\n * @returns (n + 1)D one hot representation of the input\n * with shape `(batch_size, dim1, dim2, ... dim(n-1), num_classes)`\n */\nexport function oneHot(indices, numClasses) {\n return tidy(() => {\n if (indices.rank !== 1) {\n throw new Error('Only 1D one-hot tensors are supported in the ' +\n 'deeplearn backend, at present.');\n }\n indices = tfc.cast(indices, 'int32');\n return tfc.cast(tfc.oneHot(indices, numClasses), 'float32');\n });\n}\n/* Elementary math functions. */\n/**\n * Retrieves the elements of indices `indices` in the tensor `reference`.\n * @param reference A tensor.\n * @param indices An integer tensor of indices or an `Array` of integers.\n * @param axis Axis along which to perform the gather operation.\n * @returns The result of the gathering as a tensor.\n */\nexport function gather(reference, indices, axis) {\n return tidy(() => {\n if (Array.isArray(indices)) {\n indices = tensor1d(indices, 'int32');\n }\n else {\n indices = tfc.cast(indices, 'int32');\n }\n return tfc.gather(reference, indices, axis);\n });\n}\n/**\n * Element-wise square.\n * @param x Input tensor.\n * @return element-wise x^2\n */\nexport function square(x) {\n return tfc.mul(x, x);\n}\n/**\n * Element-wise exponentiation.\n *\n * Porting Note: In PyKeras, `a` (the exponent) is a Python integer, which\n * takes advatnage of the backend's (e.g., TensorFlow's) automatic\n * conversion to tensor. Here we allow `a` to be either a number or a tensor.\n *\n * @param x The base tensor.\n * @param a The exponent, tensor or number. If a number, it is rounded to the\n * nearest integer and converted to a tensor.\n * @returns A tensor of the same shape as `x`.\n */\nexport function pow(x, a) {\n return tidy(() => {\n if (typeof (a) === 'number') {\n a = scalar(Math.round(a), 'int32');\n }\n if (a.dtype !== 'int32') {\n throw new NotImplementedError(`Non-int32 dtype (${a.dtype}) is not supported by pow() yet`);\n }\n return tfc.pow(x, a);\n });\n}\n/**\n * Reshapes bias tensor according to rank of x.\n */\nfunction reshapeBias(xRank, bias, dataFormat) {\n const biasShape = bias.shape;\n if (bias.rank !== 1 && bias.rank !== xRank) {\n throw new ValueError(`Unexpected bias dimensions: ${bias.rank}` +\n `; expected it to be 1 or ${xRank}`);\n }\n if (xRank === 5) {\n if (dataFormat === 'channelsFirst') {\n if (biasShape.length === 1) {\n return tfc.reshape(bias, [1, biasShape[0], 1, 1, 1]);\n }\n else {\n return tfc.reshape(bias, [1, biasShape[3], biasShape[0], biasShape[1], biasShape[2]]);\n }\n }\n else if (dataFormat === 'channelsLast') {\n if (biasShape.length === 1) {\n return tfc.reshape(bias, [1, 1, 1, 1, biasShape[0]]);\n }\n else {\n return tfc.reshape(bias, [1].concat(biasShape));\n }\n }\n }\n else if (xRank === 4) {\n if (dataFormat === 'channelsFirst') {\n if (biasShape.length === 1) {\n return tfc.reshape(bias, [1, biasShape[0], 1, 1]);\n }\n else {\n return tfc.reshape(bias, [1, biasShape[2], biasShape[0], biasShape[1]]);\n }\n }\n else if (dataFormat === 'channelsLast') {\n if (biasShape.length === 1) {\n return tfc.reshape(bias, [1, 1, 1, biasShape[0]]);\n }\n else {\n return tfc.reshape(bias, [1].concat(biasShape));\n }\n }\n }\n else if (xRank === 3) {\n if (dataFormat === 'channelsFirst') {\n if (biasShape.length === 1) {\n return tfc.reshape(bias, [1, biasShape[0], 1]);\n }\n else {\n return tfc.reshape(bias, [1, biasShape[1], biasShape[0]]);\n }\n }\n else if (dataFormat === 'channelsLast') {\n if (biasShape.length === 1) {\n return tfc.reshape(bias, [1, 1, biasShape[0]]);\n }\n else {\n return tfc.reshape(bias, [1].concat(biasShape));\n }\n }\n }\n else if (xRank < 3) {\n return bias;\n }\n throw new ValueError(`Unsupported input rank by biasAdd: ${bias.rank}`);\n}\n/* Neural-network operations. */\n/**\n * Add a bias to a tensor.\n *\n * @param x The tensor to add the bias to.\n * @param bias The bias to add to `x`. Must be 1D or the same rank as `x`.\n * @return Result of the bias adding.\n * @throws ValueError: If the rank of `bias` is incorrect.\n */\nexport function biasAdd(x, bias, dataFormat) {\n return tidy(() => {\n if (dataFormat == null) {\n dataFormat = imageDataFormat();\n }\n checkDataFormat(dataFormat);\n return tfc.add(x, reshapeBias(x.rank, bias, dataFormat));\n });\n}\n/**\n * Exponential linear unit (ELU).\n * @param x A tensor or variable to compute the activation function for.\n * @param alpha: A scalar, a scaling factor for the negative section.\n * @return Output of the ELU operation.\n */\nexport function elu(x, alpha = 1) {\n // TODO(cais): Add support for alpha values other than 1.\n if (alpha !== 1) {\n throw new NotImplementedError(`Support for alpha values other than 1 (${alpha}) is not implemented ` +\n `yet.`);\n }\n return tfc.elu(x);\n}\n/**\n * Softsign of a tensor.\n *\n * Defined as x / (abs(x) + 1), element-wise.\n *\n * @param x: Input.\n * @returns Output.\n */\nexport function softsign(x) {\n return tidy(() => tfc.div(x, tfc.add(tfc.abs(x), 1)));\n}\n/**\n * Sets entries in `x` to zero at random, while scaling the entire tensor.\n *\n * @param x input tensor.\n * @param level fraction of the entries in the tensor that will be set to 0.\n * @param noiseShape shape of randomly generated keep/drop flags, must be\n * broadcastable to the shape of `x`. Optional.\n * @param seed random seed to ensure determinism. Optional.\n * @returns Result of the dropout operation.\n */\nexport function dropout(x, level, noiseShape, seed) {\n return tidy(() => tfc.dropout(x, level, noiseShape, seed));\n}\n/**\n * Element-wise, segment-wise linear approximation of sigmoid.\n *\n * Returns `0.` if `x < -2.5`, `1.` if `x > 2.5`.\n * In `-2.5 <= x <= 2.5`, returns `0.2 * x + 0.5`.\n *\n * @param x Input tensor.\n * @returns Output tensor.\n */\nexport function hardSigmoid(x) {\n return tidy(() => {\n const y = tfc.add(.5, tfc.mul(.2, x));\n return tfc.clipByValue(y, 0, 1);\n });\n}\n/**\n * Invoke `x` in the training phase, and `alt` otherwise.\n *\n * Porting Note: We do not create placeholder tensors for the `training`\n * boolean flag here, because there is no such thing in the TF.js imperative\n * backend.\n *\n * @param x The function to invoke iff `training` is `true`.\n * @param alt The function to invoke iff `training` is `false`.\n * @param training Boolean flag for whether training phase is active.\n * @returns The return value of `x()` if `training` is `true`, or the return\n * value of `alt()` if `training` is `false`.\n */\nexport function inTrainPhase(x, alt, training = false) {\n return training ? x() : alt();\n}\n//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidGZqc19iYWNrZW5kLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vLi4vdGZqcy1sYXllcnMvc3JjL2JhY2tlbmQvdGZqc19iYWNrZW5kLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBOzs7Ozs7OztHQVFHO0FBRUg7O0dBRUc7QUFFSCxPQUFPLEtBQUssR0FBRyxNQUFNLHVCQUF1QixDQUFDO0FBQzdDLE9BQU8sRUFBQyxRQUFRLElBQUksWUFBWSxFQUFFLE1BQU0sRUFBb0IsUUFBUSxFQUEwQyxJQUFJLEVBQUUsS0FBSyxFQUFFLFNBQVMsSUFBSSxhQUFhLEVBQUMsTUFBTSx1QkFBdUIsQ0FBQztBQUNwTCxPQUFPLEVBQUMsZUFBZSxFQUFDLE1BQU0sV0FBVyxDQUFDO0FBQzFDLE9BQU8sRUFBQyxtQkFBbUIsRUFBRSxVQUFVLEVBQUMsTUFBTSxXQUFXLENBQUM7QUFHMUQsT0FBTyxLQUFLLFVBQVUsTUFBTSxxQkFBcUIsQ0FBQztBQUVsRCxPQUFPLEVBQUMsZUFBZSxFQUFDLE1BQU0sVUFBVSxDQUFDO0FBRXpDLGdCQUFnQjtBQUVoQixvREFBb0Q7QUFFcEQsK0NBQStDO0FBQy9DLElBQUksT0FBTyxHQUFrQixPQUFPLENBQUM7QUFFckMsTUFBTSxVQUFVLFVBQVUsQ0FBQyxnQkFBK0I7SUFDeEQsR0FBRyxDQUFDLFVBQVUsQ0FBQyxnQkFBZ0IsQ0FBQyxDQUFDO0lBQ2pDLE9BQU8sR0FBRyxnQkFBZ0IsQ0FBQztBQUM3QixDQUFDO0FBRUQsTUFBTSxVQUFVLFVBQVU7SUFDeEIsT0FBTyxPQUFPLENBQUM7QUFDakIsQ0FBQztBQUVEOzs7Ozs7R0FNRztBQUNILE1BQU0sVUFBVSxpQkFBaUI7SUFDL0IsT0FBTyxLQUFLLENBQUM7QUFDZixDQUFDO0FBRUQ7Ozs7R0FJRztBQUNILE1BQU0sVUFBVSxXQUFXLENBQUMsQ0FBVztJQUNyQyxNQUFNLEtBQUssR0FBRyxDQUFDLENBQUMsS0FBSyxDQUFDO0lBQ3RCLElB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R0FBRyxLQUFLO0lBQ3hFLE9BQU8sUUFBUSxDQUFDLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsR0FBRyxFQUFFLENBQUM7QUFDaEMsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbIi8qKlxuICogQGxpY2Vuc2VcbiAqIENvcHlyaWdodCAyMDE4IEdvb2dsZSBMTENcbiAqXG4gKiBVc2Ugb2YgdGhpcyBzb3VyY2UgY29kZSBpcyBnb3Zlcm5lZCBieSBhbiBNSVQtc3R5bGVcbiAqIGxpY2Vuc2UgdGhhdCBjYW4gYmUgZm91bmQgaW4gdGhlIExJQ0VOU0UgZmlsZSBvciBhdFxuICogaHR0cHM6Ly9vcGVuc291cmNlLm9yZy9saWNlbnNlcy9NSVQuXG4gKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuICovXG5cbi8qKlxuICogZGVlcGxlYXJuLmpzIGJhY2tlbmQuXG4gKi9cblxuaW1wb3J0ICogYXMgdGZjIGZyb20gJ0B0ZW5zb3JmbG93L3RmanMtY29yZSc7XG5pbXBvcnQge29uZXNMaWtlIGFzIGNvcmVPbmVzTGlrZSwgc2NhbGFyLCBUZW5zb3IsIFRlbnNvcjFELCB0ZW5zb3IxZCwgVGVuc29yMkQsIFRlbnNvcjNELCBUZW5zb3I0RCwgVGVuc29yNUQsIHRpZHksIHdoZXJlLCB6ZXJvc0xpa2UgYXMgY29yZVplcm9zTGlrZX0gZnJvbSAnQHRlbnNvcmZsb3cvdGZqcy1jb3JlJztcbmltcG9ydCB7Y2hlY2tEYXRhRm9ybWF0fSBmcm9tICcuLi9jb21tb24nO1xuaW1wb3J0IHtOb3RJbXBsZW1lbnRlZEVycm9yLCBWYWx1ZUVycm9yfSBmcm9tICcuLi9lcnJvcnMnO1xuaW1wb3J0IHtEYXRhRm9ybWF0LCBTaGFwZX0gZnJvbSAnLi4va2VyYXNfZm9ybWF0L2NvbW1vbic7XG5pbXBvcnQge0hhc1NoYXBlfSBmcm9tICcuLi90eXBlcyc7XG5pbXBvcnQgKiBhcyBtYXRoX3V0aWxzIGZyb20gJy4uL3V0aWxzL21hdGhfdXRpbHMnO1xuXG5pbXBvcnQge2ltYWdlRGF0YUZvcm1hdH0gZnJvbSAnLi9jb21tb24nO1xuXG4vLyB0c2xpbnQ6ZW5hYmxlXG5cbi8qIFNldHRpbmcgYW5kIGdldHRpbmcgYmFja2VuZCBmcm9tIGRlZXBsZWFybi5qcy4gKi9cblxuLy8gRGVmYXVsdCBkZWVwbGVhcm4uanMgYmFja2VuZCBpcyBXZWJHTCAoR1BVKS5cbmxldCBiYWNrZW5kOiAnY3B1J3wnd2ViZ2wnID0gJ3dlYmdsJztcblxuZXhwb3J0IGZ1bmN0aW9uIHNldEJhY2tlbmQocmVxdWVzdGVkQmFja2VuZDogJ2NwdSd8J3dlYmdsJykge1xuICB0ZmMuc2V0QmFja2VuZChyZXF1ZXN0ZWRCYWNrZW5kKTtcbiAgYmFja2VuZCA9IHJlcXVlc3RlZEJhY2tlbmQ7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBnZXRCYWNrZW5kKCk6ICdjcHUnfCd3ZWJnbCcge1xuICByZXR1cm4gYmFja2VuZDtcbn1cblxuLyoqXG4gKiBJbmRpY2F0ZXMgd2hldGhlciB0aGUgYmFja2VuZCBpcyBvcGVyYXRpbmcgc3ltYm9saWNhbGx5LlxuICpcbiAqIFRoaXMgZnVuY3Rpb24gd2lsbCBiZSB1c2VkIHRvIGRldGVybWluZSBob3cgdG8gaW50ZXJwcmV0IHVzZXIgY29kZS4gSWZcbiAqIGl0IHJldHVybnMgdHJ1ZSwgY2FsbHMgdG8gdGhlIGJhY2tlbmQgY29uc3RydWN0IGEgc3ltYm9saWMgZ3JhcGg7IGlmXG4gKiBpdCByZXR1cm5zIGZhbHNlLCBjYWxscyB0byB0aGUgYmFja2VuZCBleGVjdXRlIGltbWVkaWF0ZWx5LlxuICovXG5leHBvcnQgZnVuY3Rpb24gaXNCYWNrZW5kU3ltYm9saWMoKTogYm9vbGVhbiB7XG4gIHJldHVybiBmYWxzZTtcbn1cblxuLyoqXG4gKiBHZXQgdGhlIG51bWJlciBvZiBlbGVtZW50cyBpbiBhIFRlbnNvci5cbiAqIEBwYXJhbSB4IFRoZSBUZW5zb3IuXG4gKiBAcmV0dXJuIE51bWJlciBvZiBlbGVtZW50cyBpbiBgeGAuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBjb3VudFBhcmFtcyh4OiBIYXNTaGFwZSk6IG51bWJlciB7XG4gIGNvbnN0IHNoYXBlID0geC5zaGFwZTtcbiAgaWYgKHNoYXBlLmxlbmd0aCA+IDApIHtcbiAgICByZXR1cm4gc2hhcGUucmVkdWNlKChhOiBudW1iZXIsIGI6IG51bWJlcikgPT4gYSAqIGIpO1xuICB9IGVsc2Uge1xuICAgIC8vIFNjYWxhci5cbiAgICByZXR1cm4gMTtcbiAgfVxufVxuXG4vKipcbiAqIENhc3RzIGEgdGVuc29yIHRvIGEgZGlmZmVyZW50IGR0eXBlIGFuZCByZXR1cm5zIGl0LlxuICogQHBhcmFtIHggSW5wdXQgdGVuc29yLlxuICogQHBhcmFtIGR0eXBlIFN0cmluZzogJ2Zsb2F0MzInfCdpbnQzMid8J2Jvb2wnLlxuICogQHJldHVybnMgVGVuc29yIG9mIHRoZSBzcGVjaWZpZWQgYGR0eXBlYC5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGNhc3QoeDogVGVuc29yLCBkdHlwZTogdGZjLkRhdGFUeXBlKTogVGVuc29yIHtcbiAgcmV0dXJuIHRmYy5jYXN0KHgsIGR0eXBlKTtcbn1cblxuLyoqXG4gKiBBZGRzIGEgMS1zaXplZCBkaW1lbnNpb24gYXQgaW5kZXggXCJheGlzXCIuXG4gKiBAcGFyYW0geCBJbnB1dCB0ZW5zb3IuXG4gKiBAcGFyYW0gYXhpcyBQb3NpdGlvbiB3aGVyZSB0byBhZGQgdGhlIG5ldyBheGlzLlxuICogQHJldHVybnMgUmVzdWx0IG9mIHRoZSBkaW1lbnNpb24gZXhwYW5zaW9uLlxuICovXG5leHBvcnQgZnVuY3Rpb24gZXhwYW5kRGltcyh4OiBUZW5zb3IsIGF4aXMgPSAtMSk6IFRlbnNvciB7XG4gIGNvbnN0IG91dFNoYXBlID0geC5zaGFwZS5zbGljZSgpO1xuICBpZiAoYXhpcyA8IDApIHtcbiAgICBheGlzID0gb3V0U2hhcGUubGVuZ3RoICsgYXhpcyArIDE7XG4gIH1cbiAgb3V0U2hhcGUuc3BsaWNlKGF4aXMsIDAsIDEpO1xuICByZXR1cm4gdGZjLnJlc2hhcGUoeCwgb3V0U2hhcGUpO1xufVxuXG4vKipcbiAqIFJlcGVhdHMgYSAyRCB0ZW5zb3IuXG4gKlxuICogSWYgYHhgIGhhcyBzaGFwZSBgW3NhbXBsZXMsIGRpbV1gIGFuZCBgbmAgaXMgMiwgZm9yIGV4YW1wbGUsIHRoZSBvdXRwdXRcbiAqIHdpbGwgaGF2ZSBzaGFwZSBgW3NhbXBsZXMsIDIsIGRpbV1gLlxuICpcbiAqIEBwYXJhbSB4IElucHV0IHRlbnNvci5cbiAqIEBwYXJhbSBuIEludGVnZXIsIG51bWJlciBvZiB0aW1lcyB0byByZXBlYXQuXG4gKiBAcmV0dXJucyBUaGUgcmVzdWx0IG9mIHRoZSByZXBlYXQgb3BlcmF0aW9uLlxuICogQHRocm93cyBWYWx1ZUVycm9yOiBJZiBpbnB1dCB0ZW5zb3IgaXMgbm90IDJELlxuICovXG5leHBvcnQgZnVuY3Rpb24gcmVwZWF0KHg6IFRlbnNvciwgbjogbnVtYmVyKTogVGVuc29yIHtcbiAgcmV0dXJuIHRpZHkoKCkgPT4ge1xuICAgIGlmICh4LnNoYXBlLmxlbmd0aCAhPT0gMikge1xuICAgICAgdGhyb3cgbmV3IFZhbHVlRXJyb3IoXG4gICAgICAgICAgYHJlcGVhdCgpIGV4cGVjdHMgYSByYW5rLTIgdGVuc29yLCBidXQgcmVjZWl2ZWQgYSBgICtcbiAgICAgICAgICBgcmFuay0ke3guc2hhcGUubGVuZ3RofSB0ZW5zb3IuYCk7XG4gICAgfVxuICAgIGNvbnN0IHkgPSBleHBhbmREaW1zKHgsIDEpO1xuICAgIHJldHVybiB0aWxlKHksIFsxLCBuLCAxXSk7XG4gIH0pO1xufVxuXG4vKipcbiAqIEZsYXR0ZW4gYSBUZW5zb3IgaW50byAxRC5cbiAqIEBwYXJhbSB4IElucHV0IHRlbnNvci5cbiAqIEByZXR1cm4gVGhlIHJlc3VsdCBvZiB0aGUgZmxhdHRlbmluZyBgeGAuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBmbGF0dGVuKHg6IFRlbnNvcik6IFRlbnNvciB7XG4gIGNvbnN0IG5ld1NoYXBlID0gW21hdGhfdXRpbHMuYXJyYXlQcm9kKHguc2hhcGUpXTtcbiAgcmV0dXJuIHRmYy5yZXNoYXBlKHgsIG5ld1NoYXBlKTtcbn1cblxuLyoqXG4gKiBUdXJuIGEgbkQgdGVuc29yIGludG8gYSAyRCB0ZW5zb3Igd2l0aCBzYW1lIDB0aCBkaW1lbnNpb24uXG4gKiBJbiBvdGhlciB3b3JkcywgaXQgZmxhdHRlbnMgZWFjaCBkYXRhIHNhbXBsZXMgb2YgYSBiYXRjaC5cbiAqXG4gKiBAcGFyYW0geCBUaGUgdGVuc29yIHRvIGZsYXR0ZW4uIFRoZSByYW5rIG9mIHRoaXMgdGVuc29yIGlzIHJlcXVpcmVkIHRvIGJlIDJcbiAqICAgb3IgaGlnaGVyLlxuICogQHJldHVybiBUaGUgcmVzdWx0IG9mIHRoZSBmbGF0dGVuaW5nLlxuICovXG5leHBvcnQgZnVuY3Rpb24gYmF0Y2hGbGF0dGVuKHg6IFRlbnNvcik6IFRlbnNvciB7XG4gIGlmICh4LnJhbmsgPD0gMSkge1xuICAgIHRocm93IG5ldyBWYWx1ZUVycm9yKFxuICAgICAgICBgYmF0Y2hGbGF0dGVuIHJlcXVpcmVzIGEgbWluaW11bSByYW5rIG9mIDIuIEdvdCByYW5rOiAke3gucmFua30uYCk7XG4gIH1cbiAgY29uc3QgbmV3U2hhcGUgPSBbeC5zaGFwZVswXSwgbWF0aF91dGlscy5hcnJheVByb2QoeC5zaGFwZSwgMSldO1xuICByZXR1cm4gdGZjLnJlc2hhcGUoeCwgbmV3U2hhcGUpO1xufVxuXG4vKipcbiAqIERvIHNsaWNpbmcgYWxvbmcgdGhlIGZpcnN0IGF4aXMuXG4gKiBAcGFyYW0gYXJyYXkgaW5wdXQgYHRmLlRlbnNvcmAuXG4gKiBAcGFyYW0gc3RhcnQgc3RhcnRpbmcgaW5kZXgsIGluY2x1c2l2ZS5cbiAqIEBwYXJhbSBzaXplIHNpemUgb2YgdGhlIHNsaWNlIGFsb25nIHRoZSBmaXJzdCBheGlzLlxuICogQHJldHVybnMgcmVzdWx0IG9mIHRoZSBzbGljaW5nLlxuICogQHRocm93cyBWYWx1ZUVycm9yOiBJZiBgYXJyYXlgIGlzIG9mIGFuIHVuc3VwcG9ydGVkIHN1YnR5cGUgb2YgYHRmLlRlbnNvcmAuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBzbGljZUFsb25nRmlyc3RBeGlzKFxuICAgIGFycmF5OiBUZW5zb3IsIHN0YXJ0OiBudW1iZXIsIHNpemU6IG51bWJlcik6IFRlbnNvciB7XG4gIHJldHVybiB0aWR5KCgpID0+IHtcbiAgICBzd2l0Y2ggKGFycmF5LnJhbmspIHtcbiAgICAgIGNhc2UgMTpcbiAgICAgICAgcmV0dXJuIHRmYy5zbGljZTFkKGFycmF5IGFzIFRlbnNvcjFELCBzdGFydCwgc2l6ZSk7XG4gICAgICBjYXNlIDI6XG4gICAgICAgIHJldHVybiB0ZmMuc2xpY2UyZChcbiAgICAgICAgICAgIGFycmF5IGFzIFRlbnNvcjJELCBbc3RhcnQsIDBdLCBbc2l6ZSwgYXJyYXkuc2hhcGVbMV1dKTtcbiAgICAgIGNhc2UgMzpcbiAgICAgICAgcmV0dXJuIHRmYy5zbGljZTNkKFxuICAgICAgICAgICAgYXJyYXkgYXMgVGVuc29yM0QsIFtzdGFydCwgMCwgMF0sXG4gICAgICAgICAgICBbc2l6ZSwgYXJyYXkuc2hhcGVbMV0sIGFycmF5LnNoYXBlWzJdXSk7XG4gICAgICBjYXNlIDQ6XG4gICAgICAgIHJldHVybiB0ZmMuc2xpY2U0ZChcbiAgICAgICAgICAgIGFycmF5IGFzIFRlbnNvcjRELCBbc3RhcnQsIDAsIDAsIDBdLFxuICAgICAgICAgICAgW3NpemUsIGFycmF5LnNoYXBlWzFdLCBhcnJheS5zaGFwZVsyXSwgYXJyYXkuc2hhcGVbM11dKTtcbiAgICAgIGNhc2UgNTpcbiAgICAgICAgcmV0dXJuIHRmYy5zbGljZShhcnJheSBhcyBUZW5zb3I1RCwgW3N0YXJ0LCAwLCAwLCAwLCAwXSwgW1xuICAgICAgICAgIHNpemUsIGFycmF5LnNoYXBlWzFdLCBhcnJheS5zaGFwZVsyXSwgYXJyYXkuc2hhcGVbM10sIGFycmF5LnNoYXBlWzRdXG4gICAgICAgIF0pO1xuICAgICAgY2FzZSA2OlxuICAgICAgICByZXR1cm4gdGZjLnNsaWNlKGFycmF5LCBbc3RhcnQsIDAsIDAsIDAsIDAsIDBdLCBbXG4gICAgICAgICAgc2l6ZSwgYXJyYXkuc2hhcGVbMV0sIGFycmF5LnNoYXBlWzJdLCBhcnJheS5zaGFwZVszXSwgYXJyYXkuc2hhcGVbNF0sXG4gICAgICAgICAgYXJyYXkuc2hhcGVbNV1cbiAgICAgICAgXSk7XG4gICAgICBkZWZhdWx0OlxuICAgICAgICB0aHJvdyBuZXcgVmFsdWVFcnJvcihcbiAgICAgICAgICAgIGBzbGljZUFsb25nRmlyc3RBeGlzKCkgcmVjZWl2ZWQgYW4gdW5zdXBwb3J0ZWQgdGVuc29yIHJhbms6IGAgK1xuICAgICAgICAgICAgYCR7YXJyYXkucmFua31gKTtcbiAgICB9XG4gIH0pO1xufVxuXG4vKipcbiAqIERvIHNsaWNpbmcgYWxvbmcgdGhlIGxhc3QgYXhpcy5cbiAqIEBwYXJhbSBhcnJheSBpbnB1dCBgdGYuVGVuc29yYC5cbiAqIEBwYXJhbSBzdGFydCBzdGFydGluZyBpbmRleCwgaW5jbHVzaXZlLlxuICogQHBhcmFtIHNpemUgc2l6ZSBvZiB0aGUgc2xpY2UgYWxvbmcgdGhlIGxhc3QgYXhpcy5cbiAqIEByZXR1cm5zIHJlc3VsdCBvZiB0aGUgc2xpY2luZy5cbiAqIEB0aHJvd3MgVmFsdWVFcnJvcjogSWYgYGFycmF5YCBpcyBvZiBhbiB1bnN1cHBvcnRlZCBzdWJ0eXBlIG9mIGB0Zi5UZW5zb3JgLlxuICovXG5leHBvcnQgZnVuY3Rpb24gc2xpY2VBbG9uZ0xhc3RBeGlzKFxuICAgIGFycmF5OiBUZW5zb3IsIHN0YXJ0OiBudW1iZXIsIHNpemU6IG51bWJlcik6IFRlbnNvciB7XG4gIHJldHVybiB0aWR5KCgpID0+IHtcbiAgICBzd2l0Y2ggKGFycmF5LnJhbmspIHtcbiAgICAgIGNhc2UgMTpcbiAgICAgICAgcmV0dXJuIHRmYy5zbGljZTFkKGFycmF5IGFzIFRlbnNvcjFELCBzdGFydCwgc2l6ZSk7XG4gICAgICBjYXNlIDI6XG4gICAgICAgIHJldHVybiB0ZmMuc2xpY2UyZChcbiAgICAgICAgICAgIGFycmF5IGFzIFRlbnNvcjJELCBbMCwgc3RhcnRdLCBbYXJyYXkuc2hhcGVbMF0sIHNpemVdKTtcbiAgICAgIGNhc2UgMzpcbiAgICAgICAgcmV0dXJuIHRmYy5zbGljZTNkKFxuICAgICAgICAgICAgYXJyYXkgYXMgVGVuc29yM0QsIFswLCAwLCBzdGFydF0sXG4gICAgICAgICAgICBbYXJyYXkuc2hhcGVbMF0sIGFycmF5LnNoYXBlWzFdLCBzaXplXSk7XG4gICAgICBjYXNlIDQ6XG4gICAgICAgIHJldHVybiB0ZmMuc2xpY2U0ZChcbiAgICAgICAgICAgIGFycmF5IGFzIFRlbnNvcjRELCBbMCwgMCwgMCwgc3RhcnRdLFxuICAgICAgICAgICAgW2FycmF5LnNoYXBlWzBdLCBhcnJheS5zaGFwZVsxXSwgYXJyYXkuc2hhcGVbMl0sIHNpemVdKTtcbiAgICAgIGRlZmF1bHQ6XG4gICAgICAgIHRocm93IG5ldyBWYWx1ZUVycm9yKFxuICAgICAgICAgICAgYHNsaWNlQWxvbmdMYXN0QXhpcygpIHJlY2VpdmVkIGFuIHVuc3VwcG9ydGVkIHRlbnNvciByYW5rOiBgICtcbiAgICAgICAgICAgIGAke2FycmF5LnJhbmt9YCk7XG4gICAgfVxuICB9KTtcbn1cblxuLyoqXG4gKiBEbyBzbGljaW5nIGFsb25nIHRoZSBzZXBjaWZpZWQgYXhpcy5cbiAqIEBwYXJhbSBhcnJheSBpbnB1dCBgdGYuVGVuc29yYC5cbiAqIEBwYXJhbSBzdGFydCBzdGFydGluZyBpbmRleCwgaW5jbHVzaXZlLlxuICogQHBhcmFtIHNpemUgb2YgdGhlIHNsaWNlIGFsb25nIHRoZSBjaG9zZW4gYXhpcy5cbiAqIEBwYXJhbSBjaG9vc2UgYW4gYXhpcy5cbiAqIEByZXR1cm5zIHJlc3VsdCBvZiB0aGUgc2xpY2luZy5cbiAqIEB0aHJvd3MgVmFsdWVFcnJvcjogSWYgYGFycmF5YCBpcyBvZiBhbiB1bnN1cHBvcnRlZCBzdWJ0eXBlIG9mIGB0Zi5UZW5zb3JgLlxuICovXG5leHBvcnQgZnVuY3Rpb24gc2xpY2VBbG9uZ0F4aXMoXG4gICAgYXJyYXk6IFRlbnNvciwgc3RhcnQ6IG51bWJlciwgc2l6ZTogbnVtYmVyLCBheGlzOiBudW1iZXIpOiBUZW5zb3Ige1xuICByZXR1cm4gdGlkeSgoKSA9PiB7XG4gICAgc3dpdGNoIChhcnJheS5yYW5rKSB7XG4gICAgICBjYXNlIDE6XG4gICAgICAgIHJldHVybiB0ZmMuc2xpY2UxZChhcnJheSBhcyBUZW5zb3IxRCwgc3RhcnQsIHNpemUpO1xuICAgICAgY2FzZSAyOlxuICAgICAgICBzd2l0Y2ggKGF4aXMpIHtcbiAgICAgICAgICBjYXNlIDE6XG4gICAgICAgICAgICByZXR1cm4gc2xpY2VBbG9uZ0ZpcnN0QXhpcyhhcnJheSwgc3RhcnQsIHNpemUpO1xuICAgICAgICAgIGNhc2UgMjpcbiAgICAgICAgICAgIHJldHVybiBzbGljZUFsb25nTGFzdEF4aXMoYXJyYXksIHN0YXJ0LCBzaXplKTtcbiAgICAgICAgICBkZWZhdWx0OlxuICAgICAgICAgICAgdGhyb3cgbmV3IFZhbHVlRXJyb3IoXG4gICAgICAgICAgICAgICAgYFRoZSBheGlzIGlzIG5vdCB3aXRoaW4gdGhlIHJhbmsgb2YgdGhlIHRlbnNvciBgICtcbiAgICAgICAgICAgICAgICBgJHtheGlzfWApO1xuICAgICAgICB9XG4gICAgICBjYXNlIDM6XG4gICAgICAgIHN3aXRjaCAoYXhpcykge1xuICAgICAgICAgIGNhc2UgMTpcbiAgICAgICAgICAgIHJldHVybiBzbGljZUFsb25nRmlyc3RBeGlzKGFycmF5LCBzdGFydCwgc2l6ZSk7XG4gICAgICAgICAgY2FzZSAyOlxuICAgICAgICAgICAgcmV0dXJuIHRmYy5zbGljZTNkKFxuICAgICAgICAgICAgICAgIGFycmF5IGFzIFRlbnNvcjNELCBbMCwgc3RhcnQsIDBdLFxuICAgICAgICAgICAgICAgIFthcnJheS5zaGFwZVswXSwgc2l6ZSwgYXJyYXkuc2hhcGVbMl1dKTtcbiAgICAgICAgICBjYXNlIDM6XG4gICAgICAgICAgICByZXR1cm4gc2xpY2VBbG9uZ0xhc3RBeGlzKGFycmF5LCBzdGFydCwgc2l6ZSk7XG4gICAgICAgICAgZGVmYXVsdDpcbiAgICAgICAgICAgIHRocm93IG5ldyBWYWx1ZUVycm9yKFxuICAgICAgICAgICAgICAgIGBUaGUgYXhpcyBpcyBub3Qgd2l0aGluIHRoZSByYW5rIG9mIHRoZSB0ZW5zb3IgYCArXG4gICAgICAgICAgICAgICAgYCR7YXhpc31gKTtcbiAgICAgICAgfVxuICAgICAgY2FzZSA0OlxuICAgICAgICBzd2l0Y2ggKGF4aXMpIHtcbiAgICAgICAgICBjYXNlIDE6XG4gICAgICAgICAgICByZXR1cm4gc2xpY2VBbG9uZ0ZpcnN0QXhpcyhhcnJheSwgc3RhcnQsIHNpemUpO1xuICAgICAgICAgIGNhc2UgMjpcbiAgICAgICAgICAgIHJldHVybiB0ZmMuc2xpY2U0ZChcbiAgICAgICAgICAgICAgICBhcnJheSBhcyBUZW5zb3I0RCwgWzAsIHN0YXJ0LCAwLCAwXSxcbiAgICAgICAgICAgICAgICBbYXJyYXkuc2hhcGVbMF0sIHNpemUsIGFycmF5LnNoYXBlWzJdLCBhcnJheS5zaGFwZVszXV0pO1xuICAgICAgICAgIGNhc2UgMzpcbiAgICAgICAgICAgIHJldHVybiB0ZmMuc2xpY2U0ZChcbiAgICAgICAgICAgICAgICBhcnJheSBhcyBUZW5zb3I0RCwgWzAsIDAsIHN0YXJ0LCAwXSxcbiAgICAgICAgICAgICAgICBbYXJyYXkuc2hhcGVbMF0sIGFycmF5LnNoYXBlWzFdLCBzaXplLCBhcnJheS5zaGFwZVszXV0pO1xuICAgICAgICAgIGNhc2UgNDpcbiAgICAgICAgICAgIHJldHVybiBzbGljZUFsb25nTGFzdEF4aXMoYXJyYXksIHN0YXJ0LCBzaXplKTtcbiAgICAgICAgICBkZWZhdWx0OlxuICAgICAgICAgICAgdGhyb3cgbmV3IFZhbHVlRXJyb3IoXG4gICAgICAgICAgICAgICAgYFRoZSBheGlzIGlzIG5vdCB3aXRoaW4gdGhlIHJhbmsgb2YgdGhlIHRlbnNvciBgICtcbiAgICAgICAgICAgICAgICBgJHtheGlzfWApO1xuICAgICAgICB9XG4gICAgICBkZWZhdWx0OlxuICAgICAgICB0aHJvdyBuZXcgVmFsdWVFcnJvcihcbiAgICAgICAgICAgIGBzbGljZUFsb25nTGFzdEF4aXMoKSByZWNlaXZlZCBhbiB1bnN1cHBvcnRlZCB0ZW5zb3IgcmFuazogYCArXG4gICAgICAgICAgICBgJHthcnJheS5yYW5rfWApO1xuICAgIH1cbiAgfSk7XG59XG5cbi8qKlxuICogQ29uY2F0ZW5hdGVzIGEgbGlzdCBvZiB0ZW5zb3JzIGFsb25nc2lkZSB0aGUgc3BlY2lmaWVkIGF4aXMuXG4gKiBAcGFyYW0gdGVuc29ycyBgQXJyYXlgIG9mIHRlbnNvcnMgdG8gY29uY2F0ZW5hdGUuXG4gKiBAcGFyYW0gYXhpcyBDb25jYXRlbmF0aW9uIGF4aXMuXG4gKiBAcmV0dXJucyBUaGUgcmVzdWx0IG9mIHRoZSBjb25jYXRlbmF0aW9uLlxuICovXG5leHBvcnQgZnVuY3Rpb24gY29uY2F0ZW5hdGUodGVuc29yczogVGVuc29yW10sIGF4aXMgPSAtMSk6IFRlbnNvciB7XG4gIGxldCByYW5rOiBudW1iZXI7XG4gIGlmIChheGlzIDwgMCkge1xuICAgIHJhbmsgPSB0ZW5zb3JzWzBdLnJhbms7XG4gICAgaWYgKHJhbmsgIT09IDApIHtcbiAgICAgIGF4aXMgPSByYW5rO1xuICAgIH0gZWxzZSB7XG4gICAgICBheGlzID0gMDtcbiAgICB9XG4gIH1cbiAgaWYgKGF4aXMgPT09IHRlbnNvcnNbMF0ucmFuaykge1xuICAgIC8vIFBvcnRpbmcgTm90ZTogVGhpcyBpcyBuZWNlc3NhcnkgYmVjYXVzZSB0ZmMuY29uY2F0KCkgcmVxdWlyZXMgYXhpcyB0byBiZVxuICAgIC8vICAgaW4gdGhlIGludGVydmFsIFstcmFuaywgcmFuaykuXG4gICAgYXhpcyA9IC0xO1xuICB9XG4gIC8vIFBvcnRpbmcgTm90ZTogU3BhcnNlIGNvbmNhdCBpcyBub3Qgc3VwcG9ydGVkIHlldC5cbiAgcmV0dXJuIHRmYy5jb25jYXQodGVuc29ycywgYXhpcyk7XG59XG5cbi8qKlxuICogQ29uY2F0ZW5hdGUgdHdvIGFycmF5cyBhbG9uZyB0aGUgZmlyc3QgZGltZW5zaW9uLlxuICogQHBhcmFtIGEgVGhlIDFzdCBgdGYuVGVuc29yYCB0byBjb25jYXRlbmF0ZS5cbiAqIEBwYXJhbSBiIFRoZSAybmQgYHRmLlRlbnNvcmAgdG8gY29uY2F0ZW5hdGUuXG4gKiBAcmV0dXJucyBSZXN1bHQgb2YgdGhlIGNvbmNhdGVuYXRpb24uXG4gKiBAdGhyb3dzIFZhbHVlRXJyb3I6IElmIGBhYCBpcyBvZiBhbiB1bnN1cHBvcnRlZCBzdWJ0eXBlIG9mIGB0Zi5UZW5zb3JgLlxuICovXG5leHBvcnQgZnVuY3Rpb24gY29uY2F0QWxvbmdGaXJzdEF4aXMoYTogVGVuc29yLCBiOiBUZW5zb3IpOiBUZW5zb3Ige1xuICBzd2l0Y2ggKGEucmFuaykge1xuICAgIGNhc2UgMTpcbiAgICAgIHJldHVybiB0ZmMuY29uY2F0MWQoW2EgYXMgVGVuc29yMUQsIGIgYXMgVGVuc29yMURdKTtcbiAgICBjYXNlIDI6XG4gICAgICByZXR1cm4gdGZjLmNvbmNhdDJkKFthIGFzIFRlbnNvcjJELCBiIGFzIFRlbnNvcjJEXSwgMCk7XG4gICAgY2FzZSAzOlxuICAgICAgcmV0dXJuIHRmYy5jb25jYXQzZChbYSBhcyBUZW5zb3IzRCwgYiBhcyBUZW5zb3IzRF0sIDApO1xuICAgIGNhc2UgNDpcbiAgICAgIHJldHVybiB0ZmMuY29uY2F0NGQoW2EgYXMgVGVuc29yNEQsIGIgYXMgVGVuc29yNERdLCAwKTtcbiAgICBkZWZhdWx0OlxuICAgICAgdGhyb3cgbmV3IFZhbHVlRXJyb3IoXG4gICAgICAgICAgYGNvbmNhdEFsb25nRmlyc3RBeGlzKCkgcmVjZWl2ZWQgYW4gdW5zdXBwb3J0ZWQgYCArXG4gICAgICAgICAgYHRlbnNvciByYW5rOiAke2EucmFua31gKTtcbiAgfVxufVxuXG4vKipcbiAqIENyZWF0ZXMgYSB0ZW5zb3IgYnkgdGlsaW5nIGB4YCBieSBgbmAuXG4gKiBAcGFyYW0geCBBIHRlbnNvci5cbiAqIEBwYXJhbSBuIEFuIEFycmF5IG9mIGludGVnZXJzIG9yIGEgc2luZ2xlIGludGVnZXIuIElmIGFuIEFycmF5LCB0aGUgbGVuZ3RoXG4gKiAgIG11c3QgYmUgdGhlIHNhbWUgYXMgdGhlIG51bWJlciBvZiBkaW1lbnNpb25zIGluIGB4YC4gSWYgYSBzaW5nbGUgaW50ZWdlcixcbiAqICAgaXQgd2lsbCBiZSB0cmVhdGVkIGFzIGFuIEFycmF5IG9mIGxlbmd0aCAxLlxuICovXG5leHBvcnQgZnVuY3Rpb24gdGlsZSh4OiBUZW5zb3IsIG46IG51bWJlcnxudW1iZXJbXSk6IFRlbnNvciB7XG4gIGlmICghQXJyYXkuaXNBcnJheShuKSkge1xuICAgIG4gPSBbbl07XG4gIH1cbiAgaWYgKHgucmFuayAhPT0gbi5sZW5ndGgpIHtcbiAgICB0aHJvdyBuZXcgVmFsdWVFcnJvcihcbiAgICAgICAgYFRoZSBsZW5ndGggb2YgaW5wdXQgbiAoJHtuLmxlbmd0aH0pIGRvZXMgbm90IG1hdGNoIGAgK1xuICAgICAgICBgdGhlIG51bWJlciBvZiBkaW1lbnNpb25zIGluIGlucHV0IHggKCR7eC5yYW5rfSlgKTtcbiAgfVxuICByZXR1cm4gdGZjLnRpbGUoeCwgbik7XG59XG5cbi8qIENyZWF0aW9uIG9mIHJhbmRvbSB0ZW5zb3JzLiAqL1xuXG4vKipcbiAqIEdldCBhIHRlbnNvciB3aXRoIG5vcm1hbCBkaXN0cmlidXRpb24gb2YgdmFsdWVzLlxuICpcbiAqIEBwYXJhbSBzaGFwZSBTaGFwZSBvZiB0aGUgdGVuc29yLlxuICogQHBhcmFtIG1lYW4gbWVhbiB2YWx1ZSBvZiB0aGUgbm9ybWFsIGRpc3RyaWJ1dGlvbi5cbiAqIEBwYXJhbSBzdGRkZXYgc3RhbmRhcmQgZGV2aWF0aW9uIG9mIHRoZSBub3JtYWwgZGlzdHJpYnV0aW9uLlxuICogQHBhcmFtIGR0eXBlXG4gKiBAcGFyYW0gc2VlZFxuICogQHJldHVybiBUaGUgbm9ybWFsIHRlbnNvci5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHJhbmRvbU5vcm1hbChcbiAgICBzaGFwZTogU2hhcGUsIG1lYW4gPSAwLjAsIHN0ZGRldiA9IDEuMCwgZHR5cGU/OiAnZmxvYXQzMid8J2ludDMyJyxcbiAgICBzZWVkPzogbnVtYmVyKTogVGVuc29yIHtcbiAgcmV0dXJuIHRmYy5yYW5kb21Ob3JtYWwoc2hhcGUsIG1lYW4sIHN0ZGRldiwgZHR5cGUsIHNlZWQpO1xufVxuXG4vKiBMaW5lYXIgQWxnZWJyYSAqL1xuXG4vKipcbiAqIE11bHRpcGx5IHR3byB0ZW5zb3JzIGFuZCByZXR1cm5zIHRoZSByZXN1bHQgYXMgYSB0ZW5zb3IuXG4gKlxuICogRm9yIDJEIHRlbnNvcnMsIHRoaXMgaXMgZXF1aXZhbGVudCB0byBtYXRyaXggbXVsdGlwbGljYXRpb24gKG1hdE11bCkuXG4gKiBGb3IgdGVuc29ycyBvZiBoaWdoZXIgcmFua3MsIGl0IGZvbGxvd3MgdGhlIFRoZWFubyBiZWhhdmlvcixcbiAqIChlLmcuIGAoMiwgMykgKiAoNCwgMywgNSkgLT4gKDIsIDQsIDUpYCkuICBGcm9tIHRoZSBUaGVhbm8gZG9jdW1lbnRhdGlvbjpcbiAqXG4gKiBGb3IgTiBkaW1lbnNpb25zIGl0IGlzIGEgc3VtIHByb2R1Y3Qgb3ZlciB0aGUgbGFzdCBheGlzIG9mIHggYW5kIHRoZVxuICogc2Vjb25kLXRvLWxhc3Qgb2YgeTpcbiAqXG4gKiBAcGFyYW0gYSBBIHRlbnNvciBvZiBhdCBsZWFzdCByYW5rIDIuXG4gKiBAcGFyYW0gYiBBIHRlbnNvciBvZiBhdCBsZWFzdCByYW5rIDIuXG4gKiBAcGFyYW0gYWN0aXZhdGlvbiAob3B0aW9uYWwpIEEgc3RyaW5nIGlkZW50aWZ5aW5nIHRoZSBhY3RpdmF0aW9uXG4gKiAgIGZ1bmN0aW9uLlxuICogQHJldHVybiBSZXN1bHQgb2YgdGhlIGRvdCBvcGVyYXRpb24uXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBkb3QoXG4gICAgYTogVGVuc29yLCBiOiBUZW5zb3IsIGFjdGl2YXRpb24/OiB0ZmMuZnVzZWQuQWN0aXZhdGlvbixcbiAgICBiaWFzPzogVGVuc29yKTogVGVuc29yIHtcbiAgaWYgKChhLnJhbmsgPCAyKSB8fCAoYi5yYW5rIDwgMikpIHtcbiAgICB0aHJvdyBuZXcgTm90SW1wbGVtZW50ZWRFcnJvcihcbiAgICAgICAgYGRvdCByZXF1aXJlcyBib3RoIGlucHV0cyB0byBiZSByYW5rID49IDJgICtcbiAgICAgICAgYCBidXQgZ290IHggc2hhcGUgPSAke2Euc2hhcGV9IGFuZCB5IHNoYXBlID0gJHtiLnNoYXBlfWApO1xuICB9XG4gIGlmIChiLnJhbmsgPj0gMykge1xuICAgIGNvbnN0IHhMYXN0RGltID0gYS5zaGFwZS5zbGljZSgtMSlbMF07XG4gICAgY29uc3QgeVNlY29uZExhc3REaW0gPSBiLnNoYXBlLnNsaWNlKC0yKVswXTtcbiAgICBpZiAoeExhc3REaW0gIT09IHlTZWNvbmRMYXN0RGltKSB7XG4gICAgICB0aHJvdyBuZXcgTm90SW1wbGVtZW50ZWRFcnJvcihcbiAgICAgICAgICBgSWYgcmFuayB5ID49IDMsIHRoZW4gdGhlIHNlY29uZCBsYXN0IGRpbWAgK1xuICAgICAgICAgIGAgb2YgeSBtdXN0IGVxdWFsIHRoZSBsYXN0IGRpbSBvZiB4IGJ1dCBnb3QgeCBzaGFwZSA9ICR7XG4gICAgICAgICAgICAgIGEuc2hhcGV9IGFuZCBgICtcbiAgICAgICAgICBgIHkgc2hhcGUgPSAke2Iuc2hhcGV9YCk7XG4gICAgfVxuICB9XG4gIC8vIEhhbmRsZSBiYXNpYyAyRCB4IDJEIGNhc2UuXG4gIGlmICgoYS5yYW5rID09PSAyKSAmJiAoYi5yYW5rID09PSAyKSkge1xuICAgIGNvbnN0IHRyYW5zcG9zZUEgPSBmYWxzZTtcbiAgICBjb25zdCB0cmFuc3Bvc2VCID0gZmFsc2U7XG4gICAgLy8gdGZjLmZ1c2VkLm1hdE11bCBvbmx5IGZ1c2VzIGNlcnRhaW4gYWN0aXZhdGlvbiBmdW5jdGlvbnMuIFVuc3VwcG9ydGVkXG4gICAgLy8gYWN0aXZhdGlvbiBmdW5jdGlvbnMgYXJlIHRyZWF0ZWQgYXMgJ2xpbmVhcicgYWN0aXZhdGlvbnMsIHdoaWNoIGlzXG4gICAgLy8gZXF1aXZhbGVudCB0byBhIG5vLW9wLlxuICAgIHJldHVybiB0ZmMuZnVzZWQubWF0TXVsKHtcbiAgICAgIGEsXG4gICAgICBiOiBiIGFzIFRlbnNvcjJELFxuICAgICAgdHJhbnNwb3NlQSxcbiAgICAgIHRyYW5zcG9zZUIsXG4gICAgICBiaWFzOiBiaWFzID8gcmVzaGFwZUJpYXMoYS5yYW5rLCBiaWFzLCBpbWFnZURhdGFGb3JtYXQoKSkgOiBudWxsLFxuICAgICAgYWN0aXZhdGlvblxuICAgIH0pO1xuICB9IGVsc2Uge1xuICAgIC8vIFJlc2hhcGUgeCBpbnRvIHRoZSBhbmFsb2dvdXMgMkQgVGVuc29yLlxuICAgIGNvbnN0IGFGaXJzdERpbXMgPSBhLnNoYXBlLnNsaWNlKCk7ICAvLyBIb2xkcyBhbGwgYnV0IHRoZSBsYXN0IGRpbSBvZiB4LlxuICAgIGNvbnN0IGFMYXN0RGltID0gYUZpcnN0RGltcy5wb3AoKTtcbiAgICBhID0gdGZjLnJlc2hhcGUoYSwgWy0xLCBhTGFzdERpbV0pO1xuXG4gICAgLy8gUmVzaGFwZSB5IGludG8gdGhlIGFuYWxvZ291cyAyRCBUZW5zb3IsIGFuZCBrZWVwIHRyYWNrIG9mIHRoZVxuICAgIC8vIHJlcXVpcmVkIGRpbWVuc2lvbnMgdG8gcmVwcm9kdWNlIHRoZSBvdXRwdXQgc2hhcGUuXG4gICAgY29uc3QgYlNoYXBlID0gYi5zaGFwZS5zbGljZSgpO1xuICAgIGNvbnN0IGJMYXN0RGltID0gYlNoYXBlLnBvcCgpO1xuICAgIGNvbnN0IHlTZWNvbmRMYXN0RGltID0gYlNoYXBlLnBvcCgpO1xuICAgIGNvbnN0IHlPdGhlckRpbXMgPSBbLi4uYlNoYXBlLCBiTGFzdERpbV07XG4gICAgLy8gcGVybXV0YXRpb24gc2hvdWxkIGJlIGxpa2UgW3ItMiwgMCwgMSwgMiwgLi4uIHItNCwgci0zLCByLTFdXG4gICAgLy8gd2hlcmUgciBpcyB0aGUgcmFuayBvZiB5LlxuICAgIGNvbnN0IHBlcm0gPSBBcnJheS5mcm9tKHtsZW5ndGg6IGIucmFua30sIChfLCBpKSA9PiB7XG4gICAgICBpZiAoaSA9PT0gMCkge1xuICAgICAgICByZXR1cm4gYi5yYW5rIC0gMjtcbiAgICAgIH0gZWxzZSBpZiAoaSA8PSBiLnJhbmsgLSAyKSB7XG4gICAgICAgIHJldHVybiBpIC0gMTtcbiAgICAgIH1cbiAgICAgIHJldHVybiBpO1xuICAgIH0pO1xuICAgIGIgPSB0ZmMucmVzaGFwZSh0ZmMudHJhbnNwb3NlKGIsIHBlcm0pLCBbeVNlY29uZExhc3REaW0sIC0xXSk7XG5cbiAgICAvLyBNdWx0aXBseSB4IGFuZCB5IGFzIDJEIFRlbnNvcnMsIGFuZCB0aGVuIHJlc2hhcGUgYmFjayB0byBvcmlnaW5hbC5cbiAgICBjb25zdCBvdXRwdXRTaGFwZSA9IFsuLi5hRmlyc3REaW1zLCAuLi55T3RoZXJEaW1zXTtcbiAgICBjb25zdCB0cmFuc3Bvc2VBID0gZmFsc2U7XG4gICAgY29uc3QgdHJhbnNwb3NlQiA9IGZhbHNlO1xuICAgIHJldHVybiB0ZmMucmVzaGFwZShcbiAgICAgICAgdGZjLmZ1c2VkLm1hdE11bCh7XG4gICAgICAgICAgYSxcbiAgICAgICAgICBiLFxuICAgICAgICAgIHRyYW5zcG9zZUEsXG4gICAgICAgICAgdHJhbnNwb3NlQixcbiAgICAgICAgICBiaWFzOiBiaWFzID8gcmVzaGFwZUJpYXMoYS5yYW5rLCBiaWFzLCBpbWFnZURhdGFGb3JtYXQoKSkgOiBudWxsLFxuICAgICAgICAgIGFjdGl2YXRpb25cbiAgICAgICAgfSksXG4gICAgICAgIG91dHB1dFNoYXBlKTtcbiAgfVxufVxuXG4vKipcbiAqIENvbXB1dGUgdGhlIHNpZ24gVGVuc29yIG9mIGFuIGlucHV0IFRlbnNvci5cbiAqXG4gKiBFbGVtZW50cyBvZiB0aGUgaW5wdXQgYHRmLlRlbnNvcmAgdGhhdCBhcmUgPT09IDAgYXJlIG1hcHBlZCB0byAwLlxuICogRWxlbWVudHMgb2YgdGhlIGlucHV0IGB0Zi5UZW5zb3JgIHRoYXQgYXJlID4gMCBhcmUgbWFwcGVkIHRvIDEuXG4gKiBFbGVtZW50cyBvZiB0aGUgaW5wdXQgYHRmLlRlbnNvcmAgdGhhdCBhcmUgPCAwIGFyZSBtYXBwZWQgdG8gLTEuXG4gKlxuICogQHBhcmFtIHggSW5wdXQgYHRmLlRlbnNvcmAuXG4gKiBAcmV0dXJuIFRoZSBzaWduIGB0Zi5UZW5zb3JgLlxuICovXG5leHBvcnQgZnVuY3Rpb24gc2lnbih4OiBUZW5zb3IpOiBUZW5zb3Ige1xuICAvLyBUT0RPKGNhaXMpOiBNb3ZlIHRvIHRoZSBjb3JlLlxuICByZXR1cm4gdGlkeSgoKSA9PiB7XG4gICAgY29uc3QgemVyb3NMaWtlWCA9IGNvcmVaZXJvc0xpa2UoeCk7XG4gICAgY29uc3Qgb25lc0xpa2VYID0gY29yZU9uZXNMaWtlKHgpO1xuICAgIHJldHVybiB3aGVyZShcbiAgICAgICAgdGZjLmVxdWFsKHgsIHplcm9zTGlrZVgpLCB6ZXJvc0xpa2VYLFxuICAgICAgICB3aGVyZShcbiAgICAgICAgICAgIHRmYy5ncmVhdGVyKHgsIGNvcmVaZXJvc0xpa2UoeCkpLCBvbmVzTGlrZVgsXG4gICAgICAgICAgICB0ZmMubXVsKC0xLCBvbmVzTGlrZVgpKSk7XG4gIH0pO1xufVxuXG4vKipcbiAqIENvbXB1dGVzIHRoZSBvbmUtaG90IHJlcHJlc2VudGF0aW9uIG9mIGFuIGludGVnZXIgdGVuc29yLlxuICogQHBhcmFtIGluZGljZXMgbkQgaW50ZWdlciB0ZW5zb3Igb2Ygc2hhcGVcbiAqICAgYChiYXRjaF9zaXplLCBkaW0xLCBkaW0yLCAuLi4gZGltKG4tMSkpYFxuICogQHBhcmFtIG51bUNsYXNzZXMgSW50ZWdlciwgbnVtYmVyIG9mIGNsYXNzZXMgdG8gY29uc2lkZXIuXG4gKiBAcmV0dXJucyAobiArIDEpRCBvbmUgaG90IHJlcHJlc2VudGF0aW9uIG9mIHRoZSBpbnB1dFxuICogICB3aXRoIHNoYXBlIGAoYmF0Y2hfc2l6ZSwgZGltMSwgZGltMiwgLi4uIGRpbShuLTEpLCBudW1fY2xhc3NlcylgXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBvbmVIb3QoaW5kaWNlczogVGVuc29yLCBudW1DbGFzc2VzOiBudW1iZXIpOiBUZW5zb3Ige1xuICByZXR1cm4gdGlkeSgoKSA9PiB7XG4gICAgaWYgKGluZGljZXMucmFuayAhPT0gMSkge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKFxuICAgICAgICAgICdPbmx5IDFEIG9uZS1ob3QgdGVuc29ycyBhcmUgc3VwcG9ydGVkIGluIHRoZSAnICtcbiAgICAgICAgICAnZGVlcGxlYXJuIGJhY2tlbmQsIGF0IHByZXNlbnQuJyk7XG4gICAgfVxuICAgIGluZGljZXMgPSB0ZmMuY2FzdChpbmRpY2VzLCAnaW50MzInKTtcbiAgICByZXR1cm4gdGZjLmNhc3QodGZjLm9uZUhvdChpbmRpY2VzIGFzIFRlbnNvcjFELCBudW1DbGFzc2VzKSwgJ2Zsb2F0MzInKTtcbiAgfSk7XG59XG5cbi8qIEVsZW1lbnRhcnkgbWF0aCBmdW5jdGlvbnMuICovXG5cbi8qKlxuICogUmV0cmlldmVzIHRoZSBlbGVtZW50cyBvZiBpbmRpY2VzIGBpbmRpY2VzYCBpbiB0aGUgdGVuc29yIGByZWZlcmVuY2VgLlxuICogQHBhcmFtIHJlZmVyZW5jZSBBIHRlbnNvci5cbiAqIEBwYXJhbSBpbmRpY2VzIEFuIGludGVnZXIgdGVuc29yIG9mIGluZGljZXMgb3IgYW4gYEFycmF5YCBvZiBpbnRlZ2Vycy5cbiAqIEBwYXJhbSBheGlzIEF4aXMgYWxvbmcgd2hpY2ggdG8gcGVyZm9ybSB0aGUgZ2F0aGVyIG9wZXJhdGlvbi5cbiAqIEByZXR1cm5zIFRoZSByZXN1bHQgb2YgdGhlIGdhdGhlcmluZyBhcyBhIHRlbnNvci5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGdhdGhlcihcbiAgICByZWZlcmVuY2U6IFRlbnNvciwgaW5kaWNlczogbnVtYmVyW118VGVuc29yMUQsIGF4aXM/OiBudW1iZXIpOiBUZW5zb3Ige1xuICByZXR1cm4gdGlkeSgoKSA9PiB7XG4gICAgaWYgKEFycmF5LmlzQXJyYXkoaW5kaWNlcykpIHtcbiAgICAgIGluZGljZXMgPSB0ZW5zb3IxZChpbmRpY2VzLCAnaW50MzInKTtcbiAgICB9IGVsc2Uge1xuICAgICAgaW5kaWNlcyA9IHRmYy5jYXN0KGluZGljZXMsICdpbnQzMicpO1xuICAgIH1cbiAgICByZXR1cm4gdGZjLmdhdGhlcihyZWZlcmVuY2UsIGluZGljZXMsIGF4aXMpO1xuICB9KTtcbn1cblxuLyoqXG4gKiBFbGVtZW50LXdpc2Ugc3F1YXJlLlxuICogQHBhcmFtIHggSW5wdXQgdGVuc29yLlxuICogQHJldHVybiBlbGVtZW50LXdpc2UgeF4yXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBzcXVhcmUoeDogVGVuc29yKTogVGVuc29yIHtcbiAgcmV0dXJuIHRmYy5tdWwoeCwgeCk7XG59XG5cbi8qKlxuICogRWxlbWVudC13aXNlIGV4cG9uZW50aWF0aW9uLlxuICpcbiAqIFBvcnRpbmcgTm90ZTogSW4gUHlLZXJhcywgYGFgICh0aGUgZXhwb25lbnQpIGlzIGEgUHl0aG9uIGludGVnZXIsIHdoaWNoXG4gKiAgIHRha2VzIGFkdmF0bmFnZSBvZiB0aGUgYmFja2VuZCdzIChlLmcuLCBUZW5zb3JGbG93J3MpIGF1dG9tYXRpY1xuICogY29udmVyc2lvbiB0byB0ZW5zb3IuIEhlcmUgd2UgYWxsb3cgYGFgIHRvIGJlIGVpdGhlciBhIG51bWJlciBvciBhIHRlbnNvci5cbiAqXG4gKiBAcGFyYW0geCBUaGUgYmFzZSB0ZW5zb3IuXG4gKiBAcGFyYW0gYSBUaGUgZXhwb25lbnQsIHRlbnNvciBvciBudW1iZXIuIElmIGEgbnVtYmVyLCBpdCBpcyByb3VuZGVkIHRvIHRoZVxuICogICBuZWFyZXN0IGludGVnZXIgYW5kIGNvbnZlcnRlZCB0byBhIHRlbnNvci5cbiAqIEByZXR1cm5zIEEgdGVuc29yIG9mIHRoZSBzYW1lIHNoYXBlIGFzIGB4YC5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHBvdyh4OiBUZW5zb3IsIGE6IFRlbnNvcnxudW1iZXIpOiBUZW5zb3Ige1xuICByZXR1cm4gdGlkeSgoKSA9PiB7XG4gICAgaWYgKHR5cGVvZiAoYSkgPT09ICdudW1iZXInKSB7XG4gICAgICBhID0gc2NhbGFyKE1hdGgucm91bmQoYSksICdpbnQzMicpO1xuICAgIH1cbiAgICBpZiAoYS5kdHlwZSAhPT0gJ2ludDMyJykge1xuICAgICAgdGhyb3cgbmV3IE5vdEltcGxlbWVudGVkRXJyb3IoXG4gICAgICAgICAgYE5vbi1pbnQzMiBkdHlwZSAoJHthLmR0eXBlfSkgaXMgbm90IHN1cHBvcnRlZCBieSBwb3coKSB5ZXRgKTtcbiAgICB9XG4gICAgcmV0dXJuIHRmYy5wb3coeCwgYSk7XG4gIH0pO1xufVxuXG4vKipcbiAqIFJlc2hhcGVzIGJpYXMgdGVuc29yIGFjY29yZGluZyB0byByYW5rIG9mIHguXG4gKi9cbmZ1bmN0aW9uIHJlc2hhcGVCaWFzKHhSYW5rOiBudW1iZXIsIGJpYXM6IFRlbnNvciwgZGF0YUZvcm1hdDogc3RyaW5nKSB7XG4gIGNvbnN0IGJpYXNTaGFwZSA9IGJpYXMuc2hhcGU7XG5cbiAgaWYgKGJpYXMucmFuayAhPT0gMSAmJiBiaWFzLnJhbmsgIT09IHhSYW5rKSB7XG4gICAgdGhyb3cgbmV3IFZhbHVlRXJyb3IoXG4gICAgICAgIGBVbmV4cGVjdGVkIGJpYXMgZGltZW5zaW9uczogJHtiaWFzLnJhbmt9YCArXG4gICAgICAgIGA7IGV4cGVjdGVkIGl0IHRvIGJlIDEgb3IgJHt4UmFua31gKTtcbiAgfVxuXG4gIGlmICh4UmFuayA9PT0gNSkge1xuICAgIGlmIChkYXRhRm9ybWF0ID09PSAnY2hhbm5lbHNGaXJzdCcpIHtcbiAgICAgIGlmIChiaWFzU2hhcGUubGVuZ3RoID09PSAxKSB7XG4gICAgICAgIHJldHVybiB0ZmMucmVzaGFwZShiaWFzLCBbMSwgYmlhc1NoYXBlWzBdLCAxLCAxLCAxXSk7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICByZXR1cm4gdGZjLnJlc2hhcGUoXG4gICAgICAgICAgICBiaWFzLCBbMSwgYmlhc1NoYXBlWzNdLCBiaWFzU2hhcGVbMF0sIGJpYXNTaGFwZVsxXSwgYmlhc1NoYXBlWzJdXSk7XG4gICAgICB9XG4gICAgfSBlbHNlIGlmIChkYXRhRm9ybWF0ID09PSAnY2hhbm5lbHNMYXN0Jykge1xuICAgICAgaWYgKGJpYXNTaGFwZS5sZW5ndGggPT09IDEpIHtcbiAgICAgICAgcmV0dXJuIHRmYy5yZXNoYXBlKGJpYXMsIFsxLCAxLCAxLCAxLCBiaWFzU2hhcGVbMF1dKTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHJldHVybiB0ZmMucmVzaGFwZShiaWFzLCBbMV0uY29uY2F0KGJpYXNTaGFwZSkpO1xuICAgICAgfVxuICAgIH1cbiAgfSBlbHNlIGlmICh4UmFuayA9PT0gNCkge1xuICAgIGlmIChkYXRhRm9ybWF0ID09PSAnY2hhbm5lbHNGaXJzdCcpIHtcbiAgICAgIGlmIChiaWFzU2hhcGUubGVuZ3RoID09PSAxKSB7XG4gICAgICAgIHJldHVybiB0ZmMucmVzaGFwZShiaWFzLCBbMSwgYmlhc1NoYXBlWzBdLCAxLCAxXSk7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICByZXR1cm4gdGZjLnJlc2hhcGUoYmlhcywgWzEsIGJpYXNTaGFwZVsyXSwgYmlhc1NoYXBlWzBdLCBiaWFzU2hhcGVbMV1dKTtcbiAgICAgIH1cbiAgICB9IGVsc2UgaWYgKGRhdGFGb3JtYXQgPT09ICdjaGFubmVsc0xhc3QnKSB7XG4gICAgICBpZiAoYmlhc1NoYXBlLmxlbmd0aCA9PT0gMSkge1xuICAgICAgICByZXR1cm4gdGZjLnJlc2hhcGUoYmlhcywgWzEsIDEsIDEsIGJpYXNTaGFwZVswXV0pO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgcmV0dXJuIHRmYy5yZXNoYXBlKGJpYXMsIFsxXS5jb25jYXQoYmlhc1NoYXBlKSk7XG4gICAgICB9XG4gICAgfVxuICB9IGVsc2UgaWYgKHhSYW5rID09PSAzKSB7XG4gICAgaWYgKGRhdGFGb3JtYXQgPT09ICdjaGFubmVsc0ZpcnN0Jykge1xuICAgICAgaWYgKGJpYXNTaGFwZS5sZW5ndGggPT09IDEpIHtcbiAgICAgICAgcmV0dXJuIHRmYy5yZXNoYXBlKGJpYXMsIFsxLCBiaWFzU2hhcGVbMF0sIDFdKTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHJldHVybiB0ZmMucmVzaGFwZShiaWFzLCBbMSwgYmlhc1NoYXBlWzFdLCBiaWFzU2hhcGVbMF1dKTtcbiAgICAgIH1cbiAgICB9IGVsc2UgaWYgKGRhdGFGb3JtYXQgPT09ICdjaGFubmVsc0xhc3QnKSB7XG4gICAgICBpZiAoYmlhc1NoYXBlLmxlbmd0aCA9PT0gMSkge1xuICAgICAgICByZXR1cm4gdGZjLnJlc2hhcGUoYmlhcywgWzEsIDEsIGJpYXNTaGFwZVswXV0pO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgcmV0dXJuIHRmYy5yZXNoYXBlKGJpYXMsIFsxXS5jb25jYXQoYmlhc1NoYXBlKSk7XG4gICAgICB9XG4gICAgfVxuICB9IGVsc2UgaWYgKHhSYW5rIDwgMykge1xuICAgIHJldHVybiBiaWFzO1xuICB9XG4gIHRocm93IG5ldyBWYWx1ZUVycm9yKGBVbnN1cHBvcnRlZCBpbnB1dCByYW5rIGJ5IGJpYXNBZGQ6ICR7Ymlhcy5yYW5rfWApO1xufVxuXG4vKiBOZXVyYWwtbmV0d29yayBvcGVyYXRpb25zLiAqL1xuXG4vKipcbiAqIEFkZCBhIGJpYXMgdG8gYSB0ZW5zb3IuXG4gKlxuICogQHBhcmFtIHggVGhlIHRlbnNvciB0byBhZGQgdGhlIGJpYXMgdG8uXG4gKiBAcGFyYW0gYmlhcyBUaGUgYmlhcyB0byBhZGQgdG8gYHhgLiBNdXN0IGJlIDFEIG9yIHRoZSBzYW1lIHJhbmsgYXMgYHhgLlxuICogQHJldHVybiBSZXN1bHQgb2YgdGhlIGJpYXMgYWRkaW5nLlxuICogQHRocm93cyBWYWx1ZUVycm9yOiBJZiB0aGUgcmFuayBvZiBgYmlhc2AgaXMgaW5jb3JyZWN0LlxuICovXG5leHBvcnQgZnVuY3Rpb24gYmlhc0FkZChcbiAgICB4OiBUZW5zb3IsIGJpYXM6IFRlbnNvciwgZGF0YUZvcm1hdD86IERhdGFGb3JtYXQpOiBUZW5zb3Ige1xuICByZXR1cm4gdGlkeSgoKSA9PiB7XG4gICAgaWYgKGRhdGFGb3JtYXQgPT0gbnVsbCkge1xuICAgICAgZGF0YUZvcm1hdCA9IGltYWdlRGF0YUZvcm1hdCgpO1xuICAgIH1cbiAgICBjaGVja0RhdGFGb3JtYXQoZGF0YUZvcm1hdCk7XG5cbiAgICByZXR1cm4gdGZjLmFkZCh4LCByZXNoYXBlQmlhcyh4LnJhbmssIGJpYXMsIGRhdGFGb3JtYXQpKTtcbiAgfSk7XG59XG5cbi8qKlxuICogRXhwb25lbnRpYWwgbGluZWFyIHVuaXQgKEVMVSkuXG4gKiBAcGFyYW0geCBBIHRlbnNvciBvciB2YXJpYWJsZSB0byBjb21wdXRlIHRoZSBhY3RpdmF0aW9uIGZ1bmN0aW9uIGZvci5cbiAqIEBwYXJhbSBhbHBoYTogQSBzY2FsYXIsIGEgc2NhbGluZyBmYWN0b3IgZm9yIHRoZSBuZWdhdGl2ZSBzZWN0aW9uLlxuICogQHJldHVybiBPdXRwdXQgb2YgdGhlIEVMVSBvcGVyYXRpb24uXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBlbHUoeDogVGVuc29yLCBhbHBoYSA9IDEpOiBUZW5zb3Ige1xuICAvLyBUT0RPKGNhaXMpOiBBZGQgc3VwcG9ydCBmb3IgYWxwaGEgdmFsdWVzIG90aGVyIHRoYW4gMS5cbiAgaWYgKGFscGhhICE9PSAxKSB7XG4gICAgdGhyb3cgbmV3IE5vdEltcGxlbWVudGVkRXJyb3IoXG4gICAgICAgIGBTdXBwb3J0IGZvciBhbHBoYSB2YWx1ZXMgb3RoZXIgdGhhbiAxICgke2FscGhhfSkgaXMgbm90IGltcGxlbWVudGVkIGAgK1xuICAgICAgICBgeWV0LmApO1xuICB9XG4gIHJldHVybiB0ZmMuZWx1KHgpO1xufVxuXG4vKipcbiAqIFNvZnRzaWduIG9mIGEgdGVuc29yLlxuICpcbiAqIERlZmluZWQgYXMgeCAvIChhYnMoeCkgKyAxKSwgZWxlbWVudC13aXNlLlxuICpcbiAqIEBwYXJhbSB4OiBJbnB1dC5cbiAqIEByZXR1cm5zIE91dHB1dC5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHNvZnRzaWduKHg6IFRlbnNvcik6IFRlbnNvciB7XG4gIHJldHVybiB0aWR5KCgpID0+IHRmYy5kaXYoeCwgdGZjLmFkZCh0ZmMuYWJzKHgpLCAxKSkpO1xufVxuXG4vKipcbiAqIFNldHMgZW50cmllcyBpbiBgeGAgdG8gemVybyBhdCByYW5kb20sIHdoaWxlIHNjYWxpbmcgdGhlIGVudGlyZSB0ZW5zb3IuXG4gKlxuICogQHBhcmFtIHggaW5wdXQgdGVuc29yLlxuICogQHBhcmFtIGxldmVsIGZyYWN0aW9uIG9mIHRoZSBlbnRyaWVzIGluIHRoZSB0ZW5zb3IgdGhhdCB3aWxsIGJlIHNldCB0byAwLlxuICogQHBhcmFtIG5vaXNlU2hhcGUgc2hhcGUgb2YgcmFuZG9tbHkgZ2VuZXJhdGVkIGtlZXAvZHJvcCBmbGFncywgbXVzdCBiZVxuICogICBicm9hZGNhc3RhYmxlIHRvIHRoZSBzaGFwZSBvZiBgeGAuIE9wdGlvbmFsLlxuICogQHBhcmFtIHNlZWQgcmFuZG9tIHNlZWQgdG8gZW5zdXJlIGRldGVybWluaXNtLiBPcHRpb25hbC5cbiAqIEByZXR1cm5zIFJlc3VsdCBvZiB0aGUgZHJvcG91dCBvcGVyYXRpb24uXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBkcm9wb3V0KFxuICAgIHg6IFRlbnNvciwgbGV2ZWw6IG51bWJlciwgbm9pc2VTaGFwZT86IG51bWJlcltdLCBzZWVkPzogbnVtYmVyKTogVGVuc29yIHtcbiAgcmV0dXJuIHRpZHkoKCkgPT4gdGZjLmRyb3BvdXQoeCwgbGV2ZWwsIG5vaXNlU2hhcGUsIHNlZWQpKTtcbn1cblxuLyoqXG4gKiBFbGVtZW50LXdpc2UsIHNlZ21lbnQtd2lzZSBsaW5lYXIgYXBwcm94aW1hdGlvbiBvZiBzaWdtb2lkLlxuICpcbiAqIFJldHVybnMgYDAuYCBpZiBgeCA8IC0yLjVgLCBgMS5gIGlmIGB4ID4gMi41YC5cbiAqIEluIGAtMi41IDw9IHggPD0gMi41YCwgcmV0dXJucyBgMC4yICogeCArIDAuNWAuXG4gKlxuICogQHBhcmFtIHggSW5wdXQgdGVuc29yLlxuICogQHJldHVybnMgT3V0cHV0IHRlbnNvci5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGhhcmRTaWdtb2lkKHg6IFRlbnNvcik6IFRlbnNvciB7XG4gIHJldHVybiB0aWR5KCgpID0+IHtcbiAgICBjb25zdCB5ID0gdGZjLmFkZCguNSwgdGZjLm11bCguMiwgeCkpO1xuICAgIHJldHVybiB0ZmMuY2xpcEJ5VmFsdWUoeSwgMCwgMSk7XG4gIH0pO1xufVxuXG4vKipcbiAqIEludm9rZSBgeGAgaW4gdGhlIHRyYWluaW5nIHBoYXNlLCBhbmQgYGFsdGAgb3RoZXJ3aXNlLlxuICpcbiAqIFBvcnRpbmcgTm90ZTogV2UgZG8gbm90IGNyZWF0ZSBwbGFjZWhvbGRlciB0ZW5zb3JzIGZvciB0aGUgYHRyYWluaW5nYFxuICogYm9vbGVhbiBmbGFnIGhlcmUsIGJlY2F1c2UgdGhlcmUgaXMgbm8gc3VjaCB0aGluZyBpbiB0aGUgVEYuanMgaW1wZXJhdGl2ZVxuICogYmFja2VuZC5cbiAqXG4gKiBAcGFyYW0geCBUaGUgZnVuY3Rpb24gdG8gaW52b2tlIGlmZiBgdHJhaW5pbmdgIGlzIGB0cnVlYC5cbiAqIEBwYXJhbSBhbHQgVGhlIGZ1bmN0aW9uIHRvIGludm9rZSBpZmYgYHRyYWluaW5nYCBpcyBgZmFsc2VgLlxuICogQHBhcmFtIHRyYWluaW5nIEJvb2xlYW4gZmxhZyBmb3Igd2hldGhlciB0cmFpbmluZyBwaGFzZSBpcyBhY3RpdmUuXG4gKiBAcmV0dXJucyBUaGUgcmV0dXJuIHZhbHVlIG9mIGB4KClgIGlmIGB0cmFpbmluZ2AgaXMgYHRydWVgLCBvciB0aGUgcmV0dXJuXG4gKiAgIHZhbHVlIG9mIGBhbHQoKWAgaWYgYHRyYWluaW5nYCBpcyBgZmFsc2VgLlxuICovXG5leHBvcnQgZnVuY3Rpb24gaW5UcmFpblBoYXNlPFQ+KHg6ICgpID0+IFQsIGFsdDogKCkgPT4gVCwgdHJhaW5pbmcgPSBmYWxzZSk6IFQge1xuICByZXR1cm4gdHJhaW5pbmcgPyB4KCkgOiBhbHQoKTtcbn1cbiJdfQ==","/**\n * @license\n * Copyright 2018 Google LLC\n *\n * Use of this source code is governed by an MIT-style\n * license that can be found in the LICENSE file or at\n * https://opensource.org/licenses/MIT.\n * =============================================================================\n */\nexport const VALID_FAN_MODE_VALUES = ['fanIn', 'fanOut', 'fanAvg'];\nexport const VALID_DISTRIBUTION_VALUES = ['normal', 'uniform', 'truncatedNormal'];\n// We can't easily extract a string[] from the string union type, but we can\n// recapitulate the list, enforcing at compile time that the values are valid\n// and that we have the right number of them.\n/**\n * A string array of valid Initializer class names.\n *\n * This is guaranteed to match the `InitializerClassName` union type.\n */\nexport const initializerClassNames = [\n 'Zeros', 'Ones', 'Constant', 'RandomNormal', 'RandomUniform',\n 'TruncatedNormal', 'VarianceScaling', 'Orthogonal', 'Identity'\n];\n//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW5pdGlhbGl6ZXJfY29uZmlnLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vLi4vdGZqcy1sYXllcnMvc3JjL2tlcmFzX2Zvcm1hdC9pbml0aWFsaXplcl9jb25maWcudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUE7Ozs7Ozs7O0dBUUc7QUFRSCxNQUFNLENBQUMsTUFBTSxxQkFBcUIsR0FBRyxDQUFDLE9BQU8sRUFBRSxRQUFRLEVBQUUsUUFBUSxDQUFDLENBQUM7QUFPbkUsTUFBTSxDQUFDLE1BQU0seUJBQXlCLEdBQ2xDLENBQUMsUUFBUSxFQUFFLFNBQVMsRUFBRSxpQkFBaUIsQ0FBQyxDQUFDO0FBNEU3Qyw0RUFBNEU7QUFDNUUsNkVBQTZFO0FBQzdFLDZDQUE2QztBQUU3Qzs7OztHQUlHO0FBQ0gsTUFBTSxDQUFDLE1BQU0scUJBQXFCLEdBQTJCO0lBQzNELE9BQU8sRUFBRSxNQUFNLEVBQUUsVUFBVSxFQUFFLGNBQWMsRUFBRSxlQUFlO0lBQzVELGlCQUFpQixFQUFFLGlCQUFpQixFQUFFLFlBQVksRUFBRSxVQUFVO0NBQy9ELENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyIvKipcbiAqIEBsaWNlbnNlXG4gKiBDb3B5cmlnaHQgMjAxOCBHb29nbGUgTExDXG4gKlxuICogVXNlIG9mIHRoaXMgc291cmNlIGNvZGUgaXMgZ292ZXJuZWQgYnkgYW4gTUlULXN0eWxlXG4gKiBsaWNlbnNlIHRoYXQgY2FuIGJlIGZvdW5kIGluIHRoZSBMSUNFTlNFIGZpbGUgb3IgYXRcbiAqIGh0dHBzOi8vb3BlbnNvdXJjZS5vcmcvbGljZW5zZXMvTUlULlxuICogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbiAqL1xuXG5pbXBvcnQge0Jhc2VTZXJpYWxpemF0aW9ufSBmcm9tICcuL3R5cGVzJztcblxuLy8gVE9ETyhzb2VyZ2VsKTogTW92ZSB0aGUgQ2FtZWxDYXNlIHZlcnNpb25zIGJhY2sgb3V0IG9mIGtlcmFzX2Zvcm1hdFxuLy8gZS5nLiB0byBzcmMvY29tbW9uLnRzLiAgTWF5YmUgZXZlbiBkdXBsaWNhdGUgKmFsbCogb2YgdGhlc2UgdG8gYmUgcGVkYW50aWM/XG4vKiogQGRvY2lubGluZSAqL1xuZXhwb3J0IHR5cGUgRmFuTW9kZSA9ICdmYW5Jbid8J2Zhbk91dCd8J2ZhbkF2Zyc7XG5leHBvcnQgY29uc3QgVkFMSURfRkFOX01PREVfVkFMVUVTID0gWydmYW5JbicsICdmYW5PdXQnLCAnZmFuQXZnJ107XG5cbi8vIFRoZXNlIGNvbnN0YW50cyBoYXZlIGEgc25ha2UgdnMuIGNhbWVsIGRpc3RpbmN0aW9uLlxuZXhwb3J0IHR5cGUgRmFuTW9kZVNlcmlhbGl6YXRpb24gPSAnZmFuX2luJ3wnZmFuX291dCd8J2Zhbl9hdmcnO1xuXG4vKiogQGRvY2lubGluZSAqL1xuZXhwb3J0IHR5cGUgRGlzdHJpYnV0aW9uID0gJ25vcm1hbCd8J3VuaWZvcm0nfCd0cnVuY2F0ZWROb3JtYWwnO1xuZXhwb3J0IGNvbnN0IFZBTElEX0RJU1RSSUJVVElPTl9WQUxVRVMgPVxuICAgIFsnbm9ybWFsJywgJ3VuaWZvcm0nLCAndHJ1bmNhdGVkTm9ybWFsJ107XG4vLyBUaGVzZSBjb25zdGFudHMgaGF2ZSBhIHNuYWtlIHZzLiBjYW1lbCBkaXN0aW5jdGlvbi5cbmV4cG9ydCB0eXBlIERpc3RyaWJ1dGlvblNlcmlhbGl6YXRpb24gPSAnbm9ybWFsJ3wndW5pZm9ybSd8J3RydW5jYXRlZF9ub3JtYWwnO1xuXG5leHBvcnQgdHlwZSBaZXJvc1NlcmlhbGl6YXRpb24gPSBCYXNlU2VyaWFsaXphdGlvbjwnWmVyb3MnLCB7fT47XG5cbmV4cG9ydCB0eXBlIE9uZXNTZXJpYWxpemF0aW9uID0gQmFzZVNlcmlhbGl6YXRpb248J09uZXMnLCB7fT47XG5cbmV4cG9ydCB0eXBlIENvbnN0YW50Q29uZmlnID0ge1xuICB2YWx1ZTogbnVtYmVyO1xufTtcblxuZXhwb3J0IHR5cGUgQ29uc3RhbnRTZXJpYWxpemF0aW9uID1cbiAgICBCYXNlU2VyaWFsaXphdGlvbjwnQ29uc3RhbnQnLCBDb25zdGFudENvbmZpZz47XG5cbmV4cG9ydCB0eXBlIFJhbmRvbU5vcm1hbENvbmZpZyA9IHtcbiAgbWVhbj86IG51bWJlcjtcbiAgc3RkZGV2PzogbnVtYmVyO1xuICBzZWVkPzogbnVtYmVyO1xufTtcblxuZXhwb3J0IHR5cGUgUmFuZG9tTm9ybWFsU2VyaWFsaXphdGlvbiA9XG4gICAgQmFzZVNlcmlhbGl6YXRpb248J1JhbmRvbU5vcm1hbCcsIFJhbmRvbU5vcm1hbENvbmZpZz47XG5cbmV4cG9ydCB0eXBlIFJhbmRvbVVuaWZvcm1Db25maWcgPSB7XG4gIG1pbnZhbD86IG51bWJlcjtcbiAgbWF4dmFsPzogbnVtYmVyO1xuICBzZWVkPzogbnVtYmVyO1xufTtcblxuZXhwb3J0IHR5cGUgUmFuZG9tVW5pZm9ybVNlcmlhbGl6YXRpb24gPVxuICAgIEJhc2VTZXJpYWxpemF0aW9uPCdSYW5kb21Vbmlmb3JtJywgUmFuZG9tVW5pZm9ybUNvbmZpZz47XG5cbmV4cG9ydCB0eXBlIFRydW5jYXRlZE5vcm1hbENvbmZpZyA9IHtcbiAgbWVhbj86IG51bWJlcjtcbiAgc3RkZGV2PzogbnVtYmVyO1xuICBzZWVkPzogbnVtYmVyO1xufTtcblxuZXhwb3J0IHR5cGUgVHJ1bmNhdGVkTm9ybWFsU2VyaWFsaXphdGlvbiA9XG4gICAgQmFzZVNlcmlhbGl6YXRpb248J1RydW5jYXRlZE5vcm1hbCcsIFRydW5jYXRlZE5vcm1hbENvbmZpZz47XG5cbmV4cG9ydCB0eXBlIFZhcmlhbmNlU2NhbGluZ0NvbmZpZyA9IHtcbiAgc2NhbGU/OiBudW1iZXI7XG5cbiAgbW9kZT86IEZhbk1vZGVTZXJpYWxpemF0aW9uO1xuICBkaXN0cmlidXRpb24/OiBEaXN0cmlidXRpb25TZXJpYWxpemF0aW9uO1xuICBzZWVkPzogbnVtYmVyO1xufTtcblxuZXhwb3J0IHR5cGUgVmFyaWFuY2VTY2FsaW5nU2VyaWFsaXphdGlvbiA9XG4gICAgQmFzZVNlcmlhbGl6YXRpb248J1ZhcmlhbmNlU2NhbGluZycsIFZhcmlhbmNlU2NhbGluZ0NvbmZpZz47XG5cbmV4cG9ydCB0eXBlIE9ydGhvZ29uYWxDb25maWcgPSB7XG4gIHNlZWQ/OiBudW1iZXI7XG4gIGdhaW4/OiBudW1iZXI7XG59O1xuXG5leHBvcnQgdHlwZSBPcnRob2dvbmFsU2VyaWFsaXphdGlvbiA9XG4gICAgQmFzZVNlcmlhbGl6YXRpb248J09ydGhvZ29uYWwnLCBPcnRob2dvbmFsQ29uZmlnPjtcblxuZXhwb3J0IHR5cGUgSWRlbnRpdHlDb25maWcgPSB7XG4gIGdhaW4/OiBudW1iZXI7XG59O1xuXG5leHBvcnQgdHlwZSBJZGVudGl0eVNlcmlhbGl6YXRpb24gPVxuICAgIEJhc2VTZXJpYWxpemF0aW9uPCdJZGVudGl0eScsIElkZW50aXR5Q29uZmlnPjtcblxuLy8gVXBkYXRlIGluaXRpYWxpemVyQ2xhc3NOYW1lcyBiZWxvdyBpbiBjb25jZXJ0IHdpdGggdGhpcy5cbmV4cG9ydCB0eXBlIEluaXRpYWxpemVyU2VyaWFsaXphdGlvbiA9IFplcm9zU2VyaWFsaXphdGlvbnxPbmVzU2VyaWFsaXphdGlvbnxcbiAgICBDb25zdGFudFNlcmlhbGl6YXRpb258UmFuZG9tVW5pZm9ybVNlcmlhbGl6YXRpb258UmFuZG9tTm9ybWFsU2VyaWFsaXphdGlvbnxcbiAgICBUcnVuY2F0ZWROb3JtYWxTZXJpYWxpemF0aW9ufElkZW50aXR5U2VyaWFsaXphdGlvbnxcbiAgICBWYXJpYW5jZVNjYWxpbmdTZXJpYWxpemF0aW9ufE9ydGhvZ29uYWxTZXJpYWxpemF0aW9uO1xuXG5leHBvcnQgdHlwZSBJbml0aWFsaXplckNsYXNzTmFtZSA9IEluaXRpYWxpemVyU2VyaWFsaXphdGlvblsnY2xhc3NfbmFtZSddO1xuXG4vLyBXZSBjYW4ndCBlYXNpbHkgZXh0cmFjdCBhIHN0cmluZ1tdIGZyb20gdGhlIHN0cmluZyB1bmlvbiB0eXBlLCBidXQgd2UgY2FuXG4vLyByZWNhcGl0dWxhdGUgdGhlIGxpc3QsIGVuZm9yY2luZyBhdCBjb21waWxlIHRpbWUgdGhhdCB0aGUgdmFsdWVzIGFyZSB2YWxpZFxuLy8gYW5kIHRoYXQgd2UgaGF2ZSB0aGUgcmlnaHQgbnVtYmVyIG9mIHRoZW0uXG5cbi8qKlxuICogQSBzdHJpbmcgYXJyYXkgb2YgdmFsaWQgSW5pdGlhbGl6ZXIgY2xhc3MgbmFtZXMuXG4gKlxuICogVGhpcyBpcyBndWFyYW50ZWVkIHRvIG1hdGNoIHRoZSBgSW5pdGlhbGl6ZXJDbGFzc05hbWVgIHVuaW9uIHR5cGUuXG4gKi9cbmV4cG9ydCBjb25zdCBpbml0aWFsaXplckNsYXNzTmFtZXM6IEluaXRpYWxpemVyQ2xhc3NOYW1lW10gPSBbXG4gICdaZXJvcycsICdPbmVzJywgJ0NvbnN0YW50JywgJ1JhbmRvbU5vcm1hbCcsICdSYW5kb21Vbmlmb3JtJyxcbiAgJ1RydW5jYXRlZE5vcm1hbCcsICdWYXJpYW5jZVNjYWxpbmcnLCAnT3J0aG9nb25hbCcsICdJZGVudGl0eSdcbl07XG4iXX0=","/**\n * @license\n * Copyright 2018 Google LLC\n *\n * Use of this source code is governed by an MIT-style\n * license that can be found in the LICENSE file or at\n * https://opensource.org/licenses/MIT.\n * =============================================================================\n */\nimport { eye, linalg, mul, ones, randomUniform, scalar, serialization, tidy, transpose, truncatedNormal, zeros } from '@tensorflow/tfjs-core';\nimport * as K from './backend/tfjs_backend';\nimport { checkDataFormat } from './common';\nimport { NotImplementedError, ValueError } from './errors';\nimport { VALID_DISTRIBUTION_VALUES, VALID_FAN_MODE_VALUES } from './keras_format/initializer_config';\nimport { checkStringTypeUnionValue, deserializeKerasObject, serializeKerasObject } from './utils/generic_utils';\nimport { arrayProd } from './utils/math_utils';\nexport function checkFanMode(value) {\n checkStringTypeUnionValue(VALID_FAN_MODE_VALUES, 'FanMode', value);\n}\nexport function checkDistribution(value) {\n checkStringTypeUnionValue(VALID_DISTRIBUTION_VALUES, 'Distribution', value);\n}\n/**\n * Initializer base class.\n *\n * @doc {\n * heading: 'Initializers', subheading: 'Classes', namespace: 'initializers'}\n */\nexport class Initializer extends serialization.Serializable {\n fromConfigUsesCustomObjects() {\n return false;\n }\n getConfig() {\n return {};\n }\n}\nexport class Zeros extends Initializer {\n apply(shape, dtype) {\n return zeros(shape, dtype);\n }\n}\n/** @nocollapse */\nZeros.className = 'Zeros';\nserialization.registerClass(Zeros);\nexport class Ones extends Initializer {\n apply(shape, dtype) {\n return ones(shape, dtype);\n }\n}\n/** @nocollapse */\nOnes.className = 'Ones';\nserialization.registerClass(Ones);\nexport class Constant extends Initializer {\n constructor(args) {\n super();\n if (typeof args !== 'object') {\n throw new ValueError(`Expected argument of type ConstantConfig but got ${args}`);\n }\n if (args.value === undefined) {\n throw new ValueError(`config must have value set but got ${args}`);\n }\n this.value = args.value;\n }\n apply(shape, dtype) {\n return tidy(() => mul(scalar(this.value), ones(shape, dtype)));\n }\n getConfig() {\n return {\n value: this.value,\n };\n }\n}\n/** @nocollapse */\nConstant.className = 'Constant';\nserialization.registerClass(Constant);\nexport class RandomUniform extends Initializer {\n constructor(args) {\n super();\n this.DEFAULT_MINVAL = -0.05;\n this.DEFAULT_MAXVAL = 0.05;\n this.minval = args.minval || this.DEFAULT_MINVAL;\n this.maxval = args.maxval || this.DEFAULT_MAXVAL;\n this.seed = args.seed;\n }\n apply(shape, dtype) {\n return randomUniform(shape, this.minval, this.maxval, dtype);\n }\n getConfig() {\n return { minval: this.minval, maxval: this.maxval, seed: this.seed };\n }\n}\n/** @nocollapse */\nRandomUniform.className = 'RandomUniform';\nserialization.registerClass(RandomUniform);\nexport class RandomNormal extends Initializer {\n constructor(args) {\n super();\n this.DEFAULT_MEAN = 0.;\n this.DEFAULT_STDDEV = 0.05;\n this.mean = args.mean || this.DEFAULT_MEAN;\n this.stddev = args.stddev || this.DEFAULT_STDDEV;\n this.seed = args.seed;\n }\n apply(shape, dtype) {\n dtype = dtype || 'float32';\n if (dtype !== 'float32' && dtype !== 'int32') {\n throw new NotImplementedError(`randomNormal does not support dType ${dtype}.`);\n }\n return K.randomNormal(shape, this.mean, this.stddev, dtype, this.seed);\n }\n getConfig() {\n return { mean: this.mean, stddev: this.stddev, seed: this.seed };\n }\n}\n/** @nocollapse */\nRandomNormal.className = 'RandomNormal';\nserialization.registerClass(RandomNormal);\nexport class TruncatedNormal extends Initializer {\n constructor(args) {\n super();\n this.DEFAULT_MEAN = 0.;\n this.DEFAULT_STDDEV = 0.05;\n this.mean = args.mean || this.DEFAULT_MEAN;\n this.stddev = args.stddev || this.DEFAULT_STDDEV;\n this.seed = args.seed;\n }\n apply(shape, dtype) {\n dtype = dtype || 'float32';\n if (dtype !== 'float32' && dtype !== 'int32') {\n throw new NotImplementedError(`truncatedNormal does not support dType ${dtype}.`);\n }\n return truncatedNormal(shape, this.mean, this.stddev, dtype, this.seed);\n }\n getConfig() {\n return { mean: this.mean, stddev: this.stddev, seed: this.seed };\n }\n}\n/** @nocollapse */\nTruncatedNormal.className = 'TruncatedNormal';\nserialization.registerClass(TruncatedNormal);\nexport class Identity extends Initializer {\n constructor(args) {\n super();\n this.gain = args.gain != null ? args.gain : 1.0;\n }\n apply(shape, dtype) {\n return tidy(() => {\n if (shape.length !== 2 || shape[0] !== shape[1]) {\n throw new ValueError('Identity matrix initializer can only be used for' +\n ' 2D square matrices.');\n }\n else {\n return mul(this.gain, eye(shape[0]));\n }\n });\n }\n getConfig() {\n return { gain: this.gain };\n }\n}\n/** @nocollapse */\nIdentity.className = 'Identity';\nserialization.registerClass(Identity);\n/**\n * Computes the number of input and output units for a weight shape.\n * @param shape Shape of weight.\n * @param dataFormat data format to use for convolution kernels.\n * Note that all kernels in Keras are standardized on the\n * CHANNEL_LAST ordering (even when inputs are set to CHANNEL_FIRST).\n * @return An length-2 array: fanIn, fanOut.\n */\nfunction computeFans(shape, dataFormat = 'channelsLast') {\n let fanIn;\n let fanOut;\n checkDataFormat(dataFormat);\n if (shape.length === 2) {\n fanIn = shape[0];\n fanOut = shape[1];\n }\n else if ([3, 4, 5].indexOf(shape.length) !== -1) {\n if (dataFormat === 'channelsFirst') {\n const receptiveFieldSize = arrayProd(shape, 2);\n fanIn = shape[1] * receptiveFieldSize;\n fanOut = shape[0] * receptiveFieldSize;\n }\n else if (dataFormat === 'channelsLast') {\n const receptiveFieldSize = arrayProd(shape, 0, shape.length - 2);\n fanIn = shape[shape.length - 2] * receptiveFieldSize;\n fanOut = shape[shape.length - 1] * receptiveFieldSize;\n }\n }\n else {\n const shapeProd = arrayProd(shape);\n fanIn = Math.sqrt(shapeProd);\n fanOut = Math.sqrt(shapeProd);\n }\n return [fanIn, fanOut];\n}\nexport class VarianceScaling extends Initializer {\n /**\n * Constructor of VarianceScaling.\n * @throws ValueError for invalid value in scale.\n */\n constructor(args) {\n super();\n if (args.scale < 0.0) {\n throw new ValueError(`scale must be a positive float. Got: ${args.scale}`);\n }\n this.scale = args.scale == null ? 1.0 : args.scale;\n this.mode = args.mode == null ? 'fanIn' : args.mode;\n checkFanMode(this.mode);\n this.distribution =\n args.distribution == null ? 'normal' : args.distribution;\n checkDistribution(this.distribution);\n this.seed = args.seed;\n }\n apply(shape, dtype) {\n const fans = computeFans(shape);\n const fanIn = fans[0];\n const fanOut = fans[1];\n let scale = this.scale;\n if (this.mode === 'fanIn') {\n scale /= Math.max(1, fanIn);\n }\n else if (this.mode === 'fanOut') {\n scale /= Math.max(1, fanOut);\n }\n else {\n scale /= Math.max(1, (fanIn + fanOut) / 2);\n }\n if (this.distribution === 'normal') {\n const stddev = Math.sqrt(scale);\n dtype = dtype || 'float32';\n if (dtype !== 'float32' && dtype !== 'int32') {\n throw new NotImplementedError(`${this.getClassName()} does not support dType ${dtype}.`);\n }\n return truncatedNormal(shape, 0, stddev, dtype, this.seed);\n }\n else {\n const limit = Math.sqrt(3 * scale);\n return randomUniform(shape, -limit, limit, dtype);\n }\n }\n getConfig() {\n return {\n scale: this.scale,\n mode: this.mode,\n distribution: this.distribution,\n seed: this.seed\n };\n }\n}\n/** @nocollapse */\nVarianceScaling.className = 'VarianceScaling';\nserialization.registerClass(VarianceScaling);\nexport class GlorotUniform extends VarianceScaling {\n /**\n * Constructor of GlorotUniform\n * @param scale\n * @param mode\n * @param distribution\n * @param seed\n */\n constructor(args) {\n super({\n scale: 1.0,\n mode: 'fanAvg',\n distribution: 'uniform',\n seed: args == null ? null : args.seed\n });\n }\n getClassName() {\n // In Python Keras, GlorotUniform is not a class, but a helper method\n // that creates a VarianceScaling object. Use 'VarianceScaling' as\n // class name to be compatible with that.\n return VarianceScaling.className;\n }\n}\n/** @nocollapse */\nGlorotUniform.className = 'GlorotUniform';\nserialization.registerClass(GlorotUniform);\nexport class GlorotNormal extends VarianceScaling {\n /**\n * Constructor of GlorotNormal.\n * @param scale\n * @param mode\n * @param distribution\n * @param seed\n */\n constructor(args) {\n super({\n scale: 1.0,\n mode: 'fanAvg',\n distribution: 'normal',\n seed: args == null ? null : args.seed\n });\n }\n getClassName() {\n // In Python Keras, GlorotNormal is not a class, but a helper method\n // that creates a VarianceScaling object. Use 'VarianceScaling' as\n // class name to be compatible with that.\n return VarianceScaling.className;\n }\n}\n/** @nocollapse */\nGlorotNormal.className = 'GlorotNormal';\nserialization.registerClass(GlorotNormal);\nexport class HeNormal extends VarianceScaling {\n constructor(args) {\n super({\n scale: 2.0,\n mode: 'fanIn',\n distribution: 'normal',\n seed: args == null ? null : args.seed\n });\n }\n getClassName() {\n // In Python Keras, HeNormal is not a class, but a helper method\n // that creates a VarianceScaling object. Use 'VarianceScaling' as\n // class name to be compatible with that.\n return VarianceScaling.className;\n }\n}\n/** @nocollapse */\nHeNormal.className = 'HeNormal';\nserialization.registerClass(HeNormal);\nexport class HeUniform extends VarianceScaling {\n constructor(args) {\n super({\n scale: 2.0,\n mode: 'fanIn',\n distribution: 'uniform',\n seed: args == null ? null : args.seed\n });\n }\n getClassName() {\n // In Python Keras, HeUniform is not a class, but a helper method\n // that creates a VarianceScaling object. Use 'VarianceScaling' as\n // class name to be compatible with that.\n return VarianceScaling.className;\n }\n}\n/** @nocollapse */\nHeUniform.className = 'HeUniform';\nserialization.registerClass(HeUniform);\nexport class LeCunNormal extends VarianceScaling {\n constructor(args) {\n super({\n scale: 1.0,\n mode: 'fanIn',\n distribution: 'normal',\n seed: args == null ? null : args.seed\n });\n }\n getClassName() {\n // In Python Keras, LeCunNormal is not a class, but a helper method\n // that creates a VarianceScaling object. Use 'VarianceScaling' as\n // class name to be compatible with that.\n return VarianceScaling.className;\n }\n}\n/** @nocollapse */\nLeCunNormal.className = 'LeCunNormal';\nserialization.registerClass(LeCunNormal);\nexport class LeCunUniform extends VarianceScaling {\n constructor(args) {\n super({\n scale: 1.0,\n mode: 'fanIn',\n distribution: 'uniform',\n seed: args == null ? null : args.seed\n });\n }\n getClassName() {\n // In Python Keras, LeCunUniform is not a class, but a helper method\n // that creates a VarianceScaling object. Use 'VarianceScaling' as\n // class name to be compatible with that.\n return VarianceScaling.className;\n }\n}\n/** @nocollapse */\nLeCunUniform.className = 'LeCunNormal';\nserialization.registerClass(LeCunUniform);\nexport class Orthogonal extends Initializer {\n constructor(args) {\n super();\n this.DEFAULT_GAIN = 1;\n this.gain = args.gain == null ? this.DEFAULT_GAIN : args.gain;\n this.seed = args.seed;\n if (this.seed != null) {\n throw new NotImplementedError('Random seed is not implemented for Orthogonal Initializer yet.');\n }\n }\n apply(shape, dtype) {\n return tidy(() => {\n if (shape.length < 2) {\n throw new NotImplementedError('Shape must be at least 2D.');\n }\n if (shape[0] * shape[1] > 2000) {\n console.warn(`Orthogonal initializer is being called on a matrix with more ` +\n `than 2000 (${shape[0] * shape[1]}) elements: ` +\n `Slowness may result.`);\n }\n // TODO(cais): Add seed support.\n const normalizedShape = shape[0] > shape[1] ? [shape[1], shape[0]] : shape;\n const a = K.randomNormal(normalizedShape, 0, 1, 'float32');\n let q = linalg.gramSchmidt(a);\n if (shape[0] > shape[1]) {\n q = transpose(q);\n }\n return mul(this.gain, q);\n });\n }\n getConfig() {\n return {\n gain: this.gain,\n seed: this.seed,\n };\n }\n}\n/** @nocollapse */\nOrthogonal.className = 'Orthogonal';\nserialization.registerClass(Orthogonal);\n// Maps the JavaScript-like identifier keys to the corresponding registry\n// symbols.\nexport const INITIALIZER_IDENTIFIER_REGISTRY_SYMBOL_MAP = {\n 'constant': 'Constant',\n 'glorotNormal': 'GlorotNormal',\n 'glorotUniform': 'GlorotUniform',\n 'heNormal': 'HeNormal',\n 'heUniform': 'HeUniform',\n 'identity': 'Identity',\n 'leCunNormal': 'LeCunNormal',\n 'leCunUniform': 'LeCunUniform',\n 'ones': 'Ones',\n 'orthogonal': 'Orthogonal',\n 'randomNormal': 'RandomNormal',\n 'randomUniform': 'RandomUniform',\n 'truncatedNormal': 'TruncatedNormal',\n 'varianceScaling': 'VarianceScaling',\n 'zeros': 'Zeros'\n};\nfunction deserializeInitializer(config, customObjects = {}) {\n return deserializeKerasObject(config, serialization.SerializationMap.getMap().classNameMap, customObjects, 'initializer');\n}\nexport function serializeInitializer(initializer) {\n return serializeKerasObject(initializer);\n}\nexport function getInitializer(identifier) {\n if (typeof identifier === 'string') {\n const className = identifier in INITIALIZER_IDENTIFIER_REGISTRY_SYMBOL_MAP ?\n INITIALIZER_IDENTIFIER_REGISTRY_SYMBOL_MAP[identifier] :\n identifier;\n /* We have four 'helper' classes for common initializers that\n all get serialized as 'VarianceScaling' and shouldn't go through\n the deserializeInitializer pathway. */\n if (className === 'GlorotNormal') {\n return new GlorotNormal();\n }\n else if (className === 'GlorotUniform') {\n return new GlorotUniform();\n }\n else if (className === 'HeNormal') {\n return new HeNormal();\n }\n else if (className === 'HeUniform') {\n return new HeUniform();\n }\n else if (className === 'LeCunNormal') {\n return new LeCunNormal();\n }\n else if (className === 'LeCunUniform') {\n return new LeCunUniform();\n }\n else {\n const config = {};\n config['className'] = className;\n config['config'] = {};\n return deserializeInitializer(config);\n }\n }\n else if (identifier instanceof Initializer) {\n return identifier;\n }\n else {\n return deserializeInitializer(identifier);\n }\n}\n//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW5pdGlhbGl6ZXJzLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vdGZqcy1sYXllcnMvc3JjL2luaXRpYWxpemVycy50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQTs7Ozs7Ozs7R0FRRztBQUVILE9BQU8sRUFBVyxHQUFHLEVBQUUsTUFBTSxFQUFFLEdBQUcsRUFBRSxJQUFJLEVBQUUsYUFBYSxFQUFFLE1BQU0sRUFBRSxhQUFhLEVBQW9CLElBQUksRUFBRSxTQUFTLEVBQUUsZUFBZSxFQUFFLEtBQUssRUFBQyxNQUFNLHVCQUF1QixDQUFDO0FBRXhLLE9BQU8sS0FBSyxDQUFDLE1BQU0sd0JBQXdCLENBQUM7QUFDNUMsT0FBTyxFQUFDLGVBQWUsRUFBQyxNQUFNLFVBQVUsQ0FBQztBQUN6QyxPQUFPLEVBQUMsbUJBQW1CLEVBQUUsVUFBVSxFQUFDLE1BQU0sVUFBVSxDQUFDO0FBRXpELE9BQU8sRUFBd0IseUJBQXlCLEVBQUUscUJBQXFCLEVBQUMsTUFBTSxtQ0FBbUMsQ0FBQztBQUMxSCxPQUFPLEVBQUMseUJBQXlCLEVBQUUsc0JBQXNCLEVBQUUsb0JBQW9CLEVBQUMsTUFBTSx1QkFBdUIsQ0FBQztBQUM5RyxPQUFPLEVBQUMsU0FBUyxFQUFDLE1BQU0sb0JBQW9CLENBQUM7QUFFN0MsTUFBTSxVQUFVLFlBQVksQ0FBQyxLQUFjO0lBQ3pDLHlCQUF5QixDQUFDLHFCQUFxQixFQUFFLFNBQVMsRUFBRSxLQUFLLENBQUMsQ0FBQztBQUNyRSxDQUFDO0FBRUQsTUFBTSxVQUFVLGlCQUFpQixDQUFDLEtBQWM7SUFDOUMseUJBQXlCLENBQUMseUJBQXlCLEVBQUUsY0FBYyxFQUFFLEtBQUssQ0FBQyxDQUFDO0FBQzlFLENBQUM7QUFFRDs7Ozs7R0FLRztBQUNILE1BQU0sT0FBZ0IsV0FBWSxTQUFRLGFBQWEsQ0FBQyxZQUFZO0lBQzNELDJCQUEyQjtRQUNoQyxPQUFPLEtBQUssQ0FBQztJQUNmLENBQUM7SUFTRCxT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Q3hELFVBQVUsQ0FBQztRQUNmOzs4Q0FFc0M7UUFDdEMsSUFBSSxTQUFTLEtBQUssY0FBYyxFQUFFO1lBQ2hDLE9BQU8sSUFBSSxZQUFZLEVBQUUsQ0FBQztTQUMzQjthQUFNLElBQUksU0FBUyxLQUFLLGVBQWUsRUFBRTtZQUN4QyxPQUFPLElBQUksYUFBYSxFQUFFLENBQUM7U0FDNUI7YUFBTSxJQUFJLFNBQVMsS0FBSyxVQUFVLEVBQUU7WUFDbkMsT0FBTyxJQUFJLFFBQVEsRUFBRSxDQUFDO1NBQ3ZCO2FBQU0sSUFBSSxTQUFTLEtBQUssV0FBVyxFQUFFO1lBQ3BDLE9BQU8sSUFBSSxTQUFTLEVBQUUsQ0FBQztTQUN4QjthQUFNLElBQUksU0FBUyxLQUFLLGFBQWEsRUFBRTtZQUN0QyxPQUFPLElBQUksV0FBVyxFQUFFLENBQUM7U0FDMUI7YUFBTSxJQUFJLFNBQVMsS0FBSyxjQUFjLEVBQUU7WUFDdkMsT0FBTyxJQUFJLFlBQVksRUFBRSxDQUFDO1NBQzNCO2FBQU07WUFDTCxNQUFNLE1BQU0sR0FBNkIsRUFBRSxDQUFDO1lBQzVDLE1BQU0sQ0FBQyxXQUFXLENBQUMsR0FBRyxTQUFTLENBQUM7WUFDaEMsTUFBTSxDQUFDLFFBQVEsQ0FBQyxHQUFHLEVBQUUsQ0FBQztZQUN0QixPQUFPLHNCQUFzQixDQUFDLE1BQU0sQ0FBQyxDQUFDO1NBQ3ZDO0tBQ0Y7U0FBTSxJQUFJLFVBQVUsWUFBWSxXQUFXLEVBQUU7UUFDNUMsT0FBTyxVQUFVLENBQUM7S0FDbkI7U0FBTTtRQUNMLE9BQU8sc0JBQXNCLENBQUMsVUFBVSxDQUFDLENBQUM7S0FDM0M7QUFDSCxDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiLyoqXG4gKiBAbGljZW5zZVxuICogQ29weXJpZ2h0IDIwMTggR29vZ2xlIExMQ1xuICpcbiAqIFVzZSBvZiB0aGlzIHNvdXJjZSBjb2RlIGlzIGdvdmVybmVkIGJ5IGFuIE1JVC1zdHlsZVxuICogbGljZW5zZSB0aGF0IGNhbiBiZSBmb3VuZCBpbiB0aGUgTElDRU5TRSBmaWxlIG9yIGF0XG4gKiBodHRwczovL29wZW5zb3VyY2Uub3JnL2xpY2Vuc2VzL01JVC5cbiAqID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4gKi9cblxuaW1wb3J0IHtEYXRhVHlwZSwgZXllLCBsaW5hbGcsIG11bCwgb25lcywgcmFuZG9tVW5pZm9ybSwgc2NhbGFyLCBzZXJpYWxpemF0aW9uLCBUZW5zb3IsIFRlbnNvcjJELCB0aWR5LCB0cmFuc3Bvc2UsIHRydW5jYXRlZE5vcm1hbCwgemVyb3N9IGZyb20gJ0B0ZW5zb3JmbG93L3RmanMtY29yZSc7XG5cbmltcG9ydCAqIGFzIEsgZnJvbSAnLi9iYWNrZW5kL3RmanNfYmFja2VuZCc7XG5pbXBvcnQge2NoZWNrRGF0YUZvcm1hdH0gZnJvbSAnLi9jb21tb24nO1xuaW1wb3J0IHtOb3RJbXBsZW1lbnRlZEVycm9yLCBWYWx1ZUVycm9yfSBmcm9tICcuL2Vycm9ycyc7XG5pbXBvcnQge0RhdGFGb3JtYXQsIFNoYXBlfSBmcm9tICcuL2tlcmFzX2Zvcm1hdC9jb21tb24nO1xuaW1wb3J0IHtEaXN0cmlidXRpb24sIEZhbk1vZGUsIFZBTElEX0RJU1RSSUJVVElPTl9WQUxVRVMsIFZBTElEX0ZBTl9NT0RFX1ZBTFVFU30gZnJvbSAnLi9rZXJhc19mb3JtYXQvaW5pdGlhbGl6ZXJfY29uZmlnJztcbmltcG9ydCB7Y2hlY2tTdHJpbmdUeXBlVW5pb25WYWx1ZSwgZGVzZXJpYWxpemVLZXJhc09iamVjdCwgc2VyaWFsaXplS2VyYXNPYmplY3R9IGZyb20gJy4vdXRpbHMvZ2VuZXJpY191dGlscyc7XG5pbXBvcnQge2FycmF5UHJvZH0gZnJvbSAnLi91dGlscy9tYXRoX3V0aWxzJztcblxuZXhwb3J0IGZ1bmN0aW9uIGNoZWNrRmFuTW9kZSh2YWx1ZT86IHN0cmluZyk6IHZvaWQge1xuICBjaGVja1N0cmluZ1R5cGVVbmlvblZhbHVlKFZBTElEX0ZBTl9NT0RFX1ZBTFVFUywgJ0Zhbk1vZGUnLCB2YWx1ZSk7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBjaGVja0Rpc3RyaWJ1dGlvbih2YWx1ZT86IHN0cmluZyk6IHZvaWQge1xuICBjaGVja1N0cmluZ1R5cGVVbmlvblZhbHVlKFZBTElEX0RJU1RSSUJVVElPTl9WQUxVRVMsICdEaXN0cmlidXRpb24nLCB2YWx1ZSk7XG59XG5cbi8qKlxuICogSW5pdGlhbGl6ZXIgYmFzZSBjbGFzcy5cbiAqXG4gKiBAZG9jIHtcbiAqICAgaGVhZGluZzogJ0luaXRpYWxpemVycycsIHN1YmhlYWRpbmc6ICdDbGFzc2VzJywgbmFtZXNwYWNlOiAnaW5pdGlhbGl6ZXJzJ31cbiAqL1xuZXhwb3J0IGFic3RyYWN0IGNsYXNzIEluaXRpYWxpemVyIGV4dGVuZHMgc2VyaWFsaXphdGlvbi5TZXJpYWxpemFibGUge1xuICBwdWJsaWMgZnJvbUNvbmZpZ1VzZXNDdXN0b21PYmplY3RzKCk6IGJvb2xlYW4ge1xuICAgIHJldHVybiBmYWxzZTtcbiAgfVxuICAvKipcbiAgICogR2VuZXJhdGUgYW4gaW5pdGlhbCB2YWx1ZS5cbiAgICogQHBhcmFtIHNoYXBlXG4gICAqIEBwYXJhbSBkdHlwZVxuICAgKiBAcmV0dXJuIFRoZSBpbml0IHZhbHVlLlxuICAgKi9cbiAgYWJzdHJhY3QgYXBwbHkoc2hhcGU6IFNoYXBlLCBkdHlwZT86IERhdGFUeXBlKTogVGVuc29yO1xuXG4gIGdldENvbmZpZygpOiBzZXJpYWxpemF0aW9uLkNvbmZpZ0RpY3Qge1xuICAgIHJldHVybiB7fTtcbiAgfVxufVxuXG5leHBvcnQgY2xhc3MgWmVyb3MgZXh0ZW5kcyBJbml0aWFsaXplciB7XG4gIC8qKiBAbm9jb2xsYXBzZSAqL1xuICBzdGF0aWMgY2xhc3NOYW1lID0gJ1plcm9zJztcblxuICBhcHBseShzaGFwZTogU2hhcGUsIGR0eXBlPzogRGF0YVR5cGUpOiBUZW5zb3Ige1xuICAgIHJldHVybiB6ZXJvcyhzaGFwZSwgZHR5cGUpO1xuICB9XG59XG5zZXJpYWxpemF0aW9uLnJlZ2lzdGVyQ2xhc3MoWmVyb3MpO1xuXG5leHBvcnQgY2xhc3MgT25lcyBleHRlbmRzIEluaXRpYWxpemVyIHtcbiAgLyoqIEBub2NvbGxhcHNlICovXG4gIHN0YXRpYyBjbGFzc05hbWUgPSAnT25lcyc7XG5cbiAgYXBwbHkoc2hhcGU6IFNoYXBlLCBkdHlwZT86IERhdGFUeXBlKTogVGVuc29yIHtcbiAgICByZXR1cm4gb25lcyhzaGFwZSwgZHR5cGUpO1xuICB9XG59XG5zZXJpYWxpemF0aW9uLnJlZ2lzdGVyQ2xhc3MoT25lcyk7XG5cbmV4cG9ydCBpbnRlcmZhY2UgQ29uc3RhbnRBcmdzIHtcbiAgLyoqIFRoZSB2YWx1ZSBmb3IgZWFjaCBlbGVtZW50IGluIHRoZSB2YXJpYWJsZS4gKi9cbiAgdmFsdWU6IG51bWJlcjtcbn1cblxuZXhwb3J0IGNsYXNzIENvbnN0YW50IGV4dGVuZHMgSW5pdGlhbGl6ZXIge1xuICAvKiogQG5vY29sbGFwc2UgKi9cbiAgc3RhdGljIGNsYXNzTmFtZSA9ICdDb25zdGFudCc7XG4gIHByaXZhdGUgdmFsdWU6IG51bWJlcjtcbiAgY29uc3RydWN0b3IoYXJnczogQ29uc3RhbnRBcmdzKSB7XG4gICAgc3VwZXIoKTtcbiAgICBpZiAodHlwZW9mIGFyZ3MgIT09ICdvYmplY3QnKSB7XG4gICAgICB0aHJvdyBuZXcgVmFsdWVFcnJvcihcbiAgICAgICAgICBgRXhwZWN0ZWQgYXJndW1lbnQgb2YgdHlwZSBDb25zdGFudENvbmZpZyBidXQgZ290ICR7YXJnc31gKTtcbiAgICB9XG4gICAgaWYgKGFyZ3MudmFsdWUgPT09IHVuZGVmaW5lZCkge1xuICAgICAgdGhyb3cgbmV3IFZhbHVlRXJyb3IoYGNvbmZpZyBtdXN0IGhhdmUgdmFsdWUgc2V0IGJ1dCBnb3QgJHthcmdzfWApO1xuICAgIH1cbiAgICB0aGlzLnZhbHVlID0gYXJncy52YWx1ZTtcbiAgfVxuXG4gIGFwcGx5KHNoYXBlOiBTaGFwZSwgZHR5cGU/OiBEYXRhVHlwZSk6IFRlbnNvciB7XG4gICAgcmV0dXJuIHRpZHkoKCkgPT4gbXVsKHNjYWxhcih0aGlzLnZhbHVlKSwgb25lcyhzaGFwZSwgZHR5cGUpKSk7XG4gIH1cblxuICBnZXRDb25maWcoKTogc2VyaWFsaXphdGlvbi5Db25maWdEaWN0IHtcbiAgICByZXR1cm4ge1xuICAgICAgdmFsdWU6IHRoaXMudmFsdWUsXG4gICAgfTtcbiAgfVxufVxuc2VyaWFsaXphdGlvbi5yZWdpc3RlckNsYXNzKENvbnN0YW50KTtcblxuZXhwb3J0IGludGVyZmFjZSBSYW5kb21Vbmlmb3JtQXJncyB7XG4gIC8qKiBMb3dlciBib3VuZCBvZiB0aGUgcmFuZ2Ugb2YgcmFuZG9tIHZhbHVlcyB0byBnZW5lcmF0ZS4gKi9cbiAgbWludmFsPzogbnVtYmVyO1xuICAvKiogVXBwZXIgYm91bmQgb2YgdGhlIHJhbmdlIG9mIHJhbmRvbSB2YWx1ZXMgdG8gZ2VuZXJhdGUuICovXG4gIG1heHZhbD86IG51bWJlcjtcbiAgLyoqIFVzZWQgdG8gc2VlZCB0aGUgcmFuZG9tIGdlbmVyYXRvci4gKi9cbiAgc2VlZD86IG51bWJlcjtcbn1cblxuZXhwb3J0IGNsYXNzIFJhbmRvbVVuaWZvcm0gZXh0ZW5kcyBJbml0aWFsaXplciB7XG4gIC8qKiBAbm9jb2xsYXBzZSAqL1xuICBzdGF0aWMgY2xhc3NOYW1lID0gJ1JhbmRvbVVuaWZvcm0nO1xuICByZWFkb25seSBERUZBVUxUX01JTlZBTCA9IC0wLjA1O1xuICByZWFkb25seSBERUZBVUxUX01BWFZBTCA9IDAuMDU7XG4gIHByaXZhdGUgbWludmFsOiBudW1iZXI7XG4gIHByaXZhdGUgbWF4dmFsOiBudW1iZXI7XG4gIHByaXZhdGUgc2VlZDogbnVtYmVyO1xuXG4gIGNvbnN0cnVjdG9yKGFyZ3M6IFJhbmRvbVVuaWZvcm1BcmdzKSB7XG4gICAgc3VwZXIoKTtcbiAgICB0aGlzLm1pbnZhbCA9IGFyZ3MubWludmFsIHx8IHRoaXMuREVGQVVMVF9NSU5WQUw7XG4gICAgdGhpcy5tYXh2YWwgPSBhcmdzLm1heHZhbCB8fCB0aGlzLkRFRkFVTFRfTUFYVkFMO1xuICAgIHRoaXMuc2VlZCA9IGFyZ3Muc2VlZDtcbiAgfVxuXG4gIGFwcGx5KHNoYXBlOiBTaGFwZSwgZHR5cGU/OiBEYXRhVHlwZSk6IFRlbnNvciB7XG4gICAgcmV0dXJuIHJhbmRvbVVuaWZvcm0oc2hhcGUsIHRoaXMubWludmFsLCB0aGlzLm1heHZhbCwgZHR5cGUpO1xuICB9XG5cbiAgZ2V0Q29uZmlnKCk6IHNlcmlhbGl6YXRpb24uQ29uZmlnRGljdCB7XG4gICAgcmV0dXJuIHttaW52YWw6IHRoaXMubWludmFsLCBtYXh2YWw6IHRoaXMubWF4dmFsLCBzZWVkOiB0aGlzLnNlZWR9O1xuICB9XG59XG5zZXJpYWxpemF0aW9uLnJlZ2lzdGVyQ2xhc3MoUmFuZG9tVW5pZm9ybSk7XG5cbmV4cG9ydCBpbnRlcmZhY2UgUmFuZG9tTm9ybWFsQXJncyB7XG4gIC8qKiBNZWFuIG9mIHRoZSByYW5kb20gdmFsdWVzIHRvIGdlbmVyYXRlLiAqL1xuICBtZWFuPzogbnVtYmVyO1xuICAvKiogU3RhbmRhcmQgZGV2aWF0aW9uIG9mIHRoZSByYW5kb20gdmFsdWVzIHRvIGdlbmVyYXRlLiAqL1xuICBzdGRkZXY/OiBudW1iZXI7XG4gIC8qKiBVc2VkIHRvIHNlZWQgdGhlIHJhbmRvbSBnZW5lcmF0b3IuICovXG4gIHNlZWQ/OiBudW1iZXI7XG59XG5cbmV4cG9ydCBjbGFzcyBSYW5kb21Ob3JtYWwgZXh0ZW5kcyBJbml0aWFsaXplciB7XG4gIC8qKiBAbm9jb2xsYXBzZSAqL1xuICBzdGF0aWMgY2xhc3NOYW1lID0gJ1JhbmRvbU5vcm1hbCc7XG4gIHJlYWRvbmx5IERFRkFVTFRfTUVBTiA9IDAuO1xuICByZWFkb25seSBERUZBVUxUX1NURERFViA9IDAuMDU7XG4gIHByaXZhdGUgbWVhbjogbnVtYmVyO1xuICBwcml2YXRlIHN0ZGRldjogbnVtYmVyO1xuICBwcml2YXRlIHNlZWQ6IG51bWJlcjtcblxuICBjb25zdHJ1Y3RvcihhcmdzOiBSYW5kb21Ob3JtYWxBcmdzKSB7XG4gICAgc3VwZXIoKTtcbiAgICB0aGlzLm1lYW4gPSBhcmdzLm1lYW4gfHwgdGhpcy5ERUZBVUxUX01FQU47XG4gICAgdGhpcy5zdGRkZXYgPSBhcmdzLnN0ZGRldiB8fCB0aGlzLkRFRkFVTFRfU1REREVWO1xuICAgIHRoaXMuc2VlZCA9IGFyZ3Muc2VlZDtcbiAgfVxuXG4gIGFwcGx5KHNoYXBlOiBTaGFwZSwgZHR5cGU/OiBEYXRhVHlwZSk6IFRlbnNvciB7XG4gICAgZHR5cGUgPSBkdHlwZSB8fCAnZmxvYXQzMic7XG4gICAgaWYgKGR0eXBlICE9PSAnZmxvYXQzMicgJiYgZHR5cGUgIT09ICdpbnQzMicpIHtcbiAgICAgIHRocm93IG5ldyBOb3RJbXBsZW1lbnRlZEVycm9yKFxuICAgICAgICAgIGByYW5kb21Ob3JtYWwgZG9lcyBub3Qgc3VwcG9ydCBkVHlwZSAke2R0eXBlfS5gKTtcbiAgICB9XG5cbiAgICByZXR1cm4gSy5yYW5kb21Ob3JtYWwoc2hhcGUsIHRoaXMubWVhbiwgdGhpcy5zdGRkZXYsIGR0eXBlLCB0aGlzLnNlZWQpO1xuICB9XG5cbiAgZ2V0Q29uZmlnKCk6IHNlcmlhbGl6YXRpb24uQ29uZmlnRGljdCB7XG4gICAgcmV0dXJuIHttZWFuOiB0aGlzLm1lYW4sIHN0ZGRldjogdGhpcy5zdGRkZXYsIHNlZWQ6IHRoaXMuc2VlZH07XG4gIH1cbn1cbnNlcmlhbGl6YXRpb24ucmVnaXN0ZXJDbGFzcyhSYW5kb21Ob3JtYWwpO1xuXG5leHBvcnQgaW50ZXJmYWNlIFRydW5jYXRlZE5vcm1hbEFyZ3Mge1xuICAvKiogTWVhbiBvZiB0aGUgcmFuZG9tIHZhbHVlcyB0byBnZW5lcmF0ZS4gKi9cbiAgbWVhbj86IG51bWJlcjtcbiAgLyoqIFN0YW5kYXJkIGRldmlhdGlvbiBvZiB0aGUgcmFuZG9tIHZhbHVlcyB0byBnZW5lcmF0ZS4gKi9cbiAgc3RkZGV2PzogbnVtYmVyO1xuICAvKiogVXNlZCB0byBzZWVkIHRoZSByYW5kb20gZ2VuZXJhdG9yLiAqL1xuICBzZWVkPzogbnVtYmVyO1xufVxuXG5leHBvcnQgY2xhc3MgVHJ1bmNhdGVkTm9ybWFsIGV4dGVuZHMgSW5pdGlhbGl6ZXIge1xuICAvKiogQG5vY29sbGFwc2UgKi9cbiAgc3RhdGljIGNsYXNzTmFtZSA9ICdUcnVuY2F0ZWROb3JtYWwnO1xuXG4gIHJlYWRvbmx5IERFRkFVTFRfTUVBTiA9IDAuO1xuICByZWFkb25seSBERUZBVUxUX1NURERFViA9IDAuMDU7XG4gIHByaXZhdGUgbWVhbjogbnVtYmVyO1xuICBwcml2YXRlIHN0ZGRldjogbnVtYmVyO1xuICBwcml2YXRlIHNlZWQ6IG51bWJlcjtcblxuICBjb25zdHJ1Y3RvcihhcmdzOiBUcnVuY2F0ZWROb3JtYWxBcmdzKSB7XG4gICAgc3VwZXIoKTtcbiAgICB0aGlzLm1lYW4gPSBhcmdzLm1lYW4gfHwgdGhpcy5ERUZBVUxUX01FQU47XG4gICAgdGhpcy5zdGRkZXYgPSBhcmdzLnN0ZGRldiB8fCB0aGlzLkRFRkFVTFRfU1REREVWO1xuICAgIHRoaXMuc2VlZCA9IGFyZ3Muc2VlZDtcbiAgfVxuXG4gIGFwcGx5KHNoYXBlOiBTaGFwZSwgZHR5cGU/OiBEYXRhVHlwZSk6IFRlbnNvciB7XG4gICAgZHR5cGUgPSBkdHlwZSB8fCAnZmxvYXQzMic7XG4gICAgaWYgKGR0eXBlICE9PSAnZmxvYXQzMicgJiYgZHR5cGUgIT09ICdpbnQzMicpIHtcbiAgICAgIHRocm93IG5ldyBOb3RJbXBsZW1lbnRlZEVycm9yKFxuICAgICAgICAgIGB0cnVuY2F0ZWROb3JtYWwgZG9lcyBub3Qgc3VwcG9ydCBkVHlwZSAke2R0eXBlfS5gKTtcbiAgICB9XG4gICAgcmV0dXJuIHRydW5jYXRlZE5vcm1hbChzaGFwZSwgdGhpcy5tZWFuLCB0aGlzLnN0ZGRldiwgZHR5cGUsIHRoaXMuc2VlZCk7XG4gIH1cblxuICBnZXRDb25maWcoKTogc2VyaWFsaXphdGlvbi5Db25maWdEaWN0IHtcbiAgICByZXR1cm4ge21lYW46IHRoaXMubWVhbiwgc3RkZGV2OiB0aGlzLnN0ZGRldiwgc2VlZDogdGhpcy5zZWVkfTtcbiAgfVxufVxuc2VyaWFsaXphdGlvbi5yZWdpc3RlckNsYXNzKFRydW5jYXRlZE5vcm1hbCk7XG5cbmV4cG9ydCBpbnRlcmZhY2UgSWRlbnRpdHlBcmdzIHtcbiAgLyoqXG4gICAqIE11bHRpcGxpY2F0aXZlIGZhY3RvciB0byBhcHBseSB0byB0aGUgaWRlbnRpdHkgbWF0cml4LlxuICAgKi9cbiAgZ2Fpbj86IG51bWJlcjtcbn1cblxuZXhwb3J0IGNsYXNzIElkZW50aXR5IGV4dGVuZHMgSW5pdGlhbGl6ZXIge1xuICAvKiogQG5vY29sbGFwc2UgKi9cbiAgc3RhdGljIGNsYXNzTmFtZSA9ICdJZGVudGl0eSc7XG4gIHByaXZhdGUgZ2FpbjogbnVtYmVyO1xuICBjb25zdHJ1Y3RvcihhcmdzOiBJZGVudGl0eUFyZ3MpIHtcbiAgICBzdXBlcigpO1xuICAgIHRoaXMuZ2FpbiA9IGFyZ3MuZ2FpbiAhPSBudWxsID8gYXJncy5nYWluIDogMS4wO1xuICB9XG5cbiAgYXBwbHkoc2hhcGU6IFNoYXBlLCBkdHlwZT86IERhdGFUeXBlKTogVGVuc29yIHtcbiAgICByZXR1cm4gdGlkeSgoKSA9PiB7XG4gICAgICBpZiAoc2hhcGUubGVuZ3RoICE9PSAyIHx8IHNoYXBlWzBdICE9PSBzaGFwZVsxXSkge1xuICAgICAgICB0aHJvdyBuZXcgVmFsdWVFcnJvcihcbiAgICAgICAgICAgICdJZGVudGl0eSBtYXRyaXggaW5pdGlhbGl6ZXIgY2FuIG9ubHkgYmUgdXNlZCBmb3InICtcbiAgICAgICAgICAgICcgMkQgc3F1YXJlIG1hdHJpY2VzLicpO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgcmV0dXJuIG11bCh0aGlzLmdhaW4sIGV5ZShzaGFwZVswXSkpO1xuICAgICAgfVxuICAgIH0pO1xuICB9XG5cbiAgZ2V0Q29uZmlnKCk6IHNlcmlhbGl6YXRpb24uQ29uZmlnRGljdCB7XG4gICAgcmV0dXJuIHtnYWluOiB0aGlzLmdhaW59O1xuICB9XG59XG5zZXJpYWxpemF0aW9uLnJlZ2lzdGVyQ2xhc3MoSWRlbnRpdHkpO1xuXG4vKipcbiAqIENvbXB1dGVzIHRoZSBudW1iZXIgb2YgaW5wdXQgYW5kIG91dHB1dCB1bml0cyBmb3IgYSB3ZWlnaHQgc2hhcGUuXG4gKiBAcGFyYW0gc2hhcGUgU2hhcGUgb2Ygd2VpZ2h0LlxuICogQHBhcmFtIGRhdGFGb3JtYXQgZGF0YSBmb3JtYXQgdG8gdXNlIGZvciBjb252b2x1dGlvbiBrZXJuZWxzLlxuICogICBOb3RlIHRoYXQgYWxsIGtlcm5lbHMgaW4gS2VyYXMgYXJlIHN0YW5kYXJkaXplZCBvbiB0aGVcbiAqICAgQ0hBTk5FTF9MQVNUIG9yZGVyaW5nIChldmVuIHdoZW4gaW5wdXRzIGFyZSBzZXQgdG8gQ0hBTk5FTF9GSVJTVCkuXG4gKiBAcmV0dXJuIEFuIGxlbmd0aC0yIGFycmF5OiBmYW5JbiwgZmFuT3V0LlxuICovXG5mdW5jdGlvbiBjb21wdXRlRmFucyhcbiAgICBzaGFwZTogU2hhcGUsIGRhdGFGb3JtYXQ6IERhdGFGb3JtYXQgPSAnY2hhbm5lbHNMYXN0Jyk6IG51bWJlcltdIHtcbiAgbGV0IGZhbkluOiBudW1iZXI7XG4gIGxldCBmYW5PdXQ6IG51bWJlcjtcbiAgY2hlY2tEYXRhRm9ybWF0KGRhdGFGb3JtYXQpO1xuICBpZiAoc2hhcGUubGVuZ3RoID09PSAyKSB7XG4gICAgZmFuSW4gPSBzaGFwZVswXTtcbiAgICBmYW5PdXQgPSBzaGFwZVsxXTtcbiAgfSBlbHNlIGlmIChbMywgNCwgNV0uaW5kZXhPZihzaGFwZS5sZW5ndGgpICE9PSAtMSkge1xuICAgIGlmIChkYXRhRm9ybWF0ID09PSAnY2hhbm5lbHNGaXJzdCcpIHtcbiAgICAgIGNvbnN0IHJlY2VwdGl2ZUZpZWxkU2l6ZSA9IGFycmF5UHJvZChzaGFwZSwgMik7XG4gICAgICBmYW5JbiA9IHNoYXBlWzFdICogcmVjZXB0aXZlRmllbGRTaXplO1xuICAgICAgZmFuT3V0ID0gc2hhcGVbMF0gKiByZWNlcHRpdmVGaWVsZFNpemU7XG4gICAgfSBlbHNlIGlmIChkYXRhRm9ybWF0ID09PSAnY2hhbm5lbHNMYXN0Jykge1xuICAgICAgY29uc3QgcmVjZXB0aXZlRmllbGRTaXplID0gYXJyYXlQcm9kKHNoYXBlLCAwLCBzaGFwZS5sZW5ndGggLSAyKTtcbiAgICAgIGZhbkluID0gc2hhcGVbc2hhcGUubGVuZ3RoIC0gMl0gKiByZWNlcHRpdmVGaWVsZFNpemU7XG4gICAgICBmYW5PdXQgPSBzaGFwZVtzaGFwZS5sZW5ndGggLSAxXSAqIHJlY2VwdGl2ZUZpZWxkU2l6ZTtcbiAgICB9XG4gIH0gZWxzZSB7XG4gICAgY29uc3Qgc2hhcGVQcm9kID0gYXJyYXlQcm9kKHNoYXBlKTtcbiAgICBmYW5JbiA9IE1hdGguc3FydChzaGFwZVByb2QpO1xuICAgIGZhbk91dCA9IE1hdGguc3FydChzaGFwZVByb2QpO1xuICB9XG5cbiAgcmV0dXJuIFtmYW5JbiwgZmFuT3V0XTtcbn1cblxuZXhwb3J0IGludGVyZmFjZSBWYXJpYW5jZVNjYWxpbmdBcmdzIHtcbiAgLyoqIFNjYWxpbmcgZmFjdG9yIChwb3NpdGl2ZSBmbG9hdCkuICovXG4gIHNjYWxlPzogbnVtYmVyO1xuXG4gIC8qKiBGYW5uaW5nIG1vZGUgZm9yIGlucHV0cyBhbmQgb3V0cHV0cy4gKi9cbiAgbW9kZT86IEZhbk1vZGU7XG5cbiAgLyoqIFByb2JhYmlsaXN0aWMgZGlzdHJpYnV0aW9uIG9mIHRoZSB2YWx1ZXMuICovXG4gIGRpc3RyaWJ1dGlvbj86IERpc3RyaWJ1dGlvbjtcblxuICAvKiogUmFuZG9tIG51bWJlciBnZW5lcmF0b3Igc2VlZC4gKi9cbiAgc2VlZD86IG51bWJlcjtcbn1cblxuZXhwb3J0IGNsYXNzIFZhcmlhbmNlU2NhbGluZyBleHRlbmRzIEluaXRpYWxpemVyIHtcbiAgLyoqIEBub2NvbGxhcHNlICovXG4gIHN0YXRpYyBjbGFzc05hbWUgPSAnVmFyaWFuY2VTY2FsaW5nJztcbiAgcHJpdmF0ZSBzY2FsZTogbnVtYmVyO1xuICBwcml2YXRlIG1vZGU6IEZhbk1vZGU7XG4gIHByaXZhdGUgZGlzdHJpYnV0aW9uOiBEaXN0cmlidXRpb247XG4gIHByaXZhdGUgc2VlZDogbnVtYmVyO1xuXG4gIC8qKlxuICAgKiBDb25zdHJ1Y3RvciBvZiBWYXJpYW5jZVNjYWxpbmcuXG4gICAqIEB0aHJvd3MgVmFsdWVFcnJvciBmb3IgaW52YWxpZCB2YWx1ZSBpbiBzY2FsZS5cbiAgICovXG4gIGNvbnN0cnVjdG9yKGFyZ3M6IFZhcmlhbmNlU2NhbGluZ0FyZ3MpIHtcbiAgICBzdXBlcigpO1xuICAgIGlmIChhcmdzLnNjYWxlIDwgMC4wKSB7XG4gICAgICB0aHJvdyBuZXcgVmFsdWVFcnJvcihcbiAgICAgICAgICBgc2NhbGUgbXVzdCBiZSBhIHBvc2l0aXZlIGZsb2F0LiBHb3Q6ICR7YXJncy5zY2FsZX1gKTtcbiAgICB9XG4gICAgdGhpcy5zY2FsZSA9IGFyZ3Muc2NhbGUgPT0gbnVsbCA/IDEuMCA6IGFyZ3Muc2NhbGU7XG4gICAgdGhpcy5tb2RlID0gYXJncy5tb2RlID09IG51bGwgPyAnZmFuSW4nIDogYXJncy5tb2RlO1xuICAgIGNoZWNrRmFuTW9kZSh0aGlzLm1vZGUpO1xuICAgIHRoaXMuZGlzdHJpYnV0aW9uID1cbiAgICAgICAgYXJncy5kaXN0cmlidXRpb24gPT0gbnVsbCA/ICdub3JtYWwnIDogYXJncy5kaXN0cmlidXRpb247XG4gICAgY2hlY2tEaXN0cmlidXRpb24odGhpcy5kaXN0cmlidXRpb24pO1xuICAgIHRoaXMuc2VlZCA9IGFyZ3Muc2VlZDtcbiAgfVxuXG4gIGFwcGx5KHNoYXBlOiBTaGFwZSwgZHR5cGU/OiBEYXRhVHlwZSk6IFRlbnNvciB7XG4gICAgY29uc3QgZmFucyA9IGNvbXB1dGVGYW5zKHNoYXBlKTtcbiAgICBjb25zdCBmYW5JbiA9IGZhbnNbMF07XG4gICAgY29uc3QgZmFuT3V0ID0gZmFuc1sxXTtcbiAgICBsZXQgc2NhbGUgPSB0aGlzLnNjYWxlO1xuICAgIGlmICh0aGlzLm1vZGUgPT09ICdmYW5JbicpIHtcbiAgICAgIHNjYWxlIC89IE1hdGgubWF4KDEsIGZhbkluKTtcbiAgICB9IGVsc2UgaWYgKHRoaXMubW9kZSA9PT0gJ2Zhbk91dCcpIHtcbiAgICAgIHNjYWxlIC89IE1hdGgubWF4KDEsIGZhbk91dCk7XG4gICAgfSBlbHNlIHtcbiAgICAgIHNjYWxlIC89IE1hdGgubWF4KDEsIChmYW5JbiArIGZhbk91dCkgLyAyKTtcbiAgICB9XG5cbiAgICBpZiAodGhpcy5kaXN0cmlidXRpb24gPT09ICdub3JtYWwnKSB7XG4gICAgICBjb25zdCBzdGRkZXYgPSBNYXRoLnNxcnQoc2NhbGUpO1xuICAgICAgZHR5cGUgPSBkdHlwZSB8fCAnZmxvYXQzMic7XG4gICAgICBpZiAoZHR5cGUgIT09ICdmbG9hdDMyJyAmJiBkdHlwZSAhPT0gJ2ludDMyJykge1xuICAgICAgICB0aHJvdyBuZXcgTm90SW1wbGVtZW50ZWRFcnJvcihcbiAgICAgICAgICAgIGAke3RoaXMuZ2V0Q2xhc3NOYW1lKCl9IGRvZXMgbm90IHN1cHBvcnQgZFR5cGUgJHtkdHlwZX0uYCk7XG4gICAgICB9XG4gICAgICByZXR1cm4gdHJ1bmNhdGVkTm9ybWFsKHNoYXBlLCAwLCBzdGRkZXYsIGR0eXBlLCB0aGlzLnNlZWQpO1xuICAgIH0gZWxzZSB7XG4gICAgICBjb25zdCBsaW1pdCA9IE1hdGguc3FydCgzICogc2NhbGUpO1xuICAgICAgcmV0dXJuIHJhbmRvbVVuaWZvcm0oc2hhcGUsIC1saW1pdCwgbGltaXQsIGR0eXBlKTtcbiAgICB9XG4gIH1cblxuICBnZXRDb25maWcoKTogc2VyaWFsaXphdGlvbi5Db25maWdEaWN0IHtcbiAgICByZXR1cm4ge1xuICAgICAgc2NhbGU6IHRoaXMuc2NhbGUsXG4gICAgICBtb2RlOiB0aGlzLm1vZGUsXG4gICAgICBkaXN0cmlidXRpb246IHRoaXMuZGlzdHJpYnV0aW9uLFxuICAgICAgc2VlZDogdGhpcy5zZWVkXG4gICAgfTtcbiAgfVxufVxuc2VyaWFsaXphdGlvbi5yZWdpc3RlckNsYXNzKFZhcmlhbmNlU2NhbGluZyk7XG5cbmV4cG9ydCBpbnRlcmZhY2UgU2VlZE9ubHlJbml0aWFsaXplckFyZ3Mge1xuICAvKiogUmFuZG9tIG51bWJlciBnZW5lcmF0b3Igc2VlZC4gKi9cbiAgc2VlZD86IG51bWJlcjtcbn1cblxuZXhwb3J0IGNsYXNzIEdsb3JvdFVuaWZvcm0gZXh0ZW5kcyBWYXJpYW5jZVNjYWxpbmcge1xuICAvKiogQG5vY29sbGFwc2UgKi9cbiAgc3RhdGljIGNsYXNzTmFtZSA9ICdHbG9yb3RVbmlmb3JtJztcblxuICAvKipcbiAgICogQ29uc3RydWN0b3Igb2YgR2xvcm90VW5pZm9ybVxuICAgKiBAcGFyYW0gc2NhbGVcbiAgICogQHBhcmFtIG1vZGVcbiAgICogQHBhcmFtIGRpc3RyaWJ1dGlvblxuICAgKiBAcGFyYW0gc2VlZFxuICAgKi9cbiAgY29uc3RydWN0b3IoYXJncz86IFNlZWRPbmx5SW5pdGlhbGl6ZXJBcmdzKSB7XG4gICAgc3VwZXIoe1xuICAgICAgc2NhbGU6IDEuMCxcbiAgICAgIG1vZGU6ICdmYW5BdmcnLFxuICAgICAgZGlzdHJpYnV0aW9uOiAndW5pZm9ybScsXG4gICAgICBzZWVkOiBhcmdzID09IG51bGwgPyBudWxsIDogYXJncy5zZWVkXG4gICAgfSk7XG4gIH1cblxuICBnZXRDbGFzc05hbWUoKTogc3RyaW5nIHtcbiAgICAvLyBJbiBQeXRob24gS2VyYXMsIEdsb3JvdFVuaWZvcm0gaXMgbm90IGEgY2xhc3MsIGJ1dCBhIGhlbHBlciBtZXRob2RcbiAgICAvLyB0aGF0IGNyZWF0ZXMgYSBWYXJpYW5jZVNjYWxpbmcgb2JqZWN0LiBVc2UgJ1ZhcmlhbmNlU2NhbGluZycgYXNcbiAgICAvLyBjbGFzcyBuYW1lIHRvIGJlIGNvbXBhdGlibGUgd2l0aCB0aGF0LlxuICAgIHJldHVybiBWYXJpYW5jZVNjYWxpbmcuY2xhc3NOYW1lO1xuICB9XG59XG5zZXJpYWxpemF0aW9uLnJlZ2lzdGVyQ2xhc3MoR2xvcm90VW5pZm9ybSk7XG5cbmV4cG9ydCBjbGFzcyBHbG9yb3ROb3JtYWwgZXh0ZW5kcyBWYXJpYW5jZVNjYWxpbmcge1xuICAvKiogQG5vY29sbGFwc2UgKi9cbiAgc3RhdGljIGNsYXNzTmFtZSA9ICdHbG9yb3ROb3JtYWwnO1xuXG4gIC8qKlxuICAgKiBDb25zdHJ1Y3RvciBvZiBHbG9yb3ROb3JtYWwuXG4gICAqIEBwYXJhbSBzY2FsZVxuICAgKiBAcGFyYW0gbW9kZVxuICAgKiBAcGFyYW0gZGlzdHJpYnV0aW9uXG4gICAqIEBwYXJhbSBzZWVkXG4gICAqL1xuICBjb25zdHJ1Y3RvcihhcmdzPzogU2VlZE9ubHlJbml0aWFsaXplckFyZ3MpIHtcbiAgICBzdXBlcih7XG4gICAgICBzY2FsZTogMS4wLFxuICAgICAgbW9kZTogJ2ZhbkF2ZycsXG4gICAgICBkaXN0cmlidXRpb246ICdub3JtYWwnLFxuICAgICAgc2VlZDogYXJncyA9PSBudWxsID8gbnVsbCA6IGFyZ3Muc2VlZFxuICAgIH0pO1xuICB9XG5cbiAgZ2V0Q2xhc3NOYW1lKCk6IHN0cmluZyB7XG4gICAgLy8gSW4gUHl0aG9uIEtlcmFzLCBHbG9yb3ROb3JtYWwgaXMgbm90IGEgY2xhc3MsIGJ1dCBhIGhlbHBlciBtZXRob2RcbiAgICAvLyB0aGF0IGNyZWF0ZXMgYSBWYXJpYW5jZVNjYWxpbmcgb2JqZWN0LiBVc2UgJ1ZhcmlhbmNlU2NhbGluZycgYXNcbiAgICAvLyBjbGFzcyBuYW1lIHRvIGJlIGNvbXBhdGlibGUgd2l0aCB0aGF0LlxuICAgIHJldHVybiBWYXJpYW5jZVNjYWxpbmcuY2xhc3NOYW1lO1xuICB9XG59XG5zZXJpYWxpemF0aW9uLnJlZ2lzdGVyQ2xhc3MoR2xvcm90Tm9ybWFsKTtcblxuZXhwb3J0IGNsYXNzIEhlTm9ybWFsIGV4dGVuZHMgVmFyaWFuY2VTY2FsaW5nIHtcbiAgLyoqIEBub2NvbGxhcHNlICovXG4gIHN0YXRpYyBjbGFzc05hbWUgPSAnSGVOb3JtYWwnO1xuXG4gIGNvbnN0cnVjdG9yKGFyZ3M/OiBTZWVkT25seUluaXRpYWxpemVyQXJncykge1xuICAgIHN1cGVyKHtcbiAgICAgIHNjYWxlOiAyLjAsXG4gICAgICBtb2RlOiAnZmFuSW4nLFxuICAgICAgZGlzdHJpYnV0aW9uOiAnbm9ybWFsJyxcbiAgICAgIHNlZWQ6IGFyZ3MgPT0gbnVsbCA/IG51bGwgOiBhcmdzLnNlZWRcbiAgICB9KTtcbiAgfVxuXG4gIGdldENsYXNzTmFtZSgpOiBzdHJpbmcge1xuICAgIC8vIEluIFB5dGhvbiBLZXJhcywgSGVOb3JtYWwgaXMgbm90IGEgY2xhc3MsIGJ1dCBhIGhlbHBlciBtZXRob2RcbiAgICAvLyB0aGF0IGNyZWF0ZXMgYSBWYXJpYW5jZVNjYWxpbmcgb2JqZWN0LiBVc2UgJ1ZhcmlhbmNlU2NhbGluZycgYXNcbiAgICAvLyBjbGFzcyBuYW1lIHRvIGJlIGNvbXBhdGlibGUgd2l0aCB0aGF0LlxuICAgIHJldHVybiBWYXJpYW5jZVNjYWxpbmcuY2xhc3NOYW1lO1xuICB9XG59XG5zZXJpYWxpemF0aW9uLnJlZ2lzdGVyQ2xhc3MoSGVOb3JtYWwpO1xuXG5leHBvcnQgY2xhc3MgSGVVbmlmb3JtIGV4dGVuZHMgVmFyaWFuY2VTY2FsaW5nIHtcbiAgLyoqIEBub2NvbGxhcHNlICovXG4gIHN0YXRpYyBjbGFzc05hbWUgPSAnSGVVbmlmb3JtJztcblxuICBjb25zdHJ1Y3RvcihhcmdzPzogU2VlZE9ubHlJbml0aWFsaXplckFyZ3MpIHtcbiAgICBzdXBlcih7XG4gICAgICBzY2FsZTogMi4wLFxuICAgICAgbW9kZTogJ2ZhbkluJyxcbiAgICAgIGRpc3RyaWJ1dGlvbjogJ3VuaWZvcm0nLFxuICAgICAgc2VlZDogYXJncyA9PSBudWxsID8gbnVsbCA6IGFyZ3Muc2VlZFxuICAgIH0pO1xuICB9XG5cbiAgZ2V0Q2xhc3NOYW1lKCk6IHN0cmluZyB7XG4gICAgLy8gSW4gUHl0aG9uIEtlcmFzLCBIZVVuaWZvcm0gaXMgbm90IGEgY2xhc3MsIGJ1dCBhIGhlbHBlciBtZXRob2RcbiAgICAvLyB0aGF0IGNyZWF0ZXMgYSBWYXJpYW5jZVNjYWxpbmcgb2JqZWN0LiBVc2UgJ1ZhcmlhbmNlU2NhbGluZycgYXNcbiAgICAvLyBjbGFzcyBuYW1lIHRvIGJlIGNvbXBhdGlibGUgd2l0aCB0aGF0LlxuICAgIHJldHVybiBWYXJpYW5jZVNjYWxpbmcuY2xhc3NOYW1lO1xuICB9XG59XG5zZXJpYWxpemF0aW9uLnJlZ2lzdGVyQ2xhc3MoSGVVbmlmb3JtKTtcblxuZXhwb3J0IGNsYXNzIExlQ3VuTm9ybWFsIGV4dGVuZHMgVmFyaWFuY2VTY2FsaW5nIHtcbiAgLyoqIEBub2NvbGxhcHNlICovXG4gIHN0YXRpYyBjbGFzc05hbWUgPSAnTGVDdW5Ob3JtYWwnO1xuXG4gIGNvbnN0cnVjdG9yKGFyZ3M/OiBTZWVkT25seUluaXRpYWxpemVyQXJncykge1xuICAgIHN1cGVyKHtcbiAgICAgIHNjYWxlOiAxLjAsXG4gICAgICBtb2RlOiAnZmFuSW4nLFxuICAgICAgZGlzdHJpYnV0aW9uOiAnbm9ybWFsJyxcbiAgICAgIHNlZWQ6IGFyZ3MgPT0gbnVsbCA/IG51bGwgOiBhcmdzLnNlZWRcbiAgICB9KTtcbiAgfVxuXG4gIGdldENsYXNzTmFtZSgpOiBzdHJpbmcge1xuICAgIC8vIEluIFB5dGhvbiBLZXJhcywgTGVDdW5Ob3JtYWwgaXMgbm90IGEgY2xhc3MsIGJ1dCBhIGhlbHBlciBtZXRob2RcbiAgICAvLyB0aGF0IGNyZWF0ZXMgYSBWYXJpYW5jZVNjYWxpbmcgb2JqZWN0LiBVc2UgJ1ZhcmlhbmNlU2NhbGluZycgYXNcbiAgICAvLyBjbGFzcyBuYW1lIHRvIGJlIGNvbXBhdGlibGUgd2l0aCB0aGF0LlxuICAgIHJldHVybiBWYXJpYW5jZVNjYWxpbmcuY2xhc3NOYW1lO1xuICB9XG59XG5zZXJpYWxpemF0aW9uLnJlZ2lzdGVyQ2xhc3MoTGVDdW5Ob3JtYWwpO1xuXG5leHBvcnQgY2xhc3MgTGVDdW5Vbmlmb3JtIGV4dGVuZHMgVmFyaWFuY2VTY2FsaW5nIHtcbiAgLyoqIEBub2NvbGxhcHNlICovXG4gIHN0YXRpYyBjbGFzc05hbWUgPSAnTGVDdW5Ob3JtYWwnO1xuXG4gIGNvbnN0cnVjdG9yKGFyZ3M/OiBTZWVkT25seUluaXRpYWxpemVyQXJncykge1xuICAgIHN1cGVyKHtcbiAgICAgIHNjYWxlOiAxLjAsXG4gICAgICBtb2RlOiAnZmFuSW4nLFxuICAgICAgZGlzdHJpYnV0aW9uOiAndW5pZm9ybScsXG4gICAgICBzZWVkOiBhcmdzID09IG51bGwgPyBudWxsIDogYXJncy5zZWVkXG4gICAgfSk7XG4gIH1cblxuICBnZXRDbGFzc05hbWUoKTogc3RyaW5nIHtcbiAgICAvLyBJbiBQeXRob24gS2VyYXMsIExlQ3VuVW5pZm9ybSBpcyBub3QgYSBjbGFzcywgYnV0IGEgaGVscGVyIG1ldGhvZFxuICAgIC8vIHRoYXQgY3JlYXRlcyBhIFZhcmlhbmNlU2NhbGluZyBvYmplY3QuIFVzZSAnVmFyaWFuY2VTY2FsaW5nJyBhc1xuICAgIC8vIGNsYXNzIG5hbWUgdG8gYmUgY29tcGF0aWJsZSB3aXRoIHRoYXQuXG4gICAgcmV0dXJuIFZhcmlhbmNlU2NhbGluZy5jbGFzc05hbWU7XG4gIH1cbn1cbnNlcmlhbGl6YXRpb24ucmVnaXN0ZXJDbGFzcyhMZUN1blVuaWZvcm0pO1xuXG5leHBvcnQgaW50ZXJmYWNlIE9ydGhvZ29uYWxBcmdzIGV4dGVuZHMgU2VlZE9ubHlJbml0aWFsaXplckFyZ3Mge1xuICAvKipcbiAgICogTXVsdGlwbGljYXRpdmUgZmFjdG9yIHRvIGFwcGx5IHRvIHRoZSBvcnRob2dvbmFsIG1hdHJpeC4gRGVmYXVsdHMgdG8gMS5cbiAgICovXG4gIGdhaW4/OiBudW1iZXI7XG59XG5cbmV4cG9ydCBjbGFzcyBPcnRob2dvbmFsIGV4dGVuZHMgSW5pdGlhbGl6ZXIge1xuICAvKiogQG5vY29sbGFwc2UgKi9cbiAgc3RhdGljIGNsYXNzTmFtZSA9ICdPcnRob2dvbmFsJztcbiAgcmVhZG9ubHkgREVGQVVMVF9HQUlOID0gMTtcbiAgcHJvdGVjdGVkIHJlYWRvbmx5IGdhaW46IG51bWJlcjtcbiAgcHJvdGVjdGVkIHJlYWRvbmx5IHNlZWQ6IG51bWJlcjtcblxuICBjb25zdHJ1Y3RvcihhcmdzPzogT3J0aG9nb25hbEFyZ3MpIHtcbiAgICBzdXBlcigpO1xuICAgIHRoaXMuZ2FpbiA9IGFyZ3MuZ2FpbiA9PSBudWxsID8gdGhpcy5ERUZBVUxUX0dBSU4gOiBhcmdzLmdhaW47XG4gICAgdGhpcy5zZWVkID0gYXJncy5zZWVkO1xuXG4gICAgaWYgKHRoaXMuc2VlZCAhPSBudWxsKSB7XG4gICAgICB0aHJvdyBuZXcgTm90SW1wbGVtZW50ZWRFcnJvcihcbiAgICAgICAgICAnUmFuZG9tIHNlZWQgaXMgbm90IGltcGxlbWVudGVkIGZvciBPcnRob2dvbmFsIEluaXRpYWxpemVyIHlldC4nKTtcbiAgICB9XG4gIH1cblxuICBhcHBseShzaGFwZTogU2hhcGUsIGR0eXBlPzogRGF0YVR5cGUpOiBUZW5zb3Ige1xuICAgIHJldHVybiB0aWR5KCgpID0+IHtcbiAgICAgIGlmIChzaGFwZS5sZW5ndGggPCAyKSB7XG4gICAgICAgIHRocm93IG5ldyBOb3RJbXBsZW1lbnRlZEVycm9yKCdTaGFwZSBtdXN0IGJlIGF0IGxlYXN0IDJELicpO1xuICAgICAgfVxuICAgICAgaWYgKHNoYXBlWzBdICogc2hhcGVbMV0gPiAyMDAwKSB7XG4gICAgICAgIGNvbnNvbGUud2FybihcbiAgICAgICAgICAgIGBPcnRob2dvbmFsIGluaXRpYWxpemVyIGlzIGJlaW5nIGNhbGxlZCBvbiBhIG1hdHJpeCB3aXRoIG1vcmUgYCArXG4gICAgICAgICAgICBgdGhhbiAyMDAwICgke3NoYXBlWzBdICogc2hhcGVbMV19KSBlbGVtZW50czogYCArXG4gICAgICAgICAgICBgU2xvd25lc3MgbWF5IHJlc3VsdC5gKTtcbiAgICAgIH1cblxuICAgICAgLy8gVE9ETyhjYWlzKTogQWRkIHNlZWQgc3VwcG9ydC5cbiAgICAgIGNvbnN0IG5vcm1hbGl6ZWRTaGFwZSA9XG4gICAgICAgICAgc2hhcGVbMF0gPiBzaGFwZVsxXSA/IFtzaGFwZVsxXSwgc2hhcGVbMF1dIDogc2hhcGU7XG4gICAgICBjb25zdCBhID0gSy5yYW5kb21Ob3JtYWwobm9ybWFsaXplZFNoYXBlLCAwLCAxLCAnZmxvYXQzMicpIGFzIFRlbnNvcjJEO1xuICAgICAgbGV0IHEgPSBsaW5hbGcuZ3JhbVNjaG1pZHQoYSkgYXMgVGVuc29yMkQ7XG4gICAgICBpZiAoc2hhcGVbMF0gPiBzaGFwZVsxXSkge1xuICAgICAgICBxID0gdHJhbnNwb3NlKHEpO1xuICAgICAgfVxuICAgICAgcmV0dXJuIG11bCh0aGlzLmdhaW4sIHEpO1xuICAgIH0pO1xuICB9XG5cbiAgZ2V0Q29uZmlnKCk6IHNlcmlhbGl6YXRpb24uQ29uZmlnRGljdCB7XG4gICAgcmV0dXJuIHtcbiAgICAgIGdhaW46IHRoaXMuZ2FpbixcbiAgICAgIHNlZWQ6IHRoaXMuc2VlZCxcbiAgICB9O1xuICB9XG59XG5zZXJpYWxpemF0aW9uLnJlZ2lzdGVyQ2xhc3MoT3J0aG9nb25hbCk7XG5cbi8qKiBAZG9jaW5saW5lICovXG5leHBvcnQgdHlwZSBJbml0aWFsaXplcklkZW50aWZpZXIgPVxuICAgICdjb25zdGFudCd8J2dsb3JvdE5vcm1hbCd8J2dsb3JvdFVuaWZvcm0nfCdoZU5vcm1hbCd8J2hlVW5pZm9ybSd8J2lkZW50aXR5J3xcbiAgICAnbGVDdW5Ob3JtYWwnfCdsZUN1blVuaWZvcm0nfCdvbmVzJ3wnb3J0aG9nb25hbCd8J3JhbmRvbU5vcm1hbCd8XG4gICAgJ3JhbmRvbVVuaWZvcm0nfCd0cnVuY2F0ZWROb3JtYWwnfCd2YXJpYW5jZVNjYWxpbmcnfCd6ZXJvcyd8c3RyaW5nO1xuXG4vLyBNYXBzIHRoZSBKYXZhU2NyaXB0LWxpa2UgaWRlbnRpZmllciBrZXlzIHRvIHRoZSBjb3JyZXNwb25kaW5nIHJlZ2lzdHJ5XG4vLyBzeW1ib2xzLlxuZXhwb3J0IGNvbnN0IElOSVRJQUxJWkVSX0lERU5USUZJRVJfUkVHSVNUUllfU1lNQk9MX01BUDpcbiAgICB7W2lkZW50aWZpZXIgaW4gSW5pdGlhbGl6ZXJJZGVudGlmaWVyXTogc3RyaW5nfSA9IHtcbiAgICAgICdjb25zdGFudCc6ICdDb25zdGFudCcsXG4gICAgICAnZ2xvcm90Tm9ybWFsJzogJ0dsb3JvdE5vcm1hbCcsXG4gICAgICAnZ2xvcm90VW5pZm9ybSc6ICdHbG9yb3RVbmlmb3JtJyxcbiAgICAgICdoZU5vcm1hbCc6ICdIZU5vcm1hbCcsXG4gICAgICAnaGVVbmlmb3JtJzogJ0hlVW5pZm9ybScsXG4gICAgICAnaWRlbnRpdHknOiAnSWRlbnRpdHknLFxuICAgICAgJ2xlQ3VuTm9ybWFsJzogJ0xlQ3VuTm9ybWFsJyxcbiAgICAgICdsZUN1blVuaWZvcm0nOiAnTGVDdW5Vbmlmb3JtJyxcbiAgICAgICdvbmVzJzogJ09uZXMnLFxuICAgICAgJ29ydGhvZ29uYWwnOiAnT3J0aG9nb25hbCcsXG4gICAgICAncmFuZG9tTm9ybWFsJzogJ1JhbmRvbU5vcm1hbCcsXG4gICAgICAncmFuZG9tVW5pZm9ybSc6ICdSYW5kb21Vbmlmb3JtJyxcbiAgICAgICd0cnVuY2F0ZWROb3JtYWwnOiAnVHJ1bmNhdGVkTm9ybWFsJyxcbiAgICAgICd2YXJpYW5jZVNjYWxpbmcnOiAnVmFyaWFuY2VTY2FsaW5nJyxcbiAgICAgICd6ZXJvcyc6ICdaZXJvcydcbiAgICB9O1xuXG5mdW5jdGlvbiBkZXNlcmlhbGl6ZUluaXRpYWxpemVyKFxuICAgIGNvbmZpZzogc2VyaWFsaXphdGlvbi5Db25maWdEaWN0LFxuICAgIGN1c3RvbU9iamVjdHM6IHNlcmlhbGl6YXRpb24uQ29uZmlnRGljdCA9IHt9KTogSW5pdGlhbGl6ZXIge1xuICByZXR1cm4gZGVzZXJpYWxpemVLZXJhc09iamVjdChcbiAgICAgIGNvbmZpZywgc2VyaWFsaXphdGlvbi5TZXJpYWxpemF0aW9uTWFwLmdldE1hcCgpLmNsYXNzTmFtZU1hcCxcbiAgICAgIGN1c3RvbU9iamVjdHMsICdpbml0aWFsaXplcicpO1xufVxuXG5leHBvcnQgZnVuY3Rpb24gc2VyaWFsaXplSW5pdGlhbGl6ZXIoaW5pdGlhbGl6ZXI6IEluaXRpYWxpemVyKTpcbiAgICBzZXJpYWxpemF0aW9uLkNvbmZpZ0RpY3RWYWx1ZSB7XG4gIHJldHVybiBzZXJpYWxpemVLZXJhc09iamVjdChpbml0aWFsaXplcik7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBnZXRJbml0aWFsaXplcihpZGVudGlmaWVyOiBJbml0aWFsaXplcklkZW50aWZpZXJ8SW5pdGlhbGl6ZXJ8XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2VyaWFsaXphdGlvbi5Db25maWdEaWN0KTogSW5pdGlhbGl6ZXIge1xuICBpZiAodHlwZW9mIGlkZW50aWZpZXIgPT09ICdzdHJpbmcnKSB7XG4gICAgY29uc3QgY2xhc3NOYW1lID0gaWRlbnRpZmllciBpbiBJTklUSUFMSVpFUl9JREVOVElGSUVSX1JFR0lTVFJZX1NZTUJPTF9NQVAgP1xuICAgICAgICBJTklUSUFMSVpFUl9JREVOVElGSUVSX1JFR0lTVFJZX1NZTUJPTF9NQVBbaWRlbnRpZmllcl0gOlxuICAgICAgICBpZGVudGlmaWVyO1xuICAgIC8qIFdlIGhhdmUgZm91ciAnaGVscGVyJyBjbGFzc2VzIGZvciBjb21tb24gaW5pdGlhbGl6ZXJzIHRoYXRcbiAgICBhbGwgZ2V0IHNlcmlhbGl6ZWQgYXMgJ1ZhcmlhbmNlU2NhbGluZycgYW5kIHNob3VsZG4ndCBnbyB0aHJvdWdoXG4gICAgdGhlIGRlc2VyaWFsaXplSW5pdGlhbGl6ZXIgcGF0aHdheS4gKi9cbiAgICBpZiAoY2xhc3NOYW1lID09PSAnR2xvcm90Tm9ybWFsJykge1xuICAgICAgcmV0dXJuIG5ldyBHbG9yb3ROb3JtYWwoKTtcbiAgICB9IGVsc2UgaWYgKGNsYXNzTmFtZSA9PT0gJ0dsb3JvdFVuaWZvcm0nKSB7XG4gICAgICByZXR1cm4gbmV3IEdsb3JvdFVuaWZvcm0oKTtcbiAgICB9IGVsc2UgaWYgKGNsYXNzTmFtZSA9PT0gJ0hlTm9ybWFsJykge1xuICAgICAgcmV0dXJuIG5ldyBIZU5vcm1hbCgpO1xuICAgIH0gZWxzZSBpZiAoY2xhc3NOYW1lID09PSAnSGVVbmlmb3JtJykge1xuICAgICAgcmV0dXJuIG5ldyBIZVVuaWZvcm0oKTtcbiAgICB9IGVsc2UgaWYgKGNsYXNzTmFtZSA9PT0gJ0xlQ3VuTm9ybWFsJykge1xuICAgICAgcmV0dXJuIG5ldyBMZUN1bk5vcm1hbCgpO1xuICAgIH0gZWxzZSBpZiAoY2xhc3NOYW1lID09PSAnTGVDdW5Vbmlmb3JtJykge1xuICAgICAgcmV0dXJuIG5ldyBMZUN1blVuaWZvcm0oKTtcbiAgICB9IGVsc2Uge1xuICAgICAgY29uc3QgY29uZmlnOiBzZXJpYWxpemF0aW9uLkNvbmZpZ0RpY3QgPSB7fTtcbiAgICAgIGNvbmZpZ1snY2xhc3NOYW1lJ10gPSBjbGFzc05hbWU7XG4gICAgICBjb25maWdbJ2NvbmZpZyddID0ge307XG4gICAgICByZXR1cm4gZGVzZXJpYWxpemVJbml0aWFsaXplcihjb25maWcpO1xuICAgIH1cbiAgfSBlbHNlIGlmIChpZGVudGlmaWVyIGluc3RhbmNlb2YgSW5pdGlhbGl6ZXIpIHtcbiAgICByZXR1cm4gaWRlbnRpZmllcjtcbiAgfSBlbHNlIHtcbiAgICByZXR1cm4gZGVzZXJpYWxpemVJbml0aWFsaXplcihpZGVudGlmaWVyKTtcbiAgfVxufVxuIl19","/**\n * @license\n * Copyright 2018 Google LLC\n *\n * Use of this source code is governed by an MIT-style\n * license that can be found in the LICENSE file or at\n * https://opensource.org/licenses/MIT.\n * =============================================================================\n */\nimport { ValueError } from '../errors';\n// tslint:enable\n/**\n * Determine whether the input is an Array of Shapes.\n */\nexport function isArrayOfShapes(x) {\n return Array.isArray(x) && Array.isArray(x[0]);\n}\n/**\n * Special case of normalizing shapes to lists.\n *\n * @param x A shape or list of shapes to normalize into a list of Shapes.\n * @return A list of Shapes.\n */\nexport function normalizeShapeList(x) {\n if (x.length === 0) {\n return [];\n }\n if (!Array.isArray(x[0])) {\n return [x];\n }\n return x;\n}\n/**\n * Helper function to obtain exactly one Tensor.\n * @param xs: A single `tf.Tensor` or an `Array` of `tf.Tensor`s.\n * @return A single `tf.Tensor`. If `xs` is an `Array`, return the first one.\n * @throws ValueError: If `xs` is an `Array` and its length is not 1.\n */\nexport function getExactlyOneTensor(xs) {\n let x;\n if (Array.isArray(xs)) {\n if (xs.length !== 1) {\n throw new ValueError(`Expected Tensor length to be 1; got ${xs.length}`);\n }\n x = xs[0];\n }\n else {\n x = xs;\n }\n return x;\n}\n/**\n * Helper function to obtain exactly on instance of Shape.\n *\n * @param shapes Input single `Shape` or Array of `Shape`s.\n * @returns If input is a single `Shape`, return it unchanged. If the input is\n * an `Array` containing exactly one instance of `Shape`, return the instance.\n * Otherwise, throw a `ValueError`.\n * @throws ValueError: If input is an `Array` of `Shape`s, and its length is not\n * 1.\n */\nexport function getExactlyOneShape(shapes) {\n if (Array.isArray(shapes) && Array.isArray(shapes[0])) {\n if (shapes.length === 1) {\n shapes = shapes;\n return shapes[0];\n }\n else {\n throw new ValueError(`Expected exactly 1 Shape; got ${shapes.length}`);\n }\n }\n else {\n return shapes;\n }\n}\n//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidHlwZXNfdXRpbHMuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi8uLi90ZmpzLWxheWVycy9zcmMvdXRpbHMvdHlwZXNfdXRpbHMudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUE7Ozs7Ozs7O0dBUUc7QUFLSCxPQUFPLEVBQUMsVUFBVSxFQUFDLE1BQU0sV0FBVyxDQUFDO0FBRXJDLGdCQUFnQjtBQUVoQjs7R0FFRztBQUNILE1BQU0sVUFBVSxlQUFlLENBQUMsQ0FBZ0I7SUFDOUMsT0FBTyxLQUFLLENBQUMsT0FBTyxDQUFDLENBQUMsQ0FBQyxJQUFJLEtBQUssQ0FBQyxPQUFPLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUM7QUFDakQsQ0FBQztBQUVEOzs7OztHQUtHO0FBQ0gsTUFBTSxVQUFVLGtCQUFrQixDQUFDLENBQWdCO0lBQ2pELElBQUksQ0FBQyxDQUFDLE1BQU0sS0FBSyxDQUFDLEVBQUU7UUFDbEIsT0FBTyxFQUFFLENBQUM7S0FDWDtJQUNELElBQUksQ0FBQyxLQUFLLENBQUMsT0FBTyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxFQUFFO1FBQ3hCLE9BQU8sQ0FBQyxDQUFDLENBQVksQ0FBQztLQUN2QjtJQUNELE9BQU8sQ0FBWSxDQUFDO0FBQ3RCLENBQUM7QUFFRDs7Ozs7R0FLRztBQUNILE1BQU0sVUFBVSxtQkFBbUIsQ0FBQyxFQUFtQjtJQUNyRCxJQUFJLENBQVMsQ0FBQztJQUNkLElBQUksS0FBSyxDQUFDLE9BQU8sQ0FBQyxFQUFFLENBQUMsRUFBRTtRQUNyQixJQUFJLEVBQUUsQ0FBQyxNQUFNLEtBQUssQ0FBQyxFQUFFO1lBQ25CLE1BQU0sSUFBSSxVQUFVLENBQUMsdUNBQXVDLEVBQUUsQ0FBQyxNQUFNLEVBQUUsQ0FBQyxDQUFDO1NBQzFFO1FBQ0QsQ0FBQyxHQUFHLEVBQUUsQ0FBQyxDQUFDLENBQUMsQ0FBQztLQUNYO1NBQU07UUFDTCxDQUFDLEdBQUcsRUFBRSxDQUFDO0tBQ1I7SUFDRCxPQUFPLENBQUMsQ0FBQztBQUNYLENBQUM7QUFFRDs7Ozs7Ozs7O0dBU0c7QUFDSCxNQUFNLFVBQVUsa0JBQWtCLENBQUMsTUFBcUI7SUFDdEQsSUFBSSxLQUFLLENBQUMsT0FBTyxDQUFDLE1BQU0sQ0FBQyxJQUFJLEtBQUssQ0FBQyxPQUFPLENBQUMsTUFBTSxDQUFDLENBQUMsQ0FBQyxDQUFDLEVBQUU7UUFDckQsSUFBSSxNQUFNLENBQUMsTUFBTSxLQUFLLENBQUMsRUFBRTtZQUN2QixNQUFNLEdBQUcsTUFBaUIsQ0FBQztZQUMzQixPQUFPLE1BQU0sQ0FBQyxDQUFDLENBQUMsQ0FBQztTQUNsQjthQUFNO1lBQ0wsTUFBTSxJQUFJLFVBQVUsQ0FBQyxpQ0FBaUMsTUFBTSxDQUFDLE1BQU0sRUFBRSxDQUFDLENBQUM7U0FDeEU7S0FDRjtTQUFNO1FBQ0wsT0FBTyxNQUFlLENBQUM7S0FDeEI7QUFDSCxDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiLyoqXG4gKiBAbGljZW5zZVxuICogQ29weXJpZ2h0IDIwMTggR29vZ2xlIExMQ1xuICpcbiAqIFVzZSBvZiB0aGlzIHNvdXJjZSBjb2RlIGlzIGdvdmVybmVkIGJ5IGFuIE1JVC1zdHlsZVxuICogbGljZW5zZSB0aGF0IGNhbiBiZSBmb3VuZCBpbiB0aGUgTElDRU5TRSBmaWxlIG9yIGF0XG4gKiBodHRwczovL29wZW5zb3VyY2Uub3JnL2xpY2Vuc2VzL01JVC5cbiAqID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4gKi9cblxuLyogT3JpZ2luYWwgc291cmNlOiB1dGlscy9nZW5lcmljX3V0aWxzLnB5ICovXG5cbmltcG9ydCB7VGVuc29yfSBmcm9tICdAdGVuc29yZmxvdy90ZmpzLWNvcmUnO1xuaW1wb3J0IHtWYWx1ZUVycm9yfSBmcm9tICcuLi9lcnJvcnMnO1xuaW1wb3J0IHtTaGFwZX0gZnJvbSAnLi4va2VyYXNfZm9ybWF0L2NvbW1vbic7XG4vLyB0c2xpbnQ6ZW5hYmxlXG5cbi8qKlxuICogRGV0ZXJtaW5lIHdoZXRoZXIgdGhlIGlucHV0IGlzIGFuIEFycmF5IG9mIFNoYXBlcy5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGlzQXJyYXlPZlNoYXBlcyh4OiBTaGFwZXxTaGFwZVtdKTogYm9vbGVhbiB7XG4gIHJldHVybiBBcnJheS5pc0FycmF5KHgpICYmIEFycmF5LmlzQXJyYXkoeFswXSk7XG59XG5cbi8qKlxuICogU3BlY2lhbCBjYXNlIG9mIG5vcm1hbGl6aW5nIHNoYXBlcyB0byBsaXN0cy5cbiAqXG4gKiBAcGFyYW0geCBBIHNoYXBlIG9yIGxpc3Qgb2Ygc2hhcGVzIHRvIG5vcm1hbGl6ZSBpbnRvIGEgbGlzdCBvZiBTaGFwZXMuXG4gKiBAcmV0dXJuIEEgbGlzdCBvZiBTaGFwZXMuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBub3JtYWxpemVTaGFwZUxpc3QoeDogU2hhcGV8U2hhcGVbXSk6IFNoYXBlW10ge1xuICBpZiAoeC5sZW5ndGggPT09IDApIHtcbiAgICByZXR1cm4gW107XG4gIH1cbiAgaWYgKCFBcnJheS5pc0FycmF5KHhbMF0pKSB7XG4gICAgcmV0dXJuIFt4XSBhcyBTaGFwZVtdO1xuICB9XG4gIHJldHVybiB4IGFzIFNoYXBlW107XG59XG5cbi8qKlxuICogSGVscGVyIGZ1bmN0aW9uIHRvIG9idGFpbiBleGFjdGx5IG9uZSBUZW5zb3IuXG4gKiBAcGFyYW0geHM6IEEgc2luZ2xlIGB0Zi5UZW5zb3JgIG9yIGFuIGBBcnJheWAgb2YgYHRmLlRlbnNvcmBzLlxuICogQHJldHVybiBBIHNpbmdsZSBgdGYuVGVuc29yYC4gSWYgYHhzYCBpcyBhbiBgQXJyYXlgLCByZXR1cm4gdGhlIGZpcnN0IG9uZS5cbiAqIEB0aHJvd3MgVmFsdWVFcnJvcjogSWYgYHhzYCBpcyBhbiBgQXJyYXlgIGFuZCBpdHMgbGVuZ3RoIGlzIG5vdCAxLlxuICovXG5leHBvcnQgZnVuY3Rpb24gZ2V0RXhhY3RseU9uZVRlbnNvcih4czogVGVuc29yfFRlbnNvcltdKTogVGVuc29yIHtcbiAgbGV0IHg6IFRlbnNvcjtcbiAgaWYgKEFycmF5LmlzQXJyYXkoeHMpKSB7XG4gICAgaWYgKHhzLmxlbmd0aCAhPT0gMSkge1xuICAgICAgdGhyb3cgbmV3IFZhbHVlRXJyb3IoYEV4cGVjdGVkIFRlbnNvciBsZW5ndGggdG8gYmUgMTsgZ290ICR7eHMubGVuZ3RofWApO1xuICAgIH1cbiAgICB4ID0geHNbMF07XG4gIH0gZWxzZSB7XG4gICAgeCA9IHhzO1xuICB9XG4gIHJldHVybiB4O1xufVxuXG4vKipcbiAqIEhlbHBlciBmdW5jdGlvbiB0byBvYnRhaW4gZXhhY3RseSBvbiBpbnN0YW5jZSBvZiBTaGFwZS5cbiAqXG4gKiBAcGFyYW0gc2hhcGVzIElucHV0IHNpbmdsZSBgU2hhcGVgIG9yIEFycmF5IG9mIGBTaGFwZWBzLlxuICogQHJldHVybnMgSWYgaW5wdXQgaXMgYSBzaW5nbGUgYFNoYXBlYCwgcmV0dXJuIGl0IHVuY2hhbmdlZC4gSWYgdGhlIGlucHV0IGlzXG4gKiAgIGFuIGBBcnJheWAgY29udGFpbmluZyBleGFjdGx5IG9uZSBpbnN0YW5jZSBvZiBgU2hhcGVgLCByZXR1cm4gdGhlIGluc3RhbmNlLlxuICogICBPdGhlcndpc2UsIHRocm93IGEgYFZhbHVlRXJyb3JgLlxuICogQHRocm93cyBWYWx1ZUVycm9yOiBJZiBpbnB1dCBpcyBhbiBgQXJyYXlgIG9mIGBTaGFwZWBzLCBhbmQgaXRzIGxlbmd0aCBpcyBub3RcbiAqICAgMS5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGdldEV4YWN0bHlPbmVTaGFwZShzaGFwZXM6IFNoYXBlfFNoYXBlW10pOiBTaGFwZSB7XG4gIGlmIChBcnJheS5pc0FycmF5KHNoYXBlcykgJiYgQXJyYXkuaXNBcnJheShzaGFwZXNbMF0pKSB7XG4gICAgaWYgKHNoYXBlcy5sZW5ndGggPT09IDEpIHtcbiAgICAgIHNoYXBlcyA9IHNoYXBlcyBhcyBTaGFwZVtdO1xuICAgICAgcmV0dXJuIHNoYXBlc1swXTtcbiAgICB9IGVsc2Uge1xuICAgICAgdGhyb3cgbmV3IFZhbHVlRXJyb3IoYEV4cGVjdGVkIGV4YWN0bHkgMSBTaGFwZTsgZ290ICR7c2hhcGVzLmxlbmd0aH1gKTtcbiAgICB9XG4gIH0gZWxzZSB7XG4gICAgcmV0dXJuIHNoYXBlcyBhcyBTaGFwZTtcbiAgfVxufVxuIl19","/**\n * @license\n * Copyright 2018 Google LLC\n *\n * Use of this source code is governed by an MIT-style\n * license that can be found in the LICENSE file or at\n * https://opensource.org/licenses/MIT.\n * =============================================================================\n */\n/**\n * Count the elements in an Array of LayerVariables.\n *\n * @param weights: The LayerVariables of which the constituent numbers are to\n * be counted.\n * @returns A count of the elements in all the LayerVariables\n */\nexport function countParamsInWeights(weights) {\n let count = 0;\n for (const weight of weights) {\n if (weight.shape.length === 0) {\n count += 1;\n }\n else {\n count += weight.shape.reduce((a, b) => a * b);\n }\n }\n return count;\n}\n//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidmFyaWFibGVfdXRpbHMuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi8uLi90ZmpzLWxheWVycy9zcmMvdXRpbHMvdmFyaWFibGVfdXRpbHMudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUE7Ozs7Ozs7O0dBUUc7QUFJSDs7Ozs7O0dBTUc7QUFDSCxNQUFNLFVBQVUsb0JBQW9CLENBQUMsT0FBd0I7SUFDM0QsSUFBSSxLQUFLLEdBQUcsQ0FBQyxDQUFDO0lBQ2QsS0FBSyxNQUFNLE1BQU0sSUFBSSxPQUFPLEVBQUU7UUFDNUIsSUFBSSxNQUFNLENBQUMsS0FBSyxDQUFDLE1BQU0sS0FBSyxDQUFDLEVBQUU7WUFDN0IsS0FBSyxJQUFJLENBQUMsQ0FBQztTQUNaO2FBQU07WUFDTCxLQUFLLElBQUksTUFBTSxDQUFDLEtBQUssQ0FBQyxNQUFNLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxFQUFFLEVBQUUsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUM7U0FDL0M7S0FDRjtJQUNELE9BQU8sS0FBSyxDQUFDO0FBQ2YsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbIi8qKlxuICogQGxpY2Vuc2VcbiAqIENvcHlyaWdodCAyMDE4IEdvb2dsZSBMTENcbiAqXG4gKiBVc2Ugb2YgdGhpcyBzb3VyY2UgY29kZSBpcyBnb3Zlcm5lZCBieSBhbiBNSVQtc3R5bGVcbiAqIGxpY2Vuc2UgdGhhdCBjYW4gYmUgZm91bmQgaW4gdGhlIExJQ0VOU0UgZmlsZSBvciBhdFxuICogaHR0cHM6Ly9vcGVuc291cmNlLm9yZy9saWNlbnNlcy9NSVQuXG4gKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuICovXG5cbmltcG9ydCB7TGF5ZXJWYXJpYWJsZX0gZnJvbSAnLi4vdmFyaWFibGVzJztcblxuLyoqXG4gKiBDb3VudCB0aGUgZWxlbWVudHMgaW4gYW4gQXJyYXkgb2YgTGF5ZXJWYXJpYWJsZXMuXG4gKlxuICogQHBhcmFtIHdlaWdodHM6IFRoZSBMYXllclZhcmlhYmxlcyBvZiB3aGljaCB0aGUgY29uc3RpdHVlbnQgbnVtYmVycyBhcmUgdG9cbiAqICAgYmUgY291bnRlZC5cbiAqIEByZXR1cm5zIEEgY291bnQgb2YgdGhlIGVsZW1lbnRzIGluIGFsbCB0aGUgTGF5ZXJWYXJpYWJsZXNcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGNvdW50UGFyYW1zSW5XZWlnaHRzKHdlaWdodHM6IExheWVyVmFyaWFibGVbXSk6IG51bWJlciB7XG4gIGxldCBjb3VudCA9IDA7XG4gIGZvciAoY29uc3Qgd2VpZ2h0IG9mIHdlaWdodHMpIHtcbiAgICBpZiAod2VpZ2h0LnNoYXBlLmxlbmd0aCA9PT0gMCkge1xuICAgICAgY291bnQgKz0gMTtcbiAgICB9IGVsc2Uge1xuICAgICAgY291bnQgKz0gd2VpZ2h0LnNoYXBlLnJlZHVjZSgoYSwgYikgPT4gYSAqIGIpO1xuICAgIH1cbiAgfVxuICByZXR1cm4gY291bnQ7XG59XG4iXX0=","/**\n * @license\n * Copyright 2018 Google LLC\n *\n * Use of this source code is governed by an MIT-style\n * license that can be found in the LICENSE file or at\n * https://opensource.org/licenses/MIT.\n * =============================================================================\n */\nimport * as tfc from '@tensorflow/tfjs-core';\nimport { variableGrads } from '@tensorflow/tfjs-core';\nimport { getNextUniqueTensorId } from './backend/state';\nimport { getScopedTensorName, getUniqueTensorName } from './common';\nimport { NotImplementedError } from './errors';\nconst DEFAULT_VARIABLE_NAME_PREFIX = 'Variable';\n/**\n * A `tf.layers.LayerVariable` is similar to a `tf.Tensor` in that it has a\n * dtype and shape, but its value is mutable. The value is itself represented\n * as a`tf.Tensor`, and can be read with the `read()` method and updated with\n * the `write()` method.\n */\nexport class LayerVariable {\n /**\n * Construct Variable from a `tf.Tensor`.\n *\n * If not explicitly named, the Variable will be given a name with the\n * prefix 'Variable'. Variable names are unique. In the case of name\n * collision, suffixies '_' will be added to the name.\n *\n * @param val Initial value of the Variable.\n * @param name Name of the variable. If `null` or `undefined` is provided, it\n * will default a name with the prefix 'Variable'.\n * @param constraint Optional, projection function to be applied to the\n * variable after optimize updates\n * @throws ValueError if `name` is `null` or `undefined`.\n */\n constructor(val, dtype = 'float32', name = DEFAULT_VARIABLE_NAME_PREFIX, trainable = true, constraint = null) {\n this.dtype = dtype == null ? 'float32' : dtype;\n this.shape = val.shape;\n this.id = getNextUniqueTensorId();\n name = name == null ? DEFAULT_VARIABLE_NAME_PREFIX : name;\n this.originalName = getScopedTensorName(name);\n this.name = getUniqueTensorName(this.originalName);\n this.trainable_ = trainable;\n this.constraint = constraint;\n this.val = tfc.variable(val, this.trainable_, this.name, this.dtype);\n }\n /**\n * Get a snapshot of the Variable's value.\n *\n * The returned value is a snapshot of the Variable's value at the time of\n * the invocation. Future mutations in the value of the tensor will only\n * be reflected by future calls to this method.\n */\n read() {\n this.assertNotDisposed();\n return this.val;\n }\n /**\n * Update the value of the Variable.\n *\n * @param newVal: The new value to update to. Must be consistent with the\n * dtype and shape of the Variable.\n * @return This Variable.\n */\n write(newVal) {\n // TODO(cais): Once TF.js Core supports Tensor.dtype, check dtype match.\n this.assertNotDisposed();\n checkShapesMatch(this.val, newVal);\n // Skip updating if this is the exact same tensor.\n if (this.val.id !== newVal.id) {\n this.val.assign(newVal);\n if (this.constraint != null) {\n this.val.assign(this.constraint.apply(this.val));\n }\n }\n return this;\n }\n /**\n * Dispose this LayersVariable instance from memory.\n */\n dispose() {\n this.assertNotDisposed();\n this.val.dispose();\n }\n assertNotDisposed() {\n if (this.val.isDisposed) {\n throw new Error(`LayersVariable ${this.name} is already disposed.`);\n }\n }\n get trainable() {\n return this.trainable_;\n }\n set trainable(trainable) {\n this.trainable_ = trainable;\n this.val.trainable = trainable;\n }\n}\nfunction checkShapesMatch(x, y) {\n if (x.shape.toString() !== y.shape.toString()) {\n throw new Error('Shape mismatch: ' + JSON.stringify(x.shape) + ' vs. ' +\n JSON.stringify(y.shape));\n }\n}\n/**\n * Create a Variable.\n * @param x The initial value of the `Variable`.\n * @param dtype optional, the type of the variable.\n * @param name optional, the name of the variable, default provided by\n * Variable.\n * @param constraint optional, a constraint to be applied after every update.\n * @return The newly instantiated `Variable`.\n */\nexport function variable(x, dtype, name, constraint) {\n return new LayerVariable(x, dtype, name, true, constraint);\n}\n/**\n * Instantiates an all-zeros Variable and returns it.\n *\n * @param shape Shape of the tensor.\n * @param dtype DType of the tensor.\n * @param name Name of the tensor.\n * @return An all-zero Variable.\n */\nexport function zerosVariable(shape, dtype, name) {\n // TODO(cais): Implement logic for dtype.\n return new LayerVariable(tfc.zeros(shape), dtype, name);\n}\n/**\n * Instantiates an all-zeros tensor of the same shape as another tensor.\n *\n * @param x The other tensor.\n * @param dtype DType of the tensor.\n * @param name Name of the tensor.\n * @return A newly instantiated Variable.\n */\nexport function zerosLike(x, dtype, name) {\n return new LayerVariable(tfc.zerosLike(x), dtype, name);\n}\n/**\n * Instantiates an all-ones tensor and returns it.\n *\n * @param shape Shape of the tensor.\n * @param dtype DType of the tensor.\n * @param name Name of the tensor.\n * @return An all-ones Variable.\n */\nexport function onesVariable(shape, dtype, name) {\n // TODO(cais): Implement logic for dtype.\n const allocated = tfc.ones(shape);\n return new LayerVariable(allocated, dtype, name);\n}\n/**\n * Instantiates an all-ones tensor of the same shape as another tensor.\n *\n * @param x The other tensor.\n * @param dtype DType of the tensor.\n * @param name Name of the tensor.\n * @return A newly instantiated Variable.\n */\nexport function onesLike(x, dtype, name) {\n const allocated = tfc.onesLike(x);\n return new LayerVariable(allocated, dtype, name);\n}\n/**\n * Instantiate an identity matrix and returns it, as a Variable\n *\n * @param size Number of rows/columns.\n * @param dtype Data type of returned Variable.\n * @param name Name of returned Variable.\n * @return A Variable, an identity matrix.\n */\nexport function eyeVariable(size, dtype, name) {\n return new LayerVariable(tfc.eye(size), dtype, name);\n}\n/**\n * Get a Variable with uniform distribution of values.\n * @param shape Shape of the tensor.\n * @param minval Lower bound of the uniform distribution.\n * @param maxval Upper bound of the uniform distribution.\n * @param dtype\n * @param seed\n * @param name Optional name.\n * @return The uniform-random Variable.\n */\nexport function randomUniformVariable(shape, minval, maxval, dtype, seed, name = 'randomUniform') {\n return new LayerVariable(tfc.randomUniform(shape, minval, maxval, dtype), dtype, name);\n}\n/**\n * Get a Variable with truncated-normal distribution of values.\n * @param shape Shape of the tensor.\n * @param mean mean value of the normal distribution.\n * @param stddev standard deviation of the normal distribution.\n * @param dtype\n * @param seed\n * @param name Optional name.\n * @return The truncated-normal-random Variable.\n */\nexport function truncatedNormalVariable(shape, mean = 0.0, stddev = 1.0, dtype, seed, name = 'truncatedNormal') {\n // TODO(cais): Implement logic for dtype and seed once they are supported\n // by deeplearn.js.\n dtype = dtype || 'float32';\n if (dtype !== 'float32' && dtype !== 'int32') {\n throw new NotImplementedError(`randomNormal does not support dType ${dtype}.`);\n }\n return new LayerVariable(tfc.truncatedNormal(shape, mean, stddev, dtype, seed), dtype, name);\n}\n/**\n * Get a Variable with normal distribution of values.\n * @param shape Shape of the tensor.\n * @param mean mean value of the normal distribution.\n * @param stddev standard deviation of the normal distribution.\n * @param dtype\n * @param seed\n * @param name Optional name.\n * @return The truncated-normal-random Variable.\n */\nexport function randomNormalVariable(shape, mean = 0.0, stddev = 1.0, dtype, seed, name = 'randomNormal') {\n dtype = dtype || 'float32';\n if (dtype !== 'float32' && dtype !== 'int32') {\n throw new NotImplementedError(`randomNormalVariable does not support dType ${dtype}.`);\n }\n return new LayerVariable(tfc.randomNormal(shape, mean, stddev, dtype, seed), dtype, name);\n}\n/**\n * Update the value of a Variable.\n * @param x The Variable to be updated.\n * @param xNew The new value to update to.\n * @return The Variable updated.\n */\nexport function update(x, xNew) {\n return x.write(xNew);\n}\n/**\n * Update the value of a Variable by adding an increment.\n * @param x The Variable to be updated.\n * @param increment The incrment to add to `x`.\n * @return The Variable updated.\n */\nexport function updateAdd(x, increment) {\n return x.write(tfc.add(x.read(), increment));\n}\n/**\n * Update the value of a Variable by subtracting a decrement.\n * @param x The Variable to be updated.\n * @param decrement The decrement to subtract from `x`.\n * @return The Variable updated.\n */\nexport function updateSub(x, decrement) {\n return x.write(tfc.sub(x.read(), decrement));\n}\n/**\n * Get the values of an array of Variables.\n *\n * @param tensors An `Array` of `Variable`s to get the values of.\n * @return The values of the inputs, as an `Array` of`tf.Tensor`s.\n */\nexport function batchGetValue(xs) {\n return xs.map(x => x.read());\n}\n/**\n * Update the value of multiple Variables at once.\n *\n * @param variablesAndValues An `Array`, each element is of type\n * [Variable, Tensor]. The first item is the\n * `Variable` of which the value is to be updated. The second item\n * carries the new value.\n */\nexport function batchSetValue(variablesAndValues) {\n variablesAndValues.forEach(variableAndValue => {\n const variable = variableAndValue[0];\n variable.write(variableAndValue[1]);\n });\n}\n/**\n * Returns the gradients of `variables` w.r.t. the return value of `lossFn`.\n * @param lossFn A function which returns a Scalar to be used as the function\n * value (i.e., numerator) for differentiation.\n * @param variables List of variables to be used as the independent variables\n * (i.e., denominator) for differentiation.\n * @returns An Array of gradients tensors.\n */\nexport function gradients(lossFn, variables) {\n // TODO(cais): The return type signature can be simplified if deeplearn makes\n // the corresponding type public.\n const variableList = variables.map(variable => variable.read());\n const valudAndGrads = variableGrads(lossFn, variableList);\n return variables.map(variable => valudAndGrads.grads[variable.name]);\n}\n//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidmFyaWFibGVzLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vdGZqcy1sYXllcnMvc3JjL3ZhcmlhYmxlcy50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQTs7Ozs7Ozs7R0FRRztBQUVILE9BQU8sS0FBSyxHQUFHLE1BQU0sdUJBQXVCLENBQUM7QUFDN0MsT0FBTyxFQUFtQixhQUFhLEVBQUMsTUFBTSx1QkFBdUIsQ0FBQztBQUV0RSxPQUFPLEVBQUMscUJBQXFCLEVBQUMsTUFBTSxpQkFBaUIsQ0FBQztBQUN0RCxPQUFPLEVBQUMsbUJBQW1CLEVBQUUsbUJBQW1CLEVBQUMsTUFBTSxVQUFVLENBQUM7QUFFbEUsT0FBTyxFQUFDLG1CQUFtQixFQUFDLE1BQU0sVUFBVSxDQUFDO0FBSTdDLE1BQU0sNEJBQTRCLEdBQUcsVUFBVSxDQUFDO0FBRWhEOzs7OztHQUtHO0FBQ0gsTUFBTSxPQUFPLGFBQWE7SUFleEI7Ozs7Ozs7Ozs7Ozs7T0FhRztJQUNILFlBQ0ksR0FBVyxFQUFFLFFBQWtCLFNBQVMsRUFDeEMsSUFBSSxHQUFHLDRCQUE0QixFQUFFLFNBQVMsR0FBRyxJQUFJLEVBQ3JELGFBQXlCLElBQUk7UUFDL0IsSUFBSSxDQUFDLEtBQUssR0FBRyxLQUFLLElBQUksSUFBSSxDQUFDLENBQUMsQ0FBQyxTQUFTLENBQUMsQ0FBQyxDQUFDLEtBQUssQ0FBQztRQUMvQyxJQUFJLENBQUMsS0FBSyxHQUFHLEdBQUcsQ0FBQyxLQUFLLENBQUM7UUFDdkIsSUFBSSxDQUFDLEVBQUUsR0FBRyxxQkFBcUIsRUFBRSxDQUFDO1FBRWxDLElBQUksR0FBRyxJQUFJLElBQUksSUFBSSxDQUFDLENBQUMsQ0FBQyw0QkFBNEIsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDO1FBQzFELElBQUksQ0FBQyxZQUFZLEdBQUcsbUJBQW1CLENBQUMsSUFBSSxDQUFDLENBQUM7UUFDOUMsSUFBSSxDQUFDLElBQUksR0FBRyxtQkFBbUIsQ0FBQyxJ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Q3JCLE1BQXdCLEVBQUUsU0FBMEI7SUFDdEQsNkVBQTZFO0lBQzdFLG1DQUFtQztJQUNuQyxNQUFNLFlBQVksR0FDZCxTQUFTLENBQUMsR0FBRyxDQUFDLFFBQVEsQ0FBQyxFQUFFLENBQUMsUUFBUSxDQUFDLElBQUksRUFBa0IsQ0FBQyxDQUFDO0lBQy9ELE1BQU0sYUFBYSxHQUFHLGFBQWEsQ0FBQyxNQUFNLEVBQUUsWUFBWSxDQUFDLENBQUM7SUFDMUQsT0FBTyxTQUFTLENBQUMsR0FBRyxDQUFDLFFBQVEsQ0FBQyxFQUFFLENBQUMsYUFBYSxDQUFDLEtBQUssQ0FBQyxRQUFRLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQztBQUN2RSxDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiLyoqXG4gKiBAbGljZW5zZVxuICogQ29weXJpZ2h0IDIwMTggR29vZ2xlIExMQ1xuICpcbiAqIFVzZSBvZiB0aGlzIHNvdXJjZSBjb2RlIGlzIGdvdmVybmVkIGJ5IGFuIE1JVC1zdHlsZVxuICogbGljZW5zZSB0aGF0IGNhbiBiZSBmb3VuZCBpbiB0aGUgTElDRU5TRSBmaWxlIG9yIGF0XG4gKiBodHRwczovL29wZW5zb3VyY2Uub3JnL2xpY2Vuc2VzL01JVC5cbiAqID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4gKi9cblxuaW1wb3J0ICogYXMgdGZjIGZyb20gJ0B0ZW5zb3JmbG93L3RmanMtY29yZSc7XG5pbXBvcnQge0RhdGFUeXBlLCBUZW5zb3IsIHZhcmlhYmxlR3JhZHN9IGZyb20gJ0B0ZW5zb3JmbG93L3RmanMtY29yZSc7XG5cbmltcG9ydCB7Z2V0TmV4dFVuaXF1ZVRlbnNvcklkfSBmcm9tICcuL2JhY2tlbmQvc3RhdGUnO1xuaW1wb3J0IHtnZXRTY29wZWRUZW5zb3JOYW1lLCBnZXRVbmlxdWVUZW5zb3JOYW1lfSBmcm9tICcuL2NvbW1vbic7XG5pbXBvcnQge0NvbnN0cmFpbnR9IGZyb20gJy4vY29uc3RyYWludHMnO1xuaW1wb3J0IHtOb3RJbXBsZW1lbnRlZEVycm9yfSBmcm9tICcuL2Vycm9ycyc7XG5pbXBvcnQge1NoYXBlfSBmcm9tICcuL2tlcmFzX2Zvcm1hdC9jb21tb24nO1xuaW1wb3J0IHtIYXNTaGFwZX0gZnJvbSAnLi90eXBlcyc7XG5cbmNvbnN0IERFRkFVTFRfVkFSSUFCTEVfTkFNRV9QUkVGSVggPSAnVmFyaWFibGUnO1xuXG4vKipcbiAqIEEgYHRmLmxheWVycy5MYXllclZhcmlhYmxlYCBpcyBzaW1pbGFyIHRvIGEgYHRmLlRlbnNvcmAgaW4gdGhhdCBpdCBoYXMgYVxuICogZHR5cGUgYW5kIHNoYXBlLCBidXQgaXRzIHZhbHVlIGlzIG11dGFibGUuICBUaGUgdmFsdWUgaXMgaXRzZWxmIHJlcHJlc2VudGVkXG4gKiBhcyBhYHRmLlRlbnNvcmAsIGFuZCBjYW4gYmUgcmVhZCB3aXRoIHRoZSBgcmVhZCgpYCBtZXRob2QgYW5kIHVwZGF0ZWQgd2l0aFxuICogdGhlIGB3cml0ZSgpYCBtZXRob2QuXG4gKi9cbmV4cG9ydCBjbGFzcyBMYXllclZhcmlhYmxlIHtcbiAgcmVhZG9ubHkgZHR5cGU6IERhdGFUeXBlO1xuICByZWFkb25seSBzaGFwZTogU2hhcGU7XG5cbiAgcmVhZG9ubHkgaWQ6IG51bWJlcjtcbiAgLy8gVGhlIGZ1bGx5IHNjb3BlZCBuYW1lIG9mIHRoaXMgVmFyaWFibGUsIGluY2x1ZGluZyBhIHVuaXF1ZSBzdWZmaXggaWYgbmVlZGVkXG4gIHJlYWRvbmx5IG5hbWU6IHN0cmluZztcbiAgLy8gVGhlIG9yaWdpbmFsbHkgcmVxdWVzdGVkIGZ1bGx5IHNjb3BlZCBuYW1lIG9mIHRoaXMgVmFyaWFibGUsIG5vdCBpbmNsdWRpbmdcbiAgLy8gYW55IHVuaXF1ZSBzdWZmaXguICBUaGlzIG1heSBiZSBuZWVkZWQgd2hlbiByZXN0b3Jpbmcgd2VpZ2h0cyBiZWNhdXNlIHRoaXNcbiAgLy8gb3JpZ2luYWwgbmFtZSBpcyB1c2VkIGFzIGEga2V5LlxuICByZWFkb25seSBvcmlnaW5hbE5hbWU6IHN0cmluZztcbiAgcHJpdmF0ZSB0cmFpbmFibGVfOiBib29sZWFuO1xuXG4gIHByb3RlY3RlZCByZWFkb25seSB2YWw6IHRmYy5WYXJpYWJsZTtcbiAgcmVhZG9ubHkgY29uc3RyYWludDogQ29uc3RyYWludDtcbiAgLyoqXG4gICAqIENvbnN0cnVjdCBWYXJpYWJsZSBmcm9tIGEgYHRmLlRlbnNvcmAuXG4gICAqXG4gICAqIElmIG5vdCBleHBsaWNpdGx5IG5hbWVkLCB0aGUgVmFyaWFibGUgd2lsbCBiZSBnaXZlbiBhIG5hbWUgd2l0aCB0aGVcbiAgICogcHJlZml4ICdWYXJpYWJsZScuIFZhcmlhYmxlIG5hbWVzIGFyZSB1bmlxdWUuIEluIHRoZSBjYXNlIG9mIG5hbWVcbiAgICogY29sbGlzaW9uLCBzdWZmaXhpZXMgJ188bnVtPicgd2lsbCBiZSBhZGRlZCB0byB0aGUgbmFtZS5cbiAgICpcbiAgICogQHBhcmFtIHZhbCBJbml0aWFsIHZhbHVlIG9mIHRoZSBWYXJpYWJsZS5cbiAgICogQHBhcmFtIG5hbWUgTmFtZSBvZiB0aGUgdmFyaWFibGUuIElmIGBudWxsYCBvciBgdW5kZWZpbmVkYCBpcyBwcm92aWRlZCwgaXRcbiAgICogICB3aWxsIGRlZmF1bHQgYSBuYW1lIHdpdGggdGhlIHByZWZpeCAnVmFyaWFibGUnLlxuICAgKiBAcGFyYW0gY29uc3RyYWludCBPcHRpb25hbCwgcHJvamVjdGlvbiBmdW5jdGlvbiB0byBiZSBhcHBsaWVkIHRvIHRoZVxuICAgKiB2YXJpYWJsZSBhZnRlciBvcHRpbWl6ZSB1cGRhdGVzXG4gICAqIEB0aHJvd3MgVmFsdWVFcnJvciBpZiBgbmFtZWAgaXMgYG51bGxgIG9yIGB1bmRlZmluZWRgLlxuICAgKi9cbiAgY29uc3RydWN0b3IoXG4gICAgICB2YWw6IFRlbnNvciwgZHR5cGU6IERhdGFUeXBlID0gJ2Zsb2F0MzInLFxuICAgICAgbmFtZSA9IERFRkFVTFRfVkFSSUFCTEVfTkFNRV9QUkVGSVgsIHRyYWluYWJsZSA9IHRydWUsXG4gICAgICBjb25zdHJhaW50OiBDb25zdHJhaW50ID0gbnVsbCkge1xuICAgIHRoaXMuZHR5cGUgPSBkdHlwZSA9PSBudWxsID8gJ2Zsb2F0MzInIDogZHR5cGU7XG4gICAgdGhpcy5zaGFwZSA9IHZhbC5zaGFwZTtcbiAgICB0aGlzLmlkID0gZ2V0TmV4dFVuaXF1ZVRlbnNvcklkKCk7XG5cbiAgICBuYW1lID0gbmFtZSA9PSBudWxsID8gREVGQVVMVF9WQVJJQUJMRV9OQU1FX1BSRUZJWCA6IG5hbWU7XG4gICAgdGhpcy5vcmlnaW5hbE5hbWUgPSBnZXRTY29wZWRUZW5zb3JOYW1lKG5hbWUpO1xuICAgIHRoaXMubmFtZSA9IGdldFVuaXF1ZVRlbnNvck5hbWUodGhpcy5vcmlnaW5hbE5hbWUpO1xuXG4gICAgdGhpcy50cmFpbmFibGVfID0gdHJhaW5hYmxlO1xuICAgIHRoaXMuY29uc3RyYWludCA9IGNvbnN0cmFpbnQ7XG5cbiAgICB0aGlzLnZhbCA9IHRmYy52YXJpYWJsZSh2YWwsIHRoaXMudHJhaW5hYmxlXywgdGhpcy5uYW1lLCB0aGlzLmR0eXBlKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBHZXQgYSBzbmFwc2hvdCBvZiB0aGUgVmFyaWFibGUncyB2YWx1ZS5cbiAgICpcbiAgICogVGhlIHJldHVybmVkIHZhbHVlIGlzIGEgc25hcHNob3Qgb2YgdGhlIFZhcmlhYmxlJ3MgdmFsdWUgYXQgdGhlIHRpbWUgb2ZcbiAgICogdGhlIGludm9jYXRpb24uIEZ1dHVyZSBtdXRhdGlvbnMgaW4gdGhlIHZhbHVlIG9mIHRoZSB0ZW5zb3Igd2lsbCBvbmx5XG4gICAqIGJlIHJlZmxlY3RlZCBieSBmdXR1cmUgY2FsbHMgdG8gdGhpcyBtZXRob2QuXG4gICAqL1xuICByZWFkKCk6IFRlbnNvciB7XG4gICAgdGhpcy5hc3NlcnROb3REaXNwb3NlZCgpO1xuICAgIHJldHVybiB0aGlzLnZhbDtcbiAgfVxuXG4gIC8qKlxuICAgKiBVcGRhdGUgdGhlIHZhbHVlIG9mIHRoZSBWYXJpYWJsZS5cbiAgICpcbiAgICogQHBhcmFtIG5ld1ZhbDogVGhlIG5ldyB2YWx1ZSB0byB1cGRhdGUgdG8uIE11c3QgYmUgY29uc2lzdGVudCB3aXRoIHRoZVxuICAgKiAgIGR0eXBlIGFuZCBzaGFwZSBvZiB0aGUgVmFyaWFibGUuXG4gICAqIEByZXR1cm4gVGhpcyBWYXJpYWJsZS5cbiAgICovXG4gIHdyaXRlKG5ld1ZhbDogVGVuc29yKSB7XG4gICAgLy8gVE9ETyhjYWlzKTogT25jZSAgVEYuanMgQ29yZSBzdXBwb3J0cyBUZW5zb3IuZHR5cGUsIGNoZWNrIGR0eXBlIG1hdGNoLlxuICAgIHRoaXMuYXNzZXJ0Tm90RGlzcG9zZWQoKTtcbiAgICBjaGVja1NoYXBlc01hdGNoKHRoaXMudmFsLCBuZXdWYWwpO1xuICAgIC8vIFNraXAgdXBkYXRpbmcgaWYgdGhpcyBpcyB0aGUgZXhhY3Qgc2FtZSB0ZW5zb3IuXG4gICAgaWYgKHRoaXMudmFsLmlkICE9PSBuZXdWYWwuaWQpIHtcbiAgICAgIHRoaXMudmFsLmFzc2lnbihuZXdWYWwpO1xuICAgICAgaWYgKHRoaXMuY29uc3RyYWludCAhPSBudWxsKSB7XG4gICAgICAgIHRoaXMudmFsLmFzc2lnbih0aGlzLmNvbnN0cmFpbnQuYXBwbHkodGhpcy52YWwpKTtcbiAgICAgIH1cbiAgICB9XG4gICAgcmV0dXJuIHRoaXM7XG4gIH1cblxuICAvKipcbiAgICogRGlzcG9zZSB0aGlzIExheWVyc1ZhcmlhYmxlIGluc3RhbmNlIGZyb20gbWVtb3J5LlxuICAgKi9cbiAgZGlzcG9zZSgpOiB2b2lkIHtcbiAgICB0aGlzLmFzc2VydE5vdERpc3Bvc2VkKCk7XG4gICAgdGhpcy52YWwuZGlzcG9zZSgpO1xuICB9XG5cbiAgcHJvdGVjdGVkIGFzc2VydE5vdERpc3Bvc2VkKCk6IHZvaWQge1xuICAgIGlmICh0aGlzLnZhbC5pc0Rpc3Bvc2VkKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoYExheWVyc1ZhcmlhYmxlICR7dGhpcy5uYW1lfSBpcyBhbHJlYWR5IGRpc3Bvc2VkLmApO1xuICAgIH1cbiAgfVxuXG4gIGdldCB0cmFpbmFibGUoKTogYm9vbGVhbiB7XG4gICAgcmV0dXJuIHRoaXMudHJhaW5hYmxlXztcbiAgfVxuXG4gIHNldCB0cmFpbmFibGUodHJhaW5hYmxlOiBib29sZWFuKSB7XG4gICAgdGhpcy50cmFpbmFibGVfID0gdHJhaW5hYmxlO1xuICAgIHRoaXMudmFsLnRyYWluYWJsZSA9IHRyYWluYWJsZTtcbiAgfVxufVxuXG5mdW5jdGlvbiBjaGVja1NoYXBlc01hdGNoKHg6IEhhc1NoYXBlLCB5OiBIYXNTaGFwZSk6IHZvaWQge1xuICBpZiAoeC5zaGFwZS50b1N0cmluZygpICE9PSB5LnNoYXBlLnRvU3RyaW5nKCkpIHtcbiAgICB0aHJvdyBuZXcgRXJyb3IoXG4gICAgICAgICdTaGFwZSBtaXNtYXRjaDogJyArIEpTT04uc3RyaW5naWZ5KHguc2hhcGUpICsgJyB2cy4gJyArXG4gICAgICAgIEpTT04uc3RyaW5naWZ5KHkuc2hhcGUpKTtcbiAgfVxufVxuXG4vKipcbiAqIENyZWF0ZSBhIFZhcmlhYmxlLlxuICogQHBhcmFtIHggVGhlIGluaXRpYWwgdmFsdWUgb2YgdGhlIGBWYXJpYWJsZWAuXG4gKiBAcGFyYW0gZHR5cGUgb3B0aW9uYWwsIHRoZSB0eXBlIG9mIHRoZSB2YXJpYWJsZS5cbiAqIEBwYXJhbSBuYW1lIG9wdGlvbmFsLCB0aGUgbmFtZSBvZiB0aGUgdmFyaWFibGUsIGRlZmF1bHQgcHJvdmlkZWQgYnlcbiAqIFZhcmlhYmxlLlxuICogQHBhcmFtIGNvbnN0cmFpbnQgb3B0aW9uYWwsIGEgY29uc3RyYWludCB0byBiZSBhcHBsaWVkIGFmdGVyIGV2ZXJ5IHVwZGF0ZS5cbiAqIEByZXR1cm4gVGhlIG5ld2x5IGluc3RhbnRpYXRlZCBgVmFyaWFibGVgLlxuICovXG5leHBvcnQgZnVuY3Rpb24gdmFyaWFibGUoXG4gICAgeDogVGVuc29yLCBkdHlwZT86IERhdGFUeXBlLCBuYW1lPzogc3RyaW5nLFxuICAgIGNvbnN0cmFpbnQ/OiBDb25zdHJhaW50KTogTGF5ZXJWYXJpYWJsZSB7XG4gIHJldHVybiBuZXcgTGF5ZXJWYXJpYWJsZSh4LCBkdHlwZSwgbmFtZSwgdHJ1ZSwgY29uc3RyYWludCk7XG59XG5cbi8qKlxuICogSW5zdGFudGlhdGVzIGFuIGFsbC16ZXJvcyBWYXJpYWJsZSBhbmQgcmV0dXJucyBpdC5cbiAqXG4gKiBAcGFyYW0gc2hhcGUgU2hhcGUgb2YgdGhlIHRlbnNvci5cbiAqIEBwYXJhbSBkdHlwZSBEVHlwZSBvZiB0aGUgdGVuc29yLlxuICogQHBhcmFtIG5hbWUgTmFtZSBvZiB0aGUgdGVuc29yLlxuICogQHJldHVybiBBbiBhbGwtemVybyBWYXJpYWJsZS5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHplcm9zVmFyaWFibGUoXG4gICAgc2hhcGU6IFNoYXBlLCBkdHlwZT86IERhdGFUeXBlLCBuYW1lPzogc3RyaW5nKTogTGF5ZXJWYXJpYWJsZSB7XG4gIC8vIFRPRE8oY2Fpcyk6IEltcGxlbWVudCBsb2dpYyBmb3IgZHR5cGUuXG4gIHJldHVybiBuZXcgTGF5ZXJWYXJpYWJsZSh0ZmMuemVyb3Moc2hhcGUpLCBkdHlwZSwgbmFtZSk7XG59XG5cbi8qKlxuICogSW5zdGFudGlhdGVzIGFuIGFsbC16ZXJvcyB0ZW5zb3Igb2YgdGhlIHNhbWUgc2hhcGUgYXMgYW5vdGhlciB0ZW5zb3IuXG4gKlxuICogQHBhcmFtIHggVGhlIG90aGVyIHRlbnNvci5cbiAqIEBwYXJhbSBkdHlwZSBEVHlwZSBvZiB0aGUgdGVuc29yLlxuICogQHBhcmFtIG5hbWUgTmFtZSBvZiB0aGUgdGVuc29yLlxuICogQHJldHVybiBBIG5ld2x5IGluc3RhbnRpYXRlZCBWYXJpYWJsZS5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHplcm9zTGlrZShcbiAgICB4OiBUZW5zb3IsIGR0eXBlPzogRGF0YVR5cGUsIG5hbWU/OiBzdHJpbmcpOiBMYXllclZhcmlhYmxlIHtcbiAgcmV0dXJuIG5ldyBMYXllclZhcmlhYmxlKHRmYy56ZXJvc0xpa2UoeCksIGR0eXBlLCBuYW1lKTtcbn1cblxuLyoqXG4gKiBJbnN0YW50aWF0ZXMgYW4gYWxsLW9uZXMgdGVuc29yIGFuZCByZXR1cm5zIGl0LlxuICpcbiAqIEBwYXJhbSBzaGFwZSBTaGFwZSBvZiB0aGUgdGVuc29yLlxuICogQHBhcmFtIGR0eXBlIERUeXBlIG9mIHRoZSB0ZW5zb3IuXG4gKiBAcGFyYW0gbmFtZSBOYW1lIG9mIHRoZSB0ZW5zb3IuXG4gKiBAcmV0dXJuIEFuIGFsbC1vbmVzIFZhcmlhYmxlLlxuICovXG5leHBvcnQgZnVuY3Rpb24gb25lc1ZhcmlhYmxlKFxuICAgIHNoYXBlOiBTaGFwZSwgZHR5cGU/OiBEYXRhVHlwZSwgbmFtZT86IHN0cmluZyk6IExheWVyVmFyaWFibGUge1xuICAvLyBUT0RPKGNhaXMpOiBJbXBsZW1lbnQgbG9naWMgZm9yIGR0eXBlLlxuICBjb25zdCBhbGxvY2F0ZWQgPSB0ZmMub25lcyhzaGFwZSk7XG4gIHJldHVybiBuZXcgTGF5ZXJWYXJpYWJsZShhbGxvY2F0ZWQsIGR0eXBlLCBuYW1lKTtcbn1cblxuLyoqXG4gKiBJbnN0YW50aWF0ZXMgYW4gYWxsLW9uZXMgdGVuc29yIG9mIHRoZSBzYW1lIHNoYXBlIGFzIGFub3RoZXIgdGVuc29yLlxuICpcbiAqIEBwYXJhbSB4IFRoZSBvdGhlciB0ZW5zb3IuXG4gKiBAcGFyYW0gZHR5cGUgRFR5cGUgb2YgdGhlIHRlbnNvci5cbiAqIEBwYXJhbSBuYW1lIE5hbWUgb2YgdGhlIHRlbnNvci5cbiAqIEByZXR1cm4gQSBuZXdseSBpbnN0YW50aWF0ZWQgVmFyaWFibGUuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBvbmVzTGlrZShcbiAgICB4OiBUZW5zb3IsIGR0eXBlPzogRGF0YVR5cGUsIG5hbWU/OiBzdHJpbmcpOiBMYXllclZhcmlhYmxlIHtcbiAgY29uc3QgYWxsb2NhdGVkID0gdGZjLm9uZXNMaWtlKHgpO1xuICByZXR1cm4gbmV3IExheWVyVmFyaWFibGUoYWxsb2NhdGVkLCBkdHlwZSwgbmFtZSk7XG59XG5cbi8qKlxuICogSW5zdGFudGlhdGUgYW4gaWRlbnRpdHkgbWF0cml4IGFuZCByZXR1cm5zIGl0LCBhcyBhIFZhcmlhYmxlXG4gKlxuICogQHBhcmFtIHNpemUgTnVtYmVyIG9mIHJvd3MvY29sdW1ucy5cbiAqIEBwYXJhbSBkdHlwZSBEYXRhIHR5cGUgb2YgcmV0dXJuZWQgVmFyaWFibGUuXG4gKiBAcGFyYW0gbmFtZSBOYW1lIG9mIHJldHVybmVkIFZhcmlhYmxlLlxuICogQHJldHVybiBBIFZhcmlhYmxlLCBhbiBpZGVudGl0eSBtYXRyaXguXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBleWVWYXJpYWJsZShcbiAgICBzaXplOiBudW1iZXIsIGR0eXBlPzogRGF0YVR5cGUsIG5hbWU/OiBzdHJpbmcpOiBMYXllclZhcmlhYmxlIHtcbiAgcmV0dXJuIG5ldyBMYXllclZhcmlhYmxlKHRmYy5leWUoc2l6ZSksIGR0eXBlLCBuYW1lKTtcbn1cblxuLyoqXG4gKiBHZXQgYSBWYXJpYWJsZSB3aXRoIHVuaWZvcm0gZGlzdHJpYnV0aW9uIG9mIHZhbHVlcy5cbiAqIEBwYXJhbSBzaGFwZSBTaGFwZSBvZiB0aGUgdGVuc29yLlxuICogQHBhcmFtIG1pbnZhbCBMb3dlciBib3VuZCBvZiB0aGUgdW5pZm9ybSBkaXN0cmlidXRpb24uXG4gKiBAcGFyYW0gbWF4dmFsIFVwcGVyIGJvdW5kIG9mIHRoZSB1bmlmb3JtIGRpc3RyaWJ1dGlvbi5cbiAqIEBwYXJhbSBkdHlwZVxuICogQHBhcmFtIHNlZWRcbiAqIEBwYXJhbSBuYW1lIE9wdGlvbmFsIG5hbWUuXG4gKiBAcmV0dXJuIFRoZSB1bmlmb3JtLXJhbmRvbSBWYXJpYWJsZS5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHJhbmRvbVVuaWZvcm1WYXJpYWJsZShcbiAgICBzaGFwZTogU2hhcGUsIG1pbnZhbDogbnVtYmVyLCBtYXh2YWw6IG51bWJlciwgZHR5cGU/OiBEYXRhVHlwZSxcbiAgICBzZWVkPzogbnVtYmVyLCBuYW1lID0gJ3JhbmRvbVVuaWZvcm0nKTogTGF5ZXJWYXJpYWJsZSB7XG4gIHJldHVybiBuZXcgTGF5ZXJWYXJpYWJsZShcbiAgICAgIHRmYy5yYW5kb21Vbmlmb3JtKHNoYXBlLCBtaW52YWwsIG1heHZhbCwgZHR5cGUpLCBkdHlwZSwgbmFtZSk7XG59XG5cbi8qKlxuICogR2V0IGEgVmFyaWFibGUgd2l0aCB0cnVuY2F0ZWQtbm9ybWFsIGRpc3RyaWJ1dGlvbiBvZiB2YWx1ZXMuXG4gKiBAcGFyYW0gc2hhcGUgU2hhcGUgb2YgdGhlIHRlbnNvci5cbiAqIEBwYXJhbSBtZWFuIG1lYW4gdmFsdWUgb2YgdGhlIG5vcm1hbCBkaXN0cmlidXRpb24uXG4gKiBAcGFyYW0gc3RkZGV2IHN0YW5kYXJkIGRldmlhdGlvbiBvZiB0aGUgbm9ybWFsIGRpc3RyaWJ1dGlvbi5cbiAqIEBwYXJhbSBkdHlwZVxuICogQHBhcmFtIHNlZWRcbiAqIEBwYXJhbSBuYW1lIE9wdGlvbmFsIG5hbWUuXG4gKiBAcmV0dXJuIFRoZSB0cnVuY2F0ZWQtbm9ybWFsLXJhbmRvbSBWYXJpYWJsZS5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHRydW5jYXRlZE5vcm1hbFZhcmlhYmxlKFxuICAgIHNoYXBlOiBTaGFwZSwgbWVhbiA9IDAuMCwgc3RkZGV2ID0gMS4wLCBkdHlwZT86IERhdGFUeXBlLCBzZWVkPzogbnVtYmVyLFxuICAgIG5hbWUgPSAndHJ1bmNhdGVkTm9ybWFsJyk6IExheWVyVmFyaWFibGUge1xuICAvLyBUT0RPKGNhaXMpOiBJbXBsZW1lbnQgbG9naWMgZm9yIGR0eXBlIGFuZCBzZWVkIG9uY2UgdGhleSBhcmUgc3VwcG9ydGVkXG4gIC8vIGJ5IGRlZXBsZWFybi5qcy5cbiAgZHR5cGUgPSBkdHlwZSB8fCAnZmxvYXQzMic7XG4gIGlmIChkdHlwZSAhPT0gJ2Zsb2F0MzInICYmIGR0eXBlICE9PSAnaW50MzInKSB7XG4gICAgdGhyb3cgbmV3IE5vdEltcGxlbWVudGVkRXJyb3IoXG4gICAgICAgIGByYW5kb21Ob3JtYWwgZG9lcyBub3Qgc3VwcG9ydCBkVHlwZSAke2R0eXBlfS5gKTtcbiAgfVxuICByZXR1cm4gbmV3IExheWVyVmFyaWFibGUoXG4gICAgICB0ZmMudHJ1bmNhdGVkTm9ybWFsKHNoYXBlLCBtZWFuLCBzdGRkZXYsIGR0eXBlLCBzZWVkKSwgZHR5cGUsIG5hbWUpO1xufVxuLyoqXG4gKiBHZXQgYSBWYXJpYWJsZSB3aXRoIG5vcm1hbCBkaXN0cmlidXRpb24gb2YgdmFsdWVzLlxuICogQHBhcmFtIHNoYXBlIFNoYXBlIG9mIHRoZSB0ZW5zb3IuXG4gKiBAcGFyYW0gbWVhbiBtZWFuIHZhbHVlIG9mIHRoZSBub3JtYWwgZGlzdHJpYnV0aW9uLlxuICogQHBhcmFtIHN0ZGRldiBzdGFuZGFyZCBkZXZpYXRpb24gb2YgdGhlIG5vcm1hbCBkaXN0cmlidXRpb24uXG4gKiBAcGFyYW0gZHR5cGVcbiAqIEBwYXJhbSBzZWVkXG4gKiBAcGFyYW0gbmFtZSBPcHRpb25hbCBuYW1lLlxuICogQHJldHVybiBUaGUgdHJ1bmNhdGVkLW5vcm1hbC1yYW5kb20gVmFyaWFibGUuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiByYW5kb21Ob3JtYWxWYXJpYWJsZShcbiAgICBzaGFwZTogU2hhcGUsIG1lYW4gPSAwLjAsIHN0ZGRldiA9IDEuMCwgZHR5cGU/OiBEYXRhVHlwZSwgc2VlZD86IG51bWJlcixcbiAgICBuYW1lID0gJ3JhbmRvbU5vcm1hbCcpOiBMYXllclZhcmlhYmxlIHtcbiAgZHR5cGUgPSBkdHlwZSB8fCAnZmxvYXQzMic7XG4gIGlmIChkdHlwZSAhPT0gJ2Zsb2F0MzInICYmIGR0eXBlICE9PSAnaW50MzInKSB7XG4gICAgdGhyb3cgbmV3IE5vdEltcGxlbWVudGVkRXJyb3IoXG4gICAgICAgIGByYW5kb21Ob3JtYWxWYXJpYWJsZSBkb2VzIG5vdCBzdXBwb3J0IGRUeXBlICR7ZHR5cGV9LmApO1xuICB9XG4gIHJldHVybiBuZXcgTGF5ZXJWYXJpYWJsZShcbiAgICAgIHRmYy5yYW5kb21Ob3JtYWwoc2hhcGUsIG1lYW4sIHN0ZGRldiwgZHR5cGUsIHNlZWQpLCBkdHlwZSwgbmFtZSk7XG59XG5cbi8qKlxuICogVXBkYXRlIHRoZSB2YWx1ZSBvZiBhIFZhcmlhYmxlLlxuICogQHBhcmFtIHggVGhlIFZhcmlhYmxlIHRvIGJlIHVwZGF0ZWQuXG4gKiBAcGFyYW0geE5ldyBUaGUgbmV3IHZhbHVlIHRvIHVwZGF0ZSB0by5cbiAqIEByZXR1cm4gVGhlIFZhcmlhYmxlIHVwZGF0ZWQuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiB1cGRhdGUoeDogTGF5ZXJWYXJpYWJsZSwgeE5ldzogVGVuc29yKTogTGF5ZXJWYXJpYWJsZSB7XG4gIHJldHVybiB4LndyaXRlKHhOZXcpO1xufVxuXG4vKipcbiAqIFVwZGF0ZSB0aGUgdmFsdWUgb2YgYSBWYXJpYWJsZSBieSBhZGRpbmcgYW4gaW5jcmVtZW50LlxuICogQHBhcmFtIHggVGhlIFZhcmlhYmxlIHRvIGJlIHVwZGF0ZWQuXG4gKiBAcGFyYW0gaW5jcmVtZW50IFRoZSBpbmNybWVudCB0byBhZGQgdG8gYHhgLlxuICogQHJldHVybiBUaGUgVmFyaWFibGUgdXBkYXRlZC5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHVwZGF0ZUFkZCh4OiBMYXllclZhcmlhYmxlLCBpbmNyZW1lbnQ6IFRlbnNvcik6IExheWVyVmFyaWFibGUge1xuICByZXR1cm4geC53cml0ZSh0ZmMuYWRkKHgucmVhZCgpLCBpbmNyZW1lbnQpKTtcbn1cblxuLyoqXG4gKiBVcGRhdGUgdGhlIHZhbHVlIG9mIGEgVmFyaWFibGUgYnkgc3VidHJhY3RpbmcgYSBkZWNyZW1lbnQuXG4gKiBAcGFyYW0geCBUaGUgVmFyaWFibGUgdG8gYmUgdXBkYXRlZC5cbiAqIEBwYXJhbSBkZWNyZW1lbnQgVGhlIGRlY3JlbWVudCB0byBzdWJ0cmFjdCBmcm9tIGB4YC5cbiAqIEByZXR1cm4gVGhlIFZhcmlhYmxlIHVwZGF0ZWQuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiB1cGRhdGVTdWIoeDogTGF5ZXJWYXJpYWJsZSwgZGVjcmVtZW50OiBUZW5zb3IpOiBMYXllclZhcmlhYmxlIHtcbiAgcmV0dXJuIHgud3JpdGUodGZjLnN1Yih4LnJlYWQoKSwgZGVjcmVtZW50KSk7XG59XG5cbi8qKlxuICogR2V0IHRoZSB2YWx1ZXMgb2YgYW4gYXJyYXkgb2YgVmFyaWFibGVzLlxuICpcbiAqIEBwYXJhbSB0ZW5zb3JzIEFuIGBBcnJheWAgb2YgYFZhcmlhYmxlYHMgdG8gZ2V0IHRoZSB2YWx1ZXMgb2YuXG4gKiBAcmV0dXJuIFRoZSB2YWx1ZXMgb2YgdGhlIGlucHV0cywgYXMgYW4gYEFycmF5YCBvZmB0Zi5UZW5zb3Jgcy5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGJhdGNoR2V0VmFsdWUoeHM6IExheWVyVmFyaWFibGVbXSk6IFRlbnNvcltdIHtcbiAgcmV0dXJuIHhzLm1hcCh4ID0+IHgucmVhZCgpKTtcbn1cblxuLyoqXG4gKiBVcGRhdGUgdGhlIHZhbHVlIG9mIG11bHRpcGxlIFZhcmlhYmxlcyBhdCBvbmNlLlxuICpcbiAqIEBwYXJhbSB2YXJpYWJsZXNBbmRWYWx1ZXMgQW4gYEFycmF5YCwgZWFjaCBlbGVtZW50IGlzIG9mIHR5cGVcbiAqICAgW1ZhcmlhYmxlLCBUZW5zb3JdLiBUaGUgZmlyc3QgaXRlbSBpcyB0aGVcbiAqICAgYFZhcmlhYmxlYCBvZiB3aGljaCB0aGUgdmFsdWUgaXMgdG8gYmUgdXBkYXRlZC4gVGhlIHNlY29uZCBpdGVtXG4gKiAgIGNhcnJpZXMgdGhlIG5ldyB2YWx1ZS5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGJhdGNoU2V0VmFsdWUoXG4gICAgdmFyaWFibGVzQW5kVmFsdWVzOiBBcnJheTxbTGF5ZXJWYXJpYWJsZSwgVGVuc29yXT4pOiB2b2lkIHtcbiAgdmFyaWFibGVzQW5kVmFsdWVzLmZvckVhY2godmFyaWFibGVBbmRWYWx1ZSA9PiB7XG4gICAgY29uc3QgdmFyaWFibGU6IExheWVyVmFyaWFibGUgPSB2YXJpYWJsZUFuZFZhbHVlWzBdO1xuICAgIHZhcmlhYmxlLndyaXRlKHZhcmlhYmxlQW5kVmFsdWVbMV0pO1xuICB9KTtcbn1cblxuLyoqXG4gKiBSZXR1cm5zIHRoZSBncmFkaWVudHMgb2YgYHZhcmlhYmxlc2Agdy5yLnQuIHRoZSByZXR1cm4gdmFsdWUgb2YgYGxvc3NGbmAuXG4gKiBAcGFyYW0gbG9zc0ZuIEEgZnVuY3Rpb24gd2hpY2ggcmV0dXJucyBhIFNjYWxhciB0byBiZSB1c2VkIGFzIHRoZSBmdW5jdGlvblxuICogICB2YWx1ZSAoaS5lLiwgbnVtZXJhdG9yKSBmb3IgZGlmZmVyZW50aWF0aW9uLlxuICogQHBhcmFtIHZhcmlhYmxlcyBMaXN0IG9mIHZhcmlhYmxlcyB0byBiZSB1c2VkIGFzIHRoZSBpbmRlcGVuZGVudCB2YXJpYWJsZXNcbiAqICAgKGkuZS4sIGRlbm9taW5hdG9yKSBmb3IgZGlmZmVyZW50aWF0aW9uLlxuICogQHJldHVybnMgQW4gQXJyYXkgb2YgZ3JhZGllbnRzIHRlbnNvcnMuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBncmFkaWVudHMoXG4gICAgbG9zc0ZuOiAoKSA9PiB0ZmMuU2NhbGFyLCB2YXJpYWJsZXM6IExheWVyVmFyaWFibGVbXSk6IFRlbnNvcltdIHtcbiAgLy8gVE9ETyhjYWlzKTogVGhlIHJldHVybiB0eXBlIHNpZ25hdHVyZSBjYW4gYmUgc2ltcGxpZmllZCBpZiBkZWVwbGVhcm4gbWFrZXNcbiAgLy8gICB0aGUgY29ycmVzcG9uZGluZyB0eXBlIHB1YmxpYy5cbiAgY29uc3QgdmFyaWFibGVMaXN0ID1cbiAgICAgIHZhcmlhYmxlcy5tYXAodmFyaWFibGUgPT4gdmFyaWFibGUucmVhZCgpIGFzIHRmYy5WYXJpYWJsZSk7XG4gIGNvbnN0IHZhbHVkQW5kR3JhZHMgPSB2YXJpYWJsZUdyYWRzKGxvc3NGbiwgdmFyaWFibGVMaXN0KTtcbiAgcmV0dXJuIHZhcmlhYmxlcy5tYXAodmFyaWFibGUgPT4gdmFsdWRBbmRHcmFkcy5ncmFkc1t2YXJpYWJsZS5uYW1lXSk7XG59XG4iXX0=","/**\n * @license\n * Copyright 2018 Google LLC\n *\n * Use of this source code is governed by an MIT-style\n * license that can be found in the LICENSE file or at\n * https://opensource.org/licenses/MIT.\n * =============================================================================\n */\n/* Original source: keras/engine/topology.py */\nimport { serialization, tidy, util } from '@tensorflow/tfjs-core';\nimport { getNextUniqueTensorId, getUid } from '../backend/state';\nimport { getScopedTensorName, getUniqueTensorName, nameScope } from '../common';\nimport { AttributeError, NotImplementedError, RuntimeError, ValueError } from '../errors';\nimport { getInitializer } from '../initializers';\nimport * as generic_utils from '../utils/generic_utils';\nimport * as types_utils from '../utils/types_utils';\nimport * as variable_utils from '../utils/variable_utils';\nimport { batchGetValue, batchSetValue, LayerVariable } from '../variables';\n/**\n * Specifies the ndim, dtype and shape of every input to a layer.\n *\n * Every layer should expose (if appropriate) an `inputSpec` attribute:\n * a list of instances of InputSpec (one per input tensor).\n *\n * A null entry in a shape is compatible with any dimension,\n * a null shape is compatible with any shape.\n */\nexport class InputSpec {\n constructor(args) {\n this.dtype = args.dtype;\n this.shape = args.shape;\n /*\n TODO(michaelterry): Could throw error if ndim and shape are both defined\n (then backport).\n */\n if (args.shape != null) {\n this.ndim = args.shape.length;\n }\n else {\n this.ndim = args.ndim;\n }\n this.maxNDim = args.maxNDim;\n this.minNDim = args.minNDim;\n this.axes = args.axes || {};\n }\n}\n/**\n * `tf.SymbolicTensor` is a placeholder for a Tensor without any concrete value.\n *\n * They are most often encountered when building a graph of `Layer`s for a\n * `tf.LayersModel` and the input data's shape, but not values are known.\n *\n * @doc {heading: 'Models', 'subheading': 'Classes'}\n */\nexport class SymbolicTensor {\n /**\n *\n * @param dtype\n * @param shape\n * @param sourceLayer The Layer that produced this symbolic tensor.\n * @param inputs The inputs passed to sourceLayer's __call__() method.\n * @param nodeIndex\n * @param tensorIndex\n * @param callArgs The keyword arguments passed to the __call__() method.\n * @param name\n * @param outputTensorIndex The index of this tensor in the list of outputs\n * returned by apply().\n */\n constructor(dtype, shape, sourceLayer, inputs, callArgs, name, outputTensorIndex) {\n this.dtype = dtype;\n this.shape = shape;\n this.sourceLayer = sourceLayer;\n this.inputs = inputs;\n this.callArgs = callArgs;\n this.outputTensorIndex = outputTensorIndex;\n this.id = getNextUniqueTensorId();\n if (name != null) {\n this.originalName = getScopedTensorName(name);\n this.name = getUniqueTensorName(this.originalName);\n }\n this.rank = shape.length;\n }\n}\nlet _nextNodeID = 0;\n/**\n * A `Node` describes the connectivity between two layers.\n *\n * Each time a layer is connected to some new input,\n * a node is added to `layer.inboundNodes`.\n *\n * Each time the output of a layer is used by another layer,\n * a node is added to `layer.outboundNodes`.\n *\n * `nodeIndices` and `tensorIndices` are basically fine-grained coordinates\n * describing the origin of the `inputTensors`, verifying the following:\n *\n * `inputTensors[i] ==\n * inboundLayers[i].inboundNodes[nodeIndices[i]].outputTensors[\n * tensorIndices[i]]`\n *\n * A node from layer A to layer B is added to:\n * A.outboundNodes\n * B.inboundNodes\n */\nexport class Node {\n constructor(args, \n // TODO(michaelterry): Define actual type for this.\n callArgs) {\n this.callArgs = callArgs;\n this.id = _nextNodeID++;\n /*\n Layer instance (NOT a list).\n this is the layer that takes a list of input tensors\n and turns them into a list of output tensors.\n the current node will be added to\n the inboundNodes of outboundLayer.\n */\n this.outboundLayer = args.outboundLayer;\n /*\n The following 3 properties describe where\n the input tensors come from: which layers,\n and for each layer, which node and which\n tensor output of each node.\n */\n // List of layer instances.\n this.inboundLayers = args.inboundLayers;\n // List of integers, 1:1 mapping with inboundLayers.\n this.nodeIndices = args.nodeIndices;\n // List of integers, 1:1 mapping with inboundLayers.\n this.tensorIndices = args.tensorIndices;\n /*\n Following 2 properties:\n tensor inputs and outputs of outboundLayer.\n */\n // List of tensors. 1:1 mapping with inboundLayers.\n this.inputTensors = args.inputTensors;\n // List of tensors, created by outboundLayer.call().\n this.outputTensors = args.outputTensors;\n /*\n Following 2 properties: input and output masks.\n List of tensors, 1:1 mapping with inputTensor.\n */\n this.inputMasks = args.inputMasks;\n // List of tensors, created by outboundLayer.computeMask().\n this.outputMasks = args.outputMasks;\n // Following 2 properties: input and output shapes.\n // List of shape tuples, shapes of inputTensors.\n this.inputShapes = args.inputShapes;\n // List of shape tuples, shapes of outputTensors.\n this.outputShapes = args.outputShapes;\n // Add nodes to all layers involved.\n for (const layer of args.inboundLayers) {\n if (layer != null) {\n layer.outboundNodes.push(this);\n }\n }\n args.outboundLayer.inboundNodes.push(this);\n }\n getConfig() {\n const inboundNames = [];\n for (const layer of this.inboundLayers) {\n if (layer != null) {\n inboundNames.push(layer.name);\n }\n else {\n inboundNames.push(null);\n }\n }\n return {\n outboundLayer: this.outboundLayer ? this.outboundLayer.name : null,\n inboundLayers: inboundNames,\n nodeIndices: this.nodeIndices,\n tensorIndices: this.tensorIndices\n };\n }\n}\nlet _nextLayerID = 0;\n/**\n * A layer is a grouping of operations and weights that can be composed to\n * create a `tf.LayersModel`.\n *\n * Layers are constructed by using the functions under the\n * [tf.layers](#Layers-Basic) namespace.\n *\n * @doc {heading: 'Layers', subheading: 'Classes', namespace: 'layers'}\n */\nexport class Layer extends serialization.Serializable {\n constructor(args = {}) {\n super();\n this._callHook = null;\n this._addedWeightNames = [];\n // Porting Notes: PyKeras does not have this property in this base Layer\n // class. Instead lets Layer subclass set it dynamically and checks the\n // value with `hasattr`. In tfjs-layers, we let this be a member of this\n // base class.\n this._stateful = false;\n this.id = _nextLayerID++;\n this.activityRegularizer = null;\n this.inputSpec = null;\n this.supportsMasking = false;\n // These properties will be set upon call of this.build()\n this._trainableWeights = [];\n this._nonTrainableWeights = [];\n this._losses = [];\n this._updates = [];\n this._built = false;\n /*\n These lists will be filled via successive calls\n to this.addInboundNode().\n */\n this.inboundNodes = [];\n this.outboundNodes = [];\n let name = args.name;\n if (!name) {\n const prefix = this.getClassName();\n name = generic_utils.toSnakeCase(prefix) + '_' + getUid(prefix);\n }\n this.name = name;\n this.trainable_ = args.trainable == null ? true : args.trainable;\n if (args.inputShape != null || args.batchInputShape != null) {\n /*\n In this case we will later create an input layer\n to insert before the current layer\n */\n let batchInputShape;\n if (args.batchInputShape != null) {\n batchInputShape = args.batchInputShape;\n }\n else if (args.inputShape != null) {\n let batchSize = null;\n if (args.batchSize != null) {\n batchSize = args.batchSize;\n }\n batchInputShape = [batchSize].concat(args.inputShape);\n }\n this.batchInputShape = batchInputShape;\n // Set dtype.\n let dtype = args.dtype;\n if (dtype == null) {\n dtype = args.inputDType;\n }\n if (dtype == null) {\n dtype = 'float32';\n }\n this.dtype = dtype;\n }\n if (args.weights != null) {\n this.initialWeights = args.weights;\n }\n else {\n this.initialWeights = null;\n }\n // The value of `_refCount` is initialized to null. When the layer is used\n // in a symbolic way for the first time, it will be set to 1.\n this._refCount = null;\n this.fastWeightInitDuringBuild = false;\n }\n /**\n * Converts a layer and its index to a unique (immutable type) name.\n * This function is used internally with `this.containerNodes`.\n * @param layer The layer.\n * @param nodeIndex The layer's position (e.g. via enumerate) in a list of\n * nodes.\n *\n * @returns The unique name.\n */\n static nodeKey(layer, nodeIndex) {\n return layer.name + '_ib-' + nodeIndex.toString();\n }\n /**\n * Returns this.inboundNode at index nodeIndex.\n *\n * Porting note: This is a replacement for _get_node_attribute_at_index()\n * @param nodeIndex\n * @param attrName The name of the attribute related to request for this node.\n */\n getNodeAtIndex(nodeIndex, attrName) {\n if (this.inboundNodes.length === 0) {\n throw new RuntimeError('The layer has never been called ' +\n `and thus has no defined ${attrName}.`);\n }\n if (this.inboundNodes.length <= nodeIndex) {\n throw new ValueError(`Asked to get ${attrName} at node ${nodeIndex}, ` +\n `but the layer has only ${this.inboundNodes.length} inbound nodes.`);\n }\n return this.inboundNodes[nodeIndex];\n }\n /**\n * Retrieves the input tensor(s) of a layer at a given node.\n *\n * @param nodeIndex Integer, index of the node from which to retrieve the\n * attribute. E.g. `nodeIndex=0` will correspond to the first time the layer\n * was called.\n *\n * @return A tensor (or list of tensors if the layer has multiple inputs).\n */\n getInputAt(nodeIndex) {\n return generic_utils.singletonOrArray(this.getNodeAtIndex(nodeIndex, 'input').inputTensors);\n }\n /**\n * Retrieves the output tensor(s) of a layer at a given node.\n *\n * @param nodeIndex Integer, index of the node from which to retrieve the\n * attribute. E.g. `nodeIndex=0` will correspond to the first time the layer\n * was called.\n *\n * @return A tensor (or list of tensors if the layer has multiple outputs).\n */\n getOutputAt(nodeIndex) {\n return generic_utils.singletonOrArray(this.getNodeAtIndex(nodeIndex, 'output').outputTensors);\n }\n // Properties\n /**\n * Retrieves the input tensor(s) of a layer.\n *\n * Only applicable if the layer has exactly one inbound node,\n * i.e. if it is connected to one incoming layer.\n *\n * @return Input tensor or list of input tensors.\n *\n * @exception AttributeError if the layer is connected to more than one\n * incoming layers.\n */\n get input() {\n if (this.inboundNodes.length > 1) {\n throw new AttributeError(`Layer ${this.name}` +\n ' has multiple inbound nodes, ' +\n 'hence the notion of \"layer input\" ' +\n 'is ill-defined. ' +\n 'Use `getInputAt(nodeIndex)` instead.');\n }\n else if (this.inboundNodes.length === 0) {\n throw new AttributeError(`Layer ${this.name}` +\n ' is not connected, no input to return.');\n }\n return generic_utils.singletonOrArray(this.getNodeAtIndex(0, 'input').inputTensors);\n }\n /**\n * Retrieves the output tensor(s) of a layer.\n *\n * Only applicable if the layer has exactly one inbound node,\n * i.e. if it is connected to one incoming layer.\n *\n * @return Output tensor or list of output tensors.\n *\n * @exception AttributeError if the layer is connected to more than one\n * incoming layers.\n */\n get output() {\n if (this.inboundNodes.length === 0) {\n throw new AttributeError(`Layer ${this.name}` +\n ' has no inbound nodes.');\n }\n if (this.inboundNodes.length > 1) {\n throw new AttributeError(`Layer ${this.name}` +\n ' has multiple inbound nodes, ' +\n 'hence the notion of \"layer output\" ' +\n 'is ill-defined. ' +\n 'Use `getOutputAt(nodeIndex)` instead.');\n }\n return generic_utils.singletonOrArray(this.getNodeAtIndex(0, 'output').outputTensors);\n }\n get losses() {\n return this._losses;\n }\n /**\n * Retrieves the Layer's current loss values.\n *\n * Used for regularizers during training.\n */\n calculateLosses() {\n // Porting Node: This is an augmentation to Layer.loss in PyKeras.\n // In PyKeras, Layer.loss returns symbolic tensors. Here a concrete\n // Tensor (specifically Scalar) values are returned. This is due to the\n // imperative backend.\n return this.losses.map(lossFn => lossFn());\n }\n get updates() {\n return this._updates;\n }\n get built() {\n return this._built;\n }\n set built(built) {\n this._built = built;\n }\n get trainable() {\n return this.trainable_;\n }\n set trainable(trainable) {\n this._trainableWeights.forEach(w => w.trainable = trainable);\n this.trainable_ = trainable;\n }\n get trainableWeights() {\n if (this.trainable_) {\n return this._trainableWeights.filter(w => w.trainable);\n }\n else {\n return [];\n }\n }\n set trainableWeights(weights) {\n this._trainableWeights = weights;\n }\n get nonTrainableWeights() {\n if (this.trainable) {\n return this._trainableWeights.filter(w => !w.trainable)\n .concat(this._nonTrainableWeights);\n }\n else {\n return this._trainableWeights.concat(this._nonTrainableWeights);\n }\n }\n set nonTrainableWeights(weights) {\n this._nonTrainableWeights = weights;\n }\n /**\n * The concatenation of the lists trainableWeights and nonTrainableWeights\n * (in this order).\n */\n get weights() {\n return this.trainableWeights.concat(this.nonTrainableWeights);\n }\n get stateful() {\n return this._stateful;\n }\n /**\n * Reset the states of the layer.\n *\n * This method of the base Layer class is essentially a no-op.\n * Subclasses that are stateful (e.g., stateful RNNs) should override this\n * method.\n */\n resetStates() {\n if (!this.stateful) {\n throw new Error('Cannot call the resetStates() method of a non-stateful Layer ' +\n 'object.');\n }\n }\n /**\n * Checks compatibility between the layer and provided inputs.\n *\n * This checks that the tensor(s) `input`\n * verify the input assumptions of the layer\n * (if any). If not, exceptions are raised.\n *\n * @param inputs Input tensor or list of input tensors.\n *\n * @exception ValueError in case of mismatch between\n * the provided inputs and the expectations of the layer.\n */\n assertInputCompatibility(inputs) {\n inputs = generic_utils.toList(inputs);\n if (this.inputSpec == null || this.inputSpec.length === 0) {\n return;\n }\n const inputSpec = generic_utils.toList(this.inputSpec);\n if (inputs.length !== inputSpec.length) {\n throw new ValueError(`Layer ${this.name} expects ${inputSpec.length} inputs, ` +\n `but it received ${inputs.length} input tensors. ` +\n `Input received: ${inputs}`);\n }\n for (let inputIndex = 0; inputIndex < inputs.length; inputIndex++) {\n const x = inputs[inputIndex];\n const spec = inputSpec[inputIndex];\n if (spec == null) {\n continue;\n }\n // Check ndim.\n const ndim = x.rank;\n if (spec.ndim != null) {\n if (ndim !== spec.ndim) {\n throw new ValueError(`Input ${inputIndex} is incompatible with layer ${this.name}: ` +\n `expected ndim=${spec.ndim}, found ndim=${ndim}`);\n }\n }\n if (spec.maxNDim != null) {\n if (ndim > spec.maxNDim) {\n throw new ValueError(`Input ${inputIndex} is incompatible with layer ${this.name}` +\n `: expected max_ndim=${spec.maxNDim}, found ndim=${ndim}`);\n }\n }\n if (spec.minNDim != null) {\n if (ndim < spec.minNDim) {\n throw new ValueError(`Input ${inputIndex} is incompatible with layer ${this.name}` +\n `: expected min_ndim=${spec.minNDim}, found ndim=${ndim}.`);\n }\n }\n // Check dtype.\n if (spec.dtype != null) {\n if (x.dtype !== spec.dtype) {\n throw new ValueError(`Input ${inputIndex} is incompatible with layer ${this.name} ` +\n `: expected dtype=${spec.dtype}, found dtype=${x.dtype}.`);\n }\n }\n // Check specific shape axes.\n if (spec.axes) {\n const xShape = x.shape;\n for (const key in spec.axes) {\n const axis = Number(key);\n const value = spec.axes[key];\n // Perform Python-style slicing in case axis < 0;\n // TODO(cais): Use https://github.com/alvivi/typescript-underscore to\n // ensure type safety through Underscore calls.\n const xShapeAtAxis = axis >= 0 ? xShape[axis] : xShape[xShape.length + axis];\n if (value != null && [value, null].indexOf(xShapeAtAxis) === -1) {\n throw new ValueError(`Input ${inputIndex} is incompatible with layer ` +\n `${this.name}: expected axis ${axis} of input shape to ` +\n `have value ${value} but got shape ${xShape}.`);\n }\n }\n }\n // Check shape.\n if (spec.shape != null) {\n for (let i = 0; i < spec.shape.length; ++i) {\n const specDim = spec.shape[i];\n const dim = x.shape[i];\n if (specDim != null && dim != null) {\n if (specDim !== dim) {\n throw new ValueError(`Input ${inputIndex} is incompatible with layer ` +\n `${this.name}: expected shape=${spec.shape}, ` +\n `found shape=${x.shape}.`);\n }\n }\n }\n }\n }\n }\n /**\n * This is where the layer's logic lives.\n *\n * @param inputs Input tensor, or list/tuple of input tensors.\n * @param kwargs Additional keyword arguments.\n *\n * @return A tensor or list/tuple of tensors.\n */\n call(inputs, kwargs) {\n return inputs;\n }\n invokeCallHook(inputs, kwargs) {\n if (this._callHook != null) {\n this._callHook(inputs, kwargs);\n }\n }\n /**\n * Set call hook.\n * This is currently used for testing only.\n * @param callHook\n */\n setCallHook(callHook) {\n this._callHook = callHook;\n }\n /**\n * Clear call hook.\n * This is currently used for testing only.\n */\n clearCallHook() {\n this._callHook = null;\n }\n /**\n * Builds or executes a `Layer`'s logic.\n *\n * When called with `tf.Tensor`(s), execute the `Layer`'s computation and\n * return Tensor(s). For example:\n *\n * ```js\n * const denseLayer = tf.layers.dense({\n * units: 1,\n * kernelInitializer: 'zeros',\n * useBias: false\n * });\n *\n * // Invoke the layer's apply() method with a `tf.Tensor` (with concrete\n * // numeric values).\n * const input = tf.ones([2, 2]);\n * const output = denseLayer.apply(input);\n *\n * // The output's value is expected to be [[0], [0]], due to the fact that\n * // the dense layer has a kernel initialized to all-zeros and does not have\n * // a bias.\n * output.print();\n * ```\n *\n * When called with `tf.SymbolicTensor`(s), this will prepare the layer for\n * future execution. This entails internal book-keeping on shapes of\n * expected Tensors, wiring layers together, and initializing weights.\n *\n * Calling `apply` with `tf.SymbolicTensor`s are typically used during the\n * building of non-`tf.Sequential` models. For example:\n *\n * ```js\n * const flattenLayer = tf.layers.flatten();\n * const denseLayer = tf.layers.dense({units: 1});\n *\n * // Use tf.layers.input() to obtain a SymbolicTensor as input to apply().\n * const input = tf.input({shape: [2, 2]});\n * const output1 = flattenLayer.apply(input);\n *\n * // output1.shape is [null, 4]. The first dimension is the undetermined\n * // batch size. The second dimension comes from flattening the [2, 2]\n * // shape.\n * console.log(JSON.stringify(output1.shape));\n *\n * // The output SymbolicTensor of the flatten layer can be used to call\n * // the apply() of the dense layer:\n * const output2 = denseLayer.apply(output1);\n *\n * // output2.shape is [null, 1]. The first dimension is the undetermined\n * // batch size. The second dimension matches the number of units of the\n * // dense layer.\n * console.log(JSON.stringify(output2.shape));\n *\n * // The input and output can be used to construct a model that consists\n * // of the flatten and dense layers.\n * const model = tf.model({inputs: input, outputs: output2});\n * ```\n *\n * @param inputs a `tf.Tensor` or `tf.SymbolicTensor` or an Array of them.\n * @param kwargs Additional keyword arguments to be passed to `call()`.\n *\n * @return Output of the layer's `call` method.\n *\n * @exception ValueError error in case the layer is missing shape information\n * for its `build` call.\n *\n * @doc {heading: 'Models', 'subheading': 'Classes'}\n */\n // Porting Note: This is a replacement for __call__() in Python.\n apply(inputs, kwargs) {\n kwargs = kwargs || {};\n this.assertNotDisposed();\n // Ensure inputs are all the same type.\n const inputsList = generic_utils.toList(inputs);\n let allAreSymbolic = true;\n for (const input of inputsList) {\n if (!(input instanceof SymbolicTensor)) {\n allAreSymbolic = false;\n break;\n }\n }\n let noneAreSymbolic = true;\n for (const input of inputsList) {\n if (input instanceof SymbolicTensor) {\n noneAreSymbolic = false;\n break;\n }\n }\n if (allAreSymbolic === noneAreSymbolic) {\n throw new ValueError('Arguments to apply() must be all ' +\n 'SymbolicTensors or all Tensors');\n }\n // TODO(michaelterry): nameScope() may not be necessary.\n return nameScope(this.name, () => {\n // Handle laying building (weight creating, input spec locking).\n if (!this.built) {\n /*\n Throw exceptions in case the input is not compatible\n with the inputSpec specified in the layer constructor.\n */\n this.assertInputCompatibility(inputs);\n // Collect input shapes to build layer.\n const inputShapes = [];\n for (const xElem of generic_utils.toList(inputs)) {\n inputShapes.push(xElem.shape);\n }\n this.build(generic_utils.singletonOrArray(inputShapes));\n this.built = true;\n // Load weights that were specified at layer instantiation.\n if (this.initialWeights) {\n this.setWeights(this.initialWeights);\n }\n if (this._refCount === null && noneAreSymbolic) {\n // The first use of this layer is a non-symbolic call, set ref count\n // to 1 so the Layer can be properly disposed if its dispose() method\n // is called.\n this._refCount = 1;\n }\n }\n /*\n Throw exceptions in case the input is not compatible\n with the inputSpec set at build time.\n */\n this.assertInputCompatibility(inputs);\n // Handle mask propagation.\n // TODO(michaelterry): Mask propagation not currently implemented.\n // Actually call the layer, collecting output(s), mask(s), and shape(s).\n if (noneAreSymbolic) {\n let output = this.call(inputs, kwargs);\n // TODO(michaelterry): Compute the outputMask\n // If the layer returns tensors from its inputs, unmodified,\n // we copy them to avoid loss of tensor metadata.\n const outputList = generic_utils.toList(output);\n const outputListCopy = [];\n // TODO(michaelterry): This copying may not be necessary given our eager\n // backend.\n for (let x of outputList) {\n if (inputsList.indexOf(x) !== -1) {\n x = x.clone();\n }\n outputListCopy.push(x);\n }\n output = generic_utils.singletonOrArray(outputListCopy);\n if (this.activityRegularizer != null) {\n throw new NotImplementedError('Layer invocation in the presence of activity ' +\n 'regularizer(s) is not supported yet.');\n }\n // TODO(michaelterry): Call addInboundNode()?\n return output;\n }\n else {\n const inputShape = collectInputShape(inputs);\n const outputShape = this.computeOutputShape(inputShape);\n let output;\n const outputDType = guessOutputDType(inputs);\n this.warnOnIncompatibleInputShape(Array.isArray(inputs) ? inputShape[0] :\n inputShape);\n if (outputShape != null && outputShape.length > 0 &&\n Array.isArray(outputShape[0])) {\n // We have multiple output shapes. Create multiple output tensors.\n output = outputShape\n .map((shape, index) => new SymbolicTensor(outputDType, shape, this, generic_utils.toList(inputs), kwargs, this.name, index));\n }\n else {\n output = new SymbolicTensor(outputDType, outputShape, this, generic_utils.toList(inputs), kwargs, this.name);\n }\n /*\n Add an inbound node to the layer, so that it keeps track\n of the call and of all new variables created during the call.\n This also updates the layer history of the output tensor(s).\n If the input tensor(s) had no previous history,\n this does nothing.\n */\n this.addInboundNode(inputs, output, null, null, inputShape, outputShape, kwargs);\n this._refCount++;\n if (this.activityRegularizer != null) {\n throw new NotImplementedError('Layer invocation in the presence of activity ' +\n 'regularizer(s) is not supported yet.');\n }\n return output;\n }\n });\n }\n /**\n * Check compatibility between input shape and this layer's batchInputShape.\n *\n * Print warning if any incompatibility is found.\n *\n * @param inputShape Input shape to be checked.\n */\n warnOnIncompatibleInputShape(inputShape) {\n if (this.batchInputShape == null) {\n return;\n }\n else if (inputShape.length !== this.batchInputShape.length) {\n console.warn(`The rank of the input tensor provided (shape: ` +\n `${JSON.stringify(inputShape)}) does not match that of the ` +\n `batchInputShape (${JSON.stringify(this.batchInputShape)}) ` +\n `of the layer ${this.name}`);\n }\n else {\n let dimMismatch = false;\n this.batchInputShape.forEach((dimension, i) => {\n if (dimension != null && inputShape[i] != null &&\n inputShape[i] !== dimension) {\n dimMismatch = true;\n }\n });\n if (dimMismatch) {\n console.warn(`The shape of the input tensor ` +\n `(${JSON.stringify(inputShape)}) does not ` +\n `match the expectation of layer ${this.name}: ` +\n `${JSON.stringify(this.batchInputShape)}`);\n }\n }\n }\n /**\n * Retrieves the output shape(s) of a layer.\n *\n * Only applicable if the layer has only one inbound node, or if all inbound\n * nodes have the same output shape.\n *\n * @returns Output shape or shapes.\n * @throws AttributeError: if the layer is connected to more than one incoming\n * nodes.\n *\n * @doc {heading: 'Models', 'subheading': 'Classes'}\n */\n get outputShape() {\n if (this.inboundNodes == null || this.inboundNodes.length === 0) {\n throw new AttributeError(`The layer ${this.name} has never been called and thus has no ` +\n `defined output shape.`);\n }\n const allOutputShapes = [];\n for (const node of this.inboundNodes) {\n const shapeString = JSON.stringify(node.outputShapes);\n if (allOutputShapes.indexOf(shapeString) === -1) {\n allOutputShapes.push(shapeString);\n }\n }\n if (allOutputShapes.length === 1) {\n const outputShapes = this.inboundNodes[0].outputShapes;\n if (Array.isArray(outputShapes) && Array.isArray(outputShapes[0]) &&\n outputShapes.length === 1) {\n return outputShapes[0];\n }\n else {\n return outputShapes;\n }\n }\n else {\n throw new AttributeError(`The layer ${this.name} has multiple inbound nodes with different ` +\n `output shapes. Hence the notion of \"output shape\" is ill-defined ` +\n `for the layer.`);\n // TODO(cais): Implement getOutputShapeAt().\n }\n }\n /**\n * Counts the total number of numbers (e.g., float32, int32) in the\n * weights.\n *\n * @returns An integer count.\n * @throws RuntimeError: If the layer is not built yet (in which case its\n * weights are not defined yet.)\n *\n * @doc {heading: 'Models', 'subheading': 'Classes'}\n */\n countParams() {\n if (!this.built) {\n throw new RuntimeError(`You tried to call countParams() on ${this.name}, ` +\n `but the layer is not built yet. Build it first by calling ` +\n `build(batchInputShape).`);\n }\n return variable_utils.countParamsInWeights(this.weights);\n }\n /**\n * Creates the layer weights.\n *\n * Must be implemented on all layers that have weights.\n *\n * Called when apply() is called to construct the weights.\n *\n * @param inputShape A `Shape` or array of `Shape` (unused).\n *\n * @doc {heading: 'Models', 'subheading': 'Classes'}\n */\n build(inputShape) {\n this.built = true;\n }\n /**\n * Returns the current values of the weights of the layer.\n *\n * @param trainableOnly Whether to get the values of only trainable weights.\n * @returns Weight values as an `Array` of `tf.Tensor`s.\n *\n * @doc {heading: 'Models', 'subheading': 'Classes'}\n */\n getWeights(trainableOnly = false) {\n return batchGetValue(trainableOnly ? this.trainableWeights : this.weights);\n }\n /**\n * Sets the weights of the layer, from Tensors.\n *\n * @param weights a list of Tensors. The number of arrays and their shape\n * must match number of the dimensions of the weights of the layer (i.e.\n * it should match the output of `getWeights`).\n *\n * @exception ValueError If the provided weights list does not match the\n * layer's specifications.\n *\n * @doc {heading: 'Models', 'subheading': 'Classes'}\n */\n setWeights(weights) {\n tidy(() => {\n const params = this.weights;\n if (params.length !== weights.length) {\n // TODO(cais): Restore the following and use `providedWeights`, instead\n // of `weights` in the error message, once the deeplearn.js bug is\n // fixed: https://github.com/PAIR-code/deeplearnjs/issues/498 const\n // providedWeights = JSON.stringify(weights).slice(0, 50);\n throw new ValueError(`You called setWeights(weights) on layer \"${this.name}\" ` +\n `with a weight list of length ${weights.length}, ` +\n `but the layer was expecting ${params.length} weights. ` +\n `Provided weights: ${weights}...`);\n }\n if (params.length === 0) {\n return;\n }\n const weightValueTuples = [];\n const paramValues = batchGetValue(params);\n for (let i = 0; i < paramValues.length; ++i) {\n const pv = paramValues[i];\n const p = params[i];\n const w = weights[i];\n if (!util.arraysEqual(pv.shape, w.shape)) {\n throw new ValueError(`Layer weight shape ${pv.shape} ` +\n `not compatible with provided weight shape ${w.shape}`);\n }\n weightValueTuples.push([p, w]);\n }\n batchSetValue(weightValueTuples);\n });\n }\n /**\n * Adds a weight variable to the layer.\n *\n * @param name Name of the new weight variable.\n * @param shape The shape of the weight.\n * @param dtype The dtype of the weight.\n * @param initializer An initializer instance.\n * @param regularizer A regularizer instance.\n * @param trainable Whether the weight should be trained via backprop or not\n * (assuming that the layer itself is also trainable).\n * @param constraint An optional trainable.\n * @return The created weight variable.\n *\n * @doc {heading: 'Models', 'subheading': 'Classes'}\n */\n addWeight(name, shape, dtype, initializer, regularizer, trainable, constraint, getInitializerFunc) {\n // Reject duplicate weight names.\n if (this._addedWeightNames.indexOf(name) !== -1) {\n throw new ValueError(`Duplicate weight name ${name} for layer ${this.name}`);\n }\n this._addedWeightNames.push(name);\n if (dtype == null) {\n dtype = 'float32';\n }\n if (this.fastWeightInitDuringBuild) {\n initializer = getInitializerFunc != null ? getInitializerFunc() :\n getInitializer('zeros');\n }\n const initValue = initializer.apply(shape, dtype);\n const weight = new LayerVariable(initValue, dtype, name, trainable, constraint);\n initValue.dispose();\n // Request backend not to dispose the weights of the model on scope() exit.\n if (regularizer != null) {\n this.addLoss(() => regularizer.apply(weight.read()));\n }\n if (trainable == null) {\n trainable = true;\n }\n if (trainable) {\n this._trainableWeights.push(weight);\n }\n else {\n this._nonTrainableWeights.push(weight);\n }\n return weight;\n }\n /**\n * Set the fast-weight-initialization flag.\n *\n * In cases where the initialized weight values will be immediately\n * overwritten by loaded weight values during model loading, setting\n * the flag to `true` saves unnecessary calls to potentially expensive\n * initializers and speeds up the loading process.\n *\n * @param value Target value of the flag.\n */\n setFastWeightInitDuringBuild(value) {\n this.fastWeightInitDuringBuild = value;\n }\n /**\n * Add losses to the layer.\n *\n * The loss may potentially be conditional on some inputs tensors,\n * for instance activity losses are conditional on the layer's inputs.\n *\n * @doc {heading: 'Models', 'subheading': 'Classes'}\n */\n addLoss(losses) {\n if (losses == null || Array.isArray(losses) && losses.length === 0) {\n return;\n }\n // Update this.losses\n losses = generic_utils.toList(losses);\n if (this._losses !== undefined && this._losses !== null) {\n this.losses.push(...losses);\n }\n }\n /**\n * Computes the output shape of the layer.\n *\n * Assumes that the layer will be built to match that input shape provided.\n *\n * @param inputShape A shape (tuple of integers) or a list of shape tuples\n * (one per output tensor of the layer). Shape tuples can include null for\n * free dimensions, instead of an integer.\n *\n * @doc {heading: 'Models', 'subheading': 'Classes'}\n */\n computeOutputShape(inputShape) {\n return inputShape;\n }\n /**\n * Computes an output mask tensor.\n *\n * @param inputs Tensor or list of tensors.\n * @param mask Tensor or list of tensors.\n *\n * @return null or a tensor (or list of tensors, one per output tensor of the\n * layer).\n */\n computeMask(inputs, mask) {\n if (!this.supportsMasking) {\n if (mask != null) {\n if (Array.isArray(mask)) {\n mask.forEach(maskElement => {\n if (maskElement != null) {\n throw new TypeError(`Layer ${this.name} does not support masking, ` +\n 'but was passed an inputMask.');\n }\n });\n }\n else {\n throw new TypeError(`Layer ${this.name} does not support masking, ` +\n 'but was passed an inputMask.');\n }\n }\n // masking not explicitly supported: return null as mask\n return null;\n }\n // if masking is explictly supported, by default\n // carry over the input mask\n return mask;\n }\n /**\n * Internal method to create an inbound node for the layer.\n *\n * @param inputTensors List of input tensors.\n * @param outputTensors List of output tensors.\n * @param inputMasks List of input masks (a mask can be a tensor, or null).\n * @param outputMasks List of output masks (a mask can be a tensor, or null).\n * @param inputShapes List of input shape tuples.\n * @param outputShapes List of output shape tuples.\n * @param kwargs Dictionary of keyword arguments that were passed to the\n * `call` method of the layer at the call that created the node.\n */\n addInboundNode(inputTensors, outputTensors, inputMasks, outputMasks, inputShapes, outputShapes, kwargs = null) {\n const inputTensorList = generic_utils.toList(inputTensors);\n outputTensors = generic_utils.toList(outputTensors);\n inputMasks = generic_utils.toList(inputMasks);\n outputMasks = generic_utils.toList(outputMasks);\n inputShapes = types_utils.normalizeShapeList(inputShapes);\n outputShapes = types_utils.normalizeShapeList(outputShapes);\n // Collect input tensor(s) coordinates.\n const inboundLayers = [];\n const nodeIndices = [];\n const tensorIndices = [];\n for (const x of inputTensorList) {\n /*\n * TODO(michaelterry): Keras adds this value to tensors; it's not\n * clear whether we'll use this or not.\n */\n inboundLayers.push(x.sourceLayer);\n nodeIndices.push(x.nodeIndex);\n tensorIndices.push(x.tensorIndex);\n }\n // Create node, add it to inbound nodes.\n // (This call has side effects.)\n // tslint:disable-next-line:no-unused-expression\n new Node({\n outboundLayer: this,\n inboundLayers,\n nodeIndices,\n tensorIndices,\n inputTensors: inputTensorList,\n outputTensors,\n inputMasks,\n outputMasks,\n inputShapes,\n outputShapes\n }, kwargs);\n // Update tensor history\n for (let i = 0; i < outputTensors.length; i++) {\n // TODO(michaelterry: _uses_learning_phase not tracked.\n outputTensors[i].sourceLayer = this;\n outputTensors[i].nodeIndex = this.inboundNodes.length - 1;\n outputTensors[i].tensorIndex = i;\n }\n }\n /**\n * Returns the config of the layer.\n *\n * A layer config is a TS dictionary (serializable)\n * containing the configuration of a layer.\n * The same layer can be reinstantiated later\n * (without its trained weights) from this configuration.\n *\n * The config of a layer does not include connectivity\n * information, nor the layer class name. These are handled\n * by 'Container' (one layer of abstraction above).\n *\n * Porting Note: The TS dictionary follows TS naming standards for\n * keys, and uses tfjs-layers type-safe Enums. Serialization methods\n * should use a helper function to convert to the pythonic storage\n * standard. (see serialization_utils.convertTsToPythonic)\n *\n * @returns TS dictionary of configuration.\n *\n * @doc {heading: 'Models', 'subheading': 'Classes'}\n */\n getConfig() {\n const config = { name: this.name, trainable: this.trainable };\n if (this.batchInputShape != null) {\n config['batchInputShape'] = this.batchInputShape;\n }\n if (this.dtype != null) {\n config['dtype'] = this.dtype;\n }\n return config;\n }\n /**\n * Dispose the weight variables that this Layer instance holds.\n *\n * @returns {number} Number of disposed variables.\n */\n disposeWeights() {\n this.weights.forEach(weight => weight.dispose());\n return this.weights.length;\n }\n assertNotDisposed() {\n if (this._refCount === 0) {\n throw new Error(`Layer '${this.name}' is already disposed.`);\n }\n }\n /**\n * Attempt to dispose layer's weights.\n *\n * This method decreases the reference count of the Layer object by 1.\n *\n * A Layer is reference-counted. Its reference count is incremented by 1\n * the first item its `apply()` method is called and when it becomes a part\n * of a new `Node` (through calling the `apply()` method on a\n * `tf.SymbolicTensor`).\n *\n * If the reference count of a Layer becomes 0, all the weights will be\n * disposed and the underlying memory (e.g., the textures allocated in WebGL)\n * will be freed.\n *\n * Note: If the reference count is greater than 0 after the decrement, the\n * weights of the Layer will *not* be disposed.\n *\n * After a Layer is disposed, it cannot be used in calls such as `apply()`,\n * `getWeights()` or `setWeights()` anymore.\n *\n * @returns A DisposeResult Object with the following fields:\n * - refCountAfterDispose: The reference count of the Container after this\n * `dispose()` call.\n * - numDisposedVariables: Number of `tf.Variable`s (i.e., weights) disposed\n * during this `dispose()` call.\n * @throws {Error} If the layer is not built yet, or if the layer has already\n * been disposed.\n *\n * @doc {heading: 'Models', 'subheading': 'Classes'}\n */\n dispose() {\n if (!this.built) {\n throw new Error(`Cannot dispose Layer ${this.name} because it has not been ` +\n `built yet.`);\n }\n if (this._refCount === null) {\n throw new Error(`Cannot dispose Layer ${this.name} because it has not been used ` +\n `yet.`);\n }\n this.assertNotDisposed();\n let numDisposedVariables = 0;\n if (--this._refCount === 0) {\n numDisposedVariables = this.disposeWeights();\n }\n return { refCountAfterDispose: this._refCount, numDisposedVariables };\n }\n}\n/**\n * Collects the input shape(s) of a list of `tf.Tensor`s or\n * `tf.SymbolicTensor`s.\n *\n * TODO(michaelterry): Update PyKeras docs (backport).\n *\n * @param inputTensors List of input tensors (or single input tensor).\n *\n * @return List of shape tuples (or single tuple), one tuple per input.\n */\nfunction collectInputShape(inputTensors) {\n inputTensors =\n generic_utils.toList(inputTensors);\n const shapes = [];\n for (const x of inputTensors) {\n shapes.push(x.shape);\n }\n return generic_utils.singletonOrArray(shapes);\n}\n/**\n * Guesses output dtype based on inputs.\n *\n * At present, just returns 'float32' for any input.\n *\n * @param inputTensors List of input tensors (or single input tensor).\n *\n * @return The guessed DType. At present, always returns 'float32'.\n */\nfunction guessOutputDType(inputTensors) {\n return 'float32';\n}\n/**\n * Returns the list of input tensors necessary to compute `tensor`.\n *\n * Output will always be a list of tensors (potentially with 1 element).\n *\n * @param tensor The tensor to start from.\n * @param layer Origin layer of the tensor.\n * @param nodeIndex Origin node index of the tensor.\n *\n * @return Array of input tensors.\n */\nexport function getSourceInputs(tensor, layer, nodeIndex) {\n if (layer == null || (nodeIndex != null && nodeIndex > 0)) {\n layer = tensor.sourceLayer;\n nodeIndex = tensor.nodeIndex;\n }\n if (layer.inboundNodes.length === 0) {\n return [tensor];\n }\n else {\n const node = layer.inboundNodes[nodeIndex];\n if (node.inboundLayers.length === 0) {\n return node.inputTensors;\n }\n else {\n const sourceTensors = [];\n for (let i = 0; i < node.inboundLayers.length; i++) {\n const x = node.inputTensors[i];\n const layer = node.inboundLayers[i];\n const nodeIndex = node.nodeIndices[i];\n const previousSources = getSourceInputs(x, layer, nodeIndex);\n // Avoid input redundancy.\n for (const x of previousSources) {\n if (sourceTensors.indexOf(x) === -1) {\n sourceTensors.push(x);\n }\n }\n }\n return sourceTensors;\n }\n }\n}\n//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidG9wb2xvZ3kuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi8uLi90ZmpzLWxheWVycy9zcmMvZW5naW5lL3RvcG9sb2d5LnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBOzs7Ozs7OztHQVFHO0FBRUgsK0NBQStDO0FBRS9DLE9BQU8sRUFBbUIsYUFBYSxFQUFVLElBQUksRUFBRSxJQUFJLEVBQUMsTUFBTSx1QkFBdUIsQ0FBQztBQUUxRixPQUFPLEVBQUMscUJBQXFCLEVBQUUsTUFBTSxFQUFDLE1BQU0sa0JBQWtCLENBQUM7QUFDL0QsT0FBTyxFQUFDLG1CQUFtQixFQUFFLG1CQUFtQixFQUFFLFNBQVMsRUFBQyxNQUFNLFdBQVcsQ0FBQztBQUU5RSxPQUFPLEVBQUMsY0FBYyxFQUFFLG1CQUFtQixFQUFFLFlBQVksRUFBRSxVQUFVLEVBQUMsTUFBTSxXQUFXLENBQUM7QUFDeEYsT0FBTyxFQUFDLGNBQWMsRUFBYyxNQUFNLGlCQUFpQixDQUFDO0FBSTVELE9BQU8sS0FBSyxhQUFhLE1BQU0sd0JBQXdCLENBQUM7QUFDeEQsT0FBTyxLQUFLLFdBQVcsTUFBTSxzQkFBc0IsQ0FBQztBQUNwRCxPQUFPLEtBQUssY0FBYyxNQUFNLHlCQUF5QixDQUFDO0FBQzFELE9BQU8sRUFBQyxhQUFhLEVBQUUsYUFBYSxFQUFFLGFBQWEsRUFBQyxNQUFNLGNBQWMsQ0FBQztBQXVCekU7Ozs7Ozs7O0dBUUc7QUFDSCxNQUFNLE9BQU8sU0FBUztJQWNwQixZQUFZLElBQW1CO1FBQzdCLElBQUksQ0FBQyxLQUFLLEdBQUcsSUFBSSxDQUFDLEtBQUssQ0FBQztRQUN4QixJQUFJLENBQUMsS0FBSyxHQUFHLElBQUksQ0FBQyxLQUFLLENBQUM7UUFDeEI7OztVQUdFO1FBQ0YsSUFBSSxJQUFJLENBQUMsS0FBSyxJQUFJLElBQUksRUFBRTtZQUN0QixJQUFJLENBQUMsSUFBSSxHQUFHLElBQUksQ0FBQyxLQUFLLENBQUMsTUFBTSxDQUFD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LEVBQUU7WUFDbkMsT0FBTyxJQUFJLENBQUMsWUFBWSxDQUFDO1NBQzFCO2FBQU07WUFDTCxNQUFNLGFBQWEsR0FBcUIsRUFBRSxDQUFDO1lBQzNDLEtBQUssSUFBSSxDQUFDLEdBQUcsQ0FBQyxFQUFFLENBQUMsR0FBRyxJQUFJLENBQUMsYUFBYSxDQUFDLE1BQU0sRUFBRSxDQUFDLEVBQUUsRUFBRTtnQkFDbEQsTUFBTSxDQUFDLEdBQUcsSUFBSSxDQUFDLFlBQVksQ0FBQyxDQUFDLENBQUMsQ0FBQztnQkFDL0IsTUFBTSxLQUFLLEdBQUcsSUFBSSxDQUFDLGFBQWEsQ0FBQyxDQUFDLENBQUMsQ0FBQztnQkFDcEMsTUFBTSxTQUFTLEdBQUcsSUFBSSxDQUFDLFdBQVcsQ0FBQyxDQUFDLENBQUMsQ0FBQztnQkFDdEMsTUFBTSxlQUFlLEdBQUcsZUFBZSxDQUFDLENBQUMsRUFBRSxLQUFLLEVBQUUsU0FBUyxDQUFDLENBQUM7Z0JBQzdELDBCQUEwQjtnQkFDMUIsS0FBSyxNQUFNLENBQUMsSUFBSSxlQUFlLEVBQUU7b0JBQy9CLElBQUksYUFBYSxDQUFDLE9BQU8sQ0FBQyxDQUFDLENBQUMsS0FBSyxDQUFDLENBQUMsRUFBRTt3QkFDbkMsYUFBYSxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsQ0FBQztxQkFDdkI7aUJBQ0Y7YUFDRjtZQUNELE9BQU8sYUFBYSxDQUFDO1NBQ3RCO0tBQ0Y7QUFDSCxDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiLyoqXG4gKiBAbGljZW5zZVxuICogQ29weXJpZ2h0IDIwMTggR29vZ2xlIExMQ1xuICpcbiAqIFVzZSBvZiB0aGlzIHNvdXJjZSBjb2RlIGlzIGdvdmVybmVkIGJ5IGFuIE1JVC1zdHlsZVxuICogbGljZW5zZSB0aGF0IGNhbiBiZSBmb3VuZCBpbiB0aGUgTElDRU5TRSBmaWxlIG9yIGF0XG4gKiBodHRwczovL29wZW5zb3VyY2Uub3JnL2xpY2Vuc2VzL01JVC5cbiAqID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4gKi9cblxuLyogT3JpZ2luYWwgc291cmNlOiBrZXJhcy9lbmdpbmUvdG9wb2xvZ3kucHkgKi9cblxuaW1wb3J0IHtEYXRhVHlwZSwgU2NhbGFyLCBzZXJpYWxpemF0aW9uLCBUZW5zb3IsIHRpZHksIHV0aWx9IGZyb20gJ0B0ZW5zb3JmbG93L3RmanMtY29yZSc7XG5cbmltcG9ydCB7Z2V0TmV4dFVuaXF1ZVRlbnNvcklkLCBnZXRVaWR9IGZyb20gJy4uL2JhY2tlbmQvc3RhdGUnO1xuaW1wb3J0IHtnZXRTY29wZWRUZW5zb3JOYW1lLCBnZXRVbmlxdWVUZW5zb3JOYW1lLCBuYW1lU2NvcGV9IGZyb20gJy4uL2NvbW1vbic7XG5pbXBvcnQge0NvbnN0cmFpbnR9IGZyb20gJy4uL2NvbnN0cmFpbnRzJztcbmltcG9ydCB7QXR0cmlidXRlRXJyb3IsIE5vdEltcGxlbWVudGVkRXJyb3IsIFJ1bnRpbWVFcnJvciwgVmFsdWVFcnJvcn0gZnJvbSAnLi4vZXJyb3JzJztcbmltcG9ydCB7Z2V0SW5pdGlhbGl6ZXIsIEluaXRpYWxpemVyfSBmcm9tICcuLi9pbml0aWFsaXplcnMnO1xuaW1wb3J0IHtTaGFwZX0gZnJvbSAnLi4va2VyYXNfZm9ybWF0L2NvbW1vbic7XG5pbXBvcnQge1JlZ3VsYXJpemVyfSBmcm9tICcuLi9yZWd1bGFyaXplcnMnO1xuaW1wb3J0IHtLd2FyZ3MsIFJlZ3VsYXJpemVyRm59IGZyb20gJy4uL3R5cGVzJztcbmltcG9ydCAqIGFzIGdlbmVyaWNfdXRpbHMgZnJvbSAnLi4vdXRpbHMvZ2VuZXJpY191dGlscyc7XG5pbXBvcnQgKiBhcyB0eXBlc191dGlscyBmcm9tICcuLi91dGlscy90eXBlc191dGlscyc7XG5pbXBvcnQgKiBhcyB2YXJpYWJsZV91dGlscyBmcm9tICcuLi91dGlscy92YXJpYWJsZV91dGlscyc7XG5pbXBvcnQge2JhdGNoR2V0VmFsdWUsIGJhdGNoU2V0VmFsdWUsIExheWVyVmFyaWFibGV9IGZyb20gJy4uL3ZhcmlhYmxlcyc7XG5cbi8vIFRPRE8obWljaGFlbHRlcnJ5KTogVGhpcyBpcyBhIHN0dWIgdW50aWwgaXQncyBkZWZpbmVkLlxuZXhwb3J0IHR5cGUgT3AgPSAoeDogTGF5ZXJWYXJpYWJsZSkgPT4gTGF5ZXJWYXJpYWJsZTtcblxuLyoqXG4gKiBDb25zdHJ1Y3RvciBhcmd1bWVudHMgZm9yIElucHV0U3BlYy5cbiAqL1xuZXhwb3J0IGludGVyZmFjZSBJbnB1dFNwZWNBcmdzIHtcbiAgLyoqIEV4cGVjdGVkIGRhdGF0eXBlIG9mIHRoZSBpbnB1dC4gKi9cbiAgZHR5cGU/OiBEYXRhVHlwZTtcbiAgLyoqIEV4cGVjdGVkIHNoYXBlIG9mIHRoZSBpbnB1dCAobWF5IGluY2x1ZGUgbnVsbCBmb3IgdW5jaGVja2VkIGF4ZXMpLiAqL1xuICBzaGFwZT86IFNoYXBlO1xuICAvKiogRXhwZWN0ZWQgcmFuayBvZiB0aGUgaW5wdXQuICovXG4gIG5kaW0/OiBudW1iZXI7XG4gIC8qKiBNYXhpbXVtIHJhbmsgb2YgdGhlIGlucHV0LiAqL1xuICBtYXhORGltPzogbnVtYmVyO1xuICAvKiogTWluaW11bSByYW5rIG9mIHRoZSBpbnB1dC4gKi9cbiAgbWluTkRpbT86IG51bWJlcjtcbiAgLyoqIERpY3Rpb25hcnkgbWFwcGluZyBpbnRlZ2VyIGF4ZXMgdG8gYSBzcGVjaWZpYyBkaW1lbnNpb24gdmFsdWUuICovXG4gIGF4ZXM/OiB7W2F4aXM6IG51bWJlcl06IG51bWJlcn07XG59XG5cbi8qKlxuICogU3BlY2lmaWVzIHRoZSBuZGltLCBkdHlwZSBhbmQgc2hhcGUgb2YgZXZlcnkgaW5wdXQgdG8gYSBsYXllci5cbiAqXG4gKiBFdmVyeSBsYXllciBzaG91bGQgZXhwb3NlIChpZiBhcHByb3ByaWF0ZSkgYW4gYGlucHV0U3BlY2AgYXR0cmlidXRlOlxuICogYSBsaXN0IG9mIGluc3RhbmNlcyBvZiBJbnB1dFNwZWMgKG9uZSBwZXIgaW5wdXQgdGVuc29yKS5cbiAqXG4gKiBBIG51bGwgZW50cnkgaW4gYSBzaGFwZSBpcyBjb21wYXRpYmxlIHdpdGggYW55IGRpbWVuc2lvbixcbiAqIGEgbnVsbCBzaGFwZSBpcyBjb21wYXRpYmxlIHdpdGggYW55IHNoYXBlLlxuICovXG5leHBvcnQgY2xhc3MgSW5wdXRTcGVjIHtcbiAgLyoqIEV4cGVjdGVkIGRhdGF0eXBlIG9mIHRoZSBpbnB1dC4gKi9cbiAgZHR5cGU/OiBEYXRhVHlwZTtcbiAgLyoqIEV4cGVjdGVkIHNoYXBlIG9mIHRoZSBpbnB1dCAobWF5IGluY2x1ZGUgbnVsbCBmb3IgdW5jaGVja2VkIGF4ZXMpLiAqL1xuICBzaGFwZT86IFNoYXBlO1xuICAvKiogRXhwZWN0ZWQgcmFuayBvZiB0aGUgaW5wdXQuICovXG4gIG5kaW0/OiBudW1iZXI7XG4gIC8qKiBNYXhpbXVtIHJhbmsgb2YgdGhlIGlucHV0LiAqL1xuICBtYXhORGltPzogbnVtYmVyO1xuICAvKiogTWluaW11bSByYW5rIG9mIHRoZSBpbnB1dC4gKi9cbiAgbWluTkRpbT86IG51bWJlcjtcbiAgLyoqIERpY3Rpb25hcnkgbWFwcGluZyBpbnRlZ2VyIGF4ZXMgdG8gYSBzcGVjaWZpYyBkaW1lbnNpb24gdmFsdWUuICovXG4gIGF4ZXM/OiB7W2F4aXM6IG51bWJlcl06IG51bWJlcn07XG5cbiAgY29uc3RydWN0b3IoYXJnczogSW5wdXRTcGVjQXJncykge1xuICAgIHRoaXMuZHR5cGUgPSBhcmdzLmR0eXBlO1xuICAgIHRoaXMuc2hhcGUgPSBhcmdzLnNoYXBlO1xuICAgIC8qXG4gICAgICBUT0RPKG1pY2hhZWx0ZXJyeSk6IENvdWxkIHRocm93IGVycm9yIGlmIG5kaW0gYW5kIHNoYXBlIGFyZSBib3RoIGRlZmluZWRcbiAgICAgICAgKHRoZW4gYmFja3BvcnQpLlxuICAgICovXG4gICAgaWYgKGFyZ3Muc2hhcGUgIT0gbnVsbCkge1xuICAgICAgdGhpcy5uZGltID0gYXJncy5zaGFwZS5sZW5ndGg7XG4gICAgfSBlbHNlIHtcbiAgICAgIHRoaXMubmRpbSA9IGFyZ3MubmRpbTtcbiAgICB9XG4gICAgdGhpcy5tYXhORGltID0gYXJncy5tYXhORGltO1xuICAgIHRoaXMubWluTkRpbSA9IGFyZ3MubWluTkRpbTtcbiAgICB0aGlzLmF4ZXMgPSBhcmdzLmF4ZXMgfHwge307XG4gIH1cbn1cblxuLyoqXG4gKiBgdGYuU3ltYm9saWNUZW5zb3JgIGlzIGEgcGxhY2Vob2xkZXIgZm9yIGEgVGVuc29yIHdpdGhvdXQgYW55IGNvbmNyZXRlIHZhbHVlLlxuICpcbiAqIFRoZXkgYXJlIG1vc3Qgb2Z0ZW4gZW5jb3VudGVyZWQgd2hlbiBidWlsZGluZyBhIGdyYXBoIG9mIGBMYXllcmBzIGZvciBhXG4gKiBgdGYuTGF5ZXJzTW9kZWxgIGFuZCB0aGUgaW5wdXQgZGF0YSdzIHNoYXBlLCBidXQgbm90IHZhbHVlcyBhcmUga25vd24uXG4gKlxuICogQGRvYyB7aGVhZGluZzogJ01vZGVscycsICdzdWJoZWFkaW5nJzogJ0NsYXNzZXMnfVxuICovXG5leHBvcnQgY2xhc3MgU3ltYm9saWNUZW5zb3Ige1xuICAvKiBBIHVuaXF1ZSBJRCBmb3IgdGhlIHRlbnNvciB0byBiZSBhYmxlIHRvIGRpZmZlcmVudGlhdGUgdGVuc29ycy4gKi9cbiAgcmVhZG9ubHkgaWQ6IG51bWJlcjtcbiAgLy8gVGhlIGZ1bGx5IHNjb3BlZCBuYW1lIG9mIHRoaXMgVmFyaWFibGUsIGluY2x1ZGluZyBhIHVuaXF1ZSBzdWZmaXggaWYgbmVlZGVkXG4gIHJlYWRvbmx5IG5hbWU6IHN0cmluZztcbiAgLy8gVGhlIG9yaWdpbmFsbHkgcmVxdWVzdGVkIGZ1bGx5IHNjb3BlZCBuYW1lIG9mIHRoaXMgVmFyaWFibGUsIG5vdCBpbmNsdWRpbmdcbiAgLy8gYW55IHVuaXF1ZSBzdWZmaXguICBUaGlzIG1heSBiZSBuZWVkZWQgd2hlbiByZXN0b3Jpbmcgd2VpZ2h0cyBiZWNhdXNlIHRoaXNcbiAgLy8gb3JpZ2luYWwgbmFtZSBpcyB1c2VkIGFzIGEga2V5LlxuICByZWFkb25seSBvcmlnaW5hbE5hbWU/OiBzdHJpbmc7XG4gIC8qKlxuICAgKiBSYW5rL2RpbWVuc2lvbmFsaXR5IG9mIHRoZSB0ZW5zb3IuXG4gICAqL1xuICByZWFkb25seSByYW5rOiBudW1iZXI7XG4gIC8qKlxuICAgKiBSZXBsYWNlbWVudCBmb3IgX2tlcmFzX2hpc3RvcnkuXG4gICAqL1xuICBub2RlSW5kZXg6IG51bWJlcjtcbiAgLyoqXG4gICAqIFJlcGxhY2VtZW50IGZvciBfa2VyYXNfaGlzdG9yeS5cbiAgICovXG4gIHRlbnNvckluZGV4OiBudW1iZXI7XG5cbiAgLyoqXG4gICAqXG4gICAqIEBwYXJhbSBkdHlwZVxuICAgKiBAcGFyYW0gc2hhcGVcbiAgICogQHBhcmFtIHNvdXJjZUxheWVyIFRoZSBMYXllciB0aGF0IHByb2R1Y2VkIHRoaXMgc3ltYm9saWMgdGVuc29yLlxuICAgKiBAcGFyYW0gaW5wdXRzIFRoZSBpbnB1dHMgcGFzc2VkIHRvIHNvdXJjZUxheWVyJ3MgX19jYWxsX18oKSBtZXRob2QuXG4gICAqIEBwYXJhbSBub2RlSW5kZXhcbiAgICogQHBhcmFtIHRlbnNvckluZGV4XG4gICAqIEBwYXJhbSBjYWxsQXJncyBUaGUga2V5d29yZCBhcmd1bWVudHMgcGFzc2VkIHRvIHRoZSBfX2NhbGxfXygpIG1ldGhvZC5cbiAgICogQHBhcmFtIG5hbWVcbiAgICogQHBhcmFtIG91dHB1dFRlbnNvckluZGV4IFRoZSBpbmRleCBvZiB0aGlzIHRlbnNvciBpbiB0aGUgbGlzdCBvZiBvdXRwdXRzXG4gICAqICAgcmV0dXJuZWQgYnkgYXBwbHkoKS5cbiAgICovXG4gIGNvbnN0cnVjdG9yKFxuICAgICAgcmVhZG9ubHkgZHR5cGU6IERhdGFUeXBlLCByZWFkb25seSBzaGFwZTogU2hhcGUsXG4gICAgICBwdWJsaWMgc291cmNlTGF5ZXI6IExheWVyLCByZWFkb25seSBpbnB1dHM6IFN5bWJvbGljVGVuc29yW10sXG4gICAgICByZWFkb25seSBjYWxsQXJnczogS3dhcmdzLCBuYW1lPzogc3RyaW5nLFxuICAgICAgcmVhZG9ubHkgb3V0cHV0VGVuc29ySW5kZXg/OiBudW1iZXIpIHtcbiAgICB0aGlzLmlkID0gZ2V0TmV4dFVuaXF1ZVRlbnNvcklkKCk7XG4gICAgaWYgKG5hbWUgIT0gbnVsbCkge1xuICAgICAgdGhpcy5vcmlnaW5hbE5hbWUgPSBnZXRTY29wZWRUZW5zb3JOYW1lKG5hbWUpO1xuICAgICAgdGhpcy5uYW1lID0gZ2V0VW5pcXVlVGVuc29yTmFtZSh0aGlzLm9yaWdpbmFsTmFtZSk7XG4gICAgfVxuICAgIHRoaXMucmFuayA9IHNoYXBlLmxlbmd0aDtcbiAgfVxufVxuXG4vKipcbiAqIENvbnN0cnVjdG9yIGFyZ3VtZW50cyBmb3IgTm9kZS5cbiAqL1xuZXhwb3J0IGludGVyZmFjZSBOb2RlQXJncyB7XG4gIC8qKlxuICAgKiBUaGUgbGF5ZXIgdGhhdCB0YWtlcyBgaW5wdXRUZW5zb3JzYCBhbmQgdHVybnMgdGhlbSBpbnRvIGBvdXRwdXRUZW5zb3JzYC5cbiAgICogKHRoZSBub2RlIGdldHMgY3JlYXRlZCB3aGVuIHRoZSBgY2FsbGAgbWV0aG9kIG9mIHRoZSBsYXllciBpcyBjYWxsZWQpLlxuICAgKi9cbiAgb3V0Ym91bmRMYXllcjogTGF5ZXI7XG4gIC8qKlxuICAgKiBBIGxpc3Qgb2YgbGF5ZXJzLCB0aGUgc2FtZSBsZW5ndGggYXMgYGlucHV0VGVuc29yc2AsIHRoZSBsYXllcnMgZnJvbSB3aGVyZVxuICAgKiBgaW5wdXRUZW5zb3JzYCBvcmlnaW5hdGUuXG4gICAqL1xuICBpbmJvdW5kTGF5ZXJzOiBMYXllcltdO1xuICAvKipcbiAgICogQSBsaXN0IG9mIGludGVnZXJzLCB0aGUgc2FtZSBsZW5ndGggYXMgYGluYm91bmRMYXllcnNgLiBgbm9kZUluZGljZXNbaV1gIGlzXG4gICAqIHRoZSBvcmlnaW4gbm9kZSBvZiBgaW5wdXRUZW5zb3JzW2ldYCAobmVjZXNzYXJ5IHNpbmNlIGVhY2ggaW5ib3VuZCBsYXllclxuICAgKiBtaWdodCBoYXZlIHNldmVyYWwgbm9kZXMsIGUuZy4gaWYgdGhlIGxheWVyIGlzIGJlaW5nIHNoYXJlZCB3aXRoIGFcbiAgICogZGlmZmVyZW50IGRhdGEgc3RyZWFtKS5cbiAgICovXG4gIG5vZGVJbmRpY2VzOiBudW1iZXJbXTtcbiAgLyoqXG4gICAqIEEgbGlzdCBvZiBpbnRlZ2VycywgdGhlIHNhbWUgbGVuZ3RoIGFzIGBpbmJvdW5kTGF5ZXJzYC4gYHRlbnNvckluZGljZXNbaV1gXG4gICAqIGlzIHRoZSBpbmRleCBvZiBgaW5wdXRUZW5zb3JzW2ldYCB3aXRoaW4gdGhlIG91dHB1dCBvZiB0aGUgaW5ib3VuZCBsYXllclxuICAgKiAobmVjZXNzYXJ5IHNpbmNlIGVhY2ggaW5ib3VuZCBsYXllciBtaWdodCBoYXZlIG11bHRpcGxlIHRlbnNvciBvdXRwdXRzLFxuICAgKiB3aXRoIGVhY2ggb25lIGJlaW5nIGluZGVwZW5kZW50bHkgbWFuaXB1bGFibGUpLlxuICAgKi9cbiAgdGVuc29ySW5kaWNlczogbnVtYmVyW107XG4gIC8qKiBMaXN0IG9mIGlucHV0IHRlbnNvcnMuICovXG4gIGlucHV0VGVuc29yczogU3ltYm9saWNUZW5zb3JbXTtcbiAgLyoqIExpc3Qgb2Ygb3V0cHV0IHRlbnNvcnMuICovXG4gIG91dHB1dFRlbnNvcnM6IFN5bWJvbGljVGVuc29yW107XG4gIC8qKiBMaXN0IG9mIGlucHV0IG1hc2tzIChhIG1hc2sgY2FuIGJlIGEgdGVuc29yLCBvciBudWxsKS4gKi9cbiAgaW5wdXRNYXNrczogVGVuc29yW107XG4gIC8qKiBMaXN0IG9mIG91dHB1dCBtYXNrcyAoYSBtYXNrIGNhbiBiZSBhIHRlbnNvciwgb3IgbnVsbCkuICovXG4gIG91dHB1dE1hc2tzOiBUZW5zb3JbXTtcbiAgLyoqIExpc3Qgb2YgaW5wdXQgc2hhcGUgdHVwbGVzLiAqL1xuICBpbnB1dFNoYXBlczogU2hhcGV8U2hhcGVbXTtcbiAgLyoqIExpc3Qgb2Ygb3V0cHV0IHNoYXBlIHR1cGxlcy4gKi9cbiAgb3V0cHV0U2hhcGVzOiBTaGFwZXxTaGFwZVtdO1xufVxuXG4vKipcbiAqIFRoZSB0eXBlIG9mIHRoZSByZXR1cm4gdmFsdWUgb2YgTGF5ZXIuZGlzcG9zZSgpIGFuZCBDb250YWluZXIuZGlzcG9zZSgpLlxuICovXG5leHBvcnQgaW50ZXJmYWNlIERpc3Bvc2VSZXN1bHQge1xuICAvKipcbiAgICogUmVmZXJlbmNlIGNvdW50IGFmdGVyIHRoZSBkaXNwb3NlIGNhbGwuXG4gICAqL1xuICByZWZDb3VudEFmdGVyRGlzcG9zZTogbnVtYmVyO1xuXG4gIC8qKlxuICAgKiBOdW1iZXIgb2YgdmFyaWFibGVzIGRpc3Bvc2UgaW4gdGhpcyBkaXNwb3NlIGNhbGwuXG4gICAqL1xuICBudW1EaXNwb3NlZFZhcmlhYmxlczogbnVtYmVyO1xufVxuXG5sZXQgX25leHROb2RlSUQgPSAwO1xuXG4vKipcbiAqIEEgYE5vZGVgIGRlc2NyaWJlcyB0aGUgY29ubmVjdGl2aXR5IGJldHdlZW4gdHdvIGxheWVycy5cbiAqXG4gKiBFYWNoIHRpbWUgYSBsYXllciBpcyBjb25uZWN0ZWQgdG8gc29tZSBuZXcgaW5wdXQsXG4gKiBhIG5vZGUgaXMgYWRkZWQgdG8gYGxheWVyLmluYm91bmROb2Rlc2AuXG4gKlxuICogRWFjaCB0aW1lIHRoZSBvdXRwdXQgb2YgYSBsYXllciBpcyB1c2VkIGJ5IGFub3RoZXIgbGF5ZXIsXG4gKiBhIG5vZGUgaXMgYWRkZWQgdG8gYGxheWVyLm91dGJvdW5kTm9kZXNgLlxuICpcbiAqIGBub2RlSW5kaWNlc2AgYW5kIGB0ZW5zb3JJbmRpY2VzYCBhcmUgYmFzaWNhbGx5IGZpbmUtZ3JhaW5lZCBjb29yZGluYXRlc1xuICogZGVzY3JpYmluZyB0aGUgb3JpZ2luIG9mIHRoZSBgaW5wdXRUZW5zb3JzYCwgdmVyaWZ5aW5nIHRoZSBmb2xsb3dpbmc6XG4gKlxuICogYGlucHV0VGVuc29yc1tpXSA9PVxuICogaW5ib3VuZExheWVyc1tpXS5pbmJvdW5kTm9kZXNbbm9kZUluZGljZXNbaV1dLm91dHB1dFRlbnNvcnNbXG4gKiAgIHRlbnNvckluZGljZXNbaV1dYFxuICpcbiAqIEEgbm9kZSBmcm9tIGxheWVyIEEgdG8gbGF5ZXIgQiBpcyBhZGRlZCB0bzpcbiAqICAgICBBLm91dGJvdW5kTm9kZXNcbiAqICAgICBCLmluYm91bmROb2Rlc1xuICovXG5leHBvcnQgY2xhc3MgTm9kZSB7XG4gIC8qKlxuICAgKiBUaGUgbGF5ZXIgdGhhdCB0YWtlcyBgaW5wdXRUZW5zb3JzYCBhbmQgdHVybnMgdGhlbSBpbnRvIGBvdXRwdXRUZW5zb3JzYFxuICAgKiAodGhlIG5vZGUgZ2V0cyBjcmVhdGVkIHdoZW4gdGhlIGBjYWxsYCBtZXRob2Qgb2YgdGhlIGxheWVyIGlzIGNhbGxlZCkuXG4gICAqL1xuICBvdXRib3VuZExheWVyOiBMYXllcjtcbiAgLyoqXG4gICAqIEEgbGlzdCBvZiBsYXllcnMsIHRoZSBzYW1lIGxlbmd0aCBhcyBgaW5wdXRUZW5zb3JzYCwgdGhlIGxheWVycyBmcm9tIHdoZXJlXG4gICAqIGBpbnB1dFRlbnNvcnNgIG9yaWdpbmF0ZS5cbiAgICovXG4gIGluYm91bmRMYXllcnM6IExheWVyW107XG4gIC8qKlxuICAgKiBBIGxpc3Qgb2YgaW50ZWdlcnMsIHRoZSBzYW1lIGxlbmd0aCBhcyBgaW5ib3VuZExheWVyc2AuIGBub2RlSW5kaWNlc1tpXWAgaXNcbiAgICogdGhlIG9yaWdpbiBub2RlIG9mIGBpbnB1dFRlbnNvcnNbaV1gIChuZWNlc3Nhcnkgc2luY2UgZWFjaCBpbmJvdW5kIGxheWVyXG4gICAqIG1pZ2h0IGhhdmUgc2V2ZXJhbCBub2RlcywgZS5nLiBpZiB0aGUgbGF5ZXIgaXMgYmVpbmcgc2hhcmVkIHdpdGggYVxuICAgKiBkaWZmZXJlbnQgZGF0YSBzdHJlYW0pLlxuICAgKi9cbiAgbm9kZUluZGljZXM6IG51bWJlcltdO1xuICAvKipcbiAgICogQSBsaXN0IG9mIGludGVnZXJzLCB0aGUgc2FtZSBsZW5ndGggYXMgYGluYm91bmRMYXllcnNgLiBgdGVuc29ySW5kaWNlc1tpXWBcbiAgICogaXMgdGhlIGluZGV4IG9mIGBpbnB1dFRlbnNvcnNbaV1gIHdpdGhpbiB0aGUgb3V0cHV0IG9mIHRoZSBpbmJvdW5kIGxheWVyXG4gICAqIChuZWNlc3Nhcnkgc2luY2UgZWFjaCBpbmJvdW5kIGxheWVyIG1pZ2h0IGhhdmUgbXVsdGlwbGUgdGVuc29yIG91dHB1dHMsXG4gICAqIHdpdGggZWFjaCBvbmUgYmVpbmcgaW5kZXBlbmRlbnRseSBtYW5pcHVsYWJsZSkuXG4gICAqL1xuICB0ZW5zb3JJbmRpY2VzOiBudW1iZXJbXTtcbiAgLyoqIExpc3Qgb2YgaW5wdXQgdGVuc29ycy4gKi9cbiAgaW5wdXRUZW5zb3JzOiBTeW1ib2xpY1RlbnNvcltdO1xuICAvKiogTGlzdCBvZiBvdXRwdXQgdGVuc29ycy4gKi9cbiAgb3V0cHV0VGVuc29yczogU3ltYm9saWNUZW5zb3JbXTtcbiAgLyoqIExpc3Qgb2YgaW5wdXQgbWFza3MgKGEgbWFzayBjYW4gYmUgYSB0ZW5zb3IsIG9yIG51bGwpLiAqL1xuICBpbnB1dE1hc2tzOiBUZW5zb3JbXTtcbiAgLyoqIExpc3Qgb2Ygb3V0cHV0IG1hc2tzIChhIG1hc2sgY2FuIGJlIGEgdGVuc29yLCBvciBudWxsKS4gKi9cbiAgb3V0cHV0TWFza3M6IFRlbnNvcltdO1xuICAvKiogTGlzdCBvZiBpbnB1dCBzaGFwZSB0dXBsZXMuICovXG4gIGlucHV0U2hhcGVzOiBTaGFwZXxTaGFwZVtdO1xuICAvKiogTGlzdCBvZiBvdXRwdXQgc2hhcGUgdHVwbGVzLiAqL1xuICBvdXRwdXRTaGFwZXM6IFNoYXBlfFNoYXBlW107XG5cbiAgcmVhZG9ubHkgaWQ6IG51bWJlcjtcblxuICBjb25zdHJ1Y3RvcihcbiAgICAgIGFyZ3M6IE5vZGVBcmdzLFxuICAgICAgLy8gVE9ETyhtaWNoYWVsdGVycnkpOiBEZWZpbmUgYWN0dWFsIHR5cGUgZm9yIHRoaXMuXG4gICAgICBwdWJsaWMgY2FsbEFyZ3M/OiBLd2FyZ3MpIHtcbiAgICB0aGlzLmlkID0gX25leHROb2RlSUQrKztcbiAgICAvKlxuICAgICAgTGF5ZXIgaW5zdGFuY2UgKE5PVCBhIGxpc3QpLlxuICAgICAgdGhpcyBpcyB0aGUgbGF5ZXIgdGhhdCB0YWtlcyBhIGxpc3Qgb2YgaW5wdXQgdGVuc29yc1xuICAgICAgYW5kIHR1cm5zIHRoZW0gaW50byBhIGxpc3Qgb2Ygb3V0cHV0IHRlbnNvcnMuXG4gICAgICB0aGUgY3VycmVudCBub2RlIHdpbGwgYmUgYWRkZWQgdG9cbiAgICAgIHRoZSBpbmJvdW5kTm9kZXMgb2Ygb3V0Ym91bmRMYXllci5cbiAgICAqL1xuICAgIHRoaXMub3V0Ym91bmRMYXllciA9IGFyZ3Mub3V0Ym91bmRMYXllcjtcblxuICAgIC8qXG4gICAgICAgIFRoZSBmb2xsb3dpbmcgMyBwcm9wZXJ0aWVzIGRlc2NyaWJlIHdoZXJlXG4gICAgICAgIHRoZSBpbnB1dCB0ZW5zb3JzIGNvbWUgZnJvbTogd2hpY2ggbGF5ZXJzLFxuICAgICAgICBhbmQgZm9yIGVhY2ggbGF5ZXIsIHdoaWNoIG5vZGUgYW5kIHdoaWNoXG4gICAgICAgIHRlbnNvciBvdXRwdXQgb2YgZWFjaCBub2RlLlxuICAgICovXG5cbiAgICAvLyBMaXN0IG9mIGxheWVyIGluc3RhbmNlcy5cbiAgICB0aGlzLmluYm91bmRMYXllcnMgPSBhcmdzLmluYm91bmRMYXllcnM7XG4gICAgLy8gTGlzdCBvZiBpbnRlZ2VycywgMToxIG1hcHBpbmcgd2l0aCBpbmJvdW5kTGF5ZXJzLlxuICAgIHRoaXMubm9kZUluZGljZXMgPSBhcmdzLm5vZGVJbmRpY2VzO1xuICAgIC8vIExpc3Qgb2YgaW50ZWdlcnMsIDE6MSBtYXBwaW5nIHdpdGggaW5ib3VuZExheWVycy5cbiAgICB0aGlzLnRlbnNvckluZGljZXMgPSBhcmdzLnRlbnNvckluZGljZXM7XG5cbiAgICAvKlxuICAgICAgICBGb2xsb3dpbmcgMiBwcm9wZXJ0aWVzOlxuICAgICAgICB0ZW5zb3IgaW5wdXRzIGFuZCBvdXRwdXRzIG9mIG91dGJvdW5kTGF5ZXIuXG4gICAgKi9cblxuICAgIC8vIExpc3Qgb2YgdGVuc29ycy4gMToxIG1hcHBpbmcgd2l0aCBpbmJvdW5kTGF5ZXJzLlxuICAgIHRoaXMuaW5wdXRUZW5zb3JzID0gYXJncy5pbnB1dFRlbnNvcnM7XG4gICAgLy8gTGlzdCBvZiB0ZW5zb3JzLCBjcmVhdGVkIGJ5IG91dGJvdW5kTGF5ZXIuY2FsbCgpLlxuICAgIHRoaXMub3V0cHV0VGVuc29ycyA9IGFyZ3Mub3V0cHV0VGVuc29ycztcblxuICAgIC8qXG4gICAgICAgIEZvbGxvd2luZyAyIHByb3BlcnRpZXM6IGlucHV0IGFuZCBvdXRwdXQgbWFza3MuXG4gICAgICAgIExpc3Qgb2YgdGVuc29ycywgMToxIG1hcHBpbmcgd2l0aCBpbnB1dFRlbnNvci5cbiAgICAqL1xuICAgIHRoaXMuaW5wdXRNYXNrcyA9IGFyZ3MuaW5wdXRNYXNrcztcbiAgICAvLyBMaXN0IG9mIHRlbnNvcnMsIGNyZWF0ZWQgYnkgb3V0Ym91bmRMYXllci5jb21wdXRlTWFzaygpLlxuICAgIHRoaXMub3V0cHV0TWFza3MgPSBhcmdzLm91dHB1dE1hc2tzO1xuXG4gICAgLy8gRm9sbG93aW5nIDIgcHJvcGVydGllczogaW5wdXQgYW5kIG91dHB1dCBzaGFwZXMuXG5cbiAgICAvLyBMaXN0IG9mIHNoYXBlIHR1cGxlcywgc2hhcGVzIG9mIGlucHV0VGVuc29ycy5cbiAgICB0aGlzLmlucHV0U2hhcGVzID0gYXJncy5pbnB1dFNoYXBlcztcbiAgICAvLyBMaXN0IG9mIHNoYXBlIHR1cGxlcywgc2hhcGVzIG9mIG91dHB1dFRlbnNvcnMuXG4gICAgdGhpcy5vdXRwdXRTaGFwZXMgPSBhcmdzLm91dHB1dFNoYXBlcztcblxuICAgIC8vIEFkZCBub2RlcyB0byBhbGwgbGF5ZXJzIGludm9sdmVkLlxuICAgIGZvciAoY29uc3QgbGF5ZXIgb2YgYXJncy5pbmJvdW5kTGF5ZXJzKSB7XG4gICAgICBpZiAobGF5ZXIgIT0gbnVsbCkge1xuICAgICAgICBsYXllci5vdXRib3VuZE5vZGVzLnB1c2godGhpcyk7XG4gICAgICB9XG4gICAgfVxuICAgIGFyZ3Mub3V0Ym91bmRMYXllci5pbmJvdW5kTm9kZXMucHVzaCh0aGlzKTtcbiAgfVxuXG4gIGdldENvbmZpZygpOiBzZXJpYWxpemF0aW9uLkNvbmZpZ0RpY3Qge1xuICAgIGNvbnN0IGluYm91bmROYW1lczogc3RyaW5nW10gPSBbXTtcbiAgICBmb3IgKGNvbnN0IGxheWVyIG9mIHRoaXMuaW5ib3VuZExheWVycykge1xuICAgICAgaWYgKGxheWVyICE9IG51bGwpIHtcbiAgICAgICAgaW5ib3VuZE5hbWVzLnB1c2gobGF5ZXIubmFtZSk7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBpbmJvdW5kTmFtZXMucHVzaChudWxsKTtcbiAgICAgIH1cbiAgICB9XG4gICAgcmV0dXJuIHtcbiAgICAgIG91dGJvdW5kTGF5ZXI6IHRoaXMub3V0Ym91bmRMYXllciA/IHRoaXMub3V0Ym91bmRMYXllci5uYW1lIDogbnVsbCxcbiAgICAgIGluYm91bmRMYXllcnM6IGluYm91bmROYW1lcyxcbiAgICAgIG5vZGVJbmRpY2VzOiB0aGlzLm5vZGVJbmRpY2VzLFxuICAgICAgdGVuc29ySW5kaWNlczogdGhpcy50ZW5zb3JJbmRpY2VzXG4gICAgfTtcbiAgfVxufVxuXG4vKiogQ29uc3RydWN0b3IgYXJndW1lbnRzIGZvciBMYXllci4gKi9cbmV4cG9ydCBkZWNsYXJlIGludGVyZmFjZSBMYXllckFyZ3Mge1xuICAvKipcbiAgICogSWYgZGVmaW5lZCwgd2lsbCBiZSB1c2VkIHRvIGNyZWF0ZSBhbiBpbnB1dCBsYXllciB0byBpbnNlcnQgYmVmb3JlIHRoaXNcbiAgICogbGF5ZXIuIElmIGJvdGggYGlucHV0U2hhcGVgIGFuZCBgYmF0Y2hJbnB1dFNoYXBlYCBhcmUgZGVmaW5lZCxcbiAgICogYGJhdGNoSW5wdXRTaGFwZWAgd2lsbCBiZSB1c2VkLiBUaGlzIGFyZ3VtZW50IGlzIG9ubHkgYXBwbGljYWJsZSB0byBpbnB1dFxuICAgKiBsYXllcnMgKHRoZSBmaXJzdCBsYXllciBvZiBhIG1vZGVsKS5cbiAgICovXG4gIGlucHV0U2hhcGU/OiBTaGFwZTtcbiAgLyoqXG4gICAqIElmIGRlZmluZWQsIHdpbGwgYmUgdXNlZCB0byBjcmVhdGUgYW4gaW5wdXQgbGF5ZXIgdG8gaW5zZXJ0IGJlZm9yZSB0aGlzXG4gICAqIGxheWVyLiBJZiBib3RoIGBpbnB1dFNoYXBlYCBhbmQgYGJhdGNoSW5wdXRTaGFwZWAgYXJlIGRlZmluZWQsXG4gICAqIGBiYXRjaElucHV0U2hhcGVgIHdpbGwgYmUgdXNlZC4gVGhpcyBhcmd1bWVudCBpcyBvbmx5IGFwcGxpY2FibGUgdG8gaW5wdXRcbiAgICogbGF5ZXJzICh0aGUgZmlyc3QgbGF5ZXIgb2YgYSBtb2RlbCkuXG4gICAqL1xuICBiYXRjaElucHV0U2hhcGU/OiBTaGFwZTtcbiAgLyoqXG4gICAqIElmIGBpbnB1dFNoYXBlYCBpcyBzcGVjaWZpZWQgYW5kIGBiYXRjaElucHV0U2hhcGVgIGlzICpub3QqIHNwZWNpZmllZCxcbiAgICogYGJhdGNoU2l6ZWAgaXMgdXNlZCB0byBjb25zdHJ1Y3QgdGhlIGBiYXRjaElucHV0U2hhcGVgOiBgW2JhdGNoU2l6ZSxcbiAgICogLi4uaW5wdXRTaGFwZV1gXG4gICAqL1xuICBiYXRjaFNpemU/OiBudW1iZXI7XG4gIC8qKlxuICAgKiBUaGUgZGF0YS10eXBlIGZvciB0aGlzIGxheWVyLiBEZWZhdWx0cyB0byAnZmxvYXQzMicuXG4gICAqIFRoaXMgYXJndW1lbnQgaXMgb25seSBhcHBsaWNhYmxlIHRvIGlucHV0IGxheWVycyAodGhlIGZpcnN0IGxheWVyIG9mIGFcbiAgICogbW9kZWwpLlxuICAgKi9cbiAgZHR5cGU/OiBEYXRhVHlwZTtcbiAgLyoqIE5hbWUgZm9yIHRoaXMgbGF5ZXIuICovXG4gIG5hbWU/OiBzdHJpbmc7XG4gIC8qKlxuICAgKiBXaGV0aGVyIHRoZSB3ZWlnaHRzIG9mIHRoaXMgbGF5ZXIgYXJlIHVwZGF0YWJsZSBieSBgZml0YC5cbiAgICogRGVmYXVsdHMgdG8gdHJ1ZS5cbiAgICovXG4gIHRyYWluYWJsZT86IGJvb2xlYW47XG4gIC8qKlxuICAgKiBJbml0aWFsIHdlaWdodCB2YWx1ZXMgb2YgdGhlIGxheWVyLlxuICAgKi9cbiAgd2VpZ2h0cz86IFRlbnNvcltdO1xuICAvKiogTGVnYWN5IHN1cHBvcnQuIERvIG5vdCB1c2UgZm9yIG5ldyBjb2RlLiAqL1xuICBpbnB1dERUeXBlPzogRGF0YVR5cGU7XG59XG5cbi8vIElmIG5lY2Vzc2FyeSwgYWRkIGBvdXRwdXRgIGFyZ3VtZW50cyB0byB0aGUgQ2FsbEhvb2sgZnVuY3Rpb24uXG4vLyBUaGlzIGlzIGN1cnJlbnRseSB1c2VkIGZvciB0ZXN0aW5nIG9ubHksIGJ1dCBtYXkgYmUgdXNlZCBmb3IgZGVidWdnZXItcmVsYXRlZFxuLy8gcHVycG9zZXMgaW4gdGhlIGZ1dHVyZS5cbmV4cG9ydCB0eXBlIENhbGxIb29rID0gKGlucHV0czogVGVuc29yfFRlbnNvcltdLCBrd2FyZ3M6IEt3YXJncykgPT4gdm9pZDtcblxubGV0IF9uZXh0TGF5ZXJJRCA9IDA7XG5cbi8qKlxuICogQSBsYXllciBpcyBhIGdyb3VwaW5nIG9mIG9wZXJhdGlvbnMgYW5kIHdlaWdodHMgdGhhdCBjYW4gYmUgY29tcG9zZWQgdG9cbiAqIGNyZWF0ZSBhIGB0Zi5MYXllcnNNb2RlbGAuXG4gKlxuICogTGF5ZXJzIGFyZSBjb25zdHJ1Y3RlZCBieSB1c2luZyB0aGUgZnVuY3Rpb25zIHVuZGVyIHRoZVxuICogW3RmLmxheWVyc10oI0xheWVycy1CYXNpYykgbmFtZXNwYWNlLlxuICpcbiAqIEBkb2Mge2hlYWRpbmc6ICdMYXllcnMnLCBzdWJoZWFkaW5nOiAnQ2xhc3NlcycsIG5hbWVzcGFjZTogJ2xheWVycyd9XG4gKi9cbmV4cG9ydCBhYnN0cmFjdCBjbGFzcyBMYXllciBleHRlbmRzIHNlcmlhbGl6YXRpb24uU2VyaWFsaXphYmxlIHtcbiAgLyoqIE5hbWUgZm9yIHRoaXMgbGF5ZXIuIE11c3QgYmUgdW5pcXVlIHdpdGhpbiBhIG1vZGVsLiAqL1xuICBuYW1lOiBzdHJpbmc7XG4gIC8qKlxuICAgKiBMaXN0IG9mIElucHV0U3BlYyBjbGFzcyBpbnN0YW5jZXMuXG4gICAqXG4gICAqIEVhY2ggZW50cnkgZGVzY3JpYmVzIG9uZSByZXF1aXJlZCBpbnB1dDpcbiAgICogLSBuZGltXG4gICAqIC0gZHR5cGVcbiAgICogQSBsYXllciB3aXRoIGBuYCBpbnB1dCB0ZW5zb3JzIG11c3QgaGF2ZSBhbiBgaW5wdXRTcGVjYCBvZiBsZW5ndGggYG5gLlxuICAgKi9cbiAgaW5wdXRTcGVjOiBJbnB1dFNwZWNbXTtcbiAgc3VwcG9ydHNNYXNraW5nOiBib29sZWFuO1xuICAvKiogV2hldGhlciB0aGUgbGF5ZXIgd2VpZ2h0cyB3aWxsIGJlIHVwZGF0ZWQgZHVyaW5nIHRyYWluaW5nLiAqL1xuICBwcm90ZWN0ZWQgdHJhaW5hYmxlXzogYm9vbGVhbjtcbiAgYmF0Y2hJbnB1dFNoYXBlOiBTaGFwZTtcbiAgZHR5cGU6IERhdGFUeXBlO1xuICBpbml0aWFsV2VpZ2h0czogVGVuc29yW107XG5cbiAgaW5ib3VuZE5vZGVzOiBOb2RlW107XG4gIG91dGJvdW5kTm9kZXM6IE5vZGVbXTtcblxuICBhY3Rpdml0eVJlZ3VsYXJpemVyOiBSZWd1bGFyaXplcjtcblxuICBwcm90ZWN0ZWQgX3RyYWluYWJsZVdlaWdodHM6IExheWVyVmFyaWFibGVbXTtcbiAgcHJpdmF0ZSBfbm9uVHJhaW5hYmxlV2VpZ2h0czogTGF5ZXJWYXJpYWJsZVtdO1xuICBwcml2YXRlIF9sb3NzZXM6IFJlZ3VsYXJpemVyRm5bXTtcbiAgLy8gVE9ETyhjYWlzKTogX3VwZGF0ZXMgaXMgY3VycmVudGx5IHVudXNlZC5cbiAgcHJpdmF0ZSBfdXBkYXRlczogVGVuc29yW107XG4gIHByaXZhdGUgX2J1aWx0OiBib29sZWFuO1xuICBwcml2YXRlIF9jYWxsSG9vazogQ2FsbEhvb2sgPSBudWxsO1xuXG4gIHByaXZhdGUgX2FkZGVkV2VpZ2h0TmFtZXM6IHN0cmluZ1tdID0gW107XG5cbiAgcmVhZG9ubHkgaWQ6IG51bWJlcjtcblxuICAvLyBQb3J0aW5nIE5vdGVzOiBQeUtlcmFzIGRvZXMgbm90IGhhdmUgdGhpcyBwcm9wZXJ0eSBpbiB0aGlzIGJhc2UgTGF5ZXJcbiAgLy8gICBjbGFzcy4gSW5zdGVhZCBsZXRzIExheWVyIHN1YmNsYXNzIHNldCBpdCBkeW5hbWljYWxseSBhbmQgY2hlY2tzIHRoZVxuICAvLyAgIHZhbHVlIHdpdGggYGhhc2F0dHJgLiBJbiB0ZmpzLWxheWVycywgd2UgbGV0IHRoaXMgYmUgYSBtZW1iZXIgb2YgdGhpc1xuICAvLyAgIGJhc2UgY2xhc3MuXG4gIHByb3RlY3RlZCBfc3RhdGVmdWwgPSBmYWxzZTtcblxuICBwcm90ZWN0ZWQgX3JlZkNvdW50OiBudW1iZXJ8bnVsbDtcblxuICAvLyBBIGZsYWcgZm9yIHdoZXRoZXIgZmFzdCAoaS5lLiwgYWxsLXplcm8pIHdlaWdodCBpbml0aWFsaXphdGlvbiBpcyB0b1xuICAvLyBiZSB1c2VkIGR1cmluZyBgYnVpbGQoKWAgY2FsbC4gVGhpcyBzcGVlZHMgdXAgd2VpZ2h0IGluaXRpYWxpemF0aW9uXG4gIC8vIGJ5IHNhdmluZyB1bm5lY2Vzc2FyeSBjYWxscyB0byBleHBlbnNpdmUgaW5pdGlhbGl6ZXJzIGluIGNhc2VzIHdoZXJlXG4gIC8vIHRoZSBpbml0aWFsaXplZCB2YWx1ZXMgd2lsbCBiZSBvdmVyd3JpdHRlbiBieSBsb2FkZWQgd2VpZ2h0IHZhbHVlc1xuICAvLyBkdXJpbmcgbW9kZWwgbG9hZGluZy5cbiAgcHJpdmF0ZSBmYXN0V2VpZ2h0SW5pdER1cmluZ0J1aWxkOiBib29sZWFuO1xuXG4gIGNvbnN0cnVjdG9yKGFyZ3M6IExheWVyQXJncyA9IHt9KSB7XG4gICAgc3VwZXIoKTtcbiAgICB0aGlzLmlkID0gX25leHRMYXllcklEKys7XG5cbiAgICB0aGlzLmFjdGl2aXR5UmVndWxhcml6ZXIgPSBudWxsO1xuXG4gICAgdGhpcy5pbnB1dFNwZWMgPSBudWxsO1xuICAgIHRoaXMuc3VwcG9ydHNNYXNraW5nID0gZmFsc2U7XG5cbiAgICAvLyBUaGVzZSBwcm9wZXJ0aWVzIHdpbGwgYmUgc2V0IHVwb24gY2FsbCBvZiB0aGlzLmJ1aWxkKClcbiAgICB0aGlzLl90cmFpbmFibGVXZWlnaHRzID0gW107XG4gICAgdGhpcy5fbm9uVHJhaW5hYmxlV2VpZ2h0cyA9IFtdO1xuICAgIHRoaXMuX2xvc3NlcyA9IFtdO1xuICAgIHRoaXMuX3VwZGF0ZXMgPSBbXTtcbiAgICB0aGlzLl9idWlsdCA9IGZhbHNlO1xuXG4gICAgLypcbiAgICAgIFRoZXNlIGxpc3RzIHdpbGwgYmUgZmlsbGVkIHZpYSBzdWNjZXNzaXZlIGNhbGxzXG4gICAgICB0byB0aGlzLmFkZEluYm91bmROb2RlKCkuXG4gICAgICovXG4gICAgdGhpcy5pbmJvdW5kTm9kZXMgPSBbXTtcbiAgICB0aGlzLm91dGJvdW5kTm9kZXMgPSBbXTtcblxuICAgIGxldCBuYW1lID0gYXJncy5uYW1lO1xuICAgIGlmICghbmFtZSkge1xuICAgICAgY29uc3QgcHJlZml4ID0gdGhpcy5nZXRDbGFzc05hbWUoKTtcbiAgICAgIG5hbWUgPSBnZW5lcmljX3V0aWxzLnRvU25ha2VDYXNlKHByZWZpeCkgKyAnXycgKyBnZXRVaWQocHJlZml4KTtcbiAgICB9XG4gICAgdGhpcy5uYW1lID0gbmFtZTtcblxuICAgIHRoaXMudHJhaW5hYmxlXyA9IGFyZ3MudHJhaW5hYmxlID09IG51bGwgPyB0cnVlIDogYXJncy50cmFpbmFibGU7XG5cbiAgICBpZiAoYXJncy5pbnB1dFNoYXBlICE9IG51bGwgfHwgYXJncy5iYXRjaElucHV0U2hhcGUgIT0gbnVsbCkge1xuICAgICAgLypcbiAgICAgICAgSW4gdGhpcyBjYXNlIHdlIHdpbGwgbGF0ZXIgY3JlYXRlIGFuIGlucHV0IGxheWVyXG4gICAgICAgIHRvIGluc2VydCBiZWZvcmUgdGhlIGN1cnJlbnQgbGF5ZXJcbiAgICAgICAqL1xuICAgICAgbGV0IGJhdGNoSW5wdXRTaGFwZTogU2hhcGU7XG4gICAgICBpZiAoYXJncy5iYXRjaElucHV0U2hhcGUgIT0gbnVsbCkge1xuICAgICAgICBiYXRjaElucHV0U2hhcGUgPSBhcmdzLmJhdGNoSW5wdXRTaGFwZTtcbiAgICAgIH0gZWxzZSBpZiAoYXJncy5pbnB1dFNoYXBlICE9IG51bGwpIHtcbiAgICAgICAgbGV0IGJhdGNoU2l6ZTogbnVtYmVyID0gbnVsbDtcbiAgICAgICAgaWYgKGFyZ3MuYmF0Y2hTaXplICE9IG51bGwpIHtcbiAgICAgICAgICBiYXRjaFNpemUgPSBhcmdzLmJhdGNoU2l6ZTtcbiAgICAgICAgfVxuICAgICAgICBiYXRjaElucHV0U2hhcGUgPSBbYmF0Y2hTaXplXS5jb25jYXQoYXJncy5pbnB1dFNoYXBlKTtcbiAgICAgIH1cbiAgICAgIHRoaXMuYmF0Y2hJbnB1dFNoYXBlID0gYmF0Y2hJbnB1dFNoYXBlO1xuXG4gICAgICAvLyBTZXQgZHR5cGUuXG4gICAgICBsZXQgZHR5cGUgPSBhcmdzLmR0eXBlO1xuICAgICAgaWYgKGR0eXBlID09IG51bGwpIHtcbiAgICAgICAgZHR5cGUgPSBhcmdzLmlucHV0RFR5cGU7XG4gICAgICB9XG4gICAgICBpZiAoZHR5cGUgPT0gbnVsbCkge1xuICAgICAgICBkdHlwZSA9ICdmbG9hdDMyJztcbiAgICAgIH1cbiAgICAgIHRoaXMuZHR5cGUgPSBkdHlwZTtcbiAgICB9XG5cbiAgICBpZiAoYXJncy53ZWlnaHRzICE9IG51bGwpIHtcbiAgICAgIHRoaXMuaW5pdGlhbFdlaWdodHMgPSBhcmdzLndlaWdodHM7XG4gICAgfSBlbHNlIHtcbiAgICAgIHRoaXMuaW5pdGlhbFdlaWdodHMgPSBudWxsO1xuICAgIH1cblxuICAgIC8vIFRoZSB2YWx1ZSBvZiBgX3JlZkNvdW50YCBpcyBpbml0aWFsaXplZCB0byBudWxsLiBXaGVuIHRoZSBsYXllciBpcyB1c2VkXG4gICAgLy8gaW4gYSBzeW1ib2xpYyB3YXkgZm9yIHRoZSBmaXJzdCB0aW1lLCBpdCB3aWxsIGJlIHNldCB0byAxLlxuICAgIHRoaXMuX3JlZkNvdW50ID0gbnVsbDtcblxuICAgIHRoaXMuZmFzdFdlaWdodEluaXREdXJpbmdCdWlsZCA9IGZhbHNlO1xuICB9XG5cbiAgLyoqXG4gICAqIENvbnZlcnRzIGEgbGF5ZXIgYW5kIGl0cyBpbmRleCB0byBhIHVuaXF1ZSAoaW1tdXRhYmxlIHR5cGUpIG5hbWUuXG4gICAqIFRoaXMgZnVuY3Rpb24gaXMgdXNlZCBpbnRlcm5hbGx5IHdpdGggYHRoaXMuY29udGFpbmVyTm9kZXNgLlxuICAgKiBAcGFyYW0gbGF5ZXIgVGhlIGxheWVyLlxuICAgKiBAcGFyYW0gbm9kZUluZGV4IFRoZSBsYXllcidzIHBvc2l0aW9uIChlLmcuIHZpYSBlbnVtZXJhdGUpIGluIGEgbGlzdCBvZlxuICAgKiAgIG5vZGVzLlxuICAgKlxuICAgKiBAcmV0dXJucyBUaGUgdW5pcXVlIG5hbWUuXG4gICAqL1xuICBwcm90ZWN0ZWQgc3RhdGljIG5vZGVLZXkobGF5ZXI6IExheWVyLCBub2RlSW5kZXg6IG51bWJlcikge1xuICAgIHJldHVybiBsYXllci5uYW1lICsgJ19pYi0nICsgbm9kZUluZGV4LnRvU3RyaW5nKCk7XG4gIH1cblxuICAvKipcbiAgICogUmV0dXJucyB0aGlzLmluYm91bmROb2RlIGF0IGluZGV4IG5vZGVJbmRleC5cbiAgICpcbiAgICogUG9ydGluZyBub3RlOiBUaGlzIGlzIGEgcmVwbGFjZW1lbnQgZm9yIF9nZXRfbm9kZV9hdHRyaWJ1dGVfYXRfaW5kZXgoKVxuICAgKiBAcGFyYW0gbm9kZUluZGV4XG4gICAqIEBwYXJhbSBhdHRyTmFtZSBUaGUgbmFtZSBvZiB0aGUgYXR0cmlidXRlIHJlbGF0ZWQgdG8gcmVxdWVzdCBmb3IgdGhpcyBub2RlLlxuICAgKi9cbiAgcHJpdmF0ZSBnZXROb2RlQXRJbmRleChub2RlSW5kZXg6IG51bWJlciwgYXR0ck5hbWU6IHN0cmluZyk6IE5vZGUge1xuICAgIGlmICh0aGlzLmluYm91bmROb2Rlcy5sZW5ndGggPT09IDApIHtcbiAgICAgIHRocm93IG5ldyBSdW50aW1lRXJyb3IoXG4gICAgICAgICAgJ1RoZSBsYXllciBoYXMgbmV2ZXIgYmVlbiBjYWxsZWQgJyArXG4gICAgICAgICAgYGFuZCB0aHVzIGhhcyBubyBkZWZpbmVkICR7YXR0ck5hbWV9LmApO1xuICAgIH1cbiAgICBpZiAodGhpcy5pbmJvdW5kTm9kZXMubGVuZ3RoIDw9IG5vZGVJbmRleCkge1xuICAgICAgdGhyb3cgbmV3IFZhbHVlRXJyb3IoXG4gICAgICAgICAgYEFza2VkIHRvIGdldCAke2F0dHJOYW1lfSBhdCBub2RlICR7bm9kZUluZGV4fSwgYCArXG4gICAgICAgICAgYGJ1dCB0aGUgbGF5ZXIgaGFzIG9ubHkgJHt0aGlzLmluYm91bmROb2Rlcy5sZW5ndGh9IGluYm91bmQgbm9kZXMuYCk7XG4gICAgfVxuICAgIHJldHVybiB0aGlzLmluYm91bmROb2Rlc1tub2RlSW5kZXhdO1xuICB9XG5cbiAgLyoqXG4gICAqIFJldHJpZXZlcyB0aGUgaW5wdXQgdGVuc29yKHMpIG9mIGEgbGF5ZXIgYXQgYSBnaXZlbiBub2RlLlxuICAgKlxuICAgKiBAcGFyYW0gbm9kZUluZGV4IEludGVnZXIsIGluZGV4IG9mIHRoZSBub2RlIGZyb20gd2hpY2ggdG8gcmV0cmlldmUgdGhlXG4gICAqICAgYXR0cmlidXRlLiBFLmcuIGBub2RlSW5kZXg9MGAgd2lsbCBjb3JyZXNwb25kIHRvIHRoZSBmaXJzdCB0aW1lIHRoZSBsYXllclxuICAgKiAgIHdhcyBjYWxsZWQuXG4gICAqXG4gICAqIEByZXR1cm4gQSB0ZW5zb3IgKG9yIGxpc3Qgb2YgdGVuc29ycyBpZiB0aGUgbGF5ZXIgaGFzIG11bHRpcGxlIGlucHV0cykuXG4gICAqL1xuICBnZXRJbnB1dEF0KG5vZGVJbmRleDogbnVtYmVyKTogU3ltYm9saWNUZW5zb3J8U3ltYm9saWNUZW5zb3JbXSB7XG4gICAgcmV0dXJuIGdlbmVyaWNfdXRpbHMuc2luZ2xldG9uT3JBcnJheShcbiAgICAgICAgdGhpcy5nZXROb2RlQXRJbmRleChub2RlSW5kZXgsICdpbnB1dCcpLmlucHV0VGVuc29ycyk7XG4gIH1cblxuICAvKipcbiAgICogUmV0cmlldmVzIHRoZSBvdXRwdXQgdGVuc29yKHMpIG9mIGEgbGF5ZXIgYXQgYSBnaXZlbiBub2RlLlxuICAgKlxuICAgKiBAcGFyYW0gbm9kZUluZGV4IEludGVnZXIsIGluZGV4IG9mIHRoZSBub2RlIGZyb20gd2hpY2ggdG8gcmV0cmlldmUgdGhlXG4gICAqICAgYXR0cmlidXRlLiBFLmcuIGBub2RlSW5kZXg9MGAgd2lsbCBjb3JyZXNwb25kIHRvIHRoZSBmaXJzdCB0aW1lIHRoZSBsYXllclxuICAgKiAgIHdhcyBjYWxsZWQuXG4gICAqXG4gICAqIEByZXR1cm4gQSB0ZW5zb3IgKG9yIGxpc3Qgb2YgdGVuc29ycyBpZiB0aGUgbGF5ZXIgaGFzIG11bHRpcGxlIG91dHB1dHMpLlxuICAgKi9cbiAgZ2V0T3V0cHV0QXQobm9kZUluZGV4OiBudW1iZXIpOiBTeW1ib2xpY1RlbnNvcnxTeW1ib2xpY1RlbnNvcltdIHtcbiAgICByZXR1cm4gZ2VuZXJpY191dGlscy5zaW5nbGV0b25PckFycmF5KFxuICAgICAgICB0aGlzLmdldE5vZGVBdEluZGV4KG5vZGVJbmRleCwgJ291dHB1dCcpLm91dHB1dFRlbnNvcnMpO1xuICB9XG5cbiAgLy8gUHJvcGVydGllc1xuXG4gIC8qKlxuICAgKiBSZXRyaWV2ZXMgdGhlIGlucHV0IHRlbnNvcihzKSBvZiBhIGxheWVyLlxuICAgKlxuICAgKiBPbmx5IGFwcGxpY2FibGUgaWYgdGhlIGxheWVyIGhhcyBleGFjdGx5IG9uZSBpbmJvdW5kIG5vZGUsXG4gICAqIGkuZS4gaWYgaXQgaXMgY29ubmVjdGVkIHRvIG9uZSBpbmNvbWluZyBsYXllci5cbiAgICpcbiAgICogQHJldHVybiBJbnB1dCB0ZW5zb3Igb3IgbGlzdCBvZiBpbnB1dCB0ZW5zb3JzLlxuICAgKlxuICAgKiBAZXhjZXB0aW9uIEF0dHJpYnV0ZUVycm9yIGlmIHRoZSBsYXllciBpcyBjb25uZWN0ZWQgdG8gbW9yZSB0aGFuIG9uZVxuICAgKiAgIGluY29taW5nIGxheWVycy5cbiAgICovXG4gIGdldCBpbnB1dCgpOiBTeW1ib2xpY1RlbnNvcnxTeW1ib2xpY1RlbnNvcltdIHtcbiAgICBpZiAodGhpcy5pbmJvdW5kTm9kZXMubGVuZ3RoID4gMSkge1xuICAgICAgdGhyb3cgbmV3IEF0dHJpYnV0ZUVycm9yKFxuICAgICAgICAgIGBMYXllciAke3RoaXMubmFtZX1gICtcbiAgICAgICAgICAnIGhhcyBtdWx0aXBsZSBpbmJvdW5kIG5vZGVzLCAnICtcbiAgICAgICAgICAnaGVuY2UgdGhlIG5vdGlvbiBvZiBcImxheWVyIGlucHV0XCIgJyArXG4gICAgICAgICAgJ2lzIGlsbC1kZWZpbmVkLiAnICtcbiAgICAgICAgICAnVXNlIGBnZXRJbnB1dEF0KG5vZGVJbmRleClgIGluc3RlYWQuJyk7XG4gICAgfSBlbHNlIGlmICh0aGlzLmluYm91bmROb2Rlcy5sZW5ndGggPT09IDApIHtcbiAgICAgIHRocm93IG5ldyBBdHRyaWJ1dGVFcnJvcihcbiAgICAgICAgICBgTGF5ZXIgJHt0aGlzLm5hbWV9YCArXG4gICAgICAgICAgJyBpcyBub3QgY29ubmVjdGVkLCBubyBpbnB1dCB0byByZXR1cm4uJyk7XG4gICAgfVxuICAgIHJldHVybiBnZW5lcmljX3V0aWxzLnNpbmdsZXRvbk9yQXJyYXkoXG4gICAgICAgIHRoaXMuZ2V0Tm9kZUF0SW5kZXgoMCwgJ2lucHV0JykuaW5wdXRUZW5zb3JzKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBSZXRyaWV2ZXMgdGhlIG91dHB1dCB0ZW5zb3Iocykgb2YgYSBsYXllci5cbiAgICpcbiAgICogT25seSBhcHBsaWNhYmxlIGlmIHRoZSBsYXllciBoYXMgZXhhY3RseSBvbmUgaW5ib3VuZCBub2RlLFxuICAgKiBpLmUuIGlmIGl0IGlzIGNvbm5lY3RlZCB0byBvbmUgaW5jb21pbmcgbGF5ZXIuXG4gICAqXG4gICAqIEByZXR1cm4gT3V0cHV0IHRlbnNvciBvciBsaXN0IG9mIG91dHB1dCB0ZW5zb3JzLlxuICAgKlxuICAgKiBAZXhjZXB0aW9uIEF0dHJpYnV0ZUVycm9yIGlmIHRoZSBsYXllciBpcyBjb25uZWN0ZWQgdG8gbW9yZSB0aGFuIG9uZVxuICAgKiAgIGluY29taW5nIGxheWVycy5cbiAgICovXG4gIGdldCBvdXRwdXQoKTogU3ltYm9saWNUZW5zb3J8U3ltYm9saWNUZW5zb3JbXSB7XG4gICAgaWYgKHRoaXMuaW5ib3VuZE5vZGVzLmxlbmd0aCA9PT0gMCkge1xuICAgICAgdGhyb3cgbmV3IEF0dHJpYnV0ZUVycm9yKFxuICAgICAgICAgIGBMYXllciAke3RoaXMubmFtZX1gICtcbiAgICAgICAgICAnIGhhcyBubyBpbmJvdW5kIG5vZGVzLicpO1xuICAgIH1cbiAgICBpZiAodGhpcy5pbmJvdW5kTm9kZXMubGVuZ3RoID4gMSkge1xuICAgICAgdGhyb3cgbmV3IEF0dHJpYnV0ZUVycm9yKFxuICAgICAgICAgIGBMYXllciAke3RoaXMubmFtZX1gICtcbiAgICAgICAgICAnIGhhcyBtdWx0aXBsZSBpbmJvdW5kIG5vZGVzLCAnICtcbiAgICAgICAgICAnaGVuY2UgdGhlIG5vdGlvbiBvZiBcImxheWVyIG91dHB1dFwiICcgK1xuICAgICAgICAgICdpcyBpbGwtZGVmaW5lZC4gJyArXG4gICAgICAgICAgJ1VzZSBgZ2V0T3V0cHV0QXQobm9kZUluZGV4KWAgaW5zdGVhZC4nKTtcbiAgICB9XG4gICAgcmV0dXJuIGdlbmVyaWNfdXRpbHMuc2luZ2xldG9uT3JBcnJheShcbiAgICAgICAgdGhpcy5nZXROb2RlQXRJbmRleCgwLCAnb3V0cHV0Jykub3V0cHV0VGVuc29ycyk7XG4gIH1cblxuICBnZXQgbG9zc2VzKCk6IFJlZ3VsYXJpemVyRm5bXSB7XG4gICAgcmV0dXJuIHRoaXMuX2xvc3NlcztcbiAgfVxuXG4gIC8qKlxuICAgKiBSZXRyaWV2ZXMgdGhlIExheWVyJ3MgY3VycmVudCBsb3NzIHZhbHVlcy5cbiAgICpcbiAgICogVXNlZCBmb3IgcmVndWxhcml6ZXJzIGR1cmluZyB0cmFpbmluZy5cbiAgICovXG4gIGNhbGN1bGF0ZUxvc3NlcygpOiBTY2FsYXJbXSB7XG4gICAgLy8gUG9ydGluZyBOb2RlOiBUaGlzIGlzIGFuIGF1Z21lbnRhdGlvbiB0byBMYXllci5sb3NzIGluIFB5S2VyYXMuXG4gICAgLy8gICBJbiBQeUtlcmFzLCBMYXllci5sb3NzIHJldHVybnMgc3ltYm9saWMgdGVuc29ycy4gSGVyZSBhIGNvbmNyZXRlXG4gICAgLy8gICBUZW5zb3IgKHNwZWNpZmljYWxseSBTY2FsYXIpIHZhbHVlcyBhcmUgcmV0dXJuZWQuIFRoaXMgaXMgZHVlIHRvIHRoZVxuICAgIC8vICAgaW1wZXJhdGl2ZSBiYWNrZW5kLlxuICAgIHJldHVybiB0aGlzLmxvc3Nlcy5tYXAobG9zc0ZuID0+IGxvc3NGbigpKTtcbiAgfVxuXG4gIGdldCB1cGRhdGVzKCk6IFRlbnNvcltdIHtcbiAgICByZXR1cm4gdGhpcy5fdXBkYXRlcztcbiAgfVxuXG4gIGdldCBidWlsdCgpOiBib29sZWFuIHtcbiAgICByZXR1cm4gdGhpcy5fYnVpbHQ7XG4gIH1cblxuICBzZXQgYnVpbHQoYnVpbHQ6IGJvb2xlYW4pIHtcbiAgICB0aGlzLl9idWlsdCA9IGJ1aWx0O1xuICB9XG5cbiAgZ2V0IHRyYWluYWJsZSgpOiBib29sZWFuIHtcbiAgICByZXR1cm4gdGhpcy50cmFpbmFibGVfO1xuICB9XG5cbiAgc2V0IHRyYWluYWJsZSh0cmFpbmFibGU6IGJvb2xlYW4pIHtcbiAgICB0aGlzLl90cmFpbmFibGVXZWlnaHRzLmZvckVhY2godyA9PiB3LnRyYWluYWJsZSA9IHRyYWluYWJsZSk7XG4gICAgdGhpcy50cmFpbmFibGVfID0gdHJhaW5hYmxlO1xuICB9XG5cbiAgZ2V0IHRyYWluYWJsZVdlaWdodHMoKTogTGF5ZXJWYXJpYWJsZVtdIHtcbiAgICBpZiAodGhpcy50cmFpbmFibGVfKSB7XG4gICAgICByZXR1cm4gdGhpcy5fdHJhaW5hYmxlV2VpZ2h0cy5maWx0ZXIodyA9PiB3LnRyYWluYWJsZSk7XG4gICAgfSBlbHNlIHtcbiAgICAgIHJldHVybiBbXTtcbiAgICB9XG4gIH1cblxuICBzZXQgdHJhaW5hYmxlV2VpZ2h0cyh3ZWlnaHRzOiBMYXllclZhcmlhYmxlW10pIHtcbiAgICB0aGlzLl90cmFpbmFibGVXZWlnaHRzID0gd2VpZ2h0cztcbiAgfVxuXG4gIGdldCBub25UcmFpbmFibGVXZWlnaHRzKCk6IExheWVyVmFyaWFibGVbXSB7XG4gICAgaWYgKHRoaXMudHJhaW5hYmxlKSB7XG4gICAgICByZXR1cm4gdGhpcy5fdHJhaW5hYmxlV2VpZ2h0cy5maWx0ZXIodyA9PiAhdy50cmFpbmFibGUpXG4gICAgICAgICAgLmNvbmNhdCh0aGlzLl9ub25UcmFpbmFibGVXZWlnaHRzKTtcbiAgICB9IGVsc2Uge1xuICAgICAgcmV0dXJuIHRoaXMuX3RyYWluYWJsZVdlaWdodHMuY29uY2F0KHRoaXMuX25vblRyYWluYWJsZVdlaWdodHMpO1xuICAgIH1cbiAgfVxuXG4gIHNldCBub25UcmFpbmFibGVXZWlnaHRzKHdlaWdodHM6IExheWVyVmFyaWFibGVbXSkge1xuICAgIHRoaXMuX25vblRyYWluYWJsZVdlaWdodHMgPSB3ZWlnaHRzO1xuICB9XG5cbiAgLyoqXG4gICAqIFRoZSBjb25jYXRlbmF0aW9uIG9mIHRoZSBsaXN0cyB0cmFpbmFibGVXZWlnaHRzIGFuZCBub25UcmFpbmFibGVXZWlnaHRzXG4gICAqIChpbiB0aGlzIG9yZGVyKS5cbiAgICovXG4gIGdldCB3ZWlnaHRzKCk6IExheWVyVmFyaWFibGVbXSB7XG4gICAgcmV0dXJuIHRoaXMudHJhaW5hYmxlV2VpZ2h0cy5jb25jYXQodGhpcy5ub25UcmFpbmFibGVXZWlnaHRzKTtcbiAgfVxuXG4gIGdldCBzdGF0ZWZ1bCgpOiBib29sZWFuIHtcbiAgICByZXR1cm4gdGhpcy5fc3RhdGVmdWw7XG4gIH1cblxuICAvKipcbiAgICogUmVzZXQgdGhlIHN0YXRlcyBvZiB0aGUgbGF5ZXIuXG4gICAqXG4gICAqIFRoaXMgbWV0aG9kIG9mIHRoZSBiYXNlIExheWVyIGNsYXNzIGlzIGVzc2VudGlhbGx5IGEgbm8tb3AuXG4gICAqIFN1YmNsYXNzZXMgdGhhdCBhcmUgc3RhdGVmdWwgKGUuZy4sIHN0YXRlZnVsIFJOTnMpIHNob3VsZCBvdmVycmlkZSB0aGlzXG4gICAqIG1ldGhvZC5cbiAgICovXG4gIHJlc2V0U3RhdGVzKCk6IHZvaWQge1xuICAgIGlmICghdGhpcy5zdGF0ZWZ1bCkge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKFxuICAgICAgICAgICdDYW5ub3QgY2FsbCB0aGUgcmVzZXRTdGF0ZXMoKSBtZXRob2Qgb2YgYSBub24tc3RhdGVmdWwgTGF5ZXIgJyArXG4gICAgICAgICAgJ29iamVjdC4nKTtcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogQ2hlY2tzIGNvbXBhdGliaWxpdHkgYmV0d2VlbiB0aGUgbGF5ZXIgYW5kIHByb3ZpZGVkIGlucHV0cy5cbiAgICpcbiAgICogVGhpcyBjaGVja3MgdGhhdCB0aGUgdGVuc29yKHMpIGBpbnB1dGBcbiAgICogdmVyaWZ5IHRoZSBpbnB1dCBhc3N1bXB0aW9ucyBvZiB0aGUgbGF5ZXJcbiAgICogKGlmIGFueSkuIElmIG5vdCwgZXhjZXB0aW9ucyBhcmUgcmFpc2VkLlxuICAgKlxuICAgKiBAcGFyYW0gaW5wdXRzIElucHV0IHRlbnNvciBvciBsaXN0IG9mIGlucHV0IHRlbnNvcnMuXG4gICAqXG4gICAqIEBleGNlcHRpb24gVmFsdWVFcnJvciBpbiBjYXNlIG9mIG1pc21hdGNoIGJldHdlZW5cbiAgICogICB0aGUgcHJvdmlkZWQgaW5wdXRzIGFuZCB0aGUgZXhwZWN0YXRpb25zIG9mIHRoZSBsYXllci5cbiAgICovXG4gIHByb3RlY3RlZCBhc3NlcnRJbnB1dENvbXBhdGliaWxpdHkoaW5wdXRzOiBUZW5zb3J8VGVuc29yW118U3ltYm9saWNUZW5zb3J8XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU3ltYm9saWNUZW5zb3JbXSk6IHZvaWQge1xuICAgIGlucHV0cyA9IGdlbmVyaWNfdXRpbHMudG9MaXN0KGlucHV0cyk7XG4gICAgaWYgKHRoaXMuaW5wdXRTcGVjID09IG51bGwgfHwgdGhpcy5pbnB1dFNwZWMubGVuZ3RoID09PSAwKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIGNvbnN0IGlucHV0U3BlYyA9IGdlbmVyaWNfdXRpbHMudG9MaXN0KHRoaXMuaW5wdXRTcGVjKTtcbiAgICBpZiAoaW5wdXRzLmxlbmd0aCAhPT0gaW5wdXRTcGVjLmxlbmd0aCkge1xuICAgICAgdGhyb3cgbmV3IFZhbHVlRXJyb3IoXG4gICAgICAgICAgYExheWVyICR7dGhpcy5uYW1lfSBleHBlY3RzICR7aW5wdXRTcGVjLmxlbmd0aH0gaW5wdXRzLCBgICtcbiAgICAgICAgICBgYnV0IGl0IHJlY2VpdmVkICR7aW5wdXRzLmxlbmd0aH0gaW5wdXQgdGVuc29ycy4gYCArXG4gICAgICAgICAgYElucHV0IHJlY2VpdmVkOiAke2lucHV0c31gKTtcbiAgICB9XG4gICAgZm9yIChsZXQgaW5wdXRJbmRleCA9IDA7IGlucHV0SW5kZXggPCBpbnB1dHMubGVuZ3RoOyBpbnB1dEluZGV4KyspIHtcbiAgICAgIGNvbnN0IHggPSBpbnB1dHNbaW5wdXRJbmRleF07XG4gICAgICBjb25zdCBzcGVjOiBJbnB1dFNwZWMgPSBpbnB1dFNwZWNbaW5wdXRJbmRleF07XG4gICAgICBpZiAoc3BlYyA9PSBudWxsKSB7XG4gICAgICAgIGNvbnRpbnVlO1xuICAgICAgfVxuXG4gICAgICAvLyBDaGVjayBuZGltLlxuICAgICAgY29uc3QgbmRpbSA9IHgucmFuaztcbiAgICAgIGlmIChzcGVjLm5kaW0gIT0gbnVsbCkge1xuICAgICAgICBpZiAobmRpbSAhPT0gc3BlYy5uZGltKSB7XG4gICAgICAgICAgdGhyb3cgbmV3IFZhbHVlRXJyb3IoXG4gICAgICAgICAgICAgIGBJbnB1dCAke2lucHV0SW5kZXh9IGlzIGluY29tcGF0aWJsZSB3aXRoIGxheWVyICR7dGhpcy5uYW1lfTogYCArXG4gICAgICAgICAgICAgIGBleHBlY3RlZCBuZGltPSR7c3BlYy5uZGltfSwgZm91bmQgbmRpbT0ke25kaW19YCk7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICAgIGlmIChzcGVjLm1heE5EaW0gIT0gbnVsbCkge1xuICAgICAgICBpZiAobmRpbSA+IHNwZWMubWF4TkRpbSkge1xuICAgICAgICAgIHRocm93IG5ldyBWYWx1ZUVycm9yKFxuICAgICAgICAgICAgICBgSW5wdXQgJHtpbnB1dEluZGV4fSBpcyBpbmNvbXBhdGlibGUgd2l0aCBsYXllciAke3RoaXMubmFtZX1gICtcbiAgICAgICAgICAgICAgYDogZXhwZWN0ZWQgbWF4X25kaW09JHtzcGVjLm1heE5EaW19LCBmb3VuZCBuZGltPSR7bmRpbX1gKTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgICAgaWYgKHNwZWMubWluTkRpbSAhPSBudWxsKSB7XG4gICAgICAgIGlmIChuZGltIDwgc3BlYy5taW5ORGltKSB7XG4gICAgICAgICAgdGhyb3cgbmV3IFZhbHVlRXJyb3IoXG4gICAgICAgICAgICAgIGBJbnB1dCAke2lucHV0SW5kZXh9IGlzIGluY29tcGF0aWJsZSB3aXRoIGxheWVyICR7dGhpcy5uYW1lfWAgK1xuICAgICAgICAgICAgICBgOiBleHBlY3RlZCBtaW5fbmRpbT0ke3NwZWMubWluTkRpbX0sIGZvdW5kIG5kaW09JHtuZGltfS5gKTtcbiAgICAgICAgfVxuICAgICAgfVxuXG4gICAgICAvLyBDaGVjayBkdHlwZS5cbiAgICAgIGlmIChzcGVjLmR0eXBlICE9IG51bGwpIHtcbiAgICAgICAgaWYgKHguZHR5cGUgIT09IHNwZWMuZHR5cGUpIHtcbiAgICAgICAgICB0aHJvdyBuZXcgVmFsdWVFcnJvcihcbiAgICAgICAgICAgICAgYElucHV0ICR7aW5wdXRJbmRleH0gaXMgaW5jb21wYXRpYmxlIHdpdGggbGF5ZXIgJHt0aGlzLm5hbWV9IGAgK1xuICAgICAgICAgICAgICBgOiBleHBlY3RlZCBkdHlwZT0ke3NwZWMuZHR5cGV9LCBmb3VuZCBkdHlwZT0ke3guZHR5cGV9LmApO1xuICAgICAgICB9XG4gICAgICB9XG5cbiAgICAgIC8vIENoZWNrIHNwZWNpZmljIHNoYXBlIGF4ZXMuXG4gICAgICBpZiAoc3BlYy5heGVzKSB7XG4gICAgICAgIGNvbnN0IHhTaGFwZSA9IHguc2hhcGU7XG4gICAgICAgIGZvciAoY29uc3Qga2V5IGluIHNwZWMuYXhlcykge1xuICAgICAgICAgIGNvbnN0IGF4aXMgPSBOdW1iZXIoa2V5KTtcbiAgICAgICAgICBjb25zdCB2YWx1ZSA9IHNwZWMuYXhlc1trZXldO1xuICAgICAgICAgIC8vIFBlcmZvcm0gUHl0aG9uLXN0eWxlIHNsaWNpbmcgaW4gY2FzZSBheGlzIDwgMDtcbiAgICAgICAgICAvLyBUT0RPKGNhaXMpOiBVc2UgaHR0cHM6Ly9naXRodWIuY29tL2Fsdml2aS90eXBlc2NyaXB0LXVuZGVyc2NvcmUgdG9cbiAgICAgICAgICAvLyBlbnN1cmUgdHlwZSBzYWZldHkgdGhyb3VnaCBVbmRlcnNjb3JlIGNhbGxzLlxuICAgICAgICAgIGNvbnN0IHhTaGFwZUF0QXhpcyA9XG4gICAgICAgICAgICAgIGF4aXMgPj0gMCA/IHhTaGFwZVtheGlzXSA6IHhTaGFwZVt4U2hhcGUubGVuZ3RoICsgYXhpc107XG4gICAgICAgICAgaWYgKHZhbHVlICE9IG51bGwgJiYgW3ZhbHVlLCBudWxsXS5pbmRleE9mKHhTaGFwZUF0QXhpcykgPT09IC0xKSB7XG4gICAgICAgICAgICB0aHJvdyBuZXcgVmFsdWVFcnJvcihcbiAgICAgICAgICAgICAgICBgSW5wdXQgJHtpbnB1dEluZGV4fSBpcyBpbmNvbXBhdGlibGUgd2l0aCBsYXllciBgICtcbiAgICAgICAgICAgICAgICBgJHt0aGlzLm5hbWV9OiBleHBlY3RlZCBheGlzICR7YXhpc30gb2YgaW5wdXQgc2hhcGUgdG8gYCArXG4gICAgICAgICAgICAgICAgYGhhdmUgdmFsdWUgJHt2YWx1ZX0gYnV0IGdvdCBzaGFwZSAke3hTaGFwZX0uYCk7XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICB9XG5cbiAgICAgIC8vIENoZWNrIHNoYXBlLlxuICAgICAgaWYgKHNwZWMuc2hhcGUgIT0gbnVsbCkge1xuICAgICAgICBmb3IgKGxldCBpID0gMDsgaSA8IHNwZWMuc2hhcGUubGVuZ3RoOyArK2kpIHtcbiAgICAgICAgICBjb25zdCBzcGVjRGltID0gc3BlYy5zaGFwZVtpXTtcbiAgICAgICAgICBjb25zdCBkaW0gPSB4LnNoYXBlW2ldO1xuICAgICAgICAgIGlmIChzcGVjRGltICE9IG51bGwgJiYgZGltICE9IG51bGwpIHtcbiAgICAgICAgICAgIGlmIChzcGVjRGltICE9PSBkaW0pIHtcbiAgICAgICAgICAgICAgdGhyb3cgbmV3IFZhbHVlRXJyb3IoXG4gICAgICAgICAgICAgICAgICBgSW5wdXQgJHtpbnB1dEluZGV4fSBpcyBpbmNvbXBhdGlibGUgd2l0aCBsYXllciBgICtcbiAgICAgICAgICAgICAgICAgIGAke3RoaXMubmFtZX06IGV4cGVjdGVkIHNoYXBlPSR7c3BlYy5zaGFwZX0sIGAgK1xuICAgICAgICAgICAgICAgICAgYGZvdW5kIHNoYXBlPSR7eC5zaGFwZX0uYCk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICB9XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIFRoaXMgaXMgd2hlcmUgdGhlIGxheWVyJ3MgbG9naWMgbGl2ZXMuXG4gICAqXG4gICAqIEBwYXJhbSBpbnB1dHMgSW5wdXQgdGVuc29yLCBvciBsaXN0L3R1cGxlIG9mIGlucHV0IHRlbnNvcnMuXG4gICAqIEBwYXJhbSBrd2FyZ3MgQWRkaXRpb25hbCBrZXl3b3JkIGFyZ3VtZW50cy5cbiAgICpcbiAgICogQHJldHVybiBBIHRlbnNvciBvciBsaXN0L3R1cGxlIG9mIHRlbnNvcnMuXG4gICAqL1xuICBjYWxsKGlucHV0czogVGVuc29yfFRlbnNvcltdLCBrd2FyZ3M6IEt3YXJncyk6IFRlbnNvcnxUZW5zb3JbXSB7XG4gICAgcmV0dXJuIGlucHV0cztcbiAgfVxuXG4gIHByb3RlY3RlZCBpbnZva2VDYWxsSG9vayhpbnB1dHM6IFRlbnNvcnxUZW5zb3JbXSwga3dhcmdzOiBLd2FyZ3MpIHtcbiAgICBpZiAodGhpcy5fY2FsbEhvb2sgIT0gbnVsbCkge1xuICAgICAgdGhpcy5fY2FsbEhvb2soaW5wdXRzLCBrd2FyZ3MpO1xuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBTZXQgY2FsbCBob29rLlxuICAgKiBUaGlzIGlzIGN1cnJlbnRseSB1c2VkIGZvciB0ZXN0aW5nIG9ubHkuXG4gICAqIEBwYXJhbSBjYWxsSG9va1xuICAgKi9cbiAgc2V0Q2FsbEhvb2soY2FsbEhvb2s6IENhbGxIb29rKSB7XG4gICAgdGhpcy5fY2FsbEhvb2sgPSBjYWxsSG9vaztcbiAgfVxuXG4gIC8qKlxuICAgKiBDbGVhciBjYWxsIGhvb2suXG4gICAqIFRoaXMgaXMgY3VycmVudGx5IHVzZWQgZm9yIHRlc3Rpbmcgb25seS5cbiAgICovXG4gIGNsZWFyQ2FsbEhvb2soKSB7XG4gICAgdGhpcy5fY2FsbEhvb2sgPSBudWxsO1xuICB9XG5cbiAgLyoqXG4gICAqIEJ1aWxkcyBvciBleGVjdXRlcyBhIGBMYXllcmAncyBsb2dpYy5cbiAgICpcbiAgICogV2hlbiBjYWxsZWQgd2l0aCBgdGYuVGVuc29yYChzKSwgZXhlY3V0ZSB0aGUgYExheWVyYCdzIGNvbXB1dGF0aW9uIGFuZFxuICAgKiByZXR1cm4gVGVuc29yKHMpLiBGb3IgZXhhbXBsZTpcbiAgICpcbiAgICogYGBganNcbiAgICogY29uc3QgZGVuc2VMYXllciA9IHRmLmxheWVycy5kZW5zZSh7XG4gICAqICAgdW5pdHM6IDEsXG4gICAqICAga2VybmVsSW5pdGlhbGl6ZXI6ICd6ZXJvcycsXG4gICAqICAgdXNlQmlhczogZmFsc2VcbiAgICogfSk7XG4gICAqXG4gICAqIC8vIEludm9rZSB0aGUgbGF5ZXIncyBhcHBseSgpIG1ldGhvZCB3aXRoIGEgYHRmLlRlbnNvcmAgKHdpdGggY29uY3JldGVcbiAgICogLy8gbnVtZXJpYyB2YWx1ZXMpLlxuICAgKiBjb25zdCBpbnB1dCA9IHRmLm9uZXMoWzIsIDJdKTtcbiAgICogY29uc3Qgb3V0cHV0ID0gZGVuc2VMYXllci5hcHBseShpbnB1dCk7XG4gICAqXG4gICAqIC8vIFRoZSBvdXRwdXQncyB2YWx1ZSBpcyBleHBlY3RlZCB0byBiZSBbWzBdLCBbMF1dLCBkdWUgdG8gdGhlIGZhY3QgdGhhdFxuICAgKiAvLyB0aGUgZGVuc2UgbGF5ZXIgaGFzIGEga2VybmVsIGluaXRpYWxpemVkIHRvIGFsbC16ZXJvcyBhbmQgZG9lcyBub3QgaGF2ZVxuICAgKiAvLyBhIGJpYXMuXG4gICAqIG91dHB1dC5wcmludCgpO1xuICAgKiBgYGBcbiAgICpcbiAgICogV2hlbiBjYWxsZWQgd2l0aCBgdGYuU3ltYm9saWNUZW5zb3JgKHMpLCB0aGlzIHdpbGwgcHJlcGFyZSB0aGUgbGF5ZXIgZm9yXG4gICAqIGZ1dHVyZSBleGVjdXRpb24uICBUaGlzIGVudGFpbHMgaW50ZXJuYWwgYm9vay1rZWVwaW5nIG9uIHNoYXBlcyBvZlxuICAgKiBleHBlY3RlZCBUZW5zb3JzLCB3aXJpbmcgbGF5ZXJzIHRvZ2V0aGVyLCBhbmQgaW5pdGlhbGl6aW5nIHdlaWdodHMuXG4gICAqXG4gICAqIENhbGxpbmcgYGFwcGx5YCB3aXRoIGB0Zi5TeW1ib2xpY1RlbnNvcmBzIGFyZSB0eXBpY2FsbHkgdXNlZCBkdXJpbmcgdGhlXG4gICAqIGJ1aWxkaW5nIG9mIG5vbi1gdGYuU2VxdWVudGlhbGAgbW9kZWxzLiBGb3IgZXhhbXBsZTpcbiAgICpcbiAgICogYGBganNcbiAgICogY29uc3QgZmxhdHRlbkxheWVyID0gdGYubGF5ZXJzLmZsYXR0ZW4oKTtcbiAgICogY29uc3QgZGVuc2VMYXllciA9IHRmLmxheWVycy5kZW5zZSh7dW5pdHM6IDF9KTtcbiAgICpcbiAgICogLy8gVXNlIHRmLmxheWVycy5pbnB1dCgpIHRvIG9idGFpbiBhIFN5bWJvbGljVGVuc29yIGFzIGlucHV0IHRvIGFwcGx5KCkuXG4gICAqIGNvbnN0IGlucHV0ID0gdGYuaW5wdXQoe3NoYXBlOiBbMiwgMl19KTtcbiAgICogY29uc3Qgb3V0cHV0MSA9IGZsYXR0ZW5MYXllci5hcHBseShpbnB1dCk7XG4gICAqXG4gICAqIC8vIG91dHB1dDEuc2hhcGUgaXMgW251bGwsIDRdLiBUaGUgZmlyc3QgZGltZW5zaW9uIGlzIHRoZSB1bmRldGVybWluZWRcbiAgICogLy8gYmF0Y2ggc2l6ZS4gVGhlIHNlY29uZCBkaW1lbnNpb24gY29tZXMgZnJvbSBmbGF0dGVuaW5nIHRoZSBbMiwgMl1cbiAgICogLy8gc2hhcGUuXG4gICAqIGNvbnNvbGUubG9nKEpTT04uc3RyaW5naWZ5KG91dHB1dDEuc2hhcGUpKTtcbiAgICpcbiAgICogLy8gVGhlIG91dHB1dCBTeW1ib2xpY1RlbnNvciBvZiB0aGUgZmxhdHRlbiBsYXllciBjYW4gYmUgdXNlZCB0byBjYWxsXG4gICAqIC8vIHRoZSBhcHBseSgpIG9mIHRoZSBkZW5zZSBsYXllcjpcbiAgICogY29uc3Qgb3V0cHV0MiA9IGRlbnNlTGF5ZXIuYXBwbHkob3V0cHV0MSk7XG4gICAqXG4gICAqIC8vIG91dHB1dDIuc2hhcGUgaXMgW251bGwsIDFdLiBUaGUgZmlyc3QgZGltZW5zaW9uIGlzIHRoZSB1bmRldGVybWluZWRcbiAgICogLy8gYmF0Y2ggc2l6ZS4gVGhlIHNlY29uZCBkaW1lbnNpb24gbWF0Y2hlcyB0aGUgbnVtYmVyIG9mIHVuaXRzIG9mIHRoZVxuICAgKiAvLyBkZW5zZSBsYXllci5cbiAgICogY29uc29sZS5sb2coSlNPTi5zdHJpbmdpZnkob3V0cHV0Mi5zaGFwZSkpO1xuICAgKlxuICAgKiAvLyBUaGUgaW5wdXQgYW5kIG91dHB1dCBjYW4gYmUgdXNlZCB0byBjb25zdHJ1Y3QgYSBtb2RlbCB0aGF0IGNvbnNpc3RzXG4gICAqIC8vIG9mIHRoZSBmbGF0dGVuIGFuZCBkZW5zZSBsYXllcnMuXG4gICAqIGNvbnN0IG1vZGVsID0gdGYubW9kZWwoe2lucHV0czogaW5wdXQsIG91dHB1dHM6IG91dHB1dDJ9KTtcbiAgICogYGBgXG4gICAqXG4gICAqIEBwYXJhbSBpbnB1dHMgYSBgdGYuVGVuc29yYCBvciBgdGYuU3ltYm9saWNUZW5zb3JgIG9yIGFuIEFycmF5IG9mIHRoZW0uXG4gICAqIEBwYXJhbSBrd2FyZ3MgQWRkaXRpb25hbCBrZXl3b3JkIGFyZ3VtZW50cyB0byBiZSBwYXNzZWQgdG8gYGNhbGwoKWAuXG4gICAqXG4gICAqIEByZXR1cm4gT3V0cHV0IG9mIHRoZSBsYXllcidzIGBjYWxsYCBtZXRob2QuXG4gICAqXG4gICAqIEBleGNlcHRpb24gVmFsdWVFcnJvciBlcnJvciBpbiBjYXNlIHRoZSBsYXllciBpcyBtaXNzaW5nIHNoYXBlIGluZm9ybWF0aW9uXG4gICAqICAgZm9yIGl0cyBgYnVpbGRgIGNhbGwuXG4gICAqXG4gICAqIEBkb2Mge2hlYWRpbmc6ICdNb2RlbHMnLCAnc3ViaGVhZGluZyc6ICdDbGFzc2VzJ31cbiAgICovXG4gIC8vIFBvcnRpbmcgTm90ZTogVGhpcyBpcyBhIHJlcGxhY2VtZW50IGZvciBfX2NhbGxfXygpIGluIFB5dGhvbi5cbiAgYXBwbHkoXG4gICAgICBpbnB1dHM6IFRlbnNvcnxUZW5zb3JbXXxTeW1ib2xpY1RlbnNvcnxTeW1ib2xpY1RlbnNvcltdLFxuICAgICAga3dhcmdzPzogS3dhcmdzKTogVGVuc29yfFRlbnNvcltdfFN5bWJvbGljVGVuc29yfFN5bWJvbGljVGVuc29yW10ge1xuICAgIGt3YXJncyA9IGt3YXJncyB8fCB7fTtcblxuICAgIHRoaXMuYXNzZXJ0Tm90RGlzcG9zZWQoKTtcblxuICAgIC8vIEVuc3VyZSBpbnB1dHMgYXJlIGFsbCB0aGUgc2FtZSB0eXBlLlxuICAgIGNvbnN0IGlucHV0c0xpc3QgPSBnZW5lcmljX3V0aWxzLnRvTGlzdChpbnB1dHMpO1xuXG4gICAgbGV0IGFsbEFyZVN5bWJvbGljID0gdHJ1ZTtcbiAgICBmb3IgKGNvbnN0IGlucHV0IG9mIGlucHV0c0xpc3QpIHtcbiAgICAgIGlmICghKGlucHV0IGluc3RhbmNlb2YgU3ltYm9saWNUZW5zb3IpKSB7XG4gICAgICAgIGFsbEFyZVN5bWJvbGljID0gZmFsc2U7XG4gICAgICAgIGJyZWFrO1xuICAgICAgfVxuICAgIH1cbiAgICBsZXQgbm9uZUFyZVN5bWJvbGljID0gdHJ1ZTtcbiAgICBmb3IgKGNvbnN0IGlucHV0IG9mIGlucHV0c0xpc3QpIHtcbiAgICAgIGlmIChpbnB1dCBpbnN0YW5jZW9mIFN5bWJvbGljVGVuc29yKSB7XG4gICAgICAgIG5vbmVBcmVTeW1ib2xpYyA9IGZhbHNlO1xuICAgICAgICBicmVhaztcbiAgICAgIH1cbiAgICB9XG5cbiAgICBpZiAoYWxsQXJlU3ltYm9saWMgPT09IG5vbmVBcmVTeW1ib2xpYykge1xuICAgICAgdGhyb3cgbmV3IFZhbHVlRXJyb3IoXG4gICAgICAgICAgJ0FyZ3VtZW50cyB0byBhcHBseSgpIG11c3QgYmUgYWxsICcgK1xuICAgICAgICAgICdTeW1ib2xpY1RlbnNvcnMgb3IgYWxsIFRlbnNvcnMnKTtcbiAgICB9XG5cbiAgICAvLyBUT0RPKG1pY2hhZWx0ZXJyeSk6IG5hbWVTY29wZSgpIG1heSBub3QgYmUgbmVjZXNzYXJ5LlxuICAgIHJldHVybiBuYW1lU2NvcGUodGhpcy5uYW1lLCAoKSA9PiB7XG4gICAgICAvLyBIYW5kbGUgbGF5aW5nIGJ1aWxkaW5nICh3ZWlnaHQgY3JlYXRpbmcsIGlucHV0IHNwZWMgbG9ja2luZykuXG4gICAgICBpZiAoIXRoaXMuYnVpbHQpIHtcbiAgICAgICAgLypcbiAgICAgICAgICBUaHJvdyBleGNlcHRpb25zIGluIGNhc2UgdGhlIGlucHV0IGlzIG5vdCBjb21wYXRpYmxlXG4gICAgICAgICAgd2l0aCB0aGUgaW5wdXRTcGVjIHNwZWNpZmllZCBpbiB0aGUgbGF5ZXIgY29uc3RydWN0b3IuXG4gICAgICAgICAqL1xuICAgICAgICB0aGlzLmFzc2VydElucHV0Q29tcGF0aWJpbGl0eShpbnB1dHMpO1xuXG4gICAgICAgIC8vIENvbGxlY3QgaW5wdXQgc2hhcGVzIHRvIGJ1aWxkIGxheWVyLlxuICAgICAgICBjb25zdCBpbnB1dFNoYXBlczogU2hhcGVbXSA9IFtdO1xuICAgICAgICBmb3IgKGNvbnN0IHhFbGVtIG9mIGdlbmVyaWNfdXRpbHMudG9MaXN0KGlucHV0cykpIHtcbiAgICAgICAgICBpbnB1dFNoYXBlcy5wdXNoKHhFbGVtLnNoYXBlKTtcbiAgICAgICAgfVxuICAgICAgICB0aGlzLmJ1aWxkKGdlbmVyaWNfdXRpbHMuc2luZ2xldG9uT3JBcnJheShpbnB1dFNoYXBlcykpO1xuICAgICAgICB0aGlzLmJ1aWx0ID0gdHJ1ZTtcblxuICAgICAgICAvLyBMb2FkIHdlaWdodHMgdGhhdCB3ZXJlIHNwZWNpZmllZCBhdCBsYXllciBpbnN0YW50aWF0aW9uLlxuICAgICAgICBpZiAodGhpcy5pbml0aWFsV2VpZ2h0cykge1xuICAgICAgICAgIHRoaXMuc2V0V2VpZ2h0cyh0aGlzLmluaXRpYWxXZWlnaHRzKTtcbiAgICAgICAgfVxuXG4gICAgICAgIGlmICh0aGlzLl9yZWZDb3VudCA9PT0gbnVsbCAmJiBub25lQXJlU3ltYm9saWMpIHtcbiAgICAgICAgICAvLyBUaGUgZmlyc3QgdXNlIG9mIHRoaXMgbGF5ZXIgaXMgYSBub24tc3ltYm9saWMgY2FsbCwgc2V0IHJlZiBjb3VudFxuICAgICAgICAgIC8vIHRvIDEgc28gdGhlIExheWVyIGNhbiBiZSBwcm9wZXJseSBkaXNwb3NlZCBpZiBpdHMgZGlzcG9zZSgpIG1ldGhvZFxuICAgICAgICAgIC8vIGlzIGNhbGxlZC5cbiAgICAgICAgICB0aGlzLl9yZWZDb3VudCA9IDE7XG4gICAgICAgIH1cbiAgICAgIH1cblxuICAgICAgLypcbiAgICAgICAgVGhyb3cgZXhjZXB0aW9ucyBpbiBjYXNlIHRoZSBpbnB1dCBpcyBub3QgY29tcGF0aWJsZVxuICAgICAgICB3aXRoIHRoZSBpbnB1dFNwZWMgc2V0IGF0IGJ1aWxkIHRpbWUuXG4gICAgICAqL1xuICAgICAgdGhpcy5hc3NlcnRJbnB1dENvbXBhdGliaWxpdHkoaW5wdXRzKTtcblxuICAgICAgLy8gSGFuZGxlIG1hc2sgcHJvcGFnYXRpb24uXG4gICAgICAvLyBUT0RPKG1pY2hhZWx0ZXJyeSk6IE1hc2sgcHJvcGFnYXRpb24gbm90IGN1cnJlbnRseSBpbXBsZW1lbnRlZC5cblxuICAgICAgLy8gQWN0dWFsbHkgY2FsbCB0aGUgbGF5ZXIsIGNvbGxlY3Rpbmcgb3V0cHV0KHMpLCBtYXNrKHMpLCBhbmQgc2hhcGUocykuXG4gICAgICBpZiAobm9uZUFyZVN5bWJvbGljKSB7XG4gICAgICAgIGxldCBvdXRwdXQgPSB0aGlzLmNhbGwoaW5wdXRzIGFzIFRlbnNvciB8IFRlbnNvcltdLCBrd2FyZ3MpO1xuICAgICAgICAvLyBUT0RPKG1pY2hhZWx0ZXJyeSk6IENvbXB1dGUgdGhlIG91dHB1dE1hc2tcblxuICAgICAgICAvLyBJZiB0aGUgbGF5ZXIgcmV0dXJucyB0ZW5zb3JzIGZyb20gaXRzIGlucHV0cywgdW5tb2RpZmllZCxcbiAgICAgICAgLy8gd2UgY29weSB0aGVtIHRvIGF2b2lkIGxvc3Mgb2YgdGVuc29yIG1ldGFkYXRhLlxuICAgICAgICBjb25zdCBvdXRwdXRMaXN0OiBUZW5zb3JbXSA9IGdlbmVyaWNfdXRpbHMudG9MaXN0KG91dHB1dCk7XG4gICAgICAgIGNvbnN0IG91dHB1dExpc3RDb3B5OiBUZW5zb3JbXSA9IFtdO1xuICAgICAgICAvLyBUT0RPKG1pY2hhZWx0ZXJyeSk6IFRoaXMgY29weWluZyBtYXkgbm90IGJlIG5lY2Vzc2FyeSBnaXZlbiBvdXIgZWFnZXJcbiAgICAgICAgLy8gYmFja2VuZC5cbiAgICAgICAgZm9yIChsZXQgeCBvZiBvdXRwdXRMaXN0KSB7XG4gICAgICAgICAgaWYgKGlucHV0c0xpc3QuaW5kZXhPZih4KSAhPT0gLTEpIHtcbiAgICAgICAgICAgIHggPSB4LmNsb25lKCk7XG4gICAgICAgICAgfVxuICAgICAgICAgIG91dHB1dExpc3RDb3B5LnB1c2goeCk7XG4gICAgICAgIH1cbiAgICAgICAgb3V0cHV0ID0gZ2VuZXJpY191dGlscy5zaW5nbGV0b25PckFycmF5KG91dHB1dExpc3RDb3B5KTtcblxuICAgICAgICBpZiAodGhpcy5hY3Rpdml0eVJlZ3VsYXJpemVyICE9IG51bGwpIHtcbiAgICAgICAgICB0aHJvdyBuZXcgTm90SW1wbGVtZW50ZWRFcnJvcihcbiAgICAgICAgICAgICAgJ0xheWVyIGludm9jYXRpb24gaW4gdGhlIHByZXNlbmNlIG9mIGFjdGl2aXR5ICcgK1xuICAgICAgICAgICAgICAncmVndWxhcml6ZXIocykgaXMgbm90IHN1cHBvcnRlZCB5ZXQuJyk7XG4gICAgICAgIH1cblxuICAgICAgICAvLyBUT0RPKG1pY2hhZWx0ZXJyeSk6IENhbGwgYWRkSW5ib3VuZE5vZGUoKT9cbiAgICAgICAgcmV0dXJuIG91dHB1dDtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIGNvbnN0IGlucHV0U2hhcGUgPSBjb2xsZWN0SW5wdXRTaGFwZShpbnB1dHMpO1xuICAgICAgICBjb25zdCBvdXRwdXRTaGFwZSA9IHRoaXMuY29tcHV0ZU91dHB1dFNoYXBlKGlucHV0U2hhcGUpO1xuICAgICAgICBsZXQgb3V0cHV0OiBTeW1ib2xpY1RlbnNvcnxTeW1ib2xpY1RlbnNvcltdO1xuICAgICAgICBjb25zdCBvdXRwdXREVHlwZSA9IGd1ZXNzT3V0cHV0RFR5cGUoaW5wdXRzKTtcbiAgICAgICAgdGhpcy53YXJuT25JbmNvbXBhdGlibGVJbnB1dFNoYXBlKFxuICAgICAgICAgICAgQXJyYXkuaXNBcnJheShpbnB1dHMpID8gaW5wdXRTaGFwZVswXSBhcyBTaGFwZSA6XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnB1dFNoYXBlIGFzIFNoYXBlKTtcblxuICAgICAgICBpZiAob3V0cHV0U2hhcGUgIT0gbnVsbCAmJiBvdXRwdXRTaGFwZS5sZW5ndGggPiAwICYmXG4gICAgICAgICAgICBBcnJheS5pc0FycmF5KG91dHB1dFNoYXBlWzBdKSkge1xuICAgICAgICAgIC8vIFdlIGhhdmUgbXVsdGlwbGUgb3V0cHV0IHNoYXBlcy4gQ3JlYXRlIG11bHRpcGxlIG91dHB1dCB0ZW5zb3JzLlxuICAgICAgICAgIG91dHB1dCA9IChvdXRwdXRTaGFwZSBhcyBTaGFwZVtdKVxuICAgICAgICAgICAgICAgICAgICAgICAubWFwKFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgKHNoYXBlLCBpbmRleCkgPT4gbmV3IFN5bWJvbGljVGVuc29yKFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG91dHB1dERUeXBlLCBzaGFwZSwgdGhpcyxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBnZW5lcmljX3V0aWxzLnRvTGlzdChpbnB1dHMpLCBrd2FyZ3MsIHRoaXMubmFtZSxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbmRleCkpO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIG91dHB1dCA9IG5ldyBTeW1ib2xpY1RlbnNvcihcbiAgICAgICAgICAgICAgb3V0cHV0RFR5cGUsIG91dHB1dFNoYXBlIGFzIFNoYXBlLCB0aGlzLFxuICAgICAgICAgICAgICBnZW5lcmljX3V0aWxzLnRvTGlzdChpbnB1dHMpLCBrd2FyZ3MsIHRoaXMubmFtZSk7XG4gICAgICAgIH1cblxuICAgICAgICAvKlxuICAgICAgICAgIEFkZCBhbiBpbmJvdW5kIG5vZGUgdG8gdGhlIGxheWVyLCBzbyB0aGF0IGl0IGtlZXBzIHRyYWNrXG4gICAgICAgICAgb2YgdGhlIGNhbGwgYW5kIG9mIGFsbCBuZXcgdmFyaWFibGVzIGNyZWF0ZWQgZHVyaW5nIHRoZSBjYWxsLlxuICAgICAgICAgIFRoaXMgYWxzbyB1cGRhdGVzIHRoZSBsYXllciBoaXN0b3J5IG9mIHRoZSBvdXRwdXQgdGVuc29yKHMpLlxuICAgICAgICAgIElmIHRoZSBpbnB1dCB0ZW5zb3IocykgaGFkIG5vIHByZXZpb3VzIGhpc3RvcnksXG4gICAgICAgICAgdGhpcyBkb2VzIG5vdGhpbmcuXG4gICAgICAgICovXG4gICAgICAgIHRoaXMuYWRkSW5ib3VuZE5vZGUoXG4gICAgICAgICAgICBpbnB1dHMgYXMgU3ltYm9saWNUZW5zb3IgfCBTeW1ib2xpY1RlbnNvcltdLCBvdXRwdXQsIG51bGwsIG51bGwsXG4gICAgICAgICAgICBpbnB1dFNoYXBlLCBvdXRwdXRTaGFwZSwga3dhcmdzKTtcbiAgICAgICAgdGhpcy5fcmVmQ291bnQrKztcblxuICAgICAgICBpZiAodGhpcy5hY3Rpdml0eVJlZ3VsYXJpemVyICE9IG51bGwpIHtcbiAgICAgICAgICB0aHJvdyBuZXcgTm90SW1wbGVtZW50ZWRFcnJvcihcbiAgICAgICAgICAgICAgJ0xheWVyIGludm9jYXRpb24gaW4gdGhlIHByZXNlbmNlIG9mIGFjdGl2aXR5ICcgK1xuICAgICAgICAgICAgICAncmVndWxhcml6ZXIocykgaXMgbm90IHN1cHBvcnRlZCB5ZXQuJyk7XG4gICAgICAgIH1cblxuICAgICAgICByZXR1cm4gb3V0cHV0O1xuICAgICAgfVxuICAgIH0pO1xuICB9XG5cbiAgLyoqXG4gICAqIENoZWNrIGNvbXBhdGliaWxpdHkgYmV0d2VlbiBpbnB1dCBzaGFwZSBhbmQgdGhpcyBsYXllcidzIGJhdGNoSW5wdXRTaGFwZS5cbiAgICpcbiAgICogUHJpbnQgd2FybmluZyBpZiBhbnkgaW5jb21wYXRpYmlsaXR5IGlzIGZvdW5kLlxuICAgKlxuICAgKiBAcGFyYW0gaW5wdXRTaGFwZSBJbnB1dCBzaGFwZSB0byBiZSBjaGVja2VkLlxuICAgKi9cbiAgcHJvdGVjdGVkIHdhcm5PbkluY29tcGF0aWJsZUlucHV0U2hhcGUoaW5wdXRTaGFwZTogU2hhcGUpIHtcbiAgICBpZiAodGhpcy5iYXRjaElucHV0U2hhcGUgPT0gbnVsbCkge1xuICAgICAgcmV0dXJuO1xuICAgIH0gZWxzZSBpZiAoaW5wdXRTaGFwZS5sZW5ndGggIT09IHRoaXMuYmF0Y2hJbnB1dFNoYXBlLmxlbmd0aCkge1xuICAgICAgY29uc29sZS53YXJuKFxuICAgICAgICAgIGBUaGUgcmFuayBvZiB0aGUgaW5wdXQgdGVuc29yIHByb3ZpZGVkIChzaGFwZTogYCArXG4gICAgICAgICAgYCR7SlNPTi5zdHJpbmdpZnkoaW5wdXRTaGFwZSl9KSBkb2VzIG5vdCBtYXRjaCB0aGF0IG9mIHRoZSBgICtcbiAgICAgICAgICBgYmF0Y2hJbnB1dFNoYXBlICgke0pTT04uc3RyaW5naWZ5KHRoaXMuYmF0Y2hJbnB1dFNoYXBlKX0pIGAgK1xuICAgICAgICAgIGBvZiB0aGUgbGF5ZXIgJHt0aGlzLm5hbWV9YCk7XG4gICAgfSBlbHNlIHtcbiAgICAgIGxldCBkaW1NaXNtYXRjaCA9IGZhbHNlO1xuICAgICAgdGhpcy5iYXRjaElucHV0U2hhcGUuZm9yRWFjaCgoZGltZW5zaW9uLCBpKSA9PiB7XG4gICAgICAgIGlmIChkaW1lbnNpb24gIT0gbnVsbCAmJiBpbnB1dFNoYXBlW2ldICE9IG51bGwgJiZcbiAgICAgICAgICAgIGlucHV0U2hhcGVbaV0gIT09IGRpbWVuc2lvbikge1xuICAgICAgICAgIGRpbU1pc21hdGNoID0gdHJ1ZTtcbiAgICAgICAgfVxuICAgICAgfSk7XG4gICAgICBpZiAoZGltTWlzbWF0Y2gpIHtcbiAgICAgICAgY29uc29sZS53YXJuKFxuICAgICAgICAgICAgYFRoZSBzaGFwZSBvZiB0aGUgaW5wdXQgdGVuc29yIGAgK1xuICAgICAgICAgICAgYCgke0pTT04uc3RyaW5naWZ5KGlucHV0U2hhcGUpfSkgZG9lcyBub3QgYCArXG4gICAgICAgICAgICBgbWF0Y2ggdGhlIGV4cGVjdGF0aW9uIG9mIGxheWVyICR7dGhpcy5uYW1lfTogYCArXG4gICAgICAgICAgICBgJHtKU09OLnN0cmluZ2lmeSh0aGlzLmJhdGNoSW5wdXRTaGFwZSl9YCk7XG4gICAgICB9XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIFJldHJpZXZlcyB0aGUgb3V0cHV0IHNoYXBlKHMpIG9mIGEgbGF5ZXIuXG4gICAqXG4gICAqIE9ubHkgYXBwbGljYWJsZSBpZiB0aGUgbGF5ZXIgaGFzIG9ubHkgb25lIGluYm91bmQgbm9kZSwgb3IgaWYgYWxsIGluYm91bmRcbiAgICogbm9kZXMgaGF2ZSB0aGUgc2FtZSBvdXRwdXQgc2hhcGUuXG4gICAqXG4gICAqIEByZXR1cm5zIE91dHB1dCBzaGFwZSBvciBzaGFwZXMuXG4gICAqIEB0aHJvd3MgQXR0cmlidXRlRXJyb3I6IGlmIHRoZSBsYXllciBpcyBjb25uZWN0ZWQgdG8gbW9yZSB0aGFuIG9uZSBpbmNvbWluZ1xuICAgKiAgIG5vZGVzLlxuICAgKlxuICAgKiBAZG9jIHtoZWFkaW5nOiAnTW9kZWxzJywgJ3N1YmhlYWRpbmcnOiAnQ2xhc3Nlcyd9XG4gICAqL1xuICBnZXQgb3V0cHV0U2hhcGUoKTogU2hhcGV8U2hhcGVbXSB7XG4gICAgaWYgKHRoaXMuaW5ib3VuZE5vZGVzID09IG51bGwgfHwgdGhpcy5pbmJvdW5kTm9kZXMubGVuZ3RoID09PSAwKSB7XG4gICAgICB0aHJvdyBuZXcgQXR0cmlidXRlRXJyb3IoXG4gICAgICAgICAgYFRoZSBsYXllciAke3RoaXMubmFtZX0gaGFzIG5ldmVyIGJlZW4gY2FsbGVkIGFuZCB0aHVzIGhhcyBubyBgICtcbiAgICAgICAgICBgZGVmaW5lZCBvdXRwdXQgc2hhcGUuYCk7XG4gICAgfVxuICAgIGNvbnN0IGFsbE91dHB1dFNoYXBlczogc3RyaW5nW10gPSBbXTtcbiAgICBmb3IgKGNvbnN0IG5vZGUgb2YgdGhpcy5pbmJvdW5kTm9kZXMpIHtcbiAgICAgIGNvbnN0IHNoYXBlU3RyaW5nID0gSlNPTi5zdHJpbmdpZnkobm9kZS5vdXRwdXRTaGFwZXMpO1xuICAgICAgaWYgKGFsbE91dHB1dFNoYXBlcy5pbmRleE9mKHNoYXBlU3RyaW5nKSA9PT0gLTEpIHtcbiAgICAgICAgYWxsT3V0cHV0U2hhcGVzLnB1c2goc2hhcGVTdHJpbmcpO1xuICAgICAgfVxuICAgIH1cbiAgICBpZiAoYWxsT3V0cHV0U2hhcGVzLmxlbmd0aCA9PT0gMSkge1xuICAgICAgY29uc3Qgb3V0cHV0U2hhcGVzID0gdGhpcy5pbmJvdW5kTm9kZXNbMF0ub3V0cHV0U2hhcGVzO1xuICAgICAgaWYgKEFycmF5LmlzQXJyYXkob3V0cHV0U2hhcGVzKSAmJiBBcnJheS5pc0FycmF5KG91dHB1dFNoYXBlc1swXSkgJiZcbiAgICAgICAgICBvdXRwdXRTaGFwZXMubGVuZ3RoID09PSAxKSB7XG4gICAgICAgIHJldHVybiAob3V0cHV0U2hhcGVzIGFzIFNoYXBlW10pWzBdO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgcmV0dXJuIG91dHB1dFNoYXBlcztcbiAgICAgIH1cblxuICAgIH0gZWxzZSB7XG4gICAgICB0aHJvdyBuZXcgQXR0cmlidXRlRXJyb3IoXG4gICAgICAgICAgYFRoZSBsYXllciAke3RoaXMubmFtZX0gaGFzIG11bHRpcGxlIGluYm91bmQgbm9kZXMgd2l0aCBkaWZmZXJlbnQgYCArXG4gICAgICAgICAgYG91dHB1dCBzaGFwZXMuIEhlbmNlIHRoZSBub3Rpb24gb2YgXCJvdXRwdXQgc2hhcGVcIiBpcyBpbGwtZGVmaW5lZCBgICtcbiAgICAgICAgICBgZm9yIHRoZSBsYXllci5gKTtcbiAgICAgIC8vIFRPRE8oY2Fpcyk6IEltcGxlbWVudCBnZXRPdXRwdXRTaGFwZUF0KCkuXG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIENvdW50cyB0aGUgdG90YWwgbnVtYmVyIG9mIG51bWJlcnMgKGUuZy4sIGZsb2F0MzIsIGludDMyKSBpbiB0aGVcbiAgICogd2VpZ2h0cy5cbiAgICpcbiAgICogQHJldHVybnMgQW4gaW50ZWdlciBjb3VudC5cbiAgICogQHRocm93cyBSdW50aW1lRXJyb3I6IElmIHRoZSBsYXllciBpcyBub3QgYnVpbHQgeWV0IChpbiB3aGljaCBjYXNlIGl0c1xuICAgKiAgIHdlaWdodHMgYXJlIG5vdCBkZWZpbmVkIHlldC4pXG4gICAqXG4gICAqIEBkb2Mge2hlYWRpbmc6ICdNb2RlbHMnLCAnc3ViaGVhZGluZyc6ICdDbGFzc2VzJ31cbiAgICovXG4gIGNvdW50UGFyYW1zKCk6IG51bWJlciB7XG4gICAgaWYgKCF0aGlzLmJ1aWx0KSB7XG4gICAgICB0aHJvdyBuZXcgUnVudGltZUVycm9yKFxuICAgICAgICAgIGBZb3UgdHJpZWQgdG8gY2FsbCBjb3VudFBhcmFtcygpIG9uICR7dGhpcy5uYW1lfSwgYCArXG4gICAgICAgICAgYGJ1dCB0aGUgbGF5ZXIgaXMgbm90IGJ1aWx0IHlldC4gQnVpbGQgaXQgZmlyc3QgYnkgY2FsbGluZyBgICtcbiAgICAgICAgICBgYnVpbGQoYmF0Y2hJbnB1dFNoYXBlKS5gKTtcbiAgICB9XG4gICAgcmV0dXJuIHZhcmlhYmxlX3V0aWxzLmNvdW50UGFyYW1zSW5XZWlnaHRzKHRoaXMud2VpZ2h0cyk7XG4gIH1cblxuICAvKipcbiAgICogQ3JlYXRlcyB0aGUgbGF5ZXIgd2VpZ2h0cy5cbiAgICpcbiAgICogTXVzdCBiZSBpbXBsZW1lbnRlZCBvbiBhbGwgbGF5ZXJzIHRoYXQgaGF2ZSB3ZWlnaHRzLlxuICAgKlxuICAgKiBDYWxsZWQgd2hlbiBhcHBseSgpIGlzIGNhbGxlZCB0byBjb25zdHJ1Y3QgdGhlIHdlaWdodHMuXG4gICAqXG4gICAqIEBwYXJhbSBpbnB1dFNoYXBlIEEgYFNoYXBlYCBvciBhcnJheSBvZiBgU2hhcGVgICh1bnVzZWQpLlxuICAgKlxuICAgKiBAZG9jIHtoZWFkaW5nOiAnTW9kZWxzJywgJ3N1YmhlYWRpbmcnOiAnQ2xhc3Nlcyd9XG4gICAqL1xuICBidWlsZChpbnB1dFNoYXBlOiBTaGFwZXxTaGFwZVtdKSB7XG4gICAgdGhpcy5idWlsdCA9IHRydWU7XG4gIH1cblxuICAvKipcbiAgICogUmV0dXJucyB0aGUgY3VycmVudCB2YWx1ZXMgb2YgdGhlIHdlaWdodHMgb2YgdGhlIGxheWVyLlxuICAgKlxuICAgKiBAcGFyYW0gdHJhaW5hYmxlT25seSBXaGV0aGVyIHRvIGdldCB0aGUgdmFsdWVzIG9mIG9ubHkgdHJhaW5hYmxlIHdlaWdodHMuXG4gICAqIEByZXR1cm5zIFdlaWdodCB2YWx1ZXMgYXMgYW4gYEFycmF5YCBvZiBgdGYuVGVuc29yYHMuXG4gICAqXG4gICAqIEBkb2Mge2hlYWRpbmc6ICdNb2RlbHMnLCAnc3ViaGVhZGluZyc6ICdDbGFzc2VzJ31cbiAgICovXG4gIGdldFdlaWdodHModHJhaW5hYmxlT25seSA9IGZhbHNlKTogVGVuc29yW10ge1xuICAgIHJldHVybiBiYXRjaEdldFZhbHVlKHRyYWluYWJsZU9ubHkgPyB0aGlzLnRyYWluYWJsZVdlaWdodHMgOiB0aGlzLndlaWdodHMpO1xuICB9XG5cbiAgLyoqXG4gICAqIFNldHMgdGhlIHdlaWdodHMgb2YgdGhlIGxheWVyLCBmcm9tIFRlbnNvcnMuXG4gICAqXG4gICAqIEBwYXJhbSB3ZWlnaHRzIGEgbGlzdCBvZiBUZW5zb3JzLiBUaGUgbnVtYmVyIG9mIGFycmF5cyBhbmQgdGhlaXIgc2hhcGVcbiAgICogICBtdXN0IG1hdGNoIG51bWJlciBvZiB0aGUgZGltZW5zaW9ucyBvZiB0aGUgd2VpZ2h0cyBvZiB0aGUgbGF5ZXIgKGkuZS5cbiAgICogICBpdCBzaG91bGQgbWF0Y2ggdGhlIG91dHB1dCBvZiBgZ2V0V2VpZ2h0c2ApLlxuICAgKlxuICAgKiBAZXhjZXB0aW9uIFZhbHVlRXJyb3IgSWYgdGhlIHByb3ZpZGVkIHdlaWdodHMgbGlzdCBkb2VzIG5vdCBtYXRjaCB0aGVcbiAgICogICBsYXllcidzIHNwZWNpZmljYXRpb25zLlxuICAgKlxuICAgKiBAZG9jIHtoZWFkaW5nOiAnTW9kZWxzJywgJ3N1YmhlYWRpbmcnOiAnQ2xhc3Nlcyd9XG4gICAqL1xuICBzZXRXZWlnaHRzKHdlaWdodHM6IFRlbnNvcltdKTogdm9pZCB7XG4gICAgdGlkeSgoKSA9PiB7XG4gICAgICBjb25zdCBwYXJhbXMgPSB0aGlzLndlaWdodHM7XG4gICAgICBpZiAocGFyYW1zLmxlbmd0aCAhPT0gd2VpZ2h0cy5sZW5ndGgpIHtcbiAgICAgICAgLy8gVE9ETyhjYWlzKTogUmVzdG9yZSB0aGUgZm9sbG93aW5nIGFuZCB1c2UgYHByb3ZpZGVkV2VpZ2h0c2AsIGluc3RlYWRcbiAgICAgICAgLy8gb2YgYHdlaWdodHNgIGluIHRoZSBlcnJvciBtZXNzYWdlLCBvbmNlIHRoZSBkZWVwbGVhcm4uanMgYnVnIGlzXG4gICAgICAgIC8vIGZpeGVkOiBodHRwczovL2dpdGh1Yi5jb20vUEFJUi1jb2RlL2RlZXBsZWFybmpzL2lzc3Vlcy80OTggY29uc3RcbiAgICAgICAgLy8gcHJvdmlkZWRXZWlnaHRzID0gSlNPTi5zdHJpbmdpZnkod2VpZ2h0cykuc2xpY2UoMCwgNTApO1xuICAgICAgICB0aHJvdyBuZXcgVmFsdWVFcnJvcihcbiAgICAgICAgICAgIGBZb3UgY2FsbGVkIHNldFdlaWdodHMod2VpZ2h0cykgb24gbGF5ZXIgXCIke3RoaXMubmFtZX1cIiBgICtcbiAgICAgICAgICAgIGB3aXRoIGEgd2VpZ2h0IGxpc3Qgb2YgbGVuZ3RoICR7d2VpZ2h0cy5sZW5ndGh9LCBgICtcbiAgICAgICAgICAgIGBidXQgdGhlIGxheWVyIHdhcyBleHBlY3RpbmcgJHtwYXJhbXMubGVuZ3RofSB3ZWlnaHRzLiBgICtcbiAgICAgICAgICAgIGBQcm92aWRlZCB3ZWlnaHRzOiAke3dlaWdodHN9Li4uYCk7XG4gICAgICB9XG4gICAgICBpZiAocGFyYW1zLmxlbmd0aCA9PT0gMCkge1xuICAgICAgICByZXR1cm47XG4gICAgICB9XG4gICAgICBjb25zdCB3ZWlnaHRWYWx1ZVR1cGxlczogQXJyYXk8W0xheWVyVmFyaWFibGUsIFRlbnNvcl0+ID0gW107XG4gICAgICBjb25zdCBwYXJhbVZhbHVlcyA9IGJhdGNoR2V0VmFsdWUocGFyYW1zKTtcbiAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgcGFyYW1WYWx1ZXMubGVuZ3RoOyArK2kpIHtcbiAgICAgICAgY29uc3QgcHYgPSBwYXJhbVZhbHVlc1tpXTtcbiAgICAgICAgY29uc3QgcCA9IHBhcmFtc1tpXTtcbiAgICAgICAgY29uc3QgdyA9IHdlaWdodHNbaV07XG4gICAgICAgIGlmICghdXRpbC5hcnJheXNFcXVhbChwdi5zaGFwZSwgdy5zaGFwZSkpIHtcbiAgICAgICAgICB0aHJvdyBuZXcgVmFsdWVFcnJvcihcbiAgICAgICAgICAgICAgYExheWVyIHdlaWdodCBzaGFwZSAke3B2LnNoYXBlfSBgICtcbiAgICAgICAgICAgICAgYG5vdCBjb21wYXRpYmxlIHdpdGggcHJvdmlkZWQgd2VpZ2h0IHNoYXBlICR7dy5zaGFwZX1gKTtcbiAgICAgICAgfVxuICAgICAgICB3ZWlnaHRWYWx1ZVR1cGxlcy5wdXNoKFtwLCB3XSk7XG4gICAgICB9XG4gICAgICBiYXRjaFNldFZhbHVlKHdlaWdodFZhbHVlVHVwbGVzKTtcbiAgICB9KTtcbiAgfVxuXG4gIC8qKlxuICAgKiBBZGRzIGEgd2VpZ2h0IHZhcmlhYmxlIHRvIHRoZSBsYXllci5cbiAgICpcbiAgICogQHBhcmFtIG5hbWUgTmFtZSBvZiB0aGUgbmV3IHdlaWdodCB2YXJpYWJsZS5cbiAgICogQHBhcmFtIHNoYXBlIFRoZSBzaGFwZSBvZiB0aGUgd2VpZ2h0LlxuICAgKiBAcGFyYW0gZHR5cGUgVGhlIGR0eXBlIG9mIHRoZSB3ZWlnaHQuXG4gICAqIEBwYXJhbSBpbml0aWFsaXplciBBbiBpbml0aWFsaXplciBpbnN0YW5jZS5cbiAgICogQHBhcmFtIHJlZ3VsYXJpemVyIEEgcmVndWxhcml6ZXIgaW5zdGFuY2UuXG4gICAqIEBwYXJhbSB0cmFpbmFibGUgV2hldGhlciB0aGUgd2VpZ2h0IHNob3VsZCBiZSB0cmFpbmVkIHZpYSBiYWNrcHJvcCBvciBub3RcbiAgICogICAoYXNzdW1pbmcgdGhhdCB0aGUgbGF5ZXIgaXRzZWxmIGlzIGFsc28gdHJhaW5hYmxlKS5cbiAgICogQHBhcmFtIGNvbnN0cmFpbnQgQW4gb3B0aW9uYWwgdHJhaW5hYmxlLlxuICAgKiBAcmV0dXJuIFRoZSBjcmVhdGVkIHdlaWdodCB2YXJpYWJsZS5cbiAgICpcbiAgICogQGRvYyB7aGVhZGluZzogJ01vZGVscycsICdzdWJoZWFkaW5nJzogJ0NsYXNzZXMnfVxuICAgKi9cbiAgcHJvdGVjdGVkIGFkZFdlaWdodChcbiAgICAgIG5hbWU6IHN0cmluZywgc2hhcGU6IFNoYXBlLCBkdHlwZT86IERhdGFUeXBlLCBpbml0aWFsaXplcj86IEluaXRpYWxpemVyLFxuICAgICAgcmVndWxhcml6ZXI/OiBSZWd1bGFyaXplciwgdHJhaW5hYmxlPzogYm9vbGVhbiwgY29uc3RyYWludD86IENvbnN0cmFpbnQsXG4gICAgICBnZXRJbml0aWFsaXplckZ1bmM/OiBGdW5jdGlvbik6IExheWVyVmFyaWFibGUge1xuICAgIC8vIFJlamVjdCBkdXBsaWNhdGUgd2VpZ2h0IG5hbWVzLlxuICAgIGlmICh0aGlzLl9hZGRlZFdlaWdodE5hbWVzLmluZGV4T2YobmFtZSkgIT09IC0xKSB7XG4gICAgICB0aHJvdyBuZXcgVmFsdWVFcnJvcihcbiAgICAgICAgICBgRHVwbGljYXRlIHdlaWdodCBuYW1lICR7bmFtZX0gZm9yIGxheWVyICR7dGhpcy5uYW1lfWApO1xuICAgIH1cbiAgICB0aGlzLl9hZGRlZFdlaWdodE5hbWVzLnB1c2gobmFtZSk7XG5cbiAgICBpZiAoZHR5cGUgPT0gbnVsbCkge1xuICAgICAgZHR5cGUgPSAnZmxvYXQzMic7XG4gICAgfVxuXG4gICAgaWYgKHRoaXMuZmFzdFdlaWdodEluaXREdXJpbmdCdWlsZCkge1xuICAgICAgaW5pdGlhbGl6ZXIgPSBnZXRJbml0aWFsaXplckZ1bmMgIT0gbnVsbCA/IGdldEluaXRpYWxpemVyRnVuYygpIDpcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBnZXRJbml0aWFsaXplcignemVyb3MnKTtcbiAgICB9XG4gICAgY29uc3QgaW5pdFZhbHVlID0gaW5pdGlhbGl6ZXIuYXBwbHkoc2hhcGUsIGR0eXBlKTtcbiAgICBjb25zdCB3ZWlnaHQgPVxuICAgICAgICBuZXcgTGF5ZXJWYXJpYWJsZShpbml0VmFsdWUsIGR0eXBlLCBuYW1lLCB0cmFpbmFibGUsIGNvbnN0cmFpbnQpO1xuICAgIGluaXRWYWx1ZS5kaXNwb3NlKCk7XG4gICAgLy8gUmVxdWVzdCBiYWNrZW5kIG5vdCB0byBkaXNwb3NlIHRoZSB3ZWlnaHRzIG9mIHRoZSBtb2RlbCBvbiBzY29wZSgpIGV4aXQuXG4gICAgaWYgKHJlZ3VsYXJpemVyICE9IG51bGwpIHtcbiAgICAgIHRoaXMuYWRkTG9zcygoKSA9PiByZWd1bGFyaXplci5hcHBseSh3ZWlnaHQucmVhZCgpKSk7XG4gICAgfVxuICAgIGlmICh0cmFpbmFibGUgPT0gbnVsbCkge1xuICAgICAgdHJhaW5hYmxlID0gdHJ1ZTtcbiAgICB9XG4gICAgaWYgKHRyYWluYWJsZSkge1xuICAgICAgdGhpcy5fdHJhaW5hYmxlV2VpZ2h0cy5wdXNoKHdlaWdodCk7XG4gICAgfSBlbHNlIHtcbiAgICAgIHRoaXMuX25vblRyYWluYWJsZVdlaWdodHMucHVzaCh3ZWlnaHQpO1xuICAgIH1cbiAgICByZXR1cm4gd2VpZ2h0O1xuICB9XG5cbiAgLyoqXG4gICAqIFNldCB0aGUgZmFzdC13ZWlnaHQtaW5pdGlhbGl6YXRpb24gZmxhZy5cbiAgICpcbiAgICogSW4gY2FzZXMgd2hlcmUgdGhlIGluaXRpYWxpemVkIHdlaWdodCB2YWx1ZXMgd2lsbCBiZSBpbW1lZGlhdGVseVxuICAgKiBvdmVyd3JpdHRlbiBieSBsb2FkZWQgd2VpZ2h0IHZhbHVlcyBkdXJpbmcgbW9kZWwgbG9hZGluZywgc2V0dGluZ1xuICAgKiB0aGUgZmxhZyB0byBgdHJ1ZWAgc2F2ZXMgdW5uZWNlc3NhcnkgY2FsbHMgdG8gcG90ZW50aWFsbHkgZXhwZW5zaXZlXG4gICAqIGluaXRpYWxpemVycyBhbmQgc3BlZWRzIHVwIHRoZSBsb2FkaW5nIHByb2Nlc3MuXG4gICAqXG4gICAqIEBwYXJhbSB2YWx1ZSBUYXJnZXQgdmFsdWUgb2YgdGhlIGZsYWcuXG4gICAqL1xuICBzZXRGYXN0V2VpZ2h0SW5pdER1cmluZ0J1aWxkKHZhbHVlOiBib29sZWFuKSB7XG4gICAgdGhpcy5mYXN0V2VpZ2h0SW5pdER1cmluZ0J1aWxkID0gdmFsdWU7XG4gIH1cblxuICAvKipcbiAgICogQWRkIGxvc3NlcyB0byB0aGUgbGF5ZXIuXG4gICAqXG4gICAqIFRoZSBsb3NzIG1heSBwb3RlbnRpYWxseSBiZSBjb25kaXRpb25hbCBvbiBzb21lIGlucHV0cyB0ZW5zb3JzLFxuICAgKiBmb3IgaW5zdGFuY2UgYWN0aXZpdHkgbG9zc2VzIGFyZSBjb25kaXRpb25hbCBvbiB0aGUgbGF5ZXIncyBpbnB1dHMuXG4gICAqXG4gICAqIEBkb2Mge2hlYWRpbmc6ICdNb2RlbHMnLCAnc3ViaGVhZGluZyc6ICdDbGFzc2VzJ31cbiAgICovXG4gIGFkZExvc3MobG9zc2VzOiBSZWd1bGFyaXplckZufFJlZ3VsYXJpemVyRm5bXSk6IHZvaWQge1xuICAgIGlmIChsb3NzZXMgPT0gbnVsbCB8fCBBcnJheS5pc0FycmF5KGxvc3NlcykgJiYgbG9zc2VzLmxlbmd0aCA9PT0gMCkge1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICAvLyBVcGRhdGUgdGhpcy5sb3NzZXNcbiAgICBsb3NzZXMgPSBnZW5lcmljX3V0aWxzLnRvTGlzdChsb3NzZXMpO1xuICAgIGlmICh0aGlzLl9sb3NzZXMgIT09IHVuZGVmaW5lZCAmJiB0aGlzLl9sb3NzZXMgIT09IG51bGwpIHtcbiAgICAgIHRoaXMubG9zc2VzLnB1c2goLi4ubG9zc2VzKTtcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogQ29tcHV0ZXMgdGhlIG91dHB1dCBzaGFwZSBvZiB0aGUgbGF5ZXIuXG4gICAqXG4gICAqIEFzc3VtZXMgdGhhdCB0aGUgbGF5ZXIgd2lsbCBiZSBidWlsdCB0byBtYXRjaCB0aGF0IGlucHV0IHNoYXBlIHByb3ZpZGVkLlxuICAgKlxuICAgKiBAcGFyYW0gaW5wdXRTaGFwZSBBIHNoYXBlICh0dXBsZSBvZiBpbnRlZ2Vycykgb3IgYSBsaXN0IG9mIHNoYXBlIHR1cGxlc1xuICAgKiAgIChvbmUgcGVyIG91dHB1dCB0ZW5zb3Igb2YgdGhlIGxheWVyKS4gU2hhcGUgdHVwbGVzIGNhbiBpbmNsdWRlIG51bGwgZm9yXG4gICAqICAgZnJlZSBkaW1lbnNpb25zLCBpbnN0ZWFkIG9mIGFuIGludGVnZXIuXG4gICAqXG4gICAqIEBkb2Mge2hlYWRpbmc6ICdNb2RlbHMnLCAnc3ViaGVhZGluZyc6ICdDbGFzc2VzJ31cbiAgICovXG4gIGNvbXB1dGVPdXRwdXRTaGFwZShpbnB1dFNoYXBlOiBTaGFwZXxTaGFwZVtdKTogU2hhcGV8U2hhcGVbXSB7XG4gICAgcmV0dXJuIGlucHV0U2hhcGU7XG4gIH1cblxuICAvKipcbiAgICogQ29tcHV0ZXMgYW4gb3V0cHV0IG1hc2sgdGVuc29yLlxuICAgKlxuICAgKiBAcGFyYW0gaW5wdXRzIFRlbnNvciBvciBsaXN0IG9mIHRlbnNvcnMuXG4gICAqIEBwYXJhbSBtYXNrIFRlbnNvciBvciBsaXN0IG9mIHRlbnNvcnMuXG4gICAqXG4gICAqIEByZXR1cm4gbnVsbCBvciBhIHRlbnNvciAob3IgbGlzdCBvZiB0ZW5zb3JzLCBvbmUgcGVyIG91dHB1dCB0ZW5zb3Igb2YgdGhlXG4gICAqIGxheWVyKS5cbiAgICovXG4gIGNvbXB1dGVNYXNrKGlucHV0czogVGVuc29yfFRlbnNvcltdLCBtYXNrPzogVGVuc29yfFRlbnNvcltdKTogVGVuc29yXG4gICAgICB8VGVuc29yW10ge1xuICAgIGlmICghdGhpcy5zdXBwb3J0c01hc2tpbmcpIHtcbiAgICAgIGlmIChtYXNrICE9IG51bGwpIHtcbiAgICAgICAgaWYgKEFycmF5LmlzQXJyYXkobWFzaykpIHtcbiAgICAgICAgICBtYXNrLmZvckVhY2gobWFza0VsZW1lbnQgPT4ge1xuICAgICAgICAgICAgaWYgKG1hc2tFbGVtZW50ICE9IG51bGwpIHtcbiAgICAgICAgICAgICAgdGhyb3cgbmV3IFR5cGVFcnJvcihcbiAgICAgICAgICAgICAgICAgIGBMYXllciAke3RoaXMubmFtZX0gZG9lcyBub3Qgc3VwcG9ydCBtYXNraW5nLCBgICtcbiAgICAgICAgICAgICAgICAgICdidXQgd2FzIHBhc3NlZCBhbiBpbnB1dE1hc2suJyk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgfSk7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgdGhyb3cgbmV3IFR5cGVFcnJvcihcbiAgICAgICAgICAgICAgYExheWVyICR7dGhpcy5uYW1lfSBkb2VzIG5vdCBzdXBwb3J0IG1hc2tpbmcsIGAgK1xuICAgICAgICAgICAgICAnYnV0IHdhcyBwYXNzZWQgYW4gaW5wdXRNYXNrLicpO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgICAvLyBtYXNraW5nIG5vdCBleHBsaWNpdGx5IHN1cHBvcnRlZDogcmV0dXJuIG51bGwgYXMgbWFza1xuICAgICAgcmV0dXJuIG51bGw7XG4gICAgfVxuICAgIC8vIGlmIG1hc2tpbmcgaXMgZXhwbGljdGx5IHN1cHBvcnRlZCwgYnkgZGVmYXVsdFxuICAgIC8vIGNhcnJ5IG92ZXIgdGhlIGlucHV0IG1hc2tcbiAgICByZXR1cm4gbWFzaztcbiAgfVxuXG4gIC8qKlxuICAgKiBJbnRlcm5hbCBtZXRob2QgdG8gY3JlYXRlIGFuIGluYm91bmQgbm9kZSBmb3IgdGhlIGxheWVyLlxuICAgKlxuICAgKiBAcGFyYW0gaW5wdXRUZW5zb3JzIExpc3Qgb2YgaW5wdXQgdGVuc29ycy5cbiAgICogQHBhcmFtIG91dHB1dFRlbnNvcnMgTGlzdCBvZiBvdXRwdXQgdGVuc29ycy5cbiAgICogQHBhcmFtIGlucHV0TWFza3MgTGlzdCBvZiBpbnB1dCBtYXNrcyAoYSBtYXNrIGNhbiBiZSBhIHRlbnNvciwgb3IgbnVsbCkuXG4gICAqIEBwYXJhbSBvdXRwdXRNYXNrcyBMaXN0IG9mIG91dHB1dCBtYXNrcyAoYSBtYXNrIGNhbiBiZSBhIHRlbnNvciwgb3IgbnVsbCkuXG4gICAqIEBwYXJhbSBpbnB1dFNoYXBlcyBMaXN0IG9mIGlucHV0IHNoYXBlIHR1cGxlcy5cbiAgICogQHBhcmFtIG91dHB1dFNoYXBlcyBMaXN0IG9mIG91dHB1dCBzaGFwZSB0dXBsZXMuXG4gICAqIEBwYXJhbSBrd2FyZ3MgRGljdGlvbmFyeSBvZiBrZXl3b3JkIGFyZ3VtZW50cyB0aGF0IHdlcmUgcGFzc2VkIHRvIHRoZVxuICAgKiAgIGBjYWxsYCBtZXRob2Qgb2YgdGhlIGxheWVyIGF0IHRoZSBjYWxsIHRoYXQgY3JlYXRlZCB0aGUgbm9kZS5cbiAgICovXG4gIHByaXZhdGUgYWRkSW5ib3VuZE5vZGUoXG4gICAgICBpbnB1dFRlbnNvcnM6IFN5bWJvbGljVGVuc29yfFN5bWJvbGljVGVuc29yW10sXG4gICAgICBvdXRwdXRUZW5zb3JzOiBTeW1ib2xpY1RlbnNvcnxTeW1ib2xpY1RlbnNvcltdLFxuICAgICAgaW5wdXRNYXNrczogVGVuc29yfFRlbnNvcltdLCBvdXRwdXRNYXNrczogVGVuc29yfFRlbnNvcltdLFxuICAgICAgaW5wdXRTaGFwZXM6IFNoYXBlfFNoYXBlW10sIG91dHB1dFNoYXBlczogU2hhcGV8U2hhcGVbXSxcbiAgICAgIGt3YXJnczoge30gPSBudWxsKTogdm9pZCB7XG4gICAgY29uc3QgaW5wdXRUZW5zb3JMaXN0OiBTeW1ib2xpY1RlbnNvcltdID1cbiAgICAgICAgZ2VuZXJpY191dGlscy50b0xpc3QoaW5wdXRUZW5zb3JzKTtcbiAgICBvdXRwdXRUZW5zb3JzID0gZ2VuZXJpY191dGlscy50b0xpc3Qob3V0cHV0VGVuc29ycyk7XG4gICAgaW5wdXRNYXNrcyA9IGdlbmVyaWNfdXRpbHMudG9MaXN0KGlucHV0TWFza3MpO1xuICAgIG91dHB1dE1hc2tzID0gZ2VuZXJpY191dGlscy50b0xpc3Qob3V0cHV0TWFza3MpO1xuICAgIGlucHV0U2hhcGVzID0gdHlwZXNfdXRpbHMubm9ybWFsaXplU2hhcGVMaXN0KGlucHV0U2hhcGVzKTtcbiAgICBvdXRwdXRTaGFwZXMgPSB0eXBlc191dGlscy5ub3JtYWxpemVTaGFwZUxpc3Qob3V0cHV0U2hhcGVzKTtcblxuICAgIC8vIENvbGxlY3QgaW5wdXQgdGVuc29yKHMpIGNvb3JkaW5hdGVzLlxuICAgIGNvbnN0IGluYm91bmRMYXllcnM6IExheWVyW10gPSBbXTtcbiAgICBjb25zdCBub2RlSW5kaWNlczogbnVtYmVyW10gPSBbXTtcbiAgICBjb25zdCB0ZW5zb3JJbmRpY2VzOiBudW1iZXJbXSA9IFtdO1xuICAgIGZvciAoY29uc3QgeCBvZiBpbnB1dFRlbnNvckxpc3QpIHtcbiAgICAgIC8qXG4gICAgICAgKiBUT0RPKG1pY2hhZWx0ZXJyeSk6IEtlcmFzIGFkZHMgdGhpcyB2YWx1ZSB0byB0ZW5zb3JzOyBpdCdzIG5vdFxuICAgICAgICogY2xlYXIgd2hldGhlciB3ZSdsbCB1c2UgdGhpcyBvciBub3QuXG4gICAgICAgKi9cbiAgICAgIGluYm91bmRMYXllcnMucHVzaCh4LnNvdXJjZUxheWVyKTtcbiAgICAgIG5vZGVJbmRpY2VzLnB1c2goeC5ub2RlSW5kZXgpO1xuICAgICAgdGVuc29ySW5kaWNlcy5wdXNoKHgudGVuc29ySW5kZXgpO1xuICAgIH1cblxuICAgIC8vIENyZWF0ZSBub2RlLCBhZGQgaXQgdG8gaW5ib3VuZCBub2Rlcy5cbiAgICAvLyAoVGhpcyBjYWxsIGhhcyBzaWRlIGVmZmVjdHMuKVxuICAgIC8vIHRzbGludDpkaXNhYmxlLW5leHQtbGluZTpuby11bnVzZWQtZXhwcmVzc2lvblxuICAgIG5ldyBOb2RlKFxuICAgICAgICB7XG4gICAgICAgICAgb3V0Ym91bmRMYXllcjogdGhpcyxcbiAgICAgICAgICBpbmJvdW5kTGF5ZXJzLFxuICAgICAgICAgIG5vZGVJbmRpY2VzLFxuICAgICAgICAgIHRlbnNvckluZGljZXMsXG4gICAgICAgICAgaW5wdXRUZW5zb3JzOiBpbnB1dFRlbnNvckxpc3QsXG4gICAgICAgICAgb3V0cHV0VGVuc29ycyxcbiAgICAgICAgICBpbnB1dE1hc2tzLFxuICAgICAgICAgIG91dHB1dE1hc2tzLFxuICAgICAgICAgIGlucHV0U2hhcGVzLFxuICAgICAgICAgIG91dHB1dFNoYXBlc1xuICAgICAgICB9LFxuICAgICAgICBrd2FyZ3MpO1xuXG4gICAgLy8gVXBkYXRlIHRlbnNvciBoaXN0b3J5XG4gICAgZm9yIChsZXQgaSA9IDA7IGkgPCBvdXRwdXRUZW5zb3JzLmxlbmd0aDsgaSsrKSB7XG4gICAgICAvLyBUT0RPKG1pY2hhZWx0ZXJyeTogX3VzZXNfbGVhcm5pbmdfcGhhc2Ugbm90IHRyYWNrZWQuXG4gICAgICBvdXRwdXRUZW5zb3JzW2ldLnNvdXJjZUxheWVyID0gdGhpcztcbiAgICAgIG91dHB1dFRlbnNvcnNbaV0ubm9kZUluZGV4ID0gdGhpcy5pbmJvdW5kTm9kZXMubGVuZ3RoIC0gMTtcbiAgICAgIG91dHB1dFRlbnNvcnNbaV0udGVuc29ySW5kZXggPSBpO1xuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBSZXR1cm5zIHRoZSBjb25maWcgb2YgdGhlIGxheWVyLlxuICAgKlxuICAgKiBBIGxheWVyIGNvbmZpZyBpcyBhIFRTIGRpY3Rpb25hcnkgKHNlcmlhbGl6YWJsZSlcbiAgICogY29udGFpbmluZyB0aGUgY29uZmlndXJhdGlvbiBvZiBhIGxheWVyLlxuICAgKiBUaGUgc2FtZSBsYXllciBjYW4gYmUgcmVpbnN0YW50aWF0ZWQgbGF0ZXJcbiAgICogKHdpdGhvdXQgaXRzIHRyYWluZWQgd2VpZ2h0cykgZnJvbSB0aGlzIGNvbmZpZ3VyYXRpb24uXG4gICAqXG4gICAqIFRoZSBjb25maWcgb2YgYSBsYXllciBkb2VzIG5vdCBpbmNsdWRlIGNvbm5lY3Rpdml0eVxuICAgKiBpbmZvcm1hdGlvbiwgbm9yIHRoZSBsYXllciBjbGFzcyBuYW1lLiAgVGhlc2UgYXJlIGhhbmRsZWRcbiAgICogYnkgJ0NvbnRhaW5lcicgKG9uZSBsYXllciBvZiBhYnN0cmFjdGlvbiBhYm92ZSkuXG4gICAqXG4gICAqIFBvcnRpbmcgTm90ZTogVGhlIFRTIGRpY3Rpb25hcnkgZm9sbG93cyBUUyBuYW1pbmcgc3RhbmRhcmRzIGZvclxuICAgKiBrZXlzLCBhbmQgdXNlcyB0ZmpzLWxheWVycyB0eXBlLXNhZmUgRW51bXMuICBTZXJpYWxpemF0aW9uIG1ldGhvZHNcbiAgICogc2hvdWxkIHVzZSBhIGhlbHBlciBmdW5jdGlvbiB0byBjb252ZXJ0IHRvIHRoZSBweXRob25pYyBzdG9yYWdlXG4gICAqIHN0YW5kYXJkLiAoc2VlIHNlcmlhbGl6YXRpb25fdXRpbHMuY29udmVydFRzVG9QeXRob25pYylcbiAgICpcbiAgICogQHJldHVybnMgVFMgZGljdGlvbmFyeSBvZiBjb25maWd1cmF0aW9uLlxuICAgKlxuICAgKiBAZG9jIHtoZWFkaW5nOiAnTW9kZWxzJywgJ3N1YmhlYWRpbmcnOiAnQ2xhc3Nlcyd9XG4gICAqL1xuICBnZXRDb25maWcoKTogc2VyaWFsaXphdGlvbi5Db25maWdEaWN0IHtcbiAgICBjb25zdCBjb25maWc6XG4gICAgICAgIHNlcmlhbGl6YXRpb24uQ29uZmlnRGljdCA9IHtuYW1lOiB0aGlzLm5hbWUsIHRyYWluYWJsZTogdGhpcy50cmFpbmFibGV9O1xuICAgIGlmICh0aGlzLmJhdGNoSW5wdXRTaGFwZSAhPSBudWxsKSB7XG4gICAgICBjb25maWdbJ2JhdGNoSW5wdXRTaGFwZSddID0gdGhpcy5iYXRjaElucHV0U2hhcGU7XG4gICAgfVxuICAgIGlmICh0aGlzLmR0eXBlICE9IG51bGwpIHtcbiAgICAgIGNvbmZpZ1snZHR5cGUnXSA9IHRoaXMuZHR5cGU7XG4gICAgfVxuICAgIHJldHVybiBjb25maWc7XG4gIH1cblxuICAvKipcbiAgICogRGlzcG9zZSB0aGUgd2VpZ2h0IHZhcmlhYmxlcyB0aGF0IHRoaXMgTGF5ZXIgaW5zdGFuY2UgaG9sZHMuXG4gICAqXG4gICAqIEByZXR1cm5zIHtudW1iZXJ9IE51bWJlciBvZiBkaXNwb3NlZCB2YXJpYWJsZXMuXG4gICAqL1xuICBwcm90ZWN0ZWQgZGlzcG9zZVdlaWdodHMoKTogbnVtYmVyIHtcbiAgICB0aGlzLndlaWdodHMuZm9yRWFjaCh3ZWlnaHQgPT4gd2VpZ2h0LmRpc3Bvc2UoKSk7XG4gICAgcmV0dXJuIHRoaXMud2VpZ2h0cy5sZW5ndGg7XG4gIH1cblxuICBwcm90ZWN0ZWQgYXNzZXJ0Tm90RGlzcG9zZWQoKSB7XG4gICAgaWYgKHRoaXMuX3JlZkNvdW50ID09PSAwKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoYExheWVyICcke3RoaXMubmFtZX0nIGlzIGFscmVhZHkgZGlzcG9zZWQuYCk7XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIEF0dGVtcHQgdG8gZGlzcG9zZSBsYXllcidzIHdlaWdodHMuXG4gICAqXG4gICAqIFRoaXMgbWV0aG9kIGRlY3JlYXNlcyB0aGUgcmVmZXJlbmNlIGNvdW50IG9mIHRoZSBMYXllciBvYmplY3QgYnkgMS5cbiAgICpcbiAgICogQSBMYXllciBpcyByZWZlcmVuY2UtY291bnRlZC4gSXRzIHJlZmVyZW5jZSBjb3VudCBpcyBpbmNyZW1lbnRlZCBieSAxXG4gICAqIHRoZSBmaXJzdCBpdGVtIGl0cyBgYXBwbHkoKWAgbWV0aG9kIGlzIGNhbGxlZCBhbmQgd2hlbiBpdCBiZWNvbWVzIGEgcGFydFxuICAgKiBvZiBhIG5ldyBgTm9kZWAgKHRocm91Z2ggY2FsbGluZyB0aGUgYGFwcGx5KClgIG1ldGhvZCBvbiBhXG4gICAqIGB0Zi5TeW1ib2xpY1RlbnNvcmApLlxuICAgKlxuICAgKiBJZiB0aGUgcmVmZXJlbmNlIGNvdW50IG9mIGEgTGF5ZXIgYmVjb21lcyAwLCBhbGwgdGhlIHdlaWdodHMgd2lsbCBiZVxuICAgKiBkaXNwb3NlZCBhbmQgdGhlIHVuZGVybHlpbmcgbWVtb3J5IChlLmcuLCB0aGUgdGV4dHVyZXMgYWxsb2NhdGVkIGluIFdlYkdMKVxuICAgKiB3aWxsIGJlIGZyZWVkLlxuICAgKlxuICAgKiBOb3RlOiBJZiB0aGUgcmVmZXJlbmNlIGNvdW50IGlzIGdyZWF0ZXIgdGhhbiAwIGFmdGVyIHRoZSBkZWNyZW1lbnQsIHRoZVxuICAgKiB3ZWlnaHRzIG9mIHRoZSBMYXllciB3aWxsICpub3QqIGJlIGRpc3Bvc2VkLlxuICAgKlxuICAgKiBBZnRlciBhIExheWVyIGlzIGRpc3Bvc2VkLCBpdCBjYW5ub3QgYmUgdXNlZCBpbiBjYWxscyBzdWNoIGFzIGBhcHBseSgpYCxcbiAgICogYGdldFdlaWdodHMoKWAgb3IgYHNldFdlaWdodHMoKWAgYW55bW9yZS5cbiAgICpcbiAgICogQHJldHVybnMgQSBEaXNwb3NlUmVzdWx0IE9iamVjdCB3aXRoIHRoZSBmb2xsb3dpbmcgZmllbGRzOlxuICAgKiAgIC0gcmVmQ291bnRBZnRlckRpc3Bvc2U6IFRoZSByZWZlcmVuY2UgY291bnQgb2YgdGhlIENvbnRhaW5lciBhZnRlciB0aGlzXG4gICAqICAgICBgZGlzcG9zZSgpYCBjYWxsLlxuICAgKiAgIC0gbnVtRGlzcG9zZWRWYXJpYWJsZXM6IE51bWJlciBvZiBgdGYuVmFyaWFibGVgcyAoaS5lLiwgd2VpZ2h0cykgZGlzcG9zZWRcbiAgICogICAgIGR1cmluZyB0aGlzIGBkaXNwb3NlKClgIGNhbGwuXG4gICAqIEB0aHJvd3Mge0Vycm9yfSBJZiB0aGUgbGF5ZXIgaXMgbm90IGJ1aWx0IHlldCwgb3IgaWYgdGhlIGxheWVyIGhhcyBhbHJlYWR5XG4gICAqICAgYmVlbiBkaXNwb3NlZC5cbiAgICpcbiAgICogQGRvYyB7aGVhZGluZzogJ01vZGVscycsICdzdWJoZWFkaW5nJzogJ0NsYXNzZXMnfVxuICAgKi9cbiAgZGlzcG9zZSgpOiBEaXNwb3NlUmVzdWx0IHtcbiAgICBpZiAoIXRoaXMuYnVpbHQpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcihcbiAgICAgICAgICBgQ2Fubm90IGRpc3Bvc2UgTGF5ZXIgJHt0aGlzLm5hbWV9IGJlY2F1c2UgaXQgaGFzIG5vdCBiZWVuIGAgK1xuICAgICAgICAgIGBidWlsdCB5ZXQuYCk7XG4gICAgfVxuXG4gICAgaWYgKHRoaXMuX3JlZkNvdW50ID09PSBudWxsKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoXG4gICAgICAgICAgYENhbm5vdCBkaXNwb3NlIExheWVyICR7dGhpcy5uYW1lfSBiZWNhdXNlIGl0IGhhcyBub3QgYmVlbiB1c2VkIGAgK1xuICAgICAgICAgIGB5ZXQuYCk7XG4gICAgfVxuXG4gICAgdGhpcy5hc3NlcnROb3REaXNwb3NlZCgpO1xuXG4gICAgbGV0IG51bURpc3Bvc2VkVmFyaWFibGVzID0gMDtcbiAgICBpZiAoLS10aGlzLl9yZWZDb3VudCA9PT0gMCkge1xuICAgICAgbnVtRGlzcG9zZWRWYXJpYWJsZXMgPSB0aGlzLmRpc3Bvc2VXZWlnaHRzKCk7XG4gICAgfVxuXG4gICAgcmV0dXJuIHtyZWZDb3VudEFmdGVyRGlzcG9zZTogdGhpcy5fcmVmQ291bnQsIG51bURpc3Bvc2VkVmFyaWFibGVzfTtcbiAgfVxufVxuXG4vKipcbiAqIENvbGxlY3RzIHRoZSBpbnB1dCBzaGFwZShzKSBvZiBhIGxpc3Qgb2YgYHRmLlRlbnNvcmBzIG9yXG4gKiBgdGYuU3ltYm9saWNUZW5zb3Jgcy5cbiAqXG4gKiBUT0RPKG1pY2hhZWx0ZXJyeSk6IFVwZGF0ZSBQeUtlcmFzIGRvY3MgKGJhY2twb3J0KS5cbiAqXG4gKiBAcGFyYW0gaW5wdXRUZW5zb3JzIExpc3Qgb2YgaW5wdXQgdGVuc29ycyAob3Igc2luZ2xlIGlucHV0IHRlbnNvcikuXG4gKlxuICogQHJldHVybiBMaXN0IG9mIHNoYXBlIHR1cGxlcyAob3Igc2luZ2xlIHR1cGxlKSwgb25lIHR1cGxlIHBlciBpbnB1dC5cbiAqL1xuZnVuY3Rpb24gY29sbGVjdElucHV0U2hhcGUoaW5wdXRUZW5zb3JzOiBTeW1ib2xpY1RlbnNvcnxTeW1ib2xpY1RlbnNvcltdfFRlbnNvcnxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgIFRlbnNvcltdKTogU2hhcGV8U2hhcGVbXSB7XG4gIGlucHV0VGVuc29ycyA9XG4gICAgICBnZW5lcmljX3V0aWxzLnRvTGlzdChpbnB1dFRlbnNvcnMpIGFzIFN5bWJvbGljVGVuc29yW10gfCBUZW5zb3JbXTtcbiAgY29uc3Qgc2hhcGVzOiBTaGFwZVtdID0gW107XG4gIGZvciAoY29uc3QgeCBvZiBpbnB1dFRlbnNvcnMpIHtcbiAgICBzaGFwZXMucHVzaCh4LnNoYXBlKTtcbiAgfVxuICByZXR1cm4gZ2VuZXJpY191dGlscy5zaW5nbGV0b25PckFycmF5KHNoYXBlcyk7XG59XG5cbi8qKlxuICogR3Vlc3NlcyBvdXRwdXQgZHR5cGUgYmFzZWQgb24gaW5wdXRzLlxuICpcbiAqIEF0IHByZXNlbnQsIGp1c3QgcmV0dXJucyAnZmxvYXQzMicgZm9yIGFueSBpbnB1dC5cbiAqXG4gKiBAcGFyYW0gaW5wdXRUZW5zb3JzIExpc3Qgb2YgaW5wdXQgdGVuc29ycyAob3Igc2luZ2xlIGlucHV0IHRlbnNvcikuXG4gKlxuICogQHJldHVybiBUaGUgZ3Vlc3NlZCBEVHlwZS4gQXQgcHJlc2VudCwgYWx3YXlzIHJldHVybnMgJ2Zsb2F0MzInLlxuICovXG5mdW5jdGlvbiBndWVzc091dHB1dERUeXBlKGlucHV0VGVuc29yczogU3ltYm9saWNUZW5zb3J8U3ltYm9saWNUZW5zb3JbXXxUZW5zb3J8XG4gICAgICAgICAgICAgICAgICAgICAgICAgIFRlbnNvcltdKTogRGF0YVR5cGUge1xuICByZXR1cm4gJ2Zsb2F0MzInO1xufVxuXG4vKipcbiAqIFJldHVybnMgdGhlIGxpc3Qgb2YgaW5wdXQgdGVuc29ycyBuZWNlc3NhcnkgdG8gY29tcHV0ZSBgdGVuc29yYC5cbiAqXG4gKiBPdXRwdXQgd2lsbCBhbHdheXMgYmUgYSBsaXN0IG9mIHRlbnNvcnMgKHBvdGVudGlhbGx5IHdpdGggMSBlbGVtZW50KS5cbiAqXG4gKiBAcGFyYW0gdGVuc29yIFRoZSB0ZW5zb3IgdG8gc3RhcnQgZnJvbS5cbiAqIEBwYXJhbSBsYXllciBPcmlnaW4gbGF5ZXIgb2YgdGhlIHRlbnNvci5cbiAqIEBwYXJhbSBub2RlSW5kZXggT3JpZ2luIG5vZGUgaW5kZXggb2YgdGhlIHRlbnNvci5cbiAqXG4gKiBAcmV0dXJuIEFycmF5IG9mIGlucHV0IHRlbnNvcnMuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBnZXRTb3VyY2VJbnB1dHMoXG4gICAgdGVuc29yOiBTeW1ib2xpY1RlbnNvciwgbGF5ZXI/OiBMYXllcixcbiAgICBub2RlSW5kZXg/OiBudW1iZXIpOiBTeW1ib2xpY1RlbnNvcltdIHtcbiAgaWYgKGxheWVyID09IG51bGwgfHwgKG5vZGVJbmRleCAhPSBudWxsICYmIG5vZGVJbmRleCA+IDApKSB7XG4gICAgbGF5ZXIgPSB0ZW5zb3Iuc291cmNlTGF5ZXI7XG4gICAgbm9kZUluZGV4ID0gdGVuc29yLm5vZGVJbmRleDtcbiAgfVxuICBpZiAobGF5ZXIuaW5ib3VuZE5vZGVzLmxlbmd0aCA9PT0gMCkge1xuICAgIHJldHVybiBbdGVuc29yXTtcbiAgfSBlbHNlIHtcbiAgICBjb25zdCBub2RlID0gbGF5ZXIuaW5ib3VuZE5vZGVzW25vZGVJbmRleF07XG4gICAgaWYgKG5vZGUuaW5ib3VuZExheWVycy5sZW5ndGggPT09IDApIHtcbiAgICAgIHJldHVybiBub2RlLmlucHV0VGVuc29ycztcbiAgICB9IGVsc2Uge1xuICAgICAgY29uc3Qgc291cmNlVGVuc29yczogU3ltYm9saWNUZW5zb3JbXSA9IFtdO1xuICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCBub2RlLmluYm91bmRMYXllcnMubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgY29uc3QgeCA9IG5vZGUuaW5wdXRUZW5zb3JzW2ldO1xuICAgICAgICBjb25zdCBsYXllciA9IG5vZGUuaW5ib3VuZExheWVyc1tpXTtcbiAgICAgICAgY29uc3Qgbm9kZUluZGV4ID0gbm9kZS5ub2RlSW5kaWNlc1tpXTtcbiAgICAgICAgY29uc3QgcHJldmlvdXNTb3VyY2VzID0gZ2V0U291cmNlSW5wdXRzKHgsIGxheWVyLCBub2RlSW5kZXgpO1xuICAgICAgICAvLyBBdm9pZCBpbnB1dCByZWR1bmRhbmN5LlxuICAgICAgICBmb3IgKGNvbnN0IHggb2YgcHJldmlvdXNTb3VyY2VzKSB7XG4gICAgICAgICAgaWYgKHNvdXJjZVRlbnNvcnMuaW5kZXhPZih4KSA9PT0gLTEpIHtcbiAgICAgICAgICAgIHNvdXJjZVRlbnNvcnMucHVzaCh4KTtcbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICAgIHJldHVybiBzb3VyY2VUZW5zb3JzO1xuICAgIH1cbiAgfVxufVxuIl19","/**\n * @license\n * Copyright 2018 Google LLC\n *\n * Use of this source code is governed by an MIT-style\n * license that can be found in the LICENSE file or at\n * https://opensource.org/licenses/MIT.\n * =============================================================================\n */\nimport { serialization } from '@tensorflow/tfjs-core';\nimport { getUid } from '../backend/state';\nimport { ValueError } from '../errors';\nimport { Layer, Node, SymbolicTensor } from './topology';\nexport class InputLayer extends Layer {\n constructor(args) {\n super({\n dtype: args.dtype,\n name: args.name != null ? args.name : getUid('input').toString()\n });\n // Normalize config.batchSize and config.sparse\n if (args.batchSize == null) {\n args.batchSize = null;\n }\n if (args.sparse == null) {\n args.sparse = false;\n }\n this.trainable = false;\n this.built = true;\n this.sparse = args.sparse;\n if (args.inputShape != null && args.batchInputShape != null) {\n throw new ValueError('Only provide the inputShape OR ' +\n 'batchInputShape argument to inputLayer, not both at the same time.');\n }\n let batchInputShape = args.batchInputShape;\n if (batchInputShape == null) {\n if (args.inputShape == null) {\n throw new ValueError('An InputLayer should be passed either a ' +\n '`batchInputShape` or an `inputShape`.');\n }\n else {\n batchInputShape = [args.batchSize].concat(args.inputShape);\n }\n }\n else {\n // TODO(michaelterry): Backport to PyKeras\n if (args.batchSize != null) {\n throw new ValueError('Cannot specify batchSize if batchInputShape is ' +\n 'specified when creating an InputLayer.');\n }\n }\n const dtype = args.dtype || 'float32';\n this.batchInputShape = batchInputShape;\n this.dtype = dtype;\n // TODO(michaelterry): Backport this to PyKeras?\n this.inputSpec = [{ shape: batchInputShape }];\n const inputTensor = new SymbolicTensor(this.dtype, this.batchInputShape, this, [], {}, this.name);\n inputTensor.nodeIndex = 0;\n inputTensor.tensorIndex = 0;\n // Create an input node to add to this.outboundNode.\n // (This call has side effects.)\n // tslint:disable-next-line:no-unused-expression\n new Node({\n outboundLayer: this,\n inboundLayers: [],\n nodeIndices: [],\n tensorIndices: [],\n inputTensors: [inputTensor],\n outputTensors: [inputTensor],\n inputMasks: [null],\n outputMasks: [null],\n inputShapes: [batchInputShape],\n outputShapes: [batchInputShape]\n });\n }\n apply(inputs, kwargs) {\n throw new ValueError('Cannot pass any input to an ' +\n `InputLayer's apply() method. InputLayer name: ${this.name}`);\n }\n dispose() {\n // dispose() for InputLayer is overridden as no-op.\n return { refCountAfterDispose: this._refCount, numDisposedVariables: 0 };\n }\n getConfig() {\n return {\n batchInputShape: this.batchInputShape,\n dtype: this.dtype,\n sparse: this.sparse,\n name: this.name\n };\n }\n}\n/** @nocollapse */\nInputLayer.className = 'InputLayer';\nserialization.registerClass(InputLayer);\nexport function Input(config) {\n if (config.batchShape == null && config.shape == null) {\n throw new Error('Please provide to Input either a `shape`' +\n ' or a `batchShape` argument. Note that ' +\n '`shape` does not include the batch ' +\n 'dimension.');\n }\n if (config.batchShape != null && config.shape != null) {\n // TODO(michaelterry): Backport to PyKeras.\n throw new ValueError('Please provide either a `shape` or `batchShape` ' +\n 'argument to Input, but not both.');\n }\n let batchShape = config.batchShape;\n if (config.shape != null && batchShape == null) {\n batchShape = [null].concat(config.shape);\n }\n let dtype = config.dtype;\n if (dtype == null) {\n dtype = 'float32';\n }\n const inputLayer = new InputLayer({\n batchInputShape: batchShape,\n name: config.name,\n dtype,\n sparse: config.sparse\n });\n const outputs = inputLayer.inboundNodes[0].outputTensors;\n return outputs[0];\n}\n//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW5wdXRfbGF5ZXIuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi8uLi90ZmpzLWxheWVycy9zcmMvZW5naW5lL2lucHV0X2xheWVyLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBOzs7Ozs7OztHQVFHO0FBRUgsT0FBTyxFQUFXLGFBQWEsRUFBUyxNQUFNLHVCQUF1QixDQUFDO0FBRXRFLE9BQU8sRUFBQyxNQUFNLEVBQUMsTUFBTSxrQkFBa0IsQ0FBQztBQUN4QyxPQUFPLEVBQUMsVUFBVSxFQUFDLE1BQU0sV0FBVyxDQUFDO0FBSXJDLE9BQU8sRUFBZ0IsS0FBSyxFQUFFLElBQUksRUFBRSxjQUFjLEVBQUMsTUFBTSxZQUFZLENBQUM7QUEyQnRFLE1BQU0sT0FBTyxVQUFXLFNBQVEsS0FBSztJQUluQyxZQUFZLElBQW9CO1FBQzlCLEtBQUssQ0FBQztZQUNKLEtBQUssRUFBRSxJQUFJLENBQUMsS0FBSztZQUNqQixJQUFJLEVBQUUsSUFBSSxDQUFDLElBQUksSUFBSSxJQUFJLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLE1BQU0sQ0FBQyxPQUFPLENBQUMsQ0FBQyxRQUFRLEVBQUU7U0FDakUsQ0FBQyxDQUFDO1FBQ0gsK0NBQStDO1FBQy9DLElBQUksSUFBSSxDQUFDLFNBQVMsSUFBSSxJQUFJLEVBQUU7WUFDMUIsSUFBSSxDQUFDLFNBQVMsR0FBRyxJQUFJLENBQUM7U0FDdkI7UUFDRCxJQUFJLElBQUksQ0FBQyxNQUFNLElBQUksSUFBSSxFQUFFO1lBQ3ZCLElBQUksQ0FBQyxNQUFNLEdBQUcsS0FBSyxDQUFDO1NBQ3JCO1FBRUQsSUFBSSxDQUFDLFNBQVMsR0FBRyxLQUFLLENBQUM7UUFDdkIsSUFBSSxDQUFDLEtBQUssR0FBRyxJQUFJLENBQUM7UUFDbEIsSUFBSSxDQUFDLE1BQU0sR0FBRyxJQUFJLENBQUMsTUFBTSxDQUFDO1FBRTFCLElBQUksSUFBSSxDQUFDLFVB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QyxVQUFVLElBQUksSUFBSSxJQUFJLE1BQU0sQ0FBQyxLQUFLLElBQUksSUFBSSxFQUFFO1FBQ3JELE1BQU0sSUFBSSxLQUFLLENBQ1gsMENBQTBDO1lBQzFDLHlDQUF5QztZQUN6QyxxQ0FBcUM7WUFDckMsWUFBWSxDQUFDLENBQUM7S0FDbkI7SUFDRCxJQUFJLE1BQU0sQ0FBQyxVQUFVLElBQUksSUFBSSxJQUFJLE1BQU0sQ0FBQyxLQUFLLElBQUksSUFBSSxFQUFFO1FBQ3JELDJDQUEyQztRQUMzQyxNQUFNLElBQUksVUFBVSxDQUNoQixrREFBa0Q7WUFDbEQsa0NBQWtDLENBQUMsQ0FBQztLQUN6QztJQUNELElBQUksVUFBVSxHQUFHLE1BQU0sQ0FBQyxVQUFVLENBQUM7SUFDbkMsSUFBSSxNQUFNLENBQUMsS0FBSyxJQUFJLElBQUksSUFBSSxVQUFVLElBQUksSUFBSSxFQUFFO1FBQzlDLFVBQVUsR0FBRyxDQUFDLElBQUksQ0FBQyxDQUFDLE1BQU0sQ0FBQyxNQUFNLENBQUMsS0FBSyxDQUFDLENBQUM7S0FDMUM7SUFFRCxJQUFJLEtBQUssR0FBRyxNQUFNLENBQUMsS0FBSyxDQUFDO0lBQ3pCLElBQUksS0FBSyxJQUFJLElBQUksRUFBRTtRQUNqQixLQUFLLEdBQUcsU0FBUyxDQUFDO0tBQ25CO0lBRUQsTUFBTSxVQUFVLEdBQUcsSUFBSSxVQUFVLENBQUM7UUFDaEMsZUFBZSxFQUFFLFVBQVU7UUFDM0IsSUFBSSxFQUFFLE1BQU0sQ0FBQyxJQUFJO1FBQ2pCLEtBQUs7UUFDTCxNQUFNLEVBQUUsTUFBTSxDQUFDLE1BQU07S0FDdEIsQ0FBQyxDQUFDO0lBRUgsTUFBTSxPQUFPLEdBQUcsVUFBVSxDQUFDLFlBQVksQ0FBQyxDQUFDLENBQUMsQ0FBQyxhQUFhLENBQUM7SUFDekQsT0FBTyxPQUFPLENBQUMsQ0FBQyxDQUFDLENBQUM7QUFDcEIsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbIi8qKlxuICogQGxpY2Vuc2VcbiAqIENvcHlyaWdodCAyMDE4IEdvb2dsZSBMTENcbiAqXG4gKiBVc2Ugb2YgdGhpcyBzb3VyY2UgY29kZSBpcyBnb3Zlcm5lZCBieSBhbiBNSVQtc3R5bGVcbiAqIGxpY2Vuc2UgdGhhdCBjYW4gYmUgZm91bmQgaW4gdGhlIExJQ0VOU0UgZmlsZSBvciBhdFxuICogaHR0cHM6Ly9vcGVuc291cmNlLm9yZy9saWNlbnNlcy9NSVQuXG4gKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuICovXG5cbmltcG9ydCB7RGF0YVR5cGUsIHNlcmlhbGl6YXRpb24sIFRlbnNvcn0gZnJvbSAnQHRlbnNvcmZsb3cvdGZqcy1jb3JlJztcblxuaW1wb3J0IHtnZXRVaWR9IGZyb20gJy4uL2JhY2tlbmQvc3RhdGUnO1xuaW1wb3J0IHtWYWx1ZUVycm9yfSBmcm9tICcuLi9lcnJvcnMnO1xuaW1wb3J0IHtTaGFwZX0gZnJvbSAnLi4va2VyYXNfZm9ybWF0L2NvbW1vbic7XG5pbXBvcnQge0t3YXJnc30gZnJvbSAnLi4vdHlwZXMnO1xuXG5pbXBvcnQge0Rpc3Bvc2VSZXN1bHQsIExheWVyLCBOb2RlLCBTeW1ib2xpY1RlbnNvcn0gZnJvbSAnLi90b3BvbG9neSc7XG5cbi8qKlxuICogQ29uc3RydWN0b3IgYXJndW1lbnRzIGZvciBJbnB1dExheWVyLlxuICpcbiAqIE5vdGU6IFlvdSBzaG91bGQgcHJvdmlkZSBvbmx5IGlucHV0U2hhcGUgb3IgYmF0Y2hJbnB1dFNoYXBlIChub3QgYm90aCkuXG4gKiBJZiBvbmx5IGlucHV0U2hhcGUgaXMgcHJvdmlkZWQsIHRoZW4gdGhlIGJhdGNoSW5wdXRTaGFwZSBpcyBkZXRlcm1pbmVkIGJ5XG4gKiB0aGUgYmF0Y2hTaXplIGFyZ3VtZW50IGFuZCB0aGUgaW5wdXRTaGFwZTogW2JhdGNoU2l6ZV0uY29uY2F0KGlucHV0U2hhcGUpLlxuICovXG5leHBvcnQgZGVjbGFyZSBpbnRlcmZhY2UgSW5wdXRMYXllckFyZ3Mge1xuICAvKiogSW5wdXQgc2hhcGUsIG5vdCBpbmNsdWRpbmcgdGhlIGJhdGNoIGF4aXMuICovXG4gIGlucHV0U2hhcGU/OiBTaGFwZTtcbiAgLyoqIE9wdGlvbmFsIGlucHV0IGJhdGNoIHNpemUgKGludGVnZXIgb3IgbnVsbCkuICovXG4gIGJhdGNoU2l6ZT86IG51bWJlcjtcbiAgLyoqIEJhdGNoIGlucHV0IHNoYXBlLCBpbmNsdWRpbmcgdGhlIGJhdGNoIGF4aXMuICovXG4gIGJhdGNoSW5wdXRTaGFwZT86IFNoYXBlO1xuICAvKiogRGF0YXR5cGUgb2YgdGhlIGlucHV0LiAgKi9cbiAgZHR5cGU/OiBEYXRhVHlwZTtcbiAgLyoqXG4gICAqIFdoZXRoZXIgdGhlIHBsYWNlaG9sZGVyIGNyZWF0ZWQgaXMgbWVhbnQgdG8gYmUgc3BhcnNlLlxuICAgKi9cbiAgc3BhcnNlPzogYm9vbGVhbjsgIC8vIFRPRE8obWljaGFlbHRlcnJ5KTogTm90IGNsZWFyIHdoZXRoZXIgd2UnbGwgbmVlZCB0aGlzLlxuXG4gIC8qKiBOYW1lIG9mIHRoZSBsYXllci4gKi9cbiAgbmFtZT86IHN0cmluZztcbn1cblxuZXhwb3J0IGNsYXNzIElucHV0TGF5ZXIgZXh0ZW5kcyBMYXllciB7XG4gIC8qKiBAbm9jb2xsYXBzZSAqL1xuICBzdGF0aWMgcmVhZG9ubHkgY2xhc3NOYW1lID0gJ0lucHV0TGF5ZXInO1xuICBzcGFyc2U6IGJvb2xlYW47XG4gIGNvbnN0cnVjdG9yKGFyZ3M6IElucHV0TGF5ZXJBcmdzKSB7XG4gICAgc3VwZXIoe1xuICAgICAgZHR5cGU6IGFyZ3MuZHR5cGUsXG4gICAgICBuYW1lOiBhcmdzLm5hbWUgIT0gbnVsbCA/IGFyZ3MubmFtZSA6IGdldFVpZCgnaW5wdXQnKS50b1N0cmluZygpXG4gICAgfSk7XG4gICAgLy8gTm9ybWFsaXplIGNvbmZpZy5iYXRjaFNpemUgYW5kIGNvbmZpZy5zcGFyc2VcbiAgICBpZiAoYXJncy5iYXRjaFNpemUgPT0gbnVsbCkge1xuICAgICAgYXJncy5iYXRjaFNpemUgPSBudWxsO1xuICAgIH1cbiAgICBpZiAoYXJncy5zcGFyc2UgPT0gbnVsbCkge1xuICAgICAgYXJncy5zcGFyc2UgPSBmYWxzZTtcbiAgICB9XG5cbiAgICB0aGlzLnRyYWluYWJsZSA9IGZhbHNlO1xuICAgIHRoaXMuYnVpbHQgPSB0cnVlO1xuICAgIHRoaXMuc3BhcnNlID0gYXJncy5zcGFyc2U7XG5cbiAgICBpZiAoYXJncy5pbnB1dFNoYXBlICE9IG51bGwgJiYgYXJncy5iYXRjaElucHV0U2hhcGUgIT0gbnVsbCkge1xuICAgICAgdGhyb3cgbmV3IFZhbHVlRXJyb3IoXG4gICAgICAgICAgJ09ubHkgcHJvdmlkZSB0aGUgaW5wdXRTaGFwZSBPUiAnICtcbiAgICAgICAgICAnYmF0Y2hJbnB1dFNoYXBlIGFyZ3VtZW50IHRvIGlucHV0TGF5ZXIsIG5vdCBib3RoIGF0IHRoZSBzYW1lIHRpbWUuJyk7XG4gICAgfVxuICAgIGxldCBiYXRjaElucHV0U2hhcGUgPSBhcmdzLmJhdGNoSW5wdXRTaGFwZTtcbiAgICBpZiAoYmF0Y2hJbnB1dFNoYXBlID09IG51bGwpIHtcbiAgICAgIGlmIChhcmdzLmlucHV0U2hhcGUgPT0gbnVsbCkge1xuICAgICAgICB0aHJvdyBuZXcgVmFsdWVFcnJvcihcbiAgICAgICAgICAgICdBbiBJbnB1dExheWVyIHNob3VsZCBiZSBwYXNzZWQgZWl0aGVyIGEgJyArXG4gICAgICAgICAgICAnYGJhdGNoSW5wdXRTaGFwZWAgb3IgYW4gYGlucHV0U2hhcGVgLicpO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgYmF0Y2hJbnB1dFNoYXBlID0gW2FyZ3MuYmF0Y2hTaXplXS5jb25jYXQoYXJncy5pbnB1dFNoYXBlKTtcbiAgICAgIH1cbiAgICB9IGVsc2Uge1xuICAgICAgLy8gVE9ETyhtaWNoYWVsdGVycnkpOiBCYWNrcG9ydCB0byBQeUtlcmFzXG4gICAgICBpZiAoYXJncy5iYXRjaFNpemUgIT0gbnVsbCkge1xuICAgICAgICB0aHJvdyBuZXcgVmFsdWVFcnJvcihcbiAgICAgICAgICAgICdDYW5ub3Qgc3BlY2lmeSBiYXRjaFNpemUgaWYgYmF0Y2hJbnB1dFNoYXBlIGlzICcgK1xuICAgICAgICAgICAgJ3NwZWNpZmllZCB3aGVuIGNyZWF0aW5nIGFuIElucHV0TGF5ZXIuJyk7XG4gICAgICB9XG4gICAgfVxuXG4gICAgY29uc3QgZHR5cGUgPSBhcmdzLmR0eXBlIHx8ICdmbG9hdDMyJztcblxuICAgIHRoaXMuYmF0Y2hJbnB1dFNoYXBlID0gYmF0Y2hJbnB1dFNoYXBlO1xuICAgIHRoaXMuZHR5cGUgPSBkdHlwZTtcbiAgICAvLyBUT0RPKG1pY2hhZWx0ZXJyeSk6IEJhY2twb3J0IHRoaXMgdG8gUHlLZXJhcz9cbiAgICB0aGlzLmlucHV0U3BlYyA9IFt7c2hhcGU6IGJhdGNoSW5wdXRTaGFwZX1dO1xuXG4gICAgY29uc3QgaW5wdXRUZW5zb3IgPSBuZXcgU3ltYm9saWNUZW5zb3IoXG4gICAgICAgIHRoaXMuZHR5cGUsIHRoaXMuYmF0Y2hJbnB1dFNoYXBlLCB0aGlzLCBbXSwge30sIHRoaXMubmFtZSk7XG4gICAgaW5wdXRUZW5zb3Iubm9kZUluZGV4ID0gMDtcbiAgICBpbnB1dFRlbnNvci50ZW5zb3JJbmRleCA9IDA7XG5cbiAgICAvLyBDcmVhdGUgYW4gaW5wdXQgbm9kZSB0byBhZGQgdG8gdGhpcy5vdXRib3VuZE5vZGUuXG4gICAgLy8gKFRoaXMgY2FsbCBoYXMgc2lkZSBlZmZlY3RzLilcbiAgICAvLyB0c2xpbnQ6ZGlzYWJsZS1uZXh0LWxpbmU6bm8tdW51c2VkLWV4cHJlc3Npb25cbiAgICBuZXcgTm9kZSh7XG4gICAgICBvdXRib3VuZExheWVyOiB0aGlzLFxuICAgICAgaW5ib3VuZExheWVyczogW10sXG4gICAgICBub2RlSW5kaWNlczogW10sXG4gICAgICB0ZW5zb3JJbmRpY2VzOiBbXSxcbiAgICAgIGlucHV0VGVuc29yczogW2lucHV0VGVuc29yXSxcbiAgICAgIG91dHB1dFRlbnNvcnM6IFtpbnB1dFRlbnNvcl0sXG4gICAgICBpbnB1dE1hc2tzOiBbbnVsbF0sXG4gICAgICBvdXRwdXRNYXNrczogW251bGxdLFxuICAgICAgaW5wdXRTaGFwZXM6IFtiYXRjaElucHV0U2hhcGVdLFxuICAgICAgb3V0cHV0U2hhcGVzOiBbYmF0Y2hJbnB1dFNoYXBlXVxuICAgIH0pO1xuICB9XG5cbiAgYXBwbHkoXG4gICAgICBpbnB1dHM6IFRlbnNvcnxUZW5zb3JbXXxTeW1ib2xpY1RlbnNvcnxTeW1ib2xpY1RlbnNvcltdLFxuICAgICAga3dhcmdzPzogS3dhcmdzKTogVGVuc29yfFRlbnNvcltdfFN5bWJvbGljVGVuc29yIHtcbiAgICB0aHJvdyBuZXcgVmFsdWVFcnJvcihcbiAgICAgICAgJ0Nhbm5vdCBwYXNzIGFueSBpbnB1dCB0byBhbiAnICtcbiAgICAgICAgYElucHV0TGF5ZXIncyBhcHBseSgpIG1ldGhvZC4gSW5wdXRMYXllciBuYW1lOiAke3RoaXMubmFtZX1gKTtcbiAgfVxuXG4gIGRpc3Bvc2UoKTogRGlzcG9zZVJlc3VsdCB7XG4gICAgLy8gZGlzcG9zZSgpIGZvciBJbnB1dExheWVyIGlzIG92ZXJyaWRkZW4gYXMgbm8tb3AuXG4gICAgcmV0dXJuIHtyZWZDb3VudEFmdGVyRGlzcG9zZTogdGhpcy5fcmVmQ291bnQsIG51bURpc3Bvc2VkVmFyaWFibGVzOiAwfTtcbiAgfVxuXG4gIGdldENvbmZpZygpOiBzZXJpYWxpemF0aW9uLkNvbmZpZ0RpY3Qge1xuICAgIHJldHVybiB7XG4gICAgICBiYXRjaElucHV0U2hhcGU6IHRoaXMuYmF0Y2hJbnB1dFNoYXBlLFxuICAgICAgZHR5cGU6IHRoaXMuZHR5cGUsXG4gICAgICBzcGFyc2U6IHRoaXMuc3BhcnNlLFxuICAgICAgbmFtZTogdGhpcy5uYW1lXG4gICAgfTtcbiAgfVxufVxuc2VyaWFsaXphdGlvbi5yZWdpc3RlckNsYXNzKElucHV0TGF5ZXIpO1xuXG4vKipcbiAqIENvbmZpZyBmb3IgdGhlIElucHV0IGZ1bmN0aW9uLlxuICpcbiAqIE5vdGU6IFlvdSBzaG91bGQgcHJvdmlkZSBvbmx5IHNoYXBlIG9yIGJhdGNoU2hhcGUgKG5vdCBib3RoKS5cbiAqIElmIG9ubHkgc2hhcGUgaXMgcHJvdmlkZWQsIHRoZW4gdGhlIGJhdGNoU2hhcGUgYmVjb21lc1xuICogW251bGxdLmNvbmNhdChpbnB1dFNoYXBlKS5cbiAqL1xuZXhwb3J0IGludGVyZmFjZSBJbnB1dENvbmZpZyB7XG4gIC8qKlxuICAgKiBBIHNoYXBlLCBub3QgaW5jbHVkaW5nIHRoZSBiYXRjaCBzaXplLiBGb3IgaW5zdGFuY2UsIGBzaGFwZT1bMzJdYFxuICAgKiBpbmRpY2F0ZXMgdGhhdCB0aGUgZXhwZWN0ZWQgaW5wdXQgd2lsbCBiZSBiYXRjaGVzIG9mIDMyLWRpbWVuc2lvbmFsXG4gICAqIHZlY3RvcnMuXG4gICAqL1xuICBzaGFwZT86IFNoYXBlO1xuICAvKipcbiAgICogQSBzaGFwZSB0dXBsZSAoaW50ZWdlciksIGluY2x1ZGluZyB0aGUgYmF0Y2ggc2l6ZS4gRm9yIGluc3RhbmNlLFxuICAgKiBgYmF0Y2hTaGFwZT1bMTAsIDMyXWAgaW5kaWNhdGVzIHRoYXQgdGhlIGV4cGVjdGVkIGlucHV0IHdpbGwgYmUgYmF0Y2hlcyBvZlxuICAgKiAxMCAzMi1kaW1lbnNpb25hbCB2ZWN0b3JzLiBgYmF0Y2hTaGFwZT1bbnVsbCwgMzJdYCBpbmRpY2F0ZXMgYmF0Y2hlcyBvZiBhblxuICAgKiBhcmJpdHJhcnkgbnVtYmVyIG9mIDMyLWRpbWVuc2lvbmFsIHZlY3RvcnMuXG4gICAqL1xuICBiYXRjaFNoYXBlPzogU2hhcGU7XG4gIC8qKlxuICAgKiBBbiBvcHRpb25hbCBuYW1lIHN0cmluZyBmb3IgdGhlIGxheWVyLiBTaG91bGQgYmUgdW5pcXVlIGluIGEgbW9kZWwgKGRvIG5vdFxuICAgKiByZXVzZSB0aGUgc2FtZSBuYW1lIHR3aWNlKS4gSXQgd2lsbCBiZSBhdXRvZ2VuZXJhdGVkIGlmIGl0IGlzbid0IHByb3ZpZGVkLlxuICAgKi9cbiAgbmFtZT86IHN0cmluZztcbiAgZHR5cGU/OiBEYXRhVHlwZTtcbiAgLyoqXG4gICAqIEEgYm9vbGVhbiBzcGVjaWZ5aW5nIHdoZXRoZXIgdGhlIHBsYWNlaG9sZGVyIHRvIGJlIGNyZWF0ZWQgaXMgc3BhcnNlLlxuICAgKi9cbiAgc3BhcnNlPzogYm9vbGVhbjtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIElucHV0KGNvbmZpZzogSW5wdXRDb25maWcpOiBTeW1ib2xpY1RlbnNvciB7XG4gIGlmIChjb25maWcuYmF0Y2hTaGFwZSA9PSBudWxsICYmIGNvbmZpZy5zaGFwZSA9PSBudWxsKSB7XG4gICAgdGhyb3cgbmV3IEVycm9yKFxuICAgICAgICAnUGxlYXNlIHByb3ZpZGUgdG8gSW5wdXQgZWl0aGVyIGEgYHNoYXBlYCcgK1xuICAgICAgICAnIG9yIGEgYGJhdGNoU2hhcGVgIGFyZ3VtZW50LiBOb3RlIHRoYXQgJyArXG4gICAgICAgICdgc2hhcGVgIGRvZXMgbm90IGluY2x1ZGUgdGhlIGJhdGNoICcgK1xuICAgICAgICAnZGltZW5zaW9uLicpO1xuICB9XG4gIGlmIChjb25maWcuYmF0Y2hTaGFwZSAhPSBudWxsICYmIGNvbmZpZy5zaGFwZSAhPSBudWxsKSB7XG4gICAgLy8gVE9ETyhtaWNoYWVsdGVycnkpOiBCYWNrcG9ydCB0byBQeUtlcmFzLlxuICAgIHRocm93IG5ldyBWYWx1ZUVycm9yKFxuICAgICAgICAnUGxlYXNlIHByb3ZpZGUgZWl0aGVyIGEgYHNoYXBlYCBvciBgYmF0Y2hTaGFwZWAgJyArXG4gICAgICAgICdhcmd1bWVudCB0byBJbnB1dCwgYnV0IG5vdCBib3RoLicpO1xuICB9XG4gIGxldCBiYXRjaFNoYXBlID0gY29uZmlnLmJhdGNoU2hhcGU7XG4gIGlmIChjb25maWcuc2hhcGUgIT0gbnVsbCAmJiBiYXRjaFNoYXBlID09IG51bGwpIHtcbiAgICBiYXRjaFNoYXBlID0gW251bGxdLmNvbmNhdChjb25maWcuc2hhcGUpO1xuICB9XG5cbiAgbGV0IGR0eXBlID0gY29uZmlnLmR0eXBlO1xuICBpZiAoZHR5cGUgPT0gbnVsbCkge1xuICAgIGR0eXBlID0gJ2Zsb2F0MzInO1xuICB9XG5cbiAgY29uc3QgaW5wdXRMYXllciA9IG5ldyBJbnB1dExheWVyKHtcbiAgICBiYXRjaElucHV0U2hhcGU6IGJhdGNoU2hhcGUsXG4gICAgbmFtZTogY29uZmlnLm5hbWUsXG4gICAgZHR5cGUsXG4gICAgc3BhcnNlOiBjb25maWcuc3BhcnNlXG4gIH0pO1xuXG4gIGNvbnN0IG91dHB1dHMgPSBpbnB1dExheWVyLmluYm91bmROb2Rlc1swXS5vdXRwdXRUZW5zb3JzO1xuICByZXR1cm4gb3V0cHV0c1swXTtcbn1cbiJdfQ==","/**\n * @license\n * Copyright 2018 Google LLC\n *\n * Use of this source code is governed by an MIT-style\n * license that can be found in the LICENSE file or at\n * https://opensource.org/licenses/MIT.\n * =============================================================================\n */\n/**\n * Executor: Evaluates SymbolicTensor based on feeds.\n */\nimport { cast, dispose, memory, util } from '@tensorflow/tfjs-core';\nimport { ValueError } from '../errors';\nimport { LruCache } from '../utils/executor_utils';\nimport { toList } from '../utils/generic_utils';\nimport { InputLayer } from './input_layer';\nimport { SymbolicTensor } from './topology';\n/**\n * Helper function to check the dtype and shape compatibility of a feed value.\n */\nfunction assertFeedCompatibility(key, val) {\n // Check dtype compatibility.\n if (key.dtype == null || key.dtype === val.dtype) {\n // a. If types match, return val tensor as is.\n return val;\n }\n try {\n // b. Attempt to convert to expected type.\n return cast(val, key.dtype);\n }\n catch (err) {\n // c. If conversion fails, return helpful error.\n throw new ValueError(`The dtype of the feed (${val.dtype}) can not be cast to the dtype ` +\n `of the key '${key.name}' (${key.dtype}).`);\n }\n}\n/**\n * FeedDict: A mapping from unique SymbolicTensors to feed values for them.\n * A feed value is a concrete value represented as an `Tensor`.\n */\nexport class FeedDict {\n /**\n * Constructor, optionally does copy-construction.\n * @param feeds An Array of `Feed`s, or another `FeedDict`, in which case\n * copy-construction will be performed.\n */\n constructor(feeds) {\n this.id2Value = {};\n this.id2Mask = {};\n this.name2Id = {};\n if (feeds instanceof FeedDict) {\n for (const id in feeds.id2Value) {\n this.id2Value[id] = feeds.id2Value[id];\n if (id in feeds.id2Mask) {\n this.id2Mask[id] = feeds.id2Mask[id];\n }\n }\n }\n else {\n if (feeds == null) {\n return;\n }\n for (const feed of feeds) {\n this.add(feed.key, feed.value);\n }\n }\n }\n /**\n * Add a key-value pair to the FeedDict.\n *\n * @param key The key of the feed.\n * @param value The value of the tensor feed.\n * @param mask The value of the mask feed (optional).\n * @returns This `FeedDict`.\n * @throws ValueError: If the key `SymbolicTensor` already exists in the\n * `FeedDict`.\n */\n add(key, value, mask) {\n if (this.id2Value[key.id] == null) {\n this.id2Value[key.id] = assertFeedCompatibility(key, value);\n this.name2Id[key.name] = key.id;\n if (mask != null) {\n this.id2Mask[key.id] = mask;\n }\n }\n else {\n throw new ValueError(`Duplicate key: name=${key.name}, id=${key.id}`);\n }\n return this;\n }\n /**\n * Add a Feed to the FeedDict.\n * @param feed The new `Feed` to add.\n * @returns This `FeedDict`.\n */\n addFeed(feed) {\n this.add(feed.key, feed.value);\n }\n /**\n * Probe whether a key already exists in the FeedDict.\n * @param key\n */\n hasKey(key) {\n return this.id2Value[key.id] != null;\n }\n /**\n * Get all the SymbolicTensor available in this FeedDict.\n */\n names() {\n return Object.keys(this.name2Id);\n }\n /**\n * Get the feed value for given key.\n * @param key The SymbolicTensor, or its name (as a string), of which the\n * value is sought.\n * @returns If `key` exists, the corresponding feed value.\n * @throws ValueError: If `key` does not exist in this `FeedDict`.\n */\n getValue(key) {\n if (key instanceof SymbolicTensor) {\n if (this.id2Value[key.id] == null) {\n throw new ValueError(`Nonexistent key: ${key.name}`);\n }\n else {\n return this.id2Value[key.id];\n }\n }\n else {\n const id = this.name2Id[key];\n if (id == null) {\n throw new ValueError(`Feed dict has no SymbolicTensor name: ${key}`);\n }\n return this.id2Value[id];\n }\n }\n /**\n * Get the feed mask for given key.\n * @param key The SymbolicTensor, or its name (as a string), of which the\n * value is sought.\n * @returns If `key` exists, the corresponding feed mask.\n * @throws ValueError: If `key` does not exist in this `FeedDict`.\n */\n getMask(key) {\n if (key instanceof SymbolicTensor) {\n if (this.id2Value[key.id] == null) {\n throw new ValueError(`Nonexistent key: ${key.name}`);\n }\n else {\n return this.id2Mask[key.id];\n }\n }\n else {\n const id = this.name2Id[key];\n if (id == null) {\n throw new ValueError(`Feed dict has no SymbolicTensor name: ${key}`);\n }\n return this.id2Mask[id];\n }\n }\n /** Dispose all mask Tensors held by this object. */\n disposeMasks() {\n if (this.id2Mask != null) {\n dispose(this.id2Mask);\n }\n }\n}\n// Cache for topologically sorted SymbolicTensors for given execution\n// targets (i.e., fetches).\nexport const cachedSorted = new LruCache();\n// Cache for recipient count maps for given execution targets (i.e., fetches).\nexport const cachedRecipientCounts = new LruCache();\nexport function updateCacheMaxEntries(maxEntries) {\n if (cachedSorted != null) {\n cachedSorted.setMaxEntries(maxEntries);\n }\n if (cachedRecipientCounts != null) {\n cachedRecipientCounts.setMaxEntries(maxEntries);\n }\n}\n/**\n * Execute a SymbolicTensor by using concrete feed values.\n *\n * A `SymbolicTensor` object is a node in a computation graph of TF.js\n * Layers. The object is backed by a source layer and input\n * `SymbolicTensor`s to the source layer. This method evaluates\n * the `call()` method of the source layer, using concrete values of the\n * inputs obtained from either\n * * `feedDict`, if the input key exists in `feedDict`, or else,\n * * a recursive call to `execute()` itself.\n *\n * @param x: The `SymbolicTensor` to execute.\n * @param feedDict: The feed values, as base condition of the recursion.\n * execution.\n * @param kwargs: Optional keyword arguments.\n * @param probe: A probe object (of interface `ExecutionProbe`) used for\n * testing memory footprint of `execute` calls.\n * @returns Result of the execution.\n * @throws ValueError: If any `SymbolicTensor`s from `InputLayer`s\n * encountered during the execution lacks a feed value in `feedDict`.\n */\nexport function execute(fetches, feedDict, kwargs, probe) {\n const training = kwargs == null ? false : kwargs['training'];\n const arrayFetches = Array.isArray(fetches);\n const fetchArray = arrayFetches ? fetches : [fetches];\n const outputNames = fetchArray.map(t => t.name);\n const finalOutputs = [];\n const feedNames = feedDict.names();\n for (const outputName of outputNames) {\n if (feedNames.indexOf(outputName) !== -1) {\n finalOutputs.push(feedDict.getValue(outputName));\n }\n else {\n finalOutputs.push(null);\n }\n }\n if (probe != null) {\n // For optional probing of memory footprint during execution.\n probe.maxNumTensors = -Infinity;\n probe.minNumTensors = Infinity;\n }\n // Check cache.\n const fetchAndFeedKey = outputNames.join(',') + '|' + feedDict.names().sort().join(',');\n let sorted = cachedSorted.get(fetchAndFeedKey);\n let recipientCounts;\n if (sorted == null) {\n // Cache doesn't contain the desired combination of fetches. Compute\n // topological sort for the combination for the first time.\n const out = getTopologicalSortAndRecipientCounts(fetchArray, feedDict);\n sorted = out.sorted;\n recipientCounts = out.recipientCounts;\n // Store results in cache for future use.\n cachedSorted.put(fetchAndFeedKey, sorted);\n cachedRecipientCounts.put(fetchAndFeedKey, recipientCounts);\n }\n recipientCounts = {};\n if (!training) {\n Object.assign(recipientCounts, cachedRecipientCounts.get(fetchAndFeedKey));\n }\n const internalFeedDict = new FeedDict(feedDict);\n // Start iterative execution on the topologically-sorted SymbolicTensors.\n for (let i = 0; i < sorted.length; ++i) {\n if (probe != null) {\n // For optional probing of memory usage during execution.\n const numTensors = memory().numTensors;\n if (numTensors > probe.maxNumTensors) {\n probe.maxNumTensors = numTensors;\n }\n if (numTensors < probe.minNumTensors) {\n probe.minNumTensors = numTensors;\n }\n }\n const symbolic = sorted[i];\n const srcLayer = symbolic.sourceLayer;\n if (srcLayer instanceof InputLayer) {\n continue;\n }\n const inputValues = [];\n const inputMasks = [];\n const tensorsToDispose = [];\n let maskExists = false;\n for (const input of symbolic.inputs) {\n const value = internalFeedDict.getValue(input);\n const mask = internalFeedDict.getMask(input);\n inputValues.push(value);\n inputMasks.push(mask);\n if (mask != null) {\n maskExists = true;\n }\n if (!training) {\n recipientCounts[input.name]--;\n if (recipientCounts[input.name] === 0 && !feedDict.hasKey(input) &&\n outputNames.indexOf(input.name) === -1 && !value.isDisposed &&\n input.sourceLayer.stateful !== true) {\n tensorsToDispose.push(value);\n }\n }\n }\n if (maskExists) {\n kwargs = kwargs || {};\n kwargs['mask'] = inputMasks[0];\n }\n const outputTensors = toList(srcLayer.apply(inputValues, kwargs));\n let outputMask = null;\n if (srcLayer.supportsMasking) {\n outputMask = srcLayer.computeMask(inputValues, inputMasks);\n }\n const layerOutputs = getNodeOutputs(symbolic);\n const outputSymbolicTensors = Array.isArray(layerOutputs) ? layerOutputs : [layerOutputs];\n for (let i = 0; i < outputSymbolicTensors.length; ++i) {\n if (!internalFeedDict.hasKey(outputSymbolicTensors[i])) {\n internalFeedDict.add(outputSymbolicTensors[i], outputTensors[i], Array.isArray(outputMask) ? outputMask[0] : outputMask);\n }\n const index = outputNames.indexOf(outputSymbolicTensors[i].name);\n if (index !== -1) {\n finalOutputs[index] = outputTensors[i];\n }\n }\n if (!training) {\n // Clean up Tensors that are no longer needed.\n dispose(tensorsToDispose);\n }\n }\n // NOTE(cais): Unlike intermediate tensors, we don't discard mask\n // tensors as we go, because these tensors are sometimes passed over a\n // series of mutliple layers, i.e., not obeying the immediate input\n // relations in the graph. If this becomes a memory-usage concern,\n // we can improve this in the future.\n internalFeedDict.disposeMasks();\n return arrayFetches ? finalOutputs : finalOutputs[0];\n}\n/**\n * Sort the `SymbolicTensor`s topologically, for an array of fetches.\n *\n * This function calls getTopologicalSortAndRecipientCountsForOneFetch and\n * merges their results.\n *\n * @param fetch The array of fetches requested. Must be a non-empty array.\n * @param feedDict The dictionary of fed values.\n * @returns sorted: Topologically-sorted array of SymbolicTensors.\n * recipientCounts: Recipient counts for all SymbolicTensors in `sorted`.\n */\nfunction getTopologicalSortAndRecipientCounts(fetches, feedDict) {\n util.assert(fetches != null && fetches.length > 0, () => `Expected at least one fetch, got none`);\n let finalSorted = [];\n let finalRecipientMap = {};\n if (fetches.length === 1) {\n // Special-casing 1 fetch for efficiency.\n const out = getTopologicalSortAndRecipientCountsForOneFetch(fetches[0], feedDict);\n finalSorted = out.sorted;\n finalRecipientMap = out.recipientMap;\n }\n else {\n const visited = new Set();\n for (const fetch of fetches) {\n const { sorted, recipientMap } = getTopologicalSortAndRecipientCountsForOneFetch(fetch, feedDict);\n // Merge sorted SymbolicTensor Arrays.\n for (const symbolicTensor of sorted) {\n if (!visited.has(symbolicTensor.name)) {\n finalSorted.push(symbolicTensor);\n visited.add(symbolicTensor.name);\n }\n }\n // Merge recipient maps.\n for (const name in recipientMap) {\n if (finalRecipientMap[name] == null) {\n finalRecipientMap[name] = new Set();\n }\n recipientMap[name].forEach(recipient => finalRecipientMap[name].add(recipient));\n }\n }\n }\n return {\n sorted: finalSorted,\n recipientCounts: recipientMap2Counts(finalRecipientMap)\n };\n}\nfunction recipientMap2Counts(recipientMap) {\n const recipientCounts = {};\n for (const name in recipientMap) {\n recipientCounts[name] = recipientMap[name].size;\n }\n return recipientCounts;\n}\n/**\n * Sort the `SymbolicTensor`s topologically, for a single fetch.\n *\n * This helper function processes the upstream SymbolicTensors of a single\n * fetch.\n *\n * @param fetch The single fetch requested.\n * @param feedDict The dictionary of fed values.\n * @returns sorted: Topologically-sorted array of SymbolicTensors.\n * recipientMap: Recipient names for all SymbolicTensors in `sorted`.\n */\nexport function getTopologicalSortAndRecipientCountsForOneFetch(fetch, feedDict) {\n const visited = new Set();\n const sorted = [];\n const recipientMap = {};\n // Put keys of the feedDict into visited first, so they don't have to be\n // walked. This is needed in case where there are feeds for intermediate\n // SymbolicTensors of the graph.\n for (const key of feedDict.names()) {\n visited.add(key);\n }\n const stack = [];\n const marks = [];\n // Initial population of stack and marks.\n stack.push(fetch);\n while (stack.length > 0) {\n const top = stack[stack.length - 1];\n if (visited.has(top.name)) {\n stack.pop();\n continue;\n }\n const topIsMarked = marks[marks.length - 1] === stack.length - 1;\n if (top.inputs.length === 0 || topIsMarked) {\n // Input SymbolicTensor or all children have been visited.\n stack.pop();\n sorted.push(top);\n visited.add(top.name);\n if (topIsMarked) {\n marks.pop();\n }\n }\n else {\n // A non-input SymbolicTensor whose upstream SymbolicTensors haven't\n // been visited yet. Push them onto the stack.\n marks.push(stack.length - 1);\n for (const input of top.inputs) {\n // Increment the recipient count. Note that this needs to happen\n // regardless of whether the SymbolicTensor has been visited before.\n if (recipientMap[input.name] == null) {\n recipientMap[input.name] = new Set();\n }\n recipientMap[input.name].add(top.name);\n if (visited.has(input.name)) {\n continue; // Avoid repeated visits to the same SymbolicTensor.\n }\n stack.push(input);\n }\n }\n }\n return { sorted, recipientMap };\n}\n/**\n * Get the symbolic output tensors of the node to which a given fetch belongs.\n * @param fetch The fetched symbolic tensor.\n * @returns The Array of symbolic tensors output by the node to which `fetch`\n * belongs.\n */\nfunction getNodeOutputs(fetch) {\n let layerOutputs;\n if (fetch.sourceLayer.inboundNodes.length === 1) {\n layerOutputs = fetch.sourceLayer.output;\n }\n else {\n let nodeIndex = null;\n for (let i = 0; i < fetch.sourceLayer.inboundNodes.length; ++i) {\n for (const outputTensor of fetch.sourceLayer.inboundNodes[i]\n .outputTensors) {\n if (outputTensor.id === fetch.id) {\n nodeIndex = i;\n break;\n }\n }\n }\n layerOutputs = fetch.sourceLayer.getOutputAt(nodeIndex);\n }\n return layerOutputs;\n}\n//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZXhlY3V0b3IuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi8uLi90ZmpzLWxheWVycy9zcmMvZW5naW5lL2V4ZWN1dG9yLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBOzs7Ozs7OztHQVFHO0FBRUg7O0dBRUc7QUFFSCxPQUFPLEVBQUMsSUFBSSxFQUFFLE9BQU8sRUFBRSxNQUFNLEVBQVUsSUFBSSxFQUFDLE1BQU0sdUJBQXVCLENBQUM7QUFFMUUsT0FBTyxFQUFDLFVBQVUsRUFBQyxNQUFNLFdBQVcsQ0FBQztBQUVyQyxPQUFPLEVBQUMsUUFBUSxFQUFDLE1BQU0seUJBQXlCLENBQUM7QUFDakQsT0FBTyxFQUFDLE1BQU0sRUFBQyxNQUFNLHdCQUF3QixDQUFDO0FBRTlDLE9BQU8sRUFBQyxVQUFVLEVBQUMsTUFBTSxlQUFlLENBQUM7QUFDekMsT0FBTyxFQUFDLGNBQWMsRUFBQyxNQUFNLFlBQVksQ0FBQztBQUUxQzs7R0FFRztBQUNILFNBQVMsdUJBQXVCLENBQUMsR0FBbUIsRUFBRSxHQUFXO0lBQy9ELDZCQUE2QjtJQUM3QixJQUFJLEdBQUcsQ0FBQyxLQUFLLElBQUksSUFBSSxJQUFJLEdBQUcsQ0FBQyxLQUFLLEtBQUssR0FBRyxDQUFDLEtBQUssRUFBRTtRQUNoRCxnREFBZ0Q7UUFDaEQsT0FBTyxHQUFHLENBQUM7S0FDWjtJQUNELElBQUk7UUFDRiwyQ0FBMkM7UUFDM0MsT0FBTyxJQUFJLENBQUMsR0FBRyxFQUFFLEdBQUcsQ0FBQyxLQUFLLENBQUMsQ0FBQztLQUM3QjtJQUFDLE9BQU8sR0FBRyxFQUFFO1FBQ1osaURBQWlEO1FBQ2pELE1BQU0sSUFBSSxVQUFVLENBQ2hCLDBCQUEwQixHQUFHLENBQUMsS0FBSyxpQ0FBaUM7WUFDcEUsZUFBZSxHQUFHLENBQUMsSUFBSSxNQUFNLEdBQUcsQ0FBQyxLQUFLLElBQUksQ0FBQyxDQUFDO0tBQ2pEO0FBQ0gsQ0FBQztBQVVEOzs7R0FHRztBQUNILE1B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WSxFQUFDLENBQUM7QUFDaEMsQ0FBQztBQUVEOzs7OztHQUtHO0FBQ0gsU0FBUyxjQUFjLENBQUMsS0FBcUI7SUFFM0MsSUFBSSxZQUE2QyxDQUFDO0lBQ2xELElBQUksS0FBSyxDQUFDLFdBQVcsQ0FBQyxZQUFZLENBQUMsTUFBTSxLQUFLLENBQUMsRUFBRTtRQUMvQyxZQUFZLEdBQUcsS0FBSyxDQUFDLFdBQVcsQ0FBQyxNQUFNLENBQUM7S0FDekM7U0FBTTtRQUNMLElBQUksU0FBUyxHQUFXLElBQUksQ0FBQztRQUM3QixLQUFLLElBQUksQ0FBQyxHQUFHLENBQUMsRUFBRSxDQUFDLEdBQUcsS0FBSyxDQUFDLFdBQVcsQ0FBQyxZQUFZLENBQUMsTUFBTSxFQUFFLEVBQUUsQ0FBQyxFQUFFO1lBQzlELEtBQUssTUFBTSxZQUFZLElBQUksS0FBSyxDQUFDLFdBQVcsQ0FBQyxZQUFZLENBQUMsQ0FBQyxDQUFDO2lCQUNsRCxhQUFhLEVBQUU7Z0JBQ3ZCLElBQUksWUFBWSxDQUFDLEVBQUUsS0FBSyxLQUFLLENBQUMsRUFBRSxFQUFFO29CQUNoQyxTQUFTLEdBQUcsQ0FBQyxDQUFDO29CQUNkLE1BQU07aUJBQ1A7YUFDRjtTQUNGO1FBQ0QsWUFBWSxHQUFHLEtBQUssQ0FBQyxXQUFXLENBQUMsV0FBVyxDQUFDLFNBQVMsQ0FBQyxDQUFDO0tBQ3pEO0lBQ0QsT0FBTyxZQUFZLENBQUM7QUFDdEIsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbIi8qKlxuICogQGxpY2Vuc2VcbiAqIENvcHlyaWdodCAyMDE4IEdvb2dsZSBMTENcbiAqXG4gKiBVc2Ugb2YgdGhpcyBzb3VyY2UgY29kZSBpcyBnb3Zlcm5lZCBieSBhbiBNSVQtc3R5bGVcbiAqIGxpY2Vuc2UgdGhhdCBjYW4gYmUgZm91bmQgaW4gdGhlIExJQ0VOU0UgZmlsZSBvciBhdFxuICogaHR0cHM6Ly9vcGVuc291cmNlLm9yZy9saWNlbnNlcy9NSVQuXG4gKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuICovXG5cbi8qKlxuICogRXhlY3V0b3I6IEV2YWx1YXRlcyBTeW1ib2xpY1RlbnNvciBiYXNlZCBvbiBmZWVkcy5cbiAqL1xuXG5pbXBvcnQge2Nhc3QsIGRpc3Bvc2UsIG1lbW9yeSwgVGVuc29yLCB1dGlsfSBmcm9tICdAdGVuc29yZmxvdy90ZmpzLWNvcmUnO1xuXG5pbXBvcnQge1ZhbHVlRXJyb3J9IGZyb20gJy4uL2Vycm9ycyc7XG5pbXBvcnQge0t3YXJnc30gZnJvbSAnLi4vdHlwZXMnO1xuaW1wb3J0IHtMcnVDYWNoZX0gZnJvbSAnLi4vdXRpbHMvZXhlY3V0b3JfdXRpbHMnO1xuaW1wb3J0IHt0b0xpc3R9IGZyb20gJy4uL3V0aWxzL2dlbmVyaWNfdXRpbHMnO1xuXG5pbXBvcnQge0lucHV0TGF5ZXJ9IGZyb20gJy4vaW5wdXRfbGF5ZXInO1xuaW1wb3J0IHtTeW1ib2xpY1RlbnNvcn0gZnJvbSAnLi90b3BvbG9neSc7XG5cbi8qKlxuICogSGVscGVyIGZ1bmN0aW9uIHRvIGNoZWNrIHRoZSBkdHlwZSBhbmQgc2hhcGUgY29tcGF0aWJpbGl0eSBvZiBhIGZlZWQgdmFsdWUuXG4gKi9cbmZ1bmN0aW9uIGFzc2VydEZlZWRDb21wYXRpYmlsaXR5KGtleTogU3ltYm9saWNUZW5zb3IsIHZhbDogVGVuc29yKTogVGVuc29yIHtcbiAgLy8gQ2hlY2sgZHR5cGUgY29tcGF0aWJpbGl0eS5cbiAgaWYgKGtleS5kdHlwZSA9PSBudWxsIHx8IGtleS5kdHlwZSA9PT0gdmFsLmR0eXBlKSB7XG4gICAgLy8gIGEuICBJZiB0eXBlcyBtYXRjaCwgcmV0dXJuIHZhbCB0ZW5zb3IgYXMgaXMuXG4gICAgcmV0dXJuIHZhbDtcbiAgfVxuICB0cnkge1xuICAgIC8vICBiLiBBdHRlbXB0IHRvIGNvbnZlcnQgdG8gZXhwZWN0ZWQgdHlwZS5cbiAgICByZXR1cm4gY2FzdCh2YWwsIGtleS5kdHlwZSk7XG4gIH0gY2F0Y2ggKGVycikge1xuICAgIC8vICBjLiBJZiBjb252ZXJzaW9uIGZhaWxzLCByZXR1cm4gaGVscGZ1bCBlcnJvci5cbiAgICB0aHJvdyBuZXcgVmFsdWVFcnJvcihcbiAgICAgICAgYFRoZSBkdHlwZSBvZiB0aGUgZmVlZCAoJHt2YWwuZHR5cGV9KSBjYW4gbm90IGJlIGNhc3QgdG8gdGhlIGR0eXBlIGAgK1xuICAgICAgICBgb2YgdGhlIGtleSAnJHtrZXkubmFtZX0nICgke2tleS5kdHlwZX0pLmApO1xuICB9XG59XG5cbi8qKlxuICogQSBjb25jcmV0ZSBUZW5zb3IgdmFsdWUgZm9yIGEgc3ltYm9saWMgdGVuc29yIGFzIHRoZSBrZXkuXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgRmVlZCB7XG4gIGtleTogU3ltYm9saWNUZW5zb3I7XG4gIHZhbHVlOiBUZW5zb3I7XG59XG5cbi8qKlxuICogRmVlZERpY3Q6IEEgbWFwcGluZyBmcm9tIHVuaXF1ZSBTeW1ib2xpY1RlbnNvcnMgdG8gZmVlZCB2YWx1ZXMgZm9yIHRoZW0uXG4gKiBBIGZlZWQgdmFsdWUgaXMgYSBjb25jcmV0ZSB2YWx1ZSByZXByZXNlbnRlZCBhcyBhbiBgVGVuc29yYC5cbiAqL1xuZXhwb3J0IGNsYXNzIEZlZWREaWN0IHtcbiAgcHJpdmF0ZSBpZDJWYWx1ZToge1tpZDogbnVtYmVyXTogVGVuc29yfSA9IHt9O1xuICBwcml2YXRlIGlkMk1hc2s6IHtbaWQ6IG51bWJlcl06IFRlbnNvcn0gPSB7fTtcbiAgcHJpdmF0ZSBuYW1lMklkOiB7W25hbWU6IHN0cmluZ106IG51bWJlcn0gPSB7fTtcblxuICAvKipcbiAgICogQ29uc3RydWN0b3IsIG9wdGlvbmFsbHkgZG9lcyBjb3B5LWNvbnN0cnVjdGlvbi5cbiAgICogQHBhcmFtIGZlZWRzIEFuIEFycmF5IG9mIGBGZWVkYHMsIG9yIGFub3RoZXIgYEZlZWREaWN0YCwgaW4gd2hpY2ggY2FzZVxuICAgKiAgIGNvcHktY29uc3RydWN0aW9uIHdpbGwgYmUgcGVyZm9ybWVkLlxuICAgKi9cbiAgY29uc3RydWN0b3IoZmVlZHM/OiBGZWVkW118RmVlZERpY3QpIHtcbiAgICBpZiAoZmVlZHMgaW5zdGFuY2VvZiBGZWVkRGljdCkge1xuICAgICAgZm9yIChjb25zdCBpZCBpbiBmZWVkcy5pZDJWYWx1ZSkge1xuICAgICAgICB0aGlzLmlkMlZhbHVlW2lkXSA9IGZlZWRzLmlkMlZhbHVlW2lkXTtcbiAgICAgICAgaWYgKGlkIGluIGZlZWRzLmlkMk1hc2spIHtcbiAgICAgICAgICB0aGlzLmlkMk1hc2tbaWRdID0gZmVlZHMuaWQyTWFza1tpZF07XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9IGVsc2Uge1xuICAgICAgaWYgKGZlZWRzID09IG51bGwpIHtcbiAgICAgICAgcmV0dXJuO1xuICAgICAgfVxuICAgICAgZm9yIChjb25zdCBmZWVkIG9mIGZlZWRzKSB7XG4gICAgICAgIHRoaXMuYWRkKGZlZWQua2V5LCBmZWVkLnZhbHVlKTtcbiAgICAgIH1cbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogQWRkIGEga2V5LXZhbHVlIHBhaXIgdG8gdGhlIEZlZWREaWN0LlxuICAgKlxuICAgKiBAcGFyYW0ga2V5IFRoZSBrZXkgb2YgdGhlIGZlZWQuXG4gICAqIEBwYXJhbSB2YWx1ZSBUaGUgdmFsdWUgb2YgdGhlIHRlbnNvciBmZWVkLlxuICAgKiBAcGFyYW0gbWFzayBUaGUgdmFsdWUgb2YgdGhlIG1hc2sgZmVlZCAob3B0aW9uYWwpLlxuICAgKiBAcmV0dXJucyBUaGlzIGBGZWVkRGljdGAuXG4gICAqIEB0aHJvd3MgVmFsdWVFcnJvcjogSWYgdGhlIGtleSBgU3ltYm9saWNUZW5zb3JgIGFscmVhZHkgZXhpc3RzIGluIHRoZVxuICAgKiAgIGBGZWVkRGljdGAuXG4gICAqL1xuICBhZGQoa2V5OiBTeW1ib2xpY1RlbnNvciwgdmFsdWU6IFRlbnNvciwgbWFzaz86IFRlbnNvcik6IEZlZWREaWN0IHtcbiAgICBpZiAodGhpcy5pZDJWYWx1ZVtrZXkuaWRdID09IG51bGwpIHtcbiAgICAgIHRoaXMuaWQyVmFsdWVba2V5LmlkXSA9IGFzc2VydEZlZWRDb21wYXRpYmlsaXR5KGtleSwgdmFsdWUpO1xuICAgICAgdGhpcy5uYW1lMklkW2tleS5uYW1lXSA9IGtleS5pZDtcbiAgICAgIGlmIChtYXNrICE9IG51bGwpIHtcbiAgICAgICAgdGhpcy5pZDJNYXNrW2tleS5pZF0gPSBtYXNrO1xuICAgICAgfVxuICAgIH0gZWxzZSB7XG4gICAgICB0aHJvdyBuZXcgVmFsdWVFcnJvcihgRHVwbGljYXRlIGtleTogbmFtZT0ke2tleS5uYW1lfSwgaWQ9JHtrZXkuaWR9YCk7XG4gICAgfVxuICAgIHJldHVybiB0aGlzO1xuICB9XG5cbiAgLyoqXG4gICAqIEFkZCBhIEZlZWQgdG8gdGhlIEZlZWREaWN0LlxuICAgKiBAcGFyYW0gZmVlZCBUaGUgbmV3IGBGZWVkYCB0byBhZGQuXG4gICAqIEByZXR1cm5zIFRoaXMgYEZlZWREaWN0YC5cbiAgICovXG4gIGFkZEZlZWQoZmVlZDogRmVlZCkge1xuICAgIHRoaXMuYWRkKGZlZWQua2V5LCBmZWVkLnZhbHVlKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBQcm9iZSB3aGV0aGVyIGEga2V5IGFscmVhZHkgZXhpc3RzIGluIHRoZSBGZWVkRGljdC5cbiAgICogQHBhcmFtIGtleVxuICAgKi9cbiAgaGFzS2V5KGtleTogU3ltYm9saWNUZW5zb3IpOiBib29sZWFuIHtcbiAgICByZXR1cm4gdGhpcy5pZDJWYWx1ZVtrZXkuaWRdICE9IG51bGw7XG4gIH1cblxuICAvKipcbiAgICogR2V0IGFsbCB0aGUgU3ltYm9saWNUZW5zb3IgYXZhaWxhYmxlIGluIHRoaXMgRmVlZERpY3QuXG4gICAqL1xuICBuYW1lcygpOiBzdHJpbmdbXSB7XG4gICAgcmV0dXJuIE9iamVjdC5rZXlzKHRoaXMubmFtZTJJZCk7XG4gIH1cblxuICAvKipcbiAgICogR2V0IHRoZSBmZWVkIHZhbHVlIGZvciBnaXZlbiBrZXkuXG4gICAqIEBwYXJhbSBrZXkgVGhlIFN5bWJvbGljVGVuc29yLCBvciBpdHMgbmFtZSAoYXMgYSBzdHJpbmcpLCBvZiB3aGljaCB0aGVcbiAgICogICAgIHZhbHVlIGlzIHNvdWdodC5cbiAgICogQHJldHVybnMgSWYgYGtleWAgZXhpc3RzLCB0aGUgY29ycmVzcG9uZGluZyBmZWVkIHZhbHVlLlxuICAgKiBAdGhyb3dzIFZhbHVlRXJyb3I6IElmIGBrZXlgIGRvZXMgbm90IGV4aXN0IGluIHRoaXMgYEZlZWREaWN0YC5cbiAgICovXG4gIGdldFZhbHVlKGtleTogU3ltYm9saWNUZW5zb3J8c3RyaW5nKTogVGVuc29yIHtcbiAgICBpZiAoa2V5IGluc3RhbmNlb2YgU3ltYm9saWNUZW5zb3IpIHtcbiAgICAgIGlmICh0aGlzLmlkMlZhbHVlW2tleS5pZF0gPT0gbnVsbCkge1xuICAgICAgICB0aHJvdyBuZXcgVmFsdWVFcnJvcihgTm9uZXhpc3RlbnQga2V5OiAke2tleS5uYW1lfWApO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuaWQyVmFsdWVba2V5LmlkXTtcbiAgICAgIH1cbiAgICB9IGVsc2Uge1xuICAgICAgY29uc3QgaWQgPSB0aGlzLm5hbWUySWRba2V5XTtcbiAgICAgIGlmIChpZCA9PSBudWxsKSB7XG4gICAgICAgIHRocm93IG5ldyBWYWx1ZUVycm9yKGBGZWVkIGRpY3QgaGFzIG5vIFN5bWJvbGljVGVuc29yIG5hbWU6ICR7a2V5fWApO1xuICAgICAgfVxuICAgICAgcmV0dXJuIHRoaXMuaWQyVmFsdWVbaWRdO1xuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBHZXQgdGhlIGZlZWQgbWFzayBmb3IgZ2l2ZW4ga2V5LlxuICAgKiBAcGFyYW0ga2V5IFRoZSBTeW1ib2xpY1RlbnNvciwgb3IgaXRzIG5hbWUgKGFzIGEgc3RyaW5nKSwgb2Ygd2hpY2ggdGhlXG4gICAqICAgICB2YWx1ZSBpcyBzb3VnaHQuXG4gICAqIEByZXR1cm5zIElmIGBrZXlgIGV4aXN0cywgdGhlIGNvcnJlc3BvbmRpbmcgZmVlZCBtYXNrLlxuICAgKiBAdGhyb3dzIFZhbHVlRXJyb3I6IElmIGBrZXlgIGRvZXMgbm90IGV4aXN0IGluIHRoaXMgYEZlZWREaWN0YC5cbiAgICovXG4gIGdldE1hc2soa2V5OiBTeW1ib2xpY1RlbnNvcnxzdHJpbmcpOiBUZW5zb3Ige1xuICAgIGlmIChrZXkgaW5zdGFuY2VvZiBTeW1ib2xpY1RlbnNvcikge1xuICAgICAgaWYgKHRoaXMuaWQyVmFsdWVba2V5LmlkXSA9PSBudWxsKSB7XG4gICAgICAgIHRocm93IG5ldyBWYWx1ZUVycm9yKGBOb25leGlzdGVudCBrZXk6ICR7a2V5Lm5hbWV9YCk7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICByZXR1cm4gdGhpcy5pZDJNYXNrW2tleS5pZF07XG4gICAgICB9XG4gICAgfSBlbHNlIHtcbiAgICAgIGNvbnN0IGlkID0gdGhpcy5uYW1lMklkW2tleV07XG4gICAgICBpZiAoaWQgPT0gbnVsbCkge1xuICAgICAgICB0aHJvdyBuZXcgVmFsdWVFcnJvcihgRmVlZCBkaWN0IGhhcyBubyBTeW1ib2xpY1RlbnNvciBuYW1lOiAke2tleX1gKTtcbiAgICAgIH1cbiAgICAgIHJldHVybiB0aGlzLmlkMk1hc2tbaWRdO1xuICAgIH1cbiAgfVxuXG4gIC8qKiBEaXNwb3NlIGFsbCBtYXNrIFRlbnNvcnMgaGVsZCBieSB0aGlzIG9iamVjdC4gKi9cbiAgZGlzcG9zZU1hc2tzKCkge1xuICAgIGlmICh0aGlzLmlkMk1hc2sgIT0gbnVsbCkge1xuICAgICAgZGlzcG9zZSh0aGlzLmlkMk1hc2spO1xuICAgIH1cbiAgfVxufVxuXG4vLyBDYWNoZSBmb3IgdG9wb2xvZ2ljYWxseSBzb3J0ZWQgU3ltYm9saWNUZW5zb3JzIGZvciBnaXZlbiBleGVjdXRpb25cbi8vIHRhcmdldHMgKGkuZS4sIGZldGNoZXMpLlxuZXhwb3J0IGNvbnN0IGNhY2hlZFNvcnRlZDogTHJ1Q2FjaGU8U3ltYm9saWNUZW5zb3JbXT4gPVxuICAgIG5ldyBMcnVDYWNoZTxTeW1ib2xpY1RlbnNvcltdPigpO1xuXG4vLyBDYWNoZSBmb3IgcmVjaXBpZW50IGNvdW50IG1hcHMgZm9yIGdpdmVuIGV4ZWN1dGlvbiB0YXJnZXRzIChpLmUuLCBmZXRjaGVzKS5cbmV4cG9ydCBjb25zdCBjYWNoZWRSZWNpcGllbnRDb3VudHM6IExydUNhY2hlPFJlY2lwaWVudENvdW50cz4gPVxuICAgIG5ldyBMcnVDYWNoZTxSZWNpcGllbnRDb3VudHM+KCk7XG5cbmV4cG9ydCBmdW5jdGlvbiB1cGRhdGVDYWNoZU1heEVudHJpZXMobWF4RW50cmllczogbnVtYmVyKSB7XG4gIGlmIChjYWNoZWRTb3J0ZWQgIT0gbnVsbCkge1xuICAgIGNhY2hlZFNvcnRlZC5zZXRNYXhFbnRyaWVzKG1heEVudHJpZXMpO1xuICB9XG4gIGlmIChjYWNoZWRSZWNpcGllbnRDb3VudHMgIT0gbnVsbCkge1xuICAgIGNhY2hlZFJlY2lwaWVudENvdW50cy5zZXRNYXhFbnRyaWVzKG1heEVudHJpZXMpO1xuICB9XG59XG5cbi8qKlxuICogSW50ZXJmYWNlIGZvciB0aGUgb3B0aW9uYWwgb2JqZWN0IHVzZWQgZm9yIHByb2JpbmcgdGhlIG1lbW9yeVxuICogdXNhZ2UgYW5kIG90aGVyIHN0YXRpc3RpY3MgZHVyaW5nIGV4ZWN1dGlvbi5cbiAqL1xuZXhwb3J0IGludGVyZmFjZSBFeGVjdXRpb25Qcm9iZSB7XG4gIC8qKlxuICAgKiBNYXhpbXVtIG51bWJlciBvZiB0ZW5zb3JzIHRoYXQgZXhpc3QgZHVyaW5nIGFsbCBzdGVwcyBvZiB0aGVcbiAgICogZXhlY3V0aW9uLiBUZW5zb3IgY291bnRzIGFyZSBtZWFzdXJlZCBhdCB0aGUgYmVnaW5uaW5nIG9mIGV2ZXJ5XG4gICAqIHN0ZXAuXG4gICAqL1xuICBtYXhOdW1UZW5zb3JzPzogbnVtYmVyO1xuXG4gIC8qKlxuICAgKiBNaW5pbXVtIG51bWJlciBvZiB0ZW5zb3JzIHRoYXQgZXhpc3QgZHVyaW5nIGFsbCBzdGVwcyBvZiB0aGVcbiAgICogZXhlY3V0aW9uLiBUZW5zb3IgY291bnRzIGFyZSBtZWFzdXJlZCBhdCB0aGUgYmVnaW5uaW5nIG9mIGV2ZXJ5XG4gICAqIHN0ZXAuXG4gICAqL1xuICBtaW5OdW1UZW5zb3JzPzogbnVtYmVyO1xufVxuXG4vKipcbiAqIEV4ZWN1dGUgYSBTeW1ib2xpY1RlbnNvciBieSB1c2luZyBjb25jcmV0ZSBmZWVkIHZhbHVlcy5cbiAqXG4gKiBBIGBTeW1ib2xpY1RlbnNvcmAgb2JqZWN0IGlzIGEgbm9kZSBpbiBhIGNvbXB1dGF0aW9uIGdyYXBoIG9mIFRGLmpzXG4gKiBMYXllcnMuIFRoZSBvYmplY3QgaXMgYmFja2VkIGJ5IGEgc291cmNlIGxheWVyIGFuZCBpbnB1dFxuICogYFN5bWJvbGljVGVuc29yYHMgdG8gdGhlIHNvdXJjZSBsYXllci4gVGhpcyBtZXRob2QgZXZhbHVhdGVzXG4gKiB0aGUgYGNhbGwoKWAgbWV0aG9kIG9mIHRoZSBzb3VyY2UgbGF5ZXIsIHVzaW5nIGNvbmNyZXRlIHZhbHVlcyBvZiB0aGVcbiAqIGlucHV0cyBvYnRhaW5lZCBmcm9tIGVpdGhlclxuICogKiBgZmVlZERpY3RgLCBpZiB0aGUgaW5wdXQga2V5IGV4aXN0cyBpbiBgZmVlZERpY3RgLCBvciBlbHNlLFxuICogKiBhIHJlY3Vyc2l2ZSBjYWxsIHRvIGBleGVjdXRlKClgIGl0c2VsZi5cbiAqXG4gKiBAcGFyYW0geDogVGhlIGBTeW1ib2xpY1RlbnNvcmAgdG8gZXhlY3V0ZS5cbiAqIEBwYXJhbSBmZWVkRGljdDogVGhlIGZlZWQgdmFsdWVzLCBhcyBiYXNlIGNvbmRpdGlvbiBvZiB0aGUgcmVjdXJzaW9uLlxuICogICBleGVjdXRpb24uXG4gKiBAcGFyYW0ga3dhcmdzOiBPcHRpb25hbCBrZXl3b3JkIGFyZ3VtZW50cy5cbiAqIEBwYXJhbSBwcm9iZTogQSBwcm9iZSBvYmplY3QgKG9mIGludGVyZmFjZSBgRXhlY3V0aW9uUHJvYmVgKSB1c2VkIGZvclxuICogICB0ZXN0aW5nIG1lbW9yeSBmb290cHJpbnQgb2YgYGV4ZWN1dGVgIGNhbGxzLlxuICogQHJldHVybnMgUmVzdWx0IG9mIHRoZSBleGVjdXRpb24uXG4gKiBAdGhyb3dzIFZhbHVlRXJyb3I6IElmIGFueSBgU3ltYm9saWNUZW5zb3JgcyBmcm9tIGBJbnB1dExheWVyYHNcbiAqICAgZW5jb3VudGVyZWQgZHVyaW5nIHRoZSBleGVjdXRpb24gbGFja3MgYSBmZWVkIHZhbHVlIGluIGBmZWVkRGljdGAuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBleGVjdXRlKFxuICAgIGZldGNoZXM6IFN5bWJvbGljVGVuc29yfFN5bWJvbGljVGVuc29yW10sIGZlZWREaWN0OiBGZWVkRGljdCxcbiAgICBrd2FyZ3M/OiBLd2FyZ3MsIHByb2JlPzogRXhlY3V0aW9uUHJvYmUpOiBUZW5zb3J8XG4gICAgVGVuc29yW118W1RlbnNvciB8IFRlbnNvcltdXSB7XG4gIGNvbnN0IHRyYWluaW5nOiBib29sZWFuID0ga3dhcmdzID09IG51bGwgPyBmYWxzZSA6IGt3YXJnc1sndHJhaW5pbmcnXTtcblxuICBjb25zdCBhcnJheUZldGNoZXMgPSBBcnJheS5pc0FycmF5KGZldGNoZXMpO1xuICBjb25zdCBmZXRjaEFycmF5OiBTeW1ib2xpY1RlbnNvcltdID1cbiAgICAgIGFycmF5RmV0Y2hlcyA/IGZldGNoZXMgYXMgU3ltYm9saWNUZW5zb3JbXSA6IFtmZXRjaGVzIGFzIFN5bWJvbGljVGVuc29yXTtcblxuICBjb25zdCBvdXRwdXROYW1lcyA9IGZldGNoQXJyYXkubWFwKHQgPT4gdC5uYW1lKTtcbiAgY29uc3QgZmluYWxPdXRwdXRzOiBUZW5zb3JbXSA9IFtdO1xuICBjb25zdCBmZWVkTmFtZXMgPSBmZWVkRGljdC5uYW1lcygpO1xuICBmb3IgKGNvbnN0IG91dHB1dE5hbWUgb2Ygb3V0cHV0TmFtZXMpIHtcbiAgICBpZiAoZmVlZE5hbWVzLmluZGV4T2Yob3V0cHV0TmFtZSkgIT09IC0xKSB7XG4gICAgICBmaW5hbE91dHB1dHMucHVzaChmZWVkRGljdC5nZXRWYWx1ZShvdXRwdXROYW1lKSk7XG4gICAgfSBlbHNlIHtcbiAgICAgIGZpbmFsT3V0cHV0cy5wdXNoKG51bGwpO1xuICAgIH1cbiAgfVxuXG4gIGlmIChwcm9iZSAhPSBudWxsKSB7XG4gICAgLy8gRm9yIG9wdGlvbmFsIHByb2Jpbmcgb2YgbWVtb3J5IGZvb3RwcmludCBkdXJpbmcgZXhlY3V0aW9uLlxuICAgIHByb2JlLm1heE51bVRlbnNvcnMgPSAtSW5maW5pdHk7XG4gICAgcHJvYmUubWluTnVtVGVuc29ycyA9IEluZmluaXR5O1xuICB9XG5cbiAgLy8gQ2hlY2sgY2FjaGUuXG4gIGNvbnN0IGZldGNoQW5kRmVlZEtleSA9XG4gICAgICBvdXRwdXROYW1lcy5qb2luKCcsJykgKyAnfCcgKyBmZWVkRGljdC5uYW1lcygpLnNvcnQoKS5qb2luKCcsJyk7XG4gIGxldCBzb3J0ZWQ6IFN5bWJvbGljVGVuc29yW10gPSBjYWNoZWRTb3J0ZWQuZ2V0KGZldGNoQW5kRmVlZEtleSk7XG4gIGxldCByZWNpcGllbnRDb3VudHM6IHtbZmV0Y2hOYW1lOiBzdHJpbmddOiBudW1iZXJ9O1xuICBpZiAoc29ydGVkID09IG51bGwpIHtcbiAgICAvLyBDYWNoZSBkb2Vzbid0IGNvbnRhaW4gdGhlIGRlc2lyZWQgY29tYmluYXRpb24gb2YgZmV0Y2hlcy4gQ29tcHV0ZVxuICAgIC8vIHRvcG9sb2dpY2FsIHNvcnQgZm9yIHRoZSBjb21iaW5hdGlvbiBmb3IgdGhlIGZpcnN0IHRpbWUuXG4gICAgY29uc3Qgb3V0ID0gZ2V0VG9wb2xvZ2ljYWxTb3J0QW5kUmVjaXBpZW50Q291bnRzKGZldGNoQXJyYXksIGZlZWREaWN0KTtcbiAgICBzb3J0ZWQgPSBvdXQuc29ydGVkO1xuICAgIHJlY2lwaWVudENvdW50cyA9IG91dC5yZWNpcGllbnRDb3VudHM7XG5cbiAgICAvLyBTdG9yZSByZXN1bHRzIGluIGNhY2hlIGZvciBmdXR1cmUgdXNlLlxuICAgIGNhY2hlZFNvcnRlZC5wdXQoZmV0Y2hBbmRGZWVkS2V5LCBzb3J0ZWQpO1xuICAgIGNhY2hlZFJlY2lwaWVudENvdW50cy5wdXQoZmV0Y2hBbmRGZWVkS2V5LCByZWNpcGllbnRDb3VudHMpO1xuICB9XG4gIHJlY2lwaWVudENvdW50cyA9IHt9O1xuICBpZiAoIXRyYWluaW5nKSB7XG4gICAgT2JqZWN0LmFzc2lnbihyZWNpcGllbnRDb3VudHMsIGNhY2hlZFJlY2lwaWVudENvdW50cy5nZXQoZmV0Y2hBbmRGZWVkS2V5KSk7XG4gIH1cblxuICBjb25zdCBpbnRlcm5hbEZlZWREaWN0ID0gbmV3IEZlZWREaWN0KGZlZWREaWN0KTtcblxuICAvLyBTdGFydCBpdGVyYXRpdmUgZXhlY3V0aW9uIG9uIHRoZSB0b3BvbG9naWNhbGx5LXNvcnRlZCBTeW1ib2xpY1RlbnNvcnMuXG4gIGZvciAobGV0IGkgPSAwOyBpIDwgc29ydGVkLmxlbmd0aDsgKytpKSB7XG4gICAgaWYgKHByb2JlICE9IG51bGwpIHtcbiAgICAgIC8vIEZvciBvcHRpb25hbCBwcm9iaW5nIG9mIG1lbW9yeSB1c2FnZSBkdXJpbmcgZXhlY3V0aW9uLlxuICAgICAgY29uc3QgbnVtVGVuc29ycyA9IG1lbW9yeSgpLm51bVRlbnNvcnM7XG4gICAgICBpZiAobnVtVGVuc29ycyA+IHByb2JlLm1heE51bVRlbnNvcnMpIHtcbiAgICAgICAgcHJvYmUubWF4TnVtVGVuc29ycyA9IG51bVRlbnNvcnM7XG4gICAgICB9XG4gICAgICBpZiAobnVtVGVuc29ycyA8IHByb2JlLm1pbk51bVRlbnNvcnMpIHtcbiAgICAgICAgcHJvYmUubWluTnVtVGVuc29ycyA9IG51bVRlbnNvcnM7XG4gICAgICB9XG4gICAgfVxuXG4gICAgY29uc3Qgc3ltYm9saWMgPSBzb3J0ZWRbaV07XG4gICAgY29uc3Qgc3JjTGF5ZXIgPSBzeW1ib2xpYy5zb3VyY2VMYXllcjtcbiAgICBpZiAoc3JjTGF5ZXIgaW5zdGFuY2VvZiBJbnB1dExheWVyKSB7XG4gICAgICBjb250aW51ZTtcbiAgICB9XG4gICAgY29uc3QgaW5wdXRWYWx1ZXM6IFRlbnNvcltdID0gW107XG4gICAgY29uc3QgaW5wdXRNYXNrczogVGVuc29yW10gPSBbXTtcbiAgICBjb25zdCB0ZW5zb3JzVG9EaXNwb3NlOiBUZW5zb3JbXSA9IFtdO1xuXG4gICAgbGV0IG1hc2tFeGlzdHMgPSBmYWxzZTtcbiAgICBmb3IgKGNvbnN0IGlucHV0IG9mIHN5bWJvbGljLmlucHV0cykge1xuICAgICAgY29uc3QgdmFsdWUgPSBpbnRlcm5hbEZlZWREaWN0LmdldFZhbHVlKGlucHV0KTtcbiAgICAgIGNvbnN0IG1hc2sgPSBpbnRlcm5hbEZlZWREaWN0LmdldE1hc2soaW5wdXQpO1xuICAgICAgaW5wdXRWYWx1ZXMucHVzaCh2YWx1ZSk7XG4gICAgICBpbnB1dE1hc2tzLnB1c2gobWFzayk7XG4gICAgICBpZiAobWFzayAhPSBudWxsKSB7XG4gICAgICAgIG1hc2tFeGlzdHMgPSB0cnVlO1xuICAgICAgfVxuICAgICAgaWYgKCF0cmFpbmluZykge1xuICAgICAgICByZWNpcGllbnRDb3VudHNbaW5wdXQubmFtZV0tLTtcbiAgICAgICAgaWYgKHJlY2lwaWVudENvdW50c1tpbnB1dC5uYW1lXSA9PT0gMCAmJiAhZmVlZERpY3QuaGFzS2V5KGlucHV0KSAmJlxuICAgICAgICAgICAgb3V0cHV0TmFtZXMuaW5kZXhPZihpbnB1dC5uYW1lKSA9PT0gLTEgJiYgIXZhbHVlLmlzRGlzcG9zZWQgJiZcbiAgICAgICAgICAgIGlucHV0LnNvdXJjZUxheWVyLnN0YXRlZnVsICE9PSB0cnVlKSB7XG4gICAgICAgICAgdGVuc29yc1RvRGlzcG9zZS5wdXNoKHZhbHVlKTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH1cblxuICAgIGlmIChtYXNrRXhpc3RzKSB7XG4gICAgICBrd2FyZ3MgPSBrd2FyZ3MgfHwge307XG4gICAgICBrd2FyZ3NbJ21hc2snXSA9IGlucHV0TWFza3NbMF07XG4gICAgfVxuICAgIGNvbnN0IG91dHB1dFRlbnNvcnMgPVxuICAgICAgICB0b0xpc3Qoc3JjTGF5ZXIuYXBwbHkoaW5wdXRWYWx1ZXMsIGt3YXJncykpIGFzIFRlbnNvcltdO1xuICAgIGxldCBvdXRwdXRNYXNrOiBUZW5zb3J8VGVuc29yW10gPSBudWxsO1xuICAgIGlmIChzcmNMYXllci5zdXBwb3J0c01hc2tpbmcpIHtcbiAgICAgIG91dHB1dE1hc2sgPSBzcmNMYXllci5jb21wdXRlTWFzayhpbnB1dFZhbHVlcywgaW5wdXRNYXNrcyk7XG4gICAgfVxuICAgIGNvbnN0IGxheWVyT3V0cHV0cyA9IGdldE5vZGVPdXRwdXRzKHN5bWJvbGljKTtcbiAgICBjb25zdCBvdXRwdXRTeW1ib2xpY1RlbnNvcnMgPVxuICAgICAgICBBcnJheS5pc0FycmF5KGxheWVyT3V0cHV0cykgPyBsYXllck91dHB1dHMgOiBbbGF5ZXJPdXRwdXRzXTtcbiAgICBmb3IgKGxldCBpID0gMDsgaSA8IG91dHB1dFN5bWJvbGljVGVuc29ycy5sZW5ndGg7ICsraSkge1xuICAgICAgaWYgKCFpbnRlcm5hbEZlZWREaWN0Lmhhc0tleShvdXRwdXRTeW1ib2xpY1RlbnNvcnNbaV0pKSB7XG4gICAgICAgIGludGVybmFsRmVlZERpY3QuYWRkKFxuICAgICAgICAgICAgb3V0cHV0U3ltYm9saWNUZW5zb3JzW2ldLCBvdXRwdXRUZW5zb3JzW2ldLFxuICAgICAgICAgICAgQXJyYXkuaXNBcnJheShvdXRwdXRNYXNrKSA/IG91dHB1dE1hc2tbMF0gOiBvdXRwdXRNYXNrKTtcbiAgICAgIH1cbiAgICAgIGNvbnN0IGluZGV4ID0gb3V0cHV0TmFtZXMuaW5kZXhPZihvdXRwdXRTeW1ib2xpY1RlbnNvcnNbaV0ubmFtZSk7XG4gICAgICBpZiAoaW5kZXggIT09IC0xKSB7XG4gICAgICAgIGZpbmFsT3V0cHV0c1tpbmRleF0gPSBvdXRwdXRUZW5zb3JzW2ldO1xuICAgICAgfVxuICAgIH1cblxuICAgIGlmICghdHJhaW5pbmcpIHtcbiAgICAgIC8vIENsZWFuIHVwIFRlbnNvcnMgdGhhdCBhcmUgbm8gbG9uZ2VyIG5lZWRlZC5cbiAgICAgIGRpc3Bvc2UodGVuc29yc1RvRGlzcG9zZSk7XG4gICAgfVxuICB9XG4gIC8vIE5PVEUoY2Fpcyk6IFVubGlrZSBpbnRlcm1lZGlhdGUgdGVuc29ycywgd2UgZG9uJ3QgZGlzY2FyZCBtYXNrXG4gIC8vIHRlbnNvcnMgYXMgd2UgZ28sIGJlY2F1c2UgdGhlc2UgdGVuc29ycyBhcmUgc29tZXRpbWVzIHBhc3NlZCBvdmVyIGFcbiAgLy8gc2VyaWVzIG9mIG11dGxpcGxlIGxheWVycywgaS5lLiwgbm90IG9iZXlpbmcgdGhlIGltbWVkaWF0ZSBpbnB1dFxuICAvLyByZWxhdGlvbnMgaW4gdGhlIGdyYXBoLiBJZiB0aGlzIGJlY29tZXMgYSBtZW1vcnktdXNhZ2UgY29uY2VybixcbiAgLy8gd2UgY2FuIGltcHJvdmUgdGhpcyBpbiB0aGUgZnV0dXJlLlxuICBpbnRlcm5hbEZlZWREaWN0LmRpc3Bvc2VNYXNrcygpO1xuXG4gIHJldHVybiBhcnJheUZldGNoZXMgPyBmaW5hbE91dHB1dHMgOiBmaW5hbE91dHB1dHNbMF07XG59XG5cbnR5cGUgUmVjaXBpZW50Q291bnRzID0ge1xuICBbZmV0Y2hOYW1lOiBzdHJpbmddOiBudW1iZXJcbn07XG5cbmV4cG9ydCB0eXBlIFJlY2lwaWVudE1hcCA9IHtcbiAgW2ZldGNoTmFtZTogc3RyaW5nXTogU2V0PHN0cmluZz47XG59O1xuXG4vKipcbiAqIFNvcnQgdGhlIGBTeW1ib2xpY1RlbnNvcmBzIHRvcG9sb2dpY2FsbHksIGZvciBhbiBhcnJheSBvZiBmZXRjaGVzLlxuICpcbiAqIFRoaXMgZnVuY3Rpb24gY2FsbHMgZ2V0VG9wb2xvZ2ljYWxTb3J0QW5kUmVjaXBpZW50Q291bnRzRm9yT25lRmV0Y2ggYW5kXG4gKiBtZXJnZXMgdGhlaXIgcmVzdWx0cy5cbiAqXG4gKiBAcGFyYW0gZmV0Y2ggVGhlIGFycmF5IG9mIGZldGNoZXMgcmVxdWVzdGVkLiBNdXN0IGJlIGEgbm9uLWVtcHR5IGFycmF5LlxuICogQHBhcmFtIGZlZWREaWN0IFRoZSBkaWN0aW9uYXJ5IG9mIGZlZCB2YWx1ZXMuXG4gKiBAcmV0dXJucyBzb3J0ZWQ6IFRvcG9sb2dpY2FsbHktc29ydGVkIGFycmF5IG9mIFN5bWJvbGljVGVuc29ycy5cbiAqICAgcmVjaXBpZW50Q291bnRzOiBSZWNpcGllbnQgY291bnRzIGZvciBhbGwgU3ltYm9saWNUZW5zb3JzIGluIGBzb3J0ZWRgLlxuICovXG5mdW5jdGlvbiBnZXRUb3BvbG9naWNhbFNvcnRBbmRSZWNpcGllbnRDb3VudHMoXG4gICAgZmV0Y2hlczogU3ltYm9saWNUZW5zb3JbXSwgZmVlZERpY3Q6IEZlZWREaWN0KTpcbiAgICB7c29ydGVkOiBTeW1ib2xpY1RlbnNvcltdLCByZWNpcGllbnRDb3VudHM6IFJlY2lwaWVudENvdW50c30ge1xuICB1dGlsLmFzc2VydChcbiAgICAgIGZldGNoZXMgIT0gbnVsbCAmJiBmZXRjaGVzLmxlbmd0aCA+IDAsXG4gICAgICAoKSA9PiBgRXhwZWN0ZWQgYXQgbGVhc3Qgb25lIGZldGNoLCBnb3Qgbm9uZWApO1xuXG4gIGxldCBmaW5hbFNvcnRlZDogU3ltYm9saWNUZW5zb3JbXSA9IFtdO1xuICBsZXQgZmluYWxSZWNpcGllbnRNYXA6IFJlY2lwaWVudE1hcCA9IHt9O1xuICBpZiAoZmV0Y2hlcy5sZW5ndGggPT09IDEpIHtcbiAgICAvLyBTcGVjaWFsLWNhc2luZyAxIGZldGNoIGZvciBlZmZpY2llbmN5LlxuICAgIGNvbnN0IG91dCA9XG4gICAgICAgIGdldFRvcG9sb2dpY2FsU29ydEFuZFJlY2lwaWVudENvdW50c0Zvck9uZUZldGNoKGZldGNoZXNbMF0sIGZlZWREaWN0KTtcbiAgICBmaW5hbFNvcnRlZCA9IG91dC5zb3J0ZWQ7XG4gICAgZmluYWxSZWNpcGllbnRNYXAgPSBvdXQucmVjaXBpZW50TWFwO1xuICB9IGVsc2Uge1xuICAgIGNvbnN0IHZpc2l0ZWQgPSBuZXcgU2V0PHN0cmluZz4oKTtcbiAgICBmb3IgKGNvbnN0IGZldGNoIG9mIGZldGNoZXMpIHtcbiAgICAgIGNvbnN0IHtzb3J0ZWQsIHJlY2lwaWVudE1hcH0gPVxuICAgICAgICAgIGdldFRvcG9sb2dpY2FsU29ydEFuZFJlY2lwaWVudENvdW50c0Zvck9uZUZldGNoKGZldGNoLCBmZWVkRGljdCk7XG5cbiAgICAgIC8vIE1lcmdlIHNvcnRlZCBTeW1ib2xpY1RlbnNvciBBcnJheXMuXG4gICAgICBmb3IgKGNvbnN0IHN5bWJvbGljVGVuc29yIG9mIHNvcnRlZCkge1xuICAgICAgICBpZiAoIXZpc2l0ZWQuaGFzKHN5bWJvbGljVGVuc29yLm5hbWUpKSB7XG4gICAgICAgICAgZmluYWxTb3J0ZWQucHVzaChzeW1ib2xpY1RlbnNvcik7XG4gICAgICAgICAgdmlzaXRlZC5hZGQoc3ltYm9saWNUZW5zb3IubmFtZSk7XG4gICAgICAgIH1cbiAgICAgIH1cblxuICAgICAgLy8gTWVyZ2UgcmVjaXBpZW50IG1hcHMuXG4gICAgICBmb3IgKGNvbnN0IG5hbWUgaW4gcmVjaXBpZW50TWFwKSB7XG4gICAgICAgIGlmIChmaW5hbFJlY2lwaWVudE1hcFtuYW1lXSA9PSBudWxsKSB7XG4gICAgICAgICAgZmluYWxSZWNpcGllbnRNYXBbbmFtZV0gPSBuZXcgU2V0PHN0cmluZz4oKTtcbiAgICAgICAgfVxuICAgICAgICByZWNpcGllbnRNYXBbbmFtZV0uZm9yRWFjaChcbiAgICAgICAgICAgIHJlY2lwaWVudCA9PiBmaW5hbFJlY2lwaWVudE1hcFtuYW1lXS5hZGQocmVjaXBpZW50KSk7XG4gICAgICB9XG4gICAgfVxuICB9XG4gIHJldHVybiB7XG4gICAgc29ydGVkOiBmaW5hbFNvcnRlZCxcbiAgICByZWNpcGllbnRDb3VudHM6IHJlY2lwaWVudE1hcDJDb3VudHMoZmluYWxSZWNpcGllbnRNYXApXG4gIH07XG59XG5cbmZ1bmN0aW9uIHJlY2lwaWVudE1hcDJDb3VudHMocmVjaXBpZW50TWFwOiBSZWNpcGllbnRNYXApOiBSZWNpcGllbnRDb3VudHMge1xuICBjb25zdCByZWNpcGllbnRDb3VudHM6IFJlY2lwaWVudENvdW50cyA9IHt9O1xuICBmb3IgKGNvbnN0IG5hbWUgaW4gcmVjaXBpZW50TWFwKSB7XG4gICAgcmVjaXBpZW50Q291bnRzW25hbWVdID0gcmVjaXBpZW50TWFwW25hbWVdLnNpemU7XG4gIH1cbiAgcmV0dXJuIHJlY2lwaWVudENvdW50cztcbn1cblxuLyoqXG4gKiBTb3J0IHRoZSBgU3ltYm9saWNUZW5zb3JgcyB0b3BvbG9naWNhbGx5LCBmb3IgYSBzaW5nbGUgZmV0Y2guXG4gKlxuICogVGhpcyBoZWxwZXIgZnVuY3Rpb24gcHJvY2Vzc2VzIHRoZSB1cHN0cmVhbSBTeW1ib2xpY1RlbnNvcnMgb2YgYSBzaW5nbGVcbiAqIGZldGNoLlxuICpcbiAqIEBwYXJhbSBmZXRjaCBUaGUgc2luZ2xlIGZldGNoIHJlcXVlc3RlZC5cbiAqIEBwYXJhbSBmZWVkRGljdCBUaGUgZGljdGlvbmFyeSBvZiBmZWQgdmFsdWVzLlxuICogQHJldHVybnMgc29ydGVkOiBUb3BvbG9naWNhbGx5LXNvcnRlZCBhcnJheSBvZiBTeW1ib2xpY1RlbnNvcnMuXG4gKiAgIHJlY2lwaWVudE1hcDogUmVjaXBpZW50IG5hbWVzIGZvciBhbGwgU3ltYm9saWNUZW5zb3JzIGluIGBzb3J0ZWRgLlxuICovXG5leHBvcnQgZnVuY3Rpb24gZ2V0VG9wb2xvZ2ljYWxTb3J0QW5kUmVjaXBpZW50Q291bnRzRm9yT25lRmV0Y2goXG4gICAgZmV0Y2g6IFN5bWJvbGljVGVuc29yLCBmZWVkRGljdDogRmVlZERpY3QpOlxuICAgIHtzb3J0ZWQ6IFN5bWJvbGljVGVuc29yW10sIHJlY2lwaWVudE1hcDogUmVjaXBpZW50TWFwfSB7XG4gIGNvbnN0IHZpc2l0ZWQgPSBuZXcgU2V0PHN0cmluZz4oKTtcbiAgY29uc3Qgc29ydGVkOiBTeW1ib2xpY1RlbnNvcltdID0gW107XG4gIGNvbnN0IHJlY2lwaWVudE1hcDogUmVjaXBpZW50TWFwID0ge307XG5cbiAgLy8gUHV0IGtleXMgb2YgdGhlIGZlZWREaWN0IGludG8gdmlzaXRlZCBmaXJzdCwgc28gdGhleSBkb24ndCBoYXZlIHRvIGJlXG4gIC8vIHdhbGtlZC4gVGhpcyBpcyBuZWVkZWQgaW4gY2FzZSB3aGVyZSB0aGVyZSBhcmUgZmVlZHMgZm9yIGludGVybWVkaWF0ZVxuICAvLyBTeW1ib2xpY1RlbnNvcnMgb2YgdGhlIGdyYXBoLlxuICBmb3IgKGNvbnN0IGtleSBvZiBmZWVkRGljdC5uYW1lcygpKSB7XG4gICAgdmlzaXRlZC5hZGQoa2V5KTtcbiAgfVxuXG4gIGNvbnN0IHN0YWNrOiBTeW1ib2xpY1RlbnNvcltdID0gW107XG4gIGNvbnN0IG1hcmtzOiBudW1iZXJbXSA9IFtdO1xuXG4gIC8vIEluaXRpYWwgcG9wdWxhdGlvbiBvZiBzdGFjayBhbmQgbWFya3MuXG4gIHN0YWNrLnB1c2goZmV0Y2gpO1xuXG4gIHdoaWxlIChzdGFjay5sZW5ndGggPiAwKSB7XG4gICAgY29uc3QgdG9wID0gc3RhY2tbc3RhY2subGVuZ3RoIC0gMV07XG4gICAgaWYgKHZpc2l0ZWQuaGFzKHRvcC5uYW1lKSkge1xuICAgICAgc3RhY2sucG9wKCk7XG4gICAgICBjb250aW51ZTtcbiAgICB9XG4gICAgY29uc3QgdG9wSXNNYXJrZWQgPSBtYXJrc1ttYXJrcy5sZW5ndGggLSAxXSA9PT0gc3RhY2subGVuZ3RoIC0gMTtcbiAgICBpZiAodG9wLmlucHV0cy5sZW5ndGggPT09IDAgfHwgdG9wSXNNYXJrZWQpIHtcbiAgICAgIC8vIElucHV0IFN5bWJvbGljVGVuc29yIG9yIGFsbCBjaGlsZHJlbiBoYXZlIGJlZW4gdmlzaXRlZC5cbiAgICAgIHN0YWNrLnBvcCgpO1xuICAgICAgc29ydGVkLnB1c2godG9wKTtcbiAgICAgIHZpc2l0ZWQuYWRkKHRvcC5uYW1lKTtcbiAgICAgIGlmICh0b3BJc01hcmtlZCkge1xuICAgICAgICBtYXJrcy5wb3AoKTtcbiAgICAgIH1cbiAgICB9IGVsc2Uge1xuICAgICAgLy8gQSBub24taW5wdXQgU3ltYm9saWNUZW5zb3Igd2hvc2UgdXBzdHJlYW0gU3ltYm9saWNUZW5zb3JzIGhhdmVuJ3RcbiAgICAgIC8vIGJlZW4gdmlzaXRlZCB5ZXQuIFB1c2ggdGhlbSBvbnRvIHRoZSBzdGFjay5cbiAgICAgIG1hcmtzLnB1c2goc3RhY2subGVuZ3RoIC0gMSk7XG4gICAgICBmb3IgKGNvbnN0IGlucHV0IG9mIHRvcC5pbnB1dHMpIHtcbiAgICAgICAgLy8gSW5jcmVtZW50IHRoZSByZWNpcGllbnQgY291bnQuIE5vdGUgdGhhdCB0aGlzIG5lZWRzIHRvIGhhcHBlblxuICAgICAgICAvLyByZWdhcmRsZXNzIG9mIHdoZXRoZXIgdGhlIFN5bWJvbGljVGVuc29yIGhhcyBiZWVuIHZpc2l0ZWQgYmVmb3JlLlxuICAgICAgICBpZiAocmVjaXBpZW50TWFwW2lucHV0Lm5hbWVdID09IG51bGwpIHtcbiAgICAgICAgICByZWNpcGllbnRNYXBbaW5wdXQubmFtZV0gPSBuZXcgU2V0PHN0cmluZz4oKTtcbiAgICAgICAgfVxuICAgICAgICByZWNpcGllbnRNYXBbaW5wdXQubmFtZV0uYWRkKHRvcC5uYW1lKTtcblxuICAgICAgICBpZiAodmlzaXRlZC5oYXMoaW5wdXQubmFtZSkpIHtcbiAgICAgICAgICBjb250aW51ZTsgIC8vIEF2b2lkIHJlcGVhdGVkIHZpc2l0cyB0byB0aGUgc2FtZSBTeW1ib2xpY1RlbnNvci5cbiAgICAgICAgfVxuICAgICAgICBzdGFjay5wdXNoKGlucHV0KTtcbiAgICAgIH1cbiAgICB9XG4gIH1cbiAgcmV0dXJuIHtzb3J0ZWQsIHJlY2lwaWVudE1hcH07XG59XG5cbi8qKlxuICogR2V0IHRoZSBzeW1ib2xpYyBvdXRwdXQgdGVuc29ycyBvZiB0aGUgbm9kZSB0byB3aGljaCBhIGdpdmVuIGZldGNoIGJlbG9uZ3MuXG4gKiBAcGFyYW0gZmV0Y2ggVGhlIGZldGNoZWQgc3ltYm9saWMgdGVuc29yLlxuICogQHJldHVybnMgVGhlIEFycmF5IG9mIHN5bWJvbGljIHRlbnNvcnMgb3V0cHV0IGJ5IHRoZSBub2RlIHRvIHdoaWNoIGBmZXRjaGBcbiAqICAgYmVsb25ncy5cbiAqL1xuZnVuY3Rpb24gZ2V0Tm9kZU91dHB1dHMoZmV0Y2g6IFN5bWJvbGljVGVuc29yKTogU3ltYm9saWNUZW5zb3J8XG4gICAgU3ltYm9saWNUZW5zb3JbXSB7XG4gIGxldCBsYXllck91dHB1dHM6IFN5bWJvbGljVGVuc29yfFN5bWJvbGljVGVuc29yW107XG4gIGlmIChmZXRjaC5zb3VyY2VMYXllci5pbmJvdW5kTm9kZXMubGVuZ3RoID09PSAxKSB7XG4gICAgbGF5ZXJPdXRwdXRzID0gZmV0Y2guc291cmNlTGF5ZXIub3V0cHV0O1xuICB9IGVsc2Uge1xuICAgIGxldCBub2RlSW5kZXg6IG51bWJlciA9IG51bGw7XG4gICAgZm9yIChsZXQgaSA9IDA7IGkgPCBmZXRjaC5zb3VyY2VMYXllci5pbmJvdW5kTm9kZXMubGVuZ3RoOyArK2kpIHtcbiAgICAgIGZvciAoY29uc3Qgb3V0cHV0VGVuc29yIG9mIGZldGNoLnNvdXJjZUxheWVyLmluYm91bmROb2Rlc1tpXVxuICAgICAgICAgICAgICAgLm91dHB1dFRlbnNvcnMpIHtcbiAgICAgICAgaWYgKG91dHB1dFRlbnNvci5pZCA9PT0gZmV0Y2guaWQpIHtcbiAgICAgICAgICBub2RlSW5kZXggPSBpO1xuICAgICAgICAgIGJyZWFrO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfVxuICAgIGxheWVyT3V0cHV0cyA9IGZldGNoLnNvdXJjZUxheWVyLmdldE91dHB1dEF0KG5vZGVJbmRleCk7XG4gIH1cbiAgcmV0dXJuIGxheWVyT3V0cHV0cztcbn1cbiJdfQ==","/**\n * @license\n * Copyright 2018 Google LLC\n *\n * Use of this source code is governed by an MIT-style\n * license that can be found in the LICENSE file or at\n * https://opensource.org/licenses/MIT.\n * =============================================================================\n */\n/* Original source: keras/contraints.py */\nimport * as tfc from '@tensorflow/tfjs-core';\nimport { serialization, tidy } from '@tensorflow/tfjs-core';\nimport { epsilon } from './backend/common';\nimport { deserializeKerasObject, serializeKerasObject } from './utils/generic_utils';\n/**\n * Helper function used by many of the Constraints to find the L2Norms.\n */\nfunction calcL2Norms(w, axis) {\n return tidy(() => tfc.sqrt(tfc.sum(tfc.mul(w, w), axis, true)));\n}\n/**\n * Base class for functions that impose constraints on weight values\n *\n * @doc {\n * heading: 'Constraints',\n * subheading: 'Classes',\n * namespace: 'constraints'\n * }\n */\nexport class Constraint extends serialization.Serializable {\n getConfig() {\n return {};\n }\n}\nexport class MaxNorm extends Constraint {\n constructor(args) {\n super();\n this.defaultMaxValue = 2;\n this.defaultAxis = 0;\n this.maxValue =\n args.maxValue != null ? args.maxValue : this.defaultMaxValue;\n this.axis = args.axis != null ? args.axis : this.defaultAxis;\n }\n apply(w) {\n return tidy(() => {\n const norms = calcL2Norms(w, this.axis);\n const desired = tfc.clipByValue(norms, 0, this.maxValue);\n return tfc.mul(w, tfc.div(desired, tfc.add(epsilon(), norms)));\n });\n }\n getConfig() {\n return { maxValue: this.maxValue, axis: this.axis };\n }\n}\n/** @nocollapse */\nMaxNorm.className = 'MaxNorm';\nserialization.registerClass(MaxNorm);\nexport class UnitNorm extends Constraint {\n constructor(args) {\n super();\n this.defaultAxis = 0;\n this.axis = args.axis != null ? args.axis : this.defaultAxis;\n }\n apply(w) {\n return tidy(() => tfc.div(w, tfc.add(epsilon(), calcL2Norms(w, this.axis))));\n }\n getConfig() {\n return { axis: this.axis };\n }\n}\n/** @nocollapse */\nUnitNorm.className = 'UnitNorm';\nserialization.registerClass(UnitNorm);\nexport class NonNeg extends Constraint {\n apply(w) {\n return tfc.relu(w);\n }\n}\n/** @nocollapse */\nNonNeg.className = 'NonNeg';\nserialization.registerClass(NonNeg);\nexport class MinMaxNorm extends Constraint {\n constructor(args) {\n super();\n this.defaultMinValue = 0.0;\n this.defaultMaxValue = 1.0;\n this.defaultRate = 1.0;\n this.defaultAxis = 0;\n this.minValue =\n args.minValue != null ? args.minValue : this.defaultMinValue;\n this.maxValue =\n args.maxValue != null ? args.maxValue : this.defaultMaxValue;\n this.rate = args.rate != null ? args.rate : this.defaultRate;\n this.axis = args.axis != null ? args.axis : this.defaultAxis;\n }\n apply(w) {\n return tidy(() => {\n const norms = calcL2Norms(w, this.axis);\n const desired = tfc.add(tfc.mul(this.rate, tfc.clipByValue(norms, this.minValue, this.maxValue)), tfc.mul(1.0 - this.rate, norms));\n return tfc.mul(w, tfc.div(desired, tfc.add(epsilon(), norms)));\n });\n }\n getConfig() {\n return {\n minValue: this.minValue,\n maxValue: this.maxValue,\n rate: this.rate,\n axis: this.axis\n };\n }\n}\n/** @nocollapse */\nMinMaxNorm.className = 'MinMaxNorm';\nserialization.registerClass(MinMaxNorm);\n// Maps the JavaScript-like identifier keys to the corresponding registry\n// symbols.\nexport const CONSTRAINT_IDENTIFIER_REGISTRY_SYMBOL_MAP = {\n 'maxNorm': 'MaxNorm',\n 'minMaxNorm': 'MinMaxNorm',\n 'nonNeg': 'NonNeg',\n 'unitNorm': 'UnitNorm'\n};\nexport function serializeConstraint(constraint) {\n return serializeKerasObject(constraint);\n}\nexport function deserializeConstraint(config, customObjects = {}) {\n return deserializeKerasObject(config, serialization.SerializationMap.getMap().classNameMap, customObjects, 'constraint');\n}\nexport function getConstraint(identifier) {\n if (identifier == null) {\n return null;\n }\n if (typeof identifier === 'string') {\n const className = identifier in CONSTRAINT_IDENTIFIER_REGISTRY_SYMBOL_MAP ?\n CONSTRAINT_IDENTIFIER_REGISTRY_SYMBOL_MAP[identifier] :\n identifier;\n const config = { className, config: {} };\n return deserializeConstraint(config);\n }\n else if (identifier instanceof Constraint) {\n return identifier;\n }\n else {\n return deserializeConstraint(identifier);\n }\n}\n//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY29uc3RyYWludHMuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi90ZmpzLWxheWVycy9zcmMvY29uc3RyYWludHMudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUE7Ozs7Ozs7O0dBUUc7QUFFSCwwQ0FBMEM7QUFFMUMsT0FBTyxLQUFLLEdBQUcsTUFBTSx1QkFBdUIsQ0FBQztBQUM3QyxPQUFPLEVBQUMsYUFBYSxFQUFVLElBQUksRUFBQyxNQUFNLHVCQUF1QixDQUFDO0FBQ2xFLE9BQU8sRUFBQyxPQUFPLEVBQUMsTUFBTSxrQkFBa0IsQ0FBQztBQUN6QyxPQUFPLEVBQUMsc0JBQXNCLEVBQUUsb0JBQW9CLEVBQUMsTUFBTSx1QkFBdUIsQ0FBQztBQUVuRjs7R0FFRztBQUNILFNBQVMsV0FBVyxDQUFDLENBQVMsRUFBRSxJQUFZO0lBQzFDLE9BQU8sSUFBSSxDQUFDLEdBQUcsRUFBRSxDQUFDLEdBQUcsQ0FBQyxJQUFJLENBQUMsR0FBRyxDQUFDLEdBQUcsQ0FBQyxHQUFHLENBQUMsR0FBRyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsRUFBRSxJQUFJLEVBQUUsSUFBSSxDQUFDLENBQUMsQ0FBQyxDQUFDO0FBQ2xFLENBQUM7QUFFRDs7Ozs7Ozs7R0FRRztBQUNILE1BQU0sT0FBZ0IsVUFBVyxTQUFRLGFBQWEsQ0FBQyxZQUFZO0lBR2pFLFNBQVM7UUFDUCxPQUFPLEVBQUUsQ0FBQztJQUNaLENBQUM7Q0FDRjtBQXdCRCxNQUFNLE9BQU8sT0FBUSxTQUFRLFVBQVU7SUFRckMsWUFBWSxJQUFpQjtRQUMzQixLQUFLLEVBQUUsQ0FBQztRQUpPLG9CQUFlLEdBQUcsQ0FBQyxDQUFDO1FBQ3BCLGdCQUFXLEdBQUcsQ0FBQyxDQUFDO1FBSS9CLElBQUksQ0FBQyxRQUFRO1lBQ1QsSUFBSSxDQUFDLFFBQVEsSUFBSSxJQUFJLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxRQUFRLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FB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QUFVLEVBQUU7UUFDM0MsT0FBTyxVQUFVLENBQUM7S0FDbkI7U0FBTTtRQUNMLE9BQU8scUJBQXFCLENBQUMsVUFBVSxDQUFDLENBQUM7S0FDMUM7QUFDSCxDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiLyoqXG4gKiBAbGljZW5zZVxuICogQ29weXJpZ2h0IDIwMTggR29vZ2xlIExMQ1xuICpcbiAqIFVzZSBvZiB0aGlzIHNvdXJjZSBjb2RlIGlzIGdvdmVybmVkIGJ5IGFuIE1JVC1zdHlsZVxuICogbGljZW5zZSB0aGF0IGNhbiBiZSBmb3VuZCBpbiB0aGUgTElDRU5TRSBmaWxlIG9yIGF0XG4gKiBodHRwczovL29wZW5zb3VyY2Uub3JnL2xpY2Vuc2VzL01JVC5cbiAqID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4gKi9cblxuLyogT3JpZ2luYWwgc291cmNlOiBrZXJhcy9jb250cmFpbnRzLnB5ICovXG5cbmltcG9ydCAqIGFzIHRmYyBmcm9tICdAdGVuc29yZmxvdy90ZmpzLWNvcmUnO1xuaW1wb3J0IHtzZXJpYWxpemF0aW9uLCBUZW5zb3IsIHRpZHl9IGZyb20gJ0B0ZW5zb3JmbG93L3RmanMtY29yZSc7XG5pbXBvcnQge2Vwc2lsb259IGZyb20gJy4vYmFja2VuZC9jb21tb24nO1xuaW1wb3J0IHtkZXNlcmlhbGl6ZUtlcmFzT2JqZWN0LCBzZXJpYWxpemVLZXJhc09iamVjdH0gZnJvbSAnLi91dGlscy9nZW5lcmljX3V0aWxzJztcblxuLyoqXG4gKiBIZWxwZXIgZnVuY3Rpb24gdXNlZCBieSBtYW55IG9mIHRoZSBDb25zdHJhaW50cyB0byBmaW5kIHRoZSBMMk5vcm1zLlxuICovXG5mdW5jdGlvbiBjYWxjTDJOb3Jtcyh3OiBUZW5zb3IsIGF4aXM6IG51bWJlcik6IFRlbnNvciB7XG4gIHJldHVybiB0aWR5KCgpID0+IHRmYy5zcXJ0KHRmYy5zdW0odGZjLm11bCh3LCB3KSwgYXhpcywgdHJ1ZSkpKTtcbn1cblxuLyoqXG4gKiBCYXNlIGNsYXNzIGZvciBmdW5jdGlvbnMgdGhhdCBpbXBvc2UgY29uc3RyYWludHMgb24gd2VpZ2h0IHZhbHVlc1xuICpcbiAqIEBkb2Mge1xuICogICBoZWFkaW5nOiAnQ29uc3RyYWludHMnLFxuICogICBzdWJoZWFkaW5nOiAnQ2xhc3NlcycsXG4gKiAgIG5hbWVzcGFjZTogJ2NvbnN0cmFpbnRzJ1xuICogfVxuICovXG5leHBvcnQgYWJzdHJhY3QgY2xhc3MgQ29uc3RyYWludCBleHRlbmRzIHNlcmlhbGl6YXRpb24uU2VyaWFsaXphYmxlIHtcbiAgLyogUG9ydGluZyBub3RlOiB3YXMgX19jYWxsX18sIGFwcGx5IGNob3NlbiB0byBtYXRjaCBvdGhlciBzaW1pbGFyIGNob2ljZXMgKi9cbiAgYWJzdHJhY3QgYXBwbHkodzogVGVuc29yKTogVGVuc29yO1xuICBnZXRDb25maWcoKTogc2VyaWFsaXphdGlvbi5Db25maWdEaWN0IHtcbiAgICByZXR1cm4ge307XG4gIH1cbn1cblxuZXhwb3J0IGludGVyZmFjZSBNYXhOb3JtQXJncyB7XG4gIC8qKlxuICAgKiBNYXhpbXVtIG5vcm0gZm9yIGluY29taW5nIHdlaWdodHNcbiAgICovXG4gIG1heFZhbHVlPzogbnVtYmVyO1xuICAvKipcbiAgICogQXhpcyBhbG9uZyB3aGljaCB0byBjYWxjdWxhdGUgbm9ybXMuXG4gICAqXG4gICAqICBGb3IgaW5zdGFuY2UsIGluIGEgYERlbnNlYCBsYXllciB0aGUgd2VpZ2h0IG1hdHJpeFxuICAgKiAgaGFzIHNoYXBlIGBbaW5wdXREaW0sIG91dHB1dERpbV1gLFxuICAgKiAgc2V0IGBheGlzYCB0byBgMGAgdG8gY29uc3RyYWluIGVhY2ggd2VpZ2h0IHZlY3RvclxuICAgKiAgb2YgbGVuZ3RoIGBbaW5wdXREaW0sXWAuXG4gICAqICBJbiBhIGBDb252MkRgIGxheWVyIHdpdGggYGRhdGFGb3JtYXQ9XCJjaGFubmVsc19sYXN0XCJgLFxuICAgKiAgdGhlIHdlaWdodCB0ZW5zb3IgaGFzIHNoYXBlXG4gICAqICBgW3Jvd3MsIGNvbHMsIGlucHV0RGVwdGgsIG91dHB1dERlcHRoXWAsXG4gICAqICBzZXQgYGF4aXNgIHRvIGBbMCwgMSwgMl1gXG4gICAqICB0byBjb25zdHJhaW4gdGhlIHdlaWdodHMgb2YgZWFjaCBmaWx0ZXIgdGVuc29yIG9mIHNpemVcbiAgICogIGBbcm93cywgY29scywgaW5wdXREZXB0aF1gLlxuICAgKi9cbiAgYXhpcz86IG51bWJlcjtcbn1cblxuZXhwb3J0IGNsYXNzIE1heE5vcm0gZXh0ZW5kcyBDb25zdHJhaW50IHtcbiAgLyoqIEBub2NvbGxhcHNlICovXG4gIHN0YXRpYyByZWFkb25seSBjbGFzc05hbWUgPSAnTWF4Tm9ybSc7XG4gIHByaXZhdGUgbWF4VmFsdWU6IG51bWJlcjtcbiAgcHJpdmF0ZSBheGlzOiBudW1iZXI7XG4gIHByaXZhdGUgcmVhZG9ubHkgZGVmYXVsdE1heFZhbHVlID0gMjtcbiAgcHJpdmF0ZSByZWFkb25seSBkZWZhdWx0QXhpcyA9IDA7XG5cbiAgY29uc3RydWN0b3IoYXJnczogTWF4Tm9ybUFyZ3MpIHtcbiAgICBzdXBlcigpO1xuICAgIHRoaXMubWF4VmFsdWUgPVxuICAgICAgICBhcmdzLm1heFZhbHVlICE9IG51bGwgPyBhcmdzLm1heFZhbHVlIDogdGhpcy5kZWZhdWx0TWF4VmFsdWU7XG4gICAgdGhpcy5heGlzID0gYXJncy5heGlzICE9IG51bGwgPyBhcmdzLmF4aXMgOiB0aGlzLmRlZmF1bHRBeGlzO1xuICB9XG5cbiAgYXBwbHkodzogVGVuc29yKTogVGVuc29yIHtcbiAgICByZXR1cm4gdGlkeSgoKSA9PiB7XG4gICAgICBjb25zdCBub3JtcyA9IGNhbGNMMk5vcm1zKHcsIHRoaXMuYXhpcyk7XG4gICAgICBjb25zdCBkZXNpcmVkID0gdGZjLmNsaXBCeVZhbHVlKG5vcm1zLCAwLCB0aGlzLm1heFZhbHVlKTtcbiAgICAgIHJldHVybiB0ZmMubXVsKHcsIHRmYy5kaXYoZGVzaXJlZCwgdGZjLmFkZChlcHNpbG9uKCksIG5vcm1zKSkpO1xuICAgIH0pO1xuICB9XG5cbiAgZ2V0Q29uZmlnKCk6IHNlcmlhbGl6YXRpb24uQ29uZmlnRGljdCB7XG4gICAgcmV0dXJuIHttYXhWYWx1ZTogdGhpcy5tYXhWYWx1ZSwgYXhpczogdGhpcy5heGlzfTtcbiAgfVxufVxuc2VyaWFsaXphdGlvbi5yZWdpc3RlckNsYXNzKE1heE5vcm0pO1xuXG5leHBvcnQgaW50ZXJmYWNlIFVuaXROb3JtQXJncyB7XG4gIC8qKlxuICAgKiBBeGlzIGFsb25nIHdoaWNoIHRvIGNhbGN1bGF0ZSBub3Jtcy5cbiAgICpcbiAgICogRm9yIGluc3RhbmNlLCBpbiBhIGBEZW5zZWAgbGF5ZXIgdGhlIHdlaWdodCBtYXRyaXhcbiAgICogaGFzIHNoYXBlIGBbaW5wdXREaW0sIG91dHB1dERpbV1gLFxuICAgKiBzZXQgYGF4aXNgIHRvIGAwYCB0byBjb25zdHJhaW4gZWFjaCB3ZWlnaHQgdmVjdG9yXG4gICAqIG9mIGxlbmd0aCBgW2lucHV0RGltLF1gLlxuICAgKiBJbiBhIGBDb252MkRgIGxheWVyIHdpdGggYGRhdGFGb3JtYXQ9XCJjaGFubmVsc19sYXN0XCJgLFxuICAgKiB0aGUgd2VpZ2h0IHRlbnNvciBoYXMgc2hhcGVcbiAgICogYFtyb3dzLCBjb2xzLCBpbnB1dERlcHRoLCBvdXRwdXREZXB0aF1gLFxuICAgKiBzZXQgYGF4aXNgIHRvIGBbMCwgMSwgMl1gXG4gICAqIHRvIGNvbnN0cmFpbiB0aGUgd2VpZ2h0cyBvZiBlYWNoIGZpbHRlciB0ZW5zb3Igb2Ygc2l6ZVxuICAgKiBgW3Jvd3MsIGNvbHMsIGlucHV0RGVwdGhdYC5cbiAgICovXG4gIGF4aXM/OiBudW1iZXI7XG59XG5cbmV4cG9ydCBjbGFzcyBVbml0Tm9ybSBleHRlbmRzIENvbnN0cmFpbnQge1xuICAvKiogQG5vY29sbGFwc2UgKi9cbiAgc3RhdGljIHJlYWRvbmx5IGNsYXNzTmFtZSA9ICdVbml0Tm9ybSc7XG4gIHByaXZhdGUgYXhpczogbnVtYmVyO1xuICBwcml2YXRlIHJlYWRvbmx5IGRlZmF1bHRBeGlzID0gMDtcbiAgY29uc3RydWN0b3IoYXJnczogVW5pdE5vcm1BcmdzKSB7XG4gICAgc3VwZXIoKTtcbiAgICB0aGlzLmF4aXMgPSBhcmdzLmF4aXMgIT0gbnVsbCA/IGFyZ3MuYXhpcyA6IHRoaXMuZGVmYXVsdEF4aXM7XG4gIH1cblxuICBhcHBseSh3OiBUZW5zb3IpOiBUZW5zb3Ige1xuICAgIHJldHVybiB0aWR5KFxuICAgICAgICAoKSA9PiB0ZmMuZGl2KHcsIHRmYy5hZGQoZXBzaWxvbigpLCBjYWxjTDJOb3Jtcyh3LCB0aGlzLmF4aXMpKSkpO1xuICB9XG5cbiAgZ2V0Q29uZmlnKCk6IHNlcmlhbGl6YXRpb24uQ29uZmlnRGljdCB7XG4gICAgcmV0dXJuIHtheGlzOiB0aGlzLmF4aXN9O1xuICB9XG59XG5zZXJpYWxpemF0aW9uLnJlZ2lzdGVyQ2xhc3MoVW5pdE5vcm0pO1xuXG5leHBvcnQgY2xhc3MgTm9uTmVnIGV4dGVuZHMgQ29uc3RyYWludCB7XG4gIC8qKiBAbm9jb2xsYXBzZSAqL1xuICBzdGF0aWMgcmVhZG9ubHkgY2xhc3NOYW1lID0gJ05vbk5lZyc7XG5cbiAgYXBwbHkodzogVGVuc29yKTogVGVuc29yIHtcbiAgICByZXR1cm4gdGZjLnJlbHUodyk7XG4gIH1cbn1cbnNlcmlhbGl6YXRpb24ucmVnaXN0ZXJDbGFzcyhOb25OZWcpO1xuXG5leHBvcnQgaW50ZXJmYWNlIE1pbk1heE5vcm1BcmdzIHtcbiAgLyoqXG4gICAqIE1pbmltdW0gbm9ybSBmb3IgaW5jb21pbmcgd2VpZ2h0c1xuICAgKi9cbiAgbWluVmFsdWU/OiBudW1iZXI7XG4gIC8qKlxuICAgKiBNYXhpbXVtIG5vcm0gZm9yIGluY29taW5nIHdlaWdodHNcbiAgICovXG4gIG1heFZhbHVlPzogbnVtYmVyO1xuICAvKipcbiAgICogQXhpcyBhbG9uZyB3aGljaCB0byBjYWxjdWxhdGUgbm9ybXMuXG4gICAqIEZvciBpbnN0YW5jZSwgaW4gYSBgRGVuc2VgIGxheWVyIHRoZSB3ZWlnaHQgbWF0cml4XG4gICAqIGhhcyBzaGFwZSBgW2lucHV0RGltLCBvdXRwdXREaW1dYCxcbiAgICogc2V0IGBheGlzYCB0byBgMGAgdG8gY29uc3RyYWluIGVhY2ggd2VpZ2h0IHZlY3RvclxuICAgKiBvZiBsZW5ndGggYFtpbnB1dERpbSxdYC5cbiAgICogSW4gYSBgQ29udjJEYCBsYXllciB3aXRoIGBkYXRhRm9ybWF0PVwiY2hhbm5lbHNfbGFzdFwiYCxcbiAgICogdGhlIHdlaWdodCB0ZW5zb3IgaGFzIHNoYXBlXG4gICAqIGBbcm93cywgY29scywgaW5wdXREZXB0aCwgb3V0cHV0RGVwdGhdYCxcbiAgICogc2V0IGBheGlzYCB0byBgWzAsIDEsIDJdYFxuICAgKiB0byBjb25zdHJhaW4gdGhlIHdlaWdodHMgb2YgZWFjaCBmaWx0ZXIgdGVuc29yIG9mIHNpemVcbiAgICogYFtyb3dzLCBjb2xzLCBpbnB1dERlcHRoXWAuXG4gICAqL1xuICBheGlzPzogbnVtYmVyO1xuICAvKipcbiAgICogUmF0ZSBmb3IgZW5mb3JjaW5nIHRoZSBjb25zdHJhaW50OiB3ZWlnaHRzIHdpbGwgYmUgcmVzY2FsZWQgdG8geWllbGQ6XG4gICAqIGAoMSAtIHJhdGUpICogbm9ybSArIHJhdGUgKiBub3JtLmNsaXAobWluVmFsdWUsIG1heFZhbHVlKWAuXG4gICAqIEVmZmVjdGl2ZWx5LCB0aGlzIG1lYW5zIHRoYXQgcmF0ZT0xLjAgc3RhbmRzIGZvciBzdHJpY3RcbiAgICogZW5mb3JjZW1lbnQgb2YgdGhlIGNvbnN0cmFpbnQsIHdoaWxlIHJhdGU8MS4wIG1lYW5zIHRoYXRcbiAgICogd2VpZ2h0cyB3aWxsIGJlIHJlc2NhbGVkIGF0IGVhY2ggc3RlcCB0byBzbG93bHkgbW92ZVxuICAgKiB0b3dhcmRzIGEgdmFsdWUgaW5zaWRlIHRoZSBkZXNpcmVkIGludGVydmFsLlxuICAgKi9cbiAgcmF0ZT86IG51bWJlcjtcbn1cblxuZXhwb3J0IGNsYXNzIE1pbk1heE5vcm0gZXh0ZW5kcyBDb25zdHJhaW50IHtcbiAgLyoqIEBub2NvbGxhcHNlICovXG4gIHN0YXRpYyByZWFkb25seSBjbGFzc05hbWUgPSAnTWluTWF4Tm9ybSc7XG4gIHByaXZhdGUgbWluVmFsdWU6IG51bWJlcjtcbiAgcHJpdmF0ZSBtYXhWYWx1ZTogbnVtYmVyO1xuICBwcml2YXRlIHJhdGU6IG51bWJlcjtcbiAgcHJpdmF0ZSBheGlzOiBudW1iZXI7XG4gIHByaXZhdGUgcmVhZG9ubHkgZGVmYXVsdE1pblZhbHVlID0gMC4wO1xuICBwcml2YXRlIHJlYWRvbmx5IGRlZmF1bHRNYXhWYWx1ZSA9IDEuMDtcbiAgcHJpdmF0ZSByZWFkb25seSBkZWZhdWx0UmF0ZSA9IDEuMDtcbiAgcHJpdmF0ZSByZWFkb25seSBkZWZhdWx0QXhpcyA9IDA7XG5cbiAgY29uc3RydWN0b3IoYXJnczogTWluTWF4Tm9ybUFyZ3MpIHtcbiAgICBzdXBlcigpO1xuICAgIHRoaXMubWluVmFsdWUgPVxuICAgICAgICBhcmdzLm1pblZhbHVlICE9IG51bGwgPyBhcmdzLm1pblZhbHVlIDogdGhpcy5kZWZhdWx0TWluVmFsdWU7XG4gICAgdGhpcy5tYXhWYWx1ZSA9XG4gICAgICAgIGFyZ3MubWF4VmFsdWUgIT0gbnVsbCA/IGFyZ3MubWF4VmFsdWUgOiB0aGlzLmRlZmF1bHRNYXhWYWx1ZTtcbiAgICB0aGlzLnJhdGUgPSBhcmdzLnJhdGUgIT0gbnVsbCA/IGFyZ3MucmF0ZSA6IHRoaXMuZGVmYXVsdFJhdGU7XG4gICAgdGhpcy5heGlzID0gYXJncy5heGlzICE9IG51bGwgPyBhcmdzLmF4aXMgOiB0aGlzLmRlZmF1bHRBeGlzO1xuICB9XG5cbiAgYXBwbHkodzogVGVuc29yKTogVGVuc29yIHtcbiAgICByZXR1cm4gdGlkeSgoKSA9PiB7XG4gICAgICBjb25zdCBub3JtcyA9IGNhbGNMMk5vcm1zKHcsIHRoaXMuYXhpcyk7XG4gICAgICBjb25zdCBkZXNpcmVkID0gdGZjLmFkZChcbiAgICAgICAgICB0ZmMubXVsKFxuICAgICAgICAgICAgICB0aGlzLnJhdGUsIHRmYy5jbGlwQnlWYWx1ZShub3JtcywgdGhpcy5taW5WYWx1ZSwgdGhpcy5tYXhWYWx1ZSkpLFxuICAgICAgICAgIHRmYy5tdWwoMS4wIC0gdGhpcy5yYXRlLCBub3JtcykpO1xuICAgICAgcmV0dXJuIHRmYy5tdWwodywgdGZjLmRpdihkZXNpcmVkLCB0ZmMuYWRkKGVwc2lsb24oKSwgbm9ybXMpKSk7XG4gICAgfSk7XG4gIH1cblxuICBnZXRDb25maWcoKTogc2VyaWFsaXphdGlvbi5Db25maWdEaWN0IHtcbiAgICByZXR1cm4ge1xuICAgICAgbWluVmFsdWU6IHRoaXMubWluVmFsdWUsXG4gICAgICBtYXhWYWx1ZTogdGhpcy5tYXhWYWx1ZSxcbiAgICAgIHJhdGU6IHRoaXMucmF0ZSxcbiAgICAgIGF4aXM6IHRoaXMuYXhpc1xuICAgIH07XG4gIH1cbn1cbnNlcmlhbGl6YXRpb24ucmVnaXN0ZXJDbGFzcyhNaW5NYXhOb3JtKTtcblxuLyoqIEBkb2NpbmxpbmUgKi9cbmV4cG9ydCB0eXBlIENvbnN0cmFpbnRJZGVudGlmaWVyID1cbiAgICAnbWF4Tm9ybSd8J21pbk1heE5vcm0nfCdub25OZWcnfCd1bml0Tm9ybSd8c3RyaW5nO1xuXG4vLyBNYXBzIHRoZSBKYXZhU2NyaXB0LWxpa2UgaWRlbnRpZmllciBrZXlzIHRvIHRoZSBjb3JyZXNwb25kaW5nIHJlZ2lzdHJ5XG4vLyBzeW1ib2xzLlxuZXhwb3J0IGNvbnN0IENPTlNUUkFJTlRfSURFTlRJRklFUl9SRUdJU1RSWV9TWU1CT0xfTUFQOlxuICAgIHtbaWRlbnRpZmllciBpbiBDb25zdHJhaW50SWRlbnRpZmllcl06IHN0cmluZ30gPSB7XG4gICAgICAnbWF4Tm9ybSc6ICdNYXhOb3JtJyxcbiAgICAgICdtaW5NYXhOb3JtJzogJ01pbk1heE5vcm0nLFxuICAgICAgJ25vbk5lZyc6ICdOb25OZWcnLFxuICAgICAgJ3VuaXROb3JtJzogJ1VuaXROb3JtJ1xuICAgIH07XG5cbmV4cG9ydCBmdW5jdGlvbiBzZXJpYWxpemVDb25zdHJhaW50KGNvbnN0cmFpbnQ6IENvbnN0cmFpbnQpOlxuICAgIHNlcmlhbGl6YXRpb24uQ29uZmlnRGljdFZhbHVlIHtcbiAgcmV0dXJuIHNlcmlhbGl6ZUtlcmFzT2JqZWN0KGNvbnN0cmFpbnQpO1xufVxuXG5leHBvcnQgZnVuY3Rpb24gZGVzZXJpYWxpemVDb25zdHJhaW50KFxuICAgIGNvbmZpZzogc2VyaWFsaXphdGlvbi5Db25maWdEaWN0LFxuICAgIGN1c3RvbU9iamVjdHM6IHNlcmlhbGl6YXRpb24uQ29uZmlnRGljdCA9IHt9KTogQ29uc3RyYWludCB7XG4gIHJldHVybiBkZXNlcmlhbGl6ZUtlcmFzT2JqZWN0KFxuICAgICAgY29uZmlnLCBzZXJpYWxpemF0aW9uLlNlcmlhbGl6YXRpb25NYXAuZ2V0TWFwKCkuY2xhc3NOYW1lTWFwLFxuICAgICAgY3VzdG9tT2JqZWN0cywgJ2NvbnN0cmFpbnQnKTtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGdldENvbnN0cmFpbnQoaWRlbnRpZmllcjogQ29uc3RyYWludElkZW50aWZpZXJ8XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZXJpYWxpemF0aW9uLkNvbmZpZ0RpY3R8Q29uc3RyYWludCk6IENvbnN0cmFpbnQge1xuICBpZiAoaWRlbnRpZmllciA9PSBudWxsKSB7XG4gICAgcmV0dXJuIG51bGw7XG4gIH1cbiAgaWYgKHR5cGVvZiBpZGVudGlmaWVyID09PSAnc3RyaW5nJykge1xuICAgIGNvbnN0IGNsYXNzTmFtZSA9IGlkZW50aWZpZXIgaW4gQ09OU1RSQUlOVF9JREVOVElGSUVSX1JFR0lTVFJZX1NZTUJPTF9NQVAgP1xuICAgICAgICBDT05TVFJBSU5UX0lERU5USUZJRVJfUkVHSVNUUllfU1lNQk9MX01BUFtpZGVudGlmaWVyXSA6XG4gICAgICAgIGlkZW50aWZpZXI7XG4gICAgY29uc3QgY29uZmlnID0ge2NsYXNzTmFtZSwgY29uZmlnOiB7fX07XG4gICAgcmV0dXJuIGRlc2VyaWFsaXplQ29uc3RyYWludChjb25maWcpO1xuICB9IGVsc2UgaWYgKGlkZW50aWZpZXIgaW5zdGFuY2VvZiBDb25zdHJhaW50KSB7XG4gICAgcmV0dXJuIGlkZW50aWZpZXI7XG4gIH0gZWxzZSB7XG4gICAgcmV0dXJuIGRlc2VyaWFsaXplQ29uc3RyYWludChpZGVudGlmaWVyKTtcbiAgfVxufVxuIl19","/**\n * @license\n * Copyright 2022 Google LLC. All Rights Reserved.\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n * =============================================================================\n */\nimport { env } from '@tensorflow/tfjs-core';\nimport { updateCacheMaxEntries } from './engine/executor';\nexport const ENV = env();\n/** The max number of entries for the caches of layers' topological sort. */\nENV.registerFlag('TOPOLOGICAL_SORT_CACHE_MAX_ENTRIES', () => 100, updateCacheMaxEntries);\n//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZmxhZ3NfbGF5ZXJzLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vdGZqcy1sYXllcnMvc3JjL2ZsYWdzX2xheWVycy50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQTs7Ozs7Ozs7Ozs7Ozs7O0dBZUc7QUFFSCxPQUFPLEVBQUMsR0FBRyxFQUFDLE1BQU0sdUJBQXVCLENBQUM7QUFFMUMsT0FBTyxFQUFDLHFCQUFxQixFQUFDLE1BQU0sbUJBQW1CLENBQUM7QUFFeEQsTUFBTSxDQUFDLE1BQU0sR0FBRyxHQUFHLEdBQUcsRUFBRSxDQUFDO0FBRXpCLDRFQUE0RTtBQUM1RSxHQUFHLENBQUMsWUFBWSxDQUNaLG9DQUFvQyxFQUFFLEdBQUcsRUFBRSxDQUFDLEdBQUcsRUFBRSxxQkFBcUIsQ0FBQyxDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiLyoqXG4gKiBAbGljZW5zZVxuICogQ29weXJpZ2h0IDIwMjIgR29vZ2xlIExMQy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC5cbiAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSBcIkxpY2Vuc2VcIik7XG4gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuXG4gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXRcbiAqXG4gKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjBcbiAqXG4gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlXG4gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiBcIkFTIElTXCIgQkFTSVMsXG4gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC5cbiAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmRcbiAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLlxuICogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbiAqL1xuXG5pbXBvcnQge2Vudn0gZnJvbSAnQHRlbnNvcmZsb3cvdGZqcy1jb3JlJztcblxuaW1wb3J0IHt1cGRhdGVDYWNoZU1heEVudHJpZXN9IGZyb20gJy4vZW5naW5lL2V4ZWN1dG9yJztcblxuZXhwb3J0IGNvbnN0IEVOViA9IGVudigpO1xuXG4vKiogVGhlIG1heCBudW1iZXIgb2YgZW50cmllcyBmb3IgdGhlIGNhY2hlcyBvZiBsYXllcnMnIHRvcG9sb2dpY2FsIHNvcnQuICovXG5FTlYucmVnaXN0ZXJGbGFnKFxuICAgICdUT1BPTE9HSUNBTF9TT1JUX0NBQ0hFX01BWF9FTlRSSUVTJywgKCkgPT4gMTAwLCB1cGRhdGVDYWNoZU1heEVudHJpZXMpO1xuIl19","/**\n * @license\n * Copyright 2018 Google LLC\n *\n * Use of this source code is governed by an MIT-style\n * license that can be found in the LICENSE file or at\n * https://opensource.org/licenses/MIT.\n * =============================================================================\n */\n// tslint:disable-next-line:max-line-length\nimport { MaxNorm, MinMaxNorm, NonNeg, UnitNorm } from './constraints';\n/**\n * MaxNorm weight constraint.\n *\n * Constrains the weights incident to each hidden unit\n * to have a norm less than or equal to a desired value.\n *\n * References\n * - [Dropout: A Simple Way to Prevent Neural Networks from Overfitting\n * Srivastava, Hinton, et al.\n * 2014](http://www.cs.toronto.edu/~rsalakhu/papers/srivastava14a.pdf)\n *\n * @doc {heading: 'Constraints',namespace: 'constraints'}\n */\nexport function maxNorm(args) {\n return new MaxNorm(args);\n}\n/**\n * Constrains the weights incident to each hidden unit to have unit norm.\n *\n * @doc {heading: 'Constraints', namespace: 'constraints'}\n */\nexport function unitNorm(args) {\n return new UnitNorm(args);\n}\n/**\n * Constrains the weight to be non-negative.\n *\n * @doc {heading: 'Constraints', namespace: 'constraints'}\n */\nexport function nonNeg() {\n return new NonNeg();\n}\n/** @doc {heading: 'Constraints', namespace: 'constraints'} */\nexport function minMaxNorm(config) {\n return new MinMaxNorm(config);\n}\n//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZXhwb3J0c19jb25zdHJhaW50cy5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uL3RmanMtbGF5ZXJzL3NyYy9leHBvcnRzX2NvbnN0cmFpbnRzLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBOzs7Ozs7OztHQVFHO0FBQ0gsMkNBQTJDO0FBQzNDLE9BQU8sRUFBYSxPQUFPLEVBQWUsVUFBVSxFQUFrQixNQUFNLEVBQUUsUUFBUSxFQUFlLE1BQU0sZUFBZSxDQUFDO0FBRTNIOzs7Ozs7Ozs7Ozs7R0FZRztBQUNILE1BQU0sVUFBVSxPQUFPLENBQUMsSUFBaUI7SUFDdkMsT0FBTyxJQUFJLE9BQU8sQ0FBQyxJQUFJLENBQUMsQ0FBQztBQUMzQixDQUFDO0FBRUQ7Ozs7R0FJRztBQUNILE1BQU0sVUFBVSxRQUFRLENBQUMsSUFBa0I7SUFDekMsT0FBTyxJQUFJLFFBQVEsQ0FBQyxJQUFJLENBQUMsQ0FBQztBQUM1QixDQUFDO0FBRUQ7Ozs7R0FJRztBQUNILE1BQU0sVUFBVSxNQUFNO0lBQ3BCLE9BQU8sSUFBSSxNQUFNLEVBQUUsQ0FBQztBQUN0QixDQUFDO0FBRUQsOERBQThEO0FBQzlELE1BQU0sVUFBVSxVQUFVLENBQUMsTUFBc0I7SUFDL0MsT0FBTyxJQUFJLFVBQVUsQ0FBQyxNQUFNLENBQUMsQ0FBQztBQUNoQyxDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiLyoqXG4gKiBAbGljZW5zZVxuICogQ29weXJpZ2h0IDIwMTggR29vZ2xlIExMQ1xuICpcbiAqIFVzZSBvZiB0aGlzIHNvdXJjZSBjb2RlIGlzIGdvdmVybmVkIGJ5IGFuIE1JVC1zdHlsZVxuICogbGljZW5zZSB0aGF0IGNhbiBiZSBmb3VuZCBpbiB0aGUgTElDRU5TRSBmaWxlIG9yIGF0XG4gKiBodHRwczovL29wZW5zb3VyY2Uub3JnL2xpY2Vuc2VzL01JVC5cbiAqID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4gKi9cbi8vIHRzbGludDpkaXNhYmxlLW5leHQtbGluZTptYXgtbGluZS1sZW5ndGhcbmltcG9ydCB7Q29uc3RyYWludCwgTWF4Tm9ybSwgTWF4Tm9ybUFyZ3MsIE1pbk1heE5vcm0sIE1pbk1heE5vcm1BcmdzLCBOb25OZWcsIFVuaXROb3JtLCBVbml0Tm9ybUFyZ3N9IGZyb20gJy4vY29uc3RyYWludHMnO1xuXG4vKipcbiAqIE1heE5vcm0gd2VpZ2h0IGNvbnN0cmFpbnQuXG4gKlxuICogQ29uc3RyYWlucyB0aGUgd2VpZ2h0cyBpbmNpZGVudCB0byBlYWNoIGhpZGRlbiB1bml0XG4gKiB0byBoYXZlIGEgbm9ybSBsZXNzIHRoYW4gb3IgZXF1YWwgdG8gYSBkZXNpcmVkIHZhbHVlLlxuICpcbiAqIFJlZmVyZW5jZXNcbiAqICAgICAgIC0gW0Ryb3BvdXQ6IEEgU2ltcGxlIFdheSB0byBQcmV2ZW50IE5ldXJhbCBOZXR3b3JrcyBmcm9tIE92ZXJmaXR0aW5nXG4gKiBTcml2YXN0YXZhLCBIaW50b24sIGV0IGFsLlxuICogMjAxNF0oaHR0cDovL3d3dy5jcy50b3JvbnRvLmVkdS9+cnNhbGFraHUvcGFwZXJzL3NyaXZhc3RhdmExNGEucGRmKVxuICpcbiAqIEBkb2Mge2hlYWRpbmc6ICdDb25zdHJhaW50cycsbmFtZXNwYWNlOiAnY29uc3RyYWludHMnfVxuICovXG5leHBvcnQgZnVuY3Rpb24gbWF4Tm9ybShhcmdzOiBNYXhOb3JtQXJncyk6IENvbnN0cmFpbnQge1xuICByZXR1cm4gbmV3IE1heE5vcm0oYXJncyk7XG59XG5cbi8qKlxuICogQ29uc3RyYWlucyB0aGUgd2VpZ2h0cyBpbmNpZGVudCB0byBlYWNoIGhpZGRlbiB1bml0IHRvIGhhdmUgdW5pdCBub3JtLlxuICpcbiAqIEBkb2Mge2hlYWRpbmc6ICdDb25zdHJhaW50cycsIG5hbWVzcGFjZTogJ2NvbnN0cmFpbnRzJ31cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHVuaXROb3JtKGFyZ3M6IFVuaXROb3JtQXJncyk6IENvbnN0cmFpbnQge1xuICByZXR1cm4gbmV3IFVuaXROb3JtKGFyZ3MpO1xufVxuXG4vKipcbiAqIENvbnN0cmFpbnMgdGhlIHdlaWdodCB0byBiZSBub24tbmVnYXRpdmUuXG4gKlxuICogQGRvYyB7aGVhZGluZzogJ0NvbnN0cmFpbnRzJywgbmFtZXNwYWNlOiAnY29uc3RyYWludHMnfVxuICovXG5leHBvcnQgZnVuY3Rpb24gbm9uTmVnKCk6IENvbnN0cmFpbnQge1xuICByZXR1cm4gbmV3IE5vbk5lZygpO1xufVxuXG4vKiogQGRvYyB7aGVhZGluZzogJ0NvbnN0cmFpbnRzJywgbmFtZXNwYWNlOiAnY29uc3RyYWludHMnfSAqL1xuZXhwb3J0IGZ1bmN0aW9uIG1pbk1heE5vcm0oY29uZmlnOiBNaW5NYXhOb3JtQXJncyk6IENvbnN0cmFpbnQge1xuICByZXR1cm4gbmV3IE1pbk1heE5vcm0oY29uZmlnKTtcbn1cbiJdfQ==","/**\n * @license\n * Copyright 2018 Google LLC\n *\n * Use of this source code is governed by an MIT-style\n * license that can be found in the LICENSE file or at\n * https://opensource.org/licenses/MIT.\n * =============================================================================\n */\n// tslint:disable-next-line:max-line-length\nimport { Constant, GlorotNormal, GlorotUniform, HeNormal, HeUniform, Identity, LeCunNormal, LeCunUniform, Ones, Orthogonal, RandomNormal, RandomUniform, TruncatedNormal, VarianceScaling, Zeros } from './initializers';\n/**\n * Initializer that generates tensors initialized to 0.\n *\n * @doc {heading: 'Initializers', namespace: 'initializers'}\n */\nexport function zeros() {\n return new Zeros();\n}\n/**\n * Initializer that generates tensors initialized to 1.\n *\n * @doc {heading: 'Initializers', namespace: 'initializers'}\n */\nexport function ones() {\n return new Ones();\n}\n/**\n * Initializer that generates values initialized to some constant.\n *\n * @doc {heading: 'Initializers', namespace: 'initializers'}\n */\nexport function constant(args) {\n return new Constant(args);\n}\n/**\n * Initializer that generates random values initialized to a uniform\n * distribution.\n *\n * Values will be distributed uniformly between the configured minval and\n * maxval.\n *\n * @doc {heading: 'Initializers', namespace: 'initializers'}\n */\nexport function randomUniform(args) {\n return new RandomUniform(args);\n}\n/**\n * Initializer that generates random values initialized to a normal\n * distribution.\n *\n * @doc {heading: 'Initializers', namespace: 'initializers'}\n */\nexport function randomNormal(args) {\n return new RandomNormal(args);\n}\n/**\n * Initializer that generates random values initialized to a truncated normal\n * distribution.\n *\n * These values are similar to values from a `RandomNormal` except that values\n * more than two standard deviations from the mean are discarded and re-drawn.\n * This is the recommended initializer for neural network weights and filters.\n *\n * @doc {heading: 'Initializers', namespace: 'initializers'}\n */\nexport function truncatedNormal(args) {\n return new TruncatedNormal(args);\n}\n/**\n * Initializer that generates the identity matrix.\n * Only use for square 2D matrices.\n *\n * @doc {heading: 'Initializers', namespace: 'initializers'}\n */\nexport function identity(args) {\n return new Identity(args);\n}\n/**\n * Initializer capable of adapting its scale to the shape of weights.\n * With distribution=NORMAL, samples are drawn from a truncated normal\n * distribution centered on zero, with `stddev = sqrt(scale / n)` where n is:\n * - number of input units in the weight tensor, if mode = FAN_IN.\n * - number of output units, if mode = FAN_OUT.\n * - average of the numbers of input and output units, if mode = FAN_AVG.\n * With distribution=UNIFORM,\n * samples are drawn from a uniform distribution\n * within [-limit, limit], with `limit = sqrt(3 * scale / n)`.\n *\n * @doc {heading: 'Initializers',namespace: 'initializers'}\n */\nexport function varianceScaling(config) {\n return new VarianceScaling(config);\n}\n/**\n * Glorot uniform initializer, also called Xavier uniform initializer.\n * It draws samples from a uniform distribution within [-limit, limit]\n * where `limit` is `sqrt(6 / (fan_in + fan_out))`\n * where `fan_in` is the number of input units in the weight tensor\n * and `fan_out` is the number of output units in the weight tensor\n *\n * Reference:\n * Glorot & Bengio, AISTATS 2010\n * http://jmlr.org/proceedings/papers/v9/glorot10a/glorot10a.pdf.\n *\n * @doc {heading: 'Initializers', namespace: 'initializers'}\n */\nexport function glorotUniform(args) {\n return new GlorotUniform(args);\n}\n/**\n * Glorot normal initializer, also called Xavier normal initializer.\n * It draws samples from a truncated normal distribution centered on 0\n * with `stddev = sqrt(2 / (fan_in + fan_out))`\n * where `fan_in` is the number of input units in the weight tensor\n * and `fan_out` is the number of output units in the weight tensor.\n *\n * Reference:\n * Glorot & Bengio, AISTATS 2010\n * http://jmlr.org/proceedings/papers/v9/glorot10a/glorot10a.pdf\n *\n * @doc {heading: 'Initializers', namespace: 'initializers'}\n */\nexport function glorotNormal(args) {\n return new GlorotNormal(args);\n}\n/**\n * He normal initializer.\n *\n * It draws samples from a truncated normal distribution centered on 0\n * with `stddev = sqrt(2 / fanIn)`\n * where `fanIn` is the number of input units in the weight tensor.\n *\n * Reference:\n * He et al., http://arxiv.org/abs/1502.01852\n *\n * @doc {heading: 'Initializers', namespace: 'initializers'}\n */\nexport function heNormal(args) {\n return new HeNormal(args);\n}\n/**\n * He uniform initializer.\n *\n * It draws samples from a uniform distribution within [-limit, limit]\n * where `limit` is `sqrt(6 / fan_in)`\n * where `fanIn` is the number of input units in the weight tensor.\n *\n * Reference:\n * He et al., http://arxiv.org/abs/1502.01852\n *\n * @doc {heading: 'Initializers',namespace: 'initializers'}\n */\nexport function heUniform(args) {\n return new HeUniform(args);\n}\n/**\n * LeCun normal initializer.\n *\n * It draws samples from a truncated normal distribution centered on 0\n * with `stddev = sqrt(1 / fanIn)`\n * where `fanIn` is the number of input units in the weight tensor.\n *\n * References:\n * [Self-Normalizing Neural Networks](https://arxiv.org/abs/1706.02515)\n * [Efficient Backprop](http://yann.lecun.com/exdb/publis/pdf/lecun-98b.pdf)\n *\n * @doc {heading: 'Initializers', namespace: 'initializers'}\n */\nexport function leCunNormal(args) {\n return new LeCunNormal(args);\n}\n/**\n * LeCun uniform initializer.\n *\n * It draws samples from a uniform distribution in the interval\n * `[-limit, limit]` with `limit = sqrt(3 / fanIn)`,\n * where `fanIn` is the number of input units in the weight tensor.\n *\n * @doc {heading: 'Initializers', namespace: 'initializers'}\n */\nexport function leCunUniform(args) {\n return new LeCunUniform(args);\n}\n/**\n * Initializer that generates a random orthogonal matrix.\n *\n * Reference:\n * [Saxe et al., http://arxiv.org/abs/1312.6120](http://arxiv.org/abs/1312.6120)\n *\n * @doc {heading: 'Initializers', namespace: 'initializers'}\n */\nexport function orthogonal(args) {\n return new Orthogonal(args);\n}\n//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZXhwb3J0c19pbml0aWFsaXplcnMuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi90ZmpzLWxheWVycy9zcmMvZXhwb3J0c19pbml0aWFsaXplcnMudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUE7Ozs7Ozs7O0dBUUc7QUFDSCwyQ0FBMkM7QUFDM0MsT0FBTyxFQUFDLFFBQVEsRUFBZ0IsWUFBWSxFQUFFLGFBQWEsRUFBRSxRQUFRLEVBQUUsU0FBUyxFQUFFLFFBQVEsRUFBNkIsV0FBVyxFQUFFLFlBQVksRUFBRSxJQUFJLEVBQUUsVUFBVSxFQUFrQixZQUFZLEVBQW9CLGFBQWEsRUFBOEMsZUFBZSxFQUF1QixlQUFlLEVBQXVCLEtBQUssRUFBQyxNQUFNLGdCQUFnQixDQUFDO0FBRXhYOzs7O0dBSUc7QUFDSCxNQUFNLFVBQVUsS0FBSztJQUNuQixPQUFPLElBQUksS0FBSyxFQUFFLENBQUM7QUFDckIsQ0FBQztBQUVEOzs7O0dBSUc7QUFDSCxNQUFNLFVBQVUsSUFBSTtJQUNsQixPQUFPLElBQUksSUFBSSxFQUFFLENBQUM7QUFDcEIsQ0FBQztBQUVEOzs7O0dBSUc7QUFDSCxNQUFNLFVBQVUsUUFBUSxDQUFDLElBQWtCO0lBQ3pDLE9BQU8sSUFBSSxRQUFRLENBQUMsSUFBSSxDQUFDLENBQUM7QUFDNUIsQ0FBQztBQUVEOzs7Ozs7OztHQVFHO0FBQ0gsTUFBTSxVQUFVLGFBQWEsQ0FBQyxJQUF1QjtJQUNuRCxPQUFPLElBQUksYUFBYSxDQUFDLElBQUksQ0FBQyxDQUFDO0FBQ2pDLENBQUM7QUFFRDs7Ozs7R0FLRztBQUNILE1BQU0sVUFBVSxZQUFZLENBQUMsSUFBc0I7SUFDakQsT0FBTyxJQUFJLFlBQVksQ0FBQyxJQUFJLENBQUMsQ0FBQztBQUNoQyxDQUFDO0FBRUQ7Ozs7Ozs7OztHQVNHO0FBQ0gsTUFBTSxVQUFVLGVBQWUsQ0FBQyxJQUF5QjtJQUN2RCxPQUFPLElBQUksZUFBZSxDQUFDLElBQUksQ0FBQyxDQUFDO0FBQ25DLENBQUM7QUFFRDs7Ozs7R0FLRztBQUNILE1BQU0sVUFBVSxRQUFRLENBQUMsSUFBa0I7SUFDekMsT0FBTyxJQUFJLFFBQVEsQ0FBQyxJQUFJLENBQUMsQ0FBQztBQUM1QixDQUFDO0FBRUQ7Ozs7Ozs7Ozs7OztHQVlHO0FBQ0gsTUFBTSxVQUFVLGVBQWUsQ0FBQyxNQUEyQjtJQUN6RCxPQUFPLElBQUksZUFBZSxDQUFDLE1BQU0sQ0FBQyxDQUFDO0FBQ3JDLENBQUM7QUFFRDs7Ozs7Ozs7Ozs7O0dBWUc7QUFDSCxNQUFNLFVBQVUsYUFBYSxDQUFDLElBQTZCO0lBQ3pELE9BQU8sSUFBSSxhQUFhLENBQUMsSUFBSSxDQUFDLENBQUM7QUFDakMsQ0FBQztBQUVEOzs7Ozs7Ozs7Ozs7R0FZRztBQUNILE1BQU0sVUFBVSxZQUFZLENBQUMsSUFBNkI7SUFDeEQsT0FBTyxJQUFJLFlBQVksQ0FBQyxJQUFJLENBQUMsQ0FBQztBQUNoQyxDQUFDO0FBRUQ7Ozs7Ozs7Ozs7O0dBV0c7QUFDSCxNQUFNLFVBQVUsUUFBUSxDQUFDLElBQTZCO0lBQ3BELE9BQU8sSUFBSSxRQUFRLENBQUMsSUFBSSxDQUFDLENBQUM7QUFDNUIsQ0FBQztBQUVEOzs7Ozs7Ozs7OztHQVdHO0FBQ0gsTUFBTSxVQUFVLFNBQVMsQ0FBQyxJQUE2QjtJQUNyRCxPQUFPLElBQUksU0FBUyxDQUFDLElBQUksQ0FBQyxDQUFDO0FBQzdCLENBQUM7QUFFRDs7Ozs7Ozs7Ozs7O0dBWUc7QUFDSCxNQUFNLFVBQVUsV0FBVyxDQUFDLElBQTZCO0lBQ3ZELE9BQU8sSUFBSSxXQUFXLENBQUMsSUFBSSxDQUFDLENBQUM7QUFDL0IsQ0FBQztBQUVEOzs7Ozs7OztHQVFHO0FBQ0gsTUFBTSxVQUFVLFlBQVksQ0FBQyxJQUE2QjtJQUN4RCxPQUFPLElBQUksWUFBWSxDQUFDLElBQUksQ0FBQyxDQUFDO0FBQ2hDLENBQUM7QUFFRDs7Ozs7OztHQU9HO0FBQ0gsTUFBTSxVQUFVLFVBQVUsQ0FBQyxJQUFvQjtJQUM3QyxPQUFPLElBQUksVUFBVSxDQUFDLElBQUksQ0FBQyxDQUFDO0FBQzlCLENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyIvKipcbiAqIEBsaWNlbnNlXG4gKiBDb3B5cmlnaHQgMjAxOCBHb29nbGUgTExDXG4gKlxuICogVXNlIG9mIHRoaXMgc291cmNlIGNvZGUgaXMgZ292ZXJuZWQgYnkgYW4gTUlULXN0eWxlXG4gKiBsaWNlbnNlIHRoYXQgY2FuIGJlIGZvdW5kIGluIHRoZSBMSUNFTlNFIGZpbGUgb3IgYXRcbiAqIGh0dHBzOi8vb3BlbnNvdXJjZS5vcmcvbGljZW5zZXMvTUlULlxuICogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbiAqL1xuLy8gdHNsaW50OmRpc2FibGUtbmV4dC1saW5lOm1heC1saW5lLWxlbmd0aFxuaW1wb3J0IHtDb25zdGFudCwgQ29uc3RhbnRBcmdzLCBHbG9yb3ROb3JtYWwsIEdsb3JvdFVuaWZvcm0sIEhlTm9ybWFsLCBIZVVuaWZvcm0sIElkZW50aXR5LCBJZGVudGl0eUFyZ3MsIEluaXRpYWxpemVyLCBMZUN1bk5vcm1hbCwgTGVDdW5Vbmlmb3JtLCBPbmVzLCBPcnRob2dvbmFsLCBPcnRob2dvbmFsQXJncywgUmFuZG9tTm9ybWFsLCBSYW5kb21Ob3JtYWxBcmdzLCBSYW5kb21Vbmlmb3JtLCBSYW5kb21Vbmlmb3JtQXJncywgU2VlZE9ubHlJbml0aWFsaXplckFyZ3MsIFRydW5jYXRlZE5vcm1hbCwgVHJ1bmNhdGVkTm9ybWFsQXJncywgVmFyaWFuY2VTY2FsaW5nLCBWYXJpYW5jZVNjYWxpbmdBcmdzLCBaZXJvc30gZnJvbSAnLi9pbml0aWFsaXplcnMnO1xuXG4vKipcbiAqIEluaXRpYWxpemVyIHRoYXQgZ2VuZXJhdGVzIHRlbnNvcnMgaW5pdGlhbGl6ZWQgdG8gMC5cbiAqXG4gKiBAZG9jIHtoZWFkaW5nOiAnSW5pdGlhbGl6ZXJzJywgbmFtZXNwYWNlOiAnaW5pdGlhbGl6ZXJzJ31cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHplcm9zKCk6IFplcm9zIHtcbiAgcmV0dXJuIG5ldyBaZXJvcygpO1xufVxuXG4vKipcbiAqIEluaXRpYWxpemVyIHRoYXQgZ2VuZXJhdGVzIHRlbnNvcnMgaW5pdGlhbGl6ZWQgdG8gMS5cbiAqXG4gKiBAZG9jIHtoZWFkaW5nOiAnSW5pdGlhbGl6ZXJzJywgbmFtZXNwYWNlOiAnaW5pdGlhbGl6ZXJzJ31cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIG9uZXMoKTogSW5pdGlhbGl6ZXIge1xuICByZXR1cm4gbmV3IE9uZXMoKTtcbn1cblxuLyoqXG4gKiBJbml0aWFsaXplciB0aGF0IGdlbmVyYXRlcyB2YWx1ZXMgaW5pdGlhbGl6ZWQgdG8gc29tZSBjb25zdGFudC5cbiAqXG4gKiBAZG9jIHtoZWFkaW5nOiAnSW5pdGlhbGl6ZXJzJywgbmFtZXNwYWNlOiAnaW5pdGlhbGl6ZXJzJ31cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGNvbnN0YW50KGFyZ3M6IENvbnN0YW50QXJncyk6IEluaXRpYWxpemVyIHtcbiAgcmV0dXJuIG5ldyBDb25zdGFudChhcmdzKTtcbn1cblxuLyoqXG4gKiBJbml0aWFsaXplciB0aGF0IGdlbmVyYXRlcyByYW5kb20gdmFsdWVzIGluaXRpYWxpemVkIHRvIGEgdW5pZm9ybVxuICogZGlzdHJpYnV0aW9uLlxuICpcbiAqIFZhbHVlcyB3aWxsIGJlIGRpc3RyaWJ1dGVkIHVuaWZvcm1seSBiZXR3ZWVuIHRoZSBjb25maWd1cmVkIG1pbnZhbCBhbmRcbiAqIG1heHZhbC5cbiAqXG4gKiBAZG9jIHtoZWFkaW5nOiAnSW5pdGlhbGl6ZXJzJywgbmFtZXNwYWNlOiAnaW5pdGlhbGl6ZXJzJ31cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHJhbmRvbVVuaWZvcm0oYXJnczogUmFuZG9tVW5pZm9ybUFyZ3MpOiBJbml0aWFsaXplciB7XG4gIHJldHVybiBuZXcgUmFuZG9tVW5pZm9ybShhcmdzKTtcbn1cblxuLyoqXG4gKiBJbml0aWFsaXplciB0aGF0IGdlbmVyYXRlcyByYW5kb20gdmFsdWVzIGluaXRpYWxpemVkIHRvIGEgbm9ybWFsXG4gKiBkaXN0cmlidXRpb24uXG4gKlxuICogQGRvYyB7aGVhZGluZzogJ0luaXRpYWxpemVycycsIG5hbWVzcGFjZTogJ2luaXRpYWxpemVycyd9XG4gKi9cbmV4cG9ydCBmdW5jdGlvbiByYW5kb21Ob3JtYWwoYXJnczogUmFuZG9tTm9ybWFsQXJncyk6IEluaXRpYWxpemVyIHtcbiAgcmV0dXJuIG5ldyBSYW5kb21Ob3JtYWwoYXJncyk7XG59XG5cbi8qKlxuICogSW5pdGlhbGl6ZXIgdGhhdCBnZW5lcmF0ZXMgcmFuZG9tIHZhbHVlcyBpbml0aWFsaXplZCB0byBhIHRydW5jYXRlZCBub3JtYWxcbiAqIGRpc3RyaWJ1dGlvbi5cbiAqXG4gKiBUaGVzZSB2YWx1ZXMgYXJlIHNpbWlsYXIgdG8gdmFsdWVzIGZyb20gYSBgUmFuZG9tTm9ybWFsYCBleGNlcHQgdGhhdCB2YWx1ZXNcbiAqIG1vcmUgdGhhbiB0d28gc3RhbmRhcmQgZGV2aWF0aW9ucyBmcm9tIHRoZSBtZWFuIGFyZSBkaXNjYXJkZWQgYW5kIHJlLWRyYXduLlxuICogVGhpcyBpcyB0aGUgcmVjb21tZW5kZWQgaW5pdGlhbGl6ZXIgZm9yIG5ldXJhbCBuZXR3b3JrIHdlaWdodHMgYW5kIGZpbHRlcnMuXG4gKlxuICogQGRvYyB7aGVhZGluZzogJ0luaXRpYWxpemVycycsIG5hbWVzcGFjZTogJ2luaXRpYWxpemVycyd9XG4gKi9cbmV4cG9ydCBmdW5jdGlvbiB0cnVuY2F0ZWROb3JtYWwoYXJnczogVHJ1bmNhdGVkTm9ybWFsQXJncyk6IEluaXRpYWxpemVyIHtcbiAgcmV0dXJuIG5ldyBUcnVuY2F0ZWROb3JtYWwoYXJncyk7XG59XG5cbi8qKlxuICogSW5pdGlhbGl6ZXIgdGhhdCBnZW5lcmF0ZXMgdGhlIGlkZW50aXR5IG1hdHJpeC5cbiAqIE9ubHkgdXNlIGZvciBzcXVhcmUgMkQgbWF0cmljZXMuXG4gKlxuICogQGRvYyB7aGVhZGluZzogJ0luaXRpYWxpemVycycsIG5hbWVzcGFjZTogJ2luaXRpYWxpemVycyd9XG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBpZGVudGl0eShhcmdzOiBJZGVudGl0eUFyZ3MpOiBJbml0aWFsaXplciB7XG4gIHJldHVybiBuZXcgSWRlbnRpdHkoYXJncyk7XG59XG5cbi8qKlxuICogSW5pdGlhbGl6ZXIgY2FwYWJsZSBvZiBhZGFwdGluZyBpdHMgc2NhbGUgdG8gdGhlIHNoYXBlIG9mIHdlaWdodHMuXG4gKiBXaXRoIGRpc3RyaWJ1dGlvbj1OT1JNQUwsIHNhbXBsZXMgYXJlIGRyYXduIGZyb20gYSB0cnVuY2F0ZWQgbm9ybWFsXG4gKiBkaXN0cmlidXRpb24gY2VudGVyZWQgb24gemVybywgd2l0aCBgc3RkZGV2ID0gc3FydChzY2FsZSAvIG4pYCB3aGVyZSBuIGlzOlxuICogICAtIG51bWJlciBvZiBpbnB1dCB1bml0cyBpbiB0aGUgd2VpZ2h0IHRlbnNvciwgaWYgbW9kZSA9IEZBTl9JTi5cbiAqICAgLSBudW1iZXIgb2Ygb3V0cHV0IHVuaXRzLCBpZiBtb2RlID0gRkFOX09VVC5cbiAqICAgLSBhdmVyYWdlIG9mIHRoZSBudW1iZXJzIG9mIGlucHV0IGFuZCBvdXRwdXQgdW5pdHMsIGlmIG1vZGUgPSBGQU5fQVZHLlxuICogV2l0aCBkaXN0cmlidXRpb249VU5JRk9STSxcbiAqIHNhbXBsZXMgYXJlIGRyYXduIGZyb20gYSB1bmlmb3JtIGRpc3RyaWJ1dGlvblxuICogd2l0aGluIFstbGltaXQsIGxpbWl0XSwgd2l0aCBgbGltaXQgPSBzcXJ0KDMgKiBzY2FsZSAvIG4pYC5cbiAqXG4gKiBAZG9jIHtoZWFkaW5nOiAnSW5pdGlhbGl6ZXJzJyxuYW1lc3BhY2U6ICdpbml0aWFsaXplcnMnfVxuICovXG5leHBvcnQgZnVuY3Rpb24gdmFyaWFuY2VTY2FsaW5nKGNvbmZpZzogVmFyaWFuY2VTY2FsaW5nQXJncyk6IEluaXRpYWxpemVyIHtcbiAgcmV0dXJuIG5ldyBWYXJpYW5jZVNjYWxpbmcoY29uZmlnKTtcbn1cblxuLyoqXG4gKiBHbG9yb3QgdW5pZm9ybSBpbml0aWFsaXplciwgYWxzbyBjYWxsZWQgWGF2aWVyIHVuaWZvcm0gaW5pdGlhbGl6ZXIuXG4gKiBJdCBkcmF3cyBzYW1wbGVzIGZyb20gYSB1bmlmb3JtIGRpc3RyaWJ1dGlvbiB3aXRoaW4gWy1saW1pdCwgbGltaXRdXG4gKiB3aGVyZSBgbGltaXRgIGlzIGBzcXJ0KDYgLyAoZmFuX2luICsgZmFuX291dCkpYFxuICogd2hlcmUgYGZhbl9pbmAgaXMgdGhlIG51bWJlciBvZiBpbnB1dCB1bml0cyBpbiB0aGUgd2VpZ2h0IHRlbnNvclxuICogYW5kIGBmYW5fb3V0YCBpcyB0aGUgbnVtYmVyIG9mIG91dHB1dCB1bml0cyBpbiB0aGUgd2VpZ2h0IHRlbnNvclxuICpcbiAqIFJlZmVyZW5jZTpcbiAqICAgR2xvcm90ICYgQmVuZ2lvLCBBSVNUQVRTIDIwMTBcbiAqICAgICAgIGh0dHA6Ly9qbWxyLm9yZy9wcm9jZWVkaW5ncy9wYXBlcnMvdjkvZ2xvcm90MTBhL2dsb3JvdDEwYS5wZGYuXG4gKlxuICogQGRvYyB7aGVhZGluZzogJ0luaXRpYWxpemVycycsIG5hbWVzcGFjZTogJ2luaXRpYWxpemVycyd9XG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBnbG9yb3RVbmlmb3JtKGFyZ3M6IFNlZWRPbmx5SW5pdGlhbGl6ZXJBcmdzKTogSW5pdGlhbGl6ZXIge1xuICByZXR1cm4gbmV3IEdsb3JvdFVuaWZvcm0oYXJncyk7XG59XG5cbi8qKlxuICogR2xvcm90IG5vcm1hbCBpbml0aWFsaXplciwgYWxzbyBjYWxsZWQgWGF2aWVyIG5vcm1hbCBpbml0aWFsaXplci5cbiAqIEl0IGRyYXdzIHNhbXBsZXMgZnJvbSBhIHRydW5jYXRlZCBub3JtYWwgZGlzdHJpYnV0aW9uIGNlbnRlcmVkIG9uIDBcbiAqIHdpdGggYHN0ZGRldiA9IHNxcnQoMiAvIChmYW5faW4gKyBmYW5fb3V0KSlgXG4gKiB3aGVyZSBgZmFuX2luYCBpcyB0aGUgbnVtYmVyIG9mIGlucHV0IHVuaXRzIGluIHRoZSB3ZWlnaHQgdGVuc29yXG4gKiBhbmQgYGZhbl9vdXRgIGlzIHRoZSBudW1iZXIgb2Ygb3V0cHV0IHVuaXRzIGluIHRoZSB3ZWlnaHQgdGVuc29yLlxuICpcbiAqIFJlZmVyZW5jZTpcbiAqICAgR2xvcm90ICYgQmVuZ2lvLCBBSVNUQVRTIDIwMTBcbiAqICAgICAgIGh0dHA6Ly9qbWxyLm9yZy9wcm9jZWVkaW5ncy9wYXBlcnMvdjkvZ2xvcm90MTBhL2dsb3JvdDEwYS5wZGZcbiAqXG4gKiBAZG9jIHtoZWFkaW5nOiAnSW5pdGlhbGl6ZXJzJywgbmFtZXNwYWNlOiAnaW5pdGlhbGl6ZXJzJ31cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGdsb3JvdE5vcm1hbChhcmdzOiBTZWVkT25seUluaXRpYWxpemVyQXJncyk6IEluaXRpYWxpemVyIHtcbiAgcmV0dXJuIG5ldyBHbG9yb3ROb3JtYWwoYXJncyk7XG59XG5cbi8qKlxuICogSGUgbm9ybWFsIGluaXRpYWxpemVyLlxuICpcbiAqIEl0IGRyYXdzIHNhbXBsZXMgZnJvbSBhIHRydW5jYXRlZCBub3JtYWwgZGlzdHJpYnV0aW9uIGNlbnRlcmVkIG9uIDBcbiAqIHdpdGggYHN0ZGRldiA9IHNxcnQoMiAvIGZhbkluKWBcbiAqIHdoZXJlIGBmYW5JbmAgaXMgdGhlIG51bWJlciBvZiBpbnB1dCB1bml0cyBpbiB0aGUgd2VpZ2h0IHRlbnNvci5cbiAqXG4gKiBSZWZlcmVuY2U6XG4gKiAgICAgSGUgZXQgYWwuLCBodHRwOi8vYXJ4aXYub3JnL2Ficy8xNTAyLjAxODUyXG4gKlxuICogQGRvYyB7aGVhZGluZzogJ0luaXRpYWxpemVycycsIG5hbWVzcGFjZTogJ2luaXRpYWxpemVycyd9XG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBoZU5vcm1hbChhcmdzOiBTZWVkT25seUluaXRpYWxpemVyQXJncyk6IEluaXRpYWxpemVyIHtcbiAgcmV0dXJuIG5ldyBIZU5vcm1hbChhcmdzKTtcbn1cblxuLyoqXG4gKiBIZSB1bmlmb3JtIGluaXRpYWxpemVyLlxuICpcbiAqIEl0IGRyYXdzIHNhbXBsZXMgZnJvbSBhIHVuaWZvcm0gZGlzdHJpYnV0aW9uIHdpdGhpbiBbLWxpbWl0LCBsaW1pdF1cbiAqIHdoZXJlIGBsaW1pdGAgaXMgYHNxcnQoNiAvIGZhbl9pbilgXG4gKiB3aGVyZSBgZmFuSW5gIGlzIHRoZSBudW1iZXIgb2YgaW5wdXQgdW5pdHMgaW4gdGhlIHdlaWdodCB0ZW5zb3IuXG4gKlxuICogUmVmZXJlbmNlOlxuICogICAgIEhlIGV0IGFsLiwgaHR0cDovL2FyeGl2Lm9yZy9hYnMvMTUwMi4wMTg1MlxuICpcbiAqIEBkb2Mge2hlYWRpbmc6ICdJbml0aWFsaXplcnMnLG5hbWVzcGFjZTogJ2luaXRpYWxpemVycyd9XG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBoZVVuaWZvcm0oYXJnczogU2VlZE9ubHlJbml0aWFsaXplckFyZ3MpOiBJbml0aWFsaXplciB7XG4gIHJldHVybiBuZXcgSGVVbmlmb3JtKGFyZ3MpO1xufVxuXG4vKipcbiAqIExlQ3VuIG5vcm1hbCBpbml0aWFsaXplci5cbiAqXG4gKiBJdCBkcmF3cyBzYW1wbGVzIGZyb20gYSB0cnVuY2F0ZWQgbm9ybWFsIGRpc3RyaWJ1dGlvbiBjZW50ZXJlZCBvbiAwXG4gKiB3aXRoIGBzdGRkZXYgPSBzcXJ0KDEgLyBmYW5JbilgXG4gKiB3aGVyZSBgZmFuSW5gIGlzIHRoZSBudW1iZXIgb2YgaW5wdXQgdW5pdHMgaW4gdGhlIHdlaWdodCB0ZW5zb3IuXG4gKlxuICogUmVmZXJlbmNlczpcbiAqICAgW1NlbGYtTm9ybWFsaXppbmcgTmV1cmFsIE5ldHdvcmtzXShodHRwczovL2FyeGl2Lm9yZy9hYnMvMTcwNi4wMjUxNSlcbiAqICAgW0VmZmljaWVudCBCYWNrcHJvcF0oaHR0cDovL3lhbm4ubGVjdW4uY29tL2V4ZGIvcHVibGlzL3BkZi9sZWN1bi05OGIucGRmKVxuICpcbiAqIEBkb2Mge2hlYWRpbmc6ICdJbml0aWFsaXplcnMnLCBuYW1lc3BhY2U6ICdpbml0aWFsaXplcnMnfVxuICovXG5leHBvcnQgZnVuY3Rpb24gbGVDdW5Ob3JtYWwoYXJnczogU2VlZE9ubHlJbml0aWFsaXplckFyZ3MpOiBJbml0aWFsaXplciB7XG4gIHJldHVybiBuZXcgTGVDdW5Ob3JtYWwoYXJncyk7XG59XG5cbi8qKlxuICogTGVDdW4gdW5pZm9ybSBpbml0aWFsaXplci5cbiAqXG4gKiBJdCBkcmF3cyBzYW1wbGVzIGZyb20gYSB1bmlmb3JtIGRpc3RyaWJ1dGlvbiBpbiB0aGUgaW50ZXJ2YWxcbiAqIGBbLWxpbWl0LCBsaW1pdF1gIHdpdGggYGxpbWl0ID0gc3FydCgzIC8gZmFuSW4pYCxcbiAqIHdoZXJlIGBmYW5JbmAgaXMgdGhlIG51bWJlciBvZiBpbnB1dCB1bml0cyBpbiB0aGUgd2VpZ2h0IHRlbnNvci5cbiAqXG4gKiBAZG9jIHtoZWFkaW5nOiAnSW5pdGlhbGl6ZXJzJywgbmFtZXNwYWNlOiAnaW5pdGlhbGl6ZXJzJ31cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGxlQ3VuVW5pZm9ybShhcmdzOiBTZWVkT25seUluaXRpYWxpemVyQXJncyk6IEluaXRpYWxpemVyIHtcbiAgcmV0dXJuIG5ldyBMZUN1blVuaWZvcm0oYXJncyk7XG59XG5cbi8qKlxuICogSW5pdGlhbGl6ZXIgdGhhdCBnZW5lcmF0ZXMgYSByYW5kb20gb3J0aG9nb25hbCBtYXRyaXguXG4gKlxuICogUmVmZXJlbmNlOlxuICogW1NheGUgZXQgYWwuLCBodHRwOi8vYXJ4aXYub3JnL2Ficy8xMzEyLjYxMjBdKGh0dHA6Ly9hcnhpdi5vcmcvYWJzLzEzMTIuNjEyMClcbiAqXG4gKiBAZG9jIHtoZWFkaW5nOiAnSW5pdGlhbGl6ZXJzJywgbmFtZXNwYWNlOiAnaW5pdGlhbGl6ZXJzJ31cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIG9ydGhvZ29uYWwoYXJnczogT3J0aG9nb25hbEFyZ3MpOiBJbml0aWFsaXplciB7XG4gIHJldHVybiBuZXcgT3J0aG9nb25hbChhcmdzKTtcbn1cbiJdfQ==","/**\n * @license\n * Copyright 2018 Google LLC\n *\n * Use of this source code is governed by an MIT-style\n * license that can be found in the LICENSE file or at\n * https://opensource.org/licenses/MIT.\n * =============================================================================\n */\nimport { dispose } from '@tensorflow/tfjs-core';\n/**\n * Turn any Scalar values in a Logs object into actual number values.\n *\n * @param logs The `Logs` object to be resolved in place.\n */\nexport async function resolveScalarsInLogs(logs) {\n if (logs == null) {\n return;\n }\n const promises = [];\n const keys = [];\n const scalarsToDispose = [];\n for (const key in logs) {\n const value = logs[key];\n if (typeof value !== 'number') {\n const valueScalar = value;\n promises.push(valueScalar.data());\n keys.push(key);\n scalarsToDispose.push(valueScalar);\n }\n }\n if (promises.length > 0) {\n const values = await Promise.all(promises);\n for (let i = 0; i < values.length; ++i) {\n logs[keys[i]] = values[i][0];\n }\n // Dispose the original scalar tensors.\n dispose(scalarsToDispose);\n }\n}\n/**\n * Dispose all Tensors in an UnresolvedLogs object.\n *\n * @param logs An `UnresolvedLogs` object potentially containing `tf.Tensor`s in\n * places where the values can be `tf.Tensor` or `number`.\n */\nexport function disposeTensorsInLogs(logs) {\n if (logs == null) {\n return;\n }\n for (const key in logs) {\n const value = logs[key];\n if (typeof value !== 'number') {\n value.dispose();\n }\n }\n}\n//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibG9ncy5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uL3RmanMtbGF5ZXJzL3NyYy9sb2dzLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBOzs7Ozs7OztHQVFHO0FBRUgsT0FBTyxFQUFDLE9BQU8sRUFBUyxNQUFNLHVCQUF1QixDQUFDO0FBV3REOzs7O0dBSUc7QUFDSCxNQUFNLENBQUMsS0FBSyxVQUFVLG9CQUFvQixDQUFDLElBQW9CO0lBQzdELElBQUksSUFBSSxJQUFJLElBQUksRUFBRTtRQUNoQixPQUFPO0tBQ1I7SUFDRCxNQUFNLFFBQVEsR0FBdUQsRUFBRSxDQUFDO0lBQ3hFLE1BQU0sSUFBSSxHQUFhLEVBQUUsQ0FBQztJQUMxQixNQUFNLGdCQUFnQixHQUFhLEVBQUUsQ0FBQztJQUN0QyxLQUFLLE1BQU0sR0FBRyxJQUFJLElBQUksRUFBRTtRQUN0QixNQUFNLEtBQUssR0FBRyxJQUFJLENBQUMsR0FBRyxDQUFDLENBQUM7UUFDeEIsSUFBSSxPQUFPLEtBQUssS0FBSyxRQUFRLEVBQUU7WUFDN0IsTUFBTSxXQUFXLEdBQUcsS0FBSyxDQUFDO1lBQzFCLFFBQVEsQ0FBQyxJQUFJLENBQUMsV0FBVyxDQUFDLElBQUksRUFBRSxDQUFDLENBQUM7WUFDbEMsSUFBSSxDQUFDLElBQUksQ0FBQyxHQUFHLENBQUMsQ0FBQztZQUNmLGdCQUFnQixDQUFDLElBQUksQ0FBQyxXQUFXLENBQUMsQ0FBQztTQUNwQztLQUNGO0lBQ0QsSUFBSSxRQUFRLENBQUMsTUFBTSxHQUFHLENBQUMsRUFBRTtRQUN2QixNQUFNLE1BQU0sR0FBRyxNQUFNLE9BQU8sQ0FBQyxHQUFHLENBQUMsUUFBUSxDQUFDLENBQUM7UUFDM0MsS0FBSyxJQUFJLENBQUMsR0FBRyxDQUFDLEVBQUUsQ0FBQyxHQUFHLE1BQU0sQ0FBQyxNQUFNLEVBQUUsRUFBRSxDQUFDLEVBQUU7WUFDdEMsSUFBSSxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsQ0FBQyxHQUFHLE1BQU0sQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQztTQUM5QjtRQUNELHVDQUF1QztRQUN2QyxPQUFPLENBQUMsZ0JBQWdCLENBQUMsQ0FBQztLQUMzQjtBQUNILENBQUM7QUFFRDs7Ozs7R0FLRztBQUNILE1BQU0sVUFBVSxvQkFBb0IsQ0FBQyxJQUFvQjtJQUN2RCxJQUFJLElBQUksSUFBSSxJQUFJLEVBQUU7UUFDaEIsT0FBTztLQUNSO0lBQ0QsS0FBSyxNQUFNLEdBQUcsSUFBSSxJQUFJLEVBQUU7UUFDdEIsTUFBTSxLQUFLLEdBQUcsSUFBSSxDQUFDLEdBQUcsQ0FBQyxDQUFDO1FBQ3hCLElBQUksT0FBTyxLQUFLLEtBQUssUUFBUSxFQUFFO1lBQzdCLEtBQUssQ0FBQyxPQUFPLEVBQUUsQ0FBQztTQUNqQjtLQUNGO0FBQ0gsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbIi8qKlxuICogQGxpY2Vuc2VcbiAqIENvcHlyaWdodCAyMDE4IEdvb2dsZSBMTENcbiAqXG4gKiBVc2Ugb2YgdGhpcyBzb3VyY2UgY29kZSBpcyBnb3Zlcm5lZCBieSBhbiBNSVQtc3R5bGVcbiAqIGxpY2Vuc2UgdGhhdCBjYW4gYmUgZm91bmQgaW4gdGhlIExJQ0VOU0UgZmlsZSBvciBhdFxuICogaHR0cHM6Ly9vcGVuc291cmNlLm9yZy9saWNlbnNlcy9NSVQuXG4gKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuICovXG5cbmltcG9ydCB7ZGlzcG9zZSwgU2NhbGFyfSBmcm9tICdAdGVuc29yZmxvdy90ZmpzLWNvcmUnO1xuXG4vKipcbiAqIExvZ3MgaW4gd2hpY2ggdmFsdWVzIGNhbiBiZSBlaXRoZXIgbnVtYmVycyBvciBUZW5zb3JzIChTY2FsYXJzKS5cbiAqXG4gKiBVc2VkIGludGVybmFsbHkuXG4gKi9cbmV4cG9ydCB0eXBlIFVucmVzb2x2ZWRMb2dzID0ge1xuICBba2V5OiBzdHJpbmddOiBudW1iZXJ8U2NhbGFyO1xufTtcblxuLyoqXG4gKiBUdXJuIGFueSBTY2FsYXIgdmFsdWVzIGluIGEgTG9ncyBvYmplY3QgaW50byBhY3R1YWwgbnVtYmVyIHZhbHVlcy5cbiAqXG4gKiBAcGFyYW0gbG9ncyBUaGUgYExvZ3NgIG9iamVjdCB0byBiZSByZXNvbHZlZCBpbiBwbGFjZS5cbiAqL1xuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIHJlc29sdmVTY2FsYXJzSW5Mb2dzKGxvZ3M6IFVucmVzb2x2ZWRMb2dzKSB7XG4gIGlmIChsb2dzID09IG51bGwpIHtcbiAgICByZXR1cm47XG4gIH1cbiAgY29uc3QgcHJvbWlzZXM6IEFycmF5PFByb21pc2U8RmxvYXQzMkFycmF5fEludDMyQXJyYXl8VWludDhBcnJheT4+ID0gW107XG4gIGNvbnN0IGtleXM6IHN0cmluZ1tdID0gW107XG4gIGNvbnN0IHNjYWxhcnNUb0Rpc3Bvc2U6IFNjYWxhcltdID0gW107XG4gIGZvciAoY29uc3Qga2V5IGluIGxvZ3MpIHtcbiAgICBjb25zdCB2YWx1ZSA9IGxvZ3Nba2V5XTtcbiAgICBpZiAodHlwZW9mIHZhbHVlICE9PSAnbnVtYmVyJykge1xuICAgICAgY29uc3QgdmFsdWVTY2FsYXIgPSB2YWx1ZTtcbiAgICAgIHByb21pc2VzLnB1c2godmFsdWVTY2FsYXIuZGF0YSgpKTtcbiAgICAgIGtleXMucHVzaChrZXkpO1xuICAgICAgc2NhbGFyc1RvRGlzcG9zZS5wdXNoKHZhbHVlU2NhbGFyKTtcbiAgICB9XG4gIH1cbiAgaWYgKHByb21pc2VzLmxlbmd0aCA+IDApIHtcbiAgICBjb25zdCB2YWx1ZXMgPSBhd2FpdCBQcm9taXNlLmFsbChwcm9taXNlcyk7XG4gICAgZm9yIChsZXQgaSA9IDA7IGkgPCB2YWx1ZXMubGVuZ3RoOyArK2kpIHtcbiAgICAgIGxvZ3Nba2V5c1tpXV0gPSB2YWx1ZXNbaV1bMF07XG4gICAgfVxuICAgIC8vIERpc3Bvc2UgdGhlIG9yaWdpbmFsIHNjYWxhciB0ZW5zb3JzLlxuICAgIGRpc3Bvc2Uoc2NhbGFyc1RvRGlzcG9zZSk7XG4gIH1cbn1cblxuLyoqXG4gKiBEaXNwb3NlIGFsbCBUZW5zb3JzIGluIGFuIFVucmVzb2x2ZWRMb2dzIG9iamVjdC5cbiAqXG4gKiBAcGFyYW0gbG9ncyBBbiBgVW5yZXNvbHZlZExvZ3NgIG9iamVjdCBwb3RlbnRpYWxseSBjb250YWluaW5nIGB0Zi5UZW5zb3JgcyBpblxuICogICBwbGFjZXMgd2hlcmUgdGhlIHZhbHVlcyBjYW4gYmUgYHRmLlRlbnNvcmAgb3IgYG51bWJlcmAuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBkaXNwb3NlVGVuc29yc0luTG9ncyhsb2dzOiBVbnJlc29sdmVkTG9ncykge1xuICBpZiAobG9ncyA9PSBudWxsKSB7XG4gICAgcmV0dXJuO1xuICB9XG4gIGZvciAoY29uc3Qga2V5IGluIGxvZ3MpIHtcbiAgICBjb25zdCB2YWx1ZSA9IGxvZ3Nba2V5XTtcbiAgICBpZiAodHlwZW9mIHZhbHVlICE9PSAnbnVtYmVyJykge1xuICAgICAgdmFsdWUuZGlzcG9zZSgpO1xuICAgIH1cbiAgfVxufVxuXG4vKipcbiAqIExvZ3MgaW4gd2hpY2ggdmFsdWVzIGNhbiBvbmx5IGJlIG51bWJlcnMuXG4gKlxuICogVXNlZCB3aGVuIGNhbGxpbmcgY2xpZW50LXByb3ZpZGVkIGN1c3RvbSBjYWxsYmFja3MuXG4gKi9cbmV4cG9ydCB0eXBlIExvZ3MgPSB7XG4gIFtrZXk6IHN0cmluZ106IG51bWJlcjtcbn07XG4iXX0=","/**\n * @license\n * Copyright 2018 Google LLC\n *\n * Use of this source code is governed by an MIT-style\n * license that can be found in the LICENSE file or at\n * https://opensource.org/licenses/MIT.\n * =============================================================================\n */\n/* Original source: keras/callbacks.py */\nimport { add, div, keep, mul, nextFrame, tidy, util } from '@tensorflow/tfjs-core';\nimport { ValueError } from './errors';\nimport { resolveScalarsInLogs } from './logs';\nimport * as generic_utils from './utils/generic_utils';\n/** Verbosity logging level when fitting a model. */\nexport var ModelLoggingVerbosity;\n(function (ModelLoggingVerbosity) {\n ModelLoggingVerbosity[ModelLoggingVerbosity[\"SILENT\"] = 0] = \"SILENT\";\n ModelLoggingVerbosity[ModelLoggingVerbosity[\"VERBOSE\"] = 1] = \"VERBOSE\";\n})(ModelLoggingVerbosity || (ModelLoggingVerbosity = {}));\n/** How often to yield to the main thread when training (in ms). */\nexport const DEFAULT_YIELD_EVERY_MS = 125;\n/**\n * Abstract base class used to build new callbacks.\n *\n * The `logs` dictionary that callback methods take as argument will contain\n * keys for quantities relevant to the current batch or epoch.\n *\n * Currently, the `.fit()` method of the `Sequential` model class\n * will include the following quantities in the `logs` that\n * it passes to its callbacks:\n *\n * onEpochEnd: Logs include `acc` and `loss`, and optionally include `valLoss`\n * (if validation is enabled in `fit`), and `valAcc` (if validation and\n * accuracy monitoring are enabled).\n * onBatchBegin: Logs include `size`, the number of samples in the current\n * batch.\n * onBatchEnd: Logs include `loss`, and optionally `acc` (if accuracy monitoring\n * is enabled).\n */\nexport class BaseCallback {\n constructor() {\n // TODO(michaelterry): This type is a best guess.\n this.validationData = null;\n }\n setParams(params) {\n this.params = params;\n }\n async onEpochBegin(epoch, logs) { }\n async onEpochEnd(epoch, logs) { }\n async onBatchBegin(batch, logs) { }\n async onBatchEnd(batch, logs) { }\n async onTrainBegin(logs) { }\n async onTrainEnd(logs) { }\n // LayersModel needs to call Callback.setModel(), but cannot actually depend\n // on Callback because that creates a cyclic dependency. Providing this no-op\n // method on BaseCallback breaks the cycle: this way LayersModel can depend on\n // BaseCallback but not on Callback. The argument is typed as `Container`\n // (the superclass of LayersModel) to avoid recapitulating the cycle. Callback\n // overrides this method and enforces that the argument is really a\n // LayersModel.\n setModel(model) {\n // Do nothing. Use Callback instead of BaseCallback to track the model.\n }\n}\n/**\n * Container abstracting a list of callbacks.\n */\nexport class CallbackList {\n // TODO(cais): When the need arises, uncomment the following lines and\n // implement the queue for time values.\n // private deltaTBatch: number;\n // private deltaTsBatchBegin: Array;\n // private deltaTsBatchEnd: Array;\n /**\n * Constructor of CallbackList.\n * @param callbacks Array of `Callback` instances.\n * @param queueLength Queue length for keeping running statistics over\n * callback execution time.\n */\n constructor(callbacks, queueLength = 10) {\n // TODO(cais): Make use of queueLength when implementing the queue for time\n // values.\n if (callbacks == null) {\n callbacks = [];\n }\n this.callbacks = callbacks;\n this.queueLength = queueLength;\n }\n append(callback) {\n this.callbacks.push(callback);\n }\n setParams(params) {\n for (const callback of this.callbacks) {\n callback.setParams(params);\n }\n }\n setModel(model) {\n for (const callback of this.callbacks) {\n callback.setModel(model);\n }\n }\n /**\n * Called at the start of an epoch.\n * @param epoch Index of epoch.\n * @param logs Dictionary of logs.\n */\n async onEpochBegin(epoch, logs) {\n if (logs == null) {\n logs = {};\n }\n for (const callback of this.callbacks) {\n await callback.onEpochBegin(epoch, logs);\n }\n }\n /**\n * Called at the end of an epoch.\n * @param epoch Index of epoch.\n * @param logs Dictionary of logs.\n */\n async onEpochEnd(epoch, logs) {\n if (logs == null) {\n logs = {};\n }\n for (const callback of this.callbacks) {\n await callback.onEpochEnd(epoch, logs);\n }\n }\n /**\n * Called right before processing a batch.\n * @param batch Index of batch within the current epoch.\n * @param logs Dictionary of logs.\n */\n async onBatchBegin(batch, logs) {\n if (logs == null) {\n logs = {};\n }\n for (const callback of this.callbacks) {\n await callback.onBatchBegin(batch, logs);\n }\n }\n /**\n * Called at the end of a batch.\n * @param batch Index of batch within the current epoch.\n * @param logs Dictionary of logs.\n */\n async onBatchEnd(batch, logs) {\n if (logs == null) {\n logs = {};\n }\n for (const callback of this.callbacks) {\n await callback.onBatchEnd(batch, logs);\n }\n }\n /**\n * Called at the beginning of training.\n * @param logs Dictionary of logs.\n */\n async onTrainBegin(logs) {\n if (logs == null) {\n logs = {};\n }\n for (const callback of this.callbacks) {\n await callback.onTrainBegin(logs);\n }\n }\n /**\n * Called at the end of training.\n * @param logs Dictionary of logs.\n */\n async onTrainEnd(logs) {\n if (logs == null) {\n logs = {};\n }\n for (const callback of this.callbacks) {\n await callback.onTrainEnd(logs);\n }\n }\n}\n/**\n * Callback that accumulates epoch averages of metrics.\n *\n * This callback is automatically applied to every LayersModel.\n */\nexport class BaseLogger extends BaseCallback {\n constructor() {\n super();\n }\n async onEpochBegin(epoch) {\n this.seen = 0;\n this.totals = {};\n }\n async onBatchEnd(batch, logs) {\n if (logs == null) {\n logs = {};\n }\n const batchSize = logs['size'] == null ? 0 : logs['size'];\n this.seen += batchSize;\n for (const key in logs) {\n const value = logs[key];\n if (typeof value === 'number') {\n if (!this.totals.hasOwnProperty(key)) {\n this.totals[key] = 0;\n }\n this.totals[key] = this.totals[key] + value * batchSize;\n }\n else {\n let oldTotalsToDispose;\n if (key in this.totals) {\n oldTotalsToDispose = this.totals[key];\n }\n else {\n this.totals[key] = 0;\n }\n const total = tidy(() => add((this.totals[key]), mul(value, batchSize)));\n this.totals[key] = total;\n if (oldTotalsToDispose != null) {\n oldTotalsToDispose.dispose();\n }\n }\n }\n }\n async onEpochEnd(epoch, logs) {\n if (logs != null) {\n for (const key of this.params['metrics']) {\n if (this.totals[key] == null) {\n continue;\n }\n if (typeof this.totals[key] === 'number') {\n logs[key] = this.totals[key] / this.seen;\n }\n else {\n tidy(() => {\n const log = mul(div(1, this.seen), this.totals[key]);\n logs[key] = log;\n this.totals[key].dispose();\n keep(logs[key]);\n });\n }\n }\n }\n }\n}\n/**\n * Callback that records events into a `History` object. This callback is\n * automatically applied to every TF.js Layers model. The `History` object\n * gets returned by the `fit` method of models.\n */\nexport class History extends BaseCallback {\n async onTrainBegin(logs) {\n this.epoch = [];\n this.history = {};\n }\n async onEpochEnd(epoch, logs) {\n if (logs == null) {\n logs = {};\n }\n this.epoch.push(epoch);\n for (const key in logs) {\n if (this.history[key] == null) {\n this.history[key] = [];\n }\n this.history[key].push(logs[key]);\n }\n }\n /**\n * Await the values of all losses and metrics.\n */\n async syncData() {\n const promises = [];\n const keys = [];\n const indices = [];\n for (const key in this.history) {\n const valueArray = this.history[key];\n for (let i = 0; i < valueArray.length; ++i) {\n if (typeof valueArray[i] !== 'number') {\n const valueScalar = valueArray[i];\n promises.push(valueScalar.data());\n keys.push(key);\n indices.push(i);\n }\n }\n }\n const values = await Promise.all(promises);\n for (let n = 0; n < values.length; ++n) {\n const tensorToDispose = this.history[keys[n]][indices[n]];\n tensorToDispose.dispose();\n this.history[keys[n]][indices[n]] = values[n][0];\n }\n }\n}\n/**\n * Custom callback for training.\n */\nexport class CustomCallback extends BaseCallback {\n constructor(args, yieldEvery) {\n super();\n this.currentEpoch = 0;\n this.nowFunc = args.nowFunc;\n this.nextFrameFunc = args.nextFrameFunc || nextFrame;\n this.yieldEvery = yieldEvery || 'auto';\n if (this.yieldEvery === 'auto') {\n this.yieldEvery = DEFAULT_YIELD_EVERY_MS;\n }\n if (this.yieldEvery === 'never' && args.onYield != null) {\n throw new Error('yieldEvery is `never` but you provided an `onYield` callback. ' +\n 'Either change `yieldEvery` or remove the callback');\n }\n if (util.isNumber(this.yieldEvery)) {\n // Decorate `maybeWait` so it will be called at most once every\n // `yieldEvery` ms.\n this.maybeWait = generic_utils.debounce(this.maybeWait.bind(this), this.yieldEvery, this.nowFunc);\n }\n this.trainBegin = args.onTrainBegin;\n this.trainEnd = args.onTrainEnd;\n this.epochBegin = args.onEpochBegin;\n this.epochEnd = args.onEpochEnd;\n this.batchBegin = args.onBatchBegin;\n this.batchEnd = args.onBatchEnd;\n this.yield = args.onYield;\n }\n async maybeWait(epoch, batch, logs) {\n const ps = [];\n if (this.yield != null) {\n await resolveScalarsInLogs(logs);\n ps.push(this.yield(epoch, batch, logs));\n }\n ps.push(this.nextFrameFunc());\n await Promise.all(ps);\n }\n async onEpochBegin(epoch, logs) {\n this.currentEpoch = epoch;\n if (this.epochBegin != null) {\n await resolveScalarsInLogs(logs);\n await this.epochBegin(epoch, logs);\n }\n }\n async onEpochEnd(epoch, logs) {\n const ps = [];\n if (this.epochEnd != null) {\n await resolveScalarsInLogs(logs);\n ps.push(this.epochEnd(epoch, logs));\n }\n if (this.yieldEvery === 'epoch') {\n ps.push(this.nextFrameFunc());\n }\n await Promise.all(ps);\n }\n async onBatchBegin(batch, logs) {\n if (this.batchBegin != null) {\n await resolveScalarsInLogs(logs);\n await this.batchBegin(batch, logs);\n }\n }\n async onBatchEnd(batch, logs) {\n const ps = [];\n if (this.batchEnd != null) {\n await resolveScalarsInLogs(logs);\n ps.push(this.batchEnd(batch, logs));\n }\n if (this.yieldEvery === 'batch') {\n ps.push(this.nextFrameFunc());\n }\n else if (util.isNumber(this.yieldEvery)) {\n ps.push(this.maybeWait(this.currentEpoch, batch, logs));\n }\n await Promise.all(ps);\n }\n async onTrainBegin(logs) {\n if (this.trainBegin != null) {\n await resolveScalarsInLogs(logs);\n await this.trainBegin(logs);\n }\n }\n async onTrainEnd(logs) {\n if (this.trainEnd != null) {\n await resolveScalarsInLogs(logs);\n await this.trainEnd(logs);\n }\n }\n}\n/**\n * Standardize callbacks or configurations of them to an Array of callbacks.\n */\nexport function standardizeCallbacks(callbacks, yieldEvery) {\n if (callbacks == null) {\n callbacks = {};\n }\n if (callbacks instanceof BaseCallback) {\n return [callbacks];\n }\n if (Array.isArray(callbacks) && callbacks[0] instanceof BaseCallback) {\n return callbacks;\n }\n // Convert custom callback configs to custom callback objects.\n const callbackConfigs = generic_utils.toList(callbacks);\n return callbackConfigs.map(callbackConfig => new CustomCallback(callbackConfig, yieldEvery));\n}\n/**\n * A global registry for callback constructors to be used during\n * LayersModel.fit().\n */\nexport class CallbackConstructorRegistry {\n /**\n * Blocks public access to constructor.\n */\n constructor() { }\n /**\n * Register a tf.LayersModel.fit() callback constructor.\n *\n * The registered callback constructor will be used to instantiate\n * callbacks for every tf.LayersModel.fit() call afterwards.\n *\n * @param verbosityLevel Level of verbosity at which the `callbackConstructor`\n * is to be reigstered.\n * @param callbackConstructor A no-arg constructor for `tf.Callback`.\n * @throws Error, if the same callbackConstructor has been registered before,\n * either at the same or a different `verbosityLevel`.\n */\n static registerCallbackConstructor(verbosityLevel, callbackConstructor) {\n util.assert(verbosityLevel >= 0 && Number.isInteger(verbosityLevel), () => `Verbosity level is expected to be an integer >= 0, ` +\n `but got ${verbosityLevel}`);\n CallbackConstructorRegistry.checkForDuplicate(callbackConstructor);\n if (CallbackConstructorRegistry.constructors[verbosityLevel] == null) {\n CallbackConstructorRegistry.constructors[verbosityLevel] = [];\n }\n CallbackConstructorRegistry.constructors[verbosityLevel].push(callbackConstructor);\n }\n static checkForDuplicate(callbackConstructor) {\n for (const levelName in CallbackConstructorRegistry.constructors) {\n const constructors = CallbackConstructorRegistry.constructors[+levelName];\n constructors.forEach(ctor => {\n if (ctor === callbackConstructor) {\n throw new ValueError('Duplicate callback constructor.');\n }\n });\n }\n }\n /**\n * Clear all registered callback constructors.\n */\n static clear() {\n CallbackConstructorRegistry.constructors = {};\n }\n /**\n * Create callbacks using the registered callback constructors.\n *\n * Given `verbosityLevel`, all constructors registered at that level or above\n * will be called and the instantiated callbacks will be used.\n *\n * @param verbosityLevel: Level of verbosity.\n */\n static createCallbacks(verbosityLevel) {\n const constructors = [];\n for (const levelName in CallbackConstructorRegistry.constructors) {\n const level = +levelName;\n if (verbosityLevel >= level) {\n constructors.push(...CallbackConstructorRegistry.constructors[level]);\n }\n }\n return constructors.map(ctor => new ctor());\n }\n}\nCallbackConstructorRegistry.constructors = {};\nexport function configureCallbacks(callbacks, verbose, epochs, initialEpoch, numTrainSamples, stepsPerEpoch, batchSize, doValidation, callbackMetrics) {\n const history = new History();\n const actualCallbacks = [\n new BaseLogger(), ...CallbackConstructorRegistry.createCallbacks(verbose)\n ];\n if (callbacks != null) {\n actualCallbacks.push(...callbacks);\n }\n actualCallbacks.push(history);\n const callbackList = new CallbackList(actualCallbacks);\n // TODO(cais): Figure out when this LayersModel instance can have a\n // dynamically\n // set property called 'callback_model' as in PyKeras.\n callbackList.setParams({\n epochs,\n initialEpoch,\n samples: numTrainSamples,\n steps: stepsPerEpoch,\n batchSize,\n verbose,\n doValidation,\n metrics: callbackMetrics,\n });\n return { callbackList, history };\n}\n//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYmFzZV9jYWxsYmFja3MuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi90ZmpzLWxheWVycy9zcmMvYmFzZV9jYWxsYmFja3MudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUE7Ozs7Ozs7O0dBUUc7QUFFSCx5Q0FBeUM7QUFFekMsT0FBTyxFQUFDLEdBQUcsRUFBRSxHQUFHLEVBQUUsSUFBSSxFQUFFLEdBQUcsRUFBRSxTQUFTLEVBQWtCLElBQUksRUFBRSxJQUFJLEVBQUMsTUFBTSx1QkFBdUIsQ0FBQztBQUdqRyxPQUFPLEVBQUMsVUFBVSxFQUFDLE1BQU0sVUFBVSxDQUFDO0FBQ3BDLE9BQU8sRUFBTyxvQkFBb0IsRUFBaUIsTUFBTSxRQUFRLENBQUM7QUFDbEUsT0FBTyxLQUFLLGFBQWEsTUFBTSx1QkFBdUIsQ0FBQztBQUV2RCxvREFBb0Q7QUFDcEQsTUFBTSxDQUFOLElBQVkscUJBR1g7QUFIRCxXQUFZLHFCQUFxQjtJQUMvQixxRUFBVSxDQUFBO0lBQ1YsdUVBQVcsQ0FBQTtBQUNiLENBQUMsRUFIVyxxQkFBcUIsS0FBckIscUJBQXFCLFFBR2hDO0FBRUQsbUVBQW1FO0FBQ25FLE1BQU0sQ0FBQyxNQUFNLHNCQUFzQixHQUFHLEdBQUcsQ0FBQztBQVExQzs7Ozs7Ozs7Ozs7Ozs7Ozs7R0FpQkc7QUFDSCxNQUFNLE9BQWdCLFlBQVk7SUFBbEM7UUFDRSxpREFBaUQ7UUFDakQsbUJBQWMsR0FBb0IsSUFBSSxDQUFDO0lBZ0N6QyxDQUFDO0lBMUJDLFNBQVMsQ0FBQyxNQUFjO1FBQ3RCLElBQUksQ0FBQyxNQUFNLEdBQUcsTUFBTSxDQUFDO0lBQ3ZCLENBQUM7SUFFRCxLQUFLLENBQUMsWUFBWSxDQUFDLEtBQWEsRUFBRSxJQUFxQixJQUFHLENBQUM7SUFFM0QsS0FBSyxDQUFDLFVBQVUsQ0FBQyxLQUFhLEVBQUUsSUFBcUIsSUFBRyxDQUFDO0lBRXpELEtBQUssQ0FBQyxZQUFZLENBQUMsS0FBYSxFQUFFLElB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RSxZQUFxQixFQUN4QyxlQUF5QjtJQUMzQixNQUFNLE9BQU8sR0FBRyxJQUFJLE9BQU8sRUFBRSxDQUFDO0lBQzlCLE1BQU0sZUFBZSxHQUFtQjtRQUN0QyxJQUFJLFVBQVUsRUFBRSxFQUFFLEdBQUcsMkJBQTJCLENBQUMsZUFBZSxDQUFDLE9BQU8sQ0FBQztLQUMxRSxDQUFDO0lBQ0YsSUFBSSxTQUFTLElBQUksSUFBSSxFQUFFO1FBQ3JCLGVBQWUsQ0FBQyxJQUFJLENBQUMsR0FBRyxTQUFTLENBQUMsQ0FBQztLQUNwQztJQUNELGVBQWUsQ0FBQyxJQUFJLENBQUMsT0FBTyxDQUFDLENBQUM7SUFDOUIsTUFBTSxZQUFZLEdBQUcsSUFBSSxZQUFZLENBQUMsZUFBZSxDQUFDLENBQUM7SUFFdkQsbUVBQW1FO0lBQ25FLGNBQWM7SUFDZCx3REFBd0Q7SUFFeEQsWUFBWSxDQUFDLFNBQVMsQ0FBQztRQUNyQixNQUFNO1FBQ04sWUFBWTtRQUNaLE9BQU8sRUFBRSxlQUFlO1FBQ3hCLEtBQUssRUFBRSxhQUFhO1FBQ3BCLFNBQVM7UUFDVCxPQUFPO1FBQ1AsWUFBWTtRQUNaLE9BQU8sRUFBRSxlQUFlO0tBQ3pCLENBQUMsQ0FBQztJQUNILE9BQU8sRUFBQyxZQUFZLEVBQUUsT0FBTyxFQUFDLENBQUM7QUFDakMsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbIi8qKlxuICogQGxpY2Vuc2VcbiAqIENvcHlyaWdodCAyMDE4IEdvb2dsZSBMTENcbiAqXG4gKiBVc2Ugb2YgdGhpcyBzb3VyY2UgY29kZSBpcyBnb3Zlcm5lZCBieSBhbiBNSVQtc3R5bGVcbiAqIGxpY2Vuc2UgdGhhdCBjYW4gYmUgZm91bmQgaW4gdGhlIExJQ0VOU0UgZmlsZSBvciBhdFxuICogaHR0cHM6Ly9vcGVuc291cmNlLm9yZy9saWNlbnNlcy9NSVQuXG4gKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuICovXG5cbi8qIE9yaWdpbmFsIHNvdXJjZToga2VyYXMvY2FsbGJhY2tzLnB5ICovXG5cbmltcG9ydCB7YWRkLCBkaXYsIGtlZXAsIG11bCwgbmV4dEZyYW1lLCBTY2FsYXIsIFRlbnNvciwgdGlkeSwgdXRpbH0gZnJvbSAnQHRlbnNvcmZsb3cvdGZqcy1jb3JlJztcblxuaW1wb3J0IHtDb250YWluZXJ9IGZyb20gJy4vZW5naW5lL2NvbnRhaW5lcic7XG5pbXBvcnQge1ZhbHVlRXJyb3J9IGZyb20gJy4vZXJyb3JzJztcbmltcG9ydCB7TG9ncywgcmVzb2x2ZVNjYWxhcnNJbkxvZ3MsIFVucmVzb2x2ZWRMb2dzfSBmcm9tICcuL2xvZ3MnO1xuaW1wb3J0ICogYXMgZ2VuZXJpY191dGlscyBmcm9tICcuL3V0aWxzL2dlbmVyaWNfdXRpbHMnO1xuXG4vKiogVmVyYm9zaXR5IGxvZ2dpbmcgbGV2ZWwgd2hlbiBmaXR0aW5nIGEgbW9kZWwuICovXG5leHBvcnQgZW51bSBNb2RlbExvZ2dpbmdWZXJib3NpdHkge1xuICBTSUxFTlQgPSAwLFxuICBWRVJCT1NFID0gMVxufVxuXG4vKiogSG93IG9mdGVuIHRvIHlpZWxkIHRvIHRoZSBtYWluIHRocmVhZCB3aGVuIHRyYWluaW5nIChpbiBtcykuICovXG5leHBvcnQgY29uc3QgREVGQVVMVF9ZSUVMRF9FVkVSWV9NUyA9IDEyNTtcblxuZXhwb3J0IHR5cGUgUGFyYW1zID0ge1xuICBba2V5OiBzdHJpbmddOiBudW1iZXJ8c3RyaW5nfGJvb2xlYW58bnVtYmVyW118c3RyaW5nW118Ym9vbGVhbltdO1xufTtcblxuZXhwb3J0IHR5cGUgWWllbGRFdmVyeU9wdGlvbnMgPSAnYXV0byd8J2JhdGNoJ3wnZXBvY2gnfCduZXZlcid8bnVtYmVyO1xuXG4vKipcbiAqIEFic3RyYWN0IGJhc2UgY2xhc3MgdXNlZCB0byBidWlsZCBuZXcgY2FsbGJhY2tzLlxuICpcbiAqIFRoZSBgbG9nc2AgZGljdGlvbmFyeSB0aGF0IGNhbGxiYWNrIG1ldGhvZHMgdGFrZSBhcyBhcmd1bWVudCB3aWxsIGNvbnRhaW5cbiAqIGtleXMgZm9yIHF1YW50aXRpZXMgcmVsZXZhbnQgdG8gdGhlIGN1cnJlbnQgYmF0Y2ggb3IgZXBvY2guXG4gKlxuICogQ3VycmVudGx5LCB0aGUgYC5maXQoKWAgbWV0aG9kIG9mIHRoZSBgU2VxdWVudGlhbGAgbW9kZWwgY2xhc3NcbiAqIHdpbGwgaW5jbHVkZSB0aGUgZm9sbG93aW5nIHF1YW50aXRpZXMgaW4gdGhlIGBsb2dzYCB0aGF0XG4gKiBpdCBwYXNzZXMgdG8gaXRzIGNhbGxiYWNrczpcbiAqXG4gKiBvbkVwb2NoRW5kOiBMb2dzIGluY2x1ZGUgYGFjY2AgYW5kIGBsb3NzYCwgYW5kIG9wdGlvbmFsbHkgaW5jbHVkZSBgdmFsTG9zc2BcbiAqICAgKGlmIHZhbGlkYXRpb24gaXMgZW5hYmxlZCBpbiBgZml0YCksIGFuZCBgdmFsQWNjYCAoaWYgdmFsaWRhdGlvbiBhbmRcbiAqICAgYWNjdXJhY3kgbW9uaXRvcmluZyBhcmUgZW5hYmxlZCkuXG4gKiBvbkJhdGNoQmVnaW46IExvZ3MgaW5jbHVkZSBgc2l6ZWAsIHRoZSBudW1iZXIgb2Ygc2FtcGxlcyBpbiB0aGUgY3VycmVudFxuICogICBiYXRjaC5cbiAqIG9uQmF0Y2hFbmQ6IExvZ3MgaW5jbHVkZSBgbG9zc2AsIGFuZCBvcHRpb25hbGx5IGBhY2NgIChpZiBhY2N1cmFjeSBtb25pdG9yaW5nXG4gKiAgIGlzIGVuYWJsZWQpLlxuICovXG5leHBvcnQgYWJzdHJhY3QgY2xhc3MgQmFzZUNhbGxiYWNrIHtcbiAgLy8gVE9ETyhtaWNoYWVsdGVycnkpOiBUaGlzIHR5cGUgaXMgYSBiZXN0IGd1ZXNzLlxuICB2YWxpZGF0aW9uRGF0YTogVGVuc29yfFRlbnNvcltdID0gbnVsbDtcbiAgLyoqXG4gICAqIFRyYWluaW5nIHBhcmFtZXRlcnMgKGVnLiB2ZXJib3NpdHksIGJhdGNoIHNpemUsIG51bWJlciBvZiBlcG9jaHMuLi4pLlxuICAgKi9cbiAgcGFyYW1zOiBQYXJhbXM7XG5cbiAgc2V0UGFyYW1zKHBhcmFtczogUGFyYW1zKTogdm9pZCB7XG4gICAgdGhpcy5wYXJhbXMgPSBwYXJhbXM7XG4gIH1cblxuICBhc3luYyBvbkVwb2NoQmVnaW4oZXBvY2g6IG51bWJlciwgbG9ncz86IFVucmVzb2x2ZWRMb2dzKSB7fVxuXG4gIGFzeW5jIG9uRXBvY2hFbmQoZXBvY2g6IG51bWJlciwgbG9ncz86IFVucmVzb2x2ZWRMb2dzKSB7fVxuXG4gIGFzeW5jIG9uQmF0Y2hCZWdpbihiYXRjaDogbnVtYmVyLCBsb2dzPzogVW5yZXNvbHZlZExvZ3MpIHt9XG5cbiAgYXN5bmMgb25CYXRjaEVuZChiYXRjaDogbnVtYmVyLCBsb2dzPzogVW5yZXNvbHZlZExvZ3MpIHt9XG5cbiAgYXN5bmMgb25UcmFpbkJlZ2luKGxvZ3M/OiBVbnJlc29sdmVkTG9ncykge31cblxuICBhc3luYyBvblRyYWluRW5kKGxvZ3M/OiBVbnJlc29sdmVkTG9ncykge31cblxuICAvLyBMYXllcnNNb2RlbCBuZWVkcyB0byBjYWxsIENhbGxiYWNrLnNldE1vZGVsKCksIGJ1dCBjYW5ub3QgYWN0dWFsbHkgZGVwZW5kXG4gIC8vIG9uIENhbGxiYWNrIGJlY2F1c2UgdGhhdCBjcmVhdGVzIGEgY3ljbGljIGRlcGVuZGVuY3kuICBQcm92aWRpbmcgdGhpcyBuby1vcFxuICAvLyBtZXRob2Qgb24gQmFzZUNhbGxiYWNrIGJyZWFrcyB0aGUgY3ljbGU6IHRoaXMgd2F5IExheWVyc01vZGVsIGNhbiBkZXBlbmQgb25cbiAgLy8gQmFzZUNhbGxiYWNrIGJ1dCBub3Qgb24gQ2FsbGJhY2suICBUaGUgYXJndW1lbnQgaXMgdHlwZWQgYXMgYENvbnRhaW5lcmBcbiAgLy8gKHRoZSBzdXBlcmNsYXNzIG9mIExheWVyc01vZGVsKSB0byBhdm9pZCByZWNhcGl0dWxhdGluZyB0aGUgY3ljbGUuIENhbGxiYWNrXG4gIC8vIG92ZXJyaWRlcyB0aGlzIG1ldGhvZCBhbmQgZW5mb3JjZXMgdGhhdCB0aGUgYXJndW1lbnQgaXMgcmVhbGx5IGFcbiAgLy8gTGF5ZXJzTW9kZWwuXG4gIHNldE1vZGVsKG1vZGVsOiBDb250YWluZXIpOiB2b2lkIHtcbiAgICAvLyBEbyBub3RoaW5nLiBVc2UgQ2FsbGJhY2sgaW5zdGVhZCBvZiBCYXNlQ2FsbGJhY2sgdG8gdHJhY2sgdGhlIG1vZGVsLlxuICB9XG59XG5cbi8qKlxuICogQ29udGFpbmVyIGFic3RyYWN0aW5nIGEgbGlzdCBvZiBjYWxsYmFja3MuXG4gKi9cbmV4cG9ydCBjbGFzcyBDYWxsYmFja0xpc3Qge1xuICBjYWxsYmFja3M6IEJhc2VDYWxsYmFja1tdO1xuICBxdWV1ZUxlbmd0aDogbnVtYmVyO1xuXG4gIC8vIFRPRE8oY2Fpcyk6IFdoZW4gdGhlIG5lZWQgYXJpc2VzLCB1bmNvbW1lbnQgdGhlIGZvbGxvd2luZyBsaW5lcyBhbmRcbiAgLy8gaW1wbGVtZW50IHRoZSBxdWV1ZSBmb3IgdGltZSB2YWx1ZXMuXG4gIC8vIHByaXZhdGUgZGVsdGFUQmF0Y2g6IG51bWJlcjtcbiAgLy8gcHJpdmF0ZSBkZWx0YVRzQmF0Y2hCZWdpbjogQXJyYXk8bnVtYmVyPjtcbiAgLy8gcHJpdmF0ZSBkZWx0YVRzQmF0Y2hFbmQ6IEFycmF5PG51bWJlcj47XG5cbiAgLyoqXG4gICAqIENvbnN0cnVjdG9yIG9mIENhbGxiYWNrTGlzdC5cbiAgICogQHBhcmFtIGNhbGxiYWNrcyBBcnJheSBvZiBgQ2FsbGJhY2tgIGluc3RhbmNlcy5cbiAgICogQHBhcmFtIHF1ZXVlTGVuZ3RoIFF1ZXVlIGxlbmd0aCBmb3Iga2VlcGluZyBydW5uaW5nIHN0YXRpc3RpY3Mgb3ZlclxuICAgKiAgIGNhbGxiYWNrIGV4ZWN1dGlvbiB0aW1lLlxuICAgKi9cbiAgY29uc3RydWN0b3IoY2FsbGJhY2tzPzogQmFzZUNhbGxiYWNrW10sIHF1ZXVlTGVuZ3RoID0gMTApIHtcbiAgICAvLyBUT0RPKGNhaXMpOiBNYWtlIHVzZSBvZiBxdWV1ZUxlbmd0aCB3aGVuIGltcGxlbWVudGluZyB0aGUgcXVldWUgZm9yIHRpbWVcbiAgICAvLyB2YWx1ZXMuXG4gICAgaWYgKGNhbGxiYWNrcyA9PSBudWxsKSB7XG4gICAgICBjYWxsYmFja3MgPSBbXTtcbiAgICB9XG4gICAgdGhpcy5jYWxsYmFja3MgPSBjYWxsYmFja3M7XG4gICAgdGhpcy5xdWV1ZUxlbmd0aCA9IHF1ZXVlTGVuZ3RoO1xuICB9XG5cbiAgYXBwZW5kKGNhbGxiYWNrOiBCYXNlQ2FsbGJhY2spOiB2b2lkIHtcbiAgICB0aGlzLmNhbGxiYWNrcy5wdXNoKGNhbGxiYWNrKTtcbiAgfVxuXG4gIHNldFBhcmFtcyhwYXJhbXM6IFBhcmFtcyk6IHZvaWQge1xuICAgIGZvciAoY29uc3QgY2FsbGJhY2sgb2YgdGhpcy5jYWxsYmFja3MpIHtcbiAgICAgIGNhbGxiYWNrLnNldFBhcmFtcyhwYXJhbXMpO1xuICAgIH1cbiAgfVxuXG4gIHNldE1vZGVsKG1vZGVsOiBDb250YWluZXIpOiB2b2lkIHtcbiAgICBmb3IgKGNvbnN0IGNhbGxiYWNrIG9mIHRoaXMuY2FsbGJhY2tzKSB7XG4gICAgICBjYWxsYmFjay5zZXRNb2RlbChtb2RlbCk7XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIENhbGxlZCBhdCB0aGUgc3RhcnQgb2YgYW4gZXBvY2guXG4gICAqIEBwYXJhbSBlcG9jaCBJbmRleCBvZiBlcG9jaC5cbiAgICogQHBhcmFtIGxvZ3MgRGljdGlvbmFyeSBvZiBsb2dzLlxuICAgKi9cbiAgYXN5bmMgb25FcG9jaEJlZ2luKGVwb2NoOiBudW1iZXIsIGxvZ3M/OiBVbnJlc29sdmVkTG9ncykge1xuICAgIGlmIChsb2dzID09IG51bGwpIHtcbiAgICAgIGxvZ3MgPSB7fTtcbiAgICB9XG4gICAgZm9yIChjb25zdCBjYWxsYmFjayBvZiB0aGlzLmNhbGxiYWNrcykge1xuICAgICAgYXdhaXQgY2FsbGJhY2sub25FcG9jaEJlZ2luKGVwb2NoLCBsb2dzKTtcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogQ2FsbGVkIGF0IHRoZSBlbmQgb2YgYW4gZXBvY2guXG4gICAqIEBwYXJhbSBlcG9jaCBJbmRleCBvZiBlcG9jaC5cbiAgICogQHBhcmFtIGxvZ3MgRGljdGlvbmFyeSBvZiBsb2dzLlxuICAgKi9cbiAgYXN5bmMgb25FcG9jaEVuZChlcG9jaDogbnVtYmVyLCBsb2dzPzogVW5yZXNvbHZlZExvZ3MpIHtcbiAgICBpZiAobG9ncyA9PSBudWxsKSB7XG4gICAgICBsb2dzID0ge307XG4gICAgfVxuICAgIGZvciAoY29uc3QgY2FsbGJhY2sgb2YgdGhpcy5jYWxsYmFja3MpIHtcbiAgICAgIGF3YWl0IGNhbGxiYWNrLm9uRXBvY2hFbmQoZXBvY2gsIGxvZ3MpO1xuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBDYWxsZWQgIHJpZ2h0IGJlZm9yZSBwcm9jZXNzaW5nIGEgYmF0Y2guXG4gICAqIEBwYXJhbSBiYXRjaCBJbmRleCBvZiBiYXRjaCB3aXRoaW4gdGhlIGN1cnJlbnQgZXBvY2guXG4gICAqIEBwYXJhbSBsb2dzIERpY3Rpb25hcnkgb2YgbG9ncy5cbiAgICovXG4gIGFzeW5jIG9uQmF0Y2hCZWdpbihiYXRjaDogbnVtYmVyLCBsb2dzPzogVW5yZXNvbHZlZExvZ3MpIHtcbiAgICBpZiAobG9ncyA9PSBudWxsKSB7XG4gICAgICBsb2dzID0ge307XG4gICAgfVxuICAgIGZvciAoY29uc3QgY2FsbGJhY2sgb2YgdGhpcy5jYWxsYmFja3MpIHtcbiAgICAgIGF3YWl0IGNhbGxiYWNrLm9uQmF0Y2hCZWdpbihiYXRjaCwgbG9ncyk7XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIENhbGxlZCBhdCB0aGUgZW5kIG9mIGEgYmF0Y2guXG4gICAqIEBwYXJhbSBiYXRjaCBJbmRleCBvZiBiYXRjaCB3aXRoaW4gdGhlIGN1cnJlbnQgZXBvY2guXG4gICAqIEBwYXJhbSBsb2dzIERpY3Rpb25hcnkgb2YgbG9ncy5cbiAgICovXG4gIGFzeW5jIG9uQmF0Y2hFbmQoYmF0Y2g6IG51bWJlciwgbG9ncz86IFVucmVzb2x2ZWRMb2dzKSB7XG4gICAgaWYgKGxvZ3MgPT0gbnVsbCkge1xuICAgICAgbG9ncyA9IHt9O1xuICAgIH1cbiAgICBmb3IgKGNvbnN0IGNhbGxiYWNrIG9mIHRoaXMuY2FsbGJhY2tzKSB7XG4gICAgICBhd2FpdCBjYWxsYmFjay5vbkJhdGNoRW5kKGJhdGNoLCBsb2dzKTtcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogQ2FsbGVkIGF0IHRoZSBiZWdpbm5pbmcgb2YgdHJhaW5pbmcuXG4gICAqIEBwYXJhbSBsb2dzIERpY3Rpb25hcnkgb2YgbG9ncy5cbiAgICovXG4gIGFzeW5jIG9uVHJhaW5CZWdpbihsb2dzPzogVW5yZXNvbHZlZExvZ3MpIHtcbiAgICBpZiAobG9ncyA9PSBudWxsKSB7XG4gICAgICBsb2dzID0ge307XG4gICAgfVxuICAgIGZvciAoY29uc3QgY2FsbGJhY2sgb2YgdGhpcy5jYWxsYmFja3MpIHtcbiAgICAgIGF3YWl0IGNhbGxiYWNrLm9uVHJhaW5CZWdpbihsb2dzKTtcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogQ2FsbGVkIGF0IHRoZSBlbmQgb2YgdHJhaW5pbmcuXG4gICAqIEBwYXJhbSBsb2dzIERpY3Rpb25hcnkgb2YgbG9ncy5cbiAgICovXG4gIGFzeW5jIG9uVHJhaW5FbmQobG9ncz86IFVucmVzb2x2ZWRMb2dzKSB7XG4gICAgaWYgKGxvZ3MgPT0gbnVsbCkge1xuICAgICAgbG9ncyA9IHt9O1xuICAgIH1cbiAgICBmb3IgKGNvbnN0IGNhbGxiYWNrIG9mIHRoaXMuY2FsbGJhY2tzKSB7XG4gICAgICBhd2FpdCBjYWxsYmFjay5vblRyYWluRW5kKGxvZ3MpO1xuICAgIH1cbiAgfVxufVxuXG4vKipcbiAqIENhbGxiYWNrIHRoYXQgYWNjdW11bGF0ZXMgZXBvY2ggYXZlcmFnZXMgb2YgbWV0cmljcy5cbiAqXG4gKiBUaGlzIGNhbGxiYWNrIGlzIGF1dG9tYXRpY2FsbHkgYXBwbGllZCB0byBldmVyeSBMYXllcnNNb2RlbC5cbiAqL1xuZXhwb3J0IGNsYXNzIEJhc2VMb2dnZXIgZXh0ZW5kcyBCYXNlQ2FsbGJhY2sge1xuICBwcml2YXRlIHNlZW46IG51bWJlcjtcbiAgcHJpdmF0ZSB0b3RhbHM6IFVucmVzb2x2ZWRMb2dzO1xuXG4gIGNvbnN0cnVjdG9yKCkge1xuICAgIHN1cGVyKCk7XG4gIH1cblxuICBhc3luYyBvbkVwb2NoQmVnaW4oZXBvY2g6IG51bWJlcikge1xuICAgIHRoaXMuc2VlbiA9IDA7XG4gICAgdGhpcy50b3RhbHMgPSB7fTtcbiAgfVxuXG4gIGFzeW5jIG9uQmF0Y2hFbmQoYmF0Y2g6IG51bWJlciwgbG9ncz86IFVucmVzb2x2ZWRMb2dzKSB7XG4gICAgaWYgKGxvZ3MgPT0gbnVsbCkge1xuICAgICAgbG9ncyA9IHt9O1xuICAgIH1cbiAgICBjb25zdCBiYXRjaFNpemUgPSBsb2dzWydzaXplJ10gPT0gbnVsbCA/IDAgOiBsb2dzWydzaXplJ10gYXMgbnVtYmVyO1xuICAgIHRoaXMuc2VlbiArPSBiYXRjaFNpemU7XG4gICAgZm9yIChjb25zdCBrZXkgaW4gbG9ncykge1xuICAgICAgY29uc3QgdmFsdWUgPSBsb2dzW2tleV07XG4gICAgICBpZiAodHlwZW9mIHZhbHVlID09PSAnbnVtYmVyJykge1xuICAgICAgICBpZiAoIXRoaXMudG90YWxzLmhhc093blByb3BlcnR5KGtleSkpIHtcbiAgICAgICAgICB0aGlzLnRvdGFsc1trZXldID0gMDtcbiAgICAgICAgfVxuICAgICAgICB0aGlzLnRvdGFsc1trZXldID0gdGhpcy50b3RhbHNba2V5XSBhcyBudW1iZXIgKyB2YWx1ZSAqIGJhdGNoU2l6ZTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIGxldCBvbGRUb3RhbHNUb0Rpc3Bvc2U6IFNjYWxhcjtcbiAgICAgICAgaWYgKGtleSBpbiB0aGlzLnRvdGFscykge1xuICAgICAgICAgIG9sZFRvdGFsc1RvRGlzcG9zZSA9IHRoaXMudG90YWxzW2tleV0gYXMgU2NhbGFyO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIHRoaXMudG90YWxzW2tleV0gPSAwO1xuICAgICAgICB9XG4gICAgICAgIGNvbnN0IHRvdGFsOiBTY2FsYXIgPVxuICAgICAgICAgICAgdGlkeSgoKSA9PiBhZGQoKHRoaXMudG90YWxzW2tleV0pLCBtdWwodmFsdWUsIGJhdGNoU2l6ZSkpKTtcbiAgICAgICAgdGhpcy50b3RhbHNba2V5XSA9IHRvdGFsO1xuICAgICAgICBpZiAob2xkVG90YWxzVG9EaXNwb3NlICE9IG51bGwpIHtcbiAgICAgICAgICBvbGRUb3RhbHNUb0Rpc3Bvc2UuZGlzcG9zZSgpO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfVxuICB9XG5cbiAgYXN5bmMgb25FcG9jaEVuZChlcG9jaDogbnVtYmVyLCBsb2dzPzogVW5yZXNvbHZlZExvZ3MpIHtcbiAgICBpZiAobG9ncyAhPSBudWxsKSB7XG4gICAgICBmb3IgKGNvbnN0IGtleSBvZiB0aGlzLnBhcmFtc1snbWV0cmljcyddIGFzIHN0cmluZ1tdKSB7XG4gICAgICAgIGlmICh0aGlzLnRvdGFsc1trZXldID09IG51bGwpIHtcbiAgICAgICAgICBjb250aW51ZTtcbiAgICAgICAgfVxuICAgICAgICBpZiAodHlwZW9mIHRoaXMudG90YWxzW2tleV0gPT09ICdudW1iZXInKSB7XG4gICAgICAgICAgbG9nc1trZXldID0gdGhpcy50b3RhbHNba2V5XSBhcyBudW1iZXIgLyB0aGlzLnNlZW47XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgdGlkeSgoKSA9PiB7XG4gICAgICAgICAgICBjb25zdCBsb2c6IFNjYWxhciA9IG11bChkaXYoMSwgdGhpcy5zZWVuKSwgdGhpcy50b3RhbHNba2V5XSk7XG4gICAgICAgICAgICBsb2dzW2tleV0gPSBsb2c7XG4gICAgICAgICAgICAodGhpcy50b3RhbHNba2V5XSBhcyBUZW5zb3IpLmRpc3Bvc2UoKTtcbiAgICAgICAgICAgIGtlZXAobG9nc1trZXldIGFzIFNjYWxhcik7XG4gICAgICAgICAgfSk7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9XG4gIH1cbn1cblxuLyoqXG4gKiBDYWxsYmFjayB0aGF0IHJlY29yZHMgZXZlbnRzIGludG8gYSBgSGlzdG9yeWAgb2JqZWN0LiBUaGlzIGNhbGxiYWNrIGlzXG4gKiBhdXRvbWF0aWNhbGx5IGFwcGxpZWQgdG8gZXZlcnkgVEYuanMgTGF5ZXJzIG1vZGVsLiBUaGUgYEhpc3RvcnlgIG9iamVjdFxuICogZ2V0cyByZXR1cm5lZCBieSB0aGUgYGZpdGAgbWV0aG9kIG9mIG1vZGVscy5cbiAqL1xuZXhwb3J0IGNsYXNzIEhpc3RvcnkgZXh0ZW5kcyBCYXNlQ2FsbGJhY2sge1xuICBlcG9jaDogbnVtYmVyW107XG4gIGhpc3Rvcnk6IHtba2V5OiBzdHJpbmddOiBBcnJheTxudW1iZXJ8VGVuc29yPn07XG5cbiAgYXN5bmMgb25UcmFpbkJlZ2luKGxvZ3M/OiBVbnJlc29sdmVkTG9ncykge1xuICAgIHRoaXMuZXBvY2ggPSBbXTtcbiAgICB0aGlzLmhpc3RvcnkgPSB7fTtcbiAgfVxuXG4gIGFzeW5jIG9uRXBvY2hFbmQoZXBvY2g6IG51bWJlciwgbG9ncz86IFVucmVzb2x2ZWRMb2dzKSB7XG4gICAgaWYgKGxvZ3MgPT0gbnVsbCkge1xuICAgICAgbG9ncyA9IHt9O1xuICAgIH1cbiAgICB0aGlzLmVwb2NoLnB1c2goZXBvY2gpO1xuICAgIGZvciAoY29uc3Qga2V5IGluIGxvZ3MpIHtcbiAgICAgIGlmICh0aGlzLmhpc3Rvcnlba2V5XSA9PSBudWxsKSB7XG4gICAgICAgIHRoaXMuaGlzdG9yeVtrZXldID0gW107XG4gICAgICB9XG4gICAgICB0aGlzLmhpc3Rvcnlba2V5XS5wdXNoKGxvZ3Nba2V5XSk7XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIEF3YWl0IHRoZSB2YWx1ZXMgb2YgYWxsIGxvc3NlcyBhbmQgbWV0cmljcy5cbiAgICovXG4gIGFzeW5jIHN5bmNEYXRhKCkge1xuICAgIGNvbnN0IHByb21pc2VzOiBBcnJheTxQcm9taXNlPEZsb2F0MzJBcnJheXxJbnQzMkFycmF5fFVpbnQ4QXJyYXk+PiA9IFtdO1xuICAgIGNvbnN0IGtleXM6IHN0cmluZ1tdID0gW107XG4gICAgY29uc3QgaW5kaWNlczogbnVtYmVyW10gPSBbXTtcbiAgICBmb3IgKGNvbnN0IGtleSBpbiB0aGlzLmhpc3RvcnkpIHtcbiAgICAgIGNvbnN0IHZhbHVlQXJyYXkgPSB0aGlzLmhpc3Rvcnlba2V5XTtcbiAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgdmFsdWVBcnJheS5sZW5ndGg7ICsraSkge1xuICAgICAgICBpZiAodHlwZW9mIHZhbHVlQXJyYXlbaV0gIT09ICdudW1iZXInKSB7XG4gICAgICAgICAgY29uc3QgdmFsdWVTY2FsYXIgPSB2YWx1ZUFycmF5W2ldIGFzIFRlbnNvcjtcbiAgICAgICAgICBwcm9taXNlcy5wdXNoKHZhbHVlU2NhbGFyLmRhdGEoKSk7XG4gICAgICAgICAga2V5cy5wdXNoKGtleSk7XG4gICAgICAgICAgaW5kaWNlcy5wdXNoKGkpO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfVxuICAgIGNvbnN0IHZhbHVlcyA9IGF3YWl0IFByb21pc2UuYWxsKHByb21pc2VzKTtcbiAgICBmb3IgKGxldCBuID0gMDsgbiA8IHZhbHVlcy5sZW5ndGg7ICsrbikge1xuICAgICAgY29uc3QgdGVuc29yVG9EaXNwb3NlID0gdGhpcy5oaXN0b3J5W2tleXNbbl1dW2luZGljZXNbbl1dIGFzIFRlbnNvcjtcbiAgICAgIHRlbnNvclRvRGlzcG9zZS5kaXNwb3NlKCk7XG4gICAgICB0aGlzLmhpc3Rvcnlba2V5c1tuXV1baW5kaWNlc1tuXV0gPSB2YWx1ZXNbbl1bMF07XG4gICAgfVxuICB9XG59XG5cbmV4cG9ydCBpbnRlcmZhY2UgQ3VzdG9tQ2FsbGJhY2tBcmdzIHtcbiAgb25UcmFpbkJlZ2luPzogKGxvZ3M/OiBMb2dzKSA9PiB2b2lkIHwgUHJvbWlzZTx2b2lkPjtcbiAgb25UcmFpbkVuZD86IChsb2dzPzogTG9ncykgPT4gdm9pZCB8IFByb21pc2U8dm9pZD47XG4gIG9uRXBvY2hCZWdpbj86IChlcG9jaDogbnVtYmVyLCBsb2dzPzogTG9ncykgPT4gdm9pZCB8IFByb21pc2U8dm9pZD47XG4gIG9uRXBvY2hFbmQ/OiAoZXBvY2g6IG51bWJlciwgbG9ncz86IExvZ3MpID0+IHZvaWQgfCBQcm9taXNlPHZvaWQ+O1xuICBvbkJhdGNoQmVnaW4/OiAoYmF0Y2g6IG51bWJlciwgbG9ncz86IExvZ3MpID0+IHZvaWQgfCBQcm9taXNlPHZvaWQ+O1xuICBvbkJhdGNoRW5kPzogKGJhdGNoOiBudW1iZXIsIGxvZ3M/OiBMb2dzKSA9PiB2b2lkIHwgUHJvbWlzZTx2b2lkPjtcbiAgb25ZaWVsZD86IChlcG9jaDogbnVtYmVyLCBiYXRjaDogbnVtYmVyLCBsb2dzOiBMb2dzKSA9PiB2b2lkIHwgUHJvbWlzZTx2b2lkPjtcbiAgLy8gVXNlZCBmb3IgdGVzdCBESSBtb2NraW5nLlxuICBub3dGdW5jPzogRnVuY3Rpb247XG4gIG5leHRGcmFtZUZ1bmM/OiBGdW5jdGlvbjtcbn1cblxuLyoqXG4gKiBDdXN0b20gY2FsbGJhY2sgZm9yIHRyYWluaW5nLlxuICovXG5leHBvcnQgY2xhc3MgQ3VzdG9tQ2FsbGJhY2sgZXh0ZW5kcyBCYXNlQ2FsbGJhY2sge1xuICBwcm90ZWN0ZWQgcmVhZG9ubHkgdHJhaW5CZWdpbjogKGxvZ3M/OiBMb2dzKSA9PiB2b2lkIHwgUHJvbWlzZTx2b2lkPjtcbiAgcHJvdGVjdGVkIHJlYWRvbmx5IHRyYWluRW5kOiAobG9ncz86IExvZ3MpID0+IHZvaWQgfCBQcm9taXNlPHZvaWQ+O1xuICBwcm90ZWN0ZWQgcmVhZG9ubHkgZXBvY2hCZWdpbjpcbiAgICAgIChlcG9jaDogbnVtYmVyLCBsb2dzPzogTG9ncykgPT4gdm9pZCB8IFByb21pc2U8dm9pZD47XG4gIHByb3RlY3RlZCByZWFkb25seSBlcG9jaEVuZDpcbiAgICAgIChlcG9jaDogbnVtYmVyLCBsb2dzPzogTG9ncykgPT4gdm9pZCB8IFByb21pc2U8dm9pZD47XG4gIHByb3RlY3RlZCByZWFkb25seSBiYXRjaEJlZ2luOlxuICAgICAgKGJhdGNoOiBudW1iZXIsIGxvZ3M/OiBMb2dzKSA9PiB2b2lkIHwgUHJvbWlzZTx2b2lkPjtcbiAgcHJvdGVjdGVkIHJlYWRvbmx5IGJhdGNoRW5kOlxuICAgICAgKGJhdGNoOiBudW1iZXIsIGxvZ3M/OiBMb2dzKSA9PiB2b2lkIHwgUHJvbWlzZTx2b2lkPjtcbiAgcHJvdGVjdGVkIHJlYWRvbmx5IHlpZWxkOlxuICAgICAgKGVwb2NoOiBudW1iZXIsIGJhdGNoOiBudW1iZXIsIGxvZ3M6IExvZ3MpID0+IHZvaWQgfCBQcm9taXNlPHZvaWQ+O1xuXG4gIHByaXZhdGUgeWllbGRFdmVyeTogWWllbGRFdmVyeU9wdGlvbnM7XG4gIHByaXZhdGUgY3VycmVudEVwb2NoID0gMDtcbiAgcHVibGljIG5vd0Z1bmM6IEZ1bmN0aW9uO1xuICBwdWJsaWMgbmV4dEZyYW1lRnVuYzogRnVuY3Rpb247XG5cbiAgY29uc3RydWN0b3IoYXJnczogQ3VzdG9tQ2FsbGJhY2tBcmdzLCB5aWVsZEV2ZXJ5PzogWWllbGRFdmVyeU9wdGlvbnMpIHtcbiAgICBzdXBlcigpO1xuICAgIHRoaXMubm93RnVuYyA9IGFyZ3Mubm93RnVuYztcbiAgICB0aGlzLm5leHRGcmFtZUZ1bmMgPSBhcmdzLm5leHRGcmFtZUZ1bmMgfHwgbmV4dEZyYW1lO1xuICAgIHRoaXMueWllbGRFdmVyeSA9IHlpZWxkRXZlcnkgfHwgJ2F1dG8nO1xuICAgIGlmICh0aGlzLnlpZWxkRXZlcnkgPT09ICdhdXRvJykge1xuICAgICAgdGhpcy55aWVsZEV2ZXJ5ID0gREVGQVVMVF9ZSUVMRF9FVkVSWV9NUztcbiAgICB9XG4gICAgaWYgKHRoaXMueWllbGRFdmVyeSA9PT0gJ25ldmVyJyAmJiBhcmdzLm9uWWllbGQgIT0gbnVsbCkge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKFxuICAgICAgICAgICd5aWVsZEV2ZXJ5IGlzIGBuZXZlcmAgYnV0IHlvdSBwcm92aWRlZCBhbiBgb25ZaWVsZGAgY2FsbGJhY2suICcgK1xuICAgICAgICAgICdFaXRoZXIgY2hhbmdlIGB5aWVsZEV2ZXJ5YCBvciByZW1vdmUgdGhlIGNhbGxiYWNrJyk7XG4gICAgfVxuICAgIGlmICh1dGlsLmlzTnVtYmVyKHRoaXMueWllbGRFdmVyeSkpIHtcbiAgICAgIC8vIERlY29yYXRlIGBtYXliZVdhaXRgIHNvIGl0IHdpbGwgYmUgY2FsbGVkIGF0IG1vc3Qgb25jZSBldmVyeVxuICAgICAgLy8gYHlpZWxkRXZlcnlgIG1zLlxuICAgICAgdGhpcy5tYXliZVdhaXQgPSBnZW5lcmljX3V0aWxzLmRlYm91bmNlKFxuICAgICAgICAgIHRoaXMubWF5YmVXYWl0LmJpbmQodGhpcyksIHRoaXMueWllbGRFdmVyeSBhcyBudW1iZXIsIHRoaXMubm93RnVuYyk7XG4gICAgfVxuICAgIHRoaXMudHJhaW5CZWdpbiA9IGFyZ3Mub25UcmFpbkJlZ2luO1xuICAgIHRoaXMudHJhaW5FbmQgPSBhcmdzLm9uVHJhaW5FbmQ7XG4gICAgdGhpcy5lcG9jaEJlZ2luID0gYXJncy5vbkVwb2NoQmVnaW47XG4gICAgdGhpcy5lcG9jaEVuZCA9IGFyZ3Mub25FcG9jaEVuZDtcbiAgICB0aGlzLmJhdGNoQmVnaW4gPSBhcmdzLm9uQmF0Y2hCZWdpbjtcbiAgICB0aGlzLmJhdGNoRW5kID0gYXJncy5vbkJhdGNoRW5kO1xuICAgIHRoaXMueWllbGQgPSBhcmdzLm9uWWllbGQ7XG4gIH1cblxuICBhc3luYyBtYXliZVdhaXQoZXBvY2g6IG51bWJlciwgYmF0Y2g6IG51bWJlciwgbG9nczogVW5yZXNvbHZlZExvZ3MpIHtcbiAgICBjb25zdCBwczogQXJyYXk8dm9pZHxQcm9taXNlPHZvaWQ+PiA9IFtdO1xuICAgIGlmICh0aGlzLnlpZWxkICE9IG51bGwpIHtcbiAgICAgIGF3YWl0IHJlc29sdmVTY2FsYXJzSW5Mb2dzKGxvZ3MpO1xuICAgICAgcHMucHVzaCh0aGlzLnlpZWxkKGVwb2NoLCBiYXRjaCwgbG9ncyBhcyBMb2dzKSk7XG4gICAgfVxuICAgIHBzLnB1c2godGhpcy5uZXh0RnJhbWVGdW5jKCkpO1xuICAgIGF3YWl0IFByb21pc2UuYWxsKHBzKTtcbiAgfVxuXG4gIGFzeW5jIG9uRXBvY2hCZWdpbihlcG9jaDogbnVtYmVyLCBsb2dzPzogVW5yZXNvbHZlZExvZ3MpOiBQcm9taXNlPHZvaWQ+IHtcbiAgICB0aGlzLmN1cnJlbnRFcG9jaCA9IGVwb2NoO1xuICAgIGlmICh0aGlzLmVwb2NoQmVnaW4gIT0gbnVsbCkge1xuICAgICAgYXdhaXQgcmVzb2x2ZVNjYWxhcnNJbkxvZ3MobG9ncyk7XG4gICAgICBhd2FpdCB0aGlzLmVwb2NoQmVnaW4oZXBvY2gsIGxvZ3MgYXMgTG9ncyk7XG4gICAgfVxuICB9XG5cbiAgYXN5bmMgb25FcG9jaEVuZChlcG9jaDogbnVtYmVyLCBsb2dzPzogVW5yZXNvbHZlZExvZ3MpOiBQcm9taXNlPHZvaWQ+IHtcbiAgICBjb25zdCBwczogQXJyYXk8dm9pZHxQcm9taXNlPHZvaWQ+PiA9IFtdO1xuICAgIGlmICh0aGlzLmVwb2NoRW5kICE9IG51bGwpIHtcbiAgICAgIGF3YWl0IHJlc29sdmVTY2FsYXJzSW5Mb2dzKGxvZ3MpO1xuICAgICAgcHMucHVzaCh0aGlzLmVwb2NoRW5kKGVwb2NoLCBsb2dzIGFzIExvZ3MpKTtcbiAgICB9XG4gICAgaWYgKHRoaXMueWllbGRFdmVyeSA9PT0gJ2Vwb2NoJykge1xuICAgICAgcHMucHVzaCh0aGlzLm5leHRGcmFtZUZ1bmMoKSk7XG4gICAgfVxuICAgIGF3YWl0IFByb21pc2UuYWxsKHBzKTtcbiAgfVxuXG4gIGFzeW5jIG9uQmF0Y2hCZWdpbihiYXRjaDogbnVtYmVyLCBsb2dzPzogVW5yZXNvbHZlZExvZ3MpOiBQcm9taXNlPHZvaWQ+IHtcbiAgICBpZiAodGhpcy5iYXRjaEJlZ2luICE9IG51bGwpIHtcbiAgICAgIGF3YWl0IHJlc29sdmVTY2FsYXJzSW5Mb2dzKGxvZ3MpO1xuICAgICAgYXdhaXQgdGhpcy5iYXRjaEJlZ2luKGJhdGNoLCBsb2dzIGFzIExvZ3MpO1xuICAgIH1cbiAgfVxuXG4gIGFzeW5jIG9uQmF0Y2hFbmQoYmF0Y2g6IG51bWJlciwgbG9ncz86IFVucmVzb2x2ZWRMb2dzKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgY29uc3QgcHM6IEFycmF5PHZvaWR8UHJvbWlzZTx2b2lkPj4gPSBbXTtcbiAgICBpZiAodGhpcy5iYXRjaEVuZCAhPSBudWxsKSB7XG4gICAgICBhd2FpdCByZXNvbHZlU2NhbGFyc0luTG9ncyhsb2dzKTtcbiAgICAgIHBzLnB1c2godGhpcy5iYXRjaEVuZChiYXRjaCwgbG9ncyBhcyBMb2dzKSk7XG4gICAgfVxuICAgIGlmICh0aGlzLnlpZWxkRXZlcnkgPT09ICdiYXRjaCcpIHtcbiAgICAgIHBzLnB1c2godGhpcy5uZXh0RnJhbWVGdW5jKCkpO1xuICAgIH0gZWxzZSBpZiAodXRpbC5pc051bWJlcih0aGlzLnlpZWxkRXZlcnkpKSB7XG4gICAgICBwcy5wdXNoKHRoaXMubWF5YmVXYWl0KHRoaXMuY3VycmVudEVwb2NoLCBiYXRjaCwgbG9ncykpO1xuICAgIH1cbiAgICBhd2FpdCBQcm9taXNlLmFsbChwcyk7XG4gIH1cblxuICBhc3luYyBvblRyYWluQmVnaW4obG9ncz86IFVucmVzb2x2ZWRMb2dzKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgaWYgKHRoaXMudHJhaW5CZWdpbiAhPSBudWxsKSB7XG4gICAgICBhd2FpdCByZXNvbHZlU2NhbGFyc0luTG9ncyhsb2dzKTtcbiAgICAgIGF3YWl0IHRoaXMudHJhaW5CZWdpbihsb2dzIGFzIExvZ3MpO1xuICAgIH1cbiAgfVxuXG4gIGFzeW5jIG9uVHJhaW5FbmQobG9ncz86IFVucmVzb2x2ZWRMb2dzKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgaWYgKHRoaXMudHJhaW5FbmQgIT0gbnVsbCkge1xuICAgICAgYXdhaXQgcmVzb2x2ZVNjYWxhcnNJbkxvZ3MobG9ncyk7XG4gICAgICBhd2FpdCB0aGlzLnRyYWluRW5kKGxvZ3MgYXMgTG9ncyk7XG4gICAgfVxuICB9XG59XG5cbi8qKlxuICogU3RhbmRhcmRpemUgY2FsbGJhY2tzIG9yIGNvbmZpZ3VyYXRpb25zIG9mIHRoZW0gdG8gYW4gQXJyYXkgb2YgY2FsbGJhY2tzLlxuICovXG5leHBvcnQgZnVuY3Rpb24gc3RhbmRhcmRpemVDYWxsYmFja3MoXG4gICAgY2FsbGJhY2tzOiBCYXNlQ2FsbGJhY2t8QmFzZUNhbGxiYWNrW118Q3VzdG9tQ2FsbGJhY2tBcmdzfFxuICAgIEN1c3RvbUNhbGxiYWNrQXJnc1tdLFxuICAgIHlpZWxkRXZlcnk6IFlpZWxkRXZlcnlPcHRpb25zKTogQmFzZUNhbGxiYWNrW10ge1xuICBpZiAoY2FsbGJhY2tzID09IG51bGwpIHtcbiAgICBjYWxsYmFja3MgPSB7fSBhcyBCYXNlQ2FsbGJhY2s7XG4gIH1cbiAgaWYgKGNhbGxiYWNrcyBpbnN0YW5jZW9mIEJhc2VDYWxsYmFjaykge1xuICAgIHJldHVybiBbY2FsbGJhY2tzXTtcbiAgfVxuICBpZiAoQXJyYXkuaXNBcnJheShjYWxsYmFja3MpICYmIGNhbGxiYWNrc1swXSBpbnN0YW5jZW9mIEJhc2VDYWxsYmFjaykge1xuICAgIHJldHVybiBjYWxsYmFja3MgYXMgQmFzZUNhbGxiYWNrW107XG4gIH1cbiAgLy8gQ29udmVydCBjdXN0b20gY2FsbGJhY2sgY29uZmlncyB0byBjdXN0b20gY2FsbGJhY2sgb2JqZWN0cy5cbiAgY29uc3QgY2FsbGJhY2tDb25maWdzID1cbiAgICAgIGdlbmVyaWNfdXRpbHMudG9MaXN0KGNhbGxiYWNrcykgYXMgQ3VzdG9tQ2FsbGJhY2tBcmdzW107XG4gIHJldHVybiBjYWxsYmFja0NvbmZpZ3MubWFwKFxuICAgICAgY2FsbGJhY2tDb25maWcgPT4gbmV3IEN1c3RvbUNhbGxiYWNrKGNhbGxiYWNrQ29uZmlnLCB5aWVsZEV2ZXJ5KSk7XG59XG5cbmV4cG9ydCBkZWNsYXJlIHR5cGUgQmFzZUNhbGxiYWNrQ29uc3RydWN0b3IgPSB7XG4gIG5ldyAoKTogQmFzZUNhbGxiYWNrXG59O1xuXG4vKipcbiAqIEEgZ2xvYmFsIHJlZ2lzdHJ5IGZvciBjYWxsYmFjayBjb25zdHJ1Y3RvcnMgdG8gYmUgdXNlZCBkdXJpbmdcbiAqIExheWVyc01vZGVsLmZpdCgpLlxuICovXG5leHBvcnQgY2xhc3MgQ2FsbGJhY2tDb25zdHJ1Y3RvclJlZ2lzdHJ5IHtcbiAgcHJpdmF0ZSBzdGF0aWMgY29uc3RydWN0b3JzOlxuICAgICAge1t2ZXJib3NpdHlMZXZlbDogbnVtYmVyXTogQmFzZUNhbGxiYWNrQ29uc3RydWN0b3JbXX0gPSB7fTtcblxuICAvKipcbiAgICogQmxvY2tzIHB1YmxpYyBhY2Nlc3MgdG8gY29uc3RydWN0b3IuXG4gICAqL1xuICBwcml2YXRlIGNvbnN0cnVjdG9yKCkge31cblxuICAvKipcbiAgICogUmVnaXN0ZXIgYSB0Zi5MYXllcnNNb2RlbC5maXQoKSBjYWxsYmFjayBjb25zdHJ1Y3Rvci5cbiAgICpcbiAgICogVGhlIHJlZ2lzdGVyZWQgY2FsbGJhY2sgY29uc3RydWN0b3Igd2lsbCBiZSB1c2VkIHRvIGluc3RhbnRpYXRlXG4gICAqIGNhbGxiYWNrcyBmb3IgZXZlcnkgdGYuTGF5ZXJzTW9kZWwuZml0KCkgY2FsbCBhZnRlcndhcmRzLlxuICAgKlxuICAgKiBAcGFyYW0gdmVyYm9zaXR5TGV2ZWwgTGV2ZWwgb2YgdmVyYm9zaXR5IGF0IHdoaWNoIHRoZSBgY2FsbGJhY2tDb25zdHJ1Y3RvcmBcbiAgICogICBpcyB0byBiZSByZWlnc3RlcmVkLlxuICAgKiBAcGFyYW0gY2FsbGJhY2tDb25zdHJ1Y3RvciBBIG5vLWFyZyBjb25zdHJ1Y3RvciBmb3IgYHRmLkNhbGxiYWNrYC5cbiAgICogQHRocm93cyBFcnJvciwgaWYgdGhlIHNhbWUgY2FsbGJhY2tDb25zdHJ1Y3RvciBoYXMgYmVlbiByZWdpc3RlcmVkIGJlZm9yZSxcbiAgICogICBlaXRoZXIgYXQgdGhlIHNhbWUgb3IgYSBkaWZmZXJlbnQgYHZlcmJvc2l0eUxldmVsYC5cbiAgICovXG4gIHN0YXRpYyByZWdpc3RlckNhbGxiYWNrQ29uc3RydWN0b3IoXG4gICAgICB2ZXJib3NpdHlMZXZlbDogbnVtYmVyLCBjYWxsYmFja0NvbnN0cnVjdG9yOiBCYXNlQ2FsbGJhY2tDb25zdHJ1Y3Rvcikge1xuICAgIHV0aWwuYXNzZXJ0KFxuICAgICAgICB2ZXJib3NpdHlMZXZlbCA+PSAwICYmIE51bWJlci5pc0ludGVnZXIodmVyYm9zaXR5TGV2ZWwpLFxuICAgICAgICAoKSA9PiBgVmVyYm9zaXR5IGxldmVsIGlzIGV4cGVjdGVkIHRvIGJlIGFuIGludGVnZXIgPj0gMCwgYCArXG4gICAgICAgICAgICBgYnV0IGdvdCAke3ZlcmJvc2l0eUxldmVsfWApO1xuICAgIENhbGxiYWNrQ29uc3RydWN0b3JSZWdpc3RyeS5jaGVja0ZvckR1cGxpY2F0ZShjYWxsYmFja0NvbnN0cnVjdG9yKTtcbiAgICBpZiAoQ2FsbGJhY2tDb25zdHJ1Y3RvclJlZ2lzdHJ5LmNvbnN0cnVjdG9yc1t2ZXJib3NpdHlMZXZlbF0gPT0gbnVsbCkge1xuICAgICAgQ2FsbGJhY2tDb25zdHJ1Y3RvclJlZ2lzdHJ5LmNvbnN0cnVjdG9yc1t2ZXJib3NpdHlMZXZlbF0gPSBbXTtcbiAgICB9XG4gICAgQ2FsbGJhY2tDb25zdHJ1Y3RvclJlZ2lzdHJ5LmNvbnN0cnVjdG9yc1t2ZXJib3NpdHlMZXZlbF0ucHVzaChcbiAgICAgICAgY2FsbGJhY2tDb25zdHJ1Y3Rvcik7XG4gIH1cblxuICBwcml2YXRlIHN0YXRpYyBjaGVja0ZvckR1cGxpY2F0ZShjYWxsYmFja0NvbnN0cnVjdG9yOlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQmFzZUNhbGxiYWNrQ29uc3RydWN0b3IpIHtcbiAgICBmb3IgKGNvbnN0IGxldmVsTmFtZSBpbiBDYWxsYmFja0NvbnN0cnVjdG9yUmVnaXN0cnkuY29uc3RydWN0b3JzKSB7XG4gICAgICBjb25zdCBjb25zdHJ1Y3RvcnMgPSBDYWxsYmFja0NvbnN0cnVjdG9yUmVnaXN0cnkuY29uc3RydWN0b3JzWytsZXZlbE5hbWVdO1xuICAgICAgY29uc3RydWN0b3JzLmZvckVhY2goY3RvciA9PiB7XG4gICAgICAgIGlmIChjdG9yID09PSBjYWxsYmFja0NvbnN0cnVjdG9yKSB7XG4gICAgICAgICAgdGhyb3cgbmV3IFZhbHVlRXJyb3IoJ0R1cGxpY2F0ZSBjYWxsYmFjayBjb25zdHJ1Y3Rvci4nKTtcbiAgICAgICAgfVxuICAgICAgfSk7XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIENsZWFyIGFsbCByZWdpc3RlcmVkIGNhbGxiYWNrIGNvbnN0cnVjdG9ycy5cbiAgICovXG4gIHByb3RlY3RlZCBzdGF0aWMgY2xlYXIoKSB7XG4gICAgQ2FsbGJhY2tDb25zdHJ1Y3RvclJlZ2lzdHJ5LmNvbnN0cnVjdG9ycyA9IHt9O1xuICB9XG5cbiAgLyoqXG4gICAqIENyZWF0ZSBjYWxsYmFja3MgdXNpbmcgdGhlIHJlZ2lzdGVyZWQgY2FsbGJhY2sgY29uc3RydWN0b3JzLlxuICAgKlxuICAgKiBHaXZlbiBgdmVyYm9zaXR5TGV2ZWxgLCBhbGwgY29uc3RydWN0b3JzIHJlZ2lzdGVyZWQgYXQgdGhhdCBsZXZlbCBvciBhYm92ZVxuICAgKiB3aWxsIGJlIGNhbGxlZCBhbmQgdGhlIGluc3RhbnRpYXRlZCBjYWxsYmFja3Mgd2lsbCBiZSB1c2VkLlxuICAgKlxuICAgKiBAcGFyYW0gdmVyYm9zaXR5TGV2ZWw6IExldmVsIG9mIHZlcmJvc2l0eS5cbiAgICovXG4gIHN0YXRpYyBjcmVhdGVDYWxsYmFja3ModmVyYm9zaXR5TGV2ZWw6IG51bWJlcik6IEJhc2VDYWxsYmFja1tdIHtcbiAgICBjb25zdCBjb25zdHJ1Y3RvcnM6IEJhc2VDYWxsYmFja0NvbnN0cnVjdG9yW10gPSBbXTtcbiAgICBmb3IgKGNvbnN0IGxldmVsTmFtZSBpbiBDYWxsYmFja0NvbnN0cnVjdG9yUmVnaXN0cnkuY29uc3RydWN0b3JzKSB7XG4gICAgICBjb25zdCBsZXZlbCA9ICtsZXZlbE5hbWU7XG4gICAgICBpZiAodmVyYm9zaXR5TGV2ZWwgPj0gbGV2ZWwpIHtcbiAgICAgICAgY29uc3RydWN0b3JzLnB1c2goLi4uQ2FsbGJhY2tDb25zdHJ1Y3RvclJlZ2lzdHJ5LmNvbnN0cnVjdG9yc1tsZXZlbF0pO1xuICAgICAgfVxuICAgIH1cbiAgICByZXR1cm4gY29uc3RydWN0b3JzLm1hcChjdG9yID0+IG5ldyBjdG9yKCkpO1xuICB9XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBjb25maWd1cmVDYWxsYmFja3MoXG4gICAgY2FsbGJhY2tzOiBCYXNlQ2FsbGJhY2tbXSwgdmVyYm9zZTogTW9kZWxMb2dnaW5nVmVyYm9zaXR5LCBlcG9jaHM6IG51bWJlcixcbiAgICBpbml0aWFsRXBvY2g6IG51bWJlciwgbnVtVHJhaW5TYW1wbGVzOiBudW1iZXIsIHN0ZXBzUGVyRXBvY2g6IG51bWJlcixcbiAgICBiYXRjaFNpemU6IG51bWJlciwgZG9WYWxpZGF0aW9uOiBib29sZWFuLFxuICAgIGNhbGxiYWNrTWV0cmljczogc3RyaW5nW10pOiB7Y2FsbGJhY2tMaXN0OiBDYWxsYmFja0xpc3QsIGhpc3Rvcnk6IEhpc3Rvcnl9IHtcbiAgY29uc3QgaGlzdG9yeSA9IG5ldyBIaXN0b3J5KCk7XG4gIGNvbnN0IGFjdHVhbENhbGxiYWNrczogQmFzZUNhbGxiYWNrW10gPSBbXG4gICAgbmV3IEJhc2VMb2dnZXIoKSwgLi4uQ2FsbGJhY2tDb25zdHJ1Y3RvclJlZ2lzdHJ5LmNyZWF0ZUNhbGxiYWNrcyh2ZXJib3NlKVxuICBdO1xuICBpZiAoY2FsbGJhY2tzICE9IG51bGwpIHtcbiAgICBhY3R1YWxDYWxsYmFja3MucHVzaCguLi5jYWxsYmFja3MpO1xuICB9XG4gIGFjdHVhbENhbGxiYWNrcy5wdXNoKGhpc3RvcnkpO1xuICBjb25zdCBjYWxsYmFja0xpc3QgPSBuZXcgQ2FsbGJhY2tMaXN0KGFjdHVhbENhbGxiYWNrcyk7XG5cbiAgLy8gVE9ETyhjYWlzKTogRmlndXJlIG91dCB3aGVuIHRoaXMgTGF5ZXJzTW9kZWwgaW5zdGFuY2UgY2FuIGhhdmUgYVxuICAvLyBkeW5hbWljYWxseVxuICAvLyAgIHNldCBwcm9wZXJ0eSBjYWxsZWQgJ2NhbGxiYWNrX21vZGVsJyBhcyBpbiBQeUtlcmFzLlxuXG4gIGNhbGxiYWNrTGlzdC5zZXRQYXJhbXMoe1xuICAgIGVwb2NocyxcbiAgICBpbml0aWFsRXBvY2gsXG4gICAgc2FtcGxlczogbnVtVHJhaW5TYW1wbGVzLFxuICAgIHN0ZXBzOiBzdGVwc1BlckVwb2NoLFxuICAgIGJhdGNoU2l6ZSxcbiAgICB2ZXJib3NlLFxuICAgIGRvVmFsaWRhdGlvbixcbiAgICBtZXRyaWNzOiBjYWxsYmFja01ldHJpY3MsXG4gIH0pO1xuICByZXR1cm4ge2NhbGxiYWNrTGlzdCwgaGlzdG9yeX07XG59XG4iXX0=","/**\n * @license\n * Copyright 2018 Google LLC\n *\n * Use of this source code is governed by an MIT-style\n * license that can be found in the LICENSE file or at\n * https://opensource.org/licenses/MIT.\n * =============================================================================\n */\n/* Original Source layers/__init__.py */\nimport { serialization } from '@tensorflow/tfjs-core';\nimport { deserializeKerasObject } from '../utils/generic_utils';\n/**\n * Instantiate a layer from a config dictionary.\n * @param config dict of the form {class_name: str, config: dict}\n * @param customObjects dict mapping class names (or function names)\n * of custom (non-Keras) objects to class/functions\n * @param fastWeightInit Optional flag to use fast weight initialization\n * during deserialization. This is applicable to cases in which\n * the initialization will be immediately overwritten by loaded weight\n * values. Default: `false`.\n * @returns Layer instance (may be LayersModel, Sequential, Layer...)\n */\nexport function deserialize(config, customObjects = {}, fastWeightInit = false) {\n return deserializeKerasObject(config, serialization.SerializationMap.getMap().classNameMap, customObjects, 'layer', fastWeightInit);\n}\n//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic2VyaWFsaXphdGlvbi5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uLy4uL3RmanMtbGF5ZXJzL3NyYy9sYXllcnMvc2VyaWFsaXphdGlvbi50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQTs7Ozs7Ozs7R0FRRztBQUVILHdDQUF3QztBQUN4QyxPQUFPLEVBQUMsYUFBYSxFQUFDLE1BQU0sdUJBQXVCLENBQUM7QUFFcEQsT0FBTyxFQUFDLHNCQUFzQixFQUFDLE1BQU0sd0JBQXdCLENBQUM7QUFFOUQ7Ozs7Ozs7Ozs7R0FVRztBQUNILE1BQU0sVUFBVSxXQUFXLENBQ3ZCLE1BQWdDLEVBQ2hDLGdCQUFnQixFQUE4QixFQUM5QyxjQUFjLEdBQUcsS0FBSztJQUN4QixPQUFPLHNCQUFzQixDQUN6QixNQUFNLEVBQUUsYUFBYSxDQUFDLGdCQUFnQixDQUFDLE1BQU0sRUFBRSxDQUFDLFlBQVksRUFDNUQsYUFBYSxFQUFFLE9BQU8sRUFBRSxjQUFjLENBQUMsQ0FBQztBQUM5QyxDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiLyoqXG4gKiBAbGljZW5zZVxuICogQ29weXJpZ2h0IDIwMTggR29vZ2xlIExMQ1xuICpcbiAqIFVzZSBvZiB0aGlzIHNvdXJjZSBjb2RlIGlzIGdvdmVybmVkIGJ5IGFuIE1JVC1zdHlsZVxuICogbGljZW5zZSB0aGF0IGNhbiBiZSBmb3VuZCBpbiB0aGUgTElDRU5TRSBmaWxlIG9yIGF0XG4gKiBodHRwczovL29wZW5zb3VyY2Uub3JnL2xpY2Vuc2VzL01JVC5cbiAqID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4gKi9cblxuLyogT3JpZ2luYWwgU291cmNlIGxheWVycy9fX2luaXRfXy5weSAqL1xuaW1wb3J0IHtzZXJpYWxpemF0aW9ufSBmcm9tICdAdGVuc29yZmxvdy90ZmpzLWNvcmUnO1xuXG5pbXBvcnQge2Rlc2VyaWFsaXplS2VyYXNPYmplY3R9IGZyb20gJy4uL3V0aWxzL2dlbmVyaWNfdXRpbHMnO1xuXG4vKipcbiAqIEluc3RhbnRpYXRlIGEgbGF5ZXIgZnJvbSBhIGNvbmZpZyBkaWN0aW9uYXJ5LlxuICogQHBhcmFtIGNvbmZpZyBkaWN0IG9mIHRoZSBmb3JtIHtjbGFzc19uYW1lOiBzdHIsIGNvbmZpZzogZGljdH1cbiAqIEBwYXJhbSBjdXN0b21PYmplY3RzIGRpY3QgbWFwcGluZyBjbGFzcyBuYW1lcyAob3IgZnVuY3Rpb24gbmFtZXMpXG4gKiAgIG9mIGN1c3RvbSAobm9uLUtlcmFzKSBvYmplY3RzIHRvIGNsYXNzL2Z1bmN0aW9uc1xuICogQHBhcmFtIGZhc3RXZWlnaHRJbml0IE9wdGlvbmFsIGZsYWcgdG8gdXNlIGZhc3Qgd2VpZ2h0IGluaXRpYWxpemF0aW9uXG4gKiAgIGR1cmluZyBkZXNlcmlhbGl6YXRpb24uIFRoaXMgaXMgYXBwbGljYWJsZSB0byBjYXNlcyBpbiB3aGljaFxuICogICB0aGUgaW5pdGlhbGl6YXRpb24gd2lsbCBiZSBpbW1lZGlhdGVseSBvdmVyd3JpdHRlbiBieSBsb2FkZWQgd2VpZ2h0XG4gKiAgIHZhbHVlcy4gRGVmYXVsdDogYGZhbHNlYC5cbiAqIEByZXR1cm5zIExheWVyIGluc3RhbmNlIChtYXkgYmUgTGF5ZXJzTW9kZWwsIFNlcXVlbnRpYWwsIExheWVyLi4uKVxuICovXG5leHBvcnQgZnVuY3Rpb24gZGVzZXJpYWxpemUoXG4gICAgY29uZmlnOiBzZXJpYWxpemF0aW9uLkNvbmZpZ0RpY3QsXG4gICAgY3VzdG9tT2JqZWN0cyA9IHt9IGFzIHNlcmlhbGl6YXRpb24uQ29uZmlnRGljdCxcbiAgICBmYXN0V2VpZ2h0SW5pdCA9IGZhbHNlKTogc2VyaWFsaXphdGlvbi5TZXJpYWxpemFibGUge1xuICByZXR1cm4gZGVzZXJpYWxpemVLZXJhc09iamVjdChcbiAgICAgIGNvbmZpZywgc2VyaWFsaXphdGlvbi5TZXJpYWxpemF0aW9uTWFwLmdldE1hcCgpLmNsYXNzTmFtZU1hcCxcbiAgICAgIGN1c3RvbU9iamVjdHMsICdsYXllcicsIGZhc3RXZWlnaHRJbml0KTtcbn1cbiJdfQ==","/**\n * @license\n * Copyright 2018 Google LLC\n *\n * Use of this source code is governed by an MIT-style\n * license that can be found in the LICENSE file or at\n * https://opensource.org/licenses/MIT.\n * =============================================================================\n */\n/* Original Source: losses.py */\nimport * as tfc from '@tensorflow/tfjs-core';\nimport { tidy, util } from '@tensorflow/tfjs-core';\nimport { epsilon } from './backend/common';\nimport * as K from './backend/tfjs_backend';\nimport { ValueError } from './errors';\n/**\n * Normalizes a tensor wrt the L2 norm alongside the specified axis.\n * @param x\n * @param axis Axis along which to perform normalization.\n */\nexport function l2Normalize(x, axis) {\n return tidy(() => {\n if (x.dtype !== 'float32') {\n x = tfc.cast(x, 'float32');\n }\n const squareSum = tfc.sum(K.square(x), axis, true);\n const epsilonTensor = tfc.fill(squareSum.shape, epsilon());\n const norm = tfc.sqrt(tfc.maximum(squareSum, epsilonTensor));\n return tfc.div(x, norm);\n });\n}\nexport function meanSquaredError(yTrue, yPred) {\n return tidy(() => tfc.mean(K.square(tfc.sub(yPred, yTrue)), -1));\n}\nexport function meanAbsoluteError(yTrue, yPred) {\n return tidy(() => tfc.mean(tfc.abs(tfc.sub(yPred, yTrue)), -1));\n}\nexport function meanAbsolutePercentageError(yTrue, yPred) {\n return tidy(() => {\n const diff = tfc.sub(yTrue, yPred);\n const clippedTrue = tfc.clipByValue(tfc.abs(yTrue), epsilon(), Number.MAX_VALUE);\n const absResult = tfc.abs(tfc.div(diff, clippedTrue));\n return tfc.mul(100, tfc.mean(absResult, -1));\n });\n}\nexport function meanSquaredLogarithmicError(yTrue, yPred) {\n return tidy(() => {\n const clippedPred = tfc.clipByValue(yPred, epsilon(), Number.MAX_VALUE);\n const firstLog = tfc.log(tfc.add(1, clippedPred));\n const clippedTrue = tfc.clipByValue(yTrue, epsilon(), Number.MAX_VALUE);\n const secondLog = tfc.log(tfc.add(1, clippedTrue));\n return tfc.mean(K.square(tfc.sub(firstLog, secondLog)), -1);\n });\n}\nexport function squaredHinge(yTrue, yPred) {\n return tidy(() => {\n const maxResult = tfc.maximum(0, tfc.sub(1, tfc.mul(yTrue, yPred)));\n return tfc.mean(K.square(maxResult), -1);\n });\n}\nexport function hinge(yTrue, yPred) {\n return tidy(() => {\n const maxResult = tfc.maximum(0, tfc.sub(1, tfc.mul(yTrue, yPred)));\n return tfc.mean(maxResult, -1);\n });\n}\nexport function categoricalHinge(yTrue, yPred) {\n return tidy(() => {\n const pos = tfc.sum(tfc.mul(yTrue, yPred), -1);\n const neg = tfc.max(tfc.mul(tfc.sub(1, yTrue), yPred), -1);\n return tfc.maximum(0, tfc.add(1, tfc.sub(neg, pos)));\n });\n}\n/**\n * Logarithm of the hyperbolic cosine of the prediction error.\n *\n * `log(cosh(x))` is approximately equal to `(x ** 2) / 2` for small `x` and\n * to `abs(x) - log(2)` for large `x`. This means that 'logcosh' works mostly\n * like the mean squared error, but will not be so strongly affected by the\n * occasional wildly incorrect prediction.\n */\nexport function logcosh(yTrue, yPred) {\n return tidy(() => {\n const log2 = Math.log(2);\n const predictionDiff = tfc.sub(yPred, yTrue);\n const logcoshResult = tfc.sub(tfc.add(predictionDiff, tfc.softplus(tfc.mul(-2, predictionDiff))), log2);\n return tfc.mean(logcoshResult, -1);\n });\n}\nexport function categoricalCrossentropy(target, output, fromLogits = false) {\n return tidy(() => {\n if (fromLogits) {\n output = tfc.softmax(output);\n }\n else {\n // scale preds so that the class probabilities of each sample sum to 1.\n const outputSum = tfc.sum(output, output.shape.length - 1, true);\n output = tfc.div(output, outputSum);\n }\n output = tfc.clipByValue(output, epsilon(), 1 - epsilon());\n return tfc.neg(tfc.sum(tfc.mul(tfc.cast(target, 'float32'), tfc.log(output)), output.shape.length - 1));\n });\n}\n/**\n * Categorical crossentropy with integer targets.\n *\n * @param target An integer tensor.\n * @param output A tensor resulting from a softmax (unless `fromLogits` is\n * `true`, in which case `output` is expected to be the logits).\n * @param fromLogits Boolean, whether `output` is the result of a softmax, or is\n * a tensor of logits.\n */\nexport function sparseCategoricalCrossentropy(target, output, fromLogits = false) {\n return tidy(() => {\n const flatTarget = tfc.cast(tfc.floor(K.flatten(target)), 'int32');\n output = tfc.clipByValue(output, epsilon(), 1 - epsilon());\n const outputShape = output.shape;\n const oneHotTarget = tfc.reshape(tfc.oneHot(flatTarget, outputShape[outputShape.length - 1]), outputShape);\n return categoricalCrossentropy(oneHotTarget, output, fromLogits);\n });\n}\n/**\n * From TensorFlow's implementation in nn_impl.py:\n *\n * For brevity, let `x = logits`, `z = labels`. The logistic loss is\n * z * -log(sigmoid(x)) + (1 - z) * -log(1 - sigmoid(x))\n * = z * -log(1 / (1 + exp(-x))) + (1 - z) * -log(exp(-x) / (1 + exp(-x)))\n * = z * log(1 + exp(-x)) + (1 - z) * (-log(exp(-x)) + log(1 + exp(-x)))\n * = z * log(1 + exp(-x)) + (1 - z) * (x + log(1 + exp(-x))\n * = (1 - z) * x + log(1 + exp(-x))\n * = x - x * z + log(1 + exp(-x))\n * For x < 0, to avoid overflow in exp(-x), we reformulate the above\n * x - x * z + log(1 + exp(-x))\n * = log(exp(x)) - x * z + log(1 + exp(-x))\n * = - x * z + log(1 + exp(x))\n * Hence, to ensure stability and avoid overflow, the implementation uses this\n * equivalent formulation\n * max(x, 0) - x * z + log(1 + exp(-abs(x)))\n *\n * @param labels The labels.\n * @param logits The logits.\n */\nexport function sigmoidCrossEntropyWithLogits(labels, logits) {\n if (!util.arraysEqual(labels.shape, logits.shape)) {\n throw new ValueError(`logits and labels must have the same shape, but got shapes ` +\n `${JSON.stringify(labels.shape)} and ${JSON.stringify(logits.shape)}`);\n }\n return tidy(() => {\n // The logistic loss formula from above is\n // x - x * z + log(1 + exp(-x))\n // For x < 0, a more numerically stable formula is\n // -x * z + log(1 + exp(x))\n // Note that these two expressions can be combined into the following:\n // max(x, 0) - x * z + log(1 + exp(-abs(x)))\n const reluLogits = tfc.relu(logits);\n const negAbsLogits = tfc.neg(tfc.abs(logits));\n return tfc.add(tfc.sub(reluLogits, tfc.mul(logits, labels)), tfc.log1p(tfc.exp(negAbsLogits)));\n });\n}\nexport function binaryCrossentropy(yTrue, yPred) {\n return tidy(() => {\n let y;\n y = tfc.clipByValue(yPred, epsilon(), 1 - epsilon());\n y = tfc.log(tfc.div(y, tfc.sub(1, y)));\n return tfc.mean(sigmoidCrossEntropyWithLogits(yTrue, y), -1);\n });\n}\nexport function kullbackLeiblerDivergence(yTrue, yPred) {\n return tidy(() => {\n const clippedTrue = tfc.clipByValue(yTrue, epsilon(), 1);\n const clippedPred = tfc.clipByValue(yPred, epsilon(), 1);\n return tfc.sum(tfc.mul(yTrue, tfc.log(tfc.div(clippedTrue, clippedPred))), -1);\n });\n}\nexport function poisson(yTrue, yPred) {\n return tidy(() => {\n const logPred = tfc.log(tfc.add(epsilon(), yPred));\n return tfc.mean(tfc.sub(yPred, tfc.mul(yTrue, logPred)), -1);\n });\n}\nexport function cosineProximity(yTrue, yPred) {\n return tidy(() => {\n const trueNormalized = l2Normalize(yTrue, -1);\n const predNormalized = l2Normalize(yPred, -1);\n const trueXPred = tfc.mul(trueNormalized, predNormalized);\n return tfc.neg(tfc.sum(trueXPred, -1));\n });\n}\nexport const mse = meanSquaredError;\nexport const MSE = meanSquaredError;\nexport const mae = meanAbsoluteError;\nexport const MAE = meanAbsoluteError;\nexport const mape = meanAbsolutePercentageError;\nexport const MAPE = meanAbsolutePercentageError;\nexport const msle = meanSquaredLogarithmicError;\nexport const MSLE = meanSquaredLogarithmicError;\nexport const kld = kullbackLeiblerDivergence;\nexport const KLD = kullbackLeiblerDivergence;\nexport const cosine = cosineProximity;\n// TODO(michaelterry): Add deserialize() function.\nexport const lossesMap = {\n meanSquaredError,\n meanAbsoluteError,\n meanAbsolutePercentageError,\n meanSquaredLogarithmicError,\n squaredHinge,\n hinge,\n categoricalHinge,\n logcosh,\n categoricalCrossentropy,\n sparseCategoricalCrossentropy,\n binaryCrossentropy,\n kullbackLeiblerDivergence,\n poisson,\n cosineProximity\n};\n// Porting note: This diverges from the PyKeras implementation and may need to\n// change based on (de)serialization requirements.\nexport function get(identifierOrFn) {\n if (typeof identifierOrFn === 'string') {\n if (identifierOrFn in lossesMap) {\n return lossesMap[identifierOrFn];\n }\n let errMsg = `Unknown loss ${identifierOrFn}`;\n if (identifierOrFn.toLowerCase().includes('softmaxcrossentropy')) {\n errMsg = `Unknown loss ${identifierOrFn}. ` +\n 'Use \"categoricalCrossentropy\" as the string name for ' +\n 'tf.losses.softmaxCrossEntropy';\n }\n throw new ValueError(errMsg);\n }\n else {\n return identifierOrFn;\n }\n}\n//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibG9zc2VzLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vdGZqcy1sYXllcnMvc3JjL2xvc3Nlcy50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQTs7Ozs7Ozs7R0FRRztBQUVILGdDQUFnQztBQUNoQyxPQUFPLEtBQUssR0FBRyxNQUFNLHVCQUF1QixDQUFDO0FBQzdDLE9BQU8sRUFBbUIsSUFBSSxFQUFFLElBQUksRUFBQyxNQUFNLHVCQUF1QixDQUFDO0FBRW5FLE9BQU8sRUFBQyxPQUFPLEVBQUMsTUFBTSxrQkFBa0IsQ0FBQztBQUN6QyxPQUFPLEtBQUssQ0FBQyxNQUFNLHdCQUF3QixDQUFDO0FBQzVDLE9BQU8sRUFBQyxVQUFVLEVBQUMsTUFBTSxVQUFVLENBQUM7QUFHcEM7Ozs7R0FJRztBQUNILE1BQU0sVUFBVSxXQUFXLENBQUMsQ0FBUyxFQUFFLElBQWE7SUFDbEQsT0FBTyxJQUFJLENBQUMsR0FBRyxFQUFFO1FBQ2YsSUFBSSxDQUFDLENBQUMsS0FBSyxLQUFLLFNBQVMsRUFBRTtZQUN6QixDQUFDLEdBQUcsR0FBRyxDQUFDLElBQUksQ0FBQyxDQUFDLEVBQUUsU0FBUyxDQUFDLENBQUM7U0FDNUI7UUFDRCxNQUFNLFNBQVMsR0FBRyxHQUFHLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxNQUFNLENBQUMsQ0FBQyxDQUFDLEVBQUUsSUFBSSxFQUFFLElBQUksQ0FBQyxDQUFDO1FBQ25ELE1BQU0sYUFBYSxHQUFHLEdBQUcsQ0FBQyxJQUFJLENBQUMsU0FBUyxDQUFDLEtBQUssRUFBRSxPQUFPLEVBQUUsQ0FBQyxDQUFDO1FBQzNELE1BQU0sSUFBSSxHQUFHLEdBQUcsQ0FBQyxJQUFJLENBQUMsR0FBRyxDQUFDLE9BQU8sQ0FBQyxTQUFTLEVBQUUsYUFBYSxDQUFDLENBQUMsQ0FBQztRQUM3RCxPQUFPLEdBQUcsQ0FBQyxHQUFHLENBQUMsQ0FBQyxFQUFFLElBQUksQ0FBQyxDQUFDO0lBQzFCLENBQUMs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SUFDM0IsWUFBWTtJQUNaLEtBQUs7SUFDTCxnQkFBZ0I7SUFDaEIsT0FBTztJQUNQLHVCQUF1QjtJQUN2Qiw2QkFBNkI7SUFDN0Isa0JBQWtCO0lBQ2xCLHlCQUF5QjtJQUN6QixPQUFPO0lBQ1AsZUFBZTtDQUNoQixDQUFDO0FBRUYsOEVBQThFO0FBQzlFLGtEQUFrRDtBQUNsRCxNQUFNLFVBQVUsR0FBRyxDQUFDLGNBQXFDO0lBQ3ZELElBQUksT0FBTyxjQUFjLEtBQUssUUFBUSxFQUFFO1FBQ3RDLElBQUksY0FBYyxJQUFJLFNBQVMsRUFBRTtZQUMvQixPQUFPLFNBQVMsQ0FBQyxjQUFjLENBQUMsQ0FBQztTQUNsQztRQUNELElBQUksTUFBTSxHQUFHLGdCQUFnQixjQUFjLEVBQUUsQ0FBQztRQUM5QyxJQUFJLGNBQWMsQ0FBQyxXQUFXLEVBQUUsQ0FBQyxRQUFRLENBQUMscUJBQXFCLENBQUMsRUFBRTtZQUNoRSxNQUFNLEdBQUcsZ0JBQWdCLGNBQWMsSUFBSTtnQkFDdkMsdURBQXVEO2dCQUN2RCwrQkFBK0IsQ0FBQztTQUNyQztRQUNELE1BQU0sSUFBSSxVQUFVLENBQUMsTUFBTSxDQUFDLENBQUM7S0FDOUI7U0FBTTtRQUNMLE9BQU8sY0FBYyxDQUFDO0tBQ3ZCO0FBQ0gsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbIi8qKlxuICogQGxpY2Vuc2VcbiAqIENvcHlyaWdodCAyMDE4IEdvb2dsZSBMTENcbiAqXG4gKiBVc2Ugb2YgdGhpcyBzb3VyY2UgY29kZSBpcyBnb3Zlcm5lZCBieSBhbiBNSVQtc3R5bGVcbiAqIGxpY2Vuc2UgdGhhdCBjYW4gYmUgZm91bmQgaW4gdGhlIExJQ0VOU0UgZmlsZSBvciBhdFxuICogaHR0cHM6Ly9vcGVuc291cmNlLm9yZy9saWNlbnNlcy9NSVQuXG4gKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuICovXG5cbi8qIE9yaWdpbmFsIFNvdXJjZTogbG9zc2VzLnB5ICovXG5pbXBvcnQgKiBhcyB0ZmMgZnJvbSAnQHRlbnNvcmZsb3cvdGZqcy1jb3JlJztcbmltcG9ydCB7VGVuc29yLCBUZW5zb3IxRCwgdGlkeSwgdXRpbH0gZnJvbSAnQHRlbnNvcmZsb3cvdGZqcy1jb3JlJztcblxuaW1wb3J0IHtlcHNpbG9ufSBmcm9tICcuL2JhY2tlbmQvY29tbW9uJztcbmltcG9ydCAqIGFzIEsgZnJvbSAnLi9iYWNrZW5kL3RmanNfYmFja2VuZCc7XG5pbXBvcnQge1ZhbHVlRXJyb3J9IGZyb20gJy4vZXJyb3JzJztcbmltcG9ydCB7TG9zc09yTWV0cmljRm59IGZyb20gJy4vdHlwZXMnO1xuXG4vKipcbiAqIE5vcm1hbGl6ZXMgYSB0ZW5zb3Igd3J0IHRoZSBMMiBub3JtIGFsb25nc2lkZSB0aGUgc3BlY2lmaWVkIGF4aXMuXG4gKiBAcGFyYW0geFxuICogQHBhcmFtIGF4aXMgQXhpcyBhbG9uZyB3aGljaCB0byBwZXJmb3JtIG5vcm1hbGl6YXRpb24uXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBsMk5vcm1hbGl6ZSh4OiBUZW5zb3IsIGF4aXM/OiBudW1iZXIpOiBUZW5zb3Ige1xuICByZXR1cm4gdGlkeSgoKSA9PiB7XG4gICAgaWYgKHguZHR5cGUgIT09ICdmbG9hdDMyJykge1xuICAgICAgeCA9IHRmYy5jYXN0KHgsICdmbG9hdDMyJyk7XG4gICAgfVxuICAgIGNvbnN0IHNxdWFyZVN1bSA9IHRmYy5zdW0oSy5zcXVhcmUoeCksIGF4aXMsIHRydWUpO1xuICAgIGNvbnN0IGVwc2lsb25UZW5zb3IgPSB0ZmMuZmlsbChzcXVhcmVTdW0uc2hhcGUsIGVwc2lsb24oKSk7XG4gICAgY29uc3Qgbm9ybSA9IHRmYy5zcXJ0KHRmYy5tYXhpbXVtKHNxdWFyZVN1bSwgZXBzaWxvblRlbnNvcikpO1xuICAgIHJldHVybiB0ZmMuZGl2KHgsIG5vcm0pO1xuICB9KTtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIG1lYW5TcXVhcmVkRXJyb3IoeVRydWU6IFRlbnNvciwgeVByZWQ6IFRlbnNvcik6IFRlbnNvciB7XG4gIHJldHVybiB0aWR5KCgpID0+IHRmYy5tZWFuKEsuc3F1YXJlKHRmYy5zdWIoeVByZWQsIHlUcnVlKSksIC0xKSk7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBtZWFuQWJzb2x1dGVFcnJvcih5VHJ1ZTogVGVuc29yLCB5UHJlZDogVGVuc29yKTogVGVuc29yIHtcbiAgcmV0dXJuIHRpZHkoKCkgPT4gdGZjLm1lYW4odGZjLmFicyh0ZmMuc3ViKHlQcmVkLCB5VHJ1ZSkpLCAtMSkpO1xufVxuXG5leHBvcnQgZnVuY3Rpb24gbWVhbkFic29sdXRlUGVyY2VudGFnZUVycm9yKFxuICAgIHlUcnVlOiBUZW5zb3IsIHlQcmVkOiBUZW5zb3IpOiBUZW5zb3Ige1xuICByZXR1cm4gdGlkeSgoKSA9PiB7XG4gICAgY29uc3QgZGlmZiA9IHRmYy5zdWIoeVRydWUsIHlQcmVkKTtcbiAgICBjb25zdCBjbGlwcGVkVHJ1ZSA9XG4gICAgICAgIHRmYy5jbGlwQnlWYWx1ZSh0ZmMuYWJzKHlUcnVlKSwgZXBzaWxvbigpLCBOdW1iZXIuTUFYX1ZBTFVFKTtcbiAgICBjb25zdCBhYnNSZXN1bHQgPSB0ZmMuYWJzKHRmYy5kaXYoZGlmZiwgY2xpcHBlZFRydWUpKTtcbiAgICByZXR1cm4gdGZjLm11bCgxMDAsIHRmYy5tZWFuKGFic1Jlc3VsdCwgLTEpKTtcbiAgfSk7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBtZWFuU3F1YXJlZExvZ2FyaXRobWljRXJyb3IoXG4gICAgeVRydWU6IFRlbnNvciwgeVByZWQ6IFRlbnNvcik6IFRlbnNvciB7XG4gIHJldHVybiB0aWR5KCgpID0+IHtcbiAgICBjb25zdCBjbGlwcGVkUHJlZCA9IHRmYy5jbGlwQnlWYWx1ZSh5UHJlZCwgZXBzaWxvbigpLCBOdW1iZXIuTUFYX1ZBTFVFKTtcbiAgICBjb25zdCBmaXJzdExvZyA9IHRmYy5sb2codGZjLmFkZCgxLCBjbGlwcGVkUHJlZCkpO1xuXG4gICAgY29uc3QgY2xpcHBlZFRydWUgPSB0ZmMuY2xpcEJ5VmFsdWUoeVRydWUsIGVwc2lsb24oKSwgTnVtYmVyLk1BWF9WQUxVRSk7XG4gICAgY29uc3Qgc2Vjb25kTG9nID0gdGZjLmxvZyh0ZmMuYWRkKDEsIGNsaXBwZWRUcnVlKSk7XG5cbiAgICByZXR1cm4gdGZjLm1lYW4oSy5zcXVhcmUodGZjLnN1YihmaXJzdExvZywgc2Vjb25kTG9nKSksIC0xKTtcbiAgfSk7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBzcXVhcmVkSGluZ2UoeVRydWU6IFRlbnNvciwgeVByZWQ6IFRlbnNvcik6IFRlbnNvciB7XG4gIHJldHVybiB0aWR5KCgpID0+IHtcbiAgICBjb25zdCBtYXhSZXN1bHQgPSB0ZmMubWF4aW11bSgwLCB0ZmMuc3ViKDEsIHRmYy5tdWwoeVRydWUsIHlQcmVkKSkpO1xuICAgIHJldHVybiB0ZmMubWVhbihLLnNxdWFyZShtYXhSZXN1bHQpLCAtMSk7XG4gIH0pO1xufVxuXG5leHBvcnQgZnVuY3Rpb24gaGluZ2UoeVRydWU6IFRlbnNvciwgeVByZWQ6IFRlbnNvcik6IFRlbnNvciB7XG4gIHJldHVybiB0aWR5KCgpID0+IHtcbiAgICBjb25zdCBtYXhSZXN1bHQgPSB0ZmMubWF4aW11bSgwLCB0ZmMuc3ViKDEsIHRmYy5tdWwoeVRydWUsIHlQcmVkKSkpO1xuICAgIHJldHVybiB0ZmMubWVhbihtYXhSZXN1bHQsIC0xKTtcbiAgfSk7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBjYXRlZ29yaWNhbEhpbmdlKHlUcnVlOiBUZW5zb3IsIHlQcmVkOiBUZW5zb3IpOiBUZW5zb3Ige1xuICByZXR1cm4gdGlkeSgoKSA9PiB7XG4gICAgY29uc3QgcG9zID0gdGZjLnN1bSh0ZmMubXVsKHlUcnVlLCB5UHJlZCksIC0xKTtcbiAgICBjb25zdCBuZWcgPSB0ZmMubWF4KHRmYy5tdWwodGZjLnN1YigxLCB5VHJ1ZSksIHlQcmVkKSwgLTEpO1xuICAgIHJldHVybiB0ZmMubWF4aW11bSgwLCB0ZmMuYWRkKDEsIHRmYy5zdWIobmVnLCBwb3MpKSk7XG4gIH0pO1xufVxuXG4vKipcbiAqIExvZ2FyaXRobSBvZiB0aGUgaHlwZXJib2xpYyBjb3NpbmUgb2YgdGhlIHByZWRpY3Rpb24gZXJyb3IuXG4gKlxuICogYGxvZyhjb3NoKHgpKWAgaXMgYXBwcm94aW1hdGVseSBlcXVhbCB0byBgKHggKiogMikgLyAyYCBmb3Igc21hbGwgYHhgIGFuZFxuICogdG8gYGFicyh4KSAtIGxvZygyKWAgZm9yIGxhcmdlIGB4YC4gVGhpcyBtZWFucyB0aGF0ICdsb2djb3NoJyB3b3JrcyBtb3N0bHlcbiAqIGxpa2UgdGhlIG1lYW4gc3F1YXJlZCBlcnJvciwgYnV0IHdpbGwgbm90IGJlIHNvIHN0cm9uZ2x5IGFmZmVjdGVkIGJ5IHRoZVxuICogb2NjYXNpb25hbCB3aWxkbHkgaW5jb3JyZWN0IHByZWRpY3Rpb24uXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBsb2djb3NoKHlUcnVlOiBUZW5zb3IsIHlQcmVkOiBUZW5zb3IpOiBUZW5zb3Ige1xuICByZXR1cm4gdGlkeSgoKSA9PiB7XG4gICAgY29uc3QgbG9nMiA9IE1hdGgubG9nKDIpO1xuICAgIGNvbnN0IHByZWRpY3Rpb25EaWZmID0gdGZjLnN1Yih5UHJlZCwgeVRydWUpO1xuICAgIGNvbnN0IGxvZ2Nvc2hSZXN1bHQgPSB0ZmMuc3ViKFxuICAgICAgICB0ZmMuYWRkKHByZWRpY3Rpb25EaWZmLCB0ZmMuc29mdHBsdXModGZjLm11bCgtMiwgcHJlZGljdGlvbkRpZmYpKSksXG4gICAgICAgIGxvZzIpO1xuICAgIHJldHVybiB0ZmMubWVhbihsb2djb3NoUmVzdWx0LCAtMSk7XG4gIH0pO1xufVxuXG5leHBvcnQgZnVuY3Rpb24gY2F0ZWdvcmljYWxDcm9zc2VudHJvcHkoXG4gICAgdGFyZ2V0OiBUZW5zb3IsIG91dHB1dDogVGVuc29yLCBmcm9tTG9naXRzID0gZmFsc2UpOiBUZW5zb3Ige1xuICByZXR1cm4gdGlkeSgoKSA9PiB7XG4gICAgaWYgKGZyb21Mb2dpdHMpIHtcbiAgICAgIG91dHB1dCA9IHRmYy5zb2Z0bWF4KG91dHB1dCk7XG4gICAgfSBlbHNlIHtcbiAgICAgIC8vIHNjYWxlIHByZWRzIHNvIHRoYXQgdGhlIGNsYXNzIHByb2JhYmlsaXRpZXMgb2YgZWFjaCBzYW1wbGUgc3VtIHRvIDEuXG4gICAgICBjb25zdCBvdXRwdXRTdW0gPSB0ZmMuc3VtKG91dHB1dCwgb3V0cHV0LnNoYXBlLmxlbmd0aCAtIDEsIHRydWUpO1xuICAgICAgb3V0cHV0ID0gdGZjLmRpdihvdXRwdXQsIG91dHB1dFN1bSk7XG4gICAgfVxuICAgIG91dHB1dCA9IHRmYy5jbGlwQnlWYWx1ZShvdXRwdXQsIGVwc2lsb24oKSwgMSAtIGVwc2lsb24oKSk7XG4gICAgcmV0dXJuIHRmYy5uZWcodGZjLnN1bShcbiAgICAgICAgdGZjLm11bCh0ZmMuY2FzdCh0YXJnZXQsICdmbG9hdDMyJyksIHRmYy5sb2cob3V0cHV0KSksXG4gICAgICAgIG91dHB1dC5zaGFwZS5sZW5ndGggLSAxKSk7XG4gIH0pO1xufVxuXG4vKipcbiAqIENhdGVnb3JpY2FsIGNyb3NzZW50cm9weSB3aXRoIGludGVnZXIgdGFyZ2V0cy5cbiAqXG4gKiBAcGFyYW0gdGFyZ2V0IEFuIGludGVnZXIgdGVuc29yLlxuICogQHBhcmFtIG91dHB1dCBBIHRlbnNvciByZXN1bHRpbmcgZnJvbSBhIHNvZnRtYXggKHVubGVzcyBgZnJvbUxvZ2l0c2AgaXNcbiAqICBgdHJ1ZWAsIGluIHdoaWNoIGNhc2UgYG91dHB1dGAgaXMgZXhwZWN0ZWQgdG8gYmUgdGhlIGxvZ2l0cykuXG4gKiBAcGFyYW0gZnJvbUxvZ2l0cyBCb29sZWFuLCB3aGV0aGVyIGBvdXRwdXRgIGlzIHRoZSByZXN1bHQgb2YgYSBzb2Z0bWF4LCBvciBpc1xuICogICBhIHRlbnNvciBvZiBsb2dpdHMuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBzcGFyc2VDYXRlZ29yaWNhbENyb3NzZW50cm9weShcbiAgICB0YXJnZXQ6IFRlbnNvciwgb3V0cHV0OiBUZW5zb3IsIGZyb21Mb2dpdHMgPSBmYWxzZSk6IFRlbnNvciB7XG4gIHJldHVybiB0aWR5KCgpID0+IHtcbiAgICBjb25zdCBmbGF0VGFyZ2V0ID1cbiAgICAgICAgdGZjLmNhc3QodGZjLmZsb29yKEsuZmxhdHRlbih0YXJnZXQpKSwgJ2ludDMyJykgYXMgVGVuc29yMUQ7XG4gICAgb3V0cHV0ID0gdGZjLmNsaXBCeVZhbHVlKG91dHB1dCwgZXBzaWxvbigpLCAxIC0gZXBzaWxvbigpKTtcbiAgICBjb25zdCBvdXRwdXRTaGFwZSA9IG91dHB1dC5zaGFwZTtcbiAgICBjb25zdCBvbmVIb3RUYXJnZXQgPSB0ZmMucmVzaGFwZShcbiAgICAgICAgdGZjLm9uZUhvdChmbGF0VGFyZ2V0LCBvdXRwdXRTaGFwZVtvdXRwdXRTaGFwZS5sZW5ndGggLSAxXSksXG4gICAgICAgIG91dHB1dFNoYXBlKTtcbiAgICByZXR1cm4gY2F0ZWdvcmljYWxDcm9zc2VudHJvcHkob25lSG90VGFyZ2V0LCBvdXRwdXQsIGZyb21Mb2dpdHMpO1xuICB9KTtcbn1cblxuLyoqXG4gKiBGcm9tIFRlbnNvckZsb3cncyBpbXBsZW1lbnRhdGlvbiBpbiBubl9pbXBsLnB5OlxuICpcbiAqIEZvciBicmV2aXR5LCBsZXQgYHggPSBsb2dpdHNgLCBgeiA9IGxhYmVsc2AuICBUaGUgbG9naXN0aWMgbG9zcyBpc1xuICogICAgICB6ICogLWxvZyhzaWdtb2lkKHgpKSArICgxIC0geikgKiAtbG9nKDEgLSBzaWdtb2lkKHgpKVxuICogICAgPSB6ICogLWxvZygxIC8gKDEgKyBleHAoLXgpKSkgKyAoMSAtIHopICogLWxvZyhleHAoLXgpIC8gKDEgKyBleHAoLXgpKSlcbiAqICAgID0geiAqIGxvZygxICsgZXhwKC14KSkgKyAoMSAtIHopICogKC1sb2coZXhwKC14KSkgKyBsb2coMSArIGV4cCgteCkpKVxuICogICAgPSB6ICogbG9nKDEgKyBleHAoLXgpKSArICgxIC0geikgKiAoeCArIGxvZygxICsgZXhwKC14KSlcbiAqICAgID0gKDEgLSB6KSAqIHggKyBsb2coMSArIGV4cCgteCkpXG4gKiAgICA9IHggLSB4ICogeiArIGxvZygxICsgZXhwKC14KSlcbiAqIEZvciB4IDwgMCwgdG8gYXZvaWQgb3ZlcmZsb3cgaW4gZXhwKC14KSwgd2UgcmVmb3JtdWxhdGUgdGhlIGFib3ZlXG4gKiAgICAgIHggLSB4ICogeiArIGxvZygxICsgZXhwKC14KSlcbiAqICAgID0gbG9nKGV4cCh4KSkgLSB4ICogeiArIGxvZygxICsgZXhwKC14KSlcbiAqICAgID0gLSB4ICogeiArIGxvZygxICsgZXhwKHgpKVxuICogSGVuY2UsIHRvIGVuc3VyZSBzdGFiaWxpdHkgYW5kIGF2b2lkIG92ZXJmbG93LCB0aGUgaW1wbGVtZW50YXRpb24gdXNlcyB0aGlzXG4gKiBlcXVpdmFsZW50IGZvcm11bGF0aW9uXG4gKiAgICBtYXgoeCwgMCkgLSB4ICogeiArIGxvZygxICsgZXhwKC1hYnMoeCkpKVxuICpcbiAqIEBwYXJhbSBsYWJlbHMgVGhlIGxhYmVscy5cbiAqIEBwYXJhbSBsb2dpdHMgVGhlIGxvZ2l0cy5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHNpZ21vaWRDcm9zc0VudHJvcHlXaXRoTG9naXRzKFxuICAgIGxhYmVsczogVGVuc29yLCBsb2dpdHM6IFRlbnNvcik6IFRlbnNvciB7XG4gIGlmICghdXRpbC5hcnJheXNFcXVhbChsYWJlbHMuc2hhcGUsIGxvZ2l0cy5zaGFwZSkpIHtcbiAgICB0aHJvdyBuZXcgVmFsdWVFcnJvcihcbiAgICAgICAgYGxvZ2l0cyBhbmQgbGFiZWxzIG11c3QgaGF2ZSB0aGUgc2FtZSBzaGFwZSwgYnV0IGdvdCBzaGFwZXMgYCArXG4gICAgICAgIGAke0pTT04uc3RyaW5naWZ5KGxhYmVscy5zaGFwZSl9IGFuZCAke0pTT04uc3RyaW5naWZ5KGxvZ2l0cy5zaGFwZSl9YCk7XG4gIH1cbiAgcmV0dXJuIHRpZHkoKCkgPT4ge1xuICAgIC8vIFRoZSBsb2dpc3RpYyBsb3NzIGZvcm11bGEgZnJvbSBhYm92ZSBpc1xuICAgIC8vICAgeCAtIHggKiB6ICsgbG9nKDEgKyBleHAoLXgpKVxuICAgIC8vIEZvciB4IDwgMCwgYSBtb3JlIG51bWVyaWNhbGx5IHN0YWJsZSBmb3JtdWxhIGlzXG4gICAgLy8gICAteCAqIHogKyBsb2coMSArIGV4cCh4KSlcbiAgICAvLyBOb3RlIHRoYXQgdGhlc2UgdHdvIGV4cHJlc3Npb25zIGNhbiBiZSBjb21iaW5lZCBpbnRvIHRoZSBmb2xsb3dpbmc6XG4gICAgLy8gICBtYXgoeCwgMCkgLSB4ICogeiArIGxvZygxICsgZXhwKC1hYnMoeCkpKVxuICAgIGNvbnN0IHJlbHVMb2dpdHMgPSB0ZmMucmVsdShsb2dpdHMpO1xuICAgIGNvbnN0IG5lZ0Fic0xvZ2l0cyA9IHRmYy5uZWcodGZjLmFicyhsb2dpdHMpKTtcbiAgICByZXR1cm4gdGZjLmFkZChcbiAgICAgICAgdGZjLnN1YihyZWx1TG9naXRzLCB0ZmMubXVsKGxvZ2l0cywgbGFiZWxzKSksXG4gICAgICAgIHRmYy5sb2cxcCh0ZmMuZXhwKG5lZ0Fic0xvZ2l0cykpKTtcbiAgfSk7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBiaW5hcnlDcm9zc2VudHJvcHkoeVRydWU6IFRlbnNvciwgeVByZWQ6IFRlbnNvcik6IFRlbnNvciB7XG4gIHJldHVybiB0aWR5KCgpID0+IHtcbiAgICBsZXQgeTogVGVuc29yO1xuICAgIHkgPSB0ZmMuY2xpcEJ5VmFsdWUoeVByZWQsIGVwc2lsb24oKSwgMSAtIGVwc2lsb24oKSk7XG4gICAgeSA9IHRmYy5sb2codGZjLmRpdih5LCB0ZmMuc3ViKDEsIHkpKSk7XG4gICAgcmV0dXJuIHRmYy5tZWFuKHNpZ21vaWRDcm9zc0VudHJvcHlXaXRoTG9naXRzKHlUcnVlLCB5KSwgLTEpO1xuICB9KTtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGt1bGxiYWNrTGVpYmxlckRpdmVyZ2VuY2UoXG4gICAgeVRydWU6IFRlbnNvciwgeVByZWQ6IFRlbnNvcik6IFRlbnNvciB7XG4gIHJldHVybiB0aWR5KCgpID0+IHtcbiAgICBjb25zdCBjbGlwcGVkVHJ1ZSA9IHRmYy5jbGlwQnlWYWx1ZSh5VHJ1ZSwgZXBzaWxvbigpLCAxKTtcbiAgICBjb25zdCBjbGlwcGVkUHJlZCA9IHRmYy5jbGlwQnlWYWx1ZSh5UHJlZCwgZXBzaWxvbigpLCAxKTtcbiAgICByZXR1cm4gdGZjLnN1bShcbiAgICAgICAgdGZjLm11bCh5VHJ1ZSwgdGZjLmxvZyh0ZmMuZGl2KGNsaXBwZWRUcnVlLCBjbGlwcGVkUHJlZCkpKSwgLTEpO1xuICB9KTtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIHBvaXNzb24oeVRydWU6IFRlbnNvciwgeVByZWQ6IFRlbnNvcik6IFRlbnNvciB7XG4gIHJldHVybiB0aWR5KCgpID0+IHtcbiAgICBjb25zdCBsb2dQcmVkID0gdGZjLmxvZyh0ZmMuYWRkKGVwc2lsb24oKSwgeVByZWQpKTtcbiAgICByZXR1cm4gdGZjLm1lYW4odGZjLnN1Yih5UHJlZCwgdGZjLm11bCh5VHJ1ZSwgbG9nUHJlZCkpLCAtMSk7XG4gIH0pO1xufVxuXG5leHBvcnQgZnVuY3Rpb24gY29zaW5lUHJveGltaXR5KHlUcnVlOiBUZW5zb3IsIHlQcmVkOiBUZW5zb3IpOiBUZW5zb3Ige1xuICByZXR1cm4gdGlkeSgoKSA9PiB7XG4gICAgY29uc3QgdHJ1ZU5vcm1hbGl6ZWQgPSBsMk5vcm1hbGl6ZSh5VHJ1ZSwgLTEpO1xuICAgIGNvbnN0IHByZWROb3JtYWxpemVkID0gbDJOb3JtYWxpemUoeVByZWQsIC0xKTtcbiAgICBjb25zdCB0cnVlWFByZWQgPSB0ZmMubXVsKHRydWVOb3JtYWxpemVkLCBwcmVkTm9ybWFsaXplZCk7XG4gICAgcmV0dXJuIHRmYy5uZWcodGZjLnN1bSh0cnVlWFByZWQsIC0xKSk7XG4gIH0pO1xufVxuXG5leHBvcnQgY29uc3QgbXNlID0gbWVhblNxdWFyZWRFcnJvcjtcbmV4cG9ydCBjb25zdCBNU0UgPSBtZWFuU3F1YXJlZEVycm9yO1xuZXhwb3J0IGNvbnN0IG1hZSA9IG1lYW5BYnNvbHV0ZUVycm9yO1xuZXhwb3J0IGNvbnN0IE1BRSA9IG1lYW5BYnNvbHV0ZUVycm9yO1xuZXhwb3J0IGNvbnN0IG1hcGUgPSBtZWFuQWJzb2x1dGVQZXJjZW50YWdlRXJyb3I7XG5leHBvcnQgY29uc3QgTUFQRSA9IG1lYW5BYnNvbHV0ZVBlcmNlbnRhZ2VFcnJvcjtcbmV4cG9ydCBjb25zdCBtc2xlID0gbWVhblNxdWFyZWRMb2dhcml0aG1pY0Vycm9yO1xuZXhwb3J0IGNvbnN0IE1TTEUgPSBtZWFuU3F1YXJlZExvZ2FyaXRobWljRXJyb3I7XG5leHBvcnQgY29uc3Qga2xkID0ga3VsbGJhY2tMZWlibGVyRGl2ZXJnZW5jZTtcbmV4cG9ydCBjb25zdCBLTEQgPSBrdWxsYmFja0xlaWJsZXJEaXZlcmdlbmNlO1xuZXhwb3J0IGNvbnN0IGNvc2luZSA9IGNvc2luZVByb3hpbWl0eTtcblxuLy8gVE9ETyhtaWNoYWVsdGVycnkpOiBBZGQgZGVzZXJpYWxpemUoKSBmdW5jdGlvbi5cblxuZXhwb3J0IGNvbnN0IGxvc3Nlc01hcDoge1tmdW5jdGlvbk5hbWU6IHN0cmluZ106IExvc3NPck1ldHJpY0ZufSA9IHtcbiAgbWVhblNxdWFyZWRFcnJvcixcbiAgbWVhbkFic29sdXRlRXJyb3IsXG4gIG1lYW5BYnNvbHV0ZVBlcmNlbnRhZ2VFcnJvcixcbiAgbWVhblNxdWFyZWRMb2dhcml0aG1pY0Vycm9yLFxuICBzcXVhcmVkSGluZ2UsXG4gIGhpbmdlLFxuICBjYXRlZ29yaWNhbEhpbmdlLFxuICBsb2djb3NoLFxuICBjYXRlZ29yaWNhbENyb3NzZW50cm9weSxcbiAgc3BhcnNlQ2F0ZWdvcmljYWxDcm9zc2VudHJvcHksXG4gIGJpbmFyeUNyb3NzZW50cm9weSxcbiAga3VsbGJhY2tMZWlibGVyRGl2ZXJnZW5jZSxcbiAgcG9pc3NvbixcbiAgY29zaW5lUHJveGltaXR5XG59O1xuXG4vLyBQb3J0aW5nIG5vdGU6IFRoaXMgZGl2ZXJnZXMgZnJvbSB0aGUgUHlLZXJhcyBpbXBsZW1lbnRhdGlvbiBhbmQgbWF5IG5lZWQgdG9cbi8vIGNoYW5nZSBiYXNlZCBvbiAoZGUpc2VyaWFsaXphdGlvbiByZXF1aXJlbWVudHMuXG5leHBvcnQgZnVuY3Rpb24gZ2V0KGlkZW50aWZpZXJPckZuOiBzdHJpbmd8TG9zc09yTWV0cmljRm4pOiBMb3NzT3JNZXRyaWNGbiB7XG4gIGlmICh0eXBlb2YgaWRlbnRpZmllck9yRm4gPT09ICdzdHJpbmcnKSB7XG4gICAgaWYgKGlkZW50aWZpZXJPckZuIGluIGxvc3Nlc01hcCkge1xuICAgICAgcmV0dXJuIGxvc3Nlc01hcFtpZGVudGlmaWVyT3JGbl07XG4gICAgfVxuICAgIGxldCBlcnJNc2cgPSBgVW5rbm93biBsb3NzICR7aWRlbnRpZmllck9yRm59YDtcbiAgICBpZiAoaWRlbnRpZmllck9yRm4udG9Mb3dlckNhc2UoKS5pbmNsdWRlcygnc29mdG1heGNyb3NzZW50cm9weScpKSB7XG4gICAgICBlcnJNc2cgPSBgVW5rbm93biBsb3NzICR7aWRlbnRpZmllck9yRm59LiBgICtcbiAgICAgICAgICAnVXNlIFwiY2F0ZWdvcmljYWxDcm9zc2VudHJvcHlcIiBhcyB0aGUgc3RyaW5nIG5hbWUgZm9yICcgK1xuICAgICAgICAgICd0Zi5sb3NzZXMuc29mdG1heENyb3NzRW50cm9weSc7XG4gICAgfVxuICAgIHRocm93IG5ldyBWYWx1ZUVycm9yKGVyck1zZyk7XG4gIH0gZWxzZSB7XG4gICAgcmV0dXJuIGlkZW50aWZpZXJPckZuO1xuICB9XG59XG4iXX0=","/**\n * @license\n * Copyright 2018 Google LLC\n *\n * Use of this source code is governed by an MIT-style\n * license that can be found in the LICENSE file or at\n * https://opensource.org/licenses/MIT.\n * =============================================================================\n */\n/**\n * Built-in metrics.\n */\nimport * as tfc from '@tensorflow/tfjs-core';\nimport { tidy } from '@tensorflow/tfjs-core';\nimport * as K from './backend/tfjs_backend';\nimport { NotImplementedError, ValueError } from './errors';\nimport { categoricalCrossentropy as categoricalCrossentropyLoss, cosineProximity, meanAbsoluteError, meanAbsolutePercentageError, meanSquaredError, sparseCategoricalCrossentropy as sparseCategoricalCrossentropyLoss } from './losses';\nimport { binaryCrossentropy as lossBinaryCrossentropy } from './losses';\nimport { lossesMap } from './losses';\nimport * as util from './utils/generic_utils';\nexport function binaryAccuracy(yTrue, yPred) {\n return tidy(() => {\n const threshold = tfc.mul(.5, tfc.onesLike(yPred));\n const yPredThresholded = K.cast(tfc.greater(yPred, threshold), yTrue.dtype);\n return tfc.mean(tfc.equal(yTrue, yPredThresholded), -1);\n });\n}\nexport function categoricalAccuracy(yTrue, yPred) {\n return tidy(() => K.cast(tfc.equal(tfc.argMax(yTrue, -1), tfc.argMax(yPred, -1)), 'float32'));\n}\nfunction truePositives(yTrue, yPred) {\n return tidy(() => {\n return tfc.cast(tfc.sum(tfc.logicalAnd(tfc.equal(yTrue, 1), tfc.equal(yPred, 1))), 'float32');\n });\n}\nfunction falseNegatives(yTrue, yPred) {\n return tidy(() => {\n return tfc.cast(tfc.sum(tfc.logicalAnd(tfc.equal(yTrue, 1), tfc.equal(yPred, 0))), 'float32');\n });\n}\nfunction falsePositives(yTrue, yPred) {\n return tidy(() => {\n return tfc.cast(tfc.sum(tfc.logicalAnd(tfc.equal(yTrue, 0), tfc.equal(yPred, 1))), 'float32');\n });\n}\nexport function precision(yTrue, yPred) {\n return tidy(() => {\n const tp = truePositives(yTrue, yPred);\n const fp = falsePositives(yTrue, yPred);\n const denominator = tfc.add(tp, fp);\n return tfc.cast(tfc.where(tfc.greater(denominator, 0), tfc.div(tp, denominator), 0), 'float32');\n });\n}\nexport function recall(yTrue, yPred) {\n return tidy(() => {\n const tp = truePositives(yTrue, yPred);\n const fn = falseNegatives(yTrue, yPred);\n const denominator = tfc.add(tp, fn);\n return tfc.cast(tfc.where(tfc.greater(denominator, 0), tfc.div(tp, denominator), 0), 'float32');\n });\n}\nexport function binaryCrossentropy(yTrue, yPred) {\n return lossBinaryCrossentropy(yTrue, yPred);\n}\nexport function sparseCategoricalAccuracy(yTrue, yPred) {\n if (yTrue.rank === yPred.rank) {\n yTrue = tfc.squeeze(yTrue, [yTrue.rank - 1]);\n }\n yPred = tfc.argMax(yPred, -1);\n if (yPred.dtype !== yTrue.dtype) {\n yPred = tfc.cast(yPred, yTrue.dtype);\n }\n return tfc.cast(tfc.equal(yTrue, yPred), 'float32');\n}\nexport function topKCategoricalAccuracy(yTrue, yPred) {\n throw new NotImplementedError();\n}\nexport function sparseTopKCategoricalAccuracy(yTrue, yPred) {\n throw new NotImplementedError();\n}\n// Aliases.\nexport const mse = meanSquaredError;\nexport const MSE = meanSquaredError;\nexport const mae = meanAbsoluteError;\nexport const MAE = meanAbsoluteError;\nexport const mape = meanAbsolutePercentageError;\nexport const MAPE = meanAbsolutePercentageError;\nexport const categoricalCrossentropy = categoricalCrossentropyLoss;\nexport const cosine = cosineProximity;\nexport const sparseCategoricalCrossentropy = sparseCategoricalCrossentropyLoss;\n// TODO(cais, nielsene): Add serialize().\nexport const metricsMap = {\n binaryAccuracy,\n categoricalAccuracy,\n precision,\n categoricalCrossentropy,\n sparseCategoricalCrossentropy,\n mse,\n MSE,\n mae,\n MAE,\n mape,\n MAPE,\n cosine\n};\nexport function get(identifier) {\n if (typeof identifier === 'string' && identifier in metricsMap) {\n return metricsMap[identifier];\n }\n else if (typeof identifier !== 'string' && identifier != null) {\n return identifier;\n }\n else {\n throw new ValueError(`Unknown metric ${identifier}`);\n }\n}\n/**\n * Get the shortcut function name.\n *\n * If the fn name is a string,\n * directly return the string name.\n * If the function is included in metricsMap or lossesMap,\n * return key of the map.\n * - If the function relative to multiple keys,\n * return the first found key as the function name.\n * - If the function exists in both lossesMap and metricsMap,\n * search lossesMap first.\n * If the function is not included in metricsMap or lossesMap,\n * return the function name.\n *\n * @param fn loss function, metric function, or short cut name.\n * @returns Loss or Metric name in string.\n */\nexport function getLossOrMetricName(fn) {\n util.assert(fn !== null, `Unknown LossOrMetricFn ${fn}`);\n if (typeof fn === 'string') {\n return fn;\n }\n else {\n let fnName;\n for (const key of Object.keys(lossesMap)) {\n if (lossesMap[key] === fn) {\n fnName = key;\n break;\n }\n }\n if (fnName !== undefined) {\n return fnName;\n }\n for (const key of Object.keys(metricsMap)) {\n if (metricsMap[key] === fn) {\n fnName = key;\n break;\n }\n }\n if (fnName !== undefined) {\n return fnName;\n }\n return fn.name;\n }\n}\n//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibWV0cmljcy5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uL3RmanMtbGF5ZXJzL3NyYy9tZXRyaWNzLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBOzs7Ozs7OztHQVFHO0FBRUg7O0dBRUc7QUFFSCxPQUFPLEtBQUssR0FBRyxNQUFNLHVCQUF1QixDQUFDO0FBQzdDLE9BQU8sRUFBUyxJQUFJLEVBQUMsTUFBTSx1QkFBdUIsQ0FBQztBQUVuRCxPQUFPLEtBQUssQ0FBQyxNQUFNLHdCQUF3QixDQUFDO0FBQzVDLE9BQU8sRUFBQyxtQkFBbUIsRUFBRSxVQUFVLEVBQUMsTUFBTSxVQUFVLENBQUM7QUFDekQsT0FBTyxFQUFDLHVCQUF1QixJQUFJLDJCQUEyQixFQUFFLGVBQWUsRUFBRSxpQkFBaUIsRUFBRSwyQkFBMkIsRUFBRSxnQkFBZ0IsRUFBRSw2QkFBNkIsSUFBSSxpQ0FBaUMsRUFBQyxNQUFNLFVBQVUsQ0FBQztBQUN2TyxPQUFPLEVBQUMsa0JBQWtCLElBQUksc0JBQXNCLEVBQUMsTUFBTSxVQUFVLENBQUM7QUFDdEUsT0FBTyxFQUFDLFNBQVMsRUFBQyxNQUFNLFVBQVUsQ0FBQztBQUVuQyxPQUFPLEtBQUssSUFBSSxNQUFNLHVCQUF1QixDQUFDO0FBRTlDLE1BQU0sVUFBVSxjQUFjLENBQUMsS0FBYSxFQUFFLEtBQWE7SUFDekQsT0FBTyxJQUFJLENBQUMsR0FBRyxFQUFFO1FBQ2YsTUFBTSxTQUFTLEdBQUcsR0FBRyxDQUFDLEdBQUcsQ0FBQyxFQUFFLEVBQUUsR0FBRyxDQUFDLFFBQVEsQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDO1FBQ25ELE1BQU0sZ0JBQWdCLEdBQUcsQ0FBQyxDQUFDLElBQUksQ0FBQyxHQUFHLENBQUMsT0FBTyxDQUFDLEtBQUssRUFBRSxTQUFTLENBQUMsRUFBRSxLQUFLLENBQUMsS0FBSyxDQUFDLENBQUM7UUFDNUUsT0FBTyxHQUFHLENBQUMsSUFBSSxDQUFDLEdBQUcsQ0FB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LFVBQVUsSUFBSSxJQUFJLEVBQUU7UUFDL0QsT0FBTyxVQUFVLENBQUM7S0FDbkI7U0FBTTtRQUNMLE1BQU0sSUFBSSxVQUFVLENBQUMsa0JBQWtCLFVBQVUsRUFBRSxDQUFDLENBQUM7S0FDdEQ7QUFDSCxDQUFDO0FBRUQ7Ozs7Ozs7Ozs7Ozs7Ozs7R0FnQkc7QUFDSCxNQUFNLFVBQVUsbUJBQW1CLENBQUMsRUFBeUI7SUFDM0QsSUFBSSxDQUFDLE1BQU0sQ0FBQyxFQUFFLEtBQUssSUFBSSxFQUFFLDBCQUEwQixFQUFFLEVBQUUsQ0FBQyxDQUFDO0lBQ3pELElBQUksT0FBTyxFQUFFLEtBQUssUUFBUSxFQUFFO1FBQzFCLE9BQU8sRUFBRSxDQUFDO0tBQ1g7U0FBTTtRQUNMLElBQUksTUFBTSxDQUFDO1FBQ1gsS0FBSyxNQUFNLEdBQUcsSUFBSSxNQUFNLENBQUMsSUFBSSxDQUFDLFNBQVMsQ0FBQyxFQUFFO1lBQ3hDLElBQUksU0FBUyxDQUFDLEdBQUcsQ0FBQyxLQUFLLEVBQUUsRUFBRTtnQkFDekIsTUFBTSxHQUFHLEdBQUcsQ0FBQztnQkFDYixNQUFNO2FBQ1A7U0FDRjtRQUNELElBQUksTUFBTSxLQUFLLFNBQVMsRUFBRTtZQUN4QixPQUFPLE1BQU0sQ0FBQztTQUNmO1FBQ0QsS0FBSyxNQUFNLEdBQUcsSUFBSSxNQUFNLENBQUMsSUFBSSxDQUFDLFVBQVUsQ0FBQyxFQUFFO1lBQ3pDLElBQUksVUFBVSxDQUFDLEdBQUcsQ0FBQyxLQUFLLEVBQUUsRUFBRTtnQkFDMUIsTUFBTSxHQUFHLEdBQUcsQ0FBQztnQkFDYixNQUFNO2FBQ1A7U0FDRjtRQUNELElBQUksTUFBTSxLQUFLLFNBQVMsRUFBRTtZQUN4QixPQUFPLE1BQU0sQ0FBQztTQUNmO1FBQ0QsT0FBUSxFQUFlLENBQUMsSUFBSSxDQUFDO0tBQzlCO0FBQ0gsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbIi8qKlxuICogQGxpY2Vuc2VcbiAqIENvcHlyaWdodCAyMDE4IEdvb2dsZSBMTENcbiAqXG4gKiBVc2Ugb2YgdGhpcyBzb3VyY2UgY29kZSBpcyBnb3Zlcm5lZCBieSBhbiBNSVQtc3R5bGVcbiAqIGxpY2Vuc2UgdGhhdCBjYW4gYmUgZm91bmQgaW4gdGhlIExJQ0VOU0UgZmlsZSBvciBhdFxuICogaHR0cHM6Ly9vcGVuc291cmNlLm9yZy9saWNlbnNlcy9NSVQuXG4gKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuICovXG5cbi8qKlxuICogQnVpbHQtaW4gbWV0cmljcy5cbiAqL1xuXG5pbXBvcnQgKiBhcyB0ZmMgZnJvbSAnQHRlbnNvcmZsb3cvdGZqcy1jb3JlJztcbmltcG9ydCB7VGVuc29yLCB0aWR5fSBmcm9tICdAdGVuc29yZmxvdy90ZmpzLWNvcmUnO1xuXG5pbXBvcnQgKiBhcyBLIGZyb20gJy4vYmFja2VuZC90ZmpzX2JhY2tlbmQnO1xuaW1wb3J0IHtOb3RJbXBsZW1lbnRlZEVycm9yLCBWYWx1ZUVycm9yfSBmcm9tICcuL2Vycm9ycyc7XG5pbXBvcnQge2NhdGVnb3JpY2FsQ3Jvc3NlbnRyb3B5IGFzIGNhdGVnb3JpY2FsQ3Jvc3NlbnRyb3B5TG9zcywgY29zaW5lUHJveGltaXR5LCBtZWFuQWJzb2x1dGVFcnJvciwgbWVhbkFic29sdXRlUGVyY2VudGFnZUVycm9yLCBtZWFuU3F1YXJlZEVycm9yLCBzcGFyc2VDYXRlZ29yaWNhbENyb3NzZW50cm9weSBhcyBzcGFyc2VDYXRlZ29yaWNhbENyb3NzZW50cm9weUxvc3N9IGZyb20gJy4vbG9zc2VzJztcbmltcG9ydCB7YmluYXJ5Q3Jvc3NlbnRyb3B5IGFzIGxvc3NCaW5hcnlDcm9zc2VudHJvcHl9IGZyb20gJy4vbG9zc2VzJztcbmltcG9ydCB7bG9zc2VzTWFwfSBmcm9tICcuL2xvc3Nlcyc7XG5pbXBvcnQge0xvc3NPck1ldHJpY0ZufSBmcm9tICcuL3R5cGVzJztcbmltcG9ydCAqIGFzIHV0aWwgZnJvbSAnLi91dGlscy9nZW5lcmljX3V0aWxzJztcblxuZXhwb3J0IGZ1bmN0aW9uIGJpbmFyeUFjY3VyYWN5KHlUcnVlOiBUZW5zb3IsIHlQcmVkOiBUZW5zb3IpOiBUZW5zb3Ige1xuICByZXR1cm4gdGlkeSgoKSA9PiB7XG4gICAgY29uc3QgdGhyZXNob2xkID0gdGZjLm11bCguNSwgdGZjLm9uZXNMaWtlKHlQcmVkKSk7XG4gICAgY29uc3QgeVByZWRUaHJlc2hvbGRlZCA9IEsuY2FzdCh0ZmMuZ3JlYXRlcih5UHJlZCwgdGhyZXNob2xkKSwgeVRydWUuZHR5cGUpO1xuICAgIHJldHVybiB0ZmMubWVhbih0ZmMuZXF1YWwoeVRydWUsIHlQcmVkVGhyZXNob2xkZWQpLCAtMSk7XG4gIH0pO1xufVxuXG5leHBvcnQgZnVuY3Rpb24gY2F0ZWdvcmljYWxBY2N1cmFjeSh5VHJ1ZTogVGVuc29yLCB5UHJlZDogVGVuc29yKTogVGVuc29yIHtcbiAgcmV0dXJuIHRpZHkoXG4gICAgICAoKSA9PiBLLmNhc3QoXG4gICAgICAgICAgdGZjLmVxdWFsKHRmYy5hcmdNYXgoeVRydWUsIC0xKSwgdGZjLmFyZ01heCh5UHJlZCwgLTEpKSwgJ2Zsb2F0MzInKSk7XG59XG5cbmZ1bmN0aW9uIHRydWVQb3NpdGl2ZXMoeVRydWU6IFRlbnNvciwgeVByZWQ6IFRlbnNvcik6IFRlbnNvciB7XG4gIHJldHVybiB0aWR5KCgpID0+IHtcbiAgICByZXR1cm4gdGZjLmNhc3QoXG4gICAgICAgIHRmYy5zdW0odGZjLmxvZ2ljYWxBbmQodGZjLmVxdWFsKHlUcnVlLCAxKSwgdGZjLmVxdWFsKHlQcmVkLCAxKSkpLFxuICAgICAgICAnZmxvYXQzMicpO1xuICB9KTtcbn1cblxuZnVuY3Rpb24gZmFsc2VOZWdhdGl2ZXMoeVRydWU6IFRlbnNvciwgeVByZWQ6IFRlbnNvcik6IFRlbnNvciB7XG4gIHJldHVybiB0aWR5KCgpID0+IHtcbiAgICByZXR1cm4gdGZjLmNhc3QoXG4gICAgICAgIHRmYy5zdW0odGZjLmxvZ2ljYWxBbmQodGZjLmVxdWFsKHlUcnVlLCAxKSwgdGZjLmVxdWFsKHlQcmVkLCAwKSkpLFxuICAgICAgICAnZmxvYXQzMicpO1xuICB9KTtcbn1cblxuZnVuY3Rpb24gZmFsc2VQb3NpdGl2ZXMoeVRydWU6IFRlbnNvciwgeVByZWQ6IFRlbnNvcik6IFRlbnNvciB7XG4gIHJldHVybiB0aWR5KCgpID0+IHtcbiAgICByZXR1cm4gdGZjLmNhc3QoXG4gICAgICAgIHRmYy5zdW0odGZjLmxvZ2ljYWxBbmQodGZjLmVxdWFsKHlUcnVlLCAwKSwgdGZjLmVxdWFsKHlQcmVkLCAxKSkpLFxuICAgICAgICAnZmxvYXQzMicpO1xuICB9KTtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIHByZWNpc2lvbih5VHJ1ZTogVGVuc29yLCB5UHJlZDogVGVuc29yKTogVGVuc29yIHtcbiAgcmV0dXJuIHRpZHkoKCkgPT4ge1xuICAgIGNvbnN0IHRwID0gdHJ1ZVBvc2l0aXZlcyh5VHJ1ZSwgeVByZWQpO1xuICAgIGNvbnN0IGZwID0gZmFsc2VQb3NpdGl2ZXMoeVRydWUsIHlQcmVkKTtcblxuICAgIGNvbnN0IGRlbm9taW5hdG9yID0gdGZjLmFkZCh0cCwgZnApO1xuXG4gICAgcmV0dXJuIHRmYy5jYXN0KFxuICAgICAgICB0ZmMud2hlcmUodGZjLmdyZWF0ZXIoZGVub21pbmF0b3IsIDApLCB0ZmMuZGl2KHRwLCBkZW5vbWluYXRvciksIDApLFxuICAgICAgICAnZmxvYXQzMicpO1xuICB9KTtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIHJlY2FsbCh5VHJ1ZTogVGVuc29yLCB5UHJlZDogVGVuc29yKTogVGVuc29yIHtcbiAgcmV0dXJuIHRpZHkoKCkgPT4ge1xuICAgIGNvbnN0IHRwID0gdHJ1ZVBvc2l0aXZlcyh5VHJ1ZSwgeVByZWQpO1xuICAgIGNvbnN0IGZuID0gZmFsc2VOZWdhdGl2ZXMoeVRydWUsIHlQcmVkKTtcblxuICAgIGNvbnN0IGRlbm9taW5hdG9yID0gdGZjLmFkZCh0cCwgZm4pO1xuXG4gICAgcmV0dXJuIHRmYy5jYXN0KFxuICAgICAgICB0ZmMud2hlcmUodGZjLmdyZWF0ZXIoZGVub21pbmF0b3IsIDApLCB0ZmMuZGl2KHRwLCBkZW5vbWluYXRvciksIDApLFxuICAgICAgICAnZmxvYXQzMicpO1xuICB9KTtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGJpbmFyeUNyb3NzZW50cm9weSh5VHJ1ZTogVGVuc29yLCB5UHJlZDogVGVuc29yKTogVGVuc29yIHtcbiAgcmV0dXJuIGxvc3NCaW5hcnlDcm9zc2VudHJvcHkoeVRydWUsIHlQcmVkKTtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIHNwYXJzZUNhdGVnb3JpY2FsQWNjdXJhY3koXG4gICAgeVRydWU6IFRlbnNvciwgeVByZWQ6IFRlbnNvcik6IFRlbnNvciB7XG4gIGlmICh5VHJ1ZS5yYW5rID09PSB5UHJlZC5yYW5rKSB7XG4gICAgeVRydWUgPSB0ZmMuc3F1ZWV6ZSh5VHJ1ZSwgW3lUcnVlLnJhbmsgLSAxXSk7XG4gIH1cbiAgeVByZWQgPSB0ZmMuYXJnTWF4KHlQcmVkLCAtMSk7XG4gIGlmICh5UHJlZC5kdHlwZSAhPT0geVRydWUuZHR5cGUpIHtcbiAgICB5UHJlZCA9IHRmYy5jYXN0KHlQcmVkLCB5VHJ1ZS5kdHlwZSk7XG4gIH1cbiAgcmV0dXJuIHRmYy5jYXN0KHRmYy5lcXVhbCh5VHJ1ZSwgeVByZWQpLCAnZmxvYXQzMicpO1xufVxuXG5leHBvcnQgZnVuY3Rpb24gdG9wS0NhdGVnb3JpY2FsQWNjdXJhY3koeVRydWU6IFRlbnNvciwgeVByZWQ6IFRlbnNvcik6IFRlbnNvciB7XG4gIHRocm93IG5ldyBOb3RJbXBsZW1lbnRlZEVycm9yKCk7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBzcGFyc2VUb3BLQ2F0ZWdvcmljYWxBY2N1cmFjeShcbiAgICB5VHJ1ZTogVGVuc29yLCB5UHJlZDogVGVuc29yKTogVGVuc29yIHtcbiAgdGhyb3cgbmV3IE5vdEltcGxlbWVudGVkRXJyb3IoKTtcbn1cblxuLy8gQWxpYXNlcy5cbmV4cG9ydCBjb25zdCBtc2UgPSBtZWFuU3F1YXJlZEVycm9yO1xuZXhwb3J0IGNvbnN0IE1TRSA9IG1lYW5TcXVhcmVkRXJyb3I7XG5leHBvcnQgY29uc3QgbWFlID0gbWVhbkFic29sdXRlRXJyb3I7XG5leHBvcnQgY29uc3QgTUFFID0gbWVhbkFic29sdXRlRXJyb3I7XG5leHBvcnQgY29uc3QgbWFwZSA9IG1lYW5BYnNvbHV0ZVBlcmNlbnRhZ2VFcnJvcjtcbmV4cG9ydCBjb25zdCBNQVBFID0gbWVhbkFic29sdXRlUGVyY2VudGFnZUVycm9yO1xuZXhwb3J0IGNvbnN0IGNhdGVnb3JpY2FsQ3Jvc3NlbnRyb3B5ID0gY2F0ZWdvcmljYWxDcm9zc2VudHJvcHlMb3NzO1xuZXhwb3J0IGNvbnN0IGNvc2luZSA9IGNvc2luZVByb3hpbWl0eTtcbmV4cG9ydCBjb25zdCBzcGFyc2VDYXRlZ29yaWNhbENyb3NzZW50cm9weSA9IHNwYXJzZUNhdGVnb3JpY2FsQ3Jvc3NlbnRyb3B5TG9zcztcblxuLy8gVE9ETyhjYWlzLCBuaWVsc2VuZSk6IEFkZCBzZXJpYWxpemUoKS5cblxuZXhwb3J0IGNvbnN0IG1ldHJpY3NNYXA6IHtbZnVuY3Rpb25OYW1lOiBzdHJpbmddOiBMb3NzT3JNZXRyaWNGbn0gPSB7XG4gIGJpbmFyeUFjY3VyYWN5LFxuICBjYXRlZ29yaWNhbEFjY3VyYWN5LFxuICBwcmVjaXNpb24sXG4gIGNhdGVnb3JpY2FsQ3Jvc3NlbnRyb3B5LFxuICBzcGFyc2VDYXRlZ29yaWNhbENyb3NzZW50cm9weSxcbiAgbXNlLFxuICBNU0UsXG4gIG1hZSxcbiAgTUFFLFxuICBtYXBlLFxuICBNQVBFLFxuICBjb3NpbmVcbn07XG5cbmV4cG9ydCBmdW5jdGlvbiBnZXQoaWRlbnRpZmllcjogc3RyaW5nfExvc3NPck1ldHJpY0ZuKTogTG9zc09yTWV0cmljRm4ge1xuICBpZiAodHlwZW9mIGlkZW50aWZpZXIgPT09ICdzdHJpbmcnICYmIGlkZW50aWZpZXIgaW4gbWV0cmljc01hcCkge1xuICAgIHJldHVybiBtZXRyaWNzTWFwW2lkZW50aWZpZXJdO1xuICB9IGVsc2UgaWYgKHR5cGVvZiBpZGVudGlmaWVyICE9PSAnc3RyaW5nJyAmJiBpZGVudGlmaWVyICE9IG51bGwpIHtcbiAgICByZXR1cm4gaWRlbnRpZmllcjtcbiAgfSBlbHNlIHtcbiAgICB0aHJvdyBuZXcgVmFsdWVFcnJvcihgVW5rbm93biBtZXRyaWMgJHtpZGVudGlmaWVyfWApO1xuICB9XG59XG5cbi8qKlxuICogR2V0IHRoZSBzaG9ydGN1dCBmdW5jdGlvbiBuYW1lLlxuICpcbiAqIElmIHRoZSBmbiBuYW1lIGlzIGEgc3RyaW5nLFxuICogICBkaXJlY3RseSByZXR1cm4gdGhlIHN0cmluZyBuYW1lLlxuICogSWYgdGhlIGZ1bmN0aW9uIGlzIGluY2x1ZGVkIGluIG1ldHJpY3NNYXAgb3IgbG9zc2VzTWFwLFxuICogICByZXR1cm4ga2V5IG9mIHRoZSBtYXAuXG4gKiAgIC0gSWYgdGhlIGZ1bmN0aW9uIHJlbGF0aXZlIHRvIG11bHRpcGxlIGtleXMsXG4gKiAgICAgcmV0dXJuIHRoZSBmaXJzdCBmb3VuZCBrZXkgYXMgdGhlIGZ1bmN0aW9uIG5hbWUuXG4gKiAgIC0gSWYgdGhlIGZ1bmN0aW9uIGV4aXN0cyBpbiBib3RoIGxvc3Nlc01hcCBhbmQgbWV0cmljc01hcCxcbiAqICAgICBzZWFyY2ggbG9zc2VzTWFwIGZpcnN0LlxuICogSWYgdGhlIGZ1bmN0aW9uIGlzIG5vdCBpbmNsdWRlZCBpbiBtZXRyaWNzTWFwIG9yIGxvc3Nlc01hcCxcbiAqICAgcmV0dXJuIHRoZSBmdW5jdGlvbiBuYW1lLlxuICpcbiAqIEBwYXJhbSBmbiBsb3NzIGZ1bmN0aW9uLCBtZXRyaWMgZnVuY3Rpb24sIG9yIHNob3J0IGN1dCBuYW1lLlxuICogQHJldHVybnMgTG9zcyBvciBNZXRyaWMgbmFtZSBpbiBzdHJpbmcuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBnZXRMb3NzT3JNZXRyaWNOYW1lKGZuOiBzdHJpbmd8TG9zc09yTWV0cmljRm4pOiBzdHJpbmcge1xuICB1dGlsLmFzc2VydChmbiAhPT0gbnVsbCwgYFVua25vd24gTG9zc09yTWV0cmljRm4gJHtmbn1gKTtcbiAgaWYgKHR5cGVvZiBmbiA9PT0gJ3N0cmluZycpIHtcbiAgICByZXR1cm4gZm47XG4gIH0gZWxzZSB7XG4gICAgbGV0IGZuTmFtZTtcbiAgICBmb3IgKGNvbnN0IGtleSBvZiBPYmplY3Qua2V5cyhsb3NzZXNNYXApKSB7XG4gICAgICBpZiAobG9zc2VzTWFwW2tleV0gPT09IGZuKSB7XG4gICAgICAgIGZuTmFtZSA9IGtleTtcbiAgICAgICAgYnJlYWs7XG4gICAgICB9XG4gICAgfVxuICAgIGlmIChmbk5hbWUgIT09IHVuZGVmaW5lZCkge1xuICAgICAgcmV0dXJuIGZuTmFtZTtcbiAgICB9XG4gICAgZm9yIChjb25zdCBrZXkgb2YgT2JqZWN0LmtleXMobWV0cmljc01hcCkpIHtcbiAgICAgIGlmIChtZXRyaWNzTWFwW2tleV0gPT09IGZuKSB7XG4gICAgICAgIGZuTmFtZSA9IGtleTtcbiAgICAgICAgYnJlYWs7XG4gICAgICB9XG4gICAgfVxuICAgIGlmIChmbk5hbWUgIT09IHVuZGVmaW5lZCkge1xuICAgICAgcmV0dXJuIGZuTmFtZTtcbiAgICB9XG4gICAgcmV0dXJuIChmbiBhcyBGdW5jdGlvbikubmFtZTtcbiAgfVxufVxuIl19","/**\n * @license\n * Copyright 2019 Google LLC\n *\n * Use of this source code is governed by an MIT-style\n * license that can be found in the LICENSE file or at\n * https://opensource.org/licenses/MIT.\n * =============================================================================\n */\n/** Utility functions related to user-defined metadata. */\n// Maximum recommended serialized size for user-defined metadata.\n// Beyond this limit, a warning message will be printed during model loading and\n// saving.\nexport const MAX_USER_DEFINED_METADATA_SERIALIZED_LENGTH = 1 * 1024 * 1024;\n/**\n * Check validity of user-defined metadata.\n *\n * @param userDefinedMetadata\n * @param modelName Name of the model that the user-defined metadata belongs to.\n * Used during construction of error messages.\n * @param checkSize Whether to check the size of the metadata is under\n * recommended limit. Default: `false`. If `true`, will try stringify the\n * JSON object and print a console warning if the serialzied size is above the\n * limit.\n * @throws Error if `userDefinedMetadata` is not a plain JSON object.\n */\nexport function checkUserDefinedMetadata(userDefinedMetadata, modelName, checkSize = false) {\n if (userDefinedMetadata == null ||\n typeof userDefinedMetadata !== 'object' ||\n Object.getPrototypeOf(userDefinedMetadata) !== Object.prototype ||\n !plainObjectCheck(userDefinedMetadata)) {\n throw new Error('User-defined metadata is expected to be a JSON object, but is not.');\n }\n if (checkSize) {\n const out = JSON.stringify(userDefinedMetadata);\n if (out.length > MAX_USER_DEFINED_METADATA_SERIALIZED_LENGTH) {\n console.warn(`User-defined metadata of model \"${modelName}\" is too large in ` +\n `size (length=${out.length} when serialized). It is not ` +\n `recommended to store such large objects in user-defined metadata. ` +\n `Please make sure its serialized length is <= ` +\n `${MAX_USER_DEFINED_METADATA_SERIALIZED_LENGTH}.`);\n }\n }\n}\n/**\n * Check if an input is plain JSON object or any valid subfield of it.\n *\n * @param x The input to be checked.\n * @param assertObject Whether to assert `x` is a JSON object, i.e., reject\n * cases of arrays and primitives.\n * @return Returns `true` if and only if `x` is a plain JSON object,\n * a JSON-valid primitive including string, number, boolean and null,\n * or an array of the said types.\n */\n// tslint:disable-next-line:no-any\nexport function plainObjectCheck(x) {\n if (x === null) {\n // Note: typeof `null` is 'object', and `null` is valid in JSON.\n return true;\n }\n else if (typeof x === 'object') {\n if (Object.getPrototypeOf(x) === Object.prototype) {\n // `x` is a JavaScript object and its prototype is Object.\n const keys = Object.keys(x);\n for (const key of keys) {\n if (typeof key !== 'string') {\n // JSON keys must be strings.\n return false;\n }\n if (!plainObjectCheck(x[key])) { // Recursive call.\n return false;\n }\n }\n return true;\n }\n else {\n // `x` is a JavaScript object but its prototype is not Object.\n if (Array.isArray(x)) {\n // `x` is a JavaScript array.\n for (const item of x) {\n if (!plainObjectCheck(item)) { // Recursive call.\n return false;\n }\n }\n return true;\n }\n else {\n // `x` is a JavaScript object and its prototype is not Object,\n // and it's not an Array. I.e., it's a complex object such as\n // `Error` and `Date`.\n return false;\n }\n }\n }\n else {\n // `x` is not a JavaScript object or `null`.\n const xType = typeof x;\n return xType === 'string' || xType === 'number' || xType === 'boolean';\n }\n}\n//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidXNlcl9kZWZpbmVkX21ldGFkYXRhLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vdGZqcy1sYXllcnMvc3JjL3VzZXJfZGVmaW5lZF9tZXRhZGF0YS50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQTs7Ozs7Ozs7R0FRRztBQUVILDBEQUEwRDtBQUUxRCxpRUFBaUU7QUFDakUsZ0ZBQWdGO0FBQ2hGLFVBQVU7QUFDVixNQUFNLENBQUMsTUFBTSwyQ0FBMkMsR0FBRyxDQUFDLEdBQUcsSUFBSSxHQUFHLElBQUksQ0FBQztBQUUzRTs7Ozs7Ozs7Ozs7R0FXRztBQUNILE1BQU0sVUFBVSx3QkFBd0IsQ0FDcEMsbUJBQXVCLEVBQUUsU0FBaUIsRUFBRSxTQUFTLEdBQUcsS0FBSztJQUMvRCxJQUFJLG1CQUFtQixJQUFJLElBQUk7UUFDM0IsT0FBTyxtQkFBbUIsS0FBSyxRQUFRO1FBQ3ZDLE1BQU0sQ0FBQyxjQUFjLENBQUMsbUJBQW1CLENBQUMsS0FBSyxNQUFNLENBQUMsU0FBUztRQUMvRCxDQUFDLGdCQUFnQixDQUFDLG1CQUFtQixDQUFDLEVBQUU7UUFDMUMsTUFBTSxJQUFJLEtBQUssQ0FDWCxvRUFBb0UsQ0FBQyxDQUFDO0tBQzNFO0lBRUQsSUFBSSxTQUFTLEVBQUU7UUFDYixNQUFNLEdBQUcsR0FBRyxJQUFJLENBQUMsU0FBUyxDQUFDLG1CQUFtQixDQUFDLENBQUM7UUFDaEQsSUFBSSxHQUFHLENBQUMsTUFBTSxHQUFHLDJDQUEyQyxFQUFFO1lBQzVELE9BQU8sQ0FBQyxJQUFJLENBQ1IsbUNBQW1DLFNBQVMsb0JBQW9CO2dCQUNoRSxnQkFBZ0IsR0FBRyxDQUFDLE1BQU0sK0JBQStCO2dCQUN6RCxvRUFBb0U7Z0JBQ3BFLCtDQUErQztnQkFDL0MsR0FBRywyQ0FBMkMsR0FBRyxDQUFDLENBQUM7U0FDeEQ7S0FDRjtBQUNILENBQUM7QUFFRDs7Ozs7Ozs7O0dBU0c7QUFDSCxrQ0FBa0M7QUFDbEMsTUFBTSxVQUFVLGdCQUFnQixDQUFDLENBQU07SUFDckMsSUFBSSxDQUFDLEtBQUssSUFBSSxFQUFFO1FBQ2QsZ0VBQWdFO1FBQ2hFLE9BQU8sSUFBSSxDQUFDO0tBQ2I7U0FBTSxJQUFJLE9BQU8sQ0FBQyxLQUFLLFFBQVEsRUFBRTtRQUNoQyxJQUFJLE1BQU0sQ0FBQyxjQUFjLENBQUMsQ0FBQyxDQUFDLEtBQUssTUFBTSxDQUFDLFNBQVMsRUFBRTtZQUNqRCwwREFBMEQ7WUFDMUQsTUFBTSxJQUFJLEdBQUcsTUFBTSxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsQ0FBQztZQUM1QixLQUFLLE1BQU0sR0FBRyxJQUFJLElBQUksRUFBRTtnQkFDdEIsSUFBSSxPQUFPLEdBQUcsS0FBSyxRQUFRLEVBQUU7b0JBQzNCLDZCQUE2QjtvQkFDN0IsT0FBTyxLQUFLLENBQUM7aUJBQ2Q7Z0JBQ0QsSUFBSSxDQUFDLGdCQUFnQixDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxFQUFFLEVBQUcsa0JBQWtCO29CQUNsRCxPQUFPLEtBQUssQ0FBQztpQkFDZDthQUNGO1lBQ0QsT0FBTyxJQUFJLENBQUM7U0FDYjthQUFNO1lBQ0wsOERBQThEO1lBQzlELElBQUksS0FBSyxDQUFDLE9BQU8sQ0FBQyxDQUFDLENBQUMsRUFBRTtnQkFDcEIsNkJBQTZCO2dCQUM3QixLQUFLLE1BQU0sSUFBSSxJQUFJLENBQUMsRUFBRTtvQkFDcEIsSUFBSSxDQUFDLGdCQUFnQixDQUFDLElBQUksQ0FBQyxFQUFFLEVBQUcsa0JBQWtCO3dCQUNoRCxPQUFPLEtBQUssQ0FBQztxQkFDZDtpQkFDRjtnQkFDRCxPQUFPLElBQUksQ0FBQzthQUNiO2lCQUFNO2dCQUNMLDhEQUE4RDtnQkFDOUQsNkRBQTZEO2dCQUM3RCxzQkFBc0I7Z0JBQ3RCLE9BQU8sS0FBSyxDQUFDO2FBQ2Q7U0FDRjtLQUNGO1NBQU07UUFDTCw0Q0FBNEM7UUFDNUMsTUFBTSxLQUFLLEdBQUcsT0FBTyxDQUFDLENBQUM7UUFDdkIsT0FBTyxLQUFLLEtBQUssUUFBUSxJQUFJLEtBQUssS0FBSyxRQUFRLElBQUksS0FBSyxLQUFLLFNBQVMsQ0FBQztLQUN4RTtBQUNILENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyIvKipcbiAqIEBsaWNlbnNlXG4gKiBDb3B5cmlnaHQgMjAxOSBHb29nbGUgTExDXG4gKlxuICogVXNlIG9mIHRoaXMgc291cmNlIGNvZGUgaXMgZ292ZXJuZWQgYnkgYW4gTUlULXN0eWxlXG4gKiBsaWNlbnNlIHRoYXQgY2FuIGJlIGZvdW5kIGluIHRoZSBMSUNFTlNFIGZpbGUgb3IgYXRcbiAqIGh0dHBzOi8vb3BlbnNvdXJjZS5vcmcvbGljZW5zZXMvTUlULlxuICogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbiAqL1xuXG4vKiogVXRpbGl0eSBmdW5jdGlvbnMgcmVsYXRlZCB0byB1c2VyLWRlZmluZWQgbWV0YWRhdGEuICovXG5cbi8vIE1heGltdW0gcmVjb21tZW5kZWQgc2VyaWFsaXplZCBzaXplIGZvciB1c2VyLWRlZmluZWQgbWV0YWRhdGEuXG4vLyBCZXlvbmQgdGhpcyBsaW1pdCwgYSB3YXJuaW5nIG1lc3NhZ2Ugd2lsbCBiZSBwcmludGVkIGR1cmluZyBtb2RlbCBsb2FkaW5nIGFuZFxuLy8gc2F2aW5nLlxuZXhwb3J0IGNvbnN0IE1BWF9VU0VSX0RFRklORURfTUVUQURBVEFfU0VSSUFMSVpFRF9MRU5HVEggPSAxICogMTAyNCAqIDEwMjQ7XG5cbi8qKlxuICogQ2hlY2sgdmFsaWRpdHkgb2YgdXNlci1kZWZpbmVkIG1ldGFkYXRhLlxuICpcbiAqIEBwYXJhbSB1c2VyRGVmaW5lZE1ldGFkYXRhXG4gKiBAcGFyYW0gbW9kZWxOYW1lIE5hbWUgb2YgdGhlIG1vZGVsIHRoYXQgdGhlIHVzZXItZGVmaW5lZCBtZXRhZGF0YSBiZWxvbmdzIHRvLlxuICogICBVc2VkIGR1cmluZyBjb25zdHJ1Y3Rpb24gb2YgZXJyb3IgbWVzc2FnZXMuXG4gKiBAcGFyYW0gY2hlY2tTaXplIFdoZXRoZXIgdG8gY2hlY2sgdGhlIHNpemUgb2YgdGhlIG1ldGFkYXRhIGlzIHVuZGVyXG4gKiAgIHJlY29tbWVuZGVkIGxpbWl0LiBEZWZhdWx0OiBgZmFsc2VgLiBJZiBgdHJ1ZWAsIHdpbGwgdHJ5IHN0cmluZ2lmeSB0aGVcbiAqICAgSlNPTiBvYmplY3QgYW5kIHByaW50IGEgY29uc29sZSB3YXJuaW5nIGlmIHRoZSBzZXJpYWx6aWVkIHNpemUgaXMgYWJvdmUgdGhlXG4gKiAgIGxpbWl0LlxuICogQHRocm93cyBFcnJvciBpZiBgdXNlckRlZmluZWRNZXRhZGF0YWAgaXMgbm90IGEgcGxhaW4gSlNPTiBvYmplY3QuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBjaGVja1VzZXJEZWZpbmVkTWV0YWRhdGEoXG4gICAgdXNlckRlZmluZWRNZXRhZGF0YToge30sIG1vZGVsTmFtZTogc3RyaW5nLCBjaGVja1NpemUgPSBmYWxzZSk6IHZvaWQge1xuICBpZiAodXNlckRlZmluZWRNZXRhZGF0YSA9PSBudWxsIHx8XG4gICAgICB0eXBlb2YgdXNlckRlZmluZWRNZXRhZGF0YSAhPT0gJ29iamVjdCcgfHxcbiAgICAgIE9iamVjdC5nZXRQcm90b3R5cGVPZih1c2VyRGVmaW5lZE1ldGFkYXRhKSAhPT0gT2JqZWN0LnByb3RvdHlwZSB8fFxuICAgICAgIXBsYWluT2JqZWN0Q2hlY2sodXNlckRlZmluZWRNZXRhZGF0YSkpIHtcbiAgICB0aHJvdyBuZXcgRXJyb3IoXG4gICAgICAgICdVc2VyLWRlZmluZWQgbWV0YWRhdGEgaXMgZXhwZWN0ZWQgdG8gYmUgYSBKU09OIG9iamVjdCwgYnV0IGlzIG5vdC4nKTtcbiAgfVxuXG4gIGlmIChjaGVja1NpemUpIHtcbiAgICBjb25zdCBvdXQgPSBKU09OLnN0cmluZ2lmeSh1c2VyRGVmaW5lZE1ldGFkYXRhKTtcbiAgICBpZiAob3V0Lmxlbmd0aCA+IE1BWF9VU0VSX0RFRklORURfTUVUQURBVEFfU0VSSUFMSVpFRF9MRU5HVEgpIHtcbiAgICAgIGNvbnNvbGUud2FybihcbiAgICAgICAgICBgVXNlci1kZWZpbmVkIG1ldGFkYXRhIG9mIG1vZGVsIFwiJHttb2RlbE5hbWV9XCIgaXMgdG9vIGxhcmdlIGluIGAgK1xuICAgICAgICAgIGBzaXplIChsZW5ndGg9JHtvdXQubGVuZ3RofSB3aGVuIHNlcmlhbGl6ZWQpLiBJdCBpcyBub3QgYCArXG4gICAgICAgICAgYHJlY29tbWVuZGVkIHRvIHN0b3JlIHN1Y2ggbGFyZ2Ugb2JqZWN0cyBpbiB1c2VyLWRlZmluZWQgbWV0YWRhdGEuIGAgK1xuICAgICAgICAgIGBQbGVhc2UgbWFrZSBzdXJlIGl0cyBzZXJpYWxpemVkIGxlbmd0aCBpcyA8PSBgICtcbiAgICAgICAgICBgJHtNQVhfVVNFUl9ERUZJTkVEX01FVEFEQVRBX1NFUklBTElaRURfTEVOR1RIfS5gKTtcbiAgICB9XG4gIH1cbn1cblxuLyoqXG4gKiBDaGVjayBpZiBhbiBpbnB1dCBpcyBwbGFpbiBKU09OIG9iamVjdCBvciBhbnkgdmFsaWQgc3ViZmllbGQgb2YgaXQuXG4gKlxuICogQHBhcmFtIHggVGhlIGlucHV0IHRvIGJlIGNoZWNrZWQuXG4gKiBAcGFyYW0gYXNzZXJ0T2JqZWN0IFdoZXRoZXIgdG8gYXNzZXJ0IGB4YCBpcyBhIEpTT04gb2JqZWN0LCBpLmUuLCByZWplY3RcbiAqICAgY2FzZXMgb2YgYXJyYXlzIGFuZCBwcmltaXRpdmVzLlxuICogQHJldHVybiBSZXR1cm5zIGB0cnVlYCBpZiBhbmQgb25seSBpZiBgeGAgaXMgYSBwbGFpbiBKU09OIG9iamVjdCxcbiAqICAgYSBKU09OLXZhbGlkIHByaW1pdGl2ZSBpbmNsdWRpbmcgc3RyaW5nLCBudW1iZXIsIGJvb2xlYW4gYW5kIG51bGwsXG4gKiAgIG9yIGFuIGFycmF5IG9mIHRoZSBzYWlkIHR5cGVzLlxuICovXG4vLyB0c2xpbnQ6ZGlzYWJsZS1uZXh0LWxpbmU6bm8tYW55XG5leHBvcnQgZnVuY3Rpb24gcGxhaW5PYmplY3RDaGVjayh4OiBhbnkpOiBib29sZWFuIHtcbiAgaWYgKHggPT09IG51bGwpIHtcbiAgICAvLyBOb3RlOiB0eXBlb2YgYG51bGxgIGlzICdvYmplY3QnLCBhbmQgYG51bGxgIGlzIHZhbGlkIGluIEpTT04uXG4gICAgcmV0dXJuIHRydWU7XG4gIH0gZWxzZSBpZiAodHlwZW9mIHggPT09ICdvYmplY3QnKSB7XG4gICAgaWYgKE9iamVjdC5nZXRQcm90b3R5cGVPZih4KSA9PT0gT2JqZWN0LnByb3RvdHlwZSkge1xuICAgICAgLy8gYHhgIGlzIGEgSmF2YVNjcmlwdCBvYmplY3QgYW5kIGl0cyBwcm90b3R5cGUgaXMgT2JqZWN0LlxuICAgICAgY29uc3Qga2V5cyA9IE9iamVjdC5rZXlzKHgpO1xuICAgICAgZm9yIChjb25zdCBrZXkgb2Yga2V5cykge1xuICAgICAgICBpZiAodHlwZW9mIGtleSAhPT0gJ3N0cmluZycpIHtcbiAgICAgICAgICAvLyBKU09OIGtleXMgbXVzdCBiZSBzdHJpbmdzLlxuICAgICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgICAgfVxuICAgICAgICBpZiAoIXBsYWluT2JqZWN0Q2hlY2soeFtrZXldKSkgeyAgLy8gUmVjdXJzaXZlIGNhbGwuXG4gICAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgICByZXR1cm4gdHJ1ZTtcbiAgICB9IGVsc2Uge1xuICAgICAgLy8gYHhgIGlzIGEgSmF2YVNjcmlwdCBvYmplY3QgYnV0IGl0cyBwcm90b3R5cGUgaXMgbm90IE9iamVjdC5cbiAgICAgIGlmIChBcnJheS5pc0FycmF5KHgpKSB7XG4gICAgICAgIC8vIGB4YCBpcyBhIEphdmFTY3JpcHQgYXJyYXkuXG4gICAgICAgIGZvciAoY29uc3QgaXRlbSBvZiB4KSB7XG4gICAgICAgICAgaWYgKCFwbGFpbk9iamVjdENoZWNrKGl0ZW0pKSB7ICAvLyBSZWN1cnNpdmUgY2FsbC5cbiAgICAgICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICAvLyBgeGAgaXMgYSBKYXZhU2NyaXB0IG9iamVjdCBhbmQgaXRzIHByb3RvdHlwZSBpcyBub3QgT2JqZWN0LFxuICAgICAgICAvLyBhbmQgaXQncyBub3QgYW4gQXJyYXkuIEkuZS4sIGl0J3MgYSBjb21wbGV4IG9iamVjdCBzdWNoIGFzXG4gICAgICAgIC8vIGBFcnJvcmAgYW5kIGBEYXRlYC5cbiAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgfVxuICAgIH1cbiAgfSBlbHNlIHtcbiAgICAvLyBgeGAgaXMgbm90IGEgSmF2YVNjcmlwdCBvYmplY3Qgb3IgYG51bGxgLlxuICAgIGNvbnN0IHhUeXBlID0gdHlwZW9mIHg7XG4gICAgcmV0dXJuIHhUeXBlID09PSAnc3RyaW5nJyB8fCB4VHlwZSA9PT0gJ251bWJlcicgfHwgeFR5cGUgPT09ICdib29sZWFuJztcbiAgfVxufVxuIl19","/**\n * @license\n * Copyright 2018 Google LLC\n *\n * Use of this source code is governed by an MIT-style\n * license that can be found in the LICENSE file or at\n * https://opensource.org/licenses/MIT.\n * =============================================================================\n */\nimport { countParamsInWeights } from './variable_utils';\n/**\n * Print the summary of a LayersModel object.\n *\n * @param model tf.LayersModel instance.\n * @param lineLength Total length of printed lines. Set this to adapt to the\n * display to different terminal or console sizes.\n * @param positions Relative or absolute positions of log elements in each\n * line. Each number corresponds to right-most (i.e., ending) position of a\n * column.\n * If not provided, defaults to `[0.45, 0.85, 1]` for sequential-like\n * models and `[0.33, 0.55, 0.67, 1]` for non-sequential like models.\n * @param printFn Print function to use.\n * It will be called on each line of the summary. You can provide a custom\n * function in order to capture the string summary. Defaults to `console.log`.\n */\nexport function printSummary(model, lineLength, positions, \n// tslint:disable-next-line:no-any\nprintFn = console.log) {\n const sequentialLike = isModelSequentialLike(model);\n // Header names for different log elements.\n const toDisplay = ['Layer (type)', 'Input Shape', 'Output shape', 'Param #'];\n if (sequentialLike) {\n lineLength = lineLength || 90;\n positions = positions || [0.32, 0.61, 0.89, 1];\n }\n else {\n lineLength = lineLength || 115;\n positions = positions || [0.24, 0.48, 0.70, 0.80, 1];\n // Header names for different log elements.\n }\n if (positions[positions.length - 1] <= 1) {\n // `positions` is relative. Convert it to absolute positioning.\n positions = positions.map(p => Math.floor(lineLength * p));\n }\n let relevantNodes;\n if (!sequentialLike) {\n toDisplay.push('Receives inputs');\n relevantNodes = [];\n for (const depth in model.nodesByDepth) {\n relevantNodes.push(...model.nodesByDepth[depth]);\n }\n }\n printFn('_'.repeat(lineLength));\n printRow(toDisplay, positions, printFn);\n printFn('='.repeat(lineLength));\n const layers = model.layers;\n for (let i = 0; i < layers.length; ++i) {\n if (sequentialLike) {\n printLayerSummary(layers[i], positions, printFn);\n }\n else {\n printLayerSummaryWithConnections(layers[i], positions, relevantNodes, printFn);\n }\n printFn((i === layers.length - 1 ? '=' : '_').repeat(lineLength));\n }\n // tslint:disable-next-line:no-any\n model.checkTrainableWeightsConsistency();\n const trainableCount = countTrainableParams(model);\n const nonTrainableCount = countParamsInWeights(model.nonTrainableWeights);\n printFn(`Total params: ${trainableCount + nonTrainableCount}`);\n printFn(`Trainable params: ${trainableCount}`);\n printFn(`Non-trainable params: ${nonTrainableCount}`);\n printFn('_'.repeat(lineLength));\n}\nfunction countTrainableParams(model) {\n let trainableCount;\n // tslint:disable:no-any\n if (model.collectedTrainableWeights != null) {\n trainableCount =\n countParamsInWeights(model.collectedTrainableWeights);\n }\n else {\n trainableCount = countParamsInWeights(model.trainableWeights);\n }\n // tslint:enable:no-any\n return trainableCount;\n}\nfunction isModelSequentialLike(model) {\n let sequentialLike = true;\n const nodesByDepth = [];\n const nodes = [];\n for (const depth in model.nodesByDepth) {\n nodesByDepth.push(model.nodesByDepth[depth]);\n }\n for (const depthNodes of nodesByDepth) {\n if (depthNodes.length > 1 ||\n depthNodes.length === 1 && depthNodes[0].inboundLayers.length > 1) {\n sequentialLike = false;\n break;\n }\n nodes.push(...depthNodes);\n }\n if (sequentialLike) {\n // Search for shared layers.\n for (const layer of model.layers) {\n let flag = false;\n for (const node of layer.inboundNodes) {\n if (nodes.indexOf(node) !== -1) {\n if (flag) {\n sequentialLike = false;\n break;\n }\n else {\n flag = true;\n }\n }\n }\n if (!sequentialLike) {\n break;\n }\n }\n }\n return sequentialLike;\n}\nfunction printRow(fields, positions, \n// tslint:disable-next-line:no-any\nprintFn = console.log) {\n let line = '';\n for (let i = 0; i < fields.length; ++i) {\n if (i > 0) {\n line = line.slice(0, line.length - 1) + ' ';\n }\n line += fields[i];\n line = line.slice(0, positions[i]);\n line += ' '.repeat(positions[i] - line.length);\n }\n printFn(line);\n}\n/**\n * Prints a summary for a single Layer, without connectivity information.\n *\n * @param layer: Layer instance to print.\n */\nfunction printLayerSummary(layer, positions, \n// tslint:disable-next-line:no-any\nprintFn) {\n let outputShape;\n let inputShape;\n try {\n inputShape = (layer.inboundNodes.map(x => JSON.stringify(x.inputShapes))).join(',');\n }\n catch (err) {\n inputShape = 'multiple';\n }\n try {\n outputShape = JSON.stringify(layer.outputShape);\n }\n catch (err) {\n outputShape = 'multiple';\n }\n const name = layer.name;\n const className = layer.getClassName();\n const fields = [`${name} (${className})`, inputShape,\n outputShape, layer.countParams().toString()];\n printRow(fields, positions, printFn);\n}\n/**\n * Prints a summary for a single Layer, with connectivity information.\n */\nfunction printLayerSummaryWithConnections(layer, positions, relevantNodes, \n// tslint:disable-next-line:no-any\nprintFn) {\n let outputShape;\n let inputShape;\n try {\n inputShape = (layer.inboundNodes.map(x => JSON.stringify(x.inputShapes))).join(',');\n }\n catch (err) {\n inputShape = 'multiple';\n }\n try {\n outputShape = JSON.stringify(layer.outputShape);\n }\n catch (err) {\n outputShape = 'multiple';\n }\n const connections = [];\n for (const node of layer.inboundNodes) {\n if (relevantNodes != null && relevantNodes.length > 0 &&\n relevantNodes.indexOf(node) === -1) {\n continue;\n }\n for (let i = 0; i < node.inboundLayers.length; ++i) {\n const inboundLayer = node.inboundLayers[i].name;\n const inboundLayerIndex = node.nodeIndices[i];\n const inboundTensorIndex = node.tensorIndices[i];\n connections.push(`${inboundLayer}[${inboundLayerIndex}][${inboundTensorIndex}]`);\n }\n }\n const name = layer.name;\n const className = layer.getClassName();\n const firstConnection = connections.length === 0 ? '' : connections[0];\n const fields = [\n `${name} (${className})`, inputShape,\n outputShape, layer.countParams().toString(),\n firstConnection\n ];\n printRow(fields, positions, printFn);\n for (let i = 1; i < connections.length; ++i) {\n printRow(['', '', '', '', connections[i]], positions, printFn);\n }\n}\n//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibGF5ZXJfdXRpbHMuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi8uLi90ZmpzLWxheWVycy9zcmMvdXRpbHMvbGF5ZXJfdXRpbHMudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUE7Ozs7Ozs7O0dBUUc7QUFJSCxPQUFPLEVBQUMsb0JBQW9CLEVBQUMsTUFBTSxrQkFBa0IsQ0FBQztBQUV0RDs7Ozs7Ozs7Ozs7Ozs7R0FjRztBQUNILE1BQU0sVUFBVSxZQUFZLENBQ3hCLEtBQWdCLEVBQUUsVUFBbUIsRUFBRSxTQUFvQjtBQUMzRCxrQ0FBa0M7QUFDbEMsVUFDSSxPQUFPLENBQUMsR0FBRztJQUNqQixNQUFNLGNBQWMsR0FBRyxxQkFBcUIsQ0FBQyxLQUFLLENBQUMsQ0FBQztJQUVwRCwyQ0FBMkM7SUFDM0MsTUFBTSxTQUFTLEdBQWEsQ0FBQyxjQUFjLEVBQUUsYUFBYSxFQUFFLGNBQWMsRUFBRSxTQUFTLENBQUMsQ0FBQztJQUN2RixJQUFJLGNBQWMsRUFBRTtRQUNsQixVQUFVLEdBQUcsVUFBVSxJQUFJLEVBQUUsQ0FBQztRQUM5QixTQUFTLEdBQUcsU0FBUyxJQUFJLENBQUMsSUFBSSxFQUFFLElBQUksRUFBRSxJQUFJLEVBQUUsQ0FBQyxDQUFDLENBQUM7S0FDaEQ7U0FBTTtRQUNMLFVBQVUsR0FBRyxVQUFVLElBQUksR0FBRyxDQUFDO1FBQy9CLFNBQVMsR0FBRyxTQUFTLElBQUksQ0FBQyxJQUFJLEVBQUUsSUFBSSxFQUFFLElBQUksRUFBRSxJQUFJLEVBQUUsQ0FBQyxDQUFDLENBQUM7UUFDckQsMkNBQTJDO0tBQzVDO0lBRUQsSUFBSSxTQUFTLENBQUMsU0FBUyxDQUFDLE1BQU0sR0FBRyxDQUFDLENBQUMsSUFBSSxDQUFDLEVBQUU7UUFDeEMsK0RBQStEO1FBQy9ELFNBQVMsR0FBRyxTQUFTLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsSUFBSSxDQUFDLEtBQUssQ0FBQyxVQUFVLEdB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ICogQ29weXJpZ2h0IDIwMTggR29vZ2xlIExMQ1xuICpcbiAqIFVzZSBvZiB0aGlzIHNvdXJjZSBjb2RlIGlzIGdvdmVybmVkIGJ5IGFuIE1JVC1zdHlsZVxuICogbGljZW5zZSB0aGF0IGNhbiBiZSBmb3VuZCBpbiB0aGUgTElDRU5TRSBmaWxlIG9yIGF0XG4gKiBodHRwczovL29wZW5zb3VyY2Uub3JnL2xpY2Vuc2VzL01JVC5cbiAqID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4gKi9cblxuaW1wb3J0IHtDb250YWluZXJ9IGZyb20gJy4uL2VuZ2luZS9jb250YWluZXInO1xuaW1wb3J0IHtMYXllciwgTm9kZX0gZnJvbSAnLi4vZW5naW5lL3RvcG9sb2d5JztcbmltcG9ydCB7Y291bnRQYXJhbXNJbldlaWdodHN9IGZyb20gJy4vdmFyaWFibGVfdXRpbHMnO1xuXG4vKipcbiAqIFByaW50IHRoZSBzdW1tYXJ5IG9mIGEgTGF5ZXJzTW9kZWwgb2JqZWN0LlxuICpcbiAqIEBwYXJhbSBtb2RlbCB0Zi5MYXllcnNNb2RlbCBpbnN0YW5jZS5cbiAqIEBwYXJhbSBsaW5lTGVuZ3RoIFRvdGFsIGxlbmd0aCBvZiBwcmludGVkIGxpbmVzLiBTZXQgdGhpcyB0byBhZGFwdCB0byB0aGVcbiAqICAgZGlzcGxheSB0byBkaWZmZXJlbnQgdGVybWluYWwgb3IgY29uc29sZSBzaXplcy5cbiAqIEBwYXJhbSBwb3NpdGlvbnMgUmVsYXRpdmUgb3IgYWJzb2x1dGUgcG9zaXRpb25zIG9mIGxvZyBlbGVtZW50cyBpbiBlYWNoXG4gKiAgIGxpbmUuIEVhY2ggbnVtYmVyIGNvcnJlc3BvbmRzIHRvIHJpZ2h0LW1vc3QgKGkuZS4sIGVuZGluZykgcG9zaXRpb24gb2YgYVxuICogICBjb2x1bW4uXG4gKiAgIElmIG5vdCBwcm92aWRlZCwgZGVmYXVsdHMgdG8gYFswLjQ1LCAwLjg1LCAxXWAgZm9yIHNlcXVlbnRpYWwtbGlrZVxuICogICBtb2RlbHMgYW5kIGBbMC4zMywgMC41NSwgMC42NywgMV1gIGZvciBub24tc2VxdWVudGlhbCBsaWtlIG1vZGVscy5cbiAqIEBwYXJhbSBwcmludEZuIFByaW50IGZ1bmN0aW9uIHRvIHVzZS5cbiAqICAgSXQgd2lsbCBiZSBjYWxsZWQgb24gZWFjaCBsaW5lIG9mIHRoZSBzdW1tYXJ5LiBZb3UgY2FuIHByb3ZpZGUgYSBjdXN0b21cbiAqICAgZnVuY3Rpb24gaW4gb3JkZXIgdG8gY2FwdHVyZSB0aGUgc3RyaW5nIHN1bW1hcnkuIERlZmF1bHRzIHRvIGBjb25zb2xlLmxvZ2AuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBwcmludFN1bW1hcnkoXG4gICAgbW9kZWw6IENvbnRhaW5lciwgbGluZUxlbmd0aD86IG51bWJlciwgcG9zaXRpb25zPzogbnVtYmVyW10sXG4gICAgLy8gdHNsaW50OmRpc2FibGUtbmV4dC1saW5lOm5vLWFueVxuICAgIHByaW50Rm46IChtZXNzYWdlPzogYW55LCAuLi5vcHRpb25hbFBhcmFtczogYW55W10pID0+IHZvaWQgPVxuICAgICAgICBjb25zb2xlLmxvZyk6IHZvaWQge1xuICBjb25zdCBzZXF1ZW50aWFsTGlrZSA9IGlzTW9kZWxTZXF1ZW50aWFsTGlrZShtb2RlbCk7XG5cbiAgLy8gSGVhZGVyIG5hbWVzIGZvciBkaWZmZXJlbnQgbG9nIGVsZW1lbnRzLlxuICBjb25zdCB0b0Rpc3BsYXk6IHN0cmluZ1tdID0gWydMYXllciAodHlwZSknLCAnSW5wdXQgU2hhcGUnLCAnT3V0cHV0IHNoYXBlJywgJ1BhcmFtICMnXTtcbiAgaWYgKHNlcXVlbnRpYWxMaWtlKSB7XG4gICAgbGluZUxlbmd0aCA9IGxpbmVMZW5ndGggfHwgOTA7XG4gICAgcG9zaXRpb25zID0gcG9zaXRpb25zIHx8IFswLjMyLCAwLjYxLCAwLjg5LCAxXTtcbiAgfSBlbHNlIHtcbiAgICBsaW5lTGVuZ3RoID0gbGluZUxlbmd0aCB8fCAxMTU7XG4gICAgcG9zaXRpb25zID0gcG9zaXRpb25zIHx8IFswLjI0LCAwLjQ4LCAwLjcwLCAwLjgwLCAxXTtcbiAgICAvLyBIZWFkZXIgbmFtZXMgZm9yIGRpZmZlcmVudCBsb2cgZWxlbWVudHMuXG4gIH1cblxuICBpZiAocG9zaXRpb25zW3Bvc2l0aW9ucy5sZW5ndGggLSAxXSA8PSAxKSB7XG4gICAgLy8gYHBvc2l0aW9uc2AgaXMgcmVsYXRpdmUuIENvbnZlcnQgaXQgdG8gYWJzb2x1dGUgcG9zaXRpb25pbmcuXG4gICAgcG9zaXRpb25zID0gcG9zaXRpb25zLm1hcChwID0+IE1hdGguZmxvb3IobGluZUxlbmd0aCAqIHApKTtcbiAgfVxuXG4gIGxldCByZWxldmFudE5vZGVzOiBOb2RlW107XG4gIGlmICghc2VxdWVudGlhbExpa2UpIHtcbiAgICB0b0Rpc3BsYXkucHVzaCgnUmVjZWl2ZXMgaW5wdXRzJyk7XG4gICAgcmVsZXZhbnROb2RlcyA9IFtdO1xuICAgIGZvciAoY29uc3QgZGVwdGggaW4gbW9kZWwubm9kZXNCeURlcHRoKSB7XG4gICAgICByZWxldmFudE5vZGVzLnB1c2goLi4ubW9kZWwubm9kZXNCeURlcHRoW2RlcHRoXSk7XG4gICAgfVxuICB9XG5cbiAgcHJpbnRGbignXycucmVwZWF0KGxpbmVMZW5ndGgpKTtcbiAgcHJpbnRSb3codG9EaXNwbGF5LCBwb3NpdGlvbnMsIHByaW50Rm4pO1xuICBwcmludEZuKCc9Jy5yZXBlYXQobGluZUxlbmd0aCkpO1xuXG4gIGNvbnN0IGxheWVycyA9IG1vZGVsLmxheWVycztcbiAgZm9yIChsZXQgaSA9IDA7IGkgPCBsYXllcnMubGVuZ3RoOyArK2kpIHtcbiAgICBpZiAoc2VxdWVudGlhbExpa2UpIHtcbiAgICAgIHByaW50TGF5ZXJTdW1tYXJ5KGxheWVyc1tpXSwgcG9zaXRpb25zLCBwcmludEZuKTtcbiAgICB9IGVsc2Uge1xuICAgICAgcHJpbnRMYXllclN1bW1hcnlXaXRoQ29ubmVjdGlvbnMoXG4gICAgICAgICAgbGF5ZXJzW2ldLCBwb3NpdGlvbnMsIHJlbGV2YW50Tm9kZXMsIHByaW50Rm4pO1xuICAgIH1cbiAgICBwcmludEZuKChpID09PSBsYXllcnMubGVuZ3RoIC0gMSA/ICc9JyA6ICdfJykucmVwZWF0KGxpbmVMZW5ndGgpKTtcbiAgfVxuXG4gIC8vIHRzbGludDpkaXNhYmxlLW5leHQtbGluZTpuby1hbnlcbiAgKG1vZGVsIGFzIGFueSkuY2hlY2tUcmFpbmFibGVXZWlnaHRzQ29uc2lzdGVuY3koKTtcblxuICBjb25zdCB0cmFpbmFibGVDb3VudCA9IGNvdW50VHJhaW5hYmxlUGFyYW1zKG1vZGVsKTtcbiAgY29uc3Qgbm9uVHJhaW5hYmxlQ291bnQgPSBjb3VudFBhcmFtc0luV2VpZ2h0cyhtb2RlbC5ub25UcmFpbmFibGVXZWlnaHRzKTtcblxuICBwcmludEZuKGBUb3RhbCBwYXJhbXM6ICR7dHJhaW5hYmxlQ291bnQgKyBub25UcmFpbmFibGVDb3VudH1gKTtcbiAgcHJpbnRGbihgVHJhaW5hYmxlIHBhcmFtczogJHt0cmFpbmFibGVDb3VudH1gKTtcbiAgcHJpbnRGbihgTm9uLXRyYWluYWJsZSBwYXJhbXM6ICR7bm9uVHJhaW5hYmxlQ291bnR9YCk7XG4gIHByaW50Rm4oJ18nLnJlcGVhdChsaW5lTGVuZ3RoKSk7XG59XG5cbmZ1bmN0aW9uIGNvdW50VHJhaW5hYmxlUGFyYW1zKG1vZGVsOiBDb250YWluZXIpOiBudW1iZXIge1xuICBsZXQgdHJhaW5hYmxlQ291bnQ6IG51bWJlcjtcbiAgLy8gdHNsaW50OmRpc2FibGU6bm8tYW55XG4gIGlmICgobW9kZWwgYXMgYW55KS5jb2xsZWN0ZWRUcmFpbmFibGVXZWlnaHRzICE9IG51bGwpIHtcbiAgICB0cmFpbmFibGVDb3VudCA9XG4gICAgICAgIGNvdW50UGFyYW1zSW5XZWlnaHRzKChtb2RlbCBhcyBhbnkpLmNvbGxlY3RlZFRyYWluYWJsZVdlaWdodHMpO1xuICB9IGVsc2Uge1xuICAgIHRyYWluYWJsZUNvdW50ID0gY291bnRQYXJhbXNJbldlaWdodHMobW9kZWwudHJhaW5hYmxlV2VpZ2h0cyk7XG4gIH1cbiAgLy8gdHNsaW50OmVuYWJsZTpuby1hbnlcbiAgcmV0dXJuIHRyYWluYWJsZUNvdW50O1xufVxuXG5mdW5jdGlvbiBpc01vZGVsU2VxdWVudGlhbExpa2UobW9kZWw6IENvbnRhaW5lcik6IGJvb2xlYW4ge1xuICBsZXQgc2VxdWVudGlhbExpa2UgPSB0cnVlO1xuICBjb25zdCBub2Rlc0J5RGVwdGg6IE5vZGVbXVtdID0gW107XG4gIGNvbnN0IG5vZGVzOiBOb2RlW10gPSBbXTtcbiAgZm9yIChjb25zdCBkZXB0aCBpbiBtb2RlbC5ub2Rlc0J5RGVwdGgpIHtcbiAgICBub2Rlc0J5RGVwdGgucHVzaChtb2RlbC5ub2Rlc0J5RGVwdGhbZGVwdGhdKTtcbiAgfVxuICBmb3IgKGNvbnN0IGRlcHRoTm9kZXMgb2Ygbm9kZXNCeURlcHRoKSB7XG4gICAgaWYgKGRlcHRoTm9kZXMubGVuZ3RoID4gMSB8fFxuICAgICAgICBkZXB0aE5vZGVzLmxlbmd0aCA9PT0gMSAmJiBkZXB0aE5vZGVzWzBdLmluYm91bmRMYXllcnMubGVuZ3RoID4gMSkge1xuICAgICAgc2VxdWVudGlhbExpa2UgPSBmYWxzZTtcbiAgICAgIGJyZWFrO1xuICAgIH1cbiAgICBub2Rlcy5wdXNoKC4uLmRlcHRoTm9kZXMpO1xuICB9XG4gIGlmIChzZXF1ZW50aWFsTGlrZSkge1xuICAgIC8vIFNlYXJjaCBmb3Igc2hhcmVkIGxheWVycy5cbiAgICBmb3IgKGNvbnN0IGxheWVyIG9mIG1vZGVsLmxheWVycykge1xuICAgICAgbGV0IGZsYWcgPSBmYWxzZTtcbiAgICAgIGZvciAoY29uc3Qgbm9kZSBvZiBsYXllci5pbmJvdW5kTm9kZXMpIHtcbiAgICAgICAgaWYgKG5vZGVzLmluZGV4T2Yobm9kZSkgIT09IC0xKSB7XG4gICAgICAgICAgaWYgKGZsYWcpIHtcbiAgICAgICAgICAgIHNlcXVlbnRpYWxMaWtlID0gZmFsc2U7XG4gICAgICAgICAgICBicmVhaztcbiAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgZmxhZyA9IHRydWU7XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICB9XG4gICAgICBpZiAoIXNlcXVlbnRpYWxMaWtlKSB7XG4gICAgICAgIGJyZWFrO1xuICAgICAgfVxuICAgIH1cbiAgfVxuICByZXR1cm4gc2VxdWVudGlhbExpa2U7XG59XG5cbmZ1bmN0aW9uIHByaW50Um93KFxuICAgIGZpZWxkczogc3RyaW5nW10sIHBvc2l0aW9uczogbnVtYmVyW10sXG4gICAgLy8gdHNsaW50OmRpc2FibGUtbmV4dC1saW5lOm5vLWFueVxuICAgIHByaW50Rm46IChtZXNzYWdlPzogYW55LCAuLi5vcHRpb25hbFBhcmFtczogYW55W10pID0+IHZvaWQgPSBjb25zb2xlLmxvZykge1xuICBsZXQgbGluZSA9ICcnO1xuICBmb3IgKGxldCBpID0gMDsgaSA8IGZpZWxkcy5sZW5ndGg7ICsraSkge1xuICAgIGlmIChpID4gMCkge1xuICAgICAgbGluZSA9IGxpbmUuc2xpY2UoMCwgbGluZS5sZW5ndGggLSAxKSArICcgJztcbiAgICB9XG4gICAgbGluZSArPSBmaWVsZHNbaV07XG4gICAgbGluZSA9IGxpbmUuc2xpY2UoMCwgcG9zaXRpb25zW2ldKTtcbiAgICBsaW5lICs9ICcgJy5yZXBlYXQocG9zaXRpb25zW2ldIC0gbGluZS5sZW5ndGgpO1xuICB9XG4gIHByaW50Rm4obGluZSk7XG59XG5cbi8qKlxuICogUHJpbnRzIGEgc3VtbWFyeSBmb3IgYSBzaW5nbGUgTGF5ZXIsIHdpdGhvdXQgY29ubmVjdGl2aXR5IGluZm9ybWF0aW9uLlxuICpcbiAqIEBwYXJhbSBsYXllcjogTGF5ZXIgaW5zdGFuY2UgdG8gcHJpbnQuXG4gKi9cbmZ1bmN0aW9uIHByaW50TGF5ZXJTdW1tYXJ5KFxuICAgIGxheWVyOiBMYXllciwgcG9zaXRpb25zOiBudW1iZXJbXSxcbiAgICAvLyB0c2xpbnQ6ZGlzYWJsZS1uZXh0LWxpbmU6bm8tYW55XG4gICAgcHJpbnRGbjogKG1lc3NhZ2U/OiBhbnksIC4uLm9wdGlvbmFsUGFyYW1zOiBhbnlbXSkgPT4gdm9pZCkge1xuICBsZXQgb3V0cHV0U2hhcGU6IHN0cmluZztcbiAgbGV0IGlucHV0U2hhcGU6IHN0cmluZztcblxuICB0cnkge1xuICAgIGlucHV0U2hhcGUgPSAobGF5ZXIuaW5ib3VuZE5vZGVzLm1hcChcbiAgICAgIHggPT4gSlNPTi5zdHJpbmdpZnkoeC5pbnB1dFNoYXBlcylcbiAgICApKS5qb2luKCcsJyk7XG4gIH0gY2F0Y2ggKGVycikge1xuICAgIGlucHV0U2hhcGUgPSAnbXVsdGlwbGUnO1xuICB9XG5cbiAgdHJ5IHtcbiAgICBvdXRwdXRTaGFwZSA9IEpTT04uc3RyaW5naWZ5KGxheWVyLm91dHB1dFNoYXBlKTtcbiAgfSBjYXRjaCAoZXJyKSB7XG4gICAgb3V0cHV0U2hhcGUgPSAnbXVsdGlwbGUnO1xuICB9XG5cbiAgY29uc3QgbmFtZSA9IGxheWVyLm5hbWU7XG4gIGNvbnN0IGNsYXNzTmFtZSA9IGxheWVyLmdldENsYXNzTmFtZSgpO1xuICBjb25zdCBmaWVsZHM6IHN0cmluZ1tdID1cbiAgICAgIFtgJHtuYW1lfSAoJHtjbGFzc05hbWV9KWAsIGlucHV0U2hhcGUsXG4gICAgICBvdXRwdXRTaGFwZSwgbGF5ZXIuY291bnRQYXJhbXMoKS50b1N0cmluZygpXTtcbiAgcHJpbnRSb3coZmllbGRzLCBwb3NpdGlvbnMsIHByaW50Rm4pO1xufVxuXG4vKipcbiAqIFByaW50cyBhIHN1bW1hcnkgZm9yIGEgc2luZ2xlIExheWVyLCB3aXRoIGNvbm5lY3Rpdml0eSBpbmZvcm1hdGlvbi5cbiAqL1xuZnVuY3Rpb24gcHJpbnRMYXllclN1bW1hcnlXaXRoQ29ubmVjdGlvbnMoXG4gICAgbGF5ZXI6IExheWVyLCBwb3NpdGlvbnM6IG51bWJlcltdLCByZWxldmFudE5vZGVzOiBOb2RlW10sXG4gICAgLy8gdHNsaW50OmRpc2FibGUtbmV4dC1saW5lOm5vLWFueVxuICAgIHByaW50Rm46IChtZXNzYWdlPzogYW55LCAuLi5vcHRpb25hbFBhcmFtczogYW55W10pID0+IHZvaWQpIHtcbiAgbGV0IG91dHB1dFNoYXBlOiBzdHJpbmc7XG4gIGxldCBpbnB1dFNoYXBlOiBzdHJpbmc7XG5cbiAgdHJ5IHtcbiAgICBpbnB1dFNoYXBlID0gKGxheWVyLmluYm91bmROb2Rlcy5tYXAoXG4gICAgICB4ID0+IEpTT04uc3RyaW5naWZ5KHguaW5wdXRTaGFwZXMpXG4gICAgKSkuam9pbignLCcpO1xuICB9IGNhdGNoIChlcnIpIHtcbiAgICBpbnB1dFNoYXBlID0gJ211bHRpcGxlJztcbiAgfVxuXG4gIHRyeSB7XG4gICAgb3V0cHV0U2hhcGUgPSBKU09OLnN0cmluZ2lmeShsYXllci5vdXRwdXRTaGFwZSk7XG4gIH0gY2F0Y2ggKGVycikge1xuICAgIG91dHB1dFNoYXBlID0gJ211bHRpcGxlJztcbiAgfVxuXG4gIGNvbnN0IGNvbm5lY3Rpb25zOiBzdHJpbmdbXSA9IFtdO1xuICBmb3IgKGNvbnN0IG5vZGUgb2YgbGF5ZXIuaW5ib3VuZE5vZGVzKSB7XG4gICAgaWYgKHJlbGV2YW50Tm9kZXMgIT0gbnVsbCAmJiByZWxldmFudE5vZGVzLmxlbmd0aCA+IDAgJiZcbiAgICAgICAgcmVsZXZhbnROb2Rlcy5pbmRleE9mKG5vZGUpID09PSAtMSkge1xuICAgICAgY29udGludWU7XG4gICAgfVxuICAgIGZvciAobGV0IGkgPSAwOyBpIDwgbm9kZS5pbmJvdW5kTGF5ZXJzLmxlbmd0aDsgKytpKSB7XG4gICAgICBjb25zdCBpbmJvdW5kTGF5ZXIgPSBub2RlLmluYm91bmRMYXllcnNbaV0ubmFtZTtcbiAgICAgIGNvbnN0IGluYm91bmRMYXllckluZGV4ID0gbm9kZS5ub2RlSW5kaWNlc1tpXTtcbiAgICAgIGNvbnN0IGluYm91bmRUZW5zb3JJbmRleCA9IG5vZGUudGVuc29ySW5kaWNlc1tpXTtcbiAgICAgIGNvbm5lY3Rpb25zLnB1c2goXG4gICAgICAgICAgYCR7aW5ib3VuZExheWVyfVske2luYm91bmRMYXllckluZGV4fV1bJHtpbmJvdW5kVGVuc29ySW5kZXh9XWApO1xuICAgIH1cbiAgfVxuICBjb25zdCBuYW1lID0gbGF5ZXIubmFtZTtcbiAgY29uc3QgY2xhc3NOYW1lID0gbGF5ZXIuZ2V0Q2xhc3NOYW1lKCk7XG4gIGNvbnN0IGZpcnN0Q29ubmVjdGlvbiA9IGNvbm5lY3Rpb25zLmxlbmd0aCA9PT0gMCA/ICcnIDogY29ubmVjdGlvbnNbMF07XG4gIGNvbnN0IGZpZWxkczogc3RyaW5nW10gPSBbXG4gICAgYCR7bmFtZX0gKCR7Y2xhc3NOYW1lfSlgLCBpbnB1dFNoYXBlLFxuICAgIG91dHB1dFNoYXBlLCBsYXllci5jb3VudFBhcmFtcygpLnRvU3RyaW5nKCksXG4gICAgZmlyc3RDb25uZWN0aW9uXG4gIF07XG5cbiAgcHJpbnRSb3coZmllbGRzLCBwb3NpdGlvbnMsIHByaW50Rm4pO1xuICBmb3IgKGxldCBpID0gMTsgaSA8IGNvbm5lY3Rpb25zLmxlbmd0aDsgKytpKSB7XG4gICAgcHJpbnRSb3coWycnLCAnJywgJycsICcnLCBjb25uZWN0aW9uc1tpXV0sIHBvc2l0aW9ucywgcHJpbnRGbik7XG4gIH1cbn1cbiJdfQ==","/**\n * @license\n * Copyright 2018 Google LLC\n *\n * Use of this source code is governed by an MIT-style\n * license that can be found in the LICENSE file or at\n * https://opensource.org/licenses/MIT.\n * =============================================================================\n */\nimport * as generic_utils from '../utils/generic_utils';\n// tslint:enable\n/**\n * Test whether a value in an array is the name of a LayersModel or Layer.\n * @param key The key name that the value is found under. Note that the key\n * may not be at the level immediately above the value, if the value is in a\n * nested array.\n * @param index Index of the value in the Array that it is found in.\n * @param value The value object.\n * @returns A boolean indicating whether value is a name.\n */\nfunction isArrayItemInputOrOutputName(key, index, value) {\n return (key === 'inboundNodes' || key === 'outputLayers' ||\n key === 'inputLayers') &&\n index === 0 && typeof value === 'string';\n}\n/**\n * Convert a Pythonic config object to TypeScript config object.\n * @param pythonicConfig The config object to convert.\n * @param key Optional key name of the object being converted.\n * @returns Result of the conversion.\n */\nexport function convertPythonicToTs(pythonicConfig, key) {\n if (pythonicConfig === null) {\n return null;\n }\n else if (typeof pythonicConfig === 'string') {\n return generic_utils.toCamelCase(pythonicConfig);\n }\n else if ((typeof pythonicConfig === 'number') ||\n (typeof pythonicConfig === 'boolean')) {\n return pythonicConfig;\n }\n else if (pythonicConfig instanceof Array) {\n const tsArray = [];\n const arrayLength = pythonicConfig.length;\n for (let i = 0; i < arrayLength; ++i) {\n const item = pythonicConfig[i];\n if (isArrayItemInputOrOutputName(key, i, item)) {\n tsArray.push(item);\n }\n else {\n tsArray.push(convertPythonicToTs(item, key));\n }\n }\n return tsArray;\n }\n else {\n const tsDict = {};\n for (const pythonicKey of Object.keys(pythonicConfig)) {\n const pythonicValue = pythonicConfig[pythonicKey];\n if (pythonicKey === 'name' && typeof pythonicValue === 'string') {\n // Special case the 'name' key with a string value. Name values, such as\n // the names of LayersModel and Layer instances, should not undergo the\n // camel-case conversion.\n tsDict[pythonicKey] = pythonicValue;\n }\n else {\n const tsKey = generic_utils.toCamelCase(pythonicKey);\n tsDict[tsKey] = convertPythonicToTs(pythonicValue, tsKey);\n }\n }\n return tsDict;\n }\n}\n/**\n * Convert a TypeScript config object to Python config object.\n * @param tsConfig The config object to convert.\n * @param key Optional key name of the object being converted.\n * @returns Result of the conversion.\n */\nexport function convertTsToPythonic(tsConfig, key) {\n if (tsConfig === null || tsConfig === undefined) {\n return null;\n }\n else if (typeof tsConfig === 'string') {\n return generic_utils.toSnakeCase(tsConfig);\n }\n else if ((typeof tsConfig === 'number') || (typeof tsConfig === 'boolean')) {\n return tsConfig;\n }\n else if (tsConfig instanceof Array) {\n const pyArray = [];\n const arrayLength = tsConfig.length;\n for (let i = 0; i < arrayLength; ++i) {\n const item = tsConfig[i];\n if (isArrayItemInputOrOutputName(key, i, item)) {\n pyArray.push(item);\n }\n else {\n pyArray.push(convertTsToPythonic(item, key));\n }\n }\n return pyArray;\n }\n else {\n const pyDict = {};\n for (const tsKey of Object.keys(tsConfig)) {\n const tsValue = tsConfig[tsKey];\n const pyKey = generic_utils.toSnakeCase(tsKey);\n if ((tsKey === 'name' || tsKey === 'className') &&\n typeof tsValue === 'string') {\n // Special case the 'name' key with a string value. Name values, such as\n // the names of LayersModel and Layer instances, should not undergo the\n // snake-case conversion.\n pyDict[pyKey] = tsValue;\n }\n else {\n pyDict[pyKey] = convertTsToPythonic(tsValue, tsKey);\n }\n }\n return pyDict;\n }\n}\n//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic2VyaWFsaXphdGlvbl91dGlscy5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uLy4uL3RmanMtbGF5ZXJzL3NyYy91dGlscy9zZXJpYWxpemF0aW9uX3V0aWxzLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBOzs7Ozs7OztHQVFHO0FBVUgsT0FBTyxLQUFLLGFBQWEsTUFBTSx3QkFBd0IsQ0FBQztBQUN4RCxnQkFBZ0I7QUFFaEI7Ozs7Ozs7O0dBUUc7QUFDSCxTQUFTLDRCQUE0QixDQUNqQyxHQUFXLEVBQUUsS0FBYSxFQUFFLEtBQVE7SUFDdEMsT0FBTyxDQUFDLEdBQUcsS0FBSyxjQUFjLElBQUksR0FBRyxLQUFLLGNBQWM7UUFDaEQsR0FBRyxLQUFLLGFBQWEsQ0FBQztRQUMxQixLQUFLLEtBQUssQ0FBQyxJQUFJLE9BQU8sS0FBSyxLQUFLLFFBQVEsQ0FBQztBQUMvQyxDQUFDO0FBRUQ7Ozs7O0dBS0c7QUFDSCxNQUFNLFVBQVUsbUJBQW1CLENBQy9CLGNBQTJCLEVBQUUsR0FBWTtJQUMzQyxJQUFJLGNBQWMsS0FBSyxJQUFJLEVBQUU7UUFDM0IsT0FBTyxJQUFJLENBQUM7S0FDYjtTQUFNLElBQUksT0FBTyxjQUFjLEtBQUssUUFBUSxFQUFFO1FBQzdDLE9BQU8sYUFBYSxDQUFDLFdBQVcsQ0FBQyxjQUFjLENBQUMsQ0FBQztLQUNsRDtTQUFNLElBQ0gsQ0FBQyxPQUFPLGNBQWMsS0FBSyxRQUFRLENBQUM7UUFDcEMsQ0FBQyxPQUFPLGNBQWMsS0FBSyxTQUFTLENBQUMsRUFBRTtRQUN6QyxPQUFPLGNBQWMsQ0FBQztLQUN2QjtTQUFNLElBQUksY0FBYyxZQUFZLEtBQUssRUFBRTtRQUMxQyxNQUFNLE9BQU8sR0FBRyxFQUFFLENBQUM7UUFDbkIsTUFBTSxXQUFXLEdBQUcsY0FBYyxDQUFDLE1BQU0sQ0FBQztRQUMxQyxLQUFLLElBQUksQ0FBQyxHQUFHLENBQUMsRUFBRSxDQUFDLEdBQUcsV0FBVyxFQUFF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Qy9CLHdFQUF3RTtnQkFDeEUsdUVBQXVFO2dCQUN2RSx5QkFBeUI7Z0JBQ3pCLE1BQU0sQ0FBQyxLQUFLLENBQUMsR0FBRyxPQUFPLENBQUM7YUFDekI7aUJBQU07Z0JBQ0wsTUFBTSxDQUFDLEtBQUssQ0FBQyxHQUFHLG1CQUFtQixDQUFDLE9BQU8sRUFBRSxLQUFLLENBQUMsQ0FBQzthQUNyRDtTQUNGO1FBQ0QsT0FBTyxNQUFNLENBQUM7S0FDZjtBQUNILENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyIvKipcbiAqIEBsaWNlbnNlXG4gKiBDb3B5cmlnaHQgMjAxOCBHb29nbGUgTExDXG4gKlxuICogVXNlIG9mIHRoaXMgc291cmNlIGNvZGUgaXMgZ292ZXJuZWQgYnkgYW4gTUlULXN0eWxlXG4gKiBsaWNlbnNlIHRoYXQgY2FuIGJlIGZvdW5kIGluIHRoZSBMSUNFTlNFIGZpbGUgb3IgYXRcbiAqIGh0dHBzOi8vb3BlbnNvdXJjZS5vcmcvbGljZW5zZXMvTUlULlxuICogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbiAqL1xuXG4vLyBQb3J0aW5nIG5vdGU6IFRoaXMgZmlsZSBkb2Vzbid0IGV4aXN0IGluIFB5S2VyYXMuXG4vLyBJdHMgcHVycG9zZSBoZXJlIGlzIHRvIGNlbnRyYWxpemUgdGhlIGJvdW5kYXJ5IGxheWVyIGJldHdlZW5cbi8vIHRmanMtbGF5ZXJzJ3MgaW50ZXJuYWwgQ29uZmlnIFRTLUNlbnRyaWMgZm9ybWF0IGFuZCBQeUtlcmFzJ3Ncbi8vIHNlcmlhbGl6ZWQgUHl0aG9uIENvbmZpZyBmb3JtYXQuXG5cbmltcG9ydCB7c2VyaWFsaXphdGlvbn0gZnJvbSAnQHRlbnNvcmZsb3cvdGZqcy1jb3JlJztcblxuaW1wb3J0IHtQeUpzb25WYWx1ZX0gZnJvbSAnLi4va2VyYXNfZm9ybWF0L3R5cGVzJztcbmltcG9ydCAqIGFzIGdlbmVyaWNfdXRpbHMgZnJvbSAnLi4vdXRpbHMvZ2VuZXJpY191dGlscyc7XG4vLyB0c2xpbnQ6ZW5hYmxlXG5cbi8qKlxuICogVGVzdCB3aGV0aGVyIGEgdmFsdWUgaW4gYW4gYXJyYXkgaXMgdGhlIG5hbWUgb2YgYSBMYXllcnNNb2RlbCBvciBMYXllci5cbiAqIEBwYXJhbSBrZXkgVGhlIGtleSBuYW1lIHRoYXQgdGhlIHZhbHVlIGlzIGZvdW5kIHVuZGVyLiBOb3RlIHRoYXQgdGhlIGtleVxuICogICBtYXkgbm90IGJlIGF0IHRoZSBsZXZlbCBpbW1lZGlhdGVseSBhYm92ZSB0aGUgdmFsdWUsIGlmIHRoZSB2YWx1ZSBpcyBpbiBhXG4gKiAgIG5lc3RlZCBhcnJheS5cbiAqIEBwYXJhbSBpbmRleCBJbmRleCBvZiB0aGUgdmFsdWUgaW4gdGhlIEFycmF5IHRoYXQgaXQgaXMgZm91bmQgaW4uXG4gKiBAcGFyYW0gdmFsdWUgVGhlIHZhbHVlIG9iamVjdC5cbiAqIEByZXR1cm5zIEEgYm9vbGVhbiBpbmRpY2F0aW5nIHdoZXRoZXIgdmFsdWUgaXMgYSBuYW1lLlxuICovXG5mdW5jdGlvbiBpc0FycmF5SXRlbUlucHV0T3JPdXRwdXROYW1lPFQ+KFxuICAgIGtleTogc3RyaW5nLCBpbmRleDogbnVtYmVyLCB2YWx1ZTogVCk6IGJvb2xlYW4ge1xuICByZXR1cm4gKGtleSA9PT0gJ2luYm91bmROb2RlcycgfHwga2V5ID09PSAnb3V0cHV0TGF5ZXJzJyB8fFxuICAgICAgICAgIGtleSA9PT0gJ2lucHV0TGF5ZXJzJykgJiZcbiAgICAgIGluZGV4ID09PSAwICYmIHR5cGVvZiB2YWx1ZSA9PT0gJ3N0cmluZyc7XG59XG5cbi8qKlxuICogQ29udmVydCBhIFB5dGhvbmljIGNvbmZpZyBvYmplY3QgdG8gVHlwZVNjcmlwdCBjb25maWcgb2JqZWN0LlxuICogQHBhcmFtIHB5dGhvbmljQ29uZmlnIFRoZSBjb25maWcgb2JqZWN0IHRvIGNvbnZlcnQuXG4gKiBAcGFyYW0ga2V5IE9wdGlvbmFsIGtleSBuYW1lIG9mIHRoZSBvYmplY3QgYmVpbmcgY29udmVydGVkLlxuICogQHJldHVybnMgUmVzdWx0IG9mIHRoZSBjb252ZXJzaW9uLlxuICovXG5leHBvcnQgZnVuY3Rpb24gY29udmVydFB5dGhvbmljVG9UcyhcbiAgICBweXRob25pY0NvbmZpZzogUHlKc29uVmFsdWUsIGtleT86IHN0cmluZyk6IHNlcmlhbGl6YXRpb24uQ29uZmlnRGljdFZhbHVlIHtcbiAgaWYgKHB5dGhvbmljQ29uZmlnID09PSBudWxsKSB7XG4gICAgcmV0dXJuIG51bGw7XG4gIH0gZWxzZSBpZiAodHlwZW9mIHB5dGhvbmljQ29uZmlnID09PSAnc3RyaW5nJykge1xuICAgIHJldHVybiBnZW5lcmljX3V0aWxzLnRvQ2FtZWxDYXNlKHB5dGhvbmljQ29uZmlnKTtcbiAgfSBlbHNlIGlmIChcbiAgICAgICh0eXBlb2YgcHl0aG9uaWNDb25maWcgPT09ICdudW1iZXInKSB8fFxuICAgICAgKHR5cGVvZiBweXRob25pY0NvbmZpZyA9PT0gJ2Jvb2xlYW4nKSkge1xuICAgIHJldHVybiBweXRob25pY0NvbmZpZztcbiAgfSBlbHNlIGlmIChweXRob25pY0NvbmZpZyBpbnN0YW5jZW9mIEFycmF5KSB7XG4gICAgY29uc3QgdHNBcnJheSA9IFtdO1xuICAgIGNvbnN0IGFycmF5TGVuZ3RoID0gcHl0aG9uaWNDb25maWcubGVuZ3RoO1xuICAgIGZvciAobGV0IGkgPSAwOyBpIDwgYXJyYXlMZW5ndGg7ICsraSkge1xuICAgICAgY29uc3QgaXRlbSA9IHB5dGhvbmljQ29uZmlnW2ldO1xuICAgICAgaWYgKGlzQXJyYXlJdGVtSW5wdXRPck91dHB1dE5hbWUoa2V5LCBpLCBpdGVtKSkge1xuICAgICAgICB0c0FycmF5LnB1c2goaXRlbSk7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICB0c0FycmF5LnB1c2goY29udmVydFB5dGhvbmljVG9UcyhpdGVtLCBrZXkpKTtcbiAgICAgIH1cbiAgICB9XG4gICAgcmV0dXJuIHRzQXJyYXk7XG4gIH0gZWxzZSB7XG4gICAgY29uc3QgdHNEaWN0OiBzZXJpYWxpemF0aW9uLkNvbmZpZ0RpY3QgPSB7fTtcbiAgICBmb3IgKGNvbnN0IHB5dGhvbmljS2V5IG9mIE9iamVjdC5rZXlzKHB5dGhvbmljQ29uZmlnKSkge1xuICAgICAgY29uc3QgcHl0aG9uaWNWYWx1ZSA9IHB5dGhvbmljQ29uZmlnW3B5dGhvbmljS2V5XTtcbiAgICAgIGlmIChweXRob25pY0tleSA9PT0gJ25hbWUnICYmIHR5cGVvZiBweXRob25pY1ZhbHVlID09PSAnc3RyaW5nJykge1xuICAgICAgICAvLyBTcGVjaWFsIGNhc2UgdGhlICduYW1lJyBrZXkgd2l0aCBhIHN0cmluZyB2YWx1ZS4gTmFtZSB2YWx1ZXMsIHN1Y2ggYXNcbiAgICAgICAgLy8gdGhlIG5hbWVzIG9mIExheWVyc01vZGVsIGFuZCBMYXllciBpbnN0YW5jZXMsIHNob3VsZCBub3QgdW5kZXJnbyB0aGVcbiAgICAgICAgLy8gY2FtZWwtY2FzZSBjb252ZXJzaW9uLlxuICAgICAgICB0c0RpY3RbcHl0aG9uaWNLZXldID0gcHl0aG9uaWNWYWx1ZTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIGNvbnN0IHRzS2V5ID0gZ2VuZXJpY191dGlscy50b0NhbWVsQ2FzZShweXRob25pY0tleSk7XG4gICAgICAgIHRzRGljdFt0c0tleV0gPSBjb252ZXJ0UHl0aG9uaWNUb1RzKHB5dGhvbmljVmFsdWUsIHRzS2V5KTtcbiAgICAgIH1cbiAgICB9XG4gICAgcmV0dXJuIHRzRGljdDtcbiAgfVxufVxuXG4vKipcbiAqIENvbnZlcnQgYSBUeXBlU2NyaXB0IGNvbmZpZyBvYmplY3QgdG8gUHl0aG9uIGNvbmZpZyBvYmplY3QuXG4gKiBAcGFyYW0gdHNDb25maWcgVGhlIGNvbmZpZyBvYmplY3QgdG8gY29udmVydC5cbiAqIEBwYXJhbSBrZXkgT3B0aW9uYWwga2V5IG5hbWUgb2YgdGhlIG9iamVjdCBiZWluZyBjb252ZXJ0ZWQuXG4gKiBAcmV0dXJucyBSZXN1bHQgb2YgdGhlIGNvbnZlcnNpb24uXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBjb252ZXJ0VHNUb1B5dGhvbmljKFxuICAgIHRzQ29uZmlnOiBzZXJpYWxpemF0aW9uLkNvbmZpZ0RpY3RWYWx1ZSwga2V5Pzogc3RyaW5nKTogUHlKc29uVmFsdWUge1xuICBpZiAodHNDb25maWcgPT09IG51bGwgfHwgdHNDb25maWcgPT09IHVuZGVmaW5lZCkge1xuICAgIHJldHVybiBudWxsO1xuICB9IGVsc2UgaWYgKHR5cGVvZiB0c0NvbmZpZyA9PT0gJ3N0cmluZycpIHtcbiAgICByZXR1cm4gZ2VuZXJpY191dGlscy50b1NuYWtlQ2FzZSh0c0NvbmZpZyk7XG4gIH0gZWxzZSBpZiAoXG4gICAgICAodHlwZW9mIHRzQ29uZmlnID09PSAnbnVtYmVyJykgfHwgKHR5cGVvZiB0c0NvbmZpZyA9PT0gJ2Jvb2xlYW4nKSkge1xuICAgIHJldHVybiB0c0NvbmZpZztcbiAgfSBlbHNlIGlmICh0c0NvbmZpZyBpbnN0YW5jZW9mIEFycmF5KSB7XG4gICAgY29uc3QgcHlBcnJheSA9IFtdO1xuICAgIGNvbnN0IGFycmF5TGVuZ3RoID0gdHNDb25maWcubGVuZ3RoO1xuICAgIGZvciAobGV0IGkgPSAwOyBpIDwgYXJyYXlMZW5ndGg7ICsraSkge1xuICAgICAgY29uc3QgaXRlbSA9IHRzQ29uZmlnW2ldO1xuICAgICAgaWYgKGlzQXJyYXlJdGVtSW5wdXRPck91dHB1dE5hbWUoa2V5LCBpLCBpdGVtKSkge1xuICAgICAgICBweUFycmF5LnB1c2goaXRlbSk7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBweUFycmF5LnB1c2goY29udmVydFRzVG9QeXRob25pYyhpdGVtLCBrZXkpKTtcbiAgICAgIH1cbiAgICB9XG4gICAgcmV0dXJuIHB5QXJyYXk7XG4gIH0gZWxzZSB7XG4gICAgY29uc3QgcHlEaWN0OiBzZXJpYWxpemF0aW9uLkNvbmZpZ0RpY3QgPSB7fTtcbiAgICBmb3IgKGNvbnN0IHRzS2V5IG9mIE9iamVjdC5rZXlzKHRzQ29uZmlnKSkge1xuICAgICAgY29uc3QgdHNWYWx1ZSA9IHRzQ29uZmlnW3RzS2V5XTtcbiAgICAgIGNvbnN0IHB5S2V5ID0gZ2VuZXJpY191dGlscy50b1NuYWtlQ2FzZSh0c0tleSk7XG4gICAgICBpZiAoKHRzS2V5ID09PSAnbmFtZScgfHwgdHNLZXkgPT09ICdjbGFzc05hbWUnKSAmJlxuICAgICAgICAgIHR5cGVvZiB0c1ZhbHVlID09PSAnc3RyaW5nJykge1xuICAgICAgICAvLyBTcGVjaWFsIGNhc2UgdGhlICduYW1lJyBrZXkgd2l0aCBhIHN0cmluZyB2YWx1ZS4gTmFtZSB2YWx1ZXMsIHN1Y2ggYXNcbiAgICAgICAgLy8gdGhlIG5hbWVzIG9mIExheWVyc01vZGVsIGFuZCBMYXllciBpbnN0YW5jZXMsIHNob3VsZCBub3QgdW5kZXJnbyB0aGVcbiAgICAgICAgLy8gc25ha2UtY2FzZSBjb252ZXJzaW9uLlxuICAgICAgICBweURpY3RbcHlLZXldID0gdHNWYWx1ZTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHB5RGljdFtweUtleV0gPSBjb252ZXJ0VHNUb1B5dGhvbmljKHRzVmFsdWUsIHRzS2V5KTtcbiAgICAgIH1cbiAgICB9XG4gICAgcmV0dXJuIHB5RGljdDtcbiAgfVxufVxuIl19","/** @license See the LICENSE file. */\n// This code is auto-generated, do not modify this file!\nconst version = '3.21.0';\nexport { version };\n//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidmVyc2lvbi5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uL3RmanMtbGF5ZXJzL3NyYy92ZXJzaW9uLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLHFDQUFxQztBQUVyQyx3REFBd0Q7QUFDeEQsTUFBTSxPQUFPLEdBQUcsUUFBUSxDQUFDO0FBQ3pCLE9BQU8sRUFBQyxPQUFPLEVBQUMsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbIi8qKiBAbGljZW5zZSBTZWUgdGhlIExJQ0VOU0UgZmlsZS4gKi9cblxuLy8gVGhpcyBjb2RlIGlzIGF1dG8tZ2VuZXJhdGVkLCBkbyBub3QgbW9kaWZ5IHRoaXMgZmlsZSFcbmNvbnN0IHZlcnNpb24gPSAnMy4yMS4wJztcbmV4cG9ydCB7dmVyc2lvbn07XG4iXX0=","/**\n * @license\n * Copyright 2018 Google LLC\n *\n * Use of this source code is governed by an MIT-style\n * license that can be found in the LICENSE file or at\n * https://opensource.org/licenses/MIT.\n * =============================================================================\n */\n/* Original source: keras/engine/topology.py */\nimport { tidy } from '@tensorflow/tfjs-core';\nimport { getUid } from '../backend/state';\nimport { NotImplementedError, RuntimeError, ValueError } from '../errors';\nimport { deserialize as deserializeLayer } from '../layers/serialization';\nimport * as generic_utils from '../utils/generic_utils';\nimport { convertTsToPythonic } from '../utils/serialization_utils';\nimport * as types_utils from '../utils/types_utils';\nimport { batchSetValue } from '../variables';\nimport { version as layersVersion } from '../version';\nimport { execute, FeedDict } from './executor';\nimport { InputLayer } from './input_layer';\nimport { Layer, Node } from './topology';\n/**\n * A Container is a directed acyclic graph of layers.\n *\n * It is the topological form of a \"model\". A LayersModel\n * is simply a Container with added training routines.\n *\n */\nexport class Container extends Layer {\n constructor(args) {\n // No args passed to super's constructor.\n super({});\n this.containerNodes = new Set();\n this.name = args.name;\n if (this.name == null) {\n const prefix = this.getClassName().toLowerCase();\n this.name = getUid(prefix);\n }\n this.supportsMasking = false;\n this.trainable_ = true;\n // TODO(michaelterry): Initialize perInputLosses/Updates here.\n // Container-specific properties.\n if (Array.isArray(args.inputs)) {\n this.inputs = args.inputs.slice();\n }\n else {\n this.inputs = [args.inputs];\n }\n if (Array.isArray(args.outputs)) {\n this.outputs = args.outputs.slice();\n }\n else {\n this.outputs = [args.outputs];\n }\n // Check for redundancy in inputs.\n if (generic_utils.unique(this.inputs).length !== this.inputs.length) {\n throw new ValueError('The list of inputs passed to the model is ' +\n 'redundant. All inputs should only appear once. Found: ' +\n `${this.inputs.map(x => x.name)}`);\n }\n // Check for redundancy in outputs.\n if (generic_utils.unique(this.outputs).length !== this.outputs.length) {\n console.warn('The list of outputs passed to the model is redundant. ' +\n 'All outputs should only appear once. Found: ' +\n `${this.outputs.map(x => x.name)}`);\n }\n /*\n List of initial layers (1 to 1 mapping with this.inputs, hence the same\n layer might appear twice)\n */\n this.inputLayers = [];\n this.inputLayersNodeIndices = [];\n this.inputLayersTensorIndices = [];\n /*\n List of layers (1 to 1 mapping with this.outputs, hence the same layer\n might appear twice)\n */\n this.outputLayers = [];\n this.outputLayersNodeIndices = [];\n this.outputLayersTensorIndices = [];\n /*\n All layers in order of horizontal graph traversal. Entries are unique.\n Includes input and output layers.\n */\n this.layers = [];\n /*\n References to container layers that were constructed internally. We need\n these to properly dispose of tensors from nested containers.\n */\n this.internalContainerRefs = [];\n // TODO(michaelterry): Determine if caching still needed with eager\n // backend.\n /*\n This is for performance optimization when calling the Container on new\n inputs. Every time the Container is called on a set on input tensors,\n we compute the output tensors, output masks and output shapes in one pass,\n then cache them here. When one of these outputs is queried later,\n we retrieve it from there instead of recomputing it.\n */\n // this.outputTensorCache = {};\n // this.outputShapeCache = {};\n // Build this.outputLayers:\n for (const x of this.outputs) {\n const layer = x.sourceLayer;\n const nodeIndex = x.nodeIndex;\n const tensorIndex = x.tensorIndex;\n this.outputLayers.push(layer);\n this.outputLayersNodeIndices.push(nodeIndex);\n this.outputLayersTensorIndices.push(tensorIndex);\n }\n // TODO(michaelterry): Add output mask cache code.\n // Build this.inputLayers:\n for (const x of this.inputs) {\n const layer = x.sourceLayer;\n const nodeIndex = x.nodeIndex;\n const tensorIndex = x.tensorIndex;\n /*\n It's supposed to be an input layer, so only one node\n and one tensor output.\n */\n generic_utils.assert(nodeIndex === 0, 'input layer has >1 nodes');\n generic_utils.assert(tensorIndex === 0, 'input layer has >1 tensors');\n this.inputLayers.push(layer);\n this.inputLayersNodeIndices.push(nodeIndex);\n this.inputLayersTensorIndices.push(tensorIndex);\n }\n // Build this.inputNames and this.outputNames.\n this.inputNames = [];\n this.outputNames = [];\n this.feedInputShapes = [];\n this.feedInputNames = [];\n this.feedOutputNames = [];\n for (let i = 0; i < this.inputLayers.length; i++) {\n const layer = this.inputLayers[i];\n // Check that layer is an InputLayer.\n if (!(layer instanceof InputLayer)) {\n throw new TypeError('Input layers to a LayersModel must be InputLayer objects. ' +\n `Received inputs: ${args.inputs}. ` +\n `Input ${i} (0-based) originates ` +\n `from layer type ${layer.getClassName()}.`);\n }\n this.inputNames.push(layer.name);\n this.feedInputShapes.push(layer.batchInputShape);\n this.feedInputNames.push(layer.name);\n }\n for (const layer of this.outputLayers) {\n this.outputNames.push(layer.name);\n }\n this.internalInputShapes = this.inputs.map(x => x.shape);\n this.internalOutputShapes = this.outputs.map(x => x.shape);\n /*\n Container_nodes: set of nodes included in the graph (not all nodes\n included in the layers are relevant to the current graph).\n */\n // ids of all nodes relevant to the Container:\n const nodesDepths = {};\n // To recover nodes from their ID.\n const nodeIDToNode = {};\n const layersDepths = {};\n // To layers from their ID.\n const layerIDToLayer = {};\n const layerIndices = {};\n const nodesInDecreasingDepth = [];\n /**\n * Builds a map of the graph of layers.\n *\n * This recursively updates the map `layerIndices`,\n * the list `nodesInDecreasingDepth` and the set `containerNodes`.\n *\n * @param tensor Some tensor in a graph.\n * @param finishedNodes Set of nodes whose subgraphs have been traversed\n * completely. Useful to prevent duplicated work.\n * @param nodesInProgress Set of nodes that are currently active on the\n * recursion stack. Useful to detect cycles.\n * @param layer Layer from which `tensor` comes from. If not provided,\n * will be obtained from tensor.sourceLayer.\n * @param nodeIndex Node index from which `tensor` comes from.\n * @param tensorIndex TensorIndex from which `tensor` comes from.\n *\n * @exception RuntimeError if a cycle is detected.\n */\n const buildMapOfGraph = (tensor, finishedNodes, nodesInProgress, layer, nodeIndex, tensorIndex) => {\n if (layer == null || nodeIndex == null || tensorIndex == null) {\n layer = tensor.sourceLayer;\n nodeIndex = tensor.nodeIndex;\n tensorIndex = tensor.tensorIndex;\n }\n const node = layer.inboundNodes[nodeIndex];\n // Prevent cycles.\n if (nodesInProgress.indexOf(node) !== -1) {\n throw new RuntimeError(`The tensor ${tensor.name} at layer \"${layer.name}\" ` +\n 'is part of a cycle.');\n }\n // Don't repeat work for shared subgraphs\n if (finishedNodes.indexOf(node) !== -1) {\n return;\n }\n // Update containerNodes.\n this.containerNodes.add(Container.nodeKey(layer, nodeIndex));\n // Store the traversal order for layer sorting.\n if (!(layer.id in layerIndices)) {\n layerIndices[layer.id] = Object.keys(layerIndices).length;\n }\n if (nodesInProgress.indexOf(node) === -1) {\n nodesInProgress.push(node);\n }\n // Propagate to all previous tensors connected to this node.\n const numInboundLayers = node.inboundLayers.length;\n for (let i = 0; i < numInboundLayers; i++) {\n const x = node.inputTensors[i];\n const layer = node.inboundLayers[i];\n const nodeIndex = node.nodeIndices[i];\n const tensorIndex = node.tensorIndices[i];\n buildMapOfGraph(x, finishedNodes, nodesInProgress, layer, nodeIndex, tensorIndex);\n }\n finishedNodes.push(node);\n while (nodesInProgress.indexOf(node) >= 0) {\n nodesInProgress.splice(nodesInProgress.indexOf(node), 1);\n }\n nodesInDecreasingDepth.push(node);\n };\n const finishedNodes = [];\n const nodesInProgress = [];\n for (const x of this.outputs) {\n buildMapOfGraph(x, finishedNodes, nodesInProgress);\n }\n const reversedNodesInDecreasingDepth = nodesInDecreasingDepth.slice().reverse();\n for (const node of reversedNodesInDecreasingDepth) {\n nodeIDToNode[node.id] = node;\n // If the depth is not set, the node has no outbound nodes (depth 0).\n if (!(node.id in nodesDepths)) {\n nodesDepths[node.id] = 0;\n }\n let depth = nodesDepths[node.id];\n // Update the depth of the corresponding layer\n const previousDepth = (layersDepths[node.outboundLayer.id] == null ?\n 0 :\n layersDepths[node.outboundLayer.id]);\n /*\n If we've seen this layer before at a higher depth, we should use that\n depth instead of the node depth. This is necessary for shared layers\n that have inputs at different depth levels in the graph.\n */\n depth = Math.max(depth, previousDepth);\n layersDepths[node.outboundLayer.id] = depth;\n layerIDToLayer[node.outboundLayer.id] = node.outboundLayer;\n nodesDepths[node.id] = depth;\n // Update the depth of inbound nodes.\n for (let i = 0; i < node.inboundLayers.length; i++) {\n const inboundLayer = node.inboundLayers[i];\n const nodeIndex = node.nodeIndices[i];\n const inboundNode = inboundLayer.inboundNodes[nodeIndex];\n const previousDepth = (nodesDepths[inboundNode.id] == null ? 0 :\n nodesDepths[inboundNode.id]);\n nodesDepths[inboundNode.id] = Math.max(depth + 1, previousDepth);\n nodeIDToNode[inboundNode.id] = inboundNode;\n }\n }\n // Build a dict {depth: list of nodes with this depth}\n const nodesByDepth = {};\n for (const nodeID in nodesDepths) {\n const depth = nodesDepths[nodeID];\n if (!(depth in nodesByDepth)) {\n nodesByDepth[depth] = [];\n }\n nodesByDepth[depth].push(nodeIDToNode[nodeID]);\n }\n // Build a dict {depth: list of layers with this depth}\n const layersByDepth = {};\n for (const layerID in layersDepths) {\n const depth = layersDepths[layerID];\n if (!(depth in layersByDepth)) {\n layersByDepth[depth] = [];\n }\n layersByDepth[depth].push(layerIDToLayer[layerID]);\n }\n // Get sorted list of layer depths.\n let depthKeys = Object.keys(layersByDepth)\n .map(x => parseInt(x, 10))\n .sort(generic_utils.reverseNumberCompare);\n // Set this.layers and this.layersByDepth.\n this.layers = [];\n for (const depth of depthKeys) {\n const layersForDepth = layersByDepth[depth];\n // Container.layers needs to have a deterministic order:\n // here we order them by traversal order.\n layersForDepth.sort((a, b) => {\n const aIndex = layerIndices[a.id];\n const bIndex = layerIndices[b.id];\n if (aIndex < bIndex) {\n return -1;\n }\n if (aIndex > bIndex) {\n return 1;\n }\n return 0;\n });\n for (const layer of layersForDepth) {\n if (layer instanceof Container) {\n this.internalContainerRefs.push(layer);\n }\n this.layers.push(layer);\n }\n }\n this.layersByDepth = layersByDepth;\n // Get sorted list of node depths;\n depthKeys = Object.keys(nodesByDepth)\n .map(x => parseInt(x, 10))\n .sort(generic_utils.reverseNumberCompare);\n // Check that all tensors required are computable.\n // computable_tensors: all tensors in the graph\n // that can be computed from the inputs provided.\n const computableTensors = this.inputs.slice();\n // To provide a better error msg.\n const layersWithCompleteInput = [];\n for (const depth of depthKeys) {\n for (const node of nodesByDepth[depth]) {\n const layer = node.outboundLayer;\n if (layer != null) {\n for (const x of node.inputTensors) {\n if (computableTensors.indexOf(x) === -1) {\n throw new RuntimeError(`Graph disconnected: cannot obtain value for tensor ${x}` +\n ` at layer \"${layer.name}\". ` +\n 'The following previous layers were accessed without ' +\n `issue: ${layersWithCompleteInput}`);\n }\n }\n for (const x of node.outputTensors) {\n computableTensors.push(x);\n }\n layersWithCompleteInput.push(layer.name);\n }\n }\n }\n // Set this.containerNodes and this.nodesByDepth.\n this.nodesByDepth = nodesByDepth;\n // Ensure name unicity, which will be crucial for serialization\n // (since serialized nodes refer to layers by their name).\n const allNames = this.layers.map(x => x.name);\n for (const name of allNames) {\n const numOccurrences = allNames.filter(x => x === name).length;\n if (numOccurrences !== 1) {\n throw new RuntimeError(`The name \"${name}\" is used ${numOccurrences} times ` +\n 'in the model. All layer names should be unique. Layer names: ' +\n JSON.stringify(allNames));\n }\n }\n // Layer parameters.\n // The new container starts with a single inbound node\n // for its inputs, and no outbound nodes.\n // Will be appended to by future calls to apply().\n this.outboundNodes = [];\n // Will be appended to below, and by future calls to apply().\n this.inboundNodes = [];\n // Create the node linking internal inputs to internal outputs.\n // (This call has side effects.)\n // tslint:disable-next-line:no-unused-expression\n new Node({\n outboundLayer: this,\n inboundLayers: [],\n nodeIndices: [],\n tensorIndices: [],\n inputTensors: this.inputs,\n outputTensors: this.outputs,\n inputMasks: this.inputs.map(x => null),\n outputMasks: this.outputs.map(x => null),\n inputShapes: this.inputs.map(x => x.shape),\n outputShapes: this.outputs.map(x => x.shape)\n });\n this.built = true;\n this._refCount = 1; // The ref count of a container always start at 1.\n }\n assertNotDisposed() {\n if (this._refCount === 0) {\n throw new Error(`Container '${this.name}' is already disposed.`);\n }\n }\n /**\n * Attempt to dispose a LayersModel's weights.\n *\n * This method decrease the reference count of the LayersModel object by 1.\n *\n * A LayersModel is reference-counted. Its reference count is incremented by 1\n * when it is first constructed and when it is used as a Layer of another\n * LayersModel.\n *\n * If the reference count of a LayersModel becomes 0, the `dispose` method of\n * all its constituent `Layer`s will be called.\n *\n * Note: If the reference count is greater than 0 after the decrement, the\n * `dispose` method of its constituent `Layer`s will *not* be called.\n *\n * After a LayersModel is disposed, it cannot be used in calls such as\n * 'predict`, `evaluate` or `fit` anymore.\n *\n * @returns A DisposeResult Object with the following fields:\n * - refCountAfterDispose: The reference count of the LayersModel after this\n * `dispose()` call.\n * - numDisposedVariables: Number of `tf.Variable`s (i.e., weights) disposed\n * during this `dispose()` call.\n * @throws {Error} If the layer is not built yet, or if the LayersModel has\n * already been disposed.\n */\n dispose() {\n this.assertNotDisposed();\n const result = { refCountAfterDispose: null, numDisposedVariables: 0 };\n if (--this._refCount === 0) {\n for (const layer of this.layers) {\n result.numDisposedVariables += layer.dispose().numDisposedVariables;\n }\n // Call dispose on each internally created container layer again to ensure\n // their refCounts hit zero and their tensors are subsequently deleted.\n for (const container of this.internalContainerRefs) {\n result.numDisposedVariables += container.dispose().numDisposedVariables;\n }\n }\n result.refCountAfterDispose = this._refCount;\n return result;\n }\n get trainable() {\n return this.trainable_;\n }\n set trainable(trainable) {\n this.layers.forEach(layer => {\n // tslint:disable-next-line:no-any\n layer._trainableWeights\n .forEach(w => w.trainable = trainable);\n });\n this.trainable_ = trainable;\n }\n get trainableWeights() {\n // Porting Note: This check below is to prevent errors where the\n // _trainableWeights inherited from the parent class (Layer) gets\n // inadvertently used.\n if (this._trainableWeights.length > 0) {\n throw new ValueError('Container instance unexpectedly contains _trainableWeights.' +\n 'The trainable weights of a Container are a union of the ' +\n 'trainable weights of its consituent Layers. Its own ' +\n '_trainableWeights must remain an empty Array.');\n }\n if (!this.trainable) {\n return [];\n }\n let weights = [];\n for (const layer of this.layers) {\n weights = weights.concat(layer.trainableWeights);\n }\n return weights;\n }\n get nonTrainableWeights() {\n const weights = [];\n for (const layer of this.layers) {\n weights.push(...layer.nonTrainableWeights);\n }\n if (!this.trainable) {\n const trainableWeights = [];\n for (const layer of this.layers) {\n trainableWeights.push(...layer.trainableWeights);\n }\n return trainableWeights.concat(weights);\n }\n return weights;\n }\n get weights() {\n return this.trainableWeights.concat(this.nonTrainableWeights);\n }\n /**\n * Loads all layer weights from a JSON object.\n *\n * Porting Note: HDF5 weight files cannot be directly loaded in JavaScript /\n * TypeScript. The utility script at `scripts/pykeras.py` offers means\n * to convert them into JSON strings compatible with this method.\n * Porting Note: TensorFlow.js Layers supports only loading by name currently.\n *\n * @param weights A JSON mapping weight names to weight values as nested\n * arrays of numbers, or a `NamedTensorMap`, i.e., a JSON mapping weight\n * names to `tf.Tensor` objects.\n * @param strict Require that the provided weights exactly match those\n * required by the container. Default: `true`. Passing `false` means that\n * extra weights and missing weights will be silently ignored.\n */\n loadWeights(weights, strict = true) {\n const nameToWeight = {};\n let totalWeightsCount = 0;\n for (const layer of this.layers) {\n for (const weight of layer.weights) {\n if (nameToWeight[weight.originalName] != null) {\n throw new ValueError(`Duplicate weight name: ${weight.originalName}`);\n }\n nameToWeight[weight.originalName] = weight;\n totalWeightsCount++;\n }\n }\n const weightValueTuples = [];\n for (const name in weights) {\n // TF 2.2.0 added cell name to the weight name in the format of\n // layer_name/cell_name/weight_name, we need to remove\n // the inner cell name.\n let validatedName = name;\n if (nameToWeight[name] == null) {\n const tokens = name.split('/');\n const shortenNameArray = tokens.slice(0, -2).concat([tokens[tokens.length - 1]]);\n validatedName = shortenNameArray.join('/');\n }\n if (nameToWeight[validatedName] != null) {\n weightValueTuples.push([nameToWeight[validatedName], weights[name]]);\n }\n else if (strict) {\n throw new ValueError(`Provided weight data has no target variable: ${name}`);\n }\n delete nameToWeight[validatedName];\n }\n if (strict) {\n // Check that all weights are set.\n const unsetNames = [];\n for (const name in nameToWeight) {\n unsetNames.push(name);\n }\n if (unsetNames.length > 0) {\n throw new ValueError(`${unsetNames.length} of ${totalWeightsCount} weights are not set: ` +\n `${unsetNames}`);\n }\n }\n batchSetValue(weightValueTuples);\n }\n /**\n * Util shared between different serialization methods.\n * @returns LayersModel config with Keras version information added.\n */\n updatedConfig() {\n const theConfig = this.getConfig();\n const modelConfig = {};\n modelConfig['className'] = this.getClassName();\n modelConfig['config'] = theConfig;\n modelConfig['kerasVersion'] = `tfjs-layers ${layersVersion}`;\n // TODO(nielsene): Replace something like K.backend() once\n // possible.\n modelConfig['backend'] = 'TensorFlow.js';\n return modelConfig;\n }\n /**\n * Returns a JSON string containing the network configuration.\n *\n * To load a network from a JSON save file, use\n * models.modelFromJSON(jsonString);\n * @param extraJsonArgs Unused in tfjs-layers, maintained for PyKeras\n * @param returnString Whether the return value should be stringified\n * (default: `true`).\n * @returns a JSON string if `returnString` (default), or a JSON object if\n * `!returnString`.\n */\n // tslint:disable-next-line:no-any\n toJSON(unused, returnString = true) {\n const modelConfig = convertTsToPythonic(this.updatedConfig());\n return returnString ? JSON.stringify(modelConfig) : modelConfig;\n }\n /**\n * Call the model on new inputs.\n *\n * In this case `call` just reapplies all ops in the graph to the new inputs\n * (e.g. build a new computational graph from the provided inputs).\n *\n * @param inputs A tensor or list of tensors.\n * @param mask A mask or list of masks. A mask can be either a tensor or null\n * (no mask).\n *\n * @return A tensor if there is a single output, or a list of tensors if there\n * are more than one outputs.\n */\n call(inputs, kwargs) {\n return tidy(() => {\n inputs = generic_utils.toList(inputs);\n const feedDict = new FeedDict();\n for (let i = 0; i < this.inputs.length; ++i) {\n feedDict.add(this.inputs[i], inputs[i]);\n }\n return execute(this.outputs, feedDict, kwargs);\n });\n }\n /**\n * Computes an output mask tensor.\n *\n * @param inputs Tensor or list of tensors.\n * @param mask Tensor or list of tensors.\n *\n * @return null or a tensor (or list of tensors, one per output tensor of the\n * layer).\n */\n computeMask(inputs, mask) {\n return tidy(() => {\n inputs = generic_utils.toList(inputs);\n let masks;\n if (mask == null) {\n masks = generic_utils.pyListRepeat(null, inputs.length);\n }\n else {\n masks = generic_utils.toList(mask);\n }\n // TODO(michaelterry): Add support for mask caching.\n return this.runInternalGraph(inputs, masks)[1];\n });\n }\n /**\n * Computes the output shape of the layer.\n *\n * Assumes that the layer will be built to match that input shape provided.\n *\n * @param inputShape A shape (tuple of integers) or a list of shape tuples\n * (one per output tensor of the layer). Shape tuples can include null for\n * free dimensions, instead of an integer.\n */\n computeOutputShape(inputShape) {\n const inputShapes = types_utils.normalizeShapeList(inputShape);\n if (inputShapes.length !== this.inputLayers.length) {\n throw new ValueError(`Invalid inputShape argument ${inputShape}: ` +\n `model has ${this.inputLayers.length} tensor inputs.`);\n }\n // TODO(michaelterry): Add caching\n const layersToOutputShapes = {};\n for (let i = 0; i < inputShapes.length; i++) {\n const layer = this.inputLayers[i];\n const inputShape = inputShapes[i];\n // It's an input layer: computeOutputShape is identity,\n // and there is only one node and one tensor output.\n const shapeKey = layer.name + '_0_0';\n layersToOutputShapes[shapeKey] = inputShape;\n }\n const depthKeys = Object.keys(this.nodesByDepth)\n .map(x => parseInt(x, 10))\n .sort(generic_utils.reverseNumberCompare);\n // Iterate over nodes, by depth level.\n if (depthKeys.length > 1) {\n for (const depth of depthKeys) {\n const nodes = this.nodesByDepth[depth];\n for (const node of nodes) {\n // This is always a single layer, never a list.\n const layer = node.outboundLayer;\n if (this.inputLayers.map(x => x.id).indexOf(layer.id) !== -1) {\n // We've already covered the input layers a few lines above.\n continue;\n }\n // Potentially redundant list, same size of node.inputTensors.\n const inputShapes = [];\n for (let j = 0; j < node.inboundLayers.length; j++) {\n const inboundLayer = node.inboundLayers[j];\n const nodeIndex = node.nodeIndices[j];\n const tensorIndex = node.tensorIndices[j];\n const shapeKey = `${inboundLayer.name}_${nodeIndex}_${tensorIndex}`;\n const inputShape = layersToOutputShapes[shapeKey];\n inputShapes.push(inputShape);\n }\n const outputShape = layer.computeOutputShape(generic_utils.singletonOrArray(inputShapes));\n const outputShapes = types_utils.normalizeShapeList(outputShape);\n const nodeIndex = layer.inboundNodes.indexOf(node);\n for (let j = 0; j < outputShapes.length; j++) {\n const shapeKey = `${layer.name}_${nodeIndex}_${j}`;\n layersToOutputShapes[shapeKey] = outputShapes[j];\n }\n }\n }\n }\n // Read final output shapes from layersToOutputShapes.\n const outputShapes = [];\n const outputShapeKeys = [];\n for (let i = 0; i < this.outputLayers.length; i++) {\n const layer = this.outputLayers[i];\n const nodeIndex = this.outputLayersNodeIndices[i];\n const tensorIndex = this.outputLayersTensorIndices[i];\n const shapeKey = `${layer.name}_${nodeIndex}_${tensorIndex}`;\n outputShapeKeys.push(shapeKey);\n }\n for (let i = 0; i < outputShapeKeys.length; i++) {\n const key = outputShapeKeys[i];\n generic_utils.assert(key in layersToOutputShapes);\n outputShapes.push(layersToOutputShapes[key]);\n }\n // TODO(michaelterry): Update cache\n return generic_utils.singletonOrArray(outputShapes);\n }\n /**\n * Computes output tensors for new inputs.\n *\n * Note:\n * - Expects `inputs` to be a list (potentially with 1 element).\n *\n * @param inputs List of tensors\n * @param masks List of masks (tensors or null).\n * @return Three lists: outputTensors, outputMasks, outputShapes\n */\n runInternalGraph(inputs, masks) {\n if (masks == null) {\n masks = generic_utils.pyListRepeat(null, inputs.length);\n }\n // Dictionary mapping reference tensors to tuples\n // (computed tensor, compute mask)\n // we assume a 1:1 mapping from tensor to mask\n // TODO: raise exception when a `.computeMask()` call\n // does not return a list the same size as `call`\n const tensorMap = {};\n for (let i = 0; i < this.inputs.length; ++i) {\n const x = this.inputs[i];\n const y = inputs[i];\n const mask = masks[i];\n tensorMap[x.id] = [y, mask];\n }\n const depthKeys = Object.keys(this.nodesByDepth)\n .map(x => parseInt(x, 10))\n .sort(generic_utils.reverseNumberCompare);\n for (const depth of depthKeys) {\n const nodes = this.nodesByDepth[depth];\n for (const node of nodes) {\n // This is always a single layer, never a list.\n const layer = node.outboundLayer;\n const referenceInputTensors = node.inputTensors;\n const referenceOutputTensors = node.outputTensors;\n // If all previous input tensors are available in tensorMap,\n // then call node.inboundLayer on them.\n // List of tuples [input, mask]:\n const computedData = new Array();\n for (const x of referenceInputTensors) {\n if (x.id in tensorMap) {\n computedData.push(tensorMap[x.id]);\n }\n }\n if (computedData.length === referenceInputTensors.length) {\n // TODO(michaelterry): Add K.name_scope here, if we need it.\n let kwargs = {};\n let computedTensors;\n let computedMasks;\n let outputTensors;\n let outputMasks;\n // call layer\n if (node.callArgs != null) {\n kwargs = node.callArgs;\n }\n if (computedData.length === 1) {\n const [computedTensor, computedMask] = computedData[0];\n if (kwargs['mask'] == null) {\n kwargs['mask'] = computedMask;\n }\n outputTensors =\n generic_utils.toList(layer.call(computedTensor, kwargs));\n outputMasks = generic_utils.toList(layer.computeMask(computedTensor, computedMask));\n computedTensors = [computedTensor];\n computedMasks = [computedMask];\n }\n else {\n computedTensors = computedData.map(x => x[0]);\n computedMasks = computedData.map(x => x[1]);\n if (kwargs['mask'] == null) {\n kwargs['mask'] = computedMasks;\n }\n outputTensors =\n generic_utils.toList(layer.call(computedTensors, kwargs));\n outputMasks = generic_utils.toList(layer.computeMask(computedTensors, computedMasks));\n }\n if (layer.activityRegularizer) {\n throw new NotImplementedError('LayersModel invocation with concrete Tensor value(s) in the ' +\n 'presence of activity regularizer(s) is not supported yet.');\n }\n // TODO(michaelterry): Add model updates and losses\n // Update tensor map.\n for (let i = 0; i < referenceOutputTensors.length; ++i) {\n const x = referenceOutputTensors[i];\n const y = outputTensors[i];\n const mask = outputMasks[i];\n tensorMap[x.id] = [y, mask];\n }\n }\n }\n }\n const outputTensors = [];\n const outputMasks = [];\n const outputShapes = [];\n for (const x of this.outputs) {\n generic_utils.assert(x.id in tensorMap, `Could not compute output ${x.name} : ${x.id}`);\n const [tensor, mask] = tensorMap[x.id];\n outputShapes.push(tensor.shape);\n outputTensors.push(tensor);\n outputMasks.push(mask);\n }\n // TODO(michaelterry): Add support for caches.\n return [outputTensors, outputMasks, outputShapes];\n }\n /**\n * Builds a map of internal node keys to node ordering.\n * Used in serializaion a node orderings may change as unused nodes are\n * dropped. Porting Note: This helper method was pulled out of getConfig to\n * improve readability.\n * @param layers An array of Layers in the model.\n * @returns Map of Node Keys to index order within the layer.\n */\n buildNodeConversionMap(layers) {\n const nodeConversionMap = {};\n let keptNodes;\n for (const layer of this.layers) {\n keptNodes = layer instanceof Container ? 1 : 0;\n for (let originalNodeIndex = 0; originalNodeIndex < layer.inboundNodes.length; originalNodeIndex++) {\n const nodeKey = Container.nodeKey(layer, originalNodeIndex);\n if (this.containerNodes.has(nodeKey)) {\n // i.e. we mark it to be saved\n nodeConversionMap[nodeKey] = keptNodes;\n keptNodes += 1;\n }\n }\n }\n return nodeConversionMap;\n }\n /**\n * Retrieves a layer based on either its name (unique) or index.\n *\n * Indices are based on order of horizontal graph traversal (bottom-up).\n *\n * If both `name` and `index` are specified, `index` takes precedence.\n *\n * @param name Name of layer.\n * @param index Index of layer.\n * @returns A Layer instance.\n * @throws ValueError: In case of invalid layer name or index.\n *\n * @doc {\n * heading: 'Layers',\n * subheading: 'Classes',\n * namespace: 'layers',\n * subclasses: ['LayersModel']\n * }\n */\n getLayer(name, index) {\n if (index != null) {\n if (this.layers.length <= index) {\n throw new ValueError(`Was asked to retrieve layer at index ${index}, but model only ` +\n `has ${this.layers.length} layer(s).`);\n }\n else {\n return this.layers[index];\n }\n }\n else {\n if (name == null) {\n throw new ValueError('Provide either a layer name or layer index');\n }\n }\n for (const layer of this.layers) {\n if (layer.name === name) {\n return layer;\n }\n }\n throw new ValueError(`No such layer: ${name}`);\n }\n /**\n * Retrieves the Container's current loss values.\n *\n * Used for regularizers during training.\n */\n calculateLosses() {\n // Porting Node: This is an augmentation to Container.loss in PyKeras.\n // In PyKeras, Container.loss returns symbolic tensors. Here a concrete\n // Tensor (specifically Scalar) values are returned. This is due to the\n // imperative backend.\n return tidy(() => {\n const losses = [];\n for (const layer of this.layers) {\n for (let nodeIndex = 0; nodeIndex < layer.inboundNodes.length; ++nodeIndex) {\n const nodeKey = Container.nodeKey(layer, nodeIndex);\n if (this.containerNodes.has(nodeKey)) {\n losses.push(...layer.calculateLosses());\n }\n }\n }\n // TODO(cais): Add any unconditional model-level losses?\n return losses;\n });\n }\n getConfig() {\n const config = { name: this.name };\n // Build a map from layer unique name (self._node_key)\n // to the index of the nodes that are saved in the config.\n // Only nodes in container_nodes are saved.\n const nodeConversionMap = this.buildNodeConversionMap(this.layers);\n // Serialize and save the layers in layerConfigs\n const layerConfigs = [];\n for (const layer of this.layers) {\n const layerClassName = layer.getClassName();\n const layerConfig = layer.getConfig();\n const filteredInboundNodes = [];\n for (let originalNodeIndex = 0; originalNodeIndex < layer.inboundNodes.length; originalNodeIndex++) {\n const node = layer.inboundNodes[originalNodeIndex];\n const nodeKey = Container.nodeKey(layer, originalNodeIndex);\n let kwargs = {};\n if (this.containerNodes.has(nodeKey)) {\n // The node is relevant to the model:\n // add to filteredInboundNodes.\n if (node.callArgs) {\n try {\n JSON.stringify(node.callArgs);\n kwargs = node.callArgs;\n }\n catch (err) {\n console.warn(`Layer ${layer.name} was passed ` +\n `non-serializable keyword arguments: ` +\n `${node.callArgs}. They will not be included ` +\n `in the serialized model (and thus will be ` +\n `missing at deserialization time).`);\n kwargs = {};\n }\n }\n if (node.inboundLayers.length > 0) {\n const nodeData = [];\n for (let i = 0; i < node.inboundLayers.length; i++) {\n const inboundLayer = node.inboundLayers[i];\n const nodeIndex = node.nodeIndices[i];\n const tensorIndex = node.tensorIndices[i];\n const nodeKey = Container.nodeKey(inboundLayer, nodeIndex);\n let newNodeIndex = nodeConversionMap[nodeKey];\n if (newNodeIndex == null) {\n newNodeIndex = 0;\n }\n nodeData.push([inboundLayer.name, newNodeIndex, tensorIndex, kwargs]);\n }\n filteredInboundNodes.push(nodeData);\n }\n }\n }\n const dict = {};\n dict['name'] = layer.name;\n dict['className'] = layerClassName;\n dict['config'] = layerConfig;\n dict['inboundNodes'] = filteredInboundNodes;\n layerConfigs.push(dict);\n }\n config['layers'] = layerConfigs;\n // Gather info about inputs and outputs\n const modelInputs = [];\n for (let i = 0; i < this.inputLayers.length; i++) {\n const layer = this.inputLayers[i];\n const nodeIndex = this.inputLayersNodeIndices[i];\n const nodeKey = Container.nodeKey(layer, nodeIndex);\n if (!this.containerNodes.has(nodeKey)) {\n continue;\n }\n let newNodeIndex = nodeConversionMap[nodeKey];\n if (newNodeIndex === null || newNodeIndex === undefined) {\n newNodeIndex = 0;\n }\n const tensorIndex = this.inputLayersTensorIndices[i];\n modelInputs.push([layer.name, newNodeIndex, tensorIndex]);\n }\n config['inputLayers'] = modelInputs;\n const modelOutputs = [];\n for (let i = 0; i < this.outputLayers.length; i++) {\n const layer = this.outputLayers[i];\n const nodeIndex = this.outputLayersNodeIndices[i];\n const nodeKey = Container.nodeKey(layer, nodeIndex);\n if (!this.containerNodes.has(nodeKey)) {\n continue;\n }\n let newNodeIndex = nodeConversionMap[nodeKey];\n if (newNodeIndex === null || newNodeIndex === undefined) {\n newNodeIndex = 0;\n }\n const tensorIndex = this.outputLayersTensorIndices[i];\n modelOutputs.push([layer.name, newNodeIndex, tensorIndex]);\n }\n config['outputLayers'] = modelOutputs;\n return config;\n }\n /**\n * Instantiates a LayersModel from its config (output of `get_config()`).\n * @param cls the class to create\n * @param config LayersModel config dictionary.\n * @param customObjects An optional dictionary of custom objects.\n * @param fastWeightInit Optional flag to use fast weight initialization\n * during deserialization. This is applicable to cases in which\n * the initialization will be immediately overwritten by loaded weight\n * values. Default: `false`.\n * @returns A LayersModel instance.\n * @throws ValueError: In case of improperly formatted config dict.\n */\n /** @nocollapse */\n static fromConfig(cls, config, customObjects = {}, fastWeightInit = false) {\n // Layer instances created during\n // the graph reconstruction process\n const createdLayers = {};\n // Dictionary mapping layer instances to\n // node data that specifies a layer call.\n // It acts as a queue that maintains any unprocessed\n // layer call until it becomes possible to process it\n // (i.e. until the input tensors to the call all exist).\n const unprocessedNodes = {};\n function addUnprocessedNode(layer, nodeData) {\n if (!(layer.name in unprocessedNodes)) {\n unprocessedNodes[layer.name] = [nodeData];\n }\n else {\n unprocessedNodes[layer.name].push(nodeData);\n }\n }\n function processNode(layer, nodeData) {\n const inputTensors = [];\n let kwargs;\n for (const inputData of nodeData) {\n const inboundLayerName = inputData[0];\n const inboundNodeIndex = inputData[1];\n const inboundTensorIndex = inputData[2];\n kwargs = inputData[3] == null ?\n {} :\n inputData[3];\n if (!(inboundLayerName in createdLayers)) {\n addUnprocessedNode(layer, nodeData);\n return;\n }\n const inboundLayer = createdLayers[inboundLayerName];\n if (inboundLayer.inboundNodes.length <= inboundNodeIndex) {\n addUnprocessedNode(layer, nodeData);\n return;\n }\n const inboundNode = inboundLayer.inboundNodes[inboundNodeIndex];\n inputTensors.push(inboundNode.outputTensors[inboundTensorIndex]);\n }\n // Call layer on its inputs, thus creating the node\n // and building the layer if needed.\n // Note: This has Eager vs Graph Implications.\n if (inputTensors.length > 0) {\n layer.apply(generic_utils.singletonOrArray(inputTensors), kwargs); // was ** kwargs\n }\n }\n /**\n * Deserialize a layer, then call it on appropriate inputs.\n * @param layerData: layer config dict.\n * @throws ValueError: In case of improperly formatted `layer_data`\n * dict.\n */\n function processLayer(layerData) {\n const layerName = layerData['name'];\n // Instantiate layer.\n const layer = deserializeLayer(layerData, config['customObjects'] != null ?\n config['customObjects'] :\n {});\n layer.setFastWeightInitDuringBuild(fastWeightInit);\n createdLayers[layerName] = layer;\n // Gather layer inputs.\n const inboundNodesData = layerData['inboundNodes'];\n inboundNodesData.forEach(nodeData => {\n if (!(nodeData instanceof Array)) {\n throw new ValueError(`Corrupted configuration, expected array for nodeData: ${nodeData}`);\n }\n // We don't process nodes (i.e. make layer calls)\n // on the fly because the inbound node may not yet exist,\n // in case of layer shared at different topological depths\n // (e.g.a model such as A(B(A(B(x)))))\n addUnprocessedNode(layer, nodeData);\n });\n }\n // First, we create all layers and enqueue nodes to be processed.\n const name = config['name'];\n const layersFromConfig = config['layers'];\n for (const layerData of layersFromConfig) {\n processLayer(layerData);\n }\n // Then we process nodes in order of layer depth.\n // Nodes that cannot yet be processed(if the inbound node\n // does not yet exist) are re - enqueued, and the process\n // is repeated until all nodes are processed.\n while (!generic_utils.isObjectEmpty(unprocessedNodes)) {\n for (const layerData of layersFromConfig) {\n const layer = createdLayers[layerData['name']];\n if (layer.name in unprocessedNodes) {\n const currentUnprocessedNodesForLayer = unprocessedNodes[layer.name];\n delete unprocessedNodes[layer.name];\n for (const nodeData of currentUnprocessedNodesForLayer) {\n processNode(layer, nodeData);\n }\n }\n }\n }\n const inputTensors = [];\n const outputTensors = [];\n const inputLayersFromConfig = config['inputLayers'];\n for (const layerData of inputLayersFromConfig) {\n const layerName = layerData[0];\n const nodeIndex = layerData[1];\n const tensorIndex = layerData[2];\n generic_utils.assert(layerName in createdLayers);\n const layer = createdLayers[layerName];\n const layerOutputTensors = layer.inboundNodes[nodeIndex].outputTensors;\n inputTensors.push(layerOutputTensors[tensorIndex]);\n }\n const outputLayersFromConfig = config['outputLayers'];\n for (const layerData of outputLayersFromConfig) {\n const layerName = layerData[0];\n const nodeIndex = layerData[1];\n const tensorIndex = layerData[2];\n generic_utils.assert(layerName in createdLayers);\n const layer = createdLayers[layerName];\n const layerOutputTensors = layer.inboundNodes[nodeIndex].outputTensors;\n outputTensors.push(layerOutputTensors[tensorIndex]);\n }\n return new cls({ inputs: inputTensors, outputs: outputTensors, name });\n }\n /**\n * Determine whether the container is stateful.\n *\n * Porting Note: this is the equivalent of the stateful @property of\n * the Container class in PyKeras.\n */\n get stateful() {\n // Porting Note: This check is to prevent inadvertent setting of the\n // _stateful property of the Container instance.\n if (this._stateful) {\n throw new ValueError('Container instance unexpectedly has _stateful = true. The ' +\n 'statefulness of a Container is determined by the Layers it ' +\n 'contains. Its _stateful property must remain the default false.');\n }\n for (const layer of this.layers) {\n if (layer.stateful) {\n return true;\n }\n }\n return false;\n }\n /**\n * Reset the state of all stateful constituent layers (if any).\n *\n * Examples of stateful layers include RNN layers whose `stateful` property\n * is set as `true`.\n */\n resetStates() {\n tidy(() => {\n this.layers.forEach(layer => {\n // tslint:disable:no-any\n if (layer.stateful) {\n layer.resetStates();\n }\n // tslint:enable:no-any\n });\n });\n }\n}\n//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY29udGFpbmVyLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vLi4vdGZqcy1sYXllcnMvc3JjL2VuZ2luZS9jb250YWluZXIudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUE7Ozs7Ozs7O0dBUUc7QUFFSCwrQ0FBK0M7QUFFL0MsT0FBTyxFQUFnRCxJQUFJLEVBQUMsTUFBTSx1QkFBdUIsQ0FBQztBQUUxRixPQUFPLEVBQUMsTUFBTSxFQUFDLE1BQU0sa0JBQWtCLENBQUM7QUFDeEMsT0FBTyxFQUFDLG1CQUFtQixFQUFFLFlBQVksRUFBRSxVQUFVLEVBQUMsTUFBTSxXQUFXLENBQUM7QUFJeEUsT0FBTyxFQUFDLFdBQVcsSUFBSSxnQkFBZ0IsRUFBQyxNQUFNLHlCQUF5QixDQUFDO0FBRXhFLE9BQU8sS0FBSyxhQUFhLE1BQU0sd0JBQXdCLENBQUM7QUFDeEQsT0FBTyxFQUFDLG1CQUFtQixFQUFDLE1BQU0sOEJBQThCLENBQUM7QUFDakUsT0FBTyxLQUFLLFdBQVcsTUFBTSxzQkFBc0IsQ0FBQztBQUNwRCxPQUFPLEVBQUMsYUFBYSxFQUFnQixNQUFNLGNBQWMsQ0FBQztBQUMxRCxPQUFPLEVBQUMsT0FBTyxJQUFJLGFBQWEsRUFBQyxNQUFNLFlBQVksQ0FBQztBQUVwRCxPQUFPLEVBQUMsT0FBTyxFQUFFLFFBQVEsRUFBQyxNQUFNLFlBQVksQ0FBQztBQUM3QyxPQUFPLEVBQUMsVUFBVSxFQUFDLE1BQU0sZUFBZSxDQUFDO0FBQ3pDLE9BQU8sRUFBZ0IsS0FBSyxFQUFFLElBQUksRUFBaUIsTUFBTSxZQUFZLENBQUM7QUFTdEU7Ozs7OztHQU1HO0FBQ0gsTUFBTSxPQUFnQixTQUFVLFNBQVEsS0FBSztJQW9DM0MsWUFBWSxJQUFtQjtRQUM3Qix5Q0FBeUM7UUFDekMsS0FBSyxDQUFDLEVBQUUsQ0FBQyxDQUFDO1FBcEJaLG1CQUFjLEdBQUcsSUFBSSxHQUFHLEVBQVUsQ0FBQztRQXFCakMsSUFBSSxDQUFDLElB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Z2xlIExMQ1xuICpcbiAqIFVzZSBvZiB0aGlzIHNvdXJjZSBjb2RlIGlzIGdvdmVybmVkIGJ5IGFuIE1JVC1zdHlsZVxuICogbGljZW5zZSB0aGF0IGNhbiBiZSBmb3VuZCBpbiB0aGUgTElDRU5TRSBmaWxlIG9yIGF0XG4gKiBodHRwczovL29wZW5zb3VyY2Uub3JnL2xpY2Vuc2VzL01JVC5cbiAqID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4gKi9cblxuLyogT3JpZ2luYWwgc291cmNlOiBrZXJhcy9lbmdpbmUvdG9wb2xvZ3kucHkgKi9cblxuaW1wb3J0IHtOYW1lZFRlbnNvck1hcCwgU2NhbGFyLCBzZXJpYWxpemF0aW9uLCBUZW5zb3IsIHRpZHl9IGZyb20gJ0B0ZW5zb3JmbG93L3RmanMtY29yZSc7XG5cbmltcG9ydCB7Z2V0VWlkfSBmcm9tICcuLi9iYWNrZW5kL3N0YXRlJztcbmltcG9ydCB7Tm90SW1wbGVtZW50ZWRFcnJvciwgUnVudGltZUVycm9yLCBWYWx1ZUVycm9yfSBmcm9tICcuLi9lcnJvcnMnO1xuaW1wb3J0IHtTaGFwZX0gZnJvbSAnLi4va2VyYXNfZm9ybWF0L2NvbW1vbic7XG5pbXBvcnQge1RlbnNvcktleVdpdGhBcmdzQXJyYXl9IGZyb20gJy4uL2tlcmFzX2Zvcm1hdC9ub2RlX2NvbmZpZyc7XG5pbXBvcnQge1B5SnNvbkRpY3R9IGZyb20gJy4uL2tlcmFzX2Zvcm1hdC90eXBlcyc7XG5pbXBvcnQge2Rlc2VyaWFsaXplIGFzIGRlc2VyaWFsaXplTGF5ZXJ9IGZyb20gJy4uL2xheWVycy9zZXJpYWxpemF0aW9uJztcbmltcG9ydCB7S3dhcmdzfSBmcm9tICcuLi90eXBlcyc7XG5pbXBvcnQgKiBhcyBnZW5lcmljX3V0aWxzIGZyb20gJy4uL3V0aWxzL2dlbmVyaWNfdXRpbHMnO1xuaW1wb3J0IHtjb252ZXJ0VHNUb1B5dGhvbmljfSBmcm9tICcuLi91dGlscy9zZXJpYWxpemF0aW9uX3V0aWxzJztcbmltcG9ydCAqIGFzIHR5cGVzX3V0aWxzIGZyb20gJy4uL3V0aWxzL3R5cGVzX3V0aWxzJztcbmltcG9ydCB7YmF0Y2hTZXRWYWx1ZSwgTGF5ZXJWYXJpYWJsZX0gZnJvbSAnLi4vdmFyaWFibGVzJztcbmltcG9ydCB7dmVyc2lvbiBhcyBsYXllcnNWZXJzaW9ufSBmcm9tICcuLi92ZXJzaW9uJztcblxuaW1wb3J0IHtleGVjdXRlLCBGZWVkRGljdH0gZnJvbSAnLi9leGVjdXRvcic7XG5pbXBvcnQge0lucHV0TGF5ZXJ9IGZyb20gJy4vaW5wdXRfbGF5ZXInO1xuaW1wb3J0IHtEaXNwb3NlUmVzdWx0LCBMYXllciwgTm9kZSwgU3ltYm9saWNUZW5zb3J9IGZyb20gJy4vdG9wb2xvZ3knO1xuXG4vKiogQ29uc3RydWN0b3IgY29uZmlnIGZvciBDb250YWluZXIuICovXG5leHBvcnQgaW50ZXJmYWNlIENvbnRhaW5lckFyZ3Mge1xuICBpbnB1dHM6IFN5bWJvbGljVGVuc29yfFN5bWJvbGljVGVuc29yW107XG4gIG91dHB1dHM6IFN5bWJvbGljVGVuc29yfFN5bWJvbGljVGVuc29yW107XG4gIG5hbWU/OiBzdHJpbmc7XG59XG5cbi8qKlxuICogQSBDb250YWluZXIgaXMgYSBkaXJlY3RlZCBhY3ljbGljIGdyYXBoIG9mIGxheWVycy5cbiAqXG4gKiBJdCBpcyB0aGUgdG9wb2xvZ2ljYWwgZm9ybSBvZiBhIFwibW9kZWxcIi4gQSBMYXllcnNNb2RlbFxuICogaXMgc2ltcGx5IGEgQ29udGFpbmVyIHdpdGggYWRkZWQgdHJhaW5pbmcgcm91dGluZXMuXG4gKlxuICovXG5leHBvcnQgYWJzdHJhY3QgY2xhc3MgQ29udGFpbmVyIGV4dGVuZHMgTGF5ZXIge1xuICBpbnB1dHM6IFN5bWJvbGljVGVuc29yW107XG4gIG91dHB1dHM6IFN5bWJvbGljVGVuc29yW107XG5cbiAgaW5wdXRMYXllcnM6IExheWVyW107XG4gIGlucHV0TGF5ZXJzTm9kZUluZGljZXM6IG51bWJlcltdO1xuICBpbnB1dExheWVyc1RlbnNvckluZGljZXM6IG51bWJlcltdO1xuXG4gIG91dHB1dExheWVyczogTGF5ZXJbXTtcbiAgb3V0cHV0TGF5ZXJzTm9kZUluZGljZXM6IG51bWJlcltdO1xuICBvdXRwdXRMYXllcnNUZW5zb3JJbmRpY2VzOiBudW1iZXJbXTtcblxuICBsYXllcnM6IExheWVyW107XG4gIGxheWVyc0J5RGVwdGg6IHtbZGVwdGg6IHN0cmluZ106IExheWVyW119O1xuICBub2Rlc0J5RGVwdGg6IHtbZGVwdGg6IHN0cmluZ106IE5vZGVbXX07XG5cbiAgaW50ZXJuYWxDb250YWluZXJSZWZzOiBDb250YWluZXJbXTtcblxuICBjb250YWluZXJOb2RlcyA9IG5ldyBTZXQ8c3RyaW5nPigpO1xuXG4gIC8vIFRPRE8obWljaGFlbHRlcnJ5KTogQWRkIGNhY2hlIHN1cHBvcnRcbiAgLy8gcHJpdmF0ZSBvdXRwdXRNYXNrQ2FjaGU6IGFueTtcbiAgLy8gcHJpdmF0ZSBvdXRwdXRUZW5zb3JDYWNoZTogYW55O1xuICAvLyBwcml2YXRlIG91dHB1dFNoYXBlQ2FjaGU6IGFueTtcblxuICBpbnB1dE5hbWVzOiBzdHJpbmdbXTtcbiAgb3V0cHV0TmFtZXM6IHN0cmluZ1tdO1xuICBmZWVkSW5wdXRTaGFwZXM6IFNoYXBlW107XG5cbiAgcHJvdGVjdGVkIGludGVybmFsSW5wdXRTaGFwZXM6IFNoYXBlW107XG4gIHByb3RlY3RlZCBpbnRlcm5hbE91dHB1dFNoYXBlczogU2hhcGVbXTtcbiAgLy8gVE9ETyhjYWlzKTogTWF5YmUgJ2ZlZWQnIHNob3VsZCBub3QgaW4gdGhlIG5hbWVzIG9mIHRoZXNlIHZhcmlhYmxlcyxcbiAgLy8gICBkdWUgdG8gdGhlIGZhY3QgdGhhdCBvdXIgYmFja2VuZCBpcyBub3Qgc3ltYm9saWMuXG4gIHByb3RlY3RlZCBmZWVkSW5wdXROYW1lczogc3RyaW5nW107XG4gIHByb3RlY3RlZCBmZWVkT3V0cHV0TmFtZXM6IHN0cmluZ1tdO1xuXG4gIGNvbnN0cnVjdG9yKGFyZ3M6IENvbnRhaW5lckFyZ3MpIHtcbiAgICAvLyBObyBhcmdzIHBhc3NlZCB0byBzdXBlcidzIGNvbnN0cnVjdG9yLlxuICAgIHN1cGVyKHt9KTtcbiAgICB0aGlzLm5hbWUgPSBhcmdzLm5hbWU7XG4gICAgaWYgKHRoaXMubmFtZSA9PSBudWxsKSB7XG4gICAgICBjb25zdCBwcmVmaXggPSB0aGlzLmdldENsYXNzTmFtZSgpLnRvTG93ZXJDYXNlKCk7XG4gICAgICB0aGlzLm5hbWUgPSBnZXRVaWQocHJlZml4KTtcbiAgICB9XG5cbiAgICB0aGlzLnN1cHBvcnRzTWFza2luZyA9IGZhbHNlO1xuICAgIHRoaXMudHJhaW5hYmxlXyA9IHRydWU7XG5cbiAgICAvLyBUT0RPKG1pY2hhZWx0ZXJyeSk6IEluaXRpYWxpemUgcGVySW5wdXRMb3NzZXMvVXBkYXRlcyBoZXJlLlxuXG4gICAgLy8gQ29udGFpbmVyLXNwZWNpZmljIHByb3BlcnRpZXMuXG4gICAgaWYgKEFycmF5LmlzQXJyYXkoYXJncy5pbnB1dHMpKSB7XG4gICAgICB0aGlzLmlucHV0cyA9IGFyZ3MuaW5wdXRzLnNsaWNlKCk7XG4gICAgfSBlbHNlIHtcbiAgICAgIHRoaXMuaW5wdXRzID0gW2FyZ3MuaW5wdXRzXTtcbiAgICB9XG4gICAgaWYgKEFycmF5LmlzQXJyYXkoYXJncy5vdXRwdXRzKSkge1xuICAgICAgdGhpcy5vdXRwdXRzID0gYXJncy5vdXRwdXRzLnNsaWNlKCk7XG4gICAgfSBlbHNlIHtcbiAgICAgIHRoaXMub3V0cHV0cyA9IFthcmdzLm91dHB1dHNdO1xuICAgIH1cblxuICAgIC8vIENoZWNrIGZvciByZWR1bmRhbmN5IGluIGlucHV0cy5cbiAgICBpZiAoZ2VuZXJpY191dGlscy51bmlxdWUodGhpcy5pbnB1dHMpLmxlbmd0aCAhPT0gdGhpcy5pbnB1dHMubGVuZ3RoKSB7XG4gICAgICB0aHJvdyBuZXcgVmFsdWVFcnJvcihcbiAgICAgICAgICAnVGhlIGxpc3Qgb2YgaW5wdXRzIHBhc3NlZCB0byB0aGUgbW9kZWwgaXMgJyArXG4gICAgICAgICAgJ3JlZHVuZGFudC4gQWxsIGlucHV0cyBzaG91bGQgb25seSBhcHBlYXIgb25jZS4gRm91bmQ6ICcgK1xuICAgICAgICAgIGAke3RoaXMuaW5wdXRzLm1hcCh4ID0+IHgubmFtZSl9YCk7XG4gICAgfVxuXG4gICAgLy8gQ2hlY2sgZm9yIHJlZHVuZGFuY3kgaW4gb3V0cHV0cy5cbiAgICBpZiAoZ2VuZXJpY191dGlscy51bmlxdWUodGhpcy5vdXRwdXRzKS5sZW5ndGggIT09IHRoaXMub3V0cHV0cy5sZW5ndGgpIHtcbiAgICAgIGNvbnNvbGUud2FybihcbiAgICAgICAgICAnVGhlIGxpc3Qgb2Ygb3V0cHV0cyBwYXNzZWQgdG8gdGhlIG1vZGVsIGlzIHJlZHVuZGFudC4gJyArXG4gICAgICAgICAgJ0FsbCBvdXRwdXRzIHNob3VsZCBvbmx5IGFwcGVhciBvbmNlLiBGb3VuZDogJyArXG4gICAgICAgICAgYCR7dGhpcy5vdXRwdXRzLm1hcCh4ID0+IHgubmFtZSl9YCk7XG4gICAgfVxuXG4gICAgLypcbiAgICAgIExpc3Qgb2YgaW5pdGlhbCBsYXllcnMgKDEgdG8gMSBtYXBwaW5nIHdpdGggdGhpcy5pbnB1dHMsIGhlbmNlIHRoZSBzYW1lXG4gICAgICBsYXllciBtaWdodCBhcHBlYXIgdHdpY2UpXG4gICAgKi9cbiAgICB0aGlzLmlucHV0TGF5ZXJzID0gW107XG4gICAgdGhpcy5pbnB1dExheWVyc05vZGVJbmRpY2VzID0gW107XG4gICAgdGhpcy5pbnB1dExheWVyc1RlbnNvckluZGljZXMgPSBbXTtcbiAgICAvKlxuICAgICAgTGlzdCBvZiBsYXllcnMgKDEgdG8gMSBtYXBwaW5nIHdpdGggdGhpcy5vdXRwdXRzLCBoZW5jZSB0aGUgc2FtZSBsYXllclxuICAgICAgbWlnaHQgYXBwZWFyIHR3aWNlKVxuICAgICovXG4gICAgdGhpcy5vdXRwdXRMYXllcnMgPSBbXTtcbiAgICB0aGlzLm91dHB1dExheWVyc05vZGVJbmRpY2VzID0gW107XG4gICAgdGhpcy5vdXRwdXRMYXllcnNUZW5zb3JJbmRpY2VzID0gW107XG4gICAgLypcbiAgICAgIEFsbCBsYXllcnMgaW4gb3JkZXIgb2YgaG9yaXpvbnRhbCBncmFwaCB0cmF2ZXJzYWwuIEVudHJpZXMgYXJlIHVuaXF1ZS5cbiAgICAgIEluY2x1ZGVzIGlucHV0IGFuZCBvdXRwdXQgbGF5ZXJzLlxuICAgICovXG4gICAgdGhpcy5sYXllcnMgPSBbXTtcblxuICAgIC8qXG4gICAgICBSZWZlcmVuY2VzIHRvIGNvbnRhaW5lciBsYXllcnMgdGhhdCB3ZXJlIGNvbnN0cnVjdGVkIGludGVybmFsbHkuIFdlIG5lZWRcbiAgICAgIHRoZXNlIHRvIHByb3Blcmx5IGRpc3Bvc2Ugb2YgdGVuc29ycyBmcm9tIG5lc3RlZCBjb250YWluZXJzLlxuICAgICovXG4gICAgdGhpcy5pbnRlcm5hbENvbnRhaW5lclJlZnMgPSBbXTtcblxuICAgIC8vIFRPRE8obWljaGFlbHRlcnJ5KTogRGV0ZXJtaW5lIGlmIGNhY2hpbmcgc3RpbGwgbmVlZGVkIHdpdGggZWFnZXJcbiAgICAvLyBiYWNrZW5kLlxuICAgIC8qXG4gICAgICBUaGlzIGlzIGZvciBwZXJmb3JtYW5jZSBvcHRpbWl6YXRpb24gd2hlbiBjYWxsaW5nIHRoZSBDb250YWluZXIgb24gbmV3XG4gICAgICBpbnB1dHMuIEV2ZXJ5IHRpbWUgdGhlIENvbnRhaW5lciBpcyBjYWxsZWQgb24gYSBzZXQgb24gaW5wdXQgdGVuc29ycyxcbiAgICAgIHdlIGNvbXB1dGUgdGhlIG91dHB1dCB0ZW5zb3JzLCBvdXRwdXQgbWFza3MgYW5kIG91dHB1dCBzaGFwZXMgaW4gb25lIHBhc3MsXG4gICAgICB0aGVuIGNhY2hlIHRoZW0gaGVyZS4gV2hlbiBvbmUgb2YgdGhlc2Ugb3V0cHV0cyBpcyBxdWVyaWVkIGxhdGVyLFxuICAgICAgd2UgcmV0cmlldmUgaXQgZnJvbSB0aGVyZSBpbnN0ZWFkIG9mIHJlY29tcHV0aW5nIGl0LlxuICAgICovXG4gICAgLy8gdGhpcy5vdXRwdXRUZW5zb3JDYWNoZSA9IHt9O1xuICAgIC8vIHRoaXMub3V0cHV0U2hhcGVDYWNoZSA9IHt9O1xuXG4gICAgLy8gQnVpbGQgdGhpcy5vdXRwdXRMYXllcnM6XG4gICAgZm9yIChjb25zdCB4IG9mIHRoaXMub3V0cHV0cykge1xuICAgICAgY29uc3QgbGF5ZXIgPSB4LnNvdXJjZUxheWVyO1xuICAgICAgY29uc3Qgbm9kZUluZGV4ID0geC5ub2RlSW5kZXg7XG4gICAgICBjb25zdCB0ZW5zb3JJbmRleCA9IHgudGVuc29ySW5kZXg7XG4gICAgICB0aGlzLm91dHB1dExheWVycy5wdXNoKGxheWVyKTtcbiAgICAgIHRoaXMub3V0cHV0TGF5ZXJzTm9kZUluZGljZXMucHVzaChub2RlSW5kZXgpO1xuICAgICAgdGhpcy5vdXRwdXRMYXllcnNUZW5zb3JJbmRpY2VzLnB1c2godGVuc29ySW5kZXgpO1xuICAgIH1cblxuICAgIC8vIFRPRE8obWljaGFlbHRlcnJ5KTogQWRkIG91dHB1dCBtYXNrIGNhY2hlIGNvZGUuXG5cbiAgICAvLyBCdWlsZCB0aGlzLmlucHV0TGF5ZXJzOlxuICAgIGZvciAoY29uc3QgeCBvZiB0aGlzLmlucHV0cykge1xuICAgICAgY29uc3QgbGF5ZXIgPSB4LnNvdXJjZUxheWVyO1xuICAgICAgY29uc3Qgbm9kZUluZGV4ID0geC5ub2RlSW5kZXg7XG4gICAgICBjb25zdCB0ZW5zb3JJbmRleCA9IHgudGVuc29ySW5kZXg7XG4gICAgICAvKlxuICAgICAgICBJdCdzIHN1cHBvc2VkIHRvIGJlIGFuIGlucHV0IGxheWVyLCBzbyBvbmx5IG9uZSBub2RlXG4gICAgICAgIGFuZCBvbmUgdGVuc29yIG91dHB1dC5cbiAgICAgICovXG4gICAgICBnZW5lcmljX3V0aWxzLmFzc2VydChub2RlSW5kZXggPT09IDAsICdpbnB1dCBsYXllciBoYXMgPjEgbm9kZXMnKTtcbiAgICAgIGdlbmVyaWNfdXRpbHMuYXNzZXJ0KHRlbnNvckluZGV4ID09PSAwLCAnaW5wdXQgbGF5ZXIgaGFzID4xIHRlbnNvcnMnKTtcbiAgICAgIHRoaXMuaW5wdXRMYXllcnMucHVzaChsYXllcik7XG4gICAgICB0aGlzLmlucHV0TGF5ZXJzTm9kZUluZGljZXMucHVzaChub2RlSW5kZXgpO1xuICAgICAgdGhpcy5pbnB1dExheWVyc1RlbnNvckluZGljZXMucHVzaCh0ZW5zb3JJbmRleCk7XG4gICAgfVxuXG4gICAgLy8gQnVpbGQgdGhpcy5pbnB1dE5hbWVzIGFuZCB0aGlzLm91dHB1dE5hbWVzLlxuICAgIHRoaXMuaW5wdXROYW1lcyA9IFtdO1xuICAgIHRoaXMub3V0cHV0TmFtZXMgPSBbXTtcbiAgICB0aGlzLmZlZWRJbnB1dFNoYXBlcyA9IFtdO1xuICAgIHRoaXMuZmVlZElucHV0TmFtZXMgPSBbXTtcbiAgICB0aGlzLmZlZWRPdXRwdXROYW1lcyA9IFtdO1xuICAgIGZvciAobGV0IGkgPSAwOyBpIDwgdGhpcy5pbnB1dExheWVycy5sZW5ndGg7IGkrKykge1xuICAgICAgY29uc3QgbGF5ZXIgPSB0aGlzLmlucHV0TGF5ZXJzW2ldO1xuICAgICAgLy8gQ2hlY2sgdGhhdCBsYXllciBpcyBhbiBJbnB1dExheWVyLlxuICAgICAgaWYgKCEobGF5ZXIgaW5zdGFuY2VvZiBJbnB1dExheWVyKSkge1xuICAgICAgICB0aHJvdyBuZXcgVHlwZUVycm9yKFxuICAgICAgICAgICAgJ0lucHV0IGxheWVycyB0byBhIExheWVyc01vZGVsIG11c3QgYmUgSW5wdXRMYXllciBvYmplY3RzLiAnICtcbiAgICAgICAgICAgIGBSZWNlaXZlZCBpbnB1dHM6ICR7YXJncy5pbnB1dHN9LiBgICtcbiAgICAgICAgICAgIGBJbnB1dCAke2l9ICgwLWJhc2VkKSBvcmlnaW5hdGVzIGAgK1xuICAgICAgICAgICAgYGZyb20gbGF5ZXIgdHlwZSAke2xheWVyLmdldENsYXNzTmFtZSgpfS5gKTtcbiAgICAgIH1cbiAgICAgIHRoaXMuaW5wdXROYW1lcy5wdXNoKGxheWVyLm5hbWUpO1xuICAgICAgdGhpcy5mZWVkSW5wdXRTaGFwZXMucHVzaChsYXllci5iYXRjaElucHV0U2hhcGUpO1xuXG4gICAgICB0aGlzLmZlZWRJbnB1dE5hbWVzLnB1c2gobGF5ZXIubmFtZSk7XG4gICAgfVxuICAgIGZvciAoY29uc3QgbGF5ZXIgb2YgdGhpcy5vdXRwdXRMYXllcnMpIHtcbiAgICAgIHRoaXMub3V0cHV0TmFtZXMucHVzaChsYXllci5uYW1lKTtcbiAgICB9XG5cbiAgICB0aGlzLmludGVybmFsSW5wdXRTaGFwZXMgPSB0aGlzLmlucHV0cy5tYXAoeCA9PiB4LnNoYXBlKTtcbiAgICB0aGlzLmludGVybmFsT3V0cHV0U2hhcGVzID0gdGhpcy5vdXRwdXRzLm1hcCh4ID0+IHguc2hhcGUpO1xuXG4gICAgLypcbiAgICAgIENvbnRhaW5lcl9ub2Rlczogc2V0IG9mIG5vZGVzIGluY2x1ZGVkIGluIHRoZSBncmFwaCAobm90IGFsbCBub2Rlc1xuICAgICAgaW5jbHVkZWQgaW4gdGhlIGxheWVycyBhcmUgcmVsZXZhbnQgdG8gdGhlIGN1cnJlbnQgZ3JhcGgpLlxuICAgICovXG4gICAgLy8gaWRzIG9mIGFsbCBub2RlcyByZWxldmFudCB0byB0aGUgQ29udGFpbmVyOlxuICAgIGNvbnN0IG5vZGVzRGVwdGhzOiB7W25vZGVJRDogc3RyaW5nXTogbnVtYmVyfSA9IHt9O1xuICAgIC8vIFRvIHJlY292ZXIgbm9kZXMgZnJvbSB0aGVpciBJRC5cbiAgICBjb25zdCBub2RlSURUb05vZGU6IHtbbm9kZUlEOiBzdHJpbmddOiBOb2RlfSA9IHt9O1xuICAgIGNvbnN0IGxheWVyc0RlcHRoczoge1tsYXllcklEOiBzdHJpbmddOiBudW1iZXJ9ID0ge307XG4gICAgLy8gVG8gbGF5ZXJzIGZyb20gdGhlaXIgSUQuXG4gICAgY29uc3QgbGF5ZXJJRFRvTGF5ZXI6IHtbbGF5ZXJJRDogc3RyaW5nXTogTGF5ZXJ9ID0ge307XG4gICAgY29uc3QgbGF5ZXJJbmRpY2VzOiB7W2xheWVySUQ6IHN0cmluZ106IG51bWJlcn0gPSB7fTtcbiAgICBjb25zdCBub2Rlc0luRGVjcmVhc2luZ0RlcHRoOiBOb2RlW10gPSBbXTtcblxuICAgIC8qKlxuICAgICAqIEJ1aWxkcyBhIG1hcCBvZiB0aGUgZ3JhcGggb2YgbGF5ZXJzLlxuICAgICAqXG4gICAgICogVGhpcyByZWN1cnNpdmVseSB1cGRhdGVzIHRoZSBtYXAgYGxheWVySW5kaWNlc2AsXG4gICAgICogdGhlIGxpc3QgYG5vZGVzSW5EZWNyZWFzaW5nRGVwdGhgIGFuZCB0aGUgc2V0IGBjb250YWluZXJOb2Rlc2AuXG4gICAgICpcbiAgICAgKiBAcGFyYW0gdGVuc29yIFNvbWUgdGVuc29yIGluIGEgZ3JhcGguXG4gICAgICogQHBhcmFtIGZpbmlzaGVkTm9kZXMgU2V0IG9mIG5vZGVzIHdob3NlIHN1YmdyYXBocyBoYXZlIGJlZW4gdHJhdmVyc2VkXG4gICAgICogICAgICAgICBjb21wbGV0ZWx5LiBVc2VmdWwgdG8gcHJldmVudCBkdXBsaWNhdGVkIHdvcmsuXG4gICAgICogQHBhcmFtIG5vZGVzSW5Qcm9ncmVzcyBTZXQgb2Ygbm9kZXMgdGhhdCBhcmUgY3VycmVudGx5IGFjdGl2ZSBvbiB0aGVcbiAgICAgKiAgICAgICAgIHJlY3Vyc2lvbiBzdGFjay4gVXNlZnVsIHRvIGRldGVjdCBjeWNsZXMuXG4gICAgICogQHBhcmFtIGxheWVyIExheWVyIGZyb20gd2hpY2ggYHRlbnNvcmAgY29tZXMgZnJvbS4gSWYgbm90IHByb3ZpZGVkLFxuICAgICAqICAgd2lsbCBiZSBvYnRhaW5lZCBmcm9tIHRlbnNvci5zb3VyY2VMYXllci5cbiAgICAgKiBAcGFyYW0gbm9kZUluZGV4IE5vZGUgaW5kZXggZnJvbSB3aGljaCBgdGVuc29yYCBjb21lcyBmcm9tLlxuICAgICAqIEBwYXJhbSB0ZW5zb3JJbmRleCBUZW5zb3JJbmRleCBmcm9tIHdoaWNoIGB0ZW5zb3JgIGNvbWVzIGZyb20uXG4gICAgICpcbiAgICAgKiBAZXhjZXB0aW9uIFJ1bnRpbWVFcnJvciBpZiBhIGN5Y2xlIGlzIGRldGVjdGVkLlxuICAgICAqL1xuICAgIGNvbnN0IGJ1aWxkTWFwT2ZHcmFwaCA9XG4gICAgICAgICh0ZW5zb3I6IFN5bWJvbGljVGVuc29yLCBmaW5pc2hlZE5vZGVzOiBOb2RlW10sIG5vZGVzSW5Qcm9ncmVzczogTm9kZVtdLFxuICAgICAgICAgbGF5ZXI/OiBMYXllciwgbm9kZUluZGV4PzogbnVtYmVyLCB0ZW5zb3JJbmRleD86IG51bWJlcikgPT4ge1xuICAgICAgICAgIGlmIChsYXllciA9PSBudWxsIHx8IG5vZGVJbmRleCA9PSBudWxsIHx8IHRlbnNvckluZGV4ID09IG51bGwpIHtcbiAgICAgICAgICAgIGxheWVyID0gdGVuc29yLnNvdXJjZUxheWVyO1xuICAgICAgICAgICAgbm9kZUluZGV4ID0gdGVuc29yLm5vZGVJbmRleDtcbiAgICAgICAgICAgIHRlbnNvckluZGV4ID0gdGVuc29yLnRlbnNvckluZGV4O1xuICAgICAgICAgIH1cbiAgICAgICAgICBjb25zdCBub2RlID0gbGF5ZXIuaW5ib3VuZE5vZGVzW25vZGVJbmRleF07XG5cbiAgICAgICAgICAvLyBQcmV2ZW50IGN5Y2xlcy5cbiAgICAgICAgICBpZiAobm9kZXNJblByb2dyZXNzLmluZGV4T2Yobm9kZSkgIT09IC0xKSB7XG4gICAgICAgICAgICB0aHJvdyBuZXcgUnVudGltZUVycm9yKFxuICAgICAgICAgICAgICAgIGBUaGUgdGVuc29yICR7dGVuc29yLm5hbWV9IGF0IGxheWVyIFwiJHtsYXllci5uYW1lfVwiIGAgK1xuICAgICAgICAgICAgICAgICdpcyBwYXJ0IG9mIGEgY3ljbGUuJyk7XG4gICAgICAgICAgfVxuXG4gICAgICAgICAgLy8gRG9uJ3QgcmVwZWF0IHdvcmsgZm9yIHNoYXJlZCBzdWJncmFwaHNcbiAgICAgICAgICBpZiAoZmluaXNoZWROb2Rlcy5pbmRleE9mKG5vZGUpICE9PSAtMSkge1xuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICAgIH1cblxuICAgICAgICAgIC8vIFVwZGF0ZSBjb250YWluZXJOb2Rlcy5cbiAgICAgICAgICB0aGlzLmNvbnRhaW5lck5vZGVzLmFkZChDb250YWluZXIubm9kZUtleShsYXllciwgbm9kZUluZGV4KSk7XG5cbiAgICAgICAgICAvLyBTdG9yZSB0aGUgdHJhdmVyc2FsIG9yZGVyIGZvciBsYXllciBzb3J0aW5nLlxuICAgICAgICAgIGlmICghKGxheWVyLmlkIGluIGxheWVySW5kaWNlcykpIHtcbiAgICAgICAgICAgIGxheWVySW5kaWNlc1tsYXllci5pZF0gPSBPYmplY3Qua2V5cyhsYXllckluZGljZXMpLmxlbmd0aDtcbiAgICAgICAgICB9XG5cbiAgICAgICAgICBpZiAobm9kZXNJblByb2dyZXNzLmluZGV4T2Yobm9kZSkgPT09IC0xKSB7XG4gICAgICAgICAgICBub2Rlc0luUHJvZ3Jlc3MucHVzaChub2RlKTtcbiAgICAgICAgICB9XG5cbiAgICAgICAgICAvLyBQcm9wYWdhdGUgdG8gYWxsIHByZXZpb3VzIHRlbnNvcnMgY29ubmVjdGVkIHRvIHRoaXMgbm9kZS5cbiAgICAgICAgICBjb25zdCBudW1JbmJvdW5kTGF5ZXJzID0gbm9kZS5pbmJvdW5kTGF5ZXJzLmxlbmd0aDtcbiAgICAgICAgICBmb3IgKGxldCBpID0gMDsgaSA8IG51bUluYm91bmRMYXllcnM7IGkrKykge1xuICAgICAgICAgICAgY29uc3QgeCA9IG5vZGUuaW5wdXRUZW5zb3JzW2ldO1xuICAgICAgICAgICAgY29uc3QgbGF5ZXIgPSBub2RlLmluYm91bmRMYXllcnNbaV07XG4gICAgICAgICAgICBjb25zdCBub2RlSW5kZXggPSBub2RlLm5vZGVJbmRpY2VzW2ldO1xuICAgICAgICAgICAgY29uc3QgdGVuc29ySW5kZXggPSBub2RlLnRlbnNvckluZGljZXNbaV07XG4gICAgICAgICAgICBidWlsZE1hcE9mR3JhcGgoXG4gICAgICAgICAgICAgICAgeCwgZmluaXNoZWROb2Rlcywgbm9kZXNJblByb2dyZXNzLCBsYXllciwgbm9kZUluZGV4LFxuICAgICAgICAgICAgICAgIHRlbnNvckluZGV4KTtcbiAgICAgICAgICB9XG4gICAgICAgICAgZmluaXNoZWROb2Rlcy5wdXNoKG5vZGUpO1xuICAgICAgICAgIHdoaWxlIChub2Rlc0luUHJvZ3Jlc3MuaW5kZXhPZihub2RlKSA+PSAwKSB7XG4gICAgICAgICAgICBub2Rlc0luUHJvZ3Jlc3Muc3BsaWNlKG5vZGVzSW5Qcm9ncmVzcy5pbmRleE9mKG5vZGUpLCAxKTtcbiAgICAgICAgICB9XG4gICAgICAgICAgbm9kZXNJbkRlY3JlYXNpbmdEZXB0aC5wdXNoKG5vZGUpO1xuICAgICAgICB9O1xuXG4gICAgY29uc3QgZmluaXNoZWROb2RlczogTm9kZVtdID0gW107XG4gICAgY29uc3Qgbm9kZXNJblByb2dyZXNzOiBOb2RlW10gPSBbXTtcbiAgICBmb3IgKGNvbnN0IHggb2YgdGhpcy5vdXRwdXRzKSB7XG4gICAgICBidWlsZE1hcE9mR3JhcGgoeCwgZmluaXNoZWROb2Rlcywgbm9kZXNJblByb2dyZXNzKTtcbiAgICB9XG5cbiAgICBjb25zdCByZXZlcnNlZE5vZGVzSW5EZWNyZWFzaW5nRGVwdGggPVxuICAgICAgICBub2Rlc0luRGVjcmVhc2luZ0RlcHRoLnNsaWNlKCkucmV2ZXJzZSgpO1xuICAgIGZvciAoY29uc3Qgbm9kZSBvZiByZXZlcnNlZE5vZGVzSW5EZWNyZWFzaW5nRGVwdGgpIHtcbiAgICAgIG5vZGVJRFRvTm9kZVtub2RlLmlkXSA9IG5vZGU7XG4gICAgICAvLyBJZiB0aGUgZGVwdGggaXMgbm90IHNldCwgdGhlIG5vZGUgaGFzIG5vIG91dGJvdW5kIG5vZGVzIChkZXB0aCAwKS5cbiAgICAgIGlmICghKG5vZGUuaWQgaW4gbm9kZXNEZXB0aHMpKSB7XG4gICAgICAgIG5vZGVzRGVwdGhzW25vZGUuaWRdID0gMDtcbiAgICAgIH1cbiAgICAgIGxldCBkZXB0aCA9IG5vZGVzRGVwdGhzW25vZGUuaWRdO1xuXG4gICAgICAvLyBVcGRhdGUgdGhlIGRlcHRoIG9mIHRoZSBjb3JyZXNwb25kaW5nIGxheWVyXG4gICAgICBjb25zdCBwcmV2aW91c0RlcHRoID1cbiAgICAgICAgICAobGF5ZXJzRGVwdGhzW25vZGUub3V0Ym91bmRMYXllci5pZF0gPT0gbnVsbCA/XG4gICAgICAgICAgICAgICAwIDpcbiAgICAgICAgICAgICAgIGxheWVyc0RlcHRoc1tub2RlLm91dGJvdW5kTGF5ZXIuaWRdKTtcblxuICAgICAgLypcbiAgICAgICAgSWYgd2UndmUgc2VlbiB0aGlzIGxheWVyIGJlZm9yZSBhdCBhIGhpZ2hlciBkZXB0aCwgd2Ugc2hvdWxkIHVzZSB0aGF0XG4gICAgICAgIGRlcHRoIGluc3RlYWQgb2YgdGhlIG5vZGUgZGVwdGguICBUaGlzIGlzIG5lY2Vzc2FyeSBmb3Igc2hhcmVkIGxheWVyc1xuICAgICAgICB0aGF0IGhhdmUgaW5wdXRzIGF0IGRpZmZlcmVudCBkZXB0aCBsZXZlbHMgaW4gdGhlIGdyYXBoLlxuICAgICAgKi9cbiAgICAgIGRlcHRoID0gTWF0aC5tYXgoZGVwdGgsIHByZXZpb3VzRGVwdGgpO1xuICAgICAgbGF5ZXJzRGVwdGhzW25vZGUub3V0Ym91bmRMYXllci5pZF0gPSBkZXB0aDtcbiAgICAgIGxheWVySURUb0xheWVyW25vZGUub3V0Ym91bmRMYXllci5pZF0gPSBub2RlLm91dGJvdW5kTGF5ZXI7XG4gICAgICBub2Rlc0RlcHRoc1tub2RlLmlkXSA9IGRlcHRoO1xuXG4gICAgICAvLyBVcGRhdGUgdGhlIGRlcHRoIG9mIGluYm91bmQgbm9kZXMuXG4gICAgICBmb3IgKGxldCBpID0gMDsgaSA8IG5vZGUuaW5ib3VuZExheWVycy5sZW5ndGg7IGkrKykge1xuICAgICAgICBjb25zdCBpbmJvdW5kTGF5ZXIgPSBub2RlLmluYm91bmRMYXllcnNbaV07XG4gICAgICAgIGNvbnN0IG5vZGVJbmRleCA9IG5vZGUubm9kZUluZGljZXNbaV07XG4gICAgICAgIGNvbnN0IGluYm91bmROb2RlID0gaW5ib3VuZExheWVyLmluYm91bmROb2Rlc1tub2RlSW5kZXhdO1xuICAgICAgICBjb25zdCBwcmV2aW91c0RlcHRoID1cbiAgICAgICAgICAgIChub2Rlc0RlcHRoc1tpbmJvdW5kTm9kZS5pZF0gPT0gbnVsbCA/IDAgOlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbm9kZXNEZXB0aHNbaW5ib3VuZE5vZGUuaWRdKTtcbiAgICAgICAgbm9kZXNEZXB0aHNbaW5ib3VuZE5vZGUuaWRdID0gTWF0aC5tYXgoZGVwdGggKyAxLCBwcmV2aW91c0RlcHRoKTtcbiAgICAgICAgbm9kZUlEVG9Ob2RlW2luYm91bmROb2RlLmlkXSA9IGluYm91bmROb2RlO1xuICAgICAgfVxuICAgIH1cblxuICAgIC8vIEJ1aWxkIGEgZGljdCB7ZGVwdGg6IGxpc3Qgb2Ygbm9kZXMgd2l0aCB0aGlzIGRlcHRofVxuICAgIGNvbnN0IG5vZGVzQnlEZXB0aDoge1tkZXB0aDogc3RyaW5nXTogTm9kZVtdfSA9IHt9O1xuICAgIGZvciAoY29uc3Qgbm9kZUlEIGluIG5vZGVzRGVwdGhzKSB7XG4gICAgICBjb25zdCBkZXB0aCA9IG5vZGVzRGVwdGhzW25vZGVJRF07XG4gICAgICBpZiAoIShkZXB0aCBpbiBub2Rlc0J5RGVwdGgpKSB7XG4gICAgICAgIG5vZGVzQnlEZXB0aFtkZXB0aF0gPSBbXTtcbiAgICAgIH1cbiAgICAgIG5vZGVzQnlEZXB0aFtkZXB0aF0ucHVzaChub2RlSURUb05vZGVbbm9kZUlEXSk7XG4gICAgfVxuXG4gICAgLy8gQnVpbGQgYSBkaWN0IHtkZXB0aDogbGlzdCBvZiBsYXllcnMgd2l0aCB0aGlzIGRlcHRofVxuICAgIGNvbnN0IGxheWVyc0J5RGVwdGg6IHtbZGVwdGg6IHN0cmluZ106IExheWVyW119ID0ge307XG4gICAgZm9yIChjb25zdCBsYXllcklEIGluIGxheWVyc0RlcHRocykge1xuICAgICAgY29uc3QgZGVwdGggPSBsYXllcnNEZXB0aHNbbGF5ZXJJRF07XG4gICAgICBpZiAoIShkZXB0aCBpbiBsYXllcnNCeURlcHRoKSkge1xuICAgICAgICBsYXllcnNCeURlcHRoW2RlcHRoXSA9IFtdO1xuICAgICAgfVxuICAgICAgbGF5ZXJzQnlEZXB0aFtkZXB0aF0ucHVzaChsYXllcklEVG9MYXllcltsYXllcklEXSk7XG4gICAgfVxuXG4gICAgLy8gR2V0IHNvcnRlZCBsaXN0IG9mIGxheWVyIGRlcHRocy5cbiAgICBsZXQgZGVwdGhLZXlzID0gT2JqZWN0LmtleXMobGF5ZXJzQnlEZXB0aClcbiAgICAgICAgICAgICAgICAgICAgICAgIC5tYXAoeCA9PiBwYXJzZUludCh4LCAxMCkpXG4gICAgICAgICAgICAgICAgICAgICAgICAuc29ydChnZW5lcmljX3V0aWxzLnJldmVyc2VOdW1iZXJDb21wYXJlKTtcblxuICAgIC8vIFNldCB0aGlzLmxheWVycyBhbmQgdGhpcy5sYXllcnNCeURlcHRoLlxuICAgIHRoaXMubGF5ZXJzID0gW107XG4gICAgZm9yIChjb25zdCBkZXB0aCBvZiBkZXB0aEtleXMpIHtcbiAgICAgIGNvbnN0IGxheWVyc0ZvckRlcHRoID0gbGF5ZXJzQnlEZXB0aFtkZXB0aF07XG4gICAgICAvLyBDb250YWluZXIubGF5ZXJzIG5lZWRzIHRvIGhhdmUgYSBkZXRlcm1pbmlzdGljIG9yZGVyOlxuICAgICAgLy8gaGVyZSB3ZSBvcmRlciB0aGVtIGJ5IHRyYXZlcnNhbCBvcmRlci5cbiAgICAgIGxheWVyc0ZvckRlcHRoLnNvcnQoKGEsIGIpID0+IHtcbiAgICAgICAgY29uc3QgYUluZGV4ID0gbGF5ZXJJbmRpY2VzW2EuaWRdO1xuICAgICAgICBjb25zdCBiSW5kZXggPSBsYXllckluZGljZXNbYi5pZF07XG4gICAgICAgIGlmIChhSW5kZXggPCBiSW5kZXgpIHtcbiAgICAgICAgICByZXR1cm4gLTE7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKGFJbmRleCA+IGJJbmRleCkge1xuICAgICAgICAgIHJldHVybiAxO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiAwO1xuICAgICAgfSk7XG4gICAgICBmb3IgKGNvbnN0IGxheWVyIG9mIGxheWVyc0ZvckRlcHRoKSB7XG4gICAgICAgIGlmIChsYXllciBpbnN0YW5jZW9mIENvbnRhaW5lcikge1xuICAgICAgICAgIHRoaXMuaW50ZXJuYWxDb250YWluZXJSZWZzLnB1c2gobGF5ZXIpO1xuICAgICAgICB9XG4gICAgICAgIHRoaXMubGF5ZXJzLnB1c2gobGF5ZXIpO1xuICAgICAgfVxuICAgIH1cbiAgICB0aGlzLmxheWVyc0J5RGVwdGggPSBsYXllcnNCeURlcHRoO1xuXG4gICAgLy8gR2V0IHNvcnRlZCBsaXN0IG9mIG5vZGUgZGVwdGhzO1xuICAgIGRlcHRoS2V5cyA9IE9iamVjdC5rZXlzKG5vZGVzQnlEZXB0aClcbiAgICAgICAgICAgICAgICAgICAgLm1hcCh4ID0+IHBhcnNlSW50KHgsIDEwKSlcbiAgICAgICAgICAgICAgICAgICAgLnNvcnQoZ2VuZXJpY191dGlscy5yZXZlcnNlTnVtYmVyQ29tcGFyZSk7XG5cbiAgICAvLyBDaGVjayB0aGF0IGFsbCB0ZW5zb3JzIHJlcXVpcmVkIGFyZSBjb21wdXRhYmxlLlxuICAgIC8vIGNvbXB1dGFibGVfdGVuc29yczogYWxsIHRlbnNvcnMgaW4gdGhlIGdyYXBoXG4gICAgLy8gdGhhdCBjYW4gYmUgY29tcHV0ZWQgZnJvbSB0aGUgaW5wdXRzIHByb3ZpZGVkLlxuICAgIGNvbnN0IGNvbXB1dGFibGVUZW5zb3JzID0gdGhpcy5pbnB1dHMuc2xpY2UoKTtcblxuICAgIC8vIFRvIHByb3ZpZGUgYSBiZXR0ZXIgZXJyb3IgbXNnLlxuICAgIGNvbnN0IGxheWVyc1dpdGhDb21wbGV0ZUlucHV0OiBzdHJpbmdbXSA9IFtdO1xuICAgIGZvciAoY29uc3QgZGVwdGggb2YgZGVwdGhLZXlzKSB7XG4gICAgICBmb3IgKGNvbnN0IG5vZGUgb2Ygbm9kZXNCeURlcHRoW2RlcHRoXSkge1xuICAgICAgICBjb25zdCBsYXllciA9IG5vZGUub3V0Ym91bmRMYXllcjtcbiAgICAgICAgaWYgKGxheWVyICE9IG51bGwpIHtcbiAgICAgICAgICBmb3IgKGNvbnN0IHggb2Ygbm9kZS5pbnB1dFRlbnNvcnMpIHtcbiAgICAgICAgICAgIGlmIChjb21wdXRhYmxlVGVuc29ycy5pbmRleE9mKHgpID09PSAtMSkge1xuICAgICAgICAgICAgICB0aHJvdyBuZXcgUnVudGltZUVycm9yKFxuICAgICAgICAgICAgICAgICAgYEdyYXBoIGRpc2Nvbm5lY3RlZDogY2Fubm90IG9idGFpbiB2YWx1ZSBmb3IgdGVuc29yICR7eH1gICtcbiAgICAgICAgICAgICAgICAgIGAgYXQgbGF5ZXIgXCIke2xheWVyLm5hbWV9XCIuIGAgK1xuICAgICAgICAgICAgICAgICAgJ1RoZSBmb2xsb3dpbmcgcHJldmlvdXMgbGF5ZXJzIHdlcmUgYWNjZXNzZWQgd2l0aG91dCAnICtcbiAgICAgICAgICAgICAgICAgIGBpc3N1ZTogJHtsYXllcnNXaXRoQ29tcGxldGVJbnB1dH1gKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9XG4gICAgICAgICAgZm9yIChjb25zdCB4IG9mIG5vZGUub3V0cHV0VGVuc29ycykge1xuICAgICAgICAgICAgY29tcHV0YWJsZVRlbnNvcnMucHVzaCh4KTtcbiAgICAgICAgICB9XG4gICAgICAgICAgbGF5ZXJzV2l0aENvbXBsZXRlSW5wdXQucHVzaChsYXllci5uYW1lKTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH1cblxuICAgIC8vIFNldCB0aGlzLmNvbnRhaW5lck5vZGVzIGFuZCB0aGlzLm5vZGVzQnlEZXB0aC5cbiAgICB0aGlzLm5vZGVzQnlEZXB0aCA9IG5vZGVzQnlEZXB0aDtcblxuICAgIC8vIEVuc3VyZSBuYW1lIHVuaWNpdHksIHdoaWNoIHdpbGwgYmUgY3J1Y2lhbCBmb3Igc2VyaWFsaXphdGlvblxuICAgIC8vIChzaW5jZSBzZXJpYWxpemVkIG5vZGVzIHJlZmVyIHRvIGxheWVycyBieSB0aGVpciBuYW1lKS5cbiAgICBjb25zdCBhbGxOYW1lcyA9IHRoaXMubGF5ZXJzLm1hcCh4ID0+IHgubmFtZSk7XG4gICAgZm9yIChjb25zdCBuYW1lIG9mIGFsbE5hbWVzKSB7XG4gICAgICBjb25zdCBudW1PY2N1cnJlbmNlcyA9IGFsbE5hbWVzLmZpbHRlcih4ID0+IHggPT09IG5hbWUpLmxlbmd0aDtcbiAgICAgIGlmIChudW1PY2N1cnJlbmNlcyAhPT0gMSkge1xuICAgICAgICB0aHJvdyBuZXcgUnVudGltZUVycm9yKFxuICAgICAgICAgICAgYFRoZSBuYW1lIFwiJHtuYW1lfVwiIGlzIHVzZWQgJHtudW1PY2N1cnJlbmNlc30gdGltZXMgYCArXG4gICAgICAgICAgICAnaW4gdGhlIG1vZGVsLiBBbGwgbGF5ZXIgbmFtZXMgc2hvdWxkIGJlIHVuaXF1ZS4gTGF5ZXIgbmFtZXM6ICcgK1xuICAgICAgICAgICAgSlNPTi5zdHJpbmdpZnkoYWxsTmFtZXMpKTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICAvLyBMYXllciBwYXJhbWV0ZXJzLlxuICAgIC8vIFRoZSBuZXcgY29udGFpbmVyIHN0YXJ0cyB3aXRoIGEgc2luZ2xlIGluYm91bmQgbm9kZVxuICAgIC8vIGZvciBpdHMgaW5wdXRzLCBhbmQgbm8gb3V0Ym91bmQgbm9kZXMuXG4gICAgLy8gV2lsbCBiZSBhcHBlbmRlZCB0byBieSBmdXR1cmUgY2FsbHMgdG8gYXBwbHkoKS5cbiAgICB0aGlzLm91dGJvdW5kTm9kZXMgPSBbXTtcbiAgICAvLyBXaWxsIGJlIGFwcGVuZGVkIHRvIGJlbG93LCBhbmQgYnkgZnV0dXJlIGNhbGxzIHRvIGFwcGx5KCkuXG4gICAgdGhpcy5pbmJvdW5kTm9kZXMgPSBbXTtcblxuICAgIC8vIENyZWF0ZSB0aGUgbm9kZSBsaW5raW5nIGludGVybmFsIGlucHV0cyB0byBpbnRlcm5hbCBvdXRwdXRzLlxuICAgIC8vIChUaGlzIGNhbGwgaGFzIHNpZGUgZWZmZWN0cy4pXG4gICAgLy8gdHNsaW50OmRpc2FibGUtbmV4dC1saW5lOm5vLXVudXNlZC1leHByZXNzaW9uXG4gICAgbmV3IE5vZGUoe1xuICAgICAgb3V0Ym91bmRMYXllcjogdGhpcyxcbiAgICAgIGluYm91bmRMYXllcnM6IFtdLFxuICAgICAgbm9kZUluZGljZXM6IFtdLFxuICAgICAgdGVuc29ySW5kaWNlczogW10sXG4gICAgICBpbnB1dFRlbnNvcnM6IHRoaXMuaW5wdXRzLFxuICAgICAgb3V0cHV0VGVuc29yczogdGhpcy5vdXRwdXRzLFxuICAgICAgaW5wdXRNYXNrczogdGhpcy5pbnB1dHMubWFwKHggPT4gbnVsbCksXG4gICAgICBvdXRwdXRNYXNrczogdGhpcy5vdXRwdXRzLm1hcCh4ID0+IG51bGwpLFxuICAgICAgaW5wdXRTaGFwZXM6IHRoaXMuaW5wdXRzLm1hcCh4ID0+IHguc2hhcGUpLFxuICAgICAgb3V0cHV0U2hhcGVzOiB0aGlzLm91dHB1dHMubWFwKHggPT4geC5zaGFwZSlcbiAgICB9KTtcbiAgICB0aGlzLmJ1aWx0ID0gdHJ1ZTtcbiAgICB0aGlzLl9yZWZDb3VudCA9IDE7ICAvLyBUaGUgcmVmIGNvdW50IG9mIGEgY29udGFpbmVyIGFsd2F5cyBzdGFydCBhdCAxLlxuICB9XG5cbiAgcHJvdGVjdGVkIGFzc2VydE5vdERpc3Bvc2VkKCkge1xuICAgIGlmICh0aGlzLl9yZWZDb3VudCA9PT0gMCkge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKGBDb250YWluZXIgJyR7dGhpcy5uYW1lfScgaXMgYWxyZWFkeSBkaXNwb3NlZC5gKTtcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogQXR0ZW1wdCB0byBkaXNwb3NlIGEgTGF5ZXJzTW9kZWwncyB3ZWlnaHRzLlxuICAgKlxuICAgKiBUaGlzIG1ldGhvZCBkZWNyZWFzZSB0aGUgcmVmZXJlbmNlIGNvdW50IG9mIHRoZSBMYXllcnNNb2RlbCBvYmplY3QgYnkgMS5cbiAgICpcbiAgICogQSBMYXllcnNNb2RlbCBpcyByZWZlcmVuY2UtY291bnRlZC4gSXRzIHJlZmVyZW5jZSBjb3VudCBpcyBpbmNyZW1lbnRlZCBieSAxXG4gICAqIHdoZW4gaXQgaXMgZmlyc3QgY29uc3RydWN0ZWQgYW5kIHdoZW4gaXQgaXMgdXNlZCBhcyBhIExheWVyIG9mIGFub3RoZXJcbiAgICogTGF5ZXJzTW9kZWwuXG4gICAqXG4gICAqIElmIHRoZSByZWZlcmVuY2UgY291bnQgb2YgYSBMYXllcnNNb2RlbCBiZWNvbWVzIDAsIHRoZSBgZGlzcG9zZWAgbWV0aG9kIG9mXG4gICAqIGFsbCBpdHMgY29uc3RpdHVlbnQgYExheWVyYHMgd2lsbCBiZSBjYWxsZWQuXG4gICAqXG4gICAqIE5vdGU6IElmIHRoZSByZWZlcmVuY2UgY291bnQgaXMgZ3JlYXRlciB0aGFuIDAgYWZ0ZXIgdGhlIGRlY3JlbWVudCwgdGhlXG4gICAqIGBkaXNwb3NlYCBtZXRob2Qgb2YgaXRzIGNvbnN0aXR1ZW50IGBMYXllcmBzIHdpbGwgKm5vdCogYmUgY2FsbGVkLlxuICAgKlxuICAgKiBBZnRlciBhIExheWVyc01vZGVsIGlzIGRpc3Bvc2VkLCBpdCBjYW5ub3QgYmUgdXNlZCBpbiBjYWxscyBzdWNoIGFzXG4gICAqICdwcmVkaWN0YCwgYGV2YWx1YXRlYCBvciBgZml0YCBhbnltb3JlLlxuICAgKlxuICAgKiBAcmV0dXJucyBBIERpc3Bvc2VSZXN1bHQgT2JqZWN0IHdpdGggdGhlIGZvbGxvd2luZyBmaWVsZHM6XG4gICAqICAgLSByZWZDb3VudEFmdGVyRGlzcG9zZTogVGhlIHJlZmVyZW5jZSBjb3VudCBvZiB0aGUgTGF5ZXJzTW9kZWwgYWZ0ZXIgdGhpc1xuICAgKiAgICAgYGRpc3Bvc2UoKWAgY2FsbC5cbiAgICogICAtIG51bURpc3Bvc2VkVmFyaWFibGVzOiBOdW1iZXIgb2YgYHRmLlZhcmlhYmxlYHMgKGkuZS4sIHdlaWdodHMpIGRpc3Bvc2VkXG4gICAqICAgICBkdXJpbmcgdGhpcyBgZGlzcG9zZSgpYCBjYWxsLlxuICAgKiBAdGhyb3dzIHtFcnJvcn0gSWYgdGhlIGxheWVyIGlzIG5vdCBidWlsdCB5ZXQsIG9yIGlmIHRoZSBMYXllcnNNb2RlbCBoYXNcbiAgICogICBhbHJlYWR5IGJlZW4gZGlzcG9zZWQuXG4gICAqL1xuICBkaXNwb3NlKCk6IERpc3Bvc2VSZXN1bHQge1xuICAgIHRoaXMuYXNzZXJ0Tm90RGlzcG9zZWQoKTtcbiAgICBjb25zdCByZXN1bHQ6XG4gICAgICAgIERpc3Bvc2VSZXN1bHQgPSB7cmVmQ291bnRBZnRlckRpc3Bvc2U6IG51bGwsIG51bURpc3Bvc2VkVmFyaWFibGVzOiAwfTtcbiAgICBpZiAoLS10aGlzLl9yZWZDb3VudCA9PT0gMCkge1xuICAgICAgZm9yIChjb25zdCBsYXllciBvZiB0aGlzLmxheWVycykge1xuICAgICAgICByZXN1bHQubnVtRGlzcG9zZWRWYXJpYWJsZXMgKz0gbGF5ZXIuZGlzcG9zZSgpLm51bURpc3Bvc2VkVmFyaWFibGVzO1xuICAgICAgfVxuXG4gICAgICAvLyBDYWxsIGRpc3Bvc2Ugb24gZWFjaCBpbnRlcm5hbGx5IGNyZWF0ZWQgY29udGFpbmVyIGxheWVyIGFnYWluIHRvIGVuc3VyZVxuICAgICAgLy8gdGhlaXIgcmVmQ291bnRzIGhpdCB6ZXJvIGFuZCB0aGVpciB0ZW5zb3JzIGFyZSBzdWJzZXF1ZW50bHkgZGVsZXRlZC5cbiAgICAgIGZvciAoY29uc3QgY29udGFpbmVyIG9mIHRoaXMuaW50ZXJuYWxDb250YWluZXJSZWZzKSB7XG4gICAgICAgIHJlc3VsdC5udW1EaXNwb3NlZFZhcmlhYmxlcyArPSBjb250YWluZXIuZGlzcG9zZSgpLm51bURpc3Bvc2VkVmFyaWFibGVzO1xuICAgICAgfVxuICAgIH1cbiAgICByZXN1bHQucmVmQ291bnRBZnRlckRpc3Bvc2UgPSB0aGlzLl9yZWZDb3VudDtcbiAgICByZXR1cm4gcmVzdWx0O1xuICB9XG5cbiAgZ2V0IHRyYWluYWJsZSgpIHtcbiAgICByZXR1cm4gdGhpcy50cmFpbmFibGVfO1xuICB9XG5cbiAgc2V0IHRyYWluYWJsZSh0cmFpbmFibGU6IGJvb2xlYW4pIHtcbiAgICB0aGlzLmxheWVycy5mb3JFYWNoKGxheWVyID0+IHtcbiAgICAgIC8vIHRzbGludDpkaXNhYmxlLW5leHQtbGluZTpuby1hbnlcbiAgICAgICgobGF5ZXIgYXMgYW55KS5fdHJhaW5hYmxlV2VpZ2h0cyBhcyBMYXllclZhcmlhYmxlW10pXG4gICAgICAgICAgLmZvckVhY2godyA9PiB3LnRyYWluYWJsZSA9IHRyYWluYWJsZSk7XG4gICAgfSk7XG4gICAgdGhpcy50cmFpbmFibGVfID0gdHJhaW5hYmxlO1xuICB9XG5cbiAgZ2V0IHRyYWluYWJsZVdlaWdodHMoKTogTGF5ZXJWYXJpYWJsZVtdIHtcbiAgICAvLyBQb3J0aW5nIE5vdGU6IFRoaXMgY2hlY2sgYmVsb3cgaXMgdG8gcHJldmVudCBlcnJvcnMgd2hlcmUgdGhlXG4gICAgLy8gICBfdHJhaW5hYmxlV2VpZ2h0cyBpbmhlcml0ZWQgZnJvbSB0aGUgcGFyZW50IGNsYXNzIChMYXllcikgZ2V0c1xuICAgIC8vICAgaW5hZHZlcnRlbnRseSB1c2VkLlxuICAgIGlmICh0aGlzLl90cmFpbmFibGVXZWlnaHRzLmxlbmd0aCA+IDApIHtcbiAgICAgIHRocm93IG5ldyBWYWx1ZUVycm9yKFxuICAgICAgICAgICdDb250YWluZXIgaW5zdGFuY2UgdW5leHBlY3RlZGx5IGNvbnRhaW5zIF90cmFpbmFibGVXZWlnaHRzLicgK1xuICAgICAgICAgICdUaGUgdHJhaW5hYmxlIHdlaWdodHMgb2YgYSBDb250YWluZXIgYXJlIGEgdW5pb24gb2YgdGhlICcgK1xuICAgICAgICAgICd0cmFpbmFibGUgd2VpZ2h0cyBvZiBpdHMgY29uc2l0dWVudCBMYXllcnMuIEl0cyBvd24gJyArXG4gICAgICAgICAgJ190cmFpbmFibGVXZWlnaHRzIG11c3QgcmVtYWluIGFuIGVtcHR5IEFycmF5LicpO1xuICAgIH1cblxuICAgIGlmICghdGhpcy50cmFpbmFibGUpIHtcbiAgICAgIHJldHVybiBbXTtcbiAgICB9XG4gICAgbGV0IHdlaWdodHM6IExheWVyVmFyaWFibGVbXSA9IFtdO1xuICAgIGZvciAoY29uc3QgbGF5ZXIgb2YgdGhpcy5sYXllcnMpIHtcbiAgICAgIHdlaWdodHMgPSB3ZWlnaHRzLmNvbmNhdChsYXllci50cmFpbmFibGVXZWlnaHRzKTtcbiAgICB9XG4gICAgcmV0dXJuIHdlaWdodHM7XG4gIH1cblxuICBnZXQgbm9uVHJhaW5hYmxlV2VpZ2h0cygpOiBMYXllclZhcmlhYmxlW10ge1xuICAgIGNvbnN0IHdlaWdodHM6IExheWVyVmFyaWFibGVbXSA9IFtdO1xuICAgIGZvciAoY29uc3QgbGF5ZXIgb2YgdGhpcy5sYXllcnMpIHtcbiAgICAgIHdlaWdodHMucHVzaCguLi5sYXllci5ub25UcmFpbmFibGVXZWlnaHRzKTtcbiAgICB9XG4gICAgaWYgKCF0aGlzLnRyYWluYWJsZSkge1xuICAgICAgY29uc3QgdHJhaW5hYmxlV2VpZ2h0czogTGF5ZXJWYXJpYWJsZVtdID0gW107XG4gICAgICBmb3IgKGNvbnN0IGxheWVyIG9mIHRoaXMubGF5ZXJzKSB7XG4gICAgICAgIHRyYWluYWJsZVdlaWdodHMucHVzaCguLi5sYXllci50cmFpbmFibGVXZWlnaHRzKTtcbiAgICAgIH1cbiAgICAgIHJldHVybiB0cmFpbmFibGVXZWlnaHRzLmNvbmNhdCh3ZWlnaHRzKTtcbiAgICB9XG4gICAgcmV0dXJuIHdlaWdodHM7XG4gIH1cblxuICBnZXQgd2VpZ2h0cygpOiBMYXllclZhcmlhYmxlW10ge1xuICAgIHJldHVybiB0aGlzLnRyYWluYWJsZVdlaWdodHMuY29uY2F0KHRoaXMubm9uVHJhaW5hYmxlV2VpZ2h0cyk7XG4gIH1cblxuICAvKipcbiAgICogTG9hZHMgYWxsIGxheWVyIHdlaWdodHMgZnJvbSBhIEpTT04gb2JqZWN0LlxuICAgKlxuICAgKiBQb3J0aW5nIE5vdGU6IEhERjUgd2VpZ2h0IGZpbGVzIGNhbm5vdCBiZSBkaXJlY3RseSBsb2FkZWQgaW4gSmF2YVNjcmlwdCAvXG4gICAqICAgVHlwZVNjcmlwdC4gVGhlIHV0aWxpdHkgc2NyaXB0IGF0IGBzY3JpcHRzL3B5a2VyYXMucHlgIG9mZmVycyBtZWFuc1xuICAgKiAgIHRvIGNvbnZlcnQgdGhlbSBpbnRvIEpTT04gc3RyaW5ncyBjb21wYXRpYmxlIHdpdGggdGhpcyBtZXRob2QuXG4gICAqIFBvcnRpbmcgTm90ZTogVGVuc29yRmxvdy5qcyBMYXllcnMgc3VwcG9ydHMgb25seSBsb2FkaW5nIGJ5IG5hbWUgY3VycmVudGx5LlxuICAgKlxuICAgKiBAcGFyYW0gd2VpZ2h0cyBBIEpTT04gbWFwcGluZyB3ZWlnaHQgbmFtZXMgdG8gd2VpZ2h0IHZhbHVlcyBhcyBuZXN0ZWRcbiAgICogICBhcnJheXMgb2YgbnVtYmVycywgb3IgYSBgTmFtZWRUZW5zb3JNYXBgLCBpLmUuLCBhIEpTT04gbWFwcGluZyB3ZWlnaHRcbiAgICogICBuYW1lcyB0byBgdGYuVGVuc29yYCBvYmplY3RzLlxuICAgKiBAcGFyYW0gc3RyaWN0IFJlcXVpcmUgdGhhdCB0aGUgcHJvdmlkZWQgd2VpZ2h0cyBleGFjdGx5IG1hdGNoIHRob3NlXG4gICAqICAgcmVxdWlyZWQgYnkgdGhlIGNvbnRhaW5lci4gIERlZmF1bHQ6IGB0cnVlYC4gIFBhc3NpbmcgYGZhbHNlYCBtZWFucyB0aGF0XG4gICAqICAgZXh0cmEgd2VpZ2h0cyBhbmQgbWlzc2luZyB3ZWlnaHRzIHdpbGwgYmUgc2lsZW50bHkgaWdub3JlZC5cbiAgICovXG4gIGxvYWRXZWlnaHRzKHdlaWdodHM6IE5hbWVkVGVuc29yTWFwLCBzdHJpY3QgPSB0cnVlKSB7XG4gICAgY29uc3QgbmFtZVRvV2VpZ2h0OiB7W25hbWU6IHN0cmluZ106IExheWVyVmFyaWFibGV9ID0ge307XG4gICAgbGV0IHRvdGFsV2VpZ2h0c0NvdW50ID0gMDtcbiAgICBmb3IgKGNvbnN0IGxheWVyIG9mIHRoaXMubGF5ZXJzKSB7XG4gICAgICBmb3IgKGNvbnN0IHdlaWdodCBvZiBsYXllci53ZWlnaHRzKSB7XG4gICAgICAgIGlmIChuYW1lVG9XZWlnaHRbd2VpZ2h0Lm9yaWdpbmFsTmFtZV0gIT0gbnVsbCkge1xuICAgICAgICAgIHRocm93IG5ldyBWYWx1ZUVycm9yKGBEdXBsaWNhdGUgd2VpZ2h0IG5hbWU6ICR7d2VpZ2h0Lm9yaWdpbmFsTmFtZX1gKTtcbiAgICAgICAgfVxuICAgICAgICBuYW1lVG9XZWlnaHRbd2VpZ2h0Lm9yaWdpbmFsTmFtZV0gPSB3ZWlnaHQ7XG4gICAgICAgIHRvdGFsV2VpZ2h0c0NvdW50Kys7XG4gICAgICB9XG4gICAgfVxuXG4gICAgY29uc3Qgd2VpZ2h0VmFsdWVUdXBsZXM6IEFycmF5PFtMYXllclZhcmlhYmxlLCBUZW5zb3JdPiA9IFtdO1xuICAgIGZvciAoY29uc3QgbmFtZSBpbiB3ZWlnaHRzKSB7XG4gICAgICAvLyBURiAyLjIuMCBhZGRlZCBjZWxsIG5hbWUgdG8gdGhlIHdlaWdodCBuYW1lIGluIHRoZSBmb3JtYXQgb2ZcbiAgICAgIC8vIGxheWVyX25hbWUvY2VsbF9uYW1lL3dlaWdodF9uYW1lLCB3ZSBuZWVkIHRvIHJlbW92ZVxuICAgICAgLy8gdGhlIGlubmVyIGNlbGwgbmFtZS5cbiAgICAgIGxldCB2YWxpZGF0ZWROYW1lID0gbmFtZTtcbiAgICAgIGlmIChuYW1lVG9XZWlnaHRbbmFtZV0gPT0gbnVsbCkge1xuICAgICAgICBjb25zdCB0b2tlbnMgPSBuYW1lLnNwbGl0KCcvJyk7XG4gICAgICAgIGNvbnN0IHNob3J0ZW5OYW1lQXJyYXkgPVxuICAgICAgICAgICAgdG9rZW5zLnNsaWNlKDAsIC0yKS5jb25jYXQoW3Rva2Vuc1t0b2tlbnMubGVuZ3RoIC0gMV1dKTtcbiAgICAgICAgdmFsaWRhdGVkTmFtZSA9IHNob3J0ZW5OYW1lQXJyYXkuam9pbignLycpO1xuICAgICAgfVxuICAgICAgaWYgKG5hbWVUb1dlaWdodFt2YWxpZGF0ZWROYW1lXSAhPSBudWxsKSB7XG4gICAgICAgIHdlaWdodFZhbHVlVHVwbGVzLnB1c2goW25hbWVUb1dlaWdodFt2YWxpZGF0ZWROYW1lXSwgd2VpZ2h0c1tuYW1lXV0pO1xuICAgICAgfSBlbHNlIGlmIChzdHJpY3QpIHtcbiAgICAgICAgdGhyb3cgbmV3IFZhbHVlRXJyb3IoXG4gICAgICAgICAgICBgUHJvdmlkZWQgd2VpZ2h0IGRhdGEgaGFzIG5vIHRhcmdldCB2YXJpYWJsZTogJHtuYW1lfWApO1xuICAgICAgfVxuICAgICAgZGVsZXRlIG5hbWVUb1dlaWdodFt2YWxpZGF0ZWROYW1lXTtcbiAgICB9XG5cbiAgICBpZiAoc3RyaWN0KSB7XG4gICAgICAvLyBDaGVjayB0aGF0IGFsbCB3ZWlnaHRzIGFyZSBzZXQuXG4gICAgICBjb25zdCB1bnNldE5hbWVzOiBzdHJpbmdbXSA9IFtdO1xuICAgICAgZm9yIChjb25zdCBuYW1lIGluIG5hbWVUb1dlaWdodCkge1xuICAgICAgICB1bnNldE5hbWVzLnB1c2gobmFtZSk7XG4gICAgICB9XG4gICAgICBpZiAodW5zZXROYW1lcy5sZW5ndGggPiAwKSB7XG4gICAgICAgIHRocm93IG5ldyBWYWx1ZUVycm9yKFxuICAgICAgICAgICAgYCR7dW5zZXROYW1lcy5sZW5ndGh9IG9mICR7XG4gICAgICAgICAgICAgICAgdG90YWxXZWlnaHRzQ291bnR9IHdlaWdodHMgYXJlIG5vdCBzZXQ6IGAgK1xuICAgICAgICAgICAgYCR7dW5zZXROYW1lc31gKTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICBiYXRjaFNldFZhbHVlKHdlaWdodFZhbHVlVHVwbGVzKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBVdGlsIHNoYXJlZCBiZXR3ZWVuIGRpZmZlcmVudCBzZXJpYWxpemF0aW9uIG1ldGhvZHMuXG4gICAqIEByZXR1cm5zIExheWVyc01vZGVsIGNvbmZpZyB3aXRoIEtlcmFzIHZlcnNpb24gaW5mb3JtYXRpb24gYWRkZWQuXG4gICAqL1xuICBwcm90ZWN0ZWQgdXBkYXRlZENvbmZpZygpOiBzZXJpYWxpemF0aW9uLkNvbmZpZ0RpY3Qge1xuICAgIGNvbnN0IHRoZUNvbmZpZyA9IHRoaXMuZ2V0Q29uZmlnKCk7XG4gICAgY29uc3QgbW9kZWxDb25maWc6IHNlcmlhbGl6YXRpb24uQ29uZmlnRGljdCA9IHt9O1xuICAgIG1vZGVsQ29uZmlnWydjbGFzc05hbWUnXSA9IHRoaXMuZ2V0Q2xhc3NOYW1lKCk7XG4gICAgbW9kZWxDb25maWdbJ2NvbmZpZyddID0gdGhlQ29uZmlnO1xuICAgIG1vZGVsQ29uZmlnWydrZXJhc1ZlcnNpb24nXSA9IGB0ZmpzLWxheWVycyAke2xheWVyc1ZlcnNpb259YDtcbiAgICAvLyBUT0RPKG5pZWxzZW5lKTogUmVwbGFjZSBzb21ldGhpbmcgbGlrZSBLLmJhY2tlbmQoKSBvbmNlXG4gICAgLy8gcG9zc2libGUuXG4gICAgbW9kZWxDb25maWdbJ2JhY2tlbmQnXSA9ICdUZW5zb3JGbG93LmpzJztcbiAgICByZXR1cm4gbW9kZWxDb25maWc7XG4gIH1cblxuICAvKipcbiAgICogUmV0dXJucyBhIEpTT04gc3RyaW5nIGNvbnRhaW5pbmcgdGhlIG5ldHdvcmsgY29uZmlndXJhdGlvbi5cbiAgICpcbiAgICogVG8gbG9hZCBhIG5ldHdvcmsgZnJvbSBhIEpTT04gc2F2ZSBmaWxlLCB1c2VcbiAgICogbW9kZWxzLm1vZGVsRnJvbUpTT04oanNvblN0cmluZyk7XG4gICAqIEBwYXJhbSBleHRyYUpzb25BcmdzIFVudXNlZCBpbiB0ZmpzLWxheWVycywgbWFpbnRhaW5lZCBmb3IgUHlLZXJhc1xuICAgKiBAcGFyYW0gcmV0dXJuU3RyaW5nIFdoZXRoZXIgdGhlIHJldHVybiB2YWx1ZSBzaG91bGQgYmUgc3RyaW5naWZpZWRcbiAgICogICAgKGRlZmF1bHQ6IGB0cnVlYCkuXG4gICAqIEByZXR1cm5zIGEgSlNPTiBzdHJpbmcgaWYgYHJldHVyblN0cmluZ2AgKGRlZmF1bHQpLCBvciBhIEpTT04gb2JqZWN0IGlmXG4gICAqICAgYCFyZXR1cm5TdHJpbmdgLlxuICAgKi9cbiAgLy8gdHNsaW50OmRpc2FibGUtbmV4dC1saW5lOm5vLWFueVxuICB0b0pTT04odW51c2VkPzogYW55LCByZXR1cm5TdHJpbmcgPSB0cnVlKTogc3RyaW5nfFB5SnNvbkRpY3Qge1xuICAgIGNvbnN0IG1vZGVsQ29uZmlnID0gY29udmVydFRzVG9QeXRob25pYyh0aGlzLnVwZGF0ZWRDb25maWcoKSkgYXMgUHlKc29uRGljdDtcbiAgICByZXR1cm4gcmV0dXJuU3RyaW5nID8gSlNPTi5zdHJpbmdpZnkobW9kZWxDb25maWcpIDogbW9kZWxDb25maWc7XG4gIH1cblxuICAvKipcbiAgICogQ2FsbCB0aGUgbW9kZWwgb24gbmV3IGlucHV0cy5cbiAgICpcbiAgICogSW4gdGhpcyBjYXNlIGBjYWxsYCBqdXN0IHJlYXBwbGllcyBhbGwgb3BzIGluIHRoZSBncmFwaCB0byB0aGUgbmV3IGlucHV0c1xuICAgKiAoZS5nLiBidWlsZCBhIG5ldyBjb21wdXRhdGlvbmFsIGdyYXBoIGZyb20gdGhlIHByb3ZpZGVkIGlucHV0cykuXG4gICAqXG4gICAqIEBwYXJhbSBpbnB1dHMgQSB0ZW5zb3Igb3IgbGlzdCBvZiB0ZW5zb3JzLlxuICAgKiBAcGFyYW0gbWFzayBBIG1hc2sgb3IgbGlzdCBvZiBtYXNrcy4gQSBtYXNrIGNhbiBiZSBlaXRoZXIgYSB0ZW5zb3Igb3IgbnVsbFxuICAgKiAgIChubyBtYXNrKS5cbiAgICpcbiAgICogQHJldHVybiBBIHRlbnNvciBpZiB0aGVyZSBpcyBhIHNpbmdsZSBvdXRwdXQsIG9yIGEgbGlzdCBvZiB0ZW5zb3JzIGlmIHRoZXJlXG4gICAqICAgYXJlIG1vcmUgdGhhbiBvbmUgb3V0cHV0cy5cbiAgICovXG4gIGNhbGwoaW5wdXRzOiBUZW5zb3J8VGVuc29yW10sIGt3YXJnczogS3dhcmdzKTogVGVuc29yfFRlbnNvcltdIHtcbiAgICByZXR1cm4gdGlkeSgoKSA9PiB7XG4gICAgICBpbnB1dHMgPSBnZW5lcmljX3V0aWxzLnRvTGlzdChpbnB1dHMpO1xuICAgICAgY29uc3QgZmVlZERpY3QgPSBuZXcgRmVlZERpY3QoKTtcbiAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgdGhpcy5pbnB1dHMubGVuZ3RoOyArK2kpIHtcbiAgICAgICAgZmVlZERpY3QuYWRkKHRoaXMuaW5wdXRzW2ldLCBpbnB1dHNbaV0pO1xuICAgICAgfVxuICAgICAgcmV0dXJuIGV4ZWN1dGUodGhpcy5vdXRwdXRzLCBmZWVkRGljdCwga3dhcmdzKSBhcyBUZW5zb3IgfCBUZW5zb3JbXTtcbiAgICB9KTtcbiAgfVxuXG4gIC8qKlxuICAgKiBDb21wdXRlcyBhbiBvdXRwdXQgbWFzayB0ZW5zb3IuXG4gICAqXG4gICAqIEBwYXJhbSBpbnB1dHMgVGVuc29yIG9yIGxpc3Qgb2YgdGVuc29ycy5cbiAgICogQHBhcmFtIG1hc2sgVGVuc29yIG9yIGxpc3Qgb2YgdGVuc29ycy5cbiAgICpcbiAgICogQHJldHVybiBudWxsIG9yIGEgdGVuc29yIChvciBsaXN0IG9mIHRlbnNvcnMsIG9uZSBwZXIgb3V0cHV0IHRlbnNvciBvZiB0aGVcbiAgICogbGF5ZXIpLlxuICAgKi9cbiAgY29tcHV0ZU1hc2soaW5wdXRzOiBUZW5zb3J8VGVuc29yW10sIG1hc2s/OiBUZW5zb3J8VGVuc29yW10pOiBUZW5zb3JcbiAgICAgIHxUZW5zb3JbXSB7XG4gICAgcmV0dXJuIHRpZHkoKCkgPT4ge1xuICAgICAgaW5wdXRzID0gZ2VuZXJpY191dGlscy50b0xpc3QoaW5wdXRzKTtcbiAgICAgIGxldCBtYXNrczogVGVuc29yW107XG4gICAgICBpZiAobWFzayA9PSBudWxsKSB7XG4gICAgICAgIG1hc2tzID0gZ2VuZXJpY191dGlscy5weUxpc3RSZXBlYXQobnVsbCwgaW5wdXRzLmxlbmd0aCk7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBtYXNrcyA9IGdlbmVyaWNfdXRpbHMudG9MaXN0KG1hc2spO1xuICAgICAgfVxuICAgICAgLy8gVE9ETyhtaWNoYWVsdGVycnkpOiBBZGQgc3VwcG9ydCBmb3IgbWFzayBjYWNoaW5nLlxuICAgICAgcmV0dXJuIHRoaXMucnVuSW50ZXJuYWxHcmFwaChpbnB1dHMsIG1hc2tzKVsxXTtcbiAgICB9KTtcbiAgfVxuXG4gIC8qKlxuICAgKiBDb21wdXRlcyB0aGUgb3V0cHV0IHNoYXBlIG9mIHRoZSBsYXllci5cbiAgICpcbiAgICogQXNzdW1lcyB0aGF0IHRoZSBsYXllciB3aWxsIGJlIGJ1aWx0IHRvIG1hdGNoIHRoYXQgaW5wdXQgc2hhcGUgcHJvdmlkZWQuXG4gICAqXG4gICAqIEBwYXJhbSBpbnB1dFNoYXBlIEEgc2hhcGUgKHR1cGxlIG9mIGludGVnZXJzKSBvciBhIGxpc3Qgb2Ygc2hhcGUgdHVwbGVzXG4gICAqICAgKG9uZSBwZXIgb3V0cHV0IHRlbnNvciBvZiB0aGUgbGF5ZXIpLiBTaGFwZSB0dXBsZXMgY2FuIGluY2x1ZGUgbnVsbCBmb3JcbiAgICogICBmcmVlIGRpbWVuc2lvbnMsIGluc3RlYWQgb2YgYW4gaW50ZWdlci5cbiAgICovXG4gIGNvbXB1dGVPdXRwdXRTaGFwZShpbnB1dFNoYXBlOiBTaGFwZXxTaGFwZVtdKTogU2hhcGV8U2hhcGVbXSB7XG4gICAgY29uc3QgaW5wdXRTaGFwZXMgPSB0eXBlc191dGlscy5ub3JtYWxpemVTaGFwZUxpc3QoaW5wdXRTaGFwZSk7XG4gICAgaWYgKGlucHV0U2hhcGVzLmxlbmd0aCAhPT0gdGhpcy5pbnB1dExheWVycy5sZW5ndGgpIHtcbiAgICAgIHRocm93IG5ldyBWYWx1ZUVycm9yKFxuICAgICAgICAgIGBJbnZhbGlkIGlucHV0U2hhcGUgYXJndW1lbnQgJHtpbnB1dFNoYXBlfTogYCArXG4gICAgICAgICAgYG1vZGVsIGhhcyAke3RoaXMuaW5wdXRMYXllcnMubGVuZ3RofSB0ZW5zb3IgaW5wdXRzLmApO1xuICAgIH1cblxuICAgIC8vIFRPRE8obWljaGFlbHRlcnJ5KTogQWRkIGNhY2hpbmdcbiAgICBjb25zdCBsYXllcnNUb091dHB1dFNoYXBlczoge1tzaGFwZUtleTogc3RyaW5nXTogU2hhcGV9ID0ge307XG4gICAgZm9yIChsZXQgaSA9IDA7IGkgPCBpbnB1dFNoYXBlcy5sZW5ndGg7IGkrKykge1xuICAgICAgY29uc3QgbGF5ZXIgPSB0aGlzLmlucHV0TGF5ZXJzW2ldO1xuICAgICAgY29uc3QgaW5wdXRTaGFwZSA9IGlucHV0U2hhcGVzW2ldO1xuICAgICAgLy8gSXQncyBhbiBpbnB1dCBsYXllcjogY29tcHV0ZU91dHB1dFNoYXBlIGlzIGlkZW50aXR5LFxuICAgICAgLy8gYW5kIHRoZXJlIGlzIG9ubHkgb25lIG5vZGUgYW5kIG9uZSB0ZW5zb3Igb3V0cHV0LlxuICAgICAgY29uc3Qgc2hhcGVLZXkgPSBsYXllci5uYW1lICsgJ18wXzAnO1xuICAgICAgbGF5ZXJzVG9PdXRwdXRTaGFwZXNbc2hhcGVLZXldID0gaW5wdXRTaGFwZTtcbiAgICB9XG5cbiAgICBjb25zdCBkZXB0aEtleXMgPSBPYmplY3Qua2V5cyh0aGlzLm5vZGVzQnlEZXB0aClcbiAgICAgICAgICAgICAgICAgICAgICAgICAgLm1hcCh4ID0+IHBhcnNlSW50KHgsIDEwKSlcbiAgICAgICAgICAgICAgICAgICAgICAgICAgLnNvcnQoZ2VuZXJpY191dGlscy5yZXZlcnNlTnVtYmVyQ29tcGFyZSk7XG4gICAgLy8gSXRlcmF0ZSBvdmVyIG5vZGVzLCBieSBkZXB0aCBsZXZlbC5cbiAgICBpZiAoZGVwdGhLZXlzLmxlbmd0aCA+IDEpIHtcbiAgICAgIGZvciAoY29uc3QgZGVwdGggb2YgZGVwdGhLZXlzKSB7XG4gICAgICAgIGNvbnN0IG5vZGVzID0gdGhpcy5ub2Rlc0J5RGVwdGhbZGVwdGhdO1xuICAgICAgICBmb3IgKGNvbnN0IG5vZGUgb2Ygbm9kZXMpIHtcbiAgICAgICAgICAvLyBUaGlzIGlzIGFsd2F5cyBhIHNpbmdsZSBsYXllciwgbmV2ZXIgYSBsaXN0LlxuICAgICAgICAgIGNvbnN0IGxheWVyID0gbm9kZS5vdXRib3VuZExheWVyO1xuICAgICAgICAgIGlmICh0aGlzLmlucHV0TGF5ZXJzLm1hcCh4ID0+IHguaWQpLmluZGV4T2YobGF5ZXIuaWQpICE9PSAtMSkge1xuICAgICAgICAgICAgLy8gV2UndmUgYWxyZWFkeSBjb3ZlcmVkIHRoZSBpbnB1dCBsYXllcnMgYSBmZXcgbGluZXMgYWJvdmUuXG4gICAgICAgICAgICBjb250aW51ZTtcbiAgICAgICAgICB9XG4gICAgICAgICAgLy8gUG90ZW50aWFsbHkgcmVkdW5kYW50IGxpc3QsIHNhbWUgc2l6ZSBvZiBub2RlLmlucHV0VGVuc29ycy5cbiAgICAgICAgICBjb25zdCBpbnB1dFNoYXBlczogU2hhcGVbXSA9IFtdO1xuICAgICAgICAgIGZvciAobGV0IGogPSAwOyBqIDwgbm9kZS5pbmJvdW5kTGF5ZXJzLmxlbmd0aDsgaisrKSB7XG4gICAgICAgICAgICBjb25zdCBpbmJvdW5kTGF5ZXIgPSBub2RlLmluYm91bmRMYXllcnNbal07XG4gICAgICAgICAgICBjb25zdCBub2RlSW5kZXggPSBub2RlLm5vZGVJbmRpY2VzW2pdO1xuICAgICAgICAgICAgY29uc3QgdGVuc29ySW5kZXggPSBub2RlLnRlbnNvckluZGljZXNbal07XG4gICAgICAgICAgICBjb25zdCBzaGFwZUtleSA9IGAke2luYm91bmRMYXllci5uYW1lfV8ke25vZGVJbmRleH1fJHt0ZW5zb3JJbmRleH1gO1xuICAgICAgICAgICAgY29uc3QgaW5wdXRTaGFwZSA9IGxheWVyc1RvT3V0cHV0U2hhcGVzW3NoYXBlS2V5XTtcbiAgICAgICAgICAgIGlucHV0U2hhcGVzLnB1c2goaW5wdXRTaGFwZSk7XG4gICAgICAgICAgfVxuXG4gICAgICAgICAgY29uc3Qgb3V0cHV0U2hhcGUgPSBsYXllci5jb21wdXRlT3V0cHV0U2hhcGUoXG4gICAgICAgICAgICAgIGdlbmVyaWNfdXRpbHMuc2luZ2xldG9uT3JBcnJheShpbnB1dFNoYXBlcykpO1xuXG4gICAgICAgICAgY29uc3Qgb3V0cHV0U2hhcGVzID0gdHlwZXNfdXRpbHMubm9ybWFsaXplU2hhcGVMaXN0KG91dHB1dFNoYXBlKTtcbiAgICAgICAgICBjb25zdCBub2RlSW5kZXggPSBsYXllci5pbmJvdW5kTm9kZXMuaW5kZXhPZihub2RlKTtcbiAgICAgICAgICBmb3IgKGxldCBqID0gMDsgaiA8IG91dHB1dFNoYXBlcy5sZW5ndGg7IGorKykge1xuICAgICAgICAgICAgY29uc3Qgc2hhcGVLZXkgPSBgJHtsYXllci5uYW1lfV8ke25vZGVJbmRleH1fJHtqfWA7XG4gICAgICAgICAgICBsYXllcnNUb091dHB1dFNoYXBlc1tzaGFwZUtleV0gPSBvdXRwdXRTaGFwZXNbal07XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICB9XG4gICAgfVxuXG4gICAgLy8gUmVhZCBmaW5hbCBvdXRwdXQgc2hhcGVzIGZyb20gbGF5ZXJzVG9PdXRwdXRTaGFwZXMuXG4gICAgY29uc3Qgb3V0cHV0U2hhcGVzOiBTaGFwZVtdID0gW107XG4gICAgY29uc3Qgb3V0cHV0U2hhcGVLZXlzOiBzdHJpbmdbXSA9IFtdO1xuICAgIGZvciAobGV0IGkgPSAwOyBpIDwgdGhpcy5vdXRwdXRMYXllcnMubGVuZ3RoOyBpKyspIHtcbiAgICAgIGNvbnN0IGxheWVyID0gdGhpcy5vdXRwdXRMYXllcnNbaV07XG4gICAgICBjb25zdCBub2RlSW5kZXggPSB0aGlzLm91dHB1dExheWVyc05vZGVJbmRpY2VzW2ldO1xuICAgICAgY29uc3QgdGVuc29ySW5kZXggPSB0aGlzLm91dHB1dExheWVyc1RlbnNvckluZGljZXNbaV07XG4gICAgICBjb25zdCBzaGFwZUtleSA9IGAke2xheWVyLm5hbWV9XyR7bm9kZUluZGV4fV8ke3RlbnNvckluZGV4fWA7XG4gICAgICBvdXRwdXRTaGFwZUtleXMucHVzaChzaGFwZUtleSk7XG4gICAgfVxuXG4gICAgZm9yIChsZXQgaSA9IDA7IGkgPCBvdXRwdXRTaGFwZUtleXMubGVuZ3RoOyBpKyspIHtcbiAgICAgIGNvbnN0IGtleSA9IG91dHB1dFNoYXBlS2V5c1tpXTtcbiAgICAgIGdlbmVyaWNfdXRpbHMuYXNzZXJ0KGtleSBpbiBsYXllcnNUb091dHB1dFNoYXBlcyk7XG4gICAgICBvdXRwdXRTaGFwZXMucHVzaChsYXllcnNUb091dHB1dFNoYXBlc1trZXldKTtcbiAgICB9XG5cbiAgICAvLyBUT0RPKG1pY2hhZWx0ZXJyeSk6IFVwZGF0ZSBjYWNoZVxuICAgIHJldHVybiBnZW5lcmljX3V0aWxzLnNpbmdsZXRvbk9yQXJyYXkob3V0cHV0U2hhcGVzKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBDb21wdXRlcyBvdXRwdXQgdGVuc29ycyBmb3IgbmV3IGlucHV0cy5cbiAgICpcbiAgICogTm90ZTpcbiAgICogICAtIEV4cGVjdHMgYGlucHV0c2AgdG8gYmUgYSBsaXN0IChwb3RlbnRpYWxseSB3aXRoIDEgZWxlbWVudCkuXG4gICAqXG4gICAqIEBwYXJhbSBpbnB1dHMgTGlzdCBvZiB0ZW5zb3JzXG4gICAqIEBwYXJhbSBtYXNrcyBMaXN0IG9mIG1hc2tzICh0ZW5zb3JzIG9yIG51bGwpLlxuICAgKiBAcmV0dXJuIFRocmVlIGxpc3RzOiBvdXRwdXRUZW5zb3JzLCBvdXRwdXRNYXNrcywgb3V0cHV0U2hhcGVzXG4gICAqL1xuICBwcm90ZWN0ZWQgcnVuSW50ZXJuYWxHcmFwaChpbnB1dHM6IFRlbnNvcltdLCBtYXNrcz86IFRlbnNvcltdKTpcbiAgICAgIFtUZW5zb3JbXSwgVGVuc29yW10sIFNoYXBlW11dIHtcbiAgICBpZiAobWFza3MgPT0gbnVsbCkge1xuICAgICAgbWFza3MgPSBnZW5lcmljX3V0aWxzLnB5TGlzdFJlcGVhdChudWxsLCBpbnB1dHMubGVuZ3RoKTtcbiAgICB9XG5cbiAgICAvLyBEaWN0aW9uYXJ5IG1hcHBpbmcgcmVmZXJlbmNlIHRlbnNvcnMgdG8gdHVwbGVzXG4gICAgLy8gKGNvbXB1dGVkIHRlbnNvciwgY29tcHV0ZSBtYXNrKVxuICAgIC8vIHdlIGFzc3VtZSBhIDE6MSBtYXBwaW5nIGZyb20gdGVuc29yIHRvIG1hc2tcbiAgICAvLyBUT0RPOiByYWlzZSBleGNlcHRpb24gd2hlbiBhIGAuY29tcHV0ZU1hc2soKWAgY2FsbFxuICAgIC8vIGRvZXMgbm90IHJldHVybiBhIGxpc3QgdGhlIHNhbWUgc2l6ZSBhcyBgY2FsbGBcbiAgICBjb25zdCB0ZW5zb3JNYXA6IHtbdGVuc29ySUQ6IHN0cmluZ106IFtUZW5zb3IsIFRlbnNvcl19ID0ge307XG4gICAgZm9yIChsZXQgaSA9IDA7IGkgPCB0aGlzLmlucHV0cy5sZW5ndGg7ICsraSkge1xuICAgICAgY29uc3QgeCA9IHRoaXMuaW5wdXRzW2ldO1xuICAgICAgY29uc3QgeSA9IGlucHV0c1tpXTtcbiAgICAgIGNvbnN0IG1hc2sgPSBtYXNrc1tpXTtcbiAgICAgIHRlbnNvck1hcFt4LmlkXSA9IFt5LCBtYXNrXTtcbiAgICB9XG5cbiAgICBjb25zdCBkZXB0aEtleXMgPSBPYmplY3Qua2V5cyh0aGlzLm5vZGVzQnlEZXB0aClcbiAgICAgICAgICAgICAgICAgICAgICAgICAgLm1hcCh4ID0+IHBhcnNlSW50KHgsIDEwKSlcbiAgICAgICAgICAgICAgICAgICAgICAgICAgLnNvcnQoZ2VuZXJpY191dGlscy5yZXZlcnNlTnVtYmVyQ29tcGFyZSk7XG4gICAgZm9yIChjb25zdCBkZXB0aCBvZiBkZXB0aEtleXMpIHtcbiAgICAgIGNvbnN0IG5vZGVzID0gdGhpcy5ub2Rlc0J5RGVwdGhbZGVwdGhdO1xuICAgICAgZm9yIChjb25zdCBub2RlIG9mIG5vZGVzKSB7XG4gICAgICAgIC8vIFRoaXMgaXMgYWx3YXlzIGEgc2luZ2xlIGxheWVyLCBuZXZlciBhIGxpc3QuXG4gICAgICAgIGNvbnN0IGxheWVyID0gbm9kZS5vdXRib3VuZExheWVyO1xuICAgICAgICBjb25zdCByZWZlcmVuY2VJbnB1dFRlbnNvcnMgPSBub2RlLmlucHV0VGVuc29ycztcbiAgICAgICAgY29uc3QgcmVmZXJlbmNlT3V0cHV0VGVuc29ycyA9IG5vZGUub3V0cHV0VGVuc29ycztcblxuICAgICAgICAvLyBJZiBhbGwgcHJldmlvdXMgaW5wdXQgdGVuc29ycyBhcmUgYXZhaWxhYmxlIGluIHRlbnNvck1hcCxcbiAgICAgICAgLy8gdGhlbiBjYWxsIG5vZGUuaW5ib3VuZExheWVyIG9uIHRoZW0uXG4gICAgICAgIC8vIExpc3Qgb2YgdHVwbGVzIFtpbnB1dCwgbWFza106XG4gICAgICAgIGNvbnN0IGNvbXB1dGVkRGF0YSA9IG5ldyBBcnJheTxbVGVuc29yLCBUZW5zb3JdPigpO1xuICAgICAgICBmb3IgKGNvbnN0IHggb2YgcmVmZXJlbmNlSW5wdXRUZW5zb3JzKSB7XG4gICAgICAgICAgaWYgKHguaWQgaW4gdGVuc29yTWFwKSB7XG4gICAgICAgICAgICBjb21wdXRlZERhdGEucHVzaCh0ZW5zb3JNYXBbeC5pZF0pO1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICBpZiAoY29tcHV0ZWREYXRhLmxlbmd0aCA9PT0gcmVmZXJlbmNlSW5wdXRUZW5zb3JzLmxlbmd0aCkge1xuICAgICAgICAgIC8vIFRPRE8obWljaGFlbHRlcnJ5KTogQWRkIEsubmFtZV9zY29wZSBoZXJlLCBpZiB3ZSBuZWVkIGl0LlxuICAgICAgICAgIGxldCBrd2FyZ3M6IEt3YXJncyA9IHt9O1xuICAgICAgICAgIGxldCBjb21wdXRlZFRlbnNvcnM6IFRlbnNvcltdO1xuICAgICAgICAgIGxldCBjb21wdXRlZE1hc2tzOiBUZW5zb3JbXTtcbiAgICAgICAgICBsZXQgb3V0cHV0VGVuc29yczogVGVuc29yW107XG4gICAgICAgICAgbGV0IG91dHB1dE1hc2tzOiBUZW5zb3JbXTtcbiAgICAgICAgICAvLyBjYWxsIGxheWVyXG4gICAgICAgICAgaWYgKG5vZGUuY2FsbEFyZ3MgIT0gbnVsbCkge1xuICAgICAgICAgICAga3dhcmdzID0gbm9kZS5jYWxsQXJncztcbiAgICAgICAgICB9XG4gICAgICAgICAgaWYgKGNvbXB1dGVkRGF0YS5sZW5ndGggPT09IDEpIHtcbiAgICAgICAgICAgIGNvbnN0IFtjb21wdXRlZFRlbnNvciwgY29tcHV0ZWRNYXNrXSA9IGNvbXB1dGVkRGF0YVswXTtcbiAgICAgICAgICAgIGlmIChrd2FyZ3NbJ21hc2snXSA9PSBudWxsKSB7XG4gICAgICAgICAgICAgIGt3YXJnc1snbWFzayddID0gY29tcHV0ZWRNYXNrO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgb3V0cHV0VGVuc29ycyA9XG4gICAgICAgICAgICAgICAgZ2VuZXJpY191dGlscy50b0xpc3QobGF5ZXIuY2FsbChjb21wdXRlZFRlbnNvciwga3dhcmdzKSk7XG4gICAgICAgICAgICBvdXRwdXRNYXNrcyA9IGdlbmVyaWNfdXRpbHMudG9MaXN0KFxuICAgICAgICAgICAgICAgIGxheWVyLmNvbXB1dGVNYXNrKGNvbXB1dGVkVGVuc29yLCBjb21wdXRlZE1hc2spKTtcbiAgICAgICAgICAgIGNvbXB1dGVkVGVuc29ycyA9IFtjb21wdXRlZFRlbnNvcl07XG4gICAgICAgICAgICBjb21wdXRlZE1hc2tzID0gW2NvbXB1dGVkTWFza107XG4gICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIGNvbXB1dGVkVGVuc29ycyA9IGNvbXB1dGVkRGF0YS5tYXAoeCA9PiB4WzBdKTtcbiAgICAgICAgICAgIGNvbXB1dGVkTWFza3MgPSBjb21wdXRlZERhdGEubWFwKHggPT4geFsxXSk7XG4gICAgICAgICAgICBpZiAoa3dhcmdzWydtYXNrJ10gPT0gbnVsbCkge1xuICAgICAgICAgICAgICBrd2FyZ3NbJ21hc2snXSA9IGNvbXB1dGVkTWFza3M7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBvdXRwdXRUZW5zb3JzID1cbiAgICAgICAgICAgICAgICBnZW5lcmljX3V0aWxzLnRvTGlzdChsYXllci5jYWxsKGNvbXB1dGVkVGVuc29ycywga3dhcmdzKSk7XG4gICAgICAgICAgICBvdXRwdXRNYXNrcyA9IGdlbmVyaWNfdXRpbHMudG9MaXN0KFxuICAgICAgICAgICAgICAgIGxheWVyLmNvbXB1dGVNYXNrKGNvbXB1dGVkVGVuc29ycywgY29tcHV0ZWRNYXNrcykpO1xuICAgICAgICAgIH1cblxuICAgICAgICAgIGlmIChsYXllci5hY3Rpdml0eVJlZ3VsYXJpemVyKSB7XG4gICAgICAgICAgICB0aHJvdyBuZXcgTm90SW1wbGVtZW50ZWRFcnJvcihcbiAgICAgICAgICAgICAgICAnTGF5ZXJzTW9kZWwgaW52b2NhdGlvbiB3aXRoIGNvbmNyZXRlIFRlbnNvciB2YWx1ZShzKSBpbiB0aGUgJyArXG4gICAgICAgICAgICAgICAgJ3ByZXNlbmNlIG9mIGFjdGl2aXR5IHJlZ3VsYXJpemVyKHMpIGlzIG5vdCBzdXBwb3J0ZWQgeWV0LicpO1xuICAgICAgICAgIH1cbiAgICAgICAgICAvLyBUT0RPKG1pY2hhZWx0ZXJyeSk6IEFkZCBtb2RlbCB1cGRhdGVzIGFuZCBsb3NzZXNcblxuICAgICAgICAgIC8vIFVwZGF0ZSB0ZW5zb3IgbWFwLlxuICAgICAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgcmVmZXJlbmNlT3V0cHV0VGVuc29ycy5sZW5ndGg7ICsraSkge1xuICAgICAgICAgICAgY29uc3QgeCA9IHJlZmVyZW5jZU91dHB1dFRlbnNvcnNbaV07XG4gICAgICAgICAgICBjb25zdCB5ID0gb3V0cHV0VGVuc29yc1tpXTtcbiAgICAgICAgICAgIGNvbnN0IG1hc2sgPSBvdXRwdXRNYXNrc1tpXTtcbiAgICAgICAgICAgIHRlbnNvck1hcFt4LmlkXSA9IFt5LCBtYXNrXTtcbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9XG5cbiAgICBjb25zdCBvdXRwdXRUZW5zb3JzOiBUZW5zb3JbXSA9IFtdO1xuICAgIGNvbnN0IG91dHB1dE1hc2tzOiBUZW5zb3JbXSA9IFtdO1xuICAgIGNvbnN0IG91dHB1dFNoYXBlczogU2hhcGVbXSA9IFtdO1xuICAgIGZvciAoY29uc3QgeCBvZiB0aGlzLm91dHB1dHMpIHtcbiAgICAgIGdlbmVyaWNfdXRpbHMuYXNzZXJ0KFxuICAgICAgICAgIHguaWQgaW4gdGVuc29yTWFwLCBgQ291bGQgbm90IGNvbXB1dGUgb3V0cHV0ICR7eC5uYW1lfSA6ICR7eC5pZH1gKTtcbiAgICAgIGNvbnN0IFt0ZW5zb3IsIG1hc2tdID0gdGVuc29yTWFwW3guaWRdO1xuICAgICAgb3V0cHV0U2hhcGVzLnB1c2godGVuc29yLnNoYXBlKTtcbiAgICAgIG91dHB1dFRlbnNvcnMucHVzaCh0ZW5zb3IpO1xuICAgICAgb3V0cHV0TWFza3MucHVzaChtYXNrKTtcbiAgICB9XG5cbiAgICAvLyBUT0RPKG1pY2hhZWx0ZXJyeSk6IEFkZCBzdXBwb3J0IGZvciBjYWNoZXMuXG4gICAgcmV0dXJuIFtvdXRwdXRUZW5zb3JzLCBvdXRwdXRNYXNrcywgb3V0cHV0U2hhcGVzXTtcbiAgfVxuXG4gIC8qKlxuICAgKiBCdWlsZHMgYSBtYXAgb2YgaW50ZXJuYWwgbm9kZSBrZXlzIHRvIG5vZGUgb3JkZXJpbmcuXG4gICAqIFVzZWQgaW4gc2VyaWFsaXphaW9uIGEgbm9kZSBvcmRlcmluZ3MgbWF5IGNoYW5nZSBhcyB1bnVzZWQgbm9kZXMgYXJlXG4gICAqIGRyb3BwZWQuIFBvcnRpbmcgTm90ZTogIFRoaXMgaGVscGVyIG1ldGhvZCB3YXMgcHVsbGVkIG91dCBvZiBnZXRDb25maWcgdG9cbiAgICogaW1wcm92ZSByZWFkYWJpbGl0eS5cbiAgICogQHBhcmFtIGxheWVycyBBbiBhcnJheSBvZiBMYXllcnMgaW4gdGhlIG1vZGVsLlxuICAgKiBAcmV0dXJucyBNYXAgb2YgTm9kZSBLZXlzIHRvIGluZGV4IG9yZGVyIHdpdGhpbiB0aGUgbGF5ZXIuXG4gICAqL1xuICBwcml2YXRlIGJ1aWxkTm9kZUNvbnZlcnNpb25NYXAobGF5ZXJzOiBMYXllcltdKToge1tub2RlS2V5OiBzdHJpbmddOiBudW1iZXJ9IHtcbiAgICBjb25zdCBub2RlQ29udmVyc2lvbk1hcDoge1tub2RlS2V5OiBzdHJpbmddOiBudW1iZXJ9ID0ge307XG4gICAgbGV0IGtlcHROb2RlczogbnVtYmVyO1xuICAgIGZvciAoY29uc3QgbGF5ZXIgb2YgdGhpcy5sYXllcnMpIHtcbiAgICAgIGtlcHROb2RlcyA9IGxheWVyIGluc3RhbmNlb2YgQ29udGFpbmVyID8gMSA6IDA7XG4gICAgICBmb3IgKGxldCBvcmlnaW5hbE5vZGVJbmRleCA9IDA7XG4gICAgICAgICAgIG9yaWdpbmFsTm9kZUluZGV4IDwgbGF5ZXIuaW5ib3VuZE5vZGVzLmxlbmd0aDsgb3JpZ2luYWxOb2RlSW5kZXgrKykge1xuICAgICAgICBjb25zdCBub2RlS2V5ID0gQ29udGFpbmVyLm5vZGVLZXkobGF5ZXIsIG9yaWdpbmFsTm9kZUluZGV4KTtcbiAgICAgICAgaWYgKHRoaXMuY29udGFpbmVyTm9kZXMuaGFzKG5vZGVLZXkpKSB7XG4gICAgICAgICAgLy8gaS5lLiB3ZSBtYXJrIGl0IHRvIGJlIHNhdmVkXG4gICAgICAgICAgbm9kZUNvbnZlcnNpb25NYXBbbm9kZUtleV0gPSBrZXB0Tm9kZXM7XG4gICAgICAgICAga2VwdE5vZGVzICs9IDE7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9XG4gICAgcmV0dXJuIG5vZGVDb252ZXJzaW9uTWFwO1xuICB9XG5cbiAgLyoqXG4gICAqIFJldHJpZXZlcyBhIGxheWVyIGJhc2VkIG9uIGVpdGhlciBpdHMgbmFtZSAodW5pcXVlKSBvciBpbmRleC5cbiAgICpcbiAgICogSW5kaWNlcyBhcmUgYmFzZWQgb24gb3JkZXIgb2YgaG9yaXpvbnRhbCBncmFwaCB0cmF2ZXJzYWwgKGJvdHRvbS11cCkuXG4gICAqXG4gICAqIElmIGJvdGggYG5hbWVgIGFuZCBgaW5kZXhgIGFyZSBzcGVjaWZpZWQsIGBpbmRleGAgdGFrZXMgcHJlY2VkZW5jZS5cbiAgICpcbiAgICogQHBhcmFtIG5hbWUgTmFtZSBvZiBsYXllci5cbiAgICogQHBhcmFtIGluZGV4IEluZGV4IG9mIGxheWVyLlxuICAgKiBAcmV0dXJucyBBIExheWVyIGluc3RhbmNlLlxuICAgKiBAdGhyb3dzIFZhbHVlRXJyb3I6IEluIGNhc2Ugb2YgaW52YWxpZCBsYXllciBuYW1lIG9yIGluZGV4LlxuICAgKlxuICAgKiBAZG9jIHtcbiAgICogICAgaGVhZGluZzogJ0xheWVycycsXG4gICAqICAgIHN1YmhlYWRpbmc6ICdDbGFzc2VzJyxcbiAgICogICAgbmFtZXNwYWNlOiAnbGF5ZXJzJyxcbiAgICogICAgc3ViY2xhc3NlczogWydMYXllcnNNb2RlbCddXG4gICAqIH1cbiAgICovXG4gIGdldExheWVyKG5hbWU/OiBzdHJpbmcsIGluZGV4PzogbnVtYmVyKTogTGF5ZXIge1xuICAgIGlmIChpbmRleCAhPSBudWxsKSB7XG4gICAgICBpZiAodGhpcy5sYXllcnMubGVuZ3RoIDw9IGluZGV4KSB7XG4gICAgICAgIHRocm93IG5ldyBWYWx1ZUVycm9yKFxuICAgICAgICAgICAgYFdhcyBhc2tlZCB0byByZXRyaWV2ZSBsYXllciBhdCBpbmRleCAke2luZGV4fSwgYnV0IG1vZGVsIG9ubHkgYCArXG4gICAgICAgICAgICBgaGFzICR7dGhpcy5sYXllcnMubGVuZ3RofSBsYXllcihzKS5gKTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHJldHVybiB0aGlzLmxheWVyc1tpbmRleF07XG4gICAgICB9XG4gICAgfSBlbHNlIHtcbiAgICAgIGlmIChuYW1lID09IG51bGwpIHtcbiAgICAgICAgdGhyb3cgbmV3IFZhbHVlRXJyb3IoJ1Byb3ZpZGUgZWl0aGVyIGEgbGF5ZXIgbmFtZSBvciBsYXllciBpbmRleCcpO1xuICAgICAgfVxuICAgIH1cblxuICAgIGZvciAoY29uc3QgbGF5ZXIgb2YgdGhpcy5sYXllcnMpIHtcbiAgICAgIGlmIChsYXllci5uYW1lID09PSBuYW1lKSB7XG4gICAgICAgIHJldHVybiBsYXllcjtcbiAgICAgIH1cbiAgICB9XG4gICAgdGhyb3cgbmV3IFZhbHVlRXJyb3IoYE5vIHN1Y2ggbGF5ZXI6ICR7bmFtZX1gKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBSZXRyaWV2ZXMgdGhlIENvbnRhaW5lcidzIGN1cnJlbnQgbG9zcyB2YWx1ZXMuXG4gICAqXG4gICAqIFVzZWQgZm9yIHJlZ3VsYXJpemVycyBkdXJpbmcgdHJhaW5pbmcuXG4gICAqL1xuICBjYWxjdWxhdGVMb3NzZXMoKTogU2NhbGFyW10ge1xuICAgIC8vIFBvcnRpbmcgTm9kZTogVGhpcyBpcyBhbiBhdWdtZW50YXRpb24gdG8gQ29udGFpbmVyLmxvc3MgaW4gUHlLZXJhcy5cbiAgICAvLyAgIEluIFB5S2VyYXMsIENvbnRhaW5lci5sb3NzIHJldHVybnMgc3ltYm9saWMgdGVuc29ycy4gSGVyZSBhIGNvbmNyZXRlXG4gICAgLy8gICBUZW5zb3IgKHNwZWNpZmljYWxseSBTY2FsYXIpIHZhbHVlcyBhcmUgcmV0dXJuZWQuIFRoaXMgaXMgZHVlIHRvIHRoZVxuICAgIC8vICAgaW1wZXJhdGl2ZSBiYWNrZW5kLlxuICAgIHJldHVybiB0aWR5KCgpID0+IHtcbiAgICAgIGNvbnN0IGxvc3NlczogU2NhbGFyW10gPSBbXTtcbiAgICAgIGZvciAoY29uc3QgbGF5ZXIgb2YgdGhpcy5sYXllcnMpIHtcbiAgICAgICAgZm9yIChsZXQgbm9kZUluZGV4ID0gMDsgbm9kZUluZGV4IDwgbGF5ZXIuaW5ib3VuZE5vZGVzLmxlbmd0aDtcbiAgICAgICAgICAgICArK25vZGVJbmRleCkge1xuICAgICAgICAgIGNvbnN0IG5vZGVLZXkgPSBDb250YWluZXIubm9kZUtleShsYXllciwgbm9kZUluZGV4KTtcbiAgICAgICAgICBpZiAodGhpcy5jb250YWluZXJOb2Rlcy5oYXMobm9kZUtleSkpIHtcbiAgICAgICAgICAgIGxvc3Nlcy5wdXNoKC4uLmxheWVyLmNhbGN1bGF0ZUxvc3NlcygpKTtcbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICAgIC8vIFRPRE8oY2Fpcyk6IEFkZCBhbnkgdW5jb25kaXRpb25hbCBtb2RlbC1sZXZlbCBsb3NzZXM/XG4gICAgICByZXR1cm4gbG9zc2VzO1xuICAgIH0pO1xuICB9XG5cbiAgZ2V0Q29uZmlnKCk6IHNlcmlhbGl6YXRpb24uQ29uZmlnRGljdCB7XG4gICAgY29uc3QgY29uZmlnOiBzZXJpYWxpemF0aW9uLkNvbmZpZ0RpY3QgPSB7bmFtZTogdGhpcy5uYW1lfTtcblxuICAgIC8vIEJ1aWxkIGEgbWFwIGZyb20gbGF5ZXIgdW5pcXVlIG5hbWUgKHNlbGYuX25vZGVfa2V5KVxuICAgIC8vIHRvIHRoZSBpbmRleCBvZiB0aGUgbm9kZXMgdGhhdCBhcmUgc2F2ZWQgaW4gdGhlIGNvbmZpZy5cbiAgICAvLyBPbmx5IG5vZGVzIGluIGNvbnRhaW5lcl9ub2RlcyBhcmUgc2F2ZWQuXG4gICAgY29uc3Qgbm9kZUNvbnZlcnNpb25NYXA6IHtbbm9kZUtleTogc3RyaW5nXTogbnVtYmVyfSA9XG4gICAgICAgIHRoaXMuYnVpbGROb2RlQ29udmVyc2lvbk1hcCh0aGlzLmxheWVycyk7XG5cbiAgICAvLyBTZXJpYWxpemUgYW5kIHNhdmUgdGhlIGxheWVycyBpbiBsYXllckNvbmZpZ3NcbiAgICBjb25zdCBsYXllckNvbmZpZ3MgPSBbXTtcbiAgICBmb3IgKGNvbnN0IGxheWVyIG9mIHRoaXMubGF5ZXJzKSB7XG4gICAgICBjb25zdCBsYXllckNsYXNzTmFtZSA9IGxheWVyLmdldENsYXNzTmFtZSgpO1xuICAgICAgY29uc3QgbGF5ZXJDb25maWcgPSBsYXllci5nZXRDb25maWcoKTtcbiAgICAgIGNvbnN0IGZpbHRlcmVkSW5ib3VuZE5vZGVzID0gW107XG4gICAgICBmb3IgKGxldCBvcmlnaW5hbE5vZGVJbmRleCA9IDA7XG4gICAgICAgICAgIG9yaWdpbmFsTm9kZUluZGV4IDwgbGF5ZXIuaW5ib3VuZE5vZGVzLmxlbmd0aDsgb3JpZ2luYWxOb2RlSW5kZXgrKykge1xuICAgICAgICBjb25zdCBub2RlID0gbGF5ZXIuaW5ib3VuZE5vZGVzW29yaWdpbmFsTm9kZUluZGV4XTtcbiAgICAgICAgY29uc3Qgbm9kZUtleSA9IENvbnRhaW5lci5ub2RlS2V5KGxheWVyLCBvcmlnaW5hbE5vZGVJbmRleCk7XG4gICAgICAgIGxldCBrd2FyZ3MgPSB7fTtcbiAgICAgICAgaWYgKHRoaXMuY29udGFpbmVyTm9kZXMuaGFzKG5vZGVLZXkpKSB7XG4gICAgICAgICAgLy8gVGhlIG5vZGUgaXMgcmVsZXZhbnQgdG8gdGhlIG1vZGVsOlxuICAgICAgICAgIC8vIGFkZCB0byBmaWx0ZXJlZEluYm91bmROb2Rlcy5cbiAgICAgICAgICBpZiAobm9kZS5jYWxsQXJncykge1xuICAgICAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgICAgSlNPTi5zdHJpbmdpZnkobm9kZS5jYWxsQXJncyk7XG4gICAgICAgICAgICAgIGt3YXJncyA9IG5vZGUuY2FsbEFyZ3M7XG4gICAgICAgICAgICB9IGNhdGNoIChlcnIpIHtcbiAgICAgICAgICAgICAgY29uc29sZS53YXJuKFxuICAgICAgICAgICAgICAgICAgYExheWVyICR7bGF5ZXIubmFtZX0gd2FzIHBhc3NlZCBgICtcbiAgICAgICAgICAgICAgICAgIGBub24tc2VyaWFsaXphYmxlIGtleXdvcmQgYXJndW1lbnRzOiBgICtcbiAgICAgICAgICAgICAgICAgIGAke25vZGUuY2FsbEFyZ3N9LiBUaGV5IHdpbGwgbm90IGJlIGluY2x1ZGVkIGAgK1xuICAgICAgICAgICAgICAgICAgYGluIHRoZSBzZXJpYWxpemVkIG1vZGVsIChhbmQgdGh1cyB3aWxsIGJlIGAgK1xuICAgICAgICAgICAgICAgICAgYG1pc3NpbmcgYXQgZGVzZXJpYWxpemF0aW9uIHRpbWUpLmApO1xuICAgICAgICAgICAgICBrd2FyZ3MgPSB7fTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9XG4gICAgICAgICAgaWYgKG5vZGUuaW5ib3VuZExheWVycy5sZW5ndGggPiAwKSB7XG4gICAgICAgICAgICBjb25zdCBub2RlRGF0YSA9IFtdO1xuICAgICAgICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCBub2RlLmluYm91bmRMYXllcnMubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgICAgICAgY29uc3QgaW5ib3VuZExheWVyID0gbm9kZS5pbmJvdW5kTGF5ZXJzW2ldO1xuICAgICAgICAgICAgICBjb25zdCBub2RlSW5kZXggPSBub2RlLm5vZGVJbmRpY2VzW2ldO1xuICAgICAgICAgICAgICBjb25zdCB0ZW5zb3JJbmRleCA9IG5vZGUudGVuc29ySW5kaWNlc1tpXTtcbiAgICAgICAgICAgICAgY29uc3Qgbm9kZUtleSA9IENvbnRhaW5lci5ub2RlS2V5KGluYm91bmRMYXllciwgbm9kZUluZGV4KTtcbiAgICAgICAgICAgICAgbGV0IG5ld05vZGVJbmRleCA9IG5vZGVDb252ZXJzaW9uTWFwW25vZGVLZXldO1xuICAgICAgICAgICAgICBpZiAobmV3Tm9kZUluZGV4ID09IG51bGwpIHtcbiAgICAgICAgICAgICAgICBuZXdOb2RlSW5kZXggPSAwO1xuICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgIG5vZGVEYXRhLnB1c2goXG4gICAgICAgICAgICAgICAgICBbaW5ib3VuZExheWVyLm5hbWUsIG5ld05vZGVJbmRleCwgdGVuc29ySW5kZXgsIGt3YXJnc10pO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgZmlsdGVyZWRJbmJvdW5kTm9kZXMucHVzaChub2RlRGF0YSk7XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICB9XG4gICAgICBjb25zdCBkaWN0OiBzZXJpYWxpemF0aW9uLkNvbmZpZ0RpY3QgPSB7fTtcbiAgICAgIGRpY3RbJ25hbWUnXSA9IGxheWVyLm5hbWU7XG4gICAgICBkaWN0WydjbGFzc05hbWUnXSA9IGxheWVyQ2xhc3NOYW1lO1xuICAgICAgZGljdFsnY29uZmlnJ10gPSBsYXllckNvbmZpZztcbiAgICAgIGRpY3RbJ2luYm91bmROb2RlcyddID0gZmlsdGVyZWRJbmJvdW5kTm9kZXM7XG4gICAgICBsYXllckNvbmZpZ3MucHVzaChkaWN0KTtcbiAgICB9XG4gICAgY29uZmlnWydsYXllcnMnXSA9IGxheWVyQ29uZmlncztcbiAgICAvLyBHYXRoZXIgaW5mbyBhYm91dCBpbnB1dHMgYW5kIG91dHB1dHNcbiAgICBjb25zdCBtb2RlbElucHV0cyA9IFtdO1xuICAgIGZvciAobGV0IGkgPSAwOyBpIDwgdGhpcy5pbnB1dExheWVycy5sZW5ndGg7IGkrKykge1xuICAgICAgY29uc3QgbGF5ZXIgPSB0aGlzLmlucHV0TGF5ZXJzW2ldO1xuICAgICAgY29uc3Qgbm9kZUluZGV4ID0gdGhpcy5pbnB1dExheWVyc05vZGVJbmRpY2VzW2ldO1xuXG4gICAgICBjb25zdCBub2RlS2V5ID0gQ29udGFpbmVyLm5vZGVLZXkobGF5ZXIsIG5vZGVJbmRleCk7XG4gICAgICBpZiAoIXRoaXMuY29udGFpbmVyTm9kZXMuaGFzKG5vZGVLZXkpKSB7XG4gICAgICAgIGNvbnRpbnVlO1xuICAgICAgfVxuICAgICAgbGV0IG5ld05vZGVJbmRleCA9IG5vZGVDb252ZXJzaW9uTWFwW25vZGVLZXldO1xuICAgICAgaWYgKG5ld05vZGVJbmRleCA9PT0gbnVsbCB8fCBuZXdOb2RlSW5kZXggPT09IHVuZGVmaW5lZCkge1xuICAgICAgICBuZXdOb2RlSW5kZXggPSAwO1xuICAgICAgfVxuICAgICAgY29uc3QgdGVuc29ySW5kZXggPSB0aGlzLmlucHV0TGF5ZXJzVGVuc29ySW5kaWNlc1tpXTtcbiAgICAgIG1vZGVsSW5wdXRzLnB1c2goW2xheWVyLm5hbWUsIG5ld05vZGVJbmRleCwgdGVuc29ySW5kZXhdKTtcbiAgICB9XG4gICAgY29uZmlnWydpbnB1dExheWVycyddID0gbW9kZWxJbnB1dHM7XG5cbiAgICBjb25zdCBtb2RlbE91dHB1dHMgPSBbXTtcbiAgICBmb3IgKGxldCBpID0gMDsgaSA8IHRoaXMub3V0cHV0TGF5ZXJzLmxlbmd0aDsgaSsrKSB7XG4gICAgICBjb25zdCBsYXllciA9IHRoaXMub3V0cHV0TGF5ZXJzW2ldO1xuICAgICAgY29uc3Qgbm9kZUluZGV4ID0gdGhpcy5vdXRwdXRMYXllcnNOb2RlSW5kaWNlc1tpXTtcblxuICAgICAgY29uc3Qgbm9kZUtleSA9IENvbnRhaW5lci5ub2RlS2V5KGxheWVyLCBub2RlSW5kZXgpO1xuICAgICAgaWYgKCF0aGlzLmNvbnRhaW5lck5vZGVzLmhhcyhub2RlS2V5KSkge1xuICAgICAgICBjb250aW51ZTtcbiAgICAgIH1cbiAgICAgIGxldCBuZXdOb2RlSW5kZXggPSBub2RlQ29udmVyc2lvbk1hcFtub2RlS2V5XTtcbiAgICAgIGlmIChuZXdOb2RlSW5kZXggPT09IG51bGwgfHwgbmV3Tm9kZUluZGV4ID09PSB1bmRlZmluZWQpIHtcbiAgICAgICAgbmV3Tm9kZUluZGV4ID0gMDtcbiAgICAgIH1cbiAgICAgIGNvbnN0IHRlbnNvckluZGV4ID0gdGhpcy5vdXRwdXRMYXllcnNUZW5zb3JJbmRpY2VzW2ldO1xuICAgICAgbW9kZWxPdXRwdXRzLnB1c2goW2xheWVyLm5hbWUsIG5ld05vZGVJbmRleCwgdGVuc29ySW5kZXhdKTtcbiAgICB9XG4gICAgY29uZmlnWydvdXRwdXRMYXllcnMnXSA9IG1vZGVsT3V0cHV0cztcbiAgICByZXR1cm4gY29uZmlnO1xuICB9XG5cbiAgLyoqXG4gICAqIEluc3RhbnRpYXRlcyBhIExheWVyc01vZGVsIGZyb20gaXRzIGNvbmZpZyAob3V0cHV0IG9mIGBnZXRfY29uZmlnKClgKS5cbiAgICogQHBhcmFtIGNscyB0aGUgY2xhc3MgdG8gY3JlYXRlXG4gICAqIEBwYXJhbSBjb25maWcgTGF5ZXJzTW9kZWwgY29uZmlnIGRpY3Rpb25hcnkuXG4gICAqIEBwYXJhbSBjdXN0b21PYmplY3RzIEFuIG9wdGlvbmFsIGRpY3Rpb25hcnkgb2YgY3VzdG9tIG9iamVjdHMuXG4gICAqIEBwYXJhbSBmYXN0V2VpZ2h0SW5pdCBPcHRpb25hbCBmbGFnIHRvIHVzZSBmYXN0IHdlaWdodCBpbml0aWFsaXphdGlvblxuICAgKiAgIGR1cmluZyBkZXNlcmlhbGl6YXRpb24uIFRoaXMgaXMgYXBwbGljYWJsZSB0byBjYXNlcyBpbiB3aGljaFxuICAgKiAgIHRoZSBpbml0aWFsaXphdGlvbiB3aWxsIGJlIGltbWVkaWF0ZWx5IG92ZXJ3cml0dGVuIGJ5IGxvYWRlZCB3ZWlnaHRcbiAgICogICB2YWx1ZXMuIERlZmF1bHQ6IGBmYWxzZWAuXG4gICAqIEByZXR1cm5zIEEgTGF5ZXJzTW9kZWwgaW5zdGFuY2UuXG4gICAqIEB0aHJvd3MgVmFsdWVFcnJvcjogSW4gY2FzZSBvZiBpbXByb3Blcmx5IGZvcm1hdHRlZCBjb25maWcgZGljdC5cbiAgICovXG4gIC8qKiBAbm9jb2xsYXBzZSAqL1xuICBzdGF0aWMgZnJvbUNvbmZpZzxUIGV4dGVuZHMgc2VyaWFsaXphdGlvbi5TZXJpYWxpemFibGU+KFxuICAgICAgY2xzOiBzZXJpYWxpemF0aW9uLlNlcmlhbGl6YWJsZUNvbnN0cnVjdG9yPFQ+LFxuICAgICAgY29uZmlnOiBzZXJpYWxpemF0aW9uLkNvbmZpZ0RpY3QsXG4gICAgICBjdXN0b21PYmplY3RzID0ge30gYXMgc2VyaWFsaXphdGlvbi5Db25maWdEaWN0LFxuICAgICAgZmFzdFdlaWdodEluaXQgPSBmYWxzZSk6IFQge1xuICAgIC8vIExheWVyIGluc3RhbmNlcyBjcmVhdGVkIGR1cmluZ1xuICAgIC8vIHRoZSBncmFwaCByZWNvbnN0cnVjdGlvbiBwcm9jZXNzXG4gICAgY29uc3QgY3JlYXRlZExheWVyczoge1tsYXllck5hbWU6IHN0cmluZ106IExheWVyfSA9IHt9O1xuXG4gICAgLy8gRGljdGlvbmFyeSBtYXBwaW5nIGxheWVyIGluc3RhbmNlcyB0b1xuICAgIC8vIG5vZGUgZGF0YSB0aGF0IHNwZWNpZmllcyBhIGxheWVyIGNhbGwuXG4gICAgLy8gSXQgYWN0cyBhcyBhIHF1ZXVlIHRoYXQgbWFpbnRhaW5zIGFueSB1bnByb2Nlc3NlZFxuICAgIC8vIGxheWVyIGNhbGwgdW50aWwgaXQgYmVjb21lcyBwb3NzaWJsZSB0byBwcm9jZXNzIGl0XG4gICAgLy8gKGkuZS4gdW50aWwgdGhlIGlucHV0IHRlbnNvcnMgdG8gdGhlIGNhbGwgYWxsIGV4aXN0KS5cbiAgICBjb25zdCB1bnByb2Nlc3NlZE5vZGVzOiB7W2xheWVyOiBzdHJpbmddOiBUZW5zb3JLZXlXaXRoQXJnc0FycmF5W11bXX0gPSB7fTtcbiAgICBmdW5jdGlvbiBhZGRVbnByb2Nlc3NlZE5vZGUoXG4gICAgICAgIGxheWVyOiBMYXllciwgbm9kZURhdGE6IFRlbnNvcktleVdpdGhBcmdzQXJyYXlbXSkge1xuICAgICAgaWYgKCEobGF5ZXIubmFtZSBpbiB1bnByb2Nlc3NlZE5vZGVzKSkge1xuICAgICAgICB1bnByb2Nlc3NlZE5vZGVzW2xheWVyLm5hbWVdID0gW25vZGVEYXRhXTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHVucHJvY2Vzc2VkTm9kZXNbbGF5ZXIubmFtZV0ucHVzaChub2RlRGF0YSk7XG4gICAgICB9XG4gICAgfVxuXG4gICAgZnVuY3Rpb24gcHJvY2Vzc05vZGUobGF5ZXI6IExheWVyLCBub2RlRGF0YTogVGVuc29yS2V5V2l0aEFyZ3NBcnJheVtdKSB7XG4gICAgICBjb25zdCBpbnB1dFRlbnNvcnM6IFN5bWJvbGljVGVuc29yW10gPSBbXTtcbiAgICAgIGxldCBrd2FyZ3M7XG4gICAgICBmb3IgKGNvbnN0IGlucHV0RGF0YSBvZiBub2RlRGF0YSkge1xuICAgICAgICBjb25zdCBpbmJvdW5kTGF5ZXJOYW1lID0gaW5wdXREYXRhWzBdO1xuICAgICAgICBjb25zdCBpbmJvdW5kTm9kZUluZGV4ID0gaW5wdXREYXRhWzFdO1xuICAgICAgICBjb25zdCBpbmJvdW5kVGVuc29ySW5kZXggPSBpbnB1dERhdGFbMl07XG5cbiAgICAgICAga3dhcmdzID0gaW5wdXREYXRhWzNdID09IG51bGwgP1xuICAgICAgICAgICAge30gOlxuICAgICAgICAgICAgaW5wdXREYXRhWzNdIGFzIHNlcmlhbGl6YXRpb24uQ29uZmlnRGljdDtcbiAgICAgICAgaWYgKCEoaW5ib3VuZExheWVyTmFtZSBpbiBjcmVhdGVkTGF5ZXJzKSkge1xuICAgICAgICAgIGFkZFVucHJvY2Vzc2VkTm9kZShsYXllciwgbm9kZURhdGEpO1xuICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuICAgICAgICBjb25zdCBpbmJvdW5kTGF5ZXIgPSBjcmVhdGVkTGF5ZXJzW2luYm91bmRMYXllck5hbWVdO1xuICAgICAgICBpZiAoaW5ib3VuZExheWVyLmluYm91bmROb2Rlcy5sZW5ndGggPD0gaW5ib3VuZE5vZGVJbmRleCkge1xuICAgICAgICAgIGFkZFVucHJvY2Vzc2VkTm9kZShsYXllciwgbm9kZURhdGEpO1xuICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuICAgICAgICBjb25zdCBpbmJvdW5kTm9kZSA9IGluYm91bmRMYXllci5pbmJvdW5kTm9kZXNbaW5ib3VuZE5vZGVJbmRleF07XG4gICAgICAgIGlucHV0VGVuc29ycy5wdXNoKGluYm91bmROb2RlLm91dHB1dFRlbnNvcnNbaW5ib3VuZFRlbnNvckluZGV4XSk7XG4gICAgICB9XG4gICAgICAvLyBDYWxsIGxheWVyIG9uIGl0cyBpbnB1dHMsIHRodXMgY3JlYXRpbmcgdGhlIG5vZGVcbiAgICAgIC8vIGFuZCBidWlsZGluZyB0aGUgbGF5ZXIgaWYgbmVlZGVkLlxuICAgICAgLy8gTm90ZTogVGhpcyBoYXMgRWFnZXIgdnMgR3JhcGggSW1wbGljYXRpb25zLlxuICAgICAgaWYgKGlucHV0VGVuc29ycy5sZW5ndGggPiAwKSB7XG4gICAgICAgIGxheWVyLmFwcGx5KFxuICAgICAgICAgICAgZ2VuZXJpY191dGlscy5zaW5nbGV0b25PckFycmF5KGlucHV0VGVuc29ycyksXG4gICAgICAgICAgICBrd2FyZ3MpOyAgLy8gd2FzICoqIGt3YXJnc1xuICAgICAgfVxuICAgIH1cblxuICAgIC8qKlxuICAgICAqIERlc2VyaWFsaXplIGEgbGF5ZXIsIHRoZW4gY2FsbCBpdCBvbiBhcHByb3ByaWF0ZSBpbnB1dHMuXG4gICAgICogQHBhcmFtIGxheWVyRGF0YTogbGF5ZXIgY29uZmlnIGRpY3QuXG4gICAgICogQHRocm93cyBWYWx1ZUVycm9yOiBJbiBjYXNlIG9mIGltcHJvcGVybHkgZm9ybWF0dGVkIGBsYXllcl9kYXRhYFxuICAgICAqIGRpY3QuXG4gICAgICovXG4gICAgZnVuY3Rpb24gcHJvY2Vzc0xheWVyKGxheWVyRGF0YTogc2VyaWFsaXphdGlvbi5Db25maWdEaWN0fG51bGwpIHtcbiAgICAgIGNvbnN0IGxheWVyTmFtZSA9IGxheWVyRGF0YVsnbmFtZSddIGFzIHN0cmluZztcbiAgICAgIC8vIEluc3RhbnRpYXRlIGxheWVyLlxuICAgICAgY29uc3QgbGF5ZXIgPVxuICAgICAgICAgIGRlc2VyaWFsaXplTGF5ZXIoXG4gICAgICAgICAgICAgIGxheWVyRGF0YSxcbiAgICAgICAgICAgICAgY29uZmlnWydjdXN0b21PYmplY3RzJ10gIT0gbnVsbCA/XG4gICAgICAgICAgICAgICAgICBjb25maWdbJ2N1c3RvbU9iamVjdHMnXSBhcyBzZXJpYWxpemF0aW9uLkNvbmZpZ0RpY3QgOlxuICAgICAgICAgICAgICAgICAge30pIGFzIExheWVyO1xuICAgICAgbGF5ZXIuc2V0RmFzdFdlaWdodEluaXREdXJpbmdCdWlsZChmYXN0V2VpZ2h0SW5pdCk7XG4gICAgICBjcmVhdGVkTGF5ZXJzW2xheWVyTmFtZV0gPSBsYXllcjtcbiAgICAgIC8vIEdhdGhlciBsYXllciBpbnB1dHMuXG4gICAgICBjb25zdCBpbmJvdW5kTm9kZXNEYXRhID1cbiAgICAgICAgICBsYXllckRhdGFbJ2luYm91bmROb2RlcyddIGFzIFRlbnNvcktleVdpdGhBcmdzQXJyYXlbXVtdO1xuICAgICAgaW5ib3VuZE5vZGVzRGF0YS5mb3JFYWNoKG5vZGVEYXRhID0+IHtcbiAgICAgICAgaWYgKCEobm9kZURhdGEgaW5zdGFuY2VvZiBBcnJheSkpIHtcbiAgICAgICAgICB0aHJvdyBuZXcgVmFsdWVFcnJvcihcbiAgICAgICAgICAgICAgYENvcnJ1cHRlZCBjb25maWd1cmF0aW9uLCBleHBlY3RlZCBhcnJheSBmb3Igbm9kZURhdGE6ICR7XG4gICAgICAgICAgICAgICAgICBub2RlRGF0YX1gKTtcbiAgICAgICAgfVxuICAgICAgICAvLyBXZSBkb24ndCBwcm9jZXNzIG5vZGVzIChpLmUuIG1ha2UgbGF5ZXIgY2FsbHMpXG4gICAgICAgIC8vIG9uIHRoZSBmbHkgYmVjYXVzZSB0aGUgaW5ib3VuZCBub2RlIG1heSBub3QgeWV0IGV4aXN0LFxuICAgICAgICAvLyBpbiBjYXNlIG9mIGxheWVyIHNoYXJlZCBhdCBkaWZmZXJlbnQgdG9wb2xvZ2ljYWwgZGVwdGhzXG4gICAgICAgIC8vIChlLmcuYSBtb2RlbCBzdWNoIGFzIEEoQihBKEIoeCkpKSkpXG4gICAgICAgIGFkZFVucHJvY2Vzc2VkTm9kZShsYXllciwgbm9kZURhdGEpO1xuICAgICAgfSk7XG4gICAgfVxuXG4gICAgLy8gRmlyc3QsIHdlIGNyZWF0ZSBhbGwgbGF5ZXJzIGFuZCBlbnF1ZXVlIG5vZGVzIHRvIGJlIHByb2Nlc3NlZC5cbiAgICBjb25zdCBuYW1lID0gY29uZmlnWyduYW1lJ107XG4gICAgY29uc3QgbGF5ZXJzRnJvbUNvbmZpZyA9IGNvbmZpZ1snbGF5ZXJzJ10gYXMgc2VyaWFsaXphdGlvbi5Db25maWdEaWN0W107XG4gICAgZm9yIChjb25zdCBsYXllckRhdGEgb2YgbGF5ZXJzRnJvbUNvbmZpZykge1xuICAgICAgcHJvY2Vzc0xheWVyKGxheWVyRGF0YSk7XG4gICAgfVxuXG4gICAgLy8gVGhlbiB3ZSBwcm9jZXNzIG5vZGVzIGluIG9yZGVyIG9mIGxheWVyIGRlcHRoLlxuICAgIC8vIE5vZGVzIHRoYXQgY2Fubm90IHlldCBiZSBwcm9jZXNzZWQoaWYgdGhlIGluYm91bmQgbm9kZVxuICAgIC8vIGRvZXMgbm90IHlldCBleGlzdCkgYXJlIHJlIC0gZW5xdWV1ZWQsIGFuZCB0aGUgcHJvY2Vzc1xuICAgIC8vIGlzIHJlcGVhdGVkIHVudGlsIGFsbCBub2RlcyBhcmUgcHJvY2Vzc2VkLlxuICAgIHdoaWxlICghZ2VuZXJpY191dGlscy5pc09iamVjdEVtcHR5KHVucHJvY2Vzc2VkTm9kZXMpKSB7XG4gICAgICBmb3IgKGNvbnN0IGxheWVyRGF0YSBvZiBsYXllcnNGcm9tQ29uZmlnKSB7XG4gICAgICAgIGNvbnN0IGxheWVyID0gY3JlYXRlZExheWVyc1tsYXllckRhdGFbJ25hbWUnXSBhcyBzdHJpbmddO1xuICAgICAgICBpZiAobGF5ZXIubmFtZSBpbiB1bnByb2Nlc3NlZE5vZGVzKSB7XG4gICAgICAgICAgY29uc3QgY3VycmVudFVucHJvY2Vzc2VkTm9kZXNGb3JMYXllciA9IHVucHJvY2Vzc2VkTm9kZXNbbGF5ZXIubmFtZV07XG4gICAgICAgICAgZGVsZXRlIHVucHJvY2Vzc2VkTm9kZXNbbGF5ZXIubmFtZV07XG4gICAgICAgICAgZm9yIChjb25zdCBub2RlRGF0YSBvZiBjdXJyZW50VW5wcm9jZXNzZWROb2Rlc0ZvckxheWVyKSB7XG4gICAgICAgICAgICBwcm9jZXNzTm9kZShsYXllciwgbm9kZURhdGEpO1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgfVxuICAgIH1cblxuICAgIGNvbnN0IGlucHV0VGVuc29yczogU3ltYm9saWNUZW5zb3JbXSA9IFtdO1xuICAgIGNvbnN0IG91dHB1dFRlbnNvcnM6IFN5bWJvbGljVGVuc29yW10gPSBbXTtcbiAgICBjb25zdCBpbnB1dExheWVyc0Zyb21Db25maWcgPVxuICAgICAgICBjb25maWdbJ2lucHV0TGF5ZXJzJ10gYXMgc2VyaWFsaXphdGlvbi5Db25maWdEaWN0W107XG4gICAgZm9yIChjb25zdCBsYXllckRhdGEgb2YgaW5wdXRMYXllcnNGcm9tQ29uZmlnKSB7XG4gICAgICBjb25zdCBsYXllck5hbWUgPSBsYXllckRhdGFbMF0gYXMgc3RyaW5nO1xuICAgICAgY29uc3Qgbm9kZUluZGV4ID0gbGF5ZXJEYXRhWzFdIGFzIG51bWJlcjtcbiAgICAgIGNvbnN0IHRlbnNvckluZGV4ID0gbGF5ZXJEYXRhWzJdIGFzIG51bWJlcjtcbiAgICAgIGdlbmVyaWNfdXRpbHMuYXNzZXJ0KGxheWVyTmFtZSBpbiBjcmVhdGVkTGF5ZXJzKTtcbiAgICAgIGNvbnN0IGxheWVyID0gY3JlYXRlZExheWVyc1tsYXllck5hbWVdO1xuICAgICAgY29uc3QgbGF5ZXJPdXRwdXRUZW5zb3JzID0gbGF5ZXIuaW5ib3VuZE5vZGVzW25vZGVJbmRleF0ub3V0cHV0VGVuc29ycztcbiAgICAgIGlucHV0VGVuc29ycy5wdXNoKGxheWVyT3V0cHV0VGVuc29yc1t0ZW5zb3JJbmRleF0pO1xuICAgIH1cbiAgICBjb25zdCBvdXRwdXRMYXllcnNGcm9tQ29uZmlnID1cbiAgICAgICAgY29uZmlnWydvdXRwdXRMYXllcnMnXSBhcyBzZXJpYWxpemF0aW9uLkNvbmZpZ0RpY3RbXTtcbiAgICBmb3IgKGNvbnN0IGxheWVyRGF0YSBvZiBvdXRwdXRMYXllcnNGcm9tQ29uZmlnKSB7XG4gICAgICBjb25zdCBsYXllck5hbWUgPSBsYXllckRhdGFbMF0gYXMgc3RyaW5nO1xuICAgICAgY29uc3Qgbm9kZUluZGV4ID0gbGF5ZXJEYXRhWzFdIGFzIG51bWJlcjtcbiAgICAgIGNvbnN0IHRlbnNvckluZGV4ID0gbGF5ZXJEYXRhWzJdIGFzIG51bWJlcjtcbiAgICAgIGdlbmVyaWNfdXRpbHMuYXNzZXJ0KGxheWVyTmFtZSBpbiBjcmVhdGVkTGF5ZXJzKTtcbiAgICAgIGNvbnN0IGxheWVyID0gY3JlYXRlZExheWVyc1tsYXllck5hbWVdO1xuICAgICAgY29uc3QgbGF5ZXJPdXRwdXRUZW5zb3JzID0gbGF5ZXIuaW5ib3VuZE5vZGVzW25vZGVJbmRleF0ub3V0cHV0VGVuc29ycztcbiAgICAgIG91dHB1dFRlbnNvcnMucHVzaChsYXllck91dHB1dFRlbnNvcnNbdGVuc29ySW5kZXhdKTtcbiAgICB9XG4gICAgcmV0dXJuIG5ldyBjbHMoe2lucHV0czogaW5wdXRUZW5zb3JzLCBvdXRwdXRzOiBvdXRwdXRUZW5zb3JzLCBuYW1lfSk7XG4gIH1cblxuICAvKipcbiAgICogRGV0ZXJtaW5lIHdoZXRoZXIgdGhlIGNvbnRhaW5lciBpcyBzdGF0ZWZ1bC5cbiAgICpcbiAgICogUG9ydGluZyBOb3RlOiB0aGlzIGlzIHRoZSBlcXVpdmFsZW50IG9mIHRoZSBzdGF0ZWZ1bCBAcHJvcGVydHkgb2ZcbiAgICogICB0aGUgQ29udGFpbmVyIGNsYXNzIGluIFB5S2VyYXMuXG4gICAqL1xuICBnZXQgc3RhdGVmdWwoKTogYm9vbGVhbiB7XG4gICAgLy8gUG9ydGluZyBOb3RlOiBUaGlzIGNoZWNrIGlzIHRvIHByZXZlbnQgaW5hZHZlcnRlbnQgc2V0dGluZyBvZiB0aGVcbiAgICAvLyAgIF9zdGF0ZWZ1bCBwcm9wZXJ0eSBvZiB0aGUgQ29udGFpbmVyIGluc3RhbmNlLlxuICAgIGlmICh0aGlzLl9zdGF0ZWZ1bCkge1xuICAgICAgdGhyb3cgbmV3IFZhbHVlRXJyb3IoXG4gICAgICAgICAgJ0NvbnRhaW5lciBpbnN0YW5jZSB1bmV4cGVjdGVkbHkgaGFzIF9zdGF0ZWZ1bCA9IHRydWUuIFRoZSAnICtcbiAgICAgICAgICAnc3RhdGVmdWxuZXNzIG9mIGEgQ29udGFpbmVyIGlzIGRldGVybWluZWQgYnkgdGhlIExheWVycyBpdCAnICtcbiAgICAgICAgICAnY29udGFpbnMuIEl0cyBfc3RhdGVmdWwgcHJvcGVydHkgbXVzdCByZW1haW4gdGhlIGRlZmF1bHQgZmFsc2UuJyk7XG4gICAgfVxuICAgIGZvciAoY29uc3QgbGF5ZXIgb2YgdGhpcy5sYXllcnMpIHtcbiAgICAgIGlmIChsYXllci5zdGF0ZWZ1bCkge1xuICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICAgIH1cbiAgICB9XG4gICAgcmV0dXJuIGZhbHNlO1xuICB9XG5cbiAgLyoqXG4gICAqIFJlc2V0IHRoZSBzdGF0ZSBvZiBhbGwgc3RhdGVmdWwgY29uc3RpdHVlbnQgbGF5ZXJzIChpZiBhbnkpLlxuICAgKlxuICAgKiBFeGFtcGxlcyBvZiBzdGF0ZWZ1bCBsYXllcnMgaW5jbHVkZSBSTk4gbGF5ZXJzIHdob3NlIGBzdGF0ZWZ1bGAgcHJvcGVydHlcbiAgICogaXMgc2V0IGFzIGB0cnVlYC5cbiAgICovXG4gIHJlc2V0U3RhdGVzKCkge1xuICAgIHRpZHkoKCkgPT4ge1xuICAgICAgdGhpcy5sYXllcnMuZm9yRWFjaChsYXllciA9PiB7XG4gICAgICAgIC8vIHRzbGludDpkaXNhYmxlOm5vLWFueVxuICAgICAgICBpZiAobGF5ZXIuc3RhdGVmdWwpIHtcbiAgICAgICAgICBsYXllci5yZXNldFN0YXRlcygpO1xuICAgICAgICB9XG4gICAgICAgIC8vIHRzbGludDplbmFibGU6bm8tYW55XG4gICAgICB9KTtcbiAgICB9KTtcbiAgfVxufVxuIl19","/**\n * @license\n * Copyright 2018 Google LLC\n *\n * Use of this source code is governed by an MIT-style\n * license that can be found in the LICENSE file or at\n * https://opensource.org/licenses/MIT.\n * =============================================================================\n */\nimport { argMax, clone, dispose, mul, reshape, tensor1d, tidy } from '@tensorflow/tfjs-core';\nfunction standardizeSampleOrClassWeights(xWeight, outputNames, weightType) {\n const numOutputs = outputNames.length;\n if (xWeight == null || (Array.isArray(xWeight) && xWeight.length === 0)) {\n return outputNames.map(name => null);\n }\n if (numOutputs === 1) {\n if (Array.isArray(xWeight) && xWeight.length === 1) {\n return xWeight;\n }\n else if (typeof xWeight === 'object' && outputNames[0] in xWeight) {\n return [xWeight[outputNames[0]]];\n }\n else {\n return [xWeight];\n }\n }\n if (Array.isArray(xWeight)) {\n if (xWeight.length !== numOutputs) {\n throw new Error(`Provided ${weightType} is an array of ${xWeight.length} ` +\n `element(s), but the model has ${numOutputs} outputs. ` +\n `Make sure a set of weights is provided for each model output.`);\n }\n return xWeight;\n }\n else if (typeof xWeight === 'object' && Object.keys(xWeight).length > 0 &&\n typeof xWeight[Object.keys(xWeight)[0]] ===\n 'object') {\n const output = [];\n outputNames.forEach(outputName => {\n if (outputName in xWeight) {\n output.push(xWeight[outputName]);\n }\n else {\n output.push(null);\n }\n });\n return output;\n }\n else {\n throw new Error(`The model has multiple (${numOutputs}) outputs, ` +\n `so ${weightType} must be either an array with ` +\n `${numOutputs} elements or an object with ${outputNames} keys. ` +\n `Provided ${weightType} not understood: ${JSON.stringify(xWeight)}`);\n }\n}\n/**\n * Standardize class weighting objects.\n *\n * This function takes a single class-weighting object, an array of them,\n * or a map from output name to class-weighting object. It compares it to the\n * output name(s) of the model, base on which it outputs an array of\n * class-weighting objects of which the length matches the number of outputs.\n *\n * @param classWeight Input class-weighting object(s).\n * @param outputNames All output name(s) of the model.\n * @return An array of class-weighting objects. The length of the array matches\n * the model's number of outputs.\n */\nexport function standardizeClassWeights(classWeight, outputNames) {\n return standardizeSampleOrClassWeights(classWeight, outputNames, 'classWeight');\n}\nexport function standardizeSampleWeights(classWeight, outputNames) {\n return standardizeSampleOrClassWeights(classWeight, outputNames, 'sampleWeight');\n}\n/**\n * Standardize by-sample and/or by-class weights for training.\n *\n * Note that this function operates on one model output at a time. For a model\n * with multiple outputs, you must call this function multiple times.\n *\n * @param y The target tensor that the by-sample and/or by-class weight is for.\n * The values of y are assumed to encode the classes, either directly\n * as an integer index, or as one-hot encoding.\n * @param sampleWeight By-sample weights.\n * @param classWeight By-class weights: an object mapping class indices\n * (integers) to a weight (float) to apply to the model's loss for the\n * samples from this class during training. This can be useful to tell the\n * model to \"pay more attention\" to samples from an under-represented class.\n * @param sampleWeightMode The mode for the sample weights.\n * @return A Promise of weight tensor, of which the size of the first dimension\n * matches that of `y`.\n */\nexport async function standardizeWeights(y, sampleWeight, classWeight, sampleWeightMode) {\n if (sampleWeight != null || sampleWeightMode != null) {\n // TODO(cais): Once 'temporal' mode is implemented, document it in the doc\n // string.\n throw new Error('Support sampleWeight is not implemented yet');\n }\n if (classWeight != null) {\n // Apply class weights per sample.\n const yClasses = tidy(() => {\n if (y.shape.length === 1) {\n // Assume class indices.\n return clone(y);\n }\n else if (y.shape.length === 2) {\n if (y.shape[1] > 1) {\n // Assume one-hot encoding of classes.\n const axis = 1;\n return argMax(y, axis);\n }\n else if (y.shape[1] === 1) {\n // Class index.\n return reshape(y, [y.shape[0]]);\n }\n else {\n throw new Error(`Encountered unexpected last-dimension size (${y.shape[1]}) ` +\n `during handling of class weights. The size is expected to be ` +\n `>= 1.`);\n }\n }\n else {\n throw new Error(`Unexpected rank of target (y) tensor (${y.rank}) during ` +\n `handling of class weights. The rank is expected to be 1 or 2.`);\n }\n });\n const yClassIndices = Array.from(await yClasses.data());\n dispose(yClasses);\n const classSampleWeight = [];\n yClassIndices.forEach(classIndex => {\n if (classWeight[classIndex] == null) {\n throw new Error(`classWeight must contain all classes in the training data. ` +\n `The class ${classIndex} exists in the data but not in ` +\n `classWeight`);\n }\n else {\n classSampleWeight.push(classWeight[classIndex]);\n }\n });\n return tensor1d(classSampleWeight, 'float32');\n }\n else {\n return null;\n }\n}\n/**\n * Apply per-sample weights on the loss values from a number of samples.\n *\n * @param losses Loss tensor of shape `[batchSize]`.\n * @param sampleWeights Per-sample weight tensor of shape `[batchSize]`.\n * @returns Tensor of the same shape as`losses`.\n */\nexport function computeWeightedLoss(losses, sampleWeights) {\n return mul(losses, sampleWeights);\n}\n//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidHJhaW5pbmdfdXRpbHMuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi8uLi90ZmpzLWxheWVycy9zcmMvZW5naW5lL3RyYWluaW5nX3V0aWxzLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBOzs7Ozs7OztHQVFHO0FBRUgsT0FBTyxFQUFDLE1BQU0sRUFBRSxLQUFLLEVBQUUsT0FBTyxFQUFFLEdBQUcsRUFBRSxPQUFPLEVBQW9CLFFBQVEsRUFBRSxJQUFJLEVBQUMsTUFBTSx1QkFBdUIsQ0FBQztBQXVCN0csU0FBUywrQkFBK0IsQ0FDcEMsT0FBaUQsRUFBRSxXQUFxQixFQUN4RSxVQUF3QztJQUMxQyxNQUFNLFVBQVUsR0FBRyxXQUFXLENBQUMsTUFBTSxDQUFDO0lBQ3RDLElBQUksT0FBTyxJQUFJLElBQUksSUFBSSxDQUFDLEtBQUssQ0FBQyxPQUFPLENBQUMsT0FBTyxDQUFDLElBQUksT0FBTyxDQUFDLE1BQU0sS0FBSyxDQUFDLENBQUMsRUFBRTtRQUN2RSxPQUFPLFdBQVcsQ0FBQyxHQUFHLENBQUMsSUFBSSxDQUFDLEVBQUUsQ0FBQyxJQUFJLENBQUMsQ0FBQztLQUN0QztJQUNELElBQUksVUFBVSxLQUFLLENBQUMsRUFBRTtRQUNwQixJQUFJLEtBQUssQ0FBQyxPQUFPLENBQUMsT0FBTyxDQUFDLElBQUksT0FBTyxDQUFDLE1BQU0sS0FBSyxDQUFDLEVBQUU7WUFDbEQsT0FBTyxPQUFPLENBQUM7U0FDaEI7YUFBTSxJQUFJLE9BQU8sT0FBTyxLQUFLLFFBQVEsSUFBSSxXQUFXLENBQUMsQ0FBQyxDQUFDLElBQUksT0FBTyxFQUFFO1lBQ25FLE9BQU8sQ0FBRSxPQUEwQixDQUFDLFdBQVcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUM7U0FDdEQ7YUFBTTtZQUNMLE9BQU8sQ0FBQyxPQUFzQixDQUFDLENBQUM7U0FDakM7S0FDRjtJQUNELElBQUksS0FBSyxDQUFDLE9BQU8sQ0FBQyxPQUFPLENB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dXJjZXNDb250ZW50IjpbIi8qKlxuICogQGxpY2Vuc2VcbiAqIENvcHlyaWdodCAyMDE4IEdvb2dsZSBMTENcbiAqXG4gKiBVc2Ugb2YgdGhpcyBzb3VyY2UgY29kZSBpcyBnb3Zlcm5lZCBieSBhbiBNSVQtc3R5bGVcbiAqIGxpY2Vuc2UgdGhhdCBjYW4gYmUgZm91bmQgaW4gdGhlIExJQ0VOU0UgZmlsZSBvciBhdFxuICogaHR0cHM6Ly9vcGVuc291cmNlLm9yZy9saWNlbnNlcy9NSVQuXG4gKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuICovXG5cbmltcG9ydCB7YXJnTWF4LCBjbG9uZSwgZGlzcG9zZSwgbXVsLCByZXNoYXBlLCBUZW5zb3IsIFRlbnNvcjFELCB0ZW5zb3IxZCwgdGlkeX0gZnJvbSAnQHRlbnNvcmZsb3cvdGZqcy1jb3JlJztcblxuLyoqXG4gKiBGb3IgbXVsdGktY2xhc3MgY2xhc3NpZmljYXRpb24gcHJvYmxlbXMsIHRoaXMgb2JqZWN0IGlzIGRlc2lnbmVkIHRvIHN0b3JlIGFcbiAqIG1hcHBpbmcgZnJvbSBjbGFzcyBpbmRleCB0byB0aGUgXCJ3ZWlnaHRcIiBvZiB0aGUgY2xhc3MsIHdoZXJlIGhpZ2hlciB3ZWlnaHRlZFxuICogY2xhc3NlcyBoYXZlIGxhcmdlciBpbXBhY3Qgb24gbG9zcywgYWNjdXJhY3ksIGFuZCBvdGhlciBtZXRyaWNzLlxuICpcbiAqIFRoaXMgaXMgdXNlZnVsIGZvciBjYXNlcyBpbiB3aGljaCB5b3Ugd2FudCB0aGUgbW9kZWwgdG8gXCJwYXkgbW9yZSBhdHRlbnRpb25cIlxuICogdG8gZXhhbXBsZXMgZnJvbSBhbiB1bmRlci1yZXByZXNlbnRlZCBjbGFzcywgZS5nLiwgaW4gdW5iYWxhbmNlZCBkYXRhc2V0cy5cbiAqL1xuZXhwb3J0IHR5cGUgQ2xhc3NXZWlnaHQgPSB7XG4gIFtjbGFzc0luZGV4OiBudW1iZXJdOiBudW1iZXJcbn07XG5cbi8qKlxuICogQ2xhc3Mgd2VpZ2h0aW5nIGZvciBhIG1vZGVsIHdpdGggbXVsdGlwbGUgb3V0cHV0cy5cbiAqXG4gKiBUaGlzIG9iamVjdCBtYXBzIGVhY2ggb3V0cHV0IG5hbWUgdG8gYSBjbGFzcy13ZWlnaHRpbmcgb2JqZWN0LlxuICovXG5leHBvcnQgdHlwZSBDbGFzc1dlaWdodE1hcCA9IHtcbiAgW291dHB1dE5hbWU6IHN0cmluZ106IENsYXNzV2VpZ2h0XG59O1xuXG5mdW5jdGlvbiBzdGFuZGFyZGl6ZVNhbXBsZU9yQ2xhc3NXZWlnaHRzKFxuICAgIHhXZWlnaHQ6IENsYXNzV2VpZ2h0fENsYXNzV2VpZ2h0W118Q2xhc3NXZWlnaHRNYXAsIG91dHB1dE5hbWVzOiBzdHJpbmdbXSxcbiAgICB3ZWlnaHRUeXBlOiAnc2FtcGxlV2VpZ2h0J3wnY2xhc3NXZWlnaHQnKTogQ2xhc3NXZWlnaHRbXSB7XG4gIGNvbnN0IG51bU91dHB1dHMgPSBvdXRwdXROYW1lcy5sZW5ndGg7XG4gIGlmICh4V2VpZ2h0ID09IG51bGwgfHwgKEFycmF5LmlzQXJyYXkoeFdlaWdodCkgJiYgeFdlaWdodC5sZW5ndGggPT09IDApKSB7XG4gICAgcmV0dXJuIG91dHB1dE5hbWVzLm1hcChuYW1lID0+IG51bGwpO1xuICB9XG4gIGlmIChudW1PdXRwdXRzID09PSAxKSB7XG4gICAgaWYgKEFycmF5LmlzQXJyYXkoeFdlaWdodCkgJiYgeFdlaWdodC5sZW5ndGggPT09IDEpIHtcbiAgICAgIHJldHVybiB4V2VpZ2h0O1xuICAgIH0gZWxzZSBpZiAodHlwZW9mIHhXZWlnaHQgPT09ICdvYmplY3QnICYmIG91dHB1dE5hbWVzWzBdIGluIHhXZWlnaHQpIHtcbiAgICAgIHJldHVybiBbKHhXZWlnaHQgYXMgQ2xhc3NXZWlnaHRNYXApW291dHB1dE5hbWVzWzBdXV07XG4gICAgfSBlbHNlIHtcbiAgICAgIHJldHVybiBbeFdlaWdodCBhcyBDbGFzc1dlaWdodF07XG4gICAgfVxuICB9XG4gIGlmIChBcnJheS5pc0FycmF5KHhXZWlnaHQpKSB7XG4gICAgaWYgKHhXZWlnaHQubGVuZ3RoICE9PSBudW1PdXRwdXRzKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoXG4gICAgICAgICAgYFByb3ZpZGVkICR7d2VpZ2h0VHlwZX0gaXMgYW4gYXJyYXkgb2YgJHt4V2VpZ2h0Lmxlbmd0aH0gYCArXG4gICAgICAgICAgYGVsZW1lbnQocyksIGJ1dCB0aGUgbW9kZWwgaGFzICR7bnVtT3V0cHV0c30gb3V0cHV0cy4gYCArXG4gICAgICAgICAgYE1ha2Ugc3VyZSBhIHNldCBvZiB3ZWlnaHRzIGlzIHByb3ZpZGVkIGZvciBlYWNoIG1vZGVsIG91dHB1dC5gKTtcbiAgICB9XG4gICAgcmV0dXJuIHhXZWlnaHQ7XG4gIH0gZWxzZSBpZiAoXG4gICAgICB0eXBlb2YgeFdlaWdodCA9PT0gJ29iamVjdCcgJiYgT2JqZWN0LmtleXMoeFdlaWdodCkubGVuZ3RoID4gMCAmJlxuICAgICAgdHlwZW9mICh4V2VpZ2h0IGFzIENsYXNzV2VpZ2h0TWFwKVtPYmplY3Qua2V5cyh4V2VpZ2h0KVswXV0gPT09XG4gICAgICAgICAgJ29iamVjdCcpIHtcbiAgICBjb25zdCBvdXRwdXQ6IENsYXNzV2VpZ2h0W10gPSBbXTtcbiAgICBvdXRwdXROYW1lcy5mb3JFYWNoKG91dHB1dE5hbWUgPT4ge1xuICAgICAgaWYgKG91dHB1dE5hbWUgaW4geFdlaWdodCkge1xuICAgICAgICBvdXRwdXQucHVzaCgoeFdlaWdodCBhcyBDbGFzc1dlaWdodE1hcClbb3V0cHV0TmFtZV0pO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgb3V0cHV0LnB1c2gobnVsbCk7XG4gICAgICB9XG4gICAgfSk7XG4gICAgcmV0dXJuIG91dHB1dDtcbiAgfSBlbHNlIHtcbiAgICB0aHJvdyBuZXcgRXJyb3IoXG4gICAgICAgIGBUaGUgbW9kZWwgaGFzIG11bHRpcGxlICgke251bU91dHB1dHN9KSBvdXRwdXRzLCBgICtcbiAgICAgICAgYHNvICR7d2VpZ2h0VHlwZX0gbXVzdCBiZSBlaXRoZXIgYW4gYXJyYXkgd2l0aCBgICtcbiAgICAgICAgYCR7bnVtT3V0cHV0c30gZWxlbWVudHMgb3IgYW4gb2JqZWN0IHdpdGggJHtvdXRwdXROYW1lc30ga2V5cy4gYCArXG4gICAgICAgIGBQcm92aWRlZCAke3dlaWdodFR5cGV9IG5vdCB1bmRlcnN0b29kOiAke0pTT04uc3RyaW5naWZ5KHhXZWlnaHQpfWApO1xuICB9XG59XG5cbi8qKlxuICogU3RhbmRhcmRpemUgY2xhc3Mgd2VpZ2h0aW5nIG9iamVjdHMuXG4gKlxuICogVGhpcyBmdW5jdGlvbiB0YWtlcyBhIHNpbmdsZSBjbGFzcy13ZWlnaHRpbmcgb2JqZWN0LCBhbiBhcnJheSBvZiB0aGVtLFxuICogb3IgYSBtYXAgZnJvbSBvdXRwdXQgbmFtZSB0byBjbGFzcy13ZWlnaHRpbmcgb2JqZWN0LiBJdCBjb21wYXJlcyBpdCB0byB0aGVcbiAqIG91dHB1dCBuYW1lKHMpIG9mIHRoZSBtb2RlbCwgYmFzZSBvbiB3aGljaCBpdCBvdXRwdXRzIGFuIGFycmF5IG9mXG4gKiBjbGFzcy13ZWlnaHRpbmcgb2JqZWN0cyBvZiB3aGljaCB0aGUgbGVuZ3RoIG1hdGNoZXMgdGhlIG51bWJlciBvZiBvdXRwdXRzLlxuICpcbiAqIEBwYXJhbSBjbGFzc1dlaWdodCBJbnB1dCBjbGFzcy13ZWlnaHRpbmcgb2JqZWN0KHMpLlxuICogQHBhcmFtIG91dHB1dE5hbWVzIEFsbCBvdXRwdXQgbmFtZShzKSBvZiB0aGUgbW9kZWwuXG4gKiBAcmV0dXJuIEFuIGFycmF5IG9mIGNsYXNzLXdlaWdodGluZyBvYmplY3RzLiBUaGUgbGVuZ3RoIG9mIHRoZSBhcnJheSBtYXRjaGVzXG4gKiAgIHRoZSBtb2RlbCdzIG51bWJlciBvZiBvdXRwdXRzLlxuICovXG5leHBvcnQgZnVuY3Rpb24gc3RhbmRhcmRpemVDbGFzc1dlaWdodHMoXG4gICAgY2xhc3NXZWlnaHQ6IENsYXNzV2VpZ2h0fENsYXNzV2VpZ2h0W118Q2xhc3NXZWlnaHRNYXAsXG4gICAgb3V0cHV0TmFtZXM6IHN0cmluZ1tdKTogQ2xhc3NXZWlnaHRbXSB7XG4gIHJldHVybiBzdGFuZGFyZGl6ZVNhbXBsZU9yQ2xhc3NXZWlnaHRzKFxuICAgICAgY2xhc3NXZWlnaHQsIG91dHB1dE5hbWVzLCAnY2xhc3NXZWlnaHQnKTtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIHN0YW5kYXJkaXplU2FtcGxlV2VpZ2h0cyhcbiAgICBjbGFzc1dlaWdodDogQ2xhc3NXZWlnaHR8Q2xhc3NXZWlnaHRbXXxDbGFzc1dlaWdodE1hcCxcbiAgICBvdXRwdXROYW1lczogc3RyaW5nW10pOiBDbGFzc1dlaWdodFtdIHtcbiAgcmV0dXJuIHN0YW5kYXJkaXplU2FtcGxlT3JDbGFzc1dlaWdodHMoXG4gICAgICBjbGFzc1dlaWdodCwgb3V0cHV0TmFtZXMsICdzYW1wbGVXZWlnaHQnKTtcbn1cblxuLyoqXG4gKiBTdGFuZGFyZGl6ZSBieS1zYW1wbGUgYW5kL29yIGJ5LWNsYXNzIHdlaWdodHMgZm9yIHRyYWluaW5nLlxuICpcbiAqIE5vdGUgdGhhdCB0aGlzIGZ1bmN0aW9uIG9wZXJhdGVzIG9uIG9uZSBtb2RlbCBvdXRwdXQgYXQgYSB0aW1lLiBGb3IgYSBtb2RlbFxuICogd2l0aCBtdWx0aXBsZSBvdXRwdXRzLCB5b3UgbXVzdCBjYWxsIHRoaXMgZnVuY3Rpb24gbXVsdGlwbGUgdGltZXMuXG4gKlxuICogQHBhcmFtIHkgVGhlIHRhcmdldCB0ZW5zb3IgdGhhdCB0aGUgYnktc2FtcGxlIGFuZC9vciBieS1jbGFzcyB3ZWlnaHQgaXMgZm9yLlxuICogICAgIFRoZSB2YWx1ZXMgb2YgeSBhcmUgYXNzdW1lZCB0byBlbmNvZGUgdGhlIGNsYXNzZXMsIGVpdGhlciBkaXJlY3RseVxuICogICAgIGFzIGFuIGludGVnZXIgaW5kZXgsIG9yIGFzIG9uZS1ob3QgZW5jb2RpbmcuXG4gKiBAcGFyYW0gc2FtcGxlV2VpZ2h0IEJ5LXNhbXBsZSB3ZWlnaHRzLlxuICogQHBhcmFtIGNsYXNzV2VpZ2h0IEJ5LWNsYXNzIHdlaWdodHM6IGFuIG9iamVjdCBtYXBwaW5nIGNsYXNzIGluZGljZXNcbiAqICAgICAoaW50ZWdlcnMpIHRvIGEgd2VpZ2h0IChmbG9hdCkgdG8gYXBwbHkgdG8gdGhlIG1vZGVsJ3MgbG9zcyBmb3IgdGhlXG4gKiAgICAgc2FtcGxlcyBmcm9tIHRoaXMgY2xhc3MgZHVyaW5nIHRyYWluaW5nLiBUaGlzIGNhbiBiZSB1c2VmdWwgdG8gdGVsbCB0aGVcbiAqICAgICBtb2RlbCB0byBcInBheSBtb3JlIGF0dGVudGlvblwiIHRvIHNhbXBsZXMgZnJvbSBhbiB1bmRlci1yZXByZXNlbnRlZCBjbGFzcy5cbiAqIEBwYXJhbSBzYW1wbGVXZWlnaHRNb2RlIFRoZSBtb2RlIGZvciB0aGUgc2FtcGxlIHdlaWdodHMuXG4gKiBAcmV0dXJuIEEgUHJvbWlzZSBvZiB3ZWlnaHQgdGVuc29yLCBvZiB3aGljaCB0aGUgc2l6ZSBvZiB0aGUgZmlyc3QgZGltZW5zaW9uXG4gKiAgICAgbWF0Y2hlcyB0aGF0IG9mIGB5YC5cbiAqL1xuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIHN0YW5kYXJkaXplV2VpZ2h0cyhcbiAgICB5OiBUZW5zb3IsIHNhbXBsZVdlaWdodD86IFRlbnNvciwgY2xhc3NXZWlnaHQ/OiBDbGFzc1dlaWdodCxcbiAgICBzYW1wbGVXZWlnaHRNb2RlPzogJ3RlbXBvcmFsJyk6IFByb21pc2U8VGVuc29yPiB7XG4gIGlmIChzYW1wbGVXZWlnaHQgIT0gbnVsbCB8fCBzYW1wbGVXZWlnaHRNb2RlICE9IG51bGwpIHtcbiAgICAvLyBUT0RPKGNhaXMpOiBPbmNlICd0ZW1wb3JhbCcgbW9kZSBpcyBpbXBsZW1lbnRlZCwgZG9jdW1lbnQgaXQgaW4gdGhlIGRvY1xuICAgIC8vIHN0cmluZy5cbiAgICB0aHJvdyBuZXcgRXJyb3IoJ1N1cHBvcnQgc2FtcGxlV2VpZ2h0IGlzIG5vdCBpbXBsZW1lbnRlZCB5ZXQnKTtcbiAgfVxuXG4gIGlmIChjbGFzc1dlaWdodCAhPSBudWxsKSB7XG4gICAgLy8gQXBwbHkgY2xhc3Mgd2VpZ2h0cyBwZXIgc2FtcGxlLlxuICAgIGNvbnN0IHlDbGFzc2VzOiBUZW5zb3IxRCA9IHRpZHkoKCkgPT4ge1xuICAgICAgaWYgKHkuc2hhcGUubGVuZ3RoID09PSAxKSB7XG4gICAgICAgIC8vIEFzc3VtZSBjbGFzcyBpbmRpY2VzLlxuICAgICAgICByZXR1cm4gY2xvbmUoeSkgYXMgVGVuc29yMUQ7XG4gICAgICB9IGVsc2UgaWYgKHkuc2hhcGUubGVuZ3RoID09PSAyKSB7XG4gICAgICAgIGlmICh5LnNoYXBlWzFdID4gMSkge1xuICAgICAgICAgIC8vIEFzc3VtZSBvbmUtaG90IGVuY29kaW5nIG9mIGNsYXNzZXMuXG4gICAgICAgICAgY29uc3QgYXhpcyA9IDE7XG4gICAgICAgICAgcmV0dXJuIGFyZ01heCh5LCBheGlzKTtcbiAgICAgICAgfSBlbHNlIGlmICh5LnNoYXBlWzFdID09PSAxKSB7XG4gICAgICAgICAgLy8gQ2xhc3MgaW5kZXguXG4gICAgICAgICAgcmV0dXJuIHJlc2hhcGUoeSwgW3kuc2hhcGVbMF1dKTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoXG4gICAgICAgICAgICAgIGBFbmNvdW50ZXJlZCB1bmV4cGVjdGVkIGxhc3QtZGltZW5zaW9uIHNpemUgKCR7eS5zaGFwZVsxXX0pIGAgK1xuICAgICAgICAgICAgICBgZHVyaW5nIGhhbmRsaW5nIG9mIGNsYXNzIHdlaWdodHMuIFRoZSBzaXplIGlzIGV4cGVjdGVkIHRvIGJlIGAgK1xuICAgICAgICAgICAgICBgPj0gMS5gKTtcbiAgICAgICAgfVxuICAgICAgfSBlbHNlIHtcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKFxuICAgICAgICAgICAgYFVuZXhwZWN0ZWQgcmFuayBvZiB0YXJnZXQgKHkpIHRlbnNvciAoJHt5LnJhbmt9KSBkdXJpbmcgYCArXG4gICAgICAgICAgICBgaGFuZGxpbmcgb2YgY2xhc3Mgd2VpZ2h0cy4gVGhlIHJhbmsgaXMgZXhwZWN0ZWQgdG8gYmUgMSBvciAyLmApO1xuICAgICAgfVxuICAgIH0pO1xuXG4gICAgY29uc3QgeUNsYXNzSW5kaWNlcyA9IEFycmF5LmZyb20oYXdhaXQgeUNsYXNzZXMuZGF0YSgpKTtcbiAgICBkaXNwb3NlKHlDbGFzc2VzKTtcbiAgICBjb25zdCBjbGFzc1NhbXBsZVdlaWdodDogbnVtYmVyW10gPSBbXTtcbiAgICB5Q2xhc3NJbmRpY2VzLmZvckVhY2goY2xhc3NJbmRleCA9PiB7XG4gICAgICBpZiAoY2xhc3NXZWlnaHRbY2xhc3NJbmRleF0gPT0gbnVsbCkge1xuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoXG4gICAgICAgICAgICBgY2xhc3NXZWlnaHQgbXVzdCBjb250YWluIGFsbCBjbGFzc2VzIGluIHRoZSB0cmFpbmluZyBkYXRhLiBgICtcbiAgICAgICAgICAgIGBUaGUgY2xhc3MgJHtjbGFzc0luZGV4fSBleGlzdHMgaW4gdGhlIGRhdGEgYnV0IG5vdCBpbiBgICtcbiAgICAgICAgICAgIGBjbGFzc1dlaWdodGApO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgY2xhc3NTYW1wbGVXZWlnaHQucHVzaChjbGFzc1dlaWdodFtjbGFzc0luZGV4XSk7XG4gICAgICB9XG4gICAgfSk7XG5cbiAgICByZXR1cm4gdGVuc29yMWQoY2xhc3NTYW1wbGVXZWlnaHQsICdmbG9hdDMyJyk7XG4gIH0gZWxzZSB7XG4gICAgcmV0dXJuIG51bGw7XG4gIH1cbn1cblxuLyoqXG4gKiBBcHBseSBwZXItc2FtcGxlIHdlaWdodHMgb24gdGhlIGxvc3MgdmFsdWVzIGZyb20gYSBudW1iZXIgb2Ygc2FtcGxlcy5cbiAqXG4gKiBAcGFyYW0gbG9zc2VzIExvc3MgdGVuc29yIG9mIHNoYXBlIGBbYmF0Y2hTaXplXWAuXG4gKiBAcGFyYW0gc2FtcGxlV2VpZ2h0cyBQZXItc2FtcGxlIHdlaWdodCB0ZW5zb3Igb2Ygc2hhcGUgYFtiYXRjaFNpemVdYC5cbiAqIEByZXR1cm5zIFRlbnNvciBvZiB0aGUgc2FtZSBzaGFwZSBhc2Bsb3NzZXNgLlxuICovXG5leHBvcnQgZnVuY3Rpb24gY29tcHV0ZVdlaWdodGVkTG9zcyhsb3NzZXM6IFRlbnNvciwgc2FtcGxlV2VpZ2h0czogVGVuc29yKSB7XG4gIHJldHVybiBtdWwobG9zc2VzLCBzYW1wbGVXZWlnaHRzKTtcbn1cbiJdfQ==","/**\n * @license\n * Copyright 2018 Google LLC\n *\n * Use of this source code is governed by an MIT-style\n * license that can be found in the LICENSE file or at\n * https://opensource.org/licenses/MIT.\n * =============================================================================\n */\n/**\n * Interfaces and methods for training models using TensorFlow.js datasets.\n */\nimport * as tfc from '@tensorflow/tfjs-core';\nimport { scalar } from '@tensorflow/tfjs-core';\nimport { configureCallbacks, standardizeCallbacks } from '../base_callbacks';\nimport { NotImplementedError, ValueError } from '../errors';\nimport { disposeTensorsInLogs } from '../logs';\nimport { singletonOrArray, toList } from '../utils/generic_utils';\nimport { standardizeClassWeights, standardizeWeights } from './training_utils';\n// Default batch size used during tensor-based validation.\nconst DEFAULT_VALIDATION_BATCH_SIZE = 32;\n/**\n * Standardize the output of a dataset iterator for use by\n * LayersModel.fitDataset().\n *\n * @param model: A `tf.LayersModel` object.\n * @param iteratorOut The output of a dataset iterator. It is required to be\n * an object of the form `{xs: TensorOrArrayOrMap, ys:\n * TensorOrArrayOrMap}`, where `TensorOrArrayOrMap` is a single `tf.Tensor`,\n * a `tf.Tensor[]`, or a flat map from string names to `tf.Tensor`s.\n * @returns A flat array of `tf.Tensor` objects: the input `tf.Tensor`s\n * followed by the target `tf.Tensor`s. When `tf.Tensor`s are provided\n * as a map, the order in the resulting array is taken from the `inputNames`\n * and `outputNames` of the model.\n */\nfunction standardizeDataIteratorOutput(\n// Type `model` as `any` here to avoid circular dependency w/\n// training.ts.\n// tslint:disable-next-line:no-any\nmodel, iteratorOut) {\n let xs;\n let ys;\n const iteratorOutObj = iteratorOut;\n xs = iteratorOutObj['xs'];\n ys = iteratorOutObj['ys'];\n tfc.util.assert(xs != null && ys != null, () => 'A Dataset iterator for fitDataset() is expected to generate ' +\n 'objects of the form `{xs: xVal, ys: yVal}`, where the two ' +\n 'values may be `tf.Tensor`, an array of Tensors, or a map of ' +\n 'string to Tensor. The provided Dataset instead generates ' +\n `${iteratorOut}`);\n const flattenedXs = flattenTensorOrArrayOrMap('input', model.inputNames, xs);\n const flattenedYs = flattenTensorOrArrayOrMap('output', model.outputNames, ys);\n const batchSize = flattenedXs[0].shape[0];\n tfc.util.assert(flattenedXs.length === model.inputs.length, () => `LayersModel has ${model.inputs.length} inputs, but the dataset ` +\n `provides ${flattenedXs.length} inputs. (Expected input keys: ` +\n `${JSON.stringify(model.inputNames)})`);\n tfc.util.assert(flattenedYs.length === model.outputs.length, () => `LayersModel has ${model.outputs.length} outputs, but the dataset ` +\n `provides ${flattenedYs.length} outputs. (Expected output keys: ` +\n `${JSON.stringify(model.outputNames)})`);\n for (let xIndex = 0; xIndex < flattenedXs.length; xIndex++) {\n tfc.util.assert(flattenedXs[xIndex].shape[0] === batchSize, () => `Batch size mismatch: input ` +\n `${model.inputNames[xIndex]} has ${flattenedXs[xIndex].shape[0]}; ` +\n `expected ${batchSize} based on input ${model.inputNames[0]}.`);\n }\n for (let yIndex = 0; yIndex < flattenedYs.length; yIndex++) {\n tfc.util.assert(flattenedYs[yIndex].shape[0] === batchSize, () => `Batch size mismatch: output ` +\n `${model.outputNames[yIndex]} has ${flattenedYs[yIndex].shape[0]}; ` +\n `expected ${batchSize} based on input ${model.inputNames[0]}.`);\n }\n return { xs: flattenedXs, ys: flattenedYs };\n}\nfunction flattenTensorOrArrayOrMap(inputOrOutput, names, values) {\n if (values instanceof tfc.Tensor) {\n return [values];\n }\n else if (Array.isArray(values)) {\n tfc.util.assert(values.length === names.length, () => `Received an array of ${values.length} Tensors, but expected ${names.length} to match the ${inputOrOutput} keys ${names}.`);\n return values;\n }\n else {\n const result = [];\n // Check that all the required keys are available.\n for (const name of names) {\n if (values[name] == null) {\n throw new ValueError(`The feature data generated by the dataset lacks the required ` +\n `${inputOrOutput} key '${name}'.`);\n }\n result.push(values[name]);\n }\n return result;\n }\n}\nfunction standardizeTensorValidationData(data) {\n if (data.length === 3) {\n throw new NotImplementedError('Validation with sample weights is not implemented yet.');\n }\n return { xs: data[0], ys: data[1] };\n}\nexport async function fitDataset(\n// Type `model` as `any` here to avoid circular dependency w/\n// training.ts.\n// tslint:disable-next-line:no-any\nmodel, dataset, args) {\n const hasBatchesPerEpoch = args.batchesPerEpoch != null;\n tfc.util.assert(model.optimizer != null, () => 'You must compile a model before training/testing. Use ' +\n 'LayersModel.compile(modelCompileConfig).');\n tfc.util.assert(args != null, () => `For fitDataset(), the 2nd argument (config) is required, ` +\n `but it is not provided in this call.`);\n tfc.util.assert(args.epochs != null && args.epochs > 0 && Number.isInteger(args.epochs), () => `For fitDataset(), config.epochs is expected to be a positive ` +\n `integer, but got ${args.epochs}`);\n tfc.util.assert(!hasBatchesPerEpoch ||\n (args.batchesPerEpoch > 0 && Number.isInteger(args.batchesPerEpoch)), () => `For fitDataset(), config.batchesPerEpoch is expected to be a ` +\n `positive integer if specified, but got ${args.batchesPerEpoch}`);\n tfc.util.assert(\n // tslint:disable-next-line:no-any\n args['validationSplit'] == null, () => '`validationSplit` is not supported by `fitDataset()`. ' +\n 'Use validationData instead.');\n if (model.isTraining) {\n throw new Error('Cannot start training because another fit() call is ongoing.');\n }\n model.isTraining = true;\n try {\n const doValidation = args.validationData != null;\n let valXs;\n let valYs;\n if (doValidation) {\n if (isDatasetObject(args.validationData)) {\n tfc.util.assert(args.validationBatches == null ||\n (args.validationBatches > 0 &&\n Number.isInteger(args.validationBatches)), () => `For fitDataset() with dataset-based validation, ` +\n `config.validationBatches is expected not to be provided, ` +\n `or to be a positive integer, ` +\n `but got ${args.validationBatches}`);\n }\n else {\n const validationData = standardizeTensorValidationData(args.validationData);\n valXs = validationData.xs;\n valYs = validationData.ys;\n }\n }\n const trainFunction = model.makeTrainFunction();\n const outLabels = model.getDedupedMetricsNames();\n let callbackMetrics;\n if (doValidation) {\n callbackMetrics =\n outLabels.slice().concat(outLabels.map(n => 'val_' + n));\n }\n else {\n callbackMetrics = outLabels.slice();\n }\n const callbacks = standardizeCallbacks(args.callbacks, args.yieldEvery);\n const verbose = args.verbose == null ? 1 : args.verbose;\n const { callbackList, history } = configureCallbacks(callbacks, verbose, args.epochs, null, null, getStepsPerEpoch(dataset, args), null, // Batch size determined by the dataset itself.\n doValidation, callbackMetrics);\n callbackList.setModel(model);\n model.history = history;\n await callbackList.onTrainBegin();\n model.stopTraining_ = false;\n let epoch = args.initialEpoch == null ? 0 : args.initialEpoch;\n let dataIterator = await dataset.iterator();\n while (epoch < args.epochs) {\n const epochLogs = {};\n await callbackList.onEpochBegin(epoch);\n let stepsDone = 0;\n let batchIndex = 0;\n if (!hasBatchesPerEpoch) {\n dataIterator = await dataset.iterator();\n }\n while (hasBatchesPerEpoch ? stepsDone < args.batchesPerEpoch : true) {\n const iteratorOut = await dataIterator.next();\n // If `batchesPerEpoch` is specified, the dataset should not be\n // exhausted until all epoches are done.\n if (hasBatchesPerEpoch && iteratorOut.done) {\n console.warn('You provided `batchesPerEpoch` as ' +\n `${args.batchesPerEpoch}, ` +\n 'but your dataset iterator ran out of data after ' +\n `${stepsDone} batches; ` +\n 'interrupting training. Make sure that your ' +\n 'dataset can generate at least `batchesPerEpoch * epochs` ' +\n 'batches (in this case, ' +\n `${args.batchesPerEpoch * args.epochs} batches). ` +\n 'You may need to use the repeat() function when building ' +\n 'your dataset.');\n break;\n }\n if (iteratorOut.value != null) {\n const { xs, ys } = standardizeDataIteratorOutput(model, iteratorOut.value);\n const batchLogs = {};\n batchLogs['batch'] = batchIndex;\n batchLogs['size'] = xs[0].shape[0];\n await callbackList.onBatchBegin(batchIndex, batchLogs);\n const sampleWeights = [];\n if (args.classWeight != null) {\n const standardClassWeights = standardizeClassWeights(args.classWeight, model.outputNames);\n for (let i = 0; i < standardClassWeights.length; ++i) {\n sampleWeights.push(await standardizeWeights(ys[i], null, standardClassWeights[i]));\n }\n }\n // Train on batch.\n const ins = xs.concat(ys).concat(sampleWeights);\n const outs = trainFunction(ins);\n tfc.dispose(ins);\n for (let i = 0; i < outLabels.length; ++i) {\n const label = outLabels[i];\n const out = outs[i];\n batchLogs[label] = out;\n tfc.keep(out);\n }\n await callbackList.onBatchEnd(batchIndex, batchLogs);\n disposeTensorsInLogs(batchLogs);\n batchIndex++;\n stepsDone++;\n }\n if (hasBatchesPerEpoch ? stepsDone >= args.batchesPerEpoch :\n iteratorOut.done) {\n // Epoch finished. Perform validation.\n if (doValidation) {\n let valOuts;\n if (isDatasetObject(args.validationData)) {\n valOuts = toList(await model.evaluateDataset(args.validationData, { batches: args.validationBatches }));\n }\n else {\n valOuts = toList(model.evaluate(valXs, valYs, {\n batchSize: args.validationBatchSize == null ?\n DEFAULT_VALIDATION_BATCH_SIZE :\n args.validationBatchSize,\n verbose: 0\n }));\n }\n for (let i = 0; i < model.metricsNames.length; ++i) {\n epochLogs[`val_${model.metricsNames[i]}`] = valOuts[i];\n }\n }\n // Call `break` to exit one epoch lopp after validation is done. If\n // config.batchesPerEpoch is specified, an epoch while loop will\n // stop when `stepsDone >= config.batchesPerEpoch`. When\n // config.batchesPerEpoch is not provided, the following `break` is\n // required to exit the while lopp after dataset is exhausted.\n break;\n }\n if (model.stopTraining_) {\n break;\n }\n }\n await callbackList.onEpochEnd(epoch, epochLogs);\n epoch++;\n if (model.stopTraining_) {\n break;\n }\n }\n await callbackList.onTrainEnd();\n await model.history.syncData();\n return model.history;\n }\n finally {\n model.isTraining = false;\n }\n}\n/** Helper function that determines number of steps (batches) per epoch. */\nfunction getStepsPerEpoch(dataset, args) {\n // Attempt to determine # of batches in an epoch.\n let stepsPerEpoch = null;\n if (args.batchesPerEpoch != null) {\n stepsPerEpoch = args.batchesPerEpoch;\n }\n else if (Number.isFinite(dataset.size)) {\n stepsPerEpoch = dataset.size;\n }\n return stepsPerEpoch;\n}\n// Check if provided object is a Dataset object by checking its .iterator\n// element.\nfunction isDatasetObject(dataset) {\n return (typeof dataset.iterator === 'function');\n}\n// Check if provided object is a LazyIterator object by checking it's .next\n// element.\nfunction isLazyIteratorObject(iterator) {\n return (typeof iterator.next === 'function');\n}\nexport async function evaluateDataset(\n// Type `model` as `any` here to avoid circular dependency w/\n// training.ts.\n// tslint:disable-next-line:no-any\nmodel, dataset, args) {\n args = args || {};\n const hasBatches = args.batches != null;\n const f = model.testFunction;\n let outs = [];\n if (args.verbose > 0) {\n throw new NotImplementedError('Verbose mode is not implemented yet.');\n }\n tfc.util.assert(!hasBatches || (args.batches > 0 && Number.isInteger(args.batches)), () => 'Test loop expects `batches` to be a positive integer, but ' +\n `received ${JSON.stringify(args.batches)}`);\n const dataIterator = isLazyIteratorObject(dataset) ?\n dataset :\n await dataset.iterator();\n // Keeps track of number of examples used in this evaluation.\n let numExamples = 0;\n let batch = 0;\n while (hasBatches ? batch < args.batches : true) {\n const iteratorOut = await dataIterator.next();\n outs = tfc.tidy(() => {\n if (iteratorOut.value) {\n // TODO(cais): Once real dataset is available, use\n // `map(x => standardizeDataIteratorOutput(model, x).map(f)`.\n const { xs, ys } = standardizeDataIteratorOutput(model, iteratorOut.value);\n const xsAndYs = xs.concat(ys);\n const batchOuts = tfc.tidy(() => f(xsAndYs));\n tfc.dispose(xsAndYs);\n if (batch === 0) {\n for (let i = 0; i < batchOuts.length; ++i) {\n outs.push(scalar(0));\n }\n }\n const batchSize = xsAndYs[0].shape[0];\n for (let i = 0; i < batchOuts.length; ++i) {\n const batchOut = batchOuts[i];\n const oldScalar = outs[i];\n outs[i] =\n tfc.tidy(() => tfc.add(outs[i], tfc.mul(batchSize, batchOut)));\n if (batch > 0) {\n tfc.dispose(oldScalar);\n }\n }\n tfc.dispose(batchOuts);\n numExamples += batchSize;\n ++batch;\n }\n return outs;\n });\n if (iteratorOut.done) {\n if (hasBatches) {\n console.warn('Your dataset iterator ran out of data during evaluateDataset(). ' +\n 'Interrupting evalution. Make sure that your ' +\n 'dataset can generate at least `batches` ' +\n `batches (in this case, ${args.batches} batches). ` +\n 'You may need to use the repeat() function when building ' +\n 'your dataset.');\n }\n break;\n }\n }\n for (let i = 0; i < outs.length; ++i) {\n const oldScalar = outs[i];\n outs[i] = tfc.div(outs[i], numExamples);\n tfc.dispose(oldScalar);\n }\n return singletonOrArray(outs);\n}\n//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidHJhaW5pbmdfZGF0YXNldC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uLy4uL3RmanMtbGF5ZXJzL3NyYy9lbmdpbmUvdHJhaW5pbmdfZGF0YXNldC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQTs7Ozs7Ozs7R0FRRztBQUVIOztHQUVHO0FBRUgsT0FBTyxLQUFLLEdBQUcsTUFBTSx1QkFBdUIsQ0FBQztBQUM3QyxPQUFPLEVBQUMsTUFBTSxFQUFDLE1BQU0sdUJBQXVCLENBQUM7QUFDN0MsT0FBTyxFQUFlLGtCQUFrQixFQUFzRCxvQkFBb0IsRUFBb0IsTUFBTSxtQkFBbUIsQ0FBQztBQUNoSyxPQUFPLEVBQUMsbUJBQW1CLEVBQUUsVUFBVSxFQUFDLE1BQU0sV0FBVyxDQUFDO0FBQzFELE9BQU8sRUFBQyxvQkFBb0IsRUFBaUIsTUFBTSxTQUFTLENBQUM7QUFFN0QsT0FBTyxFQUFDLGdCQUFnQixFQUFFLE1BQU0sRUFBQyxNQUFNLHdCQUF3QixDQUFDO0FBR2hFLE9BQU8sRUFBOEIsdUJBQXVCLEVBQUUsa0JBQWtCLEVBQUMsTUFBTSxrQkFBa0IsQ0FBQztBQWlLMUcsMERBQTBEO0FBQzFELE1BQU0sNkJBQTZCLEdBQUcsRUFBRSxDQUFDO0FBRXpDOzs7Ozs7Ozs7Ozs7O0dBYUc7QUFDSCxTQUFTLDZCQUE2QjtBQUNsQyw2REFBNkQ7QUFDN0QsZUFBZTtBQUNmLGtDQUFrQztBQUNsQyxLQUFVLEVBQUUsV0FBZTtJQUM3QixJQUFJLEVBQXNCLENBQUM7SUFDM0IsSUFBSSxFQUFzQixDQUFDO0lBRTNCLE1BQU0sY0FBYyxHQUFHLFdBQWdDLENBQUM7SUFDeEQsRUFBRSxHQUFHLGNBQWMsQ0FBQyxJQUFJLENBQUMsQ0FBQztJQUMxQixFQUFFLEdBQUcsY0FBYyxDQUFDLElBQUksQ0FBQyxDQUFDO0lBQzFCLEdBQUcsQ0FBQyxJQUFJLENBQUMsTUFBTSxDQUNYLEVBQUUsSUFBSSxJQUFJLElBQUksRUFBRSxJQUFJ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YixHQUFHLENBQUMsT0FBTyxDQUFDLFNBQVMsQ0FBQyxDQUFDO3FCQUN4QjtpQkFDRjtnQkFDRCxHQUFHLENBQUMsT0FBTyxDQUFDLFNBQVMsQ0FBQyxDQUFDO2dCQUN2QixXQUFXLElBQUksU0FBUyxDQUFDO2dCQUV6QixFQUFFLEtBQUssQ0FBQzthQUNUO1lBQ0QsT0FBTyxJQUFJLENBQUM7UUFDZCxDQUFDLENBQUMsQ0FBQztRQUVILElBQUksV0FBVyxDQUFDLElBQUksRUFBRTtZQUNwQixJQUFJLFVBQVUsRUFBRTtnQkFDZCxPQUFPLENBQUMsSUFBSSxDQUNSLGtFQUFrRTtvQkFDbEUsOENBQThDO29CQUM5QywwQ0FBMEM7b0JBQzFDLDBCQUEwQixJQUFJLENBQUMsT0FBTyxhQUFhO29CQUNuRCwwREFBMEQ7b0JBQzFELGVBQWUsQ0FBQyxDQUFDO2FBQ3RCO1lBQ0QsTUFBTTtTQUNQO0tBQ0Y7SUFFRCxLQUFLLElBQUksQ0FBQyxHQUFHLENBQUMsRUFBRSxDQUFDLEdBQUcsSUFBSSxDQUFDLE1BQU0sRUFBRSxFQUFFLENBQUMsRUFBRTtRQUNwQyxNQUFNLFNBQVMsR0FBRyxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUM7UUFDMUIsSUFBSSxDQUFDLENBQUMsQ0FBQyxHQUFHLEdBQUcsQ0FBQyxHQUFHLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxFQUFFLFdBQVcsQ0FBQyxDQUFDO1FBQ3hDLEdBQUcsQ0FBQyxPQUFPLENBQUMsU0FBUyxDQUFDLENBQUM7S0FDeEI7SUFFRCxPQUFPLGdCQUFnQixDQUFDLElBQUksQ0FBQyxDQUFDO0FBQ2hDLENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyIvKipcbiAqIEBsaWNlbnNlXG4gKiBDb3B5cmlnaHQgMjAxOCBHb29nbGUgTExDXG4gKlxuICogVXNlIG9mIHRoaXMgc291cmNlIGNvZGUgaXMgZ292ZXJuZWQgYnkgYW4gTUlULXN0eWxlXG4gKiBsaWNlbnNlIHRoYXQgY2FuIGJlIGZvdW5kIGluIHRoZSBMSUNFTlNFIGZpbGUgb3IgYXRcbiAqIGh0dHBzOi8vb3BlbnNvdXJjZS5vcmcvbGljZW5zZXMvTUlULlxuICogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbiAqL1xuXG4vKipcbiAqIEludGVyZmFjZXMgYW5kIG1ldGhvZHMgZm9yIHRyYWluaW5nIG1vZGVscyB1c2luZyBUZW5zb3JGbG93LmpzIGRhdGFzZXRzLlxuICovXG5cbmltcG9ydCAqIGFzIHRmYyBmcm9tICdAdGVuc29yZmxvdy90ZmpzLWNvcmUnO1xuaW1wb3J0IHtzY2FsYXJ9IGZyb20gJ0B0ZW5zb3JmbG93L3RmanMtY29yZSc7XG5pbXBvcnQge0Jhc2VDYWxsYmFjaywgY29uZmlndXJlQ2FsbGJhY2tzLCBDdXN0b21DYWxsYmFja0FyZ3MsIEhpc3RvcnksIE1vZGVsTG9nZ2luZ1ZlcmJvc2l0eSwgc3RhbmRhcmRpemVDYWxsYmFja3MsIFlpZWxkRXZlcnlPcHRpb25zfSBmcm9tICcuLi9iYXNlX2NhbGxiYWNrcyc7XG5pbXBvcnQge05vdEltcGxlbWVudGVkRXJyb3IsIFZhbHVlRXJyb3J9IGZyb20gJy4uL2Vycm9ycyc7XG5pbXBvcnQge2Rpc3Bvc2VUZW5zb3JzSW5Mb2dzLCBVbnJlc29sdmVkTG9nc30gZnJvbSAnLi4vbG9ncyc7XG5pbXBvcnQge1RlbnNvck9yQXJyYXlPck1hcH0gZnJvbSAnLi4vdHlwZXMnO1xuaW1wb3J0IHtzaW5nbGV0b25PckFycmF5LCB0b0xpc3R9IGZyb20gJy4uL3V0aWxzL2dlbmVyaWNfdXRpbHMnO1xuXG5pbXBvcnQge0RhdGFzZXQsIExhenlJdGVyYXRvcn0gZnJvbSAnLi9kYXRhc2V0X3N0dWInO1xuaW1wb3J0IHtDbGFzc1dlaWdodCwgQ2xhc3NXZWlnaHRNYXAsIHN0YW5kYXJkaXplQ2xhc3NXZWlnaHRzLCBzdGFuZGFyZGl6ZVdlaWdodHN9IGZyb20gJy4vdHJhaW5pbmdfdXRpbHMnO1xuXG4vKipcbiAqIEludGVyZmFjZSBmb3IgY29uZmlndXJpbmcgbW9kZWwgdHJhaW5pbmcgYmFzZWQgb24gYSBkYXRhc2V0IG9iamVjdC5cbiAqL1xuZXhwb3J0IGludGVyZmFjZSBNb2RlbEZpdERhdGFzZXRBcmdzPFQ+IHtcbiAgLyoqXG4gICAqIChPcHRpb25hbCkgVG90YWwgbnVtYmVyIG9mIHN0ZXBzIChiYXRjaGVzIG9mIHNhbXBsZXMpIGJlZm9yZVxuICAgKiBkZWNsYXJpbmcgb25lIGVwb2NoIGZpbmlzaGVkIGFuZCBzdGFydGluZyB0aGUgbmV4dCBlcG9jaC4gSXQgc2hvdWxkXG4gICAqIHR5cGljYWxseSBiZSBlcXVhbCB0byB0aGUgbnVtYmVyIG9mIHNhbXBsZXMgb2YgeW91ciBkYXRhc2V0IGRpdmlkZWQgYnlcbiAgICogdGhlIGJhdGNoIHNpemUsIHNvIHRoYXQgYGZpdERhdGFzZXRgKCkgY2FsbCBjYW4gdXRpbGl6ZSB0aGUgZW50aXJlIGRhdGFzZXQuXG4gICAqIElmIGl0IGlzIG5vdCBwcm92aWRlZCwgdXNlIGBkb25lYCByZXR1cm4gdmFsdWUgaW4gYGl0ZXJhdG9yLm5leHQoKWAgYXNcbiAgICogc2lnbmFsIHRvIGZpbmlzaCBhbiBlcG9jaC5cbiAgICovXG4gIGJhdGNoZXNQZXJFcG9jaD86IG51bWJlcjtcblxuICAvKipcbiAgICogSW50ZWdlciBudW1iZXIgb2YgdGltZXMgdG8gaXRlcmF0ZSBvdmVyIHRoZSB0cmFpbmluZyBkYXRhc2V0LlxuICAgKi9cbiAgZXBvY2hzOiBudW1iZXI7XG5cbiAgLyoqXG4gICAqIFZlcmJvc2l0eSBsZXZlbC5cbiAgICpcbiAgICogRXhwZWN0ZWQgdG8gYmUgMCwgMSwgb3IgMi4gRGVmYXVsdDogMS5cbiAgICpcbiAgICogMCAtIE5vIHByaW50ZWQgbWVzc2FnZSBkdXJpbmcgZml0KCkgY2FsbC5cbiAgICogMSAtIEluIE5vZGUuanMgKHRmanMtbm9kZSksIHByaW50cyB0aGUgcHJvZ3Jlc3MgYmFyLCB0b2dldGhlciB3aXRoXG4gICAqICAgICByZWFsLXRpbWUgdXBkYXRlcyBvZiBsb3NzIGFuZCBtZXRyaWMgdmFsdWVzIGFuZCB0cmFpbmluZyBzcGVlZC5cbiAgICogICAgIEluIHRoZSBicm93c2VyOiBubyBhY3Rpb24uIFRoaXMgaXMgdGhlIGRlZmF1bHQuXG4gICAqIDIgLSBOb3QgaW1wbGVtZW50ZWQgeWV0LlxuICAgKi9cbiAgdmVyYm9zZT86IE1vZGVsTG9nZ2luZ1ZlcmJvc2l0eTtcblxuICAvKipcbiAgICogTGlzdCBvZiBjYWxsYmFja3MgdG8gYmUgY2FsbGVkIGR1cmluZyB0cmFpbmluZy5cbiAgICogQ2FuIGhhdmUgb25lIG9yIG1vcmUgb2YgdGhlIGZvbGxvd2luZyBjYWxsYmFja3M6XG4gICAqICAgLSBgb25UcmFpbkJlZ2luKGxvZ3MpYDogY2FsbGVkIHdoZW4gdHJhaW5pbmcgc3RhcnRzLlxuICAgKiAgIC0gYG9uVHJhaW5FbmQobG9ncylgOiBjYWxsZWQgd2hlbiB0cmFpbmluZyBlbmRzLlxuICAgKiAgIC0gYG9uRXBvY2hCZWdpbihlcG9jaCwgbG9ncylgOiBjYWxsZWQgYXQgdGhlIHN0YXJ0IG9mIGV2ZXJ5IGVwb2NoLlxuICAgKiAgIC0gYG9uRXBvY2hFbmQoZXBvY2gsIGxvZ3MpYDogY2FsbGVkIGF0IHRoZSBlbmQgb2YgZXZlcnkgZXBvY2guXG4gICAqICAgLSBgb25CYXRjaEJlZ2luKGJhdGNoLCBsb2dzKWA6IGNhbGxlZCBhdCB0aGUgc3RhcnQgb2YgZXZlcnkgYmF0Y2guXG4gICAqICAgLSBgb25CYXRjaEVuZChiYXRjaCwgbG9ncylgOiBjYWxsZWQgYXQgdGhlIGVuZCBvZiBldmVyeSBiYXRjaC5cbiAgICogICAtIGBvbllpZWxkKGVwb2NoLCBiYXRjaCwgbG9ncylgOiBjYWxsZWQgZXZlcnkgYHlpZWxkRXZlcnlgIG1pbGxpc2Vjb25kc1xuICAgKiAgICAgIHdpdGggdGhlIGN1cnJlbnQgZXBvY2gsIGJhdGNoIGFuZCBsb2dzLiBUaGUgbG9ncyBhcmUgdGhlIHNhbWVcbiAgICogICAgICBhcyBpbiBgb25CYXRjaEVuZCgpYC4gTm90ZSB0aGF0IGBvbllpZWxkYCBjYW4gc2tpcCBiYXRjaGVzIG9yXG4gICAqICAgICAgZXBvY2hzLiBTZWUgYWxzbyBkb2NzIGZvciBgeWllbGRFdmVyeWAgYmVsb3cuXG4gICAqL1xuICBjYWxsYmFja3M/OiBCYXNlQ2FsbGJhY2tbXXxDdXN0b21DYWxsYmFja0FyZ3N8Q3VzdG9tQ2FsbGJhY2tBcmdzW107XG5cbiAgLyoqXG4gICAqIERhdGEgb24gd2hpY2ggdG8gZXZhbHVhdGUgdGhlIGxvc3MgYW5kIGFueSBtb2RlbFxuICAgKiBtZXRyaWNzIGF0IHRoZSBlbmQgb2YgZWFjaCBlcG9jaC4gVGhlIG1vZGVsIHdpbGwgbm90IGJlIHRyYWluZWQgb24gdGhpc1xuICAgKiBkYXRhLiBUaGlzIGNvdWxkIGJlIGFueSBvZiB0aGUgZm9sbG93aW5nOlxuICAgKlxuICAgKiAgIC0gQW4gYXJyYXkgYFt4VmFsLCB5VmFsXWAsIHdoZXJlIHRoZSB0d28gdmFsdWVzIG1heSBiZSBgdGYuVGVuc29yYCxcbiAgICogICAgIGFuIGFycmF5IG9mIFRlbnNvcnMsIG9yIGEgbWFwIG9mIHN0cmluZyB0byBUZW5zb3IuXG4gICAqICAgLSBTaW1pbGFybHksIGFuIGFycmF5IGAgW3hWYWwsIHlWYWwsIHZhbFNhbXBsZVdlaWdodHNdYFxuICAgKiAgICAgKG5vdCBpbXBsZW1lbnRlZCB5ZXQpLlxuICAgKiAgIC0gYSBgRGF0YXNldGAgb2JqZWN0IHdpdGggZWxlbWVudHMgb2YgdGhlIGZvcm0gYHt4czogeFZhbCwgeXM6IHlWYWx9YCxcbiAgICogICAgIHdoZXJlIGB4c2AgYW5kIGB5c2AgYXJlIHRoZSBmZWF0dXJlIGFuZCBsYWJlbCB0ZW5zb3JzLCByZXNwZWN0aXZlbHkuXG4gICAqXG4gICAqIElmIGB2YWxpZGF0aW9uRGF0YWAgaXMgYW4gQXJyYXkgb2YgVGVuc29yIG9iamVjdHMsIGVhY2ggYHRmLlRlbnNvcmAgd2lsbCBiZVxuICAgKiBzbGljZWQgaW50byBiYXRjaGVzIGR1cmluZyB2YWxpZGF0aW9uLCB1c2luZyB0aGUgcGFyYW1ldGVyXG4gICAqIGB2YWxpZGF0aW9uQmF0Y2hTaXplYCAod2hpY2ggZGVmYXVsdHMgdG8gMzIpLiBUaGUgZW50aXJldHkgb2YgdGhlXG4gICAqIGB0Zi5UZW5zb3JgIG9iamVjdHMgd2lsbCBiZSB1c2VkIGluIHRoZSB2YWxpZGF0aW9uLlxuICAgKlxuICAgKiBJZiBgdmFsaWRhdGlvbkRhdGFgIGlzIGEgZGF0YXNldCBvYmplY3QsIGFuZCB0aGUgYHZhbGlkYXRpb25CYXRjaGVzYFxuICAgKiBwYXJhbWV0ZXIgaXMgc3BlY2lmaWVkLCB0aGUgdmFsaWRhdGlvbiB3aWxsIHVzZSBgdmFsaWRhdGlvbkJhdGNoZXNgIGJhdGNoZXNcbiAgICogZHJhd24gZnJvbSB0aGUgZGF0YXNldCBvYmplY3QuIElmIGB2YWxpZGF0aW9uQmF0Y2hlc2AgcGFyYW1ldGVyIGlzIG5vdFxuICAgKiBzcGVjaWZpZWQsIHRoZSB2YWxpZGF0aW9uIHdpbGwgc3RvcCB3aGVuIHRoZSBkYXRhc2V0IGlzIGV4aGF1c3RlZC5cbiAgICpcbiAgICogVGhlIG1vZGVsIHdpbGwgbm90IGJlIHRyYWluZWQgb24gdGhpcyBkYXRhLlxuICAgKi9cbiAgdmFsaWRhdGlvbkRhdGE/OiBbXG4gICAgVGVuc29yT3JBcnJheU9yTWFwLCBUZW5zb3JPckFycmF5T3JNYXBcbiAgXXxbVGVuc29yT3JBcnJheU9yTWFwLCBUZW5zb3JPckFycmF5T3JNYXAsIFRlbnNvck9yQXJyYXlPck1hcF18RGF0YXNldDxUPjtcblxuICAvKipcbiAgICogT3B0aW9uYWwgYmF0Y2ggc2l6ZSBmb3IgdmFsaWRhdGlvbi5cbiAgICpcbiAgICogVXNlZCBvbmx5IGlmIGB2YWxpZGF0aW9uRGF0YWAgaXMgYW4gYXJyYXkgb2YgYHRmLlRlbnNvcmAgb2JqZWN0cywgaS5lLiwgbm90XG4gICAqIGEgZGF0YXNldCBvYmplY3QuXG4gICAqXG4gICAqIElmIG5vdCBzcGVjaWZpZWQsIGl0cyB2YWx1ZSBkZWZhdWx0cyB0byAzMi5cbiAgICovXG4gIHZhbGlkYXRpb25CYXRjaFNpemU/OiBudW1iZXI7XG5cbiAgLyoqXG4gICAqIChPcHRpb25hbCkgT25seSByZWxldmFudCBpZiBgdmFsaWRhdGlvbkRhdGFgIGlzIHNwZWNpZmllZCBhbmQgaXMgYSBkYXRhc2V0XG4gICAqIG9iamVjdC5cbiAgICpcbiAgICogVG90YWwgbnVtYmVyIG9mIGJhdGNoZXMgb2Ygc2FtcGxlcyB0byBkcmF3IGZyb20gYHZhbGlkYXRpb25EYXRhYCBmb3JcbiAgICogdmFsaWRhdGlvbiBwdXJwb3NlIGJlZm9yZSBzdG9wcGluZyBhdCB0aGUgZW5kIG9mIGV2ZXJ5IGVwb2NoLiBJZiBub3RcbiAgICogc3BlY2lmaWVkLCBgZXZhbHVhdGVEYXRhc2V0YCB3aWxsIHVzZSBgaXRlcmF0b3IubmV4dCgpLmRvbmVgIGFzIHNpZ25hbCB0b1xuICAgKiBzdG9wIHZhbGlkYXRpb24uXG4gICAqL1xuICB2YWxpZGF0aW9uQmF0Y2hlcz86IG51bWJlcjtcblxuICAvKipcbiAgICogQ29uZmlndXJlcyB0aGUgZnJlcXVlbmN5IG9mIHlpZWxkaW5nIHRoZSBtYWluIHRocmVhZCB0byBvdGhlciB0YXNrcy5cbiAgICpcbiAgICogSW4gdGhlIGJyb3dzZXIgZW52aXJvbm1lbnQsIHlpZWxkaW5nIHRoZSBtYWluIHRocmVhZCBjYW4gaW1wcm92ZSB0aGVcbiAgICogcmVzcG9uc2l2ZW5lc3Mgb2YgdGhlIHBhZ2UgZHVyaW5nIHRyYWluaW5nLiBJbiB0aGUgTm9kZS5qcyBlbnZpcm9ubWVudCxcbiAgICogaXQgY2FuIGVuc3VyZSB0YXNrcyBxdWV1ZWQgaW4gdGhlIGV2ZW50IGxvb3AgY2FuIGJlIGhhbmRsZWQgaW4gYSB0aW1lbHlcbiAgICogbWFubmVyLlxuICAgKlxuICAgKiBUaGUgdmFsdWUgY2FuIGJlIG9uZSBvZiB0aGUgZm9sbG93aW5nOlxuICAgKiAgIC0gYCdhdXRvJ2A6IFRoZSB5aWVsZGluZyBoYXBwZW5zIGF0IGEgY2VydGFpbiBmcmFtZSByYXRlIChjdXJyZW50bHkgc2V0XG4gICAqICAgICAgICAgICAgICAgYXQgMTI1bXMpLiBUaGlzIGlzIHRoZSBkZWZhdWx0LlxuICAgKiAgIC0gYCdiYXRjaCdgOiB5aWVsZCBldmVyeSBiYXRjaC5cbiAgICogICAtIGAnZXBvY2gnYDogeWllbGQgZXZlcnkgZXBvY2guXG4gICAqICAgLSBhIGBudW1iZXJgOiBXaWxsIHlpZWxkIGV2ZXJ5IGBudW1iZXJgIG1pbGxpc2Vjb25kcy5cbiAgICogICAtIGAnbmV2ZXInYDogbmV2ZXIgeWllbGQuIChCdXQgeWllbGRpbmcgY2FuIHN0aWxsIGhhcHBlbiB0aHJvdWdoIGBhd2FpdFxuICAgKiAgICAgIG5leHRGcmFtZSgpYCBjYWxscyBpbiBjdXN0b20gY2FsbGJhY2tzLilcbiAgICovXG4gIHlpZWxkRXZlcnk/OiBZaWVsZEV2ZXJ5T3B0aW9ucztcblxuICAvKipcbiAgICogRXBvY2ggYXQgd2hpY2ggdG8gc3RhcnQgdHJhaW5pbmcgKHVzZWZ1bCBmb3IgcmVzdW1pbmcgYSBwcmV2aW91cyB0cmFpbmluZ1xuICAgKiBydW4pLiBXaGVuIHRoaXMgaXMgdXNlZCwgYGVwb2Noc2AgaXMgdGhlIGluZGV4IG9mIHRoZSBcImZpbmFsIGVwb2NoXCIuXG4gICAqIFRoZSBtb2RlbCBpcyBub3QgdHJhaW5lZCBmb3IgYSBudW1iZXIgb2YgaXRlcmF0aW9ucyBnaXZlbiBieSBgZXBvY2hzYCxcbiAgICogYnV0IG1lcmVseSB1bnRpbCB0aGUgZXBvY2ggb2YgaW5kZXggYGVwb2Noc2AgaXMgcmVhY2hlZC5cbiAgICovXG4gIGluaXRpYWxFcG9jaD86IG51bWJlcjtcblxuICAvKipcbiAgICogT3B0aW9uYWwgb2JqZWN0IG1hcHBpbmcgY2xhc3MgaW5kaWNlcyAoaW50ZWdlcnMpIHRvXG4gICAqIGEgd2VpZ2h0IChmbG9hdCkgdG8gYXBwbHkgdG8gdGhlIG1vZGVsJ3MgbG9zcyBmb3IgdGhlIHNhbXBsZXMgZnJvbSB0aGlzXG4gICAqIGNsYXNzIGR1cmluZyB0cmFpbmluZy4gVGhpcyBjYW4gYmUgdXNlZnVsIHRvIHRlbGwgdGhlIG1vZGVsIHRvIFwicGF5IG1vcmVcbiAgICogYXR0ZW50aW9uXCIgdG8gc2FtcGxlcyBmcm9tIGFuIHVuZGVyLXJlcHJlc2VudGVkIGNsYXNzLlxuICAgKlxuICAgKiBJZiB0aGUgbW9kZWwgaGFzIG11bHRpcGxlIG91dHB1dHMsIGEgY2xhc3Mgd2VpZ2h0IGNhbiBiZSBzcGVjaWZpZWQgZm9yXG4gICAqIGVhY2ggb2YgdGhlIG91dHB1dHMgYnkgc2V0dGluZyB0aGlzIGZpZWxkIGFuIGFycmF5IG9mIHdlaWdodCBvYmplY3RcbiAgICogb3IgYW4gb2JqZWN0IHRoYXQgbWFwcyBtb2RlbCBvdXRwdXQgbmFtZXMgKGUuZy4sIGBtb2RlbC5vdXRwdXROYW1lc1swXWApXG4gICAqIHRvIHdlaWdodCBvYmplY3RzLlxuICAgKi9cbiAgY2xhc3NXZWlnaHQ/OiBDbGFzc1dlaWdodHxDbGFzc1dlaWdodFtdfENsYXNzV2VpZ2h0TWFwO1xufVxuXG5leHBvcnQgaW50ZXJmYWNlIEZpdERhdGFzZXRFbGVtZW50IHtcbiAgeHM6IFRlbnNvck9yQXJyYXlPck1hcDtcbiAgeXM6IFRlbnNvck9yQXJyYXlPck1hcDtcbn1cblxuLyoqXG4gKiBJbnRlcmZhY2UgZm9yIGNvbmZpZ3VyaW5nIG1vZGVsIGV2YWx1YXRpb24gYmFzZWQgb24gYSBkYXRhc2V0IG9iamVjdC5cbiAqL1xuZXhwb3J0IGludGVyZmFjZSBNb2RlbEV2YWx1YXRlRGF0YXNldEFyZ3Mge1xuICAvKipcbiAgICogTnVtYmVyIG9mIGJhdGNoZXMgdG8gZHJhdyBmcm9tIHRoZSBkYXRhc2V0IG9iamVjdCBiZWZvcmUgZW5kaW5nIHRoZVxuICAgKiBldmFsdWF0aW9uLlxuICAgKi9cbiAgYmF0Y2hlcz86IG51bWJlcjtcblxuICAvKipcbiAgICogVmVyYm9zaXR5IG1vZGUuXG4gICAqL1xuICB2ZXJib3NlPzogTW9kZWxMb2dnaW5nVmVyYm9zaXR5O1xufVxuXG4vLyBEZWZhdWx0IGJhdGNoIHNpemUgdXNlZCBkdXJpbmcgdGVuc29yLWJhc2VkIHZhbGlkYXRpb24uXG5jb25zdCBERUZBVUxUX1ZBTElEQVRJT05fQkFUQ0hfU0laRSA9IDMyO1xuXG4vKipcbiAqIFN0YW5kYXJkaXplIHRoZSBvdXRwdXQgb2YgYSBkYXRhc2V0IGl0ZXJhdG9yIGZvciB1c2UgYnlcbiAqIExheWVyc01vZGVsLmZpdERhdGFzZXQoKS5cbiAqXG4gKiBAcGFyYW0gbW9kZWw6IEEgYHRmLkxheWVyc01vZGVsYCBvYmplY3QuXG4gKiBAcGFyYW0gaXRlcmF0b3JPdXQgVGhlIG91dHB1dCBvZiBhIGRhdGFzZXQgaXRlcmF0b3IuIEl0IGlzIHJlcXVpcmVkIHRvIGJlXG4gKiAgIGFuIG9iamVjdCBvZiB0aGUgZm9ybSBge3hzOiBUZW5zb3JPckFycmF5T3JNYXAsIHlzOlxuICogVGVuc29yT3JBcnJheU9yTWFwfWAsIHdoZXJlIGBUZW5zb3JPckFycmF5T3JNYXBgIGlzIGEgc2luZ2xlIGB0Zi5UZW5zb3JgLFxuICogYSBgdGYuVGVuc29yW11gLCBvciBhIGZsYXQgbWFwIGZyb20gc3RyaW5nIG5hbWVzIHRvIGB0Zi5UZW5zb3Jgcy5cbiAqIEByZXR1cm5zIEEgZmxhdCBhcnJheSBvZiBgdGYuVGVuc29yYCBvYmplY3RzOiB0aGUgaW5wdXQgYHRmLlRlbnNvcmBzXG4gKiAgIGZvbGxvd2VkIGJ5IHRoZSB0YXJnZXQgYHRmLlRlbnNvcmBzLiAgV2hlbiBgdGYuVGVuc29yYHMgYXJlIHByb3ZpZGVkXG4gKiAgIGFzIGEgbWFwLCB0aGUgb3JkZXIgaW4gdGhlIHJlc3VsdGluZyBhcnJheSBpcyB0YWtlbiBmcm9tIHRoZSBgaW5wdXROYW1lc2BcbiAqICAgYW5kIGBvdXRwdXROYW1lc2Agb2YgdGhlIG1vZGVsLlxuICovXG5mdW5jdGlvbiBzdGFuZGFyZGl6ZURhdGFJdGVyYXRvck91dHB1dChcbiAgICAvLyBUeXBlIGBtb2RlbGAgYXMgYGFueWAgaGVyZSB0byBhdm9pZCBjaXJjdWxhciBkZXBlbmRlbmN5IHcvXG4gICAgLy8gdHJhaW5pbmcudHMuXG4gICAgLy8gdHNsaW50OmRpc2FibGUtbmV4dC1saW5lOm5vLWFueVxuICAgIG1vZGVsOiBhbnksIGl0ZXJhdG9yT3V0OiB7fSk6IHt4czogdGZjLlRlbnNvcltdLCB5czogdGZjLlRlbnNvcltdfSB7XG4gIGxldCB4czogVGVuc29yT3JBcnJheU9yTWFwO1xuICBsZXQgeXM6IFRlbnNvck9yQXJyYXlPck1hcDtcblxuICBjb25zdCBpdGVyYXRvck91dE9iaiA9IGl0ZXJhdG9yT3V0IGFzIEZpdERhdGFzZXRFbGVtZW50O1xuICB4cyA9IGl0ZXJhdG9yT3V0T2JqWyd4cyddO1xuICB5cyA9IGl0ZXJhdG9yT3V0T2JqWyd5cyddO1xuICB0ZmMudXRpbC5hc3NlcnQoXG4gICAgICB4cyAhPSBudWxsICYmIHlzICE9IG51bGwsXG4gICAgICAoKSA9PiAnQSBEYXRhc2V0IGl0ZXJhdG9yIGZvciBmaXREYXRhc2V0KCkgaXMgZXhwZWN0ZWQgdG8gZ2VuZXJhdGUgJyArXG4gICAgICAgICAgJ29iamVjdHMgb2YgdGhlIGZvcm0gYHt4czogeFZhbCwgeXM6IHlWYWx9YCwgd2hlcmUgdGhlIHR3byAnICtcbiAgICAgICAgICAndmFsdWVzIG1heSBiZSBgdGYuVGVuc29yYCwgYW4gYXJyYXkgb2YgVGVuc29ycywgb3IgYSBtYXAgb2YgJyArXG4gICAgICAgICAgJ3N0cmluZyB0byBUZW5zb3IuICBUaGUgcHJvdmlkZWQgRGF0YXNldCBpbnN0ZWFkIGdlbmVyYXRlcyAnICtcbiAgICAgICAgICBgJHtpdGVyYXRvck91dH1gKTtcblxuICBjb25zdCBmbGF0dGVuZWRYczogdGZjLlRlbnNvcltdID1cbiAgICAgIGZsYXR0ZW5UZW5zb3JPckFycmF5T3JNYXAoJ2lucHV0JywgbW9kZWwuaW5wdXROYW1lcywgeHMpO1xuICBjb25zdCBmbGF0dGVuZWRZczogdGZjLlRlbnNvcltdID1cbiAgICAgIGZsYXR0ZW5UZW5zb3JPckFycmF5T3JNYXAoJ291dHB1dCcsIG1vZGVsLm91dHB1dE5hbWVzLCB5cyk7XG5cbiAgY29uc3QgYmF0Y2hTaXplOiBudW1iZXIgPSBmbGF0dGVuZWRYc1swXS5zaGFwZVswXTtcblxuICB0ZmMudXRpbC5hc3NlcnQoXG4gICAgICBmbGF0dGVuZWRYcy5sZW5ndGggPT09IG1vZGVsLmlucHV0cy5sZW5ndGgsXG4gICAgICAoKSA9PiBgTGF5ZXJzTW9kZWwgaGFzICR7bW9kZWwuaW5wdXRzLmxlbmd0aH0gaW5wdXRzLCBidXQgdGhlIGRhdGFzZXQgYCArXG4gICAgICAgICAgYHByb3ZpZGVzICR7ZmxhdHRlbmVkWHMubGVuZ3RofSBpbnB1dHMuICAoRXhwZWN0ZWQgaW5wdXQga2V5czogYCArXG4gICAgICAgICAgYCR7SlNPTi5zdHJpbmdpZnkobW9kZWwuaW5wdXROYW1lcyl9KWApO1xuXG4gIHRmYy51dGlsLmFzc2VydChcbiAgICAgIGZsYXR0ZW5lZFlzLmxlbmd0aCA9PT0gbW9kZWwub3V0cHV0cy5sZW5ndGgsXG4gICAgICAoKSA9PlxuICAgICAgICAgIGBMYXllcnNNb2RlbCBoYXMgJHttb2RlbC5vdXRwdXRzLmxlbmd0aH0gb3V0cHV0cywgYnV0IHRoZSBkYXRhc2V0IGAgK1xuICAgICAgICAgIGBwcm92aWRlcyAke2ZsYXR0ZW5lZFlzLmxlbmd0aH0gb3V0cHV0cy4gIChFeHBlY3RlZCBvdXRwdXQga2V5czogYCArXG4gICAgICAgICAgYCR7SlNPTi5zdHJpbmdpZnkobW9kZWwub3V0cHV0TmFtZXMpfSlgKTtcblxuICBmb3IgKGxldCB4SW5kZXggPSAwOyB4SW5kZXggPCBmbGF0dGVuZWRYcy5sZW5ndGg7IHhJbmRleCsrKSB7XG4gICAgdGZjLnV0aWwuYXNzZXJ0KFxuICAgICAgICBmbGF0dGVuZWRYc1t4SW5kZXhdLnNoYXBlWzBdID09PSBiYXRjaFNpemUsXG4gICAgICAgICgpID0+IGBCYXRjaCBzaXplIG1pc21hdGNoOiBpbnB1dCBgICtcbiAgICAgICAgICAgIGAke21vZGVsLmlucHV0TmFtZXNbeEluZGV4XX0gaGFzICR7XG4gICAgICAgICAgICAgICAgICBmbGF0dGVuZWRYc1t4SW5kZXhdLnNoYXBlWzBdfTsgYCArXG4gICAgICAgICAgICBgZXhwZWN0ZWQgICR7YmF0Y2hTaXplfSBiYXNlZCBvbiBpbnB1dCAke21vZGVsLmlucHV0TmFtZXNbMF19LmApO1xuICB9XG5cbiAgZm9yIChsZXQgeUluZGV4ID0gMDsgeUluZGV4IDwgZmxhdHRlbmVkWXMubGVuZ3RoOyB5SW5kZXgrKykge1xuICAgIHRmYy51dGlsLmFzc2VydChcbiAgICAgICAgZmxhdHRlbmVkWXNbeUluZGV4XS5zaGFwZVswXSA9PT0gYmF0Y2hTaXplLFxuICAgICAgICAoKSA9PiBgQmF0Y2ggc2l6ZSBtaXNtYXRjaDogb3V0cHV0IGAgK1xuICAgICAgICAgICAgYCR7bW9kZWwub3V0cHV0TmFtZXNbeUluZGV4XX0gaGFzICR7XG4gICAgICAgICAgICAgICAgICBmbGF0dGVuZWRZc1t5SW5kZXhdLnNoYXBlWzBdfTsgYCArXG4gICAgICAgICAgICBgZXhwZWN0ZWQgICR7YmF0Y2hTaXplfSBiYXNlZCBvbiBpbnB1dCAke21vZGVsLmlucHV0TmFtZXNbMF19LmApO1xuICB9XG5cbiAgcmV0dXJuIHt4czogZmxhdHRlbmVkWHMsIHlzOiBmbGF0dGVuZWRZc307XG59XG5cbmZ1bmN0aW9uIGZsYXR0ZW5UZW5zb3JPckFycmF5T3JNYXAoXG4gICAgaW5wdXRPck91dHB1dDogc3RyaW5nLCBuYW1lczogc3RyaW5nW10sIHZhbHVlczogVGVuc29yT3JBcnJheU9yTWFwKSB7XG4gIGlmICh2YWx1ZXMgaW5zdGFuY2VvZiB0ZmMuVGVuc29yKSB7XG4gICAgcmV0dXJuIFt2YWx1ZXNdO1xuICB9IGVsc2UgaWYgKEFycmF5LmlzQXJyYXkodmFsdWVzKSkge1xuICAgIHRmYy51dGlsLmFzc2VydChcbiAgICAgICAgdmFsdWVzLmxlbmd0aCA9PT0gbmFtZXMubGVuZ3RoLFxuICAgICAgICAoKSA9PiBgUmVjZWl2ZWQgYW4gYXJyYXkgb2YgJHt2YWx1ZXMubGVuZ3RofSBUZW5zb3JzLCBidXQgZXhwZWN0ZWQgJHtcbiAgICAgICAgICAgIG5hbWVzLmxlbmd0aH0gdG8gbWF0Y2ggdGhlICR7aW5wdXRPck91dHB1dH0ga2V5cyAke25hbWVzfS5gKTtcbiAgICByZXR1cm4gdmFsdWVzO1xuICB9IGVsc2Uge1xuICAgIGNvbnN0IHJlc3VsdDogdGZjLlRlbnNvcltdID0gW107XG4gICAgLy8gQ2hlY2sgdGhhdCBhbGwgdGhlIHJlcXVpcmVkIGtleXMgYXJlIGF2YWlsYWJsZS5cbiAgICBmb3IgKGNvbnN0IG5hbWUgb2YgbmFtZXMpIHtcbiAgICAgIGlmICh2YWx1ZXNbbmFtZV0gPT0gbnVsbCkge1xuICAgICAgICB0aHJvdyBuZXcgVmFsdWVFcnJvcihcbiAgICAgICAgICAgIGBUaGUgZmVhdHVyZSBkYXRhIGdlbmVyYXRlZCBieSB0aGUgZGF0YXNldCBsYWNrcyB0aGUgcmVxdWlyZWQgYCArXG4gICAgICAgICAgICBgJHtpbnB1dE9yT3V0cHV0fSBrZXkgJyR7bmFtZX0nLmApO1xuICAgICAgfVxuICAgICAgcmVzdWx0LnB1c2godmFsdWVzW25hbWVdKTtcbiAgICB9XG4gICAgcmV0dXJuIHJlc3VsdDtcbiAgfVxufVxuXG5mdW5jdGlvbiBzdGFuZGFyZGl6ZVRlbnNvclZhbGlkYXRpb25EYXRhPFQ+KFxuICAgIGRhdGE6XG4gICAgICAgIFtcbiAgICAgICAgICB0ZmMuVGVuc29yfHRmYy5UZW5zb3JbXSwgdGZjLlRlbnNvcnx0ZmMuVGVuc29yW11cbiAgICAgICAgXXxbdGZjLlRlbnNvciB8IHRmYy5UZW5zb3JbXSwgdGZjLlRlbnNvciB8IHRmYy5UZW5zb3JbXSxcbiAgICAgICAgICAgdGZjLlRlbnNvciB8IHRmYy5UZW5zb3JbXV0pOlxuICAgIHt4czogdGZjLlRlbnNvcnx0ZmMuVGVuc29yW10sIHlzOiB0ZmMuVGVuc29yfHRmYy5UZW5zb3JbXX0ge1xuICBpZiAoZGF0YS5sZW5ndGggPT09IDMpIHtcbiAgICB0aHJvdyBuZXcgTm90SW1wbGVtZW50ZWRFcnJvcihcbiAgICAgICAgJ1ZhbGlkYXRpb24gd2l0aCBzYW1wbGUgd2VpZ2h0cyBpcyBub3QgaW1wbGVtZW50ZWQgeWV0LicpO1xuICB9XG4gIHJldHVybiB7eHM6IGRhdGFbMF0sIHlzOiBkYXRhWzFdfTtcbn1cblxuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIGZpdERhdGFzZXQ8VD4oXG4gICAgLy8gVHlwZSBgbW9kZWxgIGFzIGBhbnlgIGhlcmUgdG8gYXZvaWQgY2lyY3VsYXIgZGVwZW5kZW5jeSB3L1xuICAgIC8vIHRyYWluaW5nLnRzLlxuICAgIC8vIHRzbGludDpkaXNhYmxlLW5leHQtbGluZTpuby1hbnlcbiAgICBtb2RlbDogYW55LCBkYXRhc2V0OiBEYXRhc2V0PFQ+LFxuICAgIGFyZ3M6IE1vZGVsRml0RGF0YXNldEFyZ3M8VD4pOiBQcm9taXNlPEhpc3Rvcnk+IHtcbiAgY29uc3QgaGFzQmF0Y2hlc1BlckVwb2NoID0gYXJncy5iYXRjaGVzUGVyRXBvY2ggIT0gbnVsbDtcbiAgdGZjLnV0aWwuYXNzZXJ0KFxuICAgICAgbW9kZWwub3B0aW1pemVyICE9IG51bGwsXG4gICAgICAoKSA9PiAnWW91IG11c3QgY29tcGlsZSBhIG1vZGVsIGJlZm9yZSB0cmFpbmluZy90ZXN0aW5nLiBVc2UgJyArXG4gICAgICAgICAgJ0xheWVyc01vZGVsLmNvbXBpbGUobW9kZWxDb21waWxlQ29uZmlnKS4nKTtcblxuICB0ZmMudXRpbC5hc3NlcnQoXG4gICAgICBhcmdzICE9IG51bGwsXG4gICAgICAoKSA9PiBgRm9yIGZpdERhdGFzZXQoKSwgdGhlIDJuZCBhcmd1bWVudCAoY29uZmlnKSBpcyByZXF1aXJlZCwgYCArXG4gICAgICAgICAgYGJ1dCBpdCBpcyBub3QgcHJvdmlkZWQgaW4gdGhpcyBjYWxsLmApO1xuICB0ZmMudXRpbC5hc3NlcnQoXG4gICAgICBhcmdzLmVwb2NocyAhPSBudWxsICYmIGFyZ3MuZXBvY2hzID4gMCAmJiBOdW1iZXIuaXNJbnRlZ2VyKGFyZ3MuZXBvY2hzKSxcbiAgICAgICgpID0+IGBGb3IgZml0RGF0YXNldCgpLCBjb25maWcuZXBvY2hzIGlzIGV4cGVjdGVkIHRvIGJlIGEgcG9zaXRpdmUgYCArXG4gICAgICAgICAgYGludGVnZXIsIGJ1dCBnb3QgJHthcmdzLmVwb2Noc31gKTtcbiAgdGZjLnV0aWwuYXNzZXJ0KFxuICAgICAgIWhhc0JhdGNoZXNQZXJFcG9jaCB8fFxuICAgICAgICAgIChhcmdzLmJhdGNoZXNQZXJFcG9jaCA+IDAgJiYgTnVtYmVyLmlzSW50ZWdlcihhcmdzLmJhdGNoZXNQZXJFcG9jaCkpLFxuICAgICAgKCkgPT4gYEZvciBmaXREYXRhc2V0KCksIGNvbmZpZy5iYXRjaGVzUGVyRXBvY2ggaXMgZXhwZWN0ZWQgdG8gYmUgYSBgICtcbiAgICAgICAgICBgcG9zaXRpdmUgaW50ZWdlciBpZiBzcGVjaWZpZWQsIGJ1dCBnb3QgJHthcmdzLmJhdGNoZXNQZXJFcG9jaH1gKTtcbiAgdGZjLnV0aWwuYXNzZXJ0KFxuICAgICAgLy8gdHNsaW50OmRpc2FibGUtbmV4dC1saW5lOm5vLWFueVxuICAgICAgKGFyZ3MgYXMgYW55KVsndmFsaWRhdGlvblNwbGl0J10gPT0gbnVsbCxcbiAgICAgICgpID0+ICdgdmFsaWRhdGlvblNwbGl0YCBpcyBub3Qgc3VwcG9ydGVkIGJ5IGBmaXREYXRhc2V0KClgLiAnICtcbiAgICAgICAgICAnVXNlIHZhbGlkYXRpb25EYXRhIGluc3RlYWQuJyk7XG5cbiAgaWYgKG1vZGVsLmlzVHJhaW5pbmcpIHtcbiAgICB0aHJvdyBuZXcgRXJyb3IoXG4gICAgICAgICdDYW5ub3Qgc3RhcnQgdHJhaW5pbmcgYmVjYXVzZSBhbm90aGVyIGZpdCgpIGNhbGwgaXMgb25nb2luZy4nKTtcbiAgfVxuICBtb2RlbC5pc1RyYWluaW5nID0gdHJ1ZTtcblxuICB0cnkge1xuICAgIGNvbnN0IGRvVmFsaWRhdGlvbiA9IGFyZ3MudmFsaWRhdGlvbkRhdGEgIT0gbnVsbDtcbiAgICBsZXQgdmFsWHM6IHRmYy5UZW5zb3J8dGZjLlRlbnNvcltdO1xuICAgIGxldCB2YWxZczogdGZjLlRlbnNvcnx0ZmMuVGVuc29yW107XG4gICAgaWYgKGRvVmFsaWRhdGlvbikge1xuICAgICAgaWYgKGlzRGF0YXNldE9iamVjdChhcmdzLnZhbGlkYXRpb25EYXRhKSkge1xuICAgICAgICB0ZmMudXRpbC5hc3NlcnQoXG4gICAgICAgICAgICBhcmdzLnZhbGlkYXRpb25CYXRjaGVzID09IG51bGwgfHxcbiAgICAgICAgICAgICAgICAoYXJncy52YWxpZGF0aW9uQmF0Y2hlcyA+IDAgJiZcbiAgICAgICAgICAgICAgICAgTnVtYmVyLmlzSW50ZWdlcihhcmdzLnZhbGlkYXRpb25CYXRjaGVzKSksXG4gICAgICAgICAgICAoKSA9PiBgRm9yIGZpdERhdGFzZXQoKSB3aXRoIGRhdGFzZXQtYmFzZWQgdmFsaWRhdGlvbiwgYCArXG4gICAgICAgICAgICAgICAgYGNvbmZpZy52YWxpZGF0aW9uQmF0Y2hlcyBpcyBleHBlY3RlZCBub3QgdG8gYmUgcHJvdmlkZWQsIGAgK1xuICAgICAgICAgICAgICAgIGBvciB0byBiZSBhIHBvc2l0aXZlIGludGVnZXIsIGAgK1xuICAgICAgICAgICAgICAgIGBidXQgZ290ICR7YXJncy52YWxpZGF0aW9uQmF0Y2hlc31gKTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIGNvbnN0IHZhbGlkYXRpb25EYXRhID0gc3RhbmRhcmRpemVUZW5zb3JWYWxpZGF0aW9uRGF0YShcbiAgICAgICAgICAgIGFyZ3MudmFsaWRhdGlvbkRhdGEgYXNcbiAgICAgICAgICAgICAgICAgICAgW3RmYy5UZW5zb3IgfCB0ZmMuVGVuc29yW10sIHRmYy5UZW5zb3IgfCB0ZmMuVGVuc29yW11dIHxcbiAgICAgICAgICAgIFtcbiAgICAgICAgICAgICAgdGZjLlRlbnNvciB8IHRmYy5UZW5zb3JbXSwgdGZjLlRlbnNvciB8IHRmYy5UZW5zb3JbXSxcbiAgICAgICAgICAgICAgdGZjLlRlbnNvciB8IHRmYy5UZW5zb3JbXVxuICAgICAgICAgICAgXSk7XG4gICAgICAgIHZhbFhzID0gdmFsaWRhdGlvbkRhdGEueHM7XG4gICAgICAgIHZhbFlzID0gdmFsaWRhdGlvbkRhdGEueXM7XG4gICAgICB9XG4gICAgfVxuXG4gICAgY29uc3QgdHJhaW5GdW5jdGlvbiA9IG1vZGVsLm1ha2VUcmFpbkZ1bmN0aW9uKCk7XG4gICAgY29uc3Qgb3V0TGFiZWxzID0gbW9kZWwuZ2V0RGVkdXBlZE1ldHJpY3NOYW1lcygpIGFzIHN0cmluZ1tdO1xuXG4gICAgbGV0IGNhbGxiYWNrTWV0cmljczogc3RyaW5nW107XG4gICAgaWYgKGRvVmFsaWRhdGlvbikge1xuICAgICAgY2FsbGJhY2tNZXRyaWNzID1cbiAgICAgICAgICBvdXRMYWJlbHMuc2xpY2UoKS5jb25jYXQob3V0TGFiZWxzLm1hcChuID0+ICd2YWxfJyArIG4pKTtcbiAgICB9IGVsc2Uge1xuICAgICAgY2FsbGJhY2tNZXRyaWNzID0gb3V0TGFiZWxzLnNsaWNlKCk7XG4gICAgfVxuXG4gICAgY29uc3QgY2FsbGJhY2tzID0gc3RhbmRhcmRpemVDYWxsYmFja3MoYXJncy5jYWxsYmFja3MsIGFyZ3MueWllbGRFdmVyeSk7XG4gICAgY29uc3QgdmVyYm9zZSA9IGFyZ3MudmVyYm9zZSA9PSBudWxsID8gMSA6IGFyZ3MudmVyYm9zZTtcbiAgICBjb25zdCB7Y2FsbGJhY2tMaXN0LCBoaXN0b3J5fSA9IGNvbmZpZ3VyZUNhbGxiYWNrcyhcbiAgICAgICAgY2FsbGJhY2tzLCB2ZXJib3NlLCBhcmdzLmVwb2NocywgbnVsbCwgbnVsbCxcbiAgICAgICAgZ2V0U3RlcHNQZXJFcG9jaChkYXRhc2V0LCBhcmdzKSxcbiAgICAgICAgbnVsbCwgIC8vIEJhdGNoIHNpemUgZGV0ZXJtaW5lZCBieSB0aGUgZGF0YXNldCBpdHNlbGYuXG4gICAgICAgIGRvVmFsaWRhdGlvbiwgY2FsbGJhY2tNZXRyaWNzKTtcbiAgICBjYWxsYmFja0xpc3Quc2V0TW9kZWwobW9kZWwpO1xuICAgIG1vZGVsLmhpc3RvcnkgPSBoaXN0b3J5O1xuXG4gICAgYXdhaXQgY2FsbGJhY2tMaXN0Lm9uVHJhaW5CZWdpbigpO1xuICAgIG1vZGVsLnN0b3BUcmFpbmluZ18gPSBmYWxzZTtcbiAgICBsZXQgZXBvY2ggPSBhcmdzLmluaXRpYWxFcG9jaCA9PSBudWxsID8gMCA6IGFyZ3MuaW5pdGlhbEVwb2NoO1xuXG4gICAgbGV0IGRhdGFJdGVyYXRvciA9IGF3YWl0IGRhdGFzZXQuaXRlcmF0b3IoKTtcbiAgICB3aGlsZSAoZXBvY2ggPCBhcmdzLmVwb2Nocykge1xuICAgICAgY29uc3QgZXBvY2hMb2dzOiBVbnJlc29sdmVkTG9ncyA9IHt9O1xuICAgICAgYXdhaXQgY2FsbGJhY2tMaXN0Lm9uRXBvY2hCZWdpbihlcG9jaCk7XG4gICAgICBsZXQgc3RlcHNEb25lID0gMDtcbiAgICAgIGxldCBiYXRjaEluZGV4ID0gMDtcbiAgICAgIGlmICghaGFzQmF0Y2hlc1BlckVwb2NoKSB7XG4gICAgICAgIGRhdGFJdGVyYXRvciA9IGF3YWl0IGRhdGFzZXQuaXRlcmF0b3IoKTtcbiAgICAgIH1cbiAgICAgIHdoaWxlIChoYXNCYXRjaGVzUGVyRXBvY2ggPyBzdGVwc0RvbmUgPCBhcmdzLmJhdGNoZXNQZXJFcG9jaCA6IHRydWUpIHtcbiAgICAgICAgY29uc3QgaXRlcmF0b3JPdXQgPSBhd2FpdCBkYXRhSXRlcmF0b3IubmV4dCgpO1xuXG4gICAgICAgIC8vIElmIGBiYXRjaGVzUGVyRXBvY2hgIGlzIHNwZWNpZmllZCwgdGhlIGRhdGFzZXQgc2hvdWxkIG5vdCBiZVxuICAgICAgICAvLyBleGhhdXN0ZWQgdW50aWwgYWxsIGVwb2NoZXMgYXJlIGRvbmUuXG4gICAgICAgIGlmIChoYXNCYXRjaGVzUGVyRXBvY2ggJiYgaXRlcmF0b3JPdXQuZG9uZSkge1xuICAgICAgICAgIGNvbnNvbGUud2FybihcbiAgICAgICAgICAgICAgJ1lvdSBwcm92aWRlZCBgYmF0Y2hlc1BlckVwb2NoYCBhcyAnICtcbiAgICAgICAgICAgICAgYCR7YXJncy5iYXRjaGVzUGVyRXBvY2h9LCBgICtcbiAgICAgICAgICAgICAgJ2J1dCB5b3VyIGRhdGFzZXQgaXRlcmF0b3IgcmFuIG91dCBvZiBkYXRhIGFmdGVyICcgK1xuICAgICAgICAgICAgICBgJHtzdGVwc0RvbmV9IGJhdGNoZXM7IGAgK1xuICAgICAgICAgICAgICAnaW50ZXJydXB0aW5nIHRyYWluaW5nLiBNYWtlIHN1cmUgdGhhdCB5b3VyICcgK1xuICAgICAgICAgICAgICAnZGF0YXNldCBjYW4gZ2VuZXJhdGUgYXQgbGVhc3QgYGJhdGNoZXNQZXJFcG9jaCAqIGVwb2Noc2AgJyArXG4gICAgICAgICAgICAgICdiYXRjaGVzIChpbiB0aGlzIGNhc2UsICcgK1xuICAgICAgICAgICAgICBgJHthcmdzLmJhdGNoZXNQZXJFcG9jaCAqIGFyZ3MuZXBvY2hzfSBiYXRjaGVzKS4gYCArXG4gICAgICAgICAgICAgICdZb3UgbWF5IG5lZWQgdG8gdXNlIHRoZSByZXBlYXQoKSBmdW5jdGlvbiB3aGVuIGJ1aWxkaW5nICcgK1xuICAgICAgICAgICAgICAneW91ciBkYXRhc2V0LicpO1xuICAgICAgICAgIGJyZWFrO1xuICAgICAgICB9XG5cbiAgICAgICAgaWYgKGl0ZXJhdG9yT3V0LnZhbHVlICE9IG51bGwpIHtcbiAgICAgICAgICBjb25zdCB7eHMsIHlzfSA9XG4gICAgICAgICAgICAgIHN0YW5kYXJkaXplRGF0YUl0ZXJhdG9yT3V0cHV0KG1vZGVsLCBpdGVyYXRvck91dC52YWx1ZSk7XG4gICAgICAgICAgY29uc3QgYmF0Y2hMb2dzOiBVbnJlc29sdmVkTG9ncyA9IHt9O1xuICAgICAgICAgIGJhdGNoTG9nc1snYmF0Y2gnXSA9IGJhdGNoSW5kZXg7XG4gICAgICAgICAgYmF0Y2hMb2dzWydzaXplJ10gPSB4c1swXS5zaGFwZVswXTtcblxuICAgICAgICAgIGF3YWl0IGNhbGxiYWNrTGlzdC5vbkJhdGNoQmVnaW4oYmF0Y2hJbmRleCwgYmF0Y2hMb2dzKTtcblxuICAgICAgICAgIGNvbnN0IHNhbXBsZVdlaWdodHM6IHRmYy5UZW5zb3JbXSA9IFtdO1xuICAgICAgICAgIGlmIChhcmdzLmNsYXNzV2VpZ2h0ICE9IG51bGwpIHtcbiAgICAgICAgICAgIGNvbnN0IHN0YW5kYXJkQ2xhc3NXZWlnaHRzID1cbiAgICAgICAgICAgICAgICBzdGFuZGFyZGl6ZUNsYXNzV2VpZ2h0cyhhcmdzLmNsYXNzV2VpZ2h0LCBtb2RlbC5vdXRwdXROYW1lcyk7XG4gICAgICAgICAgICBmb3IgKGxldCBpID0gMDsgaSA8IHN0YW5kYXJkQ2xhc3NXZWlnaHRzLmxlbmd0aDsgKytpKSB7XG4gICAgICAgICAgICAgIHNhbXBsZVdlaWdodHMucHVzaChhd2FpdCBzdGFuZGFyZGl6ZVdlaWdodHMoXG4gICAgICAgICAgICAgICAgICB5c1tpXSwgbnVsbCwgc3RhbmRhcmRDbGFzc1dlaWdodHNbaV0pKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9XG5cbiAgICAgICAgICAvLyBUcmFpbiBvbiBiYXRjaC5cbiAgICAgICAgICBjb25zdCBpbnMgPSB4cy5jb25jYXQoeXMpLmNvbmNhdChzYW1wbGVXZWlnaHRzKTtcbiAgICAgICAgICBjb25zdCBvdXRzID0gdHJhaW5GdW5jdGlvbihpbnMpO1xuICAgICAgICAgIHRmYy5kaXNwb3NlKGlucyk7XG4gICAgICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCBvdXRMYWJlbHMubGVuZ3RoOyArK2kpIHtcbiAgICAgICAgICAgIGNvbnN0IGxhYmVsID0gb3V0TGFiZWxzW2ldO1xuICAgICAgICAgICAgY29uc3Qgb3V0ID0gb3V0c1tpXTtcbiAgICAgICAgICAgIGJhdGNoTG9nc1tsYWJlbF0gPSBvdXQ7XG4gICAgICAgICAgICB0ZmMua2VlcChvdXQpO1xuICAgICAgICAgIH1cblxuICAgICAgICAgIGF3YWl0IGNhbGxiYWNrTGlzdC5vbkJhdGNoRW5kKGJhdGNoSW5kZXgsIGJhdGNoTG9ncyk7XG4gICAgICAgICAgZGlzcG9zZVRlbnNvcnNJbkxvZ3MoYmF0Y2hMb2dzKTtcblxuICAgICAgICAgIGJhdGNoSW5kZXgrKztcbiAgICAgICAgICBzdGVwc0RvbmUrKztcbiAgICAgICAgfVxuXG4gICAgICAgIGlmIChoYXNCYXRjaGVzUGVyRXBvY2ggPyBzdGVwc0RvbmUgPj0gYXJncy5iYXRjaGVzUGVyRXBvY2ggOlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaXRlcmF0b3JPdXQuZG9uZSkge1xuICAgICAgICAgIC8vIEVwb2NoIGZpbmlzaGVkLiBQZXJmb3JtIHZhbGlkYXRpb24uXG4gICAgICAgICAgaWYgKGRvVmFsaWRhdGlvbikge1xuICAgICAgICAgICAgbGV0IHZhbE91dHM6IHRmYy5TY2FsYXJbXTtcbiAgICAgICAgICAgIGlmIChpc0RhdGFzZXRPYmplY3QoYXJncy52YWxpZGF0aW9uRGF0YSkpIHtcbiAgICAgICAgICAgICAgdmFsT3V0cyA9IHRvTGlzdChhd2FpdCBtb2RlbC5ldmFsdWF0ZURhdGFzZXQoXG4gICAgICAgICAgICAgICAgICBhcmdzLnZhbGlkYXRpb25EYXRhLCB7YmF0Y2hlczogYXJncy52YWxpZGF0aW9uQmF0Y2hlc30pKTtcbiAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgIHZhbE91dHMgPSB0b0xpc3QobW9kZWwuZXZhbHVhdGUodmFsWHMsIHZhbFlzLCB7XG4gICAgICAgICAgICAgICAgYmF0Y2hTaXplOiBhcmdzLnZhbGlkYXRpb25CYXRjaFNpemUgPT0gbnVsbCA/XG4gICAgICAgICAgICAgICAgICAgIERFRkFVTFRfVkFMSURBVElPTl9CQVRDSF9TSVpFIDpcbiAgICAgICAgICAgICAgICAgICAgYXJncy52YWxpZGF0aW9uQmF0Y2hTaXplLFxuICAgICAgICAgICAgICAgIHZlcmJvc2U6IDBcbiAgICAgICAgICAgICAgfSkpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCBtb2RlbC5tZXRyaWNzTmFtZXMubGVuZ3RoOyArK2kpIHtcbiAgICAgICAgICAgICAgZXBvY2hMb2dzW2B2YWxfJHttb2RlbC5tZXRyaWNzTmFtZXNbaV19YF0gPSB2YWxPdXRzW2ldO1xuICAgICAgICAgICAgfVxuICAgICAgICAgIH1cbiAgICAgICAgICAvLyBDYWxsIGBicmVha2AgdG8gZXhpdCBvbmUgZXBvY2ggbG9wcCBhZnRlciB2YWxpZGF0aW9uIGlzIGRvbmUuIElmXG4gICAgICAgICAgLy8gY29uZmlnLmJhdGNoZXNQZXJFcG9jaCBpcyBzcGVjaWZpZWQsIGFuIGVwb2NoIHdoaWxlIGxvb3Agd2lsbFxuICAgICAgICAgIC8vIHN0b3Agd2hlbiBgc3RlcHNEb25lID49IGNvbmZpZy5iYXRjaGVzUGVyRXBvY2hgLiBXaGVuXG4gICAgICAgICAgLy8gY29uZmlnLmJhdGNoZXNQZXJFcG9jaCBpcyBub3QgcHJvdmlkZWQsIHRoZSBmb2xsb3dpbmcgYGJyZWFrYCBpc1xuICAgICAgICAgIC8vIHJlcXVpcmVkIHRvIGV4aXQgdGhlIHdoaWxlIGxvcHAgYWZ0ZXIgZGF0YXNldCBpcyBleGhhdXN0ZWQuXG4gICAgICAgICAgYnJlYWs7XG4gICAgICAgIH1cblxuICAgICAgICBpZiAobW9kZWwuc3RvcFRyYWluaW5nXykge1xuICAgICAgICAgIGJyZWFrO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgICBhd2FpdCBjYWxsYmFja0xpc3Qub25FcG9jaEVuZChlcG9jaCwgZXBvY2hMb2dzKTtcbiAgICAgIGVwb2NoKys7XG4gICAgICBpZiAobW9kZWwuc3RvcFRyYWluaW5nXykge1xuICAgICAgICBicmVhaztcbiAgICAgIH1cbiAgICB9XG4gICAgYXdhaXQgY2FsbGJhY2tMaXN0Lm9uVHJhaW5FbmQoKTtcbiAgICBhd2FpdCBtb2RlbC5oaXN0b3J5LnN5bmNEYXRhKCk7XG4gICAgcmV0dXJuIG1vZGVsLmhpc3Rvcnk7XG4gIH0gZmluYWxseSB7XG4gICAgbW9kZWwuaXNUcmFpbmluZyA9IGZhbHNlO1xuICB9XG59XG5cbi8qKiBIZWxwZXIgZnVuY3Rpb24gdGhhdCBkZXRlcm1pbmVzIG51bWJlciBvZiBzdGVwcyAoYmF0Y2hlcykgcGVyIGVwb2NoLiAqL1xuZnVuY3Rpb24gZ2V0U3RlcHNQZXJFcG9jaDxUPihcbiAgICBkYXRhc2V0OiBEYXRhc2V0PFQ+LCBhcmdzOiBNb2RlbEZpdERhdGFzZXRBcmdzPFQ+KTogbnVtYmVyIHtcbiAgLy8gQXR0ZW1wdCB0byBkZXRlcm1pbmUgIyBvZiBiYXRjaGVzIGluIGFuIGVwb2NoLlxuICBsZXQgc3RlcHNQZXJFcG9jaDogbnVtYmVyID0gbnVsbDtcbiAgaWYgKGFyZ3MuYmF0Y2hlc1BlckVwb2NoICE9IG51bGwpIHtcbiAgICBzdGVwc1BlckVwb2NoID0gYXJncy5iYXRjaGVzUGVyRXBvY2g7XG4gIH0gZWxzZSBpZiAoTnVtYmVyLmlzRmluaXRlKGRhdGFzZXQuc2l6ZSkpIHtcbiAgICBzdGVwc1BlckVwb2NoID0gZGF0YXNldC5zaXplO1xuICB9XG4gIHJldHVybiBzdGVwc1BlckVwb2NoO1xufVxuXG4vLyBDaGVjayBpZiBwcm92aWRlZCBvYmplY3QgaXMgYSBEYXRhc2V0IG9iamVjdCBieSBjaGVja2luZyBpdHMgLml0ZXJhdG9yXG4vLyBlbGVtZW50LlxuZnVuY3Rpb24gaXNEYXRhc2V0T2JqZWN0PFQ+KFxuICAgIGRhdGFzZXQ6XG4gICAgICAgIFtcbiAgICAgICAgICBUZW5zb3JPckFycmF5T3JNYXAsIFRlbnNvck9yQXJyYXlPck1hcFxuICAgICAgICBdfFtUZW5zb3JPckFycmF5T3JNYXAsIFRlbnNvck9yQXJyYXlPck1hcCwgVGVuc29yT3JBcnJheU9yTWFwXXxcbiAgICBEYXRhc2V0PFQ+KTogYm9vbGVhbiB7XG4gIHJldHVybiAodHlwZW9mIChkYXRhc2V0IGFzIERhdGFzZXQ8VD4pLml0ZXJhdG9yID09PSAnZnVuY3Rpb24nKTtcbn1cblxuLy8gQ2hlY2sgaWYgcHJvdmlkZWQgb2JqZWN0IGlzIGEgTGF6eUl0ZXJhdG9yIG9iamVjdCBieSBjaGVja2luZyBpdCdzIC5uZXh0XG4vLyBlbGVtZW50LlxuZnVuY3Rpb24gaXNMYXp5SXRlcmF0b3JPYmplY3Q8VD4oaXRlcmF0b3I6IERhdGFzZXQ8VD58XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMYXp5SXRlcmF0b3I8VD4pOiBib29sZWFuIHtcbiAgcmV0dXJuICh0eXBlb2YgKGl0ZXJhdG9yIGFzIExhenlJdGVyYXRvcjxUPikubmV4dCA9PT0gJ2Z1bmN0aW9uJyk7XG59XG5cbmV4cG9ydCBhc3luYyBmdW5jdGlvbiBldmFsdWF0ZURhdGFzZXQ8VD4oXG4gICAgLy8gVHlwZSBgbW9kZWxgIGFzIGBhbnlgIGhlcmUgdG8gYXZvaWQgY2lyY3VsYXIgZGVwZW5kZW5jeSB3L1xuICAgIC8vIHRyYWluaW5nLnRzLlxuICAgIC8vIHRzbGludDpkaXNhYmxlLW5leHQtbGluZTpuby1hbnlcbiAgICBtb2RlbDogYW55LCBkYXRhc2V0OiBEYXRhc2V0PFQ+fExhenlJdGVyYXRvcjxUPixcbiAgICBhcmdzOiBNb2RlbEV2YWx1YXRlRGF0YXNldEFyZ3MpOiBQcm9taXNlPHRmYy5TY2FsYXJ8dGZjLlNjYWxhcltdPiB7XG4gIGFyZ3MgPSBhcmdzIHx8IHt9O1xuICBjb25zdCBoYXNCYXRjaGVzID0gYXJncy5iYXRjaGVzICE9IG51bGw7XG4gIGNvbnN0IGYgPSBtb2RlbC50ZXN0RnVuY3Rpb247XG4gIGxldCBvdXRzOiB0ZmMuU2NhbGFyW10gPSBbXTtcbiAgaWYgKGFyZ3MudmVyYm9zZSA+IDApIHtcbiAgICB0aHJvdyBuZXcgTm90SW1wbGVtZW50ZWRFcnJvcignVmVyYm9zZSBtb2RlIGlzIG5vdCBpbXBsZW1lbnRlZCB5ZXQuJyk7XG4gIH1cblxuICB0ZmMudXRpbC5hc3NlcnQoXG4gICAgICAhaGFzQmF0Y2hlcyB8fCAoYXJncy5iYXRjaGVzID4gMCAmJiBOdW1iZXIuaXNJbnRlZ2VyKGFyZ3MuYmF0Y2hlcykpLFxuICAgICAgKCkgPT4gJ1Rlc3QgbG9vcCBleHBlY3RzIGBiYXRjaGVzYCB0byBiZSBhIHBvc2l0aXZlIGludGVnZXIsIGJ1dCAnICtcbiAgICAgICAgICBgcmVjZWl2ZWQgJHtKU09OLnN0cmluZ2lmeShhcmdzLmJhdGNoZXMpfWApO1xuICBjb25zdCBkYXRhSXRlcmF0b3IgPSBpc0xhenlJdGVyYXRvck9iamVjdChkYXRhc2V0KSA/XG4gICAgICBkYXRhc2V0IGFzIExhenlJdGVyYXRvcjxUPjpcbiAgICAgIGF3YWl0IChkYXRhc2V0IGFzIERhdGFzZXQ8VD4pLml0ZXJhdG9yKCk7XG4gIC8vIEtlZXBzIHRyYWNrIG9mIG51bWJlciBvZiBleGFtcGxlcyB1c2VkIGluIHRoaXMgZXZhbHVhdGlvbi5cbiAgbGV0IG51bUV4YW1wbGVzID0gMDtcbiAgbGV0IGJhdGNoID0gMDtcblxuICB3aGlsZSAoaGFzQmF0Y2hlcyA/IGJhdGNoIDwgYXJncy5iYXRjaGVzIDogdHJ1ZSkge1xuICAgIGNvbnN0IGl0ZXJhdG9yT3V0ID0gYXdhaXQgZGF0YUl0ZXJhdG9yLm5leHQoKTtcbiAgICBvdXRzID0gdGZjLnRpZHkoKCkgPT4ge1xuICAgICAgaWYgKGl0ZXJhdG9yT3V0LnZhbHVlKSB7XG4gICAgICAgIC8vIFRPRE8oY2Fpcyk6IE9uY2UgcmVhbCBkYXRhc2V0IGlzIGF2YWlsYWJsZSwgdXNlXG4gICAgICAgIC8vICAgYG1hcCh4ID0+IHN0YW5kYXJkaXplRGF0YUl0ZXJhdG9yT3V0cHV0KG1vZGVsLCB4KS5tYXAoZilgLlxuICAgICAgICBjb25zdCB7eHMsIHlzfSA9XG4gICAgICAgICAgICBzdGFuZGFyZGl6ZURhdGFJdGVyYXRvck91dHB1dChtb2RlbCwgaXRlcmF0b3JPdXQudmFsdWUpO1xuICAgICAgICBjb25zdCB4c0FuZFlzID0geHMuY29uY2F0KHlzKTtcbiAgICAgICAgY29uc3QgYmF0Y2hPdXRzID0gdGZjLnRpZHkoKCkgPT4gZih4c0FuZFlzKSk7XG4gICAgICAgIHRmYy5kaXNwb3NlKHhzQW5kWXMpO1xuXG4gICAgICAgIGlmIChiYXRjaCA9PT0gMCkge1xuICAgICAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgYmF0Y2hPdXRzLmxlbmd0aDsgKytpKSB7XG4gICAgICAgICAgICBvdXRzLnB1c2goc2NhbGFyKDApKTtcbiAgICAgICAgICB9XG4gICAgICAgIH1cblxuICAgICAgICBjb25zdCBiYXRjaFNpemUgPSB4c0FuZFlzWzBdLnNoYXBlWzBdO1xuICAgICAgICBmb3IgKGxldCBpID0gMDsgaSA8IGJhdGNoT3V0cy5sZW5ndGg7ICsraSkge1xuICAgICAgICAgIGNvbnN0IGJhdGNoT3V0ID0gYmF0Y2hPdXRzW2ldO1xuICAgICAgICAgIGNvbnN0IG9sZFNjYWxhciA9IG91dHNbaV07XG4gICAgICAgICAgb3V0c1tpXSA9XG4gICAgICAgICAgICAgIHRmYy50aWR5KCgpID0+IHRmYy5hZGQob3V0c1tpXSwgdGZjLm11bChiYXRjaFNpemUsIGJhdGNoT3V0KSkpO1xuICAgICAgICAgIGlmIChiYXRjaCA+IDApIHtcbiAgICAgICAgICAgIHRmYy5kaXNwb3NlKG9sZFNjYWxhcik7XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIHRmYy5kaXNwb3NlKGJhdGNoT3V0cyk7XG4gICAgICAgIG51bUV4YW1wbGVzICs9IGJhdGNoU2l6ZTtcblxuICAgICAgICArK2JhdGNoO1xuICAgICAgfVxuICAgICAgcmV0dXJuIG91dHM7XG4gICAgfSk7XG5cbiAgICBpZiAoaXRlcmF0b3JPdXQuZG9uZSkge1xuICAgICAgaWYgKGhhc0JhdGNoZXMpIHtcbiAgICAgICAgY29uc29sZS53YXJuKFxuICAgICAgICAgICAgJ1lvdXIgZGF0YXNldCBpdGVyYXRvciByYW4gb3V0IG9mIGRhdGEgZHVyaW5nIGV2YWx1YXRlRGF0YXNldCgpLiAnICtcbiAgICAgICAgICAgICdJbnRlcnJ1cHRpbmcgZXZhbHV0aW9uLiBNYWtlIHN1cmUgdGhhdCB5b3VyICcgK1xuICAgICAgICAgICAgJ2RhdGFzZXQgY2FuIGdlbmVyYXRlIGF0IGxlYXN0IGBiYXRjaGVzYCAnICtcbiAgICAgICAgICAgIGBiYXRjaGVzIChpbiB0aGlzIGNhc2UsICR7YXJncy5iYXRjaGVzfSBiYXRjaGVzKS4gYCArXG4gICAgICAgICAgICAnWW91IG1heSBuZWVkIHRvIHVzZSB0aGUgcmVwZWF0KCkgZnVuY3Rpb24gd2hlbiBidWlsZGluZyAnICtcbiAgICAgICAgICAgICd5b3VyIGRhdGFzZXQuJyk7XG4gICAgICB9XG4gICAgICBicmVhaztcbiAgICB9XG4gIH1cblxuICBmb3IgKGxldCBpID0gMDsgaSA8IG91dHMubGVuZ3RoOyArK2kpIHtcbiAgICBjb25zdCBvbGRTY2FsYXIgPSBvdXRzW2ldO1xuICAgIG91dHNbaV0gPSB0ZmMuZGl2KG91dHNbaV0sIG51bUV4YW1wbGVzKTtcbiAgICB0ZmMuZGlzcG9zZShvbGRTY2FsYXIpO1xuICB9XG5cbiAgcmV0dXJuIHNpbmdsZXRvbk9yQXJyYXkob3V0cyk7XG59XG4iXX0=","/**\n * @license\n * Copyright 2018 Google LLC\n *\n * Use of this source code is governed by an MIT-style\n * license that can be found in the LICENSE file or at\n * https://opensource.org/licenses/MIT.\n * =============================================================================\n */\n/**\n * Interfaces and methods for training models using tf.Tensor objects.\n */\nimport * as tfc from '@tensorflow/tfjs-core';\nimport { Tensor, tensor1d, util } from '@tensorflow/tfjs-core';\nimport { expandDims, gather, sliceAlongFirstAxis } from '../backend/tfjs_backend';\nimport { configureCallbacks, standardizeCallbacks } from '../base_callbacks';\nimport { NotImplementedError, ValueError } from '../errors';\nimport { disposeTensorsInLogs } from '../logs';\nimport { range } from '../utils/math_utils';\nexport function checkBatchSize(batchSize) {\n tfc.util.assert(batchSize > 0 && Number.isInteger(batchSize), () => `batchSize is required to be a positive integer, but got ${batchSize}`);\n}\n/**\n * Slice a Tensor or an Array of Tensors, by start and stop indices.\n *\n * Porting Note: The `_slice_arrays` function in PyKeras is covered by this\n * function and `sliceArraysByIndices()` together.\n *\n * @param arrays: the input.\n * @param start: the starting index (inclusive).\n * @param stop: the stopping index (exclusive).\n * @returns The result of the slicing. If `arrays` is an `Array` of\n * `tf.Tensor`s, the slicing will be applied to all elements of the `Array`\n * in the same way.\n */\nexport function sliceArrays(arrays, start, stop) {\n if (arrays == null) {\n return [null];\n }\n else if (Array.isArray(arrays)) {\n return arrays.map(array => sliceAlongFirstAxis(array, start, stop - start));\n }\n else { // Tensor.\n return sliceAlongFirstAxis(arrays, start, stop - start);\n }\n}\n/**\n * Slice a Tensor or an Array of Tensors, by random-order indices.\n *\n * Porting Note: The `_slice_arrays` function in PyKeras is covered by this\n * function and `sliceArrays()` together.\n *\n * @param arrays The input `tf.Tensor` or `Array` of `tf.Tensor`s to slice.\n * If an `Array` of `tf.Tensor`s, all `tf.Tensor`s will be sliced in the\n * same fashion.\n * @param indices The indices to use for slicing along the first (batch)\n * dimension.\n * @returns Result(s) of the slicing.\n */\nexport function sliceArraysByIndices(arrays, indices) {\n return tfc.tidy(() => {\n if (arrays == null) {\n return null;\n }\n else if (Array.isArray(arrays)) {\n return arrays.map(array => sliceArraysByIndices(array, indices));\n }\n else {\n // TODO(cais): indices should be a pre-constructed Tensor1D to avoid\n // tensor1d() calls.\n return gather(arrays, indices.dtype === 'int32' ? indices : tfc.cast(indices, 'int32'));\n }\n });\n}\n/**\n * Returns a list of batch indices (tuples of indices).\n * @param size: Integer, total size of the data to slice into batches.\n * @param batchSize: Integer, batch size.\n * @returns An Array of [batchStart, batchEnd] tuples. batchStart is\n * inclusive; batchEnd is exclusive. I.e., each batch consists of indices x\n * that satisfy batchStart <= x < batchEnd.\n */\nexport function makeBatches(size, batchSize) {\n const output = [];\n let batchStart = 0;\n let batchEnd = null;\n while (batchStart < size) {\n batchEnd = batchStart + batchSize;\n if (batchEnd >= size) {\n batchEnd = size;\n }\n output.push([batchStart, batchEnd]);\n batchStart = batchEnd;\n }\n return output;\n}\n/**\n * Abstract fit function for `f(ins)`.\n * @param f A Function returning a list of tensors. For training, this\n * function is expected to perform the updates to the variables.\n * @param ins List of tensors to be fed to `f`.\n * @param outLabels List of strings, display names of the outputs of `f`.\n * @param batchSize Integer batch size or `== null` if unknown. Default : 32.\n * @param epochs Number of times to iterate over the data. Default : 1.\n * @param verbose Verbosity mode: 0, 1, or 2. Default: 1.\n * @param callbacks List of callbacks to be called during training.\n * @param valF Function to call for validation.\n * @param valIns List of tensors to be fed to `valF`.\n * @param shuffle Whether to shuffle the data at the beginning of every\n * epoch. Default : true.\n * @param callbackMetrics List of strings, the display names of the metrics\n * passed to the callbacks. They should be the concatenation of the\n * display names of the outputs of `f` and the list of display names\n * of the outputs of `valF`.\n * @param initialEpoch Epoch at which to start training (useful for\n * resuming a previous training run). Default : 0.\n * @param stepsPerEpoch Total number of steps (batches on samples) before\n * declaring one epoch finished and starting the next epoch. Ignored with\n * the default value of `undefined` or `null`.\n * @param validationSteps Number of steps to run validation for (only if\n * doing validation from data tensors). Not applicable for tfjs-layers.\n * @returns A `History` object.\n */\nasync function fitLoop(\n// Type `model` as `any` here to avoid circular dependency w/ training.ts.\n// tslint:disable-next-line:no-any\nmodel, f, ins, outLabels, batchSize, epochs, verbose, callbacks, valF, valIns, shuffle, callbackMetrics, initialEpoch, stepsPerEpoch, validationSteps) {\n if (batchSize == null) {\n batchSize = 32;\n }\n if (epochs == null) {\n epochs = 1;\n }\n if (shuffle == null) {\n shuffle = true;\n }\n if (initialEpoch == null) {\n initialEpoch = 0;\n }\n // TODO(cais): Change const to let below when implementing validation.\n let doValidation = false;\n if (valF != null && valIns != null) {\n doValidation = true;\n // TODO(cais): verbose message.\n }\n if (validationSteps != null) {\n doValidation = true;\n if (stepsPerEpoch == null) {\n throw new ValueError('Can only use `validationSteps` when doing step-wise training, ' +\n 'i.e., `stepsPerEpoch` must be set.');\n }\n }\n const numTrainSamples = model.checkNumSamples(ins, batchSize, stepsPerEpoch, 'steps_per_epoch');\n let indexArray;\n if (numTrainSamples != null) {\n indexArray = range(0, numTrainSamples);\n }\n if (verbose == null) {\n verbose = 1;\n }\n const { callbackList, history } = configureCallbacks(callbacks, verbose, epochs, initialEpoch, numTrainSamples, stepsPerEpoch, batchSize, doValidation, callbackMetrics);\n callbackList.setModel(model);\n model.history = history;\n await callbackList.onTrainBegin();\n model.stopTraining_ = false;\n // TODO(cais): Take care of callbacks.validation_data as in PyKeras.\n // TODO(cais): Pre-convert feeds for performance as in PyKeras.\n for (let epoch = initialEpoch; epoch < epochs; ++epoch) {\n await callbackList.onEpochBegin(epoch);\n const epochLogs = {};\n if (stepsPerEpoch != null) {\n throw new NotImplementedError('stepsPerEpoch mode is not implemented yet.');\n }\n else {\n if (shuffle === 'batch') {\n throw new NotImplementedError('batch shuffling is not implemneted yet');\n }\n else if (shuffle) {\n util.shuffle(indexArray);\n }\n // Convert the potentially shuffled indices to Tensor1D, to avoid the\n // cost of repeated creation of Array1Ds later on.\n const epochIndexArray1D = tensor1d(indexArray);\n const batches = makeBatches(numTrainSamples, batchSize);\n for (let batchIndex = 0; batchIndex < batches.length; ++batchIndex) {\n const batchLogs = {};\n await callbackList.onBatchBegin(batchIndex, batchLogs);\n tfc.tidy(() => {\n const batchStart = batches[batchIndex][0];\n const batchEnd = batches[batchIndex][1];\n const batchIds = sliceAlongFirstAxis(epochIndexArray1D, batchStart, batchEnd - batchStart);\n batchLogs['batch'] = batchIndex;\n batchLogs['size'] = batchEnd - batchStart;\n // TODO(cais): In ins, train flag can be a number, instead of an\n // Tensor? Do we need to handle this in tfjs-layers?\n const insBatch = sliceArraysByIndices(ins, batchIds);\n const outs = f(insBatch);\n for (let i = 0; i < outLabels.length; ++i) {\n const label = outLabels[i];\n const out = outs[i];\n batchLogs[label] = out;\n tfc.keep(out);\n // TODO(cais): Use scope() to avoid ownership.\n }\n if (batchIndex === batches.length - 1) { // Last batch.\n if (doValidation) {\n const valOuts = model.testLoop(valF, valIns, batchSize);\n // Porting Notes: In tfjs-layers, valOuts is always an Array.\n for (let i = 0; i < outLabels.length; ++i) {\n const label = outLabels[i];\n const out = valOuts[i];\n tfc.keep(out);\n // TODO(cais): Use scope() to avoid ownership.\n epochLogs['val_' + label] = out;\n }\n }\n }\n });\n await callbackList.onBatchEnd(batchIndex, batchLogs);\n disposeTensorsInLogs(batchLogs);\n if (model.stopTraining_) {\n break;\n }\n // TODO(cais): return outs as list of Tensor.\n }\n epochIndexArray1D.dispose();\n }\n // TODO(cais): Run validation at the end of the epoch.\n await callbackList.onEpochEnd(epoch, epochLogs);\n if (model.stopTraining_) {\n break;\n }\n }\n await callbackList.onTrainEnd();\n await model.history.syncData();\n return model.history;\n}\nexport async function fitTensors(\n// Type `model` as `any` here to avoid circular dependency w/ training.ts.\n// tslint:disable-next-line:no-any\nmodel, x, y, args = {}) {\n if (model.isTraining) {\n throw new Error('Cannot start training because another fit() call is ongoing.');\n }\n model.isTraining = true;\n let inputs;\n let targets;\n let originalInputs;\n let originalTargets;\n let inputValX;\n let inputValY;\n let valX;\n let valY;\n let sampleWeights;\n try {\n const batchSize = args.batchSize == null ? 32 : args.batchSize;\n checkBatchSize(batchSize);\n // Validate user data.\n // TODO(cais): Support sampleWeight.\n const checkBatchAxis = false;\n const standardizedOuts = await model.standardizeUserData(x, y, args.sampleWeight, args.classWeight, checkBatchAxis, batchSize);\n inputs = standardizedOuts[0];\n targets = standardizedOuts[1];\n sampleWeights = standardizedOuts[2];\n // Prepare validation data.\n let doValidation = false;\n let valIns;\n if (args.validationData != null && args.validationData.length > 0) {\n doValidation = true;\n if (args.validationData.length === 2) {\n // config.validationData consists of valX and valY.\n inputValX = args.validationData[0];\n inputValY = args.validationData[1];\n }\n else if (args.validationData.length === 3) {\n throw new NotImplementedError('validationData including sample weights is not supported yet.');\n }\n else {\n throw new ValueError(`When passing validation data, it must contain 2 (valX, valY) ` +\n `or 3 (valX, valY, valSampleWeight) items; ` +\n `${args.validationData} is invalid.`);\n }\n const checkBatchAxis = true;\n const valStandardized = await model.standardizeUserData(inputValX, inputValY, null, /** Unused sample weights. */ null, /** Unused class weights. */ checkBatchAxis, batchSize);\n valX = valStandardized[0];\n valY = valStandardized[1];\n valIns = valX.concat(valY);\n // TODO(cais): Add useLearningPhase data properly.\n }\n else if (args.validationSplit != null && args.validationSplit > 0 &&\n args.validationSplit < 1) {\n doValidation = true;\n // Porting Note: In tfjs-layers, inputs[0] is always a Tensor.\n const splitAt = Math.floor(inputs[0].shape[0] * (1 - args.validationSplit));\n const originalBatchSize = inputs[0].shape[0];\n valX = sliceArrays(inputs, splitAt, originalBatchSize);\n originalInputs = inputs;\n inputs = sliceArrays(inputs, 0, splitAt);\n valY = sliceArrays(targets, splitAt, originalBatchSize);\n originalTargets = targets;\n targets = sliceArrays(targets, 0, splitAt);\n // TODO(cais): Once sampleWeights becomes available, slice it to get\n // valSampleWeights.\n valIns = valX.concat(valY);\n // TODO(cais): Add useLearningPhase data properly.\n }\n else if (args.validationSteps != null) {\n doValidation = true;\n // TODO(cais): Add useLearningPhase.\n }\n const ins = inputs.concat(targets).concat(sampleWeights);\n model.checkTrainableWeightsConsistency();\n // TODO(cais): Handle use_learning_phase and learning_phase?\n // Porting Note: Here we see a key deviation of tfjs-layers from\n // Keras.\n // Due to the imperative nature of tfjs-layers' backend (tfjs-core),\n // we do not construct symbolic computation graphs to embody the\n // training process. Instead, we define a function that performs the\n // training action. In PyKeras, the data (inputs and targets) are fed\n // through graph placeholders. In tfjs-layers, the data are fed as\n // function arguments. Since the function are defined below in the\n // scope, we don't have equivalents of PyKeras's\n // `_make_train_funciton`.\n const trainFunction = model.makeTrainFunction();\n const outLabels = model.getDedupedMetricsNames();\n let valFunction;\n let callbackMetrics;\n if (doValidation) {\n model.makeTestFunction();\n valFunction = model.testFunction;\n callbackMetrics =\n outLabels.slice().concat(outLabels.map(n => 'val_' + n));\n }\n else {\n valFunction = null;\n valIns = [];\n callbackMetrics = outLabels.slice();\n }\n const callbacks = standardizeCallbacks(args.callbacks, args.yieldEvery);\n const out = await fitLoop(model, trainFunction, ins, outLabels, batchSize, args.epochs, args.verbose, callbacks, valFunction, valIns, args.shuffle, callbackMetrics, args.initialEpoch, null, null);\n return out;\n }\n finally {\n model.isTraining = false;\n // Memory clean up.\n disposeNewTensors(inputs, x);\n disposeNewTensors(targets, y);\n disposeNewTensors(originalInputs, x);\n disposeNewTensors(originalTargets, y);\n disposeNewTensors(valX, inputValX);\n disposeNewTensors(valY, inputValY);\n if (sampleWeights != null) {\n tfc.dispose(sampleWeights);\n }\n }\n // TODO(cais): Add value to outLabels.\n}\n/**\n * Ensure tensors all have a rank of at least 2.\n *\n * If a tensor has a rank of 1, it is dimension-expanded to rank 2.\n * If any tensor has a rank of 0 (i.e., is a scalar), an error will be thrown.\n */\nexport function ensureTensorsRank2OrHigher(tensors) {\n const outs = [];\n if (tensors instanceof Tensor) {\n tensors = [tensors];\n }\n // Make Tensors at least 2D.\n for (let i = 0; i < tensors.length; ++i) {\n const tensor = tensors[i];\n if (tensor.rank === 1) {\n outs.push(expandDims(tensor, 1));\n }\n else if (tensor.rank === 0) {\n throw new Error('Expected tensor to be at least 1D, but received a 0D tensor ' +\n '(scalar).');\n }\n else {\n outs.push(tensor);\n }\n }\n return outs;\n}\n/**\n * Compare a set of tensors with a reference (old) set, discard the ones\n * in the new set that are not present in the reference set.\n *\n * This method is used for memory clenaup during calls such as\n * LayersModel.fit().\n *\n * @param tensors New set which may contain Tensors not present in\n * `refTensors`.\n * @param refTensors Reference Tensor set.\n */\n// TODO(cais, kangyizhang): Deduplicate with tfjs-data.\nexport function disposeNewTensors(tensors, refTensors) {\n if (tensors == null) {\n return;\n }\n const oldTensorIds = [];\n if (refTensors instanceof Tensor) {\n oldTensorIds.push(refTensors.id);\n }\n else if (Array.isArray(refTensors)) {\n refTensors.forEach(t => oldTensorIds.push(t.id));\n }\n else if (refTensors != null) {\n // `oldTensors` is a map from string name to Tensor.\n for (const name in refTensors) {\n const oldTensor = refTensors[name];\n oldTensorIds.push(oldTensor.id);\n }\n }\n const tensorsToDispose = [];\n if (tensors instanceof Tensor) {\n if (oldTensorIds.indexOf(tensors.id) === -1) {\n tensorsToDispose.push(tensors);\n }\n }\n else if (Array.isArray(tensors)) {\n tensors.forEach(t => {\n if (oldTensorIds.indexOf(t.id) === -1) {\n tensorsToDispose.push(t);\n }\n });\n }\n else if (tensors != null) {\n // `oldTensors` is a map from string name to Tensor.\n for (const name in tensors) {\n const tensor = tensors[name];\n if (oldTensorIds.indexOf(tensor.id) === -1) {\n tensorsToDispose.push(tensor);\n }\n }\n }\n tensorsToDispose.forEach(t => {\n if (!t.isDisposed) {\n t.dispose();\n }\n });\n}\n//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidHJhaW5pbmdfdGVuc29ycy5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uLy4uL3RmanMtbGF5ZXJzL3NyYy9lbmdpbmUvdHJhaW5pbmdfdGVuc29ycy50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQTs7Ozs7Ozs7R0FRRztBQUVIOztHQUVHO0FBRUgsT0FBTyxLQUFLLEdBQUcsTUFBTSx1QkFBdUIsQ0FBQztBQUM3QyxPQUFPLEVBQVMsTUFBTSxFQUFZLFFBQVEsRUFBRSxJQUFJLEVBQUMsTUFBTSx1QkFBdUIsQ0FBQztBQUUvRSxPQUFPLEVBQUMsVUFBVSxFQUFFLE1BQU0sRUFBRSxtQkFBbUIsRUFBQyxNQUFNLHlCQUF5QixDQUFDO0FBQ2hGLE9BQU8sRUFBZSxrQkFBa0IsRUFBc0Qsb0JBQW9CLEVBQW9CLE1BQU0sbUJBQW1CLENBQUM7QUFDaEssT0FBTyxFQUFDLG1CQUFtQixFQUFFLFVBQVUsRUFBQyxNQUFNLFdBQVcsQ0FBQztBQUMxRCxPQUFPLEVBQUMsb0JBQW9CLEVBQWlCLE1BQU0sU0FBUyxDQUFDO0FBQzdELE9BQU8sRUFBQyxLQUFLLEVBQUMsTUFBTSxxQkFBcUIsQ0FBQztBQTRJMUMsTUFBTSxVQUFVLGNBQWMsQ0FBQyxTQUFpQjtJQUM5QyxHQUFHLENBQUMsSUFBSSxDQUFDLE1BQU0sQ0FDWCxTQUFTLEdBQUcsQ0FBQyxJQUFJLE1BQU0sQ0FBQyxTQUFTLENBQUMsU0FBUyxDQUFDLEVBQzVDLEdBQUcsRUFBRSxDQUFDLDJEQUNGLFNBQVMsRUFBRSxDQUFDLENBQUM7QUFDdkIsQ0FBQztBQUVEOzs7Ozs7Ozs7Ozs7R0FZRztBQUNILE1BQU0sVUFBVSxXQUFXLENBQ3ZCLE1BQXVCLEVBQUUsS0FBYSxFQUFFLElBQVk7SUFDdEQsSUFBSSxNQUFNLElBQUksSUFBSSxFQUFFO1FBQ2xCLE9BQU8sQ0FBQyxJQUFJLENBQUMsQ0FBQztLQUNmO1NBQU0sSUFBSSxLQUFLLENBQUMsT0FBTyxDQUFDLE1BQU0s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RjtLQUNGO0lBRUQsZ0JBQWdCLENBQUMsT0FBTyxDQUFDLENBQUMsQ0FBQyxFQUFFO1FBQzNCLElBQUksQ0FBQyxDQUFDLENBQUMsVUFBVSxFQUFFO1lBQ2pCLENBQUMsQ0FBQyxPQUFPLEVBQUUsQ0FBQztTQUNiO0lBQ0gsQ0FBQyxDQUFDLENBQUM7QUFDTCxDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiLyoqXG4gKiBAbGljZW5zZVxuICogQ29weXJpZ2h0IDIwMTggR29vZ2xlIExMQ1xuICpcbiAqIFVzZSBvZiB0aGlzIHNvdXJjZSBjb2RlIGlzIGdvdmVybmVkIGJ5IGFuIE1JVC1zdHlsZVxuICogbGljZW5zZSB0aGF0IGNhbiBiZSBmb3VuZCBpbiB0aGUgTElDRU5TRSBmaWxlIG9yIGF0XG4gKiBodHRwczovL29wZW5zb3VyY2Uub3JnL2xpY2Vuc2VzL01JVC5cbiAqID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4gKi9cblxuLyoqXG4gKiBJbnRlcmZhY2VzIGFuZCBtZXRob2RzIGZvciB0cmFpbmluZyBtb2RlbHMgdXNpbmcgdGYuVGVuc29yIG9iamVjdHMuXG4gKi9cblxuaW1wb3J0ICogYXMgdGZjIGZyb20gJ0B0ZW5zb3JmbG93L3RmanMtY29yZSc7XG5pbXBvcnQge1NjYWxhciwgVGVuc29yLCBUZW5zb3IxRCwgdGVuc29yMWQsIHV0aWx9IGZyb20gJ0B0ZW5zb3JmbG93L3RmanMtY29yZSc7XG5cbmltcG9ydCB7ZXhwYW5kRGltcywgZ2F0aGVyLCBzbGljZUFsb25nRmlyc3RBeGlzfSBmcm9tICcuLi9iYWNrZW5kL3RmanNfYmFja2VuZCc7XG5pbXBvcnQge0Jhc2VDYWxsYmFjaywgY29uZmlndXJlQ2FsbGJhY2tzLCBDdXN0b21DYWxsYmFja0FyZ3MsIEhpc3RvcnksIE1vZGVsTG9nZ2luZ1ZlcmJvc2l0eSwgc3RhbmRhcmRpemVDYWxsYmFja3MsIFlpZWxkRXZlcnlPcHRpb25zfSBmcm9tICcuLi9iYXNlX2NhbGxiYWNrcyc7XG5pbXBvcnQge05vdEltcGxlbWVudGVkRXJyb3IsIFZhbHVlRXJyb3J9IGZyb20gJy4uL2Vycm9ycyc7XG5pbXBvcnQge2Rpc3Bvc2VUZW5zb3JzSW5Mb2dzLCBVbnJlc29sdmVkTG9nc30gZnJvbSAnLi4vbG9ncyc7XG5pbXBvcnQge3JhbmdlfSBmcm9tICcuLi91dGlscy9tYXRoX3V0aWxzJztcbmltcG9ydCB7Q2xhc3NXZWlnaHQsIENsYXNzV2VpZ2h0TWFwfSBmcm9tICcuL3RyYWluaW5nX3V0aWxzJztcblxuLyoqXG4gKiBJbnRlcmZhY2UgY29uZmlndXJhdGlvbiBtb2RlbCB0cmFpbmluZyBiYXNlZCBvbiBkYXRhIGFzIGB0Zi5UZW5zb3Jgcy5cbiAqL1xuZXhwb3J0IGludGVyZmFjZSBNb2RlbEZpdEFyZ3Mge1xuICAvKipcbiAgICogTnVtYmVyIG9mIHNhbXBsZXMgcGVyIGdyYWRpZW50IHVwZGF0ZS4gSWYgdW5zcGVjaWZpZWQsIGl0XG4gICAqIHdpbGwgZGVmYXVsdCB0byAzMi5cbiAgICovXG4gIGJhdGNoU2l6ZT86IG51bWJlcjtcblxuICAvKipcbiAgICogSW50ZWdlciBudW1iZXIgb2YgdGltZXMgdG8gaXRlcmF0ZSBvdmVyIHRoZSB0cmFpbmluZyBkYXRhIGFycmF5cy5cbiAgICovXG4gIGVwb2Nocz86IG51bWJlcjtcblxuICAvKipcbiAgICogVmVyYm9zaXR5IGxldmVsLlxuICAgKlxuICAgKiBFeHBlY3RlZCB0byBiZSAwLCAxLCBvciAyLiBEZWZhdWx0OiAxLlxuICAgKlxuICAgKiAwIC0gTm8gcHJpbnRlZCBtZXNzYWdlIGR1cmluZyBmaXQoKSBjYWxsLlxuICAgKiAxIC0gSW4gTm9kZS5qcyAodGZqcy1ub2RlKSwgcHJpbnRzIHRoZSBwcm9ncmVzcyBiYXIsIHRvZ2V0aGVyIHdpdGhcbiAgICogICAgIHJlYWwtdGltZSB1cGRhdGVzIG9mIGxvc3MgYW5kIG1ldHJpYyB2YWx1ZXMgYW5kIHRyYWluaW5nIHNwZWVkLlxuICAgKiAgICAgSW4gdGhlIGJyb3dzZXI6IG5vIGFjdGlvbi4gVGhpcyBpcyB0aGUgZGVmYXVsdC5cbiAgICogMiAtIE5vdCBpbXBsZW1lbnRlZCB5ZXQuXG4gICAqL1xuICB2ZXJib3NlPzogTW9kZWxMb2dnaW5nVmVyYm9zaXR5O1xuXG4gIC8qKlxuICAgKiBMaXN0IG9mIGNhbGxiYWNrcyB0byBiZSBjYWxsZWQgZHVyaW5nIHRyYWluaW5nLlxuICAgKiBDYW4gaGF2ZSBvbmUgb3IgbW9yZSBvZiB0aGUgZm9sbG93aW5nIGNhbGxiYWNrczpcbiAgICogICAtIGBvblRyYWluQmVnaW4obG9ncylgOiBjYWxsZWQgd2hlbiB0cmFpbmluZyBzdGFydHMuXG4gICAqICAgLSBgb25UcmFpbkVuZChsb2dzKWA6IGNhbGxlZCB3aGVuIHRyYWluaW5nIGVuZHMuXG4gICAqICAgLSBgb25FcG9jaEJlZ2luKGVwb2NoLCBsb2dzKWA6IGNhbGxlZCBhdCB0aGUgc3RhcnQgb2YgZXZlcnkgZXBvY2guXG4gICAqICAgLSBgb25FcG9jaEVuZChlcG9jaCwgbG9ncylgOiBjYWxsZWQgYXQgdGhlIGVuZCBvZiBldmVyeSBlcG9jaC5cbiAgICogICAtIGBvbkJhdGNoQmVnaW4oYmF0Y2gsIGxvZ3MpYDogY2FsbGVkIGF0IHRoZSBzdGFydCBvZiBldmVyeSBiYXRjaC5cbiAgICogICAtIGBvbkJhdGNoRW5kKGJhdGNoLCBsb2dzKWA6IGNhbGxlZCBhdCB0aGUgZW5kIG9mIGV2ZXJ5IGJhdGNoLlxuICAgKiAgIC0gYG9uWWllbGQoZXBvY2gsIGJhdGNoLCBsb2dzKWA6IGNhbGxlZCBldmVyeSBgeWllbGRFdmVyeWAgbWlsbGlzZWNvbmRzXG4gICAqICAgICAgd2l0aCB0aGUgY3VycmVudCBlcG9jaCwgYmF0Y2ggYW5kIGxvZ3MuIFRoZSBsb2dzIGFyZSB0aGUgc2FtZVxuICAgKiAgICAgIGFzIGluIGBvbkJhdGNoRW5kKClgLiBOb3RlIHRoYXQgYG9uWWllbGRgIGNhbiBza2lwIGJhdGNoZXMgb3JcbiAgICogICAgICBlcG9jaHMuIFNlZSBhbHNvIGRvY3MgZm9yIGB5aWVsZEV2ZXJ5YCBiZWxvdy5cbiAgICovXG4gIGNhbGxiYWNrcz86IEJhc2VDYWxsYmFja1tdfEN1c3RvbUNhbGxiYWNrQXJnc3xDdXN0b21DYWxsYmFja0FyZ3NbXTtcblxuICAvKipcbiAgICogRmxvYXQgYmV0d2VlbiAwIGFuZCAxOiBmcmFjdGlvbiBvZiB0aGUgdHJhaW5pbmcgZGF0YVxuICAgKiB0byBiZSB1c2VkIGFzIHZhbGlkYXRpb24gZGF0YS4gVGhlIG1vZGVsIHdpbGwgc2V0IGFwYXJ0IHRoaXMgZnJhY3Rpb24gb2ZcbiAgICogdGhlIHRyYWluaW5nIGRhdGEsIHdpbGwgbm90IHRyYWluIG9uIGl0LCBhbmQgd2lsbCBldmFsdWF0ZSB0aGUgbG9zcyBhbmRcbiAgICogYW55IG1vZGVsIG1ldHJpY3Mgb24gdGhpcyBkYXRhIGF0IHRoZSBlbmQgb2YgZWFjaCBlcG9jaC5cbiAgICogVGhlIHZhbGlkYXRpb24gZGF0YSBpcyBzZWxlY3RlZCBmcm9tIHRoZSBsYXN0IHNhbXBsZXMgaW4gdGhlIGB4YCBhbmQgYHlgXG4gICAqIGRhdGEgcHJvdmlkZWQsIGJlZm9yZSBzaHVmZmxpbmcuXG4gICAqL1xuICB2YWxpZGF0aW9uU3BsaXQ/OiBudW1iZXI7XG5cbiAgLyoqXG4gICAqIERhdGEgb24gd2hpY2ggdG8gZXZhbHVhdGUgdGhlIGxvc3MgYW5kIGFueSBtb2RlbFxuICAgKiBtZXRyaWNzIGF0IHRoZSBlbmQgb2YgZWFjaCBlcG9jaC4gVGhlIG1vZGVsIHdpbGwgbm90IGJlIHRyYWluZWQgb24gdGhpc1xuICAgKiBkYXRhLiBUaGlzIGNvdWxkIGJlIGEgdHVwbGUgW3hWYWwsIHlWYWxdIG9yIGEgdHVwbGUgW3hWYWwsIHlWYWwsXG4gICAqIHZhbFNhbXBsZVdlaWdodHNdLiBUaGUgbW9kZWwgd2lsbCBub3QgYmUgdHJhaW5lZCBvbiB0aGlzIGRhdGEuXG4gICAqIGB2YWxpZGF0aW9uRGF0YWAgd2lsbCBvdmVycmlkZSBgdmFsaWRhdGlvblNwbGl0YC5cbiAgICovXG4gIHZhbGlkYXRpb25EYXRhPzogW1xuICAgIFRlbnNvcnxUZW5zb3JbXSwgVGVuc29yfFRlbnNvcltdXG4gIF18W1RlbnNvciB8IFRlbnNvcltdLCBUZW5zb3J8VGVuc29yW10sIFRlbnNvcnxUZW5zb3JbXV07XG5cbiAgLyoqXG4gICAqIFdoZXRoZXIgdG8gc2h1ZmZsZSB0aGUgdHJhaW5pbmcgZGF0YSBiZWZvcmUgZWFjaCBlcG9jaC4gSGFzXG4gICAqIG5vIGVmZmVjdCB3aGVuIGBzdGVwc1BlckVwb2NoYCBpcyBub3QgYG51bGxgLlxuICAgKi9cbiAgc2h1ZmZsZT86IGJvb2xlYW47XG5cbiAgLyoqXG4gICAqIE9wdGlvbmFsIG9iamVjdCBtYXBwaW5nIGNsYXNzIGluZGljZXMgKGludGVnZXJzKSB0b1xuICAgKiBhIHdlaWdodCAoZmxvYXQpIHRvIGFwcGx5IHRvIHRoZSBtb2RlbCdzIGxvc3MgZm9yIHRoZSBzYW1wbGVzIGZyb20gdGhpc1xuICAgKiBjbGFzcyBkdXJpbmcgdHJhaW5pbmcuIFRoaXMgY2FuIGJlIHVzZWZ1bCB0byB0ZWxsIHRoZSBtb2RlbCB0byBcInBheSBtb3JlXG4gICAqIGF0dGVudGlvblwiIHRvIHNhbXBsZXMgZnJvbSBhbiB1bmRlci1yZXByZXNlbnRlZCBjbGFzcy5cbiAgICpcbiAgICogSWYgdGhlIG1vZGVsIGhhcyBtdWx0aXBsZSBvdXRwdXRzLCBhIGNsYXNzIHdlaWdodCBjYW4gYmUgc3BlY2lmaWVkIGZvclxuICAgKiBlYWNoIG9mIHRoZSBvdXRwdXRzIGJ5IHNldHRpbmcgdGhpcyBmaWVsZCBhbiBhcnJheSBvZiB3ZWlnaHQgb2JqZWN0XG4gICAqIG9yIGFuIG9iamVjdCB0aGF0IG1hcHMgbW9kZWwgb3V0cHV0IG5hbWVzIChlLmcuLCBgbW9kZWwub3V0cHV0TmFtZXNbMF1gKVxuICAgKiB0byB3ZWlnaHQgb2JqZWN0cy5cbiAgICovXG4gIGNsYXNzV2VpZ2h0PzogQ2xhc3NXZWlnaHR8Q2xhc3NXZWlnaHRbXXxDbGFzc1dlaWdodE1hcDtcblxuICAvKipcbiAgICogT3B0aW9uYWwgYXJyYXkgb2YgdGhlIHNhbWUgbGVuZ3RoIGFzIHgsIGNvbnRhaW5pbmdcbiAgICogd2VpZ2h0cyB0byBhcHBseSB0byB0aGUgbW9kZWwncyBsb3NzIGZvciBlYWNoIHNhbXBsZS4gSW4gdGhlIGNhc2Ugb2ZcbiAgICogdGVtcG9yYWwgZGF0YSwgeW91IGNhbiBwYXNzIGEgMkQgYXJyYXkgd2l0aCBzaGFwZSAoc2FtcGxlcyxcbiAgICogc2VxdWVuY2VMZW5ndGgpLCB0byBhcHBseSBhIGRpZmZlcmVudCB3ZWlnaHQgdG8gZXZlcnkgdGltZXN0ZXAgb2YgZXZlcnlcbiAgICogc2FtcGxlLiBJbiB0aGlzIGNhc2UgeW91IHNob3VsZCBtYWtlIHN1cmUgdG8gc3BlY2lmeVxuICAgKiBzYW1wbGVXZWlnaHRNb2RlPVwidGVtcG9yYWxcIiBpbiBjb21waWxlKCkuXG4gICAqL1xuICBzYW1wbGVXZWlnaHQ/OiBUZW5zb3I7XG5cbiAgLyoqXG4gICAqIEVwb2NoIGF0IHdoaWNoIHRvIHN0YXJ0IHRyYWluaW5nICh1c2VmdWwgZm9yIHJlc3VtaW5nIGEgcHJldmlvdXMgdHJhaW5pbmdcbiAgICogcnVuKS4gV2hlbiB0aGlzIGlzIHVzZWQsIGBlcG9jaHNgIGlzIHRoZSBpbmRleCBvZiB0aGUgXCJmaW5hbCBlcG9jaFwiLlxuICAgKiBUaGUgbW9kZWwgaXMgbm90IHRyYWluZWQgZm9yIGEgbnVtYmVyIG9mIGl0ZXJhdGlvbnMgZ2l2ZW4gYnkgYGVwb2Noc2AsXG4gICAqIGJ1dCBtZXJlbHkgdW50aWwgdGhlIGVwb2NoIG9mIGluZGV4IGBlcG9jaHNgIGlzIHJlYWNoZWQuXG4gICAqL1xuICBpbml0aWFsRXBvY2g/OiBudW1iZXI7XG5cbiAgLyoqXG4gICAqIFRvdGFsIG51bWJlciBvZiBzdGVwcyAoYmF0Y2hlcyBvZiBzYW1wbGVzKSBiZWZvcmVcbiAgICogZGVjbGFyaW5nIG9uZSBlcG9jaCBmaW5pc2hlZCBhbmQgc3RhcnRpbmcgdGhlIG5leHQgZXBvY2guIFdoZW4gdHJhaW5pbmdcbiAgICogd2l0aCBJbnB1dCBUZW5zb3JzIHN1Y2ggYXMgVGVuc29yRmxvdyBkYXRhIHRlbnNvcnMsIHRoZSBkZWZhdWx0IGBudWxsYCBpc1xuICAgKiBlcXVhbCB0byB0aGUgbnVtYmVyIG9mIHVuaXF1ZSBzYW1wbGVzIGluIHlvdXIgZGF0YXNldCBkaXZpZGVkIGJ5IHRoZVxuICAgKiBiYXRjaCBzaXplLCBvciAxIGlmIHRoYXQgY2Fubm90IGJlIGRldGVybWluZWQuXG4gICAqL1xuICBzdGVwc1BlckVwb2NoPzogbnVtYmVyO1xuXG4gIC8qKlxuICAgKiBPbmx5IHJlbGV2YW50IGlmIGBzdGVwc1BlckVwb2NoYCBpcyBzcGVjaWZpZWQuIFRvdGFsIG51bWJlciBvZiBzdGVwc1xuICAgKiAoYmF0Y2hlcyBvZiBzYW1wbGVzKSB0byB2YWxpZGF0ZSBiZWZvcmUgc3RvcHBpbmcuXG4gICAqL1xuICB2YWxpZGF0aW9uU3RlcHM/OiBudW1iZXI7XG5cbiAgLyoqXG4gICAqIENvbmZpZ3VyZXMgdGhlIGZyZXF1ZW5jeSBvZiB5aWVsZGluZyB0aGUgbWFpbiB0aHJlYWQgdG8gb3RoZXIgdGFza3MuXG4gICAqXG4gICAqIEluIHRoZSBicm93c2VyIGVudmlyb25tZW50LCB5aWVsZGluZyB0aGUgbWFpbiB0aHJlYWQgY2FuIGltcHJvdmUgdGhlXG4gICAqIHJlc3BvbnNpdmVuZXNzIG9mIHRoZSBwYWdlIGR1cmluZyB0cmFpbmluZy4gSW4gdGhlIE5vZGUuanMgZW52aXJvbm1lbnQsXG4gICAqIGl0IGNhbiBlbnN1cmUgdGFza3MgcXVldWVkIGluIHRoZSBldmVudCBsb29wIGNhbiBiZSBoYW5kbGVkIGluIGEgdGltZWx5XG4gICAqIG1hbm5lci5cbiAgICpcbiAgICogVGhlIHZhbHVlIGNhbiBiZSBvbmUgb2YgdGhlIGZvbGxvd2luZzpcbiAgICogICAtIGAnYXV0bydgOiBUaGUgeWllbGRpbmcgaGFwcGVucyBhdCBhIGNlcnRhaW4gZnJhbWUgcmF0ZSAoY3VycmVudGx5IHNldFxuICAgKiAgICAgICAgICAgICAgIGF0IDEyNW1zKS4gVGhpcyBpcyB0aGUgZGVmYXVsdC5cbiAgICogICAtIGAnYmF0Y2gnYDogeWllbGQgZXZlcnkgYmF0Y2guXG4gICAqICAgLSBgJ2Vwb2NoJ2A6IHlpZWxkIGV2ZXJ5IGVwb2NoLlxuICAgKiAgIC0gYW55IGBudW1iZXJgOiB5aWVsZCBldmVyeSBgbnVtYmVyYCBtaWxsaXNlY29uZHMuXG4gICAqICAgLSBgJ25ldmVyJ2A6IG5ldmVyIHlpZWxkLiAoeWllbGRpbmcgY2FuIHN0aWxsIGhhcHBlbiB0aHJvdWdoIGBhd2FpdFxuICAgKiAgICAgIG5leHRGcmFtZSgpYCBjYWxscyBpbiBjdXN0b20gY2FsbGJhY2tzLilcbiAgICovXG4gIHlpZWxkRXZlcnk/OiBZaWVsZEV2ZXJ5T3B0aW9ucztcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGNoZWNrQmF0Y2hTaXplKGJhdGNoU2l6ZTogbnVtYmVyKSB7XG4gIHRmYy51dGlsLmFzc2VydChcbiAgICAgIGJhdGNoU2l6ZSA+IDAgJiYgTnVtYmVyLmlzSW50ZWdlcihiYXRjaFNpemUpLFxuICAgICAgKCkgPT4gYGJhdGNoU2l6ZSBpcyByZXF1aXJlZCB0byBiZSBhIHBvc2l0aXZlIGludGVnZXIsIGJ1dCBnb3QgJHtcbiAgICAgICAgICBiYXRjaFNpemV9YCk7XG59XG5cbi8qKlxuICogU2xpY2UgYSBUZW5zb3Igb3IgYW4gQXJyYXkgb2YgVGVuc29ycywgYnkgc3RhcnQgYW5kIHN0b3AgaW5kaWNlcy5cbiAqXG4gKiBQb3J0aW5nIE5vdGU6IFRoZSBgX3NsaWNlX2FycmF5c2AgZnVuY3Rpb24gaW4gUHlLZXJhcyBpcyBjb3ZlcmVkIGJ5IHRoaXNcbiAqICAgZnVuY3Rpb24gYW5kIGBzbGljZUFycmF5c0J5SW5kaWNlcygpYCB0b2dldGhlci5cbiAqXG4gKiBAcGFyYW0gYXJyYXlzOiB0aGUgaW5wdXQuXG4gKiBAcGFyYW0gc3RhcnQ6IHRoZSBzdGFydGluZyBpbmRleCAoaW5jbHVzaXZlKS5cbiAqIEBwYXJhbSBzdG9wOiB0aGUgc3RvcHBpbmcgaW5kZXggKGV4Y2x1c2l2ZSkuXG4gKiBAcmV0dXJucyBUaGUgcmVzdWx0IG9mIHRoZSBzbGljaW5nLiBJZiBgYXJyYXlzYCBpcyBhbiBgQXJyYXlgIG9mXG4gKiAgIGB0Zi5UZW5zb3JgcywgdGhlIHNsaWNpbmcgd2lsbCBiZSBhcHBsaWVkIHRvIGFsbCBlbGVtZW50cyBvZiB0aGUgYEFycmF5YFxuICogICBpbiB0aGUgc2FtZSB3YXkuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBzbGljZUFycmF5cyhcbiAgICBhcnJheXM6IFRlbnNvcnxUZW5zb3JbXSwgc3RhcnQ6IG51bWJlciwgc3RvcDogbnVtYmVyKTogVGVuc29yfFRlbnNvcltdIHtcbiAgaWYgKGFycmF5cyA9PSBudWxsKSB7XG4gICAgcmV0dXJuIFtudWxsXTtcbiAgfSBlbHNlIGlmIChBcnJheS5pc0FycmF5KGFycmF5cykpIHtcbiAgICByZXR1cm4gYXJyYXlzLm1hcChhcnJheSA9PiBzbGljZUFsb25nRmlyc3RBeGlzKGFycmF5LCBzdGFydCwgc3RvcCAtIHN0YXJ0KSk7XG4gIH0gZWxzZSB7ICAvLyBUZW5zb3IuXG4gICAgcmV0dXJuIHNsaWNlQWxvbmdGaXJzdEF4aXMoYXJyYXlzLCBzdGFydCwgc3RvcCAtIHN0YXJ0KTtcbiAgfVxufVxuXG4vKipcbiAqIFNsaWNlIGEgVGVuc29yIG9yIGFuIEFycmF5IG9mIFRlbnNvcnMsIGJ5IHJhbmRvbS1vcmRlciBpbmRpY2VzLlxuICpcbiAqIFBvcnRpbmcgTm90ZTogVGhlIGBfc2xpY2VfYXJyYXlzYCBmdW5jdGlvbiBpbiBQeUtlcmFzIGlzIGNvdmVyZWQgYnkgdGhpc1xuICogICBmdW5jdGlvbiBhbmQgYHNsaWNlQXJyYXlzKClgIHRvZ2V0aGVyLlxuICpcbiAqIEBwYXJhbSBhcnJheXMgVGhlIGlucHV0IGB0Zi5UZW5zb3JgIG9yIGBBcnJheWAgb2YgYHRmLlRlbnNvcmBzIHRvIHNsaWNlLlxuICogICBJZiBhbiBgQXJyYXlgIG9mIGB0Zi5UZW5zb3JgcywgYWxsIGB0Zi5UZW5zb3JgcyB3aWxsIGJlIHNsaWNlZCBpbiB0aGVcbiAqICAgc2FtZSBmYXNoaW9uLlxuICogQHBhcmFtIGluZGljZXMgVGhlIGluZGljZXMgdG8gdXNlIGZvciBzbGljaW5nIGFsb25nIHRoZSBmaXJzdCAoYmF0Y2gpXG4gKiAgIGRpbWVuc2lvbi5cbiAqIEByZXR1cm5zIFJlc3VsdChzKSBvZiB0aGUgc2xpY2luZy5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHNsaWNlQXJyYXlzQnlJbmRpY2VzKFxuICAgIGFycmF5czogVGVuc29yfFRlbnNvcltdLCBpbmRpY2VzOiBUZW5zb3IxRCk6IFRlbnNvcnxUZW5zb3JbXSB7XG4gIHJldHVybiB0ZmMudGlkeSgoKSA9PiB7XG4gICAgaWYgKGFycmF5cyA9PSBudWxsKSB7XG4gICAgICByZXR1cm4gbnVsbDtcbiAgICB9IGVsc2UgaWYgKEFycmF5LmlzQXJyYXkoYXJyYXlzKSkge1xuICAgICAgcmV0dXJuIGFycmF5cy5tYXAoXG4gICAgICAgICAgYXJyYXkgPT4gKHNsaWNlQXJyYXlzQnlJbmRpY2VzKGFycmF5LCBpbmRpY2VzKSBhcyBUZW5zb3IpKTtcbiAgICB9IGVsc2Uge1xuICAgICAgLy8gVE9ETyhjYWlzKTogaW5kaWNlcyBzaG91bGQgYmUgYSBwcmUtY29uc3RydWN0ZWQgVGVuc29yMUQgdG8gYXZvaWRcbiAgICAgIC8vICAgdGVuc29yMWQoKSBjYWxscy5cbiAgICAgIHJldHVybiBnYXRoZXIoXG4gICAgICAgICAgYXJyYXlzLFxuICAgICAgICAgIGluZGljZXMuZHR5cGUgPT09ICdpbnQzMicgPyBpbmRpY2VzIDogdGZjLmNhc3QoaW5kaWNlcywgJ2ludDMyJykpO1xuICAgIH1cbiAgfSk7XG59XG5cbi8qKlxuICogUmV0dXJucyBhIGxpc3Qgb2YgYmF0Y2ggaW5kaWNlcyAodHVwbGVzIG9mIGluZGljZXMpLlxuICogQHBhcmFtIHNpemU6IEludGVnZXIsIHRvdGFsIHNpemUgb2YgdGhlIGRhdGEgdG8gc2xpY2UgaW50byBiYXRjaGVzLlxuICogQHBhcmFtIGJhdGNoU2l6ZTogSW50ZWdlciwgYmF0Y2ggc2l6ZS5cbiAqIEByZXR1cm5zIEFuIEFycmF5IG9mIFtiYXRjaFN0YXJ0LCBiYXRjaEVuZF0gdHVwbGVzLiBiYXRjaFN0YXJ0IGlzXG4gKiAgIGluY2x1c2l2ZTsgYmF0Y2hFbmQgaXMgZXhjbHVzaXZlLiBJLmUuLCBlYWNoIGJhdGNoIGNvbnNpc3RzIG9mIGluZGljZXMgeFxuICogICB0aGF0IHNhdGlzZnkgYmF0Y2hTdGFydCA8PSB4IDwgYmF0Y2hFbmQuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBtYWtlQmF0Y2hlcyhcbiAgICBzaXplOiBudW1iZXIsIGJhdGNoU2l6ZTogbnVtYmVyKTogQXJyYXk8W251bWJlciwgbnVtYmVyXT4ge1xuICBjb25zdCBvdXRwdXQ6IEFycmF5PFtudW1iZXIsIG51bWJlcl0+ID0gW107XG4gIGxldCBiYXRjaFN0YXJ0ID0gMDtcbiAgbGV0IGJhdGNoRW5kOiBudW1iZXIgPSBudWxsO1xuICB3aGlsZSAoYmF0Y2hTdGFydCA8IHNpemUpIHtcbiAgICBiYXRjaEVuZCA9IGJhdGNoU3RhcnQgKyBiYXRjaFNpemU7XG4gICAgaWYgKGJhdGNoRW5kID49IHNpemUpIHtcbiAgICAgIGJhdGNoRW5kID0gc2l6ZTtcbiAgICB9XG4gICAgb3V0cHV0LnB1c2goW2JhdGNoU3RhcnQsIGJhdGNoRW5kXSk7XG4gICAgYmF0Y2hTdGFydCA9IGJhdGNoRW5kO1xuICB9XG4gIHJldHVybiBvdXRwdXQ7XG59XG5cbi8qKlxuICogQWJzdHJhY3QgZml0IGZ1bmN0aW9uIGZvciBgZihpbnMpYC5cbiAqIEBwYXJhbSBmIEEgRnVuY3Rpb24gcmV0dXJuaW5nIGEgbGlzdCBvZiB0ZW5zb3JzLiBGb3IgdHJhaW5pbmcsIHRoaXNcbiAqICAgZnVuY3Rpb24gaXMgZXhwZWN0ZWQgdG8gcGVyZm9ybSB0aGUgdXBkYXRlcyB0byB0aGUgdmFyaWFibGVzLlxuICogQHBhcmFtIGlucyBMaXN0IG9mIHRlbnNvcnMgdG8gYmUgZmVkIHRvIGBmYC5cbiAqIEBwYXJhbSBvdXRMYWJlbHMgTGlzdCBvZiBzdHJpbmdzLCBkaXNwbGF5IG5hbWVzIG9mIHRoZSBvdXRwdXRzIG9mIGBmYC5cbiAqIEBwYXJhbSBiYXRjaFNpemUgSW50ZWdlciBiYXRjaCBzaXplIG9yIGA9PSBudWxsYCBpZiB1bmtub3duLiBEZWZhdWx0IDogMzIuXG4gKiBAcGFyYW0gZXBvY2hzIE51bWJlciBvZiB0aW1lcyB0byBpdGVyYXRlIG92ZXIgdGhlIGRhdGEuIERlZmF1bHQgOiAxLlxuICogQHBhcmFtIHZlcmJvc2UgVmVyYm9zaXR5IG1vZGU6IDAsIDEsIG9yIDIuIERlZmF1bHQ6IDEuXG4gKiBAcGFyYW0gY2FsbGJhY2tzIExpc3Qgb2YgY2FsbGJhY2tzIHRvIGJlIGNhbGxlZCBkdXJpbmcgdHJhaW5pbmcuXG4gKiBAcGFyYW0gdmFsRiBGdW5jdGlvbiB0byBjYWxsIGZvciB2YWxpZGF0aW9uLlxuICogQHBhcmFtIHZhbElucyBMaXN0IG9mIHRlbnNvcnMgdG8gYmUgZmVkIHRvIGB2YWxGYC5cbiAqIEBwYXJhbSBzaHVmZmxlIFdoZXRoZXIgdG8gc2h1ZmZsZSB0aGUgZGF0YSBhdCB0aGUgYmVnaW5uaW5nIG9mIGV2ZXJ5XG4gKiBlcG9jaC4gRGVmYXVsdCA6IHRydWUuXG4gKiBAcGFyYW0gY2FsbGJhY2tNZXRyaWNzIExpc3Qgb2Ygc3RyaW5ncywgdGhlIGRpc3BsYXkgbmFtZXMgb2YgdGhlIG1ldHJpY3NcbiAqICAgcGFzc2VkIHRvIHRoZSBjYWxsYmFja3MuIFRoZXkgc2hvdWxkIGJlIHRoZSBjb25jYXRlbmF0aW9uIG9mIHRoZVxuICogICBkaXNwbGF5IG5hbWVzIG9mIHRoZSBvdXRwdXRzIG9mIGBmYCBhbmQgdGhlIGxpc3Qgb2YgZGlzcGxheSBuYW1lc1xuICogICBvZiB0aGUgb3V0cHV0cyBvZiBgdmFsRmAuXG4gKiBAcGFyYW0gaW5pdGlhbEVwb2NoIEVwb2NoIGF0IHdoaWNoIHRvIHN0YXJ0IHRyYWluaW5nICh1c2VmdWwgZm9yXG4gKiAgIHJlc3VtaW5nIGEgcHJldmlvdXMgdHJhaW5pbmcgcnVuKS4gRGVmYXVsdCA6IDAuXG4gKiBAcGFyYW0gc3RlcHNQZXJFcG9jaCBUb3RhbCBudW1iZXIgb2Ygc3RlcHMgKGJhdGNoZXMgb24gc2FtcGxlcykgYmVmb3JlXG4gKiAgIGRlY2xhcmluZyBvbmUgZXBvY2ggZmluaXNoZWQgYW5kIHN0YXJ0aW5nIHRoZSBuZXh0IGVwb2NoLiBJZ25vcmVkIHdpdGhcbiAqICAgdGhlIGRlZmF1bHQgdmFsdWUgb2YgYHVuZGVmaW5lZGAgb3IgYG51bGxgLlxuICogQHBhcmFtIHZhbGlkYXRpb25TdGVwcyBOdW1iZXIgb2Ygc3RlcHMgdG8gcnVuIHZhbGlkYXRpb24gZm9yIChvbmx5IGlmXG4gKiAgIGRvaW5nIHZhbGlkYXRpb24gZnJvbSBkYXRhIHRlbnNvcnMpLiBOb3QgYXBwbGljYWJsZSBmb3IgdGZqcy1sYXllcnMuXG4gKiBAcmV0dXJucyBBIGBIaXN0b3J5YCBvYmplY3QuXG4gKi9cbmFzeW5jIGZ1bmN0aW9uIGZpdExvb3AoXG4gICAgLy8gVHlwZSBgbW9kZWxgIGFzIGBhbnlgIGhlcmUgdG8gYXZvaWQgY2lyY3VsYXIgZGVwZW5kZW5jeSB3LyB0cmFpbmluZy50cy5cbiAgICAvLyB0c2xpbnQ6ZGlzYWJsZS1uZXh0LWxpbmU6bm8tYW55XG4gICAgbW9kZWw6IGFueSwgZjogKGRhdGE6IFRlbnNvcltdKSA9PiBTY2FsYXJbXSwgaW5zOiBUZW5zb3JbXSxcbiAgICBvdXRMYWJlbHM/OiBzdHJpbmdbXSwgYmF0Y2hTaXplPzogbnVtYmVyLCBlcG9jaHM/OiBudW1iZXIsIHZlcmJvc2U/OiBudW1iZXIsXG4gICAgY2FsbGJhY2tzPzogQmFzZUNhbGxiYWNrW10sIHZhbEY/OiAoZGF0YTogVGVuc29yW10pID0+IFNjYWxhcltdLFxuICAgIHZhbElucz86IFRlbnNvcltdLCBzaHVmZmxlPzogYm9vbGVhbnxzdHJpbmcsIGNhbGxiYWNrTWV0cmljcz86IHN0cmluZ1tdLFxuICAgIGluaXRpYWxFcG9jaD86IG51bWJlciwgc3RlcHNQZXJFcG9jaD86IG51bWJlcixcbiAgICB2YWxpZGF0aW9uU3RlcHM/OiBudW1iZXIpOiBQcm9taXNlPEhpc3Rvcnk+IHtcbiAgaWYgKGJhdGNoU2l6ZSA9PSBudWxsKSB7XG4gICAgYmF0Y2hTaXplID0gMzI7XG4gIH1cbiAgaWYgKGVwb2NocyA9PSBudWxsKSB7XG4gICAgZXBvY2hzID0gMTtcbiAgfVxuICBpZiAoc2h1ZmZsZSA9PSBudWxsKSB7XG4gICAgc2h1ZmZsZSA9IHRydWU7XG4gIH1cbiAgaWYgKGluaXRpYWxFcG9jaCA9PSBudWxsKSB7XG4gICAgaW5pdGlhbEVwb2NoID0gMDtcbiAgfVxuXG4gIC8vIFRPRE8oY2Fpcyk6IENoYW5nZSBjb25zdCB0byBsZXQgYmVsb3cgd2hlbiBpbXBsZW1lbnRpbmcgdmFsaWRhdGlvbi5cbiAgbGV0IGRvVmFsaWRhdGlvbiA9IGZhbHNlO1xuICBpZiAodmFsRiAhPSBudWxsICYmIHZhbElucyAhPSBudWxsKSB7XG4gICAgZG9WYWxpZGF0aW9uID0gdHJ1ZTtcbiAgICAvLyBUT0RPKGNhaXMpOiB2ZXJib3NlIG1lc3NhZ2UuXG4gIH1cbiAgaWYgKHZhbGlkYXRpb25TdGVwcyAhPSBudWxsKSB7XG4gICAgZG9WYWxpZGF0aW9uID0gdHJ1ZTtcbiAgICBpZiAoc3RlcHNQZXJFcG9jaCA9PSBudWxsKSB7XG4gICAgICB0aHJvdyBuZXcgVmFsdWVFcnJvcihcbiAgICAgICAgICAnQ2FuIG9ubHkgdXNlIGB2YWxpZGF0aW9uU3RlcHNgIHdoZW4gZG9pbmcgc3RlcC13aXNlIHRyYWluaW5nLCAnICtcbiAgICAgICAgICAnaS5lLiwgYHN0ZXBzUGVyRXBvY2hgIG11c3QgYmUgc2V0LicpO1xuICAgIH1cbiAgfVxuXG4gIGNvbnN0IG51bVRyYWluU2FtcGxlcyA9XG4gICAgICBtb2RlbC5jaGVja051bVNhbXBsZXMoaW5zLCBiYXRjaFNpemUsIHN0ZXBzUGVyRXBvY2gsICdzdGVwc19wZXJfZXBvY2gnKTtcbiAgbGV0IGluZGV4QXJyYXk6IG51bWJlcltdO1xuICBpZiAobnVtVHJhaW5TYW1wbGVzICE9IG51bGwpIHtcbiAgICBpbmRleEFycmF5ID0gcmFuZ2UoMCwgbnVtVHJhaW5TYW1wbGVzKTtcbiAgfVxuXG4gIGlmICh2ZXJib3NlID09IG51bGwpIHtcbiAgICB2ZXJib3NlID0gMTtcbiAgfVxuXG4gIGNvbnN0IHtjYWxsYmFja0xpc3QsIGhpc3Rvcnl9ID0gY29uZmlndXJlQ2FsbGJhY2tzKFxuICAgICAgY2FsbGJhY2tzLCB2ZXJib3NlLCBlcG9jaHMsIGluaXRpYWxFcG9jaCwgbnVtVHJhaW5TYW1wbGVzLCBzdGVwc1BlckVwb2NoLFxuICAgICAgYmF0Y2hTaXplLCBkb1ZhbGlkYXRpb24sIGNhbGxiYWNrTWV0cmljcyk7XG4gIGNhbGxiYWNrTGlzdC5zZXRNb2RlbChtb2RlbCk7XG4gIG1vZGVsLmhpc3RvcnkgPSBoaXN0b3J5O1xuICBhd2FpdCBjYWxsYmFja0xpc3Qub25UcmFpbkJlZ2luKCk7XG4gIG1vZGVsLnN0b3BUcmFpbmluZ18gPSBmYWxzZTtcbiAgLy8gVE9ETyhjYWlzKTogVGFrZSBjYXJlIG9mIGNhbGxiYWNrcy52YWxpZGF0aW9uX2RhdGEgYXMgaW4gUHlLZXJhcy5cbiAgLy8gVE9ETyhjYWlzKTogUHJlLWNvbnZlcnQgZmVlZHMgZm9yIHBlcmZvcm1hbmNlIGFzIGluIFB5S2VyYXMuXG5cbiAgZm9yIChsZXQgZXBvY2ggPSBpbml0aWFsRXBvY2g7IGVwb2NoIDwgZXBvY2hzOyArK2Vwb2NoKSB7XG4gICAgYXdhaXQgY2FsbGJhY2tMaXN0Lm9uRXBvY2hCZWdpbihlcG9jaCk7XG4gICAgY29uc3QgZXBvY2hMb2dzOiBVbnJlc29sdmVkTG9ncyA9IHt9O1xuICAgIGlmIChzdGVwc1BlckVwb2NoICE9IG51bGwpIHtcbiAgICAgIHRocm93IG5ldyBOb3RJbXBsZW1lbnRlZEVycm9yKFxuICAgICAgICAgICdzdGVwc1BlckVwb2NoIG1vZGUgaXMgbm90IGltcGxlbWVudGVkIHlldC4nKTtcbiAgICB9IGVsc2Uge1xuICAgICAgaWYgKHNodWZmbGUgPT09ICdiYXRjaCcpIHtcbiAgICAgICAgdGhyb3cgbmV3IE5vdEltcGxlbWVudGVkRXJyb3IoJ2JhdGNoIHNodWZmbGluZyBpcyBub3QgaW1wbGVtbmV0ZWQgeWV0Jyk7XG4gICAgICB9IGVsc2UgaWYgKHNodWZmbGUpIHtcbiAgICAgICAgdXRpbC5zaHVmZmxlKGluZGV4QXJyYXkpO1xuICAgICAgfVxuICAgICAgLy8gQ29udmVydCB0aGUgcG90ZW50aWFsbHkgc2h1ZmZsZWQgaW5kaWNlcyB0byBUZW5zb3IxRCwgdG8gYXZvaWQgdGhlXG4gICAgICAvLyBjb3N0IG9mIHJlcGVhdGVkIGNyZWF0aW9uIG9mIEFycmF5MURzIGxhdGVyIG9uLlxuICAgICAgY29uc3QgZXBvY2hJbmRleEFycmF5MUQgPSB0ZW5zb3IxZChpbmRleEFycmF5KTtcblxuICAgICAgY29uc3QgYmF0Y2hlcyA9IG1ha2VCYXRjaGVzKG51bVRyYWluU2FtcGxlcywgYmF0Y2hTaXplKTtcbiAgICAgIGZvciAobGV0IGJhdGNoSW5kZXggPSAwOyBiYXRjaEluZGV4IDwgYmF0Y2hlcy5sZW5ndGg7ICsrYmF0Y2hJbmRleCkge1xuICAgICAgICBjb25zdCBiYXRjaExvZ3M6IFVucmVzb2x2ZWRMb2dzID0ge307XG4gICAgICAgIGF3YWl0IGNhbGxiYWNrTGlzdC5vbkJhdGNoQmVnaW4oYmF0Y2hJbmRleCwgYmF0Y2hMb2dzKTtcblxuICAgICAgICB0ZmMudGlkeSgoKSA9PiB7XG4gICAgICAgICAgY29uc3QgYmF0Y2hTdGFydCA9IGJhdGNoZXNbYmF0Y2hJbmRleF1bMF07XG4gICAgICAgICAgY29uc3QgYmF0Y2hFbmQgPSBiYXRjaGVzW2JhdGNoSW5kZXhdWzFdO1xuICAgICAgICAgIGNvbnN0IGJhdGNoSWRzID0gc2xpY2VBbG9uZ0ZpcnN0QXhpcyhcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlcG9jaEluZGV4QXJyYXkxRCwgYmF0Y2hTdGFydCxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBiYXRjaEVuZCAtIGJhdGNoU3RhcnQpIGFzIFRlbnNvcjFEO1xuICAgICAgICAgIGJhdGNoTG9nc1snYmF0Y2gnXSA9IGJhdGNoSW5kZXg7XG4gICAgICAgICAgYmF0Y2hMb2dzWydzaXplJ10gPSBiYXRjaEVuZCAtIGJhdGNoU3RhcnQ7XG5cbiAgICAgICAgICAvLyBUT0RPKGNhaXMpOiBJbiBpbnMsIHRyYWluIGZsYWcgY2FuIGJlIGEgbnVtYmVyLCBpbnN0ZWFkIG9mIGFuXG4gICAgICAgICAgLy8gICBUZW5zb3I/IERvIHdlIG5lZWQgdG8gaGFuZGxlIHRoaXMgaW4gdGZqcy1sYXllcnM/XG4gICAgICAgICAgY29uc3QgaW5zQmF0Y2ggPSBzbGljZUFycmF5c0J5SW5kaWNlcyhpbnMsIGJhdGNoSWRzKSBhcyBUZW5zb3JbXTtcbiAgICAgICAgICBjb25zdCBvdXRzID0gZihpbnNCYXRjaCk7XG4gICAgICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCBvdXRMYWJlbHMubGVuZ3RoOyArK2kpIHtcbiAgICAgICAgICAgIGNvbnN0IGxhYmVsID0gb3V0TGFiZWxzW2ldO1xuICAgICAgICAgICAgY29uc3Qgb3V0ID0gb3V0c1tpXTtcbiAgICAgICAgICAgIGJhdGNoTG9nc1tsYWJlbF0gPSBvdXQ7XG4gICAgICAgICAgICB0ZmMua2VlcChvdXQpO1xuICAgICAgICAgICAgLy8gVE9ETyhjYWlzKTogVXNlIHNjb3BlKCkgdG8gYXZvaWQgb3duZXJzaGlwLlxuICAgICAgICAgIH1cblxuICAgICAgICAgIGlmIChiYXRjaEluZGV4ID09PSBiYXRjaGVzLmxlbmd0aCAtIDEpIHsgIC8vIExhc3QgYmF0Y2guXG4gICAgICAgICAgICBpZiAoZG9WYWxpZGF0aW9uKSB7XG4gICAgICAgICAgICAgIGNvbnN0IHZhbE91dHMgPSBtb2RlbC50ZXN0TG9vcCh2YWxGLCB2YWxJbnMsIGJhdGNoU2l6ZSk7XG4gICAgICAgICAgICAgIC8vIFBvcnRpbmcgTm90ZXM6IEluIHRmanMtbGF5ZXJzLCB2YWxPdXRzIGlzIGFsd2F5cyBhbiBBcnJheS5cbiAgICAgICAgICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCBvdXRMYWJlbHMubGVuZ3RoOyArK2kpIHtcbiAgICAgICAgICAgICAgICBjb25zdCBsYWJlbCA9IG91dExhYmVsc1tpXTtcbiAgICAgICAgICAgICAgICBjb25zdCBvdXQgPSB2YWxPdXRzW2ldO1xuICAgICAgICAgICAgICAgIHRmYy5rZWVwKG91dCk7XG4gICAgICAgICAgICAgICAgLy8gVE9ETyhjYWlzKTogVXNlIHNjb3BlKCkgdG8gYXZvaWQgb3duZXJzaGlwLlxuICAgICAgICAgICAgICAgIGVwb2NoTG9nc1sndmFsXycgKyBsYWJlbF0gPSBvdXQ7XG4gICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9XG4gICAgICAgIH0pO1xuXG4gICAgICAgIGF3YWl0IGNhbGxiYWNrTGlzdC5vbkJhdGNoRW5kKGJhdGNoSW5kZXgsIGJhdGNoTG9ncyk7XG4gICAgICAgIGRpc3Bvc2VUZW5zb3JzSW5Mb2dzKGJhdGNoTG9ncyk7XG5cbiAgICAgICAgaWYgKG1vZGVsLnN0b3BUcmFpbmluZ18pIHtcbiAgICAgICAgICBicmVhaztcbiAgICAgICAgfVxuICAgICAgICAvLyBUT0RPKGNhaXMpOiByZXR1cm4gb3V0cyBhcyBsaXN0IG9mIFRlbnNvci5cbiAgICAgIH1cblxuICAgICAgZXBvY2hJbmRleEFycmF5MUQuZGlzcG9zZSgpO1xuICAgIH1cbiAgICAvLyBUT0RPKGNhaXMpOiBSdW4gdmFsaWRhdGlvbiBhdCB0aGUgZW5kIG9mIHRoZSBlcG9jaC5cbiAgICBhd2FpdCBjYWxsYmFja0xpc3Qub25FcG9jaEVuZChlcG9jaCwgZXBvY2hMb2dzKTtcbiAgICBpZiAobW9kZWwuc3RvcFRyYWluaW5nXykge1xuICAgICAgYnJlYWs7XG4gICAgfVxuICB9XG4gIGF3YWl0IGNhbGxiYWNrTGlzdC5vblRyYWluRW5kKCk7XG5cbiAgYXdhaXQgbW9kZWwuaGlzdG9yeS5zeW5jRGF0YSgpO1xuICByZXR1cm4gbW9kZWwuaGlzdG9yeTtcbn1cblxuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIGZpdFRlbnNvcnMoXG4gICAgLy8gVHlwZSBgbW9kZWxgIGFzIGBhbnlgIGhlcmUgdG8gYXZvaWQgY2lyY3VsYXIgZGVwZW5kZW5jeSB3LyB0cmFpbmluZy50cy5cbiAgICAvLyB0c2xpbnQ6ZGlzYWJsZS1uZXh0LWxpbmU6bm8tYW55XG4gICAgbW9kZWw6IGFueSwgeDogVGVuc29yfFRlbnNvcltdfHtbaW5wdXROYW1lOiBzdHJpbmddOiBUZW5zb3J9LFxuICAgIHk6IFRlbnNvcnxUZW5zb3JbXXx7W2lucHV0TmFtZTogc3RyaW5nXTogVGVuc29yfSxcbiAgICBhcmdzOiBNb2RlbEZpdEFyZ3MgPSB7fSk6IFByb21pc2U8SGlzdG9yeT4ge1xuICBpZiAobW9kZWwuaXNUcmFpbmluZykge1xuICAgIHRocm93IG5ldyBFcnJvcihcbiAgICAgICAgJ0Nhbm5vdCBzdGFydCB0cmFpbmluZyBiZWNhdXNlIGFub3RoZXIgZml0KCkgY2FsbCBpcyBvbmdvaW5nLicpO1xuICB9XG4gIG1vZGVsLmlzVHJhaW5pbmcgPSB0cnVlO1xuICBsZXQgaW5wdXRzOiBUZW5zb3JbXTtcbiAgbGV0IHRhcmdldHM6IFRlbnNvcltdO1xuICBsZXQgb3JpZ2luYWxJbnB1dHM6IFRlbnNvcltdO1xuICBsZXQgb3JpZ2luYWxUYXJnZXRzOiBUZW5zb3JbXTtcbiAgbGV0IGlucHV0VmFsWDogVGVuc29yfFRlbnNvcltdO1xuICBsZXQgaW5wdXRWYWxZOiBUZW5zb3J8VGVuc29yW107XG4gIGxldCB2YWxYOiBUZW5zb3J8VGVuc29yW107XG4gIGxldCB2YWxZOiBUZW5zb3J8VGVuc29yW107XG4gIGxldCBzYW1wbGVXZWlnaHRzOiBUZW5zb3JbXTtcbiAgdHJ5IHtcbiAgICBjb25zdCBiYXRjaFNpemUgPSBhcmdzLmJhdGNoU2l6ZSA9PSBudWxsID8gMzIgOiBhcmdzLmJhdGNoU2l6ZTtcbiAgICBjaGVja0JhdGNoU2l6ZShiYXRjaFNpemUpO1xuXG4gICAgLy8gVmFsaWRhdGUgdXNlciBkYXRhLlxuICAgIC8vIFRPRE8oY2Fpcyk6IFN1cHBvcnQgc2FtcGxlV2VpZ2h0LlxuICAgIGNvbnN0IGNoZWNrQmF0Y2hBeGlzID0gZmFsc2U7XG4gICAgY29uc3Qgc3RhbmRhcmRpemVkT3V0cyA9XG4gICAgICAgIGF3YWl0IG1vZGVsLnN0YW5kYXJkaXplVXNlckRhdGEoXG4gICAgICAgICAgICB4LCB5LCBhcmdzLnNhbXBsZVdlaWdodCwgYXJncy5jbGFzc1dlaWdodCwgY2hlY2tCYXRjaEF4aXMsXG4gICAgICAgICAgICBiYXRjaFNpemUpIGFzIFtUZW5zb3JbXSwgVGVuc29yW10sIFRlbnNvcltdXTtcbiAgICBpbnB1dHMgPSBzdGFuZGFyZGl6ZWRPdXRzWzBdO1xuICAgIHRhcmdldHMgPSBzdGFuZGFyZGl6ZWRPdXRzWzFdO1xuICAgIHNhbXBsZVdlaWdodHMgPSBzdGFuZGFyZGl6ZWRPdXRzWzJdO1xuXG4gICAgLy8gUHJlcGFyZSB2YWxpZGF0aW9uIGRhdGEuXG4gICAgbGV0IGRvVmFsaWRhdGlvbiA9IGZhbHNlO1xuICAgIGxldCB2YWxJbnM6IFRlbnNvcltdO1xuICAgIGlmIChhcmdzLnZhbGlkYXRpb25EYXRhICE9IG51bGwgJiYgYXJncy52YWxpZGF0aW9uRGF0YS5sZW5ndGggPiAwKSB7XG4gICAgICBkb1ZhbGlkYXRpb24gPSB0cnVlO1xuICAgICAgaWYgKGFyZ3MudmFsaWRhdGlvbkRhdGEubGVuZ3RoID09PSAyKSB7XG4gICAgICAgIC8vIGNvbmZpZy52YWxpZGF0aW9uRGF0YSBjb25zaXN0cyBvZiB2YWxYIGFuZCB2YWxZLlxuICAgICAgICBpbnB1dFZhbFggPSBhcmdzLnZhbGlkYXRpb25EYXRhWzBdO1xuICAgICAgICBpbnB1dFZhbFkgPSBhcmdzLnZhbGlkYXRpb25EYXRhWzFdO1xuICAgICAgfSBlbHNlIGlmIChhcmdzLnZhbGlkYXRpb25EYXRhLmxlbmd0aCA9PT0gMykge1xuICAgICAgICB0aHJvdyBuZXcgTm90SW1wbGVtZW50ZWRFcnJvcihcbiAgICAgICAgICAgICd2YWxpZGF0aW9uRGF0YSBpbmNsdWRpbmcgc2FtcGxlIHdlaWdodHMgaXMgbm90IHN1cHBvcnRlZCB5ZXQuJyk7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICB0aHJvdyBuZXcgVmFsdWVFcnJvcihcbiAgICAgICAgICAgIGBXaGVuIHBhc3NpbmcgdmFsaWRhdGlvbiBkYXRhLCBpdCBtdXN0IGNvbnRhaW4gMiAodmFsWCwgdmFsWSkgYCArXG4gICAgICAgICAgICBgb3IgMyAodmFsWCwgdmFsWSwgdmFsU2FtcGxlV2VpZ2h0KSBpdGVtczsgYCArXG4gICAgICAgICAgICBgJHthcmdzLnZhbGlkYXRpb25EYXRhfSBpcyBpbnZhbGlkLmApO1xuICAgICAgfVxuXG4gICAgICBjb25zdCBjaGVja0JhdGNoQXhpcyA9IHRydWU7XG4gICAgICBjb25zdCB2YWxTdGFuZGFyZGl6ZWQgPVxuICAgICAgICAgIGF3YWl0IG1vZGVsLnN0YW5kYXJkaXplVXNlckRhdGEoXG4gICAgICAgICAgICAgIGlucHV0VmFsWCwgaW5wdXRWYWxZLCBudWxsLCAvKiogVW51c2VkIHNhbXBsZSB3ZWlnaHRzLiAqL1xuICAgICAgICAgICAgICBudWxsLCAgICAgICAgICAgICAgICAgICAgICAgLyoqIFVudXNlZCBjbGFzcyB3ZWlnaHRzLiAqL1xuICAgICAgICAgICAgICBjaGVja0JhdGNoQXhpcywgYmF0Y2hTaXplKSBhcyBbVGVuc29yW10sIFRlbnNvcltdLCBUZW5zb3JbXV07XG4gICAgICB2YWxYID0gdmFsU3RhbmRhcmRpemVkWzBdO1xuICAgICAgdmFsWSA9IHZhbFN0YW5kYXJkaXplZFsxXTtcbiAgICAgIHZhbElucyA9IHZhbFguY29uY2F0KHZhbFkpO1xuICAgICAgLy8gVE9ETyhjYWlzKTogQWRkIHVzZUxlYXJuaW5nUGhhc2UgZGF0YSBwcm9wZXJseS5cbiAgICB9IGVsc2UgaWYgKFxuICAgICAgICBhcmdzLnZhbGlkYXRpb25TcGxpdCAhPSBudWxsICYmIGFyZ3MudmFsaWRhdGlvblNwbGl0ID4gMCAmJlxuICAgICAgICBhcmdzLnZhbGlkYXRpb25TcGxpdCA8IDEpIHtcbiAgICAgIGRvVmFsaWRhdGlvbiA9IHRydWU7XG4gICAgICAvLyBQb3J0aW5nIE5vdGU6IEluIHRmanMtbGF5ZXJzLCBpbnB1dHNbMF0gaXMgYWx3YXlzIGEgVGVuc29yLlxuICAgICAgY29uc3Qgc3BsaXRBdCA9XG4gICAgICAgICAgTWF0aC5mbG9vcihpbnB1dHNbMF0uc2hhcGVbMF0gKiAoMSAtIGFyZ3MudmFsaWRhdGlvblNwbGl0KSk7XG4gICAgICBjb25zdCBvcmlnaW5hbEJhdGNoU2l6ZSA9IGlucHV0c1swXS5zaGFwZVswXTtcbiAgICAgIHZhbFggPSBzbGljZUFycmF5cyhpbnB1dHMsIHNwbGl0QXQsIG9yaWdpbmFsQmF0Y2hTaXplKSBhcyBUZW5zb3JbXTtcbiAgICAgIG9yaWdpbmFsSW5wdXRzID0gaW5wdXRzO1xuICAgICAgaW5wdXRzID0gc2xpY2VBcnJheXMoaW5wdXRzLCAwLCBzcGxpdEF0KSBhcyBUZW5zb3JbXTtcbiAgICAgIHZhbFkgPSBzbGljZUFycmF5cyh0YXJnZXRzLCBzcGxpdEF0LCBvcmlnaW5hbEJhdGNoU2l6ZSkgYXMgVGVuc29yW107XG4gICAgICBvcmlnaW5hbFRhcmdldHMgPSB0YXJnZXRzO1xuICAgICAgdGFyZ2V0cyA9IHNsaWNlQXJyYXlzKHRhcmdldHMsIDAsIHNwbGl0QXQpIGFzIFRlbnNvcltdO1xuICAgICAgLy8gVE9ETyhjYWlzKTogT25jZSBzYW1wbGVXZWlnaHRzIGJlY29tZXMgYXZhaWxhYmxlLCBzbGljZSBpdCB0byBnZXRcbiAgICAgIC8vICAgdmFsU2FtcGxlV2VpZ2h0cy5cbiAgICAgIHZhbElucyA9IHZhbFguY29uY2F0KHZhbFkpO1xuXG4gICAgICAvLyBUT0RPKGNhaXMpOiBBZGQgdXNlTGVhcm5pbmdQaGFzZSBkYXRhIHByb3Blcmx5LlxuICAgIH0gZWxzZSBpZiAoYXJncy52YWxpZGF0aW9uU3RlcHMgIT0gbnVsbCkge1xuICAgICAgZG9WYWxpZGF0aW9uID0gdHJ1ZTtcbiAgICAgIC8vIFRPRE8oY2Fpcyk6IEFkZCB1c2VMZWFybmluZ1BoYXNlLlxuICAgIH1cblxuICAgIGNvbnN0IGlucyA9IGlucHV0cy5jb25jYXQodGFyZ2V0cykuY29uY2F0KHNhbXBsZVdlaWdodHMpO1xuXG4gICAgbW9kZWwuY2hlY2tUcmFpbmFibGVXZWlnaHRzQ29uc2lzdGVuY3koKTtcblxuICAgIC8vIFRPRE8oY2Fpcyk6IEhhbmRsZSB1c2VfbGVhcm5pbmdfcGhhc2UgYW5kIGxlYXJuaW5nX3BoYXNlP1xuXG4gICAgLy8gUG9ydGluZyBOb3RlOiBIZXJlIHdlIHNlZSBhIGtleSBkZXZpYXRpb24gb2YgdGZqcy1sYXllcnMgZnJvbVxuICAgIC8vIEtlcmFzLlxuICAgIC8vICBEdWUgdG8gdGhlIGltcGVyYXRpdmUgbmF0dXJlIG9mIHRmanMtbGF5ZXJzJyBiYWNrZW5kICh0ZmpzLWNvcmUpLFxuICAgIC8vICB3ZSBkbyBub3QgY29uc3RydWN0IHN5bWJvbGljIGNvbXB1dGF0aW9uIGdyYXBocyB0byBlbWJvZHkgdGhlXG4gICAgLy8gIHRyYWluaW5nIHByb2Nlc3MuIEluc3RlYWQsIHdlIGRlZmluZSBhIGZ1bmN0aW9uIHRoYXQgcGVyZm9ybXMgdGhlXG4gICAgLy8gIHRyYWluaW5nIGFjdGlvbi4gSW4gUHlLZXJhcywgdGhlIGRhdGEgKGlucHV0cyBhbmQgdGFyZ2V0cykgYXJlIGZlZFxuICAgIC8vICB0aHJvdWdoIGdyYXBoIHBsYWNlaG9sZGVycy4gSW4gdGZqcy1sYXllcnMsIHRoZSBkYXRhIGFyZSBmZWQgYXNcbiAgICAvLyAgZnVuY3Rpb24gYXJndW1lbnRzLiBTaW5jZSB0aGUgZnVuY3Rpb24gYXJlIGRlZmluZWQgYmVsb3cgaW4gdGhlXG4gICAgLy8gIHNjb3BlLCB3ZSBkb24ndCBoYXZlIGVxdWl2YWxlbnRzIG9mIFB5S2VyYXMnc1xuICAgIC8vICBgX21ha2VfdHJhaW5fZnVuY2l0b25gLlxuICAgIGNvbnN0IHRyYWluRnVuY3Rpb24gPSBtb2RlbC5tYWtlVHJhaW5GdW5jdGlvbigpO1xuICAgIGNvbnN0IG91dExhYmVscyA9IG1vZGVsLmdldERlZHVwZWRNZXRyaWNzTmFtZXMoKSBhcyBzdHJpbmdbXTtcblxuICAgIGxldCB2YWxGdW5jdGlvbjogKGRhdGE6IFRlbnNvcltdKSA9PiBTY2FsYXJbXTtcbiAgICBsZXQgY2FsbGJhY2tNZXRyaWNzOiBzdHJpbmdbXTtcbiAgICBpZiAoZG9WYWxpZGF0aW9uKSB7XG4gICAgICBtb2RlbC5tYWtlVGVzdEZ1bmN0aW9uKCk7XG4gICAgICB2YWxGdW5jdGlvbiA9IG1vZGVsLnRlc3RGdW5jdGlvbjtcbiAgICAgIGNhbGxiYWNrTWV0cmljcyA9XG4gICAgICAgICAgb3V0TGFiZWxzLnNsaWNlKCkuY29uY2F0KG91dExhYmVscy5tYXAobiA9PiAndmFsXycgKyBuKSk7XG4gICAgfSBlbHNlIHtcbiAgICAgIHZhbEZ1bmN0aW9uID0gbnVsbDtcbiAgICAgIHZhbElucyA9IFtdO1xuICAgICAgY2FsbGJhY2tNZXRyaWNzID0gb3V0TGFiZWxzLnNsaWNlKCk7XG4gICAgfVxuXG4gICAgY29uc3QgY2FsbGJhY2tzID0gc3RhbmRhcmRpemVDYWxsYmFja3MoYXJncy5jYWxsYmFja3MsIGFyZ3MueWllbGRFdmVyeSk7XG4gICAgY29uc3Qgb3V0ID0gYXdhaXQgZml0TG9vcChcbiAgICAgICAgbW9kZWwsIHRyYWluRnVuY3Rpb24sIGlucywgb3V0TGFiZWxzLCBiYXRjaFNpemUsIGFyZ3MuZXBvY2hzLFxuICAgICAgICBhcmdzLnZlcmJvc2UsIGNhbGxiYWNrcywgdmFsRnVuY3Rpb24sIHZhbElucywgYXJncy5zaHVmZmxlLFxuICAgICAgICBjYWxsYmFja01ldHJpY3MsIGFyZ3MuaW5pdGlhbEVwb2NoLCBudWxsLCBudWxsKTtcbiAgICByZXR1cm4gb3V0O1xuICB9IGZpbmFsbHkge1xuICAgIG1vZGVsLmlzVHJhaW5pbmcgPSBmYWxzZTtcbiAgICAvLyBNZW1vcnkgY2xlYW4gdXAuXG4gICAgZGlzcG9zZU5ld1RlbnNvcnMoaW5wdXRzLCB4KTtcbiAgICBkaXNwb3NlTmV3VGVuc29ycyh0YXJnZXRzLCB5KTtcbiAgICBkaXNwb3NlTmV3VGVuc29ycyhvcmlnaW5hbElucHV0cywgeCk7XG4gICAgZGlzcG9zZU5ld1RlbnNvcnMob3JpZ2luYWxUYXJnZXRzLCB5KTtcbiAgICBkaXNwb3NlTmV3VGVuc29ycyh2YWxYIGFzIFRlbnNvcltdLCBpbnB1dFZhbFgpO1xuICAgIGRpc3Bvc2VOZXdUZW5zb3JzKHZhbFkgYXMgVGVuc29yW10sIGlucHV0VmFsWSk7XG4gICAgaWYgKHNhbXBsZVdlaWdodHMgIT0gbnVsbCkge1xuICAgICAgdGZjLmRpc3Bvc2Uoc2FtcGxlV2VpZ2h0cyk7XG4gICAgfVxuICB9XG4gIC8vIFRPRE8oY2Fpcyk6IEFkZCB2YWx1ZSB0byBvdXRMYWJlbHMuXG59XG5cbi8qKlxuICogRW5zdXJlIHRlbnNvcnMgYWxsIGhhdmUgYSByYW5rIG9mIGF0IGxlYXN0IDIuXG4gKlxuICogSWYgYSB0ZW5zb3IgaGFzIGEgcmFuayBvZiAxLCBpdCBpcyBkaW1lbnNpb24tZXhwYW5kZWQgdG8gcmFuayAyLlxuICogSWYgYW55IHRlbnNvciBoYXMgYSByYW5rIG9mIDAgKGkuZS4sIGlzIGEgc2NhbGFyKSwgYW4gZXJyb3Igd2lsbCBiZSB0aHJvd24uXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBlbnN1cmVUZW5zb3JzUmFuazJPckhpZ2hlcih0ZW5zb3JzOiBUZW5zb3J8VGVuc29yW10pOiBUZW5zb3JbXSB7XG4gIGNvbnN0IG91dHM6IFRlbnNvcltdID0gW107XG4gIGlmICh0ZW5zb3JzIGluc3RhbmNlb2YgVGVuc29yKSB7XG4gICAgdGVuc29ycyA9IFt0ZW5zb3JzXTtcbiAgfVxuXG4gIC8vIE1ha2UgVGVuc29ycyBhdCBsZWFzdCAyRC5cbiAgZm9yIChsZXQgaSA9IDA7IGkgPCB0ZW5zb3JzLmxlbmd0aDsgKytpKSB7XG4gICAgY29uc3QgdGVuc29yID0gdGVuc29yc1tpXTtcbiAgICBpZiAodGVuc29yLnJhbmsgPT09IDEpIHtcbiAgICAgIG91dHMucHVzaChleHBhbmREaW1zKHRlbnNvciwgMSkpO1xuICAgIH0gZWxzZSBpZiAodGVuc29yLnJhbmsgPT09IDApIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcihcbiAgICAgICAgICAnRXhwZWN0ZWQgdGVuc29yIHRvIGJlIGF0IGxlYXN0IDFELCBidXQgcmVjZWl2ZWQgYSAwRCB0ZW5zb3IgJyArXG4gICAgICAgICAgJyhzY2FsYXIpLicpO1xuICAgIH0gZWxzZSB7XG4gICAgICBvdXRzLnB1c2godGVuc29yKTtcbiAgICB9XG4gIH1cbiAgcmV0dXJuIG91dHM7XG59XG5cbi8qKlxuICogQ29tcGFyZSBhIHNldCBvZiB0ZW5zb3JzIHdpdGggYSByZWZlcmVuY2UgKG9sZCkgc2V0LCBkaXNjYXJkIHRoZSBvbmVzXG4gKiBpbiB0aGUgbmV3IHNldCB0aGF0IGFyZSBub3QgcHJlc2VudCBpbiB0aGUgcmVmZXJlbmNlIHNldC5cbiAqXG4gKiBUaGlzIG1ldGhvZCBpcyB1c2VkIGZvciBtZW1vcnkgY2xlbmF1cCBkdXJpbmcgY2FsbHMgc3VjaCBhc1xuICogTGF5ZXJzTW9kZWwuZml0KCkuXG4gKlxuICogQHBhcmFtIHRlbnNvcnMgTmV3IHNldCB3aGljaCBtYXkgY29udGFpbiBUZW5zb3JzIG5vdCBwcmVzZW50IGluXG4gKiAgIGByZWZUZW5zb3JzYC5cbiAqIEBwYXJhbSByZWZUZW5zb3JzIFJlZmVyZW5jZSBUZW5zb3Igc2V0LlxuICovXG4vLyBUT0RPKGNhaXMsIGthbmd5aXpoYW5nKTogRGVkdXBsaWNhdGUgd2l0aCB0ZmpzLWRhdGEuXG5leHBvcnQgZnVuY3Rpb24gZGlzcG9zZU5ld1RlbnNvcnMoXG4gICAgdGVuc29yczogVGVuc29yfFRlbnNvcltdfHtbaW5wdXROYW1lOiBzdHJpbmddOiBUZW5zb3J9LFxuICAgIHJlZlRlbnNvcnM6IFRlbnNvcnxUZW5zb3JbXXx7W2lucHV0TmFtZTogc3RyaW5nXTogVGVuc29yfSk6IHZvaWQge1xuICBpZiAodGVuc29ycyA9PSBudWxsKSB7XG4gICAgcmV0dXJuO1xuICB9XG4gIGNvbnN0IG9sZFRlbnNvcklkczogbnVtYmVyW10gPSBbXTtcbiAgaWYgKHJlZlRlbnNvcnMgaW5zdGFuY2VvZiBUZW5zb3IpIHtcbiAgICBvbGRUZW5zb3JJZHMucHVzaChyZWZUZW5zb3JzLmlkKTtcbiAgfSBlbHNlIGlmIChBcnJheS5pc0FycmF5KHJlZlRlbnNvcnMpKSB7XG4gICAgcmVmVGVuc29ycy5mb3JFYWNoKHQgPT4gb2xkVGVuc29ySWRzLnB1c2godC5pZCkpO1xuICB9IGVsc2UgaWYgKHJlZlRlbnNvcnMgIT0gbnVsbCkge1xuICAgIC8vIGBvbGRUZW5zb3JzYCBpcyBhIG1hcCBmcm9tIHN0cmluZyBuYW1lIHRvIFRlbnNvci5cbiAgICBmb3IgKGNvbnN0IG5hbWUgaW4gcmVmVGVuc29ycykge1xuICAgICAgY29uc3Qgb2xkVGVuc29yID0gcmVmVGVuc29yc1tuYW1lXTtcbiAgICAgIG9sZFRlbnNvcklkcy5wdXNoKG9sZFRlbnNvci5pZCk7XG4gICAgfVxuICB9XG5cbiAgY29uc3QgdGVuc29yc1RvRGlzcG9zZTogVGVuc29yW10gPSBbXTtcbiAgaWYgKHRlbnNvcnMgaW5zdGFuY2VvZiBUZW5zb3IpIHtcbiAgICBpZiAob2xkVGVuc29ySWRzLmluZGV4T2YodGVuc29ycy5pZCkgPT09IC0xKSB7XG4gICAgICB0ZW5zb3JzVG9EaXNwb3NlLnB1c2godGVuc29ycyk7XG4gICAgfVxuICB9IGVsc2UgaWYgKEFycmF5LmlzQXJyYXkodGVuc29ycykpIHtcbiAgICB0ZW5zb3JzLmZvckVhY2godCA9PiB7XG4gICAgICBpZiAob2xkVGVuc29ySWRzLmluZGV4T2YodC5pZCkgPT09IC0xKSB7XG4gICAgICAgIHRlbnNvcnNUb0Rpc3Bvc2UucHVzaCh0KTtcbiAgICAgIH1cbiAgICB9KTtcbiAgfSBlbHNlIGlmICh0ZW5zb3JzICE9IG51bGwpIHtcbiAgICAvLyBgb2xkVGVuc29yc2AgaXMgYSBtYXAgZnJvbSBzdHJpbmcgbmFtZSB0byBUZW5zb3IuXG4gICAgZm9yIChjb25zdCBuYW1lIGluIHRlbnNvcnMpIHtcbiAgICAgIGNvbnN0IHRlbnNvciA9IHRlbnNvcnNbbmFtZV07XG4gICAgICBpZiAob2xkVGVuc29ySWRzLmluZGV4T2YodGVuc29yLmlkKSA9PT0gLTEpIHtcbiAgICAgICAgdGVuc29yc1RvRGlzcG9zZS5wdXNoKHRlbnNvcik7XG4gICAgICB9XG4gICAgfVxuICB9XG5cbiAgdGVuc29yc1RvRGlzcG9zZS5mb3JFYWNoKHQgPT4ge1xuICAgIGlmICghdC5pc0Rpc3Bvc2VkKSB7XG4gICAgICB0LmRpc3Bvc2UoKTtcbiAgICB9XG4gIH0pO1xufVxuIl19","/**\n * @license\n * Copyright 2018 Google LLC\n *\n * Use of this source code is governed by an MIT-style\n * license that can be found in the LICENSE file or at\n * https://opensource.org/licenses/MIT.\n * =============================================================================\n */\n/* Original Source: engine/training.py */\nimport * as tfc from '@tensorflow/tfjs-core';\nimport { io, Optimizer, scalar, serialization, Tensor, tensor1d, util } from '@tensorflow/tfjs-core';\nimport * as K from '../backend/tfjs_backend';\nimport { nameScope } from '../common';\nimport { NotImplementedError, RuntimeError, ValueError } from '../errors';\nimport { deserialize } from '../layers/serialization';\nimport * as losses from '../losses';\nimport * as Metrics from '../metrics';\nimport * as optimizers from '../optimizers';\nimport { checkUserDefinedMetadata } from '../user_defined_metadata';\nimport { count, pyListRepeat, singletonOrArray, toCamelCase, toSnakeCase, unique } from '../utils/generic_utils';\nimport { printSummary } from '../utils/layer_utils';\nimport { range } from '../utils/math_utils';\nimport { convertPythonicToTs } from '../utils/serialization_utils';\nimport { version } from '../version';\nimport { Container } from './container';\nimport { execute, FeedDict } from './executor';\nimport { evaluateDataset, fitDataset } from './training_dataset';\nimport { checkBatchSize, disposeNewTensors, ensureTensorsRank2OrHigher, fitTensors, makeBatches, sliceArrays, sliceArraysByIndices } from './training_tensors';\nimport { computeWeightedLoss, standardizeClassWeights, standardizeWeights } from './training_utils';\n/**\n * Helper function for polymorphic input data: 1. singleton Tensor.\n */\nexport function isDataTensor(x) {\n return x instanceof Tensor;\n}\n/**\n * Helper function for polymorphic input data: 2. Array of Tensor.\n */\nexport function isDataArray(x) {\n return Array.isArray(x);\n}\n/**\n * Helper function for polymorphic input data: 3. \"dict\" of Tensor.\n */\nexport function isDataDict(x) {\n return !isDataTensor(x) && !isDataArray(x);\n}\n/**\n * Normalizes inputs and targets provided by users.\n * @param data User-provided input data (polymorphic).\n * @param names An Array of expected Tensor names.\n * @param shapes Optional Array of expected Tensor shapes.\n * @param checkBatchAxis Whether to check that the batch axis of the arrays\n * match the expected value found in `shapes`.\n * @param exceptionPrefix String prefix used for exception formatting.\n * @returns List of standardized input Tensors (one Tensor per model input).\n * @throws ValueError: in case of improperly formatted user data.\n */\nexport function standardizeInputData(data, names, shapes, checkBatchAxis = true, exceptionPrefix = '') {\n if (names == null || names.length === 0) {\n // Check for the case where the model expected no data, but some data got\n // sent.\n if (data != null) {\n let gotUnexpectedData = false;\n if (isDataArray(data) && data.length > 0) {\n gotUnexpectedData = true;\n }\n else if (isDataDict(data)) {\n for (const key in data) {\n if (data.hasOwnProperty(key)) {\n gotUnexpectedData = true;\n break;\n }\n }\n }\n else {\n // `data` is a singleton Tensor in this case.\n gotUnexpectedData = true;\n }\n if (gotUnexpectedData) {\n throw new ValueError(`Error when checking model ${exceptionPrefix} expected no data, ` +\n `but got ${data}`);\n }\n }\n return [];\n }\n if (data == null) {\n return names.map(name => null);\n }\n let arrays;\n if (isDataDict(data)) {\n data = data;\n arrays = [];\n for (const name of names) {\n if (data[name] == null) {\n throw new ValueError(`No data provided for \"${name}\". Need data for each key in: ` +\n `${names}`);\n }\n arrays.push(data[name]);\n }\n }\n else if (isDataArray(data)) {\n data = data;\n if (data.length !== names.length) {\n throw new ValueError(`Error when checking model ${exceptionPrefix}: the Array of ` +\n `Tensors that you are passing to your model is not the size the ` +\n `model expected. Expected to see ${names.length} Tensor(s), but ` +\n `instead got the following list of Tensor(s): ${data}`);\n }\n arrays = data;\n }\n else {\n data = data;\n if (names.length > 1) {\n throw new ValueError(`The model ${exceptionPrefix} expects ${names.length} Tensor(s), ` +\n `but only received one Tensor. Found: Tensor with shape ${data.shape}`);\n }\n arrays = [data];\n }\n arrays = ensureTensorsRank2OrHigher(arrays);\n // Check shape compatibility.\n if (shapes != null) {\n for (let i = 0; i < names.length; ++i) {\n if (shapes[i] == null) {\n continue;\n }\n const array = arrays[i];\n if (array.shape.length !== shapes[i].length) {\n throw new ValueError(`Error when checking ${exceptionPrefix}: expected ${names[i]} ` +\n `to have ${shapes[i].length} dimension(s). but got array with ` +\n `shape ${array.shape}`);\n }\n for (let j = 0; j < shapes[i].length; ++j) {\n if (j === 0 && !checkBatchAxis) {\n // Skip the first (batch) axis.\n continue;\n }\n const dim = array.shape[j];\n const refDim = shapes[i][j];\n if (refDim != null && refDim >= 0 && dim !== refDim) {\n throw new ValueError(`${exceptionPrefix} expected a batch of elements where each ` +\n `example has shape [${shapes[i].slice(1, shapes[i].length)}] ` +\n `(i.e.,tensor shape [*,${shapes[i].slice(1, shapes[i].length)}])` +\n ` but the ${exceptionPrefix} received an input with ${array.shape[0]}` +\n ` examples, each with shape [${array.shape.slice(1, array.shape.length)}]` +\n ` (tensor shape [${array.shape}])`);\n }\n }\n }\n }\n return arrays;\n}\n/**\n * User input validation for Tensors.\n * @param inputs `Array` of `tf.Tensor`s for inputs.\n * @param targets `Array` of `tf.Tensor`s for targets.\n * @param weights Optional `Array` of `tf.Tensor`s for sample weights.\n * @throws ValueError: in case of incorrectly formatted data.\n */\nexport function checkArrayLengths(inputs, targets, weights) {\n const setX = unique(inputs.map(input => input.shape[0]));\n setX.sort();\n const setY = unique(targets.map(target => target.shape[0]));\n setY.sort();\n // TODO(cais): Check `weights` as well.\n if (setX.length > 1) {\n throw new ValueError(`All input Tensors (x) should have the same number of samples. ` +\n `Got array shapes: ` +\n `${JSON.stringify(inputs.map(input => input.shape))}`);\n }\n if (setY.length > 1) {\n throw new ValueError(`All target Tensors (y) should have the same number of samples. ` +\n `Got array shapes: ` +\n `${JSON.stringify(targets.map(target => target.shape))}`);\n }\n if (setX.length > 0 && setY.length > 0 && !util.arraysEqual(setX, setY)) {\n throw new ValueError(`Input Tensors should have the same number of samples as target ` +\n `Tensors. Found ${setX[0]} input sample(s) and ${setY[0]} target ` +\n `sample(s).`);\n }\n}\n/**\n * Validation on the compatibility of targes and loss functions.\n *\n * This helps prevent users from using loss functions incorrectly.\n *\n * @param targets `Array` of `tf.Tensor`s of targets.\n * @param lossFns `Array` of loss functions.\n * @param outputShapes `Array` of shapes of model outputs.\n */\nfunction checkLossAndTargetCompatibility(targets, lossFns, outputShapes) {\n // TODO(cais): Dedicated test coverage?\n const keyLosses = [\n losses.meanSquaredError, losses.binaryCrossentropy,\n losses.categoricalCrossentropy\n ];\n for (let i = 0; i < targets.length; ++i) {\n const y = targets[i];\n const loss = lossFns[i];\n const shape = outputShapes[i];\n if (loss == null) {\n continue;\n }\n if (loss === losses.categoricalCrossentropy) {\n if (y.shape[y.shape.length - 1] === 1) {\n throw new ValueError(`You are passing a target array of shape ${y.shape} while using ` +\n `a loss 'categorical_crossentropy'. 'categorical_crossentropy'` +\n `expects targets to be binary matrices (1s and 0s) of shape ` +\n `[samples, classes].`);\n // TODO(cais): Example code in error message.\n }\n }\n if (keyLosses.indexOf(loss) !== -1) {\n const slicedYShape = y.shape.slice(1);\n const slicedShape = shape.slice(1);\n for (let j = 0; j < slicedYShape.length; ++j) {\n const targetDim = slicedYShape[j];\n const outDim = slicedShape[j];\n if (outDim != null && targetDim !== outDim) {\n throw new ValueError(`A target Tensor with shape ${y.shape} was passed for an ` +\n `output of shape ${shape}, while using a loss function that ` +\n `expects targets to have the same shape as the output.`);\n }\n }\n }\n }\n}\n/**\n * Check inputs provided by the user.\n *\n * Porting Note: This corresponds to _standardize_input_data() in Python\n * Keras. Because of the strong typing in TF.js, we do not need to convert\n * the data. Specifically:\n * 1) in PyKeras, `data` can be `DataFrame` instances from pandas, for\n * example. We don't need to worry about that here because there is no\n * widely popular javascript/typesdcript equivalent of pandas (so far).\n * If one becomes available in the future, we can add support.\n * 2) in PyKeras, inputs can be Python dict. But here we are stipulating\n * that the data is either a single `tf.Tensor` or an Array of `tf.Tensor`s. We\n * may add support for `Object` data inputs in the future when the need\n * arises.\n *\n * Instead, we perform basic checks for number of parameters and shapes.\n *\n * @param data: The input data.\n * @param names: Name for the inputs, from the model.\n * @param shapes: Expected shapes for the input data, from the model.\n * @param checkBatchAxis: Whether the size along the batch axis (i.e., the\n * first dimension) will be checked for matching.\n * @param exceptionPrefix: Execption prefix message, used in generating error\n * messages.\n * @throws ValueError: on incorrect number of inputs or mismatches in shapes.\n */\nfunction checkInputData(data, names, shapes, checkBatchAxis = true, exceptionPrefix = '') {\n let arrays;\n if (Array.isArray(data)) {\n if (data.length !== names.length) {\n throw new ValueError(`Error when checking model ${exceptionPrefix}: the Array of ` +\n `Tensors that you are passing to your model is not the size the ` +\n `the model expected. Expected to see ${names.length} Tensor(s),` +\n ` but instead got ${data.length} Tensors(s).`);\n }\n arrays = data;\n }\n else {\n if (names.length > 1) {\n throw new ValueError(`The model expects ${names.length} ${exceptionPrefix} Tensors, ` +\n `but only received one Tensor. Found: array with shape ` +\n `${JSON.stringify(data.shape)}.`);\n }\n arrays = [data];\n }\n if (shapes != null) {\n for (let i = 0; i < names.length; ++i) {\n if (shapes[i] == null) {\n continue;\n }\n const array = arrays[i];\n if (array.shape.length !== shapes[i].length) {\n throw new ValueError(`Error when checking ${exceptionPrefix}: expected ${names[i]} ` +\n `to have ${shapes[i].length} dimension(s), but got array with ` +\n `shape ${JSON.stringify(array.shape)}`);\n }\n for (let j = 0; j < shapes[i].length; ++j) {\n if (j === 0 && !checkBatchAxis) {\n continue;\n }\n const dim = array.shape[j];\n const refDim = shapes[i][j];\n if (refDim != null) {\n if (refDim !== dim) {\n throw new ValueError(`Error when checking ${exceptionPrefix}: expected ` +\n `${names[i]} to have shape ${JSON.stringify(shapes[i])} but ` +\n `got array with shape ${JSON.stringify(array.shape)}.`);\n }\n }\n }\n }\n }\n}\n/**\n * Maps metric functions to model outputs.\n * @param metrics An shortcut strings name, metric function, `Array` or dict\n * (`Object`) of metric functions.\n * @param outputNames An `Array` of the names of model outputs.\n * @returns An `Array` (one entry per model output) of `Array` of metric\n * functions. For instance, if the model has 2 outputs, and for the first\n * output we want to compute `binaryAccuracy` and `binaryCrossentropy`,\n * and just `binaryAccuracy` for the second output, the `Array` would look\n * like:\n * `[[binaryAccuracy, binaryCrossentropy], [binaryAccuracy]]`\n * @throws TypeError: incompatible metrics format.\n */\nexport function collectMetrics(metrics, outputNames) {\n if (metrics == null || Array.isArray(metrics) && metrics.length === 0) {\n return outputNames.map(name => []);\n }\n let wrappedMetrics;\n if (typeof metrics === 'string' || typeof metrics === 'function') {\n wrappedMetrics = [metrics];\n }\n else if (Array.isArray(metrics) || typeof metrics === 'object') {\n wrappedMetrics = metrics;\n }\n else {\n throw new TypeError('Type of metrics argument not understood. Expected an string,' +\n `function, Array, or Object, found: ${metrics}`);\n }\n if (Array.isArray(wrappedMetrics)) {\n // We then apply all metrics to all outputs.\n return outputNames.map(name => wrappedMetrics);\n }\n else {\n // In this case, metrics is a dict.\n const nestedMetrics = [];\n for (const name of outputNames) {\n let outputMetrics = wrappedMetrics.hasOwnProperty(name) ? wrappedMetrics[name] : [];\n if (!Array.isArray(outputMetrics)) {\n outputMetrics = [outputMetrics];\n }\n nestedMetrics.push(outputMetrics);\n }\n return nestedMetrics;\n }\n}\nconst LAYERS_MODEL_FORMAT_NAME = 'layers-model';\n/**\n * A `tf.LayersModel` is a directed, acyclic graph of `tf.Layer`s plus methods\n * for training, evaluation, prediction and saving.\n *\n * `tf.LayersModel` is the basic unit of training, inference and evaluation in\n * TensorFlow.js. To create a `tf.LayersModel`, use `tf.LayersModel`.\n *\n * See also:\n * `tf.Sequential`, `tf.loadLayersModel`.\n *\n * @doc {heading: 'Models', subheading: 'Classes'}\n */\nexport class LayersModel extends Container {\n constructor(args) {\n super(args);\n this.isTraining = false;\n }\n /**\n * Print a text summary of the model's layers.\n *\n * The summary includes\n * - Name and type of all layers that comprise the model.\n * - Output shape(s) of the layers\n * - Number of weight parameters of each layer\n * - If the model has non-sequential-like topology, the inputs each layer\n * receives\n * - The total number of trainable and non-trainable parameters of the model.\n *\n * ```js\n * const input1 = tf.input({shape: [10]});\n * const input2 = tf.input({shape: [20]});\n * const dense1 = tf.layers.dense({units: 4}).apply(input1);\n * const dense2 = tf.layers.dense({units: 8}).apply(input2);\n * const concat = tf.layers.concatenate().apply([dense1, dense2]);\n * const output =\n * tf.layers.dense({units: 3, activation: 'softmax'}).apply(concat);\n *\n * const model = tf.model({inputs: [input1, input2], outputs: output});\n * model.summary();\n * ```\n *\n * @param lineLength Custom line length, in number of characters.\n * @param positions Custom widths of each of the columns, as either\n * fractions of `lineLength` (e.g., `[0.5, 0.75, 1]`) or absolute number\n * of characters (e.g., `[30, 50, 65]`). Each number corresponds to\n * right-most (i.e., ending) position of a column.\n * @param printFn Custom print function. Can be used to replace the default\n * `console.log`. For example, you can use `x => {}` to mute the printed\n * messages in the console.\n *\n * @doc {heading: 'Models', subheading: 'Classes'}\n */\n summary(lineLength, positions, printFn = console.log) {\n if (!this.built) {\n throw new ValueError(`This model has never been called, thus its weights have not been ` +\n `created yet. So no summary can be displayed. Build the model ` +\n `first (e.g., by calling it on some test data).`);\n }\n printSummary(this, lineLength, positions, printFn);\n }\n /**\n * Configures and prepares the model for training and evaluation. Compiling\n * outfits the model with an optimizer, loss, and/or metrics. Calling `fit`\n * or `evaluate` on an un-compiled model will throw an error.\n *\n * @param args a `ModelCompileArgs` specifying the loss, optimizer, and\n * metrics to be used for fitting and evaluating this model.\n *\n * @doc {heading: 'Models', subheading: 'Classes'}\n */\n compile(args) {\n if (args.loss == null) {\n args.loss = [];\n }\n this.loss = args.loss;\n if (typeof args.optimizer === 'string') {\n this.optimizer_ = optimizers.getOptimizer(args.optimizer);\n this.isOptimizerOwned = true;\n }\n else {\n if (!(args.optimizer instanceof Optimizer)) {\n throw new ValueError(`User-defined optimizer must be an instance of tf.Optimizer.`);\n }\n this.optimizer_ = args.optimizer;\n this.isOptimizerOwned = false;\n }\n // TODO(cais): Add lossWeights.\n // TODO(cais): Add sampleWeightMode.\n // Prepare loss functions.\n let lossFunctions = [];\n if (!Array.isArray(args.loss) && typeof args.loss !== 'string' &&\n typeof args.loss !== 'function') {\n args.loss = args.loss;\n for (const name in args.loss) {\n if (this.outputNames.indexOf(name) === -1) {\n throw new ValueError(`Unknown entry in loss dictionary: \"${name}\". ` +\n `Only expected the following keys: ${this.outputNames}`);\n }\n }\n for (const name of this.outputNames) {\n if (args.loss[name] == null) {\n console.warn(`Output \"${name}\" is missing from loss dictionary. We assume ` +\n `this was done on purpose, and we will not be expecting data ` +\n `to be passed to ${name} during training`);\n }\n lossFunctions.push(losses.get(args.loss[name]));\n }\n }\n else if (Array.isArray(args.loss)) {\n if (args.loss.length !== this.outputs.length) {\n throw new ValueError(`When passing an Array as loss, it should have one entry per ` +\n `model output. The model has ${this.outputs.length} output(s), ` +\n `but you passed loss=${args.loss}.`);\n }\n const theLosses = args.loss;\n lossFunctions = theLosses.map(l => losses.get(l));\n }\n else {\n const lossFunction = losses.get(args.loss);\n this.outputs.forEach(_ => {\n lossFunctions.push(lossFunction);\n });\n }\n this.lossFunctions = lossFunctions;\n this.feedOutputNames = [];\n this.feedOutputShapes = [];\n this.feedLossFns = [];\n for (let i = 0; i < this.outputs.length; ++i) {\n // TODO(cais): Logic for skipping target(s).\n const shape = this.internalOutputShapes[i];\n const name = this.outputNames[i];\n this.feedOutputNames.push(name);\n this.feedOutputShapes.push(shape);\n this.feedLossFns.push(this.lossFunctions[i]);\n }\n // TODO(cais): Add logic for output masks.\n // TODO(cais): Add logic for sample weights.\n const skipTargetIndices = [];\n // Prepare metrics.\n this.metrics = args.metrics;\n // TODO(cais): Add weightedMetrics.\n this.metricsNames = ['loss'];\n this.metricsTensors = [];\n // Compute total loss.\n // Porting Note: In PyKeras, metrics_tensors are symbolic tensor objects.\n // Here, metricsTensors are TypeScript functions. This difference is due\n // to the difference in symbolic/imperative property of the backends.\n nameScope('loss', () => {\n for (let i = 0; i < this.outputs.length; ++i) {\n if (skipTargetIndices.indexOf(i) !== -1) {\n continue;\n }\n // TODO(cais): Add weightedLoss, sampleWeight and mask.\n // The following line should be weightedLoss\n const weightedLoss = this.lossFunctions[i];\n if (this.outputs.length > 1) {\n this.metricsTensors.push([weightedLoss, i]);\n this.metricsNames.push(this.outputNames[i] + '_loss');\n }\n }\n // Porting Note: Due to the imperative nature of the backend, we calculate\n // the regularizer penalties in the totalLossFunction, instead of here.\n });\n const nestedMetrics = collectMetrics(args.metrics, this.outputNames);\n // TODO(cais): Add nestedWeightedMetrics.\n /**\n * Helper function used in loop below.\n */\n const appendMetric = (outputIndex, metricName, metricTensor) => {\n if (this.outputNames.length > 1) {\n metricName = this.outputNames[outputIndex] + '_' + metricName;\n }\n this.metricsNames.push(metricName);\n this.metricsTensors.push([metricTensor, outputIndex]);\n };\n nameScope('metric', () => {\n for (let i = 0; i < this.outputs.length; ++i) {\n if (skipTargetIndices.indexOf(i) !== -1) {\n continue;\n }\n const outputMetrics = nestedMetrics[i];\n // TODO(cais): Add weights and outputWeightedMetrics.\n // TODO(cais): Add optional arg `weights` to the following function.\n const handleMetrics = (metrics) => {\n const metricNamePrefix = '';\n let metricName;\n let accFn;\n let weightedMetricFn;\n // TODO(cais): Use 'weights_' for weighted metrics.\n for (const metric of metrics) {\n if (typeof metric === 'string' &&\n ['accuracy', 'acc', 'crossentropy', 'ce'].indexOf(metric) !==\n -1) {\n const outputShape = this.internalOutputShapes[i];\n if (outputShape[outputShape.length - 1] === 1 ||\n this.lossFunctions[i] === losses.binaryCrossentropy) {\n // case: binary accuracy/crossentropy.\n if (['accuracy', 'acc'].indexOf(metric) !== -1) {\n accFn = Metrics.binaryAccuracy;\n }\n else if (['crossentropy', 'ce'].indexOf(metric) !== -1) {\n accFn = Metrics.binaryCrossentropy;\n }\n }\n else if (this.lossFunctions[i] ===\n losses.sparseCategoricalCrossentropy) {\n // case: categorical accuracy / crossentropy with sparse\n // targets.\n if (['accuracy', 'acc'].indexOf(metric) !== -1) {\n accFn = Metrics.sparseCategoricalAccuracy;\n }\n else if (['crossentropy', 'ce'].indexOf(metric) !== -1) {\n accFn = Metrics.sparseCategoricalCrossentropy;\n }\n }\n else {\n // case: categorical accuracy / crossentropy.\n if (['accuracy', 'acc'].indexOf(metric) !== -1) {\n accFn = Metrics.categoricalAccuracy;\n }\n else if (['crossentropy', 'ce'].indexOf(metric) !== -1) {\n accFn = Metrics.categoricalCrossentropy;\n }\n }\n let suffix;\n if (['accuracy', 'acc'].indexOf(metric) !== -1) {\n suffix = 'acc';\n }\n else if (['crossentropy', 'ce'].indexOf(metric) !== -1) {\n suffix = 'ce';\n }\n // TODO(cais): Add weighting actually.\n weightedMetricFn = accFn;\n metricName = metricNamePrefix + suffix;\n }\n else {\n const metricFn = Metrics.get(metric);\n // TODO(cais): Add weighting actually.\n weightedMetricFn = metricFn;\n metricName =\n metricNamePrefix + Metrics.getLossOrMetricName(metric);\n }\n // TODO(cais): Add weighting and masking to metricResult.\n let metricResult;\n nameScope(metricName, () => {\n metricResult = weightedMetricFn;\n });\n appendMetric(i, metricName, metricResult);\n }\n };\n handleMetrics(outputMetrics);\n // TODO(cais): Call handleMetrics with weights.\n }\n });\n // Porting Notes: Given the imperative backend of tfjs-core,\n // there is no need for constructing the symbolic graph and placeholders.\n this.collectedTrainableWeights = this.trainableWeights;\n }\n /**\n * Check trainable weights count consistency.\n *\n * This will raise a warning if `this.trainableWeights` and\n * `this.collectedTrainableWeights` are inconsistent (i.e., have different\n * numbers of parameters).\n * Inconsistency will typically arise when one modifies `model.trainable`\n * without calling `model.compile()` again.\n */\n checkTrainableWeightsConsistency() {\n if (this.collectedTrainableWeights == null) {\n return;\n }\n if (this.trainableWeights.length !==\n this.collectedTrainableWeights.length) {\n console.warn('Discrepancy between trainableweights and collected trainable ' +\n 'weights. Did you set `model.trainable` without calling ' +\n '`model.compile()` afterwards?');\n }\n }\n /**\n * Returns the loss value & metrics values for the model in test mode.\n *\n * Loss and metrics are specified during `compile()`, which needs to happen\n * before calls to `evaluate()`.\n *\n * Computation is done in batches.\n *\n * ```js\n * const model = tf.sequential({\n * layers: [tf.layers.dense({units: 1, inputShape: [10]})]\n * });\n * model.compile({optimizer: 'sgd', loss: 'meanSquaredError'});\n * const result = model.evaluate(\n * tf.ones([8, 10]), tf.ones([8, 1]), {batchSize: 4});\n * result.print();\n * ```\n *\n * @param x `tf.Tensor` of test data, or an `Array` of `tf.Tensor`s if the\n * model has multiple inputs.\n * @param y `tf.Tensor` of target data, or an `Array` of `tf.Tensor`s if the\n * model has multiple outputs.\n * @param args A `ModelEvaluateArgs`, containing optional fields.\n *\n * @return `Scalar` test loss (if the model has a single output and no\n * metrics) or `Array` of `Scalar`s (if the model has multiple outputs\n * and/or metrics). The attribute `model.metricsNames`\n * will give you the display labels for the scalar outputs.\n *\n * @doc {heading: 'Models', subheading: 'Classes'}\n */\n evaluate(x, y, args = {}) {\n const batchSize = args.batchSize == null ? 32 : args.batchSize;\n checkBatchSize(batchSize);\n // TODO(cais): Standardize `config.sampleWeights` as well.\n // Validate user data.\n const checkBatchAxis = true;\n const standardizedOuts = this.standardizeUserDataXY(x, y, checkBatchAxis, batchSize);\n try {\n // TODO(cais): If uses `useLearningPhase`, set the corresponding element\n // of the input to 0.\n const ins = standardizedOuts[0].concat(standardizedOuts[1]);\n this.makeTestFunction();\n const f = this.testFunction;\n const testOuts = this.testLoop(f, ins, batchSize, args.verbose, args.steps);\n return singletonOrArray(testOuts);\n }\n finally {\n disposeNewTensors(standardizedOuts[0], x);\n disposeNewTensors(standardizedOuts[1], y);\n }\n }\n // TODO(cais): Add code snippet below once real dataset objects are\n // available.\n /**\n * Evaluate model using a dataset object.\n *\n * Note: Unlike `evaluate()`, this method is asynchronous (`async`).\n *\n * @param dataset A dataset object. Its `iterator()` method is expected\n * to generate a dataset iterator object, the `next()` method of which\n * is expected to produce data batches for evaluation. The return value\n * of the `next()` call ought to contain a boolean `done` field and a\n * `value` field. The `value` field is expected to be an array of two\n * `tf.Tensor`s or an array of two nested `tf.Tensor` structures. The former\n * case is for models with exactly one input and one output (e.g.\n * a sequential model). The latter case is for models with multiple\n * inputs and/or multiple outputs. Of the two items in the array, the\n * first is the input feature(s) and the second is the output target(s).\n * @param args A configuration object for the dataset-based evaluation.\n * @returns Loss and metric values as an Array of `Scalar` objects.\n *\n * @doc {heading: 'Models', subheading: 'Classes'}\n */\n async evaluateDataset(dataset, args) {\n this.makeTestFunction();\n return evaluateDataset(this, dataset, args);\n }\n /**\n * Get number of samples provided for training, evaluation or prediction.\n *\n * @param ins Input `tf.Tensor`.\n * @param batchSize Integer batch size, optional.\n * @param steps Total number of steps (batches of samples) before\n * declaring loop finished. Optional.\n * @param stepsName The public API's parameter name for `steps`.\n * @returns Number of samples provided.\n */\n checkNumSamples(ins, batchSize, steps, stepsName = 'steps') {\n let numSamples;\n if (steps != null) {\n numSamples = null;\n if (batchSize != null) {\n throw new ValueError(`If ${stepsName} is set, batchSize must be null or undefined.` +\n `Got batchSize = ${batchSize}`);\n }\n }\n else if (ins != null) {\n if (Array.isArray(ins)) {\n numSamples = ins[0].shape[0];\n }\n else {\n numSamples = ins.shape[0];\n }\n }\n else {\n throw new ValueError(`Either the input data should have a defined shape, or ` +\n `${stepsName} shoud be specified.`);\n }\n return numSamples;\n }\n /**\n * Execute internal tensors of the model with input data feed.\n * @param inputs Input data feed. Must match the inputs of the model.\n * @param outputs Names of the output tensors to be fetched. Must match\n * names of the SymbolicTensors that belong to the graph.\n * @returns Fetched values for `outputs`.\n */\n execute(inputs, outputs) {\n if (Array.isArray(outputs) && outputs.length === 0) {\n throw new ValueError('`outputs` is an empty Array, which is not allowed.');\n }\n const outputsIsArray = Array.isArray(outputs);\n const outputNames = (outputsIsArray ? outputs : [outputs]);\n const outputSymbolicTensors = this.retrieveSymbolicTensors(outputNames);\n // Format the input into a FeedDict.\n const feedDict = new FeedDict();\n if (inputs instanceof Tensor) {\n inputs = [inputs];\n }\n if (Array.isArray(inputs)) {\n if (inputs.length !== this.inputs.length) {\n throw new ValueError(`The number of inputs provided (${inputs.length}) ` +\n `does not match the number of inputs of this model ` +\n `(${this.inputs.length}).`);\n }\n for (let i = 0; i < this.inputs.length; ++i) {\n feedDict.add(this.inputs[i], inputs[i]);\n }\n }\n else {\n for (const input of this.inputs) {\n const tensorValue = inputs[input.name];\n if (tensorValue == null) {\n throw new ValueError(`No value is provided for the model's input ${input.name}`);\n }\n feedDict.add(input, tensorValue);\n }\n }\n // Run execution.\n const executeOutputs = execute(outputSymbolicTensors, feedDict);\n return outputsIsArray ? executeOutputs : executeOutputs[0];\n }\n /**\n * Retrieve the model's internal symbolic tensors from symbolic-tensor names.\n */\n retrieveSymbolicTensors(symbolicTensorNames) {\n const outputSymbolicTensors = pyListRepeat(null, symbolicTensorNames.length);\n let outputsRemaining = symbolicTensorNames.length;\n for (const layer of this.layers) {\n const layerOutputs = Array.isArray(layer.output) ? layer.output : [layer.output];\n const layerOutputNames = layerOutputs.map(output => output.name);\n for (let i = 0; i < symbolicTensorNames.length; ++i) {\n const index = layerOutputNames.indexOf(symbolicTensorNames[i]);\n if (index !== -1) {\n outputSymbolicTensors[i] = layerOutputs[index];\n outputsRemaining--;\n }\n if (outputsRemaining === 0) {\n break;\n }\n }\n if (outputsRemaining === 0) {\n break;\n }\n }\n if (outputsRemaining > 0) {\n const remainingNames = [];\n outputSymbolicTensors.forEach((tensor, i) => {\n if (tensor == null) {\n remainingNames.push(symbolicTensorNames[i]);\n }\n });\n throw new ValueError(`Cannot find SymbolicTensors for output name(s): ` +\n `${JSON.stringify(remainingNames)}`);\n }\n return outputSymbolicTensors;\n }\n /**\n * Helper method to loop over some data in batches.\n *\n * Porting Note: Not using the functional approach in the Python equivalent\n * due to the imperative backend.\n * Porting Note: Does not support step mode currently.\n *\n * @param ins: input data\n * @param batchSize: integer batch size.\n * @param verbose: verbosity model\n * @returns: Predictions as `tf.Tensor` (if a single output) or an `Array` of\n * `tf.Tensor` (if multipe outputs).\n */\n predictLoop(ins, batchSize = 32, verbose = false) {\n return tfc.tidy(() => {\n const numSamples = this.checkNumSamples(ins);\n if (verbose) {\n throw new NotImplementedError('Verbose predictLoop() is not implemented yet.');\n }\n // Sample-based predictions.\n // Porting Note: Tensor currently does not support sliced assignments as\n // in numpy, e.g., x[1:3] = y. Therefore we use concatenation while\n // iterating over the batches.\n const batches = makeBatches(numSamples, batchSize);\n const outsBatches = this.outputs.map(output => []);\n // TODO(cais): Can the scope() be pushed down inside the for loop?\n for (let batchIndex = 0; batchIndex < batches.length; ++batchIndex) {\n const batchOuts = tfc.tidy(() => {\n const batchStart = batches[batchIndex][0];\n const batchEnd = batches[batchIndex][1];\n // TODO(cais): Take care of the case of the last element is a flag for\n // training/test.\n const insBatch = sliceArrays(ins, batchStart, batchEnd);\n // Construct the feeds for execute();\n const feeds = [];\n if (Array.isArray(insBatch)) {\n for (let i = 0; i < insBatch.length; ++i) {\n feeds.push({ key: this.inputs[i], value: insBatch[i] });\n }\n }\n else {\n feeds.push({ key: this.inputs[0], value: insBatch });\n }\n const feedDict = new FeedDict(feeds);\n return execute(this.outputs, feedDict);\n });\n batchOuts.forEach((batchOut, i) => outsBatches[i].push(batchOut));\n }\n return singletonOrArray(outsBatches.map(batches => tfc.concat(batches, 0)));\n });\n }\n /**\n * Generates output predictions for the input samples.\n *\n * Computation is done in batches.\n *\n * Note: the \"step\" mode of predict() is currently not supported.\n * This is because the TensorFlow.js core backend is imperative only.\n *\n * ```js\n * const model = tf.sequential({\n * layers: [tf.layers.dense({units: 1, inputShape: [10]})]\n * });\n * model.predict(tf.ones([8, 10]), {batchSize: 4}).print();\n * ```\n *\n * @param x The input data, as a Tensor, or an `Array` of `tf.Tensor`s if\n * the model has multiple inputs.\n * @param args A `ModelPredictArgs` object containing optional fields.\n *\n * @return Prediction results as a `tf.Tensor`(s).\n *\n * @exception ValueError In case of mismatch between the provided input data\n * and the model's expectations, or in case a stateful model receives a\n * number of samples that is not a multiple of the batch size.\n *\n * @doc {heading: 'Models', subheading: 'Classes'}\n */\n predict(x, args = {}) {\n const xsRank2OrHigher = ensureTensorsRank2OrHigher(x);\n checkInputData(xsRank2OrHigher, this.inputNames, this.feedInputShapes, false);\n try {\n // TODO(cais): Take care of stateful models.\n // if (this.stateful) ...\n // TODO(cais): Take care of the learning_phase boolean flag.\n // if (this.useLearningPhase) ...\n const batchSize = args.batchSize == null ? 32 : args.batchSize;\n checkBatchSize(batchSize);\n return this.predictLoop(xsRank2OrHigher, batchSize);\n }\n finally {\n disposeNewTensors(xsRank2OrHigher, x);\n }\n }\n /**\n * Returns predictions for a single batch of samples.\n *\n * ```js\n * const model = tf.sequential({\n * layers: [tf.layers.dense({units: 1, inputShape: [10]})]\n * });\n * model.predictOnBatch(tf.ones([8, 10])).print();\n * ```\n * @param x: Input samples, as a Tensor (for models with exactly one\n * input) or an array of Tensors (for models with more than one input).\n * @return Tensor(s) of predictions\n *\n * @doc {heading: 'Models', subheading: 'Classes'}\n */\n predictOnBatch(x) {\n checkInputData(x, this.inputNames, this.feedInputShapes, true);\n // TODO(cais): Take care of the learning_phase boolean flag.\n // if (this.useLearningPhase) ...\n const batchSize = (Array.isArray(x) ? x[0] : x).shape[0];\n return this.predictLoop(x, batchSize);\n }\n standardizeUserDataXY(x, y, checkBatchAxis = true, batchSize) {\n // TODO(cais): Add sampleWeight, classWeight\n if (this.optimizer_ == null) {\n throw new RuntimeError('You must compile a model before training/testing. Use ' +\n 'LayersModel.compile(modelCompileArgs).');\n }\n const outputShapes = [];\n for (let i = 0; i < this.feedOutputShapes.length; ++i) {\n const outputShape = this.feedOutputShapes[i];\n const lossFn = this.feedLossFns[i];\n if (lossFn === losses.sparseCategoricalCrossentropy) {\n outputShapes.push(outputShape.slice(0, outputShape.length - 1).concat([1]));\n }\n else {\n // Porting Note: Because of strong typing `lossFn` must be a function.\n outputShapes.push(outputShape);\n }\n }\n x = standardizeInputData(x, this.feedInputNames, this.feedInputShapes, false, 'input');\n y = standardizeInputData(y, this.feedOutputNames, outputShapes, false, 'target');\n // TODO(cais): Standardize sampleWeights & classWeights.\n checkArrayLengths(x, y, null);\n // TODO(cais): Check sampleWeights as well.\n checkLossAndTargetCompatibility(y, this.feedLossFns, this.feedOutputShapes);\n if (this.stateful && batchSize != null && batchSize > 0) {\n if (x[0].shape[0] % batchSize !== 0) {\n throw new ValueError(`In a stateful network, you should only pass inputs with a ` +\n `number of samples that is divisible by the batch size ` +\n `${batchSize}. Found: ${x[0].shape[0]} sample(s).`);\n }\n }\n return [x, y];\n }\n async standardizeUserData(x, y, sampleWeight, classWeight, checkBatchAxis = true, batchSize) {\n const [standardXs, standardYs] = this.standardizeUserDataXY(x, y, checkBatchAxis, batchSize);\n // TODO(cais): Handle sampleWeights.\n if (sampleWeight != null) {\n throw new Error('sample weight is not supported yet.');\n }\n let standardSampleWeights = null;\n if (classWeight != null) {\n const classWeights = standardizeClassWeights(classWeight, this.outputNames);\n standardSampleWeights = [];\n for (let i = 0; i < classWeights.length; ++i) {\n standardSampleWeights.push(await standardizeWeights(standardYs[i], null, classWeights[i]));\n }\n }\n // TODO(cais): Deal with the case of model.stateful == true.\n return [standardXs, standardYs, standardSampleWeights];\n }\n /**\n * Loop over some test data in batches.\n * @param f A Function returning a list of tensors.\n * @param ins Array of tensors to be fed to `f`.\n * @param batchSize Integer batch size or `null` / `undefined`.\n * @param verbose verbosity mode.\n * @param steps Total number of steps (batches of samples) before\n * declaring test finished. Ignored with the default value of `null` /\n * `undefined`.\n * @returns Array of Scalars.\n */\n testLoop(f, ins, batchSize, verbose = 0, steps) {\n return tfc.tidy(() => {\n const numSamples = this.checkNumSamples(ins, batchSize, steps, 'steps');\n const outs = [];\n if (verbose > 0) {\n throw new NotImplementedError('Verbose mode is not implemented yet.');\n }\n // TODO(cais): Use `indicesForConversionToDense' to prevent slow down.\n if (steps != null) {\n throw new NotImplementedError('steps mode in testLoop() is not implemented yet');\n }\n else {\n const batches = makeBatches(numSamples, batchSize);\n const indexArray = tensor1d(range(0, numSamples));\n for (let batchIndex = 0; batchIndex < batches.length; ++batchIndex) {\n const batchStart = batches[batchIndex][0];\n const batchEnd = batches[batchIndex][1];\n const batchIds = K.sliceAlongFirstAxis(indexArray, batchStart, batchEnd - batchStart);\n // TODO(cais): In ins, train flag can be a number, instead of an\n // Tensor? Do we need to handle this in tfjs-layers?\n const insBatch = sliceArraysByIndices(ins, batchIds);\n const batchOuts = f(insBatch);\n if (batchIndex === 0) {\n for (let i = 0; i < batchOuts.length; ++i) {\n outs.push(scalar(0));\n }\n }\n for (let i = 0; i < batchOuts.length; ++i) {\n const batchOut = batchOuts[i];\n outs[i] =\n tfc.add(outs[i], tfc.mul(batchEnd - batchStart, batchOut));\n }\n }\n for (let i = 0; i < outs.length; ++i) {\n outs[i] = tfc.div(outs[i], numSamples);\n }\n }\n return outs;\n });\n }\n getDedupedMetricsNames() {\n const outLabels = this.metricsNames;\n // Rename duplicated metrics names (can happen with an output layer\n // shared among multiple dataflows).\n const dedupedOutLabels = [];\n for (let i = 0; i < outLabels.length; ++i) {\n const label = outLabels[i];\n let newLabel = label;\n if (count(outLabels, label) > 1) {\n const dupIndex = count(outLabels.slice(0, i), label);\n newLabel += `_${dupIndex}`;\n }\n dedupedOutLabels.push(newLabel);\n }\n return dedupedOutLabels;\n }\n /**\n * Creates a function that performs the following actions:\n *\n * 1. computes the losses\n * 2. sums them to get the total loss\n * 3. call the optimizer computes the gradients of the LayersModel's\n * trainable weights w.r.t. the total loss and update the variables\n * 4. calculates the metrics\n * 5. returns the values of the losses and metrics.\n */\n makeTrainFunction() {\n return (data) => {\n const lossValues = [];\n const inputs = data.slice(0, this.inputs.length);\n const targets = data.slice(this.inputs.length, this.inputs.length + this.outputs.length);\n const sampleWeights = data.slice(this.inputs.length + this.outputs.length, this.inputs.length + this.outputs.length * 2);\n const metricsValues = [];\n // Create a function that computes the total loss based on the\n // inputs. This function is used for obtaining gradients through\n // backprop.\n const totalLossFunction = () => {\n const feeds = [];\n for (let i = 0; i < this.inputs.length; ++i) {\n feeds.push({ key: this.inputs[i], value: inputs[i] });\n }\n const feedDict = new FeedDict(feeds);\n const outputs = execute(this.outputs, feedDict, { 'training': true });\n // TODO(cais): Take care of the case of multiple outputs from a\n // single layer?\n let totalLoss;\n for (let i = 0; i < this.lossFunctions.length; ++i) {\n const lossFunction = this.lossFunctions[i];\n let loss = lossFunction(targets[i], outputs[i]);\n if (sampleWeights[i] != null) {\n loss = computeWeightedLoss(loss, sampleWeights[i]);\n }\n // TODO(cais): push Scalar instead.\n const meanLoss = tfc.mean(loss);\n // TODO(cais): Use a scope() instead, to avoid ownership.\n lossValues.push(meanLoss);\n if (i === 0) {\n totalLoss = loss;\n }\n else {\n totalLoss = tfc.add(totalLoss, loss);\n }\n }\n // Compute the metrics.\n // TODO(cais): These should probably be calculated outside\n // totalLossFunction to benefit speed?\n for (let i = 0; i < this.metricsTensors.length; ++i) {\n let weightedMetric;\n if (this.outputs.length > 1 && i < this.outputs.length) {\n weightedMetric = lossValues[i];\n }\n else {\n const metric = this.metricsTensors[i][0];\n const outputIndex = this.metricsTensors[i][1];\n weightedMetric =\n tfc.mean(metric(targets[outputIndex], outputs[outputIndex]));\n }\n tfc.keep(weightedMetric);\n // TODO(cais): Use a scope() instead, to avoid ownership.\n metricsValues.push(weightedMetric);\n }\n totalLoss = tfc.mean(totalLoss);\n // Add regularizer penalties.\n this.calculateLosses().forEach(regularizerLoss => {\n totalLoss = tfc.add(totalLoss, regularizerLoss);\n });\n return totalLoss;\n };\n const variables = this.collectedTrainableWeights.map(param => param.read());\n const returnCost = true;\n const totalLossValue = this.optimizer_.minimize(totalLossFunction, returnCost, variables);\n return [totalLossValue].concat(metricsValues);\n };\n }\n /**\n * Create a function which, when invoked with an array of `tf.Tensor`s as a\n * batch of inputs, returns the prespecified loss and metrics of the model\n * under the batch of input data.\n */\n makeTestFunction() {\n this.testFunction = (data) => {\n return tfc.tidy(() => {\n const valOutputs = [];\n let totalLoss;\n const inputs = data.slice(0, this.inputs.length);\n const targets = data.slice(this.inputs.length, this.inputs.length + this.outputs.length);\n const feeds = [];\n for (let i = 0; i < this.inputs.length; ++i) {\n feeds.push({ key: this.inputs[i], value: inputs[i] });\n }\n const feedDict = new FeedDict(feeds);\n const outputs = execute(this.outputs, feedDict);\n // Compute total loss.\n for (let i = 0; i < this.lossFunctions.length; ++i) {\n const lossFunction = this.lossFunctions[i];\n // TODO(cais): Add sample weighting and replace the simple\n // averaging.\n const loss = tfc.mean(lossFunction(targets[i], outputs[i]));\n if (i === 0) {\n totalLoss = loss;\n }\n else {\n totalLoss = tfc.add(totalLoss, loss);\n }\n valOutputs.push(totalLoss);\n }\n // Compute the metrics.\n for (let i = 0; i < this.metricsTensors.length; ++i) {\n const metric = this.metricsTensors[i][0];\n const outputIndex = this.metricsTensors[i][1];\n // TODO(cais): Replace K.mean() with a proper weighting function.\n const meanMetric = tfc.mean(metric(targets[outputIndex], outputs[outputIndex]));\n valOutputs.push(meanMetric);\n }\n return valOutputs;\n });\n };\n }\n /**\n * Trains the model for a fixed number of epochs (iterations on a\n * dataset).\n *\n * ```js\n * const model = tf.sequential({\n * layers: [tf.layers.dense({units: 1, inputShape: [10]})]\n * });\n * model.compile({optimizer: 'sgd', loss: 'meanSquaredError'});\n * for (let i = 1; i < 5 ; ++i) {\n * const h = await model.fit(tf.ones([8, 10]), tf.ones([8, 1]), {\n * batchSize: 4,\n * epochs: 3\n * });\n * console.log(\"Loss after Epoch \" + i + \" : \" + h.history.loss[0]);\n * }\n * ```\n *\n * @param x `tf.Tensor` of training data, or an array of `tf.Tensor`s if the\n * model has multiple inputs. If all inputs in the model are named, you\n * can also pass a dictionary mapping input names to `tf.Tensor`s.\n * @param y `tf.Tensor` of target (label) data, or an array of `tf.Tensor`s if\n * the model has multiple outputs. If all outputs in the model are named,\n * you can also pass a dictionary mapping output names to `tf.Tensor`s.\n * @param args A `ModelFitArgs`, containing optional fields.\n *\n * @return A `History` instance. Its `history` attribute contains all\n * information collected during training.\n *\n * @exception ValueError In case of mismatch between the provided input\n * data and what the model expects.\n *\n * @doc {heading: 'Models', subheading: 'Classes'}\n */\n async fit(x, y, args = {}) {\n return fitTensors(this, x, y, args);\n }\n // TODO(cais): Add code snippet below when it's possible to instantiate\n // actual dataset objects.\n /**\n * Trains the model using a dataset object.\n *\n * @param dataset A dataset object. Its `iterator()` method is expected\n * to generate a dataset iterator object, the `next()` method of which\n * is expected to produce data batches for training. The return value\n * of the `next()` call ought to contain a boolean `done` field and a\n * `value` field. The `value` field is expected to be an array of two\n * `tf.Tensor`s or an array of two nested `tf.Tensor` structures. The former\n * case is for models with exactly one input and one output (e.g.\n * a sequential model). The latter case is for models with multiple\n * inputs and/or multiple outputs.\n * Of the two items in the array, the first is the input feature(s) and\n * the second is the output target(s).\n * @param args A `ModelFitDatasetArgs`, containing optional fields.\n *\n * @return A `History` instance. Its `history` attribute contains all\n * information collected during training.\n *\n * @doc {heading: 'Models', subheading: 'Classes'}\n */\n async fitDataset(dataset, args) {\n return fitDataset(this, dataset, args);\n }\n /**\n * Runs a single gradient update on a single batch of data.\n *\n * This method differs from `fit()` and `fitDataset()` in the following\n * regards:\n * - It operates on exactly one batch of data.\n * - It returns only the loss and metric values, instead of\n * returning the batch-by-batch loss and metric values.\n * - It doesn't support fine-grained options such as verbosity and\n * callbacks.\n *\n * @param x Input data. It could be one of the following:\n * - A `tf.Tensor`, or an Array of `tf.Tensor`s (in case the model has\n * multiple inputs).\n * - An Object mapping input names to corresponding `tf.Tensor` (if the\n * model has named inputs).\n * @param y Target data. It could be either a `tf.Tensor` or multiple\n * `tf.Tensor`s. It should be consistent with `x`.\n * @returns Training loss or losses (in case the model has\n * multiple outputs), along with metrics (if any), as numbers.\n *\n * @doc {heading: 'Models', subheading: 'Classes'}\n */\n async trainOnBatch(x, y) {\n // TODO(cais): Support sampleWeight and classWeight.\n // TODO(cais): Support Dataset objects.\n const standardizeOut = await this.standardizeUserData(x, y);\n const inputs = standardizeOut[0];\n const targets = standardizeOut[1];\n const trainFunction = this.makeTrainFunction();\n const losses = trainFunction(inputs.concat(targets));\n const lossValues = [];\n for (const loss of losses) {\n const v = await loss.data();\n lossValues.push(v[0]);\n }\n tfc.dispose(losses);\n disposeNewTensors(standardizeOut[0], x);\n disposeNewTensors(standardizeOut[1], y);\n return singletonOrArray(lossValues);\n }\n /**\n * Extract weight values of the model.\n *\n * @param config: An instance of `io.SaveConfig`, which specifies\n * model-saving options such as whether only trainable weights are to be\n * saved.\n * @returns A `NamedTensorMap` mapping original weight names (i.e.,\n * non-uniqueified weight names) to their values.\n */\n getNamedWeights(config) {\n const namedWeights = [];\n const trainableOnly = config != null && config.trainableOnly;\n const weights = trainableOnly ? this.trainableWeights : this.weights;\n const weightValues = this.getWeights(trainableOnly);\n for (let i = 0; i < weights.length; ++i) {\n if (trainableOnly && !weights[i].trainable) {\n // Optionally skip non-trainable weights.\n continue;\n }\n namedWeights.push({ name: weights[i].originalName, tensor: weightValues[i] });\n }\n return namedWeights;\n }\n /**\n * Setter used for force stopping of LayersModel.fit() (i.e., training).\n *\n * Example:\n *\n * ```js\n * const input = tf.input({shape: [10]});\n * const output = tf.layers.dense({units: 1}).apply(input);\n * const model = tf.model({inputs: [input], outputs: [output]});\n * model.compile({loss: 'meanSquaredError', optimizer: 'sgd'});\n * const xs = tf.ones([8, 10]);\n * const ys = tf.zeros([8, 1]);\n *\n * const history = await model.fit(xs, ys, {\n * epochs: 10,\n * callbacks: {\n * onEpochEnd: async (epoch, logs) => {\n * if (epoch === 2) {\n * model.stopTraining = true;\n * }\n * }\n * }\n * });\n *\n * // There should be only 3 values in the loss array, instead of 10\n * values,\n * // due to the stopping after 3 epochs.\n * console.log(history.history.loss);\n * ```\n */\n set stopTraining(stop) {\n this.stopTraining_ = stop;\n }\n get stopTraining() {\n return this.stopTraining_;\n }\n get optimizer() {\n return this.optimizer_;\n }\n set optimizer(optimizer) {\n if (this.optimizer_ !== optimizer) {\n this.optimizer_ = optimizer;\n this.isOptimizerOwned = false;\n }\n }\n dispose() {\n const result = super.dispose();\n if (result.refCountAfterDispose === 0 && this.optimizer != null &&\n this.isOptimizerOwned) {\n const numTensorsBeforeOptmizerDisposal = tfc.memory().numTensors;\n this.optimizer_.dispose();\n result.numDisposedVariables +=\n numTensorsBeforeOptmizerDisposal - tfc.memory().numTensors;\n }\n return result;\n }\n getLossIdentifiers() {\n let lossNames;\n if (typeof this.loss === 'string') {\n lossNames = toSnakeCase(this.loss);\n }\n else if (Array.isArray(this.loss)) {\n for (const loss of this.loss) {\n if (typeof loss !== 'string') {\n throw new Error('Serialization of non-string loss is not supported.');\n }\n }\n lossNames = this.loss.map(name => toSnakeCase(name));\n }\n else {\n const outputNames = Object.keys(this.loss);\n lossNames = {};\n const losses = this.loss;\n for (const outputName of outputNames) {\n if (typeof losses[outputName] === 'string') {\n lossNames[outputName] =\n toSnakeCase(losses[outputName]);\n }\n else {\n throw new Error('Serialization of non-string loss is not supported.');\n }\n }\n }\n return lossNames;\n }\n getMetricIdentifiers() {\n if (typeof this.metrics === 'string' ||\n typeof this.metrics === 'function') {\n return [toSnakeCase(Metrics.getLossOrMetricName(this.metrics))];\n }\n else if (Array.isArray(this.metrics)) {\n return this.metrics.map(metric => toSnakeCase(Metrics.getLossOrMetricName(metric)));\n }\n else {\n const metricsIdentifiers = {};\n for (const key in this.metrics) {\n metricsIdentifiers[key] =\n toSnakeCase(Metrics.getLossOrMetricName(this.metrics[key]));\n }\n return metricsIdentifiers;\n }\n }\n getTrainingConfig() {\n return {\n loss: this.getLossIdentifiers(),\n metrics: this.getMetricIdentifiers(),\n optimizer_config: {\n class_name: this.optimizer.getClassName(),\n config: this.optimizer.getConfig()\n }\n };\n // TODO(cais): Add weight_metrics when they are supported.\n // TODO(cais): Add sample_weight_mode when it's supported.\n // TODO(cais): Add loss_weights when it's supported.\n }\n loadTrainingConfig(trainingConfig) {\n if (trainingConfig.weighted_metrics != null) {\n throw new Error('Loading weight_metrics is not supported yet.');\n }\n if (trainingConfig.loss_weights != null) {\n throw new Error('Loading loss_weights is not supported yet.');\n }\n if (trainingConfig.sample_weight_mode != null) {\n throw new Error('Loading sample_weight_mode is not supported yet.');\n }\n const tsConfig = convertPythonicToTs(trainingConfig.optimizer_config);\n const optimizer = deserialize(tsConfig);\n let loss;\n if (typeof trainingConfig.loss === 'string') {\n loss = toCamelCase(trainingConfig.loss);\n }\n else if (Array.isArray(trainingConfig.loss)) {\n loss = trainingConfig.loss.map(lossEntry => toCamelCase(lossEntry));\n }\n else if (trainingConfig.loss != null) {\n loss = {};\n for (const key in trainingConfig.loss) {\n loss[key] = toCamelCase(trainingConfig.loss[key]);\n }\n }\n let metrics;\n if (Array.isArray(trainingConfig.metrics)) {\n metrics = trainingConfig.metrics.map(metric => toCamelCase(metric));\n }\n else if (trainingConfig.metrics != null) {\n metrics = {};\n for (const key in trainingConfig.metrics) {\n metrics[key] = toCamelCase(trainingConfig.metrics[key]);\n }\n }\n this.compile({ loss, metrics, optimizer });\n }\n /**\n * Save the configuration and/or weights of the LayersModel.\n *\n * An `IOHandler` is an object that has a `save` method of the proper\n * signature defined. The `save` method manages the storing or\n * transmission of serialized data (\"artifacts\") that represent the\n * model's topology and weights onto or via a specific medium, such as\n * file downloads, local storage, IndexedDB in the web browser and HTTP\n * requests to a server. TensorFlow.js provides `IOHandler`\n * implementations for a number of frequently used saving mediums, such as\n * `tf.io.browserDownloads` and `tf.io.browserLocalStorage`. See `tf.io`\n * for more details.\n *\n * This method also allows you to refer to certain types of `IOHandler`s\n * as URL-like string shortcuts, such as 'localstorage://' and\n * 'indexeddb://'.\n *\n * Example 1: Save `model`'s topology and weights to browser [local\n * storage](https://developer.mozilla.org/en-US/docs/Web/API/Window/localStorage);\n * then load it back.\n *\n * ```js\n * const model = tf.sequential(\n * {layers: [tf.layers.dense({units: 1, inputShape: [3]})]});\n * console.log('Prediction from original model:');\n * model.predict(tf.ones([1, 3])).print();\n *\n * const saveResults = await model.save('localstorage://my-model-1');\n *\n * const loadedModel = await tf.loadLayersModel('localstorage://my-model-1');\n * console.log('Prediction from loaded model:');\n * loadedModel.predict(tf.ones([1, 3])).print();\n * ```\n *\n * Example 2. Saving `model`'s topology and weights to browser\n * [IndexedDB](https://developer.mozilla.org/en-US/docs/Web/API/IndexedDB_API);\n * then load it back.\n *\n * ```js\n * const model = tf.sequential(\n * {layers: [tf.layers.dense({units: 1, inputShape: [3]})]});\n * console.log('Prediction from original model:');\n * model.predict(tf.ones([1, 3])).print();\n *\n * const saveResults = await model.save('indexeddb://my-model-1');\n *\n * const loadedModel = await tf.loadLayersModel('indexeddb://my-model-1');\n * console.log('Prediction from loaded model:');\n * loadedModel.predict(tf.ones([1, 3])).print();\n * ```\n *\n * Example 3. Saving `model`'s topology and weights as two files\n * (`my-model-1.json` and `my-model-1.weights.bin`) downloaded from\n * browser.\n *\n * ```js\n * const model = tf.sequential(\n * {layers: [tf.layers.dense({units: 1, inputShape: [3]})]});\n * const saveResults = await model.save('downloads://my-model-1');\n * ```\n *\n * Example 4. Send `model`'s topology and weights to an HTTP server.\n * See the documentation of `tf.io.http` for more details\n * including specifying request parameters and implementation of the\n * server.\n *\n * ```js\n * const model = tf.sequential(\n * {layers: [tf.layers.dense({units: 1, inputShape: [3]})]});\n * const saveResults = await model.save('http://my-server/model/upload');\n * ```\n *\n * @param handlerOrURL An instance of `IOHandler` or a URL-like,\n * scheme-based string shortcut for `IOHandler`.\n * @param config Options for saving the model.\n * @returns A `Promise` of `SaveResult`, which summarizes the result of\n * the saving, such as byte sizes of the saved artifacts for the model's\n * topology and weight values.\n *\n * @doc {heading: 'Models', subheading: 'Classes', ignoreCI: true}\n */\n async save(handlerOrURL, config) {\n if (typeof handlerOrURL === 'string') {\n const handlers = io.getSaveHandlers(handlerOrURL);\n if (handlers.length === 0) {\n throw new ValueError(`Cannot find any save handlers for URL '${handlerOrURL}'`);\n }\n else if (handlers.length > 1) {\n throw new ValueError(`Found more than one (${handlers.length}) save handlers for ` +\n `URL '${handlerOrURL}'`);\n }\n handlerOrURL = handlers[0];\n }\n if (handlerOrURL.save == null) {\n throw new ValueError('LayersModel.save() cannot proceed because the IOHandler ' +\n 'provided does not have the `save` attribute defined.');\n }\n const weightDataAndSpecs = await io.encodeWeights(this.getNamedWeights(config));\n const returnString = false;\n const unusedArg = null;\n const modelConfig = this.toJSON(unusedArg, returnString);\n const modelArtifacts = {\n modelTopology: modelConfig,\n format: LAYERS_MODEL_FORMAT_NAME,\n generatedBy: `TensorFlow.js tfjs-layers v${version}`,\n convertedBy: null,\n };\n const includeOptimizer = config == null ? false : config.includeOptimizer;\n if (includeOptimizer && this.optimizer != null) {\n modelArtifacts.trainingConfig = this.getTrainingConfig();\n const weightType = 'optimizer';\n const { data: optimizerWeightData, specs: optimizerWeightSpecs } = await io.encodeWeights(await this.optimizer.getWeights(), weightType);\n weightDataAndSpecs.specs.push(...optimizerWeightSpecs);\n weightDataAndSpecs.data = io.concatenateArrayBuffers([weightDataAndSpecs.data, optimizerWeightData]);\n }\n if (this.userDefinedMetadata != null) {\n // Check serialized size of user-defined metadata.\n const checkSize = true;\n checkUserDefinedMetadata(this.userDefinedMetadata, this.name, checkSize);\n modelArtifacts.userDefinedMetadata = this.userDefinedMetadata;\n }\n modelArtifacts.weightData = weightDataAndSpecs.data;\n modelArtifacts.weightSpecs = weightDataAndSpecs.specs;\n return handlerOrURL.save(modelArtifacts);\n }\n /**\n * Set user-defined metadata.\n *\n * The set metadata will be serialized together with the topology\n * and weights of the model during `save()` calls.\n *\n * @param setUserDefinedMetadata\n */\n setUserDefinedMetadata(userDefinedMetadata) {\n checkUserDefinedMetadata(userDefinedMetadata, this.name);\n this.userDefinedMetadata = userDefinedMetadata;\n }\n /**\n * Get user-defined metadata.\n *\n * The metadata is supplied via one of the two routes:\n * 1. By calling `setUserDefinedMetadata()`.\n * 2. Loaded during model loading (if the model is constructed\n * via `tf.loadLayersModel()`.)\n *\n * If no user-defined metadata is available from either of the\n * two routes, this function will return `undefined`.\n */\n getUserDefinedMetadata() {\n return this.userDefinedMetadata;\n }\n}\n// The class name is 'Model' rather than 'LayersModel' for backwards\n// compatibility since this class name shows up in the serialization format.\n/** @nocollapse */\nLayersModel.className = 'Model';\nserialization.registerClass(LayersModel);\n/**\n * A `tf.Functional` is an alias to `tf.LayersModel`.\n *\n * See also:\n * `tf.LayersModel`, `tf.Sequential`, `tf.loadLayersModel`.\n */\n/** @doc {heading: 'Models', subheading: 'Classes'} */\nexport class Functional extends LayersModel {\n}\nFunctional.className = 'Functional';\nserialization.registerClass(Functional);\n//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidHJhaW5pbmcuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi8uLi90ZmpzLWxheWVycy9zcmMvZW5naW5lL3RyYWluaW5nLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBOzs7Ozs7OztHQVFHO0FBRUgseUNBQXlDO0FBRXpDLE9BQU8sS0FBSyxHQUFHLE1BQU0sdUJBQXVCLENBQUM7QUFDN0MsT0FBTyxFQUFDLEVBQUUsRUFBMEQsU0FBUyxFQUFVLE1BQU0sRUFBRSxhQUFhLEVBQUUsTUFBTSxFQUFZLFFBQVEsRUFBRSxJQUFJLEVBQUMsTUFBTSx1QkFBdUIsQ0FBQztBQUU3SyxPQUFPLEtBQUssQ0FBQyxNQUFNLHlCQUF5QixDQUFDO0FBRTdDLE9BQU8sRUFBQyxTQUFTLEVBQUMsTUFBTSxXQUFXLENBQUM7QUFDcEMsT0FBTyxFQUFDLG1CQUFtQixFQUFFLFlBQVksRUFBRSxVQUFVLEVBQUMsTUFBTSxXQUFXLENBQUM7QUFLeEUsT0FBTyxFQUFDLFdBQVcsRUFBQyxNQUFNLHlCQUF5QixDQUFDO0FBQ3BELE9BQU8sS0FBSyxNQUFNLE1BQU0sV0FBVyxDQUFDO0FBQ3BDLE9BQU8sS0FBSyxPQUFPLE1BQU0sWUFBWSxDQUFDO0FBQ3RDLE9BQU8sS0FBSyxVQUFVLE1BQU0sZUFBZSxDQUFDO0FBRTVDLE9BQU8sRUFBQyx3QkFBd0IsRUFBQyxNQUFNLDBCQUEwQixDQUFDO0FBQ2xFLE9BQU8sRUFBQyxLQUFLLEVBQUUsWUFBWSxFQUFFLGdCQUFnQixFQUFFLFdBQVcsRUFBRSxXQUFXLEVBQUUsTUFBTSxFQUFDLE1BQU0sd0JBQXdCLENBQUM7QUFDL0csT0FBTyxFQUFDLFlBQVksRUFBQyxNQUFNLHNCQUFzQixDQUFDO0FBQ2xELE9BQU8sRUFBQyxLQUFLLEVBQUMsTUFBTSxxQkFBcUIsQ0FBQztBQUMxQyxPQUFPLEVBQUMsbUJBQW1CLEVBQUMsTUFBTSw4QkFBOEIsQ0FBQztBQUVqRSxPQUFPLEVBQUMsT0FBTyxFQUFD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bUIsR0FBRyxJQUFJLENBQUMsbUJBQW1CLENBQUM7U0FDL0Q7UUFFRCxjQUFjLENBQUMsVUFBVSxHQUFHLGtCQUFrQixDQUFDLElBQUksQ0FBQztRQUNwRCxjQUFjLENBQUMsV0FBVyxHQUFHLGtCQUFrQixDQUFDLEtBQUssQ0FBQztRQUN0RCxPQUFPLFlBQVksQ0FBQyxJQUFJLENBQUMsY0FBYyxDQUFDLENBQUM7SUFDM0MsQ0FBQztJQUVEOzs7Ozs7O09BT0c7SUFDSCxzQkFBc0IsQ0FBQyxtQkFBdUI7UUFDNUMsd0JBQXdCLENBQUMsbUJBQW1CLEVBQUUsSUFBSSxDQUFDLElBQUksQ0FBQyxDQUFDO1FBQ3pELElBQUksQ0FBQyxtQkFBbUIsR0FBRyxtQkFBbUIsQ0FBQztJQUNqRCxDQUFDO0lBRUQ7Ozs7Ozs7Ozs7T0FVRztJQUNILHNCQUFzQjtRQUNwQixPQUFPLElBQUksQ0FBQyxtQkFBbUIsQ0FBQztJQUNsQyxDQUFDOztBQTc0Q0Qsb0VBQW9FO0FBQ3BFLDRFQUE0RTtBQUM1RSxrQkFBa0I7QUFDWCxxQkFBUyxHQUFHLE9BQU8sQ0FBQztBQTQ0QzdCLGFBQWEsQ0FBQyxhQUFhLENBQUMsV0FBVyxDQUFDLENBQUM7QUFFekM7Ozs7O0dBS0c7QUFDSCxzREFBc0Q7QUFDdEQsTUFBTSxPQUFPLFVBQVcsU0FBUSxXQUFXOztBQUNsQyxvQkFBUyxHQUFHLFlBQVksQ0FBQztBQUVsQyxhQUFhLENBQUMsYUFBYSxDQUFDLFVBQVUsQ0FBQyxDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiLyoqXG4gKiBAbGljZW5zZVxuICogQ29weXJpZ2h0IDIwMTggR29vZ2xlIExMQ1xuICpcbiAqIFVzZSBvZiB0aGlzIHNvdXJjZSBjb2RlIGlzIGdvdmVybmVkIGJ5IGFuIE1JVC1zdHlsZVxuICogbGljZW5zZSB0aGF0IGNhbiBiZSBmb3VuZCBpbiB0aGUgTElDRU5TRSBmaWxlIG9yIGF0XG4gKiBodHRwczovL29wZW5zb3VyY2Uub3JnL2xpY2Vuc2VzL01JVC5cbiAqID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4gKi9cblxuLyogT3JpZ2luYWwgU291cmNlOiBlbmdpbmUvdHJhaW5pbmcucHkgKi9cblxuaW1wb3J0ICogYXMgdGZjIGZyb20gJ0B0ZW5zb3JmbG93L3RmanMtY29yZSc7XG5pbXBvcnQge2lvLCBNb2RlbFByZWRpY3RDb25maWcgYXMgTW9kZWxQcmVkaWN0QXJncywgTmFtZWRUZW5zb3JNYXAsIE9wdGltaXplciwgU2NhbGFyLCBzY2FsYXIsIHNlcmlhbGl6YXRpb24sIFRlbnNvciwgVGVuc29yMUQsIHRlbnNvcjFkLCB1dGlsfSBmcm9tICdAdGVuc29yZmxvdy90ZmpzLWNvcmUnO1xuXG5pbXBvcnQgKiBhcyBLIGZyb20gJy4uL2JhY2tlbmQvdGZqc19iYWNrZW5kJztcbmltcG9ydCB7SGlzdG9yeSwgTW9kZWxMb2dnaW5nVmVyYm9zaXR5fSBmcm9tICcuLi9iYXNlX2NhbGxiYWNrcyc7XG5pbXBvcnQge25hbWVTY29wZX0gZnJvbSAnLi4vY29tbW9uJztcbmltcG9ydCB7Tm90SW1wbGVtZW50ZWRFcnJvciwgUnVudGltZUVycm9yLCBWYWx1ZUVycm9yfSBmcm9tICcuLi9lcnJvcnMnO1xuaW1wb3J0IHtTaGFwZX0gZnJvbSAnLi4va2VyYXNfZm9ybWF0L2NvbW1vbic7XG5pbXBvcnQge0xvc3NJZGVudGlmaWVyfSBmcm9tICcuLi9rZXJhc19mb3JtYXQvbG9zc19jb25maWcnO1xuaW1wb3J0IHtPcHRpbWl6ZXJTZXJpYWxpemF0aW9ufSBmcm9tICcuLi9rZXJhc19mb3JtYXQvb3B0aW1pemVyX2NvbmZpZyc7XG5pbXBvcnQge01ldHJpY3NJZGVudGlmaWVyLCBUcmFpbmluZ0NvbmZpZ30gZnJvbSAnLi4va2VyYXNfZm9ybWF0L3RyYWluaW5nX2NvbmZpZyc7XG5pbXBvcnQge2Rlc2VyaWFsaXplfSBmcm9tICcuLi9sYXllcnMvc2VyaWFsaXphdGlvbic7XG5pbXBvcnQgKiBhcyBsb3NzZXMgZnJvbSAnLi4vbG9zc2VzJztcbmltcG9ydCAqIGFzIE1ldHJpY3MgZnJvbSAnLi4vbWV0cmljcyc7XG5pbXBvcnQgKiBhcyBvcHRpbWl6ZXJzIGZyb20gJy4uL29wdGltaXplcnMnO1xuaW1wb3J0IHtMb3NzT3JNZXRyaWNGbiwgTmFtZWRUZW5zb3J9IGZyb20gJy4uL3R5cGVzJztcbmltcG9ydCB7Y2hlY2tVc2VyRGVmaW5lZE1ldGFkYXRhfSBmcm9tICcuLi91c2VyX2RlZmluZWRfbWV0YWRhdGEnO1xuaW1wb3J0IHtjb3VudCwgcHlMaXN0UmVwZWF0LCBzaW5nbGV0b25PckFycmF5LCB0b0NhbWVsQ2FzZSwgdG9TbmFrZUNhc2UsIHVuaXF1ZX0gZnJvbSAnLi4vdXRpbHMvZ2VuZXJpY191dGlscyc7XG5pbXBvcnQge3ByaW50U3VtbWFyeX0gZnJvbSAnLi4vdXRpbHMvbGF5ZXJfdXRpbHMnO1xuaW1wb3J0IHtyYW5nZX0gZnJvbSAnLi4vdXRpbHMvbWF0aF91dGlscyc7XG5pbXBvcnQge2NvbnZlcnRQeXRob25pY1RvVHN9IGZyb20gJy4uL3V0aWxzL3NlcmlhbGl6YXRpb25fdXRpbHMnO1xuaW1wb3J0IHtMYXllclZhcmlhYmxlfSBmcm9tICcuLi92YXJpYWJsZXMnO1xuaW1wb3J0IHt2ZXJzaW9ufSBmcm9tICcuLi92ZXJzaW9uJztcblxuaW1wb3J0IHtDb250YWluZXIsIENvbnRhaW5lckFyZ3N9IGZyb20gJy4vY29udGFpbmVyJztcbmltcG9ydCB7RGF0YXNldH0gZnJvbSAnLi9kYXRhc2V0X3N0dWInO1xuaW1wb3J0IHtleGVjdXRlLCBGZWVkRGljdH0gZnJvbSAnLi9leGVjdXRvcic7XG5pbXBvcnQge0Rpc3Bvc2VSZXN1bHQsIFN5bWJvbGljVGVuc29yfSBmcm9tICcuL3RvcG9sb2d5JztcbmltcG9ydCB7ZXZhbHVhdGVEYXRhc2V0LCBmaXREYXRhc2V0LCBNb2RlbEV2YWx1YXRlRGF0YXNldEFyZ3MsIE1vZGVsRml0RGF0YXNldEFyZ3N9IGZyb20gJy4vdHJhaW5pbmdfZGF0YXNldCc7XG5pbXBvcnQge2NoZWNrQmF0Y2hTaXplLCBkaXNwb3NlTmV3VGVuc29ycywgZW5zdXJlVGVuc29yc1JhbmsyT3JIaWdoZXIsIGZpdFRlbnNvcnMsIG1ha2VCYXRjaGVzLCBNb2RlbEZpdEFyZ3MsIHNsaWNlQXJyYXlzLCBzbGljZUFycmF5c0J5SW5kaWNlc30gZnJvbSAnLi90cmFpbmluZ190ZW5zb3JzJztcbmltcG9ydCB7Q2xhc3NXZWlnaHQsIENsYXNzV2VpZ2h0TWFwLCBjb21wdXRlV2VpZ2h0ZWRMb3NzLCBzdGFuZGFyZGl6ZUNsYXNzV2VpZ2h0cywgc3RhbmRhcmRpemVXZWlnaHRzfSBmcm9tICcuL3RyYWluaW5nX3V0aWxzJztcblxuLyoqXG4gKiBIZWxwZXIgZnVuY3Rpb24gZm9yIHBvbHltb3JwaGljIGlucHV0IGRhdGE6IDEuIHNpbmdsZXRvbiBUZW5zb3IuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBpc0RhdGFUZW5zb3IoeDogVGVuc29yfFRlbnNvcltdfHtbaW5wdXROYW1lOiBzdHJpbmddOiBUZW5zb3J9fFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7W2lucHV0TmFtZTogc3RyaW5nXTogVGVuc29yW119KTogYm9vbGVhbiB7XG4gIHJldHVybiB4IGluc3RhbmNlb2YgVGVuc29yO1xufVxuXG4vKipcbiAqIEhlbHBlciBmdW5jdGlvbiBmb3IgcG9seW1vcnBoaWMgaW5wdXQgZGF0YTogMi4gQXJyYXkgb2YgVGVuc29yLlxuICovXG5leHBvcnQgZnVuY3Rpb24gaXNEYXRhQXJyYXkoeDogVGVuc29yfFRlbnNvcltdfFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHtbaW5wdXROYW1lOiBzdHJpbmddOiBUZW5zb3J9KTogYm9vbGVhbiB7XG4gIHJldHVybiBBcnJheS5pc0FycmF5KHgpO1xufVxuXG4vKipcbiAqIEhlbHBlciBmdW5jdGlvbiBmb3IgcG9seW1vcnBoaWMgaW5wdXQgZGF0YTogMy4gXCJkaWN0XCIgb2YgVGVuc29yLlxuICovXG5leHBvcnQgZnVuY3Rpb24gaXNEYXRhRGljdCh4OiBUZW5zb3J8VGVuc29yW118XG4gICAgICAgICAgICAgICAgICAgICAgICAgICB7W2lucHV0TmFtZTogc3RyaW5nXTogVGVuc29yfSk6IGJvb2xlYW4ge1xuICByZXR1cm4gIWlzRGF0YVRlbnNvcih4KSAmJiAhaXNEYXRhQXJyYXkoeCk7XG59XG5cbi8qKlxuICogTm9ybWFsaXplcyBpbnB1dHMgYW5kIHRhcmdldHMgcHJvdmlkZWQgYnkgdXNlcnMuXG4gKiBAcGFyYW0gZGF0YSBVc2VyLXByb3ZpZGVkIGlucHV0IGRhdGEgKHBvbHltb3JwaGljKS5cbiAqIEBwYXJhbSBuYW1lcyBBbiBBcnJheSBvZiBleHBlY3RlZCBUZW5zb3IgbmFtZXMuXG4gKiBAcGFyYW0gc2hhcGVzIE9wdGlvbmFsIEFycmF5IG9mIGV4cGVjdGVkIFRlbnNvciBzaGFwZXMuXG4gKiBAcGFyYW0gY2hlY2tCYXRjaEF4aXMgV2hldGhlciB0byBjaGVjayB0aGF0IHRoZSBiYXRjaCBheGlzIG9mIHRoZSBhcnJheXNcbiAqICAgbWF0Y2ggIHRoZSBleHBlY3RlZCB2YWx1ZSBmb3VuZCBpbiBgc2hhcGVzYC5cbiAqIEBwYXJhbSBleGNlcHRpb25QcmVmaXggU3RyaW5nIHByZWZpeCB1c2VkIGZvciBleGNlcHRpb24gZm9ybWF0dGluZy5cbiAqIEByZXR1cm5zIExpc3Qgb2Ygc3RhbmRhcmRpemVkIGlucHV0IFRlbnNvcnMgKG9uZSBUZW5zb3IgcGVyIG1vZGVsIGlucHV0KS5cbiAqIEB0aHJvd3MgVmFsdWVFcnJvcjogaW4gY2FzZSBvZiBpbXByb3Blcmx5IGZvcm1hdHRlZCB1c2VyIGRhdGEuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBzdGFuZGFyZGl6ZUlucHV0RGF0YShcbiAgICBkYXRhOiBUZW5zb3J8VGVuc29yW118e1tpbnB1dE5hbWU6IHN0cmluZ106IFRlbnNvcn0sIG5hbWVzOiBzdHJpbmdbXSxcbiAgICBzaGFwZXM/OiBTaGFwZVtdLCBjaGVja0JhdGNoQXhpcyA9IHRydWUsIGV4Y2VwdGlvblByZWZpeCA9ICcnKTogVGVuc29yW10ge1xuICBpZiAobmFtZXMgPT0gbnVsbCB8fCBuYW1lcy5sZW5ndGggPT09IDApIHtcbiAgICAvLyBDaGVjayBmb3IgdGhlIGNhc2Ugd2hlcmUgdGhlIG1vZGVsIGV4cGVjdGVkIG5vIGRhdGEsIGJ1dCBzb21lIGRhdGEgZ290XG4gICAgLy8gc2VudC5cbiAgICBpZiAoZGF0YSAhPSBudWxsKSB7XG4gICAgICBsZXQgZ290VW5leHBlY3RlZERhdGEgPSBmYWxzZTtcbiAgICAgIGlmIChpc0RhdGFBcnJheShkYXRhKSAmJiAoZGF0YSBhcyBUZW5zb3JbXSkubGVuZ3RoID4gMCkge1xuICAgICAgICBnb3RVbmV4cGVjdGVkRGF0YSA9IHRydWU7XG4gICAgICB9IGVsc2UgaWYgKGlzRGF0YURpY3QoZGF0YSkpIHtcbiAgICAgICAgZm9yIChjb25zdCBrZXkgaW4gZGF0YSkge1xuICAgICAgICAgIGlmIChkYXRhLmhhc093blByb3BlcnR5KGtleSkpIHtcbiAgICAgICAgICAgIGdvdFVuZXhwZWN0ZWREYXRhID0gdHJ1ZTtcbiAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgfSBlbHNlIHtcbiAgICAgICAgLy8gYGRhdGFgIGlzIGEgc2luZ2xldG9uIFRlbnNvciBpbiB0aGlzIGNhc2UuXG4gICAgICAgIGdvdFVuZXhwZWN0ZWREYXRhID0gdHJ1ZTtcbiAgICAgIH1cbiAgICAgIGlmIChnb3RVbmV4cGVjdGVkRGF0YSkge1xuICAgICAgICB0aHJvdyBuZXcgVmFsdWVFcnJvcihcbiAgICAgICAgICAgIGBFcnJvciB3aGVuIGNoZWNraW5nIG1vZGVsICR7ZXhjZXB0aW9uUHJlZml4fSBleHBlY3RlZCBubyBkYXRhLCBgICtcbiAgICAgICAgICAgIGBidXQgZ290ICR7ZGF0YX1gKTtcbiAgICAgIH1cbiAgICB9XG4gICAgcmV0dXJuIFtdO1xuICB9XG4gIGlmIChkYXRhID09IG51bGwpIHtcbiAgICByZXR1cm4gbmFtZXMubWFwKG5hbWUgPT4gbnVsbCk7XG4gIH1cblxuICBsZXQgYXJyYXlzOiBUZW5zb3JbXTtcbiAgaWYgKGlzRGF0YURpY3QoZGF0YSkpIHtcbiAgICBkYXRhID0gZGF0YSBhcyB7W2lucHV0TmFtZTogc3RyaW5nXTogVGVuc29yfTtcbiAgICBhcnJheXMgPSBbXTtcbiAgICBmb3IgKGNvbnN0IG5hbWUgb2YgbmFtZXMpIHtcbiAgICAgIGlmIChkYXRhW25hbWVdID09IG51bGwpIHtcbiAgICAgICAgdGhyb3cgbmV3IFZhbHVlRXJyb3IoXG4gICAgICAgICAgICBgTm8gZGF0YSBwcm92aWRlZCBmb3IgXCIke25hbWV9XCIuIE5lZWQgZGF0YSBmb3IgZWFjaCBrZXkgaW46IGAgK1xuICAgICAgICAgICAgYCR7bmFtZXN9YCk7XG4gICAgICB9XG4gICAgICBhcnJheXMucHVzaChkYXRhW25hbWVdKTtcbiAgICB9XG4gIH0gZWxzZSBpZiAoaXNEYXRhQXJyYXkoZGF0YSkpIHtcbiAgICBkYXRhID0gZGF0YSBhcyBUZW5zb3JbXTtcbiAgICBpZiAoZGF0YS5sZW5ndGggIT09IG5hbWVzLmxlbmd0aCkge1xuICAgICAgdGhyb3cgbmV3IFZhbHVlRXJyb3IoXG4gICAgICAgICAgYEVycm9yIHdoZW4gY2hlY2tpbmcgbW9kZWwgJHtleGNlcHRpb25QcmVmaXh9OiB0aGUgQXJyYXkgb2YgYCArXG4gICAgICAgICAgYFRlbnNvcnMgdGhhdCB5b3UgYXJlIHBhc3NpbmcgdG8geW91ciBtb2RlbCBpcyBub3QgdGhlIHNpemUgdGhlIGAgK1xuICAgICAgICAgIGBtb2RlbCBleHBlY3RlZC4gRXhwZWN0ZWQgdG8gc2VlICR7bmFtZXMubGVuZ3RofSBUZW5zb3IocyksIGJ1dCBgICtcbiAgICAgICAgICBgaW5zdGVhZCBnb3QgdGhlIGZvbGxvd2luZyBsaXN0IG9mIFRlbnNvcihzKTogJHtkYXRhfWApO1xuICAgIH1cbiAgICBhcnJheXMgPSBkYXRhO1xuICB9IGVsc2Uge1xuICAgIGRhdGEgPSBkYXRhIGFzIFRlbnNvcjtcbiAgICBpZiAobmFtZXMubGVuZ3RoID4gMSkge1xuICAgICAgdGhyb3cgbmV3IFZhbHVlRXJyb3IoXG4gICAgICAgICAgYFRoZSBtb2RlbCAke2V4Y2VwdGlvblByZWZpeH0gZXhwZWN0cyAke25hbWVzLmxlbmd0aH0gVGVuc29yKHMpLCBgICtcbiAgICAgICAgICBgYnV0IG9ubHkgcmVjZWl2ZWQgb25lIFRlbnNvci4gRm91bmQ6IFRlbnNvciB3aXRoIHNoYXBlICR7XG4gICAgICAgICAgICAgIGRhdGEuc2hhcGV9YCk7XG4gICAgfVxuICAgIGFycmF5cyA9IFtkYXRhXTtcbiAgfVxuXG4gIGFycmF5cyA9IGVuc3VyZVRlbnNvcnNSYW5rMk9ySGlnaGVyKGFycmF5cyk7XG5cbiAgLy8gQ2hlY2sgc2hhcGUgY29tcGF0aWJpbGl0eS5cbiAgaWYgKHNoYXBlcyAhPSBudWxsKSB7XG4gICAgZm9yIChsZXQgaSA9IDA7IGkgPCBuYW1lcy5sZW5ndGg7ICsraSkge1xuICAgICAgaWYgKHNoYXBlc1tpXSA9PSBudWxsKSB7XG4gICAgICAgIGNvbnRpbnVlO1xuICAgICAgfVxuICAgICAgY29uc3QgYXJyYXkgPSBhcnJheXNbaV07XG4gICAgICBpZiAoYXJyYXkuc2hhcGUubGVuZ3RoICE9PSBzaGFwZXNbaV0ubGVuZ3RoKSB7XG4gICAgICAgIHRocm93IG5ldyBWYWx1ZUVycm9yKFxuICAgICAgICAgICAgYEVycm9yIHdoZW4gY2hlY2tpbmcgJHtleGNlcHRpb25QcmVmaXh9OiBleHBlY3RlZCAke25hbWVzW2ldfSBgICtcbiAgICAgICAgICAgIGB0byBoYXZlICR7c2hhcGVzW2ldLmxlbmd0aH0gZGltZW5zaW9uKHMpLiBidXQgZ290IGFycmF5IHdpdGggYCArXG4gICAgICAgICAgICBgc2hhcGUgJHthcnJheS5zaGFwZX1gKTtcbiAgICAgIH1cbiAgICAgIGZvciAobGV0IGogPSAwOyBqIDwgc2hhcGVzW2ldLmxlbmd0aDsgKytqKSB7XG4gICAgICAgIGlmIChqID09PSAwICYmICFjaGVja0JhdGNoQXhpcykge1xuICAgICAgICAgIC8vIFNraXAgdGhlIGZpcnN0IChiYXRjaCkgYXhpcy5cbiAgICAgICAgICBjb250aW51ZTtcbiAgICAgICAgfVxuICAgICAgICBjb25zdCBkaW0gPSBhcnJheS5zaGFwZVtqXTtcbiAgICAgICAgY29uc3QgcmVmRGltID0gc2hhcGVzW2ldW2pdO1xuICAgICAgICBpZiAocmVmRGltICE9IG51bGwgJiYgcmVmRGltID49IDAgJiYgZGltICE9PSByZWZEaW0pIHtcbiAgICAgICAgICB0aHJvdyBuZXcgVmFsdWVFcnJvcihcbiAgICAgICAgICAgICAgYCR7ZXhjZXB0aW9uUHJlZml4fSBleHBlY3RlZCBhIGJhdGNoIG9mIGVsZW1lbnRzIHdoZXJlIGVhY2ggYCArXG4gICAgICAgICAgICAgIGBleGFtcGxlIGhhcyBzaGFwZSBbJHtzaGFwZXNbaV0uc2xpY2UoMSwgc2hhcGVzW2ldLmxlbmd0aCl9XSBgICtcbiAgICAgICAgICAgICAgYChpLmUuLHRlbnNvciBzaGFwZSBbKiwke1xuICAgICAgICAgICAgICAgICAgc2hhcGVzW2ldLnNsaWNlKDEsIHNoYXBlc1tpXS5sZW5ndGgpfV0pYCArXG4gICAgICAgICAgICAgIGAgYnV0IHRoZSAke2V4Y2VwdGlvblByZWZpeH0gcmVjZWl2ZWQgYW4gaW5wdXQgd2l0aCAke1xuICAgICAgICAgICAgICAgICAgYXJyYXkuc2hhcGVbMF19YCArXG4gICAgICAgICAgICAgIGAgZXhhbXBsZXMsIGVhY2ggd2l0aCBzaGFwZSBbJHtcbiAgICAgICAgICAgICAgICAgIGFycmF5LnNoYXBlLnNsaWNlKDEsIGFycmF5LnNoYXBlLmxlbmd0aCl9XWAgK1xuICAgICAgICAgICAgICBgICh0ZW5zb3Igc2hhcGUgWyR7YXJyYXkuc2hhcGV9XSlgKTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH1cbiAgfVxuICByZXR1cm4gYXJyYXlzO1xufVxuXG4vKipcbiAqIFVzZXIgaW5wdXQgdmFsaWRhdGlvbiBmb3IgVGVuc29ycy5cbiAqIEBwYXJhbSBpbnB1dHMgYEFycmF5YCBvZiBgdGYuVGVuc29yYHMgZm9yIGlucHV0cy5cbiAqIEBwYXJhbSB0YXJnZXRzIGBBcnJheWAgb2YgYHRmLlRlbnNvcmBzIGZvciB0YXJnZXRzLlxuICogQHBhcmFtIHdlaWdodHMgT3B0aW9uYWwgYEFycmF5YCBvZiBgdGYuVGVuc29yYHMgZm9yIHNhbXBsZSB3ZWlnaHRzLlxuICogQHRocm93cyBWYWx1ZUVycm9yOiBpbiBjYXNlIG9mIGluY29ycmVjdGx5IGZvcm1hdHRlZCBkYXRhLlxuICovXG5leHBvcnQgZnVuY3Rpb24gY2hlY2tBcnJheUxlbmd0aHMoXG4gICAgaW5wdXRzOiBUZW5zb3JbXSwgdGFyZ2V0czogVGVuc29yW10sIHdlaWdodHM/OiBUZW5zb3JbXSkge1xuICBjb25zdCBzZXRYID0gdW5pcXVlKGlucHV0cy5tYXAoaW5wdXQgPT4gaW5wdXQuc2hhcGVbMF0pKTtcbiAgc2V0WC5zb3J0KCk7XG4gIGNvbnN0IHNldFkgPSB1bmlxdWUodGFyZ2V0cy5tYXAodGFyZ2V0ID0+IHRhcmdldC5zaGFwZVswXSkpO1xuICBzZXRZLnNvcnQoKTtcbiAgLy8gVE9ETyhjYWlzKTogQ2hlY2sgYHdlaWdodHNgIGFzIHdlbGwuXG4gIGlmIChzZXRYLmxlbmd0aCA+IDEpIHtcbiAgICB0aHJvdyBuZXcgVmFsdWVFcnJvcihcbiAgICAgICAgYEFsbCBpbnB1dCBUZW5zb3JzICh4KSBzaG91bGQgaGF2ZSB0aGUgc2FtZSBudW1iZXIgb2Ygc2FtcGxlcy4gYCArXG4gICAgICAgIGBHb3QgYXJyYXkgc2hhcGVzOiBgICtcbiAgICAgICAgYCR7SlNPTi5zdHJpbmdpZnkoaW5wdXRzLm1hcChpbnB1dCA9PiBpbnB1dC5zaGFwZSkpfWApO1xuICB9XG4gIGlmIChzZXRZLmxlbmd0aCA+IDEpIHtcbiAgICB0aHJvdyBuZXcgVmFsdWVFcnJvcihcbiAgICAgICAgYEFsbCB0YXJnZXQgVGVuc29ycyAoeSkgc2hvdWxkIGhhdmUgdGhlIHNhbWUgbnVtYmVyIG9mIHNhbXBsZXMuIGAgK1xuICAgICAgICBgR290IGFycmF5IHNoYXBlczogYCArXG4gICAgICAgIGAke0pTT04uc3RyaW5naWZ5KHRhcmdldHMubWFwKHRhcmdldCA9PiB0YXJnZXQuc2hhcGUpKX1gKTtcbiAgfVxuICBpZiAoc2V0WC5sZW5ndGggPiAwICYmIHNldFkubGVuZ3RoID4gMCAmJiAhdXRpbC5hcnJheXNFcXVhbChzZXRYLCBzZXRZKSkge1xuICAgIHRocm93IG5ldyBWYWx1ZUVycm9yKFxuICAgICAgICBgSW5wdXQgVGVuc29ycyBzaG91bGQgaGF2ZSB0aGUgc2FtZSBudW1iZXIgb2Ygc2FtcGxlcyBhcyB0YXJnZXQgYCArXG4gICAgICAgIGBUZW5zb3JzLiBGb3VuZCAke3NldFhbMF19IGlucHV0IHNhbXBsZShzKSBhbmQgJHtzZXRZWzBdfSB0YXJnZXQgYCArXG4gICAgICAgIGBzYW1wbGUocykuYCk7XG4gIH1cbn1cblxuLyoqXG4gKiBWYWxpZGF0aW9uIG9uIHRoZSBjb21wYXRpYmlsaXR5IG9mIHRhcmdlcyBhbmQgbG9zcyBmdW5jdGlvbnMuXG4gKlxuICogVGhpcyBoZWxwcyBwcmV2ZW50IHVzZXJzIGZyb20gdXNpbmcgbG9zcyBmdW5jdGlvbnMgaW5jb3JyZWN0bHkuXG4gKlxuICogQHBhcmFtIHRhcmdldHMgYEFycmF5YCBvZiBgdGYuVGVuc29yYHMgb2YgdGFyZ2V0cy5cbiAqIEBwYXJhbSBsb3NzRm5zIGBBcnJheWAgb2YgbG9zcyBmdW5jdGlvbnMuXG4gKiBAcGFyYW0gb3V0cHV0U2hhcGVzIGBBcnJheWAgb2Ygc2hhcGVzIG9mIG1vZGVsIG91dHB1dHMuXG4gKi9cbmZ1bmN0aW9uIGNoZWNrTG9zc0FuZFRhcmdldENvbXBhdGliaWxpdHkoXG4gICAgdGFyZ2V0czogVGVuc29yW10sIGxvc3NGbnM6IExvc3NPck1ldHJpY0ZuW10sIG91dHB1dFNoYXBlczogU2hhcGVbXSkge1xuICAvLyBUT0RPKGNhaXMpOiBEZWRpY2F0ZWQgdGVzdCBjb3ZlcmFnZT9cbiAgY29uc3Qga2V5TG9zc2VzID0gW1xuICAgIGxvc3Nlcy5tZWFuU3F1YXJlZEVycm9yLCBsb3NzZXMuYmluYXJ5Q3Jvc3NlbnRyb3B5LFxuICAgIGxvc3Nlcy5jYXRlZ29yaWNhbENyb3NzZW50cm9weVxuICBdO1xuICBmb3IgKGxldCBpID0gMDsgaSA8IHRhcmdldHMubGVuZ3RoOyArK2kpIHtcbiAgICBjb25zdCB5ID0gdGFyZ2V0c1tpXTtcbiAgICBjb25zdCBsb3NzID0gbG9zc0Zuc1tpXTtcbiAgICBjb25zdCBzaGFwZSA9IG91dHB1dFNoYXBlc1tpXTtcbiAgICBpZiAobG9zcyA9PSBudWxsKSB7XG4gICAgICBjb250aW51ZTtcbiAgICB9XG4gICAgaWYgKGxvc3MgPT09IGxvc3Nlcy5jYXRlZ29yaWNhbENyb3NzZW50cm9weSkge1xuICAgICAgaWYgKHkuc2hhcGVbeS5zaGFwZS5sZW5ndGggLSAxXSA9PT0gMSkge1xuICAgICAgICB0aHJvdyBuZXcgVmFsdWVFcnJvcihcbiAgICAgICAgICAgIGBZb3UgYXJlIHBhc3NpbmcgYSB0YXJnZXQgYXJyYXkgb2Ygc2hhcGUgJHt5LnNoYXBlfSB3aGlsZSB1c2luZyBgICtcbiAgICAgICAgICAgIGBhIGxvc3MgJ2NhdGVnb3JpY2FsX2Nyb3NzZW50cm9weScuICdjYXRlZ29yaWNhbF9jcm9zc2VudHJvcHknYCArXG4gICAgICAgICAgICBgZXhwZWN0cyB0YXJnZXRzIHRvIGJlIGJpbmFyeSBtYXRyaWNlcyAoMXMgYW5kIDBzKSBvZiBzaGFwZSBgICtcbiAgICAgICAgICAgIGBbc2FtcGxlcywgY2xhc3Nlc10uYCk7XG4gICAgICAgIC8vIFRPRE8oY2Fpcyk6IEV4YW1wbGUgY29kZSBpbiBlcnJvciBtZXNzYWdlLlxuICAgICAgfVxuICAgIH1cbiAgICBpZiAoa2V5TG9zc2VzLmluZGV4T2YobG9zcykgIT09IC0xKSB7XG4gICAgICBjb25zdCBzbGljZWRZU2hhcGUgPSB5LnNoYXBlLnNsaWNlKDEpO1xuICAgICAgY29uc3Qgc2xpY2VkU2hhcGUgPSBzaGFwZS5zbGljZSgxKTtcbiAgICAgIGZvciAobGV0IGogPSAwOyBqIDwgc2xpY2VkWVNoYXBlLmxlbmd0aDsgKytqKSB7XG4gICAgICAgIGNvbnN0IHRhcmdldERpbSA9IHNsaWNlZFlTaGFwZVtqXTtcbiAgICAgICAgY29uc3Qgb3V0RGltID0gc2xpY2VkU2hhcGVbal07XG4gICAgICAgIGlmIChvdXREaW0gIT0gbnVsbCAmJiB0YXJnZXREaW0gIT09IG91dERpbSkge1xuICAgICAgICAgIHRocm93IG5ldyBWYWx1ZUVycm9yKFxuICAgICAgICAgICAgICBgQSB0YXJnZXQgVGVuc29yIHdpdGggc2hhcGUgJHt5LnNoYXBlfSB3YXMgcGFzc2VkIGZvciBhbiBgICtcbiAgICAgICAgICAgICAgYG91dHB1dCBvZiBzaGFwZSAke3NoYXBlfSwgd2hpbGUgdXNpbmcgYSBsb3NzIGZ1bmN0aW9uIHRoYXQgYCArXG4gICAgICAgICAgICAgIGBleHBlY3RzIHRhcmdldHMgdG8gaGF2ZSB0aGUgc2FtZSBzaGFwZSBhcyB0aGUgb3V0cHV0LmApO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfVxuICB9XG59XG5cbi8qKlxuICogQ2hlY2sgaW5wdXRzIHByb3ZpZGVkIGJ5IHRoZSB1c2VyLlxuICpcbiAqIFBvcnRpbmcgTm90ZTogVGhpcyBjb3JyZXNwb25kcyB0byBfc3RhbmRhcmRpemVfaW5wdXRfZGF0YSgpIGluIFB5dGhvblxuICogICBLZXJhcy4gQmVjYXVzZSBvZiB0aGUgc3Ryb25nIHR5cGluZyBpbiBURi5qcywgd2UgZG8gbm90IG5lZWQgdG8gY29udmVydFxuICogICB0aGUgZGF0YS4gU3BlY2lmaWNhbGx5OlxuICogICAxKSBpbiBQeUtlcmFzLCBgZGF0YWAgY2FuIGJlIGBEYXRhRnJhbWVgIGluc3RhbmNlcyBmcm9tIHBhbmRhcywgZm9yXG4gKiAgICAgIGV4YW1wbGUuIFdlIGRvbid0IG5lZWQgdG8gd29ycnkgYWJvdXQgdGhhdCBoZXJlIGJlY2F1c2UgdGhlcmUgaXMgbm9cbiAqICAgICAgd2lkZWx5IHBvcHVsYXIgamF2YXNjcmlwdC90eXBlc2RjcmlwdCBlcXVpdmFsZW50IG9mIHBhbmRhcyAoc28gZmFyKS5cbiAqICAgICAgSWYgb25lIGJlY29tZXMgYXZhaWxhYmxlIGluIHRoZSBmdXR1cmUsIHdlIGNhbiBhZGQgc3VwcG9ydC5cbiAqICAgMikgaW4gUHlLZXJhcywgaW5wdXRzIGNhbiBiZSBQeXRob24gZGljdC4gQnV0IGhlcmUgd2UgYXJlIHN0aXB1bGF0aW5nXG4gKiB0aGF0IHRoZSBkYXRhIGlzIGVpdGhlciBhIHNpbmdsZSBgdGYuVGVuc29yYCBvciBhbiBBcnJheSBvZiBgdGYuVGVuc29yYHMuIFdlXG4gKiBtYXkgYWRkIHN1cHBvcnQgZm9yIGBPYmplY3RgIGRhdGEgaW5wdXRzIGluIHRoZSBmdXR1cmUgd2hlbiB0aGUgbmVlZFxuICogYXJpc2VzLlxuICpcbiAqIEluc3RlYWQsIHdlIHBlcmZvcm0gYmFzaWMgY2hlY2tzIGZvciBudW1iZXIgb2YgcGFyYW1ldGVycyBhbmQgc2hhcGVzLlxuICpcbiAqIEBwYXJhbSBkYXRhOiBUaGUgaW5wdXQgZGF0YS5cbiAqIEBwYXJhbSBuYW1lczogTmFtZSBmb3IgdGhlIGlucHV0cywgZnJvbSB0aGUgbW9kZWwuXG4gKiBAcGFyYW0gc2hhcGVzOiBFeHBlY3RlZCBzaGFwZXMgZm9yIHRoZSBpbnB1dCBkYXRhLCBmcm9tIHRoZSBtb2RlbC5cbiAqIEBwYXJhbSBjaGVja0JhdGNoQXhpczogV2hldGhlciB0aGUgc2l6ZSBhbG9uZyB0aGUgYmF0Y2ggYXhpcyAoaS5lLiwgdGhlXG4gKiAgIGZpcnN0IGRpbWVuc2lvbikgd2lsbCBiZSBjaGVja2VkIGZvciBtYXRjaGluZy5cbiAqIEBwYXJhbSBleGNlcHRpb25QcmVmaXg6IEV4ZWNwdGlvbiBwcmVmaXggbWVzc2FnZSwgdXNlZCBpbiBnZW5lcmF0aW5nIGVycm9yXG4gKiAgIG1lc3NhZ2VzLlxuICogQHRocm93cyBWYWx1ZUVycm9yOiBvbiBpbmNvcnJlY3QgbnVtYmVyIG9mIGlucHV0cyBvciBtaXNtYXRjaGVzIGluIHNoYXBlcy5cbiAqL1xuZnVuY3Rpb24gY2hlY2tJbnB1dERhdGEoXG4gICAgZGF0YTogVGVuc29yfFRlbnNvcltdLCBuYW1lczogc3RyaW5nW10sIHNoYXBlcz86IFNoYXBlW10sXG4gICAgY2hlY2tCYXRjaEF4aXMgPSB0cnVlLCBleGNlcHRpb25QcmVmaXggPSAnJykge1xuICBsZXQgYXJyYXlzOiBUZW5zb3JbXTtcbiAgaWYgKEFycmF5LmlzQXJyYXkoZGF0YSkpIHtcbiAgICBpZiAoZGF0YS5sZW5ndGggIT09IG5hbWVzLmxlbmd0aCkge1xuICAgICAgdGhyb3cgbmV3IFZhbHVlRXJyb3IoXG4gICAgICAgICAgYEVycm9yIHdoZW4gY2hlY2tpbmcgbW9kZWwgJHtleGNlcHRpb25QcmVmaXh9OiB0aGUgQXJyYXkgb2YgYCArXG4gICAgICAgICAgYFRlbnNvcnMgdGhhdCB5b3UgYXJlIHBhc3NpbmcgdG8geW91ciBtb2RlbCBpcyBub3QgdGhlIHNpemUgdGhlIGAgK1xuICAgICAgICAgIGB0aGUgbW9kZWwgZXhwZWN0ZWQuIEV4cGVjdGVkIHRvIHNlZSAke25hbWVzLmxlbmd0aH0gVGVuc29yKHMpLGAgK1xuICAgICAgICAgIGAgYnV0IGluc3RlYWQgZ290ICR7ZGF0YS5sZW5ndGh9IFRlbnNvcnMocykuYCk7XG4gICAgfVxuICAgIGFycmF5cyA9IGRhdGE7XG4gIH0gZWxzZSB7XG4gICAgaWYgKG5hbWVzLmxlbmd0aCA+IDEpIHtcbiAgICAgIHRocm93IG5ldyBWYWx1ZUVycm9yKFxuICAgICAgICAgIGBUaGUgbW9kZWwgZXhwZWN0cyAke25hbWVzLmxlbmd0aH0gJHtleGNlcHRpb25QcmVmaXh9IFRlbnNvcnMsIGAgK1xuICAgICAgICAgIGBidXQgb25seSByZWNlaXZlZCBvbmUgVGVuc29yLiBGb3VuZDogYXJyYXkgd2l0aCBzaGFwZSBgICtcbiAgICAgICAgICBgJHtKU09OLnN0cmluZ2lmeShkYXRhLnNoYXBlKX0uYCk7XG4gICAgfVxuICAgIGFycmF5cyA9IFtkYXRhXTtcbiAgfVxuXG4gIGlmIChzaGFwZXMgIT0gbnVsbCkge1xuICAgIGZvciAobGV0IGkgPSAwOyBpIDwgbmFtZXMubGVuZ3RoOyArK2kpIHtcbiAgICAgIGlmIChzaGFwZXNbaV0gPT0gbnVsbCkge1xuICAgICAgICBjb250aW51ZTtcbiAgICAgIH1cbiAgICAgIGNvbnN0IGFycmF5ID0gYXJyYXlzW2ldO1xuICAgICAgaWYgKGFycmF5LnNoYXBlLmxlbmd0aCAhPT0gc2hhcGVzW2ldLmxlbmd0aCkge1xuICAgICAgICB0aHJvdyBuZXcgVmFsdWVFcnJvcihcbiAgICAgICAgICAgIGBFcnJvciB3aGVuIGNoZWNraW5nICR7ZXhjZXB0aW9uUHJlZml4fTogZXhwZWN0ZWQgJHtuYW1lc1tpXX0gYCArXG4gICAgICAgICAgICBgdG8gaGF2ZSAke3NoYXBlc1tpXS5sZW5ndGh9IGRpbWVuc2lvbihzKSwgYnV0IGdvdCBhcnJheSB3aXRoIGAgK1xuICAgICAgICAgICAgYHNoYXBlICR7SlNPTi5zdHJpbmdpZnkoYXJyYXkuc2hhcGUpfWApO1xuICAgICAgfVxuICAgICAgZm9yIChsZXQgaiA9IDA7IGogPCBzaGFwZXNbaV0ubGVuZ3RoOyArK2opIHtcbiAgICAgICAgaWYgKGogPT09IDAgJiYgIWNoZWNrQmF0Y2hBeGlzKSB7XG4gICAgICAgICAgY29udGludWU7XG4gICAgICAgIH1cbiAgICAgICAgY29uc3QgZGltID0gYXJyYXkuc2hhcGVbal07XG4gICAgICAgIGNvbnN0IHJlZkRpbSA9IHNoYXBlc1tpXVtqXTtcbiAgICAgICAgaWYgKHJlZkRpbSAhPSBudWxsKSB7XG4gICAgICAgICAgaWYgKHJlZkRpbSAhPT0gZGltKSB7XG4gICAgICAgICAgICB0aHJvdyBuZXcgVmFsdWVFcnJvcihcbiAgICAgICAgICAgICAgICBgRXJyb3Igd2hlbiBjaGVja2luZyAke2V4Y2VwdGlvblByZWZpeH06IGV4cGVjdGVkIGAgK1xuICAgICAgICAgICAgICAgIGAke25hbWVzW2ldfSB0byBoYXZlIHNoYXBlICR7SlNPTi5zdHJpbmdpZnkoc2hhcGVzW2ldKX0gYnV0IGAgK1xuICAgICAgICAgICAgICAgIGBnb3QgYXJyYXkgd2l0aCBzaGFwZSAke0pTT04uc3RyaW5naWZ5KGFycmF5LnNoYXBlKX0uYCk7XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICB9XG4gICAgfVxuICB9XG59XG5cbi8qKlxuICogTWFwcyBtZXRyaWMgZnVuY3Rpb25zIHRvIG1vZGVsIG91dHB1dHMuXG4gKiBAcGFyYW0gbWV0cmljcyBBbiBzaG9ydGN1dCBzdHJpbmdzIG5hbWUsIG1ldHJpYyBmdW5jdGlvbiwgYEFycmF5YCBvciBkaWN0XG4gKiAgIChgT2JqZWN0YCkgb2YgbWV0cmljIGZ1bmN0aW9ucy5cbiAqIEBwYXJhbSBvdXRwdXROYW1lcyBBbiBgQXJyYXlgIG9mIHRoZSBuYW1lcyBvZiBtb2RlbCBvdXRwdXRzLlxuICogQHJldHVybnMgQW4gYEFycmF5YCAob25lIGVudHJ5IHBlciBtb2RlbCBvdXRwdXQpIG9mIGBBcnJheWAgb2YgbWV0cmljXG4gKiAgIGZ1bmN0aW9ucy4gRm9yIGluc3RhbmNlLCBpZiB0aGUgbW9kZWwgaGFzIDIgb3V0cHV0cywgYW5kIGZvciB0aGUgZmlyc3RcbiAqICAgb3V0cHV0IHdlIHdhbnQgdG8gY29tcHV0ZSBgYmluYXJ5QWNjdXJhY3lgIGFuZCBgYmluYXJ5Q3Jvc3NlbnRyb3B5YCxcbiAqICAgYW5kIGp1c3QgYGJpbmFyeUFjY3VyYWN5YCBmb3IgdGhlIHNlY29uZCBvdXRwdXQsIHRoZSBgQXJyYXlgIHdvdWxkIGxvb2tcbiAqICAgbGlrZTpcbiAqICAgICBgW1tiaW5hcnlBY2N1cmFjeSwgYmluYXJ5Q3Jvc3NlbnRyb3B5XSwgIFtiaW5hcnlBY2N1cmFjeV1dYFxuICogQHRocm93cyBUeXBlRXJyb3I6IGluY29tcGF0aWJsZSBtZXRyaWNzIGZvcm1hdC5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGNvbGxlY3RNZXRyaWNzKFxuICAgIG1ldHJpY3M6IHN0cmluZ3xMb3NzT3JNZXRyaWNGbnxBcnJheTxzdHJpbmd8TG9zc09yTWV0cmljRm4+fFxuICAgIHtbb3V0cHV0TmFtZTogc3RyaW5nXTogc3RyaW5nIHwgTG9zc09yTWV0cmljRm59LFxuICAgIG91dHB1dE5hbWVzOiBzdHJpbmdbXSk6IEFycmF5PEFycmF5PHN0cmluZ3xMb3NzT3JNZXRyaWNGbj4+IHtcbiAgaWYgKG1ldHJpY3MgPT0gbnVsbCB8fCBBcnJheS5pc0FycmF5KG1ldHJpY3MpICYmIG1ldHJpY3MubGVuZ3RoID09PSAwKSB7XG4gICAgcmV0dXJuIG91dHB1dE5hbWVzLm1hcChuYW1lID0+IFtdKTtcbiAgfVxuXG4gIGxldCB3cmFwcGVkTWV0cmljczogQXJyYXk8c3RyaW5nfExvc3NPck1ldHJpY0ZuPnxcbiAgICAgIHtbb3V0cHV0TmFtZTogc3RyaW5nXTogc3RyaW5nIHwgTG9zc09yTWV0cmljRm59O1xuICBpZiAodHlwZW9mIG1ldHJpY3MgPT09ICdzdHJpbmcnIHx8IHR5cGVvZiBtZXRyaWNzID09PSAnZnVuY3Rpb24nKSB7XG4gICAgd3JhcHBlZE1ldHJpY3MgPSBbbWV0cmljc107XG4gIH0gZWxzZSBpZiAoQXJyYXkuaXNBcnJheShtZXRyaWNzKSB8fCB0eXBlb2YgbWV0cmljcyA9PT0gJ29iamVjdCcpIHtcbiAgICB3cmFwcGVkTWV0cmljcyA9IG1ldHJpY3MgYXMgQXJyYXk8c3RyaW5nfExvc3NPck1ldHJpY0ZuPnxcbiAgICAgICAge1tvdXRwdXROYW1lOiBzdHJpbmddOiBzdHJpbmd9IHwge1tvdXRwdXROYW1lOiBzdHJpbmddOiBMb3NzT3JNZXRyaWNGbn07XG4gIH0gZWxzZSB7XG4gICAgdGhyb3cgbmV3IFR5cGVFcnJvcihcbiAgICAgICAgJ1R5cGUgb2YgbWV0cmljcyBhcmd1bWVudCBub3QgdW5kZXJzdG9vZC4gRXhwZWN0ZWQgYW4gc3RyaW5nLCcgK1xuICAgICAgICBgZnVuY3Rpb24sIEFycmF5LCBvciBPYmplY3QsIGZvdW5kOiAke21ldHJpY3N9YCk7XG4gIH1cblxuICBpZiAoQXJyYXkuaXNBcnJheSh3cmFwcGVkTWV0cmljcykpIHtcbiAgICAvLyBXZSB0aGVuIGFwcGx5IGFsbCBtZXRyaWNzIHRvIGFsbCBvdXRwdXRzLlxuICAgIHJldHVybiBvdXRwdXROYW1lcy5tYXAoXG4gICAgICAgIG5hbWUgPT4gd3JhcHBlZE1ldHJpY3MgYXMgQXJyYXk8c3RyaW5nfExvc3NPck1ldHJpY0ZuPik7XG4gIH0gZWxzZSB7XG4gICAgLy8gSW4gdGhpcyBjYXNlLCBtZXRyaWNzIGlzIGEgZGljdC5cbiAgICBjb25zdCBuZXN0ZWRNZXRyaWNzOiBBcnJheTxBcnJheTxzdHJpbmd8TG9zc09yTWV0cmljRm4+PiA9IFtdO1xuICAgIGZvciAoY29uc3QgbmFtZSBvZiBvdXRwdXROYW1lcykge1xuICAgICAgbGV0IG91dHB1dE1ldHJpY3M6IHN0cmluZ3xMb3NzT3JNZXRyaWNGbnxBcnJheTxzdHJpbmd8TG9zc09yTWV0cmljRm4+ID1cbiAgICAgICAgICB3cmFwcGVkTWV0cmljcy5oYXNPd25Qcm9wZXJ0eShuYW1lKSA/IHdyYXBwZWRNZXRyaWNzW25hbWVdIDogW107XG4gICAgICBpZiAoIUFycmF5LmlzQXJyYXkob3V0cHV0TWV0cmljcykpIHtcbiAgICAgICAgb3V0cHV0TWV0cmljcyA9IFtvdXRwdXRNZXRyaWNzXTtcbiAgICAgIH1cbiAgICAgIG5lc3RlZE1ldHJpY3MucHVzaChvdXRwdXRNZXRyaWNzKTtcbiAgICB9XG4gICAgcmV0dXJuIG5lc3RlZE1ldHJpY3M7XG4gIH1cbn1cblxuZXhwb3J0IGludGVyZmFjZSBNb2RlbEV2YWx1YXRlQXJncyB7XG4gIC8qKlxuICAgKiBCYXRjaCBzaXplIChJbnRlZ2VyKS4gSWYgdW5zcGVjaWZpZWQsIGl0IHdpbGwgZGVmYXVsdCB0byAzMi5cbiAgICovXG4gIGJhdGNoU2l6ZT86IG51bWJlcjtcblxuICAvKipcbiAgICogVmVyYm9zaXR5IG1vZGUuXG4gICAqL1xuICB2ZXJib3NlPzogTW9kZWxMb2dnaW5nVmVyYm9zaXR5O1xuXG4gIC8qKlxuICAgKiBUZW5zb3Igb2Ygd2VpZ2h0cyB0byB3ZWlnaHQgdGhlIGNvbnRyaWJ1dGlvbiBvZiBkaWZmZXJlbnQgc2FtcGxlcyB0byB0aGVcbiAgICogbG9zcyBhbmQgbWV0cmljcy5cbiAgICovXG4gIHNhbXBsZVdlaWdodD86IFRlbnNvcjtcblxuICAvKipcbiAgICogaW50ZWdlcjogdG90YWwgbnVtYmVyIG9mIHN0ZXBzIChiYXRjaGVzIG9mIHNhbXBsZXMpXG4gICAqIGJlZm9yZSBkZWNsYXJpbmcgdGhlIGV2YWx1YXRpb24gcm91bmQgZmluaXNoZWQuIElnbm9yZWQgd2l0aCB0aGUgZGVmYXVsdFxuICAgKiB2YWx1ZSBvZiBgdW5kZWZpbmVkYC5cbiAgICovXG4gIHN0ZXBzPzogbnVtYmVyO1xufVxuXG4vKipcbiAqIENvbmZpZ3VyYXRpb24gZm9yIGNhbGxzIHRvIGBMYXllcnNNb2RlbC5jb21waWxlKClgLlxuICovXG5leHBvcnQgaW50ZXJmYWNlIE1vZGVsQ29tcGlsZUFyZ3Mge1xuICAvKipcbiAgICogQW4gaW5zdGFuY2Ugb2YgYHRmLnRyYWluLk9wdGltaXplcmAgb3IgYSBzdHJpbmcgbmFtZSBmb3IgYW4gT3B0aW1pemVyLlxuICAgKi9cbiAgb3B0aW1pemVyOiBzdHJpbmd8T3B0aW1pemVyO1xuXG4gIC8qKlxuICAgKiBPYmplY3QgZnVuY3Rpb24ocykgb3IgbmFtZShzKSBvZiBvYmplY3QgZnVuY3Rpb24ocykuXG4gICAqIElmIHRoZSBtb2RlbCBoYXMgbXVsdGlwbGUgb3V0cHV0cywgeW91IGNhbiB1c2UgYSBkaWZmZXJlbnQgbG9zc1xuICAgKiBvbiBlYWNoIG91dHB1dCBieSBwYXNzaW5nIGEgZGljdGlvbmFyeSBvciBhbiBBcnJheSBvZiBsb3NzZXMuXG4gICAqIFRoZSBsb3NzIHZhbHVlIHRoYXQgd2lsbCBiZSBtaW5pbWl6ZWQgYnkgdGhlIG1vZGVsIHdpbGwgdGhlbiBiZSB0aGUgc3VtXG4gICAqIG9mIGFsbCBpbmRpdmlkdWFsIGxvc3Nlcy5cbiAgICovXG4gIGxvc3M6IHN0cmluZ3xzdHJpbmdbXXx7W291dHB1dE5hbWU6IHN0cmluZ106IHN0cmluZ318TG9zc09yTWV0cmljRm58XG4gICAgICBMb3NzT3JNZXRyaWNGbltdfHtbb3V0cHV0TmFtZTogc3RyaW5nXTogTG9zc09yTWV0cmljRm59O1xuXG4gIC8qKlxuICAgKiBMaXN0IG9mIG1ldHJpY3MgdG8gYmUgZXZhbHVhdGVkIGJ5IHRoZSBtb2RlbCBkdXJpbmcgdHJhaW5pbmcgYW5kIHRlc3RpbmcuXG4gICAqIFR5cGljYWxseSB5b3Ugd2lsbCB1c2UgYG1ldHJpY3M9WydhY2N1cmFjeSddYC5cbiAgICogVG8gc3BlY2lmeSBkaWZmZXJlbnQgbWV0cmljcyBmb3IgZGlmZmVyZW50IG91dHB1dHMgb2YgYSBtdWx0aS1vdXRwdXRcbiAgICogbW9kZWwsIHlvdSBjb3VsZCBhbHNvIHBhc3MgYSBkaWN0aW9uYXJ5LlxuICAgKi9cbiAgbWV0cmljcz86IHN0cmluZ3xMb3NzT3JNZXRyaWNGbnxBcnJheTxzdHJpbmd8TG9zc09yTWV0cmljRm4+fFxuICAgICAge1tvdXRwdXROYW1lOiBzdHJpbmddOiBzdHJpbmcgfCBMb3NzT3JNZXRyaWNGbn07XG5cbiAgLy8gVE9ETyhjYWlzKTogQWRkIGxvc3NXZWlnaHRzLCBzYW1wbGVXZWlnaHRNb2RlLCB3ZWlnaHRlZE1ldHJpY3MsIGFuZFxuICAvLyAgIHRhcmdldFRlbnNvcnMuXG59XG5cbmNvbnN0IExBWUVSU19NT0RFTF9GT1JNQVRfTkFNRSA9ICdsYXllcnMtbW9kZWwnO1xuXG4vKipcbiAqIEEgYHRmLkxheWVyc01vZGVsYCBpcyBhIGRpcmVjdGVkLCBhY3ljbGljIGdyYXBoIG9mIGB0Zi5MYXllcmBzIHBsdXMgbWV0aG9kc1xuICogZm9yIHRyYWluaW5nLCBldmFsdWF0aW9uLCBwcmVkaWN0aW9uIGFuZCBzYXZpbmcuXG4gKlxuICogYHRmLkxheWVyc01vZGVsYCBpcyB0aGUgYmFzaWMgdW5pdCBvZiB0cmFpbmluZywgaW5mZXJlbmNlIGFuZCBldmFsdWF0aW9uIGluXG4gKiBUZW5zb3JGbG93LmpzLiBUbyBjcmVhdGUgYSBgdGYuTGF5ZXJzTW9kZWxgLCB1c2UgYHRmLkxheWVyc01vZGVsYC5cbiAqXG4gKiBTZWUgYWxzbzpcbiAqICAgYHRmLlNlcXVlbnRpYWxgLCBgdGYubG9hZExheWVyc01vZGVsYC5cbiAqXG4gKiBAZG9jIHtoZWFkaW5nOiAnTW9kZWxzJywgc3ViaGVhZGluZzogJ0NsYXNzZXMnfVxuICovXG5leHBvcnQgY2xhc3MgTGF5ZXJzTW9kZWwgZXh0ZW5kcyBDb250YWluZXIgaW1wbGVtZW50cyB0ZmMuSW5mZXJlbmNlTW9kZWwge1xuICAvLyBUaGUgY2xhc3MgbmFtZSBpcyAnTW9kZWwnIHJhdGhlciB0aGFuICdMYXllcnNNb2RlbCcgZm9yIGJhY2t3YXJkc1xuICAvLyBjb21wYXRpYmlsaXR5IHNpbmNlIHRoaXMgY2xhc3MgbmFtZSBzaG93cyB1cCBpbiB0aGUgc2VyaWFsaXphdGlvbiBmb3JtYXQuXG4gIC8qKiBAbm9jb2xsYXBzZSAqL1xuICBzdGF0aWMgY2xhc3NOYW1lID0gJ01vZGVsJztcbiAgcHJvdGVjdGVkIG9wdGltaXplcl86IE9wdGltaXplcjtcbiAgLy8gV2hldGhlciB0aGUgbW9kZWwgaW5zdGFuY2Ugb3ducyB0aGUgb3B0aW1pemVyOiBgdHJ1ZWAgaWYgYW5kIG9ubHkgaWZcbiAgLy8gYG9wdGltaXplcmAgaXMgY3JlYXRlZCBmcm9tIGEgc3RyaW5nIHBhcmFtZXRlciBkdXJpbmcgYGNvbXBpbGUoKWAgY2FsbC5cbiAgcHJvdGVjdGVkIGlzT3B0aW1pemVyT3duZWQ6IGJvb2xlYW47XG5cbiAgbG9zczogc3RyaW5nfHN0cmluZ1tdfHtbb3V0cHV0TmFtZTogc3RyaW5nXTogc3RyaW5nfXxMb3NzT3JNZXRyaWNGbnxcbiAgICAgIExvc3NPck1ldHJpY0ZuW118e1tvdXRwdXROYW1lOiBzdHJpbmddOiBMb3NzT3JNZXRyaWNGbn07XG4gIGxvc3NGdW5jdGlvbnM6IExvc3NPck1ldHJpY0ZuW107XG5cbiAgLy8gVE9ETyhjYWlzKTogVGhlc2UgcHJpdmF0ZSB2YXJpYWJsZXMgc2hvdWxkIHByb2JhYmx5IG5vdCBoYXZlIHRoZSBzdHJpbmdcbiAgLy8gICAnZmVlZCcgaW4gdGhlaXIgbmFtZXMsIGJlY2F1c2Ugd2UgYXJlIG5vdCBkZWFsaW5nIHdpdGggYSBzeW1ib2xpY1xuICAvLyAgIGJhY2tlbmQuXG4gIHByaXZhdGUgZmVlZE91dHB1dFNoYXBlczogU2hhcGVbXTtcbiAgcHJpdmF0ZSBmZWVkTG9zc0ZuczogTG9zc09yTWV0cmljRm5bXTtcbiAgcHJpdmF0ZSBjb2xsZWN0ZWRUcmFpbmFibGVXZWlnaHRzOiBMYXllclZhcmlhYmxlW107XG4gIHByaXZhdGUgdGVzdEZ1bmN0aW9uOiAoZGF0YTogVGVuc29yW10pID0+IFNjYWxhcltdO1xuICBoaXN0b3J5OiBIaXN0b3J5O1xuXG4gIC8vIEEgcHVibGljIHByb3BlcnR5IHRoYXQgY2FuIGJlIHNldCBieSBDYWxsYmFja3MgdG8gb3JkZXIgZWFybHkgc3RvcHBpbmdcbiAgLy8gZHVyaW5nIGBmaXQoKWAgY2FsbHMuXG4gIHByb3RlY3RlZCBzdG9wVHJhaW5pbmdfOiBib29sZWFuO1xuICBwcm90ZWN0ZWQgaXNUcmFpbmluZzogYm9vbGVhbjtcblxuICBtZXRyaWNzOiBzdHJpbmd8TG9zc09yTWV0cmljRm58QXJyYXk8c3RyaW5nfExvc3NPck1ldHJpY0ZuPnxcbiAgICAgIHtbb3V0cHV0TmFtZTogc3RyaW5nXTogc3RyaW5nIHwgTG9zc09yTWV0cmljRm59O1xuICBtZXRyaWNzTmFtZXM6IHN0cmluZ1tdO1xuICAvLyBQb3J0aW5nIE5vdGU6IGBtZXRyaWNzX3RlbnNvcnNgIGluIFB5S2VyYXMgaXMgYSBzeW1ib2xpYyB0ZW5zb3IuIEJ1dCBnaXZlblxuICAvLyAgIHRoZSBpbXBlcmF0aXZlIG5hdHVyZSBvZiB0ZmpzLWNvcmUsIGBtZXRyaWNzVGVuc29yc2AgaXMgYVxuICAvLyAgIFR5cGVTY3JpcHQgZnVuY3Rpb24gaGVyZS5cbiAgLy8gICBBbHNvIG5vdGUgdGhhdCBkdWUgdG8gdGhlIGltcGVyYXRpdmUgbmF0dXJlIG9mIHRmanMtY29yZSwgYG1ldHJpY3NUZW5zb3JgXG4gIC8vICAgaGVyZSBuZWVkcyBhbiBvdXRwdXQgaW5kZXggdG8ga2VlcCB0cmFjayBvZiB3aGljaCBvdXRwdXQgb2YgdGhlXG4gIC8vICAgTGF5ZXJzTW9kZWwgYSBtZXRyaWMgYmVsb25ncyB0by4gVGhpcyBpcyB1bmxpa2UgYG1ldHJpY3NfdGVuc29yc2AgaW5cbiAgLy8gICBQeUtlcmFzLCB3aGljaCBpcyBhIGBsaXN0YCBvZiBzeW1ib2xpYyB0ZW5zb3JzLCBlYWNoIG9mIHdoaWNoIGhhc1xuICAvLyAgIGltcGxpY2l0IFwia25vd2xlZGdlXCIgb2YgdGhlIG91dHB1dHMgaXQgZGVwZW5kcyBvbi5cbiAgbWV0cmljc1RlbnNvcnM6IEFycmF5PFtMb3NzT3JNZXRyaWNGbiwgbnVtYmVyXT47XG5cbiAgLy8gVXNlciBkZWZpbmQgbWV0YWRhdGEgKGlmIGFueSkuXG4gIHByaXZhdGUgdXNlckRlZmluZWRNZXRhZGF0YToge307XG5cbiAgY29uc3RydWN0b3IoYXJnczogQ29udGFpbmVyQXJncykge1xuICAgIHN1cGVyKGFyZ3MpO1xuICAgIHRoaXMuaXNUcmFpbmluZyA9IGZhbHNlO1xuICB9XG5cbiAgLyoqXG4gICAqIFByaW50IGEgdGV4dCBzdW1tYXJ5IG9mIHRoZSBtb2RlbCdzIGxheWVycy5cbiAgICpcbiAgICogVGhlIHN1bW1hcnkgaW5jbHVkZXNcbiAgICogLSBOYW1lIGFuZCB0eXBlIG9mIGFsbCBsYXllcnMgdGhhdCBjb21wcmlzZSB0aGUgbW9kZWwuXG4gICAqIC0gT3V0cHV0IHNoYXBlKHMpIG9mIHRoZSBsYXllcnNcbiAgICogLSBOdW1iZXIgb2Ygd2VpZ2h0IHBhcmFtZXRlcnMgb2YgZWFjaCBsYXllclxuICAgKiAtIElmIHRoZSBtb2RlbCBoYXMgbm9uLXNlcXVlbnRpYWwtbGlrZSB0b3BvbG9neSwgdGhlIGlucHV0cyBlYWNoIGxheWVyXG4gICAqICAgcmVjZWl2ZXNcbiAgICogLSBUaGUgdG90YWwgbnVtYmVyIG9mIHRyYWluYWJsZSBhbmQgbm9uLXRyYWluYWJsZSBwYXJhbWV0ZXJzIG9mIHRoZSBtb2RlbC5cbiAgICpcbiAgICogYGBganNcbiAgICogY29uc3QgaW5wdXQxID0gdGYuaW5wdXQoe3NoYXBlOiBbMTBdfSk7XG4gICAqIGNvbnN0IGlucHV0MiA9IHRmLmlucHV0KHtzaGFwZTogWzIwXX0pO1xuICAgKiBjb25zdCBkZW5zZTEgPSB0Zi5sYXllcnMuZGVuc2Uoe3VuaXRzOiA0fSkuYXBwbHkoaW5wdXQxKTtcbiAgICogY29uc3QgZGVuc2UyID0gdGYubGF5ZXJzLmRlbnNlKHt1bml0czogOH0pLmFwcGx5KGlucHV0Mik7XG4gICAqIGNvbnN0IGNvbmNhdCA9IHRmLmxheWVycy5jb25jYXRlbmF0ZSgpLmFwcGx5KFtkZW5zZTEsIGRlbnNlMl0pO1xuICAgKiBjb25zdCBvdXRwdXQgPVxuICAgKiAgICAgdGYubGF5ZXJzLmRlbnNlKHt1bml0czogMywgYWN0aXZhdGlvbjogJ3NvZnRtYXgnfSkuYXBwbHkoY29uY2F0KTtcbiAgICpcbiAgICogY29uc3QgbW9kZWwgPSB0Zi5tb2RlbCh7aW5wdXRzOiBbaW5wdXQxLCBpbnB1dDJdLCBvdXRwdXRzOiBvdXRwdXR9KTtcbiAgICogbW9kZWwuc3VtbWFyeSgpO1xuICAgKiBgYGBcbiAgICpcbiAgICogQHBhcmFtIGxpbmVMZW5ndGggQ3VzdG9tIGxpbmUgbGVuZ3RoLCBpbiBudW1iZXIgb2YgY2hhcmFjdGVycy5cbiAgICogQHBhcmFtIHBvc2l0aW9ucyBDdXN0b20gd2lkdGhzIG9mIGVhY2ggb2YgdGhlIGNvbHVtbnMsIGFzIGVpdGhlclxuICAgKiAgIGZyYWN0aW9ucyBvZiBgbGluZUxlbmd0aGAgKGUuZy4sIGBbMC41LCAwLjc1LCAxXWApIG9yIGFic29sdXRlIG51bWJlclxuICAgKiAgIG9mIGNoYXJhY3RlcnMgKGUuZy4sIGBbMzAsIDUwLCA2NV1gKS4gRWFjaCBudW1iZXIgY29ycmVzcG9uZHMgdG9cbiAgICogICByaWdodC1tb3N0IChpLmUuLCBlbmRpbmcpIHBvc2l0aW9uIG9mIGEgY29sdW1uLlxuICAgKiBAcGFyYW0gcHJpbnRGbiBDdXN0b20gcHJpbnQgZnVuY3Rpb24uIENhbiBiZSB1c2VkIHRvIHJlcGxhY2UgdGhlIGRlZmF1bHRcbiAgICogICBgY29uc29sZS5sb2dgLiBGb3IgZXhhbXBsZSwgeW91IGNhbiB1c2UgYHggPT4ge31gIHRvIG11dGUgdGhlIHByaW50ZWRcbiAgICogICBtZXNzYWdlcyBpbiB0aGUgY29uc29sZS5cbiAgICpcbiAgICogQGRvYyB7aGVhZGluZzogJ01vZGVscycsIHN1YmhlYWRpbmc6ICdDbGFzc2VzJ31cbiAgICovXG4gIHN1bW1hcnkoXG4gICAgICBsaW5lTGVuZ3RoPzogbnVtYmVyLCBwb3NpdGlvbnM/OiBudW1iZXJbXSxcbiAgICAgIHByaW50Rm46XG4gICAgICAgICAgLy8gdHNsaW50OmRpc2FibGUtbmV4dC1saW5lOm5vLWFueVxuICAgICAgKG1lc3NhZ2U/OiBhbnksIC4uLm9wdGlvbmFsUGFyYW1zOiBhbnlbXSkgPT4gdm9pZCA9IGNvbnNvbGUubG9nKSB7XG4gICAgaWYgKCF0aGlzLmJ1aWx0KSB7XG4gICAgICB0aHJvdyBuZXcgVmFsdWVFcnJvcihcbiAgICAgICAgICBgVGhpcyBtb2RlbCBoYXMgbmV2ZXIgYmVlbiBjYWxsZWQsIHRodXMgaXRzIHdlaWdodHMgaGF2ZSBub3QgYmVlbiBgICtcbiAgICAgICAgICBgY3JlYXRlZCB5ZXQuIFNvIG5vIHN1bW1hcnkgY2FuIGJlIGRpc3BsYXllZC4gQnVpbGQgdGhlIG1vZGVsIGAgK1xuICAgICAgICAgIGBmaXJzdCAoZS5nLiwgYnkgY2FsbGluZyBpdCBvbiBzb21lIHRlc3QgZGF0YSkuYCk7XG4gICAgfVxuICAgIHByaW50U3VtbWFyeSh0aGlzLCBsaW5lTGVuZ3RoLCBwb3NpdGlvbnMsIHByaW50Rm4pO1xuICB9XG5cbiAgLyoqXG4gICAqIENvbmZpZ3VyZXMgYW5kIHByZXBhcmVzIHRoZSBtb2RlbCBmb3IgdHJhaW5pbmcgYW5kIGV2YWx1YXRpb24uICBDb21waWxpbmdcbiAgICogb3V0Zml0cyB0aGUgbW9kZWwgd2l0aCBhbiBvcHRpbWl6ZXIsIGxvc3MsIGFuZC9vciBtZXRyaWNzLiAgQ2FsbGluZyBgZml0YFxuICAgKiBvciBgZXZhbHVhdGVgIG9uIGFuIHVuLWNvbXBpbGVkIG1vZGVsIHdpbGwgdGhyb3cgYW4gZXJyb3IuXG4gICAqXG4gICAqIEBwYXJhbSBhcmdzIGEgYE1vZGVsQ29tcGlsZUFyZ3NgIHNwZWNpZnlpbmcgdGhlIGxvc3MsIG9wdGltaXplciwgYW5kXG4gICAqIG1ldHJpY3MgdG8gYmUgdXNlZCBmb3IgZml0dGluZyBhbmQgZXZhbHVhdGluZyB0aGlzIG1vZGVsLlxuICAgKlxuICAgKiBAZG9jIHtoZWFkaW5nOiAnTW9kZWxzJywgc3ViaGVhZGluZzogJ0NsYXNzZXMnfVxuICAgKi9cbiAgY29tcGlsZShhcmdzOiBNb2RlbENvbXBpbGVBcmdzKTogdm9pZCB7XG4gICAgaWYgKGFyZ3MubG9zcyA9PSBudWxsKSB7XG4gICAgICBhcmdzLmxvc3MgPSBbXTtcbiAgICB9XG4gICAgdGhpcy5sb3NzID0gYXJncy5sb3NzO1xuXG4gICAgaWYgKHR5cGVvZiBhcmdzLm9wdGltaXplciA9PT0gJ3N0cmluZycpIHtcbiAgICAgIHRoaXMub3B0aW1pemVyXyA9IG9wdGltaXplcnMuZ2V0T3B0aW1pemVyKGFyZ3Mub3B0aW1pemVyKTtcbiAgICAgIHRoaXMuaXNPcHRpbWl6ZXJPd25lZCA9IHRydWU7XG4gICAgfSBlbHNlIHtcbiAgICAgIGlmICghKGFyZ3Mub3B0aW1pemVyIGluc3RhbmNlb2YgT3B0aW1pemVyKSkge1xuICAgICAgICB0aHJvdyBuZXcgVmFsdWVFcnJvcihcbiAgICAgICAgICAgIGBVc2VyLWRlZmluZWQgb3B0aW1pemVyIG11c3QgYmUgYW4gaW5zdGFuY2Ugb2YgdGYuT3B0aW1pemVyLmApO1xuICAgICAgfVxuICAgICAgdGhpcy5vcHRpbWl6ZXJfID0gYXJncy5vcHRpbWl6ZXI7XG4gICAgICB0aGlzLmlzT3B0aW1pemVyT3duZWQgPSBmYWxzZTtcbiAgICB9XG5cbiAgICAvLyBUT0RPKGNhaXMpOiBBZGQgbG9zc1dlaWdodHMuXG4gICAgLy8gVE9ETyhjYWlzKTogQWRkIHNhbXBsZVdlaWdodE1vZGUuXG5cbiAgICAvLyBQcmVwYXJlIGxvc3MgZnVuY3Rpb25zLlxuICAgIGxldCBsb3NzRnVuY3Rpb25zOiBMb3NzT3JNZXRyaWNGbltdID0gW107XG4gICAgaWYgKCFBcnJheS5pc0FycmF5KGFyZ3MubG9zcykgJiYgdHlwZW9mIGFyZ3MubG9zcyAhPT0gJ3N0cmluZycgJiZcbiAgICAgICAgdHlwZW9mIGFyZ3MubG9zcyAhPT0gJ2Z1bmN0aW9uJykge1xuICAgICAgYXJncy5sb3NzID0gYXJncy5sb3NzIGFzIHtbb3V0cHV0TmFtZTogc3RyaW5nXTogc3RyaW5nfTtcbiAgICAgIGZvciAoY29uc3QgbmFtZSBpbiBhcmdzLmxvc3MpIHtcbiAgICAgICAgaWYgKHRoaXMub3V0cHV0TmFtZXMuaW5kZXhPZihuYW1lKSA9PT0gLTEpIHtcbiAgICAgICAgICB0aHJvdyBuZXcgVmFsdWVFcnJvcihcbiAgICAgICAgICAgICAgYFVua25vd24gZW50cnkgaW4gbG9zcyBkaWN0aW9uYXJ5OiBcIiR7bmFtZX1cIi4gYCArXG4gICAgICAgICAgICAgIGBPbmx5IGV4cGVjdGVkIHRoZSBmb2xsb3dpbmcga2V5czogJHt0aGlzLm91dHB1dE5hbWVzfWApO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgICBmb3IgKGNvbnN0IG5hbWUgb2YgdGhpcy5vdXRwdXROYW1lcykge1xuICAgICAgICBpZiAoYXJncy5sb3NzW25hbWVdID09IG51bGwpIHtcbiAgICAgICAgICBjb25zb2xlLndhcm4oXG4gICAgICAgICAgICAgIGBPdXRwdXQgXCIke25hbWV9XCIgaXMgbWlzc2luZyBmcm9tIGxvc3MgZGljdGlvbmFyeS4gV2UgYXNzdW1lIGAgK1xuICAgICAgICAgICAgICBgdGhpcyB3YXMgZG9uZSBvbiBwdXJwb3NlLCBhbmQgd2Ugd2lsbCBub3QgYmUgZXhwZWN0aW5nIGRhdGEgYCArXG4gICAgICAgICAgICAgIGB0byBiZSBwYXNzZWQgdG8gJHtuYW1lfSBkdXJpbmcgdHJhaW5pbmdgKTtcbiAgICAgICAgfVxuICAgICAgICBsb3NzRnVuY3Rpb25zLnB1c2gobG9zc2VzLmdldChhcmdzLmxvc3NbbmFtZV0pKTtcbiAgICAgIH1cbiAgICB9IGVsc2UgaWYgKEFycmF5LmlzQXJyYXkoYXJncy5sb3NzKSkge1xuICAgICAgaWYgKGFyZ3MubG9zcy5sZW5ndGggIT09IHRoaXMub3V0cHV0cy5sZW5ndGgpIHtcbiAgICAgICAgdGhyb3cgbmV3IFZhbHVlRXJyb3IoXG4gICAgICAgICAgICBgV2hlbiBwYXNzaW5nIGFuIEFycmF5IGFzIGxvc3MsIGl0IHNob3VsZCBoYXZlIG9uZSBlbnRyeSBwZXIgYCArXG4gICAgICAgICAgICBgbW9kZWwgb3V0cHV0LiBUaGUgbW9kZWwgaGFzICR7dGhpcy5vdXRwdXRzLmxlbmd0aH0gb3V0cHV0KHMpLCBgICtcbiAgICAgICAgICAgIGBidXQgeW91IHBhc3NlZCBsb3NzPSR7YXJncy5sb3NzfS5gKTtcbiAgICAgIH1cbiAgICAgIGNvbnN0IHRoZUxvc3NlcyA9IGFyZ3MubG9zcyBhcyBBcnJheTxzdHJpbmd8TG9zc09yTWV0cmljRm4+O1xuICAgICAgbG9zc0Z1bmN0aW9ucyA9IHRoZUxvc3Nlcy5tYXAobCA9PiBsb3NzZXMuZ2V0KGwpKTtcbiAgICB9IGVsc2Uge1xuICAgICAgY29uc3QgbG9zc0Z1bmN0aW9uID0gbG9zc2VzLmdldChhcmdzLmxvc3MpO1xuICAgICAgdGhpcy5vdXRwdXRzLmZvckVhY2goXyA9PiB7XG4gICAgICAgIGxvc3NGdW5jdGlvbnMucHVzaChsb3NzRnVuY3Rpb24pO1xuICAgICAgfSk7XG4gICAgfVxuXG4gICAgdGhpcy5sb3NzRnVuY3Rpb25zID0gbG9zc0Z1bmN0aW9ucztcblxuICAgIHRoaXMuZmVlZE91dHB1dE5hbWVzID0gW107XG4gICAgdGhpcy5mZWVkT3V0cHV0U2hhcGVzID0gW107XG4gICAgdGhpcy5mZWVkTG9zc0ZucyA9IFtdO1xuICAgIGZvciAobGV0IGkgPSAwOyBpIDwgdGhpcy5vdXRwdXRzLmxlbmd0aDsgKytpKSB7XG4gICAgICAvLyBUT0RPKGNhaXMpOiBMb2dpYyBmb3Igc2tpcHBpbmcgdGFyZ2V0KHMpLlxuICAgICAgY29uc3Qgc2hhcGUgPSB0aGlzLmludGVybmFsT3V0cHV0U2hhcGVzW2ldO1xuICAgICAgY29uc3QgbmFtZSA9IHRoaXMub3V0cHV0TmFtZXNbaV07XG4gICAgICB0aGlzLmZlZWRPdXRwdXROYW1lcy5wdXNoKG5hbWUpO1xuICAgICAgdGhpcy5mZWVkT3V0cHV0U2hhcGVzLnB1c2goc2hhcGUpO1xuICAgICAgdGhpcy5mZWVkTG9zc0Zucy5wdXNoKHRoaXMubG9zc0Z1bmN0aW9uc1tpXSk7XG4gICAgfVxuXG4gICAgLy8gVE9ETyhjYWlzKTogQWRkIGxvZ2ljIGZvciBvdXRwdXQgbWFza3MuXG4gICAgLy8gVE9ETyhjYWlzKTogQWRkIGxvZ2ljIGZvciBzYW1wbGUgd2VpZ2h0cy5cbiAgICBjb25zdCBza2lwVGFyZ2V0SW5kaWNlczogbnVtYmVyW10gPSBbXTtcblxuICAgIC8vIFByZXBhcmUgbWV0cmljcy5cbiAgICB0aGlzLm1ldHJpY3MgPSBhcmdzLm1ldHJpY3M7XG4gICAgLy8gVE9ETyhjYWlzKTogQWRkIHdlaWdodGVkTWV0cmljcy5cbiAgICB0aGlzLm1ldHJpY3NOYW1lcyA9IFsnbG9zcyddO1xuICAgIHRoaXMubWV0cmljc1RlbnNvcnMgPSBbXTtcblxuICAgIC8vIENvbXB1dGUgdG90YWwgbG9zcy5cbiAgICAvLyBQb3J0aW5nIE5vdGU6IEluIFB5S2VyYXMsIG1ldHJpY3NfdGVuc29ycyBhcmUgc3ltYm9saWMgdGVuc29yIG9iamVjdHMuXG4gICAgLy8gICBIZXJlLCBtZXRyaWNzVGVuc29ycyBhcmUgVHlwZVNjcmlwdCBmdW5jdGlvbnMuIFRoaXMgZGlmZmVyZW5jZSBpcyBkdWVcbiAgICAvLyAgIHRvIHRoZSBkaWZmZXJlbmNlIGluIHN5bWJvbGljL2ltcGVyYXRpdmUgcHJvcGVydHkgb2YgdGhlIGJhY2tlbmRzLlxuICAgIG5hbWVTY29wZSgnbG9zcycsICgpID0+IHtcbiAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgdGhpcy5vdXRwdXRzLmxlbmd0aDsgKytpKSB7XG4gICAgICAgIGlmIChza2lwVGFyZ2V0SW5kaWNlcy5pbmRleE9mKGkpICE9PSAtMSkge1xuICAgICAgICAgIGNvbnRpbnVlO1xuICAgICAgICB9XG4gICAgICAgIC8vIFRPRE8oY2Fpcyk6IEFkZCB3ZWlnaHRlZExvc3MsIHNhbXBsZVdlaWdodCBhbmQgbWFzay5cbiAgICAgICAgLy8gICBUaGUgZm9sbG93aW5nIGxpbmUgc2hvdWxkIGJlIHdlaWdodGVkTG9zc1xuICAgICAgICBjb25zdCB3ZWlnaHRlZExvc3MgPSB0aGlzLmxvc3NGdW5jdGlvbnNbaV07XG4gICAgICAgIGlmICh0aGlzLm91dHB1dHMubGVuZ3RoID4gMSkge1xuICAgICAgICAgIHRoaXMubWV0cmljc1RlbnNvcnMucHVzaChbd2VpZ2h0ZWRMb3NzLCBpXSk7XG4gICAgICAgICAgdGhpcy5tZXRyaWNzTmFtZXMucHVzaCh0aGlzLm91dHB1dE5hbWVzW2ldICsgJ19sb3NzJyk7XG4gICAgICAgIH1cbiAgICAgIH1cblxuICAgICAgLy8gUG9ydGluZyBOb3RlOiBEdWUgdG8gdGhlIGltcGVyYXRpdmUgbmF0dXJlIG9mIHRoZSBiYWNrZW5kLCB3ZSBjYWxjdWxhdGVcbiAgICAgIC8vICAgdGhlIHJlZ3VsYXJpemVyIHBlbmFsdGllcyBpbiB0aGUgdG90YWxMb3NzRnVuY3Rpb24sIGluc3RlYWQgb2YgaGVyZS5cbiAgICB9KTtcblxuICAgIGNvbnN0IG5lc3RlZE1ldHJpY3MgPSBjb2xsZWN0TWV0cmljcyhhcmdzLm1ldHJpY3MsIHRoaXMub3V0cHV0TmFtZXMpO1xuICAgIC8vIFRPRE8oY2Fpcyk6IEFkZCBuZXN0ZWRXZWlnaHRlZE1ldHJpY3MuXG5cbiAgICAvKipcbiAgICAgKiBIZWxwZXIgZnVuY3Rpb24gdXNlZCBpbiBsb29wIGJlbG93LlxuICAgICAqL1xuICAgIGNvbnN0IGFwcGVuZE1ldHJpYyA9XG4gICAgICAgIChvdXRwdXRJbmRleDogbnVtYmVyLCBtZXRyaWNOYW1lOiBzdHJpbmcsXG4gICAgICAgICBtZXRyaWNUZW5zb3I6IExvc3NPck1ldHJpY0ZuKSA9PiB7XG4gICAgICAgICAgaWYgKHRoaXMub3V0cHV0TmFtZXMubGVuZ3RoID4gMSkge1xuICAgICAgICAgICAgbWV0cmljTmFtZSA9IHRoaXMub3V0cHV0TmFtZXNbb3V0cHV0SW5kZXhdICsgJ18nICsgbWV0cmljTmFtZTtcbiAgICAgICAgICB9XG4gICAgICAgICAgdGhpcy5tZXRyaWNzTmFtZXMucHVzaChtZXRyaWNOYW1lKTtcbiAgICAgICAgICB0aGlzLm1ldHJpY3NUZW5zb3JzLnB1c2goW21ldHJpY1RlbnNvciwgb3V0cHV0SW5kZXhdKTtcbiAgICAgICAgfTtcblxuICAgIG5hbWVTY29wZSgnbWV0cmljJywgKCkgPT4ge1xuICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCB0aGlzLm91dHB1dHMubGVuZ3RoOyArK2kpIHtcbiAgICAgICAgaWYgKHNraXBUYXJnZXRJbmRpY2VzLmluZGV4T2YoaSkgIT09IC0xKSB7XG4gICAgICAgICAgY29udGludWU7XG4gICAgICAgIH1cbiAgICAgICAgY29uc3Qgb3V0cHV0TWV0cmljcyA9IG5lc3RlZE1ldHJpY3NbaV07XG4gICAgICAgIC8vIFRPRE8oY2Fpcyk6IEFkZCB3ZWlnaHRzIGFuZCBvdXRwdXRXZWlnaHRlZE1ldHJpY3MuXG5cbiAgICAgICAgLy8gVE9ETyhjYWlzKTogQWRkIG9wdGlvbmFsIGFyZyBgd2VpZ2h0c2AgdG8gdGhlIGZvbGxvd2luZyBmdW5jdGlvbi5cbiAgICAgICAgY29uc3QgaGFuZGxlTWV0cmljcyA9IChtZXRyaWNzOiBBcnJheTxzdHJpbmd8TG9zc09yTWV0cmljRm4+KSA9PiB7XG4gICAgICAgICAgY29uc3QgbWV0cmljTmFtZVByZWZpeCA9ICcnO1xuICAgICAgICAgIGxldCBtZXRyaWNOYW1lOiBzdHJpbmc7XG4gICAgICAgICAgbGV0IGFjY0ZuOiBMb3NzT3JNZXRyaWNGbjtcbiAgICAgICAgICBsZXQgd2VpZ2h0ZWRNZXRyaWNGbjogTG9zc09yTWV0cmljRm47XG4gICAgICAgICAgLy8gIFRPRE8oY2Fpcyk6IFVzZSAnd2VpZ2h0c18nIGZvciB3ZWlnaHRlZCBtZXRyaWNzLlxuXG4gICAgICAgICAgZm9yIChjb25zdCBtZXRyaWMgb2YgbWV0cmljcykge1xuICAgICAgICAgICAgaWYgKHR5cGVvZiBtZXRyaWMgPT09ICdzdHJpbmcnICYmXG4gICAgICAgICAgICAgICAgWydhY2N1cmFjeScsICdhY2MnLCAnY3Jvc3NlbnRyb3B5JywgJ2NlJ10uaW5kZXhPZihtZXRyaWMpICE9PVxuICAgICAgICAgICAgICAgICAgICAtMSkge1xuICAgICAgICAgICAgICBjb25zdCBvdXRwdXRTaGFwZSA9IHRoaXMuaW50ZXJuYWxPdXRwdXRTaGFwZXNbaV07XG5cbiAgICAgICAgICAgICAgaWYgKG91dHB1dFNoYXBlW291dHB1dFNoYXBlLmxlbmd0aCAtIDFdID09PSAxIHx8XG4gICAgICAgICAgICAgICAgICB0aGlzLmxvc3NGdW5jdGlvbnNbaV0gPT09IGxvc3Nlcy5iaW5hcnlDcm9zc2VudHJvcHkpIHtcbiAgICAgICAgICAgICAgICAvLyBjYXNlOiBiaW5hcnkgYWNjdXJhY3kvY3Jvc3NlbnRyb3B5LlxuICAgICAgICAgICAgICAgIGlmIChbJ2FjY3VyYWN5JywgJ2FjYyddLmluZGV4T2YobWV0cmljKSAhPT0gLTEpIHtcbiAgICAgICAgICAgICAgICAgIGFjY0ZuID0gTWV0cmljcy5iaW5hcnlBY2N1cmFjeTtcbiAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKFsnY3Jvc3NlbnRyb3B5JywgJ2NlJ10uaW5kZXhPZihtZXRyaWMpICE9PSAtMSkge1xuICAgICAgICAgICAgICAgICAgYWNjRm4gPSBNZXRyaWNzLmJpbmFyeUNyb3NzZW50cm9weTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgIH0gZWxzZSBpZiAoXG4gICAgICAgICAgICAgICAgICB0aGlzLmxvc3NGdW5jdGlvbnNbaV0gPT09XG4gICAgICAgICAgICAgICAgICBsb3NzZXMuc3BhcnNlQ2F0ZWdvcmljYWxDcm9zc2VudHJvcHkpIHtcbiAgICAgICAgICAgICAgICAvLyBjYXNlOiBjYXRlZ29yaWNhbCBhY2N1cmFjeSAvIGNyb3NzZW50cm9weSB3aXRoIHNwYXJzZVxuICAgICAgICAgICAgICAgIC8vIHRhcmdldHMuXG4gICAgICAgICAgICAgICAgaWYgKFsnYWNjdXJhY3knLCAnYWNjJ10uaW5kZXhPZihtZXRyaWMpICE9PSAtMSkge1xuICAgICAgICAgICAgICAgICAgYWNjRm4gPSBNZXRyaWNzLnNwYXJzZUNhdGVnb3JpY2FsQWNjdXJhY3k7XG4gICAgICAgICAgICAgICAgfSBlbHNlIGlmIChbJ2Nyb3NzZW50cm9weScsICdjZSddLmluZGV4T2YobWV0cmljKSAhPT0gLTEpIHtcbiAgICAgICAgICAgICAgICAgIGFjY0ZuID0gTWV0cmljcy5zcGFyc2VDYXRlZ29yaWNhbENyb3NzZW50cm9weTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgLy8gY2FzZTogY2F0ZWdvcmljYWwgYWNjdXJhY3kgLyBjcm9zc2VudHJvcHkuXG4gICAgICAgICAgICAgICAgaWYgKFsnYWNjdXJhY3knLCAnYWNjJ10uaW5kZXhPZihtZXRyaWMpICE9PSAtMSkge1xuICAgICAgICAgICAgICAgICAgYWNjRm4gPSBNZXRyaWNzLmNhdGVnb3JpY2FsQWNjdXJhY3k7XG4gICAgICAgICAgICAgICAgfSBlbHNlIGlmIChbJ2Nyb3NzZW50cm9weScsICdjZSddLmluZGV4T2YobWV0cmljKSAhPT0gLTEpIHtcbiAgICAgICAgICAgICAgICAgIGFjY0ZuID0gTWV0cmljcy5jYXRlZ29yaWNhbENyb3NzZW50cm9weTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgbGV0IHN1ZmZpeDogc3RyaW5nO1xuICAgICAgICAgICAgICBpZiAoWydhY2N1cmFjeScsICdhY2MnXS5pbmRleE9mKG1ldHJpYykgIT09IC0xKSB7XG4gICAgICAgICAgICAgICAgc3VmZml4ID0gJ2FjYyc7XG4gICAgICAgICAgICAgIH0gZWxzZSBpZiAoWydjcm9zc2VudHJvcHknLCAnY2UnXS5pbmRleE9mKG1ldHJpYykgIT09IC0xKSB7XG4gICAgICAgICAgICAgICAgc3VmZml4ID0gJ2NlJztcbiAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAvLyBUT0RPKGNhaXMpOiBBZGQgd2VpZ2h0aW5nIGFjdHVhbGx5LlxuICAgICAgICAgICAgICB3ZWlnaHRlZE1ldHJpY0ZuID0gYWNjRm47XG4gICAgICAgICAgICAgIG1ldHJpY05hbWUgPSBtZXRyaWNOYW1lUHJlZml4ICsgc3VmZml4O1xuICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgY29uc3QgbWV0cmljRm4gPSBNZXRyaWNzLmdldChtZXRyaWMpO1xuICAgICAgICAgICAgICAvLyBUT0RPKGNhaXMpOiBBZGQgd2VpZ2h0aW5nIGFjdHVhbGx5LlxuICAgICAgICAgICAgICB3ZWlnaHRlZE1ldHJpY0ZuID0gbWV0cmljRm47XG4gICAgICAgICAgICAgIG1ldHJpY05hbWUgPVxuICAgICAgICAgICAgICAgICAgbWV0cmljTmFtZVByZWZpeCArIE1ldHJpY3MuZ2V0TG9zc09yTWV0cmljTmFtZShtZXRyaWMpO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAvLyBUT0RPKGNhaXMpOiBBZGQgd2VpZ2h0aW5nIGFuZCBtYXNraW5nIHRvIG1ldHJpY1Jlc3VsdC5cbiAgICAgICAgICAgIGxldCBtZXRyaWNSZXN1bHQ6IExvc3NPck1ldHJpY0ZuO1xuICAgICAgICAgICAgbmFtZVNjb3BlKG1ldHJpY05hbWUsICgpID0+IHtcbiAgICAgICAgICAgICAgbWV0cmljUmVzdWx0ID0gd2VpZ2h0ZWRNZXRyaWNGbjtcbiAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgYXBwZW5kTWV0cmljKGksIG1ldHJpY05hbWUsIG1ldHJpY1Jlc3VsdCk7XG4gICAgICAgICAgfVxuICAgICAgICB9O1xuXG4gICAgICAgIGhhbmRsZU1ldHJpY3Mob3V0cHV0TWV0cmljcyk7XG4gICAgICAgIC8vIFRPRE8oY2Fpcyk6IENhbGwgaGFuZGxlTWV0cmljcyB3aXRoIHdlaWdodHMuXG4gICAgICB9XG4gICAgfSk7XG5cbiAgICAvLyBQb3J0aW5nIE5vdGVzOiBHaXZlbiB0aGUgaW1wZXJhdGl2ZSBiYWNrZW5kIG9mIHRmanMtY29yZSxcbiAgICAvLyAgIHRoZXJlIGlzIG5vIG5lZWQgZm9yIGNvbnN0cnVjdGluZyB0aGUgc3ltYm9saWMgZ3JhcGggYW5kIHBsYWNlaG9sZGVycy5cbiAgICB0aGlzLmNvbGxlY3RlZFRyYWluYWJsZVdlaWdodHMgPSB0aGlzLnRyYWluYWJsZVdlaWdodHM7XG4gIH1cblxuICAvKipcbiAgICogQ2hlY2sgdHJhaW5hYmxlIHdlaWdodHMgY291bnQgY29uc2lzdGVuY3kuXG4gICAqXG4gICAqIFRoaXMgd2lsbCByYWlzZSBhIHdhcm5pbmcgaWYgYHRoaXMudHJhaW5hYmxlV2VpZ2h0c2AgYW5kXG4gICAqIGB0aGlzLmNvbGxlY3RlZFRyYWluYWJsZVdlaWdodHNgIGFyZSBpbmNvbnNpc3RlbnQgKGkuZS4sIGhhdmUgZGlmZmVyZW50XG4gICAqIG51bWJlcnMgb2YgcGFyYW1ldGVycykuXG4gICAqIEluY29uc2lzdGVuY3kgd2lsbCB0eXBpY2FsbHkgYXJpc2Ugd2hlbiBvbmUgbW9kaWZpZXMgYG1vZGVsLnRyYWluYWJsZWBcbiAgICogd2l0aG91dCBjYWxsaW5nIGBtb2RlbC5jb21waWxlKClgIGFnYWluLlxuICAgKi9cbiAgcHJvdGVjdGVkIGNoZWNrVHJhaW5hYmxlV2VpZ2h0c0NvbnNpc3RlbmN5KCk6IHZvaWQge1xuICAgIGlmICh0aGlzLmNvbGxlY3RlZFRyYWluYWJsZVdlaWdodHMgPT0gbnVsbCkge1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICBpZiAodGhpcy50cmFpbmFibGVXZWlnaHRzLmxlbmd0aCAhPT1cbiAgICAgICAgdGhpcy5jb2xsZWN0ZWRUcmFpbmFibGVXZWlnaHRzLmxlbmd0aCkge1xuICAgICAgY29uc29sZS53YXJuKFxuICAgICAgICAgICdEaXNjcmVwYW5jeSBiZXR3ZWVuIHRyYWluYWJsZXdlaWdodHMgYW5kIGNvbGxlY3RlZCB0cmFpbmFibGUgJyArXG4gICAgICAgICAgJ3dlaWdodHMuIERpZCB5b3Ugc2V0IGBtb2RlbC50cmFpbmFibGVgIHdpdGhvdXQgY2FsbGluZyAnICtcbiAgICAgICAgICAnYG1vZGVsLmNvbXBpbGUoKWAgYWZ0ZXJ3YXJkcz8nKTtcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogUmV0dXJucyB0aGUgbG9zcyB2YWx1ZSAmIG1ldHJpY3MgdmFsdWVzIGZvciB0aGUgbW9kZWwgaW4gdGVzdCBtb2RlLlxuICAgKlxuICAgKiBMb3NzIGFuZCBtZXRyaWNzIGFyZSBzcGVjaWZpZWQgZHVyaW5nIGBjb21waWxlKClgLCB3aGljaCBuZWVkcyB0byBoYXBwZW5cbiAgICogYmVmb3JlIGNhbGxzIHRvIGBldmFsdWF0ZSgpYC5cbiAgICpcbiAgICogQ29tcHV0YXRpb24gaXMgZG9uZSBpbiBiYXRjaGVzLlxuICAgKlxuICAgKiBgYGBqc1xuICAgKiBjb25zdCBtb2RlbCA9IHRmLnNlcXVlbnRpYWwoe1xuICAgKiAgIGxheWVyczogW3RmLmxheWVycy5kZW5zZSh7dW5pdHM6IDEsIGlucHV0U2hhcGU6IFsxMF19KV1cbiAgICogfSk7XG4gICAqIG1vZGVsLmNvbXBpbGUoe29wdGltaXplcjogJ3NnZCcsIGxvc3M6ICdtZWFuU3F1YXJlZEVycm9yJ30pO1xuICAgKiBjb25zdCByZXN1bHQgPSBtb2RlbC5ldmFsdWF0ZShcbiAgICogICAgIHRmLm9uZXMoWzgsIDEwXSksIHRmLm9uZXMoWzgsIDFdKSwge2JhdGNoU2l6ZTogNH0pO1xuICAgKiByZXN1bHQucHJpbnQoKTtcbiAgICogYGBgXG4gICAqXG4gICAqIEBwYXJhbSB4IGB0Zi5UZW5zb3JgIG9mIHRlc3QgZGF0YSwgb3IgYW4gYEFycmF5YCBvZiBgdGYuVGVuc29yYHMgaWYgdGhlXG4gICAqIG1vZGVsIGhhcyBtdWx0aXBsZSBpbnB1dHMuXG4gICAqIEBwYXJhbSB5IGB0Zi5UZW5zb3JgIG9mIHRhcmdldCBkYXRhLCBvciBhbiBgQXJyYXlgIG9mIGB0Zi5UZW5zb3JgcyBpZiB0aGVcbiAgICogbW9kZWwgaGFzIG11bHRpcGxlIG91dHB1dHMuXG4gICAqIEBwYXJhbSBhcmdzIEEgYE1vZGVsRXZhbHVhdGVBcmdzYCwgY29udGFpbmluZyBvcHRpb25hbCBmaWVsZHMuXG4gICAqXG4gICAqIEByZXR1cm4gYFNjYWxhcmAgdGVzdCBsb3NzIChpZiB0aGUgbW9kZWwgaGFzIGEgc2luZ2xlIG91dHB1dCBhbmQgbm9cbiAgICogICBtZXRyaWNzKSBvciBgQXJyYXlgIG9mIGBTY2FsYXJgcyAoaWYgdGhlIG1vZGVsIGhhcyBtdWx0aXBsZSBvdXRwdXRzXG4gICAqICAgYW5kL29yIG1ldHJpY3MpLiBUaGUgYXR0cmlidXRlIGBtb2RlbC5tZXRyaWNzTmFtZXNgXG4gICAqICAgd2lsbCBnaXZlIHlvdSB0aGUgZGlzcGxheSBsYWJlbHMgZm9yIHRoZSBzY2FsYXIgb3V0cHV0cy5cbiAgICpcbiAgICogQGRvYyB7aGVhZGluZzogJ01vZGVscycsIHN1YmhlYWRpbmc6ICdDbGFzc2VzJ31cbiAgICovXG4gIGV2YWx1YXRlKFxuICAgICAgeDogVGVuc29yfFRlbnNvcltdLCB5OiBUZW5zb3J8VGVuc29yW10sXG4gICAgICBhcmdzOiBNb2RlbEV2YWx1YXRlQXJncyA9IHt9KTogU2NhbGFyfFNjYWxhcltdIHtcbiAgICBjb25zdCBiYXRjaFNpemUgPSBhcmdzLmJhdGNoU2l6ZSA9PSBudWxsID8gMzIgOiBhcmdzLmJhdGNoU2l6ZTtcbiAgICBjaGVja0JhdGNoU2l6ZShiYXRjaFNpemUpO1xuXG4gICAgLy8gVE9ETyhjYWlzKTogU3RhbmRhcmRpemUgYGNvbmZpZy5zYW1wbGVXZWlnaHRzYCBhcyB3ZWxsLlxuICAgIC8vIFZhbGlkYXRlIHVzZXIgZGF0YS5cbiAgICBjb25zdCBjaGVja0JhdGNoQXhpcyA9IHRydWU7XG4gICAgY29uc3Qgc3RhbmRhcmRpemVkT3V0cyA9XG4gICAgICAgIHRoaXMuc3RhbmRhcmRpemVVc2VyRGF0YVhZKHgsIHksIGNoZWNrQmF0Y2hBeGlzLCBiYXRjaFNpemUpO1xuICAgIHRyeSB7XG4gICAgICAvLyBUT0RPKGNhaXMpOiBJZiB1c2VzIGB1c2VMZWFybmluZ1BoYXNlYCwgc2V0IHRoZSBjb3JyZXNwb25kaW5nIGVsZW1lbnRcbiAgICAgIC8vIG9mIHRoZSBpbnB1dCB0byAwLlxuICAgICAgY29uc3QgaW5zID0gc3RhbmRhcmRpemVkT3V0c1swXS5jb25jYXQoc3RhbmRhcmRpemVkT3V0c1sxXSk7XG4gICAgICB0aGlzLm1ha2VUZXN0RnVuY3Rpb24oKTtcbiAgICAgIGNvbnN0IGYgPSB0aGlzLnRlc3RGdW5jdGlvbjtcbiAgICAgIGNvbnN0IHRlc3RPdXRzID1cbiAgICAgICAgICB0aGlzLnRlc3RMb29wKGYsIGlucywgYmF0Y2hTaXplLCBhcmdzLnZlcmJvc2UsIGFyZ3Muc3RlcHMpO1xuICAgICAgcmV0dXJuIHNpbmdsZXRvbk9yQXJyYXkodGVzdE91dHMpO1xuICAgIH0gZmluYWxseSB7XG4gICAgICBkaXNwb3NlTmV3VGVuc29ycyhzdGFuZGFyZGl6ZWRPdXRzWzBdLCB4KTtcbiAgICAgIGRpc3Bvc2VOZXdUZW5zb3JzKHN0YW5kYXJkaXplZE91dHNbMV0sIHkpO1xuICAgIH1cbiAgfVxuXG4gIC8vIFRPRE8oY2Fpcyk6IEFkZCBjb2RlIHNuaXBwZXQgYmVsb3cgb25jZSByZWFsIGRhdGFzZXQgb2JqZWN0cyBhcmVcbiAgLy8gICBhdmFpbGFibGUuXG4gIC8qKlxuICAgKiBFdmFsdWF0ZSBtb2RlbCB1c2luZyBhIGRhdGFzZXQgb2JqZWN0LlxuICAgKlxuICAgKiBOb3RlOiBVbmxpa2UgYGV2YWx1YXRlKClgLCB0aGlzIG1ldGhvZCBpcyBhc3luY2hyb25vdXMgKGBhc3luY2ApLlxuICAgKlxuICAgKiBAcGFyYW0gZGF0YXNldCBBIGRhdGFzZXQgb2JqZWN0LiBJdHMgYGl0ZXJhdG9yKClgIG1ldGhvZCBpcyBleHBlY3RlZFxuICAgKiAgIHRvIGdlbmVyYXRlIGEgZGF0YXNldCBpdGVyYXRvciBvYmplY3QsIHRoZSBgbmV4dCgpYCBtZXRob2Qgb2Ygd2hpY2hcbiAgICogICBpcyBleHBlY3RlZCB0byBwcm9kdWNlIGRhdGEgYmF0Y2hlcyBmb3IgZXZhbHVhdGlvbi4gVGhlIHJldHVybiB2YWx1ZVxuICAgKiAgIG9mIHRoZSBgbmV4dCgpYCBjYWxsIG91Z2h0IHRvIGNvbnRhaW4gYSBib29sZWFuIGBkb25lYCBmaWVsZCBhbmQgYVxuICAgKiAgIGB2YWx1ZWAgZmllbGQuIFRoZSBgdmFsdWVgIGZpZWxkIGlzIGV4cGVjdGVkIHRvIGJlIGFuIGFycmF5IG9mIHR3b1xuICAgKiAgIGB0Zi5UZW5zb3JgcyBvciBhbiBhcnJheSBvZiB0d28gbmVzdGVkIGB0Zi5UZW5zb3JgIHN0cnVjdHVyZXMuIFRoZSBmb3JtZXJcbiAgICogICBjYXNlIGlzIGZvciBtb2RlbHMgd2l0aCBleGFjdGx5IG9uZSBpbnB1dCBhbmQgb25lIG91dHB1dCAoZS5nLlxuICAgKiAgIGEgc2VxdWVudGlhbCBtb2RlbCkuIFRoZSBsYXR0ZXIgY2FzZSBpcyBmb3IgbW9kZWxzIHdpdGggbXVsdGlwbGVcbiAgICogICBpbnB1dHMgYW5kL29yIG11bHRpcGxlIG91dHB1dHMuIE9mIHRoZSB0d28gaXRlbXMgaW4gdGhlIGFycmF5LCB0aGVcbiAgICogICBmaXJzdCBpcyB0aGUgaW5wdXQgZmVhdHVyZShzKSBhbmQgdGhlIHNlY29uZCBpcyB0aGUgb3V0cHV0IHRhcmdldChzKS5cbiAgICogQHBhcmFtIGFyZ3MgQSBjb25maWd1cmF0aW9uIG9iamVjdCBmb3IgdGhlIGRhdGFzZXQtYmFzZWQgZXZhbHVhdGlvbi5cbiAgICogQHJldHVybnMgTG9zcyBhbmQgbWV0cmljIHZhbHVlcyBhcyBhbiBBcnJheSBvZiBgU2NhbGFyYCBvYmplY3RzLlxuICAgKlxuICAgKiBAZG9jIHtoZWFkaW5nOiAnTW9kZWxzJywgc3ViaGVhZGluZzogJ0NsYXNzZXMnfVxuICAgKi9cbiAgYXN5bmMgZXZhbHVhdGVEYXRhc2V0KGRhdGFzZXQ6IERhdGFzZXQ8e30+LCBhcmdzPzogTW9kZWxFdmFsdWF0ZURhdGFzZXRBcmdzKTpcbiAgICAgIFByb21pc2U8U2NhbGFyfFNjYWxhcltdPiB7XG4gICAgdGhpcy5tYWtlVGVzdEZ1bmN0aW9uKCk7XG4gICAgcmV0dXJuIGV2YWx1YXRlRGF0YXNldCh0aGlzLCBkYXRhc2V0LCBhcmdzKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBHZXQgbnVtYmVyIG9mIHNhbXBsZXMgcHJvdmlkZWQgZm9yIHRyYWluaW5nLCBldmFsdWF0aW9uIG9yIHByZWRpY3Rpb24uXG4gICAqXG4gICAqIEBwYXJhbSBpbnMgSW5wdXQgYHRmLlRlbnNvcmAuXG4gICAqIEBwYXJhbSBiYXRjaFNpemUgSW50ZWdlciBiYXRjaCBzaXplLCBvcHRpb25hbC5cbiAgICogQHBhcmFtIHN0ZXBzIFRvdGFsIG51bWJlciBvZiBzdGVwcyAoYmF0Y2hlcyBvZiBzYW1wbGVzKSBiZWZvcmVcbiAgICogZGVjbGFyaW5nIGxvb3AgZmluaXNoZWQuIE9wdGlvbmFsLlxuICAgKiBAcGFyYW0gc3RlcHNOYW1lIFRoZSBwdWJsaWMgQVBJJ3MgcGFyYW1ldGVyIG5hbWUgZm9yIGBzdGVwc2AuXG4gICAqIEByZXR1cm5zIE51bWJlciBvZiBzYW1wbGVzIHByb3ZpZGVkLlxuICAgKi9cbiAgcHJpdmF0ZSBjaGVja051bVNhbXBsZXMoXG4gICAgICBpbnM6IFRlbnNvcnxUZW5zb3JbXSwgYmF0Y2hTaXplPzogbnVtYmVyLCBzdGVwcz86IG51bWJlcixcbiAgICAgIHN0ZXBzTmFtZSA9ICdzdGVwcycpOiBudW1iZXIge1xuICAgIGxldCBudW1TYW1wbGVzOiBudW1iZXI7XG4gICAgaWYgKHN0ZXBzICE9IG51bGwpIHtcbiAgICAgIG51bVNhbXBsZXMgPSBudWxsO1xuICAgICAgaWYgKGJhdGNoU2l6ZSAhPSBudWxsKSB7XG4gICAgICAgIHRocm93IG5ldyBWYWx1ZUVycm9yKFxuICAgICAgICAgICAgYElmICR7c3RlcHNOYW1lfSBpcyBzZXQsIGJhdGNoU2l6ZSBtdXN0IGJlIG51bGwgb3IgdW5kZWZpbmVkLmAgK1xuICAgICAgICAgICAgYEdvdCBiYXRjaFNpemUgPSAke2JhdGNoU2l6ZX1gKTtcbiAgICAgIH1cbiAgICB9IGVsc2UgaWYgKGlucyAhPSBudWxsKSB7XG4gICAgICBpZiAoQXJyYXkuaXNBcnJheShpbnMpKSB7XG4gICAgICAgIG51bVNhbXBsZXMgPSBpbnNbMF0uc2hhcGVbMF07XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBudW1TYW1wbGVzID0gaW5zLnNoYXBlWzBdO1xuICAgICAgfVxuICAgIH0gZWxzZSB7XG4gICAgICB0aHJvdyBuZXcgVmFsdWVFcnJvcihcbiAgICAgICAgICBgRWl0aGVyIHRoZSBpbnB1dCBkYXRhIHNob3VsZCBoYXZlIGEgZGVmaW5lZCBzaGFwZSwgb3IgYCArXG4gICAgICAgICAgYCR7c3RlcHNOYW1lfSBzaG91ZCBiZSBzcGVjaWZpZWQuYCk7XG4gICAgfVxuICAgIHJldHVybiBudW1TYW1wbGVzO1xuICB9XG5cbiAgLyoqXG4gICAqIEV4ZWN1dGUgaW50ZXJuYWwgdGVuc29ycyBvZiB0aGUgbW9kZWwgd2l0aCBpbnB1dCBkYXRhIGZlZWQuXG4gICAqIEBwYXJhbSBpbnB1dHMgSW5wdXQgZGF0YSBmZWVkLiBNdXN0IG1hdGNoIHRoZSBpbnB1dHMgb2YgdGhlIG1vZGVsLlxuICAgKiBAcGFyYW0gb3V0cHV0cyBOYW1lcyBvZiB0aGUgb3V0cHV0IHRlbnNvcnMgdG8gYmUgZmV0Y2hlZC4gTXVzdCBtYXRjaFxuICAgKiAgIG5hbWVzIG9mIHRoZSBTeW1ib2xpY1RlbnNvcnMgdGhhdCBiZWxvbmcgdG8gdGhlIGdyYXBoLlxuICAgKiBAcmV0dXJucyBGZXRjaGVkIHZhbHVlcyBmb3IgYG91dHB1dHNgLlxuICAgKi9cbiAgZXhlY3V0ZShpbnB1dHM6IFRlbnNvcnxUZW5zb3JbXXxOYW1lZFRlbnNvck1hcCwgb3V0cHV0czogc3RyaW5nfHN0cmluZ1tdKTpcbiAgICAgIFRlbnNvcnxUZW5zb3JbXSB7XG4gICAgaWYgKEFycmF5LmlzQXJyYXkob3V0cHV0cykgJiYgb3V0cHV0cy5sZW5ndGggPT09IDApIHtcbiAgICAgIHRocm93IG5ldyBWYWx1ZUVycm9yKFxuICAgICAgICAgICdgb3V0cHV0c2AgaXMgYW4gZW1wdHkgQXJyYXksIHdoaWNoIGlzIG5vdCBhbGxvd2VkLicpO1xuICAgIH1cblxuICAgIGNvbnN0IG91dHB1dHNJc0FycmF5ID0gQXJyYXkuaXNBcnJheShvdXRwdXRzKTtcbiAgICBjb25zdCBvdXRwdXROYW1lcyA9XG4gICAgICAgIChvdXRwdXRzSXNBcnJheSA/IG91dHB1dHMgYXMgc3RyaW5nW10gOiBbb3V0cHV0cyBhcyBzdHJpbmddKTtcbiAgICBjb25zdCBvdXRwdXRTeW1ib2xpY1RlbnNvcnMgPSB0aGlzLnJldHJpZXZlU3ltYm9saWNUZW5zb3JzKG91dHB1dE5hbWVzKTtcblxuICAgIC8vIEZvcm1hdCB0aGUgaW5wdXQgaW50byBhIEZlZWREaWN0LlxuICAgIGNvbnN0IGZlZWREaWN0ID0gbmV3IEZlZWREaWN0KCk7XG4gICAgaWYgKGlucHV0cyBpbnN0YW5jZW9mIFRlbnNvcikge1xuICAgICAgaW5wdXRzID0gW2lucHV0c107XG4gICAgfVxuICAgIGlmIChBcnJheS5pc0FycmF5KGlucHV0cykpIHtcbiAgICAgIGlmIChpbnB1dHMubGVuZ3RoICE9PSB0aGlzLmlucHV0cy5sZW5ndGgpIHtcbiAgICAgICAgdGhyb3cgbmV3IFZhbHVlRXJyb3IoXG4gICAgICAgICAgICBgVGhlIG51bWJlciBvZiBpbnB1dHMgcHJvdmlkZWQgKCR7aW5wdXRzLmxlbmd0aH0pIGAgK1xuICAgICAgICAgICAgYGRvZXMgbm90IG1hdGNoIHRoZSBudW1iZXIgb2YgaW5wdXRzIG9mIHRoaXMgbW9kZWwgYCArXG4gICAgICAgICAgICBgKCR7dGhpcy5pbnB1dHMubGVuZ3RofSkuYCk7XG4gICAgICB9XG4gICAgICBmb3IgKGxldCBpID0gMDsgaSA8IHRoaXMuaW5wdXRzLmxlbmd0aDsgKytpKSB7XG4gICAgICAgIGZlZWREaWN0LmFkZCh0aGlzLmlucHV0c1tpXSwgaW5wdXRzW2ldKTtcbiAgICAgIH1cbiAgICB9IGVsc2Uge1xuICAgICAgZm9yIChjb25zdCBpbnB1dCBvZiB0aGlzLmlucHV0cykge1xuICAgICAgICBjb25zdCB0ZW5zb3JWYWx1ZSA9IGlucHV0c1tpbnB1dC5uYW1lXTtcbiAgICAgICAgaWYgKHRlbnNvclZhbHVlID09IG51bGwpIHtcbiAgICAgICAgICB0aHJvdyBuZXcgVmFsdWVFcnJvcihcbiAgICAgICAgICAgICAgYE5vIHZhbHVlIGlzIHByb3ZpZGVkIGZvciB0aGUgbW9kZWwncyBpbnB1dCAke2lucHV0Lm5hbWV9YCk7XG4gICAgICAgIH1cbiAgICAgICAgZmVlZERpY3QuYWRkKGlucHV0LCB0ZW5zb3JWYWx1ZSk7XG4gICAgICB9XG4gICAgfVxuXG4gICAgLy8gUnVuIGV4ZWN1dGlvbi5cbiAgICBjb25zdCBleGVjdXRlT3V0cHV0cyA9IGV4ZWN1dGUob3V0cHV0U3ltYm9saWNUZW5zb3JzLCBmZWVkRGljdCkgYXMgVGVuc29yW107XG4gICAgcmV0dXJuIG91dHB1dHNJc0FycmF5ID8gZXhlY3V0ZU91dHB1dHMgOiBleGVjdXRlT3V0cHV0c1swXTtcbiAgfVxuXG4gIC8qKlxuICAgKiBSZXRyaWV2ZSB0aGUgbW9kZWwncyBpbnRlcm5hbCBzeW1ib2xpYyB0ZW5zb3JzIGZyb20gc3ltYm9saWMtdGVuc29yIG5hbWVzLlxuICAgKi9cbiAgcHJpdmF0ZSByZXRyaWV2ZVN5bWJvbGljVGVuc29ycyhzeW1ib2xpY1RlbnNvck5hbWVzOiBzdHJpbmdbXSk6XG4gICAgICBTeW1ib2xpY1RlbnNvcltdIHtcbiAgICBjb25zdCBvdXRwdXRTeW1ib2xpY1RlbnNvcnM6IFN5bWJvbGljVGVuc29yW10gPVxuICAgICAgICBweUxpc3RSZXBlYXQobnVsbCwgc3ltYm9saWNUZW5zb3JOYW1lcy5sZW5ndGgpO1xuICAgIGxldCBvdXRwdXRzUmVtYWluaW5nID0gc3ltYm9saWNUZW5zb3JOYW1lcy5sZW5ndGg7XG4gICAgZm9yIChjb25zdCBsYXllciBvZiB0aGlzLmxheWVycykge1xuICAgICAgY29uc3QgbGF5ZXJPdXRwdXRzOiBTeW1ib2xpY1RlbnNvcltdID1cbiAgICAgICAgICBBcnJheS5pc0FycmF5KGxheWVyLm91dHB1dCkgPyBsYXllci5vdXRwdXQgOiBbbGF5ZXIub3V0cHV0XTtcbiAgICAgIGNvbnN0IGxheWVyT3V0cHV0TmFtZXMgPSBsYXllck91dHB1dHMubWFwKG91dHB1dCA9PiBvdXRwdXQubmFtZSk7XG4gICAgICBmb3IgKGxldCBpID0gMDsgaSA8IHN5bWJvbGljVGVuc29yTmFtZXMubGVuZ3RoOyArK2kpIHtcbiAgICAgICAgY29uc3QgaW5kZXggPSBsYXllck91dHB1dE5hbWVzLmluZGV4T2Yoc3ltYm9saWNUZW5zb3JOYW1lc1tpXSk7XG4gICAgICAgIGlmIChpbmRleCAhPT0gLTEpIHtcbiAgICAgICAgICBvdXRwdXRTeW1ib2xpY1RlbnNvcnNbaV0gPSBsYXllck91dHB1dHNbaW5kZXhdO1xuICAgICAgICAgIG91dHB1dHNSZW1haW5pbmctLTtcbiAgICAgICAgfVxuICAgICAgICBpZiAob3V0cHV0c1JlbWFpbmluZyA9PT0gMCkge1xuICAgICAgICAgIGJyZWFrO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgICBpZiAob3V0cHV0c1JlbWFpbmluZyA9PT0gMCkge1xuICAgICAgICBicmVhaztcbiAgICAgIH1cbiAgICB9XG5cbiAgICBpZiAob3V0cHV0c1JlbWFpbmluZyA+IDApIHtcbiAgICAgIGNvbnN0IHJlbWFpbmluZ05hbWVzOiBzdHJpbmdbXSA9IFtdO1xuICAgICAgb3V0cHV0U3ltYm9saWNUZW5zb3JzLmZvckVhY2goKHRlbnNvciwgaSkgPT4ge1xuICAgICAgICBpZiAodGVuc29yID09IG51bGwpIHtcbiAgICAgICAgICByZW1haW5pbmdOYW1lcy5wdXNoKHN5bWJvbGljVGVuc29yTmFtZXNbaV0pO1xuICAgICAgICB9XG4gICAgICB9KTtcbiAgICAgIHRocm93IG5ldyBWYWx1ZUVycm9yKFxuICAgICAgICAgIGBDYW5ub3QgZmluZCBTeW1ib2xpY1RlbnNvcnMgZm9yIG91dHB1dCBuYW1lKHMpOiBgICtcbiAgICAgICAgICBgJHtKU09OLnN0cmluZ2lmeShyZW1haW5pbmdOYW1lcyl9YCk7XG4gICAgfVxuICAgIHJldHVybiBvdXRwdXRTeW1ib2xpY1RlbnNvcnM7XG4gIH1cblxuICAvKipcbiAgICogSGVscGVyIG1ldGhvZCB0byBsb29wIG92ZXIgc29tZSBkYXRhIGluIGJhdGNoZXMuXG4gICAqXG4gICAqIFBvcnRpbmcgTm90ZTogTm90IHVzaW5nIHRoZSBmdW5jdGlvbmFsIGFwcHJvYWNoIGluIHRoZSBQeXRob24gZXF1aXZhbGVudFxuICAgKiAgIGR1ZSB0byB0aGUgaW1wZXJhdGl2ZSBiYWNrZW5kLlxuICAgKiBQb3J0aW5nIE5vdGU6IERvZXMgbm90IHN1cHBvcnQgc3RlcCBtb2RlIGN1cnJlbnRseS5cbiAgICpcbiAgICogQHBhcmFtIGluczogaW5wdXQgZGF0YVxuICAgKiBAcGFyYW0gYmF0Y2hTaXplOiBpbnRlZ2VyIGJhdGNoIHNpemUuXG4gICAqIEBwYXJhbSB2ZXJib3NlOiB2ZXJib3NpdHkgbW9kZWxcbiAgICogQHJldHVybnM6IFByZWRpY3Rpb25zIGFzIGB0Zi5UZW5zb3JgIChpZiBhIHNpbmdsZSBvdXRwdXQpIG9yIGFuIGBBcnJheWAgb2ZcbiAgICogICBgdGYuVGVuc29yYCAoaWYgbXVsdGlwZSBvdXRwdXRzKS5cbiAgICovXG4gIHByaXZhdGUgcHJlZGljdExvb3AoaW5zOiBUZW5zb3J8VGVuc29yW10sIGJhdGNoU2l6ZSA9IDMyLCB2ZXJib3NlID0gZmFsc2UpOlxuICAgICAgVGVuc29yfFRlbnNvcltdIHtcbiAgICByZXR1cm4gdGZjLnRpZHkoKCkgPT4ge1xuICAgICAgY29uc3QgbnVtU2FtcGxlcyA9IHRoaXMuY2hlY2tOdW1TYW1wbGVzKGlucyk7XG4gICAgICBpZiAodmVyYm9zZSkge1xuICAgICAgICB0aHJvdyBuZXcgTm90SW1wbGVtZW50ZWRFcnJvcihcbiAgICAgICAgICAgICdWZXJib3NlIHByZWRpY3RMb29wKCkgaXMgbm90IGltcGxlbWVudGVkIHlldC4nKTtcbiAgICAgIH1cblxuICAgICAgLy8gU2FtcGxlLWJhc2VkIHByZWRpY3Rpb25zLlxuICAgICAgLy8gUG9ydGluZyBOb3RlOiBUZW5zb3IgY3VycmVudGx5IGRvZXMgbm90IHN1cHBvcnQgc2xpY2VkIGFzc2lnbm1lbnRzIGFzXG4gICAgICAvLyAgIGluIG51bXB5LCBlLmcuLCB4WzE6M10gPSB5LiBUaGVyZWZvcmUgd2UgdXNlIGNvbmNhdGVuYXRpb24gd2hpbGVcbiAgICAgIC8vICAgaXRlcmF0aW5nIG92ZXIgdGhlIGJhdGNoZXMuXG5cbiAgICAgIGNvbnN0IGJhdGNoZXMgPSBtYWtlQmF0Y2hlcyhudW1TYW1wbGVzLCBiYXRjaFNpemUpO1xuICAgICAgY29uc3Qgb3V0c0JhdGNoZXM6IFRlbnNvcltdW10gPSB0aGlzLm91dHB1dHMubWFwKG91dHB1dCA9PiBbXSk7XG5cbiAgICAgIC8vIFRPRE8oY2Fpcyk6IENhbiB0aGUgc2NvcGUoKSBiZSBwdXNoZWQgZG93biBpbnNpZGUgdGhlIGZvciBsb29wP1xuICAgICAgZm9yIChsZXQgYmF0Y2hJbmRleCA9IDA7IGJhdGNoSW5kZXggPCBiYXRjaGVzLmxlbmd0aDsgKytiYXRjaEluZGV4KSB7XG4gICAgICAgIGNvbnN0IGJhdGNoT3V0cyA9IHRmYy50aWR5KCgpID0+IHtcbiAgICAgICAgICBjb25zdCBiYXRjaFN0YXJ0ID0gYmF0Y2hlc1tiYXRjaEluZGV4XVswXTtcbiAgICAgICAgICBjb25zdCBiYXRjaEVuZCA9IGJhdGNoZXNbYmF0Y2hJbmRleF1bMV07XG4gICAgICAgICAgLy8gVE9ETyhjYWlzKTogVGFrZSBjYXJlIG9mIHRoZSBjYXNlIG9mIHRoZSBsYXN0IGVsZW1lbnQgaXMgYSBmbGFnIGZvclxuICAgICAgICAgIC8vICAgdHJhaW5pbmcvdGVzdC5cbiAgICAgICAgICBjb25zdCBpbnNCYXRjaCA9IHNsaWNlQXJyYXlzKGlucywgYmF0Y2hTdGFydCwgYmF0Y2hFbmQpO1xuXG4gICAgICAgICAgLy8gQ29uc3RydWN0IHRoZSBmZWVkcyBmb3IgZXhlY3V0ZSgpO1xuICAgICAgICAgIGNvbnN0IGZlZWRzID0gW107XG4gICAgICAgICAgaWYgKEFycmF5LmlzQXJyYXkoaW5zQmF0Y2gpKSB7XG4gICAgICAgICAgICBmb3IgKGxldCBpID0gMDsgaSA8IGluc0JhdGNoLmxlbmd0aDsgKytpKSB7XG4gICAgICAgICAgICAgIGZlZWRzLnB1c2goe2tleTogdGhpcy5pbnB1dHNbaV0sIHZhbHVlOiBpbnNCYXRjaFtpXX0pO1xuICAgICAgICAgICAgfVxuICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICBmZWVkcy5wdXNoKHtrZXk6IHRoaXMuaW5wdXRzWzBdLCB2YWx1ZTogaW5zQmF0Y2h9KTtcbiAgICAgICAgICB9XG4gICAgICAgICAgY29uc3QgZmVlZERpY3QgPSBuZXcgRmVlZERpY3QoZmVlZHMpO1xuICAgICAgICAgIHJldHVybiBleGVjdXRlKHRoaXMub3V0cHV0cywgZmVlZERpY3QpIGFzIFRlbnNvcltdO1xuICAgICAgICB9KTtcbiAgICAgICAgYmF0Y2hPdXRzLmZvckVhY2goKGJhdGNoT3V0LCBpKSA9PiBvdXRzQmF0Y2hlc1tpXS5wdXNoKGJhdGNoT3V0KSk7XG4gICAgICB9XG4gICAgICByZXR1cm4gc2luZ2xldG9uT3JBcnJheShcbiAgICAgICAgICBvdXRzQmF0Y2hlcy5tYXAoYmF0Y2hlcyA9PiB0ZmMuY29uY2F0KGJhdGNoZXMsIDApKSk7XG4gICAgfSk7XG4gIH1cblxuICAvKipcbiAgICogR2VuZXJhdGVzIG91dHB1dCBwcmVkaWN0aW9ucyBmb3IgdGhlIGlucHV0IHNhbXBsZXMuXG4gICAqXG4gICAqIENvbXB1dGF0aW9uIGlzIGRvbmUgaW4gYmF0Y2hlcy5cbiAgICpcbiAgICogTm90ZTogdGhlIFwic3RlcFwiIG1vZGUgb2YgcHJlZGljdCgpIGlzIGN1cnJlbnRseSBub3Qgc3VwcG9ydGVkLlxuICAgKiAgIFRoaXMgaXMgYmVjYXVzZSB0aGUgVGVuc29yRmxvdy5qcyBjb3JlIGJhY2tlbmQgaXMgaW1wZXJhdGl2ZSBvbmx5LlxuICAgKlxuICAgKiBgYGBqc1xuICAgKiBjb25zdCBtb2RlbCA9IHRmLnNlcXVlbnRpYWwoe1xuICAgKiAgIGxheWVyczogW3RmLmxheWVycy5kZW5zZSh7dW5pdHM6IDEsIGlucHV0U2hhcGU6IFsxMF19KV1cbiAgICogfSk7XG4gICAqIG1vZGVsLnByZWRpY3QodGYub25lcyhbOCwgMTBdKSwge2JhdGNoU2l6ZTogNH0pLnByaW50KCk7XG4gICAqIGBgYFxuICAgKlxuICAgKiBAcGFyYW0geCBUaGUgaW5wdXQgZGF0YSwgYXMgYSBUZW5zb3IsIG9yIGFuIGBBcnJheWAgb2YgYHRmLlRlbnNvcmBzIGlmXG4gICAqICAgdGhlIG1vZGVsIGhhcyBtdWx0aXBsZSBpbnB1dHMuXG4gICAqIEBwYXJhbSBhcmdzIEEgYE1vZGVsUHJlZGljdEFyZ3NgIG9iamVjdCBjb250YWluaW5nIG9wdGlvbmFsIGZpZWxkcy5cbiAgICpcbiAgICogQHJldHVybiBQcmVkaWN0aW9uIHJlc3VsdHMgYXMgYSBgdGYuVGVuc29yYChzKS5cbiAgICpcbiAgICogQGV4Y2VwdGlvbiBWYWx1ZUVycm9yIEluIGNhc2Ugb2YgbWlzbWF0Y2ggYmV0d2VlbiB0aGUgcHJvdmlkZWQgaW5wdXQgZGF0YVxuICAgKiAgIGFuZCB0aGUgbW9kZWwncyBleHBlY3RhdGlvbnMsIG9yIGluIGNhc2UgYSBzdGF0ZWZ1bCBtb2RlbCByZWNlaXZlcyBhXG4gICAqICAgbnVtYmVyIG9mIHNhbXBsZXMgdGhhdCBpcyBub3QgYSBtdWx0aXBsZSBvZiB0aGUgYmF0Y2ggc2l6ZS5cbiAgICpcbiAgICogQGRvYyB7aGVhZGluZzogJ01vZGVscycsIHN1YmhlYWRpbmc6ICdDbGFzc2VzJ31cbiAgICovXG4gIHByZWRpY3QoeDogVGVuc29yfFRlbnNvcltdLCBhcmdzOiBNb2RlbFByZWRpY3RBcmdzID0ge30pOiBUZW5zb3J8VGVuc29yW10ge1xuICAgIGNvbnN0IHhzUmFuazJPckhpZ2hlciA9IGVuc3VyZVRlbnNvcnNSYW5rMk9ySGlnaGVyKHgpO1xuICAgIGNoZWNrSW5wdXREYXRhKFxuICAgICAgICB4c1JhbmsyT3JIaWdoZXIsIHRoaXMuaW5wdXROYW1lcywgdGhpcy5mZWVkSW5wdXRTaGFwZXMsIGZhbHNlKTtcbiAgICB0cnkge1xuICAgICAgLy8gVE9ETyhjYWlzKTogVGFrZSBjYXJlIG9mIHN0YXRlZnVsIG1vZGVscy5cbiAgICAgIC8vICAgaWYgKHRoaXMuc3RhdGVmdWwpIC4uLlxuICAgICAgLy8gVE9ETyhjYWlzKTogVGFrZSBjYXJlIG9mIHRoZSBsZWFybmluZ19waGFzZSBib29sZWFuIGZsYWcuXG4gICAgICAvLyAgIGlmICh0aGlzLnVzZUxlYXJuaW5nUGhhc2UpIC4uLlxuICAgICAgY29uc3QgYmF0Y2hTaXplID0gYXJncy5iYXRjaFNpemUgPT0gbnVsbCA/IDMyIDogYXJncy5iYXRjaFNpemU7XG4gICAgICBjaGVja0JhdGNoU2l6ZShiYXRjaFNpemUpO1xuICAgICAgcmV0dXJuIHRoaXMucHJlZGljdExvb3AoeHNSYW5rMk9ySGlnaGVyLCBiYXRjaFNpemUpO1xuICAgIH0gZmluYWxseSB7XG4gICAgICBkaXNwb3NlTmV3VGVuc29ycyh4c1JhbmsyT3JIaWdoZXIsIHgpO1xuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBSZXR1cm5zIHByZWRpY3Rpb25zIGZvciBhIHNpbmdsZSBiYXRjaCBvZiBzYW1wbGVzLlxuICAgKlxuICAgKiBgYGBqc1xuICAgKiBjb25zdCBtb2RlbCA9IHRmLnNlcXVlbnRpYWwoe1xuICAgKiAgIGxheWVyczogW3RmLmxheWVycy5kZW5zZSh7dW5pdHM6IDEsIGlucHV0U2hhcGU6IFsxMF19KV1cbiAgICogfSk7XG4gICAqIG1vZGVsLnByZWRpY3RPbkJhdGNoKHRmLm9uZXMoWzgsIDEwXSkpLnByaW50KCk7XG4gICAqIGBgYFxuICAgKiBAcGFyYW0geDogSW5wdXQgc2FtcGxlcywgYXMgYSBUZW5zb3IgKGZvciBtb2RlbHMgd2l0aCBleGFjdGx5IG9uZVxuICAgKiAgIGlucHV0KSBvciBhbiBhcnJheSBvZiBUZW5zb3JzIChmb3IgbW9kZWxzIHdpdGggbW9yZSB0aGFuIG9uZSBpbnB1dCkuXG4gICAqIEByZXR1cm4gVGVuc29yKHMpIG9mIHByZWRpY3Rpb25zXG4gICAqXG4gICAqIEBkb2Mge2hlYWRpbmc6ICdNb2RlbHMnLCBzdWJoZWFkaW5nOiAnQ2xhc3Nlcyd9XG4gICAqL1xuICBwcmVkaWN0T25CYXRjaCh4OiBUZW5zb3J8VGVuc29yW10pOiBUZW5zb3J8VGVuc29yW10ge1xuICAgIGNoZWNrSW5wdXREYXRhKHgsIHRoaXMuaW5wdXROYW1lcywgdGhpcy5mZWVkSW5wdXRTaGFwZXMsIHRydWUpO1xuICAgIC8vIFRPRE8oY2Fpcyk6IFRha2UgY2FyZSBvZiB0aGUgbGVhcm5pbmdfcGhhc2UgYm9vbGVhbiBmbGFnLlxuICAgIC8vICAgaWYgKHRoaXMudXNlTGVhcm5pbmdQaGFzZSkgLi4uXG4gICAgY29uc3QgYmF0Y2hTaXplID0gKEFycmF5LmlzQXJyYXkoeCkgPyB4WzBdIDogeCkuc2hhcGVbMF07XG4gICAgcmV0dXJuIHRoaXMucHJlZGljdExvb3AoeCwgYmF0Y2hTaXplKTtcbiAgfVxuXG4gIHByb3RlY3RlZCBzdGFuZGFyZGl6ZVVzZXJEYXRhWFkoXG4gICAgICB4OiBUZW5zb3J8VGVuc29yW118e1tpbnB1dE5hbWU6IHN0cmluZ106IFRlbnNvcn0sXG4gICAgICB5OiBUZW5zb3J8VGVuc29yW118e1tpbnB1dE5hbWU6IHN0cmluZ106IFRlbnNvcn0sIGNoZWNrQmF0Y2hBeGlzID0gdHJ1ZSxcbiAgICAgIGJhdGNoU2l6ZT86IG51bWJlcik6IFtUZW5zb3JbXSwgVGVuc29yW11dIHtcbiAgICAvLyBUT0RPKGNhaXMpOiBBZGQgc2FtcGxlV2VpZ2h0LCBjbGFzc1dlaWdodFxuICAgIGlmICh0aGlzLm9wdGltaXplcl8gPT0gbnVsbCkge1xuICAgICAgdGhyb3cgbmV3IFJ1bnRpbWVFcnJvcihcbiAgICAgICAgICAnWW91IG11c3QgY29tcGlsZSBhIG1vZGVsIGJlZm9yZSB0cmFpbmluZy90ZXN0aW5nLiBVc2UgJyArXG4gICAgICAgICAgJ0xheWVyc01vZGVsLmNvbXBpbGUobW9kZWxDb21waWxlQXJncykuJyk7XG4gICAgfVxuICAgIGNvbnN0IG91dHB1dFNoYXBlczogU2hhcGVbXSA9IFtdO1xuICAgIGZvciAobGV0IGkgPSAwOyBpIDwgdGhpcy5mZWVkT3V0cHV0U2hhcGVzLmxlbmd0aDsgKytpKSB7XG4gICAgICBjb25zdCBvdXRwdXRTaGFwZSA9IHRoaXMuZmVlZE91dHB1dFNoYXBlc1tpXTtcbiAgICAgIGNvbnN0IGxvc3NGbiA9IHRoaXMuZmVlZExvc3NGbnNbaV07XG4gICAgICBpZiAobG9zc0ZuID09PSBsb3NzZXMuc3BhcnNlQ2F0ZWdvcmljYWxDcm9zc2VudHJvcHkpIHtcbiAgICAgICAgb3V0cHV0U2hhcGVzLnB1c2goXG4gICAgICAgICAgICBvdXRwdXRTaGFwZS5zbGljZSgwLCBvdXRwdXRTaGFwZS5sZW5ndGggLSAxKS5jb25jYXQoWzFdKSk7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICAvLyBQb3J0aW5nIE5vdGU6IEJlY2F1c2Ugb2Ygc3Ryb25nIHR5cGluZyBgbG9zc0ZuYCBtdXN0IGJlIGEgZnVuY3Rpb24uXG4gICAgICAgIG91dHB1dFNoYXBlcy5wdXNoKG91dHB1dFNoYXBlKTtcbiAgICAgIH1cbiAgICB9XG4gICAgeCA9IHN0YW5kYXJkaXplSW5wdXREYXRhKFxuICAgICAgICB4LCB0aGlzLmZlZWRJbnB1dE5hbWVzLCB0aGlzLmZlZWRJbnB1dFNoYXBlcywgZmFsc2UsICdpbnB1dCcpO1xuICAgIHkgPSBzdGFuZGFyZGl6ZUlucHV0RGF0YShcbiAgICAgICAgeSwgdGhpcy5mZWVkT3V0cHV0TmFtZXMsIG91dHB1dFNoYXBlcywgZmFsc2UsICd0YXJnZXQnKTtcbiAgICAvLyBUT0RPKGNhaXMpOiBTdGFuZGFyZGl6ZSBzYW1wbGVXZWlnaHRzICYgY2xhc3NXZWlnaHRzLlxuICAgIGNoZWNrQXJyYXlMZW5ndGhzKHgsIHksIG51bGwpO1xuICAgIC8vIFRPRE8oY2Fpcyk6IENoZWNrIHNhbXBsZVdlaWdodHMgYXMgd2VsbC5cbiAgICBjaGVja0xvc3NBbmRUYXJnZXRDb21wYXRpYmlsaXR5KHksIHRoaXMuZmVlZExvc3NGbnMsIHRoaXMuZmVlZE91dHB1dFNoYXBlcyk7XG4gICAgaWYgKHRoaXMuc3RhdGVmdWwgJiYgYmF0Y2hTaXplICE9IG51bGwgJiYgYmF0Y2hTaXplID4gMCkge1xuICAgICAgaWYgKHhbMF0uc2hhcGVbMF0gJSBiYXRjaFNpemUgIT09IDApIHtcbiAgICAgICAgdGhyb3cgbmV3IFZhbHVlRXJyb3IoXG4gICAgICAgICAgICBgSW4gYSBzdGF0ZWZ1bCBuZXR3b3JrLCB5b3Ugc2hvdWxkIG9ubHkgcGFzcyBpbnB1dHMgd2l0aCBhIGAgK1xuICAgICAgICAgICAgYG51bWJlciBvZiBzYW1wbGVzIHRoYXQgaXMgZGl2aXNpYmxlIGJ5IHRoZSBiYXRjaCBzaXplIGAgK1xuICAgICAgICAgICAgYCR7YmF0Y2hTaXplfS4gRm91bmQ6ICR7eFswXS5zaGFwZVswXX0gc2FtcGxlKHMpLmApO1xuICAgICAgfVxuICAgIH1cbiAgICByZXR1cm4gW3gsIHldO1xuICB9XG5cbiAgcHJvdGVjdGVkIGFzeW5jIHN0YW5kYXJkaXplVXNlckRhdGEoXG4gICAgICB4OiBUZW5zb3J8VGVuc29yW118e1tpbnB1dE5hbWU6IHN0cmluZ106IFRlbnNvcn0sXG4gICAgICB5OiBUZW5zb3J8VGVuc29yW118e1tpbnB1dE5hbWU6IHN0cmluZ106IFRlbnNvcn0sXG4gICAgICBzYW1wbGVXZWlnaHQ/OiBUZW5zb3J8VGVuc29yW118e1tvdXRwdXROYW1lOiBzdHJpbmddOiBUZW5zb3J9LFxuICAgICAgY2xhc3NXZWlnaHQ/OiBDbGFzc1dlaWdodHxDbGFzc1dlaWdodFtdfENsYXNzV2VpZ2h0TWFwLFxuICAgICAgY2hlY2tCYXRjaEF4aXMgPSB0cnVlLFxuICAgICAgYmF0Y2hTaXplPzogbnVtYmVyKTogUHJvbWlzZTxbVGVuc29yW10sIFRlbnNvcltdLCBUZW5zb3JbXV0+IHtcbiAgICBjb25zdCBbc3RhbmRhcmRYcywgc3RhbmRhcmRZc10gPVxuICAgICAgICB0aGlzLnN0YW5kYXJkaXplVXNlckRhdGFYWSh4LCB5LCBjaGVja0JhdGNoQXhpcywgYmF0Y2hTaXplKTtcbiAgICAvLyBUT0RPKGNhaXMpOiBIYW5kbGUgc2FtcGxlV2VpZ2h0cy5cbiAgICBpZiAoc2FtcGxlV2VpZ2h0ICE9IG51bGwpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcignc2FtcGxlIHdlaWdodCBpcyBub3Qgc3VwcG9ydGVkIHlldC4nKTtcbiAgICB9XG5cbiAgICBsZXQgc3RhbmRhcmRTYW1wbGVXZWlnaHRzOiBUZW5zb3JbXSA9IG51bGw7XG4gICAgaWYgKGNsYXNzV2VpZ2h0ICE9IG51bGwpIHtcbiAgICAgIGNvbnN0IGNsYXNzV2VpZ2h0cyA9XG4gICAgICAgICAgc3RhbmRhcmRpemVDbGFzc1dlaWdodHMoY2xhc3NXZWlnaHQsIHRoaXMub3V0cHV0TmFtZXMpO1xuICAgICAgc3RhbmRhcmRTYW1wbGVXZWlnaHRzID0gW107XG4gICAgICBmb3IgKGxldCBpID0gMDsgaSA8IGNsYXNzV2VpZ2h0cy5sZW5ndGg7ICsraSkge1xuICAgICAgICBzdGFuZGFyZFNhbXBsZVdlaWdodHMucHVzaChcbiAgICAgICAgICAgIGF3YWl0IHN0YW5kYXJkaXplV2VpZ2h0cyhzdGFuZGFyZFlzW2ldLCBudWxsLCBjbGFzc1dlaWdodHNbaV0pKTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICAvLyBUT0RPKGNhaXMpOiBEZWFsIHdpdGggdGhlIGNhc2Ugb2YgbW9kZWwuc3RhdGVmdWwgPT0gdHJ1ZS5cbiAgICByZXR1cm4gW3N0YW5kYXJkWHMsIHN0YW5kYXJkWXMsIHN0YW5kYXJkU2FtcGxlV2VpZ2h0c107XG4gIH1cblxuICAvKipcbiAgICogTG9vcCBvdmVyIHNvbWUgdGVzdCBkYXRhIGluIGJhdGNoZXMuXG4gICAqIEBwYXJhbSBmIEEgRnVuY3Rpb24gcmV0dXJuaW5nIGEgbGlzdCBvZiB0ZW5zb3JzLlxuICAgKiBAcGFyYW0gaW5zIEFycmF5IG9mIHRlbnNvcnMgdG8gYmUgZmVkIHRvIGBmYC5cbiAgICogQHBhcmFtIGJhdGNoU2l6ZSBJbnRlZ2VyIGJhdGNoIHNpemUgb3IgYG51bGxgIC8gYHVuZGVmaW5lZGAuXG4gICAqIEBwYXJhbSB2ZXJib3NlIHZlcmJvc2l0eSBtb2RlLlxuICAgKiBAcGFyYW0gc3RlcHMgVG90YWwgbnVtYmVyIG9mIHN0ZXBzIChiYXRjaGVzIG9mIHNhbXBsZXMpIGJlZm9yZVxuICAgKiBkZWNsYXJpbmcgdGVzdCBmaW5pc2hlZC4gSWdub3JlZCB3aXRoIHRoZSBkZWZhdWx0IHZhbHVlIG9mIGBudWxsYCAvXG4gICAqIGB1bmRlZmluZWRgLlxuICAgKiBAcmV0dXJucyBBcnJheSBvZiBTY2FsYXJzLlxuICAgKi9cbiAgcHJpdmF0ZSB0ZXN0TG9vcChcbiAgICAgIGY6IChkYXRhOiBUZW5zb3JbXSkgPT4gU2NhbGFyW10sIGluczogVGVuc29yW10sIGJhdGNoU2l6ZT86IG51bWJlcixcbiAgICAgIHZlcmJvc2UgPSAwLCBzdGVwcz86IG51bWJlcik6IFNjYWxhcltdIHtcbiAgICByZXR1cm4gdGZjLnRpZHkoKCkgPT4ge1xuICAgICAgY29uc3QgbnVtU2FtcGxlcyA9IHRoaXMuY2hlY2tOdW1TYW1wbGVzKGlucywgYmF0Y2hTaXplLCBzdGVwcywgJ3N0ZXBzJyk7XG4gICAgICBjb25zdCBvdXRzOiBTY2FsYXJbXSA9IFtdO1xuICAgICAgaWYgKHZlcmJvc2UgPiAwKSB7XG4gICAgICAgIHRocm93IG5ldyBOb3RJbXBsZW1lbnRlZEVycm9yKCdWZXJib3NlIG1vZGUgaXMgbm90IGltcGxlbWVudGVkIHlldC4nKTtcbiAgICAgIH1cbiAgICAgIC8vIFRPRE8oY2Fpcyk6IFVzZSBgaW5kaWNlc0ZvckNvbnZlcnNpb25Ub0RlbnNlJyB0byBwcmV2ZW50IHNsb3cgZG93bi5cbiAgICAgIGlmIChzdGVwcyAhPSBudWxsKSB7XG4gICAgICAgIHRocm93IG5ldyBOb3RJbXBsZW1lbnRlZEVycm9yKFxuICAgICAgICAgICAgJ3N0ZXBzIG1vZGUgaW4gdGVzdExvb3AoKSBpcyBub3QgaW1wbGVtZW50ZWQgeWV0Jyk7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBjb25zdCBiYXRjaGVzID0gbWFrZUJhdGNoZXMobnVtU2FtcGxlcywgYmF0Y2hTaXplKTtcbiAgICAgICAgY29uc3QgaW5kZXhBcnJheSA9IHRlbnNvcjFkKHJhbmdlKDAsIG51bVNhbXBsZXMpKTtcbiAgICAgICAgZm9yIChsZXQgYmF0Y2hJbmRleCA9IDA7IGJhdGNoSW5kZXggPCBiYXRjaGVzLmxlbmd0aDsgKytiYXRjaEluZGV4KSB7XG4gICAgICAgICAgY29uc3QgYmF0Y2hTdGFydCA9IGJhdGNoZXNbYmF0Y2hJbmRleF1bMF07XG4gICAgICAgICAgY29uc3QgYmF0Y2hFbmQgPSBiYXRjaGVzW2JhdGNoSW5kZXhdWzFdO1xuICAgICAgICAgIGNvbnN0IGJhdGNoSWRzID1cbiAgICAgICAgICAgICAgSy5zbGljZUFsb25nRmlyc3RBeGlzKFxuICAgICAgICAgICAgICAgICAgaW5kZXhBcnJheSwgYmF0Y2hTdGFydCwgYmF0Y2hFbmQgLSBiYXRjaFN0YXJ0KSBhcyBUZW5zb3IxRDtcbiAgICAgICAgICAvLyBUT0RPKGNhaXMpOiBJbiBpbnMsIHRyYWluIGZsYWcgY2FuIGJlIGEgbnVtYmVyLCBpbnN0ZWFkIG9mIGFuXG4gICAgICAgICAgLy8gICBUZW5zb3I/IERvIHdlIG5lZWQgdG8gaGFuZGxlIHRoaXMgaW4gdGZqcy1sYXllcnM/XG4gICAgICAgICAgY29uc3QgaW5zQmF0Y2ggPSBzbGljZUFycmF5c0J5SW5kaWNlcyhpbnMsIGJhdGNoSWRzKSBhcyBTY2FsYXJbXTtcbiAgICAgICAgICBjb25zdCBiYXRjaE91dHMgPSBmKGluc0JhdGNoKTtcbiAgICAgICAgICBpZiAoYmF0Y2hJbmRleCA9PT0gMCkge1xuICAgICAgICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCBiYXRjaE91dHMubGVuZ3RoOyArK2kpIHtcbiAgICAgICAgICAgICAgb3V0cy5wdXNoKHNjYWxhcigwKSk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgfVxuICAgICAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgYmF0Y2hPdXRzLmxlbmd0aDsgKytpKSB7XG4gICAgICAgICAgICBjb25zdCBiYXRjaE91dCA9IGJhdGNoT3V0c1tpXTtcbiAgICAgICAgICAgIG91dHNbaV0gPVxuICAgICAgICAgICAgICAgIHRmYy5hZGQob3V0c1tpXSwgdGZjLm11bChiYXRjaEVuZCAtIGJhdGNoU3RhcnQsIGJhdGNoT3V0KSk7XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgb3V0cy5sZW5ndGg7ICsraSkge1xuICAgICAgICAgIG91dHNbaV0gPSB0ZmMuZGl2KG91dHNbaV0sIG51bVNhbXBsZXMpO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgICByZXR1cm4gb3V0cztcbiAgICB9KTtcbiAgfVxuXG4gIHByb3RlY3RlZCBnZXREZWR1cGVkTWV0cmljc05hbWVzKCk6IHN0cmluZ1tdIHtcbiAgICBjb25zdCBvdXRMYWJlbHMgPSB0aGlzLm1ldHJpY3NOYW1lcztcbiAgICAvLyBSZW5hbWUgZHVwbGljYXRlZCBtZXRyaWNzIG5hbWVzIChjYW4gaGFwcGVuIHdpdGggYW4gb3V0cHV0IGxheWVyXG4gICAgLy8gc2hhcmVkIGFtb25nIG11bHRpcGxlIGRhdGFmbG93cykuXG4gICAgY29uc3QgZGVkdXBlZE91dExhYmVscyA9IFtdO1xuICAgIGZvciAobGV0IGkgPSAwOyBpIDwgb3V0TGFiZWxzLmxlbmd0aDsgKytpKSB7XG4gICAgICBjb25zdCBsYWJlbCA9IG91dExhYmVsc1tpXTtcbiAgICAgIGxldCBuZXdMYWJlbCA9IGxhYmVsO1xuICAgICAgaWYgKGNvdW50KG91dExhYmVscywgbGFiZWwpID4gMSkge1xuICAgICAgICBjb25zdCBkdXBJbmRleCA9IGNvdW50KG91dExhYmVscy5zbGljZSgwLCBpKSwgbGFiZWwpO1xuICAgICAgICBuZXdMYWJlbCArPSBgXyR7ZHVwSW5kZXh9YDtcbiAgICAgIH1cbiAgICAgIGRlZHVwZWRPdXRMYWJlbHMucHVzaChuZXdMYWJlbCk7XG4gICAgfVxuICAgIHJldHVybiBkZWR1cGVkT3V0TGFiZWxzO1xuICB9XG5cbiAgLyoqXG4gICAqIENyZWF0ZXMgYSBmdW5jdGlvbiB0aGF0IHBlcmZvcm1zIHRoZSBmb2xsb3dpbmcgYWN0aW9uczpcbiAgICpcbiAgICogMS4gY29tcHV0ZXMgdGhlIGxvc3Nlc1xuICAgKiAyLiBzdW1zIHRoZW0gdG8gZ2V0IHRoZSB0b3RhbCBsb3NzXG4gICAqIDMuIGNhbGwgdGhlIG9wdGltaXplciBjb21wdXRlcyB0aGUgZ3JhZGllbnRzIG9mIHRoZSBMYXllcnNNb2RlbCdzXG4gICAqICAgIHRyYWluYWJsZSB3ZWlnaHRzIHcuci50LiB0aGUgdG90YWwgbG9zcyBhbmQgdXBkYXRlIHRoZSB2YXJpYWJsZXNcbiAgICogNC4gY2FsY3VsYXRlcyB0aGUgbWV0cmljc1xuICAgKiA1LiByZXR1cm5zIHRoZSB2YWx1ZXMgb2YgdGhlIGxvc3NlcyBhbmQgbWV0cmljcy5cbiAgICovXG4gIHByb3RlY3RlZCBtYWtlVHJhaW5GdW5jdGlvbigpOiAoZGF0YTogVGVuc29yW10pID0+IFNjYWxhcltdIHtcbiAgICByZXR1cm4gKGRhdGE6IFRlbnNvcltdKSA9PiB7XG4gICAgICBjb25zdCBsb3NzVmFsdWVzOiBTY2FsYXJbXSA9IFtdO1xuXG4gICAgICBjb25zdCBpbnB1dHMgPSBkYXRhLnNsaWNlKDAsIHRoaXMuaW5wdXRzLmxlbmd0aCk7XG4gICAgICBjb25zdCB0YXJnZXRzID0gZGF0YS5zbGljZShcbiAgICAgICAgICB0aGlzLmlucHV0cy5sZW5ndGgsIHRoaXMuaW5wdXRzLmxlbmd0aCArIHRoaXMub3V0cHV0cy5sZW5ndGgpO1xuICAgICAgY29uc3Qgc2FtcGxlV2VpZ2h0cyA9IGRhdGEuc2xpY2UoXG4gICAgICAgICAgdGhpcy5pbnB1dHMubGVuZ3RoICsgdGhpcy5vdXRwdXRzLmxlbmd0aCxcbiAgICAgICAgICB0aGlzLmlucHV0cy5sZW5ndGggKyB0aGlzLm91dHB1dHMubGVuZ3RoICogMik7XG5cbiAgICAgIGNvbnN0IG1ldHJpY3NWYWx1ZXM6IFNjYWxhcltdID0gW107XG5cbiAgICAgIC8vIENyZWF0ZSBhIGZ1bmN0aW9uIHRoYXQgY29tcHV0ZXMgdGhlIHRvdGFsIGxvc3MgYmFzZWQgb24gdGhlXG4gICAgICAvLyBpbnB1dHMuIFRoaXMgZnVuY3Rpb24gaXMgdXNlZCBmb3Igb2J0YWluaW5nIGdyYWRpZW50cyB0aHJvdWdoXG4gICAgICAvLyBiYWNrcHJvcC5cbiAgICAgIGNvbnN0IHRvdGFsTG9zc0Z1bmN0aW9uID0gKCkgPT4ge1xuICAgICAgICBjb25zdCBmZWVkcyA9IFtdO1xuICAgICAgICBmb3IgKGxldCBpID0gMDsgaSA8IHRoaXMuaW5wdXRzLmxlbmd0aDsgKytpKSB7XG4gICAgICAgICAgZmVlZHMucHVzaCh7a2V5OiB0aGlzLmlucHV0c1tpXSwgdmFsdWU6IGlucHV0c1tpXX0pO1xuICAgICAgICB9XG4gICAgICAgIGNvbnN0IGZlZWREaWN0ID0gbmV3IEZlZWREaWN0KGZlZWRzKTtcbiAgICAgICAgY29uc3Qgb3V0cHV0cyA9XG4gICAgICAgICAgICBleGVjdXRlKHRoaXMub3V0cHV0cywgZmVlZERpY3QsIHsndHJhaW5pbmcnOiB0cnVlfSkgYXMgVGVuc29yW107XG4gICAgICAgIC8vIFRPRE8oY2Fpcyk6IFRha2UgY2FyZSBvZiB0aGUgY2FzZSBvZiBtdWx0aXBsZSBvdXRwdXRzIGZyb20gYVxuICAgICAgICAvLyAgIHNpbmdsZSBsYXllcj9cblxuICAgICAgICBsZXQgdG90YWxMb3NzOiBUZW5zb3I7XG4gICAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgdGhpcy5sb3NzRnVuY3Rpb25zLmxlbmd0aDsgKytpKSB7XG4gICAgICAgICAgY29uc3QgbG9zc0Z1bmN0aW9uID0gdGhpcy5sb3NzRnVuY3Rpb25zW2ldO1xuICAgICAgICAgIGxldCBsb3NzID0gbG9zc0Z1bmN0aW9uKHRhcmdldHNbaV0sIG91dHB1dHNbaV0pO1xuICAgICAgICAgIGlmIChzYW1wbGVXZWlnaHRzW2ldICE9IG51bGwpIHtcbiAgICAgICAgICAgIGxvc3MgPSBjb21wdXRlV2VpZ2h0ZWRMb3NzKGxvc3MsIHNhbXBsZVdlaWdodHNbaV0pO1xuICAgICAgICAgIH1cblxuICAgICAgICAgIC8vIFRPRE8oY2Fpcyk6IHB1c2ggU2NhbGFyIGluc3RlYWQuXG4gICAgICAgICAgY29uc3QgbWVhbkxvc3M6IFNjYWxhciA9IHRmYy5tZWFuKGxvc3MpO1xuICAgICAgICAgIC8vIFRPRE8oY2Fpcyk6IFVzZSBhIHNjb3BlKCkgaW5zdGVhZCwgdG8gYXZvaWQgb3duZXJzaGlwLlxuICAgICAgICAgIGxvc3NWYWx1ZXMucHVzaChtZWFuTG9zcyk7XG4gICAgICAgICAgaWYgKGkgPT09IDApIHtcbiAgICAgICAgICAgIHRvdGFsTG9zcyA9IGxvc3M7XG4gICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIHRvdGFsTG9zcyA9IHRmYy5hZGQodG90YWxMb3NzLCBsb3NzKTtcbiAgICAgICAgICB9XG4gICAgICAgIH1cblxuICAgICAgICAvLyBDb21wdXRlIHRoZSBtZXRyaWNzLlxuICAgICAgICAvLyBUT0RPKGNhaXMpOiBUaGVzZSBzaG91bGQgcHJvYmFibHkgYmUgY2FsY3VsYXRlZCBvdXRzaWRlXG4gICAgICAgIC8vICAgdG90YWxMb3NzRnVuY3Rpb24gdG8gYmVuZWZpdCBzcGVlZD9cbiAgICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCB0aGlzLm1ldHJpY3NUZW5zb3JzLmxlbmd0aDsgKytpKSB7XG4gICAgICAgICAgbGV0IHdlaWdodGVkTWV0cmljOiBTY2FsYXI7XG5cbiAgICAgICAgICBpZiAodGhpcy5vdXRwdXRzLmxlbmd0aCA+IDEgJiYgaSA8IHRoaXMub3V0cHV0cy5sZW5ndGgpIHtcbiAgICAgICAgICAgIHdlaWdodGVkTWV0cmljID0gbG9zc1ZhbHVlc1tpXTtcbiAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgY29uc3QgbWV0cmljID0gdGhpcy5tZXRyaWNzVGVuc29yc1tpXVswXTtcbiAgICAgICAgICAgIGNvbnN0IG91dHB1dEluZGV4ID0gdGhpcy5tZXRyaWNzVGVuc29yc1tpXVsxXTtcbiAgICAgICAgICAgIHdlaWdodGVkTWV0cmljID1cbiAgICAgICAgICAgICAgICB0ZmMubWVhbihtZXRyaWModGFyZ2V0c1tvdXRwdXRJbmRleF0sIG91dHB1dHNbb3V0cHV0SW5kZXhdKSk7XG4gICAgICAgICAgfVxuXG4gICAgICAgICAgdGZjLmtlZXAod2VpZ2h0ZWRNZXRyaWMpO1xuICAgICAgICAgIC8vIFRPRE8oY2Fpcyk6IFVzZSBhIHNjb3BlKCkgaW5zdGVhZCwgdG8gYXZvaWQgb3duZXJzaGlwLlxuICAgICAgICAgIG1ldHJpY3NWYWx1ZXMucHVzaCh3ZWlnaHRlZE1ldHJpYyk7XG4gICAgICAgIH1cblxuICAgICAgICB0b3RhbExvc3MgPSB0ZmMubWVhbih0b3RhbExvc3MpO1xuXG4gICAgICAgIC8vIEFkZCByZWd1bGFyaXplciBwZW5hbHRpZXMuXG4gICAgICAgIHRoaXMuY2FsY3VsYXRlTG9zc2VzKCkuZm9yRWFjaChyZWd1bGFyaXplckxvc3MgPT4ge1xuICAgICAgICAgIHRvdGFsTG9zcyA9IHRmYy5hZGQodG90YWxMb3NzLCByZWd1bGFyaXplckxvc3MpO1xuICAgICAgICB9KTtcblxuICAgICAgICByZXR1cm4gdG90YWxMb3NzIGFzIFNjYWxhcjtcbiAgICAgIH07XG5cbiAgICAgIGNvbnN0IHZhcmlhYmxlcyA9IHRoaXMuY29sbGVjdGVkVHJhaW5hYmxlV2VpZ2h0cy5tYXAoXG4gICAgICAgICAgcGFyYW0gPT4gcGFyYW0ucmVhZCgpIGFzIHRmYy5WYXJpYWJsZSk7XG4gICAgICBjb25zdCByZXR1cm5Db3N0ID0gdHJ1ZTtcbiAgICAgIGNvbnN0IHRvdGFsTG9zc1ZhbHVlID1cbiAgICAgICAgICB0aGlzLm9wdGltaXplcl8ubWluaW1pemUodG90YWxMb3NzRnVuY3Rpb24sIHJldHVybkNvc3QsIHZhcmlhYmxlcyk7XG5cbiAgICAgIHJldHVybiBbdG90YWxMb3NzVmFsdWVdLmNvbmNhdChtZXRyaWNzVmFsdWVzKTtcbiAgICB9O1xuICB9XG5cbiAgLyoqXG4gICAqIENyZWF0ZSBhIGZ1bmN0aW9uIHdoaWNoLCB3aGVuIGludm9rZWQgd2l0aCBhbiBhcnJheSBvZiBgdGYuVGVuc29yYHMgYXMgYVxuICAgKiBiYXRjaCBvZiBpbnB1dHMsIHJldHVybnMgdGhlIHByZXNwZWNpZmllZCBsb3NzIGFuZCBtZXRyaWNzIG9mIHRoZSBtb2RlbFxuICAgKiB1bmRlciB0aGUgYmF0Y2ggb2YgaW5wdXQgZGF0YS5cbiAgICovXG4gIHByaXZhdGUgbWFrZVRlc3RGdW5jdGlvbigpIHtcbiAgICB0aGlzLnRlc3RGdW5jdGlvbiA9IChkYXRhOiBUZW5zb3JbXSkgPT4ge1xuICAgICAgcmV0dXJuIHRmYy50aWR5KCgpID0+IHtcbiAgICAgICAgY29uc3QgdmFsT3V0cHV0czogU2NhbGFyW10gPSBbXTtcbiAgICAgICAgbGV0IHRvdGFsTG9zczogU2NhbGFyO1xuICAgICAgICBjb25zdCBpbnB1dHMgPSBkYXRhLnNsaWNlKDAsIHRoaXMuaW5wdXRzLmxlbmd0aCk7XG4gICAgICAgIGNvbnN0IHRhcmdldHMgPSBkYXRhLnNsaWNlKFxuICAgICAgICAgICAgdGhpcy5pbnB1dHMubGVuZ3RoLCB0aGlzLmlucHV0cy5sZW5ndGggKyB0aGlzLm91dHB1dHMubGVuZ3RoKTtcbiAgICAgICAgY29uc3QgZmVlZHMgPSBbXTtcbiAgICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCB0aGlzLmlucHV0cy5sZW5ndGg7ICsraSkge1xuICAgICAgICAgIGZlZWRzLnB1c2goe2tleTogdGhpcy5pbnB1dHNbaV0sIHZhbHVlOiBpbnB1dHNbaV19KTtcbiAgICAgICAgfVxuICAgICAgICBjb25zdCBmZWVkRGljdCA9IG5ldyBGZWVkRGljdChmZWVkcyk7XG4gICAgICAgIGNvbnN0IG91dHB1dHMgPSBleGVjdXRlKHRoaXMub3V0cHV0cywgZmVlZERpY3QpIGFzIFRlbnNvcltdO1xuICAgICAgICAvLyBDb21wdXRlIHRvdGFsIGxvc3MuXG4gICAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgdGhpcy5sb3NzRnVuY3Rpb25zLmxlbmd0aDsgKytpKSB7XG4gICAgICAgICAgY29uc3QgbG9zc0Z1bmN0aW9uID0gdGhpcy5sb3NzRnVuY3Rpb25zW2ldO1xuICAgICAgICAgIC8vIFRPRE8oY2Fpcyk6IEFkZCBzYW1wbGUgd2VpZ2h0aW5nIGFuZCByZXBsYWNlIHRoZSBzaW1wbGVcbiAgICAgICAgICAvLyBhdmVyYWdpbmcuXG4gICAgICAgICAgY29uc3QgbG9zczogU2NhbGFyID0gdGZjLm1lYW4obG9zc0Z1bmN0aW9uKHRhcmdldHNbaV0sIG91dHB1dHNbaV0pKTtcbiAgICAgICAgICBpZiAoaSA9PT0gMCkge1xuICAgICAgICAgICAgdG90YWxMb3NzID0gbG9zcztcbiAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgdG90YWxMb3NzID0gdGZjLmFkZCh0b3RhbExvc3MsIGxvc3MpO1xuICAgICAgICAgIH1cbiAgICAgICAgICB2YWxPdXRwdXRzLnB1c2godG90YWxMb3NzKTtcbiAgICAgICAgfVxuICAgICAgICAvLyBDb21wdXRlIHRoZSBtZXRyaWNzLlxuICAgICAgICBmb3IgKGxldCBpID0gMDsgaSA8IHRoaXMubWV0cmljc1RlbnNvcnMubGVuZ3RoOyArK2kpIHtcbiAgICAgICAgICBjb25zdCBtZXRyaWMgPSB0aGlzLm1ldHJpY3NUZW5zb3JzW2ldWzBdO1xuICAgICAgICAgIGNvbnN0IG91dHB1dEluZGV4ID0gdGhpcy5tZXRyaWNzVGVuc29yc1tpXVsxXTtcbiAgICAgICAgICAvLyBUT0RPKGNhaXMpOiBSZXBsYWNlIEsubWVhbigpIHdpdGggYSBwcm9wZXIgd2VpZ2h0aW5nIGZ1bmN0aW9uLlxuICAgICAgICAgIGNvbnN0IG1lYW5NZXRyaWMgPVxuICAgICAgICAgICAgICB0ZmMubWVhbihtZXRyaWModGFyZ2V0c1tvdXRwdXRJbmRleF0sIG91dHB1dHNbb3V0cHV0SW5kZXhdKSk7XG4gICAgICAgICAgdmFsT3V0cHV0cy5wdXNoKG1lYW5NZXRyaWMgYXMgU2NhbGFyKTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gdmFsT3V0cHV0cztcbiAgICAgIH0pO1xuICAgIH07XG4gIH1cblxuICAvKipcbiAgICogVHJhaW5zIHRoZSBtb2RlbCBmb3IgYSBmaXhlZCBudW1iZXIgb2YgZXBvY2hzIChpdGVyYXRpb25zIG9uIGFcbiAgICogZGF0YXNldCkuXG4gICAqXG4gICAqIGBgYGpzXG4gICAqIGNvbnN0IG1vZGVsID0gdGYuc2VxdWVudGlhbCh7XG4gICAqICAgICBsYXllcnM6IFt0Zi5sYXllcnMuZGVuc2Uoe3VuaXRzOiAxLCBpbnB1dFNoYXBlOiBbMTBdfSldXG4gICAqIH0pO1xuICAgKiBtb2RlbC5jb21waWxlKHtvcHRpbWl6ZXI6ICdzZ2QnLCBsb3NzOiAnbWVhblNxdWFyZWRFcnJvcid9KTtcbiAgICogZm9yIChsZXQgaSA9IDE7IGkgPCA1IDsgKytpKSB7XG4gICAqICAgY29uc3QgaCA9IGF3YWl0IG1vZGVsLmZpdCh0Zi5vbmVzKFs4LCAxMF0pLCB0Zi5vbmVzKFs4LCAxXSksIHtcbiAgICogICAgICAgYmF0Y2hTaXplOiA0LFxuICAgKiAgICAgICBlcG9jaHM6IDNcbiAgICogICB9KTtcbiAgICogICBjb25zb2xlLmxvZyhcIkxvc3MgYWZ0ZXIgRXBvY2ggXCIgKyBpICsgXCIgOiBcIiArIGguaGlzdG9yeS5sb3NzWzBdKTtcbiAgICogfVxuICAgKiBgYGBcbiAgICpcbiAgICogQHBhcmFtIHggYHRmLlRlbnNvcmAgb2YgdHJhaW5pbmcgZGF0YSwgb3IgYW4gYXJyYXkgb2YgYHRmLlRlbnNvcmBzIGlmIHRoZVxuICAgKiBtb2RlbCBoYXMgbXVsdGlwbGUgaW5wdXRzLiBJZiBhbGwgaW5wdXRzIGluIHRoZSBtb2RlbCBhcmUgbmFtZWQsIHlvdVxuICAgKiBjYW4gYWxzbyBwYXNzIGEgZGljdGlvbmFyeSBtYXBwaW5nIGlucHV0IG5hbWVzIHRvIGB0Zi5UZW5zb3Jgcy5cbiAgICogQHBhcmFtIHkgYHRmLlRlbnNvcmAgb2YgdGFyZ2V0IChsYWJlbCkgZGF0YSwgb3IgYW4gYXJyYXkgb2YgYHRmLlRlbnNvcmBzIGlmXG4gICAqIHRoZSBtb2RlbCBoYXMgbXVsdGlwbGUgb3V0cHV0cy4gSWYgYWxsIG91dHB1dHMgaW4gdGhlIG1vZGVsIGFyZSBuYW1lZCxcbiAgICogeW91IGNhbiBhbHNvIHBhc3MgYSBkaWN0aW9uYXJ5IG1hcHBpbmcgb3V0cHV0IG5hbWVzIHRvIGB0Zi5UZW5zb3Jgcy5cbiAgICogQHBhcmFtIGFyZ3MgQSBgTW9kZWxGaXRBcmdzYCwgY29udGFpbmluZyBvcHRpb25hbCBmaWVsZHMuXG4gICAqXG4gICAqIEByZXR1cm4gQSBgSGlzdG9yeWAgaW5zdGFuY2UuIEl0cyBgaGlzdG9yeWAgYXR0cmlidXRlIGNvbnRhaW5zIGFsbFxuICAgKiAgIGluZm9ybWF0aW9uIGNvbGxlY3RlZCBkdXJpbmcgdHJhaW5pbmcuXG4gICAqXG4gICAqIEBleGNlcHRpb24gVmFsdWVFcnJvciBJbiBjYXNlIG9mIG1pc21hdGNoIGJldHdlZW4gdGhlIHByb3ZpZGVkIGlucHV0XG4gICAqIGRhdGEgYW5kIHdoYXQgdGhlIG1vZGVsIGV4cGVjdHMuXG4gICAqXG4gICAqIEBkb2Mge2hlYWRpbmc6ICdNb2RlbHMnLCBzdWJoZWFkaW5nOiAnQ2xhc3Nlcyd9XG4gICAqL1xuICBhc3luYyBmaXQoXG4gICAgICB4OiBUZW5zb3J8VGVuc29yW118e1tpbnB1dE5hbWU6IHN0cmluZ106IFRlbnNvcn0sXG4gICAgICB5OiBUZW5zb3J8VGVuc29yW118e1tpbnB1dE5hbWU6IHN0cmluZ106IFRlbnNvcn0sXG4gICAgICBhcmdzOiBNb2RlbEZpdEFyZ3MgPSB7fSk6IFByb21pc2U8SGlzdG9yeT4ge1xuICAgIHJldHVybiBmaXRUZW5zb3JzKHRoaXMsIHgsIHksIGFyZ3MpO1xuICB9XG5cbiAgLy8gVE9ETyhjYWlzKTogQWRkIGNvZGUgc25pcHBldCBiZWxvdyB3aGVuIGl0J3MgcG9zc2libGUgdG8gaW5zdGFudGlhdGVcbiAgLy8gICBhY3R1YWwgZGF0YXNldCBvYmplY3RzLlxuICAvKipcbiAgICogVHJhaW5zIHRoZSBtb2RlbCB1c2luZyBhIGRhdGFzZXQgb2JqZWN0LlxuICAgKlxuICAgKiBAcGFyYW0gZGF0YXNldCBBIGRhdGFzZXQgb2JqZWN0LiBJdHMgYGl0ZXJhdG9yKClgIG1ldGhvZCBpcyBleHBlY3RlZFxuICAgKiAgIHRvIGdlbmVyYXRlIGEgZGF0YXNldCBpdGVyYXRvciBvYmplY3QsIHRoZSBgbmV4dCgpYCBtZXRob2Qgb2Ygd2hpY2hcbiAgICogICBpcyBleHBlY3RlZCB0byBwcm9kdWNlIGRhdGEgYmF0Y2hlcyBmb3IgdHJhaW5pbmcuIFRoZSByZXR1cm4gdmFsdWVcbiAgICogICBvZiB0aGUgYG5leHQoKWAgY2FsbCBvdWdodCB0byBjb250YWluIGEgYm9vbGVhbiBgZG9uZWAgZmllbGQgYW5kIGFcbiAgICogICBgdmFsdWVgIGZpZWxkLiBUaGUgYHZhbHVlYCBmaWVsZCBpcyBleHBlY3RlZCB0byBiZSBhbiBhcnJheSBvZiB0d29cbiAgICogICBgdGYuVGVuc29yYHMgb3IgYW4gYXJyYXkgb2YgdHdvIG5lc3RlZCBgdGYuVGVuc29yYCBzdHJ1Y3R1cmVzLiBUaGUgZm9ybWVyXG4gICAqICAgY2FzZSBpcyBmb3IgbW9kZWxzIHdpdGggZXhhY3RseSBvbmUgaW5wdXQgYW5kIG9uZSBvdXRwdXQgKGUuZy5cbiAgICogICBhIHNlcXVlbnRpYWwgbW9kZWwpLiBUaGUgbGF0dGVyIGNhc2UgaXMgZm9yIG1vZGVscyB3aXRoIG11bHRpcGxlXG4gICAqICAgaW5wdXRzIGFuZC9vciBtdWx0aXBsZSBvdXRwdXRzLlxuICAgKiAgIE9mIHRoZSB0d28gaXRlbXMgaW4gdGhlIGFycmF5LCB0aGUgZmlyc3QgaXMgdGhlIGlucHV0IGZlYXR1cmUocykgYW5kXG4gICAqICAgdGhlIHNlY29uZCBpcyB0aGUgb3V0cHV0IHRhcmdldChzKS5cbiAgICogQHBhcmFtIGFyZ3MgQSBgTW9kZWxGaXREYXRhc2V0QXJnc2AsIGNvbnRhaW5pbmcgb3B0aW9uYWwgZmllbGRzLlxuICAgKlxuICAgKiBAcmV0dXJuIEEgYEhpc3RvcnlgIGluc3RhbmNlLiBJdHMgYGhpc3RvcnlgIGF0dHJpYnV0ZSBjb250YWlucyBhbGxcbiAgICogICBpbmZvcm1hdGlvbiBjb2xsZWN0ZWQgZHVyaW5nIHRyYWluaW5nLlxuICAgKlxuICAgKiBAZG9jIHtoZWFkaW5nOiAnTW9kZWxzJywgc3ViaGVhZGluZzogJ0NsYXNzZXMnfVxuICAgKi9cbiAgYXN5bmMgZml0RGF0YXNldDxUPihkYXRhc2V0OiBEYXRhc2V0PFQ+LCBhcmdzOiBNb2RlbEZpdERhdGFzZXRBcmdzPFQ+KTpcbiAgICAgIFByb21pc2U8SGlzdG9yeT4ge1xuICAgIHJldHVybiBmaXREYXRhc2V0KHRoaXMsIGRhdGFzZXQsIGFyZ3MpO1xuICB9XG5cbiAgLyoqXG4gICAqIFJ1bnMgYSBzaW5nbGUgZ3JhZGllbnQgdXBkYXRlIG9uIGEgc2luZ2xlIGJhdGNoIG9mIGRhdGEuXG4gICAqXG4gICAqIFRoaXMgbWV0aG9kIGRpZmZlcnMgZnJvbSBgZml0KClgIGFuZCBgZml0RGF0YXNldCgpYCBpbiB0aGUgZm9sbG93aW5nXG4gICAqIHJlZ2FyZHM6XG4gICAqICAgLSBJdCBvcGVyYXRlcyBvbiBleGFjdGx5IG9uZSBiYXRjaCBvZiBkYXRhLlxuICAgKiAgIC0gSXQgcmV0dXJucyBvbmx5IHRoZSBsb3NzIGFuZCBtZXRyaWMgdmFsdWVzLCBpbnN0ZWFkIG9mXG4gICAqICAgICByZXR1cm5pbmcgdGhlIGJhdGNoLWJ5LWJhdGNoIGxvc3MgYW5kIG1ldHJpYyB2YWx1ZXMuXG4gICAqICAgLSBJdCBkb2Vzbid0IHN1cHBvcnQgZmluZS1ncmFpbmVkIG9wdGlvbnMgc3VjaCBhcyB2ZXJib3NpdHkgYW5kXG4gICAqICAgICBjYWxsYmFja3MuXG4gICAqXG4gICAqIEBwYXJhbSB4IElucHV0IGRhdGEuIEl0IGNvdWxkIGJlIG9uZSBvZiB0aGUgZm9sbG93aW5nOlxuICAgKiAgIC0gQSBgdGYuVGVuc29yYCwgb3IgYW4gQXJyYXkgb2YgYHRmLlRlbnNvcmBzIChpbiBjYXNlIHRoZSBtb2RlbCBoYXNcbiAgICogICAgIG11bHRpcGxlIGlucHV0cykuXG4gICAqICAgLSBBbiBPYmplY3QgbWFwcGluZyBpbnB1dCBuYW1lcyB0byBjb3JyZXNwb25kaW5nIGB0Zi5UZW5zb3JgIChpZiB0aGVcbiAgICogICAgIG1vZGVsIGhhcyBuYW1lZCBpbnB1dHMpLlxuICAgKiBAcGFyYW0geSBUYXJnZXQgZGF0YS4gSXQgY291bGQgYmUgZWl0aGVyIGEgYHRmLlRlbnNvcmAgb3IgbXVsdGlwbGVcbiAgICogICBgdGYuVGVuc29yYHMuIEl0IHNob3VsZCBiZSBjb25zaXN0ZW50IHdpdGggYHhgLlxuICAgKiBAcmV0dXJucyBUcmFpbmluZyBsb3NzIG9yIGxvc3NlcyAoaW4gY2FzZSB0aGUgbW9kZWwgaGFzXG4gICAqICAgbXVsdGlwbGUgb3V0cHV0cyksIGFsb25nIHdpdGggbWV0cmljcyAoaWYgYW55KSwgYXMgbnVtYmVycy5cbiAgICpcbiAgICogQGRvYyB7aGVhZGluZzogJ01vZGVscycsIHN1YmhlYWRpbmc6ICdDbGFzc2VzJ31cbiAgICovXG4gIGFzeW5jIHRyYWluT25CYXRjaChcbiAgICAgIHg6IFRlbnNvcnxUZW5zb3JbXXx7W2lucHV0TmFtZTogc3RyaW5nXTogVGVuc29yfSxcbiAgICAgIHk6IFRlbnNvcnxUZW5zb3JbXXxcbiAgICAgIHtbaW5wdXROYW1lOiBzdHJpbmddOiBUZW5zb3J9KTogUHJvbWlzZTxudW1iZXJ8bnVtYmVyW10+IHtcbiAgICAvLyBUT0RPKGNhaXMpOiBTdXBwb3J0IHNhbXBsZVdlaWdodCBhbmQgY2xhc3NXZWlnaHQuXG4gICAgLy8gVE9ETyhjYWlzKTogU3VwcG9ydCBEYXRhc2V0IG9iamVjdHMuXG4gICAgY29uc3Qgc3RhbmRhcmRpemVPdXQgPSBhd2FpdCB0aGlzLnN0YW5kYXJkaXplVXNlckRhdGEoeCwgeSk7XG4gICAgY29uc3QgaW5wdXRzID0gc3RhbmRhcmRpemVPdXRbMF07XG4gICAgY29uc3QgdGFyZ2V0cyA9IHN0YW5kYXJkaXplT3V0WzFdO1xuICAgIGNvbnN0IHRyYWluRnVuY3Rpb24gPSB0aGlzLm1ha2VUcmFpbkZ1bmN0aW9uKCk7XG4gICAgY29uc3QgbG9zc2VzID0gdHJhaW5GdW5jdGlvbihpbnB1dHMuY29uY2F0KHRhcmdldHMpKTtcbiAgICBjb25zdCBsb3NzVmFsdWVzOiBudW1iZXJbXSA9IFtdO1xuICAgIGZvciAoY29uc3QgbG9zcyBvZiBsb3NzZXMpIHtcbiAgICAgIGNvbnN0IHYgPSBhd2FpdCBsb3NzLmRhdGEoKTtcbiAgICAgIGxvc3NWYWx1ZXMucHVzaCh2WzBdKTtcbiAgICB9XG4gICAgdGZjLmRpc3Bvc2UobG9zc2VzKTtcbiAgICBkaXNwb3NlTmV3VGVuc29ycyhzdGFuZGFyZGl6ZU91dFswXSwgeCk7XG4gICAgZGlzcG9zZU5ld1RlbnNvcnMoc3RhbmRhcmRpemVPdXRbMV0sIHkpO1xuICAgIHJldHVybiBzaW5nbGV0b25PckFycmF5KGxvc3NWYWx1ZXMpO1xuICB9XG5cbiAgLyoqXG4gICAqIEV4dHJhY3Qgd2VpZ2h0IHZhbHVlcyBvZiB0aGUgbW9kZWwuXG4gICAqXG4gICAqIEBwYXJhbSBjb25maWc6IEFuIGluc3RhbmNlIG9mIGBpby5TYXZlQ29uZmlnYCwgd2hpY2ggc3BlY2lmaWVzXG4gICAqIG1vZGVsLXNhdmluZyBvcHRpb25zIHN1Y2ggYXMgd2hldGhlciBvbmx5IHRyYWluYWJsZSB3ZWlnaHRzIGFyZSB0byBiZVxuICAgKiBzYXZlZC5cbiAgICogQHJldHVybnMgQSBgTmFtZWRUZW5zb3JNYXBgIG1hcHBpbmcgb3JpZ2luYWwgd2VpZ2h0IG5hbWVzIChpLmUuLFxuICAgKiAgIG5vbi11bmlxdWVpZmllZCB3ZWlnaHQgbmFtZXMpIHRvIHRoZWlyIHZhbHVlcy5cbiAgICovXG4gIHByb3RlY3RlZCBnZXROYW1lZFdlaWdodHMoY29uZmlnPzogaW8uU2F2ZUNvbmZpZyk6IE5hbWVkVGVuc29yW10ge1xuICAgIGNvbnN0IG5hbWVkV2VpZ2h0czogTmFtZWRUZW5zb3JbXSA9IFtdO1xuXG4gICAgY29uc3QgdHJhaW5hYmxlT25seSA9IGNvbmZpZyAhPSBudWxsICYmIGNvbmZpZy50cmFpbmFibGVPbmx5O1xuICAgIGNvbnN0IHdlaWdodHMgPSB0cmFpbmFibGVPbmx5ID8gdGhpcy50cmFpbmFibGVXZWlnaHRzIDogdGhpcy53ZWlnaHRzO1xuICAgIGNvbnN0IHdlaWdodFZhbHVlcyA9IHRoaXMuZ2V0V2VpZ2h0cyh0cmFpbmFibGVPbmx5KTtcbiAgICBmb3IgKGxldCBpID0gMDsgaSA8IHdlaWdodHMubGVuZ3RoOyArK2kpIHtcbiAgICAgIGlmICh0cmFpbmFibGVPbmx5ICYmICF3ZWlnaHRzW2ldLnRyYWluYWJsZSkge1xuICAgICAgICAvLyBPcHRpb25hbGx5IHNraXAgbm9uLXRyYWluYWJsZSB3ZWlnaHRzLlxuICAgICAgICBjb250aW51ZTtcbiAgICAgIH1cbiAgICAgIG5hbWVkV2VpZ2h0cy5wdXNoKFxuICAgICAgICAgIHtuYW1lOiB3ZWlnaHRzW2ldLm9yaWdpbmFsTmFtZSwgdGVuc29yOiB3ZWlnaHRWYWx1ZXNbaV19KTtcbiAgICB9XG4gICAgcmV0dXJuIG5hbWVkV2VpZ2h0cztcbiAgfVxuXG4gIC8qKlxuICAgKiBTZXR0ZXIgdXNlZCBmb3IgZm9yY2Ugc3RvcHBpbmcgb2YgTGF5ZXJzTW9kZWwuZml0KCkgKGkuZS4sIHRyYWluaW5nKS5cbiAgICpcbiAgICogRXhhbXBsZTpcbiAgICpcbiAgICogYGBganNcbiAgICogY29uc3QgaW5wdXQgPSB0Zi5pbnB1dCh7c2hhcGU6IFsxMF19KTtcbiAgICogY29uc3Qgb3V0cHV0ID0gdGYubGF5ZXJzLmRlbnNlKHt1bml0czogMX0pLmFwcGx5KGlucHV0KTtcbiAgICogY29uc3QgbW9kZWwgPSB0Zi5tb2RlbCh7aW5wdXRzOiBbaW5wdXRdLCBvdXRwdXRzOiBbb3V0cHV0XX0pO1xuICAgKiBtb2RlbC5jb21waWxlKHtsb3NzOiAnbWVhblNxdWFyZWRFcnJvcicsIG9wdGltaXplcjogJ3NnZCd9KTtcbiAgICogY29uc3QgeHMgPSB0Zi5vbmVzKFs4LCAxMF0pO1xuICAgKiBjb25zdCB5cyA9IHRmLnplcm9zKFs4LCAxXSk7XG4gICAqXG4gICAqIGNvbnN0IGhpc3RvcnkgPSBhd2FpdCBtb2RlbC5maXQoeHMsIHlzLCB7XG4gICAqICAgZXBvY2hzOiAxMCxcbiAgICogICBjYWxsYmFja3M6IHtcbiAgICogICAgIG9uRXBvY2hFbmQ6IGFzeW5jIChlcG9jaCwgbG9ncykgPT4ge1xuICAgKiAgICAgICBpZiAoZXBvY2ggPT09IDIpIHtcbiAgICogICAgICAgICBtb2RlbC5zdG9wVHJhaW5pbmcgPSB0cnVlO1xuICAgKiAgICAgICB9XG4gICAqICAgICB9XG4gICAqICAgfVxuICAgKiB9KTtcbiAgICpcbiAgICogLy8gVGhlcmUgc2hvdWxkIGJlIG9ubHkgMyB2YWx1ZXMgaW4gdGhlIGxvc3MgYXJyYXksIGluc3RlYWQgb2YgMTBcbiAgICogdmFsdWVzLFxuICAgKiAvLyBkdWUgdG8gdGhlIHN0b3BwaW5nIGFmdGVyIDMgZXBvY2hzLlxuICAgKiBjb25zb2xlLmxvZyhoaXN0b3J5Lmhpc3RvcnkubG9zcyk7XG4gICAqIGBgYFxuICAgKi9cbiAgc2V0IHN0b3BUcmFpbmluZyhzdG9wOiBib29sZWFuKSB7XG4gICAgdGhpcy5zdG9wVHJhaW5pbmdfID0gc3RvcDtcbiAgfVxuXG4gIGdldCBzdG9wVHJhaW5pbmcoKTogYm9vbGVhbiB7XG4gICAgcmV0dXJuIHRoaXMuc3RvcFRyYWluaW5nXztcbiAgfVxuXG4gIGdldCBvcHRpbWl6ZXIoKTogT3B0aW1pemVyIHtcbiAgICByZXR1cm4gdGhpcy5vcHRpbWl6ZXJfO1xuICB9XG5cbiAgc2V0IG9wdGltaXplcihvcHRpbWl6ZXI6IE9wdGltaXplcikge1xuICAgIGlmICh0aGlzLm9wdGltaXplcl8gIT09IG9wdGltaXplcikge1xuICAgICAgdGhpcy5vcHRpbWl6ZXJfID0gb3B0aW1pemVyO1xuICAgICAgdGhpcy5pc09wdGltaXplck93bmVkID0gZmFsc2U7XG4gICAgfVxuICB9XG5cbiAgZGlzcG9zZSgpOiBEaXNwb3NlUmVzdWx0IHtcbiAgICBjb25zdCByZXN1bHQgPSBzdXBlci5kaXNwb3NlKCk7XG4gICAgaWYgKHJlc3VsdC5yZWZDb3VudEFmdGVyRGlzcG9zZSA9PT0gMCAmJiB0aGlzLm9wdGltaXplciAhPSBudWxsICYmXG4gICAgICAgIHRoaXMuaXNPcHRpbWl6ZXJPd25lZCkge1xuICAgICAgY29uc3QgbnVtVGVuc29yc0JlZm9yZU9wdG1pemVyRGlzcG9zYWwgPSB0ZmMubWVtb3J5KCkubnVtVGVuc29ycztcbiAgICAgIHRoaXMub3B0aW1pemVyXy5kaXNwb3NlKCk7XG4gICAgICByZXN1bHQubnVtRGlzcG9zZWRWYXJpYWJsZXMgKz1cbiAgICAgICAgICBudW1UZW5zb3JzQmVmb3JlT3B0bWl6ZXJEaXNwb3NhbCAtIHRmYy5tZW1vcnkoKS5udW1UZW5zb3JzO1xuICAgIH1cbiAgICByZXR1cm4gcmVzdWx0O1xuICB9XG5cbiAgcHJpdmF0ZSBnZXRMb3NzSWRlbnRpZmllcnMoKTogTG9zc0lkZW50aWZpZXJ8TG9zc0lkZW50aWZpZXJbXXxcbiAgICAgIHtbb3V0cHV0TmFtZTogc3RyaW5nXTogTG9zc0lkZW50aWZpZXJ9IHtcbiAgICBsZXQgbG9zc05hbWVzOiBMb3NzSWRlbnRpZmllcnxMb3NzSWRlbnRpZmllcltdfFxuICAgICAgICB7W291dHB1dE5hbWU6IHN0cmluZ106IExvc3NJZGVudGlmaWVyfTtcbiAgICBpZiAodHlwZW9mIHRoaXMubG9zcyA9PT0gJ3N0cmluZycpIHtcbiAgICAgIGxvc3NOYW1lcyA9IHRvU25ha2VDYXNlKHRoaXMubG9zcykgYXMgTG9zc0lkZW50aWZpZXI7XG4gICAgfSBlbHNlIGlmIChBcnJheS5pc0FycmF5KHRoaXMubG9zcykpIHtcbiAgICAgIGZvciAoY29uc3QgbG9zcyBvZiB0aGlzLmxvc3MpIHtcbiAgICAgICAgaWYgKHR5cGVvZiBsb3NzICE9PSAnc3RyaW5nJykge1xuICAgICAgICAgIHRocm93IG5ldyBFcnJvcignU2VyaWFsaXphdGlvbiBvZiBub24tc3RyaW5nIGxvc3MgaXMgbm90IHN1cHBvcnRlZC4nKTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgICAgbG9zc05hbWVzID0gKHRoaXMubG9zcyBhcyBzdHJpbmdbXSkubWFwKG5hbWUgPT4gdG9TbmFrZUNhc2UobmFtZSkpIGFzXG4gICAgICAgICAgTG9zc0lkZW50aWZpZXJbXTtcbiAgICB9IGVsc2Uge1xuICAgICAgY29uc3Qgb3V0cHV0TmFtZXMgPSBPYmplY3Qua2V5cyh0aGlzLmxvc3MpO1xuICAgICAgbG9zc05hbWVzID0ge30gYXMge1tvdXRwdXROYW1lOiBzdHJpbmddOiBMb3NzSWRlbnRpZmllcn07XG4gICAgICBjb25zdCBsb3NzZXMgPVxuICAgICAgICAgIHRoaXMubG9zcyBhcyB7W291dHB1dE5hbWU6IHN0cmluZ106IExvc3NPck1ldHJpY0ZuIHwgc3RyaW5nfTtcbiAgICAgIGZvciAoY29uc3Qgb3V0cHV0TmFtZSBvZiBvdXRwdXROYW1lcykge1xuICAgICAgICBpZiAodHlwZW9mIGxvc3Nlc1tvdXRwdXROYW1lXSA9PT0gJ3N0cmluZycpIHtcbiAgICAgICAgICBsb3NzTmFtZXNbb3V0cHV0TmFtZV0gPVxuICAgICAgICAgICAgICB0b1NuYWtlQ2FzZShsb3NzZXNbb3V0cHV0TmFtZV0gYXMgc3RyaW5nKSBhcyBMb3NzSWRlbnRpZmllcjtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ1NlcmlhbGl6YXRpb24gb2Ygbm9uLXN0cmluZyBsb3NzIGlzIG5vdCBzdXBwb3J0ZWQuJyk7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9XG4gICAgcmV0dXJuIGxvc3NOYW1lcztcbiAgfVxuXG4gIHByaXZhdGUgZ2V0TWV0cmljSWRlbnRpZmllcnMoKTogTWV0cmljc0lkZW50aWZpZXJbXXxcbiAgICAgIHtba2V5OiBzdHJpbmddOiBNZXRyaWNzSWRlbnRpZmllcn0ge1xuICAgIGlmICh0eXBlb2YgdGhpcy5tZXRyaWNzID09PSAnc3RyaW5nJyB8fFxuICAgICAgICB0eXBlb2YgdGhpcy5tZXRyaWNzID09PSAnZnVuY3Rpb24nKSB7XG4gICAgICByZXR1cm4gW3RvU25ha2VDYXNlKE1ldHJpY3MuZ2V0TG9zc09yTWV0cmljTmFtZSh0aGlzLm1ldHJpY3MpKV07XG4gICAgfSBlbHNlIGlmIChBcnJheS5pc0FycmF5KHRoaXMubWV0cmljcykpIHtcbiAgICAgIHJldHVybiB0aGlzLm1ldHJpY3MubWFwKFxuICAgICAgICAgIG1ldHJpYyA9PiB0b1NuYWtlQ2FzZShNZXRyaWNzLmdldExvc3NPck1ldHJpY05hbWUobWV0cmljKSkpO1xuICAgIH0gZWxzZSB7XG4gICAgICBjb25zdCBtZXRyaWNzSWRlbnRpZmllcnM6IHtba2V5OiBzdHJpbmddOiBNZXRyaWNzSWRlbnRpZmllcn0gPSB7fTtcbiAgICAgIGZvciAoY29uc3Qga2V5IGluIHRoaXMubWV0cmljcykge1xuICAgICAgICBtZXRyaWNzSWRlbnRpZmllcnNba2V5XSA9XG4gICAgICAgICAgICB0b1NuYWtlQ2FzZShNZXRyaWNzLmdldExvc3NPck1ldHJpY05hbWUodGhpcy5tZXRyaWNzW2tleV0pKTtcbiAgICAgIH1cbiAgICAgIHJldHVybiBtZXRyaWNzSWRlbnRpZmllcnM7XG4gICAgfVxuICB9XG5cbiAgcHJvdGVjdGVkIGdldFRyYWluaW5nQ29uZmlnKCk6IFRyYWluaW5nQ29uZmlnIHtcbiAgICByZXR1cm4ge1xuICAgICAgbG9zczogdGhpcy5nZXRMb3NzSWRlbnRpZmllcnMoKSxcbiAgICAgIG1ldHJpY3M6IHRoaXMuZ2V0TWV0cmljSWRlbnRpZmllcnMoKSxcbiAgICAgIG9wdGltaXplcl9jb25maWc6IHtcbiAgICAgICAgY2xhc3NfbmFtZTogdGhpcy5vcHRpbWl6ZXIuZ2V0Q2xhc3NOYW1lKCksXG4gICAgICAgIGNvbmZpZzogdGhpcy5vcHRpbWl6ZXIuZ2V0Q29uZmlnKClcbiAgICAgIH0gYXMgT3B0aW1pemVyU2VyaWFsaXphdGlvblxuICAgIH07XG4gICAgLy8gVE9ETyhjYWlzKTogQWRkIHdlaWdodF9tZXRyaWNzIHdoZW4gdGhleSBhcmUgc3VwcG9ydGVkLlxuICAgIC8vIFRPRE8oY2Fpcyk6IEFkZCBzYW1wbGVfd2VpZ2h0X21vZGUgd2hlbiBpdCdzIHN1cHBvcnRlZC5cbiAgICAvLyBUT0RPKGNhaXMpOiBBZGQgbG9zc193ZWlnaHRzIHdoZW4gaXQncyBzdXBwb3J0ZWQuXG4gIH1cblxuICBsb2FkVHJhaW5pbmdDb25maWcodHJhaW5pbmdDb25maWc6IFRyYWluaW5nQ29uZmlnKSB7XG4gICAgaWYgKHRyYWluaW5nQ29uZmlnLndlaWdodGVkX21ldHJpY3MgIT0gbnVsbCkge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKCdMb2FkaW5nIHdlaWdodF9tZXRyaWNzIGlzIG5vdCBzdXBwb3J0ZWQgeWV0LicpO1xuICAgIH1cbiAgICBpZiAodHJhaW5pbmdDb25maWcubG9zc193ZWlnaHRzICE9IG51bGwpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcignTG9hZGluZyBsb3NzX3dlaWdodHMgaXMgbm90IHN1cHBvcnRlZCB5ZXQuJyk7XG4gICAgfVxuICAgIGlmICh0cmFpbmluZ0NvbmZpZy5zYW1wbGVfd2VpZ2h0X21vZGUgIT0gbnVsbCkge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKCdMb2FkaW5nIHNhbXBsZV93ZWlnaHRfbW9kZSBpcyBub3Qgc3VwcG9ydGVkIHlldC4nKTtcbiAgICB9XG5cbiAgICBjb25zdCB0c0NvbmZpZyA9IGNvbnZlcnRQeXRob25pY1RvVHModHJhaW5pbmdDb25maWcub3B0aW1pemVyX2NvbmZpZykgYXNcbiAgICAgICAgc2VyaWFsaXphdGlvbi5Db25maWdEaWN0O1xuICAgIGNvbnN0IG9wdGltaXplciA9IGRlc2VyaWFsaXplKHRzQ29uZmlnKSBhcyBPcHRpbWl6ZXI7XG5cbiAgICBsZXQgbG9zcztcbiAgICBpZiAodHlwZW9mIHRyYWluaW5nQ29uZmlnLmxvc3MgPT09ICdzdHJpbmcnKSB7XG4gICAgICBsb3NzID0gdG9DYW1lbENhc2UodHJhaW5pbmdDb25maWcubG9zcyk7XG4gICAgfSBlbHNlIGlmIChBcnJheS5pc0FycmF5KHRyYWluaW5nQ29uZmlnLmxvc3MpKSB7XG4gICAgICBsb3NzID0gdHJhaW5pbmdDb25maWcubG9zcy5tYXAobG9zc0VudHJ5ID0+IHRvQ2FtZWxDYXNlKGxvc3NFbnRyeSkpO1xuICAgIH0gZWxzZSBpZiAodHJhaW5pbmdDb25maWcubG9zcyAhPSBudWxsKSB7XG4gICAgICBsb3NzID0ge30gYXMge1tvdXRwdXROYW1lOiBzdHJpbmddOiBMb3NzSWRlbnRpZmllcn07XG4gICAgICBmb3IgKGNvbnN0IGtleSBpbiB0cmFpbmluZ0NvbmZpZy5sb3NzKSB7XG4gICAgICAgIGxvc3Nba2V5XSA9IHRvQ2FtZWxDYXNlKHRyYWluaW5nQ29uZmlnLmxvc3Nba2V5XSkgYXMgTG9zc0lkZW50aWZpZXI7XG4gICAgICB9XG4gICAgfVxuXG4gICAgbGV0IG1ldHJpY3M7XG4gICAgaWYgKEFycmF5LmlzQXJyYXkodHJhaW5pbmdDb25maWcubWV0cmljcykpIHtcbiAgICAgIG1ldHJpY3MgPSB0cmFpbmluZ0NvbmZpZy5tZXRyaWNzLm1hcChtZXRyaWMgPT4gdG9DYW1lbENhc2UobWV0cmljKSk7XG4gICAgfSBlbHNlIGlmICh0cmFpbmluZ0NvbmZpZy5tZXRyaWNzICE9IG51bGwpIHtcbiAgICAgIG1ldHJpY3MgPSB7fSBhcyB7W291dHB1dE5hbWU6IHN0cmluZ106IE1ldHJpY3NJZGVudGlmaWVyfTtcbiAgICAgIGZvciAoY29uc3Qga2V5IGluIHRyYWluaW5nQ29uZmlnLm1ldHJpY3MpIHtcbiAgICAgICAgbWV0cmljc1trZXldID0gdG9DYW1lbENhc2UodHJhaW5pbmdDb25maWcubWV0cmljc1trZXldKTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICB0aGlzLmNvbXBpbGUoe2xvc3MsIG1ldHJpY3MsIG9wdGltaXplcn0pO1xuICB9XG5cbiAgLyoqXG4gICAqIFNhdmUgdGhlIGNvbmZpZ3VyYXRpb24gYW5kL29yIHdlaWdodHMgb2YgdGhlIExheWVyc01vZGVsLlxuICAgKlxuICAgKiBBbiBgSU9IYW5kbGVyYCBpcyBhbiBvYmplY3QgdGhhdCBoYXMgYSBgc2F2ZWAgbWV0aG9kIG9mIHRoZSBwcm9wZXJcbiAgICogc2lnbmF0dXJlIGRlZmluZWQuIFRoZSBgc2F2ZWAgbWV0aG9kIG1hbmFnZXMgdGhlIHN0b3Jpbmcgb3JcbiAgICogdHJhbnNtaXNzaW9uIG9mIHNlcmlhbGl6ZWQgZGF0YSAoXCJhcnRpZmFjdHNcIikgdGhhdCByZXByZXNlbnQgdGhlXG4gICAqIG1vZGVsJ3MgdG9wb2xvZ3kgYW5kIHdlaWdodHMgb250byBvciB2aWEgYSBzcGVjaWZpYyBtZWRpdW0sIHN1Y2ggYXNcbiAgICogZmlsZSBkb3dubG9hZHMsIGxvY2FsIHN0b3JhZ2UsIEluZGV4ZWREQiBpbiB0aGUgd2ViIGJyb3dzZXIgYW5kIEhUVFBcbiAgICogcmVxdWVzdHMgdG8gYSBzZXJ2ZXIuIFRlbnNvckZsb3cuanMgcHJvdmlkZXMgYElPSGFuZGxlcmBcbiAgICogaW1wbGVtZW50YXRpb25zIGZvciBhIG51bWJlciBvZiBmcmVxdWVudGx5IHVzZWQgc2F2aW5nIG1lZGl1bXMsIHN1Y2ggYXNcbiAgICogYHRmLmlvLmJyb3dzZXJEb3dubG9hZHNgIGFuZCBgdGYuaW8uYnJvd3NlckxvY2FsU3RvcmFnZWAuIFNlZSBgdGYuaW9gXG4gICAqIGZvciBtb3JlIGRldGFpbHMuXG4gICAqXG4gICAqIFRoaXMgbWV0aG9kIGFsc28gYWxsb3dzIHlvdSB0byByZWZlciB0byBjZXJ0YWluIHR5cGVzIG9mIGBJT0hhbmRsZXJgc1xuICAgKiBhcyBVUkwtbGlrZSBzdHJpbmcgc2hvcnRjdXRzLCBzdWNoIGFzICdsb2NhbHN0b3JhZ2U6Ly8nIGFuZFxuICAgKiAnaW5kZXhlZGRiOi8vJy5cbiAgICpcbiAgICogRXhhbXBsZSAxOiBTYXZlIGBtb2RlbGAncyB0b3BvbG9neSBhbmQgd2VpZ2h0cyB0byBicm93c2VyIFtsb2NhbFxuICAgKiBzdG9yYWdlXShodHRwczovL2RldmVsb3Blci5tb3ppbGxhLm9yZy9lbi1VUy9kb2NzL1dlYi9BUEkvV2luZG93L2xvY2FsU3RvcmFnZSk7XG4gICAqIHRoZW4gbG9hZCBpdCBiYWNrLlxuICAgKlxuICAgKiBgYGBqc1xuICAgKiBjb25zdCBtb2RlbCA9IHRmLnNlcXVlbnRpYWwoXG4gICAqICAgICB7bGF5ZXJzOiBbdGYubGF5ZXJzLmRlbnNlKHt1bml0czogMSwgaW5wdXRTaGFwZTogWzNdfSldfSk7XG4gICAqIGNvbnNvbGUubG9nKCdQcmVkaWN0aW9uIGZyb20gb3JpZ2luYWwgbW9kZWw6Jyk7XG4gICAqIG1vZGVsLnByZWRpY3QodGYub25lcyhbMSwgM10pKS5wcmludCgpO1xuICAgKlxuICAgKiBjb25zdCBzYXZlUmVzdWx0cyA9IGF3YWl0IG1vZGVsLnNhdmUoJ2xvY2Fsc3RvcmFnZTovL215LW1vZGVsLTEnKTtcbiAgICpcbiAgICogY29uc3QgbG9hZGVkTW9kZWwgPSBhd2FpdCB0Zi5sb2FkTGF5ZXJzTW9kZWwoJ2xvY2Fsc3RvcmFnZTovL215LW1vZGVsLTEnKTtcbiAgICogY29uc29sZS5sb2coJ1ByZWRpY3Rpb24gZnJvbSBsb2FkZWQgbW9kZWw6Jyk7XG4gICAqIGxvYWRlZE1vZGVsLnByZWRpY3QodGYub25lcyhbMSwgM10pKS5wcmludCgpO1xuICAgKiBgYGBcbiAgICpcbiAgICogRXhhbXBsZSAyLiBTYXZpbmcgYG1vZGVsYCdzIHRvcG9sb2d5IGFuZCB3ZWlnaHRzIHRvIGJyb3dzZXJcbiAgICogW0luZGV4ZWREQl0oaHR0cHM6Ly9kZXZlbG9wZXIubW96aWxsYS5vcmcvZW4tVVMvZG9jcy9XZWIvQVBJL0luZGV4ZWREQl9BUEkpO1xuICAgKiB0aGVuIGxvYWQgaXQgYmFjay5cbiAgICpcbiAgICogYGBganNcbiAgICogY29uc3QgbW9kZWwgPSB0Zi5zZXF1ZW50aWFsKFxuICAgKiAgICAge2xheWVyczogW3RmLmxheWVycy5kZW5zZSh7dW5pdHM6IDEsIGlucHV0U2hhcGU6IFszXX0pXX0pO1xuICAgKiBjb25zb2xlLmxvZygnUHJlZGljdGlvbiBmcm9tIG9yaWdpbmFsIG1vZGVsOicpO1xuICAgKiBtb2RlbC5wcmVkaWN0KHRmLm9uZXMoWzEsIDNdKSkucHJpbnQoKTtcbiAgICpcbiAgICogY29uc3Qgc2F2ZVJlc3VsdHMgPSBhd2FpdCBtb2RlbC5zYXZlKCdpbmRleGVkZGI6Ly9teS1tb2RlbC0xJyk7XG4gICAqXG4gICAqIGNvbnN0IGxvYWRlZE1vZGVsID0gYXdhaXQgdGYubG9hZExheWVyc01vZGVsKCdpbmRleGVkZGI6Ly9teS1tb2RlbC0xJyk7XG4gICAqIGNvbnNvbGUubG9nKCdQcmVkaWN0aW9uIGZyb20gbG9hZGVkIG1vZGVsOicpO1xuICAgKiBsb2FkZWRNb2RlbC5wcmVkaWN0KHRmLm9uZXMoWzEsIDNdKSkucHJpbnQoKTtcbiAgICogYGBgXG4gICAqXG4gICAqIEV4YW1wbGUgMy4gU2F2aW5nIGBtb2RlbGAncyB0b3BvbG9neSBhbmQgd2VpZ2h0cyBhcyB0d28gZmlsZXNcbiAgICogKGBteS1tb2RlbC0xLmpzb25gIGFuZCBgbXktbW9kZWwtMS53ZWlnaHRzLmJpbmApIGRvd25sb2FkZWQgZnJvbVxuICAgKiBicm93c2VyLlxuICAgKlxuICAgKiBgYGBqc1xuICAgKiBjb25zdCBtb2RlbCA9IHRmLnNlcXVlbnRpYWwoXG4gICAqICAgICB7bGF5ZXJzOiBbdGYubGF5ZXJzLmRlbnNlKHt1bml0czogMSwgaW5wdXRTaGFwZTogWzNdfSldfSk7XG4gICAqIGNvbnN0IHNhdmVSZXN1bHRzID0gYXdhaXQgbW9kZWwuc2F2ZSgnZG93bmxvYWRzOi8vbXktbW9kZWwtMScpO1xuICAgKiBgYGBcbiAgICpcbiAgICogRXhhbXBsZSA0LiBTZW5kICBgbW9kZWxgJ3MgdG9wb2xvZ3kgYW5kIHdlaWdodHMgdG8gYW4gSFRUUCBzZXJ2ZXIuXG4gICAqIFNlZSB0aGUgZG9jdW1lbnRhdGlvbiBvZiBgdGYuaW8uaHR0cGAgZm9yIG1vcmUgZGV0YWlsc1xuICAgKiBpbmNsdWRpbmcgc3BlY2lmeWluZyByZXF1ZXN0IHBhcmFtZXRlcnMgYW5kIGltcGxlbWVudGF0aW9uIG9mIHRoZVxuICAgKiBzZXJ2ZXIuXG4gICAqXG4gICAqIGBgYGpzXG4gICAqIGNvbnN0IG1vZGVsID0gdGYuc2VxdWVudGlhbChcbiAgICogICAgIHtsYXllcnM6IFt0Zi5sYXllcnMuZGVuc2Uoe3VuaXRzOiAxLCBpbnB1dFNoYXBlOiBbM119KV19KTtcbiAgICogY29uc3Qgc2F2ZVJlc3VsdHMgPSBhd2FpdCBtb2RlbC5zYXZlKCdodHRwOi8vbXktc2VydmVyL21vZGVsL3VwbG9hZCcpO1xuICAgKiBgYGBcbiAgICpcbiAgICogQHBhcmFtIGhhbmRsZXJPclVSTCBBbiBpbnN0YW5jZSBvZiBgSU9IYW5kbGVyYCBvciBhIFVSTC1saWtlLFxuICAgKiBzY2hlbWUtYmFzZWQgc3RyaW5nIHNob3J0Y3V0IGZvciBgSU9IYW5kbGVyYC5cbiAgICogQHBhcmFtIGNvbmZpZyBPcHRpb25zIGZvciBzYXZpbmcgdGhlIG1vZGVsLlxuICAgKiBAcmV0dXJucyBBIGBQcm9taXNlYCBvZiBgU2F2ZVJlc3VsdGAsIHdoaWNoIHN1bW1hcml6ZXMgdGhlIHJlc3VsdCBvZlxuICAgKiB0aGUgc2F2aW5nLCBzdWNoIGFzIGJ5dGUgc2l6ZXMgb2YgdGhlIHNhdmVkIGFydGlmYWN0cyBmb3IgdGhlIG1vZGVsJ3NcbiAgICogICB0b3BvbG9neSBhbmQgd2VpZ2h0IHZhbHVlcy5cbiAgICpcbiAgICogQGRvYyB7aGVhZGluZzogJ01vZGVscycsIHN1YmhlYWRpbmc6ICdDbGFzc2VzJywgaWdub3JlQ0k6IHRydWV9XG4gICAqL1xuICBhc3luYyBzYXZlKGhhbmRsZXJPclVSTDogaW8uSU9IYW5kbGVyfHN0cmluZywgY29uZmlnPzogaW8uU2F2ZUNvbmZpZyk6XG4gICAgICBQcm9taXNlPGlvLlNhdmVSZXN1bHQ+IHtcbiAgICBpZiAodHlwZW9mIGhhbmRsZXJPclVSTCA9PT0gJ3N0cmluZycpIHtcbiAgICAgIGNvbnN0IGhhbmRsZXJzID0gaW8uZ2V0U2F2ZUhhbmRsZXJzKGhhbmRsZXJPclVSTCk7XG4gICAgICBpZiAoaGFuZGxlcnMubGVuZ3RoID09PSAwKSB7XG4gICAgICAgIHRocm93IG5ldyBWYWx1ZUVycm9yKFxuICAgICAgICAgICAgYENhbm5vdCBmaW5kIGFueSBzYXZlIGhhbmRsZXJzIGZvciBVUkwgJyR7aGFuZGxlck9yVVJMfSdgKTtcbiAgICAgIH0gZWxzZSBpZiAoaGFuZGxlcnMubGVuZ3RoID4gMSkge1xuICAgICAgICB0aHJvdyBuZXcgVmFsdWVFcnJvcihcbiAgICAgICAgICAgIGBGb3VuZCBtb3JlIHRoYW4gb25lICgke2hhbmRsZXJzLmxlbmd0aH0pIHNhdmUgaGFuZGxlcnMgZm9yIGAgK1xuICAgICAgICAgICAgYFVSTCAnJHtoYW5kbGVyT3JVUkx9J2ApO1xuICAgICAgfVxuICAgICAgaGFuZGxlck9yVVJMID0gaGFuZGxlcnNbMF07XG4gICAgfVxuICAgIGlmIChoYW5kbGVyT3JVUkwuc2F2ZSA9PSBudWxsKSB7XG4gICAgICB0aHJvdyBuZXcgVmFsdWVFcnJvcihcbiAgICAgICAgICAnTGF5ZXJzTW9kZWwuc2F2ZSgpIGNhbm5vdCBwcm9jZWVkIGJlY2F1c2UgdGhlIElPSGFuZGxlciAnICtcbiAgICAgICAgICAncHJvdmlkZWQgZG9lcyBub3QgaGF2ZSB0aGUgYHNhdmVgIGF0dHJpYnV0ZSBkZWZpbmVkLicpO1xuICAgIH1cblxuICAgIGNvbnN0IHdlaWdodERhdGFBbmRTcGVjcyA9XG4gICAgICAgIGF3YWl0IGlvLmVuY29kZVdlaWdodHModGhpcy5nZXROYW1lZFdlaWdodHMoY29uZmlnKSk7XG5cbiAgICBjb25zdCByZXR1cm5TdHJpbmcgPSBmYWxzZTtcbiAgICBjb25zdCB1bnVzZWRBcmc6IHt9ID0gbnVsbDtcbiAgICBjb25zdCBtb2RlbENvbmZpZyA9IHRoaXMudG9KU09OKHVudXNlZEFyZywgcmV0dXJuU3RyaW5nKTtcbiAgICBjb25zdCBtb2RlbEFydGlmYWN0czogaW8uTW9kZWxBcnRpZmFjdHMgPSB7XG4gICAgICBtb2RlbFRvcG9sb2d5OiBtb2RlbENvbmZpZyxcbiAgICAgIGZvcm1hdDogTEFZRVJTX01PREVMX0ZPUk1BVF9OQU1FLFxuICAgICAgZ2VuZXJhdGVkQnk6IGBUZW5zb3JGbG93LmpzIHRmanMtbGF5ZXJzIHYke3ZlcnNpb259YCxcbiAgICAgIGNvbnZlcnRlZEJ5OiBudWxsLFxuICAgIH07XG5cbiAgICBjb25zdCBpbmNsdWRlT3B0aW1pemVyID0gY29uZmlnID09IG51bGwgPyBmYWxzZSA6IGNvbmZpZy5pbmNsdWRlT3B0aW1pemVyO1xuICAgIGlmIChpbmNsdWRlT3B0aW1pemVyICYmIHRoaXMub3B0aW1pemVyICE9IG51bGwpIHtcbiAgICAgIG1vZGVsQXJ0aWZhY3RzLnRyYWluaW5nQ29uZmlnID0gdGhpcy5nZXRUcmFpbmluZ0NvbmZpZygpO1xuICAgICAgY29uc3Qgd2VpZ2h0VHlwZSA9ICdvcHRpbWl6ZXInO1xuICAgICAgY29uc3Qge2RhdGE6IG9wdGltaXplcldlaWdodERhdGEsIHNwZWNzOiBvcHRpbWl6ZXJXZWlnaHRTcGVjc30gPVxuICAgICAgICAgIGF3YWl0IGlvLmVuY29kZVdlaWdodHMoYXdhaXQgdGhpcy5vcHRpbWl6ZXIuZ2V0V2VpZ2h0cygpLCB3ZWlnaHRUeXBlKTtcbiAgICAgIHdlaWdodERhdGFBbmRTcGVjcy5zcGVjcy5wdXNoKC4uLm9wdGltaXplcldlaWdodFNwZWNzKTtcbiAgICAgIHdlaWdodERhdGFBbmRTcGVjcy5kYXRhID0gaW8uY29uY2F0ZW5hdGVBcnJheUJ1ZmZlcnMoXG4gICAgICAgICAgW3dlaWdodERhdGFBbmRTcGVjcy5kYXRhLCBvcHRpbWl6ZXJXZWlnaHREYXRhXSk7XG4gICAgfVxuXG4gICAgaWYgKHRoaXMudXNlckRlZmluZWRNZXRhZGF0YSAhPSBudWxsKSB7XG4gICAgICAvLyBDaGVjayBzZXJpYWxpemVkIHNpemUgb2YgdXNlci1kZWZpbmVkIG1ldGFkYXRhLlxuICAgICAgY29uc3QgY2hlY2tTaXplID0gdHJ1ZTtcbiAgICAgIGNoZWNrVXNlckRlZmluZWRNZXRhZGF0YSh0aGlzLnVzZXJEZWZpbmVkTWV0YWRhdGEsIHRoaXMubmFtZSwgY2hlY2tTaXplKTtcbiAgICAgIG1vZGVsQXJ0aWZhY3RzLnVzZXJEZWZpbmVkTWV0YWRhdGEgPSB0aGlzLnVzZXJEZWZpbmVkTWV0YWRhdGE7XG4gICAgfVxuXG4gICAgbW9kZWxBcnRpZmFjdHMud2VpZ2h0RGF0YSA9IHdlaWdodERhdGFBbmRTcGVjcy5kYXRhO1xuICAgIG1vZGVsQXJ0aWZhY3RzLndlaWdodFNwZWNzID0gd2VpZ2h0RGF0YUFuZFNwZWNzLnNwZWNzO1xuICAgIHJldHVybiBoYW5kbGVyT3JVUkwuc2F2ZShtb2RlbEFydGlmYWN0cyk7XG4gIH1cblxuICAvKipcbiAgICogU2V0IHVzZXItZGVmaW5lZCBtZXRhZGF0YS5cbiAgICpcbiAgICogVGhlIHNldCBtZXRhZGF0YSB3aWxsIGJlIHNlcmlhbGl6ZWQgdG9nZXRoZXIgd2l0aCB0aGUgdG9wb2xvZ3lcbiAgICogYW5kIHdlaWdodHMgb2YgdGhlIG1vZGVsIGR1cmluZyBgc2F2ZSgpYCBjYWxscy5cbiAgICpcbiAgICogQHBhcmFtIHNldFVzZXJEZWZpbmVkTWV0YWRhdGFcbiAgICovXG4gIHNldFVzZXJEZWZpbmVkTWV0YWRhdGEodXNlckRlZmluZWRNZXRhZGF0YToge30pOiB2b2lkIHtcbiAgICBjaGVja1VzZXJEZWZpbmVkTWV0YWRhdGEodXNlckRlZmluZWRNZXRhZGF0YSwgdGhpcy5uYW1lKTtcbiAgICB0aGlzLnVzZXJEZWZpbmVkTWV0YWRhdGEgPSB1c2VyRGVmaW5lZE1ldGFkYXRhO1xuICB9XG5cbiAgLyoqXG4gICAqIEdldCB1c2VyLWRlZmluZWQgbWV0YWRhdGEuXG4gICAqXG4gICAqIFRoZSBtZXRhZGF0YSBpcyBzdXBwbGllZCB2aWEgb25lIG9mIHRoZSB0d28gcm91dGVzOlxuICAgKiAgIDEuIEJ5IGNhbGxpbmcgYHNldFVzZXJEZWZpbmVkTWV0YWRhdGEoKWAuXG4gICAqICAgMi4gTG9hZGVkIGR1cmluZyBtb2RlbCBsb2FkaW5nIChpZiB0aGUgbW9kZWwgaXMgY29uc3RydWN0ZWRcbiAgICogICAgICB2aWEgYHRmLmxvYWRMYXllcnNNb2RlbCgpYC4pXG4gICAqXG4gICAqIElmIG5vIHVzZXItZGVmaW5lZCBtZXRhZGF0YSBpcyBhdmFpbGFibGUgZnJvbSBlaXRoZXIgb2YgdGhlXG4gICAqIHR3byByb3V0ZXMsIHRoaXMgZnVuY3Rpb24gd2lsbCByZXR1cm4gYHVuZGVmaW5lZGAuXG4gICAqL1xuICBnZXRVc2VyRGVmaW5lZE1ldGFkYXRhKCk6IHt9IHtcbiAgICByZXR1cm4gdGhpcy51c2VyRGVmaW5lZE1ldGFkYXRhO1xuICB9XG59XG5zZXJpYWxpemF0aW9uLnJlZ2lzdGVyQ2xhc3MoTGF5ZXJzTW9kZWwpO1xuXG4vKipcbiAqIEEgYHRmLkZ1bmN0aW9uYWxgIGlzIGFuIGFsaWFzIHRvIGB0Zi5MYXllcnNNb2RlbGAuXG4gKlxuICogU2VlIGFsc286XG4gKiAgIGB0Zi5MYXllcnNNb2RlbGAsIGB0Zi5TZXF1ZW50aWFsYCwgYHRmLmxvYWRMYXllcnNNb2RlbGAuXG4gKi9cbi8qKiBAZG9jIHtoZWFkaW5nOiAnTW9kZWxzJywgc3ViaGVhZGluZzogJ0NsYXNzZXMnfSAqL1xuZXhwb3J0IGNsYXNzIEZ1bmN0aW9uYWwgZXh0ZW5kcyBMYXllcnNNb2RlbCB7XG4gIHN0YXRpYyBjbGFzc05hbWUgPSAnRnVuY3Rpb25hbCc7XG59XG5zZXJpYWxpemF0aW9uLnJlZ2lzdGVyQ2xhc3MoRnVuY3Rpb25hbCk7XG4iXX0=","/**\n * @license\n * Copyright 2018 Google LLC\n *\n * Use of this source code is governed by an MIT-style\n * license that can be found in the LICENSE file or at\n * https://opensource.org/licenses/MIT.\n * =============================================================================\n */\n/**\n * Optimizers.\n */\nimport { train } from '@tensorflow/tfjs-core';\nimport { epsilon } from './backend/common';\nimport { ValueError } from './errors';\n// Add (de)serialize()\n// Porting note: This diverges from the PyKeras implementation and may need to\n// change based on (de)serialization requirements.\nexport function getOptimizer(identifier) {\n const optimizerMap = {\n 'Adagrad': () => train.adagrad(0.01),\n 'Adadelta': () => train.adadelta(1, 0.95, epsilon()),\n 'Adam': () => train.adam(0.001, 0.9, 0.999, epsilon()),\n 'Adamax': () => train.adamax(0.002, 0.9, 0.999, epsilon(), 0),\n 'RMSProp': () => train.rmsprop(0.001, 0.9, 0, epsilon()),\n 'SGD': () => train.sgd(0.01)\n };\n optimizerMap['adagrad'] = optimizerMap['Adagrad'];\n optimizerMap['adadelta'] = optimizerMap['Adadelta'];\n optimizerMap['adam'] = optimizerMap['Adam'];\n optimizerMap['adamax'] = optimizerMap['Adamax'];\n optimizerMap['rmsprop'] = optimizerMap['RMSProp'];\n optimizerMap['sgd'] = optimizerMap['SGD'];\n if (identifier in optimizerMap) {\n return optimizerMap[identifier]();\n }\n throw new ValueError(`Unknown Optimizer ${identifier}`);\n}\n//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoib3B0aW1pemVycy5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uL3RmanMtbGF5ZXJzL3NyYy9vcHRpbWl6ZXJzLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBOzs7Ozs7OztHQVFHO0FBRUg7O0dBRUc7QUFFSCxPQUFPLEVBQVksS0FBSyxFQUFDLE1BQU0sdUJBQXVCLENBQUM7QUFFdkQsT0FBTyxFQUFDLE9BQU8sRUFBQyxNQUFNLGtCQUFrQixDQUFDO0FBRXpDLE9BQU8sRUFBQyxVQUFVLEVBQUMsTUFBTSxVQUFVLENBQUM7QUFFcEMsc0JBQXNCO0FBRXRCLDhFQUE4RTtBQUM5RSxrREFBa0Q7QUFDbEQsTUFBTSxVQUFVLFlBQVksQ0FBQyxVQUFrQjtJQUM3QyxNQUFNLFlBQVksR0FBK0M7UUFDL0QsU0FBUyxFQUFFLEdBQUcsRUFBRSxDQUFDLEtBQUssQ0FBQyxPQUFPLENBQUMsSUFBSSxDQUFDO1FBQ3BDLFVBQVUsRUFBRSxHQUFHLEVBQUUsQ0FBQyxLQUFLLENBQUMsUUFBUSxDQUFDLENBQUMsRUFBRSxJQUFJLEVBQUUsT0FBTyxFQUFFLENBQUM7UUFDcEQsTUFBTSxFQUFFLEdBQUcsRUFBRSxDQUFDLEtBQUssQ0FBQyxJQUFJLENBQUMsS0FBSyxFQUFFLEdBQUcsRUFBRSxLQUFLLEVBQUUsT0FBTyxFQUFFLENBQUM7UUFDdEQsUUFBUSxFQUFFLEdBQUcsRUFBRSxDQUFDLEtBQUssQ0FBQyxNQUFNLENBQUMsS0FBSyxFQUFFLEdBQUcsRUFBRSxLQUFLLEVBQUUsT0FBTyxFQUFFLEVBQUUsQ0FBQyxDQUFDO1FBQzdELFNBQVMsRUFBRSxHQUFHLEVBQUUsQ0FBQyxLQUFLLENBQUMsT0FBTyxDQUFDLEtBQUssRUFBRSxHQUFHLEVBQUUsQ0FBQyxFQUFFLE9BQU8sRUFBRSxDQUFDO1FBQ3hELEtBQUssRUFBRSxHQUFHLEVBQUUsQ0FBQyxLQUFLLENBQUMsR0FBRyxDQUFDLElBQUksQ0FBQztLQUM3QixDQUFDO0lBQ0YsWUFBWSxDQUFDLFNBQVMsQ0FBQyxHQUFHLFlBQVksQ0FBQyxTQUFTLENBQUMsQ0FBQztJQUNsRCxZQUFZLENBQUMsVUFBVSxDQUFDLEdBQUcsWUFBWSxDQUFDLFVBQVUsQ0FBQyxDQUFDO0lBQ3BELFlBQVksQ0FBQyxNQUFNLENBQUMsR0FBRyxZQUFZLENBQUMsTUFBTSxDQUFDLENBQUM7SUFDNUMsWUFBWSxDQUFDLFFBQVEsQ0FBQyxHQUFHLFlBQVksQ0FBQyxRQUFRLENBQUMsQ0FBQztJQUNoRCxZQUFZLENBQUMsU0FBUyxDQUFDLEdBQUcsWUFBWSxDQUFDLFNBQVMsQ0FBQyxDQUFDO0lBQ2xELFlBQVksQ0FBQyxLQUFLLENBQUMsR0FBRyxZQUFZLENBQUMsS0FBSyxDQUFDLENBQUM7SUFFMUMsSUFBSSxVQUFVLElBQUksWUFBWSxFQUFFO1FBQzlCLE9BQU8sWUFBWSxDQUFDLFVBQVUsQ0FBQyxFQUFFLENBQUM7S0FDbkM7SUFDRCxNQUFNLElBQUksVUFBVSxDQUFDLHFCQUFxQixVQUFVLEVBQUUsQ0FBQyxDQUFDO0FBQzFELENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyIvKipcbiAqIEBsaWNlbnNlXG4gKiBDb3B5cmlnaHQgMjAxOCBHb29nbGUgTExDXG4gKlxuICogVXNlIG9mIHRoaXMgc291cmNlIGNvZGUgaXMgZ292ZXJuZWQgYnkgYW4gTUlULXN0eWxlXG4gKiBsaWNlbnNlIHRoYXQgY2FuIGJlIGZvdW5kIGluIHRoZSBMSUNFTlNFIGZpbGUgb3IgYXRcbiAqIGh0dHBzOi8vb3BlbnNvdXJjZS5vcmcvbGljZW5zZXMvTUlULlxuICogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbiAqL1xuXG4vKipcbiAqIE9wdGltaXplcnMuXG4gKi9cblxuaW1wb3J0IHtPcHRpbWl6ZXIsIHRyYWlufSBmcm9tICdAdGVuc29yZmxvdy90ZmpzLWNvcmUnO1xuXG5pbXBvcnQge2Vwc2lsb259IGZyb20gJy4vYmFja2VuZC9jb21tb24nO1xuXG5pbXBvcnQge1ZhbHVlRXJyb3J9IGZyb20gJy4vZXJyb3JzJztcblxuLy8gQWRkIChkZSlzZXJpYWxpemUoKVxuXG4vLyBQb3J0aW5nIG5vdGU6IFRoaXMgZGl2ZXJnZXMgZnJvbSB0aGUgUHlLZXJhcyBpbXBsZW1lbnRhdGlvbiBhbmQgbWF5IG5lZWQgdG9cbi8vIGNoYW5nZSBiYXNlZCBvbiAoZGUpc2VyaWFsaXphdGlvbiByZXF1aXJlbWVudHMuXG5leHBvcnQgZnVuY3Rpb24gZ2V0T3B0aW1pemVyKGlkZW50aWZpZXI6IHN0cmluZyk6IE9wdGltaXplciB7XG4gIGNvbnN0IG9wdGltaXplck1hcDoge1tvcHRpbWl6ZXJOYW1lOiBzdHJpbmddOiAoKSA9PiBPcHRpbWl6ZXJ9ID0ge1xuICAgICdBZGFncmFkJzogKCkgPT4gdHJhaW4uYWRhZ3JhZCgwLjAxKSxcbiAgICAnQWRhZGVsdGEnOiAoKSA9PiB0cmFpbi5hZGFkZWx0YSgxLCAwLjk1LCBlcHNpbG9uKCkpLFxuICAgICdBZGFtJzogKCkgPT4gdHJhaW4uYWRhbSgwLjAwMSwgMC45LCAwLjk5OSwgZXBzaWxvbigpKSxcbiAgICAnQWRhbWF4JzogKCkgPT4gdHJhaW4uYWRhbWF4KDAuMDAyLCAwLjksIDAuOTk5LCBlcHNpbG9uKCksIDApLFxuICAgICdSTVNQcm9wJzogKCkgPT4gdHJhaW4ucm1zcHJvcCgwLjAwMSwgMC45LCAwLCBlcHNpbG9uKCkpLFxuICAgICdTR0QnOiAoKSA9PiB0cmFpbi5zZ2QoMC4wMSlcbiAgfTtcbiAgb3B0aW1pemVyTWFwWydhZGFncmFkJ10gPSBvcHRpbWl6ZXJNYXBbJ0FkYWdyYWQnXTtcbiAgb3B0aW1pemVyTWFwWydhZGFkZWx0YSddID0gb3B0aW1pemVyTWFwWydBZGFkZWx0YSddO1xuICBvcHRpbWl6ZXJNYXBbJ2FkYW0nXSA9IG9wdGltaXplck1hcFsnQWRhbSddO1xuICBvcHRpbWl6ZXJNYXBbJ2FkYW1heCddID0gb3B0aW1pemVyTWFwWydBZGFtYXgnXTtcbiAgb3B0aW1pemVyTWFwWydybXNwcm9wJ10gPSBvcHRpbWl6ZXJNYXBbJ1JNU1Byb3AnXTtcbiAgb3B0aW1pemVyTWFwWydzZ2QnXSA9IG9wdGltaXplck1hcFsnU0dEJ107XG5cbiAgaWYgKGlkZW50aWZpZXIgaW4gb3B0aW1pemVyTWFwKSB7XG4gICAgcmV0dXJuIG9wdGltaXplck1hcFtpZGVudGlmaWVyXSgpO1xuICB9XG4gIHRocm93IG5ldyBWYWx1ZUVycm9yKGBVbmtub3duIE9wdGltaXplciAke2lkZW50aWZpZXJ9YCk7XG59XG4iXX0=","/**\n * @license\n * Copyright 2018 Google LLC\n *\n * Use of this source code is governed by an MIT-style\n * license that can be found in the LICENSE file or at\n * https://opensource.org/licenses/MIT.\n * =============================================================================\n */\n/* Original source keras/models.py */\nimport { dispose, io, serialization, util } from '@tensorflow/tfjs-core';\nimport { getUid } from './backend/state';\nimport { Input } from './engine/input_layer';\nimport { getSourceInputs, Node } from './engine/topology';\nimport { LayersModel } from './engine/training';\nimport { NotImplementedError, RuntimeError, ValueError } from './errors';\nimport { deserialize } from './layers/serialization';\nimport * as generic_utils from './utils/generic_utils';\nimport { convertPythonicToTs } from './utils/serialization_utils';\nimport { getExactlyOneShape } from './utils/types_utils';\n/**\n * Parses a JSON model configuration file and returns a model instance.\n *\n * ```js\n * // This example shows how to serialize a model using `toJSON()` and\n * // deserialize it as another model using `tf.models.modelFromJSON()`.\n * // Note: this example serializes and deserializes only the topology\n * // of the model; the weights of the loaded model will be different\n * // from those of the the original model, due to random weight\n * // initialization.\n * // To load the topology and weights of a model, use `tf.loadLayersModel()`.\n * const model1 = tf.sequential();\n * model1.add(tf.layers.repeatVector({inputShape: [2], n: 4}));\n * // Serialize `model1` as a JSON object.\n * const model1JSON = model1.toJSON(null, false);\n * model1.summary();\n *\n * const model2 = await tf.models.modelFromJSON(model1JSON);\n * model2.summary();\n * ```\n *\n * @param modelAndWeightsConfig JSON object or string encoding a model and\n * weights configuration. It can also be only the topology JSON of the\n * model, in which case the weights will not be loaded.\n * @param custom_objects Optional dictionary mapping names\n * (strings) to custom classes or functions to be\n * considered during deserialization.\n * @returns A TensorFlow.js Layers `tf.LayersModel` instance (uncompiled).\n */\nexport async function modelFromJSON(modelAndWeightsConfig, customObjects) {\n if (!('modelTopology' in modelAndWeightsConfig)) {\n modelAndWeightsConfig = { modelTopology: modelAndWeightsConfig };\n }\n modelAndWeightsConfig = modelAndWeightsConfig;\n let modelTopology = modelAndWeightsConfig.modelTopology;\n if (modelTopology['model_config'] != null) {\n // If the model-topology JSON contains a 'model_config' field, then it is\n // a full model JSON (e.g., from `keras.Model.save()`), which contains\n // not only the model's architecture in its 'model_config' field, but\n // additional information such as the model's optimizer. We use only the\n // 'model_config' field currently.\n modelTopology = modelTopology['model_config'];\n }\n const tsConfig = convertPythonicToTs(modelTopology);\n const model = deserialize(tsConfig, customObjects);\n if (modelAndWeightsConfig.weightsManifest != null) {\n // Load the weight values keyed by the original tensor names in the model\n // file that was loaded. These should match the keys of the weight\n // manifest.\n const weightValues = await io.loadWeights(modelAndWeightsConfig.weightsManifest, modelAndWeightsConfig.pathPrefix, model.weights.map(weight => weight.originalName));\n // Map the weights to the unique tensor names generated during model loading\n const uniqueWeightValues = {};\n for (const weight of model.weights) {\n uniqueWeightValues[weight.originalName] =\n weightValues[weight.originalName];\n }\n model.loadWeights(uniqueWeightValues);\n // Dispose temporary weight values.\n dispose(weightValues);\n }\n return model;\n}\n/**\n * Load a model, including its topology and optionally weights. See the\n * Tutorial named \"How to import a Keras Model\" for usage examples.\n *\n * Example 1: Save `model`'s topology and weights to browser [local\n * storage](https://developer.mozilla.org/en-US/docs/Web/API/Window/localStorage);\n * then load it back.\n *\n * ```js\n * const model = tf.sequential(\n * {layers: [tf.layers.dense({units: 1, inputShape: [3]})]});\n * console.log('Prediction from original model:');\n * model.predict(tf.ones([1, 3])).print();\n *\n * const saveResults = await model.save('localstorage://my-model-1');\n *\n * const loadedModel = await tf.loadLayersModel('localstorage://my-model-1');\n * console.log('Prediction from loaded model:');\n * loadedModel.predict(tf.ones([1, 3])).print();\n * ```\n *\n * Example 2. Saving `model`'s topology and weights to browser\n * [IndexedDB](https://developer.mozilla.org/en-US/docs/Web/API/IndexedDB_API);\n * then load it back.\n *\n * ```js\n * const model = tf.sequential(\n * {layers: [tf.layers.dense({units: 1, inputShape: [3]})]});\n * console.log('Prediction from original model:');\n * model.predict(tf.ones([1, 3])).print();\n *\n * const saveResults = await model.save('indexeddb://my-model-1');\n *\n * const loadedModel = await tf.loadLayersModel('indexeddb://my-model-1');\n * console.log('Prediction from loaded model:');\n * loadedModel.predict(tf.ones([1, 3])).print();\n * ```\n *\n * Example 3. Load a model from user-selected files from HTML\n * [file input\n * elements](https://developer.mozilla.org/en-US/docs/Web/HTML/Element/input/file).\n *\n * ```js\n * // Note: this code snippet will not work without the HTML elements in the\n * // page\n * const jsonUpload = document.getElementById('json-upload');\n * const weightsUpload = document.getElementById('weights-upload');\n *\n * const model = await tf.loadLayersModel(\n * tf.io.browserFiles([jsonUpload.files[0], weightsUpload.files[0]]));\n * ```\n *\n * Example 4. Load a model from an HTTP server.\n *\n * ```js\n * const model = await\n * tf.loadLayersModel('https://storage.googleapis.com/tfjs-models/tfjs/iris_v1/model.json');\n * model.summary();\n * ```\n *\n * @param pathOrIOHandler Can be either of the two formats\n * 1. A string path to the `ModelAndWeightsConfig` JSON describing\n * the model in the canonical TensorFlow.js format. This path will be\n * interpreted as a relative HTTP path, to which `fetch` will be used to\n * request the model topology and weight manifest JSON.\n * The content of the JSON file is assumed to be a JSON object with the\n * following fields and values:\n * - 'modelTopology': A JSON object that can be either of:\n * 1. a model architecture JSON consistent with the format of the return\n * value of `keras.Model.to_json()`\n * 2. a full model JSON in the format of `keras.models.save_model()`.\n * - 'weightsManifest': A TensorFlow.js weights manifest.\n * See the Python converter function `save_model()` for more details.\n * It is also assumed that model weights can be accessed from relative\n * paths described by the `paths` fields in weights manifest.\n * 2. An `tf.io.IOHandler` object that loads model artifacts with its `load`\n * method.\n * @param options Optional configuration arguments for the model loading,\n * including:\n * - `strict`: Require that the provided weights exactly match those required\n * by the layers. Default true. Passing false means that both extra\n * weights and missing weights will be silently ignored.\n * - `onProgress`: A progress callback of the form:\n * `(fraction: number) => void`. This callback can be used to monitor the\n * model-loading process.\n * @returns A `Promise` of `tf.LayersModel`, with the topology and weights\n * loaded.\n */\nexport async function loadLayersModelInternal(pathOrIOHandler, options) {\n if (options == null) {\n options = {};\n }\n if (typeof pathOrIOHandler === 'string') {\n const handlers = io.getLoadHandlers(pathOrIOHandler, options);\n if (handlers.length === 0) {\n // For backward compatibility: if no load handler can be found,\n // assume it is a relative http path.\n // TODO(cais): Reformat the args into a single `LoadOptions` once the core\n // is refactored.\n handlers.push(io.browserHTTPRequest(pathOrIOHandler, options));\n }\n else if (handlers.length > 1) {\n throw new ValueError(`Found more than one (${handlers.length}) load handlers for ` +\n `URL '${pathOrIOHandler}'`);\n }\n pathOrIOHandler = handlers[0];\n }\n return loadLayersModelFromIOHandler(pathOrIOHandler, undefined, options);\n}\n/**\n * Load a model and optionally its weights, using an IOHandler object.\n *\n * @param handler The instance of `IOHandler` to be used during the model\n * loading.\n * @param customObjects Any optional custom objects to be used during model\n * loading.\n * @param strict Whether the weight loading will be done in strict mode.\n * Default: `true`.\n */\nexport async function loadLayersModelFromIOHandler(handler, customObjects, options) {\n if (options == null) {\n options = {};\n }\n if (handler.load == null) {\n throw new ValueError('Cannot proceed with model loading because the IOHandler provided ' +\n 'does not have the `load` method implemented.');\n }\n const artifacts = await handler.load();\n let modelTopology = artifacts.modelTopology;\n if (modelTopology['model_config'] != null) {\n modelTopology = modelTopology['model_config'];\n }\n const strict = options.strict == null ? true : options.strict;\n // If weights are provided and the weight-loading mode is strict, use\n // fast weight initialization. This skips costly initializers such as\n // 'orthogonal' and saves unnecessary computation in cases where\n // the initialized weight values will immediately be overwritten by\n // loaded weight values.\n const fastWeightInit = artifacts.weightData != null && artifacts.weightSpecs != null && strict;\n const model = deserialize(convertPythonicToTs(modelTopology), customObjects, fastWeightInit);\n const trainingConfig = artifacts.trainingConfig;\n if (trainingConfig != null) {\n model.loadTrainingConfig(trainingConfig);\n }\n if (artifacts.userDefinedMetadata != null) {\n model.setUserDefinedMetadata(artifacts.userDefinedMetadata);\n }\n // If weightData is present, load the weights into the model.\n if (artifacts.weightData != null) {\n // Loading weights requires weightSpecs.\n if (artifacts.weightSpecs == null) {\n throw new ValueError('LayersModel artifacts contains weight data, but not weight specs. ' +\n 'Therefore loading of weights cannot proceed.');\n }\n const { modelWeights, optimizerWeights } = decodeModelAndOptimizerWeights(artifacts.weightData, artifacts.weightSpecs);\n model.loadWeights(modelWeights, strict);\n if (model.optimizer != null && optimizerWeights.length > 0) {\n await model.optimizer.setWeights(optimizerWeights);\n }\n // Dispose temporary weight values.\n dispose(modelWeights);\n dispose(optimizerWeights.map(w => w.tensor));\n }\n return model;\n}\nfunction decodeModelAndOptimizerWeights(buffer, specs) {\n const name2Tensor = io.decodeWeights(buffer, specs);\n const modelWeights = {};\n const optimizerWeights = [];\n specs.forEach(spec => {\n if (spec.group === 'optimizer') {\n optimizerWeights.push({ name: spec.name, tensor: name2Tensor[spec.name] });\n }\n else {\n modelWeights[spec.name] = name2Tensor[spec.name];\n }\n });\n return { modelWeights, optimizerWeights };\n}\n/**\n * A model with a stack of layers, feeding linearly from one to the next.\n *\n * `tf.sequential` is a factory function that creates an instance of\n * `tf.Sequential`.\n *\n * ```js\n * // Define a model for linear regression.\n * const model = tf.sequential();\n * model.add(tf.layers.dense({units: 1, inputShape: [1]}));\n *\n * // Prepare the model for training: Specify the loss and the optimizer.\n * model.compile({loss: 'meanSquaredError', optimizer: 'sgd'});\n *\n * // Generate some synthetic data for training.\n * const xs = tf.tensor2d([1, 2, 3, 4], [4, 1]);\n * const ys = tf.tensor2d([1, 3, 5, 7], [4, 1]);\n *\n * // Train the model using the data then do inference on a data point the\n * // model hasn't seen:\n * await model.fit(xs, ys);\n * model.predict(tf.tensor2d([5], [1, 1])).print();\n * ```\n *\n * @doc {heading: 'Models', subheading: 'Classes'}\n */\nexport class Sequential extends LayersModel {\n constructor(args) {\n super({ inputs: [], outputs: [] });\n args = args || {};\n this.trainable = true;\n this.built = false;\n // Set model name.\n this.name = (args.name != null) ? args.name : getUid('sequential_');\n // Add to the model any layers passed to the constructor.\n if (args.layers != null) {\n for (const layer of args.layers) {\n this.add(layer);\n }\n }\n }\n // Helper function to Sequential.add Throws if the new output shape will be\n // invalid.\n checkShape(layer) {\n const shape = layer.inboundNodes[0].outputTensors[0].shape;\n if (shape.some(x => x < 0)) {\n throw new ValueError('Negative dimension size caused by adding layer ' +\n `${layer.name} with input shape [` +\n `${layer.inboundNodes[0].inputTensors[0].shape}]`);\n }\n }\n /**\n * Adds a layer instance on top of the layer stack.\n *\n * ```js\n * const model = tf.sequential();\n * model.add(tf.layers.dense({units: 8, inputShape: [1]}));\n * model.add(tf.layers.dense({units: 4, activation: 'relu6'}));\n * model.add(tf.layers.dense({units: 1, activation: 'relu6'}));\n * // Note that the untrained model is random at this point.\n * model.predict(tf.randomNormal([10, 1])).print();\n * ```\n * @param layer Layer instance.\n *\n * @exception ValueError In case the `layer` argument does not know its\n * input shape.\n * @exception ValueError In case the `layer` argument has multiple output\n * tensors, or is already connected somewhere else (forbidden in\n * `Sequential` models).\n *\n * @doc {heading: 'Models', subheading: 'Classes'}\n */\n add(layer) {\n const isLayerModelInstance = layer instanceof Sequential || layer instanceof LayersModel;\n let modelLayer;\n if (isLayerModelInstance) {\n modelLayer = layer;\n if (modelLayer.outputs.length !== 1) {\n throw new ValueError('All layers in a Sequential model ' +\n 'should have a single output tensor. ' +\n 'For multi-output layers, ' +\n 'use the functional API.');\n }\n if (modelLayer.inputs.length !== 1) {\n throw new ValueError('All layers in a Sequential model ' +\n 'should have a single input tensor. ' +\n 'For multi-input layers, ' +\n 'use the functional API.');\n }\n }\n if (this.outputs.length === 0) {\n // first layer in model: check that it is an input layer\n if (layer.inboundNodes.length === 0) {\n // create an input layer\n if (layer.batchInputShape == null) {\n throw new ValueError('The first layer in a Sequential model must ' +\n 'get an `inputShape` or `batchInputShape` argument.');\n }\n // Instantiate the input layer.\n const x = Input({\n batchShape: layer.batchInputShape,\n dtype: layer.dtype,\n name: layer.name + '_input'\n });\n // This will build the current layer and create the node connecting\n // the current layer to the input layer we just created.\n layer.apply(x);\n }\n if (isLayerModelInstance) {\n this.outputs = modelLayer.outputs;\n this.inputs = modelLayer.inputs;\n }\n else {\n if (layer.inboundNodes.length !== 1) {\n throw new ValueError('A layer added to a Sequential model must not already be ' +\n `connected somewhere else. LayersModel received layer ${layer.name} ` +\n `which has ${layer.inboundNodes.length} pre-existing inbound ` +\n 'connections.');\n }\n if (layer.inboundNodes[0].outputTensors.length !== 1) {\n throw new ValueError('All layers in a Sequential model ' +\n 'should have a single output tensor. ' +\n 'For multi-output layers, ' +\n 'use the functional API.');\n }\n this.checkShape(layer);\n this.outputs = [layer.inboundNodes[0].outputTensors[0]];\n this.inputs = getSourceInputs(this.outputs[0]);\n }\n this.inboundNodes = [];\n // We create an input node, which we will keep updated\n // as we add more layers.\n // (This call has side effects.)\n // tslint:disable-next-line:no-unused-expression\n new Node({\n outboundLayer: this,\n inboundLayers: [],\n nodeIndices: [],\n tensorIndices: [],\n inputTensors: this.inputs,\n outputTensors: this.outputs,\n // no model-level masking for now\n inputMasks: generic_utils.pyListRepeat(null, this.inputs.length),\n outputMasks: [null],\n inputShapes: this.inputs.map(x => x.shape),\n outputShapes: this.outputs[0].shape\n });\n }\n else {\n const outputTensor = layer.apply(this.outputs[0]);\n if (Array.isArray(outputTensor)) {\n throw new TypeError('All layers in a Sequential model ' +\n 'should have a single output tensor. ' +\n 'For multi-output layers, ' +\n 'use the functional API.');\n }\n this.checkShape(layer);\n this.outputs = [outputTensor];\n // update self.inbound_nodes\n this.inboundNodes[0].outputTensors = this.outputs;\n this.inboundNodes[0].outputShapes = [this.outputs[0].shape];\n }\n this.layers.push(layer);\n this.built = false;\n }\n /**\n * Removes the last layer in the model.\n *\n * @exception TypeError if there are no layers in the model.\n */\n pop() {\n if (this.layers.length === 0) {\n throw new TypeError('There are no layers in the model.');\n }\n this.layers.pop();\n if (this.layers.length === 0) {\n this.outputs = [];\n this.inboundNodes = [];\n this.outboundNodes = [];\n }\n else {\n const lastLayerIndex = this.layers.length - 1;\n this.layers[lastLayerIndex].outboundNodes = [];\n this.outputs = [this.layers[lastLayerIndex].output];\n // update self.inbound_nodes\n this.inboundNodes[0].outputTensors = this.outputs;\n this.inboundNodes[0].outputShapes = [this.outputs[0].shape];\n }\n }\n call(inputs, kwargs) {\n if (this.model == null) {\n this.build();\n }\n return this.model.call(inputs, kwargs);\n }\n build(inputShape) {\n // Call `getExactlyOneShape` without using its return value,\n // to verify that exactly one input shape is provided.\n getExactlyOneShape(inputShape);\n if (this.inputs.length === 0 || this.outputs.length === 0) {\n throw new TypeError('Sequential model cannot be built: model is empty.' +\n ' Add some layers first.');\n }\n // actually create the model\n this.model = new LayersModel({\n inputs: this.inputs,\n outputs: this.outputs[0],\n name: this.name + '_model'\n });\n this.model.trainable = this.trainable;\n // mirror model attributes\n this.supportsMasking = this.model.supportsMasking;\n // TODO(michaelterry): Add caches\n this.inputLayers = this.model.inputLayers;\n this.inputLayersNodeIndices = this.model.inputLayersNodeIndices;\n this.inputLayersTensorIndices = this.model.inputLayersTensorIndices;\n this.outputLayers = this.model.outputLayers;\n this.outputLayersNodeIndices = this.model.outputLayersNodeIndices;\n this.outputLayersTensorIndices = this.model.outputLayersTensorIndices;\n this.nodesByDepth = this.model.nodesByDepth;\n this.containerNodes = this.model.containerNodes;\n this.outputNames = this.model.outputNames;\n this.inputNames = this.model.inputNames;\n // TODO(michaelterry): Add feedInputNames, feedInputs, if needed.\n // TODO(michaelterry): Add callbackModel if needed.\n this.built = true;\n }\n countParams() {\n if (!this.built) {\n this.build();\n }\n return super.countParams();\n }\n /**\n * Print a text summary of the Sequential model's layers.\n *\n * The summary includes\n * - Name and type of all layers that comprise the model.\n * - Output shape(s) of the layers\n * - Number of weight parameters of each layer\n * - The total number of trainable and non-trainable parameters of the\n * model.\n *\n * ```js\n * const model = tf.sequential();\n * model.add(\n * tf.layers.dense({units: 100, inputShape: [10], activation: 'relu'}));\n * model.add(tf.layers.dense({units: 1, activation: 'sigmoid'}));\n *\n * model.summary();\n * ```\n *\n * @param lineLength Custom line length, in number of characters.\n * @param positions Custom widths of each of the columns, as either\n * fractions of `lineLength` (e.g., `[0.5, 0.75, 1]`) or absolute number\n * of characters (e.g., `[30, 50, 65]`). Each number corresponds to\n * right-most (i.e., ending) position of a column.\n * @param printFn Custom print function. Can be used to replace the default\n * `console.log`. For example, you can use `x => {}` to mute the printed\n * messages in the console.\n *\n * @doc {heading: 'Models', subheading: 'Classes'}\n */\n summary(lineLength, positions, printFn = console.log) {\n if (!this.built) {\n this.build();\n }\n super.summary(lineLength, positions, printFn);\n }\n /**\n * Sets the weights of the model.\n *\n * @param weights Should be a list of Tensors with shapes and types matching\n * the output of `model.getWeights()`.\n */\n setWeights(weights) {\n if (this.model == null) {\n this.build();\n }\n this.model.setWeights(weights);\n }\n /**\n * Returns the loss value & metrics values for the model in test mode.\n *\n * Loss and metrics are specified during `compile()`, which needs to happen\n * before calls to `evaluate()`.\n *\n * Computation is done in batches.\n *\n * ```js\n * const model = tf.sequential({\n * layers: [tf.layers.dense({units: 1, inputShape: [10]})]\n * });\n * model.compile({optimizer: 'sgd', loss: 'meanSquaredError'});\n * const result = model.evaluate(tf.ones([8, 10]), tf.ones([8, 1]), {\n * batchSize: 4,\n * });\n * result.print();\n * ```\n *\n * @param x `tf.Tensor` of test data, or an `Array` of `tf.Tensor`s if the\n * model has multiple inputs.\n * @param y `tf.Tensor` of target data, or an `Array` of `tf.Tensor`s if the\n * model has multiple outputs.\n * @param args A `ModelEvaluateConfig`, containing optional fields.\n *\n * @return `Scalar` test loss (if the model has a single output and no\n * metrics) or `Array` of `Scalar`s (if the model has multiple outputs\n * and/or metrics). The attribute `model.metricsNames`\n * will give you the display labels for the scalar outputs.\n *\n * @doc {heading: 'Models', subheading: 'Classes'}\n */\n evaluate(x, y, args = {}) {\n if (!this.built) {\n throw new RuntimeError('The model needs to be compiled before being used.');\n }\n return this.model.evaluate(x, y, args);\n }\n // TODO(cais): Add code snippet below once real dataset objects are\n // available.\n /**\n * Evaluate model using a dataset object.\n *\n * Note: Unlike `evaluate()`, this method is asynchronous (`async`).\n *\n * @param dataset A dataset object. Its `iterator()` method is expected\n * to generate a dataset iterator object, the `next()` method of which\n * is expected to produce data batches for evaluation. The return value\n * of the `next()` call ought to contain a boolean `done` field and a\n * `value` field. The `value` field is expected to be an array of two\n * `tf.Tensor`s or an array of two nested `tf.Tensor` structures. The former\n * case is for models with exactly one input and one output (e.g.\n * a sequential model). The latter case is for models with multiple\n * inputs and/or multiple outputs. Of the two items in the array, the\n * first is the input feature(s) and the second is the output target(s).\n * @param args A configuration object for the dataset-based evaluation.\n * @returns Loss and metric values as an Array of `Scalar` objects.\n *\n * @doc {heading: 'Models', subheading: 'Classes'}\n */\n async evaluateDataset(dataset, args) {\n if (!this.built) {\n throw new RuntimeError('The model needs to be compiled before being used.');\n }\n return this.model.evaluateDataset(dataset, args);\n }\n /**\n * Generates output predictions for the input samples.\n *\n * Computation is done in batches.\n *\n * Note: the \"step\" mode of predict() is currently not supported.\n * This is because the TensorFlow.js core backend is imperative only.\n *\n * ```js\n * const model = tf.sequential({\n * layers: [tf.layers.dense({units: 1, inputShape: [10]})]\n * });\n * model.predict(tf.ones([2, 10])).print();\n * ```\n *\n * @param x The input data, as a Tensor, or an `Array` of `tf.Tensor`s if\n * the model has multiple inputs.\n * @param conifg A `ModelPredictConfig` object containing optional fields.\n *\n * @return `tf.Tensor`(s) of predictions.\n *\n * @exception ValueError In case of mismatch between the provided input data\n * and the model's expectations, or in case a stateful model receives a\n * number of samples that is not a multiple of the batch size.\n *\n * @doc {heading: 'Models', subheading: 'Classes'}\n */\n predict(x, args = {}) {\n if (this.model == null) {\n this.build();\n }\n return this.model.predict(x, args);\n }\n /**\n * Returns predictions for a single batch of samples.\n *\n * @param x: Input samples, as a Tensor, or list of Tensors (if the model\n * has multiple inputs).\n * @return Tensor(s) of predictions\n */\n predictOnBatch(x) {\n if (this.model == null) {\n this.build();\n }\n return this.model.predictOnBatch(x);\n }\n /**\n * See `LayersModel.compile`.\n *\n * @param args\n */\n compile(args) {\n this.build();\n this.model.compile(args);\n this.optimizer_ = this.model.optimizer;\n // tslint:disable-next-line:no-any\n this.isOptimizerOwned = this.model.isOptimizerOwned;\n this.loss = this.model.loss;\n this.metrics = this.model.metrics;\n // TODO(cais): Add this.lossWeights, this.sampleWeightMode,\n // this.weightedMetrics, this.targets.\n this.metricsTensors = this.model.metricsTensors;\n this.metricsNames = this.model.metricsNames;\n // TODO(cais): Add sampleWeights.\n }\n get optimizer() {\n return this.model == null ? undefined : this.model.optimizer;\n }\n set optimizer(optimizer) {\n this.model.optimizer = optimizer;\n }\n /**\n * Trains the model for a fixed number of epochs (iterations on a dataset).\n *\n * ```js\n * const model = tf.sequential({\n * layers: [tf.layers.dense({units: 1, inputShape: [10]})]\n * });\n * model.compile({optimizer: 'sgd', loss: 'meanSquaredError'});\n * const history = await model.fit(tf.ones([8, 10]), tf.ones([8, 1]), {\n * batchSize: 4,\n * epochs: 3\n * });\n * console.log(history.history.loss[0]);\n * ```\n *\n * @param x `tf.Tensor` of training data, or an array of `tf.Tensor`s if the\n * model has multiple inputs. If all inputs in the model are named, you can\n * also pass a dictionary mapping input names to `tf.Tensor`s.\n * @param y `tf.Tensor` of target (label) data, or an array of `tf.Tensor`s if\n * the model has multiple outputs. If all outputs in the model are named, you\n * can also pass a dictionary mapping output names to `tf.Tensor`s.\n * @param args A `ModelFitConfig`, containing optional fields.\n *\n * @return A `History` instance. Its `history` attribute contains all\n * information collected during training.\n *\n * @exception ValueError In case of mismatch between the provided input data\n * and what the model expects.\n *\n * @doc {heading: 'Models', subheading: 'Classes'}\n */\n async fit(x, y, args = {}) {\n if (!this.built) {\n throw new RuntimeError('The model needs to be compiled before ' +\n 'being used.');\n }\n return this.model.fit(x, y, args);\n }\n /**\n * Trains the model using a dataset object.\n *\n * ```js\n * const xArray = [\n * [1, 1, 1, 1, 1, 1, 1, 1, 1],\n * [1, 1, 1, 1, 1, 1, 1, 1, 1],\n * [1, 1, 1, 1, 1, 1, 1, 1, 1],\n * [1, 1, 1, 1, 1, 1, 1, 1, 1],\n * ];\n * const yArray = [1, 1, 1, 1];\n * // Create a dataset from the JavaScript array.\n * const xDataset = tf.data.array(xArray);\n * const yDataset = tf.data.array(yArray);\n * // Zip combines the `x` and `y` Datasets into a single Dataset, the\n * // iterator of which will return an object containing of two tensors,\n * // corresponding to `x` and `y`. The call to `batch(4)` will bundle\n * // four such samples into a single object, with the same keys now pointing\n * // to tensors that hold 4 examples, organized along the batch dimension.\n * // The call to `shuffle(4)` causes each iteration through the dataset to\n * // happen in a different order. The size of the shuffle window is 4.\n * const xyDataset = tf.data.zip({xs: xDataset, ys: yDataset})\n * .batch(4)\n * .shuffle(4);\n * const model = tf.sequential({\n * layers: [tf.layers.dense({units: 1, inputShape: [9]})]\n * });\n * model.compile({optimizer: 'sgd', loss: 'meanSquaredError'});\n * const history = await model.fitDataset(xyDataset, {\n * epochs: 4,\n * callbacks: {onEpochEnd: (epoch, logs) => console.log(logs.loss)}\n * });\n * ```\n *\n * @param dataset A dataset object. Its `iterator()` method is expected to\n * generate a dataset iterator object, the `next()` method of which is\n * expected to produce data batches for evaluation. The return value of the\n * `next()` call ought to contain a boolean `done` field and a `value`\n * field.\n *\n * The `value` field is expected to be an object of with fields\n * `xs` and `ys`, which point to the feature tensor and the target tensor,\n * respectively. This case is for models with exactly one input and one\n * output (e.g. a sequential model). For example:\n * ```js\n * {value: {xs: xsTensor, ys: ysTensor}, done: false}\n * ```\n *\n * If the model has multiple inputs, the `xs` field of `value` should\n * be an object mapping input names to their respective feature tensors.\n * For example:\n * ```js\n * {\n * value: {\n * xs: {\n * input_1: xsTensor1,\n * input_2: xsTensor2\n * },\n * ys: ysTensor\n * },\n * done: false\n * }\n * ```\n * If the model has multiple outputs, the `ys` field of `value` should\n * be an object mapping output names to their respective target tensors.\n * For example:\n * ```js\n * {\n * value: {\n * xs: xsTensor,\n * ys: {\n * output_1: ysTensor1,\n * output_2: ysTensor2\n * },\n * },\n * done: false\n * }\n * ```\n * @param args A `ModelFitDatasetArgs`, containing optional fields.\n *\n * @return A `History` instance. Its `history` attribute contains all\n * information collected during training.\n *\n * @doc {heading: 'Models', subheading: 'Classes', ignoreCI: true}\n */\n async fitDataset(dataset, args) {\n if (!this.built) {\n throw new RuntimeError('The model needs to be compiled before ' +\n 'being used.');\n }\n return this.model.fitDataset(dataset, args);\n }\n /**\n * Runs a single gradient update on a single batch of data.\n *\n * This method differs from `fit()` and `fitDataset()` in the following\n * regards:\n * - It operates on exactly one batch of data.\n * - It returns only the loss and metric values, instead of\n * returning the batch-by-batch loss and metric values.\n * - It doesn't support fine-grained options such as verbosity and\n * callbacks.\n *\n * @param x Input data. It could be one of the following:\n * - A `tf.Tensor`, or an Array of `tf.Tensor`s (in case the model has\n * multiple inputs).\n * - An Object mapping input names to corresponding `tf.Tensor` (if the\n * model has named inputs).\n * @param y Target data. It could be either a `tf.Tensor` or multiple\n * `tf.Tensor`s. It should be consistent with `x`.\n * @returns Training loss or losses (in case the model has\n * multiple outputs), along with metrics (if any), as numbers.\n *\n * @doc {heading: 'Models', subheading: 'Classes'}\n */\n async trainOnBatch(x, y) {\n return this.model.trainOnBatch(x, y);\n }\n /* See parent class for JsDoc */\n /** @nocollapse */\n static fromConfig(cls, config, customObjects = {}, fastWeightInit = false) {\n let configArray;\n let extraModelConfig = {};\n if (config instanceof Array) {\n if (!(config[0].className != null) ||\n config[0]['className'] === 'Merge') {\n throw new ValueError('Legacy serialization format not supported yet.');\n }\n configArray = config;\n }\n else {\n util.assert(config['layers'] != null, () => `When the config data for a Sequential model is not an Array, ` +\n `it must be an Object that contains the 'layers' field.`);\n configArray = config['layers'];\n delete config['layers'];\n extraModelConfig = config;\n }\n const model = new cls(extraModelConfig);\n if (!(model instanceof Sequential)) {\n throw new NotImplementedError(`Sequential.fromConfig called on non-Sequential input: ${model}`);\n }\n for (const conf of configArray) {\n const customObjects = undefined;\n const layer = deserialize(conf, customObjects, fastWeightInit);\n if (fastWeightInit) {\n layer.setFastWeightInitDuringBuild(true);\n }\n model.add(layer);\n }\n return model;\n }\n /**\n * Setter used for force stopping of LayersModel.fit() (i.e., training).\n *\n * Example:\n *\n * ```js\n * const model = tf.sequential();\n * model.add(tf.layers.dense({units: 1, inputShape: [10]}));\n * model.compile({loss: 'meanSquaredError', optimizer: 'sgd'});\n * const xs = tf.ones([8, 10]);\n * const ys = tf.zeros([8, 1]);\n *\n * const history = await model.fit(xs, ys, {\n * epochs: 10,\n * callbacks: {\n * onEpochEnd: async (epoch, logs) => {\n * if (epoch === 2) {\n * model.stopTraining = true;\n * }\n * }\n * }\n * });\n *\n * // There should be only 3 values in the loss array, instead of 10 values,\n * // due to the stopping after 3 epochs.\n * console.log(history.history.loss);\n * ```\n */\n set stopTraining(stop) {\n // TODO(cais): When refactoring to remove the composition pattern happens,\n // remove this method overriding.\n if (this.model == null) {\n throw new ValueError('Cannot set the stopTraining property of a sequential model before ' +\n 'it is compiled.');\n }\n this.model.stopTraining = stop;\n }\n get stopTraining() {\n if (this.model == null) {\n throw new ValueError('Cannot get the stopTraining property of a sequential model before ' +\n 'it is compiled.');\n }\n return this.model.stopTraining;\n }\n // TODO(cais): Override get trainableWeights() here\n // tslint:disable-next-line:no-any\n getConfig() {\n // NOTE(cais): We override the return type of getConfig() to `any` here,\n // because the `Sequential` class is a special case among `Container`\n // subtypes in that its getConfig() method returns an Array (not a\n // dict).\n const layers = [];\n for (const layer of this.layers) {\n const dict = {};\n dict['className'] = layer.getClassName();\n dict['config'] = layer.getConfig();\n layers.push(dict);\n }\n return { name: this.name, layers };\n }\n}\n/** @nocollapse */\nSequential.className = 'Sequential';\nserialization.registerClass(Sequential);\n//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibW9kZWxzLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vdGZqcy1sYXllcnMvc3JjL21vZGVscy50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQTs7Ozs7Ozs7R0FRRztBQUVILHFDQUFxQztBQUVyQyxPQUFPLEVBQUMsT0FBTyxFQUFFLEVBQUUsRUFBcUMsYUFBYSxFQUFVLElBQUksRUFBQyxNQUFNLHVCQUF1QixDQUFDO0FBRWxILE9BQU8sRUFBQyxNQUFNLEVBQUMsTUFBTSxpQkFBaUIsQ0FBQztBQUd2QyxPQUFPLEVBQUMsS0FBSyxFQUFDLE1BQU0sc0JBQXNCLENBQUM7QUFDM0MsT0FBTyxFQUFDLGVBQWUsRUFBUyxJQUFJLEVBQWlCLE1BQU0sbUJBQW1CLENBQUM7QUFDL0UsT0FBTyxFQUFDLFdBQVcsRUFBc0MsTUFBTSxtQkFBbUIsQ0FBQztBQUduRixPQUFPLEVBQUMsbUJBQW1CLEVBQUUsWUFBWSxFQUFFLFVBQVUsRUFBQyxNQUFNLFVBQVUsQ0FBQztBQUl2RSxPQUFPLEVBQUMsV0FBVyxFQUFDLE1BQU0sd0JBQXdCLENBQUM7QUFFbkQsT0FBTyxLQUFLLGFBQWEsTUFBTSx1QkFBdUIsQ0FBQztBQUN2RCxPQUFPLEVBQUMsbUJBQW1CLEVBQUMsTUFBTSw2QkFBNkIsQ0FBQztBQUNoRSxPQUFPLEVBQUMsa0JBQWtCLEVBQUMsTUFBTSxxQkFBcUIsQ0FBQztBQUV2RDs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7OztHQTRCRztBQUNILE1BQU0sQ0FBQyxLQUFLLFVBQVUsYUFBYSxDQUMvQixxQkFBdUQsRUFDdkQsYUFBd0M7SUFDMUMsSUFBSSxDQUFDLENBQUMsZUFBZSxJQUFJLHFCQUFxQixDQUFDLEVBQUU7UUFDL0MscUJBQXFCLEdBQUcsRUFBQyxhQUFhLEVBQUUscUJBQXFCLEVBQUMsQ0FBQztLQUNoRTtJQUNELHFCQUFxQixHQUFHLHFCQUE4QyxDQUFDO0lBRXZFLElBQUksYUFBYSxHQUFHLHFCQUFx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QUM7U0FDbkI7UUFDRCxPQUFPLEVBQUMsSUFBSSxFQUFFLElBQUksQ0FBQyxJQUFJLEVBQUUsTUFBTSxFQUFDLENBQUM7SUFDbkMsQ0FBQzs7QUF6c0JELGtCQUFrQjtBQUNYLG9CQUFTLEdBQUcsWUFBWSxDQUFDO0FBMHNCbEMsYUFBYSxDQUFDLGFBQWEsQ0FBQyxVQUFVLENBQUMsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbIi8qKlxuICogQGxpY2Vuc2VcbiAqIENvcHlyaWdodCAyMDE4IEdvb2dsZSBMTENcbiAqXG4gKiBVc2Ugb2YgdGhpcyBzb3VyY2UgY29kZSBpcyBnb3Zlcm5lZCBieSBhbiBNSVQtc3R5bGVcbiAqIGxpY2Vuc2UgdGhhdCBjYW4gYmUgZm91bmQgaW4gdGhlIExJQ0VOU0UgZmlsZSBvciBhdFxuICogaHR0cHM6Ly9vcGVuc291cmNlLm9yZy9saWNlbnNlcy9NSVQuXG4gKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuICovXG5cbi8qIE9yaWdpbmFsIHNvdXJjZSBrZXJhcy9tb2RlbHMucHkgKi9cblxuaW1wb3J0IHtkaXNwb3NlLCBpbywgTmFtZWRUZW5zb3JNYXAsIE9wdGltaXplciwgU2NhbGFyLCBzZXJpYWxpemF0aW9uLCBUZW5zb3IsIHV0aWx9IGZyb20gJ0B0ZW5zb3JmbG93L3RmanMtY29yZSc7XG5cbmltcG9ydCB7Z2V0VWlkfSBmcm9tICcuL2JhY2tlbmQvc3RhdGUnO1xuaW1wb3J0IHtIaXN0b3J5fSBmcm9tICcuL2Jhc2VfY2FsbGJhY2tzJztcbmltcG9ydCB7RGF0YXNldH0gZnJvbSAnLi9lbmdpbmUvZGF0YXNldF9zdHViJztcbmltcG9ydCB7SW5wdXR9IGZyb20gJy4vZW5naW5lL2lucHV0X2xheWVyJztcbmltcG9ydCB7Z2V0U291cmNlSW5wdXRzLCBMYXllciwgTm9kZSwgU3ltYm9saWNUZW5zb3J9IGZyb20gJy4vZW5naW5lL3RvcG9sb2d5JztcbmltcG9ydCB7TGF5ZXJzTW9kZWwsIE1vZGVsQ29tcGlsZUFyZ3MsIE1vZGVsRXZhbHVhdGVBcmdzfSBmcm9tICcuL2VuZ2luZS90cmFpbmluZyc7XG5pbXBvcnQge01vZGVsRXZhbHVhdGVEYXRhc2V0QXJncywgTW9kZWxGaXREYXRhc2V0QXJnc30gZnJvbSAnLi9lbmdpbmUvdHJhaW5pbmdfZGF0YXNldCc7XG5pbXBvcnQge01vZGVsRml0QXJnc30gZnJvbSAnLi9lbmdpbmUvdHJhaW5pbmdfdGVuc29ycyc7XG5pbXBvcnQge05vdEltcGxlbWVudGVkRXJyb3IsIFJ1bnRpbWVFcnJvciwgVmFsdWVFcnJvcn0gZnJvbSAnLi9lcnJvcnMnO1xuaW1wb3J0IHtTaGFwZX0gZnJvbSAnLi9rZXJhc19mb3JtYXQvY29tbW9uJztcbmltcG9ydCB7VHJhaW5pbmdDb25maWd9IGZyb20gJy4va2VyYXNfZm9ybWF0L3RyYWluaW5nX2NvbmZpZyc7XG5pbXBvcnQge1B5SnNvbkRpY3R9IGZyb20gJy4va2VyYXNfZm9ybWF0L3R5cGVzJztcbmltcG9ydCB7ZGVzZXJpYWxpemV9IGZyb20gJy4vbGF5ZXJzL3NlcmlhbGl6YXRpb24nO1xuaW1wb3J0IHtLd2FyZ3MsIE5hbWVkVGVuc29yfSBmcm9tICcuL3R5cGVzJztcbmltcG9ydCAqIGFzIGdlbmVyaWNfdXRpbHMgZnJvbSAnLi91dGlscy9nZW5lcmljX3V0aWxzJztcbmltcG9ydCB7Y29udmVydFB5dGhvbmljVG9Uc30gZnJvbSAnLi91dGlscy9zZXJpYWxpemF0aW9uX3V0aWxzJztcbmltcG9ydCB7Z2V0RXhhY3RseU9uZVNoYXBlfSBmcm9tICcuL3V0aWxzL3R5cGVzX3V0aWxzJztcblxuLyoqXG4gKiBQYXJzZXMgYSBKU09OIG1vZGVsIGNvbmZpZ3VyYXRpb24gZmlsZSBhbmQgcmV0dXJucyBhIG1vZGVsIGluc3RhbmNlLlxuICpcbiAqIGBgYGpzXG4gKiAvLyBUaGlzIGV4YW1wbGUgc2hvd3MgaG93IHRvIHNlcmlhbGl6ZSBhIG1vZGVsIHVzaW5nIGB0b0pTT04oKWAgYW5kXG4gKiAvLyBkZXNlcmlhbGl6ZSBpdCBhcyBhbm90aGVyIG1vZGVsIHVzaW5nIGB0Zi5tb2RlbHMubW9kZWxGcm9tSlNPTigpYC5cbiAqIC8vIE5vdGU6IHRoaXMgZXhhbXBsZSBzZXJpYWxpemVzIGFuZCBkZXNlcmlhbGl6ZXMgb25seSB0aGUgdG9wb2xvZ3lcbiAqIC8vIG9mIHRoZSBtb2RlbDsgdGhlIHdlaWdodHMgb2YgdGhlIGxvYWRlZCBtb2RlbCB3aWxsIGJlIGRpZmZlcmVudFxuICogLy8gZnJvbSB0aG9zZSBvZiB0aGUgdGhlIG9yaWdpbmFsIG1vZGVsLCBkdWUgdG8gcmFuZG9tIHdlaWdodFxuICogLy8gaW5pdGlhbGl6YXRpb24uXG4gKiAvLyBUbyBsb2FkIHRoZSB0b3BvbG9neSBhbmQgd2VpZ2h0cyBvZiBhIG1vZGVsLCB1c2UgYHRmLmxvYWRMYXllcnNNb2RlbCgpYC5cbiAqIGNvbnN0IG1vZGVsMSA9IHRmLnNlcXVlbnRpYWwoKTtcbiAqIG1vZGVsMS5hZGQodGYubGF5ZXJzLnJlcGVhdFZlY3Rvcih7aW5wdXRTaGFwZTogWzJdLCBuOiA0fSkpO1xuICogLy8gU2VyaWFsaXplIGBtb2RlbDFgIGFzIGEgSlNPTiBvYmplY3QuXG4gKiBjb25zdCBtb2RlbDFKU09OID0gbW9kZWwxLnRvSlNPTihudWxsLCBmYWxzZSk7XG4gKiBtb2RlbDEuc3VtbWFyeSgpO1xuICpcbiAqIGNvbnN0IG1vZGVsMiA9IGF3YWl0IHRmLm1vZGVscy5tb2RlbEZyb21KU09OKG1vZGVsMUpTT04pO1xuICogbW9kZWwyLnN1bW1hcnkoKTtcbiAqIGBgYFxuICpcbiAqICBAcGFyYW0gbW9kZWxBbmRXZWlnaHRzQ29uZmlnIEpTT04gb2JqZWN0IG9yIHN0cmluZyBlbmNvZGluZyBhIG1vZGVsIGFuZFxuICogICAgICAgd2VpZ2h0cyBjb25maWd1cmF0aW9uLiBJdCBjYW4gYWxzbyBiZSBvbmx5IHRoZSB0b3BvbG9neSBKU09OIG9mIHRoZVxuICogICAgICAgbW9kZWwsIGluIHdoaWNoIGNhc2UgdGhlIHdlaWdodHMgd2lsbCBub3QgYmUgbG9hZGVkLlxuICogIEBwYXJhbSBjdXN0b21fb2JqZWN0cyBPcHRpb25hbCBkaWN0aW9uYXJ5IG1hcHBpbmcgbmFtZXNcbiAqICAgICAgIChzdHJpbmdzKSB0byBjdXN0b20gY2xhc3NlcyBvciBmdW5jdGlvbnMgdG8gYmVcbiAqICAgICAgIGNvbnNpZGVyZWQgZHVyaW5nIGRlc2VyaWFsaXphdGlvbi5cbiAqIEByZXR1cm5zIEEgVGVuc29yRmxvdy5qcyBMYXllcnMgYHRmLkxheWVyc01vZGVsYCBpbnN0YW5jZSAodW5jb21waWxlZCkuXG4gKi9cbmV4cG9ydCBhc3luYyBmdW5jdGlvbiBtb2RlbEZyb21KU09OKFxuICAgIG1vZGVsQW5kV2VpZ2h0c0NvbmZpZzogTW9kZWxBbmRXZWlnaHRzQ29uZmlnfFB5SnNvbkRpY3QsXG4gICAgY3VzdG9tT2JqZWN0cz86IHNlcmlhbGl6YXRpb24uQ29uZmlnRGljdCk6IFByb21pc2U8TGF5ZXJzTW9kZWw+IHtcbiAgaWYgKCEoJ21vZGVsVG9wb2xvZ3knIGluIG1vZGVsQW5kV2VpZ2h0c0NvbmZpZykpIHtcbiAgICBtb2RlbEFuZFdlaWdodHNDb25maWcgPSB7bW9kZWxUb3BvbG9neTogbW9kZWxBbmRXZWlnaHRzQ29uZmlnfTtcbiAgfVxuICBtb2RlbEFuZFdlaWdodHNDb25maWcgPSBtb2RlbEFuZFdlaWdodHNDb25maWcgYXMgTW9kZWxBbmRXZWlnaHRzQ29uZmlnO1xuXG4gIGxldCBtb2RlbFRvcG9sb2d5ID0gbW9kZWxBbmRXZWlnaHRzQ29uZmlnLm1vZGVsVG9wb2xvZ3k7XG4gIGlmIChtb2RlbFRvcG9sb2d5Wydtb2RlbF9jb25maWcnXSAhPSBudWxsKSB7XG4gICAgLy8gSWYgdGhlIG1vZGVsLXRvcG9sb2d5IEpTT04gY29udGFpbnMgYSAnbW9kZWxfY29uZmlnJyBmaWVsZCwgdGhlbiBpdCBpc1xuICAgIC8vIGEgZnVsbCBtb2RlbCBKU09OIChlLmcuLCBmcm9tIGBrZXJhcy5Nb2RlbC5zYXZlKClgKSwgd2hpY2ggY29udGFpbnNcbiAgICAvLyBub3Qgb25seSB0aGUgbW9kZWwncyBhcmNoaXRlY3R1cmUgaW4gaXRzICdtb2RlbF9jb25maWcnIGZpZWxkLCBidXRcbiAgICAvLyBhZGRpdGlvbmFsIGluZm9ybWF0aW9uIHN1Y2ggYXMgdGhlIG1vZGVsJ3Mgb3B0aW1pemVyLiBXZSB1c2Ugb25seSB0aGVcbiAgICAvLyAnbW9kZWxfY29uZmlnJyBmaWVsZCBjdXJyZW50bHkuXG4gICAgbW9kZWxUb3BvbG9neSA9IG1vZGVsVG9wb2xvZ3lbJ21vZGVsX2NvbmZpZyddIGFzIFB5SnNvbkRpY3Q7XG4gIH1cbiAgY29uc3QgdHNDb25maWcgPVxuICAgICAgY29udmVydFB5dGhvbmljVG9Ucyhtb2RlbFRvcG9sb2d5KSBhcyBzZXJpYWxpemF0aW9uLkNvbmZpZ0RpY3Q7XG4gIGNvbnN0IG1vZGVsID0gZGVzZXJpYWxpemUodHNDb25maWcsIGN1c3RvbU9iamVjdHMpIGFzIExheWVyc01vZGVsO1xuXG4gIGlmIChtb2RlbEFuZFdlaWdodHNDb25maWcud2VpZ2h0c01hbmlmZXN0ICE9IG51bGwpIHtcbiAgICAvLyBMb2FkIHRoZSB3ZWlnaHQgdmFsdWVzIGtleWVkIGJ5IHRoZSBvcmlnaW5hbCB0ZW5zb3IgbmFtZXMgaW4gdGhlIG1vZGVsXG4gICAgLy8gZmlsZSB0aGF0IHdhcyBsb2FkZWQuICBUaGVzZSBzaG91bGQgbWF0Y2ggdGhlIGtleXMgb2YgdGhlIHdlaWdodFxuICAgIC8vIG1hbmlmZXN0LlxuICAgIGNvbnN0IHdlaWdodFZhbHVlcyA9IGF3YWl0IGlvLmxvYWRXZWlnaHRzKFxuICAgICAgICBtb2RlbEFuZFdlaWdodHNDb25maWcud2VpZ2h0c01hbmlmZXN0LCBtb2RlbEFuZFdlaWdodHNDb25maWcucGF0aFByZWZpeCxcbiAgICAgICAgbW9kZWwud2VpZ2h0cy5tYXAod2VpZ2h0ID0+IHdlaWdodC5vcmlnaW5hbE5hbWUpKTtcblxuICAgIC8vIE1hcCB0aGUgd2VpZ2h0cyB0byB0aGUgdW5pcXVlIHRlbnNvciBuYW1lcyBnZW5lcmF0ZWQgZHVyaW5nIG1vZGVsIGxvYWRpbmdcbiAgICBjb25zdCB1bmlxdWVXZWlnaHRWYWx1ZXM6IE5hbWVkVGVuc29yTWFwID0ge307XG4gICAgZm9yIChjb25zdCB3ZWlnaHQgb2YgbW9kZWwud2VpZ2h0cykge1xuICAgICAgdW5pcXVlV2VpZ2h0VmFsdWVzW3dlaWdodC5vcmlnaW5hbE5hbWVdID1cbiAgICAgICAgICB3ZWlnaHRWYWx1ZXNbd2VpZ2h0Lm9yaWdpbmFsTmFtZV07XG4gICAgfVxuXG4gICAgbW9kZWwubG9hZFdlaWdodHModW5pcXVlV2VpZ2h0VmFsdWVzKTtcbiAgICAvLyBEaXNwb3NlIHRlbXBvcmFyeSB3ZWlnaHQgdmFsdWVzLlxuICAgIGRpc3Bvc2Uod2VpZ2h0VmFsdWVzKTtcbiAgfVxuICByZXR1cm4gbW9kZWw7XG59XG5cbi8qKlxuICogT3B0aW9ucyBmb3IgbG9hZGluZyBhIHNhdmVkIG1vZGUgaW4gVGVuc29yRmxvdy5qcyBmb3JtYXQuXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgTW9kZWxBbmRXZWlnaHRzQ29uZmlnIHtcbiAgLyoqXG4gICAqIEEgSlNPTiBvYmplY3Qgb3IgSlNPTiBzdHJpbmcgY29udGFpbmluZyB0aGUgbW9kZWwgY29uZmlnLlxuICAgKlxuICAgKiBUaGlzIGNhbiBiZSBlaXRoZXIgb2YgdGhlIGZvbGxvd2luZyB0d28gZm9ybWF0czpcbiAgICogICAtIEEgbW9kZWwgYXJjaGllY3R1cmUtb25seSBjb25maWcsICBpLmUuLCBhIGZvcm1hdCBjb25zaXN0ZW50IHdpdGggdGhlXG4gICAqICAgICByZXR1cm4gdmFsdWUgb2Zga2VyYXMuTW9kZWwudG9fanNvbigpYC5cbiAgICogICAtIEEgZnVsbCBtb2RlbCBjb25maWcsIGNvbnRhaW5pbmcgbm90IG9ubHkgbW9kZWwgYXJjaGl0ZWN0dXJlLCBidXQgYWxzb1xuICAgKiAgICAgdHJhaW5pbmcgb3B0aW9ucyBhbmQgc3RhdGUsIGkuZS4sIGEgZm9ybWF0IGNvbnNpc3RlbnQgd2l0aCB0aGUgcmV0dXJuXG4gICAqICAgICB2YWx1ZSBvZiBga2VyYXMubW9kZWxzLnNhdmVfbW9kZWwoKWAuXG4gICAqL1xuICBtb2RlbFRvcG9sb2d5OiBQeUpzb25EaWN0O1xuXG4gIC8qKlxuICAgKiBBIHdlaWdodHMgbWFuaWZlc3QgaW4gVGVuc29yRmxvdy5qcyBmb3JtYXQuXG4gICAqL1xuICB3ZWlnaHRzTWFuaWZlc3Q/OiBpby5XZWlnaHRzTWFuaWZlc3RDb25maWc7XG5cbiAgLyoqXG4gICAqIFBhdGggdG8gcHJlcGVuZCB0byB0aGUgcGF0aHMgaW4gYHdlaWdodE1hbmlmZXN0YCBiZWZvcmUgZmV0Y2hpbmcuXG4gICAqXG4gICAqIFRoZSBwYXRoIG1heSBvcHRpb25hbGx5IGVuZCBpbiBhIHNsYXNoICgnLycpLlxuICAgKi9cbiAgcGF0aFByZWZpeD86IHN0cmluZztcbn1cblxuLy8gVE9ETyhuaWVsc2VuZSk6IFJlbW92ZSBhZnRlcjogaHR0cHM6Ly9naXRodWIuY29tL3RlbnNvcmZsb3cvdGZqcy9pc3N1ZXMvNDAwXG5leHBvcnQgaW50ZXJmYWNlIE1vZGVsUHJlZGljdEFyZ3Mge1xuICAvKipcbiAgICogT3B0aW9uYWwuIEJhdGNoIHNpemUgKEludGVnZXIpLiBJZiB1bnNwZWNpZmllZCwgaXQgd2lsbCBkZWZhdWx0IHRvIDMyLlxuICAgKi9cbiAgYmF0Y2hTaXplPzogbnVtYmVyO1xuXG4gIC8qKlxuICAgKiBPcHRpb25hbC4gVmVyYm9zaXR5IG1vZGUuIERlZmF1bHRzIHRvIGZhbHNlLlxuICAgKi9cbiAgdmVyYm9zZT86IGJvb2xlYW47XG59XG5cbi8qKlxuICogTG9hZCBhIG1vZGVsLCBpbmNsdWRpbmcgaXRzIHRvcG9sb2d5IGFuZCBvcHRpb25hbGx5IHdlaWdodHMuICBTZWUgdGhlXG4gKiBUdXRvcmlhbCBuYW1lZCBcIkhvdyB0byBpbXBvcnQgYSBLZXJhcyBNb2RlbFwiIGZvciB1c2FnZSBleGFtcGxlcy5cbiAqXG4gKiBFeGFtcGxlIDE6IFNhdmUgYG1vZGVsYCdzIHRvcG9sb2d5IGFuZCB3ZWlnaHRzIHRvIGJyb3dzZXIgW2xvY2FsXG4gKiBzdG9yYWdlXShodHRwczovL2RldmVsb3Blci5tb3ppbGxhLm9yZy9lbi1VUy9kb2NzL1dlYi9BUEkvV2luZG93L2xvY2FsU3RvcmFnZSk7XG4gKiB0aGVuIGxvYWQgaXQgYmFjay5cbiAqXG4gKiBgYGBqc1xuICogY29uc3QgbW9kZWwgPSB0Zi5zZXF1ZW50aWFsKFxuICogICAgIHtsYXllcnM6IFt0Zi5sYXllcnMuZGVuc2Uoe3VuaXRzOiAxLCBpbnB1dFNoYXBlOiBbM119KV19KTtcbiAqIGNvbnNvbGUubG9nKCdQcmVkaWN0aW9uIGZyb20gb3JpZ2luYWwgbW9kZWw6Jyk7XG4gKiBtb2RlbC5wcmVkaWN0KHRmLm9uZXMoWzEsIDNdKSkucHJpbnQoKTtcbiAqXG4gKiBjb25zdCBzYXZlUmVzdWx0cyA9IGF3YWl0IG1vZGVsLnNhdmUoJ2xvY2Fsc3RvcmFnZTovL215LW1vZGVsLTEnKTtcbiAqXG4gKiBjb25zdCBsb2FkZWRNb2RlbCA9IGF3YWl0IHRmLmxvYWRMYXllcnNNb2RlbCgnbG9jYWxzdG9yYWdlOi8vbXktbW9kZWwtMScpO1xuICogY29uc29sZS5sb2coJ1ByZWRpY3Rpb24gZnJvbSBsb2FkZWQgbW9kZWw6Jyk7XG4gKiBsb2FkZWRNb2RlbC5wcmVkaWN0KHRmLm9uZXMoWzEsIDNdKSkucHJpbnQoKTtcbiAqIGBgYFxuICpcbiAqIEV4YW1wbGUgMi4gU2F2aW5nIGBtb2RlbGAncyB0b3BvbG9neSBhbmQgd2VpZ2h0cyB0byBicm93c2VyXG4gKiBbSW5kZXhlZERCXShodHRwczovL2RldmVsb3Blci5tb3ppbGxhLm9yZy9lbi1VUy9kb2NzL1dlYi9BUEkvSW5kZXhlZERCX0FQSSk7XG4gKiB0aGVuIGxvYWQgaXQgYmFjay5cbiAqXG4gKiBgYGBqc1xuICogY29uc3QgbW9kZWwgPSB0Zi5zZXF1ZW50aWFsKFxuICogICAgIHtsYXllcnM6IFt0Zi5sYXllcnMuZGVuc2Uoe3VuaXRzOiAxLCBpbnB1dFNoYXBlOiBbM119KV19KTtcbiAqIGNvbnNvbGUubG9nKCdQcmVkaWN0aW9uIGZyb20gb3JpZ2luYWwgbW9kZWw6Jyk7XG4gKiBtb2RlbC5wcmVkaWN0KHRmLm9uZXMoWzEsIDNdKSkucHJpbnQoKTtcbiAqXG4gKiBjb25zdCBzYXZlUmVzdWx0cyA9IGF3YWl0IG1vZGVsLnNhdmUoJ2luZGV4ZWRkYjovL215LW1vZGVsLTEnKTtcbiAqXG4gKiBjb25zdCBsb2FkZWRNb2RlbCA9IGF3YWl0IHRmLmxvYWRMYXllcnNNb2RlbCgnaW5kZXhlZGRiOi8vbXktbW9kZWwtMScpO1xuICogY29uc29sZS5sb2coJ1ByZWRpY3Rpb24gZnJvbSBsb2FkZWQgbW9kZWw6Jyk7XG4gKiBsb2FkZWRNb2RlbC5wcmVkaWN0KHRmLm9uZXMoWzEsIDNdKSkucHJpbnQoKTtcbiAqIGBgYFxuICpcbiAqIEV4YW1wbGUgMy4gTG9hZCBhIG1vZGVsIGZyb20gdXNlci1zZWxlY3RlZCBmaWxlcyBmcm9tIEhUTUxcbiAqIFtmaWxlIGlucHV0XG4gKiBlbGVtZW50c10oaHR0cHM6Ly9kZXZlbG9wZXIubW96aWxsYS5vcmcvZW4tVVMvZG9jcy9XZWIvSFRNTC9FbGVtZW50L2lucHV0L2ZpbGUpLlxuICpcbiAqIGBgYGpzXG4gKiAvLyBOb3RlOiB0aGlzIGNvZGUgc25pcHBldCB3aWxsIG5vdCB3b3JrIHdpdGhvdXQgdGhlIEhUTUwgZWxlbWVudHMgaW4gdGhlXG4gKiAvLyAgIHBhZ2VcbiAqIGNvbnN0IGpzb25VcGxvYWQgPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnanNvbi11cGxvYWQnKTtcbiAqIGNvbnN0IHdlaWdodHNVcGxvYWQgPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnd2VpZ2h0cy11cGxvYWQnKTtcbiAqXG4gKiBjb25zdCBtb2RlbCA9IGF3YWl0IHRmLmxvYWRMYXllcnNNb2RlbChcbiAqICAgICB0Zi5pby5icm93c2VyRmlsZXMoW2pzb25VcGxvYWQuZmlsZXNbMF0sIHdlaWdodHNVcGxvYWQuZmlsZXNbMF1dKSk7XG4gKiBgYGBcbiAqXG4gKiBFeGFtcGxlIDQuIExvYWQgYSBtb2RlbCBmcm9tIGFuIEhUVFAgc2VydmVyLlxuICpcbiAqIGBgYGpzXG4gKiBjb25zdCBtb2RlbCA9IGF3YWl0XG4gKiAgICAgdGYubG9hZExheWVyc01vZGVsKCdodHRwczovL3N0b3JhZ2UuZ29vZ2xlYXBpcy5jb20vdGZqcy1tb2RlbHMvdGZqcy9pcmlzX3YxL21vZGVsLmpzb24nKTtcbiAqIG1vZGVsLnN1bW1hcnkoKTtcbiAqIGBgYFxuICpcbiAqIEBwYXJhbSBwYXRoT3JJT0hhbmRsZXIgQ2FuIGJlIGVpdGhlciBvZiB0aGUgdHdvIGZvcm1hdHNcbiAqICAgMS4gQSBzdHJpbmcgcGF0aCB0byB0aGUgYE1vZGVsQW5kV2VpZ2h0c0NvbmZpZ2AgSlNPTiBkZXNjcmliaW5nXG4gKiAgICAgIHRoZSBtb2RlbCBpbiB0aGUgY2Fub25pY2FsIFRlbnNvckZsb3cuanMgZm9ybWF0LiBUaGlzIHBhdGggd2lsbCBiZVxuICogICAgICBpbnRlcnByZXRlZCBhcyBhIHJlbGF0aXZlIEhUVFAgcGF0aCwgdG8gd2hpY2ggYGZldGNoYCB3aWxsIGJlIHVzZWQgdG9cbiAqICAgICAgcmVxdWVzdCB0aGUgbW9kZWwgdG9wb2xvZ3kgYW5kIHdlaWdodCBtYW5pZmVzdCBKU09OLlxuICogICAgICBUaGUgY29udGVudCBvZiB0aGUgSlNPTiBmaWxlIGlzIGFzc3VtZWQgdG8gYmUgYSBKU09OIG9iamVjdCB3aXRoIHRoZVxuICogICAgICBmb2xsb3dpbmcgZmllbGRzIGFuZCB2YWx1ZXM6XG4gKiAgICAgIC0gJ21vZGVsVG9wb2xvZ3knOiBBIEpTT04gb2JqZWN0IHRoYXQgY2FuIGJlIGVpdGhlciBvZjpcbiAqICAgICAgICAxLiBhIG1vZGVsIGFyY2hpdGVjdHVyZSBKU09OIGNvbnNpc3RlbnQgd2l0aCB0aGUgZm9ybWF0IG9mIHRoZSByZXR1cm5cbiAqICAgICAgICAgICAgdmFsdWUgb2YgYGtlcmFzLk1vZGVsLnRvX2pzb24oKWBcbiAqICAgICAgICAyLiBhIGZ1bGwgbW9kZWwgSlNPTiBpbiB0aGUgZm9ybWF0IG9mIGBrZXJhcy5tb2RlbHMuc2F2ZV9tb2RlbCgpYC5cbiAqICAgICAgLSAnd2VpZ2h0c01hbmlmZXN0JzogQSBUZW5zb3JGbG93LmpzIHdlaWdodHMgbWFuaWZlc3QuXG4gKiAgICAgIFNlZSB0aGUgUHl0aG9uIGNvbnZlcnRlciBmdW5jdGlvbiBgc2F2ZV9tb2RlbCgpYCBmb3IgbW9yZSBkZXRhaWxzLlxuICogICAgICBJdCBpcyBhbHNvIGFzc3VtZWQgdGhhdCBtb2RlbCB3ZWlnaHRzIGNhbiBiZSBhY2Nlc3NlZCBmcm9tIHJlbGF0aXZlXG4gKiAgICAgIHBhdGhzIGRlc2NyaWJlZCBieSB0aGUgYHBhdGhzYCBmaWVsZHMgaW4gd2VpZ2h0cyBtYW5pZmVzdC5cbiAqICAgMi4gQW4gYHRmLmlvLklPSGFuZGxlcmAgb2JqZWN0IHRoYXQgbG9hZHMgbW9kZWwgYXJ0aWZhY3RzIHdpdGggaXRzIGBsb2FkYFxuICogICAgICBtZXRob2QuXG4gKiBAcGFyYW0gb3B0aW9ucyBPcHRpb25hbCBjb25maWd1cmF0aW9uIGFyZ3VtZW50cyBmb3IgdGhlIG1vZGVsIGxvYWRpbmcsXG4gKiAgIGluY2x1ZGluZzpcbiAqICAgLSBgc3RyaWN0YDogUmVxdWlyZSB0aGF0IHRoZSBwcm92aWRlZCB3ZWlnaHRzIGV4YWN0bHkgbWF0Y2ggdGhvc2UgcmVxdWlyZWRcbiAqICAgICBieSB0aGUgbGF5ZXJzLiAgRGVmYXVsdCB0cnVlLiAgUGFzc2luZyBmYWxzZSBtZWFucyB0aGF0IGJvdGggZXh0cmFcbiAqICAgICB3ZWlnaHRzIGFuZCBtaXNzaW5nIHdlaWdodHMgd2lsbCBiZSBzaWxlbnRseSBpZ25vcmVkLlxuICogICAtIGBvblByb2dyZXNzYDogQSBwcm9ncmVzcyBjYWxsYmFjayBvZiB0aGUgZm9ybTpcbiAqICAgICBgKGZyYWN0aW9uOiBudW1iZXIpID0+IHZvaWRgLiBUaGlzIGNhbGxiYWNrIGNhbiBiZSB1c2VkIHRvIG1vbml0b3IgdGhlXG4gKiAgICAgbW9kZWwtbG9hZGluZyBwcm9jZXNzLlxuICogQHJldHVybnMgQSBgUHJvbWlzZWAgb2YgYHRmLkxheWVyc01vZGVsYCwgd2l0aCB0aGUgdG9wb2xvZ3kgYW5kIHdlaWdodHNcbiAqICAgICBsb2FkZWQuXG4gKi9cbmV4cG9ydCBhc3luYyBmdW5jdGlvbiBsb2FkTGF5ZXJzTW9kZWxJbnRlcm5hbChcbiAgICBwYXRoT3JJT0hhbmRsZXI6IHN0cmluZ3xpby5JT0hhbmRsZXIsXG4gICAgb3B0aW9ucz86IGlvLkxvYWRPcHRpb25zKTogUHJvbWlzZTxMYXllcnNNb2RlbD4ge1xuICBpZiAob3B0aW9ucyA9PSBudWxsKSB7XG4gICAgb3B0aW9ucyA9IHt9O1xuICB9XG4gIGlmICh0eXBlb2YgcGF0aE9ySU9IYW5kbGVyID09PSAnc3RyaW5nJykge1xuICAgIGNvbnN0IGhhbmRsZXJzID0gaW8uZ2V0TG9hZEhhbmRsZXJzKHBhdGhPcklPSGFuZGxlciwgb3B0aW9ucyk7XG4gICAgaWYgKGhhbmRsZXJzLmxlbmd0aCA9PT0gMCkge1xuICAgICAgLy8gRm9yIGJhY2t3YXJkIGNvbXBhdGliaWxpdHk6IGlmIG5vIGxvYWQgaGFuZGxlciBjYW4gYmUgZm91bmQsXG4gICAgICAvLyBhc3N1bWUgaXQgaXMgYSByZWxhdGl2ZSBodHRwIHBhdGguXG4gICAgICAvLyBUT0RPKGNhaXMpOiBSZWZvcm1hdCB0aGUgYXJncyBpbnRvIGEgc2luZ2xlIGBMb2FkT3B0aW9uc2Agb25jZSB0aGUgY29yZVxuICAgICAgLy8gaXMgcmVmYWN0b3JlZC5cbiAgICAgIGhhbmRsZXJzLnB1c2goaW8uYnJvd3NlckhUVFBSZXF1ZXN0KHBhdGhPcklPSGFuZGxlciwgb3B0aW9ucykpO1xuICAgIH0gZWxzZSBpZiAoaGFuZGxlcnMubGVuZ3RoID4gMSkge1xuICAgICAgdGhyb3cgbmV3IFZhbHVlRXJyb3IoXG4gICAgICAgICAgYEZvdW5kIG1vcmUgdGhhbiBvbmUgKCR7aGFuZGxlcnMubGVuZ3RofSkgbG9hZCBoYW5kbGVycyBmb3IgYCArXG4gICAgICAgICAgYFVSTCAnJHtwYXRoT3JJT0hhbmRsZXJ9J2ApO1xuICAgIH1cbiAgICBwYXRoT3JJT0hhbmRsZXIgPSBoYW5kbGVyc1swXTtcbiAgfVxuICByZXR1cm4gbG9hZExheWVyc01vZGVsRnJvbUlPSGFuZGxlcihwYXRoT3JJT0hhbmRsZXIsIHVuZGVmaW5lZCwgb3B0aW9ucyk7XG59XG5cbi8qKlxuICogTG9hZCBhIG1vZGVsIGFuZCBvcHRpb25hbGx5IGl0cyB3ZWlnaHRzLCB1c2luZyBhbiBJT0hhbmRsZXIgb2JqZWN0LlxuICpcbiAqIEBwYXJhbSBoYW5kbGVyIFRoZSBpbnN0YW5jZSBvZiBgSU9IYW5kbGVyYCB0byBiZSB1c2VkIGR1cmluZyB0aGUgbW9kZWxcbiAqICAgbG9hZGluZy5cbiAqIEBwYXJhbSBjdXN0b21PYmplY3RzIEFueSBvcHRpb25hbCBjdXN0b20gb2JqZWN0cyB0byBiZSB1c2VkIGR1cmluZyBtb2RlbFxuICogICBsb2FkaW5nLlxuICogQHBhcmFtIHN0cmljdCBXaGV0aGVyIHRoZSB3ZWlnaHQgbG9hZGluZyB3aWxsIGJlIGRvbmUgaW4gc3RyaWN0IG1vZGUuXG4gKiAgIERlZmF1bHQ6IGB0cnVlYC5cbiAqL1xuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIGxvYWRMYXllcnNNb2RlbEZyb21JT0hhbmRsZXIoXG4gICAgaGFuZGxlcjogaW8uSU9IYW5kbGVyLCBjdXN0b21PYmplY3RzPzogc2VyaWFsaXphdGlvbi5Db25maWdEaWN0LFxuICAgIG9wdGlvbnM/OiBpby5Mb2FkT3B0aW9ucyk6IFByb21pc2U8TGF5ZXJzTW9kZWw+IHtcbiAgaWYgKG9wdGlvbnMgPT0gbnVsbCkge1xuICAgIG9wdGlvbnMgPSB7fTtcbiAgfVxuICBpZiAoaGFuZGxlci5sb2FkID09IG51bGwpIHtcbiAgICB0aHJvdyBuZXcgVmFsdWVFcnJvcihcbiAgICAgICAgJ0Nhbm5vdCBwcm9jZWVkIHdpdGggbW9kZWwgbG9hZGluZyBiZWNhdXNlIHRoZSBJT0hhbmRsZXIgcHJvdmlkZWQgJyArXG4gICAgICAgICdkb2VzIG5vdCBoYXZlIHRoZSBgbG9hZGAgbWV0aG9kIGltcGxlbWVudGVkLicpO1xuICB9XG4gIGNvbnN0IGFydGlmYWN0cyA9IGF3YWl0IGhhbmRsZXIubG9hZCgpO1xuICBsZXQgbW9kZWxUb3BvbG9neSA9IGFydGlmYWN0cy5tb2RlbFRvcG9sb2d5IGFzIFB5SnNvbkRpY3Q7XG4gIGlmIChtb2RlbFRvcG9sb2d5Wydtb2RlbF9jb25maWcnXSAhPSBudWxsKSB7XG4gICAgbW9kZWxUb3BvbG9neSA9IG1vZGVsVG9wb2xvZ3lbJ21vZGVsX2NvbmZpZyddIGFzIFB5SnNvbkRpY3Q7XG4gIH1cblxuICBjb25zdCBzdHJpY3QgPSBvcHRpb25zLnN0cmljdCA9PSBudWxsID8gdHJ1ZSA6IG9wdGlvbnMuc3RyaWN0O1xuICAvLyBJZiB3ZWlnaHRzIGFyZSBwcm92aWRlZCBhbmQgdGhlIHdlaWdodC1sb2FkaW5nIG1vZGUgaXMgc3RyaWN0LCB1c2VcbiAgLy8gZmFzdCB3ZWlnaHQgaW5pdGlhbGl6YXRpb24uIFRoaXMgc2tpcHMgY29zdGx5IGluaXRpYWxpemVycyBzdWNoIGFzXG4gIC8vICdvcnRob2dvbmFsJyBhbmQgc2F2ZXMgdW5uZWNlc3NhcnkgY29tcHV0YXRpb24gaW4gY2FzZXMgd2hlcmVcbiAgLy8gdGhlIGluaXRpYWxpemVkIHdlaWdodCB2YWx1ZXMgd2lsbCBpbW1lZGlhdGVseSBiZSBvdmVyd3JpdHRlbiBieVxuICAvLyBsb2FkZWQgd2VpZ2h0IHZhbHVlcy5cbiAgY29uc3QgZmFzdFdlaWdodEluaXQgPVxuICAgICAgYXJ0aWZhY3RzLndlaWdodERhdGEgIT0gbnVsbCAmJiBhcnRpZmFjdHMud2VpZ2h0U3BlY3MgIT0gbnVsbCAmJiBzdHJpY3Q7XG4gIGNvbnN0IG1vZGVsID1cbiAgICAgIGRlc2VyaWFsaXplKFxuICAgICAgICAgIGNvbnZlcnRQeXRob25pY1RvVHMobW9kZWxUb3BvbG9neSkgYXMgc2VyaWFsaXphdGlvbi5Db25maWdEaWN0LFxuICAgICAgICAgIGN1c3RvbU9iamVjdHMsIGZhc3RXZWlnaHRJbml0KSBhcyBMYXllcnNNb2RlbDtcblxuICBjb25zdCB0cmFpbmluZ0NvbmZpZyA9IGFydGlmYWN0cy50cmFpbmluZ0NvbmZpZyBhcyBUcmFpbmluZ0NvbmZpZztcbiAgaWYgKHRyYWluaW5nQ29uZmlnICE9IG51bGwpIHtcbiAgICBtb2RlbC5sb2FkVHJhaW5pbmdDb25maWcodHJhaW5pbmdDb25maWcpO1xuICB9XG4gIGlmIChhcnRpZmFjdHMudXNlckRlZmluZWRNZXRhZGF0YSAhPSBudWxsKSB7XG4gICAgbW9kZWwuc2V0VXNlckRlZmluZWRNZXRhZGF0YShhcnRpZmFjdHMudXNlckRlZmluZWRNZXRhZGF0YSk7XG4gIH1cblxuICAvLyBJZiB3ZWlnaHREYXRhIGlzIHByZXNlbnQsIGxvYWQgdGhlIHdlaWdodHMgaW50byB0aGUgbW9kZWwuXG4gIGlmIChhcnRpZmFjdHMud2VpZ2h0RGF0YSAhPSBudWxsKSB7XG4gICAgLy8gTG9hZGluZyB3ZWlnaHRzIHJlcXVpcmVzIHdlaWdodFNwZWNzLlxuICAgIGlmIChhcnRpZmFjdHMud2VpZ2h0U3BlY3MgPT0gbnVsbCkge1xuICAgICAgdGhyb3cgbmV3IFZhbHVlRXJyb3IoXG4gICAgICAgICAgJ0xheWVyc01vZGVsIGFydGlmYWN0cyBjb250YWlucyB3ZWlnaHQgZGF0YSwgYnV0IG5vdCB3ZWlnaHQgc3BlY3MuICcgK1xuICAgICAgICAgICdUaGVyZWZvcmUgbG9hZGluZyBvZiB3ZWlnaHRzIGNhbm5vdCBwcm9jZWVkLicpO1xuICAgIH1cblxuICAgIGNvbnN0IHttb2RlbFdlaWdodHMsIG9wdGltaXplcldlaWdodHN9ID0gZGVjb2RlTW9kZWxBbmRPcHRpbWl6ZXJXZWlnaHRzKFxuICAgICAgICBhcnRpZmFjdHMud2VpZ2h0RGF0YSwgYXJ0aWZhY3RzLndlaWdodFNwZWNzKTtcbiAgICBtb2RlbC5sb2FkV2VpZ2h0cyhtb2RlbFdlaWdodHMsIHN0cmljdCk7XG5cbiAgICBpZiAobW9kZWwub3B0aW1pemVyICE9IG51bGwgJiYgb3B0aW1pemVyV2VpZ2h0cy5sZW5ndGggPiAwKSB7XG4gICAgICBhd2FpdCBtb2RlbC5vcHRpbWl6ZXIuc2V0V2VpZ2h0cyhvcHRpbWl6ZXJXZWlnaHRzKTtcbiAgICB9XG5cbiAgICAvLyBEaXNwb3NlIHRlbXBvcmFyeSB3ZWlnaHQgdmFsdWVzLlxuICAgIGRpc3Bvc2UobW9kZWxXZWlnaHRzKTtcbiAgICBkaXNwb3NlKG9wdGltaXplcldlaWdodHMubWFwKHcgPT4gdy50ZW5zb3IpKTtcbiAgfVxuICByZXR1cm4gbW9kZWw7XG59XG5cbmZ1bmN0aW9uIGRlY29kZU1vZGVsQW5kT3B0aW1pemVyV2VpZ2h0cyhcbiAgICBidWZmZXI6IEFycmF5QnVmZmVyLCBzcGVjczogaW8uV2VpZ2h0c01hbmlmZXN0RW50cnlbXSk6XG4gICAge21vZGVsV2VpZ2h0czogTmFtZWRUZW5zb3JNYXAsIG9wdGltaXplcldlaWdodHM6IE5hbWVkVGVuc29yW119IHtcbiAgY29uc3QgbmFtZTJUZW5zb3IgPSBpby5kZWNvZGVXZWlnaHRzKGJ1ZmZlciwgc3BlY3MpO1xuICBjb25zdCBtb2RlbFdlaWdodHM6IE5hbWVkVGVuc29yTWFwID0ge307XG4gIGNvbnN0IG9wdGltaXplcldlaWdodHM6IE5hbWVkVGVuc29yW10gPSBbXTtcbiAgc3BlY3MuZm9yRWFjaChzcGVjID0+IHtcbiAgICBpZiAoc3BlYy5ncm91cCA9PT0gJ29wdGltaXplcicpIHtcbiAgICAgIG9wdGltaXplcldlaWdodHMucHVzaCh7bmFtZTogc3BlYy5uYW1lLCB0ZW5zb3I6IG5hbWUyVGVuc29yW3NwZWMubmFtZV19KTtcbiAgICB9IGVsc2Uge1xuICAgICAgbW9kZWxXZWlnaHRzW3NwZWMubmFtZV0gPSBuYW1lMlRlbnNvcltzcGVjLm5hbWVdO1xuICAgIH1cbiAgfSk7XG4gIHJldHVybiB7bW9kZWxXZWlnaHRzLCBvcHRpbWl6ZXJXZWlnaHRzfTtcbn1cblxuLyoqXG4gKiBDb25maWd1cmF0aW9uIGZvciBhIFNlcXVlbnRpYWwgbW9kZWwuXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgU2VxdWVudGlhbEFyZ3Mge1xuICAvKiogU3RhY2sgb2YgbGF5ZXJzIGZvciB0aGUgbW9kZWwuICovXG4gIGxheWVycz86IExheWVyW107XG5cbiAgLyoqIFRoZSBuYW1lIG9mIHRoaXMgbW9kZWwuICovXG4gIG5hbWU/OiBzdHJpbmc7XG59XG5cbi8qKlxuICogQSBtb2RlbCB3aXRoIGEgc3RhY2sgb2YgbGF5ZXJzLCBmZWVkaW5nIGxpbmVhcmx5IGZyb20gb25lIHRvIHRoZSBuZXh0LlxuICpcbiAqIGB0Zi5zZXF1ZW50aWFsYCBpcyBhIGZhY3RvcnkgZnVuY3Rpb24gdGhhdCBjcmVhdGVzIGFuIGluc3RhbmNlIG9mXG4gKiBgdGYuU2VxdWVudGlhbGAuXG4gKlxuICogYGBganNcbiAqICAvLyBEZWZpbmUgYSBtb2RlbCBmb3IgbGluZWFyIHJlZ3Jlc3Npb24uXG4gKiAgY29uc3QgbW9kZWwgPSB0Zi5zZXF1ZW50aWFsKCk7XG4gKiAgbW9kZWwuYWRkKHRmLmxheWVycy5kZW5zZSh7dW5pdHM6IDEsIGlucHV0U2hhcGU6IFsxXX0pKTtcbiAqXG4gKiAgLy8gUHJlcGFyZSB0aGUgbW9kZWwgZm9yIHRyYWluaW5nOiBTcGVjaWZ5IHRoZSBsb3NzIGFuZCB0aGUgb3B0aW1pemVyLlxuICogIG1vZGVsLmNvbXBpbGUoe2xvc3M6ICdtZWFuU3F1YXJlZEVycm9yJywgb3B0aW1pemVyOiAnc2dkJ30pO1xuICpcbiAqICAvLyBHZW5lcmF0ZSBzb21lIHN5bnRoZXRpYyBkYXRhIGZvciB0cmFpbmluZy5cbiAqICBjb25zdCB4cyA9IHRmLnRlbnNvcjJkKFsxLCAyLCAzLCA0XSwgWzQsIDFdKTtcbiAqICBjb25zdCB5cyA9IHRmLnRlbnNvcjJkKFsxLCAzLCA1LCA3XSwgWzQsIDFdKTtcbiAqXG4gKiAgLy8gVHJhaW4gdGhlIG1vZGVsIHVzaW5nIHRoZSBkYXRhIHRoZW4gZG8gaW5mZXJlbmNlIG9uIGEgZGF0YSBwb2ludCB0aGVcbiAqICAvLyBtb2RlbCBoYXNuJ3Qgc2VlbjpcbiAqICBhd2FpdCBtb2RlbC5maXQoeHMsIHlzKTtcbiAqICBtb2RlbC5wcmVkaWN0KHRmLnRlbnNvcjJkKFs1XSwgWzEsIDFdKSkucHJpbnQoKTtcbiAqIGBgYFxuICpcbiAqIEBkb2Mge2hlYWRpbmc6ICdNb2RlbHMnLCBzdWJoZWFkaW5nOiAnQ2xhc3Nlcyd9XG4gKi9cbmV4cG9ydCBjbGFzcyBTZXF1ZW50aWFsIGV4dGVuZHMgTGF5ZXJzTW9kZWwge1xuICAvKiogQG5vY29sbGFwc2UgKi9cbiAgc3RhdGljIGNsYXNzTmFtZSA9ICdTZXF1ZW50aWFsJztcbiAgcHJpdmF0ZSBtb2RlbDogTGF5ZXJzTW9kZWw7XG4gIGNvbnN0cnVjdG9yKGFyZ3M/OiBTZXF1ZW50aWFsQXJncykge1xuICAgIHN1cGVyKHtpbnB1dHM6IFtdLCBvdXRwdXRzOiBbXX0pO1xuICAgIGFyZ3MgPSBhcmdzIHx8IHt9O1xuXG4gICAgdGhpcy50cmFpbmFibGUgPSB0cnVlO1xuICAgIHRoaXMuYnVpbHQgPSBmYWxzZTtcblxuICAgIC8vIFNldCBtb2RlbCBuYW1lLlxuICAgIHRoaXMubmFtZSA9IChhcmdzLm5hbWUgIT0gbnVsbCkgPyBhcmdzLm5hbWUgOiBnZXRVaWQoJ3NlcXVlbnRpYWxfJyk7XG5cbiAgICAvLyBBZGQgdG8gdGhlIG1vZGVsIGFueSBsYXllcnMgcGFzc2VkIHRvIHRoZSBjb25zdHJ1Y3Rvci5cbiAgICBpZiAoYXJncy5sYXllcnMgIT0gbnVsbCkge1xuICAgICAgZm9yIChjb25zdCBsYXllciBvZiBhcmdzLmxheWVycykge1xuICAgICAgICB0aGlzLmFkZChsYXllcik7XG4gICAgICB9XG4gICAgfVxuICB9XG5cbiAgLy8gSGVscGVyIGZ1bmN0aW9uIHRvIFNlcXVlbnRpYWwuYWRkICBUaHJvd3MgaWYgdGhlIG5ldyBvdXRwdXQgc2hhcGUgd2lsbCBiZVxuICAvLyBpbnZhbGlkLlxuICBwcml2YXRlIGNoZWNrU2hhcGUobGF5ZXI6IExheWVyKSB7XG4gICAgY29uc3Qgc2hhcGUgPSBsYXllci5pbmJvdW5kTm9kZXNbMF0ub3V0cHV0VGVuc29yc1swXS5zaGFwZTtcbiAgICBpZiAoc2hhcGUuc29tZSh4ID0+IHggPCAwKSkge1xuICAgICAgdGhyb3cgbmV3IFZhbHVlRXJyb3IoXG4gICAgICAgICAgJ05lZ2F0aXZlIGRpbWVuc2lvbiBzaXplIGNhdXNlZCBieSBhZGRpbmcgbGF5ZXIgJyArXG4gICAgICAgICAgYCR7bGF5ZXIubmFtZX0gd2l0aCBpbnB1dCBzaGFwZSBbYCArXG4gICAgICAgICAgYCR7bGF5ZXIuaW5ib3VuZE5vZGVzWzBdLmlucHV0VGVuc29yc1swXS5zaGFwZX1dYCk7XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIEFkZHMgYSBsYXllciBpbnN0YW5jZSBvbiB0b3Agb2YgdGhlIGxheWVyIHN0YWNrLlxuICAgKlxuICAgKiBgYGBqc1xuICAgKiAgY29uc3QgbW9kZWwgPSB0Zi5zZXF1ZW50aWFsKCk7XG4gICAqICBtb2RlbC5hZGQodGYubGF5ZXJzLmRlbnNlKHt1bml0czogOCwgaW5wdXRTaGFwZTogWzFdfSkpO1xuICAgKiAgbW9kZWwuYWRkKHRmLmxheWVycy5kZW5zZSh7dW5pdHM6IDQsIGFjdGl2YXRpb246ICdyZWx1Nid9KSk7XG4gICAqICBtb2RlbC5hZGQodGYubGF5ZXJzLmRlbnNlKHt1bml0czogMSwgYWN0aXZhdGlvbjogJ3JlbHU2J30pKTtcbiAgICogIC8vIE5vdGUgdGhhdCB0aGUgdW50cmFpbmVkIG1vZGVsIGlzIHJhbmRvbSBhdCB0aGlzIHBvaW50LlxuICAgKiAgbW9kZWwucHJlZGljdCh0Zi5yYW5kb21Ob3JtYWwoWzEwLCAxXSkpLnByaW50KCk7XG4gICAqIGBgYFxuICAgKiBAcGFyYW0gbGF5ZXIgTGF5ZXIgaW5zdGFuY2UuXG4gICAqXG4gICAqIEBleGNlcHRpb24gVmFsdWVFcnJvciBJbiBjYXNlIHRoZSBgbGF5ZXJgIGFyZ3VtZW50IGRvZXMgbm90IGtub3cgaXRzXG4gICAqIGlucHV0IHNoYXBlLlxuICAgKiBAZXhjZXB0aW9uIFZhbHVlRXJyb3IgSW4gY2FzZSB0aGUgYGxheWVyYCBhcmd1bWVudCBoYXMgbXVsdGlwbGUgb3V0cHV0XG4gICAqICAgdGVuc29ycywgb3IgaXMgYWxyZWFkeSBjb25uZWN0ZWQgc29tZXdoZXJlIGVsc2UgKGZvcmJpZGRlbiBpblxuICAgKiAgIGBTZXF1ZW50aWFsYCBtb2RlbHMpLlxuICAgKlxuICAgKiBAZG9jIHtoZWFkaW5nOiAnTW9kZWxzJywgc3ViaGVhZGluZzogJ0NsYXNzZXMnfVxuICAgKi9cbiAgYWRkKGxheWVyOiBMYXllcik6IHZvaWQge1xuICAgIGNvbnN0IGlzTGF5ZXJNb2RlbEluc3RhbmNlID1cbiAgICAgICAgbGF5ZXIgaW5zdGFuY2VvZiBTZXF1ZW50aWFsIHx8IGxheWVyIGluc3RhbmNlb2YgTGF5ZXJzTW9kZWw7XG4gICAgbGV0IG1vZGVsTGF5ZXI6IExheWVyc01vZGVsO1xuICAgIGlmIChpc0xheWVyTW9kZWxJbnN0YW5jZSkge1xuICAgICAgbW9kZWxMYXllciA9IGxheWVyIGFzIExheWVyc01vZGVsO1xuICAgICAgaWYgKG1vZGVsTGF5ZXIub3V0cHV0cy5sZW5ndGggIT09IDEpIHtcbiAgICAgICAgdGhyb3cgbmV3IFZhbHVlRXJyb3IoXG4gICAgICAgICAgICAnQWxsIGxheWVycyBpbiBhIFNlcXVlbnRpYWwgbW9kZWwgJyArXG4gICAgICAgICAgICAnc2hvdWxkIGhhdmUgYSBzaW5nbGUgb3V0cHV0IHRlbnNvci4gJyArXG4gICAgICAgICAgICAnRm9yIG11bHRpLW91dHB1dCBsYXllcnMsICcgK1xuICAgICAgICAgICAgJ3VzZSB0aGUgZnVuY3Rpb25hbCBBUEkuJyk7XG4gICAgICB9XG4gICAgICBpZiAobW9kZWxMYXllci5pbnB1dHMubGVuZ3RoICE9PSAxKSB7XG4gICAgICAgIHRocm93IG5ldyBWYWx1ZUVycm9yKFxuICAgICAgICAgICAgJ0FsbCBsYXllcnMgaW4gYSBTZXF1ZW50aWFsIG1vZGVsICcgK1xuICAgICAgICAgICAgJ3Nob3VsZCBoYXZlIGEgc2luZ2xlIGlucHV0IHRlbnNvci4gJyArXG4gICAgICAgICAgICAnRm9yIG11bHRpLWlucHV0IGxheWVycywgJyArXG4gICAgICAgICAgICAndXNlIHRoZSBmdW5jdGlvbmFsIEFQSS4nKTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICBpZiAodGhpcy5vdXRwdXRzLmxlbmd0aCA9PT0gMCkge1xuICAgICAgLy8gZmlyc3QgbGF5ZXIgaW4gbW9kZWw6IGNoZWNrIHRoYXQgaXQgaXMgYW4gaW5wdXQgbGF5ZXJcbiAgICAgIGlmIChsYXllci5pbmJvdW5kTm9kZXMubGVuZ3RoID09PSAwKSB7XG4gICAgICAgIC8vIGNyZWF0ZSBhbiBpbnB1dCBsYXllclxuICAgICAgICBpZiAobGF5ZXIuYmF0Y2hJbnB1dFNoYXBlID09IG51bGwpIHtcbiAgICAgICAgICB0aHJvdyBuZXcgVmFsdWVFcnJvcihcbiAgICAgICAgICAgICAgJ1RoZSBmaXJzdCBsYXllciBpbiBhIFNlcXVlbnRpYWwgbW9kZWwgbXVzdCAnICtcbiAgICAgICAgICAgICAgJ2dldCBhbiBgaW5wdXRTaGFwZWAgb3IgYGJhdGNoSW5wdXRTaGFwZWAgYXJndW1lbnQuJyk7XG4gICAgICAgIH1cbiAgICAgICAgLy8gSW5zdGFudGlhdGUgdGhlIGlucHV0IGxheWVyLlxuICAgICAgICBjb25zdCB4ID0gSW5wdXQoe1xuICAgICAgICAgIGJhdGNoU2hhcGU6IGxheWVyLmJhdGNoSW5wdXRTaGFwZSxcbiAgICAgICAgICBkdHlwZTogbGF5ZXIuZHR5cGUsXG4gICAgICAgICAgbmFtZTogbGF5ZXIubmFtZSArICdfaW5wdXQnXG4gICAgICAgIH0pO1xuICAgICAgICAvLyBUaGlzIHdpbGwgYnVpbGQgdGhlIGN1cnJlbnQgbGF5ZXIgYW5kIGNyZWF0ZSB0aGUgbm9kZSBjb25uZWN0aW5nXG4gICAgICAgIC8vIHRoZSBjdXJyZW50IGxheWVyIHRvIHRoZSBpbnB1dCBsYXllciB3ZSBqdXN0IGNyZWF0ZWQuXG4gICAgICAgIGxheWVyLmFwcGx5KHgpO1xuICAgICAgfVxuXG4gICAgICBpZiAoaXNMYXllck1vZGVsSW5zdGFuY2UpIHtcbiAgICAgICAgdGhpcy5vdXRwdXRzID0gbW9kZWxMYXllci5vdXRwdXRzO1xuICAgICAgICB0aGlzLmlucHV0cyA9IG1vZGVsTGF5ZXIuaW5wdXRzO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgaWYgKGxheWVyLmluYm91bmROb2Rlcy5sZW5ndGggIT09IDEpIHtcbiAgICAgICAgICB0aHJvdyBuZXcgVmFsdWVFcnJvcihcbiAgICAgICAgICAgICAgJ0EgbGF5ZXIgYWRkZWQgdG8gYSBTZXF1ZW50aWFsIG1vZGVsIG11c3Qgbm90IGFscmVhZHkgYmUgJyArXG4gICAgICAgICAgICAgIGBjb25uZWN0ZWQgc29tZXdoZXJlIGVsc2UuIExheWVyc01vZGVsIHJlY2VpdmVkIGxheWVyICR7XG4gICAgICAgICAgICAgICAgICBsYXllci5uYW1lfSBgICtcbiAgICAgICAgICAgICAgYHdoaWNoIGhhcyAke2xheWVyLmluYm91bmROb2Rlcy5sZW5ndGh9IHByZS1leGlzdGluZyBpbmJvdW5kIGAgK1xuICAgICAgICAgICAgICAnY29ubmVjdGlvbnMuJyk7XG4gICAgICAgIH1cblxuICAgICAgICBpZiAobGF5ZXIuaW5ib3VuZE5vZGVzWzBdLm91dHB1dFRlbnNvcnMubGVuZ3RoICE9PSAxKSB7XG4gICAgICAgICAgdGhyb3cgbmV3IFZhbHVlRXJyb3IoXG4gICAgICAgICAgICAgICdBbGwgbGF5ZXJzIGluIGEgU2VxdWVudGlhbCBtb2RlbCAnICtcbiAgICAgICAgICAgICAgJ3Nob3VsZCBoYXZlIGEgc2luZ2xlIG91dHB1dCB0ZW5zb3IuICcgK1xuICAgICAgICAgICAgICAnRm9yIG11bHRpLW91dHB1dCBsYXllcnMsICcgK1xuICAgICAgICAgICAgICAndXNlIHRoZSBmdW5jdGlvbmFsIEFQSS4nKTtcbiAgICAgICAgfVxuICAgICAgICB0aGlzLmNoZWNrU2hhcGUobGF5ZXIpO1xuICAgICAgICB0aGlzLm91dHB1dHMgPSBbbGF5ZXIuaW5ib3VuZE5vZGVzWzBdLm91dHB1dFRlbnNvcnNbMF1dO1xuICAgICAgICB0aGlzLmlucHV0cyA9IGdldFNvdXJjZUlucHV0cyh0aGlzLm91dHB1dHNbMF0pO1xuICAgICAgfVxuXG4gICAgICB0aGlzLmluYm91bmROb2RlcyA9IFtdO1xuICAgICAgLy8gV2UgY3JlYXRlIGFuIGlucHV0IG5vZGUsIHdoaWNoIHdlIHdpbGwga2VlcCB1cGRhdGVkXG4gICAgICAvLyBhcyB3ZSBhZGQgbW9yZSBsYXllcnMuXG4gICAgICAvLyAoVGhpcyBjYWxsIGhhcyBzaWRlIGVmZmVjdHMuKVxuICAgICAgLy8gdHNsaW50OmRpc2FibGUtbmV4dC1saW5lOm5vLXVudXNlZC1leHByZXNzaW9uXG4gICAgICBuZXcgTm9kZSh7XG4gICAgICAgIG91dGJvdW5kTGF5ZXI6IHRoaXMsXG4gICAgICAgIGluYm91bmRMYXllcnM6IFtdLFxuICAgICAgICBub2RlSW5kaWNlczogW10sXG4gICAgICAgIHRlbnNvckluZGljZXM6IFtdLFxuICAgICAgICBpbnB1dFRlbnNvcnM6IHRoaXMuaW5wdXRzLFxuICAgICAgICBvdXRwdXRUZW5zb3JzOiB0aGlzLm91dHB1dHMsXG4gICAgICAgIC8vIG5vIG1vZGVsLWxldmVsIG1hc2tpbmcgZm9yIG5vd1xuICAgICAgICBpbnB1dE1hc2tzOiBnZW5lcmljX3V0aWxzLnB5TGlzdFJlcGVhdChudWxsLCB0aGlzLmlucHV0cy5sZW5ndGgpLFxuICAgICAgICBvdXRwdXRNYXNrczogW251bGxdLFxuICAgICAgICBpbnB1dFNoYXBlczogdGhpcy5pbnB1dHMubWFwKHggPT4geC5zaGFwZSksXG4gICAgICAgIG91dHB1dFNoYXBlczogdGhpcy5vdXRwdXRzWzBdLnNoYXBlXG4gICAgICB9KTtcbiAgICB9IGVsc2Uge1xuICAgICAgY29uc3Qgb3V0cHV0VGVuc29yID0gbGF5ZXIuYXBwbHkodGhpcy5vdXRwdXRzWzBdKTtcbiAgICAgIGlmIChBcnJheS5pc0FycmF5KG91dHB1dFRlbnNvcikpIHtcbiAgICAgICAgdGhyb3cgbmV3IFR5cGVFcnJvcihcbiAgICAgICAgICAgICdBbGwgbGF5ZXJzIGluIGEgU2VxdWVudGlhbCBtb2RlbCAnICtcbiAgICAgICAgICAgICdzaG91bGQgaGF2ZSBhIHNpbmdsZSBvdXRwdXQgdGVuc29yLiAnICtcbiAgICAgICAgICAgICdGb3IgbXVsdGktb3V0cHV0IGxheWVycywgJyArXG4gICAgICAgICAgICAndXNlIHRoZSBmdW5jdGlvbmFsIEFQSS4nKTtcbiAgICAgIH1cbiAgICAgIHRoaXMuY2hlY2tTaGFwZShsYXllcik7XG4gICAgICB0aGlzLm91dHB1dHMgPSBbb3V0cHV0VGVuc29yIGFzIFN5bWJvbGljVGVuc29yXTtcbiAgICAgIC8vIHVwZGF0ZSBzZWxmLmluYm91bmRfbm9kZXNcbiAgICAgIHRoaXMuaW5ib3VuZE5vZGVzWzBdLm91dHB1dFRlbnNvcnMgPSB0aGlzLm91dHB1dHM7XG4gICAgICB0aGlzLmluYm91bmROb2Rlc1swXS5vdXRwdXRTaGFwZXMgPSBbdGhpcy5vdXRwdXRzWzBdLnNoYXBlXTtcbiAgICB9XG5cbiAgICB0aGlzLmxheWVycy5wdXNoKGxheWVyKTtcbiAgICB0aGlzLmJ1aWx0ID0gZmFsc2U7XG4gIH1cblxuICAvKipcbiAgICogUmVtb3ZlcyB0aGUgbGFzdCBsYXllciBpbiB0aGUgbW9kZWwuXG4gICAqXG4gICAqIEBleGNlcHRpb24gVHlwZUVycm9yIGlmIHRoZXJlIGFyZSBubyBsYXllcnMgaW4gdGhlIG1vZGVsLlxuICAgKi9cbiAgcG9wKCk6IHZvaWQge1xuICAgIGlmICh0aGlzLmxheWVycy5sZW5ndGggPT09IDApIHtcbiAgICAgIHRocm93IG5ldyBUeXBlRXJyb3IoJ1RoZXJlIGFyZSBubyBsYXllcnMgaW4gdGhlIG1vZGVsLicpO1xuICAgIH1cblxuICAgIHRoaXMubGF5ZXJzLnBvcCgpO1xuICAgIGlmICh0aGlzLmxheWVycy5sZW5ndGggPT09IDApIHtcbiAgICAgIHRoaXMub3V0cHV0cyA9IFtdO1xuICAgICAgdGhpcy5pbmJvdW5kTm9kZXMgPSBbXTtcbiAgICAgIHRoaXMub3V0Ym91bmROb2RlcyA9IFtdO1xuICAgIH0gZWxzZSB7XG4gICAgICBjb25zdCBsYXN0TGF5ZXJJbmRleCA9IHRoaXMubGF5ZXJzLmxlbmd0aCAtIDE7XG4gICAgICB0aGlzLmxheWVyc1tsYXN0TGF5ZXJJbmRleF0ub3V0Ym91bmROb2RlcyA9IFtdO1xuICAgICAgdGhpcy5vdXRwdXRzID0gW3RoaXMubGF5ZXJzW2xhc3RMYXllckluZGV4XS5vdXRwdXQgYXMgU3ltYm9saWNUZW5zb3JdO1xuICAgICAgLy8gdXBkYXRlIHNlbGYuaW5ib3VuZF9ub2Rlc1xuICAgICAgdGhpcy5pbmJvdW5kTm9kZXNbMF0ub3V0cHV0VGVuc29ycyA9IHRoaXMub3V0cHV0cztcbiAgICAgIHRoaXMuaW5ib3VuZE5vZGVzWzBdLm91dHB1dFNoYXBlcyA9IFt0aGlzLm91dHB1dHNbMF0uc2hhcGVdO1xuICAgIH1cbiAgfVxuXG4gIGNhbGwoaW5wdXRzOiBUZW5zb3J8VGVuc29yW10sIGt3YXJnczogS3dhcmdzKTogVGVuc29yfFRlbnNvcltdIHtcbiAgICBpZiAodGhpcy5tb2RlbCA9PSBudWxsKSB7XG4gICAgICB0aGlzLmJ1aWxkKCk7XG4gICAgfVxuICAgIHJldHVybiB0aGlzLm1vZGVsLmNhbGwoaW5wdXRzLCBrd2FyZ3MpO1xuICB9XG5cbiAgYnVpbGQoaW5wdXRTaGFwZT86IFNoYXBlfFNoYXBlW10pIHtcbiAgICAvLyBDYWxsIGBnZXRFeGFjdGx5T25lU2hhcGVgIHdpdGhvdXQgdXNpbmcgaXRzIHJldHVybiB2YWx1ZSxcbiAgICAvLyB0byB2ZXJpZnkgdGhhdCBleGFjdGx5IG9uZSBpbnB1dCBzaGFwZSBpcyBwcm92aWRlZC5cbiAgICBnZXRFeGFjdGx5T25lU2hhcGUoaW5wdXRTaGFwZSk7XG5cbiAgICBpZiAodGhpcy5pbnB1dHMubGVuZ3RoID09PSAwIHx8IHRoaXMub3V0cHV0cy5sZW5ndGggPT09IDApIHtcbiAgICAgIHRocm93IG5ldyBUeXBlRXJyb3IoXG4gICAgICAgICAgJ1NlcXVlbnRpYWwgbW9kZWwgY2Fubm90IGJlIGJ1aWx0OiBtb2RlbCBpcyBlbXB0eS4nICtcbiAgICAgICAgICAnIEFkZCBzb21lIGxheWVycyBmaXJzdC4nKTtcbiAgICB9XG4gICAgLy8gYWN0dWFsbHkgY3JlYXRlIHRoZSBtb2RlbFxuICAgIHRoaXMubW9kZWwgPSBuZXcgTGF5ZXJzTW9kZWwoe1xuICAgICAgaW5wdXRzOiB0aGlzLmlucHV0cyxcbiAgICAgIG91dHB1dHM6IHRoaXMub3V0cHV0c1swXSxcbiAgICAgIG5hbWU6IHRoaXMubmFtZSArICdfbW9kZWwnXG4gICAgfSk7XG4gICAgdGhpcy5tb2RlbC50cmFpbmFibGUgPSB0aGlzLnRyYWluYWJsZTtcblxuICAgIC8vIG1pcnJvciBtb2RlbCBhdHRyaWJ1dGVzXG4gICAgdGhpcy5zdXBwb3J0c01hc2tpbmcgPSB0aGlzLm1vZGVsLnN1cHBvcnRzTWFza2luZztcbiAgICAvLyBUT0RPKG1pY2hhZWx0ZXJyeSk6IEFkZCBjYWNoZXNcbiAgICB0aGlzLmlucHV0TGF5ZXJzID0gdGhpcy5tb2RlbC5pbnB1dExheWVycztcbiAgICB0aGlzLmlucHV0TGF5ZXJzTm9kZUluZGljZXMgPSB0aGlzLm1vZGVsLmlucHV0TGF5ZXJzTm9kZUluZGljZXM7XG4gICAgdGhpcy5pbnB1dExheWVyc1RlbnNvckluZGljZXMgPSB0aGlzLm1vZGVsLmlucHV0TGF5ZXJzVGVuc29ySW5kaWNlcztcbiAgICB0aGlzLm91dHB1dExheWVycyA9IHRoaXMubW9kZWwub3V0cHV0TGF5ZXJzO1xuICAgIHRoaXMub3V0cHV0TGF5ZXJzTm9kZUluZGljZXMgPSB0aGlzLm1vZGVsLm91dHB1dExheWVyc05vZGVJbmRpY2VzO1xuICAgIHRoaXMub3V0cHV0TGF5ZXJzVGVuc29ySW5kaWNlcyA9IHRoaXMubW9kZWwub3V0cHV0TGF5ZXJzVGVuc29ySW5kaWNlcztcbiAgICB0aGlzLm5vZGVzQnlEZXB0aCA9IHRoaXMubW9kZWwubm9kZXNCeURlcHRoO1xuICAgIHRoaXMuY29udGFpbmVyTm9kZXMgPSB0aGlzLm1vZGVsLmNvbnRhaW5lck5vZGVzO1xuICAgIHRoaXMub3V0cHV0TmFtZXMgPSB0aGlzLm1vZGVsLm91dHB1dE5hbWVzO1xuICAgIHRoaXMuaW5wdXROYW1lcyA9IHRoaXMubW9kZWwuaW5wdXROYW1lcztcbiAgICAvLyBUT0RPKG1pY2hhZWx0ZXJyeSk6IEFkZCBmZWVkSW5wdXROYW1lcywgZmVlZElucHV0cywgaWYgbmVlZGVkLlxuICAgIC8vIFRPRE8obWljaGFlbHRlcnJ5KTogQWRkIGNhbGxiYWNrTW9kZWwgaWYgbmVlZGVkLlxuICAgIHRoaXMuYnVpbHQgPSB0cnVlO1xuICB9XG5cbiAgY291bnRQYXJhbXMoKTogbnVtYmVyIHtcbiAgICBpZiAoIXRoaXMuYnVpbHQpIHtcbiAgICAgIHRoaXMuYnVpbGQoKTtcbiAgICB9XG4gICAgcmV0dXJuIHN1cGVyLmNvdW50UGFyYW1zKCk7XG4gIH1cblxuICAvKipcbiAgICogUHJpbnQgYSB0ZXh0IHN1bW1hcnkgb2YgdGhlIFNlcXVlbnRpYWwgbW9kZWwncyBsYXllcnMuXG4gICAqXG4gICAqIFRoZSBzdW1tYXJ5IGluY2x1ZGVzXG4gICAqIC0gTmFtZSBhbmQgdHlwZSBvZiBhbGwgbGF5ZXJzIHRoYXQgY29tcHJpc2UgdGhlIG1vZGVsLlxuICAgKiAtIE91dHB1dCBzaGFwZShzKSBvZiB0aGUgbGF5ZXJzXG4gICAqIC0gTnVtYmVyIG9mIHdlaWdodCBwYXJhbWV0ZXJzIG9mIGVhY2ggbGF5ZXJcbiAgICogLSBUaGUgdG90YWwgbnVtYmVyIG9mIHRyYWluYWJsZSBhbmQgbm9uLXRyYWluYWJsZSBwYXJhbWV0ZXJzIG9mIHRoZVxuICAgKiBtb2RlbC5cbiAgICpcbiAgICogYGBganNcbiAgICogY29uc3QgbW9kZWwgPSB0Zi5zZXF1ZW50aWFsKCk7XG4gICAqIG1vZGVsLmFkZChcbiAgICogICAgIHRmLmxheWVycy5kZW5zZSh7dW5pdHM6IDEwMCwgaW5wdXRTaGFwZTogWzEwXSwgYWN0aXZhdGlvbjogJ3JlbHUnfSkpO1xuICAgKiBtb2RlbC5hZGQodGYubGF5ZXJzLmRlbnNlKHt1bml0czogMSwgYWN0aXZhdGlvbjogJ3NpZ21vaWQnfSkpO1xuICAgKlxuICAgKiBtb2RlbC5zdW1tYXJ5KCk7XG4gICAqIGBgYFxuICAgKlxuICAgKiBAcGFyYW0gbGluZUxlbmd0aCBDdXN0b20gbGluZSBsZW5ndGgsIGluIG51bWJlciBvZiBjaGFyYWN0ZXJzLlxuICAgKiBAcGFyYW0gcG9zaXRpb25zIEN1c3RvbSB3aWR0aHMgb2YgZWFjaCBvZiB0aGUgY29sdW1ucywgYXMgZWl0aGVyXG4gICAqICAgZnJhY3Rpb25zIG9mIGBsaW5lTGVuZ3RoYCAoZS5nLiwgYFswLjUsIDAuNzUsIDFdYCkgb3IgYWJzb2x1dGUgbnVtYmVyXG4gICAqICAgb2YgY2hhcmFjdGVycyAoZS5nLiwgYFszMCwgNTAsIDY1XWApLiBFYWNoIG51bWJlciBjb3JyZXNwb25kcyB0b1xuICAgKiAgIHJpZ2h0LW1vc3QgKGkuZS4sIGVuZGluZykgcG9zaXRpb24gb2YgYSBjb2x1bW4uXG4gICAqIEBwYXJhbSBwcmludEZuIEN1c3RvbSBwcmludCBmdW5jdGlvbi4gQ2FuIGJlIHVzZWQgdG8gcmVwbGFjZSB0aGUgZGVmYXVsdFxuICAgKiAgIGBjb25zb2xlLmxvZ2AuIEZvciBleGFtcGxlLCB5b3UgY2FuIHVzZSBgeCA9PiB7fWAgdG8gbXV0ZSB0aGUgcHJpbnRlZFxuICAgKiAgIG1lc3NhZ2VzIGluIHRoZSBjb25zb2xlLlxuICAgKlxuICAgKiBAZG9jIHtoZWFkaW5nOiAnTW9kZWxzJywgc3ViaGVhZGluZzogJ0NsYXNzZXMnfVxuICAgKi9cbiAgc3VtbWFyeShcbiAgICAgIGxpbmVMZW5ndGg/OiBudW1iZXIsIHBvc2l0aW9ucz86IG51bWJlcltdLFxuICAgICAgcHJpbnRGbjpcbiAgICAgICAgICAvLyB0c2xpbnQ6ZGlzYWJsZS1uZXh0LWxpbmU6bm8tYW55XG4gICAgICAobWVzc2FnZT86IGFueSwgLi4ub3B0aW9uYWxQYXJhbXM6IGFueVtdKSA9PiB2b2lkID0gY29uc29sZS5sb2cpIHtcbiAgICBpZiAoIXRoaXMuYnVpbHQpIHtcbiAgICAgIHRoaXMuYnVpbGQoKTtcbiAgICB9XG4gICAgc3VwZXIuc3VtbWFyeShsaW5lTGVuZ3RoLCBwb3NpdGlvbnMsIHByaW50Rm4pO1xuICB9XG5cbiAgLyoqXG4gICAqIFNldHMgdGhlIHdlaWdodHMgb2YgdGhlIG1vZGVsLlxuICAgKlxuICAgKiBAcGFyYW0gd2VpZ2h0cyBTaG91bGQgYmUgYSBsaXN0IG9mIFRlbnNvcnMgd2l0aCBzaGFwZXMgYW5kIHR5cGVzIG1hdGNoaW5nXG4gICAqICAgdGhlIG91dHB1dCBvZiBgbW9kZWwuZ2V0V2VpZ2h0cygpYC5cbiAgICovXG4gIHNldFdlaWdodHMod2VpZ2h0czogVGVuc29yW10pOiB2b2lkIHtcbiAgICBpZiAodGhpcy5tb2RlbCA9PSBudWxsKSB7XG4gICAgICB0aGlzLmJ1aWxkKCk7XG4gICAgfVxuICAgIHRoaXMubW9kZWwuc2V0V2VpZ2h0cyh3ZWlnaHRzKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBSZXR1cm5zIHRoZSBsb3NzIHZhbHVlICYgbWV0cmljcyB2YWx1ZXMgZm9yIHRoZSBtb2RlbCBpbiB0ZXN0IG1vZGUuXG4gICAqXG4gICAqIExvc3MgYW5kIG1ldHJpY3MgYXJlIHNwZWNpZmllZCBkdXJpbmcgYGNvbXBpbGUoKWAsIHdoaWNoIG5lZWRzIHRvIGhhcHBlblxuICAgKiBiZWZvcmUgY2FsbHMgdG8gYGV2YWx1YXRlKClgLlxuICAgKlxuICAgKiBDb21wdXRhdGlvbiBpcyBkb25lIGluIGJhdGNoZXMuXG4gICAqXG4gICAqIGBgYGpzXG4gICAqIGNvbnN0IG1vZGVsID0gdGYuc2VxdWVudGlhbCh7XG4gICAqICAgbGF5ZXJzOiBbdGYubGF5ZXJzLmRlbnNlKHt1bml0czogMSwgaW5wdXRTaGFwZTogWzEwXX0pXVxuICAgKiB9KTtcbiAgICogbW9kZWwuY29tcGlsZSh7b3B0aW1pemVyOiAnc2dkJywgbG9zczogJ21lYW5TcXVhcmVkRXJyb3InfSk7XG4gICAqIGNvbnN0IHJlc3VsdCA9IG1vZGVsLmV2YWx1YXRlKHRmLm9uZXMoWzgsIDEwXSksIHRmLm9uZXMoWzgsIDFdKSwge1xuICAgKiAgIGJhdGNoU2l6ZTogNCxcbiAgICogfSk7XG4gICAqIHJlc3VsdC5wcmludCgpO1xuICAgKiBgYGBcbiAgICpcbiAgICogQHBhcmFtIHggYHRmLlRlbnNvcmAgb2YgdGVzdCBkYXRhLCBvciBhbiBgQXJyYXlgIG9mIGB0Zi5UZW5zb3JgcyBpZiB0aGVcbiAgICogbW9kZWwgaGFzIG11bHRpcGxlIGlucHV0cy5cbiAgICogQHBhcmFtIHkgYHRmLlRlbnNvcmAgb2YgdGFyZ2V0IGRhdGEsIG9yIGFuIGBBcnJheWAgb2YgYHRmLlRlbnNvcmBzIGlmIHRoZVxuICAgKiBtb2RlbCBoYXMgbXVsdGlwbGUgb3V0cHV0cy5cbiAgICogQHBhcmFtIGFyZ3MgQSBgTW9kZWxFdmFsdWF0ZUNvbmZpZ2AsIGNvbnRhaW5pbmcgb3B0aW9uYWwgZmllbGRzLlxuICAgKlxuICAgKiBAcmV0dXJuIGBTY2FsYXJgIHRlc3QgbG9zcyAoaWYgdGhlIG1vZGVsIGhhcyBhIHNpbmdsZSBvdXRwdXQgYW5kIG5vXG4gICAqICAgbWV0cmljcykgb3IgYEFycmF5YCBvZiBgU2NhbGFyYHMgKGlmIHRoZSBtb2RlbCBoYXMgbXVsdGlwbGUgb3V0cHV0c1xuICAgKiAgIGFuZC9vciBtZXRyaWNzKS4gVGhlIGF0dHJpYnV0ZSBgbW9kZWwubWV0cmljc05hbWVzYFxuICAgKiAgIHdpbGwgZ2l2ZSB5b3UgdGhlIGRpc3BsYXkgbGFiZWxzIGZvciB0aGUgc2NhbGFyIG91dHB1dHMuXG4gICAqXG4gICAqIEBkb2Mge2hlYWRpbmc6ICdNb2RlbHMnLCBzdWJoZWFkaW5nOiAnQ2xhc3Nlcyd9XG4gICAqL1xuICBldmFsdWF0ZShcbiAgICAgIHg6IFRlbnNvcnxUZW5zb3JbXSwgeTogVGVuc29yfFRlbnNvcltdLFxuICAgICAgYXJnczogTW9kZWxFdmFsdWF0ZUFyZ3MgPSB7fSk6IFNjYWxhcnxTY2FsYXJbXSB7XG4gICAgaWYgKCF0aGlzLmJ1aWx0KSB7XG4gICAgICB0aHJvdyBuZXcgUnVudGltZUVycm9yKFxuICAgICAgICAgICdUaGUgbW9kZWwgbmVlZHMgdG8gYmUgY29tcGlsZWQgYmVmb3JlIGJlaW5nIHVzZWQuJyk7XG4gICAgfVxuICAgIHJldHVybiB0aGlzLm1vZGVsLmV2YWx1YXRlKHgsIHksIGFyZ3MpO1xuICB9XG5cbiAgLy8gVE9ETyhjYWlzKTogQWRkIGNvZGUgc25pcHBldCBiZWxvdyBvbmNlIHJlYWwgZGF0YXNldCBvYmplY3RzIGFyZVxuICAvLyAgIGF2YWlsYWJsZS5cbiAgLyoqXG4gICAqIEV2YWx1YXRlIG1vZGVsIHVzaW5nIGEgZGF0YXNldCBvYmplY3QuXG4gICAqXG4gICAqIE5vdGU6IFVubGlrZSBgZXZhbHVhdGUoKWAsIHRoaXMgbWV0aG9kIGlzIGFzeW5jaHJvbm91cyAoYGFzeW5jYCkuXG4gICAqXG4gICAqIEBwYXJhbSBkYXRhc2V0IEEgZGF0YXNldCBvYmplY3QuIEl0cyBgaXRlcmF0b3IoKWAgbWV0aG9kIGlzIGV4cGVjdGVkXG4gICAqICAgdG8gZ2VuZXJhdGUgYSBkYXRhc2V0IGl0ZXJhdG9yIG9iamVjdCwgdGhlIGBuZXh0KClgIG1ldGhvZCBvZiB3aGljaFxuICAgKiAgIGlzIGV4cGVjdGVkIHRvIHByb2R1Y2UgZGF0YSBiYXRjaGVzIGZvciBldmFsdWF0aW9uLiBUaGUgcmV0dXJuIHZhbHVlXG4gICAqICAgb2YgdGhlIGBuZXh0KClgIGNhbGwgb3VnaHQgdG8gY29udGFpbiBhIGJvb2xlYW4gYGRvbmVgIGZpZWxkIGFuZCBhXG4gICAqICAgYHZhbHVlYCBmaWVsZC4gVGhlIGB2YWx1ZWAgZmllbGQgaXMgZXhwZWN0ZWQgdG8gYmUgYW4gYXJyYXkgb2YgdHdvXG4gICAqICAgYHRmLlRlbnNvcmBzIG9yIGFuIGFycmF5IG9mIHR3byBuZXN0ZWQgYHRmLlRlbnNvcmAgc3RydWN0dXJlcy4gVGhlIGZvcm1lclxuICAgKiAgIGNhc2UgaXMgZm9yIG1vZGVscyB3aXRoIGV4YWN0bHkgb25lIGlucHV0IGFuZCBvbmUgb3V0cHV0IChlLmcuXG4gICAqICAgYSBzZXF1ZW50aWFsIG1vZGVsKS4gVGhlIGxhdHRlciBjYXNlIGlzIGZvciBtb2RlbHMgd2l0aCBtdWx0aXBsZVxuICAgKiAgIGlucHV0cyBhbmQvb3IgbXVsdGlwbGUgb3V0cHV0cy4gT2YgdGhlIHR3byBpdGVtcyBpbiB0aGUgYXJyYXksIHRoZVxuICAgKiAgIGZpcnN0IGlzIHRoZSBpbnB1dCBmZWF0dXJlKHMpIGFuZCB0aGUgc2Vjb25kIGlzIHRoZSBvdXRwdXQgdGFyZ2V0KHMpLlxuICAgKiBAcGFyYW0gYXJncyBBIGNvbmZpZ3VyYXRpb24gb2JqZWN0IGZvciB0aGUgZGF0YXNldC1iYXNlZCBldmFsdWF0aW9uLlxuICAgKiBAcmV0dXJucyBMb3NzIGFuZCBtZXRyaWMgdmFsdWVzIGFzIGFuIEFycmF5IG9mIGBTY2FsYXJgIG9iamVjdHMuXG4gICAqXG4gICAqIEBkb2Mge2hlYWRpbmc6ICdNb2RlbHMnLCBzdWJoZWFkaW5nOiAnQ2xhc3Nlcyd9XG4gICAqL1xuICBhc3luYyBldmFsdWF0ZURhdGFzZXQoZGF0YXNldDogRGF0YXNldDx7fT4sIGFyZ3M6IE1vZGVsRXZhbHVhdGVEYXRhc2V0QXJncyk6XG4gICAgICBQcm9taXNlPFNjYWxhcnxTY2FsYXJbXT4ge1xuICAgIGlmICghdGhpcy5idWlsdCkge1xuICAgICAgdGhyb3cgbmV3IFJ1bnRpbWVFcnJvcihcbiAgICAgICAgICAnVGhlIG1vZGVsIG5lZWRzIHRvIGJlIGNvbXBpbGVkIGJlZm9yZSBiZWluZyB1c2VkLicpO1xuICAgIH1cbiAgICByZXR1cm4gdGhpcy5tb2RlbC5ldmFsdWF0ZURhdGFzZXQoZGF0YXNldCwgYXJncyk7XG4gIH1cblxuICAvKipcbiAgICogR2VuZXJhdGVzIG91dHB1dCBwcmVkaWN0aW9ucyBmb3IgdGhlIGlucHV0IHNhbXBsZXMuXG4gICAqXG4gICAqIENvbXB1dGF0aW9uIGlzIGRvbmUgaW4gYmF0Y2hlcy5cbiAgICpcbiAgICogTm90ZTogdGhlIFwic3RlcFwiIG1vZGUgb2YgcHJlZGljdCgpIGlzIGN1cnJlbnRseSBub3Qgc3VwcG9ydGVkLlxuICAgKiAgIFRoaXMgaXMgYmVjYXVzZSB0aGUgVGVuc29yRmxvdy5qcyBjb3JlIGJhY2tlbmQgaXMgaW1wZXJhdGl2ZSBvbmx5LlxuICAgKlxuICAgKiBgYGBqc1xuICAgKiBjb25zdCBtb2RlbCA9IHRmLnNlcXVlbnRpYWwoe1xuICAgKiAgIGxheWVyczogW3RmLmxheWVycy5kZW5zZSh7dW5pdHM6IDEsIGlucHV0U2hhcGU6IFsxMF19KV1cbiAgICogfSk7XG4gICAqIG1vZGVsLnByZWRpY3QodGYub25lcyhbMiwgMTBdKSkucHJpbnQoKTtcbiAgICogYGBgXG4gICAqXG4gICAqIEBwYXJhbSB4IFRoZSBpbnB1dCBkYXRhLCBhcyBhIFRlbnNvciwgb3IgYW4gYEFycmF5YCBvZiBgdGYuVGVuc29yYHMgaWZcbiAgICogICB0aGUgbW9kZWwgaGFzIG11bHRpcGxlIGlucHV0cy5cbiAgICogQHBhcmFtIGNvbmlmZyBBIGBNb2RlbFByZWRpY3RDb25maWdgIG9iamVjdCBjb250YWluaW5nIG9wdGlvbmFsIGZpZWxkcy5cbiAgICpcbiAgICogQHJldHVybiBgdGYuVGVuc29yYChzKSBvZiBwcmVkaWN0aW9ucy5cbiAgICpcbiAgICogQGV4Y2VwdGlvbiBWYWx1ZUVycm9yIEluIGNhc2Ugb2YgbWlzbWF0Y2ggYmV0d2VlbiB0aGUgcHJvdmlkZWQgaW5wdXQgZGF0YVxuICAgKiAgIGFuZCB0aGUgbW9kZWwncyBleHBlY3RhdGlvbnMsIG9yIGluIGNhc2UgYSBzdGF0ZWZ1bCBtb2RlbCByZWNlaXZlcyBhXG4gICAqICAgbnVtYmVyIG9mIHNhbXBsZXMgdGhhdCBpcyBub3QgYSBtdWx0aXBsZSBvZiB0aGUgYmF0Y2ggc2l6ZS5cbiAgICpcbiAgICogQGRvYyB7aGVhZGluZzogJ01vZGVscycsIHN1YmhlYWRpbmc6ICdDbGFzc2VzJ31cbiAgICovXG4gIHByZWRpY3QoeDogVGVuc29yfFRlbnNvcltdLCBhcmdzOiBNb2RlbFByZWRpY3RBcmdzID0ge30pOiBUZW5zb3J8VGVuc29yW10ge1xuICAgIGlmICh0aGlzLm1vZGVsID09IG51bGwpIHtcbiAgICAgIHRoaXMuYnVpbGQoKTtcbiAgICB9XG4gICAgcmV0dXJuIHRoaXMubW9kZWwucHJlZGljdCh4LCBhcmdzKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBSZXR1cm5zIHByZWRpY3Rpb25zIGZvciBhIHNpbmdsZSBiYXRjaCBvZiBzYW1wbGVzLlxuICAgKlxuICAgKiBAcGFyYW0geDogSW5wdXQgc2FtcGxlcywgYXMgYSBUZW5zb3IsIG9yIGxpc3Qgb2YgVGVuc29ycyAoaWYgdGhlIG1vZGVsXG4gICAqICAgaGFzIG11bHRpcGxlIGlucHV0cykuXG4gICAqIEByZXR1cm4gVGVuc29yKHMpIG9mIHByZWRpY3Rpb25zXG4gICAqL1xuICBwcmVkaWN0T25CYXRjaCh4OiBUZW5zb3IpOiBUZW5zb3J8VGVuc29yW10ge1xuICAgIGlmICh0aGlzLm1vZGVsID09IG51bGwpIHtcbiAgICAgIHRoaXMuYnVpbGQoKTtcbiAgICB9XG4gICAgcmV0dXJuIHRoaXMubW9kZWwucHJlZGljdE9uQmF0Y2goeCk7XG4gIH1cblxuICAvKipcbiAgICogU2VlIGBMYXllcnNNb2RlbC5jb21waWxlYC5cbiAgICpcbiAgICogQHBhcmFtIGFyZ3NcbiAgICovXG4gIGNvbXBpbGUoYXJnczogTW9kZWxDb21waWxlQXJncyk6IHZvaWQge1xuICAgIHRoaXMuYnVpbGQoKTtcbiAgICB0aGlzLm1vZGVsLmNvbXBpbGUoYXJncyk7XG4gICAgdGhpcy5vcHRpbWl6ZXJfID0gdGhpcy5tb2RlbC5vcHRpbWl6ZXI7XG4gICAgLy8gdHNsaW50OmRpc2FibGUtbmV4dC1saW5lOm5vLWFueVxuICAgIHRoaXMuaXNPcHRpbWl6ZXJPd25lZCA9ICh0aGlzLm1vZGVsIGFzIGFueSkuaXNPcHRpbWl6ZXJPd25lZDtcbiAgICB0aGlzLmxvc3MgPSB0aGlzLm1vZGVsLmxvc3M7XG4gICAgdGhpcy5tZXRyaWNzID0gdGhpcy5tb2RlbC5tZXRyaWNzO1xuICAgIC8vIFRPRE8oY2Fpcyk6IEFkZCB0aGlzLmxvc3NXZWlnaHRzLCB0aGlzLnNhbXBsZVdlaWdodE1vZGUsXG4gICAgLy8gICB0aGlzLndlaWdodGVkTWV0cmljcywgdGhpcy50YXJnZXRzLlxuICAgIHRoaXMubWV0cmljc1RlbnNvcnMgPSB0aGlzLm1vZGVsLm1ldHJpY3NUZW5zb3JzO1xuICAgIHRoaXMubWV0cmljc05hbWVzID0gdGhpcy5tb2RlbC5tZXRyaWNzTmFtZXM7XG4gICAgLy8gVE9ETyhjYWlzKTogQWRkIHNhbXBsZVdlaWdodHMuXG4gIH1cblxuICBnZXQgb3B0aW1pemVyKCk6IE9wdGltaXplciB7XG4gICAgcmV0dXJuIHRoaXMubW9kZWwgPT0gbnVsbCA/IHVuZGVmaW5lZCA6IHRoaXMubW9kZWwub3B0aW1pemVyO1xuICB9XG5cbiAgc2V0IG9wdGltaXplcihvcHRpbWl6ZXI6IE9wdGltaXplcikge1xuICAgIHRoaXMubW9kZWwub3B0aW1pemVyID0gb3B0aW1pemVyO1xuICB9XG5cbiAgLyoqXG4gICAqIFRyYWlucyB0aGUgbW9kZWwgZm9yIGEgZml4ZWQgbnVtYmVyIG9mIGVwb2NocyAoaXRlcmF0aW9ucyBvbiBhIGRhdGFzZXQpLlxuICAgKlxuICAgKiBgYGBqc1xuICAgKiBjb25zdCBtb2RlbCA9IHRmLnNlcXVlbnRpYWwoe1xuICAgKiAgIGxheWVyczogW3RmLmxheWVycy5kZW5zZSh7dW5pdHM6IDEsIGlucHV0U2hhcGU6IFsxMF19KV1cbiAgICogfSk7XG4gICAqIG1vZGVsLmNvbXBpbGUoe29wdGltaXplcjogJ3NnZCcsIGxvc3M6ICdtZWFuU3F1YXJlZEVycm9yJ30pO1xuICAgKiBjb25zdCBoaXN0b3J5ID0gYXdhaXQgbW9kZWwuZml0KHRmLm9uZXMoWzgsIDEwXSksIHRmLm9uZXMoWzgsIDFdKSwge1xuICAgKiAgIGJhdGNoU2l6ZTogNCxcbiAgICogICBlcG9jaHM6IDNcbiAgICogfSk7XG4gICAqIGNvbnNvbGUubG9nKGhpc3RvcnkuaGlzdG9yeS5sb3NzWzBdKTtcbiAgICogYGBgXG4gICAqXG4gICAqIEBwYXJhbSB4IGB0Zi5UZW5zb3JgIG9mIHRyYWluaW5nIGRhdGEsIG9yIGFuIGFycmF5IG9mIGB0Zi5UZW5zb3JgcyBpZiB0aGVcbiAgICogbW9kZWwgaGFzIG11bHRpcGxlIGlucHV0cy4gSWYgYWxsIGlucHV0cyBpbiB0aGUgbW9kZWwgYXJlIG5hbWVkLCB5b3UgY2FuXG4gICAqIGFsc28gcGFzcyBhIGRpY3Rpb25hcnkgbWFwcGluZyBpbnB1dCBuYW1lcyB0byBgdGYuVGVuc29yYHMuXG4gICAqIEBwYXJhbSB5IGB0Zi5UZW5zb3JgIG9mIHRhcmdldCAobGFiZWwpIGRhdGEsIG9yIGFuIGFycmF5IG9mIGB0Zi5UZW5zb3JgcyBpZlxuICAgKiB0aGUgbW9kZWwgaGFzIG11bHRpcGxlIG91dHB1dHMuIElmIGFsbCBvdXRwdXRzIGluIHRoZSBtb2RlbCBhcmUgbmFtZWQsIHlvdVxuICAgKiAgY2FuIGFsc28gcGFzcyBhIGRpY3Rpb25hcnkgbWFwcGluZyBvdXRwdXQgbmFtZXMgdG8gYHRmLlRlbnNvcmBzLlxuICAgKiBAcGFyYW0gYXJncyAgQSBgTW9kZWxGaXRDb25maWdgLCBjb250YWluaW5nIG9wdGlvbmFsIGZpZWxkcy5cbiAgICpcbiAgICogQHJldHVybiBBIGBIaXN0b3J5YCBpbnN0YW5jZS4gSXRzIGBoaXN0b3J5YCBhdHRyaWJ1dGUgY29udGFpbnMgYWxsXG4gICAqICAgaW5mb3JtYXRpb24gY29sbGVjdGVkIGR1cmluZyB0cmFpbmluZy5cbiAgICpcbiAgICogQGV4Y2VwdGlvbiBWYWx1ZUVycm9yIEluIGNhc2Ugb2YgbWlzbWF0Y2ggYmV0d2VlbiB0aGUgcHJvdmlkZWQgaW5wdXQgZGF0YVxuICAgKiAgIGFuZCB3aGF0IHRoZSBtb2RlbCBleHBlY3RzLlxuICAgKlxuICAgKiBAZG9jIHtoZWFkaW5nOiAnTW9kZWxzJywgc3ViaGVhZGluZzogJ0NsYXNzZXMnfVxuICAgKi9cbiAgYXN5bmMgZml0KFxuICAgICAgeDogVGVuc29yfFRlbnNvcltdfHtbaW5wdXROYW1lOiBzdHJpbmddOiBUZW5zb3J9LFxuICAgICAgeTogVGVuc29yfFRlbnNvcltdfHtbaW5wdXROYW1lOiBzdHJpbmddOiBUZW5zb3J9LFxuICAgICAgYXJnczogTW9kZWxGaXRBcmdzID0ge30pOiBQcm9taXNlPEhpc3Rvcnk+IHtcbiAgICBpZiAoIXRoaXMuYnVpbHQpIHtcbiAgICAgIHRocm93IG5ldyBSdW50aW1lRXJyb3IoXG4gICAgICAgICAgJ1RoZSBtb2RlbCBuZWVkcyB0byBiZSBjb21waWxlZCBiZWZvcmUgJyArXG4gICAgICAgICAgJ2JlaW5nIHVzZWQuJyk7XG4gICAgfVxuICAgIHJldHVybiB0aGlzLm1vZGVsLmZpdCh4LCB5LCBhcmdzKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBUcmFpbnMgdGhlIG1vZGVsIHVzaW5nIGEgZGF0YXNldCBvYmplY3QuXG4gICAqXG4gICAqIGBgYGpzXG4gICAqIGNvbnN0IHhBcnJheSA9IFtcbiAgICogICBbMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMV0sXG4gICAqICAgWzEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDFdLFxuICAgKiAgIFsxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxXSxcbiAgICogICBbMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMV0sXG4gICAqIF07XG4gICAqIGNvbnN0IHlBcnJheSA9IFsxLCAxLCAxLCAxXTtcbiAgICogLy8gQ3JlYXRlIGEgZGF0YXNldCBmcm9tIHRoZSBKYXZhU2NyaXB0IGFycmF5LlxuICAgKiBjb25zdCB4RGF0YXNldCA9IHRmLmRhdGEuYXJyYXkoeEFycmF5KTtcbiAgICogY29uc3QgeURhdGFzZXQgPSB0Zi5kYXRhLmFycmF5KHlBcnJheSk7XG4gICAqIC8vIFppcCBjb21iaW5lcyB0aGUgYHhgIGFuZCBgeWAgRGF0YXNldHMgaW50byBhIHNpbmdsZSBEYXRhc2V0LCB0aGVcbiAgICogLy8gaXRlcmF0b3Igb2Ygd2hpY2ggd2lsbCByZXR1cm4gYW4gb2JqZWN0IGNvbnRhaW5pbmcgb2YgdHdvIHRlbnNvcnMsXG4gICAqIC8vIGNvcnJlc3BvbmRpbmcgdG8gYHhgIGFuZCBgeWAuICBUaGUgY2FsbCB0byBgYmF0Y2goNClgIHdpbGwgYnVuZGxlXG4gICAqIC8vIGZvdXIgc3VjaCBzYW1wbGVzIGludG8gYSBzaW5nbGUgb2JqZWN0LCB3aXRoIHRoZSBzYW1lIGtleXMgbm93IHBvaW50aW5nXG4gICAqIC8vIHRvIHRlbnNvcnMgdGhhdCBob2xkIDQgZXhhbXBsZXMsIG9yZ2FuaXplZCBhbG9uZyB0aGUgYmF0Y2ggZGltZW5zaW9uLlxuICAgKiAvLyBUaGUgY2FsbCB0byBgc2h1ZmZsZSg0KWAgY2F1c2VzIGVhY2ggaXRlcmF0aW9uIHRocm91Z2ggdGhlIGRhdGFzZXQgdG9cbiAgICogLy8gaGFwcGVuIGluIGEgZGlmZmVyZW50IG9yZGVyLiAgVGhlIHNpemUgb2YgdGhlIHNodWZmbGUgd2luZG93IGlzIDQuXG4gICAqIGNvbnN0IHh5RGF0YXNldCA9IHRmLmRhdGEuemlwKHt4czogeERhdGFzZXQsIHlzOiB5RGF0YXNldH0pXG4gICAqICAgICAuYmF0Y2goNClcbiAgICogICAgIC5zaHVmZmxlKDQpO1xuICAgKiBjb25zdCBtb2RlbCA9IHRmLnNlcXVlbnRpYWwoe1xuICAgKiAgIGxheWVyczogW3RmLmxheWVycy5kZW5zZSh7dW5pdHM6IDEsIGlucHV0U2hhcGU6IFs5XX0pXVxuICAgKiB9KTtcbiAgICogbW9kZWwuY29tcGlsZSh7b3B0aW1pemVyOiAnc2dkJywgbG9zczogJ21lYW5TcXVhcmVkRXJyb3InfSk7XG4gICAqIGNvbnN0IGhpc3RvcnkgPSBhd2FpdCBtb2RlbC5maXREYXRhc2V0KHh5RGF0YXNldCwge1xuICAgKiAgIGVwb2NoczogNCxcbiAgICogICBjYWxsYmFja3M6IHtvbkVwb2NoRW5kOiAoZXBvY2gsIGxvZ3MpID0+IGNvbnNvbGUubG9nKGxvZ3MubG9zcyl9XG4gICAqIH0pO1xuICAgKiBgYGBcbiAgICpcbiAgICogQHBhcmFtIGRhdGFzZXQgQSBkYXRhc2V0IG9iamVjdC4gSXRzIGBpdGVyYXRvcigpYCBtZXRob2QgaXMgZXhwZWN0ZWQgdG9cbiAgICogICBnZW5lcmF0ZSBhIGRhdGFzZXQgaXRlcmF0b3Igb2JqZWN0LCB0aGUgYG5leHQoKWAgbWV0aG9kIG9mIHdoaWNoIGlzXG4gICAqICAgZXhwZWN0ZWQgdG8gcHJvZHVjZSBkYXRhIGJhdGNoZXMgZm9yIGV2YWx1YXRpb24uIFRoZSByZXR1cm4gdmFsdWUgb2YgdGhlXG4gICAqICAgYG5leHQoKWAgY2FsbCBvdWdodCB0byBjb250YWluIGEgYm9vbGVhbiBgZG9uZWAgZmllbGQgYW5kIGEgYHZhbHVlYFxuICAgKiAgIGZpZWxkLlxuICAgKlxuICAgKiAgIFRoZSBgdmFsdWVgIGZpZWxkIGlzIGV4cGVjdGVkIHRvIGJlIGFuIG9iamVjdCBvZiB3aXRoIGZpZWxkc1xuICAgKiAgIGB4c2AgYW5kIGB5c2AsIHdoaWNoIHBvaW50IHRvIHRoZSBmZWF0dXJlIHRlbnNvciBhbmQgdGhlIHRhcmdldCB0ZW5zb3IsXG4gICAqICAgcmVzcGVjdGl2ZWx5LiBUaGlzIGNhc2UgaXMgZm9yIG1vZGVscyB3aXRoIGV4YWN0bHkgb25lIGlucHV0IGFuZCBvbmVcbiAgICogICBvdXRwdXQgKGUuZy4gYSBzZXF1ZW50aWFsIG1vZGVsKS4gRm9yIGV4YW1wbGU6XG4gICAqICAgYGBganNcbiAgICogICB7dmFsdWU6IHt4czogeHNUZW5zb3IsIHlzOiB5c1RlbnNvcn0sIGRvbmU6IGZhbHNlfVxuICAgKiAgIGBgYFxuICAgKlxuICAgKiAgIElmIHRoZSBtb2RlbCBoYXMgbXVsdGlwbGUgaW5wdXRzLCB0aGUgYHhzYCBmaWVsZCBvZiBgdmFsdWVgIHNob3VsZFxuICAgKiAgIGJlIGFuIG9iamVjdCBtYXBwaW5nIGlucHV0IG5hbWVzIHRvIHRoZWlyIHJlc3BlY3RpdmUgZmVhdHVyZSB0ZW5zb3JzLlxuICAgKiAgIEZvciBleGFtcGxlOlxuICAgKiAgIGBgYGpzXG4gICAqICAge1xuICAgKiAgICAgdmFsdWU6IHtcbiAgICogICAgICAgeHM6IHtcbiAgICogICAgICAgICBpbnB1dF8xOiB4c1RlbnNvcjEsXG4gICAqICAgICAgICAgaW5wdXRfMjogeHNUZW5zb3IyXG4gICAqICAgICAgIH0sXG4gICAqICAgICAgIHlzOiB5c1RlbnNvclxuICAgKiAgICAgfSxcbiAgICogICAgIGRvbmU6IGZhbHNlXG4gICAqICAgfVxuICAgKiAgIGBgYFxuICAgKiAgIElmIHRoZSBtb2RlbCBoYXMgbXVsdGlwbGUgb3V0cHV0cywgdGhlIGB5c2AgZmllbGQgb2YgYHZhbHVlYCBzaG91bGRcbiAgICogICBiZSBhbiBvYmplY3QgbWFwcGluZyBvdXRwdXQgbmFtZXMgdG8gdGhlaXIgcmVzcGVjdGl2ZSB0YXJnZXQgdGVuc29ycy5cbiAgICogICBGb3IgZXhhbXBsZTpcbiAgICogICBgYGBqc1xuICAgKiAgIHtcbiAgICogICAgIHZhbHVlOiB7XG4gICAqICAgICAgIHhzOiB4c1RlbnNvcixcbiAgICogICAgICAgeXM6IHtcbiAgICogICAgICAgICBvdXRwdXRfMTogeXNUZW5zb3IxLFxuICAgKiAgICAgICAgIG91dHB1dF8yOiB5c1RlbnNvcjJcbiAgICogICAgICAgfSxcbiAgICogICAgIH0sXG4gICAqICAgICBkb25lOiBmYWxzZVxuICAgKiAgIH1cbiAgICogICBgYGBcbiAgICogQHBhcmFtIGFyZ3MgQSBgTW9kZWxGaXREYXRhc2V0QXJnc2AsIGNvbnRhaW5pbmcgb3B0aW9uYWwgZmllbGRzLlxuICAgKlxuICAgKiBAcmV0dXJuIEEgYEhpc3RvcnlgIGluc3RhbmNlLiBJdHMgYGhpc3RvcnlgIGF0dHJpYnV0ZSBjb250YWlucyBhbGxcbiAgICogICBpbmZvcm1hdGlvbiBjb2xsZWN0ZWQgZHVyaW5nIHRyYWluaW5nLlxuICAgKlxuICAgKiBAZG9jIHtoZWFkaW5nOiAnTW9kZWxzJywgc3ViaGVhZGluZzogJ0NsYXNzZXMnLCBpZ25vcmVDSTogdHJ1ZX1cbiAgICovXG4gIGFzeW5jIGZpdERhdGFzZXQ8VD4oZGF0YXNldDogRGF0YXNldDxUPiwgYXJnczogTW9kZWxGaXREYXRhc2V0QXJnczxUPik6XG4gICAgICBQcm9taXNlPEhpc3Rvcnk+IHtcbiAgICBpZiAoIXRoaXMuYnVpbHQpIHtcbiAgICAgIHRocm93IG5ldyBSdW50aW1lRXJyb3IoXG4gICAgICAgICAgJ1RoZSBtb2RlbCBuZWVkcyB0byBiZSBjb21waWxlZCBiZWZvcmUgJyArXG4gICAgICAgICAgJ2JlaW5nIHVzZWQuJyk7XG4gICAgfVxuICAgIHJldHVybiB0aGlzLm1vZGVsLmZpdERhdGFzZXQoZGF0YXNldCwgYXJncyk7XG4gIH1cblxuICAvKipcbiAgICogUnVucyBhIHNpbmdsZSBncmFkaWVudCB1cGRhdGUgb24gYSBzaW5nbGUgYmF0Y2ggb2YgZGF0YS5cbiAgICpcbiAgICogVGhpcyBtZXRob2QgZGlmZmVycyBmcm9tIGBmaXQoKWAgYW5kIGBmaXREYXRhc2V0KClgIGluIHRoZSBmb2xsb3dpbmdcbiAgICogcmVnYXJkczpcbiAgICogICAtIEl0IG9wZXJhdGVzIG9uIGV4YWN0bHkgb25lIGJhdGNoIG9mIGRhdGEuXG4gICAqICAgLSBJdCByZXR1cm5zIG9ubHkgdGhlIGxvc3MgYW5kIG1ldHJpYyB2YWx1ZXMsIGluc3RlYWQgb2ZcbiAgICogICAgIHJldHVybmluZyB0aGUgYmF0Y2gtYnktYmF0Y2ggbG9zcyBhbmQgbWV0cmljIHZhbHVlcy5cbiAgICogICAtIEl0IGRvZXNuJ3Qgc3VwcG9ydCBmaW5lLWdyYWluZWQgb3B0aW9ucyBzdWNoIGFzIHZlcmJvc2l0eSBhbmRcbiAgICogICAgIGNhbGxiYWNrcy5cbiAgICpcbiAgICogQHBhcmFtIHggSW5wdXQgZGF0YS4gSXQgY291bGQgYmUgb25lIG9mIHRoZSBmb2xsb3dpbmc6XG4gICAqICAgLSBBIGB0Zi5UZW5zb3JgLCBvciBhbiBBcnJheSBvZiBgdGYuVGVuc29yYHMgKGluIGNhc2UgdGhlIG1vZGVsIGhhc1xuICAgKiAgICAgbXVsdGlwbGUgaW5wdXRzKS5cbiAgICogICAtIEFuIE9iamVjdCBtYXBwaW5nIGlucHV0IG5hbWVzIHRvIGNvcnJlc3BvbmRpbmcgYHRmLlRlbnNvcmAgKGlmIHRoZVxuICAgKiAgICAgbW9kZWwgaGFzIG5hbWVkIGlucHV0cykuXG4gICAqIEBwYXJhbSB5IFRhcmdldCBkYXRhLiBJdCBjb3VsZCBiZSBlaXRoZXIgYSBgdGYuVGVuc29yYCBvciBtdWx0aXBsZVxuICAgKiAgIGB0Zi5UZW5zb3Jgcy4gSXQgc2hvdWxkIGJlIGNvbnNpc3RlbnQgd2l0aCBgeGAuXG4gICAqIEByZXR1cm5zIFRyYWluaW5nIGxvc3Mgb3IgbG9zc2VzIChpbiBjYXNlIHRoZSBtb2RlbCBoYXNcbiAgICogICBtdWx0aXBsZSBvdXRwdXRzKSwgYWxvbmcgd2l0aCBtZXRyaWNzIChpZiBhbnkpLCBhcyBudW1iZXJzLlxuICAgKlxuICAgKiBAZG9jIHtoZWFkaW5nOiAnTW9kZWxzJywgc3ViaGVhZGluZzogJ0NsYXNzZXMnfVxuICAgKi9cbiAgYXN5bmMgdHJhaW5PbkJhdGNoKFxuICAgICAgeDogVGVuc29yfFRlbnNvcltdfHtbaW5wdXROYW1lOiBzdHJpbmddOiBUZW5zb3J9LFxuICAgICAgeTogVGVuc29yfFRlbnNvcltdfFxuICAgICAge1tpbnB1dE5hbWU6IHN0cmluZ106IFRlbnNvcn0pOiBQcm9taXNlPG51bWJlcnxudW1iZXJbXT4ge1xuICAgIHJldHVybiB0aGlzLm1vZGVsLnRyYWluT25CYXRjaCh4LCB5KTtcbiAgfVxuXG4gIC8qIFNlZSBwYXJlbnQgY2xhc3MgZm9yIEpzRG9jICovXG4gIC8qKiBAbm9jb2xsYXBzZSAqL1xuICBzdGF0aWMgZnJvbUNvbmZpZzxUIGV4dGVuZHMgc2VyaWFsaXphdGlvbi5TZXJpYWxpemFibGU+KFxuICAgICAgY2xzOiBzZXJpYWxpemF0aW9uLlNlcmlhbGl6YWJsZUNvbnN0cnVjdG9yPFQ+LFxuICAgICAgY29uZmlnOiBzZXJpYWxpemF0aW9uLkNvbmZpZ0RpY3QsXG4gICAgICBjdXN0b21PYmplY3RzID0ge30gYXMgc2VyaWFsaXphdGlvbi5Db25maWdEaWN0LFxuICAgICAgZmFzdFdlaWdodEluaXQgPSBmYWxzZSk6IFQge1xuICAgIGxldCBjb25maWdBcnJheTogc2VyaWFsaXphdGlvbi5Db25maWdEaWN0QXJyYXk7XG4gICAgbGV0IGV4dHJhTW9kZWxDb25maWc6IHNlcmlhbGl6YXRpb24uQ29uZmlnRGljdCA9IHt9O1xuICAgIGlmIChjb25maWcgaW5zdGFuY2VvZiBBcnJheSkge1xuICAgICAgaWYgKCEoY29uZmlnWzBdLmNsYXNzTmFtZSAhPSBudWxsKSB8fFxuICAgICAgICAgIGNvbmZpZ1swXVsnY2xhc3NOYW1lJ10gPT09ICdNZXJnZScpIHtcbiAgICAgICAgdGhyb3cgbmV3IFZhbHVlRXJyb3IoJ0xlZ2FjeSBzZXJpYWxpemF0aW9uIGZvcm1hdCBub3Qgc3VwcG9ydGVkIHlldC4nKTtcbiAgICAgIH1cbiAgICAgIGNvbmZpZ0FycmF5ID0gY29uZmlnO1xuICAgIH0gZWxzZSB7XG4gICAgICB1dGlsLmFzc2VydChcbiAgICAgICAgICBjb25maWdbJ2xheWVycyddICE9IG51bGwsXG4gICAgICAgICAgKCkgPT5cbiAgICAgICAgICAgICAgYFdoZW4gdGhlIGNvbmZpZyBkYXRhIGZvciBhIFNlcXVlbnRpYWwgbW9kZWwgaXMgbm90IGFuIEFycmF5LCBgICtcbiAgICAgICAgICAgICAgYGl0IG11c3QgYmUgYW4gT2JqZWN0IHRoYXQgY29udGFpbnMgdGhlICdsYXllcnMnIGZpZWxkLmApO1xuICAgICAgY29uZmlnQXJyYXkgPSBjb25maWdbJ2xheWVycyddIGFzIHNlcmlhbGl6YXRpb24uQ29uZmlnRGljdEFycmF5O1xuICAgICAgZGVsZXRlIGNvbmZpZ1snbGF5ZXJzJ107XG4gICAgICBleHRyYU1vZGVsQ29uZmlnID0gY29uZmlnO1xuICAgIH1cblxuICAgIGNvbnN0IG1vZGVsID0gbmV3IGNscyhleHRyYU1vZGVsQ29uZmlnKTtcbiAgICBpZiAoIShtb2RlbCBpbnN0YW5jZW9mIFNlcXVlbnRpYWwpKSB7XG4gICAgICB0aHJvdyBuZXcgTm90SW1wbGVtZW50ZWRFcnJvcihcbiAgICAgICAgICBgU2VxdWVudGlhbC5mcm9tQ29uZmlnIGNhbGxlZCBvbiBub24tU2VxdWVudGlhbCBpbnB1dDogJHttb2RlbH1gKTtcbiAgICB9XG4gICAgZm9yIChjb25zdCBjb25mIG9mIGNvbmZpZ0FycmF5KSB7XG4gICAgICBjb25zdCBjdXN0b21PYmplY3RzOiBzZXJpYWxpemF0aW9uLkNvbmZpZ0RpY3QgPSB1bmRlZmluZWQ7XG4gICAgICBjb25zdCBsYXllciA9IGRlc2VyaWFsaXplKFxuICAgICAgICAgICAgICAgICAgICAgICAgY29uZiBhcyBzZXJpYWxpemF0aW9uLkNvbmZpZ0RpY3QsIGN1c3RvbU9iamVjdHMsXG4gICAgICAgICAgICAgICAgICAgICAgICBmYXN0V2VpZ2h0SW5pdCkgYXMgTGF5ZXI7XG4gICAgICBpZiAoZmFzdFdlaWdodEluaXQpIHtcbiAgICAgICAgbGF5ZXIuc2V0RmFzdFdlaWdodEluaXREdXJpbmdCdWlsZCh0cnVlKTtcbiAgICAgIH1cbiAgICAgIG1vZGVsLmFkZChsYXllcik7XG4gICAgfVxuICAgIHJldHVybiBtb2RlbDtcbiAgfVxuXG4gIC8qKlxuICAgKiBTZXR0ZXIgdXNlZCBmb3IgZm9yY2Ugc3RvcHBpbmcgb2YgTGF5ZXJzTW9kZWwuZml0KCkgKGkuZS4sIHRyYWluaW5nKS5cbiAgICpcbiAgICogRXhhbXBsZTpcbiAgICpcbiAgICogYGBganNcbiAgICogY29uc3QgbW9kZWwgPSB0Zi5zZXF1ZW50aWFsKCk7XG4gICAqIG1vZGVsLmFkZCh0Zi5sYXllcnMuZGVuc2Uoe3VuaXRzOiAxLCBpbnB1dFNoYXBlOiBbMTBdfSkpO1xuICAgKiBtb2RlbC5jb21waWxlKHtsb3NzOiAnbWVhblNxdWFyZWRFcnJvcicsIG9wdGltaXplcjogJ3NnZCd9KTtcbiAgICogY29uc3QgeHMgPSB0Zi5vbmVzKFs4LCAxMF0pO1xuICAgKiBjb25zdCB5cyA9IHRmLnplcm9zKFs4LCAxXSk7XG4gICAqXG4gICAqIGNvbnN0IGhpc3RvcnkgPSBhd2FpdCBtb2RlbC5maXQoeHMsIHlzLCB7XG4gICAqICAgZXBvY2hzOiAxMCxcbiAgICogICBjYWxsYmFja3M6IHtcbiAgICogICAgIG9uRXBvY2hFbmQ6IGFzeW5jIChlcG9jaCwgbG9ncykgPT4ge1xuICAgKiAgICAgICBpZiAoZXBvY2ggPT09IDIpIHtcbiAgICogICAgICAgICBtb2RlbC5zdG9wVHJhaW5pbmcgPSB0cnVlO1xuICAgKiAgICAgICB9XG4gICAqICAgICB9XG4gICAqICAgfVxuICAgKiB9KTtcbiAgICpcbiAgICogLy8gVGhlcmUgc2hvdWxkIGJlIG9ubHkgMyB2YWx1ZXMgaW4gdGhlIGxvc3MgYXJyYXksIGluc3RlYWQgb2YgMTAgdmFsdWVzLFxuICAgKiAvLyBkdWUgdG8gdGhlIHN0b3BwaW5nIGFmdGVyIDMgZXBvY2hzLlxuICAgKiBjb25zb2xlLmxvZyhoaXN0b3J5Lmhpc3RvcnkubG9zcyk7XG4gICAqIGBgYFxuICAgKi9cbiAgc2V0IHN0b3BUcmFpbmluZyhzdG9wOiBib29sZWFuKSB7XG4gICAgLy8gVE9ETyhjYWlzKTogV2hlbiByZWZhY3RvcmluZyB0byByZW1vdmUgdGhlIGNvbXBvc2l0aW9uIHBhdHRlcm4gaGFwcGVucyxcbiAgICAvLyByZW1vdmUgdGhpcyBtZXRob2Qgb3ZlcnJpZGluZy5cbiAgICBpZiAodGhpcy5tb2RlbCA9PSBudWxsKSB7XG4gICAgICB0aHJvdyBuZXcgVmFsdWVFcnJvcihcbiAgICAgICAgICAnQ2Fubm90IHNldCB0aGUgc3RvcFRyYWluaW5nIHByb3BlcnR5IG9mIGEgc2VxdWVudGlhbCBtb2RlbCBiZWZvcmUgJyArXG4gICAgICAgICAgJ2l0IGlzIGNvbXBpbGVkLicpO1xuICAgIH1cbiAgICB0aGlzLm1vZGVsLnN0b3BUcmFpbmluZyA9IHN0b3A7XG4gIH1cblxuICBnZXQgc3RvcFRyYWluaW5nKCk6IGJvb2xlYW4ge1xuICAgIGlmICh0aGlzLm1vZGVsID09IG51bGwpIHtcbiAgICAgIHRocm93IG5ldyBWYWx1ZUVycm9yKFxuICAgICAgICAgICdDYW5ub3QgZ2V0IHRoZSBzdG9wVHJhaW5pbmcgcHJvcGVydHkgb2YgYSBzZXF1ZW50aWFsIG1vZGVsIGJlZm9yZSAnICtcbiAgICAgICAgICAnaXQgaXMgY29tcGlsZWQuJyk7XG4gICAgfVxuICAgIHJldHVybiB0aGlzLm1vZGVsLnN0b3BUcmFpbmluZztcbiAgfVxuXG4gIC8vIFRPRE8oY2Fpcyk6IE92ZXJyaWRlIGdldCB0cmFpbmFibGVXZWlnaHRzKCkgaGVyZVxuXG4gIC8vIHRzbGludDpkaXNhYmxlLW5leHQtbGluZTpuby1hbnlcbiAgZ2V0Q29uZmlnKCk6IGFueSB7XG4gICAgLy8gTk9URShjYWlzKTogV2Ugb3ZlcnJpZGUgdGhlIHJldHVybiB0eXBlIG9mIGdldENvbmZpZygpIHRvIGBhbnlgIGhlcmUsXG4gICAgLy8gICBiZWNhdXNlIHRoZSBgU2VxdWVudGlhbGAgY2xhc3MgaXMgYSBzcGVjaWFsIGNhc2UgYW1vbmcgYENvbnRhaW5lcmBcbiAgICAvLyAgIHN1YnR5cGVzIGluIHRoYXQgaXRzIGdldENvbmZpZygpIG1ldGhvZCByZXR1cm5zIGFuIEFycmF5IChub3QgYVxuICAgIC8vICAgZGljdCkuXG4gICAgY29uc3QgbGF5ZXJzOiBzZXJpYWxpemF0aW9uLkNvbmZpZ0RpY3RbXSA9IFtdO1xuICAgIGZvciAoY29uc3QgbGF5ZXIgb2YgdGhpcy5sYXllcnMpIHtcbiAgICAgIGNvbnN0IGRpY3Q6IHNlcmlhbGl6YXRpb24uQ29uZmlnRGljdCA9IHt9O1xuICAgICAgZGljdFsnY2xhc3NOYW1lJ10gPSBsYXllci5nZXRDbGFzc05hbWUoKTtcbiAgICAgIGRpY3RbJ2NvbmZpZyddID0gbGF5ZXIuZ2V0Q29uZmlnKCk7XG4gICAgICBsYXllcnMucHVzaChkaWN0KTtcbiAgICB9XG4gICAgcmV0dXJuIHtuYW1lOiB0aGlzLm5hbWUsIGxheWVyc307XG4gIH1cbn1cbnNlcmlhbGl6YXRpb24ucmVnaXN0ZXJDbGFzcyhTZXF1ZW50aWFsKTtcbiJdfQ==","/**\n * @license\n * Copyright 2018 Google LLC\n *\n * Use of this source code is governed by an MIT-style\n * license that can be found in the LICENSE file or at\n * https://opensource.org/licenses/MIT.\n * =============================================================================\n */\nimport { CallbackConstructorRegistry } from './base_callbacks';\nimport { Input, } from './engine/input_layer';\nimport { LayersModel } from './engine/training';\nimport { loadLayersModelInternal, Sequential } from './models';\n// TODO(cais): Add doc string to all the public static functions in this\n// class; include exectuable JavaScript code snippets where applicable\n// (b/74074458).\n// LayersModel and related factory methods.\n/**\n * A model is a data structure that consists of `Layers` and defines inputs\n * and outputs.\n *\n * The key difference between `tf.model` and `tf.sequential` is that\n * `tf.model` is more generic, supporting an arbitrary graph (without\n * cycles) of layers. `tf.sequential` is less generic and supports only a linear\n * stack of layers.\n *\n * When creating a `tf.LayersModel`, specify its input(s) and output(s). Layers\n * are used to wire input(s) to output(s).\n *\n * For example, the following code snippet defines a model consisting of\n * two `dense` layers, with 10 and 4 units, respectively.\n *\n * ```js\n * // Define input, which has a size of 5 (not including batch dimension).\n * const input = tf.input({shape: [5]});\n *\n * // First dense layer uses relu activation.\n * const denseLayer1 = tf.layers.dense({units: 10, activation: 'relu'});\n * // Second dense layer uses softmax activation.\n * const denseLayer2 = tf.layers.dense({units: 4, activation: 'softmax'});\n *\n * // Obtain the output symbolic tensor by applying the layers on the input.\n * const output = denseLayer2.apply(denseLayer1.apply(input));\n *\n * // Create the model based on the inputs.\n * const model = tf.model({inputs: input, outputs: output});\n *\n * // The model can be used for training, evaluation and prediction.\n * // For example, the following line runs prediction with the model on\n * // some fake data.\n * model.predict(tf.ones([2, 5])).print();\n * ```\n * See also:\n * `tf.sequential`, `tf.loadLayersModel`.\n *\n * @doc {heading: 'Models', subheading: 'Creation'}\n */\nexport function model(args) {\n return new LayersModel(args);\n}\n/**\n * Creates a `tf.Sequential` model. A sequential model is any model where the\n * outputs of one layer are the inputs to the next layer, i.e. the model\n * topology is a simple 'stack' of layers, with no branching or skipping.\n *\n * This means that the first layer passed to a `tf.Sequential` model should have\n * a defined input shape. What that means is that it should have received an\n * `inputShape` or `batchInputShape` argument, or for some type of layers\n * (recurrent, Dense...) an `inputDim` argument.\n *\n * The key difference between `tf.model` and `tf.sequential` is that\n * `tf.sequential` is less generic, supporting only a linear stack of layers.\n * `tf.model` is more generic and supports an arbitrary graph (without\n * cycles) of layers.\n *\n * Examples:\n *\n * ```js\n * const model = tf.sequential();\n *\n * // First layer must have an input shape defined.\n * model.add(tf.layers.dense({units: 32, inputShape: [50]}));\n * // Afterwards, TF.js does automatic shape inference.\n * model.add(tf.layers.dense({units: 4}));\n *\n * // Inspect the inferred shape of the model's output, which equals\n * // `[null, 4]`. The 1st dimension is the undetermined batch dimension; the\n * // 2nd is the output size of the model's last layer.\n * console.log(JSON.stringify(model.outputs[0].shape));\n * ```\n *\n * It is also possible to specify a batch size (with potentially undetermined\n * batch dimension, denoted by \"null\") for the first layer using the\n * `batchInputShape` key. The following example is equivalent to the above:\n *\n * ```js\n * const model = tf.sequential();\n *\n * // First layer must have a defined input shape\n * model.add(tf.layers.dense({units: 32, batchInputShape: [null, 50]}));\n * // Afterwards, TF.js does automatic shape inference.\n * model.add(tf.layers.dense({units: 4}));\n *\n * // Inspect the inferred shape of the model's output.\n * console.log(JSON.stringify(model.outputs[0].shape));\n * ```\n *\n * You can also use an `Array` of already-constructed `Layer`s to create\n * a `tf.Sequential` model:\n *\n * ```js\n * const model = tf.sequential({\n * layers: [tf.layers.dense({units: 32, inputShape: [50]}),\n * tf.layers.dense({units: 4})]\n * });\n * console.log(JSON.stringify(model.outputs[0].shape));\n * ```\n *\n * @doc {heading: 'Models', subheading: 'Creation'}\n */\nexport function sequential(config) {\n return new Sequential(config);\n}\n/**\n * Load a model composed of Layer objects, including its topology and optionally\n * weights. See the Tutorial named \"How to import a Keras Model\" for usage\n * examples.\n *\n * This method is applicable to:\n *\n * 1. Models created with the `tf.layers.*`, `tf.sequential`, and\n * `tf.model` APIs of TensorFlow.js and later saved with the\n * `tf.LayersModel.save` method.\n * 2. Models converted from Keras or TensorFlow tf.keras using the\n * [tensorflowjs_converter](https://github.com/tensorflow/tfjs/tree/master/tfjs-converter).\n *\n * This mode is *not* applicable to TensorFlow `SavedModel`s or their converted\n * forms. For those models, use `tf.loadGraphModel`.\n *\n * Example 1. Load a model from an HTTP server.\n *\n * ```js\n * const model = await tf.loadLayersModel(\n * 'https://storage.googleapis.com/tfjs-models/tfjs/iris_v1/model.json');\n * model.summary();\n * ```\n *\n * Example 2: Save `model`'s topology and weights to browser [local\n * storage](https://developer.mozilla.org/en-US/docs/Web/API/Window/localStorage);\n * then load it back.\n *\n * ```js\n * const model = tf.sequential(\n * {layers: [tf.layers.dense({units: 1, inputShape: [3]})]});\n * console.log('Prediction from original model:');\n * model.predict(tf.ones([1, 3])).print();\n *\n * const saveResults = await model.save('localstorage://my-model-1');\n *\n * const loadedModel = await tf.loadLayersModel('localstorage://my-model-1');\n * console.log('Prediction from loaded model:');\n * loadedModel.predict(tf.ones([1, 3])).print();\n * ```\n *\n * Example 3. Saving `model`'s topology and weights to browser\n * [IndexedDB](https://developer.mozilla.org/en-US/docs/Web/API/IndexedDB_API);\n * then load it back.\n *\n * ```js\n * const model = tf.sequential(\n * {layers: [tf.layers.dense({units: 1, inputShape: [3]})]});\n * console.log('Prediction from original model:');\n * model.predict(tf.ones([1, 3])).print();\n *\n * const saveResults = await model.save('indexeddb://my-model-1');\n *\n * const loadedModel = await tf.loadLayersModel('indexeddb://my-model-1');\n * console.log('Prediction from loaded model:');\n * loadedModel.predict(tf.ones([1, 3])).print();\n * ```\n *\n * Example 4. Load a model from user-selected files from HTML\n * [file input\n * elements](https://developer.mozilla.org/en-US/docs/Web/HTML/Element/input/file).\n *\n * ```js\n * // Note: this code snippet will not work without the HTML elements in the\n * // page\n * const jsonUpload = document.getElementById('json-upload');\n * const weightsUpload = document.getElementById('weights-upload');\n *\n * const model = await tf.loadLayersModel(\n * tf.io.browserFiles([jsonUpload.files[0], weightsUpload.files[0]]));\n * ```\n *\n * @param pathOrIOHandler Can be either of the two formats\n * 1. A string path to the `ModelAndWeightsConfig` JSON describing\n * the model in the canonical TensorFlow.js format. For file://\n * (tfjs-node-only), http:// and https:// schemas, the path can be\n * either absolute or relative.\n * 2. A `tf.io.IOHandler` object that loads model artifacts with its `load`\n * method.\n * @param options Optional configuration arguments for the model loading,\n * including:\n * - `strict`: Require that the provided weights exactly match those required\n * by the layers. Default true. Passing false means that both extra\n * weights and missing weights will be silently ignored.\n * - `onProgress`: A function of the signature `(fraction: number) => void',\n * that can be used as the progress callback for the model loading.\n * @returns A `Promise` of `tf.LayersModel`, with the topology and weights\n * loaded.\n *\n * @doc {heading: 'Models', subheading: 'Loading'}\n */\nexport function loadLayersModel(pathOrIOHandler, options) {\n if (options == null) {\n options = {};\n }\n return loadLayersModelInternal(pathOrIOHandler, options);\n}\n/**\n * Used to instantiate an input to a model as a `tf.SymbolicTensor`.\n *\n * Users should call the `input` factory function for\n * consistency with other generator functions.\n *\n * Example:\n *\n * ```js\n * // Defines a simple logistic regression model with 32 dimensional input\n * // and 3 dimensional output.\n * const x = tf.input({shape: [32]});\n * const y = tf.layers.dense({units: 3, activation: 'softmax'}).apply(x);\n * const model = tf.model({inputs: x, outputs: y});\n * model.predict(tf.ones([2, 32])).print();\n * ```\n *\n * Note: `input` is only necessary when using `model`. When using\n * `sequential`, specify `inputShape` for the first layer or use `inputLayer`\n * as the first layer.\n *\n * @doc {heading: 'Models', subheading: 'Inputs'}\n */\nexport function input(config) {\n return Input(config);\n}\nexport function registerCallbackConstructor(verbosityLevel, callbackConstructor) {\n CallbackConstructorRegistry.registerCallbackConstructor(verbosityLevel, callbackConstructor);\n}\n//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZXhwb3J0cy5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uL3RmanMtbGF5ZXJzL3NyYy9leHBvcnRzLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBOzs7Ozs7OztHQVFHO0FBUUgsT0FBTyxFQUEwQiwyQkFBMkIsRUFBQyxNQUFNLGtCQUFrQixDQUFDO0FBRXRGLE9BQU8sRUFBQyxLQUFLLEdBQWUsTUFBTSxzQkFBc0IsQ0FBQztBQUV6RCxPQUFPLEVBQUMsV0FBVyxFQUFDLE1BQU0sbUJBQW1CLENBQUM7QUFDOUMsT0FBTyxFQUFDLHVCQUF1QixFQUFFLFVBQVUsRUFBaUIsTUFBTSxVQUFVLENBQUM7QUFFN0Usd0VBQXdFO0FBQ3hFLHdFQUF3RTtBQUN4RSxrQkFBa0I7QUFFbEIsMkNBQTJDO0FBRTNDOzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7R0F1Q0c7QUFDSCxNQUFNLFVBQVUsS0FBSyxDQUFDLElBQW1CO0lBQ3ZDLE9BQU8sSUFBSSxXQUFXLENBQUMsSUFBSSxDQUFDLENBQUM7QUFDL0IsQ0FBQztBQUVEOzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7OztHQTJERztBQUNILE1BQU0sVUFBVSxVQUFVLENBQUMsTUFBdUI7SUFDaEQsT0FBTyxJQUFJLFVBQVUsQ0FBQyxNQUFNLENBQUMsQ0FBQztBQUNoQyxDQUFDO0FBRUQ7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7OztHQTBGRztBQUNILE1BQU0sVUFBVSxlQUFlLENBQzNCLGVBQW9DLEVBQ3BDLE9BQXdCO0lBQzFCLElBQUksT0FBTyxJQUFJLElBQUksRUFBRTtRQUNuQixPQUFPLEdBQUcsRUFBRSxDQUFDO0tBQ2Q7SUFDRCxPQUFPLHVCQUF1QixDQUFDLGVBQWUsRUFBRSxPQUFPLENBQUMsQ0FBQztBQUMzRCxDQUFDO0FBRUQ7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7R0FzQkc7QUFDSCxNQUFNLFVBQVUsS0FBSyxDQUFDLE1BQW1CO0lBQ3ZDLE9BQU8sS0FBSyxDQUFDLE1BQU0sQ0FBQyxDQUFDO0FBQ3ZCLENBQUM7QUFFRCxNQUFNLFVBQVUsMkJBQTJCLENBQ3ZDLGNBQXNCLEVBQ3RCLG1CQUE0QztJQUM5QywyQkFBMkIsQ0FBQywyQkFBMkIsQ0FDbkQsY0FBYyxFQUFFLG1CQUFtQixDQUFDLENBQUM7QUFDM0MsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbIi8qKlxuICogQGxpY2Vuc2VcbiAqIENvcHlyaWdodCAyMDE4IEdvb2dsZSBMTENcbiAqXG4gKiBVc2Ugb2YgdGhpcyBzb3VyY2UgY29kZSBpcyBnb3Zlcm5lZCBieSBhbiBNSVQtc3R5bGVcbiAqIGxpY2Vuc2UgdGhhdCBjYW4gYmUgZm91bmQgaW4gdGhlIExJQ0VOU0UgZmlsZSBvciBhdFxuICogaHR0cHM6Ly9vcGVuc291cmNlLm9yZy9saWNlbnNlcy9NSVQuXG4gKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuICovXG5cbi8qKlxuICogRXhwb3J0ZWQgZnVuY3Rpb25zLlxuICovXG5cbmltcG9ydCB7aW99IGZyb20gJ0B0ZW5zb3JmbG93L3RmanMtY29yZSc7XG5cbmltcG9ydCB7QmFzZUNhbGxiYWNrQ29uc3RydWN0b3IsIENhbGxiYWNrQ29uc3RydWN0b3JSZWdpc3RyeX0gZnJvbSAnLi9iYXNlX2NhbGxiYWNrcyc7XG5pbXBvcnQge0NvbnRhaW5lckFyZ3N9IGZyb20gJy4vZW5naW5lL2NvbnRhaW5lcic7XG5pbXBvcnQge0lucHV0LCBJbnB1dENvbmZpZyx9IGZyb20gJy4vZW5naW5lL2lucHV0X2xheWVyJztcbmltcG9ydCB7U3ltYm9saWNUZW5zb3J9IGZyb20gJy4vZW5naW5lL3RvcG9sb2d5JztcbmltcG9ydCB7TGF5ZXJzTW9kZWx9IGZyb20gJy4vZW5naW5lL3RyYWluaW5nJztcbmltcG9ydCB7bG9hZExheWVyc01vZGVsSW50ZXJuYWwsIFNlcXVlbnRpYWwsIFNlcXVlbnRpYWxBcmdzfSBmcm9tICcuL21vZGVscyc7XG5cbi8vIFRPRE8oY2Fpcyk6IEFkZCBkb2Mgc3RyaW5nIHRvIGFsbCB0aGUgcHVibGljIHN0YXRpYyBmdW5jdGlvbnMgaW4gdGhpc1xuLy8gICBjbGFzczsgaW5jbHVkZSBleGVjdHVhYmxlIEphdmFTY3JpcHQgY29kZSBzbmlwcGV0cyB3aGVyZSBhcHBsaWNhYmxlXG4vLyAgIChiLzc0MDc0NDU4KS5cblxuLy8gTGF5ZXJzTW9kZWwgYW5kIHJlbGF0ZWQgZmFjdG9yeSBtZXRob2RzLlxuXG4vKipcbiAqIEEgbW9kZWwgaXMgYSBkYXRhIHN0cnVjdHVyZSB0aGF0IGNvbnNpc3RzIG9mIGBMYXllcnNgIGFuZCBkZWZpbmVzIGlucHV0c1xuICogYW5kIG91dHB1dHMuXG4gKlxuICogVGhlIGtleSBkaWZmZXJlbmNlIGJldHdlZW4gYHRmLm1vZGVsYCBhbmQgYHRmLnNlcXVlbnRpYWxgIGlzIHRoYXRcbiAqIGB0Zi5tb2RlbGAgaXMgbW9yZSBnZW5lcmljLCBzdXBwb3J0aW5nIGFuIGFyYml0cmFyeSBncmFwaCAod2l0aG91dFxuICogY3ljbGVzKSBvZiBsYXllcnMuIGB0Zi5zZXF1ZW50aWFsYCBpcyBsZXNzIGdlbmVyaWMgYW5kIHN1cHBvcnRzIG9ubHkgYSBsaW5lYXJcbiAqIHN0YWNrIG9mIGxheWVycy5cbiAqXG4gKiBXaGVuIGNyZWF0aW5nIGEgYHRmLkxheWVyc01vZGVsYCwgc3BlY2lmeSBpdHMgaW5wdXQocykgYW5kIG91dHB1dChzKS4gTGF5ZXJzXG4gKiBhcmUgdXNlZCB0byB3aXJlIGlucHV0KHMpIHRvIG91dHB1dChzKS5cbiAqXG4gKiBGb3IgZXhhbXBsZSwgdGhlIGZvbGxvd2luZyBjb2RlIHNuaXBwZXQgZGVmaW5lcyBhIG1vZGVsIGNvbnNpc3Rpbmcgb2ZcbiAqIHR3byBgZGVuc2VgIGxheWVycywgd2l0aCAxMCBhbmQgNCB1bml0cywgcmVzcGVjdGl2ZWx5LlxuICpcbiAqIGBgYGpzXG4gKiAvLyBEZWZpbmUgaW5wdXQsIHdoaWNoIGhhcyBhIHNpemUgb2YgNSAobm90IGluY2x1ZGluZyBiYXRjaCBkaW1lbnNpb24pLlxuICogY29uc3QgaW5wdXQgPSB0Zi5pbnB1dCh7c2hhcGU6IFs1XX0pO1xuICpcbiAqIC8vIEZpcnN0IGRlbnNlIGxheWVyIHVzZXMgcmVsdSBhY3RpdmF0aW9uLlxuICogY29uc3QgZGVuc2VMYXllcjEgPSB0Zi5sYXllcnMuZGVuc2Uoe3VuaXRzOiAxMCwgYWN0aXZhdGlvbjogJ3JlbHUnfSk7XG4gKiAvLyBTZWNvbmQgZGVuc2UgbGF5ZXIgdXNlcyBzb2Z0bWF4IGFjdGl2YXRpb24uXG4gKiBjb25zdCBkZW5zZUxheWVyMiA9IHRmLmxheWVycy5kZW5zZSh7dW5pdHM6IDQsIGFjdGl2YXRpb246ICdzb2Z0bWF4J30pO1xuICpcbiAqIC8vIE9idGFpbiB0aGUgb3V0cHV0IHN5bWJvbGljIHRlbnNvciBieSBhcHBseWluZyB0aGUgbGF5ZXJzIG9uIHRoZSBpbnB1dC5cbiAqIGNvbnN0IG91dHB1dCA9IGRlbnNlTGF5ZXIyLmFwcGx5KGRlbnNlTGF5ZXIxLmFwcGx5KGlucHV0KSk7XG4gKlxuICogLy8gQ3JlYXRlIHRoZSBtb2RlbCBiYXNlZCBvbiB0aGUgaW5wdXRzLlxuICogY29uc3QgbW9kZWwgPSB0Zi5tb2RlbCh7aW5wdXRzOiBpbnB1dCwgb3V0cHV0czogb3V0cHV0fSk7XG4gKlxuICogLy8gVGhlIG1vZGVsIGNhbiBiZSB1c2VkIGZvciB0cmFpbmluZywgZXZhbHVhdGlvbiBhbmQgcHJlZGljdGlvbi5cbiAqIC8vIEZvciBleGFtcGxlLCB0aGUgZm9sbG93aW5nIGxpbmUgcnVucyBwcmVkaWN0aW9uIHdpdGggdGhlIG1vZGVsIG9uXG4gKiAvLyBzb21lIGZha2UgZGF0YS5cbiAqIG1vZGVsLnByZWRpY3QodGYub25lcyhbMiwgNV0pKS5wcmludCgpO1xuICogYGBgXG4gKiBTZWUgYWxzbzpcbiAqICAgYHRmLnNlcXVlbnRpYWxgLCBgdGYubG9hZExheWVyc01vZGVsYC5cbiAqXG4gKiBAZG9jIHtoZWFkaW5nOiAnTW9kZWxzJywgc3ViaGVhZGluZzogJ0NyZWF0aW9uJ31cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIG1vZGVsKGFyZ3M6IENvbnRhaW5lckFyZ3MpOiBMYXllcnNNb2RlbCB7XG4gIHJldHVybiBuZXcgTGF5ZXJzTW9kZWwoYXJncyk7XG59XG5cbi8qKlxuICogQ3JlYXRlcyBhIGB0Zi5TZXF1ZW50aWFsYCBtb2RlbC4gIEEgc2VxdWVudGlhbCBtb2RlbCBpcyBhbnkgbW9kZWwgd2hlcmUgdGhlXG4gKiBvdXRwdXRzIG9mIG9uZSBsYXllciBhcmUgdGhlIGlucHV0cyB0byB0aGUgbmV4dCBsYXllciwgaS5lLiB0aGUgbW9kZWxcbiAqIHRvcG9sb2d5IGlzIGEgc2ltcGxlICdzdGFjaycgb2YgbGF5ZXJzLCB3aXRoIG5vIGJyYW5jaGluZyBvciBza2lwcGluZy5cbiAqXG4gKiBUaGlzIG1lYW5zIHRoYXQgdGhlIGZpcnN0IGxheWVyIHBhc3NlZCB0byBhIGB0Zi5TZXF1ZW50aWFsYCBtb2RlbCBzaG91bGQgaGF2ZVxuICogYSBkZWZpbmVkIGlucHV0IHNoYXBlLiBXaGF0IHRoYXQgbWVhbnMgaXMgdGhhdCBpdCBzaG91bGQgaGF2ZSByZWNlaXZlZCBhblxuICogYGlucHV0U2hhcGVgIG9yIGBiYXRjaElucHV0U2hhcGVgIGFyZ3VtZW50LCBvciBmb3Igc29tZSB0eXBlIG9mIGxheWVyc1xuICogKHJlY3VycmVudCwgRGVuc2UuLi4pIGFuIGBpbnB1dERpbWAgYXJndW1lbnQuXG4gKlxuICogVGhlIGtleSBkaWZmZXJlbmNlIGJldHdlZW4gYHRmLm1vZGVsYCBhbmQgYHRmLnNlcXVlbnRpYWxgIGlzIHRoYXRcbiAqIGB0Zi5zZXF1ZW50aWFsYCBpcyBsZXNzIGdlbmVyaWMsIHN1cHBvcnRpbmcgb25seSBhIGxpbmVhciBzdGFjayBvZiBsYXllcnMuXG4gKiBgdGYubW9kZWxgIGlzIG1vcmUgZ2VuZXJpYyBhbmQgc3VwcG9ydHMgYW4gYXJiaXRyYXJ5IGdyYXBoICh3aXRob3V0XG4gKiBjeWNsZXMpIG9mIGxheWVycy5cbiAqXG4gKiBFeGFtcGxlczpcbiAqXG4gKiBgYGBqc1xuICogY29uc3QgbW9kZWwgPSB0Zi5zZXF1ZW50aWFsKCk7XG4gKlxuICogLy8gRmlyc3QgbGF5ZXIgbXVzdCBoYXZlIGFuIGlucHV0IHNoYXBlIGRlZmluZWQuXG4gKiBtb2RlbC5hZGQodGYubGF5ZXJzLmRlbnNlKHt1bml0czogMzIsIGlucHV0U2hhcGU6IFs1MF19KSk7XG4gKiAvLyBBZnRlcndhcmRzLCBURi5qcyBkb2VzIGF1dG9tYXRpYyBzaGFwZSBpbmZlcmVuY2UuXG4gKiBtb2RlbC5hZGQodGYubGF5ZXJzLmRlbnNlKHt1bml0czogNH0pKTtcbiAqXG4gKiAvLyBJbnNwZWN0IHRoZSBpbmZlcnJlZCBzaGFwZSBvZiB0aGUgbW9kZWwncyBvdXRwdXQsIHdoaWNoIGVxdWFsc1xuICogLy8gYFtudWxsLCA0XWAuIFRoZSAxc3QgZGltZW5zaW9uIGlzIHRoZSB1bmRldGVybWluZWQgYmF0Y2ggZGltZW5zaW9uOyB0aGVcbiAqIC8vIDJuZCBpcyB0aGUgb3V0cHV0IHNpemUgb2YgdGhlIG1vZGVsJ3MgbGFzdCBsYXllci5cbiAqIGNvbnNvbGUubG9nKEpTT04uc3RyaW5naWZ5KG1vZGVsLm91dHB1dHNbMF0uc2hhcGUpKTtcbiAqIGBgYFxuICpcbiAqIEl0IGlzIGFsc28gcG9zc2libGUgdG8gc3BlY2lmeSBhIGJhdGNoIHNpemUgKHdpdGggcG90ZW50aWFsbHkgdW5kZXRlcm1pbmVkXG4gKiBiYXRjaCBkaW1lbnNpb24sIGRlbm90ZWQgYnkgXCJudWxsXCIpIGZvciB0aGUgZmlyc3QgbGF5ZXIgdXNpbmcgdGhlXG4gKiBgYmF0Y2hJbnB1dFNoYXBlYCBrZXkuIFRoZSBmb2xsb3dpbmcgZXhhbXBsZSBpcyBlcXVpdmFsZW50IHRvIHRoZSBhYm92ZTpcbiAqXG4gKiBgYGBqc1xuICogY29uc3QgbW9kZWwgPSB0Zi5zZXF1ZW50aWFsKCk7XG4gKlxuICogLy8gRmlyc3QgbGF5ZXIgbXVzdCBoYXZlIGEgZGVmaW5lZCBpbnB1dCBzaGFwZVxuICogbW9kZWwuYWRkKHRmLmxheWVycy5kZW5zZSh7dW5pdHM6IDMyLCBiYXRjaElucHV0U2hhcGU6IFtudWxsLCA1MF19KSk7XG4gKiAvLyBBZnRlcndhcmRzLCBURi5qcyBkb2VzIGF1dG9tYXRpYyBzaGFwZSBpbmZlcmVuY2UuXG4gKiBtb2RlbC5hZGQodGYubGF5ZXJzLmRlbnNlKHt1bml0czogNH0pKTtcbiAqXG4gKiAvLyBJbnNwZWN0IHRoZSBpbmZlcnJlZCBzaGFwZSBvZiB0aGUgbW9kZWwncyBvdXRwdXQuXG4gKiBjb25zb2xlLmxvZyhKU09OLnN0cmluZ2lmeShtb2RlbC5vdXRwdXRzWzBdLnNoYXBlKSk7XG4gKiBgYGBcbiAqXG4gKiBZb3UgY2FuIGFsc28gdXNlIGFuIGBBcnJheWAgb2YgYWxyZWFkeS1jb25zdHJ1Y3RlZCBgTGF5ZXJgcyB0byBjcmVhdGVcbiAqIGEgYHRmLlNlcXVlbnRpYWxgIG1vZGVsOlxuICpcbiAqIGBgYGpzXG4gKiBjb25zdCBtb2RlbCA9IHRmLnNlcXVlbnRpYWwoe1xuICogICBsYXllcnM6IFt0Zi5sYXllcnMuZGVuc2Uoe3VuaXRzOiAzMiwgaW5wdXRTaGFwZTogWzUwXX0pLFxuICogICAgICAgICAgICB0Zi5sYXllcnMuZGVuc2Uoe3VuaXRzOiA0fSldXG4gKiB9KTtcbiAqIGNvbnNvbGUubG9nKEpTT04uc3RyaW5naWZ5KG1vZGVsLm91dHB1dHNbMF0uc2hhcGUpKTtcbiAqIGBgYFxuICpcbiAqIEBkb2Mge2hlYWRpbmc6ICdNb2RlbHMnLCBzdWJoZWFkaW5nOiAnQ3JlYXRpb24nfVxuICovXG5leHBvcnQgZnVuY3Rpb24gc2VxdWVudGlhbChjb25maWc/OiBTZXF1ZW50aWFsQXJncyk6IFNlcXVlbnRpYWwge1xuICByZXR1cm4gbmV3IFNlcXVlbnRpYWwoY29uZmlnKTtcbn1cblxuLyoqXG4gKiBMb2FkIGEgbW9kZWwgY29tcG9zZWQgb2YgTGF5ZXIgb2JqZWN0cywgaW5jbHVkaW5nIGl0cyB0b3BvbG9neSBhbmQgb3B0aW9uYWxseVxuICogd2VpZ2h0cy4gU2VlIHRoZSBUdXRvcmlhbCBuYW1lZCBcIkhvdyB0byBpbXBvcnQgYSBLZXJhcyBNb2RlbFwiIGZvciB1c2FnZVxuICogZXhhbXBsZXMuXG4gKlxuICogVGhpcyBtZXRob2QgaXMgYXBwbGljYWJsZSB0bzpcbiAqXG4gKiAxLiBNb2RlbHMgY3JlYXRlZCB3aXRoIHRoZSBgdGYubGF5ZXJzLipgLCBgdGYuc2VxdWVudGlhbGAsIGFuZFxuICogYHRmLm1vZGVsYCBBUElzIG9mIFRlbnNvckZsb3cuanMgYW5kIGxhdGVyIHNhdmVkIHdpdGggdGhlXG4gKiBgdGYuTGF5ZXJzTW9kZWwuc2F2ZWAgbWV0aG9kLlxuICogMi4gTW9kZWxzIGNvbnZlcnRlZCBmcm9tIEtlcmFzIG9yIFRlbnNvckZsb3cgdGYua2VyYXMgdXNpbmcgdGhlXG4gKiBbdGVuc29yZmxvd2pzX2NvbnZlcnRlcl0oaHR0cHM6Ly9naXRodWIuY29tL3RlbnNvcmZsb3cvdGZqcy90cmVlL21hc3Rlci90ZmpzLWNvbnZlcnRlcikuXG4gKlxuICogVGhpcyBtb2RlIGlzICpub3QqIGFwcGxpY2FibGUgdG8gVGVuc29yRmxvdyBgU2F2ZWRNb2RlbGBzIG9yIHRoZWlyIGNvbnZlcnRlZFxuICogZm9ybXMuIEZvciB0aG9zZSBtb2RlbHMsIHVzZSBgdGYubG9hZEdyYXBoTW9kZWxgLlxuICpcbiAqIEV4YW1wbGUgMS4gTG9hZCBhIG1vZGVsIGZyb20gYW4gSFRUUCBzZXJ2ZXIuXG4gKlxuICogYGBganNcbiAqIGNvbnN0IG1vZGVsID0gYXdhaXQgdGYubG9hZExheWVyc01vZGVsKFxuICogICAgICdodHRwczovL3N0b3JhZ2UuZ29vZ2xlYXBpcy5jb20vdGZqcy1tb2RlbHMvdGZqcy9pcmlzX3YxL21vZGVsLmpzb24nKTtcbiAqIG1vZGVsLnN1bW1hcnkoKTtcbiAqIGBgYFxuICpcbiAqIEV4YW1wbGUgMjogU2F2ZSBgbW9kZWxgJ3MgdG9wb2xvZ3kgYW5kIHdlaWdodHMgdG8gYnJvd3NlciBbbG9jYWxcbiAqIHN0b3JhZ2VdKGh0dHBzOi8vZGV2ZWxvcGVyLm1vemlsbGEub3JnL2VuLVVTL2RvY3MvV2ViL0FQSS9XaW5kb3cvbG9jYWxTdG9yYWdlKTtcbiAqIHRoZW4gbG9hZCBpdCBiYWNrLlxuICpcbiAqIGBgYGpzXG4gKiBjb25zdCBtb2RlbCA9IHRmLnNlcXVlbnRpYWwoXG4gKiAgICAge2xheWVyczogW3RmLmxheWVycy5kZW5zZSh7dW5pdHM6IDEsIGlucHV0U2hhcGU6IFszXX0pXX0pO1xuICogY29uc29sZS5sb2coJ1ByZWRpY3Rpb24gZnJvbSBvcmlnaW5hbCBtb2RlbDonKTtcbiAqIG1vZGVsLnByZWRpY3QodGYub25lcyhbMSwgM10pKS5wcmludCgpO1xuICpcbiAqIGNvbnN0IHNhdmVSZXN1bHRzID0gYXdhaXQgbW9kZWwuc2F2ZSgnbG9jYWxzdG9yYWdlOi8vbXktbW9kZWwtMScpO1xuICpcbiAqIGNvbnN0IGxvYWRlZE1vZGVsID0gYXdhaXQgdGYubG9hZExheWVyc01vZGVsKCdsb2NhbHN0b3JhZ2U6Ly9teS1tb2RlbC0xJyk7XG4gKiBjb25zb2xlLmxvZygnUHJlZGljdGlvbiBmcm9tIGxvYWRlZCBtb2RlbDonKTtcbiAqIGxvYWRlZE1vZGVsLnByZWRpY3QodGYub25lcyhbMSwgM10pKS5wcmludCgpO1xuICogYGBgXG4gKlxuICogRXhhbXBsZSAzLiBTYXZpbmcgYG1vZGVsYCdzIHRvcG9sb2d5IGFuZCB3ZWlnaHRzIHRvIGJyb3dzZXJcbiAqIFtJbmRleGVkREJdKGh0dHBzOi8vZGV2ZWxvcGVyLm1vemlsbGEub3JnL2VuLVVTL2RvY3MvV2ViL0FQSS9JbmRleGVkREJfQVBJKTtcbiAqIHRoZW4gbG9hZCBpdCBiYWNrLlxuICpcbiAqIGBgYGpzXG4gKiBjb25zdCBtb2RlbCA9IHRmLnNlcXVlbnRpYWwoXG4gKiAgICAge2xheWVyczogW3RmLmxheWVycy5kZW5zZSh7dW5pdHM6IDEsIGlucHV0U2hhcGU6IFszXX0pXX0pO1xuICogY29uc29sZS5sb2coJ1ByZWRpY3Rpb24gZnJvbSBvcmlnaW5hbCBtb2RlbDonKTtcbiAqIG1vZGVsLnByZWRpY3QodGYub25lcyhbMSwgM10pKS5wcmludCgpO1xuICpcbiAqIGNvbnN0IHNhdmVSZXN1bHRzID0gYXdhaXQgbW9kZWwuc2F2ZSgnaW5kZXhlZGRiOi8vbXktbW9kZWwtMScpO1xuICpcbiAqIGNvbnN0IGxvYWRlZE1vZGVsID0gYXdhaXQgdGYubG9hZExheWVyc01vZGVsKCdpbmRleGVkZGI6Ly9teS1tb2RlbC0xJyk7XG4gKiBjb25zb2xlLmxvZygnUHJlZGljdGlvbiBmcm9tIGxvYWRlZCBtb2RlbDonKTtcbiAqIGxvYWRlZE1vZGVsLnByZWRpY3QodGYub25lcyhbMSwgM10pKS5wcmludCgpO1xuICogYGBgXG4gKlxuICogRXhhbXBsZSA0LiBMb2FkIGEgbW9kZWwgZnJvbSB1c2VyLXNlbGVjdGVkIGZpbGVzIGZyb20gSFRNTFxuICogW2ZpbGUgaW5wdXRcbiAqIGVsZW1lbnRzXShodHRwczovL2RldmVsb3Blci5tb3ppbGxhLm9yZy9lbi1VUy9kb2NzL1dlYi9IVE1ML0VsZW1lbnQvaW5wdXQvZmlsZSkuXG4gKlxuICogYGBganNcbiAqIC8vIE5vdGU6IHRoaXMgY29kZSBzbmlwcGV0IHdpbGwgbm90IHdvcmsgd2l0aG91dCB0aGUgSFRNTCBlbGVtZW50cyBpbiB0aGVcbiAqIC8vICAgcGFnZVxuICogY29uc3QganNvblVwbG9hZCA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdqc29uLXVwbG9hZCcpO1xuICogY29uc3Qgd2VpZ2h0c1VwbG9hZCA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCd3ZWlnaHRzLXVwbG9hZCcpO1xuICpcbiAqIGNvbnN0IG1vZGVsID0gYXdhaXQgdGYubG9hZExheWVyc01vZGVsKFxuICogICAgIHRmLmlvLmJyb3dzZXJGaWxlcyhbanNvblVwbG9hZC5maWxlc1swXSwgd2VpZ2h0c1VwbG9hZC5maWxlc1swXV0pKTtcbiAqIGBgYFxuICpcbiAqIEBwYXJhbSBwYXRoT3JJT0hhbmRsZXIgQ2FuIGJlIGVpdGhlciBvZiB0aGUgdHdvIGZvcm1hdHNcbiAqICAgMS4gQSBzdHJpbmcgcGF0aCB0byB0aGUgYE1vZGVsQW5kV2VpZ2h0c0NvbmZpZ2AgSlNPTiBkZXNjcmliaW5nXG4gKiAgICAgIHRoZSBtb2RlbCBpbiB0aGUgY2Fub25pY2FsIFRlbnNvckZsb3cuanMgZm9ybWF0LiBGb3IgZmlsZTovL1xuICogICAgICAodGZqcy1ub2RlLW9ubHkpLCBodHRwOi8vIGFuZCBodHRwczovLyBzY2hlbWFzLCB0aGUgcGF0aCBjYW4gYmVcbiAqICAgICAgZWl0aGVyIGFic29sdXRlIG9yIHJlbGF0aXZlLlxuICogICAyLiBBIGB0Zi5pby5JT0hhbmRsZXJgIG9iamVjdCB0aGF0IGxvYWRzIG1vZGVsIGFydGlmYWN0cyB3aXRoIGl0cyBgbG9hZGBcbiAqICAgICAgbWV0aG9kLlxuICogQHBhcmFtIG9wdGlvbnMgT3B0aW9uYWwgY29uZmlndXJhdGlvbiBhcmd1bWVudHMgZm9yIHRoZSBtb2RlbCBsb2FkaW5nLFxuICogICBpbmNsdWRpbmc6XG4gKiAgIC0gYHN0cmljdGA6IFJlcXVpcmUgdGhhdCB0aGUgcHJvdmlkZWQgd2VpZ2h0cyBleGFjdGx5IG1hdGNoIHRob3NlIHJlcXVpcmVkXG4gKiAgICAgYnkgdGhlIGxheWVycy4gIERlZmF1bHQgdHJ1ZS4gIFBhc3NpbmcgZmFsc2UgbWVhbnMgdGhhdCBib3RoIGV4dHJhXG4gKiAgICAgd2VpZ2h0cyBhbmQgbWlzc2luZyB3ZWlnaHRzIHdpbGwgYmUgc2lsZW50bHkgaWdub3JlZC5cbiAqICAgLSBgb25Qcm9ncmVzc2A6IEEgZnVuY3Rpb24gb2YgdGhlIHNpZ25hdHVyZSBgKGZyYWN0aW9uOiBudW1iZXIpID0+IHZvaWQnLFxuICogICAgIHRoYXQgY2FuIGJlIHVzZWQgYXMgdGhlIHByb2dyZXNzIGNhbGxiYWNrIGZvciB0aGUgbW9kZWwgbG9hZGluZy5cbiAqIEByZXR1cm5zIEEgYFByb21pc2VgIG9mIGB0Zi5MYXllcnNNb2RlbGAsIHdpdGggdGhlIHRvcG9sb2d5IGFuZCB3ZWlnaHRzXG4gKiAgICAgbG9hZGVkLlxuICpcbiAqIEBkb2Mge2hlYWRpbmc6ICdNb2RlbHMnLCBzdWJoZWFkaW5nOiAnTG9hZGluZyd9XG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBsb2FkTGF5ZXJzTW9kZWwoXG4gICAgcGF0aE9ySU9IYW5kbGVyOiBzdHJpbmd8aW8uSU9IYW5kbGVyLFxuICAgIG9wdGlvbnM/OiBpby5Mb2FkT3B0aW9ucyk6IFByb21pc2U8TGF5ZXJzTW9kZWw+IHtcbiAgaWYgKG9wdGlvbnMgPT0gbnVsbCkge1xuICAgIG9wdGlvbnMgPSB7fTtcbiAgfVxuICByZXR1cm4gbG9hZExheWVyc01vZGVsSW50ZXJuYWwocGF0aE9ySU9IYW5kbGVyLCBvcHRpb25zKTtcbn1cblxuLyoqXG4gKiBVc2VkIHRvIGluc3RhbnRpYXRlIGFuIGlucHV0IHRvIGEgbW9kZWwgYXMgYSBgdGYuU3ltYm9saWNUZW5zb3JgLlxuICpcbiAqIFVzZXJzIHNob3VsZCBjYWxsIHRoZSBgaW5wdXRgIGZhY3RvcnkgZnVuY3Rpb24gZm9yXG4gKiBjb25zaXN0ZW5jeSB3aXRoIG90aGVyIGdlbmVyYXRvciBmdW5jdGlvbnMuXG4gKlxuICogRXhhbXBsZTpcbiAqXG4gKiBgYGBqc1xuICogLy8gRGVmaW5lcyBhIHNpbXBsZSBsb2dpc3RpYyByZWdyZXNzaW9uIG1vZGVsIHdpdGggMzIgZGltZW5zaW9uYWwgaW5wdXRcbiAqIC8vIGFuZCAzIGRpbWVuc2lvbmFsIG91dHB1dC5cbiAqIGNvbnN0IHggPSB0Zi5pbnB1dCh7c2hhcGU6IFszMl19KTtcbiAqIGNvbnN0IHkgPSB0Zi5sYXllcnMuZGVuc2Uoe3VuaXRzOiAzLCBhY3RpdmF0aW9uOiAnc29mdG1heCd9KS5hcHBseSh4KTtcbiAqIGNvbnN0IG1vZGVsID0gdGYubW9kZWwoe2lucHV0czogeCwgb3V0cHV0czogeX0pO1xuICogbW9kZWwucHJlZGljdCh0Zi5vbmVzKFsyLCAzMl0pKS5wcmludCgpO1xuICogYGBgXG4gKlxuICogTm90ZTogYGlucHV0YCBpcyBvbmx5IG5lY2Vzc2FyeSB3aGVuIHVzaW5nIGBtb2RlbGAuIFdoZW4gdXNpbmdcbiAqIGBzZXF1ZW50aWFsYCwgc3BlY2lmeSBgaW5wdXRTaGFwZWAgZm9yIHRoZSBmaXJzdCBsYXllciBvciB1c2UgYGlucHV0TGF5ZXJgXG4gKiBhcyB0aGUgZmlyc3QgbGF5ZXIuXG4gKlxuICogQGRvYyB7aGVhZGluZzogJ01vZGVscycsIHN1YmhlYWRpbmc6ICdJbnB1dHMnfVxuICovXG5leHBvcnQgZnVuY3Rpb24gaW5wdXQoY29uZmlnOiBJbnB1dENvbmZpZyk6IFN5bWJvbGljVGVuc29yIHtcbiAgcmV0dXJuIElucHV0KGNvbmZpZyk7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiByZWdpc3RlckNhbGxiYWNrQ29uc3RydWN0b3IoXG4gICAgdmVyYm9zaXR5TGV2ZWw6IG51bWJlcixcbiAgICBjYWxsYmFja0NvbnN0cnVjdG9yOiBCYXNlQ2FsbGJhY2tDb25zdHJ1Y3Rvcik6IHZvaWQge1xuICBDYWxsYmFja0NvbnN0cnVjdG9yUmVnaXN0cnkucmVnaXN0ZXJDYWxsYmFja0NvbnN0cnVjdG9yKFxuICAgICAgdmVyYm9zaXR5TGV2ZWwsIGNhbGxiYWNrQ29uc3RydWN0b3IpO1xufVxuIl19","/**\n * @license\n * Copyright 2018 Google LLC\n *\n * Use of this source code is governed by an MIT-style\n * license that can be found in the LICENSE file or at\n * https://opensource.org/licenses/MIT.\n * =============================================================================\n */\n// Layer activation functions\nimport * as tfc from '@tensorflow/tfjs-core';\nimport { serialization, tidy } from '@tensorflow/tfjs-core';\nimport * as K from './backend/tfjs_backend';\nimport { deserializeKerasObject } from './utils/generic_utils';\n/**\n * Base class for Activations.\n *\n * Special note: due to cross-language compatibility reasons, the\n * static readonly className field in this family of classes must be set to\n * the initialLowerCamelCase name of the activation.\n */\nexport class Activation extends serialization.Serializable {\n getConfig() {\n return {};\n }\n}\n/**\n * Exponential linear unit (ELU).\n * Reference: https://arxiv.org/abs/1511.07289\n */\nexport class Elu extends Activation {\n /**\n * Calculate the activation function.\n *\n * @param x: Input.\n * @param alpha: Scaling factor the negative section.\n * @return Output of the ELU activation.\n */\n apply(x, alpha = 1) {\n return K.elu(x, alpha);\n }\n}\n/** @nocollapse */\nElu.className = 'elu';\nserialization.registerClass(Elu);\n/**\n * Scaled Exponential Linear Unit. (Klambauer et al., 2017).\n * Reference: Self-Normalizing Neural Networks, https://arxiv.org/abs/1706.02515\n * Notes:\n * - To be used together with the initialization \"lecunNormal\".\n * - To be used together with the dropout variant \"AlphaDropout\".\n */\nexport class Selu extends Activation {\n apply(x) {\n return tfc.selu(x);\n }\n}\n/** @nocollapse */\nSelu.className = 'selu';\nserialization.registerClass(Selu);\n/**\n * Rectified linear unit\n */\nexport class Relu extends Activation {\n apply(x) {\n return tfc.relu(x);\n }\n}\n/** @nocollapse */\nRelu.className = 'relu';\nserialization.registerClass(Relu);\n/**\n * Rectified linear unit activation maxing out at 6.0.\n */\nexport class Relu6 extends Activation {\n apply(x) {\n return tidy(() => tfc.minimum(6.0, tfc.relu(x)));\n }\n}\n/** @nocollapse */\nRelu6.className = 'relu6';\nserialization.registerClass(Relu6);\n//* Linear activation (no-op) */\nexport class Linear extends Activation {\n apply(x) {\n return x;\n }\n}\n/** @nocollapse */\nLinear.className = 'linear';\nserialization.registerClass(Linear);\n/**\n * Sigmoid activation function.\n */\nexport class Sigmoid extends Activation {\n apply(x) {\n return tfc.sigmoid(x);\n }\n}\n/** @nocollapse */\nSigmoid.className = 'sigmoid';\nserialization.registerClass(Sigmoid);\n/**\n * Segment-wise linear approximation of sigmoid.\n */\nexport class HardSigmoid extends Activation {\n apply(x) {\n return K.hardSigmoid(x);\n }\n}\n/** @nocollapse */\nHardSigmoid.className = 'hardSigmoid';\nserialization.registerClass(HardSigmoid);\n/**\n * Softplus activation function.\n */\nexport class Softplus extends Activation {\n apply(x) {\n return tfc.softplus(x);\n }\n}\n/** @nocollapse */\nSoftplus.className = 'softplus';\nserialization.registerClass(Softplus);\n/**\n * Softsign activation function.\n */\nexport class Softsign extends Activation {\n apply(x) {\n return K.softsign(x);\n }\n}\n/** @nocollapse */\nSoftsign.className = 'softsign';\nserialization.registerClass(Softsign);\n/**\n * Hyperbolic tangent function.\n */\nexport class Tanh extends Activation {\n apply(x) {\n return tfc.tanh(x);\n }\n}\n/** @nocollapse */\nTanh.className = 'tanh';\nserialization.registerClass(Tanh);\n/**\n * Softmax activation function\n */\nexport class Softmax extends Activation {\n /**\n * Calculate the activation function.\n *\n * @param x Tensor.\n * @param axis Integer, axis along which the softmax normalization is applied.\n * Invalid if < 2, as softmax across 1 (the batch dimension) is assumed to be\n * an error.\n *\n * @returns a Tensor of the same shape as x\n *\n * @throws ValueError: In case `dim(x) < 2`.\n */\n apply(x, axis = (-1)) {\n return tfc.softmax(x, axis);\n }\n}\n/** @nocollapse */\nSoftmax.className = 'softmax';\nserialization.registerClass(Softmax);\n/**\n * Log softmax activation function\n */\nexport class LogSoftmax extends Activation {\n /**\n * Calculate the activation function of log softmax:\n * log( exp(x_i) / sum(exp(x)) )\n *\n * @param x Tensor.\n * @param axis Integer, axis along which the softmax normalization is applied.\n * Invalid if < 2, as softmax across 1 (the batch dimension) is assumed to be\n * an error.\n *\n * @returns a Tensor of the same shape as x\n *\n * @throws ValueError: In case `dim(x) < 2`.\n */\n apply(x, axis = (-1)) {\n return tfc.logSoftmax(x, axis);\n }\n}\n/** @nocollapse */\nLogSoftmax.className = 'logSoftmax';\nserialization.registerClass(LogSoftmax);\n/**\n * Swish activation function\n */\nexport class Swish extends Activation {\n /**\n * Calculate the activation function.\n *\n * @param x Tensor.\n * @param alpha Scaling factor for the sigmoid function.\n * @returns a Tensor of the same shape as x\n */\n apply(x, alpha = 1) {\n return tidy(() => tfc.mul(tfc.sigmoid(tfc.mul(x, alpha)), x));\n }\n}\n/** @nocollapse */\nSwish.className = 'swish';\nserialization.registerClass(Swish);\n/**\n * Mish activation function\n */\nexport class Mish extends Activation {\n /**\n * Calculate the activation function.\n *\n * @param x Tensor.\n * @returns a Tensor of the same shape as x\n */\n apply(x) {\n return tidy(() => tfc.mul(x, tfc.tanh(tfc.softplus(x))));\n }\n}\n/** @nocollapse */\nMish.className = 'mish';\nserialization.registerClass(Mish);\nexport function serializeActivation(activation) {\n return activation.getClassName();\n}\nexport function deserializeActivation(config, customObjects = {}) {\n return deserializeKerasObject(config, serialization.SerializationMap.getMap().classNameMap, customObjects, 'activation');\n}\nexport function getActivation(identifier) {\n if (identifier == null) {\n const config = {};\n config['className'] = 'linear';\n config['config'] = {};\n return deserializeActivation(config);\n }\n if (typeof identifier === 'string') {\n const config = {};\n config['className'] = identifier;\n config['config'] = {};\n return deserializeActivation(config);\n }\n else if (identifier instanceof Activation) {\n return identifier;\n }\n else {\n return deserializeActivation(identifier);\n }\n}\n//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYWN0aXZhdGlvbnMuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi90ZmpzLWxheWVycy9zcmMvYWN0aXZhdGlvbnMudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUE7Ozs7Ozs7O0dBUUc7QUFFSCw2QkFBNkI7QUFDN0IsT0FBTyxLQUFLLEdBQUcsTUFBTSx1QkFBdUIsQ0FBQztBQUM3QyxPQUFPLEVBQUMsYUFBYSxFQUFVLElBQUksRUFBQyxNQUFNLHVCQUF1QixDQUFDO0FBQ2xFLE9BQU8sS0FBSyxDQUFDLE1BQU0sd0JBQXdCLENBQUM7QUFFNUMsT0FBTyxFQUFDLHNCQUFzQixFQUFDLE1BQU0sdUJBQXVCLENBQUM7QUFFN0Q7Ozs7OztHQU1HO0FBQ0gsTUFBTSxPQUFnQixVQUFXLFNBQVEsYUFBYSxDQUFDLFlBQVk7SUFFakUsU0FBUztRQUNQLE9BQU8sRUFBRSxDQUFDO0lBQ1osQ0FBQztDQUNGO0FBRUQ7OztHQUdHO0FBQ0gsTUFBTSxPQUFPLEdBQUksU0FBUSxVQUFVO0lBR2pDOzs7Ozs7T0FNRztJQUNILEtBQUssQ0FBQyxDQUFTLEVBQUUsS0FBSyxHQUFHLENBQUM7UUFDeEIsT0FBTyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsRUFBRSxLQUFLLENBQUMsQ0FBQztJQUN6QixDQUFDOztBQVhELGtCQUFrQjtBQUNGLGFBQVMsR0FBRyxLQUFLLENBQUM7QUFZcEMsYUFBYSxDQUFDLGFBQWEsQ0FBQyxHQUFHLENBQUMsQ0FBQztBQUVqQzs7Ozs7O0dBTUc7QUFDSCxNQUFNLE9BQU8sSUFBSyxTQUFRLFVBQVU7SUFHbEMsS0FBSyxDQUFDLENBQVM7UUFDYixPQUFPLEdBQUcsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUM7SUFDckIsQ0FBQzs7QUFKRCxrQkFBa0I7QUFDRixjQUFTLEdBQUcsTUFBTSxDQUFDO0FBS3JDLGFBQWEsQ0FBQyxhQUFhLENBQUMsSUFBSSxDQUFDLENBQUM7QUFFbEM7O0dBRUc7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b3B5cmlnaHQgMjAxOCBHb29nbGUgTExDXG4gKlxuICogVXNlIG9mIHRoaXMgc291cmNlIGNvZGUgaXMgZ292ZXJuZWQgYnkgYW4gTUlULXN0eWxlXG4gKiBsaWNlbnNlIHRoYXQgY2FuIGJlIGZvdW5kIGluIHRoZSBMSUNFTlNFIGZpbGUgb3IgYXRcbiAqIGh0dHBzOi8vb3BlbnNvdXJjZS5vcmcvbGljZW5zZXMvTUlULlxuICogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbiAqL1xuXG4vLyBMYXllciBhY3RpdmF0aW9uIGZ1bmN0aW9uc1xuaW1wb3J0ICogYXMgdGZjIGZyb20gJ0B0ZW5zb3JmbG93L3RmanMtY29yZSc7XG5pbXBvcnQge3NlcmlhbGl6YXRpb24sIFRlbnNvciwgdGlkeX0gZnJvbSAnQHRlbnNvcmZsb3cvdGZqcy1jb3JlJztcbmltcG9ydCAqIGFzIEsgZnJvbSAnLi9iYWNrZW5kL3RmanNfYmFja2VuZCc7XG5pbXBvcnQge0FjdGl2YXRpb25JZGVudGlmaWVyfSBmcm9tICcuL2tlcmFzX2Zvcm1hdC9hY3RpdmF0aW9uX2NvbmZpZyc7XG5pbXBvcnQge2Rlc2VyaWFsaXplS2VyYXNPYmplY3R9IGZyb20gJy4vdXRpbHMvZ2VuZXJpY191dGlscyc7XG5cbi8qKlxuICogQmFzZSBjbGFzcyBmb3IgQWN0aXZhdGlvbnMuXG4gKlxuICogU3BlY2lhbCBub3RlOiBkdWUgdG8gY3Jvc3MtbGFuZ3VhZ2UgY29tcGF0aWJpbGl0eSByZWFzb25zLCB0aGVcbiAqIHN0YXRpYyByZWFkb25seSBjbGFzc05hbWUgZmllbGQgaW4gdGhpcyBmYW1pbHkgb2YgY2xhc3NlcyBtdXN0IGJlIHNldCB0b1xuICogdGhlIGluaXRpYWxMb3dlckNhbWVsQ2FzZSBuYW1lIG9mIHRoZSBhY3RpdmF0aW9uLlxuICovXG5leHBvcnQgYWJzdHJhY3QgY2xhc3MgQWN0aXZhdGlvbiBleHRlbmRzIHNlcmlhbGl6YXRpb24uU2VyaWFsaXphYmxlIHtcbiAgYWJzdHJhY3QgYXBwbHkodGVuc29yOiBUZW5zb3IsIGF4aXM/OiBudW1iZXIpOiBUZW5zb3I7XG4gIGdldENvbmZpZygpOiBzZXJpYWxpemF0aW9uLkNvbmZpZ0RpY3Qge1xuICAgIHJldHVybiB7fTtcbiAgfVxufVxuXG4vKipcbiAqIEV4cG9uZW50aWFsIGxpbmVhciB1bml0IChFTFUpLlxuICogUmVmZXJlbmNlOiBodHRwczovL2FyeGl2Lm9yZy9hYnMvMTUxMS4wNzI4OVxuICovXG5leHBvcnQgY2xhc3MgRWx1IGV4dGVuZHMgQWN0aXZhdGlvbiB7XG4gIC8qKiBAbm9jb2xsYXBzZSAqL1xuICBzdGF0aWMgcmVhZG9ubHkgY2xhc3NOYW1lID0gJ2VsdSc7XG4gIC8qKlxuICAgKiBDYWxjdWxhdGUgdGhlIGFjdGl2YXRpb24gZnVuY3Rpb24uXG4gICAqXG4gICAqIEBwYXJhbSB4OiBJbnB1dC5cbiAgICogQHBhcmFtIGFscGhhOiBTY2FsaW5nIGZhY3RvciB0aGUgbmVnYXRpdmUgc2VjdGlvbi5cbiAgICogQHJldHVybiBPdXRwdXQgb2YgdGhlIEVMVSBhY3RpdmF0aW9uLlxuICAgKi9cbiAgYXBwbHkoeDogVGVuc29yLCBhbHBoYSA9IDEpOiBUZW5zb3Ige1xuICAgIHJldHVybiBLLmVsdSh4LCBhbHBoYSk7XG4gIH1cbn1cbnNlcmlhbGl6YXRpb24ucmVnaXN0ZXJDbGFzcyhFbHUpO1xuXG4vKipcbiAqIFNjYWxlZCBFeHBvbmVudGlhbCBMaW5lYXIgVW5pdC4gKEtsYW1iYXVlciBldCBhbC4sIDIwMTcpLlxuICogUmVmZXJlbmNlOiBTZWxmLU5vcm1hbGl6aW5nIE5ldXJhbCBOZXR3b3JrcywgaHR0cHM6Ly9hcnhpdi5vcmcvYWJzLzE3MDYuMDI1MTVcbiAqIE5vdGVzOlxuICogICAtIFRvIGJlIHVzZWQgdG9nZXRoZXIgd2l0aCB0aGUgaW5pdGlhbGl6YXRpb24gXCJsZWN1bk5vcm1hbFwiLlxuICogICAtIFRvIGJlIHVzZWQgdG9nZXRoZXIgd2l0aCB0aGUgZHJvcG91dCB2YXJpYW50IFwiQWxwaGFEcm9wb3V0XCIuXG4gKi9cbmV4cG9ydCBjbGFzcyBTZWx1IGV4dGVuZHMgQWN0aXZhdGlvbiB7XG4gIC8qKiBAbm9jb2xsYXBzZSAqL1xuICBzdGF0aWMgcmVhZG9ubHkgY2xhc3NOYW1lID0gJ3NlbHUnO1xuICBhcHBseSh4OiBUZW5zb3IpOiBUZW5zb3Ige1xuICAgIHJldHVybiB0ZmMuc2VsdSh4KTtcbiAgfVxufVxuc2VyaWFsaXphdGlvbi5yZWdpc3RlckNsYXNzKFNlbHUpO1xuXG4vKipcbiAqICBSZWN0aWZpZWQgbGluZWFyIHVuaXRcbiAqL1xuZXhwb3J0IGNsYXNzIFJlbHUgZXh0ZW5kcyBBY3RpdmF0aW9uIHtcbiAgLyoqIEBub2NvbGxhcHNlICovXG4gIHN0YXRpYyByZWFkb25seSBjbGFzc05hbWUgPSAncmVsdSc7XG4gIGFwcGx5KHg6IFRlbnNvcik6IFRlbnNvciB7XG4gICAgcmV0dXJuIHRmYy5yZWx1KHgpO1xuICB9XG59XG5zZXJpYWxpemF0aW9uLnJlZ2lzdGVyQ2xhc3MoUmVsdSk7XG5cbi8qKlxuICogUmVjdGlmaWVkIGxpbmVhciB1bml0IGFjdGl2YXRpb24gbWF4aW5nIG91dCBhdCA2LjAuXG4gKi9cbmV4cG9ydCBjbGFzcyBSZWx1NiBleHRlbmRzIEFjdGl2YXRpb24ge1xuICAvKiogQG5vY29sbGFwc2UgKi9cbiAgc3RhdGljIHJlYWRvbmx5IGNsYXNzTmFtZSA9ICdyZWx1Nic7XG4gIGFwcGx5KHg6IFRlbnNvcik6IFRlbnNvciB7XG4gICAgcmV0dXJuIHRpZHkoKCkgPT4gdGZjLm1pbmltdW0oNi4wLCB0ZmMucmVsdSh4KSkpO1xuICB9XG59XG5zZXJpYWxpemF0aW9uLnJlZ2lzdGVyQ2xhc3MoUmVsdTYpO1xuXG4vLyogTGluZWFyIGFjdGl2YXRpb24gKG5vLW9wKSAqL1xuZXhwb3J0IGNsYXNzIExpbmVhciBleHRlbmRzIEFjdGl2YXRpb24ge1xuICAvKiogQG5vY29sbGFwc2UgKi9cbiAgc3RhdGljIHJlYWRvbmx5IGNsYXNzTmFtZSA9ICdsaW5lYXInO1xuICBhcHBseSh4OiBUZW5zb3IpOiBUZW5zb3Ige1xuICAgIHJldHVybiB4O1xuICB9XG59XG5zZXJpYWxpemF0aW9uLnJlZ2lzdGVyQ2xhc3MoTGluZWFyKTtcblxuLyoqXG4gKiBTaWdtb2lkIGFjdGl2YXRpb24gZnVuY3Rpb24uXG4gKi9cbmV4cG9ydCBjbGFzcyBTaWdtb2lkIGV4dGVuZHMgQWN0aXZhdGlvbiB7XG4gIC8qKiBAbm9jb2xsYXBzZSAqL1xuICBzdGF0aWMgcmVhZG9ubHkgY2xhc3NOYW1lID0gJ3NpZ21vaWQnO1xuICBhcHBseSh4OiBUZW5zb3IpOiBUZW5zb3Ige1xuICAgIHJldHVybiB0ZmMuc2lnbW9pZCh4KTtcbiAgfVxufVxuc2VyaWFsaXphdGlvbi5yZWdpc3RlckNsYXNzKFNpZ21vaWQpO1xuXG4vKipcbiAqIFNlZ21lbnQtd2lzZSBsaW5lYXIgYXBwcm94aW1hdGlvbiBvZiBzaWdtb2lkLlxuICovXG5leHBvcnQgY2xhc3MgSGFyZFNpZ21vaWQgZXh0ZW5kcyBBY3RpdmF0aW9uIHtcbiAgLyoqIEBub2NvbGxhcHNlICovXG4gIHN0YXRpYyByZWFkb25seSBjbGFzc05hbWUgPSAnaGFyZFNpZ21vaWQnO1xuICBhcHBseSh4OiBUZW5zb3IpOiBUZW5zb3Ige1xuICAgIHJldHVybiBLLmhhcmRTaWdtb2lkKHgpO1xuICB9XG59XG5zZXJpYWxpemF0aW9uLnJlZ2lzdGVyQ2xhc3MoSGFyZFNpZ21vaWQpO1xuXG4vKipcbiAqIFNvZnRwbHVzIGFjdGl2YXRpb24gZnVuY3Rpb24uXG4gKi9cbmV4cG9ydCBjbGFzcyBTb2Z0cGx1cyBleHRlbmRzIEFjdGl2YXRpb24ge1xuICAvKiogQG5vY29sbGFwc2UgKi9cbiAgc3RhdGljIHJlYWRvbmx5IGNsYXNzTmFtZSA9ICdzb2Z0cGx1cyc7XG4gIGFwcGx5KHg6IFRlbnNvcik6IFRlbnNvciB7XG4gICAgcmV0dXJuIHRmYy5zb2Z0cGx1cyh4KTtcbiAgfVxufVxuc2VyaWFsaXphdGlvbi5yZWdpc3RlckNsYXNzKFNvZnRwbHVzKTtcblxuLyoqXG4gKiBTb2Z0c2lnbiBhY3RpdmF0aW9uIGZ1bmN0aW9uLlxuICovXG5leHBvcnQgY2xhc3MgU29mdHNpZ24gZXh0ZW5kcyBBY3RpdmF0aW9uIHtcbiAgLyoqIEBub2NvbGxhcHNlICovXG4gIHN0YXRpYyByZWFkb25seSBjbGFzc05hbWUgPSAnc29mdHNpZ24nO1xuICBhcHBseSh4OiBUZW5zb3IpOiBUZW5zb3Ige1xuICAgIHJldHVybiBLLnNvZnRzaWduKHgpO1xuICB9XG59XG5zZXJpYWxpemF0aW9uLnJlZ2lzdGVyQ2xhc3MoU29mdHNpZ24pO1xuXG4vKipcbiAqIEh5cGVyYm9saWMgdGFuZ2VudCBmdW5jdGlvbi5cbiAqL1xuZXhwb3J0IGNsYXNzIFRhbmggZXh0ZW5kcyBBY3RpdmF0aW9uIHtcbiAgLyoqIEBub2NvbGxhcHNlICovXG4gIHN0YXRpYyByZWFkb25seSBjbGFzc05hbWUgPSAndGFuaCc7XG4gIGFwcGx5KHg6IFRlbnNvcik6IFRlbnNvciB7XG4gICAgcmV0dXJuIHRmYy50YW5oKHgpO1xuICB9XG59XG5zZXJpYWxpemF0aW9uLnJlZ2lzdGVyQ2xhc3MoVGFuaCk7XG5cbi8qKlxuICogU29mdG1heCBhY3RpdmF0aW9uIGZ1bmN0aW9uXG4gKi9cbmV4cG9ydCBjbGFzcyBTb2Z0bWF4IGV4dGVuZHMgQWN0aXZhdGlvbiB7XG4gIC8qKiBAbm9jb2xsYXBzZSAqL1xuICBzdGF0aWMgcmVhZG9ubHkgY2xhc3NOYW1lID0gJ3NvZnRtYXgnO1xuICAvKipcbiAgICogQ2FsY3VsYXRlIHRoZSBhY3RpdmF0aW9uIGZ1bmN0aW9uLlxuICAgKlxuICAgKiBAcGFyYW0geCBUZW5zb3IuXG4gICAqIEBwYXJhbSBheGlzIEludGVnZXIsIGF4aXMgYWxvbmcgd2hpY2ggdGhlIHNvZnRtYXggbm9ybWFsaXphdGlvbiBpcyBhcHBsaWVkLlxuICAgKiBJbnZhbGlkIGlmIDwgMiwgYXMgc29mdG1heCBhY3Jvc3MgMSAodGhlIGJhdGNoIGRpbWVuc2lvbikgaXMgYXNzdW1lZCB0byBiZVxuICAgKiBhbiBlcnJvci5cbiAgICpcbiAgICogQHJldHVybnMgYSBUZW5zb3Igb2YgdGhlIHNhbWUgc2hhcGUgYXMgeFxuICAgKlxuICAgKiBAdGhyb3dzIFZhbHVlRXJyb3I6IEluIGNhc2UgYGRpbSh4KSA8IDJgLlxuICAgKi9cbiAgYXBwbHkoeDogVGVuc29yLCBheGlzOiBudW1iZXIgPSAoLTEpKTogVGVuc29yIHtcbiAgICByZXR1cm4gdGZjLnNvZnRtYXgoeCwgYXhpcyk7XG4gIH1cbn1cbnNlcmlhbGl6YXRpb24ucmVnaXN0ZXJDbGFzcyhTb2Z0bWF4KTtcblxuLyoqXG4gKiBMb2cgc29mdG1heCBhY3RpdmF0aW9uIGZ1bmN0aW9uXG4gKi9cbmV4cG9ydCBjbGFzcyBMb2dTb2Z0bWF4IGV4dGVuZHMgQWN0aXZhdGlvbiB7XG4gIC8qKiBAbm9jb2xsYXBzZSAqL1xuICBzdGF0aWMgcmVhZG9ubHkgY2xhc3NOYW1lID0gJ2xvZ1NvZnRtYXgnO1xuICAvKipcbiAgICogQ2FsY3VsYXRlIHRoZSBhY3RpdmF0aW9uIGZ1bmN0aW9uIG9mIGxvZyBzb2Z0bWF4OlxuICAgKiBsb2coIGV4cCh4X2kpIC8gc3VtKGV4cCh4KSkgKVxuICAgKlxuICAgKiBAcGFyYW0geCBUZW5zb3IuXG4gICAqIEBwYXJhbSBheGlzIEludGVnZXIsIGF4aXMgYWxvbmcgd2hpY2ggdGhlIHNvZnRtYXggbm9ybWFsaXphdGlvbiBpcyBhcHBsaWVkLlxuICAgKiBJbnZhbGlkIGlmIDwgMiwgYXMgc29mdG1heCBhY3Jvc3MgMSAodGhlIGJhdGNoIGRpbWVuc2lvbikgaXMgYXNzdW1lZCB0byBiZVxuICAgKiBhbiBlcnJvci5cbiAgICpcbiAgICogQHJldHVybnMgYSBUZW5zb3Igb2YgdGhlIHNhbWUgc2hhcGUgYXMgeFxuICAgKlxuICAgKiBAdGhyb3dzIFZhbHVlRXJyb3I6IEluIGNhc2UgYGRpbSh4KSA8IDJgLlxuICAgKi9cbiAgYXBwbHkoeDogVGVuc29yLCBheGlzOiBudW1iZXIgPSAoLTEpKTogVGVuc29yIHtcbiAgICByZXR1cm4gdGZjLmxvZ1NvZnRtYXgoeCwgYXhpcyk7XG4gIH1cbn1cbnNlcmlhbGl6YXRpb24ucmVnaXN0ZXJDbGFzcyhMb2dTb2Z0bWF4KTtcblxuLyoqXG4gKiBTd2lzaCBhY3RpdmF0aW9uIGZ1bmN0aW9uXG4gKi9cbmV4cG9ydCBjbGFzcyBTd2lzaCBleHRlbmRzIEFjdGl2YXRpb24ge1xuICAvKiogQG5vY29sbGFwc2UgKi9cbiAgc3RhdGljIHJlYWRvbmx5IGNsYXNzTmFtZSA9ICdzd2lzaCc7XG4gIC8qKlxuICAgKiBDYWxjdWxhdGUgdGhlIGFjdGl2YXRpb24gZnVuY3Rpb24uXG4gICAqXG4gICAqIEBwYXJhbSB4IFRlbnNvci5cbiAgICogQHBhcmFtIGFscGhhIFNjYWxpbmcgZmFjdG9yIGZvciB0aGUgc2lnbW9pZCBmdW5jdGlvbi5cbiAgICogQHJldHVybnMgYSBUZW5zb3Igb2YgdGhlIHNhbWUgc2hhcGUgYXMgeFxuICAgKi9cbiAgYXBwbHkoeDogVGVuc29yLCBhbHBoYSA9IDEpOiBUZW5zb3Ige1xuICAgIHJldHVybiB0aWR5KCgpID0+IHRmYy5tdWwodGZjLnNpZ21vaWQodGZjLm11bCh4LCBhbHBoYSkpLCB4KSk7XG4gIH1cbn1cbnNlcmlhbGl6YXRpb24ucmVnaXN0ZXJDbGFzcyhTd2lzaCk7XG5cbi8qKlxuICogTWlzaCBhY3RpdmF0aW9uIGZ1bmN0aW9uXG4gKi9cbmV4cG9ydCBjbGFzcyBNaXNoIGV4dGVuZHMgQWN0aXZhdGlvbiB7XG4gIC8qKiBAbm9jb2xsYXBzZSAqL1xuICBzdGF0aWMgcmVhZG9ubHkgY2xhc3NOYW1lID0gJ21pc2gnO1xuICAvKipcbiAgICogQ2FsY3VsYXRlIHRoZSBhY3RpdmF0aW9uIGZ1bmN0aW9uLlxuICAgKlxuICAgKiBAcGFyYW0geCBUZW5zb3IuXG4gICAqIEByZXR1cm5zIGEgVGVuc29yIG9mIHRoZSBzYW1lIHNoYXBlIGFzIHhcbiAgICovXG4gIGFwcGx5KHg6IFRlbnNvcik6IFRlbnNvciB7XG4gICAgcmV0dXJuIHRpZHkoKCkgPT4gdGZjLm11bCh4LCB0ZmMudGFuaCh0ZmMuc29mdHBsdXMoeCkpKSk7XG4gIH1cbn1cbnNlcmlhbGl6YXRpb24ucmVnaXN0ZXJDbGFzcyhNaXNoKTtcblxuZXhwb3J0IGZ1bmN0aW9uIHNlcmlhbGl6ZUFjdGl2YXRpb24oYWN0aXZhdGlvbjogQWN0aXZhdGlvbik6IHN0cmluZyB7XG4gIHJldHVybiBhY3RpdmF0aW9uLmdldENsYXNzTmFtZSgpO1xufVxuXG5leHBvcnQgZnVuY3Rpb24gZGVzZXJpYWxpemVBY3RpdmF0aW9uKFxuICAgIGNvbmZpZzogc2VyaWFsaXphdGlvbi5Db25maWdEaWN0LFxuICAgIGN1c3RvbU9iamVjdHM6IHNlcmlhbGl6YXRpb24uQ29uZmlnRGljdCA9IHt9KTogQWN0aXZhdGlvbiB7XG4gIHJldHVybiBkZXNlcmlhbGl6ZUtlcmFzT2JqZWN0KFxuICAgICAgY29uZmlnLCBzZXJpYWxpemF0aW9uLlNlcmlhbGl6YXRpb25NYXAuZ2V0TWFwKCkuY2xhc3NOYW1lTWFwLFxuICAgICAgY3VzdG9tT2JqZWN0cywgJ2FjdGl2YXRpb24nKTtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGdldEFjdGl2YXRpb24oaWRlbnRpZmllcjogQWN0aXZhdGlvbklkZW50aWZpZXJ8XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZXJpYWxpemF0aW9uLkNvbmZpZ0RpY3R8QWN0aXZhdGlvbik6IEFjdGl2YXRpb24ge1xuICBpZiAoaWRlbnRpZmllciA9PSBudWxsKSB7XG4gICAgY29uc3QgY29uZmlnOiBzZXJpYWxpemF0aW9uLkNvbmZpZ0RpY3QgPSB7fTtcbiAgICBjb25maWdbJ2NsYXNzTmFtZSddID0gJ2xpbmVhcic7XG4gICAgY29uZmlnWydjb25maWcnXSA9IHt9O1xuICAgIHJldHVybiBkZXNlcmlhbGl6ZUFjdGl2YXRpb24oY29uZmlnKTtcbiAgfVxuICBpZiAodHlwZW9mIGlkZW50aWZpZXIgPT09ICdzdHJpbmcnKSB7XG4gICAgY29uc3QgY29uZmlnOiBzZXJpYWxpemF0aW9uLkNvbmZpZ0RpY3QgPSB7fTtcbiAgICBjb25maWdbJ2NsYXNzTmFtZSddID0gaWRlbnRpZmllcjtcbiAgICBjb25maWdbJ2NvbmZpZyddID0ge307XG4gICAgcmV0dXJuIGRlc2VyaWFsaXplQWN0aXZhdGlvbihjb25maWcpO1xuICB9IGVsc2UgaWYgKGlkZW50aWZpZXIgaW5zdGFuY2VvZiBBY3RpdmF0aW9uKSB7XG4gICAgcmV0dXJuIGlkZW50aWZpZXI7XG4gIH0gZWxzZSB7XG4gICAgcmV0dXJuIGRlc2VyaWFsaXplQWN0aXZhdGlvbihpZGVudGlmaWVyKTtcbiAgfVxufVxuIl19","/**\n * @license\n * Copyright 2018 Google LLC\n *\n * Use of this source code is governed by an MIT-style\n * license that can be found in the LICENSE file or at\n * https://opensource.org/licenses/MIT.\n * =============================================================================\n */\n/* original source: keras/regularizers.py */\nimport * as tfc from '@tensorflow/tfjs-core';\nimport { abs, add, serialization, sum, tidy, zeros } from '@tensorflow/tfjs-core';\nimport * as K from './backend/tfjs_backend';\nimport { deserializeKerasObject, serializeKerasObject } from './utils/generic_utils';\nfunction assertObjectArgs(args) {\n if (args != null && typeof args !== 'object') {\n throw new Error(`Argument to L1L2 regularizer's constructor is expected to be an ` +\n `object, but received: ${args}`);\n }\n}\n/**\n * Regularizer base class.\n */\nexport class Regularizer extends serialization.Serializable {\n}\nexport class L1L2 extends Regularizer {\n constructor(args) {\n super();\n assertObjectArgs(args);\n this.l1 = args == null || args.l1 == null ? 0.01 : args.l1;\n this.l2 = args == null || args.l2 == null ? 0.01 : args.l2;\n this.hasL1 = this.l1 !== 0;\n this.hasL2 = this.l2 !== 0;\n }\n /**\n * Porting note: Renamed from __call__.\n * @param x Variable of which to calculate the regularization score.\n */\n apply(x) {\n return tidy(() => {\n let regularization = zeros([1]);\n if (this.hasL1) {\n regularization = add(regularization, sum(tfc.mul(this.l1, abs(x))));\n }\n if (this.hasL2) {\n regularization =\n add(regularization, sum(tfc.mul(this.l2, K.square(x))));\n }\n return tfc.reshape(regularization, []);\n });\n }\n getConfig() {\n return { 'l1': this.l1, 'l2': this.l2 };\n }\n /** @nocollapse */\n static fromConfig(cls, config) {\n return new cls({ l1: config['l1'], l2: config['l2'] });\n }\n}\n/** @nocollapse */\nL1L2.className = 'L1L2';\nserialization.registerClass(L1L2);\nexport function l1(args) {\n assertObjectArgs(args);\n return new L1L2({ l1: args != null ? args.l1 : null, l2: 0 });\n}\nexport function l2(args) {\n assertObjectArgs(args);\n return new L1L2({ l2: args != null ? args.l2 : null, l1: 0 });\n}\n// Maps the JavaScript-like identifier keys to the corresponding keras symbols.\nexport const REGULARIZER_IDENTIFIER_REGISTRY_SYMBOL_MAP = {\n 'l1l2': 'L1L2'\n};\nexport function serializeRegularizer(constraint) {\n return serializeKerasObject(constraint);\n}\nexport function deserializeRegularizer(config, customObjects = {}) {\n return deserializeKerasObject(config, serialization.SerializationMap.getMap().classNameMap, customObjects, 'regularizer');\n}\nexport function getRegularizer(identifier) {\n if (identifier == null) {\n return null;\n }\n if (typeof identifier === 'string') {\n const className = identifier in REGULARIZER_IDENTIFIER_REGISTRY_SYMBOL_MAP ?\n REGULARIZER_IDENTIFIER_REGISTRY_SYMBOL_MAP[identifier] :\n identifier;\n const config = { className, config: {} };\n return deserializeRegularizer(config);\n }\n else if (identifier instanceof Regularizer) {\n return identifier;\n }\n else {\n return deserializeRegularizer(identifier);\n }\n}\n//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicmVndWxhcml6ZXJzLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vdGZqcy1sYXllcnMvc3JjL3JlZ3VsYXJpemVycy50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQTs7Ozs7Ozs7R0FRRztBQUVILDRDQUE0QztBQUU1QyxPQUFPLEtBQUssR0FBRyxNQUFNLHVCQUF1QixDQUFDO0FBQzdDLE9BQU8sRUFBQyxHQUFHLEVBQUUsR0FBRyxFQUFVLGFBQWEsRUFBRSxHQUFHLEVBQVUsSUFBSSxFQUFFLEtBQUssRUFBQyxNQUFNLHVCQUF1QixDQUFDO0FBQ2hHLE9BQU8sS0FBSyxDQUFDLE1BQU0sd0JBQXdCLENBQUM7QUFDNUMsT0FBTyxFQUFDLHNCQUFzQixFQUFFLG9CQUFvQixFQUFDLE1BQU0sdUJBQXVCLENBQUM7QUFFbkYsU0FBUyxnQkFBZ0IsQ0FBQyxJQUE0QjtJQUNwRCxJQUFJLElBQUksSUFBSSxJQUFJLElBQUksT0FBTyxJQUFJLEtBQUssUUFBUSxFQUFFO1FBQzVDLE1BQU0sSUFBSSxLQUFLLENBQ1gsa0VBQWtFO1lBQ2xFLHlCQUF5QixJQUFJLEVBQUUsQ0FBQyxDQUFDO0tBQ3RDO0FBQ0gsQ0FBQztBQUVEOztHQUVHO0FBQ0gsTUFBTSxPQUFnQixXQUFZLFNBQVEsYUFBYSxDQUFDLFlBQVk7Q0FFbkU7QUFtQkQsTUFBTSxPQUFPLElBQUssU0FBUSxXQUFXO0lBUW5DLFlBQVksSUFBZTtRQUN6QixLQUFLLEVBQUUsQ0FBQztRQUVSLGdCQUFnQixDQUFDLElBQUksQ0FBQyxDQUFDO1FBRXZCLElBQUksQ0FBQyxFQUFFLEdBQUcsSUFBSSxJQUFJLElBQUksSUFBSSxJQUFJLENBQUMsRUFBRSxJQUFJLElBQUksQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsRUFBRSxDQUFDO1FBQzNELElBQUksQ0FBQyxFQUFFLEdBQUcsSUFBSSxJQUFJLElBQUksSUFBSSxJQUFJLENBQUMs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QUFDLFlBQVksRUFDNUQsYUFBYSxFQUFFLGFBQWEsQ0FBQyxDQUFDO0FBQ3BDLENBQUM7QUFFRCxNQUFNLFVBQVUsY0FBYyxDQUFDLFVBRVc7SUFDeEMsSUFBSSxVQUFVLElBQUksSUFBSSxFQUFFO1FBQ3RCLE9BQU8sSUFBSSxDQUFDO0tBQ2I7SUFDRCxJQUFJLE9BQU8sVUFBVSxLQUFLLFFBQVEsRUFBRTtRQUNsQyxNQUFNLFNBQVMsR0FBRyxVQUFVLElBQUksMENBQTBDLENBQUMsQ0FBQztZQUN4RSwwQ0FBMEMsQ0FBQyxVQUFVLENBQUMsQ0FBQyxDQUFDO1lBQ3hELFVBQVUsQ0FBQztRQUNmLE1BQU0sTUFBTSxHQUFHLEVBQUMsU0FBUyxFQUFFLE1BQU0sRUFBRSxFQUFFLEVBQUMsQ0FBQztRQUN2QyxPQUFPLHNCQUFzQixDQUFDLE1BQU0sQ0FBQyxDQUFDO0tBQ3ZDO1NBQU0sSUFBSSxVQUFVLFlBQVksV0FBVyxFQUFFO1FBQzVDLE9BQU8sVUFBVSxDQUFDO0tBQ25CO1NBQU07UUFDTCxPQUFPLHNCQUFzQixDQUFDLFVBQVUsQ0FBQyxDQUFDO0tBQzNDO0FBQ0gsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbIi8qKlxuICogQGxpY2Vuc2VcbiAqIENvcHlyaWdodCAyMDE4IEdvb2dsZSBMTENcbiAqXG4gKiBVc2Ugb2YgdGhpcyBzb3VyY2UgY29kZSBpcyBnb3Zlcm5lZCBieSBhbiBNSVQtc3R5bGVcbiAqIGxpY2Vuc2UgdGhhdCBjYW4gYmUgZm91bmQgaW4gdGhlIExJQ0VOU0UgZmlsZSBvciBhdFxuICogaHR0cHM6Ly9vcGVuc291cmNlLm9yZy9saWNlbnNlcy9NSVQuXG4gKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuICovXG5cbi8qIG9yaWdpbmFsIHNvdXJjZToga2VyYXMvcmVndWxhcml6ZXJzLnB5ICovXG5cbmltcG9ydCAqIGFzIHRmYyBmcm9tICdAdGVuc29yZmxvdy90ZmpzLWNvcmUnO1xuaW1wb3J0IHthYnMsIGFkZCwgU2NhbGFyLCBzZXJpYWxpemF0aW9uLCBzdW0sIFRlbnNvciwgdGlkeSwgemVyb3N9IGZyb20gJ0B0ZW5zb3JmbG93L3RmanMtY29yZSc7XG5pbXBvcnQgKiBhcyBLIGZyb20gJy4vYmFja2VuZC90ZmpzX2JhY2tlbmQnO1xuaW1wb3J0IHtkZXNlcmlhbGl6ZUtlcmFzT2JqZWN0LCBzZXJpYWxpemVLZXJhc09iamVjdH0gZnJvbSAnLi91dGlscy9nZW5lcmljX3V0aWxzJztcblxuZnVuY3Rpb24gYXNzZXJ0T2JqZWN0QXJncyhhcmdzOiBMMUFyZ3N8TDJBcmdzfEwxTDJBcmdzKTogdm9pZCB7XG4gIGlmIChhcmdzICE9IG51bGwgJiYgdHlwZW9mIGFyZ3MgIT09ICdvYmplY3QnKSB7XG4gICAgdGhyb3cgbmV3IEVycm9yKFxuICAgICAgICBgQXJndW1lbnQgdG8gTDFMMiByZWd1bGFyaXplcidzIGNvbnN0cnVjdG9yIGlzIGV4cGVjdGVkIHRvIGJlIGFuIGAgK1xuICAgICAgICBgb2JqZWN0LCBidXQgcmVjZWl2ZWQ6ICR7YXJnc31gKTtcbiAgfVxufVxuXG4vKipcbiAqIFJlZ3VsYXJpemVyIGJhc2UgY2xhc3MuXG4gKi9cbmV4cG9ydCBhYnN0cmFjdCBjbGFzcyBSZWd1bGFyaXplciBleHRlbmRzIHNlcmlhbGl6YXRpb24uU2VyaWFsaXphYmxlIHtcbiAgYWJzdHJhY3QgYXBwbHkoeDogVGVuc29yKTogU2NhbGFyO1xufVxuXG5leHBvcnQgaW50ZXJmYWNlIEwxTDJBcmdzIHtcbiAgLyoqIEwxIHJlZ3VsYXJpemF0aW9uIHJhdGUuIERlZmF1bHRzIHRvIDAuMDEuICovXG4gIGwxPzogbnVtYmVyO1xuICAvKiogTDIgcmVndWxhcml6YXRpb24gcmF0ZS4gRGVmYXVsdHMgdG8gMC4wMS4gKi9cbiAgbDI/OiBudW1iZXI7XG59XG5cbmV4cG9ydCBpbnRlcmZhY2UgTDFBcmdzIHtcbiAgLyoqIEwxIHJlZ3VsYXJpemF0aW9uIHJhdGUuIERlZmF1bHRzIHRvIDAuMDEuICovXG4gIGwxOiBudW1iZXI7XG59XG5cbmV4cG9ydCBpbnRlcmZhY2UgTDJBcmdzIHtcbiAgLyoqIEwyIHJlZ3VsYXJpemF0aW9uIHJhdGUuIERlZmF1bHRzIHRvIDAuMDEuICovXG4gIGwyOiBudW1iZXI7XG59XG5cbmV4cG9ydCBjbGFzcyBMMUwyIGV4dGVuZHMgUmVndWxhcml6ZXIge1xuICAvKiogQG5vY29sbGFwc2UgKi9cbiAgc3RhdGljIGNsYXNzTmFtZSA9ICdMMUwyJztcblxuICBwcml2YXRlIHJlYWRvbmx5IGwxOiBudW1iZXI7XG4gIHByaXZhdGUgcmVhZG9ubHkgbDI6IG51bWJlcjtcbiAgcHJpdmF0ZSByZWFkb25seSBoYXNMMTogYm9vbGVhbjtcbiAgcHJpdmF0ZSByZWFkb25seSBoYXNMMjogYm9vbGVhbjtcbiAgY29uc3RydWN0b3IoYXJncz86IEwxTDJBcmdzKSB7XG4gICAgc3VwZXIoKTtcblxuICAgIGFzc2VydE9iamVjdEFyZ3MoYXJncyk7XG5cbiAgICB0aGlzLmwxID0gYXJncyA9PSBudWxsIHx8IGFyZ3MubDEgPT0gbnVsbCA/IDAuMDEgOiBhcmdzLmwxO1xuICAgIHRoaXMubDIgPSBhcmdzID09IG51bGwgfHwgYXJncy5sMiA9PSBudWxsID8gMC4wMSA6IGFyZ3MubDI7XG4gICAgdGhpcy5oYXNMMSA9IHRoaXMubDEgIT09IDA7XG4gICAgdGhpcy5oYXNMMiA9IHRoaXMubDIgIT09IDA7XG4gIH1cblxuICAvKipcbiAgICogUG9ydGluZyBub3RlOiBSZW5hbWVkIGZyb20gX19jYWxsX18uXG4gICAqIEBwYXJhbSB4IFZhcmlhYmxlIG9mIHdoaWNoIHRvIGNhbGN1bGF0ZSB0aGUgcmVndWxhcml6YXRpb24gc2NvcmUuXG4gICAqL1xuICBhcHBseSh4OiBUZW5zb3IpOiBTY2FsYXIge1xuICAgIHJldHVybiB0aWR5KCgpID0+IHtcbiAgICAgIGxldCByZWd1bGFyaXphdGlvbjogVGVuc29yID0gemVyb3MoWzFdKTtcbiAgICAgIGlmICh0aGlzLmhhc0wxKSB7XG4gICAgICAgIHJlZ3VsYXJpemF0aW9uID0gYWRkKHJlZ3VsYXJpemF0aW9uLCBzdW0odGZjLm11bCh0aGlzLmwxLCBhYnMoeCkpKSk7XG4gICAgICB9XG4gICAgICBpZiAodGhpcy5oYXNMMikge1xuICAgICAgICByZWd1bGFyaXphdGlvbiA9XG4gICAgICAgICAgICBhZGQocmVndWxhcml6YXRpb24sIHN1bSh0ZmMubXVsKHRoaXMubDIsIEsuc3F1YXJlKHgpKSkpO1xuICAgICAgfVxuICAgICAgcmV0dXJuIHRmYy5yZXNoYXBlKHJlZ3VsYXJpemF0aW9uLCBbXSk7XG4gICAgfSk7XG4gIH1cblxuICBnZXRDb25maWcoKTogc2VyaWFsaXphdGlvbi5Db25maWdEaWN0IHtcbiAgICByZXR1cm4geydsMSc6IHRoaXMubDEsICdsMic6IHRoaXMubDJ9O1xuICB9XG5cbiAgLyoqIEBub2NvbGxhcHNlICovXG4gIHN0YXRpYyBmcm9tQ29uZmlnPFQgZXh0ZW5kcyBzZXJpYWxpemF0aW9uLlNlcmlhbGl6YWJsZT4oXG4gICAgICBjbHM6IHNlcmlhbGl6YXRpb24uU2VyaWFsaXphYmxlQ29uc3RydWN0b3I8VD4sXG4gICAgICBjb25maWc6IHNlcmlhbGl6YXRpb24uQ29uZmlnRGljdCk6IFQge1xuICAgIHJldHVybiBuZXcgY2xzKHtsMTogY29uZmlnWydsMSddIGFzIG51bWJlciwgbDI6IGNvbmZpZ1snbDInXSBhcyBudW1iZXJ9KTtcbiAgfVxufVxuc2VyaWFsaXphdGlvbi5yZWdpc3RlckNsYXNzKEwxTDIpO1xuXG5leHBvcnQgZnVuY3Rpb24gbDEoYXJncz86IEwxQXJncykge1xuICBhc3NlcnRPYmplY3RBcmdzKGFyZ3MpO1xuICByZXR1cm4gbmV3IEwxTDIoe2wxOiBhcmdzICE9IG51bGwgPyBhcmdzLmwxIDogbnVsbCwgbDI6IDB9KTtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGwyKGFyZ3M6IEwyQXJncykge1xuICBhc3NlcnRPYmplY3RBcmdzKGFyZ3MpO1xuICByZXR1cm4gbmV3IEwxTDIoe2wyOiBhcmdzICE9IG51bGwgPyBhcmdzLmwyIDogbnVsbCwgbDE6IDB9KTtcbn1cblxuLyoqIEBkb2NpbmxpbmUgKi9cbmV4cG9ydCB0eXBlIFJlZ3VsYXJpemVySWRlbnRpZmllciA9ICdsMWwyJ3xzdHJpbmc7XG5cbi8vIE1hcHMgdGhlIEphdmFTY3JpcHQtbGlrZSBpZGVudGlmaWVyIGtleXMgdG8gdGhlIGNvcnJlc3BvbmRpbmcga2VyYXMgc3ltYm9scy5cbmV4cG9ydCBjb25zdCBSRUdVTEFSSVpFUl9JREVOVElGSUVSX1JFR0lTVFJZX1NZTUJPTF9NQVA6XG4gICAge1tpZGVudGlmaWVyIGluIFJlZ3VsYXJpemVySWRlbnRpZmllcl06IHN0cmluZ30gPSB7XG4gICAgICAnbDFsMic6ICdMMUwyJ1xuICAgIH07XG5cbmV4cG9ydCBmdW5jdGlvbiBzZXJpYWxpemVSZWd1bGFyaXplcihjb25zdHJhaW50OiBSZWd1bGFyaXplcik6XG4gICAgc2VyaWFsaXphdGlvbi5Db25maWdEaWN0VmFsdWUge1xuICByZXR1cm4gc2VyaWFsaXplS2VyYXNPYmplY3QoY29uc3RyYWludCk7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBkZXNlcmlhbGl6ZVJlZ3VsYXJpemVyKFxuICAgIGNvbmZpZzogc2VyaWFsaXphdGlvbi5Db25maWdEaWN0LFxuICAgIGN1c3RvbU9iamVjdHM6IHNlcmlhbGl6YXRpb24uQ29uZmlnRGljdCA9IHt9KTogUmVndWxhcml6ZXIge1xuICByZXR1cm4gZGVzZXJpYWxpemVLZXJhc09iamVjdChcbiAgICAgIGNvbmZpZywgc2VyaWFsaXphdGlvbi5TZXJpYWxpemF0aW9uTWFwLmdldE1hcCgpLmNsYXNzTmFtZU1hcCxcbiAgICAgIGN1c3RvbU9iamVjdHMsICdyZWd1bGFyaXplcicpO1xufVxuXG5leHBvcnQgZnVuY3Rpb24gZ2V0UmVndWxhcml6ZXIoaWRlbnRpZmllcjogUmVndWxhcml6ZXJJZGVudGlmaWVyfFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNlcmlhbGl6YXRpb24uQ29uZmlnRGljdHxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBSZWd1bGFyaXplcik6IFJlZ3VsYXJpemVyIHtcbiAgaWYgKGlkZW50aWZpZXIgPT0gbnVsbCkge1xuICAgIHJldHVybiBudWxsO1xuICB9XG4gIGlmICh0eXBlb2YgaWRlbnRpZmllciA9PT0gJ3N0cmluZycpIHtcbiAgICBjb25zdCBjbGFzc05hbWUgPSBpZGVudGlmaWVyIGluIFJFR1VMQVJJWkVSX0lERU5USUZJRVJfUkVHSVNUUllfU1lNQk9MX01BUCA/XG4gICAgICAgIFJFR1VMQVJJWkVSX0lERU5USUZJRVJfUkVHSVNUUllfU1lNQk9MX01BUFtpZGVudGlmaWVyXSA6XG4gICAgICAgIGlkZW50aWZpZXI7XG4gICAgY29uc3QgY29uZmlnID0ge2NsYXNzTmFtZSwgY29uZmlnOiB7fX07XG4gICAgcmV0dXJuIGRlc2VyaWFsaXplUmVndWxhcml6ZXIoY29uZmlnKTtcbiAgfSBlbHNlIGlmIChpZGVudGlmaWVyIGluc3RhbmNlb2YgUmVndWxhcml6ZXIpIHtcbiAgICByZXR1cm4gaWRlbnRpZmllcjtcbiAgfSBlbHNlIHtcbiAgICByZXR1cm4gZGVzZXJpYWxpemVSZWd1bGFyaXplcihpZGVudGlmaWVyKTtcbiAgfVxufVxuIl19","/**\n * @license\n * Copyright 2018 Google LLC\n *\n * Use of this source code is governed by an MIT-style\n * license that can be found in the LICENSE file or at\n * https://opensource.org/licenses/MIT.\n * =============================================================================\n */\n/**\n * Advanced activation layers.\n */\nimport { cast, clipByValue, elu, greater, leakyRelu, mul, prelu, relu, serialization } from '@tensorflow/tfjs-core';\nimport { Softmax as softmaxActivation } from '../activations';\nimport { getConstraint, serializeConstraint } from '../constraints';\nimport { InputSpec, Layer } from '../engine/topology';\nimport { NotImplementedError, ValueError } from '../errors';\nimport { getInitializer, serializeInitializer } from '../initializers';\nimport { getRegularizer, serializeRegularizer } from '../regularizers';\nimport { getExactlyOneShape, getExactlyOneTensor } from '../utils/types_utils';\nexport class ReLU extends Layer {\n constructor(args) {\n super(args == null ? {} : args);\n this.supportsMasking = true;\n if (args != null) {\n this.maxValue = args.maxValue;\n }\n }\n call(inputs, kwargs) {\n inputs = getExactlyOneTensor(inputs);\n let output = relu(inputs);\n if (this.maxValue != null) {\n output = clipByValue(output, 0, this.maxValue);\n }\n return output;\n }\n computeOutputShape(inputShape) {\n return inputShape;\n }\n getConfig() {\n const config = { maxValue: this.maxValue };\n const baseConfig = super.getConfig();\n Object.assign(config, baseConfig);\n return config;\n }\n}\n/** @nocollapse */\nReLU.className = 'ReLU';\nserialization.registerClass(ReLU);\nexport class LeakyReLU extends Layer {\n constructor(args) {\n super(args == null ? {} : args);\n this.DEFAULT_ALPHA = 0.3;\n if (args == null) {\n args = {};\n }\n this.alpha = args.alpha == null ? this.DEFAULT_ALPHA : args.alpha;\n }\n call(inputs, kwargs) {\n const x = getExactlyOneTensor(inputs);\n return leakyRelu(x, this.alpha);\n }\n computeOutputShape(inputShape) {\n return inputShape;\n }\n getConfig() {\n const config = { alpha: this.alpha };\n const baseConfig = super.getConfig();\n Object.assign(config, baseConfig);\n return config;\n }\n}\n/** @nocollapse */\nLeakyReLU.className = 'LeakyReLU';\nserialization.registerClass(LeakyReLU);\nexport class PReLU extends Layer {\n constructor(args) {\n super(args == null ? {} : args);\n this.DEFAULT_ALPHA_INITIALIZER = 'zeros';\n if (args == null) {\n args = {};\n }\n this.supportsMasking = true;\n this.alphaInitializer =\n getInitializer(args.alphaInitializer || this.DEFAULT_ALPHA_INITIALIZER);\n this.alphaRegularizer = getRegularizer(args.alphaRegularizer);\n this.alphaConstraint = getConstraint(args.alphaConstraint);\n if (args.sharedAxes == null) {\n this.sharedAxes = null;\n }\n else if (Array.isArray(args.sharedAxes)) {\n this.sharedAxes = args.sharedAxes;\n }\n else if (typeof args.sharedAxes === 'number') {\n this.sharedAxes = [args.sharedAxes];\n }\n else {\n throw new ValueError(`Expected sharedAxes to be a number or an array of numbers, ` +\n `but got ${args.sharedAxes}`);\n }\n }\n build(inputShape) {\n inputShape = getExactlyOneShape(inputShape);\n const paramShape = inputShape.slice(1);\n if (this.sharedAxes != null) {\n for (const i of this.sharedAxes) {\n paramShape[i - 1] = 1;\n }\n }\n this.alpha = this.addWeight('alpha', paramShape, 'float32', this.alphaInitializer, this.alphaRegularizer, true, this.alphaConstraint);\n // Set input spec.\n const axes = {};\n if (this.sharedAxes != null) {\n for (let i = 1; i < inputShape.length; ++i) {\n axes[i] = inputShape[i];\n }\n }\n this.inputSpec = [new InputSpec({\n ndim: inputShape.length,\n axes,\n })];\n this.built = true;\n }\n call(inputs, kwargs) {\n inputs = getExactlyOneTensor(inputs);\n return prelu(inputs, this.alpha.read());\n }\n getConfig() {\n const config = {\n alphaInitializer: serializeInitializer(this.alphaInitializer),\n alphaRegularizer: serializeRegularizer(this.alphaRegularizer),\n alphaConstraint: serializeConstraint(this.alphaConstraint),\n sharedAxes: this.sharedAxes\n };\n const baseConfig = super.getConfig();\n Object.assign(config, baseConfig);\n return config;\n }\n}\n/** @nocollapse */\nPReLU.className = 'PReLU';\nserialization.registerClass(PReLU);\nexport class ELU extends Layer {\n constructor(args) {\n super(args == null ? {} : args);\n this.DEFAULT_ALPHA = 1.0;\n if (args == null) {\n args = {};\n }\n if (args.alpha != null && args.alpha !== this.DEFAULT_ALPHA) {\n throw new NotImplementedError(`Non-default alpha value (${args.alpha}) is not supported by the ` +\n `ELU layer yet.`);\n }\n this.alpha = args.alpha == null ? this.DEFAULT_ALPHA : args.alpha;\n }\n call(inputs, kwargs) {\n const x = getExactlyOneTensor(inputs);\n return elu(x);\n }\n computeOutputShape(inputShape) {\n return inputShape;\n }\n getConfig() {\n const config = { alpha: this.alpha };\n const baseConfig = super.getConfig();\n Object.assign(config, baseConfig);\n return config;\n }\n}\n/** @nocollapse */\nELU.className = 'ELU';\nserialization.registerClass(ELU);\nexport class ThresholdedReLU extends Layer {\n constructor(args) {\n super(args == null ? {} : args);\n this.DEFAULT_THETA = 1.0;\n if (args == null) {\n args = {};\n }\n this.theta = args.theta == null ? this.DEFAULT_THETA : args.theta;\n }\n call(inputs, kwargs) {\n const x = getExactlyOneTensor(inputs);\n return mul(x, cast(greater(x, this.theta), 'float32'));\n }\n computeOutputShape(inputShape) {\n return inputShape;\n }\n getConfig() {\n const config = { theta: this.theta };\n const baseConfig = super.getConfig();\n Object.assign(config, baseConfig);\n return config;\n }\n}\n/** @nocollapse */\nThresholdedReLU.className = 'ThresholdedReLU';\nserialization.registerClass(ThresholdedReLU);\nexport class Softmax extends Layer {\n constructor(args) {\n super(args == null ? {} : args);\n this.DEFAULT_AXIS = 1.0;\n if (args == null) {\n args = {};\n }\n this.softmax = new softmaxActivation().apply;\n this.axis = args.axis == null ? this.DEFAULT_AXIS : args.axis;\n }\n call(inputs, kwargs) {\n const x = getExactlyOneTensor(inputs);\n return this.softmax(x, this.axis);\n }\n computeOutputShape(inputShape) {\n return inputShape;\n }\n getConfig() {\n const config = { axis: this.axis };\n const baseConfig = super.getConfig();\n Object.assign(config, baseConfig);\n return config;\n }\n}\n/** @nocollapse */\nSoftmax.className = 'Softmax';\nserialization.registerClass(Softmax);\n//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYWR2YW5jZWRfYWN0aXZhdGlvbnMuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi8uLi90ZmpzLWxheWVycy9zcmMvbGF5ZXJzL2FkdmFuY2VkX2FjdGl2YXRpb25zLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBOzs7Ozs7OztHQVFHO0FBRUg7O0dBRUc7QUFFSCxPQUFPLEVBQUMsSUFBSSxFQUFFLFdBQVcsRUFBRSxHQUFHLEVBQUUsT0FBTyxFQUFFLFNBQVMsRUFBRSxHQUFHLEVBQUUsS0FBSyxFQUFFLElBQUksRUFBRSxhQUFhLEVBQVMsTUFBTSx1QkFBdUIsQ0FBQztBQUUxSCxPQUFPLEVBQUMsT0FBTyxJQUFJLGlCQUFpQixFQUFDLE1BQU0sZ0JBQWdCLENBQUM7QUFDNUQsT0FBTyxFQUFhLGFBQWEsRUFBRSxtQkFBbUIsRUFBQyxNQUFNLGdCQUFnQixDQUFDO0FBQzlFLE9BQU8sRUFBQyxTQUFTLEVBQUUsS0FBSyxFQUFZLE1BQU0sb0JBQW9CLENBQUM7QUFDL0QsT0FBTyxFQUFDLG1CQUFtQixFQUFFLFVBQVUsRUFBQyxNQUFNLFdBQVcsQ0FBQztBQUMxRCxPQUFPLEVBQUMsY0FBYyxFQUFzQyxvQkFBb0IsRUFBQyxNQUFNLGlCQUFpQixDQUFDO0FBRXpHLE9BQU8sRUFBQyxjQUFjLEVBQWUsb0JBQW9CLEVBQUMsTUFBTSxpQkFBaUIsQ0FBQztBQUVsRixPQUFPLEVBQUMsa0JBQWtCLEVBQUUsbUJBQW1CLEVBQUMsTUFBTSxzQkFBc0IsQ0FBQztBQVU3RSxNQUFNLE9BQU8sSUFBSyxTQUFRLEtBQUs7SUFLN0IsWUFBWSxJQUFvQjtRQUM5QixLQUFLLENBQUMsSUFBSSxJQUFJLElBQUksQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQztRQUNoQyxJQUFJLENBQUMsZUFBZSxHQUFHLElBQUksQ0FBQztRQUM1QixJQUFJLElBQUksSUFBSSxJQUFJLEVBQUU7WUFDaEIs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LE1BQU0sVUFBVSxHQUFHLEtBQUssQ0FBQyxTQUFTLEVBQUUsQ0FBQztRQUNyQyxNQUFNLENBQUMsTUFBTSxDQUFDLE1BQU0sRUFBRSxVQUFVLENBQUMsQ0FBQztRQUNsQyxPQUFPLE1BQU0sQ0FBQztJQUNoQixDQUFDOztBQTdCRCxrQkFBa0I7QUFDWCxpQkFBUyxHQUFHLFNBQVMsQ0FBQztBQThCL0IsYUFBYSxDQUFDLGFBQWEsQ0FBQyxPQUFPLENBQUMsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbIi8qKlxuICogQGxpY2Vuc2VcbiAqIENvcHlyaWdodCAyMDE4IEdvb2dsZSBMTENcbiAqXG4gKiBVc2Ugb2YgdGhpcyBzb3VyY2UgY29kZSBpcyBnb3Zlcm5lZCBieSBhbiBNSVQtc3R5bGVcbiAqIGxpY2Vuc2UgdGhhdCBjYW4gYmUgZm91bmQgaW4gdGhlIExJQ0VOU0UgZmlsZSBvciBhdFxuICogaHR0cHM6Ly9vcGVuc291cmNlLm9yZy9saWNlbnNlcy9NSVQuXG4gKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuICovXG5cbi8qKlxuICogIEFkdmFuY2VkIGFjdGl2YXRpb24gbGF5ZXJzLlxuICovXG5cbmltcG9ydCB7Y2FzdCwgY2xpcEJ5VmFsdWUsIGVsdSwgZ3JlYXRlciwgbGVha3lSZWx1LCBtdWwsIHByZWx1LCByZWx1LCBzZXJpYWxpemF0aW9uLCBUZW5zb3J9IGZyb20gJ0B0ZW5zb3JmbG93L3RmanMtY29yZSc7XG5cbmltcG9ydCB7U29mdG1heCBhcyBzb2Z0bWF4QWN0aXZhdGlvbn0gZnJvbSAnLi4vYWN0aXZhdGlvbnMnO1xuaW1wb3J0IHtDb25zdHJhaW50LCBnZXRDb25zdHJhaW50LCBzZXJpYWxpemVDb25zdHJhaW50fSBmcm9tICcuLi9jb25zdHJhaW50cyc7XG5pbXBvcnQge0lucHV0U3BlYywgTGF5ZXIsIExheWVyQXJnc30gZnJvbSAnLi4vZW5naW5lL3RvcG9sb2d5JztcbmltcG9ydCB7Tm90SW1wbGVtZW50ZWRFcnJvciwgVmFsdWVFcnJvcn0gZnJvbSAnLi4vZXJyb3JzJztcbmltcG9ydCB7Z2V0SW5pdGlhbGl6ZXIsIEluaXRpYWxpemVyLCBJbml0aWFsaXplcklkZW50aWZpZXIsIHNlcmlhbGl6ZUluaXRpYWxpemVyfSBmcm9tICcuLi9pbml0aWFsaXplcnMnO1xuaW1wb3J0IHtTaGFwZX0gZnJvbSAnLi4va2VyYXNfZm9ybWF0L2NvbW1vbic7XG5pbXBvcnQge2dldFJlZ3VsYXJpemVyLCBSZWd1bGFyaXplciwgc2VyaWFsaXplUmVndWxhcml6ZXJ9IGZyb20gJy4uL3JlZ3VsYXJpemVycyc7XG5pbXBvcnQge0t3YXJnc30gZnJvbSAnLi4vdHlwZXMnO1xuaW1wb3J0IHtnZXRFeGFjdGx5T25lU2hhcGUsIGdldEV4YWN0bHlPbmVUZW5zb3J9IGZyb20gJy4uL3V0aWxzL3R5cGVzX3V0aWxzJztcbmltcG9ydCB7TGF5ZXJWYXJpYWJsZX0gZnJvbSAnLi4vdmFyaWFibGVzJztcblxuZXhwb3J0IGRlY2xhcmUgaW50ZXJmYWNlIFJlTFVMYXllckFyZ3MgZXh0ZW5kcyBMYXllckFyZ3Mge1xuICAvKipcbiAgICogRmxvYXQsIHRoZSBtYXhpbXVtIG91dHB1dCB2YWx1ZS5cbiAgICovXG4gIG1heFZhbHVlPzogbnVtYmVyO1xufVxuXG5leHBvcnQgY2xhc3MgUmVMVSBleHRlbmRzIExheWVyIHtcbiAgLyoqIEBub2NvbGxhcHNlICovXG4gIHN0YXRpYyBjbGFzc05hbWUgPSAnUmVMVSc7XG4gIG1heFZhbHVlOiBudW1iZXI7XG5cbiAgY29uc3RydWN0b3IoYXJncz86IFJlTFVMYXllckFyZ3MpIHtcbiAgICBzdXBlcihhcmdzID09IG51bGwgPyB7fSA6IGFyZ3MpO1xuICAgIHRoaXMuc3VwcG9ydHNNYXNraW5nID0gdHJ1ZTtcbiAgICBpZiAoYXJncyAhPSBudWxsKSB7XG4gICAgICB0aGlzLm1heFZhbHVlID0gYXJncy5tYXhWYWx1ZTtcbiAgICB9XG4gIH1cblxuICBjYWxsKGlucHV0czogVGVuc29yfFRlbnNvcltdLCBrd2FyZ3M6IEt3YXJncyk6IFRlbnNvcnxUZW5zb3JbXSB7XG4gICAgaW5wdXRzID0gZ2V0RXhhY3RseU9uZVRlbnNvcihpbnB1dHMpO1xuICAgIGxldCBvdXRwdXQgPSByZWx1KGlucHV0cyk7XG4gICAgaWYgKHRoaXMubWF4VmFsdWUgIT0gbnVsbCkge1xuICAgICAgb3V0cHV0ID0gY2xpcEJ5VmFsdWUob3V0cHV0LCAwLCB0aGlzLm1heFZhbHVlKTtcbiAgICB9XG4gICAgcmV0dXJuIG91dHB1dDtcbiAgfVxuXG4gIGNvbXB1dGVPdXRwdXRTaGFwZShpbnB1dFNoYXBlOiBTaGFwZXxTaGFwZVtdKTogU2hhcGV8U2hhcGVbXSB7XG4gICAgcmV0dXJuIGlucHV0U2hhcGU7XG4gIH1cblxuICBnZXRDb25maWcoKTogc2VyaWFsaXphdGlvbi5Db25maWdEaWN0IHtcbiAgICBjb25zdCBjb25maWc6IHNlcmlhbGl6YXRpb24uQ29uZmlnRGljdCA9IHttYXhWYWx1ZTogdGhpcy5tYXhWYWx1ZX07XG4gICAgY29uc3QgYmFzZUNvbmZpZyA9IHN1cGVyLmdldENvbmZpZygpO1xuICAgIE9iamVjdC5hc3NpZ24oY29uZmlnLCBiYXNlQ29uZmlnKTtcbiAgICByZXR1cm4gY29uZmlnO1xuICB9XG59XG5zZXJpYWxpemF0aW9uLnJlZ2lzdGVyQ2xhc3MoUmVMVSk7XG5cbmV4cG9ydCBkZWNsYXJlIGludGVyZmFjZSBMZWFreVJlTFVMYXllckFyZ3MgZXh0ZW5kcyBMYXllckFyZ3Mge1xuICAvKipcbiAgICogRmxvYXQgYD49IDBgLiBOZWdhdGl2ZSBzbG9wZSBjb2VmZmljaWVudC4gRGVmYXVsdHMgdG8gYDAuM2AuXG4gICAqL1xuICBhbHBoYT86IG51bWJlcjtcbn1cblxuZXhwb3J0IGNsYXNzIExlYWt5UmVMVSBleHRlbmRzIExheWVyIHtcbiAgLyoqIEBub2NvbGxhcHNlICovXG4gIHN0YXRpYyBjbGFzc05hbWUgPSAnTGVha3lSZUxVJztcbiAgcmVhZG9ubHkgYWxwaGE6IG51bWJlcjtcblxuICByZWFkb25seSBERUZBVUxUX0FMUEhBID0gMC4zO1xuXG4gIGNvbnN0cnVjdG9yKGFyZ3M/OiBMZWFreVJlTFVMYXllckFyZ3MpIHtcbiAgICBzdXBlcihhcmdzID09IG51bGwgPyB7fSA6IGFyZ3MpO1xuICAgIGlmIChhcmdzID09IG51bGwpIHtcbiAgICAgIGFyZ3MgPSB7fTtcbiAgICB9XG4gICAgdGhpcy5hbHBoYSA9IGFyZ3MuYWxwaGEgPT0gbnVsbCA/IHRoaXMuREVGQVVMVF9BTFBIQSA6IGFyZ3MuYWxwaGE7XG4gIH1cblxuICBjYWxsKGlucHV0czogVGVuc29yfFRlbnNvcltdLCBrd2FyZ3M6IEt3YXJncyk6IFRlbnNvcnxUZW5zb3JbXSB7XG4gICAgY29uc3QgeCA9IGdldEV4YWN0bHlPbmVUZW5zb3IoaW5wdXRzKTtcbiAgICByZXR1cm4gbGVha3lSZWx1KHgsIHRoaXMuYWxwaGEpO1xuICB9XG5cbiAgY29tcHV0ZU91dHB1dFNoYXBlKGlucHV0U2hhcGU6IFNoYXBlfFNoYXBlW10pOiBTaGFwZXxTaGFwZVtdIHtcbiAgICByZXR1cm4gaW5wdXRTaGFwZTtcbiAgfVxuXG4gIGdldENvbmZpZygpOiBzZXJpYWxpemF0aW9uLkNvbmZpZ0RpY3Qge1xuICAgIGNvbnN0IGNvbmZpZzogc2VyaWFsaXphdGlvbi5Db25maWdEaWN0ID0ge2FscGhhOiB0aGlzLmFscGhhfTtcbiAgICBjb25zdCBiYXNlQ29uZmlnID0gc3VwZXIuZ2V0Q29uZmlnKCk7XG4gICAgT2JqZWN0LmFzc2lnbihjb25maWcsIGJhc2VDb25maWcpO1xuICAgIHJldHVybiBjb25maWc7XG4gIH1cbn1cbnNlcmlhbGl6YXRpb24ucmVnaXN0ZXJDbGFzcyhMZWFreVJlTFUpO1xuXG5leHBvcnQgZGVjbGFyZSBpbnRlcmZhY2UgUFJlTFVMYXllckFyZ3MgZXh0ZW5kcyBMYXllckFyZ3Mge1xuICAvKipcbiAgICogSW5pdGlhbGl6ZXIgZm9yIHRoZSBsZWFybmFibGUgYWxwaGEuXG4gICAqL1xuICBhbHBoYUluaXRpYWxpemVyPzogSW5pdGlhbGl6ZXJ8SW5pdGlhbGl6ZXJJZGVudGlmaWVyO1xuXG4gIC8qKlxuICAgKiBSZWd1bGFyaXplciBmb3IgdGhlIGxlYXJuYWJsZSBhbHBoYS5cbiAgICovXG4gIGFscGhhUmVndWxhcml6ZXI/OiBSZWd1bGFyaXplcjtcblxuICAvKipcbiAgICogQ29uc3RyYWludCBmb3IgdGhlIGxlYXJuYWJsZSBhbHBoYS5cbiAgICovXG4gIGFscGhhQ29uc3RyYWludD86IENvbnN0cmFpbnQ7XG5cbiAgLyoqXG4gICAqIFRoZSBheGVzIGFsb25nIHdoaWNoIHRvIHNoYXJlIGxlYXJuYWJsZSBwYXJhbWV0ZXJzIGZvciB0aGUgYWN0aXZhdGlvblxuICAgKiBmdW5jdGlvbi4gRm9yIGV4YW1wbGUsIGlmIHRoZSBpbmNvbWluZyBmZWF0dXJlIG1hcHMgYXJlIGZyb20gYSAyRFxuICAgKiBjb252b2x1dGlvbiB3aXRoIG91dHB1dCBzaGFwZSBgW251bUV4YW1wbGVzLCBoZWlnaHQsIHdpZHRoLCBjaGFubmVsc11gLFxuICAgKiBhbmQgeW91IHdpc2ggdG8gc2hhcmUgcGFyYW1ldGVycyBhY3Jvc3Mgc3BhY2UgKGhlaWdodCBhbmQgd2lkdGgpIHNvIHRoYXRcbiAgICogZWFjaCBmaWx0ZXIgY2hhbm5lbHMgaGFzIG9ubHkgb25lIHNldCBvZiBwYXJhbWV0ZXJzLCBzZXRcbiAgICogYHNoYXJlZF9heGVzOiBbMSwgMl1gLlxuICAgKi9cbiAgc2hhcmVkQXhlcz86IG51bWJlcnxudW1iZXJbXTtcbn1cblxuZXhwb3J0IGNsYXNzIFBSZUxVIGV4dGVuZHMgTGF5ZXIge1xuICAvKiogQG5vY29sbGFwc2UgKi9cbiAgc3RhdGljIGNsYXNzTmFtZSA9ICdQUmVMVSc7XG4gIHByaXZhdGUgcmVhZG9ubHkgYWxwaGFJbml0aWFsaXplcjogSW5pdGlhbGl6ZXI7XG4gIHByaXZhdGUgcmVhZG9ubHkgYWxwaGFSZWd1bGFyaXplcjogUmVndWxhcml6ZXI7XG4gIHByaXZhdGUgcmVhZG9ubHkgYWxwaGFDb25zdHJhaW50OiBDb25zdHJhaW50O1xuICBwcml2YXRlIHJlYWRvbmx5IHNoYXJlZEF4ZXM6IG51bWJlcltdO1xuICBwcml2YXRlIGFscGhhOiBMYXllclZhcmlhYmxlO1xuXG4gIHJlYWRvbmx5IERFRkFVTFRfQUxQSEFfSU5JVElBTElaRVI6IEluaXRpYWxpemVySWRlbnRpZmllciA9ICd6ZXJvcyc7XG5cbiAgY29uc3RydWN0b3IoYXJncz86IFBSZUxVTGF5ZXJBcmdzKSB7XG4gICAgc3VwZXIoYXJncyA9PSBudWxsID8ge30gOiBhcmdzKTtcbiAgICBpZiAoYXJncyA9PSBudWxsKSB7XG4gICAgICBhcmdzID0ge307XG4gICAgfVxuXG4gICAgdGhpcy5zdXBwb3J0c01hc2tpbmcgPSB0cnVlO1xuICAgIHRoaXMuYWxwaGFJbml0aWFsaXplciA9XG4gICAgICAgIGdldEluaXRpYWxpemVyKGFyZ3MuYWxwaGFJbml0aWFsaXplciB8fCB0aGlzLkRFRkFVTFRfQUxQSEFfSU5JVElBTElaRVIpO1xuICAgIHRoaXMuYWxwaGFSZWd1bGFyaXplciA9IGdldFJlZ3VsYXJpemVyKGFyZ3MuYWxwaGFSZWd1bGFyaXplcik7XG4gICAgdGhpcy5hbHBoYUNvbnN0cmFpbnQgPSBnZXRDb25zdHJhaW50KGFyZ3MuYWxwaGFDb25zdHJhaW50KTtcbiAgICBpZiAoYXJncy5zaGFyZWRBeGVzID09IG51bGwpIHtcbiAgICAgIHRoaXMuc2hhcmVkQXhlcyA9IG51bGw7XG4gICAgfSBlbHNlIGlmIChBcnJheS5pc0FycmF5KGFyZ3Muc2hhcmVkQXhlcykpIHtcbiAgICAgIHRoaXMuc2hhcmVkQXhlcyA9IGFyZ3Muc2hhcmVkQXhlcztcbiAgICB9IGVsc2UgaWYgKHR5cGVvZiBhcmdzLnNoYXJlZEF4ZXMgPT09ICdudW1iZXInKSB7XG4gICAgICB0aGlzLnNoYXJlZEF4ZXMgPSBbYXJncy5zaGFyZWRBeGVzXTtcbiAgICB9IGVsc2Uge1xuICAgICAgdGhyb3cgbmV3IFZhbHVlRXJyb3IoXG4gICAgICAgICAgYEV4cGVjdGVkIHNoYXJlZEF4ZXMgdG8gYmUgYSBudW1iZXIgb3IgYW4gYXJyYXkgb2YgbnVtYmVycywgYCArXG4gICAgICAgICAgYGJ1dCBnb3QgJHthcmdzLnNoYXJlZEF4ZXN9YCk7XG4gICAgfVxuICB9XG5cbiAgYnVpbGQoaW5wdXRTaGFwZTogU2hhcGV8U2hhcGVbXSkge1xuICAgIGlucHV0U2hhcGUgPSBnZXRFeGFjdGx5T25lU2hhcGUoaW5wdXRTaGFwZSk7XG4gICAgY29uc3QgcGFyYW1TaGFwZTogU2hhcGUgPSBpbnB1dFNoYXBlLnNsaWNlKDEpO1xuICAgIGlmICh0aGlzLnNoYXJlZEF4ZXMgIT0gbnVsbCkge1xuICAgICAgZm9yIChjb25zdCBpIG9mIHRoaXMuc2hhcmVkQXhlcykge1xuICAgICAgICBwYXJhbVNoYXBlW2kgLSAxXSA9IDE7XG4gICAgICB9XG4gICAgfVxuICAgIHRoaXMuYWxwaGEgPSB0aGlzLmFkZFdlaWdodChcbiAgICAgICAgJ2FscGhhJywgcGFyYW1TaGFwZSwgJ2Zsb2F0MzInLCB0aGlzLmFscGhhSW5pdGlhbGl6ZXIsXG4gICAgICAgIHRoaXMuYWxwaGFSZWd1bGFyaXplciwgdHJ1ZSwgdGhpcy5hbHBoYUNvbnN0cmFpbnQpO1xuICAgIC8vIFNldCBpbnB1dCBzcGVjLlxuICAgIGNvbnN0IGF4ZXM6IHtbYXhpczogbnVtYmVyXTogbnVtYmVyfSA9IHt9O1xuICAgIGlmICh0aGlzLnNoYXJlZEF4ZXMgIT0gbnVsbCkge1xuICAgICAgZm9yIChsZXQgaSA9IDE7IGkgPCBpbnB1dFNoYXBlLmxlbmd0aDsgKytpKSB7XG4gICAgICAgIGF4ZXNbaV0gPSBpbnB1dFNoYXBlW2ldO1xuICAgICAgfVxuICAgIH1cbiAgICB0aGlzLmlucHV0U3BlYyA9IFtuZXcgSW5wdXRTcGVjKHtcbiAgICAgIG5kaW06IGlucHV0U2hhcGUubGVuZ3RoLFxuICAgICAgYXhlcyxcbiAgICB9KV07XG4gICAgdGhpcy5idWlsdCA9IHRydWU7XG4gIH1cblxuICBjYWxsKGlucHV0czogVGVuc29yfFRlbnNvcltdLCBrd2FyZ3M6IEt3YXJncyk6IFRlbnNvcnxUZW5zb3JbXSB7XG4gICAgaW5wdXRzID0gZ2V0RXhhY3RseU9uZVRlbnNvcihpbnB1dHMpO1xuICAgIHJldHVybiBwcmVsdShpbnB1dHMsIHRoaXMuYWxwaGEucmVhZCgpKTtcbiAgfVxuXG4gIGdldENvbmZpZygpOiBzZXJpYWxpemF0aW9uLkNvbmZpZ0RpY3Qge1xuICAgIGNvbnN0IGNvbmZpZzogc2VyaWFsaXphdGlvbi5Db25maWdEaWN0ID0ge1xuICAgICAgYWxwaGFJbml0aWFsaXplcjogc2VyaWFsaXplSW5pdGlhbGl6ZXIodGhpcy5hbHBoYUluaXRpYWxpemVyKSxcbiAgICAgIGFscGhhUmVndWxhcml6ZXI6IHNlcmlhbGl6ZVJlZ3VsYXJpemVyKHRoaXMuYWxwaGFSZWd1bGFyaXplciksXG4gICAgICBhbHBoYUNvbnN0cmFpbnQ6IHNlcmlhbGl6ZUNvbnN0cmFpbnQodGhpcy5hbHBoYUNvbnN0cmFpbnQpLFxuICAgICAgc2hhcmVkQXhlczogdGhpcy5zaGFyZWRBeGVzXG4gICAgfTtcbiAgICBjb25zdCBiYXNlQ29uZmlnID0gc3VwZXIuZ2V0Q29uZmlnKCk7XG4gICAgT2JqZWN0LmFzc2lnbihjb25maWcsIGJhc2VDb25maWcpO1xuICAgIHJldHVybiBjb25maWc7XG4gIH1cbn1cbnNlcmlhbGl6YXRpb24ucmVnaXN0ZXJDbGFzcyhQUmVMVSk7XG5cbmV4cG9ydCBkZWNsYXJlIGludGVyZmFjZSBFTFVMYXllckFyZ3MgZXh0ZW5kcyBMYXllckFyZ3Mge1xuICAvKipcbiAgICogRmxvYXQgYD49IDBgLiBOZWdhdGl2ZSBzbG9wZSBjb2VmZmljaWVudC4gRGVmYXVsdHMgdG8gYDEuMGAuXG4gICAqL1xuICBhbHBoYT86IG51bWJlcjtcbn1cblxuZXhwb3J0IGNsYXNzIEVMVSBleHRlbmRzIExheWVyIHtcbiAgLyoqIEBub2NvbGxhcHNlICovXG4gIHN0YXRpYyBjbGFzc05hbWUgPSAnRUxVJztcbiAgcmVhZG9ubHkgYWxwaGE6IG51bWJlcjtcblxuICByZWFkb25seSBERUZBVUxUX0FMUEhBID0gMS4wO1xuXG4gIGNvbnN0cnVjdG9yKGFyZ3M/OiBFTFVMYXllckFyZ3MpIHtcbiAgICBzdXBlcihhcmdzID09IG51bGwgPyB7fSA6IGFyZ3MpO1xuICAgIGlmIChhcmdzID09IG51bGwpIHtcbiAgICAgIGFyZ3MgPSB7fTtcbiAgICB9XG5cbiAgICBpZiAoYXJncy5hbHBoYSAhPSBudWxsICYmIGFyZ3MuYWxwaGEgIT09IHRoaXMuREVGQVVMVF9BTFBIQSkge1xuICAgICAgdGhyb3cgbmV3IE5vdEltcGxlbWVudGVkRXJyb3IoXG4gICAgICAgICAgYE5vbi1kZWZhdWx0IGFscGhhIHZhbHVlICgke2FyZ3MuYWxwaGF9KSBpcyBub3Qgc3VwcG9ydGVkIGJ5IHRoZSBgICtcbiAgICAgICAgICBgRUxVIGxheWVyIHlldC5gKTtcbiAgICB9XG5cbiAgICB0aGlzLmFscGhhID0gYXJncy5hbHBoYSA9PSBudWxsID8gdGhpcy5ERUZBVUxUX0FMUEhBIDogYXJncy5hbHBoYTtcbiAgfVxuXG4gIGNhbGwoaW5wdXRzOiBUZW5zb3J8VGVuc29yW10sIGt3YXJnczogS3dhcmdzKTogVGVuc29yfFRlbnNvcltdIHtcbiAgICBjb25zdCB4ID0gZ2V0RXhhY3RseU9uZVRlbnNvcihpbnB1dHMpO1xuICAgIHJldHVybiBlbHUoeCk7XG4gIH1cblxuICBjb21wdXRlT3V0cHV0U2hhcGUoaW5wdXRTaGFwZTogU2hhcGV8U2hhcGVbXSk6IFNoYXBlfFNoYXBlW10ge1xuICAgIHJldHVybiBpbnB1dFNoYXBlO1xuICB9XG5cbiAgZ2V0Q29uZmlnKCk6IHNlcmlhbGl6YXRpb24uQ29uZmlnRGljdCB7XG4gICAgY29uc3QgY29uZmlnOiBzZXJpYWxpemF0aW9uLkNvbmZpZ0RpY3QgPSB7YWxwaGE6IHRoaXMuYWxwaGF9O1xuICAgIGNvbnN0IGJhc2VDb25maWcgPSBzdXBlci5nZXRDb25maWcoKTtcbiAgICBPYmplY3QuYXNzaWduKGNvbmZpZywgYmFzZUNvbmZpZyk7XG4gICAgcmV0dXJuIGNvbmZpZztcbiAgfVxufVxuc2VyaWFsaXphdGlvbi5yZWdpc3RlckNsYXNzKEVMVSk7XG5cbmV4cG9ydCBkZWNsYXJlIGludGVyZmFjZSBUaHJlc2hvbGRlZFJlTFVMYXllckFyZ3MgZXh0ZW5kcyBMYXllckFyZ3Mge1xuICAvKipcbiAgICogRmxvYXQgPj0gMC4gVGhyZXNob2xkIGxvY2F0aW9uIG9mIGFjdGl2YXRpb24uXG4gICAqL1xuICB0aGV0YT86IG51bWJlcjtcbn1cblxuZXhwb3J0IGNsYXNzIFRocmVzaG9sZGVkUmVMVSBleHRlbmRzIExheWVyIHtcbiAgLyoqIEBub2NvbGxhcHNlICovXG4gIHN0YXRpYyBjbGFzc05hbWUgPSAnVGhyZXNob2xkZWRSZUxVJztcbiAgcmVhZG9ubHkgdGhldGE6IG51bWJlcjtcblxuICByZWFkb25seSBERUZBVUxUX1RIRVRBID0gMS4wO1xuXG4gIGNvbnN0cnVjdG9yKGFyZ3M/OiBUaHJlc2hvbGRlZFJlTFVMYXllckFyZ3MpIHtcbiAgICBzdXBlcihhcmdzID09IG51bGwgPyB7fSA6IGFyZ3MpO1xuICAgIGlmIChhcmdzID09IG51bGwpIHtcbiAgICAgIGFyZ3MgPSB7fTtcbiAgICB9XG5cbiAgICB0aGlzLnRoZXRhID0gYXJncy50aGV0YSA9PSBudWxsID8gdGhpcy5ERUZBVUxUX1RIRVRBIDogYXJncy50aGV0YTtcbiAgfVxuXG4gIGNhbGwoaW5wdXRzOiBUZW5zb3J8VGVuc29yW10sIGt3YXJnczogS3dhcmdzKTogVGVuc29yfFRlbnNvcltdIHtcbiAgICBjb25zdCB4ID0gZ2V0RXhhY3RseU9uZVRlbnNvcihpbnB1dHMpO1xuICAgIHJldHVybiBtdWwoeCwgY2FzdChncmVhdGVyKHgsIHRoaXMudGhldGEpLCAnZmxvYXQzMicpKTtcbiAgfVxuXG4gIGNvbXB1dGVPdXRwdXRTaGFwZShpbnB1dFNoYXBlOiBTaGFwZXxTaGFwZVtdKTogU2hhcGV8U2hhcGVbXSB7XG4gICAgcmV0dXJuIGlucHV0U2hhcGU7XG4gIH1cblxuICBnZXRDb25maWcoKTogc2VyaWFsaXphdGlvbi5Db25maWdEaWN0IHtcbiAgICBjb25zdCBjb25maWc6IHNlcmlhbGl6YXRpb24uQ29uZmlnRGljdCA9IHt0aGV0YTogdGhpcy50aGV0YX07XG4gICAgY29uc3QgYmFzZUNvbmZpZyA9IHN1cGVyLmdldENvbmZpZygpO1xuICAgIE9iamVjdC5hc3NpZ24oY29uZmlnLCBiYXNlQ29uZmlnKTtcbiAgICByZXR1cm4gY29uZmlnO1xuICB9XG59XG5zZXJpYWxpemF0aW9uLnJlZ2lzdGVyQ2xhc3MoVGhyZXNob2xkZWRSZUxVKTtcblxuZXhwb3J0IGRlY2xhcmUgaW50ZXJmYWNlIFNvZnRtYXhMYXllckFyZ3MgZXh0ZW5kcyBMYXllckFyZ3Mge1xuICAvKipcbiAgICogSW50ZWdlciwgYXhpcyBhbG9uZyB3aGljaCB0aGUgc29mdG1heCBub3JtYWxpemF0aW9uIGlzIGFwcGxpZWQuXG4gICAqIERlZmF1bHRzIHRvIGAtMWAgKGkuZS4sIHRoZSBsYXN0IGF4aXMpLlxuICAgKi9cbiAgYXhpcz86IG51bWJlcjtcbn1cblxuZXhwb3J0IGNsYXNzIFNvZnRtYXggZXh0ZW5kcyBMYXllciB7XG4gIC8qKiBAbm9jb2xsYXBzZSAqL1xuICBzdGF0aWMgY2xhc3NOYW1lID0gJ1NvZnRtYXgnO1xuICByZWFkb25seSBheGlzOiBudW1iZXI7XG4gIHJlYWRvbmx5IHNvZnRtYXg6ICh0OiBUZW5zb3IsIGE/OiBudW1iZXIpID0+IFRlbnNvcjtcbiAgcmVhZG9ubHkgREVGQVVMVF9BWElTID0gMS4wO1xuXG4gIGNvbnN0cnVjdG9yKGFyZ3M/OiBTb2Z0bWF4TGF5ZXJBcmdzKSB7XG4gICAgc3VwZXIoYXJncyA9PSBudWxsID8ge30gOiBhcmdzKTtcbiAgICBpZiAoYXJncyA9PSBudWxsKSB7XG4gICAgICBhcmdzID0ge307XG4gICAgfVxuICAgIHRoaXMuc29mdG1heCA9IG5ldyBzb2Z0bWF4QWN0aXZhdGlvbigpLmFwcGx5O1xuICAgIHRoaXMuYXhpcyA9IGFyZ3MuYXhpcyA9PSBudWxsID8gdGhpcy5ERUZBVUxUX0FYSVMgOiBhcmdzLmF4aXM7XG4gIH1cblxuICBjYWxsKGlucHV0czogVGVuc29yfFRlbnNvcltdLCBrd2FyZ3M6IEt3YXJncyk6IFRlbnNvcnxUZW5zb3JbXSB7XG4gICAgY29uc3QgeCA9IGdldEV4YWN0bHlPbmVUZW5zb3IoaW5wdXRzKTtcbiAgICByZXR1cm4gdGhpcy5zb2Z0bWF4KHgsIHRoaXMuYXhpcyk7XG4gIH1cblxuICBjb21wdXRlT3V0cHV0U2hhcGUoaW5wdXRTaGFwZTogU2hhcGV8U2hhcGVbXSk6IFNoYXBlfFNoYXBlW10ge1xuICAgIHJldHVybiBpbnB1dFNoYXBlO1xuICB9XG5cbiAgZ2V0Q29uZmlnKCk6IHNlcmlhbGl6YXRpb24uQ29uZmlnRGljdCB7XG4gICAgY29uc3QgY29uZmlnOiBzZXJpYWxpemF0aW9uLkNvbmZpZ0RpY3QgPSB7YXhpczogdGhpcy5heGlzfTtcbiAgICBjb25zdCBiYXNlQ29uZmlnID0gc3VwZXIuZ2V0Q29uZmlnKCk7XG4gICAgT2JqZWN0LmFzc2lnbihjb25maWcsIGJhc2VDb25maWcpO1xuICAgIHJldHVybiBjb25maWc7XG4gIH1cbn1cbnNlcmlhbGl6YXRpb24ucmVnaXN0ZXJDbGFzcyhTb2Z0bWF4KTtcbiJdfQ==","/**\n * @license\n * Copyright 2018 Google LLC\n *\n * Use of this source code is governed by an MIT-style\n * license that can be found in the LICENSE file or at\n * https://opensource.org/licenses/MIT.\n * =============================================================================\n */\nimport { ValueError } from '../errors';\nimport { pyListRepeat } from './generic_utils';\nimport { isInteger, max } from './math_utils';\n/**\n * Transforms a single number of array of numbers into an array of numbers.\n * @param value\n * @param n: The size of the tuple to be returned.\n * @param name: Name of the parameter, used for generating error messages.\n * @returns An array of numbers.\n */\nexport function normalizeArray(value, n, name) {\n if (typeof value === 'number') {\n return pyListRepeat(value, n);\n }\n else {\n if (value.length !== n) {\n throw new ValueError(`The ${name} argument must be an integer or tuple of ${n} integers.` +\n ` Received: ${value.length} elements.`);\n }\n for (let i = 0; i < n; ++i) {\n const singleValue = value[i];\n if (!isInteger(singleValue)) {\n throw new ValueError(`The ${name} argument must be an integer or tuple of ${n}` +\n ` integers. Received: ${JSON.stringify(value)} including a` +\n ` non-integer number ${singleValue}`);\n }\n }\n return value;\n }\n}\n/**\n * Determines output length of a convolution given input length.\n * @param inputLength\n * @param filterSize\n * @param padding\n * @param stride\n * @param dilation: dilation rate.\n */\nexport function convOutputLength(inputLength, filterSize, padding, stride, dilation = 1) {\n if (inputLength == null) {\n return inputLength;\n }\n const dilatedFilterSize = filterSize + (filterSize - 1) * (dilation - 1);\n let outputLength;\n if (padding === 'same') {\n outputLength = inputLength;\n }\n else { // VALID\n outputLength = inputLength - dilatedFilterSize + 1;\n }\n return Math.floor((outputLength + stride - 1) / stride);\n}\nexport function deconvLength(dimSize, strideSize, kernelSize, padding) {\n if (dimSize == null) {\n return null;\n }\n if (padding === 'valid') {\n dimSize = dimSize * strideSize + max([kernelSize - strideSize, 0]);\n }\n else if (padding === 'same') {\n dimSize = dimSize * strideSize;\n }\n else {\n throw new ValueError(`Unsupport padding mode: ${padding}.`);\n }\n return dimSize;\n}\n//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY29udl91dGlscy5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uLy4uL3RmanMtbGF5ZXJzL3NyYy91dGlscy9jb252X3V0aWxzLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBOzs7Ozs7OztHQVFHO0FBRUgsT0FBTyxFQUFDLFVBQVUsRUFBQyxNQUFNLFdBQVcsQ0FBQztBQUdyQyxPQUFPLEVBQUMsWUFBWSxFQUFDLE1BQU0saUJBQWlCLENBQUM7QUFDN0MsT0FBTyxFQUFDLFNBQVMsRUFBRSxHQUFHLEVBQUMsTUFBTSxjQUFjLENBQUM7QUFFNUM7Ozs7OztHQU1HO0FBQ0gsTUFBTSxVQUFVLGNBQWMsQ0FDMUIsS0FBc0IsRUFBRSxDQUFTLEVBQUUsSUFBWTtJQUNqRCxJQUFJLE9BQU8sS0FBSyxLQUFLLFFBQVEsRUFBRTtRQUM3QixPQUFPLFlBQVksQ0FBQyxLQUFLLEVBQUUsQ0FBQyxDQUFDLENBQUM7S0FDL0I7U0FBTTtRQUNMLElBQUksS0FBSyxDQUFDLE1BQU0sS0FBSyxDQUFDLEVBQUU7WUFDdEIsTUFBTSxJQUFJLFVBQVUsQ0FDaEIsT0FBTyxJQUFJLDRDQUE0QyxDQUFDLFlBQVk7Z0JBQ3BFLGNBQWMsS0FBSyxDQUFDLE1BQU0sWUFBWSxDQUFDLENBQUM7U0FDN0M7UUFDRCxLQUFLLElBQUksQ0FBQyxHQUFHLENBQUMsRUFBRSxDQUFDLEdBQUcsQ0FBQyxFQUFFLEVBQUUsQ0FBQyxFQUFFO1lBQzFCLE1BQU0sV0FBVyxHQUFHLEtBQUssQ0FBQyxDQUFDLENBQUMsQ0FBQztZQUM3QixJQUFJLENBQUMsU0FBUyxDQUFDLFdBQVcsQ0FBQyxFQUFFO2dCQUMzQixNQUFNLElBQUksVUFBVSxDQUNoQixPQUFPLElBQUksNENBQTRDLENBQUMsRUFBRTtvQkFDMUQsd0JBQXdCLElBQUksQ0FBQyxTQUFTLENBQUMsS0FBSyxDQUFDLGNBQWM7b0JBQzNELHVCQUF1QixXQUFXLEVBQUUsQ0FBQyxDQUFDO2FBQzNDO1NBQ0Y7UUFDRCxPQUFPLEtBQUssQ0FBQztLQUNkO0FBQ0gsQ0FBQztBQUVEOzs7Ozs7O0dBT0c7QUFDSCxNQUFNLFVBQVUsZ0JBQWdCLENBQzVCLFdBQW1CLEVBQUUsVUFBa0IsRUFBRSxPQUFvQixFQUM3RCxNQUFjLEVBQUUsUUFBUSxHQUFHLENBQUM7SUFDOUIsSUFBSSxXQUFXLElBQUksSUFBSSxFQUFFO1FBQ3ZCLE9BQU8sV0FBVyxDQUFDO0tBQ3BCO0lBQ0QsTUFBTSxpQkFBaUIsR0FBRyxVQUFVLEdBQUcsQ0FBQyxVQUFVLEdBQUcsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxRQUFRLEdBQUcsQ0FBQyxDQUFDLENBQUM7SUFDekUsSUFBSSxZQUFvQixDQUFDO0lBQ3pCLElBQUksT0FBTyxLQUFLLE1BQU0sRUFBRTtRQUN0QixZQUFZLEdBQUcsV0FBVyxDQUFDO0tBQzVCO1NBQU0sRUFBRyxRQUFRO1FBQ2hCLFlBQVksR0FBRyxXQUFXLEdBQUcsaUJBQWlCLEdBQUcsQ0FBQyxDQUFDO0tBQ3BEO0lBQ0QsT0FBTyxJQUFJLENBQUMsS0FBSyxDQUFDLENBQUMsWUFBWSxHQUFHLE1BQU0sR0FBRyxDQUFDLENBQUMsR0FBRyxNQUFNLENBQUMsQ0FBQztBQUMxRCxDQUFDO0FBRUQsTUFBTSxVQUFVLFlBQVksQ0FDeEIsT0FBZSxFQUFFLFVBQWtCLEVBQUUsVUFBa0IsRUFDdkQsT0FBb0I7SUFDdEIsSUFBSSxPQUFPLElBQUksSUFBSSxFQUFFO1FBQ25CLE9BQU8sSUFBSSxDQUFDO0tBQ2I7SUFFRCxJQUFJLE9BQU8sS0FBSyxPQUFPLEVBQUU7UUFDdkIsT0FBTyxHQUFHLE9BQU8sR0FBRyxVQUFVLEdBQUcsR0FBRyxDQUFDLENBQUMsVUFBVSxHQUFHLFVBQVUsRUFBRSxDQUFDLENBQUMsQ0FBQyxDQUFDO0tBQ3BFO1NBQU0sSUFBSSxPQUFPLEtBQUssTUFBTSxFQUFFO1FBQzdCLE9BQU8sR0FBRyxPQUFPLEdBQUcsVUFBVSxDQUFDO0tBQ2hDO1NBQU07UUFDTCxNQUFNLElBQUksVUFBVSxDQUFDLDJCQUEyQixPQUFPLEdBQUcsQ0FBQyxDQUFDO0tBQzdEO0lBQ0QsT0FBTyxPQUFPLENBQUM7QUFDakIsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbIi8qKlxuICogQGxpY2Vuc2VcbiAqIENvcHlyaWdodCAyMDE4IEdvb2dsZSBMTENcbiAqXG4gKiBVc2Ugb2YgdGhpcyBzb3VyY2UgY29kZSBpcyBnb3Zlcm5lZCBieSBhbiBNSVQtc3R5bGVcbiAqIGxpY2Vuc2UgdGhhdCBjYW4gYmUgZm91bmQgaW4gdGhlIExJQ0VOU0UgZmlsZSBvciBhdFxuICogaHR0cHM6Ly9vcGVuc291cmNlLm9yZy9saWNlbnNlcy9NSVQuXG4gKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuICovXG5cbmltcG9ydCB7VmFsdWVFcnJvcn0gZnJvbSAnLi4vZXJyb3JzJztcbmltcG9ydCB7UGFkZGluZ01vZGV9IGZyb20gJy4uL2tlcmFzX2Zvcm1hdC9jb21tb24nO1xuXG5pbXBvcnQge3B5TGlzdFJlcGVhdH0gZnJvbSAnLi9nZW5lcmljX3V0aWxzJztcbmltcG9ydCB7aXNJbnRlZ2VyLCBtYXh9IGZyb20gJy4vbWF0aF91dGlscyc7XG5cbi8qKlxuICogVHJhbnNmb3JtcyBhIHNpbmdsZSBudW1iZXIgb2YgYXJyYXkgb2YgbnVtYmVycyBpbnRvIGFuIGFycmF5IG9mIG51bWJlcnMuXG4gKiBAcGFyYW0gdmFsdWVcbiAqIEBwYXJhbSBuOiBUaGUgc2l6ZSBvZiB0aGUgdHVwbGUgdG8gYmUgcmV0dXJuZWQuXG4gKiBAcGFyYW0gbmFtZTogTmFtZSBvZiB0aGUgcGFyYW1ldGVyLCB1c2VkIGZvciBnZW5lcmF0aW5nIGVycm9yIG1lc3NhZ2VzLlxuICogQHJldHVybnMgQW4gYXJyYXkgb2YgbnVtYmVycy5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIG5vcm1hbGl6ZUFycmF5KFxuICAgIHZhbHVlOiBudW1iZXJ8bnVtYmVyW10sIG46IG51bWJlciwgbmFtZTogc3RyaW5nKTogbnVtYmVyW10ge1xuICBpZiAodHlwZW9mIHZhbHVlID09PSAnbnVtYmVyJykge1xuICAgIHJldHVybiBweUxpc3RSZXBlYXQodmFsdWUsIG4pO1xuICB9IGVsc2Uge1xuICAgIGlmICh2YWx1ZS5sZW5ndGggIT09IG4pIHtcbiAgICAgIHRocm93IG5ldyBWYWx1ZUVycm9yKFxuICAgICAgICAgIGBUaGUgJHtuYW1lfSBhcmd1bWVudCBtdXN0IGJlIGFuIGludGVnZXIgb3IgdHVwbGUgb2YgJHtufSBpbnRlZ2Vycy5gICtcbiAgICAgICAgICBgIFJlY2VpdmVkOiAke3ZhbHVlLmxlbmd0aH0gZWxlbWVudHMuYCk7XG4gICAgfVxuICAgIGZvciAobGV0IGkgPSAwOyBpIDwgbjsgKytpKSB7XG4gICAgICBjb25zdCBzaW5nbGVWYWx1ZSA9IHZhbHVlW2ldO1xuICAgICAgaWYgKCFpc0ludGVnZXIoc2luZ2xlVmFsdWUpKSB7XG4gICAgICAgIHRocm93IG5ldyBWYWx1ZUVycm9yKFxuICAgICAgICAgICAgYFRoZSAke25hbWV9IGFyZ3VtZW50IG11c3QgYmUgYW4gaW50ZWdlciBvciB0dXBsZSBvZiAke259YCArXG4gICAgICAgICAgICBgIGludGVnZXJzLiBSZWNlaXZlZDogJHtKU09OLnN0cmluZ2lmeSh2YWx1ZSl9IGluY2x1ZGluZyBhYCArXG4gICAgICAgICAgICBgIG5vbi1pbnRlZ2VyIG51bWJlciAke3NpbmdsZVZhbHVlfWApO1xuICAgICAgfVxuICAgIH1cbiAgICByZXR1cm4gdmFsdWU7XG4gIH1cbn1cblxuLyoqXG4gKiBEZXRlcm1pbmVzIG91dHB1dCBsZW5ndGggb2YgYSBjb252b2x1dGlvbiBnaXZlbiBpbnB1dCBsZW5ndGguXG4gKiBAcGFyYW0gaW5wdXRMZW5ndGhcbiAqIEBwYXJhbSBmaWx0ZXJTaXplXG4gKiBAcGFyYW0gcGFkZGluZ1xuICogQHBhcmFtIHN0cmlkZVxuICogQHBhcmFtIGRpbGF0aW9uOiBkaWxhdGlvbiByYXRlLlxuICovXG5leHBvcnQgZnVuY3Rpb24gY29udk91dHB1dExlbmd0aChcbiAgICBpbnB1dExlbmd0aDogbnVtYmVyLCBmaWx0ZXJTaXplOiBudW1iZXIsIHBhZGRpbmc6IFBhZGRpbmdNb2RlLFxuICAgIHN0cmlkZTogbnVtYmVyLCBkaWxhdGlvbiA9IDEpOiBudW1iZXIge1xuICBpZiAoaW5wdXRMZW5ndGggPT0gbnVsbCkge1xuICAgIHJldHVybiBpbnB1dExlbmd0aDtcbiAgfVxuICBjb25zdCBkaWxhdGVkRmlsdGVyU2l6ZSA9IGZpbHRlclNpemUgKyAoZmlsdGVyU2l6ZSAtIDEpICogKGRpbGF0aW9uIC0gMSk7XG4gIGxldCBvdXRwdXRMZW5ndGg6IG51bWJlcjtcbiAgaWYgKHBhZGRpbmcgPT09ICdzYW1lJykge1xuICAgIG91dHB1dExlbmd0aCA9IGlucHV0TGVuZ3RoO1xuICB9IGVsc2UgeyAgLy8gVkFMSURcbiAgICBvdXRwdXRMZW5ndGggPSBpbnB1dExlbmd0aCAtIGRpbGF0ZWRGaWx0ZXJTaXplICsgMTtcbiAgfVxuICByZXR1cm4gTWF0aC5mbG9vcigob3V0cHV0TGVuZ3RoICsgc3RyaWRlIC0gMSkgLyBzdHJpZGUpO1xufVxuXG5leHBvcnQgZnVuY3Rpb24gZGVjb252TGVuZ3RoKFxuICAgIGRpbVNpemU6IG51bWJlciwgc3RyaWRlU2l6ZTogbnVtYmVyLCBrZXJuZWxTaXplOiBudW1iZXIsXG4gICAgcGFkZGluZzogUGFkZGluZ01vZGUpOiBudW1iZXIge1xuICBpZiAoZGltU2l6ZSA9PSBudWxsKSB7XG4gICAgcmV0dXJuIG51bGw7XG4gIH1cblxuICBpZiAocGFkZGluZyA9PT0gJ3ZhbGlkJykge1xuICAgIGRpbVNpemUgPSBkaW1TaXplICogc3RyaWRlU2l6ZSArIG1heChba2VybmVsU2l6ZSAtIHN0cmlkZVNpemUsIDBdKTtcbiAgfSBlbHNlIGlmIChwYWRkaW5nID09PSAnc2FtZScpIHtcbiAgICBkaW1TaXplID0gZGltU2l6ZSAqIHN0cmlkZVNpemU7XG4gIH0gZWxzZSB7XG4gICAgdGhyb3cgbmV3IFZhbHVlRXJyb3IoYFVuc3VwcG9ydCBwYWRkaW5nIG1vZGU6ICR7cGFkZGluZ30uYCk7XG4gIH1cbiAgcmV0dXJuIGRpbVNpemU7XG59XG4iXX0=","/**\n * @license\n * Copyright 2018 Google LLC\n *\n * Use of this source code is governed by an MIT-style\n * license that can be found in the LICENSE file or at\n * https://opensource.org/licenses/MIT.\n * =============================================================================\n */\n/**\n * TensorFlow.js Layers: Convolutional Layers\n */\nimport * as tfc from '@tensorflow/tfjs-core';\nimport { serialization, tidy } from '@tensorflow/tfjs-core';\nimport { getActivation, serializeActivation } from '../activations';\nimport { imageDataFormat } from '../backend/common';\nimport * as K from '../backend/tfjs_backend';\nimport { checkDataFormat, checkInterpolationFormat, checkPaddingMode } from '../common';\nimport { getConstraint, serializeConstraint } from '../constraints';\nimport { InputSpec, Layer } from '../engine/topology';\nimport { NotImplementedError, ValueError } from '../errors';\nimport { getInitializer, serializeInitializer } from '../initializers';\nimport { getRegularizer, serializeRegularizer } from '../regularizers';\nimport { convOutputLength, deconvLength, normalizeArray } from '../utils/conv_utils';\nimport * as generic_utils from '../utils/generic_utils';\nimport { getExactlyOneShape, getExactlyOneTensor } from '../utils/types_utils';\n/**\n * Transpose and cast the input before the conv2d.\n * @param x Input image tensor.\n * @param dataFormat\n */\nexport function preprocessConv2DInput(x, dataFormat) {\n // TODO(cais): Cast type to float32 if not.\n return tidy(() => {\n checkDataFormat(dataFormat);\n if (dataFormat === 'channelsFirst') {\n return tfc.transpose(x, [0, 2, 3, 1]); // NCHW -> NHWC.\n }\n else {\n return x;\n }\n });\n}\n/**\n * Transpose and cast the input before the conv3d.\n * @param x Input image tensor.\n * @param dataFormat\n */\nexport function preprocessConv3DInput(x, dataFormat) {\n return tidy(() => {\n checkDataFormat(dataFormat);\n if (dataFormat === 'channelsFirst') {\n return tfc.transpose(x, [0, 2, 3, 4, 1]); // NCDHW -> NDHWC.\n }\n else {\n return x;\n }\n });\n}\n/**\n * 1D-convolution with bias added.\n *\n * Porting Note: This function does not exist in the Python Keras backend.\n * It is exactly the same as `conv2d`, except the added `bias`.\n *\n * @param x Input tensor, rank-3, of shape `[batchSize, width, inChannels]`.\n * @param kernel Kernel, rank-3, of shape `[filterWidth, inDepth, outDepth]`.\n * @param bias Bias, rank-3, of shape `[outDepth]`.\n * @param strides\n * @param padding Padding mode.\n * @param dataFormat Data format.\n * @param dilationRate\n * @returns The result of the 1D convolution.\n * @throws ValueError, if `x`, `kernel` or `bias` is not of the correct rank.\n */\nexport function conv1dWithBias(x, kernel, bias, strides = 1, padding = 'valid', dataFormat, dilationRate = 1) {\n return tidy(() => {\n if (dataFormat == null) {\n dataFormat = imageDataFormat();\n }\n checkDataFormat(dataFormat);\n // Check the ranks of x, kernel and bias.\n if (x.shape.length !== 3) {\n throw new ValueError(`The input of a conv1dWithBias operation should be 3, but is ` +\n `${x.shape.length} instead.`);\n }\n if (kernel.shape.length !== 3) {\n throw new ValueError(`The kernel for a conv1dWithBias operation should be 3, but is ` +\n `${kernel.shape.length} instead`);\n }\n if (bias != null && bias.shape.length !== 1) {\n throw new ValueError(`The bias for a conv1dWithBias operation should be 1, but is ` +\n `${kernel.shape.length} instead`);\n }\n // TODO(cais): Support CAUSAL padding mode.\n if (dataFormat === 'channelsFirst') {\n x = tfc.transpose(x, [0, 2, 1]); // NCW -> NWC.\n }\n if (padding === 'causal') {\n throw new NotImplementedError('The support for CAUSAL padding mode in conv1dWithBias is not ' +\n 'implemented yet.');\n }\n let y = tfc.conv1d(x, kernel, strides, padding === 'same' ? 'same' : 'valid', 'NWC', dilationRate);\n if (bias != null) {\n y = K.biasAdd(y, bias);\n }\n return y;\n });\n}\n/**\n * 1D-convolution.\n *\n * @param x Input tensor, rank-3, of shape `[batchSize, width, inChannels]`.\n * @param kernel Kernel, rank-3, of shape `[filterWidth, inDepth, outDepth]`.s\n * @param strides\n * @param padding Padding mode.\n * @param dataFormat Data format.\n * @param dilationRate\n * @returns The result of the 1D convolution.\n * @throws ValueError, if `x`, `kernel` or `bias` is not of the correct rank.\n */\nexport function conv1d(x, kernel, strides = 1, padding = 'valid', dataFormat, dilationRate = 1) {\n return tidy(() => {\n checkDataFormat(dataFormat);\n return conv1dWithBias(x, kernel, null, strides, padding, dataFormat, dilationRate);\n });\n}\n/**\n * 2D Convolution\n * @param x\n * @param kernel kernel of the convolution.\n * @param strides strides array.\n * @param padding padding mode. Default to 'valid'.\n * @param dataFormat data format. Defaults to 'channelsLast'.\n * @param dilationRate dilation rate array.\n * @returns Result of the 2D pooling.\n */\nexport function conv2d(x, kernel, strides = [1, 1], padding = 'valid', dataFormat, dilationRate) {\n return tidy(() => {\n checkDataFormat(dataFormat);\n return conv2dWithBiasActivation(x, kernel, null, strides, padding, dataFormat, dilationRate);\n });\n}\n/**\n * 2D Convolution with an added bias and optional activation.\n * Note: This function does not exist in the Python Keras Backend. This function\n * is exactly the same as `conv2d`, except the added `bias`.\n */\nexport function conv2dWithBiasActivation(x, kernel, bias, strides = [1, 1], padding = 'valid', dataFormat, dilationRate, activation = null) {\n return tidy(() => {\n if (dataFormat == null) {\n dataFormat = imageDataFormat();\n }\n checkDataFormat(dataFormat);\n if (x.rank !== 3 && x.rank !== 4) {\n throw new ValueError(`conv2dWithBiasActivation expects input to be of rank 3 or 4, ` +\n `but received ${x.rank}.`);\n }\n if (kernel.rank !== 3 && kernel.rank !== 4) {\n throw new ValueError(`conv2dWithBiasActivation expects kernel to be of rank 3 or 4, ` +\n `but received ${x.rank}.`);\n }\n let y = preprocessConv2DInput(x, dataFormat);\n if (padding === 'causal') {\n throw new NotImplementedError('The support for CAUSAL padding mode in conv1dWithBias is not ' +\n 'implemented yet.');\n }\n y = tfc.fused.conv2d({\n x: y,\n filter: kernel,\n strides: strides,\n pad: padding === 'same' ? 'same' : 'valid',\n dilations: dilationRate,\n dataFormat: 'NHWC',\n bias,\n activation\n });\n if (dataFormat === 'channelsFirst') {\n y = tfc.transpose(y, [0, 3, 1, 2]);\n }\n return y;\n });\n}\n/**\n * 3D Convolution.\n * @param x\n * @param kernel kernel of the convolution.\n * @param strides strides array.\n * @param padding padding mode. Default to 'valid'.\n * @param dataFormat data format. Defaults to 'channelsLast'.\n * @param dilationRate dilation rate array.\n * @returns Result of the 3D convolution.\n */\nexport function conv3d(x, kernel, strides = [1, 1, 1], padding = 'valid', dataFormat, dilationRate) {\n return tidy(() => {\n checkDataFormat(dataFormat);\n return conv3dWithBias(x, kernel, null, strides, padding, dataFormat, dilationRate);\n });\n}\n/**\n * 3D Convolution with an added bias.\n * Note: This function does not exist in the Python Keras Backend. This function\n * is exactly the same as `conv3d`, except the added `bias`.\n */\nexport function conv3dWithBias(x, kernel, bias, strides = [1, 1, 1], padding = 'valid', dataFormat, dilationRate) {\n return tidy(() => {\n if (dataFormat == null) {\n dataFormat = imageDataFormat();\n }\n checkDataFormat(dataFormat);\n if (x.rank !== 4 && x.rank !== 5) {\n throw new ValueError(`conv3dWithBias expects input to be of rank 4 or 5, but received ` +\n `${x.rank}.`);\n }\n if (kernel.rank !== 4 && kernel.rank !== 5) {\n throw new ValueError(`conv3dWithBias expects kernel to be of rank 4 or 5, but received ` +\n `${x.rank}.`);\n }\n let y = preprocessConv3DInput(x, dataFormat);\n if (padding === 'causal') {\n throw new NotImplementedError('The support for CAUSAL padding mode in conv3dWithBias is not ' +\n 'implemented yet.');\n }\n y = tfc.conv3d(y, kernel, strides, padding === 'same' ? 'same' : 'valid', 'NDHWC', dilationRate);\n if (bias != null) {\n y = K.biasAdd(y, bias);\n }\n if (dataFormat === 'channelsFirst') {\n y = tfc.transpose(y, [0, 4, 1, 2, 3]);\n }\n return y;\n });\n}\n/**\n * Abstract convolution layer.\n */\nexport class BaseConv extends Layer {\n constructor(rank, args) {\n super(args);\n this.bias = null;\n this.DEFAULT_KERNEL_INITIALIZER = 'glorotNormal';\n this.DEFAULT_BIAS_INITIALIZER = 'zeros';\n BaseConv.verifyArgs(args);\n this.rank = rank;\n generic_utils.assertPositiveInteger(this.rank, 'rank');\n if (this.rank !== 1 && this.rank !== 2 && this.rank !== 3) {\n throw new NotImplementedError(`Convolution layer for rank other than 1, 2, or 3 (${this.rank}) is ` +\n `not implemented yet.`);\n }\n this.kernelSize = normalizeArray(args.kernelSize, rank, 'kernelSize');\n this.strides = normalizeArray(args.strides == null ? 1 : args.strides, rank, 'strides');\n this.padding = args.padding == null ? 'valid' : args.padding;\n checkPaddingMode(this.padding);\n this.dataFormat =\n args.dataFormat == null ? 'channelsLast' : args.dataFormat;\n checkDataFormat(this.dataFormat);\n this.activation = getActivation(args.activation);\n this.useBias = args.useBias == null ? true : args.useBias;\n this.biasInitializer =\n getInitializer(args.biasInitializer || this.DEFAULT_BIAS_INITIALIZER);\n this.biasConstraint = getConstraint(args.biasConstraint);\n this.biasRegularizer = getRegularizer(args.biasRegularizer);\n this.activityRegularizer = getRegularizer(args.activityRegularizer);\n this.dilationRate = normalizeArray(args.dilationRate == null ? 1 : args.dilationRate, rank, 'dilationRate');\n if (this.rank === 1 &&\n (Array.isArray(this.dilationRate) && this.dilationRate.length !== 1)) {\n throw new ValueError(`dilationRate must be a number or an array of a single number ` +\n `for 1D convolution, but received ` +\n `${JSON.stringify(this.dilationRate)}`);\n }\n else if (this.rank === 2) {\n if (typeof this.dilationRate === 'number') {\n this.dilationRate = [this.dilationRate, this.dilationRate];\n }\n else if (this.dilationRate.length !== 2) {\n throw new ValueError(`dilationRate must be a number or array of two numbers for 2D ` +\n `convolution, but received ${JSON.stringify(this.dilationRate)}`);\n }\n }\n else if (this.rank === 3) {\n if (typeof this.dilationRate === 'number') {\n this.dilationRate =\n [this.dilationRate, this.dilationRate, this.dilationRate];\n }\n else if (this.dilationRate.length !== 3) {\n throw new ValueError(`dilationRate must be a number or array of three numbers for 3D ` +\n `convolution, but received ${JSON.stringify(this.dilationRate)}`);\n }\n }\n }\n static verifyArgs(args) {\n // Check config.kernelSize type and shape.\n generic_utils.assert('kernelSize' in args, `required key 'kernelSize' not in config`);\n if (typeof args.kernelSize !== 'number' &&\n !generic_utils.checkArrayTypeAndLength(args.kernelSize, 'number', 1, 3)) {\n throw new ValueError(`BaseConv expects config.kernelSize to be number or number[] with ` +\n `length 1, 2, or 3, but received ${JSON.stringify(args.kernelSize)}.`);\n }\n }\n getConfig() {\n const config = {\n kernelSize: this.kernelSize,\n strides: this.strides,\n padding: this.padding,\n dataFormat: this.dataFormat,\n dilationRate: this.dilationRate,\n activation: serializeActivation(this.activation),\n useBias: this.useBias,\n biasInitializer: serializeInitializer(this.biasInitializer),\n biasRegularizer: serializeRegularizer(this.biasRegularizer),\n activityRegularizer: serializeRegularizer(this.activityRegularizer),\n biasConstraint: serializeConstraint(this.biasConstraint)\n };\n const baseConfig = super.getConfig();\n Object.assign(config, baseConfig);\n return config;\n }\n}\n/**\n * Abstract nD convolution layer. Ancestor of convolution layers which reduce\n * across channels, i.e., Conv1D and Conv2D, but not DepthwiseConv2D.\n */\nexport class Conv extends BaseConv {\n constructor(rank, args) {\n super(rank, args);\n this.kernel = null;\n Conv.verifyArgs(args);\n this.filters = args.filters;\n generic_utils.assertPositiveInteger(this.filters, 'filters');\n this.kernelInitializer = getInitializer(args.kernelInitializer || this.DEFAULT_KERNEL_INITIALIZER);\n this.kernelConstraint = getConstraint(args.kernelConstraint);\n this.kernelRegularizer = getRegularizer(args.kernelRegularizer);\n }\n build(inputShape) {\n inputShape = getExactlyOneShape(inputShape);\n const channelAxis = this.dataFormat === 'channelsFirst' ? 1 : inputShape.length - 1;\n if (inputShape[channelAxis] == null) {\n throw new ValueError(`The channel dimension of the input should be defined. ` +\n `Found ${inputShape[channelAxis]}`);\n }\n const inputDim = inputShape[channelAxis];\n const kernelShape = this.kernelSize.concat([inputDim, this.filters]);\n this.kernel = this.addWeight('kernel', kernelShape, null, this.kernelInitializer, this.kernelRegularizer, true, this.kernelConstraint);\n if (this.useBias) {\n this.bias = this.addWeight('bias', [this.filters], null, this.biasInitializer, this.biasRegularizer, true, this.biasConstraint);\n }\n this.inputSpec = [{ ndim: this.rank + 2, axes: { [channelAxis]: inputDim } }];\n this.built = true;\n }\n call(inputs, kwargs) {\n return tidy(() => {\n inputs = getExactlyOneTensor(inputs);\n let outputs;\n const biasValue = this.bias == null ? null : this.bias.read();\n const fusedActivationName = generic_utils.mapActivationToFusedKernel(this.activation.getClassName());\n if (fusedActivationName != null && this.rank === 2) {\n outputs = conv2dWithBiasActivation(inputs, this.kernel.read(), biasValue, this.strides, this.padding, this.dataFormat, this.dilationRate, fusedActivationName);\n }\n else {\n if (this.rank === 1) {\n outputs = conv1dWithBias(inputs, this.kernel.read(), biasValue, this.strides[0], this.padding, this.dataFormat, this.dilationRate[0]);\n }\n else if (this.rank === 2) {\n // TODO(cais): Move up to constructor.\n outputs = conv2dWithBiasActivation(inputs, this.kernel.read(), biasValue, this.strides, this.padding, this.dataFormat, this.dilationRate);\n }\n else if (this.rank === 3) {\n outputs = conv3dWithBias(inputs, this.kernel.read(), biasValue, this.strides, this.padding, this.dataFormat, this.dilationRate);\n }\n else {\n throw new NotImplementedError('convolutions greater than 3D are not implemented yet.');\n }\n if (this.activation != null) {\n outputs = this.activation.apply(outputs);\n }\n }\n return outputs;\n });\n }\n computeOutputShape(inputShape) {\n inputShape = getExactlyOneShape(inputShape);\n const newSpace = [];\n const space = (this.dataFormat === 'channelsLast') ?\n inputShape.slice(1, inputShape.length - 1) :\n inputShape.slice(2);\n for (let i = 0; i < space.length; ++i) {\n const newDim = convOutputLength(space[i], this.kernelSize[i], this.padding, this.strides[i], typeof this.dilationRate === 'number' ? this.dilationRate :\n this.dilationRate[i]);\n newSpace.push(newDim);\n }\n let outputShape = [inputShape[0]];\n if (this.dataFormat === 'channelsLast') {\n outputShape = outputShape.concat(newSpace);\n outputShape.push(this.filters);\n }\n else {\n outputShape.push(this.filters);\n outputShape = outputShape.concat(newSpace);\n }\n return outputShape;\n }\n getConfig() {\n const config = {\n filters: this.filters,\n kernelInitializer: serializeInitializer(this.kernelInitializer),\n kernelRegularizer: serializeRegularizer(this.kernelRegularizer),\n kernelConstraint: serializeConstraint(this.kernelConstraint)\n };\n const baseConfig = super.getConfig();\n Object.assign(config, baseConfig);\n return config;\n }\n static verifyArgs(args) {\n // Check config.filters type, shape, and value.\n if (!('filters' in args) || typeof args.filters !== 'number' ||\n args.filters < 1) {\n throw new ValueError(`Convolution layer expected config.filters to be a 'number' > 0 ` +\n `but got ${JSON.stringify(args.filters)}`);\n }\n }\n}\nexport class Conv2D extends Conv {\n constructor(args) {\n super(2, args);\n Conv2D.verifyArgs(args);\n }\n getConfig() {\n const config = super.getConfig();\n delete config['rank'];\n return config;\n }\n static verifyArgs(args) {\n // config.kernelSize must be a number or array of numbers.\n if ((typeof args.kernelSize !== 'number') &&\n !generic_utils.checkArrayTypeAndLength(args.kernelSize, 'number', 1, 2)) {\n throw new ValueError(`Conv2D expects config.kernelSize to be number or number[] with ` +\n `length 1 or 2, but received ${JSON.stringify(args.kernelSize)}.`);\n }\n }\n}\n/** @nocollapse */\nConv2D.className = 'Conv2D';\nserialization.registerClass(Conv2D);\nexport class Conv3D extends Conv {\n constructor(args) {\n super(3, args);\n Conv3D.verifyArgs(args);\n }\n getConfig() {\n const config = super.getConfig();\n delete config['rank'];\n return config;\n }\n static verifyArgs(args) {\n // config.kernelSize must be a number or array of numbers.\n if (typeof args.kernelSize !== 'number') {\n if (!(Array.isArray(args.kernelSize) &&\n (args.kernelSize.length === 1 || args.kernelSize.length === 3))) {\n throw new ValueError(`Conv3D expects config.kernelSize to be number or` +\n ` [number, number, number], but received ${JSON.stringify(args.kernelSize)}.`);\n }\n }\n }\n}\n/** @nocollapse */\nConv3D.className = 'Conv3D';\nserialization.registerClass(Conv3D);\nexport class Conv2DTranspose extends Conv2D {\n constructor(args) {\n super(args);\n this.inputSpec = [new InputSpec({ ndim: 4 })];\n if (this.padding !== 'same' && this.padding !== 'valid') {\n throw new ValueError(`Conv2DTranspose currently supports only padding modes 'same' ` +\n `and 'valid', but received padding mode ${this.padding}`);\n }\n }\n build(inputShape) {\n inputShape = getExactlyOneShape(inputShape);\n if (inputShape.length !== 4) {\n throw new ValueError('Input should have rank 4; Received input shape: ' +\n JSON.stringify(inputShape));\n }\n const channelAxis = this.dataFormat === 'channelsFirst' ? 1 : inputShape.length - 1;\n if (inputShape[channelAxis] == null) {\n throw new ValueError('The channel dimension of the inputs should be defined. ' +\n 'Found `None`.');\n }\n const inputDim = inputShape[channelAxis];\n const kernelShape = this.kernelSize.concat([this.filters, inputDim]);\n this.kernel = this.addWeight('kernel', kernelShape, 'float32', this.kernelInitializer, this.kernelRegularizer, true, this.kernelConstraint);\n if (this.useBias) {\n this.bias = this.addWeight('bias', [this.filters], 'float32', this.biasInitializer, this.biasRegularizer, true, this.biasConstraint);\n }\n // Set input spec.\n this.inputSpec =\n [new InputSpec({ ndim: 4, axes: { [channelAxis]: inputDim } })];\n this.built = true;\n }\n call(inputs, kwargs) {\n return tfc.tidy(() => {\n let input = getExactlyOneTensor(inputs);\n if (input.shape.length !== 4) {\n throw new ValueError(`Conv2DTranspose.call() expects input tensor to be rank-4, but ` +\n `received a tensor of rank-${input.shape.length}`);\n }\n const inputShape = input.shape;\n const batchSize = inputShape[0];\n let hAxis;\n let wAxis;\n if (this.dataFormat === 'channelsFirst') {\n hAxis = 2;\n wAxis = 3;\n }\n else {\n hAxis = 1;\n wAxis = 2;\n }\n const height = inputShape[hAxis];\n const width = inputShape[wAxis];\n const kernelH = this.kernelSize[0];\n const kernelW = this.kernelSize[1];\n const strideH = this.strides[0];\n const strideW = this.strides[1];\n // Infer the dynamic output shape.\n const outHeight = deconvLength(height, strideH, kernelH, this.padding);\n const outWidth = deconvLength(width, strideW, kernelW, this.padding);\n // Porting Note: We don't branch based on `this.dataFormat` here,\n // because\n // the tjfs-core function `conv2dTranspose` called below always\n // assumes channelsLast.\n const outputShape = [batchSize, outHeight, outWidth, this.filters];\n if (this.dataFormat !== 'channelsLast') {\n input = tfc.transpose(input, [0, 2, 3, 1]);\n }\n let outputs = tfc.conv2dTranspose(input, this.kernel.read(), outputShape, this.strides, this.padding);\n if (this.dataFormat !== 'channelsLast') {\n outputs = tfc.transpose(outputs, [0, 3, 1, 2]);\n }\n if (this.bias != null) {\n outputs =\n K.biasAdd(outputs, this.bias.read(), this.dataFormat);\n }\n if (this.activation != null) {\n outputs = this.activation.apply(outputs);\n }\n return outputs;\n });\n }\n computeOutputShape(inputShape) {\n inputShape = getExactlyOneShape(inputShape);\n const outputShape = inputShape.slice();\n let channelAxis;\n let heightAxis;\n let widthAxis;\n if (this.dataFormat === 'channelsFirst') {\n channelAxis = 1;\n heightAxis = 2;\n widthAxis = 3;\n }\n else {\n channelAxis = 3;\n heightAxis = 1;\n widthAxis = 2;\n }\n const kernelH = this.kernelSize[0];\n const kernelW = this.kernelSize[1];\n const strideH = this.strides[0];\n const strideW = this.strides[1];\n outputShape[channelAxis] = this.filters;\n outputShape[heightAxis] =\n deconvLength(outputShape[heightAxis], strideH, kernelH, this.padding);\n outputShape[widthAxis] =\n deconvLength(outputShape[widthAxis], strideW, kernelW, this.padding);\n return outputShape;\n }\n getConfig() {\n const config = super.getConfig();\n delete config['dilationRate'];\n return config;\n }\n}\n/** @nocollapse */\nConv2DTranspose.className = 'Conv2DTranspose';\nserialization.registerClass(Conv2DTranspose);\nexport class Conv3DTranspose extends Conv3D {\n constructor(args) {\n super(args);\n this.inputSpec = [new InputSpec({ ndim: 5 })];\n if (this.padding !== 'same' && this.padding !== 'valid') {\n throw new ValueError(`Conv3DTranspose currently supports only padding modes 'same' ` +\n `and 'valid', but received padding mode ${this.padding}`);\n }\n }\n build(inputShape) {\n inputShape = getExactlyOneShape(inputShape);\n if (inputShape.length !== 5) {\n throw new ValueError('Input should have rank 5; Received input shape: ' +\n JSON.stringify(inputShape));\n }\n const channelAxis = this.dataFormat === 'channelsFirst' ? 1 : inputShape.length - 1;\n if (inputShape[channelAxis] == null) {\n throw new ValueError('The channel dimension of the inputs should be defined. ' +\n 'Found `None`.');\n }\n const inputDim = inputShape[channelAxis];\n const kernelShape = this.kernelSize.concat([this.filters, inputDim]);\n this.kernel = this.addWeight('kernel', kernelShape, 'float32', this.kernelInitializer, this.kernelRegularizer, true, this.kernelConstraint);\n if (this.useBias) {\n this.bias = this.addWeight('bias', [this.filters], 'float32', this.biasInitializer, this.biasRegularizer, true, this.biasConstraint);\n }\n // Set input spec.\n this.inputSpec =\n [new InputSpec({ ndim: 5, axes: { [channelAxis]: inputDim } })];\n this.built = true;\n }\n call(inputs, kwargs) {\n return tfc.tidy(() => {\n let input = getExactlyOneTensor(inputs);\n if (input.shape.length !== 5) {\n throw new ValueError(`Conv3DTranspose.call() expects input tensor to be rank-4, but ` +\n `received a tensor of rank-${input.shape.length}`);\n }\n const inputShape = input.shape;\n const batchSize = inputShape[0];\n let hAxis;\n let wAxis;\n let dAxis;\n if (this.dataFormat === 'channelsFirst') {\n dAxis = 2;\n hAxis = 3;\n wAxis = 4;\n }\n else {\n dAxis = 1;\n hAxis = 2;\n wAxis = 3;\n }\n const depth = inputShape[dAxis];\n const height = inputShape[hAxis];\n const width = inputShape[wAxis];\n const kernelD = this.kernelSize[0];\n const kernelH = this.kernelSize[1];\n const kernelW = this.kernelSize[2];\n const strideD = this.strides[0];\n const strideH = this.strides[1];\n const strideW = this.strides[2];\n // Infer the dynamic output shape.\n const outDepth = deconvLength(depth, strideD, kernelD, this.padding);\n const outHeight = deconvLength(height, strideH, kernelH, this.padding);\n const outWidth = deconvLength(width, strideW, kernelW, this.padding);\n // Same as `conv2dTranspose`. We always assumes channelsLast.\n const outputShape = [batchSize, outDepth, outHeight, outWidth, this.filters];\n if (this.dataFormat !== 'channelsLast') {\n input = tfc.transpose(input, [0, 2, 3, 4, 1]);\n }\n let outputs = tfc.conv3dTranspose(input, this.kernel.read(), outputShape, this.strides, this.padding);\n if (this.dataFormat !== 'channelsLast') {\n outputs = tfc.transpose(outputs, [0, 4, 1, 2, 3]);\n }\n if (this.bias !== null) {\n outputs =\n K.biasAdd(outputs, this.bias.read(), this.dataFormat);\n }\n if (this.activation !== null) {\n outputs = this.activation.apply(outputs);\n }\n return outputs;\n });\n }\n computeOutputShape(inputShape) {\n inputShape = getExactlyOneShape(inputShape);\n const outputShape = inputShape.slice();\n let channelAxis;\n let depthAxis;\n let heightAxis;\n let widthAxis;\n if (this.dataFormat === 'channelsFirst') {\n channelAxis = 1;\n depthAxis = 2;\n heightAxis = 3;\n widthAxis = 4;\n }\n else {\n channelAxis = 4;\n depthAxis = 1;\n heightAxis = 2;\n widthAxis = 3;\n }\n const kernelD = this.kernelSize[0];\n const kernelH = this.kernelSize[1];\n const kernelW = this.kernelSize[2];\n const strideD = this.strides[0];\n const strideH = this.strides[1];\n const strideW = this.strides[2];\n outputShape[channelAxis] = this.filters;\n outputShape[depthAxis] =\n deconvLength(outputShape[depthAxis], strideD, kernelD, this.padding);\n outputShape[heightAxis] =\n deconvLength(outputShape[heightAxis], strideH, kernelH, this.padding);\n outputShape[widthAxis] =\n deconvLength(outputShape[widthAxis], strideW, kernelW, this.padding);\n return outputShape;\n }\n getConfig() {\n const config = super.getConfig();\n delete config['dilationRate'];\n return config;\n }\n}\n/** @nocollapse */\nConv3DTranspose.className = 'Conv3DTranspose';\nserialization.registerClass(Conv3DTranspose);\nexport class SeparableConv extends Conv {\n constructor(rank, config) {\n super(rank, config);\n this.DEFAULT_DEPTHWISE_INITIALIZER = 'glorotUniform';\n this.DEFAULT_POINTWISE_INITIALIZER = 'glorotUniform';\n this.depthwiseKernel = null;\n this.pointwiseKernel = null;\n if (config.filters == null) {\n throw new ValueError('The `filters` configuration field is required by SeparableConv, ' +\n 'but is unspecified.');\n }\n if (config.kernelInitializer != null || config.kernelRegularizer != null ||\n config.kernelConstraint != null) {\n throw new ValueError('Fields kernelInitializer, kernelRegularizer and kernelConstraint ' +\n 'are invalid for SeparableConv2D. Use depthwiseInitializer, ' +\n 'depthwiseRegularizer, depthwiseConstraint, pointwiseInitializer, ' +\n 'pointwiseRegularizer and pointwiseConstraint instead.');\n }\n if (config.padding != null && config.padding !== 'same' &&\n config.padding !== 'valid') {\n throw new ValueError(`SeparableConv${this.rank}D supports only padding modes: ` +\n `'same' and 'valid', but received ${JSON.stringify(config.padding)}`);\n }\n this.depthMultiplier =\n config.depthMultiplier == null ? 1 : config.depthMultiplier;\n this.depthwiseInitializer = getInitializer(config.depthwiseInitializer || this.DEFAULT_DEPTHWISE_INITIALIZER);\n this.depthwiseRegularizer = getRegularizer(config.depthwiseRegularizer);\n this.depthwiseConstraint = getConstraint(config.depthwiseConstraint);\n this.pointwiseInitializer = getInitializer(config.depthwiseInitializer || this.DEFAULT_POINTWISE_INITIALIZER);\n this.pointwiseRegularizer = getRegularizer(config.pointwiseRegularizer);\n this.pointwiseConstraint = getConstraint(config.pointwiseConstraint);\n }\n build(inputShape) {\n inputShape = getExactlyOneShape(inputShape);\n if (inputShape.length < this.rank + 2) {\n throw new ValueError(`Inputs to SeparableConv${this.rank}D should have rank ` +\n `${this.rank + 2}, but received input shape: ` +\n `${JSON.stringify(inputShape)}`);\n }\n const channelAxis = this.dataFormat === 'channelsFirst' ? 1 : inputShape.length - 1;\n if (inputShape[channelAxis] == null || inputShape[channelAxis] < 0) {\n throw new ValueError(`The channel dimension of the inputs should be defined, ` +\n `but found ${JSON.stringify(inputShape[channelAxis])}`);\n }\n const inputDim = inputShape[channelAxis];\n const depthwiseKernelShape = this.kernelSize.concat([inputDim, this.depthMultiplier]);\n const pointwiseKernelShape = [];\n for (let i = 0; i < this.rank; ++i) {\n pointwiseKernelShape.push(1);\n }\n pointwiseKernelShape.push(inputDim * this.depthMultiplier, this.filters);\n const trainable = true;\n this.depthwiseKernel = this.addWeight('depthwise_kernel', depthwiseKernelShape, 'float32', this.depthwiseInitializer, this.depthwiseRegularizer, trainable, this.depthwiseConstraint);\n this.pointwiseKernel = this.addWeight('pointwise_kernel', pointwiseKernelShape, 'float32', this.pointwiseInitializer, this.pointwiseRegularizer, trainable, this.pointwiseConstraint);\n if (this.useBias) {\n this.bias = this.addWeight('bias', [this.filters], 'float32', this.biasInitializer, this.biasRegularizer, trainable, this.biasConstraint);\n }\n else {\n this.bias = null;\n }\n this.inputSpec =\n [new InputSpec({ ndim: this.rank + 2, axes: { [channelAxis]: inputDim } })];\n this.built = true;\n }\n call(inputs, kwargs) {\n return tidy(() => {\n inputs = getExactlyOneTensor(inputs);\n let output;\n if (this.rank === 1) {\n throw new NotImplementedError('1D separable convolution is not implemented yet.');\n }\n else if (this.rank === 2) {\n if (this.dataFormat === 'channelsFirst') {\n inputs = tfc.transpose(inputs, [0, 2, 3, 1]); // NCHW -> NHWC.\n }\n output = tfc.separableConv2d(inputs, this.depthwiseKernel.read(), this.pointwiseKernel.read(), this.strides, this.padding, this.dilationRate, 'NHWC');\n }\n if (this.useBias) {\n output = K.biasAdd(output, this.bias.read(), this.dataFormat);\n }\n if (this.activation != null) {\n output = this.activation.apply(output);\n }\n if (this.dataFormat === 'channelsFirst') {\n output = tfc.transpose(output, [0, 3, 1, 2]); // NHWC -> NCHW.\n }\n return output;\n });\n }\n getConfig() {\n const config = super.getConfig();\n delete config['rank'];\n delete config['kernelInitializer'];\n delete config['kernelRegularizer'];\n delete config['kernelConstraint'];\n config['depthwiseInitializer'] =\n serializeInitializer(this.depthwiseInitializer);\n config['pointwiseInitializer'] =\n serializeInitializer(this.pointwiseInitializer);\n config['depthwiseRegularizer'] =\n serializeRegularizer(this.depthwiseRegularizer);\n config['pointwiseRegularizer'] =\n serializeRegularizer(this.pointwiseRegularizer);\n config['depthwiseConstraint'] =\n serializeConstraint(this.depthwiseConstraint);\n config['pointwiseConstraint'] =\n serializeConstraint(this.pointwiseConstraint);\n return config;\n }\n}\n/** @nocollapse */\nSeparableConv.className = 'SeparableConv';\nexport class SeparableConv2D extends SeparableConv {\n constructor(args) {\n super(2, args);\n }\n}\n/** @nocollapse */\nSeparableConv2D.className = 'SeparableConv2D';\nserialization.registerClass(SeparableConv2D);\nexport class Conv1D extends Conv {\n constructor(args) {\n super(1, args);\n Conv1D.verifyArgs(args);\n this.inputSpec = [{ ndim: 3 }];\n }\n getConfig() {\n const config = super.getConfig();\n delete config['rank'];\n delete config['dataFormat'];\n return config;\n }\n static verifyArgs(args) {\n // config.kernelSize must be a number or array of numbers.\n if (typeof args.kernelSize !== 'number' &&\n !generic_utils.checkArrayTypeAndLength(args.kernelSize, 'number', 1, 1)) {\n throw new ValueError(`Conv1D expects config.kernelSize to be number or number[] with ` +\n `length 1, but received ${JSON.stringify(args.kernelSize)}.`);\n }\n }\n}\n/** @nocollapse */\nConv1D.className = 'Conv1D';\nserialization.registerClass(Conv1D);\nexport class Cropping2D extends Layer {\n constructor(args) {\n super(args);\n if (typeof args.cropping === 'number') {\n this.cropping =\n [[args.cropping, args.cropping], [args.cropping, args.cropping]];\n }\n else if (typeof args.cropping[0] === 'number') {\n this.cropping = [\n [args.cropping[0], args.cropping[0]],\n [args.cropping[1], args.cropping[1]]\n ];\n }\n else {\n this.cropping = args.cropping;\n }\n this.dataFormat =\n args.dataFormat === undefined ? 'channelsLast' : args.dataFormat;\n this.inputSpec = [{ ndim: 4 }];\n }\n computeOutputShape(inputShape) {\n if (this.dataFormat === 'channelsFirst') {\n return [\n inputShape[0], inputShape[1],\n inputShape[2] - this.cropping[0][0] - this.cropping[0][1],\n inputShape[3] - this.cropping[1][0] - this.cropping[1][1]\n ];\n }\n else {\n return [\n inputShape[0],\n inputShape[1] - this.cropping[0][0] - this.cropping[0][1],\n inputShape[2] - this.cropping[1][0] - this.cropping[1][1], inputShape[3]\n ];\n }\n }\n call(inputs, kwargs) {\n return tidy(() => {\n inputs = getExactlyOneTensor(inputs);\n if (this.dataFormat === 'channelsLast') {\n const hSliced = K.sliceAlongAxis(inputs, this.cropping[0][0], inputs.shape[1] - this.cropping[0][0] - this.cropping[0][1], 2);\n return K.sliceAlongAxis(hSliced, this.cropping[1][0], inputs.shape[2] - this.cropping[1][1] - this.cropping[1][0], 3);\n }\n else {\n const hSliced = K.sliceAlongAxis(inputs, this.cropping[0][0], inputs.shape[2] - this.cropping[0][0] - this.cropping[0][1], 3);\n return K.sliceAlongAxis(hSliced, this.cropping[1][0], inputs.shape[3] - this.cropping[1][1] - this.cropping[1][0], 4);\n }\n });\n }\n getConfig() {\n const config = { cropping: this.cropping, dataFormat: this.dataFormat };\n const baseConfig = super.getConfig();\n Object.assign(config, baseConfig);\n return config;\n }\n}\n/** @nocollapse */\nCropping2D.className = 'Cropping2D';\nserialization.registerClass(Cropping2D);\nexport class UpSampling2D extends Layer {\n constructor(args) {\n super(args);\n this.DEFAULT_SIZE = [2, 2];\n this.inputSpec = [{ ndim: 4 }];\n this.size = args.size == null ? this.DEFAULT_SIZE : args.size;\n this.dataFormat =\n args.dataFormat == null ? 'channelsLast' : args.dataFormat;\n checkDataFormat(this.dataFormat);\n this.interpolation =\n args.interpolation == null ? 'nearest' : args.interpolation;\n checkInterpolationFormat(this.interpolation);\n }\n computeOutputShape(inputShape) {\n if (this.dataFormat === 'channelsFirst') {\n const height = inputShape[2] == null ? null : this.size[0] * inputShape[2];\n const width = inputShape[3] == null ? null : this.size[1] * inputShape[3];\n return [inputShape[0], inputShape[1], height, width];\n }\n else {\n const height = inputShape[1] == null ? null : this.size[0] * inputShape[1];\n const width = inputShape[2] == null ? null : this.size[1] * inputShape[2];\n return [inputShape[0], height, width, inputShape[3]];\n }\n }\n call(inputs, kwargs) {\n return tfc.tidy(() => {\n let input = getExactlyOneTensor(inputs);\n const inputShape = input.shape;\n if (this.dataFormat === 'channelsFirst') {\n input = tfc.transpose(input, [0, 2, 3, 1]);\n const height = this.size[0] * inputShape[2];\n const width = this.size[1] * inputShape[3];\n const resized = this.interpolation === 'nearest' ?\n tfc.image.resizeNearestNeighbor(input, [height, width]) :\n tfc.image.resizeBilinear(input, [height, width]);\n return tfc.transpose(resized, [0, 3, 1, 2]);\n }\n else {\n const height = this.size[0] * inputShape[1];\n const width = this.size[1] * inputShape[2];\n return this.interpolation === 'nearest' ?\n tfc.image.resizeNearestNeighbor(input, [height, width]) :\n tfc.image.resizeBilinear(input, [height, width]);\n }\n });\n }\n getConfig() {\n const config = {\n size: this.size,\n dataFormat: this.dataFormat,\n interpolation: this.interpolation\n };\n const baseConfig = super.getConfig();\n Object.assign(config, baseConfig);\n return config;\n }\n}\n/** @nocollapse */\nUpSampling2D.className = 'UpSampling2D';\nserialization.registerClass(UpSampling2D);\n//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY29udm9sdXRpb25hbC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uLy4uL3RmanMtbGF5ZXJzL3NyYy9sYXllcnMvY29udm9sdXRpb25hbC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQTs7Ozs7Ozs7R0FRRztBQUVIOztHQUVHO0FBRUgsT0FBTyxLQUFLLEdBQUcsTUFBTSx1QkFBdUIsQ0FBQztBQUM3QyxPQUFPLEVBQVEsYUFBYSxFQUE0RCxJQUFJLEVBQUMsTUFBTSx1QkFBdUIsQ0FBQztBQUUzSCxPQUFPLEVBQWEsYUFBYSxFQUFFLG1CQUFtQixFQUFDLE1BQU0sZ0JBQWdCLENBQUM7QUFDOUUsT0FBTyxFQUFDLGVBQWUsRUFBQyxNQUFNLG1CQUFtQixDQUFDO0FBQ2xELE9BQU8sS0FBSyxDQUFDLE1BQU0seUJBQXlCLENBQUM7QUFDN0MsT0FBTyxFQUFDLGVBQWUsRUFBRSx3QkFBd0IsRUFBRSxnQkFBZ0IsRUFBQyxNQUFNLFdBQVcsQ0FBQztBQUN0RixPQUFPLEVBQW1DLGFBQWEsRUFBRSxtQkFBbUIsRUFBQyxNQUFNLGdCQUFnQixDQUFDO0FBQ3BHLE9BQU8sRUFBQyxTQUFTLEVBQUUsS0FBSyxFQUFZLE1BQU0sb0JBQW9CLENBQUM7QUFDL0QsT0FBTyxFQUFDLG1CQUFtQixFQUFFLFVBQVUsRUFBQyxNQUFNLFdBQVcsQ0FBQztBQUMxRCxPQUFPLEVBQUMsY0FBYyxFQUFzQyxvQkFBb0IsRUFBQyxNQUFNLGlCQUFpQixDQUFDO0FBR3pHLE9BQU8sRUFBQyxjQUFjLEVBQXNDLG9CQUFvQixFQUFDLE1BQU0saUJBQWlCLENBQUM7QUFFekcsT0FBTyxFQUFDLGdCQUFnQixFQUFFLFlBQVksRUFBRSxjQUFjLEVBQUMsTUFBTSxxQkFBcUIsQ0FBQztBQUNuRixPQUFPLEtBQUssYUFBYSxNQUFNLHdCQUF3QixDQUFDO0FBQ3hELE9BQU8sRUFBQyxrQkFBa0IsRUFBRSxtQkFBbUIsRUFBQyxNQUFNLHNCQUFzQixD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QUFDLEtBQUssQ0FBQyxjQUFjLENBQUMsS0FBSyxFQUFFLENBQUMsTUFBTSxFQUFFLEtBQUssQ0FBQyxDQUFDLENBQUM7YUFDdEQ7UUFDSCxDQUFDLENBQUMsQ0FBQztJQUNMLENBQUM7SUFFRCxTQUFTO1FBQ1AsTUFBTSxNQUFNLEdBQUc7WUFDWCxJQUFJLEVBQUUsSUFBSSxDQUFDLElBQUk7WUFDZixVQUFVLEVBQUUsSUFBSSxDQUFDLFVBQVU7WUFDM0IsYUFBYSxFQUFFLElBQUksQ0FBQyxhQUFhO1NBQ3BDLENBQUM7UUFDRixNQUFNLFVBQVUsR0FBRyxLQUFLLENBQUMsU0FBUyxFQUFFLENBQUM7UUFDckMsTUFBTSxDQUFDLE1BQU0sQ0FBQyxNQUFNLEVBQUUsVUFBVSxDQUFDLENBQUM7UUFDbEMsT0FBTyxNQUFNLENBQUM7SUFDaEIsQ0FBQzs7QUFsRUQsa0JBQWtCO0FBQ1gsc0JBQVMsR0FBRyxjQUFjLENBQUM7QUFtRXBDLGFBQWEsQ0FBQyxhQUFhLENBQUMsWUFBWSxDQUFDLENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyIvKipcbiAqIEBsaWNlbnNlXG4gKiBDb3B5cmlnaHQgMjAxOCBHb29nbGUgTExDXG4gKlxuICogVXNlIG9mIHRoaXMgc291cmNlIGNvZGUgaXMgZ292ZXJuZWQgYnkgYW4gTUlULXN0eWxlXG4gKiBsaWNlbnNlIHRoYXQgY2FuIGJlIGZvdW5kIGluIHRoZSBMSUNFTlNFIGZpbGUgb3IgYXRcbiAqIGh0dHBzOi8vb3BlbnNvdXJjZS5vcmcvbGljZW5zZXMvTUlULlxuICogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbiAqL1xuXG4vKipcbiAqIFRlbnNvckZsb3cuanMgTGF5ZXJzOiBDb252b2x1dGlvbmFsIExheWVyc1xuICovXG5cbmltcG9ydCAqIGFzIHRmYyBmcm9tICdAdGVuc29yZmxvdy90ZmpzLWNvcmUnO1xuaW1wb3J0IHtmdXNlZCwgc2VyaWFsaXphdGlvbiwgVGVuc29yLCBUZW5zb3IxRCwgVGVuc29yMkQsIFRlbnNvcjNELCBUZW5zb3I0RCwgVGVuc29yNUQsIHRpZHl9IGZyb20gJ0B0ZW5zb3JmbG93L3RmanMtY29yZSc7XG5cbmltcG9ydCB7QWN0aXZhdGlvbiwgZ2V0QWN0aXZhdGlvbiwgc2VyaWFsaXplQWN0aXZhdGlvbn0gZnJvbSAnLi4vYWN0aXZhdGlvbnMnO1xuaW1wb3J0IHtpbWFnZURhdGFGb3JtYXR9IGZyb20gJy4uL2JhY2tlbmQvY29tbW9uJztcbmltcG9ydCAqIGFzIEsgZnJvbSAnLi4vYmFja2VuZC90ZmpzX2JhY2tlbmQnO1xuaW1wb3J0IHtjaGVja0RhdGFGb3JtYXQsIGNoZWNrSW50ZXJwb2xhdGlvbkZvcm1hdCwgY2hlY2tQYWRkaW5nTW9kZX0gZnJvbSAnLi4vY29tbW9uJztcbmltcG9ydCB7Q29uc3RyYWludCwgQ29uc3RyYWludElkZW50aWZpZXIsIGdldENvbnN0cmFpbnQsIHNlcmlhbGl6ZUNvbnN0cmFpbnR9IGZyb20gJy4uL2NvbnN0cmFpbnRzJztcbmltcG9ydCB7SW5wdXRTcGVjLCBMYXllciwgTGF5ZXJBcmdzfSBmcm9tICcuLi9lbmdpbmUvdG9wb2xvZ3knO1xuaW1wb3J0IHtOb3RJbXBsZW1lbnRlZEVycm9yLCBWYWx1ZUVycm9yfSBmcm9tICcuLi9lcnJvcnMnO1xuaW1wb3J0IHtnZXRJbml0aWFsaXplciwgSW5pdGlhbGl6ZXIsIEluaXRpYWxpemVySWRlbnRpZmllciwgc2VyaWFsaXplSW5pdGlhbGl6ZXJ9IGZyb20gJy4uL2luaXRpYWxpemVycyc7XG5pbXBvcnQge0FjdGl2YXRpb25JZGVudGlmaWVyfSBmcm9tICcuLi9rZXJhc19mb3JtYXQvYWN0aXZhdGlvbl9jb25maWcnO1xuaW1wb3J0IHtEYXRhRm9ybWF0LCBJbnRlcnBvbGF0aW9uRm9ybWF0LCBQYWRkaW5nTW9kZSwgU2hhcGV9IGZyb20gJy4uL2tlcmFzX2Zvcm1hdC9jb21tb24nO1xuaW1wb3J0IHtnZXRSZWd1bGFyaXplciwgUmVndWxhcml6ZXIsIFJlZ3VsYXJpemVySWRlbnRpZmllciwgc2VyaWFsaXplUmVndWxhcml6ZXJ9IGZyb20gJy4uL3JlZ3VsYXJpemVycyc7XG5pbXBvcnQge0t3YXJnc30gZnJvbSAnLi4vdHlwZXMnO1xuaW1wb3J0IHtjb252T3V0cHV0TGVuZ3RoLCBkZWNvbnZMZW5ndGgsIG5vcm1hbGl6ZUFycmF5fSBmcm9tICcuLi91dGlscy9jb252X3V0aWxzJztcbmltcG9ydCAqIGFzIGdlbmVyaWNfdXRpbHMgZnJvbSAnLi4vdXRpbHMvZ2VuZXJpY191dGlscyc7XG5pbXBvcnQge2dldEV4YWN0bHlPbmVTaGFwZSwgZ2V0RXhhY3RseU9uZVRlbnNvcn0gZnJvbSAnLi4vdXRpbHMvdHlwZXNfdXRpbHMnO1xuaW1wb3J0IHtMYXllclZhcmlhYmxlfSBmcm9tICcuLi92YXJpYWJsZXMnO1xuXG4vKipcbiAqIFRyYW5zcG9zZSBhbmQgY2FzdCB0aGUgaW5wdXQgYmVmb3JlIHRoZSBjb252MmQuXG4gKiBAcGFyYW0geCBJbnB1dCBpbWFnZSB0ZW5zb3IuXG4gKiBAcGFyYW0gZGF0YUZvcm1hdFxuICovXG5leHBvcnQgZnVuY3Rpb24gcHJlcHJvY2Vzc0NvbnYyRElucHV0KFxuICAgIHg6IFRlbnNvciwgZGF0YUZvcm1hdDogRGF0YUZvcm1hdCk6IFRlbnNvciB7XG4gIC8vIFRPRE8oY2Fpcyk6IENhc3QgdHlwZSB0byBmbG9hdDMyIGlmIG5vdC5cbiAgcmV0dXJuIHRpZHkoKCkgPT4ge1xuICAgIGNoZWNrRGF0YUZvcm1hdChkYXRhRm9ybWF0KTtcbiAgICBpZiAoZGF0YUZvcm1hdCA9PT0gJ2NoYW5uZWxzRmlyc3QnKSB7XG4gICAgICByZXR1cm4gdGZjLnRyYW5zcG9zZSh4LCBbMCwgMiwgMywgMV0pOyAgLy8gTkNIVyAtPiBOSFdDLlxuICAgIH0gZWxzZSB7XG4gICAgICByZXR1cm4geDtcbiAgICB9XG4gIH0pO1xufVxuXG4vKipcbiAqIFRyYW5zcG9zZSBhbmQgY2FzdCB0aGUgaW5wdXQgYmVmb3JlIHRoZSBjb252M2QuXG4gKiBAcGFyYW0geCBJbnB1dCBpbWFnZSB0ZW5zb3IuXG4gKiBAcGFyYW0gZGF0YUZvcm1hdFxuICovXG5leHBvcnQgZnVuY3Rpb24gcHJlcHJvY2Vzc0NvbnYzRElucHV0KFxuICAgIHg6IFRlbnNvciwgZGF0YUZvcm1hdDogRGF0YUZvcm1hdCk6IFRlbnNvciB7XG4gIHJldHVybiB0aWR5KCgpID0+IHtcbiAgICBjaGVja0RhdGFGb3JtYXQoZGF0YUZvcm1hdCk7XG4gICAgaWYgKGRhdGFGb3JtYXQgPT09ICdjaGFubmVsc0ZpcnN0Jykge1xuICAgICAgcmV0dXJuIHRmYy50cmFuc3Bvc2UoeCwgWzAsIDIsIDMsIDQsIDFdKTsgIC8vIE5DREhXIC0+IE5ESFdDLlxuICAgIH0gZWxzZSB7XG4gICAgICByZXR1cm4geDtcbiAgICB9XG4gIH0pO1xufVxuXG4vKipcbiAqIDFELWNvbnZvbHV0aW9uIHdpdGggYmlhcyBhZGRlZC5cbiAqXG4gKiBQb3J0aW5nIE5vdGU6IFRoaXMgZnVuY3Rpb24gZG9lcyBub3QgZXhpc3QgaW4gdGhlIFB5dGhvbiBLZXJhcyBiYWNrZW5kLlxuICogICBJdCBpcyBleGFjdGx5IHRoZSBzYW1lIGFzIGBjb252MmRgLCBleGNlcHQgdGhlIGFkZGVkIGBiaWFzYC5cbiAqXG4gKiBAcGFyYW0geCBJbnB1dCB0ZW5zb3IsIHJhbmstMywgb2Ygc2hhcGUgYFtiYXRjaFNpemUsIHdpZHRoLCBpbkNoYW5uZWxzXWAuXG4gKiBAcGFyYW0ga2VybmVsIEtlcm5lbCwgcmFuay0zLCBvZiBzaGFwZSBgW2ZpbHRlcldpZHRoLCBpbkRlcHRoLCBvdXREZXB0aF1gLlxuICogQHBhcmFtIGJpYXMgQmlhcywgcmFuay0zLCBvZiBzaGFwZSBgW291dERlcHRoXWAuXG4gKiBAcGFyYW0gc3RyaWRlc1xuICogQHBhcmFtIHBhZGRpbmcgUGFkZGluZyBtb2RlLlxuICogQHBhcmFtIGRhdGFGb3JtYXQgRGF0YSBmb3JtYXQuXG4gKiBAcGFyYW0gZGlsYXRpb25SYXRlXG4gKiBAcmV0dXJucyBUaGUgcmVzdWx0IG9mIHRoZSAxRCBjb252b2x1dGlvbi5cbiAqIEB0aHJvd3MgVmFsdWVFcnJvciwgaWYgYHhgLCBga2VybmVsYCBvciBgYmlhc2AgaXMgbm90IG9mIHRoZSBjb3JyZWN0IHJhbmsuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBjb252MWRXaXRoQmlhcyhcbiAgICB4OiBUZW5zb3IsIGtlcm5lbDogVGVuc29yLCBiaWFzOiBUZW5zb3IsIHN0cmlkZXMgPSAxLCBwYWRkaW5nID0gJ3ZhbGlkJyxcbiAgICBkYXRhRm9ybWF0PzogRGF0YUZvcm1hdCwgZGlsYXRpb25SYXRlID0gMSk6IFRlbnNvciB7XG4gIHJldHVybiB0aWR5KCgpID0+IHtcbiAgICBpZiAoZGF0YUZvcm1hdCA9PSBudWxsKSB7XG4gICAgICBkYXRhRm9ybWF0ID0gaW1hZ2VEYXRhRm9ybWF0KCk7XG4gICAgfVxuICAgIGNoZWNrRGF0YUZvcm1hdChkYXRhRm9ybWF0KTtcbiAgICAvLyBDaGVjayB0aGUgcmFua3Mgb2YgeCwga2VybmVsIGFuZCBiaWFzLlxuICAgIGlmICh4LnNoYXBlLmxlbmd0aCAhPT0gMykge1xuICAgICAgdGhyb3cgbmV3IFZhbHVlRXJyb3IoXG4gICAgICAgICAgYFRoZSBpbnB1dCBvZiBhIGNvbnYxZFdpdGhCaWFzIG9wZXJhdGlvbiBzaG91bGQgYmUgMywgYnV0IGlzIGAgK1xuICAgICAgICAgIGAke3guc2hhcGUubGVuZ3RofSBpbnN0ZWFkLmApO1xuICAgIH1cbiAgICBpZiAoa2VybmVsLnNoYXBlLmxlbmd0aCAhPT0gMykge1xuICAgICAgdGhyb3cgbmV3IFZhbHVlRXJyb3IoXG4gICAgICAgICAgYFRoZSBrZXJuZWwgZm9yIGEgY29udjFkV2l0aEJpYXMgb3BlcmF0aW9uIHNob3VsZCBiZSAzLCBidXQgaXMgYCArXG4gICAgICAgICAgYCR7a2VybmVsLnNoYXBlLmxlbmd0aH0gaW5zdGVhZGApO1xuICAgIH1cbiAgICBpZiAoYmlhcyAhPSBudWxsICYmIGJpYXMuc2hhcGUubGVuZ3RoICE9PSAxKSB7XG4gICAgICB0aHJvdyBuZXcgVmFsdWVFcnJvcihcbiAgICAgICAgICBgVGhlIGJpYXMgZm9yIGEgY29udjFkV2l0aEJpYXMgb3BlcmF0aW9uIHNob3VsZCBiZSAxLCBidXQgaXMgYCArXG4gICAgICAgICAgYCR7a2VybmVsLnNoYXBlLmxlbmd0aH0gaW5zdGVhZGApO1xuICAgIH1cbiAgICAvLyBUT0RPKGNhaXMpOiBTdXBwb3J0IENBVVNBTCBwYWRkaW5nIG1vZGUuXG4gICAgaWYgKGRhdGFGb3JtYXQgPT09ICdjaGFubmVsc0ZpcnN0Jykge1xuICAgICAgeCA9IHRmYy50cmFuc3Bvc2UoeCwgWzAsIDIsIDFdKTsgIC8vIE5DVyAtPiBOV0MuXG4gICAgfVxuICAgIGlmIChwYWRkaW5nID09PSAnY2F1c2FsJykge1xuICAgICAgdGhyb3cgbmV3IE5vdEltcGxlbWVudGVkRXJyb3IoXG4gICAgICAgICAgJ1RoZSBzdXBwb3J0IGZvciBDQVVTQUwgcGFkZGluZyBtb2RlIGluIGNvbnYxZFdpdGhCaWFzIGlzIG5vdCAnICtcbiAgICAgICAgICAnaW1wbGVtZW50ZWQgeWV0LicpO1xuICAgIH1cbiAgICBsZXQgeTogVGVuc29yID0gdGZjLmNvbnYxZChcbiAgICAgICAgeCBhcyBUZW5zb3IyRCB8IFRlbnNvcjNELCBrZXJuZWwgYXMgVGVuc29yM0QsIHN0cmlkZXMsXG4gICAgICAgIHBhZGRpbmcgPT09ICdzYW1lJyA/ICdzYW1lJyA6ICd2YWxpZCcsICdOV0MnLCBkaWxhdGlvblJhdGUpO1xuICAgIGlmIChiaWFzICE9IG51bGwpIHtcbiAgICAgIHkgPSBLLmJpYXNBZGQoeSwgYmlhcyk7XG4gICAgfVxuICAgIHJldHVybiB5O1xuICB9KTtcbn1cblxuLyoqXG4gKiAxRC1jb252b2x1dGlvbi5cbiAqXG4gKiBAcGFyYW0geCBJbnB1dCB0ZW5zb3IsIHJhbmstMywgb2Ygc2hhcGUgYFtiYXRjaFNpemUsIHdpZHRoLCBpbkNoYW5uZWxzXWAuXG4gKiBAcGFyYW0ga2VybmVsIEtlcm5lbCwgcmFuay0zLCBvZiBzaGFwZSBgW2ZpbHRlcldpZHRoLCBpbkRlcHRoLCBvdXREZXB0aF1gLnNcbiAqIEBwYXJhbSBzdHJpZGVzXG4gKiBAcGFyYW0gcGFkZGluZyBQYWRkaW5nIG1vZGUuXG4gKiBAcGFyYW0gZGF0YUZvcm1hdCBEYXRhIGZvcm1hdC5cbiAqIEBwYXJhbSBkaWxhdGlvblJhdGVcbiAqIEByZXR1cm5zIFRoZSByZXN1bHQgb2YgdGhlIDFEIGNvbnZvbHV0aW9uLlxuICogQHRocm93cyBWYWx1ZUVycm9yLCBpZiBgeGAsIGBrZXJuZWxgIG9yIGBiaWFzYCBpcyBub3Qgb2YgdGhlIGNvcnJlY3QgcmFuay5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGNvbnYxZChcbiAgICB4OiBUZW5zb3IsIGtlcm5lbDogVGVuc29yLCBzdHJpZGVzID0gMSwgcGFkZGluZyA9ICd2YWxpZCcsXG4gICAgZGF0YUZvcm1hdD86IERhdGFGb3JtYXQsIGRpbGF0aW9uUmF0ZSA9IDEpOiBUZW5zb3Ige1xuICByZXR1cm4gdGlkeSgoKSA9PiB7XG4gICAgY2hlY2tEYXRhRm9ybWF0KGRhdGFGb3JtYXQpO1xuICAgIHJldHVybiBjb252MWRXaXRoQmlhcyhcbiAgICAgICAgeCwga2VybmVsLCBudWxsLCBzdHJpZGVzLCBwYWRkaW5nLCBkYXRhRm9ybWF0LCBkaWxhdGlvblJhdGUpO1xuICB9KTtcbn1cblxuLyoqXG4gKiAyRCBDb252b2x1dGlvblxuICogQHBhcmFtIHhcbiAqIEBwYXJhbSBrZXJuZWwga2VybmVsIG9mIHRoZSBjb252b2x1dGlvbi5cbiAqIEBwYXJhbSBzdHJpZGVzIHN0cmlkZXMgYXJyYXkuXG4gKiBAcGFyYW0gcGFkZGluZyBwYWRkaW5nIG1vZGUuIERlZmF1bHQgdG8gJ3ZhbGlkJy5cbiAqIEBwYXJhbSBkYXRhRm9ybWF0IGRhdGEgZm9ybWF0LiBEZWZhdWx0cyB0byAnY2hhbm5lbHNMYXN0Jy5cbiAqIEBwYXJhbSBkaWxhdGlvblJhdGUgZGlsYXRpb24gcmF0ZSBhcnJheS5cbiAqIEByZXR1cm5zIFJlc3VsdCBvZiB0aGUgMkQgcG9vbGluZy5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGNvbnYyZChcbiAgICB4OiBUZW5zb3IsIGtlcm5lbDogVGVuc29yLCBzdHJpZGVzID0gWzEsIDFdLCBwYWRkaW5nID0gJ3ZhbGlkJyxcbiAgICBkYXRhRm9ybWF0PzogRGF0YUZvcm1hdCwgZGlsYXRpb25SYXRlPzogW251bWJlciwgbnVtYmVyXSk6IFRlbnNvciB7XG4gIHJldHVybiB0aWR5KCgpID0+IHtcbiAgICBjaGVja0RhdGFGb3JtYXQoZGF0YUZvcm1hdCk7XG4gICAgcmV0dXJuIGNvbnYyZFdpdGhCaWFzQWN0aXZhdGlvbihcbiAgICAgICAgeCwga2VybmVsLCBudWxsLCBzdHJpZGVzLCBwYWRkaW5nLCBkYXRhRm9ybWF0LCBkaWxhdGlvblJhdGUpO1xuICB9KTtcbn1cblxuLyoqXG4gKiAyRCBDb252b2x1dGlvbiB3aXRoIGFuIGFkZGVkIGJpYXMgYW5kIG9wdGlvbmFsIGFjdGl2YXRpb24uXG4gKiBOb3RlOiBUaGlzIGZ1bmN0aW9uIGRvZXMgbm90IGV4aXN0IGluIHRoZSBQeXRob24gS2VyYXMgQmFja2VuZC4gVGhpcyBmdW5jdGlvblxuICogaXMgZXhhY3RseSB0aGUgc2FtZSBhcyBgY29udjJkYCwgZXhjZXB0IHRoZSBhZGRlZCBgYmlhc2AuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBjb252MmRXaXRoQmlhc0FjdGl2YXRpb24oXG4gICAgeDogVGVuc29yLCBrZXJuZWw6IFRlbnNvciwgYmlhczogVGVuc29yLCBzdHJpZGVzID0gWzEsIDFdLFxuICAgIHBhZGRpbmcgPSAndmFsaWQnLCBkYXRhRm9ybWF0PzogRGF0YUZvcm1hdCwgZGlsYXRpb25SYXRlPzogW251bWJlciwgbnVtYmVyXSxcbiAgICBhY3RpdmF0aW9uOiBmdXNlZC5BY3RpdmF0aW9uID0gbnVsbCk6IFRlbnNvciB7XG4gIHJldHVybiB0aWR5KCgpID0+IHtcbiAgICBpZiAoZGF0YUZvcm1hdCA9PSBudWxsKSB7XG4gICAgICBkYXRhRm9ybWF0ID0gaW1hZ2VEYXRhRm9ybWF0KCk7XG4gICAgfVxuICAgIGNoZWNrRGF0YUZvcm1hdChkYXRhRm9ybWF0KTtcbiAgICBpZiAoeC5yYW5rICE9PSAzICYmIHgucmFuayAhPT0gNCkge1xuICAgICAgdGhyb3cgbmV3IFZhbHVlRXJyb3IoXG4gICAgICAgICAgYGNvbnYyZFdpdGhCaWFzQWN0aXZhdGlvbiBleHBlY3RzIGlucHV0IHRvIGJlIG9mIHJhbmsgMyBvciA0LCBgICtcbiAgICAgICAgICBgYnV0IHJlY2VpdmVkICR7eC5yYW5rfS5gKTtcbiAgICB9XG4gICAgaWYgKGtlcm5lbC5yYW5rICE9PSAzICYmIGtlcm5lbC5yYW5rICE9PSA0KSB7XG4gICAgICB0aHJvdyBuZXcgVmFsdWVFcnJvcihcbiAgICAgICAgICBgY29udjJkV2l0aEJpYXNBY3RpdmF0aW9uIGV4cGVjdHMga2VybmVsIHRvIGJlIG9mIHJhbmsgMyBvciA0LCBgICtcbiAgICAgICAgICBgYnV0IHJlY2VpdmVkICR7eC5yYW5rfS5gKTtcbiAgICB9XG4gICAgbGV0IHkgPSBwcmVwcm9jZXNzQ29udjJESW5wdXQoeCwgZGF0YUZvcm1hdCk7XG4gICAgaWYgKHBhZGRpbmcgPT09ICdjYXVzYWwnKSB7XG4gICAgICB0aHJvdyBuZXcgTm90SW1wbGVtZW50ZWRFcnJvcihcbiAgICAgICAgICAnVGhlIHN1cHBvcnQgZm9yIENBVVNBTCBwYWRkaW5nIG1vZGUgaW4gY29udjFkV2l0aEJpYXMgaXMgbm90ICcgK1xuICAgICAgICAgICdpbXBsZW1lbnRlZCB5ZXQuJyk7XG4gICAgfVxuICAgIHkgPSB0ZmMuZnVzZWQuY29udjJkKHtcbiAgICAgIHg6IHkgYXMgVGVuc29yM0QgfCBUZW5zb3I0RCxcbiAgICAgIGZpbHRlcjoga2VybmVsIGFzIFRlbnNvcjRELFxuICAgICAgc3RyaWRlczogc3RyaWRlcyBhcyBbbnVtYmVyLCBudW1iZXJdLFxuICAgICAgcGFkOiBwYWRkaW5nID09PSAnc2FtZScgPyAnc2FtZScgOiAndmFsaWQnLFxuICAgICAgZGlsYXRpb25zOiBkaWxhdGlvblJhdGUsXG4gICAgICBkYXRhRm9ybWF0OiAnTkhXQycsXG4gICAgICBiaWFzLFxuICAgICAgYWN0aXZhdGlvblxuICAgIH0pO1xuICAgIGlmIChkYXRhRm9ybWF0ID09PSAnY2hhbm5lbHNGaXJzdCcpIHtcbiAgICAgIHkgPSB0ZmMudHJhbnNwb3NlKHksIFswLCAzLCAxLCAyXSk7XG4gICAgfVxuICAgIHJldHVybiB5O1xuICB9KTtcbn1cblxuLyoqXG4gKiAzRCBDb252b2x1dGlvbi5cbiAqIEBwYXJhbSB4XG4gKiBAcGFyYW0ga2VybmVsIGtlcm5lbCBvZiB0aGUgY29udm9sdXRpb24uXG4gKiBAcGFyYW0gc3RyaWRlcyBzdHJpZGVzIGFycmF5LlxuICogQHBhcmFtIHBhZGRpbmcgcGFkZGluZyBtb2RlLiBEZWZhdWx0IHRvICd2YWxpZCcuXG4gKiBAcGFyYW0gZGF0YUZvcm1hdCBkYXRhIGZvcm1hdC4gRGVmYXVsdHMgdG8gJ2NoYW5uZWxzTGFzdCcuXG4gKiBAcGFyYW0gZGlsYXRpb25SYXRlIGRpbGF0aW9uIHJhdGUgYXJyYXkuXG4gKiBAcmV0dXJucyBSZXN1bHQgb2YgdGhlIDNEIGNvbnZvbHV0aW9uLlxuICovXG5leHBvcnQgZnVuY3Rpb24gY29udjNkKFxuICAgIHg6IFRlbnNvciwga2VybmVsOiBUZW5zb3IsIHN0cmlkZXMgPSBbMSwgMSwgMV0sIHBhZGRpbmcgPSAndmFsaWQnLFxuICAgIGRhdGFGb3JtYXQ/OiBEYXRhRm9ybWF0LCBkaWxhdGlvblJhdGU/OiBbbnVtYmVyLCBudW1iZXIsIG51bWJlcl0pOiBUZW5zb3Ige1xuICByZXR1cm4gdGlkeSgoKSA9PiB7XG4gICAgY2hlY2tEYXRhRm9ybWF0KGRhdGFGb3JtYXQpO1xuICAgIHJldHVybiBjb252M2RXaXRoQmlhcyhcbiAgICAgICAgeCwga2VybmVsLCBudWxsLCBzdHJpZGVzLCBwYWRkaW5nLCBkYXRhRm9ybWF0LCBkaWxhdGlvblJhdGUpO1xuICB9KTtcbn1cblxuLyoqXG4gKiAzRCBDb252b2x1dGlvbiB3aXRoIGFuIGFkZGVkIGJpYXMuXG4gKiBOb3RlOiBUaGlzIGZ1bmN0aW9uIGRvZXMgbm90IGV4aXN0IGluIHRoZSBQeXRob24gS2VyYXMgQmFja2VuZC4gVGhpcyBmdW5jdGlvblxuICogaXMgZXhhY3RseSB0aGUgc2FtZSBhcyBgY29udjNkYCwgZXhjZXB0IHRoZSBhZGRlZCBgYmlhc2AuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBjb252M2RXaXRoQmlhcyhcbiAgICB4OiBUZW5zb3IsIGtlcm5lbDogVGVuc29yLCBiaWFzOiBUZW5zb3IsIHN0cmlkZXMgPSBbMSwgMSwgMV0sXG4gICAgcGFkZGluZyA9ICd2YWxpZCcsIGRhdGFGb3JtYXQ/OiBEYXRhRm9ybWF0LFxuICAgIGRpbGF0aW9uUmF0ZT86IFtudW1iZXIsIG51bWJlciwgbnVtYmVyXSk6IFRlbnNvciB7XG4gIHJldHVybiB0aWR5KCgpID0+IHtcbiAgICBpZiAoZGF0YUZvcm1hdCA9PSBudWxsKSB7XG4gICAgICBkYXRhRm9ybWF0ID0gaW1hZ2VEYXRhRm9ybWF0KCk7XG4gICAgfVxuICAgIGNoZWNrRGF0YUZvcm1hdChkYXRhRm9ybWF0KTtcbiAgICBpZiAoeC5yYW5rICE9PSA0ICYmIHgucmFuayAhPT0gNSkge1xuICAgICAgdGhyb3cgbmV3IFZhbHVlRXJyb3IoXG4gICAgICAgICAgYGNvbnYzZFdpdGhCaWFzIGV4cGVjdHMgaW5wdXQgdG8gYmUgb2YgcmFuayA0IG9yIDUsIGJ1dCByZWNlaXZlZCBgICtcbiAgICAgICAgICBgJHt4LnJhbmt9LmApO1xuICAgIH1cbiAgICBpZiAoa2VybmVsLnJhbmsgIT09IDQgJiYga2VybmVsLnJhbmsgIT09IDUpIHtcbiAgICAgIHRocm93IG5ldyBWYWx1ZUVycm9yKFxuICAgICAgICAgIGBjb252M2RXaXRoQmlhcyBleHBlY3RzIGtlcm5lbCB0byBiZSBvZiByYW5rIDQgb3IgNSwgYnV0IHJlY2VpdmVkIGAgK1xuICAgICAgICAgIGAke3gucmFua30uYCk7XG4gICAgfVxuICAgIGxldCB5ID0gcHJlcHJvY2Vzc0NvbnYzRElucHV0KHgsIGRhdGFGb3JtYXQpO1xuICAgIGlmIChwYWRkaW5nID09PSAnY2F1c2FsJykge1xuICAgICAgdGhyb3cgbmV3IE5vdEltcGxlbWVudGVkRXJyb3IoXG4gICAgICAgICAgJ1RoZSBzdXBwb3J0IGZvciBDQVVTQUwgcGFkZGluZyBtb2RlIGluIGNvbnYzZFdpdGhCaWFzIGlzIG5vdCAnICtcbiAgICAgICAgICAnaW1wbGVtZW50ZWQgeWV0LicpO1xuICAgIH1cbiAgICB5ID0gdGZjLmNvbnYzZChcbiAgICAgICAgeSBhcyBUZW5zb3I0RCB8IHRmYy5UZW5zb3I8dGZjLlJhbmsuUjU+LFxuICAgICAgICBrZXJuZWwgYXMgdGZjLlRlbnNvcjx0ZmMuUmFuay5SNT4sIHN0cmlkZXMgYXMgW251bWJlciwgbnVtYmVyLCBudW1iZXJdLFxuICAgICAgICBwYWRkaW5nID09PSAnc2FtZScgPyAnc2FtZScgOiAndmFsaWQnLCAnTkRIV0MnLCBkaWxhdGlvblJhdGUpO1xuICAgIGlmIChiaWFzICE9IG51bGwpIHtcbiAgICAgIHkgPSBLLmJpYXNBZGQoeSwgYmlhcyBhcyBUZW5zb3IxRCk7XG4gICAgfVxuICAgIGlmIChkYXRhRm9ybWF0ID09PSAnY2hhbm5lbHNGaXJzdCcpIHtcbiAgICAgIHkgPSB0ZmMudHJhbnNwb3NlKHksIFswLCA0LCAxLCAyLCAzXSk7XG4gICAgfVxuICAgIHJldHVybiB5O1xuICB9KTtcbn1cblxuLyoqXG4gKiBCYXNlIExheWVyQ29uZmlnIGZvciBkZXB0aHdpc2UgYW5kIG5vbi1kZXB0aHdpc2UgY29udm9sdXRpb25hbCBsYXllcnMuXG4gKi9cbmV4cG9ydCBkZWNsYXJlIGludGVyZmFjZSBCYXNlQ29udkxheWVyQXJncyBleHRlbmRzIExheWVyQXJncyB7XG4gIC8qKlxuICAgKiBUaGUgZGltZW5zaW9ucyBvZiB0aGUgY29udm9sdXRpb24gd2luZG93LiBJZiBrZXJuZWxTaXplIGlzIGEgbnVtYmVyLCB0aGVcbiAgICogY29udm9sdXRpb25hbCB3aW5kb3cgd2lsbCBiZSBzcXVhcmUuXG4gICAqL1xuICBrZXJuZWxTaXplOiBudW1iZXJ8bnVtYmVyW107XG5cbiAgLyoqXG4gICAqIFRoZSBzdHJpZGVzIG9mIHRoZSBjb252b2x1dGlvbiBpbiBlYWNoIGRpbWVuc2lvbi4gSWYgc3RyaWRlcyBpcyBhIG51bWJlcixcbiAgICogc3RyaWRlcyBpbiBib3RoIGRpbWVuc2lvbnMgYXJlIGVxdWFsLlxuICAgKlxuICAgKiBTcGVjaWZ5aW5nIGFueSBzdHJpZGUgdmFsdWUgIT0gMSBpcyBpbmNvbXBhdGlibGUgd2l0aCBzcGVjaWZ5aW5nIGFueVxuICAgKiBgZGlsYXRpb25SYXRlYCB2YWx1ZSAhPSAxLlxuICAgKi9cbiAgc3RyaWRlcz86IG51bWJlcnxudW1iZXJbXTtcblxuICAvKipcbiAgICogUGFkZGluZyBtb2RlLlxuICAgKi9cbiAgcGFkZGluZz86IFBhZGRpbmdNb2RlO1xuXG4gIC8qKlxuICAgKiBGb3JtYXQgb2YgdGhlIGRhdGEsIHdoaWNoIGRldGVybWluZXMgdGhlIG9yZGVyaW5nIG9mIHRoZSBkaW1lbnNpb25zIGluXG4gICAqIHRoZSBpbnB1dHMuXG4gICAqXG4gICAqIGBjaGFubmVsc19sYXN0YCBjb3JyZXNwb25kcyB0byBpbnB1dHMgd2l0aCBzaGFwZVxuICAgKiAgIGAoYmF0Y2gsIC4uLiwgY2hhbm5lbHMpYFxuICAgKlxuICAgKiAgYGNoYW5uZWxzX2ZpcnN0YCBjb3JyZXNwb25kcyB0byBpbnB1dHMgd2l0aCBzaGFwZSBgKGJhdGNoLCBjaGFubmVscyxcbiAgICogLi4uKWAuXG4gICAqXG4gICAqIERlZmF1bHRzIHRvIGBjaGFubmVsc19sYXN0YC5cbiAgICovXG4gIGRhdGFGb3JtYXQ/OiBEYXRhRm9ybWF0O1xuXG4gIC8qKlxuICAgKiBUaGUgZGlsYXRpb24gcmF0ZSB0byB1c2UgZm9yIHRoZSBkaWxhdGVkIGNvbnZvbHV0aW9uIGluIGVhY2ggZGltZW5zaW9uLlxuICAgKiBTaG91bGQgYmUgYW4gaW50ZWdlciBvciBhcnJheSBvZiB0d28gb3IgdGhyZWUgaW50ZWdlcnMuXG4gICAqXG4gICAqIEN1cnJlbnRseSwgc3BlY2lmeWluZyBhbnkgYGRpbGF0aW9uUmF0ZWAgdmFsdWUgIT0gMSBpcyBpbmNvbXBhdGlibGUgd2l0aFxuICAgKiBzcGVjaWZ5aW5nIGFueSBgc3RyaWRlc2AgdmFsdWUgIT0gMS5cbiAgICovXG4gIGRpbGF0aW9uUmF0ZT86IG51bWJlcnxbbnVtYmVyXXxbbnVtYmVyLCBudW1iZXJdfFtudW1iZXIsIG51bWJlciwgbnVtYmVyXTtcblxuICAvKipcbiAgICogQWN0aXZhdGlvbiBmdW5jdGlvbiBvZiB0aGUgbGF5ZXIuXG4gICAqXG4gICAqIElmIHlvdSBkb24ndCBzcGVjaWZ5IHRoZSBhY3RpdmF0aW9uLCBub25lIGlzIGFwcGxpZWQuXG4gICAqL1xuICBhY3RpdmF0aW9uPzogQWN0aXZhdGlvbklkZW50aWZpZXI7XG5cbiAgLyoqXG4gICAqIFdoZXRoZXIgdGhlIGxheWVyIHVzZXMgYSBiaWFzIHZlY3Rvci4gRGVmYXVsdHMgdG8gYHRydWVgLlxuICAgKi9cbiAgdXNlQmlhcz86IGJvb2xlYW47XG5cbiAgLyoqXG4gICAqIEluaXRpYWxpemVyIGZvciB0aGUgY29udm9sdXRpb25hbCBrZXJuZWwgd2VpZ2h0cyBtYXRyaXguXG4gICAqL1xuICBrZXJuZWxJbml0aWFsaXplcj86IEluaXRpYWxpemVySWRlbnRpZmllcnxJbml0aWFsaXplcjtcblxuICAvKipcbiAgICogSW5pdGlhbGl6ZXIgZm9yIHRoZSBiaWFzIHZlY3Rvci5cbiAgICovXG4gIGJpYXNJbml0aWFsaXplcj86IEluaXRpYWxpemVySWRlbnRpZmllcnxJbml0aWFsaXplcjtcblxuICAvKipcbiAgICogQ29uc3RyYWludCBmb3IgdGhlIGNvbnZvbHV0aW9uYWwga2VybmVsIHdlaWdodHMuXG4gICAqL1xuICBrZXJuZWxDb25zdHJhaW50PzogQ29uc3RyYWludElkZW50aWZpZXJ8Q29uc3RyYWludDtcblxuICAvKipcbiAgICogQ29uc3RyYWludCBmb3IgdGhlIGJpYXMgdmVjdG9yLlxuICAgKi9cbiAgYmlhc0NvbnN0cmFpbnQ/OiBDb25zdHJhaW50SWRlbnRpZmllcnxDb25zdHJhaW50O1xuXG4gIC8qKlxuICAgKiBSZWd1bGFyaXplciBmdW5jdGlvbiBhcHBsaWVkIHRvIHRoZSBrZXJuZWwgd2VpZ2h0cyBtYXRyaXguXG4gICAqL1xuICBrZXJuZWxSZWd1bGFyaXplcj86IFJlZ3VsYXJpemVySWRlbnRpZmllcnxSZWd1bGFyaXplcjtcblxuICAvKipcbiAgICogUmVndWxhcml6ZXIgZnVuY3Rpb24gYXBwbGllZCB0byB0aGUgYmlhcyB2ZWN0b3IuXG4gICAqL1xuICBiaWFzUmVndWxhcml6ZXI/OiBSZWd1bGFyaXplcklkZW50aWZpZXJ8UmVndWxhcml6ZXI7XG5cbiAgLyoqXG4gICAqIFJlZ3VsYXJpemVyIGZ1bmN0aW9uIGFwcGxpZWQgdG8gdGhlIGFjdGl2YXRpb24uXG4gICAqL1xuICBhY3Rpdml0eVJlZ3VsYXJpemVyPzogUmVndWxhcml6ZXJJZGVudGlmaWVyfFJlZ3VsYXJpemVyO1xufVxuXG4vKipcbiAqIExheWVyQ29uZmlnIGZvciBub24tZGVwdGh3aXNlIGNvbnZvbHV0aW9uYWwgbGF5ZXJzLlxuICogQXBwbGllcyB0byBub24tZGVwdGh3aXNlIGNvbnZvbHV0aW9uIG9mIGFsbCByYW5rcyAoZS5nLCBDb252MUQsIENvbnYyRCxcbiAqIENvbnYzRCkuXG4gKi9cbmV4cG9ydCBkZWNsYXJlIGludGVyZmFjZSBDb252TGF5ZXJBcmdzIGV4dGVuZHMgQmFzZUNvbnZMYXllckFyZ3Mge1xuICAvKipcbiAgICogVGhlIGRpbWVuc2lvbmFsaXR5IG9mIHRoZSBvdXRwdXQgc3BhY2UgKGkuZS4gdGhlIG51bWJlciBvZiBmaWx0ZXJzIGluIHRoZVxuICAgKiBjb252b2x1dGlvbikuXG4gICAqL1xuICBmaWx0ZXJzOiBudW1iZXI7XG59XG5cbi8qKlxuICogQWJzdHJhY3QgY29udm9sdXRpb24gbGF5ZXIuXG4gKi9cbmV4cG9ydCBhYnN0cmFjdCBjbGFzcyBCYXNlQ29udiBleHRlbmRzIExheWVyIHtcbiAgcHJvdGVjdGVkIHJlYWRvbmx5IHJhbms6IG51bWJlcjtcbiAgcHJvdGVjdGVkIHJlYWRvbmx5IGtlcm5lbFNpemU6IG51bWJlcltdO1xuICBwcm90ZWN0ZWQgcmVhZG9ubHkgc3RyaWRlczogbnVtYmVyW107XG4gIHByb3RlY3RlZCByZWFkb25seSBwYWRkaW5nOiBQYWRkaW5nTW9kZTtcbiAgcHJvdGVjdGVkIHJlYWRvbmx5IGRhdGFGb3JtYXQ6IERhdGFGb3JtYXQ7XG4gIHByb3RlY3RlZCByZWFkb25seSBhY3RpdmF0aW9uOiBBY3RpdmF0aW9uO1xuICBwcm90ZWN0ZWQgcmVhZG9ubHkgdXNlQmlhczogYm9vbGVhbjtcbiAgcHJvdGVjdGVkIHJlYWRvbmx5IGRpbGF0aW9uUmF0ZTogbnVtYmVyW107XG5cbiAgLy8gQmlhcy1yZWxhdGVkIG1lbWJlcnMgYXJlIGhlcmUgYmVjYXVzZSBhbGwgY29udm9sdXRpb24gc3ViY2xhc3NlcyB1c2UgdGhlXG4gIC8vIHNhbWUgY29uZmlndXJhdGlvbiBwYXJtZXRlcnMgdG8gY29udHJvbCBiaWFzLiAgS2VybmVsLXJlbGF0ZWQgbWVtYmVyc1xuICAvLyBhcmUgaW4gc3ViY2xhc3MgYENvbnZgIGJlY2F1c2Ugc29tZSBzdWJjbGFzc2VzIHVzZSBkaWZmZXJlbnQgcGFyYW1ldGVycyB0b1xuICAvLyBjb250cm9sIGtlcm5lbCBwcm9wZXJ0aWVzLCBmb3IgaW5zdGFuY2UsIGBEZXB0aHdpc2VDb252MkRgIHVzZXNcbiAgLy8gYGRlcHRod2lzZUluaXRpYWxpemVyYCBpbnN0ZWFkIG9mIGBrZXJuZWxJbml0aWFsaXplcmAuXG4gIHByb3RlY3RlZCByZWFkb25seSBiaWFzSW5pdGlhbGl6ZXI/OiBJbml0aWFsaXplcjtcbiAgcHJvdGVjdGVkIHJlYWRvbmx5IGJpYXNDb25zdHJhaW50PzogQ29uc3RyYWludDtcbiAgcHJvdGVjdGVkIHJlYWRvbmx5IGJpYXNSZWd1bGFyaXplcj86IFJlZ3VsYXJpemVyO1xuXG4gIHByb3RlY3RlZCBiaWFzOiBMYXllclZhcmlhYmxlID0gbnVsbDtcblxuICByZWFkb25seSBERUZBVUxUX0tFUk5FTF9JTklUSUFMSVpFUjogSW5pdGlhbGl6ZXJJZGVudGlmaWVyID0gJ2dsb3JvdE5vcm1hbCc7XG4gIHJlYWRvbmx5IERFRkFVTFRfQklBU19JTklUSUFMSVpFUjogSW5pdGlhbGl6ZXJJZGVudGlmaWVyID0gJ3plcm9zJztcblxuICBjb25zdHJ1Y3RvcihyYW5rOiBudW1iZXIsIGFyZ3M6IEJhc2VDb252TGF5ZXJBcmdzKSB7XG4gICAgc3VwZXIoYXJncyBhcyBMYXllckFyZ3MpO1xuICAgIEJhc2VDb252LnZlcmlmeUFyZ3MoYXJncyk7XG4gICAgdGhpcy5yYW5rID0gcmFuaztcbiAgICBnZW5lcmljX3V0aWxzLmFzc2VydFBvc2l0aXZlSW50ZWdlcih0aGlzLnJhbmssICdyYW5rJyk7XG4gICAgaWYgKHRoaXMucmFuayAhPT0gMSAmJiB0aGlzLnJhbmsgIT09IDIgJiYgdGhpcy5yYW5rICE9PSAzKSB7XG4gICAgICB0aHJvdyBuZXcgTm90SW1wbGVtZW50ZWRFcnJvcihcbiAgICAgICAgICBgQ29udm9sdXRpb24gbGF5ZXIgZm9yIHJhbmsgb3RoZXIgdGhhbiAxLCAyLCBvciAzICgke1xuICAgICAgICAgICAgICB0aGlzLnJhbmt9KSBpcyBgICtcbiAgICAgICAgICBgbm90IGltcGxlbWVudGVkIHlldC5gKTtcbiAgICB9XG4gICAgdGhpcy5rZXJuZWxTaXplID0gbm9ybWFsaXplQXJyYXkoYXJncy5rZXJuZWxTaXplLCByYW5rLCAna2VybmVsU2l6ZScpO1xuICAgIHRoaXMuc3RyaWRlcyA9IG5vcm1hbGl6ZUFycmF5KFxuICAgICAgICBhcmdzLnN0cmlkZXMgPT0gbnVsbCA/IDEgOiBhcmdzLnN0cmlkZXMsIHJhbmssICdzdHJpZGVzJyk7XG4gICAgdGhpcy5wYWRkaW5nID0gYXJncy5wYWRkaW5nID09IG51bGwgPyAndmFsaWQnIDogYXJncy5wYWRkaW5nO1xuICAgIGNoZWNrUGFkZGluZ01vZGUodGhpcy5wYWRkaW5nKTtcbiAgICB0aGlzLmRhdGFGb3JtYXQgPVxuICAgICAgICBhcmdzLmRhdGFGb3JtYXQgPT0gbnVsbCA/ICdjaGFubmVsc0xhc3QnIDogYXJncy5kYXRhRm9ybWF0O1xuICAgIGNoZWNrRGF0YUZvcm1hdCh0aGlzLmRhdGFGb3JtYXQpO1xuICAgIHRoaXMuYWN0aXZhdGlvbiA9IGdldEFjdGl2YXRpb24oYXJncy5hY3RpdmF0aW9uKTtcbiAgICB0aGlzLnVzZUJpYXMgPSBhcmdzLnVzZUJpYXMgPT0gbnVsbCA/IHRydWUgOiBhcmdzLnVzZUJpYXM7XG4gICAgdGhpcy5iaWFzSW5pdGlhbGl6ZXIgPVxuICAgICAgICBnZXRJbml0aWFsaXplcihhcmdzLmJpYXNJbml0aWFsaXplciB8fCB0aGlzLkRFRkFVTFRfQklBU19JTklUSUFMSVpFUik7XG4gICAgdGhpcy5iaWFzQ29uc3RyYWludCA9IGdldENvbnN0cmFpbnQoYXJncy5iaWFzQ29uc3RyYWludCk7XG4gICAgdGhpcy5iaWFzUmVndWxhcml6ZXIgPSBnZXRSZWd1bGFyaXplcihhcmdzLmJpYXNSZWd1bGFyaXplcik7XG4gICAgdGhpcy5hY3Rpdml0eVJlZ3VsYXJpemVyID0gZ2V0UmVndWxhcml6ZXIoYXJncy5hY3Rpdml0eVJlZ3VsYXJpemVyKTtcbiAgICB0aGlzLmRpbGF0aW9uUmF0ZSA9IG5vcm1hbGl6ZUFycmF5KFxuICAgICAgICBhcmdzLmRpbGF0aW9uUmF0ZSA9PSBudWxsID8gMSA6IGFyZ3MuZGlsYXRpb25SYXRlLCByYW5rLFxuICAgICAgICAnZGlsYXRpb25SYXRlJyk7XG4gICAgaWYgKHRoaXMucmFuayA9PT0gMSAmJlxuICAgICAgICAoQXJyYXkuaXNBcnJheSh0aGlzLmRpbGF0aW9uUmF0ZSkgJiYgdGhpcy5kaWxhdGlvblJhdGUubGVuZ3RoICE9PSAxKSkge1xuICAgICAgdGhyb3cgbmV3IFZhbHVlRXJyb3IoXG4gICAgICAgICAgYGRpbGF0aW9uUmF0ZSBtdXN0IGJlIGEgbnVtYmVyIG9yIGFuIGFycmF5IG9mIGEgc2luZ2xlIG51bWJlciBgICtcbiAgICAgICAgICBgZm9yIDFEIGNvbnZvbHV0aW9uLCBidXQgcmVjZWl2ZWQgYCArXG4gICAgICAgICAgYCR7SlNPTi5zdHJpbmdpZnkodGhpcy5kaWxhdGlvblJhdGUpfWApO1xuICAgIH0gZWxzZSBpZiAodGhpcy5yYW5rID09PSAyKSB7XG4gICAgICBpZiAodHlwZW9mIHRoaXMuZGlsYXRpb25SYXRlID09PSAnbnVtYmVyJykge1xuICAgICAgICB0aGlzLmRpbGF0aW9uUmF0ZSA9IFt0aGlzLmRpbGF0aW9uUmF0ZSwgdGhpcy5kaWxhdGlvblJhdGVdO1xuICAgICAgfSBlbHNlIGlmICh0aGlzLmRpbGF0aW9uUmF0ZS5sZW5ndGggIT09IDIpIHtcbiAgICAgICAgdGhyb3cgbmV3IFZhbHVlRXJyb3IoXG4gICAgICAgICAgICBgZGlsYXRpb25SYXRlIG11c3QgYmUgYSBudW1iZXIgb3IgYXJyYXkgb2YgdHdvIG51bWJlcnMgZm9yIDJEIGAgK1xuICAgICAgICAgICAgYGNvbnZvbHV0aW9uLCBidXQgcmVjZWl2ZWQgJHtKU09OLnN0cmluZ2lmeSh0aGlzLmRpbGF0aW9uUmF0ZSl9YCk7XG4gICAgICB9XG4gICAgfSBlbHNlIGlmICh0aGlzLnJhbmsgPT09IDMpIHtcbiAgICAgIGlmICh0eXBlb2YgdGhpcy5kaWxhdGlvblJhdGUgPT09ICdudW1iZXInKSB7XG4gICAgICAgIHRoaXMuZGlsYXRpb25SYXRlID1cbiAgICAgICAgICAgIFt0aGlzLmRpbGF0aW9uUmF0ZSwgdGhpcy5kaWxhdGlvblJhdGUsIHRoaXMuZGlsYXRpb25SYXRlXTtcbiAgICAgIH0gZWxzZSBpZiAodGhpcy5kaWxhdGlvblJhdGUubGVuZ3RoICE9PSAzKSB7XG4gICAgICAgIHRocm93IG5ldyBWYWx1ZUVycm9yKFxuICAgICAgICAgICAgYGRpbGF0aW9uUmF0ZSBtdXN0IGJlIGEgbnVtYmVyIG9yIGFycmF5IG9mIHRocmVlIG51bWJlcnMgZm9yIDNEIGAgK1xuICAgICAgICAgICAgYGNvbnZvbHV0aW9uLCBidXQgcmVjZWl2ZWQgJHtKU09OLnN0cmluZ2lmeSh0aGlzLmRpbGF0aW9uUmF0ZSl9YCk7XG4gICAgICB9XG4gICAgfVxuICB9XG5cbiAgcHJvdGVjdGVkIHN0YXRpYyB2ZXJpZnlBcmdzKGFyZ3M6IEJhc2VDb252TGF5ZXJBcmdzKSB7XG4gICAgLy8gQ2hlY2sgY29uZmlnLmtlcm5lbFNpemUgdHlwZSBhbmQgc2hhcGUuXG4gICAgZ2VuZXJpY191dGlscy5hc3NlcnQoXG4gICAgICAgICdrZXJuZWxTaXplJyBpbiBhcmdzLCBgcmVxdWlyZWQga2V5ICdrZXJuZWxTaXplJyBub3QgaW4gY29uZmlnYCk7XG4gICAgaWYgKHR5cGVvZiBhcmdzLmtlcm5lbFNpemUgIT09ICdudW1iZXInICYmXG4gICAgICAgICFnZW5lcmljX3V0aWxzLmNoZWNrQXJyYXlUeXBlQW5kTGVuZ3RoKFxuICAgICAgICAgICAgYXJncy5rZXJuZWxTaXplLCAnbnVtYmVyJywgMSwgMykpIHtcbiAgICAgIHRocm93IG5ldyBWYWx1ZUVycm9yKFxuICAgICAgICAgIGBCYXNlQ29udiBleHBlY3RzIGNvbmZpZy5rZXJuZWxTaXplIHRvIGJlIG51bWJlciBvciBudW1iZXJbXSB3aXRoIGAgK1xuICAgICAgICAgIGBsZW5ndGggMSwgMiwgb3IgMywgYnV0IHJlY2VpdmVkICR7XG4gICAgICAgICAgICAgIEpTT04uc3RyaW5naWZ5KGFyZ3Mua2VybmVsU2l6ZSl9LmApO1xuICAgIH1cbiAgfVxuXG4gIGdldENvbmZpZygpOiBzZXJpYWxpemF0aW9uLkNvbmZpZ0RpY3Qge1xuICAgIGNvbnN0IGNvbmZpZzogc2VyaWFsaXphdGlvbi5Db25maWdEaWN0ID0ge1xuICAgICAga2VybmVsU2l6ZTogdGhpcy5rZXJuZWxTaXplLFxuICAgICAgc3RyaWRlczogdGhpcy5zdHJpZGVzLFxuICAgICAgcGFkZGluZzogdGhpcy5wYWRkaW5nLFxuICAgICAgZGF0YUZvcm1hdDogdGhpcy5kYXRhRm9ybWF0LFxuICAgICAgZGlsYXRpb25SYXRlOiB0aGlzLmRpbGF0aW9uUmF0ZSxcbiAgICAgIGFjdGl2YXRpb246IHNlcmlhbGl6ZUFjdGl2YXRpb24odGhpcy5hY3RpdmF0aW9uKSxcbiAgICAgIHVzZUJpYXM6IHRoaXMudXNlQmlhcyxcbiAgICAgIGJpYXNJbml0aWFsaXplcjogc2VyaWFsaXplSW5pdGlhbGl6ZXIodGhpcy5iaWFzSW5pdGlhbGl6ZXIpLFxuICAgICAgYmlhc1JlZ3VsYXJpemVyOiBzZXJpYWxpemVSZWd1bGFyaXplcih0aGlzLmJpYXNSZWd1bGFyaXplciksXG4gICAgICBhY3Rpdml0eVJlZ3VsYXJpemVyOiBzZXJpYWxpemVSZWd1bGFyaXplcih0aGlzLmFjdGl2aXR5UmVndWxhcml6ZXIpLFxuICAgICAgYmlhc0NvbnN0cmFpbnQ6IHNlcmlhbGl6ZUNvbnN0cmFpbnQodGhpcy5iaWFzQ29uc3RyYWludClcbiAgICB9O1xuICAgIGNvbnN0IGJhc2VDb25maWcgPSBzdXBlci5nZXRDb25maWcoKTtcbiAgICBPYmplY3QuYXNzaWduKGNvbmZpZywgYmFzZUNvbmZpZyk7XG4gICAgcmV0dXJuIGNvbmZpZztcbiAgfVxufVxuXG4vKipcbiAqIEFic3RyYWN0IG5EIGNvbnZvbHV0aW9uIGxheWVyLiAgQW5jZXN0b3Igb2YgY29udm9sdXRpb24gbGF5ZXJzIHdoaWNoIHJlZHVjZVxuICogYWNyb3NzIGNoYW5uZWxzLCBpLmUuLCBDb252MUQgYW5kIENvbnYyRCwgYnV0IG5vdCBEZXB0aHdpc2VDb252MkQuXG4gKi9cbmV4cG9ydCBhYnN0cmFjdCBjbGFzcyBDb252IGV4dGVuZHMgQmFzZUNvbnYge1xuICBwcm90ZWN0ZWQgcmVhZG9ubHkgZmlsdGVyczogbnVtYmVyO1xuXG4gIHByb3RlY3RlZCBrZXJuZWw6IExheWVyVmFyaWFibGUgPSBudWxsO1xuXG4gIC8vIEJpYXMtcmVsYXRlZCBwcm9wZXJ0aWVzIGFyZSBzdG9yZWQgaW4gdGhlIHN1cGVyY2xhc3MgYEJhc2VDb252YCBiZWNhdXNlIGFsbFxuICAvLyBjb252b2x1dGlvbiBzdWJjbGFzc2VzIHVzZSB0aGUgc2FtZSBjb25maWd1cmF0aW9uIHBhcmFtZXRlcnMgdG8gY29udHJvbFxuICAvLyBiaWFzLiBLZXJuZWwtcmVsYXRlZCBwcm9wZXJ0aWVzIGFyZSBkZWZpbmVkIGhlcmUgcmF0aGVyIHRoYW4gaW4gdGhlXG4gIC8vIHN1cGVyY2xhc3MgYmVjYXVzZSBzb21lIGNvbnZvbHV0aW9uIHN1YmNsYXNzZXMgdXNlIGRpZmZlcmVudCBuYW1lcyBhbmRcbiAgLy8gY29uZmlndXJhdGlvbiBwYXJhbWV0ZXJzIGZvciB0aGVpciBpbnRlcm5hbCBrZXJuZWwgc3RhdGUuXG4gIHByb3RlY3RlZCByZWFkb25seSBrZXJuZWxJbml0aWFsaXplcj86IEluaXRpYWxpemVyO1xuICBwcm90ZWN0ZWQgcmVhZG9ubHkga2VybmVsQ29uc3RyYWludD86IENvbnN0cmFpbnQ7XG4gIHByb3RlY3RlZCByZWFkb25seSBrZXJuZWxSZWd1bGFyaXplcj86IFJlZ3VsYXJpemVyO1xuXG4gIGNvbnN0cnVjdG9yKHJhbms6IG51bWJlciwgYXJnczogQ29udkxheWVyQXJncykge1xuICAgIHN1cGVyKHJhbmssIGFyZ3MgYXMgQmFzZUNvbnZMYXllckFyZ3MpO1xuICAgIENvbnYudmVyaWZ5QXJncyhhcmdzKTtcbiAgICB0aGlzLmZpbHRlcnMgPSBhcmdzLmZpbHRlcnM7XG4gICAgZ2VuZXJpY191dGlscy5hc3NlcnRQb3NpdGl2ZUludGVnZXIodGhpcy5maWx0ZXJzLCAnZmlsdGVycycpO1xuICAgIHRoaXMua2VybmVsSW5pdGlhbGl6ZXIgPSBnZXRJbml0aWFsaXplcihcbiAgICAgICAgYXJncy5rZXJuZWxJbml0aWFsaXplciB8fCB0aGlzLkRFRkFVTFRfS0VSTkVMX0lOSVRJQUxJWkVSKTtcbiAgICB0aGlzLmtlcm5lbENvbnN0cmFpbnQgPSBnZXRDb25zdHJhaW50KGFyZ3Mua2VybmVsQ29uc3RyYWludCk7XG4gICAgdGhpcy5rZXJuZWxSZWd1bGFyaXplciA9IGdldFJlZ3VsYXJpemVyKGFyZ3Mua2VybmVsUmVndWxhcml6ZXIpO1xuICB9XG5cbiAgYnVpbGQoaW5wdXRTaGFwZTogU2hhcGV8U2hhcGVbXSk6IHZvaWQge1xuICAgIGlucHV0U2hhcGUgPSBnZXRFeGFjdGx5T25lU2hhcGUoaW5wdXRTaGFwZSk7XG4gICAgY29uc3QgY2hhbm5lbEF4aXMgPVxuICAgICAgICB0aGlzLmRhdGFGb3JtYXQgPT09ICdjaGFubmVsc0ZpcnN0JyA/IDEgOiBpbnB1dFNoYXBlLmxlbmd0aCAtIDE7XG4gICAgaWYgKGlucHV0U2hhcGVbY2hhbm5lbEF4aXNdID09IG51bGwpIHtcbiAgICAgIHRocm93IG5ldyBWYWx1ZUVycm9yKFxuICAgICAgICAgIGBUaGUgY2hhbm5lbCBkaW1lbnNpb24gb2YgdGhlIGlucHV0IHNob3VsZCBiZSBkZWZpbmVkLiBgICtcbiAgICAgICAgICBgRm91bmQgJHtpbnB1dFNoYXBlW2NoYW5uZWxBeGlzXX1gKTtcbiAgICB9XG4gICAgY29uc3QgaW5wdXREaW0gPSBpbnB1dFNoYXBlW2NoYW5uZWxBeGlzXTtcblxuICAgIGNvbnN0IGtlcm5lbFNoYXBlID0gdGhpcy5rZXJuZWxTaXplLmNvbmNhdChbaW5wdXREaW0sIHRoaXMuZmlsdGVyc10pO1xuXG4gICAgdGhpcy5rZXJuZWwgPSB0aGlzLmFkZFdlaWdodChcbiAgICAgICAgJ2tlcm5lbCcsIGtlcm5lbFNoYXBlLCBudWxsLCB0aGlzLmtlcm5lbEluaXRpYWxpemVyLFxuICAgICAgICB0aGlzLmtlcm5lbFJlZ3VsYXJpemVyLCB0cnVlLCB0aGlzLmtlcm5lbENvbnN0cmFpbnQpO1xuICAgIGlmICh0aGlzLnVzZUJpYXMpIHtcbiAgICAgIHRoaXMuYmlhcyA9IHRoaXMuYWRkV2VpZ2h0KFxuICAgICAgICAgICdiaWFzJywgW3RoaXMuZmlsdGVyc10sIG51bGwsIHRoaXMuYmlhc0luaXRpYWxpemVyLFxuICAgICAgICAgIHRoaXMuYmlhc1JlZ3VsYXJpemVyLCB0cnVlLCB0aGlzLmJpYXNDb25zdHJhaW50KTtcbiAgICB9XG5cbiAgICB0aGlzLmlucHV0U3BlYyA9IFt7bmRpbTogdGhpcy5yYW5rICsgMiwgYXhlczoge1tjaGFubmVsQXhpc106IGlucHV0RGltfX1dO1xuICAgIHRoaXMuYnVpbHQgPSB0cnVlO1xuICB9XG5cbiAgY2FsbChpbnB1dHM6IFRlbnNvcnxUZW5zb3JbXSwga3dhcmdzOiBLd2FyZ3MpOiBUZW5zb3J8VGVuc29yW10ge1xuICAgIHJldHVybiB0aWR5KCgpID0+IHtcbiAgICAgIGlucHV0cyA9IGdldEV4YWN0bHlPbmVUZW5zb3IoaW5wdXRzKTtcbiAgICAgIGxldCBvdXRwdXRzOiBUZW5zb3I7XG4gICAgICBjb25zdCBiaWFzVmFsdWUgPSB0aGlzLmJpYXMgPT0gbnVsbCA/IG51bGwgOiB0aGlzLmJpYXMucmVhZCgpO1xuICAgICAgY29uc3QgZnVzZWRBY3RpdmF0aW9uTmFtZSA9IGdlbmVyaWNfdXRpbHMubWFwQWN0aXZhdGlvblRvRnVzZWRLZXJuZWwoXG4gICAgICAgICAgdGhpcy5hY3RpdmF0aW9uLmdldENsYXNzTmFtZSgpKTtcblxuICAgICAgaWYgKGZ1c2VkQWN0aXZhdGlvbk5hbWUgIT0gbnVsbCAmJiB0aGlzLnJhbmsgPT09IDIpIHtcbiAgICAgICAgb3V0cHV0cyA9IGNvbnYyZFdpdGhCaWFzQWN0aXZhdGlvbihcbiAgICAgICAgICAgIGlucHV0cywgdGhpcy5rZXJuZWwucmVhZCgpLCBiaWFzVmFsdWUsIHRoaXMuc3RyaWRlcywgdGhpcy5wYWRkaW5nLFxuICAgICAgICAgICAgdGhpcy5kYXRhRm9ybWF0LCB0aGlzLmRpbGF0aW9uUmF0ZSBhcyBbbnVtYmVyLCBudW1iZXJdLFxuICAgICAgICAgICAgZnVzZWRBY3RpdmF0aW9uTmFtZSk7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBpZiAodGhpcy5yYW5rID09PSAxKSB7XG4gICAgICAgICAgb3V0cHV0cyA9IGNvbnYxZFdpdGhCaWFzKFxuICAgICAgICAgICAgICBpbnB1dHMsIHRoaXMua2VybmVsLnJlYWQoKSwgYmlhc1ZhbHVlLCB0aGlzLnN0cmlkZXNbMF0sXG4gICAgICAgICAgICAgIHRoaXMucGFkZGluZywgdGhpcy5kYXRhRm9ybWF0LCB0aGlzLmRpbGF0aW9uUmF0ZVswXSk7XG4gICAgICAgIH0gZWxzZSBpZiAodGhpcy5yYW5rID09PSAyKSB7XG4gICAgICAgICAgLy8gVE9ETyhjYWlzKTogTW92ZSB1cCB0byBjb25zdHJ1Y3Rvci5cbiAgICAgICAgICBvdXRwdXRzID0gY29udjJkV2l0aEJpYXNBY3RpdmF0aW9uKFxuICAgICAgICAgICAgICBpbnB1dHMsIHRoaXMua2VybmVsLnJlYWQoKSwgYmlhc1ZhbHVlLCB0aGlzLnN0cmlkZXMsIHRoaXMucGFkZGluZyxcbiAgICAgICAgICAgICAgdGhpcy5kYXRhRm9ybWF0LCB0aGlzLmRpbGF0aW9uUmF0ZSBhcyBbbnVtYmVyLCBudW1iZXJdKTtcbiAgICAgICAgfSBlbHNlIGlmICh0aGlzLnJhbmsgPT09IDMpIHtcbiAgICAgICAgICBvdXRwdXRzID0gY29udjNkV2l0aEJpYXMoXG4gICAgICAgICAgICAgIGlucHV0cywgdGhpcy5rZXJuZWwucmVhZCgpLCBiaWFzVmFsdWUsIHRoaXMuc3RyaWRlcywgdGhpcy5wYWRkaW5nLFxuICAgICAgICAgICAgICB0aGlzLmRhdGFGb3JtYXQsIHRoaXMuZGlsYXRpb25SYXRlIGFzIFtudW1iZXIsIG51bWJlciwgbnVtYmVyXSk7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgdGhyb3cgbmV3IE5vdEltcGxlbWVudGVkRXJyb3IoXG4gICAgICAgICAgICAgICdjb252b2x1dGlvbnMgZ3JlYXRlciB0aGFuIDNEIGFyZSBub3QgaW1wbGVtZW50ZWQgeWV0LicpO1xuICAgICAgICB9XG5cbiAgICAgICAgaWYgKHRoaXMuYWN0aXZhdGlvbiAhPSBudWxsKSB7XG4gICAgICAgICAgb3V0cHV0cyA9IHRoaXMuYWN0aXZhdGlvbi5hcHBseShvdXRwdXRzKTtcbiAgICAgICAgfVxuICAgICAgfVxuXG4gICAgICByZXR1cm4gb3V0cHV0cztcbiAgICB9KTtcbiAgfVxuXG4gIGNvbXB1dGVPdXRwdXRTaGFwZShpbnB1dFNoYXBlOiBTaGFwZXxTaGFwZVtdKTogU2hhcGV8U2hhcGVbXSB7XG4gICAgaW5wdXRTaGFwZSA9IGdldEV4YWN0bHlPbmVTaGFwZShpbnB1dFNoYXBlKTtcbiAgICBjb25zdCBuZXdTcGFjZTogbnVtYmVyW10gPSBbXTtcbiAgICBjb25zdCBzcGFjZSA9ICh0aGlzLmRhdGFGb3JtYXQgPT09ICdjaGFubmVsc0xhc3QnKSA/XG4gICAgICAgIGlucHV0U2hhcGUuc2xpY2UoMSwgaW5wdXRTaGFwZS5sZW5ndGggLSAxKSA6XG4gICAgICAgIGlucHV0U2hhcGUuc2xpY2UoMik7XG4gICAgZm9yIChsZXQgaSA9IDA7IGkgPCBzcGFjZS5sZW5ndGg7ICsraSkge1xuICAgICAgY29uc3QgbmV3RGltID0gY29udk91dHB1dExlbmd0aChcbiAgICAgICAgICBzcGFjZVtpXSwgdGhpcy5rZXJuZWxTaXplW2ldLCB0aGlzLnBhZGRpbmcsIHRoaXMuc3RyaWRlc1tpXSxcbiAgICAgICAgICB0eXBlb2YgdGhpcy5kaWxhdGlvblJhdGUgPT09ICdudW1iZXInID8gdGhpcy5kaWxhdGlvblJhdGUgOlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGlzLmRpbGF0aW9uUmF0ZVtpXSk7XG4gICAgICBuZXdTcGFjZS5wdXNoKG5ld0RpbSk7XG4gICAgfVxuXG4gICAgbGV0IG91dHB1dFNoYXBlID0gW2lucHV0U2hhcGVbMF1dO1xuICAgIGlmICh0aGlzLmRhdGFGb3JtYXQgPT09ICdjaGFubmVsc0xhc3QnKSB7XG4gICAgICBvdXRwdXRTaGFwZSA9IG91dHB1dFNoYXBlLmNvbmNhdChuZXdTcGFjZSk7XG4gICAgICBvdXRwdXRTaGFwZS5wdXNoKHRoaXMuZmlsdGVycyk7XG4gICAgfSBlbHNlIHtcbiAgICAgIG91dHB1dFNoYXBlLnB1c2godGhpcy5maWx0ZXJzKTtcbiAgICAgIG91dHB1dFNoYXBlID0gb3V0cHV0U2hhcGUuY29uY2F0KG5ld1NwYWNlKTtcbiAgICB9XG4gICAgcmV0dXJuIG91dHB1dFNoYXBlO1xuICB9XG5cbiAgZ2V0Q29uZmlnKCk6IHNlcmlhbGl6YXRpb24uQ29uZmlnRGljdCB7XG4gICAgY29uc3QgY29uZmlnID0ge1xuICAgICAgZmlsdGVyczogdGhpcy5maWx0ZXJzLFxuICAgICAga2VybmVsSW5pdGlhbGl6ZXI6IHNlcmlhbGl6ZUluaXRpYWxpemVyKHRoaXMua2VybmVsSW5pdGlhbGl6ZXIpLFxuICAgICAga2VybmVsUmVndWxhcml6ZXI6IHNlcmlhbGl6ZVJlZ3VsYXJpemVyKHRoaXMua2VybmVsUmVndWxhcml6ZXIpLFxuICAgICAga2VybmVsQ29uc3RyYWludDogc2VyaWFsaXplQ29uc3RyYWludCh0aGlzLmtlcm5lbENvbnN0cmFpbnQpXG4gICAgfTtcbiAgICBjb25zdCBiYXNlQ29uZmlnID0gc3VwZXIuZ2V0Q29uZmlnKCk7XG4gICAgT2JqZWN0LmFzc2lnbihjb25maWcsIGJhc2VDb25maWcpO1xuICAgIHJldHVybiBjb25maWc7XG4gIH1cblxuICBwcm90ZWN0ZWQgc3RhdGljIHZlcmlmeUFyZ3MoYXJnczogQ29udkxheWVyQXJncykge1xuICAgIC8vIENoZWNrIGNvbmZpZy5maWx0ZXJzIHR5cGUsIHNoYXBlLCBhbmQgdmFsdWUuXG4gICAgaWYgKCEoJ2ZpbHRlcnMnIGluIGFyZ3MpIHx8IHR5cGVvZiBhcmdzLmZpbHRlcnMgIT09ICdudW1iZXInIHx8XG4gICAgICAgIGFyZ3MuZmlsdGVycyA8IDEpIHtcbiAgICAgIHRocm93IG5ldyBWYWx1ZUVycm9yKFxuICAgICAgICAgIGBDb252b2x1dGlvbiBsYXllciBleHBlY3RlZCBjb25maWcuZmlsdGVycyB0byBiZSBhICdudW1iZXInID4gMCBgICtcbiAgICAgICAgICBgYnV0IGdvdCAke0pTT04uc3RyaW5naWZ5KGFyZ3MuZmlsdGVycyl9YCk7XG4gICAgfVxuICB9XG59XG5cbmV4cG9ydCBjbGFzcyBDb252MkQgZXh0ZW5kcyBDb252IHtcbiAgLyoqIEBub2NvbGxhcHNlICovXG4gIHN0YXRpYyBjbGFzc05hbWUgPSAnQ29udjJEJztcbiAgY29uc3RydWN0b3IoYXJnczogQ29udkxheWVyQXJncykge1xuICAgIHN1cGVyKDIsIGFyZ3MpO1xuICAgIENvbnYyRC52ZXJpZnlBcmdzKGFyZ3MpO1xuICB9XG5cbiAgZ2V0Q29uZmlnKCk6IHNlcmlhbGl6YXRpb24uQ29uZmlnRGljdCB7XG4gICAgY29uc3QgY29uZmlnID0gc3VwZXIuZ2V0Q29uZmlnKCk7XG4gICAgZGVsZXRlIGNvbmZpZ1sncmFuayddO1xuICAgIHJldHVybiBjb25maWc7XG4gIH1cblxuICBwcm90ZWN0ZWQgc3RhdGljIHZlcmlmeUFyZ3MoYXJnczogQ29udkxheWVyQXJncykge1xuICAgIC8vIGNvbmZpZy5rZXJuZWxTaXplIG11c3QgYmUgYSBudW1iZXIgb3IgYXJyYXkgb2YgbnVtYmVycy5cbiAgICBpZiAoKHR5cGVvZiBhcmdzLmtlcm5lbFNpemUgIT09ICdudW1iZXInKSAmJlxuICAgICAgICAhZ2VuZXJpY191dGlscy5jaGVja0FycmF5VHlwZUFuZExlbmd0aChcbiAgICAgICAgICAgIGFyZ3Mua2VybmVsU2l6ZSwgJ251bWJlcicsIDEsIDIpKSB7XG4gICAgICB0aHJvdyBuZXcgVmFsdWVFcnJvcihcbiAgICAgICAgICBgQ29udjJEIGV4cGVjdHMgY29uZmlnLmtlcm5lbFNpemUgdG8gYmUgbnVtYmVyIG9yIG51bWJlcltdIHdpdGggYCArXG4gICAgICAgICAgYGxlbmd0aCAxIG9yIDIsIGJ1dCByZWNlaXZlZCAke0pTT04uc3RyaW5naWZ5KGFyZ3Mua2VybmVsU2l6ZSl9LmApO1xuICAgIH1cbiAgfVxufVxuc2VyaWFsaXphdGlvbi5yZWdpc3RlckNsYXNzKENvbnYyRCk7XG5cbmV4cG9ydCBjbGFzcyBDb252M0QgZXh0ZW5kcyBDb252IHtcbiAgLyoqIEBub2NvbGxhcHNlICovXG4gIHN0YXRpYyBjbGFzc05hbWUgPSAnQ29udjNEJztcbiAgY29uc3RydWN0b3IoYXJnczogQ29udkxheWVyQXJncykge1xuICAgIHN1cGVyKDMsIGFyZ3MpO1xuICAgIENvbnYzRC52ZXJpZnlBcmdzKGFyZ3MpO1xuICB9XG5cbiAgZ2V0Q29uZmlnKCk6IHNlcmlhbGl6YXRpb24uQ29uZmlnRGljdCB7XG4gICAgY29uc3QgY29uZmlnID0gc3VwZXIuZ2V0Q29uZmlnKCk7XG4gICAgZGVsZXRlIGNvbmZpZ1sncmFuayddO1xuICAgIHJldHVybiBjb25maWc7XG4gIH1cblxuICBwcm90ZWN0ZWQgc3RhdGljIHZlcmlmeUFyZ3MoYXJnczogQ29udkxheWVyQXJncykge1xuICAgIC8vIGNvbmZpZy5rZXJuZWxTaXplIG11c3QgYmUgYSBudW1iZXIgb3IgYXJyYXkgb2YgbnVtYmVycy5cbiAgICBpZiAodHlwZW9mIGFyZ3Mua2VybmVsU2l6ZSAhPT0gJ251bWJlcicpIHtcbiAgICAgIGlmICghKEFycmF5LmlzQXJyYXkoYXJncy5rZXJuZWxTaXplKSAmJlxuICAgICAgICAgICAgKGFyZ3Mua2VybmVsU2l6ZS5sZW5ndGggPT09IDEgfHwgYXJncy5rZXJuZWxTaXplLmxlbmd0aCA9PT0gMykpKSB7XG4gICAgICAgIHRocm93IG5ldyBWYWx1ZUVycm9yKFxuICAgICAgICAgICAgYENvbnYzRCBleHBlY3RzIGNvbmZpZy5rZXJuZWxTaXplIHRvIGJlIG51bWJlciBvcmAgK1xuICAgICAgICAgICAgYCBbbnVtYmVyLCBudW1iZXIsIG51bWJlcl0sIGJ1dCByZWNlaXZlZCAke1xuICAgICAgICAgICAgICAgIEpTT04uc3RyaW5naWZ5KGFyZ3Mua2VybmVsU2l6ZSl9LmApO1xuICAgICAgfVxuICAgIH1cbiAgfVxufVxuc2VyaWFsaXphdGlvbi5yZWdpc3RlckNsYXNzKENvbnYzRCk7XG5cbmV4cG9ydCBjbGFzcyBDb252MkRUcmFuc3Bvc2UgZXh0ZW5kcyBDb252MkQge1xuICAvKiogQG5vY29sbGFwc2UgKi9cbiAgc3RhdGljIGNsYXNzTmFtZSA9ICdDb252MkRUcmFuc3Bvc2UnO1xuICBpbnB1dFNwZWM6IElucHV0U3BlY1tdO1xuXG4gIGNvbnN0cnVjdG9yKGFyZ3M6IENvbnZMYXllckFyZ3MpIHtcbiAgICBzdXBlcihhcmdzKTtcbiAgICB0aGlzLmlucHV0U3BlYyA9IFtuZXcgSW5wdXRTcGVjKHtuZGltOiA0fSldO1xuXG4gICAgaWYgKHRoaXMucGFkZGluZyAhPT0gJ3NhbWUnICYmIHRoaXMucGFkZGluZyAhPT0gJ3ZhbGlkJykge1xuICAgICAgdGhyb3cgbmV3IFZhbHVlRXJyb3IoXG4gICAgICAgICAgYENvbnYyRFRyYW5zcG9zZSBjdXJyZW50bHkgc3VwcG9ydHMgb25seSBwYWRkaW5nIG1vZGVzICdzYW1lJyBgICtcbiAgICAgICAgICBgYW5kICd2YWxpZCcsIGJ1dCByZWNlaXZlZCBwYWRkaW5nIG1vZGUgJHt0aGlzLnBhZGRpbmd9YCk7XG4gICAgfVxuICB9XG5cbiAgYnVpbGQoaW5wdXRTaGFwZTogU2hhcGV8U2hhcGVbXSk6IHZvaWQge1xuICAgIGlucHV0U2hhcGUgPSBnZXRFeGFjdGx5T25lU2hhcGUoaW5wdXRTaGFwZSk7XG5cbiAgICBpZiAoaW5wdXRTaGFwZS5sZW5ndGggIT09IDQpIHtcbiAgICAgIHRocm93IG5ldyBWYWx1ZUVycm9yKFxuICAgICAgICAgICdJbnB1dCBzaG91bGQgaGF2ZSByYW5rIDQ7IFJlY2VpdmVkIGlucHV0IHNoYXBlOiAnICtcbiAgICAgICAgICBKU09OLnN0cmluZ2lmeShpbnB1dFNoYXBlKSk7XG4gICAgfVxuXG4gICAgY29uc3QgY2hhbm5lbEF4aXMgPVxuICAgICAgICB0aGlzLmRhdGFGb3JtYXQgPT09ICdjaGFubmVsc0ZpcnN0JyA/IDEgOiBpbnB1dFNoYXBlLmxlbmd0aCAtIDE7XG4gICAgaWYgKGlucHV0U2hhcGVbY2hhbm5lbEF4aXNdID09IG51bGwpIHtcbiAgICAgIHRocm93IG5ldyBWYWx1ZUVycm9yKFxuICAgICAgICAgICdUaGUgY2hhbm5lbCBkaW1lbnNpb24gb2YgdGhlIGlucHV0cyBzaG91bGQgYmUgZGVmaW5lZC4gJyArXG4gICAgICAgICAgJ0ZvdW5kIGBOb25lYC4nKTtcbiAgICB9XG4gICAgY29uc3QgaW5wdXREaW0gPSBpbnB1dFNoYXBlW2NoYW5uZWxBeGlzXTtcbiAgICBjb25zdCBrZXJuZWxTaGFwZSA9IHRoaXMua2VybmVsU2l6ZS5jb25jYXQoW3RoaXMuZmlsdGVycywgaW5wdXREaW1dKTtcblxuICAgIHRoaXMua2VybmVsID0gdGhpcy5hZGRXZWlnaHQoXG4gICAgICAgICdrZXJuZWwnLCBrZXJuZWxTaGFwZSwgJ2Zsb2F0MzInLCB0aGlzLmtlcm5lbEluaXRpYWxpemVyLFxuICAgICAgICB0aGlzLmtlcm5lbFJlZ3VsYXJpemVyLCB0cnVlLCB0aGlzLmtlcm5lbENvbnN0cmFpbnQpO1xuICAgIGlmICh0aGlzLnVzZUJpYXMpIHtcbiAgICAgIHRoaXMuYmlhcyA9IHRoaXMuYWRkV2VpZ2h0KFxuICAgICAgICAgICdiaWFzJywgW3RoaXMuZmlsdGVyc10sICdmbG9hdDMyJywgdGhpcy5iaWFzSW5pdGlhbGl6ZXIsXG4gICAgICAgICAgdGhpcy5iaWFzUmVndWxhcml6ZXIsIHRydWUsIHRoaXMuYmlhc0NvbnN0cmFpbnQpO1xuICAgIH1cblxuICAgIC8vIFNldCBpbnB1dCBzcGVjLlxuICAgIHRoaXMuaW5wdXRTcGVjID1cbiAgICAgICAgW25ldyBJbnB1dFNwZWMoe25kaW06IDQsIGF4ZXM6IHtbY2hhbm5lbEF4aXNdOiBpbnB1dERpbX19KV07XG4gICAgdGhpcy5idWlsdCA9IHRydWU7XG4gIH1cblxuICBjYWxsKGlucHV0czogVGVuc29yfFRlbnNvcltdLCBrd2FyZ3M6IEt3YXJncyk6IFRlbnNvcnxUZW5zb3JbXSB7XG4gICAgcmV0dXJuIHRmYy50aWR5KCgpID0+IHtcbiAgICAgIGxldCBpbnB1dCA9IGdldEV4YWN0bHlPbmVUZW5zb3IoaW5wdXRzKTtcbiAgICAgIGlmIChpbnB1dC5zaGFwZS5sZW5ndGggIT09IDQpIHtcbiAgICAgICAgdGhyb3cgbmV3IFZhbHVlRXJyb3IoXG4gICAgICAgICAgICBgQ29udjJEVHJhbnNwb3NlLmNhbGwoKSBleHBlY3RzIGlucHV0IHRlbnNvciB0byBiZSByYW5rLTQsIGJ1dCBgICtcbiAgICAgICAgICAgIGByZWNlaXZlZCBhIHRlbnNvciBvZiByYW5rLSR7aW5wdXQuc2hhcGUubGVuZ3RofWApO1xuICAgICAgfVxuXG4gICAgICBjb25zdCBpbnB1dFNoYXBlID0gaW5wdXQuc2hhcGU7XG4gICAgICBjb25zdCBiYXRjaFNpemUgPSBpbnB1dFNoYXBlWzBdO1xuXG4gICAgICBsZXQgaEF4aXM6IG51bWJlcjtcbiAgICAgIGxldCB3QXhpczogbnVtYmVyO1xuICAgICAgaWYgKHRoaXMuZGF0YUZvcm1hdCA9PT0gJ2NoYW5uZWxzRmlyc3QnKSB7XG4gICAgICAgIGhBeGlzID0gMjtcbiAgICAgICAgd0F4aXMgPSAzO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgaEF4aXMgPSAxO1xuICAgICAgICB3QXhpcyA9IDI7XG4gICAgICB9XG5cbiAgICAgIGNvbnN0IGhlaWdodCA9IGlucHV0U2hhcGVbaEF4aXNdO1xuICAgICAgY29uc3Qgd2lkdGggPSBpbnB1dFNoYXBlW3dBeGlzXTtcbiAgICAgIGNvbnN0IGtlcm5lbEggPSB0aGlzLmtlcm5lbFNpemVbMF07XG4gICAgICBjb25zdCBrZXJuZWxXID0gdGhpcy5rZXJuZWxTaXplWzFdO1xuICAgICAgY29uc3Qgc3RyaWRlSCA9IHRoaXMuc3RyaWRlc1swXTtcbiAgICAgIGNvbnN0IHN0cmlkZVcgPSB0aGlzLnN0cmlkZXNbMV07XG5cbiAgICAgIC8vIEluZmVyIHRoZSBkeW5hbWljIG91dHB1dCBzaGFwZS5cbiAgICAgIGNvbnN0IG91dEhlaWdodCA9IGRlY29udkxlbmd0aChoZWlnaHQsIHN0cmlkZUgsIGtlcm5lbEgsIHRoaXMucGFkZGluZyk7XG4gICAgICBjb25zdCBvdXRXaWR0aCA9IGRlY29udkxlbmd0aCh3aWR0aCwgc3RyaWRlVywga2VybmVsVywgdGhpcy5wYWRkaW5nKTtcblxuICAgICAgLy8gUG9ydGluZyBOb3RlOiBXZSBkb24ndCBicmFuY2ggYmFzZWQgb24gYHRoaXMuZGF0YUZvcm1hdGAgaGVyZSxcbiAgICAgIC8vIGJlY2F1c2VcbiAgICAgIC8vICAgdGhlIHRqZnMtY29yZSBmdW5jdGlvbiBgY29udjJkVHJhbnNwb3NlYCBjYWxsZWQgYmVsb3cgYWx3YXlzXG4gICAgICAvLyAgIGFzc3VtZXMgY2hhbm5lbHNMYXN0LlxuICAgICAgY29uc3Qgb3V0cHV0U2hhcGU6IFtudW1iZXIsIG51bWJlciwgbnVtYmVyLCBudW1iZXJdID1cbiAgICAgICAgICBbYmF0Y2hTaXplLCBvdXRIZWlnaHQsIG91dFdpZHRoLCB0aGlzLmZpbHRlcnNdO1xuXG4gICAgICBpZiAodGhpcy5kYXRhRm9ybWF0ICE9PSAnY2hhbm5lbHNMYXN0Jykge1xuICAgICAgICBpbnB1dCA9IHRmYy50cmFuc3Bvc2UoaW5wdXQsIFswLCAyLCAzLCAxXSk7XG4gICAgICB9XG4gICAgICBsZXQgb3V0cHV0cyA9IHRmYy5jb252MmRUcmFuc3Bvc2UoXG4gICAgICAgICAgaW5wdXQgYXMgVGVuc29yNEQsIHRoaXMua2VybmVsLnJlYWQoKSBhcyBUZW5zb3I0RCwgb3V0cHV0U2hhcGUsXG4gICAgICAgICAgdGhpcy5zdHJpZGVzIGFzIFtudW1iZXIsIG51bWJlcl0sIHRoaXMucGFkZGluZyBhcyAnc2FtZScgfCAndmFsaWQnKTtcbiAgICAgIGlmICh0aGlzLmRhdGFGb3JtYXQgIT09ICdjaGFubmVsc0xhc3QnKSB7XG4gICAgICAgIG91dHB1dHMgPSB0ZmMudHJhbnNwb3NlKG91dHB1dHMsIFswLCAzLCAxLCAyXSk7XG4gICAgICB9XG5cbiAgICAgIGlmICh0aGlzLmJpYXMgIT0gbnVsbCkge1xuICAgICAgICBvdXRwdXRzID1cbiAgICAgICAgICAgIEsuYmlhc0FkZChvdXRwdXRzLCB0aGlzLmJpYXMucmVhZCgpLCB0aGlzLmRhdGFGb3JtYXQpIGFzIFRlbnNvcjREO1xuICAgICAgfVxuICAgICAgaWYgKHRoaXMuYWN0aXZhdGlvbiAhPSBudWxsKSB7XG4gICAgICAgIG91dHB1dHMgPSB0aGlzLmFjdGl2YXRpb24uYXBwbHkob3V0cHV0cykgYXMgVGVuc29yNEQ7XG4gICAgICB9XG4gICAgICByZXR1cm4gb3V0cHV0cztcbiAgICB9KTtcbiAgfVxuXG4gIGNvbXB1dGVPdXRwdXRTaGFwZShpbnB1dFNoYXBlOiBTaGFwZXxTaGFwZVtdKTogU2hhcGV8U2hhcGVbXSB7XG4gICAgaW5wdXRTaGFwZSA9IGdldEV4YWN0bHlPbmVTaGFwZShpbnB1dFNoYXBlKTtcbiAgICBjb25zdCBvdXRwdXRTaGFwZSA9IGlucHV0U2hhcGUuc2xpY2UoKTtcblxuICAgIGxldCBjaGFubmVsQXhpczogbnVtYmVyO1xuICAgIGxldCBoZWlnaHRBeGlzOiBudW1iZXI7XG4gICAgbGV0IHdpZHRoQXhpczogbnVtYmVyO1xuICAgIGlmICh0aGlzLmRhdGFGb3JtYXQgPT09ICdjaGFubmVsc0ZpcnN0Jykge1xuICAgICAgY2hhbm5lbEF4aXMgPSAxO1xuICAgICAgaGVpZ2h0QXhpcyA9IDI7XG4gICAgICB3aWR0aEF4aXMgPSAzO1xuICAgIH0gZWxzZSB7XG4gICAgICBjaGFubmVsQXhpcyA9IDM7XG4gICAgICBoZWlnaHRBeGlzID0gMTtcbiAgICAgIHdpZHRoQXhpcyA9IDI7XG4gICAgfVxuXG4gICAgY29uc3Qga2VybmVsSCA9IHRoaXMua2VybmVsU2l6ZVswXTtcbiAgICBjb25zdCBrZXJuZWxXID0gdGhpcy5rZXJuZWxTaXplWzFdO1xuICAgIGNvbnN0IHN0cmlkZUggPSB0aGlzLnN0cmlkZXNbMF07XG4gICAgY29uc3Qgc3RyaWRlVyA9IHRoaXMuc3RyaWRlc1sxXTtcblxuICAgIG91dHB1dFNoYXBlW2NoYW5uZWxBeGlzXSA9IHRoaXMuZmlsdGVycztcbiAgICBvdXRwdXRTaGFwZVtoZWlnaHRBeGlzXSA9XG4gICAgICAgIGRlY29udkxlbmd0aChvdXRwdXRTaGFwZVtoZWlnaHRBeGlzXSwgc3RyaWRlSCwga2VybmVsSCwgdGhpcy5wYWRkaW5nKTtcbiAgICBvdXRwdXRTaGFwZVt3aWR0aEF4aXNdID1cbiAgICAgICAgZGVjb252TGVuZ3RoKG91dHB1dFNoYXBlW3dpZHRoQXhpc10sIHN0cmlkZVcsIGtlcm5lbFcsIHRoaXMucGFkZGluZyk7XG4gICAgcmV0dXJuIG91dHB1dFNoYXBlO1xuICB9XG5cbiAgZ2V0Q29uZmlnKCk6IHNlcmlhbGl6YXRpb24uQ29uZmlnRGljdCB7XG4gICAgY29uc3QgY29uZmlnID0gc3VwZXIuZ2V0Q29uZmlnKCk7XG4gICAgZGVsZXRlIGNvbmZpZ1snZGlsYXRpb25SYXRlJ107XG4gICAgcmV0dXJuIGNvbmZpZztcbiAgfVxufVxuc2VyaWFsaXphdGlvbi5yZWdpc3RlckNsYXNzKENvbnYyRFRyYW5zcG9zZSk7XG5cbmV4cG9ydCBjbGFzcyBDb252M0RUcmFuc3Bvc2UgZXh0ZW5kcyBDb252M0Qge1xuICAvKiogQG5vY29sbGFwc2UgKi9cbiAgc3RhdGljIGNsYXNzTmFtZSA9ICdDb252M0RUcmFuc3Bvc2UnO1xuICBpbnB1dFNwZWM6IElucHV0U3BlY1tdO1xuXG4gIGNvbnN0cnVjdG9yKGFyZ3M6IENvbnZMYXllckFyZ3MpIHtcbiAgICBzdXBlcihhcmdzKTtcbiAgICB0aGlzLmlucHV0U3BlYyA9IFtuZXcgSW5wdXRTcGVjKHtuZGltOiA1fSldO1xuXG4gICAgaWYgKHRoaXMucGFkZGluZyAhPT0gJ3NhbWUnICYmIHRoaXMucGFkZGluZyAhPT0gJ3ZhbGlkJykge1xuICAgICAgdGhyb3cgbmV3IFZhbHVlRXJyb3IoXG4gICAgICAgICAgYENvbnYzRFRyYW5zcG9zZSBjdXJyZW50bHkgc3VwcG9ydHMgb25seSBwYWRkaW5nIG1vZGVzICdzYW1lJyBgICtcbiAgICAgICAgICBgYW5kICd2YWxpZCcsIGJ1dCByZWNlaXZlZCBwYWRkaW5nIG1vZGUgJHt0aGlzLnBhZGRpbmd9YCk7XG4gICAgfVxuICB9XG5cbiAgYnVpbGQoaW5wdXRTaGFwZTogU2hhcGV8U2hhcGVbXSk6IHZvaWQge1xuICAgIGlucHV0U2hhcGUgPSBnZXRFeGFjdGx5T25lU2hhcGUoaW5wdXRTaGFwZSk7XG5cbiAgICBpZiAoaW5wdXRTaGFwZS5sZW5ndGggIT09IDUpIHtcbiAgICAgIHRocm93IG5ldyBWYWx1ZUVycm9yKFxuICAgICAgICAgICdJbnB1dCBzaG91bGQgaGF2ZSByYW5rIDU7IFJlY2VpdmVkIGlucHV0IHNoYXBlOiAnICtcbiAgICAgICAgICBKU09OLnN0cmluZ2lmeShpbnB1dFNoYXBlKSk7XG4gICAgfVxuXG4gICAgY29uc3QgY2hhbm5lbEF4aXMgPVxuICAgICAgICB0aGlzLmRhdGFGb3JtYXQgPT09ICdjaGFubmVsc0ZpcnN0JyA/IDEgOiBpbnB1dFNoYXBlLmxlbmd0aCAtIDE7XG4gICAgaWYgKGlucHV0U2hhcGVbY2hhbm5lbEF4aXNdID09IG51bGwpIHtcbiAgICAgIHRocm93IG5ldyBWYWx1ZUVycm9yKFxuICAgICAgICAgICdUaGUgY2hhbm5lbCBkaW1lbnNpb24gb2YgdGhlIGlucHV0cyBzaG91bGQgYmUgZGVmaW5lZC4gJyArXG4gICAgICAgICAgJ0ZvdW5kIGBOb25lYC4nKTtcbiAgICB9XG4gICAgY29uc3QgaW5wdXREaW0gPSBpbnB1dFNoYXBlW2NoYW5uZWxBeGlzXTtcbiAgICBjb25zdCBrZXJuZWxTaGFwZSA9IHRoaXMua2VybmVsU2l6ZS5jb25jYXQoW3RoaXMuZmlsdGVycywgaW5wdXREaW1dKTtcblxuICAgIHRoaXMua2VybmVsID0gdGhpcy5hZGRXZWlnaHQoXG4gICAgICAgICdrZXJuZWwnLCBrZXJuZWxTaGFwZSwgJ2Zsb2F0MzInLCB0aGlzLmtlcm5lbEluaXRpYWxpemVyLFxuICAgICAgICB0aGlzLmtlcm5lbFJlZ3VsYXJpemVyLCB0cnVlLCB0aGlzLmtlcm5lbENvbnN0cmFpbnQpO1xuICAgIGlmICh0aGlzLnVzZUJpYXMpIHtcbiAgICAgIHRoaXMuYmlhcyA9IHRoaXMuYWRkV2VpZ2h0KFxuICAgICAgICAgICdiaWFzJywgW3RoaXMuZmlsdGVyc10sICdmbG9hdDMyJywgdGhpcy5iaWFzSW5pdGlhbGl6ZXIsXG4gICAgICAgICAgdGhpcy5iaWFzUmVndWxhcml6ZXIsIHRydWUsIHRoaXMuYmlhc0NvbnN0cmFpbnQpO1xuICAgIH1cblxuICAgIC8vIFNldCBpbnB1dCBzcGVjLlxuICAgIHRoaXMuaW5wdXRTcGVjID1cbiAgICAgICAgW25ldyBJbnB1dFNwZWMoe25kaW06IDUsIGF4ZXM6IHtbY2hhbm5lbEF4aXNdOiBpbnB1dERpbX19KV07XG4gICAgdGhpcy5idWlsdCA9IHRydWU7XG4gIH1cblxuICBjYWxsKGlucHV0czogVGVuc29yfFRlbnNvcltdLCBrd2FyZ3M6IEt3YXJncyk6IFRlbnNvcnxUZW5zb3JbXSB7XG4gICAgcmV0dXJuIHRmYy50aWR5PHRmYy5UZW5zb3I1RD4oKCkgPT4ge1xuICAgICAgbGV0IGlucHV0ID0gZ2V0RXhhY3RseU9uZVRlbnNvcihpbnB1dHMpO1xuICAgICAgaWYgKGlucHV0LnNoYXBlLmxlbmd0aCAhPT0gNSkge1xuICAgICAgICB0aHJvdyBuZXcgVmFsdWVFcnJvcihcbiAgICAgICAgICAgIGBDb252M0RUcmFuc3Bvc2UuY2FsbCgpIGV4cGVjdHMgaW5wdXQgdGVuc29yIHRvIGJlIHJhbmstNCwgYnV0IGAgK1xuICAgICAgICAgICAgYHJlY2VpdmVkIGEgdGVuc29yIG9mIHJhbmstJHtpbnB1dC5zaGFwZS5sZW5ndGh9YCk7XG4gICAgICB9XG5cbiAgICAgIGNvbnN0IGlucHV0U2hhcGUgPSBpbnB1dC5zaGFwZTtcbiAgICAgIGNvbnN0IGJhdGNoU2l6ZSA9IGlucHV0U2hhcGVbMF07XG5cbiAgICAgIGxldCBoQXhpczogbnVtYmVyO1xuICAgICAgbGV0IHdBeGlzOiBudW1iZXI7XG4gICAgICBsZXQgZEF4aXM6IG51bWJlcjtcblxuICAgICAgaWYgKHRoaXMuZGF0YUZvcm1hdCA9PT0gJ2NoYW5uZWxzRmlyc3QnKSB7XG4gICAgICAgIGRBeGlzID0gMjtcbiAgICAgICAgaEF4aXMgPSAzO1xuICAgICAgICB3QXhpcyA9IDQ7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBkQXhpcyA9IDE7XG4gICAgICAgIGhBeGlzID0gMjtcbiAgICAgICAgd0F4aXMgPSAzO1xuICAgICAgfVxuXG4gICAgICBjb25zdCBkZXB0aCA9IGlucHV0U2hhcGVbZEF4aXNdO1xuICAgICAgY29uc3QgaGVpZ2h0ID0gaW5wdXRTaGFwZVtoQXhpc107XG4gICAgICBjb25zdCB3aWR0aCA9IGlucHV0U2hhcGVbd0F4aXNdO1xuICAgICAgY29uc3Qga2VybmVsRCA9IHRoaXMua2VybmVsU2l6ZVswXTtcbiAgICAgIGNvbnN0IGtlcm5lbEggPSB0aGlzLmtlcm5lbFNpemVbMV07XG4gICAgICBjb25zdCBrZXJuZWxXID0gdGhpcy5rZXJuZWxTaXplWzJdO1xuICAgICAgY29uc3Qgc3RyaWRlRCA9IHRoaXMuc3RyaWRlc1swXTtcbiAgICAgIGNvbnN0IHN0cmlkZUggPSB0aGlzLnN0cmlkZXNbMV07XG4gICAgICBjb25zdCBzdHJpZGVXID0gdGhpcy5zdHJpZGVzWzJdO1xuXG4gICAgICAvLyBJbmZlciB0aGUgZHluYW1pYyBvdXRwdXQgc2hhcGUuXG4gICAgICBjb25zdCBvdXREZXB0aCA9IGRlY29udkxlbmd0aChkZXB0aCwgc3RyaWRlRCwga2VybmVsRCwgdGhpcy5wYWRkaW5nKTtcbiAgICAgIGNvbnN0IG91dEhlaWdodCA9IGRlY29udkxlbmd0aChoZWlnaHQsIHN0cmlkZUgsIGtlcm5lbEgsIHRoaXMucGFkZGluZyk7XG4gICAgICBjb25zdCBvdXRXaWR0aCA9IGRlY29udkxlbmd0aCh3aWR0aCwgc3RyaWRlVywga2VybmVsVywgdGhpcy5wYWRkaW5nKTtcblxuICAgICAgLy8gU2FtZSBhcyBgY29udjJkVHJhbnNwb3NlYC4gV2UgYWx3YXlzIGFzc3VtZXMgY2hhbm5lbHNMYXN0LlxuICAgICAgY29uc3Qgb3V0cHV0U2hhcGU6IFtudW1iZXIsIG51bWJlciwgbnVtYmVyLCBudW1iZXIsIG51bWJlcl0gPVxuICAgICAgICAgIFtiYXRjaFNpemUsIG91dERlcHRoLCBvdXRIZWlnaHQsIG91dFdpZHRoLCB0aGlzLmZpbHRlcnNdO1xuICAgICAgaWYgKHRoaXMuZGF0YUZvcm1hdCAhPT0gJ2NoYW5uZWxzTGFzdCcpIHtcbiAgICAgICAgaW5wdXQgPSB0ZmMudHJhbnNwb3NlKGlucHV0LCBbMCwgMiwgMywgNCwgMV0pO1xuICAgICAgfVxuICAgICAgbGV0IG91dHB1dHMgPSB0ZmMuY29udjNkVHJhbnNwb3NlKFxuICAgICAgICAgIGlucHV0IGFzIFRlbnNvcjVELCB0aGlzLmtlcm5lbC5yZWFkKCkgYXMgVGVuc29yNUQsIG91dHB1dFNoYXBlLFxuICAgICAgICAgIHRoaXMuc3RyaWRlcyBhcyBbbnVtYmVyLCBudW1iZXIsIG51bWJlcl0sXG4gICAgICAgICAgdGhpcy5wYWRkaW5nIGFzICdzYW1lJyB8ICd2YWxpZCcpO1xuICAgICAgaWYgKHRoaXMuZGF0YUZvcm1hdCAhPT0gJ2NoYW5uZWxzTGFzdCcpIHtcbiAgICAgICAgb3V0cHV0cyA9IHRmYy50cmFuc3Bvc2Uob3V0cHV0cywgWzAsIDQsIDEsIDIsIDNdKTtcbiAgICAgIH1cblxuICAgICAgaWYgKHRoaXMuYmlhcyAhPT0gbnVsbCkge1xuICAgICAgICBvdXRwdXRzID1cbiAgICAgICAgICAgIEsuYmlhc0FkZChvdXRwdXRzLCB0aGlzLmJpYXMucmVhZCgpLCB0aGlzLmRhdGFGb3JtYXQpIGFzIFRlbnNvcjVEO1xuICAgICAgfVxuICAgICAgaWYgKHRoaXMuYWN0aXZhdGlvbiAhPT0gbnVsbCkge1xuICAgICAgICBvdXRwdXRzID0gdGhpcy5hY3RpdmF0aW9uLmFwcGx5KG91dHB1dHMpIGFzIFRlbnNvcjVEO1xuICAgICAgfVxuICAgICAgcmV0dXJuIG91dHB1dHM7XG4gICAgfSk7XG4gIH1cblxuICBjb21wdXRlT3V0cHV0U2hhcGUoaW5wdXRTaGFwZTogU2hhcGV8U2hhcGVbXSk6IFNoYXBlfFNoYXBlW10ge1xuICAgIGlucHV0U2hhcGUgPSBnZXRFeGFjdGx5T25lU2hhcGUoaW5wdXRTaGFwZSk7XG4gICAgY29uc3Qgb3V0cHV0U2hhcGUgPSBpbnB1dFNoYXBlLnNsaWNlKCk7XG5cbiAgICBsZXQgY2hhbm5lbEF4aXM6IG51bWJlcjtcbiAgICBsZXQgZGVwdGhBeGlzOiBudW1iZXI7XG4gICAgbGV0IGhlaWdodEF4aXM6IG51bWJlcjtcbiAgICBsZXQgd2lkdGhBeGlzOiBudW1iZXI7XG4gICAgaWYgKHRoaXMuZGF0YUZvcm1hdCA9PT0gJ2NoYW5uZWxzRmlyc3QnKSB7XG4gICAgICBjaGFubmVsQXhpcyA9IDE7XG4gICAgICBkZXB0aEF4aXMgPSAyO1xuICAgICAgaGVpZ2h0QXhpcyA9IDM7XG4gICAgICB3aWR0aEF4aXMgPSA0O1xuICAgIH0gZWxzZSB7XG4gICAgICBjaGFubmVsQXhpcyA9IDQ7XG4gICAgICBkZXB0aEF4aXMgPSAxO1xuICAgICAgaGVpZ2h0QXhpcyA9IDI7XG4gICAgICB3aWR0aEF4aXMgPSAzO1xuICAgIH1cblxuICAgIGNvbnN0IGtlcm5lbEQgPSB0aGlzLmtlcm5lbFNpemVbMF07XG4gICAgY29uc3Qga2VybmVsSCA9IHRoaXMua2VybmVsU2l6ZVsxXTtcbiAgICBjb25zdCBrZXJuZWxXID0gdGhpcy5rZXJuZWxTaXplWzJdO1xuICAgIGNvbnN0IHN0cmlkZUQgPSB0aGlzLnN0cmlkZXNbMF07XG4gICAgY29uc3Qgc3RyaWRlSCA9IHRoaXMuc3RyaWRlc1sxXTtcbiAgICBjb25zdCBzdHJpZGVXID0gdGhpcy5zdHJpZGVzWzJdO1xuXG4gICAgb3V0cHV0U2hhcGVbY2hhbm5lbEF4aXNdID0gdGhpcy5maWx0ZXJzO1xuICAgIG91dHB1dFNoYXBlW2RlcHRoQXhpc10gPVxuICAgICAgICBkZWNvbnZMZW5ndGgob3V0cHV0U2hhcGVbZGVwdGhBeGlzXSwgc3RyaWRlRCwga2VybmVsRCwgdGhpcy5wYWRkaW5nKTtcbiAgICBvdXRwdXRTaGFwZVtoZWlnaHRBeGlzXSA9XG4gICAgICAgIGRlY29udkxlbmd0aChvdXRwdXRTaGFwZVtoZWlnaHRBeGlzXSwgc3RyaWRlSCwga2VybmVsSCwgdGhpcy5wYWRkaW5nKTtcbiAgICBvdXRwdXRTaGFwZVt3aWR0aEF4aXNdID1cbiAgICAgICAgZGVjb252TGVuZ3RoKG91dHB1dFNoYXBlW3dpZHRoQXhpc10sIHN0cmlkZVcsIGtlcm5lbFcsIHRoaXMucGFkZGluZyk7XG4gICAgcmV0dXJuIG91dHB1dFNoYXBlO1xuICB9XG5cbiAgZ2V0Q29uZmlnKCk6IHNlcmlhbGl6YXRpb24uQ29uZmlnRGljdCB7XG4gICAgY29uc3QgY29uZmlnID0gc3VwZXIuZ2V0Q29uZmlnKCk7XG4gICAgZGVsZXRlIGNvbmZpZ1snZGlsYXRpb25SYXRlJ107XG4gICAgcmV0dXJuIGNvbmZpZztcbiAgfVxufVxuc2VyaWFsaXphdGlvbi5yZWdpc3RlckNsYXNzKENvbnYzRFRyYW5zcG9zZSk7XG5cbmV4cG9ydCBkZWNsYXJlIGludGVyZmFjZSBTZXBhcmFibGVDb252TGF5ZXJBcmdzIGV4dGVuZHMgQ29udkxheWVyQXJncyB7XG4gIC8qKlxuICAgKiBUaGUgbnVtYmVyIG9mIGRlcHRod2lzZSBjb252b2x1dGlvbiBvdXRwdXQgY2hhbm5lbHMgZm9yIGVhY2ggaW5wdXRcbiAgICogY2hhbm5lbC5cbiAgICogVGhlIHRvdGFsIG51bWJlciBvZiBkZXB0aHdpc2UgY29udm9sdXRpb24gb3V0cHV0IGNoYW5uZWxzIHdpbGwgYmUgZXF1YWxcbiAgICogdG8gYGZpbHRlcnNJbiAqIGRlcHRoTXVsdGlwbGllcmAuIERlZmF1bHQ6IDEuXG4gICAqL1xuICBkZXB0aE11bHRpcGxpZXI/OiBudW1iZXI7XG5cbiAgLyoqXG4gICAqIEluaXRpYWxpemVyIGZvciB0aGUgZGVwdGh3aXNlIGtlcm5lbCBtYXRyaXguXG4gICAqL1xuICBkZXB0aHdpc2VJbml0aWFsaXplcj86IEluaXRpYWxpemVySWRlbnRpZmllcnxJbml0aWFsaXplcjtcblxuICAvKipcbiAgICogSW5pdGlhbGl6ZXIgZm9yIHRoZSBwb2ludHdpc2Uga2VybmVsIG1hdHJpeC5cbiAgICovXG4gIHBvaW50d2lzZUluaXRpYWxpemVyPzogSW5pdGlhbGl6ZXJJZGVudGlmaWVyfEluaXRpYWxpemVyO1xuXG4gIC8qKlxuICAgKiBSZWd1bGFyaXplciBmdW5jdGlvbiBhcHBsaWVkIHRvIHRoZSBkZXB0aHdpc2Uga2VybmVsIG1hdHJpeC5cbiAgICovXG4gIGRlcHRod2lzZVJlZ3VsYXJpemVyPzogUmVndWxhcml6ZXJJZGVudGlmaWVyfFJlZ3VsYXJpemVyO1xuXG4gIC8qKlxuICAgKiBSZWd1bGFyaXplciBmdW5jdGlvbiBhcHBsaWVkIHRvIHRoZSBwb2ludHdpc2Uga2VybmVsIG1hdHJpeC5cbiAgICovXG4gIHBvaW50d2lzZVJlZ3VsYXJpemVyPzogUmVndWxhcml6ZXJJZGVudGlmaWVyfFJlZ3VsYXJpemVyO1xuXG4gIC8qKlxuICAgKiBDb25zdHJhaW50IGZ1bmN0aW9uIGFwcGxpZWQgdG8gdGhlIGRlcHRod2lzZSBrZXJuZWwgbWF0cml4LlxuICAgKi9cbiAgZGVwdGh3aXNlQ29uc3RyYWludD86IENvbnN0cmFpbnRJZGVudGlmaWVyfENvbnN0cmFpbnQ7XG5cbiAgLyoqXG4gICAqIENvbnN0cmFpbnQgZnVuY3Rpb24gYXBwbGllZCB0byB0aGUgcG9pbnR3aXNlIGtlcm5lbCBtYXRyaXguXG4gICAqL1xuICBwb2ludHdpc2VDb25zdHJhaW50PzogQ29uc3RyYWludElkZW50aWZpZXJ8Q29uc3RyYWludDtcbn1cblxuZXhwb3J0IGNsYXNzIFNlcGFyYWJsZUNvbnYgZXh0ZW5kcyBDb252IHtcbiAgLyoqIEBub2NvbGxhcHNlICovXG4gIHN0YXRpYyBjbGFzc05hbWUgPSAnU2VwYXJhYmxlQ29udic7XG5cbiAgcmVhZG9ubHkgZGVwdGhNdWx0aXBsaWVyOiBudW1iZXI7XG5cbiAgcHJvdGVjdGVkIHJlYWRvbmx5IGRlcHRod2lzZUluaXRpYWxpemVyPzogSW5pdGlhbGl6ZXI7XG4gIHByb3RlY3RlZCByZWFkb25seSBkZXB0aHdpc2VSZWd1bGFyaXplcj86IFJlZ3VsYXJpemVyO1xuICBwcm90ZWN0ZWQgcmVhZG9ubHkgZGVwdGh3aXNlQ29uc3RyYWludD86IENvbnN0cmFpbnQ7XG4gIHByb3RlY3RlZCByZWFkb25seSBwb2ludHdpc2VJbml0aWFsaXplcj86IEluaXRpYWxpemVyO1xuICBwcm90ZWN0ZWQgcmVhZG9ubHkgcG9pbnR3aXNlUmVndWxhcml6ZXI/OiBSZWd1bGFyaXplcjtcbiAgcHJvdGVjdGVkIHJlYWRvbmx5IHBvaW50d2lzZUNvbnN0cmFpbnQ/OiBDb25zdHJhaW50O1xuXG4gIHJlYWRvbmx5IERFRkFVTFRfREVQVEhXSVNFX0lOSVRJQUxJWkVSOiBJbml0aWFsaXplcklkZW50aWZpZXIgPVxuICAgICAgJ2dsb3JvdFVuaWZvcm0nO1xuICByZWFkb25seSBERUZBVUxUX1BPSU5UV0lTRV9JTklUSUFMSVpFUjogSW5pdGlhbGl6ZXJJZGVudGlmaWVyID1cbiAgICAgICdnbG9yb3RVbmlmb3JtJztcblxuICBwcm90ZWN0ZWQgZGVwdGh3aXNlS2VybmVsOiBMYXllclZhcmlhYmxlID0gbnVsbDtcbiAgcHJvdGVjdGVkIHBvaW50d2lzZUtlcm5lbDogTGF5ZXJWYXJpYWJsZSA9IG51bGw7XG5cbiAgY29uc3RydWN0b3IocmFuazogbnVtYmVyLCBjb25maWc/OiBTZXBhcmFibGVDb252TGF5ZXJBcmdzKSB7XG4gICAgc3VwZXIocmFuaywgY29uZmlnKTtcblxuICAgIGlmIChjb25maWcuZmlsdGVycyA9PSBudWxsKSB7XG4gICAgICB0aHJvdyBuZXcgVmFsdWVFcnJvcihcbiAgICAgICAgICAnVGhlIGBmaWx0ZXJzYCBjb25maWd1cmF0aW9uIGZpZWxkIGlzIHJlcXVpcmVkIGJ5IFNlcGFyYWJsZUNvbnYsICcgK1xuICAgICAgICAgICdidXQgaXMgdW5zcGVjaWZpZWQuJyk7XG4gICAgfVxuICAgIGlmIChjb25maWcua2VybmVsSW5pdGlhbGl6ZXIgIT0gbnVsbCB8fCBjb25maWcua2VybmVsUmVndWxhcml6ZXIgIT0gbnVsbCB8fFxuICAgICAgICBjb25maWcua2VybmVsQ29uc3RyYWludCAhPSBudWxsKSB7XG4gICAgICB0aHJvdyBuZXcgVmFsdWVFcnJvcihcbiAgICAgICAgICAnRmllbGRzIGtlcm5lbEluaXRpYWxpemVyLCBrZXJuZWxSZWd1bGFyaXplciBhbmQga2VybmVsQ29uc3RyYWludCAnICtcbiAgICAgICAgICAnYXJlIGludmFsaWQgZm9yIFNlcGFyYWJsZUNvbnYyRC4gVXNlIGRlcHRod2lzZUluaXRpYWxpemVyLCAnICtcbiAgICAgICAgICAnZGVwdGh3aXNlUmVndWxhcml6ZXIsIGRlcHRod2lzZUNvbnN0cmFpbnQsIHBvaW50d2lzZUluaXRpYWxpemVyLCAnICtcbiAgICAgICAgICAncG9pbnR3aXNlUmVndWxhcml6ZXIgYW5kIHBvaW50d2lzZUNvbnN0cmFpbnQgaW5zdGVhZC4nKTtcbiAgICB9XG4gICAgaWYgKGNvbmZpZy5wYWRkaW5nICE9IG51bGwgJiYgY29uZmlnLnBhZGRpbmcgIT09ICdzYW1lJyAmJlxuICAgICAgICBjb25maWcucGFkZGluZyAhPT0gJ3ZhbGlkJykge1xuICAgICAgdGhyb3cgbmV3IFZhbHVlRXJyb3IoXG4gICAgICAgICAgYFNlcGFyYWJsZUNvbnYke3RoaXMucmFua31EIHN1cHBvcnRzIG9ubHkgcGFkZGluZyBtb2RlczogYCArXG4gICAgICAgICAgYCdzYW1lJyBhbmQgJ3ZhbGlkJywgYnV0IHJlY2VpdmVkICR7SlNPTi5zdHJpbmdpZnkoY29uZmlnLnBhZGRpbmcpfWApO1xuICAgIH1cblxuICAgIHRoaXMuZGVwdGhNdWx0aXBsaWVyID1cbiAgICAgICAgY29uZmlnLmRlcHRoTXVsdGlwbGllciA9PSBudWxsID8gMSA6IGNvbmZpZy5kZXB0aE11bHRpcGxpZXI7XG4gICAgdGhpcy5kZXB0aHdpc2VJbml0aWFsaXplciA9IGdldEluaXRpYWxpemVyKFxuICAgICAgICBjb25maWcuZGVwdGh3aXNlSW5pdGlhbGl6ZXIgfHwgdGhpcy5ERUZBVUxUX0RFUFRIV0lTRV9JTklUSUFMSVpFUik7XG4gICAgdGhpcy5kZXB0aHdpc2VSZWd1bGFyaXplciA9IGdldFJlZ3VsYXJpemVyKGNvbmZpZy5kZXB0aHdpc2VSZWd1bGFyaXplcik7XG4gICAgdGhpcy5kZXB0aHdpc2VDb25zdHJhaW50ID0gZ2V0Q29uc3RyYWludChjb25maWcuZGVwdGh3aXNlQ29uc3RyYWludCk7XG4gICAgdGhpcy5wb2ludHdpc2VJbml0aWFsaXplciA9IGdldEluaXRpYWxpemVyKFxuICAgICAgICBjb25maWcuZGVwdGh3aXNlSW5pdGlhbGl6ZXIgfHwgdGhpcy5ERUZBVUxUX1BPSU5UV0lTRV9JTklUSUFMSVpFUik7XG4gICAgdGhpcy5wb2ludHdpc2VSZWd1bGFyaXplciA9IGdldFJlZ3VsYXJpemVyKGNvbmZpZy5wb2ludHdpc2VSZWd1bGFyaXplcik7XG4gICAgdGhpcy5wb2ludHdpc2VDb25zdHJhaW50ID0gZ2V0Q29uc3RyYWludChjb25maWcucG9pbnR3aXNlQ29uc3RyYWludCk7XG4gIH1cblxuICBidWlsZChpbnB1dFNoYXBlOiBTaGFwZXxTaGFwZVtdKTogdm9pZCB7XG4gICAgaW5wdXRTaGFwZSA9IGdldEV4YWN0bHlPbmVTaGFwZShpbnB1dFNoYXBlKTtcbiAgICBpZiAoaW5wdXRTaGFwZS5sZW5ndGggPCB0aGlzLnJhbmsgKyAyKSB7XG4gICAgICB0aHJvdyBuZXcgVmFsdWVFcnJvcihcbiAgICAgICAgICBgSW5wdXRzIHRvIFNlcGFyYWJsZUNvbnYke3RoaXMucmFua31EIHNob3VsZCBoYXZlIHJhbmsgYCArXG4gICAgICAgICAgYCR7dGhpcy5yYW5rICsgMn0sIGJ1dCByZWNlaXZlZCBpbnB1dCBzaGFwZTogYCArXG4gICAgICAgICAgYCR7SlNPTi5zdHJpbmdpZnkoaW5wdXRTaGFwZSl9YCk7XG4gICAgfVxuICAgIGNvbnN0IGNoYW5uZWxBeGlzID1cbiAgICAgICAgdGhpcy5kYXRhRm9ybWF0ID09PSAnY2hhbm5lbHNGaXJzdCcgPyAxIDogaW5wdXRTaGFwZS5sZW5ndGggLSAxO1xuICAgIGlmIChpbnB1dFNoYXBlW2NoYW5uZWxBeGlzXSA9PSBudWxsIHx8IGlucHV0U2hhcGVbY2hhbm5lbEF4aXNdIDwgMCkge1xuICAgICAgdGhyb3cgbmV3IFZhbHVlRXJyb3IoXG4gICAgICAgICAgYFRoZSBjaGFubmVsIGRpbWVuc2lvbiBvZiB0aGUgaW5wdXRzIHNob3VsZCBiZSBkZWZpbmVkLCBgICtcbiAgICAgICAgICBgYnV0IGZvdW5kICR7SlNPTi5zdHJpbmdpZnkoaW5wdXRTaGFwZVtjaGFubmVsQXhpc10pfWApO1xuICAgIH1cblxuICAgIGNvbnN0IGlucHV0RGltID0gaW5wdXRTaGFwZVtjaGFubmVsQXhpc107XG4gICAgY29uc3QgZGVwdGh3aXNlS2VybmVsU2hhcGUgPVxuICAgICAgICB0aGlzLmtlcm5lbFNpemUuY29uY2F0KFtpbnB1dERpbSwgdGhpcy5kZXB0aE11bHRpcGxpZXJdKTtcbiAgICBjb25zdCBwb2ludHdpc2VLZXJuZWxTaGFwZSA9IFtdO1xuICAgIGZvciAobGV0IGkgPSAwOyBpIDwgdGhpcy5yYW5rOyArK2kpIHtcbiAgICAgIHBvaW50d2lzZUtlcm5lbFNoYXBlLnB1c2goMSk7XG4gICAgfVxuICAgIHBvaW50d2lzZUtlcm5lbFNoYXBlLnB1c2goaW5wdXREaW0gKiB0aGlzLmRlcHRoTXVsdGlwbGllciwgdGhpcy5maWx0ZXJzKTtcblxuICAgIGNvbnN0IHRyYWluYWJsZSA9IHRydWU7XG4gICAgdGhpcy5kZXB0aHdpc2VLZXJuZWwgPSB0aGlzLmFkZFdlaWdodChcbiAgICAgICAgJ2RlcHRod2lzZV9rZXJuZWwnLCBkZXB0aHdpc2VLZXJuZWxTaGFwZSwgJ2Zsb2F0MzInLFxuICAgICAgICB0aGlzLmRlcHRod2lzZUluaXRpYWxpemVyLCB0aGlzLmRlcHRod2lzZVJlZ3VsYXJpemVyLCB0cmFpbmFibGUsXG4gICAgICAgIHRoaXMuZGVwdGh3aXNlQ29uc3RyYWludCk7XG4gICAgdGhpcy5wb2ludHdpc2VLZXJuZWwgPSB0aGlzLmFkZFdlaWdodChcbiAgICAgICAgJ3BvaW50d2lzZV9rZXJuZWwnLCBwb2ludHdpc2VLZXJuZWxTaGFwZSwgJ2Zsb2F0MzInLFxuICAgICAgICB0aGlzLnBvaW50d2lzZUluaXRpYWxpemVyLCB0aGlzLnBvaW50d2lzZVJlZ3VsYXJpemVyLCB0cmFpbmFibGUsXG4gICAgICAgIHRoaXMucG9pbnR3aXNlQ29uc3RyYWludCk7XG4gICAgaWYgKHRoaXMudXNlQmlhcykge1xuICAgICAgdGhpcy5iaWFzID0gdGhpcy5hZGRXZWlnaHQoXG4gICAgICAgICAgJ2JpYXMnLCBbdGhpcy5maWx0ZXJzXSwgJ2Zsb2F0MzInLCB0aGlzLmJpYXNJbml0aWFsaXplcixcbiAgICAgICAgICB0aGlzLmJpYXNSZWd1bGFyaXplciwgdHJhaW5hYmxlLCB0aGlzLmJpYXNDb25zdHJhaW50KTtcbiAgICB9IGVsc2Uge1xuICAgICAgdGhpcy5iaWFzID0gbnVsbDtcbiAgICB9XG5cbiAgICB0aGlzLmlucHV0U3BlYyA9XG4gICAgICAgIFtuZXcgSW5wdXRTcGVjKHtuZGltOiB0aGlzLnJhbmsgKyAyLCBheGVzOiB7W2NoYW5uZWxBeGlzXTogaW5wdXREaW19fSldO1xuICAgIHRoaXMuYnVpbHQgPSB0cnVlO1xuICB9XG5cbiAgY2FsbChpbnB1dHM6IFRlbnNvcnxUZW5zb3JbXSwga3dhcmdzOiBLd2FyZ3MpOiBUZW5zb3J8VGVuc29yW10ge1xuICAgIHJldHVybiB0aWR5KCgpID0+IHtcbiAgICAgIGlucHV0cyA9IGdldEV4YWN0bHlPbmVUZW5zb3IoaW5wdXRzKTtcblxuICAgICAgbGV0IG91dHB1dDogVGVuc29yO1xuICAgICAgaWYgKHRoaXMucmFuayA9PT0gMSkge1xuICAgICAgICB0aHJvdyBuZXcgTm90SW1wbGVtZW50ZWRFcnJvcihcbiAgICAgICAgICAgICcxRCBzZXBhcmFibGUgY29udm9sdXRpb24gaXMgbm90IGltcGxlbWVudGVkIHlldC4nKTtcbiAgICAgIH0gZWxzZSBpZiAodGhpcy5yYW5rID09PSAyKSB7XG4gICAgICAgIGlmICh0aGlzLmRhdGFGb3JtYXQgPT09ICdjaGFubmVsc0ZpcnN0Jykge1xuICAgICAgICAgIGlucHV0cyA9IHRmYy50cmFuc3Bvc2UoaW5wdXRzLCBbMCwgMiwgMywgMV0pOyAgLy8gTkNIVyAtPiBOSFdDLlxuICAgICAgICB9XG5cbiAgICAgICAgb3V0cHV0ID0gdGZjLnNlcGFyYWJsZUNvbnYyZChcbiAgICAgICAgICAgIGlucHV0cyBhcyBUZW5zb3I0RCwgdGhpcy5kZXB0aHdpc2VLZXJuZWwucmVhZCgpIGFzIFRlbnNvcjRELFxuICAgICAgICAgICAgdGhpcy5wb2ludHdpc2VLZXJuZWwucmVhZCgpIGFzIFRlbnNvcjRELFxuICAgICAgICAgICAgdGhpcy5zdHJpZGVzIGFzIFtudW1iZXIsIG51bWJlcl0sIHRoaXMucGFkZGluZyBhcyAnc2FtZScgfCAndmFsaWQnLFxuICAgICAgICAgICAgdGhpcy5kaWxhdGlvblJhdGUgYXMgW251bWJlciwgbnVtYmVyXSwgJ05IV0MnKTtcbiAgICAgIH1cblxuICAgICAgaWYgKHRoaXMudXNlQmlhcykge1xuICAgICAgICBvdXRwdXQgPSBLLmJpYXNBZGQob3V0cHV0LCB0aGlzLmJpYXMucmVhZCgpLCB0aGlzLmRhdGFGb3JtYXQpO1xuICAgICAgfVxuICAgICAgaWYgKHRoaXMuYWN0aXZhdGlvbiAhPSBudWxsKSB7XG4gICAgICAgIG91dHB1dCA9IHRoaXMuYWN0aXZhdGlvbi5hcHBseShvdXRwdXQpO1xuICAgICAgfVxuXG4gICAgICBpZiAodGhpcy5kYXRhRm9ybWF0ID09PSAnY2hhbm5lbHNGaXJzdCcpIHtcbiAgICAgICAgb3V0cHV0ID0gdGZjLnRyYW5zcG9zZShvdXRwdXQsIFswLCAzLCAxLCAyXSk7ICAvLyBOSFdDIC0+IE5DSFcuXG4gICAgICB9XG4gICAgICByZXR1cm4gb3V0cHV0O1xuICAgIH0pO1xuICB9XG5cbiAgZ2V0Q29uZmlnKCk6IHNlcmlhbGl6YXRpb24uQ29uZmlnRGljdCB7XG4gICAgY29uc3QgY29uZmlnID0gc3VwZXIuZ2V0Q29uZmlnKCk7XG4gICAgZGVsZXRlIGNvbmZpZ1sncmFuayddO1xuICAgIGRlbGV0ZSBjb25maWdbJ2tlcm5lbEluaXRpYWxpemVyJ107XG4gICAgZGVsZXRlIGNvbmZpZ1sna2VybmVsUmVndWxhcml6ZXInXTtcbiAgICBkZWxldGUgY29uZmlnWydrZXJuZWxDb25zdHJhaW50J107XG4gICAgY29uZmlnWydkZXB0aHdpc2VJbml0aWFsaXplciddID1cbiAgICAgICAgc2VyaWFsaXplSW5pdGlhbGl6ZXIodGhpcy5kZXB0aHdpc2VJbml0aWFsaXplcik7XG4gICAgY29uZmlnWydwb2ludHdpc2VJbml0aWFsaXplciddID1cbiAgICAgICAgc2VyaWFsaXplSW5pdGlhbGl6ZXIodGhpcy5wb2ludHdpc2VJbml0aWFsaXplcik7XG4gICAgY29uZmlnWydkZXB0aHdpc2VSZWd1bGFyaXplciddID1cbiAgICAgICAgc2VyaWFsaXplUmVndWxhcml6ZXIodGhpcy5kZXB0aHdpc2VSZWd1bGFyaXplcik7XG4gICAgY29uZmlnWydwb2ludHdpc2VSZWd1bGFyaXplciddID1cbiAgICAgICAgc2VyaWFsaXplUmVndWxhcml6ZXIodGhpcy5wb2ludHdpc2VSZWd1bGFyaXplcik7XG4gICAgY29uZmlnWydkZXB0aHdpc2VDb25zdHJhaW50J10gPVxuICAgICAgICBzZXJpYWxpemVDb25zdHJhaW50KHRoaXMuZGVwdGh3aXNlQ29uc3RyYWludCk7XG4gICAgY29uZmlnWydwb2ludHdpc2VDb25zdHJhaW50J10gPVxuICAgICAgICBzZXJpYWxpemVDb25zdHJhaW50KHRoaXMucG9pbnR3aXNlQ29uc3RyYWludCk7XG4gICAgcmV0dXJuIGNvbmZpZztcbiAgfVxufVxuXG5leHBvcnQgY2xhc3MgU2VwYXJhYmxlQ29udjJEIGV4dGVuZHMgU2VwYXJhYmxlQ29udiB7XG4gIC8qKiBAbm9jb2xsYXBzZSAqL1xuICBzdGF0aWMgY2xhc3NOYW1lID0gJ1NlcGFyYWJsZUNvbnYyRCc7XG4gIGNvbnN0cnVjdG9yKGFyZ3M/OiBTZXBhcmFibGVDb252TGF5ZXJBcmdzKSB7XG4gICAgc3VwZXIoMiwgYXJncyk7XG4gIH1cbn1cbnNlcmlhbGl6YXRpb24ucmVnaXN0ZXJDbGFzcyhTZXBhcmFibGVDb252MkQpO1xuXG5leHBvcnQgY2xhc3MgQ29udjFEIGV4dGVuZHMgQ29udiB7XG4gIC8qKiBAbm9jb2xsYXBzZSAqL1xuICBzdGF0aWMgY2xhc3NOYW1lID0gJ0NvbnYxRCc7XG4gIGNvbnN0cnVjdG9yKGFyZ3M6IENvbnZMYXllckFyZ3MpIHtcbiAgICBzdXBlcigxLCBhcmdzKTtcbiAgICBDb252MUQudmVyaWZ5QXJncyhhcmdzKTtcbiAgICB0aGlzLmlucHV0U3BlYyA9IFt7bmRpbTogM31dO1xuICB9XG5cbiAgZ2V0Q29uZmlnKCk6IHNlcmlhbGl6YXRpb24uQ29uZmlnRGljdCB7XG4gICAgY29uc3QgY29uZmlnID0gc3VwZXIuZ2V0Q29uZmlnKCk7XG4gICAgZGVsZXRlIGNvbmZpZ1sncmFuayddO1xuICAgIGRlbGV0ZSBjb25maWdbJ2RhdGFGb3JtYXQnXTtcbiAgICByZXR1cm4gY29uZmlnO1xuICB9XG5cbiAgcHJvdGVjdGVkIHN0YXRpYyB2ZXJpZnlBcmdzKGFyZ3M6IENvbnZMYXllckFyZ3MpIHtcbiAgICAvLyBjb25maWcua2VybmVsU2l6ZSBtdXN0IGJlIGEgbnVtYmVyIG9yIGFycmF5IG9mIG51bWJlcnMuXG4gICAgaWYgKHR5cGVvZiBhcmdzLmtlcm5lbFNpemUgIT09ICdudW1iZXInICYmXG4gICAgICAgICFnZW5lcmljX3V0aWxzLmNoZWNrQXJyYXlUeXBlQW5kTGVuZ3RoKFxuICAgICAgICAgICAgYXJncy5rZXJuZWxTaXplLCAnbnVtYmVyJywgMSwgMSkpIHtcbiAgICAgIHRocm93IG5ldyBWYWx1ZUVycm9yKFxuICAgICAgICAgIGBDb252MUQgZXhwZWN0cyBjb25maWcua2VybmVsU2l6ZSB0byBiZSBudW1iZXIgb3IgbnVtYmVyW10gd2l0aCBgICtcbiAgICAgICAgICBgbGVuZ3RoIDEsIGJ1dCByZWNlaXZlZCAke0pTT04uc3RyaW5naWZ5KGFyZ3Mua2VybmVsU2l6ZSl9LmApO1xuICAgIH1cbiAgfVxufVxuc2VyaWFsaXphdGlvbi5yZWdpc3RlckNsYXNzKENvbnYxRCk7XG5cbmV4cG9ydCBkZWNsYXJlIGludGVyZmFjZSBDcm9wcGluZzJETGF5ZXJBcmdzIGV4dGVuZHMgTGF5ZXJBcmdzIHtcbiAgLyoqXG4gICAqIERpbWVuc2lvbiBvZiB0aGUgY3JvcHBpbmcgYWxvbmcgdGhlIHdpZHRoIGFuZCB0aGUgaGVpZ2h0LlxuICAgKiAtIElmIGludGVnZXI6IHRoZSBzYW1lIHN5bW1ldHJpYyBjcm9wcGluZ1xuICAgKiAgaXMgYXBwbGllZCB0byB3aWR0aCBhbmQgaGVpZ2h0LlxuICAgKiAtIElmIGxpc3Qgb2YgMiBpbnRlZ2VyczpcbiAgICogICBpbnRlcnByZXRlZCBhcyB0d28gZGlmZmVyZW50XG4gICAqICAgc3ltbWV0cmljIGNyb3BwaW5nIHZhbHVlcyBmb3IgaGVpZ2h0IGFuZCB3aWR0aDpcbiAgICogICBgW3N5bW1ldHJpY19oZWlnaHRfY3JvcCwgc3ltbWV0cmljX3dpZHRoX2Nyb3BdYC5cbiAgICogLSBJZiBhIGxpc3Qgb2YgMiBsaXN0cyBvZiAyIGludGVnZXJzOlxuICAgKiAgIGludGVycHJldGVkIGFzXG4gICAqICAgYFtbdG9wX2Nyb3AsIGJvdHRvbV9jcm9wXSwgW2xlZnRfY3JvcCwgcmlnaHRfY3JvcF1dYFxuICAgKi9cbiAgY3JvcHBpbmc6IG51bWJlcnxbbnVtYmVyLCBudW1iZXJdfFtbbnVtYmVyLCBudW1iZXJdLCBbbnVtYmVyLCBudW1iZXJdXTtcblxuICAvKipcbiAgICogRm9ybWF0IG9mIHRoZSBkYXRhLCB3aGljaCBkZXRlcm1pbmVzIHRoZSBvcmRlcmluZyBvZiB0aGUgZGltZW5zaW9ucyBpblxuICAgKiB0aGUgaW5wdXRzLlxuICAgKlxuICAgKiBgY2hhbm5lbHNfbGFzdGAgY29ycmVzcG9uZHMgdG8gaW5wdXRzIHdpdGggc2hhcGVcbiAgICogICBgKGJhdGNoLCAuLi4sIGNoYW5uZWxzKWBcbiAgICpcbiAgICogYGNoYW5uZWxzX2ZpcnN0YCBjb3JyZXNwb25kcyB0byBpbnB1dHMgd2l0aCBzaGFwZVxuICAgKiAgIGAoYmF0Y2gsIGNoYW5uZWxzLCAuLi4pYFxuICAgKlxuICAgKiBEZWZhdWx0cyB0byBgY2hhbm5lbHNfbGFzdGAuXG4gICAqL1xuICBkYXRhRm9ybWF0PzogRGF0YUZvcm1hdDtcbn1cblxuZXhwb3J0IGNsYXNzIENyb3BwaW5nMkQgZXh0ZW5kcyBMYXllciB7XG4gIC8qKiBAbm9jb2xsYXBzZSAqL1xuICBzdGF0aWMgY2xhc3NOYW1lID0gJ0Nyb3BwaW5nMkQnO1xuICBwcm90ZWN0ZWQgcmVhZG9ubHkgY3JvcHBpbmc6IFtbbnVtYmVyLCBudW1iZXJdLCBbbnVtYmVyLCBudW1iZXJdXTtcbiAgcHJvdGVjdGVkIHJlYWRvbmx5IGRhdGFGb3JtYXQ6IERhdGFGb3JtYXQ7XG5cbiAgY29uc3RydWN0b3IoYXJnczogQ3JvcHBpbmcyRExheWVyQXJncykge1xuICAgIHN1cGVyKGFyZ3MpO1xuICAgIGlmICh0eXBlb2YgYXJncy5jcm9wcGluZyA9PT0gJ251bWJlcicpIHtcbiAgICAgIHRoaXMuY3JvcHBpbmcgPVxuICAgICAgICAgIFtbYXJncy5jcm9wcGluZywgYXJncy5jcm9wcGluZ10sIFthcmdzLmNyb3BwaW5nLCBhcmdzLmNyb3BwaW5nXV07XG4gICAgfSBlbHNlIGlmICh0eXBlb2YgYXJncy5jcm9wcGluZ1swXSA9PT0gJ251bWJlcicpIHtcbiAgICAgIHRoaXMuY3JvcHBpbmcgPSBbXG4gICAgICAgIFthcmdzLmNyb3BwaW5nWzBdLCBhcmdzLmNyb3BwaW5nWzBdXSxcbiAgICAgICAgW2FyZ3MuY3JvcHBpbmdbMV0gYXMgbnVtYmVyLCBhcmdzLmNyb3BwaW5nWzFdIGFzIG51bWJlcl1cbiAgICAgIF07XG4gICAgfSBlbHNlIHtcbiAgICAgIHRoaXMuY3JvcHBpbmcgPSBhcmdzLmNyb3BwaW5nIGFzIFtbbnVtYmVyLCBudW1iZXJdLCBbbnVtYmVyLCBudW1iZXJdXTtcbiAgICB9XG4gICAgdGhpcy5kYXRhRm9ybWF0ID1cbiAgICAgICAgYXJncy5kYXRhRm9ybWF0ID09PSB1bmRlZmluZWQgPyAnY2hhbm5lbHNMYXN0JyA6IGFyZ3MuZGF0YUZvcm1hdDtcbiAgICB0aGlzLmlucHV0U3BlYyA9IFt7bmRpbTogNH1dO1xuICB9XG5cbiAgY29tcHV0ZU91dHB1dFNoYXBlKGlucHV0U2hhcGU6IFNoYXBlKTogU2hhcGUge1xuICAgIGlmICh0aGlzLmRhdGFGb3JtYXQgPT09ICdjaGFubmVsc0ZpcnN0Jykge1xuICAgICAgcmV0dXJuIFtcbiAgICAgICAgaW5wdXRTaGFwZVswXSwgaW5wdXRTaGFwZVsxXSxcbiAgICAgICAgaW5wdXRTaGFwZVsyXSAtIHRoaXMuY3JvcHBpbmdbMF1bMF0gLSB0aGlzLmNyb3BwaW5nWzBdWzFdLFxuICAgICAgICBpbnB1dFNoYXBlWzNdIC0gdGhpcy5jcm9wcGluZ1sxXVswXSAtIHRoaXMuY3JvcHBpbmdbMV1bMV1cbiAgICAgIF07XG4gICAgfSBlbHNlIHtcbiAgICAgIHJldHVybiBbXG4gICAgICAgIGlucHV0U2hhcGVbMF0sXG4gICAgICAgIGlucHV0U2hhcGVbMV0gLSB0aGlzLmNyb3BwaW5nWzBdWzBdIC0gdGhpcy5jcm9wcGluZ1swXVsxXSxcbiAgICAgICAgaW5wdXRTaGFwZVsyXSAtIHRoaXMuY3JvcHBpbmdbMV1bMF0gLSB0aGlzLmNyb3BwaW5nWzFdWzFdLCBpbnB1dFNoYXBlWzNdXG4gICAgICBdO1xuICAgIH1cbiAgfVxuXG4gIGNhbGwoaW5wdXRzOiBUZW5zb3J8VGVuc29yW10sIGt3YXJnczogS3dhcmdzKTogVGVuc29yfFRlbnNvcltdIHtcbiAgICByZXR1cm4gdGlkeSgoKSA9PiB7XG4gICAgICBpbnB1dHMgPSBnZXRFeGFjdGx5T25lVGVuc29yKGlucHV0cyk7XG5cbiAgICAgIGlmICh0aGlzLmRhdGFGb3JtYXQgPT09ICdjaGFubmVsc0xhc3QnKSB7XG4gICAgICAgIGNvbnN0IGhTbGljZWQgPSBLLnNsaWNlQWxvbmdBeGlzKFxuICAgICAgICAgICAgaW5wdXRzLCB0aGlzLmNyb3BwaW5nWzBdWzBdLFxuICAgICAgICAgICAgaW5wdXRzLnNoYXBlWzFdIC0gdGhpcy5jcm9wcGluZ1swXVswXSAtIHRoaXMuY3JvcHBpbmdbMF1bMV0sIDIpO1xuICAgICAgICByZXR1cm4gSy5zbGljZUFsb25nQXhpcyhcbiAgICAgICAgICAgIGhTbGljZWQsIHRoaXMuY3JvcHBpbmdbMV1bMF0sXG4gICAgICAgICAgICBpbnB1dHMuc2hhcGVbMl0gLSB0aGlzLmNyb3BwaW5nWzFdWzFdIC0gdGhpcy5jcm9wcGluZ1sxXVswXSwgMyk7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBjb25zdCBoU2xpY2VkID0gSy5zbGljZUFsb25nQXhpcyhcbiAgICAgICAgICAgIGlucHV0cywgdGhpcy5jcm9wcGluZ1swXVswXSxcbiAgICAgICAgICAgIGlucHV0cy5zaGFwZVsyXSAtIHRoaXMuY3JvcHBpbmdbMF1bMF0gLSB0aGlzLmNyb3BwaW5nWzBdWzFdLCAzKTtcbiAgICAgICAgcmV0dXJuIEsuc2xpY2VBbG9uZ0F4aXMoXG4gICAgICAgICAgICBoU2xpY2VkLCB0aGlzLmNyb3BwaW5nWzFdWzBdLFxuICAgICAgICAgICAgaW5wdXRzLnNoYXBlWzNdIC0gdGhpcy5jcm9wcGluZ1sxXVsxXSAtIHRoaXMuY3JvcHBpbmdbMV1bMF0sIDQpO1xuICAgICAgfVxuICAgIH0pO1xuICB9XG5cbiAgZ2V0Q29uZmlnKCk6IHNlcmlhbGl6YXRpb24uQ29uZmlnRGljdCB7XG4gICAgY29uc3QgY29uZmlnID0ge2Nyb3BwaW5nOiB0aGlzLmNyb3BwaW5nLCBkYXRhRm9ybWF0OiB0aGlzLmRhdGFGb3JtYXR9O1xuICAgIGNvbnN0IGJhc2VDb25maWcgPSBzdXBlci5nZXRDb25maWcoKTtcbiAgICBPYmplY3QuYXNzaWduKGNvbmZpZywgYmFzZUNvbmZpZyk7XG4gICAgcmV0dXJuIGNvbmZpZztcbiAgfVxufVxuc2VyaWFsaXphdGlvbi5yZWdpc3RlckNsYXNzKENyb3BwaW5nMkQpO1xuXG5leHBvcnQgZGVjbGFyZSBpbnRlcmZhY2UgVXBTYW1wbGluZzJETGF5ZXJBcmdzIGV4dGVuZHMgTGF5ZXJBcmdzIHtcbiAgLyoqXG4gICAqIFRoZSB1cHNhbXBsaW5nIGZhY3RvcnMgZm9yIHJvd3MgYW5kIGNvbHVtbnMuXG4gICAqXG4gICAqIERlZmF1bHRzIHRvIGBbMiwgMl1gLlxuICAgKi9cbiAgc2l6ZT86IG51bWJlcltdO1xuICAvKipcbiAgICogRm9ybWF0IG9mIHRoZSBkYXRhLCB3aGljaCBkZXRlcm1pbmVzIHRoZSBvcmRlcmluZyBvZiB0aGUgZGltZW5zaW9ucyBpblxuICAgKiB0aGUgaW5wdXRzLlxuICAgKlxuICAgKiBgXCJjaGFubmVsc0xhc3RcImAgY29ycmVzcG9uZHMgdG8gaW5wdXRzIHdpdGggc2hhcGVcbiAgICogICBgW2JhdGNoLCAuLi4sIGNoYW5uZWxzXWBcbiAgICpcbiAgICogIGBcImNoYW5uZWxzRmlyc3RcImAgY29ycmVzcG9uZHMgdG8gaW5wdXRzIHdpdGggc2hhcGUgYFtiYXRjaCwgY2hhbm5lbHMsXG4gICAqIC4uLl1gLlxuICAgKlxuICAgKiBEZWZhdWx0cyB0byBgXCJjaGFubmVsc0xhc3RcImAuXG4gICAqL1xuICBkYXRhRm9ybWF0PzogRGF0YUZvcm1hdDtcbiAgLyoqXG4gICAqIFRoZSBpbnRlcnBvbGF0aW9uIG1lY2hhbmlzbSwgb25lIG9mIGBcIm5lYXJlc3RcImAgb3IgYFwiYmlsaW5lYXJcImAsIGRlZmF1bHRcbiAgICogdG8gYFwibmVhcmVzdFwiYC5cbiAgICovXG4gIGludGVycG9sYXRpb24/OiBJbnRlcnBvbGF0aW9uRm9ybWF0O1xufVxuXG5leHBvcnQgY2xhc3MgVXBTYW1wbGluZzJEIGV4dGVuZHMgTGF5ZXIge1xuICAvKiogQG5vY29sbGFwc2UgKi9cbiAgc3RhdGljIGNsYXNzTmFtZSA9ICdVcFNhbXBsaW5nMkQnO1xuICBwcm90ZWN0ZWQgcmVhZG9ubHkgREVGQVVMVF9TSVpFID0gWzIsIDJdO1xuICBwcm90ZWN0ZWQgcmVhZG9ubHkgc2l6ZTogbnVtYmVyW107XG4gIHByb3RlY3RlZCByZWFkb25seSBkYXRhRm9ybWF0OiBEYXRhRm9ybWF0O1xuICBwcm90ZWN0ZWQgcmVhZG9ubHkgaW50ZXJwb2xhdGlvbjogSW50ZXJwb2xhdGlvbkZvcm1hdDtcblxuICBjb25zdHJ1Y3RvcihhcmdzOiBVcFNhbXBsaW5nMkRMYXllckFyZ3MpIHtcbiAgICBzdXBlcihhcmdzKTtcbiAgICB0aGlzLmlucHV0U3BlYyA9IFt7bmRpbTogNH1dO1xuICAgIHRoaXMuc2l6ZSA9IGFyZ3Muc2l6ZSA9PSBudWxsID8gdGhpcy5ERUZBVUxUX1NJWkUgOiBhcmdzLnNpemU7XG4gICAgdGhpcy5kYXRhRm9ybWF0ID1cbiAgICAgICAgYXJncy5kYXRhRm9ybWF0ID09IG51bGwgPyAnY2hhbm5lbHNMYXN0JyA6IGFyZ3MuZGF0YUZvcm1hdDtcbiAgICBjaGVja0RhdGFGb3JtYXQodGhpcy5kYXRhRm9ybWF0KTtcbiAgICB0aGlzLmludGVycG9sYXRpb24gPVxuICAgICAgICBhcmdzLmludGVycG9sYXRpb24gPT0gbnVsbCA/ICduZWFyZXN0JyA6IGFyZ3MuaW50ZXJwb2xhdGlvbjtcbiAgICBjaGVja0ludGVycG9sYXRpb25Gb3JtYXQodGhpcy5pbnRlcnBvbGF0aW9uKTtcbiAgfVxuXG4gIGNvbXB1dGVPdXRwdXRTaGFwZShpbnB1dFNoYXBlOiBTaGFwZSk6IFNoYXBlIHtcbiAgICBpZiAodGhpcy5kYXRhRm9ybWF0ID09PSAnY2hhbm5lbHNGaXJzdCcpIHtcbiAgICAgIGNvbnN0IGhlaWdodCA9XG4gICAgICAgICAgaW5wdXRTaGFwZVsyXSA9PSBudWxsID8gbnVsbCA6IHRoaXMuc2l6ZVswXSAqIGlucHV0U2hhcGVbMl07XG4gICAgICBjb25zdCB3aWR0aCA9IGlucHV0U2hhcGVbM10gPT0gbnVsbCA/IG51bGwgOiB0aGlzLnNpemVbMV0gKiBpbnB1dFNoYXBlWzNdO1xuICAgICAgcmV0dXJuIFtpbnB1dFNoYXBlWzBdLCBpbnB1dFNoYXBlWzFdLCBoZWlnaHQsIHdpZHRoXTtcbiAgICB9IGVsc2Uge1xuICAgICAgY29uc3QgaGVpZ2h0ID1cbiAgICAgICAgICBpbnB1dFNoYXBlWzFdID09IG51bGwgPyBudWxsIDogdGhpcy5zaXplWzBdICogaW5wdXRTaGFwZVsxXTtcbiAgICAgIGNvbnN0IHdpZHRoID0gaW5wdXRTaGFwZVsyXSA9PSBudWxsID8gbnVsbCA6IHRoaXMuc2l6ZVsxXSAqIGlucHV0U2hhcGVbMl07XG4gICAgICByZXR1cm4gW2lucHV0U2hhcGVbMF0sIGhlaWdodCwgd2lkdGgsIGlucHV0U2hhcGVbM11dO1xuICAgIH1cbiAgfVxuXG4gIGNhbGwoaW5wdXRzOiBUZW5zb3J8VGVuc29yW10sIGt3YXJnczogS3dhcmdzKTogVGVuc29yfFRlbnNvcltdIHtcbiAgICByZXR1cm4gdGZjLnRpZHkoKCkgPT4ge1xuICAgICAgbGV0IGlucHV0ID0gZ2V0RXhhY3RseU9uZVRlbnNvcihpbnB1dHMpIGFzIFRlbnNvcjREO1xuICAgICAgY29uc3QgaW5wdXRTaGFwZSA9IGlucHV0LnNoYXBlO1xuXG4gICAgICBpZiAodGhpcy5kYXRhRm9ybWF0ID09PSAnY2hhbm5lbHNGaXJzdCcpIHtcbiAgICAgICAgaW5wdXQgPSB0ZmMudHJhbnNwb3NlKGlucHV0LCBbMCwgMiwgMywgMV0pO1xuICAgICAgICBjb25zdCBoZWlnaHQgPSB0aGlzLnNpemVbMF0gKiBpbnB1dFNoYXBlWzJdO1xuICAgICAgICBjb25zdCB3aWR0aCA9IHRoaXMuc2l6ZVsxXSAqIGlucHV0U2hhcGVbM107XG5cbiAgICAgICAgY29uc3QgcmVzaXplZCA9IHRoaXMuaW50ZXJwb2xhdGlvbiA9PT0gJ25lYXJlc3QnID9cbiAgICAgICAgICAgIHRmYy5pbWFnZS5yZXNpemVOZWFyZXN0TmVpZ2hib3IoaW5wdXQsIFtoZWlnaHQsIHdpZHRoXSkgOlxuICAgICAgICAgICAgdGZjLmltYWdlLnJlc2l6ZUJpbGluZWFyKGlucHV0LCBbaGVpZ2h0LCB3aWR0aF0pO1xuICAgICAgICByZXR1cm4gdGZjLnRyYW5zcG9zZShyZXNpemVkLCBbMCwgMywgMSwgMl0pO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgY29uc3QgaGVpZ2h0ID0gdGhpcy5zaXplWzBdICogaW5wdXRTaGFwZVsxXTtcbiAgICAgICAgY29uc3Qgd2lkdGggPSB0aGlzLnNpemVbMV0gKiBpbnB1dFNoYXBlWzJdO1xuICAgICAgICByZXR1cm4gdGhpcy5pbnRlcnBvbGF0aW9uID09PSAnbmVhcmVzdCcgP1xuICAgICAgICAgICAgdGZjLmltYWdlLnJlc2l6ZU5lYXJlc3ROZWlnaGJvcihpbnB1dCwgW2hlaWdodCwgd2lkdGhdKSA6XG4gICAgICAgICAgICB0ZmMuaW1hZ2UucmVzaXplQmlsaW5lYXIoaW5wdXQsIFtoZWlnaHQsIHdpZHRoXSk7XG4gICAgICB9XG4gICAgfSk7XG4gIH1cblxuICBnZXRDb25maWcoKTogc2VyaWFsaXphdGlvbi5Db25maWdEaWN0IHtcbiAgICBjb25zdCBjb25maWcgPSB7XG4gICAgICAgIHNpemU6IHRoaXMuc2l6ZSwgXG4gICAgICAgIGRhdGFGb3JtYXQ6IHRoaXMuZGF0YUZvcm1hdCwgXG4gICAgICAgIGludGVycG9sYXRpb246IHRoaXMuaW50ZXJwb2xhdGlvblxuICAgIH07XG4gICAgY29uc3QgYmFzZUNvbmZpZyA9IHN1cGVyLmdldENvbmZpZygpO1xuICAgIE9iamVjdC5hc3NpZ24oY29uZmlnLCBiYXNlQ29uZmlnKTtcbiAgICByZXR1cm4gY29uZmlnO1xuICB9XG59XG5zZXJpYWxpemF0aW9uLnJlZ2lzdGVyQ2xhc3MoVXBTYW1wbGluZzJEKTtcbiJdfQ==","/**\n * @license\n * Copyright 2018 Google LLC\n *\n * Use of this source code is governed by an MIT-style\n * license that can be found in the LICENSE file or at\n * https://opensource.org/licenses/MIT.\n * =============================================================================\n */\n/**\n * TensorFlow.js Layers: Depthwise Convolutional Layers\n */\nimport * as tfc from '@tensorflow/tfjs-core';\nimport { serialization, tidy } from '@tensorflow/tfjs-core';\nimport { imageDataFormat } from '../backend/common';\nimport * as K from '../backend/tfjs_backend';\nimport { checkDataFormat } from '../common';\nimport { getConstraint, serializeConstraint } from '../constraints';\nimport { ValueError } from '../errors';\nimport { getInitializer, serializeInitializer } from '../initializers';\nimport { getRegularizer, serializeRegularizer } from '../regularizers';\nimport { convOutputLength } from '../utils/conv_utils';\nimport { getExactlyOneShape, getExactlyOneTensor } from '../utils/types_utils';\nimport { BaseConv, preprocessConv2DInput } from './convolutional';\n/**\n * 2D convolution with separable filters.\n * @param x Input tensor.\n * @param depthwiseKernel Convolution kernel for depthwise convolution.\n * @param strides Strides (Array of two integers).\n * @param padding Padding model.\n * @param dataFormat Data format.\n * @param dilationRate Array of two integers, dilation rates for the separable\n * convolution.\n * @returns Output tensor.\n * @throws ValueError If depthwiseKernel is not a 4D array.\n */\nexport function depthwiseConv2d(x, depthwiseKernel, strides = [1, 1], padding = 'valid', dataFormat, dilationRate) {\n return tidy(() => {\n if (dataFormat == null) {\n dataFormat = imageDataFormat();\n }\n checkDataFormat(dataFormat);\n let y = preprocessConv2DInput(x, dataFormat);\n if (x.rank !== 4) {\n throw new ValueError(`Input for depthwiseConv2d is required to be 4-D, but is instead ` +\n `${x.rank}-D`);\n }\n if (depthwiseKernel.rank !== 4) {\n throw new ValueError(`depthwiseKernel is required to be 4-D, but is instead ` +\n `${depthwiseKernel.rank}-D`);\n }\n y = tfc.depthwiseConv2d(y, depthwiseKernel, strides, padding === 'same' ? 'same' : 'valid', 'NHWC', dilationRate);\n if (dataFormat === 'channelsFirst') {\n y = tfc.transpose(y, [0, 3, 1, 2]);\n }\n return y;\n });\n}\nexport class DepthwiseConv2D extends BaseConv {\n constructor(args) {\n super(2, args);\n this.depthwiseKernel = null;\n this.depthMultiplier =\n args.depthMultiplier == null ? 1 : args.depthMultiplier;\n this.depthwiseInitializer = getInitializer(args.depthwiseInitializer || this.DEFAULT_KERNEL_INITIALIZER);\n this.depthwiseConstraint = getConstraint(args.depthwiseConstraint);\n this.depthwiseRegularizer = getRegularizer(args.depthwiseRegularizer);\n }\n build(inputShape) {\n inputShape = getExactlyOneShape(inputShape);\n if (inputShape.length < 4) {\n throw new ValueError(`Inputs to DepthwiseConv2D should have rank 4. ` +\n `Received input shape: ${JSON.stringify(inputShape)}.`);\n }\n const channelAxis = this.dataFormat === 'channelsFirst' ? 1 : 3;\n if (inputShape[channelAxis] == null || inputShape[channelAxis] < 0) {\n throw new ValueError('The channel dimension of the inputs to DepthwiseConv2D should ' +\n `be defined, but is not (${inputShape[channelAxis]}).`);\n }\n const inputDim = inputShape[channelAxis];\n const depthwiseKernelShape = [\n this.kernelSize[0], this.kernelSize[1], inputDim, this.depthMultiplier\n ];\n this.depthwiseKernel = this.addWeight('depthwise_kernel', depthwiseKernelShape, null, this.depthwiseInitializer, this.depthwiseRegularizer, true, this.depthwiseConstraint);\n if (this.useBias) {\n this.bias = this.addWeight('bias', [inputDim * this.depthMultiplier], null, this.biasInitializer, this.biasRegularizer, true, this.biasConstraint);\n }\n else {\n this.bias = null;\n }\n this.built = true;\n }\n call(inputs, kwargs) {\n return tidy(() => {\n inputs = getExactlyOneTensor(inputs);\n let outputs = depthwiseConv2d(inputs, this.depthwiseKernel.read(), this.strides, this.padding, this.dataFormat, null);\n // TODO(cais): Add support for dilation.\n if (this.useBias) {\n outputs = K.biasAdd(outputs, this.bias.read(), this.dataFormat);\n }\n if (this.activation != null) {\n outputs = this.activation.apply(outputs);\n }\n return outputs;\n });\n }\n computeOutputShape(inputShape) {\n inputShape = getExactlyOneShape(inputShape);\n const rows = this.dataFormat === 'channelsFirst' ? inputShape[2] : inputShape[1];\n const cols = this.dataFormat === 'channelsFirst' ? inputShape[3] : inputShape[2];\n const outFilters = this.dataFormat === 'channelsFirst' ?\n inputShape[1] * this.depthMultiplier :\n inputShape[3] * this.depthMultiplier;\n const outRows = convOutputLength(rows, this.kernelSize[0], this.padding, this.strides[0]);\n const outCols = convOutputLength(cols, this.kernelSize[1], this.padding, this.strides[1]);\n if (this.dataFormat === 'channelsFirst') {\n return [inputShape[0], outFilters, outRows, outCols];\n }\n else {\n // In this case, assume 'channelsLast'.\n return [inputShape[0], outRows, outCols, outFilters];\n }\n }\n getConfig() {\n const config = super.getConfig();\n config['depthMultiplier'] = this.depthMultiplier;\n config['depthwiseInitializer'] =\n serializeInitializer(this.depthwiseInitializer);\n config['depthwiseRegularizer'] =\n serializeRegularizer(this.depthwiseRegularizer);\n config['depthwiseConstraint'] =\n serializeConstraint(this.depthwiseRegularizer);\n return config;\n }\n}\n/** @nocollapse */\nDepthwiseConv2D.className = 'DepthwiseConv2D';\nserialization.registerClass(DepthwiseConv2D);\n//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY29udm9sdXRpb25hbF9kZXB0aHdpc2UuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi8uLi90ZmpzLWxheWVycy9zcmMvbGF5ZXJzL2NvbnZvbHV0aW9uYWxfZGVwdGh3aXNlLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBOzs7Ozs7OztHQVFHO0FBRUg7O0dBRUc7QUFFSCxPQUFPLEtBQUssR0FBRyxNQUFNLHVCQUF1QixDQUFDO0FBQzdDLE9BQU8sRUFBQyxhQUFhLEVBQW9CLElBQUksRUFBQyxNQUFNLHVCQUF1QixDQUFDO0FBRTVFLE9BQU8sRUFBQyxlQUFlLEVBQUMsTUFBTSxtQkFBbUIsQ0FBQztBQUNsRCxPQUFPLEtBQUssQ0FBQyxNQUFNLHlCQUF5QixDQUFDO0FBQzdDLE9BQU8sRUFBQyxlQUFlLEVBQUMsTUFBTSxXQUFXLENBQUM7QUFDMUMsT0FBTyxFQUFtQyxhQUFhLEVBQUUsbUJBQW1CLEVBQUMsTUFBTSxnQkFBZ0IsQ0FBQztBQUNwRyxPQUFPLEVBQUMsVUFBVSxFQUFDLE1BQU0sV0FBVyxDQUFDO0FBQ3JDLE9BQU8sRUFBQyxjQUFjLEVBQXNDLG9CQUFvQixFQUFDLE1BQU0saUJBQWlCLENBQUM7QUFFekcsT0FBTyxFQUFDLGNBQWMsRUFBc0Msb0JBQW9CLEVBQUMsTUFBTSxpQkFBaUIsQ0FBQztBQUV6RyxPQUFPLEVBQUMsZ0JBQWdCLEVBQUMsTUFBTSxxQkFBcUIsQ0FBQztBQUNyRCxPQUFPLEVBQUMsa0JBQWtCLEVBQUUsbUJBQW1CLEVBQUMsTUFBTSxzQkFBc0IsQ0FBQztBQUc3RSxPQUFPLEVBQUMsUUFBUSxFQUFvQyxxQkFBcUIsRUFBQyxNQUFNLGlCQUFpQixDQUFDO0FBRWxHOzs7Ozs7Ozs7OztHQVdHO0FBQ0gsTUFBTSxVQUFVLGVBQWUsQ0FDM0IsQ0FBUyxFQUFFLGVBQXVCLEVBQUUsVUFBNEIsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLEVBQ3RFLE9BQU8sR0FBRyxPQUFPLEVB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Q0FBQyxVQUFVLENBQUMsQ0FBQyxDQUFDLEVBQUUsSUFBSSxDQUFDLE9BQU8sRUFBRSxJQUFJLENBQUMsT0FBTyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUM7UUFDN0QsSUFBSSxJQUFJLENBQUMsVUFBVSxLQUFLLGVBQWUsRUFBRTtZQUN2QyxPQUFPLENBQUMsVUFBVSxDQUFDLENBQUMsQ0FBQyxFQUFFLFVBQVUsRUFBRSxPQUFPLEVBQUUsT0FBTyxDQUFDLENBQUM7U0FDdEQ7YUFBTTtZQUNMLHVDQUF1QztZQUN2QyxPQUFPLENBQUMsVUFBVSxDQUFDLENBQUMsQ0FBQyxFQUFFLE9BQU8sRUFBRSxPQUFPLEVBQUUsVUFBVSxDQUFDLENBQUM7U0FDdEQ7SUFDSCxDQUFDO0lBRUQsU0FBUztRQUNQLE1BQU0sTUFBTSxHQUFHLEtBQUssQ0FBQyxTQUFTLEVBQUUsQ0FBQztRQUNqQyxNQUFNLENBQUMsaUJBQWlCLENBQUMsR0FBRyxJQUFJLENBQUMsZUFBZSxDQUFDO1FBQ2pELE1BQU0sQ0FBQyxzQkFBc0IsQ0FBQztZQUMxQixvQkFBb0IsQ0FBQyxJQUFJLENBQUMsb0JBQW9CLENBQUMsQ0FBQztRQUNwRCxNQUFNLENBQUMsc0JBQXNCLENBQUM7WUFDMUIsb0JBQW9CLENBQUMsSUFBSSxDQUFDLG9CQUFvQixDQUFDLENBQUM7UUFDcEQsTUFBTSxDQUFDLHFCQUFxQixDQUFDO1lBQ3pCLG1CQUFtQixDQUFDLElBQUksQ0FBQyxvQkFBb0IsQ0FBQyxDQUFDO1FBQ25ELE9BQU8sTUFBTSxDQUFDO0lBQ2hCLENBQUM7O0FBbkdELGtCQUFrQjtBQUNYLHlCQUFTLEdBQUcsaUJBQWlCLENBQUM7QUFvR3ZDLGFBQWEsQ0FBQyxhQUFhLENBQUMsZUFBZSxDQUFDLENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyIvKipcbiAqIEBsaWNlbnNlXG4gKiBDb3B5cmlnaHQgMjAxOCBHb29nbGUgTExDXG4gKlxuICogVXNlIG9mIHRoaXMgc291cmNlIGNvZGUgaXMgZ292ZXJuZWQgYnkgYW4gTUlULXN0eWxlXG4gKiBsaWNlbnNlIHRoYXQgY2FuIGJlIGZvdW5kIGluIHRoZSBMSUNFTlNFIGZpbGUgb3IgYXRcbiAqIGh0dHBzOi8vb3BlbnNvdXJjZS5vcmcvbGljZW5zZXMvTUlULlxuICogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbiAqL1xuXG4vKipcbiAqIFRlbnNvckZsb3cuanMgTGF5ZXJzOiBEZXB0aHdpc2UgQ29udm9sdXRpb25hbCBMYXllcnNcbiAqL1xuXG5pbXBvcnQgKiBhcyB0ZmMgZnJvbSAnQHRlbnNvcmZsb3cvdGZqcy1jb3JlJztcbmltcG9ydCB7c2VyaWFsaXphdGlvbiwgVGVuc29yLCBUZW5zb3I0RCwgdGlkeX0gZnJvbSAnQHRlbnNvcmZsb3cvdGZqcy1jb3JlJztcblxuaW1wb3J0IHtpbWFnZURhdGFGb3JtYXR9IGZyb20gJy4uL2JhY2tlbmQvY29tbW9uJztcbmltcG9ydCAqIGFzIEsgZnJvbSAnLi4vYmFja2VuZC90ZmpzX2JhY2tlbmQnO1xuaW1wb3J0IHtjaGVja0RhdGFGb3JtYXR9IGZyb20gJy4uL2NvbW1vbic7XG5pbXBvcnQge0NvbnN0cmFpbnQsIENvbnN0cmFpbnRJZGVudGlmaWVyLCBnZXRDb25zdHJhaW50LCBzZXJpYWxpemVDb25zdHJhaW50fSBmcm9tICcuLi9jb25zdHJhaW50cyc7XG5pbXBvcnQge1ZhbHVlRXJyb3J9IGZyb20gJy4uL2Vycm9ycyc7XG5pbXBvcnQge2dldEluaXRpYWxpemVyLCBJbml0aWFsaXplciwgSW5pdGlhbGl6ZXJJZGVudGlmaWVyLCBzZXJpYWxpemVJbml0aWFsaXplcn0gZnJvbSAnLi4vaW5pdGlhbGl6ZXJzJztcbmltcG9ydCB7RGF0YUZvcm1hdCwgU2hhcGV9IGZyb20gJy4uL2tlcmFzX2Zvcm1hdC9jb21tb24nO1xuaW1wb3J0IHtnZXRSZWd1bGFyaXplciwgUmVndWxhcml6ZXIsIFJlZ3VsYXJpemVySWRlbnRpZmllciwgc2VyaWFsaXplUmVndWxhcml6ZXJ9IGZyb20gJy4uL3JlZ3VsYXJpemVycyc7XG5pbXBvcnQge0t3YXJnc30gZnJvbSAnLi4vdHlwZXMnO1xuaW1wb3J0IHtjb252T3V0cHV0TGVuZ3RofSBmcm9tICcuLi91dGlscy9jb252X3V0aWxzJztcbmltcG9ydCB7Z2V0RXhhY3RseU9uZVNoYXBlLCBnZXRFeGFjdGx5T25lVGVuc29yfSBmcm9tICcuLi91dGlscy90eXBlc191dGlscyc7XG5pbXBvcnQge0xheWVyVmFyaWFibGV9IGZyb20gJy4uL3ZhcmlhYmxlcyc7XG5cbmltcG9ydCB7QmFzZUNvbnYsIEJhc2VDb252TGF5ZXJBcmdzLCBDb252TGF5ZXJBcmdzLCBwcmVwcm9jZXNzQ29udjJESW5wdXR9IGZyb20gJy4vY29udm9sdXRpb25hbCc7XG5cbi8qKlxuICogMkQgY29udm9sdXRpb24gd2l0aCBzZXBhcmFibGUgZmlsdGVycy5cbiAqIEBwYXJhbSB4IElucHV0IHRlbnNvci5cbiAqIEBwYXJhbSBkZXB0aHdpc2VLZXJuZWwgQ29udm9sdXRpb24ga2VybmVsIGZvciBkZXB0aHdpc2UgY29udm9sdXRpb24uXG4gKiBAcGFyYW0gc3RyaWRlcyBTdHJpZGVzIChBcnJheSBvZiB0d28gaW50ZWdlcnMpLlxuICogQHBhcmFtIHBhZGRpbmcgUGFkZGluZyBtb2RlbC5cbiAqIEBwYXJhbSBkYXRhRm9ybWF0IERhdGEgZm9ybWF0LlxuICogQHBhcmFtIGRpbGF0aW9uUmF0ZSBBcnJheSBvZiB0d28gaW50ZWdlcnMsIGRpbGF0aW9uIHJhdGVzIGZvciB0aGUgc2VwYXJhYmxlXG4gKiAgIGNvbnZvbHV0aW9uLlxuICogQHJldHVybnMgT3V0cHV0IHRlbnNvci5cbiAqIEB0aHJvd3MgVmFsdWVFcnJvciBJZiBkZXB0aHdpc2VLZXJuZWwgaXMgbm90IGEgNEQgYXJyYXkuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBkZXB0aHdpc2VDb252MmQoXG4gICAgeDogVGVuc29yLCBkZXB0aHdpc2VLZXJuZWw6IFRlbnNvciwgc3RyaWRlczogW251bWJlciwgbnVtYmVyXSA9IFsxLCAxXSxcbiAgICBwYWRkaW5nID0gJ3ZhbGlkJywgZGF0YUZvcm1hdD86IERhdGFGb3JtYXQsXG4gICAgZGlsYXRpb25SYXRlPzogW251bWJlciwgbnVtYmVyXSk6IFRlbnNvciB7XG4gIHJldHVybiB0aWR5KCgpID0+IHtcbiAgICBpZiAoZGF0YUZvcm1hdCA9PSBudWxsKSB7XG4gICAgICBkYXRhRm9ybWF0ID0gaW1hZ2VEYXRhRm9ybWF0KCk7XG4gICAgfVxuICAgIGNoZWNrRGF0YUZvcm1hdChkYXRhRm9ybWF0KTtcbiAgICBsZXQgeSA9IHByZXByb2Nlc3NDb252MkRJbnB1dCh4LCBkYXRhRm9ybWF0KTtcbiAgICBpZiAoeC5yYW5rICE9PSA0KSB7XG4gICAgICB0aHJvdyBuZXcgVmFsdWVFcnJvcihcbiAgICAgICAgICBgSW5wdXQgZm9yIGRlcHRod2lzZUNvbnYyZCBpcyByZXF1aXJlZCB0byBiZSA0LUQsIGJ1dCBpcyBpbnN0ZWFkIGAgK1xuICAgICAgICAgIGAke3gucmFua30tRGApO1xuICAgIH1cbiAgICBpZiAoZGVwdGh3aXNlS2VybmVsLnJhbmsgIT09IDQpIHtcbiAgICAgIHRocm93IG5ldyBWYWx1ZUVycm9yKFxuICAgICAgICAgIGBkZXB0aHdpc2VLZXJuZWwgaXMgcmVxdWlyZWQgdG8gYmUgNC1ELCBidXQgaXMgaW5zdGVhZCBgICtcbiAgICAgICAgICBgJHtkZXB0aHdpc2VLZXJuZWwucmFua30tRGApO1xuICAgIH1cbiAgICB5ID0gdGZjLmRlcHRod2lzZUNvbnYyZChcbiAgICAgICAgeSBhcyBUZW5zb3I0RCwgZGVwdGh3aXNlS2VybmVsIGFzIFRlbnNvcjRELCBzdHJpZGVzLFxuICAgICAgICBwYWRkaW5nID09PSAnc2FtZScgPyAnc2FtZScgOiAndmFsaWQnLCAnTkhXQycsIGRpbGF0aW9uUmF0ZSk7XG4gICAgaWYgKGRhdGFGb3JtYXQgPT09ICdjaGFubmVsc0ZpcnN0Jykge1xuICAgICAgeSA9IHRmYy50cmFuc3Bvc2UoeSwgWzAsIDMsIDEsIDJdKTtcbiAgICB9XG4gICAgcmV0dXJuIHk7XG4gIH0pO1xufVxuXG5leHBvcnQgZGVjbGFyZSBpbnRlcmZhY2UgRGVwdGh3aXNlQ29udjJETGF5ZXJBcmdzIGV4dGVuZHMgQmFzZUNvbnZMYXllckFyZ3Mge1xuICAvKipcbiAgICogQW4gaW50ZWdlciBvciBBcnJheSBvZiAyIGludGVnZXJzLCBzcGVjaWZ5aW5nIHRoZSB3aWR0aCBhbmQgaGVpZ2h0IG9mIHRoZVxuICAgKiAyRCBjb252b2x1dGlvbiB3aW5kb3cuIENhbiBiZSBhIHNpbmdsZSBpbnRlZ2VyIHRvIHNwZWNpZnkgdGhlIHNhbWUgdmFsdWVcbiAgICogZm9yIGFsbCBzcGF0aWFsIGRpbWVuc2lvbnMuXG4gICAqL1xuICBrZXJuZWxTaXplOiBudW1iZXJ8W251bWJlciwgbnVtYmVyXTtcblxuICAvKipcbiAgICogVGhlIG51bWJlciBvZiBkZXB0aHdpc2UgY29udm9sdXRpb24gb3V0cHV0IGNoYW5uZWxzIGZvciBlYWNoIGlucHV0XG4gICAqIGNoYW5uZWwuXG4gICAqIFRoZSB0b3RhbCBudW1iZXIgb2YgZGVwdGh3aXNlIGNvbnZvbHV0aW9uIG91dHB1dCBjaGFubmVscyB3aWxsIGJlIGVxdWFsIHRvXG4gICAqIGBmaWx0ZXJzSW4gKiBkZXB0aE11bHRpcGxpZXJgLlxuICAgKiBEZWZhdWx0OiAxLlxuICAgKi9cbiAgZGVwdGhNdWx0aXBsaWVyPzogbnVtYmVyO1xuXG4gIC8qKlxuICAgKiBJbml0aWFsaXplciBmb3IgdGhlIGRlcHRod2lzZSBrZXJuZWwgbWF0cml4LlxuICAgKiBEZWZhdWx0OiBHbG9yb3ROb3JtYWwuXG4gICAqL1xuICBkZXB0aHdpc2VJbml0aWFsaXplcj86IEluaXRpYWxpemVySWRlbnRpZmllcnxJbml0aWFsaXplcjtcblxuICAvKipcbiAgICogQ29uc3RyYWludCBmb3IgdGhlIGRlcHRod2lzZSBrZXJuZWwgbWF0cml4LlxuICAgKi9cbiAgZGVwdGh3aXNlQ29uc3RyYWludD86IENvbnN0cmFpbnRJZGVudGlmaWVyfENvbnN0cmFpbnQ7XG5cbiAgLyoqXG4gICAqIFJlZ3VsYXJpemVyIGZ1bmN0aW9uIGZvciB0aGUgZGVwdGh3aXNlIGtlcm5lbCBtYXRyaXguXG4gICAqL1xuICBkZXB0aHdpc2VSZWd1bGFyaXplcj86IFJlZ3VsYXJpemVySWRlbnRpZmllcnxSZWd1bGFyaXplcjtcbn1cblxuZXhwb3J0IGNsYXNzIERlcHRod2lzZUNvbnYyRCBleHRlbmRzIEJhc2VDb252IHtcbiAgLyoqIEBub2NvbGxhcHNlICovXG4gIHN0YXRpYyBjbGFzc05hbWUgPSAnRGVwdGh3aXNlQ29udjJEJztcbiAgcHJpdmF0ZSByZWFkb25seSBkZXB0aE11bHRpcGxpZXI6IG51bWJlcjtcbiAgcHJpdmF0ZSByZWFkb25seSBkZXB0aHdpc2VJbml0aWFsaXplcjogSW5pdGlhbGl6ZXI7XG4gIHByaXZhdGUgcmVhZG9ubHkgZGVwdGh3aXNlQ29uc3RyYWludDogQ29uc3RyYWludDtcbiAgcHJpdmF0ZSByZWFkb25seSBkZXB0aHdpc2VSZWd1bGFyaXplcjogUmVndWxhcml6ZXI7XG5cbiAgcHJpdmF0ZSBkZXB0aHdpc2VLZXJuZWw6IExheWVyVmFyaWFibGUgPSBudWxsO1xuXG4gIGNvbnN0cnVjdG9yKGFyZ3M6IERlcHRod2lzZUNvbnYyRExheWVyQXJncykge1xuICAgIHN1cGVyKDIsIGFyZ3MgYXMgQ29udkxheWVyQXJncyk7XG4gICAgdGhpcy5kZXB0aE11bHRpcGxpZXIgPVxuICAgICAgICBhcmdzLmRlcHRoTXVsdGlwbGllciA9PSBudWxsID8gMSA6IGFyZ3MuZGVwdGhNdWx0aXBsaWVyO1xuICAgIHRoaXMuZGVwdGh3aXNlSW5pdGlhbGl6ZXIgPSBnZXRJbml0aWFsaXplcihcbiAgICAgICAgYXJncy5kZXB0aHdpc2VJbml0aWFsaXplciB8fCB0aGlzLkRFRkFVTFRfS0VSTkVMX0lOSVRJQUxJWkVSKTtcbiAgICB0aGlzLmRlcHRod2lzZUNvbnN0cmFpbnQgPSBnZXRDb25zdHJhaW50KGFyZ3MuZGVwdGh3aXNlQ29uc3RyYWludCk7XG4gICAgdGhpcy5kZXB0aHdpc2VSZWd1bGFyaXplciA9IGdldFJlZ3VsYXJpemVyKGFyZ3MuZGVwdGh3aXNlUmVndWxhcml6ZXIpO1xuICB9XG5cbiAgYnVpbGQoaW5wdXRTaGFwZTogU2hhcGV8U2hhcGVbXSk6IHZvaWQge1xuICAgIGlucHV0U2hhcGUgPSBnZXRFeGFjdGx5T25lU2hhcGUoaW5wdXRTaGFwZSk7XG4gICAgaWYgKGlucHV0U2hhcGUubGVuZ3RoIDwgNCkge1xuICAgICAgdGhyb3cgbmV3IFZhbHVlRXJyb3IoXG4gICAgICAgICAgYElucHV0cyB0byBEZXB0aHdpc2VDb252MkQgc2hvdWxkIGhhdmUgcmFuayA0LiBgICtcbiAgICAgICAgICBgUmVjZWl2ZWQgaW5wdXQgc2hhcGU6ICR7SlNPTi5zdHJpbmdpZnkoaW5wdXRTaGFwZSl9LmApO1xuICAgIH1cbiAgICBjb25zdCBjaGFubmVsQXhpcyA9IHRoaXMuZGF0YUZvcm1hdCA9PT0gJ2NoYW5uZWxzRmlyc3QnID8gMSA6IDM7XG4gICAgaWYgKGlucHV0U2hhcGVbY2hhbm5lbEF4aXNdID09IG51bGwgfHwgaW5wdXRTaGFwZVtjaGFubmVsQXhpc10gPCAwKSB7XG4gICAgICB0aHJvdyBuZXcgVmFsdWVFcnJvcihcbiAgICAgICAgICAnVGhlIGNoYW5uZWwgZGltZW5zaW9uIG9mIHRoZSBpbnB1dHMgdG8gRGVwdGh3aXNlQ29udjJEIHNob3VsZCAnICtcbiAgICAgICAgICBgYmUgZGVmaW5lZCwgYnV0IGlzIG5vdCAoJHtpbnB1dFNoYXBlW2NoYW5uZWxBeGlzXX0pLmApO1xuICAgIH1cbiAgICBjb25zdCBpbnB1dERpbSA9IGlucHV0U2hhcGVbY2hhbm5lbEF4aXNdO1xuICAgIGNvbnN0IGRlcHRod2lzZUtlcm5lbFNoYXBlOiBTaGFwZSA9IFtcbiAgICAgIHRoaXMua2VybmVsU2l6ZVswXSwgdGhpcy5rZXJuZWxTaXplWzFdLCBpbnB1dERpbSwgdGhpcy5kZXB0aE11bHRpcGxpZXJcbiAgICBdO1xuXG4gICAgdGhpcy5kZXB0aHdpc2VLZXJuZWwgPSB0aGlzLmFkZFdlaWdodChcbiAgICAgICAgJ2RlcHRod2lzZV9rZXJuZWwnLCBkZXB0aHdpc2VLZXJuZWxTaGFwZSwgbnVsbCxcbiAgICAgICAgdGhpcy5kZXB0aHdpc2VJbml0aWFsaXplciwgdGhpcy5kZXB0aHdpc2VSZWd1bGFyaXplciwgdHJ1ZSxcbiAgICAgICAgdGhpcy5kZXB0aHdpc2VDb25zdHJhaW50KTtcbiAgICBpZiAodGhpcy51c2VCaWFzKSB7XG4gICAgICB0aGlzLmJpYXMgPSB0aGlzLmFkZFdlaWdodChcbiAgICAgICAgICAnYmlhcycsIFtpbnB1dERpbSAqIHRoaXMuZGVwdGhNdWx0aXBsaWVyXSwgbnVsbCwgdGhpcy5iaWFzSW5pdGlhbGl6ZXIsXG4gICAgICAgICAgdGhpcy5iaWFzUmVndWxhcml6ZXIsIHRydWUsIHRoaXMuYmlhc0NvbnN0cmFpbnQpO1xuICAgIH0gZWxzZSB7XG4gICAgICB0aGlzLmJpYXMgPSBudWxsO1xuICAgIH1cbiAgICB0aGlzLmJ1aWx0ID0gdHJ1ZTtcbiAgfVxuXG4gIGNhbGwoaW5wdXRzOiBUZW5zb3J8VGVuc29yW10sIGt3YXJnczogS3dhcmdzKTogVGVuc29yfFRlbnNvcltdIHtcbiAgICByZXR1cm4gdGlkeSgoKSA9PiB7XG4gICAgICBpbnB1dHMgPSBnZXRFeGFjdGx5T25lVGVuc29yKGlucHV0cyk7XG4gICAgICBsZXQgb3V0cHV0cyA9IGRlcHRod2lzZUNvbnYyZChcbiAgICAgICAgICBpbnB1dHMsIHRoaXMuZGVwdGh3aXNlS2VybmVsLnJlYWQoKSwgdGhpcy5zdHJpZGVzIGFzIFtudW1iZXIsIG51bWJlcl0sXG4gICAgICAgICAgdGhpcy5wYWRkaW5nLCB0aGlzLmRhdGFGb3JtYXQsIG51bGwpO1xuICAgICAgLy8gVE9ETyhjYWlzKTogQWRkIHN1cHBvcnQgZm9yIGRpbGF0aW9uLlxuICAgICAgaWYgKHRoaXMudXNlQmlhcykge1xuICAgICAgICBvdXRwdXRzID0gSy5iaWFzQWRkKG91dHB1dHMsIHRoaXMuYmlhcy5yZWFkKCksIHRoaXMuZGF0YUZvcm1hdCk7XG4gICAgICB9XG4gICAgICBpZiAodGhpcy5hY3RpdmF0aW9uICE9IG51bGwpIHtcbiAgICAgICAgb3V0cHV0cyA9IHRoaXMuYWN0aXZhdGlvbi5hcHBseShvdXRwdXRzKTtcbiAgICAgIH1cbiAgICAgIHJldHVybiBvdXRwdXRzO1xuICAgIH0pO1xuICB9XG5cbiAgY29tcHV0ZU91dHB1dFNoYXBlKGlucHV0U2hhcGU6IFNoYXBlfFNoYXBlW10pOiBTaGFwZXxTaGFwZVtdIHtcbiAgICBpbnB1dFNoYXBlID0gZ2V0RXhhY3RseU9uZVNoYXBlKGlucHV0U2hhcGUpO1xuICAgIGNvbnN0IHJvd3MgPVxuICAgICAgICB0aGlzLmRhdGFGb3JtYXQgPT09ICdjaGFubmVsc0ZpcnN0JyA/IGlucHV0U2hhcGVbMl0gOiBpbnB1dFNoYXBlWzFdO1xuICAgIGNvbnN0IGNvbHMgPVxuICAgICAgICB0aGlzLmRhdGFGb3JtYXQgPT09ICdjaGFubmVsc0ZpcnN0JyA/IGlucHV0U2hhcGVbM10gOiBpbnB1dFNoYXBlWzJdO1xuICAgIGNvbnN0IG91dEZpbHRlcnMgPSB0aGlzLmRhdGFGb3JtYXQgPT09ICdjaGFubmVsc0ZpcnN0JyA/XG4gICAgICAgIGlucHV0U2hhcGVbMV0gKiB0aGlzLmRlcHRoTXVsdGlwbGllciA6XG4gICAgICAgIGlucHV0U2hhcGVbM10gKiB0aGlzLmRlcHRoTXVsdGlwbGllcjtcbiAgICBjb25zdCBvdXRSb3dzID0gY29udk91dHB1dExlbmd0aChcbiAgICAgICAgcm93cywgdGhpcy5rZXJuZWxTaXplWzBdLCB0aGlzLnBhZGRpbmcsIHRoaXMuc3RyaWRlc1swXSk7XG4gICAgY29uc3Qgb3V0Q29scyA9IGNvbnZPdXRwdXRMZW5ndGgoXG4gICAgICAgIGNvbHMsIHRoaXMua2VybmVsU2l6ZVsxXSwgdGhpcy5wYWRkaW5nLCB0aGlzLnN0cmlkZXNbMV0pO1xuICAgIGlmICh0aGlzLmRhdGFGb3JtYXQgPT09ICdjaGFubmVsc0ZpcnN0Jykge1xuICAgICAgcmV0dXJuIFtpbnB1dFNoYXBlWzBdLCBvdXRGaWx0ZXJzLCBvdXRSb3dzLCBvdXRDb2xzXTtcbiAgICB9IGVsc2Uge1xuICAgICAgLy8gSW4gdGhpcyBjYXNlLCBhc3N1bWUgJ2NoYW5uZWxzTGFzdCcuXG4gICAgICByZXR1cm4gW2lucHV0U2hhcGVbMF0sIG91dFJvd3MsIG91dENvbHMsIG91dEZpbHRlcnNdO1xuICAgIH1cbiAgfVxuXG4gIGdldENvbmZpZygpOiBzZXJpYWxpemF0aW9uLkNvbmZpZ0RpY3Qge1xuICAgIGNvbnN0IGNvbmZpZyA9IHN1cGVyLmdldENvbmZpZygpO1xuICAgIGNvbmZpZ1snZGVwdGhNdWx0aXBsaWVyJ10gPSB0aGlzLmRlcHRoTXVsdGlwbGllcjtcbiAgICBjb25maWdbJ2RlcHRod2lzZUluaXRpYWxpemVyJ10gPVxuICAgICAgICBzZXJpYWxpemVJbml0aWFsaXplcih0aGlzLmRlcHRod2lzZUluaXRpYWxpemVyKTtcbiAgICBjb25maWdbJ2RlcHRod2lzZVJlZ3VsYXJpemVyJ10gPVxuICAgICAgICBzZXJpYWxpemVSZWd1bGFyaXplcih0aGlzLmRlcHRod2lzZVJlZ3VsYXJpemVyKTtcbiAgICBjb25maWdbJ2RlcHRod2lzZUNvbnN0cmFpbnQnXSA9XG4gICAgICAgIHNlcmlhbGl6ZUNvbnN0cmFpbnQodGhpcy5kZXB0aHdpc2VSZWd1bGFyaXplcik7XG4gICAgcmV0dXJuIGNvbmZpZztcbiAgfVxufVxuc2VyaWFsaXphdGlvbi5yZWdpc3RlckNsYXNzKERlcHRod2lzZUNvbnYyRCk7XG4iXX0=","/**\n * @license\n * Copyright 2018 Google LLC\n *\n * Use of this source code is governed by an MIT-style\n * license that can be found in the LICENSE file or at\n * https://opensource.org/licenses/MIT.\n * =============================================================================\n */\n/**\n * TensorFlow.js Layers: Recurrent Neural Network Layers.\n */\nimport * as tfc from '@tensorflow/tfjs-core';\nimport { serialization, tidy, util } from '@tensorflow/tfjs-core';\nimport { getActivation, serializeActivation } from '../activations';\nimport * as K from '../backend/tfjs_backend';\nimport { nameScope } from '../common';\nimport { getConstraint, serializeConstraint } from '../constraints';\nimport { InputSpec, SymbolicTensor } from '../engine/topology';\nimport { Layer } from '../engine/topology';\nimport { AttributeError, NotImplementedError, ValueError } from '../errors';\nimport { getInitializer, Initializer, Ones, serializeInitializer } from '../initializers';\nimport { getRegularizer, serializeRegularizer } from '../regularizers';\nimport { assertPositiveInteger } from '../utils/generic_utils';\nimport * as math_utils from '../utils/math_utils';\nimport { getExactlyOneShape, getExactlyOneTensor, isArrayOfShapes } from '../utils/types_utils';\nimport { batchGetValue, batchSetValue } from '../variables';\nimport { deserialize } from './serialization';\n/**\n * Standardize `apply()` args to a single list of tensor inputs.\n *\n * When running a model loaded from file, the input tensors `initialState` and\n * `constants` are passed to `RNN.apply()` as part of `inputs` instead of the\n * dedicated kwargs fields. `inputs` consists of\n * `[inputs, initialState0, initialState1, ..., constant0, constant1]` in this\n * case.\n * This method makes sure that arguments are\n * separated and that `initialState` and `constants` are `Array`s of tensors\n * (or None).\n *\n * @param inputs Tensor or `Array` of tensors.\n * @param initialState Tensor or `Array` of tensors or `null`/`undefined`.\n * @param constants Tensor or `Array` of tensors or `null`/`undefined`.\n * @returns An object consisting of\n * inputs: A tensor.\n * initialState: `Array` of tensors or `null`.\n * constants: `Array` of tensors or `null`.\n * @throws ValueError, if `inputs` is an `Array` but either `initialState` or\n * `constants` is provided.\n */\nexport function standardizeArgs(inputs, initialState, constants, numConstants) {\n if (Array.isArray(inputs)) {\n if (initialState != null || constants != null) {\n throw new ValueError('When inputs is an array, neither initialState or constants ' +\n 'should be provided');\n }\n if (numConstants != null) {\n constants = inputs.slice(inputs.length - numConstants, inputs.length);\n inputs = inputs.slice(0, inputs.length - numConstants);\n }\n if (inputs.length > 1) {\n initialState = inputs.slice(1, inputs.length);\n }\n inputs = inputs[0];\n }\n function toListOrNull(x) {\n if (x == null || Array.isArray(x)) {\n return x;\n }\n else {\n return [x];\n }\n }\n initialState = toListOrNull(initialState);\n constants = toListOrNull(constants);\n return { inputs, initialState, constants };\n}\n/**\n * Iterates over the time dimension of a tensor.\n *\n * @param stepFunction RNN step function.\n * Parameters:\n * inputs: tensor with shape `[samples, ...]` (no time dimension),\n * representing input for the batch of samples at a certain time step.\n * states: an Array of tensors.\n * Returns:\n * outputs: tensor with shape `[samples, outputDim]` (no time dimension).\n * newStates: list of tensors, same length and shapes as `states`. The first\n * state in the list must be the output tensor at the previous timestep.\n * @param inputs Tensor of temporal data of shape `[samples, time, ...]` (at\n * least 3D).\n * @param initialStates Tensor with shape `[samples, outputDim]` (no time\n * dimension), containing the initial values of the states used in the step\n * function.\n * @param goBackwards If `true`, do the iteration over the time dimension in\n * reverse order and return the reversed sequence.\n * @param mask Binary tensor with shape `[sample, time, 1]`, with a zero for\n * every element that is masked.\n * @param constants An Array of constant values passed at each step.\n * @param unroll Whether to unroll the RNN or to use a symbolic loop. *Not*\n * applicable to this imperative deeplearn.js backend. Its value is ignored.\n * @param needPerStepOutputs Whether the per-step outputs are to be\n * concatenated into a single tensor and returned (as the second return\n * value). Default: `false`. This arg is included so that the relatively\n * expensive concatenation of the stepwise outputs can be omitted unless\n * the stepwise outputs need to be kept (e.g., for an LSTM layer of which\n * `returnSequence` is `true`.)\n * @returns An Array: `[lastOutput, outputs, newStates]`.\n * lastOutput: the lastest output of the RNN, of shape `[samples, ...]`.\n * outputs: tensor with shape `[samples, time, ...]` where each entry\n * `output[s, t]` is the output of the step function at time `t` for sample\n * `s`. This return value is provided if and only if the\n * `needPerStepOutputs` is set as `true`. If it is set as `false`, this\n * return value will be `undefined`.\n * newStates: Array of tensors, latest states returned by the step function,\n * of shape `(samples, ...)`.\n * @throws ValueError If input dimension is less than 3.\n *\n * TODO(nielsene): This needs to be tidy-ed.\n */\nexport function rnn(stepFunction, inputs, initialStates, goBackwards = false, mask, constants, unroll = false, needPerStepOutputs = false) {\n return tfc.tidy(() => {\n const ndim = inputs.shape.length;\n if (ndim < 3) {\n throw new ValueError(`Input should be at least 3D, but is ${ndim}D.`);\n }\n // Transpose to time-major, i.e., from [batch, time, ...] to [time, batch,\n // ...].\n const axes = [1, 0].concat(math_utils.range(2, ndim));\n inputs = tfc.transpose(inputs, axes);\n if (constants != null) {\n throw new NotImplementedError('The rnn() functoin of the deeplearn.js backend does not support ' +\n 'constants yet.');\n }\n // Porting Note: the unroll option is ignored by the imperative backend.\n if (unroll) {\n console.warn('Backend rnn(): the unroll = true option is not applicable to the ' +\n 'imperative deeplearn.js backend.');\n }\n if (mask != null) {\n mask = tfc.cast(tfc.cast(mask, 'bool'), 'float32');\n if (mask.rank === ndim - 1) {\n mask = tfc.expandDims(mask, -1);\n }\n mask = tfc.transpose(mask, axes);\n }\n if (goBackwards) {\n inputs = tfc.reverse(inputs, 0);\n if (mask != null) {\n mask = tfc.reverse(mask, 0);\n }\n }\n // Porting Note: PyKeras with TensorFlow backend uses a symbolic loop\n // (tf.while_loop). But for the imperative deeplearn.js backend, we just\n // use the usual TypeScript control flow to iterate over the time steps in\n // the inputs.\n // Porting Note: PyKeras patches a \"_use_learning_phase\" attribute to\n // outputs.\n // This is not idiomatic in TypeScript. The info regarding whether we are\n // in a learning (i.e., training) phase for RNN is passed in a different\n // way.\n const perStepOutputs = [];\n let lastOutput;\n let states = initialStates;\n const timeSteps = inputs.shape[0];\n const perStepInputs = tfc.unstack(inputs);\n let perStepMasks;\n if (mask != null) {\n perStepMasks = tfc.unstack(mask);\n }\n for (let t = 0; t < timeSteps; ++t) {\n const currentInput = perStepInputs[t];\n const stepOutputs = tfc.tidy(() => stepFunction(currentInput, states));\n if (mask == null) {\n lastOutput = stepOutputs[0];\n states = stepOutputs[1];\n }\n else {\n const maskedOutputs = tfc.tidy(() => {\n const stepMask = perStepMasks[t];\n const negStepMask = tfc.sub(tfc.onesLike(stepMask), stepMask);\n // TODO(cais): Would tfc.where() be better for performance?\n const output = tfc.add(tfc.mul(stepOutputs[0], stepMask), tfc.mul(states[0], negStepMask));\n const newStates = states.map((state, i) => {\n return tfc.add(tfc.mul(stepOutputs[1][i], stepMask), tfc.mul(state, negStepMask));\n });\n return { output, newStates };\n });\n lastOutput = maskedOutputs.output;\n states = maskedOutputs.newStates;\n }\n if (needPerStepOutputs) {\n perStepOutputs.push(lastOutput);\n }\n }\n let outputs;\n if (needPerStepOutputs) {\n const axis = 1;\n outputs = tfc.stack(perStepOutputs, axis);\n }\n return [lastOutput, outputs, states];\n });\n}\nexport class RNN extends Layer {\n constructor(args) {\n super(args);\n let cell;\n if (args.cell == null) {\n throw new ValueError('cell property is missing for the constructor of RNN.');\n }\n else if (Array.isArray(args.cell)) {\n cell = new StackedRNNCells({ cells: args.cell });\n }\n else {\n cell = args.cell;\n }\n if (cell.stateSize == null) {\n throw new ValueError('The RNN cell should have an attribute `stateSize` (tuple of ' +\n 'integers, one integer per RNN state).');\n }\n this.cell = cell;\n this.returnSequences =\n args.returnSequences == null ? false : args.returnSequences;\n this.returnState = args.returnState == null ? false : args.returnState;\n this.goBackwards = args.goBackwards == null ? false : args.goBackwards;\n this._stateful = args.stateful == null ? false : args.stateful;\n this.unroll = args.unroll == null ? false : args.unroll;\n this.supportsMasking = true;\n this.inputSpec = [new InputSpec({ ndim: 3 })];\n this.stateSpec = null;\n this.states_ = null;\n // TODO(cais): Add constantsSpec and numConstants.\n this.numConstants = null;\n // TODO(cais): Look into the use of initial_state in the kwargs of the\n // constructor.\n this.keptStates = [];\n }\n // Porting Note: This is the equivalent of `RNN.states` property getter in\n // PyKeras.\n getStates() {\n if (this.states_ == null) {\n const numStates = Array.isArray(this.cell.stateSize) ? this.cell.stateSize.length : 1;\n return math_utils.range(0, numStates).map(x => null);\n }\n else {\n return this.states_;\n }\n }\n // Porting Note: This is the equivalent of the `RNN.states` property setter in\n // PyKeras.\n setStates(states) {\n this.states_ = states;\n }\n computeOutputShape(inputShape) {\n if (isArrayOfShapes(inputShape)) {\n inputShape = inputShape[0];\n }\n inputShape = inputShape;\n // TODO(cais): Remove the casting once stacked RNN cells become supported.\n let stateSize = this.cell.stateSize;\n if (!Array.isArray(stateSize)) {\n stateSize = [stateSize];\n }\n const outputDim = stateSize[0];\n let outputShape;\n if (this.returnSequences) {\n outputShape = [inputShape[0], inputShape[1], outputDim];\n }\n else {\n outputShape = [inputShape[0], outputDim];\n }\n if (this.returnState) {\n const stateShape = [];\n for (const dim of stateSize) {\n stateShape.push([inputShape[0], dim]);\n }\n return [outputShape].concat(stateShape);\n }\n else {\n return outputShape;\n }\n }\n computeMask(inputs, mask) {\n return tfc.tidy(() => {\n if (Array.isArray(mask)) {\n mask = mask[0];\n }\n const outputMask = this.returnSequences ? mask : null;\n if (this.returnState) {\n const stateMask = this.states.map(s => null);\n return [outputMask].concat(stateMask);\n }\n else {\n return outputMask;\n }\n });\n }\n /**\n * Get the current state tensors of the RNN.\n *\n * If the state hasn't been set, return an array of `null`s of the correct\n * length.\n */\n get states() {\n if (this.states_ == null) {\n const numStates = Array.isArray(this.cell.stateSize) ? this.cell.stateSize.length : 1;\n const output = [];\n for (let i = 0; i < numStates; ++i) {\n output.push(null);\n }\n return output;\n }\n else {\n return this.states_;\n }\n }\n set states(s) {\n this.states_ = s;\n }\n build(inputShape) {\n // Note inputShape will be an Array of Shapes of initial states and\n // constants if these are passed in apply().\n const constantShape = null;\n if (this.numConstants != null) {\n throw new NotImplementedError('Constants support is not implemented in RNN yet.');\n }\n if (isArrayOfShapes(inputShape)) {\n inputShape = inputShape[0];\n }\n inputShape = inputShape;\n const batchSize = this.stateful ? inputShape[0] : null;\n const inputDim = inputShape.slice(2);\n this.inputSpec[0] = new InputSpec({ shape: [batchSize, null, ...inputDim] });\n // Allow cell (if RNNCell Layer) to build before we set or validate\n // stateSpec.\n const stepInputShape = [inputShape[0]].concat(inputShape.slice(2));\n if (constantShape != null) {\n throw new NotImplementedError('Constants support is not implemented in RNN yet.');\n }\n else {\n this.cell.build(stepInputShape);\n }\n // Set or validate stateSpec.\n let stateSize;\n if (Array.isArray(this.cell.stateSize)) {\n stateSize = this.cell.stateSize;\n }\n else {\n stateSize = [this.cell.stateSize];\n }\n if (this.stateSpec != null) {\n if (!util.arraysEqual(this.stateSpec.map(spec => spec.shape[spec.shape.length - 1]), stateSize)) {\n throw new ValueError(`An initialState was passed that is not compatible with ` +\n `cell.stateSize. Received stateSpec=${this.stateSpec}; ` +\n `However cell.stateSize is ${this.cell.stateSize}`);\n }\n }\n else {\n this.stateSpec =\n stateSize.map(dim => new InputSpec({ shape: [null, dim] }));\n }\n if (this.stateful) {\n this.resetStates();\n }\n }\n /**\n * Reset the state tensors of the RNN.\n *\n * If the `states` argument is `undefined` or `null`, will set the\n * state tensor(s) of the RNN to all-zero tensors of the appropriate\n * shape(s).\n *\n * If `states` is provided, will set the state tensors of the RNN to its\n * value.\n *\n * @param states Optional externally-provided initial states.\n * @param training Whether this call is done during training. For stateful\n * RNNs, this affects whether the old states are kept or discarded. In\n * particular, if `training` is `true`, the old states will be kept so\n * that subsequent backpropgataion through time (BPTT) may work properly.\n * Else, the old states will be discarded.\n */\n resetStates(states, training = false) {\n tidy(() => {\n if (!this.stateful) {\n throw new AttributeError('Cannot call resetStates() on an RNN Layer that is not stateful.');\n }\n const batchSize = this.inputSpec[0].shape[0];\n if (batchSize == null) {\n throw new ValueError('If an RNN is stateful, it needs to know its batch size. Specify ' +\n 'the batch size of your input tensors: \\n' +\n '- If using a Sequential model, specify the batch size by ' +\n 'passing a `batchInputShape` option to your first layer.\\n' +\n '- If using the functional API, specify the batch size by ' +\n 'passing a `batchShape` option to your Input layer.');\n }\n // Initialize state if null.\n if (this.states_ == null) {\n if (Array.isArray(this.cell.stateSize)) {\n this.states_ =\n this.cell.stateSize.map(dim => tfc.zeros([batchSize, dim]));\n }\n else {\n this.states_ = [tfc.zeros([batchSize, this.cell.stateSize])];\n }\n }\n else if (states == null) {\n // Dispose old state tensors.\n tfc.dispose(this.states_);\n // For stateful RNNs, fully dispose kept old states.\n if (this.keptStates != null) {\n tfc.dispose(this.keptStates);\n this.keptStates = [];\n }\n if (Array.isArray(this.cell.stateSize)) {\n this.states_ =\n this.cell.stateSize.map(dim => tfc.zeros([batchSize, dim]));\n }\n else {\n this.states_[0] = tfc.zeros([batchSize, this.cell.stateSize]);\n }\n }\n else {\n if (!Array.isArray(states)) {\n states = [states];\n }\n if (states.length !== this.states_.length) {\n throw new ValueError(`Layer ${this.name} expects ${this.states_.length} state(s), ` +\n `but it received ${states.length} state value(s). Input ` +\n `received: ${states}`);\n }\n if (training === true) {\n // Store old state tensors for complete disposal later, i.e., during\n // the next no-arg call to this method. We do not dispose the old\n // states immediately because that BPTT (among other things) require\n // them.\n this.keptStates.push(this.states_.slice());\n }\n else {\n tfc.dispose(this.states_);\n }\n for (let index = 0; index < this.states_.length; ++index) {\n const value = states[index];\n const dim = Array.isArray(this.cell.stateSize) ?\n this.cell.stateSize[index] :\n this.cell.stateSize;\n const expectedShape = [batchSize, dim];\n if (!util.arraysEqual(value.shape, expectedShape)) {\n throw new ValueError(`State ${index} is incompatible with layer ${this.name}: ` +\n `expected shape=${expectedShape}, received shape=${value.shape}`);\n }\n this.states_[index] = value;\n }\n }\n this.states_ = this.states_.map(state => tfc.keep(state.clone()));\n });\n }\n apply(inputs, kwargs) {\n // TODO(cais): Figure out whether initialState is in kwargs or inputs.\n let initialState = kwargs == null ? null : kwargs['initialState'];\n let constants = kwargs == null ? null : kwargs['constants'];\n if (kwargs == null) {\n kwargs = {};\n }\n const standardized = standardizeArgs(inputs, initialState, constants, this.numConstants);\n inputs = standardized.inputs;\n initialState = standardized.initialState;\n constants = standardized.constants;\n // If any of `initial_state` or `constants` are specified and are\n // `tf.SymbolicTensor`s, then add them to the inputs and temporarily modify\n // the input_spec to include them.\n let additionalInputs = [];\n let additionalSpecs = [];\n if (initialState != null) {\n kwargs['initialState'] = initialState;\n additionalInputs = additionalInputs.concat(initialState);\n this.stateSpec = [];\n for (const state of initialState) {\n this.stateSpec.push(new InputSpec({ shape: state.shape }));\n }\n // TODO(cais): Use the following instead.\n // this.stateSpec = initialState.map(state => new InputSpec({shape:\n // state.shape}));\n additionalSpecs = additionalSpecs.concat(this.stateSpec);\n }\n if (constants != null) {\n kwargs['constants'] = constants;\n additionalInputs = additionalInputs.concat(constants);\n // TODO(cais): Add this.constantsSpec.\n this.numConstants = constants.length;\n }\n const isTensor = additionalInputs[0] instanceof SymbolicTensor;\n if (isTensor) {\n // Compute full input spec, including state and constants.\n const fullInput = [inputs].concat(additionalInputs);\n const fullInputSpec = this.inputSpec.concat(additionalSpecs);\n // Perform the call with temporarily replaced inputSpec.\n const originalInputSpec = this.inputSpec;\n this.inputSpec = fullInputSpec;\n const output = super.apply(fullInput, kwargs);\n this.inputSpec = originalInputSpec;\n return output;\n }\n else {\n return super.apply(inputs, kwargs);\n }\n }\n // tslint:disable-next-line:no-any\n call(inputs, kwargs) {\n // Input shape: `[samples, time (padded with zeros), input_dim]`.\n // Note that the .build() method of subclasses **must** define\n // this.inputSpec and this.stateSpec owith complete input shapes.\n return tidy(() => {\n const mask = kwargs == null ? null : kwargs['mask'];\n const training = kwargs == null ? null : kwargs['training'];\n let initialState = kwargs == null ? null : kwargs['initialState'];\n inputs = getExactlyOneTensor(inputs);\n if (initialState == null) {\n if (this.stateful) {\n initialState = this.states_;\n }\n else {\n initialState = this.getInitialState(inputs);\n }\n }\n const numStates = Array.isArray(this.cell.stateSize) ? this.cell.stateSize.length : 1;\n if (initialState.length !== numStates) {\n throw new ValueError(`RNN Layer has ${numStates} state(s) but was passed ` +\n `${initialState.length} initial state(s).`);\n }\n if (this.unroll) {\n console.warn('Ignoring unroll = true for RNN layer, due to imperative backend.');\n }\n const cellCallKwargs = { training };\n // TODO(cais): Add support for constants.\n const step = (inputs, states) => {\n // `inputs` and `states` are concatenated to form a single `Array` of\n // `tf.Tensor`s as the input to `cell.call()`.\n const outputs = this.cell.call([inputs].concat(states), cellCallKwargs);\n // Marshall the return value into output and new states.\n return [outputs[0], outputs.slice(1)];\n };\n // TODO(cais): Add support for constants.\n const rnnOutputs = rnn(step, inputs, initialState, this.goBackwards, mask, null, this.unroll, this.returnSequences);\n const lastOutput = rnnOutputs[0];\n const outputs = rnnOutputs[1];\n const states = rnnOutputs[2];\n if (this.stateful) {\n this.resetStates(states, training);\n }\n const output = this.returnSequences ? outputs : lastOutput;\n // TODO(cais): Porperty set learning phase flag.\n if (this.returnState) {\n return [output].concat(states);\n }\n else {\n return output;\n }\n });\n }\n getInitialState(inputs) {\n return tidy(() => {\n // Build an all-zero tensor of shape [samples, outputDim].\n // [Samples, timeSteps, inputDim].\n let initialState = tfc.zeros(inputs.shape);\n // [Samples].\n initialState = tfc.sum(initialState, [1, 2]);\n initialState = K.expandDims(initialState); // [Samples, 1].\n if (Array.isArray(this.cell.stateSize)) {\n return this.cell.stateSize.map(dim => dim > 1 ? K.tile(initialState, [1, dim]) : initialState);\n }\n else {\n return this.cell.stateSize > 1 ?\n [K.tile(initialState, [1, this.cell.stateSize])] :\n [initialState];\n }\n });\n }\n get trainableWeights() {\n if (!this.trainable) {\n return [];\n }\n // Porting Note: In TypeScript, `this` is always an instance of `Layer`.\n return this.cell.trainableWeights;\n }\n get nonTrainableWeights() {\n // Porting Note: In TypeScript, `this` is always an instance of `Layer`.\n if (!this.trainable) {\n return this.cell.weights;\n }\n return this.cell.nonTrainableWeights;\n }\n setFastWeightInitDuringBuild(value) {\n super.setFastWeightInitDuringBuild(value);\n if (this.cell != null) {\n this.cell.setFastWeightInitDuringBuild(value);\n }\n }\n getConfig() {\n const baseConfig = super.getConfig();\n const config = {\n returnSequences: this.returnSequences,\n returnState: this.returnState,\n goBackwards: this.goBackwards,\n stateful: this.stateful,\n unroll: this.unroll,\n };\n if (this.numConstants != null) {\n config['numConstants'] = this.numConstants;\n }\n const cellConfig = this.cell.getConfig();\n if (this.getClassName() === RNN.className) {\n config['cell'] = {\n 'className': this.cell.getClassName(),\n 'config': cellConfig,\n };\n }\n // this order is necessary, to prevent cell name from replacing layer name\n return Object.assign({}, cellConfig, baseConfig, config);\n }\n /** @nocollapse */\n static fromConfig(cls, config, customObjects = {}) {\n const cellConfig = config['cell'];\n const cell = deserialize(cellConfig, customObjects);\n return new cls(Object.assign(config, { cell }));\n }\n}\n/** @nocollapse */\nRNN.className = 'RNN';\nserialization.registerClass(RNN);\n// Porting Note: This is a common parent class for RNN cells. There is no\n// equivalent of this in PyKeras. Having a common parent class forgoes the\n// need for `has_attr(cell, ...)` checks or its TypeScript equivalent.\n/**\n * An RNNCell layer.\n *\n * @doc {heading: 'Layers', subheading: 'Classes'}\n */\nexport class RNNCell extends Layer {\n}\nexport class SimpleRNNCell extends RNNCell {\n constructor(args) {\n super(args);\n this.DEFAULT_ACTIVATION = 'tanh';\n this.DEFAULT_KERNEL_INITIALIZER = 'glorotNormal';\n this.DEFAULT_RECURRENT_INITIALIZER = 'orthogonal';\n this.DEFAULT_BIAS_INITIALIZER = 'zeros';\n this.units = args.units;\n assertPositiveInteger(this.units, `units`);\n this.activation = getActivation(args.activation == null ? this.DEFAULT_ACTIVATION : args.activation);\n this.useBias = args.useBias == null ? true : args.useBias;\n this.kernelInitializer = getInitializer(args.kernelInitializer || this.DEFAULT_KERNEL_INITIALIZER);\n this.recurrentInitializer = getInitializer(args.recurrentInitializer || this.DEFAULT_RECURRENT_INITIALIZER);\n this.biasInitializer =\n getInitializer(args.biasInitializer || this.DEFAULT_BIAS_INITIALIZER);\n this.kernelRegularizer = getRegularizer(args.kernelRegularizer);\n this.recurrentRegularizer = getRegularizer(args.recurrentRegularizer);\n this.biasRegularizer = getRegularizer(args.biasRegularizer);\n this.kernelConstraint = getConstraint(args.kernelConstraint);\n this.recurrentConstraint = getConstraint(args.recurrentConstraint);\n this.biasConstraint = getConstraint(args.biasConstraint);\n this.dropout = math_utils.min([1, math_utils.max([0, args.dropout == null ? 0 : args.dropout])]);\n this.recurrentDropout = math_utils.min([\n 1,\n math_utils.max([0, args.recurrentDropout == null ? 0 : args.recurrentDropout])\n ]);\n this.dropoutFunc = args.dropoutFunc;\n this.stateSize = this.units;\n this.dropoutMask = null;\n this.recurrentDropoutMask = null;\n }\n build(inputShape) {\n inputShape = getExactlyOneShape(inputShape);\n // TODO(cais): Use regularizer.\n this.kernel = this.addWeight('kernel', [inputShape[inputShape.length - 1], this.units], null, this.kernelInitializer, this.kernelRegularizer, true, this.kernelConstraint);\n this.recurrentKernel = this.addWeight('recurrent_kernel', [this.units, this.units], null, this.recurrentInitializer, this.recurrentRegularizer, true, this.recurrentConstraint);\n if (this.useBias) {\n this.bias = this.addWeight('bias', [this.units], null, this.biasInitializer, this.biasRegularizer, true, this.biasConstraint);\n }\n else {\n this.bias = null;\n }\n this.built = true;\n }\n // Porting Note: PyKeras' equivalent of this method takes two tensor inputs:\n // `inputs` and `states`. Here, the two tensors are combined into an\n // `Tensor[]` Array as the first input argument.\n // Similarly, PyKeras' equivalent of this method returns two values:\n // `output` and `[output]`. Here the two are combined into one length-2\n // `Tensor[]`, consisting of `output` repeated.\n call(inputs, kwargs) {\n return tidy(() => {\n inputs = inputs;\n if (inputs.length !== 2) {\n throw new ValueError(`SimpleRNNCell expects 2 input Tensors, got ${inputs.length}.`);\n }\n let prevOutput = inputs[1];\n inputs = inputs[0];\n const training = kwargs['training'] == null ? false : kwargs['training'];\n if (0 < this.dropout && this.dropout < 1 && this.dropoutMask == null) {\n this.dropoutMask = generateDropoutMask({\n ones: () => tfc.onesLike(inputs),\n rate: this.dropout,\n training,\n dropoutFunc: this.dropoutFunc,\n });\n }\n if (0 < this.recurrentDropout && this.recurrentDropout < 1 &&\n this.recurrentDropoutMask == null) {\n this.recurrentDropoutMask = generateDropoutMask({\n ones: () => tfc.onesLike(prevOutput),\n rate: this.recurrentDropout,\n training,\n dropoutFunc: this.dropoutFunc,\n });\n }\n let h;\n const dpMask = this.dropoutMask;\n const recDpMask = this.recurrentDropoutMask;\n if (dpMask != null) {\n h = K.dot(tfc.mul(inputs, dpMask), this.kernel.read());\n }\n else {\n h = K.dot(inputs, this.kernel.read());\n }\n if (this.bias != null) {\n h = K.biasAdd(h, this.bias.read());\n }\n if (recDpMask != null) {\n prevOutput = tfc.mul(prevOutput, recDpMask);\n }\n let output = tfc.add(h, K.dot(prevOutput, this.recurrentKernel.read()));\n if (this.activation != null) {\n output = this.activation.apply(output);\n }\n // TODO(cais): Properly set learning phase on output tensor?\n return [output, output];\n });\n }\n getConfig() {\n const baseConfig = super.getConfig();\n const config = {\n units: this.units,\n activation: serializeActivation(this.activation),\n useBias: this.useBias,\n kernelInitializer: serializeInitializer(this.kernelInitializer),\n recurrentInitializer: serializeInitializer(this.recurrentInitializer),\n biasInitializer: serializeInitializer(this.biasInitializer),\n kernelRegularizer: serializeRegularizer(this.kernelRegularizer),\n recurrentRegularizer: serializeRegularizer(this.recurrentRegularizer),\n biasRegularizer: serializeRegularizer(this.biasRegularizer),\n activityRegularizer: serializeRegularizer(this.activityRegularizer),\n kernelConstraint: serializeConstraint(this.kernelConstraint),\n recurrentConstraint: serializeConstraint(this.recurrentConstraint),\n biasConstraint: serializeConstraint(this.biasConstraint),\n dropout: this.dropout,\n recurrentDropout: this.recurrentDropout,\n };\n return Object.assign({}, baseConfig, config);\n }\n}\n/** @nocollapse */\nSimpleRNNCell.className = 'SimpleRNNCell';\nserialization.registerClass(SimpleRNNCell);\nexport class SimpleRNN extends RNN {\n constructor(args) {\n args.cell = new SimpleRNNCell(args);\n super(args);\n // TODO(cais): Add activityRegularizer.\n }\n call(inputs, kwargs) {\n return tidy(() => {\n if (this.cell.dropoutMask != null) {\n tfc.dispose(this.cell.dropoutMask);\n this.cell.dropoutMask = null;\n }\n if (this.cell.recurrentDropoutMask != null) {\n tfc.dispose(this.cell.recurrentDropoutMask);\n this.cell.recurrentDropoutMask = null;\n }\n const mask = kwargs == null ? null : kwargs['mask'];\n const training = kwargs == null ? null : kwargs['training'];\n const initialState = kwargs == null ? null : kwargs['initialState'];\n return super.call(inputs, { mask, training, initialState });\n });\n }\n /** @nocollapse */\n static fromConfig(cls, config) {\n return new cls(config);\n }\n}\n/** @nocollapse */\nSimpleRNN.className = 'SimpleRNN';\nserialization.registerClass(SimpleRNN);\nexport class GRUCell extends RNNCell {\n constructor(args) {\n super(args);\n this.DEFAULT_ACTIVATION = 'tanh';\n this.DEFAULT_RECURRENT_ACTIVATION = 'hardSigmoid';\n this.DEFAULT_KERNEL_INITIALIZER = 'glorotNormal';\n this.DEFAULT_RECURRENT_INITIALIZER = 'orthogonal';\n this.DEFAULT_BIAS_INITIALIZER = 'zeros';\n if (args.resetAfter) {\n throw new ValueError(`GRUCell does not support reset_after parameter set to true.`);\n }\n this.units = args.units;\n assertPositiveInteger(this.units, 'units');\n this.activation = getActivation(args.activation === undefined ? this.DEFAULT_ACTIVATION :\n args.activation);\n this.recurrentActivation = getActivation(args.recurrentActivation === undefined ?\n this.DEFAULT_RECURRENT_ACTIVATION :\n args.recurrentActivation);\n this.useBias = args.useBias == null ? true : args.useBias;\n this.kernelInitializer = getInitializer(args.kernelInitializer || this.DEFAULT_KERNEL_INITIALIZER);\n this.recurrentInitializer = getInitializer(args.recurrentInitializer || this.DEFAULT_RECURRENT_INITIALIZER);\n this.biasInitializer =\n getInitializer(args.biasInitializer || this.DEFAULT_BIAS_INITIALIZER);\n this.kernelRegularizer = getRegularizer(args.kernelRegularizer);\n this.recurrentRegularizer = getRegularizer(args.recurrentRegularizer);\n this.biasRegularizer = getRegularizer(args.biasRegularizer);\n this.kernelConstraint = getConstraint(args.kernelConstraint);\n this.recurrentConstraint = getConstraint(args.recurrentConstraint);\n this.biasConstraint = getConstraint(args.biasConstraint);\n this.dropout = math_utils.min([1, math_utils.max([0, args.dropout == null ? 0 : args.dropout])]);\n this.recurrentDropout = math_utils.min([\n 1,\n math_utils.max([0, args.recurrentDropout == null ? 0 : args.recurrentDropout])\n ]);\n this.dropoutFunc = args.dropoutFunc;\n this.implementation = args.implementation;\n this.stateSize = this.units;\n this.dropoutMask = null;\n this.recurrentDropoutMask = null;\n }\n build(inputShape) {\n inputShape = getExactlyOneShape(inputShape);\n const inputDim = inputShape[inputShape.length - 1];\n this.kernel = this.addWeight('kernel', [inputDim, this.units * 3], null, this.kernelInitializer, this.kernelRegularizer, true, this.kernelConstraint);\n this.recurrentKernel = this.addWeight('recurrent_kernel', [this.units, this.units * 3], null, this.recurrentInitializer, this.recurrentRegularizer, true, this.recurrentConstraint);\n if (this.useBias) {\n this.bias = this.addWeight('bias', [this.units * 3], null, this.biasInitializer, this.biasRegularizer, true, this.biasConstraint);\n }\n else {\n this.bias = null;\n }\n // Porting Notes: Unlike the PyKeras implementation, we perform slicing\n // of the weights and bias in the call() method, at execution time.\n this.built = true;\n }\n call(inputs, kwargs) {\n return tidy(() => {\n inputs = inputs;\n if (inputs.length !== 2) {\n throw new ValueError(`GRUCell expects 2 input Tensors (inputs, h, c), got ` +\n `${inputs.length}.`);\n }\n const training = kwargs['training'] == null ? false : kwargs['training'];\n let hTMinus1 = inputs[1]; // Previous memory state.\n inputs = inputs[0];\n // Note: For superior performance, TensorFlow.js always uses\n // implementation 2, regardless of the actual value of\n // config.implementation.\n if (0 < this.dropout && this.dropout < 1 && this.dropoutMask == null) {\n this.dropoutMask = generateDropoutMask({\n ones: () => tfc.onesLike(inputs),\n rate: this.dropout,\n training,\n count: 3,\n dropoutFunc: this.dropoutFunc,\n });\n }\n if (0 < this.recurrentDropout && this.recurrentDropout < 1 &&\n this.recurrentDropoutMask == null) {\n this.recurrentDropoutMask = generateDropoutMask({\n ones: () => tfc.onesLike(hTMinus1),\n rate: this.recurrentDropout,\n training,\n count: 3,\n dropoutFunc: this.dropoutFunc,\n });\n }\n const dpMask = this.dropoutMask;\n const recDpMask = this.recurrentDropoutMask;\n let z;\n let r;\n let hh;\n if (0 < this.dropout && this.dropout < 1) {\n inputs = tfc.mul(inputs, dpMask[0]);\n }\n let matrixX = K.dot(inputs, this.kernel.read());\n if (this.useBias) {\n matrixX = K.biasAdd(matrixX, this.bias.read());\n }\n if (0 < this.recurrentDropout && this.recurrentDropout < 1) {\n hTMinus1 = tfc.mul(hTMinus1, recDpMask[0]);\n }\n const recurrentKernelValue = this.recurrentKernel.read();\n const [rk1, rk2] = tfc.split(recurrentKernelValue, [2 * this.units, this.units], recurrentKernelValue.rank - 1);\n const matrixInner = K.dot(hTMinus1, rk1);\n const [xZ, xR, xH] = tfc.split(matrixX, 3, matrixX.rank - 1);\n const [recurrentZ, recurrentR] = tfc.split(matrixInner, 2, matrixInner.rank - 1);\n z = this.recurrentActivation.apply(tfc.add(xZ, recurrentZ));\n r = this.recurrentActivation.apply(tfc.add(xR, recurrentR));\n const recurrentH = K.dot(tfc.mul(r, hTMinus1), rk2);\n hh = this.activation.apply(tfc.add(xH, recurrentH));\n const h = tfc.add(tfc.mul(z, hTMinus1), tfc.mul(tfc.add(1, tfc.neg(z)), hh));\n // TODO(cais): Add use_learning_phase flag properly.\n return [h, h];\n });\n }\n getConfig() {\n const baseConfig = super.getConfig();\n const config = {\n units: this.units,\n activation: serializeActivation(this.activation),\n recurrentActivation: serializeActivation(this.recurrentActivation),\n useBias: this.useBias,\n kernelInitializer: serializeInitializer(this.kernelInitializer),\n recurrentInitializer: serializeInitializer(this.recurrentInitializer),\n biasInitializer: serializeInitializer(this.biasInitializer),\n kernelRegularizer: serializeRegularizer(this.kernelRegularizer),\n recurrentRegularizer: serializeRegularizer(this.recurrentRegularizer),\n biasRegularizer: serializeRegularizer(this.biasRegularizer),\n activityRegularizer: serializeRegularizer(this.activityRegularizer),\n kernelConstraint: serializeConstraint(this.kernelConstraint),\n recurrentConstraint: serializeConstraint(this.recurrentConstraint),\n biasConstraint: serializeConstraint(this.biasConstraint),\n dropout: this.dropout,\n recurrentDropout: this.recurrentDropout,\n implementation: this.implementation,\n resetAfter: false\n };\n return Object.assign({}, baseConfig, config);\n }\n}\n/** @nocollapse */\nGRUCell.className = 'GRUCell';\nserialization.registerClass(GRUCell);\nexport class GRU extends RNN {\n constructor(args) {\n if (args.implementation === 0) {\n console.warn('`implementation=0` has been deprecated, and now defaults to ' +\n '`implementation=1`. Please update your layer call.');\n }\n args.cell = new GRUCell(args);\n super(args);\n // TODO(cais): Add activityRegularizer.\n }\n call(inputs, kwargs) {\n return tidy(() => {\n if (this.cell.dropoutMask != null) {\n tfc.dispose(this.cell.dropoutMask);\n this.cell.dropoutMask = null;\n }\n if (this.cell.recurrentDropoutMask != null) {\n tfc.dispose(this.cell.recurrentDropoutMask);\n this.cell.recurrentDropoutMask = null;\n }\n const mask = kwargs == null ? null : kwargs['mask'];\n const training = kwargs == null ? null : kwargs['training'];\n const initialState = kwargs == null ? null : kwargs['initialState'];\n return super.call(inputs, { mask, training, initialState });\n });\n }\n /** @nocollapse */\n static fromConfig(cls, config) {\n if (config['implmentation'] === 0) {\n config['implementation'] = 1;\n }\n return new cls(config);\n }\n}\n/** @nocollapse */\nGRU.className = 'GRU';\nserialization.registerClass(GRU);\nexport class LSTMCell extends RNNCell {\n constructor(args) {\n super(args);\n this.DEFAULT_ACTIVATION = 'tanh';\n this.DEFAULT_RECURRENT_ACTIVATION = 'hardSigmoid';\n this.DEFAULT_KERNEL_INITIALIZER = 'glorotNormal';\n this.DEFAULT_RECURRENT_INITIALIZER = 'orthogonal';\n this.DEFAULT_BIAS_INITIALIZER = 'zeros';\n this.units = args.units;\n assertPositiveInteger(this.units, 'units');\n this.activation = getActivation(args.activation === undefined ? this.DEFAULT_ACTIVATION :\n args.activation);\n this.recurrentActivation = getActivation(args.recurrentActivation === undefined ?\n this.DEFAULT_RECURRENT_ACTIVATION :\n args.recurrentActivation);\n this.useBias = args.useBias == null ? true : args.useBias;\n this.kernelInitializer = getInitializer(args.kernelInitializer || this.DEFAULT_KERNEL_INITIALIZER);\n this.recurrentInitializer = getInitializer(args.recurrentInitializer || this.DEFAULT_RECURRENT_INITIALIZER);\n this.biasInitializer =\n getInitializer(args.biasInitializer || this.DEFAULT_BIAS_INITIALIZER);\n this.unitForgetBias = args.unitForgetBias;\n this.kernelRegularizer = getRegularizer(args.kernelRegularizer);\n this.recurrentRegularizer = getRegularizer(args.recurrentRegularizer);\n this.biasRegularizer = getRegularizer(args.biasRegularizer);\n this.kernelConstraint = getConstraint(args.kernelConstraint);\n this.recurrentConstraint = getConstraint(args.recurrentConstraint);\n this.biasConstraint = getConstraint(args.biasConstraint);\n this.dropout = math_utils.min([1, math_utils.max([0, args.dropout == null ? 0 : args.dropout])]);\n this.recurrentDropout = math_utils.min([\n 1,\n math_utils.max([0, args.recurrentDropout == null ? 0 : args.recurrentDropout])\n ]);\n this.dropoutFunc = args.dropoutFunc;\n this.implementation = args.implementation;\n this.stateSize = [this.units, this.units];\n this.dropoutMask = null;\n this.recurrentDropoutMask = null;\n }\n build(inputShape) {\n var _a;\n inputShape = getExactlyOneShape(inputShape);\n const inputDim = inputShape[inputShape.length - 1];\n this.kernel = this.addWeight('kernel', [inputDim, this.units * 4], null, this.kernelInitializer, this.kernelRegularizer, true, this.kernelConstraint);\n this.recurrentKernel = this.addWeight('recurrent_kernel', [this.units, this.units * 4], null, this.recurrentInitializer, this.recurrentRegularizer, true, this.recurrentConstraint);\n let biasInitializer;\n if (this.useBias) {\n if (this.unitForgetBias) {\n const capturedBiasInit = this.biasInitializer;\n const capturedUnits = this.units;\n biasInitializer = new (_a = class CustomInit extends Initializer {\n apply(shape, dtype) {\n // TODO(cais): More informative variable names?\n const bI = capturedBiasInit.apply([capturedUnits]);\n const bF = (new Ones()).apply([capturedUnits]);\n const bCAndH = capturedBiasInit.apply([capturedUnits * 2]);\n return K.concatAlongFirstAxis(K.concatAlongFirstAxis(bI, bF), bCAndH);\n }\n },\n /** @nocollapse */\n _a.className = 'CustomInit',\n _a)();\n }\n else {\n biasInitializer = this.biasInitializer;\n }\n this.bias = this.addWeight('bias', [this.units * 4], null, biasInitializer, this.biasRegularizer, true, this.biasConstraint);\n }\n else {\n this.bias = null;\n }\n // Porting Notes: Unlike the PyKeras implementation, we perform slicing\n // of the weights and bias in the call() method, at execution time.\n this.built = true;\n }\n call(inputs, kwargs) {\n return tidy(() => {\n const training = kwargs['training'] == null ? false : kwargs['training'];\n inputs = inputs;\n if (inputs.length !== 3) {\n throw new ValueError(`LSTMCell expects 3 input Tensors (inputs, h, c), got ` +\n `${inputs.length}.`);\n }\n let hTMinus1 = inputs[1]; // Previous memory state.\n const cTMinus1 = inputs[2]; // Previous carry state.\n inputs = inputs[0];\n if (0 < this.dropout && this.dropout < 1 && this.dropoutMask == null) {\n this.dropoutMask = generateDropoutMask({\n ones: () => tfc.onesLike(inputs),\n rate: this.dropout,\n training,\n count: 4,\n dropoutFunc: this.dropoutFunc\n });\n }\n if (0 < this.recurrentDropout && this.recurrentDropout < 1 &&\n this.recurrentDropoutMask == null) {\n this.recurrentDropoutMask = generateDropoutMask({\n ones: () => tfc.onesLike(hTMinus1),\n rate: this.recurrentDropout,\n training,\n count: 4,\n dropoutFunc: this.dropoutFunc\n });\n }\n const dpMask = this.dropoutMask;\n const recDpMask = this.recurrentDropoutMask;\n // Note: For superior performance, TensorFlow.js always uses\n // implementation 2 regardless of the actual value of\n // config.implementation.\n let i;\n let f;\n let c;\n let o;\n if (0 < this.dropout && this.dropout < 1) {\n inputs = tfc.mul(inputs, dpMask[0]);\n }\n let z = K.dot(inputs, this.kernel.read());\n if (0 < this.recurrentDropout && this.recurrentDropout < 1) {\n hTMinus1 = tfc.mul(hTMinus1, recDpMask[0]);\n }\n z = tfc.add(z, K.dot(hTMinus1, this.recurrentKernel.read()));\n if (this.useBias) {\n z = K.biasAdd(z, this.bias.read());\n }\n const [z0, z1, z2, z3] = tfc.split(z, 4, z.rank - 1);\n i = this.recurrentActivation.apply(z0);\n f = this.recurrentActivation.apply(z1);\n c = tfc.add(tfc.mul(f, cTMinus1), tfc.mul(i, this.activation.apply(z2)));\n o = this.recurrentActivation.apply(z3);\n const h = tfc.mul(o, this.activation.apply(c));\n // TODO(cais): Add use_learning_phase flag properly.\n return [h, h, c];\n });\n }\n getConfig() {\n const baseConfig = super.getConfig();\n const config = {\n units: this.units,\n activation: serializeActivation(this.activation),\n recurrentActivation: serializeActivation(this.recurrentActivation),\n useBias: this.useBias,\n kernelInitializer: serializeInitializer(this.kernelInitializer),\n recurrentInitializer: serializeInitializer(this.recurrentInitializer),\n biasInitializer: serializeInitializer(this.biasInitializer),\n unitForgetBias: this.unitForgetBias,\n kernelRegularizer: serializeRegularizer(this.kernelRegularizer),\n recurrentRegularizer: serializeRegularizer(this.recurrentRegularizer),\n biasRegularizer: serializeRegularizer(this.biasRegularizer),\n activityRegularizer: serializeRegularizer(this.activityRegularizer),\n kernelConstraint: serializeConstraint(this.kernelConstraint),\n recurrentConstraint: serializeConstraint(this.recurrentConstraint),\n biasConstraint: serializeConstraint(this.biasConstraint),\n dropout: this.dropout,\n recurrentDropout: this.recurrentDropout,\n implementation: this.implementation,\n };\n return Object.assign({}, baseConfig, config);\n }\n}\n/** @nocollapse */\nLSTMCell.className = 'LSTMCell';\nserialization.registerClass(LSTMCell);\nexport class LSTM extends RNN {\n constructor(args) {\n if (args.implementation === 0) {\n console.warn('`implementation=0` has been deprecated, and now defaults to ' +\n '`implementation=1`. Please update your layer call.');\n }\n args.cell = new LSTMCell(args);\n super(args);\n // TODO(cais): Add activityRegularizer.\n }\n call(inputs, kwargs) {\n return tidy(() => {\n if (this.cell.dropoutMask != null) {\n tfc.dispose(this.cell.dropoutMask);\n this.cell.dropoutMask = null;\n }\n if (this.cell.recurrentDropoutMask != null) {\n tfc.dispose(this.cell.recurrentDropoutMask);\n this.cell.recurrentDropoutMask = null;\n }\n const mask = kwargs == null ? null : kwargs['mask'];\n const training = kwargs == null ? null : kwargs['training'];\n const initialState = kwargs == null ? null : kwargs['initialState'];\n return super.call(inputs, { mask, training, initialState });\n });\n }\n /** @nocollapse */\n static fromConfig(cls, config) {\n if (config['implmentation'] === 0) {\n config['implementation'] = 1;\n }\n return new cls(config);\n }\n}\n/** @nocollapse */\nLSTM.className = 'LSTM';\nserialization.registerClass(LSTM);\nexport class StackedRNNCells extends RNNCell {\n constructor(args) {\n super(args);\n this.cells = args.cells;\n }\n get stateSize() {\n // States are a flat list in reverse order of the cell stack.\n // This allows perserving the requirement `stack.statesize[0] ===\n // outputDim`. E.g., states of a 2-layer LSTM would be `[h2, c2, h1, c1]`,\n // assuming one LSTM has states `[h, c]`.\n const stateSize = [];\n for (const cell of this.cells.slice().reverse()) {\n if (Array.isArray(cell.stateSize)) {\n stateSize.push(...cell.stateSize);\n }\n else {\n stateSize.push(cell.stateSize);\n }\n }\n return stateSize;\n }\n call(inputs, kwargs) {\n return tidy(() => {\n inputs = inputs;\n let states = inputs.slice(1);\n // Recover per-cell states.\n const nestedStates = [];\n for (const cell of this.cells.slice().reverse()) {\n if (Array.isArray(cell.stateSize)) {\n nestedStates.push(states.splice(0, cell.stateSize.length));\n }\n else {\n nestedStates.push(states.splice(0, 1));\n }\n }\n nestedStates.reverse();\n // Call the cells in order and store the returned states.\n const newNestedStates = [];\n let callInputs;\n for (let i = 0; i < this.cells.length; ++i) {\n const cell = this.cells[i];\n states = nestedStates[i];\n // TODO(cais): Take care of constants.\n if (i === 0) {\n callInputs = [inputs[0]].concat(states);\n }\n else {\n callInputs = [callInputs[0]].concat(states);\n }\n callInputs = cell.call(callInputs, kwargs);\n newNestedStates.push(callInputs.slice(1));\n }\n // Format the new states as a flat list in reverse cell order.\n states = [];\n for (const cellStates of newNestedStates.slice().reverse()) {\n states.push(...cellStates);\n }\n return [callInputs[0]].concat(states);\n });\n }\n build(inputShape) {\n if (isArrayOfShapes(inputShape)) {\n // TODO(cais): Take care of input constants.\n // const constantShape = inputShape.slice(1);\n inputShape = inputShape[0];\n }\n inputShape = inputShape;\n let outputDim;\n this.cells.forEach((cell, i) => {\n nameScope(`RNNCell_${i}`, () => {\n // TODO(cais): Take care of input constants.\n cell.build(inputShape);\n if (Array.isArray(cell.stateSize)) {\n outputDim = cell.stateSize[0];\n }\n else {\n outputDim = cell.stateSize;\n }\n inputShape = [inputShape[0], outputDim];\n });\n });\n this.built = true;\n }\n getConfig() {\n const baseConfig = super.getConfig();\n const getCellConfig = (cell) => {\n return {\n 'className': cell.getClassName(),\n 'config': cell.getConfig(),\n };\n };\n const cellConfigs = this.cells.map(getCellConfig);\n const config = { 'cells': cellConfigs };\n return Object.assign({}, baseConfig, config);\n }\n /** @nocollapse */\n static fromConfig(cls, config, customObjects = {}) {\n const cells = [];\n for (const cellConfig of config['cells']) {\n cells.push(deserialize(cellConfig, customObjects));\n }\n return new cls({ cells });\n }\n get trainableWeights() {\n if (!this.trainable) {\n return [];\n }\n const weights = [];\n for (const cell of this.cells) {\n weights.push(...cell.trainableWeights);\n }\n return weights;\n }\n get nonTrainableWeights() {\n const weights = [];\n for (const cell of this.cells) {\n weights.push(...cell.nonTrainableWeights);\n }\n if (!this.trainable) {\n const trainableWeights = [];\n for (const cell of this.cells) {\n trainableWeights.push(...cell.trainableWeights);\n }\n return trainableWeights.concat(weights);\n }\n return weights;\n }\n /**\n * Retrieve the weights of a the model.\n *\n * @returns A flat `Array` of `tf.Tensor`s.\n */\n getWeights() {\n const weights = [];\n for (const cell of this.cells) {\n weights.push(...cell.weights);\n }\n return batchGetValue(weights);\n }\n /**\n * Set the weights of the model.\n *\n * @param weights An `Array` of `tf.Tensor`s with shapes and types matching\n * the output of `getWeights()`.\n */\n setWeights(weights) {\n const tuples = [];\n for (const cell of this.cells) {\n const numParams = cell.weights.length;\n const inputWeights = weights.splice(numParams);\n for (let i = 0; i < cell.weights.length; ++i) {\n tuples.push([cell.weights[i], inputWeights[i]]);\n }\n }\n batchSetValue(tuples);\n }\n}\n/** @nocollapse */\nStackedRNNCells.className = 'StackedRNNCells';\nserialization.registerClass(StackedRNNCells);\nexport function generateDropoutMask(args) {\n const { ones, rate, training = false, count = 1, dropoutFunc } = args;\n const droppedInputs = () => dropoutFunc != null ? dropoutFunc(ones(), rate) : K.dropout(ones(), rate);\n const createMask = () => K.inTrainPhase(droppedInputs, ones, training);\n // just in case count is provided with null or undefined\n if (!count || count <= 1) {\n return tfc.keep(createMask().clone());\n }\n const masks = Array(count).fill(undefined).map(createMask);\n return masks.map(m => tfc.keep(m.clone()));\n}\n//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicmVjdXJyZW50LmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vLi4vdGZqcy1sYXllcnMvc3JjL2xheWVycy9yZWN1cnJlbnQudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUE7Ozs7Ozs7O0dBUUc7QUFFSDs7R0FFRztBQUVILE9BQU8sS0FBSyxHQUFHLE1BQU0sdUJBQXVCLENBQUM7QUFDN0MsT0FBTyxFQUFXLGFBQWEsRUFBVSxJQUFJLEVBQUUsSUFBSSxFQUFDLE1BQU0sdUJBQXVCLENBQUM7QUFFbEYsT0FBTyxFQUFhLGFBQWEsRUFBRSxtQkFBbUIsRUFBQyxNQUFNLGdCQUFnQixDQUFDO0FBQzlFLE9BQU8sS0FBSyxDQUFDLE1BQU0seUJBQXlCLENBQUM7QUFDN0MsT0FBTyxFQUFDLFNBQVMsRUFBQyxNQUFNLFdBQVcsQ0FBQztBQUNwQyxPQUFPLEVBQW1DLGFBQWEsRUFBRSxtQkFBbUIsRUFBQyxNQUFNLGdCQUFnQixDQUFDO0FBQ3BHLE9BQU8sRUFBQyxTQUFTLEVBQUUsY0FBYyxFQUFDLE1BQU0sb0JBQW9CLENBQUM7QUFDN0QsT0FBTyxFQUFDLEtBQUssRUFBWSxNQUFNLG9CQUFvQixDQUFDO0FBQ3BELE9BQU8sRUFBQyxjQUFjLEVBQUUsbUJBQW1CLEVBQUUsVUFBVSxFQUFDLE1BQU0sV0FBVyxDQUFDO0FBQzFFLE9BQU8sRUFBQyxjQUFjLEVBQUUsV0FBVyxFQUF5QixJQUFJLEVBQUUsb0JBQW9CLEVBQUMsTUFBTSxpQkFBaUIsQ0FBQztBQUcvRyxPQUFPLEVBQUMsY0FBYyxFQUFzQyxvQkFBb0IsRUFBQyxNQUFNLGlCQUFpQixDQUFDO0FBRXpHLE9BQU8sRUFBQyxxQkFBcUIsRUFBQyxNQUFNLHdCQUF3QixDQUFDO0FBQzdELE9BQU8sS0FBSyxVQUFVLE1BQU0scUJBQXFCLENBQUM7QUFDbEQsT0FBTyxFQUFDLGtCQUFrQixFQUFFLG1CQUFtQixFQUFFLGVBQWUsRUFBQyxNQUFNLHNCQUFzQixDQUFD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QUFDO0lBRXZFLHdEQUF3RDtJQUN4RCxJQUFJLENBQUMsS0FBSyxJQUFJLEtBQUssSUFBSSxDQUFDLEVBQUU7UUFDeEIsT0FBTyxHQUFHLENBQUMsSUFBSSxDQUFDLFVBQVUsRUFBRSxDQUFDLEtBQUssRUFBRSxDQUFDLENBQUM7S0FDdkM7SUFFRCxNQUFNLEtBQUssR0FBRyxLQUFLLENBQUMsS0FBSyxDQUFDLENBQUMsSUFBSSxDQUFDLFNBQVMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxVQUFVLENBQUMsQ0FBQztJQUUzRCxPQUFPLEtBQUssQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxHQUFHLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxLQUFLLEVBQUUsQ0FBQyxDQUFDLENBQUM7QUFDN0MsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbIi8qKlxuICogQGxpY2Vuc2VcbiAqIENvcHlyaWdodCAyMDE4IEdvb2dsZSBMTENcbiAqXG4gKiBVc2Ugb2YgdGhpcyBzb3VyY2UgY29kZSBpcyBnb3Zlcm5lZCBieSBhbiBNSVQtc3R5bGVcbiAqIGxpY2Vuc2UgdGhhdCBjYW4gYmUgZm91bmQgaW4gdGhlIExJQ0VOU0UgZmlsZSBvciBhdFxuICogaHR0cHM6Ly9vcGVuc291cmNlLm9yZy9saWNlbnNlcy9NSVQuXG4gKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuICovXG5cbi8qKlxuICogVGVuc29yRmxvdy5qcyBMYXllcnM6IFJlY3VycmVudCBOZXVyYWwgTmV0d29yayBMYXllcnMuXG4gKi9cblxuaW1wb3J0ICogYXMgdGZjIGZyb20gJ0B0ZW5zb3JmbG93L3RmanMtY29yZSc7XG5pbXBvcnQge0RhdGFUeXBlLCBzZXJpYWxpemF0aW9uLCBUZW5zb3IsIHRpZHksIHV0aWx9IGZyb20gJ0B0ZW5zb3JmbG93L3RmanMtY29yZSc7XG5cbmltcG9ydCB7QWN0aXZhdGlvbiwgZ2V0QWN0aXZhdGlvbiwgc2VyaWFsaXplQWN0aXZhdGlvbn0gZnJvbSAnLi4vYWN0aXZhdGlvbnMnO1xuaW1wb3J0ICogYXMgSyBmcm9tICcuLi9iYWNrZW5kL3RmanNfYmFja2VuZCc7XG5pbXBvcnQge25hbWVTY29wZX0gZnJvbSAnLi4vY29tbW9uJztcbmltcG9ydCB7Q29uc3RyYWludCwgQ29uc3RyYWludElkZW50aWZpZXIsIGdldENvbnN0cmFpbnQsIHNlcmlhbGl6ZUNvbnN0cmFpbnR9IGZyb20gJy4uL2NvbnN0cmFpbnRzJztcbmltcG9ydCB7SW5wdXRTcGVjLCBTeW1ib2xpY1RlbnNvcn0gZnJvbSAnLi4vZW5naW5lL3RvcG9sb2d5JztcbmltcG9ydCB7TGF5ZXIsIExheWVyQXJnc30gZnJvbSAnLi4vZW5naW5lL3RvcG9sb2d5JztcbmltcG9ydCB7QXR0cmlidXRlRXJyb3IsIE5vdEltcGxlbWVudGVkRXJyb3IsIFZhbHVlRXJyb3J9IGZyb20gJy4uL2Vycm9ycyc7XG5pbXBvcnQge2dldEluaXRpYWxpemVyLCBJbml0aWFsaXplciwgSW5pdGlhbGl6ZXJJZGVudGlmaWVyLCBPbmVzLCBzZXJpYWxpemVJbml0aWFsaXplcn0gZnJvbSAnLi4vaW5pdGlhbGl6ZXJzJztcbmltcG9ydCB7QWN0aXZhdGlvbklkZW50aWZpZXJ9IGZyb20gJy4uL2tlcmFzX2Zvcm1hdC9hY3RpdmF0aW9uX2NvbmZpZyc7XG5pbXBvcnQge1NoYXBlfSBmcm9tICcuLi9rZXJhc19mb3JtYXQvY29tbW9uJztcbmltcG9ydCB7Z2V0UmVndWxhcml6ZXIsIFJlZ3VsYXJpemVyLCBSZWd1bGFyaXplcklkZW50aWZpZXIsIHNlcmlhbGl6ZVJlZ3VsYXJpemVyfSBmcm9tICcuLi9yZWd1bGFyaXplcnMnO1xuaW1wb3J0IHtLd2FyZ3MsIFJublN0ZXBGdW5jdGlvbn0gZnJvbSAnLi4vdHlwZXMnO1xuaW1wb3J0IHthc3NlcnRQb3NpdGl2ZUludGVnZXJ9IGZyb20gJy4uL3V0aWxzL2dlbmVyaWNfdXRpbHMnO1xuaW1wb3J0ICogYXMgbWF0aF91dGlscyBmcm9tICcuLi91dGlscy9tYXRoX3V0aWxzJztcbmltcG9ydCB7Z2V0RXhhY3RseU9uZVNoYXBlLCBnZXRFeGFjdGx5T25lVGVuc29yLCBpc0FycmF5T2ZTaGFwZXN9IGZyb20gJy4uL3V0aWxzL3R5cGVzX3V0aWxzJztcbmltcG9ydCB7YmF0Y2hHZXRWYWx1ZSwgYmF0Y2hTZXRWYWx1ZSwgTGF5ZXJWYXJpYWJsZX0gZnJvbSAnLi4vdmFyaWFibGVzJztcblxuaW1wb3J0IHtkZXNlcmlhbGl6ZX0gZnJvbSAnLi9zZXJpYWxpemF0aW9uJztcblxuLyoqXG4gKiBTdGFuZGFyZGl6ZSBgYXBwbHkoKWAgYXJncyB0byBhIHNpbmdsZSBsaXN0IG9mIHRlbnNvciBpbnB1dHMuXG4gKlxuICogV2hlbiBydW5uaW5nIGEgbW9kZWwgbG9hZGVkIGZyb20gZmlsZSwgdGhlIGlucHV0IHRlbnNvcnMgYGluaXRpYWxTdGF0ZWAgYW5kXG4gKiBgY29uc3RhbnRzYCBhcmUgcGFzc2VkIHRvIGBSTk4uYXBwbHkoKWAgYXMgcGFydCBvZiBgaW5wdXRzYCBpbnN0ZWFkIG9mIHRoZVxuICogZGVkaWNhdGVkIGt3YXJncyBmaWVsZHMuIGBpbnB1dHNgIGNvbnNpc3RzIG9mXG4gKiBgW2lucHV0cywgaW5pdGlhbFN0YXRlMCwgaW5pdGlhbFN0YXRlMSwgLi4uLCBjb25zdGFudDAsIGNvbnN0YW50MV1gIGluIHRoaXNcbiAqIGNhc2UuXG4gKiBUaGlzIG1ldGhvZCBtYWtlcyBzdXJlIHRoYXQgYXJndW1lbnRzIGFyZVxuICogc2VwYXJhdGVkIGFuZCB0aGF0IGBpbml0aWFsU3RhdGVgIGFuZCBgY29uc3RhbnRzYCBhcmUgYEFycmF5YHMgb2YgdGVuc29yc1xuICogKG9yIE5vbmUpLlxuICpcbiAqIEBwYXJhbSBpbnB1dHMgVGVuc29yIG9yIGBBcnJheWAgb2YgIHRlbnNvcnMuXG4gKiBAcGFyYW0gaW5pdGlhbFN0YXRlIFRlbnNvciBvciBgQXJyYXlgIG9mIHRlbnNvcnMgb3IgYG51bGxgL2B1bmRlZmluZWRgLlxuICogQHBhcmFtIGNvbnN0YW50cyBUZW5zb3Igb3IgYEFycmF5YCBvZiB0ZW5zb3JzIG9yIGBudWxsYC9gdW5kZWZpbmVkYC5cbiAqIEByZXR1cm5zIEFuIG9iamVjdCBjb25zaXN0aW5nIG9mXG4gKiAgIGlucHV0czogQSB0ZW5zb3IuXG4gKiAgIGluaXRpYWxTdGF0ZTogYEFycmF5YCBvZiB0ZW5zb3JzIG9yIGBudWxsYC5cbiAqICAgY29uc3RhbnRzOiBgQXJyYXlgIG9mIHRlbnNvcnMgb3IgYG51bGxgLlxuICogQHRocm93cyBWYWx1ZUVycm9yLCBpZiBgaW5wdXRzYCBpcyBhbiBgQXJyYXlgIGJ1dCBlaXRoZXIgYGluaXRpYWxTdGF0ZWAgb3JcbiAqICAgYGNvbnN0YW50c2AgaXMgcHJvdmlkZWQuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBzdGFuZGFyZGl6ZUFyZ3MoXG4gICAgaW5wdXRzOiBUZW5zb3J8VGVuc29yW118U3ltYm9saWNUZW5zb3J8U3ltYm9saWNUZW5zb3JbXSxcbiAgICBpbml0aWFsU3RhdGU6IFRlbnNvcnxUZW5zb3JbXXxTeW1ib2xpY1RlbnNvcnxTeW1ib2xpY1RlbnNvcltdLFxuICAgIGNvbnN0YW50czogVGVuc29yfFRlbnNvcltdfFN5bWJvbGljVGVuc29yfFN5bWJvbGljVGVuc29yW10sXG4gICAgbnVtQ29uc3RhbnRzPzogbnVtYmVyKToge1xuICBpbnB1dHM6IFRlbnNvcnxTeW1ib2xpY1RlbnNvcixcbiAgaW5pdGlhbFN0YXRlOiBUZW5zb3JbXXxTeW1ib2xpY1RlbnNvcltdLFxuICBjb25zdGFudHM6IFRlbnNvcltdfFN5bWJvbGljVGVuc29yW11cbn0ge1xuICBpZiAoQXJyYXkuaXNBcnJheShpbnB1dHMpKSB7XG4gICAgaWYgKGluaXRpYWxTdGF0ZSAhPSBudWxsIHx8IGNvbnN0YW50cyAhPSBudWxsKSB7XG4gICAgICB0aHJvdyBuZXcgVmFsdWVFcnJvcihcbiAgICAgICAgICAnV2hlbiBpbnB1dHMgaXMgYW4gYXJyYXksIG5laXRoZXIgaW5pdGlhbFN0YXRlIG9yIGNvbnN0YW50cyAnICtcbiAgICAgICAgICAnc2hvdWxkIGJlIHByb3ZpZGVkJyk7XG4gICAgfVxuICAgIGlmIChudW1Db25zdGFudHMgIT0gbnVsbCkge1xuICAgICAgY29uc3RhbnRzID0gaW5wdXRzLnNsaWNlKGlucHV0cy5sZW5ndGggLSBudW1Db25zdGFudHMsIGlucHV0cy5sZW5ndGgpO1xuICAgICAgaW5wdXRzID0gaW5wdXRzLnNsaWNlKDAsIGlucHV0cy5sZW5ndGggLSBudW1Db25zdGFudHMpO1xuICAgIH1cbiAgICBpZiAoaW5wdXRzLmxlbmd0aCA+IDEpIHtcbiAgICAgIGluaXRpYWxTdGF0ZSA9IGlucHV0cy5zbGljZSgxLCBpbnB1dHMubGVuZ3RoKTtcbiAgICB9XG4gICAgaW5wdXRzID0gaW5wdXRzWzBdO1xuICB9XG5cbiAgZnVuY3Rpb24gdG9MaXN0T3JOdWxsKHg6IFRlbnNvcnxUZW5zb3JbXXxTeW1ib2xpY1RlbnNvcnxcbiAgICAgICAgICAgICAgICAgICAgICAgIFN5bWJvbGljVGVuc29yW10pOiBUZW5zb3JbXXxTeW1ib2xpY1RlbnNvcltdIHtcbiAgICBpZiAoeCA9PSBudWxsIHx8IEFycmF5LmlzQXJyYXkoeCkpIHtcbiAgICAgIHJldHVybiB4IGFzIFRlbnNvcltdIHwgU3ltYm9saWNUZW5zb3JbXTtcbiAgICB9IGVsc2Uge1xuICAgICAgcmV0dXJuIFt4XSBhcyBUZW5zb3JbXSB8IFN5bWJvbGljVGVuc29yW107XG4gICAgfVxuICB9XG5cbiAgaW5pdGlhbFN0YXRlID0gdG9MaXN0T3JOdWxsKGluaXRpYWxTdGF0ZSk7XG4gIGNvbnN0YW50cyA9IHRvTGlzdE9yTnVsbChjb25zdGFudHMpO1xuXG4gIHJldHVybiB7aW5wdXRzLCBpbml0aWFsU3RhdGUsIGNvbnN0YW50c307XG59XG5cbi8qKlxuICogSXRlcmF0ZXMgb3ZlciB0aGUgdGltZSBkaW1lbnNpb24gb2YgYSB0ZW5zb3IuXG4gKlxuICogQHBhcmFtIHN0ZXBGdW5jdGlvbiBSTk4gc3RlcCBmdW5jdGlvbi5cbiAqICAgUGFyYW1ldGVyczpcbiAqICAgICBpbnB1dHM6IHRlbnNvciB3aXRoIHNoYXBlIGBbc2FtcGxlcywgLi4uXWAgKG5vIHRpbWUgZGltZW5zaW9uKSxcbiAqICAgICAgIHJlcHJlc2VudGluZyBpbnB1dCBmb3IgdGhlIGJhdGNoIG9mIHNhbXBsZXMgYXQgYSBjZXJ0YWluIHRpbWUgc3RlcC5cbiAqICAgICBzdGF0ZXM6IGFuIEFycmF5IG9mIHRlbnNvcnMuXG4gKiAgIFJldHVybnM6XG4gKiAgICAgb3V0cHV0czogdGVuc29yIHdpdGggc2hhcGUgYFtzYW1wbGVzLCBvdXRwdXREaW1dYCAobm8gdGltZSBkaW1lbnNpb24pLlxuICogICAgIG5ld1N0YXRlczogbGlzdCBvZiB0ZW5zb3JzLCBzYW1lIGxlbmd0aCBhbmQgc2hhcGVzIGFzIGBzdGF0ZXNgLiBUaGUgZmlyc3RcbiAqICAgICAgIHN0YXRlIGluIHRoZSBsaXN0IG11c3QgYmUgdGhlIG91dHB1dCB0ZW5zb3IgYXQgdGhlIHByZXZpb3VzIHRpbWVzdGVwLlxuICogQHBhcmFtIGlucHV0cyBUZW5zb3Igb2YgdGVtcG9yYWwgZGF0YSBvZiBzaGFwZSBgW3NhbXBsZXMsIHRpbWUsIC4uLl1gIChhdFxuICogICBsZWFzdCAzRCkuXG4gKiBAcGFyYW0gaW5pdGlhbFN0YXRlcyBUZW5zb3Igd2l0aCBzaGFwZSBgW3NhbXBsZXMsIG91dHB1dERpbV1gIChubyB0aW1lXG4gKiAgIGRpbWVuc2lvbiksIGNvbnRhaW5pbmcgdGhlIGluaXRpYWwgdmFsdWVzIG9mIHRoZSBzdGF0ZXMgdXNlZCBpbiB0aGUgc3RlcFxuICogICBmdW5jdGlvbi5cbiAqIEBwYXJhbSBnb0JhY2t3YXJkcyBJZiBgdHJ1ZWAsIGRvIHRoZSBpdGVyYXRpb24gb3ZlciB0aGUgdGltZSBkaW1lbnNpb24gaW5cbiAqICAgcmV2ZXJzZSBvcmRlciBhbmQgcmV0dXJuIHRoZSByZXZlcnNlZCBzZXF1ZW5jZS5cbiAqIEBwYXJhbSBtYXNrIEJpbmFyeSB0ZW5zb3Igd2l0aCBzaGFwZSBgW3NhbXBsZSwgdGltZSwgMV1gLCB3aXRoIGEgemVybyBmb3JcbiAqICAgZXZlcnkgZWxlbWVudCB0aGF0IGlzIG1hc2tlZC5cbiAqIEBwYXJhbSBjb25zdGFudHMgQW4gQXJyYXkgb2YgY29uc3RhbnQgdmFsdWVzIHBhc3NlZCBhdCBlYWNoIHN0ZXAuXG4gKiBAcGFyYW0gdW5yb2xsIFdoZXRoZXIgdG8gdW5yb2xsIHRoZSBSTk4gb3IgdG8gdXNlIGEgc3ltYm9saWMgbG9vcC4gKk5vdCpcbiAqICAgYXBwbGljYWJsZSB0byB0aGlzIGltcGVyYXRpdmUgZGVlcGxlYXJuLmpzIGJhY2tlbmQuIEl0cyB2YWx1ZSBpcyBpZ25vcmVkLlxuICogQHBhcmFtIG5lZWRQZXJTdGVwT3V0cHV0cyBXaGV0aGVyIHRoZSBwZXItc3RlcCBvdXRwdXRzIGFyZSB0byBiZVxuICogICBjb25jYXRlbmF0ZWQgaW50byBhIHNpbmdsZSB0ZW5zb3IgYW5kIHJldHVybmVkIChhcyB0aGUgc2Vjb25kIHJldHVyblxuICogICB2YWx1ZSkuIERlZmF1bHQ6IGBmYWxzZWAuIFRoaXMgYXJnIGlzIGluY2x1ZGVkIHNvIHRoYXQgdGhlIHJlbGF0aXZlbHlcbiAqICAgZXhwZW5zaXZlIGNvbmNhdGVuYXRpb24gb2YgdGhlIHN0ZXB3aXNlIG91dHB1dHMgY2FuIGJlIG9taXR0ZWQgdW5sZXNzXG4gKiAgIHRoZSBzdGVwd2lzZSBvdXRwdXRzIG5lZWQgdG8gYmUga2VwdCAoZS5nLiwgZm9yIGFuIExTVE0gbGF5ZXIgb2Ygd2hpY2hcbiAqICAgYHJldHVyblNlcXVlbmNlYCBpcyBgdHJ1ZWAuKVxuICogQHJldHVybnMgQW4gQXJyYXk6IGBbbGFzdE91dHB1dCwgb3V0cHV0cywgbmV3U3RhdGVzXWAuXG4gKiAgIGxhc3RPdXRwdXQ6IHRoZSBsYXN0ZXN0IG91dHB1dCBvZiB0aGUgUk5OLCBvZiBzaGFwZSBgW3NhbXBsZXMsIC4uLl1gLlxuICogICBvdXRwdXRzOiB0ZW5zb3Igd2l0aCBzaGFwZSBgW3NhbXBsZXMsIHRpbWUsIC4uLl1gIHdoZXJlIGVhY2ggZW50cnlcbiAqICAgICBgb3V0cHV0W3MsIHRdYCBpcyB0aGUgb3V0cHV0IG9mIHRoZSBzdGVwIGZ1bmN0aW9uIGF0IHRpbWUgYHRgIGZvciBzYW1wbGVcbiAqICAgICBgc2AuIFRoaXMgcmV0dXJuIHZhbHVlIGlzIHByb3ZpZGVkIGlmIGFuZCBvbmx5IGlmIHRoZVxuICogICAgIGBuZWVkUGVyU3RlcE91dHB1dHNgIGlzIHNldCBhcyBgdHJ1ZWAuIElmIGl0IGlzIHNldCBhcyBgZmFsc2VgLCB0aGlzXG4gKiAgICAgcmV0dXJuIHZhbHVlIHdpbGwgYmUgYHVuZGVmaW5lZGAuXG4gKiAgIG5ld1N0YXRlczogQXJyYXkgb2YgdGVuc29ycywgbGF0ZXN0IHN0YXRlcyByZXR1cm5lZCBieSB0aGUgc3RlcCBmdW5jdGlvbixcbiAqICAgICAgb2Ygc2hhcGUgYChzYW1wbGVzLCAuLi4pYC5cbiAqIEB0aHJvd3MgVmFsdWVFcnJvciBJZiBpbnB1dCBkaW1lbnNpb24gaXMgbGVzcyB0aGFuIDMuXG4gKlxuICogVE9ETyhuaWVsc2VuZSk6IFRoaXMgbmVlZHMgdG8gYmUgdGlkeS1lZC5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHJubihcbiAgICBzdGVwRnVuY3Rpb246IFJublN0ZXBGdW5jdGlvbiwgaW5wdXRzOiBUZW5zb3IsIGluaXRpYWxTdGF0ZXM6IFRlbnNvcltdLFxuICAgIGdvQmFja3dhcmRzID0gZmFsc2UsIG1hc2s/OiBUZW5zb3IsIGNvbnN0YW50cz86IFRlbnNvcltdLCB1bnJvbGwgPSBmYWxzZSxcbiAgICBuZWVkUGVyU3RlcE91dHB1dHMgPSBmYWxzZSk6IFtUZW5zb3IsIFRlbnNvciwgVGVuc29yW11dIHtcbiAgcmV0dXJuIHRmYy50aWR5KCgpID0+IHtcbiAgICBjb25zdCBuZGltID0gaW5wdXRzLnNoYXBlLmxlbmd0aDtcbiAgICBpZiAobmRpbSA8IDMpIHtcbiAgICAgIHRocm93IG5ldyBWYWx1ZUVycm9yKGBJbnB1dCBzaG91bGQgYmUgYXQgbGVhc3QgM0QsIGJ1dCBpcyAke25kaW19RC5gKTtcbiAgICB9XG5cbiAgICAvLyBUcmFuc3Bvc2UgdG8gdGltZS1tYWpvciwgaS5lLiwgZnJvbSBbYmF0Y2gsIHRpbWUsIC4uLl0gdG8gW3RpbWUsIGJhdGNoLFxuICAgIC8vIC4uLl0uXG4gICAgY29uc3QgYXhlcyA9IFsxLCAwXS5jb25jYXQobWF0aF91dGlscy5yYW5nZSgyLCBuZGltKSk7XG4gICAgaW5wdXRzID0gdGZjLnRyYW5zcG9zZShpbnB1dHMsIGF4ZXMpO1xuXG4gICAgaWYgKGNvbnN0YW50cyAhPSBudWxsKSB7XG4gICAgICB0aHJvdyBuZXcgTm90SW1wbGVtZW50ZWRFcnJvcihcbiAgICAgICAgICAnVGhlIHJubigpIGZ1bmN0b2luIG9mIHRoZSBkZWVwbGVhcm4uanMgYmFja2VuZCBkb2VzIG5vdCBzdXBwb3J0ICcgK1xuICAgICAgICAgICdjb25zdGFudHMgeWV0LicpO1xuICAgIH1cblxuICAgIC8vIFBvcnRpbmcgTm90ZTogdGhlIHVucm9sbCBvcHRpb24gaXMgaWdub3JlZCBieSB0aGUgaW1wZXJhdGl2ZSBiYWNrZW5kLlxuICAgIGlmICh1bnJvbGwpIHtcbiAgICAgIGNvbnNvbGUud2FybihcbiAgICAgICAgICAnQmFja2VuZCBybm4oKTogdGhlIHVucm9sbCA9IHRydWUgb3B0aW9uIGlzIG5vdCBhcHBsaWNhYmxlIHRvIHRoZSAnICtcbiAgICAgICAgICAnaW1wZXJhdGl2ZSBkZWVwbGVhcm4uanMgYmFja2VuZC4nKTtcbiAgICB9XG5cbiAgICBpZiAobWFzayAhPSBudWxsKSB7XG4gICAgICBtYXNrID0gdGZjLmNhc3QodGZjLmNhc3QobWFzaywgJ2Jvb2wnKSwgJ2Zsb2F0MzInKTtcbiAgICAgIGlmIChtYXNrLnJhbmsgPT09IG5kaW0gLSAxKSB7XG4gICAgICAgIG1hc2sgPSB0ZmMuZXhwYW5kRGltcyhtYXNrLCAtMSk7XG4gICAgICB9XG4gICAgICBtYXNrID0gdGZjLnRyYW5zcG9zZShtYXNrLCBheGVzKTtcbiAgICB9XG5cbiAgICBpZiAoZ29CYWNrd2FyZHMpIHtcbiAgICAgIGlucHV0cyA9IHRmYy5yZXZlcnNlKGlucHV0cywgMCk7XG4gICAgICBpZiAobWFzayAhPSBudWxsKSB7XG4gICAgICAgIG1hc2sgPSB0ZmMucmV2ZXJzZShtYXNrLCAwKTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICAvLyBQb3J0aW5nIE5vdGU6IFB5S2VyYXMgd2l0aCBUZW5zb3JGbG93IGJhY2tlbmQgdXNlcyBhIHN5bWJvbGljIGxvb3BcbiAgICAvLyAgICh0Zi53aGlsZV9sb29wKS4gQnV0IGZvciB0aGUgaW1wZXJhdGl2ZSBkZWVwbGVhcm4uanMgYmFja2VuZCwgd2UganVzdFxuICAgIC8vICAgdXNlIHRoZSB1c3VhbCBUeXBlU2NyaXB0IGNvbnRyb2wgZmxvdyB0byBpdGVyYXRlIG92ZXIgdGhlIHRpbWUgc3RlcHMgaW5cbiAgICAvLyAgIHRoZSBpbnB1dHMuXG4gICAgLy8gUG9ydGluZyBOb3RlOiBQeUtlcmFzIHBhdGNoZXMgYSBcIl91c2VfbGVhcm5pbmdfcGhhc2VcIiBhdHRyaWJ1dGUgdG9cbiAgICAvLyBvdXRwdXRzLlxuICAgIC8vICAgVGhpcyBpcyBub3QgaWRpb21hdGljIGluIFR5cGVTY3JpcHQuIFRoZSBpbmZvIHJlZ2FyZGluZyB3aGV0aGVyIHdlIGFyZVxuICAgIC8vICAgaW4gYSBsZWFybmluZyAoaS5lLiwgdHJhaW5pbmcpIHBoYXNlIGZvciBSTk4gaXMgcGFzc2VkIGluIGEgZGlmZmVyZW50XG4gICAgLy8gICB3YXkuXG5cbiAgICBjb25zdCBwZXJTdGVwT3V0cHV0czogVGVuc29yW10gPSBbXTtcbiAgICBsZXQgbGFzdE91dHB1dDogVGVuc29yO1xuICAgIGxldCBzdGF0ZXMgPSBpbml0aWFsU3RhdGVzO1xuICAgIGNvbnN0IHRpbWVTdGVwcyA9IGlucHV0cy5zaGFwZVswXTtcbiAgICBjb25zdCBwZXJTdGVwSW5wdXRzID0gdGZjLnVuc3RhY2soaW5wdXRzKTtcbiAgICBsZXQgcGVyU3RlcE1hc2tzOiBUZW5zb3JbXTtcbiAgICBpZiAobWFzayAhPSBudWxsKSB7XG4gICAgICBwZXJTdGVwTWFza3MgPSB0ZmMudW5zdGFjayhtYXNrKTtcbiAgICB9XG5cbiAgICBmb3IgKGxldCB0ID0gMDsgdCA8IHRpbWVTdGVwczsgKyt0KSB7XG4gICAgICBjb25zdCBjdXJyZW50SW5wdXQgPSBwZXJTdGVwSW5wdXRzW3RdO1xuICAgICAgY29uc3Qgc3RlcE91dHB1dHMgPSB0ZmMudGlkeSgoKSA9PiBzdGVwRnVuY3Rpb24oY3VycmVudElucHV0LCBzdGF0ZXMpKTtcblxuICAgICAgaWYgKG1hc2sgPT0gbnVsbCkge1xuICAgICAgICBsYXN0T3V0cHV0ID0gc3RlcE91dHB1dHNbMF07XG4gICAgICAgIHN0YXRlcyA9IHN0ZXBPdXRwdXRzWzFdO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgY29uc3QgbWFza2VkT3V0cHV0cyA9IHRmYy50aWR5KCgpID0+IHtcbiAgICAgICAgICBjb25zdCBzdGVwTWFzayA9IHBlclN0ZXBNYXNrc1t0XTtcbiAgICAgICAgICBjb25zdCBuZWdTdGVwTWFzayA9IHRmYy5zdWIodGZjLm9uZXNMaWtlKHN0ZXBNYXNrKSwgc3RlcE1hc2spO1xuICAgICAgICAgIC8vIFRPRE8oY2Fpcyk6IFdvdWxkIHRmYy53aGVyZSgpIGJlIGJldHRlciBmb3IgcGVyZm9ybWFuY2U/XG4gICAgICAgICAgY29uc3Qgb3V0cHV0ID0gdGZjLmFkZChcbiAgICAgICAgICAgICAgdGZjLm11bChzdGVwT3V0cHV0c1swXSwgc3RlcE1hc2spLFxuICAgICAgICAgICAgICB0ZmMubXVsKHN0YXRlc1swXSwgbmVnU3RlcE1hc2spKTtcbiAgICAgICAgICBjb25zdCBuZXdTdGF0ZXMgPSBzdGF0ZXMubWFwKChzdGF0ZSwgaSkgPT4ge1xuICAgICAgICAgICAgcmV0dXJuIHRmYy5hZGQoXG4gICAgICAgICAgICAgICAgdGZjLm11bChzdGVwT3V0cHV0c1sxXVtpXSwgc3RlcE1hc2spLFxuICAgICAgICAgICAgICAgIHRmYy5tdWwoc3RhdGUsIG5lZ1N0ZXBNYXNrKSk7XG4gICAgICAgICAgfSk7XG4gICAgICAgICAgcmV0dXJuIHtvdXRwdXQsIG5ld1N0YXRlc307XG4gICAgICAgIH0pO1xuICAgICAgICBsYXN0T3V0cHV0ID0gbWFza2VkT3V0cHV0cy5vdXRwdXQ7XG4gICAgICAgIHN0YXRlcyA9IG1hc2tlZE91dHB1dHMubmV3U3RhdGVzO1xuICAgICAgfVxuXG4gICAgICBpZiAobmVlZFBlclN0ZXBPdXRwdXRzKSB7XG4gICAgICAgIHBlclN0ZXBPdXRwdXRzLnB1c2gobGFzdE91dHB1dCk7XG4gICAgICB9XG4gICAgfVxuICAgIGxldCBvdXRwdXRzOiBUZW5zb3I7XG4gICAgaWYgKG5lZWRQZXJTdGVwT3V0cHV0cykge1xuICAgICAgY29uc3QgYXhpcyA9IDE7XG4gICAgICBvdXRwdXRzID0gdGZjLnN0YWNrKHBlclN0ZXBPdXRwdXRzLCBheGlzKTtcbiAgICB9XG4gICAgcmV0dXJuIFtsYXN0T3V0cHV0LCBvdXRwdXRzLCBzdGF0ZXNdIGFzIFtUZW5zb3IsIFRlbnNvciwgVGVuc29yW11dO1xuICB9KTtcbn1cblxuZXhwb3J0IGRlY2xhcmUgaW50ZXJmYWNlIEJhc2VSTk5MYXllckFyZ3MgZXh0ZW5kcyBMYXllckFyZ3Mge1xuICAvKipcbiAgICogQSBSTk4gY2VsbCBpbnN0YW5jZS4gQSBSTk4gY2VsbCBpcyBhIGNsYXNzIHRoYXQgaGFzOlxuICAgKiAgIC0gYSBgY2FsbCgpYCBtZXRob2QsIHdoaWNoIHRha2VzIGBbVGVuc29yLCBUZW5zb3JdYCBhcyB0aGVcbiAgICogICAgIGZpcnN0IGlucHV0IGFyZ3VtZW50LiBUaGUgZmlyc3QgaXRlbSBpcyB0aGUgaW5wdXQgYXQgdGltZSB0LCBhbmRcbiAgICogICAgIHNlY29uZCBpdGVtIGlzIHRoZSBjZWxsIHN0YXRlIGF0IHRpbWUgdC5cbiAgICogICAgIFRoZSBgY2FsbCgpYCBtZXRob2QgcmV0dXJucyBgW291dHB1dEF0VCwgc3RhdGVzQXRUUGx1czFdYC5cbiAgICogICAgIFRoZSBgY2FsbCgpYCBtZXRob2Qgb2YgdGhlIGNlbGwgY2FuIGFsc28gdGFrZSB0aGUgYXJndW1lbnQgYGNvbnN0YW50c2AsXG4gICAqICAgICBzZWUgc2VjdGlvbiBcIk5vdGUgb24gcGFzc2luZyBleHRlcm5hbCBjb25zdGFudHNcIiBiZWxvdy5cbiAgICogICAgIFBvcnRpbmcgTm9kZTogUHlLZXJhcyBvdmVycmlkZXMgdGhlIGBjYWxsKClgIHNpZ25hdHVyZSBvZiBSTk4gY2VsbHMsXG4gICAqICAgICAgIHdoaWNoIGFyZSBMYXllciBzdWJ0eXBlcywgdG8gYWNjZXB0IHR3byBhcmd1bWVudHMuIHRmanMtbGF5ZXJzIGRvZXNcbiAgICogICAgICAgbm90IGRvIHN1Y2ggb3ZlcnJpZGluZy4gSW5zdGVhZCB3ZSBwcmVzZXZlIHRoZSBgY2FsbCgpYCBzaWduYXR1cmUsXG4gICAqICAgICAgIHdoaWNoIGR1ZSB0byBpdHMgYFRlbnNvcnxUZW5zb3JbXWAgYXJndW1lbnQgYW5kIHJldHVybiB2YWx1ZSBpc1xuICAgKiAgICAgICBmbGV4aWJsZSBlbm91Z2ggdG8gaGFuZGxlIHRoZSBpbnB1dHMgYW5kIHN0YXRlcy5cbiAgICogICAtIGEgYHN0YXRlU2l6ZWAgYXR0cmlidXRlLiBUaGlzIGNhbiBiZSBhIHNpbmdsZSBpbnRlZ2VyIChzaW5nbGUgc3RhdGUpXG4gICAqICAgICBpbiB3aGljaCBjYXNlIGl0IGlzIHRoZSBzaXplIG9mIHRoZSByZWN1cnJlbnQgc3RhdGUgKHdoaWNoIHNob3VsZCBiZVxuICAgKiAgICAgdGhlIHNhbWUgYXMgdGhlIHNpemUgb2YgdGhlIGNlbGwgb3V0cHV0KS4gVGhpcyBjYW4gYWxzbyBiZSBhbiBBcnJheSBvZlxuICAgKiAgICAgaW50ZWdlcnMgKG9uZSBzaXplIHBlciBzdGF0ZSkuIEluIHRoaXMgY2FzZSwgdGhlIGZpcnN0IGVudHJ5XG4gICAqICAgICAoYHN0YXRlU2l6ZVswXWApIHNob3VsZCBiZSB0aGUgc2FtZSBhcyB0aGUgc2l6ZSBvZiB0aGUgY2VsbCBvdXRwdXQuXG4gICAqIEl0IGlzIGFsc28gcG9zc2libGUgZm9yIGBjZWxsYCB0byBiZSBhIGxpc3Qgb2YgUk5OIGNlbGwgaW5zdGFuY2VzLCBpbiB3aGljaFxuICAgKiBjYXNlIHRoZSBjZWxscyBnZXQgc3RhY2tlZCBvbiBhZnRlciB0aGUgb3RoZXIgaW4gdGhlIFJOTiwgaW1wbGVtZW50aW5nIGFuXG4gICAqIGVmZmljaWVudCBzdGFja2VkIFJOTi5cbiAgICovXG4gIGNlbGw/OiBSTk5DZWxsfFJOTkNlbGxbXTtcblxuICAvKipcbiAgICogV2hldGhlciB0byByZXR1cm4gdGhlIGxhc3Qgb3V0cHV0IGluIHRoZSBvdXRwdXQgc2VxdWVuY2UsIG9yIHRoZSBmdWxsXG4gICAqIHNlcXVlbmNlLlxuICAgKi9cbiAgcmV0dXJuU2VxdWVuY2VzPzogYm9vbGVhbjtcblxuICAvKipcbiAgICogV2hldGhlciB0byByZXR1cm4gdGhlIGxhc3Qgc3RhdGUgaW4gYWRkaXRpb24gdG8gdGhlIG91dHB1dC5cbiAgICovXG4gIHJldHVyblN0YXRlPzogYm9vbGVhbjtcblxuICAvKipcbiAgICogSWYgYHRydWVgLCBwcm9jZXNzIHRoZSBpbnB1dCBzZXF1ZW5jZSBiYWNrd2FyZHMgYW5kIHJldHVybiB0aGUgcmV2ZXJzZWRcbiAgICogc2VxdWVuY2UgKGRlZmF1bHQ6IGBmYWxzZWApLlxuICAgKi9cbiAgZ29CYWNrd2FyZHM/OiBib29sZWFuO1xuXG4gIC8qKlxuICAgKiBJZiBgdHJ1ZWAsIHRoZSBsYXN0IHN0YXRlIGZvciBlYWNoIHNhbXBsZSBhdCBpbmRleCBpIGluIGEgYmF0Y2ggd2lsbCBiZVxuICAgKiB1c2VkIGFzIGluaXRpYWwgc3RhdGUgb2YgdGhlIHNhbXBsZSBvZiBpbmRleCBpIGluIHRoZSBmb2xsb3dpbmcgYmF0Y2hcbiAgICogKGRlZmF1bHQ6IGBmYWxzZWApLlxuICAgKlxuICAgKiBZb3UgY2FuIHNldCBSTk4gbGF5ZXJzIHRvIGJlIFwic3RhdGVmdWxcIiwgd2hpY2ggbWVhbnMgdGhhdCB0aGUgc3RhdGVzXG4gICAqIGNvbXB1dGVkIGZvciB0aGUgc2FtcGxlcyBpbiBvbmUgYmF0Y2ggd2lsbCBiZSByZXVzZWQgYXMgaW5pdGlhbCBzdGF0ZXNcbiAgICogZm9yIHRoZSBzYW1wbGVzIGluIHRoZSBuZXh0IGJhdGNoLiBUaGlzIGFzc3VtZXMgYSBvbmUtdG8tb25lIG1hcHBpbmdcbiAgICogYmV0d2VlbiBzYW1wbGVzIGluIGRpZmZlcmVudCBzdWNjZXNzaXZlIGJhdGNoZXMuXG4gICAqXG4gICAqIFRvIGVuYWJsZSBcInN0YXRlZnVsbmVzc1wiOlxuICAgKiAgIC0gc3BlY2lmeSBgc3RhdGVmdWw6IHRydWVgIGluIHRoZSBsYXllciBjb25zdHJ1Y3Rvci5cbiAgICogICAtIHNwZWNpZnkgYSBmaXhlZCBiYXRjaCBzaXplIGZvciB5b3VyIG1vZGVsLCBieSBwYXNzaW5nXG4gICAqICAgICAtIGlmIHNlcXVlbnRpYWwgbW9kZWw6XG4gICAqICAgICAgIGBiYXRjaElucHV0U2hhcGU6IFsuLi5dYCB0byB0aGUgZmlyc3QgbGF5ZXIgaW4geW91ciBtb2RlbC5cbiAgICogICAgIC0gZWxzZSBmb3IgZnVuY3Rpb25hbCBtb2RlbCB3aXRoIDEgb3IgbW9yZSBJbnB1dCBsYXllcnM6XG4gICAqICAgICAgIGBiYXRjaFNoYXBlOiBbLi4uXWAgdG8gYWxsIHRoZSBmaXJzdCBsYXllcnMgaW4geW91ciBtb2RlbC5cbiAgICogICAgIFRoaXMgaXMgdGhlIGV4cGVjdGVkIHNoYXBlIG9mIHlvdXIgaW5wdXRzXG4gICAqICAgICAqaW5jbHVkaW5nIHRoZSBiYXRjaCBzaXplKi5cbiAgICogICAgIEl0IHNob3VsZCBiZSBhIHR1cGxlIG9mIGludGVnZXJzLCBlLmcuLCBgWzMyLCAxMCwgMTAwXWAuXG4gICAqICAgLSBzcGVjaWZ5IGBzaHVmZmxlOiBmYWxzZWAgd2hlbiBjYWxsaW5nIGBMYXllcnNNb2RlbC5maXQoKWAuXG4gICAqXG4gICAqIFRvIHJlc2V0IHRoZSBzdGF0ZSBvZiB5b3VyIG1vZGVsLCBjYWxsIGByZXNldFN0YXRlcygpYCBvbiBlaXRoZXIgdGhlXG4gICAqIHNwZWNpZmljIGxheWVyIG9yIG9uIHRoZSBlbnRpcmUgbW9kZWwuXG4gICAqL1xuICBzdGF0ZWZ1bD86IGJvb2xlYW47XG4gIC8vIFRPRE8oY2Fpcyk6IEV4cGxvcmUgd2hldGhlciB3ZSBjYW4gd2FybiB1c2VycyB3aGVuIHRoZXkgZmFpbCB0byBzZXRcbiAgLy8gICBgc2h1ZmZsZTogZmFsc2VgIHdoZW4gdHJhaW5pbmcgYSBtb2RlbCBjb25zaXN0aW5nIG9mIHN0YXRlZnVsIFJOTnNcbiAgLy8gICBhbmQgYW55IHN0YXRlZnVsIExheWVycyBpbiBnZW5lcmFsLlxuXG4gIC8qKlxuICAgKiBJZiBgdHJ1ZWAsIHRoZSBuZXR3b3JrIHdpbGwgYmUgdW5yb2xsZWQsIGVsc2UgYSBzeW1ib2xpYyBsb29wIHdpbGwgYmVcbiAgICogdXNlZC4gVW5yb2xsaW5nIGNhbiBzcGVlZCB1cCBhIFJOTiwgYWx0aG91Z2ggaXQgdGVuZHMgdG8gYmUgbW9yZVxuICAgKiBtZW1vcnktaW50ZW5zaXZlLiBVbnJvbGxpbmcgaXMgb25seSBzdWl0YWJsZSBmb3Igc2hvcnQgc2VxdWVuY2VzIChkZWZhdWx0OlxuICAgKiBgZmFsc2VgKS5cbiAgICogUG9ydGluZyBOb3RlOiB0ZmpzLWxheWVycyBoYXMgYW4gaW1wZXJhdGl2ZSBiYWNrZW5kLiBSTk5zIGFyZSBleGVjdXRlZCB3aXRoXG4gICAqICAgbm9ybWFsIFR5cGVTY3JpcHQgY29udHJvbCBmbG93LiBIZW5jZSB0aGlzIHByb3BlcnR5IGlzIGluYXBwbGljYWJsZSBhbmRcbiAgICogICBpZ25vcmVkIGluIHRmanMtbGF5ZXJzLlxuICAgKi9cbiAgdW5yb2xsPzogYm9vbGVhbjtcblxuICAvKipcbiAgICogRGltZW5zaW9uYWxpdHkgb2YgdGhlIGlucHV0IChpbnRlZ2VyKS5cbiAgICogICBUaGlzIG9wdGlvbiAob3IgYWx0ZXJuYXRpdmVseSwgdGhlIG9wdGlvbiBgaW5wdXRTaGFwZWApIGlzIHJlcXVpcmVkIHdoZW5cbiAgICogICB0aGlzIGxheWVyIGlzIHVzZWQgYXMgdGhlIGZpcnN0IGxheWVyIGluIGEgbW9kZWwuXG4gICAqL1xuICBpbnB1dERpbT86IG51bWJlcjtcblxuICAvKipcbiAgICogTGVuZ3RoIG9mIHRoZSBpbnB1dCBzZXF1ZW5jZXMsIHRvIGJlIHNwZWNpZmllZCB3aGVuIGl0IGlzIGNvbnN0YW50LlxuICAgKiBUaGlzIGFyZ3VtZW50IGlzIHJlcXVpcmVkIGlmIHlvdSBhcmUgZ29pbmcgdG8gY29ubmVjdCBgRmxhdHRlbmAgdGhlblxuICAgKiBgRGVuc2VgIGxheWVycyB1cHN0cmVhbSAod2l0aG91dCBpdCwgdGhlIHNoYXBlIG9mIHRoZSBkZW5zZSBvdXRwdXRzIGNhbm5vdFxuICAgKiBiZSBjb21wdXRlZCkuIE5vdGUgdGhhdCBpZiB0aGUgcmVjdXJyZW50IGxheWVyIGlzIG5vdCB0aGUgZmlyc3QgbGF5ZXIgaW5cbiAgICogeW91ciBtb2RlbCwgeW91IHdvdWxkIG5lZWQgdG8gc3BlY2lmeSB0aGUgaW5wdXQgbGVuZ3RoIGF0IHRoZSBsZXZlbCBvZiB0aGVcbiAgICogZmlyc3QgbGF5ZXIgKGUuZy4sIHZpYSB0aGUgYGlucHV0U2hhcGVgIG9wdGlvbikuXG4gICAqL1xuICBpbnB1dExlbmd0aD86IG51bWJlcjtcbn1cblxuZXhwb3J0IGNsYXNzIFJOTiBleHRlbmRzIExheWVyIHtcbiAgLyoqIEBub2NvbGxhcHNlICovXG4gIHN0YXRpYyBjbGFzc05hbWUgPSAnUk5OJztcbiAgcHVibGljIHJlYWRvbmx5IGNlbGw6IFJOTkNlbGw7XG4gIHB1YmxpYyByZWFkb25seSByZXR1cm5TZXF1ZW5jZXM6IGJvb2xlYW47XG4gIHB1YmxpYyByZWFkb25seSByZXR1cm5TdGF0ZTogYm9vbGVhbjtcbiAgcHVibGljIHJlYWRvbmx5IGdvQmFja3dhcmRzOiBib29sZWFuO1xuICBwdWJsaWMgcmVhZG9ubHkgdW5yb2xsOiBib29sZWFuO1xuXG4gIHB1YmxpYyBzdGF0ZVNwZWM6IElucHV0U3BlY1tdO1xuICBwcm90ZWN0ZWQgc3RhdGVzXzogVGVuc29yW107XG5cbiAgLy8gTk9URShjYWlzKTogRm9yIHN0YXRlZnVsIFJOTnMsIHRoZSBvbGQgc3RhdGVzIGNhbm5vdCBiZSBkaXNwb3NlZCByaWdodFxuICAvLyBhd2F5IHdoZW4gbmV3IHN0YXRlcyBhcmUgc2V0LCBiZWNhdXNlIHRoZSBvbGQgc3RhdGVzIG1heSBuZWVkIHRvIGJlIHVzZWRcbiAgLy8gbGF0ZXIgZm9yIGJhY2twcm9wYWdhdGlvbiB0aHJvdWdoIHRpbWUgKEJQVFQpIGFuZCBvdGhlciBwdXJwb3Nlcy4gU28gd2VcbiAgLy8ga2VlcCB0aGVtIGhlcmUgZm9yIGZpbmFsIGRpc3Bvc2FsIHdoZW4gdGhlIHN0YXRlIGlzIHJlc2V0IGNvbXBsZXRlbHlcbiAgLy8gKGkuZS4sIHRocm91Z2ggbm8tYXJnIGNhbGwgdG8gYHJlc2V0U3RhdGVzKClgKS5cbiAgcHJvdGVjdGVkIGtlcHRTdGF0ZXM6IFRlbnNvcltdW107XG5cbiAgcHJpdmF0ZSBudW1Db25zdGFudHM6IG51bWJlcjtcblxuICBjb25zdHJ1Y3RvcihhcmdzOiBSTk5MYXllckFyZ3MpIHtcbiAgICBzdXBlcihhcmdzKTtcbiAgICBsZXQgY2VsbDogUk5OQ2VsbDtcbiAgICBpZiAoYXJncy5jZWxsID09IG51bGwpIHtcbiAgICAgIHRocm93IG5ldyBWYWx1ZUVycm9yKFxuICAgICAgICAgICdjZWxsIHByb3BlcnR5IGlzIG1pc3NpbmcgZm9yIHRoZSBjb25zdHJ1Y3RvciBvZiBSTk4uJyk7XG4gICAgfSBlbHNlIGlmIChBcnJheS5pc0FycmF5KGFyZ3MuY2VsbCkpIHtcbiAgICAgIGNlbGwgPSBuZXcgU3RhY2tlZFJOTkNlbGxzKHtjZWxsczogYXJncy5jZWxsfSk7XG4gICAgfSBlbHNlIHtcbiAgICAgIGNlbGwgPSBhcmdzLmNlbGw7XG4gICAgfVxuICAgIGlmIChjZWxsLnN0YXRlU2l6ZSA9PSBudWxsKSB7XG4gICAgICB0aHJvdyBuZXcgVmFsdWVFcnJvcihcbiAgICAgICAgICAnVGhlIFJOTiBjZWxsIHNob3VsZCBoYXZlIGFuIGF0dHJpYnV0ZSBgc3RhdGVTaXplYCAodHVwbGUgb2YgJyArXG4gICAgICAgICAgJ2ludGVnZXJzLCBvbmUgaW50ZWdlciBwZXIgUk5OIHN0YXRlKS4nKTtcbiAgICB9XG4gICAgdGhpcy5jZWxsID0gY2VsbDtcbiAgICB0aGlzLnJldHVyblNlcXVlbmNlcyA9XG4gICAgICAgIGFyZ3MucmV0dXJuU2VxdWVuY2VzID09IG51bGwgPyBmYWxzZSA6IGFyZ3MucmV0dXJuU2VxdWVuY2VzO1xuICAgIHRoaXMucmV0dXJuU3RhdGUgPSBhcmdzLnJldHVyblN0YXRlID09IG51bGwgPyBmYWxzZSA6IGFyZ3MucmV0dXJuU3RhdGU7XG4gICAgdGhpcy5nb0JhY2t3YXJkcyA9IGFyZ3MuZ29CYWNrd2FyZHMgPT0gbnVsbCA/IGZhbHNlIDogYXJncy5nb0JhY2t3YXJkcztcbiAgICB0aGlzLl9zdGF0ZWZ1bCA9IGFyZ3Muc3RhdGVmdWwgPT0gbnVsbCA/IGZhbHNlIDogYXJncy5zdGF0ZWZ1bDtcbiAgICB0aGlzLnVucm9sbCA9IGFyZ3MudW5yb2xsID09IG51bGwgPyBmYWxzZSA6IGFyZ3MudW5yb2xsO1xuXG4gICAgdGhpcy5zdXBwb3J0c01hc2tpbmcgPSB0cnVlO1xuICAgIHRoaXMuaW5wdXRTcGVjID0gW25ldyBJbnB1dFNwZWMoe25kaW06IDN9KV07XG4gICAgdGhpcy5zdGF0ZVNwZWMgPSBudWxsO1xuICAgIHRoaXMuc3RhdGVzXyA9IG51bGw7XG4gICAgLy8gVE9ETyhjYWlzKTogQWRkIGNvbnN0YW50c1NwZWMgYW5kIG51bUNvbnN0YW50cy5cbiAgICB0aGlzLm51bUNvbnN0YW50cyA9IG51bGw7XG4gICAgLy8gVE9ETyhjYWlzKTogTG9vayBpbnRvIHRoZSB1c2Ugb2YgaW5pdGlhbF9zdGF0ZSBpbiB0aGUga3dhcmdzIG9mIHRoZVxuICAgIC8vICAgY29uc3RydWN0b3IuXG5cbiAgICB0aGlzLmtlcHRTdGF0ZXMgPSBbXTtcbiAgfVxuXG4gIC8vIFBvcnRpbmcgTm90ZTogVGhpcyBpcyB0aGUgZXF1aXZhbGVudCBvZiBgUk5OLnN0YXRlc2AgcHJvcGVydHkgZ2V0dGVyIGluXG4gIC8vICAgUHlLZXJhcy5cbiAgZ2V0U3RhdGVzKCk6IFRlbnNvcltdIHtcbiAgICBpZiAodGhpcy5zdGF0ZXNfID09IG51bGwpIHtcbiAgICAgIGNvbnN0IG51bVN0YXRlcyA9XG4gICAgICAgICAgQXJyYXkuaXNBcnJheSh0aGlzLmNlbGwuc3RhdGVTaXplKSA/IHRoaXMuY2VsbC5zdGF0ZVNpemUubGVuZ3RoIDogMTtcbiAgICAgIHJldHVybiBtYXRoX3V0aWxzLnJhbmdlKDAsIG51bVN0YXRlcykubWFwKHggPT4gbnVsbCk7XG4gICAgfSBlbHNlIHtcbiAgICAgIHJldHVybiB0aGlzLnN0YXRlc187XG4gICAgfVxuICB9XG5cbiAgLy8gUG9ydGluZyBOb3RlOiBUaGlzIGlzIHRoZSBlcXVpdmFsZW50IG9mIHRoZSBgUk5OLnN0YXRlc2AgcHJvcGVydHkgc2V0dGVyIGluXG4gIC8vICAgUHlLZXJhcy5cbiAgc2V0U3RhdGVzKHN0YXRlczogVGVuc29yW10pOiB2b2lkIHtcbiAgICB0aGlzLnN0YXRlc18gPSBzdGF0ZXM7XG4gIH1cblxuICBjb21wdXRlT3V0cHV0U2hhcGUoaW5wdXRTaGFwZTogU2hhcGV8U2hhcGVbXSk6IFNoYXBlfFNoYXBlW10ge1xuICAgIGlmIChpc0FycmF5T2ZTaGFwZXMoaW5wdXRTaGFwZSkpIHtcbiAgICAgIGlucHV0U2hhcGUgPSAoaW5wdXRTaGFwZSBhcyBTaGFwZVtdKVswXTtcbiAgICB9XG4gICAgaW5wdXRTaGFwZSA9IGlucHV0U2hhcGUgYXMgU2hhcGU7XG5cbiAgICAvLyBUT0RPKGNhaXMpOiBSZW1vdmUgdGhlIGNhc3Rpbmcgb25jZSBzdGFja2VkIFJOTiBjZWxscyBiZWNvbWUgc3VwcG9ydGVkLlxuICAgIGxldCBzdGF0ZVNpemUgPSB0aGlzLmNlbGwuc3RhdGVTaXplO1xuICAgIGlmICghQXJyYXkuaXNBcnJheShzdGF0ZVNpemUpKSB7XG4gICAgICBzdGF0ZVNpemUgPSBbc3RhdGVTaXplXTtcbiAgICB9XG4gICAgY29uc3Qgb3V0cHV0RGltID0gc3RhdGVTaXplWzBdO1xuICAgIGxldCBvdXRwdXRTaGFwZTogU2hhcGV8U2hhcGVbXTtcbiAgICBpZiAodGhpcy5yZXR1cm5TZXF1ZW5jZXMpIHtcbiAgICAgIG91dHB1dFNoYXBlID0gW2lucHV0U2hhcGVbMF0sIGlucHV0U2hhcGVbMV0sIG91dHB1dERpbV07XG4gICAgfSBlbHNlIHtcbiAgICAgIG91dHB1dFNoYXBlID0gW2lucHV0U2hhcGVbMF0sIG91dHB1dERpbV07XG4gICAgfVxuXG4gICAgaWYgKHRoaXMucmV0dXJuU3RhdGUpIHtcbiAgICAgIGNvbnN0IHN0YXRlU2hhcGU6IFNoYXBlW10gPSBbXTtcbiAgICAgIGZvciAoY29uc3QgZGltIG9mIHN0YXRlU2l6ZSkge1xuICAgICAgICBzdGF0ZVNoYXBlLnB1c2goW2lucHV0U2hhcGVbMF0sIGRpbV0pO1xuICAgICAgfVxuICAgICAgcmV0dXJuIFtvdXRwdXRTaGFwZV0uY29uY2F0KHN0YXRlU2hhcGUpO1xuICAgIH0gZWxzZSB7XG4gICAgICByZXR1cm4gb3V0cHV0U2hhcGU7XG4gICAgfVxuICB9XG5cbiAgY29tcHV0ZU1hc2soaW5wdXRzOiBUZW5zb3J8VGVuc29yW10sIG1hc2s/OiBUZW5zb3J8VGVuc29yW10pOiBUZW5zb3JcbiAgICAgIHxUZW5zb3JbXSB7XG4gICAgcmV0dXJuIHRmYy50aWR5KCgpID0+IHtcbiAgICAgIGlmIChBcnJheS5pc0FycmF5KG1hc2spKSB7XG4gICAgICAgIG1hc2sgPSBtYXNrWzBdO1xuICAgICAgfVxuICAgICAgY29uc3Qgb3V0cHV0TWFzayA9IHRoaXMucmV0dXJuU2VxdWVuY2VzID8gbWFzayA6IG51bGw7XG5cbiAgICAgIGlmICh0aGlzLnJldHVyblN0YXRlKSB7XG4gICAgICAgIGNvbnN0IHN0YXRlTWFzayA9IHRoaXMuc3RhdGVzLm1hcChzID0+IG51bGwpO1xuICAgICAgICByZXR1cm4gW291dHB1dE1hc2tdLmNvbmNhdChzdGF0ZU1hc2spO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgcmV0dXJuIG91dHB1dE1hc2s7XG4gICAgICB9XG4gICAgfSk7XG4gIH1cblxuICAvKipcbiAgICogR2V0IHRoZSBjdXJyZW50IHN0YXRlIHRlbnNvcnMgb2YgdGhlIFJOTi5cbiAgICpcbiAgICogSWYgdGhlIHN0YXRlIGhhc24ndCBiZWVuIHNldCwgcmV0dXJuIGFuIGFycmF5IG9mIGBudWxsYHMgb2YgdGhlIGNvcnJlY3RcbiAgICogbGVuZ3RoLlxuICAgKi9cbiAgZ2V0IHN0YXRlcygpOiBUZW5zb3JbXSB7XG4gICAgaWYgKHRoaXMuc3RhdGVzXyA9PSBudWxsKSB7XG4gICAgICBjb25zdCBudW1TdGF0ZXMgPVxuICAgICAgICAgIEFycmF5LmlzQXJyYXkodGhpcy5jZWxsLnN0YXRlU2l6ZSkgPyB0aGlzLmNlbGwuc3RhdGVTaXplLmxlbmd0aCA6IDE7XG4gICAgICBjb25zdCBvdXRwdXQ6IFRlbnNvcltdID0gW107XG4gICAgICBmb3IgKGxldCBpID0gMDsgaSA8IG51bVN0YXRlczsgKytpKSB7XG4gICAgICAgIG91dHB1dC5wdXNoKG51bGwpO1xuICAgICAgfVxuICAgICAgcmV0dXJuIG91dHB1dDtcbiAgICB9IGVsc2Uge1xuICAgICAgcmV0dXJuIHRoaXMuc3RhdGVzXztcbiAgICB9XG4gIH1cblxuICBzZXQgc3RhdGVzKHM6IFRlbnNvcltdKSB7XG4gICAgdGhpcy5zdGF0ZXNfID0gcztcbiAgfVxuXG4gIHB1YmxpYyBidWlsZChpbnB1dFNoYXBlOiBTaGFwZXxTaGFwZVtdKTogdm9pZCB7XG4gICAgLy8gTm90ZSBpbnB1dFNoYXBlIHdpbGwgYmUgYW4gQXJyYXkgb2YgU2hhcGVzIG9mIGluaXRpYWwgc3RhdGVzIGFuZFxuICAgIC8vIGNvbnN0YW50cyBpZiB0aGVzZSBhcmUgcGFzc2VkIGluIGFwcGx5KCkuXG4gICAgY29uc3QgY29uc3RhbnRTaGFwZTogU2hhcGVbXSA9IG51bGw7XG4gICAgaWYgKHRoaXMubnVtQ29uc3RhbnRzICE9IG51bGwpIHtcbiAgICAgIHRocm93IG5ldyBOb3RJbXBsZW1lbnRlZEVycm9yKFxuICAgICAgICAgICdDb25zdGFudHMgc3VwcG9ydCBpcyBub3QgaW1wbGVtZW50ZWQgaW4gUk5OIHlldC4nKTtcbiAgICB9XG5cbiAgICBpZiAoaXNBcnJheU9mU2hhcGVzKGlucHV0U2hhcGUpKSB7XG4gICAgICBpbnB1dFNoYXBlID0gKGlucHV0U2hhcGUgYXMgU2hhcGVbXSlbMF07XG4gICAgfVxuICAgIGlucHV0U2hhcGUgPSBpbnB1dFNoYXBlIGFzIFNoYXBlO1xuXG4gICAgY29uc3QgYmF0Y2hTaXplOiBudW1iZXIgPSB0aGlzLnN0YXRlZnVsID8gaW5wdXRTaGFwZVswXSA6IG51bGw7XG4gICAgY29uc3QgaW5wdXREaW0gPSBpbnB1dFNoYXBlLnNsaWNlKDIpO1xuICAgIHRoaXMuaW5wdXRTcGVjWzBdID0gbmV3IElucHV0U3BlYyh7c2hhcGU6IFtiYXRjaFNpemUsIG51bGwsIC4uLmlucHV0RGltXX0pO1xuXG4gICAgLy8gQWxsb3cgY2VsbCAoaWYgUk5OQ2VsbCBMYXllcikgdG8gYnVpbGQgYmVmb3JlIHdlIHNldCBvciB2YWxpZGF0ZVxuICAgIC8vIHN0YXRlU3BlYy5cbiAgICBjb25zdCBzdGVwSW5wdXRTaGFwZSA9IFtpbnB1dFNoYXBlWzBdXS5jb25jYXQoaW5wdXRTaGFwZS5zbGljZSgyKSk7XG4gICAgaWYgKGNvbnN0YW50U2hhcGUgIT0gbnVsbCkge1xuICAgICAgdGhyb3cgbmV3IE5vdEltcGxlbWVudGVkRXJyb3IoXG4gICAgICAgICAgJ0NvbnN0YW50cyBzdXBwb3J0IGlzIG5vdCBpbXBsZW1lbnRlZCBpbiBSTk4geWV0LicpO1xuICAgIH0gZWxzZSB7XG4gICAgICB0aGlzLmNlbGwuYnVpbGQoc3RlcElucHV0U2hhcGUpO1xuICAgIH1cblxuICAgIC8vIFNldCBvciB2YWxpZGF0ZSBzdGF0ZVNwZWMuXG4gICAgbGV0IHN0YXRlU2l6ZTogbnVtYmVyW107XG4gICAgaWYgKEFycmF5LmlzQXJyYXkodGhpcy5jZWxsLnN0YXRlU2l6ZSkpIHtcbiAgICAgIHN0YXRlU2l6ZSA9IHRoaXMuY2VsbC5zdGF0ZVNpemU7XG4gICAgfSBlbHNlIHtcbiAgICAgIHN0YXRlU2l6ZSA9IFt0aGlzLmNlbGwuc3RhdGVTaXplXTtcbiAgICB9XG5cbiAgICBpZiAodGhpcy5zdGF0ZVNwZWMgIT0gbnVsbCkge1xuICAgICAgaWYgKCF1dGlsLmFycmF5c0VxdWFsKFxuICAgICAgICAgICAgICB0aGlzLnN0YXRlU3BlYy5tYXAoc3BlYyA9PiBzcGVjLnNoYXBlW3NwZWMuc2hhcGUubGVuZ3RoIC0gMV0pLFxuICAgICAgICAgICAgICBzdGF0ZVNpemUpKSB7XG4gICAgICAgIHRocm93IG5ldyBWYWx1ZUVycm9yKFxuICAgICAgICAgICAgYEFuIGluaXRpYWxTdGF0ZSB3YXMgcGFzc2VkIHRoYXQgaXMgbm90IGNvbXBhdGlibGUgd2l0aCBgICtcbiAgICAgICAgICAgIGBjZWxsLnN0YXRlU2l6ZS4gUmVjZWl2ZWQgc3RhdGVTcGVjPSR7dGhpcy5zdGF0ZVNwZWN9OyBgICtcbiAgICAgICAgICAgIGBIb3dldmVyIGNlbGwuc3RhdGVTaXplIGlzICR7dGhpcy5jZWxsLnN0YXRlU2l6ZX1gKTtcbiAgICAgIH1cbiAgICB9IGVsc2Uge1xuICAgICAgdGhpcy5zdGF0ZVNwZWMgPVxuICAgICAgICAgIHN0YXRlU2l6ZS5tYXAoZGltID0+IG5ldyBJbnB1dFNwZWMoe3NoYXBlOiBbbnVsbCwgZGltXX0pKTtcbiAgICB9XG4gICAgaWYgKHRoaXMuc3RhdGVmdWwpIHtcbiAgICAgIHRoaXMucmVzZXRTdGF0ZXMoKTtcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogUmVzZXQgdGhlIHN0YXRlIHRlbnNvcnMgb2YgdGhlIFJOTi5cbiAgICpcbiAgICogSWYgdGhlIGBzdGF0ZXNgIGFyZ3VtZW50IGlzIGB1bmRlZmluZWRgIG9yIGBudWxsYCwgd2lsbCBzZXQgdGhlXG4gICAqIHN0YXRlIHRlbnNvcihzKSBvZiB0aGUgUk5OIHRvIGFsbC16ZXJvIHRlbnNvcnMgb2YgdGhlIGFwcHJvcHJpYXRlXG4gICAqIHNoYXBlKHMpLlxuICAgKlxuICAgKiBJZiBgc3RhdGVzYCBpcyBwcm92aWRlZCwgd2lsbCBzZXQgdGhlIHN0YXRlIHRlbnNvcnMgb2YgdGhlIFJOTiB0byBpdHNcbiAgICogdmFsdWUuXG4gICAqXG4gICAqIEBwYXJhbSBzdGF0ZXMgT3B0aW9uYWwgZXh0ZXJuYWxseS1wcm92aWRlZCBpbml0aWFsIHN0YXRlcy5cbiAgICogQHBhcmFtIHRyYWluaW5nIFdoZXRoZXIgdGhpcyBjYWxsIGlzIGRvbmUgZHVyaW5nIHRyYWluaW5nLiBGb3Igc3RhdGVmdWxcbiAgICogICBSTk5zLCB0aGlzIGFmZmVjdHMgd2hldGhlciB0aGUgb2xkIHN0YXRlcyBhcmUga2VwdCBvciBkaXNjYXJkZWQuIEluXG4gICAqICAgcGFydGljdWxhciwgaWYgYHRyYWluaW5nYCBpcyBgdHJ1ZWAsIHRoZSBvbGQgc3RhdGVzIHdpbGwgYmUga2VwdCBzb1xuICAgKiAgIHRoYXQgc3Vic2VxdWVudCBiYWNrcHJvcGdhdGFpb24gdGhyb3VnaCB0aW1lIChCUFRUKSBtYXkgd29yayBwcm9wZXJseS5cbiAgICogICBFbHNlLCB0aGUgb2xkIHN0YXRlcyB3aWxsIGJlIGRpc2NhcmRlZC5cbiAgICovXG4gIHJlc2V0U3RhdGVzKHN0YXRlcz86IFRlbnNvcnxUZW5zb3JbXSwgdHJhaW5pbmcgPSBmYWxzZSk6IHZvaWQge1xuICAgIHRpZHkoKCkgPT4ge1xuICAgICAgaWYgKCF0aGlzLnN0YXRlZnVsKSB7XG4gICAgICAgIHRocm93IG5ldyBBdHRyaWJ1dGVFcnJvcihcbiAgICAgICAgICAgICdDYW5ub3QgY2FsbCByZXNldFN0YXRlcygpIG9uIGFuIFJOTiBMYXllciB0aGF0IGlzIG5vdCBzdGF0ZWZ1bC4nKTtcbiAgICAgIH1cbiAgICAgIGNvbnN0IGJhdGNoU2l6ZSA9IHRoaXMuaW5wdXRTcGVjWzBdLnNoYXBlWzBdO1xuICAgICAgaWYgKGJhdGNoU2l6ZSA9PSBudWxsKSB7XG4gICAgICAgIHRocm93IG5ldyBWYWx1ZUVycm9yKFxuICAgICAgICAgICAgJ0lmIGFuIFJOTiBpcyBzdGF0ZWZ1bCwgaXQgbmVlZHMgdG8ga25vdyBpdHMgYmF0Y2ggc2l6ZS4gU3BlY2lmeSAnICtcbiAgICAgICAgICAgICd0aGUgYmF0Y2ggc2l6ZSBvZiB5b3VyIGlucHV0IHRlbnNvcnM6IFxcbicgK1xuICAgICAgICAgICAgJy0gSWYgdXNpbmcgYSBTZXF1ZW50aWFsIG1vZGVsLCBzcGVjaWZ5IHRoZSBiYXRjaCBzaXplIGJ5ICcgK1xuICAgICAgICAgICAgJ3Bhc3NpbmcgYSBgYmF0Y2hJbnB1dFNoYXBlYCBvcHRpb24gdG8geW91ciBmaXJzdCBsYXllci5cXG4nICtcbiAgICAgICAgICAgICctIElmIHVzaW5nIHRoZSBmdW5jdGlvbmFsIEFQSSwgc3BlY2lmeSB0aGUgYmF0Y2ggc2l6ZSBieSAnICtcbiAgICAgICAgICAgICdwYXNzaW5nIGEgYGJhdGNoU2hhcGVgIG9wdGlvbiB0byB5b3VyIElucHV0IGxheWVyLicpO1xuICAgICAgfVxuICAgICAgLy8gSW5pdGlhbGl6ZSBzdGF0ZSBpZiBudWxsLlxuICAgICAgaWYgKHRoaXMuc3RhdGVzXyA9PSBudWxsKSB7XG4gICAgICAgIGlmIChBcnJheS5pc0FycmF5KHRoaXMuY2VsbC5zdGF0ZVNpemUpKSB7XG4gICAgICAgICAgdGhpcy5zdGF0ZXNfID1cbiAgICAgICAgICAgICAgdGhpcy5jZWxsLnN0YXRlU2l6ZS5tYXAoZGltID0+IHRmYy56ZXJvcyhbYmF0Y2hTaXplLCBkaW1dKSk7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgdGhpcy5zdGF0ZXNfID0gW3RmYy56ZXJvcyhbYmF0Y2hTaXplLCB0aGlzLmNlbGwuc3RhdGVTaXplXSldO1xuICAgICAgICB9XG4gICAgICB9IGVsc2UgaWYgKHN0YXRlcyA9PSBudWxsKSB7XG4gICAgICAgIC8vIERpc3Bvc2Ugb2xkIHN0YXRlIHRlbnNvcnMuXG4gICAgICAgIHRmYy5kaXNwb3NlKHRoaXMuc3RhdGVzXyk7XG4gICAgICAgIC8vIEZvciBzdGF0ZWZ1bCBSTk5zLCBmdWxseSBkaXNwb3NlIGtlcHQgb2xkIHN0YXRlcy5cbiAgICAgICAgaWYgKHRoaXMua2VwdFN0YXRlcyAhPSBudWxsKSB7XG4gICAgICAgICAgdGZjLmRpc3Bvc2UodGhpcy5rZXB0U3RhdGVzKTtcbiAgICAgICAgICB0aGlzLmtlcHRTdGF0ZXMgPSBbXTtcbiAgICAgICAgfVxuXG4gICAgICAgIGlmIChBcnJheS5pc0FycmF5KHRoaXMuY2VsbC5zdGF0ZVNpemUpKSB7XG4gICAgICAgICAgdGhpcy5zdGF0ZXNfID1cbiAgICAgICAgICAgICAgdGhpcy5jZWxsLnN0YXRlU2l6ZS5tYXAoZGltID0+IHRmYy56ZXJvcyhbYmF0Y2hTaXplLCBkaW1dKSk7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgdGhpcy5zdGF0ZXNfWzBdID0gdGZjLnplcm9zKFtiYXRjaFNpemUsIHRoaXMuY2VsbC5zdGF0ZVNpemVdKTtcbiAgICAgICAgfVxuICAgICAgfSBlbHNlIHtcbiAgICAgICAgaWYgKCFBcnJheS5pc0FycmF5KHN0YXRlcykpIHtcbiAgICAgICAgICBzdGF0ZXMgPSBbc3RhdGVzXTtcbiAgICAgICAgfVxuICAgICAgICBpZiAoc3RhdGVzLmxlbmd0aCAhPT0gdGhpcy5zdGF0ZXNfLmxlbmd0aCkge1xuICAgICAgICAgIHRocm93IG5ldyBWYWx1ZUVycm9yKFxuICAgICAgICAgICAgICBgTGF5ZXIgJHt0aGlzLm5hbWV9IGV4cGVjdHMgJHt0aGlzLnN0YXRlc18ubGVuZ3RofSBzdGF0ZShzKSwgYCArXG4gICAgICAgICAgICAgIGBidXQgaXQgcmVjZWl2ZWQgJHtzdGF0ZXMubGVuZ3RofSBzdGF0ZSB2YWx1ZShzKS4gSW5wdXQgYCArXG4gICAgICAgICAgICAgIGByZWNlaXZlZDogJHtzdGF0ZXN9YCk7XG4gICAgICAgIH1cblxuICAgICAgICBpZiAodHJhaW5pbmcgPT09IHRydWUpIHtcbiAgICAgICAgICAvLyBTdG9yZSBvbGQgc3RhdGUgdGVuc29ycyBmb3IgY29tcGxldGUgZGlzcG9zYWwgbGF0ZXIsIGkuZS4sIGR1cmluZ1xuICAgICAgICAgIC8vIHRoZSBuZXh0IG5vLWFyZyBjYWxsIHRvIHRoaXMgbWV0aG9kLiBXZSBkbyBub3QgZGlzcG9zZSB0aGUgb2xkXG4gICAgICAgICAgLy8gc3RhdGVzIGltbWVkaWF0ZWx5IGJlY2F1c2UgdGhhdCBCUFRUIChhbW9uZyBvdGhlciB0aGluZ3MpIHJlcXVpcmVcbiAgICAgICAgICAvLyB0aGVtLlxuICAgICAgICAgIHRoaXMua2VwdFN0YXRlcy5wdXNoKHRoaXMuc3RhdGVzXy5zbGljZSgpKTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICB0ZmMuZGlzcG9zZSh0aGlzLnN0YXRlc18pO1xuICAgICAgICB9XG5cbiAgICAgICAgZm9yIChsZXQgaW5kZXggPSAwOyBpbmRleCA8IHRoaXMuc3RhdGVzXy5sZW5ndGg7ICsraW5kZXgpIHtcbiAgICAgICAgICBjb25zdCB2YWx1ZSA9IHN0YXRlc1tpbmRleF07XG4gICAgICAgICAgY29uc3QgZGltID0gQXJyYXkuaXNBcnJheSh0aGlzLmNlbGwuc3RhdGVTaXplKSA/XG4gICAgICAgICAgICAgIHRoaXMuY2VsbC5zdGF0ZVNpemVbaW5kZXhdIDpcbiAgICAgICAgICAgICAgdGhpcy5jZWxsLnN0YXRlU2l6ZTtcbiAgICAgICAgICBjb25zdCBleHBlY3RlZFNoYXBlID0gW2JhdGNoU2l6ZSwgZGltXTtcbiAgICAgICAgICBpZiAoIXV0aWwuYXJyYXlzRXF1YWwodmFsdWUuc2hhcGUsIGV4cGVjdGVkU2hhcGUpKSB7XG4gICAgICAgICAgICB0aHJvdyBuZXcgVmFsdWVFcnJvcihcbiAgICAgICAgICAgICAgICBgU3RhdGUgJHtpbmRleH0gaXMgaW5jb21wYXRpYmxlIHdpdGggbGF5ZXIgJHt0aGlzLm5hbWV9OiBgICtcbiAgICAgICAgICAgICAgICBgZXhwZWN0ZWQgc2hhcGU9JHtleHBlY3RlZFNoYXBlfSwgcmVjZWl2ZWQgc2hhcGU9JHtcbiAgICAgICAgICAgICAgICAgICAgdmFsdWUuc2hhcGV9YCk7XG4gICAgICAgICAgfVxuICAgICAgICAgIHRoaXMuc3RhdGVzX1tpbmRleF0gPSB2YWx1ZTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgICAgdGhpcy5zdGF0ZXNfID0gdGhpcy5zdGF0ZXNfLm1hcChzdGF0ZSA9PiB0ZmMua2VlcChzdGF0ZS5jbG9uZSgpKSk7XG4gICAgfSk7XG4gIH1cblxuICBhcHBseShcbiAgICAgIGlucHV0czogVGVuc29yfFRlbnNvcltdfFN5bWJvbGljVGVuc29yfFN5bWJvbGljVGVuc29yW10sXG4gICAgICBrd2FyZ3M/OiBLd2FyZ3MpOiBUZW5zb3J8VGVuc29yW118U3ltYm9saWNUZW5zb3J8U3ltYm9saWNUZW5zb3JbXSB7XG4gICAgLy8gVE9ETyhjYWlzKTogRmlndXJlIG91dCB3aGV0aGVyIGluaXRpYWxTdGF0ZSBpcyBpbiBrd2FyZ3Mgb3IgaW5wdXRzLlxuICAgIGxldCBpbml0aWFsU3RhdGU6IFRlbnNvcltdfFN5bWJvbGljVGVuc29yW10gPVxuICAgICAgICBrd2FyZ3MgPT0gbnVsbCA/IG51bGwgOiBrd2FyZ3NbJ2luaXRpYWxTdGF0ZSddO1xuICAgIGxldCBjb25zdGFudHM6IFRlbnNvcltdfFN5bWJvbGljVGVuc29yW10gPVxuICAgICAgICBrd2FyZ3MgPT0gbnVsbCA/IG51bGwgOiBrd2FyZ3NbJ2NvbnN0YW50cyddO1xuICAgIGlmIChrd2FyZ3MgPT0gbnVsbCkge1xuICAgICAga3dhcmdzID0ge307XG4gICAgfVxuXG4gICAgY29uc3Qgc3RhbmRhcmRpemVkID1cbiAgICAgICAgc3RhbmRhcmRpemVBcmdzKGlucHV0cywgaW5pdGlhbFN0YXRlLCBjb25zdGFudHMsIHRoaXMubnVtQ29uc3RhbnRzKTtcbiAgICBpbnB1dHMgPSBzdGFuZGFyZGl6ZWQuaW5wdXRzO1xuICAgIGluaXRpYWxTdGF0ZSA9IHN0YW5kYXJkaXplZC5pbml0aWFsU3RhdGU7XG4gICAgY29uc3RhbnRzID0gc3RhbmRhcmRpemVkLmNvbnN0YW50cztcblxuICAgIC8vIElmIGFueSBvZiBgaW5pdGlhbF9zdGF0ZWAgb3IgYGNvbnN0YW50c2AgYXJlIHNwZWNpZmllZCBhbmQgYXJlXG4gICAgLy8gYHRmLlN5bWJvbGljVGVuc29yYHMsIHRoZW4gYWRkIHRoZW0gdG8gdGhlIGlucHV0cyBhbmQgdGVtcG9yYXJpbHkgbW9kaWZ5XG4gICAgLy8gdGhlIGlucHV0X3NwZWMgdG8gaW5jbHVkZSB0aGVtLlxuXG4gICAgbGV0IGFkZGl0aW9uYWxJbnB1dHM6IEFycmF5PFRlbnNvcnxTeW1ib2xpY1RlbnNvcj4gPSBbXTtcbiAgICBsZXQgYWRkaXRpb25hbFNwZWNzOiBJbnB1dFNwZWNbXSA9IFtdO1xuICAgIGlmIChpbml0aWFsU3RhdGUgIT0gbnVsbCkge1xuICAgICAga3dhcmdzWydpbml0aWFsU3RhdGUnXSA9IGluaXRpYWxTdGF0ZTtcbiAgICAgIGFkZGl0aW9uYWxJbnB1dHMgPSBhZGRpdGlvbmFsSW5wdXRzLmNvbmNhdChpbml0aWFsU3RhdGUpO1xuICAgICAgdGhpcy5zdGF0ZVNwZWMgPSBbXTtcbiAgICAgIGZvciAoY29uc3Qgc3RhdGUgb2YgaW5pdGlhbFN0YXRlKSB7XG4gICAgICAgIHRoaXMuc3RhdGVTcGVjLnB1c2gobmV3IElucHV0U3BlYyh7c2hhcGU6IHN0YXRlLnNoYXBlfSkpO1xuICAgICAgfVxuICAgICAgLy8gVE9ETyhjYWlzKTogVXNlIHRoZSBmb2xsb3dpbmcgaW5zdGVhZC5cbiAgICAgIC8vIHRoaXMuc3RhdGVTcGVjID0gaW5pdGlhbFN0YXRlLm1hcChzdGF0ZSA9PiBuZXcgSW5wdXRTcGVjKHtzaGFwZTpcbiAgICAgIC8vIHN0YXRlLnNoYXBlfSkpO1xuICAgICAgYWRkaXRpb25hbFNwZWNzID0gYWRkaXRpb25hbFNwZWNzLmNvbmNhdCh0aGlzLnN0YXRlU3BlYyk7XG4gICAgfVxuICAgIGlmIChjb25zdGFudHMgIT0gbnVsbCkge1xuICAgICAga3dhcmdzWydjb25zdGFudHMnXSA9IGNvbnN0YW50cztcbiAgICAgIGFkZGl0aW9uYWxJbnB1dHMgPSBhZGRpdGlvbmFsSW5wdXRzLmNvbmNhdChjb25zdGFudHMpO1xuICAgICAgLy8gVE9ETyhjYWlzKTogQWRkIHRoaXMuY29uc3RhbnRzU3BlYy5cbiAgICAgIHRoaXMubnVtQ29uc3RhbnRzID0gY29uc3RhbnRzLmxlbmd0aDtcbiAgICB9XG5cbiAgICBjb25zdCBpc1RlbnNvciA9IGFkZGl0aW9uYWxJbnB1dHNbMF0gaW5zdGFuY2VvZiBTeW1ib2xpY1RlbnNvcjtcbiAgICBpZiAoaXNUZW5zb3IpIHtcbiAgICAgIC8vIENvbXB1dGUgZnVsbCBpbnB1dCBzcGVjLCBpbmNsdWRpbmcgc3RhdGUgYW5kIGNvbnN0YW50cy5cbiAgICAgIGNvbnN0IGZ1bGxJbnB1dCA9XG4gICAgICAgICAgW2lucHV0c10uY29uY2F0KGFkZGl0aW9uYWxJbnB1dHMpIGFzIFRlbnNvcltdIHwgU3ltYm9saWNUZW5zb3JbXTtcbiAgICAgIGNvbnN0IGZ1bGxJbnB1dFNwZWMgPSB0aGlzLmlucHV0U3BlYy5jb25jYXQoYWRkaXRpb25hbFNwZWNzKTtcbiAgICAgIC8vIFBlcmZvcm0gdGhlIGNhbGwgd2l0aCB0ZW1wb3JhcmlseSByZXBsYWNlZCBpbnB1dFNwZWMuXG4gICAgICBjb25zdCBvcmlnaW5hbElucHV0U3BlYyA9IHRoaXMuaW5wdXRTcGVjO1xuICAgICAgdGhpcy5pbnB1dFNwZWMgPSBmdWxsSW5wdXRTcGVjO1xuICAgICAgY29uc3Qgb3V0cHV0ID0gc3VwZXIuYXBwbHkoZnVsbElucHV0LCBrd2FyZ3MpO1xuICAgICAgdGhpcy5pbnB1dFNwZWMgPSBvcmlnaW5hbElucHV0U3BlYztcbiAgICAgIHJldHVybiBvdXRwdXQ7XG4gICAgfSBlbHNlIHtcbiAgICAgIHJldHVybiBzdXBlci5hcHBseShpbnB1dHMsIGt3YXJncyk7XG4gICAgfVxuICB9XG5cbiAgLy8gdHNsaW50OmRpc2FibGUtbmV4dC1saW5lOm5vLWFueVxuICBjYWxsKGlucHV0czogVGVuc29yfFRlbnNvcltdLCBrd2FyZ3M6IEt3YXJncyk6IFRlbnNvcnxUZW5zb3JbXSB7XG4gICAgLy8gSW5wdXQgc2hhcGU6IGBbc2FtcGxlcywgdGltZSAocGFkZGVkIHdpdGggemVyb3MpLCBpbnB1dF9kaW1dYC5cbiAgICAvLyBOb3RlIHRoYXQgdGhlIC5idWlsZCgpIG1ldGhvZCBvZiBzdWJjbGFzc2VzICoqbXVzdCoqIGRlZmluZVxuICAgIC8vIHRoaXMuaW5wdXRTcGVjIGFuZCB0aGlzLnN0YXRlU3BlYyBvd2l0aCBjb21wbGV0ZSBpbnB1dCBzaGFwZXMuXG4gICAgcmV0dXJuIHRpZHkoKCkgPT4ge1xuICAgICAgY29uc3QgbWFzayA9IGt3YXJncyA9PSBudWxsID8gbnVsbCA6IGt3YXJnc1snbWFzayddIGFzIFRlbnNvcjtcbiAgICAgIGNvbnN0IHRyYWluaW5nID0ga3dhcmdzID09IG51bGwgPyBudWxsIDoga3dhcmdzWyd0cmFpbmluZyddO1xuICAgICAgbGV0IGluaXRpYWxTdGF0ZTogVGVuc29yW10gPVxuICAgICAgICAgIGt3YXJncyA9PSBudWxsID8gbnVsbCA6IGt3YXJnc1snaW5pdGlhbFN0YXRlJ107XG5cbiAgICAgIGlucHV0cyA9IGdldEV4YWN0bHlPbmVUZW5zb3IoaW5wdXRzKTtcbiAgICAgIGlmIChpbml0aWFsU3RhdGUgPT0gbnVsbCkge1xuICAgICAgICBpZiAodGhpcy5zdGF0ZWZ1bCkge1xuICAgICAgICAgIGluaXRpYWxTdGF0ZSA9IHRoaXMuc3RhdGVzXztcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICBpbml0aWFsU3RhdGUgPSB0aGlzLmdldEluaXRpYWxTdGF0ZShpbnB1dHMpO1xuICAgICAgICB9XG4gICAgICB9XG5cbiAgICAgIGNvbnN0IG51bVN0YXRlcyA9XG4gICAgICAgICAgQXJyYXkuaXNBcnJheSh0aGlzLmNlbGwuc3RhdGVTaXplKSA/IHRoaXMuY2VsbC5zdGF0ZVNpemUubGVuZ3RoIDogMTtcbiAgICAgIGlmIChpbml0aWFsU3RhdGUubGVuZ3RoICE9PSBudW1TdGF0ZXMpIHtcbiAgICAgICAgdGhyb3cgbmV3IFZhbHVlRXJyb3IoXG4gICAgICAgICAgICBgUk5OIExheWVyIGhhcyAke251bVN0YXRlc30gc3RhdGUocykgYnV0IHdhcyBwYXNzZWQgYCArXG4gICAgICAgICAgICBgJHtpbml0aWFsU3RhdGUubGVuZ3RofSBpbml0aWFsIHN0YXRlKHMpLmApO1xuICAgICAgfVxuICAgICAgaWYgKHRoaXMudW5yb2xsKSB7XG4gICAgICAgIGNvbnNvbGUud2FybihcbiAgICAgICAgICAgICdJZ25vcmluZyB1bnJvbGwgPSB0cnVlIGZvciBSTk4gbGF5ZXIsIGR1ZSB0byBpbXBlcmF0aXZlIGJhY2tlbmQuJyk7XG4gICAgICB9XG5cbiAgICAgIGNvbnN0IGNlbGxDYWxsS3dhcmdzOiBLd2FyZ3MgPSB7dHJhaW5pbmd9O1xuXG4gICAgICAvLyBUT0RPKGNhaXMpOiBBZGQgc3VwcG9ydCBmb3IgY29uc3RhbnRzLlxuICAgICAgY29uc3Qgc3RlcCA9IChpbnB1dHM6IFRlbnNvciwgc3RhdGVzOiBUZW5zb3JbXSkgPT4ge1xuICAgICAgICAvLyBgaW5wdXRzYCBhbmQgYHN0YXRlc2AgYXJlIGNvbmNhdGVuYXRlZCB0byBmb3JtIGEgc2luZ2xlIGBBcnJheWAgb2ZcbiAgICAgICAgLy8gYHRmLlRlbnNvcmBzIGFzIHRoZSBpbnB1dCB0byBgY2VsbC5jYWxsKClgLlxuICAgICAgICBjb25zdCBvdXRwdXRzID1cbiAgICAgICAgICAgIHRoaXMuY2VsbC5jYWxsKFtpbnB1dHNdLmNvbmNhdChzdGF0ZXMpLCBjZWxsQ2FsbEt3YXJncykgYXMgVGVuc29yW107XG4gICAgICAgIC8vIE1hcnNoYWxsIHRoZSByZXR1cm4gdmFsdWUgaW50byBvdXRwdXQgYW5kIG5ldyBzdGF0ZXMuXG4gICAgICAgIHJldHVybiBbb3V0cHV0c1swXSwgb3V0cHV0cy5zbGljZSgxKV0gYXMgW1RlbnNvciwgVGVuc29yW11dO1xuICAgICAgfTtcblxuICAgICAgLy8gVE9ETyhjYWlzKTogQWRkIHN1cHBvcnQgZm9yIGNvbnN0YW50cy5cblxuICAgICAgY29uc3Qgcm5uT3V0cHV0cyA9XG4gICAgICAgICAgcm5uKHN0ZXAsIGlucHV0cywgaW5pdGlhbFN0YXRlLCB0aGlzLmdvQmFja3dhcmRzLCBtYXNrLCBudWxsLFxuICAgICAgICAgICAgICB0aGlzLnVucm9sbCwgdGhpcy5yZXR1cm5TZXF1ZW5jZXMpO1xuICAgICAgY29uc3QgbGFzdE91dHB1dCA9IHJubk91dHB1dHNbMF07XG4gICAgICBjb25zdCBvdXRwdXRzID0gcm5uT3V0cHV0c1sxXTtcbiAgICAgIGNvbnN0IHN0YXRlcyA9IHJubk91dHB1dHNbMl07XG5cbiAgICAgIGlmICh0aGlzLnN0YXRlZnVsKSB7XG4gICAgICAgIHRoaXMucmVzZXRTdGF0ZXMoc3RhdGVzLCB0cmFpbmluZyk7XG4gICAgICB9XG5cbiAgICAgIGNvbnN0IG91dHB1dCA9IHRoaXMucmV0dXJuU2VxdWVuY2VzID8gb3V0cHV0cyA6IGxhc3RPdXRwdXQ7XG5cbiAgICAgIC8vIFRPRE8oY2Fpcyk6IFBvcnBlcnR5IHNldCBsZWFybmluZyBwaGFzZSBmbGFnLlxuXG4gICAgICBpZiAodGhpcy5yZXR1cm5TdGF0ZSkge1xuICAgICAgICByZXR1cm4gW291dHB1dF0uY29uY2F0KHN0YXRlcyk7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICByZXR1cm4gb3V0cHV0O1xuICAgICAgfVxuICAgIH0pO1xuICB9XG5cbiAgZ2V0SW5pdGlhbFN0YXRlKGlucHV0czogVGVuc29yKTogVGVuc29yW10ge1xuICAgIHJldHVybiB0aWR5KCgpID0+IHtcbiAgICAgIC8vIEJ1aWxkIGFuIGFsbC16ZXJvIHRlbnNvciBvZiBzaGFwZSBbc2FtcGxlcywgb3V0cHV0RGltXS5cbiAgICAgIC8vIFtTYW1wbGVzLCB0aW1lU3RlcHMsIGlucHV0RGltXS5cbiAgICAgIGxldCBpbml0aWFsU3RhdGUgPSB0ZmMuemVyb3MoaW5wdXRzLnNoYXBlKTtcbiAgICAgIC8vIFtTYW1wbGVzXS5cbiAgICAgIGluaXRpYWxTdGF0ZSA9IHRmYy5zdW0oaW5pdGlhbFN0YXRlLCBbMSwgMl0pO1xuICAgICAgaW5pdGlhbFN0YXRlID0gSy5leHBhbmREaW1zKGluaXRpYWxTdGF0ZSk7ICAvLyBbU2FtcGxlcywgMV0uXG5cbiAgICAgIGlmIChBcnJheS5pc0FycmF5KHRoaXMuY2VsbC5zdGF0ZVNpemUpKSB7XG4gICAgICAgIHJldHVybiB0aGlzLmNlbGwuc3RhdGVTaXplLm1hcChcbiAgICAgICAgICAgIGRpbSA9PiBkaW0gPiAxID8gSy50aWxlKGluaXRpYWxTdGF0ZSwgWzEsIGRpbV0pIDogaW5pdGlhbFN0YXRlKTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHJldHVybiB0aGlzLmNlbGwuc3RhdGVTaXplID4gMSA/XG4gICAgICAgICAgICBbSy50aWxlKGluaXRpYWxTdGF0ZSwgWzEsIHRoaXMuY2VsbC5zdGF0ZVNpemVdKV0gOlxuICAgICAgICAgICAgW2luaXRpYWxTdGF0ZV07XG4gICAgICB9XG4gICAgfSk7XG4gIH1cblxuICBnZXQgdHJhaW5hYmxlV2VpZ2h0cygpOiBMYXllclZhcmlhYmxlW10ge1xuICAgIGlmICghdGhpcy50cmFpbmFibGUpIHtcbiAgICAgIHJldHVybiBbXTtcbiAgICB9XG4gICAgLy8gUG9ydGluZyBOb3RlOiBJbiBUeXBlU2NyaXB0LCBgdGhpc2AgaXMgYWx3YXlzIGFuIGluc3RhbmNlIG9mIGBMYXllcmAuXG4gICAgcmV0dXJuIHRoaXMuY2VsbC50cmFpbmFibGVXZWlnaHRzO1xuICB9XG5cbiAgZ2V0IG5vblRyYWluYWJsZVdlaWdodHMoKTogTGF5ZXJWYXJpYWJsZVtdIHtcbiAgICAvLyBQb3J0aW5nIE5vdGU6IEluIFR5cGVTY3JpcHQsIGB0aGlzYCBpcyBhbHdheXMgYW4gaW5zdGFuY2Ugb2YgYExheWVyYC5cbiAgICBpZiAoIXRoaXMudHJhaW5hYmxlKSB7XG4gICAgICByZXR1cm4gdGhpcy5jZWxsLndlaWdodHM7XG4gICAgfVxuICAgIHJldHVybiB0aGlzLmNlbGwubm9uVHJhaW5hYmxlV2VpZ2h0cztcbiAgfVxuXG4gIHNldEZhc3RXZWlnaHRJbml0RHVyaW5nQnVpbGQodmFsdWU6IGJvb2xlYW4pIHtcbiAgICBzdXBlci5zZXRGYXN0V2VpZ2h0SW5pdER1cmluZ0J1aWxkKHZhbHVlKTtcbiAgICBpZiAodGhpcy5jZWxsICE9IG51bGwpIHtcbiAgICAgIHRoaXMuY2VsbC5zZXRGYXN0V2VpZ2h0SW5pdER1cmluZ0J1aWxkKHZhbHVlKTtcbiAgICB9XG4gIH1cblxuICBnZXRDb25maWcoKTogc2VyaWFsaXphdGlvbi5Db25maWdEaWN0IHtcbiAgICBjb25zdCBiYXNlQ29uZmlnID0gc3VwZXIuZ2V0Q29uZmlnKCk7XG5cbiAgICBjb25zdCBjb25maWc6IHNlcmlhbGl6YXRpb24uQ29uZmlnRGljdCA9IHtcbiAgICAgIHJldHVyblNlcXVlbmNlczogdGhpcy5yZXR1cm5TZXF1ZW5jZXMsXG4gICAgICByZXR1cm5TdGF0ZTogdGhpcy5yZXR1cm5TdGF0ZSxcbiAgICAgIGdvQmFja3dhcmRzOiB0aGlzLmdvQmFja3dhcmRzLFxuICAgICAgc3RhdGVmdWw6IHRoaXMuc3RhdGVmdWwsXG4gICAgICB1bnJvbGw6IHRoaXMudW5yb2xsLFxuICAgIH07XG5cbiAgICBpZiAodGhpcy5udW1Db25zdGFudHMgIT0gbnVsbCkge1xuICAgICAgY29uZmlnWydudW1Db25zdGFudHMnXSA9IHRoaXMubnVtQ29uc3RhbnRzO1xuICAgIH1cblxuICAgIGNvbnN0IGNlbGxDb25maWcgPSB0aGlzLmNlbGwuZ2V0Q29uZmlnKCk7XG5cbiAgICBpZiAodGhpcy5nZXRDbGFzc05hbWUoKSA9PT0gUk5OLmNsYXNzTmFtZSkge1xuICAgICAgY29uZmlnWydjZWxsJ10gPSB7XG4gICAgICAgICdjbGFzc05hbWUnOiB0aGlzLmNlbGwuZ2V0Q2xhc3NOYW1lKCksXG4gICAgICAgICdjb25maWcnOiBjZWxsQ29uZmlnLFxuICAgICAgfSBhcyBzZXJpYWxpemF0aW9uLkNvbmZpZ0RpY3RWYWx1ZTtcbiAgICB9XG5cbiAgICAvLyB0aGlzIG9yZGVyIGlzIG5lY2Vzc2FyeSwgdG8gcHJldmVudCBjZWxsIG5hbWUgZnJvbSByZXBsYWNpbmcgbGF5ZXIgbmFtZVxuICAgIHJldHVybiB7Li4uY2VsbENvbmZpZywgLi4uYmFzZUNvbmZpZywgLi4uY29uZmlnfTtcbiAgfVxuXG4gIC8qKiBAbm9jb2xsYXBzZSAqL1xuICBzdGF0aWMgZnJvbUNvbmZpZzxUIGV4dGVuZHMgc2VyaWFsaXphdGlvbi5TZXJpYWxpemFibGU+KFxuICAgICAgY2xzOiBzZXJpYWxpemF0aW9uLlNlcmlhbGl6YWJsZUNvbnN0cnVjdG9yPFQ+LFxuICAgICAgY29uZmlnOiBzZXJpYWxpemF0aW9uLkNvbmZpZ0RpY3QsXG4gICAgICBjdXN0b21PYmplY3RzID0ge30gYXMgc2VyaWFsaXphdGlvbi5Db25maWdEaWN0KTogVCB7XG4gICAgY29uc3QgY2VsbENvbmZpZyA9IGNvbmZpZ1snY2VsbCddIGFzIHNlcmlhbGl6YXRpb24uQ29uZmlnRGljdDtcbiAgICBjb25zdCBjZWxsID0gZGVzZXJpYWxpemUoY2VsbENvbmZpZywgY3VzdG9tT2JqZWN0cykgYXMgUk5OQ2VsbDtcbiAgICByZXR1cm4gbmV3IGNscyhPYmplY3QuYXNzaWduKGNvbmZpZywge2NlbGx9KSk7XG4gIH1cbn1cbnNlcmlhbGl6YXRpb24ucmVnaXN0ZXJDbGFzcyhSTk4pO1xuXG4vLyBQb3J0aW5nIE5vdGU6IFRoaXMgaXMgYSBjb21tb24gcGFyZW50IGNsYXNzIGZvciBSTk4gY2VsbHMuIFRoZXJlIGlzIG5vXG4vLyBlcXVpdmFsZW50IG9mIHRoaXMgaW4gUHlLZXJhcy4gSGF2aW5nIGEgY29tbW9uIHBhcmVudCBjbGFzcyBmb3Jnb2VzIHRoZVxuLy8gIG5lZWQgZm9yIGBoYXNfYXR0cihjZWxsLCAuLi4pYCBjaGVja3Mgb3IgaXRzIFR5cGVTY3JpcHQgZXF1aXZhbGVudC5cbi8qKlxuICogQW4gUk5OQ2VsbCBsYXllci5cbiAqXG4gKiBAZG9jIHtoZWFkaW5nOiAnTGF5ZXJzJywgc3ViaGVhZGluZzogJ0NsYXNzZXMnfVxuICovXG5leHBvcnQgYWJzdHJhY3QgY2xhc3MgUk5OQ2VsbCBleHRlbmRzIExheWVyIHtcbiAgLyoqXG4gICAqIFNpemUocykgb2YgdGhlIHN0YXRlcy5cbiAgICogRm9yIFJOTiBjZWxscyB3aXRoIG9ubHkgYSBzaW5nbGUgc3RhdGUsIHRoaXMgaXMgYSBzaW5nbGUgaW50ZWdlci5cbiAgICovXG4gIC8vIFNlZVxuICAvLyBodHRwczovL3d3dy50eXBlc2NyaXB0bGFuZy5vcmcvZG9jcy9oYW5kYm9vay9yZWxlYXNlLW5vdGVzL3R5cGVzY3JpcHQtNC0wLmh0bWwjcHJvcGVydGllcy1vdmVycmlkaW5nLWFjY2Vzc29ycy1hbmQtdmljZS12ZXJzYS1pcy1hbi1lcnJvclxuICBwdWJsaWMgYWJzdHJhY3Qgc3RhdGVTaXplOiBudW1iZXJ8bnVtYmVyW107XG4gIHB1YmxpYyBkcm9wb3V0TWFzazogVGVuc29yfFRlbnNvcltdO1xuICBwdWJsaWMgcmVjdXJyZW50RHJvcG91dE1hc2s6IFRlbnNvcnxUZW5zb3JbXTtcbn1cblxuZXhwb3J0IGRlY2xhcmUgaW50ZXJmYWNlIFNpbXBsZVJOTkNlbGxMYXllckFyZ3MgZXh0ZW5kcyBMYXllckFyZ3Mge1xuICAvKipcbiAgICogdW5pdHM6IFBvc2l0aXZlIGludGVnZXIsIGRpbWVuc2lvbmFsaXR5IG9mIHRoZSBvdXRwdXQgc3BhY2UuXG4gICAqL1xuICB1bml0czogbnVtYmVyO1xuXG4gIC8qKlxuICAgKiBBY3RpdmF0aW9uIGZ1bmN0aW9uIHRvIHVzZS5cbiAgICogRGVmYXVsdDogaHlwZXJib2xpYyB0YW5nZW50ICgndGFuaCcpLlxuICAgKiBJZiB5b3UgcGFzcyBgbnVsbGAsICAnbGluZWFyJyBhY3RpdmF0aW9uIHdpbGwgYmUgYXBwbGllZC5cbiAgICovXG4gIGFjdGl2YXRpb24/OiBBY3RpdmF0aW9uSWRlbnRpZmllcjtcblxuICAvKipcbiAgICogV2hldGhlciB0aGUgbGF5ZXIgdXNlcyBhIGJpYXMgdmVjdG9yLlxuICAgKi9cbiAgdXNlQmlhcz86IGJvb2xlYW47XG5cbiAgLyoqXG4gICAqIEluaXRpYWxpemVyIGZvciB0aGUgYGtlcm5lbGAgd2VpZ2h0cyBtYXRyaXgsIHVzZWQgZm9yIHRoZSBsaW5lYXJcbiAgICogdHJhbnNmb3JtYXRpb24gb2YgdGhlIGlucHV0cy5cbiAgICovXG4gIGtlcm5lbEluaXRpYWxpemVyPzogSW5pdGlhbGl6ZXJJZGVudGlmaWVyfEluaXRpYWxpemVyO1xuXG4gIC8qKlxuICAgKiBJbml0aWFsaXplciBmb3IgdGhlIGByZWN1cnJlbnRLZXJuZWxgIHdlaWdodHMgbWF0cml4LCB1c2VkIGZvclxuICAgKiBsaW5lYXIgdHJhbnNmb3JtYXRpb24gb2YgdGhlIHJlY3VycmVudCBzdGF0ZS5cbiAgICovXG4gIHJlY3VycmVudEluaXRpYWxpemVyPzogSW5pdGlhbGl6ZXJJZGVudGlmaWVyfEluaXRpYWxpemVyO1xuXG4gIC8qKlxuICAgKiBJbml0aWFsaXplciBmb3IgdGhlIGJpYXMgdmVjdG9yLlxuICAgKi9cbiAgYmlhc0luaXRpYWxpemVyPzogSW5pdGlhbGl6ZXJJZGVudGlmaWVyfEluaXRpYWxpemVyO1xuXG4gIC8qKlxuICAgKiBSZWd1bGFyaXplciBmdW5jdGlvbiBhcHBsaWVkIHRvIHRoZSBga2VybmVsYCB3ZWlnaHRzIG1hdHJpeC5cbiAgICovXG4gIGtlcm5lbFJlZ3VsYXJpemVyPzogUmVndWxhcml6ZXJJZGVudGlmaWVyfFJlZ3VsYXJpemVyO1xuXG4gIC8qKlxuICAgKiBSZWd1bGFyaXplciBmdW5jdGlvbiBhcHBsaWVkIHRvIHRoZSBgcmVjdXJyZW50X2tlcm5lbGAgd2VpZ2h0cyBtYXRyaXguXG4gICAqL1xuICByZWN1cnJlbnRSZWd1bGFyaXplcj86IFJlZ3VsYXJpemVySWRlbnRpZmllcnxSZWd1bGFyaXplcjtcblxuICAvKipcbiAgICogUmVndWxhcml6ZXIgZnVuY3Rpb24gYXBwbGllZCB0byB0aGUgYmlhcyB2ZWN0b3IuXG4gICAqL1xuICBiaWFzUmVndWxhcml6ZXI/OiBSZWd1bGFyaXplcklkZW50aWZpZXJ8UmVndWxhcml6ZXI7XG5cbiAgLyoqXG4gICAqIENvbnN0cmFpbnQgZnVuY3Rpb24gYXBwbGllZCB0byB0aGUgYGtlcm5lbGAgd2VpZ2h0cyBtYXRyaXguXG4gICAqL1xuICBrZXJuZWxDb25zdHJhaW50PzogQ29uc3RyYWludElkZW50aWZpZXJ8Q29uc3RyYWludDtcblxuICAvKipcbiAgICogQ29uc3RyYWludCBmdW5jdGlvbiBhcHBsaWVkIHRvIHRoZSBgcmVjdXJyZW50S2VybmVsYCB3ZWlnaHRzIG1hdHJpeC5cbiAgICovXG4gIHJlY3VycmVudENvbnN0cmFpbnQ/OiBDb25zdHJhaW50SWRlbnRpZmllcnxDb25zdHJhaW50O1xuXG4gIC8qKlxuICAgKiBDb25zdHJhaW50IGZ1bmN0aW9uIGFwcGxpZWQgdG8gdGhlIGJpYXMgdmVjdG9yLlxuICAgKi9cbiAgYmlhc0NvbnN0cmFpbnQ/OiBDb25zdHJhaW50SWRlbnRpZmllcnxDb25zdHJhaW50O1xuXG4gIC8qKlxuICAgKiBGbG9hdCBudW1iZXIgYmV0d2VlbiAwIGFuZCAxLiBGcmFjdGlvbiBvZiB0aGUgdW5pdHMgdG8gZHJvcCBmb3IgdGhlIGxpbmVhclxuICAgKiB0cmFuc2Zvcm1hdGlvbiBvZiB0aGUgaW5wdXRzLlxuICAgKi9cbiAgZHJvcG91dD86IG51bWJlcjtcblxuICAvKipcbiAgICogRmxvYXQgbnVtYmVyIGJldHdlZW4gMCBhbmQgMS4gRnJhY3Rpb24gb2YgdGhlIHVuaXRzIHRvIGRyb3AgZm9yIHRoZSBsaW5lYXJcbiAgICogdHJhbnNmb3JtYXRpb24gb2YgdGhlIHJlY3VycmVudCBzdGF0ZS5cbiAgICovXG4gIHJlY3VycmVudERyb3BvdXQ/OiBudW1iZXI7XG5cbiAgLyoqXG4gICAqIFRoaXMgaXMgYWRkZWQgZm9yIHRlc3QgREkgcHVycG9zZS5cbiAgICovXG4gIGRyb3BvdXRGdW5jPzogRnVuY3Rpb247XG59XG5cbmV4cG9ydCBjbGFzcyBTaW1wbGVSTk5DZWxsIGV4dGVuZHMgUk5OQ2VsbCB7XG4gIC8qKiBAbm9jb2xsYXBzZSAqL1xuICBzdGF0aWMgY2xhc3NOYW1lID0gJ1NpbXBsZVJOTkNlbGwnO1xuICByZWFkb25seSB1bml0czogbnVtYmVyO1xuICByZWFkb25seSBhY3RpdmF0aW9uOiBBY3RpdmF0aW9uO1xuICByZWFkb25seSB1c2VCaWFzOiBib29sZWFuO1xuXG4gIHJlYWRvbmx5IGtlcm5lbEluaXRpYWxpemVyOiBJbml0aWFsaXplcjtcbiAgcmVhZG9ubHkgcmVjdXJyZW50SW5pdGlhbGl6ZXI6IEluaXRpYWxpemVyO1xuICByZWFkb25seSBiaWFzSW5pdGlhbGl6ZXI6IEluaXRpYWxpemVyO1xuXG4gIHJlYWRvbmx5IGtlcm5lbENvbnN0cmFpbnQ6IENvbnN0cmFpbnQ7XG4gIHJlYWRvbmx5IHJlY3VycmVudENvbnN0cmFpbnQ6IENvbnN0cmFpbnQ7XG4gIHJlYWRvbmx5IGJpYXNDb25zdHJhaW50OiBDb25zdHJhaW50O1xuXG4gIHJlYWRvbmx5IGtlcm5lbFJlZ3VsYXJpemVyOiBSZWd1bGFyaXplcjtcbiAgcmVhZG9ubHkgcmVjdXJyZW50UmVndWxhcml6ZXI6IFJlZ3VsYXJpemVyO1xuICByZWFkb25seSBiaWFzUmVndWxhcml6ZXI6IFJlZ3VsYXJpemVyO1xuXG4gIHJlYWRvbmx5IGRyb3BvdXQ6IG51bWJlcjtcbiAgcmVhZG9ubHkgcmVjdXJyZW50RHJvcG91dDogbnVtYmVyO1xuICByZWFkb25seSBkcm9wb3V0RnVuYzogRnVuY3Rpb247XG5cbiAgcmVhZG9ubHkgc3RhdGVTaXplOiBudW1iZXI7XG5cbiAga2VybmVsOiBMYXllclZhcmlhYmxlO1xuICByZWN1cnJlbnRLZXJuZWw6IExheWVyVmFyaWFibGU7XG4gIGJpYXM6IExheWVyVmFyaWFibGU7XG5cbiAgcmVhZG9ubHkgREVGQVVMVF9BQ1RJVkFUSU9OID0gJ3RhbmgnO1xuICByZWFkb25seSBERUZBVUxUX0tFUk5FTF9JTklUSUFMSVpFUiA9ICdnbG9yb3ROb3JtYWwnO1xuICByZWFkb25seSBERUZBVUxUX1JFQ1VSUkVOVF9JTklUSUFMSVpFUiA9ICdvcnRob2dvbmFsJztcbiAgcmVhZG9ubHkgREVGQVVMVF9CSUFTX0lOSVRJQUxJWkVSOiBJbml0aWFsaXplcklkZW50aWZpZXIgPSAnemVyb3MnO1xuXG4gIGNvbnN0cnVjdG9yKGFyZ3M6IFNpbXBsZVJOTkNlbGxMYXllckFyZ3MpIHtcbiAgICBzdXBlcihhcmdzKTtcbiAgICB0aGlzLnVuaXRzID0gYXJncy51bml0cztcbiAgICBhc3NlcnRQb3NpdGl2ZUludGVnZXIodGhpcy51bml0cywgYHVuaXRzYCk7XG4gICAgdGhpcy5hY3RpdmF0aW9uID0gZ2V0QWN0aXZhdGlvbihcbiAgICAgICAgYXJncy5hY3RpdmF0aW9uID09IG51bGwgPyB0aGlzLkRFRkFVTFRfQUNUSVZBVElPTiA6IGFyZ3MuYWN0aXZhdGlvbik7XG4gICAgdGhpcy51c2VCaWFzID0gYXJncy51c2VCaWFzID09IG51bGwgPyB0cnVlIDogYXJncy51c2VCaWFzO1xuXG4gICAgdGhpcy5rZXJuZWxJbml0aWFsaXplciA9IGdldEluaXRpYWxpemVyKFxuICAgICAgICBhcmdzLmtlcm5lbEluaXRpYWxpemVyIHx8IHRoaXMuREVGQVVMVF9LRVJORUxfSU5JVElBTElaRVIpO1xuICAgIHRoaXMucmVjdXJyZW50SW5pdGlhbGl6ZXIgPSBnZXRJbml0aWFsaXplcihcbiAgICAgICAgYXJncy5yZWN1cnJlbnRJbml0aWFsaXplciB8fCB0aGlzLkRFRkFVTFRfUkVDVVJSRU5UX0lOSVRJQUxJWkVSKTtcblxuICAgIHRoaXMuYmlhc0luaXRpYWxpemVyID1cbiAgICAgICAgZ2V0SW5pdGlhbGl6ZXIoYXJncy5iaWFzSW5pdGlhbGl6ZXIgfHwgdGhpcy5ERUZBVUxUX0JJQVNfSU5JVElBTElaRVIpO1xuXG4gICAgdGhpcy5rZXJuZWxSZWd1bGFyaXplciA9IGdldFJlZ3VsYXJpemVyKGFyZ3Mua2VybmVsUmVndWxhcml6ZXIpO1xuICAgIHRoaXMucmVjdXJyZW50UmVndWxhcml6ZXIgPSBnZXRSZWd1bGFyaXplcihhcmdzLnJlY3VycmVudFJlZ3VsYXJpemVyKTtcbiAgICB0aGlzLmJpYXNSZWd1bGFyaXplciA9IGdldFJlZ3VsYXJpemVyKGFyZ3MuYmlhc1JlZ3VsYXJpemVyKTtcblxuICAgIHRoaXMua2VybmVsQ29uc3RyYWludCA9IGdldENvbnN0cmFpbnQoYXJncy5rZXJuZWxDb25zdHJhaW50KTtcbiAgICB0aGlzLnJlY3VycmVudENvbnN0cmFpbnQgPSBnZXRDb25zdHJhaW50KGFyZ3MucmVjdXJyZW50Q29uc3RyYWludCk7XG4gICAgdGhpcy5iaWFzQ29uc3RyYWludCA9IGdldENvbnN0cmFpbnQoYXJncy5iaWFzQ29uc3RyYWludCk7XG5cbiAgICB0aGlzLmRyb3BvdXQgPSBtYXRoX3V0aWxzLm1pbihcbiAgICAgICAgWzEsIG1hdGhfdXRpbHMubWF4KFswLCBhcmdzLmRyb3BvdXQgPT0gbnVsbCA/IDAgOiBhcmdzLmRyb3BvdXRdKV0pO1xuICAgIHRoaXMucmVjdXJyZW50RHJvcG91dCA9IG1hdGhfdXRpbHMubWluKFtcbiAgICAgIDEsXG4gICAgICBtYXRoX3V0aWxzLm1heChcbiAgICAgICAgICBbMCwgYXJncy5yZWN1cnJlbnREcm9wb3V0ID09IG51bGwgPyAwIDogYXJncy5yZWN1cnJlbnREcm9wb3V0XSlcbiAgICBdKTtcbiAgICB0aGlzLmRyb3BvdXRGdW5jID0gYXJncy5kcm9wb3V0RnVuYztcbiAgICB0aGlzLnN0YXRlU2l6ZSA9IHRoaXMudW5pdHM7XG4gICAgdGhpcy5kcm9wb3V0TWFzayA9IG51bGw7XG4gICAgdGhpcy5yZWN1cnJlbnREcm9wb3V0TWFzayA9IG51bGw7XG4gIH1cblxuICBidWlsZChpbnB1dFNoYXBlOiBTaGFwZXxTaGFwZVtdKTogdm9pZCB7XG4gICAgaW5wdXRTaGFwZSA9IGdldEV4YWN0bHlPbmVTaGFwZShpbnB1dFNoYXBlKTtcbiAgICAvLyBUT0RPKGNhaXMpOiBVc2UgcmVndWxhcml6ZXIuXG4gICAgdGhpcy5rZXJuZWwgPSB0aGlzLmFkZFdlaWdodChcbiAgICAgICAgJ2tlcm5lbCcsIFtpbnB1dFNoYXBlW2lucHV0U2hhcGUubGVuZ3RoIC0gMV0sIHRoaXMudW5pdHNdLCBudWxsLFxuICAgICAgICB0aGlzLmtlcm5lbEluaXRpYWxpemVyLCB0aGlzLmtlcm5lbFJlZ3VsYXJpemVyLCB0cnVlLFxuICAgICAgICB0aGlzLmtlcm5lbENvbnN0cmFpbnQpO1xuICAgIHRoaXMucmVjdXJyZW50S2VybmVsID0gdGhpcy5hZGRXZWlnaHQoXG4gICAgICAgICdyZWN1cnJlbnRfa2VybmVsJywgW3RoaXMudW5pdHMsIHRoaXMudW5pdHNdLCBudWxsLFxuICAgICAgICB0aGlzLnJlY3VycmVudEluaXRpYWxpemVyLCB0aGlzLnJlY3VycmVudFJlZ3VsYXJpemVyLCB0cnVlLFxuICAgICAgICB0aGlzLnJlY3VycmVudENvbnN0cmFpbnQpO1xuICAgIGlmICh0aGlzLnVzZUJpYXMpIHtcbiAgICAgIHRoaXMuYmlhcyA9IHRoaXMuYWRkV2VpZ2h0KFxuICAgICAgICAgICdiaWFzJywgW3RoaXMudW5pdHNdLCBudWxsLCB0aGlzLmJpYXNJbml0aWFsaXplcixcbiAgICAgICAgICB0aGlzLmJpYXNSZWd1bGFyaXplciwgdHJ1ZSwgdGhpcy5iaWFzQ29uc3RyYWludCk7XG4gICAgfSBlbHNlIHtcbiAgICAgIHRoaXMuYmlhcyA9IG51bGw7XG4gICAgfVxuICAgIHRoaXMuYnVpbHQgPSB0cnVlO1xuICB9XG5cbiAgLy8gUG9ydGluZyBOb3RlOiBQeUtlcmFzJyBlcXVpdmFsZW50IG9mIHRoaXMgbWV0aG9kIHRha2VzIHR3byB0ZW5zb3IgaW5wdXRzOlxuICAvLyAgIGBpbnB1dHNgIGFuZCBgc3RhdGVzYC4gSGVyZSwgdGhlIHR3byB0ZW5zb3JzIGFyZSBjb21iaW5lZCBpbnRvIGFuXG4gIC8vICAgYFRlbnNvcltdYCBBcnJheSBhcyB0aGUgZmlyc3QgaW5wdXQgYXJndW1lbnQuXG4gIC8vICAgU2ltaWxhcmx5LCBQeUtlcmFzJyBlcXVpdmFsZW50IG9mIHRoaXMgbWV0aG9kIHJldHVybnMgdHdvIHZhbHVlczpcbiAgLy8gICAgYG91dHB1dGAgYW5kIGBbb3V0cHV0XWAuIEhlcmUgdGhlIHR3byBhcmUgY29tYmluZWQgaW50byBvbmUgbGVuZ3RoLTJcbiAgLy8gICAgYFRlbnNvcltdYCwgY29uc2lzdGluZyBvZiBgb3V0cHV0YCByZXBlYXRlZC5cbiAgY2FsbChpbnB1dHM6IFRlbnNvcnxUZW5zb3JbXSwga3dhcmdzOiBLd2FyZ3MpOiBUZW5zb3J8VGVuc29yW10ge1xuICAgIHJldHVybiB0aWR5KCgpID0+IHtcbiAgICAgIGlucHV0cyA9IGlucHV0cyBhcyBUZW5zb3JbXTtcbiAgICAgIGlmIChpbnB1dHMubGVuZ3RoICE9PSAyKSB7XG4gICAgICAgIHRocm93IG5ldyBWYWx1ZUVycm9yKFxuICAgICAgICAgICAgYFNpbXBsZVJOTkNlbGwgZXhwZWN0cyAyIGlucHV0IFRlbnNvcnMsIGdvdCAke2lucHV0cy5sZW5ndGh9LmApO1xuICAgICAgfVxuICAgICAgbGV0IHByZXZPdXRwdXQgPSBpbnB1dHNbMV07XG4gICAgICBpbnB1dHMgPSBpbnB1dHNbMF07XG4gICAgICBjb25zdCB0cmFpbmluZyA9IGt3YXJnc1sndHJhaW5pbmcnXSA9PSBudWxsID8gZmFsc2UgOiBrd2FyZ3NbJ3RyYWluaW5nJ107XG5cbiAgICAgIGlmICgwIDwgdGhpcy5kcm9wb3V0ICYmIHRoaXMuZHJvcG91dCA8IDEgJiYgdGhpcy5kcm9wb3V0TWFzayA9PSBudWxsKSB7XG4gICAgICAgIHRoaXMuZHJvcG91dE1hc2sgPSBnZW5lcmF0ZURyb3BvdXRNYXNrKHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb25lczogKCkgPT4gdGZjLm9uZXNMaWtlKGlucHV0cyBhcyBUZW5zb3IpLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICByYXRlOiB0aGlzLmRyb3BvdXQsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRyYWluaW5nLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkcm9wb3V0RnVuYzogdGhpcy5kcm9wb3V0RnVuYyxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgIH0pIGFzIFRlbnNvcjtcbiAgICAgIH1cbiAgICAgIGlmICgwIDwgdGhpcy5yZWN1cnJlbnREcm9wb3V0ICYmIHRoaXMucmVjdXJyZW50RHJvcG91dCA8IDEgJiZcbiAgICAgICAgICB0aGlzLnJlY3VycmVudERyb3BvdXRNYXNrID09IG51bGwpIHtcbiAgICAgICAgdGhpcy5yZWN1cnJlbnREcm9wb3V0TWFzayA9IGdlbmVyYXRlRHJvcG91dE1hc2soe1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvbmVzOiAoKSA9PiB0ZmMub25lc0xpa2UocHJldk91dHB1dCksXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJhdGU6IHRoaXMucmVjdXJyZW50RHJvcG91dCxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdHJhaW5pbmcsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRyb3BvdXRGdW5jOiB0aGlzLmRyb3BvdXRGdW5jLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSkgYXMgVGVuc29yO1xuICAgICAgfVxuICAgICAgbGV0IGg6IFRlbnNvcjtcbiAgICAgIGNvbnN0IGRwTWFzazogVGVuc29yID0gdGhpcy5kcm9wb3V0TWFzayBhcyBUZW5zb3I7XG4gICAgICBjb25zdCByZWNEcE1hc2s6IFRlbnNvciA9IHRoaXMucmVjdXJyZW50RHJvcG91dE1hc2sgYXMgVGVuc29yO1xuICAgICAgaWYgKGRwTWFzayAhPSBudWxsKSB7XG4gICAgICAgIGggPSBLLmRvdCh0ZmMubXVsKGlucHV0cywgZHBNYXNrKSwgdGhpcy5rZXJuZWwucmVhZCgpKTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIGggPSBLLmRvdChpbnB1dHMsIHRoaXMua2VybmVsLnJlYWQoKSk7XG4gICAgICB9XG4gICAgICBpZiAodGhpcy5iaWFzICE9IG51bGwpIHtcbiAgICAgICAgaCA9IEsuYmlhc0FkZChoLCB0aGlzLmJpYXMucmVhZCgpKTtcbiAgICAgIH1cbiAgICAgIGlmIChyZWNEcE1hc2sgIT0gbnVsbCkge1xuICAgICAgICBwcmV2T3V0cHV0ID0gdGZjLm11bChwcmV2T3V0cHV0LCByZWNEcE1hc2spO1xuICAgICAgfVxuICAgICAgbGV0IG91dHB1dCA9IHRmYy5hZGQoaCwgSy5kb3QocHJldk91dHB1dCwgdGhpcy5yZWN1cnJlbnRLZXJuZWwucmVhZCgpKSk7XG4gICAgICBpZiAodGhpcy5hY3RpdmF0aW9uICE9IG51bGwpIHtcbiAgICAgICAgb3V0cHV0ID0gdGhpcy5hY3RpdmF0aW9uLmFwcGx5KG91dHB1dCk7XG4gICAgICB9XG5cbiAgICAgIC8vIFRPRE8oY2Fpcyk6IFByb3Blcmx5IHNldCBsZWFybmluZyBwaGFzZSBvbiBvdXRwdXQgdGVuc29yP1xuICAgICAgcmV0dXJuIFtvdXRwdXQsIG91dHB1dF07XG4gICAgfSk7XG4gIH1cblxuICBnZXRDb25maWcoKTogc2VyaWFsaXphdGlvbi5Db25maWdEaWN0IHtcbiAgICBjb25zdCBiYXNlQ29uZmlnID0gc3VwZXIuZ2V0Q29uZmlnKCk7XG5cbiAgICBjb25zdCBjb25maWc6IHNlcmlhbGl6YXRpb24uQ29uZmlnRGljdCA9IHtcbiAgICAgIHVuaXRzOiB0aGlzLnVuaXRzLFxuICAgICAgYWN0aXZhdGlvbjogc2VyaWFsaXplQWN0aXZhdGlvbih0aGlzLmFjdGl2YXRpb24pLFxuICAgICAgdXNlQmlhczogdGhpcy51c2VCaWFzLFxuICAgICAga2VybmVsSW5pdGlhbGl6ZXI6IHNlcmlhbGl6ZUluaXRpYWxpemVyKHRoaXMua2VybmVsSW5pdGlhbGl6ZXIpLFxuICAgICAgcmVjdXJyZW50SW5pdGlhbGl6ZXI6IHNlcmlhbGl6ZUluaXRpYWxpemVyKHRoaXMucmVjdXJyZW50SW5pdGlhbGl6ZXIpLFxuICAgICAgYmlhc0luaXRpYWxpemVyOiBzZXJpYWxpemVJbml0aWFsaXplcih0aGlzLmJpYXNJbml0aWFsaXplciksXG4gICAgICBrZXJuZWxSZWd1bGFyaXplcjogc2VyaWFsaXplUmVndWxhcml6ZXIodGhpcy5rZXJuZWxSZWd1bGFyaXplciksXG4gICAgICByZWN1cnJlbnRSZWd1bGFyaXplcjogc2VyaWFsaXplUmVndWxhcml6ZXIodGhpcy5yZWN1cnJlbnRSZWd1bGFyaXplciksXG4gICAgICBiaWFzUmVndWxhcml6ZXI6IHNlcmlhbGl6ZVJlZ3VsYXJpemVyKHRoaXMuYmlhc1JlZ3VsYXJpemVyKSxcbiAgICAgIGFjdGl2aXR5UmVndWxhcml6ZXI6IHNlcmlhbGl6ZVJlZ3VsYXJpemVyKHRoaXMuYWN0aXZpdHlSZWd1bGFyaXplciksXG4gICAgICBrZXJuZWxDb25zdHJhaW50OiBzZXJpYWxpemVDb25zdHJhaW50KHRoaXMua2VybmVsQ29uc3RyYWludCksXG4gICAgICByZWN1cnJlbnRDb25zdHJhaW50OiBzZXJpYWxpemVDb25zdHJhaW50KHRoaXMucmVjdXJyZW50Q29uc3RyYWludCksXG4gICAgICBiaWFzQ29uc3RyYWludDogc2VyaWFsaXplQ29uc3RyYWludCh0aGlzLmJpYXNDb25zdHJhaW50KSxcbiAgICAgIGRyb3BvdXQ6IHRoaXMuZHJvcG91dCxcbiAgICAgIHJlY3VycmVudERyb3BvdXQ6IHRoaXMucmVjdXJyZW50RHJvcG91dCxcbiAgICB9O1xuXG4gICAgcmV0dXJuIHsuLi5iYXNlQ29uZmlnLCAuLi5jb25maWd9O1xuICB9XG59XG5zZXJpYWxpemF0aW9uLnJlZ2lzdGVyQ2xhc3MoU2ltcGxlUk5OQ2VsbCk7XG5cbmV4cG9ydCBkZWNsYXJlIGludGVyZmFjZSBTaW1wbGVSTk5MYXllckFyZ3MgZXh0ZW5kcyBCYXNlUk5OTGF5ZXJBcmdzIHtcbiAgLyoqXG4gICAqIFBvc2l0aXZlIGludGVnZXIsIGRpbWVuc2lvbmFsaXR5IG9mIHRoZSBvdXRwdXQgc3BhY2UuXG4gICAqL1xuICB1bml0czogbnVtYmVyO1xuXG4gIC8qKlxuICAgKiBBY3RpdmF0aW9uIGZ1bmN0aW9uIHRvIHVzZS5cbiAgICpcbiAgICogRGVmYXVsdHMgdG8gIGh5cGVyYm9saWMgdGFuZ2VudCAoYHRhbmhgKVxuICAgKlxuICAgKiBJZiB5b3UgcGFzcyBgbnVsbGAsIG5vIGFjdGl2YXRpb24gd2lsbCBiZSBhcHBsaWVkLlxuICAgKi9cbiAgYWN0aXZhdGlvbj86IEFjdGl2YXRpb25JZGVudGlmaWVyO1xuXG4gIC8qKlxuICAgKiBXaGV0aGVyIHRoZSBsYXllciB1c2VzIGEgYmlhcyB2ZWN0b3IuXG4gICAqL1xuICB1c2VCaWFzPzogYm9vbGVhbjtcblxuICAvKipcbiAgICogSW5pdGlhbGl6ZXIgZm9yIHRoZSBga2VybmVsYCB3ZWlnaHRzIG1hdHJpeCwgdXNlZCBmb3IgdGhlIGxpbmVhclxuICAgKiB0cmFuc2Zvcm1hdGlvbiBvZiB0aGUgaW5wdXRzLlxuICAgKi9cbiAga2VybmVsSW5pdGlhbGl6ZXI/OiBJbml0aWFsaXplcklkZW50aWZpZXJ8SW5pdGlhbGl6ZXI7XG5cbiAgLyoqXG4gICAqIEluaXRpYWxpemVyIGZvciB0aGUgYHJlY3VycmVudEtlcm5lbGAgd2VpZ2h0cyBtYXRyaXgsIHVzZWQgZm9yXG4gICAqIGxpbmVhciB0cmFuc2Zvcm1hdGlvbiBvZiB0aGUgcmVjdXJyZW50IHN0YXRlLlxuICAgKi9cbiAgcmVjdXJyZW50SW5pdGlhbGl6ZXI/OiBJbml0aWFsaXplcklkZW50aWZpZXJ8SW5pdGlhbGl6ZXI7XG5cbiAgLyoqXG4gICAqIEluaXRpYWxpemVyIGZvciB0aGUgYmlhcyB2ZWN0b3IuXG4gICAqL1xuICBiaWFzSW5pdGlhbGl6ZXI/OiBJbml0aWFsaXplcklkZW50aWZpZXJ8SW5pdGlhbGl6ZXI7XG5cbiAgLyoqXG4gICAqIFJlZ3VsYXJpemVyIGZ1bmN0aW9uIGFwcGxpZWQgdG8gdGhlIGtlcm5lbCB3ZWlnaHRzIG1hdHJpeC5cbiAgICovXG4gIGtlcm5lbFJlZ3VsYXJpemVyPzogUmVndWxhcml6ZXJJZGVudGlmaWVyfFJlZ3VsYXJpemVyO1xuXG4gIC8qKlxuICAgKiBSZWd1bGFyaXplciBmdW5jdGlvbiBhcHBsaWVkIHRvIHRoZSByZWN1cnJlbnRLZXJuZWwgd2VpZ2h0cyBtYXRyaXguXG4gICAqL1xuICByZWN1cnJlbnRSZWd1bGFyaXplcj86IFJlZ3VsYXJpemVySWRlbnRpZmllcnxSZWd1bGFyaXplcjtcblxuICAvKipcbiAgICogUmVndWxhcml6ZXIgZnVuY3Rpb24gYXBwbGllZCB0byB0aGUgYmlhcyB2ZWN0b3IuXG4gICAqL1xuICBiaWFzUmVndWxhcml6ZXI/OiBSZWd1bGFyaXplcklkZW50aWZpZXJ8UmVndWxhcml6ZXI7XG5cbiAgLyoqXG4gICAqIENvbnN0cmFpbnQgZnVuY3Rpb24gYXBwbGllZCB0byB0aGUga2VybmVsIHdlaWdodHMgbWF0cml4LlxuICAgKi9cbiAga2VybmVsQ29uc3RyYWludD86IENvbnN0cmFpbnRJZGVudGlmaWVyfENvbnN0cmFpbnQ7XG5cbiAgLyoqXG4gICAqIENvbnN0cmFpbnQgZnVuY3Rpb24gYXBwbGllZCB0byB0aGUgcmVjdXJyZW50S2VybmVsIHdlaWdodHMgbWF0cml4LlxuICAgKi9cbiAgcmVjdXJyZW50Q29uc3RyYWludD86IENvbnN0cmFpbnRJZGVudGlmaWVyfENvbnN0cmFpbnQ7XG5cbiAgLyoqXG4gICAqIENvbnN0cmFpbnQgZnVuY3Rpb24gYXBwbGllZCB0byB0aGUgYmlhcyB2ZWN0b3IuXG4gICAqL1xuICBiaWFzQ29uc3RyYWludD86IENvbnN0cmFpbnRJZGVudGlmaWVyfENvbnN0cmFpbnQ7XG5cbiAgLyoqXG4gICAqIE51bWJlciBiZXR3ZWVuIDAgYW5kIDEuIEZyYWN0aW9uIG9mIHRoZSB1bml0cyB0byBkcm9wIGZvciB0aGUgbGluZWFyXG4gICAqIHRyYW5zZm9ybWF0aW9uIG9mIHRoZSBpbnB1dHMuXG4gICAqL1xuICBkcm9wb3V0PzogbnVtYmVyO1xuXG4gIC8qKlxuICAgKiBOdW1iZXIgYmV0d2VlbiAwIGFuZCAxLiBGcmFjdGlvbiBvZiB0aGUgdW5pdHMgdG8gZHJvcCBmb3IgdGhlIGxpbmVhclxuICAgKiB0cmFuc2Zvcm1hdGlvbiBvZiB0aGUgcmVjdXJyZW50IHN0YXRlLlxuICAgKi9cbiAgcmVjdXJyZW50RHJvcG91dD86IG51bWJlcjtcblxuICAvKipcbiAgICogVGhpcyBpcyBhZGRlZCBmb3IgdGVzdCBESSBwdXJwb3NlLlxuICAgKi9cbiAgZHJvcG91dEZ1bmM/OiBGdW5jdGlvbjtcbn1cblxuLyoqXG4gKiBSTk5MYXllckNvbmZpZyBpcyBpZGVudGljYWwgdG8gQmFzZVJOTkxheWVyQ29uZmlnLCBleGNlcHQgaXQgbWFrZXMgdGhlXG4gKiBgY2VsbGAgcHJvcGVydHkgcmVxdWlyZWQuIFRoaXMgaW50ZXJmYWNlIGlzIHRvIGJlIHVzZWQgd2l0aCBjb25zdHJ1Y3RvcnNcbiAqIG9mIGNvbmNyZXRlIFJOTiBsYXllciBzdWJ0eXBlcy5cbiAqL1xuZXhwb3J0IGRlY2xhcmUgaW50ZXJmYWNlIFJOTkxheWVyQXJncyBleHRlbmRzIEJhc2VSTk5MYXllckFyZ3Mge1xuICBjZWxsOiBSTk5DZWxsfFJOTkNlbGxbXTtcbn1cblxuZXhwb3J0IGNsYXNzIFNpbXBsZVJOTiBleHRlbmRzIFJOTiB7XG4gIC8qKiBAbm9jb2xsYXBzZSAqL1xuICBzdGF0aWMgY2xhc3NOYW1lID0gJ1NpbXBsZVJOTic7XG4gIGNvbnN0cnVjdG9yKGFyZ3M6IFNpbXBsZVJOTkxheWVyQXJncykge1xuICAgIGFyZ3MuY2VsbCA9IG5ldyBTaW1wbGVSTk5DZWxsKGFyZ3MpO1xuICAgIHN1cGVyKGFyZ3MgYXMgUk5OTGF5ZXJBcmdzKTtcbiAgICAvLyBUT0RPKGNhaXMpOiBBZGQgYWN0aXZpdHlSZWd1bGFyaXplci5cbiAgfVxuXG4gIGNhbGwoaW5wdXRzOiBUZW5zb3J8VGVuc29yW10sIGt3YXJnczogS3dhcmdzKTogVGVuc29yfFRlbnNvcltdIHtcbiAgICByZXR1cm4gdGlkeSgoKSA9PiB7XG4gICAgICBpZiAodGhpcy5jZWxsLmRyb3BvdXRNYXNrICE9IG51bGwpIHtcbiAgICAgICAgdGZjLmRpc3Bvc2UodGhpcy5jZWxsLmRyb3BvdXRNYXNrKTtcbiAgICAgICAgdGhpcy5jZWxsLmRyb3BvdXRNYXNrID0gbnVsbDtcbiAgICAgIH1cbiAgICAgIGlmICh0aGlzLmNlbGwucmVjdXJyZW50RHJvcG91dE1hc2sgIT0gbnVsbCkge1xuICAgICAgICB0ZmMuZGlzcG9zZSh0aGlzLmNlbGwucmVjdXJyZW50RHJvcG91dE1hc2spO1xuICAgICAgICB0aGlzLmNlbGwucmVjdXJyZW50RHJvcG91dE1hc2sgPSBudWxsO1xuICAgICAgfVxuICAgICAgY29uc3QgbWFzayA9IGt3YXJncyA9PSBudWxsID8gbnVsbCA6IGt3YXJnc1snbWFzayddO1xuICAgICAgY29uc3QgdHJhaW5pbmcgPSBrd2FyZ3MgPT0gbnVsbCA/IG51bGwgOiBrd2FyZ3NbJ3RyYWluaW5nJ107XG4gICAgICBjb25zdCBpbml0aWFsU3RhdGU6IFRlbnNvcltdID1cbiAgICAgICAgICBrd2FyZ3MgPT0gbnVsbCA/IG51bGwgOiBrd2FyZ3NbJ2luaXRpYWxTdGF0ZSddO1xuICAgICAgcmV0dXJuIHN1cGVyLmNhbGwoaW5wdXRzLCB7bWFzaywgdHJhaW5pbmcsIGluaXRpYWxTdGF0ZX0pO1xuICAgIH0pO1xuICB9XG5cbiAgLyoqIEBub2NvbGxhcHNlICovXG4gIHN0YXRpYyBmcm9tQ29uZmlnPFQgZXh0ZW5kcyBzZXJpYWxpemF0aW9uLlNlcmlhbGl6YWJsZT4oXG4gICAgICBjbHM6IHNlcmlhbGl6YXRpb24uU2VyaWFsaXphYmxlQ29uc3RydWN0b3I8VD4sXG4gICAgICBjb25maWc6IHNlcmlhbGl6YXRpb24uQ29uZmlnRGljdCk6IFQge1xuICAgIHJldHVybiBuZXcgY2xzKGNvbmZpZyk7XG4gIH1cbn1cbnNlcmlhbGl6YXRpb24ucmVnaXN0ZXJDbGFzcyhTaW1wbGVSTk4pO1xuXG4vLyBQb3J0aW5nIE5vdGU6IFNpbmNlIHRoaXMgaXMgYSBzdXBlcnNldCBvZiBTaW1wbGVSTk5MYXllckNvbmZpZywgd2UgZXh0ZW5kXG4vLyAgIHRoYXQgaW50ZXJmYWNlIGluc3RlYWQgb2YgcmVwZWF0aW5nIHRoZSBmaWVsZHMuXG5leHBvcnQgZGVjbGFyZSBpbnRlcmZhY2UgR1JVQ2VsbExheWVyQXJncyBleHRlbmRzIFNpbXBsZVJOTkNlbGxMYXllckFyZ3Mge1xuICAvKipcbiAgICogQWN0aXZhdGlvbiBmdW5jdGlvbiB0byB1c2UgZm9yIHRoZSByZWN1cnJlbnQgc3RlcC5cbiAgICpcbiAgICogRGVmYXVsdHMgdG8gaGFyZCBzaWdtb2lkIChgaGFyZFNpZ21vaWRgKS5cbiAgICpcbiAgICogSWYgYG51bGxgLCBubyBhY3RpdmF0aW9uIGlzIGFwcGxpZWQuXG4gICAqL1xuICByZWN1cnJlbnRBY3RpdmF0aW9uPzogQWN0aXZhdGlvbklkZW50aWZpZXI7XG5cbiAgLyoqXG4gICAqIEltcGxlbWVudGF0aW9uIG1vZGUsIGVpdGhlciAxIG9yIDIuXG4gICAqXG4gICAqIE1vZGUgMSB3aWxsIHN0cnVjdHVyZSBpdHMgb3BlcmF0aW9ucyBhcyBhIGxhcmdlciBudW1iZXIgb2ZcbiAgICogICBzbWFsbGVyIGRvdCBwcm9kdWN0cyBhbmQgYWRkaXRpb25zLlxuICAgKlxuICAgKiBNb2RlIDIgd2lsbCBiYXRjaCB0aGVtIGludG8gZmV3ZXIsIGxhcmdlciBvcGVyYXRpb25zLiBUaGVzZSBtb2RlcyB3aWxsXG4gICAqIGhhdmUgZGlmZmVyZW50IHBlcmZvcm1hbmNlIHByb2ZpbGVzIG9uIGRpZmZlcmVudCBoYXJkd2FyZSBhbmRcbiAgICogZm9yIGRpZmZlcmVudCBhcHBsaWNhdGlvbnMuXG4gICAqXG4gICAqIE5vdGU6IEZvciBzdXBlcmlvciBwZXJmb3JtYW5jZSwgVGVuc29yRmxvdy5qcyBhbHdheXMgdXNlcyBpbXBsZW1lbnRhdGlvblxuICAgKiAyLCByZWdhcmRsZXNzIG9mIHRoZSBhY3R1YWwgdmFsdWUgb2YgdGhpcyBjb25maWd1cmF0aW9uIGZpZWxkLlxuICAgKi9cbiAgaW1wbGVtZW50YXRpb24/OiBudW1iZXI7XG5cbiAgLyoqXG4gICAqIEdSVSBjb252ZW50aW9uICh3aGV0aGVyIHRvIGFwcGx5IHJlc2V0IGdhdGUgYWZ0ZXIgb3IgYmVmb3JlIG1hdHJpeFxuICAgKiBtdWx0aXBsaWNhdGlvbikuIGZhbHNlID0gXCJiZWZvcmVcIiwgdHJ1ZSA9IFwiYWZ0ZXJcIiAob25seSBmYWxzZSBpc1xuICAgKiBzdXBwb3J0ZWQpLlxuICAgKi9cbiAgcmVzZXRBZnRlcj86IGJvb2xlYW47XG59XG5cbmV4cG9ydCBjbGFzcyBHUlVDZWxsIGV4dGVuZHMgUk5OQ2VsbCB7XG4gIC8qKiBAbm9jb2xsYXBzZSAqL1xuICBzdGF0aWMgY2xhc3NOYW1lID0gJ0dSVUNlbGwnO1xuICByZWFkb25seSB1bml0czogbnVtYmVyO1xuICByZWFkb25seSBhY3RpdmF0aW9uOiBBY3RpdmF0aW9uO1xuICByZWFkb25seSByZWN1cnJlbnRBY3RpdmF0aW9uOiBBY3RpdmF0aW9uO1xuICByZWFkb25seSB1c2VCaWFzOiBib29sZWFuO1xuXG4gIHJlYWRvbmx5IGtlcm5lbEluaXRpYWxpemVyOiBJbml0aWFsaXplcjtcbiAgcmVhZG9ubHkgcmVjdXJyZW50SW5pdGlhbGl6ZXI6IEluaXRpYWxpemVyO1xuICByZWFkb25seSBiaWFzSW5pdGlhbGl6ZXI6IEluaXRpYWxpemVyO1xuXG4gIHJlYWRvbmx5IGtlcm5lbFJlZ3VsYXJpemVyOiBSZWd1bGFyaXplcjtcbiAgcmVhZG9ubHkgcmVjdXJyZW50UmVndWxhcml6ZXI6IFJlZ3VsYXJpemVyO1xuICByZWFkb25seSBiaWFzUmVndWxhcml6ZXI6IFJlZ3VsYXJpemVyO1xuXG4gIHJlYWRvbmx5IGtlcm5lbENvbnN0cmFpbnQ6IENvbnN0cmFpbnQ7XG4gIHJlYWRvbmx5IHJlY3VycmVudENvbnN0cmFpbnQ6IENvbnN0cmFpbnQ7XG4gIHJlYWRvbmx5IGJpYXNDb25zdHJhaW50OiBDb25zdHJhaW50O1xuXG4gIHJlYWRvbmx5IGRyb3BvdXQ6IG51bWJlcjtcbiAgcmVhZG9ubHkgcmVjdXJyZW50RHJvcG91dDogbnVtYmVyO1xuICByZWFkb25seSBkcm9wb3V0RnVuYzogRnVuY3Rpb247XG5cbiAgcmVhZG9ubHkgc3RhdGVTaXplOiBudW1iZXI7XG4gIHJlYWRvbmx5IGltcGxlbWVudGF0aW9uOiBudW1iZXI7XG5cbiAgcmVhZG9ubHkgREVGQVVMVF9BQ1RJVkFUSU9OID0gJ3RhbmgnO1xuICByZWFkb25seSBERUZBVUxUX1JFQ1VSUkVOVF9BQ1RJVkFUSU9OOiBBY3RpdmF0aW9uSWRlbnRpZmllciA9ICdoYXJkU2lnbW9pZCc7XG5cbiAgcmVhZG9ubHkgREVGQVVMVF9LRVJORUxfSU5JVElBTElaRVIgPSAnZ2xvcm90Tm9ybWFsJztcbiAgcmVhZG9ubHkgREVGQVVMVF9SRUNVUlJFTlRfSU5JVElBTElaRVIgPSAnb3J0aG9nb25hbCc7XG4gIHJlYWRvbmx5IERFRkFVTFRfQklBU19JTklUSUFMSVpFUjogSW5pdGlhbGl6ZXJJZGVudGlmaWVyID0gJ3plcm9zJztcblxuICBrZXJuZWw6IExheWVyVmFyaWFibGU7XG4gIHJlY3VycmVudEtlcm5lbDogTGF5ZXJWYXJpYWJsZTtcbiAgYmlhczogTGF5ZXJWYXJpYWJsZTtcblxuICBjb25zdHJ1Y3RvcihhcmdzOiBHUlVDZWxsTGF5ZXJBcmdzKSB7XG4gICAgc3VwZXIoYXJncyk7XG4gICAgaWYgKGFyZ3MucmVzZXRBZnRlcikge1xuICAgICAgdGhyb3cgbmV3IFZhbHVlRXJyb3IoXG4gICAgICAgICAgYEdSVUNlbGwgZG9lcyBub3Qgc3VwcG9ydCByZXNldF9hZnRlciBwYXJhbWV0ZXIgc2V0IHRvIHRydWUuYCk7XG4gICAgfVxuICAgIHRoaXMudW5pdHMgPSBhcmdzLnVuaXRzO1xuICAgIGFzc2VydFBvc2l0aXZlSW50ZWdlcih0aGlzLnVuaXRzLCAndW5pdHMnKTtcbiAgICB0aGlzLmFjdGl2YXRpb24gPSBnZXRBY3RpdmF0aW9uKFxuICAgICAgICBhcmdzLmFjdGl2YXRpb24gPT09IHVuZGVmaW5lZCA/IHRoaXMuREVGQVVMVF9BQ1RJVkFUSU9OIDpcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhcmdzLmFjdGl2YXRpb24pO1xuICAgIHRoaXMucmVjdXJyZW50QWN0aXZhdGlvbiA9IGdldEFjdGl2YXRpb24oXG4gICAgICAgIGFyZ3MucmVjdXJyZW50QWN0aXZhdGlvbiA9PT0gdW5kZWZpbmVkID9cbiAgICAgICAgICAgIHRoaXMuREVGQVVMVF9SRUNVUlJFTlRfQUNUSVZBVElPTiA6XG4gICAgICAgICAgICBhcmdzLnJlY3VycmVudEFjdGl2YXRpb24pO1xuICAgIHRoaXMudXNlQmlhcyA9IGFyZ3MudXNlQmlhcyA9PSBudWxsID8gdHJ1ZSA6IGFyZ3MudXNlQmlhcztcblxuICAgIHRoaXMua2VybmVsSW5pdGlhbGl6ZXIgPSBnZXRJbml0aWFsaXplcihcbiAgICAgICAgYXJncy5rZXJuZWxJbml0aWFsaXplciB8fCB0aGlzLkRFRkFVTFRfS0VSTkVMX0lOSVRJQUxJWkVSKTtcbiAgICB0aGlzLnJlY3VycmVudEluaXRpYWxpemVyID0gZ2V0SW5pdGlhbGl6ZXIoXG4gICAgICAgIGFyZ3MucmVjdXJyZW50SW5pdGlhbGl6ZXIgfHwgdGhpcy5ERUZBVUxUX1JFQ1VSUkVOVF9JTklUSUFMSVpFUik7XG5cbiAgICB0aGlzLmJpYXNJbml0aWFsaXplciA9XG4gICAgICAgIGdldEluaXRpYWxpemVyKGFyZ3MuYmlhc0luaXRpYWxpemVyIHx8IHRoaXMuREVGQVVMVF9CSUFTX0lOSVRJQUxJWkVSKTtcblxuICAgIHRoaXMua2VybmVsUmVndWxhcml6ZXIgPSBnZXRSZWd1bGFyaXplcihhcmdzLmtlcm5lbFJlZ3VsYXJpemVyKTtcbiAgICB0aGlzLnJlY3VycmVudFJlZ3VsYXJpemVyID0gZ2V0UmVndWxhcml6ZXIoYXJncy5yZWN1cnJlbnRSZWd1bGFyaXplcik7XG4gICAgdGhpcy5iaWFzUmVndWxhcml6ZXIgPSBnZXRSZWd1bGFyaXplcihhcmdzLmJpYXNSZWd1bGFyaXplcik7XG5cbiAgICB0aGlzLmtlcm5lbENvbnN0cmFpbnQgPSBnZXRDb25zdHJhaW50KGFyZ3Mua2VybmVsQ29uc3RyYWludCk7XG4gICAgdGhpcy5yZWN1cnJlbnRDb25zdHJhaW50ID0gZ2V0Q29uc3RyYWludChhcmdzLnJlY3VycmVudENvbnN0cmFpbnQpO1xuICAgIHRoaXMuYmlhc0NvbnN0cmFpbnQgPSBnZXRDb25zdHJhaW50KGFyZ3MuYmlhc0NvbnN0cmFpbnQpO1xuXG4gICAgdGhpcy5kcm9wb3V0ID0gbWF0aF91dGlscy5taW4oXG4gICAgICAgIFsxLCBtYXRoX3V0aWxzLm1heChbMCwgYXJncy5kcm9wb3V0ID09IG51bGwgPyAwIDogYXJncy5kcm9wb3V0XSldKTtcbiAgICB0aGlzLnJlY3VycmVudERyb3BvdXQgPSBtYXRoX3V0aWxzLm1pbihbXG4gICAgICAxLFxuICAgICAgbWF0aF91dGlscy5tYXgoXG4gICAgICAgICAgWzAsIGFyZ3MucmVjdXJyZW50RHJvcG91dCA9PSBudWxsID8gMCA6IGFyZ3MucmVjdXJyZW50RHJvcG91dF0pXG4gICAgXSk7XG4gICAgdGhpcy5kcm9wb3V0RnVuYyA9IGFyZ3MuZHJvcG91dEZ1bmM7XG4gICAgdGhpcy5pbXBsZW1lbnRhdGlvbiA9IGFyZ3MuaW1wbGVtZW50YXRpb247XG4gICAgdGhpcy5zdGF0ZVNpemUgPSB0aGlzLnVuaXRzO1xuICAgIHRoaXMuZHJvcG91dE1hc2sgPSBudWxsO1xuICAgIHRoaXMucmVjdXJyZW50RHJvcG91dE1hc2sgPSBudWxsO1xuICB9XG5cbiAgcHVibGljIGJ1aWxkKGlucHV0U2hhcGU6IFNoYXBlfFNoYXBlW10pOiB2b2lkIHtcbiAgICBpbnB1dFNoYXBlID0gZ2V0RXhhY3RseU9uZVNoYXBlKGlucHV0U2hhcGUpO1xuICAgIGNvbnN0IGlucHV0RGltID0gaW5wdXRTaGFwZVtpbnB1dFNoYXBlLmxlbmd0aCAtIDFdO1xuICAgIHRoaXMua2VybmVsID0gdGhpcy5hZGRXZWlnaHQoXG4gICAgICAgICdrZXJuZWwnLCBbaW5wdXREaW0sIHRoaXMudW5pdHMgKiAzXSwgbnVsbCwgdGhpcy5rZXJuZWxJbml0aWFsaXplcixcbiAgICAgICAgdGhpcy5rZXJuZWxSZWd1bGFyaXplciwgdHJ1ZSwgdGhpcy5rZXJuZWxDb25zdHJhaW50KTtcbiAgICB0aGlzLnJlY3VycmVudEtlcm5lbCA9IHRoaXMuYWRkV2VpZ2h0KFxuICAgICAgICAncmVjdXJyZW50X2tlcm5lbCcsIFt0aGlzLnVuaXRzLCB0aGlzLnVuaXRzICogM10sIG51bGwsXG4gICAgICAgIHRoaXMucmVjdXJyZW50SW5pdGlhbGl6ZXIsIHRoaXMucmVjdXJyZW50UmVndWxhcml6ZXIsIHRydWUsXG4gICAgICAgIHRoaXMucmVjdXJyZW50Q29uc3RyYWludCk7XG4gICAgaWYgKHRoaXMudXNlQmlhcykge1xuICAgICAgdGhpcy5iaWFzID0gdGhpcy5hZGRXZWlnaHQoXG4gICAgICAgICAgJ2JpYXMnLCBbdGhpcy51bml0cyAqIDNdLCBudWxsLCB0aGlzLmJpYXNJbml0aWFsaXplcixcbiAgICAgICAgICB0aGlzLmJpYXNSZWd1bGFyaXplciwgdHJ1ZSwgdGhpcy5iaWFzQ29uc3RyYWludCk7XG4gICAgfSBlbHNlIHtcbiAgICAgIHRoaXMuYmlhcyA9IG51bGw7XG4gICAgfVxuICAgIC8vIFBvcnRpbmcgTm90ZXM6IFVubGlrZSB0aGUgUHlLZXJhcyBpbXBsZW1lbnRhdGlvbiwgd2UgcGVyZm9ybSBzbGljaW5nXG4gICAgLy8gICBvZiB0aGUgd2VpZ2h0cyBhbmQgYmlhcyBpbiB0aGUgY2FsbCgpIG1ldGhvZCwgYXQgZXhlY3V0aW9uIHRpbWUuXG4gICAgdGhpcy5idWlsdCA9IHRydWU7XG4gIH1cblxuICBjYWxsKGlucHV0czogVGVuc29yfFRlbnNvcltdLCBrd2FyZ3M6IEt3YXJncyk6IFRlbnNvcnxUZW5zb3JbXSB7XG4gICAgcmV0dXJuIHRpZHkoKCkgPT4ge1xuICAgICAgaW5wdXRzID0gaW5wdXRzIGFzIFRlbnNvcltdO1xuICAgICAgaWYgKGlucHV0cy5sZW5ndGggIT09IDIpIHtcbiAgICAgICAgdGhyb3cgbmV3IFZhbHVlRXJyb3IoXG4gICAgICAgICAgICBgR1JVQ2VsbCBleHBlY3RzIDIgaW5wdXQgVGVuc29ycyAoaW5wdXRzLCBoLCBjKSwgZ290IGAgK1xuICAgICAgICAgICAgYCR7aW5wdXRzLmxlbmd0aH0uYCk7XG4gICAgICB9XG5cbiAgICAgIGNvbnN0IHRyYWluaW5nID0ga3dhcmdzWyd0cmFpbmluZyddID09IG51bGwgPyBmYWxzZSA6IGt3YXJnc1sndHJhaW5pbmcnXTtcbiAgICAgIGxldCBoVE1pbnVzMSA9IGlucHV0c1sxXTsgIC8vIFByZXZpb3VzIG1lbW9yeSBzdGF0ZS5cbiAgICAgIGlucHV0cyA9IGlucHV0c1swXTtcblxuICAgICAgLy8gTm90ZTogRm9yIHN1cGVyaW9yIHBlcmZvcm1hbmNlLCBUZW5zb3JGbG93LmpzIGFsd2F5cyB1c2VzXG4gICAgICAvLyBpbXBsZW1lbnRhdGlvbiAyLCByZWdhcmRsZXNzIG9mIHRoZSBhY3R1YWwgdmFsdWUgb2ZcbiAgICAgIC8vIGNvbmZpZy5pbXBsZW1lbnRhdGlvbi5cbiAgICAgIGlmICgwIDwgdGhpcy5kcm9wb3V0ICYmIHRoaXMuZHJvcG91dCA8IDEgJiYgdGhpcy5kcm9wb3V0TWFzayA9PSBudWxsKSB7XG4gICAgICAgIHRoaXMuZHJvcG91dE1hc2sgPSBnZW5lcmF0ZURyb3BvdXRNYXNrKHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb25lczogKCkgPT4gdGZjLm9uZXNMaWtlKGlucHV0cyBhcyBUZW5zb3IpLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICByYXRlOiB0aGlzLmRyb3BvdXQsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRyYWluaW5nLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb3VudDogMyxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZHJvcG91dEZ1bmM6IHRoaXMuZHJvcG91dEZ1bmMsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICB9KSBhcyBUZW5zb3JbXTtcbiAgICAgIH1cbiAgICAgIGlmICgwIDwgdGhpcy5yZWN1cnJlbnREcm9wb3V0ICYmIHRoaXMucmVjdXJyZW50RHJvcG91dCA8IDEgJiZcbiAgICAgICAgICB0aGlzLnJlY3VycmVudERyb3BvdXRNYXNrID09IG51bGwpIHtcbiAgICAgICAgdGhpcy5yZWN1cnJlbnREcm9wb3V0TWFzayA9IGdlbmVyYXRlRHJvcG91dE1hc2soe1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvbmVzOiAoKSA9PiB0ZmMub25lc0xpa2UoaFRNaW51czEpLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByYXRlOiB0aGlzLnJlY3VycmVudERyb3BvdXQsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRyYWluaW5nLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb3VudDogMyxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZHJvcG91dEZ1bmM6IHRoaXMuZHJvcG91dEZ1bmMsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9KSBhcyBUZW5zb3JbXTtcbiAgICAgIH1cbiAgICAgIGNvbnN0IGRwTWFzayA9IHRoaXMuZHJvcG91dE1hc2sgYXMgW1RlbnNvciwgVGVuc29yLCBUZW5zb3JdO1xuICAgICAgY29uc3QgcmVjRHBNYXNrID0gdGhpcy5yZWN1cnJlbnREcm9wb3V0TWFzayBhcyBbVGVuc29yLCBUZW5zb3IsIFRlbnNvcl07XG4gICAgICBsZXQgejogVGVuc29yO1xuICAgICAgbGV0IHI6IFRlbnNvcjtcbiAgICAgIGxldCBoaDogVGVuc29yO1xuXG4gICAgICBpZiAoMCA8IHRoaXMuZHJvcG91dCAmJiB0aGlzLmRyb3BvdXQgPCAxKSB7XG4gICAgICAgIGlucHV0cyA9IHRmYy5tdWwoaW5wdXRzLCBkcE1hc2tbMF0pO1xuICAgICAgfVxuICAgICAgbGV0IG1hdHJpeFggPSBLLmRvdChpbnB1dHMsIHRoaXMua2VybmVsLnJlYWQoKSk7XG4gICAgICBpZiAodGhpcy51c2VCaWFzKSB7XG4gICAgICAgIG1hdHJpeFggPSBLLmJpYXNBZGQobWF0cml4WCwgdGhpcy5iaWFzLnJlYWQoKSk7XG4gICAgICB9XG4gICAgICBpZiAoMCA8IHRoaXMucmVjdXJyZW50RHJvcG91dCAmJiB0aGlzLnJlY3VycmVudERyb3BvdXQgPCAxKSB7XG4gICAgICAgIGhUTWludXMxID0gdGZjLm11bChoVE1pbnVzMSwgcmVjRHBNYXNrWzBdKTtcbiAgICAgIH1cblxuICAgICAgY29uc3QgcmVjdXJyZW50S2VybmVsVmFsdWUgPSB0aGlzLnJlY3VycmVudEtlcm5lbC5yZWFkKCk7XG4gICAgICBjb25zdCBbcmsxLCByazJdID0gdGZjLnNwbGl0KFxuICAgICAgICAgIHJlY3VycmVudEtlcm5lbFZhbHVlLCBbMiAqIHRoaXMudW5pdHMsIHRoaXMudW5pdHNdLFxuICAgICAgICAgIHJlY3VycmVudEtlcm5lbFZhbHVlLnJhbmsgLSAxKTtcbiAgICAgIGNvbnN0IG1hdHJpeElubmVyID0gSy5kb3QoaFRNaW51czEsIHJrMSk7XG5cbiAgICAgIGNvbnN0IFt4WiwgeFIsIHhIXSA9IHRmYy5zcGxpdChtYXRyaXhYLCAzLCBtYXRyaXhYLnJhbmsgLSAxKTtcbiAgICAgIGNvbnN0IFtyZWN1cnJlbnRaLCByZWN1cnJlbnRSXSA9XG4gICAgICAgICAgdGZjLnNwbGl0KG1hdHJpeElubmVyLCAyLCBtYXRyaXhJbm5lci5yYW5rIC0gMSk7XG4gICAgICB6ID0gdGhpcy5yZWN1cnJlbnRBY3RpdmF0aW9uLmFwcGx5KHRmYy5hZGQoeFosIHJlY3VycmVudFopKTtcbiAgICAgIHIgPSB0aGlzLnJlY3VycmVudEFjdGl2YXRpb24uYXBwbHkodGZjLmFkZCh4UiwgcmVjdXJyZW50UikpO1xuXG4gICAgICBjb25zdCByZWN1cnJlbnRIID0gSy5kb3QodGZjLm11bChyLCBoVE1pbnVzMSksIHJrMik7XG4gICAgICBoaCA9IHRoaXMuYWN0aXZhdGlvbi5hcHBseSh0ZmMuYWRkKHhILCByZWN1cnJlbnRIKSk7XG5cbiAgICAgIGNvbnN0IGggPVxuICAgICAgICAgIHRmYy5hZGQodGZjLm11bCh6LCBoVE1pbnVzMSksIHRmYy5tdWwodGZjLmFkZCgxLCB0ZmMubmVnKHopKSwgaGgpKTtcbiAgICAgIC8vIFRPRE8oY2Fpcyk6IEFkZCB1c2VfbGVhcm5pbmdfcGhhc2UgZmxhZyBwcm9wZXJseS5cbiAgICAgIHJldHVybiBbaCwgaF07XG4gICAgfSk7XG4gIH1cblxuICBnZXRDb25maWcoKTogc2VyaWFsaXphdGlvbi5Db25maWdEaWN0IHtcbiAgICBjb25zdCBiYXNlQ29uZmlnID0gc3VwZXIuZ2V0Q29uZmlnKCk7XG5cbiAgICBjb25zdCBjb25maWc6IHNlcmlhbGl6YXRpb24uQ29uZmlnRGljdCA9IHtcbiAgICAgIHVuaXRzOiB0aGlzLnVuaXRzLFxuICAgICAgYWN0aXZhdGlvbjogc2VyaWFsaXplQWN0aXZhdGlvbih0aGlzLmFjdGl2YXRpb24pLFxuICAgICAgcmVjdXJyZW50QWN0aXZhdGlvbjogc2VyaWFsaXplQWN0aXZhdGlvbih0aGlzLnJlY3VycmVudEFjdGl2YXRpb24pLFxuICAgICAgdXNlQmlhczogdGhpcy51c2VCaWFzLFxuICAgICAga2VybmVsSW5pdGlhbGl6ZXI6IHNlcmlhbGl6ZUluaXRpYWxpemVyKHRoaXMua2VybmVsSW5pdGlhbGl6ZXIpLFxuICAgICAgcmVjdXJyZW50SW5pdGlhbGl6ZXI6IHNlcmlhbGl6ZUluaXRpYWxpemVyKHRoaXMucmVjdXJyZW50SW5pdGlhbGl6ZXIpLFxuICAgICAgYmlhc0luaXRpYWxpemVyOiBzZXJpYWxpemVJbml0aWFsaXplcih0aGlzLmJpYXNJbml0aWFsaXplciksXG4gICAgICBrZXJuZWxSZWd1bGFyaXplcjogc2VyaWFsaXplUmVndWxhcml6ZXIodGhpcy5rZXJuZWxSZWd1bGFyaXplciksXG4gICAgICByZWN1cnJlbnRSZWd1bGFyaXplcjogc2VyaWFsaXplUmVndWxhcml6ZXIodGhpcy5yZWN1cnJlbnRSZWd1bGFyaXplciksXG4gICAgICBiaWFzUmVndWxhcml6ZXI6IHNlcmlhbGl6ZVJlZ3VsYXJpemVyKHRoaXMuYmlhc1JlZ3VsYXJpemVyKSxcbiAgICAgIGFjdGl2aXR5UmVndWxhcml6ZXI6IHNlcmlhbGl6ZVJlZ3VsYXJpemVyKHRoaXMuYWN0aXZpdHlSZWd1bGFyaXplciksXG4gICAgICBrZXJuZWxDb25zdHJhaW50OiBzZXJpYWxpemVDb25zdHJhaW50KHRoaXMua2VybmVsQ29uc3RyYWludCksXG4gICAgICByZWN1cnJlbnRDb25zdHJhaW50OiBzZXJpYWxpemVDb25zdHJhaW50KHRoaXMucmVjdXJyZW50Q29uc3RyYWludCksXG4gICAgICBiaWFzQ29uc3RyYWludDogc2VyaWFsaXplQ29uc3RyYWludCh0aGlzLmJpYXNDb25zdHJhaW50KSxcbiAgICAgIGRyb3BvdXQ6IHRoaXMuZHJvcG91dCxcbiAgICAgIHJlY3VycmVudERyb3BvdXQ6IHRoaXMucmVjdXJyZW50RHJvcG91dCxcbiAgICAgIGltcGxlbWVudGF0aW9uOiB0aGlzLmltcGxlbWVudGF0aW9uLFxuICAgICAgcmVzZXRBZnRlcjogZmFsc2VcbiAgICB9O1xuXG4gICAgcmV0dXJuIHsuLi5iYXNlQ29uZmlnLCAuLi5jb25maWd9O1xuICB9XG59XG5zZXJpYWxpemF0aW9uLnJlZ2lzdGVyQ2xhc3MoR1JVQ2VsbCk7XG5cbi8vIFBvcnRpbmcgTm90ZTogU2luY2UgdGhpcyBpcyBhIHN1cGVyc2V0IG9mIFNpbXBsZVJOTkxheWVyQ29uZmlnLCB3ZSBpbmhlcml0XG4vLyAgIGZyb20gdGhhdCBpbnRlcmZhY2UgaW5zdGVhZCBvZiByZXBlYXRpbmcgdGhlIGZpZWxkcyBoZXJlLlxuZXhwb3J0IGRlY2xhcmUgaW50ZXJmYWNlIEdSVUxheWVyQXJncyBleHRlbmRzIFNpbXBsZVJOTkxheWVyQXJncyB7XG4gIC8qKlxuICAgKiBBY3RpdmF0aW9uIGZ1bmN0aW9uIHRvIHVzZSBmb3IgdGhlIHJlY3VycmVudCBzdGVwLlxuICAgKlxuICAgKiBEZWZhdWx0cyB0byBoYXJkIHNpZ21vaWQgKGBoYXJkU2lnbW9pZGApLlxuICAgKlxuICAgKiBJZiBgbnVsbGAsIG5vIGFjdGl2YXRpb24gaXMgYXBwbGllZC5cbiAgICovXG4gIHJlY3VycmVudEFjdGl2YXRpb24/OiBBY3RpdmF0aW9uSWRlbnRpZmllcjtcblxuICAvKipcbiAgICogSW1wbGVtZW50YXRpb24gbW9kZSwgZWl0aGVyIDEgb3IgMi5cbiAgICpcbiAgICogTW9kZSAxIHdpbGwgc3RydWN0dXJlIGl0cyBvcGVyYXRpb25zIGFzIGEgbGFyZ2VyIG51bWJlciBvZlxuICAgKiBzbWFsbGVyIGRvdCBwcm9kdWN0cyBhbmQgYWRkaXRpb25zLlxuICAgKlxuICAgKiBNb2RlIDIgd2lsbCBiYXRjaCB0aGVtIGludG8gZmV3ZXIsIGxhcmdlciBvcGVyYXRpb25zLiBUaGVzZSBtb2RlcyB3aWxsXG4gICAqIGhhdmUgZGlmZmVyZW50IHBlcmZvcm1hbmNlIHByb2ZpbGVzIG9uIGRpZmZlcmVudCBoYXJkd2FyZSBhbmRcbiAgICogZm9yIGRpZmZlcmVudCBhcHBsaWNhdGlvbnMuXG4gICAqXG4gICAqIE5vdGU6IEZvciBzdXBlcmlvciBwZXJmb3JtYW5jZSwgVGVuc29yRmxvdy5qcyBhbHdheXMgdXNlcyBpbXBsZW1lbnRhdGlvblxuICAgKiAyLCByZWdhcmRsZXNzIG9mIHRoZSBhY3R1YWwgdmFsdWUgb2YgdGhpcyBjb25maWd1cmF0aW9uIGZpZWxkLlxuICAgKi9cbiAgaW1wbGVtZW50YXRpb24/OiBudW1iZXI7XG59XG5cbmV4cG9ydCBjbGFzcyBHUlUgZXh0ZW5kcyBSTk4ge1xuICAvKiogQG5vY29sbGFwc2UgKi9cbiAgc3RhdGljIGNsYXNzTmFtZSA9ICdHUlUnO1xuICBjb25zdHJ1Y3RvcihhcmdzOiBHUlVMYXllckFyZ3MpIHtcbiAgICBpZiAoYXJncy5pbXBsZW1lbnRhdGlvbiA9PT0gMCkge1xuICAgICAgY29uc29sZS53YXJuKFxuICAgICAgICAgICdgaW1wbGVtZW50YXRpb249MGAgaGFzIGJlZW4gZGVwcmVjYXRlZCwgYW5kIG5vdyBkZWZhdWx0cyB0byAnICtcbiAgICAgICAgICAnYGltcGxlbWVudGF0aW9uPTFgLiBQbGVhc2UgdXBkYXRlIHlvdXIgbGF5ZXIgY2FsbC4nKTtcbiAgICB9XG4gICAgYXJncy5jZWxsID0gbmV3IEdSVUNlbGwoYXJncyk7XG4gICAgc3VwZXIoYXJncyBhcyBSTk5MYXllckFyZ3MpO1xuICAgIC8vIFRPRE8oY2Fpcyk6IEFkZCBhY3Rpdml0eVJlZ3VsYXJpemVyLlxuICB9XG5cbiAgY2FsbChpbnB1dHM6IFRlbnNvcnxUZW5zb3JbXSwga3dhcmdzOiBLd2FyZ3MpOiBUZW5zb3J8VGVuc29yW10ge1xuICAgIHJldHVybiB0aWR5KCgpID0+IHtcbiAgICAgIGlmICh0aGlzLmNlbGwuZHJvcG91dE1hc2sgIT0gbnVsbCkge1xuICAgICAgICB0ZmMuZGlzcG9zZSh0aGlzLmNlbGwuZHJvcG91dE1hc2spO1xuICAgICAgICB0aGlzLmNlbGwuZHJvcG91dE1hc2sgPSBudWxsO1xuICAgICAgfVxuICAgICAgaWYgKHRoaXMuY2VsbC5yZWN1cnJlbnREcm9wb3V0TWFzayAhPSBudWxsKSB7XG4gICAgICAgIHRmYy5kaXNwb3NlKHRoaXMuY2VsbC5yZWN1cnJlbnREcm9wb3V0TWFzayk7XG4gICAgICAgIHRoaXMuY2VsbC5yZWN1cnJlbnREcm9wb3V0TWFzayA9IG51bGw7XG4gICAgICB9XG4gICAgICBjb25zdCBtYXNrID0ga3dhcmdzID09IG51bGwgPyBudWxsIDoga3dhcmdzWydtYXNrJ107XG4gICAgICBjb25zdCB0cmFpbmluZyA9IGt3YXJncyA9PSBudWxsID8gbnVsbCA6IGt3YXJnc1sndHJhaW5pbmcnXTtcbiAgICAgIGNvbnN0IGluaXRpYWxTdGF0ZTogVGVuc29yW10gPVxuICAgICAgICAgIGt3YXJncyA9PSBudWxsID8gbnVsbCA6IGt3YXJnc1snaW5pdGlhbFN0YXRlJ107XG4gICAgICByZXR1cm4gc3VwZXIuY2FsbChpbnB1dHMsIHttYXNrLCB0cmFpbmluZywgaW5pdGlhbFN0YXRlfSk7XG4gICAgfSk7XG4gIH1cblxuICAvKiogQG5vY29sbGFwc2UgKi9cbiAgc3RhdGljIGZyb21Db25maWc8VCBleHRlbmRzIHNlcmlhbGl6YXRpb24uU2VyaWFsaXphYmxlPihcbiAgICAgIGNsczogc2VyaWFsaXphdGlvbi5TZXJpYWxpemFibGVDb25zdHJ1Y3RvcjxUPixcbiAgICAgIGNvbmZpZzogc2VyaWFsaXphdGlvbi5Db25maWdEaWN0KTogVCB7XG4gICAgaWYgKGNvbmZpZ1snaW1wbG1lbnRhdGlvbiddID09PSAwKSB7XG4gICAgICBjb25maWdbJ2ltcGxlbWVudGF0aW9uJ10gPSAxO1xuICAgIH1cbiAgICByZXR1cm4gbmV3IGNscyhjb25maWcpO1xuICB9XG59XG5zZXJpYWxpemF0aW9uLnJlZ2lzdGVyQ2xhc3MoR1JVKTtcblxuLy8gUG9ydGluZyBOb3RlOiBTaW5jZSB0aGlzIGlzIGEgc3VwZXJzZXQgb2YgU2ltcGxlUk5OTGF5ZXJDb25maWcsIHdlIGV4dGVuZFxuLy8gICB0aGF0IGludGVyZmFjZSBpbnN0ZWFkIG9mIHJlcGVhdGluZyB0aGUgZmllbGRzLlxuZXhwb3J0IGRlY2xhcmUgaW50ZXJmYWNlIExTVE1DZWxsTGF5ZXJBcmdzIGV4dGVuZHMgU2ltcGxlUk5OQ2VsbExheWVyQXJncyB7XG4gIC8qKlxuICAgKiBBY3RpdmF0aW9uIGZ1bmN0aW9uIHRvIHVzZSBmb3IgdGhlIHJlY3VycmVudCBzdGVwLlxuICAgKlxuICAgKiBEZWZhdWx0cyB0byBoYXJkIHNpZ21vaWQgKGBoYXJkU2lnbW9pZGApLlxuICAgKlxuICAgKiBJZiBgbnVsbGAsIG5vIGFjdGl2YXRpb24gaXMgYXBwbGllZC5cbiAgICovXG4gIHJlY3VycmVudEFjdGl2YXRpb24/OiBBY3RpdmF0aW9uSWRlbnRpZmllcjtcblxuICAvKipcbiAgICogSWYgYHRydWVgLCBhZGQgMSB0byB0aGUgYmlhcyBvZiB0aGUgZm9yZ2V0IGdhdGUgYXQgaW5pdGlhbGl6YXRpb24uXG4gICAqIFNldHRpbmcgaXQgdG8gYHRydWVgIHdpbGwgYWxzbyBmb3JjZSBgYmlhc0luaXRpYWxpemVyID0gJ3plcm9zJ2AuXG4gICAqIFRoaXMgaXMgcmVjb21tZW5kZWQgaW5cbiAgICogW0pvemVmb3dpY3ogZXRcbiAgICogYWwuXShodHRwOi8vd3d3LmptbHIub3JnL3Byb2NlZWRpbmdzL3BhcGVycy92Mzcvam96ZWZvd2ljejE1LnBkZilcbiAgICovXG4gIHVuaXRGb3JnZXRCaWFzPzogYm9vbGVhbjtcblxuICAvKipcbiAgICogSW1wbGVtZW50YXRpb24gbW9kZSwgZWl0aGVyIDEgb3IgMi5cbiAgICpcbiAgICogTW9kZSAxIHdpbGwgc3RydWN0dXJlIGl0cyBvcGVyYXRpb25zIGFzIGEgbGFyZ2VyIG51bWJlciBvZlxuICAgKiAgIHNtYWxsZXIgZG90IHByb2R1Y3RzIGFuZCBhZGRpdGlvbnMuXG4gICAqXG4gICAqIE1vZGUgMiB3aWxsIGJhdGNoIHRoZW0gaW50byBmZXdlciwgbGFyZ2VyIG9wZXJhdGlvbnMuIFRoZXNlIG1vZGVzIHdpbGxcbiAgICogaGF2ZSBkaWZmZXJlbnQgcGVyZm9ybWFuY2UgcHJvZmlsZXMgb24gZGlmZmVyZW50IGhhcmR3YXJlIGFuZFxuICAgKiBmb3IgZGlmZmVyZW50IGFwcGxpY2F0aW9ucy5cbiAgICpcbiAgICogTm90ZTogRm9yIHN1cGVyaW9yIHBlcmZvcm1hbmNlLCBUZW5zb3JGbG93LmpzIGFsd2F5cyB1c2VzIGltcGxlbWVudGF0aW9uXG4gICAqIDIsIHJlZ2FyZGxlc3Mgb2YgdGhlIGFjdHVhbCB2YWx1ZSBvZiB0aGlzIGNvbmZpZ3VyYXRpb24gZmllbGQuXG4gICAqL1xuICBpbXBsZW1lbnRhdGlvbj86IG51bWJlcjtcbn1cblxuZXhwb3J0IGNsYXNzIExTVE1DZWxsIGV4dGVuZHMgUk5OQ2VsbCB7XG4gIC8qKiBAbm9jb2xsYXBzZSAqL1xuICBzdGF0aWMgY2xhc3NOYW1lID0gJ0xTVE1DZWxsJztcbiAgcmVhZG9ubHkgdW5pdHM6IG51bWJlcjtcbiAgcmVhZG9ubHkgYWN0aXZhdGlvbjogQWN0aXZhdGlvbjtcbiAgcmVhZG9ubHkgcmVjdXJyZW50QWN0aXZhdGlvbjogQWN0aXZhdGlvbjtcbiAgcmVhZG9ubHkgdXNlQmlhczogYm9vbGVhbjtcblxuICByZWFkb25seSBrZXJuZWxJbml0aWFsaXplcjogSW5pdGlhbGl6ZXI7XG4gIHJlYWRvbmx5IHJlY3VycmVudEluaXRpYWxpemVyOiBJbml0aWFsaXplcjtcbiAgcmVhZG9ubHkgYmlhc0luaXRpYWxpemVyOiBJbml0aWFsaXplcjtcbiAgcmVhZG9ubHkgdW5pdEZvcmdldEJpYXM6IGJvb2xlYW47XG5cbiAgcmVhZG9ubHkga2VybmVsQ29uc3RyYWludDogQ29uc3RyYWludDtcbiAgcmVhZG9ubHkgcmVjdXJyZW50Q29uc3RyYWludDogQ29uc3RyYWludDtcbiAgcmVhZG9ubHkgYmlhc0NvbnN0cmFpbnQ6IENvbnN0cmFpbnQ7XG5cbiAgcmVhZG9ubHkga2VybmVsUmVndWxhcml6ZXI6IFJlZ3VsYXJpemVyO1xuICByZWFkb25seSByZWN1cnJlbnRSZWd1bGFyaXplcjogUmVndWxhcml6ZXI7XG4gIHJlYWRvbmx5IGJpYXNSZWd1bGFyaXplcjogUmVndWxhcml6ZXI7XG5cbiAgcmVhZG9ubHkgZHJvcG91dDogbnVtYmVyO1xuICByZWFkb25seSByZWN1cnJlbnREcm9wb3V0OiBudW1iZXI7XG4gIHJlYWRvbmx5IGRyb3BvdXRGdW5jOiBGdW5jdGlvbjtcblxuICByZWFkb25seSBzdGF0ZVNpemU6IG51bWJlcltdO1xuICByZWFkb25seSBpbXBsZW1lbnRhdGlvbjogbnVtYmVyO1xuXG4gIHJlYWRvbmx5IERFRkFVTFRfQUNUSVZBVElPTiA9ICd0YW5oJztcbiAgcmVhZG9ubHkgREVGQVVMVF9SRUNVUlJFTlRfQUNUSVZBVElPTiA9ICdoYXJkU2lnbW9pZCc7XG4gIHJlYWRvbmx5IERFRkFVTFRfS0VSTkVMX0lOSVRJQUxJWkVSID0gJ2dsb3JvdE5vcm1hbCc7XG4gIHJlYWRvbmx5IERFRkFVTFRfUkVDVVJSRU5UX0lOSVRJQUxJWkVSID0gJ29ydGhvZ29uYWwnO1xuXG4gIHJlYWRvbmx5IERFRkFVTFRfQklBU19JTklUSUFMSVpFUiA9ICd6ZXJvcyc7XG5cbiAga2VybmVsOiBMYXllclZhcmlhYmxlO1xuICByZWN1cnJlbnRLZXJuZWw6IExheWVyVmFyaWFibGU7XG4gIGJpYXM6IExheWVyVmFyaWFibGU7XG5cbiAgY29uc3RydWN0b3IoYXJnczogTFNUTUNlbGxMYXllckFyZ3MpIHtcbiAgICBzdXBlcihhcmdzKTtcblxuICAgIHRoaXMudW5pdHMgPSBhcmdzLnVuaXRzO1xuICAgIGFzc2VydFBvc2l0aXZlSW50ZWdlcih0aGlzLnVuaXRzLCAndW5pdHMnKTtcbiAgICB0aGlzLmFjdGl2YXRpb24gPSBnZXRBY3RpdmF0aW9uKFxuICAgICAgICBhcmdzLmFjdGl2YXRpb24gPT09IHVuZGVmaW5lZCA/IHRoaXMuREVGQVVMVF9BQ1RJVkFUSU9OIDpcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhcmdzLmFjdGl2YXRpb24pO1xuICAgIHRoaXMucmVjdXJyZW50QWN0aXZhdGlvbiA9IGdldEFjdGl2YXRpb24oXG4gICAgICAgIGFyZ3MucmVjdXJyZW50QWN0aXZhdGlvbiA9PT0gdW5kZWZpbmVkID9cbiAgICAgICAgICAgIHRoaXMuREVGQVVMVF9SRUNVUlJFTlRfQUNUSVZBVElPTiA6XG4gICAgICAgICAgICBhcmdzLnJlY3VycmVudEFjdGl2YXRpb24pO1xuICAgIHRoaXMudXNlQmlhcyA9IGFyZ3MudXNlQmlhcyA9PSBudWxsID8gdHJ1ZSA6IGFyZ3MudXNlQmlhcztcblxuICAgIHRoaXMua2VybmVsSW5pdGlhbGl6ZXIgPSBnZXRJbml0aWFsaXplcihcbiAgICAgICAgYXJncy5rZXJuZWxJbml0aWFsaXplciB8fCB0aGlzLkRFRkFVTFRfS0VSTkVMX0lOSVRJQUxJWkVSKTtcbiAgICB0aGlzLnJlY3VycmVudEluaXRpYWxpemVyID0gZ2V0SW5pdGlhbGl6ZXIoXG4gICAgICAgIGFyZ3MucmVjdXJyZW50SW5pdGlhbGl6ZXIgfHwgdGhpcy5ERUZBVUxUX1JFQ1VSUkVOVF9JTklUSUFMSVpFUik7XG5cbiAgICB0aGlzLmJpYXNJbml0aWFsaXplciA9XG4gICAgICAgIGdldEluaXRpYWxpemVyKGFyZ3MuYmlhc0luaXRpYWxpemVyIHx8IHRoaXMuREVGQVVMVF9CSUFTX0lOSVRJQUxJWkVSKTtcbiAgICB0aGlzLnVuaXRGb3JnZXRCaWFzID0gYXJncy51bml0Rm9yZ2V0QmlhcztcblxuICAgIHRoaXMua2VybmVsUmVndWxhcml6ZXIgPSBnZXRSZWd1bGFyaXplcihhcmdzLmtlcm5lbFJlZ3VsYXJpemVyKTtcbiAgICB0aGlzLnJlY3VycmVudFJlZ3VsYXJpemVyID0gZ2V0UmVndWxhcml6ZXIoYXJncy5yZWN1cnJlbnRSZWd1bGFyaXplcik7XG4gICAgdGhpcy5iaWFzUmVndWxhcml6ZXIgPSBnZXRSZWd1bGFyaXplcihhcmdzLmJpYXNSZWd1bGFyaXplcik7XG5cbiAgICB0aGlzLmtlcm5lbENvbnN0cmFpbnQgPSBnZXRDb25zdHJhaW50KGFyZ3Mua2VybmVsQ29uc3RyYWludCk7XG4gICAgdGhpcy5yZWN1cnJlbnRDb25zdHJhaW50ID0gZ2V0Q29uc3RyYWludChhcmdzLnJlY3VycmVudENvbnN0cmFpbnQpO1xuICAgIHRoaXMuYmlhc0NvbnN0cmFpbnQgPSBnZXRDb25zdHJhaW50KGFyZ3MuYmlhc0NvbnN0cmFpbnQpO1xuXG4gICAgdGhpcy5kcm9wb3V0ID0gbWF0aF91dGlscy5taW4oXG4gICAgICAgIFsxLCBtYXRoX3V0aWxzLm1heChbMCwgYXJncy5kcm9wb3V0ID09IG51bGwgPyAwIDogYXJncy5kcm9wb3V0XSldKTtcbiAgICB0aGlzLnJlY3VycmVudERyb3BvdXQgPSBtYXRoX3V0aWxzLm1pbihbXG4gICAgICAxLFxuICAgICAgbWF0aF91dGlscy5tYXgoXG4gICAgICAgICAgWzAsIGFyZ3MucmVjdXJyZW50RHJvcG91dCA9PSBudWxsID8gMCA6IGFyZ3MucmVjdXJyZW50RHJvcG91dF0pXG4gICAgXSk7XG4gICAgdGhpcy5kcm9wb3V0RnVuYyA9IGFyZ3MuZHJvcG91dEZ1bmM7XG4gICAgdGhpcy5pbXBsZW1lbnRhdGlvbiA9IGFyZ3MuaW1wbGVtZW50YXRpb247XG4gICAgdGhpcy5zdGF0ZVNpemUgPSBbdGhpcy51bml0cywgdGhpcy51bml0c107XG4gICAgdGhpcy5kcm9wb3V0TWFzayA9IG51bGw7XG4gICAgdGhpcy5yZWN1cnJlbnREcm9wb3V0TWFzayA9IG51bGw7XG4gIH1cblxuICBwdWJsaWMgYnVpbGQoaW5wdXRTaGFwZTogU2hhcGV8U2hhcGVbXSk6IHZvaWQge1xuICAgIGlucHV0U2hhcGUgPSBnZXRFeGFjdGx5T25lU2hhcGUoaW5wdXRTaGFwZSk7XG4gICAgY29uc3QgaW5wdXREaW0gPSBpbnB1dFNoYXBlW2lucHV0U2hhcGUubGVuZ3RoIC0gMV07XG4gICAgdGhpcy5rZXJuZWwgPSB0aGlzLmFkZFdlaWdodChcbiAgICAgICAgJ2tlcm5lbCcsIFtpbnB1dERpbSwgdGhpcy51bml0cyAqIDRdLCBudWxsLCB0aGlzLmtlcm5lbEluaXRpYWxpemVyLFxuICAgICAgICB0aGlzLmtlcm5lbFJlZ3VsYXJpemVyLCB0cnVlLCB0aGlzLmtlcm5lbENvbnN0cmFpbnQpO1xuICAgIHRoaXMucmVjdXJyZW50S2VybmVsID0gdGhpcy5hZGRXZWlnaHQoXG4gICAgICAgICdyZWN1cnJlbnRfa2VybmVsJywgW3RoaXMudW5pdHMsIHRoaXMudW5pdHMgKiA0XSwgbnVsbCxcbiAgICAgICAgdGhpcy5yZWN1cnJlbnRJbml0aWFsaXplciwgdGhpcy5yZWN1cnJlbnRSZWd1bGFyaXplciwgdHJ1ZSxcbiAgICAgICAgdGhpcy5yZWN1cnJlbnRDb25zdHJhaW50KTtcbiAgICBsZXQgYmlhc0luaXRpYWxpemVyOiBJbml0aWFsaXplcjtcbiAgICBpZiAodGhpcy51c2VCaWFzKSB7XG4gICAgICBpZiAodGhpcy51bml0Rm9yZ2V0Qmlhcykge1xuICAgICAgICBjb25zdCBjYXB0dXJlZEJpYXNJbml0ID0gdGhpcy5iaWFzSW5pdGlhbGl6ZXI7XG4gICAgICAgIGNvbnN0IGNhcHR1cmVkVW5pdHMgPSB0aGlzLnVuaXRzO1xuICAgICAgICBiaWFzSW5pdGlhbGl6ZXIgPSBuZXcgKGNsYXNzIEN1c3RvbUluaXQgZXh0ZW5kcyBJbml0aWFsaXplciB7XG4gICAgICAgICAgLyoqIEBub2NvbGxhcHNlICovXG4gICAgICAgICAgc3RhdGljIGNsYXNzTmFtZSA9ICdDdXN0b21Jbml0JztcblxuICAgICAgICAgIGFwcGx5KHNoYXBlOiBTaGFwZSwgZHR5cGU/OiBEYXRhVHlwZSk6IFRlbnNvciB7XG4gICAgICAgICAgICAvLyBUT0RPKGNhaXMpOiBNb3JlIGluZm9ybWF0aXZlIHZhcmlhYmxlIG5hbWVzP1xuICAgICAgICAgICAgY29uc3QgYkkgPSBjYXB0dXJlZEJpYXNJbml0LmFwcGx5KFtjYXB0dXJlZFVuaXRzXSk7XG4gICAgICAgICAgICBjb25zdCBiRiA9IChuZXcgT25lcygpKS5hcHBseShbY2FwdHVyZWRVbml0c10pO1xuICAgICAgICAgICAgY29uc3QgYkNBbmRIID0gY2FwdHVyZWRCaWFzSW5pdC5hcHBseShbY2FwdHVyZWRVbml0cyAqIDJdKTtcbiAgICAgICAgICAgIHJldHVybiBLLmNvbmNhdEFsb25nRmlyc3RBeGlzKFxuICAgICAgICAgICAgICAgIEsuY29uY2F0QWxvbmdGaXJzdEF4aXMoYkksIGJGKSwgYkNBbmRIKTtcbiAgICAgICAgICB9XG4gICAgICAgIH0pKCk7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBiaWFzSW5pdGlhbGl6ZXIgPSB0aGlzLmJpYXNJbml0aWFsaXplcjtcbiAgICAgIH1cbiAgICAgIHRoaXMuYmlhcyA9IHRoaXMuYWRkV2VpZ2h0KFxuICAgICAgICAgICdiaWFzJywgW3RoaXMudW5pdHMgKiA0XSwgbnVsbCwgYmlhc0luaXRpYWxpemVyLCB0aGlzLmJpYXNSZWd1bGFyaXplcixcbiAgICAgICAgICB0cnVlLCB0aGlzLmJpYXNDb25zdHJhaW50KTtcbiAgICB9IGVsc2Uge1xuICAgICAgdGhpcy5iaWFzID0gbnVsbDtcbiAgICB9XG4gICAgLy8gUG9ydGluZyBOb3RlczogVW5saWtlIHRoZSBQeUtlcmFzIGltcGxlbWVudGF0aW9uLCB3ZSBwZXJmb3JtIHNsaWNpbmdcbiAgICAvLyAgIG9mIHRoZSB3ZWlnaHRzIGFuZCBiaWFzIGluIHRoZSBjYWxsKCkgbWV0aG9kLCBhdCBleGVjdXRpb24gdGltZS5cbiAgICB0aGlzLmJ1aWx0ID0gdHJ1ZTtcbiAgfVxuXG4gIGNhbGwoaW5wdXRzOiBUZW5zb3J8VGVuc29yW10sIGt3YXJnczogS3dhcmdzKTogVGVuc29yfFRlbnNvcltdIHtcbiAgICByZXR1cm4gdGlkeSgoKSA9PiB7XG4gICAgICBjb25zdCB0cmFpbmluZyA9IGt3YXJnc1sndHJhaW5pbmcnXSA9PSBudWxsID8gZmFsc2UgOiBrd2FyZ3NbJ3RyYWluaW5nJ107XG4gICAgICBpbnB1dHMgPSBpbnB1dHMgYXMgVGVuc29yW107XG4gICAgICBpZiAoaW5wdXRzLmxlbmd0aCAhPT0gMykge1xuICAgICAgICB0aHJvdyBuZXcgVmFsdWVFcnJvcihcbiAgICAgICAgICAgIGBMU1RNQ2VsbCBleHBlY3RzIDMgaW5wdXQgVGVuc29ycyAoaW5wdXRzLCBoLCBjKSwgZ290IGAgK1xuICAgICAgICAgICAgYCR7aW5wdXRzLmxlbmd0aH0uYCk7XG4gICAgICB9XG4gICAgICBsZXQgaFRNaW51czEgPSBpbnB1dHNbMV07ICAgIC8vIFByZXZpb3VzIG1lbW9yeSBzdGF0ZS5cbiAgICAgIGNvbnN0IGNUTWludXMxID0gaW5wdXRzWzJdOyAgLy8gUHJldmlvdXMgY2Fycnkgc3RhdGUuXG4gICAgICBpbnB1dHMgPSBpbnB1dHNbMF07XG4gICAgICBpZiAoMCA8IHRoaXMuZHJvcG91dCAmJiB0aGlzLmRyb3BvdXQgPCAxICYmIHRoaXMuZHJvcG91dE1hc2sgPT0gbnVsbCkge1xuICAgICAgICB0aGlzLmRyb3BvdXRNYXNrID0gZ2VuZXJhdGVEcm9wb3V0TWFzayh7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9uZXM6ICgpID0+IHRmYy5vbmVzTGlrZShpbnB1dHMgYXMgVGVuc29yKSxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmF0ZTogdGhpcy5kcm9wb3V0LFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0cmFpbmluZyxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY291bnQ6IDQsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRyb3BvdXRGdW5jOiB0aGlzLmRyb3BvdXRGdW5jXG4gICAgICAgICAgICAgICAgICAgICAgICAgICB9KSBhcyBUZW5zb3JbXTtcbiAgICAgIH1cbiAgICAgIGlmICgwIDwgdGhpcy5yZWN1cnJlbnREcm9wb3V0ICYmIHRoaXMucmVjdXJyZW50RHJvcG91dCA8IDEgJiZcbiAgICAgICAgICB0aGlzLnJlY3VycmVudERyb3BvdXRNYXNrID09IG51bGwpIHtcbiAgICAgICAgdGhpcy5yZWN1cnJlbnREcm9wb3V0TWFzayA9IGdlbmVyYXRlRHJvcG91dE1hc2soe1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvbmVzOiAoKSA9PiB0ZmMub25lc0xpa2UoaFRNaW51czEpLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByYXRlOiB0aGlzLnJlY3VycmVudERyb3BvdXQsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRyYWluaW5nLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb3VudDogNCxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZHJvcG91dEZ1bmM6IHRoaXMuZHJvcG91dEZ1bmNcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0pIGFzIFRlbnNvcltdO1xuICAgICAgfVxuICAgICAgY29uc3QgZHBNYXNrID0gdGhpcy5kcm9wb3V0TWFzayBhcyBbVGVuc29yLCBUZW5zb3IsIFRlbnNvciwgVGVuc29yXTtcbiAgICAgIGNvbnN0IHJlY0RwTWFzayA9XG4gICAgICAgICAgdGhpcy5yZWN1cnJlbnREcm9wb3V0TWFzayBhcyBbVGVuc29yLCBUZW5zb3IsIFRlbnNvciwgVGVuc29yXTtcblxuICAgICAgLy8gTm90ZTogRm9yIHN1cGVyaW9yIHBlcmZvcm1hbmNlLCBUZW5zb3JGbG93LmpzIGFsd2F5cyB1c2VzXG4gICAgICAvLyBpbXBsZW1lbnRhdGlvbiAyIHJlZ2FyZGxlc3Mgb2YgdGhlIGFjdHVhbCB2YWx1ZSBvZlxuICAgICAgLy8gY29uZmlnLmltcGxlbWVudGF0aW9uLlxuICAgICAgbGV0IGk6IFRlbnNvcjtcbiAgICAgIGxldCBmOiBUZW5zb3I7XG4gICAgICBsZXQgYzogVGVuc29yO1xuICAgICAgbGV0IG86IFRlbnNvcjtcbiAgICAgIGlmICgwIDwgdGhpcy5kcm9wb3V0ICYmIHRoaXMuZHJvcG91dCA8IDEpIHtcbiAgICAgICAgaW5wdXRzID0gdGZjLm11bChpbnB1dHMsIGRwTWFza1swXSk7XG4gICAgICB9XG4gICAgICBsZXQgeiA9IEsuZG90KGlucHV0cywgdGhpcy5rZXJuZWwucmVhZCgpKTtcbiAgICAgIGlmICgwIDwgdGhpcy5yZWN1cnJlbnREcm9wb3V0ICYmIHRoaXMucmVjdXJyZW50RHJvcG91dCA8IDEpIHtcbiAgICAgICAgaFRNaW51czEgPSB0ZmMubXVsKGhUTWludXMxLCByZWNEcE1hc2tbMF0pO1xuICAgICAgfVxuICAgICAgeiA9IHRmYy5hZGQoeiwgSy5kb3QoaFRNaW51czEsIHRoaXMucmVjdXJyZW50S2VybmVsLnJlYWQoKSkpO1xuICAgICAgaWYgKHRoaXMudXNlQmlhcykge1xuICAgICAgICB6ID0gSy5iaWFzQWRkKHosIHRoaXMuYmlhcy5yZWFkKCkpO1xuICAgICAgfVxuXG4gICAgICBjb25zdCBbejAsIHoxLCB6MiwgejNdID0gdGZjLnNwbGl0KHosIDQsIHoucmFuayAtIDEpO1xuXG4gICAgICBpID0gdGhpcy5yZWN1cnJlbnRBY3RpdmF0aW9uLmFwcGx5KHowKTtcbiAgICAgIGYgPSB0aGlzLnJlY3VycmVudEFjdGl2YXRpb24uYXBwbHkoejEpO1xuICAgICAgYyA9IHRmYy5hZGQodGZjLm11bChmLCBjVE1pbnVzMSksIHRmYy5tdWwoaSwgdGhpcy5hY3RpdmF0aW9uLmFwcGx5KHoyKSkpO1xuICAgICAgbyA9IHRoaXMucmVjdXJyZW50QWN0aXZhdGlvbi5hcHBseSh6Myk7XG5cbiAgICAgIGNvbnN0IGggPSB0ZmMubXVsKG8sIHRoaXMuYWN0aXZhdGlvbi5hcHBseShjKSk7XG4gICAgICAvLyBUT0RPKGNhaXMpOiBBZGQgdXNlX2xlYXJuaW5nX3BoYXNlIGZsYWcgcHJvcGVybHkuXG4gICAgICByZXR1cm4gW2gsIGgsIGNdO1xuICAgIH0pO1xuICB9XG5cbiAgZ2V0Q29uZmlnKCk6IHNlcmlhbGl6YXRpb24uQ29uZmlnRGljdCB7XG4gICAgY29uc3QgYmFzZUNvbmZpZyA9IHN1cGVyLmdldENvbmZpZygpO1xuXG4gICAgY29uc3QgY29uZmlnOiBzZXJpYWxpemF0aW9uLkNvbmZpZ0RpY3QgPSB7XG4gICAgICB1bml0czogdGhpcy51bml0cyxcbiAgICAgIGFjdGl2YXRpb246IHNlcmlhbGl6ZUFjdGl2YXRpb24odGhpcy5hY3RpdmF0aW9uKSxcbiAgICAgIHJlY3VycmVudEFjdGl2YXRpb246IHNlcmlhbGl6ZUFjdGl2YXRpb24odGhpcy5yZWN1cnJlbnRBY3RpdmF0aW9uKSxcbiAgICAgIHVzZUJpYXM6IHRoaXMudXNlQmlhcyxcbiAgICAgIGtlcm5lbEluaXRpYWxpemVyOiBzZXJpYWxpemVJbml0aWFsaXplcih0aGlzLmtlcm5lbEluaXRpYWxpemVyKSxcbiAgICAgIHJlY3VycmVudEluaXRpYWxpemVyOiBzZXJpYWxpemVJbml0aWFsaXplcih0aGlzLnJlY3VycmVudEluaXRpYWxpemVyKSxcbiAgICAgIGJpYXNJbml0aWFsaXplcjogc2VyaWFsaXplSW5pdGlhbGl6ZXIodGhpcy5iaWFzSW5pdGlhbGl6ZXIpLFxuICAgICAgdW5pdEZvcmdldEJpYXM6IHRoaXMudW5pdEZvcmdldEJpYXMsXG4gICAgICBrZXJuZWxSZWd1bGFyaXplcjogc2VyaWFsaXplUmVndWxhcml6ZXIodGhpcy5rZXJuZWxSZWd1bGFyaXplciksXG4gICAgICByZWN1cnJlbnRSZWd1bGFyaXplcjogc2VyaWFsaXplUmVndWxhcml6ZXIodGhpcy5yZWN1cnJlbnRSZWd1bGFyaXplciksXG4gICAgICBiaWFzUmVndWxhcml6ZXI6IHNlcmlhbGl6ZVJlZ3VsYXJpemVyKHRoaXMuYmlhc1JlZ3VsYXJpemVyKSxcbiAgICAgIGFjdGl2aXR5UmVndWxhcml6ZXI6IHNlcmlhbGl6ZVJlZ3VsYXJpemVyKHRoaXMuYWN0aXZpdHlSZWd1bGFyaXplciksXG4gICAgICBrZXJuZWxDb25zdHJhaW50OiBzZXJpYWxpemVDb25zdHJhaW50KHRoaXMua2VybmVsQ29uc3RyYWludCksXG4gICAgICByZWN1cnJlbnRDb25zdHJhaW50OiBzZXJpYWxpemVDb25zdHJhaW50KHRoaXMucmVjdXJyZW50Q29uc3RyYWludCksXG4gICAgICBiaWFzQ29uc3RyYWludDogc2VyaWFsaXplQ29uc3RyYWludCh0aGlzLmJpYXNDb25zdHJhaW50KSxcbiAgICAgIGRyb3BvdXQ6IHRoaXMuZHJvcG91dCxcbiAgICAgIHJlY3VycmVudERyb3BvdXQ6IHRoaXMucmVjdXJyZW50RHJvcG91dCxcbiAgICAgIGltcGxlbWVudGF0aW9uOiB0aGlzLmltcGxlbWVudGF0aW9uLFxuICAgIH07XG5cbiAgICByZXR1cm4gey4uLmJhc2VDb25maWcsIC4uLmNvbmZpZ307XG4gIH1cbn1cbnNlcmlhbGl6YXRpb24ucmVnaXN0ZXJDbGFzcyhMU1RNQ2VsbCk7XG5cbi8vIFBvcnRpbmcgTm90ZTogU2luY2UgdGhpcyBpcyBhIHN1cGVyc2V0IG9mIFNpbXBsZVJOTkxheWVyQ29uZmlnLCB3ZSBpbmhlcml0XG4vLyAgIGZyb20gdGhhdCBpbnRlcmZhY2UgaW5zdGVhZCBvZiByZXBlYXRpbmcgdGhlIGZpZWxkcyBoZXJlLlxuZXhwb3J0IGRlY2xhcmUgaW50ZXJmYWNlIExTVE1MYXllckFyZ3MgZXh0ZW5kcyBTaW1wbGVSTk5MYXllckFyZ3Mge1xuICAvKipcbiAgICogQWN0aXZhdGlvbiBmdW5jdGlvbiB0byB1c2UgZm9yIHRoZSByZWN1cnJlbnQgc3RlcC5cbiAgICpcbiAgICogRGVmYXVsdHMgdG8gaGFyZCBzaWdtb2lkIChgaGFyZFNpZ21vaWRgKS5cbiAgICpcbiAgICogSWYgYG51bGxgLCBubyBhY3RpdmF0aW9uIGlzIGFwcGxpZWQuXG4gICAqL1xuICByZWN1cnJlbnRBY3RpdmF0aW9uPzogQWN0aXZhdGlvbklkZW50aWZpZXI7XG5cbiAgLyoqXG4gICAqIElmIGB0cnVlYCwgYWRkIDEgdG8gdGhlIGJpYXMgb2YgdGhlIGZvcmdldCBnYXRlIGF0IGluaXRpYWxpemF0aW9uLlxuICAgKiBTZXR0aW5nIGl0IHRvIGB0cnVlYCB3aWxsIGFsc28gZm9yY2UgYGJpYXNJbml0aWFsaXplciA9ICd6ZXJvcydgLlxuICAgKiBUaGlzIGlzIHJlY29tbWVuZGVkIGluXG4gICAqIFtKb3plZm93aWN6IGV0XG4gICAqIGFsLl0oaHR0cDovL3d3dy5qbWxyLm9yZy9wcm9jZWVkaW5ncy9wYXBlcnMvdjM3L2pvemVmb3dpY3oxNS5wZGYpXG4gICAqL1xuICB1bml0Rm9yZ2V0Qmlhcz86IGJvb2xlYW47XG5cbiAgLyoqXG4gICAqIEltcGxlbWVudGF0aW9uIG1vZGUsIGVpdGhlciAxIG9yIDIuXG4gICAqICAgTW9kZSAxIHdpbGwgc3RydWN0dXJlIGl0cyBvcGVyYXRpb25zIGFzIGEgbGFyZ2VyIG51bWJlciBvZlxuICAgKiAgIHNtYWxsZXIgZG90IHByb2R1Y3RzIGFuZCBhZGRpdGlvbnMsIHdoZXJlYXMgbW9kZSAyIHdpbGxcbiAgICogICBiYXRjaCB0aGVtIGludG8gZmV3ZXIsIGxhcmdlciBvcGVyYXRpb25zLiBUaGVzZSBtb2RlcyB3aWxsXG4gICAqICAgaGF2ZSBkaWZmZXJlbnQgcGVyZm9ybWFuY2UgcHJvZmlsZXMgb24gZGlmZmVyZW50IGhhcmR3YXJlIGFuZFxuICAgKiAgIGZvciBkaWZmZXJlbnQgYXBwbGljYXRpb25zLlxuICAgKlxuICAgKiBOb3RlOiBGb3Igc3VwZXJpb3IgcGVyZm9ybWFuY2UsIFRlbnNvckZsb3cuanMgYWx3YXlzIHVzZXMgaW1wbGVtZW50YXRpb25cbiAgICogMiwgcmVnYXJkbGVzcyBvZiB0aGUgYWN0dWFsIHZhbHVlIG9mIHRoaXMgY29uZmlnIGZpZWxkLlxuICAgKi9cbiAgaW1wbGVtZW50YXRpb24/OiBudW1iZXI7XG59XG5cbmV4cG9ydCBjbGFzcyBMU1RNIGV4dGVuZHMgUk5OIHtcbiAgLyoqIEBub2NvbGxhcHNlICovXG4gIHN0YXRpYyBjbGFzc05hbWUgPSAnTFNUTSc7XG4gIGNvbnN0cnVjdG9yKGFyZ3M6IExTVE1MYXllckFyZ3MpIHtcbiAgICBpZiAoYXJncy5pbXBsZW1lbnRhdGlvbiA9PT0gMCkge1xuICAgICAgY29uc29sZS53YXJuKFxuICAgICAgICAgICdgaW1wbGVtZW50YXRpb249MGAgaGFzIGJlZW4gZGVwcmVjYXRlZCwgYW5kIG5vdyBkZWZhdWx0cyB0byAnICtcbiAgICAgICAgICAnYGltcGxlbWVudGF0aW9uPTFgLiBQbGVhc2UgdXBkYXRlIHlvdXIgbGF5ZXIgY2FsbC4nKTtcbiAgICB9XG4gICAgYXJncy5jZWxsID0gbmV3IExTVE1DZWxsKGFyZ3MpO1xuICAgIHN1cGVyKGFyZ3MgYXMgUk5OTGF5ZXJBcmdzKTtcbiAgICAvLyBUT0RPKGNhaXMpOiBBZGQgYWN0aXZpdHlSZWd1bGFyaXplci5cbiAgfVxuXG4gIGNhbGwoaW5wdXRzOiBUZW5zb3J8VGVuc29yW10sIGt3YXJnczogS3dhcmdzKTogVGVuc29yfFRlbnNvcltdIHtcbiAgICByZXR1cm4gdGlkeSgoKSA9PiB7XG4gICAgICBpZiAodGhpcy5jZWxsLmRyb3BvdXRNYXNrICE9IG51bGwpIHtcbiAgICAgICAgdGZjLmRpc3Bvc2UodGhpcy5jZWxsLmRyb3BvdXRNYXNrKTtcbiAgICAgICAgdGhpcy5jZWxsLmRyb3BvdXRNYXNrID0gbnVsbDtcbiAgICAgIH1cbiAgICAgIGlmICh0aGlzLmNlbGwucmVjdXJyZW50RHJvcG91dE1hc2sgIT0gbnVsbCkge1xuICAgICAgICB0ZmMuZGlzcG9zZSh0aGlzLmNlbGwucmVjdXJyZW50RHJvcG91dE1hc2spO1xuICAgICAgICB0aGlzLmNlbGwucmVjdXJyZW50RHJvcG91dE1hc2sgPSBudWxsO1xuICAgICAgfVxuICAgICAgY29uc3QgbWFzayA9IGt3YXJncyA9PSBudWxsID8gbnVsbCA6IGt3YXJnc1snbWFzayddO1xuICAgICAgY29uc3QgdHJhaW5pbmcgPSBrd2FyZ3MgPT0gbnVsbCA/IG51bGwgOiBrd2FyZ3NbJ3RyYWluaW5nJ107XG4gICAgICBjb25zdCBpbml0aWFsU3RhdGU6IFRlbnNvcltdID1cbiAgICAgICAgICBrd2FyZ3MgPT0gbnVsbCA/IG51bGwgOiBrd2FyZ3NbJ2luaXRpYWxTdGF0ZSddO1xuICAgICAgcmV0dXJuIHN1cGVyLmNhbGwoaW5wdXRzLCB7bWFzaywgdHJhaW5pbmcsIGluaXRpYWxTdGF0ZX0pO1xuICAgIH0pO1xuICB9XG5cbiAgLyoqIEBub2NvbGxhcHNlICovXG4gIHN0YXRpYyBmcm9tQ29uZmlnPFQgZXh0ZW5kcyBzZXJpYWxpemF0aW9uLlNlcmlhbGl6YWJsZT4oXG4gICAgICBjbHM6IHNlcmlhbGl6YXRpb24uU2VyaWFsaXphYmxlQ29uc3RydWN0b3I8VD4sXG4gICAgICBjb25maWc6IHNlcmlhbGl6YXRpb24uQ29uZmlnRGljdCk6IFQge1xuICAgIGlmIChjb25maWdbJ2ltcGxtZW50YXRpb24nXSA9PT0gMCkge1xuICAgICAgY29uZmlnWydpbXBsZW1lbnRhdGlvbiddID0gMTtcbiAgICB9XG4gICAgcmV0dXJuIG5ldyBjbHMoY29uZmlnKTtcbiAgfVxufVxuc2VyaWFsaXphdGlvbi5yZWdpc3RlckNsYXNzKExTVE0pO1xuXG5leHBvcnQgZGVjbGFyZSBpbnRlcmZhY2UgU3RhY2tlZFJOTkNlbGxzQXJncyBleHRlbmRzIExheWVyQXJncyB7XG4gIC8qKlxuICAgKiBBbiBgQXJyYXlgIG9mIGBSTk5DZWxsYCBpbnN0YW5jZXMuXG4gICAqL1xuICBjZWxsczogUk5OQ2VsbFtdO1xufVxuXG5leHBvcnQgY2xhc3MgU3RhY2tlZFJOTkNlbGxzIGV4dGVuZHMgUk5OQ2VsbCB7XG4gIC8qKiBAbm9jb2xsYXBzZSAqL1xuICBzdGF0aWMgY2xhc3NOYW1lID0gJ1N0YWNrZWRSTk5DZWxscyc7XG4gIHByb3RlY3RlZCBjZWxsczogUk5OQ2VsbFtdO1xuXG4gIGNvbnN0cnVjdG9yKGFyZ3M6IFN0YWNrZWRSTk5DZWxsc0FyZ3MpIHtcbiAgICBzdXBlcihhcmdzKTtcbiAgICB0aGlzLmNlbGxzID0gYXJncy5jZWxscztcbiAgfVxuXG4gIGdldCBzdGF0ZVNpemUoKTogbnVtYmVyW10ge1xuICAgIC8vIFN0YXRlcyBhcmUgYSBmbGF0IGxpc3QgaW4gcmV2ZXJzZSBvcmRlciBvZiB0aGUgY2VsbCBzdGFjay5cbiAgICAvLyBUaGlzIGFsbG93cyBwZXJzZXJ2aW5nIHRoZSByZXF1aXJlbWVudCBgc3RhY2suc3RhdGVzaXplWzBdID09PVxuICAgIC8vIG91dHB1dERpbWAuIEUuZy4sIHN0YXRlcyBvZiBhIDItbGF5ZXIgTFNUTSB3b3VsZCBiZSBgW2gyLCBjMiwgaDEsIGMxXWAsXG4gICAgLy8gYXNzdW1pbmcgb25lIExTVE0gaGFzIHN0YXRlcyBgW2gsIGNdYC5cbiAgICBjb25zdCBzdGF0ZVNpemU6IG51bWJlcltdID0gW107XG4gICAgZm9yIChjb25zdCBjZWxsIG9mIHRoaXMuY2VsbHMuc2xpY2UoKS5yZXZlcnNlKCkpIHtcbiAgICAgIGlmIChBcnJheS5pc0FycmF5KGNlbGwuc3RhdGVTaXplKSkge1xuICAgICAgICBzdGF0ZVNpemUucHVzaCguLi5jZWxsLnN0YXRlU2l6ZSk7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBzdGF0ZVNpemUucHVzaChjZWxsLnN0YXRlU2l6ZSk7XG4gICAgICB9XG4gICAgfVxuICAgIHJldHVybiBzdGF0ZVNpemU7XG4gIH1cblxuICBjYWxsKGlucHV0czogVGVuc29yfFRlbnNvcltdLCBrd2FyZ3M6IEt3YXJncyk6IFRlbnNvcnxUZW5zb3JbXSB7XG4gICAgcmV0dXJuIHRpZHkoKCkgPT4ge1xuICAgICAgaW5wdXRzID0gaW5wdXRzIGFzIFRlbnNvcltdO1xuICAgICAgbGV0IHN0YXRlcyA9IGlucHV0cy5zbGljZSgxKTtcblxuICAgICAgLy8gUmVjb3ZlciBwZXItY2VsbCBzdGF0ZXMuXG4gICAgICBjb25zdCBuZXN0ZWRTdGF0ZXM6IFRlbnNvcltdW10gPSBbXTtcbiAgICAgIGZvciAoY29uc3QgY2VsbCBvZiB0aGlzLmNlbGxzLnNsaWNlKCkucmV2ZXJzZSgpKSB7XG4gICAgICAgIGlmIChBcnJheS5pc0FycmF5KGNlbGwuc3RhdGVTaXplKSkge1xuICAgICAgICAgIG5lc3RlZFN0YXRlcy5wdXNoKHN0YXRlcy5zcGxpY2UoMCwgY2VsbC5zdGF0ZVNpemUubGVuZ3RoKSk7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgbmVzdGVkU3RhdGVzLnB1c2goc3RhdGVzLnNwbGljZSgwLCAxKSk7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICAgIG5lc3RlZFN0YXRlcy5yZXZlcnNlKCk7XG5cbiAgICAgIC8vIENhbGwgdGhlIGNlbGxzIGluIG9yZGVyIGFuZCBzdG9yZSB0aGUgcmV0dXJuZWQgc3RhdGVzLlxuICAgICAgY29uc3QgbmV3TmVzdGVkU3RhdGVzOiBUZW5zb3JbXVtdID0gW107XG4gICAgICBsZXQgY2FsbElucHV0czogVGVuc29yW107XG4gICAgICBmb3IgKGxldCBpID0gMDsgaSA8IHRoaXMuY2VsbHMubGVuZ3RoOyArK2kpIHtcbiAgICAgICAgY29uc3QgY2VsbCA9IHRoaXMuY2VsbHNbaV07XG4gICAgICAgIHN0YXRlcyA9IG5lc3RlZFN0YXRlc1tpXTtcbiAgICAgICAgLy8gVE9ETyhjYWlzKTogVGFrZSBjYXJlIG9mIGNvbnN0YW50cy5cbiAgICAgICAgaWYgKGkgPT09IDApIHtcbiAgICAgICAgICBjYWxsSW5wdXRzID0gW2lucHV0c1swXV0uY29uY2F0KHN0YXRlcyk7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgY2FsbElucHV0cyA9IFtjYWxsSW5wdXRzWzBdXS5jb25jYXQoc3RhdGVzKTtcbiAgICAgICAgfVxuICAgICAgICBjYWxsSW5wdXRzID0gY2VsbC5jYWxsKGNhbGxJbnB1dHMsIGt3YXJncykgYXMgVGVuc29yW107XG4gICAgICAgIG5ld05lc3RlZFN0YXRlcy5wdXNoKGNhbGxJbnB1dHMuc2xpY2UoMSkpO1xuICAgICAgfVxuXG4gICAgICAvLyBGb3JtYXQgdGhlIG5ldyBzdGF0ZXMgYXMgYSBmbGF0IGxpc3QgaW4gcmV2ZXJzZSBjZWxsIG9yZGVyLlxuICAgICAgc3RhdGVzID0gW107XG4gICAgICBmb3IgKGNvbnN0IGNlbGxTdGF0ZXMgb2YgbmV3TmVzdGVkU3RhdGVzLnNsaWNlKCkucmV2ZXJzZSgpKSB7XG4gICAgICAgIHN0YXRlcy5wdXNoKC4uLmNlbGxTdGF0ZXMpO1xuICAgICAgfVxuICAgICAgcmV0dXJuIFtjYWxsSW5wdXRzWzBdXS5jb25jYXQoc3RhdGVzKTtcbiAgICB9KTtcbiAgfVxuXG4gIHB1YmxpYyBidWlsZChpbnB1dFNoYXBlOiBTaGFwZXxTaGFwZVtdKTogdm9pZCB7XG4gICAgaWYgKGlzQXJyYXlPZlNoYXBlcyhpbnB1dFNoYXBlKSkge1xuICAgICAgLy8gVE9ETyhjYWlzKTogVGFrZSBjYXJlIG9mIGlucHV0IGNvbnN0YW50cy5cbiAgICAgIC8vIGNvbnN0IGNvbnN0YW50U2hhcGUgPSBpbnB1dFNoYXBlLnNsaWNlKDEpO1xuICAgICAgaW5wdXRTaGFwZSA9IChpbnB1dFNoYXBlIGFzIFNoYXBlW10pWzBdO1xuICAgIH1cbiAgICBpbnB1dFNoYXBlID0gaW5wdXRTaGFwZSBhcyBTaGFwZTtcbiAgICBsZXQgb3V0cHV0RGltOiBudW1iZXI7XG4gICAgdGhpcy5jZWxscy5mb3JFYWNoKChjZWxsLCBpKSA9PiB7XG4gICAgICBuYW1lU2NvcGUoYFJOTkNlbGxfJHtpfWAsICgpID0+IHtcbiAgICAgICAgLy8gVE9ETyhjYWlzKTogVGFrZSBjYXJlIG9mIGlucHV0IGNvbnN0YW50cy5cblxuICAgICAgICBjZWxsLmJ1aWxkKGlucHV0U2hhcGUpO1xuICAgICAgICBpZiAoQXJyYXkuaXNBcnJheShjZWxsLnN0YXRlU2l6ZSkpIHtcbiAgICAgICAgICBvdXRwdXREaW0gPSBjZWxsLnN0YXRlU2l6ZVswXTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICBvdXRwdXREaW0gPSBjZWxsLnN0YXRlU2l6ZTtcbiAgICAgICAgfVxuICAgICAgICBpbnB1dFNoYXBlID0gW2lucHV0U2hhcGVbMF0sIG91dHB1dERpbV0gYXMgU2hhcGU7XG4gICAgICB9KTtcbiAgICB9KTtcbiAgICB0aGlzLmJ1aWx0ID0gdHJ1ZTtcbiAgfVxuXG4gIGdldENvbmZpZygpOiBzZXJpYWxpemF0aW9uLkNvbmZpZ0RpY3Qge1xuICAgIGNvbnN0IGJhc2VDb25maWcgPSBzdXBlci5nZXRDb25maWcoKTtcblxuICAgIGNvbnN0IGdldENlbGxDb25maWcgPSAoY2VsbDogUk5OQ2VsbCkgPT4ge1xuICAgICAgcmV0dXJuIHtcbiAgICAgICAgJ2NsYXNzTmFtZSc6IGNlbGwuZ2V0Q2xhc3NOYW1lKCksXG4gICAgICAgICdjb25maWcnOiBjZWxsLmdldENvbmZpZygpLFxuICAgICAgfTtcbiAgICB9O1xuXG4gICAgY29uc3QgY2VsbENvbmZpZ3MgPSB0aGlzLmNlbGxzLm1hcChnZXRDZWxsQ29uZmlnKTtcblxuICAgIGNvbnN0IGNvbmZpZyA9IHsnY2VsbHMnOiBjZWxsQ29uZmlnc307XG5cbiAgICByZXR1cm4gey4uLmJhc2VDb25maWcsIC4uLmNvbmZpZ307XG4gIH1cblxuICAvKiogQG5vY29sbGFwc2UgKi9cbiAgc3RhdGljIGZyb21Db25maWc8VCBleHRlbmRzIHNlcmlhbGl6YXRpb24uU2VyaWFsaXphYmxlPihcbiAgICAgIGNsczogc2VyaWFsaXphdGlvbi5TZXJpYWxpemFibGVDb25zdHJ1Y3RvcjxUPixcbiAgICAgIGNvbmZpZzogc2VyaWFsaXphdGlvbi5Db25maWdEaWN0LFxuICAgICAgY3VzdG9tT2JqZWN0cyA9IHt9IGFzIHNlcmlhbGl6YXRpb24uQ29uZmlnRGljdCk6IFQge1xuICAgIGNvbnN0IGNlbGxzOiBSTk5DZWxsW10gPSBbXTtcbiAgICBmb3IgKGNvbnN0IGNlbGxDb25maWcgb2YgKGNvbmZpZ1snY2VsbHMnXSBhcyBzZXJpYWxpemF0aW9uLkNvbmZpZ0RpY3RbXSkpIHtcbiAgICAgIGNlbGxzLnB1c2goZGVzZXJpYWxpemUoY2VsbENvbmZpZywgY3VzdG9tT2JqZWN0cykgYXMgUk5OQ2VsbCk7XG4gICAgfVxuICAgIHJldHVybiBuZXcgY2xzKHtjZWxsc30pO1xuICB9XG5cbiAgZ2V0IHRyYWluYWJsZVdlaWdodHMoKTogTGF5ZXJWYXJpYWJsZVtdIHtcbiAgICBpZiAoIXRoaXMudHJhaW5hYmxlKSB7XG4gICAgICByZXR1cm4gW107XG4gICAgfVxuICAgIGNvbnN0IHdlaWdodHM6IExheWVyVmFyaWFibGVbXSA9IFtdO1xuICAgIGZvciAoY29uc3QgY2VsbCBvZiB0aGlzLmNlbGxzKSB7XG4gICAgICB3ZWlnaHRzLnB1c2goLi4uY2VsbC50cmFpbmFibGVXZWlnaHRzKTtcbiAgICB9XG4gICAgcmV0dXJuIHdlaWdodHM7XG4gIH1cblxuICBnZXQgbm9uVHJhaW5hYmxlV2VpZ2h0cygpOiBMYXllclZhcmlhYmxlW10ge1xuICAgIGNvbnN0IHdlaWdodHM6IExheWVyVmFyaWFibGVbXSA9IFtdO1xuICAgIGZvciAoY29uc3QgY2VsbCBvZiB0aGlzLmNlbGxzKSB7XG4gICAgICB3ZWlnaHRzLnB1c2goLi4uY2VsbC5ub25UcmFpbmFibGVXZWlnaHRzKTtcbiAgICB9XG4gICAgaWYgKCF0aGlzLnRyYWluYWJsZSkge1xuICAgICAgY29uc3QgdHJhaW5hYmxlV2VpZ2h0czogTGF5ZXJWYXJpYWJsZVtdID0gW107XG4gICAgICBmb3IgKGNvbnN0IGNlbGwgb2YgdGhpcy5jZWxscykge1xuICAgICAgICB0cmFpbmFibGVXZWlnaHRzLnB1c2goLi4uY2VsbC50cmFpbmFibGVXZWlnaHRzKTtcbiAgICAgIH1cbiAgICAgIHJldHVybiB0cmFpbmFibGVXZWlnaHRzLmNvbmNhdCh3ZWlnaHRzKTtcbiAgICB9XG4gICAgcmV0dXJuIHdlaWdodHM7XG4gIH1cblxuICAvKipcbiAgICogUmV0cmlldmUgdGhlIHdlaWdodHMgb2YgYSB0aGUgbW9kZWwuXG4gICAqXG4gICAqIEByZXR1cm5zIEEgZmxhdCBgQXJyYXlgIG9mIGB0Zi5UZW5zb3Jgcy5cbiAgICovXG4gIGdldFdlaWdodHMoKTogVGVuc29yW10ge1xuICAgIGNvbnN0IHdlaWdodHM6IExheWVyVmFyaWFibGVbXSA9IFtdO1xuICAgIGZvciAoY29uc3QgY2VsbCBvZiB0aGlzLmNlbGxzKSB7XG4gICAgICB3ZWlnaHRzLnB1c2goLi4uY2VsbC53ZWlnaHRzKTtcbiAgICB9XG4gICAgcmV0dXJuIGJhdGNoR2V0VmFsdWUod2VpZ2h0cyk7XG4gIH1cblxuICAvKipcbiAgICogU2V0IHRoZSB3ZWlnaHRzIG9mIHRoZSBtb2RlbC5cbiAgICpcbiAgICogQHBhcmFtIHdlaWdodHMgQW4gYEFycmF5YCBvZiBgdGYuVGVuc29yYHMgd2l0aCBzaGFwZXMgYW5kIHR5cGVzIG1hdGNoaW5nXG4gICAqICAgICB0aGUgb3V0cHV0IG9mIGBnZXRXZWlnaHRzKClgLlxuICAgKi9cbiAgc2V0V2VpZ2h0cyh3ZWlnaHRzOiBUZW5zb3JbXSk6IHZvaWQge1xuICAgIGNvbnN0IHR1cGxlczogQXJyYXk8W0xheWVyVmFyaWFibGUsIFRlbnNvcl0+ID0gW107XG4gICAgZm9yIChjb25zdCBjZWxsIG9mIHRoaXMuY2VsbHMpIHtcbiAgICAgIGNvbnN0IG51bVBhcmFtcyA9IGNlbGwud2VpZ2h0cy5sZW5ndGg7XG4gICAgICBjb25zdCBpbnB1dFdlaWdodHMgPSB3ZWlnaHRzLnNwbGljZShudW1QYXJhbXMpO1xuICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCBjZWxsLndlaWdodHMubGVuZ3RoOyArK2kpIHtcbiAgICAgICAgdHVwbGVzLnB1c2goW2NlbGwud2VpZ2h0c1tpXSwgaW5wdXRXZWlnaHRzW2ldXSk7XG4gICAgICB9XG4gICAgfVxuICAgIGJhdGNoU2V0VmFsdWUodHVwbGVzKTtcbiAgfVxuXG4gIC8vIFRPRE8oY2Fpcyk6IE1heWJlIGltcGxlbW50IGBsb3NzZXNgIGFuZCBgZ2V0TG9zc2VzRm9yYC5cbn1cbnNlcmlhbGl6YXRpb24ucmVnaXN0ZXJDbGFzcyhTdGFja2VkUk5OQ2VsbHMpO1xuXG5leHBvcnQgZnVuY3Rpb24gZ2VuZXJhdGVEcm9wb3V0TWFzayhhcmdzOiB7XG4gIG9uZXM6ICgpID0+IHRmYy5UZW5zb3IsXG4gIHJhdGU6IG51bWJlcixcbiAgdHJhaW5pbmc/OiBib29sZWFuLFxuICBjb3VudD86IG51bWJlcixcbiAgZHJvcG91dEZ1bmM/OiBGdW5jdGlvbixcbn0pOiB0ZmMuVGVuc29yfHRmYy5UZW5zb3JbXSB7XG4gIGNvbnN0IHtvbmVzLCByYXRlLCB0cmFpbmluZyA9IGZhbHNlLCBjb3VudCA9IDEsIGRyb3BvdXRGdW5jfSA9IGFyZ3M7XG5cbiAgY29uc3QgZHJvcHBlZElucHV0cyA9ICgpID0+XG4gICAgICBkcm9wb3V0RnVuYyAhPSBudWxsID8gZHJvcG91dEZ1bmMob25lcygpLCByYXRlKSA6IEsuZHJvcG91dChvbmVzKCksIHJhdGUpO1xuXG4gIGNvbnN0IGNyZWF0ZU1hc2sgPSAoKSA9PiBLLmluVHJhaW5QaGFzZShkcm9wcGVkSW5wdXRzLCBvbmVzLCB0cmFpbmluZyk7XG5cbiAgLy8ganVzdCBpbiBjYXNlIGNvdW50IGlzIHByb3ZpZGVkIHdpdGggbnVsbCBvciB1bmRlZmluZWRcbiAgaWYgKCFjb3VudCB8fCBjb3VudCA8PSAxKSB7XG4gICAgcmV0dXJuIHRmYy5rZWVwKGNyZWF0ZU1hc2soKS5jbG9uZSgpKTtcbiAgfVxuXG4gIGNvbnN0IG1hc2tzID0gQXJyYXkoY291bnQpLmZpbGwodW5kZWZpbmVkKS5tYXAoY3JlYXRlTWFzayk7XG5cbiAgcmV0dXJuIG1hc2tzLm1hcChtID0+IHRmYy5rZWVwKG0uY2xvbmUoKSkpO1xufVxuIl19","/**\n * @license\n * Copyright 2020 Google LLC\n *\n * Use of this source code is governed by an MIT-style\n * license that can be found in the LICENSE file or at\n * https://opensource.org/licenses/MIT.\n * =============================================================================\n */\nvar __rest = (this && this.__rest) || function (s, e) {\n var t = {};\n for (var p in s) if (Object.prototype.hasOwnProperty.call(s, p) && e.indexOf(p) < 0)\n t[p] = s[p];\n if (s != null && typeof Object.getOwnPropertySymbols === \"function\")\n for (var i = 0, p = Object.getOwnPropertySymbols(s); i < p.length; i++) {\n if (e.indexOf(p[i]) < 0 && Object.prototype.propertyIsEnumerable.call(s, p[i]))\n t[p[i]] = s[p[i]];\n }\n return t;\n};\nimport * as tfc from '@tensorflow/tfjs-core';\nimport { util } from '@tensorflow/tfjs-core';\nimport * as K from '../backend/tfjs_backend';\nimport { checkDataFormat, checkPaddingMode } from '../common';\nimport { InputSpec } from '../engine/topology';\nimport { AttributeError, NotImplementedError, ValueError } from '../errors';\nimport { Initializer } from '../initializers';\nimport { convOutputLength, normalizeArray } from '../utils/conv_utils';\nimport { assertPositiveInteger } from '../utils/generic_utils';\nimport { getExactlyOneShape } from '../utils/types_utils';\nimport { generateDropoutMask, LSTMCell, RNN, RNNCell } from './recurrent';\nclass ConvRNN2DCell extends RNNCell {\n}\n/**\n * Base class for convolutional-recurrent layers.\n */\nclass ConvRNN2D extends RNN {\n constructor(args) {\n if (args.unroll) {\n throw new NotImplementedError('Unrolling is not possible with convolutional RNNs.');\n }\n if (Array.isArray(args.cell)) {\n throw new NotImplementedError('It is not possible at the moment to stack convolutional cells.');\n }\n super(args);\n this.inputSpec = [new InputSpec({ ndim: 5 })];\n }\n call(inputs, kwargs) {\n return tfc.tidy(() => {\n if (this.cell.dropoutMask != null) {\n tfc.dispose(this.cell.dropoutMask);\n this.cell.dropoutMask = null;\n }\n if (this.cell.recurrentDropoutMask != null) {\n tfc.dispose(this.cell.recurrentDropoutMask);\n this.cell.recurrentDropoutMask = null;\n }\n if (kwargs && kwargs['constants']) {\n throw new ValueError('ConvRNN2D cell does not support constants');\n }\n const mask = kwargs == null ? null : kwargs['mask'];\n const training = kwargs == null ? null : kwargs['training'];\n const initialState = kwargs == null ? null : kwargs['initialState'];\n return super.call(inputs, { mask, training, initialState });\n });\n }\n computeOutputShape(inputShape) {\n let outShape = this.computeSingleOutputShape(inputShape);\n if (!this.returnSequences) {\n outShape = [outShape[0], ...outShape.slice(2)];\n }\n if (this.returnState) {\n outShape =\n [outShape, ...Array(2).fill([inputShape[0], ...outShape.slice(-3)])];\n }\n return outShape;\n }\n getInitialState(inputs) {\n return tfc.tidy(() => {\n const { stateSize } = this.cell;\n const inputShape = inputs.shape;\n const outputShape = this.computeSingleOutputShape(inputShape);\n const stateShape = [outputShape[0], ...outputShape.slice(2)];\n const initialState = tfc.zeros(stateShape);\n if (Array.isArray(stateSize)) {\n return Array(stateSize.length).fill(initialState);\n }\n return [initialState];\n });\n }\n resetStates(states, training = false) {\n tfc.tidy(() => {\n if (!this.stateful) {\n throw new AttributeError('Cannot call resetStates() on an RNN Layer that is not stateful.');\n }\n const inputShape = this.inputSpec[0].shape;\n const outputShape = this.computeSingleOutputShape(inputShape);\n const stateShape = [outputShape[0], ...outputShape.slice(2)];\n const batchSize = inputShape[0];\n if (batchSize == null) {\n throw new ValueError('If an RNN is stateful, it needs to know its batch size. Specify ' +\n 'the batch size of your input tensors: \\n' +\n '- If using a Sequential model, specify the batch size by ' +\n 'passing a `batchInputShape` option to your first layer.\\n' +\n '- If using the functional API, specify the batch size by ' +\n 'passing a `batchShape` option to your Input layer.');\n }\n // Initialize state if null.\n if (this.getStates() == null) {\n if (Array.isArray(this.cell.stateSize)) {\n this.states_ = this.cell.stateSize.map(() => tfc.zeros(stateShape));\n }\n else {\n this.states_ = [tfc.zeros(stateShape)];\n }\n }\n else if (states == null) {\n // Dispose old state tensors.\n tfc.dispose(this.states_);\n // For stateful RNNs, fully dispose kept old states.\n if (this.keptStates != null) {\n tfc.dispose(this.keptStates);\n this.keptStates = [];\n }\n if (Array.isArray(this.cell.stateSize)) {\n this.states_ = this.cell.stateSize.map(() => tfc.zeros(stateShape));\n }\n else {\n this.states_[0] = tfc.zeros(stateShape);\n }\n }\n else {\n if (!Array.isArray(states)) {\n states = [states];\n }\n if (states.length !== this.states_.length) {\n throw new ValueError(`Layer ${this.name} expects ${this.states_.length} state(s), ` +\n `but it received ${states.length} state value(s). Input ` +\n `received: ${states}`);\n }\n if (training) {\n // Store old state tensors for complete disposal later, i.e., during\n // the next no-arg call to this method. We do not dispose the old\n // states immediately because that BPTT (among other things) require\n // them.\n this.keptStates.push(this.states_.slice());\n }\n else {\n tfc.dispose(this.states_);\n }\n for (let index = 0; index < this.states_.length; ++index) {\n const value = states[index];\n const expectedShape = stateShape;\n if (!util.arraysEqual(value.shape, expectedShape)) {\n throw new ValueError(`State ${index} is incompatible with layer ${this.name}: ` +\n `expected shape=${expectedShape}, received shape=${value.shape}`);\n }\n this.states_[index] = value;\n }\n }\n this.states_ = this.states_.map(state => tfc.keep(state.clone()));\n });\n }\n computeSingleOutputShape(inputShape) {\n const { dataFormat, filters, kernelSize, padding, strides, dilationRate } = this.cell;\n const isChannelsFirst = dataFormat === 'channelsFirst';\n const h = inputShape[isChannelsFirst ? 3 : 2];\n const w = inputShape[isChannelsFirst ? 4 : 3];\n const hOut = convOutputLength(h, kernelSize[0], padding, strides[0], dilationRate[0]);\n const wOut = convOutputLength(w, kernelSize[1], padding, strides[1], dilationRate[1]);\n const outShape = [\n ...inputShape.slice(0, 2),\n ...(isChannelsFirst ? [filters, hOut, wOut] : [hOut, wOut, filters])\n ];\n return outShape;\n }\n}\n/** @nocollapse */\nConvRNN2D.className = 'ConvRNN2D';\nexport class ConvLSTM2DCell extends LSTMCell {\n constructor(args) {\n const { filters, kernelSize, strides, padding, dataFormat, dilationRate, } = args;\n super(Object.assign({}, args, { units: filters }));\n this.filters = filters;\n assertPositiveInteger(this.filters, 'filters');\n this.kernelSize = normalizeArray(kernelSize, 2, 'kernelSize');\n this.kernelSize.forEach(size => assertPositiveInteger(size, 'kernelSize'));\n this.strides = normalizeArray(strides || 1, 2, 'strides');\n this.strides.forEach(stride => assertPositiveInteger(stride, 'strides'));\n this.padding = padding || 'valid';\n checkPaddingMode(this.padding);\n this.dataFormat = dataFormat || 'channelsLast';\n checkDataFormat(this.dataFormat);\n this.dilationRate = normalizeArray(dilationRate || 1, 2, 'dilationRate');\n this.dilationRate.forEach(rate => assertPositiveInteger(rate, 'dilationRate'));\n }\n build(inputShape) {\n var _a;\n inputShape = getExactlyOneShape(inputShape);\n const channelAxis = this.dataFormat === 'channelsFirst' ? 1 : inputShape.length - 1;\n if (inputShape[channelAxis] == null) {\n throw new ValueError(`The channel dimension of the input should be defined. ` +\n `Found ${inputShape[channelAxis]}`);\n }\n const inputDim = inputShape[channelAxis];\n const numOfKernels = 4;\n const kernelShape = this.kernelSize.concat([inputDim, this.filters * numOfKernels]);\n this.kernel = this.addWeight('kernel', kernelShape, null, this.kernelInitializer, this.kernelRegularizer, true, this.kernelConstraint);\n const recurrentKernelShape = this.kernelSize.concat([this.filters, this.filters * numOfKernels]);\n this.recurrentKernel = this.addWeight('recurrent_kernel', recurrentKernelShape, null, this.recurrentInitializer, this.recurrentRegularizer, true, this.recurrentConstraint);\n if (this.useBias) {\n let biasInitializer;\n if (this.unitForgetBias) {\n const init = this.biasInitializer;\n const filters = this.filters;\n biasInitializer = new (_a = class CustomInit extends Initializer {\n apply(shape, dtype) {\n const biasI = init.apply([filters]);\n const biasF = tfc.ones([filters]);\n const biasCAndO = init.apply([filters * 2]);\n return K.concatenate([biasI, biasF, biasCAndO]);\n }\n },\n /** @nocollapse */\n _a.className = 'CustomInit',\n _a)();\n }\n else {\n biasInitializer = this.biasInitializer;\n }\n this.bias = this.addWeight('bias', [this.filters * numOfKernels], null, biasInitializer, this.biasRegularizer, true, this.biasConstraint);\n }\n this.built = true;\n }\n call(inputs, kwargs) {\n return tfc.tidy(() => {\n if (inputs.length !== 3) {\n throw new ValueError(`ConvLSTM2DCell expects 3 input Tensors (inputs, h, c), got ` +\n `${inputs.length}.`);\n }\n const training = kwargs['training'] || false;\n const x = inputs[0]; // Current input\n const hTMinus1 = inputs[1]; // Previous memory state.\n const cTMinus1 = inputs[2]; // Previous carry state.\n const numOfKernels = 4;\n if (0 < this.dropout && this.dropout < 1 && this.dropoutMask == null) {\n this.dropoutMask = generateDropoutMask({\n ones: () => tfc.onesLike(x),\n rate: this.dropout,\n training,\n count: numOfKernels,\n dropoutFunc: this.dropoutFunc\n });\n }\n const dropoutMask = this.dropoutMask;\n const applyDropout = (x, mask, index) => {\n if (!mask || !mask[index]) {\n return x;\n }\n return tfc.mul(mask[index], x);\n };\n let xI = applyDropout(x, dropoutMask, 0);\n let xF = applyDropout(x, dropoutMask, 1);\n let xC = applyDropout(x, dropoutMask, 2);\n let xO = applyDropout(x, dropoutMask, 3);\n if (0 < this.recurrentDropout && this.recurrentDropout < 1 &&\n this.recurrentDropoutMask == null) {\n this.recurrentDropoutMask = generateDropoutMask({\n ones: () => tfc.onesLike(hTMinus1),\n rate: this.recurrentDropout,\n training,\n count: numOfKernels,\n dropoutFunc: this.dropoutFunc\n });\n }\n const recDropoutMask = this.recurrentDropoutMask;\n let hI = applyDropout(hTMinus1, recDropoutMask, 0);\n let hF = applyDropout(hTMinus1, recDropoutMask, 1);\n let hC = applyDropout(hTMinus1, recDropoutMask, 2);\n let hO = applyDropout(hTMinus1, recDropoutMask, 3);\n const kernelChannelAxis = 3;\n const [kernelI, kernelF, kernelC, kernelO] = tfc.split(this.kernel.read(), numOfKernels, kernelChannelAxis);\n const [biasI, biasF, biasC, biasO] = this.useBias ?\n tfc.split(this.bias.read(), numOfKernels) :\n [null, null, null, null];\n xI = this.inputConv(xI, kernelI, biasI, this.padding);\n xF = this.inputConv(xF, kernelF, biasF, this.padding);\n xC = this.inputConv(xC, kernelC, biasC, this.padding);\n xO = this.inputConv(xO, kernelO, biasO, this.padding);\n const [recKernelI, recKernelF, recKernelC, recKernelO] = tfc.split(this.recurrentKernel.read(), numOfKernels, kernelChannelAxis);\n hI = this.recurrentConv(hI, recKernelI);\n hF = this.recurrentConv(hF, recKernelF);\n hC = this.recurrentConv(hC, recKernelC);\n hO = this.recurrentConv(hO, recKernelO);\n const i = this.recurrentActivation.apply(tfc.add(xI, hI));\n const f = this.recurrentActivation.apply(tfc.add(xF, hF));\n const c = tfc.add(tfc.mul(f, cTMinus1), tfc.mul(i, this.activation.apply(tfc.add(xC, hC))));\n const h = tfc.mul(this.recurrentActivation.apply(tfc.add(xO, hO)), this.activation.apply(c));\n return [h, h, c];\n });\n }\n getConfig() {\n const _a = super.getConfig(), { 'units': _ } = _a, baseConfig = __rest(_a, ['units']);\n const config = {\n filters: this.filters,\n kernelSize: this.kernelSize,\n padding: this.padding,\n dataFormat: this.dataFormat,\n dilationRate: this.dilationRate,\n strides: this.strides,\n };\n return Object.assign({}, baseConfig, config);\n }\n inputConv(x, w, b, padding) {\n const out = tfc.conv2d(x, w, this.strides, (padding || 'valid'), this.dataFormat === 'channelsFirst' ? 'NCHW' : 'NHWC', this.dilationRate);\n if (b) {\n return K.biasAdd(out, b, this.dataFormat);\n }\n return out;\n }\n recurrentConv(x, w) {\n const strides = 1;\n return tfc.conv2d(x, w, strides, 'same', this.dataFormat === 'channelsFirst' ? 'NCHW' : 'NHWC');\n }\n}\n/** @nocollapse */\nConvLSTM2DCell.className = 'ConvLSTM2DCell';\ntfc.serialization.registerClass(ConvLSTM2DCell);\nexport class ConvLSTM2D extends ConvRNN2D {\n constructor(args) {\n const cell = new ConvLSTM2DCell(args);\n super(Object.assign({}, args, { cell }));\n }\n /** @nocollapse */\n static fromConfig(cls, config) {\n return new cls(config);\n }\n}\n/** @nocollapse */\nConvLSTM2D.className = 'ConvLSTM2D';\ntfc.serialization.registerClass(ConvLSTM2D);\n//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY29udm9sdXRpb25hbF9yZWN1cnJlbnQuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi8uLi90ZmpzLWxheWVycy9zcmMvbGF5ZXJzL2NvbnZvbHV0aW9uYWxfcmVjdXJyZW50LnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBOzs7Ozs7OztHQVFHOzs7Ozs7Ozs7Ozs7QUFFSCxPQUFPLEtBQUssR0FBRyxNQUFNLHVCQUF1QixDQUFDO0FBQzdDLE9BQU8sRUFBUyxJQUFJLEVBQUMsTUFBTSx1QkFBdUIsQ0FBQztBQUduRCxPQUFPLEtBQUssQ0FBQyxNQUFNLHlCQUF5QixDQUFDO0FBQzdDLE9BQU8sRUFBQyxlQUFlLEVBQUUsZ0JBQWdCLEVBQUMsTUFBTSxXQUFXLENBQUM7QUFFNUQsT0FBTyxFQUFDLFNBQVMsRUFBQyxNQUFNLG9CQUFvQixDQUFDO0FBQzdDLE9BQU8sRUFBQyxjQUFjLEVBQUUsbUJBQW1CLEVBQUUsVUFBVSxFQUFDLE1BQU0sV0FBVyxDQUFDO0FBQzFFLE9BQU8sRUFBQyxXQUFXLEVBQUMsTUFBTSxpQkFBaUIsQ0FBQztBQUk1QyxPQUFPLEVBQUMsZ0JBQWdCLEVBQUUsY0FBYyxFQUFDLE1BQU0scUJBQXFCLENBQUM7QUFDckUsT0FBTyxFQUFDLHFCQUFxQixFQUFDLE1BQU0sd0JBQXdCLENBQUM7QUFDN0QsT0FBTyxFQUFDLGtCQUFrQixFQUFDLE1BQU0sc0JBQXNCLENBQUM7QUFFeEQsT0FBTyxFQUFtQixtQkFBbUIsRUFBRSxRQUFRLEVBQW9DLEdBQUcsRUFBRSxPQUFPLEVBQXVDLE1BQU0sYUFBYSxDQUFDO0FBc0RsSyxNQUFlLGFBQWMsU0FBUSxPQUFPO0NBeUIzQztBQUtEOztHQUVHO0FBQ0gsTUFBTSxTQUFVLFNBQVEsR0FBRztJQU16QixZQUFZLElBQXdCO1FBQ2xDLElBQUksSUFBSSxDQUFDLE1BQU0sRUFBRTtZQUNmLE1BQU0sSUFBSSxtQkFBbUIsQ0FDekIsb0RBQW9ELENBQUMsQ0FBQztTQUMzRDtRQUVELElBQUksS0FBSyxDQUFDLE9BQU8sQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLEVBQUU7WUFDNUIsTUFBTSxJQUFJLG1CQUFtQixDQUN6QixnRUFBZ0UsQ0FBQyxDQUFDO1NBQ3ZFO1FBRUQsS0FBSyxDQUFDLElBQW9CLENBQUMsQ0FBQztRQUU1QixJQUFJLENBQUMsU0FBUyxHQUFHLENBQUMsSUFBSSxTQUFTLENBQUMsRUFBQyxJQUFJLEVBQUUsQ0FBQyxFQUFDLENBQUMsQ0FBQyxDQUFDO0lBQzlDLENBQUM7SUFFRCxJQUFJLENBQUMsTUFBdUIsRUFBRSxNQUFjO1FBQzFDLE9BQU8sR0FBRyxDQUFDLElBQUksQ0FBQyxHQUFHLEVBQUU7WUFDbkIsSUFBSSxJQUFJLENBQUMsSUFBSSxDQUFDLFdBQVcsSUFBSSxJQUFJLEVBQUU7Z0JBQ2pDLEdBQUcsQ0FBQyxPQUFPLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxXQUFXLENBQUMsQ0FBQztnQkFFbkMsSUFBSSxDQUFDLElBQUksQ0FBQyxXQUFXLEdBQUcsSUFBSSxDQUFDO2FBQzlCO1lBRUQsSUFBSSxJQUFJLENBQUMsSUFBSSxDQUFDLG9CQUFvQixJQUFJLElBQUksRUFBRTtnQkFDMUMsR0FBRyxDQUFDLE9BQU8sQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLG9CQUFvQixDQUFDLENBQUM7Z0JBRTVDLElBQUksQ0FBQyxJQUFJLENBQUMsb0JBQW9CLEdBQUcsSUFBSSxDQUFDO2FBQ3ZDO1lBRUQsSUFBSSxNQUFNLElBQUksTUFBTSxDQUFDLFdBQVcsQ0FBQyxFQUFFO2dCQUNqQyxNQUFNLElBQUksVUFBVSxDQUFDLDJDQUEyQyxDQUFDLENBQUM7YUFDbkU7WUFFRCxNQUFNLElBQUksR0FBRyxNQUFNLElBQUksSUFBSSxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLE1BQU0sQ0FBQyxNQUFNLENBQUMsQ0FBQztZQUVwRCxNQUFNLFFBQVEsR0FBRyxNQUFNLElBQUksSUFBSSxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLE1BQU0sQ0FBQyxVQUFVLENBQUMsQ0FBQztZQUU1RCxNQUFNLFlBQVksR0FDZCxNQUFNLElBQUksSUFBSSxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLE1BQU0sQ0FBQyxjQUFjLENBQUMsQ0FBQztZQUVuRCxPQUFPLEtBQUssQ0FBQyxJQUFJLENBQUMsTUFBTSxFQUFFLEVBQUMsSUFBSSxFQUFFLFFBQVEsRUFBRSxZQUFZLEVBQUMsQ0FBQyxDQUFDO1FBQzVELENBQUMsQ0FBQyxDQUFDO0lBQ0wsQ0FBQztJQUVELGtCQUFrQixDQUFDLFVBQWlCO1FBQ2xDLElBQUksUUFBUSxHQUFVLElBQUksQ0FBQyx3QkFBd0IsQ0FBQyxVQUFVLENBQUMsQ0FBQztRQUVoRSxJQUFJLENBQUMsSUFBSSxDQUFDLGVBQWUsRUFBRTtZQUN6QixRQUFRLEdBQUcsQ0FBQyxRQUFRLENBQUMsQ0FBQyxDQUFDLEVBQUUsR0FBRyxRQUFRLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUM7U0FDaEQ7UUFFRCxJQUFJLElBQUksQ0FBQyxXQUFXLEVBQUU7WUFDcEIsUUFBUTtnQkFDSixDQUFDLFFBQVEsRUFBRSxHQUFHLEtBQUssQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxVQUFVLENBQUMsQ0FBQyxDQUFDLEVBQUUsR0FBRyxRQUFRLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUM7U0FDMUU7UUFFRCxPQUFPLFFBQVEsQ0FBQztJQUNsQixDQUFDO0lBRUQsZUFBZSxDQUFDLE1BQWtCO1FBQ2hDLE9BQU8sR0FBRyxDQUFDLElBQUksQ0FBQyxHQUFHLEVBQUU7WUFDbkIsTUFBTSxFQUFDLFNBQVMsRUFBQyxHQUFHLElBQUksQ0FBQyxJQUFJLENBQUM7WUFFOUIsTUFBTSxVQUFVLEdBQUcsTUFBTSxDQUFDLEtBQUssQ0FBQztZQUVoQyxNQUFNLFdBQVcsR0FBRyxJQUFJLENBQUMsd0JBQXdCLENBQUMsVUFBVSxDQUFDLENBQUM7WUFFOUQsTUFBTSxVQUFVLEdBQUcsQ0FBQyxXQUFXLENBQUMsQ0FBQyxDQUFDLEVBQUUsR0FBRyxXQUFXLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUM7WUFFN0QsTUFBTSxZQUFZLEdBQUcsR0FBRyxDQUFDLEtBQUssQ0FBQyxVQUFVLENBQUMsQ0FBQztZQUUzQyxJQUFJLEtBQUssQ0FBQyxPQUFPLENBQUMsU0FBUyxDQUFDLEVBQUU7Z0JBQzVCLE9BQU8sS0FBSyxDQUFDLFNBQVMsQ0FBQyxNQUFNLENBQUMsQ0FBQyxJQUFJLENBQUMsWUFBWSxDQUFDLENBQUM7YUFDbkQ7WUFFRCxPQUFPLENBQUMsWUFBWSxDQUFDLENBQUM7UUFDeEIsQ0FBQyxDQUFDLENBQUM7SUFDTCxDQUFDO0lBRUQsV0FBVyxDQUFDLE1BQXdCLEVBQUUsUUFBUSxHQUFHLEtBQUs7UUFDcEQsR0FBRyxDQUFDLElBQUksQ0FBQyxHQUFHLEVBQUU7WUFDWixJQUFJLENBQUMsSUFBSSxDQUFDLFFBQVEsRUFBRTtnQkFDbEIsTUFBTSxJQUFJLGNBQWMsQ0FDcEIsaUVBQWlFLENBQUMsQ0FBQzthQUN4RTtZQUVELE1BQU0sVUFBVSxHQUFHLElBQUksQ0FBQyxTQUFTLENBQUMsQ0FBQyxDQUFDLENBQUMsS0FBSyxDQUFDO1lBRTNDLE1BQU0sV0FBVyxHQUFHLElBQUksQ0FBQyx3QkFBd0IsQ0FBQyxVQUFVLENBQUMsQ0FBQztZQUU5RCxNQUFNLFVBQVUsR0FBRyxDQUFDLFdBQVcsQ0FBQyxDQUFDLENBQUMsRUFBRSxHQUFHLFdBQVcsQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQztZQUU3RCxNQUFNLFNBQVMsR0FBRyxVQUFVLENBQUMsQ0FBQyxDQUFDLENBQUM7WUFFaEMsSUFBSSxTQUFTLElBQUksSUFBSSxFQUFFO2dCQUNyQixNQUFNLElBQUksVUFBVSxDQUNoQixrRUFBa0U7b0JBQ2xFLDBDQUEwQztvQkFDMUMsMkRBQTJEO29CQUMzRCwyREFBMkQ7b0JBQzNELDJEQUEyRDtvQkFDM0Qsb0RBQW9ELENBQUMsQ0FBQzthQUMzRDtZQUVELDRCQUE0QjtZQUM1QixJQUFJLElBQUksQ0FBQyxTQUFTLEVBQUUsSUFBSSxJQUFJLEVBQUU7Z0JBQzVCLElBQUksS0FBSyxDQUFDLE9BQU8sQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLFNBQVMsQ0FBQyxFQUFFO29CQUN0QyxJQUFJLENBQUMsT0FBTyxHQUFHLElBQUksQ0FBQyxJQUFJLENBQUMsU0FBUyxDQUFDLEdBQUcsQ0FBQyxHQUFHLEVBQUUsQ0FBQyxHQUFHLENBQUMsS0FBSyxDQUFDLFVBQVUsQ0FBQyxDQUFDLENBQUM7aUJBQ3JFO3FCQUFNO29CQUNMLElBQUksQ0FBQyxPQUFPLEdBQUcsQ0FBQyxHQUFHLENBQUMsS0FBSyxDQUFDLFVBQVUsQ0FBQyxDQUFDLENBQUM7aUJBQ3hDO2FBQ0Y7aUJBQU0sSUFBSSxNQUFNLElBQUksSUFBSSxFQUFFO2dCQUN6Qiw2QkFBNkI7Z0JBQzdCLEdBQUcsQ0FBQyxPQUFPLENBQUMsSUFBSSxDQUFDLE9BQU8sQ0FBQyxDQUFDO2dCQUUxQixvREFBb0Q7Z0JBQ3BELElBQUksSUFBSSxDQUFDLFVBQVUsSUFBSSxJQUFJLEVBQUU7b0JBQzNCLEdBQUcsQ0FBQyxPQUFPLENBQUMsSUFBSSxDQUFDLFVBQVUsQ0FBQyxDQUFDO29CQUM3QixJQUFJLENBQUMsVUFBVSxHQUFHLEVBQUUsQ0FBQztpQkFDdEI7Z0JBRUQsSUFBSSxLQUFLLENBQUMsT0FBTyxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsU0FBUyxDQUFDLEVBQUU7b0JBQ3RDLElBQUksQ0FBQyxPQUFPLEdBQUcsSUFBSSxDQUFDLElBQUksQ0FBQyxTQUFTLENBQUMsR0FBRyxDQUFDLEdBQUcsRUFBRSxDQUFDLEdBQUcsQ0FBQyxLQUFLLENBQUMsVUFBVSxDQUFDLENBQUMsQ0FBQztpQkFDckU7cUJBQU07b0JBQ0wsSUFBSSxDQUFDLE9BQU8sQ0FBQyxDQUFDLENBQUMsR0FBRyxHQUFHLENBQUMsS0FBSyxDQUFDLFVBQVUsQ0FBQyxDQUFDO2lCQUN6QzthQUNGO2lCQUFNO2dCQUNMLElBQUksQ0FBQyxLQUFLLENBQUMsT0FBTyxDQUFDLE1BQU0sQ0FBQyxFQUFFO29CQUMxQixNQUFNLEdBQUcsQ0FBQyxNQUFNLENBQUMsQ0FBQztpQkFDbkI7Z0JBRUQsSUFBSSxNQUFNLENBQUMsTUFBTSxLQUFLLElBQUksQ0FBQyxPQUFPLENBQUMsTUFBTSxFQUFFO29CQUN6QyxNQUFNLElBQUksVUFBVSxDQUNoQixTQUFTLElBQUksQ0FBQyxJQUFJLFlBQVksSUFBSSxDQUFDLE9BQU8sQ0FBQyxNQUFNLGFBQWE7d0JBQzlELG1CQUFtQixNQUFNLENBQUMsTUFBTSx5QkFBeUI7d0JBQ3pELGFBQWEsTUFBTSxFQUFFLENBQUMsQ0FBQztpQkFDNUI7Z0JBRUQsSUFBSSxRQUFRLEVBQUU7b0JBQ1osb0VBQW9FO29CQUNwRSxpRUFBaUU7b0JBQ2pFLG9FQUFvRTtvQkFDcEUsUUFBUTtvQkFDUixJQUFJLENBQUMsVUFBVSxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsT0FBTyxDQUFDLEtBQUssRUFBRSxDQUFDLENBQUM7aUJBQzVDO3FCQUFNO29CQUNMLEdBQUcsQ0FBQyxPQUFPLENBQUMsSUFBSSxDQUFDLE9BQU8sQ0FBQyxDQUFDO2lCQUMzQjtnQkFFRCxLQUFLLElBQUksS0FBSyxHQUFHLENBQUMsRUFBRSxLQUFLLEdBQUcsSUFBSSxDQUFDLE9BQU8sQ0FBQyxNQUFNLEVBQUUsRUFBRSxLQUFLLEVBQUU7b0JBQ3hELE1BQU0sS0FBSyxHQUFHLE1BQU0sQ0FBQyxLQUFLLENBQUMsQ0FBQztvQkFFNUIsTUFBTSxhQUFhLEdBQUcsVUFBVSxDQUFDO29CQUVqQyxJQUFJLENBQUMsSUFBSSxDQUFDLFdBQVcsQ0FBQyxLQUFLLENBQUMsS0FBSyxFQUFFLGFBQWEsQ0FBQyxFQUFFO3dCQUNqRCxNQUFNLElBQUksVUFBVSxDQUNoQixTQUFTLEtBQUssK0JBQStCLElBQUksQ0FBQyxJQUFJLElBQUk7NEJBQzFELGtCQUFrQixhQUFhLG9CQUMzQixLQUFLLENBQUMsS0FBSyxFQUFFLENBQUMsQ0FBQztxQkFDeEI7b0JBRUQsSUFBSSxDQUFDLE9BQU8sQ0FBQyxLQUFLLENBQUMsR0FBRyxLQUFLLENBQUM7aUJBQzdCO2FBQ0Y7WUFFRCxJQUFJLENBQUMsT0FBTyxHQUFHLElBQUksQ0FBQyxPQUFPLENBQUMsR0FBRyxDQUFDLEtBQUssQ0FBQyxFQUFFLENBQUMsR0FBRyxDQUFDLElBQUksQ0FBQyxLQUFLLENBQUMsS0FBSyxFQUFFLENBQUMsQ0FBQyxDQUFDO1FBQ3BFLENBQUMsQ0FBQyxDQUFDO0lBQ0wsQ0FBQztJQUVTLHdCQUF3QixDQUFDLFVBQWlCO1FBQ2xELE1BQU0sRUFBQyxVQUFVLEVBQUUsT0FBTyxFQUFFLFVBQVUsRUFBRSxPQUFPLEVBQUUsT0FBTyxFQUFFLFlBQVksRUFBQyxHQUNuRSxJQUFJLENBQUMsSUFBSSxDQUFDO1FBRWQsTUFBTSxlQUFlLEdBQUcsVUFBVSxLQUFLLGVBQWUsQ0FBQztRQUV2RCxNQUFNLENBQUMsR0FBRyxVQUFVLENBQUMsZUFBZSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDO1FBQzlDLE1BQU0sQ0FBQyxHQUFHLFVBQVUsQ0FBQyxlQUFlLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUM7UUFFOUMsTUFBTSxJQUFJLEdBQUcsZ0JBQWdCLENBQ3pCLENBQUMsRUFBRSxVQUFVLENBQUMsQ0FBQyxDQUFDLEVBQUUsT0FBTyxFQUFFLE9BQU8sQ0FBQyxDQUFDLENBQUMsRUFBRSxZQUFZLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQztRQUM1RCxNQUFNLElBQUksR0FBRyxnQkFBZ0IsQ0FDekIsQ0FBQyxFQUFFLFVBQVUsQ0FBQyxDQUFDLENBQUMsRUFBRSxPQUFPLEVBQUUsT0FBTyxDQUFDLENBQUMsQ0FBQyxFQUFFLFlBQVksQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDO1FBRTVELE1BQU0sUUFBUSxHQUFVO1lBQ3RCLEdBQUcsVUFBVSxDQUFDLEtBQUssQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDO1lBQ3pCLEdBQUcsQ0FBQyxlQUFlLENBQUMsQ0FBQyxDQUFDLENBQUMsT0FBTyxFQUFFLElBQUksRUFBRSxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLEVBQUUsSUFBSSxFQUFFLE9BQU8sQ0FBQyxDQUFDO1NBQ3JFLENBQUM7UUFFRixPQUFPLFFBQVEsQ0FBQztJQUNsQixDQUFDOztBQWxNRCxrQkFBa0I7QUFDWCxtQkFBUyxHQUFHLFdBQVcsQ0FBQztBQXVNakMsTUFBTSxPQUFPLGNBQWUsU0FBUSxRQUFRO0lBVzFDLFlBQVksSUFBd0I7UUFDbEMsTUFBTSxFQUNKLE9BQU8sRUFDUCxVQUFVLEVBQ1YsT0FBTyxFQUNQLE9BQU8sRUFDUCxVQUFVLEVBQ1YsWUFBWSxHQUNiLEdBQUcsSUFBSSxDQUFDO1FBRVQsS0FBSyxtQkFBSyxJQUFJLElBQUUsS0FBSyxFQUFFLE9BQU8sSUFBRSxDQUFDO1FBRWpDLElBQUksQ0FBQyxPQUFPLEdBQUcsT0FBTyxDQUFDO1FBQ3ZCLHFCQUFxQixDQUFDLElBQUksQ0FBQyxPQUFPLEVBQUUsU0FBUyxDQUFDLENBQUM7UUFFL0MsSUFBSSxDQUFDLFVBQVUsR0FBRyxjQUFjLENBQUMsVUFBVSxFQUFFLENBQUMsRUFBRSxZQUFZLENBQUMsQ0FBQztRQUM5RCxJQUFJLENBQUMsVUFBVSxDQUFDLE9BQU8sQ0FBQyxJQUFJLENBQUMsRUFBRSxDQUFDLHFCQUFxQixDQUFDLElBQUksRUFBRSxZQUFZLENBQUMsQ0FBQyxDQUFDO1FBRTNFLElBQUksQ0FBQyxPQUFPLEdBQUcsY0FBYyxDQUFDLE9BQU8sSUFBSSxDQUFDLEVBQUUsQ0FBQyxFQUFFLFNBQVMsQ0FBQyxDQUFDO1FBQzFELElBQUksQ0FBQyxPQUFPLENBQUMsT0FBTyxDQUFDLE1BQU0sQ0FBQyxFQUFFLENBQUMscUJBQXFCLENBQUMsTUFBTSxFQUFFLFNBQVMsQ0FBQyxDQUFDLENBQUM7UUFFekUsSUFBSSxDQUFDLE9BQU8sR0FBRyxPQUFPLElBQUksT0FBTyxDQUFDO1FBQ2xDLGdCQUFnQixDQUFDLElBQUksQ0FBQyxPQUFPLENBQUMsQ0FBQztRQUUvQixJQUFJLENBQUMsVUFBVSxHQUFHLFVBQVUsSUFBSSxjQUFjLENBQUM7UUFDL0MsZUFBZSxDQUFDLElBQUksQ0FBQyxVQUFVLENBQUMsQ0FBQztRQUVqQyxJQUFJLENBQUMsWUFBWSxHQUFHLGNBQWMsQ0FBQyxZQUFZLElBQUksQ0FBQyxFQUFFLENBQUMsRUFBRSxjQUFjLENBQUMsQ0FBQztRQUN6RSxJQUFJLENBQUMsWUFBWSxDQUFDLE9BQU8sQ0FDckIsSUFBSSxDQUFDLEVBQUUsQ0FBQyxxQkFBcUIsQ0FBQyxJQUFJLEVBQUUsY0FBYyxDQUFDLENBQUMsQ0FBQztJQUMzRCxDQUFDO0lBRU0sS0FBSyxDQUFDLFVBQXlCOztRQUNwQyxVQUFVLEdBQUcsa0JBQWtCLENBQUMsVUFBVSxDQUFDLENBQUM7UUFFNUMsTUFBTSxXQUFXLEdBQ2IsSUFBSSxDQUFDLFVBQVUsS0FBSyxlQUFlLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsVUFBVSxDQUFDLE1BQU0sR0FBRyxDQUFDLENBQUM7UUFFcEUsSUFBSSxVQUFVLENBQUMsV0FBVyxDQUFDLElBQUksSUFBSSxFQUFFO1lBQ25DLE1BQU0sSUFBSSxVQUFVLENBQ2hCLHdEQUF3RDtnQkFDeEQsU0FBUyxVQUFVLENBQUMsV0FBVyxDQUFDLEVBQUUsQ0FBQyxDQUFDO1NBQ3pDO1FBRUQsTUFBTSxRQUFRLEdBQUcsVUFBVSxDQUFDLFdBQVcsQ0FBQyxDQUFDO1FBRXpDLE1BQU0sWUFBWSxHQUFHLENBQUMsQ0FBQztRQUV2QixNQUFNLFdBQVcsR0FDYixJQUFJLENBQUMsVUFBVSxDQUFDLE1BQU0sQ0FBQyxDQUFDLFFBQVEsRUFBRSxJQUFJLENBQUMsT0FBTyxHQUFHLFlBQVksQ0FBQyxDQUFDLENBQUM7UUFFcEUsSUFBSSxDQUFDLE1BQU0sR0FBRyxJQUFJLENBQUMsU0FBUyxDQUN4QixRQUFRLEVBQUUsV0FBVyxFQUFFLElBQUksRUFBRSxJQUFJLENBQUMsaUJBQWlCLEVBQ25ELElBQUksQ0FBQyxpQkFBaUIsRUFBRSxJQUFJLEVBQUUsSUFBSSxDQUFDLGdCQUFnQixDQUFDLENBQUM7UUFFekQsTUFBTSxvQkFBb0IsR0FDdEIsSUFBSSxDQUFDLFVBQVUsQ0FBQyxNQUFNLENBQUMsQ0FBQyxJQUFJLENBQUMsT0FBTyxFQUFFLElBQUksQ0FBQyxPQUFPLEdBQUcsWUFBWSxDQUFDLENBQUMsQ0FBQztRQUV4RSxJQUFJLENBQUMsZUFBZSxHQUFHLElBQUksQ0FBQyxTQUFTLENBQ2pDLGtCQUFrQixFQUFFLG9CQUFvQixFQUFFLElBQUksRUFDOUMsSUFBSSxDQUFDLG9CQUFvQixFQUFFLElBQUksQ0FBQyxvQkFBb0IsRUFBRSxJQUFJLEVBQzFELElBQUksQ0FBQyxtQkFBbUIsQ0FBQyxDQUFDO1FBRTlCLElBQUksSUFBSSxDQUFDLE9BQU8sRUFBRTtZQUNoQixJQUFJLGVBQTRCLENBQUM7WUFFakMsSUFBSSxJQUFJLENBQUMsY0FBYyxFQUFFO2dCQUN2QixNQUFNLElBQUksR0FBRyxJQUFJLENBQUMsZUFBZSxDQUFDO2dCQUVsQyxNQUFNLE9BQU8sR0FBRyxJQUFJLENBQUMsT0FBTyxDQUFDO2dCQUU3QixlQUFlLEdBQUcsSUFBSSxNQUFDLE1BQU0sVUFBVyxTQUFRLFdBQVc7d0JBSXpELEtBQUssQ0FBQyxLQUFZLEVBQUUsS0FBZ0I7NEJBQ2xDLE1BQU0sS0FBSyxHQUFHLElBQUksQ0FBQyxLQUFLLENBQUMsQ0FBQyxPQUFPLENBQUMsQ0FBQyxDQUFDOzRCQUNwQyxNQUFNLEtBQUssR0FBRyxHQUFHLENBQUMsSUFBSSxDQUFDLENBQUMsT0FBTyxDQUFDLENBQUMsQ0FBQzs0QkFDbEMsTUFBTSxTQUFTLEdBQUcsSUFBSSxDQUFDLEtBQUssQ0FBQyxDQUFDLE9BQU8sR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDOzRCQUM1QyxPQUFPLENBQUMsQ0FBQyxXQUFXLENBQUMsQ0FBQyxLQUFLLEVBQUUsS0FBSyxFQUFFLFNBQVMsQ0FBQyxDQUFDLENBQUM7d0JBQ2xELENBQUM7cUJBQ0Y7b0JBVEMsa0JBQWtCO29CQUNYLFlBQVMsR0FBRyxZQUFhO3VCQVFoQyxFQUFFLENBQUM7YUFDTjtpQkFBTTtnQkFDTCxlQUFlLEdBQUcsSUFBSSxDQUFDLGVBQWUsQ0FBQzthQUN4QztZQUVELElBQUksQ0FBQyxJQUFJLEdBQUcsSUFBSSxDQUFDLFNBQVMsQ0FDdEIsTUFBTSxFQUFFLENBQUMsSUFBSSxDQUFDLE9BQU8sR0FBRyxZQUFZLENBQUMsRUFBRSxJQUFJLEVBQUUsZUFBZSxFQUM1RCxJQUFJLENBQUMsZUFBZSxFQUFFLElBQUksRUFBRSxJQUFJLENBQUMsY0FBYyxDQUFDLENBQUM7U0FDdEQ7UUFFRCxJQUFJLENBQUMsS0FBSyxHQUFHLElBQUksQ0FBQztJQUNwQixDQUFDO0lBRUQsSUFBSSxDQUFDLE1BQW9CLEVBQUUsTUFBYztRQUN2QyxPQUFPLEdBQUcsQ0FBQyxJQUFJLENBQUMsR0FBRyxFQUFFO1lBQ25CLElBQUksTUFBTSxDQUFDLE1BQU0sS0FBSyxDQUFDLEVBQUU7Z0JBQ3ZCLE1BQU0sSUFBSSxVQUFVLENBQ2hCLDZEQUE2RDtvQkFDN0QsR0FBRyxNQUFNLENBQUMsTUFBTSxHQUFHLENBQUMsQ0FBQzthQUMxQjtZQUVELE1BQU0sUUFBUSxHQUFHLE1BQU0sQ0FBQyxVQUFVLENBQUMsSUFBSSxLQUFLLENBQUM7WUFFN0MsTUFBTSxDQUFDLEdBQUcsTUFBTSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQVMsZ0JBQWdCO1lBQzdDLE1BQU0sUUFBUSxHQUFHLE1BQU0sQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFFLHlCQUF5QjtZQUN0RCxNQUFNLFFBQVEsR0FBRyxNQUFNLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBRSx3QkFBd0I7WUFFckQsTUFBTSxZQUFZLEdBQUcsQ0FBQyxDQUFDO1lBSXZCLElBQUksQ0FBQyxHQUFHLElBQUksQ0FBQyxPQUFPLElBQUksSUFBSSxDQUFDLE9BQU8sR0FBRyxDQUFDLElBQUksSUFBSSxDQUFDLFdBQVcsSUFBSSxJQUFJLEVBQUU7Z0JBQ3BFLElBQUksQ0FBQyxXQUFXLEdBQUcsbUJBQW1CLENBQUM7b0JBQ2xCLElBQUksRUFBRSxHQUFHLEVBQUUsQ0FBQyxHQUFHLENBQUMsUUFBUSxDQUFDLENBQUMsQ0FBQztvQkFDM0IsSUFBSSxFQUFFLElBQUksQ0FBQyxPQUFPO29CQUNsQixRQUFRO29CQUNSLEtBQUssRUFBRSxZQUFZO29CQUNuQixXQUFXLEVBQUUsSUFBSSxDQUFDLFdBQVc7aUJBQzlCLENBQWlCLENBQUM7YUFDdkM7WUFFRCxNQUFNLFdBQVcsR0FBRyxJQUFJLENBQUMsV0FBMkIsQ0FBQztZQUVyRCxNQUFNLFlBQVksR0FDZCxDQUFDLENBQWEsRUFBRSxJQUFrQixFQUFFLEtBQWEsRUFBRSxFQUFFO2dCQUNuRCxJQUFJLENBQUMsSUFBSSxJQUFJLENBQUMsSUFBSSxDQUFDLEtBQUssQ0FBQyxFQUFFO29CQUN6QixPQUFPLENBQUMsQ0FBQztpQkFDVjtnQkFFRCxPQUFPLEdBQUcsQ0FBQyxHQUFHLENBQUMsSUFBSSxDQUFDLEtBQUssQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDO1lBQ2pDLENBQUMsQ0FBQztZQUVOLElBQUksRUFBRSxHQUFHLFlBQVksQ0FBQyxDQUFDLEVBQUUsV0FBVyxFQUFFLENBQUMsQ0FBQyxDQUFDO1lBQ3pDLElBQUksRUFBRSxHQUFHLFlBQVksQ0FBQyxDQUFDLEVBQUUsV0FBVyxFQUFFLENBQUMsQ0FBQyxDQUFDO1lBQ3pDLElBQUksRUFBRSxHQUFHLFlBQVksQ0FBQyxDQUFDLEVBQUUsV0FBVyxFQUFFLENBQUMsQ0FBQyxDQUFDO1lBQ3pDLElBQUksRUFBRSxHQUFHLFlBQVksQ0FBQyxDQUFDLEVBQUUsV0FBVyxFQUFFLENBQUMsQ0FBQyxDQUFDO1lBRXpDLElBQUksQ0FBQyxHQUFHLElBQUksQ0FBQyxnQkFBZ0IsSUFBSSxJQUFJLENBQUMsZ0JBQWdCLEdBQUcsQ0FBQztnQkFDdEQsSUFBSSxDQUFDLG9CQUFvQixJQUFJLElBQUksRUFBRTtnQkFDckMsSUFBSSxDQUFDLG9CQUFvQixHQUFHLG1CQUFtQixDQUFDO29CQUNsQixJQUFJLEVBQUUsR0FBRyxFQUFFLENBQUMsR0FBRyxDQUFDLFFBQVEsQ0FBQyxRQUFRLENBQUM7b0JBQ2xDLElBQUksRUFBRSxJQUFJLENBQUMsZ0JBQWdCO29CQUMzQixRQUFRO29CQUNSLEtBQUssRUFBRSxZQUFZO29CQUNuQixXQUFXLEVBQUUsSUFBSSxDQUFDLFdBQVc7aUJBQzlCLENBQWlCLENBQUM7YUFDaEQ7WUFFRCxNQUFNLGNBQWMsR0FBRyxJQUFJLENBQUMsb0JBQW9DLENBQUM7WUFFakUsSUFBSSxFQUFFLEdBQUcsWUFBWSxDQUFDLFFBQVEsRUFBRSxjQUFjLEVBQUUsQ0FBQyxDQUFDLENBQUM7WUFDbkQsSUFBSSxFQUFFLEdBQUcsWUFBWSxDQUFDLFFBQVEsRUFBRSxjQUFjLEVBQUUsQ0FBQyxDQUFDLENBQUM7WUFDbkQsSUFBSSxFQUFFLEdBQUcsWUFBWSxDQUFDLFFBQVEsRUFBRSxjQUFjLEVBQUUsQ0FBQyxDQUFDLENBQUM7WUFDbkQsSUFBSSxFQUFFLEdBQUcsWUFBWSxDQUFDLFFBQVEsRUFBRSxjQUFjLEVBQUUsQ0FBQyxDQUFDLENBQUM7WUFFbkQsTUFBTSxpQkFBaUIsR0FBRyxDQUFDLENBQUM7WUFFNUIsTUFBTSxDQUFDLE9BQU8sRUFBRSxPQUFPLEVBQUUsT0FBTyxFQUFFLE9BQU8sQ0FBQyxHQUN0QyxHQUFHLENBQUMsS0FBSyxDQUFDLElBQUksQ0FBQyxNQUFNLENBQUMsSUFBSSxFQUFFLEVBQUUsWUFBWSxFQUFFLGlCQUFpQixDQUFDLENBQUM7WUFFbkUsTUFBTSxDQUFDLEtBQUssRUFBRSxLQUFLLEVBQUUsS0FBSyxFQUFFLEtBQUssQ0FBQyxHQUFpQixJQUFJLENBQUMsT0FBTyxDQUFDLENBQUM7Z0JBQzdELEdBQUcsQ0FBQyxLQUFLLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxJQUFJLEVBQUUsRUFBRSxZQUFZLENBQUMsQ0FBQyxDQUFDO2dCQUMzQyxDQUFDLElBQUksRUFBRSxJQUFJLEVBQUUsSUFBSSxFQUFFLElBQUksQ0FBQyxDQUFDO1lBRTdCLEVBQUUsR0FBRyxJQUFJLENBQUMsU0FBUyxDQUFDLEVBQUUsRUFBRSxPQUFPLEVBQUUsS0FBSyxFQUFFLElBQUksQ0FBQyxPQUFPLENBQUMsQ0FBQztZQUN0RCxFQUFFLEdBQUcsSUFBSSxDQUFDLFNBQVMsQ0FBQyxFQUFFLEVBQUUsT0FBTyxFQUFFLEtBQUssRUFBRSxJQUFJLENBQUMsT0FBTyxDQUFDLENBQUM7WUFDdEQsRUFBRSxHQUFHLElBQUksQ0FBQyxTQUFTLENBQUMsRUFBRSxFQUFFLE9BQU8sRUFBRSxLQUFLLEVBQUUsSUFBSSxDQUFDLE9BQU8sQ0FBQyxDQUFDO1lBQ3RELEVBQUUsR0FBRyxJQUFJLENBQUMsU0FBUyxDQUFDLEVBQUUsRUFBRSxPQUFPLEVBQUUsS0FBSyxFQUFFLElBQUksQ0FBQyxPQUFPLENBQUMsQ0FBQztZQUV0RCxNQUFNLENBQUMsVUFBVSxFQUFFLFVBQVUsRUFBRSxVQUFVLEVBQUUsVUFBVSxDQUFDLEdBQ2xELEdBQUcsQ0FBQyxLQUFLLENBQ0wsSUFBSSxDQUFDLGVBQWUsQ0FBQyxJQUFJLEVBQUUsRUFBRSxZQUFZLEVBQUUsaUJBQWlCLENBQUMsQ0FBQztZQUV0RSxFQUFFLEdBQUcsSUFBSSxDQUFDLGFBQWEsQ0FBQyxFQUFFLEVBQUUsVUFBVSxDQUFDLENBQUM7WUFDeEMsRUFBRSxHQUFHLElBQUksQ0FBQyxhQUFhLENBQUMsRUFBRSxFQUFFLFVBQVUsQ0FBQyxDQUFDO1lBQ3hDLEVBQUUsR0FBRyxJQUFJLENBQUMsYUFBYSxDQUFDLEVBQUUsRUFBRSxVQUFVLENBQUMsQ0FBQztZQUN4QyxFQUFFLEdBQUcsSUFBSSxDQUFDLGFBQWEsQ0FBQyxFQUFFLEVBQUUsVUFBVSxDQUFDLENBQUM7WUFFeEMsTUFBTSxDQUFDLEdBQUcsSUFBSSxDQUFDLG1CQUFtQixDQUFDLEtBQUssQ0FBQyxHQUFHLENBQUMsR0FBRyxDQUFDLEVBQUUsRUFBRSxFQUFFLENBQUMsQ0FBQyxDQUFDO1lBQzFELE1BQU0sQ0FBQyxHQUFHLElBQUksQ0FBQyxtQkFBbUIsQ0FBQyxLQUFLLENBQUMsR0FBRyxDQUFDLEdBQUcsQ0FBQyxFQUFFLEVBQUUsRUFBRSxDQUFDLENBQUMsQ0FBQztZQUMxRCxNQUFNLENBQUMsR0FBRyxHQUFHLENBQUMsR0FBRyxDQUNiLEdBQUcsQ0FBQyxHQUFHLENBQUMsQ0FBQyxFQUFFLFFBQVEsQ0FBQyxFQUNwQixHQUFHLENBQUMsR0FBRyxDQUFDLENBQUMsRUFBRSxJQUFJLENBQUMsVUFBVSxDQUFDLEtBQUssQ0FBQyxHQUFHLENBQUMsR0FBRyxDQUFDLEVBQUUsRUFBRSxFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQztZQUN4RCxNQUFNLENBQUMsR0FBRyxHQUFHLENBQUMsR0FBRyxDQUNiLElBQUksQ0FBQyxtQkFBbUIsQ0FBQyxLQUFLLENBQUMsR0FBRyxDQUFDLEdBQUcsQ0FBQyxFQUFFLEVBQUUsRUFBRSxDQUFDLENBQUMsRUFDL0MsSUFBSSxDQUFDLFVBQVUsQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQztZQUU5QixPQUFPLENBQUMsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQztRQUNuQixDQUFDLENBQUMsQ0FBQztJQUNMLENBQUM7SUFFRCxTQUFTO1FBQ1AsTUFBTSxzQkFBK0MsRUFBL0MsRUFBQyxPQUFPLEVBQUUsQ0FBQyxPQUFvQyxFQUFsQyxrQ0FBa0MsQ0FBQztRQUV0RCxNQUFNLE1BQU0sR0FBaUM7WUFDM0MsT0FBTyxFQUFFLElBQUksQ0FBQyxPQUFPO1lBQ3JCLFVBQVUsRUFBRSxJQUFJLENBQUMsVUFBVTtZQUMzQixPQUFPLEVBQUUsSUFBSSxDQUFDLE9BQU87WUFDckIsVUFBVSxFQUFFLElBQUksQ0FBQyxVQUFVO1lBQzNCLFlBQVksRUFBRSxJQUFJLENBQUMsWUFBWTtZQUMvQixPQUFPLEVBQUUsSUFBSSxDQUFDLE9BQU87U0FDdEIsQ0FBQztRQUVGLHlCQUFXLFVBQVUsRUFBSyxNQUFNLEVBQUU7SUFDcEMsQ0FBQztJQUVELFNBQVMsQ0FBQyxDQUFTLEVBQUUsQ0FBUyxFQUFFLENBQVUsRUFBRSxPQUFxQjtRQUMvRCxNQUFNLEdBQUcsR0FBRyxHQUFHLENBQUMsTUFBTSxDQUNsQixDQUFpQixFQUFFLENBQWlCLEVBQUUsSUFBSSxDQUFDLE9BQTJCLEVBQ3RFLENBQUMsT0FBTyxJQUFJLE9BQU8sQ0FBcUIsRUFDeEMsSUFBSSxDQUFDLFVBQVUsS0FBSyxlQUFlLENBQUMsQ0FBQyxDQUFDLE1BQU0sQ0FBQyxDQUFDLENBQUMsTUFBTSxFQUNyRCxJQUFJLENBQUMsWUFBZ0MsQ0FBQyxDQUFDO1FBRTNDLElBQUksQ0FBQyxFQUFFO1lBQ0wsT0FBTyxDQUFDLENBQUMsT0FBTyxDQUFDLEdBQUcsRUFBRSxDQUFDLEVBQUUsSUFBSSxDQUFDLFVBQVUsQ0FBaUIsQ0FBQztTQUMzRDtRQUVELE9BQU8sR0FBRyxDQUFDO0lBQ2IsQ0FBQztJQUVELGFBQWEsQ0FBQyxDQUFTLEVBQUUsQ0FBUztRQUNoQyxNQUFNLE9BQU8sR0FBRyxDQUFDLENBQUM7UUFFbEIsT0FBTyxHQUFHLENBQUMsTUFBTSxDQUNiLENBQWlCLEVBQUUsQ0FBaUIsRUFBRSxPQUFPLEVBQUUsTUFBTSxFQUNyRCxJQUFJLENBQUMsVUFBVSxLQUFLLGVBQWUsQ0FBQyxDQUFDLENBQUMsTUFBTSxDQUFDLENBQUMsQ0FBQyxNQUFNLENBQUMsQ0FBQztJQUM3RCxDQUFDOztBQTdPRCxrQkFBa0I7QUFDWCx3QkFBUyxHQUFHLGdCQUFnQixDQUFDO0FBK090QyxHQUFHLENBQUMsYUFBYSxDQUFDLGFBQWEsQ0FBQyxjQUFjLENBQUMsQ0FBQztBQUtoRCxNQUFNLE9BQU8sVUFBVyxTQUFRLFNBQVM7SUFJdkMsWUFBWSxJQUFvQjtRQUM5QixNQUFNLElBQUksR0FBRyxJQUFJLGNBQWMsQ0FBQyxJQUFJLENBQUMsQ0FBQztRQUV0QyxLQUFLLENBQUMsa0JBQUksSUFBSSxJQUFFLElBQUksR0FBdUIsQ0FBQyxDQUFDO0lBQy9DLENBQUM7SUFFRCxrQkFBa0I7SUFDbEIsTUFBTSxDQUFDLFVBQVUsQ0FDYixHQUFpRCxFQUNqRCxNQUFvQztRQUN0QyxPQUFPLElBQUksR0FBRyxDQUFDLE1BQU0sQ0FBQyxDQUFDO0lBQ3pCLENBQUM7O0FBZEQsa0JBQWtCO0FBQ1gsb0JBQVMsR0FBRyxZQUFZLENBQUM7QUFnQmxDLEdBQUcsQ0FBQyxhQUFhLENBQUMsYUFBYSxDQUFDLFVBQVUsQ0FBQyxDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiLyoqXG4gKiBAbGljZW5zZVxuICogQ29weXJpZ2h0IDIwMjAgR29vZ2xlIExMQ1xuICpcbiAqIFVzZSBvZiB0aGlzIHNvdXJjZSBjb2RlIGlzIGdvdmVybmVkIGJ5IGFuIE1JVC1zdHlsZVxuICogbGljZW5zZSB0aGF0IGNhbiBiZSBmb3VuZCBpbiB0aGUgTElDRU5TRSBmaWxlIG9yIGF0XG4gKiBodHRwczovL29wZW5zb3VyY2Uub3JnL2xpY2Vuc2VzL01JVC5cbiAqID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4gKi9cblxuaW1wb3J0ICogYXMgdGZjIGZyb20gJ0B0ZW5zb3JmbG93L3RmanMtY29yZSc7XG5pbXBvcnQge1RlbnNvciwgdXRpbH0gZnJvbSAnQHRlbnNvcmZsb3cvdGZqcy1jb3JlJztcblxuaW1wb3J0IHtBY3RpdmF0aW9ufSBmcm9tICcuLi9hY3RpdmF0aW9ucyc7XG5pbXBvcnQgKiBhcyBLIGZyb20gJy4uL2JhY2tlbmQvdGZqc19iYWNrZW5kJztcbmltcG9ydCB7Y2hlY2tEYXRhRm9ybWF0LCBjaGVja1BhZGRpbmdNb2RlfSBmcm9tICcuLi9jb21tb24nO1xuaW1wb3J0IHtDb25zdHJhaW50fSBmcm9tICcuLi9jb25zdHJhaW50cyc7XG5pbXBvcnQge0lucHV0U3BlY30gZnJvbSAnLi4vZW5naW5lL3RvcG9sb2d5JztcbmltcG9ydCB7QXR0cmlidXRlRXJyb3IsIE5vdEltcGxlbWVudGVkRXJyb3IsIFZhbHVlRXJyb3J9IGZyb20gJy4uL2Vycm9ycyc7XG5pbXBvcnQge0luaXRpYWxpemVyfSBmcm9tICcuLi9pbml0aWFsaXplcnMnO1xuaW1wb3J0IHtEYXRhRm9ybWF0LCBEYXRhVHlwZSwgUGFkZGluZ01vZGUsIFNoYXBlfSBmcm9tICcuLi9rZXJhc19mb3JtYXQvY29tbW9uJztcbmltcG9ydCB7UmVndWxhcml6ZXJ9IGZyb20gJy4uL3JlZ3VsYXJpemVycyc7XG5pbXBvcnQge0t3YXJnc30gZnJvbSAnLi4vdHlwZXMnO1xuaW1wb3J0IHtjb252T3V0cHV0TGVuZ3RoLCBub3JtYWxpemVBcnJheX0gZnJvbSAnLi4vdXRpbHMvY29udl91dGlscyc7XG5pbXBvcnQge2Fzc2VydFBvc2l0aXZlSW50ZWdlcn0gZnJvbSAnLi4vdXRpbHMvZ2VuZXJpY191dGlscyc7XG5pbXBvcnQge2dldEV4YWN0bHlPbmVTaGFwZX0gZnJvbSAnLi4vdXRpbHMvdHlwZXNfdXRpbHMnO1xuXG5pbXBvcnQge0Jhc2VSTk5MYXllckFyZ3MsIGdlbmVyYXRlRHJvcG91dE1hc2ssIExTVE1DZWxsLCBMU1RNQ2VsbExheWVyQXJncywgTFNUTUxheWVyQXJncywgUk5OLCBSTk5DZWxsLCBSTk5MYXllckFyZ3MsIFNpbXBsZVJOTkNlbGxMYXllckFyZ3N9IGZyb20gJy4vcmVjdXJyZW50JztcblxuZGVjbGFyZSBpbnRlcmZhY2UgQ29udlJOTjJEQ2VsbEFyZ3MgZXh0ZW5kc1xuICAgIE9taXQ8U2ltcGxlUk5OQ2VsbExheWVyQXJncywgJ3VuaXRzJz4ge1xuICAvKipcbiAgICogVGhlIGRpbWVuc2lvbmFsaXR5IG9mIHRoZSBvdXRwdXQgc3BhY2UgKGkuZS4gdGhlIG51bWJlciBvZiBmaWx0ZXJzIGluIHRoZVxuICAgKiBjb252b2x1dGlvbikuXG4gICAqL1xuICBmaWx0ZXJzOiBudW1iZXI7XG5cbiAgLyoqXG4gICAqIFRoZSBkaW1lbnNpb25zIG9mIHRoZSBjb252b2x1dGlvbiB3aW5kb3cuIElmIGtlcm5lbFNpemUgaXMgYSBudW1iZXIsIHRoZVxuICAgKiBjb252b2x1dGlvbmFsIHdpbmRvdyB3aWxsIGJlIHNxdWFyZS5cbiAgICovXG4gIGtlcm5lbFNpemU6IG51bWJlcnxudW1iZXJbXTtcblxuICAvKipcbiAgICogVGhlIHN0cmlkZXMgb2YgdGhlIGNvbnZvbHV0aW9uIGluIGVhY2ggZGltZW5zaW9uLiBJZiBzdHJpZGVzIGlzIGEgbnVtYmVyLFxuICAgKiBzdHJpZGVzIGluIGJvdGggZGltZW5zaW9ucyBhcmUgZXF1YWwuXG4gICAqXG4gICAqIFNwZWNpZnlpbmcgYW55IHN0cmlkZSB2YWx1ZSAhPSAxIGlzIGluY29tcGF0aWJsZSB3aXRoIHNwZWNpZnlpbmcgYW55XG4gICAqIGBkaWxhdGlvblJhdGVgIHZhbHVlICE9IDEuXG4gICAqL1xuICBzdHJpZGVzPzogbnVtYmVyfG51bWJlcltdO1xuXG4gIC8qKlxuICAgKiBQYWRkaW5nIG1vZGUuXG4gICAqL1xuICBwYWRkaW5nPzogUGFkZGluZ01vZGU7XG5cbiAgLyoqXG4gICAqIEZvcm1hdCBvZiB0aGUgZGF0YSwgd2hpY2ggZGV0ZXJtaW5lcyB0aGUgb3JkZXJpbmcgb2YgdGhlIGRpbWVuc2lvbnMgaW5cbiAgICogdGhlIGlucHV0cy5cbiAgICpcbiAgICogYGNoYW5uZWxzX2xhc3RgIGNvcnJlc3BvbmRzIHRvIGlucHV0cyB3aXRoIHNoYXBlXG4gICAqICAgYChiYXRjaCwgLi4uLCBjaGFubmVscylgXG4gICAqXG4gICAqICBgY2hhbm5lbHNfZmlyc3RgIGNvcnJlc3BvbmRzIHRvIGlucHV0cyB3aXRoIHNoYXBlIGAoYmF0Y2gsIGNoYW5uZWxzLFxuICAgKiAuLi4pYC5cbiAgICpcbiAgICogRGVmYXVsdHMgdG8gYGNoYW5uZWxzX2xhc3RgLlxuICAgKi9cbiAgZGF0YUZvcm1hdD86IERhdGFGb3JtYXQ7XG5cbiAgLyoqXG4gICAqIFRoZSBkaWxhdGlvbiByYXRlIHRvIHVzZSBmb3IgdGhlIGRpbGF0ZWQgY29udm9sdXRpb24gaW4gZWFjaCBkaW1lbnNpb24uXG4gICAqIFNob3VsZCBiZSBhbiBpbnRlZ2VyIG9yIGFycmF5IG9mIHR3byBvciB0aHJlZSBpbnRlZ2Vycy5cbiAgICpcbiAgICogQ3VycmVudGx5LCBzcGVjaWZ5aW5nIGFueSBgZGlsYXRpb25SYXRlYCB2YWx1ZSAhPSAxIGlzIGluY29tcGF0aWJsZSB3aXRoXG4gICAqIHNwZWNpZnlpbmcgYW55IGBzdHJpZGVzYCB2YWx1ZSAhPSAxLlxuICAgKi9cbiAgZGlsYXRpb25SYXRlPzogbnVtYmVyfFtudW1iZXJdfFtudW1iZXIsIG51bWJlcl07XG59XG5cbmFic3RyYWN0IGNsYXNzIENvbnZSTk4yRENlbGwgZXh0ZW5kcyBSTk5DZWxsIHtcbiAgcmVhZG9ubHkgZmlsdGVyczogbnVtYmVyO1xuICByZWFkb25seSBrZXJuZWxTaXplOiBudW1iZXJbXTtcbiAgcmVhZG9ubHkgc3RyaWRlczogbnVtYmVyW107XG4gIHJlYWRvbmx5IHBhZGRpbmc6IFBhZGRpbmdNb2RlO1xuICByZWFkb25seSBkYXRhRm9ybWF0OiBEYXRhRm9ybWF0O1xuICByZWFkb25seSBkaWxhdGlvblJhdGU6IG51bWJlcltdO1xuXG4gIHJlYWRvbmx5IGFjdGl2YXRpb246IEFjdGl2YXRpb247XG4gIHJlYWRvbmx5IHVzZUJpYXM6IGJvb2xlYW47XG5cbiAgcmVhZG9ubHkga2VybmVsSW5pdGlhbGl6ZXI6IEluaXRpYWxpemVyO1xuICByZWFkb25seSByZWN1cnJlbnRJbml0aWFsaXplcjogSW5pdGlhbGl6ZXI7XG4gIHJlYWRvbmx5IGJpYXNJbml0aWFsaXplcjogSW5pdGlhbGl6ZXI7XG5cbiAgcmVhZG9ubHkga2VybmVsQ29uc3RyYWludDogQ29uc3RyYWludDtcbiAgcmVhZG9ubHkgcmVjdXJyZW50Q29uc3RyYWludDogQ29uc3RyYWludDtcbiAgcmVhZG9ubHkgYmlhc0NvbnN0cmFpbnQ6IENvbnN0cmFpbnQ7XG5cbiAgcmVhZG9ubHkga2VybmVsUmVndWxhcml6ZXI6IFJlZ3VsYXJpemVyO1xuICByZWFkb25seSByZWN1cnJlbnRSZWd1bGFyaXplcjogUmVndWxhcml6ZXI7XG4gIHJlYWRvbmx5IGJpYXNSZWd1bGFyaXplcjogUmVndWxhcml6ZXI7XG5cbiAgcmVhZG9ubHkgZHJvcG91dDogbnVtYmVyO1xuICByZWFkb25seSByZWN1cnJlbnREcm9wb3V0OiBudW1iZXI7XG59XG5cbmRlY2xhcmUgaW50ZXJmYWNlIENvbnZSTk4yRExheWVyQXJncyBleHRlbmRzIEJhc2VSTk5MYXllckFyZ3MsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDb252Uk5OMkRDZWxsQXJncyB7fVxuXG4vKipcbiAqIEJhc2UgY2xhc3MgZm9yIGNvbnZvbHV0aW9uYWwtcmVjdXJyZW50IGxheWVycy5cbiAqL1xuY2xhc3MgQ29udlJOTjJEIGV4dGVuZHMgUk5OIHtcbiAgLyoqIEBub2NvbGxhcHNlICovXG4gIHN0YXRpYyBjbGFzc05hbWUgPSAnQ29udlJOTjJEJztcblxuICByZWFkb25seSBjZWxsOiBDb252Uk5OMkRDZWxsO1xuXG4gIGNvbnN0cnVjdG9yKGFyZ3M6IENvbnZSTk4yRExheWVyQXJncykge1xuICAgIGlmIChhcmdzLnVucm9sbCkge1xuICAgICAgdGhyb3cgbmV3IE5vdEltcGxlbWVudGVkRXJyb3IoXG4gICAgICAgICAgJ1Vucm9sbGluZyBpcyBub3QgcG9zc2libGUgd2l0aCBjb252b2x1dGlvbmFsIFJOTnMuJyk7XG4gICAgfVxuXG4gICAgaWYgKEFycmF5LmlzQXJyYXkoYXJncy5jZWxsKSkge1xuICAgICAgdGhyb3cgbmV3IE5vdEltcGxlbWVudGVkRXJyb3IoXG4gICAgICAgICAgJ0l0IGlzIG5vdCBwb3NzaWJsZSBhdCB0aGUgbW9tZW50IHRvIHN0YWNrIGNvbnZvbHV0aW9uYWwgY2VsbHMuJyk7XG4gICAgfVxuXG4gICAgc3VwZXIoYXJncyBhcyBSTk5MYXllckFyZ3MpO1xuXG4gICAgdGhpcy5pbnB1dFNwZWMgPSBbbmV3IElucHV0U3BlYyh7bmRpbTogNX0pXTtcbiAgfVxuXG4gIGNhbGwoaW5wdXRzOiBUZW5zb3J8VGVuc29yW10sIGt3YXJnczogS3dhcmdzKTogVGVuc29yfFRlbnNvcltdIHtcbiAgICByZXR1cm4gdGZjLnRpZHkoKCkgPT4ge1xuICAgICAgaWYgKHRoaXMuY2VsbC5kcm9wb3V0TWFzayAhPSBudWxsKSB7XG4gICAgICAgIHRmYy5kaXNwb3NlKHRoaXMuY2VsbC5kcm9wb3V0TWFzayk7XG5cbiAgICAgICAgdGhpcy5jZWxsLmRyb3BvdXRNYXNrID0gbnVsbDtcbiAgICAgIH1cblxuICAgICAgaWYgKHRoaXMuY2VsbC5yZWN1cnJlbnREcm9wb3V0TWFzayAhPSBudWxsKSB7XG4gICAgICAgIHRmYy5kaXNwb3NlKHRoaXMuY2VsbC5yZWN1cnJlbnREcm9wb3V0TWFzayk7XG5cbiAgICAgICAgdGhpcy5jZWxsLnJlY3VycmVudERyb3BvdXRNYXNrID0gbnVsbDtcbiAgICAgIH1cblxuICAgICAgaWYgKGt3YXJncyAmJiBrd2FyZ3NbJ2NvbnN0YW50cyddKSB7XG4gICAgICAgIHRocm93IG5ldyBWYWx1ZUVycm9yKCdDb252Uk5OMkQgY2VsbCBkb2VzIG5vdCBzdXBwb3J0IGNvbnN0YW50cycpO1xuICAgICAgfVxuXG4gICAgICBjb25zdCBtYXNrID0ga3dhcmdzID09IG51bGwgPyBudWxsIDoga3dhcmdzWydtYXNrJ107XG5cbiAgICAgIGNvbnN0IHRyYWluaW5nID0ga3dhcmdzID09IG51bGwgPyBudWxsIDoga3dhcmdzWyd0cmFpbmluZyddO1xuXG4gICAgICBjb25zdCBpbml0aWFsU3RhdGU6IFRlbnNvcltdID1cbiAgICAgICAgICBrd2FyZ3MgPT0gbnVsbCA/IG51bGwgOiBrd2FyZ3NbJ2luaXRpYWxTdGF0ZSddO1xuXG4gICAgICByZXR1cm4gc3VwZXIuY2FsbChpbnB1dHMsIHttYXNrLCB0cmFpbmluZywgaW5pdGlhbFN0YXRlfSk7XG4gICAgfSk7XG4gIH1cblxuICBjb21wdXRlT3V0cHV0U2hhcGUoaW5wdXRTaGFwZTogU2hhcGUpOiBTaGFwZXxTaGFwZVtdIHtcbiAgICBsZXQgb3V0U2hhcGU6IFNoYXBlID0gdGhpcy5jb21wdXRlU2luZ2xlT3V0cHV0U2hhcGUoaW5wdXRTaGFwZSk7XG5cbiAgICBpZiAoIXRoaXMucmV0dXJuU2VxdWVuY2VzKSB7XG4gICAgICBvdXRTaGFwZSA9IFtvdXRTaGFwZVswXSwgLi4ub3V0U2hhcGUuc2xpY2UoMildO1xuICAgIH1cblxuICAgIGlmICh0aGlzLnJldHVyblN0YXRlKSB7XG4gICAgICBvdXRTaGFwZSA9XG4gICAgICAgICAgW291dFNoYXBlLCAuLi5BcnJheSgyKS5maWxsKFtpbnB1dFNoYXBlWzBdLCAuLi5vdXRTaGFwZS5zbGljZSgtMyldKV07XG4gICAgfVxuXG4gICAgcmV0dXJuIG91dFNoYXBlO1xuICB9XG5cbiAgZ2V0SW5pdGlhbFN0YXRlKGlucHV0czogdGZjLlRlbnNvcik6IHRmYy5UZW5zb3JbXSB7XG4gICAgcmV0dXJuIHRmYy50aWR5KCgpID0+IHtcbiAgICAgIGNvbnN0IHtzdGF0ZVNpemV9ID0gdGhpcy5jZWxsO1xuXG4gICAgICBjb25zdCBpbnB1dFNoYXBlID0gaW5wdXRzLnNoYXBlO1xuXG4gICAgICBjb25zdCBvdXRwdXRTaGFwZSA9IHRoaXMuY29tcHV0ZVNpbmdsZU91dHB1dFNoYXBlKGlucHV0U2hhcGUpO1xuXG4gICAgICBjb25zdCBzdGF0ZVNoYXBlID0gW291dHB1dFNoYXBlWzBdLCAuLi5vdXRwdXRTaGFwZS5zbGljZSgyKV07XG5cbiAgICAgIGNvbnN0IGluaXRpYWxTdGF0ZSA9IHRmYy56ZXJvcyhzdGF0ZVNoYXBlKTtcblxuICAgICAgaWYgKEFycmF5LmlzQXJyYXkoc3RhdGVTaXplKSkge1xuICAgICAgICByZXR1cm4gQXJyYXkoc3RhdGVTaXplLmxlbmd0aCkuZmlsbChpbml0aWFsU3RhdGUpO1xuICAgICAgfVxuXG4gICAgICByZXR1cm4gW2luaXRpYWxTdGF0ZV07XG4gICAgfSk7XG4gIH1cblxuICByZXNldFN0YXRlcyhzdGF0ZXM/OiBUZW5zb3J8VGVuc29yW10sIHRyYWluaW5nID0gZmFsc2UpOiB2b2lkIHtcbiAgICB0ZmMudGlkeSgoKSA9PiB7XG4gICAgICBpZiAoIXRoaXMuc3RhdGVmdWwpIHtcbiAgICAgICAgdGhyb3cgbmV3IEF0dHJpYnV0ZUVycm9yKFxuICAgICAgICAgICAgJ0Nhbm5vdCBjYWxsIHJlc2V0U3RhdGVzKCkgb24gYW4gUk5OIExheWVyIHRoYXQgaXMgbm90IHN0YXRlZnVsLicpO1xuICAgICAgfVxuXG4gICAgICBjb25zdCBpbnB1dFNoYXBlID0gdGhpcy5pbnB1dFNwZWNbMF0uc2hhcGU7XG5cbiAgICAgIGNvbnN0IG91dHB1dFNoYXBlID0gdGhpcy5jb21wdXRlU2luZ2xlT3V0cHV0U2hhcGUoaW5wdXRTaGFwZSk7XG5cbiAgICAgIGNvbnN0IHN0YXRlU2hhcGUgPSBbb3V0cHV0U2hhcGVbMF0sIC4uLm91dHB1dFNoYXBlLnNsaWNlKDIpXTtcblxuICAgICAgY29uc3QgYmF0Y2hTaXplID0gaW5wdXRTaGFwZVswXTtcblxuICAgICAgaWYgKGJhdGNoU2l6ZSA9PSBudWxsKSB7XG4gICAgICAgIHRocm93IG5ldyBWYWx1ZUVycm9yKFxuICAgICAgICAgICAgJ0lmIGFuIFJOTiBpcyBzdGF0ZWZ1bCwgaXQgbmVlZHMgdG8ga25vdyBpdHMgYmF0Y2ggc2l6ZS4gU3BlY2lmeSAnICtcbiAgICAgICAgICAgICd0aGUgYmF0Y2ggc2l6ZSBvZiB5b3VyIGlucHV0IHRlbnNvcnM6IFxcbicgK1xuICAgICAgICAgICAgJy0gSWYgdXNpbmcgYSBTZXF1ZW50aWFsIG1vZGVsLCBzcGVjaWZ5IHRoZSBiYXRjaCBzaXplIGJ5ICcgK1xuICAgICAgICAgICAgJ3Bhc3NpbmcgYSBgYmF0Y2hJbnB1dFNoYXBlYCBvcHRpb24gdG8geW91ciBmaXJzdCBsYXllci5cXG4nICtcbiAgICAgICAgICAgICctIElmIHVzaW5nIHRoZSBmdW5jdGlvbmFsIEFQSSwgc3BlY2lmeSB0aGUgYmF0Y2ggc2l6ZSBieSAnICtcbiAgICAgICAgICAgICdwYXNzaW5nIGEgYGJhdGNoU2hhcGVgIG9wdGlvbiB0byB5b3VyIElucHV0IGxheWVyLicpO1xuICAgICAgfVxuXG4gICAgICAvLyBJbml0aWFsaXplIHN0YXRlIGlmIG51bGwuXG4gICAgICBpZiAodGhpcy5nZXRTdGF0ZXMoKSA9PSBudWxsKSB7XG4gICAgICAgIGlmIChBcnJheS5pc0FycmF5KHRoaXMuY2VsbC5zdGF0ZVNpemUpKSB7XG4gICAgICAgICAgdGhpcy5zdGF0ZXNfID0gdGhpcy5jZWxsLnN0YXRlU2l6ZS5tYXAoKCkgPT4gdGZjLnplcm9zKHN0YXRlU2hhcGUpKTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICB0aGlzLnN0YXRlc18gPSBbdGZjLnplcm9zKHN0YXRlU2hhcGUpXTtcbiAgICAgICAgfVxuICAgICAgfSBlbHNlIGlmIChzdGF0ZXMgPT0gbnVsbCkge1xuICAgICAgICAvLyBEaXNwb3NlIG9sZCBzdGF0ZSB0ZW5zb3JzLlxuICAgICAgICB0ZmMuZGlzcG9zZSh0aGlzLnN0YXRlc18pO1xuXG4gICAgICAgIC8vIEZvciBzdGF0ZWZ1bCBSTk5zLCBmdWxseSBkaXNwb3NlIGtlcHQgb2xkIHN0YXRlcy5cbiAgICAgICAgaWYgKHRoaXMua2VwdFN0YXRlcyAhPSBudWxsKSB7XG4gICAgICAgICAgdGZjLmRpc3Bvc2UodGhpcy5rZXB0U3RhdGVzKTtcbiAgICAgICAgICB0aGlzLmtlcHRTdGF0ZXMgPSBbXTtcbiAgICAgICAgfVxuXG4gICAgICAgIGlmIChBcnJheS5pc0FycmF5KHRoaXMuY2VsbC5zdGF0ZVNpemUpKSB7XG4gICAgICAgICAgdGhpcy5zdGF0ZXNfID0gdGhpcy5jZWxsLnN0YXRlU2l6ZS5tYXAoKCkgPT4gdGZjLnplcm9zKHN0YXRlU2hhcGUpKTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICB0aGlzLnN0YXRlc19bMF0gPSB0ZmMuemVyb3Moc3RhdGVTaGFwZSk7XG4gICAgICAgIH1cbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIGlmICghQXJyYXkuaXNBcnJheShzdGF0ZXMpKSB7XG4gICAgICAgICAgc3RhdGVzID0gW3N0YXRlc107XG4gICAgICAgIH1cblxuICAgICAgICBpZiAoc3RhdGVzLmxlbmd0aCAhPT0gdGhpcy5zdGF0ZXNfLmxlbmd0aCkge1xuICAgICAgICAgIHRocm93IG5ldyBWYWx1ZUVycm9yKFxuICAgICAgICAgICAgICBgTGF5ZXIgJHt0aGlzLm5hbWV9IGV4cGVjdHMgJHt0aGlzLnN0YXRlc18ubGVuZ3RofSBzdGF0ZShzKSwgYCArXG4gICAgICAgICAgICAgIGBidXQgaXQgcmVjZWl2ZWQgJHtzdGF0ZXMubGVuZ3RofSBzdGF0ZSB2YWx1ZShzKS4gSW5wdXQgYCArXG4gICAgICAgICAgICAgIGByZWNlaXZlZDogJHtzdGF0ZXN9YCk7XG4gICAgICAgIH1cblxuICAgICAgICBpZiAodHJhaW5pbmcpIHtcbiAgICAgICAgICAvLyBTdG9yZSBvbGQgc3RhdGUgdGVuc29ycyBmb3IgY29tcGxldGUgZGlzcG9zYWwgbGF0ZXIsIGkuZS4sIGR1cmluZ1xuICAgICAgICAgIC8vIHRoZSBuZXh0IG5vLWFyZyBjYWxsIHRvIHRoaXMgbWV0aG9kLiBXZSBkbyBub3QgZGlzcG9zZSB0aGUgb2xkXG4gICAgICAgICAgLy8gc3RhdGVzIGltbWVkaWF0ZWx5IGJlY2F1c2UgdGhhdCBCUFRUIChhbW9uZyBvdGhlciB0aGluZ3MpIHJlcXVpcmVcbiAgICAgICAgICAvLyB0aGVtLlxuICAgICAgICAgIHRoaXMua2VwdFN0YXRlcy5wdXNoKHRoaXMuc3RhdGVzXy5zbGljZSgpKTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICB0ZmMuZGlzcG9zZSh0aGlzLnN0YXRlc18pO1xuICAgICAgICB9XG5cbiAgICAgICAgZm9yIChsZXQgaW5kZXggPSAwOyBpbmRleCA8IHRoaXMuc3RhdGVzXy5sZW5ndGg7ICsraW5kZXgpIHtcbiAgICAgICAgICBjb25zdCB2YWx1ZSA9IHN0YXRlc1tpbmRleF07XG5cbiAgICAgICAgICBjb25zdCBleHBlY3RlZFNoYXBlID0gc3RhdGVTaGFwZTtcblxuICAgICAgICAgIGlmICghdXRpbC5hcnJheXNFcXVhbCh2YWx1ZS5zaGFwZSwgZXhwZWN0ZWRTaGFwZSkpIHtcbiAgICAgICAgICAgIHRocm93IG5ldyBWYWx1ZUVycm9yKFxuICAgICAgICAgICAgICAgIGBTdGF0ZSAke2luZGV4fSBpcyBpbmNvbXBhdGlibGUgd2l0aCBsYXllciAke3RoaXMubmFtZX06IGAgK1xuICAgICAgICAgICAgICAgIGBleHBlY3RlZCBzaGFwZT0ke2V4cGVjdGVkU2hhcGV9LCByZWNlaXZlZCBzaGFwZT0ke1xuICAgICAgICAgICAgICAgICAgICB2YWx1ZS5zaGFwZX1gKTtcbiAgICAgICAgICB9XG5cbiAgICAgICAgICB0aGlzLnN0YXRlc19baW5kZXhdID0gdmFsdWU7XG4gICAgICAgIH1cbiAgICAgIH1cblxuICAgICAgdGhpcy5zdGF0ZXNfID0gdGhpcy5zdGF0ZXNfLm1hcChzdGF0ZSA9PiB0ZmMua2VlcChzdGF0ZS5jbG9uZSgpKSk7XG4gICAgfSk7XG4gIH1cblxuICBwcm90ZWN0ZWQgY29tcHV0ZVNpbmdsZU91dHB1dFNoYXBlKGlucHV0U2hhcGU6IFNoYXBlKTogU2hhcGUge1xuICAgIGNvbnN0IHtkYXRhRm9ybWF0LCBmaWx0ZXJzLCBrZXJuZWxTaXplLCBwYWRkaW5nLCBzdHJpZGVzLCBkaWxhdGlvblJhdGV9ID1cbiAgICAgICAgdGhpcy5jZWxsO1xuXG4gICAgY29uc3QgaXNDaGFubmVsc0ZpcnN0ID0gZGF0YUZvcm1hdCA9PT0gJ2NoYW5uZWxzRmlyc3QnO1xuXG4gICAgY29uc3QgaCA9IGlucHV0U2hhcGVbaXNDaGFubmVsc0ZpcnN0ID8gMyA6IDJdO1xuICAgIGNvbnN0IHcgPSBpbnB1dFNoYXBlW2lzQ2hhbm5lbHNGaXJzdCA/IDQgOiAzXTtcblxuICAgIGNvbnN0IGhPdXQgPSBjb252T3V0cHV0TGVuZ3RoKFxuICAgICAgICBoLCBrZXJuZWxTaXplWzBdLCBwYWRkaW5nLCBzdHJpZGVzWzBdLCBkaWxhdGlvblJhdGVbMF0pO1xuICAgIGNvbnN0IHdPdXQgPSBjb252T3V0cHV0TGVuZ3RoKFxuICAgICAgICB3LCBrZXJuZWxTaXplWzFdLCBwYWRkaW5nLCBzdHJpZGVzWzFdLCBkaWxhdGlvblJhdGVbMV0pO1xuXG4gICAgY29uc3Qgb3V0U2hhcGU6IFNoYXBlID0gW1xuICAgICAgLi4uaW5wdXRTaGFwZS5zbGljZSgwLCAyKSxcbiAgICAgIC4uLihpc0NoYW5uZWxzRmlyc3QgPyBbZmlsdGVycywgaE91dCwgd091dF0gOiBbaE91dCwgd091dCwgZmlsdGVyc10pXG4gICAgXTtcblxuICAgIHJldHVybiBvdXRTaGFwZTtcbiAgfVxufVxuXG5leHBvcnQgZGVjbGFyZSBpbnRlcmZhY2UgQ29udkxTVE0yRENlbGxBcmdzIGV4dGVuZHNcbiAgICBPbWl0PExTVE1DZWxsTGF5ZXJBcmdzLCAndW5pdHMnPiwgQ29udlJOTjJEQ2VsbEFyZ3Mge31cblxuZXhwb3J0IGNsYXNzIENvbnZMU1RNMkRDZWxsIGV4dGVuZHMgTFNUTUNlbGwgaW1wbGVtZW50cyBDb252Uk5OMkRDZWxsIHtcbiAgLyoqIEBub2NvbGxhcHNlICovXG4gIHN0YXRpYyBjbGFzc05hbWUgPSAnQ29udkxTVE0yRENlbGwnO1xuXG4gIHJlYWRvbmx5IGZpbHRlcnM6IG51bWJlcjtcbiAgcmVhZG9ubHkga2VybmVsU2l6ZTogbnVtYmVyW107XG4gIHJlYWRvbmx5IHN0cmlkZXM6IG51bWJlcltdO1xuICByZWFkb25seSBwYWRkaW5nOiBQYWRkaW5nTW9kZTtcbiAgcmVhZG9ubHkgZGF0YUZvcm1hdDogRGF0YUZvcm1hdDtcbiAgcmVhZG9ubHkgZGlsYXRpb25SYXRlOiBudW1iZXJbXTtcblxuICBjb25zdHJ1Y3RvcihhcmdzOiBDb252TFNUTTJEQ2VsbEFyZ3MpIHtcbiAgICBjb25zdCB7XG4gICAgICBmaWx0ZXJzLFxuICAgICAga2VybmVsU2l6ZSxcbiAgICAgIHN0cmlkZXMsXG4gICAgICBwYWRkaW5nLFxuICAgICAgZGF0YUZvcm1hdCxcbiAgICAgIGRpbGF0aW9uUmF0ZSxcbiAgICB9ID0gYXJncztcblxuICAgIHN1cGVyKHsuLi5hcmdzLCB1bml0czogZmlsdGVyc30pO1xuXG4gICAgdGhpcy5maWx0ZXJzID0gZmlsdGVycztcbiAgICBhc3NlcnRQb3NpdGl2ZUludGVnZXIodGhpcy5maWx0ZXJzLCAnZmlsdGVycycpO1xuXG4gICAgdGhpcy5rZXJuZWxTaXplID0gbm9ybWFsaXplQXJyYXkoa2VybmVsU2l6ZSwgMiwgJ2tlcm5lbFNpemUnKTtcbiAgICB0aGlzLmtlcm5lbFNpemUuZm9yRWFjaChzaXplID0+IGFzc2VydFBvc2l0aXZlSW50ZWdlcihzaXplLCAna2VybmVsU2l6ZScpKTtcblxuICAgIHRoaXMuc3RyaWRlcyA9IG5vcm1hbGl6ZUFycmF5KHN0cmlkZXMgfHwgMSwgMiwgJ3N0cmlkZXMnKTtcbiAgICB0aGlzLnN0cmlkZXMuZm9yRWFjaChzdHJpZGUgPT4gYXNzZXJ0UG9zaXRpdmVJbnRlZ2VyKHN0cmlkZSwgJ3N0cmlkZXMnKSk7XG5cbiAgICB0aGlzLnBhZGRpbmcgPSBwYWRkaW5nIHx8ICd2YWxpZCc7XG4gICAgY2hlY2tQYWRkaW5nTW9kZSh0aGlzLnBhZGRpbmcpO1xuXG4gICAgdGhpcy5kYXRhRm9ybWF0ID0gZGF0YUZvcm1hdCB8fCAnY2hhbm5lbHNMYXN0JztcbiAgICBjaGVja0RhdGFGb3JtYXQodGhpcy5kYXRhRm9ybWF0KTtcblxuICAgIHRoaXMuZGlsYXRpb25SYXRlID0gbm9ybWFsaXplQXJyYXkoZGlsYXRpb25SYXRlIHx8IDEsIDIsICdkaWxhdGlvblJhdGUnKTtcbiAgICB0aGlzLmRpbGF0aW9uUmF0ZS5mb3JFYWNoKFxuICAgICAgICByYXRlID0+IGFzc2VydFBvc2l0aXZlSW50ZWdlcihyYXRlLCAnZGlsYXRpb25SYXRlJykpO1xuICB9XG5cbiAgcHVibGljIGJ1aWxkKGlucHV0U2hhcGU6IFNoYXBlfFNoYXBlW10pOiB2b2lkIHtcbiAgICBpbnB1dFNoYXBlID0gZ2V0RXhhY3RseU9uZVNoYXBlKGlucHV0U2hhcGUpO1xuXG4gICAgY29uc3QgY2hhbm5lbEF4aXMgPVxuICAgICAgICB0aGlzLmRhdGFGb3JtYXQgPT09ICdjaGFubmVsc0ZpcnN0JyA/IDEgOiBpbnB1dFNoYXBlLmxlbmd0aCAtIDE7XG5cbiAgICBpZiAoaW5wdXRTaGFwZVtjaGFubmVsQXhpc10gPT0gbnVsbCkge1xuICAgICAgdGhyb3cgbmV3IFZhbHVlRXJyb3IoXG4gICAgICAgICAgYFRoZSBjaGFubmVsIGRpbWVuc2lvbiBvZiB0aGUgaW5wdXQgc2hvdWxkIGJlIGRlZmluZWQuIGAgK1xuICAgICAgICAgIGBGb3VuZCAke2lucHV0U2hhcGVbY2hhbm5lbEF4aXNdfWApO1xuICAgIH1cblxuICAgIGNvbnN0IGlucHV0RGltID0gaW5wdXRTaGFwZVtjaGFubmVsQXhpc107XG5cbiAgICBjb25zdCBudW1PZktlcm5lbHMgPSA0O1xuXG4gICAgY29uc3Qga2VybmVsU2hhcGUgPVxuICAgICAgICB0aGlzLmtlcm5lbFNpemUuY29uY2F0KFtpbnB1dERpbSwgdGhpcy5maWx0ZXJzICogbnVtT2ZLZXJuZWxzXSk7XG5cbiAgICB0aGlzLmtlcm5lbCA9IHRoaXMuYWRkV2VpZ2h0KFxuICAgICAgICAna2VybmVsJywga2VybmVsU2hhcGUsIG51bGwsIHRoaXMua2VybmVsSW5pdGlhbGl6ZXIsXG4gICAgICAgIHRoaXMua2VybmVsUmVndWxhcml6ZXIsIHRydWUsIHRoaXMua2VybmVsQ29uc3RyYWludCk7XG5cbiAgICBjb25zdCByZWN1cnJlbnRLZXJuZWxTaGFwZSA9XG4gICAgICAgIHRoaXMua2VybmVsU2l6ZS5jb25jYXQoW3RoaXMuZmlsdGVycywgdGhpcy5maWx0ZXJzICogbnVtT2ZLZXJuZWxzXSk7XG5cbiAgICB0aGlzLnJlY3VycmVudEtlcm5lbCA9IHRoaXMuYWRkV2VpZ2h0KFxuICAgICAgICAncmVjdXJyZW50X2tlcm5lbCcsIHJlY3VycmVudEtlcm5lbFNoYXBlLCBudWxsLFxuICAgICAgICB0aGlzLnJlY3VycmVudEluaXRpYWxpemVyLCB0aGlzLnJlY3VycmVudFJlZ3VsYXJpemVyLCB0cnVlLFxuICAgICAgICB0aGlzLnJlY3VycmVudENvbnN0cmFpbnQpO1xuXG4gICAgaWYgKHRoaXMudXNlQmlhcykge1xuICAgICAgbGV0IGJpYXNJbml0aWFsaXplcjogSW5pdGlhbGl6ZXI7XG5cbiAgICAgIGlmICh0aGlzLnVuaXRGb3JnZXRCaWFzKSB7XG4gICAgICAgIGNvbnN0IGluaXQgPSB0aGlzLmJpYXNJbml0aWFsaXplcjtcblxuICAgICAgICBjb25zdCBmaWx0ZXJzID0gdGhpcy5maWx0ZXJzO1xuXG4gICAgICAgIGJpYXNJbml0aWFsaXplciA9IG5ldyAoY2xhc3MgQ3VzdG9tSW5pdCBleHRlbmRzIEluaXRpYWxpemVyIHtcbiAgICAgICAgICAvKiogQG5vY29sbGFwc2UgKi9cbiAgICAgICAgICBzdGF0aWMgY2xhc3NOYW1lID0gJ0N1c3RvbUluaXQnO1xuXG4gICAgICAgICAgYXBwbHkoc2hhcGU6IFNoYXBlLCBkdHlwZT86IERhdGFUeXBlKTogdGZjLlRlbnNvciB7XG4gICAgICAgICAgICBjb25zdCBiaWFzSSA9IGluaXQuYXBwbHkoW2ZpbHRlcnNdKTtcbiAgICAgICAgICAgIGNvbnN0IGJpYXNGID0gdGZjLm9uZXMoW2ZpbHRlcnNdKTtcbiAgICAgICAgICAgIGNvbnN0IGJpYXNDQW5kTyA9IGluaXQuYXBwbHkoW2ZpbHRlcnMgKiAyXSk7XG4gICAgICAgICAgICByZXR1cm4gSy5jb25jYXRlbmF0ZShbYmlhc0ksIGJpYXNGLCBiaWFzQ0FuZE9dKTtcbiAgICAgICAgICB9XG4gICAgICAgIH0pKCk7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBiaWFzSW5pdGlhbGl6ZXIgPSB0aGlzLmJpYXNJbml0aWFsaXplcjtcbiAgICAgIH1cblxuICAgICAgdGhpcy5iaWFzID0gdGhpcy5hZGRXZWlnaHQoXG4gICAgICAgICAgJ2JpYXMnLCBbdGhpcy5maWx0ZXJzICogbnVtT2ZLZXJuZWxzXSwgbnVsbCwgYmlhc0luaXRpYWxpemVyLFxuICAgICAgICAgIHRoaXMuYmlhc1JlZ3VsYXJpemVyLCB0cnVlLCB0aGlzLmJpYXNDb25zdHJhaW50KTtcbiAgICB9XG5cbiAgICB0aGlzLmJ1aWx0ID0gdHJ1ZTtcbiAgfVxuXG4gIGNhbGwoaW5wdXRzOiB0ZmMuVGVuc29yW10sIGt3YXJnczogS3dhcmdzKTogdGZjLlRlbnNvcltdIHtcbiAgICByZXR1cm4gdGZjLnRpZHkoKCkgPT4ge1xuICAgICAgaWYgKGlucHV0cy5sZW5ndGggIT09IDMpIHtcbiAgICAgICAgdGhyb3cgbmV3IFZhbHVlRXJyb3IoXG4gICAgICAgICAgICBgQ29udkxTVE0yRENlbGwgZXhwZWN0cyAzIGlucHV0IFRlbnNvcnMgKGlucHV0cywgaCwgYyksIGdvdCBgICtcbiAgICAgICAgICAgIGAke2lucHV0cy5sZW5ndGh9LmApO1xuICAgICAgfVxuXG4gICAgICBjb25zdCB0cmFpbmluZyA9IGt3YXJnc1sndHJhaW5pbmcnXSB8fCBmYWxzZTtcblxuICAgICAgY29uc3QgeCA9IGlucHV0c1swXTsgICAgICAgICAvLyBDdXJyZW50IGlucHV0XG4gICAgICBjb25zdCBoVE1pbnVzMSA9IGlucHV0c1sxXTsgIC8vIFByZXZpb3VzIG1lbW9yeSBzdGF0ZS5cbiAgICAgIGNvbnN0IGNUTWludXMxID0gaW5wdXRzWzJdOyAgLy8gUHJldmlvdXMgY2Fycnkgc3RhdGUuXG5cbiAgICAgIGNvbnN0IG51bU9mS2VybmVscyA9IDQ7XG5cbiAgICAgIHR5cGUgRHJvcG91dE1hc2tzID0gW3RmYy5UZW5zb3IsIHRmYy5UZW5zb3IsIHRmYy5UZW5zb3IsIHRmYy5UZW5zb3JdO1xuXG4gICAgICBpZiAoMCA8IHRoaXMuZHJvcG91dCAmJiB0aGlzLmRyb3BvdXQgPCAxICYmIHRoaXMuZHJvcG91dE1hc2sgPT0gbnVsbCkge1xuICAgICAgICB0aGlzLmRyb3BvdXRNYXNrID0gZ2VuZXJhdGVEcm9wb3V0TWFzayh7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9uZXM6ICgpID0+IHRmYy5vbmVzTGlrZSh4KSxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmF0ZTogdGhpcy5kcm9wb3V0LFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0cmFpbmluZyxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY291bnQ6IG51bU9mS2VybmVscyxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZHJvcG91dEZ1bmM6IHRoaXMuZHJvcG91dEZ1bmNcbiAgICAgICAgICAgICAgICAgICAgICAgICAgIH0pIGFzIHRmYy5UZW5zb3JbXTtcbiAgICAgIH1cblxuICAgICAgY29uc3QgZHJvcG91dE1hc2sgPSB0aGlzLmRyb3BvdXRNYXNrIGFzIERyb3BvdXRNYXNrcztcblxuICAgICAgY29uc3QgYXBwbHlEcm9wb3V0ID1cbiAgICAgICAgICAoeDogdGZjLlRlbnNvciwgbWFzazogdGZjLlRlbnNvcltdLCBpbmRleDogbnVtYmVyKSA9PiB7XG4gICAgICAgICAgICBpZiAoIW1hc2sgfHwgIW1hc2tbaW5kZXhdKSB7XG4gICAgICAgICAgICAgIHJldHVybiB4O1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICByZXR1cm4gdGZjLm11bChtYXNrW2luZGV4XSwgeCk7XG4gICAgICAgICAgfTtcblxuICAgICAgbGV0IHhJID0gYXBwbHlEcm9wb3V0KHgsIGRyb3BvdXRNYXNrLCAwKTtcbiAgICAgIGxldCB4RiA9IGFwcGx5RHJvcG91dCh4LCBkcm9wb3V0TWFzaywgMSk7XG4gICAgICBsZXQgeEMgPSBhcHBseURyb3BvdXQoeCwgZHJvcG91dE1hc2ssIDIpO1xuICAgICAgbGV0IHhPID0gYXBwbHlEcm9wb3V0KHgsIGRyb3BvdXRNYXNrLCAzKTtcblxuICAgICAgaWYgKDAgPCB0aGlzLnJlY3VycmVudERyb3BvdXQgJiYgdGhpcy5yZWN1cnJlbnREcm9wb3V0IDwgMSAmJlxuICAgICAgICAgIHRoaXMucmVjdXJyZW50RHJvcG91dE1hc2sgPT0gbnVsbCkge1xuICAgICAgICB0aGlzLnJlY3VycmVudERyb3BvdXRNYXNrID0gZ2VuZXJhdGVEcm9wb3V0TWFzayh7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9uZXM6ICgpID0+IHRmYy5vbmVzTGlrZShoVE1pbnVzMSksXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJhdGU6IHRoaXMucmVjdXJyZW50RHJvcG91dCxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdHJhaW5pbmcsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvdW50OiBudW1PZktlcm5lbHMsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRyb3BvdXRGdW5jOiB0aGlzLmRyb3BvdXRGdW5jXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9KSBhcyB0ZmMuVGVuc29yW107XG4gICAgICB9XG5cbiAgICAgIGNvbnN0IHJlY0Ryb3BvdXRNYXNrID0gdGhpcy5yZWN1cnJlbnREcm9wb3V0TWFzayBhcyBEcm9wb3V0TWFza3M7XG5cbiAgICAgIGxldCBoSSA9IGFwcGx5RHJvcG91dChoVE1pbnVzMSwgcmVjRHJvcG91dE1hc2ssIDApO1xuICAgICAgbGV0IGhGID0gYXBwbHlEcm9wb3V0KGhUTWludXMxLCByZWNEcm9wb3V0TWFzaywgMSk7XG4gICAgICBsZXQgaEMgPSBhcHBseURyb3BvdXQoaFRNaW51czEsIHJlY0Ryb3BvdXRNYXNrLCAyKTtcbiAgICAgIGxldCBoTyA9IGFwcGx5RHJvcG91dChoVE1pbnVzMSwgcmVjRHJvcG91dE1hc2ssIDMpO1xuXG4gICAgICBjb25zdCBrZXJuZWxDaGFubmVsQXhpcyA9IDM7XG5cbiAgICAgIGNvbnN0IFtrZXJuZWxJLCBrZXJuZWxGLCBrZXJuZWxDLCBrZXJuZWxPXTogdGZjLlRlbnNvcltdID1cbiAgICAgICAgICB0ZmMuc3BsaXQodGhpcy5rZXJuZWwucmVhZCgpLCBudW1PZktlcm5lbHMsIGtlcm5lbENoYW5uZWxBeGlzKTtcblxuICAgICAgY29uc3QgW2JpYXNJLCBiaWFzRiwgYmlhc0MsIGJpYXNPXTogdGZjLlRlbnNvcltdID0gdGhpcy51c2VCaWFzID9cbiAgICAgICAgICB0ZmMuc3BsaXQodGhpcy5iaWFzLnJlYWQoKSwgbnVtT2ZLZXJuZWxzKSA6XG4gICAgICAgICAgW251bGwsIG51bGwsIG51bGwsIG51bGxdO1xuXG4gICAgICB4SSA9IHRoaXMuaW5wdXRDb252KHhJLCBrZXJuZWxJLCBiaWFzSSwgdGhpcy5wYWRkaW5nKTtcbiAgICAgIHhGID0gdGhpcy5pbnB1dENvbnYoeEYsIGtlcm5lbEYsIGJpYXNGLCB0aGlzLnBhZGRpbmcpO1xuICAgICAgeEMgPSB0aGlzLmlucHV0Q29udih4Qywga2VybmVsQywgYmlhc0MsIHRoaXMucGFkZGluZyk7XG4gICAgICB4TyA9IHRoaXMuaW5wdXRDb252KHhPLCBrZXJuZWxPLCBiaWFzTywgdGhpcy5wYWRkaW5nKTtcblxuICAgICAgY29uc3QgW3JlY0tlcm5lbEksIHJlY0tlcm5lbEYsIHJlY0tlcm5lbEMsIHJlY0tlcm5lbE9dOiB0ZmMuVGVuc29yW10gPVxuICAgICAgICAgIHRmYy5zcGxpdChcbiAgICAgICAgICAgICAgdGhpcy5yZWN1cnJlbnRLZXJuZWwucmVhZCgpLCBudW1PZktlcm5lbHMsIGtlcm5lbENoYW5uZWxBeGlzKTtcblxuICAgICAgaEkgPSB0aGlzLnJlY3VycmVudENvbnYoaEksIHJlY0tlcm5lbEkpO1xuICAgICAgaEYgPSB0aGlzLnJlY3VycmVudENvbnYoaEYsIHJlY0tlcm5lbEYpO1xuICAgICAgaEMgPSB0aGlzLnJlY3VycmVudENvbnYoaEMsIHJlY0tlcm5lbEMpO1xuICAgICAgaE8gPSB0aGlzLnJlY3VycmVudENvbnYoaE8sIHJlY0tlcm5lbE8pO1xuXG4gICAgICBjb25zdCBpID0gdGhpcy5yZWN1cnJlbnRBY3RpdmF0aW9uLmFwcGx5KHRmYy5hZGQoeEksIGhJKSk7XG4gICAgICBjb25zdCBmID0gdGhpcy5yZWN1cnJlbnRBY3RpdmF0aW9uLmFwcGx5KHRmYy5hZGQoeEYsIGhGKSk7XG4gICAgICBjb25zdCBjID0gdGZjLmFkZChcbiAgICAgICAgICB0ZmMubXVsKGYsIGNUTWludXMxKSxcbiAgICAgICAgICB0ZmMubXVsKGksIHRoaXMuYWN0aXZhdGlvbi5hcHBseSh0ZmMuYWRkKHhDLCBoQykpKSk7XG4gICAgICBjb25zdCBoID0gdGZjLm11bChcbiAgICAgICAgICB0aGlzLnJlY3VycmVudEFjdGl2YXRpb24uYXBwbHkodGZjLmFkZCh4TywgaE8pKSxcbiAgICAgICAgICB0aGlzLmFjdGl2YXRpb24uYXBwbHkoYykpO1xuXG4gICAgICByZXR1cm4gW2gsIGgsIGNdO1xuICAgIH0pO1xuICB9XG5cbiAgZ2V0Q29uZmlnKCk6IHRmYy5zZXJpYWxpemF0aW9uLkNvbmZpZ0RpY3Qge1xuICAgIGNvbnN0IHsndW5pdHMnOiBfLCAuLi5iYXNlQ29uZmlnfSA9IHN1cGVyLmdldENvbmZpZygpO1xuXG4gICAgY29uc3QgY29uZmlnOiB0ZmMuc2VyaWFsaXphdGlvbi5Db25maWdEaWN0ID0ge1xuICAgICAgZmlsdGVyczogdGhpcy5maWx0ZXJzLFxuICAgICAga2VybmVsU2l6ZTogdGhpcy5rZXJuZWxTaXplLFxuICAgICAgcGFkZGluZzogdGhpcy5wYWRkaW5nLFxuICAgICAgZGF0YUZvcm1hdDogdGhpcy5kYXRhRm9ybWF0LFxuICAgICAgZGlsYXRpb25SYXRlOiB0aGlzLmRpbGF0aW9uUmF0ZSxcbiAgICAgIHN0cmlkZXM6IHRoaXMuc3RyaWRlcyxcbiAgICB9O1xuXG4gICAgcmV0dXJuIHsuLi5iYXNlQ29uZmlnLCAuLi5jb25maWd9O1xuICB9XG5cbiAgaW5wdXRDb252KHg6IFRlbnNvciwgdzogVGVuc29yLCBiPzogVGVuc29yLCBwYWRkaW5nPzogUGFkZGluZ01vZGUpIHtcbiAgICBjb25zdCBvdXQgPSB0ZmMuY29udjJkKFxuICAgICAgICB4IGFzIHRmYy5UZW5zb3IzRCwgdyBhcyB0ZmMuVGVuc29yNEQsIHRoaXMuc3RyaWRlcyBhcyBbbnVtYmVyLCBudW1iZXJdLFxuICAgICAgICAocGFkZGluZyB8fCAndmFsaWQnKSBhcyAnc2FtZScgfCAndmFsaWQnLFxuICAgICAgICB0aGlzLmRhdGFGb3JtYXQgPT09ICdjaGFubmVsc0ZpcnN0JyA/ICdOQ0hXJyA6ICdOSFdDJyxcbiAgICAgICAgdGhpcy5kaWxhdGlvblJhdGUgYXMgW251bWJlciwgbnVtYmVyXSk7XG5cbiAgICBpZiAoYikge1xuICAgICAgcmV0dXJuIEsuYmlhc0FkZChvdXQsIGIsIHRoaXMuZGF0YUZvcm1hdCkgYXMgdGZjLlRlbnNvcjNEO1xuICAgIH1cblxuICAgIHJldHVybiBvdXQ7XG4gIH1cblxuICByZWN1cnJlbnRDb252KHg6IFRlbnNvciwgdzogVGVuc29yKSB7XG4gICAgY29uc3Qgc3RyaWRlcyA9IDE7XG5cbiAgICByZXR1cm4gdGZjLmNvbnYyZChcbiAgICAgICAgeCBhcyB0ZmMuVGVuc29yM0QsIHcgYXMgdGZjLlRlbnNvcjRELCBzdHJpZGVzLCAnc2FtZScsXG4gICAgICAgIHRoaXMuZGF0YUZvcm1hdCA9PT0gJ2NoYW5uZWxzRmlyc3QnID8gJ05DSFcnIDogJ05IV0MnKTtcbiAgfVxufVxuXG50ZmMuc2VyaWFsaXphdGlvbi5yZWdpc3RlckNsYXNzKENvbnZMU1RNMkRDZWxsKTtcblxuZXhwb3J0IGRlY2xhcmUgaW50ZXJmYWNlIENvbnZMU1RNMkRBcmdzIGV4dGVuZHNcbiAgICBPbWl0PExTVE1MYXllckFyZ3MsICd1bml0cyd8J2NlbGwnPiwgQ29udlJOTjJETGF5ZXJBcmdzIHt9XG5cbmV4cG9ydCBjbGFzcyBDb252TFNUTTJEIGV4dGVuZHMgQ29udlJOTjJEIHtcbiAgLyoqIEBub2NvbGxhcHNlICovXG4gIHN0YXRpYyBjbGFzc05hbWUgPSAnQ29udkxTVE0yRCc7XG5cbiAgY29uc3RydWN0b3IoYXJnczogQ29udkxTVE0yREFyZ3MpIHtcbiAgICBjb25zdCBjZWxsID0gbmV3IENvbnZMU1RNMkRDZWxsKGFyZ3MpO1xuXG4gICAgc3VwZXIoey4uLmFyZ3MsIGNlbGx9IGFzIENvbnZSTk4yRExheWVyQXJncyk7XG4gIH1cblxuICAvKiogQG5vY29sbGFwc2UgKi9cbiAgc3RhdGljIGZyb21Db25maWc8VCBleHRlbmRzIHRmYy5zZXJpYWxpemF0aW9uLlNlcmlhbGl6YWJsZT4oXG4gICAgICBjbHM6IHRmYy5zZXJpYWxpemF0aW9uLlNlcmlhbGl6YWJsZUNvbnN0cnVjdG9yPFQ+LFxuICAgICAgY29uZmlnOiB0ZmMuc2VyaWFsaXphdGlvbi5Db25maWdEaWN0KTogVCB7XG4gICAgcmV0dXJuIG5ldyBjbHMoY29uZmlnKTtcbiAgfVxufVxuXG50ZmMuc2VyaWFsaXphdGlvbi5yZWdpc3RlckNsYXNzKENvbnZMU1RNMkQpO1xuIl19","/**\n * @license\n * Copyright 2018 Google LLC\n *\n * Use of this source code is governed by an MIT-style\n * license that can be found in the LICENSE file or at\n * https://opensource.org/licenses/MIT.\n * =============================================================================\n */\n/**\n * TensorFlow.js Layers: Basic Layers.\n */\nimport { any, cast, mul, notEqual, reshape, serialization, tidy, transpose, util } from '@tensorflow/tfjs-core';\nimport { getActivation, serializeActivation } from '../activations';\nimport * as K from '../backend/tfjs_backend';\nimport { getConstraint, serializeConstraint } from '../constraints';\nimport { InputSpec, Layer } from '../engine/topology';\nimport { ValueError } from '../errors';\nimport { getInitializer, serializeInitializer } from '../initializers';\nimport { getRegularizer, serializeRegularizer } from '../regularizers';\nimport { assertPositiveInteger, mapActivationToFusedKernel } from '../utils/generic_utils';\nimport { arrayProd, range } from '../utils/math_utils';\nimport { getExactlyOneShape, getExactlyOneTensor } from '../utils/types_utils';\nexport class Dropout extends Layer {\n constructor(args) {\n super(args);\n this.rate = Math.max(Math.min(args.rate, 1), 0);\n // So that the scalar doesn't get tidied up between executions.\n this.noiseShape = args.noiseShape;\n this.seed = args.seed;\n this.supportsMasking = true;\n }\n getNoiseShape(input) {\n if (this.noiseShape == null) {\n return this.noiseShape;\n }\n const inputShape = input.shape;\n const noiseShape = [];\n for (let i = 0; i < this.noiseShape.length; ++i) {\n noiseShape.push(this.noiseShape[i] == null ? inputShape[i] : this.noiseShape[i]);\n }\n return noiseShape;\n }\n call(inputs, kwargs) {\n return tidy(() => {\n this.invokeCallHook(inputs, kwargs);\n const input = getExactlyOneTensor(inputs);\n if (0 < this.rate && this.rate < 1) {\n const training = kwargs['training'] == null ? false : kwargs['training'];\n const noiseShape = this.getNoiseShape(input);\n const output = K.inTrainPhase(() => K.dropout(input, this.rate, noiseShape, this.seed), () => input, training);\n return output;\n }\n return inputs;\n });\n }\n getConfig() {\n const config = {\n rate: this.rate,\n noiseShape: this.noiseShape,\n seed: this.seed,\n };\n const baseConfig = super.getConfig();\n Object.assign(config, baseConfig);\n return config;\n }\n dispose() {\n return super.dispose();\n }\n}\n/** @nocollapse */\nDropout.className = 'Dropout';\nserialization.registerClass(Dropout);\nexport class SpatialDropout1D extends Dropout {\n constructor(args) {\n super(args);\n this.inputSpec = [{ ndim: 3 }];\n }\n getNoiseShape(input) {\n const inputShape = input.shape;\n return [inputShape[0], 1, inputShape[2]];\n }\n}\n/** @nocollapse */\nSpatialDropout1D.className = 'SpatialDropout1D';\nserialization.registerClass(SpatialDropout1D);\nexport class Dense extends Layer {\n constructor(args) {\n super(args);\n // Default activation: Linear (none).\n this.activation = null;\n this.useBias = true;\n this.kernel = null;\n this.bias = null;\n this.DEFAULT_KERNEL_INITIALIZER = 'glorotNormal';\n this.DEFAULT_BIAS_INITIALIZER = 'zeros';\n if (args.batchInputShape == null && args.inputShape == null &&\n args.inputDim != null) {\n // This logic is copied from Layer's constructor, since we can't\n // do exactly what the Python constructor does for Dense().\n let batchSize = null;\n if (args.batchSize != null) {\n batchSize = args.batchSize;\n }\n this.batchInputShape = [batchSize, args.inputDim];\n }\n this.units = args.units;\n assertPositiveInteger(this.units, 'units');\n this.activation = getActivation(args.activation);\n if (args.useBias != null) {\n this.useBias = args.useBias;\n }\n this.kernelInitializer = getInitializer(args.kernelInitializer || this.DEFAULT_KERNEL_INITIALIZER);\n this.biasInitializer =\n getInitializer(args.biasInitializer || this.DEFAULT_BIAS_INITIALIZER);\n this.kernelConstraint = getConstraint(args.kernelConstraint);\n this.biasConstraint = getConstraint(args.biasConstraint);\n this.kernelRegularizer = getRegularizer(args.kernelRegularizer);\n this.biasRegularizer = getRegularizer(args.biasRegularizer);\n this.activityRegularizer = getRegularizer(args.activityRegularizer);\n this.supportsMasking = true;\n this.inputSpec = [{ minNDim: 2 }];\n }\n build(inputShape) {\n inputShape = getExactlyOneShape(inputShape);\n const inputLastDim = inputShape[inputShape.length - 1];\n if (this.kernel == null) {\n this.kernel = this.addWeight('kernel', [inputLastDim, this.units], null, this.kernelInitializer, this.kernelRegularizer, true, this.kernelConstraint);\n if (this.useBias) {\n this.bias = this.addWeight('bias', [this.units], null, this.biasInitializer, this.biasRegularizer, true, this.biasConstraint);\n }\n }\n this.inputSpec = [{ minNDim: 2, axes: { [-1]: inputLastDim } }];\n this.built = true;\n }\n computeOutputShape(inputShape) {\n inputShape = getExactlyOneShape(inputShape);\n const outputShape = inputShape.slice();\n outputShape[outputShape.length - 1] = this.units;\n return outputShape;\n }\n call(inputs, kwargs) {\n return tidy(() => {\n this.invokeCallHook(inputs, kwargs);\n // Dense layer accepts only a single input.\n const input = getExactlyOneTensor(inputs);\n const fusedActivationName = mapActivationToFusedKernel(this.activation.getClassName());\n let output;\n if (fusedActivationName != null) {\n output = K.dot(input, this.kernel.read(), fusedActivationName, this.bias ? this.bias.read() : null);\n }\n else {\n output = K.dot(input, this.kernel.read());\n if (this.bias != null) {\n output = K.biasAdd(output, this.bias.read());\n }\n if (this.activation != null) {\n output = this.activation.apply(output);\n }\n }\n return output;\n });\n }\n getConfig() {\n const config = {\n units: this.units,\n activation: serializeActivation(this.activation),\n useBias: this.useBias,\n kernelInitializer: serializeInitializer(this.kernelInitializer),\n biasInitializer: serializeInitializer(this.biasInitializer),\n kernelRegularizer: serializeRegularizer(this.kernelRegularizer),\n biasRegularizer: serializeRegularizer(this.biasRegularizer),\n activityRegularizer: serializeRegularizer(this.activityRegularizer),\n kernelConstraint: serializeConstraint(this.kernelConstraint),\n biasConstraint: serializeConstraint(this.biasConstraint)\n };\n const baseConfig = super.getConfig();\n Object.assign(config, baseConfig);\n return config;\n }\n}\n/** @nocollapse */\nDense.className = 'Dense';\nserialization.registerClass(Dense);\nexport class Flatten extends Layer {\n constructor(args) {\n args = args || {};\n super(args);\n this.inputSpec = [{ minNDim: 3 }];\n this.dataFormat = args.dataFormat;\n }\n computeOutputShape(inputShape) {\n inputShape = getExactlyOneShape(inputShape);\n for (const dim of inputShape.slice(1)) {\n if (dim == null) {\n throw new ValueError(`The shape of the input to \"Flatten\" is not fully defined ` +\n `(got ${inputShape.slice(1)}). Make sure to pass a complete ` +\n `\"input_shape\" or \"batch_input_shape\" argument to the first ` +\n `layer in your model.`);\n }\n }\n return [inputShape[0], arrayProd(inputShape, 1)];\n }\n call(inputs, kwargs) {\n return tidy(() => {\n this.invokeCallHook(inputs, kwargs);\n let input = getExactlyOneTensor(inputs);\n if (this.dataFormat === 'channelsFirst' && input.rank > 1) {\n const permutation = [0];\n for (let i = 2; i < input.rank; ++i) {\n permutation.push(i);\n }\n permutation.push(1);\n input = transpose(input, permutation);\n }\n return K.batchFlatten(input);\n });\n }\n getConfig() {\n const config = {};\n if (this.dataFormat != null) {\n config['dataFormat'] = this.dataFormat;\n }\n const baseConfig = super.getConfig();\n Object.assign(config, baseConfig);\n return config;\n }\n}\n/** @nocollapse */\nFlatten.className = 'Flatten';\nserialization.registerClass(Flatten);\nexport class Activation extends Layer {\n constructor(args) {\n super(args);\n this.supportsMasking = true;\n this.activation = getActivation(args.activation);\n }\n call(inputs, kwargs) {\n return tidy(() => {\n this.invokeCallHook(inputs, kwargs);\n const input = getExactlyOneTensor(inputs);\n return this.activation.apply(input);\n });\n }\n getConfig() {\n const config = { activation: serializeActivation(this.activation) };\n const baseConfig = super.getConfig();\n Object.assign(config, baseConfig);\n return config;\n }\n}\n/** @nocollapse */\nActivation.className = 'Activation';\nserialization.registerClass(Activation);\nexport class RepeatVector extends Layer {\n constructor(args) {\n super(args);\n this.n = args.n;\n this.inputSpec = [{ ndim: 2 }];\n }\n computeOutputShape(inputShape) {\n return [inputShape[0], this.n, inputShape[1]];\n }\n call(inputs, kwargs) {\n return tidy(() => {\n inputs = getExactlyOneTensor(inputs);\n return K.repeat(inputs, this.n);\n });\n }\n getConfig() {\n const config = {\n n: this.n,\n };\n const baseConfig = super.getConfig();\n Object.assign(config, baseConfig);\n return config;\n }\n}\n/** @nocollapse */\nRepeatVector.className = 'RepeatVector';\nserialization.registerClass(RepeatVector);\nexport class Reshape extends Layer {\n constructor(args) {\n super(args);\n this.targetShape = args.targetShape;\n // Make sure that all unknown dimensions are represented as `null`.\n for (let i = 0; i < this.targetShape.length; ++i) {\n if (this.isUnknown(this.targetShape[i])) {\n this.targetShape[i] = null;\n }\n }\n }\n isUnknown(dim) {\n return dim < 0 || dim == null;\n }\n /**\n * Finds and replaces a missing dimension in output shape.\n *\n * This is a near direct port of the internal Numpy function\n * `_fix_unknown_dimension` in `numpy/core/src/multiarray/shape.c`.\n *\n * @param inputShape: Original shape of array begin reshape.\n * @param outputShape: Target shape of the array, with at most a single\n * `null` or negative number, which indicates an underdetermined dimension\n * that should be derived from `inputShape` and the known dimensions of\n * `outputShape`.\n * @returns: The output shape with `null` replaced with its computed value.\n * @throws: ValueError: If `inputShape` and `outputShape` do not match.\n */\n fixUnknownDimension(inputShape, outputShape) {\n const errorMsg = 'Total size of new array must be unchanged.';\n const finalShape = outputShape.slice();\n let known = 1;\n let unknown = null;\n for (let i = 0; i < finalShape.length; ++i) {\n const dim = finalShape[i];\n if (this.isUnknown(dim)) {\n if (unknown === null) {\n unknown = i;\n }\n else {\n throw new ValueError('Can only specifiy one unknown dimension.');\n }\n }\n else {\n known *= dim;\n }\n }\n const originalSize = arrayProd(inputShape);\n if (unknown !== null) {\n if (known === 0 || originalSize % known !== 0) {\n throw new ValueError(errorMsg);\n }\n finalShape[unknown] = originalSize / known;\n }\n else if (originalSize !== known) {\n throw new ValueError(errorMsg);\n }\n return finalShape;\n }\n computeOutputShape(inputShape) {\n let anyUnknownDims = false;\n for (let i = 0; i < inputShape.length; ++i) {\n if (this.isUnknown(inputShape[i])) {\n anyUnknownDims = true;\n break;\n }\n }\n if (anyUnknownDims) {\n return inputShape.slice(0, 1).concat(this.targetShape);\n }\n else {\n return inputShape.slice(0, 1).concat(this.fixUnknownDimension(inputShape.slice(1), this.targetShape));\n }\n }\n call(inputs, kwargs) {\n return tidy(() => {\n this.invokeCallHook(inputs, kwargs);\n const input = getExactlyOneTensor(inputs);\n const inputShape = input.shape;\n const outputShape = inputShape.slice(0, 1).concat(this.fixUnknownDimension(inputShape.slice(1), this.targetShape));\n return reshape(input, outputShape);\n });\n }\n getConfig() {\n const config = {\n targetShape: this.targetShape,\n };\n const baseConfig = super.getConfig();\n Object.assign(config, baseConfig);\n return config;\n }\n}\n/** @nocollapse */\nReshape.className = 'Reshape';\nserialization.registerClass(Reshape);\nexport class Permute extends Layer {\n constructor(args) {\n super(args);\n if (args.dims == null) {\n throw new Error('Required configuration field `dims` is missing during Permute ' +\n 'constructor call.');\n }\n if (!Array.isArray(args.dims)) {\n throw new Error('Permute constructor requires `dims` to be an Array, but received ' +\n `${args.dims} instead.`);\n }\n // Check the validity of the permutation indices.\n const expectedSortedIndices = range(1, args.dims.length + 1);\n if (!util.arraysEqual(args.dims.slice().sort(), expectedSortedIndices)) {\n throw new Error('Invalid permutation `dims`: ' + JSON.stringify(args.dims) +\n ' `dims` must contain consecutive integers starting from 1.');\n }\n this.dims = args.dims;\n this.dimsIncludingBatch = [0].concat(this.dims);\n this.inputSpec = [new InputSpec({ ndim: this.dims.length + 1 })];\n }\n computeOutputShape(inputShape) {\n inputShape = getExactlyOneShape(inputShape);\n const outputShape = inputShape.slice();\n this.dims.forEach((dim, i) => {\n outputShape[i + 1] = inputShape[dim];\n });\n return outputShape;\n }\n call(inputs, kwargs) {\n return transpose(getExactlyOneTensor(inputs), this.dimsIncludingBatch);\n }\n getConfig() {\n const config = {\n dims: this.dims,\n };\n const baseConfig = super.getConfig();\n Object.assign(config, baseConfig);\n return config;\n }\n}\n/** @nocollapse */\nPermute.className = 'Permute';\nserialization.registerClass(Permute);\nexport class Masking extends Layer {\n constructor(args) {\n super(args == null ? {} : args);\n this.supportsMasking = true;\n if (args != null) {\n this.maskValue = args.maskValue == null ? 0 : args.maskValue;\n }\n else {\n this.maskValue = 0;\n }\n }\n computeOutputShape(inputShape) {\n return inputShape;\n }\n getConfig() {\n const baseConfig = super.getConfig();\n const config = { maskValue: this.maskValue };\n Object.assign(config, baseConfig);\n return config;\n }\n computeMask(inputs, mask) {\n const input = getExactlyOneTensor(inputs);\n const axis = -1;\n return any(notEqual(input, this.maskValue), axis);\n }\n call(inputs, kwargs) {\n return tidy(() => {\n this.invokeCallHook(inputs, kwargs);\n const input = getExactlyOneTensor(inputs);\n const axis = -1;\n const keepDims = true;\n const booleanMask = any(notEqual(input, this.maskValue), axis, keepDims);\n const output = mul(input, cast(booleanMask, input.dtype));\n return output;\n });\n }\n}\n/** @nocollapse */\nMasking.className = 'Masking';\nserialization.registerClass(Masking);\n//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY29yZS5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uLy4uL3RmanMtbGF5ZXJzL3NyYy9sYXllcnMvY29yZS50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQTs7Ozs7Ozs7R0FRRztBQUVIOztHQUVHO0FBRUgsT0FBTyxFQUFDLEdBQUcsRUFBRSxJQUFJLEVBQUUsR0FBRyxFQUFFLFFBQVEsRUFBRSxPQUFPLEVBQUUsYUFBYSxFQUFVLElBQUksRUFBRSxTQUFTLEVBQUUsSUFBSSxFQUFDLE1BQU0sdUJBQXVCLENBQUM7QUFFdEgsT0FBTyxFQUE2QixhQUFhLEVBQUUsbUJBQW1CLEVBQUMsTUFBTSxnQkFBZ0IsQ0FBQztBQUM5RixPQUFPLEtBQUssQ0FBQyxNQUFNLHlCQUF5QixDQUFDO0FBQzdDLE9BQU8sRUFBbUMsYUFBYSxFQUFFLG1CQUFtQixFQUFDLE1BQU0sZ0JBQWdCLENBQUM7QUFDcEcsT0FBTyxFQUFnQixTQUFTLEVBQUUsS0FBSyxFQUFZLE1BQU0sb0JBQW9CLENBQUM7QUFDOUUsT0FBTyxFQUFDLFVBQVUsRUFBQyxNQUFNLFdBQVcsQ0FBQztBQUNyQyxPQUFPLEVBQUMsY0FBYyxFQUFzQyxvQkFBb0IsRUFBQyxNQUFNLGlCQUFpQixDQUFDO0FBSXpHLE9BQU8sRUFBQyxjQUFjLEVBQXNDLG9CQUFvQixFQUFDLE1BQU0saUJBQWlCLENBQUM7QUFFekcsT0FBTyxFQUFDLHFCQUFxQixFQUFFLDBCQUEwQixFQUFDLE1BQU0sd0JBQXdCLENBQUM7QUFDekYsT0FBTyxFQUFDLFNBQVMsRUFBRSxLQUFLLEVBQUMsTUFBTSxxQkFBcUIsQ0FBQztBQUNyRCxPQUFPLEVBQUMsa0JBQWtCLEVBQUUsbUJBQW1CLEVBQUMsTUFBTSxzQkFBc0IsQ0FBQztBQXFCN0UsTUFBTSxPQUFPLE9BQVEsU0FBUSxLQUFLO0lBT2hDLFlBQVksSUFBc0I7UUFDaEMsS0FBSyxDQUFDLElBQUksQ0FBQyxDQUFDO1FBQ1osSUFBSSxDQUFD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MUMsTUFBTSxJQUFJLEdBQUcsQ0FBQyxDQUFDLENBQUM7WUFDaEIsTUFBTSxRQUFRLEdBQUcsSUFBSSxDQUFDO1lBQ3RCLE1BQU0sV0FBVyxHQUFHLEdBQUcsQ0FBQyxRQUFRLENBQUMsS0FBSyxFQUFFLElBQUksQ0FBQyxTQUFTLENBQUMsRUFBRSxJQUFJLEVBQUUsUUFBUSxDQUFDLENBQUM7WUFDekUsTUFBTSxNQUFNLEdBQUcsR0FBRyxDQUFDLEtBQUssRUFBRSxJQUFJLENBQUMsV0FBVyxFQUFFLEtBQUssQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDO1lBQzFELE9BQU8sTUFBTSxDQUFDO1FBQ2hCLENBQUMsQ0FBQyxDQUFDO0lBQ0wsQ0FBQzs7QUF6Q0Qsa0JBQWtCO0FBQ1gsaUJBQVMsR0FBRyxTQUFTLENBQUM7QUEwQy9CLGFBQWEsQ0FBQyxhQUFhLENBQUMsT0FBTyxDQUFDLENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyIvKipcbiAqIEBsaWNlbnNlXG4gKiBDb3B5cmlnaHQgMjAxOCBHb29nbGUgTExDXG4gKlxuICogVXNlIG9mIHRoaXMgc291cmNlIGNvZGUgaXMgZ292ZXJuZWQgYnkgYW4gTUlULXN0eWxlXG4gKiBsaWNlbnNlIHRoYXQgY2FuIGJlIGZvdW5kIGluIHRoZSBMSUNFTlNFIGZpbGUgb3IgYXRcbiAqIGh0dHBzOi8vb3BlbnNvdXJjZS5vcmcvbGljZW5zZXMvTUlULlxuICogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbiAqL1xuXG4vKipcbiAqIFRlbnNvckZsb3cuanMgTGF5ZXJzOiBCYXNpYyBMYXllcnMuXG4gKi9cblxuaW1wb3J0IHthbnksIGNhc3QsIG11bCwgbm90RXF1YWwsIHJlc2hhcGUsIHNlcmlhbGl6YXRpb24sIFRlbnNvciwgdGlkeSwgdHJhbnNwb3NlLCB1dGlsfSBmcm9tICdAdGVuc29yZmxvdy90ZmpzLWNvcmUnO1xuXG5pbXBvcnQge0FjdGl2YXRpb24gYXMgQWN0aXZhdGlvbkZuLCBnZXRBY3RpdmF0aW9uLCBzZXJpYWxpemVBY3RpdmF0aW9ufSBmcm9tICcuLi9hY3RpdmF0aW9ucyc7XG5pbXBvcnQgKiBhcyBLIGZyb20gJy4uL2JhY2tlbmQvdGZqc19iYWNrZW5kJztcbmltcG9ydCB7Q29uc3RyYWludCwgQ29uc3RyYWludElkZW50aWZpZXIsIGdldENvbnN0cmFpbnQsIHNlcmlhbGl6ZUNvbnN0cmFpbnR9IGZyb20gJy4uL2NvbnN0cmFpbnRzJztcbmltcG9ydCB7RGlzcG9zZVJlc3VsdCwgSW5wdXRTcGVjLCBMYXllciwgTGF5ZXJBcmdzfSBmcm9tICcuLi9lbmdpbmUvdG9wb2xvZ3knO1xuaW1wb3J0IHtWYWx1ZUVycm9yfSBmcm9tICcuLi9lcnJvcnMnO1xuaW1wb3J0IHtnZXRJbml0aWFsaXplciwgSW5pdGlhbGl6ZXIsIEluaXRpYWxpemVySWRlbnRpZmllciwgc2VyaWFsaXplSW5pdGlhbGl6ZXJ9IGZyb20gJy4uL2luaXRpYWxpemVycyc7XG5pbXBvcnQge0FjdGl2YXRpb25JZGVudGlmaWVyfSBmcm9tICcuLi9rZXJhc19mb3JtYXQvYWN0aXZhdGlvbl9jb25maWcnO1xuaW1wb3J0IHtEYXRhRm9ybWF0LCBTaGFwZX0gZnJvbSAnLi4va2VyYXNfZm9ybWF0L2NvbW1vbic7XG5pbXBvcnQge0xheWVyQ29uZmlnfSBmcm9tICcuLi9rZXJhc19mb3JtYXQvdG9wb2xvZ3lfY29uZmlnJztcbmltcG9ydCB7Z2V0UmVndWxhcml6ZXIsIFJlZ3VsYXJpemVyLCBSZWd1bGFyaXplcklkZW50aWZpZXIsIHNlcmlhbGl6ZVJlZ3VsYXJpemVyfSBmcm9tICcuLi9yZWd1bGFyaXplcnMnO1xuaW1wb3J0IHtLd2FyZ3N9IGZyb20gJy4uL3R5cGVzJztcbmltcG9ydCB7YXNzZXJ0UG9zaXRpdmVJbnRlZ2VyLCBtYXBBY3RpdmF0aW9uVG9GdXNlZEtlcm5lbH0gZnJvbSAnLi4vdXRpbHMvZ2VuZXJpY191dGlscyc7XG5pbXBvcnQge2FycmF5UHJvZCwgcmFuZ2V9IGZyb20gJy4uL3V0aWxzL21hdGhfdXRpbHMnO1xuaW1wb3J0IHtnZXRFeGFjdGx5T25lU2hhcGUsIGdldEV4YWN0bHlPbmVUZW5zb3J9IGZyb20gJy4uL3V0aWxzL3R5cGVzX3V0aWxzJztcbmltcG9ydCB7TGF5ZXJWYXJpYWJsZX0gZnJvbSAnLi4vdmFyaWFibGVzJztcblxuZXhwb3J0IGRlY2xhcmUgaW50ZXJmYWNlIERyb3BvdXRMYXllckFyZ3MgZXh0ZW5kcyBMYXllckFyZ3Mge1xuICAvKiogRmxvYXQgYmV0d2VlbiAwIGFuZCAxLiBGcmFjdGlvbiBvZiB0aGUgaW5wdXQgdW5pdHMgdG8gZHJvcC4gKi9cbiAgcmF0ZTogbnVtYmVyO1xuXG4gIC8qKlxuICAgKiBJbnRlZ2VyIGFycmF5IHJlcHJlc2VudGluZyB0aGUgc2hhcGUgb2YgdGhlIGJpbmFyeSBkcm9wb3V0IG1hc2sgdGhhdCB3aWxsXG4gICAqIGJlIG11bHRpcGxpZWQgd2l0aCB0aGUgaW5wdXQuXG4gICAqXG4gICAqIEZvciBpbnN0YW5jZSwgaWYgeW91ciBpbnB1dHMgaGF2ZSBzaGFwZSBgKGJhdGNoU2l6ZSwgdGltZXN0ZXBzLCBmZWF0dXJlcylgXG4gICAqIGFuZCB5b3Ugd2FudCB0aGUgZHJvcG91dCBtYXNrIHRvIGJlIHRoZSBzYW1lIGZvciBhbGwgdGltZXN0ZXBzLCB5b3UgY2FuIHVzZVxuICAgKiBgbm9pc2Vfc2hhcGU9KGJhdGNoX3NpemUsIDEsIGZlYXR1cmVzKWAuXG4gICAqL1xuICBub2lzZVNoYXBlPzogbnVtYmVyW107XG5cbiAgLyoqIEFuIGludGVnZXIgdG8gdXNlIGFzIHJhbmRvbSBzZWVkLiAqL1xuICBzZWVkPzogbnVtYmVyO1xufVxuXG5leHBvcnQgY2xhc3MgRHJvcG91dCBleHRlbmRzIExheWVyIHtcbiAgLyoqIEBub2NvbGxhcHNlICovXG4gIHN0YXRpYyBjbGFzc05hbWUgPSAnRHJvcG91dCc7XG4gIHByaXZhdGUgcmVhZG9ubHkgcmF0ZTogbnVtYmVyO1xuICBwcml2YXRlIHJlYWRvbmx5IG5vaXNlU2hhcGU6IG51bWJlcltdO1xuICBwcml2YXRlIHJlYWRvbmx5IHNlZWQ6IG51bWJlcjtcblxuICBjb25zdHJ1Y3RvcihhcmdzOiBEcm9wb3V0TGF5ZXJBcmdzKSB7XG4gICAgc3VwZXIoYXJncyk7XG4gICAgdGhpcy5yYXRlID0gTWF0aC5tYXgoTWF0aC5taW4oYXJncy5yYXRlLCAxKSwgMCk7XG4gICAgLy8gU28gdGhhdCB0aGUgc2NhbGFyIGRvZXNuJ3QgZ2V0IHRpZGllZCB1cCBiZXR3ZWVuIGV4ZWN1dGlvbnMuXG4gICAgdGhpcy5ub2lzZVNoYXBlID0gYXJncy5ub2lzZVNoYXBlO1xuICAgIHRoaXMuc2VlZCA9IGFyZ3Muc2VlZDtcbiAgICB0aGlzLnN1cHBvcnRzTWFza2luZyA9IHRydWU7XG4gIH1cblxuICBwcm90ZWN0ZWQgZ2V0Tm9pc2VTaGFwZShpbnB1dDogVGVuc29yKTogU2hhcGUge1xuICAgIGlmICh0aGlzLm5vaXNlU2hhcGUgPT0gbnVsbCkge1xuICAgICAgcmV0dXJuIHRoaXMubm9pc2VTaGFwZTtcbiAgICB9XG4gICAgY29uc3QgaW5wdXRTaGFwZSA9IGlucHV0LnNoYXBlO1xuICAgIGNvbnN0IG5vaXNlU2hhcGU6IFNoYXBlID0gW107XG4gICAgZm9yIChsZXQgaSA9IDA7IGkgPCB0aGlzLm5vaXNlU2hhcGUubGVuZ3RoOyArK2kpIHtcbiAgICAgIG5vaXNlU2hhcGUucHVzaChcbiAgICAgICAgICB0aGlzLm5vaXNlU2hhcGVbaV0gPT0gbnVsbCA/IGlucHV0U2hhcGVbaV0gOiB0aGlzLm5vaXNlU2hhcGVbaV0pO1xuICAgIH1cbiAgICByZXR1cm4gbm9pc2VTaGFwZTtcbiAgfVxuXG4gIGNhbGwoaW5wdXRzOiBUZW5zb3J8VGVuc29yW10sIGt3YXJnczogS3dhcmdzKTogVGVuc29yfFRlbnNvcltdIHtcbiAgICByZXR1cm4gdGlkeSgoKSA9PiB7XG4gICAgICB0aGlzLmludm9rZUNhbGxIb29rKGlucHV0cywga3dhcmdzKTtcbiAgICAgIGNvbnN0IGlucHV0ID0gZ2V0RXhhY3RseU9uZVRlbnNvcihpbnB1dHMpO1xuICAgICAgaWYgKDAgPCB0aGlzLnJhdGUgJiYgdGhpcy5yYXRlIDwgMSkge1xuICAgICAgICBjb25zdCB0cmFpbmluZyA9XG4gICAgICAgICAgICBrd2FyZ3NbJ3RyYWluaW5nJ10gPT0gbnVsbCA/IGZhbHNlIDoga3dhcmdzWyd0cmFpbmluZyddO1xuICAgICAgICBjb25zdCBub2lzZVNoYXBlID0gdGhpcy5nZXROb2lzZVNoYXBlKGlucHV0KTtcbiAgICAgICAgY29uc3Qgb3V0cHV0ID0gSy5pblRyYWluUGhhc2UoXG4gICAgICAgICAgICAoKSA9PiBLLmRyb3BvdXQoaW5wdXQsIHRoaXMucmF0ZSwgbm9pc2VTaGFwZSwgdGhpcy5zZWVkKSxcbiAgICAgICAgICAgICgpID0+IGlucHV0LCB0cmFpbmluZyk7XG4gICAgICAgIHJldHVybiBvdXRwdXQ7XG4gICAgICB9XG4gICAgICByZXR1cm4gaW5wdXRzO1xuICAgIH0pO1xuICB9XG5cbiAgZ2V0Q29uZmlnKCk6IHNlcmlhbGl6YXRpb24uQ29uZmlnRGljdCB7XG4gICAgY29uc3QgY29uZmlnID0ge1xuICAgICAgcmF0ZTogdGhpcy5yYXRlLFxuICAgICAgbm9pc2VTaGFwZTogdGhpcy5ub2lzZVNoYXBlLFxuICAgICAgc2VlZDogdGhpcy5zZWVkLFxuICAgIH07XG4gICAgY29uc3QgYmFzZUNvbmZpZyA9IHN1cGVyLmdldENvbmZpZygpO1xuICAgIE9iamVjdC5hc3NpZ24oY29uZmlnLCBiYXNlQ29uZmlnKTtcbiAgICByZXR1cm4gY29uZmlnO1xuICB9XG5cbiAgZGlzcG9zZSgpOiBEaXNwb3NlUmVzdWx0IHtcbiAgICByZXR1cm4gc3VwZXIuZGlzcG9zZSgpO1xuICB9XG59XG5zZXJpYWxpemF0aW9uLnJlZ2lzdGVyQ2xhc3MoRHJvcG91dCk7XG5cbmV4cG9ydCBkZWNsYXJlIGludGVyZmFjZSBEZW5zZUxheWVyQXJncyBleHRlbmRzIExheWVyQXJncyB7XG4gIC8qKiBQb3NpdGl2ZSBpbnRlZ2VyLCBkaW1lbnNpb25hbGl0eSBvZiB0aGUgb3V0cHV0IHNwYWNlLiAqL1xuICB1bml0czogbnVtYmVyO1xuICAvKipcbiAgICogQWN0aXZhdGlvbiBmdW5jdGlvbiB0byB1c2UuXG4gICAqXG4gICAqIElmIHVuc3BlY2lmaWVkLCBubyBhY3RpdmF0aW9uIGlzIGFwcGxpZWQuXG4gICAqL1xuICBhY3RpdmF0aW9uPzogQWN0aXZhdGlvbklkZW50aWZpZXI7XG4gIC8qKiBXaGV0aGVyIHRvIGFwcGx5IGEgYmlhcy4gKi9cbiAgdXNlQmlhcz86IGJvb2xlYW47XG4gIC8qKlxuICAgKiBJbml0aWFsaXplciBmb3IgdGhlIGRlbnNlIGtlcm5lbCB3ZWlnaHRzIG1hdHJpeC5cbiAgICovXG4gIGtlcm5lbEluaXRpYWxpemVyPzogSW5pdGlhbGl6ZXJJZGVudGlmaWVyfEluaXRpYWxpemVyO1xuICAvKipcbiAgICogSW5pdGlhbGl6ZXIgZm9yIHRoZSBiaWFzIHZlY3Rvci5cbiAgICovXG4gIGJpYXNJbml0aWFsaXplcj86IEluaXRpYWxpemVySWRlbnRpZmllcnxJbml0aWFsaXplcjtcbiAgLyoqXG4gICAqIElmIHNwZWNpZmllZCwgZGVmaW5lcyBpbnB1dFNoYXBlIGFzIGBbaW5wdXREaW1dYC5cbiAgICovXG4gIGlucHV0RGltPzogbnVtYmVyO1xuXG4gIC8qKlxuICAgKiBDb25zdHJhaW50IGZvciB0aGUga2VybmVsIHdlaWdodHMuXG4gICAqL1xuICBrZXJuZWxDb25zdHJhaW50PzogQ29uc3RyYWludElkZW50aWZpZXJ8Q29uc3RyYWludDtcblxuICAvKipcbiAgICogQ29uc3RyYWludCBmb3IgdGhlIGJpYXMgdmVjdG9yLlxuICAgKi9cbiAgYmlhc0NvbnN0cmFpbnQ/OiBDb25zdHJhaW50SWRlbnRpZmllcnxDb25zdHJhaW50O1xuXG4gIC8qKlxuICAgKiBSZWd1bGFyaXplciBmdW5jdGlvbiBhcHBsaWVkIHRvIHRoZSBkZW5zZSBrZXJuZWwgd2VpZ2h0cyBtYXRyaXguXG4gICAqL1xuICBrZXJuZWxSZWd1bGFyaXplcj86IFJlZ3VsYXJpemVySWRlbnRpZmllcnxSZWd1bGFyaXplcjtcblxuICAvKipcbiAgICogUmVndWxhcml6ZXIgZnVuY3Rpb24gYXBwbGllZCB0byB0aGUgYmlhcyB2ZWN0b3IuXG4gICAqL1xuICBiaWFzUmVndWxhcml6ZXI/OiBSZWd1bGFyaXplcklkZW50aWZpZXJ8UmVndWxhcml6ZXI7XG5cbiAgLyoqXG4gICAqIFJlZ3VsYXJpemVyIGZ1bmN0aW9uIGFwcGxpZWQgdG8gdGhlIGFjdGl2YXRpb24uXG4gICAqL1xuICBhY3Rpdml0eVJlZ3VsYXJpemVyPzogUmVndWxhcml6ZXJJZGVudGlmaWVyfFJlZ3VsYXJpemVyO1xufVxuXG5leHBvcnQgaW50ZXJmYWNlIFNwYXRpYWxEcm9wb3V0MURMYXllckNvbmZpZyBleHRlbmRzIExheWVyQ29uZmlnIHtcbiAgLyoqIEZsb2F0IGJldHdlZW4gMCBhbmQgMS4gRnJhY3Rpb24gb2YgdGhlIGlucHV0IHVuaXRzIHRvIGRyb3AuICovXG4gIHJhdGU6IG51bWJlcjtcblxuICAvKiogQW4gaW50ZWdlciB0byB1c2UgYXMgcmFuZG9tIHNlZWQuICovXG4gIHNlZWQ/OiBudW1iZXI7XG59XG5cbmV4cG9ydCBjbGFzcyBTcGF0aWFsRHJvcG91dDFEIGV4dGVuZHMgRHJvcG91dCB7XG4gIC8qKiBAbm9jb2xsYXBzZSAqL1xuICBzdGF0aWMgY2xhc3NOYW1lID0gJ1NwYXRpYWxEcm9wb3V0MUQnO1xuXG4gIGNvbnN0cnVjdG9yKGFyZ3M6IFNwYXRpYWxEcm9wb3V0MURMYXllckNvbmZpZykge1xuICAgIHN1cGVyKGFyZ3MpO1xuICAgIHRoaXMuaW5wdXRTcGVjID0gW3tuZGltOiAzfV07XG4gIH1cblxuICBwcm90ZWN0ZWQgZ2V0Tm9pc2VTaGFwZShpbnB1dDogVGVuc29yKTogU2hhcGUge1xuICAgIGNvbnN0IGlucHV0U2hhcGUgPSBpbnB1dC5zaGFwZTtcbiAgICByZXR1cm4gW2lucHV0U2hhcGVbMF0sIDEsIGlucHV0U2hhcGVbMl1dO1xuICB9XG59XG5zZXJpYWxpemF0aW9uLnJlZ2lzdGVyQ2xhc3MoU3BhdGlhbERyb3BvdXQxRCk7XG5cbmV4cG9ydCBjbGFzcyBEZW5zZSBleHRlbmRzIExheWVyIHtcbiAgLyoqIEBub2NvbGxhcHNlICovXG4gIHN0YXRpYyBjbGFzc05hbWUgPSAnRGVuc2UnO1xuICBwcml2YXRlIHVuaXRzOiBudW1iZXI7XG4gIC8vIERlZmF1bHQgYWN0aXZhdGlvbjogTGluZWFyIChub25lKS5cbiAgcHJpdmF0ZSBhY3RpdmF0aW9uOiBBY3RpdmF0aW9uRm4gPSBudWxsO1xuICBwcml2YXRlIHVzZUJpYXMgPSB0cnVlO1xuICBwcml2YXRlIGtlcm5lbEluaXRpYWxpemVyOiBJbml0aWFsaXplcjtcbiAgcHJpdmF0ZSBiaWFzSW5pdGlhbGl6ZXI6IEluaXRpYWxpemVyO1xuICBwcml2YXRlIGtlcm5lbDogTGF5ZXJWYXJpYWJsZSA9IG51bGw7XG4gIHByaXZhdGUgYmlhczogTGF5ZXJWYXJpYWJsZSA9IG51bGw7XG5cbiAgcmVhZG9ubHkgREVGQVVMVF9LRVJORUxfSU5JVElBTElaRVI6IEluaXRpYWxpemVySWRlbnRpZmllciA9ICdnbG9yb3ROb3JtYWwnO1xuICByZWFkb25seSBERUZBVUxUX0JJQVNfSU5JVElBTElaRVI6IEluaXRpYWxpemVySWRlbnRpZmllciA9ICd6ZXJvcyc7XG4gIHByaXZhdGUgcmVhZG9ubHkga2VybmVsQ29uc3RyYWludD86IENvbnN0cmFpbnQ7XG4gIHByaXZhdGUgcmVhZG9ubHkgYmlhc0NvbnN0cmFpbnQ/OiBDb25zdHJhaW50O1xuICBwcml2YXRlIHJlYWRvbmx5IGtlcm5lbFJlZ3VsYXJpemVyPzogUmVndWxhcml6ZXI7XG4gIHByaXZhdGUgcmVhZG9ubHkgYmlhc1JlZ3VsYXJpemVyPzogUmVndWxhcml6ZXI7XG5cbiAgY29uc3RydWN0b3IoYXJnczogRGVuc2VMYXllckFyZ3MpIHtcbiAgICBzdXBlcihhcmdzKTtcbiAgICBpZiAoYXJncy5iYXRjaElucHV0U2hhcGUgPT0gbnVsbCAmJiBhcmdzLmlucHV0U2hhcGUgPT0gbnVsbCAmJlxuICAgICAgICBhcmdzLmlucHV0RGltICE9IG51bGwpIHtcbiAgICAgIC8vIFRoaXMgbG9naWMgaXMgY29waWVkIGZyb20gTGF5ZXIncyBjb25zdHJ1Y3Rvciwgc2luY2Ugd2UgY2FuJ3RcbiAgICAgIC8vIGRvIGV4YWN0bHkgd2hhdCB0aGUgUHl0aG9uIGNvbnN0cnVjdG9yIGRvZXMgZm9yIERlbnNlKCkuXG4gICAgICBsZXQgYmF0Y2hTaXplOiBudW1iZXIgPSBudWxsO1xuICAgICAgaWYgKGFyZ3MuYmF0Y2hTaXplICE9IG51bGwpIHtcbiAgICAgICAgYmF0Y2hTaXplID0gYXJncy5iYXRjaFNpemU7XG4gICAgICB9XG4gICAgICB0aGlzLmJhdGNoSW5wdXRTaGFwZSA9IFtiYXRjaFNpemUsIGFyZ3MuaW5wdXREaW1dO1xuICAgIH1cblxuICAgIHRoaXMudW5pdHMgPSBhcmdzLnVuaXRzO1xuICAgIGFzc2VydFBvc2l0aXZlSW50ZWdlcih0aGlzLnVuaXRzLCAndW5pdHMnKTtcbiAgICB0aGlzLmFjdGl2YXRpb24gPSBnZXRBY3RpdmF0aW9uKGFyZ3MuYWN0aXZhdGlvbik7XG4gICAgaWYgKGFyZ3MudXNlQmlhcyAhPSBudWxsKSB7XG4gICAgICB0aGlzLnVzZUJpYXMgPSBhcmdzLnVzZUJpYXM7XG4gICAgfVxuICAgIHRoaXMua2VybmVsSW5pdGlhbGl6ZXIgPSBnZXRJbml0aWFsaXplcihcbiAgICAgICAgYXJncy5rZXJuZWxJbml0aWFsaXplciB8fCB0aGlzLkRFRkFVTFRfS0VSTkVMX0lOSVRJQUxJWkVSKTtcbiAgICB0aGlzLmJpYXNJbml0aWFsaXplciA9XG4gICAgICAgIGdldEluaXRpYWxpemVyKGFyZ3MuYmlhc0luaXRpYWxpemVyIHx8IHRoaXMuREVGQVVMVF9CSUFTX0lOSVRJQUxJWkVSKTtcbiAgICB0aGlzLmtlcm5lbENvbnN0cmFpbnQgPSBnZXRDb25zdHJhaW50KGFyZ3Mua2VybmVsQ29uc3RyYWludCk7XG4gICAgdGhpcy5iaWFzQ29uc3RyYWludCA9IGdldENvbnN0cmFpbnQoYXJncy5iaWFzQ29uc3RyYWludCk7XG4gICAgdGhpcy5rZXJuZWxSZWd1bGFyaXplciA9IGdldFJlZ3VsYXJpemVyKGFyZ3Mua2VybmVsUmVndWxhcml6ZXIpO1xuICAgIHRoaXMuYmlhc1JlZ3VsYXJpemVyID0gZ2V0UmVndWxhcml6ZXIoYXJncy5iaWFzUmVndWxhcml6ZXIpO1xuICAgIHRoaXMuYWN0aXZpdHlSZWd1bGFyaXplciA9IGdldFJlZ3VsYXJpemVyKGFyZ3MuYWN0aXZpdHlSZWd1bGFyaXplcik7XG4gICAgdGhpcy5zdXBwb3J0c01hc2tpbmcgPSB0cnVlO1xuXG4gICAgdGhpcy5pbnB1dFNwZWMgPSBbe21pbk5EaW06IDJ9XTtcbiAgfVxuXG4gIHB1YmxpYyBidWlsZChpbnB1dFNoYXBlOiBTaGFwZXxTaGFwZVtdKTogdm9pZCB7XG4gICAgaW5wdXRTaGFwZSA9IGdldEV4YWN0bHlPbmVTaGFwZShpbnB1dFNoYXBlKTtcbiAgICBjb25zdCBpbnB1dExhc3REaW0gPSBpbnB1dFNoYXBlW2lucHV0U2hhcGUubGVuZ3RoIC0gMV07XG4gICAgaWYgKHRoaXMua2VybmVsID09IG51bGwpIHtcbiAgICAgIHRoaXMua2VybmVsID0gdGhpcy5hZGRXZWlnaHQoXG4gICAgICAgICAgJ2tlcm5lbCcsIFtpbnB1dExhc3REaW0sIHRoaXMudW5pdHNdLCBudWxsLCB0aGlzLmtlcm5lbEluaXRpYWxpemVyLFxuICAgICAgICAgIHRoaXMua2VybmVsUmVndWxhcml6ZXIsIHRydWUsIHRoaXMua2VybmVsQ29uc3RyYWludCk7XG4gICAgICBpZiAodGhpcy51c2VCaWFzKSB7XG4gICAgICAgIHRoaXMuYmlhcyA9IHRoaXMuYWRkV2VpZ2h0KFxuICAgICAgICAgICAgJ2JpYXMnLCBbdGhpcy51bml0c10sIG51bGwsIHRoaXMuYmlhc0luaXRpYWxpemVyLFxuICAgICAgICAgICAgdGhpcy5iaWFzUmVndWxhcml6ZXIsIHRydWUsIHRoaXMuYmlhc0NvbnN0cmFpbnQpO1xuICAgICAgfVxuICAgIH1cblxuICAgIHRoaXMuaW5wdXRTcGVjID0gW3ttaW5ORGltOiAyLCBheGVzOiB7Wy0xXTogaW5wdXRMYXN0RGltfX1dO1xuICAgIHRoaXMuYnVpbHQgPSB0cnVlO1xuICB9XG5cbiAgY29tcHV0ZU91dHB1dFNoYXBlKGlucHV0U2hhcGU6IFNoYXBlfFNoYXBlW10pOiBTaGFwZXxTaGFwZVtdIHtcbiAgICBpbnB1dFNoYXBlID0gZ2V0RXhhY3RseU9uZVNoYXBlKGlucHV0U2hhcGUpO1xuICAgIGNvbnN0IG91dHB1dFNoYXBlID0gaW5wdXRTaGFwZS5zbGljZSgpO1xuICAgIG91dHB1dFNoYXBlW291dHB1dFNoYXBlLmxlbmd0aCAtIDFdID0gdGhpcy51bml0cztcbiAgICByZXR1cm4gb3V0cHV0U2hhcGU7XG4gIH1cblxuICBjYWxsKGlucHV0czogVGVuc29yfFRlbnNvcltdLCBrd2FyZ3M6IEt3YXJncyk6IFRlbnNvcnxUZW5zb3JbXSB7XG4gICAgcmV0dXJuIHRpZHkoKCkgPT4ge1xuICAgICAgdGhpcy5pbnZva2VDYWxsSG9vayhpbnB1dHMsIGt3YXJncyk7XG4gICAgICAvLyBEZW5zZSBsYXllciBhY2NlcHRzIG9ubHkgYSBzaW5nbGUgaW5wdXQuXG4gICAgICBjb25zdCBpbnB1dCA9IGdldEV4YWN0bHlPbmVUZW5zb3IoaW5wdXRzKTtcbiAgICAgIGNvbnN0IGZ1c2VkQWN0aXZhdGlvbk5hbWUgPVxuICAgICAgICAgIG1hcEFjdGl2YXRpb25Ub0Z1c2VkS2VybmVsKHRoaXMuYWN0aXZhdGlvbi5nZXRDbGFzc05hbWUoKSk7XG4gICAgICBsZXQgb3V0cHV0OiBUZW5zb3I7XG5cbiAgICAgIGlmIChmdXNlZEFjdGl2YXRpb25OYW1lICE9IG51bGwpIHtcbiAgICAgICAgb3V0cHV0ID0gSy5kb3QoXG4gICAgICAgICAgICBpbnB1dCwgdGhpcy5rZXJuZWwucmVhZCgpLCBmdXNlZEFjdGl2YXRpb25OYW1lLFxuICAgICAgICAgICAgdGhpcy5iaWFzID8gdGhpcy5iaWFzLnJlYWQoKSA6IG51bGwpO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgb3V0cHV0ID0gSy5kb3QoaW5wdXQsIHRoaXMua2VybmVsLnJlYWQoKSk7XG4gICAgICAgIGlmICh0aGlzLmJpYXMgIT0gbnVsbCkge1xuICAgICAgICAgIG91dHB1dCA9IEsuYmlhc0FkZChvdXRwdXQsIHRoaXMuYmlhcy5yZWFkKCkpO1xuICAgICAgICB9XG4gICAgICAgIGlmICh0aGlzLmFjdGl2YXRpb24gIT0gbnVsbCkge1xuICAgICAgICAgIG91dHB1dCA9IHRoaXMuYWN0aXZhdGlvbi5hcHBseShvdXRwdXQpO1xuICAgICAgICB9XG4gICAgICB9XG5cbiAgICAgIHJldHVybiBvdXRwdXQ7XG4gICAgfSk7XG4gIH1cblxuICBnZXRDb25maWcoKTogc2VyaWFsaXphdGlvbi5Db25maWdEaWN0IHtcbiAgICBjb25zdCBjb25maWc6IHNlcmlhbGl6YXRpb24uQ29uZmlnRGljdCA9IHtcbiAgICAgIHVuaXRzOiB0aGlzLnVuaXRzLFxuICAgICAgYWN0aXZhdGlvbjogc2VyaWFsaXplQWN0aXZhdGlvbih0aGlzLmFjdGl2YXRpb24pLFxuICAgICAgdXNlQmlhczogdGhpcy51c2VCaWFzLFxuICAgICAga2VybmVsSW5pdGlhbGl6ZXI6IHNlcmlhbGl6ZUluaXRpYWxpemVyKHRoaXMua2VybmVsSW5pdGlhbGl6ZXIpLFxuICAgICAgYmlhc0luaXRpYWxpemVyOiBzZXJpYWxpemVJbml0aWFsaXplcih0aGlzLmJpYXNJbml0aWFsaXplciksXG4gICAgICBrZXJuZWxSZWd1bGFyaXplcjogc2VyaWFsaXplUmVndWxhcml6ZXIodGhpcy5rZXJuZWxSZWd1bGFyaXplciksXG4gICAgICBiaWFzUmVndWxhcml6ZXI6IHNlcmlhbGl6ZVJlZ3VsYXJpemVyKHRoaXMuYmlhc1JlZ3VsYXJpemVyKSxcbiAgICAgIGFjdGl2aXR5UmVndWxhcml6ZXI6IHNlcmlhbGl6ZVJlZ3VsYXJpemVyKHRoaXMuYWN0aXZpdHlSZWd1bGFyaXplciksXG4gICAgICBrZXJuZWxDb25zdHJhaW50OiBzZXJpYWxpemVDb25zdHJhaW50KHRoaXMua2VybmVsQ29uc3RyYWludCksXG4gICAgICBiaWFzQ29uc3RyYWludDogc2VyaWFsaXplQ29uc3RyYWludCh0aGlzLmJpYXNDb25zdHJhaW50KVxuICAgIH07XG4gICAgY29uc3QgYmFzZUNvbmZpZyA9IHN1cGVyLmdldENvbmZpZygpO1xuICAgIE9iamVjdC5hc3NpZ24oY29uZmlnLCBiYXNlQ29uZmlnKTtcbiAgICByZXR1cm4gY29uZmlnO1xuICB9XG59XG5zZXJpYWxpemF0aW9uLnJlZ2lzdGVyQ2xhc3MoRGVuc2UpO1xuXG5leHBvcnQgZGVjbGFyZSBpbnRlcmZhY2UgRmxhdHRlbkxheWVyQXJncyBleHRlbmRzIExheWVyQXJncyB7XG4gIC8qKiBJbWFnZSBkYXRhIGZvcm1hdDogY2hhbm5lbHNMYXN0IChkZWZhdWx0KSBvciBjaGFubmVsc0ZpcnN0LiAqL1xuICBkYXRhRm9ybWF0PzogRGF0YUZvcm1hdDtcbn1cblxuZXhwb3J0IGNsYXNzIEZsYXR0ZW4gZXh0ZW5kcyBMYXllciB7XG4gIHByaXZhdGUgZGF0YUZvcm1hdDogRGF0YUZvcm1hdDtcblxuICAvKiogQG5vY29sbGFwc2UgKi9cbiAgc3RhdGljIGNsYXNzTmFtZSA9ICdGbGF0dGVuJztcbiAgY29uc3RydWN0b3IoYXJncz86IEZsYXR0ZW5MYXllckFyZ3MpIHtcbiAgICBhcmdzID0gYXJncyB8fCB7fTtcbiAgICBzdXBlcihhcmdzKTtcbiAgICB0aGlzLmlucHV0U3BlYyA9IFt7bWluTkRpbTogM31dO1xuICAgIHRoaXMuZGF0YUZvcm1hdCA9IGFyZ3MuZGF0YUZvcm1hdDtcbiAgfVxuXG4gIGNvbXB1dGVPdXRwdXRTaGFwZShpbnB1dFNoYXBlOiBTaGFwZXxTaGFwZVtdKTogU2hhcGV8U2hhcGVbXSB7XG4gICAgaW5wdXRTaGFwZSA9IGdldEV4YWN0bHlPbmVTaGFwZShpbnB1dFNoYXBlKTtcbiAgICBmb3IgKGNvbnN0IGRpbSBvZiBpbnB1dFNoYXBlLnNsaWNlKDEpKSB7XG4gICAgICBpZiAoZGltID09IG51bGwpIHtcbiAgICAgICAgdGhyb3cgbmV3IFZhbHVlRXJyb3IoXG4gICAgICAgICAgICBgVGhlIHNoYXBlIG9mIHRoZSBpbnB1dCB0byBcIkZsYXR0ZW5cIiBpcyBub3QgZnVsbHkgZGVmaW5lZCBgICtcbiAgICAgICAgICAgIGAoZ290ICR7aW5wdXRTaGFwZS5zbGljZSgxKX0pLiBNYWtlIHN1cmUgdG8gcGFzcyBhIGNvbXBsZXRlIGAgK1xuICAgICAgICAgICAgYFwiaW5wdXRfc2hhcGVcIiBvciBcImJhdGNoX2lucHV0X3NoYXBlXCIgYXJndW1lbnQgdG8gdGhlIGZpcnN0IGAgK1xuICAgICAgICAgICAgYGxheWVyIGluIHlvdXIgbW9kZWwuYCk7XG4gICAgICB9XG4gICAgfVxuICAgIHJldHVybiBbaW5wdXRTaGFwZVswXSwgYXJyYXlQcm9kKGlucHV0U2hhcGUsIDEpXTtcbiAgfVxuXG4gIGNhbGwoaW5wdXRzOiBUZW5zb3J8VGVuc29yW10sIGt3YXJnczogS3dhcmdzKTogVGVuc29yfFRlbnNvcltdIHtcbiAgICByZXR1cm4gdGlkeSgoKSA9PiB7XG4gICAgICB0aGlzLmludm9rZUNhbGxIb29rKGlucHV0cywga3dhcmdzKTtcblxuICAgICAgbGV0IGlucHV0ID0gZ2V0RXhhY3RseU9uZVRlbnNvcihpbnB1dHMpO1xuICAgICAgaWYgKHRoaXMuZGF0YUZvcm1hdCA9PT0gJ2NoYW5uZWxzRmlyc3QnICYmIGlucHV0LnJhbmsgPiAxKSB7XG4gICAgICAgIGNvbnN0IHBlcm11dGF0aW9uOiBudW1iZXJbXSA9IFswXTtcbiAgICAgICAgZm9yIChsZXQgaSA9IDI7IGkgPCBpbnB1dC5yYW5rOyArK2kpIHtcbiAgICAgICAgICBwZXJtdXRhdGlvbi5wdXNoKGkpO1xuICAgICAgICB9XG4gICAgICAgIHBlcm11dGF0aW9uLnB1c2goMSk7XG4gICAgICAgIGlucHV0ID0gdHJhbnNwb3NlKGlucHV0LCBwZXJtdXRhdGlvbik7XG4gICAgICB9XG5cbiAgICAgIHJldHVybiBLLmJhdGNoRmxhdHRlbihpbnB1dCk7XG4gICAgfSk7XG4gIH1cblxuICBnZXRDb25maWcoKTogc2VyaWFsaXphdGlvbi5Db25maWdEaWN0IHtcbiAgICBjb25zdCBjb25maWc6IHNlcmlhbGl6YXRpb24uQ29uZmlnRGljdCA9IHt9O1xuICAgIGlmICh0aGlzLmRhdGFGb3JtYXQgIT0gbnVsbCkge1xuICAgICAgY29uZmlnWydkYXRhRm9ybWF0J10gPSB0aGlzLmRhdGFGb3JtYXQ7XG4gICAgfVxuICAgIGNvbnN0IGJhc2VDb25maWcgPSBzdXBlci5nZXRDb25maWcoKTtcbiAgICBPYmplY3QuYXNzaWduKGNvbmZpZywgYmFzZUNvbmZpZyk7XG4gICAgcmV0dXJuIGNvbmZpZztcbiAgfVxufVxuc2VyaWFsaXphdGlvbi5yZWdpc3RlckNsYXNzKEZsYXR0ZW4pO1xuXG5leHBvcnQgZGVjbGFyZSBpbnRlcmZhY2UgQWN0aXZhdGlvbkxheWVyQXJncyBleHRlbmRzIExheWVyQXJncyB7XG4gIC8qKlxuICAgKiBOYW1lIG9mIHRoZSBhY3RpdmF0aW9uIGZ1bmN0aW9uIHRvIHVzZS5cbiAgICovXG4gIGFjdGl2YXRpb246IEFjdGl2YXRpb25JZGVudGlmaWVyO1xufVxuXG5leHBvcnQgY2xhc3MgQWN0aXZhdGlvbiBleHRlbmRzIExheWVyIHtcbiAgLyoqIEBub2NvbGxhcHNlICovXG4gIHN0YXRpYyBjbGFzc05hbWUgPSAnQWN0aXZhdGlvbic7XG4gIGFjdGl2YXRpb246IEFjdGl2YXRpb25GbjtcblxuICBjb25zdHJ1Y3RvcihhcmdzOiBBY3RpdmF0aW9uTGF5ZXJBcmdzKSB7XG4gICAgc3VwZXIoYXJncyk7XG4gICAgdGhpcy5zdXBwb3J0c01hc2tpbmcgPSB0cnVlO1xuICAgIHRoaXMuYWN0aXZhdGlvbiA9IGdldEFjdGl2YXRpb24oYXJncy5hY3RpdmF0aW9uKTtcbiAgfVxuXG4gIGNhbGwoaW5wdXRzOiBUZW5zb3J8VGVuc29yW10sIGt3YXJnczogS3dhcmdzKTogVGVuc29yfFRlbnNvcltdIHtcbiAgICByZXR1cm4gdGlkeSgoKSA9PiB7XG4gICAgICB0aGlzLmludm9rZUNhbGxIb29rKGlucHV0cywga3dhcmdzKTtcbiAgICAgIGNvbnN0IGlucHV0ID0gZ2V0RXhhY3RseU9uZVRlbnNvcihpbnB1dHMpO1xuICAgICAgcmV0dXJuIHRoaXMuYWN0aXZhdGlvbi5hcHBseShpbnB1dCk7XG4gICAgfSk7XG4gIH1cblxuICBnZXRDb25maWcoKTogc2VyaWFsaXphdGlvbi5Db25maWdEaWN0IHtcbiAgICBjb25zdCBjb25maWcgPSB7YWN0aXZhdGlvbjogc2VyaWFsaXplQWN0aXZhdGlvbih0aGlzLmFjdGl2YXRpb24pfTtcbiAgICBjb25zdCBiYXNlQ29uZmlnID0gc3VwZXIuZ2V0Q29uZmlnKCk7XG4gICAgT2JqZWN0LmFzc2lnbihjb25maWcsIGJhc2VDb25maWcpO1xuICAgIHJldHVybiBjb25maWc7XG4gIH1cbn1cbnNlcmlhbGl6YXRpb24ucmVnaXN0ZXJDbGFzcyhBY3RpdmF0aW9uKTtcblxuZXhwb3J0IGRlY2xhcmUgaW50ZXJmYWNlIFJlc2hhcGVMYXllckFyZ3MgZXh0ZW5kcyBMYXllckFyZ3Mge1xuICAvKiogVGhlIHRhcmdldCBzaGFwZS4gRG9lcyBub3QgaW5jbHVkZSB0aGUgYmF0Y2ggYXhpcy4gKi9cbiAgdGFyZ2V0U2hhcGU6IFNoYXBlO1xufVxuXG5leHBvcnQgZGVjbGFyZSBpbnRlcmZhY2UgUmVwZWF0VmVjdG9yTGF5ZXJBcmdzIGV4dGVuZHMgTGF5ZXJBcmdzIHtcbiAgLyoqXG4gICAqIFRoZSBpbnRlZ2VyIG51bWJlciBvZiB0aW1lcyB0byByZXBlYXQgdGhlIGlucHV0LlxuICAgKi9cbiAgbjogbnVtYmVyO1xufVxuXG5leHBvcnQgY2xhc3MgUmVwZWF0VmVjdG9yIGV4dGVuZHMgTGF5ZXIge1xuICAvKiogQG5vY29sbGFwc2UgKi9cbiAgc3RhdGljIGNsYXNzTmFtZSA9ICdSZXBlYXRWZWN0b3InO1xuICByZWFkb25seSBuOiBudW1iZXI7XG5cbiAgY29uc3RydWN0b3IoYXJnczogUmVwZWF0VmVjdG9yTGF5ZXJBcmdzKSB7XG4gICAgc3VwZXIoYXJncyk7XG4gICAgdGhpcy5uID0gYXJncy5uO1xuICAgIHRoaXMuaW5wdXRTcGVjID0gW3tuZGltOiAyfV07XG4gIH1cblxuICBjb21wdXRlT3V0cHV0U2hhcGUoaW5wdXRTaGFwZTogU2hhcGUpOiBTaGFwZSB7XG4gICAgcmV0dXJuIFtpbnB1dFNoYXBlWzBdLCB0aGlzLm4sIGlucHV0U2hhcGVbMV1dO1xuICB9XG5cbiAgY2FsbChpbnB1dHM6IFRlbnNvcnxUZW5zb3JbXSwga3dhcmdzOiBLd2FyZ3MpOiBUZW5zb3J8VGVuc29yW10ge1xuICAgIHJldHVybiB0aWR5KCgpID0+IHtcbiAgICAgIGlucHV0cyA9IGdldEV4YWN0bHlPbmVUZW5zb3IoaW5wdXRzKTtcbiAgICAgIHJldHVybiBLLnJlcGVhdChpbnB1dHMsIHRoaXMubik7XG4gICAgfSk7XG4gIH1cblxuICBnZXRDb25maWcoKTogc2VyaWFsaXphdGlvbi5Db25maWdEaWN0IHtcbiAgICBjb25zdCBjb25maWcgPSB7XG4gICAgICBuOiB0aGlzLm4sXG4gICAgfTtcbiAgICBjb25zdCBiYXNlQ29uZmlnID0gc3VwZXIuZ2V0Q29uZmlnKCk7XG4gICAgT2JqZWN0LmFzc2lnbihjb25maWcsIGJhc2VDb25maWcpO1xuICAgIHJldHVybiBjb25maWc7XG4gIH1cbn1cbnNlcmlhbGl6YXRpb24ucmVnaXN0ZXJDbGFzcyhSZXBlYXRWZWN0b3IpO1xuXG5leHBvcnQgY2xhc3MgUmVzaGFwZSBleHRlbmRzIExheWVyIHtcbiAgLyoqIEBub2NvbGxhcHNlICovXG4gIHN0YXRpYyBjbGFzc05hbWUgPSAnUmVzaGFwZSc7XG4gIHByaXZhdGUgdGFyZ2V0U2hhcGU6IFNoYXBlO1xuXG4gIGNvbnN0cnVjdG9yKGFyZ3M6IFJlc2hhcGVMYXllckFyZ3MpIHtcbiAgICBzdXBlcihhcmdzKTtcbiAgICB0aGlzLnRhcmdldFNoYXBlID0gYXJncy50YXJnZXRTaGFwZTtcblxuICAgIC8vIE1ha2Ugc3VyZSB0aGF0IGFsbCB1bmtub3duIGRpbWVuc2lvbnMgYXJlIHJlcHJlc2VudGVkIGFzIGBudWxsYC5cbiAgICBmb3IgKGxldCBpID0gMDsgaSA8IHRoaXMudGFyZ2V0U2hhcGUubGVuZ3RoOyArK2kpIHtcbiAgICAgIGlmICh0aGlzLmlzVW5rbm93bih0aGlzLnRhcmdldFNoYXBlW2ldKSkge1xuICAgICAgICB0aGlzLnRhcmdldFNoYXBlW2ldID0gbnVsbDtcbiAgICAgIH1cbiAgICB9XG4gIH1cblxuICBwcml2YXRlIGlzVW5rbm93bihkaW06IG51bWJlcik6IGJvb2xlYW4ge1xuICAgIHJldHVybiBkaW0gPCAwIHx8IGRpbSA9PSBudWxsO1xuICB9XG5cbiAgLyoqXG4gICAqIEZpbmRzIGFuZCByZXBsYWNlcyBhIG1pc3NpbmcgZGltZW5zaW9uIGluIG91dHB1dCBzaGFwZS5cbiAgICpcbiAgICogVGhpcyBpcyBhIG5lYXIgZGlyZWN0IHBvcnQgb2YgdGhlIGludGVybmFsIE51bXB5IGZ1bmN0aW9uXG4gICAqIGBfZml4X3Vua25vd25fZGltZW5zaW9uYCBpbiBgbnVtcHkvY29yZS9zcmMvbXVsdGlhcnJheS9zaGFwZS5jYC5cbiAgICpcbiAgICogQHBhcmFtIGlucHV0U2hhcGU6IE9yaWdpbmFsIHNoYXBlIG9mIGFycmF5IGJlZ2luIHJlc2hhcGUuXG4gICAqIEBwYXJhbSBvdXRwdXRTaGFwZTogVGFyZ2V0IHNoYXBlIG9mIHRoZSBhcnJheSwgd2l0aCBhdCBtb3N0IGEgc2luZ2xlXG4gICAqIGBudWxsYCBvciBuZWdhdGl2ZSBudW1iZXIsIHdoaWNoIGluZGljYXRlcyBhbiB1bmRlcmRldGVybWluZWQgZGltZW5zaW9uXG4gICAqIHRoYXQgc2hvdWxkIGJlIGRlcml2ZWQgZnJvbSBgaW5wdXRTaGFwZWAgYW5kIHRoZSBrbm93biBkaW1lbnNpb25zIG9mXG4gICAqICAgYG91dHB1dFNoYXBlYC5cbiAgICogQHJldHVybnM6IFRoZSBvdXRwdXQgc2hhcGUgd2l0aCBgbnVsbGAgcmVwbGFjZWQgd2l0aCBpdHMgY29tcHV0ZWQgdmFsdWUuXG4gICAqIEB0aHJvd3M6IFZhbHVlRXJyb3I6IElmIGBpbnB1dFNoYXBlYCBhbmQgYG91dHB1dFNoYXBlYCBkbyBub3QgbWF0Y2guXG4gICAqL1xuICBwcml2YXRlIGZpeFVua25vd25EaW1lbnNpb24oaW5wdXRTaGFwZTogU2hhcGUsIG91dHB1dFNoYXBlOiBTaGFwZSk6IFNoYXBlIHtcbiAgICBjb25zdCBlcnJvck1zZyA9ICdUb3RhbCBzaXplIG9mIG5ldyBhcnJheSBtdXN0IGJlIHVuY2hhbmdlZC4nO1xuICAgIGNvbnN0IGZpbmFsU2hhcGUgPSBvdXRwdXRTaGFwZS5zbGljZSgpO1xuICAgIGxldCBrbm93biA9IDE7XG4gICAgbGV0IHVua25vd24gPSBudWxsO1xuICAgIGZvciAobGV0IGkgPSAwOyBpIDwgZmluYWxTaGFwZS5sZW5ndGg7ICsraSkge1xuICAgICAgY29uc3QgZGltID0gZmluYWxTaGFwZVtpXTtcbiAgICAgIGlmICh0aGlzLmlzVW5rbm93bihkaW0pKSB7XG4gICAgICAgIGlmICh1bmtub3duID09PSBudWxsKSB7XG4gICAgICAgICAgdW5rbm93biA9IGk7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgdGhyb3cgbmV3IFZhbHVlRXJyb3IoJ0NhbiBvbmx5IHNwZWNpZml5IG9uZSB1bmtub3duIGRpbWVuc2lvbi4nKTtcbiAgICAgICAgfVxuICAgICAgfSBlbHNlIHtcbiAgICAgICAga25vd24gKj0gZGltO1xuICAgICAgfVxuICAgIH1cblxuICAgIGNvbnN0IG9yaWdpbmFsU2l6ZSA9IGFycmF5UHJvZChpbnB1dFNoYXBlKTtcbiAgICBpZiAodW5rbm93biAhPT0gbnVsbCkge1xuICAgICAgaWYgKGtub3duID09PSAwIHx8IG9yaWdpbmFsU2l6ZSAlIGtub3duICE9PSAwKSB7XG4gICAgICAgIHRocm93IG5ldyBWYWx1ZUVycm9yKGVycm9yTXNnKTtcbiAgICAgIH1cbiAgICAgIGZpbmFsU2hhcGVbdW5rbm93bl0gPSBvcmlnaW5hbFNpemUgLyBrbm93bjtcbiAgICB9IGVsc2UgaWYgKG9yaWdpbmFsU2l6ZSAhPT0ga25vd24pIHtcbiAgICAgIHRocm93IG5ldyBWYWx1ZUVycm9yKGVycm9yTXNnKTtcbiAgICB9XG5cbiAgICByZXR1cm4gZmluYWxTaGFwZTtcbiAgfVxuXG4gIGNvbXB1dGVPdXRwdXRTaGFwZShpbnB1dFNoYXBlOiBTaGFwZSk6IFNoYXBlIHtcbiAgICBsZXQgYW55VW5rbm93bkRpbXMgPSBmYWxzZTtcbiAgICBmb3IgKGxldCBpID0gMDsgaSA8IGlucHV0U2hhcGUubGVuZ3RoOyArK2kpIHtcbiAgICAgIGlmICh0aGlzLmlzVW5rbm93bihpbnB1dFNoYXBlW2ldKSkge1xuICAgICAgICBhbnlVbmtub3duRGltcyA9IHRydWU7XG4gICAgICAgIGJyZWFrO1xuICAgICAgfVxuICAgIH1cblxuICAgIGlmIChhbnlVbmtub3duRGltcykge1xuICAgICAgcmV0dXJuIGlucHV0U2hhcGUuc2xpY2UoMCwgMSkuY29uY2F0KHRoaXMudGFyZ2V0U2hhcGUpO1xuICAgIH0gZWxzZSB7XG4gICAgICByZXR1cm4gaW5wdXRTaGFwZS5zbGljZSgwLCAxKS5jb25jYXQoXG4gICAgICAgICAgdGhpcy5maXhVbmtub3duRGltZW5zaW9uKGlucHV0U2hhcGUuc2xpY2UoMSksIHRoaXMudGFyZ2V0U2hhcGUpKTtcbiAgICB9XG4gIH1cblxuICBjYWxsKGlucHV0czogVGVuc29yfFRlbnNvcltdLCBrd2FyZ3M6IEt3YXJncyk6IFRlbnNvcnxUZW5zb3JbXSB7XG4gICAgcmV0dXJuIHRpZHkoKCkgPT4ge1xuICAgICAgdGhpcy5pbnZva2VDYWxsSG9vayhpbnB1dHMsIGt3YXJncyk7XG4gICAgICBjb25zdCBpbnB1dCA9IGdldEV4YWN0bHlPbmVUZW5zb3IoaW5wdXRzKTtcbiAgICAgIGNvbnN0IGlucHV0U2hhcGUgPSBpbnB1dC5zaGFwZTtcbiAgICAgIGNvbnN0IG91dHB1dFNoYXBlID0gaW5wdXRTaGFwZS5zbGljZSgwLCAxKS5jb25jYXQoXG4gICAgICAgICAgdGhpcy5maXhVbmtub3duRGltZW5zaW9uKGlucHV0U2hhcGUuc2xpY2UoMSksIHRoaXMudGFyZ2V0U2hhcGUpKTtcbiAgICAgIHJldHVybiByZXNoYXBlKGlucHV0LCBvdXRwdXRTaGFwZSk7XG4gICAgfSk7XG4gIH1cblxuICBnZXRDb25maWcoKTogc2VyaWFsaXphdGlvbi5Db25maWdEaWN0IHtcbiAgICBjb25zdCBjb25maWcgPSB7XG4gICAgICB0YXJnZXRTaGFwZTogdGhpcy50YXJnZXRTaGFwZSxcbiAgICB9O1xuICAgIGNvbnN0IGJhc2VDb25maWcgPSBzdXBlci5nZXRDb25maWcoKTtcbiAgICBPYmplY3QuYXNzaWduKGNvbmZpZywgYmFzZUNvbmZpZyk7XG4gICAgcmV0dXJuIGNvbmZpZztcbiAgfVxufVxuc2VyaWFsaXphdGlvbi5yZWdpc3RlckNsYXNzKFJlc2hhcGUpO1xuXG5leHBvcnQgZGVjbGFyZSBpbnRlcmZhY2UgUGVybXV0ZUxheWVyQXJncyBleHRlbmRzIExheWVyQXJncyB7XG4gIC8qKlxuICAgKiBBcnJheSBvZiBpbnRlZ2Vycy4gUGVybXV0YXRpb24gcGF0dGVybi4gRG9lcyBub3QgaW5jbHVkZSB0aGVcbiAgICogc2FtcGxlIChiYXRjaCkgZGltZW5zaW9uLiBJbmRleCBzdGFydHMgYXQgMS5cbiAgICogRm9yIGluc3RhbmNlLCBgWzIsIDFdYCBwZXJtdXRlcyB0aGUgZmlyc3QgYW5kIHNlY29uZCBkaW1lbnNpb25zXG4gICAqIG9mIHRoZSBpbnB1dC5cbiAgICovXG4gIGRpbXM6IG51bWJlcltdO1xufVxuXG5leHBvcnQgY2xhc3MgUGVybXV0ZSBleHRlbmRzIExheWVyIHtcbiAgLyoqIEBub2NvbGxhcHNlICovXG4gIHN0YXRpYyBjbGFzc05hbWUgPSAnUGVybXV0ZSc7XG4gIHJlYWRvbmx5IGRpbXM6IG51bWJlcltdO1xuICBwcml2YXRlIHJlYWRvbmx5IGRpbXNJbmNsdWRpbmdCYXRjaDogbnVtYmVyW107XG5cbiAgY29uc3RydWN0b3IoYXJnczogUGVybXV0ZUxheWVyQXJncykge1xuICAgIHN1cGVyKGFyZ3MpO1xuICAgIGlmIChhcmdzLmRpbXMgPT0gbnVsbCkge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKFxuICAgICAgICAgICdSZXF1aXJlZCBjb25maWd1cmF0aW9uIGZpZWxkIGBkaW1zYCBpcyBtaXNzaW5nIGR1cmluZyBQZXJtdXRlICcgK1xuICAgICAgICAgICdjb25zdHJ1Y3RvciBjYWxsLicpO1xuICAgIH1cbiAgICBpZiAoIUFycmF5LmlzQXJyYXkoYXJncy5kaW1zKSkge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKFxuICAgICAgICAgICdQZXJtdXRlIGNvbnN0cnVjdG9yIHJlcXVpcmVzIGBkaW1zYCB0byBiZSBhbiBBcnJheSwgYnV0IHJlY2VpdmVkICcgK1xuICAgICAgICAgIGAke2FyZ3MuZGltc30gaW5zdGVhZC5gKTtcbiAgICB9XG5cbiAgICAvLyBDaGVjayB0aGUgdmFsaWRpdHkgb2YgdGhlIHBlcm11dGF0aW9uIGluZGljZXMuXG4gICAgY29uc3QgZXhwZWN0ZWRTb3J0ZWRJbmRpY2VzID0gcmFuZ2UoMSwgYXJncy5kaW1zLmxlbmd0aCArIDEpO1xuICAgIGlmICghdXRpbC5hcnJheXNFcXVhbChhcmdzLmRpbXMuc2xpY2UoKS5zb3J0KCksIGV4cGVjdGVkU29ydGVkSW5kaWNlcykpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcihcbiAgICAgICAgICAnSW52YWxpZCBwZXJtdXRhdGlvbiBgZGltc2A6ICcgKyBKU09OLnN0cmluZ2lmeShhcmdzLmRpbXMpICtcbiAgICAgICAgICAnIGBkaW1zYCBtdXN0IGNvbnRhaW4gY29uc2VjdXRpdmUgaW50ZWdlcnMgc3RhcnRpbmcgZnJvbSAxLicpO1xuICAgIH1cblxuICAgIHRoaXMuZGltcyA9IGFyZ3MuZGltcztcbiAgICB0aGlzLmRpbXNJbmNsdWRpbmdCYXRjaCA9IFswXS5jb25jYXQodGhpcy5kaW1zKTtcbiAgICB0aGlzLmlucHV0U3BlYyA9IFtuZXcgSW5wdXRTcGVjKHtuZGltOiB0aGlzLmRpbXMubGVuZ3RoICsgMX0pXTtcbiAgfVxuXG4gIGNvbXB1dGVPdXRwdXRTaGFwZShpbnB1dFNoYXBlOiBTaGFwZXxTaGFwZVtdKTogU2hhcGV8U2hhcGVbXSB7XG4gICAgaW5wdXRTaGFwZSA9IGdldEV4YWN0bHlPbmVTaGFwZShpbnB1dFNoYXBlKTtcbiAgICBjb25zdCBvdXRwdXRTaGFwZSA9IGlucHV0U2hhcGUuc2xpY2UoKTtcbiAgICB0aGlzLmRpbXMuZm9yRWFjaCgoZGltOiBudW1iZXIsIGk6IG51bWJlcikgPT4ge1xuICAgICAgb3V0cHV0U2hhcGVbaSArIDFdID0gKGlucHV0U2hhcGUgYXMgU2hhcGUpW2RpbV07XG4gICAgfSk7XG4gICAgcmV0dXJuIG91dHB1dFNoYXBlO1xuICB9XG5cbiAgY2FsbChpbnB1dHM6IFRlbnNvcnxUZW5zb3JbXSwga3dhcmdzOiBLd2FyZ3MpOiBUZW5zb3J8VGVuc29yW10ge1xuICAgIHJldHVybiB0cmFuc3Bvc2UoZ2V0RXhhY3RseU9uZVRlbnNvcihpbnB1dHMpLCB0aGlzLmRpbXNJbmNsdWRpbmdCYXRjaCk7XG4gIH1cblxuICBnZXRDb25maWcoKTogc2VyaWFsaXphdGlvbi5Db25maWdEaWN0IHtcbiAgICBjb25zdCBjb25maWcgPSB7XG4gICAgICBkaW1zOiB0aGlzLmRpbXMsXG4gICAgfTtcbiAgICBjb25zdCBiYXNlQ29uZmlnID0gc3VwZXIuZ2V0Q29uZmlnKCk7XG4gICAgT2JqZWN0LmFzc2lnbihjb25maWcsIGJhc2VDb25maWcpO1xuICAgIHJldHVybiBjb25maWc7XG4gIH1cbn1cbnNlcmlhbGl6YXRpb24ucmVnaXN0ZXJDbGFzcyhQZXJtdXRlKTtcblxuZXhwb3J0IGRlY2xhcmUgaW50ZXJmYWNlIE1hc2tpbmdBcmdzIGV4dGVuZHMgTGF5ZXJBcmdzIHtcbiAgLyoqXG4gICAqIE1hc2tpbmcgVmFsdWUuIERlZmF1bHRzIHRvIGAwLjBgLlxuICAgKi9cbiAgbWFza1ZhbHVlPzogbnVtYmVyO1xufVxuXG5leHBvcnQgY2xhc3MgTWFza2luZyBleHRlbmRzIExheWVyIHtcbiAgLyoqIEBub2NvbGxhcHNlICovXG4gIHN0YXRpYyBjbGFzc05hbWUgPSAnTWFza2luZyc7XG4gIG1hc2tWYWx1ZTogbnVtYmVyO1xuXG4gIGNvbnN0cnVjdG9yKGFyZ3M/OiBNYXNraW5nQXJncykge1xuICAgIHN1cGVyKGFyZ3MgPT0gbnVsbCA/IHt9IDogYXJncyk7XG4gICAgdGhpcy5zdXBwb3J0c01hc2tpbmcgPSB0cnVlO1xuICAgIGlmIChhcmdzICE9IG51bGwpIHtcbiAgICAgIHRoaXMubWFza1ZhbHVlID0gYXJncy5tYXNrVmFsdWUgPT0gbnVsbCA/IDAgOiBhcmdzLm1hc2tWYWx1ZTtcbiAgICB9IGVsc2Uge1xuICAgICAgdGhpcy5tYXNrVmFsdWUgPSAwO1xuICAgIH1cbiAgfVxuXG4gIGNvbXB1dGVPdXRwdXRTaGFwZShpbnB1dFNoYXBlOiBTaGFwZXxTaGFwZVtdKTogU2hhcGV8U2hhcGVbXSB7XG4gICAgcmV0dXJuIGlucHV0U2hhcGU7XG4gIH1cblxuICBnZXRDb25maWcoKSB7XG4gICAgY29uc3QgYmFzZUNvbmZpZyA9IHN1cGVyLmdldENvbmZpZygpO1xuICAgIGNvbnN0IGNvbmZpZyA9IHttYXNrVmFsdWU6IHRoaXMubWFza1ZhbHVlfTtcbiAgICBPYmplY3QuYXNzaWduKGNvbmZpZywgYmFzZUNvbmZpZyk7XG4gICAgcmV0dXJuIGNvbmZpZztcbiAgfVxuXG4gIGNvbXB1dGVNYXNrKGlucHV0czogVGVuc29yfFRlbnNvcltdLCBtYXNrPzogVGVuc29yfFRlbnNvcltdKTogVGVuc29yIHtcbiAgICBjb25zdCBpbnB1dCA9IGdldEV4YWN0bHlPbmVUZW5zb3IoaW5wdXRzKTtcbiAgICBjb25zdCBheGlzID0gLTE7XG4gICAgcmV0dXJuIGFueShub3RFcXVhbChpbnB1dCwgdGhpcy5tYXNrVmFsdWUpLCBheGlzKTtcbiAgfVxuXG4gIGNhbGwoaW5wdXRzOiBUZW5zb3J8VGVuc29yW10sIGt3YXJnczogS3dhcmdzKTogVGVuc29yfFRlbnNvcltdIHtcbiAgICByZXR1cm4gdGlkeSgoKSA9PiB7XG4gICAgICB0aGlzLmludm9rZUNhbGxIb29rKGlucHV0cywga3dhcmdzKTtcbiAgICAgIGNvbnN0IGlucHV0ID0gZ2V0RXhhY3RseU9uZVRlbnNvcihpbnB1dHMpO1xuICAgICAgY29uc3QgYXhpcyA9IC0xO1xuICAgICAgY29uc3Qga2VlcERpbXMgPSB0cnVlO1xuICAgICAgY29uc3QgYm9vbGVhbk1hc2sgPSBhbnkobm90RXF1YWwoaW5wdXQsIHRoaXMubWFza1ZhbHVlKSwgYXhpcywga2VlcERpbXMpO1xuICAgICAgY29uc3Qgb3V0cHV0ID0gbXVsKGlucHV0LCBjYXN0KGJvb2xlYW5NYXNrLCBpbnB1dC5kdHlwZSkpO1xuICAgICAgcmV0dXJuIG91dHB1dDtcbiAgICB9KTtcbiAgfVxufVxuc2VyaWFsaXphdGlvbi5yZWdpc3RlckNsYXNzKE1hc2tpbmcpO1xuIl19","/**\n * @license\n * Copyright 2018 Google LLC\n *\n * Use of this source code is governed by an MIT-style\n * license that can be found in the LICENSE file or at\n * https://opensource.org/licenses/MIT.\n * =============================================================================\n */\n/**\n * TensorFlow.js Layers: Embedding Layer.\n *\n * Original source: keras/constraints.py\n */\nimport { notEqual, reshape, serialization, tidy, zerosLike } from '@tensorflow/tfjs-core';\nimport * as K from '../backend/tfjs_backend';\nimport { getConstraint, serializeConstraint } from '../constraints';\nimport { Layer } from '../engine/topology';\nimport { ValueError } from '../errors';\nimport { getInitializer, serializeInitializer } from '../initializers';\nimport { getRegularizer, serializeRegularizer } from '../regularizers';\nimport * as generic_utils from '../utils/generic_utils';\nimport { getExactlyOneShape, getExactlyOneTensor } from '../utils/types_utils';\nexport class Embedding extends Layer {\n constructor(args) {\n super(args);\n this.embeddings = null;\n this.DEFAULT_EMBEDDINGS_INITIALIZER = 'randomUniform';\n if (args.batchInputShape == null && args.inputShape == null) {\n // Porting Note: This logic is copied from Layer's constructor, since we\n // can't do exactly what the Python constructor does for Embedding().\n // Specifically, the super constructor can not be called after the\n // mutation of the `config` argument.\n let batchSize = null;\n if (args.batchSize != null) {\n batchSize = args.batchSize;\n }\n if (args.inputLength == null) {\n // Fix super-constructor to what it would have done if\n // 'config.inputShape' were (None, )\n this.batchInputShape = [batchSize, null];\n }\n else {\n // Fix super-constructor to what it would have done if\n // 'config.inputShape' were (config.inputLength, )\n this.batchInputShape =\n [batchSize].concat(generic_utils.toList(args.inputLength));\n }\n }\n this.inputDim = args.inputDim;\n generic_utils.assertPositiveInteger(this.inputDim, 'inputDim');\n this.outputDim = args.outputDim;\n generic_utils.assertPositiveInteger(this.outputDim, 'outputDim');\n this.embeddingsInitializer = getInitializer(args.embeddingsInitializer || this.DEFAULT_EMBEDDINGS_INITIALIZER);\n this.embeddingsRegularizer = getRegularizer(args.embeddingsRegularizer);\n this.activityRegularizer = getRegularizer(args.activityRegularizer);\n this.embeddingsConstraint = getConstraint(args.embeddingsConstraint);\n this.maskZero = args.maskZero;\n this.supportsMasking = args.maskZero;\n this.inputLength = args.inputLength;\n }\n build(inputShape) {\n this.embeddings = this.addWeight('embeddings', [this.inputDim, this.outputDim], this.dtype, this.embeddingsInitializer, this.embeddingsRegularizer, true, this.embeddingsConstraint);\n this.built = true;\n }\n // Override warnOnIncompatibleInputShape because an embedding layer allows\n // the input to have varying ranks.\n warnOnIncompatibleInputShape(inputShape) { }\n computeMask(inputs, mask) {\n return tidy(() => {\n if (!this.maskZero) {\n return null;\n }\n else {\n inputs = getExactlyOneTensor(inputs);\n return notEqual(inputs, zerosLike(inputs));\n }\n });\n }\n computeOutputShape(inputShape) {\n inputShape = getExactlyOneShape(inputShape);\n if (this.inputLength == null) {\n return [...inputShape, this.outputDim];\n }\n // inputLength can be an array if input is 3D or higher.\n const inLens = generic_utils.toList(this.inputLength);\n if (inLens.length !== inputShape.length - 1) {\n throw new ValueError(`\"inputLength\" is ${this.inputLength}, but received ` +\n `input shape has shape ${inputShape}`);\n }\n else {\n let i = 0;\n for (let k = 0; k < inLens.length; ++k) {\n const s1 = inLens[k];\n const s2 = inputShape[k + 1];\n if ((s1 != null) && (s2 != null) && (s1 !== s2)) {\n throw new ValueError(`\"inputLength\" is ${this.inputLength}, but received ` +\n `input shape has shape ${inputShape}`);\n }\n else if (s1 == null) {\n inLens[i] = s2;\n }\n i++;\n }\n }\n return [inputShape[0], ...inLens, this.outputDim];\n }\n call(inputs, kwargs) {\n return tidy(() => {\n this.invokeCallHook(inputs, kwargs);\n // Embedding layer accepts only a single input.\n let input = getExactlyOneTensor(inputs);\n if (input.dtype !== 'int32') {\n input = K.cast(input, 'int32');\n }\n const output = K.gather(this.embeddings.read(), reshape(input, [input.size]));\n return reshape(output, getExactlyOneShape(this.computeOutputShape(input.shape)));\n });\n }\n getConfig() {\n const config = {\n inputDim: this.inputDim,\n outputDim: this.outputDim,\n embeddingsInitializer: serializeInitializer(this.embeddingsInitializer),\n embeddingsRegularizer: serializeRegularizer(this.embeddingsRegularizer),\n activityRegularizer: serializeRegularizer(this.activityRegularizer),\n embeddingsConstraint: serializeConstraint(this.embeddingsConstraint),\n maskZero: this.maskZero,\n inputLength: this.inputLength\n };\n const baseConfig = super.getConfig();\n Object.assign(config, baseConfig);\n return config;\n }\n}\n/** @nocollapse */\nEmbedding.className = 'Embedding';\nserialization.registerClass(Embedding);\n//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZW1iZWRkaW5ncy5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uLy4uL3RmanMtbGF5ZXJzL3NyYy9sYXllcnMvZW1iZWRkaW5ncy50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQTs7Ozs7Ozs7R0FRRztBQUVIOzs7O0dBSUc7QUFDSCxPQUFPLEVBQUMsUUFBUSxFQUFFLE9BQU8sRUFBRSxhQUFhLEVBQVUsSUFBSSxFQUFFLFNBQVMsRUFBQyxNQUFNLHVCQUF1QixDQUFDO0FBRWhHLE9BQU8sS0FBSyxDQUFDLE1BQU0seUJBQXlCLENBQUM7QUFDN0MsT0FBTyxFQUFtQyxhQUFhLEVBQUUsbUJBQW1CLEVBQUMsTUFBTSxnQkFBZ0IsQ0FBQztBQUNwRyxPQUFPLEVBQUMsS0FBSyxFQUFZLE1BQU0sb0JBQW9CLENBQUM7QUFDcEQsT0FBTyxFQUFDLFVBQVUsRUFBQyxNQUFNLFdBQVcsQ0FBQztBQUNyQyxPQUFPLEVBQUMsY0FBYyxFQUFzQyxvQkFBb0IsRUFBQyxNQUFNLGlCQUFpQixDQUFDO0FBRXpHLE9BQU8sRUFBQyxjQUFjLEVBQXNDLG9CQUFvQixFQUFDLE1BQU0saUJBQWlCLENBQUM7QUFFekcsT0FBTyxLQUFLLGFBQWEsTUFBTSx3QkFBd0IsQ0FBQztBQUN4RCxPQUFPLEVBQUMsa0JBQWtCLEVBQUUsbUJBQW1CLEVBQUMsTUFBTSxzQkFBc0IsQ0FBQztBQWlEN0UsTUFBTSxPQUFPLFNBQVUsU0FBUSxLQUFLO0lBZ0JsQyxZQUFZLElBQXdCO1FBQ2xDLEtBQUssQ0FBQyxJQUFJLENBQUMsQ0FBQztRQVJOLGVBQVUsR0FBa0IsSUFBSSxDQUFDO1FBRWhDLG1DQUE4QixHQUNuQyxlQUFlLENBQUM7UUFNbEIsSUFBSSxJQUFJLENBQUMsZUFBZSxJQUFJLElBQUksSUFBSSxJQUFJLENBQUMsVUFBVSxJQUFJLElBQUksRUFBRTtZQUMzRCx3RUFBd0U7WUFDeEUscUVBQXFFO1lBQ3JFLGtFQUFrRTtZQUNsRSxxQ0FBcUM7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QUM7UUFDRixNQUFNLFVBQVUsR0FBRyxLQUFLLENBQUMsU0FBUyxFQUFFLENBQUM7UUFDckMsTUFBTSxDQUFDLE1BQU0sQ0FBQyxNQUFNLEVBQUUsVUFBVSxDQUFDLENBQUM7UUFDbEMsT0FBTyxNQUFNLENBQUM7SUFDaEIsQ0FBQzs7QUFwSUQsa0JBQWtCO0FBQ1gsbUJBQVMsR0FBRyxXQUFXLENBQUM7QUFxSWpDLGFBQWEsQ0FBQyxhQUFhLENBQUMsU0FBUyxDQUFDLENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyIvKipcbiAqIEBsaWNlbnNlXG4gKiBDb3B5cmlnaHQgMjAxOCBHb29nbGUgTExDXG4gKlxuICogVXNlIG9mIHRoaXMgc291cmNlIGNvZGUgaXMgZ292ZXJuZWQgYnkgYW4gTUlULXN0eWxlXG4gKiBsaWNlbnNlIHRoYXQgY2FuIGJlIGZvdW5kIGluIHRoZSBMSUNFTlNFIGZpbGUgb3IgYXRcbiAqIGh0dHBzOi8vb3BlbnNvdXJjZS5vcmcvbGljZW5zZXMvTUlULlxuICogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbiAqL1xuXG4vKipcbiAqIFRlbnNvckZsb3cuanMgTGF5ZXJzOiBFbWJlZGRpbmcgTGF5ZXIuXG4gKlxuICogT3JpZ2luYWwgc291cmNlOiBrZXJhcy9jb25zdHJhaW50cy5weVxuICovXG5pbXBvcnQge25vdEVxdWFsLCByZXNoYXBlLCBzZXJpYWxpemF0aW9uLCBUZW5zb3IsIHRpZHksIHplcm9zTGlrZX0gZnJvbSAnQHRlbnNvcmZsb3cvdGZqcy1jb3JlJztcblxuaW1wb3J0ICogYXMgSyBmcm9tICcuLi9iYWNrZW5kL3RmanNfYmFja2VuZCc7XG5pbXBvcnQge0NvbnN0cmFpbnQsIENvbnN0cmFpbnRJZGVudGlmaWVyLCBnZXRDb25zdHJhaW50LCBzZXJpYWxpemVDb25zdHJhaW50fSBmcm9tICcuLi9jb25zdHJhaW50cyc7XG5pbXBvcnQge0xheWVyLCBMYXllckFyZ3N9IGZyb20gJy4uL2VuZ2luZS90b3BvbG9neSc7XG5pbXBvcnQge1ZhbHVlRXJyb3J9IGZyb20gJy4uL2Vycm9ycyc7XG5pbXBvcnQge2dldEluaXRpYWxpemVyLCBJbml0aWFsaXplciwgSW5pdGlhbGl6ZXJJZGVudGlmaWVyLCBzZXJpYWxpemVJbml0aWFsaXplcn0gZnJvbSAnLi4vaW5pdGlhbGl6ZXJzJztcbmltcG9ydCB7U2hhcGV9IGZyb20gJy4uL2tlcmFzX2Zvcm1hdC9jb21tb24nO1xuaW1wb3J0IHtnZXRSZWd1bGFyaXplciwgUmVndWxhcml6ZXIsIFJlZ3VsYXJpemVySWRlbnRpZmllciwgc2VyaWFsaXplUmVndWxhcml6ZXJ9IGZyb20gJy4uL3JlZ3VsYXJpemVycyc7XG5pbXBvcnQge0t3YXJnc30gZnJvbSAnLi4vdHlwZXMnO1xuaW1wb3J0ICogYXMgZ2VuZXJpY191dGlscyBmcm9tICcuLi91dGlscy9nZW5lcmljX3V0aWxzJztcbmltcG9ydCB7Z2V0RXhhY3RseU9uZVNoYXBlLCBnZXRFeGFjdGx5T25lVGVuc29yfSBmcm9tICcuLi91dGlscy90eXBlc191dGlscyc7XG5pbXBvcnQge0xheWVyVmFyaWFibGV9IGZyb20gJy4uL3ZhcmlhYmxlcyc7XG5cbmV4cG9ydCBkZWNsYXJlIGludGVyZmFjZSBFbWJlZGRpbmdMYXllckFyZ3MgZXh0ZW5kcyBMYXllckFyZ3Mge1xuICAvKipcbiAgICogSW50ZWdlciA+IDAuIFNpemUgb2YgdGhlIHZvY2FidWxhcnksIGkuZS4gbWF4aW11bSBpbnRlZ2VyIGluZGV4ICsgMS5cbiAgICovXG4gIGlucHV0RGltOiBudW1iZXI7XG4gIC8qKlxuICAgKiBJbnRlZ2VyID49IDAuIERpbWVuc2lvbiBvZiB0aGUgZGVuc2UgZW1iZWRkaW5nLlxuICAgKi9cbiAgb3V0cHV0RGltOiBudW1iZXI7XG4gIC8qKlxuICAgKiBJbml0aWFsaXplciBmb3IgdGhlIGBlbWJlZGRpbmdzYCBtYXRyaXguXG4gICAqL1xuICBlbWJlZGRpbmdzSW5pdGlhbGl6ZXI/OiBJbml0aWFsaXplcklkZW50aWZpZXJ8SW5pdGlhbGl6ZXI7XG4gIC8qKlxuICAgKiBSZWd1bGFyaXplciBmdW5jdGlvbiBhcHBsaWVkIHRvIHRoZSBgZW1iZWRkaW5nc2AgbWF0cml4LlxuICAgKi9cbiAgZW1iZWRkaW5nc1JlZ3VsYXJpemVyPzogUmVndWxhcml6ZXJJZGVudGlmaWVyfFJlZ3VsYXJpemVyO1xuICAvKipcbiAgICogUmVndWxhcml6ZXIgZnVuY3Rpb24gYXBwbGllZCB0byB0aGUgYWN0aXZhdGlvbi5cbiAgICovXG4gIGFjdGl2aXR5UmVndWxhcml6ZXI/OiBSZWd1bGFyaXplcklkZW50aWZpZXJ8UmVndWxhcml6ZXI7XG4gIC8qKlxuICAgKiBDb25zdHJhaW50IGZ1bmN0aW9uIGFwcGxpZWQgdG8gdGhlIGBlbWJlZGRpbmdzYCBtYXRyaXguXG4gICAqL1xuICBlbWJlZGRpbmdzQ29uc3RyYWludD86IENvbnN0cmFpbnRJZGVudGlmaWVyfENvbnN0cmFpbnQ7XG4gIC8qKlxuICAgKiBXaGV0aGVyIHRoZSBpbnB1dCB2YWx1ZSAwIGlzIGEgc3BlY2lhbCBcInBhZGRpbmdcIiB2YWx1ZSB0aGF0IHNob3VsZCBiZVxuICAgKiBtYXNrZWQgb3V0LiBUaGlzIGlzIHVzZWZ1bCB3aGVuIHVzaW5nIHJlY3VycmVudCBsYXllcnMgd2hpY2ggbWF5IHRha2VcbiAgICogdmFyaWFibGUgbGVuZ3RoIGlucHV0LlxuICAgKlxuICAgKiBJZiB0aGlzIGlzIGBUcnVlYCB0aGVuIGFsbCBzdWJzZXF1ZW50IGxheWVycyBpbiB0aGUgbW9kZWwgbmVlZCB0byBzdXBwb3J0XG4gICAqIG1hc2tpbmcgb3IgYW4gZXhjZXB0aW9uIHdpbGwgYmUgcmFpc2VkLiBJZiBtYXNrWmVybyBpcyBzZXQgdG8gYFRydWVgLCBhcyBhXG4gICAqIGNvbnNlcXVlbmNlLCBpbmRleCAwIGNhbm5vdCBiZSB1c2VkIGluIHRoZSB2b2NhYnVsYXJ5IChpbnB1dERpbSBzaG91bGRcbiAgICogZXF1YWwgc2l6ZSBvZiB2b2NhYnVsYXJ5ICsgMSkuXG4gICAqL1xuICBtYXNrWmVybz86IGJvb2xlYW47XG4gIC8qKlxuICAgKiBMZW5ndGggb2YgaW5wdXQgc2VxdWVuY2VzLCB3aGVuIGl0IGlzIGNvbnN0YW50LlxuICAgKlxuICAgKiBUaGlzIGFyZ3VtZW50IGlzIHJlcXVpcmVkIGlmIHlvdSBhcmUgZ29pbmcgdG8gY29ubmVjdCBgZmxhdHRlbmAgdGhlblxuICAgKiBgZGVuc2VgIGxheWVycyB1cHN0cmVhbSAod2l0aG91dCBpdCwgdGhlIHNoYXBlIG9mIHRoZSBkZW5zZSBvdXRwdXRzIGNhbm5vdFxuICAgKiBiZSBjb21wdXRlZCkuXG4gICAqL1xuICBpbnB1dExlbmd0aD86IG51bWJlcnxudW1iZXJbXTtcbn1cblxuZXhwb3J0IGNsYXNzIEVtYmVkZGluZyBleHRlbmRzIExheWVyIHtcbiAgLyoqIEBub2NvbGxhcHNlICovXG4gIHN0YXRpYyBjbGFzc05hbWUgPSAnRW1iZWRkaW5nJztcbiAgcHJpdmF0ZSBpbnB1dERpbTogbnVtYmVyO1xuICBwcml2YXRlIG91dHB1dERpbTogbnVtYmVyO1xuICBwcml2YXRlIGVtYmVkZGluZ3NJbml0aWFsaXplcjogSW5pdGlhbGl6ZXI7XG4gIHByaXZhdGUgbWFza1plcm86IGJvb2xlYW47XG4gIHByaXZhdGUgaW5wdXRMZW5ndGg6IG51bWJlcnxudW1iZXJbXTtcblxuICBwcml2YXRlIGVtYmVkZGluZ3M6IExheWVyVmFyaWFibGUgPSBudWxsO1xuXG4gIHJlYWRvbmx5IERFRkFVTFRfRU1CRURESU5HU19JTklUSUFMSVpFUjogSW5pdGlhbGl6ZXJJZGVudGlmaWVyID1cbiAgICAgICdyYW5kb21Vbmlmb3JtJztcbiAgcHJpdmF0ZSByZWFkb25seSBlbWJlZGRpbmdzUmVndWxhcml6ZXI/OiBSZWd1bGFyaXplcjtcbiAgcHJpdmF0ZSByZWFkb25seSBlbWJlZGRpbmdzQ29uc3RyYWludD86IENvbnN0cmFpbnQ7XG5cbiAgY29uc3RydWN0b3IoYXJnczogRW1iZWRkaW5nTGF5ZXJBcmdzKSB7XG4gICAgc3VwZXIoYXJncyk7XG4gICAgaWYgKGFyZ3MuYmF0Y2hJbnB1dFNoYXBlID09IG51bGwgJiYgYXJncy5pbnB1dFNoYXBlID09IG51bGwpIHtcbiAgICAgIC8vIFBvcnRpbmcgTm90ZTogVGhpcyBsb2dpYyBpcyBjb3BpZWQgZnJvbSBMYXllcidzIGNvbnN0cnVjdG9yLCBzaW5jZSB3ZVxuICAgICAgLy8gY2FuJ3QgZG8gZXhhY3RseSB3aGF0IHRoZSBQeXRob24gY29uc3RydWN0b3IgZG9lcyBmb3IgRW1iZWRkaW5nKCkuXG4gICAgICAvLyBTcGVjaWZpY2FsbHksIHRoZSBzdXBlciBjb25zdHJ1Y3RvciBjYW4gbm90IGJlIGNhbGxlZCBhZnRlciB0aGVcbiAgICAgIC8vIG11dGF0aW9uIG9mIHRoZSBgY29uZmlnYCBhcmd1bWVudC5cbiAgICAgIGxldCBiYXRjaFNpemU6IG51bWJlciA9IG51bGw7XG4gICAgICBpZiAoYXJncy5iYXRjaFNpemUgIT0gbnVsbCkge1xuICAgICAgICBiYXRjaFNpemUgPSBhcmdzLmJhdGNoU2l6ZTtcbiAgICAgIH1cbiAgICAgIGlmIChhcmdzLmlucHV0TGVuZ3RoID09IG51bGwpIHtcbiAgICAgICAgLy8gRml4IHN1cGVyLWNvbnN0cnVjdG9yIHRvIHdoYXQgaXQgd291bGQgaGF2ZSBkb25lIGlmXG4gICAgICAgIC8vICdjb25maWcuaW5wdXRTaGFwZScgd2VyZSAoTm9uZSwgKVxuICAgICAgICB0aGlzLmJhdGNoSW5wdXRTaGFwZSA9IFtiYXRjaFNpemUsIG51bGxdO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgLy8gRml4IHN1cGVyLWNvbnN0cnVjdG9yIHRvIHdoYXQgaXQgd291bGQgaGF2ZSBkb25lIGlmXG4gICAgICAgIC8vICdjb25maWcuaW5wdXRTaGFwZScgd2VyZSAoY29uZmlnLmlucHV0TGVuZ3RoLCApXG4gICAgICAgIHRoaXMuYmF0Y2hJbnB1dFNoYXBlID1cbiAgICAgICAgICAgIFtiYXRjaFNpemVdLmNvbmNhdChnZW5lcmljX3V0aWxzLnRvTGlzdChhcmdzLmlucHV0TGVuZ3RoKSk7XG4gICAgICB9XG4gICAgfVxuICAgIHRoaXMuaW5wdXREaW0gPSBhcmdzLmlucHV0RGltO1xuICAgIGdlbmVyaWNfdXRpbHMuYXNzZXJ0UG9zaXRpdmVJbnRlZ2VyKHRoaXMuaW5wdXREaW0sICdpbnB1dERpbScpO1xuICAgIHRoaXMub3V0cHV0RGltID0gYXJncy5vdXRwdXREaW07XG4gICAgZ2VuZXJpY191dGlscy5hc3NlcnRQb3NpdGl2ZUludGVnZXIodGhpcy5vdXRwdXREaW0sICdvdXRwdXREaW0nKTtcbiAgICB0aGlzLmVtYmVkZGluZ3NJbml0aWFsaXplciA9IGdldEluaXRpYWxpemVyKFxuICAgICAgICBhcmdzLmVtYmVkZGluZ3NJbml0aWFsaXplciB8fCB0aGlzLkRFRkFVTFRfRU1CRURESU5HU19JTklUSUFMSVpFUik7XG4gICAgdGhpcy5lbWJlZGRpbmdzUmVndWxhcml6ZXIgPSBnZXRSZWd1bGFyaXplcihhcmdzLmVtYmVkZGluZ3NSZWd1bGFyaXplcik7XG4gICAgdGhpcy5hY3Rpdml0eVJlZ3VsYXJpemVyID0gZ2V0UmVndWxhcml6ZXIoYXJncy5hY3Rpdml0eVJlZ3VsYXJpemVyKTtcbiAgICB0aGlzLmVtYmVkZGluZ3NDb25zdHJhaW50ID0gZ2V0Q29uc3RyYWludChhcmdzLmVtYmVkZGluZ3NDb25zdHJhaW50KTtcbiAgICB0aGlzLm1hc2taZXJvID0gYXJncy5tYXNrWmVybztcbiAgICB0aGlzLnN1cHBvcnRzTWFza2luZyA9IGFyZ3MubWFza1plcm87XG4gICAgdGhpcy5pbnB1dExlbmd0aCA9IGFyZ3MuaW5wdXRMZW5ndGg7XG4gIH1cblxuICBwdWJsaWMgYnVpbGQoaW5wdXRTaGFwZTogU2hhcGV8U2hhcGVbXSk6IHZvaWQge1xuICAgIHRoaXMuZW1iZWRkaW5ncyA9IHRoaXMuYWRkV2VpZ2h0KFxuICAgICAgICAnZW1iZWRkaW5ncycsIFt0aGlzLmlucHV0RGltLCB0aGlzLm91dHB1dERpbV0sIHRoaXMuZHR5cGUsXG4gICAgICAgIHRoaXMuZW1iZWRkaW5nc0luaXRpYWxpemVyLCB0aGlzLmVtYmVkZGluZ3NSZWd1bGFyaXplciwgdHJ1ZSxcbiAgICAgICAgdGhpcy5lbWJlZGRpbmdzQ29uc3RyYWludCk7XG4gICAgdGhpcy5idWlsdCA9IHRydWU7XG4gIH1cblxuICAvLyBPdmVycmlkZSB3YXJuT25JbmNvbXBhdGlibGVJbnB1dFNoYXBlIGJlY2F1c2UgYW4gZW1iZWRkaW5nIGxheWVyIGFsbG93c1xuICAvLyB0aGUgaW5wdXQgdG8gaGF2ZSB2YXJ5aW5nIHJhbmtzLlxuICBwcm90ZWN0ZWQgd2Fybk9uSW5jb21wYXRpYmxlSW5wdXRTaGFwZShpbnB1dFNoYXBlOiBTaGFwZSkge31cblxuICBjb21wdXRlTWFzayhpbnB1dHM6IFRlbnNvcnxUZW5zb3JbXSwgbWFzaz86IFRlbnNvcnxUZW5zb3JbXSk6IFRlbnNvciB7XG4gICAgcmV0dXJuIHRpZHkoKCkgPT4ge1xuICAgICAgaWYgKCF0aGlzLm1hc2taZXJvKSB7XG4gICAgICAgIHJldHVybiBudWxsO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgaW5wdXRzID0gZ2V0RXhhY3RseU9uZVRlbnNvcihpbnB1dHMpO1xuICAgICAgICByZXR1cm4gbm90RXF1YWwoaW5wdXRzLCB6ZXJvc0xpa2UoaW5wdXRzKSk7XG4gICAgICB9XG4gICAgfSk7XG4gIH1cblxuICBjb21wdXRlT3V0cHV0U2hhcGUoaW5wdXRTaGFwZTogU2hhcGV8U2hhcGVbXSk6IFNoYXBlfFNoYXBlW10ge1xuICAgIGlucHV0U2hhcGUgPSBnZXRFeGFjdGx5T25lU2hhcGUoaW5wdXRTaGFwZSk7XG4gICAgaWYgKHRoaXMuaW5wdXRMZW5ndGggPT0gbnVsbCkge1xuICAgICAgcmV0dXJuIFsuLi5pbnB1dFNoYXBlLCB0aGlzLm91dHB1dERpbV07XG4gICAgfVxuICAgIC8vIGlucHV0TGVuZ3RoIGNhbiBiZSBhbiBhcnJheSBpZiBpbnB1dCBpcyAzRCBvciBoaWdoZXIuXG4gICAgY29uc3QgaW5MZW5zOiBudW1iZXJbXSA9IGdlbmVyaWNfdXRpbHMudG9MaXN0KHRoaXMuaW5wdXRMZW5ndGgpO1xuICAgIGlmIChpbkxlbnMubGVuZ3RoICE9PSBpbnB1dFNoYXBlLmxlbmd0aCAtIDEpIHtcbiAgICAgIHRocm93IG5ldyBWYWx1ZUVycm9yKFxuICAgICAgICAgIGBcImlucHV0TGVuZ3RoXCIgaXMgJHt0aGlzLmlucHV0TGVuZ3RofSwgYnV0IHJlY2VpdmVkIGAgK1xuICAgICAgICAgIGBpbnB1dCBzaGFwZSBoYXMgc2hhcGUgJHtpbnB1dFNoYXBlfWApO1xuICAgIH0gZWxzZSB7XG4gICAgICBsZXQgaSA9IDA7XG4gICAgICBmb3IgKGxldCBrID0gMDsgayA8IGluTGVucy5sZW5ndGg7ICsraykge1xuICAgICAgICBjb25zdCBzMSA9IGluTGVuc1trXTtcbiAgICAgICAgY29uc3QgczIgPSBpbnB1dFNoYXBlW2sgKyAxXTtcbiAgICAgICAgaWYgKChzMSAhPSBudWxsKSAmJiAoczIgIT0gbnVsbCkgJiYgKHMxICE9PSBzMikpIHtcbiAgICAgICAgICB0aHJvdyBuZXcgVmFsdWVFcnJvcihcbiAgICAgICAgICAgICAgYFwiaW5wdXRMZW5ndGhcIiBpcyAke3RoaXMuaW5wdXRMZW5ndGh9LCBidXQgcmVjZWl2ZWQgYCArXG4gICAgICAgICAgICAgIGBpbnB1dCBzaGFwZSBoYXMgc2hhcGUgJHtpbnB1dFNoYXBlfWApO1xuICAgICAgICB9IGVsc2UgaWYgKHMxID09IG51bGwpIHtcbiAgICAgICAgICBpbkxlbnNbaV0gPSBzMjtcbiAgICAgICAgfVxuICAgICAgICBpKys7XG4gICAgICB9XG4gICAgfVxuICAgIHJldHVybiBbaW5wdXRTaGFwZVswXSwgLi4uaW5MZW5zLCB0aGlzLm91dHB1dERpbV07XG4gIH1cblxuICBjYWxsKGlucHV0czogVGVuc29yfFRlbnNvcltdLCBrd2FyZ3M6IEt3YXJncyk6IFRlbnNvcnxUZW5zb3JbXSB7XG4gICAgcmV0dXJuIHRpZHkoKCkgPT4ge1xuICAgICAgdGhpcy5pbnZva2VDYWxsSG9vayhpbnB1dHMsIGt3YXJncyk7XG4gICAgICAvLyBFbWJlZGRpbmcgbGF5ZXIgYWNjZXB0cyBvbmx5IGEgc2luZ2xlIGlucHV0LlxuICAgICAgbGV0IGlucHV0ID0gZ2V0RXhhY3RseU9uZVRlbnNvcihpbnB1dHMpO1xuICAgICAgaWYgKGlucHV0LmR0eXBlICE9PSAnaW50MzInKSB7XG4gICAgICAgIGlucHV0ID0gSy5jYXN0KGlucHV0LCAnaW50MzInKTtcbiAgICAgIH1cbiAgICAgIGNvbnN0IG91dHB1dCA9XG4gICAgICAgICAgSy5nYXRoZXIodGhpcy5lbWJlZGRpbmdzLnJlYWQoKSwgcmVzaGFwZShpbnB1dCwgW2lucHV0LnNpemVdKSk7XG4gICAgICByZXR1cm4gcmVzaGFwZShcbiAgICAgICAgICBvdXRwdXQsIGdldEV4YWN0bHlPbmVTaGFwZSh0aGlzLmNvbXB1dGVPdXRwdXRTaGFwZShpbnB1dC5zaGFwZSkpKTtcbiAgICB9KTtcbiAgfVxuXG4gIGdldENvbmZpZygpOiBzZXJpYWxpemF0aW9uLkNvbmZpZ0RpY3Qge1xuICAgIGNvbnN0IGNvbmZpZyA9IHtcbiAgICAgIGlucHV0RGltOiB0aGlzLmlucHV0RGltLFxuICAgICAgb3V0cHV0RGltOiB0aGlzLm91dHB1dERpbSxcbiAgICAgIGVtYmVkZGluZ3NJbml0aWFsaXplcjogc2VyaWFsaXplSW5pdGlhbGl6ZXIodGhpcy5lbWJlZGRpbmdzSW5pdGlhbGl6ZXIpLFxuICAgICAgZW1iZWRkaW5nc1JlZ3VsYXJpemVyOiBzZXJpYWxpemVSZWd1bGFyaXplcih0aGlzLmVtYmVkZGluZ3NSZWd1bGFyaXplciksXG4gICAgICBhY3Rpdml0eVJlZ3VsYXJpemVyOiBzZXJpYWxpemVSZWd1bGFyaXplcih0aGlzLmFjdGl2aXR5UmVndWxhcml6ZXIpLFxuICAgICAgZW1iZWRkaW5nc0NvbnN0cmFpbnQ6IHNlcmlhbGl6ZUNvbnN0cmFpbnQodGhpcy5lbWJlZGRpbmdzQ29uc3RyYWludCksXG4gICAgICBtYXNrWmVybzogdGhpcy5tYXNrWmVybyxcbiAgICAgIGlucHV0TGVuZ3RoOiB0aGlzLmlucHV0TGVuZ3RoXG4gICAgfTtcbiAgICBjb25zdCBiYXNlQ29uZmlnID0gc3VwZXIuZ2V0Q29uZmlnKCk7XG4gICAgT2JqZWN0LmFzc2lnbihjb25maWcsIGJhc2VDb25maWcpO1xuICAgIHJldHVybiBjb25maWc7XG4gIH1cbn1cbnNlcmlhbGl6YXRpb24ucmVnaXN0ZXJDbGFzcyhFbWJlZGRpbmcpO1xuIl19","/**\n * @license\n * Copyright 2018 Google LLC\n *\n * Use of this source code is governed by an MIT-style\n * license that can be found in the LICENSE file or at\n * https://opensource.org/licenses/MIT.\n * =============================================================================\n */\n/**\n * TensorFlow.js Layers: Merge Layers.\n */\nimport * as tfc from '@tensorflow/tfjs-core';\nimport { serialization, tidy, util } from '@tensorflow/tfjs-core';\nimport * as K from '../backend/tfjs_backend';\nimport { Layer } from '../engine/topology';\nimport { NotImplementedError, ValueError } from '../errors';\nimport { l2Normalize } from '../losses';\nimport * as generic_utils from '../utils/generic_utils';\nimport * as mathUtils from '../utils/math_utils';\nimport { getExactlyOneShape } from '../utils/types_utils';\n/**\n * Generic Merge layer for element-wise merge functions.\n *\n * Used to implement `Sum`, `Average`, `Concatenate`, etc.\n */\nexport class Merge extends Layer {\n constructor(args) {\n super(args || {});\n this.supportsMasking = true;\n }\n /**\n * Logic for merging multiple tensors, to be overridden by subclasses.\n * @param inputs\n */\n mergeFunction(inputs) {\n throw new NotImplementedError();\n }\n /**\n * Computes the shape of the result of an elementwise operation.\n *\n * @param shape1: Shape of the first tensor.\n * @param shape2: Shape of the second tensor.\n * @returns Expected output shape when an elementwise operation is carried\n * out on 2 tensors with shapes `shape1` and `shape2`.\n * @throws ValueError: If `shape1` and `shape2` are not compatible for\n * element-wise operations.\n */\n computeElementwiseOpOutputShape(shape1, shape2) {\n if (shape1 == null || shape2 == null) {\n return null;\n }\n else if (shape1.length < shape2.length) {\n return this.computeElementwiseOpOutputShape(shape2, shape1);\n }\n else if (shape2.length === 0) {\n return shape1;\n }\n const outputShape = shape1.slice(0, shape1.length - shape2.length);\n for (let k = 0; k < shape2.length; ++k) {\n const i = shape1[shape1.length - shape2.length + k];\n const j = shape2[k];\n if (i == null || j == null || i < 0 || j < 0) {\n outputShape.push(null);\n }\n else if (i === 1) {\n outputShape.push(j);\n }\n else if (j === 1) {\n outputShape.push(i);\n }\n else {\n if (i !== j) {\n throw new ValueError('Operands could not be broadcast together with shapes ' +\n JSON.stringify(shape1) + ' ' + JSON.stringify(shape2));\n }\n outputShape.push(i);\n }\n }\n return outputShape;\n }\n build(inputShape) {\n // Used purely for shape validation.\n if (Array.isArray(inputShape) && !Array.isArray(inputShape[0])) {\n // Make sure that inputShape is an Array of shape.\n inputShape = [getExactlyOneShape(inputShape)];\n }\n inputShape = inputShape;\n if (inputShape.length < 2) {\n throw new ValueError('A merge layer should be called on an Array of at least 2 inputs.' +\n ` Got ${inputShape.length} input(s).`);\n }\n // Make sure that there is at most one unique batch size among the input\n // shapes.\n let batchSizes = [];\n for (const shape of inputShape) {\n if (shape != null && shape[0] !== null) {\n batchSizes.push(shape[0]);\n }\n }\n batchSizes = generic_utils.unique(batchSizes);\n if (batchSizes.length > 1) {\n throw new ValueError(`Can not merge tensors with different batch sizes. ` +\n `Got tensors with shapes: ${JSON.stringify(inputShape)}.`);\n }\n let outputShape = inputShape[0] == null ? null : inputShape[0].slice(1);\n for (let i = 1; i < inputShape.length; ++i) {\n const shape = inputShape[i] == null ? null : inputShape[i].slice(1);\n outputShape = this.computeElementwiseOpOutputShape(outputShape, shape);\n }\n // If the inputs have different ranks, we have to reshape them to make them\n // broadcastable.\n const allRanks = inputShape.map(shape => shape.length);\n if (inputShape.indexOf(null) === -1 &&\n generic_utils.unique(allRanks).length === 1) {\n this.reshapeRequired = false;\n }\n else {\n this.reshapeRequired = true;\n }\n }\n call(inputs, kwargs) {\n return tidy(() => {\n inputs = inputs;\n if (this.reshapeRequired) {\n const reshapedInputs = [];\n const inputDims = inputs.map(input => input.rank);\n if (inputDims.indexOf(null) === -1) {\n // If ranks of all inputs are available, we simply expand each of them\n // at axis=1 until all of them have the same rank.\n const maxNDim = mathUtils.max(inputDims);\n for (let x of inputs) {\n const xNDim = x.rank;\n for (let k = 0; k < maxNDim - xNDim; ++k) {\n x = K.expandDims(x, 1);\n }\n reshapedInputs.push(x);\n }\n return this.mergeFunction(reshapedInputs);\n }\n else {\n // Transpose all inputs so that batch size is the last dimension.\n // [batchSize, dim1, dim2, ...] -> [dim1, dim2, ..., batchSize]\n let transposed = false;\n for (const x of inputs) {\n const xNDim = x.rank;\n if (xNDim == null) {\n const xShape = x.shape;\n const batchSize = xShape[0];\n const newShape = xShape.slice(1).concat([batchSize]);\n let xTransposed = tfc.reshape(x, [batchSize].concat(mathUtils.arrayProd(xShape.slice(1))));\n xTransposed = tfc.transpose(xTransposed, [1, 0]);\n xTransposed = tfc.reshape(xTransposed, newShape);\n reshapedInputs.push(xTransposed);\n transposed = true;\n }\n else if (xNDim > 1) {\n const dims = mathUtils.range(1, xNDim).concat([0]);\n reshapedInputs.push(tfc.transpose(x, dims));\n transposed = true;\n }\n else {\n // We don't transpose inputs if they are 1D vectors or scalars.\n reshapedInputs.push(x);\n }\n }\n let y = this.mergeFunction(reshapedInputs);\n const yNDim = y.rank;\n if (transposed) {\n // If inputs have been transposed, we have to transpose the output\n // too.\n if (yNDim == null) {\n const yShape = y.shape;\n const yNDim = yShape.length;\n const batchSize = yShape[yNDim - 1];\n const newShape = [batchSize].concat(yShape.slice(0, yShape.length - 1));\n y = tfc.reshape(tfc.transpose(tfc.reshape(y, [-1, batchSize]), [1, 0]), newShape);\n }\n else if (yNDim > 1) {\n const dims = [yNDim - 1].concat(mathUtils.range(0, yNDim - 1));\n y = tfc.transpose(y, dims);\n }\n }\n return y;\n }\n }\n else {\n return this.mergeFunction(inputs);\n }\n });\n }\n computeOutputShape(inputShape) {\n inputShape = inputShape;\n let outputShape;\n if (inputShape[0] == null) {\n outputShape = null;\n }\n else {\n outputShape = inputShape[0].slice(1);\n }\n for (let i = 1; i < inputShape.length; ++i) {\n const shape = inputShape[i] == null ? null : inputShape[i].slice(1);\n outputShape = this.computeElementwiseOpOutputShape(outputShape, shape);\n }\n let batchSizes = [];\n for (const shape of inputShape) {\n if (shape != null && shape[0] !== null) {\n batchSizes.push(shape[0]);\n }\n }\n batchSizes = generic_utils.unique(batchSizes);\n if (batchSizes.length === 1) {\n outputShape = batchSizes.concat(outputShape);\n }\n else {\n outputShape = [null].concat(outputShape);\n }\n return outputShape;\n }\n computeMask(inputs, mask) {\n return tfc.tidy(() => {\n if (mask == null) {\n return null;\n }\n if (!Array.isArray(mask)) {\n throw new ValueError('`mask` should be an Array');\n }\n if (!Array.isArray(inputs)) {\n throw new ValueError('`inputs` should be an Array');\n }\n if (mask.length !== inputs.length) {\n throw new ValueError(`The Array 'inputs' and 'mask' are expected to have the same ` +\n `length, but have different lengths ` +\n `(${inputs.length} vs ${mask.length})`);\n }\n if (mask.every(m => m == null)) {\n return null;\n }\n mask = mask.map(m => m == null ? m : tfc.expandDims(m, 0));\n let output = mask[0];\n for (let i = 1; i < mask.length - 1; ++i) {\n output = tfc.logicalAnd(output, mask[i]);\n }\n return output;\n });\n }\n}\nexport class Add extends Merge {\n constructor(args) {\n super(args);\n }\n mergeFunction(inputs) {\n return tidy(() => {\n let output = inputs[0].clone();\n for (let i = 1; i < inputs.length; ++i) {\n output = tfc.add(output, inputs[i]);\n }\n return output;\n });\n }\n}\n/** @nocollapse */\nAdd.className = 'Add';\nserialization.registerClass(Add);\n/**\n * Calculate the element-wise sum of inputs, which all have the same shape.\n *\n * This function can be invoked in three ways.\n *\n * 1. Construct an instance of `Add` layer, by using no input argument\n * or a single configuration argument. The resultant `Add` layer can then\n * be used on `tf.SymbolicTensor`s or `tf.Tensor`s. For example:\n *\n * ```js\n * const addLayer = tf.layers.add();\n *\n * // The layer can be applied to inputs.\n * const input1 = tf.input({shape: [2, 2]});\n * const input2 = tf.input({shape: [2, 2]});\n * const output = addLayer.apply([input1, input2]);\n * console.log(output.shape);\n * // You get [null, 2, 2], with the first dimension as the undetermined batch\n * // dimension.\n * ```\n *\n * 2. Invoke directly on an `Array` of `tf.SymbolicTensor`s. This constructs\n * an `Layer` object internally and calls its `apply` method on the inputs,\n * generating a new `tf.SymbolicTensor`. For example:\n *\n * ```js\n * const input1 = tf.input({shape: [2, 2]});\n * const input2 = tf.input({shape: [2, 2]});\n * const output = tf.layers.add([input1, input2]);\n * console.log(output.shape);\n * // You get [null, 2, 2], with the first dimension as the undetermined batch\n * // dimension.\n * ```\n *\n * 3. Invoke directly on `tf.Tensor`s, i.e., concrete values. This constructs\n * an `Layer` object internally and calls its `apply` method on the inputs,\n * generating a new `tf.Tensor` as the result of the computation. For\n * example:\n *\n * ```js\n * const input1 = tf.tensor2d([1, 2, 3, 4], [2, 2]);\n * const input2 = tf.tensor2d([10, 20, 30, 40], [2, 2]);\n * tf.layers.add([input1, input2]).print();\n * // Gives [[11, 22], [33, 44]].\n *\n */\nexport function add(config) {\n if (Array.isArray(config)) {\n const layer = new Add({});\n return layer.apply(config);\n }\n else {\n return new Add(config);\n }\n}\nexport class Multiply extends Merge {\n constructor(args) {\n super(args);\n }\n mergeFunction(inputs) {\n return tidy(() => {\n let output = inputs[0].clone();\n for (let i = 1; i < inputs.length; ++i) {\n output = tfc.mul(output, inputs[i]);\n }\n return output;\n });\n }\n}\n/** @nocollapse */\nMultiply.className = 'Multiply';\nserialization.registerClass(Multiply);\n/**\n * Calculate the element-wise product of inputs, which all have the same shape.\n *\n * This function can be invoked in three ways.\n *\n * 1. Construct an instance of `Multiply` layer, by using no input argument\n * or a single configuration argument. The resultant `Multiply` layer can\n * then be used on `tf.SymbolicTensor`s or `tf.Tensor`s. For example:\n *\n * ```js\n * const multiplyLayer = tf.layers.multiply();\n *\n * // The layer can be applied to inputs.\n * const input1 = tf.input({shape: [2, 2]});\n * const input2 = tf.input({shape: [2, 2]});\n * const output = multiplyLayer.apply([input1, input2]);\n * console.log(output.shape);\n * // You get [null, 2, 2], with the first dimension as the undetermined batch\n * // dimension.\n * ```\n *\n * 2. Invoke directly on an `Array` of `tf.SymbolicTensor`s. This constructs\n * an `Layer` object internally and calls its `apply` method on the inputs,\n * generating a new `tf.SymbolicTensor`. For example:\n *\n * ```js\n * const input1 = tf.input({shape: [2, 2]});\n * const input2 = tf.input({shape: [2, 2]});\n * const output = tf.layers.multiply([input1, input2]);\n * console.log(output.shape);\n * // You get [null, 2, 2], with the first dimension as the undetermined batch\n * // dimension.\n * ```\n *\n * 3. Invoke directly on `tf.Tensor`s, i.e., concrete values. This constructs\n * an `Layer` object internally and calls its `apply` method on the inputs,\n * generating a new `tf.Tensor` as the result of the computation. For\n * example:\n *\n * ```js\n * const input1 = tf.tensor2d([1, 2, 3, 4], [2, 2]);\n * const input2 = tf.tensor2d([10, 20, 30, 40], [2, 2]);\n * tf.layers.multiply([input1, input2]).print();\n * // Gives [[10, 40], [90, 160]].\n *\n */\nexport function multiply(config) {\n if (Array.isArray(config)) {\n const layer = new Multiply({});\n return layer.apply(config);\n }\n else {\n return new Multiply(config);\n }\n}\nexport class Average extends Merge {\n constructor(args) {\n super(args);\n }\n mergeFunction(inputs) {\n return tidy(() => {\n let output = inputs[0].clone();\n for (let i = 1; i < inputs.length; ++i) {\n output = tfc.add(output, inputs[i]);\n }\n return tfc.mul(1 / inputs.length, output);\n });\n }\n}\n/** @nocollapse */\nAverage.className = 'Average';\nserialization.registerClass(Average);\n/**\n * Calculate the element-wise arithmetic mean of inputs, which all have the same\n * shape.\n *\n * This function can be invoked in three ways.\n *\n * 1. Construct an instance of `Average` layer, by using no input argument\n * or a single configuration argument. The resultant `Average` layer can then\n * be used on `tf.SymbolicTensor`s or `tf.Tensor`s. For example:\n *\n * ```js\n * const averageLayer = tf.layers.average();\n *\n * // The layer can be applied to inputs.\n * const input1 = tf.input({shape: [2, 2]});\n * const input2 = tf.input({shape: [2, 2]});\n * const output = averageLayer.apply([input1, input2]);\n * console.log(output.shape);\n * // You get [null, 2, 2], with the first dimension as the undetermined batch\n * // dimension.\n * ```\n *\n * 2. Invoke directly on an `Array` of `tf.SymbolicTensor`s. This constructs\n * an `Layer` object internally and calls its `apply` method on the inputs,\n * generating a new `tf.SymbolicTensor`. For example:\n *\n * ```js\n * const input1 = tf.input({shape: [2, 2]});\n * const input2 = tf.input({shape: [2, 2]});\n * const output = tf.layers.average([input1, input2]);\n * console.log(output.shape);\n * // You get [null, 2, 2], with the first dimension as the undetermined batch\n * // dimension.\n * ```\n *\n * 3. Invoke directly on `tf.Tensor`s, i.e., concrete values. This constructs\n * an `Layer` object internally and calls its `apply` method on the inputs,\n * generating a new `tf.Tensor` as the result of the computation. For\n * example:\n *\n * ```js\n * const input1 = tf.tensor2d([1, 2, 3, 4], [2, 2]);\n * const input2 = tf.tensor2d([10, 20, 30, 40], [2, 2]);\n * tf.layers.average([input1, input2]).print();\n * // Gives [[5.5, 11], [16.5, 22]].\n *\n */\nexport function average(config) {\n if (Array.isArray(config)) {\n const layer = new Average({});\n return layer.apply(config);\n }\n else {\n return new Average(config);\n }\n}\nexport class Maximum extends Merge {\n constructor(args) {\n super(args);\n }\n mergeFunction(inputs) {\n return tidy(() => {\n let output = inputs[0];\n for (let i = 1; i < inputs.length; ++i) {\n output = tfc.maximum(output, inputs[i]);\n }\n return output;\n });\n }\n}\n/** @nocollapse */\nMaximum.className = 'Maximum';\nserialization.registerClass(Maximum);\n/**\n * Calculate the element-wise maximum of inputs, which all have the same shape.\n *\n * This function can be invoked in three ways.\n *\n * 1. Construct an instance of `Maximum` layer, by using no input argument\n * or a single configuration argument. The resultant `Maximum` layer can then\n * be used on `tf.SymbolicTensor`s or `tf.Tensor`s. For example:\n *\n * ```js\n * const maximumLayer = tf.layers.maximum();\n *\n * // The layer can be applied to inputs.\n * const input1 = tf.input({shape: [2, 2]});\n * const input2 = tf.input({shape: [2, 2]});\n * const output = maximumLayer.apply([input1, input2]);\n * console.log(output.shape);\n * // You get [null, 2, 2], with the first dimension as the undetermined batch\n * // dimension.\n * ```\n *\n * 2. Invoke directly on an `Array` of `tf.SymbolicTensor`s. This constructs\n * an `Layer` object internally and calls its `apply` method on the inputs,\n * generating a new `tf.SymbolicTensor`. For example:\n *\n * ```js\n * const input1 = tf.input({shape: [2, 2]});\n * const input2 = tf.input({shape: [2, 2]});\n * const output = tf.layers.maximum([input1, input2]);\n * console.log(output.shape);\n * // You get [null, 2, 2], with the first dimension as the undetermined batch\n * // dimension.\n * ```\n *\n * 3. Invoke directly on `tf.Tensor`s, i.e., concrete values. This constructs\n * an `Layer` object internally and calls its `apply` method on the inputs,\n * generating a new `tf.Tensor` as the result of the computation. For\n * example:\n *\n * ```js\n * const input1 = tf.tensor2d([1, 20, 3, 40], [2, 2]);\n * const input2 = tf.tensor2d([10, 2, 30, 4], [2, 2]);\n * tf.layers.maximum([input1, input2]).print();\n * // Gives [[10, 20], [30, 40]].\n *\n */\nexport function maximum(config) {\n if (Array.isArray(config)) {\n const layer = new Maximum({});\n return layer.apply(config);\n }\n else {\n return new Maximum(config);\n }\n}\nexport class Minimum extends Merge {\n constructor(args) {\n super(args);\n }\n mergeFunction(inputs) {\n return tidy(() => {\n let output = inputs[0];\n for (let i = 1; i < inputs.length; ++i) {\n output = tfc.minimum(output, inputs[i]);\n }\n return output;\n });\n }\n}\n/** @nocollapse */\nMinimum.className = 'Minimum';\nserialization.registerClass(Minimum);\n/**\n * Calculate the element-wise minimum of inputs, which all have the same shape.\n *\n * This function can be invoked in three ways.\n *\n * 1. Construct an instance of `Minimum` layer, by using no input argument\n * or a single configuration argument. The resultant `Minimum` layer can then\n * be used on `tf.SymbolicTensor`s or `tf.Tensor`s. For example:\n *\n * ```js\n * const minimumLayer = tf.layers.minimum();\n *\n * // The layer can be applied to inputs.\n * const input1 = tf.input({shape: [2, 2]});\n * const input2 = tf.input({shape: [2, 2]});\n * const output = minimumLayer.apply([input1, input2]);\n * console.log(output.shape);\n * // You get [null, 2, 2], with the first dimension as the undetermined batch\n * // dimension.\n * ```\n *\n * 2. Invoke directly on an `Array` of `tf.SymbolicTensor`s. This constructs\n * an `Layer` object internally and calls its `apply` method on the inputs,\n * generating a new `tf.SymbolicTensor`. For example:\n *\n * ```js\n * const input1 = tf.input({shape: [2, 2]});\n * const input2 = tf.input({shape: [2, 2]});\n * const output = tf.layers.minimum([input1, input2]);\n * console.log(output.shape);\n * // You get [null, 2, 2], with the first dimension as the undetermined batch\n * // dimension.\n * ```\n *\n * 3. Invoke directly on `tf.Tensor`s, i.e., concrete values. This constructs\n * an `Layer` object internally and calls its `apply` method on the inputs,\n * generating a new `tf.Tensor` as the result of the computation. For\n * example:\n *\n * ```js\n * const input1 = tf.tensor2d([1, 20, 3, 40], [2, 2]);\n * const input2 = tf.tensor2d([10, 2, 30, 4], [2, 2]);\n * tf.layers.minimum([input1, input2]).print();\n * // Gives [[1, 2], [3, 4]].\n *\n */\nexport function minimum(config) {\n if (Array.isArray(config)) {\n const layer = new Minimum({});\n return layer.apply(config);\n }\n else {\n return new Minimum(config);\n }\n}\nexport class Concatenate extends Merge {\n constructor(args) {\n super(args);\n this.DEFAULT_AXIS = -1;\n if (args == null) {\n args = {};\n }\n this.axis = args.axis == null ? this.DEFAULT_AXIS : args.axis;\n this.supportsMasking = true;\n this.reshapeRequired = false;\n }\n build(inputShape) {\n // Used purely for shape validation.]\n if (!(Array.isArray(inputShape) && Array.isArray(inputShape[0])) ||\n inputShape.length === 1) {\n throw new ValueError('A `Concatenate` layer should be called on a list of at least 2 ' +\n 'inputs');\n }\n inputShape = inputShape;\n let allNoneShape = true;\n for (const shape of inputShape) {\n if (shape != null) {\n allNoneShape = false;\n break;\n }\n }\n if (allNoneShape) {\n return;\n }\n const shapeSet = [];\n for (let i = 0; i < inputShape.length; ++i) {\n const shapeWithoutConcatAxis = inputShape[i].slice();\n shapeWithoutConcatAxis.splice(this.axis, 1);\n let exists = false;\n for (const shape of shapeSet) {\n if (util.arraysEqual(shape, shapeWithoutConcatAxis)) {\n exists = true;\n break;\n }\n }\n if (!exists) {\n shapeSet.push(shapeWithoutConcatAxis);\n }\n }\n if (shapeSet.length > 1) {\n throw new ValueError('A `Concatenate` layer requires inputs with matching shapes ' +\n 'except for the concat axis. Got input shapes: ' +\n JSON.stringify(inputShape));\n }\n }\n mergeFunction(inputs) {\n return tidy(() => {\n return K.concatenate(inputs, this.axis);\n });\n }\n computeOutputShape(inputShape) {\n if (!(Array.isArray(inputShape) && Array.isArray(inputShape[0]))) {\n throw new ValueError('A `Concatenate` layer should be called on a list of inputs.');\n }\n const inputShapes = inputShape;\n const outputShape = inputShapes[0].slice();\n const axis = this.axis < 0 ? outputShape.length + this.axis : this.axis;\n // Porting Note: the line above is because TypeScript doesn't support\n // negative indices.\n for (const shape of inputShapes.slice(1)) {\n if (outputShape[axis] == null || shape[axis] == null) {\n outputShape[axis] = null;\n break;\n }\n outputShape[axis] += shape[axis];\n }\n return outputShape;\n }\n computeMask(inputs, mask) {\n if (mask == null) {\n return null;\n }\n if (!Array.isArray(mask)) {\n throw new ValueError('`mask` should be an array for Concatenate');\n }\n if (!Array.isArray(inputs)) {\n throw new ValueError('`inputs` should be an array for Concatenate');\n }\n if (mask.length !== inputs.length) {\n throw new ValueError(`Mismatch in the length of mask (${mask.length}) ` +\n `and the legnth of inputs (${inputs.length})`);\n }\n return tfc.tidy(() => {\n let allNullMasks = true;\n mask.forEach(m => {\n if (m != null) {\n allNullMasks = false;\n return;\n }\n });\n if (allNullMasks) {\n return null;\n }\n const outputMasks = [];\n for (let i = 0; i < inputs.length; ++i) {\n if (mask[i] == null) {\n // Input is unmasked. Append all 1's to masks.\n outputMasks.push(tfc.cast(tfc.onesLike(inputs[i]), 'bool'));\n }\n else if (mask[i].rank < inputs[i].rank) {\n // Mask is smaller than the input, expand it.\n outputMasks.push(tfc.expandDims(mask[i], -1));\n }\n else {\n outputMasks.push(mask[i]);\n }\n }\n const concatenatedMasks = tfc.concat(outputMasks, this.axis);\n return tfc.all(concatenatedMasks, -1, false);\n });\n }\n getConfig() {\n const config = {\n 'axis': this.axis,\n };\n const baseConfig = super.getConfig();\n Object.assign(config, baseConfig);\n return config;\n }\n}\n/** @nocollapse */\nConcatenate.className = 'Concatenate';\nserialization.registerClass(Concatenate);\n/**\n * Concatenate an `Array` of inputs.\n *\n * This function can be invoked in three ways.\n *\n * 1. Construct an instance of `Concatenate` layer, by using no input argument\n * or a single configuration argument. The resultant `Concatenate` layer can\n * then be used on `tf.SymbolicTensor`s or `tf.Tensor`s. For example:\n *\n * ```js\n * const concatLayer = tf.layers.concatenate();\n *\n * // The layer can be applied to inputs.\n * const input1 = tf.input({shape: [2, 3]});\n * const input2 = tf.input({shape: [2, 4]});\n * const output = concatLayer.apply([input1, input2]);\n * console.log(output.shape);\n * // You get [null, 2, 7], with the first dimension as the undetermined batch\n * // dimension and the last dimension as the result of concatenating the\n * // last dimensions of the two inputs.\n * ```\n *\n * 2. Invoke directly on an `Array` of `tf.SymbolicTensor`s. This constructs\n * an `Layer` object internally and calls its `apply` method on the inputs,\n * generating a new `tf.SymbolicTensor`. For example:\n *\n * ```js\n * const input1 = tf.input({shape: [2, 3]});\n * const input2 = tf.input({shape: [2, 4]});\n * const output = tf.layers.concatenate([input1, input2]);\n * console.log(output.shape);\n * // You get [null, 2, 2], with the first dimension as the undetermined batch\n * // dimension and the last dimension as the result of concatenating the\n * // last dimensions of the two inputs.\n * ```\n *\n * 3. Invoke directly on `tf.Tensor`s, i.e., concrete values. This constructs\n * an `Layer` object internally and calls its `apply` method on the inputs,\n * generating a new `tf.Tensor` as the result of the computation. For\n * example:\n *\n * ```js\n * const input1 = tf.tensor2d([[1, 2], [3, 4]], [2, 2]);\n * const input2 = tf.tensor2d([[10, 20], [30, 40]], [2, 2]);\n * tf.layers.concatenate([input1, input2]).print();\n * // Gives [[1, 2, 10, 20], [3, 4, 30, 40]].\n *\n */\nexport function concatenate(config) {\n if (Array.isArray(config)) {\n const layer = new Concatenate({});\n return layer.apply(config);\n }\n else {\n return new Concatenate(config);\n }\n}\n/**\n * Interpretable potentially negative axis index.\n *\n * For example, given axis = -1, and dim = 3, this function will return 2.\n *\n * @param axis The axis index, may be a positive, zero or negative integer.\n * @param dim Total number of dimensions, a positive integer.\n * @returns A non-negative axis index equivalent to the input `axis`.\n */\nfunction interpretAxis(axis, dim) {\n while (axis < 0) {\n axis += dim;\n }\n return axis;\n}\nfunction batchDot(x, y, axes) {\n if (x.shape.length > 3 || y.shape.length > 3) {\n throw new NotImplementedError('batchDot is not implemented for tensors of 4D or higher rank yet');\n }\n tfc.util.assert(x.shape.length >= 2, () => `batchDot requires the rank of x to be >= 2, ` +\n `but got ${x.shape.length}`);\n tfc.util.assert(x.shape.length >= 2, () => `batchDot requires the rank of y to be >= 2, ` +\n `but got ${y.shape.length}`);\n if (typeof axes === 'number') {\n axes = [axes, axes];\n }\n if (x.dtype === 'complex64' || y.dtype === 'complex64') {\n throw new NotImplementedError('batchDot is not implemented for complex64-type Tensors yet.');\n }\n const xNDim = x.shape.length;\n const yNDim = y.shape.length;\n if (axes == null) {\n // Behave like batchMatmul by default.\n axes = [xNDim - 1, yNDim - 2];\n }\n const axesArray = axes;\n return tfc.tidy(() => {\n let diff;\n if (xNDim > yNDim) {\n diff = xNDim - yNDim;\n const diffShape = [];\n for (let i = 0; i < diff; ++i) {\n diffShape.push(1);\n }\n y = tfc.reshape(y, y.shape.concat(diffShape));\n }\n else if (yNDim > xNDim) {\n diff = yNDim - xNDim;\n const diffShape = [];\n for (let i = 0; i < diff; ++i) {\n diffShape.push(1);\n }\n x = tfc.reshape(x, x.shape.concat(diffShape));\n }\n else {\n diff = 0;\n }\n let out;\n if (x.shape.length === 2 && y.shape.length === 2) {\n if (axesArray[0] === axesArray[1]) {\n out = tfc.sum(tfc.mul(x, y), axesArray[0]);\n }\n else {\n out = tfc.sum(tfc.mul(tfc.transpose(x, [1, 0]), y), axesArray[1]);\n }\n }\n else {\n const adjX = axesArray[0] !== x.shape.length - 1;\n const adjY = axesArray[1] === y.shape.length - 1;\n out = tfc.matMul(x, y, adjX, adjY);\n }\n if (diff > 0) {\n let idx;\n if (xNDim > yNDim) {\n idx = xNDim + yNDim - 3;\n }\n else {\n idx = xNDim - 1;\n }\n const squeezeAxes = [];\n for (let i = idx; i < idx + diff; ++i) {\n squeezeAxes.push(i);\n }\n out = tfc.squeeze(out, squeezeAxes);\n }\n if (out.shape.length === 1) {\n out = tfc.expandDims(out, 1);\n }\n return out;\n });\n}\nexport class Dot extends Merge {\n constructor(args) {\n super(args);\n this.axes = args.axes;\n this.normalize = args.normalize == null ? false : args.normalize;\n this.supportsMasking = true;\n this.reshapeRequired = false;\n }\n build(inputShape) {\n tfc.util.assert(Array.isArray(inputShape) && inputShape.length === 2 &&\n Array.isArray(inputShape[0]) && Array.isArray(inputShape[1]), () => 'A `Dot` layer should be called on a list of exactly 2 inputs.');\n const shape1 = inputShape[0];\n const shape2 = inputShape[1];\n if (shape1.length > 3 || shape2.length > 3) {\n throw new NotImplementedError('Dot layer does not support tensors of 4D or higher rank yet.');\n }\n const axes = this.interpretAxes(shape1, shape2);\n if (shape1[axes[0]] !== shape2[axes[1]]) {\n throw new ValueError(`Dimension incompatibility: ` +\n `${shape1[axes[0]]} !== ${shape2[axes[1]]}`);\n }\n }\n mergeFunction(inputs) {\n if (inputs.length !== 2) {\n throw new ValueError('A `Dot` layer must be called on exactly 2 inputs, ' +\n `but received ${inputs.length} input(s).`);\n }\n let x1 = inputs[0];\n let x2 = inputs[1];\n let axes;\n if (!Array.isArray(this.axes)) {\n axes = [\n interpretAxis(this.axes, x1.shape.length),\n interpretAxis(this.axes, x2.shape.length)\n ];\n }\n else {\n axes = this.axes.map((axis, i) => interpretAxis(axis, inputs[i].shape.length));\n }\n if (this.normalize) {\n x1 = l2Normalize(x1, axes[0]);\n x2 = l2Normalize(x2, axes[1]);\n }\n return batchDot(x1, x2, axes);\n }\n interpretAxes(shape1, shape2) {\n let axes;\n if (!Array.isArray(this.axes)) {\n // `this.axes` is a single integer.\n axes = [\n interpretAxis(this.axes, shape1.length),\n interpretAxis(this.axes, shape2.length)\n ];\n }\n else {\n // `this.axes` is an Array of integers.\n axes = this.axes;\n }\n return axes;\n }\n computeOutputShape(inputShape) {\n tfc.util.assert(Array.isArray(inputShape) && inputShape.length === 2 &&\n Array.isArray(inputShape[0]) && Array.isArray(inputShape[1]), () => 'A `Dot` layer should be called on a list of exactly 2 inputs.');\n const shape1 = inputShape[0].slice();\n const shape2 = inputShape[1].slice();\n if (shape1.length > 3 || shape2.length > 3) {\n throw new NotImplementedError('Dot layer does not support tensors of 4D or higher rank yet.');\n }\n const axes = this.interpretAxes(shape1, shape2);\n shape1.splice(axes[0], 1);\n shape2.splice(axes[1], 1);\n shape2.splice(0, 1);\n const outputShape = shape1.concat(shape2);\n if (outputShape.length === 1) {\n outputShape.push(1);\n }\n return outputShape;\n }\n computeMask(inputs, mask) {\n return null;\n }\n getConfig() {\n const config = {\n 'axes': this.axes,\n 'normalize': this.normalize\n };\n const baseConfig = super.getConfig();\n Object.assign(config, baseConfig);\n return config;\n }\n}\n/** @nocollapse */\nDot.className = 'Dot';\nserialization.registerClass(Dot);\n// TODO(cais): Add functional interfaces for the merge layers.\n//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibWVyZ2UuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi8uLi90ZmpzLWxheWVycy9zcmMvbGF5ZXJzL21lcmdlLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBOzs7Ozs7OztHQVFHO0FBRUg7O0dBRUc7QUFFSCxPQUFPLEtBQUssR0FBRyxNQUFNLHVCQUF1QixDQUFDO0FBQzdDLE9BQU8sRUFBQyxhQUFhLEVBQVUsSUFBSSxFQUFFLElBQUksRUFBQyxNQUFNLHVCQUF1QixDQUFDO0FBQ3hFLE9BQU8sS0FBSyxDQUFDLE1BQU0seUJBQXlCLENBQUM7QUFDN0MsT0FBTyxFQUFDLEtBQUssRUFBNEIsTUFBTSxvQkFBb0IsQ0FBQztBQUNwRSxPQUFPLEVBQUMsbUJBQW1CLEVBQUUsVUFBVSxFQUFDLE1BQU0sV0FBVyxDQUFDO0FBRTFELE9BQU8sRUFBQyxXQUFXLEVBQUMsTUFBTSxXQUFXLENBQUM7QUFFdEMsT0FBTyxLQUFLLGFBQWEsTUFBTSx3QkFBd0IsQ0FBQztBQUN4RCxPQUFPLEtBQUssU0FBUyxNQUFNLHFCQUFxQixDQUFDO0FBQ2pELE9BQU8sRUFBQyxrQkFBa0IsRUFBQyxNQUFNLHNCQUFzQixDQUFDO0FBRXhEOzs7O0dBSUc7QUFDSCxNQUFNLE9BQWdCLEtBQU0sU0FBUSxLQUFLO0lBR3ZDLFlBQVksSUFBZ0I7UUFDMUIsS0FBSyxDQUFDLElBQUksSUFBSSxFQUFFLENBQUMsQ0FBQztRQUNsQixJQUFJLENBQUMsZUFBZSxHQUFHLElBQUksQ0FBQztJQUM5QixDQUFDO0lBRUQ7OztPQUdHO0lBQ08sYUFBYSxDQUFDLE1BQWdCO1FBQ3RDLE1BQU0sSUFBSSxtQkFBbUIsRUFBRSxDQUFDO0lBQ2xDLENBQUM7SUFFRDs7Ozs7Ozs7O09BU0c7SUFDSywrQkFBK0IsQ0FBQyxNQUFhLEVBQUUsTUFBYTtRQUNsRSxJQUFJLE1BQU0sSUFBSSxJQUFJLElBQUksTUFBTSxJQUFJLElBQUksRUFBRTtZQUNwQyxPQUFPLElB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QUFDLENBQUM7U0FDckU7UUFFRCxNQUFNLElBQUksR0FBRyxJQUFJLENBQUMsYUFBYSxDQUFDLE1BQU0sRUFBRSxNQUFNLENBQUMsQ0FBQztRQUNoRCxNQUFNLENBQUMsTUFBTSxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQztRQUMxQixNQUFNLENBQUMsTUFBTSxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQztRQUMxQixNQUFNLENBQUMsTUFBTSxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQztRQUNwQixNQUFNLFdBQVcsR0FBRyxNQUFNLENBQUMsTUFBTSxDQUFDLE1BQU0sQ0FBQyxDQUFDO1FBQzFDLElBQUksV0FBVyxDQUFDLE1BQU0sS0FBSyxDQUFDLEVBQUU7WUFDNUIsV0FBVyxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsQ0FBQztTQUNyQjtRQUNELE9BQU8sV0FBVyxDQUFDO0lBQ3JCLENBQUM7SUFFRCxXQUFXLENBQUMsTUFBdUIsRUFBRSxJQUFzQjtRQUN6RCxPQUFPLElBQUksQ0FBQztJQUNkLENBQUM7SUFFRCxTQUFTO1FBQ1AsTUFBTSxNQUFNLEdBQTZCO1lBQ3ZDLE1BQU0sRUFBRSxJQUFJLENBQUMsSUFBSTtZQUNqQixXQUFXLEVBQUUsSUFBSSxDQUFDLFNBQVM7U0FDNUIsQ0FBQztRQUNGLE1BQU0sVUFBVSxHQUFHLEtBQUssQ0FBQyxTQUFTLEVBQUUsQ0FBQztRQUNyQyxNQUFNLENBQUMsTUFBTSxDQUFDLE1BQU0sRUFBRSxVQUFVLENBQUMsQ0FBQztRQUNsQyxPQUFPLE1BQU0sQ0FBQztJQUNoQixDQUFDOztBQS9HRCxrQkFBa0I7QUFDWCxhQUFTLEdBQUcsS0FBSyxDQUFDO0FBZ0gzQixhQUFhLENBQUMsYUFBYSxDQUFDLEdBQUcsQ0FBQyxDQUFDO0FBRWpDLDhEQUE4RCIsInNvdXJjZXNDb250ZW50IjpbIi8qKlxuICogQGxpY2Vuc2VcbiAqIENvcHlyaWdodCAyMDE4IEdvb2dsZSBMTENcbiAqXG4gKiBVc2Ugb2YgdGhpcyBzb3VyY2UgY29kZSBpcyBnb3Zlcm5lZCBieSBhbiBNSVQtc3R5bGVcbiAqIGxpY2Vuc2UgdGhhdCBjYW4gYmUgZm91bmQgaW4gdGhlIExJQ0VOU0UgZmlsZSBvciBhdFxuICogaHR0cHM6Ly9vcGVuc291cmNlLm9yZy9saWNlbnNlcy9NSVQuXG4gKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuICovXG5cbi8qKlxuICogVGVuc29yRmxvdy5qcyBMYXllcnM6IE1lcmdlIExheWVycy5cbiAqL1xuXG5pbXBvcnQgKiBhcyB0ZmMgZnJvbSAnQHRlbnNvcmZsb3cvdGZqcy1jb3JlJztcbmltcG9ydCB7c2VyaWFsaXphdGlvbiwgVGVuc29yLCB0aWR5LCB1dGlsfSBmcm9tICdAdGVuc29yZmxvdy90ZmpzLWNvcmUnO1xuaW1wb3J0ICogYXMgSyBmcm9tICcuLi9iYWNrZW5kL3RmanNfYmFja2VuZCc7XG5pbXBvcnQge0xheWVyLCBMYXllckFyZ3MsIFN5bWJvbGljVGVuc29yfSBmcm9tICcuLi9lbmdpbmUvdG9wb2xvZ3knO1xuaW1wb3J0IHtOb3RJbXBsZW1lbnRlZEVycm9yLCBWYWx1ZUVycm9yfSBmcm9tICcuLi9lcnJvcnMnO1xuaW1wb3J0IHtTaGFwZX0gZnJvbSAnLi4va2VyYXNfZm9ybWF0L2NvbW1vbic7XG5pbXBvcnQge2wyTm9ybWFsaXplfSBmcm9tICcuLi9sb3NzZXMnO1xuaW1wb3J0IHtLd2FyZ3N9IGZyb20gJy4uL3R5cGVzJztcbmltcG9ydCAqIGFzIGdlbmVyaWNfdXRpbHMgZnJvbSAnLi4vdXRpbHMvZ2VuZXJpY191dGlscyc7XG5pbXBvcnQgKiBhcyBtYXRoVXRpbHMgZnJvbSAnLi4vdXRpbHMvbWF0aF91dGlscyc7XG5pbXBvcnQge2dldEV4YWN0bHlPbmVTaGFwZX0gZnJvbSAnLi4vdXRpbHMvdHlwZXNfdXRpbHMnO1xuXG4vKipcbiAqIEdlbmVyaWMgTWVyZ2UgbGF5ZXIgZm9yIGVsZW1lbnQtd2lzZSBtZXJnZSBmdW5jdGlvbnMuXG4gKlxuICogVXNlZCB0byBpbXBsZW1lbnQgYFN1bWAsIGBBdmVyYWdlYCwgYENvbmNhdGVuYXRlYCwgZXRjLlxuICovXG5leHBvcnQgYWJzdHJhY3QgY2xhc3MgTWVyZ2UgZXh0ZW5kcyBMYXllciB7XG4gIHByb3RlY3RlZCByZXNoYXBlUmVxdWlyZWQ6IGJvb2xlYW47XG5cbiAgY29uc3RydWN0b3IoYXJncz86IExheWVyQXJncykge1xuICAgIHN1cGVyKGFyZ3MgfHwge30pO1xuICAgIHRoaXMuc3VwcG9ydHNNYXNraW5nID0gdHJ1ZTtcbiAgfVxuXG4gIC8qKlxuICAgKiBMb2dpYyBmb3IgbWVyZ2luZyBtdWx0aXBsZSB0ZW5zb3JzLCB0byBiZSBvdmVycmlkZGVuIGJ5IHN1YmNsYXNzZXMuXG4gICAqIEBwYXJhbSBpbnB1dHNcbiAgICovXG4gIHByb3RlY3RlZCBtZXJnZUZ1bmN0aW9uKGlucHV0czogVGVuc29yW10pOiBUZW5zb3Ige1xuICAgIHRocm93IG5ldyBOb3RJbXBsZW1lbnRlZEVycm9yKCk7XG4gIH1cblxuICAvKipcbiAgICogQ29tcHV0ZXMgdGhlIHNoYXBlIG9mIHRoZSByZXN1bHQgb2YgYW4gZWxlbWVudHdpc2Ugb3BlcmF0aW9uLlxuICAgKlxuICAgKiBAcGFyYW0gc2hhcGUxOiBTaGFwZSBvZiB0aGUgZmlyc3QgdGVuc29yLlxuICAgKiBAcGFyYW0gc2hhcGUyOiBTaGFwZSBvZiB0aGUgc2Vjb25kIHRlbnNvci5cbiAgICogQHJldHVybnMgRXhwZWN0ZWQgb3V0cHV0IHNoYXBlIHdoZW4gYW4gZWxlbWVudHdpc2Ugb3BlcmF0aW9uIGlzIGNhcnJpZWRcbiAgICogICBvdXQgb24gMiB0ZW5zb3JzIHdpdGggc2hhcGVzIGBzaGFwZTFgIGFuZCBgc2hhcGUyYC5cbiAgICogQHRocm93cyBWYWx1ZUVycm9yOiBJZiBgc2hhcGUxYCBhbmQgYHNoYXBlMmAgYXJlIG5vdCBjb21wYXRpYmxlIGZvclxuICAgKiAgIGVsZW1lbnQtd2lzZSBvcGVyYXRpb25zLlxuICAgKi9cbiAgcHJpdmF0ZSBjb21wdXRlRWxlbWVudHdpc2VPcE91dHB1dFNoYXBlKHNoYXBlMTogU2hhcGUsIHNoYXBlMjogU2hhcGUpOiBTaGFwZSB7XG4gICAgaWYgKHNoYXBlMSA9PSBudWxsIHx8IHNoYXBlMiA9PSBudWxsKSB7XG4gICAgICByZXR1cm4gbnVsbDtcbiAgICB9IGVsc2UgaWYgKHNoYXBlMS5sZW5ndGggPCBzaGFwZTIubGVuZ3RoKSB7XG4gICAgICByZXR1cm4gdGhpcy5jb21wdXRlRWxlbWVudHdpc2VPcE91dHB1dFNoYXBlKHNoYXBlMiwgc2hhcGUxKTtcbiAgICB9IGVsc2UgaWYgKHNoYXBlMi5sZW5ndGggPT09IDApIHtcbiAgICAgIHJldHVybiBzaGFwZTE7XG4gICAgfVxuICAgIGNvbnN0IG91dHB1dFNoYXBlOiBTaGFwZSA9IHNoYXBlMS5zbGljZSgwLCBzaGFwZTEubGVuZ3RoIC0gc2hhcGUyLmxlbmd0aCk7XG4gICAgZm9yIChsZXQgayA9IDA7IGsgPCBzaGFwZTIubGVuZ3RoOyArK2spIHtcbiAgICAgIGNvbnN0IGkgPSBzaGFwZTFbc2hhcGUxLmxlbmd0aCAtIHNoYXBlMi5sZW5ndGggKyBrXTtcbiAgICAgIGNvbnN0IGogPSBzaGFwZTJba107XG4gICAgICBpZiAoaSA9PSBudWxsIHx8IGogPT0gbnVsbCB8fCBpIDwgMCB8fCBqIDwgMCkge1xuICAgICAgICBvdXRwdXRTaGFwZS5wdXNoKG51bGwpO1xuICAgICAgfSBlbHNlIGlmIChpID09PSAxKSB7XG4gICAgICAgIG91dHB1dFNoYXBlLnB1c2goaik7XG4gICAgICB9IGVsc2UgaWYgKGogPT09IDEpIHtcbiAgICAgICAgb3V0cHV0U2hhcGUucHVzaChpKTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIGlmIChpICE9PSBqKSB7XG4gICAgICAgICAgdGhyb3cgbmV3IFZhbHVlRXJyb3IoXG4gICAgICAgICAgICAgICdPcGVyYW5kcyBjb3VsZCBub3QgYmUgYnJvYWRjYXN0IHRvZ2V0aGVyIHdpdGggc2hhcGVzICcgK1xuICAgICAgICAgICAgICBKU09OLnN0cmluZ2lmeShzaGFwZTEpICsgJyAnICsgSlNPTi5zdHJpbmdpZnkoc2hhcGUyKSk7XG4gICAgICAgIH1cbiAgICAgICAgb3V0cHV0U2hhcGUucHVzaChpKTtcbiAgICAgIH1cbiAgICB9XG4gICAgcmV0dXJuIG91dHB1dFNoYXBlO1xuICB9XG5cbiAgYnVpbGQoaW5wdXRTaGFwZTogU2hhcGV8U2hhcGVbXSk6IHZvaWQge1xuICAgIC8vIFVzZWQgcHVyZWx5IGZvciBzaGFwZSB2YWxpZGF0aW9uLlxuICAgIGlmIChBcnJheS5pc0FycmF5KGlucHV0U2hhcGUpICYmICFBcnJheS5pc0FycmF5KGlucHV0U2hhcGVbMF0pKSB7XG4gICAgICAvLyBNYWtlIHN1cmUgdGhhdCBpbnB1dFNoYXBlIGlzIGFuIEFycmF5IG9mIHNoYXBlLlxuICAgICAgaW5wdXRTaGFwZSA9IFtnZXRFeGFjdGx5T25lU2hhcGUoaW5wdXRTaGFwZSldO1xuICAgIH1cbiAgICBpbnB1dFNoYXBlID0gaW5wdXRTaGFwZSBhcyBTaGFwZVtdO1xuICAgIGlmIChpbnB1dFNoYXBlLmxlbmd0aCA8IDIpIHtcbiAgICAgIHRocm93IG5ldyBWYWx1ZUVycm9yKFxuICAgICAgICAgICdBIG1lcmdlIGxheWVyIHNob3VsZCBiZSBjYWxsZWQgb24gYW4gQXJyYXkgb2YgYXQgbGVhc3QgMiBpbnB1dHMuJyArXG4gICAgICAgICAgYCBHb3QgJHtpbnB1dFNoYXBlLmxlbmd0aH0gaW5wdXQocykuYCk7XG4gICAgfVxuXG4gICAgLy8gTWFrZSBzdXJlIHRoYXQgdGhlcmUgaXMgYXQgbW9zdCBvbmUgdW5pcXVlIGJhdGNoIHNpemUgYW1vbmcgdGhlIGlucHV0XG4gICAgLy8gc2hhcGVzLlxuICAgIGxldCBiYXRjaFNpemVzOiBudW1iZXJbXSA9IFtdO1xuICAgIGZvciAoY29uc3Qgc2hhcGUgb2YgaW5wdXRTaGFwZSkge1xuICAgICAgaWYgKHNoYXBlICE9IG51bGwgJiYgc2hhcGVbMF0gIT09IG51bGwpIHtcbiAgICAgICAgYmF0Y2hTaXplcy5wdXNoKHNoYXBlWzBdKTtcbiAgICAgIH1cbiAgICB9XG4gICAgYmF0Y2hTaXplcyA9IGdlbmVyaWNfdXRpbHMudW5pcXVlKGJhdGNoU2l6ZXMpO1xuICAgIGlmIChiYXRjaFNpemVzLmxlbmd0aCA+IDEpIHtcbiAgICAgIHRocm93IG5ldyBWYWx1ZUVycm9yKFxuICAgICAgICAgIGBDYW4gbm90IG1lcmdlIHRlbnNvcnMgd2l0aCBkaWZmZXJlbnQgYmF0Y2ggc2l6ZXMuIGAgK1xuICAgICAgICAgIGBHb3QgdGVuc29ycyB3aXRoIHNoYXBlczogJHtKU09OLnN0cmluZ2lmeShpbnB1dFNoYXBlKX0uYCk7XG4gICAgfVxuXG4gICAgbGV0IG91dHB1dFNoYXBlOiBTaGFwZSA9XG4gICAgICAgIGlucHV0U2hhcGVbMF0gPT0gbnVsbCA/IG51bGwgOiBpbnB1dFNoYXBlWzBdLnNsaWNlKDEpO1xuICAgIGZvciAobGV0IGkgPSAxOyBpIDwgaW5wdXRTaGFwZS5sZW5ndGg7ICsraSkge1xuICAgICAgY29uc3Qgc2hhcGUgPSBpbnB1dFNoYXBlW2ldID09IG51bGwgPyBudWxsIDogaW5wdXRTaGFwZVtpXS5zbGljZSgxKTtcbiAgICAgIG91dHB1dFNoYXBlID0gdGhpcy5jb21wdXRlRWxlbWVudHdpc2VPcE91dHB1dFNoYXBlKG91dHB1dFNoYXBlLCBzaGFwZSk7XG4gICAgfVxuICAgIC8vIElmIHRoZSBpbnB1dHMgaGF2ZSBkaWZmZXJlbnQgcmFua3MsIHdlIGhhdmUgdG8gcmVzaGFwZSB0aGVtIHRvIG1ha2UgdGhlbVxuICAgIC8vIGJyb2FkY2FzdGFibGUuXG4gICAgY29uc3QgYWxsUmFua3MgPSBpbnB1dFNoYXBlLm1hcChzaGFwZSA9PiBzaGFwZS5sZW5ndGgpO1xuICAgIGlmIChpbnB1dFNoYXBlLmluZGV4T2YobnVsbCkgPT09IC0xICYmXG4gICAgICAgIGdlbmVyaWNfdXRpbHMudW5pcXVlKGFsbFJhbmtzKS5sZW5ndGggPT09IDEpIHtcbiAgICAgIHRoaXMucmVzaGFwZVJlcXVpcmVkID0gZmFsc2U7XG4gICAgfSBlbHNlIHtcbiAgICAgIHRoaXMucmVzaGFwZVJlcXVpcmVkID0gdHJ1ZTtcbiAgICB9XG4gIH1cblxuICBjYWxsKGlucHV0czogVGVuc29yfFRlbnNvcltdLCBrd2FyZ3M6IEt3YXJncyk6IFRlbnNvcnxUZW5zb3JbXSB7XG4gICAgcmV0dXJuIHRpZHkoKCkgPT4ge1xuICAgICAgaW5wdXRzID0gaW5wdXRzIGFzIFRlbnNvcltdO1xuICAgICAgaWYgKHRoaXMucmVzaGFwZVJlcXVpcmVkKSB7XG4gICAgICAgIGNvbnN0IHJlc2hhcGVkSW5wdXRzOiBUZW5zb3JbXSA9IFtdO1xuICAgICAgICBjb25zdCBpbnB1dERpbXMgPSBpbnB1dHMubWFwKGlucHV0ID0+IGlucHV0LnJhbmspO1xuICAgICAgICBpZiAoaW5wdXREaW1zLmluZGV4T2YobnVsbCkgPT09IC0xKSB7XG4gICAgICAgICAgLy8gSWYgcmFua3Mgb2YgYWxsIGlucHV0cyBhcmUgYXZhaWxhYmxlLCB3ZSBzaW1wbHkgZXhwYW5kIGVhY2ggb2YgdGhlbVxuICAgICAgICAgIC8vIGF0IGF4aXM9MSB1bnRpbCBhbGwgb2YgdGhlbSBoYXZlIHRoZSBzYW1lIHJhbmsuXG4gICAgICAgICAgY29uc3QgbWF4TkRpbSA9IG1hdGhVdGlscy5tYXgoaW5wdXREaW1zKTtcbiAgICAgICAgICBmb3IgKGxldCB4IG9mIGlucHV0cykge1xuICAgICAgICAgICAgY29uc3QgeE5EaW0gPSB4LnJhbms7XG4gICAgICAgICAgICBmb3IgKGxldCBrID0gMDsgayA8IG1heE5EaW0gLSB4TkRpbTsgKytrKSB7XG4gICAgICAgICAgICAgIHggPSBLLmV4cGFuZERpbXMoeCwgMSk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICByZXNoYXBlZElucHV0cy5wdXNoKHgpO1xuICAgICAgICAgIH1cbiAgICAgICAgICByZXR1cm4gdGhpcy5tZXJnZUZ1bmN0aW9uKHJlc2hhcGVkSW5wdXRzKTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAvLyBUcmFuc3Bvc2UgYWxsIGlucHV0cyBzbyB0aGF0IGJhdGNoIHNpemUgaXMgdGhlIGxhc3QgZGltZW5zaW9uLlxuICAgICAgICAgIC8vIFtiYXRjaFNpemUsIGRpbTEsIGRpbTIsIC4uLl0gLT4gW2RpbTEsIGRpbTIsIC4uLiwgYmF0Y2hTaXplXVxuICAgICAgICAgIGxldCB0cmFuc3Bvc2VkID0gZmFsc2U7XG4gICAgICAgICAgZm9yIChjb25zdCB4IG9mIGlucHV0cykge1xuICAgICAgICAgICAgY29uc3QgeE5EaW0gPSB4LnJhbms7XG4gICAgICAgICAgICBpZiAoeE5EaW0gPT0gbnVsbCkge1xuICAgICAgICAgICAgICBjb25zdCB4U2hhcGUgPSB4LnNoYXBlO1xuICAgICAgICAgICAgICBjb25zdCBiYXRjaFNpemUgPSB4U2hhcGVbMF07XG4gICAgICAgICAgICAgIGNvbnN0IG5ld1NoYXBlID0geFNoYXBlLnNsaWNlKDEpLmNvbmNhdChbYmF0Y2hTaXplXSk7XG4gICAgICAgICAgICAgIGxldCB4VHJhbnNwb3NlZCA9IHRmYy5yZXNoYXBlKFxuICAgICAgICAgICAgICAgICAgeCwgW2JhdGNoU2l6ZV0uY29uY2F0KG1hdGhVdGlscy5hcnJheVByb2QoeFNoYXBlLnNsaWNlKDEpKSkpO1xuICAgICAgICAgICAgICB4VHJhbnNwb3NlZCA9IHRmYy50cmFuc3Bvc2UoeFRyYW5zcG9zZWQsIFsxLCAwXSk7XG4gICAgICAgICAgICAgIHhUcmFuc3Bvc2VkID0gdGZjLnJlc2hhcGUoeFRyYW5zcG9zZWQsIG5ld1NoYXBlKTtcbiAgICAgICAgICAgICAgcmVzaGFwZWRJbnB1dHMucHVzaCh4VHJhbnNwb3NlZCk7XG4gICAgICAgICAgICAgIHRyYW5zcG9zZWQgPSB0cnVlO1xuICAgICAgICAgICAgfSBlbHNlIGlmICh4TkRpbSA+IDEpIHtcbiAgICAgICAgICAgICAgY29uc3QgZGltcyA9IG1hdGhVdGlscy5yYW5nZSgxLCB4TkRpbSkuY29uY2F0KFswXSk7XG4gICAgICAgICAgICAgIHJlc2hhcGVkSW5wdXRzLnB1c2godGZjLnRyYW5zcG9zZSh4LCBkaW1zKSk7XG4gICAgICAgICAgICAgIHRyYW5zcG9zZWQgPSB0cnVlO1xuICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgLy8gV2UgZG9uJ3QgdHJhbnNwb3NlIGlucHV0cyBpZiB0aGV5IGFyZSAxRCB2ZWN0b3JzIG9yIHNjYWxhcnMuXG4gICAgICAgICAgICAgIHJlc2hhcGVkSW5wdXRzLnB1c2goeCk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgfVxuICAgICAgICAgIGxldCB5ID0gdGhpcy5tZXJnZUZ1bmN0aW9uKHJlc2hhcGVkSW5wdXRzKTtcbiAgICAgICAgICBjb25zdCB5TkRpbSA9IHkucmFuaztcbiAgICAgICAgICBpZiAodHJhbnNwb3NlZCkge1xuICAgICAgICAgICAgLy8gSWYgaW5wdXRzIGhhdmUgYmVlbiB0cmFuc3Bvc2VkLCB3ZSBoYXZlIHRvIHRyYW5zcG9zZSB0aGUgb3V0cHV0XG4gICAgICAgICAgICAvLyB0b28uXG4gICAgICAgICAgICBpZiAoeU5EaW0gPT0gbnVsbCkge1xuICAgICAgICAgICAgICBjb25zdCB5U2hhcGUgPSB5LnNoYXBlO1xuICAgICAgICAgICAgICBjb25zdCB5TkRpbSA9IHlTaGFwZS5sZW5ndGg7XG4gICAgICAgICAgICAgIGNvbnN0IGJhdGNoU2l6ZSA9IHlTaGFwZVt5TkRpbSAtIDFdO1xuICAgICAgICAgICAgICBjb25zdCBuZXdTaGFwZSA9XG4gICAgICAgICAgICAgICAgICBbYmF0Y2hTaXplXS5jb25jYXQoeVNoYXBlLnNsaWNlKDAsIHlTaGFwZS5sZW5ndGggLSAxKSk7XG4gICAgICAgICAgICAgIHkgPSB0ZmMucmVzaGFwZShcbiAgICAgICAgICAgICAgICAgIHRmYy50cmFuc3Bvc2UodGZjLnJlc2hhcGUoeSwgWy0xLCBiYXRjaFNpemVdKSwgWzEsIDBdKSxcbiAgICAgICAgICAgICAgICAgIG5ld1NoYXBlKTtcbiAgICAgICAgICAgIH0gZWxzZSBpZiAoeU5EaW0gPiAxKSB7XG4gICAgICAgICAgICAgIGNvbnN0IGRpbXMgPSBbeU5EaW0gLSAxXS5jb25jYXQobWF0aFV0aWxzLnJhbmdlKDAsIHlORGltIC0gMSkpO1xuICAgICAgICAgICAgICB5ID0gdGZjLnRyYW5zcG9zZSh5LCBkaW1zKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9XG4gICAgICAgICAgcmV0dXJuIHk7XG4gICAgICAgIH1cbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHJldHVybiB0aGlzLm1lcmdlRnVuY3Rpb24oaW5wdXRzKTtcbiAgICAgIH1cbiAgICB9KTtcbiAgfVxuXG4gIGNvbXB1dGVPdXRwdXRTaGFwZShpbnB1dFNoYXBlOiBTaGFwZXxTaGFwZVtdKTogU2hhcGV8U2hhcGVbXSB7XG4gICAgaW5wdXRTaGFwZSA9IGlucHV0U2hhcGUgYXMgU2hhcGVbXTtcbiAgICBsZXQgb3V0cHV0U2hhcGU6IFNoYXBlO1xuICAgIGlmIChpbnB1dFNoYXBlWzBdID09IG51bGwpIHtcbiAgICAgIG91dHB1dFNoYXBlID0gbnVsbDtcbiAgICB9IGVsc2Uge1xuICAgICAgb3V0cHV0U2hhcGUgPSBpbnB1dFNoYXBlWzBdLnNsaWNlKDEpO1xuICAgIH1cbiAgICBmb3IgKGxldCBpID0gMTsgaSA8IGlucHV0U2hhcGUubGVuZ3RoOyArK2kpIHtcbiAgICAgIGNvbnN0IHNoYXBlID0gaW5wdXRTaGFwZVtpXSA9PSBudWxsID8gbnVsbCA6IGlucHV0U2hhcGVbaV0uc2xpY2UoMSk7XG4gICAgICBvdXRwdXRTaGFwZSA9IHRoaXMuY29tcHV0ZUVsZW1lbnR3aXNlT3BPdXRwdXRTaGFwZShvdXRwdXRTaGFwZSwgc2hhcGUpO1xuICAgIH1cblxuICAgIGxldCBiYXRjaFNpemVzOiBudW1iZXJbXSA9IFtdO1xuICAgIGZvciAoY29uc3Qgc2hhcGUgb2YgaW5wdXRTaGFwZSkge1xuICAgICAgaWYgKHNoYXBlICE9IG51bGwgJiYgc2hhcGVbMF0gIT09IG51bGwpIHtcbiAgICAgICAgYmF0Y2hTaXplcy5wdXNoKHNoYXBlWzBdKTtcbiAgICAgIH1cbiAgICB9XG4gICAgYmF0Y2hTaXplcyA9IGdlbmVyaWNfdXRpbHMudW5pcXVlKGJhdGNoU2l6ZXMpO1xuICAgIGlmIChiYXRjaFNpemVzLmxlbmd0aCA9PT0gMSkge1xuICAgICAgb3V0cHV0U2hhcGUgPSBiYXRjaFNpemVzLmNvbmNhdChvdXRwdXRTaGFwZSk7XG4gICAgfSBlbHNlIHtcbiAgICAgIG91dHB1dFNoYXBlID0gW251bGxdLmNvbmNhdChvdXRwdXRTaGFwZSk7XG4gICAgfVxuICAgIHJldHVybiBvdXRwdXRTaGFwZTtcbiAgfVxuXG4gIGNvbXB1dGVNYXNrKGlucHV0czogVGVuc29yfFRlbnNvcltdLCBtYXNrPzogVGVuc29yfFRlbnNvcltdKTogVGVuc29yIHtcbiAgICByZXR1cm4gdGZjLnRpZHkoKCkgPT4ge1xuICAgICAgaWYgKG1hc2sgPT0gbnVsbCkge1xuICAgICAgICByZXR1cm4gbnVsbDtcbiAgICAgIH1cbiAgICAgIGlmICghQXJyYXkuaXNBcnJheShtYXNrKSkge1xuICAgICAgICB0aHJvdyBuZXcgVmFsdWVFcnJvcignYG1hc2tgIHNob3VsZCBiZSBhbiBBcnJheScpO1xuICAgICAgfVxuICAgICAgaWYgKCFBcnJheS5pc0FycmF5KGlucHV0cykpIHtcbiAgICAgICAgdGhyb3cgbmV3IFZhbHVlRXJyb3IoJ2BpbnB1dHNgIHNob3VsZCBiZSBhbiBBcnJheScpO1xuICAgICAgfVxuICAgICAgaWYgKG1hc2subGVuZ3RoICE9PSBpbnB1dHMubGVuZ3RoKSB7XG4gICAgICAgIHRocm93IG5ldyBWYWx1ZUVycm9yKFxuICAgICAgICAgICAgYFRoZSBBcnJheSAnaW5wdXRzJyBhbmQgJ21hc2snIGFyZSBleHBlY3RlZCB0byBoYXZlIHRoZSBzYW1lIGAgK1xuICAgICAgICAgICAgYGxlbmd0aCwgYnV0IGhhdmUgZGlmZmVyZW50IGxlbmd0aHMgYCArXG4gICAgICAgICAgICBgKCR7aW5wdXRzLmxlbmd0aH0gdnMgJHttYXNrLmxlbmd0aH0pYCk7XG4gICAgICB9XG4gICAgICBpZiAobWFzay5ldmVyeShtID0+IG0gPT0gbnVsbCkpIHtcbiAgICAgICAgcmV0dXJuIG51bGw7XG4gICAgICB9XG4gICAgICBtYXNrID0gbWFzay5tYXAobSA9PiBtID09IG51bGwgPyBtIDogdGZjLmV4cGFuZERpbXMobSwgMCkpO1xuICAgICAgbGV0IG91dHB1dCA9IG1hc2tbMF07XG4gICAgICBmb3IgKGxldCBpID0gMTsgaSA8IG1hc2subGVuZ3RoIC0gMTsgKytpKSB7XG4gICAgICAgIG91dHB1dCA9IHRmYy5sb2dpY2FsQW5kKG91dHB1dCwgbWFza1tpXSk7XG4gICAgICB9XG4gICAgICByZXR1cm4gb3V0cHV0O1xuICAgIH0pO1xuICB9XG59XG5cbmV4cG9ydCBjbGFzcyBBZGQgZXh0ZW5kcyBNZXJnZSB7XG4gIC8qKiBAbm9jb2xsYXBzZSAqL1xuICBzdGF0aWMgY2xhc3NOYW1lID0gJ0FkZCc7XG4gIGNvbnN0cnVjdG9yKGFyZ3M/OiBMYXllckFyZ3MpIHtcbiAgICBzdXBlcihhcmdzKTtcbiAgfVxuXG4gIHByb3RlY3RlZCBtZXJnZUZ1bmN0aW9uKGlucHV0czogVGVuc29yW10pOiBUZW5zb3Ige1xuICAgIHJldHVybiB0aWR5KCgpID0+IHtcbiAgICAgIGxldCBvdXRwdXQgPSBpbnB1dHNbMF0uY2xvbmUoKTtcbiAgICAgIGZvciAobGV0IGkgPSAxOyBpIDwgaW5wdXRzLmxlbmd0aDsgKytpKSB7XG4gICAgICAgIG91dHB1dCA9IHRmYy5hZGQob3V0cHV0LCBpbnB1dHNbaV0pO1xuICAgICAgfVxuICAgICAgcmV0dXJuIG91dHB1dDtcbiAgICB9KTtcbiAgfVxufVxuc2VyaWFsaXphdGlvbi5yZWdpc3RlckNsYXNzKEFkZCk7XG5cbi8qKlxuICogQ2FsY3VsYXRlIHRoZSBlbGVtZW50LXdpc2Ugc3VtIG9mIGlucHV0cywgd2hpY2ggYWxsIGhhdmUgdGhlIHNhbWUgc2hhcGUuXG4gKlxuICogVGhpcyBmdW5jdGlvbiBjYW4gYmUgaW52b2tlZCBpbiB0aHJlZSB3YXlzLlxuICpcbiAqIDEuIENvbnN0cnVjdCBhbiBpbnN0YW5jZSBvZiBgQWRkYCBsYXllciwgYnkgdXNpbmcgbm8gaW5wdXQgYXJndW1lbnRcbiAqICAgIG9yIGEgc2luZ2xlIGNvbmZpZ3VyYXRpb24gYXJndW1lbnQuIFRoZSByZXN1bHRhbnQgYEFkZGAgbGF5ZXIgY2FuIHRoZW5cbiAqICAgIGJlIHVzZWQgb24gYHRmLlN5bWJvbGljVGVuc29yYHMgb3IgYHRmLlRlbnNvcmBzLiBGb3IgZXhhbXBsZTpcbiAqXG4gKiBgYGBqc1xuICogY29uc3QgYWRkTGF5ZXIgPSB0Zi5sYXllcnMuYWRkKCk7XG4gKlxuICogLy8gVGhlIGxheWVyIGNhbiBiZSBhcHBsaWVkIHRvIGlucHV0cy5cbiAqIGNvbnN0IGlucHV0MSA9IHRmLmlucHV0KHtzaGFwZTogWzIsIDJdfSk7XG4gKiBjb25zdCBpbnB1dDIgPSB0Zi5pbnB1dCh7c2hhcGU6IFsyLCAyXX0pO1xuICogY29uc3Qgb3V0cHV0ID0gYWRkTGF5ZXIuYXBwbHkoW2lucHV0MSwgaW5wdXQyXSk7XG4gKiBjb25zb2xlLmxvZyhvdXRwdXQuc2hhcGUpO1xuICogLy8gWW91IGdldCBbbnVsbCwgMiwgMl0sIHdpdGggdGhlIGZpcnN0IGRpbWVuc2lvbiBhcyB0aGUgdW5kZXRlcm1pbmVkIGJhdGNoXG4gKiAvLyBkaW1lbnNpb24uXG4gKiBgYGBcbiAqXG4gKiAyLiBJbnZva2UgZGlyZWN0bHkgb24gYW4gYEFycmF5YCBvZiBgdGYuU3ltYm9saWNUZW5zb3Jgcy4gVGhpcyBjb25zdHJ1Y3RzXG4gKiAgICBhbiBgTGF5ZXJgIG9iamVjdCBpbnRlcm5hbGx5IGFuZCBjYWxscyBpdHMgYGFwcGx5YCBtZXRob2Qgb24gdGhlIGlucHV0cyxcbiAqICAgIGdlbmVyYXRpbmcgYSBuZXcgYHRmLlN5bWJvbGljVGVuc29yYC4gRm9yIGV4YW1wbGU6XG4gKlxuICogYGBganNcbiAqIGNvbnN0IGlucHV0MSA9IHRmLmlucHV0KHtzaGFwZTogWzIsIDJdfSk7XG4gKiBjb25zdCBpbnB1dDIgPSB0Zi5pbnB1dCh7c2hhcGU6IFsyLCAyXX0pO1xuICogY29uc3Qgb3V0cHV0ID0gdGYubGF5ZXJzLmFkZChbaW5wdXQxLCBpbnB1dDJdKTtcbiAqIGNvbnNvbGUubG9nKG91dHB1dC5zaGFwZSk7XG4gKiAvLyBZb3UgZ2V0IFtudWxsLCAyLCAyXSwgd2l0aCB0aGUgZmlyc3QgZGltZW5zaW9uIGFzIHRoZSB1bmRldGVybWluZWQgYmF0Y2hcbiAqIC8vIGRpbWVuc2lvbi5cbiAqIGBgYFxuICpcbiAqIDMuIEludm9rZSBkaXJlY3RseSBvbiBgdGYuVGVuc29yYHMsIGkuZS4sIGNvbmNyZXRlIHZhbHVlcy4gVGhpcyBjb25zdHJ1Y3RzXG4gKiAgICBhbiBgTGF5ZXJgIG9iamVjdCBpbnRlcm5hbGx5IGFuZCBjYWxscyBpdHMgYGFwcGx5YCBtZXRob2Qgb24gdGhlIGlucHV0cyxcbiAqICAgIGdlbmVyYXRpbmcgYSBuZXcgYHRmLlRlbnNvcmAgYXMgdGhlIHJlc3VsdCBvZiB0aGUgY29tcHV0YXRpb24uIEZvclxuICogZXhhbXBsZTpcbiAqXG4gKiBgYGBqc1xuICogY29uc3QgaW5wdXQxID0gdGYudGVuc29yMmQoWzEsIDIsIDMsIDRdLCBbMiwgMl0pO1xuICogY29uc3QgaW5wdXQyID0gdGYudGVuc29yMmQoWzEwLCAyMCwgMzAsIDQwXSwgWzIsIDJdKTtcbiAqIHRmLmxheWVycy5hZGQoW2lucHV0MSwgaW5wdXQyXSkucHJpbnQoKTtcbiAqIC8vIEdpdmVzIFtbMTEsIDIyXSwgWzMzLCA0NF1dLlxuICpcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGFkZChjb25maWc/OiBTeW1ib2xpY1RlbnNvcltdfFRlbnNvcltdfExheWVyQXJncyk6IExheWVyfFxuICAgIFN5bWJvbGljVGVuc29yfFRlbnNvciB7XG4gIGlmIChBcnJheS5pc0FycmF5KGNvbmZpZykpIHtcbiAgICBjb25zdCBsYXllciA9IG5ldyBBZGQoe30pO1xuICAgIHJldHVybiBsYXllci5hcHBseShjb25maWcpIGFzIFN5bWJvbGljVGVuc29yIHwgVGVuc29yO1xuICB9IGVsc2Uge1xuICAgIHJldHVybiBuZXcgQWRkKGNvbmZpZyk7XG4gIH1cbn1cblxuZXhwb3J0IGNsYXNzIE11bHRpcGx5IGV4dGVuZHMgTWVyZ2Uge1xuICAvKiogQG5vY29sbGFwc2UgKi9cbiAgc3RhdGljIGNsYXNzTmFtZSA9ICdNdWx0aXBseSc7XG4gIGNvbnN0cnVjdG9yKGFyZ3M/OiBMYXllckFyZ3MpIHtcbiAgICBzdXBlcihhcmdzKTtcbiAgfVxuXG4gIHByb3RlY3RlZCBtZXJnZUZ1bmN0aW9uKGlucHV0czogVGVuc29yW10pOiBUZW5zb3Ige1xuICAgIHJldHVybiB0aWR5KCgpID0+IHtcbiAgICAgIGxldCBvdXRwdXQgPSBpbnB1dHNbMF0uY2xvbmUoKTtcbiAgICAgIGZvciAobGV0IGkgPSAxOyBpIDwgaW5wdXRzLmxlbmd0aDsgKytpKSB7XG4gICAgICAgIG91dHB1dCA9IHRmYy5tdWwob3V0cHV0LCBpbnB1dHNbaV0pO1xuICAgICAgfVxuICAgICAgcmV0dXJuIG91dHB1dDtcbiAgICB9KTtcbiAgfVxufVxuc2VyaWFsaXphdGlvbi5yZWdpc3RlckNsYXNzKE11bHRpcGx5KTtcblxuLyoqXG4gKiBDYWxjdWxhdGUgdGhlIGVsZW1lbnQtd2lzZSBwcm9kdWN0IG9mIGlucHV0cywgd2hpY2ggYWxsIGhhdmUgdGhlIHNhbWUgc2hhcGUuXG4gKlxuICogVGhpcyBmdW5jdGlvbiBjYW4gYmUgaW52b2tlZCBpbiB0aHJlZSB3YXlzLlxuICpcbiAqIDEuIENvbnN0cnVjdCBhbiBpbnN0YW5jZSBvZiBgTXVsdGlwbHlgIGxheWVyLCBieSB1c2luZyBubyBpbnB1dCBhcmd1bWVudFxuICogICAgb3IgYSBzaW5nbGUgY29uZmlndXJhdGlvbiBhcmd1bWVudC4gVGhlIHJlc3VsdGFudCBgTXVsdGlwbHlgIGxheWVyIGNhblxuICogICAgdGhlbiBiZSB1c2VkIG9uIGB0Zi5TeW1ib2xpY1RlbnNvcmBzIG9yIGB0Zi5UZW5zb3Jgcy4gRm9yIGV4YW1wbGU6XG4gKlxuICogYGBganNcbiAqIGNvbnN0IG11bHRpcGx5TGF5ZXIgPSB0Zi5sYXllcnMubXVsdGlwbHkoKTtcbiAqXG4gKiAvLyBUaGUgbGF5ZXIgY2FuIGJlIGFwcGxpZWQgdG8gaW5wdXRzLlxuICogY29uc3QgaW5wdXQxID0gdGYuaW5wdXQoe3NoYXBlOiBbMiwgMl19KTtcbiAqIGNvbnN0IGlucHV0MiA9IHRmLmlucHV0KHtzaGFwZTogWzIsIDJdfSk7XG4gKiBjb25zdCBvdXRwdXQgPSBtdWx0aXBseUxheWVyLmFwcGx5KFtpbnB1dDEsIGlucHV0Ml0pO1xuICogY29uc29sZS5sb2cob3V0cHV0LnNoYXBlKTtcbiAqIC8vIFlvdSBnZXQgW251bGwsIDIsIDJdLCB3aXRoIHRoZSBmaXJzdCBkaW1lbnNpb24gYXMgdGhlIHVuZGV0ZXJtaW5lZCBiYXRjaFxuICogLy8gZGltZW5zaW9uLlxuICogYGBgXG4gKlxuICogMi4gSW52b2tlIGRpcmVjdGx5IG9uIGFuIGBBcnJheWAgb2YgYHRmLlN5bWJvbGljVGVuc29yYHMuIFRoaXMgY29uc3RydWN0c1xuICogICAgYW4gYExheWVyYCBvYmplY3QgaW50ZXJuYWxseSBhbmQgY2FsbHMgaXRzIGBhcHBseWAgbWV0aG9kIG9uIHRoZSBpbnB1dHMsXG4gKiAgICBnZW5lcmF0aW5nIGEgbmV3IGB0Zi5TeW1ib2xpY1RlbnNvcmAuIEZvciBleGFtcGxlOlxuICpcbiAqIGBgYGpzXG4gKiBjb25zdCBpbnB1dDEgPSB0Zi5pbnB1dCh7c2hhcGU6IFsyLCAyXX0pO1xuICogY29uc3QgaW5wdXQyID0gdGYuaW5wdXQoe3NoYXBlOiBbMiwgMl19KTtcbiAqIGNvbnN0IG91dHB1dCA9IHRmLmxheWVycy5tdWx0aXBseShbaW5wdXQxLCBpbnB1dDJdKTtcbiAqIGNvbnNvbGUubG9nKG91dHB1dC5zaGFwZSk7XG4gKiAvLyBZb3UgZ2V0IFtudWxsLCAyLCAyXSwgd2l0aCB0aGUgZmlyc3QgZGltZW5zaW9uIGFzIHRoZSB1bmRldGVybWluZWQgYmF0Y2hcbiAqIC8vIGRpbWVuc2lvbi5cbiAqIGBgYFxuICpcbiAqIDMuIEludm9rZSBkaXJlY3RseSBvbiBgdGYuVGVuc29yYHMsIGkuZS4sIGNvbmNyZXRlIHZhbHVlcy4gVGhpcyBjb25zdHJ1Y3RzXG4gKiAgICBhbiBgTGF5ZXJgIG9iamVjdCBpbnRlcm5hbGx5IGFuZCBjYWxscyBpdHMgYGFwcGx5YCBtZXRob2Qgb24gdGhlIGlucHV0cyxcbiAqICAgIGdlbmVyYXRpbmcgYSBuZXcgYHRmLlRlbnNvcmAgYXMgdGhlIHJlc3VsdCBvZiB0aGUgY29tcHV0YXRpb24uIEZvclxuICogZXhhbXBsZTpcbiAqXG4gKiBgYGBqc1xuICogY29uc3QgaW5wdXQxID0gdGYudGVuc29yMmQoWzEsIDIsIDMsIDRdLCBbMiwgMl0pO1xuICogY29uc3QgaW5wdXQyID0gdGYudGVuc29yMmQoWzEwLCAyMCwgMzAsIDQwXSwgWzIsIDJdKTtcbiAqIHRmLmxheWVycy5tdWx0aXBseShbaW5wdXQxLCBpbnB1dDJdKS5wcmludCgpO1xuICogLy8gR2l2ZXMgW1sxMCwgNDBdLCBbOTAsIDE2MF1dLlxuICpcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIG11bHRpcGx5KGNvbmZpZz86IFN5bWJvbGljVGVuc29yW118VGVuc29yW118TGF5ZXJBcmdzKTogTGF5ZXJ8XG4gICAgU3ltYm9saWNUZW5zb3J8VGVuc29yIHtcbiAgaWYgKEFycmF5LmlzQXJyYXkoY29uZmlnKSkge1xuICAgIGNvbnN0IGxheWVyID0gbmV3IE11bHRpcGx5KHt9KTtcbiAgICByZXR1cm4gbGF5ZXIuYXBwbHkoY29uZmlnKSBhcyBTeW1ib2xpY1RlbnNvciB8IFRlbnNvcjtcbiAgfSBlbHNlIHtcbiAgICByZXR1cm4gbmV3IE11bHRpcGx5KGNvbmZpZyk7XG4gIH1cbn1cblxuZXhwb3J0IGNsYXNzIEF2ZXJhZ2UgZXh0ZW5kcyBNZXJnZSB7XG4gIC8qKiBAbm9jb2xsYXBzZSAqL1xuICBzdGF0aWMgY2xhc3NOYW1lID0gJ0F2ZXJhZ2UnO1xuICBjb25zdHJ1Y3RvcihhcmdzPzogTGF5ZXJBcmdzKSB7XG4gICAgc3VwZXIoYXJncyk7XG4gIH1cblxuICBwcm90ZWN0ZWQgbWVyZ2VGdW5jdGlvbihpbnB1dHM6IFRlbnNvcltdKTogVGVuc29yIHtcbiAgICByZXR1cm4gdGlkeSgoKSA9PiB7XG4gICAgICBsZXQgb3V0cHV0ID0gaW5wdXRzWzBdLmNsb25lKCk7XG4gICAgICBmb3IgKGxldCBpID0gMTsgaSA8IGlucHV0cy5sZW5ndGg7ICsraSkge1xuICAgICAgICBvdXRwdXQgPSB0ZmMuYWRkKG91dHB1dCwgaW5wdXRzW2ldKTtcbiAgICAgIH1cbiAgICAgIHJldHVybiB0ZmMubXVsKDEgLyBpbnB1dHMubGVuZ3RoLCBvdXRwdXQpO1xuICAgIH0pO1xuICB9XG59XG5zZXJpYWxpemF0aW9uLnJlZ2lzdGVyQ2xhc3MoQXZlcmFnZSk7XG5cbi8qKlxuICogQ2FsY3VsYXRlIHRoZSBlbGVtZW50LXdpc2UgYXJpdGhtZXRpYyBtZWFuIG9mIGlucHV0cywgd2hpY2ggYWxsIGhhdmUgdGhlIHNhbWVcbiAqIHNoYXBlLlxuICpcbiAqIFRoaXMgZnVuY3Rpb24gY2FuIGJlIGludm9rZWQgaW4gdGhyZWUgd2F5cy5cbiAqXG4gKiAxLiBDb25zdHJ1Y3QgYW4gaW5zdGFuY2Ugb2YgYEF2ZXJhZ2VgIGxheWVyLCBieSB1c2luZyBubyBpbnB1dCBhcmd1bWVudFxuICogICAgb3IgYSBzaW5nbGUgY29uZmlndXJhdGlvbiBhcmd1bWVudC4gVGhlIHJlc3VsdGFudCBgQXZlcmFnZWAgbGF5ZXIgY2FuIHRoZW5cbiAqICAgIGJlIHVzZWQgb24gYHRmLlN5bWJvbGljVGVuc29yYHMgb3IgYHRmLlRlbnNvcmBzLiBGb3IgZXhhbXBsZTpcbiAqXG4gKiBgYGBqc1xuICogY29uc3QgYXZlcmFnZUxheWVyID0gdGYubGF5ZXJzLmF2ZXJhZ2UoKTtcbiAqXG4gKiAvLyBUaGUgbGF5ZXIgY2FuIGJlIGFwcGxpZWQgdG8gaW5wdXRzLlxuICogY29uc3QgaW5wdXQxID0gdGYuaW5wdXQoe3NoYXBlOiBbMiwgMl19KTtcbiAqIGNvbnN0IGlucHV0MiA9IHRmLmlucHV0KHtzaGFwZTogWzIsIDJdfSk7XG4gKiBjb25zdCBvdXRwdXQgPSBhdmVyYWdlTGF5ZXIuYXBwbHkoW2lucHV0MSwgaW5wdXQyXSk7XG4gKiBjb25zb2xlLmxvZyhvdXRwdXQuc2hhcGUpO1xuICogLy8gWW91IGdldCBbbnVsbCwgMiwgMl0sIHdpdGggdGhlIGZpcnN0IGRpbWVuc2lvbiBhcyB0aGUgdW5kZXRlcm1pbmVkIGJhdGNoXG4gKiAvLyBkaW1lbnNpb24uXG4gKiBgYGBcbiAqXG4gKiAyLiBJbnZva2UgZGlyZWN0bHkgb24gYW4gYEFycmF5YCBvZiBgdGYuU3ltYm9saWNUZW5zb3Jgcy4gVGhpcyBjb25zdHJ1Y3RzXG4gKiAgICBhbiBgTGF5ZXJgIG9iamVjdCBpbnRlcm5hbGx5IGFuZCBjYWxscyBpdHMgYGFwcGx5YCBtZXRob2Qgb24gdGhlIGlucHV0cyxcbiAqICAgIGdlbmVyYXRpbmcgYSBuZXcgYHRmLlN5bWJvbGljVGVuc29yYC4gRm9yIGV4YW1wbGU6XG4gKlxuICogYGBganNcbiAqIGNvbnN0IGlucHV0MSA9IHRmLmlucHV0KHtzaGFwZTogWzIsIDJdfSk7XG4gKiBjb25zdCBpbnB1dDIgPSB0Zi5pbnB1dCh7c2hhcGU6IFsyLCAyXX0pO1xuICogY29uc3Qgb3V0cHV0ID0gdGYubGF5ZXJzLmF2ZXJhZ2UoW2lucHV0MSwgaW5wdXQyXSk7XG4gKiBjb25zb2xlLmxvZyhvdXRwdXQuc2hhcGUpO1xuICogLy8gWW91IGdldCBbbnVsbCwgMiwgMl0sIHdpdGggdGhlIGZpcnN0IGRpbWVuc2lvbiBhcyB0aGUgdW5kZXRlcm1pbmVkIGJhdGNoXG4gKiAvLyBkaW1lbnNpb24uXG4gKiBgYGBcbiAqXG4gKiAzLiBJbnZva2UgZGlyZWN0bHkgb24gYHRmLlRlbnNvcmBzLCBpLmUuLCBjb25jcmV0ZSB2YWx1ZXMuIFRoaXMgY29uc3RydWN0c1xuICogICAgYW4gYExheWVyYCBvYmplY3QgaW50ZXJuYWxseSBhbmQgY2FsbHMgaXRzIGBhcHBseWAgbWV0aG9kIG9uIHRoZSBpbnB1dHMsXG4gKiAgICBnZW5lcmF0aW5nIGEgbmV3IGB0Zi5UZW5zb3JgIGFzIHRoZSByZXN1bHQgb2YgdGhlIGNvbXB1dGF0aW9uLiBGb3JcbiAqIGV4YW1wbGU6XG4gKlxuICogYGBganNcbiAqIGNvbnN0IGlucHV0MSA9IHRmLnRlbnNvcjJkKFsxLCAyLCAzLCA0XSwgWzIsIDJdKTtcbiAqIGNvbnN0IGlucHV0MiA9IHRmLnRlbnNvcjJkKFsxMCwgMjAsIDMwLCA0MF0sIFsyLCAyXSk7XG4gKiB0Zi5sYXllcnMuYXZlcmFnZShbaW5wdXQxLCBpbnB1dDJdKS5wcmludCgpO1xuICogLy8gR2l2ZXMgW1s1LjUsIDExXSwgWzE2LjUsIDIyXV0uXG4gKlxuICovXG5leHBvcnQgZnVuY3Rpb24gYXZlcmFnZShjb25maWc/OiBTeW1ib2xpY1RlbnNvcltdfFRlbnNvcltdfExheWVyQXJncyk6IExheWVyfFxuICAgIFN5bWJvbGljVGVuc29yfFRlbnNvciB7XG4gIGlmIChBcnJheS5pc0FycmF5KGNvbmZpZykpIHtcbiAgICBjb25zdCBsYXllciA9IG5ldyBBdmVyYWdlKHt9KTtcbiAgICByZXR1cm4gbGF5ZXIuYXBwbHkoY29uZmlnKSBhcyBTeW1ib2xpY1RlbnNvciB8IFRlbnNvcjtcbiAgfSBlbHNlIHtcbiAgICByZXR1cm4gbmV3IEF2ZXJhZ2UoY29uZmlnKTtcbiAgfVxufVxuXG5leHBvcnQgY2xhc3MgTWF4aW11bSBleHRlbmRzIE1lcmdlIHtcbiAgLyoqIEBub2NvbGxhcHNlICovXG4gIHN0YXRpYyBjbGFzc05hbWUgPSAnTWF4aW11bSc7XG4gIGNvbnN0cnVjdG9yKGFyZ3M/OiBMYXllckFyZ3MpIHtcbiAgICBzdXBlcihhcmdzKTtcbiAgfVxuXG4gIHByb3RlY3RlZCBtZXJnZUZ1bmN0aW9uKGlucHV0czogVGVuc29yW10pOiBUZW5zb3Ige1xuICAgIHJldHVybiB0aWR5KCgpID0+IHtcbiAgICAgIGxldCBvdXRwdXQgPSBpbnB1dHNbMF07XG4gICAgICBmb3IgKGxldCBpID0gMTsgaSA8IGlucHV0cy5sZW5ndGg7ICsraSkge1xuICAgICAgICBvdXRwdXQgPSB0ZmMubWF4aW11bShvdXRwdXQsIGlucHV0c1tpXSk7XG4gICAgICB9XG4gICAgICByZXR1cm4gb3V0cHV0O1xuICAgIH0pO1xuICB9XG59XG5zZXJpYWxpemF0aW9uLnJlZ2lzdGVyQ2xhc3MoTWF4aW11bSk7XG5cbi8qKlxuICogQ2FsY3VsYXRlIHRoZSBlbGVtZW50LXdpc2UgbWF4aW11bSBvZiBpbnB1dHMsIHdoaWNoIGFsbCBoYXZlIHRoZSBzYW1lIHNoYXBlLlxuICpcbiAqIFRoaXMgZnVuY3Rpb24gY2FuIGJlIGludm9rZWQgaW4gdGhyZWUgd2F5cy5cbiAqXG4gKiAxLiBDb25zdHJ1Y3QgYW4gaW5zdGFuY2Ugb2YgYE1heGltdW1gIGxheWVyLCBieSB1c2luZyBubyBpbnB1dCBhcmd1bWVudFxuICogICAgb3IgYSBzaW5nbGUgY29uZmlndXJhdGlvbiBhcmd1bWVudC4gVGhlIHJlc3VsdGFudCBgTWF4aW11bWAgbGF5ZXIgY2FuIHRoZW5cbiAqICAgIGJlIHVzZWQgb24gYHRmLlN5bWJvbGljVGVuc29yYHMgb3IgYHRmLlRlbnNvcmBzLiBGb3IgZXhhbXBsZTpcbiAqXG4gKiBgYGBqc1xuICogY29uc3QgbWF4aW11bUxheWVyID0gdGYubGF5ZXJzLm1heGltdW0oKTtcbiAqXG4gKiAvLyBUaGUgbGF5ZXIgY2FuIGJlIGFwcGxpZWQgdG8gaW5wdXRzLlxuICogY29uc3QgaW5wdXQxID0gdGYuaW5wdXQoe3NoYXBlOiBbMiwgMl19KTtcbiAqIGNvbnN0IGlucHV0MiA9IHRmLmlucHV0KHtzaGFwZTogWzIsIDJdfSk7XG4gKiBjb25zdCBvdXRwdXQgPSBtYXhpbXVtTGF5ZXIuYXBwbHkoW2lucHV0MSwgaW5wdXQyXSk7XG4gKiBjb25zb2xlLmxvZyhvdXRwdXQuc2hhcGUpO1xuICogLy8gWW91IGdldCBbbnVsbCwgMiwgMl0sIHdpdGggdGhlIGZpcnN0IGRpbWVuc2lvbiBhcyB0aGUgdW5kZXRlcm1pbmVkIGJhdGNoXG4gKiAvLyBkaW1lbnNpb24uXG4gKiBgYGBcbiAqXG4gKiAyLiBJbnZva2UgZGlyZWN0bHkgb24gYW4gYEFycmF5YCBvZiBgdGYuU3ltYm9saWNUZW5zb3Jgcy4gVGhpcyBjb25zdHJ1Y3RzXG4gKiAgICBhbiBgTGF5ZXJgIG9iamVjdCBpbnRlcm5hbGx5IGFuZCBjYWxscyBpdHMgYGFwcGx5YCBtZXRob2Qgb24gdGhlIGlucHV0cyxcbiAqICAgIGdlbmVyYXRpbmcgYSBuZXcgYHRmLlN5bWJvbGljVGVuc29yYC4gRm9yIGV4YW1wbGU6XG4gKlxuICogYGBganNcbiAqIGNvbnN0IGlucHV0MSA9IHRmLmlucHV0KHtzaGFwZTogWzIsIDJdfSk7XG4gKiBjb25zdCBpbnB1dDIgPSB0Zi5pbnB1dCh7c2hhcGU6IFsyLCAyXX0pO1xuICogY29uc3Qgb3V0cHV0ID0gdGYubGF5ZXJzLm1heGltdW0oW2lucHV0MSwgaW5wdXQyXSk7XG4gKiBjb25zb2xlLmxvZyhvdXRwdXQuc2hhcGUpO1xuICogLy8gWW91IGdldCBbbnVsbCwgMiwgMl0sIHdpdGggdGhlIGZpcnN0IGRpbWVuc2lvbiBhcyB0aGUgdW5kZXRlcm1pbmVkIGJhdGNoXG4gKiAvLyBkaW1lbnNpb24uXG4gKiBgYGBcbiAqXG4gKiAzLiBJbnZva2UgZGlyZWN0bHkgb24gYHRmLlRlbnNvcmBzLCBpLmUuLCBjb25jcmV0ZSB2YWx1ZXMuIFRoaXMgY29uc3RydWN0c1xuICogICAgYW4gYExheWVyYCBvYmplY3QgaW50ZXJuYWxseSBhbmQgY2FsbHMgaXRzIGBhcHBseWAgbWV0aG9kIG9uIHRoZSBpbnB1dHMsXG4gKiAgICBnZW5lcmF0aW5nIGEgbmV3IGB0Zi5UZW5zb3JgIGFzIHRoZSByZXN1bHQgb2YgdGhlIGNvbXB1dGF0aW9uLiBGb3JcbiAqIGV4YW1wbGU6XG4gKlxuICogYGBganNcbiAqIGNvbnN0IGlucHV0MSA9IHRmLnRlbnNvcjJkKFsxLCAyMCwgMywgNDBdLCBbMiwgMl0pO1xuICogY29uc3QgaW5wdXQyID0gdGYudGVuc29yMmQoWzEwLCAyLCAzMCwgNF0sIFsyLCAyXSk7XG4gKiB0Zi5sYXllcnMubWF4aW11bShbaW5wdXQxLCBpbnB1dDJdKS5wcmludCgpO1xuICogLy8gR2l2ZXMgW1sxMCwgMjBdLCBbMzAsIDQwXV0uXG4gKlxuICovXG5leHBvcnQgZnVuY3Rpb24gbWF4aW11bShjb25maWc/OiBTeW1ib2xpY1RlbnNvcltdfFRlbnNvcltdfExheWVyQXJncyk6IExheWVyfFxuICAgIFN5bWJvbGljVGVuc29yfFRlbnNvciB7XG4gIGlmIChBcnJheS5pc0FycmF5KGNvbmZpZykpIHtcbiAgICBjb25zdCBsYXllciA9IG5ldyBNYXhpbXVtKHt9KTtcbiAgICByZXR1cm4gbGF5ZXIuYXBwbHkoY29uZmlnKSBhcyBTeW1ib2xpY1RlbnNvciB8IFRlbnNvcjtcbiAgfSBlbHNlIHtcbiAgICByZXR1cm4gbmV3IE1heGltdW0oY29uZmlnKTtcbiAgfVxufVxuXG5leHBvcnQgY2xhc3MgTWluaW11bSBleHRlbmRzIE1lcmdlIHtcbiAgLyoqIEBub2NvbGxhcHNlICovXG4gIHN0YXRpYyBjbGFzc05hbWUgPSAnTWluaW11bSc7XG4gIGNvbnN0cnVjdG9yKGFyZ3M/OiBMYXllckFyZ3MpIHtcbiAgICBzdXBlcihhcmdzKTtcbiAgfVxuXG4gIHByb3RlY3RlZCBtZXJnZUZ1bmN0aW9uKGlucHV0czogVGVuc29yW10pOiBUZW5zb3Ige1xuICAgIHJldHVybiB0aWR5KCgpID0+IHtcbiAgICAgIGxldCBvdXRwdXQgPSBpbnB1dHNbMF07XG4gICAgICBmb3IgKGxldCBpID0gMTsgaSA8IGlucHV0cy5sZW5ndGg7ICsraSkge1xuICAgICAgICBvdXRwdXQgPSB0ZmMubWluaW11bShvdXRwdXQsIGlucHV0c1tpXSk7XG4gICAgICB9XG4gICAgICByZXR1cm4gb3V0cHV0O1xuICAgIH0pO1xuICB9XG59XG5zZXJpYWxpemF0aW9uLnJlZ2lzdGVyQ2xhc3MoTWluaW11bSk7XG5cbi8qKlxuICogQ2FsY3VsYXRlIHRoZSBlbGVtZW50LXdpc2UgbWluaW11bSBvZiBpbnB1dHMsIHdoaWNoIGFsbCBoYXZlIHRoZSBzYW1lIHNoYXBlLlxuICpcbiAqIFRoaXMgZnVuY3Rpb24gY2FuIGJlIGludm9rZWQgaW4gdGhyZWUgd2F5cy5cbiAqXG4gKiAxLiBDb25zdHJ1Y3QgYW4gaW5zdGFuY2Ugb2YgYE1pbmltdW1gIGxheWVyLCBieSB1c2luZyBubyBpbnB1dCBhcmd1bWVudFxuICogICAgb3IgYSBzaW5nbGUgY29uZmlndXJhdGlvbiBhcmd1bWVudC4gVGhlIHJlc3VsdGFudCBgTWluaW11bWAgbGF5ZXIgY2FuIHRoZW5cbiAqICAgIGJlIHVzZWQgb24gYHRmLlN5bWJvbGljVGVuc29yYHMgb3IgYHRmLlRlbnNvcmBzLiBGb3IgZXhhbXBsZTpcbiAqXG4gKiBgYGBqc1xuICogY29uc3QgbWluaW11bUxheWVyID0gdGYubGF5ZXJzLm1pbmltdW0oKTtcbiAqXG4gKiAvLyBUaGUgbGF5ZXIgY2FuIGJlIGFwcGxpZWQgdG8gaW5wdXRzLlxuICogY29uc3QgaW5wdXQxID0gdGYuaW5wdXQoe3NoYXBlOiBbMiwgMl19KTtcbiAqIGNvbnN0IGlucHV0MiA9IHRmLmlucHV0KHtzaGFwZTogWzIsIDJdfSk7XG4gKiBjb25zdCBvdXRwdXQgPSBtaW5pbXVtTGF5ZXIuYXBwbHkoW2lucHV0MSwgaW5wdXQyXSk7XG4gKiBjb25zb2xlLmxvZyhvdXRwdXQuc2hhcGUpO1xuICogLy8gWW91IGdldCBbbnVsbCwgMiwgMl0sIHdpdGggdGhlIGZpcnN0IGRpbWVuc2lvbiBhcyB0aGUgdW5kZXRlcm1pbmVkIGJhdGNoXG4gKiAvLyBkaW1lbnNpb24uXG4gKiBgYGBcbiAqXG4gKiAyLiBJbnZva2UgZGlyZWN0bHkgb24gYW4gYEFycmF5YCBvZiBgdGYuU3ltYm9saWNUZW5zb3Jgcy4gVGhpcyBjb25zdHJ1Y3RzXG4gKiAgICBhbiBgTGF5ZXJgIG9iamVjdCBpbnRlcm5hbGx5IGFuZCBjYWxscyBpdHMgYGFwcGx5YCBtZXRob2Qgb24gdGhlIGlucHV0cyxcbiAqICAgIGdlbmVyYXRpbmcgYSBuZXcgYHRmLlN5bWJvbGljVGVuc29yYC4gRm9yIGV4YW1wbGU6XG4gKlxuICogYGBganNcbiAqIGNvbnN0IGlucHV0MSA9IHRmLmlucHV0KHtzaGFwZTogWzIsIDJdfSk7XG4gKiBjb25zdCBpbnB1dDIgPSB0Zi5pbnB1dCh7c2hhcGU6IFsyLCAyXX0pO1xuICogY29uc3Qgb3V0cHV0ID0gdGYubGF5ZXJzLm1pbmltdW0oW2lucHV0MSwgaW5wdXQyXSk7XG4gKiBjb25zb2xlLmxvZyhvdXRwdXQuc2hhcGUpO1xuICogLy8gWW91IGdldCBbbnVsbCwgMiwgMl0sIHdpdGggdGhlIGZpcnN0IGRpbWVuc2lvbiBhcyB0aGUgdW5kZXRlcm1pbmVkIGJhdGNoXG4gKiAvLyBkaW1lbnNpb24uXG4gKiBgYGBcbiAqXG4gKiAzLiBJbnZva2UgZGlyZWN0bHkgb24gYHRmLlRlbnNvcmBzLCBpLmUuLCBjb25jcmV0ZSB2YWx1ZXMuIFRoaXMgY29uc3RydWN0c1xuICogICAgYW4gYExheWVyYCBvYmplY3QgaW50ZXJuYWxseSBhbmQgY2FsbHMgaXRzIGBhcHBseWAgbWV0aG9kIG9uIHRoZSBpbnB1dHMsXG4gKiAgICBnZW5lcmF0aW5nIGEgbmV3IGB0Zi5UZW5zb3JgIGFzIHRoZSByZXN1bHQgb2YgdGhlIGNvbXB1dGF0aW9uLiBGb3JcbiAqIGV4YW1wbGU6XG4gKlxuICogYGBganNcbiAqIGNvbnN0IGlucHV0MSA9IHRmLnRlbnNvcjJkKFsxLCAyMCwgMywgNDBdLCBbMiwgMl0pO1xuICogY29uc3QgaW5wdXQyID0gdGYudGVuc29yMmQoWzEwLCAyLCAzMCwgNF0sIFsyLCAyXSk7XG4gKiB0Zi5sYXllcnMubWluaW11bShbaW5wdXQxLCBpbnB1dDJdKS5wcmludCgpO1xuICogLy8gR2l2ZXMgW1sxLCAyXSwgWzMsIDRdXS5cbiAqXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBtaW5pbXVtKGNvbmZpZz86IFN5bWJvbGljVGVuc29yW118VGVuc29yW118TGF5ZXJBcmdzKTogTGF5ZXJ8XG4gICAgU3ltYm9saWNUZW5zb3J8VGVuc29yIHtcbiAgaWYgKEFycmF5LmlzQXJyYXkoY29uZmlnKSkge1xuICAgIGNvbnN0IGxheWVyID0gbmV3IE1pbmltdW0oe30pO1xuICAgIHJldHVybiBsYXllci5hcHBseShjb25maWcpIGFzIFN5bWJvbGljVGVuc29yIHwgVGVuc29yO1xuICB9IGVsc2Uge1xuICAgIHJldHVybiBuZXcgTWluaW11bShjb25maWcpO1xuICB9XG59XG5cbmV4cG9ydCBkZWNsYXJlIGludGVyZmFjZSBDb25jYXRlbmF0ZUxheWVyQXJncyBleHRlbmRzIExheWVyQXJncyB7XG4gIC8qKlxuICAgKiBBeGlzIGFsb25nIHdoaWNoIHRvIGNvbmNhdGVuYXRlLlxuICAgKi9cbiAgYXhpcz86IG51bWJlcjtcbn1cblxuZXhwb3J0IGNsYXNzIENvbmNhdGVuYXRlIGV4dGVuZHMgTWVyZ2Uge1xuICAvKiogQG5vY29sbGFwc2UgKi9cbiAgc3RhdGljIGNsYXNzTmFtZSA9ICdDb25jYXRlbmF0ZSc7XG4gIHJlYWRvbmx5IERFRkFVTFRfQVhJUyA9IC0xO1xuICBwcml2YXRlIHJlYWRvbmx5IGF4aXM6IG51bWJlcjtcblxuICBjb25zdHJ1Y3RvcihhcmdzPzogQ29uY2F0ZW5hdGVMYXllckFyZ3MpIHtcbiAgICBzdXBlcihhcmdzKTtcbiAgICBpZiAoYXJncyA9PSBudWxsKSB7XG4gICAgICBhcmdzID0ge307XG4gICAgfVxuICAgIHRoaXMuYXhpcyA9IGFyZ3MuYXhpcyA9PSBudWxsID8gdGhpcy5ERUZBVUxUX0FYSVMgOiBhcmdzLmF4aXM7XG4gICAgdGhpcy5zdXBwb3J0c01hc2tpbmcgPSB0cnVlO1xuICAgIHRoaXMucmVzaGFwZVJlcXVpcmVkID0gZmFsc2U7XG4gIH1cblxuICBidWlsZChpbnB1dFNoYXBlOiBTaGFwZXxTaGFwZVtdKTogdm9pZCB7XG4gICAgLy8gVXNlZCBwdXJlbHkgZm9yIHNoYXBlIHZhbGlkYXRpb24uXVxuICAgIGlmICghKEFycmF5LmlzQXJyYXkoaW5wdXRTaGFwZSkgJiYgQXJyYXkuaXNBcnJheShpbnB1dFNoYXBlWzBdKSkgfHxcbiAgICAgICAgaW5wdXRTaGFwZS5sZW5ndGggPT09IDEpIHtcbiAgICAgIHRocm93IG5ldyBWYWx1ZUVycm9yKFxuICAgICAgICAgICdBIGBDb25jYXRlbmF0ZWAgbGF5ZXIgc2hvdWxkIGJlIGNhbGxlZCBvbiBhIGxpc3Qgb2YgYXQgbGVhc3QgMiAnICtcbiAgICAgICAgICAnaW5wdXRzJyk7XG4gICAgfVxuICAgIGlucHV0U2hhcGUgPSBpbnB1dFNoYXBlIGFzIFNoYXBlW107XG5cbiAgICBsZXQgYWxsTm9uZVNoYXBlID0gdHJ1ZTtcbiAgICBmb3IgKGNvbnN0IHNoYXBlIG9mIGlucHV0U2hhcGUpIHtcbiAgICAgIGlmIChzaGFwZSAhPSBudWxsKSB7XG4gICAgICAgIGFsbE5vbmVTaGFwZSA9IGZhbHNlO1xuICAgICAgICBicmVhaztcbiAgICAgIH1cbiAgICB9XG4gICAgaWYgKGFsbE5vbmVTaGFwZSkge1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIGNvbnN0IHNoYXBlU2V0OiBTaGFwZVtdID0gW107XG4gICAgZm9yIChsZXQgaSA9IDA7IGkgPCBpbnB1dFNoYXBlLmxlbmd0aDsgKytpKSB7XG4gICAgICBjb25zdCBzaGFwZVdpdGhvdXRDb25jYXRBeGlzID0gaW5wdXRTaGFwZVtpXS5zbGljZSgpO1xuICAgICAgc2hhcGVXaXRob3V0Q29uY2F0QXhpcy5zcGxpY2UodGhpcy5heGlzLCAxKTtcbiAgICAgIGxldCBleGlzdHMgPSBmYWxzZTtcbiAgICAgIGZvciAoY29uc3Qgc2hhcGUgb2Ygc2hhcGVTZXQpIHtcbiAgICAgICAgaWYgKHV0aWwuYXJyYXlzRXF1YWwoc2hhcGUsIHNoYXBlV2l0aG91dENvbmNhdEF4aXMpKSB7XG4gICAgICAgICAgZXhpc3RzID0gdHJ1ZTtcbiAgICAgICAgICBicmVhaztcbiAgICAgICAgfVxuICAgICAgfVxuICAgICAgaWYgKCFleGlzdHMpIHtcbiAgICAgICAgc2hhcGVTZXQucHVzaChzaGFwZVdpdGhvdXRDb25jYXRBeGlzKTtcbiAgICAgIH1cbiAgICB9XG4gICAgaWYgKHNoYXBlU2V0Lmxlbmd0aCA+IDEpIHtcbiAgICAgIHRocm93IG5ldyBWYWx1ZUVycm9yKFxuICAgICAgICAgICdBIGBDb25jYXRlbmF0ZWAgbGF5ZXIgcmVxdWlyZXMgaW5wdXRzIHdpdGggbWF0Y2hpbmcgc2hhcGVzICcgK1xuICAgICAgICAgICdleGNlcHQgZm9yIHRoZSBjb25jYXQgYXhpcy4gR290IGlucHV0IHNoYXBlczogJyArXG4gICAgICAgICAgSlNPTi5zdHJpbmdpZnkoaW5wdXRTaGFwZSkpO1xuICAgIH1cbiAgfVxuXG4gIHByb3RlY3RlZCBtZXJnZUZ1bmN0aW9uKGlucHV0czogVGVuc29yW10pOiBUZW5zb3Ige1xuICAgIHJldHVybiB0aWR5KCgpID0+IHtcbiAgICAgIHJldHVybiBLLmNvbmNhdGVuYXRlKGlucHV0cywgdGhpcy5heGlzKTtcbiAgICB9KTtcbiAgfVxuXG4gIGNvbXB1dGVPdXRwdXRTaGFwZShpbnB1dFNoYXBlOiBTaGFwZXxTaGFwZVtdKTogU2hhcGV8U2hhcGVbXSB7XG4gICAgaWYgKCEoQXJyYXkuaXNBcnJheShpbnB1dFNoYXBlKSAmJiBBcnJheS5pc0FycmF5KGlucHV0U2hhcGVbMF0pKSkge1xuICAgICAgdGhyb3cgbmV3IFZhbHVlRXJyb3IoXG4gICAgICAgICAgJ0EgYENvbmNhdGVuYXRlYCBsYXllciBzaG91bGQgYmUgY2FsbGVkIG9uIGEgbGlzdCBvZiBpbnB1dHMuJyk7XG4gICAgfVxuICAgIGNvbnN0IGlucHV0U2hhcGVzID0gaW5wdXRTaGFwZSBhcyBTaGFwZVtdO1xuICAgIGNvbnN0IG91dHB1dFNoYXBlID0gaW5wdXRTaGFwZXNbMF0uc2xpY2UoKTtcbiAgICBjb25zdCBheGlzID0gdGhpcy5heGlzIDwgMCA/IG91dHB1dFNoYXBlLmxlbmd0aCArIHRoaXMuYXhpcyA6IHRoaXMuYXhpcztcbiAgICAvLyBQb3J0aW5nIE5vdGU6IHRoZSBsaW5lIGFib3ZlIGlzIGJlY2F1c2UgVHlwZVNjcmlwdCBkb2Vzbid0IHN1cHBvcnRcbiAgICAvLyAgIG5lZ2F0aXZlIGluZGljZXMuXG4gICAgZm9yIChjb25zdCBzaGFwZSBvZiBpbnB1dFNoYXBlcy5zbGljZSgxKSkge1xuICAgICAgaWYgKG91dHB1dFNoYXBlW2F4aXNdID09IG51bGwgfHwgc2hhcGVbYXhpc10gPT0gbnVsbCkge1xuICAgICAgICBvdXRwdXRTaGFwZVtheGlzXSA9IG51bGw7XG4gICAgICAgIGJyZWFrO1xuICAgICAgfVxuICAgICAgb3V0cHV0U2hhcGVbYXhpc10gKz0gc2hhcGVbYXhpc107XG4gICAgfVxuICAgIHJldHVybiBvdXRwdXRTaGFwZTtcbiAgfVxuXG4gIGNvbXB1dGVNYXNrKGlucHV0czogVGVuc29yfFRlbnNvcltdLCBtYXNrPzogVGVuc29yfFRlbnNvcltdKTogVGVuc29yIHtcbiAgICBpZiAobWFzayA9PSBudWxsKSB7XG4gICAgICByZXR1cm4gbnVsbDtcbiAgICB9XG4gICAgaWYgKCFBcnJheS5pc0FycmF5KG1hc2spKSB7XG4gICAgICB0aHJvdyBuZXcgVmFsdWVFcnJvcignYG1hc2tgIHNob3VsZCBiZSBhbiBhcnJheSBmb3IgQ29uY2F0ZW5hdGUnKTtcbiAgICB9XG4gICAgaWYgKCFBcnJheS5pc0FycmF5KGlucHV0cykpIHtcbiAgICAgIHRocm93IG5ldyBWYWx1ZUVycm9yKCdgaW5wdXRzYCBzaG91bGQgYmUgYW4gYXJyYXkgZm9yIENvbmNhdGVuYXRlJyk7XG4gICAgfVxuICAgIGlmIChtYXNrLmxlbmd0aCAhPT0gaW5wdXRzLmxlbmd0aCkge1xuICAgICAgdGhyb3cgbmV3IFZhbHVlRXJyb3IoXG4gICAgICAgICAgYE1pc21hdGNoIGluIHRoZSBsZW5ndGggb2YgbWFzayAoJHttYXNrLmxlbmd0aH0pIGAgK1xuICAgICAgICAgIGBhbmQgdGhlIGxlZ250aCBvZiBpbnB1dHMgKCR7aW5wdXRzLmxlbmd0aH0pYCk7XG4gICAgfVxuICAgIHJldHVybiB0ZmMudGlkeSgoKSA9PiB7XG4gICAgICBsZXQgYWxsTnVsbE1hc2tzID0gdHJ1ZTtcbiAgICAgIG1hc2suZm9yRWFjaChtID0+IHtcbiAgICAgICAgaWYgKG0gIT0gbnVsbCkge1xuICAgICAgICAgIGFsbE51bGxNYXNrcyA9IGZhbHNlO1xuICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuICAgICAgfSk7XG4gICAgICBpZiAoYWxsTnVsbE1hc2tzKSB7XG4gICAgICAgIHJldHVybiBudWxsO1xuICAgICAgfVxuICAgICAgY29uc3Qgb3V0cHV0TWFza3M6IFRlbnNvcltdID0gW107XG4gICAgICBmb3IgKGxldCBpID0gMDsgaSA8IGlucHV0cy5sZW5ndGg7ICsraSkge1xuICAgICAgICBpZiAobWFza1tpXSA9PSBudWxsKSB7XG4gICAgICAgICAgLy8gSW5wdXQgaXMgdW5tYXNrZWQuIEFwcGVuZCBhbGwgMSdzIHRvIG1hc2tzLlxuICAgICAgICAgIG91dHB1dE1hc2tzLnB1c2godGZjLmNhc3QodGZjLm9uZXNMaWtlKGlucHV0c1tpXSksICdib29sJykpO1xuICAgICAgICB9IGVsc2UgaWYgKG1hc2tbaV0ucmFuayA8IGlucHV0c1tpXS5yYW5rKSB7XG4gICAgICAgICAgLy8gTWFzayBpcyBzbWFsbGVyIHRoYW4gdGhlIGlucHV0LCBleHBhbmQgaXQuXG4gICAgICAgICAgb3V0cHV0TWFza3MucHVzaCh0ZmMuZXhwYW5kRGltcyhtYXNrW2ldLCAtMSkpO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIG91dHB1dE1hc2tzLnB1c2gobWFza1tpXSk7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICAgIGNvbnN0IGNvbmNhdGVuYXRlZE1hc2tzID0gdGZjLmNvbmNhdChvdXRwdXRNYXNrcywgdGhpcy5heGlzKTtcbiAgICAgIHJldHVybiB0ZmMuYWxsKGNvbmNhdGVuYXRlZE1hc2tzLCAtMSwgZmFsc2UpO1xuICAgIH0pO1xuICB9XG5cbiAgZ2V0Q29uZmlnKCk6IHNlcmlhbGl6YXRpb24uQ29uZmlnRGljdCB7XG4gICAgY29uc3QgY29uZmlnOiBzZXJpYWxpemF0aW9uLkNvbmZpZ0RpY3QgPSB7XG4gICAgICAnYXhpcyc6IHRoaXMuYXhpcyxcbiAgICB9O1xuICAgIGNvbnN0IGJhc2VDb25maWcgPSBzdXBlci5nZXRDb25maWcoKTtcbiAgICBPYmplY3QuYXNzaWduKGNvbmZpZywgYmFzZUNvbmZpZyk7XG4gICAgcmV0dXJuIGNvbmZpZztcbiAgfVxufVxuc2VyaWFsaXphdGlvbi5yZWdpc3RlckNsYXNzKENvbmNhdGVuYXRlKTtcblxuLyoqXG4gKiBDb25jYXRlbmF0ZSBhbiBgQXJyYXlgIG9mIGlucHV0cy5cbiAqXG4gKiBUaGlzIGZ1bmN0aW9uIGNhbiBiZSBpbnZva2VkIGluIHRocmVlIHdheXMuXG4gKlxuICogMS4gQ29uc3RydWN0IGFuIGluc3RhbmNlIG9mIGBDb25jYXRlbmF0ZWAgbGF5ZXIsIGJ5IHVzaW5nIG5vIGlucHV0IGFyZ3VtZW50XG4gKiAgICBvciBhIHNpbmdsZSBjb25maWd1cmF0aW9uIGFyZ3VtZW50LiBUaGUgcmVzdWx0YW50IGBDb25jYXRlbmF0ZWAgbGF5ZXIgY2FuXG4gKiAgICB0aGVuIGJlIHVzZWQgb24gYHRmLlN5bWJvbGljVGVuc29yYHMgb3IgYHRmLlRlbnNvcmBzLiBGb3IgZXhhbXBsZTpcbiAqXG4gKiBgYGBqc1xuICogY29uc3QgY29uY2F0TGF5ZXIgPSB0Zi5sYXllcnMuY29uY2F0ZW5hdGUoKTtcbiAqXG4gKiAvLyBUaGUgbGF5ZXIgY2FuIGJlIGFwcGxpZWQgdG8gaW5wdXRzLlxuICogY29uc3QgaW5wdXQxID0gdGYuaW5wdXQoe3NoYXBlOiBbMiwgM119KTtcbiAqIGNvbnN0IGlucHV0MiA9IHRmLmlucHV0KHtzaGFwZTogWzIsIDRdfSk7XG4gKiBjb25zdCBvdXRwdXQgPSBjb25jYXRMYXllci5hcHBseShbaW5wdXQxLCBpbnB1dDJdKTtcbiAqIGNvbnNvbGUubG9nKG91dHB1dC5zaGFwZSk7XG4gKiAvLyBZb3UgZ2V0IFtudWxsLCAyLCA3XSwgd2l0aCB0aGUgZmlyc3QgZGltZW5zaW9uIGFzIHRoZSB1bmRldGVybWluZWQgYmF0Y2hcbiAqIC8vIGRpbWVuc2lvbiBhbmQgdGhlIGxhc3QgZGltZW5zaW9uIGFzIHRoZSByZXN1bHQgb2YgY29uY2F0ZW5hdGluZyB0aGVcbiAqIC8vIGxhc3QgZGltZW5zaW9ucyBvZiB0aGUgdHdvIGlucHV0cy5cbiAqIGBgYFxuICpcbiAqIDIuIEludm9rZSBkaXJlY3RseSBvbiBhbiBgQXJyYXlgIG9mIGB0Zi5TeW1ib2xpY1RlbnNvcmBzLiBUaGlzIGNvbnN0cnVjdHNcbiAqICAgIGFuIGBMYXllcmAgb2JqZWN0IGludGVybmFsbHkgYW5kIGNhbGxzIGl0cyBgYXBwbHlgIG1ldGhvZCBvbiB0aGUgaW5wdXRzLFxuICogICAgZ2VuZXJhdGluZyBhIG5ldyBgdGYuU3ltYm9saWNUZW5zb3JgLiBGb3IgZXhhbXBsZTpcbiAqXG4gKiBgYGBqc1xuICogY29uc3QgaW5wdXQxID0gdGYuaW5wdXQoe3NoYXBlOiBbMiwgM119KTtcbiAqIGNvbnN0IGlucHV0MiA9IHRmLmlucHV0KHtzaGFwZTogWzIsIDRdfSk7XG4gKiBjb25zdCBvdXRwdXQgPSB0Zi5sYXllcnMuY29uY2F0ZW5hdGUoW2lucHV0MSwgaW5wdXQyXSk7XG4gKiBjb25zb2xlLmxvZyhvdXRwdXQuc2hhcGUpO1xuICogLy8gWW91IGdldCBbbnVsbCwgMiwgMl0sIHdpdGggdGhlIGZpcnN0IGRpbWVuc2lvbiBhcyB0aGUgdW5kZXRlcm1pbmVkIGJhdGNoXG4gKiAvLyBkaW1lbnNpb24gYW5kIHRoZSBsYXN0IGRpbWVuc2lvbiBhcyB0aGUgcmVzdWx0IG9mIGNvbmNhdGVuYXRpbmcgdGhlXG4gKiAvLyBsYXN0IGRpbWVuc2lvbnMgb2YgdGhlIHR3byBpbnB1dHMuXG4gKiBgYGBcbiAqXG4gKiAzLiBJbnZva2UgZGlyZWN0bHkgb24gYHRmLlRlbnNvcmBzLCBpLmUuLCBjb25jcmV0ZSB2YWx1ZXMuIFRoaXMgY29uc3RydWN0c1xuICogICAgYW4gYExheWVyYCBvYmplY3QgaW50ZXJuYWxseSBhbmQgY2FsbHMgaXRzIGBhcHBseWAgbWV0aG9kIG9uIHRoZSBpbnB1dHMsXG4gKiAgICBnZW5lcmF0aW5nIGEgbmV3IGB0Zi5UZW5zb3JgIGFzIHRoZSByZXN1bHQgb2YgdGhlIGNvbXB1dGF0aW9uLiBGb3JcbiAqIGV4YW1wbGU6XG4gKlxuICogYGBganNcbiAqIGNvbnN0IGlucHV0MSA9IHRmLnRlbnNvcjJkKFtbMSwgMl0sIFszLCA0XV0sIFsyLCAyXSk7XG4gKiBjb25zdCBpbnB1dDIgPSB0Zi50ZW5zb3IyZChbWzEwLCAyMF0sIFszMCwgNDBdXSwgWzIsIDJdKTtcbiAqIHRmLmxheWVycy5jb25jYXRlbmF0ZShbaW5wdXQxLCBpbnB1dDJdKS5wcmludCgpO1xuICogLy8gR2l2ZXMgW1sxLCAyLCAxMCwgMjBdLCBbMywgNCwgMzAsIDQwXV0uXG4gKlxuICovXG5leHBvcnQgZnVuY3Rpb24gY29uY2F0ZW5hdGUoY29uZmlnPzogU3ltYm9saWNUZW5zb3JbXXxUZW5zb3JbXXxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBDb25jYXRlbmF0ZUxheWVyQXJncyk6IExheWVyfFN5bWJvbGljVGVuc29yfFRlbnNvciB7XG4gIGlmIChBcnJheS5pc0FycmF5KGNvbmZpZykpIHtcbiAgICBjb25zdCBsYXllciA9IG5ldyBDb25jYXRlbmF0ZSh7fSk7XG4gICAgcmV0dXJuIGxheWVyLmFwcGx5KGNvbmZpZykgYXMgU3ltYm9saWNUZW5zb3IgfCBUZW5zb3I7XG4gIH0gZWxzZSB7XG4gICAgcmV0dXJuIG5ldyBDb25jYXRlbmF0ZShjb25maWcpO1xuICB9XG59XG5cbmV4cG9ydCBkZWNsYXJlIGludGVyZmFjZSBEb3RMYXllckFyZ3MgZXh0ZW5kcyBMYXllckFyZ3Mge1xuICAvKipcbiAgICogQXhpcyBvciBheGVzIGFsb25nIHdoaWNoIHRoZSBkb3QgcHJvZHVjdCB3aWxsIGJlIHRha2VuLlxuICAgKlxuICAgKiBJbnRlZ2VyIG9yIGFuIEFycmF5IG9mIGludGVnZXJzLlxuICAgKi9cbiAgYXhlczogbnVtYmVyfFtudW1iZXIsIG51bWJlcl07XG5cbiAgLyoqXG4gICAqIFdoZXRoZXIgdG8gTDItbm9ybWFsaXplIHNhbXBsZXMgYWxvbmcgdGhlIGRvdCBwcm9kdWN0IGF4aXNcbiAgICogYmVmb3JlIHRha2luZyB0aGUgZG90IHByb2R1Y3QuXG4gICAqXG4gICAqIElmIHNldCB0byBgdHJ1ZWAsIHRoZSBvdXRwdXQgb2YgdGhlIGRvdCBwcm9kdWN0IGlzIHRoZSBjb3NpbmVcbiAgICogcHJveGltaXR5IGJldHdlZW4gdGhlIHR3byBzYW1wbGVzLlxuICAgKi9cbiAgbm9ybWFsaXplPzogYm9vbGVhbjtcbn1cblxuLyoqXG4gKiBJbnRlcnByZXRhYmxlIHBvdGVudGlhbGx5IG5lZ2F0aXZlIGF4aXMgaW5kZXguXG4gKlxuICogRm9yIGV4YW1wbGUsIGdpdmVuIGF4aXMgPSAtMSwgYW5kIGRpbSA9IDMsIHRoaXMgZnVuY3Rpb24gd2lsbCByZXR1cm4gMi5cbiAqXG4gKiBAcGFyYW0gYXhpcyBUaGUgYXhpcyBpbmRleCwgbWF5IGJlIGEgcG9zaXRpdmUsIHplcm8gb3IgbmVnYXRpdmUgaW50ZWdlci5cbiAqIEBwYXJhbSBkaW0gVG90YWwgbnVtYmVyIG9mIGRpbWVuc2lvbnMsIGEgcG9zaXRpdmUgaW50ZWdlci5cbiAqIEByZXR1cm5zIEEgbm9uLW5lZ2F0aXZlIGF4aXMgaW5kZXggZXF1aXZhbGVudCB0byB0aGUgaW5wdXQgYGF4aXNgLlxuICovXG5mdW5jdGlvbiBpbnRlcnByZXRBeGlzKGF4aXM6IG51bWJlciwgZGltOiBudW1iZXIpOiBudW1iZXIge1xuICB3aGlsZSAoYXhpcyA8IDApIHtcbiAgICBheGlzICs9IGRpbTtcbiAgfVxuICByZXR1cm4gYXhpcztcbn1cblxuZnVuY3Rpb24gYmF0Y2hEb3QoeDogVGVuc29yLCB5OiBUZW5zb3IsIGF4ZXM6IG51bWJlcnxbbnVtYmVyLCBudW1iZXJdKTogVGVuc29yIHtcbiAgaWYgKHguc2hhcGUubGVuZ3RoID4gMyB8fCB5LnNoYXBlLmxlbmd0aCA+IDMpIHtcbiAgICB0aHJvdyBuZXcgTm90SW1wbGVtZW50ZWRFcnJvcihcbiAgICAgICAgJ2JhdGNoRG90IGlzIG5vdCBpbXBsZW1lbnRlZCBmb3IgdGVuc29ycyBvZiA0RCBvciBoaWdoZXIgcmFuayB5ZXQnKTtcbiAgfVxuICB0ZmMudXRpbC5hc3NlcnQoXG4gICAgICB4LnNoYXBlLmxlbmd0aCA+PSAyLFxuICAgICAgKCkgPT4gYGJhdGNoRG90IHJlcXVpcmVzIHRoZSByYW5rIG9mIHggdG8gYmUgPj0gMiwgYCArXG4gICAgICAgICAgYGJ1dCBnb3QgJHt4LnNoYXBlLmxlbmd0aH1gKTtcbiAgdGZjLnV0aWwuYXNzZXJ0KFxuICAgICAgeC5zaGFwZS5sZW5ndGggPj0gMixcbiAgICAgICgpID0+IGBiYXRjaERvdCByZXF1aXJlcyB0aGUgcmFuayBvZiB5IHRvIGJlID49IDIsIGAgK1xuICAgICAgICAgIGBidXQgZ290ICR7eS5zaGFwZS5sZW5ndGh9YCk7XG5cbiAgaWYgKHR5cGVvZiBheGVzID09PSAnbnVtYmVyJykge1xuICAgIGF4ZXMgPSBbYXhlcywgYXhlc107XG4gIH1cblxuICBpZiAoeC5kdHlwZSA9PT0gJ2NvbXBsZXg2NCcgfHwgeS5kdHlwZSA9PT0gJ2NvbXBsZXg2NCcpIHtcbiAgICB0aHJvdyBuZXcgTm90SW1wbGVtZW50ZWRFcnJvcihcbiAgICAgICAgJ2JhdGNoRG90IGlzIG5vdCBpbXBsZW1lbnRlZCBmb3IgY29tcGxleDY0LXR5cGUgVGVuc29ycyB5ZXQuJyk7XG4gIH1cblxuICBjb25zdCB4TkRpbSA9IHguc2hhcGUubGVuZ3RoO1xuICBjb25zdCB5TkRpbSA9IHkuc2hhcGUubGVuZ3RoO1xuICBpZiAoYXhlcyA9PSBudWxsKSB7XG4gICAgLy8gQmVoYXZlIGxpa2UgYmF0Y2hNYXRtdWwgYnkgZGVmYXVsdC5cbiAgICBheGVzID0gW3hORGltIC0gMSwgeU5EaW0gLSAyXTtcbiAgfVxuICBjb25zdCBheGVzQXJyYXkgPSBheGVzIGFzIFtudW1iZXIsIG51bWJlcl07XG5cbiAgcmV0dXJuIHRmYy50aWR5KCgpID0+IHtcbiAgICBsZXQgZGlmZjogbnVtYmVyO1xuICAgIGlmICh4TkRpbSA+IHlORGltKSB7XG4gICAgICBkaWZmID0geE5EaW0gLSB5TkRpbTtcbiAgICAgIGNvbnN0IGRpZmZTaGFwZTogU2hhcGUgPSBbXTtcbiAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgZGlmZjsgKytpKSB7XG4gICAgICAgIGRpZmZTaGFwZS5wdXNoKDEpO1xuICAgICAgfVxuICAgICAgeSA9IHRmYy5yZXNoYXBlKHksIHkuc2hhcGUuY29uY2F0KGRpZmZTaGFwZSkpO1xuICAgIH0gZWxzZSBpZiAoeU5EaW0gPiB4TkRpbSkge1xuICAgICAgZGlmZiA9IHlORGltIC0geE5EaW07XG4gICAgICBjb25zdCBkaWZmU2hhcGU6IFNoYXBlID0gW107XG4gICAgICBmb3IgKGxldCBpID0gMDsgaSA8IGRpZmY7ICsraSkge1xuICAgICAgICBkaWZmU2hhcGUucHVzaCgxKTtcbiAgICAgIH1cbiAgICAgIHggPSB0ZmMucmVzaGFwZSh4LCB4LnNoYXBlLmNvbmNhdChkaWZmU2hhcGUpKTtcbiAgICB9IGVsc2Uge1xuICAgICAgZGlmZiA9IDA7XG4gICAgfVxuXG4gICAgbGV0IG91dDogVGVuc29yO1xuICAgIGlmICh4LnNoYXBlLmxlbmd0aCA9PT0gMiAmJiB5LnNoYXBlLmxlbmd0aCA9PT0gMikge1xuICAgICAgaWYgKGF4ZXNBcnJheVswXSA9PT0gYXhlc0FycmF5WzFdKSB7XG4gICAgICAgIG91dCA9IHRmYy5zdW0odGZjLm11bCh4LCB5KSwgYXhlc0FycmF5WzBdKTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIG91dCA9IHRmYy5zdW0odGZjLm11bCh0ZmMudHJhbnNwb3NlKHgsIFsxLCAwXSksIHkpLCBheGVzQXJyYXlbMV0pO1xuICAgICAgfVxuICAgIH0gZWxzZSB7XG4gICAgICBjb25zdCBhZGpYID0gYXhlc0FycmF5WzBdICE9PSB4LnNoYXBlLmxlbmd0aCAtIDE7XG4gICAgICBjb25zdCBhZGpZID0gYXhlc0FycmF5WzFdID09PSB5LnNoYXBlLmxlbmd0aCAtIDE7XG4gICAgICBvdXQgPSB0ZmMubWF0TXVsKHgsIHksIGFkalgsIGFkalkpO1xuICAgIH1cblxuICAgIGlmIChkaWZmID4gMCkge1xuICAgICAgbGV0IGlkeDogbnVtYmVyO1xuICAgICAgaWYgKHhORGltID4geU5EaW0pIHtcbiAgICAgICAgaWR4ID0geE5EaW0gKyB5TkRpbSAtIDM7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBpZHggPSB4TkRpbSAtIDE7XG4gICAgICB9XG4gICAgICBjb25zdCBzcXVlZXplQXhlczogbnVtYmVyW10gPSBbXTtcbiAgICAgIGZvciAobGV0IGkgPSBpZHg7IGkgPCBpZHggKyBkaWZmOyArK2kpIHtcbiAgICAgICAgc3F1ZWV6ZUF4ZXMucHVzaChpKTtcbiAgICAgIH1cbiAgICAgIG91dCA9IHRmYy5zcXVlZXplKG91dCwgc3F1ZWV6ZUF4ZXMpO1xuICAgIH1cbiAgICBpZiAob3V0LnNoYXBlLmxlbmd0aCA9PT0gMSkge1xuICAgICAgb3V0ID0gdGZjLmV4cGFuZERpbXMob3V0LCAxKTtcbiAgICB9XG4gICAgcmV0dXJuIG91dDtcbiAgfSk7XG59XG5cbmV4cG9ydCBjbGFzcyBEb3QgZXh0ZW5kcyBNZXJnZSB7XG4gIC8qKiBAbm9jb2xsYXBzZSAqL1xuICBzdGF0aWMgY2xhc3NOYW1lID0gJ0RvdCc7XG5cbiAgcHJpdmF0ZSBheGVzOiBudW1iZXJ8W251bWJlciwgbnVtYmVyXTtcbiAgcHJpdmF0ZSBub3JtYWxpemU6IGJvb2xlYW47XG5cbiAgY29uc3RydWN0b3IoYXJnczogRG90TGF5ZXJBcmdzKSB7XG4gICAgc3VwZXIoYXJncyk7XG4gICAgdGhpcy5heGVzID0gYXJncy5heGVzO1xuICAgIHRoaXMubm9ybWFsaXplID0gYXJncy5ub3JtYWxpemUgPT0gbnVsbCA/IGZhbHNlIDogYXJncy5ub3JtYWxpemU7XG4gICAgdGhpcy5zdXBwb3J0c01hc2tpbmcgPSB0cnVlO1xuICAgIHRoaXMucmVzaGFwZVJlcXVpcmVkID0gZmFsc2U7XG4gIH1cblxuICBidWlsZChpbnB1dFNoYXBlOiBTaGFwZXxTaGFwZVtdKTogdm9pZCB7XG4gICAgdGZjLnV0aWwuYXNzZXJ0KFxuICAgICAgICBBcnJheS5pc0FycmF5KGlucHV0U2hhcGUpICYmIGlucHV0U2hhcGUubGVuZ3RoID09PSAyICYmXG4gICAgICAgICAgICBBcnJheS5pc0FycmF5KGlucHV0U2hhcGVbMF0pICYmIEFycmF5LmlzQXJyYXkoaW5wdXRTaGFwZVsxXSksXG4gICAgICAgICgpID0+ICdBIGBEb3RgIGxheWVyIHNob3VsZCBiZSBjYWxsZWQgb24gYSBsaXN0IG9mIGV4YWN0bHkgMiBpbnB1dHMuJyk7XG4gICAgY29uc3Qgc2hhcGUxID0gaW5wdXRTaGFwZVswXSBhcyBTaGFwZTtcbiAgICBjb25zdCBzaGFwZTIgPSBpbnB1dFNoYXBlWzFdIGFzIFNoYXBlO1xuICAgIGlmIChzaGFwZTEubGVuZ3RoID4gMyB8fCBzaGFwZTIubGVuZ3RoID4gMykge1xuICAgICAgdGhyb3cgbmV3IE5vdEltcGxlbWVudGVkRXJyb3IoXG4gICAgICAgICAgJ0RvdCBsYXllciBkb2VzIG5vdCBzdXBwb3J0IHRlbnNvcnMgb2YgNEQgb3IgaGlnaGVyIHJhbmsgeWV0LicpO1xuICAgIH1cblxuICAgIGNvbnN0IGF4ZXMgPSB0aGlzLmludGVycHJldEF4ZXMoc2hhcGUxLCBzaGFwZTIpO1xuICAgIGlmIChzaGFwZTFbYXhlc1swXV0gIT09IHNoYXBlMltheGVzWzFdXSkge1xuICAgICAgdGhyb3cgbmV3IFZhbHVlRXJyb3IoXG4gICAgICAgICAgYERpbWVuc2lvbiBpbmNvbXBhdGliaWxpdHk6IGAgK1xuICAgICAgICAgIGAke3NoYXBlMVtheGVzWzBdXX0gIT09ICR7c2hhcGUyW2F4ZXNbMV1dfWApO1xuICAgIH1cbiAgfVxuXG4gIHByb3RlY3RlZCBtZXJnZUZ1bmN0aW9uKGlucHV0czogVGVuc29yW10pOiBUZW5zb3Ige1xuICAgIGlmIChpbnB1dHMubGVuZ3RoICE9PSAyKSB7XG4gICAgICB0aHJvdyBuZXcgVmFsdWVFcnJvcihcbiAgICAgICAgICAnQSBgRG90YCBsYXllciBtdXN0IGJlIGNhbGxlZCBvbiBleGFjdGx5IDIgaW5wdXRzLCAnICtcbiAgICAgICAgICBgYnV0IHJlY2VpdmVkICR7aW5wdXRzLmxlbmd0aH0gaW5wdXQocykuYCk7XG4gICAgfVxuXG4gICAgbGV0IHgxID0gaW5wdXRzWzBdO1xuICAgIGxldCB4MiA9IGlucHV0c1sxXTtcbiAgICBsZXQgYXhlczogW251bWJlciwgbnVtYmVyXTtcbiAgICBpZiAoIUFycmF5LmlzQXJyYXkodGhpcy5heGVzKSkge1xuICAgICAgYXhlcyA9IFtcbiAgICAgICAgaW50ZXJwcmV0QXhpcyh0aGlzLmF4ZXMsIHgxLnNoYXBlLmxlbmd0aCksXG4gICAgICAgIGludGVycHJldEF4aXModGhpcy5heGVzLCB4Mi5zaGFwZS5sZW5ndGgpXG4gICAgICBdO1xuICAgIH0gZWxzZSB7XG4gICAgICBheGVzID0gdGhpcy5heGVzLm1hcChcbiAgICAgICAgICAgICAgICAgKGF4aXMsIGkpID0+IGludGVycHJldEF4aXMoXG4gICAgICAgICAgICAgICAgICAgICBheGlzLCBpbnB1dHNbaV0uc2hhcGUubGVuZ3RoKSkgYXMgW251bWJlciwgbnVtYmVyXTtcbiAgICB9XG4gICAgaWYgKHRoaXMubm9ybWFsaXplKSB7XG4gICAgICB4MSA9IGwyTm9ybWFsaXplKHgxLCBheGVzWzBdKTtcbiAgICAgIHgyID0gbDJOb3JtYWxpemUoeDIsIGF4ZXNbMV0pO1xuICAgIH1cbiAgICByZXR1cm4gYmF0Y2hEb3QoeDEsIHgyLCBheGVzKTtcbiAgfVxuXG4gIHByaXZhdGUgaW50ZXJwcmV0QXhlcyhzaGFwZTE6IFNoYXBlLCBzaGFwZTI6IFNoYXBlKTogbnVtYmVyW10ge1xuICAgIGxldCBheGVzOiBudW1iZXJbXTtcbiAgICBpZiAoIUFycmF5LmlzQXJyYXkodGhpcy5heGVzKSkge1xuICAgICAgLy8gYHRoaXMuYXhlc2AgaXMgYSBzaW5nbGUgaW50ZWdlci5cbiAgICAgIGF4ZXMgPSBbXG4gICAgICAgIGludGVycHJldEF4aXModGhpcy5heGVzLCBzaGFwZTEubGVuZ3RoKSxcbiAgICAgICAgaW50ZXJwcmV0QXhpcyh0aGlzLmF4ZXMsIHNoYXBlMi5sZW5ndGgpXG4gICAgICBdO1xuICAgIH0gZWxzZSB7XG4gICAgICAvLyBgdGhpcy5heGVzYCBpcyBhbiBBcnJheSBvZiBpbnRlZ2Vycy5cbiAgICAgIGF4ZXMgPSB0aGlzLmF4ZXM7XG4gICAgfVxuICAgIHJldHVybiBheGVzO1xuICB9XG5cbiAgY29tcHV0ZU91dHB1dFNoYXBlKGlucHV0U2hhcGU6IFNoYXBlfFNoYXBlW10pOiBTaGFwZXxTaGFwZVtdIHtcbiAgICB0ZmMudXRpbC5hc3NlcnQoXG4gICAgICAgIEFycmF5LmlzQXJyYXkoaW5wdXRTaGFwZSkgJiYgaW5wdXRTaGFwZS5sZW5ndGggPT09IDIgJiZcbiAgICAgICAgICAgIEFycmF5LmlzQXJyYXkoaW5wdXRTaGFwZVswXSkgJiYgQXJyYXkuaXNBcnJheShpbnB1dFNoYXBlWzFdKSxcbiAgICAgICAgKCkgPT4gJ0EgYERvdGAgbGF5ZXIgc2hvdWxkIGJlIGNhbGxlZCBvbiBhIGxpc3Qgb2YgZXhhY3RseSAyIGlucHV0cy4nKTtcbiAgICBjb25zdCBzaGFwZTEgPSAoaW5wdXRTaGFwZVswXSBhcyBTaGFwZSkuc2xpY2UoKTtcbiAgICBjb25zdCBzaGFwZTIgPSAoaW5wdXRTaGFwZVsxXSBhcyBTaGFwZSkuc2xpY2UoKTtcbiAgICBpZiAoc2hhcGUxLmxlbmd0aCA+IDMgfHwgc2hhcGUyLmxlbmd0aCA+IDMpIHtcbiAgICAgIHRocm93IG5ldyBOb3RJbXBsZW1lbnRlZEVycm9yKFxuICAgICAgICAgICdEb3QgbGF5ZXIgZG9lcyBub3Qgc3VwcG9ydCB0ZW5zb3JzIG9mIDREIG9yIGhpZ2hlciByYW5rIHlldC4nKTtcbiAgICB9XG5cbiAgICBjb25zdCBheGVzID0gdGhpcy5pbnRlcnByZXRBeGVzKHNoYXBlMSwgc2hhcGUyKTtcbiAgICBzaGFwZTEuc3BsaWNlKGF4ZXNbMF0sIDEpO1xuICAgIHNoYXBlMi5zcGxpY2UoYXhlc1sxXSwgMSk7XG4gICAgc2hhcGUyLnNwbGljZSgwLCAxKTtcbiAgICBjb25zdCBvdXRwdXRTaGFwZSA9IHNoYXBlMS5jb25jYXQoc2hhcGUyKTtcbiAgICBpZiAob3V0cHV0U2hhcGUubGVuZ3RoID09PSAxKSB7XG4gICAgICBvdXRwdXRTaGFwZS5wdXNoKDEpO1xuICAgIH1cbiAgICByZXR1cm4gb3V0cHV0U2hhcGU7XG4gIH1cblxuICBjb21wdXRlTWFzayhpbnB1dHM6IFRlbnNvcnxUZW5zb3JbXSwgbWFzaz86IFRlbnNvcnxUZW5zb3JbXSk6IFRlbnNvciB7XG4gICAgcmV0dXJuIG51bGw7XG4gIH1cblxuICBnZXRDb25maWcoKTogc2VyaWFsaXphdGlvbi5Db25maWdEaWN0IHtcbiAgICBjb25zdCBjb25maWc6IHNlcmlhbGl6YXRpb24uQ29uZmlnRGljdCA9IHtcbiAgICAgICdheGVzJzogdGhpcy5heGVzLFxuICAgICAgJ25vcm1hbGl6ZSc6IHRoaXMubm9ybWFsaXplXG4gICAgfTtcbiAgICBjb25zdCBiYXNlQ29uZmlnID0gc3VwZXIuZ2V0Q29uZmlnKCk7XG4gICAgT2JqZWN0LmFzc2lnbihjb25maWcsIGJhc2VDb25maWcpO1xuICAgIHJldHVybiBjb25maWc7XG4gIH1cbn1cbnNlcmlhbGl6YXRpb24ucmVnaXN0ZXJDbGFzcyhEb3QpO1xuXG4vLyBUT0RPKGNhaXMpOiBBZGQgZnVuY3Rpb25hbCBpbnRlcmZhY2VzIGZvciB0aGUgbWVyZ2UgbGF5ZXJzLlxuIl19","/**\n * @license\n * Copyright 2018 Google LLC\n *\n * Use of this source code is governed by an MIT-style\n * license that can be found in the LICENSE file or at\n * https://opensource.org/licenses/MIT.\n * =============================================================================\n */\n/**\n * TensorFlow.js Layers: Noise Layers.\n */\nimport { add, greaterEqual, mul, randomUniform, serialization, tidy } from '@tensorflow/tfjs-core';\nimport * as K from '../backend/tfjs_backend';\nimport { Layer } from '../engine/topology';\nimport { getExactlyOneTensor } from '../utils/types_utils';\nexport class GaussianNoise extends Layer {\n constructor(args) {\n super(args);\n this.supportsMasking = true;\n this.stddev = args.stddev;\n }\n computeOutputShape(inputShape) {\n return inputShape;\n }\n getConfig() {\n const baseConfig = super.getConfig();\n const config = { stddev: this.stddev };\n Object.assign(config, baseConfig);\n return config;\n }\n call(inputs, kwargs) {\n return tidy(() => {\n this.invokeCallHook(inputs, kwargs);\n const input = getExactlyOneTensor(inputs);\n const noised = () => add(K.randomNormal(input.shape, 0, this.stddev), input);\n const output = K.inTrainPhase(noised, () => input, kwargs['training'] || false);\n return output;\n });\n }\n}\n/** @nocollapse */\nGaussianNoise.className = 'GaussianNoise';\nserialization.registerClass(GaussianNoise);\nexport class GaussianDropout extends Layer {\n constructor(args) {\n super(args);\n this.supportsMasking = true;\n this.rate = args.rate;\n }\n computeOutputShape(inputShape) {\n return inputShape;\n }\n getConfig() {\n const baseConfig = super.getConfig();\n const config = { rate: this.rate };\n Object.assign(config, baseConfig);\n return config;\n }\n call(inputs, kwargs) {\n return tidy(() => {\n this.invokeCallHook(inputs, kwargs);\n const input = getExactlyOneTensor(inputs);\n if (this.rate > 0 && this.rate < 1) {\n const noised = () => {\n const stddev = Math.sqrt(this.rate / (1 - this.rate));\n return mul(input, K.randomNormal(input.shape, 1, stddev));\n };\n return K.inTrainPhase(noised, () => input, kwargs['training'] || false);\n }\n return input;\n });\n }\n}\n/** @nocollapse */\nGaussianDropout.className = 'GaussianDropout';\nserialization.registerClass(GaussianDropout);\n/**\n * Applies Alpha Dropout to the input.\n *\n * As it is a regularization layer, it is only active at training time.\n *\n * Alpha Dropout is a `Dropout` that keeps mean and variance of inputs\n * to their original values, in order to ensure the self-normalizing property\n * even after this dropout.\n * Alpha Dropout fits well to Scaled Exponential Linear Units\n * by randomly setting activations to the negative saturation value.\n *\n * Arguments:\n * - `rate`: float, drop probability (as with `Dropout`).\n * The multiplicative noise will have\n * standard deviation `sqrt(rate / (1 - rate))`.\n * - `noise_shape`: A 1-D `Tensor` of type `int32`, representing the\n * shape for randomly generated keep/drop flags.\n *\n * Input shape:\n * Arbitrary. Use the keyword argument `inputShape`\n * (tuple of integers, does not include the samples axis)\n * when using this layer as the first layer in a model.\n *\n * Output shape:\n * Same shape as input.\n *\n * References:\n * - [Self-Normalizing Neural Networks](https://arxiv.org/abs/1706.02515)\n */\nexport class AlphaDropout extends Layer {\n constructor(args) {\n super(args);\n this.supportsMasking = true;\n this.rate = args.rate;\n this.noiseShape = args.noiseShape;\n }\n _getNoiseShape(inputs) {\n return this.noiseShape || getExactlyOneTensor(inputs).shape;\n }\n computeOutputShape(inputShape) {\n return inputShape;\n }\n getConfig() {\n const baseConfig = super.getConfig();\n const config = { rate: this.rate };\n Object.assign(config, baseConfig);\n return config;\n }\n call(inputs, kwargs) {\n return tidy(() => {\n if (this.rate < 1 && this.rate > 0) {\n const noiseShape = this._getNoiseShape(inputs);\n const droppedInputs = () => {\n const input = getExactlyOneTensor(inputs);\n const alpha = 1.6732632423543772848170429916717;\n const scale = 1.0507009873554804934193349852946;\n const alphaP = -alpha * scale;\n let keptIdx = greaterEqual(randomUniform(noiseShape), this.rate);\n keptIdx = K.cast(keptIdx, 'float32'); // get default dtype.\n // Get affine transformation params.\n const a = ((1 - this.rate) * (1 + this.rate * alphaP ** 2)) ** -0.5;\n const b = -a * alphaP * this.rate;\n // Apply mask.\n const x = add(mul(input, keptIdx), mul(add(keptIdx, -1), alphaP));\n return add(mul(x, a), b);\n };\n return K.inTrainPhase(droppedInputs, () => getExactlyOneTensor(inputs), kwargs['training'] || false);\n }\n return inputs;\n });\n }\n}\n/** @nocollapse */\nAlphaDropout.className = 'AlphaDropout';\nserialization.registerClass(AlphaDropout);\n//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibm9pc2UuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi8uLi90ZmpzLWxheWVycy9zcmMvbGF5ZXJzL25vaXNlLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBOzs7Ozs7OztHQVFHO0FBRUg7O0dBRUc7QUFFSCxPQUFPLEVBQUMsR0FBRyxFQUFFLFlBQVksRUFBRSxHQUFHLEVBQUUsYUFBYSxFQUFFLGFBQWEsRUFBVSxJQUFJLEVBQUMsTUFBTSx1QkFBdUIsQ0FBQztBQUV6RyxPQUFPLEtBQUssQ0FBQyxNQUFNLHlCQUF5QixDQUFDO0FBQzdDLE9BQU8sRUFBQyxLQUFLLEVBQVksTUFBTSxvQkFBb0IsQ0FBQztBQUdwRCxPQUFPLEVBQUMsbUJBQW1CLEVBQUMsTUFBTSxzQkFBc0IsQ0FBQztBQU96RCxNQUFNLE9BQU8sYUFBYyxTQUFRLEtBQUs7SUFLdEMsWUFBWSxJQUF1QjtRQUNqQyxLQUFLLENBQUMsSUFBSSxDQUFDLENBQUM7UUFDWixJQUFJLENBQUMsZUFBZSxHQUFHLElBQUksQ0FBQztRQUM1QixJQUFJLENBQUMsTUFBTSxHQUFHLElBQUksQ0FBQyxNQUFNLENBQUM7SUFDNUIsQ0FBQztJQUVELGtCQUFrQixDQUFDLFVBQXlCO1FBQzFDLE9BQU8sVUFBVSxDQUFDO0lBQ3BCLENBQUM7SUFFRCxTQUFTO1FBQ1AsTUFBTSxVQUFVLEdBQUcsS0FBSyxDQUFDLFNBQVMsRUFBRSxDQUFDO1FBQ3JDLE1BQU0sTUFBTSxHQUFHLEVBQUMsTUFBTSxFQUFFLElBQUksQ0FBQyxNQUFNLEVBQUMsQ0FBQztRQUNyQyxNQUFNLENBQUMsTUFBTSxDQUFDLE1BQU0sRUFBRSxVQUFVLENBQUMsQ0FBQztRQUNsQyxPQUFPLE1BQU0sQ0FBQztJQUNoQixDQUFDO0lBRUQsSUFBSSxDQUFDLE1BQXVCLEVBQUUsTUFBYztRQUMxQyxPQUFPLElBQUksQ0FBQyxHQUFHLEVBQUU7WUFDZixJQUFJLENBQUMsY0FBYyxDQUFDLE1BQU0sRUFB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LEdBQUcsQ0FBQyxDQUFDLElBQUksQ0FBQyxPQUFPLEVBQUUsU0FBUyxDQUFDLENBQUMsQ0FBRSxxQkFBcUI7b0JBRTVELG9DQUFvQztvQkFDcEMsTUFBTSxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsR0FBRyxJQUFJLENBQUMsSUFBSSxDQUFDLEdBQUcsQ0FBQyxDQUFDLEdBQUcsSUFBSSxDQUFDLElBQUksR0FBRyxNQUFNLElBQUksQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLEdBQUcsQ0FBQztvQkFDcEUsTUFBTSxDQUFDLEdBQUcsQ0FBQyxDQUFDLEdBQUcsTUFBTSxHQUFHLElBQUksQ0FBQyxJQUFJLENBQUM7b0JBRWxDLGNBQWM7b0JBQ2QsTUFBTSxDQUFDLEdBQUcsR0FBRyxDQUFDLEdBQUcsQ0FBQyxLQUFLLEVBQUUsT0FBTyxDQUFDLEVBQUUsR0FBRyxDQUFDLEdBQUcsQ0FBQyxPQUFPLEVBQUUsQ0FBQyxDQUFDLENBQUMsRUFBRSxNQUFNLENBQUMsQ0FBQyxDQUFDO29CQUVsRSxPQUFPLEdBQUcsQ0FBQyxHQUFHLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDO2dCQUMzQixDQUFDLENBQUM7Z0JBQ0YsT0FBTyxDQUFDLENBQUMsWUFBWSxDQUNqQixhQUFhLEVBQUUsR0FBRyxFQUFFLENBQUMsbUJBQW1CLENBQUMsTUFBTSxDQUFDLEVBQ2hELE1BQU0sQ0FBQyxVQUFVLENBQUMsSUFBSSxLQUFLLENBQUMsQ0FBQzthQUNsQztZQUNELE9BQU8sTUFBTSxDQUFDO1FBQ2hCLENBQUMsQ0FBQyxDQUFDO0lBQ0wsQ0FBQzs7QUEzREQsa0JBQWtCO0FBQ1gsc0JBQVMsR0FBRyxjQUFjLENBQUM7QUE0RHBDLGFBQWEsQ0FBQyxhQUFhLENBQUMsWUFBWSxDQUFDLENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyIvKipcbiAqIEBsaWNlbnNlXG4gKiBDb3B5cmlnaHQgMjAxOCBHb29nbGUgTExDXG4gKlxuICogVXNlIG9mIHRoaXMgc291cmNlIGNvZGUgaXMgZ292ZXJuZWQgYnkgYW4gTUlULXN0eWxlXG4gKiBsaWNlbnNlIHRoYXQgY2FuIGJlIGZvdW5kIGluIHRoZSBMSUNFTlNFIGZpbGUgb3IgYXRcbiAqIGh0dHBzOi8vb3BlbnNvdXJjZS5vcmcvbGljZW5zZXMvTUlULlxuICogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbiAqL1xuXG4vKipcbiAqIFRlbnNvckZsb3cuanMgTGF5ZXJzOiBOb2lzZSBMYXllcnMuXG4gKi9cblxuaW1wb3J0IHthZGQsIGdyZWF0ZXJFcXVhbCwgbXVsLCByYW5kb21Vbmlmb3JtLCBzZXJpYWxpemF0aW9uLCBUZW5zb3IsIHRpZHl9IGZyb20gJ0B0ZW5zb3JmbG93L3RmanMtY29yZSc7XG5cbmltcG9ydCAqIGFzIEsgZnJvbSAnLi4vYmFja2VuZC90ZmpzX2JhY2tlbmQnO1xuaW1wb3J0IHtMYXllciwgTGF5ZXJBcmdzfSBmcm9tICcuLi9lbmdpbmUvdG9wb2xvZ3knO1xuaW1wb3J0IHtTaGFwZX0gZnJvbSAnLi4va2VyYXNfZm9ybWF0L2NvbW1vbic7XG5pbXBvcnQge0t3YXJnc30gZnJvbSAnLi4vdHlwZXMnO1xuaW1wb3J0IHtnZXRFeGFjdGx5T25lVGVuc29yfSBmcm9tICcuLi91dGlscy90eXBlc191dGlscyc7XG5cbmV4cG9ydCBkZWNsYXJlIGludGVyZmFjZSBHYXVzc2lhbk5vaXNlQXJncyBleHRlbmRzIExheWVyQXJncyB7XG4gIC8qKiBTdGFuZGFyZCBEZXZpYXRpb24uICAqL1xuICBzdGRkZXY6IG51bWJlcjtcbn1cblxuZXhwb3J0IGNsYXNzIEdhdXNzaWFuTm9pc2UgZXh0ZW5kcyBMYXllciB7XG4gIC8qKiBAbm9jb2xsYXBzZSAqL1xuICBzdGF0aWMgY2xhc3NOYW1lID0gJ0dhdXNzaWFuTm9pc2UnO1xuICByZWFkb25seSBzdGRkZXY6IG51bWJlcjtcblxuICBjb25zdHJ1Y3RvcihhcmdzOiBHYXVzc2lhbk5vaXNlQXJncykge1xuICAgIHN1cGVyKGFyZ3MpO1xuICAgIHRoaXMuc3VwcG9ydHNNYXNraW5nID0gdHJ1ZTtcbiAgICB0aGlzLnN0ZGRldiA9IGFyZ3Muc3RkZGV2O1xuICB9XG5cbiAgY29tcHV0ZU91dHB1dFNoYXBlKGlucHV0U2hhcGU6IFNoYXBlfFNoYXBlW10pOiBTaGFwZXxTaGFwZVtdIHtcbiAgICByZXR1cm4gaW5wdXRTaGFwZTtcbiAgfVxuXG4gIGdldENvbmZpZygpIHtcbiAgICBjb25zdCBiYXNlQ29uZmlnID0gc3VwZXIuZ2V0Q29uZmlnKCk7XG4gICAgY29uc3QgY29uZmlnID0ge3N0ZGRldjogdGhpcy5zdGRkZXZ9O1xuICAgIE9iamVjdC5hc3NpZ24oY29uZmlnLCBiYXNlQ29uZmlnKTtcbiAgICByZXR1cm4gY29uZmlnO1xuICB9XG5cbiAgY2FsbChpbnB1dHM6IFRlbnNvcnxUZW5zb3JbXSwga3dhcmdzOiBLd2FyZ3MpOiBUZW5zb3J8VGVuc29yW10ge1xuICAgIHJldHVybiB0aWR5KCgpID0+IHtcbiAgICAgIHRoaXMuaW52b2tlQ2FsbEhvb2soaW5wdXRzLCBrd2FyZ3MpO1xuICAgICAgY29uc3QgaW5wdXQgPSBnZXRFeGFjdGx5T25lVGVuc29yKGlucHV0cyk7XG4gICAgICBjb25zdCBub2lzZWQgPSAoKSA9PlxuICAgICAgICAgIGFkZChLLnJhbmRvbU5vcm1hbChpbnB1dC5zaGFwZSwgMCwgdGhpcy5zdGRkZXYpLCBpbnB1dCk7XG4gICAgICBjb25zdCBvdXRwdXQgPVxuICAgICAgICAgIEsuaW5UcmFpblBoYXNlKG5vaXNlZCwgKCkgPT4gaW5wdXQsIGt3YXJnc1sndHJhaW5pbmcnXSB8fCBmYWxzZSk7XG4gICAgICByZXR1cm4gb3V0cHV0O1xuICAgIH0pO1xuICB9XG59XG5zZXJpYWxpemF0aW9uLnJlZ2lzdGVyQ2xhc3MoR2F1c3NpYW5Ob2lzZSk7XG5cbmV4cG9ydCBkZWNsYXJlIGludGVyZmFjZSBHYXVzc2lhbkRyb3BvdXRBcmdzIGV4dGVuZHMgTGF5ZXJBcmdzIHtcbiAgLyoqIGRyb3AgcHJvYmFiaWxpdHkuICAqL1xuICByYXRlOiBudW1iZXI7XG59XG5cbmV4cG9ydCBjbGFzcyBHYXVzc2lhbkRyb3BvdXQgZXh0ZW5kcyBMYXllciB7XG4gIC8qKiBAbm9jb2xsYXBzZSAqL1xuICBzdGF0aWMgY2xhc3NOYW1lID0gJ0dhdXNzaWFuRHJvcG91dCc7XG4gIHJlYWRvbmx5IHJhdGU6IG51bWJlcjtcblxuICBjb25zdHJ1Y3RvcihhcmdzOiBHYXVzc2lhbkRyb3BvdXRBcmdzKSB7XG4gICAgc3VwZXIoYXJncyk7XG4gICAgdGhpcy5zdXBwb3J0c01hc2tpbmcgPSB0cnVlO1xuICAgIHRoaXMucmF0ZSA9IGFyZ3MucmF0ZTtcbiAgfVxuXG4gIGNvbXB1dGVPdXRwdXRTaGFwZShpbnB1dFNoYXBlOiBTaGFwZXxTaGFwZVtdKTogU2hhcGV8U2hhcGVbXSB7XG4gICAgcmV0dXJuIGlucHV0U2hhcGU7XG4gIH1cblxuICBnZXRDb25maWcoKSB7XG4gICAgY29uc3QgYmFzZUNvbmZpZyA9IHN1cGVyLmdldENvbmZpZygpO1xuICAgIGNvbnN0IGNvbmZpZyA9IHtyYXRlOiB0aGlzLnJhdGV9O1xuICAgIE9iamVjdC5hc3NpZ24oY29uZmlnLCBiYXNlQ29uZmlnKTtcbiAgICByZXR1cm4gY29uZmlnO1xuICB9XG5cbiAgY2FsbChpbnB1dHM6IFRlbnNvcnxUZW5zb3JbXSwga3dhcmdzOiBLd2FyZ3MpOiBUZW5zb3J8VGVuc29yW10ge1xuICAgIHJldHVybiB0aWR5KCgpID0+IHtcbiAgICAgIHRoaXMuaW52b2tlQ2FsbEhvb2soaW5wdXRzLCBrd2FyZ3MpO1xuICAgICAgY29uc3QgaW5wdXQgPSBnZXRFeGFjdGx5T25lVGVuc29yKGlucHV0cyk7XG4gICAgICBpZiAodGhpcy5yYXRlID4gMCAmJiB0aGlzLnJhdGUgPCAxKSB7XG4gICAgICAgIGNvbnN0IG5vaXNlZCA9ICgpID0+IHtcbiAgICAgICAgICBjb25zdCBzdGRkZXYgPSBNYXRoLnNxcnQodGhpcy5yYXRlIC8gKDEgLSB0aGlzLnJhdGUpKTtcbiAgICAgICAgICByZXR1cm4gbXVsKGlucHV0LCBLLnJhbmRvbU5vcm1hbChpbnB1dC5zaGFwZSwgMSwgc3RkZGV2KSk7XG4gICAgICAgIH07XG4gICAgICAgIHJldHVybiBLLmluVHJhaW5QaGFzZShub2lzZWQsICgpID0+IGlucHV0LCBrd2FyZ3NbJ3RyYWluaW5nJ10gfHwgZmFsc2UpO1xuICAgICAgfVxuICAgICAgcmV0dXJuIGlucHV0O1xuICAgIH0pO1xuICB9XG59XG5zZXJpYWxpemF0aW9uLnJlZ2lzdGVyQ2xhc3MoR2F1c3NpYW5Ecm9wb3V0KTtcblxuZXhwb3J0IGRlY2xhcmUgaW50ZXJmYWNlIEFscGhhRHJvcG91dEFyZ3MgZXh0ZW5kcyBMYXllckFyZ3Mge1xuICAvKiogZHJvcCBwcm9iYWJpbGl0eS4gICovXG4gIHJhdGU6IG51bWJlcjtcbiAgLyoqXG4gICAqIEEgMS1EIGBUZW5zb3JgIG9mIHR5cGUgYGludDMyYCwgcmVwcmVzZW50aW5nIHRoZVxuICAgKiBzaGFwZSBmb3IgcmFuZG9tbHkgZ2VuZXJhdGVkIGtlZXAvZHJvcCBmbGFncy5cbiAgICovXG4gIG5vaXNlU2hhcGU/OiBTaGFwZTtcbn1cblxuLyoqXG4gKiBBcHBsaWVzIEFscGhhIERyb3BvdXQgdG8gdGhlIGlucHV0LlxuICpcbiAqIEFzIGl0IGlzIGEgcmVndWxhcml6YXRpb24gbGF5ZXIsIGl0IGlzIG9ubHkgYWN0aXZlIGF0IHRyYWluaW5nIHRpbWUuXG4gKlxuICogQWxwaGEgRHJvcG91dCBpcyBhIGBEcm9wb3V0YCB0aGF0IGtlZXBzIG1lYW4gYW5kIHZhcmlhbmNlIG9mIGlucHV0c1xuICogdG8gdGhlaXIgb3JpZ2luYWwgdmFsdWVzLCBpbiBvcmRlciB0byBlbnN1cmUgdGhlIHNlbGYtbm9ybWFsaXppbmcgcHJvcGVydHlcbiAqIGV2ZW4gYWZ0ZXIgdGhpcyBkcm9wb3V0LlxuICogQWxwaGEgRHJvcG91dCBmaXRzIHdlbGwgdG8gU2NhbGVkIEV4cG9uZW50aWFsIExpbmVhciBVbml0c1xuICogYnkgcmFuZG9tbHkgc2V0dGluZyBhY3RpdmF0aW9ucyB0byB0aGUgbmVnYXRpdmUgc2F0dXJhdGlvbiB2YWx1ZS5cbiAqXG4gKiBBcmd1bWVudHM6XG4gKiAgIC0gYHJhdGVgOiBmbG9hdCwgZHJvcCBwcm9iYWJpbGl0eSAoYXMgd2l0aCBgRHJvcG91dGApLlxuICogICAgIFRoZSBtdWx0aXBsaWNhdGl2ZSBub2lzZSB3aWxsIGhhdmVcbiAqICAgICBzdGFuZGFyZCBkZXZpYXRpb24gYHNxcnQocmF0ZSAvICgxIC0gcmF0ZSkpYC5cbiAqICAgLSBgbm9pc2Vfc2hhcGVgOiBBIDEtRCBgVGVuc29yYCBvZiB0eXBlIGBpbnQzMmAsIHJlcHJlc2VudGluZyB0aGVcbiAqICAgICBzaGFwZSBmb3IgcmFuZG9tbHkgZ2VuZXJhdGVkIGtlZXAvZHJvcCBmbGFncy5cbiAqXG4gKiBJbnB1dCBzaGFwZTpcbiAqICAgQXJiaXRyYXJ5LiBVc2UgdGhlIGtleXdvcmQgYXJndW1lbnQgYGlucHV0U2hhcGVgXG4gKiAgICh0dXBsZSBvZiBpbnRlZ2VycywgZG9lcyBub3QgaW5jbHVkZSB0aGUgc2FtcGxlcyBheGlzKVxuICogICB3aGVuIHVzaW5nIHRoaXMgbGF5ZXIgYXMgdGhlIGZpcnN0IGxheWVyIGluIGEgbW9kZWwuXG4gKlxuICogT3V0cHV0IHNoYXBlOlxuICogICBTYW1lIHNoYXBlIGFzIGlucHV0LlxuICpcbiAqIFJlZmVyZW5jZXM6XG4gKiAgIC0gW1NlbGYtTm9ybWFsaXppbmcgTmV1cmFsIE5ldHdvcmtzXShodHRwczovL2FyeGl2Lm9yZy9hYnMvMTcwNi4wMjUxNSlcbiAqL1xuZXhwb3J0IGNsYXNzIEFscGhhRHJvcG91dCBleHRlbmRzIExheWVyIHtcbiAgLyoqIEBub2NvbGxhcHNlICovXG4gIHN0YXRpYyBjbGFzc05hbWUgPSAnQWxwaGFEcm9wb3V0JztcbiAgcmVhZG9ubHkgcmF0ZTogbnVtYmVyO1xuICByZWFkb25seSBub2lzZVNoYXBlOiBTaGFwZTtcblxuICBjb25zdHJ1Y3RvcihhcmdzOiBBbHBoYURyb3BvdXRBcmdzKSB7XG4gICAgc3VwZXIoYXJncyk7XG4gICAgdGhpcy5zdXBwb3J0c01hc2tpbmcgPSB0cnVlO1xuICAgIHRoaXMucmF0ZSA9IGFyZ3MucmF0ZTtcbiAgICB0aGlzLm5vaXNlU2hhcGUgPSBhcmdzLm5vaXNlU2hhcGU7XG4gIH1cblxuICBfZ2V0Tm9pc2VTaGFwZShpbnB1dHM6IFRlbnNvcnxUZW5zb3JbXSkge1xuICAgIHJldHVybiB0aGlzLm5vaXNlU2hhcGUgfHwgZ2V0RXhhY3RseU9uZVRlbnNvcihpbnB1dHMpLnNoYXBlO1xuICB9XG5cbiAgY29tcHV0ZU91dHB1dFNoYXBlKGlucHV0U2hhcGU6IFNoYXBlfFNoYXBlW10pOiBTaGFwZXxTaGFwZVtdIHtcbiAgICByZXR1cm4gaW5wdXRTaGFwZTtcbiAgfVxuXG4gIGdldENvbmZpZygpIHtcbiAgICBjb25zdCBiYXNlQ29uZmlnID0gc3VwZXIuZ2V0Q29uZmlnKCk7XG4gICAgY29uc3QgY29uZmlnID0ge3JhdGU6IHRoaXMucmF0ZX07XG4gICAgT2JqZWN0LmFzc2lnbihjb25maWcsIGJhc2VDb25maWcpO1xuICAgIHJldHVybiBjb25maWc7XG4gIH1cblxuICBjYWxsKGlucHV0czogVGVuc29yfFRlbnNvcltdLCBrd2FyZ3M6IEt3YXJncyk6IFRlbnNvcnxUZW5zb3JbXSB7XG4gICAgcmV0dXJuIHRpZHkoKCkgPT4ge1xuICAgICAgaWYgKHRoaXMucmF0ZSA8IDEgJiYgdGhpcy5yYXRlID4gMCkge1xuICAgICAgICBjb25zdCBub2lzZVNoYXBlID0gdGhpcy5fZ2V0Tm9pc2VTaGFwZShpbnB1dHMpO1xuXG4gICAgICAgIGNvbnN0IGRyb3BwZWRJbnB1dHMgPSAoKSA9PiB7XG4gICAgICAgICAgY29uc3QgaW5wdXQgPSBnZXRFeGFjdGx5T25lVGVuc29yKGlucHV0cyk7XG5cbiAgICAgICAgICBjb25zdCBhbHBoYSA9IDEuNjczMjYzMjQyMzU0Mzc3Mjg0ODE3MDQyOTkxNjcxNztcbiAgICAgICAgICBjb25zdCBzY2FsZSA9IDEuMDUwNzAwOTg3MzU1NDgwNDkzNDE5MzM0OTg1Mjk0NjtcblxuICAgICAgICAgIGNvbnN0IGFscGhhUCA9IC1hbHBoYSAqIHNjYWxlO1xuXG4gICAgICAgICAgbGV0IGtlcHRJZHggPSBncmVhdGVyRXF1YWwocmFuZG9tVW5pZm9ybShub2lzZVNoYXBlKSwgdGhpcy5yYXRlKTtcblxuICAgICAgICAgIGtlcHRJZHggPSBLLmNhc3Qoa2VwdElkeCwgJ2Zsb2F0MzInKTsgIC8vIGdldCBkZWZhdWx0IGR0eXBlLlxuXG4gICAgICAgICAgLy8gR2V0IGFmZmluZSB0cmFuc2Zvcm1hdGlvbiBwYXJhbXMuXG4gICAgICAgICAgY29uc3QgYSA9ICgoMSAtIHRoaXMucmF0ZSkgKiAoMSArIHRoaXMucmF0ZSAqIGFscGhhUCAqKiAyKSkgKiogLTAuNTtcbiAgICAgICAgICBjb25zdCBiID0gLWEgKiBhbHBoYVAgKiB0aGlzLnJhdGU7XG5cbiAgICAgICAgICAvLyBBcHBseSBtYXNrLlxuICAgICAgICAgIGNvbnN0IHggPSBhZGQobXVsKGlucHV0LCBrZXB0SWR4KSwgbXVsKGFkZChrZXB0SWR4LCAtMSksIGFscGhhUCkpO1xuXG4gICAgICAgICAgcmV0dXJuIGFkZChtdWwoeCwgYSksIGIpO1xuICAgICAgICB9O1xuICAgICAgICByZXR1cm4gSy5pblRyYWluUGhhc2UoXG4gICAgICAgICAgICBkcm9wcGVkSW5wdXRzLCAoKSA9PiBnZXRFeGFjdGx5T25lVGVuc29yKGlucHV0cyksXG4gICAgICAgICAgICBrd2FyZ3NbJ3RyYWluaW5nJ10gfHwgZmFsc2UpO1xuICAgICAgfVxuICAgICAgcmV0dXJuIGlucHV0cztcbiAgICB9KTtcbiAgfVxufVxuc2VyaWFsaXphdGlvbi5yZWdpc3RlckNsYXNzKEFscGhhRHJvcG91dCk7XG4iXX0=","/**\n * @license\n * Copyright 2018 Google LLC\n *\n * Use of this source code is governed by an MIT-style\n * license that can be found in the LICENSE file or at\n * https://opensource.org/licenses/MIT.\n * =============================================================================\n */\n/**\n * Normalization layers.\n */\nimport * as tfc from '@tensorflow/tfjs-core';\nimport { moments, reshape, serialization, tidy, util } from '@tensorflow/tfjs-core';\nimport { getConstraint, serializeConstraint } from '../constraints';\nimport { InputSpec, Layer } from '../engine/topology';\nimport { NotImplementedError, ValueError } from '../errors';\nimport { getInitializer, serializeInitializer } from '../initializers';\nimport { getRegularizer, serializeRegularizer } from '../regularizers';\nimport * as generic_utils from '../utils/generic_utils';\nimport * as math_utils from '../utils/math_utils';\nimport { getExactlyOneShape, getExactlyOneTensor } from '../utils/types_utils';\n/**\n * Applies batch normalization on x given mean, var, beta and gamma.\n *\n * I.e. returns:\n * `output = (x - mean) / (sqrt(var) + epsilon) * gamma + beta`\n *\n * @param x Input tensor.\n * @param mean Mean of batch.\n * @param variance Variance of batch.\n * @param beta Tensor with which to center the input.\n * @param gamma Tensor by which to scale the input.\n * @param epsilon Fuzz factor.\n * @returns The result of the batch normalization.\n */\nexport function batchNormalization(x, mean, variance, beta, gamma, epsilon = 1e-3) {\n let out;\n if (x.rank === 2) {\n out = tfc.batchNorm2d(x, mean, variance, beta, gamma, epsilon);\n }\n else if (x.rank === 3) {\n // TODO(cais): Check rank; give proper error message.\n out = tfc.batchNorm3d(x, mean, variance, beta, gamma, epsilon);\n }\n else if (x.rank === 4) {\n out = tfc.batchNorm4d(x, mean, variance, beta, gamma, epsilon);\n }\n else {\n throw new NotImplementedError(`batchNormalization is not implemented for array of rank ${x.rank} ` +\n `yet`);\n }\n return out;\n}\n/**\n * Non-broadcasting batch normalization for use in training (not inference).\n *\n * The input is normalized to zero mean and unit variance along the\n * `reductionAxes`, followed by scaling with `gamma` and shifted by `beta`.\n * The result of that is returned as the first element\n * of the returned `Array`. The other two elements are the mean and variance,\n * respectively.\n *\n * @param x Input tensor to be normalized.\n * @param gamma Tensor by which to scale the input.\n * @param beta Tensor by which to center the input.\n * @param reductionAxes Axes over which to normalize.\n * @param epsilon Fuzz factor.\n * @returns An `Array` of three `Tensors`:\n * [normalized tensor, mean of input, variance of input].\n */\nfunction regularNormalizeBatchInTraining(x, gamma, beta, reductionAxes, epsilon = 1e-3) {\n return tidy(() => {\n const meanAndVariance = tfc.moments(x, reductionAxes);\n const mean = meanAndVariance.mean;\n const variance = meanAndVariance.variance;\n const normed = batchNormalization(x, mean, variance, beta, gamma, epsilon);\n return [normed, mean, variance];\n });\n}\n/**\n * Broadcasting batch normalization for use in training (not inference).\n *\n * The input is normalized to zero mean and unit variance along the\n * `reductionAxes`, followed by scaling with `gamma` and shifted by `beta`.\n * The result of that is returned as the first element\n * of the returned `Array`. The other two elements are the mean and variance,\n * respectively.\n *\n * @param x Input tensor to be normalized.\n * @param gamma Tensor by which to scale the input.\n * @param beta Tensor by which to center the input.\n * @param reductionAxes Axes over which to normalize.\n * @param epsilon Fuzz factor.\n * @returns An `Array` of three `Tensors`:\n * [normalized tensor, mean of input, variance of input].\n */\nfunction broadcastNormalizeBatchInTraining(x, gamma, beta, reductionAxes, epsilon = 1e-3) {\n return tidy(() => {\n const meanAndVariance = tfc.moments(x, reductionAxes);\n const mean = meanAndVariance.mean;\n const variance = meanAndVariance.variance;\n const targetShape = [];\n for (const axis of math_utils.range(0, x.rank)) {\n if (reductionAxes.indexOf(axis) !== -1) {\n targetShape.push(1);\n }\n else {\n targetShape.push(x.shape[axis]);\n }\n }\n const broadcastMean = reshape(mean, targetShape);\n const broadcastVariance = reshape(variance, targetShape);\n const broadcastGamma = gamma == null ? null : reshape(gamma, targetShape);\n const broadcastBeta = beta == null ? null : reshape(beta, targetShape);\n const normed = batchNormalization(x, broadcastMean, broadcastVariance, broadcastBeta, broadcastGamma, epsilon);\n return [normed, mean, variance];\n });\n}\n/**\n * Batch normalization for use in training (not inference).\n *\n * @param x Input tensor to be normalized.\n * @param gamma Tensor by which to scale the input.\n * @param beta Tensor by which to center the input.\n * @param reductionAxes Axes over which to normalize.\n * @param epsilon Fuzz factor.\n * @returns An `Array` of three `Tensors`:\n * [normalized tensor, mean of input, variance of input].\n */\nexport function normalizeBatchInTraining(x, gamma, beta, reductionAxes, epsilon = 1e-3) {\n if (util.arraysEqual(reductionAxes.slice().sort(), math_utils.range(0, x.rank - 1))) {\n return regularNormalizeBatchInTraining(x, gamma, beta, reductionAxes, epsilon);\n }\n else {\n return broadcastNormalizeBatchInTraining(x, gamma, beta, reductionAxes, epsilon);\n }\n}\nexport class BatchNormalization extends Layer {\n constructor(args) {\n if (args == null) {\n args = {};\n }\n super(args);\n this.supportsMasking = true;\n this.axis = args.axis == null ? -1 : args.axis;\n this.momentum = args.momentum == null ? 0.99 : args.momentum;\n this.epsilon = args.epsilon == null ? 1e-3 : args.epsilon;\n this.center = args.center == null ? true : args.center;\n this.scale = args.scale == null ? true : args.scale;\n this.betaInitializer = getInitializer(args.betaInitializer || 'zeros');\n this.gammaInitializer = getInitializer(args.gammaInitializer || 'ones');\n this.movingMeanInitializer =\n getInitializer(args.movingMeanInitializer || 'zeros');\n this.movingVarianceInitializer =\n getInitializer(args.movingVarianceInitializer || 'ones');\n this.betaConstraint = getConstraint(args.betaConstraint);\n this.gammaConstraint = getConstraint(args.gammaConstraint);\n this.betaRegularizer = getRegularizer(args.betaRegularizer);\n this.gammaRegularizer = getRegularizer(args.gammaRegularizer);\n }\n build(inputShape) {\n inputShape = getExactlyOneShape(inputShape);\n const axis = this.axis >= 0 ? this.axis : (this.axis + inputShape.length);\n const dim = inputShape[axis];\n if (dim == null) {\n throw new ValueError(`Axis ${axis} of input tensor should have a defined dimension but ` +\n `the layer received an input with shape ` +\n `${JSON.stringify(inputShape)}.`);\n }\n this.inputSpec =\n [new InputSpec({ ndim: inputShape.length, axes: { [axis]: dim } })];\n const shape = [dim];\n if (this.scale) {\n this.gamma = this.addWeight('gamma', shape, null, this.gammaInitializer, this.gammaRegularizer, true, this.gammaConstraint);\n }\n if (this.center) {\n this.beta = this.addWeight('beta', shape, null, this.betaInitializer, this.betaRegularizer, true, this.betaConstraint);\n }\n this.movingMean = this.addWeight('moving_mean', shape, null, this.movingMeanInitializer, null, false);\n this.movingVariance = this.addWeight('moving_variance', shape, null, this.movingVarianceInitializer, null, false);\n this.built = true;\n }\n call(inputs, kwargs) {\n return tidy(() => {\n const training = kwargs['training'] == null ? false : kwargs['training'];\n const input = getExactlyOneTensor(inputs);\n const inputShape = input.shape;\n const ndim = inputShape.length;\n const reductionAxes = math_utils.range(0, ndim);\n const axis = this.axis >= 0 ? this.axis : (this.axis + ndim);\n reductionAxes.splice(axis, 1);\n const broadcastShape = generic_utils.pyListRepeat(1, ndim);\n broadcastShape[axis] = inputShape[axis];\n const sortedReductionAxes = reductionAxes.slice();\n sortedReductionAxes.sort();\n const needsBroadcasting = !util.arraysEqual(sortedReductionAxes, math_utils.range(0, ndim).slice(0, ndim - 1));\n const normalizeInference = () => {\n if (needsBroadcasting) {\n const broadcastMovingMean = reshape(this.movingMean.read(), broadcastShape);\n const broadcastMovingVariance = reshape(this.movingVariance.read(), broadcastShape);\n const broadcastBeta = this.center ? reshape(this.beta.read(), broadcastShape) : null;\n const broadcastGamma = this.scale ? reshape(this.gamma.read(), broadcastShape) : null;\n return batchNormalization(input, broadcastMovingMean, broadcastMovingVariance, broadcastBeta, broadcastGamma, this.epsilon);\n }\n else {\n return batchNormalization(input, this.movingMean.read(), this.movingVariance.read(), this.beta == null ? null : this.beta.read(), this.gamma == null ? null : this.gamma.read(), this.epsilon);\n }\n };\n if (!training) {\n return normalizeInference();\n }\n const [normedTraining, mean, variance] = normalizeBatchInTraining(input, this.gamma.read(), this.beta.read(), reductionAxes, this.epsilon);\n const doMovingAverage = (variable, value, momentum) => {\n tfc.tidy(() => {\n const decay = 1 - momentum;\n const origValue = variable.read();\n const updateDelta = tfc.mul(tfc.sub(origValue, value), decay);\n variable.write(tfc.sub(origValue, updateDelta));\n });\n };\n // Perform updates to moving mean and moving variance for training.\n // Porting Note: In PyKeras, these updates to `movingMean` and\n // `movingAverage` are done as a deferred Graph, added to the `Layer`'s\n // `update`s using the `add_update()` method. Here we do it imperatively\n // and encapsulate the updates in a function that is invoked\n // immediately.\n const updateMovingMeanAndVariance = () => {\n doMovingAverage(this.movingMean, mean, this.momentum);\n doMovingAverage(this.movingVariance, variance, this.momentum);\n };\n updateMovingMeanAndVariance();\n return normedTraining;\n });\n }\n getConfig() {\n const config = {\n axis: this.axis,\n momentum: this.momentum,\n epsilon: this.epsilon,\n center: this.center,\n scale: this.scale,\n betaInitializer: serializeInitializer(this.betaInitializer),\n gammaInitializer: serializeInitializer(this.gammaInitializer),\n movingMeanInitializer: serializeInitializer(this.movingMeanInitializer),\n movingVarianceInitializer: serializeInitializer(this.movingVarianceInitializer),\n betaRegularizer: serializeRegularizer(this.betaRegularizer),\n gammaRegularizer: serializeRegularizer(this.gammaRegularizer),\n betaConstraint: serializeConstraint(this.betaConstraint),\n gammaConstraint: serializeConstraint(this.gammaConstraint)\n };\n const baseConfig = super.getConfig();\n Object.assign(config, baseConfig);\n return config;\n }\n}\n/** @nocollapse */\nBatchNormalization.className = 'BatchNormalization';\nserialization.registerClass(BatchNormalization);\nexport class LayerNormalization extends Layer {\n constructor(args) {\n if (args == null) {\n args = {};\n }\n super(args);\n this.axis = args.axis == null ? -1 : args.axis;\n if (typeof this.axis === 'number') {\n if (!Number.isInteger(this.axis)) {\n throw new Error(`Expected axis to be an integer, but received ${this.axis}`);\n }\n }\n else if (Array.isArray(this.axis)) {\n for (const axis of this.axis) {\n if (!Number.isInteger(axis)) {\n throw new Error(`Expected axis to be an array of integers, ` +\n `but received ${JSON.stringify(this.axis)}`);\n }\n }\n }\n else {\n throw new Error(`Expected axis to be an integer or an array of integers, ` +\n `but received ${JSON.stringify(this.axis)}`);\n }\n this.epsilon = args.epsilon == null ? 1e-3 : args.epsilon;\n this.center = args.center == null ? true : args.center;\n this.scale = args.scale == null ? true : args.scale;\n this.betaInitializer = getInitializer(args.betaInitializer || 'zeros');\n this.gammaInitializer = getInitializer(args.gammaInitializer || 'ones');\n this.betaRegularizer = getRegularizer(args.betaRegularizer);\n this.gammaRegularizer = getRegularizer(args.gammaRegularizer);\n this.supportsMasking = true;\n }\n build(inputShape) {\n inputShape = getExactlyOneShape(inputShape);\n const nDims = inputShape.length;\n // Convert axis to array and resolve negatives.\n if (typeof this.axis === 'number') {\n this.axis = [this.axis];\n }\n for (let i = 0; i < this.axis.length; ++i) {\n if (this.axis[i] < 0) {\n this.axis[i] += nDims;\n }\n }\n // Further validate axes.\n for (const axis of this.axis) {\n if (axis < 0 || axis >= nDims) {\n throw new Error(`Invalid axis: ${axis}`);\n }\n }\n if (this.axis.length !== generic_utils.unique(this.axis).length) {\n throw new Error(`Found duplicate axes in: ${this.axis}`);\n }\n const paramShape = this.axis.map(axis => inputShape[axis]);\n const trainable = true;\n if (this.scale) {\n this.gamma = this.addWeight('gamma', paramShape, 'float32', this.gammaInitializer, this.gammaRegularizer, trainable);\n }\n else {\n this.gamma = null;\n }\n if (this.center) {\n this.beta = this.addWeight('beta', paramShape, 'float32', this.betaInitializer, this.betaRegularizer, trainable);\n }\n else {\n this.beta = null;\n }\n this.built = true;\n }\n call(inputs, kwargs) {\n const input = getExactlyOneTensor(inputs);\n const inputShape = input.shape;\n const nDims = inputShape.length;\n return tidy(() => {\n const keepDims = true;\n let { mean, variance } = moments(input, this.axis, keepDims);\n const broadcastShape = generic_utils.pyListRepeat(1, nDims);\n for (const dim of this.axis) {\n broadcastShape[dim] = inputShape[dim];\n }\n const broadcast = (v) => {\n if (v != null && v.shape.length !== nDims) {\n return tfc.reshape(v, broadcastShape);\n }\n else {\n return v;\n }\n };\n let scale = this.scale ? broadcast(this.gamma.read()) : null;\n let offset = this.center ? broadcast(this.beta.read()) : null;\n // TODO(https://github.com/tensorflow/tfjs/issues/2120): The tiling below\n // is a workaround for the limitation of core's batchNormalization?d don't\n // support broadcasting in their gradients. In addition, the tiling is\n // necessary to ensure correctness on the browser CPU backend regardless\n // of forward or backward computation. Remove this workaround once the\n // limitation is addressed. See .\n const momentsTiling = [];\n const scaleOffsetTiling = [];\n for (let i = 0; i < nDims; ++i) {\n if (this.axis.indexOf(i) !== -1) {\n momentsTiling.push(inputShape[i]);\n scaleOffsetTiling.push(1);\n }\n else {\n momentsTiling.push(1);\n scaleOffsetTiling.push(inputShape[i]);\n }\n }\n mean = tfc.tile(mean, momentsTiling);\n variance = tfc.tile(variance, momentsTiling);\n if (scale != null) {\n scale = tfc.tile(scale, scaleOffsetTiling);\n }\n if (offset != null) {\n offset = tfc.tile(offset, scaleOffsetTiling);\n }\n return batchNormalization(input, mean, variance, offset, scale, this.epsilon);\n });\n }\n getConfig() {\n const config = {\n axis: this.axis,\n epsilon: this.epsilon,\n center: this.center,\n scale: this.scale,\n betaInitializer: serializeInitializer(this.betaInitializer),\n gammaInitializer: serializeInitializer(this.gammaInitializer),\n betaRegularizer: serializeRegularizer(this.betaRegularizer),\n gammaRegularizer: serializeRegularizer(this.gammaRegularizer)\n };\n const baseConfig = super.getConfig();\n Object.assign(config, baseConfig);\n return config;\n }\n}\n/** @nocollapse */\nLayerNormalization.className = 'LayerNormalization';\nserialization.registerClass(LayerNormalization);\n//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibm9ybWFsaXphdGlvbi5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uLy4uL3RmanMtbGF5ZXJzL3NyYy9sYXllcnMvbm9ybWFsaXphdGlvbi50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQTs7Ozs7Ozs7R0FRRztBQUVIOztHQUVHO0FBRUgsT0FBTyxLQUFLLEdBQUcsTUFBTSx1QkFBdUIsQ0FBQztBQUM3QyxPQUFPLEVBQUMsT0FBTyxFQUFFLE9BQU8sRUFBRSxhQUFhLEVBQWtELElBQUksRUFBRSxJQUFJLEVBQUMsTUFBTSx1QkFBdUIsQ0FBQztBQUVsSSxPQUFPLEVBQW1DLGFBQWEsRUFBRSxtQkFBbUIsRUFBQyxNQUFNLGdCQUFnQixDQUFDO0FBQ3BHLE9BQU8sRUFBQyxTQUFTLEVBQUUsS0FBSyxFQUFZLE1BQU0sb0JBQW9CLENBQUM7QUFDL0QsT0FBTyxFQUFDLG1CQUFtQixFQUFFLFVBQVUsRUFBQyxNQUFNLFdBQVcsQ0FBQztBQUMxRCxPQUFPLEVBQUMsY0FBYyxFQUFzQyxvQkFBb0IsRUFBQyxNQUFNLGlCQUFpQixDQUFDO0FBRXpHLE9BQU8sRUFBQyxjQUFjLEVBQXNDLG9CQUFvQixFQUFDLE1BQU0saUJBQWlCLENBQUM7QUFFekcsT0FBTyxLQUFLLGFBQWEsTUFBTSx3QkFBd0IsQ0FBQztBQUN4RCxPQUFPLEtBQUssVUFBVSxNQUFNLHFCQUFxQixDQUFDO0FBQ2xELE9BQU8sRUFBQyxrQkFBa0IsRUFBRSxtQkFBbUIsRUFBQyxNQUFNLHNCQUFzQixDQUFDO0FBRzdFOzs7Ozs7Ozs7Ozs7O0dBYUc7QUFDSCxNQUFNLFVBQVUsa0JBQWtCLENBQzlCLENBQVMsRUFBRSxJQUFZLEVBQUUsUUFBZ0IsRUFBRSxJQUFhLEVBQUUsS0FBYyxFQUN4RSxPQUFPLEdBQUcsSUFBSTtJQUNoQixJQUFJLEdBQVcsQ0FBQztJQUNoQixJQUFJLENBQUMsQ0FBQyxJQUFJLEtBQUssQ0FBQyxFQUFFO1FBQ2hCLEdBQUcsR0FB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UUFDUCxNQUFNLE1BQU0sR0FBNkI7WUFDdkMsSUFBSSxFQUFFLElBQUksQ0FBQyxJQUFJO1lBQ2YsT0FBTyxFQUFFLElBQUksQ0FBQyxPQUFPO1lBQ3JCLE1BQU0sRUFBRSxJQUFJLENBQUMsTUFBTTtZQUNuQixLQUFLLEVBQUUsSUFBSSxDQUFDLEtBQUs7WUFDakIsZUFBZSxFQUFFLG9CQUFvQixDQUFDLElBQUksQ0FBQyxlQUFlLENBQUM7WUFDM0QsZ0JBQWdCLEVBQUUsb0JBQW9CLENBQUMsSUFBSSxDQUFDLGdCQUFnQixDQUFDO1lBQzdELGVBQWUsRUFBRSxvQkFBb0IsQ0FBQyxJQUFJLENBQUMsZUFBZSxDQUFDO1lBQzNELGdCQUFnQixFQUFFLG9CQUFvQixDQUFDLElBQUksQ0FBQyxnQkFBZ0IsQ0FBQztTQUM5RCxDQUFDO1FBQ0YsTUFBTSxVQUFVLEdBQUcsS0FBSyxDQUFDLFNBQVMsRUFBRSxDQUFDO1FBQ3JDLE1BQU0sQ0FBQyxNQUFNLENBQUMsTUFBTSxFQUFFLFVBQVUsQ0FBQyxDQUFDO1FBQ2xDLE9BQU8sTUFBTSxDQUFDO0lBQ2hCLENBQUM7O0FBdEtELGtCQUFrQjtBQUNYLDRCQUFTLEdBQUcsb0JBQW9CLENBQUM7QUF1SzFDLGFBQWEsQ0FBQyxhQUFhLENBQUMsa0JBQWtCLENBQUMsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbIi8qKlxuICogQGxpY2Vuc2VcbiAqIENvcHlyaWdodCAyMDE4IEdvb2dsZSBMTENcbiAqXG4gKiBVc2Ugb2YgdGhpcyBzb3VyY2UgY29kZSBpcyBnb3Zlcm5lZCBieSBhbiBNSVQtc3R5bGVcbiAqIGxpY2Vuc2UgdGhhdCBjYW4gYmUgZm91bmQgaW4gdGhlIExJQ0VOU0UgZmlsZSBvciBhdFxuICogaHR0cHM6Ly9vcGVuc291cmNlLm9yZy9saWNlbnNlcy9NSVQuXG4gKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuICovXG5cbi8qKlxuICogTm9ybWFsaXphdGlvbiBsYXllcnMuXG4gKi9cblxuaW1wb3J0ICogYXMgdGZjIGZyb20gJ0B0ZW5zb3JmbG93L3RmanMtY29yZSc7XG5pbXBvcnQge21vbWVudHMsIHJlc2hhcGUsIHNlcmlhbGl6YXRpb24sIFRlbnNvciwgVGVuc29yMUQsIFRlbnNvcjJELCBUZW5zb3IzRCwgVGVuc29yNEQsIHRpZHksIHV0aWx9IGZyb20gJ0B0ZW5zb3JmbG93L3RmanMtY29yZSc7XG5cbmltcG9ydCB7Q29uc3RyYWludCwgQ29uc3RyYWludElkZW50aWZpZXIsIGdldENvbnN0cmFpbnQsIHNlcmlhbGl6ZUNvbnN0cmFpbnR9IGZyb20gJy4uL2NvbnN0cmFpbnRzJztcbmltcG9ydCB7SW5wdXRTcGVjLCBMYXllciwgTGF5ZXJBcmdzfSBmcm9tICcuLi9lbmdpbmUvdG9wb2xvZ3knO1xuaW1wb3J0IHtOb3RJbXBsZW1lbnRlZEVycm9yLCBWYWx1ZUVycm9yfSBmcm9tICcuLi9lcnJvcnMnO1xuaW1wb3J0IHtnZXRJbml0aWFsaXplciwgSW5pdGlhbGl6ZXIsIEluaXRpYWxpemVySWRlbnRpZmllciwgc2VyaWFsaXplSW5pdGlhbGl6ZXJ9IGZyb20gJy4uL2luaXRpYWxpemVycyc7XG5pbXBvcnQge1NoYXBlfSBmcm9tICcuLi9rZXJhc19mb3JtYXQvY29tbW9uJztcbmltcG9ydCB7Z2V0UmVndWxhcml6ZXIsIFJlZ3VsYXJpemVyLCBSZWd1bGFyaXplcklkZW50aWZpZXIsIHNlcmlhbGl6ZVJlZ3VsYXJpemVyfSBmcm9tICcuLi9yZWd1bGFyaXplcnMnO1xuaW1wb3J0IHtLd2FyZ3N9IGZyb20gJy4uL3R5cGVzJztcbmltcG9ydCAqIGFzIGdlbmVyaWNfdXRpbHMgZnJvbSAnLi4vdXRpbHMvZ2VuZXJpY191dGlscyc7XG5pbXBvcnQgKiBhcyBtYXRoX3V0aWxzIGZyb20gJy4uL3V0aWxzL21hdGhfdXRpbHMnO1xuaW1wb3J0IHtnZXRFeGFjdGx5T25lU2hhcGUsIGdldEV4YWN0bHlPbmVUZW5zb3J9IGZyb20gJy4uL3V0aWxzL3R5cGVzX3V0aWxzJztcbmltcG9ydCB7TGF5ZXJWYXJpYWJsZX0gZnJvbSAnLi4vdmFyaWFibGVzJztcblxuLyoqXG4gKiBBcHBsaWVzIGJhdGNoIG5vcm1hbGl6YXRpb24gb24geCBnaXZlbiBtZWFuLCB2YXIsIGJldGEgYW5kIGdhbW1hLlxuICpcbiAqIEkuZS4gcmV0dXJuczpcbiAqICAgYG91dHB1dCA9ICh4IC0gbWVhbikgLyAoc3FydCh2YXIpICsgZXBzaWxvbikgKiBnYW1tYSArIGJldGFgXG4gKlxuICogQHBhcmFtIHggSW5wdXQgdGVuc29yLlxuICogQHBhcmFtIG1lYW4gTWVhbiBvZiBiYXRjaC5cbiAqIEBwYXJhbSB2YXJpYW5jZSBWYXJpYW5jZSBvZiBiYXRjaC5cbiAqIEBwYXJhbSBiZXRhIFRlbnNvciB3aXRoIHdoaWNoIHRvIGNlbnRlciB0aGUgaW5wdXQuXG4gKiBAcGFyYW0gZ2FtbWEgVGVuc29yIGJ5IHdoaWNoIHRvIHNjYWxlIHRoZSBpbnB1dC5cbiAqIEBwYXJhbSBlcHNpbG9uIEZ1enogZmFjdG9yLlxuICogQHJldHVybnMgVGhlIHJlc3VsdCBvZiB0aGUgYmF0Y2ggbm9ybWFsaXphdGlvbi5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGJhdGNoTm9ybWFsaXphdGlvbihcbiAgICB4OiBUZW5zb3IsIG1lYW46IFRlbnNvciwgdmFyaWFuY2U6IFRlbnNvciwgYmV0YT86IFRlbnNvciwgZ2FtbWE/OiBUZW5zb3IsXG4gICAgZXBzaWxvbiA9IDFlLTMpOiBUZW5zb3Ige1xuICBsZXQgb3V0OiBUZW5zb3I7XG4gIGlmICh4LnJhbmsgPT09IDIpIHtcbiAgICBvdXQgPSB0ZmMuYmF0Y2hOb3JtMmQoXG4gICAgICAgIHggYXMgVGVuc29yMkQsIG1lYW4gYXMgVGVuc29yMkQgfCBUZW5zb3IxRCxcbiAgICAgICAgdmFyaWFuY2UgYXMgVGVuc29yMkQgfCBUZW5zb3IxRCwgYmV0YSBhcyBUZW5zb3IyRCB8IFRlbnNvcjFELFxuICAgICAgICBnYW1tYSBhcyBUZW5zb3IyRCB8IFRlbnNvcjFELCBlcHNpbG9uKTtcbiAgfSBlbHNlIGlmICh4LnJhbmsgPT09IDMpIHtcbiAgICAvLyBUT0RPKGNhaXMpOiBDaGVjayByYW5rOyBnaXZlIHByb3BlciBlcnJvciBtZXNzYWdlLlxuICAgIG91dCA9IHRmYy5iYXRjaE5vcm0zZChcbiAgICAgICAgeCBhcyBUZW5zb3IzRCwgbWVhbiBhcyBUZW5zb3IzRCB8IFRlbnNvcjFELFxuICAgICAgICB2YXJpYW5jZSBhcyBUZW5zb3IzRCB8IFRlbnNvcjFELCBiZXRhIGFzIFRlbnNvcjNEIHwgVGVuc29yMUQsXG4gICAgICAgIGdhbW1hIGFzIFRlbnNvcjNEIHwgVGVuc29yMUQsIGVwc2lsb24pO1xuICB9IGVsc2UgaWYgKHgucmFuayA9PT0gNCkge1xuICAgIG91dCA9IHRmYy5iYXRjaE5vcm00ZChcbiAgICAgICAgeCBhcyBUZW5zb3I0RCwgbWVhbiBhcyBUZW5zb3I0RCB8IFRlbnNvcjFELFxuICAgICAgICB2YXJpYW5jZSBhcyBUZW5zb3I0RCB8IFRlbnNvcjFELCBiZXRhIGFzIFRlbnNvcjREIHwgVGVuc29yMUQsXG4gICAgICAgIGdhbW1hIGFzIFRlbnNvcjREIHwgVGVuc29yMUQsIGVwc2lsb24pO1xuICB9IGVsc2Uge1xuICAgIHRocm93IG5ldyBOb3RJbXBsZW1lbnRlZEVycm9yKFxuICAgICAgICBgYmF0Y2hOb3JtYWxpemF0aW9uIGlzIG5vdCBpbXBsZW1lbnRlZCBmb3IgYXJyYXkgb2YgcmFuayAke3gucmFua30gYCArXG4gICAgICAgIGB5ZXRgKTtcbiAgfVxuICByZXR1cm4gb3V0O1xufVxuXG4vKipcbiAqIE5vbi1icm9hZGNhc3RpbmcgYmF0Y2ggbm9ybWFsaXphdGlvbiBmb3IgdXNlIGluIHRyYWluaW5nIChub3QgaW5mZXJlbmNlKS5cbiAqXG4gKiBUaGUgaW5wdXQgaXMgbm9ybWFsaXplZCB0byB6ZXJvIG1lYW4gYW5kIHVuaXQgdmFyaWFuY2UgYWxvbmcgdGhlXG4gKiBgcmVkdWN0aW9uQXhlc2AsIGZvbGxvd2VkIGJ5IHNjYWxpbmcgd2l0aCBgZ2FtbWFgIGFuZCBzaGlmdGVkIGJ5IGBiZXRhYC5cbiAqIFRoZSByZXN1bHQgb2YgdGhhdCBpcyByZXR1cm5lZCBhcyB0aGUgZmlyc3QgZWxlbWVudFxuICogb2YgdGhlIHJldHVybmVkIGBBcnJheWAuIFRoZSBvdGhlciB0d28gZWxlbWVudHMgYXJlIHRoZSBtZWFuIGFuZCB2YXJpYW5jZSxcbiAqIHJlc3BlY3RpdmVseS5cbiAqXG4gKiBAcGFyYW0geCBJbnB1dCB0ZW5zb3IgdG8gYmUgbm9ybWFsaXplZC5cbiAqIEBwYXJhbSBnYW1tYSBUZW5zb3IgYnkgd2hpY2ggdG8gc2NhbGUgdGhlIGlucHV0LlxuICogQHBhcmFtIGJldGEgVGVuc29yIGJ5IHdoaWNoIHRvIGNlbnRlciB0aGUgaW5wdXQuXG4gKiBAcGFyYW0gcmVkdWN0aW9uQXhlcyBBeGVzIG92ZXIgd2hpY2ggdG8gbm9ybWFsaXplLlxuICogQHBhcmFtIGVwc2lsb24gRnV6eiBmYWN0b3IuXG4gKiBAcmV0dXJucyBBbiBgQXJyYXlgIG9mIHRocmVlIGBUZW5zb3JzYDpcbiAqICAgW25vcm1hbGl6ZWQgdGVuc29yLCBtZWFuIG9mIGlucHV0LCB2YXJpYW5jZSBvZiBpbnB1dF0uXG4gKi9cbmZ1bmN0aW9uIHJlZ3VsYXJOb3JtYWxpemVCYXRjaEluVHJhaW5pbmcoXG4gICAgeDogVGVuc29yLCBnYW1tYTogVGVuc29yLCBiZXRhOiBUZW5zb3IsIHJlZHVjdGlvbkF4ZXM6IG51bWJlcltdLFxuICAgIGVwc2lsb24gPSAxZS0zKTogW1RlbnNvciwgVGVuc29yLCBUZW5zb3JdIHtcbiAgcmV0dXJuIHRpZHkoKCkgPT4ge1xuICAgICAgICAgICBjb25zdCBtZWFuQW5kVmFyaWFuY2UgPSB0ZmMubW9tZW50cyh4LCByZWR1Y3Rpb25BeGVzKTtcbiAgICAgICAgICAgY29uc3QgbWVhbiA9IG1lYW5BbmRWYXJpYW5jZS5tZWFuO1xuICAgICAgICAgICBjb25zdCB2YXJpYW5jZSA9IG1lYW5BbmRWYXJpYW5jZS52YXJpYW5jZTtcbiAgICAgICAgICAgY29uc3Qgbm9ybWVkID1cbiAgICAgICAgICAgICAgIGJhdGNoTm9ybWFsaXphdGlvbih4LCBtZWFuLCB2YXJpYW5jZSwgYmV0YSwgZ2FtbWEsIGVwc2lsb24pO1xuICAgICAgICAgICByZXR1cm4gW25vcm1lZCwgbWVhbiwgdmFyaWFuY2VdO1xuICAgICAgICAgfSkgYXMgW1RlbnNvciwgVGVuc29yLCBUZW5zb3JdO1xufVxuXG4vKipcbiAqIEJyb2FkY2FzdGluZyBiYXRjaCBub3JtYWxpemF0aW9uIGZvciB1c2UgaW4gdHJhaW5pbmcgKG5vdCBpbmZlcmVuY2UpLlxuICpcbiAqIFRoZSBpbnB1dCBpcyBub3JtYWxpemVkIHRvIHplcm8gbWVhbiBhbmQgdW5pdCB2YXJpYW5jZSBhbG9uZyB0aGVcbiAqIGByZWR1Y3Rpb25BeGVzYCwgZm9sbG93ZWQgYnkgc2NhbGluZyB3aXRoIGBnYW1tYWAgYW5kIHNoaWZ0ZWQgYnkgYGJldGFgLlxuICogVGhlIHJlc3VsdCBvZiB0aGF0IGlzIHJldHVybmVkIGFzIHRoZSBmaXJzdCBlbGVtZW50XG4gKiBvZiB0aGUgcmV0dXJuZWQgYEFycmF5YC4gVGhlIG90aGVyIHR3byBlbGVtZW50cyBhcmUgdGhlIG1lYW4gYW5kIHZhcmlhbmNlLFxuICogcmVzcGVjdGl2ZWx5LlxuICpcbiAqIEBwYXJhbSB4IElucHV0IHRlbnNvciB0byBiZSBub3JtYWxpemVkLlxuICogQHBhcmFtIGdhbW1hIFRlbnNvciBieSB3aGljaCB0byBzY2FsZSB0aGUgaW5wdXQuXG4gKiBAcGFyYW0gYmV0YSBUZW5zb3IgYnkgd2hpY2ggdG8gY2VudGVyIHRoZSBpbnB1dC5cbiAqIEBwYXJhbSByZWR1Y3Rpb25BeGVzIEF4ZXMgb3ZlciB3aGljaCB0byBub3JtYWxpemUuXG4gKiBAcGFyYW0gZXBzaWxvbiBGdXp6IGZhY3Rvci5cbiAqIEByZXR1cm5zIEFuIGBBcnJheWAgb2YgdGhyZWUgYFRlbnNvcnNgOlxuICogICBbbm9ybWFsaXplZCB0ZW5zb3IsIG1lYW4gb2YgaW5wdXQsIHZhcmlhbmNlIG9mIGlucHV0XS5cbiAqL1xuZnVuY3Rpb24gYnJvYWRjYXN0Tm9ybWFsaXplQmF0Y2hJblRyYWluaW5nKFxuICAgIHg6IFRlbnNvciwgZ2FtbWE6IFRlbnNvciwgYmV0YTogVGVuc29yLCByZWR1Y3Rpb25BeGVzOiBudW1iZXJbXSxcbiAgICBlcHNpbG9uID0gMWUtMyk6IFtUZW5zb3IsIFRlbnNvciwgVGVuc29yXSB7XG4gIHJldHVybiB0aWR5KCgpID0+IHtcbiAgICAgICAgICAgY29uc3QgbWVhbkFuZFZhcmlhbmNlID0gdGZjLm1vbWVudHMoeCwgcmVkdWN0aW9uQXhlcyk7XG4gICAgICAgICAgIGNvbnN0IG1lYW4gPSBtZWFuQW5kVmFyaWFuY2UubWVhbjtcbiAgICAgICAgICAgY29uc3QgdmFyaWFuY2UgPSBtZWFuQW5kVmFyaWFuY2UudmFyaWFuY2U7XG4gICAgICAgICAgIGNvbnN0IHRhcmdldFNoYXBlOiBudW1iZXJbXSA9IFtdO1xuICAgICAgICAgICBmb3IgKGNvbnN0IGF4aXMgb2YgbWF0aF91dGlscy5yYW5nZSgwLCB4LnJhbmspKSB7XG4gICAgICAgICAgICAgaWYgKHJlZHVjdGlvbkF4ZXMuaW5kZXhPZihheGlzKSAhPT0gLTEpIHtcbiAgICAgICAgICAgICAgIHRhcmdldFNoYXBlLnB1c2goMSk7XG4gICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgIHRhcmdldFNoYXBlLnB1c2goeC5zaGFwZVtheGlzXSk7XG4gICAgICAgICAgICAgfVxuICAgICAgICAgICB9XG4gICAgICAgICAgIGNvbnN0IGJyb2FkY2FzdE1lYW4gPSByZXNoYXBlKG1lYW4sIHRhcmdldFNoYXBlKTtcbiAgICAgICAgICAgY29uc3QgYnJvYWRjYXN0VmFyaWFuY2UgPSByZXNoYXBlKHZhcmlhbmNlLCB0YXJnZXRTaGFwZSk7XG4gICAgICAgICAgIGNvbnN0IGJyb2FkY2FzdEdhbW1hID1cbiAgICAgICAgICAgICAgIGdhbW1hID09IG51bGwgPyBudWxsIDogcmVzaGFwZShnYW1tYSwgdGFyZ2V0U2hhcGUpO1xuICAgICAgICAgICBjb25zdCBicm9hZGNhc3RCZXRhID1cbiAgICAgICAgICAgICAgIGJldGEgPT0gbnVsbCA/IG51bGwgOiByZXNoYXBlKGJldGEsIHRhcmdldFNoYXBlKTtcbiAgICAgICAgICAgY29uc3Qgbm9ybWVkID0gYmF0Y2hOb3JtYWxpemF0aW9uKFxuICAgICAgICAgICAgICAgeCwgYnJvYWRjYXN0TWVhbiwgYnJvYWRjYXN0VmFyaWFuY2UsIGJyb2FkY2FzdEJldGEsXG4gICAgICAgICAgICAgICBicm9hZGNhc3RHYW1tYSwgZXBzaWxvbik7XG4gICAgICAgICAgIHJldHVybiBbbm9ybWVkLCBtZWFuLCB2YXJpYW5jZV07XG4gICAgICAgICB9KSBhcyBbVGVuc29yLCBUZW5zb3IsIFRlbnNvcl07XG59XG5cbi8qKlxuICogQmF0Y2ggbm9ybWFsaXphdGlvbiBmb3IgdXNlIGluIHRyYWluaW5nIChub3QgaW5mZXJlbmNlKS5cbiAqXG4gKiBAcGFyYW0geCBJbnB1dCB0ZW5zb3IgdG8gYmUgbm9ybWFsaXplZC5cbiAqIEBwYXJhbSBnYW1tYSBUZW5zb3IgYnkgd2hpY2ggdG8gc2NhbGUgdGhlIGlucHV0LlxuICogQHBhcmFtIGJldGEgVGVuc29yIGJ5IHdoaWNoIHRvIGNlbnRlciB0aGUgaW5wdXQuXG4gKiBAcGFyYW0gcmVkdWN0aW9uQXhlcyBBeGVzIG92ZXIgd2hpY2ggdG8gbm9ybWFsaXplLlxuICogQHBhcmFtIGVwc2lsb24gRnV6eiBmYWN0b3IuXG4gKiBAcmV0dXJucyBBbiBgQXJyYXlgIG9mIHRocmVlIGBUZW5zb3JzYDpcbiAqICAgW25vcm1hbGl6ZWQgdGVuc29yLCBtZWFuIG9mIGlucHV0LCB2YXJpYW5jZSBvZiBpbnB1dF0uXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBub3JtYWxpemVCYXRjaEluVHJhaW5pbmcoXG4gICAgeDogVGVuc29yLCBnYW1tYTogVGVuc29yLCBiZXRhOiBUZW5zb3IsIHJlZHVjdGlvbkF4ZXM6IG51bWJlcltdLFxuICAgIGVwc2lsb24gPSAxZS0zKTogW1RlbnNvciwgVGVuc29yLCBUZW5zb3JdIHtcbiAgaWYgKHV0aWwuYXJyYXlzRXF1YWwoXG4gICAgICAgICAgcmVkdWN0aW9uQXhlcy5zbGljZSgpLnNvcnQoKSwgbWF0aF91dGlscy5yYW5nZSgwLCB4LnJhbmsgLSAxKSkpIHtcbiAgICByZXR1cm4gcmVndWxhck5vcm1hbGl6ZUJhdGNoSW5UcmFpbmluZyhcbiAgICAgICAgeCwgZ2FtbWEsIGJldGEsIHJlZHVjdGlvbkF4ZXMsIGVwc2lsb24pO1xuICB9IGVsc2Uge1xuICAgIHJldHVybiBicm9hZGNhc3ROb3JtYWxpemVCYXRjaEluVHJhaW5pbmcoXG4gICAgICAgIHgsIGdhbW1hLCBiZXRhLCByZWR1Y3Rpb25BeGVzLCBlcHNpbG9uKTtcbiAgfVxufVxuXG5leHBvcnQgZGVjbGFyZSBpbnRlcmZhY2UgQmF0Y2hOb3JtYWxpemF0aW9uTGF5ZXJBcmdzIGV4dGVuZHMgTGF5ZXJBcmdzIHtcbiAgLyoqXG4gICAqIFRoZSBpbnRlZ2VyIGF4aXMgdGhhdCBzaG91bGQgYmUgbm9ybWFsaXplZCAodHlwaWNhbGx5IHRoZSBmZWF0dXJlcyBheGlzKS5cbiAgICogRGVmYXVsdHMgdG8gLTEuXG4gICAqXG4gICAqIEZvciBpbnN0YW5jZSwgYWZ0ZXIgYSBgQ29udjJEYCBsYXllciB3aXRoIGBkYXRhX2Zvcm1hdD1cImNoYW5uZWxzX2ZpcnN0XCJgLFxuICAgKiBzZXQgYGF4aXM9MWAgaW4gYGJhdGNoTm9ybWFsaXphdGlvbmAuXG4gICAqL1xuICBheGlzPzogbnVtYmVyO1xuXG4gIC8qKlxuICAgKiBNb21lbnR1bSBvZiB0aGUgbW92aW5nIGF2ZXJhZ2UuIERlZmF1bHRzIHRvIDAuOTkuXG4gICAqL1xuICBtb21lbnR1bT86IG51bWJlcjtcblxuICAvKipcbiAgICogU21hbGwgZmxvYXQgYWRkZWQgdG8gdGhlIHZhcmlhbmNlIHRvIGF2b2lkIGRpdmlkaW5nIGJ5IHplcm8uIERlZmF1bHRzIHRvXG4gICAqIDFlLTMuXG4gICAqL1xuICBlcHNpbG9uPzogbnVtYmVyO1xuXG4gIC8qKlxuICAgKiBJZiBgdHJ1ZWAsIGFkZCBvZmZzZXQgb2YgYGJldGFgIHRvIG5vcm1hbGl6ZWQgdGVuc29yLlxuICAgKiBJZiBgZmFsc2VgLCBgYmV0YWAgaXMgaWdub3JlZC5cbiAgICogRGVmYXVsdHMgdG8gYHRydWVgLlxuICAgKi9cbiAgY2VudGVyPzogYm9vbGVhbjtcblxuICAvKipcbiAgICogSWYgYHRydWVgLCBtdWx0aXBseSBieSBgZ2FtbWFgLlxuICAgKiBJZiBgZmFsc2VgLCBgZ2FtbWFgIGlzIG5vdCB1c2VkLlxuICAgKiBXaGVuIHRoZSBuZXh0IGxheWVyIGlzIGxpbmVhciAoYWxzbyBlLmcuIGBubi5yZWx1YCksXG4gICAqIHRoaXMgY2FuIGJlIGRpc2FibGVkIHNpbmNlIHRoZSBzY2FsaW5nIHdpbGwgYmUgZG9uZSBieSB0aGUgbmV4dCBsYXllci5cbiAgICogRGVmYXVsdHMgdG8gYHRydWVgLlxuICAgKi9cbiAgc2NhbGU/OiBib29sZWFuO1xuXG4gIC8qKlxuICAgKiBJbml0aWFsaXplciBmb3IgdGhlIGJldGEgd2VpZ2h0LlxuICAgKiAgRGVmYXVsdHMgdG8gJ3plcm9zJy5cbiAgICovXG4gIGJldGFJbml0aWFsaXplcj86IEluaXRpYWxpemVySWRlbnRpZmllcnxJbml0aWFsaXplcjtcblxuICAvKipcbiAgICogSW5pdGlhbGl6ZXIgZm9yIHRoZSBnYW1tYSB3ZWlnaHQuXG4gICAqICBEZWZhdWx0cyB0byBgb25lc2AuXG4gICAqL1xuICBnYW1tYUluaXRpYWxpemVyPzogSW5pdGlhbGl6ZXJJZGVudGlmaWVyfEluaXRpYWxpemVyO1xuXG4gIC8qKlxuICAgKiBJbml0aWFsaXplciBmb3IgdGhlIG1vdmluZyBtZWFuLlxuICAgKiBEZWZhdWx0cyB0byBgemVyb3NgXG4gICAqL1xuICBtb3ZpbmdNZWFuSW5pdGlhbGl6ZXI/OiBJbml0aWFsaXplcklkZW50aWZpZXJ8SW5pdGlhbGl6ZXI7XG5cbiAgLyoqXG4gICAqIEluaXRpYWxpemVyIGZvciB0aGUgbW92aW5nIHZhcmlhbmNlLlxuICAgKiAgRGVmYXVsdHMgdG8gJ09uZXMnLlxuICAgKi9cbiAgbW92aW5nVmFyaWFuY2VJbml0aWFsaXplcj86IEluaXRpYWxpemVySWRlbnRpZmllcnxJbml0aWFsaXplcjtcblxuICAvKipcbiAgICogQ29uc3RyYWludCBmb3IgdGhlIGJldGEgd2VpZ2h0LlxuICAgKi9cbiAgYmV0YUNvbnN0cmFpbnQ/OiBDb25zdHJhaW50SWRlbnRpZmllcnxDb25zdHJhaW50O1xuXG4gIC8qKlxuICAgKiBDb25zdHJhaW50IGZvciBnYW1tYSB3ZWlnaHQuXG4gICAqL1xuICBnYW1tYUNvbnN0cmFpbnQ/OiBDb25zdHJhaW50SWRlbnRpZmllcnxDb25zdHJhaW50O1xuXG4gIC8qKlxuICAgKiBSZWd1bGFyaXplciBmb3IgdGhlIGJldGEgd2VpZ2h0LlxuICAgKi9cbiAgYmV0YVJlZ3VsYXJpemVyPzogUmVndWxhcml6ZXJJZGVudGlmaWVyfFJlZ3VsYXJpemVyO1xuXG4gIC8qKlxuICAgKiBSZWd1bGFyaXplciBmb3IgdGhlIGdhbW1hIHdlaWdodC5cbiAgICovXG4gIGdhbW1hUmVndWxhcml6ZXI/OiBSZWd1bGFyaXplcklkZW50aWZpZXJ8UmVndWxhcml6ZXI7XG59XG5cbmV4cG9ydCBjbGFzcyBCYXRjaE5vcm1hbGl6YXRpb24gZXh0ZW5kcyBMYXllciB7XG4gIC8qKiBAbm9jb2xsYXBzZSAqL1xuICBzdGF0aWMgY2xhc3NOYW1lID0gJ0JhdGNoTm9ybWFsaXphdGlvbic7XG4gIHByaXZhdGUgcmVhZG9ubHkgYXhpczogbnVtYmVyO1xuICBwcml2YXRlIHJlYWRvbmx5IG1vbWVudHVtOiBudW1iZXI7XG4gIHByaXZhdGUgcmVhZG9ubHkgZXBzaWxvbjogbnVtYmVyO1xuICBwcml2YXRlIHJlYWRvbmx5IGNlbnRlcjogYm9vbGVhbjtcbiAgcHJpdmF0ZSByZWFkb25seSBzY2FsZTogYm9vbGVhbjtcbiAgcHJpdmF0ZSByZWFkb25seSBiZXRhSW5pdGlhbGl6ZXI6IEluaXRpYWxpemVyO1xuICBwcml2YXRlIHJlYWRvbmx5IGdhbW1hSW5pdGlhbGl6ZXI6IEluaXRpYWxpemVyO1xuICBwcml2YXRlIHJlYWRvbmx5IG1vdmluZ01lYW5Jbml0aWFsaXplcjogSW5pdGlhbGl6ZXI7XG4gIHByaXZhdGUgcmVhZG9ubHkgbW92aW5nVmFyaWFuY2VJbml0aWFsaXplcjogSW5pdGlhbGl6ZXI7XG4gIHByaXZhdGUgcmVhZG9ubHkgYmV0YUNvbnN0cmFpbnQ6IENvbnN0cmFpbnQ7XG4gIHByaXZhdGUgcmVhZG9ubHkgZ2FtbWFDb25zdHJhaW50OiBDb25zdHJhaW50O1xuICBwcml2YXRlIHJlYWRvbmx5IGJldGFSZWd1bGFyaXplcjogUmVndWxhcml6ZXI7XG4gIHByaXZhdGUgcmVhZG9ubHkgZ2FtbWFSZWd1bGFyaXplcjogUmVndWxhcml6ZXI7XG4gIHByaXZhdGUgZ2FtbWE6IExheWVyVmFyaWFibGU7XG4gIHByaXZhdGUgYmV0YTogTGF5ZXJWYXJpYWJsZTtcbiAgcHJpdmF0ZSBtb3ZpbmdNZWFuOiBMYXllclZhcmlhYmxlO1xuICBwcml2YXRlIG1vdmluZ1ZhcmlhbmNlOiBMYXllclZhcmlhYmxlO1xuXG4gIGNvbnN0cnVjdG9yKGFyZ3M/OiBCYXRjaE5vcm1hbGl6YXRpb25MYXllckFyZ3MpIHtcbiAgICBpZiAoYXJncyA9PSBudWxsKSB7XG4gICAgICBhcmdzID0ge307XG4gICAgfVxuICAgIHN1cGVyKGFyZ3MpO1xuXG4gICAgdGhpcy5zdXBwb3J0c01hc2tpbmcgPSB0cnVlO1xuICAgIHRoaXMuYXhpcyA9IGFyZ3MuYXhpcyA9PSBudWxsID8gLTEgOiBhcmdzLmF4aXM7XG4gICAgdGhpcy5tb21lbnR1bSA9IGFyZ3MubW9tZW50dW0gPT0gbnVsbCA/IDAuOTkgOiBhcmdzLm1vbWVudHVtO1xuICAgIHRoaXMuZXBzaWxvbiA9IGFyZ3MuZXBzaWxvbiA9PSBudWxsID8gMWUtMyA6IGFyZ3MuZXBzaWxvbjtcbiAgICB0aGlzLmNlbnRlciA9IGFyZ3MuY2VudGVyID09IG51bGwgPyB0cnVlIDogYXJncy5jZW50ZXI7XG4gICAgdGhpcy5zY2FsZSA9IGFyZ3Muc2NhbGUgPT0gbnVsbCA/IHRydWUgOiBhcmdzLnNjYWxlO1xuICAgIHRoaXMuYmV0YUluaXRpYWxpemVyID0gZ2V0SW5pdGlhbGl6ZXIoYXJncy5iZXRhSW5pdGlhbGl6ZXIgfHwgJ3plcm9zJyk7XG4gICAgdGhpcy5nYW1tYUluaXRpYWxpemVyID0gZ2V0SW5pdGlhbGl6ZXIoYXJncy5nYW1tYUluaXRpYWxpemVyIHx8ICdvbmVzJyk7XG4gICAgdGhpcy5tb3ZpbmdNZWFuSW5pdGlhbGl6ZXIgPVxuICAgICAgICBnZXRJbml0aWFsaXplcihhcmdzLm1vdmluZ01lYW5Jbml0aWFsaXplciB8fCAnemVyb3MnKTtcbiAgICB0aGlzLm1vdmluZ1ZhcmlhbmNlSW5pdGlhbGl6ZXIgPVxuICAgICAgICBnZXRJbml0aWFsaXplcihhcmdzLm1vdmluZ1ZhcmlhbmNlSW5pdGlhbGl6ZXIgfHwgJ29uZXMnKTtcbiAgICB0aGlzLmJldGFDb25zdHJhaW50ID0gZ2V0Q29uc3RyYWludChhcmdzLmJldGFDb25zdHJhaW50KTtcbiAgICB0aGlzLmdhbW1hQ29uc3RyYWludCA9IGdldENvbnN0cmFpbnQoYXJncy5nYW1tYUNvbnN0cmFpbnQpO1xuICAgIHRoaXMuYmV0YVJlZ3VsYXJpemVyID0gZ2V0UmVndWxhcml6ZXIoYXJncy5iZXRhUmVndWxhcml6ZXIpO1xuICAgIHRoaXMuZ2FtbWFSZWd1bGFyaXplciA9IGdldFJlZ3VsYXJpemVyKGFyZ3MuZ2FtbWFSZWd1bGFyaXplcik7XG4gIH1cblxuICBwdWJsaWMgYnVpbGQoaW5wdXRTaGFwZTogU2hhcGV8U2hhcGVbXSk6IHZvaWQge1xuICAgIGlucHV0U2hhcGUgPSBnZXRFeGFjdGx5T25lU2hhcGUoaW5wdXRTaGFwZSk7XG4gICAgY29uc3QgYXhpcyA9IHRoaXMuYXhpcyA+PSAwID8gdGhpcy5heGlzIDogKHRoaXMuYXhpcyArIGlucHV0U2hhcGUubGVuZ3RoKTtcbiAgICBjb25zdCBkaW0gPSBpbnB1dFNoYXBlW2F4aXNdO1xuICAgIGlmIChkaW0gPT0gbnVsbCkge1xuICAgICAgdGhyb3cgbmV3IFZhbHVlRXJyb3IoXG4gICAgICAgICAgYEF4aXMgJHtheGlzfSBvZiBpbnB1dCB0ZW5zb3Igc2hvdWxkIGhhdmUgYSBkZWZpbmVkIGRpbWVuc2lvbiBidXQgYCArXG4gICAgICAgICAgYHRoZSBsYXllciByZWNlaXZlZCBhbiBpbnB1dCB3aXRoIHNoYXBlIGAgK1xuICAgICAgICAgIGAke0pTT04uc3RyaW5naWZ5KGlucHV0U2hhcGUpfS5gKTtcbiAgICB9XG4gICAgdGhpcy5pbnB1dFNwZWMgPVxuICAgICAgICBbbmV3IElucHV0U3BlYyh7bmRpbTogaW5wdXRTaGFwZS5sZW5ndGgsIGF4ZXM6IHtbYXhpc106IGRpbX19KV07XG4gICAgY29uc3Qgc2hhcGUgPSBbZGltXTtcbiAgICBpZiAodGhpcy5zY2FsZSkge1xuICAgICAgdGhpcy5nYW1tYSA9IHRoaXMuYWRkV2VpZ2h0KFxuICAgICAgICAgICdnYW1tYScsIHNoYXBlLCBudWxsLCB0aGlzLmdhbW1hSW5pdGlhbGl6ZXIsIHRoaXMuZ2FtbWFSZWd1bGFyaXplcixcbiAgICAgICAgICB0cnVlLCB0aGlzLmdhbW1hQ29uc3RyYWludCk7XG4gICAgfVxuICAgIGlmICh0aGlzLmNlbnRlcikge1xuICAgICAgdGhpcy5iZXRhID0gdGhpcy5hZGRXZWlnaHQoXG4gICAgICAgICAgJ2JldGEnLCBzaGFwZSwgbnVsbCwgdGhpcy5iZXRhSW5pdGlhbGl6ZXIsIHRoaXMuYmV0YVJlZ3VsYXJpemVyLCB0cnVlLFxuICAgICAgICAgIHRoaXMuYmV0YUNvbnN0cmFpbnQpO1xuICAgIH1cbiAgICB0aGlzLm1vdmluZ01lYW4gPSB0aGlzLmFkZFdlaWdodChcbiAgICAgICAgJ21vdmluZ19tZWFuJywgc2hhcGUsIG51bGwsIHRoaXMubW92aW5nTWVhbkluaXRpYWxpemVyLCBudWxsLCBmYWxzZSk7XG4gICAgdGhpcy5tb3ZpbmdWYXJpYW5jZSA9IHRoaXMuYWRkV2VpZ2h0KFxuICAgICAgICAnbW92aW5nX3ZhcmlhbmNlJywgc2hhcGUsIG51bGwsIHRoaXMubW92aW5nVmFyaWFuY2VJbml0aWFsaXplciwgbnVsbCxcbiAgICAgICAgZmFsc2UpO1xuICAgIHRoaXMuYnVpbHQgPSB0cnVlO1xuICB9XG5cbiAgY2FsbChpbnB1dHM6IFRlbnNvcnxUZW5zb3JbXSwga3dhcmdzOiBLd2FyZ3MpOiBUZW5zb3J8VGVuc29yW10ge1xuICAgIHJldHVybiB0aWR5KCgpID0+IHtcbiAgICAgIGNvbnN0IHRyYWluaW5nID0ga3dhcmdzWyd0cmFpbmluZyddID09IG51bGwgPyBmYWxzZSA6IGt3YXJnc1sndHJhaW5pbmcnXTtcbiAgICAgIGNvbnN0IGlucHV0ID0gZ2V0RXhhY3RseU9uZVRlbnNvcihpbnB1dHMpO1xuICAgICAgY29uc3QgaW5wdXRTaGFwZSA9IGlucHV0LnNoYXBlO1xuICAgICAgY29uc3QgbmRpbSA9IGlucHV0U2hhcGUubGVuZ3RoO1xuICAgICAgY29uc3QgcmVkdWN0aW9uQXhlcyA9IG1hdGhfdXRpbHMucmFuZ2UoMCwgbmRpbSk7XG4gICAgICBjb25zdCBheGlzID0gdGhpcy5heGlzID49IDAgPyB0aGlzLmF4aXMgOiAodGhpcy5heGlzICsgbmRpbSk7XG4gICAgICByZWR1Y3Rpb25BeGVzLnNwbGljZShheGlzLCAxKTtcbiAgICAgIGNvbnN0IGJyb2FkY2FzdFNoYXBlID0gZ2VuZXJpY191dGlscy5weUxpc3RSZXBlYXQoMSwgbmRpbSk7XG4gICAgICBicm9hZGNhc3RTaGFwZVtheGlzXSA9IGlucHV0U2hhcGVbYXhpc107XG5cbiAgICAgIGNvbnN0IHNvcnRlZFJlZHVjdGlvbkF4ZXMgPSByZWR1Y3Rpb25BeGVzLnNsaWNlKCk7XG4gICAgICBzb3J0ZWRSZWR1Y3Rpb25BeGVzLnNvcnQoKTtcbiAgICAgIGNvbnN0IG5lZWRzQnJvYWRjYXN0aW5nID0gIXV0aWwuYXJyYXlzRXF1YWwoXG4gICAgICAgICAgc29ydGVkUmVkdWN0aW9uQXhlcywgbWF0aF91dGlscy5yYW5nZSgwLCBuZGltKS5zbGljZSgwLCBuZGltIC0gMSkpO1xuXG4gICAgICBjb25zdCBub3JtYWxpemVJbmZlcmVuY2U6ICgpID0+IFRlbnNvciA9ICgpID0+IHtcbiAgICAgICAgaWYgKG5lZWRzQnJvYWRjYXN0aW5nKSB7XG4gICAgICAgICAgY29uc3QgYnJvYWRjYXN0TW92aW5nTWVhbiA9XG4gICAgICAgICAgICAgIHJlc2hhcGUodGhpcy5tb3ZpbmdNZWFuLnJlYWQoKSwgYnJvYWRjYXN0U2hhcGUpO1xuICAgICAgICAgIGNvbnN0IGJyb2FkY2FzdE1vdmluZ1ZhcmlhbmNlID1cbiAgICAgICAgICAgICAgcmVzaGFwZSh0aGlzLm1vdmluZ1ZhcmlhbmNlLnJlYWQoKSwgYnJvYWRjYXN0U2hhcGUpO1xuICAgICAgICAgIGNvbnN0IGJyb2FkY2FzdEJldGEgPVxuICAgICAgICAgICAgICB0aGlzLmNlbnRlciA/IHJlc2hhcGUodGhpcy5iZXRhLnJlYWQoKSwgYnJvYWRjYXN0U2hhcGUpIDogbnVsbDtcbiAgICAgICAgICBjb25zdCBicm9hZGNhc3RHYW1tYSA9XG4gICAgICAgICAgICAgIHRoaXMuc2NhbGUgPyByZXNoYXBlKHRoaXMuZ2FtbWEucmVhZCgpLCBicm9hZGNhc3RTaGFwZSkgOiBudWxsO1xuICAgICAgICAgIHJldHVybiBiYXRjaE5vcm1hbGl6YXRpb24oXG4gICAgICAgICAgICAgIGlucHV0LCBicm9hZGNhc3RNb3ZpbmdNZWFuLCBicm9hZGNhc3RNb3ZpbmdWYXJpYW5jZSxcbiAgICAgICAgICAgICAgYnJvYWRjYXN0QmV0YSwgYnJvYWRjYXN0R2FtbWEsIHRoaXMuZXBzaWxvbik7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgcmV0dXJuIGJhdGNoTm9ybWFsaXphdGlvbihcbiAgICAgICAgICAgICAgaW5wdXQsIHRoaXMubW92aW5nTWVhbi5yZWFkKCksIHRoaXMubW92aW5nVmFyaWFuY2UucmVhZCgpLFxuICAgICAgICAgICAgICB0aGlzLmJldGEgPT0gbnVsbCA/IG51bGwgOiB0aGlzLmJldGEucmVhZCgpLFxuICAgICAgICAgICAgICB0aGlzLmdhbW1hID09IG51bGwgPyBudWxsIDogdGhpcy5nYW1tYS5yZWFkKCksIHRoaXMuZXBzaWxvbik7XG4gICAgICAgIH1cbiAgICAgIH07XG5cbiAgICAgIGlmICghdHJhaW5pbmcpIHtcbiAgICAgICAgcmV0dXJuIG5vcm1hbGl6ZUluZmVyZW5jZSgpO1xuICAgICAgfVxuXG4gICAgICBjb25zdCBbbm9ybWVkVHJhaW5pbmcsIG1lYW4sIHZhcmlhbmNlXSA9IG5vcm1hbGl6ZUJhdGNoSW5UcmFpbmluZyhcbiAgICAgICAgICBpbnB1dCwgdGhpcy5nYW1tYS5yZWFkKCksIHRoaXMuYmV0YS5yZWFkKCksIHJlZHVjdGlvbkF4ZXMsXG4gICAgICAgICAgdGhpcy5lcHNpbG9uKTtcblxuICAgICAgY29uc3QgZG9Nb3ZpbmdBdmVyYWdlID1cbiAgICAgICAgICAodmFyaWFibGU6IExheWVyVmFyaWFibGUsIHZhbHVlOiBUZW5zb3IsIG1vbWVudHVtOiBudW1iZXIpOiB2b2lkID0+IHtcbiAgICAgICAgICAgIHRmYy50aWR5KCgpID0+IHtcbiAgICAgICAgICAgICAgY29uc3QgZGVjYXkgPSAxIC0gbW9tZW50dW07XG4gICAgICAgICAgICAgIGNvbnN0IG9yaWdWYWx1ZSA9IHZhcmlhYmxlLnJlYWQoKTtcbiAgICAgICAgICAgICAgY29uc3QgdXBkYXRlRGVsdGEgPSB0ZmMubXVsKHRmYy5zdWIob3JpZ1ZhbHVlLCB2YWx1ZSksIGRlY2F5KTtcbiAgICAgICAgICAgICAgdmFyaWFibGUud3JpdGUodGZjLnN1YihvcmlnVmFsdWUsIHVwZGF0ZURlbHRhKSk7XG4gICAgICAgICAgICB9KTtcbiAgICAgICAgICB9O1xuXG4gICAgICAvLyBQZXJmb3JtIHVwZGF0ZXMgdG8gbW92aW5nIG1lYW4gYW5kIG1vdmluZyB2YXJpYW5jZSBmb3IgdHJhaW5pbmcuXG4gICAgICAvLyBQb3J0aW5nIE5vdGU6IEluIFB5S2VyYXMsIHRoZXNlIHVwZGF0ZXMgdG8gYG1vdmluZ01lYW5gIGFuZFxuICAgICAgLy8gICBgbW92aW5nQXZlcmFnZWAgYXJlIGRvbmUgYXMgYSBkZWZlcnJlZCBHcmFwaCwgYWRkZWQgdG8gdGhlIGBMYXllcmAnc1xuICAgICAgLy8gICBgdXBkYXRlYHMgdXNpbmcgdGhlIGBhZGRfdXBkYXRlKClgIG1ldGhvZC4gSGVyZSB3ZSBkbyBpdCBpbXBlcmF0aXZlbHlcbiAgICAgIC8vICAgYW5kIGVuY2Fwc3VsYXRlIHRoZSB1cGRhdGVzIGluIGEgZnVuY3Rpb24gdGhhdCBpcyBpbnZva2VkXG4gICAgICAvLyAgIGltbWVkaWF0ZWx5LlxuICAgICAgY29uc3QgdXBkYXRlTW92aW5nTWVhbkFuZFZhcmlhbmNlID0gKCkgPT4ge1xuICAgICAgICBkb01vdmluZ0F2ZXJhZ2UodGhpcy5tb3ZpbmdNZWFuLCBtZWFuLCB0aGlzLm1vbWVudHVtKTtcbiAgICAgICAgZG9Nb3ZpbmdBdmVyYWdlKHRoaXMubW92aW5nVmFyaWFuY2UsIHZhcmlhbmNlLCB0aGlzLm1vbWVudHVtKTtcbiAgICAgIH07XG4gICAgICB1cGRhdGVNb3ZpbmdNZWFuQW5kVmFyaWFuY2UoKTtcblxuICAgICAgcmV0dXJuIG5vcm1lZFRyYWluaW5nO1xuICAgIH0pO1xuICB9XG5cbiAgZ2V0Q29uZmlnKCk6IHNlcmlhbGl6YXRpb24uQ29uZmlnRGljdCB7XG4gICAgY29uc3QgY29uZmlnOiBzZXJpYWxpemF0aW9uLkNvbmZpZ0RpY3QgPSB7XG4gICAgICBheGlzOiB0aGlzLmF4aXMsXG4gICAgICBtb21lbnR1bTogdGhpcy5tb21lbnR1bSxcbiAgICAgIGVwc2lsb246IHRoaXMuZXBzaWxvbixcbiAgICAgIGNlbnRlcjogdGhpcy5jZW50ZXIsXG4gICAgICBzY2FsZTogdGhpcy5zY2FsZSxcbiAgICAgIGJldGFJbml0aWFsaXplcjogc2VyaWFsaXplSW5pdGlhbGl6ZXIodGhpcy5iZXRhSW5pdGlhbGl6ZXIpLFxuICAgICAgZ2FtbWFJbml0aWFsaXplcjogc2VyaWFsaXplSW5pdGlhbGl6ZXIodGhpcy5nYW1tYUluaXRpYWxpemVyKSxcbiAgICAgIG1vdmluZ01lYW5Jbml0aWFsaXplcjogc2VyaWFsaXplSW5pdGlhbGl6ZXIodGhpcy5tb3ZpbmdNZWFuSW5pdGlhbGl6ZXIpLFxuICAgICAgbW92aW5nVmFyaWFuY2VJbml0aWFsaXplcjpcbiAgICAgICAgICBzZXJpYWxpemVJbml0aWFsaXplcih0aGlzLm1vdmluZ1ZhcmlhbmNlSW5pdGlhbGl6ZXIpLFxuICAgICAgYmV0YVJlZ3VsYXJpemVyOiBzZXJpYWxpemVSZWd1bGFyaXplcih0aGlzLmJldGFSZWd1bGFyaXplciksXG4gICAgICBnYW1tYVJlZ3VsYXJpemVyOiBzZXJpYWxpemVSZWd1bGFyaXplcih0aGlzLmdhbW1hUmVndWxhcml6ZXIpLFxuICAgICAgYmV0YUNvbnN0cmFpbnQ6IHNlcmlhbGl6ZUNvbnN0cmFpbnQodGhpcy5iZXRhQ29uc3RyYWludCksXG4gICAgICBnYW1tYUNvbnN0cmFpbnQ6IHNlcmlhbGl6ZUNvbnN0cmFpbnQodGhpcy5nYW1tYUNvbnN0cmFpbnQpXG4gICAgfTtcbiAgICBjb25zdCBiYXNlQ29uZmlnID0gc3VwZXIuZ2V0Q29uZmlnKCk7XG4gICAgT2JqZWN0LmFzc2lnbihjb25maWcsIGJhc2VDb25maWcpO1xuICAgIHJldHVybiBjb25maWc7XG4gIH1cbn1cbnNlcmlhbGl6YXRpb24ucmVnaXN0ZXJDbGFzcyhCYXRjaE5vcm1hbGl6YXRpb24pO1xuXG5leHBvcnQgaW50ZXJmYWNlIExheWVyTm9ybWFsaXphdGlvbkxheWVyQXJncyBleHRlbmRzIExheWVyQXJncyB7XG4gIC8qKlxuICAgKiBUaGUgYXhpcyBvciBheGVzIHRoYXQgc2hvdWxkIGJlIG5vcm1hbGl6ZWQgKHR5cGljYWxseSwgdGhlIGZlYXR1cmUgYXhpcykuXG4gICAqIERlZmF1bHRzIHRvIC0xICh0aGUgbGFzdCBheGlzKS5cbiAgICovXG4gIGF4aXM/OiBudW1iZXJ8bnVtYmVyW107XG5cbiAgLyoqXG4gICAqIEEgc21hbGwgcG9zaXRpdmUgZmxvYXQgYWRkZWQgdG8gdmFyaWFuY2UgdG8gYXZvaWQgZGl2aXNvbiBieSB6ZXJvLlxuICAgKiBEZWZhdWx0cyB0byAxZS0zLlxuICAgKi9cbiAgZXBzaWxvbj86IG51bWJlcjtcblxuICAvKipcbiAgICogSWYgYHRydWVgLCBhZGQgb2Zmc2V0IG9mIGBiZXRhYCB0byBub3JtYWxpemVkIHRlbnNvci5cbiAgICogSWYgYGZhbHNlYCwgYGJldGFgIGlzIGlnbm9yZWQuXG4gICAqIERlZmF1bHQ6IGB0cnVlYC5cbiAgICovXG4gIGNlbnRlcj86IGJvb2xlYW47XG5cbiAgLyoqXG4gICAqIElmIGB0cnVlYCwgbXVsdGlwbHkgb3V0cHV0IGJ5IGBnYW1tYWAuXG4gICAqIElmIGBmYWxzZWAsIGBnYW1tYWAgaXMgbm90IHVzZWQuXG4gICAqIFdoZW4gdGhlIG5leHQgbGF5ZXIgaXMgbGluZWFyLCB0aGlzIGNhbiBiZSBkaXNhYmxlZCBzaW5jZSBzY2FsaW5nIHdpbGxcbiAgICogYmUgZG9uZSBieSB0aGUgbmV4dCBsYXllci5cbiAgICogRGVmYXVsdDogYHRydWVgLlxuICAgKi9cbiAgc2NhbGU/OiBib29sZWFuO1xuXG4gIC8qKlxuICAgKiBJbml0aWFsaXplciBmb3IgdGhlIGJldGEgd2VpZ2h0LlxuICAgKiBEZWZhdWx0OiBgJ3plcm9zJ2AuXG4gICAqL1xuICBiZXRhSW5pdGlhbGl6ZXI/OiBJbml0aWFsaXplcklkZW50aWZpZXJ8SW5pdGlhbGl6ZXI7XG5cbiAgLyoqXG4gICAqIEluaXRpYWxpemVyIGZvciB0aGUgZ2FtbWEgd2VpZ2h0LlxuICAgKiBEZWZhdWx0OiBgJ29uZXMnYC5cbiAgICovXG4gIGdhbW1hSW5pdGlhbGl6ZXI/OiBJbml0aWFsaXplcklkZW50aWZpZXJ8SW5pdGlhbGl6ZXI7XG5cbiAgLyoqIFJlZ3VsYXJpemVyIGZvciB0aGUgYmV0YSB3ZWlnaHQuICovXG4gIGJldGFSZWd1bGFyaXplcj86IFJlZ3VsYXJpemVySWRlbnRpZmllcnxSZWd1bGFyaXplcjtcblxuICAvKiogUmVndWxhcml6ZXIgZm9yIHRoZSBnYW1tYSB3ZWlnaHQuICovXG4gIGdhbW1hUmVndWxhcml6ZXI/OiBSZWd1bGFyaXplcklkZW50aWZpZXJ8UmVndWxhcml6ZXI7XG59XG5cbmV4cG9ydCBjbGFzcyBMYXllck5vcm1hbGl6YXRpb24gZXh0ZW5kcyBMYXllciB7XG4gIC8qKiBAbm9jb2xsYXBzZSAqL1xuICBzdGF0aWMgY2xhc3NOYW1lID0gJ0xheWVyTm9ybWFsaXphdGlvbic7XG5cbiAgcHJpdmF0ZSBheGlzOiBudW1iZXJ8bnVtYmVyW107XG4gIHJlYWRvbmx5IGVwc2lsb246IG51bWJlcjtcbiAgcmVhZG9ubHkgY2VudGVyOiBib29sZWFuO1xuICByZWFkb25seSBzY2FsZTogYm9vbGVhbjtcbiAgcmVhZG9ubHkgYmV0YUluaXRpYWxpemVyOiBJbml0aWFsaXplcjtcbiAgcmVhZG9ubHkgZ2FtbWFJbml0aWFsaXplcjogSW5pdGlhbGl6ZXI7XG4gIHJlYWRvbmx5IGJldGFSZWd1bGFyaXplcjogUmVndWxhcml6ZXI7XG4gIHJlYWRvbmx5IGdhbW1hUmVndWxhcml6ZXI6IFJlZ3VsYXJpemVyO1xuXG4gIHByaXZhdGUgZ2FtbWE6IExheWVyVmFyaWFibGU7XG4gIHByaXZhdGUgYmV0YTogTGF5ZXJWYXJpYWJsZTtcblxuICBjb25zdHJ1Y3RvcihhcmdzPzogTGF5ZXJOb3JtYWxpemF0aW9uTGF5ZXJBcmdzKSB7XG4gICAgaWYgKGFyZ3MgPT0gbnVsbCkge1xuICAgICAgYXJncyA9IHt9O1xuICAgIH1cbiAgICBzdXBlcihhcmdzKTtcblxuICAgIHRoaXMuYXhpcyA9IGFyZ3MuYXhpcyA9PSBudWxsID8gLTEgOiBhcmdzLmF4aXM7XG4gICAgaWYgKHR5cGVvZiB0aGlzLmF4aXMgPT09ICdudW1iZXInKSB7XG4gICAgICBpZiAoIU51bWJlci5pc0ludGVnZXIodGhpcy5heGlzKSkge1xuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoXG4gICAgICAgICAgICBgRXhwZWN0ZWQgYXhpcyB0byBiZSBhbiBpbnRlZ2VyLCBidXQgcmVjZWl2ZWQgJHt0aGlzLmF4aXN9YCk7XG4gICAgICB9XG4gICAgfSBlbHNlIGlmIChBcnJheS5pc0FycmF5KHRoaXMuYXhpcykpIHtcbiAgICAgIGZvciAoY29uc3QgYXhpcyBvZiB0aGlzLmF4aXMpIHtcbiAgICAgICAgaWYgKCFOdW1iZXIuaXNJbnRlZ2VyKGF4aXMpKSB7XG4gICAgICAgICAgdGhyb3cgbmV3IEVycm9yKFxuICAgICAgICAgICAgICBgRXhwZWN0ZWQgYXhpcyB0byBiZSBhbiBhcnJheSBvZiBpbnRlZ2VycywgYCArXG4gICAgICAgICAgICAgIGBidXQgcmVjZWl2ZWQgJHtKU09OLnN0cmluZ2lmeSh0aGlzLmF4aXMpfWApO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfSBlbHNlIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcihcbiAgICAgICAgICBgRXhwZWN0ZWQgYXhpcyB0byBiZSBhbiBpbnRlZ2VyIG9yIGFuIGFycmF5IG9mIGludGVnZXJzLCBgICtcbiAgICAgICAgICBgYnV0IHJlY2VpdmVkICR7SlNPTi5zdHJpbmdpZnkodGhpcy5heGlzKX1gKTtcbiAgICB9XG5cbiAgICB0aGlzLmVwc2lsb24gPSBhcmdzLmVwc2lsb24gPT0gbnVsbCA/IDFlLTMgOiBhcmdzLmVwc2lsb247XG4gICAgdGhpcy5jZW50ZXIgPSBhcmdzLmNlbnRlciA9PSBudWxsID8gdHJ1ZSA6IGFyZ3MuY2VudGVyO1xuICAgIHRoaXMuc2NhbGUgPSBhcmdzLnNjYWxlID09IG51bGwgPyB0cnVlIDogYXJncy5zY2FsZTtcbiAgICB0aGlzLmJldGFJbml0aWFsaXplciA9IGdldEluaXRpYWxpemVyKGFyZ3MuYmV0YUluaXRpYWxpemVyIHx8ICd6ZXJvcycpO1xuICAgIHRoaXMuZ2FtbWFJbml0aWFsaXplciA9IGdldEluaXRpYWxpemVyKGFyZ3MuZ2FtbWFJbml0aWFsaXplciB8fCAnb25lcycpO1xuICAgIHRoaXMuYmV0YVJlZ3VsYXJpemVyID0gZ2V0UmVndWxhcml6ZXIoYXJncy5iZXRhUmVndWxhcml6ZXIpO1xuICAgIHRoaXMuZ2FtbWFSZWd1bGFyaXplciA9IGdldFJlZ3VsYXJpemVyKGFyZ3MuZ2FtbWFSZWd1bGFyaXplcik7XG5cbiAgICB0aGlzLnN1cHBvcnRzTWFza2luZyA9IHRydWU7XG4gIH1cblxuICBwdWJsaWMgYnVpbGQoaW5wdXRTaGFwZTogU2hhcGV8U2hhcGVbXSk6IHZvaWQge1xuICAgIGlucHV0U2hhcGUgPSBnZXRFeGFjdGx5T25lU2hhcGUoaW5wdXRTaGFwZSk7XG4gICAgY29uc3QgbkRpbXMgPSBpbnB1dFNoYXBlLmxlbmd0aDtcblxuICAgIC8vIENvbnZlcnQgYXhpcyB0byBhcnJheSBhbmQgcmVzb2x2ZSBuZWdhdGl2ZXMuXG4gICAgaWYgKHR5cGVvZiB0aGlzLmF4aXMgPT09ICdudW1iZXInKSB7XG4gICAgICB0aGlzLmF4aXMgPSBbdGhpcy5heGlzXTtcbiAgICB9XG4gICAgZm9yIChsZXQgaSA9IDA7IGkgPCB0aGlzLmF4aXMubGVuZ3RoOyArK2kpIHtcbiAgICAgIGlmICh0aGlzLmF4aXNbaV0gPCAwKSB7XG4gICAgICAgIHRoaXMuYXhpc1tpXSArPSBuRGltcztcbiAgICAgIH1cbiAgICB9XG5cbiAgICAvLyBGdXJ0aGVyIHZhbGlkYXRlIGF4ZXMuXG4gICAgZm9yIChjb25zdCBheGlzIG9mIHRoaXMuYXhpcykge1xuICAgICAgaWYgKGF4aXMgPCAwIHx8IGF4aXMgPj0gbkRpbXMpIHtcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKGBJbnZhbGlkIGF4aXM6ICR7YXhpc31gKTtcbiAgICAgIH1cbiAgICB9XG4gICAgaWYgKHRoaXMuYXhpcy5sZW5ndGggIT09IGdlbmVyaWNfdXRpbHMudW5pcXVlKHRoaXMuYXhpcykubGVuZ3RoKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoYEZvdW5kIGR1cGxpY2F0ZSBheGVzIGluOiAke3RoaXMuYXhpc31gKTtcbiAgICB9XG5cbiAgICBjb25zdCBwYXJhbVNoYXBlID0gdGhpcy5heGlzLm1hcChheGlzID0+IGlucHV0U2hhcGVbYXhpc10pIGFzIG51bWJlcltdO1xuXG4gICAgY29uc3QgdHJhaW5hYmxlID0gdHJ1ZTtcbiAgICBpZiAodGhpcy5zY2FsZSkge1xuICAgICAgdGhpcy5nYW1tYSA9IHRoaXMuYWRkV2VpZ2h0KFxuICAgICAgICAgICdnYW1tYScsIHBhcmFtU2hhcGUsICdmbG9hdDMyJywgdGhpcy5nYW1tYUluaXRpYWxpemVyLFxuICAgICAgICAgIHRoaXMuZ2FtbWFSZWd1bGFyaXplciwgdHJhaW5hYmxlKTtcbiAgICB9IGVsc2Uge1xuICAgICAgdGhpcy5nYW1tYSA9IG51bGw7XG4gICAgfVxuICAgIGlmICh0aGlzLmNlbnRlcikge1xuICAgICAgdGhpcy5iZXRhID0gdGhpcy5hZGRXZWlnaHQoXG4gICAgICAgICAgJ2JldGEnLCBwYXJhbVNoYXBlLCAnZmxvYXQzMicsIHRoaXMuYmV0YUluaXRpYWxpemVyLFxuICAgICAgICAgIHRoaXMuYmV0YVJlZ3VsYXJpemVyLCB0cmFpbmFibGUpO1xuICAgIH0gZWxzZSB7XG4gICAgICB0aGlzLmJldGEgPSBudWxsO1xuICAgIH1cblxuICAgIHRoaXMuYnVpbHQgPSB0cnVlO1xuICB9XG5cbiAgY2FsbChpbnB1dHM6IFRlbnNvcnxUZW5zb3JbXSwga3dhcmdzOiBLd2FyZ3MpOiBUZW5zb3J8VGVuc29yW10ge1xuICAgIGNvbnN0IGlucHV0ID0gZ2V0RXhhY3RseU9uZVRlbnNvcihpbnB1dHMpO1xuICAgIGNvbnN0IGlucHV0U2hhcGUgPSBpbnB1dC5zaGFwZTtcbiAgICBjb25zdCBuRGltcyA9IGlucHV0U2hhcGUubGVuZ3RoO1xuXG4gICAgcmV0dXJuIHRpZHkoKCkgPT4ge1xuICAgICAgY29uc3Qga2VlcERpbXMgPSB0cnVlO1xuICAgICAgbGV0IHttZWFuLCB2YXJpYW5jZX0gPSBtb21lbnRzKGlucHV0LCB0aGlzLmF4aXMsIGtlZXBEaW1zKTtcbiAgICAgIGNvbnN0IGJyb2FkY2FzdFNoYXBlID0gZ2VuZXJpY191dGlscy5weUxpc3RSZXBlYXQoMSwgbkRpbXMpO1xuICAgICAgZm9yIChjb25zdCBkaW0gb2YgdGhpcy5heGlzIGFzIG51bWJlcltdKSB7XG4gICAgICAgIGJyb2FkY2FzdFNoYXBlW2RpbV0gPSBpbnB1dFNoYXBlW2RpbV07XG4gICAgICB9XG5cbiAgICAgIGNvbnN0IGJyb2FkY2FzdCA9ICh2OiBUZW5zb3IpID0+IHtcbiAgICAgICAgaWYgKHYgIT0gbnVsbCAmJiB2LnNoYXBlLmxlbmd0aCAhPT0gbkRpbXMpIHtcbiAgICAgICAgICByZXR1cm4gdGZjLnJlc2hhcGUodiwgYnJvYWRjYXN0U2hhcGUpO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIHJldHVybiB2O1xuICAgICAgICB9XG4gICAgICB9O1xuXG4gICAgICBsZXQgc2NhbGUgPSB0aGlzLnNjYWxlID8gYnJvYWRjYXN0KHRoaXMuZ2FtbWEucmVhZCgpKSA6IG51bGw7XG4gICAgICBsZXQgb2Zmc2V0ID0gdGhpcy5jZW50ZXIgPyBicm9hZGNhc3QodGhpcy5iZXRhLnJlYWQoKSkgOiBudWxsO1xuXG4gICAgICAvLyBUT0RPKGh0dHBzOi8vZ2l0aHViLmNvbS90ZW5zb3JmbG93L3RmanMvaXNzdWVzLzIxMjApOiBUaGUgdGlsaW5nIGJlbG93XG4gICAgICAvLyBpcyBhIHdvcmthcm91bmQgZm9yIHRoZSBsaW1pdGF0aW9uIG9mIGNvcmUncyBiYXRjaE5vcm1hbGl6YXRpb24/ZCBkb24ndFxuICAgICAgLy8gc3VwcG9ydCBicm9hZGNhc3RpbmcgaW4gdGhlaXIgZ3JhZGllbnRzLiBJbiBhZGRpdGlvbiwgdGhlIHRpbGluZyBpc1xuICAgICAgLy8gbmVjZXNzYXJ5IHRvIGVuc3VyZSBjb3JyZWN0bmVzcyBvbiB0aGUgYnJvd3NlciBDUFUgYmFja2VuZCByZWdhcmRsZXNzXG4gICAgICAvLyBvZiBmb3J3YXJkIG9yIGJhY2t3YXJkIGNvbXB1dGF0aW9uLiBSZW1vdmUgdGhpcyB3b3JrYXJvdW5kIG9uY2UgdGhlXG4gICAgICAvLyBsaW1pdGF0aW9uIGlzIGFkZHJlc3NlZC4gU2VlIC5cbiAgICAgIGNvbnN0IG1vbWVudHNUaWxpbmc6IG51bWJlcltdID0gW107XG4gICAgICBjb25zdCBzY2FsZU9mZnNldFRpbGluZzogbnVtYmVyW10gPSBbXTtcbiAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgbkRpbXM7ICsraSkge1xuICAgICAgICBpZiAoKHRoaXMuYXhpcyBhcyBudW1iZXJbXSkuaW5kZXhPZihpKSAhPT0gLTEpIHtcbiAgICAgICAgICBtb21lbnRzVGlsaW5nLnB1c2goaW5wdXRTaGFwZVtpXSk7XG4gICAgICAgICAgc2NhbGVPZmZzZXRUaWxpbmcucHVzaCgxKTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICBtb21lbnRzVGlsaW5nLnB1c2goMSk7XG4gICAgICAgICAgc2NhbGVPZmZzZXRUaWxpbmcucHVzaChpbnB1dFNoYXBlW2ldKTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgICAgbWVhbiA9IHRmYy50aWxlKG1lYW4sIG1vbWVudHNUaWxpbmcpO1xuICAgICAgdmFyaWFuY2UgPSB0ZmMudGlsZSh2YXJpYW5jZSwgbW9tZW50c1RpbGluZyk7XG4gICAgICBpZiAoc2NhbGUgIT0gbnVsbCkge1xuICAgICAgICBzY2FsZSA9IHRmYy50aWxlKHNjYWxlLCBzY2FsZU9mZnNldFRpbGluZyk7XG4gICAgICB9XG4gICAgICBpZiAob2Zmc2V0ICE9IG51bGwpIHtcbiAgICAgICAgb2Zmc2V0ID0gdGZjLnRpbGUob2Zmc2V0LCBzY2FsZU9mZnNldFRpbGluZyk7XG4gICAgICB9XG5cbiAgICAgIHJldHVybiBiYXRjaE5vcm1hbGl6YXRpb24oXG4gICAgICAgICAgaW5wdXQsIG1lYW4sIHZhcmlhbmNlLCBvZmZzZXQsIHNjYWxlLCB0aGlzLmVwc2lsb24pO1xuICAgIH0pO1xuICB9XG5cbiAgZ2V0Q29uZmlnKCk6IHNlcmlhbGl6YXRpb24uQ29uZmlnRGljdCB7XG4gICAgY29uc3QgY29uZmlnOiBzZXJpYWxpemF0aW9uLkNvbmZpZ0RpY3QgPSB7XG4gICAgICBheGlzOiB0aGlzLmF4aXMsXG4gICAgICBlcHNpbG9uOiB0aGlzLmVwc2lsb24sXG4gICAgICBjZW50ZXI6IHRoaXMuY2VudGVyLFxuICAgICAgc2NhbGU6IHRoaXMuc2NhbGUsXG4gICAgICBiZXRhSW5pdGlhbGl6ZXI6IHNlcmlhbGl6ZUluaXRpYWxpemVyKHRoaXMuYmV0YUluaXRpYWxpemVyKSxcbiAgICAgIGdhbW1hSW5pdGlhbGl6ZXI6IHNlcmlhbGl6ZUluaXRpYWxpemVyKHRoaXMuZ2FtbWFJbml0aWFsaXplciksXG4gICAgICBiZXRhUmVndWxhcml6ZXI6IHNlcmlhbGl6ZVJlZ3VsYXJpemVyKHRoaXMuYmV0YVJlZ3VsYXJpemVyKSxcbiAgICAgIGdhbW1hUmVndWxhcml6ZXI6IHNlcmlhbGl6ZVJlZ3VsYXJpemVyKHRoaXMuZ2FtbWFSZWd1bGFyaXplcilcbiAgICB9O1xuICAgIGNvbnN0IGJhc2VDb25maWcgPSBzdXBlci5nZXRDb25maWcoKTtcbiAgICBPYmplY3QuYXNzaWduKGNvbmZpZywgYmFzZUNvbmZpZyk7XG4gICAgcmV0dXJuIGNvbmZpZztcbiAgfVxufVxuc2VyaWFsaXphdGlvbi5yZWdpc3RlckNsYXNzKExheWVyTm9ybWFsaXphdGlvbik7XG4iXX0=","/**\n * @license\n * Copyright 2018 Google LLC\n *\n * Use of this source code is governed by an MIT-style\n * license that can be found in the LICENSE file or at\n * https://opensource.org/licenses/MIT.\n * =============================================================================\n */\n/**\n * Padding Layers.\n */\n// Porting Note: In Python Keras, the padding layers are in convolutional.py,\n// but we decided to put them in a separate file (padding.ts) for clarity.\nimport * as tfc from '@tensorflow/tfjs-core';\nimport { serialization, tidy } from '@tensorflow/tfjs-core';\nimport { imageDataFormat } from '../backend/common';\nimport { InputSpec, Layer } from '../engine/topology';\nimport { ValueError } from '../errors';\nimport { getExactlyOneShape, getExactlyOneTensor } from '../utils/types_utils';\n/**\n * Pads the middle dimension of a 3D tensor.\n *\n * @param x Input `tf.Tensor` to be padded.\n * @param padding `Array` of 2 integers, how many zeros to add at the start and\n * end of the middle dimension (i.e., dimension 1).\n * @return A padded 3D `tf.Tensor`.\n */\nexport function temporalPadding(x, padding) {\n return tidy(() => {\n if (x.rank !== 3) {\n throw new ValueError(`temporalPadding expects input tensor to be 3-D, but received a ` +\n `${x.rank}-D tensor.`);\n }\n if (padding == null) {\n padding = [1, 1];\n }\n if (padding.length !== 2) {\n throw new ValueError(`temporalPadding expects input padding pattern to be a length-2 ` +\n `array, but received a length-${padding.length} array.`);\n }\n const pattern = [[0, 0], padding, [0, 0]];\n return tfc.pad(x, pattern);\n });\n}\n/**\n * Pads the 2nd and 3rd dimensions of a 4D tensor.\n *\n * @param x Input `tf.Tensor` to be padded.\n * @param padding `Array` of two `Array`s, each of which is an `Array` of two\n * integers. The amount of padding at the beginning and end of the 2nd and 3rd\n * dimensions, respectively.\n * @param dataFormat 'channelsLast' (default) or 'channelsFirst'.\n * @return Padded 4D `tf.Tensor`.\n */\nexport function spatial2dPadding(x, padding, dataFormat) {\n return tidy(() => {\n if (x.rank !== 4) {\n throw new ValueError(`temporalPadding expects input tensor to be 4-D, but received a ` +\n `${x.rank}-D tensor.`);\n }\n if (padding == null) {\n padding = [[1, 1], [1, 1]];\n }\n if (padding.length !== 2 || padding[0].length !== 2 ||\n padding[1].length !== 2) {\n throw new ValueError('spatial2dPadding expects `padding` to be an Array of two Arrays, ' +\n 'each of which is an Array of two integers.');\n }\n if (dataFormat == null) {\n dataFormat = imageDataFormat();\n }\n if (dataFormat !== 'channelsLast' && dataFormat !== 'channelsFirst') {\n throw new ValueError(`Unknown data format: ${dataFormat}. ` +\n `Supported data formats are 'channelsLast' and 'channelsFirst.`);\n }\n let pattern;\n if (dataFormat === 'channelsFirst') {\n pattern = [[0, 0], [0, 0], padding[0], padding[1]];\n }\n else {\n pattern = [[0, 0], padding[0], padding[1], [0, 0]];\n }\n return tfc.pad(x, pattern);\n });\n}\nexport class ZeroPadding2D extends Layer {\n constructor(args) {\n if (args == null) {\n args = {};\n }\n super(args);\n this.dataFormat =\n args.dataFormat == null ? imageDataFormat() : args.dataFormat;\n // TODO(cais): Maybe refactor the following logic surrounding `padding`\n // into a helper method.\n if (args.padding == null) {\n this.padding = [[1, 1], [1, 1]];\n }\n else if (typeof args.padding === 'number') {\n this.padding =\n [[args.padding, args.padding], [args.padding, args.padding]];\n }\n else {\n args.padding = args.padding;\n if (args.padding.length !== 2) {\n throw new ValueError(`ZeroPadding2D expects padding to be a length-2 array, but ` +\n `received a length-${args.padding.length} array.`);\n }\n let heightPadding;\n let widthPadding;\n if (typeof args.padding[0] === 'number') {\n heightPadding = [args.padding[0], args.padding[0]];\n widthPadding = [args.padding[1], args.padding[1]];\n }\n else {\n args.padding = args.padding;\n if (args.padding[0].length !== 2) {\n throw new ValueError(`ZeroPadding2D expects height padding to be a length-2 array, ` +\n `but received a length-${args.padding[0].length} array.`);\n }\n heightPadding = args.padding[0];\n if (args.padding[1].length !== 2) {\n throw new ValueError(`ZeroPadding2D expects width padding to be a length-2 array, ` +\n `but received a length-${args.padding[1].length} array.`);\n }\n widthPadding = args.padding[1];\n }\n this.padding = [heightPadding, widthPadding];\n }\n this.inputSpec = [new InputSpec({ ndim: 4 })];\n }\n computeOutputShape(inputShape) {\n inputShape = getExactlyOneShape(inputShape);\n let rows;\n let cols;\n if (this.dataFormat === 'channelsFirst') {\n if (inputShape[2] != null && inputShape[2] >= 0) {\n rows = inputShape[2] + this.padding[0][0] + this.padding[0][1];\n }\n else {\n rows = null;\n }\n if (inputShape[3] != null && inputShape[3] >= 0) {\n cols = inputShape[3] + this.padding[1][0] + this.padding[1][1];\n }\n else {\n cols = null;\n }\n return [inputShape[0], inputShape[1], rows, cols];\n }\n else {\n if (inputShape[1] != null && inputShape[1] >= 0) {\n rows = inputShape[1] + this.padding[0][0] + this.padding[0][1];\n }\n else {\n rows = null;\n }\n if (inputShape[2] != null && inputShape[2] >= 0) {\n cols = inputShape[2] + this.padding[1][0] + this.padding[1][1];\n }\n else {\n cols = null;\n }\n return [inputShape[0], rows, cols, inputShape[3]];\n }\n }\n call(inputs, kwargs) {\n return tidy(() => spatial2dPadding(getExactlyOneTensor(inputs), this.padding, this.dataFormat));\n }\n getConfig() {\n const config = {\n padding: this.padding,\n dataFormat: this.dataFormat,\n };\n const baseConfig = super.getConfig();\n Object.assign(config, baseConfig);\n return config;\n }\n}\n/** @nocollapse */\nZeroPadding2D.className = 'ZeroPadding2D';\nserialization.registerClass(ZeroPadding2D);\n//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicGFkZGluZy5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uLy4uL3RmanMtbGF5ZXJzL3NyYy9sYXllcnMvcGFkZGluZy50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQTs7Ozs7Ozs7R0FRRztBQUVIOztHQUVHO0FBRUgsNkVBQTZFO0FBQzdFLDRFQUE0RTtBQUU1RSxPQUFPLEtBQUssR0FBRyxNQUFNLHVCQUF1QixDQUFDO0FBQzdDLE9BQU8sRUFBQyxhQUFhLEVBQVUsSUFBSSxFQUFDLE1BQU0sdUJBQXVCLENBQUM7QUFFbEUsT0FBTyxFQUFDLGVBQWUsRUFBQyxNQUFNLG1CQUFtQixDQUFDO0FBQ2xELE9BQU8sRUFBQyxTQUFTLEVBQUUsS0FBSyxFQUFZLE1BQU0sb0JBQW9CLENBQUM7QUFDL0QsT0FBTyxFQUFDLFVBQVUsRUFBQyxNQUFNLFdBQVcsQ0FBQztBQUdyQyxPQUFPLEVBQUMsa0JBQWtCLEVBQUUsbUJBQW1CLEVBQUMsTUFBTSxzQkFBc0IsQ0FBQztBQUU3RTs7Ozs7OztHQU9HO0FBQ0gsTUFBTSxVQUFVLGVBQWUsQ0FBQyxDQUFTLEVBQUUsT0FBMEI7SUFDbkUsT0FBTyxJQUFJLENBQUMsR0FBRyxFQUFFO1FBQ2YsSUFBSSxDQUFDLENBQUMsSUFBSSxLQUFLLENBQUMsRUFBRTtZQUNoQixNQUFNLElBQUksVUFBVSxDQUNoQixpRUFBaUU7Z0JBQ2pFLEdBQUcsQ0FBQyxDQUFDLElBQUksWUFBWSxDQUFDLENBQUM7U0FDNUI7UUFFRCxJQUFJLE9BQU8sSUFBSSxJQUFJLEVBQUU7WUFDbkIsT0FBTyxHQUFHLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDO1NBQ2xCO1FBQ0QsSUFBSSxPQUFPLENBQUMsTUFBTSxLQUFLLENBQUMsRUFBRTtZQUN4QixNQUFNLElBQUksVUFBVSxDQUNoQixpRUFBaUU7Z0JBQ2pFLGdDQUFnQyxPQUFPLENBQUMsTUFBTSxTQUFTLENBQUMsQ0FBQztTQUM5RDtRQUVELE1B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LENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQztTQUNuRDtJQUNILENBQUM7SUFFRCxJQUFJLENBQUMsTUFBdUIsRUFBRSxNQUFjO1FBQzFDLE9BQU8sSUFBSSxDQUNQLEdBQUcsRUFBRSxDQUFDLGdCQUFnQixDQUNsQixtQkFBbUIsQ0FBQyxNQUFNLENBQUMsRUFBRSxJQUFJLENBQUMsT0FBTyxFQUFFLElBQUksQ0FBQyxVQUFVLENBQUMsQ0FBQyxDQUFDO0lBQ3ZFLENBQUM7SUFFRCxTQUFTO1FBQ1AsTUFBTSxNQUFNLEdBQTZCO1lBQ3ZDLE9BQU8sRUFBRSxJQUFJLENBQUMsT0FBTztZQUNyQixVQUFVLEVBQUUsSUFBSSxDQUFDLFVBQVU7U0FDNUIsQ0FBQztRQUNGLE1BQU0sVUFBVSxHQUFHLEtBQUssQ0FBQyxTQUFTLEVBQUUsQ0FBQztRQUNyQyxNQUFNLENBQUMsTUFBTSxDQUFDLE1BQU0sRUFBRSxVQUFVLENBQUMsQ0FBQztRQUNsQyxPQUFPLE1BQU0sQ0FBQztJQUNoQixDQUFDOztBQXJHRCxrQkFBa0I7QUFDWCx1QkFBUyxHQUFHLGVBQWUsQ0FBQztBQXNHckMsYUFBYSxDQUFDLGFBQWEsQ0FBQyxhQUFhLENBQUMsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbIi8qKlxuICogQGxpY2Vuc2VcbiAqIENvcHlyaWdodCAyMDE4IEdvb2dsZSBMTENcbiAqXG4gKiBVc2Ugb2YgdGhpcyBzb3VyY2UgY29kZSBpcyBnb3Zlcm5lZCBieSBhbiBNSVQtc3R5bGVcbiAqIGxpY2Vuc2UgdGhhdCBjYW4gYmUgZm91bmQgaW4gdGhlIExJQ0VOU0UgZmlsZSBvciBhdFxuICogaHR0cHM6Ly9vcGVuc291cmNlLm9yZy9saWNlbnNlcy9NSVQuXG4gKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuICovXG5cbi8qKlxuICogUGFkZGluZyBMYXllcnMuXG4gKi9cblxuLy8gUG9ydGluZyBOb3RlOiBJbiBQeXRob24gS2VyYXMsIHRoZSBwYWRkaW5nIGxheWVycyBhcmUgaW4gY29udm9sdXRpb25hbC5weSxcbi8vICAgYnV0IHdlIGRlY2lkZWQgdG8gcHV0IHRoZW0gaW4gYSBzZXBhcmF0ZSBmaWxlIChwYWRkaW5nLnRzKSBmb3IgY2xhcml0eS5cblxuaW1wb3J0ICogYXMgdGZjIGZyb20gJ0B0ZW5zb3JmbG93L3RmanMtY29yZSc7XG5pbXBvcnQge3NlcmlhbGl6YXRpb24sIFRlbnNvciwgdGlkeX0gZnJvbSAnQHRlbnNvcmZsb3cvdGZqcy1jb3JlJztcblxuaW1wb3J0IHtpbWFnZURhdGFGb3JtYXR9IGZyb20gJy4uL2JhY2tlbmQvY29tbW9uJztcbmltcG9ydCB7SW5wdXRTcGVjLCBMYXllciwgTGF5ZXJBcmdzfSBmcm9tICcuLi9lbmdpbmUvdG9wb2xvZ3knO1xuaW1wb3J0IHtWYWx1ZUVycm9yfSBmcm9tICcuLi9lcnJvcnMnO1xuaW1wb3J0IHtEYXRhRm9ybWF0LCBTaGFwZX0gZnJvbSAnLi4va2VyYXNfZm9ybWF0L2NvbW1vbic7XG5pbXBvcnQge0t3YXJnc30gZnJvbSAnLi4vdHlwZXMnO1xuaW1wb3J0IHtnZXRFeGFjdGx5T25lU2hhcGUsIGdldEV4YWN0bHlPbmVUZW5zb3J9IGZyb20gJy4uL3V0aWxzL3R5cGVzX3V0aWxzJztcblxuLyoqXG4gKiBQYWRzIHRoZSBtaWRkbGUgZGltZW5zaW9uIG9mIGEgM0QgdGVuc29yLlxuICpcbiAqIEBwYXJhbSB4IElucHV0IGB0Zi5UZW5zb3JgIHRvIGJlIHBhZGRlZC5cbiAqIEBwYXJhbSBwYWRkaW5nIGBBcnJheWAgb2YgMiBpbnRlZ2VycywgaG93IG1hbnkgemVyb3MgdG8gYWRkIGF0IHRoZSBzdGFydCBhbmRcbiAqICAgZW5kIG9mIHRoZSBtaWRkbGUgZGltZW5zaW9uIChpLmUuLCBkaW1lbnNpb24gMSkuXG4gKiBAcmV0dXJuIEEgcGFkZGVkIDNEIGB0Zi5UZW5zb3JgLlxuICovXG5leHBvcnQgZnVuY3Rpb24gdGVtcG9yYWxQYWRkaW5nKHg6IFRlbnNvciwgcGFkZGluZz86IFtudW1iZXIsIG51bWJlcl0pOiBUZW5zb3Ige1xuICByZXR1cm4gdGlkeSgoKSA9PiB7XG4gICAgaWYgKHgucmFuayAhPT0gMykge1xuICAgICAgdGhyb3cgbmV3IFZhbHVlRXJyb3IoXG4gICAgICAgICAgYHRlbXBvcmFsUGFkZGluZyBleHBlY3RzIGlucHV0IHRlbnNvciB0byBiZSAzLUQsIGJ1dCByZWNlaXZlZCBhIGAgK1xuICAgICAgICAgIGAke3gucmFua30tRCB0ZW5zb3IuYCk7XG4gICAgfVxuXG4gICAgaWYgKHBhZGRpbmcgPT0gbnVsbCkge1xuICAgICAgcGFkZGluZyA9IFsxLCAxXTtcbiAgICB9XG4gICAgaWYgKHBhZGRpbmcubGVuZ3RoICE9PSAyKSB7XG4gICAgICB0aHJvdyBuZXcgVmFsdWVFcnJvcihcbiAgICAgICAgICBgdGVtcG9yYWxQYWRkaW5nIGV4cGVjdHMgaW5wdXQgcGFkZGluZyBwYXR0ZXJuIHRvIGJlIGEgbGVuZ3RoLTIgYCArXG4gICAgICAgICAgYGFycmF5LCBidXQgcmVjZWl2ZWQgYSBsZW5ndGgtJHtwYWRkaW5nLmxlbmd0aH0gYXJyYXkuYCk7XG4gICAgfVxuXG4gICAgY29uc3QgcGF0dGVybjogQXJyYXk8W251bWJlciwgbnVtYmVyXT4gPSBbWzAsIDBdLCBwYWRkaW5nLCBbMCwgMF1dO1xuICAgIHJldHVybiB0ZmMucGFkKHgsIHBhdHRlcm4pO1xuICB9KTtcbn1cblxuLyoqXG4gKiBQYWRzIHRoZSAybmQgYW5kIDNyZCBkaW1lbnNpb25zIG9mIGEgNEQgdGVuc29yLlxuICpcbiAqIEBwYXJhbSB4IElucHV0IGB0Zi5UZW5zb3JgIHRvIGJlIHBhZGRlZC5cbiAqIEBwYXJhbSBwYWRkaW5nIGBBcnJheWAgb2YgdHdvIGBBcnJheWBzLCBlYWNoIG9mIHdoaWNoIGlzIGFuIGBBcnJheWAgb2YgdHdvXG4gKiAgIGludGVnZXJzLiBUaGUgYW1vdW50IG9mIHBhZGRpbmcgYXQgdGhlIGJlZ2lubmluZyBhbmQgZW5kIG9mIHRoZSAybmQgYW5kIDNyZFxuICogICBkaW1lbnNpb25zLCByZXNwZWN0aXZlbHkuXG4gKiBAcGFyYW0gZGF0YUZvcm1hdCAnY2hhbm5lbHNMYXN0JyAoZGVmYXVsdCkgb3IgJ2NoYW5uZWxzRmlyc3QnLlxuICogQHJldHVybiBQYWRkZWQgNEQgYHRmLlRlbnNvcmAuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBzcGF0aWFsMmRQYWRkaW5nKFxuICAgIHg6IFRlbnNvciwgcGFkZGluZz86IFtbbnVtYmVyLCBudW1iZXJdLCBbbnVtYmVyLCBudW1iZXJdXSxcbiAgICBkYXRhRm9ybWF0PzogRGF0YUZvcm1hdCk6IFRlbnNvciB7XG4gIHJldHVybiB0aWR5KCgpID0+IHtcbiAgICBpZiAoeC5yYW5rICE9PSA0KSB7XG4gICAgICB0aHJvdyBuZXcgVmFsdWVFcnJvcihcbiAgICAgICAgICBgdGVtcG9yYWxQYWRkaW5nIGV4cGVjdHMgaW5wdXQgdGVuc29yIHRvIGJlIDQtRCwgYnV0IHJlY2VpdmVkIGEgYCArXG4gICAgICAgICAgYCR7eC5yYW5rfS1EIHRlbnNvci5gKTtcbiAgICB9XG5cbiAgICBpZiAocGFkZGluZyA9PSBudWxsKSB7XG4gICAgICBwYWRkaW5nID0gW1sxLCAxXSwgWzEsIDFdXTtcbiAgICB9XG4gICAgaWYgKHBhZGRpbmcubGVuZ3RoICE9PSAyIHx8IHBhZGRpbmdbMF0ubGVuZ3RoICE9PSAyIHx8XG4gICAgICAgIHBhZGRpbmdbMV0ubGVuZ3RoICE9PSAyKSB7XG4gICAgICB0aHJvdyBuZXcgVmFsdWVFcnJvcihcbiAgICAgICAgICAnc3BhdGlhbDJkUGFkZGluZyBleHBlY3RzIGBwYWRkaW5nYCB0byBiZSBhbiBBcnJheSBvZiB0d28gQXJyYXlzLCAnICtcbiAgICAgICAgICAnZWFjaCBvZiB3aGljaCBpcyBhbiBBcnJheSBvZiB0d28gaW50ZWdlcnMuJyk7XG4gICAgfVxuXG4gICAgaWYgKGRhdGFGb3JtYXQgPT0gbnVsbCkge1xuICAgICAgZGF0YUZvcm1hdCA9IGltYWdlRGF0YUZvcm1hdCgpO1xuICAgIH1cbiAgICBpZiAoZGF0YUZvcm1hdCAhPT0gJ2NoYW5uZWxzTGFzdCcgJiYgZGF0YUZvcm1hdCAhPT0gJ2NoYW5uZWxzRmlyc3QnKSB7XG4gICAgICB0aHJvdyBuZXcgVmFsdWVFcnJvcihcbiAgICAgICAgICBgVW5rbm93biBkYXRhIGZvcm1hdDogJHtkYXRhRm9ybWF0fS4gYCArXG4gICAgICAgICAgYFN1cHBvcnRlZCBkYXRhIGZvcm1hdHMgYXJlICdjaGFubmVsc0xhc3QnIGFuZCAnY2hhbm5lbHNGaXJzdC5gKTtcbiAgICB9XG5cbiAgICBsZXQgcGF0dGVybjogQXJyYXk8W251bWJlciwgbnVtYmVyXT47XG4gICAgaWYgKGRhdGFGb3JtYXQgPT09ICdjaGFubmVsc0ZpcnN0Jykge1xuICAgICAgcGF0dGVybiA9IFtbMCwgMF0sIFswLCAwXSwgcGFkZGluZ1swXSwgcGFkZGluZ1sxXV07XG4gICAgfSBlbHNlIHtcbiAgICAgIHBhdHRlcm4gPSBbWzAsIDBdLCBwYWRkaW5nWzBdLCBwYWRkaW5nWzFdLCBbMCwgMF1dO1xuICAgIH1cblxuICAgIHJldHVybiB0ZmMucGFkKHgsIHBhdHRlcm4pO1xuICB9KTtcbn1cblxuZXhwb3J0IGRlY2xhcmUgaW50ZXJmYWNlIFplcm9QYWRkaW5nMkRMYXllckFyZ3MgZXh0ZW5kcyBMYXllckFyZ3Mge1xuICAvKipcbiAgICogSW50ZWdlciwgb3IgYEFycmF5YCBvZiAyIGludGVnZXJzLCBvciBgQXJyYXlgIG9mIDIgYEFycmF5YHMsIGVhY2ggb2ZcbiAgICogd2hpY2ggaXMgYW4gYEFycmF5YCBvZiAyIGludGVnZXJzLlxuICAgKiAtIElmIGludGVnZXIsIHRoZSBzYW1lIHN5bW1ldHJpYyBwYWRkaW5nIGlzIGFwcGxpZWQgdG8gd2lkdGggYW5kIGhlaWdodC5cbiAgICogLSBJZiBgQXJyYXlgIG9mIDIgaW50ZWdlcnMsIGludGVycHJldGVkIGFzIHR3byBkaWZmZXJlbnQgc3ltbWV0cmljIHZhbHVlc1xuICAgKiAgIGZvciBoZWlnaHQgYW5kIHdpZHRoOlxuICAgKiAgIGBbc3ltbWV0cmljSGVpZ2h0UGFkLCBzeW1tZXRyaWNXaWR0aFBhZF1gLlxuICAgKiAtIElmIGBBcnJheWAgb2YgMiBgQXJyYXlgcywgaW50ZXJwcmV0ZWQgYXM6XG4gICAqICAgYFtbdG9wUGFkLCBib3R0b21QYWRdLCBbbGVmdFBhZCwgcmlnaHRQYWRdXWAuXG4gICAqL1xuICBwYWRkaW5nPzogbnVtYmVyfFtudW1iZXIsIG51bWJlcl18W1tudW1iZXIsIG51bWJlcl0sIFtudW1iZXIsIG51bWJlcl1dO1xuXG4gIC8qKlxuICAgKiBPbmUgb2YgYCdjaGFubmVsc0xhc3QnYCAoZGVmYXVsdCkgYW5kIGAnY2hhbm5lbHNGaXJzdCdgLlxuICAgKlxuICAgKiBUaGUgb3JkZXJpbmcgb2YgdGhlIGRpbWVuc2lvbnMgaW4gdGhlIGlucHV0cy5cbiAgICogYGNoYW5uZWxzTGFzdGAgY29ycmVzcG9uZHMgdG8gaW5wdXRzIHdpdGggc2hhcGVcbiAgICogYFtiYXRjaCwgaGVpZ2h0LCB3aWR0aCwgY2hhbm5lbHNdYCB3aGlsZSBgY2hhbm5lbHNGaXJzdGBcbiAgICogY29ycmVzcG9uZHMgdG8gaW5wdXRzIHdpdGggc2hhcGVcbiAgICogYFtiYXRjaCwgY2hhbm5lbHMsIGhlaWdodCwgd2lkdGhdYC5cbiAgICovXG4gIGRhdGFGb3JtYXQ/OiBEYXRhRm9ybWF0O1xufVxuXG5leHBvcnQgY2xhc3MgWmVyb1BhZGRpbmcyRCBleHRlbmRzIExheWVyIHtcbiAgLyoqIEBub2NvbGxhcHNlICovXG4gIHN0YXRpYyBjbGFzc05hbWUgPSAnWmVyb1BhZGRpbmcyRCc7XG4gIHJlYWRvbmx5IGRhdGFGb3JtYXQ6IERhdGFGb3JtYXQ7XG4gIHJlYWRvbmx5IHBhZGRpbmc6IFtbbnVtYmVyLCBudW1iZXJdLCBbbnVtYmVyLCBudW1iZXJdXTtcblxuICBjb25zdHJ1Y3RvcihhcmdzPzogWmVyb1BhZGRpbmcyRExheWVyQXJncykge1xuICAgIGlmIChhcmdzID09IG51bGwpIHtcbiAgICAgIGFyZ3MgPSB7fTtcbiAgICB9XG4gICAgc3VwZXIoYXJncyk7XG5cbiAgICB0aGlzLmRhdGFGb3JtYXQgPVxuICAgICAgICBhcmdzLmRhdGFGb3JtYXQgPT0gbnVsbCA/IGltYWdlRGF0YUZvcm1hdCgpIDogYXJncy5kYXRhRm9ybWF0O1xuICAgIC8vIFRPRE8oY2Fpcyk6IE1heWJlIHJlZmFjdG9yIHRoZSBmb2xsb3dpbmcgbG9naWMgc3Vycm91bmRpbmcgYHBhZGRpbmdgXG4gICAgLy8gICBpbnRvIGEgaGVscGVyIG1ldGhvZC5cbiAgICBpZiAoYXJncy5wYWRkaW5nID09IG51bGwpIHtcbiAgICAgIHRoaXMucGFkZGluZyA9IFtbMSwgMV0sIFsxLCAxXV07XG4gICAgfSBlbHNlIGlmICh0eXBlb2YgYXJncy5wYWRkaW5nID09PSAnbnVtYmVyJykge1xuICAgICAgdGhpcy5wYWRkaW5nID1cbiAgICAgICAgICBbW2FyZ3MucGFkZGluZywgYXJncy5wYWRkaW5nXSwgW2FyZ3MucGFkZGluZywgYXJncy5wYWRkaW5nXV07XG4gICAgfSBlbHNlIHtcbiAgICAgIGFyZ3MucGFkZGluZyA9IGFyZ3MucGFkZGluZztcbiAgICAgIGlmIChhcmdzLnBhZGRpbmcubGVuZ3RoICE9PSAyKSB7XG4gICAgICAgIHRocm93IG5ldyBWYWx1ZUVycm9yKFxuICAgICAgICAgICAgYFplcm9QYWRkaW5nMkQgZXhwZWN0cyBwYWRkaW5nIHRvIGJlIGEgbGVuZ3RoLTIgYXJyYXksIGJ1dCBgICtcbiAgICAgICAgICAgIGByZWNlaXZlZCBhIGxlbmd0aC0ke2FyZ3MucGFkZGluZy5sZW5ndGh9IGFycmF5LmApO1xuICAgICAgfVxuXG4gICAgICBsZXQgaGVpZ2h0UGFkZGluZzogW251bWJlciwgbnVtYmVyXTtcbiAgICAgIGxldCB3aWR0aFBhZGRpbmc6IFtudW1iZXIsIG51bWJlcl07XG4gICAgICBpZiAodHlwZW9mIGFyZ3MucGFkZGluZ1swXSA9PT0gJ251bWJlcicpIHtcbiAgICAgICAgaGVpZ2h0UGFkZGluZyA9IFthcmdzLnBhZGRpbmdbMF0sIGFyZ3MucGFkZGluZ1swXV07XG4gICAgICAgIHdpZHRoUGFkZGluZyA9IFthcmdzLnBhZGRpbmdbMV0gYXMgbnVtYmVyLCBhcmdzLnBhZGRpbmdbMV0gYXMgbnVtYmVyXTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIGFyZ3MucGFkZGluZyA9IGFyZ3MucGFkZGluZyBhcyBbW251bWJlciwgbnVtYmVyXSwgW251bWJlciwgbnVtYmVyXV07XG5cbiAgICAgICAgaWYgKGFyZ3MucGFkZGluZ1swXS5sZW5ndGggIT09IDIpIHtcbiAgICAgICAgICB0aHJvdyBuZXcgVmFsdWVFcnJvcihcbiAgICAgICAgICAgICAgYFplcm9QYWRkaW5nMkQgZXhwZWN0cyBoZWlnaHQgcGFkZGluZyB0byBiZSBhIGxlbmd0aC0yIGFycmF5LCBgICtcbiAgICAgICAgICAgICAgYGJ1dCByZWNlaXZlZCBhIGxlbmd0aC0ke2FyZ3MucGFkZGluZ1swXS5sZW5ndGh9IGFycmF5LmApO1xuICAgICAgICB9XG4gICAgICAgIGhlaWdodFBhZGRpbmcgPSBhcmdzLnBhZGRpbmdbMF0gYXMgW251bWJlciwgbnVtYmVyXTtcblxuICAgICAgICBpZiAoYXJncy5wYWRkaW5nWzFdLmxlbmd0aCAhPT0gMikge1xuICAgICAgICAgIHRocm93IG5ldyBWYWx1ZUVycm9yKFxuICAgICAgICAgICAgICBgWmVyb1BhZGRpbmcyRCBleHBlY3RzIHdpZHRoIHBhZGRpbmcgdG8gYmUgYSBsZW5ndGgtMiBhcnJheSwgYCArXG4gICAgICAgICAgICAgIGBidXQgcmVjZWl2ZWQgYSBsZW5ndGgtJHthcmdzLnBhZGRpbmdbMV0ubGVuZ3RofSBhcnJheS5gKTtcbiAgICAgICAgfVxuICAgICAgICB3aWR0aFBhZGRpbmcgPSBhcmdzLnBhZGRpbmdbMV0gYXMgW251bWJlciwgbnVtYmVyXTtcbiAgICAgIH1cbiAgICAgIHRoaXMucGFkZGluZyA9IFtoZWlnaHRQYWRkaW5nLCB3aWR0aFBhZGRpbmddO1xuICAgIH1cbiAgICB0aGlzLmlucHV0U3BlYyA9IFtuZXcgSW5wdXRTcGVjKHtuZGltOiA0fSldO1xuICB9XG5cbiAgY29tcHV0ZU91dHB1dFNoYXBlKGlucHV0U2hhcGU6IFNoYXBlfFNoYXBlW10pOiBTaGFwZXxTaGFwZVtdIHtcbiAgICBpbnB1dFNoYXBlID0gZ2V0RXhhY3RseU9uZVNoYXBlKGlucHV0U2hhcGUpO1xuXG4gICAgbGV0IHJvd3M6IG51bWJlcjtcbiAgICBsZXQgY29sczogbnVtYmVyO1xuICAgIGlmICh0aGlzLmRhdGFGb3JtYXQgPT09ICdjaGFubmVsc0ZpcnN0Jykge1xuICAgICAgaWYgKGlucHV0U2hhcGVbMl0gIT0gbnVsbCAmJiBpbnB1dFNoYXBlWzJdID49IDApIHtcbiAgICAgICAgcm93cyA9IGlucHV0U2hhcGVbMl0gKyB0aGlzLnBhZGRpbmdbMF1bMF0gKyB0aGlzLnBhZGRpbmdbMF1bMV07XG4gICAgICB9IGVsc2Uge1xuICAgICAgICByb3dzID0gbnVsbDtcbiAgICAgIH1cbiAgICAgIGlmIChpbnB1dFNoYXBlWzNdICE9IG51bGwgJiYgaW5wdXRTaGFwZVszXSA+PSAwKSB7XG4gICAgICAgIGNvbHMgPSBpbnB1dFNoYXBlWzNdICsgdGhpcy5wYWRkaW5nWzFdWzBdICsgdGhpcy5wYWRkaW5nWzFdWzFdO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgY29scyA9IG51bGw7XG4gICAgICB9XG4gICAgICByZXR1cm4gW2lucHV0U2hhcGVbMF0sIGlucHV0U2hhcGVbMV0sIHJvd3MsIGNvbHNdO1xuICAgIH0gZWxzZSB7XG4gICAgICBpZiAoaW5wdXRTaGFwZVsxXSAhPSBudWxsICYmIGlucHV0U2hhcGVbMV0gPj0gMCkge1xuICAgICAgICByb3dzID0gaW5wdXRTaGFwZVsxXSArIHRoaXMucGFkZGluZ1swXVswXSArIHRoaXMucGFkZGluZ1swXVsxXTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHJvd3MgPSBudWxsO1xuICAgICAgfVxuICAgICAgaWYgKGlucHV0U2hhcGVbMl0gIT0gbnVsbCAmJiBpbnB1dFNoYXBlWzJdID49IDApIHtcbiAgICAgICAgY29scyA9IGlucHV0U2hhcGVbMl0gKyB0aGlzLnBhZGRpbmdbMV1bMF0gKyB0aGlzLnBhZGRpbmdbMV1bMV07XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBjb2xzID0gbnVsbDtcbiAgICAgIH1cbiAgICAgIHJldHVybiBbaW5wdXRTaGFwZVswXSwgcm93cywgY29scywgaW5wdXRTaGFwZVszXV07XG4gICAgfVxuICB9XG5cbiAgY2FsbChpbnB1dHM6IFRlbnNvcnxUZW5zb3JbXSwga3dhcmdzOiBLd2FyZ3MpOiBUZW5zb3J8VGVuc29yW10ge1xuICAgIHJldHVybiB0aWR5KFxuICAgICAgICAoKSA9PiBzcGF0aWFsMmRQYWRkaW5nKFxuICAgICAgICAgICAgZ2V0RXhhY3RseU9uZVRlbnNvcihpbnB1dHMpLCB0aGlzLnBhZGRpbmcsIHRoaXMuZGF0YUZvcm1hdCkpO1xuICB9XG5cbiAgZ2V0Q29uZmlnKCk6IHNlcmlhbGl6YXRpb24uQ29uZmlnRGljdCB7XG4gICAgY29uc3QgY29uZmlnOiBzZXJpYWxpemF0aW9uLkNvbmZpZ0RpY3QgPSB7XG4gICAgICBwYWRkaW5nOiB0aGlzLnBhZGRpbmcsXG4gICAgICBkYXRhRm9ybWF0OiB0aGlzLmRhdGFGb3JtYXQsXG4gICAgfTtcbiAgICBjb25zdCBiYXNlQ29uZmlnID0gc3VwZXIuZ2V0Q29uZmlnKCk7XG4gICAgT2JqZWN0LmFzc2lnbihjb25maWcsIGJhc2VDb25maWcpO1xuICAgIHJldHVybiBjb25maWc7XG4gIH1cbn1cbnNlcmlhbGl6YXRpb24ucmVnaXN0ZXJDbGFzcyhaZXJvUGFkZGluZzJEKTtcbiJdfQ==","/**\n * @license\n * Copyright 2018 Google LLC\n *\n * Use of this source code is governed by an MIT-style\n * license that can be found in the LICENSE file or at\n * https://opensource.org/licenses/MIT.\n * =============================================================================\n */\n/**\n * TensorFlow.js Layers: Pooling Layers.\n */\nimport * as tfc from '@tensorflow/tfjs-core';\nimport { serialization, tidy } from '@tensorflow/tfjs-core';\nimport { imageDataFormat } from '../backend/common';\nimport * as K from '../backend/tfjs_backend';\nimport { checkDataFormat, checkPaddingMode, checkPoolMode } from '../common';\nimport { InputSpec } from '../engine/topology';\nimport { Layer } from '../engine/topology';\nimport { NotImplementedError, ValueError } from '../errors';\nimport { convOutputLength } from '../utils/conv_utils';\nimport { assertPositiveInteger } from '../utils/generic_utils';\nimport { getExactlyOneShape, getExactlyOneTensor } from '../utils/types_utils';\nimport { preprocessConv2DInput, preprocessConv3DInput } from './convolutional';\n/**\n * 2D pooling.\n * @param x\n * @param poolSize\n * @param stridesdes strides. Defaults to [1, 1].\n * @param padding padding. Defaults to 'valid'.\n * @param dataFormat data format. Defaults to 'channelsLast'.\n * @param poolMode Mode of pooling. Defaults to 'max'.\n * @returns Result of the 2D pooling.\n */\nexport function pool2d(x, poolSize, strides, padding, dataFormat, poolMode) {\n return tidy(() => {\n checkDataFormat(dataFormat);\n checkPoolMode(poolMode);\n checkPaddingMode(padding);\n if (strides == null) {\n strides = [1, 1];\n }\n if (padding == null) {\n padding = 'valid';\n }\n if (dataFormat == null) {\n dataFormat = imageDataFormat();\n }\n if (poolMode == null) {\n poolMode = 'max';\n }\n // TODO(cais): Remove the preprocessing step once deeplearn.js supports\n // dataFormat as an input argument.\n x = preprocessConv2DInput(x, dataFormat); // x is NHWC after preprocessing.\n let y;\n const paddingString = (padding === 'same') ? 'same' : 'valid';\n if (poolMode === 'max') {\n // TODO(cais): Rank check?\n y = tfc.maxPool(x, poolSize, strides, paddingString);\n }\n else { // 'avg'\n // TODO(cais): Check the dtype and rank of x and give clear error message\n // if those are incorrect.\n y = tfc.avgPool(\n // TODO(cais): Rank check?\n x, poolSize, strides, paddingString);\n }\n if (dataFormat === 'channelsFirst') {\n y = tfc.transpose(y, [0, 3, 1, 2]); // NHWC -> NCHW.\n }\n return y;\n });\n}\n/**\n * 3D pooling.\n * @param x\n * @param poolSize. Default to [1, 1, 1].\n * @param strides strides. Defaults to [1, 1, 1].\n * @param padding padding. Defaults to 'valid'.\n * @param dataFormat data format. Defaults to 'channelsLast'.\n * @param poolMode Mode of pooling. Defaults to 'max'.\n * @returns Result of the 3D pooling.\n */\nexport function pool3d(x, poolSize, strides, padding, dataFormat, poolMode) {\n return tidy(() => {\n checkDataFormat(dataFormat);\n checkPoolMode(poolMode);\n checkPaddingMode(padding);\n if (strides == null) {\n strides = [1, 1, 1];\n }\n if (padding == null) {\n padding = 'valid';\n }\n if (dataFormat == null) {\n dataFormat = imageDataFormat();\n }\n if (poolMode == null) {\n poolMode = 'max';\n }\n // x is NDHWC after preprocessing.\n x = preprocessConv3DInput(x, dataFormat);\n let y;\n const paddingString = (padding === 'same') ? 'same' : 'valid';\n if (poolMode === 'max') {\n y = tfc.maxPool3d(x, poolSize, strides, paddingString);\n }\n else { // 'avg'\n y = tfc.avgPool3d(x, poolSize, strides, paddingString);\n }\n if (dataFormat === 'channelsFirst') {\n y = tfc.transpose(y, [0, 4, 1, 2, 3]); // NDHWC -> NCDHW.\n }\n return y;\n });\n}\n/**\n * Abstract class for different pooling 1D layers.\n */\nexport class Pooling1D extends Layer {\n /**\n *\n * @param args Parameters for the Pooling layer.\n *\n * config.poolSize defaults to 2.\n */\n constructor(args) {\n if (args.poolSize == null) {\n args.poolSize = 2;\n }\n super(args);\n if (typeof args.poolSize === 'number') {\n this.poolSize = [args.poolSize];\n }\n else if (Array.isArray(args.poolSize) &&\n args.poolSize.length === 1 &&\n typeof args.poolSize[0] === 'number') {\n this.poolSize = args.poolSize;\n }\n else {\n throw new ValueError(`poolSize for 1D convolutional layer must be a number or an ` +\n `Array of a single number, but received ` +\n `${JSON.stringify(args.poolSize)}`);\n }\n assertPositiveInteger(this.poolSize, 'poolSize');\n if (args.strides == null) {\n this.strides = this.poolSize;\n }\n else {\n if (typeof args.strides === 'number') {\n this.strides = [args.strides];\n }\n else if (Array.isArray(args.strides) &&\n args.strides.length === 1 &&\n typeof args.strides[0] === 'number') {\n this.strides = args.strides;\n }\n else {\n throw new ValueError(`strides for 1D convolutional layer must be a number or an ` +\n `Array of a single number, but received ` +\n `${JSON.stringify(args.strides)}`);\n }\n }\n assertPositiveInteger(this.strides, 'strides');\n this.padding = args.padding == null ? 'valid' : args.padding;\n checkPaddingMode(this.padding);\n this.inputSpec = [new InputSpec({ ndim: 3 })];\n }\n computeOutputShape(inputShape) {\n inputShape = getExactlyOneShape(inputShape);\n const length = convOutputLength(inputShape[1], this.poolSize[0], this.padding, this.strides[0]);\n return [inputShape[0], length, inputShape[2]];\n }\n call(inputs, kwargs) {\n return tidy(() => {\n this.invokeCallHook(inputs, kwargs);\n // Add dummy last dimension.\n inputs = K.expandDims(getExactlyOneTensor(inputs), 2);\n const output = this.poolingFunction(getExactlyOneTensor(inputs), [this.poolSize[0], 1], [this.strides[0], 1], this.padding, 'channelsLast');\n // Remove dummy last dimension.\n return tfc.squeeze(output, [2]);\n });\n }\n getConfig() {\n const config = {\n poolSize: this.poolSize,\n padding: this.padding,\n strides: this.strides,\n };\n const baseConfig = super.getConfig();\n Object.assign(config, baseConfig);\n return config;\n }\n}\nexport class MaxPooling1D extends Pooling1D {\n constructor(args) {\n super(args);\n }\n poolingFunction(inputs, poolSize, strides, padding, dataFormat) {\n checkDataFormat(dataFormat);\n checkPaddingMode(padding);\n return pool2d(inputs, poolSize, strides, padding, dataFormat, 'max');\n }\n}\n/** @nocollapse */\nMaxPooling1D.className = 'MaxPooling1D';\nserialization.registerClass(MaxPooling1D);\nexport class AveragePooling1D extends Pooling1D {\n constructor(args) {\n super(args);\n }\n poolingFunction(inputs, poolSize, strides, padding, dataFormat) {\n checkDataFormat(dataFormat);\n checkPaddingMode(padding);\n return pool2d(inputs, poolSize, strides, padding, dataFormat, 'avg');\n }\n}\n/** @nocollapse */\nAveragePooling1D.className = 'AveragePooling1D';\nserialization.registerClass(AveragePooling1D);\n/**\n * Abstract class for different pooling 2D layers.\n */\nexport class Pooling2D extends Layer {\n constructor(args) {\n if (args.poolSize == null) {\n args.poolSize = [2, 2];\n }\n super(args);\n this.poolSize = Array.isArray(args.poolSize) ?\n args.poolSize :\n [args.poolSize, args.poolSize];\n if (args.strides == null) {\n this.strides = this.poolSize;\n }\n else if (Array.isArray(args.strides)) {\n if (args.strides.length !== 2) {\n throw new ValueError(`If the strides property of a 2D pooling layer is an Array, ` +\n `it is expected to have a length of 2, but received length ` +\n `${args.strides.length}.`);\n }\n this.strides = args.strides;\n }\n else {\n // `config.strides` is a number.\n this.strides = [args.strides, args.strides];\n }\n assertPositiveInteger(this.poolSize, 'poolSize');\n assertPositiveInteger(this.strides, 'strides');\n this.padding = args.padding == null ? 'valid' : args.padding;\n this.dataFormat =\n args.dataFormat == null ? 'channelsLast' : args.dataFormat;\n checkDataFormat(this.dataFormat);\n checkPaddingMode(this.padding);\n this.inputSpec = [new InputSpec({ ndim: 4 })];\n }\n computeOutputShape(inputShape) {\n inputShape = getExactlyOneShape(inputShape);\n let rows = this.dataFormat === 'channelsFirst' ? inputShape[2] : inputShape[1];\n let cols = this.dataFormat === 'channelsFirst' ? inputShape[3] : inputShape[2];\n rows =\n convOutputLength(rows, this.poolSize[0], this.padding, this.strides[0]);\n cols =\n convOutputLength(cols, this.poolSize[1], this.padding, this.strides[1]);\n if (this.dataFormat === 'channelsFirst') {\n return [inputShape[0], inputShape[1], rows, cols];\n }\n else {\n return [inputShape[0], rows, cols, inputShape[3]];\n }\n }\n call(inputs, kwargs) {\n return tidy(() => {\n this.invokeCallHook(inputs, kwargs);\n return this.poolingFunction(getExactlyOneTensor(inputs), this.poolSize, this.strides, this.padding, this.dataFormat);\n });\n }\n getConfig() {\n const config = {\n poolSize: this.poolSize,\n padding: this.padding,\n strides: this.strides,\n dataFormat: this.dataFormat\n };\n const baseConfig = super.getConfig();\n Object.assign(config, baseConfig);\n return config;\n }\n}\nexport class MaxPooling2D extends Pooling2D {\n constructor(args) {\n super(args);\n }\n poolingFunction(inputs, poolSize, strides, padding, dataFormat) {\n checkDataFormat(dataFormat);\n checkPaddingMode(padding);\n return pool2d(inputs, poolSize, strides, padding, dataFormat, 'max');\n }\n}\n/** @nocollapse */\nMaxPooling2D.className = 'MaxPooling2D';\nserialization.registerClass(MaxPooling2D);\nexport class AveragePooling2D extends Pooling2D {\n constructor(args) {\n super(args);\n }\n poolingFunction(inputs, poolSize, strides, padding, dataFormat) {\n checkDataFormat(dataFormat);\n checkPaddingMode(padding);\n return pool2d(inputs, poolSize, strides, padding, dataFormat, 'avg');\n }\n}\n/** @nocollapse */\nAveragePooling2D.className = 'AveragePooling2D';\nserialization.registerClass(AveragePooling2D);\n/**\n * Abstract class for different pooling 3D layers.\n */\nexport class Pooling3D extends Layer {\n constructor(args) {\n if (args.poolSize == null) {\n args.poolSize = [2, 2, 2];\n }\n super(args);\n this.poolSize = Array.isArray(args.poolSize) ?\n args.poolSize :\n [args.poolSize, args.poolSize, args.poolSize];\n if (args.strides == null) {\n this.strides = this.poolSize;\n }\n else if (Array.isArray(args.strides)) {\n if (args.strides.length !== 3) {\n throw new ValueError(`If the strides property of a 3D pooling layer is an Array, ` +\n `it is expected to have a length of 3, but received length ` +\n `${args.strides.length}.`);\n }\n this.strides = args.strides;\n }\n else {\n // `config.strides` is a number.\n this.strides = [args.strides, args.strides, args.strides];\n }\n assertPositiveInteger(this.poolSize, 'poolSize');\n assertPositiveInteger(this.strides, 'strides');\n this.padding = args.padding == null ? 'valid' : args.padding;\n this.dataFormat =\n args.dataFormat == null ? 'channelsLast' : args.dataFormat;\n checkDataFormat(this.dataFormat);\n checkPaddingMode(this.padding);\n this.inputSpec = [new InputSpec({ ndim: 5 })];\n }\n computeOutputShape(inputShape) {\n inputShape = getExactlyOneShape(inputShape);\n let depths = this.dataFormat === 'channelsFirst' ? inputShape[2] : inputShape[1];\n let rows = this.dataFormat === 'channelsFirst' ? inputShape[3] : inputShape[2];\n let cols = this.dataFormat === 'channelsFirst' ? inputShape[4] : inputShape[3];\n depths = convOutputLength(depths, this.poolSize[0], this.padding, this.strides[0]);\n rows =\n convOutputLength(rows, this.poolSize[1], this.padding, this.strides[1]);\n cols =\n convOutputLength(cols, this.poolSize[2], this.padding, this.strides[2]);\n if (this.dataFormat === 'channelsFirst') {\n return [inputShape[0], inputShape[1], depths, rows, cols];\n }\n else {\n return [inputShape[0], depths, rows, cols, inputShape[4]];\n }\n }\n call(inputs, kwargs) {\n return tidy(() => {\n this.invokeCallHook(inputs, kwargs);\n return this.poolingFunction(getExactlyOneTensor(inputs), this.poolSize, this.strides, this.padding, this.dataFormat);\n });\n }\n getConfig() {\n const config = {\n poolSize: this.poolSize,\n padding: this.padding,\n strides: this.strides,\n dataFormat: this.dataFormat\n };\n const baseConfig = super.getConfig();\n Object.assign(config, baseConfig);\n return config;\n }\n}\nexport class MaxPooling3D extends Pooling3D {\n constructor(args) {\n super(args);\n }\n poolingFunction(inputs, poolSize, strides, padding, dataFormat) {\n checkDataFormat(dataFormat);\n checkPaddingMode(padding);\n return pool3d(inputs, poolSize, strides, padding, dataFormat, 'max');\n }\n}\n/** @nocollapse */\nMaxPooling3D.className = 'MaxPooling3D';\nserialization.registerClass(MaxPooling3D);\nexport class AveragePooling3D extends Pooling3D {\n constructor(args) {\n super(args);\n }\n poolingFunction(inputs, poolSize, strides, padding, dataFormat) {\n checkDataFormat(dataFormat);\n checkPaddingMode(padding);\n return pool3d(inputs, poolSize, strides, padding, dataFormat, 'avg');\n }\n}\n/** @nocollapse */\nAveragePooling3D.className = 'AveragePooling3D';\nserialization.registerClass(AveragePooling3D);\n/**\n * Abstract class for different global pooling 1D layers.\n */\nexport class GlobalPooling1D extends Layer {\n constructor(args) {\n super(args);\n this.inputSpec = [new InputSpec({ ndim: 3 })];\n }\n computeOutputShape(inputShape) {\n return [inputShape[0], inputShape[2]];\n }\n call(inputs, kwargs) {\n throw new NotImplementedError();\n }\n}\nexport class GlobalAveragePooling1D extends GlobalPooling1D {\n constructor(args) {\n super(args || {});\n }\n call(inputs, kwargs) {\n return tidy(() => {\n const input = getExactlyOneTensor(inputs);\n return tfc.mean(input, 1);\n });\n }\n}\n/** @nocollapse */\nGlobalAveragePooling1D.className = 'GlobalAveragePooling1D';\nserialization.registerClass(GlobalAveragePooling1D);\nexport class GlobalMaxPooling1D extends GlobalPooling1D {\n constructor(args) {\n super(args || {});\n }\n call(inputs, kwargs) {\n return tidy(() => {\n const input = getExactlyOneTensor(inputs);\n return tfc.max(input, 1);\n });\n }\n}\n/** @nocollapse */\nGlobalMaxPooling1D.className = 'GlobalMaxPooling1D';\nserialization.registerClass(GlobalMaxPooling1D);\n/**\n * Abstract class for different global pooling 2D layers.\n */\nexport class GlobalPooling2D extends Layer {\n constructor(args) {\n super(args);\n this.dataFormat =\n args.dataFormat == null ? 'channelsLast' : args.dataFormat;\n checkDataFormat(this.dataFormat);\n this.inputSpec = [new InputSpec({ ndim: 4 })];\n }\n computeOutputShape(inputShape) {\n inputShape = inputShape;\n if (this.dataFormat === 'channelsLast') {\n return [inputShape[0], inputShape[3]];\n }\n else {\n return [inputShape[0], inputShape[1]];\n }\n }\n call(inputs, kwargs) {\n throw new NotImplementedError();\n }\n getConfig() {\n const config = { dataFormat: this.dataFormat };\n const baseConfig = super.getConfig();\n Object.assign(config, baseConfig);\n return config;\n }\n}\nexport class GlobalAveragePooling2D extends GlobalPooling2D {\n call(inputs, kwargs) {\n return tidy(() => {\n const input = getExactlyOneTensor(inputs);\n if (this.dataFormat === 'channelsLast') {\n return tfc.mean(input, [1, 2]);\n }\n else {\n return tfc.mean(input, [2, 3]);\n }\n });\n }\n}\n/** @nocollapse */\nGlobalAveragePooling2D.className = 'GlobalAveragePooling2D';\nserialization.registerClass(GlobalAveragePooling2D);\nexport class GlobalMaxPooling2D extends GlobalPooling2D {\n call(inputs, kwargs) {\n return tidy(() => {\n const input = getExactlyOneTensor(inputs);\n if (this.dataFormat === 'channelsLast') {\n return tfc.max(input, [1, 2]);\n }\n else {\n return tfc.max(input, [2, 3]);\n }\n });\n }\n}\n/** @nocollapse */\nGlobalMaxPooling2D.className = 'GlobalMaxPooling2D';\nserialization.registerClass(GlobalMaxPooling2D);\n//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicG9vbGluZy5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uLy4uL3RmanMtbGF5ZXJzL3NyYy9sYXllcnMvcG9vbGluZy50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQTs7Ozs7Ozs7R0FRRztBQUVIOztHQUVHO0FBRUgsT0FBTyxLQUFLLEdBQUcsTUFBTSx1QkFBdUIsQ0FBQztBQUM3QyxPQUFPLEVBQUMsYUFBYSxFQUF3QyxJQUFJLEVBQUMsTUFBTSx1QkFBdUIsQ0FBQztBQUVoRyxPQUFPLEVBQUMsZUFBZSxFQUFDLE1BQU0sbUJBQW1CLENBQUM7QUFDbEQsT0FBTyxLQUFLLENBQUMsTUFBTSx5QkFBeUIsQ0FBQztBQUM3QyxPQUFPLEVBQUMsZUFBZSxFQUFFLGdCQUFnQixFQUFFLGFBQWEsRUFBQyxNQUFNLFdBQVcsQ0FBQztBQUMzRSxPQUFPLEVBQUMsU0FBUyxFQUFDLE1BQU0sb0JBQW9CLENBQUM7QUFDN0MsT0FBTyxFQUFDLEtBQUssRUFBWSxNQUFNLG9CQUFvQixDQUFDO0FBQ3BELE9BQU8sRUFBQyxtQkFBbUIsRUFBRSxVQUFVLEVBQUMsTUFBTSxXQUFXLENBQUM7QUFHMUQsT0FBTyxFQUFDLGdCQUFnQixFQUFDLE1BQU0scUJBQXFCLENBQUM7QUFDckQsT0FBTyxFQUFDLHFCQUFxQixFQUFDLE1BQU0sd0JBQXdCLENBQUM7QUFDN0QsT0FBTyxFQUFDLGtCQUFrQixFQUFFLG1CQUFtQixFQUFDLE1BQU0sc0JBQXNCLENBQUM7QUFFN0UsT0FBTyxFQUFDLHFCQUFxQixFQUFFLHFCQUFxQixFQUFDLE1BQU0saUJBQWlCLENBQUM7QUFFN0U7Ozs7Ozs7OztHQVNHO0FBQ0gsTUFBTSxVQUFVLE1BQU0sQ0FDbEIsQ0FBUyxFQUFFLFFBQTBCLEVBQUUsT0FBMEIsRUFDakUsT0FBcUIsRUFBRSxVQUF1QixFQUM5QyxRQUFtQjtJQUNyQixPQUFPLElBQUksQ0FBQyxHQUFHLEVBQUU7UUFDZixlQUFlLENBQUMsVUFBVSxDQUFDLENBQUM7UUFDNUIsYUFBYSxDQUFDLFFBQVEsQ0FBQyxDQUFDO1FBQ3hCLGdCQUFnQixDQUFDLE9BQU8sQ0FBQyxDQUFDO1FBQzFCLElBQUksT0FBTyxJQUFJLElBQUksRUFBRTtZQUNuQixPQUFPLEdBQUcsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUM7U0FDbEI7UUFDRCxJQUFJLE9BQU8sSUFBSSxJQUFJLEVBQUU7WUFDbkIsT0FBTyxHQUFHLE9BQU8sQ0FBQztTQUNuQjtRQUNELElBQUksVUFBVSxJQUFJLElBQUksRUFBRTtZQUN0QixVQUFVLEdBQUcsZUFBZSxFQUFFLENBQUM7U0FDaEM7UUFDRCxJQUFJLFFBQVEsSUFBSSxJQUFJLEVBQUU7WUFDcEIsUUFBUSxHQUFHLEtBQUssQ0FBQztTQUNsQjtRQUVELHVFQUF1RTtRQUN2RSxtQ0FBbUM7UUFDbkMsQ0FBQyxHQUFHLHFCQUFxQixDQUFDLENBQUMsRUFBRSxVQUFVLENBQUMsQ0FBQyxDQUFFLGlDQUFpQztRQUM1RSxJQUFJLENBQVMsQ0FBQztRQUNkLE1BQU0sYUFBYSxHQUFHLENBQUMsT0FBTyxLQUFLLE1BQU0sQ0FBQyxDQUFDLENBQUMsQ0FBQyxNQUFNLENBQUMsQ0FBQyxDQUFDLE9BQU8sQ0FBQztRQUM5RCxJQUFJLFFBQVEsS0FBSyxLQUFLLEVBQUU7WUFDdEIsMEJBQTBCO1lBQzFCLENBQUMsR0FBRyxHQUFHLENBQUMsT0FBTyxDQUFDLENBQWEsRUFBRSxRQUFRLEVBQUUsT0FBTyxFQUFFLGFBQWEsQ0FBQyxDQUFDO1NBQ2xFO2FBQU0sRUFBRyxRQUFRO1lBQ2hCLHlFQUF5RTtZQUN6RSw0QkFBNEI7WUFDNUIsQ0FBQyxHQUFHLEdBQUcsQ0FBQyxPQUFPO1lBQ1gsMEJBQTBCO1lBQzFCLENBQXdCLEVBQUUsUUFBUSxFQUFFLE9BQU8sRUFBRSxhQUFhLENBQUMsQ0FBQztTQUNqRTtRQUNELElBQUksVUFBVSxLQUFLLGVBQWUsRUFBRTtZQUNsQyxDQUFDLEdBQUcsR0FBRyxDQUFDLFNBQVMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUUsZ0JBQWdCO1NBQ3REO1FBQ0QsT0FBTyxDQUFDLENBQUM7SUFDWCxDQUFDLENBQUMsQ0FBQztBQUNMLENBQUM7QUFFRDs7Ozs7Ozs7O0dBU0c7QUFDSCxNQUFNLFVBQVUsTUFBTSxDQUNsQixDQUFXLEVBQUUsUUFBa0MsRUFDL0MsT0FBa0MsRUFBRSxPQUFxQixFQUN6RCxVQUF1QixFQUFFLFFBQW1CO0lBQzlDLE9BQU8sSUFBSSxDQUFDLEdBQUcsRUFBRTtRQUNmLGVBQWUsQ0FBQyxVQUFVLENBQUMsQ0FBQztRQUM1QixhQUFhLENBQUMsUUFBUSxDQUFDLENBQUM7UUFDeEIsZ0JBQWdCLENBQUMsT0FBTyxDQUFDLENBQUM7UUFDMUIsSUFBSSxPQUFPLElBQUksSUFBSSxFQUFFO1lBQ25CLE9BQU8sR0FBRyxDQUFDLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUM7U0FDckI7UUFDRCxJQUFJLE9BQU8sSUFBSSxJQUFJLEVBQUU7WUFDbkIsT0FBTyxHQUFHLE9BQU8sQ0FBQztTQUNuQjtRQUNELElBQUksVUFBVSxJQUFJLElBQUksRUFBRTtZQUN0QixVQUFVLEdBQUcsZUFBZSxFQUFFLENBQUM7U0FDaEM7UUFDRCxJQUFJLFFBQVEsSUFBSSxJQUFJLEVBQUU7WUFDcEIsUUFBUSxHQUFHLEtBQUssQ0FBQztTQUNsQjtRQUVELGtDQUFrQztRQUNsQyxDQUFDLEdBQUcscUJBQXFCLENBQUMsQ0FBVyxFQUFFLFVBQVUsQ0FBYSxDQUFDO1FBQy9ELElBQUksQ0FBUyxDQUFDO1FBQ2QsTUFBTSxhQUFhLEdBQUcsQ0FBQyxPQUFPLEtBQUssTUFBTSxDQUFDLENBQUMsQ0FBQyxDQUFDLE1BQU0sQ0FBQyxDQUFDLENBQUMsT0FBTyxDQUFDO1FBQzlELElBQUksUUFBUSxLQUFLLEtBQUssRUFBRTtZQUN0QixDQUFDLEdBQUcsR0FBRyxDQUFDLFNBQVMsQ0FBQyxDQUFDLEVBQUUsUUFBUSxFQUFFLE9BQU8sRUFBRSxhQUFhLENBQUMsQ0FBQztTQUN4RDthQUFNLEVBQUcsUUFBUTtZQUNoQixDQUFDLEdBQUcsR0FBRyxDQUFDLFNBQVMsQ0FBQyxDQUFDLEVBQUUsUUFBUSxFQUFFLE9BQU8sRUFBRSxhQUFhLENBQUMsQ0FBQztTQUN4RDtRQUNELElBQUksVUFBVSxLQUFLLGVBQWUsRUFBRTtZQUNsQyxDQUFDLEdBQUcsR0FBRyxDQUFDLFNBQVMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFFLGtCQUFrQjtTQUMzRDtRQUNELE9BQU8sQ0FBQyxDQUFDO0lBQ1gsQ0FBQyxDQUFDLENBQUM7QUFDTCxDQUFDO0FBaUJEOztHQUVHO0FBQ0gsTUFBTSxPQUFnQixTQUFVLFNBQVEsS0FBSztJQUszQzs7Ozs7T0FLRztJQUNILFlBQVksSUFBd0I7UUFDbEMsSUFBSSxJQUFJLENBQUMsUUFBUSxJQUFJLElBQUksRUFBRTtZQUN6QixJQUFJLENBQUMsUUFBUSxHQUFHLENBQUMsQ0FBQztTQUNuQjtRQUNELEtBQUssQ0FBQyxJQUFJLENBQUMsQ0FBQztRQUNaLElBQUksT0FBTyxJQUFJLENBQUMsUUFBUSxLQUFLLFFBQVEsRUFBRTtZQUNyQyxJQUFJLENBQUMsUUFBUSxHQUFHLENBQUMsSUFBSSxDQUFDLFFBQVEsQ0FBQyxDQUFDO1NBQ2pDO2FBQU0sSUFDSCxLQUFLLENBQUMsT0FBTyxDQUFDLElBQUksQ0FBQyxRQUFRLENBQUM7WUFDM0IsSUFBSSxDQUFDLFFBQXFCLENBQUMsTUFBTSxLQUFLLENBQUM7WUFDeEMsT0FBUSxJQUFJLENBQUMsUUFBcUIsQ0FBQyxDQUFDLENBQUMsS0FBSyxRQUFRLEVBQUU7WUFDdEQsSUFBSSxDQUFDLFFBQVEsR0FBRyxJQUFJLENBQUMsUUFBUSxDQUFDO1NBQy9CO2FBQU07WUFDTCxNQUFNLElBQUksVUFBVSxDQUNoQiw2REFBNkQ7Z0JBQzdELHlDQUF5QztnQkFDekMsR0FBRyxJQUFJLENBQUMsU0FBUyxDQUFDLElBQUksQ0FBQyxRQUFRLENBQUMsRUFBRSxDQUFDLENBQUM7U0FDekM7UUFDRCxxQkFBcUIsQ0FBQyxJQUFJLENBQUMsUUFBUSxFQUFFLFVBQVUsQ0FBQyxDQUFDO1FBQ2pELElBQUksSUFBSSxDQUFDLE9BQU8sSUFBSSxJQUFJLEVBQUU7WUFDeEIsSUFBSSxDQUFDLE9BQU8sR0FBRyxJQUFJLENBQUMsUUFBUSxDQUFDO1NBQzlCO2FBQU07WUFDTCxJQUFJLE9BQU8sSUFBSSxDQUFDLE9BQU8sS0FBSyxRQUFRLEVBQUU7Z0JBQ3BDLElBQUksQ0FBQyxPQUFPLEdBQUcsQ0FBQyxJQUFJLENBQUMsT0FBTyxDQUFDLENBQUM7YUFDL0I7aUJBQU0sSUFDSCxLQUFLLENBQUMsT0FBTyxDQUFDLElBQUksQ0FBQyxPQUFPLENBQUM7Z0JBQzFCLElBQUksQ0FBQyxPQUFvQixDQUFDLE1BQU0sS0FBSyxDQUFDO2dCQUN2QyxPQUFRLElBQUksQ0FBQyxPQUFvQixDQUFDLENBQUMsQ0FBQyxLQUFLLFFBQVEsRUFBRTtnQkFDckQsSUFBSSxDQUFDLE9BQU8sR0FBRyxJQUFJLENBQUMsT0FBTyxDQUFDO2FBQzdCO2lCQUFNO2dCQUNMLE1BQU0sSUFBSSxVQUFVLENBQ2hCLDREQUE0RDtvQkFDNUQseUNBQXlDO29CQUN6QyxHQUFHLElBQUksQ0FBQyxTQUFTLENBQUMsSUFBSSxDQUFDLE9BQU8sQ0FBQyxFQUFFLENBQUMsQ0FBQzthQUN4QztTQUNGO1FBQ0QscUJBQXFCLENBQUMsSUFBSSxDQUFDLE9BQU8sRUFBRSxTQUFTLENBQUMsQ0FBQztRQUUvQyxJQUFJLENBQUMsT0FBTyxHQUFHLElBQUksQ0FBQyxPQUFPLElBQUksSUFBSSxDQUFDLENBQUMsQ0FBQyxPQUFPLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxPQUFPLENBQUM7UUFDN0QsZ0JBQWdCLENBQUMsSUFBSSxDQUFDLE9BQU8sQ0FBQyxDQUFDO1FBQy9CLElBQUksQ0FBQyxTQUFTLEdBQUcsQ0FBQyxJQUFJLFNBQVMsQ0FBQyxFQUFDLElBQUksRUFBRSxDQUFDLEVBQUMsQ0FBQyxDQUFDLENBQUM7SUFDOUMsQ0FBQztJQUVELGtCQUFrQixDQUFDLFVBQXlCO1FBQzFDLFVBQVUsR0FBRyxrQkFBa0IsQ0FBQyxVQUFVLENBQUMsQ0FBQztRQUM1QyxNQUFNLE1BQU0sR0FBRyxnQkFBZ0IsQ0FDM0IsVUFBVSxDQUFDLENBQUMsQ0FBQyxFQUFFLElBQUksQ0FBQyxRQUFRLENBQUMsQ0FBQyxDQUFDLEVBQUUsSUFBSSxDQUFDLE9BQU8sRUFBRSxJQUFJLENBQUMsT0FBTyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUM7UUFDcEUsT0FBTyxDQUFDLFVBQVUsQ0FBQyxDQUFDLENBQUMsRUFBRSxNQUFNLEVBQUUsVUFBVSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUM7SUFDaEQsQ0FBQztJQU1ELElBQUksQ0FBQyxNQUF1QixFQUFFLE1BQWM7UUFDMUMsT0FBTyxJQUFJLENBQUMsR0FBRyxFQUFFO1lBQ2YsSUFBSSxDQUFDLGNBQWMsQ0FBQyxNQUFNLEVBQUUsTUFBTSxDQUFDLENBQUM7WUFDcEMsNEJBQTRCO1lBQzVCLE1BQU0sR0FBRyxDQUFDLENBQUMsVUFBVSxDQUFDLG1CQUFtQixDQUFDLE1BQU0sQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDO1lBQ3RELE1BQU0sTUFBTSxHQUFHLElBQUksQ0FBQyxlQUFlLENBQy9CLG1CQUFtQixDQUFDLE1BQU0sQ0FBQyxFQUFFLENBQUMsSUFBSSxDQUFDLFFBQVEsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsRUFDbEQsQ0FBQyxJQUFJLENBQUMsT0FBTyxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxFQUFFLElBQUksQ0FBQyxPQUFPLEVBQUUsY0FBYyxDQUFDLENBQUM7WUFDeEQsK0JBQStCO1lBQy9CLE9BQU8sR0FBRyxDQUFDLE9BQU8sQ0FBQyxNQUFNLEVBQUUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDO1FBQ2xDLENBQUMsQ0FBQyxDQUFDO0lBQ0wsQ0FBQztJQUVELFNBQVM7UUFDUCxNQUFNLE1BQU0sR0FBRztZQUNiLFFBQVEsRUFBRSxJQUFJLENBQUMsUUFBUTtZQUN2QixPQUFPLEVBQUUsSUFBSSxDQUFDLE9BQU87WUFDckIsT0FBTyxFQUFFLElBQUksQ0FBQyxPQUFPO1NBQ3RCLENBQUM7UUFDRixNQUFNLFVBQVUsR0FBRyxLQUFLLENBQUMsU0FBUyxFQUFFLENBQUM7UUFDckMsTUFBTSxDQUFDLE1BQU0sQ0FBQyxNQUFNLEVBQUUsVUFBVSxDQUFDLENBQUM7UUFDbEMsT0FBTyxNQUFNLENBQUM7SUFDaEIsQ0FBQztDQUNGO0FBRUQsTUFBTSxPQUFPLFlBQWEsU0FBUSxTQUFTO0lBR3pDLFlBQVksSUFBd0I7UUFDbEMsS0FBSyxDQUFDLElBQUksQ0FBQyxDQUFDO0lBQ2QsQ0FBQztJQUVTLGVBQWUsQ0FDckIsTUFBYyxFQUFFLFFBQTBCLEVBQUUsT0FBeUIsRUFDckUsT0FBb0IsRUFBRSxVQUFzQjtRQUM5QyxlQUFlLENBQUMsVUFBVSxDQUFDLENBQUM7UUFDNUIsZ0JBQWdCLENBQUMsT0FBTyxDQUFDLENBQUM7UUFDMUIsT0FBTyxNQUFNLENBQUMsTUFBTSxFQUFFLFFBQVEsRUFBRSxPQUFPLEVBQUUsT0FBTyxFQUFFLFVBQVUsRUFBRSxLQUFLLENBQUMsQ0FBQztJQUN2RSxDQUFDOztBQVpELGtCQUFrQjtBQUNYLHNCQUFTLEdBQUcsY0FBYyxDQUFDO0FBYXBDLGFBQWEsQ0FBQyxhQUFhLENBQUMsWUFBWSxDQUFDLENBQUM7QUFFMUMsTUFBTSxPQUFPLGdCQUFpQixTQUFRLFNBQVM7SUFHN0MsWUFBWSxJQUF3QjtRQUNsQyxLQUFLLENBQUMsSUFBSSxDQUFDLENBQUM7SUFDZCxDQUFDO0lBRVMsZUFBZSxDQUNyQixNQUFjLEVBQUUsUUFBMEIsRUFBRSxPQUF5QixFQUNyRSxPQUFvQixFQUFFLFVBQXNCO1FBQzlDLGVBQWUsQ0FBQyxVQUFVLENBQUMsQ0FBQztRQUM1QixnQkFBZ0IsQ0FBQyxPQUFPLENBQUMsQ0FBQztRQUMxQixPQUFPLE1BQU0sQ0FBQyxNQUFNLEVBQUUsUUFBUSxFQUFFLE9BQU8sRUFBRSxPQUFPLEVBQUUsVUFBVSxFQUFFLEtBQUssQ0FBQyxDQUFDO0lBQ3ZFLENBQUM7O0FBWkQsa0JBQWtCO0FBQ1gsMEJBQVMsR0FBRyxrQkFBa0IsQ0FBQztBQWF4QyxhQUFhLENBQUMsYUFBYSxDQUFDLGdCQUFnQixDQUFDLENBQUM7QUE0QjlDOztHQUVHO0FBQ0gsTUFBTSxPQUFnQixTQUFVLFNBQVEsS0FBSztJQU0zQyxZQUFZLElBQXdCO1FBQ2xDLElBQUksSUFBSSxDQUFDLFFBQVEsSUFBSSxJQUFJLEVBQUU7WUFDekIsSUFBSSxDQUFDLFFBQVEsR0FBRyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQztTQUN4QjtRQUNELEtBQUssQ0FBQyxJQUFJLENBQUMsQ0FBQztRQUNaLElBQUksQ0FBQyxRQUFRLEdBQUcsS0FBSyxDQUFDLE9BQU8sQ0FBQyxJQUFJLENBQUMsUUFBUSxDQUFDLENBQUMsQ0FBQztZQUMxQyxJQUFJLENBQUMsUUFBUSxDQUFDLENBQUM7WUFDZixDQUFDLElBQUksQ0FBQyxRQUFRLEVBQUUsSUFBSSxDQUFDLFFBQVEsQ0FBQyxDQUFDO1FBQ25DLElBQUksSUFBSSxDQUFDLE9BQU8sSUFBSSxJQUFJLEVBQUU7WUFDeEIsSUFBSSxDQUFDLE9BQU8sR0FBRyxJQUFJLENBQUMsUUFBUSxDQUFDO1NBQzlCO2FBQU0sSUFBSSxLQUFLLENBQUMsT0FBTyxDQUFDLElBQUksQ0FBQyxPQUFPLENBQUMsRUFBRTtZQUN0QyxJQUFJLElBQUksQ0FBQyxPQUFPLENBQUMsTUFBTSxLQUFLLENBQUMsRUFBRTtnQkFDN0IsTUFBTSxJQUFJLFVBQVUsQ0FDaEIsNkRBQTZEO29CQUM3RCw0REFBNEQ7b0JBQzVELEdBQUcsSUFBSSxDQUFDLE9BQU8sQ0FBQyxNQUFNLEdBQUcsQ0FBQyxDQUFDO2FBQ2hDO1lBQ0QsSUFBSSxDQUFDLE9BQU8sR0FBRyxJQUFJLENBQUMsT0FBTyxDQUFDO1NBQzdCO2FBQU07WUFDTCxnQ0FBZ0M7WUFDaEMsSUFBSSxDQUFDLE9BQU8sR0FBRyxDQUFDLElBQUksQ0FBQyxPQUFPLEVBQUUsSUFBSSxDQUFDLE9BQU8sQ0FBQyxDQUFDO1NBQzdDO1FBQ0QscUJBQXFCLENBQUMsSUFBSSxDQUFDLFFBQVEsRUFBRSxVQUFVLENBQUMsQ0FBQztRQUNqRCxxQkFBcUIsQ0FBQyxJQUFJLENBQUMsT0FBTyxFQUFFLFNBQVMsQ0FBQyxDQUFDO1FBQy9DLElBQUksQ0FBQyxPQUFPLEdBQUcsSUFBSSxDQUFDLE9BQU8sSUFBSSxJQUFJLENBQUMsQ0FBQyxDQUFDLE9BQU8sQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLE9BQU8sQ0FBQztRQUM3RCxJQUFJLENBQUMsVUFBVTtZQUNYLElBQUksQ0FBQyxVQUFVLElBQUksSUFBSSxDQUFDLENBQUMsQ0FBQyxjQUFjLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxVQUFVLENBQUM7UUFDL0QsZUFBZSxDQUFDLElBQUksQ0FBQyxVQUFVLENBQUMsQ0FBQztRQUNqQyxnQkFBZ0IsQ0FBQyxJQUFJLENBQUMsT0FBTyxDQUFDLENBQUM7UUFFL0IsSUFBSSxDQUFDLFNBQVMsR0FBRyxDQUFDLElBQUksU0FBUyxDQUFDLEVBQUMsSUFBSSxFQUFFLENBQUMsRUFBQyxDQUFDLENBQUMsQ0FBQztJQUM5QyxDQUFDO0lBRUQsa0JBQWtCLENBQUMsVUFBeUI7UUFDMUMsVUFBVSxHQUFHLGtCQUFrQixDQUFDLFVBQVUsQ0FBQyxDQUFDO1FBQzVDLElBQUksSUFBSSxHQUNKLElBQUksQ0FBQyxVQUFVLEtBQUssZUFBZSxDQUFDLENBQUMsQ0FBQyxVQUFVLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLFVBQVUsQ0FBQyxDQUFDLENBQUMsQ0FBQztRQUN4RSxJQUFJLElBQUksR0FDSixJQUFJLENBQUMsVUFBVSxLQUFLLGVBQWUsQ0FBQyxDQUFDLENBQUMsVUFBVSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxVQUFVLENBQUMsQ0FBQyxDQUFDLENBQUM7UUFDeEUsSUFBSTtZQUNBLGdCQUFnQixDQUFDLElBQUksRUFBRSxJQUFJLENBQUMsUUFBUSxDQUFDLENBQUMsQ0FBQyxFQUFFLElBQUksQ0FBQyxPQUFPLEVBQUUsSUFBSSxDQUFDLE9BQU8sQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDO1FBQzVFLElBQUk7WUFDQSxnQkFBZ0IsQ0FBQyxJQUFJLEVBQUUsSUFBSSxDQUFDLFFBQVEsQ0FBQyxDQUFDLENBQUMsRUFBRSxJQUFJLENBQUMsT0FBTyxFQUFFLElBQUksQ0FBQyxPQUFPLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQztRQUM1RSxJQUFJLElBQUksQ0FBQyxVQUFVLEtBQUssZUFBZSxFQUFFO1lBQ3ZDLE9BQU8sQ0FBQyxVQUFVLENBQUMsQ0FBQyxDQUFDLEVBQUUsVUFBVSxDQUFDLENBQUMsQ0FBQyxFQUFFLElBQUksRUFBRSxJQUFJLENBQUMsQ0FBQztTQUNuRDthQUFNO1lBQ0wsT0FBTyxDQUFDLFVBQVUsQ0FBQyxDQUFDLENBQUMsRUFBRSxJQUFJLEVBQUUsSUFBSSxFQUFFLFVBQVUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDO1NBQ25EO0lBQ0gsQ0FBQztJQU1ELElBQUksQ0FBQyxNQUF1QixFQUFFLE1BQWM7UUFDMUMsT0FBTyxJQUFJLENBQUMsR0FBRyxFQUFFO1lBQ2YsSUFBSSxDQUFDLGNBQWMsQ0FBQyxNQUFNLEVBQUUsTUFBTSxDQUFDLENBQUM7WUFDcEMsT0FBTyxJQUFJLENBQUMsZUFBZSxDQUN2QixtQkFBbUIsQ0FBQyxNQUFNLENBQUMsRUFBRSxJQUFJLENBQUMsUUFBUSxFQUFFLElBQUksQ0FBQyxPQUFPLEVBQ3hELElBQUksQ0FBQyxPQUFPLEVBQUUsSUFBSSxDQUFDLFVBQVUsQ0FBQyxDQUFDO1FBQ3JDLENBQUMsQ0FBQyxDQUFDO0lBQ0wsQ0FBQztJQUVELFNBQVM7UUFDUCxNQUFNLE1BQU0sR0FBRztZQUNiLFFBQVEsRUFBRSxJQUFJLENBQUMsUUFBUTtZQUN2QixPQUFPLEVBQUUsSUFBSSxDQUFDLE9BQU87WUFDckIsT0FBTyxFQUFFLElBQUksQ0FBQyxPQUFPO1lBQ3JCLFVBQVUsRUFBRSxJQUFJLENBQUMsVUFBVTtTQUM1QixDQUFDO1FBQ0YsTUFBTSxVQUFVLEdBQUcsS0FBSyxDQUFDLFNBQVMsRUFBRSxDQUFDO1FBQ3JDLE1BQU0sQ0FBQyxNQUFNLENBQUMsTUFBTSxFQUFFLFVBQVUsQ0FBQyxDQUFDO1FBQ2xDLE9BQU8sTUFBTSxDQUFDO0lBQ2hCLENBQUM7Q0FDRjtBQUVELE1BQU0sT0FBTyxZQUFhLFNBQVEsU0FBUztJQUd6QyxZQUFZLElBQXdCO1FBQ2xDLEtBQUssQ0FBQyxJQUFJLENBQUMsQ0FBQztJQUNkLENBQUM7SUFFUyxlQUFlLENBQ3JCLE1BQWMsRUFBRSxRQUEwQixFQUFFLE9BQXlCLEVBQ3JFLE9BQW9CLEVBQUUsVUFBc0I7UUFDOUMsZUFBZSxDQUFDLFVBQVUsQ0FBQyxDQUFDO1FBQzVCLGdCQUFnQixDQUFDLE9BQU8sQ0FBQyxDQUFDO1FBQzFCLE9BQU8sTUFBTSxDQUFDLE1BQU0sRUFBRSxRQUFRLEVBQUUsT0FBTyxFQUFFLE9BQU8sRUFBRSxVQUFVLEVBQUUsS0FBSyxDQUFDLENBQUM7SUFDdkUsQ0FBQzs7QUFaRCxrQkFBa0I7QUFDWCxzQkFBUyxHQUFHLGNBQWMsQ0FBQztBQWFwQyxhQUFhLENBQUMsYUFBYSxDQUFDLFlBQVksQ0FBQyxDQUFDO0FBRTFDLE1BQU0sT0FBTyxnQkFBaUIsU0FBUSxTQUFTO0lBRzdDLFlBQVksSUFBd0I7UUFDbEMsS0FBSyxDQUFDLElBQUksQ0FBQyxDQUFDO0lBQ2QsQ0FBQztJQUVTLGVBQWUsQ0FDckIsTUFBYyxFQUFFLFFBQTBCLEVBQUUsT0FBeUIsRUFDckUsT0FBb0IsRUFBRSxVQUFzQjtRQUM5QyxlQUFlLENBQUMsVUFBVSxDQUFDLENBQUM7UUFDNUIsZ0JBQWdCLENBQUMsT0FBTyxDQUFDLENBQUM7UUFDMUIsT0FBTyxNQUFNLENBQUMsTUFBTSxFQUFFLFFBQVEsRUFBRSxPQUFPLEVBQUUsT0FBTyxFQUFFLFVBQVUsRUFBRSxLQUFLLENBQUMsQ0FBQztJQUN2RSxDQUFDOztBQVpELGtCQUFrQjtBQUNYLDBCQUFTLEdBQUcsa0JBQWtCLENBQUM7QUFheEMsYUFBYSxDQUFDLGFBQWEsQ0FBQyxnQkFBZ0IsQ0FBQyxDQUFDO0FBNEI5Qzs7R0FFRztBQUNILE1BQU0sT0FBZ0IsU0FBVSxTQUFRLEtBQUs7SUFNM0MsWUFBWSxJQUF3QjtRQUNsQyxJQUFJLElBQUksQ0FBQyxRQUFRLElBQUksSUFBSSxFQUFFO1lBQ3pCLElBQUksQ0FBQyxRQUFRLEdBQUcsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDO1NBQzNCO1FBQ0QsS0FBSyxDQUFDLElBQUksQ0FBQyxDQUFDO1FBQ1osSUFBSSxDQUFDLFFBQVEsR0FBRyxLQUFLLENBQUMsT0FBTyxDQUFDLElBQUksQ0FBQyxRQUFRLENBQUMsQ0FBQyxDQUFDO1lBQzFDLElBQUksQ0FBQyxRQUFRLENBQUMsQ0FBQztZQUNmLENBQUMsSUFBSSxDQUFDLFFBQVEsRUFBRSxJQUFJLENBQUMsUUFBUSxFQUFFLElBQUksQ0FBQyxRQUFRLENBQUMsQ0FBQztRQUNsRCxJQUFJLElBQUksQ0FBQyxPQUFPLElBQUksSUFBSSxFQUFFO1lBQ3hCLElBQUksQ0FBQyxPQUFPLEdBQUcsSUFBSSxDQUFDLFFBQVEsQ0FBQztTQUM5QjthQUFNLElBQUksS0FBSyxDQUFDLE9BQU8sQ0FBQyxJQUFJLENBQUMsT0FBTyxDQUFDLEVBQUU7WUFDdEMsSUFBSSxJQUFJLENBQUMsT0FBTyxDQUFDLE1BQU0sS0FBSyxDQUFDLEVBQUU7Z0JBQzdCLE1BQU0sSUFBSSxVQUFVLENBQ2hCLDZEQUE2RDtvQkFDN0QsNERBQTREO29CQUM1RCxHQUFHLElBQUksQ0FBQyxPQUFPLENBQUMsTUFBTSxHQUFHLENBQUMsQ0FBQzthQUNoQztZQUNELElBQUksQ0FBQyxPQUFPLEdBQUcsSUFBSSxDQUFDLE9BQU8sQ0FBQztTQUM3QjthQUFNO1lBQ0wsZ0NBQWdDO1lBQ2hDLElBQUksQ0FBQyxPQUFPLEdBQUcsQ0FBQyxJQUFJLENBQUMsT0FBTyxFQUFFLElBQUksQ0FBQyxPQUFPLEVBQUUsSUFBSSxDQUFDLE9BQU8sQ0FBQyxDQUFDO1NBQzNEO1FBQ0QscUJBQXFCLENBQUMsSUFBSSxDQUFDLFFBQVEsRUFBRSxVQUFVLENBQUMsQ0FBQztRQUNqRCxxQkFBcUIsQ0FBQyxJQUFJLENBQUMsT0FBTyxFQUFFLFNBQVMsQ0FBQyxDQUFDO1FBQy9DLElBQUksQ0FBQyxPQUFPLEdBQUcsSUFBSSxDQUFDLE9BQU8sSUFBSSxJQUFJLENBQUMsQ0FBQyxDQUFDLE9BQU8sQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLE9BQU8sQ0FBQztRQUM3RCxJQUFJLENBQUMsVUFBVTtZQUNYLElBQUksQ0FBQyxVQUFVLElBQUksSUFBSSxDQUFDLENBQUMsQ0FBQyxjQUFjLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxVQUFVLENBQUM7UUFDL0QsZUFBZSxDQUFDLElBQUksQ0FBQyxVQUFVLENBQUMsQ0FBQztRQUNqQyxnQkFBZ0IsQ0FBQyxJQUFJLENBQUMsT0FBTyxDQUFDLENBQUM7UUFFL0IsSUFBSSxDQUFDLFNBQVMsR0FBRyxDQUFDLElBQUksU0FBUyxDQUFDLEVBQUMsSUFBSSxFQUFFLENBQUMsRUFBQyxDQUFDLENBQUMsQ0FBQztJQUM5QyxDQUFDO0lBRUQsa0JBQWtCLENBQUMsVUFBeUI7UUFDMUMsVUFBVSxHQUFHLGtCQUFrQixDQUFDLFVBQVUsQ0FBQyxDQUFDO1FBQzVDLElBQUksTUFBTSxHQUNOLElBQUksQ0FBQyxVQUFVLEtBQUssZUFBZSxDQUFDLENBQUMsQ0FBQyxVQUFVLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLFVBQVUsQ0FBQyxDQUFDLENBQUMsQ0FBQztRQUN4RSxJQUFJLElBQUksR0FDSixJQUFJLENBQUMsVUFBVSxLQUFLLGVBQWUsQ0FBQyxDQUFDLENBQUMsVUFBVSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxVQUFVLENBQUMsQ0FBQyxDQUFDLENBQUM7UUFDeEUsSUFBSSxJQUFJLEdBQ0osSUFBSSxDQUFDLFVBQVUsS0FBSyxlQUFlLENBQUMsQ0FBQyxDQUFDLFVBQVUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsVUFBVSxDQUFDLENBQUMsQ0FBQyxDQUFDO1FBQ3hFLE1BQU0sR0FBRyxnQkFBZ0IsQ0FDckIsTUFBTSxFQUFFLElBQUksQ0FBQyxRQUFRLENBQUMsQ0FBQyxDQUFDLEVBQUUsSUFBSSxDQUFDLE9BQU8sRUFBRSxJQUFJLENBQUMsT0FBTyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUM7UUFDN0QsSUFBSTtZQUNBLGdCQUFnQixDQUFDLElBQUksRUFBRSxJQUFJLENBQUMsUUFBUSxDQUFDLENBQUMsQ0FBQyxFQUFFLElBQUksQ0FBQyxPQUFPLEVBQUUsSUFBSSxDQUFDLE9BQU8sQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDO1FBQzVFLElBQUk7WUFDQSxnQkFBZ0IsQ0FBQyxJQUFJLEVBQUUsSUFBSSxDQUFDLFFBQVEsQ0FBQyxDQUFDLENBQUMsRUFBRSxJQUFJLENBQUMsT0FBTyxFQUFFLElBQUksQ0FBQyxPQUFPLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQztRQUM1RSxJQUFJLElBQUksQ0FBQyxVQUFVLEtBQUssZUFBZSxFQUFFO1lBQ3ZDLE9BQU8sQ0FBQyxVQUFVLENBQUMsQ0FBQyxDQUFDLEVBQUUsVUFBVSxDQUFDLENBQUMsQ0FBQyxFQUFFLE1BQU0sRUFBRSxJQUFJLEVBQUUsSUFBSSxDQUFDLENBQUM7U0FDM0Q7YUFBTTtZQUNMLE9BQU8sQ0FBQyxVQUFVLENBQUMsQ0FBQyxDQUFDLEVBQUUsTUFBTSxFQUFFLElBQUksRUFBRSxJQUFJLEVBQUUsVUFBVSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUM7U0FDM0Q7SUFDSCxDQUFDO0lBT0QsSUFBSSxDQUFDLE1BQXVCLEVBQUUsTUFBYztRQUMxQyxPQUFPLElBQUksQ0FBQyxHQUFHLEVBQUU7WUFDZixJQUFJLENBQUMsY0FBYyxDQUFDLE1BQU0sRUFBRSxNQUFNLENBQUMsQ0FBQztZQUNwQyxPQUFPLElBQUksQ0FBQyxlQUFlLENBQ3ZCLG1CQUFtQixDQUFDLE1BQU0sQ0FBQyxFQUFFLElBQUksQ0FBQyxRQUFRLEVBQUUsSUFBSSxDQUFDLE9BQU8sRUFDeEQsSUFBSSxDQUFDLE9BQU8sRUFBRSxJQUFJLENBQUMsVUFBVSxDQUFDLENBQUM7UUFDckMsQ0FBQyxDQUFDLENBQUM7SUFDTCxDQUFDO0lBRUQsU0FBUztRQUNQLE1BQU0sTUFBTSxHQUFHO1lBQ2IsUUFBUSxFQUFFLElBQUksQ0FBQyxRQUFRO1lBQ3ZCLE9BQU8sRUFBRSxJQUFJLENBQUMsT0FBTztZQUNyQixPQUFPLEVBQUUsSUFBSSxDQUFDLE9BQU87WUFDckIsVUFBVSxFQUFFLElBQUksQ0FBQyxVQUFVO1NBQzVCLENBQUM7UUFDRixNQUFNLFVBQVUsR0FBRyxLQUFLLENBQUMsU0FBUyxFQUFFLENBQUM7UUFDckMsTUFBTSxDQUFDLE1BQU0sQ0FBQyxNQUFNLEVBQUUsVUFBVSxDQUFDLENBQUM7UUFDbEMsT0FBTyxNQUFNLENBQUM7SUFDaEIsQ0FBQztDQUNGO0FBRUQsTUFBTSxPQUFPLFlBQWEsU0FBUSxTQUFTO0lBR3pDLFlBQVksSUFBd0I7UUFDbEMsS0FBSyxDQUFDLElBQUksQ0FBQyxDQUFDO0lBQ2QsQ0FBQztJQUVTLGVBQWUsQ0FDckIsTUFBYyxFQUFFLFFBQWtDLEVBQ2xELE9BQWlDLEVBQUUsT0FBb0IsRUFDdkQsVUFBc0I7UUFDeEIsZUFBZSxDQUFDLFVBQVUsQ0FBQyxDQUFDO1FBQzVCLGdCQUFnQixDQUFDLE9BQU8sQ0FBQyxDQUFDO1FBQzFCLE9BQU8sTUFBTSxDQUNULE1BQWtCLEVBQUUsUUFBUSxFQUFFLE9BQU8sRUFBRSxPQUFPLEVBQUUsVUFBVSxFQUFFLEtBQUssQ0FBQyxDQUFDO0lBQ3pFLENBQUM7O0FBZEQsa0JBQWtCO0FBQ1gsc0JBQVMsR0FBRyxjQUFjLENBQUM7QUFlcEMsYUFBYSxDQUFDLGFBQWEsQ0FBQyxZQUFZLENBQUMsQ0FBQztBQUUxQyxNQUFNLE9BQU8sZ0JBQWlCLFNBQVEsU0FBUztJQUc3QyxZQUFZLElBQXdCO1FBQ2xDLEtBQUssQ0FBQyxJQUFJLENBQUMsQ0FBQztJQUNkLENBQUM7SUFFUyxlQUFlLENBQ3JCLE1BQWMsRUFBRSxRQUFrQyxFQUNsRCxPQUFpQyxFQUFFLE9BQW9CLEVBQ3ZELFVBQXNCO1FBQ3hCLGVBQWUsQ0FBQyxVQUFVLENBQUMsQ0FBQztRQUM1QixnQkFBZ0IsQ0FBQyxPQUFPLENBQUMsQ0FBQztRQUMxQixPQUFPLE1BQU0sQ0FDVCxNQUFrQixFQUFFLFFBQVEsRUFBRSxPQUFPLEVBQUUsT0FBTyxFQUFFLFVBQVUsRUFBRSxLQUFLLENBQUMsQ0FBQztJQUN6RSxDQUFDOztBQWRELGtCQUFrQjtBQUNYLDBCQUFTLEdBQUcsa0JBQWtCLENBQUM7QUFleEMsYUFBYSxDQUFDLGFBQWEsQ0FBQyxnQkFBZ0IsQ0FBQyxDQUFDO0FBRTlDOztHQUVHO0FBQ0gsTUFBTSxPQUFnQixlQUFnQixTQUFRLEtBQUs7SUFDakQsWUFBWSxJQUFlO1FBQ3pCLEtBQUssQ0FBQyxJQUFJLENBQUMsQ0FBQztRQUNaLElBQUksQ0FBQyxTQUFTLEdBQUcsQ0FBQyxJQUFJLFNBQVMsQ0FBQyxFQUFDLElBQUksRUFBRSxDQUFDLEVBQUMsQ0FBQyxDQUFDLENBQUM7SUFDOUMsQ0FBQztJQUVELGtCQUFrQixDQUFDLFVBQWlCO1FBQ2xDLE9BQU8sQ0FBQyxVQUFVLENBQUMsQ0FBQyxDQUFDLEVBQUUsVUFBVSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUM7SUFDeEMsQ0FBQztJQUVELElBQUksQ0FBQyxNQUF1QixFQUFFLE1BQWM7UUFDMUMsTUFBTSxJQUFJLG1CQUFtQixFQUFFLENBQUM7SUFDbEMsQ0FBQztDQUNGO0FBRUQsTUFBTSxPQUFPLHNCQUF1QixTQUFRLGVBQWU7SUFHekQsWUFBWSxJQUFnQjtRQUMxQixLQUFLLENBQUMsSUFBSSxJQUFJLEVBQUUsQ0FBQyxDQUFDO0lBQ3BCLENBQUM7SUFFRCxJQUFJLENBQUMsTUFBdUIsRUFBRSxNQUFjO1FBQzFDLE9BQU8sSUFBSSxDQUFDLEdBQUcsRUFBRTtZQUNmLE1BQU0sS0FBSyxHQUFHLG1CQUFtQixDQUFDLE1BQU0sQ0FBQyxDQUFDO1lBQzFDLE9BQU8sR0FBRyxDQUFDLElBQUksQ0FBQyxLQUFLLEVBQUUsQ0FBQyxDQUFDLENBQUM7UUFDNUIsQ0FBQyxDQUFDLENBQUM7SUFDTCxDQUFDOztBQVhELGtCQUFrQjtBQUNYLGdDQUFTLEdBQUcsd0JBQXdCLENBQUM7QUFZOUMsYUFBYSxDQUFDLGFBQWEsQ0FBQyxzQkFBc0IsQ0FBQyxDQUFDO0FBRXBELE1BQU0sT0FBTyxrQkFBbUIsU0FBUSxlQUFlO0lBR3JELFlBQVksSUFBZTtRQUN6QixLQUFLLENBQUMsSUFBSSxJQUFJLEVBQUUsQ0FBQyxDQUFDO0lBQ3BCLENBQUM7SUFFRCxJQUFJLENBQUMsTUFBdUIsRUFBRSxNQUFjO1FBQzFDLE9BQU8sSUFBSSxDQUFDLEdBQUcsRUFBRTtZQUNmLE1BQU0sS0FBSyxHQUFHLG1CQUFtQixDQUFDLE1BQU0sQ0FBQyxDQUFDO1lBQzFDLE9BQU8sR0FBRyxDQUFDLEdBQUcsQ0FBQyxLQUFLLEVBQUUsQ0FBQyxDQUFDLENBQUM7UUFDM0IsQ0FBQyxDQUFDLENBQUM7SUFDTCxDQUFDOztBQVhELGtCQUFrQjtBQUNYLDRCQUFTLEdBQUcsb0JBQW9CLENBQUM7QUFZMUMsYUFBYSxDQUFDLGFBQWEsQ0FBQyxrQkFBa0IsQ0FBQyxDQUFDO0FBY2hEOztHQUVHO0FBQ0gsTUFBTSxPQUFnQixlQUFnQixTQUFRLEtBQUs7SUFFakQsWUFBWSxJQUE4QjtRQUN4QyxLQUFLLENBQUMsSUFBSSxDQUFDLENBQUM7UUFDWixJQUFJLENBQUMsVUFBVTtZQUNYLElBQUksQ0FBQyxVQUFVLElBQUksSUFBSSxDQUFDLENBQUMsQ0FBQyxjQUFjLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxVQUFVLENBQUM7UUFDL0QsZUFBZSxDQUFDLElBQUksQ0FBQyxVQUFVLENBQUMsQ0FBQztRQUNqQyxJQUFJLENBQUMsU0FBUyxHQUFHLENBQUMsSUFBSSxTQUFTLENBQUMsRUFBQyxJQUFJLEVBQUUsQ0FBQyxFQUFDLENBQUMsQ0FBQyxDQUFDO0lBQzlDLENBQUM7SUFFRCxrQkFBa0IsQ0FBQyxVQUF5QjtRQUMxQyxVQUFVLEdBQUcsVUFBbUIsQ0FBQztRQUNqQyxJQUFJLElBQUksQ0FBQyxVQUFVLEtBQUssY0FBYyxFQUFFO1lBQ3RDLE9BQU8sQ0FBQyxVQUFVLENBQUMsQ0FBQyxDQUFDLEVBQUUsVUFBVSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUM7U0FDdkM7YUFBTTtZQUNMLE9BQU8sQ0FBQyxVQUFVLENBQUMsQ0FBQyxDQUFDLEVBQUUsVUFBVSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUM7U0FDdkM7SUFDSCxDQUFDO0lBRUQsSUFBSSxDQUFDLE1BQXVCLEVBQUUsTUFBYztRQUMxQyxNQUFNLElBQUksbUJBQW1CLEVBQUUsQ0FBQztJQUNsQyxDQUFDO0lBRUQsU0FBUztRQUNQLE1BQU0sTUFBTSxHQUFHLEVBQUMsVUFBVSxFQUFFLElBQUksQ0FBQyxVQUFVLEVBQUMsQ0FBQztRQUM3QyxNQUFNLFVBQVUsR0FBRyxLQUFLLENBQUMsU0FBUyxFQUFFLENBQUM7UUFDckMsTUFBTSxDQUFDLE1BQU0sQ0FBQyxNQUFNLEVBQUUsVUFBVSxDQUFDLENBQUM7UUFDbEMsT0FBTyxNQUFNLENBQUM7SUFDaEIsQ0FBQztDQUNGO0FBRUQsTUFBTSxPQUFPLHNCQUF1QixTQUFRLGVBQWU7SUFJekQsSUFBSSxDQUFDLE1BQXVCLEVBQUUsTUFBYztRQUMxQyxPQUFPLElBQUksQ0FBQyxHQUFHLEVBQUU7WUFDZixNQUFNLEtBQUssR0FBRyxtQkFBbUIsQ0FBQyxNQUFNLENBQUMsQ0FBQztZQUMxQyxJQUFJLElBQUksQ0FBQyxVQUFVLEtBQUssY0FBYyxFQUFFO2dCQUN0QyxPQUFPLEdBQUcsQ0FBQyxJQUFJLENBQUMsS0FBSyxFQUFFLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUM7YUFDaEM7aUJBQU07Z0JBQ0wsT0FBTyxHQUFHLENBQUMsSUFBSSxDQUFDLEtBQUssRUFBRSxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxDQUFDO2FBQ2hDO1FBQ0gsQ0FBQyxDQUFDLENBQUM7SUFDTCxDQUFDOztBQVpELGtCQUFrQjtBQUNYLGdDQUFTLEdBQUcsd0JBQXdCLENBQUM7QUFhOUMsYUFBYSxDQUFDLGFBQWEsQ0FBQyxzQkFBc0IsQ0FBQyxDQUFDO0FBRXBELE1BQU0sT0FBTyxrQkFBbUIsU0FBUSxlQUFlO0lBSXJELElBQUksQ0FBQyxNQUF1QixFQUFFLE1BQWM7UUFDMUMsT0FBTyxJQUFJLENBQUMsR0FBRyxFQUFFO1lBQ2YsTUFBTSxLQUFLLEdBQUcsbUJBQW1CLENBQUMsTUFBTSxDQUFDLENBQUM7WUFDMUMsSUFBSSxJQUFJLENBQUMsVUFBVSxLQUFLLGNBQWMsRUFBRTtnQkFDdEMsT0FBTyxHQUFHLENBQUMsR0FBRyxDQUFDLEtBQUssRUFBRSxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxDQUFDO2FBQy9CO2lCQUFNO2dCQUNMLE9BQU8sR0FBRyxDQUFDLEdBQUcsQ0FBQyxLQUFLLEVBQUUsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsQ0FBQzthQUMvQjtRQUNILENBQUMsQ0FBQyxDQUFDO0lBQ0wsQ0FBQzs7QUFaRCxrQkFBa0I7QUFDWCw0QkFBUyxHQUFHLG9CQUFvQixDQUFDO0FBYTFDLGFBQWEsQ0FBQyxhQUFhLENBQUMsa0JBQWtCLENBQUMsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbIi8qKlxuICogQGxpY2Vuc2VcbiAqIENvcHlyaWdodCAyMDE4IEdvb2dsZSBMTENcbiAqXG4gKiBVc2Ugb2YgdGhpcyBzb3VyY2UgY29kZSBpcyBnb3Zlcm5lZCBieSBhbiBNSVQtc3R5bGVcbiAqIGxpY2Vuc2UgdGhhdCBjYW4gYmUgZm91bmQgaW4gdGhlIExJQ0VOU0UgZmlsZSBvciBhdFxuICogaHR0cHM6Ly9vcGVuc291cmNlLm9yZy9saWNlbnNlcy9NSVQuXG4gKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuICovXG5cbi8qKlxuICogVGVuc29yRmxvdy5qcyBMYXllcnM6IFBvb2xpbmcgTGF5ZXJzLlxuICovXG5cbmltcG9ydCAqIGFzIHRmYyBmcm9tICdAdGVuc29yZmxvdy90ZmpzLWNvcmUnO1xuaW1wb3J0IHtzZXJpYWxpemF0aW9uLCBUZW5zb3IsIFRlbnNvcjNELCBUZW5zb3I0RCwgVGVuc29yNUQsIHRpZHl9IGZyb20gJ0B0ZW5zb3JmbG93L3RmanMtY29yZSc7XG5cbmltcG9ydCB7aW1hZ2VEYXRhRm9ybWF0fSBmcm9tICcuLi9iYWNrZW5kL2NvbW1vbic7XG5pbXBvcnQgKiBhcyBLIGZyb20gJy4uL2JhY2tlbmQvdGZqc19iYWNrZW5kJztcbmltcG9ydCB7Y2hlY2tEYXRhRm9ybWF0LCBjaGVja1BhZGRpbmdNb2RlLCBjaGVja1Bvb2xNb2RlfSBmcm9tICcuLi9jb21tb24nO1xuaW1wb3J0IHtJbnB1dFNwZWN9IGZyb20gJy4uL2VuZ2luZS90b3BvbG9neSc7XG5pbXBvcnQge0xheWVyLCBMYXllckFyZ3N9IGZyb20gJy4uL2VuZ2luZS90b3BvbG9neSc7XG5pbXBvcnQge05vdEltcGxlbWVudGVkRXJyb3IsIFZhbHVlRXJyb3J9IGZyb20gJy4uL2Vycm9ycyc7XG5pbXBvcnQge0RhdGFGb3JtYXQsIFBhZGRpbmdNb2RlLCBQb29sTW9kZSwgU2hhcGV9IGZyb20gJy4uL2tlcmFzX2Zvcm1hdC9jb21tb24nO1xuaW1wb3J0IHtLd2FyZ3N9IGZyb20gJy4uL3R5cGVzJztcbmltcG9ydCB7Y29udk91dHB1dExlbmd0aH0gZnJvbSAnLi4vdXRpbHMvY29udl91dGlscyc7XG5pbXBvcnQge2Fzc2VydFBvc2l0aXZlSW50ZWdlcn0gZnJvbSAnLi4vdXRpbHMvZ2VuZXJpY191dGlscyc7XG5pbXBvcnQge2dldEV4YWN0bHlPbmVTaGFwZSwgZ2V0RXhhY3RseU9uZVRlbnNvcn0gZnJvbSAnLi4vdXRpbHMvdHlwZXNfdXRpbHMnO1xuXG5pbXBvcnQge3ByZXByb2Nlc3NDb252MkRJbnB1dCwgcHJlcHJvY2Vzc0NvbnYzRElucHV0fSBmcm9tICcuL2NvbnZvbHV0aW9uYWwnO1xuXG4vKipcbiAqIDJEIHBvb2xpbmcuXG4gKiBAcGFyYW0geFxuICogQHBhcmFtIHBvb2xTaXplXG4gKiBAcGFyYW0gc3RyaWRlc2RlcyBzdHJpZGVzLiBEZWZhdWx0cyB0byBbMSwgMV0uXG4gKiBAcGFyYW0gcGFkZGluZyBwYWRkaW5nLiBEZWZhdWx0cyB0byAndmFsaWQnLlxuICogQHBhcmFtIGRhdGFGb3JtYXQgZGF0YSBmb3JtYXQuIERlZmF1bHRzIHRvICdjaGFubmVsc0xhc3QnLlxuICogQHBhcmFtIHBvb2xNb2RlIE1vZGUgb2YgcG9vbGluZy4gRGVmYXVsdHMgdG8gJ21heCcuXG4gKiBAcmV0dXJucyBSZXN1bHQgb2YgdGhlIDJEIHBvb2xpbmcuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBwb29sMmQoXG4gICAgeDogVGVuc29yLCBwb29sU2l6ZTogW251bWJlciwgbnVtYmVyXSwgc3RyaWRlcz86IFtudW1iZXIsIG51bWJlcl0sXG4gICAgcGFkZGluZz86IFBhZGRpbmdNb2RlLCBkYXRhRm9ybWF0PzogRGF0YUZvcm1hdCxcbiAgICBwb29sTW9kZT86IFBvb2xNb2RlKTogVGVuc29yIHtcbiAgcmV0dXJuIHRpZHkoKCkgPT4ge1xuICAgIGNoZWNrRGF0YUZvcm1hdChkYXRhRm9ybWF0KTtcbiAgICBjaGVja1Bvb2xNb2RlKHBvb2xNb2RlKTtcbiAgICBjaGVja1BhZGRpbmdNb2RlKHBhZGRpbmcpO1xuICAgIGlmIChzdHJpZGVzID09IG51bGwpIHtcbiAgICAgIHN0cmlkZXMgPSBbMSwgMV07XG4gICAgfVxuICAgIGlmIChwYWRkaW5nID09IG51bGwpIHtcbiAgICAgIHBhZGRpbmcgPSAndmFsaWQnO1xuICAgIH1cbiAgICBpZiAoZGF0YUZvcm1hdCA9PSBudWxsKSB7XG4gICAgICBkYXRhRm9ybWF0ID0gaW1hZ2VEYXRhRm9ybWF0KCk7XG4gICAgfVxuICAgIGlmIChwb29sTW9kZSA9PSBudWxsKSB7XG4gICAgICBwb29sTW9kZSA9ICdtYXgnO1xuICAgIH1cblxuICAgIC8vIFRPRE8oY2Fpcyk6IFJlbW92ZSB0aGUgcHJlcHJvY2Vzc2luZyBzdGVwIG9uY2UgZGVlcGxlYXJuLmpzIHN1cHBvcnRzXG4gICAgLy8gZGF0YUZvcm1hdCBhcyBhbiBpbnB1dCBhcmd1bWVudC5cbiAgICB4ID0gcHJlcHJvY2Vzc0NvbnYyRElucHV0KHgsIGRhdGFGb3JtYXQpOyAgLy8geCBpcyBOSFdDIGFmdGVyIHByZXByb2Nlc3NpbmcuXG4gICAgbGV0IHk6IFRlbnNvcjtcbiAgICBjb25zdCBwYWRkaW5nU3RyaW5nID0gKHBhZGRpbmcgPT09ICdzYW1lJykgPyAnc2FtZScgOiAndmFsaWQnO1xuICAgIGlmIChwb29sTW9kZSA9PT0gJ21heCcpIHtcbiAgICAgIC8vIFRPRE8oY2Fpcyk6IFJhbmsgY2hlY2s/XG4gICAgICB5ID0gdGZjLm1heFBvb2woeCBhcyBUZW5zb3I0RCwgcG9vbFNpemUsIHN0cmlkZXMsIHBhZGRpbmdTdHJpbmcpO1xuICAgIH0gZWxzZSB7ICAvLyAnYXZnJ1xuICAgICAgLy8gVE9ETyhjYWlzKTogQ2hlY2sgdGhlIGR0eXBlIGFuZCByYW5rIG9mIHggYW5kIGdpdmUgY2xlYXIgZXJyb3IgbWVzc2FnZVxuICAgICAgLy8gICBpZiB0aG9zZSBhcmUgaW5jb3JyZWN0LlxuICAgICAgeSA9IHRmYy5hdmdQb29sKFxuICAgICAgICAgIC8vIFRPRE8oY2Fpcyk6IFJhbmsgY2hlY2s/XG4gICAgICAgICAgeCBhcyBUZW5zb3IzRCB8IFRlbnNvcjRELCBwb29sU2l6ZSwgc3RyaWRlcywgcGFkZGluZ1N0cmluZyk7XG4gICAgfVxuICAgIGlmIChkYXRhRm9ybWF0ID09PSAnY2hhbm5lbHNGaXJzdCcpIHtcbiAgICAgIHkgPSB0ZmMudHJhbnNwb3NlKHksIFswLCAzLCAxLCAyXSk7ICAvLyBOSFdDIC0+IE5DSFcuXG4gICAgfVxuICAgIHJldHVybiB5O1xuICB9KTtcbn1cblxuLyoqXG4gKiAzRCBwb29saW5nLlxuICogQHBhcmFtIHhcbiAqIEBwYXJhbSBwb29sU2l6ZS4gRGVmYXVsdCB0byBbMSwgMSwgMV0uXG4gKiBAcGFyYW0gc3RyaWRlcyBzdHJpZGVzLiBEZWZhdWx0cyB0byBbMSwgMSwgMV0uXG4gKiBAcGFyYW0gcGFkZGluZyBwYWRkaW5nLiBEZWZhdWx0cyB0byAndmFsaWQnLlxuICogQHBhcmFtIGRhdGFGb3JtYXQgZGF0YSBmb3JtYXQuIERlZmF1bHRzIHRvICdjaGFubmVsc0xhc3QnLlxuICogQHBhcmFtIHBvb2xNb2RlIE1vZGUgb2YgcG9vbGluZy4gRGVmYXVsdHMgdG8gJ21heCcuXG4gKiBAcmV0dXJucyBSZXN1bHQgb2YgdGhlIDNEIHBvb2xpbmcuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBwb29sM2QoXG4gICAgeDogVGVuc29yNUQsIHBvb2xTaXplOiBbbnVtYmVyLCBudW1iZXIsIG51bWJlcl0sXG4gICAgc3RyaWRlcz86IFtudW1iZXIsIG51bWJlciwgbnVtYmVyXSwgcGFkZGluZz86IFBhZGRpbmdNb2RlLFxuICAgIGRhdGFGb3JtYXQ/OiBEYXRhRm9ybWF0LCBwb29sTW9kZT86IFBvb2xNb2RlKTogVGVuc29yIHtcbiAgcmV0dXJuIHRpZHkoKCkgPT4ge1xuICAgIGNoZWNrRGF0YUZvcm1hdChkYXRhRm9ybWF0KTtcbiAgICBjaGVja1Bvb2xNb2RlKHBvb2xNb2RlKTtcbiAgICBjaGVja1BhZGRpbmdNb2RlKHBhZGRpbmcpO1xuICAgIGlmIChzdHJpZGVzID09IG51bGwpIHtcbiAgICAgIHN0cmlkZXMgPSBbMSwgMSwgMV07XG4gICAgfVxuICAgIGlmIChwYWRkaW5nID09IG51bGwpIHtcbiAgICAgIHBhZGRpbmcgPSAndmFsaWQnO1xuICAgIH1cbiAgICBpZiAoZGF0YUZvcm1hdCA9PSBudWxsKSB7XG4gICAgICBkYXRhRm9ybWF0ID0gaW1hZ2VEYXRhRm9ybWF0KCk7XG4gICAgfVxuICAgIGlmIChwb29sTW9kZSA9PSBudWxsKSB7XG4gICAgICBwb29sTW9kZSA9ICdtYXgnO1xuICAgIH1cblxuICAgIC8vIHggaXMgTkRIV0MgYWZ0ZXIgcHJlcHJvY2Vzc2luZy5cbiAgICB4ID0gcHJlcHJvY2Vzc0NvbnYzRElucHV0KHggYXMgVGVuc29yLCBkYXRhRm9ybWF0KSBhcyBUZW5zb3I1RDtcbiAgICBsZXQgeTogVGVuc29yO1xuICAgIGNvbnN0IHBhZGRpbmdTdHJpbmcgPSAocGFkZGluZyA9PT0gJ3NhbWUnKSA/ICdzYW1lJyA6ICd2YWxpZCc7XG4gICAgaWYgKHBvb2xNb2RlID09PSAnbWF4Jykge1xuICAgICAgeSA9IHRmYy5tYXhQb29sM2QoeCwgcG9vbFNpemUsIHN0cmlkZXMsIHBhZGRpbmdTdHJpbmcpO1xuICAgIH0gZWxzZSB7ICAvLyAnYXZnJ1xuICAgICAgeSA9IHRmYy5hdmdQb29sM2QoeCwgcG9vbFNpemUsIHN0cmlkZXMsIHBhZGRpbmdTdHJpbmcpO1xuICAgIH1cbiAgICBpZiAoZGF0YUZvcm1hdCA9PT0gJ2NoYW5uZWxzRmlyc3QnKSB7XG4gICAgICB5ID0gdGZjLnRyYW5zcG9zZSh5LCBbMCwgNCwgMSwgMiwgM10pOyAgLy8gTkRIV0MgLT4gTkNESFcuXG4gICAgfVxuICAgIHJldHVybiB5O1xuICB9KTtcbn1cblxuZXhwb3J0IGRlY2xhcmUgaW50ZXJmYWNlIFBvb2xpbmcxRExheWVyQXJncyBleHRlbmRzIExheWVyQXJncyB7XG4gIC8qKlxuICAgKiBTaXplIG9mIHRoZSB3aW5kb3cgdG8gcG9vbCBvdmVyLCBzaG91bGQgYmUgYW4gaW50ZWdlci5cbiAgICovXG4gIHBvb2xTaXplPzogbnVtYmVyfFtudW1iZXJdO1xuICAvKipcbiAgICogUGVyaW9kIGF0IHdoaWNoIHRvIHNhbXBsZSB0aGUgcG9vbGVkIHZhbHVlcy5cbiAgICpcbiAgICogSWYgYG51bGxgLCBkZWZhdWx0cyB0byBgcG9vbFNpemVgLlxuICAgKi9cbiAgc3RyaWRlcz86IG51bWJlcnxbbnVtYmVyXTtcbiAgLyoqIEhvdyB0byBmaWxsIGluIGRhdGEgdGhhdCdzIG5vdCBhbiBpbnRlZ2VyIG11bHRpcGxlIG9mIHBvb2xTaXplLiAqL1xuICBwYWRkaW5nPzogUGFkZGluZ01vZGU7XG59XG5cbi8qKlxuICogQWJzdHJhY3QgY2xhc3MgZm9yIGRpZmZlcmVudCBwb29saW5nIDFEIGxheWVycy5cbiAqL1xuZXhwb3J0IGFic3RyYWN0IGNsYXNzIFBvb2xpbmcxRCBleHRlbmRzIExheWVyIHtcbiAgcHJvdGVjdGVkIHJlYWRvbmx5IHBvb2xTaXplOiBbbnVtYmVyXTtcbiAgcHJvdGVjdGVkIHJlYWRvbmx5IHN0cmlkZXM6IFtudW1iZXJdO1xuICBwcm90ZWN0ZWQgcmVhZG9ubHkgcGFkZGluZzogUGFkZGluZ01vZGU7XG5cbiAgLyoqXG4gICAqXG4gICAqIEBwYXJhbSBhcmdzIFBhcmFtZXRlcnMgZm9yIHRoZSBQb29saW5nIGxheWVyLlxuICAgKlxuICAgKiBjb25maWcucG9vbFNpemUgZGVmYXVsdHMgdG8gMi5cbiAgICovXG4gIGNvbnN0cnVjdG9yKGFyZ3M6IFBvb2xpbmcxRExheWVyQXJncykge1xuICAgIGlmIChhcmdzLnBvb2xTaXplID09IG51bGwpIHtcbiAgICAgIGFyZ3MucG9vbFNpemUgPSAyO1xuICAgIH1cbiAgICBzdXBlcihhcmdzKTtcbiAgICBpZiAodHlwZW9mIGFyZ3MucG9vbFNpemUgPT09ICdudW1iZXInKSB7XG4gICAgICB0aGlzLnBvb2xTaXplID0gW2FyZ3MucG9vbFNpemVdO1xuICAgIH0gZWxzZSBpZiAoXG4gICAgICAgIEFycmF5LmlzQXJyYXkoYXJncy5wb29sU2l6ZSkgJiZcbiAgICAgICAgKGFyZ3MucG9vbFNpemUgYXMgbnVtYmVyW10pLmxlbmd0aCA9PT0gMSAmJlxuICAgICAgICB0eXBlb2YgKGFyZ3MucG9vbFNpemUgYXMgbnVtYmVyW10pWzBdID09PSAnbnVtYmVyJykge1xuICAgICAgdGhpcy5wb29sU2l6ZSA9IGFyZ3MucG9vbFNpemU7XG4gICAgfSBlbHNlIHtcbiAgICAgIHRocm93IG5ldyBWYWx1ZUVycm9yKFxuICAgICAgICAgIGBwb29sU2l6ZSBmb3IgMUQgY29udm9sdXRpb25hbCBsYXllciBtdXN0IGJlIGEgbnVtYmVyIG9yIGFuIGAgK1xuICAgICAgICAgIGBBcnJheSBvZiBhIHNpbmdsZSBudW1iZXIsIGJ1dCByZWNlaXZlZCBgICtcbiAgICAgICAgICBgJHtKU09OLnN0cmluZ2lmeShhcmdzLnBvb2xTaXplKX1gKTtcbiAgICB9XG4gICAgYXNzZXJ0UG9zaXRpdmVJbnRlZ2VyKHRoaXMucG9vbFNpemUsICdwb29sU2l6ZScpO1xuICAgIGlmIChhcmdzLnN0cmlkZXMgPT0gbnVsbCkge1xuICAgICAgdGhpcy5zdHJpZGVzID0gdGhpcy5wb29sU2l6ZTtcbiAgICB9IGVsc2Uge1xuICAgICAgaWYgKHR5cGVvZiBhcmdzLnN0cmlkZXMgPT09ICdudW1iZXInKSB7XG4gICAgICAgIHRoaXMuc3RyaWRlcyA9IFthcmdzLnN0cmlkZXNdO1xuICAgICAgfSBlbHNlIGlmIChcbiAgICAgICAgICBBcnJheS5pc0FycmF5KGFyZ3Muc3RyaWRlcykgJiZcbiAgICAgICAgICAoYXJncy5zdHJpZGVzIGFzIG51bWJlcltdKS5sZW5ndGggPT09IDEgJiZcbiAgICAgICAgICB0eXBlb2YgKGFyZ3Muc3RyaWRlcyBhcyBudW1iZXJbXSlbMF0gPT09ICdudW1iZXInKSB7XG4gICAgICAgIHRoaXMuc3RyaWRlcyA9IGFyZ3Muc3RyaWRlcztcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHRocm93IG5ldyBWYWx1ZUVycm9yKFxuICAgICAgICAgICAgYHN0cmlkZXMgZm9yIDFEIGNvbnZvbHV0aW9uYWwgbGF5ZXIgbXVzdCBiZSBhIG51bWJlciBvciBhbiBgICtcbiAgICAgICAgICAgIGBBcnJheSBvZiBhIHNpbmdsZSBudW1iZXIsIGJ1dCByZWNlaXZlZCBgICtcbiAgICAgICAgICAgIGAke0pTT04uc3RyaW5naWZ5KGFyZ3Muc3RyaWRlcyl9YCk7XG4gICAgICB9XG4gICAgfVxuICAgIGFzc2VydFBvc2l0aXZlSW50ZWdlcih0aGlzLnN0cmlkZXMsICdzdHJpZGVzJyk7XG5cbiAgICB0aGlzLnBhZGRpbmcgPSBhcmdzLnBhZGRpbmcgPT0gbnVsbCA/ICd2YWxpZCcgOiBhcmdzLnBhZGRpbmc7XG4gICAgY2hlY2tQYWRkaW5nTW9kZSh0aGlzLnBhZGRpbmcpO1xuICAgIHRoaXMuaW5wdXRTcGVjID0gW25ldyBJbnB1dFNwZWMoe25kaW06IDN9KV07XG4gIH1cblxuICBjb21wdXRlT3V0cHV0U2hhcGUoaW5wdXRTaGFwZTogU2hhcGV8U2hhcGVbXSk6IFNoYXBlfFNoYXBlW10ge1xuICAgIGlucHV0U2hhcGUgPSBnZXRFeGFjdGx5T25lU2hhcGUoaW5wdXRTaGFwZSk7XG4gICAgY29uc3QgbGVuZ3RoID0gY29udk91dHB1dExlbmd0aChcbiAgICAgICAgaW5wdXRTaGFwZVsxXSwgdGhpcy5wb29sU2l6ZVswXSwgdGhpcy5wYWRkaW5nLCB0aGlzLnN0cmlkZXNbMF0pO1xuICAgIHJldHVybiBbaW5wdXRTaGFwZVswXSwgbGVuZ3RoLCBpbnB1dFNoYXBlWzJdXTtcbiAgfVxuXG4gIHByb3RlY3RlZCBhYnN0cmFjdCBwb29saW5nRnVuY3Rpb24oXG4gICAgICBpbnB1dHM6IFRlbnNvciwgcG9vbFNpemU6IFtudW1iZXIsIG51bWJlcl0sIHN0cmlkZXM6IFtudW1iZXIsIG51bWJlcl0sXG4gICAgICBwYWRkaW5nOiBQYWRkaW5nTW9kZSwgZGF0YUZvcm1hdDogRGF0YUZvcm1hdCk6IFRlbnNvcjtcblxuICBjYWxsKGlucHV0czogVGVuc29yfFRlbnNvcltdLCBrd2FyZ3M6IEt3YXJncyk6IFRlbnNvcnxUZW5zb3JbXSB7XG4gICAgcmV0dXJuIHRpZHkoKCkgPT4ge1xuICAgICAgdGhpcy5pbnZva2VDYWxsSG9vayhpbnB1dHMsIGt3YXJncyk7XG4gICAgICAvLyBBZGQgZHVtbXkgbGFzdCBkaW1lbnNpb24uXG4gICAgICBpbnB1dHMgPSBLLmV4cGFuZERpbXMoZ2V0RXhhY3RseU9uZVRlbnNvcihpbnB1dHMpLCAyKTtcbiAgICAgIGNvbnN0IG91dHB1dCA9IHRoaXMucG9vbGluZ0Z1bmN0aW9uKFxuICAgICAgICAgIGdldEV4YWN0bHlPbmVUZW5zb3IoaW5wdXRzKSwgW3RoaXMucG9vbFNpemVbMF0sIDFdLFxuICAgICAgICAgIFt0aGlzLnN0cmlkZXNbMF0sIDFdLCB0aGlzLnBhZGRpbmcsICdjaGFubmVsc0xhc3QnKTtcbiAgICAgIC8vIFJlbW92ZSBkdW1teSBsYXN0IGRpbWVuc2lvbi5cbiAgICAgIHJldHVybiB0ZmMuc3F1ZWV6ZShvdXRwdXQsIFsyXSk7XG4gICAgfSk7XG4gIH1cblxuICBnZXRDb25maWcoKTogc2VyaWFsaXphdGlvbi5Db25maWdEaWN0IHtcbiAgICBjb25zdCBjb25maWcgPSB7XG4gICAgICBwb29sU2l6ZTogdGhpcy5wb29sU2l6ZSxcbiAgICAgIHBhZGRpbmc6IHRoaXMucGFkZGluZyxcbiAgICAgIHN0cmlkZXM6IHRoaXMuc3RyaWRlcyxcbiAgICB9O1xuICAgIGNvbnN0IGJhc2VDb25maWcgPSBzdXBlci5nZXRDb25maWcoKTtcbiAgICBPYmplY3QuYXNzaWduKGNvbmZpZywgYmFzZUNvbmZpZyk7XG4gICAgcmV0dXJuIGNvbmZpZztcbiAgfVxufVxuXG5leHBvcnQgY2xhc3MgTWF4UG9vbGluZzFEIGV4dGVuZHMgUG9vbGluZzFEIHtcbiAgLyoqIEBub2NvbGxhcHNlICovXG4gIHN0YXRpYyBjbGFzc05hbWUgPSAnTWF4UG9vbGluZzFEJztcbiAgY29uc3RydWN0b3IoYXJnczogUG9vbGluZzFETGF5ZXJBcmdzKSB7XG4gICAgc3VwZXIoYXJncyk7XG4gIH1cblxuICBwcm90ZWN0ZWQgcG9vbGluZ0Z1bmN0aW9uKFxuICAgICAgaW5wdXRzOiBUZW5zb3IsIHBvb2xTaXplOiBbbnVtYmVyLCBudW1iZXJdLCBzdHJpZGVzOiBbbnVtYmVyLCBudW1iZXJdLFxuICAgICAgcGFkZGluZzogUGFkZGluZ01vZGUsIGRhdGFGb3JtYXQ6IERhdGFGb3JtYXQpOiBUZW5zb3Ige1xuICAgIGNoZWNrRGF0YUZvcm1hdChkYXRhRm9ybWF0KTtcbiAgICBjaGVja1BhZGRpbmdNb2RlKHBhZGRpbmcpO1xuICAgIHJldHVybiBwb29sMmQoaW5wdXRzLCBwb29sU2l6ZSwgc3RyaWRlcywgcGFkZGluZywgZGF0YUZvcm1hdCwgJ21heCcpO1xuICB9XG59XG5zZXJpYWxpemF0aW9uLnJlZ2lzdGVyQ2xhc3MoTWF4UG9vbGluZzFEKTtcblxuZXhwb3J0IGNsYXNzIEF2ZXJhZ2VQb29saW5nMUQgZXh0ZW5kcyBQb29saW5nMUQge1xuICAvKiogQG5vY29sbGFwc2UgKi9cbiAgc3RhdGljIGNsYXNzTmFtZSA9ICdBdmVyYWdlUG9vbGluZzFEJztcbiAgY29uc3RydWN0b3IoYXJnczogUG9vbGluZzFETGF5ZXJBcmdzKSB7XG4gICAgc3VwZXIoYXJncyk7XG4gIH1cblxuICBwcm90ZWN0ZWQgcG9vbGluZ0Z1bmN0aW9uKFxuICAgICAgaW5wdXRzOiBUZW5zb3IsIHBvb2xTaXplOiBbbnVtYmVyLCBudW1iZXJdLCBzdHJpZGVzOiBbbnVtYmVyLCBudW1iZXJdLFxuICAgICAgcGFkZGluZzogUGFkZGluZ01vZGUsIGRhdGFGb3JtYXQ6IERhdGFGb3JtYXQpOiBUZW5zb3Ige1xuICAgIGNoZWNrRGF0YUZvcm1hdChkYXRhRm9ybWF0KTtcbiAgICBjaGVja1BhZGRpbmdNb2RlKHBhZGRpbmcpO1xuICAgIHJldHVybiBwb29sMmQoaW5wdXRzLCBwb29sU2l6ZSwgc3RyaWRlcywgcGFkZGluZywgZGF0YUZvcm1hdCwgJ2F2ZycpO1xuICB9XG59XG5zZXJpYWxpemF0aW9uLnJlZ2lzdGVyQ2xhc3MoQXZlcmFnZVBvb2xpbmcxRCk7XG5cbmV4cG9ydCBkZWNsYXJlIGludGVyZmFjZSBQb29saW5nMkRMYXllckFyZ3MgZXh0ZW5kcyBMYXllckFyZ3Mge1xuICAvKipcbiAgICogRmFjdG9ycyBieSB3aGljaCB0byBkb3duc2NhbGUgaW4gZWFjaCBkaW1lbnNpb24gW3ZlcnRpY2FsLCBob3Jpem9udGFsXS5cbiAgICogRXhwZWN0cyBhbiBpbnRlZ2VyIG9yIGFuIGFycmF5IG9mIDIgaW50ZWdlcnMuXG4gICAqXG4gICAqIEZvciBleGFtcGxlLCBgWzIsIDJdYCB3aWxsIGhhbHZlIHRoZSBpbnB1dCBpbiBib3RoIHNwYXRpYWwgZGltZW5zaW9ucy5cbiAgICogSWYgb25seSBvbmUgaW50ZWdlciBpcyBzcGVjaWZpZWQsIHRoZSBzYW1lIHdpbmRvdyBsZW5ndGhcbiAgICogd2lsbCBiZSB1c2VkIGZvciBib3RoIGRpbWVuc2lvbnMuXG4gICAqL1xuICBwb29sU2l6ZT86IG51bWJlcnxbbnVtYmVyLCBudW1iZXJdO1xuXG4gIC8qKlxuICAgKiBUaGUgc2l6ZSBvZiB0aGUgc3RyaWRlIGluIGVhY2ggZGltZW5zaW9uIG9mIHRoZSBwb29saW5nIHdpbmRvdy4gRXhwZWN0c1xuICAgKiBhbiBpbnRlZ2VyIG9yIGFuIGFycmF5IG9mIDIgaW50ZWdlcnMuIEludGVnZXIsIHR1cGxlIG9mIDIgaW50ZWdlcnMsIG9yXG4gICAqIE5vbmUuXG4gICAqXG4gICAqIElmIGBudWxsYCwgZGVmYXVsdHMgdG8gYHBvb2xTaXplYC5cbiAgICovXG4gIHN0cmlkZXM/OiBudW1iZXJ8W251bWJlciwgbnVtYmVyXTtcblxuICAvKiogVGhlIHBhZGRpbmcgdHlwZSB0byB1c2UgZm9yIHRoZSBwb29saW5nIGxheWVyLiAqL1xuICBwYWRkaW5nPzogUGFkZGluZ01vZGU7XG4gIC8qKiBUaGUgZGF0YSBmb3JtYXQgdG8gdXNlIGZvciB0aGUgcG9vbGluZyBsYXllci4gKi9cbiAgZGF0YUZvcm1hdD86IERhdGFGb3JtYXQ7XG59XG5cbi8qKlxuICogQWJzdHJhY3QgY2xhc3MgZm9yIGRpZmZlcmVudCBwb29saW5nIDJEIGxheWVycy5cbiAqL1xuZXhwb3J0IGFic3RyYWN0IGNsYXNzIFBvb2xpbmcyRCBleHRlbmRzIExheWVyIHtcbiAgcHJvdGVjdGVkIHJlYWRvbmx5IHBvb2xTaXplOiBbbnVtYmVyLCBudW1iZXJdO1xuICBwcm90ZWN0ZWQgcmVhZG9ubHkgc3RyaWRlczogW251bWJlciwgbnVtYmVyXTtcbiAgcHJvdGVjdGVkIHJlYWRvbmx5IHBhZGRpbmc6IFBhZGRpbmdNb2RlO1xuICBwcm90ZWN0ZWQgcmVhZG9ubHkgZGF0YUZvcm1hdDogRGF0YUZvcm1hdDtcblxuICBjb25zdHJ1Y3RvcihhcmdzOiBQb29saW5nMkRMYXllckFyZ3MpIHtcbiAgICBpZiAoYXJncy5wb29sU2l6ZSA9PSBudWxsKSB7XG4gICAgICBhcmdzLnBvb2xTaXplID0gWzIsIDJdO1xuICAgIH1cbiAgICBzdXBlcihhcmdzKTtcbiAgICB0aGlzLnBvb2xTaXplID0gQXJyYXkuaXNBcnJheShhcmdzLnBvb2xTaXplKSA/XG4gICAgICAgIGFyZ3MucG9vbFNpemUgOlxuICAgICAgICBbYXJncy5wb29sU2l6ZSwgYXJncy5wb29sU2l6ZV07XG4gICAgaWYgKGFyZ3Muc3RyaWRlcyA9PSBudWxsKSB7XG4gICAgICB0aGlzLnN0cmlkZXMgPSB0aGlzLnBvb2xTaXplO1xuICAgIH0gZWxzZSBpZiAoQXJyYXkuaXNBcnJheShhcmdzLnN0cmlkZXMpKSB7XG4gICAgICBpZiAoYXJncy5zdHJpZGVzLmxlbmd0aCAhPT0gMikge1xuICAgICAgICB0aHJvdyBuZXcgVmFsdWVFcnJvcihcbiAgICAgICAgICAgIGBJZiB0aGUgc3RyaWRlcyBwcm9wZXJ0eSBvZiBhIDJEIHBvb2xpbmcgbGF5ZXIgaXMgYW4gQXJyYXksIGAgK1xuICAgICAgICAgICAgYGl0IGlzIGV4cGVjdGVkIHRvIGhhdmUgYSBsZW5ndGggb2YgMiwgYnV0IHJlY2VpdmVkIGxlbmd0aCBgICtcbiAgICAgICAgICAgIGAke2FyZ3Muc3RyaWRlcy5sZW5ndGh9LmApO1xuICAgICAgfVxuICAgICAgdGhpcy5zdHJpZGVzID0gYXJncy5zdHJpZGVzO1xuICAgIH0gZWxzZSB7XG4gICAgICAvLyBgY29uZmlnLnN0cmlkZXNgIGlzIGEgbnVtYmVyLlxuICAgICAgdGhpcy5zdHJpZGVzID0gW2FyZ3Muc3RyaWRlcywgYXJncy5zdHJpZGVzXTtcbiAgICB9XG4gICAgYXNzZXJ0UG9zaXRpdmVJbnRlZ2VyKHRoaXMucG9vbFNpemUsICdwb29sU2l6ZScpO1xuICAgIGFzc2VydFBvc2l0aXZlSW50ZWdlcih0aGlzLnN0cmlkZXMsICdzdHJpZGVzJyk7XG4gICAgdGhpcy5wYWRkaW5nID0gYXJncy5wYWRkaW5nID09IG51bGwgPyAndmFsaWQnIDogYXJncy5wYWRkaW5nO1xuICAgIHRoaXMuZGF0YUZvcm1hdCA9XG4gICAgICAgIGFyZ3MuZGF0YUZvcm1hdCA9PSBudWxsID8gJ2NoYW5uZWxzTGFzdCcgOiBhcmdzLmRhdGFGb3JtYXQ7XG4gICAgY2hlY2tEYXRhRm9ybWF0KHRoaXMuZGF0YUZvcm1hdCk7XG4gICAgY2hlY2tQYWRkaW5nTW9kZSh0aGlzLnBhZGRpbmcpO1xuXG4gICAgdGhpcy5pbnB1dFNwZWMgPSBbbmV3IElucHV0U3BlYyh7bmRpbTogNH0pXTtcbiAgfVxuXG4gIGNvbXB1dGVPdXRwdXRTaGFwZShpbnB1dFNoYXBlOiBTaGFwZXxTaGFwZVtdKTogU2hhcGV8U2hhcGVbXSB7XG4gICAgaW5wdXRTaGFwZSA9IGdldEV4YWN0bHlPbmVTaGFwZShpbnB1dFNoYXBlKTtcbiAgICBsZXQgcm93cyA9XG4gICAgICAgIHRoaXMuZGF0YUZvcm1hdCA9PT0gJ2NoYW5uZWxzRmlyc3QnID8gaW5wdXRTaGFwZVsyXSA6IGlucHV0U2hhcGVbMV07XG4gICAgbGV0IGNvbHMgPVxuICAgICAgICB0aGlzLmRhdGFGb3JtYXQgPT09ICdjaGFubmVsc0ZpcnN0JyA/IGlucHV0U2hhcGVbM10gOiBpbnB1dFNoYXBlWzJdO1xuICAgIHJvd3MgPVxuICAgICAgICBjb252T3V0cHV0TGVuZ3RoKHJvd3MsIHRoaXMucG9vbFNpemVbMF0sIHRoaXMucGFkZGluZywgdGhpcy5zdHJpZGVzWzBdKTtcbiAgICBjb2xzID1cbiAgICAgICAgY29udk91dHB1dExlbmd0aChjb2xzLCB0aGlzLnBvb2xTaXplWzFdLCB0aGlzLnBhZGRpbmcsIHRoaXMuc3RyaWRlc1sxXSk7XG4gICAgaWYgKHRoaXMuZGF0YUZvcm1hdCA9PT0gJ2NoYW5uZWxzRmlyc3QnKSB7XG4gICAgICByZXR1cm4gW2lucHV0U2hhcGVbMF0sIGlucHV0U2hhcGVbMV0sIHJvd3MsIGNvbHNdO1xuICAgIH0gZWxzZSB7XG4gICAgICByZXR1cm4gW2lucHV0U2hhcGVbMF0sIHJvd3MsIGNvbHMsIGlucHV0U2hhcGVbM11dO1xuICAgIH1cbiAgfVxuXG4gIHByb3RlY3RlZCBhYnN0cmFjdCBwb29saW5nRnVuY3Rpb24oXG4gICAgICBpbnB1dHM6IFRlbnNvciwgcG9vbFNpemU6IFtudW1iZXIsIG51bWJlcl0sIHN0cmlkZXM6IFtudW1iZXIsIG51bWJlcl0sXG4gICAgICBwYWRkaW5nOiBQYWRkaW5nTW9kZSwgZGF0YUZvcm1hdDogRGF0YUZvcm1hdCk6IFRlbnNvcjtcblxuICBjYWxsKGlucHV0czogVGVuc29yfFRlbnNvcltdLCBrd2FyZ3M6IEt3YXJncyk6IFRlbnNvcnxUZW5zb3JbXSB7XG4gICAgcmV0dXJuIHRpZHkoKCkgPT4ge1xuICAgICAgdGhpcy5pbnZva2VDYWxsSG9vayhpbnB1dHMsIGt3YXJncyk7XG4gICAgICByZXR1cm4gdGhpcy5wb29saW5nRnVuY3Rpb24oXG4gICAgICAgICAgZ2V0RXhhY3RseU9uZVRlbnNvcihpbnB1dHMpLCB0aGlzLnBvb2xTaXplLCB0aGlzLnN0cmlkZXMsXG4gICAgICAgICAgdGhpcy5wYWRkaW5nLCB0aGlzLmRhdGFGb3JtYXQpO1xuICAgIH0pO1xuICB9XG5cbiAgZ2V0Q29uZmlnKCk6IHNlcmlhbGl6YXRpb24uQ29uZmlnRGljdCB7XG4gICAgY29uc3QgY29uZmlnID0ge1xuICAgICAgcG9vbFNpemU6IHRoaXMucG9vbFNpemUsXG4gICAgICBwYWRkaW5nOiB0aGlzLnBhZGRpbmcsXG4gICAgICBzdHJpZGVzOiB0aGlzLnN0cmlkZXMsXG4gICAgICBkYXRhRm9ybWF0OiB0aGlzLmRhdGFGb3JtYXRcbiAgICB9O1xuICAgIGNvbnN0IGJhc2VDb25maWcgPSBzdXBlci5nZXRDb25maWcoKTtcbiAgICBPYmplY3QuYXNzaWduKGNvbmZpZywgYmFzZUNvbmZpZyk7XG4gICAgcmV0dXJuIGNvbmZpZztcbiAgfVxufVxuXG5leHBvcnQgY2xhc3MgTWF4UG9vbGluZzJEIGV4dGVuZHMgUG9vbGluZzJEIHtcbiAgLyoqIEBub2NvbGxhcHNlICovXG4gIHN0YXRpYyBjbGFzc05hbWUgPSAnTWF4UG9vbGluZzJEJztcbiAgY29uc3RydWN0b3IoYXJnczogUG9vbGluZzJETGF5ZXJBcmdzKSB7XG4gICAgc3VwZXIoYXJncyk7XG4gIH1cblxuICBwcm90ZWN0ZWQgcG9vbGluZ0Z1bmN0aW9uKFxuICAgICAgaW5wdXRzOiBUZW5zb3IsIHBvb2xTaXplOiBbbnVtYmVyLCBudW1iZXJdLCBzdHJpZGVzOiBbbnVtYmVyLCBudW1iZXJdLFxuICAgICAgcGFkZGluZzogUGFkZGluZ01vZGUsIGRhdGFGb3JtYXQ6IERhdGFGb3JtYXQpOiBUZW5zb3Ige1xuICAgIGNoZWNrRGF0YUZvcm1hdChkYXRhRm9ybWF0KTtcbiAgICBjaGVja1BhZGRpbmdNb2RlKHBhZGRpbmcpO1xuICAgIHJldHVybiBwb29sMmQoaW5wdXRzLCBwb29sU2l6ZSwgc3RyaWRlcywgcGFkZGluZywgZGF0YUZvcm1hdCwgJ21heCcpO1xuICB9XG59XG5zZXJpYWxpemF0aW9uLnJlZ2lzdGVyQ2xhc3MoTWF4UG9vbGluZzJEKTtcblxuZXhwb3J0IGNsYXNzIEF2ZXJhZ2VQb29saW5nMkQgZXh0ZW5kcyBQb29saW5nMkQge1xuICAvKiogQG5vY29sbGFwc2UgKi9cbiAgc3RhdGljIGNsYXNzTmFtZSA9ICdBdmVyYWdlUG9vbGluZzJEJztcbiAgY29uc3RydWN0b3IoYXJnczogUG9vbGluZzJETGF5ZXJBcmdzKSB7XG4gICAgc3VwZXIoYXJncyk7XG4gIH1cblxuICBwcm90ZWN0ZWQgcG9vbGluZ0Z1bmN0aW9uKFxuICAgICAgaW5wdXRzOiBUZW5zb3IsIHBvb2xTaXplOiBbbnVtYmVyLCBudW1iZXJdLCBzdHJpZGVzOiBbbnVtYmVyLCBudW1iZXJdLFxuICAgICAgcGFkZGluZzogUGFkZGluZ01vZGUsIGRhdGFGb3JtYXQ6IERhdGFGb3JtYXQpOiBUZW5zb3Ige1xuICAgIGNoZWNrRGF0YUZvcm1hdChkYXRhRm9ybWF0KTtcbiAgICBjaGVja1BhZGRpbmdNb2RlKHBhZGRpbmcpO1xuICAgIHJldHVybiBwb29sMmQoaW5wdXRzLCBwb29sU2l6ZSwgc3RyaWRlcywgcGFkZGluZywgZGF0YUZvcm1hdCwgJ2F2ZycpO1xuICB9XG59XG5zZXJpYWxpemF0aW9uLnJlZ2lzdGVyQ2xhc3MoQXZlcmFnZVBvb2xpbmcyRCk7XG5cbmV4cG9ydCBkZWNsYXJlIGludGVyZmFjZSBQb29saW5nM0RMYXllckFyZ3MgZXh0ZW5kcyBMYXllckFyZ3Mge1xuICAvKipcbiAgICogRmFjdG9ycyBieSB3aGljaCB0byBkb3duc2NhbGUgaW4gZWFjaCBkaW1lbnNpb24gW2RlcHRoLCBoZWlnaHQsIHdpZHRoXS5cbiAgICogRXhwZWN0cyBhbiBpbnRlZ2VyIG9yIGFuIGFycmF5IG9mIDMgaW50ZWdlcnMuXG4gICAqXG4gICAqIEZvciBleGFtcGxlLCBgWzIsIDIsIDJdYCB3aWxsIGhhbHZlIHRoZSBpbnB1dCBpbiB0aHJlZSBkaW1lbnNpb25zLlxuICAgKiBJZiBvbmx5IG9uZSBpbnRlZ2VyIGlzIHNwZWNpZmllZCwgdGhlIHNhbWUgd2luZG93IGxlbmd0aFxuICAgKiB3aWxsIGJlIHVzZWQgZm9yIGFsbCBkaW1lbnNpb25zLlxuICAgKi9cbiAgcG9vbFNpemU/OiBudW1iZXJ8W251bWJlciwgbnVtYmVyLCBudW1iZXJdO1xuXG4gIC8qKlxuICAgKiBUaGUgc2l6ZSBvZiB0aGUgc3RyaWRlIGluIGVhY2ggZGltZW5zaW9uIG9mIHRoZSBwb29saW5nIHdpbmRvdy4gRXhwZWN0c1xuICAgKiBhbiBpbnRlZ2VyIG9yIGFuIGFycmF5IG9mIDMgaW50ZWdlcnMuIEludGVnZXIsIHR1cGxlIG9mIDMgaW50ZWdlcnMsIG9yXG4gICAqIE5vbmUuXG4gICAqXG4gICAqIElmIGBudWxsYCwgZGVmYXVsdHMgdG8gYHBvb2xTaXplYC5cbiAgICovXG4gIHN0cmlkZXM/OiBudW1iZXJ8W251bWJlciwgbnVtYmVyLCBudW1iZXJdO1xuXG4gIC8qKiBUaGUgcGFkZGluZyB0eXBlIHRvIHVzZSBmb3IgdGhlIHBvb2xpbmcgbGF5ZXIuICovXG4gIHBhZGRpbmc/OiBQYWRkaW5nTW9kZTtcbiAgLyoqIFRoZSBkYXRhIGZvcm1hdCB0byB1c2UgZm9yIHRoZSBwb29saW5nIGxheWVyLiAqL1xuICBkYXRhRm9ybWF0PzogRGF0YUZvcm1hdDtcbn1cblxuLyoqXG4gKiBBYnN0cmFjdCBjbGFzcyBmb3IgZGlmZmVyZW50IHBvb2xpbmcgM0QgbGF5ZXJzLlxuICovXG5leHBvcnQgYWJzdHJhY3QgY2xhc3MgUG9vbGluZzNEIGV4dGVuZHMgTGF5ZXIge1xuICBwcm90ZWN0ZWQgcmVhZG9ubHkgcG9vbFNpemU6IFtudW1iZXIsIG51bWJlciwgbnVtYmVyXTtcbiAgcHJvdGVjdGVkIHJlYWRvbmx5IHN0cmlkZXM6IFtudW1iZXIsIG51bWJlciwgbnVtYmVyXTtcbiAgcHJvdGVjdGVkIHJlYWRvbmx5IHBhZGRpbmc6IFBhZGRpbmdNb2RlO1xuICBwcm90ZWN0ZWQgcmVhZG9ubHkgZGF0YUZvcm1hdDogRGF0YUZvcm1hdDtcblxuICBjb25zdHJ1Y3RvcihhcmdzOiBQb29saW5nM0RMYXllckFyZ3MpIHtcbiAgICBpZiAoYXJncy5wb29sU2l6ZSA9PSBudWxsKSB7XG4gICAgICBhcmdzLnBvb2xTaXplID0gWzIsIDIsIDJdO1xuICAgIH1cbiAgICBzdXBlcihhcmdzKTtcbiAgICB0aGlzLnBvb2xTaXplID0gQXJyYXkuaXNBcnJheShhcmdzLnBvb2xTaXplKSA/XG4gICAgICAgIGFyZ3MucG9vbFNpemUgOlxuICAgICAgICBbYXJncy5wb29sU2l6ZSwgYXJncy5wb29sU2l6ZSwgYXJncy5wb29sU2l6ZV07XG4gICAgaWYgKGFyZ3Muc3RyaWRlcyA9PSBudWxsKSB7XG4gICAgICB0aGlzLnN0cmlkZXMgPSB0aGlzLnBvb2xTaXplO1xuICAgIH0gZWxzZSBpZiAoQXJyYXkuaXNBcnJheShhcmdzLnN0cmlkZXMpKSB7XG4gICAgICBpZiAoYXJncy5zdHJpZGVzLmxlbmd0aCAhPT0gMykge1xuICAgICAgICB0aHJvdyBuZXcgVmFsdWVFcnJvcihcbiAgICAgICAgICAgIGBJZiB0aGUgc3RyaWRlcyBwcm9wZXJ0eSBvZiBhIDNEIHBvb2xpbmcgbGF5ZXIgaXMgYW4gQXJyYXksIGAgK1xuICAgICAgICAgICAgYGl0IGlzIGV4cGVjdGVkIHRvIGhhdmUgYSBsZW5ndGggb2YgMywgYnV0IHJlY2VpdmVkIGxlbmd0aCBgICtcbiAgICAgICAgICAgIGAke2FyZ3Muc3RyaWRlcy5sZW5ndGh9LmApO1xuICAgICAgfVxuICAgICAgdGhpcy5zdHJpZGVzID0gYXJncy5zdHJpZGVzO1xuICAgIH0gZWxzZSB7XG4gICAgICAvLyBgY29uZmlnLnN0cmlkZXNgIGlzIGEgbnVtYmVyLlxuICAgICAgdGhpcy5zdHJpZGVzID0gW2FyZ3Muc3RyaWRlcywgYXJncy5zdHJpZGVzLCBhcmdzLnN0cmlkZXNdO1xuICAgIH1cbiAgICBhc3NlcnRQb3NpdGl2ZUludGVnZXIodGhpcy5wb29sU2l6ZSwgJ3Bvb2xTaXplJyk7XG4gICAgYXNzZXJ0UG9zaXRpdmVJbnRlZ2VyKHRoaXMuc3RyaWRlcywgJ3N0cmlkZXMnKTtcbiAgICB0aGlzLnBhZGRpbmcgPSBhcmdzLnBhZGRpbmcgPT0gbnVsbCA/ICd2YWxpZCcgOiBhcmdzLnBhZGRpbmc7XG4gICAgdGhpcy5kYXRhRm9ybWF0ID1cbiAgICAgICAgYXJncy5kYXRhRm9ybWF0ID09IG51bGwgPyAnY2hhbm5lbHNMYXN0JyA6IGFyZ3MuZGF0YUZvcm1hdDtcbiAgICBjaGVja0RhdGFGb3JtYXQodGhpcy5kYXRhRm9ybWF0KTtcbiAgICBjaGVja1BhZGRpbmdNb2RlKHRoaXMucGFkZGluZyk7XG5cbiAgICB0aGlzLmlucHV0U3BlYyA9IFtuZXcgSW5wdXRTcGVjKHtuZGltOiA1fSldO1xuICB9XG5cbiAgY29tcHV0ZU91dHB1dFNoYXBlKGlucHV0U2hhcGU6IFNoYXBlfFNoYXBlW10pOiBTaGFwZXxTaGFwZVtdIHtcbiAgICBpbnB1dFNoYXBlID0gZ2V0RXhhY3RseU9uZVNoYXBlKGlucHV0U2hhcGUpO1xuICAgIGxldCBkZXB0aHMgPVxuICAgICAgICB0aGlzLmRhdGFGb3JtYXQgPT09ICdjaGFubmVsc0ZpcnN0JyA/IGlucHV0U2hhcGVbMl0gOiBpbnB1dFNoYXBlWzFdO1xuICAgIGxldCByb3dzID1cbiAgICAgICAgdGhpcy5kYXRhRm9ybWF0ID09PSAnY2hhbm5lbHNGaXJzdCcgPyBpbnB1dFNoYXBlWzNdIDogaW5wdXRTaGFwZVsyXTtcbiAgICBsZXQgY29scyA9XG4gICAgICAgIHRoaXMuZGF0YUZvcm1hdCA9PT0gJ2NoYW5uZWxzRmlyc3QnID8gaW5wdXRTaGFwZVs0XSA6IGlucHV0U2hhcGVbM107XG4gICAgZGVwdGhzID0gY29udk91dHB1dExlbmd0aChcbiAgICAgICAgZGVwdGhzLCB0aGlzLnBvb2xTaXplWzBdLCB0aGlzLnBhZGRpbmcsIHRoaXMuc3RyaWRlc1swXSk7XG4gICAgcm93cyA9XG4gICAgICAgIGNvbnZPdXRwdXRMZW5ndGgocm93cywgdGhpcy5wb29sU2l6ZVsxXSwgdGhpcy5wYWRkaW5nLCB0aGlzLnN0cmlkZXNbMV0pO1xuICAgIGNvbHMgPVxuICAgICAgICBjb252T3V0cHV0TGVuZ3RoKGNvbHMsIHRoaXMucG9vbFNpemVbMl0sIHRoaXMucGFkZGluZywgdGhpcy5zdHJpZGVzWzJdKTtcbiAgICBpZiAodGhpcy5kYXRhRm9ybWF0ID09PSAnY2hhbm5lbHNGaXJzdCcpIHtcbiAgICAgIHJldHVybiBbaW5wdXRTaGFwZVswXSwgaW5wdXRTaGFwZVsxXSwgZGVwdGhzLCByb3dzLCBjb2xzXTtcbiAgICB9IGVsc2Uge1xuICAgICAgcmV0dXJuIFtpbnB1dFNoYXBlWzBdLCBkZXB0aHMsIHJvd3MsIGNvbHMsIGlucHV0U2hhcGVbNF1dO1xuICAgIH1cbiAgfVxuXG4gIHByb3RlY3RlZCBhYnN0cmFjdCBwb29saW5nRnVuY3Rpb24oXG4gICAgICBpbnB1dHM6IFRlbnNvciwgcG9vbFNpemU6IFtudW1iZXIsIG51bWJlciwgbnVtYmVyXSxcbiAgICAgIHN0cmlkZXM6IFtudW1iZXIsIG51bWJlciwgbnVtYmVyXSwgcGFkZGluZzogUGFkZGluZ01vZGUsXG4gICAgICBkYXRhRm9ybWF0OiBEYXRhRm9ybWF0KTogVGVuc29yO1xuXG4gIGNhbGwoaW5wdXRzOiBUZW5zb3J8VGVuc29yW10sIGt3YXJnczogS3dhcmdzKTogVGVuc29yfFRlbnNvcltdIHtcbiAgICByZXR1cm4gdGlkeSgoKSA9PiB7XG4gICAgICB0aGlzLmludm9rZUNhbGxIb29rKGlucHV0cywga3dhcmdzKTtcbiAgICAgIHJldHVybiB0aGlzLnBvb2xpbmdGdW5jdGlvbihcbiAgICAgICAgICBnZXRFeGFjdGx5T25lVGVuc29yKGlucHV0cyksIHRoaXMucG9vbFNpemUsIHRoaXMuc3RyaWRlcyxcbiAgICAgICAgICB0aGlzLnBhZGRpbmcsIHRoaXMuZGF0YUZvcm1hdCk7XG4gICAgfSk7XG4gIH1cblxuICBnZXRDb25maWcoKTogc2VyaWFsaXphdGlvbi5Db25maWdEaWN0IHtcbiAgICBjb25zdCBjb25maWcgPSB7XG4gICAgICBwb29sU2l6ZTogdGhpcy5wb29sU2l6ZSxcbiAgICAgIHBhZGRpbmc6IHRoaXMucGFkZGluZyxcbiAgICAgIHN0cmlkZXM6IHRoaXMuc3RyaWRlcyxcbiAgICAgIGRhdGFGb3JtYXQ6IHRoaXMuZGF0YUZvcm1hdFxuICAgIH07XG4gICAgY29uc3QgYmFzZUNvbmZpZyA9IHN1cGVyLmdldENvbmZpZygpO1xuICAgIE9iamVjdC5hc3NpZ24oY29uZmlnLCBiYXNlQ29uZmlnKTtcbiAgICByZXR1cm4gY29uZmlnO1xuICB9XG59XG5cbmV4cG9ydCBjbGFzcyBNYXhQb29saW5nM0QgZXh0ZW5kcyBQb29saW5nM0Qge1xuICAvKiogQG5vY29sbGFwc2UgKi9cbiAgc3RhdGljIGNsYXNzTmFtZSA9ICdNYXhQb29saW5nM0QnO1xuICBjb25zdHJ1Y3RvcihhcmdzOiBQb29saW5nM0RMYXllckFyZ3MpIHtcbiAgICBzdXBlcihhcmdzKTtcbiAgfVxuXG4gIHByb3RlY3RlZCBwb29saW5nRnVuY3Rpb24oXG4gICAgICBpbnB1dHM6IFRlbnNvciwgcG9vbFNpemU6IFtudW1iZXIsIG51bWJlciwgbnVtYmVyXSxcbiAgICAgIHN0cmlkZXM6IFtudW1iZXIsIG51bWJlciwgbnVtYmVyXSwgcGFkZGluZzogUGFkZGluZ01vZGUsXG4gICAgICBkYXRhRm9ybWF0OiBEYXRhRm9ybWF0KTogVGVuc29yIHtcbiAgICBjaGVja0RhdGFGb3JtYXQoZGF0YUZvcm1hdCk7XG4gICAgY2hlY2tQYWRkaW5nTW9kZShwYWRkaW5nKTtcbiAgICByZXR1cm4gcG9vbDNkKFxuICAgICAgICBpbnB1dHMgYXMgVGVuc29yNUQsIHBvb2xTaXplLCBzdHJpZGVzLCBwYWRkaW5nLCBkYXRhRm9ybWF0LCAnbWF4Jyk7XG4gIH1cbn1cbnNlcmlhbGl6YXRpb24ucmVnaXN0ZXJDbGFzcyhNYXhQb29saW5nM0QpO1xuXG5leHBvcnQgY2xhc3MgQXZlcmFnZVBvb2xpbmczRCBleHRlbmRzIFBvb2xpbmczRCB7XG4gIC8qKiBAbm9jb2xsYXBzZSAqL1xuICBzdGF0aWMgY2xhc3NOYW1lID0gJ0F2ZXJhZ2VQb29saW5nM0QnO1xuICBjb25zdHJ1Y3RvcihhcmdzOiBQb29saW5nM0RMYXllckFyZ3MpIHtcbiAgICBzdXBlcihhcmdzKTtcbiAgfVxuXG4gIHByb3RlY3RlZCBwb29saW5nRnVuY3Rpb24oXG4gICAgICBpbnB1dHM6IFRlbnNvciwgcG9vbFNpemU6IFtudW1iZXIsIG51bWJlciwgbnVtYmVyXSxcbiAgICAgIHN0cmlkZXM6IFtudW1iZXIsIG51bWJlciwgbnVtYmVyXSwgcGFkZGluZzogUGFkZGluZ01vZGUsXG4gICAgICBkYXRhRm9ybWF0OiBEYXRhRm9ybWF0KTogVGVuc29yIHtcbiAgICBjaGVja0RhdGFGb3JtYXQoZGF0YUZvcm1hdCk7XG4gICAgY2hlY2tQYWRkaW5nTW9kZShwYWRkaW5nKTtcbiAgICByZXR1cm4gcG9vbDNkKFxuICAgICAgICBpbnB1dHMgYXMgVGVuc29yNUQsIHBvb2xTaXplLCBzdHJpZGVzLCBwYWRkaW5nLCBkYXRhRm9ybWF0LCAnYXZnJyk7XG4gIH1cbn1cbnNlcmlhbGl6YXRpb24ucmVnaXN0ZXJDbGFzcyhBdmVyYWdlUG9vbGluZzNEKTtcblxuLyoqXG4gKiBBYnN0cmFjdCBjbGFzcyBmb3IgZGlmZmVyZW50IGdsb2JhbCBwb29saW5nIDFEIGxheWVycy5cbiAqL1xuZXhwb3J0IGFic3RyYWN0IGNsYXNzIEdsb2JhbFBvb2xpbmcxRCBleHRlbmRzIExheWVyIHtcbiAgY29uc3RydWN0b3IoYXJnczogTGF5ZXJBcmdzKSB7XG4gICAgc3VwZXIoYXJncyk7XG4gICAgdGhpcy5pbnB1dFNwZWMgPSBbbmV3IElucHV0U3BlYyh7bmRpbTogM30pXTtcbiAgfVxuXG4gIGNvbXB1dGVPdXRwdXRTaGFwZShpbnB1dFNoYXBlOiBTaGFwZSk6IFNoYXBlIHtcbiAgICByZXR1cm4gW2lucHV0U2hhcGVbMF0sIGlucHV0U2hhcGVbMl1dO1xuICB9XG5cbiAgY2FsbChpbnB1dHM6IFRlbnNvcnxUZW5zb3JbXSwga3dhcmdzOiBLd2FyZ3MpOiBUZW5zb3J8VGVuc29yW10ge1xuICAgIHRocm93IG5ldyBOb3RJbXBsZW1lbnRlZEVycm9yKCk7XG4gIH1cbn1cblxuZXhwb3J0IGNsYXNzIEdsb2JhbEF2ZXJhZ2VQb29saW5nMUQgZXh0ZW5kcyBHbG9iYWxQb29saW5nMUQge1xuICAvKiogQG5vY29sbGFwc2UgKi9cbiAgc3RhdGljIGNsYXNzTmFtZSA9ICdHbG9iYWxBdmVyYWdlUG9vbGluZzFEJztcbiAgY29uc3RydWN0b3IoYXJncz86IExheWVyQXJncykge1xuICAgIHN1cGVyKGFyZ3MgfHwge30pO1xuICB9XG5cbiAgY2FsbChpbnB1dHM6IFRlbnNvcnxUZW5zb3JbXSwga3dhcmdzOiBLd2FyZ3MpOiBUZW5zb3J8VGVuc29yW10ge1xuICAgIHJldHVybiB0aWR5KCgpID0+IHtcbiAgICAgIGNvbnN0IGlucHV0ID0gZ2V0RXhhY3RseU9uZVRlbnNvcihpbnB1dHMpO1xuICAgICAgcmV0dXJuIHRmYy5tZWFuKGlucHV0LCAxKTtcbiAgICB9KTtcbiAgfVxufVxuc2VyaWFsaXphdGlvbi5yZWdpc3RlckNsYXNzKEdsb2JhbEF2ZXJhZ2VQb29saW5nMUQpO1xuXG5leHBvcnQgY2xhc3MgR2xvYmFsTWF4UG9vbGluZzFEIGV4dGVuZHMgR2xvYmFsUG9vbGluZzFEIHtcbiAgLyoqIEBub2NvbGxhcHNlICovXG4gIHN0YXRpYyBjbGFzc05hbWUgPSAnR2xvYmFsTWF4UG9vbGluZzFEJztcbiAgY29uc3RydWN0b3IoYXJnczogTGF5ZXJBcmdzKSB7XG4gICAgc3VwZXIoYXJncyB8fCB7fSk7XG4gIH1cblxuICBjYWxsKGlucHV0czogVGVuc29yfFRlbnNvcltdLCBrd2FyZ3M6IEt3YXJncyk6IFRlbnNvcnxUZW5zb3JbXSB7XG4gICAgcmV0dXJuIHRpZHkoKCkgPT4ge1xuICAgICAgY29uc3QgaW5wdXQgPSBnZXRFeGFjdGx5T25lVGVuc29yKGlucHV0cyk7XG4gICAgICByZXR1cm4gdGZjLm1heChpbnB1dCwgMSk7XG4gICAgfSk7XG4gIH1cbn1cbnNlcmlhbGl6YXRpb24ucmVnaXN0ZXJDbGFzcyhHbG9iYWxNYXhQb29saW5nMUQpO1xuXG5leHBvcnQgZGVjbGFyZSBpbnRlcmZhY2UgR2xvYmFsUG9vbGluZzJETGF5ZXJBcmdzIGV4dGVuZHMgTGF5ZXJBcmdzIHtcbiAgLyoqXG4gICAqIE9uZSBvZiBgQ0hBTk5FTF9MQVNUYCAoZGVmYXVsdCkgb3IgYENIQU5ORUxfRklSU1RgLlxuICAgKlxuICAgKiBUaGUgb3JkZXJpbmcgb2YgdGhlIGRpbWVuc2lvbnMgaW4gdGhlIGlucHV0cy4gYENIQU5ORUxfTEFTVGAgY29ycmVzcG9uZHNcbiAgICogdG8gaW5wdXRzIHdpdGggc2hhcGUgYFtiYXRjaCwgaGVpZ2h0LCB3aWR0aCwgY2hhbm5lbHNdYCB3aGlsZVxuICAgKiBgQ0hBTk5FTF9GSVJTVGAgY29ycmVzcG9uZHMgdG8gaW5wdXRzIHdpdGggc2hhcGVcbiAgICogYFtiYXRjaCwgY2hhbm5lbHMsIGhlaWdodCwgd2lkdGhdYC5cbiAgICovXG4gIGRhdGFGb3JtYXQ/OiBEYXRhRm9ybWF0O1xufVxuXG4vKipcbiAqIEFic3RyYWN0IGNsYXNzIGZvciBkaWZmZXJlbnQgZ2xvYmFsIHBvb2xpbmcgMkQgbGF5ZXJzLlxuICovXG5leHBvcnQgYWJzdHJhY3QgY2xhc3MgR2xvYmFsUG9vbGluZzJEIGV4dGVuZHMgTGF5ZXIge1xuICBwcm90ZWN0ZWQgZGF0YUZvcm1hdDogRGF0YUZvcm1hdDtcbiAgY29uc3RydWN0b3IoYXJnczogR2xvYmFsUG9vbGluZzJETGF5ZXJBcmdzKSB7XG4gICAgc3VwZXIoYXJncyk7XG4gICAgdGhpcy5kYXRhRm9ybWF0ID1cbiAgICAgICAgYXJncy5kYXRhRm9ybWF0ID09IG51bGwgPyAnY2hhbm5lbHNMYXN0JyA6IGFyZ3MuZGF0YUZvcm1hdDtcbiAgICBjaGVja0RhdGFGb3JtYXQodGhpcy5kYXRhRm9ybWF0KTtcbiAgICB0aGlzLmlucHV0U3BlYyA9IFtuZXcgSW5wdXRTcGVjKHtuZGltOiA0fSldO1xuICB9XG5cbiAgY29tcHV0ZU91dHB1dFNoYXBlKGlucHV0U2hhcGU6IFNoYXBlfFNoYXBlW10pOiBTaGFwZXxTaGFwZVtdIHtcbiAgICBpbnB1dFNoYXBlID0gaW5wdXRTaGFwZSBhcyBTaGFwZTtcbiAgICBpZiAodGhpcy5kYXRhRm9ybWF0ID09PSAnY2hhbm5lbHNMYXN0Jykge1xuICAgICAgcmV0dXJuIFtpbnB1dFNoYXBlWzBdLCBpbnB1dFNoYXBlWzNdXTtcbiAgICB9IGVsc2Uge1xuICAgICAgcmV0dXJuIFtpbnB1dFNoYXBlWzBdLCBpbnB1dFNoYXBlWzFdXTtcbiAgICB9XG4gIH1cblxuICBjYWxsKGlucHV0czogVGVuc29yfFRlbnNvcltdLCBrd2FyZ3M6IEt3YXJncyk6IFRlbnNvcnxUZW5zb3JbXSB7XG4gICAgdGhyb3cgbmV3IE5vdEltcGxlbWVudGVkRXJyb3IoKTtcbiAgfVxuXG4gIGdldENvbmZpZygpOiBzZXJpYWxpemF0aW9uLkNvbmZpZ0RpY3Qge1xuICAgIGNvbnN0IGNvbmZpZyA9IHtkYXRhRm9ybWF0OiB0aGlzLmRhdGFGb3JtYXR9O1xuICAgIGNvbnN0IGJhc2VDb25maWcgPSBzdXBlci5nZXRDb25maWcoKTtcbiAgICBPYmplY3QuYXNzaWduKGNvbmZpZywgYmFzZUNvbmZpZyk7XG4gICAgcmV0dXJuIGNvbmZpZztcbiAgfVxufVxuXG5leHBvcnQgY2xhc3MgR2xvYmFsQXZlcmFnZVBvb2xpbmcyRCBleHRlbmRzIEdsb2JhbFBvb2xpbmcyRCB7XG4gIC8qKiBAbm9jb2xsYXBzZSAqL1xuICBzdGF0aWMgY2xhc3NOYW1lID0gJ0dsb2JhbEF2ZXJhZ2VQb29saW5nMkQnO1xuXG4gIGNhbGwoaW5wdXRzOiBUZW5zb3J8VGVuc29yW10sIGt3YXJnczogS3dhcmdzKTogVGVuc29yfFRlbnNvcltdIHtcbiAgICByZXR1cm4gdGlkeSgoKSA9PiB7XG4gICAgICBjb25zdCBpbnB1dCA9IGdldEV4YWN0bHlPbmVUZW5zb3IoaW5wdXRzKTtcbiAgICAgIGlmICh0aGlzLmRhdGFGb3JtYXQgPT09ICdjaGFubmVsc0xhc3QnKSB7XG4gICAgICAgIHJldHVybiB0ZmMubWVhbihpbnB1dCwgWzEsIDJdKTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHJldHVybiB0ZmMubWVhbihpbnB1dCwgWzIsIDNdKTtcbiAgICAgIH1cbiAgICB9KTtcbiAgfVxufVxuc2VyaWFsaXphdGlvbi5yZWdpc3RlckNsYXNzKEdsb2JhbEF2ZXJhZ2VQb29saW5nMkQpO1xuXG5leHBvcnQgY2xhc3MgR2xvYmFsTWF4UG9vbGluZzJEIGV4dGVuZHMgR2xvYmFsUG9vbGluZzJEIHtcbiAgLyoqIEBub2NvbGxhcHNlICovXG4gIHN0YXRpYyBjbGFzc05hbWUgPSAnR2xvYmFsTWF4UG9vbGluZzJEJztcblxuICBjYWxsKGlucHV0czogVGVuc29yfFRlbnNvcltdLCBrd2FyZ3M6IEt3YXJncyk6IFRlbnNvcnxUZW5zb3JbXSB7XG4gICAgcmV0dXJuIHRpZHkoKCkgPT4ge1xuICAgICAgY29uc3QgaW5wdXQgPSBnZXRFeGFjdGx5T25lVGVuc29yKGlucHV0cyk7XG4gICAgICBpZiAodGhpcy5kYXRhRm9ybWF0ID09PSAnY2hhbm5lbHNMYXN0Jykge1xuICAgICAgICByZXR1cm4gdGZjLm1heChpbnB1dCwgWzEsIDJdKTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHJldHVybiB0ZmMubWF4KGlucHV0LCBbMiwgM10pO1xuICAgICAgfVxuICAgIH0pO1xuICB9XG59XG5zZXJpYWxpemF0aW9uLnJlZ2lzdGVyQ2xhc3MoR2xvYmFsTWF4UG9vbGluZzJEKTtcbiJdfQ==","/**\n * @license\n * Copyright 2018 Google LLC\n *\n * Use of this source code is governed by an MIT-style\n * license that can be found in the LICENSE file or at\n * https://opensource.org/licenses/MIT.\n * =============================================================================\n */\n/**\n * Layers that augment the functionality of a base layer.\n */\nimport * as tfc from '@tensorflow/tfjs-core';\nimport { serialization, tidy } from '@tensorflow/tfjs-core';\nimport * as K from '../backend/tfjs_backend';\nimport { nameScope } from '../common';\nimport { InputSpec, Layer, SymbolicTensor } from '../engine/topology';\nimport { NotImplementedError, ValueError } from '../errors';\nimport { VALID_BIDIRECTIONAL_MERGE_MODES } from '../keras_format/common';\nimport * as generic_utils from '../utils/generic_utils';\nimport { getExactlyOneShape, getExactlyOneTensor } from '../utils/types_utils';\nimport { rnn, standardizeArgs } from './recurrent';\nimport { deserialize } from './serialization';\n/**\n * Abstract wrapper base class.\n *\n * Wrappers take another layer and augment it in various ways.\n * Do not use this class as a layer, it is only an abstract base class.\n * Two usable wrappers are the `TimeDistributed` and `Bidirectional` wrappers.\n */\nexport class Wrapper extends Layer {\n constructor(args) {\n // Porting Note: In PyKeras, `self.layer` is set prior to the calling\n // `super()`. But we can't do that here due to TypeScript's restriction.\n // See: https://github.com/Microsoft/TypeScript/issues/8277\n // As a result, we have to add checks in `get trainable()` and\n // `set trainable()` below in order to prevent using `this.layer` when\n // its value is `undefined`. The super constructor does use the getter\n // and the setter of `this.layer`.\n super(args);\n this.layer = args.layer;\n }\n build(inputShape) {\n this.built = true;\n }\n // TODO(cais): Implement activityRegularizer getter.\n get trainable() {\n // Porting Note: the check of `this.layer` here is necessary due to the\n // way the `constructor` of this class is written (see Porting Note\n // above).\n if (this.layer != null) {\n return this.layer.trainable;\n }\n else {\n return false;\n }\n }\n set trainable(value) {\n // Porting Note: the check of `this.layer` here is necessary due to the\n // way the `constructor` of this class is written (see Porting Note\n // above).\n if (this.layer != null) {\n this.layer.trainable = value;\n }\n }\n get trainableWeights() {\n return this.layer.trainableWeights;\n }\n // TODO(cais): Implement setter for trainableWeights.\n get nonTrainableWeights() {\n return this.layer.nonTrainableWeights;\n }\n // TODO(cais): Implement setter for nonTrainableWeights.\n get updates() {\n // tslint:disable-next-line:no-any\n return this.layer._updates;\n }\n // TODO(cais): Implement getUpdatesFor().\n get losses() {\n return this.layer.losses;\n }\n // TODO(cais): Implement getLossesFor().\n getWeights() {\n return this.layer.getWeights();\n }\n setWeights(weights) {\n this.layer.setWeights(weights);\n }\n getConfig() {\n const config = {\n 'layer': {\n 'className': this.layer.getClassName(),\n 'config': this.layer.getConfig(),\n }\n };\n const baseConfig = super.getConfig();\n Object.assign(config, baseConfig);\n return config;\n }\n setFastWeightInitDuringBuild(value) {\n super.setFastWeightInitDuringBuild(value);\n if (this.layer != null) {\n this.layer.setFastWeightInitDuringBuild(value);\n }\n }\n /** @nocollapse */\n static fromConfig(cls, config, customObjects = {}) {\n const layerConfig = config['layer'];\n const layer = deserialize(layerConfig, customObjects);\n delete config['layer'];\n const newConfig = { layer };\n Object.assign(newConfig, config);\n return new cls(newConfig);\n }\n}\nexport class TimeDistributed extends Wrapper {\n constructor(args) {\n super(args);\n this.supportsMasking = true;\n }\n build(inputShape) {\n inputShape = getExactlyOneShape(inputShape);\n if (inputShape.length < 3) {\n throw new ValueError(`TimeDistributed layer expects an input shape >= 3D, but received ` +\n `input shape ${JSON.stringify(inputShape)}`);\n }\n this.inputSpec = [{ shape: inputShape }];\n const childInputShape = [inputShape[0]].concat(inputShape.slice(2));\n if (!this.layer.built) {\n this.layer.build(childInputShape);\n this.layer.built = true;\n }\n super.build(inputShape);\n }\n computeOutputShape(inputShape) {\n inputShape = getExactlyOneShape(inputShape);\n const childInputShape = [inputShape[0]].concat(inputShape.slice(2));\n const childOutputShape = this.layer.computeOutputShape(childInputShape);\n const timesteps = inputShape[1];\n return [childOutputShape[0], timesteps].concat(childOutputShape.slice(1));\n }\n call(inputs, kwargs) {\n return tidy(() => {\n // TODO(cais): Add 'training' and 'useLearningPhase' to kwargs.\n inputs = getExactlyOneTensor(inputs);\n // Porting Note: In tfjs-layers, `inputs` are always concrete tensor\n // values. Hence the inputs can't have an undetermined first (batch)\n // dimension, which is why we always use the K.rnn approach here.\n const step = (inputs, states) => {\n // TODO(cais): Add useLearningPhase.\n // NOTE(cais): `layer.call` may return a length-1 array of Tensor in\n // some cases (e.g., `layer` is a `Sequential` instance), which is\n // why `getExactlyOneTensor` is used below.\n const output = getExactlyOneTensor(this.layer.call(inputs, kwargs));\n return [output, []];\n };\n const rnnOutputs = rnn(step, inputs, [], false /* goBackwards */, null /* mask */, null /* constants */, false /* unroll */, true /* needPerStepOutputs */);\n const y = rnnOutputs[1];\n // TODO(cais): Add activity regularization.\n // TODO(cais): Add useLearningPhase.\n return y;\n });\n }\n}\n/** @nocollapse */\nTimeDistributed.className = 'TimeDistributed';\nserialization.registerClass(TimeDistributed);\nexport function checkBidirectionalMergeMode(value) {\n generic_utils.checkStringTypeUnionValue(VALID_BIDIRECTIONAL_MERGE_MODES, 'BidirectionalMergeMode', value);\n}\nconst DEFAULT_BIDIRECTIONAL_MERGE_MODE = 'concat';\nexport class Bidirectional extends Wrapper {\n constructor(args) {\n super(args);\n // Note: When creating `this.forwardLayer`, the original Layer object\n // (`config.layer`) ought to be cloned. This is why we call\n // `getConfig()` followed by `deserialize()`. Without this cloning,\n // the layer names saved during serialization will incorrectly contain\n // the 'forward_' prefix. In Python Keras, this is done using\n // `copy.copy` (shallow copy), which does not have a simple equivalent\n // in JavaScript. JavaScript's `Object.assign()` does not copy\n // methods.\n const layerConfig = args.layer.getConfig();\n const forwDict = {};\n forwDict['className'] = args.layer.getClassName();\n forwDict['config'] = layerConfig;\n this.forwardLayer = deserialize(forwDict);\n layerConfig['goBackwards'] =\n layerConfig['goBackwards'] === true ? false : true;\n const backDict = {};\n backDict['className'] = args.layer.getClassName();\n backDict['config'] = layerConfig;\n this.backwardLayer = deserialize(backDict);\n this.forwardLayer.name = 'forward_' + this.forwardLayer.name;\n this.backwardLayer.name = 'backward_' + this.backwardLayer.name;\n this.mergeMode = args.mergeMode === undefined ?\n DEFAULT_BIDIRECTIONAL_MERGE_MODE :\n args.mergeMode;\n checkBidirectionalMergeMode(this.mergeMode);\n if (args.weights) {\n throw new NotImplementedError('weights support is not implemented for Bidirectional layer yet.');\n }\n this._stateful = args.layer.stateful;\n this.returnSequences = args.layer.returnSequences;\n this.returnState = args.layer.returnState;\n this.supportsMasking = true;\n this._trainable = true;\n this.inputSpec = args.layer.inputSpec;\n this.numConstants = null;\n }\n get trainable() {\n return this._trainable;\n }\n set trainable(value) {\n // Porting Note: the check of `this.layer` here is necessary due to the\n // way the `constructor` of this class is written (see Porting Note\n // above).\n this._trainable = value;\n if (this.forwardLayer != null) {\n this.forwardLayer.trainable = value;\n }\n if (this.backwardLayer != null) {\n this.backwardLayer.trainable = value;\n }\n }\n getWeights() {\n return this.forwardLayer.getWeights().concat(this.backwardLayer.getWeights());\n }\n setWeights(weights) {\n const numWeights = weights.length;\n const numeightsOver2 = Math.floor(numWeights / 2);\n this.forwardLayer.setWeights(weights.slice(0, numeightsOver2));\n this.backwardLayer.setWeights(weights.slice(numeightsOver2));\n }\n computeOutputShape(inputShape) {\n let layerShapes = this.forwardLayer.computeOutputShape(inputShape);\n if (!(Array.isArray(layerShapes) && Array.isArray(layerShapes[0]))) {\n layerShapes = [layerShapes];\n }\n layerShapes = layerShapes;\n let outputShape;\n let outputShapes;\n let stateShape;\n if (this.returnState) {\n stateShape = layerShapes.slice(1);\n outputShape = layerShapes[0];\n }\n else {\n outputShape = layerShapes[0];\n }\n outputShape = outputShape;\n if (this.mergeMode === 'concat') {\n outputShape[outputShape.length - 1] *= 2;\n outputShapes = [outputShape];\n }\n else if (this.mergeMode == null) {\n outputShapes = [outputShape, outputShape.slice()];\n }\n else {\n outputShapes = [outputShape];\n }\n if (this.returnState) {\n if (this.mergeMode == null) {\n return outputShapes.concat(stateShape).concat(stateShape.slice());\n }\n return [outputShape].concat(stateShape).concat(stateShape.slice());\n }\n return generic_utils.singletonOrArray(outputShapes);\n }\n apply(inputs, kwargs) {\n let initialState = kwargs == null ? null : kwargs['initialState'];\n let constants = kwargs == null ? null : kwargs['constants'];\n if (kwargs == null) {\n kwargs = {};\n }\n const standardized = standardizeArgs(inputs, initialState, constants, this.numConstants);\n inputs = standardized.inputs;\n initialState = standardized.initialState;\n constants = standardized.constants;\n if (Array.isArray(inputs)) {\n initialState = inputs.slice(1);\n inputs = inputs[0];\n }\n if ((initialState == null || initialState.length === 0) &&\n constants == null) {\n return super.apply(inputs, kwargs);\n }\n const additionalInputs = [];\n const additionalSpecs = [];\n if (initialState != null) {\n const numStates = initialState.length;\n if (numStates % 2 > 0) {\n throw new ValueError('When passing `initialState` to a Bidrectional RNN, ' +\n 'the state should be an Array containing the states of ' +\n 'the underlying RNNs.');\n }\n kwargs['initialState'] = initialState;\n additionalInputs.push(...initialState);\n const stateSpecs = initialState\n .map(state => new InputSpec({ shape: state.shape }));\n this.forwardLayer.stateSpec = stateSpecs.slice(0, numStates / 2);\n this.backwardLayer.stateSpec = stateSpecs.slice(numStates / 2);\n additionalSpecs.push(...stateSpecs);\n }\n if (constants != null) {\n throw new NotImplementedError('Support for constants in Bidirectional layers is not ' +\n 'implemented yet.');\n }\n const isSymbolicTensor = additionalInputs[0] instanceof SymbolicTensor;\n for (const tensor of additionalInputs) {\n if (tensor instanceof SymbolicTensor !== isSymbolicTensor) {\n throw new ValueError('The initial state of a Bidirectional layer cannot be ' +\n 'specified as a mix of symbolic and non-symbolic tensors');\n }\n }\n if (isSymbolicTensor) {\n // Compute the full input and specs, including the states.\n const fullInput = [inputs].concat(additionalInputs);\n const fullInputSpec = this.inputSpec.concat(additionalSpecs);\n // Perform the call temporarily and replace inputSpec.\n // Note: with initial states symbolic calls and non-symbolic calls to\n // this method differ in how the initial states are passed. For\n // symbolic calls, the initial states are passed in the first arg, as\n // an Array of SymbolicTensors; for non-symbolic calls, they are\n // passed in the second arg as a part of the kwargs. Hence the need to\n // temporarily modify inputSpec here.\n // TODO(cais): Make refactoring so that this hacky code below is no\n // longer needed.\n const originalInputSpec = this.inputSpec;\n this.inputSpec = fullInputSpec;\n const output = super.apply(fullInput, kwargs);\n this.inputSpec = originalInputSpec;\n return output;\n }\n else {\n return super.apply(inputs, kwargs);\n }\n }\n call(inputs, kwargs) {\n return tidy(() => {\n const initialState = kwargs['initialState'];\n let y;\n let yRev;\n if (initialState == null) {\n y = this.forwardLayer.call(inputs, kwargs);\n yRev = this.backwardLayer.call(inputs, kwargs);\n }\n else {\n const forwardState = initialState.slice(0, initialState.length / 2);\n const backwardState = initialState.slice(initialState.length / 2);\n y = this.forwardLayer.call(inputs, Object.assign(kwargs, { initialState: forwardState }));\n yRev = this.backwardLayer.call(inputs, Object.assign(kwargs, { initialState: backwardState }));\n }\n let states;\n if (this.returnState) {\n if (Array.isArray(y)) {\n states = y.slice(1).concat(yRev.slice(1));\n }\n else {\n }\n y = y[0];\n yRev = yRev[0];\n }\n if (this.returnSequences) {\n yRev = tfc.reverse(yRev, 1);\n }\n let output;\n if (this.mergeMode === 'concat') {\n output = K.concatenate([y, yRev]);\n }\n else if (this.mergeMode === 'sum') {\n output = tfc.add(y, yRev);\n }\n else if (this.mergeMode === 'ave') {\n output = tfc.mul(.5, tfc.add(y, yRev));\n }\n else if (this.mergeMode === 'mul') {\n output = tfc.mul(y, yRev);\n }\n else if (this.mergeMode == null) {\n output = [y, yRev];\n }\n // TODO(cais): Properly set learning phase.\n if (this.returnState) {\n if (this.mergeMode == null) {\n return output.concat(states);\n }\n return [output].concat(states);\n }\n return output;\n });\n }\n resetStates(states) {\n this.forwardLayer.resetStates();\n this.backwardLayer.resetStates();\n }\n build(inputShape) {\n nameScope(this.forwardLayer.name, () => {\n this.forwardLayer.build(inputShape);\n });\n nameScope(this.backwardLayer.name, () => {\n this.backwardLayer.build(inputShape);\n });\n this.built = true;\n }\n computeMask(inputs, mask) {\n if (Array.isArray(mask)) {\n mask = mask[0];\n }\n let outputMask;\n if (this.returnSequences) {\n if (this.mergeMode == null) {\n outputMask = [mask, mask];\n }\n else {\n outputMask = mask;\n }\n }\n else {\n if (this.mergeMode == null) {\n outputMask = [null, null];\n }\n else {\n outputMask = null;\n }\n }\n if (this.returnState) {\n const states = this.forwardLayer.states;\n const stateMask = states.map(state => null);\n if (Array.isArray(outputMask)) {\n return outputMask.concat(stateMask).concat(stateMask);\n }\n else {\n return [outputMask].concat(stateMask).concat(stateMask);\n }\n }\n else {\n return outputMask;\n }\n }\n get trainableWeights() {\n return this.forwardLayer.trainableWeights.concat(this.backwardLayer.trainableWeights);\n }\n get nonTrainableWeights() {\n return this.forwardLayer.nonTrainableWeights.concat(this.backwardLayer.nonTrainableWeights);\n }\n // TODO(cais): Implement constraints().\n setFastWeightInitDuringBuild(value) {\n super.setFastWeightInitDuringBuild(value);\n if (this.forwardLayer != null) {\n this.forwardLayer.setFastWeightInitDuringBuild(value);\n }\n if (this.backwardLayer != null) {\n this.backwardLayer.setFastWeightInitDuringBuild(value);\n }\n }\n getConfig() {\n const config = {\n 'mergeMode': this.mergeMode,\n };\n // TODO(cais): Add logic for `numConstants` once the property is added.\n const baseConfig = super.getConfig();\n Object.assign(config, baseConfig);\n return config;\n }\n /** @nocollapse */\n static fromConfig(cls, config) {\n const rnnLayer = deserialize(config['layer']);\n delete config['layer'];\n // TODO(cais): Add logic for `numConstants` once the property is added.\n if (config['numConstants'] != null) {\n throw new NotImplementedError(`Deserialization of a Bidirectional layer with numConstants ` +\n `present is not supported yet.`);\n }\n // tslint:disable-next-line:no-any\n const newConfig = config;\n newConfig['layer'] = rnnLayer;\n return new cls(newConfig);\n }\n}\n/** @nocollapse */\nBidirectional.className = 'Bidirectional';\nserialization.registerClass(Bidirectional);\n//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoid3JhcHBlcnMuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi8uLi90ZmpzLWxheWVycy9zcmMvbGF5ZXJzL3dyYXBwZXJzLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBOzs7Ozs7OztHQVFHO0FBRUg7O0dBRUc7QUFFSCxPQUFPLEtBQUssR0FBRyxNQUFNLHVCQUF1QixDQUFDO0FBQzdDLE9BQU8sRUFBQyxhQUFhLEVBQVUsSUFBSSxFQUFDLE1BQU0sdUJBQXVCLENBQUM7QUFDbEUsT0FBTyxLQUFLLENBQUMsTUFBTSx5QkFBeUIsQ0FBQztBQUM3QyxPQUFPLEVBQUMsU0FBUyxFQUFDLE1BQU0sV0FBVyxDQUFDO0FBQ3BDLE9BQU8sRUFBQyxTQUFTLEVBQUUsS0FBSyxFQUFhLGNBQWMsRUFBQyxNQUFNLG9CQUFvQixDQUFDO0FBQy9FLE9BQU8sRUFBQyxtQkFBbUIsRUFBRSxVQUFVLEVBQUMsTUFBTSxXQUFXLENBQUM7QUFDMUQsT0FBTyxFQUFnQywrQkFBK0IsRUFBQyxNQUFNLHdCQUF3QixDQUFDO0FBR3RHLE9BQU8sS0FBSyxhQUFhLE1BQU0sd0JBQXdCLENBQUM7QUFDeEQsT0FBTyxFQUFDLGtCQUFrQixFQUFFLG1CQUFtQixFQUFDLE1BQU0sc0JBQXNCLENBQUM7QUFHN0UsT0FBTyxFQUFDLEdBQUcsRUFBTyxlQUFlLEVBQUMsTUFBTSxhQUFhLENBQUM7QUFDdEQsT0FBTyxFQUFDLFdBQVcsRUFBQyxNQUFNLGlCQUFpQixDQUFDO0FBUzVDOzs7Ozs7R0FNRztBQUNILE1BQU0sT0FBZ0IsT0FBUSxTQUFRLEtBQUs7SUFHekMsWUFBWSxJQUFzQjtRQUNoQyxxRUFBcUU7UUFDckUsMEVBQTBFO1FBQzFFLDZEQUE2RDtRQUM3RCxnRUFBZ0U7UUFDaEUsd0VBQXdFO1FBQ3hFLHdFQUF3RTtRQUN4RSxvQ0FBb0M7UUFDcEMsS0FBSyxDQUFDLElBQUksQ0FBQyxDQUFDO1FBQ1osSUFBSSxDQUFDLEtBQUssR0FBRyxJ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VUFBVSxHQUFHLEtBQUssQ0FBQyxTQUFTLEVBQUUsQ0FBQztRQUNyQyxNQUFNLENBQUMsTUFBTSxDQUFDLE1BQU0sRUFBRSxVQUFVLENBQUMsQ0FBQztRQUNsQyxPQUFPLE1BQU0sQ0FBQztJQUNoQixDQUFDO0lBRUQsa0JBQWtCO0lBQ2xCLE1BQU0sQ0FBQyxVQUFVLENBQ2IsR0FBNkMsRUFDN0MsTUFBZ0M7UUFDbEMsTUFBTSxRQUFRLEdBQ1YsV0FBVyxDQUFDLE1BQU0sQ0FBQyxPQUFPLENBQTZCLENBQVEsQ0FBQztRQUNwRSxPQUFPLE1BQU0sQ0FBQyxPQUFPLENBQUMsQ0FBQztRQUN2Qix1RUFBdUU7UUFDdkUsSUFBSSxNQUFNLENBQUMsY0FBYyxDQUFDLElBQUksSUFBSSxFQUFFO1lBQ2xDLE1BQU0sSUFBSSxtQkFBbUIsQ0FDekIsNkRBQTZEO2dCQUM3RCwrQkFBK0IsQ0FBQyxDQUFDO1NBQ3RDO1FBQ0Qsa0NBQWtDO1FBQ2xDLE1BQU0sU0FBUyxHQUF5QixNQUFNLENBQUM7UUFDL0MsU0FBUyxDQUFDLE9BQU8sQ0FBQyxHQUFHLFFBQVEsQ0FBQztRQUM5QixPQUFPLElBQUksR0FBRyxDQUFDLFNBQVMsQ0FBQyxDQUFDO0lBQzVCLENBQUM7O0FBL1ZELGtCQUFrQjtBQUNYLHVCQUFTLEdBQUcsZUFBZSxDQUFDO0FBZ1dyQyxhQUFhLENBQUMsYUFBYSxDQUFDLGFBQWEsQ0FBQyxDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiLyoqXG4gKiBAbGljZW5zZVxuICogQ29weXJpZ2h0IDIwMTggR29vZ2xlIExMQ1xuICpcbiAqIFVzZSBvZiB0aGlzIHNvdXJjZSBjb2RlIGlzIGdvdmVybmVkIGJ5IGFuIE1JVC1zdHlsZVxuICogbGljZW5zZSB0aGF0IGNhbiBiZSBmb3VuZCBpbiB0aGUgTElDRU5TRSBmaWxlIG9yIGF0XG4gKiBodHRwczovL29wZW5zb3VyY2Uub3JnL2xpY2Vuc2VzL01JVC5cbiAqID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4gKi9cblxuLyoqXG4gKiBMYXllcnMgdGhhdCBhdWdtZW50IHRoZSBmdW5jdGlvbmFsaXR5IG9mIGEgYmFzZSBsYXllci5cbiAqL1xuXG5pbXBvcnQgKiBhcyB0ZmMgZnJvbSAnQHRlbnNvcmZsb3cvdGZqcy1jb3JlJztcbmltcG9ydCB7c2VyaWFsaXphdGlvbiwgVGVuc29yLCB0aWR5fSBmcm9tICdAdGVuc29yZmxvdy90ZmpzLWNvcmUnO1xuaW1wb3J0ICogYXMgSyBmcm9tICcuLi9iYWNrZW5kL3RmanNfYmFja2VuZCc7XG5pbXBvcnQge25hbWVTY29wZX0gZnJvbSAnLi4vY29tbW9uJztcbmltcG9ydCB7SW5wdXRTcGVjLCBMYXllciwgTGF5ZXJBcmdzLCBTeW1ib2xpY1RlbnNvcn0gZnJvbSAnLi4vZW5naW5lL3RvcG9sb2d5JztcbmltcG9ydCB7Tm90SW1wbGVtZW50ZWRFcnJvciwgVmFsdWVFcnJvcn0gZnJvbSAnLi4vZXJyb3JzJztcbmltcG9ydCB7QmlkaXJlY3Rpb25hbE1lcmdlTW9kZSwgU2hhcGUsIFZBTElEX0JJRElSRUNUSU9OQUxfTUVSR0VfTU9ERVN9IGZyb20gJy4uL2tlcmFzX2Zvcm1hdC9jb21tb24nO1xuaW1wb3J0IHtLd2FyZ3N9IGZyb20gJy4uL3R5cGVzJztcbmltcG9ydCB7UmVndWxhcml6ZXJGbiwgUm5uU3RlcEZ1bmN0aW9ufSBmcm9tICcuLi90eXBlcyc7XG5pbXBvcnQgKiBhcyBnZW5lcmljX3V0aWxzIGZyb20gJy4uL3V0aWxzL2dlbmVyaWNfdXRpbHMnO1xuaW1wb3J0IHtnZXRFeGFjdGx5T25lU2hhcGUsIGdldEV4YWN0bHlPbmVUZW5zb3J9IGZyb20gJy4uL3V0aWxzL3R5cGVzX3V0aWxzJztcbmltcG9ydCB7TGF5ZXJWYXJpYWJsZX0gZnJvbSAnLi4vdmFyaWFibGVzJztcblxuaW1wb3J0IHtybm4sIFJOTiwgc3RhbmRhcmRpemVBcmdzfSBmcm9tICcuL3JlY3VycmVudCc7XG5pbXBvcnQge2Rlc2VyaWFsaXplfSBmcm9tICcuL3NlcmlhbGl6YXRpb24nO1xuXG5leHBvcnQgZGVjbGFyZSBpbnRlcmZhY2UgV3JhcHBlckxheWVyQXJncyBleHRlbmRzIExheWVyQXJncyB7XG4gIC8qKlxuICAgKiBUaGUgbGF5ZXIgdG8gYmUgd3JhcHBlZC5cbiAgICovXG4gIGxheWVyOiBMYXllcjtcbn1cblxuLyoqXG4gKiBBYnN0cmFjdCB3cmFwcGVyIGJhc2UgY2xhc3MuXG4gKlxuICogV3JhcHBlcnMgdGFrZSBhbm90aGVyIGxheWVyIGFuZCBhdWdtZW50IGl0IGluIHZhcmlvdXMgd2F5cy5cbiAqIERvIG5vdCB1c2UgdGhpcyBjbGFzcyBhcyBhIGxheWVyLCBpdCBpcyBvbmx5IGFuIGFic3RyYWN0IGJhc2UgY2xhc3MuXG4gKiBUd28gdXNhYmxlIHdyYXBwZXJzIGFyZSB0aGUgYFRpbWVEaXN0cmlidXRlZGAgYW5kIGBCaWRpcmVjdGlvbmFsYCB3cmFwcGVycy5cbiAqL1xuZXhwb3J0IGFic3RyYWN0IGNsYXNzIFdyYXBwZXIgZXh0ZW5kcyBMYXllciB7XG4gIHJlYWRvbmx5IGxheWVyOiBMYXllcjtcblxuICBjb25zdHJ1Y3RvcihhcmdzOiBXcmFwcGVyTGF5ZXJBcmdzKSB7XG4gICAgLy8gUG9ydGluZyBOb3RlOiBJbiBQeUtlcmFzLCBgc2VsZi5sYXllcmAgaXMgc2V0IHByaW9yIHRvIHRoZSBjYWxsaW5nXG4gICAgLy8gICBgc3VwZXIoKWAuIEJ1dCB3ZSBjYW4ndCBkbyB0aGF0IGhlcmUgZHVlIHRvIFR5cGVTY3JpcHQncyByZXN0cmljdGlvbi5cbiAgICAvLyAgIFNlZTogaHR0cHM6Ly9naXRodWIuY29tL01pY3Jvc29mdC9UeXBlU2NyaXB0L2lzc3Vlcy84Mjc3XG4gICAgLy8gICBBcyBhIHJlc3VsdCwgd2UgaGF2ZSB0byBhZGQgY2hlY2tzIGluIGBnZXQgdHJhaW5hYmxlKClgIGFuZFxuICAgIC8vICAgYHNldCB0cmFpbmFibGUoKWAgYmVsb3cgaW4gb3JkZXIgdG8gcHJldmVudCB1c2luZyBgdGhpcy5sYXllcmAgd2hlblxuICAgIC8vICAgaXRzIHZhbHVlIGlzIGB1bmRlZmluZWRgLiBUaGUgc3VwZXIgY29uc3RydWN0b3IgZG9lcyB1c2UgdGhlIGdldHRlclxuICAgIC8vICAgYW5kIHRoZSBzZXR0ZXIgb2YgYHRoaXMubGF5ZXJgLlxuICAgIHN1cGVyKGFyZ3MpO1xuICAgIHRoaXMubGF5ZXIgPSBhcmdzLmxheWVyO1xuICB9XG5cbiAgYnVpbGQoaW5wdXRTaGFwZTogU2hhcGV8U2hhcGVbXSk6IHZvaWQge1xuICAgIHRoaXMuYnVpbHQgPSB0cnVlO1xuICB9XG5cbiAgLy8gVE9ETyhjYWlzKTogSW1wbGVtZW50IGFjdGl2aXR5UmVndWxhcml6ZXIgZ2V0dGVyLlxuXG4gIGdldCB0cmFpbmFibGUoKTogYm9vbGVhbiB7XG4gICAgLy8gUG9ydGluZyBOb3RlOiB0aGUgY2hlY2sgb2YgYHRoaXMubGF5ZXJgIGhlcmUgaXMgbmVjZXNzYXJ5IGR1ZSB0byB0aGVcbiAgICAvLyAgIHdheSB0aGUgYGNvbnN0cnVjdG9yYCBvZiB0aGlzIGNsYXNzIGlzIHdyaXR0ZW4gKHNlZSBQb3J0aW5nIE5vdGVcbiAgICAvLyAgIGFib3ZlKS5cbiAgICBpZiAodGhpcy5sYXllciAhPSBudWxsKSB7XG4gICAgICByZXR1cm4gdGhpcy5sYXllci50cmFpbmFibGU7XG4gICAgfSBlbHNlIHtcbiAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9XG4gIH1cblxuICBzZXQgdHJhaW5hYmxlKHZhbHVlOiBib29sZWFuKSB7XG4gICAgLy8gUG9ydGluZyBOb3RlOiB0aGUgY2hlY2sgb2YgYHRoaXMubGF5ZXJgIGhlcmUgaXMgbmVjZXNzYXJ5IGR1ZSB0byB0aGVcbiAgICAvLyAgIHdheSB0aGUgYGNvbnN0cnVjdG9yYCBvZiB0aGlzIGNsYXNzIGlzIHdyaXR0ZW4gKHNlZSBQb3J0aW5nIE5vdGVcbiAgICAvLyAgIGFib3ZlKS5cbiAgICBpZiAodGhpcy5sYXllciAhPSBudWxsKSB7XG4gICAgICB0aGlzLmxheWVyLnRyYWluYWJsZSA9IHZhbHVlO1xuICAgIH1cbiAgfVxuXG4gIGdldCB0cmFpbmFibGVXZWlnaHRzKCk6IExheWVyVmFyaWFibGVbXSB7XG4gICAgcmV0dXJuIHRoaXMubGF5ZXIudHJhaW5hYmxlV2VpZ2h0cztcbiAgfVxuICAvLyBUT0RPKGNhaXMpOiBJbXBsZW1lbnQgc2V0dGVyIGZvciB0cmFpbmFibGVXZWlnaHRzLlxuXG4gIGdldCBub25UcmFpbmFibGVXZWlnaHRzKCk6IExheWVyVmFyaWFibGVbXSB7XG4gICAgcmV0dXJuIHRoaXMubGF5ZXIubm9uVHJhaW5hYmxlV2VpZ2h0cztcbiAgfVxuICAvLyBUT0RPKGNhaXMpOiBJbXBsZW1lbnQgc2V0dGVyIGZvciBub25UcmFpbmFibGVXZWlnaHRzLlxuXG4gIGdldCB1cGRhdGVzKCk6IFRlbnNvcltdIHtcbiAgICAvLyB0c2xpbnQ6ZGlzYWJsZS1uZXh0LWxpbmU6bm8tYW55XG4gICAgcmV0dXJuICh0aGlzLmxheWVyIGFzIGFueSkuX3VwZGF0ZXM7XG4gIH1cblxuICAvLyBUT0RPKGNhaXMpOiBJbXBsZW1lbnQgZ2V0VXBkYXRlc0ZvcigpLlxuXG4gIGdldCBsb3NzZXMoKTogUmVndWxhcml6ZXJGbltdIHtcbiAgICByZXR1cm4gdGhpcy5sYXllci5sb3NzZXM7XG4gIH1cblxuICAvLyBUT0RPKGNhaXMpOiBJbXBsZW1lbnQgZ2V0TG9zc2VzRm9yKCkuXG5cbiAgZ2V0V2VpZ2h0cygpOiBUZW5zb3JbXSB7XG4gICAgcmV0dXJuIHRoaXMubGF5ZXIuZ2V0V2VpZ2h0cygpO1xuICB9XG5cbiAgc2V0V2VpZ2h0cyh3ZWlnaHRzOiBUZW5zb3JbXSk6IHZvaWQge1xuICAgIHRoaXMubGF5ZXIuc2V0V2VpZ2h0cyh3ZWlnaHRzKTtcbiAgfVxuXG4gIGdldENvbmZpZygpOiBzZXJpYWxpemF0aW9uLkNvbmZpZ0RpY3Qge1xuICAgIGNvbnN0IGNvbmZpZzogc2VyaWFsaXphdGlvbi5Db25maWdEaWN0ID0ge1xuICAgICAgJ2xheWVyJzoge1xuICAgICAgICAnY2xhc3NOYW1lJzogdGhpcy5sYXllci5nZXRDbGFzc05hbWUoKSxcbiAgICAgICAgJ2NvbmZpZyc6IHRoaXMubGF5ZXIuZ2V0Q29uZmlnKCksXG4gICAgICB9XG4gICAgfTtcbiAgICBjb25zdCBiYXNlQ29uZmlnID0gc3VwZXIuZ2V0Q29uZmlnKCk7XG4gICAgT2JqZWN0LmFzc2lnbihjb25maWcsIGJhc2VDb25maWcpO1xuICAgIHJldHVybiBjb25maWc7XG4gIH1cblxuICBzZXRGYXN0V2VpZ2h0SW5pdER1cmluZ0J1aWxkKHZhbHVlOiBib29sZWFuKSB7XG4gICAgc3VwZXIuc2V0RmFzdFdlaWdodEluaXREdXJpbmdCdWlsZCh2YWx1ZSk7XG4gICAgaWYgKHRoaXMubGF5ZXIgIT0gbnVsbCkge1xuICAgICAgdGhpcy5sYXllci5zZXRGYXN0V2VpZ2h0SW5pdER1cmluZ0J1aWxkKHZhbHVlKTtcbiAgICB9XG4gIH1cblxuICAvKiogQG5vY29sbGFwc2UgKi9cbiAgc3RhdGljIGZyb21Db25maWc8VCBleHRlbmRzIHNlcmlhbGl6YXRpb24uU2VyaWFsaXphYmxlPihcbiAgICAgIGNsczogc2VyaWFsaXphdGlvbi5TZXJpYWxpemFibGVDb25zdHJ1Y3RvcjxUPixcbiAgICAgIGNvbmZpZzogc2VyaWFsaXphdGlvbi5Db25maWdEaWN0LFxuICAgICAgY3VzdG9tT2JqZWN0cyA9IHt9IGFzIHNlcmlhbGl6YXRpb24uQ29uZmlnRGljdCk6IFQge1xuICAgIGNvbnN0IGxheWVyQ29uZmlnID0gY29uZmlnWydsYXllciddIGFzIHNlcmlhbGl6YXRpb24uQ29uZmlnRGljdDtcbiAgICBjb25zdCBsYXllciA9IGRlc2VyaWFsaXplKGxheWVyQ29uZmlnLCBjdXN0b21PYmplY3RzKSBhcyBMYXllcjtcbiAgICBkZWxldGUgY29uZmlnWydsYXllciddO1xuICAgIGNvbnN0IG5ld0NvbmZpZyA9IHtsYXllcn07XG4gICAgT2JqZWN0LmFzc2lnbihuZXdDb25maWcsIGNvbmZpZyk7XG4gICAgcmV0dXJuIG5ldyBjbHMobmV3Q29uZmlnKTtcbiAgfVxufVxuXG5leHBvcnQgY2xhc3MgVGltZURpc3RyaWJ1dGVkIGV4dGVuZHMgV3JhcHBlciB7XG4gIC8qKiBAbm9jb2xsYXBzZSAqL1xuICBzdGF0aWMgY2xhc3NOYW1lID0gJ1RpbWVEaXN0cmlidXRlZCc7XG4gIGNvbnN0cnVjdG9yKGFyZ3M6IFdyYXBwZXJMYXllckFyZ3MpIHtcbiAgICBzdXBlcihhcmdzKTtcbiAgICB0aGlzLnN1cHBvcnRzTWFza2luZyA9IHRydWU7XG4gIH1cblxuICBidWlsZChpbnB1dFNoYXBlOiBTaGFwZXxTaGFwZVtdKTogdm9pZCB7XG4gICAgaW5wdXRTaGFwZSA9IGdldEV4YWN0bHlPbmVTaGFwZShpbnB1dFNoYXBlKTtcbiAgICBpZiAoaW5wdXRTaGFwZS5sZW5ndGggPCAzKSB7XG4gICAgICB0aHJvdyBuZXcgVmFsdWVFcnJvcihcbiAgICAgICAgICBgVGltZURpc3RyaWJ1dGVkIGxheWVyIGV4cGVjdHMgYW4gaW5wdXQgc2hhcGUgPj0gM0QsIGJ1dCByZWNlaXZlZCBgICtcbiAgICAgICAgICBgaW5wdXQgc2hhcGUgJHtKU09OLnN0cmluZ2lmeShpbnB1dFNoYXBlKX1gKTtcbiAgICB9XG4gICAgdGhpcy5pbnB1dFNwZWMgPSBbe3NoYXBlOiBpbnB1dFNoYXBlfV07XG4gICAgY29uc3QgY2hpbGRJbnB1dFNoYXBlID0gW2lucHV0U2hhcGVbMF1dLmNvbmNhdChpbnB1dFNoYXBlLnNsaWNlKDIpKTtcbiAgICBpZiAoIXRoaXMubGF5ZXIuYnVpbHQpIHtcbiAgICAgIHRoaXMubGF5ZXIuYnVpbGQoY2hpbGRJbnB1dFNoYXBlKTtcbiAgICAgIHRoaXMubGF5ZXIuYnVpbHQgPSB0cnVlO1xuICAgIH1cbiAgICBzdXBlci5idWlsZChpbnB1dFNoYXBlKTtcbiAgfVxuXG4gIGNvbXB1dGVPdXRwdXRTaGFwZShpbnB1dFNoYXBlOiBTaGFwZXxTaGFwZVtdKTogU2hhcGV8U2hhcGVbXSB7XG4gICAgaW5wdXRTaGFwZSA9IGdldEV4YWN0bHlPbmVTaGFwZShpbnB1dFNoYXBlKTtcbiAgICBjb25zdCBjaGlsZElucHV0U2hhcGUgPSBbaW5wdXRTaGFwZVswXV0uY29uY2F0KGlucHV0U2hhcGUuc2xpY2UoMikpO1xuICAgIGNvbnN0IGNoaWxkT3V0cHV0U2hhcGUgPVxuICAgICAgICB0aGlzLmxheWVyLmNvbXB1dGVPdXRwdXRTaGFwZShjaGlsZElucHV0U2hhcGUpIGFzIFNoYXBlO1xuICAgIGNvbnN0IHRpbWVzdGVwcyA9IGlucHV0U2hhcGVbMV07XG4gICAgcmV0dXJuIFtjaGlsZE91dHB1dFNoYXBlWzBdLCB0aW1lc3RlcHNdLmNvbmNhdChjaGlsZE91dHB1dFNoYXBlLnNsaWNlKDEpKTtcbiAgfVxuXG4gIGNhbGwoaW5wdXRzOiBUZW5zb3J8VGVuc29yW10sIGt3YXJnczogS3dhcmdzKTogVGVuc29yfFRlbnNvcltdIHtcbiAgICByZXR1cm4gdGlkeSgoKSA9PiB7XG4gICAgICAvLyBUT0RPKGNhaXMpOiBBZGQgJ3RyYWluaW5nJyBhbmQgJ3VzZUxlYXJuaW5nUGhhc2UnIHRvIGt3YXJncy5cbiAgICAgIGlucHV0cyA9IGdldEV4YWN0bHlPbmVUZW5zb3IoaW5wdXRzKTtcbiAgICAgIC8vIFBvcnRpbmcgTm90ZTogSW4gdGZqcy1sYXllcnMsIGBpbnB1dHNgIGFyZSBhbHdheXMgY29uY3JldGUgdGVuc29yXG4gICAgICAvLyB2YWx1ZXMuIEhlbmNlIHRoZSBpbnB1dHMgY2FuJ3QgaGF2ZSBhbiB1bmRldGVybWluZWQgZmlyc3QgKGJhdGNoKVxuICAgICAgLy8gZGltZW5zaW9uLCB3aGljaCBpcyB3aHkgd2UgYWx3YXlzIHVzZSB0aGUgSy5ybm4gYXBwcm9hY2ggaGVyZS5cbiAgICAgIGNvbnN0IHN0ZXA6IFJublN0ZXBGdW5jdGlvbiA9IChpbnB1dHM6IFRlbnNvciwgc3RhdGVzOiBUZW5zb3JbXSkgPT4ge1xuICAgICAgICAvLyBUT0RPKGNhaXMpOiBBZGQgdXNlTGVhcm5pbmdQaGFzZS5cbiAgICAgICAgLy8gTk9URShjYWlzKTogYGxheWVyLmNhbGxgIG1heSByZXR1cm4gYSBsZW5ndGgtMSBhcnJheSBvZiBUZW5zb3IgaW5cbiAgICAgICAgLy8gICBzb21lIGNhc2VzIChlLmcuLCBgbGF5ZXJgIGlzIGEgYFNlcXVlbnRpYWxgIGluc3RhbmNlKSwgd2hpY2ggaXNcbiAgICAgICAgLy8gICB3aHkgYGdldEV4YWN0bHlPbmVUZW5zb3JgIGlzIHVzZWQgYmVsb3cuXG4gICAgICAgIGNvbnN0IG91dHB1dCA9IGdldEV4YWN0bHlPbmVUZW5zb3IodGhpcy5sYXllci5jYWxsKGlucHV0cywga3dhcmdzKSk7XG4gICAgICAgIHJldHVybiBbb3V0cHV0LCBbXV07XG4gICAgICB9O1xuICAgICAgY29uc3Qgcm5uT3V0cHV0cyA9XG4gICAgICAgICAgcm5uKHN0ZXAsIGlucHV0cywgW10sIGZhbHNlIC8qIGdvQmFja3dhcmRzICovLCBudWxsIC8qIG1hc2sgKi8sXG4gICAgICAgICAgICAgIG51bGwgLyogY29uc3RhbnRzICovLCBmYWxzZSAvKiB1bnJvbGwgKi8sXG4gICAgICAgICAgICAgIHRydWUgLyogbmVlZFBlclN0ZXBPdXRwdXRzICovKTtcbiAgICAgIGNvbnN0IHkgPSBybm5PdXRwdXRzWzFdO1xuICAgICAgLy8gVE9ETyhjYWlzKTogQWRkIGFjdGl2aXR5IHJlZ3VsYXJpemF0aW9uLlxuICAgICAgLy8gVE9ETyhjYWlzKTogQWRkIHVzZUxlYXJuaW5nUGhhc2UuXG4gICAgICByZXR1cm4geTtcbiAgICB9KTtcbiAgfVxuXG4gIC8vIFRPRE8oY2Fpcyk6IEltcGxlbWVudCBkZXRhaWxlZCBjb21wdXRlTWFzaygpIGxvZ2ljLlxufVxuc2VyaWFsaXphdGlvbi5yZWdpc3RlckNsYXNzKFRpbWVEaXN0cmlidXRlZCk7XG5cbmV4cG9ydCBmdW5jdGlvbiBjaGVja0JpZGlyZWN0aW9uYWxNZXJnZU1vZGUodmFsdWU/OiBzdHJpbmcpOiB2b2lkIHtcbiAgZ2VuZXJpY191dGlscy5jaGVja1N0cmluZ1R5cGVVbmlvblZhbHVlKFxuICAgICAgVkFMSURfQklESVJFQ1RJT05BTF9NRVJHRV9NT0RFUywgJ0JpZGlyZWN0aW9uYWxNZXJnZU1vZGUnLCB2YWx1ZSk7XG59XG5cbmV4cG9ydCBkZWNsYXJlIGludGVyZmFjZSBCaWRpcmVjdGlvbmFsTGF5ZXJBcmdzIGV4dGVuZHMgV3JhcHBlckxheWVyQXJncyB7XG4gIC8qKlxuICAgKiBUaGUgaW5zdGFuY2Ugb2YgYW4gYFJOTmAgbGF5ZXIgdG8gYmUgd3JhcHBlZC5cbiAgICovXG4gIGxheWVyOiBSTk47XG5cbiAgLyoqXG4gICAqIE1vZGUgYnkgd2hpY2ggb3V0cHV0cyBvZiB0aGUgZm9yd2FyZCBhbmQgYmFja3dhcmQgUk5OcyBhcmVcbiAgICogY29tYmluZWQuIElmIGBudWxsYCBvciBgdW5kZWZpbmVkYCwgdGhlIG91dHB1dCB3aWxsIG5vdCBiZVxuICAgKiBjb21iaW5lZCwgdGhleSB3aWxsIGJlIHJldHVybmVkIGFzIGFuIGBBcnJheWAuXG4gICAqXG4gICAqIElmIGB1bmRlZmluZWRgIChpLmUuLCBub3QgcHJvdmlkZWQpLCBkZWZhdWx0cyB0byBgJ2NvbmNhdCdgLlxuICAgKi9cbiAgbWVyZ2VNb2RlPzogQmlkaXJlY3Rpb25hbE1lcmdlTW9kZTtcbn1cblxuY29uc3QgREVGQVVMVF9CSURJUkVDVElPTkFMX01FUkdFX01PREU6IEJpZGlyZWN0aW9uYWxNZXJnZU1vZGUgPSAnY29uY2F0JztcblxuZXhwb3J0IGNsYXNzIEJpZGlyZWN0aW9uYWwgZXh0ZW5kcyBXcmFwcGVyIHtcbiAgLyoqIEBub2NvbGxhcHNlICovXG4gIHN0YXRpYyBjbGFzc05hbWUgPSAnQmlkaXJlY3Rpb25hbCc7XG4gIG1lcmdlTW9kZTogQmlkaXJlY3Rpb25hbE1lcmdlTW9kZTtcbiAgcHJpdmF0ZSBmb3J3YXJkTGF5ZXI6IFJOTjtcbiAgcHJpdmF0ZSBiYWNrd2FyZExheWVyOiBSTk47XG4gIHByaXZhdGUgcmV0dXJuU2VxdWVuY2VzOiBib29sZWFuO1xuICBwcml2YXRlIHJldHVyblN0YXRlOiBib29sZWFuO1xuICBwcml2YXRlIG51bUNvbnN0YW50cz86IG51bWJlcjtcbiAgcHJpdmF0ZSBfdHJhaW5hYmxlOiBib29sZWFuO1xuXG4gIGNvbnN0cnVjdG9yKGFyZ3M6IEJpZGlyZWN0aW9uYWxMYXllckFyZ3MpIHtcbiAgICBzdXBlcihhcmdzKTtcblxuICAgIC8vIE5vdGU6IFdoZW4gY3JlYXRpbmcgYHRoaXMuZm9yd2FyZExheWVyYCwgdGhlIG9yaWdpbmFsIExheWVyIG9iamVjdFxuICAgIC8vICAgKGBjb25maWcubGF5ZXJgKSBvdWdodCB0byBiZSBjbG9uZWQuIFRoaXMgaXMgd2h5IHdlIGNhbGxcbiAgICAvLyAgIGBnZXRDb25maWcoKWAgZm9sbG93ZWQgYnkgYGRlc2VyaWFsaXplKClgLiBXaXRob3V0IHRoaXMgY2xvbmluZyxcbiAgICAvLyAgIHRoZSBsYXllciBuYW1lcyBzYXZlZCBkdXJpbmcgc2VyaWFsaXphdGlvbiB3aWxsIGluY29ycmVjdGx5IGNvbnRhaW5cbiAgICAvLyAgIHRoZSAnZm9yd2FyZF8nIHByZWZpeC4gSW4gUHl0aG9uIEtlcmFzLCB0aGlzIGlzIGRvbmUgdXNpbmdcbiAgICAvLyAgIGBjb3B5LmNvcHlgIChzaGFsbG93IGNvcHkpLCB3aGljaCBkb2VzIG5vdCBoYXZlIGEgc2ltcGxlIGVxdWl2YWxlbnRcbiAgICAvLyAgIGluIEphdmFTY3JpcHQuIEphdmFTY3JpcHQncyBgT2JqZWN0LmFzc2lnbigpYCBkb2VzIG5vdCBjb3B5XG4gICAgLy8gICBtZXRob2RzLlxuICAgIGNvbnN0IGxheWVyQ29uZmlnID0gYXJncy5sYXllci5nZXRDb25maWcoKTtcbiAgICBjb25zdCBmb3J3RGljdDogc2VyaWFsaXphdGlvbi5Db25maWdEaWN0ID0ge307XG4gICAgZm9yd0RpY3RbJ2NsYXNzTmFtZSddID0gYXJncy5sYXllci5nZXRDbGFzc05hbWUoKTtcbiAgICBmb3J3RGljdFsnY29uZmlnJ10gPSBsYXllckNvbmZpZztcbiAgICB0aGlzLmZvcndhcmRMYXllciA9IGRlc2VyaWFsaXplKGZvcndEaWN0KSBhcyBSTk47XG4gICAgbGF5ZXJDb25maWdbJ2dvQmFja3dhcmRzJ10gPVxuICAgICAgICBsYXllckNvbmZpZ1snZ29CYWNrd2FyZHMnXSA9PT0gdHJ1ZSA/IGZhbHNlIDogdHJ1ZTtcbiAgICBjb25zdCBiYWNrRGljdDogc2VyaWFsaXphdGlvbi5Db25maWdEaWN0ID0ge307XG4gICAgYmFja0RpY3RbJ2NsYXNzTmFtZSddID0gYXJncy5sYXllci5nZXRDbGFzc05hbWUoKTtcbiAgICBiYWNrRGljdFsnY29uZmlnJ10gPSBsYXllckNvbmZpZztcbiAgICB0aGlzLmJhY2t3YXJkTGF5ZXIgPSBkZXNlcmlhbGl6ZShiYWNrRGljdCkgYXMgUk5OO1xuICAgIHRoaXMuZm9yd2FyZExheWVyLm5hbWUgPSAnZm9yd2FyZF8nICsgdGhpcy5mb3J3YXJkTGF5ZXIubmFtZTtcbiAgICB0aGlzLmJhY2t3YXJkTGF5ZXIubmFtZSA9ICdiYWNrd2FyZF8nICsgdGhpcy5iYWNrd2FyZExheWVyLm5hbWU7XG5cbiAgICB0aGlzLm1lcmdlTW9kZSA9IGFyZ3MubWVyZ2VNb2RlID09PSB1bmRlZmluZWQgP1xuICAgICAgICBERUZBVUxUX0JJRElSRUNUSU9OQUxfTUVSR0VfTU9ERSA6XG4gICAgICAgIGFyZ3MubWVyZ2VNb2RlO1xuICAgIGNoZWNrQmlkaXJlY3Rpb25hbE1lcmdlTW9kZSh0aGlzLm1lcmdlTW9kZSk7XG4gICAgaWYgKGFyZ3Mud2VpZ2h0cykge1xuICAgICAgdGhyb3cgbmV3IE5vdEltcGxlbWVudGVkRXJyb3IoXG4gICAgICAgICAgJ3dlaWdodHMgc3VwcG9ydCBpcyBub3QgaW1wbGVtZW50ZWQgZm9yIEJpZGlyZWN0aW9uYWwgbGF5ZXIgeWV0LicpO1xuICAgIH1cbiAgICB0aGlzLl9zdGF0ZWZ1bCA9IGFyZ3MubGF5ZXIuc3RhdGVmdWw7XG4gICAgdGhpcy5yZXR1cm5TZXF1ZW5jZXMgPSBhcmdzLmxheWVyLnJldHVyblNlcXVlbmNlcztcbiAgICB0aGlzLnJldHVyblN0YXRlID0gYXJncy5sYXllci5yZXR1cm5TdGF0ZTtcbiAgICB0aGlzLnN1cHBvcnRzTWFza2luZyA9IHRydWU7XG4gICAgdGhpcy5fdHJhaW5hYmxlID0gdHJ1ZTtcbiAgICB0aGlzLmlucHV0U3BlYyA9IGFyZ3MubGF5ZXIuaW5wdXRTcGVjO1xuICAgIHRoaXMubnVtQ29uc3RhbnRzID0gbnVsbDtcbiAgfVxuXG4gIGdldCB0cmFpbmFibGUoKTogYm9vbGVhbiB7XG4gICAgcmV0dXJuIHRoaXMuX3RyYWluYWJsZTtcbiAgfVxuXG4gIHNldCB0cmFpbmFibGUodmFsdWU6IGJvb2xlYW4pIHtcbiAgICAvLyBQb3J0aW5nIE5vdGU6IHRoZSBjaGVjayBvZiBgdGhpcy5sYXllcmAgaGVyZSBpcyBuZWNlc3NhcnkgZHVlIHRvIHRoZVxuICAgIC8vICAgd2F5IHRoZSBgY29uc3RydWN0b3JgIG9mIHRoaXMgY2xhc3MgaXMgd3JpdHRlbiAoc2VlIFBvcnRpbmcgTm90ZVxuICAgIC8vICAgYWJvdmUpLlxuICAgIHRoaXMuX3RyYWluYWJsZSA9IHZhbHVlO1xuICAgIGlmICh0aGlzLmZvcndhcmRMYXllciAhPSBudWxsKSB7XG4gICAgICB0aGlzLmZvcndhcmRMYXllci50cmFpbmFibGUgPSB2YWx1ZTtcbiAgICB9XG4gICAgaWYgKHRoaXMuYmFja3dhcmRMYXllciAhPSBudWxsKSB7XG4gICAgICB0aGlzLmJhY2t3YXJkTGF5ZXIudHJhaW5hYmxlID0gdmFsdWU7XG4gICAgfVxuICB9XG5cbiAgZ2V0V2VpZ2h0cygpOiBUZW5zb3JbXSB7XG4gICAgcmV0dXJuIHRoaXMuZm9yd2FyZExheWVyLmdldFdlaWdodHMoKS5jb25jYXQoXG4gICAgICAgIHRoaXMuYmFja3dhcmRMYXllci5nZXRXZWlnaHRzKCkpO1xuICB9XG5cbiAgc2V0V2VpZ2h0cyh3ZWlnaHRzOiBUZW5zb3JbXSk6IHZvaWQge1xuICAgIGNvbnN0IG51bVdlaWdodHMgPSB3ZWlnaHRzLmxlbmd0aDtcbiAgICBjb25zdCBudW1laWdodHNPdmVyMiA9IE1hdGguZmxvb3IobnVtV2VpZ2h0cyAvIDIpO1xuICAgIHRoaXMuZm9yd2FyZExheWVyLnNldFdlaWdodHMod2VpZ2h0cy5zbGljZSgwLCBudW1laWdodHNPdmVyMikpO1xuICAgIHRoaXMuYmFja3dhcmRMYXllci5zZXRXZWlnaHRzKHdlaWdodHMuc2xpY2UobnVtZWlnaHRzT3ZlcjIpKTtcbiAgfVxuXG4gIGNvbXB1dGVPdXRwdXRTaGFwZShpbnB1dFNoYXBlOiBTaGFwZXxTaGFwZVtdKTogU2hhcGV8U2hhcGVbXSB7XG4gICAgbGV0IGxheWVyU2hhcGVzOiBTaGFwZXxTaGFwZVtdID1cbiAgICAgICAgdGhpcy5mb3J3YXJkTGF5ZXIuY29tcHV0ZU91dHB1dFNoYXBlKGlucHV0U2hhcGUpO1xuICAgIGlmICghKEFycmF5LmlzQXJyYXkobGF5ZXJTaGFwZXMpICYmIEFycmF5LmlzQXJyYXkobGF5ZXJTaGFwZXNbMF0pKSkge1xuICAgICAgbGF5ZXJTaGFwZXMgPSBbbGF5ZXJTaGFwZXMgYXMgU2hhcGVdO1xuICAgIH1cbiAgICBsYXllclNoYXBlcyA9IGxheWVyU2hhcGVzIGFzIFNoYXBlW107XG5cbiAgICBsZXQgb3V0cHV0U2hhcGU6IFNoYXBlO1xuICAgIGxldCBvdXRwdXRTaGFwZXM6IFNoYXBlW107XG4gICAgbGV0IHN0YXRlU2hhcGU6IFNoYXBlW107XG4gICAgaWYgKHRoaXMucmV0dXJuU3RhdGUpIHtcbiAgICAgIHN0YXRlU2hhcGUgPSBsYXllclNoYXBlcy5zbGljZSgxKTtcbiAgICAgIG91dHB1dFNoYXBlID0gbGF5ZXJTaGFwZXNbMF07XG4gICAgfSBlbHNlIHtcbiAgICAgIG91dHB1dFNoYXBlID0gbGF5ZXJTaGFwZXNbMF07XG4gICAgfVxuICAgIG91dHB1dFNoYXBlID0gb3V0cHV0U2hhcGU7XG4gICAgaWYgKHRoaXMubWVyZ2VNb2RlID09PSAnY29uY2F0Jykge1xuICAgICAgb3V0cHV0U2hhcGVbb3V0cHV0U2hhcGUubGVuZ3RoIC0gMV0gKj0gMjtcbiAgICAgIG91dHB1dFNoYXBlcyA9IFtvdXRwdXRTaGFwZV07XG4gICAgfSBlbHNlIGlmICh0aGlzLm1lcmdlTW9kZSA9PSBudWxsKSB7XG4gICAgICBvdXRwdXRTaGFwZXMgPSBbb3V0cHV0U2hhcGUsIG91dHB1dFNoYXBlLnNsaWNlKCldO1xuICAgIH0gZWxzZSB7XG4gICAgICBvdXRwdXRTaGFwZXMgPSBbb3V0cHV0U2hhcGVdO1xuICAgIH1cblxuICAgIGlmICh0aGlzLnJldHVyblN0YXRlKSB7XG4gICAgICBpZiAodGhpcy5tZXJnZU1vZGUgPT0gbnVsbCkge1xuICAgICAgICByZXR1cm4gb3V0cHV0U2hhcGVzLmNvbmNhdChzdGF0ZVNoYXBlKS5jb25jYXQoc3RhdGVTaGFwZS5zbGljZSgpKTtcbiAgICAgIH1cbiAgICAgIHJldHVybiBbb3V0cHV0U2hhcGVdLmNvbmNhdChzdGF0ZVNoYXBlKS5jb25jYXQoc3RhdGVTaGFwZS5zbGljZSgpKTtcbiAgICB9XG4gICAgcmV0dXJuIGdlbmVyaWNfdXRpbHMuc2luZ2xldG9uT3JBcnJheShvdXRwdXRTaGFwZXMpO1xuICB9XG5cbiAgYXBwbHkoXG4gICAgICBpbnB1dHM6IFRlbnNvcnxUZW5zb3JbXXxTeW1ib2xpY1RlbnNvcnxTeW1ib2xpY1RlbnNvcltdLFxuICAgICAga3dhcmdzPzogS3dhcmdzKTogVGVuc29yfFRlbnNvcltdfFN5bWJvbGljVGVuc29yfFN5bWJvbGljVGVuc29yW10ge1xuICAgIGxldCBpbml0aWFsU3RhdGU6IFRlbnNvcltdfFN5bWJvbGljVGVuc29yW10gPVxuICAgICAgICBrd2FyZ3MgPT0gbnVsbCA/IG51bGwgOiBrd2FyZ3NbJ2luaXRpYWxTdGF0ZSddO1xuICAgIGxldCBjb25zdGFudHM6IFRlbnNvcltdfFN5bWJvbGljVGVuc29yW10gPVxuICAgICAgICBrd2FyZ3MgPT0gbnVsbCA/IG51bGwgOiBrd2FyZ3NbJ2NvbnN0YW50cyddO1xuICAgIGlmIChrd2FyZ3MgPT0gbnVsbCkge1xuICAgICAga3dhcmdzID0ge307XG4gICAgfVxuICAgIGNvbnN0IHN0YW5kYXJkaXplZCA9XG4gICAgICAgIHN0YW5kYXJkaXplQXJncyhpbnB1dHMsIGluaXRpYWxTdGF0ZSwgY29uc3RhbnRzLCB0aGlzLm51bUNvbnN0YW50cyk7XG4gICAgaW5wdXRzID0gc3RhbmRhcmRpemVkLmlucHV0cztcbiAgICBpbml0aWFsU3RhdGUgPSBzdGFuZGFyZGl6ZWQuaW5pdGlhbFN0YXRlO1xuICAgIGNvbnN0YW50cyA9IHN0YW5kYXJkaXplZC5jb25zdGFudHM7XG5cbiAgICBpZiAoQXJyYXkuaXNBcnJheShpbnB1dHMpKSB7XG4gICAgICBpbml0aWFsU3RhdGUgPSAoaW5wdXRzIGFzIFRlbnNvcltdIHwgU3ltYm9saWNUZW5zb3JbXSkuc2xpY2UoMSk7XG4gICAgICBpbnB1dHMgPSAoaW5wdXRzIGFzIFRlbnNvcltdIHwgU3ltYm9saWNUZW5zb3JbXSlbMF07XG4gICAgfVxuXG4gICAgaWYgKChpbml0aWFsU3RhdGUgPT0gbnVsbCB8fCBpbml0aWFsU3RhdGUubGVuZ3RoID09PSAwKSAmJlxuICAgICAgICBjb25zdGFudHMgPT0gbnVsbCkge1xuICAgICAgcmV0dXJuIHN1cGVyLmFwcGx5KGlucHV0cywga3dhcmdzKTtcbiAgICB9XG4gICAgY29uc3QgYWRkaXRpb25hbElucHV0czogQXJyYXk8VGVuc29yfFN5bWJvbGljVGVuc29yPiA9IFtdO1xuICAgIGNvbnN0IGFkZGl0aW9uYWxTcGVjczogSW5wdXRTcGVjW10gPSBbXTtcbiAgICBpZiAoaW5pdGlhbFN0YXRlICE9IG51bGwpIHtcbiAgICAgIGNvbnN0IG51bVN0YXRlcyA9IGluaXRpYWxTdGF0ZS5sZW5ndGg7XG4gICAgICBpZiAobnVtU3RhdGVzICUgMiA+IDApIHtcbiAgICAgICAgdGhyb3cgbmV3IFZhbHVlRXJyb3IoXG4gICAgICAgICAgICAnV2hlbiBwYXNzaW5nIGBpbml0aWFsU3RhdGVgIHRvIGEgQmlkcmVjdGlvbmFsIFJOTiwgJyArXG4gICAgICAgICAgICAndGhlIHN0YXRlIHNob3VsZCBiZSBhbiBBcnJheSBjb250YWluaW5nIHRoZSBzdGF0ZXMgb2YgJyArXG4gICAgICAgICAgICAndGhlIHVuZGVybHlpbmcgUk5Ocy4nKTtcbiAgICAgIH1cbiAgICAgIGt3YXJnc1snaW5pdGlhbFN0YXRlJ10gPSBpbml0aWFsU3RhdGU7XG4gICAgICBhZGRpdGlvbmFsSW5wdXRzLnB1c2goLi4uaW5pdGlhbFN0YXRlKTtcbiAgICAgIGNvbnN0IHN0YXRlU3BlY3MgPSAoaW5pdGlhbFN0YXRlIGFzIEFycmF5PFRlbnNvcnxTeW1ib2xpY1RlbnNvcj4pXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgIC5tYXAoc3RhdGUgPT4gbmV3IElucHV0U3BlYyh7c2hhcGU6IHN0YXRlLnNoYXBlfSkpO1xuICAgICAgdGhpcy5mb3J3YXJkTGF5ZXIuc3RhdGVTcGVjID0gc3RhdGVTcGVjcy5zbGljZSgwLCBudW1TdGF0ZXMgLyAyKTtcbiAgICAgIHRoaXMuYmFja3dhcmRMYXllci5zdGF0ZVNwZWMgPSBzdGF0ZVNwZWNzLnNsaWNlKG51bVN0YXRlcyAvIDIpO1xuICAgICAgYWRkaXRpb25hbFNwZWNzLnB1c2goLi4uc3RhdGVTcGVjcyk7XG4gICAgfVxuICAgIGlmIChjb25zdGFudHMgIT0gbnVsbCkge1xuICAgICAgdGhyb3cgbmV3IE5vdEltcGxlbWVudGVkRXJyb3IoXG4gICAgICAgICAgJ1N1cHBvcnQgZm9yIGNvbnN0YW50cyBpbiBCaWRpcmVjdGlvbmFsIGxheWVycyBpcyBub3QgJyArXG4gICAgICAgICAgJ2ltcGxlbWVudGVkIHlldC4nKTtcbiAgICB9XG5cbiAgICBjb25zdCBpc1N5bWJvbGljVGVuc29yID0gYWRkaXRpb25hbElucHV0c1swXSBpbnN0YW5jZW9mIFN5bWJvbGljVGVuc29yO1xuICAgIGZvciAoY29uc3QgdGVuc29yIG9mIGFkZGl0aW9uYWxJbnB1dHMpIHtcbiAgICAgIGlmICh0ZW5zb3IgaW5zdGFuY2VvZiBTeW1ib2xpY1RlbnNvciAhPT0gaXNTeW1ib2xpY1RlbnNvcikge1xuICAgICAgICB0aHJvdyBuZXcgVmFsdWVFcnJvcihcbiAgICAgICAgICAgICdUaGUgaW5pdGlhbCBzdGF0ZSBvZiBhIEJpZGlyZWN0aW9uYWwgbGF5ZXIgY2Fubm90IGJlICcgK1xuICAgICAgICAgICAgJ3NwZWNpZmllZCBhcyBhIG1peCBvZiBzeW1ib2xpYyBhbmQgbm9uLXN5bWJvbGljIHRlbnNvcnMnKTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICBpZiAoaXNTeW1ib2xpY1RlbnNvcikge1xuICAgICAgLy8gQ29tcHV0ZSB0aGUgZnVsbCBpbnB1dCBhbmQgc3BlY3MsIGluY2x1ZGluZyB0aGUgc3RhdGVzLlxuICAgICAgY29uc3QgZnVsbElucHV0ID0gW2lucHV0c10uY29uY2F0KGFkZGl0aW9uYWxJbnB1dHMpO1xuICAgICAgY29uc3QgZnVsbElucHV0U3BlYyA9IHRoaXMuaW5wdXRTcGVjLmNvbmNhdChhZGRpdGlvbmFsU3BlY3MpO1xuICAgICAgLy8gUGVyZm9ybSB0aGUgY2FsbCB0ZW1wb3JhcmlseSBhbmQgcmVwbGFjZSBpbnB1dFNwZWMuXG4gICAgICAvLyBOb3RlOiB3aXRoIGluaXRpYWwgc3RhdGVzIHN5bWJvbGljIGNhbGxzIGFuZCBub24tc3ltYm9saWMgY2FsbHMgdG9cbiAgICAgIC8vIHRoaXMgbWV0aG9kIGRpZmZlciBpbiBob3cgdGhlIGluaXRpYWwgc3RhdGVzIGFyZSBwYXNzZWQuIEZvclxuICAgICAgLy8gc3ltYm9saWMgY2FsbHMsIHRoZSBpbml0aWFsIHN0YXRlcyBhcmUgcGFzc2VkIGluIHRoZSBmaXJzdCBhcmcsIGFzXG4gICAgICAvLyBhbiBBcnJheSBvZiBTeW1ib2xpY1RlbnNvcnM7IGZvciBub24tc3ltYm9saWMgY2FsbHMsIHRoZXkgYXJlXG4gICAgICAvLyBwYXNzZWQgaW4gdGhlIHNlY29uZCBhcmcgYXMgYSBwYXJ0IG9mIHRoZSBrd2FyZ3MuIEhlbmNlIHRoZSBuZWVkIHRvXG4gICAgICAvLyB0ZW1wb3JhcmlseSBtb2RpZnkgaW5wdXRTcGVjIGhlcmUuXG4gICAgICAvLyBUT0RPKGNhaXMpOiBNYWtlIHJlZmFjdG9yaW5nIHNvIHRoYXQgdGhpcyBoYWNreSBjb2RlIGJlbG93IGlzIG5vXG4gICAgICAvLyBsb25nZXIgbmVlZGVkLlxuICAgICAgY29uc3Qgb3JpZ2luYWxJbnB1dFNwZWMgPSB0aGlzLmlucHV0U3BlYztcbiAgICAgIHRoaXMuaW5wdXRTcGVjID0gZnVsbElucHV0U3BlYztcbiAgICAgIGNvbnN0IG91dHB1dCA9XG4gICAgICAgICAgc3VwZXIuYXBwbHkoZnVsbElucHV0IGFzIFRlbnNvcltdIHwgU3ltYm9saWNUZW5zb3JbXSwga3dhcmdzKTtcbiAgICAgIHRoaXMuaW5wdXRTcGVjID0gb3JpZ2luYWxJbnB1dFNwZWM7XG4gICAgICByZXR1cm4gb3V0cHV0O1xuICAgIH0gZWxzZSB7XG4gICAgICByZXR1cm4gc3VwZXIuYXBwbHkoaW5wdXRzLCBrd2FyZ3MpO1xuICAgIH1cbiAgfVxuXG4gIGNhbGwoaW5wdXRzOiBUZW5zb3J8VGVuc29yW10sIGt3YXJnczogS3dhcmdzKTogVGVuc29yfFRlbnNvcltdIHtcbiAgICByZXR1cm4gdGlkeSgoKSA9PiB7XG4gICAgICBjb25zdCBpbml0aWFsU3RhdGUgPSBrd2FyZ3NbJ2luaXRpYWxTdGF0ZSddO1xuXG4gICAgICBsZXQgeTogVGVuc29yfFRlbnNvcltdO1xuICAgICAgbGV0IHlSZXY6IFRlbnNvcnxUZW5zb3JbXTtcbiAgICAgIGlmIChpbml0aWFsU3RhdGUgPT0gbnVsbCkge1xuICAgICAgICB5ID0gdGhpcy5mb3J3YXJkTGF5ZXIuY2FsbChpbnB1dHMsIGt3YXJncyk7XG4gICAgICAgIHlSZXYgPSB0aGlzLmJhY2t3YXJkTGF5ZXIuY2FsbChpbnB1dHMsIGt3YXJncyk7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBjb25zdCBmb3J3YXJkU3RhdGUgPSBpbml0aWFsU3RhdGUuc2xpY2UoMCwgaW5pdGlhbFN0YXRlLmxlbmd0aCAvIDIpO1xuICAgICAgICBjb25zdCBiYWNrd2FyZFN0YXRlID0gaW5pdGlhbFN0YXRlLnNsaWNlKGluaXRpYWxTdGF0ZS5sZW5ndGggLyAyKTtcbiAgICAgICAgeSA9IHRoaXMuZm9yd2FyZExheWVyLmNhbGwoXG4gICAgICAgICAgICBpbnB1dHMsIE9iamVjdC5hc3NpZ24oa3dhcmdzLCB7aW5pdGlhbFN0YXRlOiBmb3J3YXJkU3RhdGV9KSk7XG4gICAgICAgIHlSZXYgPSB0aGlzLmJhY2t3YXJkTGF5ZXIuY2FsbChcbiAgICAgICAgICAgIGlucHV0cywgT2JqZWN0LmFzc2lnbihrd2FyZ3MsIHtpbml0aWFsU3RhdGU6IGJhY2t3YXJkU3RhdGV9KSk7XG4gICAgICB9XG5cbiAgICAgIGxldCBzdGF0ZXM6IFRlbnNvcltdO1xuICAgICAgaWYgKHRoaXMucmV0dXJuU3RhdGUpIHtcbiAgICAgICAgaWYgKEFycmF5LmlzQXJyYXkoeSkpIHtcbiAgICAgICAgICBzdGF0ZXMgPSB5LnNsaWNlKDEpLmNvbmNhdCgoeVJldiBhcyBUZW5zb3JbXSkuc2xpY2UoMSkpO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICB9XG4gICAgICAgIHkgPSAoeSBhcyBUZW5zb3JbXSlbMF07XG4gICAgICAgIHlSZXYgPSAoeVJldiBhcyBUZW5zb3JbXSlbMF07XG4gICAgICB9XG5cbiAgICAgIGlmICh0aGlzLnJldHVyblNlcXVlbmNlcykge1xuICAgICAgICB5UmV2ID0gdGZjLnJldmVyc2UoeVJldiBhcyBUZW5zb3IsIDEpO1xuICAgICAgfVxuXG4gICAgICBsZXQgb3V0cHV0OiBUZW5zb3J8VGVuc29yW107XG4gICAgICBpZiAodGhpcy5tZXJnZU1vZGUgPT09ICdjb25jYXQnKSB7XG4gICAgICAgIG91dHB1dCA9IEsuY29uY2F0ZW5hdGUoW3kgYXMgVGVuc29yLCB5UmV2IGFzIFRlbnNvcl0pO1xuICAgICAgfSBlbHNlIGlmICh0aGlzLm1lcmdlTW9kZSA9PT0gJ3N1bScpIHtcbiAgICAgICAgb3V0cHV0ID0gdGZjLmFkZCh5IGFzIFRlbnNvciwgeVJldiBhcyBUZW5zb3IpO1xuICAgICAgfSBlbHNlIGlmICh0aGlzLm1lcmdlTW9kZSA9PT0gJ2F2ZScpIHtcbiAgICAgICAgb3V0cHV0ID0gdGZjLm11bCguNSwgdGZjLmFkZCh5IGFzIFRlbnNvciwgeVJldiBhcyBUZW5zb3IpKTtcbiAgICAgIH0gZWxzZSBpZiAodGhpcy5tZXJnZU1vZGUgPT09ICdtdWwnKSB7XG4gICAgICAgIG91dHB1dCA9IHRmYy5tdWwoeSBhcyBUZW5zb3IsIHlSZXYgYXMgVGVuc29yKTtcbiAgICAgIH0gZWxzZSBpZiAodGhpcy5tZXJnZU1vZGUgPT0gbnVsbCkge1xuICAgICAgICBvdXRwdXQgPSBbeSBhcyBUZW5zb3IsIHlSZXYgYXMgVGVuc29yXTtcbiAgICAgIH1cblxuICAgICAgLy8gVE9ETyhjYWlzKTogUHJvcGVybHkgc2V0IGxlYXJuaW5nIHBoYXNlLlxuICAgICAgaWYgKHRoaXMucmV0dXJuU3RhdGUpIHtcbiAgICAgICAgaWYgKHRoaXMubWVyZ2VNb2RlID09IG51bGwpIHtcbiAgICAgICAgICByZXR1cm4gKG91dHB1dCBhcyBUZW5zb3JbXSkuY29uY2F0KHN0YXRlcyk7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIFtvdXRwdXQgYXMgVGVuc29yXS5jb25jYXQoc3RhdGVzKTtcbiAgICAgIH1cbiAgICAgIHJldHVybiBvdXRwdXQ7XG4gICAgfSk7XG4gIH1cblxuICByZXNldFN0YXRlcyhzdGF0ZXM/OiBUZW5zb3J8VGVuc29yW10pOiB2b2lkIHtcbiAgICB0aGlzLmZvcndhcmRMYXllci5yZXNldFN0YXRlcygpO1xuICAgIHRoaXMuYmFja3dhcmRMYXllci5yZXNldFN0YXRlcygpO1xuICB9XG5cbiAgYnVpbGQoaW5wdXRTaGFwZTogU2hhcGV8U2hhcGVbXSk6IHZvaWQge1xuICAgIG5hbWVTY29wZSh0aGlzLmZvcndhcmRMYXllci5uYW1lLCAoKSA9PiB7XG4gICAgICB0aGlzLmZvcndhcmRMYXllci5idWlsZChpbnB1dFNoYXBlKTtcbiAgICB9KTtcbiAgICBuYW1lU2NvcGUodGhpcy5iYWNrd2FyZExheWVyLm5hbWUsICgpID0+IHtcbiAgICAgIHRoaXMuYmFja3dhcmRMYXllci5idWlsZChpbnB1dFNoYXBlKTtcbiAgICB9KTtcbiAgICB0aGlzLmJ1aWx0ID0gdHJ1ZTtcbiAgfVxuXG4gIGNvbXB1dGVNYXNrKGlucHV0czogVGVuc29yfFRlbnNvcltdLCBtYXNrPzogVGVuc29yfFRlbnNvcltdKTogVGVuc29yXG4gICAgICB8VGVuc29yW10ge1xuICAgIGlmIChBcnJheS5pc0FycmF5KG1hc2spKSB7XG4gICAgICBtYXNrID0gbWFza1swXTtcbiAgICB9XG4gICAgbGV0IG91dHB1dE1hc2s6IFRlbnNvcnxUZW5zb3JbXTtcbiAgICBpZiAodGhpcy5yZXR1cm5TZXF1ZW5jZXMpIHtcbiAgICAgIGlmICh0aGlzLm1lcmdlTW9kZSA9PSBudWxsKSB7XG4gICAgICAgIG91dHB1dE1hc2sgPSBbbWFzaywgbWFza107XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBvdXRwdXRNYXNrID0gbWFzaztcbiAgICAgIH1cbiAgICB9IGVsc2Uge1xuICAgICAgaWYgKHRoaXMubWVyZ2VNb2RlID09IG51bGwpIHtcbiAgICAgICAgb3V0cHV0TWFzayA9IFtudWxsLCBudWxsXTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIG91dHB1dE1hc2sgPSBudWxsO1xuICAgICAgfVxuICAgIH1cbiAgICBpZiAodGhpcy5yZXR1cm5TdGF0ZSkge1xuICAgICAgY29uc3Qgc3RhdGVzID0gdGhpcy5mb3J3YXJkTGF5ZXIuc3RhdGVzO1xuICAgICAgY29uc3Qgc3RhdGVNYXNrOiBUZW5zb3JbXSA9IHN0YXRlcy5tYXAoc3RhdGUgPT4gbnVsbCk7XG4gICAgICBpZiAoQXJyYXkuaXNBcnJheShvdXRwdXRNYXNrKSkge1xuICAgICAgICByZXR1cm4gb3V0cHV0TWFzay5jb25jYXQoc3RhdGVNYXNrKS5jb25jYXQoc3RhdGVNYXNrKTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHJldHVybiBbb3V0cHV0TWFza10uY29uY2F0KHN0YXRlTWFzaykuY29uY2F0KHN0YXRlTWFzayk7XG4gICAgICB9XG4gICAgfSBlbHNlIHtcbiAgICAgIHJldHVybiBvdXRwdXRNYXNrO1xuICAgIH1cbiAgfVxuXG4gIGdldCB0cmFpbmFibGVXZWlnaHRzKCk6IExheWVyVmFyaWFibGVbXSB7XG4gICAgcmV0dXJuIHRoaXMuZm9yd2FyZExheWVyLnRyYWluYWJsZVdlaWdodHMuY29uY2F0KFxuICAgICAgICB0aGlzLmJhY2t3YXJkTGF5ZXIudHJhaW5hYmxlV2VpZ2h0cyk7XG4gIH1cblxuICBnZXQgbm9uVHJhaW5hYmxlV2VpZ2h0cygpOiBMYXllclZhcmlhYmxlW10ge1xuICAgIHJldHVybiB0aGlzLmZvcndhcmRMYXllci5ub25UcmFpbmFibGVXZWlnaHRzLmNvbmNhdChcbiAgICAgICAgdGhpcy5iYWNrd2FyZExheWVyLm5vblRyYWluYWJsZVdlaWdodHMpO1xuICB9XG5cbiAgLy8gVE9ETyhjYWlzKTogSW1wbGVtZW50IGNvbnN0cmFpbnRzKCkuXG5cbiAgc2V0RmFzdFdlaWdodEluaXREdXJpbmdCdWlsZCh2YWx1ZTogYm9vbGVhbikge1xuICAgIHN1cGVyLnNldEZhc3RXZWlnaHRJbml0RHVyaW5nQnVpbGQodmFsdWUpO1xuICAgIGlmICh0aGlzLmZvcndhcmRMYXllciAhPSBudWxsKSB7XG4gICAgICB0aGlzLmZvcndhcmRMYXllci5zZXRGYXN0V2VpZ2h0SW5pdER1cmluZ0J1aWxkKHZhbHVlKTtcbiAgICB9XG4gICAgaWYgKHRoaXMuYmFja3dhcmRMYXllciAhPSBudWxsKSB7XG4gICAgICB0aGlzLmJhY2t3YXJkTGF5ZXIuc2V0RmFzdFdlaWdodEluaXREdXJpbmdCdWlsZCh2YWx1ZSk7XG4gICAgfVxuICB9XG5cbiAgZ2V0Q29uZmlnKCk6IHNlcmlhbGl6YXRpb24uQ29uZmlnRGljdCB7XG4gICAgY29uc3QgY29uZmlnOiBzZXJpYWxpemF0aW9uLkNvbmZpZ0RpY3QgPSB7XG4gICAgICAnbWVyZ2VNb2RlJzogdGhpcy5tZXJnZU1vZGUsXG4gICAgfTtcbiAgICAvLyBUT0RPKGNhaXMpOiBBZGQgbG9naWMgZm9yIGBudW1Db25zdGFudHNgIG9uY2UgdGhlIHByb3BlcnR5IGlzIGFkZGVkLlxuICAgIGNvbnN0IGJhc2VDb25maWcgPSBzdXBlci5nZXRDb25maWcoKTtcbiAgICBPYmplY3QuYXNzaWduKGNvbmZpZywgYmFzZUNvbmZpZyk7XG4gICAgcmV0dXJuIGNvbmZpZztcbiAgfVxuXG4gIC8qKiBAbm9jb2xsYXBzZSAqL1xuICBzdGF0aWMgZnJvbUNvbmZpZzxUIGV4dGVuZHMgc2VyaWFsaXphdGlvbi5TZXJpYWxpemFibGU+KFxuICAgICAgY2xzOiBzZXJpYWxpemF0aW9uLlNlcmlhbGl6YWJsZUNvbnN0cnVjdG9yPFQ+LFxuICAgICAgY29uZmlnOiBzZXJpYWxpemF0aW9uLkNvbmZpZ0RpY3QpOiBUIHtcbiAgICBjb25zdCBybm5MYXllciA9XG4gICAgICAgIGRlc2VyaWFsaXplKGNvbmZpZ1snbGF5ZXInXSBhcyBzZXJpYWxpemF0aW9uLkNvbmZpZ0RpY3QpIGFzIFJOTjtcbiAgICBkZWxldGUgY29uZmlnWydsYXllciddO1xuICAgIC8vIFRPRE8oY2Fpcyk6IEFkZCBsb2dpYyBmb3IgYG51bUNvbnN0YW50c2Agb25jZSB0aGUgcHJvcGVydHkgaXMgYWRkZWQuXG4gICAgaWYgKGNvbmZpZ1snbnVtQ29uc3RhbnRzJ10gIT0gbnVsbCkge1xuICAgICAgdGhyb3cgbmV3IE5vdEltcGxlbWVudGVkRXJyb3IoXG4gICAgICAgICAgYERlc2VyaWFsaXphdGlvbiBvZiBhIEJpZGlyZWN0aW9uYWwgbGF5ZXIgd2l0aCBudW1Db25zdGFudHMgYCArXG4gICAgICAgICAgYHByZXNlbnQgaXMgbm90IHN1cHBvcnRlZCB5ZXQuYCk7XG4gICAgfVxuICAgIC8vIHRzbGludDpkaXNhYmxlLW5leHQtbGluZTpuby1hbnlcbiAgICBjb25zdCBuZXdDb25maWc6IHtba2V5OiBzdHJpbmddOiBhbnl9ID0gY29uZmlnO1xuICAgIG5ld0NvbmZpZ1snbGF5ZXInXSA9IHJubkxheWVyO1xuICAgIHJldHVybiBuZXcgY2xzKG5ld0NvbmZpZyk7XG4gIH1cbn1cbnNlcmlhbGl6YXRpb24ucmVnaXN0ZXJDbGFzcyhCaWRpcmVjdGlvbmFsKTtcbiJdfQ==","/**\n * @license\n * Copyright 2022 CodeSmith LLC\n *\n * Use of this source code is governed by an MIT-style\n * license that can be found in the LICENSE file or at\n * https://opensource.org/licenses/MIT.\n * =============================================================================\n */\nimport { Layer } from '../../engine/topology';\nimport { serialization, mul, add, tidy } from '@tensorflow/tfjs-core';\nimport { getExactlyOneTensor } from '../../utils/types_utils';\nimport * as K from '../../backend/tfjs_backend';\n/**\n * Preprocessing Rescaling Layer\n *\n * This rescales images by a scaling and offset factor\n */\nexport class Rescaling extends Layer {\n constructor(args) {\n super(args);\n this.scale = args.scale;\n if (args.offset) {\n this.offset = args.offset;\n }\n else {\n this.offset = 0;\n }\n }\n getConfig() {\n const config = {\n 'scale': this.scale,\n 'offset': this.offset\n };\n const baseConfig = super.getConfig();\n Object.assign(config, baseConfig);\n return config;\n }\n call(inputs, kwargs) {\n return tidy(() => {\n inputs = getExactlyOneTensor(inputs);\n if (inputs.dtype !== 'float32') {\n inputs = K.cast(inputs, 'float32');\n }\n return add(mul(inputs, this.scale), this.offset);\n });\n }\n}\n/** @nocollapse */\nRescaling.className = 'Rescaling';\nserialization.registerClass(Rescaling);\n//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW1hZ2VfcHJlcHJvY2Vzc2luZy5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uLy4uLy4uL3RmanMtbGF5ZXJzL3NyYy9sYXllcnMvcHJlcHJvY2Vzc2luZy9pbWFnZV9wcmVwcm9jZXNzaW5nLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBOzs7Ozs7OztHQVFHO0FBRUgsT0FBTyxFQUFZLEtBQUssRUFBQyxNQUFNLHVCQUF1QixDQUFDO0FBQ3ZELE9BQU8sRUFBRSxhQUFhLEVBQVUsR0FBRyxFQUFFLEdBQUcsRUFBRSxJQUFJLEVBQUUsTUFBTSx1QkFBdUIsQ0FBQztBQUM5RSxPQUFPLEVBQUUsbUJBQW1CLEVBQUUsTUFBTSx5QkFBeUIsQ0FBQztBQUM5RCxPQUFPLEtBQUssQ0FBQyxNQUFNLDRCQUE0QixDQUFDO0FBUWhEOzs7O0dBSUc7QUFDSCxNQUFNLE9BQU8sU0FBVSxTQUFRLEtBQUs7SUFLbEMsWUFBWSxJQUFtQjtRQUM3QixLQUFLLENBQUMsSUFBSSxDQUFDLENBQUM7UUFFWixJQUFJLENBQUMsS0FBSyxHQUFHLElBQUksQ0FBQyxLQUFLLENBQUM7UUFFeEIsSUFBRyxJQUFJLENBQUMsTUFBTSxFQUFFO1lBQ2hCLElBQUksQ0FBQyxNQUFNLEdBQUcsSUFBSSxDQUFDLE1BQU0sQ0FBQztTQUN6QjthQUFNO1lBQ0wsSUFBSSxDQUFDLE1BQU0sR0FBRyxDQUFDLENBQUM7U0FDakI7SUFDSCxDQUFDO0lBRUQsU0FBUztRQUNQLE1BQU0sTUFBTSxHQUE2QjtZQUN2QyxPQUFPLEVBQUUsSUFBSSxDQUFDLEtBQUs7WUFDbkIsUUFBUSxFQUFFLElBQUksQ0FBQyxNQUFNO1NBQ3RCLENBQUM7UUFFRixNQUFNLFVBQVUsR0FBRyxLQUFLLENBQUMsU0FBUyxFQUFFLENBQUM7UUFDckMsTUFBTSxDQUFDLE1BQU0sQ0FBQyxNQUFNLEVBQUUsVUFBVSxDQUFDLENBQUM7UUFDbEMsT0FBTyxNQUFNLENBQUM7SUFDaEIsQ0FBQztJQUVELElBQUksQ0FBQyxNQUF1QixFQUFFLE1BQWM7UUFDMUMsT0FBTyxJQUFJLENBQUMsR0FBRyxFQUFFO1lBQ2YsTUFBTSxHQUFHLG1CQUFtQixDQUFDLE1BQU0sQ0FBQyxDQUFDO1lBQ3JDLElBQUcsTUFBTSxDQUFDLEtBQUssS0FBSyxTQUFTLEVBQUU7Z0JBQzNCLE1BQU0sR0FBRyxDQUFDLENBQUMsSUFBSSxDQUFDLE1BQU0sRUFBRSxTQUFTLENBQUMsQ0FBQzthQUN0QztZQUNELE9BQU8sR0FBRyxDQUFDLEdBQUcsQ0FBQyxNQUFNLEVBQUUsSUFBSSxDQUFDLEtBQUssQ0FBQyxFQUFFLElBQUksQ0FBQyxNQUFNLENBQUMsQ0FBQztRQUNuRCxDQUFDLENBQUMsQ0FBQztJQUNMLENBQUM7O0FBbkNELGtCQUFrQjtBQUNYLG1CQUFTLEdBQUcsV0FBVyxDQUFDO0FBcUNqQyxhQUFhLENBQUMsYUFBYSxDQUFDLFNBQVMsQ0FBQyxDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiLyoqXG4gKiBAbGljZW5zZVxuICogQ29weXJpZ2h0IDIwMjIgQ29kZVNtaXRoIExMQ1xuICpcbiAqIFVzZSBvZiB0aGlzIHNvdXJjZSBjb2RlIGlzIGdvdmVybmVkIGJ5IGFuIE1JVC1zdHlsZVxuICogbGljZW5zZSB0aGF0IGNhbiBiZSBmb3VuZCBpbiB0aGUgTElDRU5TRSBmaWxlIG9yIGF0XG4gKiBodHRwczovL29wZW5zb3VyY2Uub3JnL2xpY2Vuc2VzL01JVC5cbiAqID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4gKi9cblxuaW1wb3J0IHtMYXllckFyZ3MsIExheWVyfSBmcm9tICcuLi8uLi9lbmdpbmUvdG9wb2xvZ3knO1xuaW1wb3J0IHsgc2VyaWFsaXphdGlvbiwgVGVuc29yLCBtdWwsIGFkZCwgdGlkeSB9IGZyb20gJ0B0ZW5zb3JmbG93L3RmanMtY29yZSc7XG5pbXBvcnQgeyBnZXRFeGFjdGx5T25lVGVuc29yIH0gZnJvbSAnLi4vLi4vdXRpbHMvdHlwZXNfdXRpbHMnO1xuaW1wb3J0ICogYXMgSyBmcm9tICcuLi8uLi9iYWNrZW5kL3RmanNfYmFja2VuZCc7XG5pbXBvcnQgeyBLd2FyZ3MgfSBmcm9tICcuLi8uLi90eXBlcyc7XG5cbmV4cG9ydCBkZWNsYXJlIGludGVyZmFjZSBSZXNjYWxpbmdBcmdzIGV4dGVuZHMgTGF5ZXJBcmdzIHtcbiAgc2NhbGU6IG51bWJlcjtcbiAgb2Zmc2V0PzogbnVtYmVyO1xufVxuXG4vKipcbiAqIFByZXByb2Nlc3NpbmcgUmVzY2FsaW5nIExheWVyXG4gKlxuICogVGhpcyByZXNjYWxlcyBpbWFnZXMgYnkgYSBzY2FsaW5nIGFuZCBvZmZzZXQgZmFjdG9yXG4gKi9cbmV4cG9ydCBjbGFzcyBSZXNjYWxpbmcgZXh0ZW5kcyBMYXllciB7XG4gIC8qKiBAbm9jb2xsYXBzZSAqL1xuICBzdGF0aWMgY2xhc3NOYW1lID0gJ1Jlc2NhbGluZyc7XG4gIHByaXZhdGUgcmVhZG9ubHkgc2NhbGU6IG51bWJlcjtcbiAgcHJpdmF0ZSByZWFkb25seSBvZmZzZXQ6IG51bWJlcjtcbiAgY29uc3RydWN0b3IoYXJnczogUmVzY2FsaW5nQXJncykge1xuICAgIHN1cGVyKGFyZ3MpO1xuXG4gICAgdGhpcy5zY2FsZSA9IGFyZ3Muc2NhbGU7XG5cbiAgICBpZihhcmdzLm9mZnNldCkge1xuICAgIHRoaXMub2Zmc2V0ID0gYXJncy5vZmZzZXQ7XG4gICAgfSBlbHNlIHtcbiAgICAgIHRoaXMub2Zmc2V0ID0gMDtcbiAgICB9XG4gIH1cblxuICBnZXRDb25maWcoKTogc2VyaWFsaXphdGlvbi5Db25maWdEaWN0IHtcbiAgICBjb25zdCBjb25maWc6IHNlcmlhbGl6YXRpb24uQ29uZmlnRGljdCA9IHtcbiAgICAgICdzY2FsZSc6IHRoaXMuc2NhbGUsXG4gICAgICAnb2Zmc2V0JzogdGhpcy5vZmZzZXRcbiAgICB9O1xuXG4gICAgY29uc3QgYmFzZUNvbmZpZyA9IHN1cGVyLmdldENvbmZpZygpO1xuICAgIE9iamVjdC5hc3NpZ24oY29uZmlnLCBiYXNlQ29uZmlnKTtcbiAgICByZXR1cm4gY29uZmlnO1xuICB9XG5cbiAgY2FsbChpbnB1dHM6IFRlbnNvcnxUZW5zb3JbXSwga3dhcmdzOiBLd2FyZ3MpOiBUZW5zb3JbXXxUZW5zb3Ige1xuICAgIHJldHVybiB0aWR5KCgpID0+IHtcbiAgICAgIGlucHV0cyA9IGdldEV4YWN0bHlPbmVUZW5zb3IoaW5wdXRzKTtcbiAgICAgIGlmKGlucHV0cy5kdHlwZSAhPT0gJ2Zsb2F0MzInKSB7XG4gICAgICAgICAgaW5wdXRzID0gSy5jYXN0KGlucHV0cywgJ2Zsb2F0MzInKTtcbiAgICAgIH1cbiAgICAgIHJldHVybiBhZGQobXVsKGlucHV0cywgdGhpcy5zY2FsZSksIHRoaXMub2Zmc2V0KTtcbiAgICB9KTtcbiAgfVxufVxuXG5zZXJpYWxpemF0aW9uLnJlZ2lzdGVyQ2xhc3MoUmVzY2FsaW5nKTtcbiJdfQ==","/**\n * @license\n * Copyright 2018 Google LLC\n *\n * Use of this source code is governed by an MIT-style\n * license that can be found in the LICENSE file or at\n * https://opensource.org/licenses/MIT.\n * =============================================================================\n */\nimport { InputLayer } from './engine/input_layer';\nimport { Layer } from './engine/topology';\nimport { input } from './exports';\nimport { ELU, LeakyReLU, PReLU, ReLU, Softmax, ThresholdedReLU } from './layers/advanced_activations';\nimport { Conv1D, Conv2D, Conv2DTranspose, Conv3D, Cropping2D, SeparableConv2D, UpSampling2D, Conv3DTranspose } from './layers/convolutional';\nimport { DepthwiseConv2D } from './layers/convolutional_depthwise';\nimport { ConvLSTM2D, ConvLSTM2DCell } from './layers/convolutional_recurrent';\nimport { Activation, Dense, Dropout, Flatten, Masking, Permute, RepeatVector, Reshape, SpatialDropout1D } from './layers/core';\nimport { Embedding } from './layers/embeddings';\nimport { Add, Average, Concatenate, Dot, Maximum, Minimum, Multiply } from './layers/merge';\nimport { AlphaDropout, GaussianDropout, GaussianNoise } from './layers/noise';\nimport { BatchNormalization, LayerNormalization } from './layers/normalization';\nimport { ZeroPadding2D } from './layers/padding';\nimport { AveragePooling1D, AveragePooling2D, AveragePooling3D, GlobalAveragePooling1D, GlobalAveragePooling2D, GlobalMaxPooling1D, GlobalMaxPooling2D, MaxPooling1D, MaxPooling2D, MaxPooling3D } from './layers/pooling';\nimport { GRU, GRUCell, LSTM, LSTMCell, RNN, RNNCell, SimpleRNN, SimpleRNNCell, StackedRNNCells } from './layers/recurrent';\nimport { Bidirectional, TimeDistributed } from './layers/wrappers';\nimport { Rescaling } from './layers/preprocessing/image_preprocessing';\n// TODO(cais): Add doc string to all the public static functions in this\n// class; include exectuable JavaScript code snippets where applicable\n// (b/74074458).\n// Input Layer.\n/**\n * An input layer is an entry point into a `tf.LayersModel`.\n *\n * `InputLayer` is generated automatically for `tf.Sequential` models by\n * specifying the `inputshape` or `batchInputShape` for the first layer. It\n * should not be specified explicitly. However, it can be useful sometimes,\n * e.g., when constructing a sequential model from a subset of another\n * sequential model's layers. Like the code snippet below shows.\n *\n * ```js\n * // Define a model which simply adds two inputs.\n * const model1 = tf.sequential();\n * model1.add(tf.layers.dense({inputShape: [4], units: 3, activation: 'relu'}));\n * model1.add(tf.layers.dense({units: 1, activation: 'sigmoid'}));\n * model1.summary();\n * model1.predict(tf.zeros([1, 4])).print();\n *\n * // Construct another model, reusing the second layer of `model1` while\n * // not using the first layer of `model1`. Note that you cannot add the second\n * // layer of `model` directly as the first layer of the new sequential model,\n * // because doing so will lead to an error related to the fact that the layer\n * // is not an input layer. Instead, you need to create an `inputLayer` and add\n * // it to the new sequential model before adding the reused layer.\n * const model2 = tf.sequential();\n * // Use an inputShape that matches the input shape of `model1`'s second\n * // layer.\n * model2.add(tf.layers.inputLayer({inputShape: [3]}));\n * model2.add(model1.layers[1]);\n * model2.summary();\n * model2.predict(tf.zeros([1, 3])).print();\n * ```\n *\n * @doc {heading: 'Layers', subheading: 'Inputs', namespace: 'layers'}\n */\nexport function inputLayer(args) {\n return new InputLayer(args);\n}\n// Advanced Activation Layers.\n/**\n * Exponential Linear Unit (ELU).\n *\n * It follows:\n * `f(x) = alpha * (exp(x) - 1.) for x < 0`,\n * `f(x) = x for x >= 0`.\n *\n * Input shape:\n * Arbitrary. Use the configuration `inputShape` when using this layer as the\n * first layer in a model.\n *\n * Output shape:\n * Same shape as the input.\n *\n * References:\n * - [Fast and Accurate Deep Network Learning by Exponential Linear Units\n * (ELUs)](https://arxiv.org/abs/1511.07289v1)\n *\n * @doc {\n * heading: 'Layers',\n * subheading: 'Advanced Activation',\n * namespace: 'layers'\n * }\n */\nexport function elu(args) {\n return new ELU(args);\n}\n/**\n * Rectified Linear Unit activation function.\n *\n * Input shape:\n * Arbitrary. Use the config field `inputShape` (Array of integers, does\n * not include the sample axis) when using this layer as the first layer\n * in a model.\n *\n * Output shape:\n * Same shape as the input.\n *\n * @doc {\n * heading: 'Layers',\n * subheading: 'Advanced Activation',\n * namespace: 'layers'\n * }\n */\nexport function reLU(args) {\n return new ReLU(args);\n}\n/**\n * Leaky version of a rectified linear unit.\n *\n * It allows a small gradient when the unit is not active:\n * `f(x) = alpha * x for x < 0.`\n * `f(x) = x for x >= 0.`\n *\n * Input shape:\n * Arbitrary. Use the configuration `inputShape` when using this layer as the\n * first layer in a model.\n *\n * Output shape:\n * Same shape as the input.\n *\n * @doc {\n * heading: 'Layers',\n * subheading: 'Advanced Activation',\n * namespace: 'layers'\n * }\n */\nexport function leakyReLU(args) {\n return new LeakyReLU(args);\n}\n/**\n * Parameterized version of a leaky rectified linear unit.\n *\n * It follows\n * `f(x) = alpha * x for x < 0.`\n * `f(x) = x for x >= 0.`\n * wherein `alpha` is a trainable weight.\n *\n * Input shape:\n * Arbitrary. Use the configuration `inputShape` when using this layer as the\n * first layer in a model.\n *\n * Output shape:\n * Same shape as the input.\n *\n * @doc {\n * heading: 'Layers',\n * subheading: 'Advanced Activation',\n * namespace: 'layers'\n * }\n */\nexport function prelu(args) {\n return new PReLU(args);\n}\n/**\n * Softmax activation layer.\n *\n * Input shape:\n * Arbitrary. Use the configuration `inputShape` when using this layer as the\n * first layer in a model.\n *\n * Output shape:\n * Same shape as the input.\n *\n * @doc {\n * heading: 'Layers',\n * subheading: 'Advanced Activation',\n * namespace: 'layers'\n * }\n */\nexport function softmax(args) {\n return new Softmax(args);\n}\n/**\n * Thresholded Rectified Linear Unit.\n *\n * It follows:\n * `f(x) = x for x > theta`,\n * `f(x) = 0 otherwise`.\n *\n * Input shape:\n * Arbitrary. Use the configuration `inputShape` when using this layer as the\n * first layer in a model.\n *\n * Output shape:\n * Same shape as the input.\n *\n * References:\n * - [Zero-Bias Autoencoders and the Benefits of Co-Adapting\n * Features](http://arxiv.org/abs/1402.3337)\n *\n * @doc {\n * heading: 'Layers',\n * subheading: 'Advanced Activation',\n * namespace: 'layers'\n * }\n */\nexport function thresholdedReLU(args) {\n return new ThresholdedReLU(args);\n}\n// Convolutional Layers.\n/**\n * 1D convolution layer (e.g., temporal convolution).\n *\n * This layer creates a convolution kernel that is convolved\n * with the layer input over a single spatial (or temporal) dimension\n * to produce a tensor of outputs.\n *\n * If `use_bias` is True, a bias vector is created and added to the outputs.\n *\n * If `activation` is not `null`, it is applied to the outputs as well.\n *\n * When using this layer as the first layer in a model, provide an\n * `inputShape` argument `Array` or `null`.\n *\n * For example, `inputShape` would be:\n * - `[10, 128]` for sequences of 10 vectors of 128-dimensional vectors\n * - `[null, 128]` for variable-length sequences of 128-dimensional vectors.\n *\n * @doc {heading: 'Layers', subheading: 'Convolutional', namespace: 'layers'}\n */\nexport function conv1d(args) {\n return new Conv1D(args);\n}\n/**\n * 2D convolution layer (e.g. spatial convolution over images).\n *\n * This layer creates a convolution kernel that is convolved\n * with the layer input to produce a tensor of outputs.\n *\n * If `useBias` is True, a bias vector is created and added to the outputs.\n *\n * If `activation` is not `null`, it is applied to the outputs as well.\n *\n * When using this layer as the first layer in a model,\n * provide the keyword argument `inputShape`\n * (Array of integers, does not include the sample axis),\n * e.g. `inputShape=[128, 128, 3]` for 128x128 RGB pictures\n * in `dataFormat='channelsLast'`.\n *\n * @doc {heading: 'Layers', subheading: 'Convolutional', namespace: 'layers'}\n */\nexport function conv2d(args) {\n return new Conv2D(args);\n}\n/**\n * Transposed convolutional layer (sometimes called Deconvolution).\n *\n * The need for transposed convolutions generally arises\n * from the desire to use a transformation going in the opposite direction of\n * a normal convolution, i.e., from something that has the shape of the output\n * of some convolution to something that has the shape of its input while\n * maintaining a connectivity pattern that is compatible with said\n * convolution.\n *\n * When using this layer as the first layer in a model, provide the\n * configuration `inputShape` (`Array` of integers, does not include the\n * sample axis), e.g., `inputShape: [128, 128, 3]` for 128x128 RGB pictures in\n * `dataFormat: 'channelsLast'`.\n *\n * Input shape:\n * 4D tensor with shape:\n * `[batch, channels, rows, cols]` if `dataFormat` is `'channelsFirst'`.\n * or 4D tensor with shape\n * `[batch, rows, cols, channels]` if `dataFormat` is `'channelsLast'`.\n *\n * Output shape:\n * 4D tensor with shape:\n * `[batch, filters, newRows, newCols]` if `dataFormat` is\n * `'channelsFirst'`. or 4D tensor with shape:\n * `[batch, newRows, newCols, filters]` if `dataFormat` is `'channelsLast'`.\n *\n * References:\n * - [A guide to convolution arithmetic for deep\n * learning](https://arxiv.org/abs/1603.07285v1)\n * - [Deconvolutional\n * Networks](http://www.matthewzeiler.com/pubs/cvpr2010/cvpr2010.pdf)\n *\n * @doc {heading: 'Layers', subheading: 'Convolutional', namespace: 'layers'}\n */\nexport function conv2dTranspose(args) {\n return new Conv2DTranspose(args);\n}\n/**\n * 3D convolution layer (e.g. spatial convolution over volumes).\n *\n * This layer creates a convolution kernel that is convolved\n * with the layer input to produce a tensor of outputs.\n *\n * If `useBias` is True, a bias vector is created and added to the outputs.\n *\n * If `activation` is not `null`, it is applied to the outputs as well.\n *\n * When using this layer as the first layer in a model,\n * provide the keyword argument `inputShape`\n * (Array of integers, does not include the sample axis),\n * e.g. `inputShape=[128, 128, 128, 1]` for 128x128x128 grayscale volumes\n * in `dataFormat='channelsLast'`.\n *\n * @doc {heading: 'Layers', subheading: 'Convolutional', namespace: 'layers'}\n */\nexport function conv3d(args) {\n return new Conv3D(args);\n}\nexport function conv3dTranspose(args) {\n return new Conv3DTranspose(args);\n}\n/**\n * Depthwise separable 2D convolution.\n *\n * Separable convolution consists of first performing\n * a depthwise spatial convolution\n * (which acts on each input channel separately)\n * followed by a pointwise convolution which mixes together the resulting\n * output channels. The `depthMultiplier` argument controls how many\n * output channels are generated per input channel in the depthwise step.\n *\n * Intuitively, separable convolutions can be understood as\n * a way to factorize a convolution kernel into two smaller kernels,\n * or as an extreme version of an Inception block.\n *\n * Input shape:\n * 4D tensor with shape:\n * `[batch, channels, rows, cols]` if data_format='channelsFirst'\n * or 4D tensor with shape:\n * `[batch, rows, cols, channels]` if data_format='channelsLast'.\n *\n * Output shape:\n * 4D tensor with shape:\n * `[batch, filters, newRows, newCols]` if data_format='channelsFirst'\n * or 4D tensor with shape:\n * `[batch, newRows, newCols, filters]` if data_format='channelsLast'.\n * `rows` and `cols` values might have changed due to padding.\n *\n * @doc {heading: 'Layers', subheading: 'Convolutional', namespace: 'layers'}\n */\nexport function separableConv2d(args) {\n return new SeparableConv2D(args);\n}\n/**\n * Cropping layer for 2D input (e.g., image).\n *\n * This layer can crop an input\n * at the top, bottom, left and right side of an image tensor.\n *\n * Input shape:\n * 4D tensor with shape:\n * - If `dataFormat` is `\"channelsLast\"`:\n * `[batch, rows, cols, channels]`\n * - If `data_format` is `\"channels_first\"`:\n * `[batch, channels, rows, cols]`.\n *\n * Output shape:\n * 4D with shape:\n * - If `dataFormat` is `\"channelsLast\"`:\n * `[batch, croppedRows, croppedCols, channels]`\n * - If `dataFormat` is `\"channelsFirst\"`:\n * `[batch, channels, croppedRows, croppedCols]`.\n *\n * Examples\n * ```js\n *\n * const model = tf.sequential();\n * model.add(tf.layers.cropping2D({cropping:[[2, 2], [2, 2]],\n * inputShape: [128, 128, 3]}));\n * //now output shape is [batch, 124, 124, 3]\n * ```\n *\n * @doc {heading: 'Layers', subheading: 'Convolutional', namespace: 'layers'}\n */\nexport function cropping2D(args) {\n return new Cropping2D(args);\n}\n/**\n * Upsampling layer for 2D inputs.\n *\n * Repeats the rows and columns of the data\n * by size[0] and size[1] respectively.\n *\n *\n * Input shape:\n * 4D tensor with shape:\n * - If `dataFormat` is `\"channelsLast\"`:\n * `[batch, rows, cols, channels]`\n * - If `dataFormat` is `\"channelsFirst\"`:\n * `[batch, channels, rows, cols]`\n *\n * Output shape:\n * 4D tensor with shape:\n * - If `dataFormat` is `\"channelsLast\"`:\n * `[batch, upsampledRows, upsampledCols, channels]`\n * - If `dataFormat` is `\"channelsFirst\"`:\n * `[batch, channels, upsampledRows, upsampledCols]`\n *\n *\n * @doc {heading: 'Layers', subheading: 'Convolutional', namespace: 'layers'}\n */\nexport function upSampling2d(args) {\n return new UpSampling2D(args);\n}\n// Convolutional(depthwise) Layers.\n/**\n * Depthwise separable 2D convolution.\n *\n * Depthwise Separable convolutions consists in performing just the first step\n * in a depthwise spatial convolution (which acts on each input channel\n * separately). The `depthMultiplier` argument controls how many output channels\n * are generated per input channel in the depthwise step.\n *\n * @doc {heading: 'Layers', subheading: 'Convolutional', namespace: 'layers'}\n */\nexport function depthwiseConv2d(args) {\n return new DepthwiseConv2D(args);\n}\n// Basic Layers.\n/**\n * Applies an activation function to an output.\n *\n * This layer applies element-wise activation function. Other layers, notably\n * `dense` can also apply activation functions. Use this isolated activation\n * function to extract the values before and after the\n * activation. For instance:\n *\n * ```js\n * const input = tf.input({shape: [5]});\n * const denseLayer = tf.layers.dense({units: 1});\n * const activationLayer = tf.layers.activation({activation: 'relu6'});\n *\n * // Obtain the output symbolic tensors by applying the layers in order.\n * const denseOutput = denseLayer.apply(input);\n * const activationOutput = activationLayer.apply(denseOutput);\n *\n * // Create the model based on the inputs.\n * const model = tf.model({\n * inputs: input,\n * outputs: [denseOutput, activationOutput]\n * });\n *\n * // Collect both outputs and print separately.\n * const [denseOut, activationOut] = model.predict(tf.randomNormal([6, 5]));\n * denseOut.print();\n * activationOut.print();\n * ```\n *\n * @doc {heading: 'Layers', subheading: 'Basic', namespace: 'layers'}\n */\nexport function activation(args) {\n return new Activation(args);\n}\n/**\n * Creates a dense (fully connected) layer.\n *\n * This layer implements the operation:\n * `output = activation(dot(input, kernel) + bias)`\n *\n * `activation` is the element-wise activation function\n * passed as the `activation` argument.\n *\n * `kernel` is a weights matrix created by the layer.\n *\n * `bias` is a bias vector created by the layer (only applicable if `useBias`\n * is `true`).\n *\n * **Input shape:**\n *\n * nD `tf.Tensor` with shape: `(batchSize, ..., inputDim)`.\n *\n * The most common situation would be\n * a 2D input with shape `(batchSize, inputDim)`.\n *\n * **Output shape:**\n *\n * nD tensor with shape: `(batchSize, ..., units)`.\n *\n * For instance, for a 2D input with shape `(batchSize, inputDim)`,\n * the output would have shape `(batchSize, units)`.\n *\n * Note: if the input to the layer has a rank greater than 2, then it is\n * flattened prior to the initial dot product with the kernel.\n *\n * @doc {heading: 'Layers', subheading: 'Basic', namespace: 'layers'}\n */\nexport function dense(args) {\n return new Dense(args);\n}\n/**\n * Applies\n * [dropout](http://www.cs.toronto.edu/~rsalakhu/papers/srivastava14a.pdf) to\n * the input.\n *\n * Dropout consists in randomly setting a fraction `rate` of input units to 0 at\n * each update during training time, which helps prevent overfitting.\n *\n * @doc {heading: 'Layers', subheading: 'Basic', namespace: 'layers'}\n */\nexport function dropout(args) {\n return new Dropout(args);\n}\n/**\n * Spatial 1D version of Dropout.\n *\n * This Layer type performs the same function as the Dropout layer, but it drops\n * entire 1D feature maps instead of individual elements. For example, if an\n * input example consists of 3 timesteps and the feature map for each timestep\n * has a size of 4, a `spatialDropout1d` layer may zero out the feature maps\n * of the 1st timesteps and 2nd timesteps completely while sparing all feature\n * elements of the 3rd timestep.\n *\n * If adjacent frames (timesteps) are strongly correlated (as is normally the\n * case in early convolution layers), regular dropout will not regularize the\n * activation and will otherwise just result in merely an effective learning\n * rate decrease. In this case, `spatialDropout1d` will help promote\n * independence among feature maps and should be used instead.\n *\n * **Arguments:**\n * rate: A floating-point number >=0 and <=1. Fraction of the input elements\n * to drop.\n *\n * **Input shape:**\n * 3D tensor with shape `(samples, timesteps, channels)`.\n *\n * **Output shape:**\n * Same as the input shape.\n *\n * References:\n * - [Efficient Object Localization Using Convolutional\n * Networks](https://arxiv.org/abs/1411.4280)\n *\n * @doc {heading: 'Layers', subheading: 'Basic', namespace: 'layers'}\n */\nexport function spatialDropout1d(args) {\n return new SpatialDropout1D(args);\n}\n/**\n * Flattens the input. Does not affect the batch size.\n *\n * A `Flatten` layer flattens each batch in its inputs to 1D (making the output\n * 2D).\n *\n * For example:\n *\n * ```js\n * const input = tf.input({shape: [4, 3]});\n * const flattenLayer = tf.layers.flatten();\n * // Inspect the inferred output shape of the flatten layer, which\n * // equals `[null, 12]`. The 2nd dimension is 4 * 3, i.e., the result of the\n * // flattening. (The 1st dimension is the undermined batch size.)\n * console.log(JSON.stringify(flattenLayer.apply(input).shape));\n * ```\n *\n * @doc {heading: 'Layers', subheading: 'Basic', namespace: 'layers'}\n */\nexport function flatten(args) {\n return new Flatten(args);\n}\n/**\n * Repeats the input n times in a new dimension.\n *\n * ```js\n * const model = tf.sequential();\n * model.add(tf.layers.repeatVector({n: 4, inputShape: [2]}));\n * const x = tf.tensor2d([[10, 20]]);\n * // Use the model to do inference on a data point the model hasn't see\n * model.predict(x).print();\n * // output shape is now [batch, 2, 4]\n * ```\n *\n * @doc {heading: 'Layers', subheading: 'Basic', namespace: 'layers'}\n */\nexport function repeatVector(args) {\n return new RepeatVector(args);\n}\n/**\n * Reshapes an input to a certain shape.\n *\n * ```js\n * const input = tf.input({shape: [4, 3]});\n * const reshapeLayer = tf.layers.reshape({targetShape: [2, 6]});\n * // Inspect the inferred output shape of the Reshape layer, which\n * // equals `[null, 2, 6]`. (The 1st dimension is the undermined batch size.)\n * console.log(JSON.stringify(reshapeLayer.apply(input).shape));\n * ```\n *\n * Input shape:\n * Arbitrary, although all dimensions in the input shape must be fixed.\n * Use the configuration `inputShape` when using this layer as the\n * first layer in a model.\n *\n *\n * Output shape:\n * [batchSize, targetShape[0], targetShape[1], ...,\n * targetShape[targetShape.length - 1]].\n *\n * @doc {heading: 'Layers', subheading: 'Basic', namespace: 'layers'}\n */\nexport function reshape(args) {\n return new Reshape(args);\n}\n/**\n * Permutes the dimensions of the input according to a given pattern.\n *\n * Useful for, e.g., connecting RNNs and convnets together.\n *\n * Example:\n *\n * ```js\n * const model = tf.sequential();\n * model.add(tf.layers.permute({\n * dims: [2, 1],\n * inputShape: [10, 64]\n * }));\n * console.log(model.outputShape);\n * // Now model's output shape is [null, 64, 10], where null is the\n * // unpermuted sample (batch) dimension.\n * ```\n *\n * Input shape:\n * Arbitrary. Use the configuration field `inputShape` when using this\n * layer as the first layer in a model.\n *\n * Output shape:\n * Same rank as the input shape, but with the dimensions re-ordered (i.e.,\n * permuted) according to the `dims` configuration of this layer.\n *\n * @doc {heading: 'Layers', subheading: 'Basic', namespace: 'layers'}\n */\nexport function permute(args) {\n return new Permute(args);\n}\n/**\n * Maps positive integers (indices) into dense vectors of fixed size.\n * E.g. [[4], [20]] -> [[0.25, 0.1], [0.6, -0.2]]\n *\n * **Input shape:** 2D tensor with shape: `[batchSize, sequenceLength]`.\n *\n * **Output shape:** 3D tensor with shape: `[batchSize, sequenceLength,\n * outputDim]`.\n *\n * @doc {heading: 'Layers', subheading: 'Basic', namespace: 'layers'}\n */\nexport function embedding(args) {\n return new Embedding(args);\n}\n// Merge Layers.\n/**\n * Layer that performs element-wise addition on an `Array` of inputs.\n *\n * It takes as input a list of tensors, all of the same shape, and returns a\n * single tensor (also of the same shape). The inputs are specified as an\n * `Array` when the `apply` method of the `Add` layer instance is called. For\n * example:\n *\n * ```js\n * const input1 = tf.input({shape: [2, 2]});\n * const input2 = tf.input({shape: [2, 2]});\n * const addLayer = tf.layers.add();\n * const sum = addLayer.apply([input1, input2]);\n * console.log(JSON.stringify(sum.shape));\n * // You get [null, 2, 2], with the first dimension as the undetermined batch\n * // dimension.\n * ```\n *\n * @doc {heading: 'Layers', subheading: 'Merge', namespace: 'layers'}\n */\nexport function add(args) {\n return new Add(args);\n}\n/**\n * Layer that performs element-wise averaging on an `Array` of inputs.\n *\n * It takes as input a list of tensors, all of the same shape, and returns a\n * single tensor (also of the same shape). For example:\n *\n * ```js\n * const input1 = tf.input({shape: [2, 2]});\n * const input2 = tf.input({shape: [2, 2]});\n * const averageLayer = tf.layers.average();\n * const average = averageLayer.apply([input1, input2]);\n * console.log(JSON.stringify(average.shape));\n * // You get [null, 2, 2], with the first dimension as the undetermined batch\n * // dimension.\n * ```\n *\n * @doc {heading: 'Layers', subheading: 'Merge', namespace: 'layers'}\n */\nexport function average(args) {\n return new Average(args);\n}\n/**\n * Layer that concatenates an `Array` of inputs.\n *\n * It takes a list of tensors, all of the same shape except for the\n * concatenation axis, and returns a single tensor, the concatenation\n * of all inputs. For example:\n *\n * ```js\n * const input1 = tf.input({shape: [2, 2]});\n * const input2 = tf.input({shape: [2, 3]});\n * const concatLayer = tf.layers.concatenate();\n * const output = concatLayer.apply([input1, input2]);\n * console.log(JSON.stringify(output.shape));\n * // You get [null, 2, 5], with the first dimension as the undetermined batch\n * // dimension. The last dimension (5) is the result of concatenating the\n * // last dimensions of the inputs (2 and 3).\n * ```\n *\n * @doc {heading: 'Layers', subheading: 'Merge', namespace: 'layers'}\n */\nexport function concatenate(args) {\n return new Concatenate(args);\n}\n/**\n * Layer that computes the element-wise maximum of an `Array` of inputs.\n *\n * It takes as input a list of tensors, all of the same shape, and returns a\n * single tensor (also of the same shape). For example:\n *\n * ```js\n * const input1 = tf.input({shape: [2, 2]});\n * const input2 = tf.input({shape: [2, 2]});\n * const maxLayer = tf.layers.maximum();\n * const max = maxLayer.apply([input1, input2]);\n * console.log(JSON.stringify(max.shape));\n * // You get [null, 2, 2], with the first dimension as the undetermined batch\n * // dimension.\n * ```\n *\n * @doc {heading: 'Layers', subheading: 'Merge', namespace: 'layers'}\n */\nexport function maximum(args) {\n return new Maximum(args);\n}\n/**\n * Layer that computes the element-wise minimum of an `Array` of inputs.\n *\n * It takes as input a list of tensors, all of the same shape, and returns a\n * single tensor (also of the same shape). For example:\n *\n * ```js\n * const input1 = tf.input({shape: [2, 2]});\n * const input2 = tf.input({shape: [2, 2]});\n * const minLayer = tf.layers.minimum();\n * const min = minLayer.apply([input1, input2]);\n * console.log(JSON.stringify(min.shape));\n * // You get [null, 2, 2], with the first dimension as the undetermined batch\n * // dimension.\n * ```\n *\n * @doc {heading: 'Layers', subheading: 'Merge', namespace: 'layers'}\n */\nexport function minimum(args) {\n return new Minimum(args);\n}\n/**\n * Layer that multiplies (element-wise) an `Array` of inputs.\n *\n * It takes as input an Array of tensors, all of the same\n * shape, and returns a single tensor (also of the same shape).\n * For example:\n *\n * ```js\n * const input1 = tf.input({shape: [2, 2]});\n * const input2 = tf.input({shape: [2, 2]});\n * const input3 = tf.input({shape: [2, 2]});\n * const multiplyLayer = tf.layers.multiply();\n * const product = multiplyLayer.apply([input1, input2, input3]);\n * console.log(product.shape);\n * // You get [null, 2, 2], with the first dimension as the undetermined batch\n * // dimension.\n *\n * @doc {heading: 'Layers', subheading: 'Merge', namespace: 'layers'}\n */\nexport function multiply(args) {\n return new Multiply(args);\n}\n/**\n * Layer that computes a dot product between samples in two tensors.\n *\n * E.g., if applied to a list of two tensors `a` and `b` both of shape\n * `[batchSize, n]`, the output will be a tensor of shape `[batchSize, 1]`,\n * where each entry at index `[i, 0]` will be the dot product between\n * `a[i, :]` and `b[i, :]`.\n *\n * Example:\n *\n * ```js\n * const dotLayer = tf.layers.dot({axes: -1});\n * const x1 = tf.tensor2d([[10, 20], [30, 40]]);\n * const x2 = tf.tensor2d([[-1, -2], [-3, -4]]);\n *\n * // Invoke the layer's apply() method in eager (imperative) mode.\n * const y = dotLayer.apply([x1, x2]);\n * y.print();\n * ```\n *\n * @doc {heading: 'Layers', subheading: 'Merge', namespace: 'layers'}\n */\nexport function dot(args) {\n return new Dot(args);\n}\n// Normalization Layers.\n/**\n * Batch normalization layer (Ioffe and Szegedy, 2014).\n *\n * Normalize the activations of the previous layer at each batch,\n * i.e. applies a transformation that maintains the mean activation\n * close to 0 and the activation standard deviation close to 1.\n *\n * Input shape:\n * Arbitrary. Use the keyword argument `inputShape` (Array of integers, does\n * not include the sample axis) when calling the constructor of this class,\n * if this layer is used as a first layer in a model.\n *\n * Output shape:\n * Same shape as input.\n *\n * References:\n * - [Batch Normalization: Accelerating Deep Network Training by Reducing\n * Internal Covariate Shift](https://arxiv.org/abs/1502.03167)\n *\n * @doc {heading: 'Layers', subheading: 'Normalization', namespace: 'layers'}\n */\nexport function batchNormalization(args) {\n return new BatchNormalization(args);\n}\n/**\n * Layer-normalization layer (Ba et al., 2016).\n *\n * Normalizes the activations of the previous layer for each given example in a\n * batch independently, instead of across a batch like in `batchNormalization`.\n * In other words, this layer applies a transformation that maintains the mean\n * activation within each example close to 0 and activation variance close to 1.\n *\n * Input shape:\n * Arbitrary. Use the argument `inputShape` when using this layer as the first\n * layer in a model.\n *\n * Output shape:\n * Same as input.\n *\n * References:\n * - [Layer Normalization](https://arxiv.org/abs/1607.06450)\n *\n * @doc {heading: 'Layers', subheading: 'Normalization', namespace: 'layers'}\n */\nexport function layerNormalization(args) {\n return new LayerNormalization(args);\n}\n// Padding Layers.\n/**\n * Zero-padding layer for 2D input (e.g., image).\n *\n * This layer can add rows and columns of zeros\n * at the top, bottom, left and right side of an image tensor.\n *\n * Input shape:\n * 4D tensor with shape:\n * - If `dataFormat` is `\"channelsLast\"`:\n * `[batch, rows, cols, channels]`\n * - If `data_format` is `\"channels_first\"`:\n * `[batch, channels, rows, cols]`.\n *\n * Output shape:\n * 4D with shape:\n * - If `dataFormat` is `\"channelsLast\"`:\n * `[batch, paddedRows, paddedCols, channels]`\n * - If `dataFormat` is `\"channelsFirst\"`:\n * `[batch, channels, paddedRows, paddedCols]`.\n *\n * @doc {heading: 'Layers', subheading: 'Padding', namespace: 'layers'}\n */\nexport function zeroPadding2d(args) {\n return new ZeroPadding2D(args);\n}\n// Pooling Layers.\n/**\n * Average pooling operation for spatial data.\n *\n * Input shape: `[batchSize, inLength, channels]`\n *\n * Output shape: `[batchSize, pooledLength, channels]`\n *\n * `tf.avgPool1d` is an alias.\n *\n * @doc {heading: 'Layers', subheading: 'Pooling', namespace: 'layers'}\n */\nexport function averagePooling1d(args) {\n return new AveragePooling1D(args);\n}\nexport function avgPool1d(args) {\n return averagePooling1d(args);\n}\n// For backwards compatibility.\n// See https://github.com/tensorflow/tfjs/issues/152\nexport function avgPooling1d(args) {\n return averagePooling1d(args);\n}\n/**\n * Average pooling operation for spatial data.\n *\n * Input shape:\n * - If `dataFormat === CHANNEL_LAST`:\n * 4D tensor with shape:\n * `[batchSize, rows, cols, channels]`\n * - If `dataFormat === CHANNEL_FIRST`:\n * 4D tensor with shape:\n * `[batchSize, channels, rows, cols]`\n *\n * Output shape\n * - If `dataFormat === CHANNEL_LAST`:\n * 4D tensor with shape:\n * `[batchSize, pooledRows, pooledCols, channels]`\n * - If `dataFormat === CHANNEL_FIRST`:\n * 4D tensor with shape:\n * `[batchSize, channels, pooledRows, pooledCols]`\n *\n * `tf.avgPool2d` is an alias.\n *\n * @doc {heading: 'Layers', subheading: 'Pooling', namespace: 'layers'}\n */\nexport function averagePooling2d(args) {\n return new AveragePooling2D(args);\n}\nexport function avgPool2d(args) {\n return averagePooling2d(args);\n}\n// For backwards compatibility.\n// See https://github.com/tensorflow/tfjs/issues/152\nexport function avgPooling2d(args) {\n return averagePooling2d(args);\n}\n/**\n * Average pooling operation for 3D data.\n *\n * Input shape\n * - If `dataFormat === channelsLast`:\n * 5D tensor with shape:\n * `[batchSize, depths, rows, cols, channels]`\n * - If `dataFormat === channelsFirst`:\n * 4D tensor with shape:\n * `[batchSize, channels, depths, rows, cols]`\n *\n * Output shape\n * - If `dataFormat=channelsLast`:\n * 5D tensor with shape:\n * `[batchSize, pooledDepths, pooledRows, pooledCols, channels]`\n * - If `dataFormat=channelsFirst`:\n * 5D tensor with shape:\n * `[batchSize, channels, pooledDepths, pooledRows, pooledCols]`\n *\n * @doc {heading: 'Layers', subheading: 'Pooling', namespace: 'layers'}\n */\nexport function averagePooling3d(args) {\n return new AveragePooling3D(args);\n}\nexport function avgPool3d(args) {\n return averagePooling3d(args);\n}\n// For backwards compatibility.\n// See https://github.com/tensorflow/tfjs/issues/152\nexport function avgPooling3d(args) {\n return averagePooling3d(args);\n}\n/**\n * Global average pooling operation for temporal data.\n *\n * Input Shape: 3D tensor with shape: `[batchSize, steps, features]`.\n *\n * Output Shape: 2D tensor with shape: `[batchSize, features]`.\n *\n * @doc {heading: 'Layers', subheading: 'Pooling', namespace: 'layers'}\n */\nexport function globalAveragePooling1d(args) {\n return new GlobalAveragePooling1D(args);\n}\n/**\n * Global average pooling operation for spatial data.\n *\n * Input shape:\n * - If `dataFormat` is `CHANNEL_LAST`:\n * 4D tensor with shape: `[batchSize, rows, cols, channels]`.\n * - If `dataFormat` is `CHANNEL_FIRST`:\n * 4D tensor with shape: `[batchSize, channels, rows, cols]`.\n *\n * Output shape:\n * 2D tensor with shape: `[batchSize, channels]`.\n *\n * @doc {heading: 'Layers', subheading: 'Pooling', namespace: 'layers'}\n */\nexport function globalAveragePooling2d(args) {\n return new GlobalAveragePooling2D(args);\n}\n/**\n * Global max pooling operation for temporal data.\n *\n * Input Shape: 3D tensor with shape: `[batchSize, steps, features]`.\n *\n * Output Shape: 2D tensor with shape: `[batchSize, features]`.\n *\n * @doc {heading: 'Layers', subheading: 'Pooling', namespace: 'layers'}\n */\nexport function globalMaxPooling1d(args) {\n return new GlobalMaxPooling1D(args);\n}\n/**\n * Global max pooling operation for spatial data.\n *\n * Input shape:\n * - If `dataFormat` is `CHANNEL_LAST`:\n * 4D tensor with shape: `[batchSize, rows, cols, channels]`.\n * - If `dataFormat` is `CHANNEL_FIRST`:\n * 4D tensor with shape: `[batchSize, channels, rows, cols]`.\n *\n * Output shape:\n * 2D tensor with shape: `[batchSize, channels]`.\n *\n * @doc {heading: 'Layers', subheading: 'Pooling', namespace: 'layers'}\n */\nexport function globalMaxPooling2d(args) {\n return new GlobalMaxPooling2D(args);\n}\n/**\n * Max pooling operation for temporal data.\n *\n * Input shape: `[batchSize, inLength, channels]`\n *\n * Output shape: `[batchSize, pooledLength, channels]`\n *\n * @doc {heading: 'Layers', subheading: 'Pooling', namespace: 'layers'}\n */\nexport function maxPooling1d(args) {\n return new MaxPooling1D(args);\n}\n/**\n * Max pooling operation for spatial data.\n *\n * Input shape\n * - If `dataFormat === CHANNEL_LAST`:\n * 4D tensor with shape:\n * `[batchSize, rows, cols, channels]`\n * - If `dataFormat === CHANNEL_FIRST`:\n * 4D tensor with shape:\n * `[batchSize, channels, rows, cols]`\n *\n * Output shape\n * - If `dataFormat=CHANNEL_LAST`:\n * 4D tensor with shape:\n * `[batchSize, pooledRows, pooledCols, channels]`\n * - If `dataFormat=CHANNEL_FIRST`:\n * 4D tensor with shape:\n * `[batchSize, channels, pooledRows, pooledCols]`\n *\n * @doc {heading: 'Layers', subheading: 'Pooling', namespace: 'layers'}\n */\nexport function maxPooling2d(args) {\n return new MaxPooling2D(args);\n}\n/**\n * Max pooling operation for 3D data.\n *\n * Input shape\n * - If `dataFormat === channelsLast`:\n * 5D tensor with shape:\n * `[batchSize, depths, rows, cols, channels]`\n * - If `dataFormat === channelsFirst`:\n * 5D tensor with shape:\n * `[batchSize, channels, depths, rows, cols]`\n *\n * Output shape\n * - If `dataFormat=channelsLast`:\n * 5D tensor with shape:\n * `[batchSize, pooledDepths, pooledRows, pooledCols, channels]`\n * - If `dataFormat=channelsFirst`:\n * 5D tensor with shape:\n * `[batchSize, channels, pooledDepths, pooledRows, pooledCols]`\n *\n * @doc {heading: 'Layers', subheading: 'Pooling', namespace: 'layers'}\n */\nexport function maxPooling3d(args) {\n return new MaxPooling3D(args);\n}\n// Recurrent Layers.\n/**\n * Gated Recurrent Unit - Cho et al. 2014.\n *\n * This is an `RNN` layer consisting of one `GRUCell`. However, unlike\n * the underlying `GRUCell`, the `apply` method of `SimpleRNN` operates\n * on a sequence of inputs. The shape of the input (not including the first,\n * batch dimension) needs to be at least 2-D, with the first dimension being\n * time steps. For example:\n *\n * ```js\n * const rnn = tf.layers.gru({units: 8, returnSequences: true});\n *\n * // Create an input with 10 time steps.\n * const input = tf.input({shape: [10, 20]});\n * const output = rnn.apply(input);\n *\n * console.log(JSON.stringify(output.shape));\n * // [null, 10, 8]: 1st dimension is unknown batch size; 2nd dimension is the\n * // same as the sequence length of `input`, due to `returnSequences`: `true`;\n * // 3rd dimension is the `GRUCell`'s number of units.\n *\n * @doc {heading: 'Layers', subheading: 'Recurrent', namespace: 'layers'}\n */\nexport function gru(args) {\n return new GRU(args);\n}\n/**\n * Cell class for `GRU`.\n *\n * `GRUCell` is distinct from the `RNN` subclass `GRU` in that its\n * `apply` method takes the input data of only a single time step and returns\n * the cell's output at the time step, while `GRU` takes the input data\n * over a number of time steps. For example:\n *\n * ```js\n * const cell = tf.layers.gruCell({units: 2});\n * const input = tf.input({shape: [10]});\n * const output = cell.apply(input);\n *\n * console.log(JSON.stringify(output.shape));\n * // [null, 10]: This is the cell's output at a single time step. The 1st\n * // dimension is the unknown batch size.\n * ```\n *\n * Instance(s) of `GRUCell` can be used to construct `RNN` layers. The\n * most typical use of this workflow is to combine a number of cells into a\n * stacked RNN cell (i.e., `StackedRNNCell` internally) and use it to create an\n * RNN. For example:\n *\n * ```js\n * const cells = [\n * tf.layers.gruCell({units: 4}),\n * tf.layers.gruCell({units: 8}),\n * ];\n * const rnn = tf.layers.rnn({cell: cells, returnSequences: true});\n *\n * // Create an input with 10 time steps and a length-20 vector at each step.\n * const input = tf.input({shape: [10, 20]});\n * const output = rnn.apply(input);\n *\n * console.log(JSON.stringify(output.shape));\n * // [null, 10, 8]: 1st dimension is unknown batch size; 2nd dimension is the\n * // same as the sequence length of `input`, due to `returnSequences`: `true`;\n * // 3rd dimension is the last `gruCell`'s number of units.\n * ```\n *\n * To create an `RNN` consisting of only *one* `GRUCell`, use the\n * `tf.layers.gru`.\n *\n * @doc {heading: 'Layers', subheading: 'Recurrent', namespace: 'layers'}\n */\nexport function gruCell(args) {\n return new GRUCell(args);\n}\n/**\n * Long-Short Term Memory layer - Hochreiter 1997.\n *\n * This is an `RNN` layer consisting of one `LSTMCell`. However, unlike\n * the underlying `LSTMCell`, the `apply` method of `LSTM` operates\n * on a sequence of inputs. The shape of the input (not including the first,\n * batch dimension) needs to be at least 2-D, with the first dimension being\n * time steps. For example:\n *\n * ```js\n * const lstm = tf.layers.lstm({units: 8, returnSequences: true});\n *\n * // Create an input with 10 time steps.\n * const input = tf.input({shape: [10, 20]});\n * const output = lstm.apply(input);\n *\n * console.log(JSON.stringify(output.shape));\n * // [null, 10, 8]: 1st dimension is unknown batch size; 2nd dimension is the\n * // same as the sequence length of `input`, due to `returnSequences`: `true`;\n * // 3rd dimension is the `LSTMCell`'s number of units.\n *\n * @doc {heading: 'Layers', subheading: 'Recurrent', namespace: 'layers'}\n */\nexport function lstm(args) {\n return new LSTM(args);\n}\n/**\n * Cell class for `LSTM`.\n *\n * `LSTMCell` is distinct from the `RNN` subclass `LSTM` in that its\n * `apply` method takes the input data of only a single time step and returns\n * the cell's output at the time step, while `LSTM` takes the input data\n * over a number of time steps. For example:\n *\n * ```js\n * const cell = tf.layers.lstmCell({units: 2});\n * const input = tf.input({shape: [10]});\n * const output = cell.apply(input);\n *\n * console.log(JSON.stringify(output.shape));\n * // [null, 10]: This is the cell's output at a single time step. The 1st\n * // dimension is the unknown batch size.\n * ```\n *\n * Instance(s) of `LSTMCell` can be used to construct `RNN` layers. The\n * most typical use of this workflow is to combine a number of cells into a\n * stacked RNN cell (i.e., `StackedRNNCell` internally) and use it to create an\n * RNN. For example:\n *\n * ```js\n * const cells = [\n * tf.layers.lstmCell({units: 4}),\n * tf.layers.lstmCell({units: 8}),\n * ];\n * const rnn = tf.layers.rnn({cell: cells, returnSequences: true});\n *\n * // Create an input with 10 time steps and a length-20 vector at each step.\n * const input = tf.input({shape: [10, 20]});\n * const output = rnn.apply(input);\n *\n * console.log(JSON.stringify(output.shape));\n * // [null, 10, 8]: 1st dimension is unknown batch size; 2nd dimension is the\n * // same as the sequence length of `input`, due to `returnSequences`: `true`;\n * // 3rd dimension is the last `lstmCell`'s number of units.\n * ```\n *\n * To create an `RNN` consisting of only *one* `LSTMCell`, use the\n * `tf.layers.lstm`.\n *\n * @doc {heading: 'Layers', subheading: 'Recurrent', namespace: 'layers'}\n */\nexport function lstmCell(args) {\n return new LSTMCell(args);\n}\n/**\n * Fully-connected RNN where the output is to be fed back to input.\n *\n * This is an `RNN` layer consisting of one `SimpleRNNCell`. However, unlike\n * the underlying `SimpleRNNCell`, the `apply` method of `SimpleRNN` operates\n * on a sequence of inputs. The shape of the input (not including the first,\n * batch dimension) needs to be at least 2-D, with the first dimension being\n * time steps. For example:\n *\n * ```js\n * const rnn = tf.layers.simpleRNN({units: 8, returnSequences: true});\n *\n * // Create an input with 10 time steps.\n * const input = tf.input({shape: [10, 20]});\n * const output = rnn.apply(input);\n *\n * console.log(JSON.stringify(output.shape));\n * // [null, 10, 8]: 1st dimension is unknown batch size; 2nd dimension is the\n * // same as the sequence length of `input`, due to `returnSequences`: `true`;\n * // 3rd dimension is the `SimpleRNNCell`'s number of units.\n * ```\n *\n * @doc {heading: 'Layers', subheading: 'Recurrent', namespace: 'layers'}\n */\nexport function simpleRNN(args) {\n return new SimpleRNN(args);\n}\n/**\n * Cell class for `SimpleRNN`.\n *\n * `SimpleRNNCell` is distinct from the `RNN` subclass `SimpleRNN` in that its\n * `apply` method takes the input data of only a single time step and returns\n * the cell's output at the time step, while `SimpleRNN` takes the input data\n * over a number of time steps. For example:\n *\n * ```js\n * const cell = tf.layers.simpleRNNCell({units: 2});\n * const input = tf.input({shape: [10]});\n * const output = cell.apply(input);\n *\n * console.log(JSON.stringify(output.shape));\n * // [null, 10]: This is the cell's output at a single time step. The 1st\n * // dimension is the unknown batch size.\n * ```\n *\n * Instance(s) of `SimpleRNNCell` can be used to construct `RNN` layers. The\n * most typical use of this workflow is to combine a number of cells into a\n * stacked RNN cell (i.e., `StackedRNNCell` internally) and use it to create an\n * RNN. For example:\n *\n * ```js\n * const cells = [\n * tf.layers.simpleRNNCell({units: 4}),\n * tf.layers.simpleRNNCell({units: 8}),\n * ];\n * const rnn = tf.layers.rnn({cell: cells, returnSequences: true});\n *\n * // Create an input with 10 time steps and a length-20 vector at each step.\n * const input = tf.input({shape: [10, 20]});\n * const output = rnn.apply(input);\n *\n * console.log(JSON.stringify(output.shape));\n * // [null, 10, 8]: 1st dimension is unknown batch size; 2nd dimension is the\n * // same as the sequence length of `input`, due to `returnSequences`: `true`;\n * // 3rd dimension is the last `SimpleRNNCell`'s number of units.\n * ```\n *\n * To create an `RNN` consisting of only *one* `SimpleRNNCell`, use the\n * `tf.layers.simpleRNN`.\n *\n * @doc {heading: 'Layers', subheading: 'Recurrent', namespace: 'layers'}\n */\nexport function simpleRNNCell(args) {\n return new SimpleRNNCell(args);\n}\n/**\n * Convolutional LSTM layer - Xingjian Shi 2015.\n *\n * This is a `ConvRNN2D` layer consisting of one `ConvLSTM2DCell`. However,\n * unlike the underlying `ConvLSTM2DCell`, the `apply` method of `ConvLSTM2D`\n * operates on a sequence of inputs. The shape of the input (not including the\n * first, batch dimension) needs to be 4-D, with the first dimension being time\n * steps. For example:\n *\n * ```js\n * const filters = 3;\n * const kernelSize = 3;\n *\n * const batchSize = 4;\n * const sequenceLength = 2;\n * const size = 5;\n * const channels = 3;\n *\n * const inputShape = [batchSize, sequenceLength, size, size, channels];\n * const input = tf.ones(inputShape);\n *\n * const layer = tf.layers.convLstm2d({filters, kernelSize});\n *\n * const output = layer.apply(input);\n * ```\n */\n/** @doc {heading: 'Layers', subheading: 'Recurrent', namespace: 'layers'} */\nexport function convLstm2d(args) {\n return new ConvLSTM2D(args);\n}\n/**\n * Cell class for `ConvLSTM2D`.\n *\n * `ConvLSTM2DCell` is distinct from the `ConvRNN2D` subclass `ConvLSTM2D` in\n * that its `call` method takes the input data of only a single time step and\n * returns the cell's output at the time step, while `ConvLSTM2D` takes the\n * input data over a number of time steps. For example:\n *\n * ```js\n * const filters = 3;\n * const kernelSize = 3;\n *\n * const sequenceLength = 1;\n * const size = 5;\n * const channels = 3;\n *\n * const inputShape = [sequenceLength, size, size, channels];\n * const input = tf.ones(inputShape);\n *\n * const cell = tf.layers.convLstm2dCell({filters, kernelSize});\n *\n * cell.build(input.shape);\n *\n * const outputSize = size - kernelSize + 1;\n * const outShape = [sequenceLength, outputSize, outputSize, filters];\n *\n * const initialH = tf.zeros(outShape);\n * const initialC = tf.zeros(outShape);\n *\n * const [o, h, c] = cell.call([input, initialH, initialC], {});\n * ```\n */\n/** @doc {heading: 'Layers', subheading: 'Recurrent', namespace: 'layers'} */\nexport function convLstm2dCell(args) {\n return new ConvLSTM2DCell(args);\n}\n/**\n * Base class for recurrent layers.\n *\n * Input shape:\n * 3D tensor with shape `[batchSize, timeSteps, inputDim]`.\n *\n * Output shape:\n * - if `returnState`, an Array of tensors (i.e., `tf.Tensor`s). The first\n * tensor is the output. The remaining tensors are the states at the\n * last time step, each with shape `[batchSize, units]`.\n * - if `returnSequences`, the output will have shape\n * `[batchSize, timeSteps, units]`.\n * - else, the output will have shape `[batchSize, units]`.\n *\n * Masking:\n * This layer supports masking for input data with a variable number\n * of timesteps. To introduce masks to your data,\n * use an embedding layer with the `mask_zero` parameter\n * set to `True`.\n *\n * Notes on using statefulness in RNNs:\n * You can set RNN layers to be 'stateful', which means that the states\n * computed for the samples in one batch will be reused as initial states\n * for the samples in the next batch. This assumes a one-to-one mapping\n * between samples in different successive batches.\n *\n * To enable statefulness:\n * - specify `stateful: true` in the layer constructor.\n * - specify a fixed batch size for your model, by passing\n * if sequential model:\n * `batchInputShape=[...]` to the first layer in your model.\n * else for functional model with 1 or more Input layers:\n * `batchShape=[...]` to all the first layers in your model.\n * This is the expected shape of your inputs *including the batch size*.\n * It should be a tuple of integers, e.g. `(32, 10, 100)`.\n * - specify `shuffle=False` when calling fit().\n *\n * To reset the states of your model, call `.resetStates()` on either\n * a specific layer, or on your entire model.\n *\n * Note on specifying the initial state of RNNs\n * You can specify the initial state of RNN layers symbolically by\n * calling them with the option `initialState`. The value of\n * `initialState` should be a tensor or list of tensors representing\n * the initial state of the RNN layer.\n *\n * You can specify the initial state of RNN layers numerically by\n * calling `resetStates` with the keyword argument `states`. The value of\n * `states` should be a numpy array or list of numpy arrays representing\n * the initial state of the RNN layer.\n *\n * Note on passing external constants to RNNs\n * You can pass \"external\" constants to the cell using the `constants`\n * keyword argument of `RNN.call` method. This requires that the `cell.call`\n * method accepts the same keyword argument `constants`. Such constants\n * can be used to condition the cell transformation on additional static\n * inputs (not changing over time), a.k.a. an attention mechanism.\n *\n * @doc {heading: 'Layers', subheading: 'Recurrent', namespace: 'layers'}\n */\nexport function rnn(args) {\n return new RNN(args);\n}\n/**\n * Wrapper allowing a stack of RNN cells to behave as a single cell.\n *\n * Used to implement efficient stacked RNNs.\n *\n * @doc {heading: 'Layers', subheading: 'Recurrent', namespace: 'layers'}\n */\nexport function stackedRNNCells(args) {\n return new StackedRNNCells(args);\n}\n// Wrapper Layers.\n/** @doc {heading: 'Layers', subheading: 'Wrapper', namespace: 'layers'} */\nexport function bidirectional(args) {\n return new Bidirectional(args);\n}\n/**\n * This wrapper applies a layer to every temporal slice of an input.\n *\n * The input should be at least 3D, and the dimension of the index `1` will be\n * considered to be the temporal dimension.\n *\n * Consider a batch of 32 samples, where each sample is a sequence of 10 vectors\n * of 16 dimensions. The batch input shape of the layer is then `[32, 10,\n * 16]`, and the `inputShape`, not including the sample dimension, is\n * `[10, 16]`.\n *\n * You can then use `TimeDistributed` to apply a `Dense` layer to each of the 10\n * timesteps, independently:\n *\n * ```js\n * const model = tf.sequential();\n * model.add(tf.layers.timeDistributed({\n * layer: tf.layers.dense({units: 8}),\n * inputShape: [10, 16],\n * }));\n *\n * // Now model.outputShape = [null, 10, 8].\n * // The output will then have shape `[32, 10, 8]`.\n *\n * // In subsequent layers, there is no need for `inputShape`:\n * model.add(tf.layers.timeDistributed({layer: tf.layers.dense({units: 32})}));\n * console.log(JSON.stringify(model.outputs[0].shape));\n * // Now model.outputShape = [null, 10, 32].\n * ```\n *\n * The output will then have shape `[32, 10, 32]`.\n *\n * `TimeDistributed` can be used with arbitrary layers, not just `Dense`, for\n * instance a `Conv2D` layer.\n *\n * ```js\n * const model = tf.sequential();\n * model.add(tf.layers.timeDistributed({\n * layer: tf.layers.conv2d({filters: 64, kernelSize: [3, 3]}),\n * inputShape: [10, 299, 299, 3],\n * }));\n * console.log(JSON.stringify(model.outputs[0].shape));\n * ```\n *\n * @doc {heading: 'Layers', subheading: 'Wrapper', namespace: 'layers'}\n */\nexport function timeDistributed(args) {\n return new TimeDistributed(args);\n}\n// Aliases for pooling.\nexport const globalMaxPool1d = globalMaxPooling1d;\nexport const globalMaxPool2d = globalMaxPooling2d;\nexport const maxPool1d = maxPooling1d;\nexport const maxPool2d = maxPooling2d;\nexport { Layer, RNN, RNNCell, input /* alias for tf.input */ };\n/**\n * Apply additive zero-centered Gaussian noise.\n *\n * As it is a regularization layer, it is only active at training time.\n *\n * This is useful to mitigate overfitting\n * (you could see it as a form of random data augmentation).\n * Gaussian Noise (GS) is a natural choice as corruption process\n * for real valued inputs.\n *\n * # Arguments\n * stddev: float, standard deviation of the noise distribution.\n *\n * # Input shape\n * Arbitrary. Use the keyword argument `input_shape`\n * (tuple of integers, does not include the samples axis)\n * when using this layer as the first layer in a model.\n *\n * # Output shape\n * Same shape as input.\n *\n * @doc {heading: 'Layers', subheading: 'Noise', namespace: 'layers'}\n */\nexport function gaussianNoise(args) {\n return new GaussianNoise(args);\n}\n/**\n * Apply multiplicative 1-centered Gaussian noise.\n *\n * As it is a regularization layer, it is only active at training time.\n *\n * Arguments:\n * - `rate`: float, drop probability (as with `Dropout`).\n * The multiplicative noise will have\n * standard deviation `sqrt(rate / (1 - rate))`.\n *\n * Input shape:\n * Arbitrary. Use the keyword argument `inputShape`\n * (tuple of integers, does not include the samples axis)\n * when using this layer as the first layer in a model.\n *\n * Output shape:\n * Same shape as input.\n *\n * References:\n * - [Dropout: A Simple Way to Prevent Neural Networks from Overfitting](\n * http://www.cs.toronto.edu/~rsalakhu/papers/srivastava14a.pdf)\n *\n * @doc {heading: 'Layers', subheading: 'Noise', namespace: 'layers'}\n */\nexport function gaussianDropout(args) {\n return new GaussianDropout(args);\n}\n/**\n * Applies Alpha Dropout to the input.\n *\n * As it is a regularization layer, it is only active at training time.\n *\n * Alpha Dropout is a `Dropout` that keeps mean and variance of inputs\n * to their original values, in order to ensure the self-normalizing property\n * even after this dropout.\n * Alpha Dropout fits well to Scaled Exponential Linear Units\n * by randomly setting activations to the negative saturation value.\n *\n * Arguments:\n * - `rate`: float, drop probability (as with `Dropout`).\n * The multiplicative noise will have\n * standard deviation `sqrt(rate / (1 - rate))`.\n * - `noise_shape`: A 1-D `Tensor` of type `int32`, representing the\n * shape for randomly generated keep/drop flags.\n *\n * Input shape:\n * Arbitrary. Use the keyword argument `inputShape`\n * (tuple of integers, does not include the samples axis)\n * when using this layer as the first layer in a model.\n *\n * Output shape:\n * Same shape as input.\n *\n * References:\n * - [Self-Normalizing Neural Networks](https://arxiv.org/abs/1706.02515)\n *\n * @doc {heading: 'Layers', subheading: 'Noise', namespace: 'layers'}\n */\nexport function alphaDropout(args) {\n return new AlphaDropout(args);\n}\n/**\n * Masks a sequence by using a mask value to skip timesteps.\n *\n * If all features for a given sample timestep are equal to `mask_value`,\n * then the sample timestep will be masked (skipped) in all downstream layers\n * (as long as they support masking).\n *\n * If any downstream layer does not support masking yet receives such\n * an input mask, an exception will be raised.\n *\n * Arguments:\n * - `maskValue`: Either None or mask value to skip.\n *\n * Input shape:\n * Arbitrary. Use the keyword argument `inputShape`\n * (tuple of integers, does not include the samples axis)\n * when using this layer as the first layer in a model.\n *\n * Output shape:\n * Same shape as input.\n *\n * @doc {heading: 'Layers', subheading: 'Mask', namespace: 'layers'}\n */\nexport function masking(args) {\n return new Masking(args);\n}\n/**\n * A preprocessing layer which rescales input values to a new range.\n *\n * This layer rescales every value of an input (often an image) by multiplying\n * by `scale` and adding `offset`.\n *\n * For instance:\n * 1. To rescale an input in the ``[0, 255]`` range\n * to be in the `[0, 1]` range, you would pass `scale=1/255`.\n * 2. To rescale an input in the ``[0, 255]`` range to be in the `[-1, 1]`\n * range, you would pass `scale=1./127.5, offset=-1`.\n * The rescaling is applied both during training and inference. Inputs can be\n * of integer or floating point dtype, and by default the layer will output\n * floats.\n *\n * Arguments:\n * - `scale`: Float, the scale to apply to the inputs.\n * - `offset`: Float, the offset to apply to the inputs.\n *\n * Input shape:\n * Arbitrary.\n *\n * Output shape:\n * Same as input.\n *\n * @doc {heading: 'Layers', subheading: 'Rescaling', namespace: 'layers'}\n */\nexport function rescaling(args) {\n return new Rescaling(args);\n}\n//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZXhwb3J0c19sYXllcnMuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi90ZmpzLWxheWVycy9zcmMvZXhwb3J0c19sYXllcnMudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUE7Ozs7Ozs7O0dBUUc7QUFFSCxPQUFPLEVBQUMsVUFBVSxFQUFpQixNQUFNLHNCQUFzQixDQUFDO0FBQ2hFLE9BQU8sRUFBQyxLQUFLLEVBQVksTUFBTSxtQkFBbUIsQ0FBQztBQUNuRCxPQUFPLEVBQUMsS0FBSyxFQUFDLE1BQU0sV0FBVyxDQUFDO0FBQ2hDLE9BQU8sRUFBQyxHQUFHLEVBQWdCLFNBQVMsRUFBc0IsS0FBSyxFQUFrQixJQUFJLEVBQWlCLE9BQU8sRUFBb0IsZUFBZSxFQUEyQixNQUFNLCtCQUErQixDQUFDO0FBQ2pOLE9BQU8sRUFBQyxNQUFNLEVBQUUsTUFBTSxFQUFFLGVBQWUsRUFBRSxNQUFNLEVBQWlCLFVBQVUsRUFBdUIsZUFBZSxFQUEwQixZQUFZLEVBQXlCLGVBQWUsRUFBQyxNQUFNLHdCQUF3QixDQUFDO0FBQzlOLE9BQU8sRUFBQyxlQUFlLEVBQTJCLE1BQU0sa0NBQWtDLENBQUM7QUFDM0YsT0FBTyxFQUFDLFVBQVUsRUFBa0IsY0FBYyxFQUFxQixNQUFNLGtDQUFrQyxDQUFDO0FBQ2hILE9BQU8sRUFBQyxVQUFVLEVBQXVCLEtBQUssRUFBa0IsT0FBTyxFQUFvQixPQUFPLEVBQW9CLE9BQU8sRUFBZSxPQUFPLEVBQW9CLFlBQVksRUFBeUIsT0FBTyxFQUFvQixnQkFBZ0IsRUFBOEIsTUFBTSxlQUFlLENBQUM7QUFDM1MsT0FBTyxFQUFDLFNBQVMsRUFBcUIsTUFBTSxxQkFBcUIsQ0FBQztBQUNsRSxPQUFPLEVBQUMsR0FBRyxFQUFFLE9BQU8sRUFBRSxXQUFXLEVBQXdCLEdBQUcsRUFBZ0IsT0FBTyxFQUFFLE9BQU8sRUFBRSxRQUFRLEVBQUMsTUFBTSxnQkFBZ0IsQ0FBQztBQUM5SCxPQUFPLEVBQUMsWUFB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Ozs7OztHQXNCRztBQUNILE1BQU0sVUFBVSxhQUFhLENBQUMsSUFBdUI7SUFDbkQsT0FBTyxJQUFJLGFBQWEsQ0FBQyxJQUFJLENBQUMsQ0FBQztBQUNqQyxDQUFDO0FBRUQ7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7O0dBdUJHO0FBQ0gsTUFBTSxVQUFVLGVBQWUsQ0FBQyxJQUF5QjtJQUN2RCxPQUFPLElBQUksZUFBZSxDQUFDLElBQUksQ0FBQyxDQUFDO0FBQ25DLENBQUM7QUFFRDs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7O0dBOEJHO0FBQ0gsTUFBTSxVQUFVLFlBQVksQ0FBQyxJQUFzQjtJQUNqRCxPQUFPLElBQUksWUFBWSxDQUFDLElBQUksQ0FBQyxDQUFDO0FBQ2hDLENBQUM7QUFFRDs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7OztHQXNCRztBQUNILE1BQU0sVUFBVSxPQUFPLENBQUMsSUFBa0I7SUFDeEMsT0FBTyxJQUFJLE9BQU8sQ0FBQyxJQUFJLENBQUMsQ0FBQztBQUMzQixDQUFDO0FBRUQ7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7O0dBMEJHO0FBQ0gsTUFBTSxVQUFVLFNBQVMsQ0FBQyxJQUFvQjtJQUM1QyxPQUFPLElBQUksU0FBUyxDQUFDLElBQUksQ0FBQyxDQUFDO0FBQzdCLENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyIvKipcbiAqIEBsaWNlbnNlXG4gKiBDb3B5cmlnaHQgMjAxOCBHb29nbGUgTExDXG4gKlxuICogVXNlIG9mIHRoaXMgc291cmNlIGNvZGUgaXMgZ292ZXJuZWQgYnkgYW4gTUlULXN0eWxlXG4gKiBsaWNlbnNlIHRoYXQgY2FuIGJlIGZvdW5kIGluIHRoZSBMSUNFTlNFIGZpbGUgb3IgYXRcbiAqIGh0dHBzOi8vb3BlbnNvdXJjZS5vcmcvbGljZW5zZXMvTUlULlxuICogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbiAqL1xuXG5pbXBvcnQge0lucHV0TGF5ZXIsIElucHV0TGF5ZXJBcmdzfSBmcm9tICcuL2VuZ2luZS9pbnB1dF9sYXllcic7XG5pbXBvcnQge0xheWVyLCBMYXllckFyZ3N9IGZyb20gJy4vZW5naW5lL3RvcG9sb2d5JztcbmltcG9ydCB7aW5wdXR9IGZyb20gJy4vZXhwb3J0cyc7XG5pbXBvcnQge0VMVSwgRUxVTGF5ZXJBcmdzLCBMZWFreVJlTFUsIExlYWt5UmVMVUxheWVyQXJncywgUFJlTFUsIFBSZUxVTGF5ZXJBcmdzLCBSZUxVLCBSZUxVTGF5ZXJBcmdzLCBTb2Z0bWF4LCBTb2Z0bWF4TGF5ZXJBcmdzLCBUaHJlc2hvbGRlZFJlTFUsIFRocmVzaG9sZGVkUmVMVUxheWVyQXJnc30gZnJvbSAnLi9sYXllcnMvYWR2YW5jZWRfYWN0aXZhdGlvbnMnO1xuaW1wb3J0IHtDb252MUQsIENvbnYyRCwgQ29udjJEVHJhbnNwb3NlLCBDb252M0QsIENvbnZMYXllckFyZ3MsIENyb3BwaW5nMkQsIENyb3BwaW5nMkRMYXllckFyZ3MsIFNlcGFyYWJsZUNvbnYyRCwgU2VwYXJhYmxlQ29udkxheWVyQXJncywgVXBTYW1wbGluZzJELCBVcFNhbXBsaW5nMkRMYXllckFyZ3MsIENvbnYzRFRyYW5zcG9zZX0gZnJvbSAnLi9sYXllcnMvY29udm9sdXRpb25hbCc7XG5pbXBvcnQge0RlcHRod2lzZUNvbnYyRCwgRGVwdGh3aXNlQ29udjJETGF5ZXJBcmdzfSBmcm9tICcuL2xheWVycy9jb252b2x1dGlvbmFsX2RlcHRod2lzZSc7XG5pbXBvcnQge0NvbnZMU1RNMkQsIENvbnZMU1RNMkRBcmdzLCBDb252TFNUTTJEQ2VsbCwgQ29udkxTVE0yRENlbGxBcmdzfSBmcm9tICcuL2xheWVycy9jb252b2x1dGlvbmFsX3JlY3VycmVudCc7XG5pbXBvcnQge0FjdGl2YXRpb24sIEFjdGl2YXRpb25MYXllckFyZ3MsIERlbnNlLCBEZW5zZUxheWVyQXJncywgRHJvcG91dCwgRHJvcG91dExheWVyQXJncywgRmxhdHRlbiwgRmxhdHRlbkxheWVyQXJncywgTWFza2luZywgTWFza2luZ0FyZ3MsIFBlcm11dGUsIFBlcm11dGVMYXllckFyZ3MsIFJlcGVhdFZlY3RvciwgUmVwZWF0VmVjdG9yTGF5ZXJBcmdzLCBSZXNoYXBlLCBSZXNoYXBlTGF5ZXJBcmdzLCBTcGF0aWFsRHJvcG91dDFELCBTcGF0aWFsRHJvcG91dDFETGF5ZXJDb25maWd9IGZyb20gJy4vbGF5ZXJzL2NvcmUnO1xuaW1wb3J0IHtFbWJlZGRpbmcsIEVtYmVkZGluZ0xheWVyQXJnc30gZnJvbSAnLi9sYXllcnMvZW1iZWRkaW5ncyc7XG5pbXBvcnQge0FkZCwgQXZlcmFnZSwgQ29uY2F0ZW5hdGUsIENvbmNhdGVuYXRlTGF5ZXJBcmdzLCBEb3QsIERvdExheWVyQXJncywgTWF4aW11bSwgTWluaW11bSwgTXVsdGlwbHl9IGZyb20gJy4vbGF5ZXJzL21lcmdlJztcbmltcG9ydCB7QWxwaGFEcm9wb3V0LCBBbHBoYURyb3BvdXRBcmdzLCBHYXVzc2lhbkRyb3BvdXQsIEdhdXNzaWFuRHJvcG91dEFyZ3MsIEdhdXNzaWFuTm9pc2UsIEdhdXNzaWFuTm9pc2VBcmdzfSBmcm9tICcuL2xheWVycy9ub2lzZSc7XG5pbXBvcnQge0JhdGNoTm9ybWFsaXphdGlvbiwgQmF0Y2hOb3JtYWxpemF0aW9uTGF5ZXJBcmdzLCBMYXllck5vcm1hbGl6YXRpb24sIExheWVyTm9ybWFsaXphdGlvbkxheWVyQXJnc30gZnJvbSAnLi9sYXllcnMvbm9ybWFsaXphdGlvbic7XG5pbXBvcnQge1plcm9QYWRkaW5nMkQsIFplcm9QYWRkaW5nMkRMYXllckFyZ3N9IGZyb20gJy4vbGF5ZXJzL3BhZGRpbmcnO1xuaW1wb3J0IHtBdmVyYWdlUG9vbGluZzFELCBBdmVyYWdlUG9vbGluZzJELCBBdmVyYWdlUG9vbGluZzNELCBHbG9iYWxBdmVyYWdlUG9vbGluZzFELCBHbG9iYWxBdmVyYWdlUG9vbGluZzJELCBHbG9iYWxNYXhQb29saW5nMUQsIEdsb2JhbE1heFBvb2xpbmcyRCwgR2xvYmFsUG9vbGluZzJETGF5ZXJBcmdzLCBNYXhQb29saW5nMUQsIE1heFBvb2xpbmcyRCwgTWF4UG9vbGluZzNELCBQb29saW5nMURMYXllckFyZ3MsIFBvb2xpbmcyRExheWVyQXJncywgUG9vbGluZzNETGF5ZXJBcmdzfSBmcm9tICcuL2xheWVycy9wb29saW5nJztcbmltcG9ydCB7R1JVLCBHUlVDZWxsLCBHUlVDZWxsTGF5ZXJBcmdzLCBHUlVMYXllckFyZ3MsIExTVE0sIExTVE1DZWxsLCBMU1RNQ2VsbExheWVyQXJncywgTFNUTUxheWVyQXJncywgUk5OLCBSTk5DZWxsLCBSTk5MYXllckFyZ3MsIFNpbXBsZVJOTiwgU2ltcGxlUk5OQ2VsbCwgU2ltcGxlUk5OQ2VsbExheWVyQXJncywgU2ltcGxlUk5OTGF5ZXJBcmdzLCBTdGFja2VkUk5OQ2VsbHMsIFN0YWNrZWRSTk5DZWxsc0FyZ3N9IGZyb20gJy4vbGF5ZXJzL3JlY3VycmVudCc7XG5pbXBvcnQge0JpZGlyZWN0aW9uYWwsIEJpZGlyZWN0aW9uYWxMYXllckFyZ3MsIFRpbWVEaXN0cmlidXRlZCwgV3JhcHBlckxheWVyQXJnc30gZnJvbSAnLi9sYXllcnMvd3JhcHBlcnMnO1xuaW1wb3J0IHsgUmVzY2FsaW5nLCBSZXNjYWxpbmdBcmdzIH0gZnJvbSAnLi9sYXllcnMvcHJlcHJvY2Vzc2luZy9pbWFnZV9wcmVwcm9jZXNzaW5nJztcblxuLy8gVE9ETyhjYWlzKTogQWRkIGRvYyBzdHJpbmcgdG8gYWxsIHRoZSBwdWJsaWMgc3RhdGljIGZ1bmN0aW9ucyBpbiB0aGlzXG4vLyAgIGNsYXNzOyBpbmNsdWRlIGV4ZWN0dWFibGUgSmF2YVNjcmlwdCBjb2RlIHNuaXBwZXRzIHdoZXJlIGFwcGxpY2FibGVcbi8vICAgKGIvNzQwNzQ0NTgpLlxuXG4vLyBJbnB1dCBMYXllci5cbi8qKlxuICogQW4gaW5wdXQgbGF5ZXIgaXMgYW4gZW50cnkgcG9pbnQgaW50byBhIGB0Zi5MYXllcnNNb2RlbGAuXG4gKlxuICogYElucHV0TGF5ZXJgIGlzIGdlbmVyYXRlZCBhdXRvbWF0aWNhbGx5IGZvciBgdGYuU2VxdWVudGlhbGAgbW9kZWxzIGJ5XG4gKiBzcGVjaWZ5aW5nIHRoZSBgaW5wdXRzaGFwZWAgb3IgYGJhdGNoSW5wdXRTaGFwZWAgZm9yIHRoZSBmaXJzdCBsYXllci4gIEl0XG4gKiBzaG91bGQgbm90IGJlIHNwZWNpZmllZCBleHBsaWNpdGx5LiBIb3dldmVyLCBpdCBjYW4gYmUgdXNlZnVsIHNvbWV0aW1lcyxcbiAqIGUuZy4sIHdoZW4gY29uc3RydWN0aW5nIGEgc2VxdWVudGlhbCBtb2RlbCBmcm9tIGEgc3Vic2V0IG9mIGFub3RoZXJcbiAqIHNlcXVlbnRpYWwgbW9kZWwncyBsYXllcnMuIExpa2UgdGhlIGNvZGUgc25pcHBldCBiZWxvdyBzaG93cy5cbiAqXG4gKiBgYGBqc1xuICogLy8gRGVmaW5lIGEgbW9kZWwgd2hpY2ggc2ltcGx5IGFkZHMgdHdvIGlucHV0cy5cbiAqIGNvbnN0IG1vZGVsMSA9IHRmLnNlcXVlbnRpYWwoKTtcbiAqIG1vZGVsMS5hZGQodGYubGF5ZXJzLmRlbnNlKHtpbnB1dFNoYXBlOiBbNF0sIHVuaXRzOiAzLCBhY3RpdmF0aW9uOiAncmVsdSd9KSk7XG4gKiBtb2RlbDEuYWRkKHRmLmxheWVycy5kZW5zZSh7dW5pdHM6IDEsIGFjdGl2YXRpb246ICdzaWdtb2lkJ30pKTtcbiAqIG1vZGVsMS5zdW1tYXJ5KCk7XG4gKiBtb2RlbDEucHJlZGljdCh0Zi56ZXJvcyhbMSwgNF0pKS5wcmludCgpO1xuICpcbiAqIC8vIENvbnN0cnVjdCBhbm90aGVyIG1vZGVsLCByZXVzaW5nIHRoZSBzZWNvbmQgbGF5ZXIgb2YgYG1vZGVsMWAgd2hpbGVcbiAqIC8vIG5vdCB1c2luZyB0aGUgZmlyc3QgbGF5ZXIgb2YgYG1vZGVsMWAuIE5vdGUgdGhhdCB5b3UgY2Fubm90IGFkZCB0aGUgc2Vjb25kXG4gKiAvLyBsYXllciBvZiBgbW9kZWxgIGRpcmVjdGx5IGFzIHRoZSBmaXJzdCBsYXllciBvZiB0aGUgbmV3IHNlcXVlbnRpYWwgbW9kZWwsXG4gKiAvLyBiZWNhdXNlIGRvaW5nIHNvIHdpbGwgbGVhZCB0byBhbiBlcnJvciByZWxhdGVkIHRvIHRoZSBmYWN0IHRoYXQgdGhlIGxheWVyXG4gKiAvLyBpcyBub3QgYW4gaW5wdXQgbGF5ZXIuIEluc3RlYWQsIHlvdSBuZWVkIHRvIGNyZWF0ZSBhbiBgaW5wdXRMYXllcmAgYW5kIGFkZFxuICogLy8gaXQgdG8gdGhlIG5ldyBzZXF1ZW50aWFsIG1vZGVsIGJlZm9yZSBhZGRpbmcgdGhlIHJldXNlZCBsYXllci5cbiAqIGNvbnN0IG1vZGVsMiA9IHRmLnNlcXVlbnRpYWwoKTtcbiAqIC8vIFVzZSBhbiBpbnB1dFNoYXBlIHRoYXQgbWF0Y2hlcyB0aGUgaW5wdXQgc2hhcGUgb2YgYG1vZGVsMWAncyBzZWNvbmRcbiAqIC8vIGxheWVyLlxuICogbW9kZWwyLmFkZCh0Zi5sYXllcnMuaW5wdXRMYXllcih7aW5wdXRTaGFwZTogWzNdfSkpO1xuICogbW9kZWwyLmFkZChtb2RlbDEubGF5ZXJzWzFdKTtcbiAqIG1vZGVsMi5zdW1tYXJ5KCk7XG4gKiBtb2RlbDIucHJlZGljdCh0Zi56ZXJvcyhbMSwgM10pKS5wcmludCgpO1xuICogYGBgXG4gKlxuICogQGRvYyB7aGVhZGluZzogJ0xheWVycycsIHN1YmhlYWRpbmc6ICdJbnB1dHMnLCBuYW1lc3BhY2U6ICdsYXllcnMnfVxuICovXG5leHBvcnQgZnVuY3Rpb24gaW5wdXRMYXllcihhcmdzOiBJbnB1dExheWVyQXJncykge1xuICByZXR1cm4gbmV3IElucHV0TGF5ZXIoYXJncyk7XG59XG5cbi8vIEFkdmFuY2VkIEFjdGl2YXRpb24gTGF5ZXJzLlxuXG4vKipcbiAqIEV4cG9uZW50aWFsIExpbmVhciBVbml0IChFTFUpLlxuICpcbiAqIEl0IGZvbGxvd3M6XG4gKiBgZih4KSA9ICBhbHBoYSAqIChleHAoeCkgLSAxLikgZm9yIHggPCAwYCxcbiAqIGBmKHgpID0geCBmb3IgeCA+PSAwYC5cbiAqXG4gKiBJbnB1dCBzaGFwZTpcbiAqICAgQXJiaXRyYXJ5LiBVc2UgdGhlIGNvbmZpZ3VyYXRpb24gYGlucHV0U2hhcGVgIHdoZW4gdXNpbmcgdGhpcyBsYXllciBhcyB0aGVcbiAqICAgZmlyc3QgbGF5ZXIgaW4gYSBtb2RlbC5cbiAqXG4gKiBPdXRwdXQgc2hhcGU6XG4gKiAgIFNhbWUgc2hhcGUgYXMgdGhlIGlucHV0LlxuICpcbiAqIFJlZmVyZW5jZXM6XG4gKiAgIC0gW0Zhc3QgYW5kIEFjY3VyYXRlIERlZXAgTmV0d29yayBMZWFybmluZyBieSBFeHBvbmVudGlhbCBMaW5lYXIgVW5pdHNcbiAqIChFTFVzKV0oaHR0cHM6Ly9hcnhpdi5vcmcvYWJzLzE1MTEuMDcyODl2MSlcbiAqXG4gKiBAZG9jIHtcbiAqICAgaGVhZGluZzogJ0xheWVycycsXG4gKiAgIHN1YmhlYWRpbmc6ICdBZHZhbmNlZCBBY3RpdmF0aW9uJyxcbiAqICAgbmFtZXNwYWNlOiAnbGF5ZXJzJ1xuICogfVxuICovXG5leHBvcnQgZnVuY3Rpb24gZWx1KGFyZ3M/OiBFTFVMYXllckFyZ3MpIHtcbiAgcmV0dXJuIG5ldyBFTFUoYXJncyk7XG59XG5cbi8qKlxuICogUmVjdGlmaWVkIExpbmVhciBVbml0IGFjdGl2YXRpb24gZnVuY3Rpb24uXG4gKlxuICogSW5wdXQgc2hhcGU6XG4gKiAgIEFyYml0cmFyeS4gVXNlIHRoZSBjb25maWcgZmllbGQgYGlucHV0U2hhcGVgIChBcnJheSBvZiBpbnRlZ2VycywgZG9lc1xuICogICBub3QgaW5jbHVkZSB0aGUgc2FtcGxlIGF4aXMpIHdoZW4gdXNpbmcgdGhpcyBsYXllciBhcyB0aGUgZmlyc3QgbGF5ZXJcbiAqICAgaW4gYSBtb2RlbC5cbiAqXG4gKiBPdXRwdXQgc2hhcGU6XG4gKiAgIFNhbWUgc2hhcGUgYXMgdGhlIGlucHV0LlxuICpcbiAqIEBkb2Mge1xuICogICBoZWFkaW5nOiAnTGF5ZXJzJyxcbiAqICAgc3ViaGVhZGluZzogJ0FkdmFuY2VkIEFjdGl2YXRpb24nLFxuICogICBuYW1lc3BhY2U6ICdsYXllcnMnXG4gKiB9XG4gKi9cbmV4cG9ydCBmdW5jdGlvbiByZUxVKGFyZ3M/OiBSZUxVTGF5ZXJBcmdzKSB7XG4gIHJldHVybiBuZXcgUmVMVShhcmdzKTtcbn1cblxuLyoqXG4gKiBMZWFreSB2ZXJzaW9uIG9mIGEgcmVjdGlmaWVkIGxpbmVhciB1bml0LlxuICpcbiAqIEl0IGFsbG93cyBhIHNtYWxsIGdyYWRpZW50IHdoZW4gdGhlIHVuaXQgaXMgbm90IGFjdGl2ZTpcbiAqIGBmKHgpID0gYWxwaGEgKiB4IGZvciB4IDwgMC5gXG4gKiBgZih4KSA9IHggZm9yIHggPj0gMC5gXG4gKlxuICogSW5wdXQgc2hhcGU6XG4gKiAgIEFyYml0cmFyeS4gVXNlIHRoZSBjb25maWd1cmF0aW9uIGBpbnB1dFNoYXBlYCB3aGVuIHVzaW5nIHRoaXMgbGF5ZXIgYXMgdGhlXG4gKiAgIGZpcnN0IGxheWVyIGluIGEgbW9kZWwuXG4gKlxuICogT3V0cHV0IHNoYXBlOlxuICogICBTYW1lIHNoYXBlIGFzIHRoZSBpbnB1dC5cbiAqXG4gKiBAZG9jIHtcbiAqICAgaGVhZGluZzogJ0xheWVycycsXG4gKiAgIHN1YmhlYWRpbmc6ICdBZHZhbmNlZCBBY3RpdmF0aW9uJyxcbiAqICAgbmFtZXNwYWNlOiAnbGF5ZXJzJ1xuICogfVxuICovXG5leHBvcnQgZnVuY3Rpb24gbGVha3lSZUxVKGFyZ3M/OiBMZWFreVJlTFVMYXllckFyZ3MpIHtcbiAgcmV0dXJuIG5ldyBMZWFreVJlTFUoYXJncyk7XG59XG5cbi8qKlxuICogUGFyYW1ldGVyaXplZCB2ZXJzaW9uIG9mIGEgbGVha3kgcmVjdGlmaWVkIGxpbmVhciB1bml0LlxuICpcbiAqIEl0IGZvbGxvd3NcbiAqIGBmKHgpID0gYWxwaGEgKiB4IGZvciB4IDwgMC5gXG4gKiBgZih4KSA9IHggZm9yIHggPj0gMC5gXG4gKiB3aGVyZWluIGBhbHBoYWAgaXMgYSB0cmFpbmFibGUgd2VpZ2h0LlxuICpcbiAqIElucHV0IHNoYXBlOlxuICogICBBcmJpdHJhcnkuIFVzZSB0aGUgY29uZmlndXJhdGlvbiBgaW5wdXRTaGFwZWAgd2hlbiB1c2luZyB0aGlzIGxheWVyIGFzIHRoZVxuICogICBmaXJzdCBsYXllciBpbiBhIG1vZGVsLlxuICpcbiAqIE91dHB1dCBzaGFwZTpcbiAqICAgU2FtZSBzaGFwZSBhcyB0aGUgaW5wdXQuXG4gKlxuICogQGRvYyB7XG4gKiAgIGhlYWRpbmc6ICdMYXllcnMnLFxuICogICBzdWJoZWFkaW5nOiAnQWR2YW5jZWQgQWN0aXZhdGlvbicsXG4gKiAgIG5hbWVzcGFjZTogJ2xheWVycydcbiAqIH1cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHByZWx1KGFyZ3M/OiBQUmVMVUxheWVyQXJncykge1xuICByZXR1cm4gbmV3IFBSZUxVKGFyZ3MpO1xufVxuXG4vKipcbiAqIFNvZnRtYXggYWN0aXZhdGlvbiBsYXllci5cbiAqXG4gKiBJbnB1dCBzaGFwZTpcbiAqICAgQXJiaXRyYXJ5LiBVc2UgdGhlIGNvbmZpZ3VyYXRpb24gYGlucHV0U2hhcGVgIHdoZW4gdXNpbmcgdGhpcyBsYXllciBhcyB0aGVcbiAqICAgZmlyc3QgbGF5ZXIgaW4gYSBtb2RlbC5cbiAqXG4gKiBPdXRwdXQgc2hhcGU6XG4gKiAgIFNhbWUgc2hhcGUgYXMgdGhlIGlucHV0LlxuICpcbiAqIEBkb2Mge1xuICogICBoZWFkaW5nOiAnTGF5ZXJzJyxcbiAqICAgc3ViaGVhZGluZzogJ0FkdmFuY2VkIEFjdGl2YXRpb24nLFxuICogICBuYW1lc3BhY2U6ICdsYXllcnMnXG4gKiB9XG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBzb2Z0bWF4KGFyZ3M/OiBTb2Z0bWF4TGF5ZXJBcmdzKSB7XG4gIHJldHVybiBuZXcgU29mdG1heChhcmdzKTtcbn1cblxuLyoqXG4gKiBUaHJlc2hvbGRlZCBSZWN0aWZpZWQgTGluZWFyIFVuaXQuXG4gKlxuICogSXQgZm9sbG93czpcbiAqIGBmKHgpID0geCBmb3IgeCA+IHRoZXRhYCxcbiAqIGBmKHgpID0gMCBvdGhlcndpc2VgLlxuICpcbiAqIElucHV0IHNoYXBlOlxuICogICBBcmJpdHJhcnkuIFVzZSB0aGUgY29uZmlndXJhdGlvbiBgaW5wdXRTaGFwZWAgd2hlbiB1c2luZyB0aGlzIGxheWVyIGFzIHRoZVxuICogICBmaXJzdCBsYXllciBpbiBhIG1vZGVsLlxuICpcbiAqIE91dHB1dCBzaGFwZTpcbiAqICAgU2FtZSBzaGFwZSBhcyB0aGUgaW5wdXQuXG4gKlxuICogUmVmZXJlbmNlczpcbiAqICAgLSBbWmVyby1CaWFzIEF1dG9lbmNvZGVycyBhbmQgdGhlIEJlbmVmaXRzIG9mIENvLUFkYXB0aW5nXG4gKiBGZWF0dXJlc10oaHR0cDovL2FyeGl2Lm9yZy9hYnMvMTQwMi4zMzM3KVxuICpcbiAqIEBkb2Mge1xuICogICBoZWFkaW5nOiAnTGF5ZXJzJyxcbiAqICAgc3ViaGVhZGluZzogJ0FkdmFuY2VkIEFjdGl2YXRpb24nLFxuICogICBuYW1lc3BhY2U6ICdsYXllcnMnXG4gKiB9XG4gKi9cbmV4cG9ydCBmdW5jdGlvbiB0aHJlc2hvbGRlZFJlTFUoYXJncz86IFRocmVzaG9sZGVkUmVMVUxheWVyQXJncykge1xuICByZXR1cm4gbmV3IFRocmVzaG9sZGVkUmVMVShhcmdzKTtcbn1cblxuLy8gQ29udm9sdXRpb25hbCBMYXllcnMuXG5cbi8qKlxuICogMUQgY29udm9sdXRpb24gbGF5ZXIgKGUuZy4sIHRlbXBvcmFsIGNvbnZvbHV0aW9uKS5cbiAqXG4gKiBUaGlzIGxheWVyIGNyZWF0ZXMgYSBjb252b2x1dGlvbiBrZXJuZWwgdGhhdCBpcyBjb252b2x2ZWRcbiAqIHdpdGggdGhlIGxheWVyIGlucHV0IG92ZXIgYSBzaW5nbGUgc3BhdGlhbCAob3IgdGVtcG9yYWwpIGRpbWVuc2lvblxuICogdG8gcHJvZHVjZSBhIHRlbnNvciBvZiBvdXRwdXRzLlxuICpcbiAqIElmIGB1c2VfYmlhc2AgaXMgVHJ1ZSwgYSBiaWFzIHZlY3RvciBpcyBjcmVhdGVkIGFuZCBhZGRlZCB0byB0aGUgb3V0cHV0cy5cbiAqXG4gKiBJZiBgYWN0aXZhdGlvbmAgaXMgbm90IGBudWxsYCwgaXQgaXMgYXBwbGllZCB0byB0aGUgb3V0cHV0cyBhcyB3ZWxsLlxuICpcbiAqIFdoZW4gdXNpbmcgdGhpcyBsYXllciBhcyB0aGUgZmlyc3QgbGF5ZXIgaW4gYSBtb2RlbCwgcHJvdmlkZSBhblxuICogYGlucHV0U2hhcGVgIGFyZ3VtZW50IGBBcnJheWAgb3IgYG51bGxgLlxuICpcbiAqIEZvciBleGFtcGxlLCBgaW5wdXRTaGFwZWAgd291bGQgYmU6XG4gKiAtIGBbMTAsIDEyOF1gIGZvciBzZXF1ZW5jZXMgb2YgMTAgdmVjdG9ycyBvZiAxMjgtZGltZW5zaW9uYWwgdmVjdG9yc1xuICogLSBgW251bGwsIDEyOF1gIGZvciB2YXJpYWJsZS1sZW5ndGggc2VxdWVuY2VzIG9mIDEyOC1kaW1lbnNpb25hbCB2ZWN0b3JzLlxuICpcbiAqIEBkb2Mge2hlYWRpbmc6ICdMYXllcnMnLCBzdWJoZWFkaW5nOiAnQ29udm9sdXRpb25hbCcsICBuYW1lc3BhY2U6ICdsYXllcnMnfVxuICovXG5leHBvcnQgZnVuY3Rpb24gY29udjFkKGFyZ3M6IENvbnZMYXllckFyZ3MpIHtcbiAgcmV0dXJuIG5ldyBDb252MUQoYXJncyk7XG59XG5cbi8qKlxuICogMkQgY29udm9sdXRpb24gbGF5ZXIgKGUuZy4gc3BhdGlhbCBjb252b2x1dGlvbiBvdmVyIGltYWdlcykuXG4gKlxuICogVGhpcyBsYXllciBjcmVhdGVzIGEgY29udm9sdXRpb24ga2VybmVsIHRoYXQgaXMgY29udm9sdmVkXG4gKiB3aXRoIHRoZSBsYXllciBpbnB1dCB0byBwcm9kdWNlIGEgdGVuc29yIG9mIG91dHB1dHMuXG4gKlxuICogSWYgYHVzZUJpYXNgIGlzIFRydWUsIGEgYmlhcyB2ZWN0b3IgaXMgY3JlYXRlZCBhbmQgYWRkZWQgdG8gdGhlIG91dHB1dHMuXG4gKlxuICogSWYgYGFjdGl2YXRpb25gIGlzIG5vdCBgbnVsbGAsIGl0IGlzIGFwcGxpZWQgdG8gdGhlIG91dHB1dHMgYXMgd2VsbC5cbiAqXG4gKiBXaGVuIHVzaW5nIHRoaXMgbGF5ZXIgYXMgdGhlIGZpcnN0IGxheWVyIGluIGEgbW9kZWwsXG4gKiBwcm92aWRlIHRoZSBrZXl3b3JkIGFyZ3VtZW50IGBpbnB1dFNoYXBlYFxuICogKEFycmF5IG9mIGludGVnZXJzLCBkb2VzIG5vdCBpbmNsdWRlIHRoZSBzYW1wbGUgYXhpcyksXG4gKiBlLmcuIGBpbnB1dFNoYXBlPVsxMjgsIDEyOCwgM11gIGZvciAxMjh4MTI4IFJHQiBwaWN0dXJlc1xuICogaW4gYGRhdGFGb3JtYXQ9J2NoYW5uZWxzTGFzdCdgLlxuICpcbiAqIEBkb2Mge2hlYWRpbmc6ICdMYXllcnMnLCBzdWJoZWFkaW5nOiAnQ29udm9sdXRpb25hbCcsIG5hbWVzcGFjZTogJ2xheWVycyd9XG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBjb252MmQoYXJnczogQ29udkxheWVyQXJncykge1xuICByZXR1cm4gbmV3IENvbnYyRChhcmdzKTtcbn1cblxuLyoqXG4gKiBUcmFuc3Bvc2VkIGNvbnZvbHV0aW9uYWwgbGF5ZXIgKHNvbWV0aW1lcyBjYWxsZWQgRGVjb252b2x1dGlvbikuXG4gKlxuICogVGhlIG5lZWQgZm9yIHRyYW5zcG9zZWQgY29udm9sdXRpb25zIGdlbmVyYWxseSBhcmlzZXNcbiAqIGZyb20gdGhlIGRlc2lyZSB0byB1c2UgYSB0cmFuc2Zvcm1hdGlvbiBnb2luZyBpbiB0aGUgb3Bwb3NpdGUgZGlyZWN0aW9uIG9mXG4gKiBhIG5vcm1hbCBjb252b2x1dGlvbiwgaS5lLiwgZnJvbSBzb21ldGhpbmcgdGhhdCBoYXMgdGhlIHNoYXBlIG9mIHRoZSBvdXRwdXRcbiAqIG9mIHNvbWUgY29udm9sdXRpb24gdG8gc29tZXRoaW5nIHRoYXQgaGFzIHRoZSBzaGFwZSBvZiBpdHMgaW5wdXQgd2hpbGVcbiAqIG1haW50YWluaW5nIGEgY29ubmVjdGl2aXR5IHBhdHRlcm4gdGhhdCBpcyBjb21wYXRpYmxlIHdpdGggc2FpZFxuICogY29udm9sdXRpb24uXG4gKlxuICogV2hlbiB1c2luZyB0aGlzIGxheWVyIGFzIHRoZSBmaXJzdCBsYXllciBpbiBhIG1vZGVsLCBwcm92aWRlIHRoZVxuICogY29uZmlndXJhdGlvbiBgaW5wdXRTaGFwZWAgKGBBcnJheWAgb2YgaW50ZWdlcnMsIGRvZXMgbm90IGluY2x1ZGUgdGhlXG4gKiBzYW1wbGUgYXhpcyksIGUuZy4sIGBpbnB1dFNoYXBlOiBbMTI4LCAxMjgsIDNdYCBmb3IgMTI4eDEyOCBSR0IgcGljdHVyZXMgaW5cbiAqIGBkYXRhRm9ybWF0OiAnY2hhbm5lbHNMYXN0J2AuXG4gKlxuICogSW5wdXQgc2hhcGU6XG4gKiAgIDREIHRlbnNvciB3aXRoIHNoYXBlOlxuICogICBgW2JhdGNoLCBjaGFubmVscywgcm93cywgY29sc11gIGlmIGBkYXRhRm9ybWF0YCBpcyBgJ2NoYW5uZWxzRmlyc3QnYC5cbiAqICAgb3IgNEQgdGVuc29yIHdpdGggc2hhcGVcbiAqICAgYFtiYXRjaCwgcm93cywgY29scywgY2hhbm5lbHNdYCBpZiBgZGF0YUZvcm1hdGAgaXMgYCdjaGFubmVsc0xhc3QnYC5cbiAqXG4gKiBPdXRwdXQgc2hhcGU6XG4gKiAgIDREIHRlbnNvciB3aXRoIHNoYXBlOlxuICogICBgW2JhdGNoLCBmaWx0ZXJzLCBuZXdSb3dzLCBuZXdDb2xzXWAgaWYgYGRhdGFGb3JtYXRgIGlzXG4gKiBgJ2NoYW5uZWxzRmlyc3QnYC4gb3IgNEQgdGVuc29yIHdpdGggc2hhcGU6XG4gKiAgIGBbYmF0Y2gsIG5ld1Jvd3MsIG5ld0NvbHMsIGZpbHRlcnNdYCBpZiBgZGF0YUZvcm1hdGAgaXMgYCdjaGFubmVsc0xhc3QnYC5cbiAqXG4gKiBSZWZlcmVuY2VzOlxuICogICAtIFtBIGd1aWRlIHRvIGNvbnZvbHV0aW9uIGFyaXRobWV0aWMgZm9yIGRlZXBcbiAqIGxlYXJuaW5nXShodHRwczovL2FyeGl2Lm9yZy9hYnMvMTYwMy4wNzI4NXYxKVxuICogICAtIFtEZWNvbnZvbHV0aW9uYWxcbiAqIE5ldHdvcmtzXShodHRwOi8vd3d3Lm1hdHRoZXd6ZWlsZXIuY29tL3B1YnMvY3ZwcjIwMTAvY3ZwcjIwMTAucGRmKVxuICpcbiAqIEBkb2Mge2hlYWRpbmc6ICdMYXllcnMnLCBzdWJoZWFkaW5nOiAnQ29udm9sdXRpb25hbCcsIG5hbWVzcGFjZTogJ2xheWVycyd9XG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBjb252MmRUcmFuc3Bvc2UoYXJnczogQ29udkxheWVyQXJncykge1xuICByZXR1cm4gbmV3IENvbnYyRFRyYW5zcG9zZShhcmdzKTtcbn1cblxuLyoqXG4gKiAzRCBjb252b2x1dGlvbiBsYXllciAoZS5nLiBzcGF0aWFsIGNvbnZvbHV0aW9uIG92ZXIgdm9sdW1lcykuXG4gKlxuICogVGhpcyBsYXllciBjcmVhdGVzIGEgY29udm9sdXRpb24ga2VybmVsIHRoYXQgaXMgY29udm9sdmVkXG4gKiB3aXRoIHRoZSBsYXllciBpbnB1dCB0byBwcm9kdWNlIGEgdGVuc29yIG9mIG91dHB1dHMuXG4gKlxuICogSWYgYHVzZUJpYXNgIGlzIFRydWUsIGEgYmlhcyB2ZWN0b3IgaXMgY3JlYXRlZCBhbmQgYWRkZWQgdG8gdGhlIG91dHB1dHMuXG4gKlxuICogSWYgYGFjdGl2YXRpb25gIGlzIG5vdCBgbnVsbGAsIGl0IGlzIGFwcGxpZWQgdG8gdGhlIG91dHB1dHMgYXMgd2VsbC5cbiAqXG4gKiBXaGVuIHVzaW5nIHRoaXMgbGF5ZXIgYXMgdGhlIGZpcnN0IGxheWVyIGluIGEgbW9kZWwsXG4gKiBwcm92aWRlIHRoZSBrZXl3b3JkIGFyZ3VtZW50IGBpbnB1dFNoYXBlYFxuICogKEFycmF5IG9mIGludGVnZXJzLCBkb2VzIG5vdCBpbmNsdWRlIHRoZSBzYW1wbGUgYXhpcyksXG4gKiBlLmcuIGBpbnB1dFNoYXBlPVsxMjgsIDEyOCwgMTI4LCAxXWAgZm9yIDEyOHgxMjh4MTI4IGdyYXlzY2FsZSB2b2x1bWVzXG4gKiBpbiBgZGF0YUZvcm1hdD0nY2hhbm5lbHNMYXN0J2AuXG4gKlxuICogQGRvYyB7aGVhZGluZzogJ0xheWVycycsIHN1YmhlYWRpbmc6ICdDb252b2x1dGlvbmFsJywgbmFtZXNwYWNlOiAnbGF5ZXJzJ31cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGNvbnYzZChhcmdzOiBDb252TGF5ZXJBcmdzKSB7XG4gIHJldHVybiBuZXcgQ29udjNEKGFyZ3MpO1xufVxuXG5leHBvcnQgZnVuY3Rpb24gY29udjNkVHJhbnNwb3NlKGFyZ3M6IENvbnZMYXllckFyZ3MpOiBMYXllciB7XG4gIHJldHVybiBuZXcgQ29udjNEVHJhbnNwb3NlKGFyZ3MpO1xufVxuXG4vKipcbiAqIERlcHRod2lzZSBzZXBhcmFibGUgMkQgY29udm9sdXRpb24uXG4gKlxuICogU2VwYXJhYmxlIGNvbnZvbHV0aW9uIGNvbnNpc3RzIG9mIGZpcnN0IHBlcmZvcm1pbmdcbiAqIGEgZGVwdGh3aXNlIHNwYXRpYWwgY29udm9sdXRpb25cbiAqICh3aGljaCBhY3RzIG9uIGVhY2ggaW5wdXQgY2hhbm5lbCBzZXBhcmF0ZWx5KVxuICogZm9sbG93ZWQgYnkgYSBwb2ludHdpc2UgY29udm9sdXRpb24gd2hpY2ggbWl4ZXMgdG9nZXRoZXIgdGhlIHJlc3VsdGluZ1xuICogb3V0cHV0IGNoYW5uZWxzLiBUaGUgYGRlcHRoTXVsdGlwbGllcmAgYXJndW1lbnQgY29udHJvbHMgaG93IG1hbnlcbiAqIG91dHB1dCBjaGFubmVscyBhcmUgZ2VuZXJhdGVkIHBlciBpbnB1dCBjaGFubmVsIGluIHRoZSBkZXB0aHdpc2Ugc3RlcC5cbiAqXG4gKiBJbnR1aXRpdmVseSwgc2VwYXJhYmxlIGNvbnZvbHV0aW9ucyBjYW4gYmUgdW5kZXJzdG9vZCBhc1xuICogYSB3YXkgdG8gZmFjdG9yaXplIGEgY29udm9sdXRpb24ga2VybmVsIGludG8gdHdvIHNtYWxsZXIga2VybmVscyxcbiAqIG9yIGFzIGFuIGV4dHJlbWUgdmVyc2lvbiBvZiBhbiBJbmNlcHRpb24gYmxvY2suXG4gKlxuICogSW5wdXQgc2hhcGU6XG4gKiAgIDREIHRlbnNvciB3aXRoIHNoYXBlOlxuICogICAgIGBbYmF0Y2gsIGNoYW5uZWxzLCByb3dzLCBjb2xzXWAgaWYgZGF0YV9mb3JtYXQ9J2NoYW5uZWxzRmlyc3QnXG4gKiAgIG9yIDREIHRlbnNvciB3aXRoIHNoYXBlOlxuICogICAgIGBbYmF0Y2gsIHJvd3MsIGNvbHMsIGNoYW5uZWxzXWAgaWYgZGF0YV9mb3JtYXQ9J2NoYW5uZWxzTGFzdCcuXG4gKlxuICogT3V0cHV0IHNoYXBlOlxuICogICA0RCB0ZW5zb3Igd2l0aCBzaGFwZTpcbiAqICAgICBgW2JhdGNoLCBmaWx0ZXJzLCBuZXdSb3dzLCBuZXdDb2xzXWAgaWYgZGF0YV9mb3JtYXQ9J2NoYW5uZWxzRmlyc3QnXG4gKiAgIG9yIDREIHRlbnNvciB3aXRoIHNoYXBlOlxuICogICAgIGBbYmF0Y2gsIG5ld1Jvd3MsIG5ld0NvbHMsIGZpbHRlcnNdYCBpZiBkYXRhX2Zvcm1hdD0nY2hhbm5lbHNMYXN0Jy5cbiAqICAgICBgcm93c2AgYW5kIGBjb2xzYCB2YWx1ZXMgbWlnaHQgaGF2ZSBjaGFuZ2VkIGR1ZSB0byBwYWRkaW5nLlxuICpcbiAqIEBkb2Mge2hlYWRpbmc6ICdMYXllcnMnLCBzdWJoZWFkaW5nOiAnQ29udm9sdXRpb25hbCcsIG5hbWVzcGFjZTogJ2xheWVycyd9XG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBzZXBhcmFibGVDb252MmQoYXJnczogU2VwYXJhYmxlQ29udkxheWVyQXJncykge1xuICByZXR1cm4gbmV3IFNlcGFyYWJsZUNvbnYyRChhcmdzKTtcbn1cblxuLyoqXG4gKiBDcm9wcGluZyBsYXllciBmb3IgMkQgaW5wdXQgKGUuZy4sIGltYWdlKS5cbiAqXG4gKiBUaGlzIGxheWVyIGNhbiBjcm9wIGFuIGlucHV0XG4gKiBhdCB0aGUgdG9wLCBib3R0b20sIGxlZnQgYW5kIHJpZ2h0IHNpZGUgb2YgYW4gaW1hZ2UgdGVuc29yLlxuICpcbiAqIElucHV0IHNoYXBlOlxuICogICA0RCB0ZW5zb3Igd2l0aCBzaGFwZTpcbiAqICAgLSBJZiBgZGF0YUZvcm1hdGAgaXMgYFwiY2hhbm5lbHNMYXN0XCJgOlxuICogICAgIGBbYmF0Y2gsIHJvd3MsIGNvbHMsIGNoYW5uZWxzXWBcbiAqICAgLSBJZiBgZGF0YV9mb3JtYXRgIGlzIGBcImNoYW5uZWxzX2ZpcnN0XCJgOlxuICogICAgIGBbYmF0Y2gsIGNoYW5uZWxzLCByb3dzLCBjb2xzXWAuXG4gKlxuICogT3V0cHV0IHNoYXBlOlxuICogICA0RCB3aXRoIHNoYXBlOlxuICogICAtIElmIGBkYXRhRm9ybWF0YCBpcyBgXCJjaGFubmVsc0xhc3RcImA6XG4gKiAgICAgYFtiYXRjaCwgY3JvcHBlZFJvd3MsIGNyb3BwZWRDb2xzLCBjaGFubmVsc11gXG4gKiAgICAtIElmIGBkYXRhRm9ybWF0YCBpcyBgXCJjaGFubmVsc0ZpcnN0XCJgOlxuICogICAgIGBbYmF0Y2gsIGNoYW5uZWxzLCBjcm9wcGVkUm93cywgY3JvcHBlZENvbHNdYC5cbiAqXG4gKiBFeGFtcGxlc1xuICogYGBganNcbiAqXG4gKiBjb25zdCBtb2RlbCA9IHRmLnNlcXVlbnRpYWwoKTtcbiAqIG1vZGVsLmFkZCh0Zi5sYXllcnMuY3JvcHBpbmcyRCh7Y3JvcHBpbmc6W1syLCAyXSwgWzIsIDJdXSxcbiAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnB1dFNoYXBlOiBbMTI4LCAxMjgsIDNdfSkpO1xuICogLy9ub3cgb3V0cHV0IHNoYXBlIGlzIFtiYXRjaCwgMTI0LCAxMjQsIDNdXG4gKiBgYGBcbiAqXG4gKiBAZG9jIHtoZWFkaW5nOiAnTGF5ZXJzJywgc3ViaGVhZGluZzogJ0NvbnZvbHV0aW9uYWwnLCBuYW1lc3BhY2U6ICdsYXllcnMnfVxuICovXG5leHBvcnQgZnVuY3Rpb24gY3JvcHBpbmcyRChhcmdzOiBDcm9wcGluZzJETGF5ZXJBcmdzKSB7XG4gIHJldHVybiBuZXcgQ3JvcHBpbmcyRChhcmdzKTtcbn1cblxuLyoqXG4gKiBVcHNhbXBsaW5nIGxheWVyIGZvciAyRCBpbnB1dHMuXG4gKlxuICogUmVwZWF0cyB0aGUgcm93cyBhbmQgY29sdW1ucyBvZiB0aGUgZGF0YVxuICogYnkgc2l6ZVswXSBhbmQgc2l6ZVsxXSByZXNwZWN0aXZlbHkuXG4gKlxuICpcbiAqIElucHV0IHNoYXBlOlxuICogICAgNEQgdGVuc29yIHdpdGggc2hhcGU6XG4gKiAgICAgLSBJZiBgZGF0YUZvcm1hdGAgaXMgYFwiY2hhbm5lbHNMYXN0XCJgOlxuICogICAgICAgICBgW2JhdGNoLCByb3dzLCBjb2xzLCBjaGFubmVsc11gXG4gKiAgICAgLSBJZiBgZGF0YUZvcm1hdGAgaXMgYFwiY2hhbm5lbHNGaXJzdFwiYDpcbiAqICAgICAgICBgW2JhdGNoLCBjaGFubmVscywgcm93cywgY29sc11gXG4gKlxuICogT3V0cHV0IHNoYXBlOlxuICogICAgIDREIHRlbnNvciB3aXRoIHNoYXBlOlxuICogICAgIC0gSWYgYGRhdGFGb3JtYXRgIGlzIGBcImNoYW5uZWxzTGFzdFwiYDpcbiAqICAgICAgICBgW2JhdGNoLCB1cHNhbXBsZWRSb3dzLCB1cHNhbXBsZWRDb2xzLCBjaGFubmVsc11gXG4gKiAgICAgLSBJZiBgZGF0YUZvcm1hdGAgaXMgYFwiY2hhbm5lbHNGaXJzdFwiYDpcbiAqICAgICAgICAgYFtiYXRjaCwgY2hhbm5lbHMsIHVwc2FtcGxlZFJvd3MsIHVwc2FtcGxlZENvbHNdYFxuICpcbiAqXG4gKiBAZG9jIHtoZWFkaW5nOiAnTGF5ZXJzJywgc3ViaGVhZGluZzogJ0NvbnZvbHV0aW9uYWwnLCBuYW1lc3BhY2U6ICdsYXllcnMnfVxuICovXG5leHBvcnQgZnVuY3Rpb24gdXBTYW1wbGluZzJkKGFyZ3M6IFVwU2FtcGxpbmcyRExheWVyQXJncykge1xuICByZXR1cm4gbmV3IFVwU2FtcGxpbmcyRChhcmdzKTtcbn1cblxuLy8gQ29udm9sdXRpb25hbChkZXB0aHdpc2UpIExheWVycy5cblxuLyoqXG4gKiBEZXB0aHdpc2Ugc2VwYXJhYmxlIDJEIGNvbnZvbHV0aW9uLlxuICpcbiAqIERlcHRod2lzZSBTZXBhcmFibGUgY29udm9sdXRpb25zIGNvbnNpc3RzIGluIHBlcmZvcm1pbmcganVzdCB0aGUgZmlyc3Qgc3RlcFxuICogaW4gYSBkZXB0aHdpc2Ugc3BhdGlhbCBjb252b2x1dGlvbiAod2hpY2ggYWN0cyBvbiBlYWNoIGlucHV0IGNoYW5uZWxcbiAqIHNlcGFyYXRlbHkpLiBUaGUgYGRlcHRoTXVsdGlwbGllcmAgYXJndW1lbnQgY29udHJvbHMgaG93IG1hbnkgb3V0cHV0IGNoYW5uZWxzXG4gKiBhcmUgZ2VuZXJhdGVkIHBlciBpbnB1dCBjaGFubmVsIGluIHRoZSBkZXB0aHdpc2Ugc3RlcC5cbiAqXG4gKiBAZG9jIHtoZWFkaW5nOiAnTGF5ZXJzJywgc3ViaGVhZGluZzogJ0NvbnZvbHV0aW9uYWwnLCBuYW1lc3BhY2U6ICdsYXllcnMnfVxuICovXG5leHBvcnQgZnVuY3Rpb24gZGVwdGh3aXNlQ29udjJkKGFyZ3M6IERlcHRod2lzZUNvbnYyRExheWVyQXJncykge1xuICByZXR1cm4gbmV3IERlcHRod2lzZUNvbnYyRChhcmdzKTtcbn1cblxuLy8gQmFzaWMgTGF5ZXJzLlxuXG4vKipcbiAqIEFwcGxpZXMgYW4gYWN0aXZhdGlvbiBmdW5jdGlvbiB0byBhbiBvdXRwdXQuXG4gKlxuICogVGhpcyBsYXllciBhcHBsaWVzIGVsZW1lbnQtd2lzZSBhY3RpdmF0aW9uIGZ1bmN0aW9uLiAgT3RoZXIgbGF5ZXJzLCBub3RhYmx5XG4gKiBgZGVuc2VgIGNhbiBhbHNvIGFwcGx5IGFjdGl2YXRpb24gZnVuY3Rpb25zLiAgVXNlIHRoaXMgaXNvbGF0ZWQgYWN0aXZhdGlvblxuICogZnVuY3Rpb24gdG8gZXh0cmFjdCB0aGUgdmFsdWVzIGJlZm9yZSBhbmQgYWZ0ZXIgdGhlXG4gKiBhY3RpdmF0aW9uLiBGb3IgaW5zdGFuY2U6XG4gKlxuICogYGBganNcbiAqIGNvbnN0IGlucHV0ID0gdGYuaW5wdXQoe3NoYXBlOiBbNV19KTtcbiAqIGNvbnN0IGRlbnNlTGF5ZXIgPSB0Zi5sYXllcnMuZGVuc2Uoe3VuaXRzOiAxfSk7XG4gKiBjb25zdCBhY3RpdmF0aW9uTGF5ZXIgPSB0Zi5sYXllcnMuYWN0aXZhdGlvbih7YWN0aXZhdGlvbjogJ3JlbHU2J30pO1xuICpcbiAqIC8vIE9idGFpbiB0aGUgb3V0cHV0IHN5bWJvbGljIHRlbnNvcnMgYnkgYXBwbHlpbmcgdGhlIGxheWVycyBpbiBvcmRlci5cbiAqIGNvbnN0IGRlbnNlT3V0cHV0ID0gZGVuc2VMYXllci5hcHBseShpbnB1dCk7XG4gKiBjb25zdCBhY3RpdmF0aW9uT3V0cHV0ID0gYWN0aXZhdGlvbkxheWVyLmFwcGx5KGRlbnNlT3V0cHV0KTtcbiAqXG4gKiAvLyBDcmVhdGUgdGhlIG1vZGVsIGJhc2VkIG9uIHRoZSBpbnB1dHMuXG4gKiBjb25zdCBtb2RlbCA9IHRmLm1vZGVsKHtcbiAqICAgICBpbnB1dHM6IGlucHV0LFxuICogICAgIG91dHB1dHM6IFtkZW5zZU91dHB1dCwgYWN0aXZhdGlvbk91dHB1dF1cbiAqIH0pO1xuICpcbiAqIC8vIENvbGxlY3QgYm90aCBvdXRwdXRzIGFuZCBwcmludCBzZXBhcmF0ZWx5LlxuICogY29uc3QgW2RlbnNlT3V0LCBhY3RpdmF0aW9uT3V0XSA9IG1vZGVsLnByZWRpY3QodGYucmFuZG9tTm9ybWFsKFs2LCA1XSkpO1xuICogZGVuc2VPdXQucHJpbnQoKTtcbiAqIGFjdGl2YXRpb25PdXQucHJpbnQoKTtcbiAqIGBgYFxuICpcbiAqIEBkb2Mge2hlYWRpbmc6ICdMYXllcnMnLCBzdWJoZWFkaW5nOiAnQmFzaWMnLCBuYW1lc3BhY2U6ICdsYXllcnMnfVxuICovXG5leHBvcnQgZnVuY3Rpb24gYWN0aXZhdGlvbihhcmdzOiBBY3RpdmF0aW9uTGF5ZXJBcmdzKSB7XG4gIHJldHVybiBuZXcgQWN0aXZhdGlvbihhcmdzKTtcbn1cblxuLyoqXG4gKiBDcmVhdGVzIGEgZGVuc2UgKGZ1bGx5IGNvbm5lY3RlZCkgbGF5ZXIuXG4gKlxuICogVGhpcyBsYXllciBpbXBsZW1lbnRzIHRoZSBvcGVyYXRpb246XG4gKiAgIGBvdXRwdXQgPSBhY3RpdmF0aW9uKGRvdChpbnB1dCwga2VybmVsKSArIGJpYXMpYFxuICpcbiAqIGBhY3RpdmF0aW9uYCBpcyB0aGUgZWxlbWVudC13aXNlIGFjdGl2YXRpb24gZnVuY3Rpb25cbiAqICAgcGFzc2VkIGFzIHRoZSBgYWN0aXZhdGlvbmAgYXJndW1lbnQuXG4gKlxuICogYGtlcm5lbGAgaXMgYSB3ZWlnaHRzIG1hdHJpeCBjcmVhdGVkIGJ5IHRoZSBsYXllci5cbiAqXG4gKiBgYmlhc2AgaXMgYSBiaWFzIHZlY3RvciBjcmVhdGVkIGJ5IHRoZSBsYXllciAob25seSBhcHBsaWNhYmxlIGlmIGB1c2VCaWFzYFxuICogaXMgYHRydWVgKS5cbiAqXG4gKiAqKklucHV0IHNoYXBlOioqXG4gKlxuICogICBuRCBgdGYuVGVuc29yYCB3aXRoIHNoYXBlOiBgKGJhdGNoU2l6ZSwgLi4uLCBpbnB1dERpbSlgLlxuICpcbiAqICAgVGhlIG1vc3QgY29tbW9uIHNpdHVhdGlvbiB3b3VsZCBiZVxuICogICBhIDJEIGlucHV0IHdpdGggc2hhcGUgYChiYXRjaFNpemUsIGlucHV0RGltKWAuXG4gKlxuICogKipPdXRwdXQgc2hhcGU6KipcbiAqXG4gKiAgIG5EIHRlbnNvciB3aXRoIHNoYXBlOiBgKGJhdGNoU2l6ZSwgLi4uLCB1bml0cylgLlxuICpcbiAqICAgRm9yIGluc3RhbmNlLCBmb3IgYSAyRCBpbnB1dCB3aXRoIHNoYXBlIGAoYmF0Y2hTaXplLCBpbnB1dERpbSlgLFxuICogICB0aGUgb3V0cHV0IHdvdWxkIGhhdmUgc2hhcGUgYChiYXRjaFNpemUsIHVuaXRzKWAuXG4gKlxuICogTm90ZTogaWYgdGhlIGlucHV0IHRvIHRoZSBsYXllciBoYXMgYSByYW5rIGdyZWF0ZXIgdGhhbiAyLCB0aGVuIGl0IGlzXG4gKiBmbGF0dGVuZWQgcHJpb3IgdG8gdGhlIGluaXRpYWwgZG90IHByb2R1Y3Qgd2l0aCB0aGUga2VybmVsLlxuICpcbiAqIEBkb2Mge2hlYWRpbmc6ICdMYXllcnMnLCBzdWJoZWFkaW5nOiAnQmFzaWMnLCBuYW1lc3BhY2U6ICdsYXllcnMnfVxuICovXG5leHBvcnQgZnVuY3Rpb24gZGVuc2UoYXJnczogRGVuc2VMYXllckFyZ3MpIHtcbiAgcmV0dXJuIG5ldyBEZW5zZShhcmdzKTtcbn1cblxuLyoqXG4gKiBBcHBsaWVzXG4gKiBbZHJvcG91dF0oaHR0cDovL3d3dy5jcy50b3JvbnRvLmVkdS9+cnNhbGFraHUvcGFwZXJzL3NyaXZhc3RhdmExNGEucGRmKSB0b1xuICogdGhlIGlucHV0LlxuICpcbiAqIERyb3BvdXQgY29uc2lzdHMgaW4gcmFuZG9tbHkgc2V0dGluZyBhIGZyYWN0aW9uIGByYXRlYCBvZiBpbnB1dCB1bml0cyB0byAwIGF0XG4gKiBlYWNoIHVwZGF0ZSBkdXJpbmcgdHJhaW5pbmcgdGltZSwgd2hpY2ggaGVscHMgcHJldmVudCBvdmVyZml0dGluZy5cbiAqXG4gKiBAZG9jIHtoZWFkaW5nOiAnTGF5ZXJzJywgc3ViaGVhZGluZzogJ0Jhc2ljJywgbmFtZXNwYWNlOiAnbGF5ZXJzJ31cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGRyb3BvdXQoYXJnczogRHJvcG91dExheWVyQXJncykge1xuICByZXR1cm4gbmV3IERyb3BvdXQoYXJncyk7XG59XG5cbi8qKlxuICogU3BhdGlhbCAxRCB2ZXJzaW9uIG9mIERyb3BvdXQuXG4gKlxuICogVGhpcyBMYXllciB0eXBlIHBlcmZvcm1zIHRoZSBzYW1lIGZ1bmN0aW9uIGFzIHRoZSBEcm9wb3V0IGxheWVyLCBidXQgaXQgZHJvcHNcbiAqIGVudGlyZSAxRCBmZWF0dXJlIG1hcHMgaW5zdGVhZCBvZiBpbmRpdmlkdWFsIGVsZW1lbnRzLiBGb3IgZXhhbXBsZSwgaWYgYW5cbiAqIGlucHV0IGV4YW1wbGUgY29uc2lzdHMgb2YgMyB0aW1lc3RlcHMgYW5kIHRoZSBmZWF0dXJlIG1hcCBmb3IgZWFjaCB0aW1lc3RlcFxuICogaGFzIGEgc2l6ZSBvZiA0LCBhIGBzcGF0aWFsRHJvcG91dDFkYCBsYXllciBtYXkgemVybyBvdXQgdGhlIGZlYXR1cmUgbWFwc1xuICogb2YgdGhlIDFzdCB0aW1lc3RlcHMgYW5kIDJuZCB0aW1lc3RlcHMgY29tcGxldGVseSB3aGlsZSBzcGFyaW5nIGFsbCBmZWF0dXJlXG4gKiBlbGVtZW50cyBvZiB0aGUgM3JkIHRpbWVzdGVwLlxuICpcbiAqIElmIGFkamFjZW50IGZyYW1lcyAodGltZXN0ZXBzKSBhcmUgc3Ryb25nbHkgY29ycmVsYXRlZCAoYXMgaXMgbm9ybWFsbHkgdGhlXG4gKiBjYXNlIGluIGVhcmx5IGNvbnZvbHV0aW9uIGxheWVycyksIHJlZ3VsYXIgZHJvcG91dCB3aWxsIG5vdCByZWd1bGFyaXplIHRoZVxuICogYWN0aXZhdGlvbiBhbmQgd2lsbCBvdGhlcndpc2UganVzdCByZXN1bHQgaW4gbWVyZWx5IGFuIGVmZmVjdGl2ZSBsZWFybmluZ1xuICogcmF0ZSBkZWNyZWFzZS4gSW4gdGhpcyBjYXNlLCBgc3BhdGlhbERyb3BvdXQxZGAgd2lsbCBoZWxwIHByb21vdGVcbiAqIGluZGVwZW5kZW5jZSBhbW9uZyBmZWF0dXJlIG1hcHMgYW5kIHNob3VsZCBiZSB1c2VkIGluc3RlYWQuXG4gKlxuICogKipBcmd1bWVudHM6KipcbiAqICAgcmF0ZTogQSBmbG9hdGluZy1wb2ludCBudW1iZXIgPj0wIGFuZCA8PTEuIEZyYWN0aW9uIG9mIHRoZSBpbnB1dCBlbGVtZW50c1xuICogICAgIHRvIGRyb3AuXG4gKlxuICogKipJbnB1dCBzaGFwZToqKlxuICogICAzRCB0ZW5zb3Igd2l0aCBzaGFwZSBgKHNhbXBsZXMsIHRpbWVzdGVwcywgY2hhbm5lbHMpYC5cbiAqXG4gKiAqKk91dHB1dCBzaGFwZToqKlxuICogICBTYW1lIGFzIHRoZSBpbnB1dCBzaGFwZS5cbiAqXG4gKiBSZWZlcmVuY2VzOlxuICogICAtIFtFZmZpY2llbnQgT2JqZWN0IExvY2FsaXphdGlvbiBVc2luZyBDb252b2x1dGlvbmFsXG4gKiAgICAgIE5ldHdvcmtzXShodHRwczovL2FyeGl2Lm9yZy9hYnMvMTQxMS40MjgwKVxuICpcbiAqIEBkb2Mge2hlYWRpbmc6ICdMYXllcnMnLCBzdWJoZWFkaW5nOiAnQmFzaWMnLCBuYW1lc3BhY2U6ICdsYXllcnMnfVxuICovXG5leHBvcnQgZnVuY3Rpb24gc3BhdGlhbERyb3BvdXQxZChhcmdzOiBTcGF0aWFsRHJvcG91dDFETGF5ZXJDb25maWcpIHtcbiAgcmV0dXJuIG5ldyBTcGF0aWFsRHJvcG91dDFEKGFyZ3MpO1xufVxuXG4vKipcbiAqIEZsYXR0ZW5zIHRoZSBpbnB1dC4gRG9lcyBub3QgYWZmZWN0IHRoZSBiYXRjaCBzaXplLlxuICpcbiAqIEEgYEZsYXR0ZW5gIGxheWVyIGZsYXR0ZW5zIGVhY2ggYmF0Y2ggaW4gaXRzIGlucHV0cyB0byAxRCAobWFraW5nIHRoZSBvdXRwdXRcbiAqIDJEKS5cbiAqXG4gKiBGb3IgZXhhbXBsZTpcbiAqXG4gKiBgYGBqc1xuICogY29uc3QgaW5wdXQgPSB0Zi5pbnB1dCh7c2hhcGU6IFs0LCAzXX0pO1xuICogY29uc3QgZmxhdHRlbkxheWVyID0gdGYubGF5ZXJzLmZsYXR0ZW4oKTtcbiAqIC8vIEluc3BlY3QgdGhlIGluZmVycmVkIG91dHB1dCBzaGFwZSBvZiB0aGUgZmxhdHRlbiBsYXllciwgd2hpY2hcbiAqIC8vIGVxdWFscyBgW251bGwsIDEyXWAuIFRoZSAybmQgZGltZW5zaW9uIGlzIDQgKiAzLCBpLmUuLCB0aGUgcmVzdWx0IG9mIHRoZVxuICogLy8gZmxhdHRlbmluZy4gKFRoZSAxc3QgZGltZW5zaW9uIGlzIHRoZSB1bmRlcm1pbmVkIGJhdGNoIHNpemUuKVxuICogY29uc29sZS5sb2coSlNPTi5zdHJpbmdpZnkoZmxhdHRlbkxheWVyLmFwcGx5KGlucHV0KS5zaGFwZSkpO1xuICogYGBgXG4gKlxuICogQGRvYyB7aGVhZGluZzogJ0xheWVycycsIHN1YmhlYWRpbmc6ICdCYXNpYycsIG5hbWVzcGFjZTogJ2xheWVycyd9XG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBmbGF0dGVuKGFyZ3M/OiBGbGF0dGVuTGF5ZXJBcmdzKSB7XG4gIHJldHVybiBuZXcgRmxhdHRlbihhcmdzKTtcbn1cblxuLyoqXG4gKiBSZXBlYXRzIHRoZSBpbnB1dCBuIHRpbWVzIGluIGEgbmV3IGRpbWVuc2lvbi5cbiAqXG4gKiBgYGBqc1xuICogIGNvbnN0IG1vZGVsID0gdGYuc2VxdWVudGlhbCgpO1xuICogIG1vZGVsLmFkZCh0Zi5sYXllcnMucmVwZWF0VmVjdG9yKHtuOiA0LCBpbnB1dFNoYXBlOiBbMl19KSk7XG4gKiAgY29uc3QgeCA9IHRmLnRlbnNvcjJkKFtbMTAsIDIwXV0pO1xuICogIC8vIFVzZSB0aGUgbW9kZWwgdG8gZG8gaW5mZXJlbmNlIG9uIGEgZGF0YSBwb2ludCB0aGUgbW9kZWwgaGFzbid0IHNlZVxuICogIG1vZGVsLnByZWRpY3QoeCkucHJpbnQoKTtcbiAqICAvLyBvdXRwdXQgc2hhcGUgaXMgbm93IFtiYXRjaCwgMiwgNF1cbiAqIGBgYFxuICpcbiAqIEBkb2Mge2hlYWRpbmc6ICdMYXllcnMnLCBzdWJoZWFkaW5nOiAnQmFzaWMnLCBuYW1lc3BhY2U6ICdsYXllcnMnfVxuICovXG5leHBvcnQgZnVuY3Rpb24gcmVwZWF0VmVjdG9yKGFyZ3M6IFJlcGVhdFZlY3RvckxheWVyQXJncykge1xuICByZXR1cm4gbmV3IFJlcGVhdFZlY3RvcihhcmdzKTtcbn1cblxuLyoqXG4gKiBSZXNoYXBlcyBhbiBpbnB1dCB0byBhIGNlcnRhaW4gc2hhcGUuXG4gKlxuICogYGBganNcbiAqIGNvbnN0IGlucHV0ID0gdGYuaW5wdXQoe3NoYXBlOiBbNCwgM119KTtcbiAqIGNvbnN0IHJlc2hhcGVMYXllciA9IHRmLmxheWVycy5yZXNoYXBlKHt0YXJnZXRTaGFwZTogWzIsIDZdfSk7XG4gKiAvLyBJbnNwZWN0IHRoZSBpbmZlcnJlZCBvdXRwdXQgc2hhcGUgb2YgdGhlIFJlc2hhcGUgbGF5ZXIsIHdoaWNoXG4gKiAvLyBlcXVhbHMgYFtudWxsLCAyLCA2XWAuIChUaGUgMXN0IGRpbWVuc2lvbiBpcyB0aGUgdW5kZXJtaW5lZCBiYXRjaCBzaXplLilcbiAqIGNvbnNvbGUubG9nKEpTT04uc3RyaW5naWZ5KHJlc2hhcGVMYXllci5hcHBseShpbnB1dCkuc2hhcGUpKTtcbiAqIGBgYFxuICpcbiAqIElucHV0IHNoYXBlOlxuICogICBBcmJpdHJhcnksIGFsdGhvdWdoIGFsbCBkaW1lbnNpb25zIGluIHRoZSBpbnB1dCBzaGFwZSBtdXN0IGJlIGZpeGVkLlxuICogICBVc2UgdGhlIGNvbmZpZ3VyYXRpb24gYGlucHV0U2hhcGVgIHdoZW4gdXNpbmcgdGhpcyBsYXllciBhcyB0aGVcbiAqICAgZmlyc3QgbGF5ZXIgaW4gYSBtb2RlbC5cbiAqXG4gKlxuICogT3V0cHV0IHNoYXBlOlxuICogICBbYmF0Y2hTaXplLCB0YXJnZXRTaGFwZVswXSwgdGFyZ2V0U2hhcGVbMV0sIC4uLixcbiAqICAgIHRhcmdldFNoYXBlW3RhcmdldFNoYXBlLmxlbmd0aCAtIDFdXS5cbiAqXG4gKiBAZG9jIHtoZWFkaW5nOiAnTGF5ZXJzJywgc3ViaGVhZGluZzogJ0Jhc2ljJywgbmFtZXNwYWNlOiAnbGF5ZXJzJ31cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHJlc2hhcGUoYXJnczogUmVzaGFwZUxheWVyQXJncykge1xuICByZXR1cm4gbmV3IFJlc2hhcGUoYXJncyk7XG59XG5cbi8qKlxuICogUGVybXV0ZXMgdGhlIGRpbWVuc2lvbnMgb2YgdGhlIGlucHV0IGFjY29yZGluZyB0byBhIGdpdmVuIHBhdHRlcm4uXG4gKlxuICogVXNlZnVsIGZvciwgZS5nLiwgY29ubmVjdGluZyBSTk5zIGFuZCBjb252bmV0cyB0b2dldGhlci5cbiAqXG4gKiBFeGFtcGxlOlxuICpcbiAqIGBgYGpzXG4gKiBjb25zdCBtb2RlbCA9IHRmLnNlcXVlbnRpYWwoKTtcbiAqIG1vZGVsLmFkZCh0Zi5sYXllcnMucGVybXV0ZSh7XG4gKiAgIGRpbXM6IFsyLCAxXSxcbiAqICAgaW5wdXRTaGFwZTogWzEwLCA2NF1cbiAqIH0pKTtcbiAqIGNvbnNvbGUubG9nKG1vZGVsLm91dHB1dFNoYXBlKTtcbiAqIC8vIE5vdyBtb2RlbCdzIG91dHB1dCBzaGFwZSBpcyBbbnVsbCwgNjQsIDEwXSwgd2hlcmUgbnVsbCBpcyB0aGVcbiAqIC8vIHVucGVybXV0ZWQgc2FtcGxlIChiYXRjaCkgZGltZW5zaW9uLlxuICogYGBgXG4gKlxuICogSW5wdXQgc2hhcGU6XG4gKiAgIEFyYml0cmFyeS4gVXNlIHRoZSBjb25maWd1cmF0aW9uIGZpZWxkIGBpbnB1dFNoYXBlYCB3aGVuIHVzaW5nIHRoaXNcbiAqICAgbGF5ZXIgYXMgdGhlIGZpcnN0IGxheWVyIGluIGEgbW9kZWwuXG4gKlxuICogT3V0cHV0IHNoYXBlOlxuICogICBTYW1lIHJhbmsgYXMgdGhlIGlucHV0IHNoYXBlLCBidXQgd2l0aCB0aGUgZGltZW5zaW9ucyByZS1vcmRlcmVkIChpLmUuLFxuICogICBwZXJtdXRlZCkgYWNjb3JkaW5nIHRvIHRoZSBgZGltc2AgY29uZmlndXJhdGlvbiBvZiB0aGlzIGxheWVyLlxuICpcbiAqIEBkb2Mge2hlYWRpbmc6ICdMYXllcnMnLCBzdWJoZWFkaW5nOiAnQmFzaWMnLCBuYW1lc3BhY2U6ICdsYXllcnMnfVxuICovXG5leHBvcnQgZnVuY3Rpb24gcGVybXV0ZShhcmdzOiBQZXJtdXRlTGF5ZXJBcmdzKSB7XG4gIHJldHVybiBuZXcgUGVybXV0ZShhcmdzKTtcbn1cblxuLyoqXG4gKiBNYXBzIHBvc2l0aXZlIGludGVnZXJzIChpbmRpY2VzKSBpbnRvIGRlbnNlIHZlY3RvcnMgb2YgZml4ZWQgc2l6ZS5cbiAqIEUuZy4gW1s0XSwgWzIwXV0gLT4gW1swLjI1LCAwLjFdLCBbMC42LCAtMC4yXV1cbiAqXG4gKiAqKklucHV0IHNoYXBlOioqIDJEIHRlbnNvciB3aXRoIHNoYXBlOiBgW2JhdGNoU2l6ZSwgc2VxdWVuY2VMZW5ndGhdYC5cbiAqXG4gKiAqKk91dHB1dCBzaGFwZToqKiAzRCB0ZW5zb3Igd2l0aCBzaGFwZTogYFtiYXRjaFNpemUsIHNlcXVlbmNlTGVuZ3RoLFxuICogb3V0cHV0RGltXWAuXG4gKlxuICogQGRvYyB7aGVhZGluZzogJ0xheWVycycsIHN1YmhlYWRpbmc6ICdCYXNpYycsIG5hbWVzcGFjZTogJ2xheWVycyd9XG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBlbWJlZGRpbmcoYXJnczogRW1iZWRkaW5nTGF5ZXJBcmdzKSB7XG4gIHJldHVybiBuZXcgRW1iZWRkaW5nKGFyZ3MpO1xufVxuXG4vLyBNZXJnZSBMYXllcnMuXG5cbi8qKlxuICogTGF5ZXIgdGhhdCBwZXJmb3JtcyBlbGVtZW50LXdpc2UgYWRkaXRpb24gb24gYW4gYEFycmF5YCBvZiBpbnB1dHMuXG4gKlxuICogSXQgdGFrZXMgYXMgaW5wdXQgYSBsaXN0IG9mIHRlbnNvcnMsIGFsbCBvZiB0aGUgc2FtZSBzaGFwZSwgYW5kIHJldHVybnMgYVxuICogc2luZ2xlIHRlbnNvciAoYWxzbyBvZiB0aGUgc2FtZSBzaGFwZSkuIFRoZSBpbnB1dHMgYXJlIHNwZWNpZmllZCBhcyBhblxuICogYEFycmF5YCB3aGVuIHRoZSBgYXBwbHlgIG1ldGhvZCBvZiB0aGUgYEFkZGAgbGF5ZXIgaW5zdGFuY2UgaXMgY2FsbGVkLiBGb3JcbiAqIGV4YW1wbGU6XG4gKlxuICogYGBganNcbiAqIGNvbnN0IGlucHV0MSA9IHRmLmlucHV0KHtzaGFwZTogWzIsIDJdfSk7XG4gKiBjb25zdCBpbnB1dDIgPSB0Zi5pbnB1dCh7c2hhcGU6IFsyLCAyXX0pO1xuICogY29uc3QgYWRkTGF5ZXIgPSB0Zi5sYXllcnMuYWRkKCk7XG4gKiBjb25zdCBzdW0gPSBhZGRMYXllci5hcHBseShbaW5wdXQxLCBpbnB1dDJdKTtcbiAqIGNvbnNvbGUubG9nKEpTT04uc3RyaW5naWZ5KHN1bS5zaGFwZSkpO1xuICogLy8gWW91IGdldCBbbnVsbCwgMiwgMl0sIHdpdGggdGhlIGZpcnN0IGRpbWVuc2lvbiBhcyB0aGUgdW5kZXRlcm1pbmVkIGJhdGNoXG4gKiAvLyBkaW1lbnNpb24uXG4gKiBgYGBcbiAqXG4gKiBAZG9jIHtoZWFkaW5nOiAnTGF5ZXJzJywgc3ViaGVhZGluZzogJ01lcmdlJywgbmFtZXNwYWNlOiAnbGF5ZXJzJ31cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGFkZChhcmdzPzogTGF5ZXJBcmdzKSB7XG4gIHJldHVybiBuZXcgQWRkKGFyZ3MpO1xufVxuXG4vKipcbiAqIExheWVyIHRoYXQgcGVyZm9ybXMgZWxlbWVudC13aXNlIGF2ZXJhZ2luZyBvbiBhbiBgQXJyYXlgIG9mIGlucHV0cy5cbiAqXG4gKiBJdCB0YWtlcyBhcyBpbnB1dCBhIGxpc3Qgb2YgdGVuc29ycywgYWxsIG9mIHRoZSBzYW1lIHNoYXBlLCBhbmQgcmV0dXJucyBhXG4gKiBzaW5nbGUgdGVuc29yIChhbHNvIG9mIHRoZSBzYW1lIHNoYXBlKS4gRm9yIGV4YW1wbGU6XG4gKlxuICogYGBganNcbiAqIGNvbnN0IGlucHV0MSA9IHRmLmlucHV0KHtzaGFwZTogWzIsIDJdfSk7XG4gKiBjb25zdCBpbnB1dDIgPSB0Zi5pbnB1dCh7c2hhcGU6IFsyLCAyXX0pO1xuICogY29uc3QgYXZlcmFnZUxheWVyID0gdGYubGF5ZXJzLmF2ZXJhZ2UoKTtcbiAqIGNvbnN0IGF2ZXJhZ2UgPSBhdmVyYWdlTGF5ZXIuYXBwbHkoW2lucHV0MSwgaW5wdXQyXSk7XG4gKiBjb25zb2xlLmxvZyhKU09OLnN0cmluZ2lmeShhdmVyYWdlLnNoYXBlKSk7XG4gKiAvLyBZb3UgZ2V0IFtudWxsLCAyLCAyXSwgd2l0aCB0aGUgZmlyc3QgZGltZW5zaW9uIGFzIHRoZSB1bmRldGVybWluZWQgYmF0Y2hcbiAqIC8vIGRpbWVuc2lvbi5cbiAqIGBgYFxuICpcbiAqIEBkb2Mge2hlYWRpbmc6ICdMYXllcnMnLCBzdWJoZWFkaW5nOiAnTWVyZ2UnLCBuYW1lc3BhY2U6ICdsYXllcnMnfVxuICovXG5leHBvcnQgZnVuY3Rpb24gYXZlcmFnZShhcmdzPzogTGF5ZXJBcmdzKSB7XG4gIHJldHVybiBuZXcgQXZlcmFnZShhcmdzKTtcbn1cblxuLyoqXG4gKiBMYXllciB0aGF0IGNvbmNhdGVuYXRlcyBhbiBgQXJyYXlgIG9mIGlucHV0cy5cbiAqXG4gKiBJdCB0YWtlcyBhIGxpc3Qgb2YgdGVuc29ycywgYWxsIG9mIHRoZSBzYW1lIHNoYXBlIGV4Y2VwdCBmb3IgdGhlXG4gKiBjb25jYXRlbmF0aW9uIGF4aXMsIGFuZCByZXR1cm5zIGEgc2luZ2xlIHRlbnNvciwgdGhlIGNvbmNhdGVuYXRpb25cbiAqIG9mIGFsbCBpbnB1dHMuIEZvciBleGFtcGxlOlxuICpcbiAqIGBgYGpzXG4gKiBjb25zdCBpbnB1dDEgPSB0Zi5pbnB1dCh7c2hhcGU6IFsyLCAyXX0pO1xuICogY29uc3QgaW5wdXQyID0gdGYuaW5wdXQoe3NoYXBlOiBbMiwgM119KTtcbiAqIGNvbnN0IGNvbmNhdExheWVyID0gdGYubGF5ZXJzLmNvbmNhdGVuYXRlKCk7XG4gKiBjb25zdCBvdXRwdXQgPSBjb25jYXRMYXllci5hcHBseShbaW5wdXQxLCBpbnB1dDJdKTtcbiAqIGNvbnNvbGUubG9nKEpTT04uc3RyaW5naWZ5KG91dHB1dC5zaGFwZSkpO1xuICogLy8gWW91IGdldCBbbnVsbCwgMiwgNV0sIHdpdGggdGhlIGZpcnN0IGRpbWVuc2lvbiBhcyB0aGUgdW5kZXRlcm1pbmVkIGJhdGNoXG4gKiAvLyBkaW1lbnNpb24uIFRoZSBsYXN0IGRpbWVuc2lvbiAoNSkgaXMgdGhlIHJlc3VsdCBvZiBjb25jYXRlbmF0aW5nIHRoZVxuICogLy8gbGFzdCBkaW1lbnNpb25zIG9mIHRoZSBpbnB1dHMgKDIgYW5kIDMpLlxuICogYGBgXG4gKlxuICogQGRvYyB7aGVhZGluZzogJ0xheWVycycsIHN1YmhlYWRpbmc6ICdNZXJnZScsIG5hbWVzcGFjZTogJ2xheWVycyd9XG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBjb25jYXRlbmF0ZShhcmdzPzogQ29uY2F0ZW5hdGVMYXllckFyZ3MpIHtcbiAgcmV0dXJuIG5ldyBDb25jYXRlbmF0ZShhcmdzKTtcbn1cblxuLyoqXG4gKiBMYXllciB0aGF0IGNvbXB1dGVzIHRoZSBlbGVtZW50LXdpc2UgbWF4aW11bSBvZiBhbiBgQXJyYXlgIG9mIGlucHV0cy5cbiAqXG4gKiBJdCB0YWtlcyBhcyBpbnB1dCBhIGxpc3Qgb2YgdGVuc29ycywgYWxsIG9mIHRoZSBzYW1lIHNoYXBlLCBhbmQgcmV0dXJucyBhXG4gKiBzaW5nbGUgdGVuc29yIChhbHNvIG9mIHRoZSBzYW1lIHNoYXBlKS4gRm9yIGV4YW1wbGU6XG4gKlxuICogYGBganNcbiAqIGNvbnN0IGlucHV0MSA9IHRmLmlucHV0KHtzaGFwZTogWzIsIDJdfSk7XG4gKiBjb25zdCBpbnB1dDIgPSB0Zi5pbnB1dCh7c2hhcGU6IFsyLCAyXX0pO1xuICogY29uc3QgbWF4TGF5ZXIgPSB0Zi5sYXllcnMubWF4aW11bSgpO1xuICogY29uc3QgbWF4ID0gbWF4TGF5ZXIuYXBwbHkoW2lucHV0MSwgaW5wdXQyXSk7XG4gKiBjb25zb2xlLmxvZyhKU09OLnN0cmluZ2lmeShtYXguc2hhcGUpKTtcbiAqIC8vIFlvdSBnZXQgW251bGwsIDIsIDJdLCB3aXRoIHRoZSBmaXJzdCBkaW1lbnNpb24gYXMgdGhlIHVuZGV0ZXJtaW5lZCBiYXRjaFxuICogLy8gZGltZW5zaW9uLlxuICogYGBgXG4gKlxuICogQGRvYyB7aGVhZGluZzogJ0xheWVycycsIHN1YmhlYWRpbmc6ICdNZXJnZScsIG5hbWVzcGFjZTogJ2xheWVycyd9XG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBtYXhpbXVtKGFyZ3M/OiBMYXllckFyZ3MpIHtcbiAgcmV0dXJuIG5ldyBNYXhpbXVtKGFyZ3MpO1xufVxuXG4vKipcbiAqIExheWVyIHRoYXQgY29tcHV0ZXMgdGhlIGVsZW1lbnQtd2lzZSBtaW5pbXVtIG9mIGFuIGBBcnJheWAgb2YgaW5wdXRzLlxuICpcbiAqIEl0IHRha2VzIGFzIGlucHV0IGEgbGlzdCBvZiB0ZW5zb3JzLCBhbGwgb2YgdGhlIHNhbWUgc2hhcGUsIGFuZCByZXR1cm5zIGFcbiAqIHNpbmdsZSB0ZW5zb3IgKGFsc28gb2YgdGhlIHNhbWUgc2hhcGUpLiBGb3IgZXhhbXBsZTpcbiAqXG4gKiBgYGBqc1xuICogY29uc3QgaW5wdXQxID0gdGYuaW5wdXQoe3NoYXBlOiBbMiwgMl19KTtcbiAqIGNvbnN0IGlucHV0MiA9IHRmLmlucHV0KHtzaGFwZTogWzIsIDJdfSk7XG4gKiBjb25zdCBtaW5MYXllciA9IHRmLmxheWVycy5taW5pbXVtKCk7XG4gKiBjb25zdCBtaW4gPSBtaW5MYXllci5hcHBseShbaW5wdXQxLCBpbnB1dDJdKTtcbiAqIGNvbnNvbGUubG9nKEpTT04uc3RyaW5naWZ5KG1pbi5zaGFwZSkpO1xuICogLy8gWW91IGdldCBbbnVsbCwgMiwgMl0sIHdpdGggdGhlIGZpcnN0IGRpbWVuc2lvbiBhcyB0aGUgdW5kZXRlcm1pbmVkIGJhdGNoXG4gKiAvLyBkaW1lbnNpb24uXG4gKiBgYGBcbiAqXG4gKiBAZG9jIHtoZWFkaW5nOiAnTGF5ZXJzJywgc3ViaGVhZGluZzogJ01lcmdlJywgbmFtZXNwYWNlOiAnbGF5ZXJzJ31cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIG1pbmltdW0oYXJncz86IExheWVyQXJncykge1xuICByZXR1cm4gbmV3IE1pbmltdW0oYXJncyk7XG59XG5cbi8qKlxuICogTGF5ZXIgdGhhdCBtdWx0aXBsaWVzIChlbGVtZW50LXdpc2UpIGFuIGBBcnJheWAgb2YgaW5wdXRzLlxuICpcbiAqIEl0IHRha2VzIGFzIGlucHV0IGFuIEFycmF5IG9mIHRlbnNvcnMsIGFsbCBvZiB0aGUgc2FtZVxuICogc2hhcGUsIGFuZCByZXR1cm5zIGEgc2luZ2xlIHRlbnNvciAoYWxzbyBvZiB0aGUgc2FtZSBzaGFwZSkuXG4gKiBGb3IgZXhhbXBsZTpcbiAqXG4gKiBgYGBqc1xuICogY29uc3QgaW5wdXQxID0gdGYuaW5wdXQoe3NoYXBlOiBbMiwgMl19KTtcbiAqIGNvbnN0IGlucHV0MiA9IHRmLmlucHV0KHtzaGFwZTogWzIsIDJdfSk7XG4gKiBjb25zdCBpbnB1dDMgPSB0Zi5pbnB1dCh7c2hhcGU6IFsyLCAyXX0pO1xuICogY29uc3QgbXVsdGlwbHlMYXllciA9IHRmLmxheWVycy5tdWx0aXBseSgpO1xuICogY29uc3QgcHJvZHVjdCA9IG11bHRpcGx5TGF5ZXIuYXBwbHkoW2lucHV0MSwgaW5wdXQyLCBpbnB1dDNdKTtcbiAqIGNvbnNvbGUubG9nKHByb2R1Y3Quc2hhcGUpO1xuICogLy8gWW91IGdldCBbbnVsbCwgMiwgMl0sIHdpdGggdGhlIGZpcnN0IGRpbWVuc2lvbiBhcyB0aGUgdW5kZXRlcm1pbmVkIGJhdGNoXG4gKiAvLyBkaW1lbnNpb24uXG4gKlxuICogQGRvYyB7aGVhZGluZzogJ0xheWVycycsIHN1YmhlYWRpbmc6ICdNZXJnZScsIG5hbWVzcGFjZTogJ2xheWVycyd9XG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBtdWx0aXBseShhcmdzPzogTGF5ZXJBcmdzKSB7XG4gIHJldHVybiBuZXcgTXVsdGlwbHkoYXJncyk7XG59XG5cbi8qKlxuICogTGF5ZXIgdGhhdCBjb21wdXRlcyBhIGRvdCBwcm9kdWN0IGJldHdlZW4gc2FtcGxlcyBpbiB0d28gdGVuc29ycy5cbiAqXG4gKiBFLmcuLCBpZiBhcHBsaWVkIHRvIGEgbGlzdCBvZiB0d28gdGVuc29ycyBgYWAgYW5kIGBiYCBib3RoIG9mIHNoYXBlXG4gKiBgW2JhdGNoU2l6ZSwgbl1gLCB0aGUgb3V0cHV0IHdpbGwgYmUgYSB0ZW5zb3Igb2Ygc2hhcGUgYFtiYXRjaFNpemUsIDFdYCxcbiAqIHdoZXJlIGVhY2ggZW50cnkgYXQgaW5kZXggYFtpLCAwXWAgd2lsbCBiZSB0aGUgZG90IHByb2R1Y3QgYmV0d2VlblxuICogYGFbaSwgOl1gIGFuZCBgYltpLCA6XWAuXG4gKlxuICogRXhhbXBsZTpcbiAqXG4gKiBgYGBqc1xuICogY29uc3QgZG90TGF5ZXIgPSB0Zi5sYXllcnMuZG90KHtheGVzOiAtMX0pO1xuICogY29uc3QgeDEgPSB0Zi50ZW5zb3IyZChbWzEwLCAyMF0sIFszMCwgNDBdXSk7XG4gKiBjb25zdCB4MiA9IHRmLnRlbnNvcjJkKFtbLTEsIC0yXSwgWy0zLCAtNF1dKTtcbiAqXG4gKiAvLyBJbnZva2UgdGhlIGxheWVyJ3MgYXBwbHkoKSBtZXRob2QgaW4gZWFnZXIgKGltcGVyYXRpdmUpIG1vZGUuXG4gKiBjb25zdCB5ID0gZG90TGF5ZXIuYXBwbHkoW3gxLCB4Ml0pO1xuICogeS5wcmludCgpO1xuICogYGBgXG4gKlxuICogQGRvYyB7aGVhZGluZzogJ0xheWVycycsIHN1YmhlYWRpbmc6ICdNZXJnZScsIG5hbWVzcGFjZTogJ2xheWVycyd9XG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBkb3QoYXJnczogRG90TGF5ZXJBcmdzKSB7XG4gIHJldHVybiBuZXcgRG90KGFyZ3MpO1xufVxuXG4vLyBOb3JtYWxpemF0aW9uIExheWVycy5cblxuLyoqXG4gKiBCYXRjaCBub3JtYWxpemF0aW9uIGxheWVyIChJb2ZmZSBhbmQgU3plZ2VkeSwgMjAxNCkuXG4gKlxuICogTm9ybWFsaXplIHRoZSBhY3RpdmF0aW9ucyBvZiB0aGUgcHJldmlvdXMgbGF5ZXIgYXQgZWFjaCBiYXRjaCxcbiAqIGkuZS4gYXBwbGllcyBhIHRyYW5zZm9ybWF0aW9uIHRoYXQgbWFpbnRhaW5zIHRoZSBtZWFuIGFjdGl2YXRpb25cbiAqIGNsb3NlIHRvIDAgYW5kIHRoZSBhY3RpdmF0aW9uIHN0YW5kYXJkIGRldmlhdGlvbiBjbG9zZSB0byAxLlxuICpcbiAqIElucHV0IHNoYXBlOlxuICogICBBcmJpdHJhcnkuIFVzZSB0aGUga2V5d29yZCBhcmd1bWVudCBgaW5wdXRTaGFwZWAgKEFycmF5IG9mIGludGVnZXJzLCBkb2VzXG4gKiAgIG5vdCBpbmNsdWRlIHRoZSBzYW1wbGUgYXhpcykgd2hlbiBjYWxsaW5nIHRoZSBjb25zdHJ1Y3RvciBvZiB0aGlzIGNsYXNzLFxuICogICBpZiB0aGlzIGxheWVyIGlzIHVzZWQgYXMgYSBmaXJzdCBsYXllciBpbiBhIG1vZGVsLlxuICpcbiAqIE91dHB1dCBzaGFwZTpcbiAqICAgU2FtZSBzaGFwZSBhcyBpbnB1dC5cbiAqXG4gKiBSZWZlcmVuY2VzOlxuICogICAtIFtCYXRjaCBOb3JtYWxpemF0aW9uOiBBY2NlbGVyYXRpbmcgRGVlcCBOZXR3b3JrIFRyYWluaW5nIGJ5IFJlZHVjaW5nXG4gKiBJbnRlcm5hbCBDb3ZhcmlhdGUgU2hpZnRdKGh0dHBzOi8vYXJ4aXYub3JnL2Ficy8xNTAyLjAzMTY3KVxuICpcbiAqIEBkb2Mge2hlYWRpbmc6ICdMYXllcnMnLCBzdWJoZWFkaW5nOiAnTm9ybWFsaXphdGlvbicsIG5hbWVzcGFjZTogJ2xheWVycyd9XG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBiYXRjaE5vcm1hbGl6YXRpb24oYXJncz86IEJhdGNoTm9ybWFsaXphdGlvbkxheWVyQXJncykge1xuICByZXR1cm4gbmV3IEJhdGNoTm9ybWFsaXphdGlvbihhcmdzKTtcbn1cblxuLyoqXG4gKiBMYXllci1ub3JtYWxpemF0aW9uIGxheWVyIChCYSBldCBhbC4sIDIwMTYpLlxuICpcbiAqIE5vcm1hbGl6ZXMgdGhlIGFjdGl2YXRpb25zIG9mIHRoZSBwcmV2aW91cyBsYXllciBmb3IgZWFjaCBnaXZlbiBleGFtcGxlIGluIGFcbiAqIGJhdGNoIGluZGVwZW5kZW50bHksIGluc3RlYWQgb2YgYWNyb3NzIGEgYmF0Y2ggbGlrZSBpbiBgYmF0Y2hOb3JtYWxpemF0aW9uYC5cbiAqIEluIG90aGVyIHdvcmRzLCB0aGlzIGxheWVyIGFwcGxpZXMgYSB0cmFuc2Zvcm1hdGlvbiB0aGF0IG1haW50YWlucyB0aGUgbWVhblxuICogYWN0aXZhdGlvbiB3aXRoaW4gZWFjaCBleGFtcGxlIGNsb3NlIHRvIDAgYW5kIGFjdGl2YXRpb24gdmFyaWFuY2UgY2xvc2UgdG8gMS5cbiAqXG4gKiBJbnB1dCBzaGFwZTpcbiAqICAgQXJiaXRyYXJ5LiBVc2UgdGhlIGFyZ3VtZW50IGBpbnB1dFNoYXBlYCB3aGVuIHVzaW5nIHRoaXMgbGF5ZXIgYXMgdGhlIGZpcnN0XG4gKiAgIGxheWVyIGluIGEgbW9kZWwuXG4gKlxuICogT3V0cHV0IHNoYXBlOlxuICogICBTYW1lIGFzIGlucHV0LlxuICpcbiAqIFJlZmVyZW5jZXM6XG4gKiAgIC0gW0xheWVyIE5vcm1hbGl6YXRpb25dKGh0dHBzOi8vYXJ4aXYub3JnL2Ficy8xNjA3LjA2NDUwKVxuICpcbiAqIEBkb2Mge2hlYWRpbmc6ICdMYXllcnMnLCBzdWJoZWFkaW5nOiAnTm9ybWFsaXphdGlvbicsIG5hbWVzcGFjZTogJ2xheWVycyd9XG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBsYXllck5vcm1hbGl6YXRpb24oYXJncz86IExheWVyTm9ybWFsaXphdGlvbkxheWVyQXJncykge1xuICByZXR1cm4gbmV3IExheWVyTm9ybWFsaXphdGlvbihhcmdzKTtcbn1cblxuLy8gUGFkZGluZyBMYXllcnMuXG5cbi8qKlxuICogWmVyby1wYWRkaW5nIGxheWVyIGZvciAyRCBpbnB1dCAoZS5nLiwgaW1hZ2UpLlxuICpcbiAqIFRoaXMgbGF5ZXIgY2FuIGFkZCByb3dzIGFuZCBjb2x1bW5zIG9mIHplcm9zXG4gKiBhdCB0aGUgdG9wLCBib3R0b20sIGxlZnQgYW5kIHJpZ2h0IHNpZGUgb2YgYW4gaW1hZ2UgdGVuc29yLlxuICpcbiAqIElucHV0IHNoYXBlOlxuICogICA0RCB0ZW5zb3Igd2l0aCBzaGFwZTpcbiAqICAgLSBJZiBgZGF0YUZvcm1hdGAgaXMgYFwiY2hhbm5lbHNMYXN0XCJgOlxuICogICAgIGBbYmF0Y2gsIHJvd3MsIGNvbHMsIGNoYW5uZWxzXWBcbiAqICAgLSBJZiBgZGF0YV9mb3JtYXRgIGlzIGBcImNoYW5uZWxzX2ZpcnN0XCJgOlxuICogICAgIGBbYmF0Y2gsIGNoYW5uZWxzLCByb3dzLCBjb2xzXWAuXG4gKlxuICogT3V0cHV0IHNoYXBlOlxuICogICA0RCB3aXRoIHNoYXBlOlxuICogICAtIElmIGBkYXRhRm9ybWF0YCBpcyBgXCJjaGFubmVsc0xhc3RcImA6XG4gKiAgICAgYFtiYXRjaCwgcGFkZGVkUm93cywgcGFkZGVkQ29scywgY2hhbm5lbHNdYFxuICogICAgLSBJZiBgZGF0YUZvcm1hdGAgaXMgYFwiY2hhbm5lbHNGaXJzdFwiYDpcbiAqICAgICBgW2JhdGNoLCBjaGFubmVscywgcGFkZGVkUm93cywgcGFkZGVkQ29sc11gLlxuICpcbiAqIEBkb2Mge2hlYWRpbmc6ICdMYXllcnMnLCBzdWJoZWFkaW5nOiAnUGFkZGluZycsIG5hbWVzcGFjZTogJ2xheWVycyd9XG4gKi9cbmV4cG9ydCBmdW5jdGlvbiB6ZXJvUGFkZGluZzJkKGFyZ3M/OiBaZXJvUGFkZGluZzJETGF5ZXJBcmdzKSB7XG4gIHJldHVybiBuZXcgWmVyb1BhZGRpbmcyRChhcmdzKTtcbn1cblxuLy8gUG9vbGluZyBMYXllcnMuXG5cbi8qKlxuICogQXZlcmFnZSBwb29saW5nIG9wZXJhdGlvbiBmb3Igc3BhdGlhbCBkYXRhLlxuICpcbiAqIElucHV0IHNoYXBlOiBgW2JhdGNoU2l6ZSwgaW5MZW5ndGgsIGNoYW5uZWxzXWBcbiAqXG4gKiBPdXRwdXQgc2hhcGU6IGBbYmF0Y2hTaXplLCBwb29sZWRMZW5ndGgsIGNoYW5uZWxzXWBcbiAqXG4gKiBgdGYuYXZnUG9vbDFkYCBpcyBhbiBhbGlhcy5cbiAqXG4gKiBAZG9jIHtoZWFkaW5nOiAnTGF5ZXJzJywgc3ViaGVhZGluZzogJ1Bvb2xpbmcnLCBuYW1lc3BhY2U6ICdsYXllcnMnfVxuICovXG5leHBvcnQgZnVuY3Rpb24gYXZlcmFnZVBvb2xpbmcxZChhcmdzOiBQb29saW5nMURMYXllckFyZ3MpIHtcbiAgcmV0dXJuIG5ldyBBdmVyYWdlUG9vbGluZzFEKGFyZ3MpO1xufVxuZXhwb3J0IGZ1bmN0aW9uIGF2Z1Bvb2wxZChhcmdzOiBQb29saW5nMURMYXllckFyZ3MpIHtcbiAgcmV0dXJuIGF2ZXJhZ2VQb29saW5nMWQoYXJncyk7XG59XG4vLyBGb3IgYmFja3dhcmRzIGNvbXBhdGliaWxpdHkuXG4vLyBTZWUgaHR0cHM6Ly9naXRodWIuY29tL3RlbnNvcmZsb3cvdGZqcy9pc3N1ZXMvMTUyXG5leHBvcnQgZnVuY3Rpb24gYXZnUG9vbGluZzFkKGFyZ3M6IFBvb2xpbmcxRExheWVyQXJncykge1xuICByZXR1cm4gYXZlcmFnZVBvb2xpbmcxZChhcmdzKTtcbn1cblxuLyoqXG4gKiBBdmVyYWdlIHBvb2xpbmcgb3BlcmF0aW9uIGZvciBzcGF0aWFsIGRhdGEuXG4gKlxuICogSW5wdXQgc2hhcGU6XG4gKiAgLSBJZiBgZGF0YUZvcm1hdCA9PT0gQ0hBTk5FTF9MQVNUYDpcbiAqICAgICAgNEQgdGVuc29yIHdpdGggc2hhcGU6XG4gKiAgICAgIGBbYmF0Y2hTaXplLCByb3dzLCBjb2xzLCBjaGFubmVsc11gXG4gKiAgLSBJZiBgZGF0YUZvcm1hdCA9PT0gQ0hBTk5FTF9GSVJTVGA6XG4gKiAgICAgIDREIHRlbnNvciB3aXRoIHNoYXBlOlxuICogICAgICBgW2JhdGNoU2l6ZSwgY2hhbm5lbHMsIHJvd3MsIGNvbHNdYFxuICpcbiAqIE91dHB1dCBzaGFwZVxuICogIC0gSWYgYGRhdGFGb3JtYXQgPT09IENIQU5ORUxfTEFTVGA6XG4gKiAgICAgIDREIHRlbnNvciB3aXRoIHNoYXBlOlxuICogICAgICBgW2JhdGNoU2l6ZSwgcG9vbGVkUm93cywgcG9vbGVkQ29scywgY2hhbm5lbHNdYFxuICogIC0gSWYgYGRhdGFGb3JtYXQgPT09IENIQU5ORUxfRklSU1RgOlxuICogICAgICA0RCB0ZW5zb3Igd2l0aCBzaGFwZTpcbiAqICAgICAgYFtiYXRjaFNpemUsIGNoYW5uZWxzLCBwb29sZWRSb3dzLCBwb29sZWRDb2xzXWBcbiAqXG4gKiBgdGYuYXZnUG9vbDJkYCBpcyBhbiBhbGlhcy5cbiAqXG4gKiBAZG9jIHtoZWFkaW5nOiAnTGF5ZXJzJywgc3ViaGVhZGluZzogJ1Bvb2xpbmcnLCBuYW1lc3BhY2U6ICdsYXllcnMnfVxuICovXG5leHBvcnQgZnVuY3Rpb24gYXZlcmFnZVBvb2xpbmcyZChhcmdzOiBQb29saW5nMkRMYXllckFyZ3MpIHtcbiAgcmV0dXJuIG5ldyBBdmVyYWdlUG9vbGluZzJEKGFyZ3MpO1xufVxuZXhwb3J0IGZ1bmN0aW9uIGF2Z1Bvb2wyZChhcmdzOiBQb29saW5nMkRMYXllckFyZ3MpIHtcbiAgcmV0dXJuIGF2ZXJhZ2VQb29saW5nMmQoYXJncyk7XG59XG4vLyBGb3IgYmFja3dhcmRzIGNvbXBhdGliaWxpdHkuXG4vLyBTZWUgaHR0cHM6Ly9naXRodWIuY29tL3RlbnNvcmZsb3cvdGZqcy9pc3N1ZXMvMTUyXG5leHBvcnQgZnVuY3Rpb24gYXZnUG9vbGluZzJkKGFyZ3M6IFBvb2xpbmcyRExheWVyQXJncykge1xuICByZXR1cm4gYXZlcmFnZVBvb2xpbmcyZChhcmdzKTtcbn1cblxuLyoqXG4gKiBBdmVyYWdlIHBvb2xpbmcgb3BlcmF0aW9uIGZvciAzRCBkYXRhLlxuICpcbiAqIElucHV0IHNoYXBlXG4gKiAgIC0gSWYgYGRhdGFGb3JtYXQgPT09IGNoYW5uZWxzTGFzdGA6XG4gKiAgICAgICA1RCB0ZW5zb3Igd2l0aCBzaGFwZTpcbiAqICAgICAgIGBbYmF0Y2hTaXplLCBkZXB0aHMsIHJvd3MsIGNvbHMsIGNoYW5uZWxzXWBcbiAqICAgLSBJZiBgZGF0YUZvcm1hdCA9PT0gY2hhbm5lbHNGaXJzdGA6XG4gKiAgICAgIDREIHRlbnNvciB3aXRoIHNoYXBlOlxuICogICAgICAgYFtiYXRjaFNpemUsIGNoYW5uZWxzLCBkZXB0aHMsIHJvd3MsIGNvbHNdYFxuICpcbiAqIE91dHB1dCBzaGFwZVxuICogICAtIElmIGBkYXRhRm9ybWF0PWNoYW5uZWxzTGFzdGA6XG4gKiAgICAgICA1RCB0ZW5zb3Igd2l0aCBzaGFwZTpcbiAqICAgICAgIGBbYmF0Y2hTaXplLCBwb29sZWREZXB0aHMsIHBvb2xlZFJvd3MsIHBvb2xlZENvbHMsIGNoYW5uZWxzXWBcbiAqICAgLSBJZiBgZGF0YUZvcm1hdD1jaGFubmVsc0ZpcnN0YDpcbiAqICAgICAgIDVEIHRlbnNvciB3aXRoIHNoYXBlOlxuICogICAgICAgYFtiYXRjaFNpemUsIGNoYW5uZWxzLCBwb29sZWREZXB0aHMsIHBvb2xlZFJvd3MsIHBvb2xlZENvbHNdYFxuICpcbiAqIEBkb2Mge2hlYWRpbmc6ICdMYXllcnMnLCBzdWJoZWFkaW5nOiAnUG9vbGluZycsIG5hbWVzcGFjZTogJ2xheWVycyd9XG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBhdmVyYWdlUG9vbGluZzNkKGFyZ3M6IFBvb2xpbmczRExheWVyQXJncykge1xuICByZXR1cm4gbmV3IEF2ZXJhZ2VQb29saW5nM0QoYXJncyk7XG59XG5leHBvcnQgZnVuY3Rpb24gYXZnUG9vbDNkKGFyZ3M6IFBvb2xpbmczRExheWVyQXJncykge1xuICByZXR1cm4gYXZlcmFnZVBvb2xpbmczZChhcmdzKTtcbn1cbi8vIEZvciBiYWNrd2FyZHMgY29tcGF0aWJpbGl0eS5cbi8vIFNlZSBodHRwczovL2dpdGh1Yi5jb20vdGVuc29yZmxvdy90ZmpzL2lzc3Vlcy8xNTJcbmV4cG9ydCBmdW5jdGlvbiBhdmdQb29saW5nM2QoYXJnczogUG9vbGluZzNETGF5ZXJBcmdzKSB7XG4gIHJldHVybiBhdmVyYWdlUG9vbGluZzNkKGFyZ3MpO1xufVxuXG4vKipcbiAqIEdsb2JhbCBhdmVyYWdlIHBvb2xpbmcgb3BlcmF0aW9uIGZvciB0ZW1wb3JhbCBkYXRhLlxuICpcbiAqIElucHV0IFNoYXBlOiAzRCB0ZW5zb3Igd2l0aCBzaGFwZTogYFtiYXRjaFNpemUsIHN0ZXBzLCBmZWF0dXJlc11gLlxuICpcbiAqIE91dHB1dCBTaGFwZTogMkQgdGVuc29yIHdpdGggc2hhcGU6IGBbYmF0Y2hTaXplLCBmZWF0dXJlc11gLlxuICpcbiAqIEBkb2Mge2hlYWRpbmc6ICdMYXllcnMnLCBzdWJoZWFkaW5nOiAnUG9vbGluZycsIG5hbWVzcGFjZTogJ2xheWVycyd9XG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBnbG9iYWxBdmVyYWdlUG9vbGluZzFkKGFyZ3M/OiBMYXllckFyZ3MpIHtcbiAgcmV0dXJuIG5ldyBHbG9iYWxBdmVyYWdlUG9vbGluZzFEKGFyZ3MpO1xufVxuXG4vKipcbiAqIEdsb2JhbCBhdmVyYWdlIHBvb2xpbmcgb3BlcmF0aW9uIGZvciBzcGF0aWFsIGRhdGEuXG4gKlxuICogSW5wdXQgc2hhcGU6XG4gKiAgIC0gSWYgYGRhdGFGb3JtYXRgIGlzIGBDSEFOTkVMX0xBU1RgOlxuICogICAgICAgNEQgdGVuc29yIHdpdGggc2hhcGU6IGBbYmF0Y2hTaXplLCByb3dzLCBjb2xzLCBjaGFubmVsc11gLlxuICogICAtIElmIGBkYXRhRm9ybWF0YCBpcyBgQ0hBTk5FTF9GSVJTVGA6XG4gKiAgICAgICA0RCB0ZW5zb3Igd2l0aCBzaGFwZTogYFtiYXRjaFNpemUsIGNoYW5uZWxzLCByb3dzLCBjb2xzXWAuXG4gKlxuICogT3V0cHV0IHNoYXBlOlxuICogICAyRCB0ZW5zb3Igd2l0aCBzaGFwZTogYFtiYXRjaFNpemUsIGNoYW5uZWxzXWAuXG4gKlxuICogQGRvYyB7aGVhZGluZzogJ0xheWVycycsIHN1YmhlYWRpbmc6ICdQb29saW5nJywgbmFtZXNwYWNlOiAnbGF5ZXJzJ31cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGdsb2JhbEF2ZXJhZ2VQb29saW5nMmQoYXJnczogR2xvYmFsUG9vbGluZzJETGF5ZXJBcmdzKSB7XG4gIHJldHVybiBuZXcgR2xvYmFsQXZlcmFnZVBvb2xpbmcyRChhcmdzKTtcbn1cblxuLyoqXG4gKiBHbG9iYWwgbWF4IHBvb2xpbmcgb3BlcmF0aW9uIGZvciB0ZW1wb3JhbCBkYXRhLlxuICpcbiAqIElucHV0IFNoYXBlOiAzRCB0ZW5zb3Igd2l0aCBzaGFwZTogYFtiYXRjaFNpemUsIHN0ZXBzLCBmZWF0dXJlc11gLlxuICpcbiAqIE91dHB1dCBTaGFwZTogMkQgdGVuc29yIHdpdGggc2hhcGU6IGBbYmF0Y2hTaXplLCBmZWF0dXJlc11gLlxuICpcbiAqIEBkb2Mge2hlYWRpbmc6ICdMYXllcnMnLCBzdWJoZWFkaW5nOiAnUG9vbGluZycsIG5hbWVzcGFjZTogJ2xheWVycyd9XG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBnbG9iYWxNYXhQb29saW5nMWQoYXJncz86IExheWVyQXJncykge1xuICByZXR1cm4gbmV3IEdsb2JhbE1heFBvb2xpbmcxRChhcmdzKTtcbn1cblxuLyoqXG4gKiBHbG9iYWwgbWF4IHBvb2xpbmcgb3BlcmF0aW9uIGZvciBzcGF0aWFsIGRhdGEuXG4gKlxuICogSW5wdXQgc2hhcGU6XG4gKiAgIC0gSWYgYGRhdGFGb3JtYXRgIGlzIGBDSEFOTkVMX0xBU1RgOlxuICogICAgICAgNEQgdGVuc29yIHdpdGggc2hhcGU6IGBbYmF0Y2hTaXplLCByb3dzLCBjb2xzLCBjaGFubmVsc11gLlxuICogICAtIElmIGBkYXRhRm9ybWF0YCBpcyBgQ0hBTk5FTF9GSVJTVGA6XG4gKiAgICAgICA0RCB0ZW5zb3Igd2l0aCBzaGFwZTogYFtiYXRjaFNpemUsIGNoYW5uZWxzLCByb3dzLCBjb2xzXWAuXG4gKlxuICogT3V0cHV0IHNoYXBlOlxuICogICAyRCB0ZW5zb3Igd2l0aCBzaGFwZTogYFtiYXRjaFNpemUsIGNoYW5uZWxzXWAuXG4gKlxuICogQGRvYyB7aGVhZGluZzogJ0xheWVycycsIHN1YmhlYWRpbmc6ICdQb29saW5nJywgbmFtZXNwYWNlOiAnbGF5ZXJzJ31cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGdsb2JhbE1heFBvb2xpbmcyZChhcmdzOiBHbG9iYWxQb29saW5nMkRMYXllckFyZ3MpIHtcbiAgcmV0dXJuIG5ldyBHbG9iYWxNYXhQb29saW5nMkQoYXJncyk7XG59XG5cbi8qKlxuICogTWF4IHBvb2xpbmcgb3BlcmF0aW9uIGZvciB0ZW1wb3JhbCBkYXRhLlxuICpcbiAqIElucHV0IHNoYXBlOiAgYFtiYXRjaFNpemUsIGluTGVuZ3RoLCBjaGFubmVsc11gXG4gKlxuICogT3V0cHV0IHNoYXBlOiBgW2JhdGNoU2l6ZSwgcG9vbGVkTGVuZ3RoLCBjaGFubmVsc11gXG4gKlxuICogQGRvYyB7aGVhZGluZzogJ0xheWVycycsIHN1YmhlYWRpbmc6ICdQb29saW5nJywgbmFtZXNwYWNlOiAnbGF5ZXJzJ31cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIG1heFBvb2xpbmcxZChhcmdzOiBQb29saW5nMURMYXllckFyZ3MpIHtcbiAgcmV0dXJuIG5ldyBNYXhQb29saW5nMUQoYXJncyk7XG59XG5cbi8qKlxuICogTWF4IHBvb2xpbmcgb3BlcmF0aW9uIGZvciBzcGF0aWFsIGRhdGEuXG4gKlxuICogSW5wdXQgc2hhcGVcbiAqICAgLSBJZiBgZGF0YUZvcm1hdCA9PT0gQ0hBTk5FTF9MQVNUYDpcbiAqICAgICAgIDREIHRlbnNvciB3aXRoIHNoYXBlOlxuICogICAgICAgYFtiYXRjaFNpemUsIHJvd3MsIGNvbHMsIGNoYW5uZWxzXWBcbiAqICAgLSBJZiBgZGF0YUZvcm1hdCA9PT0gQ0hBTk5FTF9GSVJTVGA6XG4gKiAgICAgIDREIHRlbnNvciB3aXRoIHNoYXBlOlxuICogICAgICAgYFtiYXRjaFNpemUsIGNoYW5uZWxzLCByb3dzLCBjb2xzXWBcbiAqXG4gKiBPdXRwdXQgc2hhcGVcbiAqICAgLSBJZiBgZGF0YUZvcm1hdD1DSEFOTkVMX0xBU1RgOlxuICogICAgICAgNEQgdGVuc29yIHdpdGggc2hhcGU6XG4gKiAgICAgICBgW2JhdGNoU2l6ZSwgcG9vbGVkUm93cywgcG9vbGVkQ29scywgY2hhbm5lbHNdYFxuICogICAtIElmIGBkYXRhRm9ybWF0PUNIQU5ORUxfRklSU1RgOlxuICogICAgICAgNEQgdGVuc29yIHdpdGggc2hhcGU6XG4gKiAgICAgICBgW2JhdGNoU2l6ZSwgY2hhbm5lbHMsIHBvb2xlZFJvd3MsIHBvb2xlZENvbHNdYFxuICpcbiAqIEBkb2Mge2hlYWRpbmc6ICdMYXllcnMnLCBzdWJoZWFkaW5nOiAnUG9vbGluZycsIG5hbWVzcGFjZTogJ2xheWVycyd9XG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBtYXhQb29saW5nMmQoYXJnczogUG9vbGluZzJETGF5ZXJBcmdzKSB7XG4gIHJldHVybiBuZXcgTWF4UG9vbGluZzJEKGFyZ3MpO1xufVxuXG4vKipcbiAqIE1heCBwb29saW5nIG9wZXJhdGlvbiBmb3IgM0QgZGF0YS5cbiAqXG4gKiBJbnB1dCBzaGFwZVxuICogICAtIElmIGBkYXRhRm9ybWF0ID09PSBjaGFubmVsc0xhc3RgOlxuICogICAgICAgNUQgdGVuc29yIHdpdGggc2hhcGU6XG4gKiAgICAgICBgW2JhdGNoU2l6ZSwgZGVwdGhzLCByb3dzLCBjb2xzLCBjaGFubmVsc11gXG4gKiAgIC0gSWYgYGRhdGFGb3JtYXQgPT09IGNoYW5uZWxzRmlyc3RgOlxuICogICAgICA1RCB0ZW5zb3Igd2l0aCBzaGFwZTpcbiAqICAgICAgIGBbYmF0Y2hTaXplLCBjaGFubmVscywgZGVwdGhzLCByb3dzLCBjb2xzXWBcbiAqXG4gKiBPdXRwdXQgc2hhcGVcbiAqICAgLSBJZiBgZGF0YUZvcm1hdD1jaGFubmVsc0xhc3RgOlxuICogICAgICAgNUQgdGVuc29yIHdpdGggc2hhcGU6XG4gKiAgICAgICBgW2JhdGNoU2l6ZSwgcG9vbGVkRGVwdGhzLCBwb29sZWRSb3dzLCBwb29sZWRDb2xzLCBjaGFubmVsc11gXG4gKiAgIC0gSWYgYGRhdGFGb3JtYXQ9Y2hhbm5lbHNGaXJzdGA6XG4gKiAgICAgICA1RCB0ZW5zb3Igd2l0aCBzaGFwZTpcbiAqICAgICAgIGBbYmF0Y2hTaXplLCBjaGFubmVscywgcG9vbGVkRGVwdGhzLCBwb29sZWRSb3dzLCBwb29sZWRDb2xzXWBcbiAqXG4gKiBAZG9jIHtoZWFkaW5nOiAnTGF5ZXJzJywgc3ViaGVhZGluZzogJ1Bvb2xpbmcnLCBuYW1lc3BhY2U6ICdsYXllcnMnfVxuICovXG5leHBvcnQgZnVuY3Rpb24gbWF4UG9vbGluZzNkKGFyZ3M6IFBvb2xpbmczRExheWVyQXJncykge1xuICByZXR1cm4gbmV3IE1heFBvb2xpbmczRChhcmdzKTtcbn1cblxuLy8gUmVjdXJyZW50IExheWVycy5cblxuLyoqXG4gKiBHYXRlZCBSZWN1cnJlbnQgVW5pdCAtIENobyBldCBhbC4gMjAxNC5cbiAqXG4gKiBUaGlzIGlzIGFuIGBSTk5gIGxheWVyIGNvbnNpc3Rpbmcgb2Ygb25lIGBHUlVDZWxsYC4gSG93ZXZlciwgdW5saWtlXG4gKiB0aGUgdW5kZXJseWluZyBgR1JVQ2VsbGAsIHRoZSBgYXBwbHlgIG1ldGhvZCBvZiBgU2ltcGxlUk5OYCBvcGVyYXRlc1xuICogb24gYSBzZXF1ZW5jZSBvZiBpbnB1dHMuIFRoZSBzaGFwZSBvZiB0aGUgaW5wdXQgKG5vdCBpbmNsdWRpbmcgdGhlIGZpcnN0LFxuICogYmF0Y2ggZGltZW5zaW9uKSBuZWVkcyB0byBiZSBhdCBsZWFzdCAyLUQsIHdpdGggdGhlIGZpcnN0IGRpbWVuc2lvbiBiZWluZ1xuICogdGltZSBzdGVwcy4gRm9yIGV4YW1wbGU6XG4gKlxuICogYGBganNcbiAqIGNvbnN0IHJubiA9IHRmLmxheWVycy5ncnUoe3VuaXRzOiA4LCByZXR1cm5TZXF1ZW5jZXM6IHRydWV9KTtcbiAqXG4gKiAvLyBDcmVhdGUgYW4gaW5wdXQgd2l0aCAxMCB0aW1lIHN0ZXBzLlxuICogY29uc3QgaW5wdXQgPSB0Zi5pbnB1dCh7c2hhcGU6IFsxMCwgMjBdfSk7XG4gKiBjb25zdCBvdXRwdXQgPSBybm4uYXBwbHkoaW5wdXQpO1xuICpcbiAqIGNvbnNvbGUubG9nKEpTT04uc3RyaW5naWZ5KG91dHB1dC5zaGFwZSkpO1xuICogLy8gW251bGwsIDEwLCA4XTogMXN0IGRpbWVuc2lvbiBpcyB1bmtub3duIGJhdGNoIHNpemU7IDJuZCBkaW1lbnNpb24gaXMgdGhlXG4gKiAvLyBzYW1lIGFzIHRoZSBzZXF1ZW5jZSBsZW5ndGggb2YgYGlucHV0YCwgZHVlIHRvIGByZXR1cm5TZXF1ZW5jZXNgOiBgdHJ1ZWA7XG4gKiAvLyAzcmQgZGltZW5zaW9uIGlzIHRoZSBgR1JVQ2VsbGAncyBudW1iZXIgb2YgdW5pdHMuXG4gKlxuICogQGRvYyB7aGVhZGluZzogJ0xheWVycycsIHN1YmhlYWRpbmc6ICdSZWN1cnJlbnQnLCBuYW1lc3BhY2U6ICdsYXllcnMnfVxuICovXG5leHBvcnQgZnVuY3Rpb24gZ3J1KGFyZ3M6IEdSVUxheWVyQXJncykge1xuICByZXR1cm4gbmV3IEdSVShhcmdzKTtcbn1cblxuLyoqXG4gKiBDZWxsIGNsYXNzIGZvciBgR1JVYC5cbiAqXG4gKiBgR1JVQ2VsbGAgaXMgZGlzdGluY3QgZnJvbSB0aGUgYFJOTmAgc3ViY2xhc3MgYEdSVWAgaW4gdGhhdCBpdHNcbiAqIGBhcHBseWAgbWV0aG9kIHRha2VzIHRoZSBpbnB1dCBkYXRhIG9mIG9ubHkgYSBzaW5nbGUgdGltZSBzdGVwIGFuZCByZXR1cm5zXG4gKiB0aGUgY2VsbCdzIG91dHB1dCBhdCB0aGUgdGltZSBzdGVwLCB3aGlsZSBgR1JVYCB0YWtlcyB0aGUgaW5wdXQgZGF0YVxuICogb3ZlciBhIG51bWJlciBvZiB0aW1lIHN0ZXBzLiBGb3IgZXhhbXBsZTpcbiAqXG4gKiBgYGBqc1xuICogY29uc3QgY2VsbCA9IHRmLmxheWVycy5ncnVDZWxsKHt1bml0czogMn0pO1xuICogY29uc3QgaW5wdXQgPSB0Zi5pbnB1dCh7c2hhcGU6IFsxMF19KTtcbiAqIGNvbnN0IG91dHB1dCA9IGNlbGwuYXBwbHkoaW5wdXQpO1xuICpcbiAqIGNvbnNvbGUubG9nKEpTT04uc3RyaW5naWZ5KG91dHB1dC5zaGFwZSkpO1xuICogLy8gW251bGwsIDEwXTogVGhpcyBpcyB0aGUgY2VsbCdzIG91dHB1dCBhdCBhIHNpbmdsZSB0aW1lIHN0ZXAuIFRoZSAxc3RcbiAqIC8vIGRpbWVuc2lvbiBpcyB0aGUgdW5rbm93biBiYXRjaCBzaXplLlxuICogYGBgXG4gKlxuICogSW5zdGFuY2Uocykgb2YgYEdSVUNlbGxgIGNhbiBiZSB1c2VkIHRvIGNvbnN0cnVjdCBgUk5OYCBsYXllcnMuIFRoZVxuICogbW9zdCB0eXBpY2FsIHVzZSBvZiB0aGlzIHdvcmtmbG93IGlzIHRvIGNvbWJpbmUgYSBudW1iZXIgb2YgY2VsbHMgaW50byBhXG4gKiBzdGFja2VkIFJOTiBjZWxsIChpLmUuLCBgU3RhY2tlZFJOTkNlbGxgIGludGVybmFsbHkpIGFuZCB1c2UgaXQgdG8gY3JlYXRlIGFuXG4gKiBSTk4uIEZvciBleGFtcGxlOlxuICpcbiAqIGBgYGpzXG4gKiBjb25zdCBjZWxscyA9IFtcbiAqICAgdGYubGF5ZXJzLmdydUNlbGwoe3VuaXRzOiA0fSksXG4gKiAgIHRmLmxheWVycy5ncnVDZWxsKHt1bml0czogOH0pLFxuICogXTtcbiAqIGNvbnN0IHJubiA9IHRmLmxheWVycy5ybm4oe2NlbGw6IGNlbGxzLCByZXR1cm5TZXF1ZW5jZXM6IHRydWV9KTtcbiAqXG4gKiAvLyBDcmVhdGUgYW4gaW5wdXQgd2l0aCAxMCB0aW1lIHN0ZXBzIGFuZCBhIGxlbmd0aC0yMCB2ZWN0b3IgYXQgZWFjaCBzdGVwLlxuICogY29uc3QgaW5wdXQgPSB0Zi5pbnB1dCh7c2hhcGU6IFsxMCwgMjBdfSk7XG4gKiBjb25zdCBvdXRwdXQgPSBybm4uYXBwbHkoaW5wdXQpO1xuICpcbiAqIGNvbnNvbGUubG9nKEpTT04uc3RyaW5naWZ5KG91dHB1dC5zaGFwZSkpO1xuICogLy8gW251bGwsIDEwLCA4XTogMXN0IGRpbWVuc2lvbiBpcyB1bmtub3duIGJhdGNoIHNpemU7IDJuZCBkaW1lbnNpb24gaXMgdGhlXG4gKiAvLyBzYW1lIGFzIHRoZSBzZXF1ZW5jZSBsZW5ndGggb2YgYGlucHV0YCwgZHVlIHRvIGByZXR1cm5TZXF1ZW5jZXNgOiBgdHJ1ZWA7XG4gKiAvLyAzcmQgZGltZW5zaW9uIGlzIHRoZSBsYXN0IGBncnVDZWxsYCdzIG51bWJlciBvZiB1bml0cy5cbiAqIGBgYFxuICpcbiAqIFRvIGNyZWF0ZSBhbiBgUk5OYCBjb25zaXN0aW5nIG9mIG9ubHkgKm9uZSogYEdSVUNlbGxgLCB1c2UgdGhlXG4gKiBgdGYubGF5ZXJzLmdydWAuXG4gKlxuICogQGRvYyB7aGVhZGluZzogJ0xheWVycycsIHN1YmhlYWRpbmc6ICdSZWN1cnJlbnQnLCBuYW1lc3BhY2U6ICdsYXllcnMnfVxuICovXG5leHBvcnQgZnVuY3Rpb24gZ3J1Q2VsbChhcmdzOiBHUlVDZWxsTGF5ZXJBcmdzKSB7XG4gIHJldHVybiBuZXcgR1JVQ2VsbChhcmdzKTtcbn1cblxuLyoqXG4gKiBMb25nLVNob3J0IFRlcm0gTWVtb3J5IGxheWVyIC0gSG9jaHJlaXRlciAxOTk3LlxuICpcbiAqIFRoaXMgaXMgYW4gYFJOTmAgbGF5ZXIgY29uc2lzdGluZyBvZiBvbmUgYExTVE1DZWxsYC4gSG93ZXZlciwgdW5saWtlXG4gKiB0aGUgdW5kZXJseWluZyBgTFNUTUNlbGxgLCB0aGUgYGFwcGx5YCBtZXRob2Qgb2YgYExTVE1gIG9wZXJhdGVzXG4gKiBvbiBhIHNlcXVlbmNlIG9mIGlucHV0cy4gVGhlIHNoYXBlIG9mIHRoZSBpbnB1dCAobm90IGluY2x1ZGluZyB0aGUgZmlyc3QsXG4gKiBiYXRjaCBkaW1lbnNpb24pIG5lZWRzIHRvIGJlIGF0IGxlYXN0IDItRCwgd2l0aCB0aGUgZmlyc3QgZGltZW5zaW9uIGJlaW5nXG4gKiB0aW1lIHN0ZXBzLiBGb3IgZXhhbXBsZTpcbiAqXG4gKiBgYGBqc1xuICogY29uc3QgbHN0bSA9IHRmLmxheWVycy5sc3RtKHt1bml0czogOCwgcmV0dXJuU2VxdWVuY2VzOiB0cnVlfSk7XG4gKlxuICogLy8gQ3JlYXRlIGFuIGlucHV0IHdpdGggMTAgdGltZSBzdGVwcy5cbiAqIGNvbnN0IGlucHV0ID0gdGYuaW5wdXQoe3NoYXBlOiBbMTAsIDIwXX0pO1xuICogY29uc3Qgb3V0cHV0ID0gbHN0bS5hcHBseShpbnB1dCk7XG4gKlxuICogY29uc29sZS5sb2coSlNPTi5zdHJpbmdpZnkob3V0cHV0LnNoYXBlKSk7XG4gKiAvLyBbbnVsbCwgMTAsIDhdOiAxc3QgZGltZW5zaW9uIGlzIHVua25vd24gYmF0Y2ggc2l6ZTsgMm5kIGRpbWVuc2lvbiBpcyB0aGVcbiAqIC8vIHNhbWUgYXMgdGhlIHNlcXVlbmNlIGxlbmd0aCBvZiBgaW5wdXRgLCBkdWUgdG8gYHJldHVyblNlcXVlbmNlc2A6IGB0cnVlYDtcbiAqIC8vIDNyZCBkaW1lbnNpb24gaXMgdGhlIGBMU1RNQ2VsbGAncyBudW1iZXIgb2YgdW5pdHMuXG4gKlxuICogQGRvYyB7aGVhZGluZzogJ0xheWVycycsIHN1YmhlYWRpbmc6ICdSZWN1cnJlbnQnLCBuYW1lc3BhY2U6ICdsYXllcnMnfVxuICovXG5leHBvcnQgZnVuY3Rpb24gbHN0bShhcmdzOiBMU1RNTGF5ZXJBcmdzKSB7XG4gIHJldHVybiBuZXcgTFNUTShhcmdzKTtcbn1cblxuLyoqXG4gKiBDZWxsIGNsYXNzIGZvciBgTFNUTWAuXG4gKlxuICogYExTVE1DZWxsYCBpcyBkaXN0aW5jdCBmcm9tIHRoZSBgUk5OYCBzdWJjbGFzcyBgTFNUTWAgaW4gdGhhdCBpdHNcbiAqIGBhcHBseWAgbWV0aG9kIHRha2VzIHRoZSBpbnB1dCBkYXRhIG9mIG9ubHkgYSBzaW5nbGUgdGltZSBzdGVwIGFuZCByZXR1cm5zXG4gKiB0aGUgY2VsbCdzIG91dHB1dCBhdCB0aGUgdGltZSBzdGVwLCB3aGlsZSBgTFNUTWAgdGFrZXMgdGhlIGlucHV0IGRhdGFcbiAqIG92ZXIgYSBudW1iZXIgb2YgdGltZSBzdGVwcy4gRm9yIGV4YW1wbGU6XG4gKlxuICogYGBganNcbiAqIGNvbnN0IGNlbGwgPSB0Zi5sYXllcnMubHN0bUNlbGwoe3VuaXRzOiAyfSk7XG4gKiBjb25zdCBpbnB1dCA9IHRmLmlucHV0KHtzaGFwZTogWzEwXX0pO1xuICogY29uc3Qgb3V0cHV0ID0gY2VsbC5hcHBseShpbnB1dCk7XG4gKlxuICogY29uc29sZS5sb2coSlNPTi5zdHJpbmdpZnkob3V0cHV0LnNoYXBlKSk7XG4gKiAvLyBbbnVsbCwgMTBdOiBUaGlzIGlzIHRoZSBjZWxsJ3Mgb3V0cHV0IGF0IGEgc2luZ2xlIHRpbWUgc3RlcC4gVGhlIDFzdFxuICogLy8gZGltZW5zaW9uIGlzIHRoZSB1bmtub3duIGJhdGNoIHNpemUuXG4gKiBgYGBcbiAqXG4gKiBJbnN0YW5jZShzKSBvZiBgTFNUTUNlbGxgIGNhbiBiZSB1c2VkIHRvIGNvbnN0cnVjdCBgUk5OYCBsYXllcnMuIFRoZVxuICogbW9zdCB0eXBpY2FsIHVzZSBvZiB0aGlzIHdvcmtmbG93IGlzIHRvIGNvbWJpbmUgYSBudW1iZXIgb2YgY2VsbHMgaW50byBhXG4gKiBzdGFja2VkIFJOTiBjZWxsIChpLmUuLCBgU3RhY2tlZFJOTkNlbGxgIGludGVybmFsbHkpIGFuZCB1c2UgaXQgdG8gY3JlYXRlIGFuXG4gKiBSTk4uIEZvciBleGFtcGxlOlxuICpcbiAqIGBgYGpzXG4gKiBjb25zdCBjZWxscyA9IFtcbiAqICAgdGYubGF5ZXJzLmxzdG1DZWxsKHt1bml0czogNH0pLFxuICogICB0Zi5sYXllcnMubHN0bUNlbGwoe3VuaXRzOiA4fSksXG4gKiBdO1xuICogY29uc3Qgcm5uID0gdGYubGF5ZXJzLnJubih7Y2VsbDogY2VsbHMsIHJldHVyblNlcXVlbmNlczogdHJ1ZX0pO1xuICpcbiAqIC8vIENyZWF0ZSBhbiBpbnB1dCB3aXRoIDEwIHRpbWUgc3RlcHMgYW5kIGEgbGVuZ3RoLTIwIHZlY3RvciBhdCBlYWNoIHN0ZXAuXG4gKiBjb25zdCBpbnB1dCA9IHRmLmlucHV0KHtzaGFwZTogWzEwLCAyMF19KTtcbiAqIGNvbnN0IG91dHB1dCA9IHJubi5hcHBseShpbnB1dCk7XG4gKlxuICogY29uc29sZS5sb2coSlNPTi5zdHJpbmdpZnkob3V0cHV0LnNoYXBlKSk7XG4gKiAvLyBbbnVsbCwgMTAsIDhdOiAxc3QgZGltZW5zaW9uIGlzIHVua25vd24gYmF0Y2ggc2l6ZTsgMm5kIGRpbWVuc2lvbiBpcyB0aGVcbiAqIC8vIHNhbWUgYXMgdGhlIHNlcXVlbmNlIGxlbmd0aCBvZiBgaW5wdXRgLCBkdWUgdG8gYHJldHVyblNlcXVlbmNlc2A6IGB0cnVlYDtcbiAqIC8vIDNyZCBkaW1lbnNpb24gaXMgdGhlIGxhc3QgYGxzdG1DZWxsYCdzIG51bWJlciBvZiB1bml0cy5cbiAqIGBgYFxuICpcbiAqIFRvIGNyZWF0ZSBhbiBgUk5OYCBjb25zaXN0aW5nIG9mIG9ubHkgKm9uZSogYExTVE1DZWxsYCwgdXNlIHRoZVxuICogYHRmLmxheWVycy5sc3RtYC5cbiAqXG4gKiBAZG9jIHtoZWFkaW5nOiAnTGF5ZXJzJywgc3ViaGVhZGluZzogJ1JlY3VycmVudCcsIG5hbWVzcGFjZTogJ2xheWVycyd9XG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBsc3RtQ2VsbChhcmdzOiBMU1RNQ2VsbExheWVyQXJncykge1xuICByZXR1cm4gbmV3IExTVE1DZWxsKGFyZ3MpO1xufVxuXG4vKipcbiAqIEZ1bGx5LWNvbm5lY3RlZCBSTk4gd2hlcmUgdGhlIG91dHB1dCBpcyB0byBiZSBmZWQgYmFjayB0byBpbnB1dC5cbiAqXG4gKiBUaGlzIGlzIGFuIGBSTk5gIGxheWVyIGNvbnNpc3Rpbmcgb2Ygb25lIGBTaW1wbGVSTk5DZWxsYC4gSG93ZXZlciwgdW5saWtlXG4gKiB0aGUgdW5kZXJseWluZyBgU2ltcGxlUk5OQ2VsbGAsIHRoZSBgYXBwbHlgIG1ldGhvZCBvZiBgU2ltcGxlUk5OYCBvcGVyYXRlc1xuICogb24gYSBzZXF1ZW5jZSBvZiBpbnB1dHMuIFRoZSBzaGFwZSBvZiB0aGUgaW5wdXQgKG5vdCBpbmNsdWRpbmcgdGhlIGZpcnN0LFxuICogYmF0Y2ggZGltZW5zaW9uKSBuZWVkcyB0byBiZSBhdCBsZWFzdCAyLUQsIHdpdGggdGhlIGZpcnN0IGRpbWVuc2lvbiBiZWluZ1xuICogdGltZSBzdGVwcy4gRm9yIGV4YW1wbGU6XG4gKlxuICogYGBganNcbiAqIGNvbnN0IHJubiA9IHRmLmxheWVycy5zaW1wbGVSTk4oe3VuaXRzOiA4LCByZXR1cm5TZXF1ZW5jZXM6IHRydWV9KTtcbiAqXG4gKiAvLyBDcmVhdGUgYW4gaW5wdXQgd2l0aCAxMCB0aW1lIHN0ZXBzLlxuICogY29uc3QgaW5wdXQgPSB0Zi5pbnB1dCh7c2hhcGU6IFsxMCwgMjBdfSk7XG4gKiBjb25zdCBvdXRwdXQgPSBybm4uYXBwbHkoaW5wdXQpO1xuICpcbiAqIGNvbnNvbGUubG9nKEpTT04uc3RyaW5naWZ5KG91dHB1dC5zaGFwZSkpO1xuICogLy8gW251bGwsIDEwLCA4XTogMXN0IGRpbWVuc2lvbiBpcyB1bmtub3duIGJhdGNoIHNpemU7IDJuZCBkaW1lbnNpb24gaXMgdGhlXG4gKiAvLyBzYW1lIGFzIHRoZSBzZXF1ZW5jZSBsZW5ndGggb2YgYGlucHV0YCwgZHVlIHRvIGByZXR1cm5TZXF1ZW5jZXNgOiBgdHJ1ZWA7XG4gKiAvLyAzcmQgZGltZW5zaW9uIGlzIHRoZSBgU2ltcGxlUk5OQ2VsbGAncyBudW1iZXIgb2YgdW5pdHMuXG4gKiBgYGBcbiAqXG4gKiBAZG9jIHtoZWFkaW5nOiAnTGF5ZXJzJywgc3ViaGVhZGluZzogJ1JlY3VycmVudCcsIG5hbWVzcGFjZTogJ2xheWVycyd9XG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBzaW1wbGVSTk4oYXJnczogU2ltcGxlUk5OTGF5ZXJBcmdzKSB7XG4gIHJldHVybiBuZXcgU2ltcGxlUk5OKGFyZ3MpO1xufVxuXG4vKipcbiAqIENlbGwgY2xhc3MgZm9yIGBTaW1wbGVSTk5gLlxuICpcbiAqIGBTaW1wbGVSTk5DZWxsYCBpcyBkaXN0aW5jdCBmcm9tIHRoZSBgUk5OYCBzdWJjbGFzcyBgU2ltcGxlUk5OYCBpbiB0aGF0IGl0c1xuICogYGFwcGx5YCBtZXRob2QgdGFrZXMgdGhlIGlucHV0IGRhdGEgb2Ygb25seSBhIHNpbmdsZSB0aW1lIHN0ZXAgYW5kIHJldHVybnNcbiAqIHRoZSBjZWxsJ3Mgb3V0cHV0IGF0IHRoZSB0aW1lIHN0ZXAsIHdoaWxlIGBTaW1wbGVSTk5gIHRha2VzIHRoZSBpbnB1dCBkYXRhXG4gKiBvdmVyIGEgbnVtYmVyIG9mIHRpbWUgc3RlcHMuIEZvciBleGFtcGxlOlxuICpcbiAqIGBgYGpzXG4gKiBjb25zdCBjZWxsID0gdGYubGF5ZXJzLnNpbXBsZVJOTkNlbGwoe3VuaXRzOiAyfSk7XG4gKiBjb25zdCBpbnB1dCA9IHRmLmlucHV0KHtzaGFwZTogWzEwXX0pO1xuICogY29uc3Qgb3V0cHV0ID0gY2VsbC5hcHBseShpbnB1dCk7XG4gKlxuICogY29uc29sZS5sb2coSlNPTi5zdHJpbmdpZnkob3V0cHV0LnNoYXBlKSk7XG4gKiAvLyBbbnVsbCwgMTBdOiBUaGlzIGlzIHRoZSBjZWxsJ3Mgb3V0cHV0IGF0IGEgc2luZ2xlIHRpbWUgc3RlcC4gVGhlIDFzdFxuICogLy8gZGltZW5zaW9uIGlzIHRoZSB1bmtub3duIGJhdGNoIHNpemUuXG4gKiBgYGBcbiAqXG4gKiBJbnN0YW5jZShzKSBvZiBgU2ltcGxlUk5OQ2VsbGAgY2FuIGJlIHVzZWQgdG8gY29uc3RydWN0IGBSTk5gIGxheWVycy4gVGhlXG4gKiBtb3N0IHR5cGljYWwgdXNlIG9mIHRoaXMgd29ya2Zsb3cgaXMgdG8gY29tYmluZSBhIG51bWJlciBvZiBjZWxscyBpbnRvIGFcbiAqIHN0YWNrZWQgUk5OIGNlbGwgKGkuZS4sIGBTdGFja2VkUk5OQ2VsbGAgaW50ZXJuYWxseSkgYW5kIHVzZSBpdCB0byBjcmVhdGUgYW5cbiAqIFJOTi4gRm9yIGV4YW1wbGU6XG4gKlxuICogYGBganNcbiAqIGNvbnN0IGNlbGxzID0gW1xuICogICB0Zi5sYXllcnMuc2ltcGxlUk5OQ2VsbCh7dW5pdHM6IDR9KSxcbiAqICAgdGYubGF5ZXJzLnNpbXBsZVJOTkNlbGwoe3VuaXRzOiA4fSksXG4gKiBdO1xuICogY29uc3Qgcm5uID0gdGYubGF5ZXJzLnJubih7Y2VsbDogY2VsbHMsIHJldHVyblNlcXVlbmNlczogdHJ1ZX0pO1xuICpcbiAqIC8vIENyZWF0ZSBhbiBpbnB1dCB3aXRoIDEwIHRpbWUgc3RlcHMgYW5kIGEgbGVuZ3RoLTIwIHZlY3RvciBhdCBlYWNoIHN0ZXAuXG4gKiBjb25zdCBpbnB1dCA9IHRmLmlucHV0KHtzaGFwZTogWzEwLCAyMF19KTtcbiAqIGNvbnN0IG91dHB1dCA9IHJubi5hcHBseShpbnB1dCk7XG4gKlxuICogY29uc29sZS5sb2coSlNPTi5zdHJpbmdpZnkob3V0cHV0LnNoYXBlKSk7XG4gKiAvLyBbbnVsbCwgMTAsIDhdOiAxc3QgZGltZW5zaW9uIGlzIHVua25vd24gYmF0Y2ggc2l6ZTsgMm5kIGRpbWVuc2lvbiBpcyB0aGVcbiAqIC8vIHNhbWUgYXMgdGhlIHNlcXVlbmNlIGxlbmd0aCBvZiBgaW5wdXRgLCBkdWUgdG8gYHJldHVyblNlcXVlbmNlc2A6IGB0cnVlYDtcbiAqIC8vIDNyZCBkaW1lbnNpb24gaXMgdGhlIGxhc3QgYFNpbXBsZVJOTkNlbGxgJ3MgbnVtYmVyIG9mIHVuaXRzLlxuICogYGBgXG4gKlxuICogVG8gY3JlYXRlIGFuIGBSTk5gIGNvbnNpc3Rpbmcgb2Ygb25seSAqb25lKiBgU2ltcGxlUk5OQ2VsbGAsIHVzZSB0aGVcbiAqIGB0Zi5sYXllcnMuc2ltcGxlUk5OYC5cbiAqXG4gKiBAZG9jIHtoZWFkaW5nOiAnTGF5ZXJzJywgc3ViaGVhZGluZzogJ1JlY3VycmVudCcsIG5hbWVzcGFjZTogJ2xheWVycyd9XG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBzaW1wbGVSTk5DZWxsKGFyZ3M6IFNpbXBsZVJOTkNlbGxMYXllckFyZ3MpIHtcbiAgcmV0dXJuIG5ldyBTaW1wbGVSTk5DZWxsKGFyZ3MpO1xufVxuXG4vKipcbiAqIENvbnZvbHV0aW9uYWwgTFNUTSBsYXllciAtIFhpbmdqaWFuIFNoaSAyMDE1LlxuICpcbiAqIFRoaXMgaXMgYSBgQ29udlJOTjJEYCBsYXllciBjb25zaXN0aW5nIG9mIG9uZSBgQ29udkxTVE0yRENlbGxgLiBIb3dldmVyLFxuICogdW5saWtlIHRoZSB1bmRlcmx5aW5nIGBDb252TFNUTTJEQ2VsbGAsIHRoZSBgYXBwbHlgIG1ldGhvZCBvZiBgQ29udkxTVE0yRGBcbiAqIG9wZXJhdGVzIG9uIGEgc2VxdWVuY2Ugb2YgaW5wdXRzLiBUaGUgc2hhcGUgb2YgdGhlIGlucHV0IChub3QgaW5jbHVkaW5nIHRoZVxuICogZmlyc3QsIGJhdGNoIGRpbWVuc2lvbikgbmVlZHMgdG8gYmUgNC1ELCB3aXRoIHRoZSBmaXJzdCBkaW1lbnNpb24gYmVpbmcgdGltZVxuICogc3RlcHMuIEZvciBleGFtcGxlOlxuICpcbiAqIGBgYGpzXG4gKiBjb25zdCBmaWx0ZXJzID0gMztcbiAqIGNvbnN0IGtlcm5lbFNpemUgPSAzO1xuICpcbiAqIGNvbnN0IGJhdGNoU2l6ZSA9IDQ7XG4gKiBjb25zdCBzZXF1ZW5jZUxlbmd0aCA9IDI7XG4gKiBjb25zdCBzaXplID0gNTtcbiAqIGNvbnN0IGNoYW5uZWxzID0gMztcbiAqXG4gKiBjb25zdCBpbnB1dFNoYXBlID0gW2JhdGNoU2l6ZSwgc2VxdWVuY2VMZW5ndGgsIHNpemUsIHNpemUsIGNoYW5uZWxzXTtcbiAqIGNvbnN0IGlucHV0ID0gdGYub25lcyhpbnB1dFNoYXBlKTtcbiAqXG4gKiBjb25zdCBsYXllciA9IHRmLmxheWVycy5jb252THN0bTJkKHtmaWx0ZXJzLCBrZXJuZWxTaXplfSk7XG4gKlxuICogY29uc3Qgb3V0cHV0ID0gbGF5ZXIuYXBwbHkoaW5wdXQpO1xuICogYGBgXG4gKi9cbi8qKiBAZG9jIHtoZWFkaW5nOiAnTGF5ZXJzJywgc3ViaGVhZGluZzogJ1JlY3VycmVudCcsIG5hbWVzcGFjZTogJ2xheWVycyd9ICovXG5leHBvcnQgZnVuY3Rpb24gY29udkxzdG0yZChhcmdzOiBDb252TFNUTTJEQXJncykge1xuICByZXR1cm4gbmV3IENvbnZMU1RNMkQoYXJncyk7XG59XG5cbi8qKlxuICogQ2VsbCBjbGFzcyBmb3IgYENvbnZMU1RNMkRgLlxuICpcbiAqIGBDb252TFNUTTJEQ2VsbGAgaXMgZGlzdGluY3QgZnJvbSB0aGUgYENvbnZSTk4yRGAgc3ViY2xhc3MgYENvbnZMU1RNMkRgIGluXG4gKiB0aGF0IGl0cyBgY2FsbGAgbWV0aG9kIHRha2VzIHRoZSBpbnB1dCBkYXRhIG9mIG9ubHkgYSBzaW5nbGUgdGltZSBzdGVwIGFuZFxuICogcmV0dXJucyB0aGUgY2VsbCdzIG91dHB1dCBhdCB0aGUgdGltZSBzdGVwLCB3aGlsZSBgQ29udkxTVE0yRGAgdGFrZXMgdGhlXG4gKiBpbnB1dCBkYXRhIG92ZXIgYSBudW1iZXIgb2YgdGltZSBzdGVwcy4gRm9yIGV4YW1wbGU6XG4gKlxuICogYGBganNcbiAqIGNvbnN0IGZpbHRlcnMgPSAzO1xuICogY29uc3Qga2VybmVsU2l6ZSA9IDM7XG4gKlxuICogY29uc3Qgc2VxdWVuY2VMZW5ndGggPSAxO1xuICogY29uc3Qgc2l6ZSA9IDU7XG4gKiBjb25zdCBjaGFubmVscyA9IDM7XG4gKlxuICogY29uc3QgaW5wdXRTaGFwZSA9IFtzZXF1ZW5jZUxlbmd0aCwgc2l6ZSwgc2l6ZSwgY2hhbm5lbHNdO1xuICogY29uc3QgaW5wdXQgPSB0Zi5vbmVzKGlucHV0U2hhcGUpO1xuICpcbiAqIGNvbnN0IGNlbGwgPSB0Zi5sYXllcnMuY29udkxzdG0yZENlbGwoe2ZpbHRlcnMsIGtlcm5lbFNpemV9KTtcbiAqXG4gKiBjZWxsLmJ1aWxkKGlucHV0LnNoYXBlKTtcbiAqXG4gKiBjb25zdCBvdXRwdXRTaXplID0gc2l6ZSAtIGtlcm5lbFNpemUgKyAxO1xuICogY29uc3Qgb3V0U2hhcGUgPSBbc2VxdWVuY2VMZW5ndGgsIG91dHB1dFNpemUsIG91dHB1dFNpemUsIGZpbHRlcnNdO1xuICpcbiAqIGNvbnN0IGluaXRpYWxIID0gdGYuemVyb3Mob3V0U2hhcGUpO1xuICogY29uc3QgaW5pdGlhbEMgPSB0Zi56ZXJvcyhvdXRTaGFwZSk7XG4gKlxuICogY29uc3QgW28sIGgsIGNdID0gY2VsbC5jYWxsKFtpbnB1dCwgaW5pdGlhbEgsIGluaXRpYWxDXSwge30pO1xuICogYGBgXG4gKi9cbi8qKiBAZG9jIHtoZWFkaW5nOiAnTGF5ZXJzJywgc3ViaGVhZGluZzogJ1JlY3VycmVudCcsIG5hbWVzcGFjZTogJ2xheWVycyd9ICovXG5leHBvcnQgZnVuY3Rpb24gY29udkxzdG0yZENlbGwoYXJnczogQ29udkxTVE0yRENlbGxBcmdzKSB7XG4gIHJldHVybiBuZXcgQ29udkxTVE0yRENlbGwoYXJncyk7XG59XG5cbi8qKlxuICogQmFzZSBjbGFzcyBmb3IgcmVjdXJyZW50IGxheWVycy5cbiAqXG4gKiBJbnB1dCBzaGFwZTpcbiAqICAgM0QgdGVuc29yIHdpdGggc2hhcGUgYFtiYXRjaFNpemUsIHRpbWVTdGVwcywgaW5wdXREaW1dYC5cbiAqXG4gKiBPdXRwdXQgc2hhcGU6XG4gKiAgIC0gaWYgYHJldHVyblN0YXRlYCwgYW4gQXJyYXkgb2YgdGVuc29ycyAoaS5lLiwgYHRmLlRlbnNvcmBzKS4gVGhlIGZpcnN0XG4gKiAgICAgdGVuc29yIGlzIHRoZSBvdXRwdXQuIFRoZSByZW1haW5pbmcgdGVuc29ycyBhcmUgdGhlIHN0YXRlcyBhdCB0aGVcbiAqICAgICBsYXN0IHRpbWUgc3RlcCwgZWFjaCB3aXRoIHNoYXBlIGBbYmF0Y2hTaXplLCB1bml0c11gLlxuICogICAtIGlmIGByZXR1cm5TZXF1ZW5jZXNgLCB0aGUgb3V0cHV0IHdpbGwgaGF2ZSBzaGFwZVxuICogICAgIGBbYmF0Y2hTaXplLCB0aW1lU3RlcHMsIHVuaXRzXWAuXG4gKiAgIC0gZWxzZSwgdGhlIG91dHB1dCB3aWxsIGhhdmUgc2hhcGUgYFtiYXRjaFNpemUsIHVuaXRzXWAuXG4gKlxuICogTWFza2luZzpcbiAqICAgVGhpcyBsYXllciBzdXBwb3J0cyBtYXNraW5nIGZvciBpbnB1dCBkYXRhIHdpdGggYSB2YXJpYWJsZSBudW1iZXJcbiAqICAgb2YgdGltZXN0ZXBzLiBUbyBpbnRyb2R1Y2UgbWFza3MgdG8geW91ciBkYXRhLFxuICogICB1c2UgYW4gZW1iZWRkaW5nIGxheWVyIHdpdGggdGhlIGBtYXNrX3plcm9gIHBhcmFtZXRlclxuICogICBzZXQgdG8gYFRydWVgLlxuICpcbiAqIE5vdGVzIG9uIHVzaW5nIHN0YXRlZnVsbmVzcyBpbiBSTk5zOlxuICogICBZb3UgY2FuIHNldCBSTk4gbGF5ZXJzIHRvIGJlICdzdGF0ZWZ1bCcsIHdoaWNoIG1lYW5zIHRoYXQgdGhlIHN0YXRlc1xuICogICBjb21wdXRlZCBmb3IgdGhlIHNhbXBsZXMgaW4gb25lIGJhdGNoIHdpbGwgYmUgcmV1c2VkIGFzIGluaXRpYWwgc3RhdGVzXG4gKiAgIGZvciB0aGUgc2FtcGxlcyBpbiB0aGUgbmV4dCBiYXRjaC4gVGhpcyBhc3N1bWVzIGEgb25lLXRvLW9uZSBtYXBwaW5nXG4gKiAgIGJldHdlZW4gc2FtcGxlcyBpbiBkaWZmZXJlbnQgc3VjY2Vzc2l2ZSBiYXRjaGVzLlxuICpcbiAqICAgVG8gZW5hYmxlIHN0YXRlZnVsbmVzczpcbiAqICAgICAtIHNwZWNpZnkgYHN0YXRlZnVsOiB0cnVlYCBpbiB0aGUgbGF5ZXIgY29uc3RydWN0b3IuXG4gKiAgICAgLSBzcGVjaWZ5IGEgZml4ZWQgYmF0Y2ggc2l6ZSBmb3IgeW91ciBtb2RlbCwgYnkgcGFzc2luZ1xuICogICAgICAgaWYgc2VxdWVudGlhbCBtb2RlbDpcbiAqICAgICAgICAgYGJhdGNoSW5wdXRTaGFwZT1bLi4uXWAgdG8gdGhlIGZpcnN0IGxheWVyIGluIHlvdXIgbW9kZWwuXG4gKiAgICAgICBlbHNlIGZvciBmdW5jdGlvbmFsIG1vZGVsIHdpdGggMSBvciBtb3JlIElucHV0IGxheWVyczpcbiAqICAgICAgICAgYGJhdGNoU2hhcGU9Wy4uLl1gIHRvIGFsbCB0aGUgZmlyc3QgbGF5ZXJzIGluIHlvdXIgbW9kZWwuXG4gKiAgICAgICBUaGlzIGlzIHRoZSBleHBlY3RlZCBzaGFwZSBvZiB5b3VyIGlucHV0cyAqaW5jbHVkaW5nIHRoZSBiYXRjaCBzaXplKi5cbiAqICAgICAgIEl0IHNob3VsZCBiZSBhIHR1cGxlIG9mIGludGVnZXJzLCBlLmcuIGAoMzIsIDEwLCAxMDApYC5cbiAqICAgICAtIHNwZWNpZnkgYHNodWZmbGU9RmFsc2VgIHdoZW4gY2FsbGluZyBmaXQoKS5cbiAqXG4gKiAgIFRvIHJlc2V0IHRoZSBzdGF0ZXMgb2YgeW91ciBtb2RlbCwgY2FsbCBgLnJlc2V0U3RhdGVzKClgIG9uIGVpdGhlclxuICogICBhIHNwZWNpZmljIGxheWVyLCBvciBvbiB5b3VyIGVudGlyZSBtb2RlbC5cbiAqXG4gKiBOb3RlIG9uIHNwZWNpZnlpbmcgdGhlIGluaXRpYWwgc3RhdGUgb2YgUk5Oc1xuICogICBZb3UgY2FuIHNwZWNpZnkgdGhlIGluaXRpYWwgc3RhdGUgb2YgUk5OIGxheWVycyBzeW1ib2xpY2FsbHkgYnlcbiAqICAgY2FsbGluZyB0aGVtIHdpdGggdGhlIG9wdGlvbiBgaW5pdGlhbFN0YXRlYC4gVGhlIHZhbHVlIG9mXG4gKiAgIGBpbml0aWFsU3RhdGVgIHNob3VsZCBiZSBhIHRlbnNvciBvciBsaXN0IG9mIHRlbnNvcnMgcmVwcmVzZW50aW5nXG4gKiAgIHRoZSBpbml0aWFsIHN0YXRlIG9mIHRoZSBSTk4gbGF5ZXIuXG4gKlxuICogICBZb3UgY2FuIHNwZWNpZnkgdGhlIGluaXRpYWwgc3RhdGUgb2YgUk5OIGxheWVycyBudW1lcmljYWxseSBieVxuICogICBjYWxsaW5nIGByZXNldFN0YXRlc2Agd2l0aCB0aGUga2V5d29yZCBhcmd1bWVudCBgc3RhdGVzYC4gVGhlIHZhbHVlIG9mXG4gKiAgIGBzdGF0ZXNgIHNob3VsZCBiZSBhIG51bXB5IGFycmF5IG9yIGxpc3Qgb2YgbnVtcHkgYXJyYXlzIHJlcHJlc2VudGluZ1xuICogICB0aGUgaW5pdGlhbCBzdGF0ZSBvZiB0aGUgUk5OIGxheWVyLlxuICpcbiAqIE5vdGUgb24gcGFzc2luZyBleHRlcm5hbCBjb25zdGFudHMgdG8gUk5Oc1xuICogICBZb3UgY2FuIHBhc3MgXCJleHRlcm5hbFwiIGNvbnN0YW50cyB0byB0aGUgY2VsbCB1c2luZyB0aGUgYGNvbnN0YW50c2BcbiAqICAga2V5d29yZCBhcmd1bWVudCBvZiBgUk5OLmNhbGxgIG1ldGhvZC4gVGhpcyByZXF1aXJlcyB0aGF0IHRoZSBgY2VsbC5jYWxsYFxuICogICBtZXRob2QgYWNjZXB0cyB0aGUgc2FtZSBrZXl3b3JkIGFyZ3VtZW50IGBjb25zdGFudHNgLiBTdWNoIGNvbnN0YW50c1xuICogICBjYW4gYmUgdXNlZCB0byBjb25kaXRpb24gdGhlIGNlbGwgdHJhbnNmb3JtYXRpb24gb24gYWRkaXRpb25hbCBzdGF0aWNcbiAqICAgaW5wdXRzIChub3QgY2hhbmdpbmcgb3ZlciB0aW1lKSwgYS5rLmEuIGFuIGF0dGVudGlvbiBtZWNoYW5pc20uXG4gKlxuICogQGRvYyB7aGVhZGluZzogJ0xheWVycycsIHN1YmhlYWRpbmc6ICdSZWN1cnJlbnQnLCBuYW1lc3BhY2U6ICdsYXllcnMnfVxuICovXG5leHBvcnQgZnVuY3Rpb24gcm5uKGFyZ3M6IFJOTkxheWVyQXJncykge1xuICByZXR1cm4gbmV3IFJOTihhcmdzKTtcbn1cblxuLyoqXG4gKiBXcmFwcGVyIGFsbG93aW5nIGEgc3RhY2sgb2YgUk5OIGNlbGxzIHRvIGJlaGF2ZSBhcyBhIHNpbmdsZSBjZWxsLlxuICpcbiAqIFVzZWQgdG8gaW1wbGVtZW50IGVmZmljaWVudCBzdGFja2VkIFJOTnMuXG4gKlxuICogQGRvYyB7aGVhZGluZzogJ0xheWVycycsIHN1YmhlYWRpbmc6ICdSZWN1cnJlbnQnLCBuYW1lc3BhY2U6ICdsYXllcnMnfVxuICovXG5leHBvcnQgZnVuY3Rpb24gc3RhY2tlZFJOTkNlbGxzKGFyZ3M6IFN0YWNrZWRSTk5DZWxsc0FyZ3Mpe1xuICByZXR1cm4gbmV3IFN0YWNrZWRSTk5DZWxscyhhcmdzKTtcbn1cblxuLy8gV3JhcHBlciBMYXllcnMuXG5cbi8qKiBAZG9jIHtoZWFkaW5nOiAnTGF5ZXJzJywgc3ViaGVhZGluZzogJ1dyYXBwZXInLCBuYW1lc3BhY2U6ICdsYXllcnMnfSAqL1xuZXhwb3J0IGZ1bmN0aW9uIGJpZGlyZWN0aW9uYWwoYXJnczogQmlkaXJlY3Rpb25hbExheWVyQXJncykge1xuICByZXR1cm4gbmV3IEJpZGlyZWN0aW9uYWwoYXJncyk7XG59XG5cbi8qKlxuICogVGhpcyB3cmFwcGVyIGFwcGxpZXMgYSBsYXllciB0byBldmVyeSB0ZW1wb3JhbCBzbGljZSBvZiBhbiBpbnB1dC5cbiAqXG4gKiBUaGUgaW5wdXQgc2hvdWxkIGJlIGF0IGxlYXN0IDNELCAgYW5kIHRoZSBkaW1lbnNpb24gb2YgdGhlIGluZGV4IGAxYCB3aWxsIGJlXG4gKiBjb25zaWRlcmVkIHRvIGJlIHRoZSB0ZW1wb3JhbCBkaW1lbnNpb24uXG4gKlxuICogQ29uc2lkZXIgYSBiYXRjaCBvZiAzMiBzYW1wbGVzLCB3aGVyZSBlYWNoIHNhbXBsZSBpcyBhIHNlcXVlbmNlIG9mIDEwIHZlY3RvcnNcbiAqIG9mIDE2IGRpbWVuc2lvbnMuIFRoZSBiYXRjaCBpbnB1dCBzaGFwZSBvZiB0aGUgbGF5ZXIgaXMgdGhlbiBgWzMyLCAgMTAsXG4gKiAxNl1gLCBhbmQgdGhlIGBpbnB1dFNoYXBlYCwgbm90IGluY2x1ZGluZyB0aGUgc2FtcGxlIGRpbWVuc2lvbiwgaXNcbiAqIGBbMTAsIDE2XWAuXG4gKlxuICogWW91IGNhbiB0aGVuIHVzZSBgVGltZURpc3RyaWJ1dGVkYCB0byBhcHBseSBhIGBEZW5zZWAgbGF5ZXIgdG8gZWFjaCBvZiB0aGUgMTBcbiAqIHRpbWVzdGVwcywgaW5kZXBlbmRlbnRseTpcbiAqXG4gKiBgYGBqc1xuICogY29uc3QgbW9kZWwgPSB0Zi5zZXF1ZW50aWFsKCk7XG4gKiBtb2RlbC5hZGQodGYubGF5ZXJzLnRpbWVEaXN0cmlidXRlZCh7XG4gKiAgIGxheWVyOiB0Zi5sYXllcnMuZGVuc2Uoe3VuaXRzOiA4fSksXG4gKiAgIGlucHV0U2hhcGU6IFsxMCwgMTZdLFxuICogfSkpO1xuICpcbiAqIC8vIE5vdyBtb2RlbC5vdXRwdXRTaGFwZSA9IFtudWxsLCAxMCwgOF0uXG4gKiAvLyBUaGUgb3V0cHV0IHdpbGwgdGhlbiBoYXZlIHNoYXBlIGBbMzIsIDEwLCA4XWAuXG4gKlxuICogLy8gSW4gc3Vic2VxdWVudCBsYXllcnMsIHRoZXJlIGlzIG5vIG5lZWQgZm9yIGBpbnB1dFNoYXBlYDpcbiAqIG1vZGVsLmFkZCh0Zi5sYXllcnMudGltZURpc3RyaWJ1dGVkKHtsYXllcjogdGYubGF5ZXJzLmRlbnNlKHt1bml0czogMzJ9KX0pKTtcbiAqIGNvbnNvbGUubG9nKEpTT04uc3RyaW5naWZ5KG1vZGVsLm91dHB1dHNbMF0uc2hhcGUpKTtcbiAqIC8vIE5vdyBtb2RlbC5vdXRwdXRTaGFwZSA9IFtudWxsLCAxMCwgMzJdLlxuICogYGBgXG4gKlxuICogVGhlIG91dHB1dCB3aWxsIHRoZW4gaGF2ZSBzaGFwZSBgWzMyLCAxMCwgMzJdYC5cbiAqXG4gKiBgVGltZURpc3RyaWJ1dGVkYCBjYW4gYmUgdXNlZCB3aXRoIGFyYml0cmFyeSBsYXllcnMsIG5vdCBqdXN0IGBEZW5zZWAsIGZvclxuICogaW5zdGFuY2UgYSBgQ29udjJEYCBsYXllci5cbiAqXG4gKiBgYGBqc1xuICogY29uc3QgbW9kZWwgPSB0Zi5zZXF1ZW50aWFsKCk7XG4gKiBtb2RlbC5hZGQodGYubGF5ZXJzLnRpbWVEaXN0cmlidXRlZCh7XG4gKiAgIGxheWVyOiB0Zi5sYXllcnMuY29udjJkKHtmaWx0ZXJzOiA2NCwga2VybmVsU2l6ZTogWzMsIDNdfSksXG4gKiAgIGlucHV0U2hhcGU6IFsxMCwgMjk5LCAyOTksIDNdLFxuICogfSkpO1xuICogY29uc29sZS5sb2coSlNPTi5zdHJpbmdpZnkobW9kZWwub3V0cHV0c1swXS5zaGFwZSkpO1xuICogYGBgXG4gKlxuICogQGRvYyB7aGVhZGluZzogJ0xheWVycycsIHN1YmhlYWRpbmc6ICdXcmFwcGVyJywgbmFtZXNwYWNlOiAnbGF5ZXJzJ31cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHRpbWVEaXN0cmlidXRlZChhcmdzOiBXcmFwcGVyTGF5ZXJBcmdzKSB7XG4gIHJldHVybiBuZXcgVGltZURpc3RyaWJ1dGVkKGFyZ3MpO1xufVxuXG4vLyBBbGlhc2VzIGZvciBwb29saW5nLlxuZXhwb3J0IGNvbnN0IGdsb2JhbE1heFBvb2wxZCA9IGdsb2JhbE1heFBvb2xpbmcxZDtcbmV4cG9ydCBjb25zdCBnbG9iYWxNYXhQb29sMmQgPSBnbG9iYWxNYXhQb29saW5nMmQ7XG5leHBvcnQgY29uc3QgbWF4UG9vbDFkID0gbWF4UG9vbGluZzFkO1xuZXhwb3J0IGNvbnN0IG1heFBvb2wyZCA9IG1heFBvb2xpbmcyZDtcblxuZXhwb3J0IHtMYXllciwgUk5OLCBSTk5DZWxsLCBpbnB1dCAvKiBhbGlhcyBmb3IgdGYuaW5wdXQgKi99O1xuXG4vKipcbiAqIEFwcGx5IGFkZGl0aXZlIHplcm8tY2VudGVyZWQgR2F1c3NpYW4gbm9pc2UuXG4gKlxuICogQXMgaXQgaXMgYSByZWd1bGFyaXphdGlvbiBsYXllciwgaXQgaXMgb25seSBhY3RpdmUgYXQgdHJhaW5pbmcgdGltZS5cbiAqXG4gKiBUaGlzIGlzIHVzZWZ1bCB0byBtaXRpZ2F0ZSBvdmVyZml0dGluZ1xuICogKHlvdSBjb3VsZCBzZWUgaXQgYXMgYSBmb3JtIG9mIHJhbmRvbSBkYXRhIGF1Z21lbnRhdGlvbikuXG4gKiBHYXVzc2lhbiBOb2lzZSAoR1MpIGlzIGEgbmF0dXJhbCBjaG9pY2UgYXMgY29ycnVwdGlvbiBwcm9jZXNzXG4gKiBmb3IgcmVhbCB2YWx1ZWQgaW5wdXRzLlxuICpcbiAqICMgQXJndW1lbnRzXG4gKiBzdGRkZXY6IGZsb2F0LCBzdGFuZGFyZCBkZXZpYXRpb24gb2YgdGhlIG5vaXNlIGRpc3RyaWJ1dGlvbi5cbiAqXG4gKiAjIElucHV0IHNoYXBlXG4gKiBBcmJpdHJhcnkuIFVzZSB0aGUga2V5d29yZCBhcmd1bWVudCBgaW5wdXRfc2hhcGVgXG4gKiAodHVwbGUgb2YgaW50ZWdlcnMsIGRvZXMgbm90IGluY2x1ZGUgdGhlIHNhbXBsZXMgYXhpcylcbiAqIHdoZW4gdXNpbmcgdGhpcyBsYXllciBhcyB0aGUgZmlyc3QgbGF5ZXIgaW4gYSBtb2RlbC5cbiAqXG4gKiAjIE91dHB1dCBzaGFwZVxuICogU2FtZSBzaGFwZSBhcyBpbnB1dC5cbiAqXG4gKiBAZG9jIHtoZWFkaW5nOiAnTGF5ZXJzJywgc3ViaGVhZGluZzogJ05vaXNlJywgbmFtZXNwYWNlOiAnbGF5ZXJzJ31cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGdhdXNzaWFuTm9pc2UoYXJnczogR2F1c3NpYW5Ob2lzZUFyZ3MpIHtcbiAgcmV0dXJuIG5ldyBHYXVzc2lhbk5vaXNlKGFyZ3MpO1xufVxuXG4vKipcbiAqIEFwcGx5IG11bHRpcGxpY2F0aXZlIDEtY2VudGVyZWQgR2F1c3NpYW4gbm9pc2UuXG4gKlxuICogQXMgaXQgaXMgYSByZWd1bGFyaXphdGlvbiBsYXllciwgaXQgaXMgb25seSBhY3RpdmUgYXQgdHJhaW5pbmcgdGltZS5cbiAqXG4gKiBBcmd1bWVudHM6XG4gKiAgIC0gYHJhdGVgOiBmbG9hdCwgZHJvcCBwcm9iYWJpbGl0eSAoYXMgd2l0aCBgRHJvcG91dGApLlxuICogICAgIFRoZSBtdWx0aXBsaWNhdGl2ZSBub2lzZSB3aWxsIGhhdmVcbiAqICAgICBzdGFuZGFyZCBkZXZpYXRpb24gYHNxcnQocmF0ZSAvICgxIC0gcmF0ZSkpYC5cbiAqXG4gKiBJbnB1dCBzaGFwZTpcbiAqICAgQXJiaXRyYXJ5LiBVc2UgdGhlIGtleXdvcmQgYXJndW1lbnQgYGlucHV0U2hhcGVgXG4gKiAgICh0dXBsZSBvZiBpbnRlZ2VycywgZG9lcyBub3QgaW5jbHVkZSB0aGUgc2FtcGxlcyBheGlzKVxuICogICB3aGVuIHVzaW5nIHRoaXMgbGF5ZXIgYXMgdGhlIGZpcnN0IGxheWVyIGluIGEgbW9kZWwuXG4gKlxuICogT3V0cHV0IHNoYXBlOlxuICogICBTYW1lIHNoYXBlIGFzIGlucHV0LlxuICpcbiAqIFJlZmVyZW5jZXM6XG4gKiAgIC0gW0Ryb3BvdXQ6IEEgU2ltcGxlIFdheSB0byBQcmV2ZW50IE5ldXJhbCBOZXR3b3JrcyBmcm9tIE92ZXJmaXR0aW5nXShcbiAqICAgICAgaHR0cDovL3d3dy5jcy50b3JvbnRvLmVkdS9+cnNhbGFraHUvcGFwZXJzL3NyaXZhc3RhdmExNGEucGRmKVxuICpcbiAqIEBkb2Mge2hlYWRpbmc6ICdMYXllcnMnLCBzdWJoZWFkaW5nOiAnTm9pc2UnLCBuYW1lc3BhY2U6ICdsYXllcnMnfVxuICovXG5leHBvcnQgZnVuY3Rpb24gZ2F1c3NpYW5Ecm9wb3V0KGFyZ3M6IEdhdXNzaWFuRHJvcG91dEFyZ3MpIHtcbiAgcmV0dXJuIG5ldyBHYXVzc2lhbkRyb3BvdXQoYXJncyk7XG59XG5cbi8qKlxuICogQXBwbGllcyBBbHBoYSBEcm9wb3V0IHRvIHRoZSBpbnB1dC5cbiAqXG4gKiBBcyBpdCBpcyBhIHJlZ3VsYXJpemF0aW9uIGxheWVyLCBpdCBpcyBvbmx5IGFjdGl2ZSBhdCB0cmFpbmluZyB0aW1lLlxuICpcbiAqIEFscGhhIERyb3BvdXQgaXMgYSBgRHJvcG91dGAgdGhhdCBrZWVwcyBtZWFuIGFuZCB2YXJpYW5jZSBvZiBpbnB1dHNcbiAqIHRvIHRoZWlyIG9yaWdpbmFsIHZhbHVlcywgaW4gb3JkZXIgdG8gZW5zdXJlIHRoZSBzZWxmLW5vcm1hbGl6aW5nIHByb3BlcnR5XG4gKiBldmVuIGFmdGVyIHRoaXMgZHJvcG91dC5cbiAqIEFscGhhIERyb3BvdXQgZml0cyB3ZWxsIHRvIFNjYWxlZCBFeHBvbmVudGlhbCBMaW5lYXIgVW5pdHNcbiAqIGJ5IHJhbmRvbWx5IHNldHRpbmcgYWN0aXZhdGlvbnMgdG8gdGhlIG5lZ2F0aXZlIHNhdHVyYXRpb24gdmFsdWUuXG4gKlxuICogQXJndW1lbnRzOlxuICogICAtIGByYXRlYDogZmxvYXQsIGRyb3AgcHJvYmFiaWxpdHkgKGFzIHdpdGggYERyb3BvdXRgKS5cbiAqICAgICBUaGUgbXVsdGlwbGljYXRpdmUgbm9pc2Ugd2lsbCBoYXZlXG4gKiAgICAgc3RhbmRhcmQgZGV2aWF0aW9uIGBzcXJ0KHJhdGUgLyAoMSAtIHJhdGUpKWAuXG4gKiAgIC0gYG5vaXNlX3NoYXBlYDogQSAxLUQgYFRlbnNvcmAgb2YgdHlwZSBgaW50MzJgLCByZXByZXNlbnRpbmcgdGhlXG4gKiAgICAgc2hhcGUgZm9yIHJhbmRvbWx5IGdlbmVyYXRlZCBrZWVwL2Ryb3AgZmxhZ3MuXG4gKlxuICogSW5wdXQgc2hhcGU6XG4gKiAgIEFyYml0cmFyeS4gVXNlIHRoZSBrZXl3b3JkIGFyZ3VtZW50IGBpbnB1dFNoYXBlYFxuICogICAodHVwbGUgb2YgaW50ZWdlcnMsIGRvZXMgbm90IGluY2x1ZGUgdGhlIHNhbXBsZXMgYXhpcylcbiAqICAgd2hlbiB1c2luZyB0aGlzIGxheWVyIGFzIHRoZSBmaXJzdCBsYXllciBpbiBhIG1vZGVsLlxuICpcbiAqIE91dHB1dCBzaGFwZTpcbiAqICAgU2FtZSBzaGFwZSBhcyBpbnB1dC5cbiAqXG4gKiBSZWZlcmVuY2VzOlxuICogICAtIFtTZWxmLU5vcm1hbGl6aW5nIE5ldXJhbCBOZXR3b3Jrc10oaHR0cHM6Ly9hcnhpdi5vcmcvYWJzLzE3MDYuMDI1MTUpXG4gKlxuICogQGRvYyB7aGVhZGluZzogJ0xheWVycycsIHN1YmhlYWRpbmc6ICdOb2lzZScsIG5hbWVzcGFjZTogJ2xheWVycyd9XG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBhbHBoYURyb3BvdXQoYXJnczogQWxwaGFEcm9wb3V0QXJncykge1xuICByZXR1cm4gbmV3IEFscGhhRHJvcG91dChhcmdzKTtcbn1cblxuLyoqXG4gKiBNYXNrcyBhIHNlcXVlbmNlIGJ5IHVzaW5nIGEgbWFzayB2YWx1ZSB0byBza2lwIHRpbWVzdGVwcy5cbiAqXG4gKiBJZiBhbGwgZmVhdHVyZXMgZm9yIGEgZ2l2ZW4gc2FtcGxlIHRpbWVzdGVwIGFyZSBlcXVhbCB0byBgbWFza192YWx1ZWAsXG4gKiB0aGVuIHRoZSBzYW1wbGUgdGltZXN0ZXAgd2lsbCBiZSBtYXNrZWQgKHNraXBwZWQpIGluIGFsbCBkb3duc3RyZWFtIGxheWVyc1xuICogKGFzIGxvbmcgYXMgdGhleSBzdXBwb3J0IG1hc2tpbmcpLlxuICpcbiAqIElmIGFueSBkb3duc3RyZWFtIGxheWVyIGRvZXMgbm90IHN1cHBvcnQgbWFza2luZyB5ZXQgcmVjZWl2ZXMgc3VjaFxuICogYW4gaW5wdXQgbWFzaywgYW4gZXhjZXB0aW9uIHdpbGwgYmUgcmFpc2VkLlxuICpcbiAqIEFyZ3VtZW50czpcbiAqICAgLSBgbWFza1ZhbHVlYDogRWl0aGVyIE5vbmUgb3IgbWFzayB2YWx1ZSB0byBza2lwLlxuICpcbiAqIElucHV0IHNoYXBlOlxuICogICBBcmJpdHJhcnkuIFVzZSB0aGUga2V5d29yZCBhcmd1bWVudCBgaW5wdXRTaGFwZWBcbiAqICAgKHR1cGxlIG9mIGludGVnZXJzLCBkb2VzIG5vdCBpbmNsdWRlIHRoZSBzYW1wbGVzIGF4aXMpXG4gKiAgIHdoZW4gdXNpbmcgdGhpcyBsYXllciBhcyB0aGUgZmlyc3QgbGF5ZXIgaW4gYSBtb2RlbC5cbiAqXG4gKiBPdXRwdXQgc2hhcGU6XG4gKiAgIFNhbWUgc2hhcGUgYXMgaW5wdXQuXG4gKlxuICogQGRvYyB7aGVhZGluZzogJ0xheWVycycsIHN1YmhlYWRpbmc6ICdNYXNrJywgbmFtZXNwYWNlOiAnbGF5ZXJzJ31cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIG1hc2tpbmcoYXJncz86IE1hc2tpbmdBcmdzKSB7XG4gIHJldHVybiBuZXcgTWFza2luZyhhcmdzKTtcbn1cblxuLyoqXG4gKiBBIHByZXByb2Nlc3NpbmcgbGF5ZXIgd2hpY2ggcmVzY2FsZXMgaW5wdXQgdmFsdWVzIHRvIGEgbmV3IHJhbmdlLlxuICpcbiAqIFRoaXMgbGF5ZXIgcmVzY2FsZXMgZXZlcnkgdmFsdWUgb2YgYW4gaW5wdXQgKG9mdGVuIGFuIGltYWdlKSBieSBtdWx0aXBseWluZ1xuICogYnkgYHNjYWxlYCBhbmQgYWRkaW5nIGBvZmZzZXRgLlxuICpcbiAqIEZvciBpbnN0YW5jZTpcbiAqIDEuIFRvIHJlc2NhbGUgYW4gaW5wdXQgaW4gdGhlIGBgWzAsIDI1NV1gYCByYW5nZVxuICogdG8gYmUgaW4gdGhlIGBbMCwgMV1gIHJhbmdlLCB5b3Ugd291bGQgcGFzcyBgc2NhbGU9MS8yNTVgLlxuICogMi4gVG8gcmVzY2FsZSBhbiBpbnB1dCBpbiB0aGUgYGBbMCwgMjU1XWBgIHJhbmdlIHRvIGJlIGluIHRoZSBgWy0xLCAxXWBcbiAqIHJhbmdlLCB5b3Ugd291bGQgcGFzcyBgc2NhbGU9MS4vMTI3LjUsIG9mZnNldD0tMWAuXG4gKiBUaGUgcmVzY2FsaW5nIGlzIGFwcGxpZWQgYm90aCBkdXJpbmcgdHJhaW5pbmcgYW5kIGluZmVyZW5jZS4gSW5wdXRzIGNhbiBiZVxuICogb2YgaW50ZWdlciBvciBmbG9hdGluZyBwb2ludCBkdHlwZSwgYW5kIGJ5IGRlZmF1bHQgdGhlIGxheWVyIHdpbGwgb3V0cHV0XG4gKiBmbG9hdHMuXG4gKlxuICogQXJndW1lbnRzOlxuICogICAtIGBzY2FsZWA6IEZsb2F0LCB0aGUgc2NhbGUgdG8gYXBwbHkgdG8gdGhlIGlucHV0cy5cbiAqICAgLSBgb2Zmc2V0YDogRmxvYXQsIHRoZSBvZmZzZXQgdG8gYXBwbHkgdG8gdGhlIGlucHV0cy5cbiAqXG4gKiBJbnB1dCBzaGFwZTpcbiAqICAgQXJiaXRyYXJ5LlxuICpcbiAqIE91dHB1dCBzaGFwZTpcbiAqICAgU2FtZSBhcyBpbnB1dC5cbiAqXG4gKiBAZG9jIHtoZWFkaW5nOiAnTGF5ZXJzJywgc3ViaGVhZGluZzogJ1Jlc2NhbGluZycsIG5hbWVzcGFjZTogJ2xheWVycyd9XG4gKi9cbmV4cG9ydCBmdW5jdGlvbiByZXNjYWxpbmcoYXJncz86IFJlc2NhbGluZ0FyZ3MpIHtcbiAgcmV0dXJuIG5ldyBSZXNjYWxpbmcoYXJncyk7XG59XG4iXX0=","import * as losses from './losses';\nimport * as metrics from './metrics';\n/**\n * Binary accuracy metric function.\n *\n * `yTrue` and `yPred` can have 0-1 values. Example:\n * ```js\n * const x = tf.tensor2d([[1, 1, 1, 1], [0, 0, 0, 0]], [2, 4]);\n * const y = tf.tensor2d([[1, 0, 1, 0], [0, 0, 0, 1]], [2, 4]);\n * const accuracy = tf.metrics.binaryAccuracy(x, y);\n * accuracy.print();\n * ```\n *\n * `yTrue` and `yPred` can also have floating-number values between 0 and 1, in\n * which case the values will be thresholded at 0.5 to yield 0-1 values (i.e.,\n * a value >= 0.5 and <= 1.0 is interpreted as 1).\n *\n * Example:\n * ```js\n * const x = tf.tensor1d([1, 1, 1, 1, 0, 0, 0, 0]);\n * const y = tf.tensor1d([0.2, 0.4, 0.6, 0.8, 0.2, 0.3, 0.4, 0.7]);\n * const accuracy = tf.metrics.binaryAccuracy(x, y);\n * accuracy.print();\n * ```\n *\n * @param yTrue Binary Tensor of truth.\n * @param yPred Binary Tensor of prediction.\n * @return Accuracy Tensor.\n *\n * @doc {heading: 'Metrics', namespace: 'metrics'}\n */\nexport function binaryAccuracy(yTrue, yPred) {\n return metrics.binaryAccuracy(yTrue, yPred);\n}\n/**\n * Binary crossentropy metric function.\n *\n * Example:\n * ```js\n * const x = tf.tensor2d([[0], [1], [1], [1]]);\n * const y = tf.tensor2d([[0], [0], [0.5], [1]]);\n * const crossentropy = tf.metrics.binaryCrossentropy(x, y);\n * crossentropy.print();\n * ```\n *\n * @param yTrue Binary Tensor of truth.\n * @param yPred Binary Tensor of prediction, probabilities for the `1` case.\n * @return Accuracy Tensor.\n *\n * @doc {heading: 'Metrics', namespace: 'metrics'}\n */\nexport function binaryCrossentropy(yTrue, yPred) {\n return metrics.binaryCrossentropy(yTrue, yPred);\n}\n/**\n * Sparse categorical accuracy metric function.\n *\n * Example:\n * ```js\n *\n * const yTrue = tf.tensor1d([1, 1, 2, 2, 0]);\n * const yPred = tf.tensor2d(\n * [[0, 1, 0], [1, 0, 0], [0, 0.4, 0.6], [0, 0.6, 0.4], [0.7, 0.3, 0]]);\n * const crossentropy = tf.metrics.sparseCategoricalAccuracy(yTrue, yPred);\n * crossentropy.print();\n * ```\n *\n * @param yTrue True labels: indices.\n * @param yPred Predicted probabilities or logits.\n * @returns Accuracy tensor.\n *\n * @doc {heading: 'Metrics', namespace: 'metrics'}\n */\nexport function sparseCategoricalAccuracy(yTrue, yPred) {\n return metrics.sparseCategoricalAccuracy(yTrue, yPred);\n}\n/**\n * Categorical accuracy metric function.\n *\n * Example:\n * ```js\n * const x = tf.tensor2d([[0, 0, 0, 1], [0, 0, 0, 1]]);\n * const y = tf.tensor2d([[0.1, 0.8, 0.05, 0.05], [0.1, 0.05, 0.05, 0.8]]);\n * const accuracy = tf.metrics.categoricalAccuracy(x, y);\n * accuracy.print();\n * ```\n *\n * @param yTrue Binary Tensor of truth: one-hot encoding of categories.\n * @param yPred Binary Tensor of prediction: probabilities or logits for the\n * same categories as in `yTrue`.\n * @return Accuracy Tensor.\n *\n * @doc {heading: 'Metrics', namespace: 'metrics'}\n */\nexport function categoricalAccuracy(yTrue, yPred) {\n return metrics.categoricalAccuracy(yTrue, yPred);\n}\n/**\n * Categorical crossentropy between an output tensor and a target tensor.\n *\n * @param target A tensor of the same shape as `output`.\n * @param output A tensor resulting from a softmax (unless `fromLogits` is\n * `true`, in which case `output` is expected to be the logits).\n * @param fromLogits Boolean, whether `output` is the result of a softmax, or is\n * a tensor of logits.\n *\n * @doc {heading: 'Metrics', namespace: 'metrics'}\n */\nexport function categoricalCrossentropy(yTrue, yPred) {\n return metrics.categoricalCrossentropy(yTrue, yPred);\n}\n/**\n * Computes the precision of the predictions with respect to the labels.\n *\n * Example:\n * ```js\n * const x = tf.tensor2d(\n * [\n * [0, 0, 0, 1],\n * [0, 1, 0, 0],\n * [0, 0, 0, 1],\n * [1, 0, 0, 0],\n * [0, 0, 1, 0]\n * ]\n * );\n *\n * const y = tf.tensor2d(\n * [\n * [0, 0, 1, 0],\n * [0, 1, 0, 0],\n * [0, 0, 0, 1],\n * [0, 1, 0, 0],\n * [0, 1, 0, 0]\n * ]\n * );\n *\n * const precision = tf.metrics.precision(x, y);\n * precision.print();\n * ```\n *\n * @param yTrue The ground truth values. Expected to contain only 0-1 values.\n * @param yPred The predicted values. Expected to contain only 0-1 values.\n * @return Precision Tensor.\n *\n * @doc {heading: 'Metrics', namespace: 'metrics'}\n */\nexport function precision(yTrue, yPred) {\n return metrics.precision(yTrue, yPred);\n}\n/**\n * Computes the recall of the predictions with respect to the labels.\n *\n * Example:\n * ```js\n * const x = tf.tensor2d(\n * [\n * [0, 0, 0, 1],\n * [0, 1, 0, 0],\n * [0, 0, 0, 1],\n * [1, 0, 0, 0],\n * [0, 0, 1, 0]\n * ]\n * );\n *\n * const y = tf.tensor2d(\n * [\n * [0, 0, 1, 0],\n * [0, 1, 0, 0],\n * [0, 0, 0, 1],\n * [0, 1, 0, 0],\n * [0, 1, 0, 0]\n * ]\n * );\n *\n * const recall = tf.metrics.recall(x, y);\n * recall.print();\n * ```\n *\n * @param yTrue The ground truth values. Expected to contain only 0-1 values.\n * @param yPred The predicted values. Expected to contain only 0-1 values.\n * @return Recall Tensor.\n *\n * @doc {heading: 'Metrics', namespace: 'metrics'}\n */\nexport function recall(yTrue, yPred) {\n return metrics.recall(yTrue, yPred);\n}\n/**\n * Loss or metric function: Cosine proximity.\n *\n * Mathematically, cosine proximity is defined as:\n * `-sum(l2Normalize(yTrue) * l2Normalize(yPred))`,\n * wherein `l2Normalize()` normalizes the L2 norm of the input to 1 and `*`\n * represents element-wise multiplication.\n *\n * ```js\n * const yTrue = tf.tensor2d([[1, 0], [1, 0]]);\n * const yPred = tf.tensor2d([[1 / Math.sqrt(2), 1 / Math.sqrt(2)], [0, 1]]);\n * const proximity = tf.metrics.cosineProximity(yTrue, yPred);\n * proximity.print();\n * ```\n *\n * @param yTrue Truth Tensor.\n * @param yPred Prediction Tensor.\n * @return Cosine proximity Tensor.\n *\n * @doc {heading: 'Metrics', namespace: 'metrics'}\n */\nexport function cosineProximity(yTrue, yPred) {\n return losses.cosineProximity(yTrue, yPred);\n}\n/**\n * Loss or metric function: Mean absolute error.\n *\n * Mathematically, mean absolute error is defined as:\n * `mean(abs(yPred - yTrue))`,\n * wherein the `mean` is applied over feature dimensions.\n *\n * ```js\n * const yTrue = tf.tensor2d([[0, 1], [0, 0], [2, 3]]);\n * const yPred = tf.tensor2d([[0, 1], [0, 1], [-2, -3]]);\n * const mse = tf.metrics.meanAbsoluteError(yTrue, yPred);\n * mse.print();\n * ```\n *\n * @param yTrue Truth Tensor.\n * @param yPred Prediction Tensor.\n * @return Mean absolute error Tensor.\n *\n * @doc {heading: 'Metrics', namespace: 'metrics'}\n */\nexport function meanAbsoluteError(yTrue, yPred) {\n return losses.meanAbsoluteError(yTrue, yPred);\n}\n/**\n * Loss or metric function: Mean absolute percentage error.\n *\n * ```js\n * const yTrue = tf.tensor2d([[0, 1], [10, 20]]);\n * const yPred = tf.tensor2d([[0, 1], [11, 24]]);\n * const mse = tf.metrics.meanAbsolutePercentageError(yTrue, yPred);\n * mse.print();\n * ```\n *\n * Aliases: `tf.metrics.MAPE`, `tf.metrics.mape`.\n *\n * @param yTrue Truth Tensor.\n * @param yPred Prediction Tensor.\n * @return Mean absolute percentage error Tensor.\n *\n * @doc {heading: 'Metrics', namespace: 'metrics'}\n */\nexport function meanAbsolutePercentageError(yTrue, yPred) {\n return losses.meanAbsolutePercentageError(yTrue, yPred);\n}\nexport function MAPE(yTrue, yPred) {\n return losses.meanAbsolutePercentageError(yTrue, yPred);\n}\nexport function mape(yTrue, yPred) {\n return losses.meanAbsolutePercentageError(yTrue, yPred);\n}\n/**\n * Loss or metric function: Mean squared error.\n *\n * ```js\n * const yTrue = tf.tensor2d([[0, 1], [3, 4]]);\n * const yPred = tf.tensor2d([[0, 1], [-3, -4]]);\n * const mse = tf.metrics.meanSquaredError(yTrue, yPred);\n * mse.print();\n * ```\n *\n * Aliases: `tf.metrics.MSE`, `tf.metrics.mse`.\n *\n * @param yTrue Truth Tensor.\n * @param yPred Prediction Tensor.\n * @return Mean squared error Tensor.\n *\n * @doc {heading: 'Metrics', namespace: 'metrics'}\n */\nexport function meanSquaredError(yTrue, yPred) {\n return losses.meanSquaredError(yTrue, yPred);\n}\nexport function MSE(yTrue, yPred) {\n return losses.meanSquaredError(yTrue, yPred);\n}\nexport function mse(yTrue, yPred) {\n return losses.meanSquaredError(yTrue, yPred);\n}\n//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZXhwb3J0c19tZXRyaWNzLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vdGZqcy1sYXllcnMvc3JjL2V4cG9ydHNfbWV0cmljcy50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFXQSxPQUFPLEtBQUssTUFBTSxNQUFNLFVBQVUsQ0FBQztBQUNuQyxPQUFPLEtBQUssT0FBTyxNQUFNLFdBQVcsQ0FBQztBQUVyQzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7OztHQTRCRztBQUNILE1BQU0sVUFBVSxjQUFjLENBQUMsS0FBYSxFQUFFLEtBQWE7SUFDekQsT0FBTyxPQUFPLENBQUMsY0FBYyxDQUFDLEtBQUssRUFBRSxLQUFLLENBQUMsQ0FBQztBQUM5QyxDQUFDO0FBRUQ7Ozs7Ozs7Ozs7Ozs7Ozs7R0FnQkc7QUFDSCxNQUFNLFVBQVUsa0JBQWtCLENBQUMsS0FBYSxFQUFFLEtBQWE7SUFDN0QsT0FBTyxPQUFPLENBQUMsa0JBQWtCLENBQUMsS0FBSyxFQUFFLEtBQUssQ0FBQyxDQUFDO0FBQ2xELENBQUM7QUFFRDs7Ozs7Ozs7Ozs7Ozs7Ozs7O0dBa0JHO0FBQ0gsTUFBTSxVQUFVLHlCQUF5QixDQUNyQyxLQUFhLEVBQUUsS0FBYTtJQUM5QixPQUFPLE9BQU8sQ0FBQyx5QkFBeUIsQ0FBQyxLQUFLLEVBQUUsS0FBSyxDQUFDLENBQUM7QUFDekQsQ0FBQztBQUVEOzs7Ozs7Ozs7Ozs7Ozs7OztHQWlCRztBQUNILE1BQU0sVUFBVSxtQkFBbUIsQ0FBQyxLQUFhLEVBQUUsS0FBYTtJQUM5RCxPQUFPLE9BQU8sQ0FBQyxtQkFBbUIsQ0FBQyxLQUFLLEVBQUUsS0FBSyxDQUFDLENBQUM7QUFDbkQsQ0FBQztBQUVEOzs7Ozs7Ozs7O0dBVUc7QUFDSCxNQUFNLFVBQVUsdUJBQXVCLENBQUMsS0FBYSxFQUFFLEtBQWE7SUFDbEUsT0FBTyxPQUFPLENBQUMsdUJBQXVCLENBQUMsS0FBSyxFQUFFLEtBQUssQ0FBQyxDQUFDO0FBQ3ZELENBQUM7QUFFRDs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7OztHQWtDRztBQUNILE1BQU0sVUFBVSxTQUFTLENBQUMsS0FBYSxFQUFFLEtBQWE7SUFDcEQsT0FBTyxPQUFPLENBQUMsU0FBUyxDQUFDLEtBQUssRUFBRSxLQUFLLENBQUMsQ0FBQztBQUN6QyxDQUFDO0FBRUQ7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7R0FrQ0c7QUFDSCxNQUFNLFVBQVUsTUFBTSxDQUFDLEtBQWEsRUFBRSxLQUFhO0lBQ2pELE9BQU8sT0FBTyxDQUFDLE1BQU0sQ0FBQyxLQUFLLEVBQUUsS0FBSyxDQUFDLENBQUM7QUFDdEMsQ0FBQztBQUVEOzs7Ozs7Ozs7Ozs7Ozs7Ozs7OztHQW9CRztBQUNILE1BQU0sVUFBVSxlQUFlLENBQUMsS0FBYSxFQUFFLEtBQWE7SUFDMUQsT0FBTyxNQUFNLENBQUMsZUFBZSxDQUFDLEtBQUssRUFBRSxLQUFLLENBQUMsQ0FBQztBQUM5QyxDQUFDO0FBRUQ7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7R0FtQkc7QUFDSCxNQUFNLFVBQVUsaUJBQWlCLENBQUMsS0FBYSxFQUFFLEtBQWE7SUFDNUQsT0FBTyxNQUFNLENBQUMsaUJBQWlCLENBQUMsS0FBSyxFQUFFLEtBQUssQ0FBQyxDQUFDO0FBQ2hELENBQUM7QUFFRDs7Ozs7Ozs7Ozs7Ozs7Ozs7R0FpQkc7QUFDSCxNQUFNLFVBQVUsMkJBQTJCLENBQ3ZDLEtBQWEsRUFBRSxLQUFhO0lBQzlCLE9BQU8sTUFBTSxDQUFDLDJCQUEyQixDQUFDLEtBQUssRUFBRSxLQUFLLENBQUMsQ0FBQztBQUMxRCxDQUFDO0FBRUQsTUFBTSxVQUFVLElBQUksQ0FBQyxLQUFhLEVBQUUsS0FBYTtJQUMvQyxPQUFPLE1BQU0sQ0FBQywyQkFBMkIsQ0FBQyxLQUFLLEVBQUUsS0FBSyxDQUFDLENBQUM7QUFDMUQsQ0FBQztBQUVELE1BQU0sVUFBVSxJQUFJLENBQUMsS0FBYSxFQUFFLEtBQWE7SUFDL0MsT0FBTyxNQUFNLENBQUMsMkJBQTJCLENBQUMsS0FBSyxFQUFFLEtBQUssQ0FBQyxDQUFDO0FBQzFELENBQUM7QUFFRDs7Ozs7Ozs7Ozs7Ozs7Ozs7R0FpQkc7QUFDSCxNQUFNLFVBQVUsZ0JBQWdCLENBQUMsS0FBYSxFQUFFLEtBQWE7SUFDM0QsT0FBTyxNQUFNLENBQUMsZ0JBQWdCLENBQUMsS0FBSyxFQUFFLEtBQUssQ0FBQyxDQUFDO0FBQy9DLENBQUM7QUFFRCxNQUFNLFVBQVUsR0FBRyxDQUFDLEtBQWEsRUFBRSxLQUFhO0lBQzlDLE9BQU8sTUFBTSxDQUFDLGdCQUFnQixDQUFDLEtBQUssRUFBRSxLQUFLLENBQUMsQ0FBQztBQUMvQyxDQUFDO0FBRUQsTUFBTSxVQUFVLEdBQUcsQ0FBQyxLQUFhLEVBQUUsS0FBYTtJQUM5QyxPQUFPLE1BQU0sQ0FBQyxnQkFBZ0IsQ0FBQyxLQUFLLEVBQUUsS0FBSyxDQUFDLENBQUM7QUFDL0MsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbIi8qKlxuICogQGxpY2Vuc2VcbiAqIENvcHlyaWdodCAyMDE4IEdvb2dsZSBMTENcbiAqXG4gKiBVc2Ugb2YgdGhpcyBzb3VyY2UgY29kZSBpcyBnb3Zlcm5lZCBieSBhbiBNSVQtc3R5bGVcbiAqIGxpY2Vuc2UgdGhhdCBjYW4gYmUgZm91bmQgaW4gdGhlIExJQ0VOU0UgZmlsZSBvciBhdFxuICogaHR0cHM6Ly9vcGVuc291cmNlLm9yZy9saWNlbnNlcy9NSVQuXG4gKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuICovXG5pbXBvcnQge1RlbnNvcn0gZnJvbSAnQHRlbnNvcmZsb3cvdGZqcy1jb3JlJztcblxuaW1wb3J0ICogYXMgbG9zc2VzIGZyb20gJy4vbG9zc2VzJztcbmltcG9ydCAqIGFzIG1ldHJpY3MgZnJvbSAnLi9tZXRyaWNzJztcblxuLyoqXG4gKiBCaW5hcnkgYWNjdXJhY3kgbWV0cmljIGZ1bmN0aW9uLlxuICpcbiAqIGB5VHJ1ZWAgYW5kIGB5UHJlZGAgY2FuIGhhdmUgMC0xIHZhbHVlcy4gRXhhbXBsZTpcbiAqIGBgYGpzXG4gKiBjb25zdCB4ID0gdGYudGVuc29yMmQoW1sxLCAxLCAxLCAxXSwgWzAsIDAsIDAsIDBdXSwgWzIsIDRdKTtcbiAqIGNvbnN0IHkgPSB0Zi50ZW5zb3IyZChbWzEsIDAsIDEsIDBdLCBbMCwgMCwgMCwgMV1dLCBbMiwgNF0pO1xuICogY29uc3QgYWNjdXJhY3kgPSB0Zi5tZXRyaWNzLmJpbmFyeUFjY3VyYWN5KHgsIHkpO1xuICogYWNjdXJhY3kucHJpbnQoKTtcbiAqIGBgYFxuICpcbiAqIGB5VHJ1ZWAgYW5kIGB5UHJlZGAgY2FuIGFsc28gaGF2ZSBmbG9hdGluZy1udW1iZXIgdmFsdWVzIGJldHdlZW4gMCBhbmQgMSwgaW5cbiAqIHdoaWNoIGNhc2UgdGhlIHZhbHVlcyB3aWxsIGJlIHRocmVzaG9sZGVkIGF0IDAuNSB0byB5aWVsZCAwLTEgdmFsdWVzIChpLmUuLFxuICogYSB2YWx1ZSA+PSAwLjUgYW5kIDw9IDEuMCBpcyBpbnRlcnByZXRlZCBhcyAxKS5cbiAqXG4gKiBFeGFtcGxlOlxuICogYGBganNcbiAqIGNvbnN0IHggPSB0Zi50ZW5zb3IxZChbMSwgMSwgMSwgMSwgMCwgMCwgMCwgMF0pO1xuICogY29uc3QgeSA9IHRmLnRlbnNvcjFkKFswLjIsIDAuNCwgMC42LCAwLjgsIDAuMiwgMC4zLCAwLjQsIDAuN10pO1xuICogY29uc3QgYWNjdXJhY3kgPSB0Zi5tZXRyaWNzLmJpbmFyeUFjY3VyYWN5KHgsIHkpO1xuICogYWNjdXJhY3kucHJpbnQoKTtcbiAqIGBgYFxuICpcbiAqIEBwYXJhbSB5VHJ1ZSBCaW5hcnkgVGVuc29yIG9mIHRydXRoLlxuICogQHBhcmFtIHlQcmVkIEJpbmFyeSBUZW5zb3Igb2YgcHJlZGljdGlvbi5cbiAqIEByZXR1cm4gQWNjdXJhY3kgVGVuc29yLlxuICpcbiAqIEBkb2Mge2hlYWRpbmc6ICdNZXRyaWNzJywgbmFtZXNwYWNlOiAnbWV0cmljcyd9XG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBiaW5hcnlBY2N1cmFjeSh5VHJ1ZTogVGVuc29yLCB5UHJlZDogVGVuc29yKTogVGVuc29yIHtcbiAgcmV0dXJuIG1ldHJpY3MuYmluYXJ5QWNjdXJhY3koeVRydWUsIHlQcmVkKTtcbn1cblxuLyoqXG4gKiBCaW5hcnkgY3Jvc3NlbnRyb3B5IG1ldHJpYyBmdW5jdGlvbi5cbiAqXG4gKiBFeGFtcGxlOlxuICogYGBganNcbiAqIGNvbnN0IHggPSB0Zi50ZW5zb3IyZChbWzBdLCBbMV0sIFsxXSwgWzFdXSk7XG4gKiBjb25zdCB5ID0gdGYudGVuc29yMmQoW1swXSwgWzBdLCBbMC41XSwgWzFdXSk7XG4gKiBjb25zdCBjcm9zc2VudHJvcHkgPSB0Zi5tZXRyaWNzLmJpbmFyeUNyb3NzZW50cm9weSh4LCB5KTtcbiAqIGNyb3NzZW50cm9weS5wcmludCgpO1xuICogYGBgXG4gKlxuICogQHBhcmFtIHlUcnVlIEJpbmFyeSBUZW5zb3Igb2YgdHJ1dGguXG4gKiBAcGFyYW0geVByZWQgQmluYXJ5IFRlbnNvciBvZiBwcmVkaWN0aW9uLCBwcm9iYWJpbGl0aWVzIGZvciB0aGUgYDFgIGNhc2UuXG4gKiBAcmV0dXJuIEFjY3VyYWN5IFRlbnNvci5cbiAqXG4gKiBAZG9jIHtoZWFkaW5nOiAnTWV0cmljcycsIG5hbWVzcGFjZTogJ21ldHJpY3MnfVxuICovXG5leHBvcnQgZnVuY3Rpb24gYmluYXJ5Q3Jvc3NlbnRyb3B5KHlUcnVlOiBUZW5zb3IsIHlQcmVkOiBUZW5zb3IpOiBUZW5zb3Ige1xuICByZXR1cm4gbWV0cmljcy5iaW5hcnlDcm9zc2VudHJvcHkoeVRydWUsIHlQcmVkKTtcbn1cblxuLyoqXG4gKiBTcGFyc2UgY2F0ZWdvcmljYWwgYWNjdXJhY3kgbWV0cmljIGZ1bmN0aW9uLlxuICpcbiAqIEV4YW1wbGU6XG4gKiBgYGBqc1xuICpcbiAqIGNvbnN0IHlUcnVlID0gdGYudGVuc29yMWQoWzEsIDEsIDIsIDIsIDBdKTtcbiAqIGNvbnN0IHlQcmVkID0gdGYudGVuc29yMmQoXG4gKiAgICAgIFtbMCwgMSwgMF0sIFsxLCAwLCAwXSwgWzAsIDAuNCwgMC42XSwgWzAsIDAuNiwgMC40XSwgWzAuNywgMC4zLCAwXV0pO1xuICogY29uc3QgY3Jvc3NlbnRyb3B5ID0gdGYubWV0cmljcy5zcGFyc2VDYXRlZ29yaWNhbEFjY3VyYWN5KHlUcnVlLCB5UHJlZCk7XG4gKiBjcm9zc2VudHJvcHkucHJpbnQoKTtcbiAqIGBgYFxuICpcbiAqIEBwYXJhbSB5VHJ1ZSBUcnVlIGxhYmVsczogaW5kaWNlcy5cbiAqIEBwYXJhbSB5UHJlZCBQcmVkaWN0ZWQgcHJvYmFiaWxpdGllcyBvciBsb2dpdHMuXG4gKiBAcmV0dXJucyBBY2N1cmFjeSB0ZW5zb3IuXG4gKlxuICogQGRvYyB7aGVhZGluZzogJ01ldHJpY3MnLCBuYW1lc3BhY2U6ICdtZXRyaWNzJ31cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHNwYXJzZUNhdGVnb3JpY2FsQWNjdXJhY3koXG4gICAgeVRydWU6IFRlbnNvciwgeVByZWQ6IFRlbnNvcik6IFRlbnNvciB7XG4gIHJldHVybiBtZXRyaWNzLnNwYXJzZUNhdGVnb3JpY2FsQWNjdXJhY3koeVRydWUsIHlQcmVkKTtcbn1cblxuLyoqXG4gKiBDYXRlZ29yaWNhbCBhY2N1cmFjeSBtZXRyaWMgZnVuY3Rpb24uXG4gKlxuICogRXhhbXBsZTpcbiAqIGBgYGpzXG4gKiBjb25zdCB4ID0gdGYudGVuc29yMmQoW1swLCAwLCAwLCAxXSwgWzAsIDAsIDAsIDFdXSk7XG4gKiBjb25zdCB5ID0gdGYudGVuc29yMmQoW1swLjEsIDAuOCwgMC4wNSwgMC4wNV0sIFswLjEsIDAuMDUsIDAuMDUsIDAuOF1dKTtcbiAqIGNvbnN0IGFjY3VyYWN5ID0gdGYubWV0cmljcy5jYXRlZ29yaWNhbEFjY3VyYWN5KHgsIHkpO1xuICogYWNjdXJhY3kucHJpbnQoKTtcbiAqIGBgYFxuICpcbiAqIEBwYXJhbSB5VHJ1ZSBCaW5hcnkgVGVuc29yIG9mIHRydXRoOiBvbmUtaG90IGVuY29kaW5nIG9mIGNhdGVnb3JpZXMuXG4gKiBAcGFyYW0geVByZWQgQmluYXJ5IFRlbnNvciBvZiBwcmVkaWN0aW9uOiBwcm9iYWJpbGl0aWVzIG9yIGxvZ2l0cyBmb3IgdGhlXG4gKiAgIHNhbWUgY2F0ZWdvcmllcyBhcyBpbiBgeVRydWVgLlxuICogQHJldHVybiBBY2N1cmFjeSBUZW5zb3IuXG4gKlxuICogQGRvYyB7aGVhZGluZzogJ01ldHJpY3MnLCBuYW1lc3BhY2U6ICdtZXRyaWNzJ31cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGNhdGVnb3JpY2FsQWNjdXJhY3koeVRydWU6IFRlbnNvciwgeVByZWQ6IFRlbnNvcik6IFRlbnNvciB7XG4gIHJldHVybiBtZXRyaWNzLmNhdGVnb3JpY2FsQWNjdXJhY3koeVRydWUsIHlQcmVkKTtcbn1cblxuLyoqXG4gKiBDYXRlZ29yaWNhbCBjcm9zc2VudHJvcHkgYmV0d2VlbiBhbiBvdXRwdXQgdGVuc29yIGFuZCBhIHRhcmdldCB0ZW5zb3IuXG4gKlxuICogQHBhcmFtIHRhcmdldCBBIHRlbnNvciBvZiB0aGUgc2FtZSBzaGFwZSBhcyBgb3V0cHV0YC5cbiAqIEBwYXJhbSBvdXRwdXQgQSB0ZW5zb3IgcmVzdWx0aW5nIGZyb20gYSBzb2Z0bWF4ICh1bmxlc3MgYGZyb21Mb2dpdHNgIGlzXG4gKiAgYHRydWVgLCBpbiB3aGljaCBjYXNlIGBvdXRwdXRgIGlzIGV4cGVjdGVkIHRvIGJlIHRoZSBsb2dpdHMpLlxuICogQHBhcmFtIGZyb21Mb2dpdHMgQm9vbGVhbiwgd2hldGhlciBgb3V0cHV0YCBpcyB0aGUgcmVzdWx0IG9mIGEgc29mdG1heCwgb3IgaXNcbiAqICAgYSB0ZW5zb3Igb2YgbG9naXRzLlxuICpcbiAqIEBkb2Mge2hlYWRpbmc6ICdNZXRyaWNzJywgbmFtZXNwYWNlOiAnbWV0cmljcyd9XG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBjYXRlZ29yaWNhbENyb3NzZW50cm9weSh5VHJ1ZTogVGVuc29yLCB5UHJlZDogVGVuc29yKTogVGVuc29yIHtcbiAgcmV0dXJuIG1ldHJpY3MuY2F0ZWdvcmljYWxDcm9zc2VudHJvcHkoeVRydWUsIHlQcmVkKTtcbn1cblxuLyoqXG4gKiBDb21wdXRlcyB0aGUgcHJlY2lzaW9uIG9mIHRoZSBwcmVkaWN0aW9ucyB3aXRoIHJlc3BlY3QgdG8gdGhlIGxhYmVscy5cbiAqXG4gKiBFeGFtcGxlOlxuICogYGBganNcbiAqIGNvbnN0IHggPSB0Zi50ZW5zb3IyZChcbiAqICAgIFtcbiAqICAgICAgWzAsIDAsIDAsIDFdLFxuICogICAgICBbMCwgMSwgMCwgMF0sXG4gKiAgICAgIFswLCAwLCAwLCAxXSxcbiAqICAgICAgWzEsIDAsIDAsIDBdLFxuICogICAgICBbMCwgMCwgMSwgMF1cbiAqICAgIF1cbiAqICk7XG4gKlxuICogY29uc3QgeSA9IHRmLnRlbnNvcjJkKFxuICogICAgW1xuICogICAgICBbMCwgMCwgMSwgMF0sXG4gKiAgICAgIFswLCAxLCAwLCAwXSxcbiAqICAgICAgWzAsIDAsIDAsIDFdLFxuICogICAgICBbMCwgMSwgMCwgMF0sXG4gKiAgICAgIFswLCAxLCAwLCAwXVxuICogICAgXVxuICogKTtcbiAqXG4gKiBjb25zdCBwcmVjaXNpb24gPSB0Zi5tZXRyaWNzLnByZWNpc2lvbih4LCB5KTtcbiAqIHByZWNpc2lvbi5wcmludCgpO1xuICogYGBgXG4gKlxuICogQHBhcmFtIHlUcnVlIFRoZSBncm91bmQgdHJ1dGggdmFsdWVzLiBFeHBlY3RlZCB0byBjb250YWluIG9ubHkgMC0xIHZhbHVlcy5cbiAqIEBwYXJhbSB5UHJlZCBUaGUgcHJlZGljdGVkIHZhbHVlcy4gRXhwZWN0ZWQgdG8gY29udGFpbiBvbmx5IDAtMSB2YWx1ZXMuXG4gKiBAcmV0dXJuIFByZWNpc2lvbiBUZW5zb3IuXG4gKlxuICogQGRvYyB7aGVhZGluZzogJ01ldHJpY3MnLCBuYW1lc3BhY2U6ICdtZXRyaWNzJ31cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHByZWNpc2lvbih5VHJ1ZTogVGVuc29yLCB5UHJlZDogVGVuc29yKTogVGVuc29yIHtcbiAgcmV0dXJuIG1ldHJpY3MucHJlY2lzaW9uKHlUcnVlLCB5UHJlZCk7XG59XG5cbi8qKlxuICogQ29tcHV0ZXMgdGhlIHJlY2FsbCBvZiB0aGUgcHJlZGljdGlvbnMgd2l0aCByZXNwZWN0IHRvIHRoZSBsYWJlbHMuXG4gKlxuICogRXhhbXBsZTpcbiAqIGBgYGpzXG4gKiBjb25zdCB4ID0gdGYudGVuc29yMmQoXG4gKiAgICBbXG4gKiAgICAgIFswLCAwLCAwLCAxXSxcbiAqICAgICAgWzAsIDEsIDAsIDBdLFxuICogICAgICBbMCwgMCwgMCwgMV0sXG4gKiAgICAgIFsxLCAwLCAwLCAwXSxcbiAqICAgICAgWzAsIDAsIDEsIDBdXG4gKiAgICBdXG4gKiApO1xuICpcbiAqIGNvbnN0IHkgPSB0Zi50ZW5zb3IyZChcbiAqICAgIFtcbiAqICAgICAgWzAsIDAsIDEsIDBdLFxuICogICAgICBbMCwgMSwgMCwgMF0sXG4gKiAgICAgIFswLCAwLCAwLCAxXSxcbiAqICAgICAgWzAsIDEsIDAsIDBdLFxuICogICAgICBbMCwgMSwgMCwgMF1cbiAqICAgIF1cbiAqICk7XG4gKlxuICogY29uc3QgcmVjYWxsID0gdGYubWV0cmljcy5yZWNhbGwoeCwgeSk7XG4gKiByZWNhbGwucHJpbnQoKTtcbiAqIGBgYFxuICpcbiAqIEBwYXJhbSB5VHJ1ZSBUaGUgZ3JvdW5kIHRydXRoIHZhbHVlcy4gRXhwZWN0ZWQgdG8gY29udGFpbiBvbmx5IDAtMSB2YWx1ZXMuXG4gKiBAcGFyYW0geVByZWQgVGhlIHByZWRpY3RlZCB2YWx1ZXMuIEV4cGVjdGVkIHRvIGNvbnRhaW4gb25seSAwLTEgdmFsdWVzLlxuICogQHJldHVybiBSZWNhbGwgVGVuc29yLlxuICpcbiAqIEBkb2Mge2hlYWRpbmc6ICdNZXRyaWNzJywgbmFtZXNwYWNlOiAnbWV0cmljcyd9XG4gKi9cbmV4cG9ydCBmdW5jdGlvbiByZWNhbGwoeVRydWU6IFRlbnNvciwgeVByZWQ6IFRlbnNvcik6IFRlbnNvciB7XG4gIHJldHVybiBtZXRyaWNzLnJlY2FsbCh5VHJ1ZSwgeVByZWQpO1xufVxuXG4vKipcbiAqIExvc3Mgb3IgbWV0cmljIGZ1bmN0aW9uOiBDb3NpbmUgcHJveGltaXR5LlxuICpcbiAqIE1hdGhlbWF0aWNhbGx5LCBjb3NpbmUgcHJveGltaXR5IGlzIGRlZmluZWQgYXM6XG4gKiAgIGAtc3VtKGwyTm9ybWFsaXplKHlUcnVlKSAqIGwyTm9ybWFsaXplKHlQcmVkKSlgLFxuICogd2hlcmVpbiBgbDJOb3JtYWxpemUoKWAgbm9ybWFsaXplcyB0aGUgTDIgbm9ybSBvZiB0aGUgaW5wdXQgdG8gMSBhbmQgYCpgXG4gKiByZXByZXNlbnRzIGVsZW1lbnQtd2lzZSBtdWx0aXBsaWNhdGlvbi5cbiAqXG4gKiBgYGBqc1xuICogY29uc3QgeVRydWUgPSB0Zi50ZW5zb3IyZChbWzEsIDBdLCBbMSwgMF1dKTtcbiAqIGNvbnN0IHlQcmVkID0gdGYudGVuc29yMmQoW1sxIC8gTWF0aC5zcXJ0KDIpLCAxIC8gTWF0aC5zcXJ0KDIpXSwgWzAsIDFdXSk7XG4gKiBjb25zdCBwcm94aW1pdHkgPSB0Zi5tZXRyaWNzLmNvc2luZVByb3hpbWl0eSh5VHJ1ZSwgeVByZWQpO1xuICogcHJveGltaXR5LnByaW50KCk7XG4gKiBgYGBcbiAqXG4gKiBAcGFyYW0geVRydWUgVHJ1dGggVGVuc29yLlxuICogQHBhcmFtIHlQcmVkIFByZWRpY3Rpb24gVGVuc29yLlxuICogQHJldHVybiBDb3NpbmUgcHJveGltaXR5IFRlbnNvci5cbiAqXG4gKiBAZG9jIHtoZWFkaW5nOiAnTWV0cmljcycsIG5hbWVzcGFjZTogJ21ldHJpY3MnfVxuICovXG5leHBvcnQgZnVuY3Rpb24gY29zaW5lUHJveGltaXR5KHlUcnVlOiBUZW5zb3IsIHlQcmVkOiBUZW5zb3IpOiBUZW5zb3Ige1xuICByZXR1cm4gbG9zc2VzLmNvc2luZVByb3hpbWl0eSh5VHJ1ZSwgeVByZWQpO1xufVxuXG4vKipcbiAqIExvc3Mgb3IgbWV0cmljIGZ1bmN0aW9uOiBNZWFuIGFic29sdXRlIGVycm9yLlxuICpcbiAqIE1hdGhlbWF0aWNhbGx5LCBtZWFuIGFic29sdXRlIGVycm9yIGlzIGRlZmluZWQgYXM6XG4gKiAgIGBtZWFuKGFicyh5UHJlZCAtIHlUcnVlKSlgLFxuICogd2hlcmVpbiB0aGUgYG1lYW5gIGlzIGFwcGxpZWQgb3ZlciBmZWF0dXJlIGRpbWVuc2lvbnMuXG4gKlxuICogYGBganNcbiAqIGNvbnN0IHlUcnVlID0gdGYudGVuc29yMmQoW1swLCAxXSwgWzAsIDBdLCBbMiwgM11dKTtcbiAqIGNvbnN0IHlQcmVkID0gdGYudGVuc29yMmQoW1swLCAxXSwgWzAsIDFdLCBbLTIsIC0zXV0pO1xuICogY29uc3QgbXNlID0gdGYubWV0cmljcy5tZWFuQWJzb2x1dGVFcnJvcih5VHJ1ZSwgeVByZWQpO1xuICogbXNlLnByaW50KCk7XG4gKiBgYGBcbiAqXG4gKiBAcGFyYW0geVRydWUgVHJ1dGggVGVuc29yLlxuICogQHBhcmFtIHlQcmVkIFByZWRpY3Rpb24gVGVuc29yLlxuICogQHJldHVybiBNZWFuIGFic29sdXRlIGVycm9yIFRlbnNvci5cbiAqXG4gKiBAZG9jIHtoZWFkaW5nOiAnTWV0cmljcycsIG5hbWVzcGFjZTogJ21ldHJpY3MnfVxuICovXG5leHBvcnQgZnVuY3Rpb24gbWVhbkFic29sdXRlRXJyb3IoeVRydWU6IFRlbnNvciwgeVByZWQ6IFRlbnNvcik6IFRlbnNvciB7XG4gIHJldHVybiBsb3NzZXMubWVhbkFic29sdXRlRXJyb3IoeVRydWUsIHlQcmVkKTtcbn1cblxuLyoqXG4gKiBMb3NzIG9yIG1ldHJpYyBmdW5jdGlvbjogTWVhbiBhYnNvbHV0ZSBwZXJjZW50YWdlIGVycm9yLlxuICpcbiAqIGBgYGpzXG4gKiBjb25zdCB5VHJ1ZSA9IHRmLnRlbnNvcjJkKFtbMCwgMV0sIFsxMCwgMjBdXSk7XG4gKiBjb25zdCB5UHJlZCA9IHRmLnRlbnNvcjJkKFtbMCwgMV0sIFsxMSwgMjRdXSk7XG4gKiBjb25zdCBtc2UgPSB0Zi5tZXRyaWNzLm1lYW5BYnNvbHV0ZVBlcmNlbnRhZ2VFcnJvcih5VHJ1ZSwgeVByZWQpO1xuICogbXNlLnByaW50KCk7XG4gKiBgYGBcbiAqXG4gKiBBbGlhc2VzOiBgdGYubWV0cmljcy5NQVBFYCwgYHRmLm1ldHJpY3MubWFwZWAuXG4gKlxuICogQHBhcmFtIHlUcnVlIFRydXRoIFRlbnNvci5cbiAqIEBwYXJhbSB5UHJlZCBQcmVkaWN0aW9uIFRlbnNvci5cbiAqIEByZXR1cm4gTWVhbiBhYnNvbHV0ZSBwZXJjZW50YWdlIGVycm9yIFRlbnNvci5cbiAqXG4gKiBAZG9jIHtoZWFkaW5nOiAnTWV0cmljcycsIG5hbWVzcGFjZTogJ21ldHJpY3MnfVxuICovXG5leHBvcnQgZnVuY3Rpb24gbWVhbkFic29sdXRlUGVyY2VudGFnZUVycm9yKFxuICAgIHlUcnVlOiBUZW5zb3IsIHlQcmVkOiBUZW5zb3IpOiBUZW5zb3Ige1xuICByZXR1cm4gbG9zc2VzLm1lYW5BYnNvbHV0ZVBlcmNlbnRhZ2VFcnJvcih5VHJ1ZSwgeVByZWQpO1xufVxuXG5leHBvcnQgZnVuY3Rpb24gTUFQRSh5VHJ1ZTogVGVuc29yLCB5UHJlZDogVGVuc29yKTogVGVuc29yIHtcbiAgcmV0dXJuIGxvc3Nlcy5tZWFuQWJzb2x1dGVQZXJjZW50YWdlRXJyb3IoeVRydWUsIHlQcmVkKTtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIG1hcGUoeVRydWU6IFRlbnNvciwgeVByZWQ6IFRlbnNvcik6IFRlbnNvciB7XG4gIHJldHVybiBsb3NzZXMubWVhbkFic29sdXRlUGVyY2VudGFnZUVycm9yKHlUcnVlLCB5UHJlZCk7XG59XG5cbi8qKlxuICogTG9zcyBvciBtZXRyaWMgZnVuY3Rpb246IE1lYW4gc3F1YXJlZCBlcnJvci5cbiAqXG4gKiBgYGBqc1xuICogY29uc3QgeVRydWUgPSB0Zi50ZW5zb3IyZChbWzAsIDFdLCBbMywgNF1dKTtcbiAqIGNvbnN0IHlQcmVkID0gdGYudGVuc29yMmQoW1swLCAxXSwgWy0zLCAtNF1dKTtcbiAqIGNvbnN0IG1zZSA9IHRmLm1ldHJpY3MubWVhblNxdWFyZWRFcnJvcih5VHJ1ZSwgeVByZWQpO1xuICogbXNlLnByaW50KCk7XG4gKiBgYGBcbiAqXG4gKiBBbGlhc2VzOiBgdGYubWV0cmljcy5NU0VgLCBgdGYubWV0cmljcy5tc2VgLlxuICpcbiAqIEBwYXJhbSB5VHJ1ZSBUcnV0aCBUZW5zb3IuXG4gKiBAcGFyYW0geVByZWQgUHJlZGljdGlvbiBUZW5zb3IuXG4gKiBAcmV0dXJuIE1lYW4gc3F1YXJlZCBlcnJvciBUZW5zb3IuXG4gKlxuICogQGRvYyB7aGVhZGluZzogJ01ldHJpY3MnLCBuYW1lc3BhY2U6ICdtZXRyaWNzJ31cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIG1lYW5TcXVhcmVkRXJyb3IoeVRydWU6IFRlbnNvciwgeVByZWQ6IFRlbnNvcik6IFRlbnNvciB7XG4gIHJldHVybiBsb3NzZXMubWVhblNxdWFyZWRFcnJvcih5VHJ1ZSwgeVByZWQpO1xufVxuXG5leHBvcnQgZnVuY3Rpb24gTVNFKHlUcnVlOiBUZW5zb3IsIHlQcmVkOiBUZW5zb3IpOiBUZW5zb3Ige1xuICByZXR1cm4gbG9zc2VzLm1lYW5TcXVhcmVkRXJyb3IoeVRydWUsIHlQcmVkKTtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIG1zZSh5VHJ1ZTogVGVuc29yLCB5UHJlZDogVGVuc29yKTogVGVuc29yIHtcbiAgcmV0dXJuIGxvc3Nlcy5tZWFuU3F1YXJlZEVycm9yKHlUcnVlLCB5UHJlZCk7XG59XG4iXX0=","/**\n * @license\n * Copyright 2018 Google LLC\n *\n * Use of this source code is governed by an MIT-style\n * license that can be found in the LICENSE file or at\n * https://opensource.org/licenses/MIT.\n * =============================================================================\n */\nimport * as regularizers from './regularizers';\n// tslint:disable-next-line:max-line-length\nimport { L1L2 } from './regularizers';\n/**\n * Regularizer for L1 and L2 regularization.\n *\n * Adds a term to the loss to penalize large weights:\n * loss += sum(l1 * abs(x)) + sum(l2 * x^2)\n *\n * @doc {heading: 'Regularizers', namespace: 'regularizers'}\n */\nexport function l1l2(config) {\n return new L1L2(config);\n}\n/**\n * Regularizer for L1 regularization.\n *\n * Adds a term to the loss to penalize large weights:\n * loss += sum(l1 * abs(x))\n * @param args l1 config.\n *\n * @doc {heading: 'Regularizers', namespace: 'regularizers'}\n */\nexport function l1(config) {\n return regularizers.l1(config);\n}\n/**\n * Regularizer for L2 regularization.\n *\n * Adds a term to the loss to penalize large weights:\n * loss += sum(l2 * x^2)\n * @param args l2 config.\n *\n * @doc {heading: 'Regularizers', namespace: 'regularizers'}\n */\nexport function l2(config) {\n return regularizers.l2(config);\n}\n//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZXhwb3J0c19yZWd1bGFyaXplcnMuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi90ZmpzLWxheWVycy9zcmMvZXhwb3J0c19yZWd1bGFyaXplcnMudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUE7Ozs7Ozs7O0dBUUc7QUFDSCxPQUFPLEtBQUssWUFBWSxNQUFNLGdCQUFnQixDQUFDO0FBQy9DLDJDQUEyQztBQUMzQyxPQUFPLEVBQVMsSUFBSSxFQUFnQyxNQUFNLGdCQUFnQixDQUFDO0FBRTNFOzs7Ozs7O0dBT0c7QUFDSCxNQUFNLFVBQVUsSUFBSSxDQUFDLE1BQWlCO0lBQ3BDLE9BQU8sSUFBSSxJQUFJLENBQUMsTUFBTSxDQUFDLENBQUM7QUFDMUIsQ0FBQztBQUVEOzs7Ozs7OztHQVFHO0FBQ0gsTUFBTSxVQUFVLEVBQUUsQ0FBQyxNQUFlO0lBQ2hDLE9BQU8sWUFBWSxDQUFDLEVBQUUsQ0FBQyxNQUFNLENBQUMsQ0FBQztBQUNqQyxDQUFDO0FBRUQ7Ozs7Ozs7O0dBUUc7QUFDSCxNQUFNLFVBQVUsRUFBRSxDQUFDLE1BQWU7SUFDaEMsT0FBTyxZQUFZLENBQUMsRUFBRSxDQUFDLE1BQU0sQ0FBQyxDQUFDO0FBQ2pDLENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyIvKipcbiAqIEBsaWNlbnNlXG4gKiBDb3B5cmlnaHQgMjAxOCBHb29nbGUgTExDXG4gKlxuICogVXNlIG9mIHRoaXMgc291cmNlIGNvZGUgaXMgZ292ZXJuZWQgYnkgYW4gTUlULXN0eWxlXG4gKiBsaWNlbnNlIHRoYXQgY2FuIGJlIGZvdW5kIGluIHRoZSBMSUNFTlNFIGZpbGUgb3IgYXRcbiAqIGh0dHBzOi8vb3BlbnNvdXJjZS5vcmcvbGljZW5zZXMvTUlULlxuICogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbiAqL1xuaW1wb3J0ICogYXMgcmVndWxhcml6ZXJzIGZyb20gJy4vcmVndWxhcml6ZXJzJztcbi8vIHRzbGludDpkaXNhYmxlLW5leHQtbGluZTptYXgtbGluZS1sZW5ndGhcbmltcG9ydCB7TDFBcmdzLCBMMUwyLCBMMUwyQXJncywgTDJBcmdzLCBSZWd1bGFyaXplcn0gZnJvbSAnLi9yZWd1bGFyaXplcnMnO1xuXG4vKipcbiAqIFJlZ3VsYXJpemVyIGZvciBMMSBhbmQgTDIgcmVndWxhcml6YXRpb24uXG4gKlxuICogQWRkcyBhIHRlcm0gdG8gdGhlIGxvc3MgdG8gcGVuYWxpemUgbGFyZ2Ugd2VpZ2h0czpcbiAqIGxvc3MgKz0gc3VtKGwxICogYWJzKHgpKSArIHN1bShsMiAqIHheMilcbiAqXG4gKiBAZG9jIHtoZWFkaW5nOiAnUmVndWxhcml6ZXJzJywgbmFtZXNwYWNlOiAncmVndWxhcml6ZXJzJ31cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGwxbDIoY29uZmlnPzogTDFMMkFyZ3MpOiBSZWd1bGFyaXplciB7XG4gIHJldHVybiBuZXcgTDFMMihjb25maWcpO1xufVxuXG4vKipcbiAqIFJlZ3VsYXJpemVyIGZvciBMMSByZWd1bGFyaXphdGlvbi5cbiAqXG4gKiBBZGRzIGEgdGVybSB0byB0aGUgbG9zcyB0byBwZW5hbGl6ZSBsYXJnZSB3ZWlnaHRzOlxuICogbG9zcyArPSBzdW0obDEgKiBhYnMoeCkpXG4gKiBAcGFyYW0gYXJncyBsMSBjb25maWcuXG4gKlxuICogQGRvYyB7aGVhZGluZzogJ1JlZ3VsYXJpemVycycsIG5hbWVzcGFjZTogJ3JlZ3VsYXJpemVycyd9XG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBsMShjb25maWc/OiBMMUFyZ3MpOiBSZWd1bGFyaXplciB7XG4gIHJldHVybiByZWd1bGFyaXplcnMubDEoY29uZmlnKTtcbn1cblxuLyoqXG4gKiBSZWd1bGFyaXplciBmb3IgTDIgcmVndWxhcml6YXRpb24uXG4gKlxuICogQWRkcyBhIHRlcm0gdG8gdGhlIGxvc3MgdG8gcGVuYWxpemUgbGFyZ2Ugd2VpZ2h0czpcbiAqIGxvc3MgKz0gc3VtKGwyICogeF4yKVxuICogQHBhcmFtIGFyZ3MgbDIgY29uZmlnLlxuICpcbiAqIEBkb2Mge2hlYWRpbmc6ICdSZWd1bGFyaXplcnMnLCBuYW1lc3BhY2U6ICdyZWd1bGFyaXplcnMnfVxuICovXG5leHBvcnQgZnVuY3Rpb24gbDIoY29uZmlnPzogTDJBcmdzKTogUmVndWxhcml6ZXIge1xuICByZXR1cm4gcmVndWxhcml6ZXJzLmwyKGNvbmZpZyk7XG59XG4iXX0=","/**\n * @license\n * Copyright 2018 Google LLC\n *\n * Use of this source code is governed by an MIT-style\n * license that can be found in the LICENSE file or at\n * https://opensource.org/licenses/MIT.\n * =============================================================================\n */\n/* Original source: keras/callbacks.py */\nimport { BaseCallback } from './base_callbacks';\nimport { LayersModel } from './engine/training';\nimport { NotImplementedError } from './errors';\nimport { resolveScalarsInLogs } from './logs';\nexport class Callback extends BaseCallback {\n constructor() {\n super(...arguments);\n /** Instance of `keras.models.Model`. Reference of the model being trained. */\n this.model = null;\n }\n setModel(model) {\n if (!(model instanceof LayersModel)) {\n throw new Error('model must be a LayersModel, not some other Container');\n }\n this.model = model;\n }\n}\nfunction less(currVal, prevVal) {\n return currVal < prevVal;\n}\nfunction greater(currVal, prevVal) {\n return currVal > prevVal;\n}\n/**\n * A Callback that stops training when a monitored quantity has stopped\n * improving.\n */\nexport class EarlyStopping extends Callback {\n constructor(args) {\n super();\n if (args == null) {\n args = {};\n }\n if (args.restoreBestWeights) {\n throw new NotImplementedError('restoreBestWeights = True is not implemented in EarlyStopping yet.');\n }\n this.monitor = args.monitor || 'val_loss';\n this.minDelta = Math.abs(args.minDelta || 0);\n this.patience = args.patience || 0;\n this.verbose = args.verbose || 0;\n this.mode = args.mode || 'auto';\n this.baseline = args.baseline;\n if (['auto', 'min', 'max'].indexOf(this.mode) === -1) {\n console.warn(`EarlyStopping mode '${this.mode}' is invalid. ` +\n `Falling back to mode 'auto'.`);\n this.mode = 'auto';\n }\n if (this.mode === 'min') {\n this.monitorFunc = less;\n }\n else if (this.mode === 'max') {\n this.monitorFunc = greater;\n }\n else {\n // For mode === 'auto'.\n if (this.monitor.indexOf('acc') !== -1) {\n this.monitorFunc = greater;\n }\n else {\n this.monitorFunc = less;\n }\n }\n if (this.monitorFunc === less) {\n this.minDelta *= -1;\n }\n }\n async onTrainBegin(logs) {\n this.wait = 0;\n this.stoppedEpoch = 0;\n if (this.baseline != null) {\n this.best = this.baseline;\n }\n else {\n this.best = this.monitorFunc === less ? Infinity : -Infinity;\n }\n }\n async onEpochEnd(epoch, logs) {\n await resolveScalarsInLogs(logs);\n const current = this.getMonitorValue(logs);\n if (current == null) {\n return;\n }\n if (this.monitorFunc(current - this.minDelta, this.best)) {\n this.best = current;\n this.wait = 0;\n // TODO(cais): Logic for restoreBestWeights.\n }\n else {\n this.wait++;\n if (this.wait >= this.patience) {\n this.stoppedEpoch = epoch;\n this.model.stopTraining = true;\n }\n // TODO(cais): Logic for restoreBestWeights.\n }\n }\n async onTrainEnd(logs) {\n if (this.stoppedEpoch > 0 && this.verbose) {\n console.log(`Epoch ${this.stoppedEpoch}: early stopping.`);\n }\n }\n getMonitorValue(logs) {\n if (logs == null) {\n logs = {};\n }\n const monitorValue = logs[this.monitor];\n if (monitorValue == null) {\n console.warn(`Metric for EarlyStopping ${this.monitor} is not available. ` +\n `Available metrics are: ${Object.keys(logs)}`);\n }\n return monitorValue;\n }\n}\n/**\n * Factory function for a Callback that stops training when a monitored\n * quantity has stopped improving.\n *\n * Early stopping is a type of regularization, and protects model against\n * overfitting.\n *\n * The following example based on fake data illustrates how this callback\n * can be used during `tf.LayersModel.fit()`:\n *\n * ```js\n * const model = tf.sequential();\n * model.add(tf.layers.dense({\n * units: 3,\n * activation: 'softmax',\n * kernelInitializer: 'ones',\n * inputShape: [2]\n * }));\n * const xs = tf.tensor2d([1, 2, 3, 4], [2, 2]);\n * const ys = tf.tensor2d([[1, 0, 0], [0, 1, 0]], [2, 3]);\n * const xsVal = tf.tensor2d([4, 3, 2, 1], [2, 2]);\n * const ysVal = tf.tensor2d([[0, 0, 1], [0, 1, 0]], [2, 3]);\n * model.compile(\n * {loss: 'categoricalCrossentropy', optimizer: 'sgd', metrics: ['acc']});\n *\n * // Without the EarlyStopping callback, the val_acc value would be:\n * // 0.5, 0.5, 0.5, 0.5, ...\n * // With val_acc being monitored, training should stop after the 2nd epoch.\n * const history = await model.fit(xs, ys, {\n * epochs: 10,\n * validationData: [xsVal, ysVal],\n * callbacks: tf.callbacks.earlyStopping({monitor: 'val_acc'})\n * });\n *\n * // Expect to see a length-2 array.\n * console.log(history.history.val_acc);\n * ```\n *\n * @doc {\n * heading: 'Callbacks',\n * namespace: 'callbacks'\n * }\n */\nexport function earlyStopping(args) {\n return new EarlyStopping(args);\n}\nexport const callbacks = { earlyStopping };\n//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY2FsbGJhY2tzLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vdGZqcy1sYXllcnMvc3JjL2NhbGxiYWNrcy50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQTs7Ozs7Ozs7R0FRRztBQUVILHlDQUF5QztBQUV6QyxPQUFPLEVBQUMsWUFBWSxFQUFDLE1BQU0sa0JBQWtCLENBQUM7QUFFOUMsT0FBTyxFQUFDLFdBQVcsRUFBQyxNQUFNLG1CQUFtQixDQUFDO0FBQzlDLE9BQU8sRUFBQyxtQkFBbUIsRUFBQyxNQUFNLFVBQVUsQ0FBQztBQUM3QyxPQUFPLEVBQU8sb0JBQW9CLEVBQUMsTUFBTSxRQUFRLENBQUM7QUFFbEQsTUFBTSxPQUFnQixRQUFTLFNBQVEsWUFBWTtJQUFuRDs7UUFDRSw4RUFBOEU7UUFDOUUsVUFBSyxHQUFnQixJQUFJLENBQUM7SUFRNUIsQ0FBQztJQU5DLFFBQVEsQ0FBQyxLQUFnQjtRQUN2QixJQUFJLENBQUMsQ0FBQyxLQUFLLFlBQVksV0FBVyxDQUFDLEVBQUU7WUFDbkMsTUFBTSxJQUFJLEtBQUssQ0FBQyx1REFBdUQsQ0FBQyxDQUFDO1NBQzFFO1FBQ0QsSUFBSSxDQUFDLEtBQUssR0FBRyxLQUFLLENBQUM7SUFDckIsQ0FBQztDQUNGO0FBNERELFNBQVMsSUFBSSxDQUFDLE9BQWUsRUFBRSxPQUFlO0lBQzVDLE9BQU8sT0FBTyxHQUFHLE9BQU8sQ0FBQztBQUMzQixDQUFDO0FBRUQsU0FBUyxPQUFPLENBQUMsT0FBZSxFQUFFLE9BQWU7SUFDL0MsT0FBTyxPQUFPLEdBQUcsT0FBTyxDQUFDO0FBQzNCLENBQUM7QUFFRDs7O0dBR0c7QUFDSCxNQUFNLE9BQU8sYUFBYyxTQUFRLFFBQVE7SUFjekMsWUFBWSxJQUFnQztRQUMxQyxLQUFLLEVBQUUsQ0FBQztRQUNSLElBQUksSUFBSSxJQUFJLElBQUksRUFBRTtZQUNoQixJQUFJLEdBQUcsRUFBRSxDQUFDO1NBQ1g7UUFDRCxJQUFJLElBQUks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ZSBMTENcbiAqXG4gKiBVc2Ugb2YgdGhpcyBzb3VyY2UgY29kZSBpcyBnb3Zlcm5lZCBieSBhbiBNSVQtc3R5bGVcbiAqIGxpY2Vuc2UgdGhhdCBjYW4gYmUgZm91bmQgaW4gdGhlIExJQ0VOU0UgZmlsZSBvciBhdFxuICogaHR0cHM6Ly9vcGVuc291cmNlLm9yZy9saWNlbnNlcy9NSVQuXG4gKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuICovXG5cbi8qIE9yaWdpbmFsIHNvdXJjZToga2VyYXMvY2FsbGJhY2tzLnB5ICovXG5cbmltcG9ydCB7QmFzZUNhbGxiYWNrfSBmcm9tICcuL2Jhc2VfY2FsbGJhY2tzJztcbmltcG9ydCB7Q29udGFpbmVyfSBmcm9tICcuL2VuZ2luZS9jb250YWluZXInO1xuaW1wb3J0IHtMYXllcnNNb2RlbH0gZnJvbSAnLi9lbmdpbmUvdHJhaW5pbmcnO1xuaW1wb3J0IHtOb3RJbXBsZW1lbnRlZEVycm9yfSBmcm9tICcuL2Vycm9ycyc7XG5pbXBvcnQge0xvZ3MsIHJlc29sdmVTY2FsYXJzSW5Mb2dzfSBmcm9tICcuL2xvZ3MnO1xuXG5leHBvcnQgYWJzdHJhY3QgY2xhc3MgQ2FsbGJhY2sgZXh0ZW5kcyBCYXNlQ2FsbGJhY2sge1xuICAvKiogSW5zdGFuY2Ugb2YgYGtlcmFzLm1vZGVscy5Nb2RlbGAuIFJlZmVyZW5jZSBvZiB0aGUgbW9kZWwgYmVpbmcgdHJhaW5lZC4gKi9cbiAgbW9kZWw6IExheWVyc01vZGVsID0gbnVsbDtcblxuICBzZXRNb2RlbChtb2RlbDogQ29udGFpbmVyKTogdm9pZCB7XG4gICAgaWYgKCEobW9kZWwgaW5zdGFuY2VvZiBMYXllcnNNb2RlbCkpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcignbW9kZWwgbXVzdCBiZSBhIExheWVyc01vZGVsLCBub3Qgc29tZSBvdGhlciBDb250YWluZXInKTtcbiAgICB9XG4gICAgdGhpcy5tb2RlbCA9IG1vZGVsO1xuICB9XG59XG5cbmV4cG9ydCBpbnRlcmZhY2UgRWFybHlTdG9wcGluZ0NhbGxiYWNrQXJncyB7XG4gIC8qKlxuICAgKiBRdWFudGl0eSB0byBiZSBtb25pdG9yZWQuXG4gICAqXG4gICAqIERlZmF1bHRzIHRvICd2YWxfbG9zcycuXG4gICAqL1xuICBtb25pdG9yPzogc3RyaW5nO1xuXG4gIC8qKlxuICAgKiBNaW5pbXVtIGNoYW5nZSBpbiB0aGUgbW9uaXRvcmVkIHF1YW50aXR5IHRvIHF1YWxpZnkgYXMgaW1wcm92ZW1lbnQsXG4gICAqIGkuZS4sIGFuIGFic29sdXRlIGNoYW5nZSBvZiBsZXNzIHRoYW4gYG1pbkRlbHRhYCB3aWxsIGNvdW50IGFzIG5vXG4gICAqIGltcHJvdmVtZW50LlxuICAgKlxuICAgKiBEZWZhdWx0cyB0byAwLlxuICAgKi9cbiAgbWluRGVsdGE/OiBudW1iZXI7XG5cbiAgLyoqXG4gICAqIE51bWJlciBvZiBlcG9jaHMgd2l0aCBubyBpbXByb3ZlbWVudCBhZnRlciB3aGljaCB0cmFpbmluZyB3aWxsIGJlIHN0b3BwZWQuXG4gICAqXG4gICAqIERlZmF1bHRzIHRvIDAuXG4gICAqL1xuICBwYXRpZW5jZT86IG51bWJlcjtcblxuICAvKiogVmVyYm9zaXR5IG1vZGUuICovXG4gIHZlcmJvc2U/OiBudW1iZXI7XG5cbiAgLyoqXG4gICAqIE1vZGU6IG9uZSBvZiAnbWluJywgJ21heCcsIGFuZCAnYXV0bycuXG4gICAqIC0gSW4gJ21pbicgbW9kZSwgdHJhaW5pbmcgd2lsbCBiZSBzdG9wcGVkIHdoZW4gdGhlIHF1YW50aXR5IG1vbml0b3JlZCBoYXNcbiAgICogICBzdG9wcGVkIGRlY3JlYXNpbmcuXG4gICAqIC0gSW4gJ21heCcgbW9kZSwgdHJhaW5pbmcgd2lsbCBiZSBzdG9wcGVkIHdoZW4gdGhlIHF1YW50aXR5IG1vbml0b3JlZCBoYXNcbiAgICogICBzdG9wcGVkIGluY3JlYXNpbmcuXG4gICAqIC0gSW4gJ2F1dG8nIG1vZGUsIHRoZSBkaXJlY3Rpb24gaXMgaW5mZXJyZWQgYXV0b21hdGljYWxseSBmcm9tIHRoZSBuYW1lIG9mXG4gICAqICAgdGhlIG1vbml0b3JlZCBxdWFudGl0eS5cbiAgICpcbiAgICogRGVmYXVsdHMgdG8gJ2F1dG8nLlxuICAgKi9cbiAgbW9kZT86ICdhdXRvJ3wnbWluJ3wnbWF4JztcblxuICAvKipcbiAgICogQmFzZWxpbmUgdmFsdWUgb2YgdGhlIG1vbml0b3JlZCBxdWFudGl0eS5cbiAgICpcbiAgICogSWYgc3BlY2lmaWVkLCB0cmFpbmluZyB3aWxsIGJlIHN0b3BwZWQgaWYgdGhlIG1vZGVsIGRvZXNuJ3Qgc2hvd1xuICAgKiBpbXByb3ZlbWVudCBvdmVyIHRoZSBiYXNlbGluZS5cbiAgICovXG4gIGJhc2VsaW5lPzogbnVtYmVyO1xuXG4gIC8qKlxuICAgKiBXaGV0aGVyIHRvIHJlc3RvcmUgbW9kZWwgd2VpZ2h0cyBmcm9tIHRoZSBlcG9jaCB3aXRoIHRoZSBiZXN0IHZhbHVlXG4gICAqIG9mIHRoZSBtb25pdG9yZWQgcXVhbnRpdHkuIElmIGBGYWxzZWAsIHRoZSBtb2RlbCB3ZWlnaHRzIG9idGFpbmVkIGF0IHRoZVxuICAgKiBsYXN0IHN0ZXAgb2YgdHJhaW5pbmcgYXJlIHVzZWQuXG4gICAqXG4gICAqICoqYFRydWVgIGlzIG5vdCBzdXBwb3J0ZWQgeWV0LioqXG4gICAqL1xuICByZXN0b3JlQmVzdFdlaWdodHM/OiBib29sZWFuO1xufVxuXG5mdW5jdGlvbiBsZXNzKGN1cnJWYWw6IG51bWJlciwgcHJldlZhbDogbnVtYmVyKSB7XG4gIHJldHVybiBjdXJyVmFsIDwgcHJldlZhbDtcbn1cblxuZnVuY3Rpb24gZ3JlYXRlcihjdXJyVmFsOiBudW1iZXIsIHByZXZWYWw6IG51bWJlcikge1xuICByZXR1cm4gY3VyclZhbCA+IHByZXZWYWw7XG59XG5cbi8qKlxuICogQSBDYWxsYmFjayB0aGF0IHN0b3BzIHRyYWluaW5nIHdoZW4gYSBtb25pdG9yZWQgcXVhbnRpdHkgaGFzIHN0b3BwZWRcbiAqIGltcHJvdmluZy5cbiAqL1xuZXhwb3J0IGNsYXNzIEVhcmx5U3RvcHBpbmcgZXh0ZW5kcyBDYWxsYmFjayB7XG4gIHByb3RlY3RlZCByZWFkb25seSBtb25pdG9yOiBzdHJpbmc7XG4gIHByb3RlY3RlZCByZWFkb25seSBtaW5EZWx0YTogbnVtYmVyO1xuICBwcm90ZWN0ZWQgcmVhZG9ubHkgcGF0aWVuY2U6IG51bWJlcjtcbiAgcHJvdGVjdGVkIHJlYWRvbmx5IGJhc2VsaW5lOiBudW1iZXI7XG4gIHByb3RlY3RlZCByZWFkb25seSB2ZXJib3NlOiBudW1iZXI7XG4gIHByb3RlY3RlZCByZWFkb25seSBtb2RlOiAnYXV0byd8J21pbid8J21heCc7XG5cbiAgcHJvdGVjdGVkIG1vbml0b3JGdW5jOiAoY3VyclZhbDogbnVtYmVyLCBwcmV2VmFsOiBudW1iZXIpID0+IGJvb2xlYW47XG5cbiAgcHJpdmF0ZSB3YWl0OiBudW1iZXI7XG4gIHByaXZhdGUgc3RvcHBlZEVwb2NoOiBudW1iZXI7XG4gIHByaXZhdGUgYmVzdDogbnVtYmVyO1xuXG4gIGNvbnN0cnVjdG9yKGFyZ3M/OiBFYXJseVN0b3BwaW5nQ2FsbGJhY2tBcmdzKSB7XG4gICAgc3VwZXIoKTtcbiAgICBpZiAoYXJncyA9PSBudWxsKSB7XG4gICAgICBhcmdzID0ge307XG4gICAgfVxuICAgIGlmIChhcmdzLnJlc3RvcmVCZXN0V2VpZ2h0cykge1xuICAgICAgdGhyb3cgbmV3IE5vdEltcGxlbWVudGVkRXJyb3IoXG4gICAgICAgICAgJ3Jlc3RvcmVCZXN0V2VpZ2h0cyA9IFRydWUgaXMgbm90IGltcGxlbWVudGVkIGluIEVhcmx5U3RvcHBpbmcgeWV0LicpO1xuICAgIH1cblxuICAgIHRoaXMubW9uaXRvciA9IGFyZ3MubW9uaXRvciB8fCAndmFsX2xvc3MnO1xuICAgIHRoaXMubWluRGVsdGEgPSBNYXRoLmFicyhhcmdzLm1pbkRlbHRhIHx8IDApO1xuICAgIHRoaXMucGF0aWVuY2UgPSBhcmdzLnBhdGllbmNlIHx8IDA7XG4gICAgdGhpcy52ZXJib3NlID0gYXJncy52ZXJib3NlIHx8IDA7XG4gICAgdGhpcy5tb2RlID0gYXJncy5tb2RlIHx8ICdhdXRvJztcbiAgICB0aGlzLmJhc2VsaW5lID0gYXJncy5iYXNlbGluZTtcblxuICAgIGlmIChbJ2F1dG8nLCAnbWluJywgJ21heCddLmluZGV4T2YodGhpcy5tb2RlKSA9PT0gLTEpIHtcbiAgICAgIGNvbnNvbGUud2FybihcbiAgICAgICAgICBgRWFybHlTdG9wcGluZyBtb2RlICcke3RoaXMubW9kZX0nIGlzIGludmFsaWQuIGAgK1xuICAgICAgICAgIGBGYWxsaW5nIGJhY2sgdG8gbW9kZSAnYXV0bycuYCk7XG4gICAgICB0aGlzLm1vZGUgPSAnYXV0byc7XG4gICAgfVxuXG4gICAgaWYgKHRoaXMubW9kZSA9PT0gJ21pbicpIHtcbiAgICAgIHRoaXMubW9uaXRvckZ1bmMgPSBsZXNzO1xuICAgIH0gZWxzZSBpZiAodGhpcy5tb2RlID09PSAnbWF4Jykge1xuICAgICAgdGhpcy5tb25pdG9yRnVuYyA9IGdyZWF0ZXI7XG4gICAgfSBlbHNlIHtcbiAgICAgIC8vIEZvciBtb2RlID09PSAnYXV0bycuXG4gICAgICBpZiAodGhpcy5tb25pdG9yLmluZGV4T2YoJ2FjYycpICE9PSAtMSkge1xuICAgICAgICB0aGlzLm1vbml0b3JGdW5jID0gZ3JlYXRlcjtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHRoaXMubW9uaXRvckZ1bmMgPSBsZXNzO1xuICAgICAgfVxuICAgIH1cblxuICAgIGlmICh0aGlzLm1vbml0b3JGdW5jID09PSBsZXNzKSB7XG4gICAgICB0aGlzLm1pbkRlbHRhICo9IC0xO1xuICAgIH1cbiAgfVxuXG4gIGFzeW5jIG9uVHJhaW5CZWdpbihsb2dzPzogTG9ncykge1xuICAgIHRoaXMud2FpdCA9IDA7XG4gICAgdGhpcy5zdG9wcGVkRXBvY2ggPSAwO1xuICAgIGlmICh0aGlzLmJhc2VsaW5lICE9IG51bGwpIHtcbiAgICAgIHRoaXMuYmVzdCA9IHRoaXMuYmFzZWxpbmU7XG4gICAgfSBlbHNlIHtcbiAgICAgIHRoaXMuYmVzdCA9IHRoaXMubW9uaXRvckZ1bmMgPT09IGxlc3MgPyBJbmZpbml0eSA6IC1JbmZpbml0eTtcbiAgICB9XG4gIH1cblxuICBhc3luYyBvbkVwb2NoRW5kKGVwb2NoOiBudW1iZXIsIGxvZ3M/OiBMb2dzKSB7XG4gICAgYXdhaXQgcmVzb2x2ZVNjYWxhcnNJbkxvZ3MobG9ncyk7XG4gICAgY29uc3QgY3VycmVudCA9IHRoaXMuZ2V0TW9uaXRvclZhbHVlKGxvZ3MpO1xuICAgIGlmIChjdXJyZW50ID09IG51bGwpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICBpZiAodGhpcy5tb25pdG9yRnVuYyhjdXJyZW50IC0gdGhpcy5taW5EZWx0YSwgdGhpcy5iZXN0KSkge1xuICAgICAgdGhpcy5iZXN0ID0gY3VycmVudDtcbiAgICAgIHRoaXMud2FpdCA9IDA7XG4gICAgICAvLyBUT0RPKGNhaXMpOiBMb2dpYyBmb3IgcmVzdG9yZUJlc3RXZWlnaHRzLlxuICAgIH0gZWxzZSB7XG4gICAgICB0aGlzLndhaXQrKztcbiAgICAgIGlmICh0aGlzLndhaXQgPj0gdGhpcy5wYXRpZW5jZSkge1xuICAgICAgICB0aGlzLnN0b3BwZWRFcG9jaCA9IGVwb2NoO1xuICAgICAgICB0aGlzLm1vZGVsLnN0b3BUcmFpbmluZyA9IHRydWU7XG4gICAgICB9XG4gICAgICAvLyBUT0RPKGNhaXMpOiBMb2dpYyBmb3IgcmVzdG9yZUJlc3RXZWlnaHRzLlxuICAgIH1cbiAgfVxuXG4gIGFzeW5jIG9uVHJhaW5FbmQobG9ncz86IExvZ3MpIHtcbiAgICBpZiAodGhpcy5zdG9wcGVkRXBvY2ggPiAwICYmIHRoaXMudmVyYm9zZSkge1xuICAgICAgY29uc29sZS5sb2coYEVwb2NoICR7dGhpcy5zdG9wcGVkRXBvY2h9OiBlYXJseSBzdG9wcGluZy5gKTtcbiAgICB9XG4gIH1cblxuICBwcml2YXRlIGdldE1vbml0b3JWYWx1ZShsb2dzOiBMb2dzKSB7XG4gICAgaWYgKGxvZ3MgPT0gbnVsbCkge1xuICAgICAgbG9ncyA9IHt9O1xuICAgIH1cbiAgICBjb25zdCBtb25pdG9yVmFsdWUgPSBsb2dzW3RoaXMubW9uaXRvcl07XG4gICAgaWYgKG1vbml0b3JWYWx1ZSA9PSBudWxsKSB7XG4gICAgICBjb25zb2xlLndhcm4oXG4gICAgICAgICAgYE1ldHJpYyBmb3IgRWFybHlTdG9wcGluZyAke3RoaXMubW9uaXRvcn0gaXMgbm90IGF2YWlsYWJsZS4gYCArXG4gICAgICAgICAgYEF2YWlsYWJsZSBtZXRyaWNzIGFyZTogJHtPYmplY3Qua2V5cyhsb2dzKX1gKTtcbiAgICB9XG4gICAgcmV0dXJuIG1vbml0b3JWYWx1ZTtcbiAgfVxufVxuXG4vKipcbiAqIEZhY3RvcnkgZnVuY3Rpb24gZm9yIGEgQ2FsbGJhY2sgdGhhdCBzdG9wcyB0cmFpbmluZyB3aGVuIGEgbW9uaXRvcmVkXG4gKiBxdWFudGl0eSBoYXMgc3RvcHBlZCBpbXByb3ZpbmcuXG4gKlxuICogRWFybHkgc3RvcHBpbmcgaXMgYSB0eXBlIG9mIHJlZ3VsYXJpemF0aW9uLCBhbmQgcHJvdGVjdHMgbW9kZWwgYWdhaW5zdFxuICogb3ZlcmZpdHRpbmcuXG4gKlxuICogVGhlIGZvbGxvd2luZyBleGFtcGxlIGJhc2VkIG9uIGZha2UgZGF0YSBpbGx1c3RyYXRlcyBob3cgdGhpcyBjYWxsYmFja1xuICogY2FuIGJlIHVzZWQgZHVyaW5nIGB0Zi5MYXllcnNNb2RlbC5maXQoKWA6XG4gKlxuICogYGBganNcbiAqIGNvbnN0IG1vZGVsID0gdGYuc2VxdWVudGlhbCgpO1xuICogbW9kZWwuYWRkKHRmLmxheWVycy5kZW5zZSh7XG4gKiAgIHVuaXRzOiAzLFxuICogICBhY3RpdmF0aW9uOiAnc29mdG1heCcsXG4gKiAgIGtlcm5lbEluaXRpYWxpemVyOiAnb25lcycsXG4gKiAgIGlucHV0U2hhcGU6IFsyXVxuICogfSkpO1xuICogY29uc3QgeHMgPSB0Zi50ZW5zb3IyZChbMSwgMiwgMywgNF0sIFsyLCAyXSk7XG4gKiBjb25zdCB5cyA9IHRmLnRlbnNvcjJkKFtbMSwgMCwgMF0sIFswLCAxLCAwXV0sIFsyLCAzXSk7XG4gKiBjb25zdCB4c1ZhbCA9IHRmLnRlbnNvcjJkKFs0LCAzLCAyLCAxXSwgWzIsIDJdKTtcbiAqIGNvbnN0IHlzVmFsID0gdGYudGVuc29yMmQoW1swLCAwLCAxXSwgWzAsIDEsIDBdXSwgWzIsIDNdKTtcbiAqIG1vZGVsLmNvbXBpbGUoXG4gKiAgICAge2xvc3M6ICdjYXRlZ29yaWNhbENyb3NzZW50cm9weScsIG9wdGltaXplcjogJ3NnZCcsIG1ldHJpY3M6IFsnYWNjJ119KTtcbiAqXG4gKiAvLyBXaXRob3V0IHRoZSBFYXJseVN0b3BwaW5nIGNhbGxiYWNrLCB0aGUgdmFsX2FjYyB2YWx1ZSB3b3VsZCBiZTpcbiAqIC8vICAgMC41LCAwLjUsIDAuNSwgMC41LCAuLi5cbiAqIC8vIFdpdGggdmFsX2FjYyBiZWluZyBtb25pdG9yZWQsIHRyYWluaW5nIHNob3VsZCBzdG9wIGFmdGVyIHRoZSAybmQgZXBvY2guXG4gKiBjb25zdCBoaXN0b3J5ID0gYXdhaXQgbW9kZWwuZml0KHhzLCB5cywge1xuICogICBlcG9jaHM6IDEwLFxuICogICB2YWxpZGF0aW9uRGF0YTogW3hzVmFsLCB5c1ZhbF0sXG4gKiAgIGNhbGxiYWNrczogdGYuY2FsbGJhY2tzLmVhcmx5U3RvcHBpbmcoe21vbml0b3I6ICd2YWxfYWNjJ30pXG4gKiB9KTtcbiAqXG4gKiAvLyBFeHBlY3QgdG8gc2VlIGEgbGVuZ3RoLTIgYXJyYXkuXG4gKiBjb25zb2xlLmxvZyhoaXN0b3J5Lmhpc3RvcnkudmFsX2FjYyk7XG4gKiBgYGBcbiAqXG4gKiBAZG9jIHtcbiAqICAgaGVhZGluZzogJ0NhbGxiYWNrcycsXG4gKiAgIG5hbWVzcGFjZTogJ2NhbGxiYWNrcydcbiAqIH1cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGVhcmx5U3RvcHBpbmcoYXJncz86IEVhcmx5U3RvcHBpbmdDYWxsYmFja0FyZ3MpIHtcbiAgcmV0dXJuIG5ldyBFYXJseVN0b3BwaW5nKGFyZ3MpO1xufVxuXG5leHBvcnQgY29uc3QgY2FsbGJhY2tzID0ge2Vhcmx5U3RvcHBpbmd9O1xuIl19","/**\n * @license\n * Copyright 2018 Google LLC. All Rights Reserved.\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n *\n * =============================================================================\n */\nimport * as tf from '@tensorflow/tfjs-core';\nimport * as seedrandom from 'seedrandom';\nimport { deepClone } from '../util/deep_clone';\nimport { deepMapAndAwaitAll, deepZip, zipToList } from '../util/deep_map';\nimport { GrowingRingBuffer } from '../util/growing_ring_buffer';\nimport { RingBuffer } from '../util/ring_buffer';\n// Here we implement a simple asynchronous iterator.\n// This lets us avoid using either third-party stream libraries or\n// recent TypeScript language support requiring polyfills.\n/**\n * Create a `LazyIterator` from an array of items.\n */\nexport function iteratorFromItems(items) {\n return new ArrayIterator(items);\n}\n/**\n * Create a `LazyIterator` of incrementing integers.\n */\nexport function iteratorFromIncrementing(start) {\n let i = start;\n return iteratorFromFunction(() => ({ value: i++, done: false }));\n}\n/**\n * Create a `LazyIterator` from a function.\n *\n * ```js\n * let i = -1;\n * const func = () =>\n * ++i < 5 ? {value: i, done: false} : {value: null, done: true};\n * const iter = tf.data.iteratorFromFunction(func);\n * await iter.forEachAsync(e => console.log(e));\n * ```\n *\n * @param func A function that produces data on each call.\n */\nexport function iteratorFromFunction(func) {\n return new FunctionCallIterator(func);\n}\n/**\n * Create a `LazyIterator` by concatenating underlying streams, which are\n * themselves provided as a stream.\n *\n * This can also be thought of as a \"stream flatten\" operation.\n *\n * @param baseIterators A stream of streams to be concatenated.\n * @param baseErrorHandler An optional function that can intercept `Error`s\n * raised during a `next()` call on the base stream. This function can decide\n * whether the error should be propagated, whether the error should be\n * ignored, or whether the base stream should be terminated.\n */\nexport function iteratorFromConcatenated(baseIterators, baseErrorHandler) {\n return new ChainedIterator(baseIterators, baseErrorHandler);\n}\n/**\n * Create a `LazyIterator` by concatenating streams produced by calling a\n * stream-generating function a given number of times.\n *\n * Since a `LazyIterator` is read-once, it cannot be repeated, but this\n * function can be used to achieve a similar effect:\n *\n * LazyIterator.ofConcatenatedFunction(() => new MyIterator(), 6);\n *\n * @param iteratorFunc: A function that produces a new stream on each call.\n * @param count: The number of times to call the function.\n * @param baseErrorHandler An optional function that can intercept `Error`s\n * raised during a `next()` call on the base stream. This function can decide\n * whether the error should be propagated, whether the error should be\n * ignored, or whether the base stream should be terminated.\n */\nexport function iteratorFromConcatenatedFunction(iteratorFunc, count, baseErrorHandler) {\n return iteratorFromConcatenated(iteratorFromFunction(iteratorFunc).take(count), baseErrorHandler);\n}\n/**\n * Create a `LazyIterator` by zipping together an array, dict, or nested\n * structure of `LazyIterator`s (and perhaps additional constants).\n *\n * The underlying streams must provide elements in a consistent order such\n * that they correspond.\n *\n * Typically, the underlying streams should have the same number of\n * elements. If they do not, the behavior is determined by the\n * `mismatchMode` argument.\n *\n * The nested structure of the `iterators` argument determines the\n * structure of elements in the resulting iterator.\n *\n * @param iterators: An array or object containing LazyIterators at the\n * leaves.\n * @param mismatchMode: Determines what to do when one underlying iterator\n * is exhausted before the others. `ZipMismatchMode.FAIL` (the default)\n * causes an error to be thrown in this case. `ZipMismatchMode.SHORTEST`\n * causes the zipped iterator to terminate with the furst underlying\n * streams, so elements remaining on the longer streams are ignored.\n * `ZipMismatchMode.LONGEST` causes the zipped stream to continue, filling\n * in nulls for the exhausted streams, until all streams are exhausted.\n */\nexport function iteratorFromZipped(iterators, mismatchMode = ZipMismatchMode.FAIL) {\n return new ZipIterator(iterators, mismatchMode);\n}\n/**\n * An asynchronous iterator, providing lazy access to a potentially\n * unbounded stream of elements.\n *\n * Iterator can be obtained from a dataset:\n * `const iter = await dataset.iterator();`\n */\nexport class LazyIterator {\n /**\n * Collect all remaining elements of a bounded stream into an array.\n * Obviously this will succeed only for small streams that fit in memory.\n * Useful for testing.\n *\n * @returns A Promise for an array of stream elements, which will resolve\n * when the stream is exhausted.\n */\n async toArray() {\n const result = [];\n let x = await this.next();\n while (!x.done) {\n result.push(x.value);\n x = await this.next();\n }\n return result;\n }\n /**\n * Collect all elements of this dataset into an array with prefetching 100\n * elements. This is useful for testing, because the prefetch changes the\n * order in which the Promises are resolved along the processing pipeline.\n * This may help expose bugs where results are dependent on the order of\n * Promise resolution rather than on the logical order of the stream (i.e.,\n * due to hidden mutable state).\n *\n * @returns A Promise for an array of stream elements, which will resolve\n * when the stream is exhausted.\n */\n async toArrayForTest() {\n const stream = this.prefetch(100);\n const result = [];\n let x = await stream.next();\n while (!x.done) {\n result.push(x.value);\n x = await stream.next();\n }\n return result;\n }\n /**\n * Draw items from the stream until it is exhausted.\n *\n * This can be useful when the stream has side effects but no output. In\n * that case, calling this function guarantees that the stream will be\n * fully processed.\n */\n async resolveFully() {\n let x = await this.next();\n while (!x.done) {\n x = await this.next();\n }\n }\n /**\n * Draw items from the stream until it is exhausted, or a predicate fails.\n *\n * This can be useful when the stream has side effects but no output. In\n * that case, calling this function guarantees that the stream will be\n * fully processed.\n */\n async resolveWhile(predicate) {\n let x = await this.next();\n let shouldContinue = predicate(x.value);\n while ((!x.done) && shouldContinue) {\n x = await this.next();\n shouldContinue = predicate(x.value);\n }\n }\n /**\n * Handles errors thrown on this stream using a provided handler function.\n *\n * @param handler A function that handles any `Error` thrown during a `next()`\n * call and returns true if the stream should continue (dropping the failed\n * call) or false if the stream should quietly terminate. If the handler\n * itself throws (or rethrows) an `Error`, that will be propagated.\n *\n * @returns A `LazyIterator` of elements passed through from upstream,\n * possibly filtering or terminating on upstream `next()` calls that\n * throw an `Error`.\n */\n handleErrors(handler) {\n return new ErrorHandlingLazyIterator(this, handler);\n }\n // TODO(soergel): Implement reduce() etc.\n /**\n * Filters this stream according to `predicate`.\n *\n * @param predicate A function mapping a stream element to a boolean or a\n * `Promise` for one.\n *\n * @returns A `LazyIterator` of elements for which the predicate was true.\n */\n filter(predicate) {\n return new FilterIterator(this, predicate);\n }\n /**\n * Maps this stream through a 1-to-1 transform.\n *\n * @param transform A function mapping a stream element to a transformed\n * element.\n *\n * @returns A `LazyIterator` of transformed elements.\n */\n map(transform) {\n return new MapIterator(this, transform);\n }\n /**\n * Maps this stream through an async 1-to-1 transform.\n *\n * @param transform A function mapping a stream element to a `Promise` for a\n * transformed stream element.\n *\n * @returns A `LazyIterator` of transformed elements.\n */\n mapAsync(transform) {\n return new AsyncMapIterator(this, transform);\n }\n /**\n * Maps this stream through a 1-to-1 transform, forcing serial execution.\n *\n * @param transform A function mapping a stream element to a transformed\n * element.\n *\n * @returns A `LazyIterator` of transformed elements.\n */\n serialMapAsync(transform) {\n return new AsyncMapIterator(this, transform).serial();\n }\n /**\n * Maps this stream through a 1-to-many transform.\n *\n * @param transform A function mapping a stream element to an array of\n * transformed elements.\n *\n * @returns A `DataStream` of transformed elements.\n */\n flatmap(transform) {\n return new FlatmapIterator(this, transform);\n }\n /**\n * Apply a function to every element of the stream.\n *\n * @param f A function to apply to each stream element.\n */\n async forEachAsync(f) {\n return this.map(f).resolveFully();\n }\n /**\n * Apply a function to every element of the stream, forcing serial execution.\n *\n * @param f A function to apply to each stream element. Should return 'true'\n * to indicate that the stream should continue, or 'false' to cause it to\n * terminate.\n */\n async serialForEach(f) {\n return this.serialMapAsync(f).resolveWhile(x => (x === true));\n }\n /**\n * Groups elements into batches, represented as arrays of elements.\n *\n * We can think of the elements of this iterator as 'rows' (even if they are\n * nested structures). By the same token, consecutive values for a given\n * key within the elements form a 'column'. This matches the usual sense of\n * 'row' and 'column' when processing tabular data (e.g., parsing a CSV).\n *\n * Thus, \"Row-major\" means that the resulting batch is simply a collection of\n * rows: `[row1, row2, row3, ...]`. This is contrast to the column-major\n * form, which is needed for vectorized computation.\n *\n * @param batchSize The number of elements desired per batch.\n * @param smallLastBatch Whether to emit the final batch when it has fewer\n * than batchSize elements. Default true.\n * @returns A `LazyIterator` of batches of elements, represented as arrays\n * of the original element type.\n */\n rowMajorBatch(batchSize, smallLastBatch = true) {\n return new RowMajorBatchIterator(this, batchSize, smallLastBatch);\n }\n /**\n * Groups elements into batches, represented in column-major form.\n *\n * We can think of the elements of this iterator as 'rows' (even if they are\n * nested structures). By the same token, consecutive values for a given\n * key within the elements form a 'column'. This matches the usual sense of\n * 'row' and 'column' when processing tabular data (e.g., parsing a CSV).\n *\n * Thus, \"column-major\" means that the resulting batch is a (potentially\n * nested) structure representing the columns. Each column entry, then,\n * contains a collection of the values found in that column for a range of\n * input elements. This representation allows for vectorized computation, in\n * contrast to the row-major form.\n *\n * The inputs should all have the same nested structure (i.e., of arrays and\n * dicts). The result is a single object with the same nested structure,\n * where the leaves are arrays collecting the values of the inputs at that\n * location (or, optionally, the result of a custom function applied to those\n * arrays).\n *\n * @param batchSize The number of elements desired per batch.\n * @param smallLastBatch Whether to emit the final batch when it has fewer\n * than batchSize elements. Default true.\n * @param zipFn: (optional) A function that expects an array of elements at a\n * single node of the object tree, and returns a `DeepMapResult`. The\n * `DeepMapResult` either provides a result value for that node (i.e.,\n * representing the subtree), or indicates that the node should be processed\n * recursively. The default zipFn recurses as far as possible and places\n * arrays at the leaves.\n * @returns A `LazyIterator` of batches of elements, represented as an object\n * with collections at the leaves.\n */\n columnMajorBatch(batchSize, smallLastBatch = true, \n // tslint:disable-next-line:no-any\n zipFn = zipToList) {\n // First collect the desired number of input elements as a row-major batch.\n const rowBatches = this.rowMajorBatch(batchSize, smallLastBatch);\n // Now 'rotate' or 'pivot' the data, collecting all values from each column\n // in the batch (i.e., for each key within the elements) into an array.\n return rowBatches.map(x => deepZip(x, zipFn));\n }\n /**\n * Concatenate this `LazyIterator` with another.\n *\n * @param iterator A `LazyIterator` to be concatenated onto this one.\n * @param baseErrorHandler An optional function that can intercept `Error`s\n * raised during a `next()` call on the base stream. This function can\n * decide whether the error should be propagated, whether the error should\n * be ignored, or whether the base stream should be terminated.\n * @returns A `LazyIterator`.\n */\n concatenate(iterator, baseErrorHandler) {\n return new ChainedIterator(iteratorFromItems([this, iterator]), baseErrorHandler);\n }\n /**\n * Limits this stream to return at most `count` items.\n *\n * @param count The maximum number of items to provide from the stream. If\n * a negative or undefined value is given, the entire stream is returned\n * unaltered.\n */\n take(count) {\n if (count < 0 || count == null) {\n return this;\n }\n return new TakeIterator(this, count);\n }\n /**\n * Skips the first `count` items in this stream.\n *\n * @param count The number of items to skip. If a negative or undefined\n * value is given, the entire stream is returned unaltered.\n */\n skip(count) {\n if (count < 0 || count == null) {\n return this;\n }\n return new SkipIterator(this, count);\n }\n /**\n * Prefetch the first `bufferSize` items in this stream.\n *\n * Note this prefetches Promises, but makes no guarantees about when those\n * Promises resolve.\n *\n * @param bufferSize: An integer specifying the number of elements to be\n * prefetched.\n */\n prefetch(bufferSize) {\n return new PrefetchIterator(this, bufferSize);\n }\n // TODO(soergel): deep sharded shuffle, where supported\n /**\n * Randomly shuffles the elements of this stream.\n *\n * @param bufferSize: An integer specifying the number of elements from\n * this stream from which the new stream will sample.\n * @param seed: (Optional.) An integer specifying the random seed that\n * will be used to create the distribution.\n */\n shuffle(windowSize, seed) {\n return new ShuffleIterator(this, windowSize, seed);\n }\n /**\n * Force an iterator to execute serially: each next() call will await the\n * prior one, so that they cannot execute concurrently.\n */\n serial() {\n return new SerialIterator(this);\n }\n}\n// ============================================================================\n// The following private classes serve to implement the chainable methods\n// on LazyIterator. Unfortunately they can't be placed in separate files,\n// due to resulting trouble with circular imports.\n// ============================================================================\n// Iterators that just extend LazyIterator directly\n// ============================================================================\nclass ArrayIterator extends LazyIterator {\n constructor(items) {\n super();\n this.items = items;\n this.trav = 0;\n }\n summary() {\n return `Array of ${this.items.length} items`;\n }\n async next() {\n if (this.trav >= this.items.length) {\n return { value: null, done: true };\n }\n const item = this.items[this.trav];\n this.trav++;\n return { value: deepClone(item), done: false };\n }\n}\nclass FunctionCallIterator extends LazyIterator {\n constructor(nextFn) {\n super();\n this.nextFn = nextFn;\n }\n summary() {\n return `Function call`;\n }\n async next() {\n try {\n return this.nextFn();\n }\n catch (e) {\n // Modify the error message but leave the stack trace intact\n e.message =\n `Error thrown while iterating through a dataset: ${e.message}`;\n throw e;\n }\n }\n}\nclass SerialIterator extends LazyIterator {\n constructor(upstream) {\n super();\n this.upstream = upstream;\n this.lastRead = Promise.resolve({ value: null, done: false });\n }\n summary() {\n return `${this.upstream.summary()} -> Serial`;\n }\n async next() {\n // This sets this.lastRead to a new Promise right away, as opposed to\n // saying `await this.lastRead; this.lastRead = this.serialNext();` which\n // would not work because this.nextRead would be updated only after the\n // promise resolves.\n this.lastRead = this.lastRead.then(() => this.serialNext());\n return this.lastRead;\n }\n async serialNext() {\n return this.upstream.next();\n }\n}\nclass SkipIterator extends LazyIterator {\n constructor(upstream, maxCount) {\n super();\n this.upstream = upstream;\n this.maxCount = maxCount;\n // Local state that should not be clobbered by out-of-order execution.\n this.count = 0;\n this.lastRead = Promise.resolve({ value: null, done: false });\n }\n summary() {\n return `${this.upstream.summary()} -> Skip`;\n }\n async next() {\n // This sets this.lastRead to a new Promise right away, as opposed to\n // saying `await this.lastRead; this.lastRead = this.serialNext();` which\n // would not work because this.nextRead would be updated only after the\n // promise resolves.\n this.lastRead = this.lastRead.then(() => this.serialNext());\n return this.lastRead;\n }\n async serialNext() {\n // TODO(soergel): consider tradeoffs of reading in parallel, eg.\n // collecting next() promises in an Array and then waiting for\n // Promise.all() of those. Benefit: pseudo-parallel execution. Drawback:\n // maybe delayed GC.\n while (this.count++ < this.maxCount) {\n const skipped = await this.upstream.next();\n // short-circuit if upstream is already empty\n if (skipped.done) {\n return skipped;\n }\n tf.dispose(skipped.value);\n }\n return this.upstream.next();\n }\n}\nclass TakeIterator extends LazyIterator {\n constructor(upstream, maxCount) {\n super();\n this.upstream = upstream;\n this.maxCount = maxCount;\n this.count = 0;\n }\n summary() {\n return `${this.upstream.summary()} -> Take`;\n }\n async next() {\n if (this.count++ >= this.maxCount) {\n return { value: null, done: true };\n }\n return this.upstream.next();\n }\n}\n// Note this batch just groups items into row-wise element arrays.\n// Rotating these to a column-wise representation happens only at the dataset\n// level.\nclass RowMajorBatchIterator extends LazyIterator {\n constructor(upstream, batchSize, enableSmallLastBatch = true) {\n super();\n this.upstream = upstream;\n this.batchSize = batchSize;\n this.enableSmallLastBatch = enableSmallLastBatch;\n this.lastRead = Promise.resolve({ value: null, done: false });\n }\n summary() {\n return `${this.upstream.summary()} -> RowMajorBatch`;\n }\n async next() {\n // This sets this.lastRead to a new Promise right away, as opposed to\n // saying `await this.lastRead; this.lastRead = this.serialNext();` which\n // would not work because this.nextRead would be updated only after the\n // promise resolves.\n this.lastRead = this.lastRead.then(() => this.serialNext());\n return this.lastRead;\n }\n async serialNext() {\n const batch = [];\n while (batch.length < this.batchSize) {\n const item = await this.upstream.next();\n if (item.done) {\n if (this.enableSmallLastBatch && batch.length > 0) {\n return { value: batch, done: false };\n }\n return { value: null, done: true };\n }\n batch.push(item.value);\n }\n return { value: batch, done: false };\n }\n}\nclass FilterIterator extends LazyIterator {\n constructor(upstream, predicate) {\n super();\n this.upstream = upstream;\n this.predicate = predicate;\n this.lastRead = Promise.resolve({ value: null, done: false });\n }\n summary() {\n return `${this.upstream.summary()} -> Filter`;\n }\n async next() {\n // This sets this.lastRead to a new Promise right away, as opposed to\n // saying `await this.lastRead; this.lastRead = this.serialNext();` which\n // would not work because this.nextRead would be updated only after the\n // promise resolves.\n this.lastRead = this.lastRead.then(() => this.serialNext());\n return this.lastRead;\n }\n async serialNext() {\n while (true) {\n const item = await this.upstream.next();\n if (item.done || this.predicate(item.value)) {\n return item;\n }\n tf.dispose(item.value);\n }\n }\n}\nclass MapIterator extends LazyIterator {\n constructor(upstream, transform) {\n super();\n this.upstream = upstream;\n this.transform = transform;\n }\n summary() {\n return `${this.upstream.summary()} -> Map`;\n }\n async next() {\n const item = await this.upstream.next();\n if (item.done) {\n return { value: null, done: true };\n }\n const inputTensors = tf.tensor_util.getTensorsInContainer(item.value);\n // Careful: the transform may mutate the item in place.\n // That's why we have to remember the input Tensors above, and then\n // below dispose only those that were not passed through to the output.\n // Note too that the transform function is responsible for tidying\n // any intermediate Tensors. Here we are concerned only about the\n // inputs.\n const mapped = this.transform(item.value);\n const outputTensors = tf.tensor_util.getTensorsInContainer(mapped);\n // TODO(soergel) faster intersection\n // TODO(soergel) move to tf.disposeExcept(in, out)?\n for (const t of inputTensors) {\n if (!tf.tensor_util.isTensorInList(t, outputTensors)) {\n t.dispose();\n }\n }\n return { value: mapped, done: false };\n }\n}\nclass ErrorHandlingLazyIterator extends LazyIterator {\n constructor(upstream, handler) {\n super();\n this.upstream = upstream;\n this.handler = handler;\n this.count = 0;\n this.lastRead = Promise.resolve({ value: null, done: false });\n }\n summary() {\n return `${this.upstream.summary()} -> handleErrors`;\n }\n async next() {\n // This sets this.lastRead to a new Promise right away, as opposed to\n // saying `await this.lastRead; this.lastRead = this.serialNext();` which\n // would not work because this.nextRead would be updated only after the\n // promise resolves.\n this.lastRead = this.lastRead.then(() => this.serialNext());\n return this.lastRead;\n }\n async serialNext() {\n while (true) {\n try {\n return await this.upstream.next();\n }\n catch (e) {\n if (!this.handler(e)) {\n return { value: null, done: true };\n }\n // If the handler returns true, loop and fetch the next upstream item.\n // If the upstream iterator throws an endless stream of errors, and if\n // the handler says to ignore them, then we loop forever here. That is\n // the correct behavior-- it's up to the handler to decide when to stop.\n }\n }\n }\n}\nclass AsyncMapIterator extends LazyIterator {\n constructor(upstream, transform) {\n super();\n this.upstream = upstream;\n this.transform = transform;\n }\n summary() {\n return `${this.upstream.summary()} -> AsyncMap`;\n }\n async next() {\n const item = await this.upstream.next();\n if (item.done) {\n return { value: null, done: true };\n }\n const inputTensors = tf.tensor_util.getTensorsInContainer(item.value);\n // Careful: the transform may mutate the item in place.\n // That's why we have to remember the input Tensors above, and then\n // below dispose only those that were not passed through to the output.\n // Note too that the transform function is responsible for tidying\n // any intermediate Tensors. Here we are concerned only about the\n // inputs.\n const mapped = await this.transform(item.value);\n const outputTensors = tf.tensor_util.getTensorsInContainer(mapped);\n // TODO(soergel) faster intersection\n // TODO(soergel) move to tf.disposeExcept(in, out)?\n for (const t of inputTensors) {\n if (!tf.tensor_util.isTensorInList(t, outputTensors)) {\n t.dispose();\n }\n }\n return { value: mapped, done: false };\n }\n}\n// Iterators that maintain a queue of pending items\n// ============================================================================\n/**\n * A base class for transforming streams that operate by maintaining an\n * output queue of elements that are ready to return via next(). This is\n * commonly required when the transformation is 1-to-many: A call to next()\n * may trigger a call to the underlying stream, which will produce many\n * mapped elements of this stream-- of which we need to return only one, so\n * we have to queue the rest.\n */\nexport class OneToManyIterator extends LazyIterator {\n constructor() {\n super();\n this.outputQueue = new GrowingRingBuffer();\n this.lastRead = Promise.resolve({ value: null, done: false });\n }\n async next() {\n // This sets this.lastRead to a new Promise right away, as opposed to\n // saying `await this.lastRead; this.lastRead = this.serialNext();` which\n // would not work because this.nextRead would be updated only after the\n // promise resolves.\n this.lastRead = this.lastRead.then(() => this.serialNext());\n return this.lastRead;\n }\n async serialNext() {\n // Fetch so that the queue contains at least one item if possible.\n // If the upstream source is exhausted, AND there are no items left in\n // the output queue, then this stream is also exhausted.\n while (this.outputQueue.length() === 0) {\n // TODO(soergel): consider parallel reads.\n if (!await this.pump()) {\n return { value: null, done: true };\n }\n }\n return { value: this.outputQueue.shift(), done: false };\n }\n}\nclass FlatmapIterator extends OneToManyIterator {\n constructor(upstream, transform) {\n super();\n this.upstream = upstream;\n this.transform = transform;\n }\n summary() {\n return `${this.upstream.summary()} -> Flatmap`;\n }\n async pump() {\n const item = await this.upstream.next();\n if (item.done) {\n return false;\n }\n const inputTensors = tf.tensor_util.getTensorsInContainer(item.value);\n // Careful: the transform may mutate the item in place.\n // that's why we have to remember the input Tensors above, and then\n // below dispose only those that were not passed through to the output.\n // Note too that the transform function is responsible for tidying any\n // intermediate Tensors. Here we are concerned only about the inputs.\n const mappedArray = this.transform(item.value);\n const outputTensors = tf.tensor_util.getTensorsInContainer(mappedArray);\n this.outputQueue.pushAll(mappedArray);\n // TODO(soergel) faster intersection, and deduplicate outputTensors\n // TODO(soergel) move to tf.disposeExcept(in, out)?\n for (const t of inputTensors) {\n if (!tf.tensor_util.isTensorInList(t, outputTensors)) {\n t.dispose();\n }\n }\n return true;\n }\n}\n/**\n * Provides a `LazyIterator` that concatenates a stream of underlying\n * streams.\n *\n * Doing this in a concurrency-safe way requires some trickery. In\n * particular, we want this stream to return the elements from the\n * underlying streams in the correct order according to when next() was\n * called, even if the resulting Promises resolve in a different order.\n */\nexport class ChainedIterator extends LazyIterator {\n constructor(iterators, baseErrorHandler) {\n super();\n this.baseErrorHandler = baseErrorHandler;\n // Strict Promise execution order:\n // a next() call may not even begin until the previous one completes.\n this.lastRead = null;\n // Local state that should not be clobbered by out-of-order execution.\n this.iterator = null;\n this.moreIterators = iterators;\n }\n summary() {\n const upstreamSummaries = 'TODO: fill in upstream of chained summaries';\n return `${upstreamSummaries} -> Chained`;\n }\n async next() {\n this.lastRead = this.readFromChain(this.lastRead);\n return this.lastRead;\n }\n async readFromChain(lastRead) {\n // Must await on the previous read since the previous read may have advanced\n // the stream of streams, from which we need to read.\n // This is unfortunate since we can't parallelize reads. Which means\n // prefetching of chained streams is a no-op.\n // One solution is to prefetch immediately upstream of this.\n await lastRead;\n if (this.iterator == null) {\n const iteratorResult = await this.moreIterators.next();\n if (iteratorResult.done) {\n // No more streams to stream from.\n return { value: null, done: true };\n }\n this.iterator = iteratorResult.value;\n if (this.baseErrorHandler != null) {\n this.iterator = this.iterator.handleErrors(this.baseErrorHandler);\n }\n }\n const itemResult = await this.iterator.next();\n if (itemResult.done) {\n this.iterator = null;\n return this.readFromChain(lastRead);\n }\n return itemResult;\n }\n}\nexport var ZipMismatchMode;\n(function (ZipMismatchMode) {\n ZipMismatchMode[ZipMismatchMode[\"FAIL\"] = 0] = \"FAIL\";\n ZipMismatchMode[ZipMismatchMode[\"SHORTEST\"] = 1] = \"SHORTEST\";\n ZipMismatchMode[ZipMismatchMode[\"LONGEST\"] = 2] = \"LONGEST\"; // use nulls for exhausted streams; use up the longest stream.\n})(ZipMismatchMode || (ZipMismatchMode = {}));\n/**\n * Provides a `LazyIterator` that zips together an array, dict, or nested\n * structure of `LazyIterator`s (and perhaps additional constants).\n *\n * The underlying streams must provide elements in a consistent order such\n * that they correspond.\n *\n * Typically, the underlying streams should have the same number of\n * elements. If they do not, the behavior is determined by the\n * `mismatchMode` argument.\n *\n * The nested structure of the `iterators` argument determines the\n * structure of elements in the resulting iterator.\n *\n * Doing this in a concurrency-safe way requires some trickery. In\n * particular, we want this stream to return the elements from the\n * underlying streams in the correct order according to when next() was\n * called, even if the resulting Promises resolve in a different order.\n *\n * @param iterators: An array or object containing LazyIterators at the\n * leaves.\n * @param mismatchMode: Determines what to do when one underlying iterator\n * is exhausted before the others. `ZipMismatchMode.FAIL` (the default)\n * causes an error to be thrown in this case. `ZipMismatchMode.SHORTEST`\n * causes the zipped iterator to terminate with the furst underlying\n * streams, so elements remaining on the longer streams are ignored.\n * `ZipMismatchMode.LONGEST` causes the zipped stream to continue, filling\n * in nulls for the exhausted streams, until all streams are exhausted.\n */\nclass ZipIterator extends LazyIterator {\n constructor(iterators, mismatchMode = ZipMismatchMode.FAIL) {\n super();\n this.iterators = iterators;\n this.mismatchMode = mismatchMode;\n this.count = 0;\n this.currentPromise = null;\n }\n summary() {\n const upstreamSummaries = 'TODO: fill in upstream of zip summaries';\n return `{${upstreamSummaries}} -> Zip`;\n }\n async nextState(afterState) {\n // This chaining ensures that the underlying next() are not even called\n // before the previous ones have resolved.\n await afterState;\n // Collect underlying iterator \"done\" signals as a side effect in\n // getNext()\n let numIterators = 0;\n let iteratorsDone = 0;\n function getNext(container) {\n if (container instanceof LazyIterator) {\n const result = container.next();\n return {\n value: result.then(x => {\n numIterators++;\n if (x.done) {\n iteratorsDone++;\n }\n return x.value;\n }),\n recurse: false\n };\n }\n else {\n return { value: null, recurse: true };\n }\n }\n const mapped = await deepMapAndAwaitAll(this.iterators, getNext);\n if (numIterators === iteratorsDone) {\n // The streams have all ended.\n return { value: null, done: true };\n }\n if (iteratorsDone > 0) {\n switch (this.mismatchMode) {\n case ZipMismatchMode.FAIL:\n throw new Error('Zipped streams should have the same length. ' +\n `Mismatched at element ${this.count}.`);\n case ZipMismatchMode.SHORTEST:\n return { value: null, done: true };\n case ZipMismatchMode.LONGEST:\n default:\n // Continue. The exhausted streams already produced value: null.\n }\n }\n this.count++;\n return { value: mapped, done: false };\n }\n async next() {\n this.currentPromise = this.nextState(this.currentPromise);\n return this.currentPromise;\n }\n}\n// Iterators that maintain a ring buffer of pending promises\n// ============================================================================\n/**\n * A stream that prefetches a given number of items from an upstream source,\n * returning them in FIFO order.\n *\n * Note this prefetches Promises, but makes no guarantees about when those\n * Promises resolve.\n */\nexport class PrefetchIterator extends LazyIterator {\n constructor(upstream, bufferSize) {\n super();\n this.upstream = upstream;\n this.bufferSize = bufferSize;\n this.buffer = new RingBuffer(bufferSize);\n }\n summary() {\n return `${this.upstream.summary()} -> Prefetch`;\n }\n /**\n * Refill the prefetch buffer. Returns only after the buffer is full, or\n * the upstream source is exhausted.\n */\n refill() {\n while (!this.buffer.isFull()) {\n const v = this.upstream.next();\n this.buffer.push(v);\n }\n }\n next() {\n this.refill();\n // This shift will never throw an error because the buffer is always\n // full after a refill. If the stream is exhausted, the buffer will be\n // full of Promises that will resolve to the end-of-stream signal.\n return this.buffer.shift();\n }\n}\n/**\n * A stream that performs a sliding-window random shuffle on an upstream\n * source. This is like a `PrefetchIterator` except that the items are\n * returned in randomized order. Mixing naturally improves as the buffer\n * size increases.\n */\nexport class ShuffleIterator extends PrefetchIterator {\n constructor(upstream, windowSize, seed) {\n super(upstream, windowSize);\n this.upstream = upstream;\n this.windowSize = windowSize;\n // Local state that should not be clobbered by out-of-order execution.\n this.upstreamExhausted = false;\n this.random = seedrandom.alea(seed || tf.util.now().toString());\n this.lastRead = Promise.resolve({ value: null, done: false });\n }\n async next() {\n // This sets this.lastRead to a new Promise right away, as opposed to\n // saying `await this.lastRead; this.lastRead = this.serialNext();` which\n // would not work because this.nextRead would be updated only after the\n // promise resolves.\n this.lastRead = this.lastRead.then(() => this.serialNext());\n return this.lastRead;\n }\n randomInt(max) {\n return Math.floor(this.random() * max);\n }\n chooseIndex() {\n return this.randomInt(this.buffer.length());\n }\n async serialNext() {\n // TODO(soergel): consider performance\n if (!this.upstreamExhausted) {\n this.refill();\n }\n while (!this.buffer.isEmpty()) {\n const chosenIndex = this.chooseIndex();\n const result = await this.buffer.shuffleExcise(chosenIndex);\n if (result.done) {\n this.upstreamExhausted = true;\n }\n else {\n this.refill();\n return result;\n }\n }\n return { value: null, done: true };\n }\n}\n//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibGF6eV9pdGVyYXRvci5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uLy4uL3RmanMtZGF0YS9zcmMvaXRlcmF0b3JzL2xhenlfaXRlcmF0b3IudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUE7Ozs7Ozs7Ozs7Ozs7Ozs7R0FnQkc7QUFFSCxPQUFPLEtBQUssRUFBRSxNQUFNLHVCQUF1QixDQUFDO0FBQzVDLE9BQU8sS0FBSyxVQUFVLE1BQU0sWUFBWSxDQUFDO0FBR3pDLE9BQU8sRUFBQyxTQUFTLEVBQUMsTUFBTSxvQkFBb0IsQ0FBQztBQUM3QyxPQUFPLEVBQUMsa0JBQWtCLEVBQXFDLE9BQU8sRUFBRSxTQUFTLEVBQUMsTUFBTSxrQkFBa0IsQ0FBQztBQUMzRyxPQUFPLEVBQUMsaUJBQWlCLEVBQUMsTUFBTSw2QkFBNkIsQ0FBQztBQUM5RCxPQUFPLEVBQUMsVUFBVSxFQUFDLE1BQU0scUJBQXFCLENBQUM7QUFPL0Msb0RBQW9EO0FBQ3BELGtFQUFrRTtBQUNsRSwwREFBMEQ7QUFFMUQ7O0dBRUc7QUFDSCxNQUFNLFVBQVUsaUJBQWlCLENBQUksS0FBVTtJQUM3QyxPQUFPLElBQUksYUFBYSxDQUFDLEtBQUssQ0FBQyxDQUFDO0FBQ2xDLENBQUM7QUFFRDs7R0FFRztBQUNILE1BQU0sVUFBVSx3QkFBd0IsQ0FBQyxLQUFhO0lBQ3BELElBQUksQ0FBQyxHQUFHLEtBQUssQ0FBQztJQUNkLE9BQU8sb0JBQW9CLENBQUMsR0FBRyxFQUFFLENBQUMsQ0FBQyxFQUFDLEtBQUssRUFBRSxDQUFDLEVBQUUsRUFBRSxJQUFJLEVBQUUsS0FBSyxFQUFDLENBQUMsQ0FBQyxDQUFDO0FBQ2pFLENBQUM7QUFFRDs7Ozs7Ozs7Ozs7O0dBWUc7QUFDSCxNQUFNLFVBQVUsb0JBQW9CLENBQ2hDLElBQ2lEO0lBQ25ELE9BQU8sSUFBSSxvQkFBb0IsQ0FBQyxJQUFJLENBQUMsQ0FBQztBQUN4QyxDQUFDO0FBRUQ7Ozs7Ozs7Ozs7O0dB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QUFDLGlCQUFpQixHQUFHLElBQUksQ0FBQzthQUMvQjtpQkFBTTtnQkFDTCxJQUFJLENBQUMsTUFBTSxFQUFFLENBQUM7Z0JBQ2QsT0FBTyxNQUFNLENBQUM7YUFDZjtTQUNGO1FBQ0QsT0FBTyxFQUFDLEtBQUssRUFBRSxJQUFJLEVBQUUsSUFBSSxFQUFFLElBQUksRUFBQyxDQUFDO0lBQ25DLENBQUM7Q0FDRiIsInNvdXJjZXNDb250ZW50IjpbIi8qKlxuICogQGxpY2Vuc2VcbiAqIENvcHlyaWdodCAyMDE4IEdvb2dsZSBMTEMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuXG4gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgXCJMaWNlbnNlXCIpO1xuICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLlxuICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0XG4gKlxuICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wXG4gKlxuICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZVxuICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gXCJBUyBJU1wiIEJBU0lTLFxuICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuXG4gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kXG4gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS5cbiAqXG4gKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuICovXG5cbmltcG9ydCAqIGFzIHRmIGZyb20gJ0B0ZW5zb3JmbG93L3RmanMtY29yZSc7XG5pbXBvcnQgKiBhcyBzZWVkcmFuZG9tIGZyb20gJ3NlZWRyYW5kb20nO1xuXG5pbXBvcnQge0NvbnRhaW5lcn0gZnJvbSAnLi4vdHlwZXMnO1xuaW1wb3J0IHtkZWVwQ2xvbmV9IGZyb20gJy4uL3V0aWwvZGVlcF9jbG9uZSc7XG5pbXBvcnQge2RlZXBNYXBBbmRBd2FpdEFsbCwgRGVlcE1hcEFzeW5jUmVzdWx0LCBEZWVwTWFwUmVzdWx0LCBkZWVwWmlwLCB6aXBUb0xpc3R9IGZyb20gJy4uL3V0aWwvZGVlcF9tYXAnO1xuaW1wb3J0IHtHcm93aW5nUmluZ0J1ZmZlcn0gZnJvbSAnLi4vdXRpbC9ncm93aW5nX3JpbmdfYnVmZmVyJztcbmltcG9ydCB7UmluZ0J1ZmZlcn0gZnJvbSAnLi4vdXRpbC9yaW5nX2J1ZmZlcic7XG5cbi8qKlxuICogQSBuZXN0ZWQgc3RydWN0dXJlIG9mIExhenlJdGVyYXRvcnMsIHVzZWQgYXMgdGhlIGlucHV0IHRvIHppcCgpLlxuICovXG5leHBvcnQgdHlwZSBJdGVyYXRvckNvbnRhaW5lciA9IENvbnRhaW5lcjxMYXp5SXRlcmF0b3I8dGYuVGVuc29yQ29udGFpbmVyPj47XG5cbi8vIEhlcmUgd2UgaW1wbGVtZW50IGEgc2ltcGxlIGFzeW5jaHJvbm91cyBpdGVyYXRvci5cbi8vIFRoaXMgbGV0cyB1cyBhdm9pZCB1c2luZyBlaXRoZXIgdGhpcmQtcGFydHkgc3RyZWFtIGxpYnJhcmllcyBvclxuLy8gcmVjZW50IFR5cGVTY3JpcHQgbGFuZ3VhZ2Ugc3VwcG9ydCByZXF1aXJpbmcgcG9seWZpbGxzLlxuXG4vKipcbiAqIENyZWF0ZSBhIGBMYXp5SXRlcmF0b3JgIGZyb20gYW4gYXJyYXkgb2YgaXRlbXMuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBpdGVyYXRvckZyb21JdGVtczxUPihpdGVtczogVFtdKTogTGF6eUl0ZXJhdG9yPFQ+IHtcbiAgcmV0dXJuIG5ldyBBcnJheUl0ZXJhdG9yKGl0ZW1zKTtcbn1cblxuLyoqXG4gKiBDcmVhdGUgYSBgTGF6eUl0ZXJhdG9yYCBvZiBpbmNyZW1lbnRpbmcgaW50ZWdlcnMuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBpdGVyYXRvckZyb21JbmNyZW1lbnRpbmcoc3RhcnQ6IG51bWJlcik6IExhenlJdGVyYXRvcjxudW1iZXI+IHtcbiAgbGV0IGkgPSBzdGFydDtcbiAgcmV0dXJuIGl0ZXJhdG9yRnJvbUZ1bmN0aW9uKCgpID0+ICh7dmFsdWU6IGkrKywgZG9uZTogZmFsc2V9KSk7XG59XG5cbi8qKlxuICogQ3JlYXRlIGEgYExhenlJdGVyYXRvcmAgZnJvbSBhIGZ1bmN0aW9uLlxuICpcbiAqIGBgYGpzXG4gKiBsZXQgaSA9IC0xO1xuICogY29uc3QgZnVuYyA9ICgpID0+XG4gKiAgICArK2kgPCA1ID8ge3ZhbHVlOiBpLCBkb25lOiBmYWxzZX0gOiB7dmFsdWU6IG51bGwsIGRvbmU6IHRydWV9O1xuICogY29uc3QgaXRlciA9IHRmLmRhdGEuaXRlcmF0b3JGcm9tRnVuY3Rpb24oZnVuYyk7XG4gKiBhd2FpdCBpdGVyLmZvckVhY2hBc3luYyhlID0+IGNvbnNvbGUubG9nKGUpKTtcbiAqIGBgYFxuICpcbiAqIEBwYXJhbSBmdW5jIEEgZnVuY3Rpb24gdGhhdCBwcm9kdWNlcyBkYXRhIG9uIGVhY2ggY2FsbC5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGl0ZXJhdG9yRnJvbUZ1bmN0aW9uPFQ+KFxuICAgIGZ1bmM6ICgpID0+XG4gICAgICAgIEl0ZXJhdG9yUmVzdWx0PFQ+fCBQcm9taXNlPEl0ZXJhdG9yUmVzdWx0PFQ+Pik6IExhenlJdGVyYXRvcjxUPiB7XG4gIHJldHVybiBuZXcgRnVuY3Rpb25DYWxsSXRlcmF0b3IoZnVuYyk7XG59XG5cbi8qKlxuICogQ3JlYXRlIGEgYExhenlJdGVyYXRvcmAgYnkgY29uY2F0ZW5hdGluZyB1bmRlcmx5aW5nIHN0cmVhbXMsIHdoaWNoIGFyZVxuICogdGhlbXNlbHZlcyBwcm92aWRlZCBhcyBhIHN0cmVhbS5cbiAqXG4gKiBUaGlzIGNhbiBhbHNvIGJlIHRob3VnaHQgb2YgYXMgYSBcInN0cmVhbSBmbGF0dGVuXCIgb3BlcmF0aW9uLlxuICpcbiAqIEBwYXJhbSBiYXNlSXRlcmF0b3JzIEEgc3RyZWFtIG9mIHN0cmVhbXMgdG8gYmUgY29uY2F0ZW5hdGVkLlxuICogQHBhcmFtIGJhc2VFcnJvckhhbmRsZXIgQW4gb3B0aW9uYWwgZnVuY3Rpb24gdGhhdCBjYW4gaW50ZXJjZXB0IGBFcnJvcmBzXG4gKiAgIHJhaXNlZCBkdXJpbmcgYSBgbmV4dCgpYCBjYWxsIG9uIHRoZSBiYXNlIHN0cmVhbS4gIFRoaXMgZnVuY3Rpb24gY2FuIGRlY2lkZVxuICogICB3aGV0aGVyIHRoZSBlcnJvciBzaG91bGQgYmUgcHJvcGFnYXRlZCwgd2hldGhlciB0aGUgZXJyb3Igc2hvdWxkIGJlXG4gKiAgIGlnbm9yZWQsIG9yIHdoZXRoZXIgdGhlIGJhc2Ugc3RyZWFtIHNob3VsZCBiZSB0ZXJtaW5hdGVkLlxuICovXG5leHBvcnQgZnVuY3Rpb24gaXRlcmF0b3JGcm9tQ29uY2F0ZW5hdGVkPFQ+KFxuICAgIGJhc2VJdGVyYXRvcnM6IExhenlJdGVyYXRvcjxMYXp5SXRlcmF0b3I8VD4+LFxuICAgIGJhc2VFcnJvckhhbmRsZXI/OiAoZTogRXJyb3IpID0+IGJvb2xlYW4pOiBMYXp5SXRlcmF0b3I8VD4ge1xuICByZXR1cm4gbmV3IENoYWluZWRJdGVyYXRvcihiYXNlSXRlcmF0b3JzLCBiYXNlRXJyb3JIYW5kbGVyKTtcbn1cblxuLyoqXG4gKiBDcmVhdGUgYSBgTGF6eUl0ZXJhdG9yYCBieSBjb25jYXRlbmF0aW5nIHN0cmVhbXMgcHJvZHVjZWQgYnkgY2FsbGluZyBhXG4gKiBzdHJlYW0tZ2VuZXJhdGluZyBmdW5jdGlvbiBhIGdpdmVuIG51bWJlciBvZiB0aW1lcy5cbiAqXG4gKiBTaW5jZSBhIGBMYXp5SXRlcmF0b3JgIGlzIHJlYWQtb25jZSwgaXQgY2Fubm90IGJlIHJlcGVhdGVkLCBidXQgdGhpc1xuICogZnVuY3Rpb24gY2FuIGJlIHVzZWQgdG8gYWNoaWV2ZSBhIHNpbWlsYXIgZWZmZWN0OlxuICpcbiAqICAgTGF6eUl0ZXJhdG9yLm9mQ29uY2F0ZW5hdGVkRnVuY3Rpb24oKCkgPT4gbmV3IE15SXRlcmF0b3IoKSwgNik7XG4gKlxuICogQHBhcmFtIGl0ZXJhdG9yRnVuYzogQSBmdW5jdGlvbiB0aGF0IHByb2R1Y2VzIGEgbmV3IHN0cmVhbSBvbiBlYWNoIGNhbGwuXG4gKiBAcGFyYW0gY291bnQ6IFRoZSBudW1iZXIgb2YgdGltZXMgdG8gY2FsbCB0aGUgZnVuY3Rpb24uXG4gKiBAcGFyYW0gYmFzZUVycm9ySGFuZGxlciBBbiBvcHRpb25hbCBmdW5jdGlvbiB0aGF0IGNhbiBpbnRlcmNlcHQgYEVycm9yYHNcbiAqICAgcmFpc2VkIGR1cmluZyBhIGBuZXh0KClgIGNhbGwgb24gdGhlIGJhc2Ugc3RyZWFtLiAgVGhpcyBmdW5jdGlvbiBjYW4gZGVjaWRlXG4gKiAgIHdoZXRoZXIgdGhlIGVycm9yIHNob3VsZCBiZSBwcm9wYWdhdGVkLCB3aGV0aGVyIHRoZSBlcnJvciBzaG91bGQgYmVcbiAqICAgaWdub3JlZCwgb3Igd2hldGhlciB0aGUgYmFzZSBzdHJlYW0gc2hvdWxkIGJlIHRlcm1pbmF0ZWQuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBpdGVyYXRvckZyb21Db25jYXRlbmF0ZWRGdW5jdGlvbjxUPihcbiAgICBpdGVyYXRvckZ1bmM6ICgpID0+IEl0ZXJhdG9yUmVzdWx0PExhenlJdGVyYXRvcjxUPj4sIGNvdW50OiBudW1iZXIsXG4gICAgYmFzZUVycm9ySGFuZGxlcj86IChlOiBFcnJvcikgPT4gYm9vbGVhbik6IExhenlJdGVyYXRvcjxUPiB7XG4gIHJldHVybiBpdGVyYXRvckZyb21Db25jYXRlbmF0ZWQoXG4gICAgICBpdGVyYXRvckZyb21GdW5jdGlvbihpdGVyYXRvckZ1bmMpLnRha2UoY291bnQpLCBiYXNlRXJyb3JIYW5kbGVyKTtcbn1cblxuLyoqXG4gKiBDcmVhdGUgYSBgTGF6eUl0ZXJhdG9yYCBieSB6aXBwaW5nIHRvZ2V0aGVyIGFuIGFycmF5LCBkaWN0LCBvciBuZXN0ZWRcbiAqIHN0cnVjdHVyZSBvZiBgTGF6eUl0ZXJhdG9yYHMgKGFuZCBwZXJoYXBzIGFkZGl0aW9uYWwgY29uc3RhbnRzKS5cbiAqXG4gKiBUaGUgdW5kZXJseWluZyBzdHJlYW1zIG11c3QgcHJvdmlkZSBlbGVtZW50cyBpbiBhIGNvbnNpc3RlbnQgb3JkZXIgc3VjaFxuICogdGhhdCB0aGV5IGNvcnJlc3BvbmQuXG4gKlxuICogVHlwaWNhbGx5LCB0aGUgdW5kZXJseWluZyBzdHJlYW1zIHNob3VsZCBoYXZlIHRoZSBzYW1lIG51bWJlciBvZlxuICogZWxlbWVudHMuIElmIHRoZXkgZG8gbm90LCB0aGUgYmVoYXZpb3IgaXMgZGV0ZXJtaW5lZCBieSB0aGVcbiAqIGBtaXNtYXRjaE1vZGVgIGFyZ3VtZW50LlxuICpcbiAqIFRoZSBuZXN0ZWQgc3RydWN0dXJlIG9mIHRoZSBgaXRlcmF0b3JzYCBhcmd1bWVudCBkZXRlcm1pbmVzIHRoZVxuICogc3RydWN0dXJlIG9mIGVsZW1lbnRzIGluIHRoZSByZXN1bHRpbmcgaXRlcmF0b3IuXG4gKlxuICogQHBhcmFtIGl0ZXJhdG9yczogQW4gYXJyYXkgb3Igb2JqZWN0IGNvbnRhaW5pbmcgTGF6eUl0ZXJhdG9ycyBhdCB0aGVcbiAqIGxlYXZlcy5cbiAqIEBwYXJhbSBtaXNtYXRjaE1vZGU6IERldGVybWluZXMgd2hhdCB0byBkbyB3aGVuIG9uZSB1bmRlcmx5aW5nIGl0ZXJhdG9yXG4gKiBpcyBleGhhdXN0ZWQgYmVmb3JlIHRoZSBvdGhlcnMuICBgWmlwTWlzbWF0Y2hNb2RlLkZBSUxgICh0aGUgZGVmYXVsdClcbiAqIGNhdXNlcyBhbiBlcnJvciB0byBiZSB0aHJvd24gaW4gdGhpcyBjYXNlLiAgYFppcE1pc21hdGNoTW9kZS5TSE9SVEVTVGBcbiAqIGNhdXNlcyB0aGUgemlwcGVkIGl0ZXJhdG9yIHRvIHRlcm1pbmF0ZSB3aXRoIHRoZSBmdXJzdCB1bmRlcmx5aW5nXG4gKiBzdHJlYW1zLCBzbyBlbGVtZW50cyByZW1haW5pbmcgb24gdGhlIGxvbmdlciBzdHJlYW1zIGFyZSBpZ25vcmVkLlxuICogYFppcE1pc21hdGNoTW9kZS5MT05HRVNUYCBjYXVzZXMgdGhlIHppcHBlZCBzdHJlYW0gdG8gY29udGludWUsIGZpbGxpbmdcbiAqIGluIG51bGxzIGZvciB0aGUgZXhoYXVzdGVkIHN0cmVhbXMsIHVudGlsIGFsbCBzdHJlYW1zIGFyZSBleGhhdXN0ZWQuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBpdGVyYXRvckZyb21aaXBwZWQ8TyBleHRlbmRzIHRmLlRlbnNvckNvbnRhaW5lcj4oXG4gICAgaXRlcmF0b3JzOiBJdGVyYXRvckNvbnRhaW5lcixcbiAgICBtaXNtYXRjaE1vZGU6IFppcE1pc21hdGNoTW9kZSA9IFppcE1pc21hdGNoTW9kZS5GQUlMKTogTGF6eUl0ZXJhdG9yPE8+IHtcbiAgcmV0dXJuIG5ldyBaaXBJdGVyYXRvcjxPPihpdGVyYXRvcnMsIG1pc21hdGNoTW9kZSk7XG59XG5cbi8qKlxuICogQW4gYXN5bmNocm9ub3VzIGl0ZXJhdG9yLCBwcm92aWRpbmcgbGF6eSBhY2Nlc3MgdG8gYSBwb3RlbnRpYWxseVxuICogdW5ib3VuZGVkIHN0cmVhbSBvZiBlbGVtZW50cy5cbiAqXG4gKiBJdGVyYXRvciBjYW4gYmUgb2J0YWluZWQgZnJvbSBhIGRhdGFzZXQ6XG4gKiBgY29uc3QgaXRlciA9IGF3YWl0IGRhdGFzZXQuaXRlcmF0b3IoKTtgXG4gKi9cbmV4cG9ydCBhYnN0cmFjdCBjbGFzcyBMYXp5SXRlcmF0b3I8VD4ge1xuICAvLyBUaGlzIGNsYXNzIGltcGxlbWVudHMgQXN5bmNJdGVyYXRvcjxUPiwgYnV0IHdlIGhhdmUgbm90IHlldCBzZXQgdGhlXG4gIC8vIFR5cGVTY3JpcHQgLS1kb3dubGV2ZWxJdGVyYXRpb24gZmxhZyB0byBlbmFibGUgdGhhdC5cblxuICBhYnN0cmFjdCBzdW1tYXJ5KCk6IHN0cmluZztcblxuICAvKipcbiAgICogUmV0dXJucyBhIGBQcm9taXNlYCBmb3IgdGhlIG5leHQgZWxlbWVudCBpbiB0aGUgc3RyZWFtLlxuICAgKlxuICAgKiBXaGVuIGFuIGl0ZW0gY2FuIGJlIHByb3ZpZGVkIHN1Y2Nlc3NmdWxseSwgdGhlIHJldHVybiB2YWx1ZSBpc1xuICAgKiBge3ZhbHVlOlQsIGRvbmU6ZmFsc2V9YC5cbiAgICpcbiAgICogQ2FsbGluZyBuZXh0KCkgb24gYSBjbG9zZWQgc3RyZWFtIHJldHVybnMgYHt2YWx1ZTpudWxsLCBkb25lOnRydWV9YC5cbiAgICovXG4gIGFic3RyYWN0IGFzeW5jIG5leHQoKTogUHJvbWlzZTxJdGVyYXRvclJlc3VsdDxUPj47XG5cbiAgLyoqXG4gICAqIENvbGxlY3QgYWxsIHJlbWFpbmluZyBlbGVtZW50cyBvZiBhIGJvdW5kZWQgc3RyZWFtIGludG8gYW4gYXJyYXkuXG4gICAqIE9idmlvdXNseSB0aGlzIHdpbGwgc3VjY2VlZCBvbmx5IGZvciBzbWFsbCBzdHJlYW1zIHRoYXQgZml0IGluIG1lbW9yeS5cbiAgICogVXNlZnVsIGZvciB0ZXN0aW5nLlxuICAgKlxuICAgKiBAcmV0dXJucyBBIFByb21pc2UgZm9yIGFuIGFycmF5IG9mIHN0cmVhbSBlbGVtZW50cywgd2hpY2ggd2lsbCByZXNvbHZlXG4gICAqICAgd2hlbiB0aGUgc3RyZWFtIGlzIGV4aGF1c3RlZC5cbiAgICovXG4gIGFzeW5jIHRvQXJyYXkoKTogUHJvbWlzZTxUW10+IHtcbiAgICBjb25zdCByZXN1bHQ6IFRbXSA9IFtdO1xuICAgIGxldCB4ID0gYXdhaXQgdGhpcy5uZXh0KCk7XG4gICAgd2hpbGUgKCF4LmRvbmUpIHtcbiAgICAgIHJlc3VsdC5wdXNoKHgudmFsdWUpO1xuICAgICAgeCA9IGF3YWl0IHRoaXMubmV4dCgpO1xuICAgIH1cbiAgICByZXR1cm4gcmVzdWx0O1xuICB9XG5cbiAgLyoqXG4gICAqIENvbGxlY3QgYWxsIGVsZW1lbnRzIG9mIHRoaXMgZGF0YXNldCBpbnRvIGFuIGFycmF5IHdpdGggcHJlZmV0Y2hpbmcgMTAwXG4gICAqIGVsZW1lbnRzLiBUaGlzIGlzIHVzZWZ1bCBmb3IgdGVzdGluZywgYmVjYXVzZSB0aGUgcHJlZmV0Y2ggY2hhbmdlcyB0aGVcbiAgICogb3JkZXIgaW4gd2hpY2ggdGhlIFByb21pc2VzIGFyZSByZXNvbHZlZCBhbG9uZyB0aGUgcHJvY2Vzc2luZyBwaXBlbGluZS5cbiAgICogVGhpcyBtYXkgaGVscCBleHBvc2UgYnVncyB3aGVyZSByZXN1bHRzIGFyZSBkZXBlbmRlbnQgb24gdGhlIG9yZGVyIG9mXG4gICAqIFByb21pc2UgcmVzb2x1dGlvbiByYXRoZXIgdGhhbiBvbiB0aGUgbG9naWNhbCBvcmRlciBvZiB0aGUgc3RyZWFtIChpLmUuLFxuICAgKiBkdWUgdG8gaGlkZGVuIG11dGFibGUgc3RhdGUpLlxuICAgKlxuICAgKiBAcmV0dXJucyBBIFByb21pc2UgZm9yIGFuIGFycmF5IG9mIHN0cmVhbSBlbGVtZW50cywgd2hpY2ggd2lsbCByZXNvbHZlXG4gICAqICAgd2hlbiB0aGUgc3RyZWFtIGlzIGV4aGF1c3RlZC5cbiAgICovXG4gIGFzeW5jIHRvQXJyYXlGb3JUZXN0KCk6IFByb21pc2U8VFtdPiB7XG4gICAgY29uc3Qgc3RyZWFtID0gdGhpcy5wcmVmZXRjaCgxMDApO1xuICAgIGNvbnN0IHJlc3VsdDogVFtdID0gW107XG4gICAgbGV0IHggPSBhd2FpdCBzdHJlYW0ubmV4dCgpO1xuICAgIHdoaWxlICgheC5kb25lKSB7XG4gICAgICByZXN1bHQucHVzaCh4LnZhbHVlKTtcbiAgICAgIHggPSBhd2FpdCBzdHJlYW0ubmV4dCgpO1xuICAgIH1cbiAgICByZXR1cm4gcmVzdWx0O1xuICB9XG5cbiAgLyoqXG4gICAqIERyYXcgaXRlbXMgZnJvbSB0aGUgc3RyZWFtIHVudGlsIGl0IGlzIGV4aGF1c3RlZC5cbiAgICpcbiAgICogVGhpcyBjYW4gYmUgdXNlZnVsIHdoZW4gdGhlIHN0cmVhbSBoYXMgc2lkZSBlZmZlY3RzIGJ1dCBubyBvdXRwdXQuICBJblxuICAgKiB0aGF0IGNhc2UsIGNhbGxpbmcgdGhpcyBmdW5jdGlvbiBndWFyYW50ZWVzIHRoYXQgdGhlIHN0cmVhbSB3aWxsIGJlXG4gICAqIGZ1bGx5IHByb2Nlc3NlZC5cbiAgICovXG4gIGFzeW5jIHJlc29sdmVGdWxseSgpOiBQcm9taXNlPHZvaWQ+IHtcbiAgICBsZXQgeCA9IGF3YWl0IHRoaXMubmV4dCgpO1xuICAgIHdoaWxlICgheC5kb25lKSB7XG4gICAgICB4ID0gYXdhaXQgdGhpcy5uZXh0KCk7XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIERyYXcgaXRlbXMgZnJvbSB0aGUgc3RyZWFtIHVudGlsIGl0IGlzIGV4aGF1c3RlZCwgb3IgYSBwcmVkaWNhdGUgZmFpbHMuXG4gICAqXG4gICAqIFRoaXMgY2FuIGJlIHVzZWZ1bCB3aGVuIHRoZSBzdHJlYW0gaGFzIHNpZGUgZWZmZWN0cyBidXQgbm8gb3V0cHV0LiAgSW5cbiAgICogdGhhdCBjYXNlLCBjYWxsaW5nIHRoaXMgZnVuY3Rpb24gZ3VhcmFudGVlcyB0aGF0IHRoZSBzdHJlYW0gd2lsbCBiZVxuICAgKiBmdWxseSBwcm9jZXNzZWQuXG4gICAqL1xuICBhc3luYyByZXNvbHZlV2hpbGUocHJlZGljYXRlOiAocjogVCkgPT4gYm9vbGVhbik6IFByb21pc2U8dm9pZD4ge1xuICAgIGxldCB4ID0gYXdhaXQgdGhpcy5uZXh0KCk7XG4gICAgbGV0IHNob3VsZENvbnRpbnVlID0gcHJlZGljYXRlKHgudmFsdWUpO1xuICAgIHdoaWxlICgoIXguZG9uZSkgJiYgc2hvdWxkQ29udGludWUpIHtcbiAgICAgIHggPSBhd2FpdCB0aGlzLm5leHQoKTtcbiAgICAgIHNob3VsZENvbnRpbnVlID0gcHJlZGljYXRlKHgudmFsdWUpO1xuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBIYW5kbGVzIGVycm9ycyB0aHJvd24gb24gdGhpcyBzdHJlYW0gdXNpbmcgYSBwcm92aWRlZCBoYW5kbGVyIGZ1bmN0aW9uLlxuICAgKlxuICAgKiBAcGFyYW0gaGFuZGxlciBBIGZ1bmN0aW9uIHRoYXQgaGFuZGxlcyBhbnkgYEVycm9yYCB0aHJvd24gZHVyaW5nIGEgYG5leHQoKWBcbiAgICogICBjYWxsIGFuZCByZXR1cm5zIHRydWUgaWYgdGhlIHN0cmVhbSBzaG91bGQgY29udGludWUgKGRyb3BwaW5nIHRoZSBmYWlsZWRcbiAgICogICBjYWxsKSBvciBmYWxzZSBpZiB0aGUgc3RyZWFtIHNob3VsZCBxdWlldGx5IHRlcm1pbmF0ZS4gIElmIHRoZSBoYW5kbGVyXG4gICAqICAgaXRzZWxmIHRocm93cyAob3IgcmV0aHJvd3MpIGFuIGBFcnJvcmAsIHRoYXQgd2lsbCBiZSBwcm9wYWdhdGVkLlxuICAgKlxuICAgKiBAcmV0dXJucyBBIGBMYXp5SXRlcmF0b3JgIG9mIGVsZW1lbnRzIHBhc3NlZCB0aHJvdWdoIGZyb20gdXBzdHJlYW0sXG4gICAqICAgcG9zc2libHkgZmlsdGVyaW5nIG9yIHRlcm1pbmF0aW5nIG9uIHVwc3RyZWFtIGBuZXh0KClgIGNhbGxzIHRoYXRcbiAgICogICB0aHJvdyBhbiBgRXJyb3JgLlxuICAgKi9cbiAgaGFuZGxlRXJyb3JzKGhhbmRsZXI6IChlcnJvcjogRXJyb3IpID0+IGJvb2xlYW4pOiBMYXp5SXRlcmF0b3I8VD4ge1xuICAgIHJldHVybiBuZXcgRXJyb3JIYW5kbGluZ0xhenlJdGVyYXRvcih0aGlzLCBoYW5kbGVyKTtcbiAgfVxuXG4gIC8vIFRPRE8oc29lcmdlbCk6IEltcGxlbWVudCByZWR1Y2UoKSBldGMuXG5cbiAgLyoqXG4gICAqIEZpbHRlcnMgdGhpcyBzdHJlYW0gYWNjb3JkaW5nIHRvIGBwcmVkaWNhdGVgLlxuICAgKlxuICAgKiBAcGFyYW0gcHJlZGljYXRlIEEgZnVuY3Rpb24gbWFwcGluZyBhIHN0cmVhbSBlbGVtZW50IHRvIGEgYm9vbGVhbiBvciBhXG4gICAqIGBQcm9taXNlYCBmb3Igb25lLlxuICAgKlxuICAgKiBAcmV0dXJucyBBIGBMYXp5SXRlcmF0b3JgIG9mIGVsZW1lbnRzIGZvciB3aGljaCB0aGUgcHJlZGljYXRlIHdhcyB0cnVlLlxuICAgKi9cbiAgZmlsdGVyKHByZWRpY2F0ZTogKHZhbHVlOiBUKSA9PiBib29sZWFuKTogTGF6eUl0ZXJhdG9yPFQ+IHtcbiAgICByZXR1cm4gbmV3IEZpbHRlckl0ZXJhdG9yKHRoaXMsIHByZWRpY2F0ZSk7XG4gIH1cblxuICAvKipcbiAgICogTWFwcyB0aGlzIHN0cmVhbSB0aHJvdWdoIGEgMS10by0xIHRyYW5zZm9ybS5cbiAgICpcbiAgICogQHBhcmFtIHRyYW5zZm9ybSBBIGZ1bmN0aW9uIG1hcHBpbmcgYSBzdHJlYW0gZWxlbWVudCB0byBhIHRyYW5zZm9ybWVkXG4gICAqICAgZWxlbWVudC5cbiAgICpcbiAgICogQHJldHVybnMgQSBgTGF6eUl0ZXJhdG9yYCBvZiB0cmFuc2Zvcm1lZCBlbGVtZW50cy5cbiAgICovXG4gIG1hcDxPPih0cmFuc2Zvcm06ICh2YWx1ZTogVCkgPT4gTyk6IExhenlJdGVyYXRvcjxPPiB7XG4gICAgcmV0dXJuIG5ldyBNYXBJdGVyYXRvcih0aGlzLCB0cmFuc2Zvcm0pO1xuICB9XG5cbiAgLyoqXG4gICAqIE1hcHMgdGhpcyBzdHJlYW0gdGhyb3VnaCBhbiBhc3luYyAxLXRvLTEgdHJhbnNmb3JtLlxuICAgKlxuICAgKiBAcGFyYW0gdHJhbnNmb3JtIEEgZnVuY3Rpb24gbWFwcGluZyBhIHN0cmVhbSBlbGVtZW50IHRvIGEgYFByb21pc2VgIGZvciBhXG4gICAqICAgdHJhbnNmb3JtZWQgc3RyZWFtIGVsZW1lbnQuXG4gICAqXG4gICAqIEByZXR1cm5zIEEgYExhenlJdGVyYXRvcmAgb2YgdHJhbnNmb3JtZWQgZWxlbWVudHMuXG4gICAqL1xuICBtYXBBc3luYzxPPih0cmFuc2Zvcm06ICh2YWx1ZTogVCkgPT4gUHJvbWlzZTxPPik6IExhenlJdGVyYXRvcjxPPiB7XG4gICAgcmV0dXJuIG5ldyBBc3luY01hcEl0ZXJhdG9yKHRoaXMsIHRyYW5zZm9ybSk7XG4gIH1cblxuICAvKipcbiAgICogTWFwcyB0aGlzIHN0cmVhbSB0aHJvdWdoIGEgMS10by0xIHRyYW5zZm9ybSwgZm9yY2luZyBzZXJpYWwgZXhlY3V0aW9uLlxuICAgKlxuICAgKiBAcGFyYW0gdHJhbnNmb3JtIEEgZnVuY3Rpb24gbWFwcGluZyBhIHN0cmVhbSBlbGVtZW50IHRvIGEgdHJhbnNmb3JtZWRcbiAgICogICBlbGVtZW50LlxuICAgKlxuICAgKiBAcmV0dXJucyBBIGBMYXp5SXRlcmF0b3JgIG9mIHRyYW5zZm9ybWVkIGVsZW1lbnRzLlxuICAgKi9cbiAgc2VyaWFsTWFwQXN5bmM8Tz4odHJhbnNmb3JtOiAodmFsdWU6IFQpID0+IFByb21pc2U8Tz4pOiBMYXp5SXRlcmF0b3I8Tz4ge1xuICAgIHJldHVybiBuZXcgQXN5bmNNYXBJdGVyYXRvcih0aGlzLCB0cmFuc2Zvcm0pLnNlcmlhbCgpO1xuICB9XG5cbiAgLyoqXG4gICAqIE1hcHMgdGhpcyBzdHJlYW0gdGhyb3VnaCBhIDEtdG8tbWFueSB0cmFuc2Zvcm0uXG4gICAqXG4gICAqIEBwYXJhbSB0cmFuc2Zvcm0gQSBmdW5jdGlvbiBtYXBwaW5nIGEgc3RyZWFtIGVsZW1lbnQgdG8gYW4gYXJyYXkgb2ZcbiAgICogICB0cmFuc2Zvcm1lZCBlbGVtZW50cy5cbiAgICpcbiAgICogQHJldHVybnMgQSBgRGF0YVN0cmVhbWAgb2YgdHJhbnNmb3JtZWQgZWxlbWVudHMuXG4gICAqL1xuICBmbGF0bWFwPE8+KHRyYW5zZm9ybTogKHZhbHVlOiBUKSA9PiBPW10pOiBMYXp5SXRlcmF0b3I8Tz4ge1xuICAgIHJldHVybiBuZXcgRmxhdG1hcEl0ZXJhdG9yKHRoaXMsIHRyYW5zZm9ybSk7XG4gIH1cblxuICAvKipcbiAgICogQXBwbHkgYSBmdW5jdGlvbiB0byBldmVyeSBlbGVtZW50IG9mIHRoZSBzdHJlYW0uXG4gICAqXG4gICAqIEBwYXJhbSBmIEEgZnVuY3Rpb24gdG8gYXBwbHkgdG8gZWFjaCBzdHJlYW0gZWxlbWVudC5cbiAgICovXG4gIGFzeW5jIGZvckVhY2hBc3luYyhmOiAodmFsdWU6IFQpID0+IHZvaWQpOiBQcm9taXNlPHZvaWQ+IHtcbiAgICByZXR1cm4gdGhpcy5tYXAoZikucmVzb2x2ZUZ1bGx5KCk7XG4gIH1cblxuICAvKipcbiAgICogQXBwbHkgYSBmdW5jdGlvbiB0byBldmVyeSBlbGVtZW50IG9mIHRoZSBzdHJlYW0sIGZvcmNpbmcgc2VyaWFsIGV4ZWN1dGlvbi5cbiAgICpcbiAgICogQHBhcmFtIGYgQSBmdW5jdGlvbiB0byBhcHBseSB0byBlYWNoIHN0cmVhbSBlbGVtZW50LiAgU2hvdWxkIHJldHVybiAndHJ1ZSdcbiAgICogICB0byBpbmRpY2F0ZSB0aGF0IHRoZSBzdHJlYW0gc2hvdWxkIGNvbnRpbnVlLCBvciAnZmFsc2UnIHRvIGNhdXNlIGl0IHRvXG4gICAqICAgdGVybWluYXRlLlxuICAgKi9cbiAgYXN5bmMgc2VyaWFsRm9yRWFjaChmOiAodmFsdWU6IFQpID0+IFByb21pc2U8Ym9vbGVhbj4pOiBQcm9taXNlPHZvaWQ+IHtcbiAgICByZXR1cm4gdGhpcy5zZXJpYWxNYXBBc3luYyhmKS5yZXNvbHZlV2hpbGUoeCA9PiAoeCA9PT0gdHJ1ZSkpO1xuICB9XG5cbiAgLyoqXG4gICAqIEdyb3VwcyBlbGVtZW50cyBpbnRvIGJhdGNoZXMsIHJlcHJlc2VudGVkIGFzIGFycmF5cyBvZiBlbGVtZW50cy5cbiAgICpcbiAgICogV2UgY2FuIHRoaW5rIG9mIHRoZSBlbGVtZW50cyBvZiB0aGlzIGl0ZXJhdG9yIGFzICdyb3dzJyAoZXZlbiBpZiB0aGV5IGFyZVxuICAgKiBuZXN0ZWQgc3RydWN0dXJlcykuICBCeSB0aGUgc2FtZSB0b2tlbiwgY29uc2VjdXRpdmUgdmFsdWVzIGZvciBhIGdpdmVuXG4gICAqIGtleSB3aXRoaW4gdGhlIGVsZW1lbnRzIGZvcm0gYSAnY29sdW1uJy4gIFRoaXMgbWF0Y2hlcyB0aGUgdXN1YWwgc2Vuc2Ugb2ZcbiAgICogJ3JvdycgYW5kICdjb2x1bW4nIHdoZW4gcHJvY2Vzc2luZyB0YWJ1bGFyIGRhdGEgKGUuZy4sIHBhcnNpbmcgYSBDU1YpLlxuICAgKlxuICAgKiBUaHVzLCBcIlJvdy1tYWpvclwiIG1lYW5zIHRoYXQgdGhlIHJlc3VsdGluZyBiYXRjaCBpcyBzaW1wbHkgYSBjb2xsZWN0aW9uIG9mXG4gICAqIHJvd3M6IGBbcm93MSwgcm93Miwgcm93MywgLi4uXWAuICBUaGlzIGlzIGNvbnRyYXN0IHRvIHRoZSBjb2x1bW4tbWFqb3JcbiAgICogZm9ybSwgd2hpY2ggaXMgbmVlZGVkIGZvciB2ZWN0b3JpemVkIGNvbXB1dGF0aW9uLlxuICAgKlxuICAgKiBAcGFyYW0gYmF0Y2hTaXplIFRoZSBudW1iZXIgb2YgZWxlbWVudHMgZGVzaXJlZCBwZXIgYmF0Y2guXG4gICAqIEBwYXJhbSBzbWFsbExhc3RCYXRjaCBXaGV0aGVyIHRvIGVtaXQgdGhlIGZpbmFsIGJhdGNoIHdoZW4gaXQgaGFzIGZld2VyXG4gICAqICAgdGhhbiBiYXRjaFNpemUgZWxlbWVudHMuIERlZmF1bHQgdHJ1ZS5cbiAgICogQHJldHVybnMgQSBgTGF6eUl0ZXJhdG9yYCBvZiBiYXRjaGVzIG9mIGVsZW1lbnRzLCByZXByZXNlbnRlZCBhcyBhcnJheXNcbiAgICogICBvZiB0aGUgb3JpZ2luYWwgZWxlbWVudCB0eXBlLlxuICAgKi9cbiAgcm93TWFqb3JCYXRjaChiYXRjaFNpemU6IG51bWJlciwgc21hbGxMYXN0QmF0Y2ggPSB0cnVlKTogTGF6eUl0ZXJhdG9yPFRbXT4ge1xuICAgIHJldHVybiBuZXcgUm93TWFqb3JCYXRjaEl0ZXJhdG9yKHRoaXMsIGJhdGNoU2l6ZSwgc21hbGxMYXN0QmF0Y2gpO1xuICB9XG5cbiAgLyoqXG4gICAqIEdyb3VwcyBlbGVtZW50cyBpbnRvIGJhdGNoZXMsIHJlcHJlc2VudGVkIGluIGNvbHVtbi1tYWpvciBmb3JtLlxuICAgKlxuICAgKiBXZSBjYW4gdGhpbmsgb2YgdGhlIGVsZW1lbnRzIG9mIHRoaXMgaXRlcmF0b3IgYXMgJ3Jvd3MnIChldmVuIGlmIHRoZXkgYXJlXG4gICAqIG5lc3RlZCBzdHJ1Y3R1cmVzKS4gIEJ5IHRoZSBzYW1lIHRva2VuLCBjb25zZWN1dGl2ZSB2YWx1ZXMgZm9yIGEgZ2l2ZW5cbiAgICoga2V5IHdpdGhpbiB0aGUgZWxlbWVudHMgZm9ybSBhICdjb2x1bW4nLiAgVGhpcyBtYXRjaGVzIHRoZSB1c3VhbCBzZW5zZSBvZlxuICAgKiAncm93JyBhbmQgJ2NvbHVtbicgd2hlbiBwcm9jZXNzaW5nIHRhYnVsYXIgZGF0YSAoZS5nLiwgcGFyc2luZyBhIENTVikuXG4gICAqXG4gICAqIFRodXMsIFwiY29sdW1uLW1ham9yXCIgbWVhbnMgdGhhdCB0aGUgcmVzdWx0aW5nIGJhdGNoIGlzIGEgKHBvdGVudGlhbGx5XG4gICAqIG5lc3RlZCkgc3RydWN0dXJlIHJlcHJlc2VudGluZyB0aGUgY29sdW1ucy4gIEVhY2ggY29sdW1uIGVudHJ5LCB0aGVuLFxuICAgKiBjb250YWlucyBhIGNvbGxlY3Rpb24gb2YgdGhlIHZhbHVlcyBmb3VuZCBpbiB0aGF0IGNvbHVtbiBmb3IgYSByYW5nZSBvZlxuICAgKiBpbnB1dCBlbGVtZW50cy4gIFRoaXMgcmVwcmVzZW50YXRpb24gYWxsb3dzIGZvciB2ZWN0b3JpemVkIGNvbXB1dGF0aW9uLCBpblxuICAgKiBjb250cmFzdCB0byB0aGUgcm93LW1ham9yIGZvcm0uXG4gICAqXG4gICAqIFRoZSBpbnB1dHMgc2hvdWxkIGFsbCBoYXZlIHRoZSBzYW1lIG5lc3RlZCBzdHJ1Y3R1cmUgKGkuZS4sIG9mIGFycmF5cyBhbmRcbiAgICogZGljdHMpLiAgVGhlIHJlc3VsdCBpcyBhIHNpbmdsZSBvYmplY3Qgd2l0aCB0aGUgc2FtZSBuZXN0ZWQgc3RydWN0dXJlLFxuICAgKiB3aGVyZSB0aGUgbGVhdmVzIGFyZSBhcnJheXMgY29sbGVjdGluZyB0aGUgdmFsdWVzIG9mIHRoZSBpbnB1dHMgYXQgdGhhdFxuICAgKiBsb2NhdGlvbiAob3IsIG9wdGlvbmFsbHksIHRoZSByZXN1bHQgb2YgYSBjdXN0b20gZnVuY3Rpb24gYXBwbGllZCB0byB0aG9zZVxuICAgKiBhcnJheXMpLlxuICAgKlxuICAgKiBAcGFyYW0gYmF0Y2hTaXplIFRoZSBudW1iZXIgb2YgZWxlbWVudHMgZGVzaXJlZCBwZXIgYmF0Y2guXG4gICAqIEBwYXJhbSBzbWFsbExhc3RCYXRjaCBXaGV0aGVyIHRvIGVtaXQgdGhlIGZpbmFsIGJhdGNoIHdoZW4gaXQgaGFzIGZld2VyXG4gICAqICAgdGhhbiBiYXRjaFNpemUgZWxlbWVudHMuIERlZmF1bHQgdHJ1ZS5cbiAgICogQHBhcmFtIHppcEZuOiAob3B0aW9uYWwpIEEgZnVuY3Rpb24gdGhhdCBleHBlY3RzIGFuIGFycmF5IG9mIGVsZW1lbnRzIGF0IGFcbiAgICogICBzaW5nbGUgbm9kZSBvZiB0aGUgb2JqZWN0IHRyZWUsIGFuZCByZXR1cm5zIGEgYERlZXBNYXBSZXN1bHRgLiAgVGhlXG4gICAqICAgYERlZXBNYXBSZXN1bHRgIGVpdGhlciBwcm92aWRlcyBhIHJlc3VsdCB2YWx1ZSBmb3IgdGhhdCBub2RlIChpLmUuLFxuICAgKiAgIHJlcHJlc2VudGluZyB0aGUgc3VidHJlZSksIG9yIGluZGljYXRlcyB0aGF0IHRoZSBub2RlIHNob3VsZCBiZSBwcm9jZXNzZWRcbiAgICogICByZWN1cnNpdmVseS4gIFRoZSBkZWZhdWx0IHppcEZuIHJlY3Vyc2VzIGFzIGZhciBhcyBwb3NzaWJsZSBhbmQgcGxhY2VzXG4gICAqICAgYXJyYXlzIGF0IHRoZSBsZWF2ZXMuXG4gICAqIEByZXR1cm5zIEEgYExhenlJdGVyYXRvcmAgb2YgYmF0Y2hlcyBvZiBlbGVtZW50cywgcmVwcmVzZW50ZWQgYXMgYW4gb2JqZWN0XG4gICAqICAgd2l0aCBjb2xsZWN0aW9ucyBhdCB0aGUgbGVhdmVzLlxuICAgKi9cbiAgY29sdW1uTWFqb3JCYXRjaChcbiAgICAgIGJhdGNoU2l6ZTogbnVtYmVyLCBzbWFsbExhc3RCYXRjaCA9IHRydWUsXG4gICAgICAvLyB0c2xpbnQ6ZGlzYWJsZS1uZXh0LWxpbmU6bm8tYW55XG4gICAgICB6aXBGbjogKHhzOiBhbnlbXSkgPT4gRGVlcE1hcFJlc3VsdCA9IHppcFRvTGlzdCk6XG4gICAgICBMYXp5SXRlcmF0b3I8dGYuVGVuc29yQ29udGFpbmVyPiB7XG4gICAgLy8gRmlyc3QgY29sbGVjdCB0aGUgZGVzaXJlZCBudW1iZXIgb2YgaW5wdXQgZWxlbWVudHMgYXMgYSByb3ctbWFqb3IgYmF0Y2guXG4gICAgY29uc3Qgcm93QmF0Y2hlcyA9IHRoaXMucm93TWFqb3JCYXRjaChiYXRjaFNpemUsIHNtYWxsTGFzdEJhdGNoKTtcbiAgICAvLyBOb3cgJ3JvdGF0ZScgb3IgJ3Bpdm90JyB0aGUgZGF0YSwgY29sbGVjdGluZyBhbGwgdmFsdWVzIGZyb20gZWFjaCBjb2x1bW5cbiAgICAvLyBpbiB0aGUgYmF0Y2ggKGkuZS4sIGZvciBlYWNoIGtleSB3aXRoaW4gdGhlIGVsZW1lbnRzKSBpbnRvIGFuIGFycmF5LlxuICAgIHJldHVybiByb3dCYXRjaGVzLm1hcCh4ID0+IGRlZXBaaXAoeCwgemlwRm4pKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBDb25jYXRlbmF0ZSB0aGlzIGBMYXp5SXRlcmF0b3JgIHdpdGggYW5vdGhlci5cbiAgICpcbiAgICogQHBhcmFtIGl0ZXJhdG9yIEEgYExhenlJdGVyYXRvcmAgdG8gYmUgY29uY2F0ZW5hdGVkIG9udG8gdGhpcyBvbmUuXG4gICAqIEBwYXJhbSBiYXNlRXJyb3JIYW5kbGVyIEFuIG9wdGlvbmFsIGZ1bmN0aW9uIHRoYXQgY2FuIGludGVyY2VwdCBgRXJyb3Jgc1xuICAgKiAgIHJhaXNlZCBkdXJpbmcgYSBgbmV4dCgpYCBjYWxsIG9uIHRoZSBiYXNlIHN0cmVhbS4gIFRoaXMgZnVuY3Rpb24gY2FuXG4gICAqICAgZGVjaWRlIHdoZXRoZXIgdGhlIGVycm9yIHNob3VsZCBiZSBwcm9wYWdhdGVkLCB3aGV0aGVyIHRoZSBlcnJvciBzaG91bGRcbiAgICogICBiZSBpZ25vcmVkLCBvciB3aGV0aGVyIHRoZSBiYXNlIHN0cmVhbSBzaG91bGQgYmUgdGVybWluYXRlZC5cbiAgICogQHJldHVybnMgQSBgTGF6eUl0ZXJhdG9yYC5cbiAgICovXG4gIGNvbmNhdGVuYXRlKFxuICAgICAgaXRlcmF0b3I6IExhenlJdGVyYXRvcjxUPixcbiAgICAgIGJhc2VFcnJvckhhbmRsZXI/OiAoZTogRXJyb3IpID0+IGJvb2xlYW4pOiBMYXp5SXRlcmF0b3I8VD4ge1xuICAgIHJldHVybiBuZXcgQ2hhaW5lZEl0ZXJhdG9yKFxuICAgICAgICBpdGVyYXRvckZyb21JdGVtcyhbdGhpcywgaXRlcmF0b3JdKSwgYmFzZUVycm9ySGFuZGxlcik7XG4gIH1cblxuICAvKipcbiAgICogTGltaXRzIHRoaXMgc3RyZWFtIHRvIHJldHVybiBhdCBtb3N0IGBjb3VudGAgaXRlbXMuXG4gICAqXG4gICAqIEBwYXJhbSBjb3VudCBUaGUgbWF4aW11bSBudW1iZXIgb2YgaXRlbXMgdG8gcHJvdmlkZSBmcm9tIHRoZSBzdHJlYW0uIElmXG4gICAqIGEgbmVnYXRpdmUgb3IgdW5kZWZpbmVkIHZhbHVlIGlzIGdpdmVuLCB0aGUgZW50aXJlIHN0cmVhbSBpcyByZXR1cm5lZFxuICAgKiAgIHVuYWx0ZXJlZC5cbiAgICovXG4gIHRha2UoY291bnQ6IG51bWJlcik6IExhenlJdGVyYXRvcjxUPiB7XG4gICAgaWYgKGNvdW50IDwgMCB8fCBjb3VudCA9PSBudWxsKSB7XG4gICAgICByZXR1cm4gdGhpcztcbiAgICB9XG4gICAgcmV0dXJuIG5ldyBUYWtlSXRlcmF0b3IodGhpcywgY291bnQpO1xuICB9XG5cbiAgLyoqXG4gICAqIFNraXBzIHRoZSBmaXJzdCBgY291bnRgIGl0ZW1zIGluIHRoaXMgc3RyZWFtLlxuICAgKlxuICAgKiBAcGFyYW0gY291bnQgVGhlIG51bWJlciBvZiBpdGVtcyB0byBza2lwLiAgSWYgYSBuZWdhdGl2ZSBvciB1bmRlZmluZWRcbiAgICogdmFsdWUgaXMgZ2l2ZW4sIHRoZSBlbnRpcmUgc3RyZWFtIGlzIHJldHVybmVkIHVuYWx0ZXJlZC5cbiAgICovXG4gIHNraXAoY291bnQ6IG51bWJlcik6IExhenlJdGVyYXRvcjxUPiB7XG4gICAgaWYgKGNvdW50IDwgMCB8fCBjb3VudCA9PSBudWxsKSB7XG4gICAgICByZXR1cm4gdGhpcztcbiAgICB9XG4gICAgcmV0dXJuIG5ldyBTa2lwSXRlcmF0b3IodGhpcywgY291bnQpO1xuICB9XG5cbiAgLyoqXG4gICAqIFByZWZldGNoIHRoZSBmaXJzdCBgYnVmZmVyU2l6ZWAgaXRlbXMgaW4gdGhpcyBzdHJlYW0uXG4gICAqXG4gICAqIE5vdGUgdGhpcyBwcmVmZXRjaGVzIFByb21pc2VzLCBidXQgbWFrZXMgbm8gZ3VhcmFudGVlcyBhYm91dCB3aGVuIHRob3NlXG4gICAqIFByb21pc2VzIHJlc29sdmUuXG4gICAqXG4gICAqIEBwYXJhbSBidWZmZXJTaXplOiBBbiBpbnRlZ2VyIHNwZWNpZnlpbmcgdGhlIG51bWJlciBvZiBlbGVtZW50cyB0byBiZVxuICAgKiAgIHByZWZldGNoZWQuXG4gICAqL1xuICBwcmVmZXRjaChidWZmZXJTaXplOiBudW1iZXIpOiBMYXp5SXRlcmF0b3I8VD4ge1xuICAgIHJldHVybiBuZXcgUHJlZmV0Y2hJdGVyYXRvcih0aGlzLCBidWZmZXJTaXplKTtcbiAgfVxuXG4gIC8vIFRPRE8oc29lcmdlbCk6IGRlZXAgc2hhcmRlZCBzaHVmZmxlLCB3aGVyZSBzdXBwb3J0ZWRcblxuICAvKipcbiAgICogUmFuZG9tbHkgc2h1ZmZsZXMgdGhlIGVsZW1lbnRzIG9mIHRoaXMgc3RyZWFtLlxuICAgKlxuICAgKiBAcGFyYW0gYnVmZmVyU2l6ZTogQW4gaW50ZWdlciBzcGVjaWZ5aW5nIHRoZSBudW1iZXIgb2YgZWxlbWVudHMgZnJvbVxuICAgKiB0aGlzIHN0cmVhbSBmcm9tIHdoaWNoIHRoZSBuZXcgc3RyZWFtIHdpbGwgc2FtcGxlLlxuICAgKiBAcGFyYW0gc2VlZDogKE9wdGlvbmFsLikgQW4gaW50ZWdlciBzcGVjaWZ5aW5nIHRoZSByYW5kb20gc2VlZCB0aGF0XG4gICAqIHdpbGwgYmUgdXNlZCB0byBjcmVhdGUgdGhlIGRpc3RyaWJ1dGlvbi5cbiAgICovXG4gIHNodWZmbGUod2luZG93U2l6ZTogbnVtYmVyLCBzZWVkPzogc3RyaW5nKTogTGF6eUl0ZXJhdG9yPFQ+IHtcbiAgICByZXR1cm4gbmV3IFNodWZmbGVJdGVyYXRvcih0aGlzLCB3aW5kb3dTaXplLCBzZWVkKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBGb3JjZSBhbiBpdGVyYXRvciB0byBleGVjdXRlIHNlcmlhbGx5OiBlYWNoIG5leHQoKSBjYWxsIHdpbGwgYXdhaXQgdGhlXG4gICAqIHByaW9yIG9uZSwgc28gdGhhdCB0aGV5IGNhbm5vdCBleGVjdXRlIGNvbmN1cnJlbnRseS5cbiAgICovXG4gIHNlcmlhbCgpOiBMYXp5SXRlcmF0b3I8VD4ge1xuICAgIHJldHVybiBuZXcgU2VyaWFsSXRlcmF0b3IodGhpcyk7XG4gIH1cbn1cblxuLy8gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuLy8gVGhlIGZvbGxvd2luZyBwcml2YXRlIGNsYXNzZXMgc2VydmUgdG8gaW1wbGVtZW50IHRoZSBjaGFpbmFibGUgbWV0aG9kc1xuLy8gb24gTGF6eUl0ZXJhdG9yLiAgVW5mb3J0dW5hdGVseSB0aGV5IGNhbid0IGJlIHBsYWNlZCBpbiBzZXBhcmF0ZSBmaWxlcyxcbi8vIGR1ZSB0byByZXN1bHRpbmcgdHJvdWJsZSB3aXRoIGNpcmN1bGFyIGltcG9ydHMuXG4vLyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG5cbi8vIEl0ZXJhdG9ycyB0aGF0IGp1c3QgZXh0ZW5kIExhenlJdGVyYXRvciBkaXJlY3RseVxuLy8gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuXG5jbGFzcyBBcnJheUl0ZXJhdG9yPFQ+IGV4dGVuZHMgTGF6eUl0ZXJhdG9yPFQ+IHtcbiAgcHJpdmF0ZSB0cmF2ID0gMDtcbiAgY29uc3RydWN0b3IocHJvdGVjdGVkIGl0ZW1zOiBUW10pIHtcbiAgICBzdXBlcigpO1xuICB9XG5cbiAgc3VtbWFyeSgpIHtcbiAgICByZXR1cm4gYEFycmF5IG9mICR7dGhpcy5pdGVtcy5sZW5ndGh9IGl0ZW1zYDtcbiAgfVxuXG4gIGFzeW5jIG5leHQoKTogUHJvbWlzZTxJdGVyYXRvclJlc3VsdDxUPj4ge1xuICAgIGlmICh0aGlzLnRyYXYgPj0gdGhpcy5pdGVtcy5sZW5ndGgpIHtcbiAgICAgIHJldHVybiB7dmFsdWU6IG51bGwsIGRvbmU6IHRydWV9O1xuICAgIH1cbiAgICBjb25zdCBpdGVtID0gdGhpcy5pdGVtc1t0aGlzLnRyYXZdO1xuICAgIHRoaXMudHJhdisrO1xuICAgIHJldHVybiB7dmFsdWU6IGRlZXBDbG9uZShpdGVtKSwgZG9uZTogZmFsc2V9O1xuICB9XG59XG5cbmNsYXNzIEZ1bmN0aW9uQ2FsbEl0ZXJhdG9yPFQ+IGV4dGVuZHMgTGF6eUl0ZXJhdG9yPFQ+IHtcbiAgY29uc3RydWN0b3IoXG4gICAgICBwcm90ZWN0ZWQgbmV4dEZuOiAoKSA9PiBJdGVyYXRvclJlc3VsdDxUPnwgUHJvbWlzZTxJdGVyYXRvclJlc3VsdDxUPj4pIHtcbiAgICBzdXBlcigpO1xuICB9XG5cbiAgc3VtbWFyeSgpIHtcbiAgICByZXR1cm4gYEZ1bmN0aW9uIGNhbGxgO1xuICB9XG5cbiAgYXN5bmMgbmV4dCgpOiBQcm9taXNlPEl0ZXJhdG9yUmVzdWx0PFQ+PiB7XG4gICAgdHJ5IHtcbiAgICAgIHJldHVybiB0aGlzLm5leHRGbigpO1xuICAgIH0gY2F0Y2ggKGUpIHtcbiAgICAgIC8vIE1vZGlmeSB0aGUgZXJyb3IgbWVzc2FnZSBidXQgbGVhdmUgdGhlIHN0YWNrIHRyYWNlIGludGFjdFxuICAgICAgZS5tZXNzYWdlID1cbiAgICAgICAgICBgRXJyb3IgdGhyb3duIHdoaWxlIGl0ZXJhdGluZyB0aHJvdWdoIGEgZGF0YXNldDogJHtlLm1lc3NhZ2V9YDtcbiAgICAgIHRocm93IGU7XG4gICAgfVxuICB9XG59XG5cbmNsYXNzIFNlcmlhbEl0ZXJhdG9yPFQ+IGV4dGVuZHMgTGF6eUl0ZXJhdG9yPFQ+IHtcbiAgLy8gU3RyaWN0IFByb21pc2UgZXhlY3V0aW9uIG9yZGVyOlxuICAvLyBhIG5leHQoKSBjYWxsIG1heSBub3QgZXZlbiBiZWdpbiB1bnRpbCB0aGUgcHJldmlvdXMgb25lIGNvbXBsZXRlcy5cbiAgcHJpdmF0ZSBsYXN0UmVhZDogUHJvbWlzZTxJdGVyYXRvclJlc3VsdDxUPj47XG5cbiAgY29uc3RydWN0b3IocHJvdGVjdGVkIHVwc3RyZWFtOiBMYXp5SXRlcmF0b3I8VD4pIHtcbiAgICBzdXBlcigpO1xuICAgIHRoaXMubGFzdFJlYWQgPSBQcm9taXNlLnJlc29sdmUoe3ZhbHVlOiBudWxsLCBkb25lOiBmYWxzZX0pO1xuICB9XG5cbiAgc3VtbWFyeSgpIHtcbiAgICByZXR1cm4gYCR7dGhpcy51cHN0cmVhbS5zdW1tYXJ5KCl9IC0+IFNlcmlhbGA7XG4gIH1cblxuICBhc3luYyBuZXh0KCk6IFByb21pc2U8SXRlcmF0b3JSZXN1bHQ8VD4+IHtcbiAgICAvLyBUaGlzIHNldHMgdGhpcy5sYXN0UmVhZCB0byBhIG5ldyBQcm9taXNlIHJpZ2h0IGF3YXksIGFzIG9wcG9zZWQgdG9cbiAgICAvLyBzYXlpbmcgYGF3YWl0IHRoaXMubGFzdFJlYWQ7IHRoaXMubGFzdFJlYWQgPSB0aGlzLnNlcmlhbE5leHQoKTtgIHdoaWNoXG4gICAgLy8gd291bGQgbm90IHdvcmsgYmVjYXVzZSB0aGlzLm5leHRSZWFkIHdvdWxkIGJlIHVwZGF0ZWQgb25seSBhZnRlciB0aGVcbiAgICAvLyBwcm9taXNlIHJlc29sdmVzLlxuICAgIHRoaXMubGFzdFJlYWQgPSB0aGlzLmxhc3RSZWFkLnRoZW4oKCkgPT4gdGhpcy5zZXJpYWxOZXh0KCkpO1xuICAgIHJldHVybiB0aGlzLmxhc3RSZWFkO1xuICB9XG5cbiAgcHJpdmF0ZSBhc3luYyBzZXJpYWxOZXh0KCk6IFByb21pc2U8SXRlcmF0b3JSZXN1bHQ8VD4+IHtcbiAgICByZXR1cm4gdGhpcy51cHN0cmVhbS5uZXh0KCk7XG4gIH1cbn1cblxuY2xhc3MgU2tpcEl0ZXJhdG9yPFQ+IGV4dGVuZHMgTGF6eUl0ZXJhdG9yPFQ+IHtcbiAgLy8gU3RyaWN0IFByb21pc2UgZXhlY3V0aW9uIG9yZGVyOlxuICAvLyBhIG5leHQoKSBjYWxsIG1heSBub3QgZXZlbiBiZWdpbiB1bnRpbCB0aGUgcHJldmlvdXMgb25lIGNvbXBsZXRlcy5cbiAgcHJpdmF0ZSBsYXN0UmVhZDogUHJvbWlzZTxJdGVyYXRvclJlc3VsdDxUPj47XG5cbiAgLy8gTG9jYWwgc3RhdGUgdGhhdCBzaG91bGQgbm90IGJlIGNsb2JiZXJlZCBieSBvdXQtb2Ytb3JkZXIgZXhlY3V0aW9uLlxuICBjb3VudCA9IDA7XG5cbiAgY29uc3RydWN0b3IocHJvdGVjdGVkIHVwc3RyZWFtOiBMYXp5SXRlcmF0b3I8VD4sIHByb3RlY3RlZCBtYXhDb3VudDogbnVtYmVyKSB7XG4gICAgc3VwZXIoKTtcbiAgICB0aGlzLmxhc3RSZWFkID0gUHJvbWlzZS5yZXNvbHZlKHt2YWx1ZTogbnVsbCwgZG9uZTogZmFsc2V9KTtcbiAgfVxuXG4gIHN1bW1hcnkoKSB7XG4gICAgcmV0dXJuIGAke3RoaXMudXBzdHJlYW0uc3VtbWFyeSgpfSAtPiBTa2lwYDtcbiAgfVxuXG4gIGFzeW5jIG5leHQoKTogUHJvbWlzZTxJdGVyYXRvclJlc3VsdDxUPj4ge1xuICAgIC8vIFRoaXMgc2V0cyB0aGlzLmxhc3RSZWFkIHRvIGEgbmV3IFByb21pc2UgcmlnaHQgYXdheSwgYXMgb3Bwb3NlZCB0b1xuICAgIC8vIHNheWluZyBgYXdhaXQgdGhpcy5sYXN0UmVhZDsgdGhpcy5sYXN0UmVhZCA9IHRoaXMuc2VyaWFsTmV4dCgpO2Agd2hpY2hcbiAgICAvLyB3b3VsZCBub3Qgd29yayBiZWNhdXNlIHRoaXMubmV4dFJlYWQgd291bGQgYmUgdXBkYXRlZCBvbmx5IGFmdGVyIHRoZVxuICAgIC8vIHByb21pc2UgcmVzb2x2ZXMuXG4gICAgdGhpcy5sYXN0UmVhZCA9IHRoaXMubGFzdFJlYWQudGhlbigoKSA9PiB0aGlzLnNlcmlhbE5leHQoKSk7XG4gICAgcmV0dXJuIHRoaXMubGFzdFJlYWQ7XG4gIH1cblxuICBwcml2YXRlIGFzeW5jIHNlcmlhbE5leHQoKTogUHJvbWlzZTxJdGVyYXRvclJlc3VsdDxUPj4ge1xuICAgIC8vIFRPRE8oc29lcmdlbCk6IGNvbnNpZGVyIHRyYWRlb2ZmcyBvZiByZWFkaW5nIGluIHBhcmFsbGVsLCBlZy5cbiAgICAvLyBjb2xsZWN0aW5nIG5leHQoKSBwcm9taXNlcyBpbiBhbiBBcnJheSBhbmQgdGhlbiB3YWl0aW5nIGZvclxuICAgIC8vIFByb21pc2UuYWxsKCkgb2YgdGhvc2UuIEJlbmVmaXQ6IHBzZXVkby1wYXJhbGxlbCBleGVjdXRpb24uICBEcmF3YmFjazpcbiAgICAvLyBtYXliZSBkZWxheWVkIEdDLlxuICAgIHdoaWxlICh0aGlzLmNvdW50KysgPCB0aGlzLm1heENvdW50KSB7XG4gICAgICBjb25zdCBza2lwcGVkID0gYXdhaXQgdGhpcy51cHN0cmVhbS5uZXh0KCk7XG4gICAgICAvLyBzaG9ydC1jaXJjdWl0IGlmIHVwc3RyZWFtIGlzIGFscmVhZHkgZW1wdHlcbiAgICAgIGlmIChza2lwcGVkLmRvbmUpIHtcbiAgICAgICAgcmV0dXJuIHNraXBwZWQ7XG4gICAgICB9XG4gICAgICB0Zi5kaXNwb3NlKHNraXBwZWQudmFsdWUgYXMge30pO1xuICAgIH1cbiAgICByZXR1cm4gdGhpcy51cHN0cmVhbS5uZXh0KCk7XG4gIH1cbn1cblxuY2xhc3MgVGFrZUl0ZXJhdG9yPFQ+IGV4dGVuZHMgTGF6eUl0ZXJhdG9yPFQ+IHtcbiAgY291bnQgPSAwO1xuICBjb25zdHJ1Y3Rvcihwcm90ZWN0ZWQgdXBzdHJlYW06IExhenlJdGVyYXRvcjxUPiwgcHJvdGVjdGVkIG1heENvdW50OiBudW1iZXIpIHtcbiAgICBzdXBlcigpO1xuICB9XG5cbiAgc3VtbWFyeSgpIHtcbiAgICByZXR1cm4gYCR7dGhpcy51cHN0cmVhbS5zdW1tYXJ5KCl9IC0+IFRha2VgO1xuICB9XG5cbiAgYXN5bmMgbmV4dCgpOiBQcm9taXNlPEl0ZXJhdG9yUmVzdWx0PFQ+PiB7XG4gICAgaWYgKHRoaXMuY291bnQrKyA+PSB0aGlzLm1heENvdW50KSB7XG4gICAgICByZXR1cm4ge3ZhbHVlOiBudWxsLCBkb25lOiB0cnVlfTtcbiAgICB9XG4gICAgcmV0dXJuIHRoaXMudXBzdHJlYW0ubmV4dCgpO1xuICB9XG59XG5cbi8vIE5vdGUgdGhpcyBiYXRjaCBqdXN0IGdyb3VwcyBpdGVtcyBpbnRvIHJvdy13aXNlIGVsZW1lbnQgYXJyYXlzLlxuLy8gUm90YXRpbmcgdGhlc2UgdG8gYSBjb2x1bW4td2lzZSByZXByZXNlbnRhdGlvbiBoYXBwZW5zIG9ubHkgYXQgdGhlIGRhdGFzZXRcbi8vIGxldmVsLlxuY2xhc3MgUm93TWFqb3JCYXRjaEl0ZXJhdG9yPFQ+IGV4dGVuZHMgTGF6eUl0ZXJhdG9yPFRbXT4ge1xuICAvLyBTdHJpY3QgUHJvbWlzZSBleGVjdXRpb24gb3JkZXI6XG4gIC8vIGEgbmV4dCgpIGNhbGwgbWF5IG5vdCBldmVuIGJlZ2luIHVudGlsIHRoZSBwcmV2aW91cyBvbmUgY29tcGxldGVzLlxuICBwcml2YXRlIGxhc3RSZWFkOiBQcm9taXNlPEl0ZXJhdG9yUmVzdWx0PFRbXT4+O1xuXG4gIGNvbnN0cnVjdG9yKFxuICAgICAgcHJvdGVjdGVkIHVwc3RyZWFtOiBMYXp5SXRlcmF0b3I8VD4sIHByb3RlY3RlZCBiYXRjaFNpemU6IG51bWJlcixcbiAgICAgIHByb3RlY3RlZCBlbmFibGVTbWFsbExhc3RCYXRjaCA9IHRydWUpIHtcbiAgICBzdXBlcigpO1xuICAgIHRoaXMubGFzdFJlYWQgPSBQcm9taXNlLnJlc29sdmUoe3ZhbHVlOiBudWxsLCBkb25lOiBmYWxzZX0pO1xuICB9XG5cbiAgc3VtbWFyeSgpIHtcbiAgICByZXR1cm4gYCR7dGhpcy51cHN0cmVhbS5zdW1tYXJ5KCl9IC0+IFJvd01ham9yQmF0Y2hgO1xuICB9XG5cbiAgYXN5bmMgbmV4dCgpOiBQcm9taXNlPEl0ZXJhdG9yUmVzdWx0PFRbXT4+IHtcbiAgICAvLyBUaGlzIHNldHMgdGhpcy5sYXN0UmVhZCB0byBhIG5ldyBQcm9taXNlIHJpZ2h0IGF3YXksIGFzIG9wcG9zZWQgdG9cbiAgICAvLyBzYXlpbmcgYGF3YWl0IHRoaXMubGFzdFJlYWQ7IHRoaXMubGFzdFJlYWQgPSB0aGlzLnNlcmlhbE5leHQoKTtgIHdoaWNoXG4gICAgLy8gd291bGQgbm90IHdvcmsgYmVjYXVzZSB0aGlzLm5leHRSZWFkIHdvdWxkIGJlIHVwZGF0ZWQgb25seSBhZnRlciB0aGVcbiAgICAvLyBwcm9taXNlIHJlc29sdmVzLlxuICAgIHRoaXMubGFzdFJlYWQgPSB0aGlzLmxhc3RSZWFkLnRoZW4oKCkgPT4gdGhpcy5zZXJpYWxOZXh0KCkpO1xuICAgIHJldHVybiB0aGlzLmxhc3RSZWFkO1xuICB9XG5cbiAgcHJpdmF0ZSBhc3luYyBzZXJpYWxOZXh0KCk6IFByb21pc2U8SXRlcmF0b3JSZXN1bHQ8VFtdPj4ge1xuICAgIGNvbnN0IGJhdGNoOiBUW10gPSBbXTtcbiAgICB3aGlsZSAoYmF0Y2gubGVuZ3RoIDwgdGhpcy5iYXRjaFNpemUpIHtcbiAgICAgIGNvbnN0IGl0ZW0gPSBhd2FpdCB0aGlzLnVwc3RyZWFtLm5leHQoKTtcbiAgICAgIGlmIChpdGVtLmRvbmUpIHtcbiAgICAgICAgaWYgKHRoaXMuZW5hYmxlU21hbGxMYXN0QmF0Y2ggJiYgYmF0Y2gubGVuZ3RoID4gMCkge1xuICAgICAgICAgIHJldHVybiB7dmFsdWU6IGJhdGNoLCBkb25lOiBmYWxzZX07XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHt2YWx1ZTogbnVsbCwgZG9uZTogdHJ1ZX07XG4gICAgICB9XG4gICAgICBiYXRjaC5wdXNoKGl0ZW0udmFsdWUpO1xuICAgIH1cbiAgICByZXR1cm4ge3ZhbHVlOiBiYXRjaCwgZG9uZTogZmFsc2V9O1xuICB9XG59XG5cbmNsYXNzIEZpbHRlckl0ZXJhdG9yPFQ+IGV4dGVuZHMgTGF6eUl0ZXJhdG9yPFQ+IHtcbiAgLy8gU3RyaWN0IFByb21pc2UgZXhlY3V0aW9uIG9yZGVyOlxuICAvLyBhIG5leHQoKSBjYWxsIG1heSBub3QgZXZlbiBiZWdpbiB1bnRpbCB0aGUgcHJldmlvdXMgb25lIGNvbXBsZXRlcy5cbiAgcHJpdmF0ZSBsYXN0UmVhZDogUHJvbWlzZTxJdGVyYXRvclJlc3VsdDxUPj47XG5cbiAgY29uc3RydWN0b3IoXG4gICAgICBwcm90ZWN0ZWQgdXBzdHJlYW06IExhenlJdGVyYXRvcjxUPixcbiAgICAgIHByb3RlY3RlZCBwcmVkaWNhdGU6ICh2YWx1ZTogVCkgPT4gYm9vbGVhbikge1xuICAgIHN1cGVyKCk7XG4gICAgdGhpcy5sYXN0UmVhZCA9IFByb21pc2UucmVzb2x2ZSh7dmFsdWU6IG51bGwsIGRvbmU6IGZhbHNlfSk7XG4gIH1cblxuICBzdW1tYXJ5KCkge1xuICAgIHJldHVybiBgJHt0aGlzLnVwc3RyZWFtLnN1bW1hcnkoKX0gLT4gRmlsdGVyYDtcbiAgfVxuXG4gIGFzeW5jIG5leHQoKTogUHJvbWlzZTxJdGVyYXRvclJlc3VsdDxUPj4ge1xuICAgIC8vIFRoaXMgc2V0cyB0aGlzLmxhc3RSZWFkIHRvIGEgbmV3IFByb21pc2UgcmlnaHQgYXdheSwgYXMgb3Bwb3NlZCB0b1xuICAgIC8vIHNheWluZyBgYXdhaXQgdGhpcy5sYXN0UmVhZDsgdGhpcy5sYXN0UmVhZCA9IHRoaXMuc2VyaWFsTmV4dCgpO2Agd2hpY2hcbiAgICAvLyB3b3VsZCBub3Qgd29yayBiZWNhdXNlIHRoaXMubmV4dFJlYWQgd291bGQgYmUgdXBkYXRlZCBvbmx5IGFmdGVyIHRoZVxuICAgIC8vIHByb21pc2UgcmVzb2x2ZXMuXG4gICAgdGhpcy5sYXN0UmVhZCA9IHRoaXMubGFzdFJlYWQudGhlbigoKSA9PiB0aGlzLnNlcmlhbE5leHQoKSk7XG4gICAgcmV0dXJuIHRoaXMubGFzdFJlYWQ7XG4gIH1cblxuICBwcml2YXRlIGFzeW5jIHNlcmlhbE5leHQoKTogUHJvbWlzZTxJdGVyYXRvclJlc3VsdDxUPj4ge1xuICAgIHdoaWxlICh0cnVlKSB7XG4gICAgICBjb25zdCBpdGVtID0gYXdhaXQgdGhpcy51cHN0cmVhbS5uZXh0KCk7XG4gICAgICBpZiAoaXRlbS5kb25lIHx8IHRoaXMucHJlZGljYXRlKGl0ZW0udmFsdWUpKSB7XG4gICAgICAgIHJldHVybiBpdGVtO1xuICAgICAgfVxuICAgICAgdGYuZGlzcG9zZShpdGVtLnZhbHVlIGFzIHt9KTtcbiAgICB9XG4gIH1cbn1cblxuY2xhc3MgTWFwSXRlcmF0b3I8SSwgTz4gZXh0ZW5kcyBMYXp5SXRlcmF0b3I8Tz4ge1xuICBjb25zdHJ1Y3RvcihcbiAgICAgIHByb3RlY3RlZCB1cHN0cmVhbTogTGF6eUl0ZXJhdG9yPEk+LFxuICAgICAgcHJvdGVjdGVkIHRyYW5zZm9ybTogKHZhbHVlOiBJKSA9PiBPKSB7XG4gICAgc3VwZXIoKTtcbiAgfVxuXG4gIHN1bW1hcnkoKSB7XG4gICAgcmV0dXJuIGAke3RoaXMudXBzdHJlYW0uc3VtbWFyeSgpfSAtPiBNYXBgO1xuICB9XG5cbiAgYXN5bmMgbmV4dCgpOiBQcm9taXNlPEl0ZXJhdG9yUmVzdWx0PE8+PiB7XG4gICAgY29uc3QgaXRlbSA9IGF3YWl0IHRoaXMudXBzdHJlYW0ubmV4dCgpO1xuICAgIGlmIChpdGVtLmRvbmUpIHtcbiAgICAgIHJldHVybiB7dmFsdWU6IG51bGwsIGRvbmU6IHRydWV9O1xuICAgIH1cbiAgICBjb25zdCBpbnB1dFRlbnNvcnMgPSB0Zi50ZW5zb3JfdXRpbC5nZXRUZW5zb3JzSW5Db250YWluZXIoaXRlbS52YWx1ZSBhcyB7fSk7XG4gICAgLy8gQ2FyZWZ1bDogdGhlIHRyYW5zZm9ybSBtYXkgbXV0YXRlIHRoZSBpdGVtIGluIHBsYWNlLlxuICAgIC8vIFRoYXQncyB3aHkgd2UgaGF2ZSB0byByZW1lbWJlciB0aGUgaW5wdXQgVGVuc29ycyBhYm92ZSwgYW5kIHRoZW5cbiAgICAvLyBiZWxvdyBkaXNwb3NlIG9ubHkgdGhvc2UgdGhhdCB3ZXJlIG5vdCBwYXNzZWQgdGhyb3VnaCB0byB0aGUgb3V0cHV0LlxuICAgIC8vIE5vdGUgdG9vIHRoYXQgdGhlIHRyYW5zZm9ybSBmdW5jdGlvbiBpcyByZXNwb25zaWJsZSBmb3IgdGlkeWluZ1xuICAgIC8vIGFueSBpbnRlcm1lZGlhdGUgVGVuc29ycy4gIEhlcmUgd2UgYXJlIGNvbmNlcm5lZCBvbmx5IGFib3V0IHRoZVxuICAgIC8vIGlucHV0cy5cbiAgICBjb25zdCBtYXBwZWQgPSB0aGlzLnRyYW5zZm9ybShpdGVtLnZhbHVlKTtcbiAgICBjb25zdCBvdXRwdXRUZW5zb3JzID0gdGYudGVuc29yX3V0aWwuZ2V0VGVuc29yc0luQ29udGFpbmVyKG1hcHBlZCBhcyB7fSk7XG5cbiAgICAvLyBUT0RPKHNvZXJnZWwpIGZhc3RlciBpbnRlcnNlY3Rpb25cbiAgICAvLyBUT0RPKHNvZXJnZWwpIG1vdmUgdG8gdGYuZGlzcG9zZUV4Y2VwdChpbiwgb3V0KT9cbiAgICBmb3IgKGNvbnN0IHQgb2YgaW5wdXRUZW5zb3JzKSB7XG4gICAgICBpZiAoIXRmLnRlbnNvcl91dGlsLmlzVGVuc29ySW5MaXN0KHQsIG91dHB1dFRlbnNvcnMpKSB7XG4gICAgICAgIHQuZGlzcG9zZSgpO1xuICAgICAgfVxuICAgIH1cbiAgICByZXR1cm4ge3ZhbHVlOiBtYXBwZWQsIGRvbmU6IGZhbHNlfTtcbiAgfVxufVxuXG5jbGFzcyBFcnJvckhhbmRsaW5nTGF6eUl0ZXJhdG9yPFQ+IGV4dGVuZHMgTGF6eUl0ZXJhdG9yPFQ+IHtcbiAgY291bnQgPSAwO1xuICBjb25zdHJ1Y3RvcihcbiAgICAgIHByb3RlY3RlZCB1cHN0cmVhbTogTGF6eUl0ZXJhdG9yPFQ+LFxuICAgICAgcHJvdGVjdGVkIGhhbmRsZXI6IChlcnJvcjogRXJyb3IpID0+IGJvb2xlYW4pIHtcbiAgICBzdXBlcigpO1xuICAgIHRoaXMubGFzdFJlYWQgPSBQcm9taXNlLnJlc29sdmUoe3ZhbHVlOiBudWxsLCBkb25lOiBmYWxzZX0pO1xuICB9XG5cbiAgc3VtbWFyeSgpIHtcbiAgICByZXR1cm4gYCR7dGhpcy51cHN0cmVhbS5zdW1tYXJ5KCl9IC0+IGhhbmRsZUVycm9yc2A7XG4gIH1cblxuICAvLyBTdHJpY3QgUHJvbWlzZSBleGVjdXRpb24gb3JkZXI6XG4gIC8vIGEgbmV4dCgpIGNhbGwgbWF5IG5vdCBldmVuIGJlZ2luIHVudGlsIHRoZSBwcmV2aW91cyBvbmUgY29tcGxldGVzLlxuICBwcml2YXRlIGxhc3RSZWFkOiBQcm9taXNlPEl0ZXJhdG9yUmVzdWx0PFQ+PjtcblxuICBhc3luYyBuZXh0KCk6IFByb21pc2U8SXRlcmF0b3JSZXN1bHQ8VD4+IHtcbiAgICAvLyBUaGlzIHNldHMgdGhpcy5sYXN0UmVhZCB0byBhIG5ldyBQcm9taXNlIHJpZ2h0IGF3YXksIGFzIG9wcG9zZWQgdG9cbiAgICAvLyBzYXlpbmcgYGF3YWl0IHRoaXMubGFzdFJlYWQ7IHRoaXMubGFzdFJlYWQgPSB0aGlzLnNlcmlhbE5leHQoKTtgIHdoaWNoXG4gICAgLy8gd291bGQgbm90IHdvcmsgYmVjYXVzZSB0aGlzLm5leHRSZWFkIHdvdWxkIGJlIHVwZGF0ZWQgb25seSBhZnRlciB0aGVcbiAgICAvLyBwcm9taXNlIHJlc29sdmVzLlxuICAgIHRoaXMubGFzdFJlYWQgPSB0aGlzLmxhc3RSZWFkLnRoZW4oKCkgPT4gdGhpcy5zZXJpYWxOZXh0KCkpO1xuICAgIHJldHVybiB0aGlzLmxhc3RSZWFkO1xuICB9XG5cbiAgYXN5bmMgc2VyaWFsTmV4dCgpOiBQcm9taXNlPEl0ZXJhdG9yUmVzdWx0PFQ+PiB7XG4gICAgd2hpbGUgKHRydWUpIHtcbiAgICAgIHRyeSB7XG4gICAgICAgIHJldHVybiBhd2FpdCB0aGlzLnVwc3RyZWFtLm5leHQoKTtcbiAgICAgIH0gY2F0Y2ggKGUpIHtcbiAgICAgICAgaWYgKCF0aGlzLmhhbmRsZXIoZSkpIHtcbiAgICAgICAgICByZXR1cm4ge3ZhbHVlOiBudWxsLCBkb25lOiB0cnVlfTtcbiAgICAgICAgfVxuICAgICAgICAvLyBJZiB0aGUgaGFuZGxlciByZXR1cm5zIHRydWUsIGxvb3AgYW5kIGZldGNoIHRoZSBuZXh0IHVwc3RyZWFtIGl0ZW0uXG5cbiAgICAgICAgLy8gSWYgdGhlIHVwc3RyZWFtIGl0ZXJhdG9yIHRocm93cyBhbiBlbmRsZXNzIHN0cmVhbSBvZiBlcnJvcnMsIGFuZCBpZlxuICAgICAgICAvLyB0aGUgaGFuZGxlciBzYXlzIHRvIGlnbm9yZSB0aGVtLCB0aGVuIHdlIGxvb3AgZm9yZXZlciBoZXJlLiAgVGhhdCBpc1xuICAgICAgICAvLyB0aGUgY29ycmVjdCBiZWhhdmlvci0tIGl0J3MgdXAgdG8gdGhlIGhhbmRsZXIgdG8gZGVjaWRlIHdoZW4gdG8gc3RvcC5cbiAgICAgIH1cbiAgICB9XG4gIH1cbn1cblxuY2xhc3MgQXN5bmNNYXBJdGVyYXRvcjxJLCBPPiBleHRlbmRzIExhenlJdGVyYXRvcjxPPiB7XG4gIGNvbnN0cnVjdG9yKFxuICAgICAgcHJvdGVjdGVkIHVwc3RyZWFtOiBMYXp5SXRlcmF0b3I8ST4sXG4gICAgICBwcm90ZWN0ZWQgdHJhbnNmb3JtOiAodmFsdWU6IEkpID0+IFByb21pc2U8Tz4pIHtcbiAgICBzdXBlcigpO1xuICB9XG5cbiAgc3VtbWFyeSgpIHtcbiAgICByZXR1cm4gYCR7dGhpcy51cHN0cmVhbS5zdW1tYXJ5KCl9IC0+IEFzeW5jTWFwYDtcbiAgfVxuXG4gIGFzeW5jIG5leHQoKTogUHJvbWlzZTxJdGVyYXRvclJlc3VsdDxPPj4ge1xuICAgIGNvbnN0IGl0ZW0gPSBhd2FpdCB0aGlzLnVwc3RyZWFtLm5leHQoKTtcbiAgICBpZiAoaXRlbS5kb25lKSB7XG4gICAgICByZXR1cm4ge3ZhbHVlOiBudWxsLCBkb25lOiB0cnVlfTtcbiAgICB9XG4gICAgY29uc3QgaW5wdXRUZW5zb3JzID0gdGYudGVuc29yX3V0aWwuZ2V0VGVuc29yc0luQ29udGFpbmVyKGl0ZW0udmFsdWUgYXMge30pO1xuICAgIC8vIENhcmVmdWw6IHRoZSB0cmFuc2Zvcm0gbWF5IG11dGF0ZSB0aGUgaXRlbSBpbiBwbGFjZS5cbiAgICAvLyBUaGF0J3Mgd2h5IHdlIGhhdmUgdG8gcmVtZW1iZXIgdGhlIGlucHV0IFRlbnNvcnMgYWJvdmUsIGFuZCB0aGVuXG4gICAgLy8gYmVsb3cgZGlzcG9zZSBvbmx5IHRob3NlIHRoYXQgd2VyZSBub3QgcGFzc2VkIHRocm91Z2ggdG8gdGhlIG91dHB1dC5cbiAgICAvLyBOb3RlIHRvbyB0aGF0IHRoZSB0cmFuc2Zvcm0gZnVuY3Rpb24gaXMgcmVzcG9uc2libGUgZm9yIHRpZHlpbmdcbiAgICAvLyBhbnkgaW50ZXJtZWRpYXRlIFRlbnNvcnMuICBIZXJlIHdlIGFyZSBjb25jZXJuZWQgb25seSBhYm91dCB0aGVcbiAgICAvLyBpbnB1dHMuXG4gICAgY29uc3QgbWFwcGVkID0gYXdhaXQgdGhpcy50cmFuc2Zvcm0oaXRlbS52YWx1ZSk7XG4gICAgY29uc3Qgb3V0cHV0VGVuc29ycyA9IHRmLnRlbnNvcl91dGlsLmdldFRlbnNvcnNJbkNvbnRhaW5lcihtYXBwZWQgYXMge30pO1xuXG4gICAgLy8gVE9ETyhzb2VyZ2VsKSBmYXN0ZXIgaW50ZXJzZWN0aW9uXG4gICAgLy8gVE9ETyhzb2VyZ2VsKSBtb3ZlIHRvIHRmLmRpc3Bvc2VFeGNlcHQoaW4sIG91dCk/XG4gICAgZm9yIChjb25zdCB0IG9mIGlucHV0VGVuc29ycykge1xuICAgICAgaWYgKCF0Zi50ZW5zb3JfdXRpbC5pc1RlbnNvckluTGlzdCh0LCBvdXRwdXRUZW5zb3JzKSkge1xuICAgICAgICB0LmRpc3Bvc2UoKTtcbiAgICAgIH1cbiAgICB9XG4gICAgcmV0dXJuIHt2YWx1ZTogbWFwcGVkLCBkb25lOiBmYWxzZX07XG4gIH1cbn1cblxuLy8gSXRlcmF0b3JzIHRoYXQgbWFpbnRhaW4gYSBxdWV1ZSBvZiBwZW5kaW5nIGl0ZW1zXG4vLyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG5cbi8qKlxuICogQSBiYXNlIGNsYXNzIGZvciB0cmFuc2Zvcm1pbmcgc3RyZWFtcyB0aGF0IG9wZXJhdGUgYnkgbWFpbnRhaW5pbmcgYW5cbiAqIG91dHB1dCBxdWV1ZSBvZiBlbGVtZW50cyB0aGF0IGFyZSByZWFkeSB0byByZXR1cm4gdmlhIG5leHQoKS4gIFRoaXMgaXNcbiAqIGNvbW1vbmx5IHJlcXVpcmVkIHdoZW4gdGhlIHRyYW5zZm9ybWF0aW9uIGlzIDEtdG8tbWFueTogIEEgY2FsbCB0byBuZXh0KClcbiAqIG1heSB0cmlnZ2VyIGEgY2FsbCB0byB0aGUgdW5kZXJseWluZyBzdHJlYW0sIHdoaWNoIHdpbGwgcHJvZHVjZSBtYW55XG4gKiBtYXBwZWQgZWxlbWVudHMgb2YgdGhpcyBzdHJlYW0tLSBvZiB3aGljaCB3ZSBuZWVkIHRvIHJldHVybiBvbmx5IG9uZSwgc29cbiAqIHdlIGhhdmUgdG8gcXVldWUgdGhlIHJlc3QuXG4gKi9cbmV4cG9ydCBhYnN0cmFjdCBjbGFzcyBPbmVUb01hbnlJdGVyYXRvcjxUPiBleHRlbmRzIExhenlJdGVyYXRvcjxUPiB7XG4gIC8vIFN0cmljdCBQcm9taXNlIGV4ZWN1dGlvbiBvcmRlcjpcbiAgLy8gYSBuZXh0KCkgY2FsbCBtYXkgbm90IGV2ZW4gYmVnaW4gdW50aWwgdGhlIHByZXZpb3VzIG9uZSBjb21wbGV0ZXMuXG4gIHByaXZhdGUgbGFzdFJlYWQ6IFByb21pc2U8SXRlcmF0b3JSZXN1bHQ8VD4+O1xuXG4gIC8vIExvY2FsIHN0YXRlIHRoYXQgc2hvdWxkIG5vdCBiZSBjbG9iYmVyZWQgYnkgb3V0LW9mLW9yZGVyIGV4ZWN1dGlvbi5cbiAgcHJvdGVjdGVkIG91dHB1dFF1ZXVlOiBSaW5nQnVmZmVyPFQ+O1xuXG4gIGNvbnN0cnVjdG9yKCkge1xuICAgIHN1cGVyKCk7XG4gICAgdGhpcy5vdXRwdXRRdWV1ZSA9IG5ldyBHcm93aW5nUmluZ0J1ZmZlcjxUPigpO1xuICAgIHRoaXMubGFzdFJlYWQgPSBQcm9taXNlLnJlc29sdmUoe3ZhbHVlOiBudWxsLCBkb25lOiBmYWxzZX0pO1xuICB9XG5cbiAgYXN5bmMgbmV4dCgpOiBQcm9taXNlPEl0ZXJhdG9yUmVzdWx0PFQ+PiB7XG4gICAgLy8gVGhpcyBzZXRzIHRoaXMubGFzdFJlYWQgdG8gYSBuZXcgUHJvbWlzZSByaWdodCBhd2F5LCBhcyBvcHBvc2VkIHRvXG4gICAgLy8gc2F5aW5nIGBhd2FpdCB0aGlzLmxhc3RSZWFkOyB0aGlzLmxhc3RSZWFkID0gdGhpcy5zZXJpYWxOZXh0KCk7YCB3aGljaFxuICAgIC8vIHdvdWxkIG5vdCB3b3JrIGJlY2F1c2UgdGhpcy5uZXh0UmVhZCB3b3VsZCBiZSB1cGRhdGVkIG9ubHkgYWZ0ZXIgdGhlXG4gICAgLy8gcHJvbWlzZSByZXNvbHZlcy5cbiAgICB0aGlzLmxhc3RSZWFkID0gdGhpcy5sYXN0UmVhZC50aGVuKCgpID0+IHRoaXMuc2VyaWFsTmV4dCgpKTtcbiAgICByZXR1cm4gdGhpcy5sYXN0UmVhZDtcbiAgfVxuXG4gIC8qKlxuICAgKiBSZWFkIG9uZSBvciBtb3JlIGNodW5rcyBmcm9tIHVwc3RyZWFtIGFuZCBwcm9jZXNzIHRoZW0sIHBvc3NpYmx5XG4gICAqIHJlYWRpbmcgb3Igd3JpdGluZyBhIGNhcnJ5b3ZlciwgYW5kIGFkZGluZyBwcm9jZXNzZWQgaXRlbXMgdG8gdGhlXG4gICAqIG91dHB1dCBxdWV1ZS4gIE5vdGUgaXQncyBwb3NzaWJsZSB0aGF0IG5vIGl0ZW1zIGFyZSBhZGRlZCB0byB0aGUgcXVldWVcbiAgICogb24gYSBnaXZlbiBwdW1wKCkgY2FsbCwgZXZlbiBpZiB0aGUgdXBzdHJlYW0gc3RyZWFtIGlzIG5vdCBjbG9zZWRcbiAgICogKGUuZy4sIGJlY2F1c2UgaXRlbXMgYXJlIGZpbHRlcmVkKS5cbiAgICpcbiAgICogQHJldHVybiBgdHJ1ZWAgaWYgYW55IGFjdGlvbiB3YXMgdGFrZW4sIGkuZS4gZmV0Y2hpbmcgaXRlbXMgZnJvbSB0aGVcbiAgICogICB1cHN0cmVhbSBzb3VyY2UgT1IgYWRkaW5nIGl0ZW1zIHRvIHRoZSBvdXRwdXQgcXVldWUuICBgZmFsc2VgIGlmIHRoZVxuICAgKiAgIHVwc3RyZWFtIHNvdXJjZSBpcyBleGhhdXN0ZWQgQU5EIG5vdGhpbmcgd2FzIGFkZGVkIHRvIHRoZSBxdWV1ZVxuICAgKiAoaS5lLiwgYW55IHJlbWFpbmluZyBjYXJyeW92ZXIpLlxuICAgKi9cbiAgcHJvdGVjdGVkIGFic3RyYWN0IGFzeW5jIHB1bXAoKTogUHJvbWlzZTxib29sZWFuPjtcblxuICBhc3luYyBzZXJpYWxOZXh0KCk6IFByb21pc2U8SXRlcmF0b3JSZXN1bHQ8VD4+IHtcbiAgICAvLyBGZXRjaCBzbyB0aGF0IHRoZSBxdWV1ZSBjb250YWlucyBhdCBsZWFzdCBvbmUgaXRlbSBpZiBwb3NzaWJsZS5cbiAgICAvLyBJZiB0aGUgdXBzdHJlYW0gc291cmNlIGlzIGV4aGF1c3RlZCwgQU5EIHRoZXJlIGFyZSBubyBpdGVtcyBsZWZ0IGluXG4gICAgLy8gdGhlIG91dHB1dCBxdWV1ZSwgdGhlbiB0aGlzIHN0cmVhbSBpcyBhbHNvIGV4aGF1c3RlZC5cbiAgICB3aGlsZSAodGhpcy5vdXRwdXRRdWV1ZS5sZW5ndGgoKSA9PT0gMCkge1xuICAgICAgLy8gVE9ETyhzb2VyZ2VsKTogY29uc2lkZXIgcGFyYWxsZWwgcmVhZHMuXG4gICAgICBpZiAoIWF3YWl0IHRoaXMucHVtcCgpKSB7XG4gICAgICAgIHJldHVybiB7dmFsdWU6IG51bGwsIGRvbmU6IHRydWV9O1xuICAgICAgfVxuICAgIH1cbiAgICByZXR1cm4ge3ZhbHVlOiB0aGlzLm91dHB1dFF1ZXVlLnNoaWZ0KCksIGRvbmU6IGZhbHNlfTtcbiAgfVxufVxuY2xhc3MgRmxhdG1hcEl0ZXJhdG9yPEksIE8+IGV4dGVuZHMgT25lVG9NYW55SXRlcmF0b3I8Tz4ge1xuICBjb25zdHJ1Y3RvcihcbiAgICAgIHByb3RlY3RlZCB1cHN0cmVhbTogTGF6eUl0ZXJhdG9yPEk+LFxuICAgICAgcHJvdGVjdGVkIHRyYW5zZm9ybTogKHZhbHVlOiBJKSA9PiBPW10pIHtcbiAgICBzdXBlcigpO1xuICB9XG5cbiAgc3VtbWFyeSgpIHtcbiAgICByZXR1cm4gYCR7dGhpcy51cHN0cmVhbS5zdW1tYXJ5KCl9IC0+IEZsYXRtYXBgO1xuICB9XG5cbiAgYXN5bmMgcHVtcCgpOiBQcm9taXNlPGJvb2xlYW4+IHtcbiAgICBjb25zdCBpdGVtID0gYXdhaXQgdGhpcy51cHN0cmVhbS5uZXh0KCk7XG4gICAgaWYgKGl0ZW0uZG9uZSkge1xuICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH1cbiAgICBjb25zdCBpbnB1dFRlbnNvcnMgPSB0Zi50ZW5zb3JfdXRpbC5nZXRUZW5zb3JzSW5Db250YWluZXIoaXRlbS52YWx1ZSBhcyB7fSk7XG4gICAgLy8gQ2FyZWZ1bDogdGhlIHRyYW5zZm9ybSBtYXkgbXV0YXRlIHRoZSBpdGVtIGluIHBsYWNlLlxuICAgIC8vIHRoYXQncyB3aHkgd2UgaGF2ZSB0byByZW1lbWJlciB0aGUgaW5wdXQgVGVuc29ycyBhYm92ZSwgYW5kIHRoZW5cbiAgICAvLyBiZWxvdyBkaXNwb3NlIG9ubHkgdGhvc2UgdGhhdCB3ZXJlIG5vdCBwYXNzZWQgdGhyb3VnaCB0byB0aGUgb3V0cHV0LlxuICAgIC8vIE5vdGUgdG9vIHRoYXQgdGhlIHRyYW5zZm9ybSBmdW5jdGlvbiBpcyByZXNwb25zaWJsZSBmb3IgdGlkeWluZyBhbnlcbiAgICAvLyBpbnRlcm1lZGlhdGUgVGVuc29ycy4gIEhlcmUgd2UgYXJlIGNvbmNlcm5lZCBvbmx5IGFib3V0IHRoZSBpbnB1dHMuXG4gICAgY29uc3QgbWFwcGVkQXJyYXkgPSB0aGlzLnRyYW5zZm9ybShpdGVtLnZhbHVlKTtcbiAgICBjb25zdCBvdXRwdXRUZW5zb3JzID1cbiAgICAgICAgdGYudGVuc29yX3V0aWwuZ2V0VGVuc29yc0luQ29udGFpbmVyKG1hcHBlZEFycmF5IGFzIHt9KTtcbiAgICB0aGlzLm91dHB1dFF1ZXVlLnB1c2hBbGwobWFwcGVkQXJyYXkpO1xuXG4gICAgLy8gVE9ETyhzb2VyZ2VsKSBmYXN0ZXIgaW50ZXJzZWN0aW9uLCBhbmQgZGVkdXBsaWNhdGUgb3V0cHV0VGVuc29yc1xuICAgIC8vIFRPRE8oc29lcmdlbCkgbW92ZSB0byB0Zi5kaXNwb3NlRXhjZXB0KGluLCBvdXQpP1xuICAgIGZvciAoY29uc3QgdCBvZiBpbnB1dFRlbnNvcnMpIHtcbiAgICAgIGlmICghdGYudGVuc29yX3V0aWwuaXNUZW5zb3JJbkxpc3QodCwgb3V0cHV0VGVuc29ycykpIHtcbiAgICAgICAgdC5kaXNwb3NlKCk7XG4gICAgICB9XG4gICAgfVxuXG4gICAgcmV0dXJuIHRydWU7XG4gIH1cbn1cblxuLyoqXG4gKiBQcm92aWRlcyBhIGBMYXp5SXRlcmF0b3JgIHRoYXQgY29uY2F0ZW5hdGVzIGEgc3RyZWFtIG9mIHVuZGVybHlpbmdcbiAqIHN0cmVhbXMuXG4gKlxuICogRG9pbmcgdGhpcyBpbiBhIGNvbmN1cnJlbmN5LXNhZmUgd2F5IHJlcXVpcmVzIHNvbWUgdHJpY2tlcnkuICBJblxuICogcGFydGljdWxhciwgd2Ugd2FudCB0aGlzIHN0cmVhbSB0byByZXR1cm4gdGhlIGVsZW1lbnRzIGZyb20gdGhlXG4gKiB1bmRlcmx5aW5nIHN0cmVhbXMgaW4gdGhlIGNvcnJlY3Qgb3JkZXIgYWNjb3JkaW5nIHRvIHdoZW4gbmV4dCgpIHdhc1xuICogY2FsbGVkLCBldmVuIGlmIHRoZSByZXN1bHRpbmcgUHJvbWlzZXMgcmVzb2x2ZSBpbiBhIGRpZmZlcmVudCBvcmRlci5cbiAqL1xuZXhwb3J0IGNsYXNzIENoYWluZWRJdGVyYXRvcjxUPiBleHRlbmRzIExhenlJdGVyYXRvcjxUPiB7XG4gIC8vIFN0cmljdCBQcm9taXNlIGV4ZWN1dGlvbiBvcmRlcjpcbiAgLy8gYSBuZXh0KCkgY2FsbCBtYXkgbm90IGV2ZW4gYmVnaW4gdW50aWwgdGhlIHByZXZpb3VzIG9uZSBjb21wbGV0ZXMuXG4gIHByaXZhdGUgbGFzdFJlYWQ6IFByb21pc2U8SXRlcmF0b3JSZXN1bHQ8VD4+ID0gbnVsbDtcblxuICAvLyBMb2NhbCBzdGF0ZSB0aGF0IHNob3VsZCBub3QgYmUgY2xvYmJlcmVkIGJ5IG91dC1vZi1vcmRlciBleGVjdXRpb24uXG4gIHByaXZhdGUgaXRlcmF0b3I6IExhenlJdGVyYXRvcjxUPiA9IG51bGw7XG4gIHByaXZhdGUgbW9yZUl0ZXJhdG9yczogTGF6eUl0ZXJhdG9yPExhenlJdGVyYXRvcjxUPj47XG5cbiAgY29uc3RydWN0b3IoXG4gICAgICBpdGVyYXRvcnM6IExhenlJdGVyYXRvcjxMYXp5SXRlcmF0b3I8VD4+LFxuICAgICAgcHJpdmF0ZSByZWFkb25seSBiYXNlRXJyb3JIYW5kbGVyPzogKGU6IEVycm9yKSA9PiBib29sZWFuKSB7XG4gICAgc3VwZXIoKTtcbiAgICB0aGlzLm1vcmVJdGVyYXRvcnMgPSBpdGVyYXRvcnM7XG4gIH1cblxuICBzdW1tYXJ5KCkge1xuICAgIGNvbnN0IHVwc3RyZWFtU3VtbWFyaWVzID0gJ1RPRE86IGZpbGwgaW4gdXBzdHJlYW0gb2YgY2hhaW5lZCBzdW1tYXJpZXMnO1xuICAgIHJldHVybiBgJHt1cHN0cmVhbVN1bW1hcmllc30gLT4gQ2hhaW5lZGA7XG4gIH1cblxuICBhc3luYyBuZXh0KCk6IFByb21pc2U8SXRlcmF0b3JSZXN1bHQ8VD4+IHtcbiAgICB0aGlzLmxhc3RSZWFkID0gdGhpcy5yZWFkRnJvbUNoYWluKHRoaXMubGFzdFJlYWQpO1xuICAgIHJldHVybiB0aGlzLmxhc3RSZWFkO1xuICB9XG5cbiAgcHJpdmF0ZSBhc3luYyByZWFkRnJvbUNoYWluKGxhc3RSZWFkOiBQcm9taXNlPEl0ZXJhdG9yUmVzdWx0PFQ+Pik6XG4gICAgICBQcm9taXNlPEl0ZXJhdG9yUmVzdWx0PFQ+PiB7XG4gICAgLy8gTXVzdCBhd2FpdCBvbiB0aGUgcHJldmlvdXMgcmVhZCBzaW5jZSB0aGUgcHJldmlvdXMgcmVhZCBtYXkgaGF2ZSBhZHZhbmNlZFxuICAgIC8vIHRoZSBzdHJlYW0gb2Ygc3RyZWFtcywgZnJvbSB3aGljaCB3ZSBuZWVkIHRvIHJlYWQuXG4gICAgLy8gVGhpcyBpcyB1bmZvcnR1bmF0ZSBzaW5jZSB3ZSBjYW4ndCBwYXJhbGxlbGl6ZSByZWFkcy4gV2hpY2ggbWVhbnNcbiAgICAvLyBwcmVmZXRjaGluZyBvZiBjaGFpbmVkIHN0cmVhbXMgaXMgYSBuby1vcC5cbiAgICAvLyBPbmUgc29sdXRpb24gaXMgdG8gcHJlZmV0Y2ggaW1tZWRpYXRlbHkgdXBzdHJlYW0gb2YgdGhpcy5cbiAgICBhd2FpdCBsYXN0UmVhZDtcbiAgICBpZiAodGhpcy5pdGVyYXRvciA9PSBudWxsKSB7XG4gICAgICBjb25zdCBpdGVyYXRvclJlc3VsdCA9IGF3YWl0IHRoaXMubW9yZUl0ZXJhdG9ycy5uZXh0KCk7XG4gICAgICBpZiAoaXRlcmF0b3JSZXN1bHQuZG9uZSkge1xuICAgICAgICAvLyBObyBtb3JlIHN0cmVhbXMgdG8gc3RyZWFtIGZyb20uXG4gICAgICAgIHJldHVybiB7dmFsdWU6IG51bGwsIGRvbmU6IHRydWV9O1xuICAgICAgfVxuICAgICAgdGhpcy5pdGVyYXRvciA9IGl0ZXJhdG9yUmVzdWx0LnZhbHVlO1xuICAgICAgaWYgKHRoaXMuYmFzZUVycm9ySGFuZGxlciAhPSBudWxsKSB7XG4gICAgICAgIHRoaXMuaXRlcmF0b3IgPSB0aGlzLml0ZXJhdG9yLmhhbmRsZUVycm9ycyh0aGlzLmJhc2VFcnJvckhhbmRsZXIpO1xuICAgICAgfVxuICAgIH1cbiAgICBjb25zdCBpdGVtUmVzdWx0ID0gYXdhaXQgdGhpcy5pdGVyYXRvci5uZXh0KCk7XG4gICAgaWYgKGl0ZW1SZXN1bHQuZG9uZSkge1xuICAgICAgdGhpcy5pdGVyYXRvciA9IG51bGw7XG4gICAgICByZXR1cm4gdGhpcy5yZWFkRnJvbUNoYWluKGxhc3RSZWFkKTtcbiAgICB9XG4gICAgcmV0dXJuIGl0ZW1SZXN1bHQ7XG4gIH1cbn1cblxuZXhwb3J0IGVudW0gWmlwTWlzbWF0Y2hNb2RlIHtcbiAgRkFJTCwgICAgICAvLyByZXF1aXJlIHppcHBlZCBzdHJlYW1zIHRvIGhhdmUgdGhlIHNhbWUgbGVuZ3RoXG4gIFNIT1JURVNULCAgLy8gdGVybWluYXRlIHppcCB3aGVuIHRoZSBmaXJzdCBzdHJlYW0gaXMgZXhoYXVzdGVkXG4gIExPTkdFU1QgICAgLy8gdXNlIG51bGxzIGZvciBleGhhdXN0ZWQgc3RyZWFtczsgdXNlIHVwIHRoZSBsb25nZXN0IHN0cmVhbS5cbn1cblxuLyoqXG4gKiBQcm92aWRlcyBhIGBMYXp5SXRlcmF0b3JgIHRoYXQgemlwcyB0b2dldGhlciBhbiBhcnJheSwgZGljdCwgb3IgbmVzdGVkXG4gKiBzdHJ1Y3R1cmUgb2YgYExhenlJdGVyYXRvcmBzIChhbmQgcGVyaGFwcyBhZGRpdGlvbmFsIGNvbnN0YW50cykuXG4gKlxuICogVGhlIHVuZGVybHlpbmcgc3RyZWFtcyBtdXN0IHByb3ZpZGUgZWxlbWVudHMgaW4gYSBjb25zaXN0ZW50IG9yZGVyIHN1Y2hcbiAqIHRoYXQgdGhleSBjb3JyZXNwb25kLlxuICpcbiAqIFR5cGljYWxseSwgdGhlIHVuZGVybHlpbmcgc3RyZWFtcyBzaG91bGQgaGF2ZSB0aGUgc2FtZSBudW1iZXIgb2ZcbiAqIGVsZW1lbnRzLiBJZiB0aGV5IGRvIG5vdCwgdGhlIGJlaGF2aW9yIGlzIGRldGVybWluZWQgYnkgdGhlXG4gKiBgbWlzbWF0Y2hNb2RlYCBhcmd1bWVudC5cbiAqXG4gKiBUaGUgbmVzdGVkIHN0cnVjdHVyZSBvZiB0aGUgYGl0ZXJhdG9yc2AgYXJndW1lbnQgZGV0ZXJtaW5lcyB0aGVcbiAqIHN0cnVjdHVyZSBvZiBlbGVtZW50cyBpbiB0aGUgcmVzdWx0aW5nIGl0ZXJhdG9yLlxuICpcbiAqIERvaW5nIHRoaXMgaW4gYSBjb25jdXJyZW5jeS1zYWZlIHdheSByZXF1aXJlcyBzb21lIHRyaWNrZXJ5LiAgSW5cbiAqIHBhcnRpY3VsYXIsIHdlIHdhbnQgdGhpcyBzdHJlYW0gdG8gcmV0dXJuIHRoZSBlbGVtZW50cyBmcm9tIHRoZVxuICogdW5kZXJseWluZyBzdHJlYW1zIGluIHRoZSBjb3JyZWN0IG9yZGVyIGFjY29yZGluZyB0byB3aGVuIG5leHQoKSB3YXNcbiAqIGNhbGxlZCwgZXZlbiBpZiB0aGUgcmVzdWx0aW5nIFByb21pc2VzIHJlc29sdmUgaW4gYSBkaWZmZXJlbnQgb3JkZXIuXG4gKlxuICogQHBhcmFtIGl0ZXJhdG9yczogQW4gYXJyYXkgb3Igb2JqZWN0IGNvbnRhaW5pbmcgTGF6eUl0ZXJhdG9ycyBhdCB0aGVcbiAqIGxlYXZlcy5cbiAqIEBwYXJhbSBtaXNtYXRjaE1vZGU6IERldGVybWluZXMgd2hhdCB0byBkbyB3aGVuIG9uZSB1bmRlcmx5aW5nIGl0ZXJhdG9yXG4gKiBpcyBleGhhdXN0ZWQgYmVmb3JlIHRoZSBvdGhlcnMuICBgWmlwTWlzbWF0Y2hNb2RlLkZBSUxgICh0aGUgZGVmYXVsdClcbiAqIGNhdXNlcyBhbiBlcnJvciB0byBiZSB0aHJvd24gaW4gdGhpcyBjYXNlLiAgYFppcE1pc21hdGNoTW9kZS5TSE9SVEVTVGBcbiAqIGNhdXNlcyB0aGUgemlwcGVkIGl0ZXJhdG9yIHRvIHRlcm1pbmF0ZSB3aXRoIHRoZSBmdXJzdCB1bmRlcmx5aW5nXG4gKiBzdHJlYW1zLCBzbyBlbGVtZW50cyByZW1haW5pbmcgb24gdGhlIGxvbmdlciBzdHJlYW1zIGFyZSBpZ25vcmVkLlxuICogYFppcE1pc21hdGNoTW9kZS5MT05HRVNUYCBjYXVzZXMgdGhlIHppcHBlZCBzdHJlYW0gdG8gY29udGludWUsIGZpbGxpbmdcbiAqIGluIG51bGxzIGZvciB0aGUgZXhoYXVzdGVkIHN0cmVhbXMsIHVudGlsIGFsbCBzdHJlYW1zIGFyZSBleGhhdXN0ZWQuXG4gKi9cbmNsYXNzIFppcEl0ZXJhdG9yPE8gZXh0ZW5kcyB0Zi5UZW5zb3JDb250YWluZXI+IGV4dGVuZHMgTGF6eUl0ZXJhdG9yPE8+IHtcbiAgcHJpdmF0ZSBjb3VudCA9IDA7XG4gIHByaXZhdGUgY3VycmVudFByb21pc2U6IFByb21pc2U8SXRlcmF0b3JSZXN1bHQ8Tz4+ID0gbnVsbDtcblxuICBjb25zdHJ1Y3RvcihcbiAgICAgIHByb3RlY3RlZCByZWFkb25seSBpdGVyYXRvcnM6IEl0ZXJhdG9yQ29udGFpbmVyLFxuICAgICAgcHJvdGVjdGVkIHJlYWRvbmx5IG1pc21hdGNoTW9kZTogWmlwTWlzbWF0Y2hNb2RlID0gWmlwTWlzbWF0Y2hNb2RlLkZBSUwpIHtcbiAgICBzdXBlcigpO1xuICB9XG5cbiAgc3VtbWFyeSgpIHtcbiAgICBjb25zdCB1cHN0cmVhbVN1bW1hcmllcyA9ICdUT0RPOiBmaWxsIGluIHVwc3RyZWFtIG9mIHppcCBzdW1tYXJpZXMnO1xuICAgIHJldHVybiBgeyR7dXBzdHJlYW1TdW1tYXJpZXN9fSAtPiBaaXBgO1xuICB9XG5cbiAgcHJpdmF0ZSBhc3luYyBuZXh0U3RhdGUoYWZ0ZXJTdGF0ZTogUHJvbWlzZTxJdGVyYXRvclJlc3VsdDxPPj4pOlxuICAgICAgUHJvbWlzZTxJdGVyYXRvclJlc3VsdDxPPj4ge1xuICAgIC8vIFRoaXMgY2hhaW5pbmcgZW5zdXJlcyB0aGF0IHRoZSB1bmRlcmx5aW5nIG5leHQoKSBhcmUgbm90IGV2ZW4gY2FsbGVkXG4gICAgLy8gYmVmb3JlIHRoZSBwcmV2aW91cyBvbmVzIGhhdmUgcmVzb2x2ZWQuXG4gICAgYXdhaXQgYWZ0ZXJTdGF0ZTtcblxuICAgIC8vIENvbGxlY3QgdW5kZXJseWluZyBpdGVyYXRvciBcImRvbmVcIiBzaWduYWxzIGFzIGEgc2lkZSBlZmZlY3QgaW5cbiAgICAvLyBnZXROZXh0KClcbiAgICBsZXQgbnVtSXRlcmF0b3JzID0gMDtcbiAgICBsZXQgaXRlcmF0b3JzRG9uZSA9IDA7XG5cbiAgICBmdW5jdGlvbiBnZXROZXh0KGNvbnRhaW5lcjogSXRlcmF0b3JDb250YWluZXIpOiBEZWVwTWFwQXN5bmNSZXN1bHQge1xuICAgICAgaWYgKGNvbnRhaW5lciBpbnN0YW5jZW9mIExhenlJdGVyYXRvcikge1xuICAgICAgICBjb25zdCByZXN1bHQgPSBjb250YWluZXIubmV4dCgpO1xuICAgICAgICByZXR1cm4ge1xuICAgICAgICAgIHZhbHVlOiByZXN1bHQudGhlbih4ID0+IHtcbiAgICAgICAgICAgIG51bUl0ZXJhdG9ycysrO1xuICAgICAgICAgICAgaWYgKHguZG9uZSkge1xuICAgICAgICAgICAgICBpdGVyYXRvcnNEb25lKys7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICByZXR1cm4geC52YWx1ZTtcbiAgICAgICAgICB9KSxcbiAgICAgICAgICByZWN1cnNlOiBmYWxzZVxuICAgICAgICB9O1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgcmV0dXJuIHt2YWx1ZTogbnVsbCwgcmVjdXJzZTogdHJ1ZX07XG4gICAgICB9XG4gICAgfVxuXG4gICAgY29uc3QgbWFwcGVkOiBPID0gYXdhaXQgZGVlcE1hcEFuZEF3YWl0QWxsKHRoaXMuaXRlcmF0b3JzLCBnZXROZXh0KTtcblxuICAgIGlmIChudW1JdGVyYXRvcnMgPT09IGl0ZXJhdG9yc0RvbmUpIHtcbiAgICAgIC8vIFRoZSBzdHJlYW1zIGhhdmUgYWxsIGVuZGVkLlxuICAgICAgcmV0dXJuIHt2YWx1ZTogbnVsbCwgZG9uZTogdHJ1ZX07XG4gICAgfVxuICAgIGlmIChpdGVyYXRvcnNEb25lID4gMCkge1xuICAgICAgc3dpdGNoICh0aGlzLm1pc21hdGNoTW9kZSkge1xuICAgICAgICBjYXNlIFppcE1pc21hdGNoTW9kZS5GQUlMOlxuICAgICAgICAgIHRocm93IG5ldyBFcnJvcihcbiAgICAgICAgICAgICAgJ1ppcHBlZCBzdHJlYW1zIHNob3VsZCBoYXZlIHRoZSBzYW1lIGxlbmd0aC4gJyArXG4gICAgICAgICAgICAgIGBNaXNtYXRjaGVkIGF0IGVsZW1lbnQgJHt0aGlzLmNvdW50fS5gKTtcbiAgICAgICAgY2FzZSBaaXBNaXNtYXRjaE1vZGUuU0hPUlRFU1Q6XG4gICAgICAgICAgcmV0dXJuIHt2YWx1ZTogbnVsbCwgZG9uZTogdHJ1ZX07XG4gICAgICAgIGNhc2UgWmlwTWlzbWF0Y2hNb2RlLkxPTkdFU1Q6XG4gICAgICAgIGRlZmF1bHQ6XG4gICAgICAgICAgLy8gQ29udGludWUuICBUaGUgZXhoYXVzdGVkIHN0cmVhbXMgYWxyZWFkeSBwcm9kdWNlZCB2YWx1ZTogbnVsbC5cbiAgICAgIH1cbiAgICB9XG5cbiAgICB0aGlzLmNvdW50Kys7XG4gICAgcmV0dXJuIHt2YWx1ZTogbWFwcGVkLCBkb25lOiBmYWxzZX07XG4gIH1cblxuICBhc3luYyBuZXh0KCk6IFByb21pc2U8SXRlcmF0b3JSZXN1bHQ8Tz4+IHtcbiAgICB0aGlzLmN1cnJlbnRQcm9taXNlID0gdGhpcy5uZXh0U3RhdGUodGhpcy5jdXJyZW50UHJvbWlzZSk7XG4gICAgcmV0dXJuIHRoaXMuY3VycmVudFByb21pc2U7XG4gIH1cbn1cblxuLy8gSXRlcmF0b3JzIHRoYXQgbWFpbnRhaW4gYSByaW5nIGJ1ZmZlciBvZiBwZW5kaW5nIHByb21pc2VzXG4vLyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG5cbi8qKlxuICogQSBzdHJlYW0gdGhhdCBwcmVmZXRjaGVzIGEgZ2l2ZW4gbnVtYmVyIG9mIGl0ZW1zIGZyb20gYW4gdXBzdHJlYW0gc291cmNlLFxuICogcmV0dXJuaW5nIHRoZW0gaW4gRklGTyBvcmRlci5cbiAqXG4gKiBOb3RlIHRoaXMgcHJlZmV0Y2hlcyBQcm9taXNlcywgYnV0IG1ha2VzIG5vIGd1YXJhbnRlZXMgYWJvdXQgd2hlbiB0aG9zZVxuICogUHJvbWlzZXMgcmVzb2x2ZS5cbiAqL1xuZXhwb3J0IGNsYXNzIFByZWZldGNoSXRlcmF0b3I8VD4gZXh0ZW5kcyBMYXp5SXRlcmF0b3I8VD4ge1xuICBwcm90ZWN0ZWQgYnVmZmVyOiBSaW5nQnVmZmVyPFByb21pc2U8SXRlcmF0b3JSZXN1bHQ8VD4+PjtcblxuICBjb25zdHJ1Y3RvcihcbiAgICAgIHByb3RlY3RlZCB1cHN0cmVhbTogTGF6eUl0ZXJhdG9yPFQ+LCBwcm90ZWN0ZWQgYnVmZmVyU2l6ZTogbnVtYmVyKSB7XG4gICAgc3VwZXIoKTtcbiAgICB0aGlzLmJ1ZmZlciA9IG5ldyBSaW5nQnVmZmVyPFByb21pc2U8SXRlcmF0b3JSZXN1bHQ8VD4+PihidWZmZXJTaXplKTtcbiAgfVxuXG4gIHN1bW1hcnkoKSB7XG4gICAgcmV0dXJuIGAke3RoaXMudXBzdHJlYW0uc3VtbWFyeSgpfSAtPiBQcmVmZXRjaGA7XG4gIH1cblxuICAvKipcbiAgICogUmVmaWxsIHRoZSBwcmVmZXRjaCBidWZmZXIuICBSZXR1cm5zIG9ubHkgYWZ0ZXIgdGhlIGJ1ZmZlciBpcyBmdWxsLCBvclxuICAgKiB0aGUgdXBzdHJlYW0gc291cmNlIGlzIGV4aGF1c3RlZC5cbiAgICovXG4gIHByb3RlY3RlZCByZWZpbGwoKSB7XG4gICAgd2hpbGUgKCF0aGlzLmJ1ZmZlci5pc0Z1bGwoKSkge1xuICAgICAgY29uc3QgdiA9IHRoaXMudXBzdHJlYW0ubmV4dCgpO1xuICAgICAgdGhpcy5idWZmZXIucHVzaCh2KTtcbiAgICB9XG4gIH1cblxuICBuZXh0KCk6IFByb21pc2U8SXRlcmF0b3JSZXN1bHQ8VD4+IHtcbiAgICB0aGlzLnJlZmlsbCgpO1xuICAgIC8vIFRoaXMgc2hpZnQgd2lsbCBuZXZlciB0aHJvdyBhbiBlcnJvciBiZWNhdXNlIHRoZSBidWZmZXIgaXMgYWx3YXlzXG4gICAgLy8gZnVsbCBhZnRlciBhIHJlZmlsbC4gSWYgdGhlIHN0cmVhbSBpcyBleGhhdXN0ZWQsIHRoZSBidWZmZXIgd2lsbCBiZVxuICAgIC8vIGZ1bGwgb2YgUHJvbWlzZXMgdGhhdCB3aWxsIHJlc29sdmUgdG8gdGhlIGVuZC1vZi1zdHJlYW0gc2lnbmFsLlxuICAgIHJldHVybiB0aGlzLmJ1ZmZlci5zaGlmdCgpO1xuICB9XG59XG5cbi8qKlxuICogQSBzdHJlYW0gdGhhdCBwZXJmb3JtcyBhIHNsaWRpbmctd2luZG93IHJhbmRvbSBzaHVmZmxlIG9uIGFuIHVwc3RyZWFtXG4gKiBzb3VyY2UuIFRoaXMgaXMgbGlrZSBhIGBQcmVmZXRjaEl0ZXJhdG9yYCBleGNlcHQgdGhhdCB0aGUgaXRlbXMgYXJlXG4gKiByZXR1cm5lZCBpbiByYW5kb21pemVkIG9yZGVyLiAgTWl4aW5nIG5hdHVyYWxseSBpbXByb3ZlcyBhcyB0aGUgYnVmZmVyXG4gKiBzaXplIGluY3JlYXNlcy5cbiAqL1xuZXhwb3J0IGNsYXNzIFNodWZmbGVJdGVyYXRvcjxUPiBleHRlbmRzIFByZWZldGNoSXRlcmF0b3I8VD4ge1xuICBwcml2YXRlIHJlYWRvbmx5IHJhbmRvbTogc2VlZHJhbmRvbS5wcm5nO1xuXG4gIC8vIFN0cmljdCBQcm9taXNlIGV4ZWN1dGlvbiBvcmRlcjpcbiAgLy8gYSBuZXh0KCkgY2FsbCBtYXkgbm90IGV2ZW4gYmVnaW4gdW50aWwgdGhlIHByZXZpb3VzIG9uZSBjb21wbGV0ZXMuXG4gIHByaXZhdGUgbGFzdFJlYWQ6IFByb21pc2U8SXRlcmF0b3JSZXN1bHQ8VD4+O1xuXG4gIC8vIExvY2FsIHN0YXRlIHRoYXQgc2hvdWxkIG5vdCBiZSBjbG9iYmVyZWQgYnkgb3V0LW9mLW9yZGVyIGV4ZWN1dGlvbi5cbiAgcHJpdmF0ZSB1cHN0cmVhbUV4aGF1c3RlZCA9IGZhbHNlO1xuXG4gIGNvbnN0cnVjdG9yKFxuICAgICAgcHJvdGVjdGVkIHVwc3RyZWFtOiBMYXp5SXRlcmF0b3I8VD4sIHByb3RlY3RlZCB3aW5kb3dTaXplOiBudW1iZXIsXG4gICAgICBzZWVkPzogc3RyaW5nKSB7XG4gICAgc3VwZXIodXBzdHJlYW0sIHdpbmRvd1NpemUpO1xuICAgIHRoaXMucmFuZG9tID0gc2VlZHJhbmRvbS5hbGVhKHNlZWQgfHwgdGYudXRpbC5ub3coKS50b1N0cmluZygpKTtcbiAgICB0aGlzLmxhc3RSZWFkID0gUHJvbWlzZS5yZXNvbHZlKHt2YWx1ZTogbnVsbCwgZG9uZTogZmFsc2V9KTtcbiAgfVxuXG4gIGFzeW5jIG5leHQoKTogUHJvbWlzZTxJdGVyYXRvclJlc3VsdDxUPj4ge1xuICAgIC8vIFRoaXMgc2V0cyB0aGlzLmxhc3RSZWFkIHRvIGEgbmV3IFByb21pc2UgcmlnaHQgYXdheSwgYXMgb3Bwb3NlZCB0b1xuICAgIC8vIHNheWluZyBgYXdhaXQgdGhpcy5sYXN0UmVhZDsgdGhpcy5sYXN0UmVhZCA9IHRoaXMuc2VyaWFsTmV4dCgpO2Agd2hpY2hcbiAgICAvLyB3b3VsZCBub3Qgd29yayBiZWNhdXNlIHRoaXMubmV4dFJlYWQgd291bGQgYmUgdXBkYXRlZCBvbmx5IGFmdGVyIHRoZVxuICAgIC8vIHByb21pc2UgcmVzb2x2ZXMuXG4gICAgdGhpcy5sYXN0UmVhZCA9IHRoaXMubGFzdFJlYWQudGhlbigoKSA9PiB0aGlzLnNlcmlhbE5leHQoKSk7XG4gICAgcmV0dXJuIHRoaXMubGFzdFJlYWQ7XG4gIH1cblxuICBwcml2YXRlIHJhbmRvbUludChtYXg6IG51bWJlcikge1xuICAgIHJldHVybiBNYXRoLmZsb29yKHRoaXMucmFuZG9tKCkgKiBtYXgpO1xuICB9XG5cbiAgcHJvdGVjdGVkIGNob29zZUluZGV4KCk6IG51bWJlciB7XG4gICAgcmV0dXJuIHRoaXMucmFuZG9tSW50KHRoaXMuYnVmZmVyLmxlbmd0aCgpKTtcbiAgfVxuXG4gIGFzeW5jIHNlcmlhbE5leHQoKTogUHJvbWlzZTxJdGVyYXRvclJlc3VsdDxUPj4ge1xuICAgIC8vIFRPRE8oc29lcmdlbCk6IGNvbnNpZGVyIHBlcmZvcm1hbmNlXG4gICAgaWYgKCF0aGlzLnVwc3RyZWFtRXhoYXVzdGVkKSB7XG4gICAgICB0aGlzLnJlZmlsbCgpO1xuICAgIH1cbiAgICB3aGlsZSAoIXRoaXMuYnVmZmVyLmlzRW1wdHkoKSkge1xuICAgICAgY29uc3QgY2hvc2VuSW5kZXggPSB0aGlzLmNob29zZUluZGV4KCk7XG4gICAgICBjb25zdCByZXN1bHQgPSBhd2FpdCB0aGlzLmJ1ZmZlci5zaHVmZmxlRXhjaXNlKGNob3NlbkluZGV4KTtcbiAgICAgIGlmIChyZXN1bHQuZG9uZSkge1xuICAgICAgICB0aGlzLnVwc3RyZWFtRXhoYXVzdGVkID0gdHJ1ZTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHRoaXMucmVmaWxsKCk7XG4gICAgICAgIHJldHVybiByZXN1bHQ7XG4gICAgICB9XG4gICAgfVxuICAgIHJldHVybiB7dmFsdWU6IG51bGwsIGRvbmU6IHRydWV9O1xuICB9XG59XG4iXX0=","/**\n * @license\n * Copyright 2018 Google LLC. All Rights Reserved.\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n *\n * =============================================================================\n */\nimport * as tf from '@tensorflow/tfjs-core';\n/**\n * Apply a mapping function to a nested structure in a recursive manner.\n *\n * The result of the mapping is an object with the same nested structure (i.e.,\n * of arrays and dicts) as the input, except that some subtrees are replaced,\n * according to the results of the mapping function.\n *\n * Mappings are memoized. Thus, if the nested structure contains the same\n * object in multiple positions, the output will contain the same mapped object\n * in those positions. Cycles are not supported, however.\n *\n * @param input: The object to which to apply the mapping function.\n * @param mapFn: A function that expects a single node of the object tree, and\n * returns a `DeepMapResult`. The `DeepMapResult` either provides a\n * replacement value for that node (i.e., replacing the subtree), or indicates\n * that the node should be processed recursively.\n */\nexport function deepMap(input, mapFn) {\n return deepMapInternal(input, mapFn);\n}\n/**\n * @param seen: A Map of known object mappings (i.e., memoized results of\n * `mapFn()`)\n * @param containedIn: An set containing objects on the reference path currently\n * being processed (used to detect cycles).\n */\nfunction deepMapInternal(input, mapFn, seen = new Map(), containedIn = new Set()) {\n if (input == null) {\n return null;\n }\n if (typeof Blob === 'function' && input instanceof Blob) {\n return input.slice();\n }\n if (containedIn.has(input)) {\n throw new Error('Circular references are not supported.');\n }\n if (seen.has(input)) {\n return seen.get(input);\n }\n const result = mapFn(input);\n if (result.recurse && result.value !== null) {\n throw new Error('A deep map function may not return both a value and recurse=true.');\n }\n if (!result.recurse) {\n seen.set(input, result.value);\n return result.value;\n }\n else if (isIterable(input)) {\n // tslint:disable-next-line:no-any\n const mappedIterable = Array.isArray(input) ? [] : {};\n containedIn.add(input);\n for (const k in input) {\n const child = input[k];\n const childResult = deepMapInternal(child, mapFn, seen, containedIn);\n mappedIterable[k] = childResult;\n }\n containedIn.delete(input);\n if (input.__proto__) {\n mappedIterable.__proto__ = input.__proto__;\n }\n return mappedIterable;\n }\n else {\n throw new Error(`Can't recurse into non-iterable type: ${input}`);\n }\n}\n// TODO(soergel, kangyizhang) Reconsider naming of deepZip() to avoid confusion\n// with zip()\n/**\n * Zip nested structures together in a recursive manner.\n *\n * This has the effect of transposing or pivoting data, e.g. converting it from\n * a row-major representation to a column-major representation.\n *\n * For example, `deepZip([{a: 1, b: 2}, {a: 3, b: 4}])` returns\n * `{a: [1, 3], b: [2, 4]}`.\n *\n * The inputs should all have the same nested structure (i.e., of arrays and\n * dicts). The result is a single object with the same nested structure, where\n * the leaves are arrays collecting the values of the inputs at that location\n * (or, optionally, the result of a custom function applied to those arrays).\n *\n * @param inputs: An array of the objects to zip together.\n * @param zipFn: (optional) A function that expects an array of elements at a\n * single node of the object tree, and returns a `DeepMapResult`. The\n * `DeepMapResult` either provides a result value for that node (i.e.,\n * representing the subtree), or indicates that the node should be processed\n * recursively. The default zipFn recurses as far as possible and places\n * arrays at the leaves.\n */\nexport function deepZip(inputs, zipFn = zipToList) {\n return deepZipInternal(inputs, zipFn);\n}\n/**\n * @param containedIn: An set containing objects on the reference path currently\n * being processed (used to detect cycles).\n */\nfunction deepZipInternal(inputs, zipFn, containedIn = new Set()) {\n // The recursion follows the structure of input 0; it's assumed that all the\n // other inputs have the same structure.\n const input = inputs[0];\n if (containedIn.has(input)) {\n throw new Error('Circular references are not supported.');\n }\n const result = zipFn(inputs);\n if (result.recurse && result.value !== null) {\n throw new Error('A deep zip function may not return both a value and recurse=true.');\n }\n if (!result.recurse) {\n return result.value;\n }\n else if (isIterable(input)) {\n // tslint:disable-next-line:no-any\n const mappedIterable = Array.isArray(input) ? [] : {};\n containedIn.add(input);\n for (const k in input) {\n const children = inputs.map(x => x[k]);\n const childResult = deepZipInternal(children, zipFn, containedIn);\n mappedIterable[k] = childResult;\n }\n containedIn.delete(input);\n return mappedIterable;\n }\n else {\n throw new Error(`Can't recurse into non-iterable type: ${input}`);\n }\n}\n// tslint:disable-next-line:no-any\nexport function zipToList(x) {\n if (x === null) {\n return null;\n }\n // TODO(soergel): validate array type?\n if (isIterable(x[0])) {\n return { value: null, recurse: true };\n }\n else {\n return { value: x, recurse: false };\n }\n}\n/**\n * Apply an async mapping function to a nested structure in a recursive manner.\n *\n * This first creates a nested structure of Promises, and then awaits all of\n * those, resulting in a single Promise for a resolved nested structure.\n *\n * The result of the mapping is an object with the same nested structure (i.e.,\n * of arrays and dicts) as the input, except that some subtrees are replaced,\n * according to the results of the mapping function.\n *\n * Mappings are memoized. Thus, if the nested structure contains the same\n * object in multiple positions, the output will contain the same mapped object\n * in those positions. Cycles are not supported, however.\n *\n * @param input: The object to which to apply the mapping function.\n * @param mapFn: A function that expects a single node of the object tree, and\n * returns a `DeepMapAsyncResult`. The `DeepMapAsyncResult` either provides\n * a `Promise` for a replacement value for that node (i.e., replacing the\n * subtree), or indicates that the node should be processed recursively. Note\n * that the decision whether or not to recurse must be made immediately; only\n * the mapped value may be promised.\n */\nexport async function deepMapAndAwaitAll(input, mapFn) {\n const seen = new Map();\n // First do a normal deepMap, collecting Promises in 'seen' as a side effect.\n deepMapInternal(input, mapFn, seen);\n // Replace the Promises in 'seen' in place.\n // Note TypeScript provides no async map iteration, and regular map iteration\n // is broken too, so sadly we have to do Array.from() to make it work.\n // (There's no advantage to Promise.all(), and that would be tricky anyway.)\n for (const key of Array.from(seen.keys())) {\n const value = seen.get(key);\n if (tf.util.isPromise(value)) {\n const mappedValue = await value;\n seen.set(key, mappedValue);\n }\n }\n // Normal deepMap again, this time filling in the resolved values.\n // It's unfortunate that we have to do two passes.\n // TODO(soergel): test performance and think harder about a fast solution.\n const result = deepMapInternal(input, mapFn, seen);\n return result;\n}\n/**\n * Determine whether the argument is iterable.\n *\n * @returns true if the argument is an array or any non-Tensor object.\n */\n// tslint:disable-next-line:no-any\nexport function isIterable(obj) {\n let isTextDecoder = false;\n if (tf.env().get('IS_BROWSER')) {\n isTextDecoder = obj instanceof TextDecoder;\n }\n else {\n // tslint:disable-next-line:no-require-imports\n const { StringDecoder } = require('string_decoder');\n isTextDecoder = obj instanceof StringDecoder;\n }\n return obj != null && (!ArrayBuffer.isView(obj)) &&\n (Array.isArray(obj) ||\n (typeof obj === 'object' && !(obj instanceof tf.Tensor) &&\n !(obj instanceof Promise) && !isTextDecoder));\n}\n/**\n * Determine whether the argument can be converted to Tensor.\n *\n * Tensors, primitives, arrays, and TypedArrays all qualify; anything else does\n * not.\n *\n * @returns true if the argument can be converted to Tensor.\n */\n// tslint:disable-next-line:no-any\nexport function canTensorify(obj) {\n return obj == null || isPrimitive(obj) || Array.isArray(obj) ||\n (typeof obj === 'object' && (obj instanceof tf.Tensor)) ||\n tf.util.isTypedArray(obj);\n}\n/**\n * Returns true if the given `value` is a primitive type. Otherwise returns\n * false. This is equivalant to node util.isPrimitive\n */\nfunction isPrimitive(value) {\n return (value === null ||\n (typeof value !== 'object' && typeof value !== 'function'));\n}\n//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZGVlcF9tYXAuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi8uLi90ZmpzLWRhdGEvc3JjL3V0aWwvZGVlcF9tYXAudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUE7Ozs7Ozs7Ozs7Ozs7Ozs7R0FnQkc7QUFFSCxPQUFPLEtBQUssRUFBRSxNQUFNLHVCQUF1QixDQUFDO0FBZTVDOzs7Ozs7Ozs7Ozs7Ozs7O0dBZ0JHO0FBQ0gsTUFBTSxVQUFVLE9BQU8sQ0FBQyxLQUFVLEVBQUUsS0FBZ0M7SUFFbEUsT0FBTyxlQUFlLENBQUMsS0FBSyxFQUFFLEtBQUssQ0FBQyxDQUFDO0FBQ3ZDLENBQUM7QUFFRDs7Ozs7R0FLRztBQUNILFNBQVMsZUFBZSxDQUNwQixLQUFVLEVBQUUsS0FBZ0MsRUFDNUMsT0FBc0IsSUFBSSxHQUFHLEVBQUUsRUFBRSxjQUF1QixJQUFJLEdBQUcsRUFBRTtJQUVuRSxJQUFJLEtBQUssSUFBSSxJQUFJLEVBQUU7UUFDakIsT0FBTyxJQUFJLENBQUM7S0FDYjtJQUNELElBQUksT0FBTyxJQUFJLEtBQUssVUFBVSxJQUFJLEtBQUssWUFBWSxJQUFJLEVBQUU7UUFDdkQsT0FBTyxLQUFLLENBQUMsS0FBSyxFQUFFLENBQUM7S0FDdEI7SUFFRCxJQUFJLFdBQVcsQ0FBQyxHQUFHLENBQUMsS0FBSyxDQUFDLEVBQUU7UUFDMUIsTUFBTSxJQUFJLEtBQUssQ0FBQyx3Q0FBd0MsQ0FBQyxDQUFDO0tBQzNEO0lBQ0QsSUFBSSxJQUFJLENBQUMsR0FBRyxDQUFDLEtBQUssQ0FBQyxFQUFFO1FBQ25CLE9BQU8sSUFBSSxDQUFDLEdBQUcsQ0FBQyxLQUFLLENBQUMsQ0FBQztLQUN4QjtJQUNELE1BQU0sTUFBTSxHQUFHLEtBQUssQ0FBQyxLQUFLLENBQUMsQ0FBQztJQUU1QixJQUFJLE1BQU0sQ0FBQyxPQUFPLElBQUksTUFBTSxDQUFDLEtBQUssS0FBSyxJQUFJLEVBQUU7UUFDM0MsTUFBTSxJQUFJLEtBQUss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QUksSUFBSSxXQUFXLENBQUMsR0FBRyxDQUFDLElBQUksS0FBSyxDQUFDLE9BQU8sQ0FBQyxHQUFHLENBQUM7UUFDeEQsQ0FBQyxPQUFPLEdBQUcsS0FBSyxRQUFRLElBQUksQ0FBQyxHQUFHLFlBQVksRUFBRSxDQUFDLE1BQU0sQ0FBQyxDQUFDO1FBQ3ZELEVBQUUsQ0FBQyxJQUFJLENBQUMsWUFBWSxDQUFDLEdBQUcsQ0FBQyxDQUFDO0FBQ2hDLENBQUM7QUFFRDs7O0dBR0c7QUFDSCxTQUFTLFdBQVcsQ0FBQyxLQUFVO0lBQzdCLE9BQU8sQ0FDSCxLQUFLLEtBQUssSUFBSTtRQUNkLENBQUMsT0FBTyxLQUFLLEtBQUssUUFBUSxJQUFJLE9BQU8sS0FBSyxLQUFLLFVBQVUsQ0FBQyxDQUFDLENBQUM7QUFDbEUsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbIi8qKlxuICogQGxpY2Vuc2VcbiAqIENvcHlyaWdodCAyMDE4IEdvb2dsZSBMTEMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuXG4gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgXCJMaWNlbnNlXCIpO1xuICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLlxuICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0XG4gKlxuICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wXG4gKlxuICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZVxuICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gXCJBUyBJU1wiIEJBU0lTLFxuICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuXG4gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kXG4gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS5cbiAqXG4gKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuICovXG5cbmltcG9ydCAqIGFzIHRmIGZyb20gJ0B0ZW5zb3JmbG93L3RmanMtY29yZSc7XG5cbi8vIHRzbGludDpkaXNhYmxlOm5vLWFueVxuXG4vKipcbiAqIEEgcmV0dXJuIHZhbHVlIGZvciBhIG1hcHBpbmcgZnVuY3Rpb24gdGhhdCBjYW4gYmUgYXBwbGllZCB2aWEgZGVlcE1hcC5cbiAqXG4gKiBJZiByZWN1cnNlIGlzIHRydWUsIHRoZSB2YWx1ZSBzaG91bGQgYmUgZW1wdHksIGFuZCBpdGVyYXRpb24gd2lsbCBjb250aW51ZVxuICogaW50byB0aGUgb2JqZWN0IG9yIGFycmF5LlxuICovXG5leHBvcnQgdHlwZSBEZWVwTWFwUmVzdWx0ID0ge1xuICB2YWx1ZTogYW55LFxuICByZWN1cnNlOiBib29sZWFuXG59O1xuXG4vKipcbiAqIEFwcGx5IGEgbWFwcGluZyBmdW5jdGlvbiB0byBhIG5lc3RlZCBzdHJ1Y3R1cmUgaW4gYSByZWN1cnNpdmUgbWFubmVyLlxuICpcbiAqIFRoZSByZXN1bHQgb2YgdGhlIG1hcHBpbmcgaXMgYW4gb2JqZWN0IHdpdGggdGhlIHNhbWUgbmVzdGVkIHN0cnVjdHVyZSAoaS5lLixcbiAqIG9mIGFycmF5cyBhbmQgZGljdHMpIGFzIHRoZSBpbnB1dCwgZXhjZXB0IHRoYXQgc29tZSBzdWJ0cmVlcyBhcmUgcmVwbGFjZWQsXG4gKiBhY2NvcmRpbmcgdG8gdGhlIHJlc3VsdHMgb2YgdGhlIG1hcHBpbmcgZnVuY3Rpb24uXG4gKlxuICogTWFwcGluZ3MgYXJlIG1lbW9pemVkLiAgVGh1cywgaWYgdGhlIG5lc3RlZCBzdHJ1Y3R1cmUgY29udGFpbnMgdGhlIHNhbWVcbiAqIG9iamVjdCBpbiBtdWx0aXBsZSBwb3NpdGlvbnMsIHRoZSBvdXRwdXQgd2lsbCBjb250YWluIHRoZSBzYW1lIG1hcHBlZCBvYmplY3RcbiAqIGluIHRob3NlIHBvc2l0aW9ucy4gIEN5Y2xlcyBhcmUgbm90IHN1cHBvcnRlZCwgaG93ZXZlci5cbiAqXG4gKiBAcGFyYW0gaW5wdXQ6IFRoZSBvYmplY3QgdG8gd2hpY2ggdG8gYXBwbHkgdGhlIG1hcHBpbmcgZnVuY3Rpb24uXG4gKiBAcGFyYW0gbWFwRm46IEEgZnVuY3Rpb24gdGhhdCBleHBlY3RzIGEgc2luZ2xlIG5vZGUgb2YgdGhlIG9iamVjdCB0cmVlLCBhbmRcbiAqICAgcmV0dXJucyBhIGBEZWVwTWFwUmVzdWx0YC4gIFRoZSBgRGVlcE1hcFJlc3VsdGAgZWl0aGVyIHByb3ZpZGVzIGFcbiAqICAgcmVwbGFjZW1lbnQgdmFsdWUgZm9yIHRoYXQgbm9kZSAoaS5lLiwgcmVwbGFjaW5nIHRoZSBzdWJ0cmVlKSwgb3IgaW5kaWNhdGVzXG4gKiAgIHRoYXQgdGhlIG5vZGUgc2hvdWxkIGJlIHByb2Nlc3NlZCByZWN1cnNpdmVseS5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGRlZXBNYXAoaW5wdXQ6IGFueSwgbWFwRm46ICh4OiBhbnkpID0+IERlZXBNYXBSZXN1bHQpOiBhbnl8XG4gICAgYW55W10ge1xuICByZXR1cm4gZGVlcE1hcEludGVybmFsKGlucHV0LCBtYXBGbik7XG59XG5cbi8qKlxuICogQHBhcmFtIHNlZW46IEEgTWFwIG9mIGtub3duIG9iamVjdCBtYXBwaW5ncyAoaS5lLiwgbWVtb2l6ZWQgcmVzdWx0cyBvZlxuICogICBgbWFwRm4oKWApXG4gKiBAcGFyYW0gY29udGFpbmVkSW46IEFuIHNldCBjb250YWluaW5nIG9iamVjdHMgb24gdGhlIHJlZmVyZW5jZSBwYXRoIGN1cnJlbnRseVxuICogICBiZWluZyBwcm9jZXNzZWQgKHVzZWQgdG8gZGV0ZWN0IGN5Y2xlcykuXG4gKi9cbmZ1bmN0aW9uIGRlZXBNYXBJbnRlcm5hbChcbiAgICBpbnB1dDogYW55LCBtYXBGbjogKHg6IGFueSkgPT4gRGVlcE1hcFJlc3VsdCxcbiAgICBzZWVuOiBNYXA8YW55LCBhbnk+ID0gbmV3IE1hcCgpLCBjb250YWluZWRJbjogU2V0PHt9PiA9IG5ldyBTZXQoKSk6IGFueXxcbiAgICBhbnlbXSB7XG4gIGlmIChpbnB1dCA9PSBudWxsKSB7XG4gICAgcmV0dXJuIG51bGw7XG4gIH1cbiAgaWYgKHR5cGVvZiBCbG9iID09PSAnZnVuY3Rpb24nICYmIGlucHV0IGluc3RhbmNlb2YgQmxvYikge1xuICAgIHJldHVybiBpbnB1dC5zbGljZSgpO1xuICB9XG5cbiAgaWYgKGNvbnRhaW5lZEluLmhhcyhpbnB1dCkpIHtcbiAgICB0aHJvdyBuZXcgRXJyb3IoJ0NpcmN1bGFyIHJlZmVyZW5jZXMgYXJlIG5vdCBzdXBwb3J0ZWQuJyk7XG4gIH1cbiAgaWYgKHNlZW4uaGFzKGlucHV0KSkge1xuICAgIHJldHVybiBzZWVuLmdldChpbnB1dCk7XG4gIH1cbiAgY29uc3QgcmVzdWx0ID0gbWFwRm4oaW5wdXQpO1xuXG4gIGlmIChyZXN1bHQucmVjdXJzZSAmJiByZXN1bHQudmFsdWUgIT09IG51bGwpIHtcbiAgICB0aHJvdyBuZXcgRXJyb3IoXG4gICAgICAgICdBIGRlZXAgbWFwIGZ1bmN0aW9uIG1heSBub3QgcmV0dXJuIGJvdGggYSB2YWx1ZSBhbmQgcmVjdXJzZT10cnVlLicpO1xuICB9XG5cbiAgaWYgKCFyZXN1bHQucmVjdXJzZSkge1xuICAgIHNlZW4uc2V0KGlucHV0LCByZXN1bHQudmFsdWUpO1xuICAgIHJldHVybiByZXN1bHQudmFsdWU7XG4gIH0gZWxzZSBpZiAoaXNJdGVyYWJsZShpbnB1dCkpIHtcbiAgICAvLyB0c2xpbnQ6ZGlzYWJsZS1uZXh0LWxpbmU6bm8tYW55XG4gICAgY29uc3QgbWFwcGVkSXRlcmFibGU6IGFueXxhbnlbXSA9IEFycmF5LmlzQXJyYXkoaW5wdXQpID8gW10gOiB7fTtcbiAgICBjb250YWluZWRJbi5hZGQoaW5wdXQpO1xuICAgIGZvciAoY29uc3QgayBpbiBpbnB1dCkge1xuICAgICAgY29uc3QgY2hpbGQgPSBpbnB1dFtrXTtcbiAgICAgIGNvbnN0IGNoaWxkUmVzdWx0ID0gZGVlcE1hcEludGVybmFsKGNoaWxkLCBtYXBGbiwgc2VlbiwgY29udGFpbmVkSW4pO1xuICAgICAgbWFwcGVkSXRlcmFibGVba10gPSBjaGlsZFJlc3VsdDtcbiAgICB9XG4gICAgY29udGFpbmVkSW4uZGVsZXRlKGlucHV0KTtcbiAgICBpZiAoaW5wdXQuX19wcm90b19fKSB7XG4gICAgICBtYXBwZWRJdGVyYWJsZS5fX3Byb3RvX18gPSBpbnB1dC5fX3Byb3RvX187XG4gICAgfVxuICAgIHJldHVybiBtYXBwZWRJdGVyYWJsZTtcbiAgfSBlbHNlIHtcbiAgICB0aHJvdyBuZXcgRXJyb3IoYENhbid0IHJlY3Vyc2UgaW50byBub24taXRlcmFibGUgdHlwZTogJHtpbnB1dH1gKTtcbiAgfVxufVxuXG4vLyBUT0RPKHNvZXJnZWwsIGthbmd5aXpoYW5nKSBSZWNvbnNpZGVyIG5hbWluZyBvZiBkZWVwWmlwKCkgdG8gYXZvaWQgY29uZnVzaW9uXG4vLyB3aXRoIHppcCgpXG5cbi8qKlxuICogWmlwIG5lc3RlZCBzdHJ1Y3R1cmVzIHRvZ2V0aGVyIGluIGEgcmVjdXJzaXZlIG1hbm5lci5cbiAqXG4gKiBUaGlzIGhhcyB0aGUgZWZmZWN0IG9mIHRyYW5zcG9zaW5nIG9yIHBpdm90aW5nIGRhdGEsIGUuZy4gY29udmVydGluZyBpdCBmcm9tXG4gKiBhIHJvdy1tYWpvciByZXByZXNlbnRhdGlvbiB0byBhIGNvbHVtbi1tYWpvciByZXByZXNlbnRhdGlvbi5cbiAqXG4gKiBGb3IgZXhhbXBsZSwgYGRlZXBaaXAoW3thOiAxLCBiOiAyfSwge2E6IDMsIGI6IDR9XSlgIHJldHVybnNcbiAqIGB7YTogWzEsIDNdLCBiOiBbMiwgNF19YC5cbiAqXG4gKiBUaGUgaW5wdXRzIHNob3VsZCBhbGwgaGF2ZSB0aGUgc2FtZSBuZXN0ZWQgc3RydWN0dXJlIChpLmUuLCBvZiBhcnJheXMgYW5kXG4gKiBkaWN0cykuICBUaGUgcmVzdWx0IGlzIGEgc2luZ2xlIG9iamVjdCB3aXRoIHRoZSBzYW1lIG5lc3RlZCBzdHJ1Y3R1cmUsIHdoZXJlXG4gKiB0aGUgbGVhdmVzIGFyZSBhcnJheXMgY29sbGVjdGluZyB0aGUgdmFsdWVzIG9mIHRoZSBpbnB1dHMgYXQgdGhhdCBsb2NhdGlvblxuICogKG9yLCBvcHRpb25hbGx5LCB0aGUgcmVzdWx0IG9mIGEgY3VzdG9tIGZ1bmN0aW9uIGFwcGxpZWQgdG8gdGhvc2UgYXJyYXlzKS5cbiAqXG4gKiBAcGFyYW0gaW5wdXRzOiBBbiBhcnJheSBvZiB0aGUgb2JqZWN0cyB0byB6aXAgdG9nZXRoZXIuXG4gKiBAcGFyYW0gemlwRm46IChvcHRpb25hbCkgQSBmdW5jdGlvbiB0aGF0IGV4cGVjdHMgYW4gYXJyYXkgb2YgZWxlbWVudHMgYXQgYVxuICogICBzaW5nbGUgbm9kZSBvZiB0aGUgb2JqZWN0IHRyZWUsIGFuZCByZXR1cm5zIGEgYERlZXBNYXBSZXN1bHRgLiAgVGhlXG4gKiAgIGBEZWVwTWFwUmVzdWx0YCBlaXRoZXIgcHJvdmlkZXMgYSByZXN1bHQgdmFsdWUgZm9yIHRoYXQgbm9kZSAoaS5lLixcbiAqICAgcmVwcmVzZW50aW5nIHRoZSBzdWJ0cmVlKSwgb3IgaW5kaWNhdGVzIHRoYXQgdGhlIG5vZGUgc2hvdWxkIGJlIHByb2Nlc3NlZFxuICogICByZWN1cnNpdmVseS4gIFRoZSBkZWZhdWx0IHppcEZuIHJlY3Vyc2VzIGFzIGZhciBhcyBwb3NzaWJsZSBhbmQgcGxhY2VzXG4gKiAgIGFycmF5cyBhdCB0aGUgbGVhdmVzLlxuICovXG5leHBvcnQgZnVuY3Rpb24gZGVlcFppcChcbiAgICBpbnB1dHM6IGFueVtdLCB6aXBGbjogKHhzOiBhbnlbXSkgPT4gRGVlcE1hcFJlc3VsdCA9IHppcFRvTGlzdCk6IGFueXxhbnlbXSB7XG4gIHJldHVybiBkZWVwWmlwSW50ZXJuYWwoaW5wdXRzLCB6aXBGbik7XG59XG5cbi8qKlxuICogQHBhcmFtIGNvbnRhaW5lZEluOiBBbiBzZXQgY29udGFpbmluZyBvYmplY3RzIG9uIHRoZSByZWZlcmVuY2UgcGF0aCBjdXJyZW50bHlcbiAqICAgYmVpbmcgcHJvY2Vzc2VkICh1c2VkIHRvIGRldGVjdCBjeWNsZXMpLlxuICovXG5mdW5jdGlvbiBkZWVwWmlwSW50ZXJuYWwoXG4gICAgaW5wdXRzOiBhbnlbXSwgemlwRm46ICh4czogYW55W10pID0+IERlZXBNYXBSZXN1bHQsXG4gICAgY29udGFpbmVkSW46IFNldDx7fT4gPSBuZXcgU2V0KCkpOiBhbnl8YW55W10ge1xuICAvLyBUaGUgcmVjdXJzaW9uIGZvbGxvd3MgdGhlIHN0cnVjdHVyZSBvZiBpbnB1dCAwOyBpdCdzIGFzc3VtZWQgdGhhdCBhbGwgdGhlXG4gIC8vIG90aGVyIGlucHV0cyBoYXZlIHRoZSBzYW1lIHN0cnVjdHVyZS5cbiAgY29uc3QgaW5wdXQgPSBpbnB1dHNbMF07XG4gIGlmIChjb250YWluZWRJbi5oYXMoaW5wdXQpKSB7XG4gICAgdGhyb3cgbmV3IEVycm9yKCdDaXJjdWxhciByZWZlcmVuY2VzIGFyZSBub3Qgc3VwcG9ydGVkLicpO1xuICB9XG4gIGNvbnN0IHJlc3VsdCA9IHppcEZuKGlucHV0cyk7XG5cbiAgaWYgKHJlc3VsdC5yZWN1cnNlICYmIHJlc3VsdC52YWx1ZSAhPT0gbnVsbCkge1xuICAgIHRocm93IG5ldyBFcnJvcihcbiAgICAgICAgJ0EgZGVlcCB6aXAgZnVuY3Rpb24gbWF5IG5vdCByZXR1cm4gYm90aCBhIHZhbHVlIGFuZCByZWN1cnNlPXRydWUuJyk7XG4gIH1cblxuICBpZiAoIXJlc3VsdC5yZWN1cnNlKSB7XG4gICAgcmV0dXJuIHJlc3VsdC52YWx1ZTtcbiAgfSBlbHNlIGlmIChpc0l0ZXJhYmxlKGlucHV0KSkge1xuICAgIC8vIHRzbGludDpkaXNhYmxlLW5leHQtbGluZTpuby1hbnlcbiAgICBjb25zdCBtYXBwZWRJdGVyYWJsZTogYW55fGFueVtdID0gQXJyYXkuaXNBcnJheShpbnB1dCkgPyBbXSA6IHt9O1xuICAgIGNvbnRhaW5lZEluLmFkZChpbnB1dCk7XG4gICAgZm9yIChjb25zdCBrIGluIGlucHV0KSB7XG4gICAgICBjb25zdCBjaGlsZHJlbiA9IGlucHV0cy5tYXAoeCA9PiB4W2tdKTtcbiAgICAgIGNvbnN0IGNoaWxkUmVzdWx0ID0gZGVlcFppcEludGVybmFsKGNoaWxkcmVuLCB6aXBGbiwgY29udGFpbmVkSW4pO1xuICAgICAgbWFwcGVkSXRlcmFibGVba10gPSBjaGlsZFJlc3VsdDtcbiAgICB9XG4gICAgY29udGFpbmVkSW4uZGVsZXRlKGlucHV0KTtcbiAgICByZXR1cm4gbWFwcGVkSXRlcmFibGU7XG4gIH0gZWxzZSB7XG4gICAgdGhyb3cgbmV3IEVycm9yKGBDYW4ndCByZWN1cnNlIGludG8gbm9uLWl0ZXJhYmxlIHR5cGU6ICR7aW5wdXR9YCk7XG4gIH1cbn1cblxuLy8gdHNsaW50OmRpc2FibGUtbmV4dC1saW5lOm5vLWFueVxuZXhwb3J0IGZ1bmN0aW9uIHppcFRvTGlzdCh4OiBhbnlbXSk6IERlZXBNYXBSZXN1bHQge1xuICBpZiAoeCA9PT0gbnVsbCkge1xuICAgIHJldHVybiBudWxsO1xuICB9XG4gIC8vIFRPRE8oc29lcmdlbCk6IHZhbGlkYXRlIGFycmF5IHR5cGU/XG5cbiAgaWYgKGlzSXRlcmFibGUoeFswXSkpIHtcbiAgICByZXR1cm4ge3ZhbHVlOiBudWxsLCByZWN1cnNlOiB0cnVlfTtcbiAgfSBlbHNlIHtcbiAgICByZXR1cm4ge3ZhbHVlOiB4LCByZWN1cnNlOiBmYWxzZX07XG4gIH1cbn1cblxuLyoqXG4gKiBBIHJldHVybiB2YWx1ZSBmb3IgYW4gYXN5bmMgbWFwIGZ1bmN0aW9uIGZvciB1c2Ugd2l0aCBkZWVwTWFwQW5kQXdhaXRBbGwuXG4gKlxuICogSWYgcmVjdXJzZSBpcyB0cnVlLCB0aGUgdmFsdWUgc2hvdWxkIGJlIGVtcHR5LCBhbmQgaXRlcmF0aW9uIHdpbGwgY29udGludWVcbiAqIGludG8gdGhlIG9iamVjdCBvciBhcnJheS5cbiAqL1xuZXhwb3J0IHR5cGUgRGVlcE1hcEFzeW5jUmVzdWx0ID0ge1xuICB2YWx1ZTogUHJvbWlzZTxhbnk+LFxuICByZWN1cnNlOiBib29sZWFuXG59O1xuXG4vKipcbiAqIEFwcGx5IGFuIGFzeW5jIG1hcHBpbmcgZnVuY3Rpb24gdG8gYSBuZXN0ZWQgc3RydWN0dXJlIGluIGEgcmVjdXJzaXZlIG1hbm5lci5cbiAqXG4gKiBUaGlzIGZpcnN0IGNyZWF0ZXMgYSBuZXN0ZWQgc3RydWN0dXJlIG9mIFByb21pc2VzLCBhbmQgdGhlbiBhd2FpdHMgYWxsIG9mXG4gKiB0aG9zZSwgcmVzdWx0aW5nIGluIGEgc2luZ2xlIFByb21pc2UgZm9yIGEgcmVzb2x2ZWQgbmVzdGVkIHN0cnVjdHVyZS5cbiAqXG4gKiBUaGUgcmVzdWx0IG9mIHRoZSBtYXBwaW5nIGlzIGFuIG9iamVjdCB3aXRoIHRoZSBzYW1lIG5lc3RlZCBzdHJ1Y3R1cmUgKGkuZS4sXG4gKiBvZiBhcnJheXMgYW5kIGRpY3RzKSBhcyB0aGUgaW5wdXQsIGV4Y2VwdCB0aGF0IHNvbWUgc3VidHJlZXMgYXJlIHJlcGxhY2VkLFxuICogYWNjb3JkaW5nIHRvIHRoZSByZXN1bHRzIG9mIHRoZSBtYXBwaW5nIGZ1bmN0aW9uLlxuICpcbiAqIE1hcHBpbmdzIGFyZSBtZW1vaXplZC4gIFRodXMsIGlmIHRoZSBuZXN0ZWQgc3RydWN0dXJlIGNvbnRhaW5zIHRoZSBzYW1lXG4gKiBvYmplY3QgaW4gbXVsdGlwbGUgcG9zaXRpb25zLCB0aGUgb3V0cHV0IHdpbGwgY29udGFpbiB0aGUgc2FtZSBtYXBwZWQgb2JqZWN0XG4gKiBpbiB0aG9zZSBwb3NpdGlvbnMuICBDeWNsZXMgYXJlIG5vdCBzdXBwb3J0ZWQsIGhvd2V2ZXIuXG4gKlxuICogQHBhcmFtIGlucHV0OiBUaGUgb2JqZWN0IHRvIHdoaWNoIHRvIGFwcGx5IHRoZSBtYXBwaW5nIGZ1bmN0aW9uLlxuICogQHBhcmFtIG1hcEZuOiBBIGZ1bmN0aW9uIHRoYXQgZXhwZWN0cyBhIHNpbmdsZSBub2RlIG9mIHRoZSBvYmplY3QgdHJlZSwgYW5kXG4gKiAgIHJldHVybnMgYSBgRGVlcE1hcEFzeW5jUmVzdWx0YC4gIFRoZSBgRGVlcE1hcEFzeW5jUmVzdWx0YCBlaXRoZXIgcHJvdmlkZXNcbiAqICAgYSBgUHJvbWlzZWAgZm9yIGEgcmVwbGFjZW1lbnQgdmFsdWUgZm9yIHRoYXQgbm9kZSAoaS5lLiwgcmVwbGFjaW5nIHRoZVxuICogICBzdWJ0cmVlKSwgb3IgaW5kaWNhdGVzIHRoYXQgdGhlIG5vZGUgc2hvdWxkIGJlIHByb2Nlc3NlZCByZWN1cnNpdmVseS4gIE5vdGVcbiAqICAgdGhhdCB0aGUgZGVjaXNpb24gd2hldGhlciBvciBub3QgdG8gcmVjdXJzZSBtdXN0IGJlIG1hZGUgaW1tZWRpYXRlbHk7IG9ubHlcbiAqICAgdGhlIG1hcHBlZCB2YWx1ZSBtYXkgYmUgcHJvbWlzZWQuXG4gKi9cbmV4cG9ydCBhc3luYyBmdW5jdGlvbiBkZWVwTWFwQW5kQXdhaXRBbGwoXG4gICAgaW5wdXQ6IGFueSwgbWFwRm46ICh4OiBhbnkpID0+IERlZXBNYXBBc3luY1Jlc3VsdCk6IFByb21pc2U8YW55fGFueVtdPiB7XG4gIGNvbnN0IHNlZW46IE1hcDxhbnksIGFueT4gPSBuZXcgTWFwKCk7XG5cbiAgLy8gRmlyc3QgZG8gYSBub3JtYWwgZGVlcE1hcCwgY29sbGVjdGluZyBQcm9taXNlcyBpbiAnc2VlbicgYXMgYSBzaWRlIGVmZmVjdC5cbiAgZGVlcE1hcEludGVybmFsKGlucHV0LCBtYXBGbiwgc2Vlbik7XG5cbiAgLy8gUmVwbGFjZSB0aGUgUHJvbWlzZXMgaW4gJ3NlZW4nIGluIHBsYWNlLlxuICAvLyBOb3RlIFR5cGVTY3JpcHQgcHJvdmlkZXMgbm8gYXN5bmMgbWFwIGl0ZXJhdGlvbiwgYW5kIHJlZ3VsYXIgbWFwIGl0ZXJhdGlvblxuICAvLyBpcyBicm9rZW4gdG9vLCBzbyBzYWRseSB3ZSBoYXZlIHRvIGRvIEFycmF5LmZyb20oKSB0byBtYWtlIGl0IHdvcmsuXG4gIC8vIChUaGVyZSdzIG5vIGFkdmFudGFnZSB0byBQcm9taXNlLmFsbCgpLCBhbmQgdGhhdCB3b3VsZCBiZSB0cmlja3kgYW55d2F5LilcbiAgZm9yIChjb25zdCBrZXkgb2YgQXJyYXkuZnJvbShzZWVuLmtleXMoKSkpIHtcbiAgICBjb25zdCB2YWx1ZSA9IHNlZW4uZ2V0KGtleSk7XG4gICAgaWYgKHRmLnV0aWwuaXNQcm9taXNlKHZhbHVlKSkge1xuICAgICAgY29uc3QgbWFwcGVkVmFsdWUgPSBhd2FpdCB2YWx1ZTtcbiAgICAgIHNlZW4uc2V0KGtleSwgbWFwcGVkVmFsdWUpO1xuICAgIH1cbiAgfVxuXG4gIC8vIE5vcm1hbCBkZWVwTWFwIGFnYWluLCB0aGlzIHRpbWUgZmlsbGluZyBpbiB0aGUgcmVzb2x2ZWQgdmFsdWVzLlxuICAvLyBJdCdzIHVuZm9ydHVuYXRlIHRoYXQgd2UgaGF2ZSB0byBkbyB0d28gcGFzc2VzLlxuICAvLyBUT0RPKHNvZXJnZWwpOiB0ZXN0IHBlcmZvcm1hbmNlIGFuZCB0aGluayBoYXJkZXIgYWJvdXQgYSBmYXN0IHNvbHV0aW9uLlxuICBjb25zdCByZXN1bHQgPSBkZWVwTWFwSW50ZXJuYWwoaW5wdXQsIG1hcEZuLCBzZWVuKTtcbiAgcmV0dXJuIHJlc3VsdDtcbn1cblxuLyoqXG4gKiBEZXRlcm1pbmUgd2hldGhlciB0aGUgYXJndW1lbnQgaXMgaXRlcmFibGUuXG4gKlxuICogQHJldHVybnMgdHJ1ZSBpZiB0aGUgYXJndW1lbnQgaXMgYW4gYXJyYXkgb3IgYW55IG5vbi1UZW5zb3Igb2JqZWN0LlxuICovXG4vLyB0c2xpbnQ6ZGlzYWJsZS1uZXh0LWxpbmU6bm8tYW55XG5leHBvcnQgZnVuY3Rpb24gaXNJdGVyYWJsZShvYmo6IGFueSk6IGJvb2xlYW4ge1xuICBsZXQgaXNUZXh0RGVjb2RlciA9IGZhbHNlO1xuICBpZiAodGYuZW52KCkuZ2V0KCdJU19CUk9XU0VSJykpIHtcbiAgICBpc1RleHREZWNvZGVyID0gb2JqIGluc3RhbmNlb2YgVGV4dERlY29kZXI7XG4gIH0gZWxzZSB7XG4gICAgLy8gdHNsaW50OmRpc2FibGUtbmV4dC1saW5lOm5vLXJlcXVpcmUtaW1wb3J0c1xuICAgIGNvbnN0IHtTdHJpbmdEZWNvZGVyfSA9IHJlcXVpcmUoJ3N0cmluZ19kZWNvZGVyJyk7XG4gICAgaXNUZXh0RGVjb2RlciA9IG9iaiBpbnN0YW5jZW9mIFN0cmluZ0RlY29kZXI7XG4gIH1cbiAgcmV0dXJuIG9iaiAhPSBudWxsICYmICghQXJyYXlCdWZmZXIuaXNWaWV3KG9iaikpICYmXG4gICAgICAoQXJyYXkuaXNBcnJheShvYmopIHx8XG4gICAgICAgKHR5cGVvZiBvYmogPT09ICdvYmplY3QnICYmICEob2JqIGluc3RhbmNlb2YgdGYuVGVuc29yKSAmJlxuICAgICAgICAhKG9iaiBpbnN0YW5jZW9mIFByb21pc2UpICYmICFpc1RleHREZWNvZGVyKSk7XG59XG5cbi8qKlxuICogRGV0ZXJtaW5lIHdoZXRoZXIgdGhlIGFyZ3VtZW50IGNhbiBiZSBjb252ZXJ0ZWQgdG8gVGVuc29yLlxuICpcbiAqIFRlbnNvcnMsIHByaW1pdGl2ZXMsIGFycmF5cywgYW5kIFR5cGVkQXJyYXlzIGFsbCBxdWFsaWZ5OyBhbnl0aGluZyBlbHNlIGRvZXNcbiAqIG5vdC5cbiAqXG4gKiBAcmV0dXJucyB0cnVlIGlmIHRoZSBhcmd1bWVudCBjYW4gYmUgY29udmVydGVkIHRvIFRlbnNvci5cbiAqL1xuLy8gdHNsaW50OmRpc2FibGUtbmV4dC1saW5lOm5vLWFueVxuZXhwb3J0IGZ1bmN0aW9uIGNhblRlbnNvcmlmeShvYmo6IGFueSk6IGJvb2xlYW4ge1xuICByZXR1cm4gb2JqID09IG51bGwgfHwgaXNQcmltaXRpdmUob2JqKSB8fCBBcnJheS5pc0FycmF5KG9iaikgfHxcbiAgICAgICh0eXBlb2Ygb2JqID09PSAnb2JqZWN0JyAmJiAob2JqIGluc3RhbmNlb2YgdGYuVGVuc29yKSkgfHxcbiAgICAgIHRmLnV0aWwuaXNUeXBlZEFycmF5KG9iaik7XG59XG5cbi8qKlxuICogUmV0dXJucyB0cnVlIGlmIHRoZSBnaXZlbiBgdmFsdWVgIGlzIGEgcHJpbWl0aXZlIHR5cGUuIE90aGVyd2lzZSByZXR1cm5zXG4gKiBmYWxzZS4gVGhpcyBpcyBlcXVpdmFsYW50IHRvIG5vZGUgdXRpbC5pc1ByaW1pdGl2ZVxuICovXG5mdW5jdGlvbiBpc1ByaW1pdGl2ZSh2YWx1ZTogYW55KTogYm9vbGVhbiB7XG4gIHJldHVybiAoXG4gICAgICB2YWx1ZSA9PT0gbnVsbCB8fFxuICAgICAgKHR5cGVvZiB2YWx1ZSAhPT0gJ29iamVjdCcgJiYgdHlwZW9mIHZhbHVlICE9PSAnZnVuY3Rpb24nKSk7XG59XG4iXX0=","/**\n * @license\n * Copyright 2018 Google LLC. All Rights Reserved.\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n *\n * =============================================================================\n */\nimport * as tf from '@tensorflow/tfjs-core';\nimport { deepMap, isIterable } from './deep_map';\nexport function deepClone(container) {\n return deepMap(container, cloneIfTensor);\n}\n// tslint:disable-next-line: no-any\nfunction cloneIfTensor(item) {\n if (item instanceof tf.Tensor) {\n return ({ value: item.clone(), recurse: false });\n }\n else if (isIterable(item)) {\n return { value: null, recurse: true };\n }\n else {\n return { value: item, recurse: false };\n }\n}\n//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZGVlcF9jbG9uZS5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uLy4uL3RmanMtZGF0YS9zcmMvdXRpbC9kZWVwX2Nsb25lLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBOzs7Ozs7Ozs7Ozs7Ozs7O0dBZ0JHO0FBRUgsT0FBTyxLQUFLLEVBQUUsTUFBTSx1QkFBdUIsQ0FBQztBQUM1QyxPQUFPLEVBQUMsT0FBTyxFQUFpQixVQUFVLEVBQUMsTUFBTSxZQUFZLENBQUM7QUFFOUQsTUFBTSxVQUFVLFNBQVMsQ0FBSSxTQUFZO0lBQ3ZDLE9BQU8sT0FBTyxDQUFDLFNBQVMsRUFBRSxhQUFhLENBQUMsQ0FBQztBQUMzQyxDQUFDO0FBRUQsbUNBQW1DO0FBQ25DLFNBQVMsYUFBYSxDQUFDLElBQVM7SUFDOUIsSUFBSSxJQUFJLFlBQVksRUFBRSxDQUFDLE1BQU0sRUFBRTtRQUM3QixPQUFPLENBQUMsRUFBQyxLQUFLLEVBQUUsSUFBSSxDQUFDLEtBQUssRUFBRSxFQUFFLE9BQU8sRUFBRSxLQUFLLEVBQUMsQ0FBQyxDQUFDO0tBQ2hEO1NBQU0sSUFBSSxVQUFVLENBQUMsSUFBSSxDQUFDLEVBQUU7UUFDM0IsT0FBTyxFQUFDLEtBQUssRUFBRSxJQUFJLEVBQUUsT0FBTyxFQUFFLElBQUksRUFBQyxDQUFDO0tBQ3JDO1NBQU07UUFDTCxPQUFPLEVBQUMsS0FBSyxFQUFFLElBQUksRUFBRSxPQUFPLEVBQUUsS0FBSyxFQUFDLENBQUM7S0FDdEM7QUFDSCxDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiLyoqXG4gKiBAbGljZW5zZVxuICogQ29weXJpZ2h0IDIwMTggR29vZ2xlIExMQy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC5cbiAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSBcIkxpY2Vuc2VcIik7XG4gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuXG4gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXRcbiAqXG4gKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjBcbiAqXG4gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlXG4gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiBcIkFTIElTXCIgQkFTSVMsXG4gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC5cbiAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmRcbiAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLlxuICpcbiAqID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4gKi9cblxuaW1wb3J0ICogYXMgdGYgZnJvbSAnQHRlbnNvcmZsb3cvdGZqcy1jb3JlJztcbmltcG9ydCB7ZGVlcE1hcCwgRGVlcE1hcFJlc3VsdCwgaXNJdGVyYWJsZX0gZnJvbSAnLi9kZWVwX21hcCc7XG5cbmV4cG9ydCBmdW5jdGlvbiBkZWVwQ2xvbmU8VD4oY29udGFpbmVyOiBUKTogVCB7XG4gIHJldHVybiBkZWVwTWFwKGNvbnRhaW5lciwgY2xvbmVJZlRlbnNvcik7XG59XG5cbi8vIHRzbGludDpkaXNhYmxlLW5leHQtbGluZTogbm8tYW55XG5mdW5jdGlvbiBjbG9uZUlmVGVuc29yKGl0ZW06IGFueSk6IERlZXBNYXBSZXN1bHQge1xuICBpZiAoaXRlbSBpbnN0YW5jZW9mIHRmLlRlbnNvcikge1xuICAgIHJldHVybiAoe3ZhbHVlOiBpdGVtLmNsb25lKCksIHJlY3Vyc2U6IGZhbHNlfSk7XG4gIH0gZWxzZSBpZiAoaXNJdGVyYWJsZShpdGVtKSkge1xuICAgIHJldHVybiB7dmFsdWU6IG51bGwsIHJlY3Vyc2U6IHRydWV9O1xuICB9IGVsc2Uge1xuICAgIHJldHVybiB7dmFsdWU6IGl0ZW0sIHJlY3Vyc2U6IGZhbHNlfTtcbiAgfVxufVxuIl19","/**\n * @license\n * Copyright 2018 Google LLC. All Rights Reserved.\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n *\n * =============================================================================\n */\n/**\n * A ring buffer, providing O(1) FIFO, LIFO, and related operations.\n */\nexport class RingBuffer {\n /**\n * Constructs a `RingBuffer`.\n * @param capacity The number of items that the buffer can accomodate.\n */\n constructor(capacity) {\n this.capacity = capacity;\n // Note we store the indices in the range 0 <= index < 2*capacity.\n // This allows us to distinguish the full from the empty case.\n // See https://www.snellman.net/blog/archive/2016-12-13-ring-buffers/\n this.begin = 0; // inclusive\n this.end = 0; // exclusive\n if (capacity == null) {\n throw new RangeError('Can\\'t create a ring buffer of unknown capacity.');\n }\n if (capacity < 1) {\n throw new RangeError('Can\\'t create ring buffer of capacity < 1.');\n }\n this.data = new Array(capacity);\n this.doubledCapacity = 2 * capacity;\n }\n /**\n * Map any index into the range 0 <= index < 2*capacity.\n */\n wrap(index) {\n // don't trust % on negative numbers\n while (index < 0) {\n index += this.doubledCapacity;\n }\n return index % this.doubledCapacity;\n }\n get(index) {\n if (index < 0) {\n throw new RangeError('Can\\'t get item at a negative index.');\n }\n return this.data[index % this.capacity];\n }\n set(index, value) {\n if (index < 0) {\n throw new RangeError('Can\\'t set item at a negative index.');\n }\n this.data[index % this.capacity] = value;\n }\n /**\n * Returns the current number of items in the buffer.\n */\n length() {\n let length = this.end - this.begin;\n if (length < 0) {\n length = this.doubledCapacity + length;\n }\n return length;\n }\n /**\n * Reports whether the buffer is full.\n * @returns true if the number of items in the buffer equals its capacity, and\n * false otherwise.\n */\n isFull() {\n return this.length() === this.capacity;\n }\n /**\n * Reports whether the buffer is empty.\n * @returns true if the number of items in the buffer equals zero, and\n * false otherwise.\n */\n isEmpty() {\n return this.length() === 0;\n }\n /**\n * Adds an item to the end of the buffer.\n */\n push(value) {\n if (this.isFull()) {\n throw new RangeError('Ring buffer is full.');\n }\n this.set(this.end, value);\n this.end = this.wrap(this.end + 1);\n }\n /**\n * Adds many items to the end of the buffer, in order.\n */\n pushAll(values) {\n for (const value of values) {\n this.push(value);\n }\n }\n /**\n * Removes and returns the last item in the buffer.\n */\n pop() {\n if (this.isEmpty()) {\n throw new RangeError('Ring buffer is empty.');\n }\n this.end = this.wrap(this.end - 1);\n const result = this.get(this.end);\n this.set(this.end, undefined);\n return result;\n }\n /**\n * Adds an item to the beginning of the buffer.\n */\n unshift(value) {\n if (this.isFull()) {\n throw new RangeError('Ring buffer is full.');\n }\n this.begin = this.wrap(this.begin - 1);\n this.set(this.begin, value);\n }\n /**\n * Removes and returns the first item in the buffer.\n */\n shift() {\n if (this.isEmpty()) {\n throw new RangeError('Ring buffer is empty.');\n }\n const result = this.get(this.begin);\n this.set(this.begin, undefined);\n this.begin = this.wrap(this.begin + 1);\n return result;\n }\n /**\n * Removes and returns a specific item in the buffer, and moves the last item\n * to the vacated slot. This is useful for implementing a shuffling stream.\n * Note that this operation necessarily scrambles the original order.\n *\n * @param relativeIndex: the index of the item to remove, relative to the\n * first item in the buffer (e.g., hiding the ring nature of the underlying\n * storage).\n */\n shuffleExcise(relativeIndex) {\n if (this.isEmpty()) {\n throw new RangeError('Ring buffer is empty.');\n }\n const index = this.wrap(this.begin + relativeIndex);\n const result = this.get(index);\n this.set(index, this.pop());\n return result;\n }\n}\n//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicmluZ19idWZmZXIuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi8uLi90ZmpzLWRhdGEvc3JjL3V0aWwvcmluZ19idWZmZXIudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUE7Ozs7Ozs7Ozs7Ozs7Ozs7R0FnQkc7QUFFSDs7R0FFRztBQUNILE1BQU0sT0FBTyxVQUFVO0lBVXJCOzs7T0FHRztJQUNILFlBQW1CLFFBQWdCO1FBQWhCLGFBQVEsR0FBUixRQUFRLENBQVE7UUFibkMsa0VBQWtFO1FBQ2xFLDhEQUE4RDtRQUM5RCxxRUFBcUU7UUFDM0QsVUFBSyxHQUFHLENBQUMsQ0FBQyxDQUFFLFlBQVk7UUFDeEIsUUFBRyxHQUFHLENBQUMsQ0FBQyxDQUFJLFlBQVk7UUFVaEMsSUFBSSxRQUFRLElBQUksSUFBSSxFQUFFO1lBQ3BCLE1BQU0sSUFBSSxVQUFVLENBQUMsa0RBQWtELENBQUMsQ0FBQztTQUMxRTtRQUNELElBQUksUUFBUSxHQUFHLENBQUMsRUFBRTtZQUNoQixNQUFNLElBQUksVUFBVSxDQUFDLDRDQUE0QyxDQUFDLENBQUM7U0FDcEU7UUFDRCxJQUFJLENBQUMsSUFBSSxHQUFHLElBQUksS0FBSyxDQUFJLFFBQVEsQ0FBQyxDQUFDO1FBQ25DLElBQUksQ0FBQyxlQUFlLEdBQUcsQ0FBQyxHQUFHLFFBQVEsQ0FBQztJQUN0QyxDQUFDO0lBRUQ7O09BRUc7SUFDTyxJQUFJLENBQUMsS0FBYTtRQUMxQixvQ0FBb0M7UUFDcEMsT0FBTyxLQUFLLEdBQUcsQ0FBQyxFQUFFO1lBQ2hCLEtBQUssSUFBSSxJQUFJLENBQUMsZUFBZSxDQUFDO1NBQy9CO1FBQ0QsT0FBTyxLQUFLLEdBQUcsSUFBSSxDQUFDLGVBQWUsQ0FBQztJQUN0QyxDQUFDO0lBRVMsR0FBRyxDQUFDLEtBQWE7UUFDekIsSUFBSSxLQUFLLEdBQUcsQ0FBQyxFQUFFO1lBQ2IsTUFBTSxJQUFJLFVBQVUsQ0FBQyxzQ0FBc0MsQ0FBQyxDQUFDO1NB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QUFDO1FBQ3BDLElBQUksQ0FBQyxHQUFHLENBQUMsSUFBSSxDQUFDLEtBQUssRUFBRSxTQUFTLENBQUMsQ0FBQztRQUNoQyxJQUFJLENBQUMsS0FBSyxHQUFHLElBQUksQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLEtBQUssR0FBRyxDQUFDLENBQUMsQ0FBQztRQUN2QyxPQUFPLE1BQU0sQ0FBQztJQUNoQixDQUFDO0lBRUQ7Ozs7Ozs7O09BUUc7SUFDSCxhQUFhLENBQUMsYUFBcUI7UUFDakMsSUFBSSxJQUFJLENBQUMsT0FBTyxFQUFFLEVBQUU7WUFDbEIsTUFBTSxJQUFJLFVBQVUsQ0FBQyx1QkFBdUIsQ0FBQyxDQUFDO1NBQy9DO1FBQ0QsTUFBTSxLQUFLLEdBQUcsSUFBSSxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsS0FBSyxHQUFHLGFBQWEsQ0FBQyxDQUFDO1FBQ3BELE1BQU0sTUFBTSxHQUFHLElBQUksQ0FBQyxHQUFHLENBQUMsS0FBSyxDQUFDLENBQUM7UUFDL0IsSUFBSSxDQUFDLEdBQUcsQ0FBQyxLQUFLLEVBQUUsSUFBSSxDQUFDLEdBQUcsRUFBRSxDQUFDLENBQUM7UUFDNUIsT0FBTyxNQUFNLENBQUM7SUFDaEIsQ0FBQztDQUNGIiwic291cmNlc0NvbnRlbnQiOlsiLyoqXG4gKiBAbGljZW5zZVxuICogQ29weXJpZ2h0IDIwMTggR29vZ2xlIExMQy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC5cbiAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSBcIkxpY2Vuc2VcIik7XG4gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuXG4gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXRcbiAqXG4gKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjBcbiAqXG4gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlXG4gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiBcIkFTIElTXCIgQkFTSVMsXG4gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC5cbiAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmRcbiAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLlxuICpcbiAqID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4gKi9cblxuLyoqXG4gKiBBIHJpbmcgYnVmZmVyLCBwcm92aWRpbmcgTygxKSBGSUZPLCBMSUZPLCBhbmQgcmVsYXRlZCBvcGVyYXRpb25zLlxuICovXG5leHBvcnQgY2xhc3MgUmluZ0J1ZmZlcjxUPiB7XG4gIC8vIE5vdGUgd2Ugc3RvcmUgdGhlIGluZGljZXMgaW4gdGhlIHJhbmdlIDAgPD0gaW5kZXggPCAyKmNhcGFjaXR5LlxuICAvLyBUaGlzIGFsbG93cyB1cyB0byBkaXN0aW5ndWlzaCB0aGUgZnVsbCBmcm9tIHRoZSBlbXB0eSBjYXNlLlxuICAvLyBTZWUgaHR0cHM6Ly93d3cuc25lbGxtYW4ubmV0L2Jsb2cvYXJjaGl2ZS8yMDE2LTEyLTEzLXJpbmctYnVmZmVycy9cbiAgcHJvdGVjdGVkIGJlZ2luID0gMDsgIC8vIGluY2x1c2l2ZVxuICBwcm90ZWN0ZWQgZW5kID0gMDsgICAgLy8gZXhjbHVzaXZlXG4gIHByb3RlY3RlZCBkb3VibGVkQ2FwYWNpdHk6IG51bWJlcjtcblxuICBwcm90ZWN0ZWQgZGF0YTogVFtdO1xuXG4gIC8qKlxuICAgKiBDb25zdHJ1Y3RzIGEgYFJpbmdCdWZmZXJgLlxuICAgKiBAcGFyYW0gY2FwYWNpdHkgVGhlIG51bWJlciBvZiBpdGVtcyB0aGF0IHRoZSBidWZmZXIgY2FuIGFjY29tb2RhdGUuXG4gICAqL1xuICBjb25zdHJ1Y3RvcihwdWJsaWMgY2FwYWNpdHk6IG51bWJlcikge1xuICAgIGlmIChjYXBhY2l0eSA9PSBudWxsKSB7XG4gICAgICB0aHJvdyBuZXcgUmFuZ2VFcnJvcignQ2FuXFwndCBjcmVhdGUgYSByaW5nIGJ1ZmZlciBvZiB1bmtub3duIGNhcGFjaXR5LicpO1xuICAgIH1cbiAgICBpZiAoY2FwYWNpdHkgPCAxKSB7XG4gICAgICB0aHJvdyBuZXcgUmFuZ2VFcnJvcignQ2FuXFwndCBjcmVhdGUgcmluZyBidWZmZXIgb2YgY2FwYWNpdHkgPCAxLicpO1xuICAgIH1cbiAgICB0aGlzLmRhdGEgPSBuZXcgQXJyYXk8VD4oY2FwYWNpdHkpO1xuICAgIHRoaXMuZG91YmxlZENhcGFjaXR5ID0gMiAqIGNhcGFjaXR5O1xuICB9XG5cbiAgLyoqXG4gICAqIE1hcCBhbnkgaW5kZXggaW50byB0aGUgcmFuZ2UgMCA8PSBpbmRleCA8IDIqY2FwYWNpdHkuXG4gICAqL1xuICBwcm90ZWN0ZWQgd3JhcChpbmRleDogbnVtYmVyKSB7XG4gICAgLy8gZG9uJ3QgdHJ1c3QgJSBvbiBuZWdhdGl2ZSBudW1iZXJzXG4gICAgd2hpbGUgKGluZGV4IDwgMCkge1xuICAgICAgaW5kZXggKz0gdGhpcy5kb3VibGVkQ2FwYWNpdHk7XG4gICAgfVxuICAgIHJldHVybiBpbmRleCAlIHRoaXMuZG91YmxlZENhcGFjaXR5O1xuICB9XG5cbiAgcHJvdGVjdGVkIGdldChpbmRleDogbnVtYmVyKSB7XG4gICAgaWYgKGluZGV4IDwgMCkge1xuICAgICAgdGhyb3cgbmV3IFJhbmdlRXJyb3IoJ0NhblxcJ3QgZ2V0IGl0ZW0gYXQgYSBuZWdhdGl2ZSBpbmRleC4nKTtcbiAgICB9XG4gICAgcmV0dXJuIHRoaXMuZGF0YVtpbmRleCAlIHRoaXMuY2FwYWNpdHldO1xuICB9XG5cbiAgcHJvdGVjdGVkIHNldChpbmRleDogbnVtYmVyLCB2YWx1ZTogVCkge1xuICAgIGlmIChpbmRleCA8IDApIHtcbiAgICAgIHRocm93IG5ldyBSYW5nZUVycm9yKCdDYW5cXCd0IHNldCBpdGVtIGF0IGEgbmVnYXRpdmUgaW5kZXguJyk7XG4gICAgfVxuICAgIHRoaXMuZGF0YVtpbmRleCAlIHRoaXMuY2FwYWNpdHldID0gdmFsdWU7XG4gIH1cblxuICAvKipcbiAgICogUmV0dXJucyB0aGUgY3VycmVudCBudW1iZXIgb2YgaXRlbXMgaW4gdGhlIGJ1ZmZlci5cbiAgICovXG4gIGxlbmd0aCgpOiBudW1iZXIge1xuICAgIGxldCBsZW5ndGggPSB0aGlzLmVuZCAtIHRoaXMuYmVnaW47XG4gICAgaWYgKGxlbmd0aCA8IDApIHtcbiAgICAgIGxlbmd0aCA9IHRoaXMuZG91YmxlZENhcGFjaXR5ICsgbGVuZ3RoO1xuICAgIH1cbiAgICByZXR1cm4gbGVuZ3RoO1xuICB9XG5cbiAgLyoqXG4gICAqIFJlcG9ydHMgd2hldGhlciB0aGUgYnVmZmVyIGlzIGZ1bGwuXG4gICAqIEByZXR1cm5zIHRydWUgaWYgdGhlIG51bWJlciBvZiBpdGVtcyBpbiB0aGUgYnVmZmVyIGVxdWFscyBpdHMgY2FwYWNpdHksIGFuZFxuICAgKiAgIGZhbHNlIG90aGVyd2lzZS5cbiAgICovXG4gIGlzRnVsbCgpIHtcbiAgICByZXR1cm4gdGhpcy5sZW5ndGgoKSA9PT0gdGhpcy5jYXBhY2l0eTtcbiAgfVxuXG4gIC8qKlxuICAgKiBSZXBvcnRzIHdoZXRoZXIgdGhlIGJ1ZmZlciBpcyBlbXB0eS5cbiAgICogQHJldHVybnMgdHJ1ZSBpZiB0aGUgbnVtYmVyIG9mIGl0ZW1zIGluIHRoZSBidWZmZXIgZXF1YWxzIHplcm8sIGFuZFxuICAgKiAgIGZhbHNlIG90aGVyd2lzZS5cbiAgICovXG4gIGlzRW1wdHkoKSB7XG4gICAgcmV0dXJuIHRoaXMubGVuZ3RoKCkgPT09IDA7XG4gIH1cblxuICAvKipcbiAgICogQWRkcyBhbiBpdGVtIHRvIHRoZSBlbmQgb2YgdGhlIGJ1ZmZlci5cbiAgICovXG4gIHB1c2godmFsdWU6IFQpIHtcbiAgICBpZiAodGhpcy5pc0Z1bGwoKSkge1xuICAgICAgdGhyb3cgbmV3IFJhbmdlRXJyb3IoJ1JpbmcgYnVmZmVyIGlzIGZ1bGwuJyk7XG4gICAgfVxuICAgIHRoaXMuc2V0KHRoaXMuZW5kLCB2YWx1ZSk7XG4gICAgdGhpcy5lbmQgPSB0aGlzLndyYXAodGhpcy5lbmQgKyAxKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBBZGRzIG1hbnkgaXRlbXMgdG8gdGhlIGVuZCBvZiB0aGUgYnVmZmVyLCBpbiBvcmRlci5cbiAgICovXG4gIHB1c2hBbGwodmFsdWVzOiBUW10pIHtcbiAgICBmb3IgKGNvbnN0IHZhbHVlIG9mIHZhbHVlcykge1xuICAgICAgdGhpcy5wdXNoKHZhbHVlKTtcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogUmVtb3ZlcyBhbmQgcmV0dXJucyB0aGUgbGFzdCBpdGVtIGluIHRoZSBidWZmZXIuXG4gICAqL1xuICBwb3AoKTogVCB7XG4gICAgaWYgKHRoaXMuaXNFbXB0eSgpKSB7XG4gICAgICB0aHJvdyBuZXcgUmFuZ2VFcnJvcignUmluZyBidWZmZXIgaXMgZW1wdHkuJyk7XG4gICAgfVxuICAgIHRoaXMuZW5kID0gdGhpcy53cmFwKHRoaXMuZW5kIC0gMSk7XG4gICAgY29uc3QgcmVzdWx0ID0gdGhpcy5nZXQodGhpcy5lbmQpO1xuICAgIHRoaXMuc2V0KHRoaXMuZW5kLCB1bmRlZmluZWQpO1xuICAgIHJldHVybiByZXN1bHQ7XG4gIH1cblxuICAvKipcbiAgICogQWRkcyBhbiBpdGVtIHRvIHRoZSBiZWdpbm5pbmcgb2YgdGhlIGJ1ZmZlci5cbiAgICovXG4gIHVuc2hpZnQodmFsdWU6IFQpIHtcbiAgICBpZiAodGhpcy5pc0Z1bGwoKSkge1xuICAgICAgdGhyb3cgbmV3IFJhbmdlRXJyb3IoJ1JpbmcgYnVmZmVyIGlzIGZ1bGwuJyk7XG4gICAgfVxuICAgIHRoaXMuYmVnaW4gPSB0aGlzLndyYXAodGhpcy5iZWdpbiAtIDEpO1xuICAgIHRoaXMuc2V0KHRoaXMuYmVnaW4sIHZhbHVlKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBSZW1vdmVzIGFuZCByZXR1cm5zIHRoZSBmaXJzdCBpdGVtIGluIHRoZSBidWZmZXIuXG4gICAqL1xuICBzaGlmdCgpOiBUIHtcbiAgICBpZiAodGhpcy5pc0VtcHR5KCkpIHtcbiAgICAgIHRocm93IG5ldyBSYW5nZUVycm9yKCdSaW5nIGJ1ZmZlciBpcyBlbXB0eS4nKTtcbiAgICB9XG4gICAgY29uc3QgcmVzdWx0ID0gdGhpcy5nZXQodGhpcy5iZWdpbik7XG4gICAgdGhpcy5zZXQodGhpcy5iZWdpbiwgdW5kZWZpbmVkKTtcbiAgICB0aGlzLmJlZ2luID0gdGhpcy53cmFwKHRoaXMuYmVnaW4gKyAxKTtcbiAgICByZXR1cm4gcmVzdWx0O1xuICB9XG5cbiAgLyoqXG4gICAqIFJlbW92ZXMgYW5kIHJldHVybnMgYSBzcGVjaWZpYyBpdGVtIGluIHRoZSBidWZmZXIsIGFuZCBtb3ZlcyB0aGUgbGFzdCBpdGVtXG4gICAqIHRvIHRoZSB2YWNhdGVkIHNsb3QuICBUaGlzIGlzIHVzZWZ1bCBmb3IgaW1wbGVtZW50aW5nIGEgc2h1ZmZsaW5nIHN0cmVhbS5cbiAgICogTm90ZSB0aGF0IHRoaXMgb3BlcmF0aW9uIG5lY2Vzc2FyaWx5IHNjcmFtYmxlcyB0aGUgb3JpZ2luYWwgb3JkZXIuXG4gICAqXG4gICAqIEBwYXJhbSByZWxhdGl2ZUluZGV4OiB0aGUgaW5kZXggb2YgdGhlIGl0ZW0gdG8gcmVtb3ZlLCByZWxhdGl2ZSB0byB0aGVcbiAgICogICBmaXJzdCBpdGVtIGluIHRoZSBidWZmZXIgKGUuZy4sIGhpZGluZyB0aGUgcmluZyBuYXR1cmUgb2YgdGhlIHVuZGVybHlpbmdcbiAgICogICBzdG9yYWdlKS5cbiAgICovXG4gIHNodWZmbGVFeGNpc2UocmVsYXRpdmVJbmRleDogbnVtYmVyKTogVCB7XG4gICAgaWYgKHRoaXMuaXNFbXB0eSgpKSB7XG4gICAgICB0aHJvdyBuZXcgUmFuZ2VFcnJvcignUmluZyBidWZmZXIgaXMgZW1wdHkuJyk7XG4gICAgfVxuICAgIGNvbnN0IGluZGV4ID0gdGhpcy53cmFwKHRoaXMuYmVnaW4gKyByZWxhdGl2ZUluZGV4KTtcbiAgICBjb25zdCByZXN1bHQgPSB0aGlzLmdldChpbmRleCk7XG4gICAgdGhpcy5zZXQoaW5kZXgsIHRoaXMucG9wKCkpO1xuICAgIHJldHVybiByZXN1bHQ7XG4gIH1cbn1cbiJdfQ==","/**\n * @license\n * Copyright 2018 Google LLC. All Rights Reserved.\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n *\n * =============================================================================\n */\nimport { RingBuffer } from './ring_buffer';\nexport class GrowingRingBuffer extends RingBuffer {\n /**\n * Constructs a `GrowingRingBuffer`.\n */\n constructor() {\n super(GrowingRingBuffer.INITIAL_CAPACITY);\n }\n isFull() {\n return false;\n }\n push(value) {\n if (super.isFull()) {\n this.expand();\n }\n super.push(value);\n }\n unshift(value) {\n if (super.isFull()) {\n this.expand();\n }\n super.unshift(value);\n }\n /**\n * Doubles the capacity of the buffer.\n */\n expand() {\n const newCapacity = this.capacity * 2;\n const newData = new Array(newCapacity);\n const len = this.length();\n // Rotate the buffer to start at index 0 again, since we can't just\n // allocate more space at the end.\n for (let i = 0; i < len; i++) {\n newData[i] = this.get(this.wrap(this.begin + i));\n }\n this.data = newData;\n this.capacity = newCapacity;\n this.doubledCapacity = 2 * this.capacity;\n this.begin = 0;\n this.end = len;\n }\n}\nGrowingRingBuffer.INITIAL_CAPACITY = 32;\n//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZ3Jvd2luZ19yaW5nX2J1ZmZlci5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uLy4uL3RmanMtZGF0YS9zcmMvdXRpbC9ncm93aW5nX3JpbmdfYnVmZmVyLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBOzs7Ozs7Ozs7Ozs7Ozs7O0dBZ0JHO0FBRUgsT0FBTyxFQUFDLFVBQVUsRUFBQyxNQUFNLGVBQWUsQ0FBQztBQUV6QyxNQUFNLE9BQU8saUJBQXFCLFNBQVEsVUFBYTtJQUdyRDs7T0FFRztJQUNIO1FBQ0UsS0FBSyxDQUFDLGlCQUFpQixDQUFDLGdCQUFnQixDQUFDLENBQUM7SUFDNUMsQ0FBQztJQUVELE1BQU07UUFDSixPQUFPLEtBQUssQ0FBQztJQUNmLENBQUM7SUFFRCxJQUFJLENBQUMsS0FBUTtRQUNYLElBQUksS0FBSyxDQUFDLE1BQU0sRUFBRSxFQUFFO1lBQ2xCLElBQUksQ0FBQyxNQUFNLEVBQUUsQ0FBQztTQUNmO1FBQ0QsS0FBSyxDQUFDLElBQUksQ0FBQyxLQUFLLENBQUMsQ0FBQztJQUNwQixDQUFDO0lBRUQsT0FBTyxDQUFDLEtBQVE7UUFDZCxJQUFJLEtBQUssQ0FBQyxNQUFNLEVBQUUsRUFBRTtZQUNsQixJQUFJLENBQUMsTUFBTSxFQUFFLENBQUM7U0FDZjtRQUNELEtBQUssQ0FBQyxPQUFPLENBQUMsS0FBSyxDQUFDLENBQUM7SUFDdkIsQ0FBQztJQUVEOztPQUVHO0lBQ0ssTUFBTTtRQUNaLE1BQU0sV0FBVyxHQUFHLElBQUksQ0FBQyxRQUFRLEdBQUcsQ0FBQyxDQUFDO1FBQ3RDLE1BQU0sT0FBTyxHQUFHLElBQUksS0FBSyxDQUFJLFdBQVcsQ0FBQyxDQUFDO1FBQzFDLE1BQU0sR0FBRyxHQUFHLElBQUksQ0FBQyxNQUFNLEVBQUUsQ0FBQztRQUUxQixtRUFBbUU7UUFDbkUsa0NBQWtDO1FBQ2xDLEtBQUssSUFBSSxDQUFDLEdBQUcsQ0FBQyxFQUFFLENBQUMsR0FBRyxHQUFHLEVBQUUsQ0FBQyxFQUFFLEVBQUU7WUFDNUIsT0FBTyxDQUFDLENBQUMsQ0FBQyxHQUFHLElBQUksQ0FBQyxHQUFHLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsS0FBSyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUM7U0FDbEQ7UUFFRCxJQUFJLENBQUMsSUFBSSxHQUFHLE9BQU8sQ0FBQztRQUNwQixJQUFJLENBQUMsUUFBUSxHQUFHLFdBQVcsQ0FBQztRQUM1QixJQUFJLENBQUMsZUFBZSxHQUFHLENBQUMsR0FBRyxJQUFJLENBQUMsUUFBUSxDQUFDO1FBQ3pDLElBQUksQ0FBQyxLQUFLLEdBQUcsQ0FBQyxDQUFDO1FBQ2YsSUFBSSxDQUFDLEdBQUcsR0FBRyxHQUFHLENBQUM7SUFDakIsQ0FBQzs7QUE5Q2Msa0NBQWdCLEdBQUcsRUFBRSxDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiLyoqXG4gKiBAbGljZW5zZVxuICogQ29weXJpZ2h0IDIwMTggR29vZ2xlIExMQy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC5cbiAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSBcIkxpY2Vuc2VcIik7XG4gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuXG4gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXRcbiAqXG4gKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjBcbiAqXG4gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlXG4gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiBcIkFTIElTXCIgQkFTSVMsXG4gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC5cbiAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmRcbiAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLlxuICpcbiAqID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4gKi9cblxuaW1wb3J0IHtSaW5nQnVmZmVyfSBmcm9tICcuL3JpbmdfYnVmZmVyJztcblxuZXhwb3J0IGNsYXNzIEdyb3dpbmdSaW5nQnVmZmVyPFQ+IGV4dGVuZHMgUmluZ0J1ZmZlcjxUPiB7XG4gIHByaXZhdGUgc3RhdGljIElOSVRJQUxfQ0FQQUNJVFkgPSAzMjtcblxuICAvKipcbiAgICogQ29uc3RydWN0cyBhIGBHcm93aW5nUmluZ0J1ZmZlcmAuXG4gICAqL1xuICBjb25zdHJ1Y3RvcigpIHtcbiAgICBzdXBlcihHcm93aW5nUmluZ0J1ZmZlci5JTklUSUFMX0NBUEFDSVRZKTtcbiAgfVxuXG4gIGlzRnVsbCgpIHtcbiAgICByZXR1cm4gZmFsc2U7XG4gIH1cblxuICBwdXNoKHZhbHVlOiBUKSB7XG4gICAgaWYgKHN1cGVyLmlzRnVsbCgpKSB7XG4gICAgICB0aGlzLmV4cGFuZCgpO1xuICAgIH1cbiAgICBzdXBlci5wdXNoKHZhbHVlKTtcbiAgfVxuXG4gIHVuc2hpZnQodmFsdWU6IFQpIHtcbiAgICBpZiAoc3VwZXIuaXNGdWxsKCkpIHtcbiAgICAgIHRoaXMuZXhwYW5kKCk7XG4gICAgfVxuICAgIHN1cGVyLnVuc2hpZnQodmFsdWUpO1xuICB9XG5cbiAgLyoqXG4gICAqIERvdWJsZXMgdGhlIGNhcGFjaXR5IG9mIHRoZSBidWZmZXIuXG4gICAqL1xuICBwcml2YXRlIGV4cGFuZCgpIHtcbiAgICBjb25zdCBuZXdDYXBhY2l0eSA9IHRoaXMuY2FwYWNpdHkgKiAyO1xuICAgIGNvbnN0IG5ld0RhdGEgPSBuZXcgQXJyYXk8VD4obmV3Q2FwYWNpdHkpO1xuICAgIGNvbnN0IGxlbiA9IHRoaXMubGVuZ3RoKCk7XG5cbiAgICAvLyBSb3RhdGUgdGhlIGJ1ZmZlciB0byBzdGFydCBhdCBpbmRleCAwIGFnYWluLCBzaW5jZSB3ZSBjYW4ndCBqdXN0XG4gICAgLy8gYWxsb2NhdGUgbW9yZSBzcGFjZSBhdCB0aGUgZW5kLlxuICAgIGZvciAobGV0IGkgPSAwOyBpIDwgbGVuOyBpKyspIHtcbiAgICAgIG5ld0RhdGFbaV0gPSB0aGlzLmdldCh0aGlzLndyYXAodGhpcy5iZWdpbiArIGkpKTtcbiAgICB9XG5cbiAgICB0aGlzLmRhdGEgPSBuZXdEYXRhO1xuICAgIHRoaXMuY2FwYWNpdHkgPSBuZXdDYXBhY2l0eTtcbiAgICB0aGlzLmRvdWJsZWRDYXBhY2l0eSA9IDIgKiB0aGlzLmNhcGFjaXR5O1xuICAgIHRoaXMuYmVnaW4gPSAwO1xuICAgIHRoaXMuZW5kID0gbGVuO1xuICB9XG59XG4iXX0=","/**\n * @license\n * Copyright 2018 Google LLC. All Rights Reserved.\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n *\n * =============================================================================\n */\nimport * as tf from '@tensorflow/tfjs-core';\nimport * as seedrandom from 'seedrandom';\nimport { iteratorFromConcatenated, iteratorFromFunction, iteratorFromItems, iteratorFromZipped, ZipMismatchMode } from './iterators/lazy_iterator';\nimport { canTensorify, deepMapAndAwaitAll, isIterable } from './util/deep_map';\n// TODO(soergel): consider vectorized operations within the pipeline.\n/**\n * Represents a potentially large list of independent data elements (typically\n * 'samples' or 'examples').\n *\n * A 'data example' may be a primitive, an array, a map from string keys to\n * values, or any nested structure of these.\n *\n * A `Dataset` represents an ordered collection of elements, together with a\n * chain of transformations to be performed on those elements. Each\n * transformation is a method of `Dataset` that returns another `Dataset`, so\n * these may be chained, e.g.\n * `const processedDataset = rawDataset.filter(...).map(...).batch(...)`.\n *\n * Data loading and transformation is done in a lazy, streaming fashion. The\n * dataset may be iterated over multiple times; each iteration starts the data\n * loading anew and recapitulates the transformations.\n *\n * A `Dataset` is typically processed as a stream of unbatched examples -- i.e.,\n * its transformations are applied one example at a time. Batching produces a\n * new `Dataset` where each element is a batch. Batching should usually come\n * last in a pipeline, because data transformations are easier to express on a\n * per-example basis than on a per-batch basis.\n *\n * The following code examples are calling `await dataset.forEachAsync(...)` to\n * iterate once over the entire dataset in order to print out the data.\n *\n * @doc {heading: 'Data', subheading: 'Classes', namespace: 'data'}\n */\nexport class Dataset {\n constructor() {\n this.size = null;\n }\n // TODO(soergel): Make Datasets report whether repeated iterator() calls\n // produce the same result (e.g., reading from a file) or different results\n // (e.g., from the webcam). Currently we don't make this distinction but it\n // could be important for the user to know.\n // abstract isDeterministic(): boolean;\n /**\n * Groups elements into batches.\n *\n * It is assumed that each of the incoming dataset elements has the same\n * structure -- i.e. the same set of keys at each location in an object\n * hierarchy. For each key, the resulting `Dataset` provides a batched\n * element collecting all of the incoming values for that key.\n *\n * * Incoming primitives are grouped into a 1-D Tensor.\n * * Incoming Tensors are grouped into a new Tensor where the 0th axis is\n * the batch dimension.\n * * Incoming arrays are converted to Tensor and then batched.\n * * A nested array is interpreted as an n-D Tensor, so the batched result\n * has n+1 dimensions.\n * * An array that cannot be converted to Tensor produces an error.\n *\n * If an array should not be batched as a unit, it should first be converted\n * to an object with integer keys.\n *\n * Here are a few examples:\n *\n * Batch a dataset of numbers:\n * ```js\n * const a = tf.data.array([1, 2, 3, 4, 5, 6, 7, 8]).batch(4);\n * await a.forEachAsync(e => e.print());\n * ```\n *\n * Batch a dataset of arrays:\n * ```js\n * const b = tf.data.array([[1], [2], [3], [4], [5], [6], [7], [8]]).batch(4);\n * await b.forEachAsync(e => e.print());\n * ```\n *\n * Batch a dataset of objects:\n * ```js\n * const c = tf.data.array([{a: 1, b: 11}, {a: 2, b: 12}, {a: 3, b: 13},\n * {a: 4, b: 14}, {a: 5, b: 15}, {a: 6, b: 16}, {a: 7, b: 17},\n * {a: 8, b: 18}]).batch(4);\n * await c.forEachAsync(e => {\n * console.log('{');\n * for(var key in e) {\n * console.log(key+':');\n * e[key].print();\n * }\n * console.log('}');\n * })\n * ```\n *\n * @param batchSize The number of elements desired per batch.\n * @param smallLastBatch Whether to emit the final batch when it has fewer\n * than batchSize elements. Default true.\n * @returns A `Dataset`, from which a stream of batches can be obtained.\n *\n * @doc {heading: 'Data', subheading: 'Classes'}\n */\n batch(batchSize, smallLastBatch = true) {\n const base = this;\n tf.util.assert(batchSize > 0, () => `batchSize needs to be positive, but it is\n ${batchSize}`);\n let size;\n if (this.size === Infinity || this.size == null) {\n // If the size of this dataset is infinity or null, the new size keeps the\n // same.\n size = this.size;\n }\n else if (smallLastBatch) {\n // If the size of this dataset is known and include small last batch, the\n // new size is full batch count plus last batch.\n size = Math.ceil(this.size / batchSize);\n }\n else {\n // If the size of this dataset is known and not include small last batch,\n // the new size is full batch count.\n size = Math.floor(this.size / batchSize);\n }\n return datasetFromIteratorFn(async () => {\n return (await base.iterator())\n .columnMajorBatch(batchSize, smallLastBatch, deepBatchConcat);\n }, size);\n }\n /**\n * Concatenates this `Dataset` with another.\n *\n * ```js\n * const a = tf.data.array([1, 2, 3]);\n * const b = tf.data.array([4, 5, 6]);\n * const c = a.concatenate(b);\n * await c.forEachAsync(e => console.log(e));\n * ```\n *\n * @param dataset A `Dataset` to be concatenated onto this one.\n * @returns A `Dataset`.\n *\n * @doc {heading: 'Data', subheading: 'Classes'}\n */\n concatenate(dataset) {\n const base = this;\n let size;\n if (this.size === Infinity || dataset.size === Infinity) {\n // If the size of any of these two dataset is infinity, new size is\n // infinity.\n size = Infinity;\n }\n else if (this.size != null && dataset.size != null) {\n // If the size of both datasets are known and not infinity, new size is\n // sum the size of these two datasets.\n size = this.size + dataset.size;\n }\n else {\n // If neither of these two datasets has infinite size and any of these two\n // datasets' size is null, the new size is null.\n size = null;\n }\n return datasetFromIteratorFn(async () => (await base.iterator()).concatenate(await dataset.iterator()), size);\n }\n /**\n * Filters this dataset according to `predicate`.\n *\n * ```js\n * const a = tf.data.array([1, 2, 3, 4, 5, 6, 7, 8, 9, 10])\n * .filter(x => x%2 === 0);\n * await a.forEachAsync(e => console.log(e));\n * ```\n *\n * @param predicate A function mapping a dataset element to a boolean or a\n * `Promise` for one.\n *\n * @returns A `Dataset` of elements for which the predicate was true.\n *\n * @doc {heading: 'Data', subheading: 'Classes'}\n */\n filter(predicate) {\n const base = this;\n let size;\n if (this.size === Infinity) {\n // If the size of this dataset is infinity, new size is infinity\n size = Infinity;\n }\n else {\n // If this dataset has limited elements, new size is null because it might\n // exhausted randomly.\n size = null;\n }\n return datasetFromIteratorFn(async () => {\n return (await base.iterator()).filter(x => tf.tidy(() => predicate(x)));\n }, size);\n }\n /**\n * Apply a function to every element of the dataset.\n *\n * After the function is applied to a dataset element, any Tensors contained\n * within that element are disposed.\n *\n * ```js\n * const a = tf.data.array([1, 2, 3]);\n * await a.forEachAsync(e => console.log(e));\n * ```\n *\n * @param f A function to apply to each dataset element.\n * @returns A `Promise` that resolves after all elements have been processed.\n *\n * @doc {heading: 'Data', subheading: 'Classes'}\n */\n async forEachAsync(f) {\n return (await this.iterator()).forEachAsync(f);\n }\n /**\n * Maps this dataset through a 1-to-1 transform.\n *\n * ```js\n * const a = tf.data.array([1, 2, 3]).map(x => x*x);\n * await a.forEachAsync(e => console.log(e));\n * ```\n *\n * @param transform A function mapping a dataset element to a transformed\n * dataset element.\n *\n * @returns A `Dataset` of transformed elements.\n *\n * @doc {heading: 'Data', subheading: 'Classes'}\n */\n map(transform) {\n const base = this;\n return datasetFromIteratorFn(async () => {\n return (await base.iterator()).map(x => tf.tidy(() => transform(x)));\n }, this.size);\n }\n /**\n * Maps this dataset through an async 1-to-1 transform.\n *\n * ```js\n * const a =\n * tf.data.array([1, 2, 3]).mapAsync(x => new Promise(function(resolve){\n * setTimeout(() => {\n * resolve(x * x);\n * }, Math.random()*1000 + 500);\n * }));\n * console.log(await a.toArray());\n * ```\n *\n * @param transform A function mapping a dataset element to a `Promise` for a\n * transformed dataset element. This transform is responsible for disposing\n * any intermediate `Tensor`s, i.e. by wrapping its computation in\n * `tf.tidy()`; that cannot be automated here (as it is in the synchronous\n * `map()` case).\n *\n * @returns A `Dataset` of transformed elements.\n *\n * @doc {heading: 'Data', subheading: 'Classes'}\n */\n mapAsync(transform) {\n const base = this;\n return datasetFromIteratorFn(async () => {\n return (await base.iterator()).mapAsync(transform);\n }, this.size);\n }\n /**\n * Creates a `Dataset` that prefetches elements from this dataset.\n *\n * @param bufferSize: An integer specifying the number of elements to be\n * prefetched.\n * @returns A `Dataset`.\n *\n * @doc {heading: 'Data', subheading: 'Classes'}\n */\n prefetch(bufferSize) {\n if (bufferSize == null) {\n throw new RangeError('`Dataset.prefetch()` requires bufferSize to be specified.');\n }\n const base = this;\n return datasetFromIteratorFn(async () => (await base.iterator()).prefetch(bufferSize), this.size);\n }\n /**\n * Repeats this dataset `count` times.\n *\n * NOTE: If this dataset is a function of global state (e.g. a random number\n * generator), then different repetitions may produce different elements.\n *\n * ```js\n * const a = tf.data.array([1, 2, 3]).repeat(3);\n * await a.forEachAsync(e => console.log(e));\n * ```\n *\n * @param count: (Optional) An integer, representing the number of times\n * the dataset should be repeated. The default behavior (if `count` is\n * `undefined` or negative) is for the dataset be repeated indefinitely.\n * @returns A `Dataset`.\n *\n * @doc {heading: 'Data', subheading: 'Classes'}\n */\n repeat(count) {\n const base = this;\n let size;\n if (this.size != null && count > 0) {\n // If this dataset has size and count is positive, new size is current\n // size multiply count. This also covers the case that current size is\n // infinity.\n size = this.size * count;\n }\n else if (count === 0) {\n // If count is 0, new size is 0.\n size = 0;\n }\n else if (this.size != null && (count === undefined || count < 0)) {\n // If this dataset has size and count is undefined or negative, the\n // dataset will be repeated indefinitely and new size is infinity.\n size = Infinity;\n }\n else {\n // If the size of this dataset is null, the new dataset's size is null.\n size = null;\n }\n return datasetFromIteratorFn(async () => {\n const iteratorIterator = iteratorFromFunction(async () => ({ value: await base.iterator(), done: false }));\n return iteratorFromConcatenated(iteratorIterator.take(count));\n }, size);\n }\n /**\n * Creates a `Dataset` that skips `count` initial elements from this dataset.\n *\n * ```js\n * const a = tf.data.array([1, 2, 3, 4, 5, 6]).skip(3);\n * await a.forEachAsync(e => console.log(e));\n * ```\n *\n * @param count: The number of elements of this dataset that should be skipped\n * to form the new dataset. If `count` is greater than the size of this\n * dataset, the new dataset will contain no elements. If `count`\n * is `undefined` or negative, skips the entire dataset.\n *\n * @returns A `Dataset`.\n *\n * @doc {heading: 'Data', subheading: 'Classes'}\n */\n skip(count) {\n const base = this;\n let size;\n if (this.size != null && count >= 0 && this.size >= count) {\n // If the size of this dataset is greater than count, the new dataset's\n // size is current size minus skipped size.This also covers the case that\n // current size is infinity.\n size = this.size - count;\n }\n else if (this.size != null &&\n (this.size < count || count === undefined || count < 0)) {\n // If the size of this dataset is smaller than count, or count is\n // undefined or negative, skips the entire dataset and the new size is 0.\n size = 0;\n }\n else {\n // If the size of this dataset is null, the new dataset's size is null.\n size = null;\n }\n return datasetFromIteratorFn(async () => (await base.iterator()).skip(count), size);\n }\n /**\n * Pseudorandomly shuffles the elements of this dataset. This is done in a\n * streaming manner, by sampling from a given number of prefetched elements.\n *\n * ```js\n * const a = tf.data.array([1, 2, 3, 4, 5, 6]).shuffle(3);\n * await a.forEachAsync(e => console.log(e));\n * ```\n *\n * @param bufferSize: An integer specifying the number of elements from this\n * dataset from which the new dataset will sample.\n * @param seed: (Optional) An integer specifying the random seed that will\n * be used to create the distribution.\n * @param reshuffleEachIteration: (Optional) A boolean, which if true\n * indicates that the dataset should be pseudorandomly reshuffled each time\n * it is iterated over. If false, elements will be returned in the same\n * shuffled order on each iteration. (Defaults to `true`.)\n * @returns A `Dataset`.\n *\n * @doc {heading: 'Data', subheading: 'Classes'}\n */\n shuffle(bufferSize, seed, reshuffleEachIteration = true) {\n if (bufferSize == null || bufferSize < 0) {\n if (this.size == null) {\n throw new RangeError('`Dataset.shuffle()` requires bufferSize to be specified.');\n }\n else {\n throw new RangeError('`Dataset.shuffle()` requires bufferSize to be specified. ' +\n 'If your data fits in main memory (for regular JS objects), ' +\n 'and/or GPU memory (for `tf.Tensor`s), consider setting ' +\n `bufferSize to the dataset size (${this.size} elements)`);\n }\n }\n const base = this;\n const random = seedrandom.alea(seed || tf.util.now().toString());\n return datasetFromIteratorFn(async () => {\n let seed2 = random.int32();\n if (reshuffleEachIteration) {\n seed2 += random.int32();\n }\n return (await base.iterator()).shuffle(bufferSize, seed2.toString());\n }, this.size);\n }\n /**\n * Creates a `Dataset` with at most `count` initial elements from this\n * dataset.\n *\n * ```js\n * const a = tf.data.array([1, 2, 3, 4, 5, 6]).take(3);\n * await a.forEachAsync(e => console.log(e));\n * ```\n *\n * @param count: The number of elements of this dataset that should be taken\n * to form the new dataset. If `count` is `undefined` or negative, or if\n * `count` is greater than the size of this dataset, the new dataset will\n * contain all elements of this dataset.\n * @returns A `Dataset`.\n *\n * @doc {heading: 'Data', subheading: 'Classes'}\n */\n take(count) {\n const base = this;\n let size;\n if (this.size != null && this.size > count) {\n // If the size of this dataset is greater than count, the new dataset's\n // size is count.\n size = count;\n }\n else if (this.size != null && this.size <= count) {\n // If the size of this dataset is equal or smaller than count, the new\n // dataset's size is the size of this dataset.\n size = this.size;\n }\n else {\n // If the size of this dataset is null, the new dataset's size is null.\n size = null;\n }\n return datasetFromIteratorFn(async () => (await base.iterator()).take(count), size);\n }\n /**\n * Collect all elements of this dataset into an array.\n *\n * Obviously this will succeed only for small datasets that fit in memory.\n * Useful for testing and generally should be avoided if possible.\n *\n * ```js\n * const a = tf.data.array([1, 2, 3, 4, 5, 6]);\n * console.log(await a.toArray());\n * ```\n *\n * @returns A Promise for an array of elements, which will resolve\n * when a new stream has been obtained and fully consumed.\n *\n * @doc {heading: 'Data', subheading: 'Classes'}\n */\n async toArray() {\n if (this.size === Infinity) {\n throw new Error('Can not convert infinite data stream to array.');\n }\n return (await this.iterator()).toArray();\n }\n /**\n * Collect all elements of this dataset into an array with prefetching 100\n * elements. This is useful for testing, because the prefetch changes the\n * order in which the Promises are resolved along the processing pipeline.\n * This may help expose bugs where results are dependent on the order of\n * Promise resolution rather than on the logical order of the stream (i.e.,\n * due to hidden mutable state).\n *\n * @returns A Promise for an array of elements, which will resolve\n * when a new stream has been obtained and fully consumed.\n */\n async toArrayForTest() {\n if (this.size === Infinity) {\n throw new Error('Can not convert infinite data stream to array.');\n }\n return (await this.iterator()).toArrayForTest();\n }\n}\n// TODO(soergel): deep sharded shuffle, where supported\nDataset.MAX_BUFFER_SIZE = 10000;\n/**\n * Create a `Dataset` defined by a provided iterator() function.\n *\n * ```js\n * let i = -1;\n * const func = () =>\n * ++i < 5 ? {value: i, done: false} : {value: null, done: true};\n * const iter = tf.data.iteratorFromFunction(func);\n * const ds = tf.data.datasetFromIteratorFn(iter);\n * await ds.forEachAsync(e => console.log(e));\n * ```\n */\nexport function datasetFromIteratorFn(iteratorFn, size = null) {\n return new class extends Dataset {\n constructor() {\n super(...arguments);\n this.size = size;\n }\n /*\n * Provide a new stream of elements. Note this will also start new streams\n * from any underlying `Dataset`s.\n */\n async iterator() {\n return iteratorFn();\n }\n }();\n}\n/**\n * Create a `Dataset` from an array of elements.\n *\n * Create a Dataset from an array of objects:\n * ```js\n * const a = tf.data.array([{'item': 1}, {'item': 2}, {'item': 3}]);\n * await a.forEachAsync(e => console.log(e));\n * ```\n *\n * Create a Dataset from an array of numbers:\n * ```js\n * const a = tf.data.array([4, 5, 6]);\n * await a.forEachAsync(e => console.log(e));\n * ```\n * @param items An array of elements that will be parsed as items in a dataset.\n *\n * @doc {heading: 'Data', subheading: 'Creation', namespace: 'data'}\n */\nexport function array(items) {\n return datasetFromIteratorFn(async () => iteratorFromItems(items), items.length);\n}\n/**\n * Create a `Dataset` by zipping together an array, dict, or nested\n * structure of `Dataset`s (and perhaps additional constants).\n * The underlying datasets must provide elements in a consistent order such that\n * they correspond.\n *\n * The number of elements in the resulting dataset is the same as the size of\n * the smallest dataset in datasets.\n *\n * The nested structure of the `datasets` argument determines the\n * structure of elements in the resulting iterator.\n *\n * Note this means that, given an array of two datasets that produce dict\n * elements, the result is a dataset that produces elements that are arrays\n * of two dicts:\n *\n * Zip an array of datasets:\n * ```js\n * console.log('Zip two datasets of objects:');\n * const ds1 = tf.data.array([{a: 1}, {a: 2}, {a: 3}]);\n * const ds2 = tf.data.array([{b: 4}, {b: 5}, {b: 6}]);\n * const ds3 = tf.data.zip([ds1, ds2]);\n * await ds3.forEachAsync(e => console.log(JSON.stringify(e)));\n *\n * // If the goal is to merge the dicts in order to produce elements like\n * // {a: ..., b: ...}, this requires a second step such as:\n * console.log('Merge the objects:');\n * const ds4 = ds3.map(x => {return {a: x[0].a, b: x[1].b}});\n * await ds4.forEachAsync(e => console.log(e));\n * ```\n *\n * Zip a dict of datasets:\n * ```js\n * const a = tf.data.array([{a: 1}, {a: 2}, {a: 3}]);\n * const b = tf.data.array([{b: 4}, {b: 5}, {b: 6}]);\n * const c = tf.data.zip({c: a, d: b});\n * await c.forEachAsync(e => console.log(JSON.stringify(e)));\n * ```\n *\n * @doc {heading: 'Data', subheading: 'Operations', namespace: 'data'}\n */\nexport function zip(datasets) {\n // manually type-check the argument for JS users\n if (!isIterable(datasets)) {\n throw new Error('The argument to zip() must be an object or array.');\n }\n let size;\n if (Array.isArray(datasets)) {\n for (let i = 0; i < datasets.length; i++) {\n size = size == null ? datasets[i].size :\n Math.min(size, datasets[i].size);\n }\n }\n else if (datasets instanceof Object) {\n for (const ds in datasets) {\n size = size == null ? datasets[ds].size :\n Math.min(size, datasets[ds].size);\n }\n }\n return datasetFromIteratorFn(async () => {\n const streams = await deepMapAndAwaitAll(datasets, d => {\n if (d instanceof Dataset) {\n return { value: d.iterator(), recurse: false };\n }\n else if (isIterable(d)) {\n return { value: null, recurse: true };\n }\n else {\n throw new Error('Leaves of the structure passed to zip() must be Datasets, ' +\n 'not primitives.');\n }\n });\n return iteratorFromZipped(streams, ZipMismatchMode.SHORTEST);\n }, size);\n}\n/**\n * A zip function for use with deepZip, passed via the columnMajorBatch call.\n *\n * Accepts an array of identically-structured nested elements and either batches\n * them (if they are primitives, numeric arrays, or Tensors) or requests\n * recursion (if not).\n */\n// tslint:disable-next-line:no-any\nfunction deepBatchConcat(rows) {\n if (rows === null) {\n return null;\n }\n // use the first item to decide whether to recurse or batch here.\n const exampleRow = rows[0];\n if (canTensorify(exampleRow)) {\n // rows is an array of primitives, Tensors, or arrays. Batch them.\n const value = batchConcat(rows);\n return { value, recurse: false };\n }\n // the example row is an object, so recurse into it.\n return { value: null, recurse: true };\n}\n/**\n * Assembles a list of same-shaped numbers, number arrays, or Tensors\n * into a single new Tensor where axis 0 is the batch dimension.\n */\nfunction batchConcat(arrays) {\n if (arrays.length === 0) {\n // We can't return an empty Tensor because we don't know the element shape.\n throw new Error('Can\\'t make a batch of zero elements.');\n }\n if (arrays[0] instanceof tf.Tensor) {\n // Input is an array of Tensors\n return tf.stack(arrays);\n }\n else {\n // Input is a possibly-nested array of numbers.\n return tf.tensor(arrays);\n }\n}\n//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZGF0YXNldC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uL3RmanMtZGF0YS9zcmMvZGF0YXNldC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQTs7Ozs7Ozs7Ozs7Ozs7OztHQWdCRztBQUVILE9BQU8sS0FBSyxFQUFFLE1BQU0sdUJBQXVCLENBQUM7QUFFNUMsT0FBTyxLQUFLLFVBQVUsTUFBTSxZQUFZLENBQUM7QUFFekMsT0FBTyxFQUFDLHdCQUF3QixFQUFFLG9CQUFvQixFQUFFLGlCQUFpQixFQUFFLGtCQUFrQixFQUFnQixlQUFlLEVBQUMsTUFBTSwyQkFBMkIsQ0FBQztBQUUvSixPQUFPLEVBQUMsWUFBWSxFQUFFLGtCQUFrQixFQUFpQixVQUFVLEVBQUMsTUFBTSxpQkFBaUIsQ0FBQztBQU81RixxRUFBcUU7QUFFckU7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7OztHQTJCRztBQUNILE1BQU0sT0FBZ0IsT0FBTztJQUE3QjtRQVdXLFNBQUksR0FBVyxJQUFJLENBQUM7SUEyYy9CLENBQUM7SUF6Y0Msd0VBQXdFO0lBQ3hFLDJFQUEyRTtJQUMzRSw0RUFBNEU7SUFDNUUsMkNBQTJDO0lBQzNDLHVDQUF1QztJQUV2Qzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7O09Bc0RHO0lBQ0gsS0FBSyxDQUFDLFNBQWlCLEVBQUUsY0FBYyxHQUFHLElBQUk7UUFDNUMsTUFBTSxJQUFJLEdBQUcsSUFBSSxDQUFDO1FBQ2xCLEVBQUUsQ0FBQyxJQUFJLENBQUMsTUFBTSxDQUNWLFNBQVMsR0FBRyxDQUFDLEVBQUUsR0FBRyxFQUFFLENBQUM7UUFDckIsU0FBUyxFQUFFLENBQUMsQ0FBQztRQUNqQixJQUFJLElBQUksQ0FBQztRQUNULElBQUksSUFBSSxDQUFDLElBQUksS0FBSyxRQUFRLElBQUksSUFBSSxDQUFDLElBQUksSUFBSSxJQUFJLEVBQUU7WUFDL0MsMEVBQTBF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K0M7UUFDL0MsT0FBTyxFQUFFLENBQUMsTUFBTSxDQUFDLE1BQW9CLENBQUMsQ0FBQztLQUN4QztBQUNILENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyIvKipcbiAqIEBsaWNlbnNlXG4gKiBDb3B5cmlnaHQgMjAxOCBHb29nbGUgTExDLiBBbGwgUmlnaHRzIFJlc2VydmVkLlxuICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlIFwiTGljZW5zZVwiKTtcbiAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS5cbiAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdFxuICpcbiAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMFxuICpcbiAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmVcbiAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuIFwiQVMgSVNcIiBCQVNJUyxcbiAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLlxuICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZFxuICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuXG4gKlxuICogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbiAqL1xuXG5pbXBvcnQgKiBhcyB0ZiBmcm9tICdAdGVuc29yZmxvdy90ZmpzLWNvcmUnO1xuaW1wb3J0IHtUZW5zb3JDb250YWluZXIsIFRlbnNvckxpa2V9IGZyb20gJ0B0ZW5zb3JmbG93L3RmanMtY29yZSc7XG5pbXBvcnQgKiBhcyBzZWVkcmFuZG9tIGZyb20gJ3NlZWRyYW5kb20nO1xuXG5pbXBvcnQge2l0ZXJhdG9yRnJvbUNvbmNhdGVuYXRlZCwgaXRlcmF0b3JGcm9tRnVuY3Rpb24sIGl0ZXJhdG9yRnJvbUl0ZW1zLCBpdGVyYXRvckZyb21aaXBwZWQsIExhenlJdGVyYXRvciwgWmlwTWlzbWF0Y2hNb2RlfSBmcm9tICcuL2l0ZXJhdG9ycy9sYXp5X2l0ZXJhdG9yJztcbmltcG9ydCB7Q29udGFpbmVyfSBmcm9tICcuL3R5cGVzJztcbmltcG9ydCB7Y2FuVGVuc29yaWZ5LCBkZWVwTWFwQW5kQXdhaXRBbGwsIERlZXBNYXBSZXN1bHQsIGlzSXRlcmFibGV9IGZyb20gJy4vdXRpbC9kZWVwX21hcCc7XG5cbi8qKlxuICogQSBuZXN0ZWQgc3RydWN0dXJlIG9mIERhdGFzZXRzLCB1c2VkIGFzIHRoZSBpbnB1dCB0byB6aXAoKS5cbiAqL1xuZXhwb3J0IHR5cGUgRGF0YXNldENvbnRhaW5lciA9IENvbnRhaW5lcjxEYXRhc2V0PFRlbnNvckNvbnRhaW5lcj4+O1xuXG4vLyBUT0RPKHNvZXJnZWwpOiBjb25zaWRlciB2ZWN0b3JpemVkIG9wZXJhdGlvbnMgd2l0aGluIHRoZSBwaXBlbGluZS5cblxuLyoqXG4gKiBSZXByZXNlbnRzIGEgcG90ZW50aWFsbHkgbGFyZ2UgbGlzdCBvZiBpbmRlcGVuZGVudCBkYXRhIGVsZW1lbnRzICh0eXBpY2FsbHlcbiAqICdzYW1wbGVzJyBvciAnZXhhbXBsZXMnKS5cbiAqXG4gKiBBICdkYXRhIGV4YW1wbGUnIG1heSBiZSBhIHByaW1pdGl2ZSwgYW4gYXJyYXksIGEgbWFwIGZyb20gc3RyaW5nIGtleXMgdG9cbiAqIHZhbHVlcywgb3IgYW55IG5lc3RlZCBzdHJ1Y3R1cmUgb2YgdGhlc2UuXG4gKlxuICogQSBgRGF0YXNldGAgcmVwcmVzZW50cyBhbiBvcmRlcmVkIGNvbGxlY3Rpb24gb2YgZWxlbWVudHMsIHRvZ2V0aGVyIHdpdGggYVxuICogY2hhaW4gb2YgdHJhbnNmb3JtYXRpb25zIHRvIGJlIHBlcmZvcm1lZCBvbiB0aG9zZSBlbGVtZW50cy4gRWFjaFxuICogdHJhbnNmb3JtYXRpb24gaXMgYSBtZXRob2Qgb2YgYERhdGFzZXRgIHRoYXQgcmV0dXJucyBhbm90aGVyIGBEYXRhc2V0YCwgc29cbiAqIHRoZXNlIG1heSBiZSBjaGFpbmVkLCBlLmcuXG4gKiBgY29uc3QgcHJvY2Vzc2VkRGF0YXNldCA9IHJhd0RhdGFzZXQuZmlsdGVyKC4uLikubWFwKC4uLikuYmF0Y2goLi4uKWAuXG4gKlxuICogRGF0YSBsb2FkaW5nIGFuZCB0cmFuc2Zvcm1hdGlvbiBpcyBkb25lIGluIGEgbGF6eSwgc3RyZWFtaW5nIGZhc2hpb24uICBUaGVcbiAqIGRhdGFzZXQgbWF5IGJlIGl0ZXJhdGVkIG92ZXIgbXVsdGlwbGUgdGltZXM7IGVhY2ggaXRlcmF0aW9uIHN0YXJ0cyB0aGUgZGF0YVxuICogbG9hZGluZyBhbmV3IGFuZCByZWNhcGl0dWxhdGVzIHRoZSB0cmFuc2Zvcm1hdGlvbnMuXG4gKlxuICogQSBgRGF0YXNldGAgaXMgdHlwaWNhbGx5IHByb2Nlc3NlZCBhcyBhIHN0cmVhbSBvZiB1bmJhdGNoZWQgZXhhbXBsZXMgLS0gaS5lLixcbiAqIGl0cyB0cmFuc2Zvcm1hdGlvbnMgYXJlIGFwcGxpZWQgb25lIGV4YW1wbGUgYXQgYSB0aW1lLiBCYXRjaGluZyBwcm9kdWNlcyBhXG4gKiBuZXcgYERhdGFzZXRgIHdoZXJlIGVhY2ggZWxlbWVudCBpcyBhIGJhdGNoLiBCYXRjaGluZyBzaG91bGQgdXN1YWxseSBjb21lXG4gKiBsYXN0IGluIGEgcGlwZWxpbmUsIGJlY2F1c2UgZGF0YSB0cmFuc2Zvcm1hdGlvbnMgYXJlIGVhc2llciB0byBleHByZXNzIG9uIGFcbiAqIHBlci1leGFtcGxlIGJhc2lzIHRoYW4gb24gYSBwZXItYmF0Y2ggYmFzaXMuXG4gKlxuICogVGhlIGZvbGxvd2luZyBjb2RlIGV4YW1wbGVzIGFyZSBjYWxsaW5nIGBhd2FpdCBkYXRhc2V0LmZvckVhY2hBc3luYyguLi4pYCB0b1xuICogaXRlcmF0ZSBvbmNlIG92ZXIgdGhlIGVudGlyZSBkYXRhc2V0IGluIG9yZGVyIHRvIHByaW50IG91dCB0aGUgZGF0YS5cbiAqXG4gKiBAZG9jIHtoZWFkaW5nOiAnRGF0YScsIHN1YmhlYWRpbmc6ICdDbGFzc2VzJywgbmFtZXNwYWNlOiAnZGF0YSd9XG4gKi9cbmV4cG9ydCBhYnN0cmFjdCBjbGFzcyBEYXRhc2V0PFQgZXh0ZW5kcyB0Zi5UZW5zb3JDb250YWluZXI+IHtcbiAgLypcbiAgICogUHJvdmlkZSBhIG5ldyBzdHJlYW0gb2YgZWxlbWVudHMuICBOb3RlIHRoaXMgd2lsbCBhbHNvIHN0YXJ0IG5ldyBzdHJlYW1zXG4gICAqIGZyb20gYW55IHVuZGVybHlpbmcgYERhdGFzZXRgcy5cbiAgICpcbiAgICogQ0FVVElPTjogQW55IFRlbnNvcnMgY29udGFpbmVkIHdpdGhpbiB0aGUgZWxlbWVudHMgcmV0dXJuZWQgZnJvbVxuICAgKiB0aGlzIHN0cmVhbSAqbXVzdCogYmUgbWFudWFsbHkgZGlzcG9zZWQgdG8gYXZvaWQgYSBHUFUgbWVtb3J5IGxlYWsuXG4gICAqIFRoZSB0Zi50aWR5KCkgYXBwcm9hY2ggY2Fubm90IGJlIHVzZWQgaW4gYW4gYXN5bmNocm9ub3VzIGNvbnRleHQuXG4gICAqL1xuICBhYnN0cmFjdCBhc3luYyBpdGVyYXRvcigpOiBQcm9taXNlPExhenlJdGVyYXRvcjxUPj47XG5cbiAgcmVhZG9ubHkgc2l6ZTogbnVtYmVyID0gbnVsbDtcblxuICAvLyBUT0RPKHNvZXJnZWwpOiBNYWtlIERhdGFzZXRzIHJlcG9ydCB3aGV0aGVyIHJlcGVhdGVkIGl0ZXJhdG9yKCkgY2FsbHNcbiAgLy8gcHJvZHVjZSB0aGUgc2FtZSByZXN1bHQgKGUuZy4sIHJlYWRpbmcgZnJvbSBhIGZpbGUpIG9yIGRpZmZlcmVudCByZXN1bHRzXG4gIC8vIChlLmcuLCBmcm9tIHRoZSB3ZWJjYW0pLiAgQ3VycmVudGx5IHdlIGRvbid0IG1ha2UgdGhpcyBkaXN0aW5jdGlvbiBidXQgaXRcbiAgLy8gY291bGQgYmUgaW1wb3J0YW50IGZvciB0aGUgdXNlciB0byBrbm93LlxuICAvLyBhYnN0cmFjdCBpc0RldGVybWluaXN0aWMoKTogYm9vbGVhbjtcblxuICAvKipcbiAgICogR3JvdXBzIGVsZW1lbnRzIGludG8gYmF0Y2hlcy5cbiAgICpcbiAgICogSXQgaXMgYXNzdW1lZCB0aGF0IGVhY2ggb2YgdGhlIGluY29taW5nIGRhdGFzZXQgZWxlbWVudHMgaGFzIHRoZSBzYW1lXG4gICAqIHN0cnVjdHVyZSAtLSBpLmUuIHRoZSBzYW1lIHNldCBvZiBrZXlzIGF0IGVhY2ggbG9jYXRpb24gaW4gYW4gb2JqZWN0XG4gICAqIGhpZXJhcmNoeS4gIEZvciBlYWNoIGtleSwgdGhlIHJlc3VsdGluZyBgRGF0YXNldGAgcHJvdmlkZXMgYSBiYXRjaGVkXG4gICAqIGVsZW1lbnQgY29sbGVjdGluZyBhbGwgb2YgdGhlIGluY29taW5nIHZhbHVlcyBmb3IgdGhhdCBrZXkuXG4gICAqXG4gICAqICAqIEluY29taW5nIHByaW1pdGl2ZXMgYXJlIGdyb3VwZWQgaW50byBhIDEtRCBUZW5zb3IuXG4gICAqICAqIEluY29taW5nIFRlbnNvcnMgYXJlIGdyb3VwZWQgaW50byBhIG5ldyBUZW5zb3Igd2hlcmUgdGhlIDB0aCBheGlzIGlzXG4gICAqICAgIHRoZSBiYXRjaCBkaW1lbnNpb24uXG4gICAqICAqIEluY29taW5nIGFycmF5cyBhcmUgY29udmVydGVkIHRvIFRlbnNvciBhbmQgdGhlbiBiYXRjaGVkLlxuICAgKiAgKiBBIG5lc3RlZCBhcnJheSBpcyBpbnRlcnByZXRlZCBhcyBhbiBuLUQgVGVuc29yLCBzbyB0aGUgYmF0Y2hlZCByZXN1bHRcbiAgICogICAgaGFzIG4rMSBkaW1lbnNpb25zLlxuICAgKiAgKiBBbiBhcnJheSB0aGF0IGNhbm5vdCBiZSBjb252ZXJ0ZWQgdG8gVGVuc29yIHByb2R1Y2VzIGFuIGVycm9yLlxuICAgKlxuICAgKiBJZiBhbiBhcnJheSBzaG91bGQgbm90IGJlIGJhdGNoZWQgYXMgYSB1bml0LCBpdCBzaG91bGQgZmlyc3QgYmUgY29udmVydGVkXG4gICAqIHRvIGFuIG9iamVjdCB3aXRoIGludGVnZXIga2V5cy5cbiAgICpcbiAgICogSGVyZSBhcmUgYSBmZXcgZXhhbXBsZXM6XG4gICAqXG4gICAqIEJhdGNoIGEgZGF0YXNldCBvZiBudW1iZXJzOlxuICAgKiBgYGBqc1xuICAgKiBjb25zdCBhID0gdGYuZGF0YS5hcnJheShbMSwgMiwgMywgNCwgNSwgNiwgNywgOF0pLmJhdGNoKDQpO1xuICAgKiBhd2FpdCBhLmZvckVhY2hBc3luYyhlID0+IGUucHJpbnQoKSk7XG4gICAqIGBgYFxuICAgKlxuICAgKiBCYXRjaCBhIGRhdGFzZXQgb2YgYXJyYXlzOlxuICAgKiBgYGBqc1xuICAgKiBjb25zdCBiID0gdGYuZGF0YS5hcnJheShbWzFdLCBbMl0sIFszXSwgWzRdLCBbNV0sIFs2XSwgWzddLCBbOF1dKS5iYXRjaCg0KTtcbiAgICogYXdhaXQgYi5mb3JFYWNoQXN5bmMoZSA9PiBlLnByaW50KCkpO1xuICAgKiBgYGBcbiAgICpcbiAgICogQmF0Y2ggYSBkYXRhc2V0IG9mIG9iamVjdHM6XG4gICAqIGBgYGpzXG4gICAqIGNvbnN0IGMgPSB0Zi5kYXRhLmFycmF5KFt7YTogMSwgYjogMTF9LCB7YTogMiwgYjogMTJ9LCB7YTogMywgYjogMTN9LFxuICAgKiAgIHthOiA0LCBiOiAxNH0sIHthOiA1LCBiOiAxNX0sIHthOiA2LCBiOiAxNn0sIHthOiA3LCBiOiAxN30sXG4gICAqICAge2E6IDgsIGI6IDE4fV0pLmJhdGNoKDQpO1xuICAgKiBhd2FpdCBjLmZvckVhY2hBc3luYyhlID0+IHtcbiAgICogICBjb25zb2xlLmxvZygneycpO1xuICAgKiAgIGZvcih2YXIga2V5IGluIGUpIHtcbiAgICogICAgIGNvbnNvbGUubG9nKGtleSsnOicpO1xuICAgKiAgICAgZVtrZXldLnByaW50KCk7XG4gICAqICAgfVxuICAgKiAgIGNvbnNvbGUubG9nKCd9Jyk7XG4gICAqIH0pXG4gICAqIGBgYFxuICAgKlxuICAgKiBAcGFyYW0gYmF0Y2hTaXplIFRoZSBudW1iZXIgb2YgZWxlbWVudHMgZGVzaXJlZCBwZXIgYmF0Y2guXG4gICAqIEBwYXJhbSBzbWFsbExhc3RCYXRjaCBXaGV0aGVyIHRvIGVtaXQgdGhlIGZpbmFsIGJhdGNoIHdoZW4gaXQgaGFzIGZld2VyXG4gICAqICAgdGhhbiBiYXRjaFNpemUgZWxlbWVudHMuIERlZmF1bHQgdHJ1ZS5cbiAgICogQHJldHVybnMgQSBgRGF0YXNldGAsIGZyb20gd2hpY2ggYSBzdHJlYW0gb2YgYmF0Y2hlcyBjYW4gYmUgb2J0YWluZWQuXG4gICAqXG4gICAqIEBkb2Mge2hlYWRpbmc6ICdEYXRhJywgc3ViaGVhZGluZzogJ0NsYXNzZXMnfVxuICAgKi9cbiAgYmF0Y2goYmF0Y2hTaXplOiBudW1iZXIsIHNtYWxsTGFzdEJhdGNoID0gdHJ1ZSk6IERhdGFzZXQ8dGYuVGVuc29yQ29udGFpbmVyPiB7XG4gICAgY29uc3QgYmFzZSA9IHRoaXM7XG4gICAgdGYudXRpbC5hc3NlcnQoXG4gICAgICAgIGJhdGNoU2l6ZSA+IDAsICgpID0+IGBiYXRjaFNpemUgbmVlZHMgdG8gYmUgcG9zaXRpdmUsIGJ1dCBpdCBpc1xuICAgICAgJHtiYXRjaFNpemV9YCk7XG4gICAgbGV0IHNpemU7XG4gICAgaWYgKHRoaXMuc2l6ZSA9PT0gSW5maW5pdHkgfHwgdGhpcy5zaXplID09IG51bGwpIHtcbiAgICAgIC8vIElmIHRoZSBzaXplIG9mIHRoaXMgZGF0YXNldCBpcyBpbmZpbml0eSBvciBudWxsLCB0aGUgbmV3IHNpemUga2VlcHMgdGhlXG4gICAgICAvLyBzYW1lLlxuICAgICAgc2l6ZSA9IHRoaXMuc2l6ZTtcbiAgICB9IGVsc2UgaWYgKHNtYWxsTGFzdEJhdGNoKSB7XG4gICAgICAvLyBJZiB0aGUgc2l6ZSBvZiB0aGlzIGRhdGFzZXQgaXMga25vd24gYW5kIGluY2x1ZGUgc21hbGwgbGFzdCBiYXRjaCwgdGhlXG4gICAgICAvLyBuZXcgc2l6ZSBpcyBmdWxsIGJhdGNoIGNvdW50IHBsdXMgbGFzdCBiYXRjaC5cbiAgICAgIHNpemUgPSBNYXRoLmNlaWwodGhpcy5zaXplIC8gYmF0Y2hTaXplKTtcbiAgICB9IGVsc2Uge1xuICAgICAgLy8gSWYgdGhlIHNpemUgb2YgdGhpcyBkYXRhc2V0IGlzIGtub3duIGFuZCBub3QgaW5jbHVkZSBzbWFsbCBsYXN0IGJhdGNoLFxuICAgICAgLy8gdGhlIG5ldyBzaXplIGlzIGZ1bGwgYmF0Y2ggY291bnQuXG4gICAgICBzaXplID0gTWF0aC5mbG9vcih0aGlzLnNpemUgLyBiYXRjaFNpemUpO1xuICAgIH1cbiAgICByZXR1cm4gZGF0YXNldEZyb21JdGVyYXRvckZuKGFzeW5jICgpID0+IHtcbiAgICAgIHJldHVybiAoYXdhaXQgYmFzZS5pdGVyYXRvcigpKVxuICAgICAgICAgIC5jb2x1bW5NYWpvckJhdGNoKGJhdGNoU2l6ZSwgc21hbGxMYXN0QmF0Y2gsIGRlZXBCYXRjaENvbmNhdCk7XG4gICAgfSwgc2l6ZSk7XG4gIH1cblxuICAvKipcbiAgICogQ29uY2F0ZW5hdGVzIHRoaXMgYERhdGFzZXRgIHdpdGggYW5vdGhlci5cbiAgICpcbiAgICogYGBganNcbiAgICogY29uc3QgYSA9IHRmLmRhdGEuYXJyYXkoWzEsIDIsIDNdKTtcbiAgICogY29uc3QgYiA9IHRmLmRhdGEuYXJyYXkoWzQsIDUsIDZdKTtcbiAgICogY29uc3QgYyA9IGEuY29uY2F0ZW5hdGUoYik7XG4gICAqIGF3YWl0IGMuZm9yRWFjaEFzeW5jKGUgPT4gY29uc29sZS5sb2coZSkpO1xuICAgKiBgYGBcbiAgICpcbiAgICogQHBhcmFtIGRhdGFzZXQgQSBgRGF0YXNldGAgdG8gYmUgY29uY2F0ZW5hdGVkIG9udG8gdGhpcyBvbmUuXG4gICAqIEByZXR1cm5zIEEgYERhdGFzZXRgLlxuICAgKlxuICAgKiBAZG9jIHtoZWFkaW5nOiAnRGF0YScsIHN1YmhlYWRpbmc6ICdDbGFzc2VzJ31cbiAgICovXG4gIGNvbmNhdGVuYXRlKGRhdGFzZXQ6IERhdGFzZXQ8VD4pOiBEYXRhc2V0PFQ+IHtcbiAgICBjb25zdCBiYXNlID0gdGhpcztcbiAgICBsZXQgc2l6ZTtcbiAgICBpZiAodGhpcy5zaXplID09PSBJbmZpbml0eSB8fCBkYXRhc2V0LnNpemUgPT09IEluZmluaXR5KSB7XG4gICAgICAvLyBJZiB0aGUgc2l6ZSBvZiBhbnkgb2YgdGhlc2UgdHdvIGRhdGFzZXQgaXMgaW5maW5pdHksIG5ldyBzaXplIGlzXG4gICAgICAvLyBpbmZpbml0eS5cbiAgICAgIHNpemUgPSBJbmZpbml0eTtcbiAgICB9IGVsc2UgaWYgKHRoaXMuc2l6ZSAhPSBudWxsICYmIGRhdGFzZXQuc2l6ZSAhPSBudWxsKSB7XG4gICAgICAvLyBJZiB0aGUgc2l6ZSBvZiBib3RoIGRhdGFzZXRzIGFyZSBrbm93biBhbmQgbm90IGluZmluaXR5LCBuZXcgc2l6ZSBpc1xuICAgICAgLy8gc3VtIHRoZSBzaXplIG9mIHRoZXNlIHR3byBkYXRhc2V0cy5cbiAgICAgIHNpemUgPSB0aGlzLnNpemUgKyBkYXRhc2V0LnNpemU7XG4gICAgfSBlbHNlIHtcbiAgICAgIC8vIElmIG5laXRoZXIgb2YgdGhlc2UgdHdvIGRhdGFzZXRzIGhhcyBpbmZpbml0ZSBzaXplIGFuZCBhbnkgb2YgdGhlc2UgdHdvXG4gICAgICAvLyBkYXRhc2V0cycgc2l6ZSBpcyBudWxsLCB0aGUgbmV3IHNpemUgaXMgbnVsbC5cbiAgICAgIHNpemUgPSBudWxsO1xuICAgIH1cbiAgICByZXR1cm4gZGF0YXNldEZyb21JdGVyYXRvckZuKFxuICAgICAgICBhc3luYyAoKSA9PlxuICAgICAgICAgICAgKGF3YWl0IGJhc2UuaXRlcmF0b3IoKSkuY29uY2F0ZW5hdGUoYXdhaXQgZGF0YXNldC5pdGVyYXRvcigpKSxcbiAgICAgICAgc2l6ZSk7XG4gIH1cblxuICAvKipcbiAgICogRmlsdGVycyB0aGlzIGRhdGFzZXQgYWNjb3JkaW5nIHRvIGBwcmVkaWNhdGVgLlxuICAgKlxuICAgKiBgYGBqc1xuICAgKiBjb25zdCBhID0gdGYuZGF0YS5hcnJheShbMSwgMiwgMywgNCwgNSwgNiwgNywgOCwgOSwgMTBdKVxuICAgKiAgIC5maWx0ZXIoeCA9PiB4JTIgPT09IDApO1xuICAgKiBhd2FpdCBhLmZvckVhY2hBc3luYyhlID0+IGNvbnNvbGUubG9nKGUpKTtcbiAgICogYGBgXG4gICAqXG4gICAqIEBwYXJhbSBwcmVkaWNhdGUgQSBmdW5jdGlvbiBtYXBwaW5nIGEgZGF0YXNldCBlbGVtZW50IHRvIGEgYm9vbGVhbiBvciBhXG4gICAqIGBQcm9taXNlYCBmb3Igb25lLlxuICAgKlxuICAgKiBAcmV0dXJucyBBIGBEYXRhc2V0YCBvZiBlbGVtZW50cyBmb3Igd2hpY2ggdGhlIHByZWRpY2F0ZSB3YXMgdHJ1ZS5cbiAgICpcbiAgICogQGRvYyB7aGVhZGluZzogJ0RhdGEnLCBzdWJoZWFkaW5nOiAnQ2xhc3Nlcyd9XG4gICAqL1xuICBmaWx0ZXIocHJlZGljYXRlOiAodmFsdWU6IFQpID0+IGJvb2xlYW4pOiBEYXRhc2V0PFQ+IHtcbiAgICBjb25zdCBiYXNlID0gdGhpcztcbiAgICBsZXQgc2l6ZTtcbiAgICBpZiAodGhpcy5zaXplID09PSBJbmZpbml0eSkge1xuICAgICAgLy8gSWYgdGhlIHNpemUgb2YgdGhpcyBkYXRhc2V0IGlzIGluZmluaXR5LCBuZXcgc2l6ZSBpcyBpbmZpbml0eVxuICAgICAgc2l6ZSA9IEluZmluaXR5O1xuICAgIH0gZWxzZSB7XG4gICAgICAvLyBJZiB0aGlzIGRhdGFzZXQgaGFzIGxpbWl0ZWQgZWxlbWVudHMsIG5ldyBzaXplIGlzIG51bGwgYmVjYXVzZSBpdCBtaWdodFxuICAgICAgLy8gZXhoYXVzdGVkIHJhbmRvbWx5LlxuICAgICAgc2l6ZSA9IG51bGw7XG4gICAgfVxuICAgIHJldHVybiBkYXRhc2V0RnJvbUl0ZXJhdG9yRm4oYXN5bmMgKCkgPT4ge1xuICAgICAgcmV0dXJuIChhd2FpdCBiYXNlLml0ZXJhdG9yKCkpLmZpbHRlcih4ID0+IHRmLnRpZHkoKCkgPT4gcHJlZGljYXRlKHgpKSk7XG4gICAgfSwgc2l6ZSk7XG4gIH1cblxuICAvKipcbiAgICogQXBwbHkgYSBmdW5jdGlvbiB0byBldmVyeSBlbGVtZW50IG9mIHRoZSBkYXRhc2V0LlxuICAgKlxuICAgKiBBZnRlciB0aGUgZnVuY3Rpb24gaXMgYXBwbGllZCB0byBhIGRhdGFzZXQgZWxlbWVudCwgYW55IFRlbnNvcnMgY29udGFpbmVkXG4gICAqIHdpdGhpbiB0aGF0IGVsZW1lbnQgYXJlIGRpc3Bvc2VkLlxuICAgKlxuICAgKiBgYGBqc1xuICAgKiBjb25zdCBhID0gdGYuZGF0YS5hcnJheShbMSwgMiwgM10pO1xuICAgKiBhd2FpdCBhLmZvckVhY2hBc3luYyhlID0+IGNvbnNvbGUubG9nKGUpKTtcbiAgICogYGBgXG4gICAqXG4gICAqIEBwYXJhbSBmIEEgZnVuY3Rpb24gdG8gYXBwbHkgdG8gZWFjaCBkYXRhc2V0IGVsZW1lbnQuXG4gICAqIEByZXR1cm5zIEEgYFByb21pc2VgIHRoYXQgcmVzb2x2ZXMgYWZ0ZXIgYWxsIGVsZW1lbnRzIGhhdmUgYmVlbiBwcm9jZXNzZWQuXG4gICAqXG4gICAqIEBkb2Mge2hlYWRpbmc6ICdEYXRhJywgc3ViaGVhZGluZzogJ0NsYXNzZXMnfVxuICAgKi9cbiAgYXN5bmMgZm9yRWFjaEFzeW5jKGY6IChpbnB1dDogVCkgPT4gdm9pZCk6IFByb21pc2U8dm9pZD4ge1xuICAgIHJldHVybiAoYXdhaXQgdGhpcy5pdGVyYXRvcigpKS5mb3JFYWNoQXN5bmMoZik7XG4gIH1cblxuICAvKipcbiAgICogTWFwcyB0aGlzIGRhdGFzZXQgdGhyb3VnaCBhIDEtdG8tMSB0cmFuc2Zvcm0uXG4gICAqXG4gICAqIGBgYGpzXG4gICAqIGNvbnN0IGEgPSB0Zi5kYXRhLmFycmF5KFsxLCAyLCAzXSkubWFwKHggPT4geCp4KTtcbiAgICogYXdhaXQgYS5mb3JFYWNoQXN5bmMoZSA9PiBjb25zb2xlLmxvZyhlKSk7XG4gICAqIGBgYFxuICAgKlxuICAgKiBAcGFyYW0gdHJhbnNmb3JtIEEgZnVuY3Rpb24gbWFwcGluZyBhIGRhdGFzZXQgZWxlbWVudCB0byBhIHRyYW5zZm9ybWVkXG4gICAqICAgZGF0YXNldCBlbGVtZW50LlxuICAgKlxuICAgKiBAcmV0dXJucyBBIGBEYXRhc2V0YCBvZiB0cmFuc2Zvcm1lZCBlbGVtZW50cy5cbiAgICpcbiAgICogQGRvYyB7aGVhZGluZzogJ0RhdGEnLCBzdWJoZWFkaW5nOiAnQ2xhc3Nlcyd9XG4gICAqL1xuICBtYXA8TyBleHRlbmRzIHRmLlRlbnNvckNvbnRhaW5lcj4odHJhbnNmb3JtOiAodmFsdWU6IFQpID0+IE8pOiBEYXRhc2V0PE8+IHtcbiAgICBjb25zdCBiYXNlID0gdGhpcztcbiAgICByZXR1cm4gZGF0YXNldEZyb21JdGVyYXRvckZuKGFzeW5jICgpID0+IHtcbiAgICAgIHJldHVybiAoYXdhaXQgYmFzZS5pdGVyYXRvcigpKS5tYXAoeCA9PiB0Zi50aWR5KCgpID0+IHRyYW5zZm9ybSh4KSkpO1xuICAgIH0sIHRoaXMuc2l6ZSk7XG4gIH1cblxuICAvKipcbiAgICogTWFwcyB0aGlzIGRhdGFzZXQgdGhyb3VnaCBhbiBhc3luYyAxLXRvLTEgdHJhbnNmb3JtLlxuICAgKlxuICAgKiBgYGBqc1xuICAgKiBjb25zdCBhID1cbiAgICogIHRmLmRhdGEuYXJyYXkoWzEsIDIsIDNdKS5tYXBBc3luYyh4ID0+IG5ldyBQcm9taXNlKGZ1bmN0aW9uKHJlc29sdmUpe1xuICAgKiAgICBzZXRUaW1lb3V0KCgpID0+IHtcbiAgICogICAgICByZXNvbHZlKHggKiB4KTtcbiAgICogICAgfSwgTWF0aC5yYW5kb20oKSoxMDAwICsgNTAwKTtcbiAgICogIH0pKTtcbiAgICogY29uc29sZS5sb2coYXdhaXQgYS50b0FycmF5KCkpO1xuICAgKiBgYGBcbiAgICpcbiAgICogQHBhcmFtIHRyYW5zZm9ybSBBIGZ1bmN0aW9uIG1hcHBpbmcgYSBkYXRhc2V0IGVsZW1lbnQgdG8gYSBgUHJvbWlzZWAgZm9yIGFcbiAgICogICB0cmFuc2Zvcm1lZCBkYXRhc2V0IGVsZW1lbnQuICBUaGlzIHRyYW5zZm9ybSBpcyByZXNwb25zaWJsZSBmb3IgZGlzcG9zaW5nXG4gICAqICAgYW55IGludGVybWVkaWF0ZSBgVGVuc29yYHMsIGkuZS4gYnkgd3JhcHBpbmcgaXRzIGNvbXB1dGF0aW9uIGluXG4gICAqICAgYHRmLnRpZHkoKWA7IHRoYXQgY2Fubm90IGJlIGF1dG9tYXRlZCBoZXJlIChhcyBpdCBpcyBpbiB0aGUgc3luY2hyb25vdXNcbiAgICogICBgbWFwKClgIGNhc2UpLlxuICAgKlxuICAgKiBAcmV0dXJucyBBIGBEYXRhc2V0YCBvZiB0cmFuc2Zvcm1lZCBlbGVtZW50cy5cbiAgICpcbiAgICogQGRvYyB7aGVhZGluZzogJ0RhdGEnLCBzdWJoZWFkaW5nOiAnQ2xhc3Nlcyd9XG4gICAqL1xuICBtYXBBc3luYzxPIGV4dGVuZHMgdGYuVGVuc29yQ29udGFpbmVyPih0cmFuc2Zvcm06ICh2YWx1ZTogVCkgPT4gUHJvbWlzZTxPPik6XG4gICAgICBEYXRhc2V0PE8+IHtcbiAgICBjb25zdCBiYXNlID0gdGhpcztcbiAgICByZXR1cm4gZGF0YXNldEZyb21JdGVyYXRvckZuKGFzeW5jICgpID0+IHtcbiAgICAgIHJldHVybiAoYXdhaXQgYmFzZS5pdGVyYXRvcigpKS5tYXBBc3luYyh0cmFuc2Zvcm0pO1xuICAgIH0sIHRoaXMuc2l6ZSk7XG4gIH1cblxuICAvKipcbiAgICogIENyZWF0ZXMgYSBgRGF0YXNldGAgdGhhdCBwcmVmZXRjaGVzIGVsZW1lbnRzIGZyb20gdGhpcyBkYXRhc2V0LlxuICAgKlxuICAgKiBAcGFyYW0gYnVmZmVyU2l6ZTogQW4gaW50ZWdlciBzcGVjaWZ5aW5nIHRoZSBudW1iZXIgb2YgZWxlbWVudHMgdG8gYmVcbiAgICogICBwcmVmZXRjaGVkLlxuICAgKiBAcmV0dXJucyBBIGBEYXRhc2V0YC5cbiAgICpcbiAgICogQGRvYyB7aGVhZGluZzogJ0RhdGEnLCBzdWJoZWFkaW5nOiAnQ2xhc3Nlcyd9XG4gICAqL1xuICBwcmVmZXRjaChidWZmZXJTaXplOiBudW1iZXIpOiBEYXRhc2V0PFQ+IHtcbiAgICBpZiAoYnVmZmVyU2l6ZSA9PSBudWxsKSB7XG4gICAgICB0aHJvdyBuZXcgUmFuZ2VFcnJvcihcbiAgICAgICAgICAnYERhdGFzZXQucHJlZmV0Y2goKWAgcmVxdWlyZXMgYnVmZmVyU2l6ZSB0byBiZSBzcGVjaWZpZWQuJyk7XG4gICAgfVxuXG4gICAgY29uc3QgYmFzZSA9IHRoaXM7XG4gICAgcmV0dXJuIGRhdGFzZXRGcm9tSXRlcmF0b3JGbihcbiAgICAgICAgYXN5bmMgKCkgPT4gKGF3YWl0IGJhc2UuaXRlcmF0b3IoKSkucHJlZmV0Y2goYnVmZmVyU2l6ZSksIHRoaXMuc2l6ZSk7XG4gIH1cblxuICAvKipcbiAgICogUmVwZWF0cyB0aGlzIGRhdGFzZXQgYGNvdW50YCB0aW1lcy5cbiAgICpcbiAgICogTk9URTogSWYgdGhpcyBkYXRhc2V0IGlzIGEgZnVuY3Rpb24gb2YgZ2xvYmFsIHN0YXRlIChlLmcuIGEgcmFuZG9tIG51bWJlclxuICAgKiBnZW5lcmF0b3IpLCB0aGVuIGRpZmZlcmVudCByZXBldGl0aW9ucyBtYXkgcHJvZHVjZSBkaWZmZXJlbnQgZWxlbWVudHMuXG4gICAqXG4gICAqIGBgYGpzXG4gICAqIGNvbnN0IGEgPSB0Zi5kYXRhLmFycmF5KFsxLCAyLCAzXSkucmVwZWF0KDMpO1xuICAgKiBhd2FpdCBhLmZvckVhY2hBc3luYyhlID0+IGNvbnNvbGUubG9nKGUpKTtcbiAgICogYGBgXG4gICAqXG4gICAqIEBwYXJhbSBjb3VudDogKE9wdGlvbmFsKSBBbiBpbnRlZ2VyLCByZXByZXNlbnRpbmcgdGhlIG51bWJlciBvZiB0aW1lc1xuICAgKiAgIHRoZSBkYXRhc2V0IHNob3VsZCBiZSByZXBlYXRlZC4gVGhlIGRlZmF1bHQgYmVoYXZpb3IgKGlmIGBjb3VudGAgaXNcbiAgICogICBgdW5kZWZpbmVkYCBvciBuZWdhdGl2ZSkgaXMgZm9yIHRoZSBkYXRhc2V0IGJlIHJlcGVhdGVkIGluZGVmaW5pdGVseS5cbiAgICogQHJldHVybnMgQSBgRGF0YXNldGAuXG4gICAqXG4gICAqIEBkb2Mge2hlYWRpbmc6ICdEYXRhJywgc3ViaGVhZGluZzogJ0NsYXNzZXMnfVxuICAgKi9cbiAgcmVwZWF0KGNvdW50PzogbnVtYmVyKTogRGF0YXNldDxUPiB7XG4gICAgY29uc3QgYmFzZSA9IHRoaXM7XG4gICAgbGV0IHNpemU7XG4gICAgaWYgKHRoaXMuc2l6ZSAhPSBudWxsICYmIGNvdW50ID4gMCkge1xuICAgICAgLy8gSWYgdGhpcyBkYXRhc2V0IGhhcyBzaXplIGFuZCBjb3VudCBpcyBwb3NpdGl2ZSwgbmV3IHNpemUgaXMgY3VycmVudFxuICAgICAgLy8gc2l6ZSBtdWx0aXBseSBjb3VudC4gVGhpcyBhbHNvIGNvdmVycyB0aGUgY2FzZSB0aGF0IGN1cnJlbnQgc2l6ZSBpc1xuICAgICAgLy8gaW5maW5pdHkuXG4gICAgICBzaXplID0gdGhpcy5zaXplICogY291bnQ7XG4gICAgfSBlbHNlIGlmIChjb3VudCA9PT0gMCkge1xuICAgICAgLy8gSWYgY291bnQgaXMgMCwgbmV3IHNpemUgaXMgMC5cbiAgICAgIHNpemUgPSAwO1xuICAgIH0gZWxzZSBpZiAodGhpcy5zaXplICE9IG51bGwgJiYgKGNvdW50ID09PSB1bmRlZmluZWQgfHwgY291bnQgPCAwKSkge1xuICAgICAgLy8gSWYgdGhpcyBkYXRhc2V0IGhhcyBzaXplIGFuZCBjb3VudCBpcyB1bmRlZmluZWQgb3IgbmVnYXRpdmUsIHRoZVxuICAgICAgLy8gZGF0YXNldCB3aWxsIGJlIHJlcGVhdGVkIGluZGVmaW5pdGVseSBhbmQgbmV3IHNpemUgaXMgaW5maW5pdHkuXG4gICAgICBzaXplID0gSW5maW5pdHk7XG4gICAgfSBlbHNlIHtcbiAgICAgIC8vIElmIHRoZSBzaXplIG9mIHRoaXMgZGF0YXNldCBpcyBudWxsLCB0aGUgbmV3IGRhdGFzZXQncyBzaXplIGlzIG51bGwuXG4gICAgICBzaXplID0gbnVsbDtcbiAgICB9XG4gICAgcmV0dXJuIGRhdGFzZXRGcm9tSXRlcmF0b3JGbihhc3luYyAoKSA9PiB7XG4gICAgICBjb25zdCBpdGVyYXRvckl0ZXJhdG9yID0gaXRlcmF0b3JGcm9tRnVuY3Rpb24oXG4gICAgICAgICAgYXN5bmMgKCkgPT4gKHt2YWx1ZTogYXdhaXQgYmFzZS5pdGVyYXRvcigpLCBkb25lOiBmYWxzZX0pKTtcbiAgICAgIHJldHVybiBpdGVyYXRvckZyb21Db25jYXRlbmF0ZWQoaXRlcmF0b3JJdGVyYXRvci50YWtlKGNvdW50KSk7XG4gICAgfSwgc2l6ZSk7XG4gIH1cblxuICAvKipcbiAgICogQ3JlYXRlcyBhIGBEYXRhc2V0YCB0aGF0IHNraXBzIGBjb3VudGAgaW5pdGlhbCBlbGVtZW50cyBmcm9tIHRoaXMgZGF0YXNldC5cbiAgICpcbiAgICogYGBganNcbiAgICogY29uc3QgYSA9IHRmLmRhdGEuYXJyYXkoWzEsIDIsIDMsIDQsIDUsIDZdKS5za2lwKDMpO1xuICAgKiBhd2FpdCBhLmZvckVhY2hBc3luYyhlID0+IGNvbnNvbGUubG9nKGUpKTtcbiAgICogYGBgXG4gICAqXG4gICAqIEBwYXJhbSBjb3VudDogVGhlIG51bWJlciBvZiBlbGVtZW50cyBvZiB0aGlzIGRhdGFzZXQgdGhhdCBzaG91bGQgYmUgc2tpcHBlZFxuICAgKiAgIHRvIGZvcm0gdGhlIG5ldyBkYXRhc2V0LiAgSWYgYGNvdW50YCBpcyBncmVhdGVyIHRoYW4gdGhlIHNpemUgb2YgdGhpc1xuICAgKiAgIGRhdGFzZXQsIHRoZSBuZXcgZGF0YXNldCB3aWxsIGNvbnRhaW4gbm8gZWxlbWVudHMuICBJZiBgY291bnRgXG4gICAqICAgaXMgYHVuZGVmaW5lZGAgb3IgbmVnYXRpdmUsIHNraXBzIHRoZSBlbnRpcmUgZGF0YXNldC5cbiAgICpcbiAgICogQHJldHVybnMgQSBgRGF0YXNldGAuXG4gICAqXG4gICAqIEBkb2Mge2hlYWRpbmc6ICdEYXRhJywgc3ViaGVhZGluZzogJ0NsYXNzZXMnfVxuICAgKi9cbiAgc2tpcChjb3VudDogbnVtYmVyKTogRGF0YXNldDxUPiB7XG4gICAgY29uc3QgYmFzZSA9IHRoaXM7XG4gICAgbGV0IHNpemU7XG4gICAgaWYgKHRoaXMuc2l6ZSAhPSBudWxsICYmIGNvdW50ID49IDAgJiYgdGhpcy5zaXplID49IGNvdW50KSB7XG4gICAgICAvLyBJZiB0aGUgc2l6ZSBvZiB0aGlzIGRhdGFzZXQgaXMgZ3JlYXRlciB0aGFuIGNvdW50LCB0aGUgbmV3IGRhdGFzZXQnc1xuICAgICAgLy8gc2l6ZSBpcyBjdXJyZW50IHNpemUgbWludXMgc2tpcHBlZCBzaXplLlRoaXMgYWxzbyBjb3ZlcnMgdGhlIGNhc2UgdGhhdFxuICAgICAgLy8gY3VycmVudCBzaXplIGlzIGluZmluaXR5LlxuICAgICAgc2l6ZSA9IHRoaXMuc2l6ZSAtIGNvdW50O1xuICAgIH0gZWxzZSBpZiAoXG4gICAgICAgIHRoaXMuc2l6ZSAhPSBudWxsICYmXG4gICAgICAgICh0aGlzLnNpemUgPCBjb3VudCB8fCBjb3VudCA9PT0gdW5kZWZpbmVkIHx8IGNvdW50IDwgMCkpIHtcbiAgICAgIC8vIElmIHRoZSBzaXplIG9mIHRoaXMgZGF0YXNldCBpcyBzbWFsbGVyIHRoYW4gY291bnQsIG9yIGNvdW50IGlzXG4gICAgICAvLyB1bmRlZmluZWQgb3IgbmVnYXRpdmUsIHNraXBzIHRoZSBlbnRpcmUgZGF0YXNldCBhbmQgdGhlIG5ldyBzaXplIGlzIDAuXG4gICAgICBzaXplID0gMDtcbiAgICB9IGVsc2Uge1xuICAgICAgLy8gSWYgdGhlIHNpemUgb2YgdGhpcyBkYXRhc2V0IGlzIG51bGwsIHRoZSBuZXcgZGF0YXNldCdzIHNpemUgaXMgbnVsbC5cbiAgICAgIHNpemUgPSBudWxsO1xuICAgIH1cbiAgICByZXR1cm4gZGF0YXNldEZyb21JdGVyYXRvckZuKFxuICAgICAgICBhc3luYyAoKSA9PiAoYXdhaXQgYmFzZS5pdGVyYXRvcigpKS5za2lwKGNvdW50KSwgc2l6ZSk7XG4gIH1cblxuICAvLyBUT0RPKHNvZXJnZWwpOiBkZWVwIHNoYXJkZWQgc2h1ZmZsZSwgd2hlcmUgc3VwcG9ydGVkXG5cbiAgc3RhdGljIHJlYWRvbmx5IE1BWF9CVUZGRVJfU0laRSA9IDEwMDAwO1xuXG4gIC8qKlxuICAgKiBQc2V1ZG9yYW5kb21seSBzaHVmZmxlcyB0aGUgZWxlbWVudHMgb2YgdGhpcyBkYXRhc2V0LiBUaGlzIGlzIGRvbmUgaW4gYVxuICAgKiBzdHJlYW1pbmcgbWFubmVyLCBieSBzYW1wbGluZyBmcm9tIGEgZ2l2ZW4gbnVtYmVyIG9mIHByZWZldGNoZWQgZWxlbWVudHMuXG4gICAqXG4gICAqIGBgYGpzXG4gICAqIGNvbnN0IGEgPSB0Zi5kYXRhLmFycmF5KFsxLCAyLCAzLCA0LCA1LCA2XSkuc2h1ZmZsZSgzKTtcbiAgICogYXdhaXQgYS5mb3JFYWNoQXN5bmMoZSA9PiBjb25zb2xlLmxvZyhlKSk7XG4gICAqIGBgYFxuICAgKlxuICAgKiBAcGFyYW0gYnVmZmVyU2l6ZTogQW4gaW50ZWdlciBzcGVjaWZ5aW5nIHRoZSBudW1iZXIgb2YgZWxlbWVudHMgZnJvbSB0aGlzXG4gICAqICAgZGF0YXNldCBmcm9tIHdoaWNoIHRoZSBuZXcgZGF0YXNldCB3aWxsIHNhbXBsZS5cbiAgICogQHBhcmFtIHNlZWQ6IChPcHRpb25hbCkgQW4gaW50ZWdlciBzcGVjaWZ5aW5nIHRoZSByYW5kb20gc2VlZCB0aGF0IHdpbGxcbiAgICogICBiZSB1c2VkIHRvIGNyZWF0ZSB0aGUgZGlzdHJpYnV0aW9uLlxuICAgKiBAcGFyYW0gcmVzaHVmZmxlRWFjaEl0ZXJhdGlvbjogKE9wdGlvbmFsKSBBIGJvb2xlYW4sIHdoaWNoIGlmIHRydWVcbiAgICogICBpbmRpY2F0ZXMgdGhhdCB0aGUgZGF0YXNldCBzaG91bGQgYmUgcHNldWRvcmFuZG9tbHkgcmVzaHVmZmxlZCBlYWNoIHRpbWVcbiAgICogICBpdCBpcyBpdGVyYXRlZCBvdmVyLiBJZiBmYWxzZSwgZWxlbWVudHMgd2lsbCBiZSByZXR1cm5lZCBpbiB0aGUgc2FtZVxuICAgKiAgIHNodWZmbGVkIG9yZGVyIG9uIGVhY2ggaXRlcmF0aW9uLiAoRGVmYXVsdHMgdG8gYHRydWVgLilcbiAgICogQHJldHVybnMgQSBgRGF0YXNldGAuXG4gICAqXG4gICAqIEBkb2Mge2hlYWRpbmc6ICdEYXRhJywgc3ViaGVhZGluZzogJ0NsYXNzZXMnfVxuICAgKi9cbiAgc2h1ZmZsZShidWZmZXJTaXplOiBudW1iZXIsIHNlZWQ/OiBzdHJpbmcsIHJlc2h1ZmZsZUVhY2hJdGVyYXRpb24gPSB0cnVlKTpcbiAgICAgIERhdGFzZXQ8VD4ge1xuICAgIGlmIChidWZmZXJTaXplID09IG51bGwgfHwgYnVmZmVyU2l6ZSA8IDApIHtcbiAgICAgIGlmICh0aGlzLnNpemUgPT0gbnVsbCkge1xuICAgICAgICB0aHJvdyBuZXcgUmFuZ2VFcnJvcihcbiAgICAgICAgICAgICdgRGF0YXNldC5zaHVmZmxlKClgIHJlcXVpcmVzIGJ1ZmZlclNpemUgdG8gYmUgc3BlY2lmaWVkLicpO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgdGhyb3cgbmV3IFJhbmdlRXJyb3IoXG4gICAgICAgICAgICAnYERhdGFzZXQuc2h1ZmZsZSgpYCByZXF1aXJlcyBidWZmZXJTaXplIHRvIGJlIHNwZWNpZmllZC4gICcgK1xuICAgICAgICAgICAgJ0lmIHlvdXIgZGF0YSBmaXRzIGluIG1haW4gbWVtb3J5IChmb3IgcmVndWxhciBKUyBvYmplY3RzKSwgJyArXG4gICAgICAgICAgICAnYW5kL29yIEdQVSBtZW1vcnkgKGZvciBgdGYuVGVuc29yYHMpLCBjb25zaWRlciBzZXR0aW5nICcgK1xuICAgICAgICAgICAgYGJ1ZmZlclNpemUgdG8gdGhlIGRhdGFzZXQgc2l6ZSAoJHt0aGlzLnNpemV9IGVsZW1lbnRzKWApO1xuICAgICAgfVxuICAgIH1cbiAgICBjb25zdCBiYXNlID0gdGhpcztcbiAgICBjb25zdCByYW5kb20gPSBzZWVkcmFuZG9tLmFsZWEoc2VlZCB8fCB0Zi51dGlsLm5vdygpLnRvU3RyaW5nKCkpO1xuICAgIHJldHVybiBkYXRhc2V0RnJvbUl0ZXJhdG9yRm4oYXN5bmMgKCkgPT4ge1xuICAgICAgbGV0IHNlZWQyID0gcmFuZG9tLmludDMyKCk7XG4gICAgICBpZiAocmVzaHVmZmxlRWFjaEl0ZXJhdGlvbikge1xuICAgICAgICBzZWVkMiArPSByYW5kb20uaW50MzIoKTtcbiAgICAgIH1cbiAgICAgIHJldHVybiAoYXdhaXQgYmFzZS5pdGVyYXRvcigpKS5zaHVmZmxlKGJ1ZmZlclNpemUsIHNlZWQyLnRvU3RyaW5nKCkpO1xuICAgIH0sIHRoaXMuc2l6ZSk7XG4gIH1cblxuICAvKipcbiAgICogQ3JlYXRlcyBhIGBEYXRhc2V0YCB3aXRoIGF0IG1vc3QgYGNvdW50YCBpbml0aWFsIGVsZW1lbnRzIGZyb20gdGhpc1xuICAgKiBkYXRhc2V0LlxuICAgKlxuICAgKiBgYGBqc1xuICAgKiBjb25zdCBhID0gdGYuZGF0YS5hcnJheShbMSwgMiwgMywgNCwgNSwgNl0pLnRha2UoMyk7XG4gICAqIGF3YWl0IGEuZm9yRWFjaEFzeW5jKGUgPT4gY29uc29sZS5sb2coZSkpO1xuICAgKiBgYGBcbiAgICpcbiAgICogQHBhcmFtIGNvdW50OiBUaGUgbnVtYmVyIG9mIGVsZW1lbnRzIG9mIHRoaXMgZGF0YXNldCB0aGF0IHNob3VsZCBiZSB0YWtlblxuICAgKiAgIHRvIGZvcm0gdGhlIG5ldyBkYXRhc2V0LiAgSWYgYGNvdW50YCBpcyBgdW5kZWZpbmVkYCBvciBuZWdhdGl2ZSwgb3IgaWZcbiAgICogICBgY291bnRgIGlzIGdyZWF0ZXIgdGhhbiB0aGUgc2l6ZSBvZiB0aGlzIGRhdGFzZXQsIHRoZSBuZXcgZGF0YXNldCB3aWxsXG4gICAqICAgY29udGFpbiBhbGwgZWxlbWVudHMgb2YgdGhpcyBkYXRhc2V0LlxuICAgKiBAcmV0dXJucyBBIGBEYXRhc2V0YC5cbiAgICpcbiAgICogQGRvYyB7aGVhZGluZzogJ0RhdGEnLCBzdWJoZWFkaW5nOiAnQ2xhc3Nlcyd9XG4gICAqL1xuICB0YWtlKGNvdW50OiBudW1iZXIpOiBEYXRhc2V0PFQ+IHtcbiAgICBjb25zdCBiYXNlID0gdGhpcztcbiAgICBsZXQgc2l6ZTtcbiAgICBpZiAodGhpcy5zaXplICE9IG51bGwgJiYgdGhpcy5zaXplID4gY291bnQpIHtcbiAgICAgIC8vIElmIHRoZSBzaXplIG9mIHRoaXMgZGF0YXNldCBpcyBncmVhdGVyIHRoYW4gY291bnQsIHRoZSBuZXcgZGF0YXNldCdzXG4gICAgICAvLyBzaXplIGlzIGNvdW50LlxuICAgICAgc2l6ZSA9IGNvdW50O1xuICAgIH0gZWxzZSBpZiAodGhpcy5zaXplICE9IG51bGwgJiYgdGhpcy5zaXplIDw9IGNvdW50KSB7XG4gICAgICAvLyBJZiB0aGUgc2l6ZSBvZiB0aGlzIGRhdGFzZXQgaXMgZXF1YWwgb3Igc21hbGxlciB0aGFuIGNvdW50LCB0aGUgbmV3XG4gICAgICAvLyBkYXRhc2V0J3Mgc2l6ZSBpcyB0aGUgc2l6ZSBvZiB0aGlzIGRhdGFzZXQuXG4gICAgICBzaXplID0gdGhpcy5zaXplO1xuICAgIH0gZWxzZSB7XG4gICAgICAvLyBJZiB0aGUgc2l6ZSBvZiB0aGlzIGRhdGFzZXQgaXMgbnVsbCwgdGhlIG5ldyBkYXRhc2V0J3Mgc2l6ZSBpcyBudWxsLlxuICAgICAgc2l6ZSA9IG51bGw7XG4gICAgfVxuICAgIHJldHVybiBkYXRhc2V0RnJvbUl0ZXJhdG9yRm4oXG4gICAgICAgIGFzeW5jICgpID0+IChhd2FpdCBiYXNlLml0ZXJhdG9yKCkpLnRha2UoY291bnQpLCBzaXplKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBDb2xsZWN0IGFsbCBlbGVtZW50cyBvZiB0aGlzIGRhdGFzZXQgaW50byBhbiBhcnJheS5cbiAgICpcbiAgICogT2J2aW91c2x5IHRoaXMgd2lsbCBzdWNjZWVkIG9ubHkgZm9yIHNtYWxsIGRhdGFzZXRzIHRoYXQgZml0IGluIG1lbW9yeS5cbiAgICogVXNlZnVsIGZvciB0ZXN0aW5nIGFuZCBnZW5lcmFsbHkgc2hvdWxkIGJlIGF2b2lkZWQgaWYgcG9zc2libGUuXG4gICAqXG4gICAqIGBgYGpzXG4gICAqIGNvbnN0IGEgPSB0Zi5kYXRhLmFycmF5KFsxLCAyLCAzLCA0LCA1LCA2XSk7XG4gICAqIGNvbnNvbGUubG9nKGF3YWl0IGEudG9BcnJheSgpKTtcbiAgICogYGBgXG4gICAqXG4gICAqIEByZXR1cm5zIEEgUHJvbWlzZSBmb3IgYW4gYXJyYXkgb2YgZWxlbWVudHMsIHdoaWNoIHdpbGwgcmVzb2x2ZVxuICAgKiAgIHdoZW4gYSBuZXcgc3RyZWFtIGhhcyBiZWVuIG9idGFpbmVkIGFuZCBmdWxseSBjb25zdW1lZC5cbiAgICpcbiAgICogQGRvYyB7aGVhZGluZzogJ0RhdGEnLCBzdWJoZWFkaW5nOiAnQ2xhc3Nlcyd9XG4gICAqL1xuICBhc3luYyB0b0FycmF5KCkge1xuICAgIGlmICh0aGlzLnNpemUgPT09IEluZmluaXR5KSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoJ0NhbiBub3QgY29udmVydCBpbmZpbml0ZSBkYXRhIHN0cmVhbSB0byBhcnJheS4nKTtcbiAgICB9XG4gICAgcmV0dXJuIChhd2FpdCB0aGlzLml0ZXJhdG9yKCkpLnRvQXJyYXkoKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBDb2xsZWN0IGFsbCBlbGVtZW50cyBvZiB0aGlzIGRhdGFzZXQgaW50byBhbiBhcnJheSB3aXRoIHByZWZldGNoaW5nIDEwMFxuICAgKiBlbGVtZW50cy4gVGhpcyBpcyB1c2VmdWwgZm9yIHRlc3RpbmcsIGJlY2F1c2UgdGhlIHByZWZldGNoIGNoYW5nZXMgdGhlXG4gICAqIG9yZGVyIGluIHdoaWNoIHRoZSBQcm9taXNlcyBhcmUgcmVzb2x2ZWQgYWxvbmcgdGhlIHByb2Nlc3NpbmcgcGlwZWxpbmUuXG4gICAqIFRoaXMgbWF5IGhlbHAgZXhwb3NlIGJ1Z3Mgd2hlcmUgcmVzdWx0cyBhcmUgZGVwZW5kZW50IG9uIHRoZSBvcmRlciBvZlxuICAgKiBQcm9taXNlIHJlc29sdXRpb24gcmF0aGVyIHRoYW4gb24gdGhlIGxvZ2ljYWwgb3JkZXIgb2YgdGhlIHN0cmVhbSAoaS5lLixcbiAgICogZHVlIHRvIGhpZGRlbiBtdXRhYmxlIHN0YXRlKS5cbiAgICpcbiAgICogQHJldHVybnMgQSBQcm9taXNlIGZvciBhbiBhcnJheSBvZiBlbGVtZW50cywgd2hpY2ggd2lsbCByZXNvbHZlXG4gICAqICAgd2hlbiBhIG5ldyBzdHJlYW0gaGFzIGJlZW4gb2J0YWluZWQgYW5kIGZ1bGx5IGNvbnN1bWVkLlxuICAgKi9cbiAgYXN5bmMgdG9BcnJheUZvclRlc3QoKSB7XG4gICAgaWYgKHRoaXMuc2l6ZSA9PT0gSW5maW5pdHkpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcignQ2FuIG5vdCBjb252ZXJ0IGluZmluaXRlIGRhdGEgc3RyZWFtIHRvIGFycmF5LicpO1xuICAgIH1cbiAgICByZXR1cm4gKGF3YWl0IHRoaXMuaXRlcmF0b3IoKSkudG9BcnJheUZvclRlc3QoKTtcbiAgfVxufVxuXG4vKipcbiAqIENyZWF0ZSBhIGBEYXRhc2V0YCBkZWZpbmVkIGJ5IGEgcHJvdmlkZWQgaXRlcmF0b3IoKSBmdW5jdGlvbi5cbiAqXG4gKiBgYGBqc1xuICogbGV0IGkgPSAtMTtcbiAqIGNvbnN0IGZ1bmMgPSAoKSA9PlxuICogICAgKytpIDwgNSA/IHt2YWx1ZTogaSwgZG9uZTogZmFsc2V9IDoge3ZhbHVlOiBudWxsLCBkb25lOiB0cnVlfTtcbiAqIGNvbnN0IGl0ZXIgPSB0Zi5kYXRhLml0ZXJhdG9yRnJvbUZ1bmN0aW9uKGZ1bmMpO1xuICogY29uc3QgZHMgPSB0Zi5kYXRhLmRhdGFzZXRGcm9tSXRlcmF0b3JGbihpdGVyKTtcbiAqIGF3YWl0IGRzLmZvckVhY2hBc3luYyhlID0+IGNvbnNvbGUubG9nKGUpKTtcbiAqIGBgYFxuICovXG5leHBvcnQgZnVuY3Rpb24gZGF0YXNldEZyb21JdGVyYXRvckZuPFQgZXh0ZW5kcyB0Zi5UZW5zb3JDb250YWluZXI+KFxuICAgIGl0ZXJhdG9yRm46ICgpID0+IFByb21pc2U8TGF6eUl0ZXJhdG9yPFQ+PixcbiAgICBzaXplOiBudW1iZXIgPSBudWxsKTogRGF0YXNldDxUPiB7XG4gIHJldHVybiBuZXcgY2xhc3MgZXh0ZW5kcyBEYXRhc2V0PFQ+IHtcbiAgICBzaXplID0gc2l6ZTtcblxuICAgIC8qXG4gICAgICogUHJvdmlkZSBhIG5ldyBzdHJlYW0gb2YgZWxlbWVudHMuICBOb3RlIHRoaXMgd2lsbCBhbHNvIHN0YXJ0IG5ldyBzdHJlYW1zXG4gICAgICogZnJvbSBhbnkgdW5kZXJseWluZyBgRGF0YXNldGBzLlxuICAgICAqL1xuICAgIGFzeW5jIGl0ZXJhdG9yKCk6IFByb21pc2U8TGF6eUl0ZXJhdG9yPFQ+PiB7XG4gICAgICByZXR1cm4gaXRlcmF0b3JGbigpO1xuICAgIH1cbiAgfVxuICAoKTtcbn1cblxuLyoqXG4gKiBDcmVhdGUgYSBgRGF0YXNldGAgZnJvbSBhbiBhcnJheSBvZiBlbGVtZW50cy5cbiAqXG4gKiBDcmVhdGUgYSBEYXRhc2V0IGZyb20gYW4gYXJyYXkgb2Ygb2JqZWN0czpcbiAqIGBgYGpzXG4gKiBjb25zdCBhID0gdGYuZGF0YS5hcnJheShbeydpdGVtJzogMX0sIHsnaXRlbSc6IDJ9LCB7J2l0ZW0nOiAzfV0pO1xuICogYXdhaXQgYS5mb3JFYWNoQXN5bmMoZSA9PiBjb25zb2xlLmxvZyhlKSk7XG4gKiBgYGBcbiAqXG4gKiBDcmVhdGUgYSBEYXRhc2V0IGZyb20gYW4gYXJyYXkgb2YgbnVtYmVyczpcbiAqIGBgYGpzXG4gKiBjb25zdCBhID0gdGYuZGF0YS5hcnJheShbNCwgNSwgNl0pO1xuICogYXdhaXQgYS5mb3JFYWNoQXN5bmMoZSA9PiBjb25zb2xlLmxvZyhlKSk7XG4gKiBgYGBcbiAqIEBwYXJhbSBpdGVtcyBBbiBhcnJheSBvZiBlbGVtZW50cyB0aGF0IHdpbGwgYmUgcGFyc2VkIGFzIGl0ZW1zIGluIGEgZGF0YXNldC5cbiAqXG4gKiBAZG9jIHtoZWFkaW5nOiAnRGF0YScsIHN1YmhlYWRpbmc6ICdDcmVhdGlvbicsIG5hbWVzcGFjZTogJ2RhdGEnfVxuICovXG5leHBvcnQgZnVuY3Rpb24gYXJyYXk8VCBleHRlbmRzIHRmLlRlbnNvckNvbnRhaW5lcj4oaXRlbXM6IFRbXSk6IERhdGFzZXQ8VD4ge1xuICByZXR1cm4gZGF0YXNldEZyb21JdGVyYXRvckZuKFxuICAgICAgYXN5bmMgKCkgPT4gaXRlcmF0b3JGcm9tSXRlbXMoaXRlbXMpLCBpdGVtcy5sZW5ndGgpO1xufVxuXG4vKipcbiAqIENyZWF0ZSBhIGBEYXRhc2V0YCBieSB6aXBwaW5nIHRvZ2V0aGVyIGFuIGFycmF5LCBkaWN0LCBvciBuZXN0ZWRcbiAqIHN0cnVjdHVyZSBvZiBgRGF0YXNldGBzIChhbmQgcGVyaGFwcyBhZGRpdGlvbmFsIGNvbnN0YW50cykuXG4gKiBUaGUgdW5kZXJseWluZyBkYXRhc2V0cyBtdXN0IHByb3ZpZGUgZWxlbWVudHMgaW4gYSBjb25zaXN0ZW50IG9yZGVyIHN1Y2ggdGhhdFxuICogdGhleSBjb3JyZXNwb25kLlxuICpcbiAqIFRoZSBudW1iZXIgb2YgZWxlbWVudHMgaW4gdGhlIHJlc3VsdGluZyBkYXRhc2V0IGlzIHRoZSBzYW1lIGFzIHRoZSBzaXplIG9mXG4gKiB0aGUgc21hbGxlc3QgZGF0YXNldCBpbiBkYXRhc2V0cy5cbiAqXG4gKiBUaGUgbmVzdGVkIHN0cnVjdHVyZSBvZiB0aGUgYGRhdGFzZXRzYCBhcmd1bWVudCBkZXRlcm1pbmVzIHRoZVxuICogc3RydWN0dXJlIG9mIGVsZW1lbnRzIGluIHRoZSByZXN1bHRpbmcgaXRlcmF0b3IuXG4gKlxuICogTm90ZSB0aGlzIG1lYW5zIHRoYXQsIGdpdmVuIGFuIGFycmF5IG9mIHR3byBkYXRhc2V0cyB0aGF0IHByb2R1Y2UgZGljdFxuICogZWxlbWVudHMsIHRoZSByZXN1bHQgaXMgYSBkYXRhc2V0IHRoYXQgcHJvZHVjZXMgZWxlbWVudHMgdGhhdCBhcmUgYXJyYXlzXG4gKiBvZiB0d28gZGljdHM6XG4gKlxuICogWmlwIGFuIGFycmF5IG9mIGRhdGFzZXRzOlxuICogYGBganNcbiAqIGNvbnNvbGUubG9nKCdaaXAgdHdvIGRhdGFzZXRzIG9mIG9iamVjdHM6Jyk7XG4gKiBjb25zdCBkczEgPSB0Zi5kYXRhLmFycmF5KFt7YTogMX0sIHthOiAyfSwge2E6IDN9XSk7XG4gKiBjb25zdCBkczIgPSB0Zi5kYXRhLmFycmF5KFt7YjogNH0sIHtiOiA1fSwge2I6IDZ9XSk7XG4gKiBjb25zdCBkczMgPSB0Zi5kYXRhLnppcChbZHMxLCBkczJdKTtcbiAqIGF3YWl0IGRzMy5mb3JFYWNoQXN5bmMoZSA9PiBjb25zb2xlLmxvZyhKU09OLnN0cmluZ2lmeShlKSkpO1xuICpcbiAqIC8vIElmIHRoZSBnb2FsIGlzIHRvIG1lcmdlIHRoZSBkaWN0cyBpbiBvcmRlciB0byBwcm9kdWNlIGVsZW1lbnRzIGxpa2VcbiAqIC8vIHthOiAuLi4sIGI6IC4uLn0sIHRoaXMgcmVxdWlyZXMgYSBzZWNvbmQgc3RlcCBzdWNoIGFzOlxuICogY29uc29sZS5sb2coJ01lcmdlIHRoZSBvYmplY3RzOicpO1xuICogY29uc3QgZHM0ID0gZHMzLm1hcCh4ID0+IHtyZXR1cm4ge2E6IHhbMF0uYSwgYjogeFsxXS5ifX0pO1xuICogYXdhaXQgZHM0LmZvckVhY2hBc3luYyhlID0+IGNvbnNvbGUubG9nKGUpKTtcbiAqIGBgYFxuICpcbiAqIFppcCBhIGRpY3Qgb2YgZGF0YXNldHM6XG4gKiBgYGBqc1xuICogY29uc3QgYSA9IHRmLmRhdGEuYXJyYXkoW3thOiAxfSwge2E6IDJ9LCB7YTogM31dKTtcbiAqIGNvbnN0IGIgPSB0Zi5kYXRhLmFycmF5KFt7YjogNH0sIHtiOiA1fSwge2I6IDZ9XSk7XG4gKiBjb25zdCBjID0gdGYuZGF0YS56aXAoe2M6IGEsIGQ6IGJ9KTtcbiAqIGF3YWl0IGMuZm9yRWFjaEFzeW5jKGUgPT4gY29uc29sZS5sb2coSlNPTi5zdHJpbmdpZnkoZSkpKTtcbiAqIGBgYFxuICpcbiAqIEBkb2Mge2hlYWRpbmc6ICdEYXRhJywgc3ViaGVhZGluZzogJ09wZXJhdGlvbnMnLCBuYW1lc3BhY2U6ICdkYXRhJ31cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHppcDxPIGV4dGVuZHMgdGYuVGVuc29yQ29udGFpbmVyPihkYXRhc2V0czogRGF0YXNldENvbnRhaW5lcik6XG4gICAgRGF0YXNldDxPPiB7XG4gIC8vIG1hbnVhbGx5IHR5cGUtY2hlY2sgdGhlIGFyZ3VtZW50IGZvciBKUyB1c2Vyc1xuICBpZiAoIWlzSXRlcmFibGUoZGF0YXNldHMpKSB7XG4gICAgdGhyb3cgbmV3IEVycm9yKCdUaGUgYXJndW1lbnQgdG8gemlwKCkgbXVzdCBiZSBhbiBvYmplY3Qgb3IgYXJyYXkuJyk7XG4gIH1cbiAgbGV0IHNpemU7XG4gIGlmIChBcnJheS5pc0FycmF5KGRhdGFzZXRzKSkge1xuICAgIGZvciAobGV0IGkgPSAwOyBpIDwgZGF0YXNldHMubGVuZ3RoOyBpKyspIHtcbiAgICAgIHNpemUgPSBzaXplID09IG51bGwgPyAoZGF0YXNldHNbaV0gYXMgRGF0YXNldDxPPikuc2l6ZSA6XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgTWF0aC5taW4oc2l6ZSwgKGRhdGFzZXRzW2ldIGFzIERhdGFzZXQ8Tz4pLnNpemUpO1xuICAgIH1cbiAgfSBlbHNlIGlmIChkYXRhc2V0cyBpbnN0YW5jZW9mIE9iamVjdCkge1xuICAgIGZvciAoY29uc3QgZHMgaW4gZGF0YXNldHMpIHtcbiAgICAgIHNpemUgPSBzaXplID09IG51bGwgPyAoZGF0YXNldHNbZHNdIGFzIERhdGFzZXQ8Tz4pLnNpemUgOlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIE1hdGgubWluKHNpemUsIChkYXRhc2V0c1tkc10gYXMgRGF0YXNldDxPPikuc2l6ZSk7XG4gICAgfVxuICB9XG4gIHJldHVybiBkYXRhc2V0RnJvbUl0ZXJhdG9yRm48Tz4oYXN5bmMgKCkgPT4ge1xuICAgIGNvbnN0IHN0cmVhbXMgPSBhd2FpdCBkZWVwTWFwQW5kQXdhaXRBbGwoZGF0YXNldHMsIGQgPT4ge1xuICAgICAgaWYgKGQgaW5zdGFuY2VvZiBEYXRhc2V0KSB7XG4gICAgICAgIHJldHVybiB7dmFsdWU6IGQuaXRlcmF0b3IoKSwgcmVjdXJzZTogZmFsc2V9O1xuICAgICAgfSBlbHNlIGlmIChpc0l0ZXJhYmxlKGQpKSB7XG4gICAgICAgIHJldHVybiB7dmFsdWU6IG51bGwsIHJlY3Vyc2U6IHRydWV9O1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKFxuICAgICAgICAgICAgJ0xlYXZlcyBvZiB0aGUgc3RydWN0dXJlIHBhc3NlZCB0byB6aXAoKSBtdXN0IGJlIERhdGFzZXRzLCAnICtcbiAgICAgICAgICAgICdub3QgcHJpbWl0aXZlcy4nKTtcbiAgICAgIH1cbiAgICB9KTtcbiAgICByZXR1cm4gaXRlcmF0b3JGcm9tWmlwcGVkPE8+KHN0cmVhbXMsIFppcE1pc21hdGNoTW9kZS5TSE9SVEVTVCk7XG4gIH0sIHNpemUpO1xufVxuXG4vKipcbiAqIEEgemlwIGZ1bmN0aW9uIGZvciB1c2Ugd2l0aCBkZWVwWmlwLCBwYXNzZWQgdmlhIHRoZSBjb2x1bW5NYWpvckJhdGNoIGNhbGwuXG4gKlxuICogQWNjZXB0cyBhbiBhcnJheSBvZiBpZGVudGljYWxseS1zdHJ1Y3R1cmVkIG5lc3RlZCBlbGVtZW50cyBhbmQgZWl0aGVyIGJhdGNoZXNcbiAqIHRoZW0gKGlmIHRoZXkgYXJlIHByaW1pdGl2ZXMsIG51bWVyaWMgYXJyYXlzLCBvciBUZW5zb3JzKSBvciByZXF1ZXN0c1xuICogcmVjdXJzaW9uIChpZiBub3QpLlxuICovXG4vLyB0c2xpbnQ6ZGlzYWJsZS1uZXh0LWxpbmU6bm8tYW55XG5mdW5jdGlvbiBkZWVwQmF0Y2hDb25jYXQocm93czogYW55W10pOiBEZWVwTWFwUmVzdWx0IHtcbiAgaWYgKHJvd3MgPT09IG51bGwpIHtcbiAgICByZXR1cm4gbnVsbDtcbiAgfVxuXG4gIC8vIHVzZSB0aGUgZmlyc3QgaXRlbSB0byBkZWNpZGUgd2hldGhlciB0byByZWN1cnNlIG9yIGJhdGNoIGhlcmUuXG4gIGNvbnN0IGV4YW1wbGVSb3cgPSByb3dzWzBdO1xuXG4gIGlmIChjYW5UZW5zb3JpZnkoZXhhbXBsZVJvdykpIHtcbiAgICAvLyByb3dzIGlzIGFuIGFycmF5IG9mIHByaW1pdGl2ZXMsIFRlbnNvcnMsIG9yIGFycmF5cy4gIEJhdGNoIHRoZW0uXG4gICAgY29uc3QgdmFsdWUgPSBiYXRjaENvbmNhdChyb3dzKTtcbiAgICByZXR1cm4ge3ZhbHVlLCByZWN1cnNlOiBmYWxzZX07XG4gIH1cblxuICAvLyB0aGUgZXhhbXBsZSByb3cgaXMgYW4gb2JqZWN0LCBzbyByZWN1cnNlIGludG8gaXQuXG4gIHJldHVybiB7dmFsdWU6IG51bGwsIHJlY3Vyc2U6IHRydWV9O1xufVxuXG4vKipcbiAqIEFzc2VtYmxlcyBhIGxpc3Qgb2Ygc2FtZS1zaGFwZWQgbnVtYmVycywgbnVtYmVyIGFycmF5cywgb3IgVGVuc29yc1xuICogaW50byBhIHNpbmdsZSBuZXcgVGVuc29yIHdoZXJlIGF4aXMgMCBpcyB0aGUgYmF0Y2ggZGltZW5zaW9uLlxuICovXG5mdW5jdGlvbiBiYXRjaENvbmNhdDxUIGV4dGVuZHMoVGVuc29yTGlrZSB8IHRmLlRlbnNvcik+KGFycmF5czogVFtdKTpcbiAgICB0Zi5UZW5zb3Ige1xuICBpZiAoYXJyYXlzLmxlbmd0aCA9PT0gMCkge1xuICAgIC8vIFdlIGNhbid0IHJldHVybiBhbiBlbXB0eSBUZW5zb3IgYmVjYXVzZSB3ZSBkb24ndCBrbm93IHRoZSBlbGVtZW50IHNoYXBlLlxuICAgIHRocm93IG5ldyBFcnJvcignQ2FuXFwndCBtYWtlIGEgYmF0Y2ggb2YgemVybyBlbGVtZW50cy4nKTtcbiAgfVxuXG4gIGlmIChhcnJheXNbMF0gaW5zdGFuY2VvZiB0Zi5UZW5zb3IpIHtcbiAgICAvLyBJbnB1dCBpcyBhbiBhcnJheSBvZiBUZW5zb3JzXG4gICAgcmV0dXJuIHRmLnN0YWNrKGFycmF5cyBhcyB0Zi5UZW5zb3JbXSk7XG4gIH0gZWxzZSB7XG4gICAgLy8gSW5wdXQgaXMgYSBwb3NzaWJseS1uZXN0ZWQgYXJyYXkgb2YgbnVtYmVycy5cbiAgICByZXR1cm4gdGYudGVuc29yKGFycmF5cyBhcyBUZW5zb3JMaWtlKTtcbiAgfVxufVxuIl19","/**\n * @license\n * Copyright 2018 Google LLC. All Rights Reserved.\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n *\n * =============================================================================\n */\nimport { Dataset } from '../dataset';\n/**\n * Represents a potentially large collection of text lines.\n *\n * The results are not batched.\n */\nexport class TextLineDataset extends Dataset {\n /**\n * Create a `TextLineDataset`.\n *\n * @param input A `DataSource` providing a chunked, UTF8-encoded byte stream.\n */\n constructor(input) {\n super();\n this.input = input;\n }\n async iterator() {\n const inputIterator = await this.input.iterator();\n const utf8Iterator = inputIterator.decodeUTF8();\n const lineIterator = utf8Iterator.split('\\n').map(line => {\n // Windows/DOS format text file has extra line breaker at the end of line.\n if (line.endsWith('\\r')) {\n line = line.slice(0, -1);\n }\n return line;\n });\n return lineIterator;\n }\n}\n//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidGV4dF9saW5lX2RhdGFzZXQuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi8uLi90ZmpzLWRhdGEvc3JjL2RhdGFzZXRzL3RleHRfbGluZV9kYXRhc2V0LnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBOzs7Ozs7Ozs7Ozs7Ozs7O0dBZ0JHO0FBRUgsT0FBTyxFQUFDLE9BQU8sRUFBQyxNQUFNLFlBQVksQ0FBQztBQUluQzs7OztHQUlHO0FBQ0gsTUFBTSxPQUFPLGVBQWdCLFNBQVEsT0FBZTtJQUNsRDs7OztPQUlHO0lBQ0gsWUFBK0IsS0FBaUI7UUFDOUMsS0FBSyxFQUFFLENBQUM7UUFEcUIsVUFBSyxHQUFMLEtBQUssQ0FBWTtJQUVoRCxDQUFDO0lBRUQsS0FBSyxDQUFDLFFBQVE7UUFDWixNQUFNLGFBQWEsR0FBRyxNQUFNLElBQUksQ0FBQyxLQUFLLENBQUMsUUFBUSxFQUFFLENBQUM7UUFDbEQsTUFBTSxZQUFZLEdBQUcsYUFBYSxDQUFDLFVBQVUsRUFBRSxDQUFDO1FBQ2hELE1BQU0sWUFBWSxHQUFHLFlBQVksQ0FBQyxLQUFLLENBQUMsSUFBSSxDQUFDLENBQUMsR0FBRyxDQUFDLElBQUksQ0FBQyxFQUFFO1lBQ3ZELDBFQUEwRTtZQUMxRSxJQUFJLElBQUksQ0FBQyxRQUFRLENBQUMsSUFBSSxDQUFDLEVBQUU7Z0JBQ3ZCLElBQUksR0FBRyxJQUFJLENBQUMsS0FBSyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxDQUFDO2FBQzFCO1lBQ0QsT0FBTyxJQUFJLENBQUM7UUFDZCxDQUFDLENBQUMsQ0FBQztRQUNILE9BQU8sWUFBWSxDQUFDO0lBQ3RCLENBQUM7Q0FDRiIsInNvdXJjZXNDb250ZW50IjpbIi8qKlxuICogQGxpY2Vuc2VcbiAqIENvcHlyaWdodCAyMDE4IEdvb2dsZSBMTEMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuXG4gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgXCJMaWNlbnNlXCIpO1xuICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLlxuICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0XG4gKlxuICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wXG4gKlxuICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZVxuICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gXCJBUyBJU1wiIEJBU0lTLFxuICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuXG4gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kXG4gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS5cbiAqXG4gKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuICovXG5cbmltcG9ydCB7RGF0YXNldH0gZnJvbSAnLi4vZGF0YXNldCc7XG5pbXBvcnQge0RhdGFTb3VyY2V9IGZyb20gJy4uL2RhdGFzb3VyY2UnO1xuaW1wb3J0IHtMYXp5SXRlcmF0b3J9IGZyb20gJy4uL2l0ZXJhdG9ycy9sYXp5X2l0ZXJhdG9yJztcblxuLyoqXG4gKiBSZXByZXNlbnRzIGEgcG90ZW50aWFsbHkgbGFyZ2UgY29sbGVjdGlvbiBvZiB0ZXh0IGxpbmVzLlxuICpcbiAqIFRoZSByZXN1bHRzIGFyZSBub3QgYmF0Y2hlZC5cbiAqL1xuZXhwb3J0IGNsYXNzIFRleHRMaW5lRGF0YXNldCBleHRlbmRzIERhdGFzZXQ8c3RyaW5nPiB7XG4gIC8qKlxuICAgKiBDcmVhdGUgYSBgVGV4dExpbmVEYXRhc2V0YC5cbiAgICpcbiAgICogQHBhcmFtIGlucHV0IEEgYERhdGFTb3VyY2VgIHByb3ZpZGluZyBhIGNodW5rZWQsIFVURjgtZW5jb2RlZCBieXRlIHN0cmVhbS5cbiAgICovXG4gIGNvbnN0cnVjdG9yKHByb3RlY3RlZCByZWFkb25seSBpbnB1dDogRGF0YVNvdXJjZSkge1xuICAgIHN1cGVyKCk7XG4gIH1cblxuICBhc3luYyBpdGVyYXRvcigpOiBQcm9taXNlPExhenlJdGVyYXRvcjxzdHJpbmc+PiB7XG4gICAgY29uc3QgaW5wdXRJdGVyYXRvciA9IGF3YWl0IHRoaXMuaW5wdXQuaXRlcmF0b3IoKTtcbiAgICBjb25zdCB1dGY4SXRlcmF0b3IgPSBpbnB1dEl0ZXJhdG9yLmRlY29kZVVURjgoKTtcbiAgICBjb25zdCBsaW5lSXRlcmF0b3IgPSB1dGY4SXRlcmF0b3Iuc3BsaXQoJ1xcbicpLm1hcChsaW5lID0+IHtcbiAgICAgIC8vIFdpbmRvd3MvRE9TIGZvcm1hdCB0ZXh0IGZpbGUgaGFzIGV4dHJhIGxpbmUgYnJlYWtlciBhdCB0aGUgZW5kIG9mIGxpbmUuXG4gICAgICBpZiAobGluZS5lbmRzV2l0aCgnXFxyJykpIHtcbiAgICAgICAgbGluZSA9IGxpbmUuc2xpY2UoMCwgLTEpO1xuICAgICAgfVxuICAgICAgcmV0dXJuIGxpbmU7XG4gICAgfSk7XG4gICAgcmV0dXJuIGxpbmVJdGVyYXRvcjtcbiAgfVxufVxuIl19","/**\n * @license\n * Copyright 2018 Google LLC. All Rights Reserved.\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n *\n * =============================================================================\n */\nimport { util } from '@tensorflow/tfjs-core';\nimport { Dataset } from '../dataset';\nimport { TextLineDataset } from './text_line_dataset';\nconst CODE_QUOTE = '\"';\nconst STATE_OUT = Symbol('out');\nconst STATE_FIELD = Symbol('field');\nconst STATE_QUOTE = Symbol('quote');\nconst STATE_QUOTE_AFTER_QUOTE = Symbol('quoteafterquote');\nconst STATE_WITHIN_QUOTE_IN_QUOTE = Symbol('quoteinquote');\n/**\n * Represents a potentially large collection of delimited text records.\n *\n * The produced `TensorContainer`s each contain one key-value pair for\n * every column of the table. When a field is empty in the incoming data, the\n * resulting value is `undefined`, or throw error if it is required. Values\n * that can be parsed as numbers are emitted as type `number`, other values\n * are parsed as `string`.\n *\n * The results are not batched.\n *\n * @doc {heading: 'Data', subheading: 'Classes', namespace: 'data'}\n */\nexport class CSVDataset extends Dataset {\n /**\n * Create a `CSVDataset`.\n *\n * @param input A `DataSource` providing a chunked, UTF8-encoded byte stream.\n * @param csvConfig (Optional) A CSVConfig object that contains configurations\n * of reading and decoding from CSV file(s).\n *\n * hasHeader: (Optional) A boolean value that indicates whether the first\n * row of provided CSV file is a header line with column names, and should\n * not be included in the data. Defaults to `true`.\n *\n * columnNames: (Optional) A list of strings that corresponds to\n * the CSV column names, in order. If provided, it ignores the column\n * names inferred from the header row. If not provided, infers the column\n * names from the first row of the records. If hasHeader is false and\n * columnNames is not provided, this method throws an error.\n *\n * columnConfigs: (Optional) A dictionary whose key is column names, value\n * is an object stating if this column is required, column's data type,\n * default value, and if this column is label. If provided, keys must\n * correspond to names provided in columnNames or inferred from the file\n * header lines. If isLabel is true any column, returns an array of two\n * items: the first item is a dict of features key/value pairs, the second\n * item is a dict of labels key/value pairs. If no feature is marked as\n * label, returns a dict of features only.\n *\n * configuredColumnsOnly (Optional) If true, only columns provided in\n * columnConfigs will be parsed and provided during iteration.\n *\n * delimiter (Optional) The string used to parse each line of the input\n * file. Defaults to `,`.\n */\n constructor(input, csvConfig) {\n super();\n this.input = input;\n this.hasHeader = true;\n this.fullColumnNames = null;\n this.columnNamesValidated = false;\n this.columnConfigs = null;\n this.configuredColumnsOnly = false;\n this.delimiter = ',';\n this.delimWhitespace = false;\n this.base = new TextLineDataset(input);\n if (!csvConfig) {\n csvConfig = {};\n }\n this.hasHeader = csvConfig.hasHeader === false ? false : true;\n this.fullColumnNames = csvConfig.columnNames;\n this.columnConfigs = csvConfig.columnConfigs;\n this.configuredColumnsOnly = csvConfig.configuredColumnsOnly;\n if (csvConfig.delimWhitespace) {\n util.assert(csvConfig.delimiter == null, () => 'Delimiter should not be provided when delimWhitespace is true.');\n this.delimWhitespace = true;\n this.delimiter = ' ';\n }\n else {\n this.delimiter = csvConfig.delimiter ? csvConfig.delimiter : ',';\n }\n }\n /**\n * Returns column names of the csv dataset. If `configuredColumnsOnly` is\n * true, return column names in `columnConfigs`. If `configuredColumnsOnly` is\n * false and `columnNames` is provided, `columnNames`. If\n * `configuredColumnsOnly` is false and `columnNames` is not provided, return\n * all column names parsed from the csv file. For example usage please go to\n * `tf.data.csv`.\n *\n * @doc {heading: 'Data', subheading: 'Classes'}\n */\n async columnNames() {\n if (!this.columnNamesValidated) {\n await this.setColumnNames();\n }\n return this.configuredColumnsOnly ? Object.keys(this.columnConfigs) :\n this.fullColumnNames;\n }\n /* 1) If `columnNames` is provided as string[], use this string[] as output\n * keys in corresponding order. The length must match the number of inferred\n * columns if `hasHeader` is true .\n * 2) If `columnNames` is not provided, parse header line as `columnNames` if\n * hasHeader is true. If `hasHeader` is false, throw an error.\n * 3) If `columnConfigs` is provided, all the keys in `columnConfigs` must\n * exist in parsed `columnNames`.\n */\n async setColumnNames() {\n const columnNamesFromFile = await this.maybeReadHeaderLine();\n if (!this.fullColumnNames && !columnNamesFromFile) {\n // Throw an error if columnNames is not provided and no header line.\n throw new Error('Column names must be provided if there is no header line.');\n }\n else if (this.fullColumnNames && columnNamesFromFile) {\n // Check provided columnNames match header line.\n util.assert(columnNamesFromFile.length === this.fullColumnNames.length, () => 'The length of provided columnNames (' +\n this.fullColumnNames.length.toString() +\n ') does not match the length of the header line read from ' +\n 'file (' + columnNamesFromFile.length.toString() + ').');\n }\n if (!this.fullColumnNames) {\n this.fullColumnNames = columnNamesFromFile;\n }\n // Check if there are duplicate column names.\n const counts = this.fullColumnNames.reduce((countAcc, name) => {\n countAcc[name] = (countAcc[name] + 1) || 1;\n return countAcc;\n }, {});\n const duplicateNames = Object.keys(counts).filter((name) => (counts[name] > 1));\n util.assert(duplicateNames.length === 0, () => 'Duplicate column names found: ' + duplicateNames.toString());\n // Check if keys in columnConfigs match columnNames.\n if (this.columnConfigs) {\n for (const key of Object.keys(this.columnConfigs)) {\n const index = this.fullColumnNames.indexOf(key);\n if (index === -1) {\n throw new Error('The key \"' + key +\n '\" provided in columnConfigs does not match any of the column ' +\n 'names (' + this.fullColumnNames.toString() + ').');\n }\n }\n }\n this.columnNamesValidated = true;\n }\n async maybeReadHeaderLine() {\n if (this.hasHeader) {\n const iter = await this.base.iterator();\n const firstElement = await iter.next();\n if (firstElement.done) {\n throw new Error('No data was found for CSV parsing.');\n }\n const firstLine = firstElement.value;\n const headers = this.parseRow(firstLine, false);\n return headers;\n }\n else {\n return null;\n }\n }\n async iterator() {\n if (!this.columnNamesValidated) {\n await this.setColumnNames();\n }\n let lines = await this.base.iterator();\n if (this.hasHeader) {\n // We previously read the first line to get the columnNames.\n // Now that we're providing data, skip it.\n lines = lines.skip(1);\n }\n return lines.map(x => this.makeDataElement(x));\n }\n makeDataElement(line) {\n const values = this.parseRow(line);\n const features = {};\n const labels = {};\n for (let i = 0; i < this.fullColumnNames.length; i++) {\n const key = this.fullColumnNames[i];\n const config = this.columnConfigs ? this.columnConfigs[key] : null;\n if (this.configuredColumnsOnly && !config) {\n // This column is not selected.\n continue;\n }\n else {\n const value = values[i];\n let parsedValue = null;\n if (value === '') {\n // If default value is provided, use it. If default value is not\n // provided, set as undefined.\n if (config && config.default !== undefined) {\n parsedValue = config.default;\n }\n else if (config && (config.required || config.isLabel)) {\n throw new Error(`Required column ${key} is empty in this line: ${line}`);\n }\n else {\n parsedValue = undefined;\n }\n }\n else {\n // A value is present, so parse it based on type\n const valueAsNum = Number(value);\n if (isNaN(valueAsNum)) {\n // The value is a string and this column is declared as boolean\n // in config, parse it as boolean.\n if (config && config.dtype === 'bool') {\n parsedValue = this.getBoolean(value);\n }\n else {\n // Set value as string\n parsedValue = value;\n }\n }\n else if (!config || !config.dtype) {\n // If this value is a number and no type config is provided, return\n // it as number.\n parsedValue = valueAsNum;\n }\n else {\n // If this value is a number and data type is provided, parse it\n // according to provided data type.\n switch (config.dtype) {\n case 'float32':\n parsedValue = valueAsNum;\n break;\n case 'int32':\n parsedValue = Math.floor(valueAsNum);\n break;\n case 'bool':\n parsedValue = this.getBoolean(value);\n break;\n default:\n parsedValue = valueAsNum;\n }\n }\n }\n // Check if this column is label.\n (config && config.isLabel) ? labels[key] = parsedValue :\n features[key] = parsedValue;\n }\n }\n // If label exists, return an object of features and labels as {xs:features,\n // ys:labels}, otherwise return features only.\n if (Object.keys(labels).length === 0) {\n return features;\n }\n else {\n return { xs: features, ys: labels };\n }\n }\n getBoolean(value) {\n if (value === '1' || value.toLowerCase() === 'true') {\n return 1;\n }\n else {\n return 0;\n }\n }\n // adapted from https://beta.observablehq.com/@mbostock/streaming-csv\n parseRow(line, validateElementCount = true) {\n const result = [];\n let readOffset = 0;\n const readLength = line.length;\n let currentState = STATE_OUT;\n // Goes through the line to parse quote.\n for (let i = 0; i < readLength; i++) {\n switch (currentState) {\n // Before enter a new field\n case STATE_OUT:\n switch (line.charAt(i)) {\n // Enter a quoted field\n case CODE_QUOTE:\n readOffset = i + 1;\n currentState = STATE_QUOTE;\n break;\n // Read an empty field\n case this.delimiter:\n readOffset = i + 1;\n // If delimiter is white space and configured to collapse\n // multiple white spaces, ignore this white space.\n if (this.delimiter === ' ' && this.delimWhitespace) {\n break;\n }\n result.push('');\n currentState = STATE_OUT;\n break;\n // Enter an unquoted field\n default:\n currentState = STATE_FIELD;\n readOffset = i;\n break;\n }\n break;\n // In an unquoted field\n case STATE_FIELD:\n switch (line.charAt(i)) {\n // Exit an unquoted field, add it to result\n case this.delimiter:\n result.push(line.substring(readOffset, i));\n currentState = STATE_OUT;\n readOffset = i + 1;\n break;\n default:\n }\n break;\n // In a quoted field\n case STATE_QUOTE:\n switch (line.charAt(i)) {\n // Read a quote after a quote\n case CODE_QUOTE:\n currentState = STATE_QUOTE_AFTER_QUOTE;\n break;\n default:\n }\n break;\n // This state means it's right after a second quote in a field\n case STATE_QUOTE_AFTER_QUOTE:\n switch (line.charAt(i)) {\n // Finished a quoted field\n case this.delimiter:\n result.push(line.substring(readOffset, i - 1));\n currentState = STATE_OUT;\n readOffset = i + 1;\n break;\n // Finished a quoted part in a quoted field\n case CODE_QUOTE:\n currentState = STATE_QUOTE;\n break;\n // In a quoted part in a quoted field\n default:\n currentState = STATE_WITHIN_QUOTE_IN_QUOTE;\n break;\n }\n break;\n case STATE_WITHIN_QUOTE_IN_QUOTE:\n switch (line.charAt(i)) {\n // Exit a quoted part in a quoted field\n case CODE_QUOTE:\n currentState = STATE_QUOTE;\n break;\n default:\n }\n break;\n default:\n }\n }\n // Adds last item based on if it is quoted.\n if (currentState === STATE_QUOTE_AFTER_QUOTE) {\n result.push(line.substring(readOffset, readLength - 1));\n }\n else {\n result.push(line.substring(readOffset));\n }\n // Check if each row has the same number of elements as column names.\n if (validateElementCount && result.length !== this.fullColumnNames.length) {\n throw new Error(`Invalid row in csv file. Should have ${this.fullColumnNames.length} elements in a row, but got ${result}`);\n }\n return result;\n }\n}\n// TODO(soergel): add more basic datasets for parity with tf.data\n// tf.data.FixedLengthRecordDataset()\n// tf.data.TFRecordDataset()\n//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY3N2X2RhdGFzZXQuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi8uLi90ZmpzLWRhdGEvc3JjL2RhdGFzZXRzL2Nzdl9kYXRhc2V0LnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBOzs7Ozs7Ozs7Ozs7Ozs7O0dBZ0JHO0FBRUgsT0FBTyxFQUFrQixJQUFJLEVBQUMsTUFBTSx1QkFBdUIsQ0FBQztBQUM1RCxPQUFPLEVBQUMsT0FBTyxFQUFDLE1BQU0sWUFBWSxDQUFDO0FBSW5DLE9BQU8sRUFBQyxlQUFlLEVBQUMsTUFBTSxxQkFBcUIsQ0FBQztBQUVwRCxNQUFNLFVBQVUsR0FBRyxHQUFHLENBQUM7QUFDdkIsTUFBTSxTQUFTLEdBQUcsTUFBTSxDQUFDLEtBQUssQ0FBQyxDQUFDO0FBQ2hDLE1BQU0sV0FBVyxHQUFHLE1BQU0sQ0FBQyxPQUFPLENBQUMsQ0FBQztBQUNwQyxNQUFNLFdBQVcsR0FBRyxNQUFNLENBQUMsT0FBTyxDQUFDLENBQUM7QUFDcEMsTUFBTSx1QkFBdUIsR0FBRyxNQUFNLENBQUMsaUJBQWlCLENBQUMsQ0FBQztBQUMxRCxNQUFNLDJCQUEyQixHQUFHLE1BQU0sQ0FBQyxjQUFjLENBQUMsQ0FBQztBQUUzRDs7Ozs7Ozs7Ozs7O0dBWUc7QUFDSCxNQUFNLE9BQU8sVUFBVyxTQUFRLE9BQXdCO0lBZ0d0RDs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7OztPQStCRztJQUNILFlBQStCLEtBQWlCLEVBQUUsU0FBcUI7UUFDckUsS0FBSyxFQUFFLENBQUM7UUFEcUIsVUFBSyxHQUFMLEtBQUssQ0FBWTtRQTlIeEMsY0FBUyxHQUFHLElBQUksQ0FBQztRQUNqQixvQkFBZSxHQUFhLElBQUksQ0FBQztRQUNqQyx5QkFBb0IsR0FBRyxLQUFLLENBQUM7UUFDN0Isa0JBQWEsR0FBa0MsSUFBSSxDQUFDO1FBQ3BELDBCQUFxQixHQUFHLEtBQUssQ0FBQztRQUM5QixjQUFTLEdBQUcsR0FBRyxDQUFD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VUFBVTs0QkFDYixZQUFZLEdBQUcsV0FBVyxDQUFDOzRCQUMzQixNQUFNO3dCQUNSLFFBQVE7cUJBQ1Q7b0JBQ0QsTUFBTTtnQkFDUixRQUFRO2FBQ1Q7U0FDRjtRQUNELDJDQUEyQztRQUMzQyxJQUFJLFlBQVksS0FBSyx1QkFBdUIsRUFBRTtZQUM1QyxNQUFNLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxTQUFTLENBQUMsVUFBVSxFQUFFLFVBQVUsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDO1NBQ3pEO2FBQU07WUFDTCxNQUFNLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxTQUFTLENBQUMsVUFBVSxDQUFDLENBQUMsQ0FBQztTQUN6QztRQUNELHFFQUFxRTtRQUNyRSxJQUFJLG9CQUFvQixJQUFJLE1BQU0sQ0FBQyxNQUFNLEtBQUssSUFBSSxDQUFDLGVBQWUsQ0FBQyxNQUFNLEVBQUU7WUFDekUsTUFBTSxJQUFJLEtBQUssQ0FBQyx3Q0FDWixJQUFJLENBQUMsZUFBZSxDQUFDLE1BQU0sK0JBQStCLE1BQU0sRUFBRSxDQUFDLENBQUM7U0FDekU7UUFDRCxPQUFPLE1BQU0sQ0FBQztJQUNoQixDQUFDO0NBQ0Y7QUFFRCxpRUFBaUU7QUFDakUscUNBQXFDO0FBQ3JDLDRCQUE0QiIsInNvdXJjZXNDb250ZW50IjpbIi8qKlxuICogQGxpY2Vuc2VcbiAqIENvcHlyaWdodCAyMDE4IEdvb2dsZSBMTEMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuXG4gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgXCJMaWNlbnNlXCIpO1xuICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLlxuICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0XG4gKlxuICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wXG4gKlxuICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZVxuICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gXCJBUyBJU1wiIEJBU0lTLFxuICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuXG4gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kXG4gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS5cbiAqXG4gKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuICovXG5cbmltcG9ydCB7VGVuc29yQ29udGFpbmVyLCB1dGlsfSBmcm9tICdAdGVuc29yZmxvdy90ZmpzLWNvcmUnO1xuaW1wb3J0IHtEYXRhc2V0fSBmcm9tICcuLi9kYXRhc2V0JztcbmltcG9ydCB7RGF0YVNvdXJjZX0gZnJvbSAnLi4vZGF0YXNvdXJjZSc7XG5pbXBvcnQge0xhenlJdGVyYXRvcn0gZnJvbSAnLi4vaXRlcmF0b3JzL2xhenlfaXRlcmF0b3InO1xuaW1wb3J0IHtDb2x1bW5Db25maWcsIENTVkNvbmZpZ30gZnJvbSAnLi4vdHlwZXMnO1xuaW1wb3J0IHtUZXh0TGluZURhdGFzZXR9IGZyb20gJy4vdGV4dF9saW5lX2RhdGFzZXQnO1xuXG5jb25zdCBDT0RFX1FVT1RFID0gJ1wiJztcbmNvbnN0IFNUQVRFX09VVCA9IFN5bWJvbCgnb3V0Jyk7XG5jb25zdCBTVEFURV9GSUVMRCA9IFN5bWJvbCgnZmllbGQnKTtcbmNvbnN0IFNUQVRFX1FVT1RFID0gU3ltYm9sKCdxdW90ZScpO1xuY29uc3QgU1RBVEVfUVVPVEVfQUZURVJfUVVPVEUgPSBTeW1ib2woJ3F1b3RlYWZ0ZXJxdW90ZScpO1xuY29uc3QgU1RBVEVfV0lUSElOX1FVT1RFX0lOX1FVT1RFID0gU3ltYm9sKCdxdW90ZWlucXVvdGUnKTtcblxuLyoqXG4gKiBSZXByZXNlbnRzIGEgcG90ZW50aWFsbHkgbGFyZ2UgY29sbGVjdGlvbiBvZiBkZWxpbWl0ZWQgdGV4dCByZWNvcmRzLlxuICpcbiAqIFRoZSBwcm9kdWNlZCBgVGVuc29yQ29udGFpbmVyYHMgZWFjaCBjb250YWluIG9uZSBrZXktdmFsdWUgcGFpciBmb3JcbiAqIGV2ZXJ5IGNvbHVtbiBvZiB0aGUgdGFibGUuICBXaGVuIGEgZmllbGQgaXMgZW1wdHkgaW4gdGhlIGluY29taW5nIGRhdGEsIHRoZVxuICogcmVzdWx0aW5nIHZhbHVlIGlzIGB1bmRlZmluZWRgLCBvciB0aHJvdyBlcnJvciBpZiBpdCBpcyByZXF1aXJlZC4gIFZhbHVlc1xuICogdGhhdCBjYW4gYmUgcGFyc2VkIGFzIG51bWJlcnMgYXJlIGVtaXR0ZWQgYXMgdHlwZSBgbnVtYmVyYCwgb3RoZXIgdmFsdWVzXG4gKiBhcmUgcGFyc2VkIGFzIGBzdHJpbmdgLlxuICpcbiAqIFRoZSByZXN1bHRzIGFyZSBub3QgYmF0Y2hlZC5cbiAqXG4gKiBAZG9jIHtoZWFkaW5nOiAnRGF0YScsIHN1YmhlYWRpbmc6ICdDbGFzc2VzJywgbmFtZXNwYWNlOiAnZGF0YSd9XG4gKi9cbmV4cG9ydCBjbGFzcyBDU1ZEYXRhc2V0IGV4dGVuZHMgRGF0YXNldDxUZW5zb3JDb250YWluZXI+IHtcbiAgYmFzZTogVGV4dExpbmVEYXRhc2V0O1xuICBwcml2YXRlIGhhc0hlYWRlciA9IHRydWU7XG4gIHByaXZhdGUgZnVsbENvbHVtbk5hbWVzOiBzdHJpbmdbXSA9IG51bGw7XG4gIHByaXZhdGUgY29sdW1uTmFtZXNWYWxpZGF0ZWQgPSBmYWxzZTtcbiAgcHJpdmF0ZSBjb2x1bW5Db25maWdzOiB7W2tleTogc3RyaW5nXTogQ29sdW1uQ29uZmlnfSA9IG51bGw7XG4gIHByaXZhdGUgY29uZmlndXJlZENvbHVtbnNPbmx5ID0gZmFsc2U7XG4gIHByaXZhdGUgZGVsaW1pdGVyID0gJywnO1xuICBwcml2YXRlIGRlbGltV2hpdGVzcGFjZSA9IGZhbHNlO1xuXG4gIC8qKlxuICAgKiBSZXR1cm5zIGNvbHVtbiBuYW1lcyBvZiB0aGUgY3N2IGRhdGFzZXQuIElmIGBjb25maWd1cmVkQ29sdW1uc09ubHlgIGlzXG4gICAqIHRydWUsIHJldHVybiBjb2x1bW4gbmFtZXMgaW4gYGNvbHVtbkNvbmZpZ3NgLiBJZiBgY29uZmlndXJlZENvbHVtbnNPbmx5YCBpc1xuICAgKiBmYWxzZSBhbmQgYGNvbHVtbk5hbWVzYCBpcyBwcm92aWRlZCwgYGNvbHVtbk5hbWVzYC4gSWZcbiAgICogYGNvbmZpZ3VyZWRDb2x1bW5zT25seWAgaXMgZmFsc2UgYW5kIGBjb2x1bW5OYW1lc2AgaXMgbm90IHByb3ZpZGVkLCByZXR1cm5cbiAgICogYWxsIGNvbHVtbiBuYW1lcyBwYXJzZWQgZnJvbSB0aGUgY3N2IGZpbGUuIEZvciBleGFtcGxlIHVzYWdlIHBsZWFzZSBnbyB0b1xuICAgKiBgdGYuZGF0YS5jc3ZgLlxuICAgKlxuICAgKiBAZG9jIHtoZWFkaW5nOiAnRGF0YScsIHN1YmhlYWRpbmc6ICdDbGFzc2VzJ31cbiAgICovXG4gIGFzeW5jIGNvbHVtbk5hbWVzKCkge1xuICAgIGlmICghdGhpcy5jb2x1bW5OYW1lc1ZhbGlkYXRlZCkge1xuICAgICAgYXdhaXQgdGhpcy5zZXRDb2x1bW5OYW1lcygpO1xuICAgIH1cbiAgICByZXR1cm4gdGhpcy5jb25maWd1cmVkQ29sdW1uc09ubHkgPyBPYmplY3Qua2V5cyh0aGlzLmNvbHVtbkNvbmZpZ3MpIDpcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGlzLmZ1bGxDb2x1bW5OYW1lcztcbiAgfVxuXG4gIC8qIDEpIElmIGBjb2x1bW5OYW1lc2AgaXMgcHJvdmlkZWQgYXMgc3RyaW5nW10sIHVzZSB0aGlzIHN0cmluZ1tdIGFzIG91dHB1dFxuICAgKiBrZXlzIGluIGNvcnJlc3BvbmRpbmcgb3JkZXIuIFRoZSBsZW5ndGggbXVzdCBtYXRjaCB0aGUgbnVtYmVyIG9mIGluZmVycmVkXG4gICAqIGNvbHVtbnMgaWYgYGhhc0hlYWRlcmAgaXMgdHJ1ZSAuXG4gICAqIDIpIElmIGBjb2x1bW5OYW1lc2AgaXMgbm90IHByb3ZpZGVkLCBwYXJzZSBoZWFkZXIgbGluZSBhcyBgY29sdW1uTmFtZXNgIGlmXG4gICAqIGhhc0hlYWRlciBpcyB0cnVlLiBJZiBgaGFzSGVhZGVyYCBpcyBmYWxzZSwgdGhyb3cgYW4gZXJyb3IuXG4gICAqIDMpIElmIGBjb2x1bW5Db25maWdzYCBpcyBwcm92aWRlZCwgYWxsIHRoZSBrZXlzIGluIGBjb2x1bW5Db25maWdzYCBtdXN0XG4gICAqIGV4aXN0IGluIHBhcnNlZCBgY29sdW1uTmFtZXNgLlxuICAgKi9cbiAgcHJpdmF0ZSBhc3luYyBzZXRDb2x1bW5OYW1lcygpIHtcbiAgICBjb25zdCBjb2x1bW5OYW1lc0Zyb21GaWxlID0gYXdhaXQgdGhpcy5tYXliZVJlYWRIZWFkZXJMaW5lKCk7XG4gICAgaWYgKCF0aGlzLmZ1bGxDb2x1bW5OYW1lcyAmJiAhY29sdW1uTmFtZXNGcm9tRmlsZSkge1xuICAgICAgLy8gVGhyb3cgYW4gZXJyb3IgaWYgY29sdW1uTmFtZXMgaXMgbm90IHByb3ZpZGVkIGFuZCBubyBoZWFkZXIgbGluZS5cbiAgICAgIHRocm93IG5ldyBFcnJvcihcbiAgICAgICAgICAnQ29sdW1uIG5hbWVzIG11c3QgYmUgcHJvdmlkZWQgaWYgdGhlcmUgaXMgbm8gaGVhZGVyIGxpbmUuJyk7XG4gICAgfSBlbHNlIGlmICh0aGlzLmZ1bGxDb2x1bW5OYW1lcyAmJiBjb2x1bW5OYW1lc0Zyb21GaWxlKSB7XG4gICAgICAvLyBDaGVjayBwcm92aWRlZCBjb2x1bW5OYW1lcyBtYXRjaCBoZWFkZXIgbGluZS5cbiAgICAgIHV0aWwuYXNzZXJ0KFxuICAgICAgICAgIGNvbHVtbk5hbWVzRnJvbUZpbGUubGVuZ3RoID09PSB0aGlzLmZ1bGxDb2x1bW5OYW1lcy5sZW5ndGgsXG4gICAgICAgICAgKCkgPT4gJ1RoZSBsZW5ndGggb2YgcHJvdmlkZWQgY29sdW1uTmFtZXMgKCcgK1xuICAgICAgICAgICAgICB0aGlzLmZ1bGxDb2x1bW5OYW1lcy5sZW5ndGgudG9TdHJpbmcoKSArXG4gICAgICAgICAgICAgICcpIGRvZXMgbm90IG1hdGNoIHRoZSBsZW5ndGggb2YgdGhlIGhlYWRlciBsaW5lIHJlYWQgZnJvbSAnICtcbiAgICAgICAgICAgICAgJ2ZpbGUgKCcgKyBjb2x1bW5OYW1lc0Zyb21GaWxlLmxlbmd0aC50b1N0cmluZygpICsgJykuJyk7XG4gICAgfVxuICAgIGlmICghdGhpcy5mdWxsQ29sdW1uTmFtZXMpIHtcbiAgICAgIHRoaXMuZnVsbENvbHVtbk5hbWVzID0gY29sdW1uTmFtZXNGcm9tRmlsZTtcbiAgICB9XG4gICAgLy8gQ2hlY2sgaWYgdGhlcmUgYXJlIGR1cGxpY2F0ZSBjb2x1bW4gbmFtZXMuXG4gICAgY29uc3QgY291bnRzOiB7W2tleTogc3RyaW5nXTogbnVtYmVyfSA9IHRoaXMuZnVsbENvbHVtbk5hbWVzLnJlZHVjZShcbiAgICAgICAgKGNvdW50QWNjOiB7W2tleTogc3RyaW5nXTogbnVtYmVyfSwgbmFtZSkgPT4ge1xuICAgICAgICAgIGNvdW50QWNjW25hbWVdID0gKGNvdW50QWNjW25hbWVdICsgMSkgfHwgMTtcbiAgICAgICAgICByZXR1cm4gY291bnRBY2M7XG4gICAgICAgIH0sXG4gICAgICAgIHt9KTtcbiAgICBjb25zdCBkdXBsaWNhdGVOYW1lcyA9XG4gICAgICAgIE9iamVjdC5rZXlzKGNvdW50cykuZmlsdGVyKChuYW1lKSA9PiAoY291bnRzW25hbWVdID4gMSkpO1xuICAgIHV0aWwuYXNzZXJ0KFxuICAgICAgICBkdXBsaWNhdGVOYW1lcy5sZW5ndGggPT09IDAsXG4gICAgICAgICgpID0+ICdEdXBsaWNhdGUgY29sdW1uIG5hbWVzIGZvdW5kOiAnICsgZHVwbGljYXRlTmFtZXMudG9TdHJpbmcoKSk7XG4gICAgLy8gQ2hlY2sgaWYga2V5cyBpbiBjb2x1bW5Db25maWdzIG1hdGNoIGNvbHVtbk5hbWVzLlxuICAgIGlmICh0aGlzLmNvbHVtbkNvbmZpZ3MpIHtcbiAgICAgIGZvciAoY29uc3Qga2V5IG9mIE9iamVjdC5rZXlzKHRoaXMuY29sdW1uQ29uZmlncykpIHtcbiAgICAgICAgY29uc3QgaW5kZXggPSB0aGlzLmZ1bGxDb2x1bW5OYW1lcy5pbmRleE9mKGtleSk7XG4gICAgICAgIGlmIChpbmRleCA9PT0gLTEpIHtcbiAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoXG4gICAgICAgICAgICAgICdUaGUga2V5IFwiJyArIGtleSArXG4gICAgICAgICAgICAgICdcIiBwcm92aWRlZCBpbiBjb2x1bW5Db25maWdzIGRvZXMgbm90IG1hdGNoIGFueSBvZiB0aGUgY29sdW1uICcgK1xuICAgICAgICAgICAgICAnbmFtZXMgKCcgKyB0aGlzLmZ1bGxDb2x1bW5OYW1lcy50b1N0cmluZygpICsgJykuJyk7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9XG4gICAgdGhpcy5jb2x1bW5OYW1lc1ZhbGlkYXRlZCA9IHRydWU7XG4gIH1cblxuICBwcml2YXRlIGFzeW5jIG1heWJlUmVhZEhlYWRlckxpbmUoKSB7XG4gICAgaWYgKHRoaXMuaGFzSGVhZGVyKSB7XG4gICAgICBjb25zdCBpdGVyID0gYXdhaXQgdGhpcy5iYXNlLml0ZXJhdG9yKCk7XG4gICAgICBjb25zdCBmaXJzdEVsZW1lbnQgPSBhd2FpdCBpdGVyLm5leHQoKTtcbiAgICAgIGlmIChmaXJzdEVsZW1lbnQuZG9uZSkge1xuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ05vIGRhdGEgd2FzIGZvdW5kIGZvciBDU1YgcGFyc2luZy4nKTtcbiAgICAgIH1cbiAgICAgIGNvbnN0IGZpcnN0TGluZTogc3RyaW5nID0gZmlyc3RFbGVtZW50LnZhbHVlO1xuICAgICAgY29uc3QgaGVhZGVycyA9IHRoaXMucGFyc2VSb3coZmlyc3RMaW5lLCBmYWxzZSk7XG4gICAgICByZXR1cm4gaGVhZGVycztcbiAgICB9IGVsc2Uge1xuICAgICAgcmV0dXJuIG51bGw7XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIENyZWF0ZSBhIGBDU1ZEYXRhc2V0YC5cbiAgICpcbiAgICogQHBhcmFtIGlucHV0IEEgYERhdGFTb3VyY2VgIHByb3ZpZGluZyBhIGNodW5rZWQsIFVURjgtZW5jb2RlZCBieXRlIHN0cmVhbS5cbiAgICogQHBhcmFtIGNzdkNvbmZpZyAoT3B0aW9uYWwpIEEgQ1NWQ29uZmlnIG9iamVjdCB0aGF0IGNvbnRhaW5zIGNvbmZpZ3VyYXRpb25zXG4gICAqICAgICBvZiByZWFkaW5nIGFuZCBkZWNvZGluZyBmcm9tIENTViBmaWxlKHMpLlxuICAgKlxuICAgKiAgICAgaGFzSGVhZGVyOiAoT3B0aW9uYWwpIEEgYm9vbGVhbiB2YWx1ZSB0aGF0IGluZGljYXRlcyB3aGV0aGVyIHRoZSBmaXJzdFxuICAgKiAgICAgcm93IG9mIHByb3ZpZGVkIENTViBmaWxlIGlzIGEgaGVhZGVyIGxpbmUgd2l0aCBjb2x1bW4gbmFtZXMsIGFuZCBzaG91bGRcbiAgICogICAgIG5vdCBiZSBpbmNsdWRlZCBpbiB0aGUgZGF0YS4gRGVmYXVsdHMgdG8gYHRydWVgLlxuICAgKlxuICAgKiAgICAgY29sdW1uTmFtZXM6IChPcHRpb25hbCkgQSBsaXN0IG9mIHN0cmluZ3MgdGhhdCBjb3JyZXNwb25kcyB0b1xuICAgKiAgICAgdGhlIENTViBjb2x1bW4gbmFtZXMsIGluIG9yZGVyLiBJZiBwcm92aWRlZCwgaXQgaWdub3JlcyB0aGUgY29sdW1uXG4gICAqICAgICBuYW1lcyBpbmZlcnJlZCBmcm9tIHRoZSBoZWFkZXIgcm93LiBJZiBub3QgcHJvdmlkZWQsIGluZmVycyB0aGUgY29sdW1uXG4gICAqICAgICBuYW1lcyBmcm9tIHRoZSBmaXJzdCByb3cgb2YgdGhlIHJlY29yZHMuIElmIGhhc0hlYWRlciBpcyBmYWxzZSBhbmRcbiAgICogICAgIGNvbHVtbk5hbWVzIGlzIG5vdCBwcm92aWRlZCwgdGhpcyBtZXRob2QgdGhyb3dzIGFuIGVycm9yLlxuICAgKlxuICAgKiAgICAgY29sdW1uQ29uZmlnczogKE9wdGlvbmFsKSBBIGRpY3Rpb25hcnkgd2hvc2Uga2V5IGlzIGNvbHVtbiBuYW1lcywgdmFsdWVcbiAgICogICAgIGlzIGFuIG9iamVjdCBzdGF0aW5nIGlmIHRoaXMgY29sdW1uIGlzIHJlcXVpcmVkLCBjb2x1bW4ncyBkYXRhIHR5cGUsXG4gICAqICAgICBkZWZhdWx0IHZhbHVlLCBhbmQgaWYgdGhpcyBjb2x1bW4gaXMgbGFiZWwuIElmIHByb3ZpZGVkLCBrZXlzIG11c3RcbiAgICogICAgIGNvcnJlc3BvbmQgdG8gbmFtZXMgcHJvdmlkZWQgaW4gY29sdW1uTmFtZXMgb3IgaW5mZXJyZWQgZnJvbSB0aGUgZmlsZVxuICAgKiAgICAgaGVhZGVyIGxpbmVzLiBJZiBpc0xhYmVsIGlzIHRydWUgYW55IGNvbHVtbiwgcmV0dXJucyBhbiBhcnJheSBvZiB0d29cbiAgICogICAgIGl0ZW1zOiB0aGUgZmlyc3QgaXRlbSBpcyBhIGRpY3Qgb2YgZmVhdHVyZXMga2V5L3ZhbHVlIHBhaXJzLCB0aGUgc2Vjb25kXG4gICAqICAgICBpdGVtIGlzIGEgZGljdCBvZiBsYWJlbHMga2V5L3ZhbHVlIHBhaXJzLiBJZiBubyBmZWF0dXJlIGlzIG1hcmtlZCBhc1xuICAgKiAgICAgbGFiZWwsIHJldHVybnMgYSBkaWN0IG9mIGZlYXR1cmVzIG9ubHkuXG4gICAqXG4gICAqICAgICBjb25maWd1cmVkQ29sdW1uc09ubHkgKE9wdGlvbmFsKSBJZiB0cnVlLCBvbmx5IGNvbHVtbnMgcHJvdmlkZWQgaW5cbiAgICogICAgIGNvbHVtbkNvbmZpZ3Mgd2lsbCBiZSBwYXJzZWQgYW5kIHByb3ZpZGVkIGR1cmluZyBpdGVyYXRpb24uXG4gICAqXG4gICAqICAgICBkZWxpbWl0ZXIgKE9wdGlvbmFsKSBUaGUgc3RyaW5nIHVzZWQgdG8gcGFyc2UgZWFjaCBsaW5lIG9mIHRoZSBpbnB1dFxuICAgKiAgICAgZmlsZS4gRGVmYXVsdHMgdG8gYCxgLlxuICAgKi9cbiAgY29uc3RydWN0b3IocHJvdGVjdGVkIHJlYWRvbmx5IGlucHV0OiBEYXRhU291cmNlLCBjc3ZDb25maWc/OiBDU1ZDb25maWcpIHtcbiAgICBzdXBlcigpO1xuICAgIHRoaXMuYmFzZSA9IG5ldyBUZXh0TGluZURhdGFzZXQoaW5wdXQpO1xuICAgIGlmICghY3N2Q29uZmlnKSB7XG4gICAgICBjc3ZDb25maWcgPSB7fTtcbiAgICB9XG4gICAgdGhpcy5oYXNIZWFkZXIgPSBjc3ZDb25maWcuaGFzSGVhZGVyID09PSBmYWxzZSA/IGZhbHNlIDogdHJ1ZTtcbiAgICB0aGlzLmZ1bGxDb2x1bW5OYW1lcyA9IGNzdkNvbmZpZy5jb2x1bW5OYW1lcztcbiAgICB0aGlzLmNvbHVtbkNvbmZpZ3MgPSBjc3ZDb25maWcuY29sdW1uQ29uZmlncztcbiAgICB0aGlzLmNvbmZpZ3VyZWRDb2x1bW5zT25seSA9IGNzdkNvbmZpZy5jb25maWd1cmVkQ29sdW1uc09ubHk7XG4gICAgaWYgKGNzdkNvbmZpZy5kZWxpbVdoaXRlc3BhY2UpIHtcbiAgICAgIHV0aWwuYXNzZXJ0KFxuICAgICAgICAgIGNzdkNvbmZpZy5kZWxpbWl0ZXIgPT0gbnVsbCxcbiAgICAgICAgICAoKSA9PlxuICAgICAgICAgICAgICAnRGVsaW1pdGVyIHNob3VsZCBub3QgYmUgcHJvdmlkZWQgd2hlbiBkZWxpbVdoaXRlc3BhY2UgaXMgdHJ1ZS4nKTtcbiAgICAgIHRoaXMuZGVsaW1XaGl0ZXNwYWNlID0gdHJ1ZTtcbiAgICAgIHRoaXMuZGVsaW1pdGVyID0gJyAnO1xuICAgIH0gZWxzZSB7XG4gICAgICB0aGlzLmRlbGltaXRlciA9IGNzdkNvbmZpZy5kZWxpbWl0ZXIgPyBjc3ZDb25maWcuZGVsaW1pdGVyIDogJywnO1xuICAgIH1cbiAgfVxuXG4gIGFzeW5jIGl0ZXJhdG9yKCk6IFByb21pc2U8TGF6eUl0ZXJhdG9yPFRlbnNvckNvbnRhaW5lcj4+IHtcbiAgICBpZiAoIXRoaXMuY29sdW1uTmFtZXNWYWxpZGF0ZWQpIHtcbiAgICAgIGF3YWl0IHRoaXMuc2V0Q29sdW1uTmFtZXMoKTtcbiAgICB9XG4gICAgbGV0IGxpbmVzID0gYXdhaXQgdGhpcy5iYXNlLml0ZXJhdG9yKCk7XG4gICAgaWYgKHRoaXMuaGFzSGVhZGVyKSB7XG4gICAgICAvLyBXZSBwcmV2aW91c2x5IHJlYWQgdGhlIGZpcnN0IGxpbmUgdG8gZ2V0IHRoZSBjb2x1bW5OYW1lcy5cbiAgICAgIC8vIE5vdyB0aGF0IHdlJ3JlIHByb3ZpZGluZyBkYXRhLCBza2lwIGl0LlxuICAgICAgbGluZXMgPSBsaW5lcy5za2lwKDEpO1xuICAgIH1cbiAgICByZXR1cm4gbGluZXMubWFwKHggPT4gdGhpcy5tYWtlRGF0YUVsZW1lbnQoeCkpO1xuICB9XG5cbiAgbWFrZURhdGFFbGVtZW50KGxpbmU6IHN0cmluZyk6IFRlbnNvckNvbnRhaW5lciB7XG4gICAgY29uc3QgdmFsdWVzID0gdGhpcy5wYXJzZVJvdyhsaW5lKTtcbiAgICBjb25zdCBmZWF0dXJlczoge1trZXk6IHN0cmluZ106IFRlbnNvckNvbnRhaW5lcn0gPSB7fTtcbiAgICBjb25zdCBsYWJlbHM6IHtba2V5OiBzdHJpbmddOiBUZW5zb3JDb250YWluZXJ9ID0ge307XG5cbiAgICBmb3IgKGxldCBpID0gMDsgaSA8IHRoaXMuZnVsbENvbHVtbk5hbWVzLmxlbmd0aDsgaSsrKSB7XG4gICAgICBjb25zdCBrZXkgPSB0aGlzLmZ1bGxDb2x1bW5OYW1lc1tpXTtcbiAgICAgIGNvbnN0IGNvbmZpZyA9IHRoaXMuY29sdW1uQ29uZmlncyA/IHRoaXMuY29sdW1uQ29uZmlnc1trZXldIDogbnVsbDtcbiAgICAgIGlmICh0aGlzLmNvbmZpZ3VyZWRDb2x1bW5zT25seSAmJiAhY29uZmlnKSB7XG4gICAgICAgIC8vIFRoaXMgY29sdW1uIGlzIG5vdCBzZWxlY3RlZC5cbiAgICAgICAgY29udGludWU7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBjb25zdCB2YWx1ZSA9IHZhbHVlc1tpXTtcbiAgICAgICAgbGV0IHBhcnNlZFZhbHVlID0gbnVsbDtcbiAgICAgICAgaWYgKHZhbHVlID09PSAnJykge1xuICAgICAgICAgIC8vIElmIGRlZmF1bHQgdmFsdWUgaXMgcHJvdmlkZWQsIHVzZSBpdC4gSWYgZGVmYXVsdCB2YWx1ZSBpcyBub3RcbiAgICAgICAgICAvLyBwcm92aWRlZCwgc2V0IGFzIHVuZGVmaW5lZC5cbiAgICAgICAgICBpZiAoY29uZmlnICYmIGNvbmZpZy5kZWZhdWx0ICE9PSB1bmRlZmluZWQpIHtcbiAgICAgICAgICAgIHBhcnNlZFZhbHVlID0gY29uZmlnLmRlZmF1bHQ7XG4gICAgICAgICAgfSBlbHNlIGlmIChjb25maWcgJiYgKGNvbmZpZy5yZXF1aXJlZCB8fCBjb25maWcuaXNMYWJlbCkpIHtcbiAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcihcbiAgICAgICAgICAgICAgICBgUmVxdWlyZWQgY29sdW1uICR7a2V5fSBpcyBlbXB0eSBpbiB0aGlzIGxpbmU6ICR7bGluZX1gKTtcbiAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgcGFyc2VkVmFsdWUgPSB1bmRlZmluZWQ7XG4gICAgICAgICAgfVxuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIC8vIEEgdmFsdWUgaXMgcHJlc2VudCwgc28gcGFyc2UgaXQgYmFzZWQgb24gdHlwZVxuICAgICAgICAgIGNvbnN0IHZhbHVlQXNOdW0gPSBOdW1iZXIodmFsdWUpO1xuICAgICAgICAgIGlmIChpc05hTih2YWx1ZUFzTnVtKSkge1xuICAgICAgICAgICAgLy8gVGhlIHZhbHVlIGlzIGEgc3RyaW5nIGFuZCB0aGlzIGNvbHVtbiBpcyBkZWNsYXJlZCBhcyBib29sZWFuXG4gICAgICAgICAgICAvLyBpbiBjb25maWcsIHBhcnNlIGl0IGFzIGJvb2xlYW4uXG4gICAgICAgICAgICBpZiAoY29uZmlnICYmIGNvbmZpZy5kdHlwZSA9PT0gJ2Jvb2wnKSB7XG4gICAgICAgICAgICAgIHBhcnNlZFZhbHVlID0gdGhpcy5nZXRCb29sZWFuKHZhbHVlKTtcbiAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgIC8vIFNldCB2YWx1ZSBhcyBzdHJpbmdcbiAgICAgICAgICAgICAgcGFyc2VkVmFsdWUgPSB2YWx1ZTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9IGVsc2UgaWYgKCFjb25maWcgfHwgIWNvbmZpZy5kdHlwZSkge1xuICAgICAgICAgICAgLy8gSWYgdGhpcyB2YWx1ZSBpcyBhIG51bWJlciBhbmQgbm8gdHlwZSBjb25maWcgaXMgcHJvdmlkZWQsIHJldHVyblxuICAgICAgICAgICAgLy8gaXQgYXMgbnVtYmVyLlxuICAgICAgICAgICAgcGFyc2VkVmFsdWUgPSB2YWx1ZUFzTnVtO1xuICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAvLyBJZiB0aGlzIHZhbHVlIGlzIGEgbnVtYmVyIGFuZCBkYXRhIHR5cGUgaXMgcHJvdmlkZWQsIHBhcnNlIGl0XG4gICAgICAgICAgICAvLyBhY2NvcmRpbmcgdG8gcHJvdmlkZWQgZGF0YSB0eXBlLlxuICAgICAgICAgICAgc3dpdGNoIChjb25maWcuZHR5cGUpIHtcbiAgICAgICAgICAgICAgY2FzZSAnZmxvYXQzMic6XG4gICAgICAgICAgICAgICAgcGFyc2VkVmFsdWUgPSB2YWx1ZUFzTnVtO1xuICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgICBjYXNlICdpbnQzMic6XG4gICAgICAgICAgICAgICAgcGFyc2VkVmFsdWUgPSBNYXRoLmZsb29yKHZhbHVlQXNOdW0pO1xuICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgICBjYXNlICdib29sJzpcbiAgICAgICAgICAgICAgICBwYXJzZWRWYWx1ZSA9IHRoaXMuZ2V0Qm9vbGVhbih2YWx1ZSk7XG4gICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICAgIGRlZmF1bHQ6XG4gICAgICAgICAgICAgICAgcGFyc2VkVmFsdWUgPSB2YWx1ZUFzTnVtO1xuICAgICAgICAgICAgfVxuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICAvLyBDaGVjayBpZiB0aGlzIGNvbHVtbiBpcyBsYWJlbC5cbiAgICAgICAgKGNvbmZpZyAmJiBjb25maWcuaXNMYWJlbCkgPyBsYWJlbHNba2V5XSA9IHBhcnNlZFZhbHVlIDpcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmZWF0dXJlc1trZXldID0gcGFyc2VkVmFsdWU7XG4gICAgICB9XG4gICAgfVxuICAgIC8vIElmIGxhYmVsIGV4aXN0cywgcmV0dXJuIGFuIG9iamVjdCBvZiBmZWF0dXJlcyBhbmQgbGFiZWxzIGFzIHt4czpmZWF0dXJlcyxcbiAgICAvLyB5czpsYWJlbHN9LCBvdGhlcndpc2UgcmV0dXJuIGZlYXR1cmVzIG9ubHkuXG4gICAgaWYgKE9iamVjdC5rZXlzKGxhYmVscykubGVuZ3RoID09PSAwKSB7XG4gICAgICByZXR1cm4gZmVhdHVyZXM7XG5cbiAgICB9IGVsc2Uge1xuICAgICAgcmV0dXJuIHt4czogZmVhdHVyZXMsIHlzOiBsYWJlbHN9O1xuICAgIH1cbiAgfVxuXG4gIHByaXZhdGUgZ2V0Qm9vbGVhbih2YWx1ZTogc3RyaW5nKTogbnVtYmVyIHtcbiAgICBpZiAodmFsdWUgPT09ICcxJyB8fCB2YWx1ZS50b0xvd2VyQ2FzZSgpID09PSAndHJ1ZScpIHtcbiAgICAgIHJldHVybiAxO1xuICAgIH0gZWxzZSB7XG4gICAgICByZXR1cm4gMDtcbiAgICB9XG4gIH1cblxuICAvLyBhZGFwdGVkIGZyb20gaHR0cHM6Ly9iZXRhLm9ic2VydmFibGVocS5jb20vQG1ib3N0b2NrL3N0cmVhbWluZy1jc3ZcbiAgcHJpdmF0ZSBwYXJzZVJvdyhsaW5lOiBzdHJpbmcsIHZhbGlkYXRlRWxlbWVudENvdW50ID0gdHJ1ZSk6IHN0cmluZ1tdIHtcbiAgICBjb25zdCByZXN1bHQ6IHN0cmluZ1tdID0gW107XG4gICAgbGV0IHJlYWRPZmZzZXQgPSAwO1xuICAgIGNvbnN0IHJlYWRMZW5ndGggPSBsaW5lLmxlbmd0aDtcbiAgICBsZXQgY3VycmVudFN0YXRlID0gU1RBVEVfT1VUO1xuICAgIC8vIEdvZXMgdGhyb3VnaCB0aGUgbGluZSB0byBwYXJzZSBxdW90ZS5cbiAgICBmb3IgKGxldCBpID0gMDsgaSA8IHJlYWRMZW5ndGg7IGkrKykge1xuICAgICAgc3dpdGNoIChjdXJyZW50U3RhdGUpIHtcbiAgICAgICAgLy8gQmVmb3JlIGVudGVyIGEgbmV3IGZpZWxkXG4gICAgICAgIGNhc2UgU1RBVEVfT1VUOlxuICAgICAgICAgIHN3aXRjaCAobGluZS5jaGFyQXQoaSkpIHtcbiAgICAgICAgICAgIC8vIEVudGVyIGEgcXVvdGVkIGZpZWxkXG4gICAgICAgICAgICBjYXNlIENPREVfUVVPVEU6XG4gICAgICAgICAgICAgIHJlYWRPZmZzZXQgPSBpICsgMTtcbiAgICAgICAgICAgICAgY3VycmVudFN0YXRlID0gU1RBVEVfUVVPVEU7XG4gICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgLy8gUmVhZCBhbiBlbXB0eSBmaWVsZFxuICAgICAgICAgICAgY2FzZSB0aGlzLmRlbGltaXRlcjpcbiAgICAgICAgICAgICAgcmVhZE9mZnNldCA9IGkgKyAxO1xuICAgICAgICAgICAgICAvLyBJZiBkZWxpbWl0ZXIgaXMgd2hpdGUgc3BhY2UgYW5kIGNvbmZpZ3VyZWQgdG8gY29sbGFwc2VcbiAgICAgICAgICAgICAgLy8gbXVsdGlwbGUgd2hpdGUgc3BhY2VzLCBpZ25vcmUgdGhpcyB3aGl0ZSBzcGFjZS5cbiAgICAgICAgICAgICAgaWYgKHRoaXMuZGVsaW1pdGVyID09PSAnICcgJiYgdGhpcy5kZWxpbVdoaXRlc3BhY2UpIHtcbiAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICByZXN1bHQucHVzaCgnJyk7XG4gICAgICAgICAgICAgIGN1cnJlbnRTdGF0ZSA9IFNUQVRFX09VVDtcbiAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICAvLyBFbnRlciBhbiB1bnF1b3RlZCBmaWVsZFxuICAgICAgICAgICAgZGVmYXVsdDpcbiAgICAgICAgICAgICAgY3VycmVudFN0YXRlID0gU1RBVEVfRklFTEQ7XG4gICAgICAgICAgICAgIHJlYWRPZmZzZXQgPSBpO1xuICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICB9XG4gICAgICAgICAgYnJlYWs7XG4gICAgICAgIC8vIEluIGFuIHVucXVvdGVkIGZpZWxkXG4gICAgICAgIGNhc2UgU1RBVEVfRklFTEQ6XG4gICAgICAgICAgc3dpdGNoIChsaW5lLmNoYXJBdChpKSkge1xuICAgICAgICAgICAgLy8gRXhpdCBhbiB1bnF1b3RlZCBmaWVsZCwgYWRkIGl0IHRvIHJlc3VsdFxuICAgICAgICAgICAgY2FzZSB0aGlzLmRlbGltaXRlcjpcbiAgICAgICAgICAgICAgcmVzdWx0LnB1c2gobGluZS5zdWJzdHJpbmcocmVhZE9mZnNldCwgaSkpO1xuICAgICAgICAgICAgICBjdXJyZW50U3RhdGUgPSBTVEFURV9PVVQ7XG4gICAgICAgICAgICAgIHJlYWRPZmZzZXQgPSBpICsgMTtcbiAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICBkZWZhdWx0OlxuICAgICAgICAgIH1cbiAgICAgICAgICBicmVhaztcbiAgICAgICAgLy8gSW4gYSBxdW90ZWQgZmllbGRcbiAgICAgICAgY2FzZSBTVEFURV9RVU9URTpcbiAgICAgICAgICBzd2l0Y2ggKGxpbmUuY2hhckF0KGkpKSB7XG4gICAgICAgICAgICAvLyBSZWFkIGEgcXVvdGUgYWZ0ZXIgYSBxdW90ZVxuICAgICAgICAgICAgY2FzZSBDT0RFX1FVT1RFOlxuICAgICAgICAgICAgICBjdXJyZW50U3RhdGUgPSBTVEFURV9RVU9URV9BRlRFUl9RVU9URTtcbiAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICBkZWZhdWx0OlxuICAgICAgICAgIH1cbiAgICAgICAgICBicmVhaztcbiAgICAgICAgLy8gVGhpcyBzdGF0ZSBtZWFucyBpdCdzIHJpZ2h0IGFmdGVyIGEgc2Vjb25kIHF1b3RlIGluIGEgZmllbGRcbiAgICAgICAgY2FzZSBTVEFURV9RVU9URV9BRlRFUl9RVU9URTpcbiAgICAgICAgICBzd2l0Y2ggKGxpbmUuY2hhckF0KGkpKSB7XG4gICAgICAgICAgICAvLyBGaW5pc2hlZCBhIHF1b3RlZCBmaWVsZFxuICAgICAgICAgICAgY2FzZSB0aGlzLmRlbGltaXRlcjpcbiAgICAgICAgICAgICAgcmVzdWx0LnB1c2gobGluZS5zdWJzdHJpbmcocmVhZE9mZnNldCwgaSAtIDEpKTtcbiAgICAgICAgICAgICAgY3VycmVudFN0YXRlID0gU1RBVEVfT1VUO1xuICAgICAgICAgICAgICByZWFkT2Zmc2V0ID0gaSArIDE7XG4gICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgLy8gRmluaXNoZWQgYSBxdW90ZWQgcGFydCBpbiBhIHF1b3RlZCBmaWVsZFxuICAgICAgICAgICAgY2FzZSBDT0RFX1FVT1RFOlxuICAgICAgICAgICAgICBjdXJyZW50U3RhdGUgPSBTVEFURV9RVU9URTtcbiAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICAvLyBJbiBhIHF1b3RlZCBwYXJ0IGluIGEgcXVvdGVkIGZpZWxkXG4gICAgICAgICAgICBkZWZhdWx0OlxuICAgICAgICAgICAgICBjdXJyZW50U3RhdGUgPSBTVEFURV9XSVRISU5fUVVPVEVfSU5fUVVPVEU7XG4gICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgIH1cbiAgICAgICAgICBicmVhaztcbiAgICAgICAgY2FzZSBTVEFURV9XSVRISU5fUVVPVEVfSU5fUVVPVEU6XG4gICAgICAgICAgc3dpdGNoIChsaW5lLmNoYXJBdChpKSkge1xuICAgICAgICAgICAgLy8gRXhpdCBhIHF1b3RlZCBwYXJ0IGluIGEgcXVvdGVkIGZpZWxkXG4gICAgICAgICAgICBjYXNlIENPREVfUVVPVEU6XG4gICAgICAgICAgICAgIGN1cnJlbnRTdGF0ZSA9IFNUQVRFX1FVT1RFO1xuICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgIGRlZmF1bHQ6XG4gICAgICAgICAgfVxuICAgICAgICAgIGJyZWFrO1xuICAgICAgICBkZWZhdWx0OlxuICAgICAgfVxuICAgIH1cbiAgICAvLyBBZGRzIGxhc3QgaXRlbSBiYXNlZCBvbiBpZiBpdCBpcyBxdW90ZWQuXG4gICAgaWYgKGN1cnJlbnRTdGF0ZSA9PT0gU1RBVEVfUVVPVEVfQUZURVJfUVVPVEUpIHtcbiAgICAgIHJlc3VsdC5wdXNoKGxpbmUuc3Vic3RyaW5nKHJlYWRPZmZzZXQsIHJlYWRMZW5ndGggLSAxKSk7XG4gICAgfSBlbHNlIHtcbiAgICAgIHJlc3VsdC5wdXNoKGxpbmUuc3Vic3RyaW5nKHJlYWRPZmZzZXQpKTtcbiAgICB9XG4gICAgLy8gQ2hlY2sgaWYgZWFjaCByb3cgaGFzIHRoZSBzYW1lIG51bWJlciBvZiBlbGVtZW50cyBhcyBjb2x1bW4gbmFtZXMuXG4gICAgaWYgKHZhbGlkYXRlRWxlbWVudENvdW50ICYmIHJlc3VsdC5sZW5ndGggIT09IHRoaXMuZnVsbENvbHVtbk5hbWVzLmxlbmd0aCkge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKGBJbnZhbGlkIHJvdyBpbiBjc3YgZmlsZS4gU2hvdWxkIGhhdmUgJHtcbiAgICAgICAgICB0aGlzLmZ1bGxDb2x1bW5OYW1lcy5sZW5ndGh9IGVsZW1lbnRzIGluIGEgcm93LCBidXQgZ290ICR7cmVzdWx0fWApO1xuICAgIH1cbiAgICByZXR1cm4gcmVzdWx0O1xuICB9XG59XG5cbi8vIFRPRE8oc29lcmdlbCk6IGFkZCBtb3JlIGJhc2ljIGRhdGFzZXRzIGZvciBwYXJpdHkgd2l0aCB0Zi5kYXRhXG4vLyB0Zi5kYXRhLkZpeGVkTGVuZ3RoUmVjb3JkRGF0YXNldCgpXG4vLyB0Zi5kYXRhLlRGUmVjb3JkRGF0YXNldCgpXG4iXX0=","/**\n * @license\n * Copyright 2019 Google LLC. All Rights Reserved.\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n *\n * =============================================================================\n */\nimport { env, tensor, util } from '@tensorflow/tfjs-core';\nimport { LazyIterator } from './lazy_iterator';\n/**\n * Provide a stream of tensors from microphone audio stream. The tensors are\n * representing audio data as frequency-domain spectrogram generated with\n * browser's native FFT. Tensors representing time-domain waveform is available\n * based on configuration. Only works in browser environment.\n */\nexport class MicrophoneIterator extends LazyIterator {\n constructor(microphoneConfig) {\n super();\n this.microphoneConfig = microphoneConfig;\n this.isClosed = false;\n this.fftSize = microphoneConfig.fftSize || 1024;\n const fftSizeLog2 = Math.log2(this.fftSize);\n if (this.fftSize < 0 || fftSizeLog2 < 4 || fftSizeLog2 > 14 ||\n !Number.isInteger(fftSizeLog2)) {\n throw new Error(`Invalid fftSize: it must be a power of 2 between ` +\n `2 to 4 and 2 to 14, but got ${this.fftSize}`);\n }\n this.numFrames = microphoneConfig.numFramesPerSpectrogram || 43;\n this.sampleRateHz = microphoneConfig.sampleRateHz;\n this.columnTruncateLength =\n microphoneConfig.columnTruncateLength || this.fftSize;\n this.audioTrackConstraints = microphoneConfig.audioTrackConstraints;\n this.smoothingTimeConstant = microphoneConfig.smoothingTimeConstant || 0;\n this.includeSpectrogram =\n microphoneConfig.includeSpectrogram === false ? false : true;\n this.includeWaveform =\n microphoneConfig.includeWaveform === true ? true : false;\n if (!this.includeSpectrogram && !this.includeWaveform) {\n throw new Error('Both includeSpectrogram and includeWaveform are false. ' +\n 'At least one type of data should be returned.');\n }\n }\n summary() {\n return `microphone`;\n }\n // Construct a MicrophoneIterator and start the audio stream.\n static async create(microphoneConfig = {}) {\n if (!env().get('IS_BROWSER')) {\n throw new Error('microphone API is only supported in browser environment.');\n }\n const microphoneIterator = new MicrophoneIterator(microphoneConfig);\n // Call async function start() to initialize the audio stream.\n await microphoneIterator.start();\n return microphoneIterator;\n }\n // Start the audio stream and FFT.\n async start() {\n try {\n this.stream = await navigator.mediaDevices.getUserMedia({\n audio: this.audioTrackConstraints == null ? true :\n this.audioTrackConstraints,\n video: false\n });\n }\n catch (e) {\n throw new Error(`Error thrown while initializing video stream: ${e.message}`);\n }\n if (!this.stream) {\n throw new Error('Could not obtain audio from microphone.');\n }\n const ctxConstructor = \n // tslint:disable-next-line:no-any\n window.AudioContext || window.webkitAudioContext;\n this.audioContext = new ctxConstructor();\n if (!this.sampleRateHz) {\n // If sample rate is not provided, use the available sample rate on\n // device.\n this.sampleRateHz = this.audioContext.sampleRate;\n }\n else if (this.audioContext.sampleRate !== this.sampleRateHz) {\n throw new Error(`Mismatch in sampling rate: ` +\n `Expected: ${this.sampleRateHz}; ` +\n `Actual: ${this.audioContext.sampleRate}`);\n }\n const streamSource = this.audioContext.createMediaStreamSource(this.stream);\n this.analyser = this.audioContext.createAnalyser();\n this.analyser.fftSize = this.fftSize * 2;\n this.analyser.smoothingTimeConstant = this.smoothingTimeConstant;\n streamSource.connect(this.analyser);\n this.freqData = new Float32Array(this.fftSize);\n this.timeData = new Float32Array(this.fftSize);\n return;\n }\n async next() {\n if (this.isClosed) {\n return { value: null, done: true };\n }\n let spectrogramTensor;\n let waveformTensor;\n const audioDataQueue = await this.getAudioData();\n if (this.includeSpectrogram) {\n const freqData = this.flattenQueue(audioDataQueue.freqDataQueue);\n spectrogramTensor = this.getTensorFromAudioDataArray(freqData, [this.numFrames, this.columnTruncateLength, 1]);\n }\n if (this.includeWaveform) {\n const timeData = this.flattenQueue(audioDataQueue.timeDataQueue);\n waveformTensor = this.getTensorFromAudioDataArray(timeData, [this.numFrames * this.fftSize, 1]);\n }\n return {\n value: { 'spectrogram': spectrogramTensor, 'waveform': waveformTensor },\n done: false\n };\n }\n // Capture one result from the audio stream, and extract the value from\n // iterator.next() result.\n async capture() {\n return (await this.next()).value;\n }\n async getAudioData() {\n const freqDataQueue = [];\n const timeDataQueue = [];\n let currentFrames = 0;\n return new Promise(resolve => {\n const intervalID = setInterval(() => {\n if (this.includeSpectrogram) {\n this.analyser.getFloatFrequencyData(this.freqData);\n // If the audio stream is initializing, return empty queue.\n if (this.freqData[0] === -Infinity) {\n resolve({ freqDataQueue, timeDataQueue });\n }\n freqDataQueue.push(this.freqData.slice(0, this.columnTruncateLength));\n }\n if (this.includeWaveform) {\n this.analyser.getFloatTimeDomainData(this.timeData);\n timeDataQueue.push(this.timeData.slice());\n }\n // Clean interval and return when all frames have been collected\n if (++currentFrames === this.numFrames) {\n clearInterval(intervalID);\n resolve({ freqDataQueue, timeDataQueue });\n }\n }, this.fftSize / this.sampleRateHz * 1e3);\n });\n }\n // Stop the audio stream and pause the iterator.\n stop() {\n if (!this.isClosed) {\n this.isClosed = true;\n this.analyser.disconnect();\n this.audioContext.close();\n if (this.stream != null && this.stream.getTracks().length > 0) {\n this.stream.getTracks()[0].stop();\n }\n }\n }\n // Override toArray() function to prevent collecting.\n toArray() {\n throw new Error('Can not convert infinite audio stream to array.');\n }\n // Return audio sampling rate in Hz\n getSampleRate() {\n return this.sampleRateHz;\n }\n flattenQueue(queue) {\n const frameSize = queue[0].length;\n const freqData = new Float32Array(queue.length * frameSize);\n queue.forEach((data, i) => freqData.set(data, i * frameSize));\n return freqData;\n }\n getTensorFromAudioDataArray(freqData, shape) {\n const vals = new Float32Array(util.sizeFromShape(shape));\n // If the data is less than the output shape, the rest is padded with zeros.\n vals.set(freqData, vals.length - freqData.length);\n return tensor(vals, shape);\n }\n}\n//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibWljcm9waG9uZV9pdGVyYXRvci5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uLy4uL3RmanMtZGF0YS9zcmMvaXRlcmF0b3JzL21pY3JvcGhvbmVfaXRlcmF0b3IudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUE7Ozs7Ozs7Ozs7Ozs7Ozs7R0FnQkc7QUFFSCxPQUFPLEVBQUMsR0FBRyxFQUFVLE1BQU0sRUFBdUMsSUFBSSxFQUFDLE1BQU0sdUJBQXVCLENBQUM7QUFFckcsT0FBTyxFQUFDLFlBQVksRUFBQyxNQUFNLGlCQUFpQixDQUFDO0FBRTdDOzs7OztHQUtHO0FBQ0gsTUFBTSxPQUFPLGtCQUFtQixTQUFRLFlBQTZCO0lBZ0JuRSxZQUF1QyxnQkFBa0M7UUFDdkUsS0FBSyxFQUFFLENBQUM7UUFENkIscUJBQWdCLEdBQWhCLGdCQUFnQixDQUFrQjtRQWZqRSxhQUFRLEdBQUcsS0FBSyxDQUFDO1FBaUJ2QixJQUFJLENBQUMsT0FBTyxHQUFHLGdCQUFnQixDQUFDLE9BQU8sSUFBSSxJQUFJLENBQUM7UUFDaEQsTUFBTSxXQUFXLEdBQUcsSUFBSSxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsT0FBTyxDQUFDLENBQUM7UUFDNUMsSUFBSSxJQUFJLENBQUMsT0FBTyxHQUFHLENBQUMsSUFBSSxXQUFXLEdBQUcsQ0FBQyxJQUFJLFdBQVcsR0FBRyxFQUFFO1lBQ3ZELENBQUMsTUFBTSxDQUFDLFNBQVMsQ0FBQyxXQUFXLENBQUMsRUFBRTtZQUNsQyxNQUFNLElBQUksS0FBSyxDQUNYLG1EQUFtRDtnQkFDbkQsK0JBQStCLElBQUksQ0FBQyxPQUFPLEVBQUUsQ0FBQyxDQUFDO1NBQ3BEO1FBRUQsSUFBSSxDQUFDLFNBQVMsR0FBRyxnQkFBZ0IsQ0FBQyx1QkFBdUIsSUFBSSxFQUFFLENBQUM7UUFDaEUsSUFBSSxDQUFDLFlBQVksR0FBRyxnQkFBZ0IsQ0FBQyxZQUFZLENBQUM7UUFDbEQsSUFBSSxDQUFDLG9CQUFv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QztJQUVPLFlBQVksQ0FBQyxLQUFxQjtRQUN4QyxNQUFNLFNBQVMsR0FBRyxLQUFLLENBQUMsQ0FBQyxDQUFDLENBQUMsTUFBTSxDQUFDO1FBQ2xDLE1BQU0sUUFBUSxHQUFHLElBQUksWUFBWSxDQUFDLEtBQUssQ0FBQyxNQUFNLEdBQUcsU0FBUyxDQUFDLENBQUM7UUFDNUQsS0FBSyxDQUFDLE9BQU8sQ0FBQyxDQUFDLElBQUksRUFBRSxDQUFDLEVBQUUsRUFBRSxDQUFDLFFBQVEsQ0FBQyxHQUFHLENBQUMsSUFBSSxFQUFFLENBQUMsR0FBRyxTQUFTLENBQUMsQ0FBQyxDQUFDO1FBQzlELE9BQU8sUUFBUSxDQUFDO0lBQ2xCLENBQUM7SUFFTywyQkFBMkIsQ0FBQyxRQUFzQixFQUFFLEtBQWU7UUFFekUsTUFBTSxJQUFJLEdBQUcsSUFBSSxZQUFZLENBQUMsSUFBSSxDQUFDLGFBQWEsQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDO1FBQ3pELDRFQUE0RTtRQUM1RSxJQUFJLENBQUMsR0FBRyxDQUFDLFFBQVEsRUFBRSxJQUFJLENBQUMsTUFBTSxHQUFHLFFBQVEsQ0FBQyxNQUFNLENBQUMsQ0FBQztRQUNsRCxPQUFPLE1BQU0sQ0FBQyxJQUFJLEVBQUUsS0FBSyxDQUFDLENBQUM7SUFDN0IsQ0FBQztDQUNGIiwic291cmNlc0NvbnRlbnQiOlsiLyoqXG4gKiBAbGljZW5zZVxuICogQ29weXJpZ2h0IDIwMTkgR29vZ2xlIExMQy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC5cbiAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSBcIkxpY2Vuc2VcIik7XG4gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuXG4gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXRcbiAqXG4gKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjBcbiAqXG4gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlXG4gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiBcIkFTIElTXCIgQkFTSVMsXG4gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC5cbiAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmRcbiAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLlxuICpcbiAqID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4gKi9cblxuaW1wb3J0IHtlbnYsIFRlbnNvciwgdGVuc29yLCBUZW5zb3IyRCwgVGVuc29yM0QsIFRlbnNvckNvbnRhaW5lciwgdXRpbH0gZnJvbSAnQHRlbnNvcmZsb3cvdGZqcy1jb3JlJztcbmltcG9ydCB7TWljcm9waG9uZUNvbmZpZ30gZnJvbSAnLi4vdHlwZXMnO1xuaW1wb3J0IHtMYXp5SXRlcmF0b3J9IGZyb20gJy4vbGF6eV9pdGVyYXRvcic7XG5cbi8qKlxuICogUHJvdmlkZSBhIHN0cmVhbSBvZiB0ZW5zb3JzIGZyb20gbWljcm9waG9uZSBhdWRpbyBzdHJlYW0uIFRoZSB0ZW5zb3JzIGFyZVxuICogcmVwcmVzZW50aW5nIGF1ZGlvIGRhdGEgYXMgZnJlcXVlbmN5LWRvbWFpbiBzcGVjdHJvZ3JhbSBnZW5lcmF0ZWQgd2l0aFxuICogYnJvd3NlcidzIG5hdGl2ZSBGRlQuIFRlbnNvcnMgcmVwcmVzZW50aW5nIHRpbWUtZG9tYWluIHdhdmVmb3JtIGlzIGF2YWlsYWJsZVxuICogYmFzZWQgb24gY29uZmlndXJhdGlvbi4gT25seSB3b3JrcyBpbiBicm93c2VyIGVudmlyb25tZW50LlxuICovXG5leHBvcnQgY2xhc3MgTWljcm9waG9uZUl0ZXJhdG9yIGV4dGVuZHMgTGF6eUl0ZXJhdG9yPFRlbnNvckNvbnRhaW5lcj4ge1xuICBwcml2YXRlIGlzQ2xvc2VkID0gZmFsc2U7XG4gIHByaXZhdGUgc3RyZWFtOiBNZWRpYVN0cmVhbTtcbiAgcHJpdmF0ZSByZWFkb25seSBmZnRTaXplOiBudW1iZXI7XG4gIHByaXZhdGUgcmVhZG9ubHkgY29sdW1uVHJ1bmNhdGVMZW5ndGg6IG51bWJlcjtcbiAgcHJpdmF0ZSBmcmVxRGF0YTogRmxvYXQzMkFycmF5O1xuICBwcml2YXRlIHRpbWVEYXRhOiBGbG9hdDMyQXJyYXk7XG4gIHByaXZhdGUgcmVhZG9ubHkgbnVtRnJhbWVzOiBudW1iZXI7XG4gIHByaXZhdGUgYW5hbHlzZXI6IEFuYWx5c2VyTm9kZTtcbiAgcHJpdmF0ZSBhdWRpb0NvbnRleHQ6IEF1ZGlvQ29udGV4dDtcbiAgcHJpdmF0ZSBzYW1wbGVSYXRlSHo6IG51bWJlcjtcbiAgcHJpdmF0ZSByZWFkb25seSBhdWRpb1RyYWNrQ29uc3RyYWludHM6IE1lZGlhVHJhY2tDb25zdHJhaW50cztcbiAgcHJpdmF0ZSByZWFkb25seSBzbW9vdGhpbmdUaW1lQ29uc3RhbnQ6IG51bWJlcjtcbiAgcHJpdmF0ZSByZWFkb25seSBpbmNsdWRlU3BlY3Ryb2dyYW06IGJvb2xlYW47XG4gIHByaXZhdGUgcmVhZG9ubHkgaW5jbHVkZVdhdmVmb3JtOiBib29sZWFuO1xuXG4gIHByaXZhdGUgY29uc3RydWN0b3IocHJvdGVjdGVkIHJlYWRvbmx5IG1pY3JvcGhvbmVDb25maWc6IE1pY3JvcGhvbmVDb25maWcpIHtcbiAgICBzdXBlcigpO1xuICAgIHRoaXMuZmZ0U2l6ZSA9IG1pY3JvcGhvbmVDb25maWcuZmZ0U2l6ZSB8fCAxMDI0O1xuICAgIGNvbnN0IGZmdFNpemVMb2cyID0gTWF0aC5sb2cyKHRoaXMuZmZ0U2l6ZSk7XG4gICAgaWYgKHRoaXMuZmZ0U2l6ZSA8IDAgfHwgZmZ0U2l6ZUxvZzIgPCA0IHx8IGZmdFNpemVMb2cyID4gMTQgfHxcbiAgICAgICAgIU51bWJlci5pc0ludGVnZXIoZmZ0U2l6ZUxvZzIpKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoXG4gICAgICAgICAgYEludmFsaWQgZmZ0U2l6ZTogaXQgbXVzdCBiZSBhIHBvd2VyIG9mIDIgYmV0d2VlbiBgICtcbiAgICAgICAgICBgMiB0byA0IGFuZCAyIHRvIDE0LCBidXQgZ290ICR7dGhpcy5mZnRTaXplfWApO1xuICAgIH1cblxuICAgIHRoaXMubnVtRnJhbWVzID0gbWljcm9waG9uZUNvbmZpZy5udW1GcmFtZXNQZXJTcGVjdHJvZ3JhbSB8fCA0MztcbiAgICB0aGlzLnNhbXBsZVJhdGVIeiA9IG1pY3JvcGhvbmVDb25maWcuc2FtcGxlUmF0ZUh6O1xuICAgIHRoaXMuY29sdW1uVHJ1bmNhdGVMZW5ndGggPVxuICAgICAgICBtaWNyb3Bob25lQ29uZmlnLmNvbHVtblRydW5jYXRlTGVuZ3RoIHx8IHRoaXMuZmZ0U2l6ZTtcbiAgICB0aGlzLmF1ZGlvVHJhY2tDb25zdHJhaW50cyA9IG1pY3JvcGhvbmVDb25maWcuYXVkaW9UcmFja0NvbnN0cmFpbnRzO1xuICAgIHRoaXMuc21vb3RoaW5nVGltZUNvbnN0YW50ID0gbWljcm9waG9uZUNvbmZpZy5zbW9vdGhpbmdUaW1lQ29uc3RhbnQgfHwgMDtcblxuICAgIHRoaXMuaW5jbHVkZVNwZWN0cm9ncmFtID1cbiAgICAgICAgbWljcm9waG9uZUNvbmZpZy5pbmNsdWRlU3BlY3Ryb2dyYW0gPT09IGZhbHNlID8gZmFsc2UgOiB0cnVlO1xuICAgIHRoaXMuaW5jbHVkZVdhdmVmb3JtID1cbiAgICAgICAgbWljcm9waG9uZUNvbmZpZy5pbmNsdWRlV2F2ZWZvcm0gPT09IHRydWUgPyB0cnVlIDogZmFsc2U7XG4gICAgaWYgKCF0aGlzLmluY2x1ZGVTcGVjdHJvZ3JhbSAmJiAhdGhpcy5pbmNsdWRlV2F2ZWZvcm0pIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcihcbiAgICAgICAgICAnQm90aCBpbmNsdWRlU3BlY3Ryb2dyYW0gYW5kIGluY2x1ZGVXYXZlZm9ybSBhcmUgZmFsc2UuICcgK1xuICAgICAgICAgICdBdCBsZWFzdCBvbmUgdHlwZSBvZiBkYXRhIHNob3VsZCBiZSByZXR1cm5lZC4nKTtcbiAgICB9XG4gIH1cblxuICBzdW1tYXJ5KCkge1xuICAgIHJldHVybiBgbWljcm9waG9uZWA7XG4gIH1cblxuICAvLyBDb25zdHJ1Y3QgYSBNaWNyb3Bob25lSXRlcmF0b3IgYW5kIHN0YXJ0IHRoZSBhdWRpbyBzdHJlYW0uXG4gIHN0YXRpYyBhc3luYyBjcmVhdGUobWljcm9waG9uZUNvbmZpZzogTWljcm9waG9uZUNvbmZpZyA9IHt9KSB7XG4gICAgaWYgKCFlbnYoKS5nZXQoJ0lTX0JST1dTRVInKSkge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKFxuICAgICAgICAgICdtaWNyb3Bob25lIEFQSSBpcyBvbmx5IHN1cHBvcnRlZCBpbiBicm93c2VyIGVudmlyb25tZW50LicpO1xuICAgIH1cblxuICAgIGNvbnN0IG1pY3JvcGhvbmVJdGVyYXRvciA9IG5ldyBNaWNyb3Bob25lSXRlcmF0b3IobWljcm9waG9uZUNvbmZpZyk7XG5cbiAgICAvLyBDYWxsIGFzeW5jIGZ1bmN0aW9uIHN0YXJ0KCkgdG8gaW5pdGlhbGl6ZSB0aGUgYXVkaW8gc3RyZWFtLlxuICAgIGF3YWl0IG1pY3JvcGhvbmVJdGVyYXRvci5zdGFydCgpO1xuXG4gICAgcmV0dXJuIG1pY3JvcGhvbmVJdGVyYXRvcjtcbiAgfVxuXG4gIC8vIFN0YXJ0IHRoZSBhdWRpbyBzdHJlYW0gYW5kIEZGVC5cbiAgYXN5bmMgc3RhcnQoKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgdHJ5IHtcbiAgICAgIHRoaXMuc3RyZWFtID0gYXdhaXQgbmF2aWdhdG9yLm1lZGlhRGV2aWNlcy5nZXRVc2VyTWVkaWEoe1xuICAgICAgICBhdWRpbzogdGhpcy5hdWRpb1RyYWNrQ29uc3RyYWludHMgPT0gbnVsbCA/IHRydWUgOlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuYXVkaW9UcmFja0NvbnN0cmFpbnRzLFxuICAgICAgICB2aWRlbzogZmFsc2VcbiAgICAgIH0pO1xuICAgIH0gY2F0Y2ggKGUpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcihcbiAgICAgICAgICBgRXJyb3IgdGhyb3duIHdoaWxlIGluaXRpYWxpemluZyB2aWRlbyBzdHJlYW06ICR7ZS5tZXNzYWdlfWApO1xuICAgIH1cblxuICAgIGlmICghdGhpcy5zdHJlYW0pIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcignQ291bGQgbm90IG9idGFpbiBhdWRpbyBmcm9tIG1pY3JvcGhvbmUuJyk7XG4gICAgfVxuXG4gICAgY29uc3QgY3R4Q29uc3RydWN0b3IgPVxuICAgICAgICAvLyB0c2xpbnQ6ZGlzYWJsZS1uZXh0LWxpbmU6bm8tYW55XG4gICAgICAgICh3aW5kb3cgYXMgYW55KS5BdWRpb0NvbnRleHQgfHwgKHdpbmRvdyBhcyBhbnkpLndlYmtpdEF1ZGlvQ29udGV4dDtcbiAgICB0aGlzLmF1ZGlvQ29udGV4dCA9IG5ldyBjdHhDb25zdHJ1Y3RvcigpO1xuXG4gICAgaWYgKCF0aGlzLnNhbXBsZVJhdGVIeikge1xuICAgICAgLy8gSWYgc2FtcGxlIHJhdGUgaXMgbm90IHByb3ZpZGVkLCB1c2UgdGhlIGF2YWlsYWJsZSBzYW1wbGUgcmF0ZSBvblxuICAgICAgLy8gZGV2aWNlLlxuICAgICAgdGhpcy5zYW1wbGVSYXRlSHogPSB0aGlzLmF1ZGlvQ29udGV4dC5zYW1wbGVSYXRlO1xuICAgIH0gZWxzZSBpZiAodGhpcy5hdWRpb0NvbnRleHQuc2FtcGxlUmF0ZSAhPT0gdGhpcy5zYW1wbGVSYXRlSHopIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcihcbiAgICAgICAgICBgTWlzbWF0Y2ggaW4gc2FtcGxpbmcgcmF0ZTogYCArXG4gICAgICAgICAgYEV4cGVjdGVkOiAke3RoaXMuc2FtcGxlUmF0ZUh6fTsgYCArXG4gICAgICAgICAgYEFjdHVhbDogJHt0aGlzLmF1ZGlvQ29udGV4dC5zYW1wbGVSYXRlfWApO1xuICAgIH1cblxuICAgIGNvbnN0IHN0cmVhbVNvdXJjZSA9IHRoaXMuYXVkaW9Db250ZXh0LmNyZWF0ZU1lZGlhU3RyZWFtU291cmNlKHRoaXMuc3RyZWFtKTtcbiAgICB0aGlzLmFuYWx5c2VyID0gdGhpcy5hdWRpb0NvbnRleHQuY3JlYXRlQW5hbHlzZXIoKTtcbiAgICB0aGlzLmFuYWx5c2VyLmZmdFNpemUgPSB0aGlzLmZmdFNpemUgKiAyO1xuICAgIHRoaXMuYW5hbHlzZXIuc21vb3RoaW5nVGltZUNvbnN0YW50ID0gdGhpcy5zbW9vdGhpbmdUaW1lQ29uc3RhbnQ7XG4gICAgc3RyZWFtU291cmNlLmNvbm5lY3QodGhpcy5hbmFseXNlcik7XG4gICAgdGhpcy5mcmVxRGF0YSA9IG5ldyBGbG9hdDMyQXJyYXkodGhpcy5mZnRTaXplKTtcbiAgICB0aGlzLnRpbWVEYXRhID0gbmV3IEZsb2F0MzJBcnJheSh0aGlzLmZmdFNpemUpO1xuICAgIHJldHVybjtcbiAgfVxuXG4gIGFzeW5jIG5leHQoKTogUHJvbWlzZTxJdGVyYXRvclJlc3VsdDxUZW5zb3JDb250YWluZXI+PiB7XG4gICAgaWYgKHRoaXMuaXNDbG9zZWQpIHtcbiAgICAgIHJldHVybiB7dmFsdWU6IG51bGwsIGRvbmU6IHRydWV9O1xuICAgIH1cblxuICAgIGxldCBzcGVjdHJvZ3JhbVRlbnNvcjogVGVuc29yO1xuICAgIGxldCB3YXZlZm9ybVRlbnNvcjogVGVuc29yO1xuXG4gICAgY29uc3QgYXVkaW9EYXRhUXVldWUgPSBhd2FpdCB0aGlzLmdldEF1ZGlvRGF0YSgpO1xuICAgIGlmICh0aGlzLmluY2x1ZGVTcGVjdHJvZ3JhbSkge1xuICAgICAgY29uc3QgZnJlcURhdGEgPSB0aGlzLmZsYXR0ZW5RdWV1ZShhdWRpb0RhdGFRdWV1ZS5mcmVxRGF0YVF1ZXVlKTtcbiAgICAgIHNwZWN0cm9ncmFtVGVuc29yID0gdGhpcy5nZXRUZW5zb3JGcm9tQXVkaW9EYXRhQXJyYXkoXG4gICAgICAgICAgZnJlcURhdGEsIFt0aGlzLm51bUZyYW1lcywgdGhpcy5jb2x1bW5UcnVuY2F0ZUxlbmd0aCwgMV0pO1xuICAgIH1cbiAgICBpZiAodGhpcy5pbmNsdWRlV2F2ZWZvcm0pIHtcbiAgICAgIGNvbnN0IHRpbWVEYXRhID0gdGhpcy5mbGF0dGVuUXVldWUoYXVkaW9EYXRhUXVldWUudGltZURhdGFRdWV1ZSk7XG4gICAgICB3YXZlZm9ybVRlbnNvciA9IHRoaXMuZ2V0VGVuc29yRnJvbUF1ZGlvRGF0YUFycmF5KFxuICAgICAgICAgIHRpbWVEYXRhLCBbdGhpcy5udW1GcmFtZXMgKiB0aGlzLmZmdFNpemUsIDFdKTtcbiAgICB9XG5cbiAgICByZXR1cm4ge1xuICAgICAgdmFsdWU6IHsnc3BlY3Ryb2dyYW0nOiBzcGVjdHJvZ3JhbVRlbnNvciwgJ3dhdmVmb3JtJzogd2F2ZWZvcm1UZW5zb3J9LFxuICAgICAgZG9uZTogZmFsc2VcbiAgICB9O1xuICB9XG5cbiAgLy8gQ2FwdHVyZSBvbmUgcmVzdWx0IGZyb20gdGhlIGF1ZGlvIHN0cmVhbSwgYW5kIGV4dHJhY3QgdGhlIHZhbHVlIGZyb21cbiAgLy8gaXRlcmF0b3IubmV4dCgpIHJlc3VsdC5cbiAgYXN5bmMgY2FwdHVyZSgpOiBQcm9taXNlPHtzcGVjdHJvZ3JhbTogVGVuc29yM0QsIHdhdmVmb3JtOiBUZW5zb3IyRH0+IHtcbiAgICByZXR1cm4gKGF3YWl0IHRoaXMubmV4dCgpKS52YWx1ZSBhc1xuICAgICAgICB7c3BlY3Ryb2dyYW06IFRlbnNvcjNELCB3YXZlZm9ybTogVGVuc29yMkR9O1xuICB9XG5cbiAgcHJpdmF0ZSBhc3luYyBnZXRBdWRpb0RhdGEoKTpcbiAgICAgIFByb21pc2U8e2ZyZXFEYXRhUXVldWU6IEZsb2F0MzJBcnJheVtdLCB0aW1lRGF0YVF1ZXVlOiBGbG9hdDMyQXJyYXlbXX0+IHtcbiAgICBjb25zdCBmcmVxRGF0YVF1ZXVlOiBGbG9hdDMyQXJyYXlbXSA9IFtdO1xuICAgIGNvbnN0IHRpbWVEYXRhUXVldWU6IEZsb2F0MzJBcnJheVtdID0gW107XG4gICAgbGV0IGN1cnJlbnRGcmFtZXMgPSAwO1xuICAgIHJldHVybiBuZXcgUHJvbWlzZShyZXNvbHZlID0+IHtcbiAgICAgIGNvbnN0IGludGVydmFsSUQgPSBzZXRJbnRlcnZhbCgoKSA9PiB7XG4gICAgICAgIGlmICh0aGlzLmluY2x1ZGVTcGVjdHJvZ3JhbSkge1xuICAgICAgICAgIHRoaXMuYW5hbHlzZXIuZ2V0RmxvYXRGcmVxdWVuY3lEYXRhKHRoaXMuZnJlcURhdGEpO1xuICAgICAgICAgIC8vIElmIHRoZSBhdWRpbyBzdHJlYW0gaXMgaW5pdGlhbGl6aW5nLCByZXR1cm4gZW1wdHkgcXVldWUuXG4gICAgICAgICAgaWYgKHRoaXMuZnJlcURhdGFbMF0gPT09IC1JbmZpbml0eSkge1xuICAgICAgICAgICAgcmVzb2x2ZSh7ZnJlcURhdGFRdWV1ZSwgdGltZURhdGFRdWV1ZX0pO1xuICAgICAgICAgIH1cbiAgICAgICAgICBmcmVxRGF0YVF1ZXVlLnB1c2godGhpcy5mcmVxRGF0YS5zbGljZSgwLCB0aGlzLmNvbHVtblRydW5jYXRlTGVuZ3RoKSk7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKHRoaXMuaW5jbHVkZVdhdmVmb3JtKSB7XG4gICAgICAgICAgdGhpcy5hbmFseXNlci5nZXRGbG9hdFRpbWVEb21haW5EYXRhKHRoaXMudGltZURhdGEpO1xuICAgICAgICAgIHRpbWVEYXRhUXVldWUucHVzaCh0aGlzLnRpbWVEYXRhLnNsaWNlKCkpO1xuICAgICAgICB9XG5cbiAgICAgICAgLy8gQ2xlYW4gaW50ZXJ2YWwgYW5kIHJldHVybiB3aGVuIGFsbCBmcmFtZXMgaGF2ZSBiZWVuIGNvbGxlY3RlZFxuICAgICAgICBpZiAoKytjdXJyZW50RnJhbWVzID09PSB0aGlzLm51bUZyYW1lcykge1xuICAgICAgICAgIGNsZWFySW50ZXJ2YWwoaW50ZXJ2YWxJRCk7XG4gICAgICAgICAgcmVzb2x2ZSh7ZnJlcURhdGFRdWV1ZSwgdGltZURhdGFRdWV1ZX0pO1xuICAgICAgICB9XG4gICAgICB9LCB0aGlzLmZmdFNpemUgLyB0aGlzLnNhbXBsZVJhdGVIeiAqIDFlMyk7XG4gICAgfSk7XG4gIH1cblxuICAvLyBTdG9wIHRoZSBhdWRpbyBzdHJlYW0gYW5kIHBhdXNlIHRoZSBpdGVyYXRvci5cbiAgc3RvcCgpOiB2b2lkIHtcbiAgICBpZiAoIXRoaXMuaXNDbG9zZWQpIHtcbiAgICAgIHRoaXMuaXNDbG9zZWQgPSB0cnVlO1xuICAgICAgdGhpcy5hbmFseXNlci5kaXNjb25uZWN0KCk7XG4gICAgICB0aGlzLmF1ZGlvQ29udGV4dC5jbG9zZSgpO1xuICAgICAgaWYgKHRoaXMuc3RyZWFtICE9IG51bGwgJiYgdGhpcy5zdHJlYW0uZ2V0VHJhY2tzKCkubGVuZ3RoID4gMCkge1xuICAgICAgICB0aGlzLnN0cmVhbS5nZXRUcmFja3MoKVswXS5zdG9wKCk7XG4gICAgICB9XG4gICAgfVxuICB9XG5cbiAgLy8gT3ZlcnJpZGUgdG9BcnJheSgpIGZ1bmN0aW9uIHRvIHByZXZlbnQgY29sbGVjdGluZy5cbiAgdG9BcnJheSgpOiBQcm9taXNlPFRlbnNvcltdPiB7XG4gICAgdGhyb3cgbmV3IEVycm9yKCdDYW4gbm90IGNvbnZlcnQgaW5maW5pdGUgYXVkaW8gc3RyZWFtIHRvIGFycmF5LicpO1xuICB9XG5cbiAgLy8gUmV0dXJuIGF1ZGlvIHNhbXBsaW5nIHJhdGUgaW4gSHpcbiAgZ2V0U2FtcGxlUmF0ZSgpOiBudW1iZXIge1xuICAgIHJldHVybiB0aGlzLnNhbXBsZVJhdGVIejtcbiAgfVxuXG4gIHByaXZhdGUgZmxhdHRlblF1ZXVlKHF1ZXVlOiBGbG9hdDMyQXJyYXlbXSk6IEZsb2F0MzJBcnJheSB7XG4gICAgY29uc3QgZnJhbWVTaXplID0gcXVldWVbMF0ubGVuZ3RoO1xuICAgIGNvbnN0IGZyZXFEYXRhID0gbmV3IEZsb2F0MzJBcnJheShxdWV1ZS5sZW5ndGggKiBmcmFtZVNpemUpO1xuICAgIHF1ZXVlLmZvckVhY2goKGRhdGEsIGkpID0+IGZyZXFEYXRhLnNldChkYXRhLCBpICogZnJhbWVTaXplKSk7XG4gICAgcmV0dXJuIGZyZXFEYXRhO1xuICB9XG5cbiAgcHJpdmF0ZSBnZXRUZW5zb3JGcm9tQXVkaW9EYXRhQXJyYXkoZnJlcURhdGE6IEZsb2F0MzJBcnJheSwgc2hhcGU6IG51bWJlcltdKTpcbiAgICAgIFRlbnNvciB7XG4gICAgY29uc3QgdmFscyA9IG5ldyBGbG9hdDMyQXJyYXkodXRpbC5zaXplRnJvbVNoYXBlKHNoYXBlKSk7XG4gICAgLy8gSWYgdGhlIGRhdGEgaXMgbGVzcyB0aGFuIHRoZSBvdXRwdXQgc2hhcGUsIHRoZSByZXN0IGlzIHBhZGRlZCB3aXRoIHplcm9zLlxuICAgIHZhbHMuc2V0KGZyZXFEYXRhLCB2YWxzLmxlbmd0aCAtIGZyZXFEYXRhLmxlbmd0aCk7XG4gICAgcmV0dXJuIHRlbnNvcih2YWxzLCBzaGFwZSk7XG4gIH1cbn1cbiJdfQ==","/**\n * @license\n * Copyright 2018 Google LLC. All Rights Reserved.\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n *\n * =============================================================================\n */\nimport { browser, cast, env, expandDims, image, reshape, tensor1d, tensor2d, tidy, util } from '@tensorflow/tfjs-core';\nimport { LazyIterator } from './lazy_iterator';\n/**\n * Provide a stream of image tensors from webcam video stream. Only works in\n * browser environment.\n */\nexport class WebcamIterator extends LazyIterator {\n constructor(webcamVideoElement, webcamConfig) {\n super();\n this.webcamVideoElement = webcamVideoElement;\n this.webcamConfig = webcamConfig;\n this.isClosed = true;\n this.resize = false;\n if (this.needToResize()) {\n this.resize = true;\n this.cropSize =\n [this.webcamConfig.resizeHeight, this.webcamConfig.resizeWidth];\n this.cropBoxInd = tensor1d([0], 'int32');\n if (this.webcamConfig.centerCrop) {\n // Calculate the box based on resizing shape.\n const widthCroppingRatio = this.webcamConfig.resizeWidth * 1.0 / this.webcamVideoElement.width;\n const heightCroppingRatio = this.webcamConfig.resizeHeight * 1.0 /\n this.webcamVideoElement.height;\n const widthCropStart = (1 - widthCroppingRatio) / 2;\n const heightCropStart = (1 - heightCroppingRatio) / 2;\n const widthCropEnd = widthCropStart + widthCroppingRatio;\n const heightCropEnd = heightCroppingRatio + heightCropStart;\n this.cropBox = tensor2d([heightCropStart, widthCropStart, heightCropEnd, widthCropEnd], [1, 4]);\n }\n else {\n this.cropBox = tensor2d([0, 0, 1, 1], [1, 4]);\n }\n }\n }\n summary() {\n return `webcam`;\n }\n // Construct a WebcamIterator and start it's video stream.\n static async create(webcamVideoElement, webcamConfig = {}) {\n if (!env().get('IS_BROWSER')) {\n throw new Error('tf.data.webcam is only supported in browser environment.');\n }\n if (!webcamVideoElement) {\n // If webcam video element is not provided, create a hidden video element\n // with provided width and height.\n webcamVideoElement = document.createElement('video');\n if (!webcamConfig.resizeWidth || !webcamConfig.resizeHeight) {\n throw new Error('Please provide webcam video element, or resizeWidth and ' +\n 'resizeHeight to create a hidden video element.');\n }\n webcamVideoElement.width = webcamConfig.resizeWidth;\n webcamVideoElement.height = webcamConfig.resizeHeight;\n }\n const webcamIterator = new WebcamIterator(webcamVideoElement, webcamConfig);\n // Call async function to initialize the video stream.\n await webcamIterator.start();\n return webcamIterator;\n }\n // Async function to start video stream.\n async start() {\n if (this.webcamConfig.facingMode) {\n util.assert((this.webcamConfig.facingMode === 'user') ||\n (this.webcamConfig.facingMode === 'environment'), () => `Invalid webcam facing mode: ${this.webcamConfig.facingMode}. ` +\n `Please provide 'user' or 'environment'`);\n }\n try {\n this.stream = await navigator.mediaDevices.getUserMedia({\n video: {\n deviceId: this.webcamConfig.deviceId,\n facingMode: this.webcamConfig.facingMode ?\n this.webcamConfig.facingMode :\n 'user',\n width: this.webcamVideoElement.width,\n height: this.webcamVideoElement.height\n }\n });\n }\n catch (e) {\n // Modify the error message but leave the stack trace intact\n e.message = `Error thrown while initializing video stream: ${e.message}`;\n throw e;\n }\n if (!this.stream) {\n throw new Error('Could not obtain video from webcam.');\n }\n // Older browsers may not have srcObject\n try {\n this.webcamVideoElement.srcObject = this.stream;\n }\n catch (error) {\n console.log(error);\n this.webcamVideoElement.src = window.URL.createObjectURL(this.stream);\n }\n // Start the webcam video stream\n this.webcamVideoElement.play();\n this.isClosed = false;\n return new Promise(resolve => {\n // Add event listener to make sure the webcam has been fully initialized.\n this.webcamVideoElement.onloadedmetadata = () => {\n resolve();\n };\n });\n }\n async next() {\n if (this.isClosed) {\n return { value: null, done: true };\n }\n let img;\n try {\n img = browser.fromPixels(this.webcamVideoElement);\n }\n catch (e) {\n throw new Error(`Error thrown converting video to pixels: ${JSON.stringify(e)}`);\n }\n if (this.resize) {\n try {\n return { value: this.cropAndResizeFrame(img), done: false };\n }\n catch (e) {\n throw new Error(`Error thrown cropping the video: ${e.message}`);\n }\n finally {\n img.dispose();\n }\n }\n else {\n return { value: img, done: false };\n }\n }\n needToResize() {\n // If resizeWidth and resizeHeight are provided, and different from the\n // width and height of original HTMLVideoElement, then resizing and cropping\n // is required.\n if (this.webcamConfig.resizeWidth && this.webcamConfig.resizeHeight &&\n (this.webcamVideoElement.width !== this.webcamConfig.resizeWidth ||\n this.webcamVideoElement.height !== this.webcamConfig.resizeHeight)) {\n return true;\n }\n return false;\n }\n // Cropping and resizing each frame based on config\n cropAndResizeFrame(img) {\n return tidy(() => {\n const expandedImage = expandDims(cast(img, 'float32'), (0));\n let resizedImage;\n resizedImage = image.cropAndResize(expandedImage, this.cropBox, this.cropBoxInd, this.cropSize, 'bilinear');\n // Extract image from batch cropping.\n const shape = resizedImage.shape;\n return reshape(resizedImage, shape.slice(1));\n });\n }\n // Capture one frame from the video stream, and extract the value from\n // iterator.next() result.\n async capture() {\n return (await this.next()).value;\n }\n // Stop the video stream and pause webcam iterator.\n stop() {\n const tracks = this.stream.getTracks();\n tracks.forEach(track => track.stop());\n try {\n this.webcamVideoElement.srcObject = null;\n }\n catch (error) {\n console.log(error);\n this.webcamVideoElement.src = null;\n }\n this.isClosed = true;\n }\n // Override toArray() function to prevent collecting.\n toArray() {\n throw new Error('Can not convert infinite video stream to array.');\n }\n}\n//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoid2ViY2FtX2l0ZXJhdG9yLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vLi4vdGZqcy1kYXRhL3NyYy9pdGVyYXRvcnMvd2ViY2FtX2l0ZXJhdG9yLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBOzs7Ozs7Ozs7Ozs7Ozs7O0dBZ0JHO0FBRUgsT0FBTyxFQUFDLE9BQU8sRUFBRSxJQUFJLEVBQUUsR0FBRyxFQUFFLFVBQVUsRUFBRSxLQUFLLEVBQUUsT0FBTyxFQUFFLFFBQVEsRUFBWSxRQUFRLEVBQWdDLElBQUksRUFBRSxJQUFJLEVBQUMsTUFBTSx1QkFBdUIsQ0FBQztBQUU3SixPQUFPLEVBQUMsWUFBWSxFQUFDLE1BQU0saUJBQWlCLENBQUM7QUFFN0M7OztHQUdHO0FBQ0gsTUFBTSxPQUFPLGNBQWUsU0FBUSxZQUFzQjtJQVF4RCxZQUN1QixrQkFBb0MsRUFDcEMsWUFBMEI7UUFDL0MsS0FBSyxFQUFFLENBQUM7UUFGYSx1QkFBa0IsR0FBbEIsa0JBQWtCLENBQWtCO1FBQ3BDLGlCQUFZLEdBQVosWUFBWSxDQUFjO1FBVHpDLGFBQVEsR0FBRyxJQUFJLENBQUM7UUFFaEIsV0FBTSxHQUFHLEtBQUssQ0FBQztRQVNyQixJQUFJLElBQUksQ0FBQyxZQUFZLEVBQUUsRUFBRTtZQUN2QixJQUFJLENBQUMsTUFBTSxHQUFHLElBQUksQ0FBQztZQUNuQixJQUFJLENBQUMsUUFBUTtnQkFDVCxDQUFDLElBQUksQ0FBQyxZQUFZLENBQUMsWUFBWSxFQUFFLElBQUksQ0FBQyxZQUFZLENBQUMsV0FBVyxDQUFDLENBQUM7WUFDcEUsSUFBSSxDQUFDLFVBQVUsR0FBRyxRQUFRLENBQUMsQ0FBQyxDQUFDLENBQUMsRUFBRSxPQUFPLENBQUMsQ0FBQztZQUN6QyxJQUFJLElBQUksQ0FBQyxZQUFZLENBQUMsVUFBVSxFQUFFO2dCQUNoQyw2Q0FBNkM7Z0JBQzdDLE1BQU0sa0JBQWtCLEdBQ3BCLElBQUksQ0FBQyxZQUFZLENBQUMsV0FBVyxHQUFHLEdBQUcsR0FBRyxJQUFJLENBQUMsa0JBQWtCLENBQUMsS0FBSyxDQUFDO2dCQUN4RSxNQUFNLG1CQUFtQixHQUFHLElBQUksQ0FBQyxZQUFZLENBQUMsWUFBWSxHQUFHLEdBQUc7b0JBQzVELElBQUksQ0FBQyxrQkFBa0IsQ0FBQyxNQUFNLENBQUM7Z0JBQ25DLE1BQU0sY0FBYyxHQUFHLENBQUMsQ0FBQyxHQUFHLGtCQUFrQixDQUFDLEdBQUcsQ0FBQyxDQUFDO2dCQUNwRCxNQUFNLGVBQWUsR0FBRyxDQUFDLENBQUMsR0FBRyxtQkFBbUIsQ0FBQyxHQUFHLENBQUMsQ0FBQztnQkFDdEQsTUFBTSxZQUFZLEdBQUcsY0FBYyxHQUFHLGtCQUFrQixDQUFDO2dCQUN6RCxNQUFNLGFBQWEsR0FBRyxtQkFBbUIsR0FBRyxlQUFlLENBQUM7Z0JBQzVELElBQUksQ0FBQyxPQUFPLEdBQUcsUUFBUSxDQUNuQixDQUFDLGVBQWUsRUFBRSxjQUFjLEVBQUUsYUFBYSxFQUFFLFlBQVksQ0FBQyxFQUM5RCxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxDQUFDO2FBQ2I7aUJBQU07Z0JBQ0wsSUFBSSxDQUFDLE9BQU8sR0FBRyxRQUFRLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxDQUFDO2FBQy9DO1NBQ0Y7SUFDSCxDQUFDO0lBRUQsT0FBTztRQUNMLE9BQU8sUUFBUSxDQUFDO0lBQ2xCLENBQUM7SUFFRCwwREFBMEQ7SUFDMUQsTUFBTSxDQUFDLEtBQUssQ0FBQyxNQUFNLENBQ2Ysa0JBQXFDLEVBQUUsZUFBNkIsRUFBRTtRQUN4RSxJQUFJLENBQUMsR0FBRyxFQUFFLENBQUMsR0FBRyxDQUFDLFlBQVksQ0FBQyxFQUFFO1lBQzVCLE1BQU0sSUFBSSxLQUFLLENBQ1gsMERBQTBELENBQUMsQ0FBQztTQUNqRTtRQUVELElBQUksQ0FBQyxrQkFBa0IsRUFBRTtZQUN2Qix5RUFBeUU7WUFDekUsa0NBQWtDO1lBQ2xDLGtCQUFrQixHQUFHLFFBQVEsQ0FBQyxhQUFhLENBQUMsT0FBTyxDQUFDLENBQUM7WUFDckQsSUFBSSxDQUFDLFlBQVksQ0FBQyxXQUFXLElBQUksQ0FBQyxZQUFZLENBQUMsWUFBWSxFQUFFO2dCQUMzRCxNQUFNLElBQUksS0FBSyxDQUNYLDBEQUEwRDtvQkFDMUQsZ0RBQWdELENBQUMsQ0FBQzthQUN2RDtZQUNELGtCQUFrQixDQUFDLEtBQUssR0FBRyxZQUFZLENBQUMsV0FBVyxDQUFDO1lBQ3BELGtCQUFrQixDQUFDLE1BQU0sR0FBRyxZQUFZLENBQUMsWUFBWSxDQUFDO1NBQ3ZEO1FBQ0QsTUFBTSxjQUFjLEdBQUcsSUFBSSxjQUFjLENBQUMsa0JBQWtCLEVBQUUsWUFBWSxDQUFDLENBQUM7UUFFNUUsc0RBQXNEO1FBQ3RELE1BQU0sY0FBYyxDQUFDLEtBQUssRUFBRSxDQUFDO1FBRTdCLE9BQU8sY0FBYyxDQUFDO0lBQ3hCLENBQUM7SUFFRCx3Q0FBd0M7SUFDeEMsS0FBSyxDQUFDLEtBQUs7UUFDVCxJQUFJLElBQUksQ0FBQyxZQUFZLENBQUMsVUFBVSxFQUFFO1lBQ2hDLElBQUksQ0FBQyxNQUFNLENBQ1AsQ0FBQyxJQUFJLENBQUMsWUFBWSxDQUFDLFVBQVUsS0FBSyxNQUFNLENBQUM7Z0JBQ3JDLENBQUMsSUFBSSxDQUFDLFlBQVksQ0FBQyxVQUFVLEtBQUssYUFBYSxDQUFDLEVBQ3BELEdBQUcsRUFBRSxDQUNELCtCQUErQixJQUFJLENBQUMsWUFBWSxDQUFDLFVBQVUsSUFBSTtnQkFDL0Qsd0NBQXdDLENBQUMsQ0FBQztTQUNuRDtRQUVELElBQUk7WUFDRixJQUFJLENBQUMsTUFBTSxHQUFHLE1BQU0sU0FBUyxDQUFDLFlBQVksQ0FBQyxZQUFZLENBQUM7Z0JBQ3RELEtBQUssRUFBRTtvQkFDTCxRQUFRLEVBQUUsSUFBSSxDQUFDLFlBQVksQ0FBQyxRQUFRO29CQUNwQyxVQUFVLEVBQUUsSUFBSSxDQUFDLFlBQVksQ0FBQyxVQUFVLENBQUMsQ0FBQzt3QkFDdEMsSUFBSSxDQUFDLFlBQVksQ0FBQyxVQUFVLENBQUMsQ0FBQzt3QkFDOUIsTUFBTTtvQkFDVixLQUFLLEVBQUUsSUFBSSxDQUFDLGtCQUFrQixDQUFDLEtBQUs7b0JBQ3BDLE1BQU0sRUFBRSxJQUFJLENBQUMsa0JBQWtCLENBQUMsTUFBTTtpQkFDdkM7YUFDRixDQUFDLENBQUM7U0FDSjtRQUFDLE9BQU8sQ0FBQyxFQUFFO1lBQ1YsNERBQTREO1lBQzVELENBQUMsQ0FBQyxPQUFPLEdBQUcsaURBQWlELENBQUMsQ0FBQyxPQUFPLEVBQUUsQ0FBQztZQUN6RSxNQUFNLENBQUMsQ0FBQztTQUNUO1FBRUQsSUFBSSxDQUFDLElBQUksQ0FBQyxNQUFNLEVBQUU7WUFDaEIsTUFBTSxJQUFJLEtBQUssQ0FBQyxxQ0FBcUMsQ0FBQyxDQUFDO1NBQ3hEO1FBRUQsd0NBQXdDO1FBQ3hDLElBQUk7WUFDRixJQUFJLENBQUMsa0JBQWtCLENBQUMsU0FBUyxHQUFHLElBQUksQ0FBQyxNQUFNLENBQUM7U0FDakQ7UUFBQyxPQUFPLEtBQUssRUFBRTtZQUNkLE9BQU8sQ0FBQyxHQUFHLENBQUMsS0FBSyxDQUFDLENBQUM7WUFDbkIsSUFBSSxDQUFDLGtCQUFrQixDQUFDLEdBQUcsR0FBRyxNQUFNLENBQUMsR0FBRyxDQUFDLGVBQWUsQ0FBQyxJQUFJLENBQUMsTUFBTSxDQUFDLENBQUM7U0FDdkU7UUFDRCxnQ0FBZ0M7UUFDaEMsSUFBSSxDQUFDLGtCQUFrQixDQUFDLElBQUksRUFBRSxDQUFDO1FBRS9CLElBQUksQ0FBQyxRQUFRLEdBQUcsS0FBSyxDQUFDO1FBRXRCLE9BQU8sSUFBSSxPQUFPLENBQU8sT0FBTyxDQUFDLEVBQUU7WUFDakMseUVBQXlFO1lBQ3pFLElBQUksQ0FBQyxrQkFBa0IsQ0FBQyxnQkFBZ0IsR0FBRyxHQUFHLEVBQUU7Z0JBQzlDLE9BQU8sRUFBRSxDQUFDO1lBQ1osQ0FBQyxDQUFDO1FBQ0osQ0FBQyxDQUFDLENBQUM7SUFDTCxDQUFDO0lBRUQsS0FBSyxDQUFDLElBQUk7UUFDUixJQUFJLElBQUksQ0FBQyxRQUFRLEVBQUU7WUFDakIsT0FBTyxFQUFDLEtBQUssRUFBRSxJQUFJLEVBQUUsSUFBSSxFQUFFLElBQUksRUFBQyxDQUFDO1NBQ2xDO1FBRUQsSUFBSSxHQUFHLENBQUM7UUFDUixJQUFJO1lBQ0YsR0FBRyxHQUFHLE9BQU8sQ0FBQyxVQUFVLENBQUMsSUFBSSxDQUFDLGtCQUFrQixDQUFDLENBQUM7U0FDbkQ7UUFBQyxPQUFPLENBQUMsRUFBRTtZQUNWLE1BQU0sSUFBSSxLQUFLLENBQ1gsNENBQTRDLElBQUksQ0FBQyxTQUFTLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDO1NBQ3RFO1FBQ0QsSUFBSSxJQUFJLENBQUMsTUFBTSxFQUFFO1lBQ2YsSUFBSTtnQkFDRixPQUFPLEVBQUMsS0FBSyxFQUFFLElBQUksQ0FBQyxrQkFBa0IsQ0FBQyxHQUFHLENBQUMsRUFBRSxJQUFJLEVBQUUsS0FBSyxFQUFDLENBQUM7YUFDM0Q7WUFBQyxPQUFPLENBQUMsRUFBRTtnQkFDVixNQUFNLElBQUksS0FBSyxDQUFDLG9DQUFvQyxDQUFDLENBQUMsT0FBTyxFQUFFLENBQUMsQ0FBQzthQUNsRTtvQkFBUztnQkFDUixHQUFHLENBQUMsT0FBTyxFQUFFLENBQUM7YUFDZjtTQUNGO2FBQU07WUFDTCxPQUFPLEVBQUMsS0FBSyxFQUFFLEdBQUcsRUFBRSxJQUFJLEVBQUUsS0FBSyxFQUFDLENBQUM7U0FDbEM7SUFDSCxDQUFDO0lBRU8sWUFBWTtRQUNsQix1RUFBdUU7UUFDdkUsNEVBQTRFO1FBQzVFLGVBQWU7UUFDZixJQUFJLElBQUksQ0FBQyxZQUFZLENBQUMsV0FBVyxJQUFJLElBQUksQ0FBQyxZQUFZLENBQUMsWUFBWTtZQUMvRCxDQUFDLElBQUksQ0FBQyxrQkFBa0IsQ0FBQyxLQUFLLEtBQUssSUFBSSxDQUFDLFlBQVksQ0FBQyxXQUFXO2dCQUMvRCxJQUFJLENBQUMsa0JBQWtCLENBQUMsTUFBTSxLQUFLLElBQUksQ0FBQyxZQUFZLENBQUMsWUFBWSxDQUFDLEVBQUU7WUFDdkUsT0FBTyxJQUFJLENBQUM7U0FDYjtRQUNELE9BQU8sS0FBSyxDQUFDO0lBQ2YsQ0FBQztJQUVELG1EQUFtRDtJQUNuRCxrQkFBa0IsQ0FBQyxHQUFhO1FBQzlCLE9BQU8sSUFBSSxDQUFDLEdBQUcsRUFBRTtZQUNmLE1BQU0sYUFBYSxHQUFhLFVBQVUsQ0FBQyxJQUFJLENBQUMsR0FBRyxFQUFFLFNBQVMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQztZQUN0RSxJQUFJLFlBQVksQ0FBQztZQUNqQixZQUFZLEdBQUcsS0FBSyxDQUFDLGFBQWEsQ0FDOUIsYUFBYSxFQUFFLElBQUksQ0FBQyxPQUFPLEVBQUUsSUFBSSxDQUFDLFVBQVUsRUFBRSxJQUFJLENBQUMsUUFBUSxFQUMzRCxVQUFVLENBQUMsQ0FBQztZQUNoQixxQ0FBcUM7WUFDckMsTUFBTSxLQUFLLEdBQUcsWUFBWSxDQUFDLEtBQUssQ0FBQztZQUNqQyxPQUFPLE9BQU8sQ0FBQyxZQUFZLEVBQUUsS0FBSyxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQTZCLENBQUMsQ0FBQztRQUMzRSxDQUFDLENBQUMsQ0FBQztJQUNMLENBQUM7SUFFRCxzRUFBc0U7SUFDdEUsMEJBQTBCO0lBQzFCLEtBQUssQ0FBQyxPQUFPO1FBQ1gsT0FBTyxDQUFDLE1BQU0sSUFBSSxDQUFDLElBQUksRUFBRSxDQUFDLENBQUMsS0FBSyxDQUFDO0lBQ25DLENBQUM7SUFFRCxtREFBbUQ7SUFDbkQsSUFBSTtRQUNGLE1BQU0sTUFBTSxHQUFHLElBQUksQ0FBQyxNQUFNLENBQUMsU0FBUyxFQUFFLENBQUM7UUFFdkMsTUFBTSxDQUFDLE9BQU8sQ0FBQyxLQUFLLENBQUMsRUFBRSxDQUFDLEtBQUssQ0FBQyxJQUFJLEVBQUUsQ0FBQyxDQUFDO1FBRXRDLElBQUk7WUFDRixJQUFJLENBQUMsa0JBQWtCLENBQUMsU0FBUyxHQUFHLElBQUksQ0FBQztTQUMxQztRQUFDLE9BQU8sS0FBSyxFQUFFO1lBQ2QsT0FBTyxDQUFDLEdBQUcsQ0FBQyxLQUFLLENBQUMsQ0FBQztZQUNuQixJQUFJLENBQUMsa0JBQWtCLENBQUMsR0FBRyxHQUFHLElBQUksQ0FBQztTQUNwQztRQUNELElBQUksQ0FBQyxRQUFRLEdBQUcsSUFBSSxDQUFDO0lBQ3ZCLENBQUM7SUFFRCxxREFBcUQ7SUFDckQsT0FBTztRQUNMLE1BQU0sSUFBSSxLQUFLLENBQUMsaURBQWlELENBQUMsQ0FBQztJQUNyRSxDQUFDO0NBQ0YiLCJzb3VyY2VzQ29udGVudCI6WyIvKipcbiAqIEBsaWNlbnNlXG4gKiBDb3B5cmlnaHQgMjAxOCBHb29nbGUgTExDLiBBbGwgUmlnaHRzIFJlc2VydmVkLlxuICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlIFwiTGljZW5zZVwiKTtcbiAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS5cbiAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdFxuICpcbiAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMFxuICpcbiAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmVcbiAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuIFwiQVMgSVNcIiBCQVNJUyxcbiAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLlxuICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZFxuICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuXG4gKlxuICogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbiAqL1xuXG5pbXBvcnQge2Jyb3dzZXIsIGNhc3QsIGVudiwgZXhwYW5kRGltcywgaW1hZ2UsIHJlc2hhcGUsIHRlbnNvcjFkLCBUZW5zb3IxRCwgdGVuc29yMmQsIFRlbnNvcjJELCBUZW5zb3IzRCwgVGVuc29yNEQsIHRpZHksIHV0aWx9IGZyb20gJ0B0ZW5zb3JmbG93L3RmanMtY29yZSc7XG5pbXBvcnQge1dlYmNhbUNvbmZpZ30gZnJvbSAnLi4vdHlwZXMnO1xuaW1wb3J0IHtMYXp5SXRlcmF0b3J9IGZyb20gJy4vbGF6eV9pdGVyYXRvcic7XG5cbi8qKlxuICogUHJvdmlkZSBhIHN0cmVhbSBvZiBpbWFnZSB0ZW5zb3JzIGZyb20gd2ViY2FtIHZpZGVvIHN0cmVhbS4gT25seSB3b3JrcyBpblxuICogYnJvd3NlciBlbnZpcm9ubWVudC5cbiAqL1xuZXhwb3J0IGNsYXNzIFdlYmNhbUl0ZXJhdG9yIGV4dGVuZHMgTGF6eUl0ZXJhdG9yPFRlbnNvcjNEPiB7XG4gIHByaXZhdGUgaXNDbG9zZWQgPSB0cnVlO1xuICBwcml2YXRlIHN0cmVhbTogTWVkaWFTdHJlYW07XG4gIHByaXZhdGUgcmVzaXplID0gZmFsc2U7XG4gIHByaXZhdGUgY3JvcFNpemU6IFtudW1iZXIsIG51bWJlcl07XG4gIHByaXZhdGUgY3JvcEJveDogVGVuc29yMkQ7XG4gIHByaXZhdGUgY3JvcEJveEluZDogVGVuc29yMUQ7XG5cbiAgcHJpdmF0ZSBjb25zdHJ1Y3RvcihcbiAgICAgIHByb3RlY3RlZCByZWFkb25seSB3ZWJjYW1WaWRlb0VsZW1lbnQ6IEhUTUxWaWRlb0VsZW1lbnQsXG4gICAgICBwcm90ZWN0ZWQgcmVhZG9ubHkgd2ViY2FtQ29uZmlnOiBXZWJjYW1Db25maWcpIHtcbiAgICBzdXBlcigpO1xuICAgIGlmICh0aGlzLm5lZWRUb1Jlc2l6ZSgpKSB7XG4gICAgICB0aGlzLnJlc2l6ZSA9IHRydWU7XG4gICAgICB0aGlzLmNyb3BTaXplID1cbiAgICAgICAgICBbdGhpcy53ZWJjYW1Db25maWcucmVzaXplSGVpZ2h0LCB0aGlzLndlYmNhbUNvbmZpZy5yZXNpemVXaWR0aF07XG4gICAgICB0aGlzLmNyb3BCb3hJbmQgPSB0ZW5zb3IxZChbMF0sICdpbnQzMicpO1xuICAgICAgaWYgKHRoaXMud2ViY2FtQ29uZmlnLmNlbnRlckNyb3ApIHtcbiAgICAgICAgLy8gQ2FsY3VsYXRlIHRoZSBib3ggYmFzZWQgb24gcmVzaXppbmcgc2hhcGUuXG4gICAgICAgIGNvbnN0IHdpZHRoQ3JvcHBpbmdSYXRpbyA9XG4gICAgICAgICAgICB0aGlzLndlYmNhbUNvbmZpZy5yZXNpemVXaWR0aCAqIDEuMCAvIHRoaXMud2ViY2FtVmlkZW9FbGVtZW50LndpZHRoO1xuICAgICAgICBjb25zdCBoZWlnaHRDcm9wcGluZ1JhdGlvID0gdGhpcy53ZWJjYW1Db25maWcucmVzaXplSGVpZ2h0ICogMS4wIC9cbiAgICAgICAgICAgIHRoaXMud2ViY2FtVmlkZW9FbGVtZW50LmhlaWdodDtcbiAgICAgICAgY29uc3Qgd2lkdGhDcm9wU3RhcnQgPSAoMSAtIHdpZHRoQ3JvcHBpbmdSYXRpbykgLyAyO1xuICAgICAgICBjb25zdCBoZWlnaHRDcm9wU3RhcnQgPSAoMSAtIGhlaWdodENyb3BwaW5nUmF0aW8pIC8gMjtcbiAgICAgICAgY29uc3Qgd2lkdGhDcm9wRW5kID0gd2lkdGhDcm9wU3RhcnQgKyB3aWR0aENyb3BwaW5nUmF0aW87XG4gICAgICAgIGNvbnN0IGhlaWdodENyb3BFbmQgPSBoZWlnaHRDcm9wcGluZ1JhdGlvICsgaGVpZ2h0Q3JvcFN0YXJ0O1xuICAgICAgICB0aGlzLmNyb3BCb3ggPSB0ZW5zb3IyZChcbiAgICAgICAgICAgIFtoZWlnaHRDcm9wU3RhcnQsIHdpZHRoQ3JvcFN0YXJ0LCBoZWlnaHRDcm9wRW5kLCB3aWR0aENyb3BFbmRdLFxuICAgICAgICAgICAgWzEsIDRdKTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHRoaXMuY3JvcEJveCA9IHRlbnNvcjJkKFswLCAwLCAxLCAxXSwgWzEsIDRdKTtcbiAgICAgIH1cbiAgICB9XG4gIH1cblxuICBzdW1tYXJ5KCkge1xuICAgIHJldHVybiBgd2ViY2FtYDtcbiAgfVxuXG4gIC8vIENvbnN0cnVjdCBhIFdlYmNhbUl0ZXJhdG9yIGFuZCBzdGFydCBpdCdzIHZpZGVvIHN0cmVhbS5cbiAgc3RhdGljIGFzeW5jIGNyZWF0ZShcbiAgICAgIHdlYmNhbVZpZGVvRWxlbWVudD86IEhUTUxWaWRlb0VsZW1lbnQsIHdlYmNhbUNvbmZpZzogV2ViY2FtQ29uZmlnID0ge30pIHtcbiAgICBpZiAoIWVudigpLmdldCgnSVNfQlJPV1NFUicpKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoXG4gICAgICAgICAgJ3RmLmRhdGEud2ViY2FtIGlzIG9ubHkgc3VwcG9ydGVkIGluIGJyb3dzZXIgZW52aXJvbm1lbnQuJyk7XG4gICAgfVxuXG4gICAgaWYgKCF3ZWJjYW1WaWRlb0VsZW1lbnQpIHtcbiAgICAgIC8vIElmIHdlYmNhbSB2aWRlbyBlbGVtZW50IGlzIG5vdCBwcm92aWRlZCwgY3JlYXRlIGEgaGlkZGVuIHZpZGVvIGVsZW1lbnRcbiAgICAgIC8vIHdpdGggcHJvdmlkZWQgd2lkdGggYW5kIGhlaWdodC5cbiAgICAgIHdlYmNhbVZpZGVvRWxlbWVudCA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ3ZpZGVvJyk7XG4gICAgICBpZiAoIXdlYmNhbUNvbmZpZy5yZXNpemVXaWR0aCB8fCAhd2ViY2FtQ29uZmlnLnJlc2l6ZUhlaWdodCkge1xuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoXG4gICAgICAgICAgICAnUGxlYXNlIHByb3ZpZGUgd2ViY2FtIHZpZGVvIGVsZW1lbnQsIG9yIHJlc2l6ZVdpZHRoIGFuZCAnICtcbiAgICAgICAgICAgICdyZXNpemVIZWlnaHQgdG8gY3JlYXRlIGEgaGlkZGVuIHZpZGVvIGVsZW1lbnQuJyk7XG4gICAgICB9XG4gICAgICB3ZWJjYW1WaWRlb0VsZW1lbnQud2lkdGggPSB3ZWJjYW1Db25maWcucmVzaXplV2lkdGg7XG4gICAgICB3ZWJjYW1WaWRlb0VsZW1lbnQuaGVpZ2h0ID0gd2ViY2FtQ29uZmlnLnJlc2l6ZUhlaWdodDtcbiAgICB9XG4gICAgY29uc3Qgd2ViY2FtSXRlcmF0b3IgPSBuZXcgV2ViY2FtSXRlcmF0b3Iod2ViY2FtVmlkZW9FbGVtZW50LCB3ZWJjYW1Db25maWcpO1xuXG4gICAgLy8gQ2FsbCBhc3luYyBmdW5jdGlvbiB0byBpbml0aWFsaXplIHRoZSB2aWRlbyBzdHJlYW0uXG4gICAgYXdhaXQgd2ViY2FtSXRlcmF0b3Iuc3RhcnQoKTtcblxuICAgIHJldHVybiB3ZWJjYW1JdGVyYXRvcjtcbiAgfVxuXG4gIC8vIEFzeW5jIGZ1bmN0aW9uIHRvIHN0YXJ0IHZpZGVvIHN0cmVhbS5cbiAgYXN5bmMgc3RhcnQoKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgaWYgKHRoaXMud2ViY2FtQ29uZmlnLmZhY2luZ01vZGUpIHtcbiAgICAgIHV0aWwuYXNzZXJ0KFxuICAgICAgICAgICh0aGlzLndlYmNhbUNvbmZpZy5mYWNpbmdNb2RlID09PSAndXNlcicpIHx8XG4gICAgICAgICAgICAgICh0aGlzLndlYmNhbUNvbmZpZy5mYWNpbmdNb2RlID09PSAnZW52aXJvbm1lbnQnKSxcbiAgICAgICAgICAoKSA9PlxuICAgICAgICAgICAgICBgSW52YWxpZCB3ZWJjYW0gZmFjaW5nIG1vZGU6ICR7dGhpcy53ZWJjYW1Db25maWcuZmFjaW5nTW9kZX0uIGAgK1xuICAgICAgICAgICAgICBgUGxlYXNlIHByb3ZpZGUgJ3VzZXInIG9yICdlbnZpcm9ubWVudCdgKTtcbiAgICB9XG5cbiAgICB0cnkge1xuICAgICAgdGhpcy5zdHJlYW0gPSBhd2FpdCBuYXZpZ2F0b3IubWVkaWFEZXZpY2VzLmdldFVzZXJNZWRpYSh7XG4gICAgICAgIHZpZGVvOiB7XG4gICAgICAgICAgZGV2aWNlSWQ6IHRoaXMud2ViY2FtQ29uZmlnLmRldmljZUlkLFxuICAgICAgICAgIGZhY2luZ01vZGU6IHRoaXMud2ViY2FtQ29uZmlnLmZhY2luZ01vZGUgP1xuICAgICAgICAgICAgICB0aGlzLndlYmNhbUNvbmZpZy5mYWNpbmdNb2RlIDpcbiAgICAgICAgICAgICAgJ3VzZXInLFxuICAgICAgICAgIHdpZHRoOiB0aGlzLndlYmNhbVZpZGVvRWxlbWVudC53aWR0aCxcbiAgICAgICAgICBoZWlnaHQ6IHRoaXMud2ViY2FtVmlkZW9FbGVtZW50LmhlaWdodFxuICAgICAgICB9XG4gICAgICB9KTtcbiAgICB9IGNhdGNoIChlKSB7XG4gICAgICAvLyBNb2RpZnkgdGhlIGVycm9yIG1lc3NhZ2UgYnV0IGxlYXZlIHRoZSBzdGFjayB0cmFjZSBpbnRhY3RcbiAgICAgIGUubWVzc2FnZSA9IGBFcnJvciB0aHJvd24gd2hpbGUgaW5pdGlhbGl6aW5nIHZpZGVvIHN0cmVhbTogJHtlLm1lc3NhZ2V9YDtcbiAgICAgIHRocm93IGU7XG4gICAgfVxuXG4gICAgaWYgKCF0aGlzLnN0cmVhbSkge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKCdDb3VsZCBub3Qgb2J0YWluIHZpZGVvIGZyb20gd2ViY2FtLicpO1xuICAgIH1cblxuICAgIC8vIE9sZGVyIGJyb3dzZXJzIG1heSBub3QgaGF2ZSBzcmNPYmplY3RcbiAgICB0cnkge1xuICAgICAgdGhpcy53ZWJjYW1WaWRlb0VsZW1lbnQuc3JjT2JqZWN0ID0gdGhpcy5zdHJlYW07XG4gICAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICAgIGNvbnNvbGUubG9nKGVycm9yKTtcbiAgICAgIHRoaXMud2ViY2FtVmlkZW9FbGVtZW50LnNyYyA9IHdpbmRvdy5VUkwuY3JlYXRlT2JqZWN0VVJMKHRoaXMuc3RyZWFtKTtcbiAgICB9XG4gICAgLy8gU3RhcnQgdGhlIHdlYmNhbSB2aWRlbyBzdHJlYW1cbiAgICB0aGlzLndlYmNhbVZpZGVvRWxlbWVudC5wbGF5KCk7XG5cbiAgICB0aGlzLmlzQ2xvc2VkID0gZmFsc2U7XG5cbiAgICByZXR1cm4gbmV3IFByb21pc2U8dm9pZD4ocmVzb2x2ZSA9PiB7XG4gICAgICAvLyBBZGQgZXZlbnQgbGlzdGVuZXIgdG8gbWFrZSBzdXJlIHRoZSB3ZWJjYW0gaGFzIGJlZW4gZnVsbHkgaW5pdGlhbGl6ZWQuXG4gICAgICB0aGlzLndlYmNhbVZpZGVvRWxlbWVudC5vbmxvYWRlZG1ldGFkYXRhID0gKCkgPT4ge1xuICAgICAgICByZXNvbHZlKCk7XG4gICAgICB9O1xuICAgIH0pO1xuICB9XG5cbiAgYXN5bmMgbmV4dCgpOiBQcm9taXNlPEl0ZXJhdG9yUmVzdWx0PFRlbnNvcjNEPj4ge1xuICAgIGlmICh0aGlzLmlzQ2xvc2VkKSB7XG4gICAgICByZXR1cm4ge3ZhbHVlOiBudWxsLCBkb25lOiB0cnVlfTtcbiAgICB9XG5cbiAgICBsZXQgaW1nO1xuICAgIHRyeSB7XG4gICAgICBpbWcgPSBicm93c2VyLmZyb21QaXhlbHModGhpcy53ZWJjYW1WaWRlb0VsZW1lbnQpO1xuICAgIH0gY2F0Y2ggKGUpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcihcbiAgICAgICAgICBgRXJyb3IgdGhyb3duIGNvbnZlcnRpbmcgdmlkZW8gdG8gcGl4ZWxzOiAke0pTT04uc3RyaW5naWZ5KGUpfWApO1xuICAgIH1cbiAgICBpZiAodGhpcy5yZXNpemUpIHtcbiAgICAgIHRyeSB7XG4gICAgICAgIHJldHVybiB7dmFsdWU6IHRoaXMuY3JvcEFuZFJlc2l6ZUZyYW1lKGltZyksIGRvbmU6IGZhbHNlfTtcbiAgICAgIH0gY2F0Y2ggKGUpIHtcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKGBFcnJvciB0aHJvd24gY3JvcHBpbmcgdGhlIHZpZGVvOiAke2UubWVzc2FnZX1gKTtcbiAgICAgIH0gZmluYWxseSB7XG4gICAgICAgIGltZy5kaXNwb3NlKCk7XG4gICAgICB9XG4gICAgfSBlbHNlIHtcbiAgICAgIHJldHVybiB7dmFsdWU6IGltZywgZG9uZTogZmFsc2V9O1xuICAgIH1cbiAgfVxuXG4gIHByaXZhdGUgbmVlZFRvUmVzaXplKCkge1xuICAgIC8vIElmIHJlc2l6ZVdpZHRoIGFuZCByZXNpemVIZWlnaHQgYXJlIHByb3ZpZGVkLCBhbmQgZGlmZmVyZW50IGZyb20gdGhlXG4gICAgLy8gd2lkdGggYW5kIGhlaWdodCBvZiBvcmlnaW5hbCBIVE1MVmlkZW9FbGVtZW50LCB0aGVuIHJlc2l6aW5nIGFuZCBjcm9wcGluZ1xuICAgIC8vIGlzIHJlcXVpcmVkLlxuICAgIGlmICh0aGlzLndlYmNhbUNvbmZpZy5yZXNpemVXaWR0aCAmJiB0aGlzLndlYmNhbUNvbmZpZy5yZXNpemVIZWlnaHQgJiZcbiAgICAgICAgKHRoaXMud2ViY2FtVmlkZW9FbGVtZW50LndpZHRoICE9PSB0aGlzLndlYmNhbUNvbmZpZy5yZXNpemVXaWR0aCB8fFxuICAgICAgICAgdGhpcy53ZWJjYW1WaWRlb0VsZW1lbnQuaGVpZ2h0ICE9PSB0aGlzLndlYmNhbUNvbmZpZy5yZXNpemVIZWlnaHQpKSB7XG4gICAgICByZXR1cm4gdHJ1ZTtcbiAgICB9XG4gICAgcmV0dXJuIGZhbHNlO1xuICB9XG5cbiAgLy8gQ3JvcHBpbmcgYW5kIHJlc2l6aW5nIGVhY2ggZnJhbWUgYmFzZWQgb24gY29uZmlnXG4gIGNyb3BBbmRSZXNpemVGcmFtZShpbWc6IFRlbnNvcjNEKTogVGVuc29yM0Qge1xuICAgIHJldHVybiB0aWR5KCgpID0+IHtcbiAgICAgIGNvbnN0IGV4cGFuZGVkSW1hZ2U6IFRlbnNvcjREID0gZXhwYW5kRGltcyhjYXN0KGltZywgJ2Zsb2F0MzInKSwgKDApKTtcbiAgICAgIGxldCByZXNpemVkSW1hZ2U7XG4gICAgICByZXNpemVkSW1hZ2UgPSBpbWFnZS5jcm9wQW5kUmVzaXplKFxuICAgICAgICAgIGV4cGFuZGVkSW1hZ2UsIHRoaXMuY3JvcEJveCwgdGhpcy5jcm9wQm94SW5kLCB0aGlzLmNyb3BTaXplLFxuICAgICAgICAgICdiaWxpbmVhcicpO1xuICAgICAgLy8gRXh0cmFjdCBpbWFnZSBmcm9tIGJhdGNoIGNyb3BwaW5nLlxuICAgICAgY29uc3Qgc2hhcGUgPSByZXNpemVkSW1hZ2Uuc2hhcGU7XG4gICAgICByZXR1cm4gcmVzaGFwZShyZXNpemVkSW1hZ2UsIHNoYXBlLnNsaWNlKDEpIGFzIFtudW1iZXIsIG51bWJlciwgbnVtYmVyXSk7XG4gICAgfSk7XG4gIH1cblxuICAvLyBDYXB0dXJlIG9uZSBmcmFtZSBmcm9tIHRoZSB2aWRlbyBzdHJlYW0sIGFuZCBleHRyYWN0IHRoZSB2YWx1ZSBmcm9tXG4gIC8vIGl0ZXJhdG9yLm5leHQoKSByZXN1bHQuXG4gIGFzeW5jIGNhcHR1cmUoKTogUHJvbWlzZTxUZW5zb3IzRD4ge1xuICAgIHJldHVybiAoYXdhaXQgdGhpcy5uZXh0KCkpLnZhbHVlO1xuICB9XG5cbiAgLy8gU3RvcCB0aGUgdmlkZW8gc3RyZWFtIGFuZCBwYXVzZSB3ZWJjYW0gaXRlcmF0b3IuXG4gIHN0b3AoKTogdm9pZCB7XG4gICAgY29uc3QgdHJhY2tzID0gdGhpcy5zdHJlYW0uZ2V0VHJhY2tzKCk7XG5cbiAgICB0cmFja3MuZm9yRWFjaCh0cmFjayA9PiB0cmFjay5zdG9wKCkpO1xuXG4gICAgdHJ5IHtcbiAgICAgIHRoaXMud2ViY2FtVmlkZW9FbGVtZW50LnNyY09iamVjdCA9IG51bGw7XG4gICAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICAgIGNvbnNvbGUubG9nKGVycm9yKTtcbiAgICAgIHRoaXMud2ViY2FtVmlkZW9FbGVtZW50LnNyYyA9IG51bGw7XG4gICAgfVxuICAgIHRoaXMuaXNDbG9zZWQgPSB0cnVlO1xuICB9XG5cbiAgLy8gT3ZlcnJpZGUgdG9BcnJheSgpIGZ1bmN0aW9uIHRvIHByZXZlbnQgY29sbGVjdGluZy5cbiAgdG9BcnJheSgpOiBQcm9taXNlPFRlbnNvcjNEW10+IHtcbiAgICB0aHJvdyBuZXcgRXJyb3IoJ0NhbiBub3QgY29udmVydCBpbmZpbml0ZSB2aWRlbyBzdHJlYW0gdG8gYXJyYXkuJyk7XG4gIH1cbn1cbiJdfQ==","/**\n * @license\n * Copyright 2018 Google LLC. All Rights Reserved.\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n *\n * =============================================================================\n */\n/**\n * Represents a data source readable as a stream of binary data chunks.\n *\n * Because `Dataset`s can be read repeatedly (via `Dataset.iterator()`), this\n * provides a means to repeatedly create streams from the underlying data\n * sources.\n */\nexport class DataSource {\n}\n// TODO(soergel): consider convenience factory functions here\n// in combination with chainable source->dataset above, e.g.:\n// tf.data.url(...).asCsvDataset().shuffle().batch()\n//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZGF0YXNvdXJjZS5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uL3RmanMtZGF0YS9zcmMvZGF0YXNvdXJjZS50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQTs7Ozs7Ozs7Ozs7Ozs7OztHQWdCRztBQUlIOzs7Ozs7R0FNRztBQUNILE1BQU0sT0FBZ0IsVUFBVTtDQVUvQjtBQUVELDZEQUE2RDtBQUM3RCw2REFBNkQ7QUFDN0Qsb0RBQW9EIiwic291cmNlc0NvbnRlbnQiOlsiLyoqXG4gKiBAbGljZW5zZVxuICogQ29weXJpZ2h0IDIwMTggR29vZ2xlIExMQy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC5cbiAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSBcIkxpY2Vuc2VcIik7XG4gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuXG4gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXRcbiAqXG4gKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjBcbiAqXG4gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlXG4gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiBcIkFTIElTXCIgQkFTSVMsXG4gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC5cbiAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmRcbiAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLlxuICpcbiAqID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4gKi9cblxuaW1wb3J0IHtCeXRlQ2h1bmtJdGVyYXRvcn0gZnJvbSAnLi9pdGVyYXRvcnMvYnl0ZV9jaHVua19pdGVyYXRvcic7XG5cbi8qKlxuICogUmVwcmVzZW50cyBhIGRhdGEgc291cmNlIHJlYWRhYmxlIGFzIGEgc3RyZWFtIG9mIGJpbmFyeSBkYXRhIGNodW5rcy5cbiAqXG4gKiBCZWNhdXNlIGBEYXRhc2V0YHMgY2FuIGJlIHJlYWQgcmVwZWF0ZWRseSAodmlhIGBEYXRhc2V0Lml0ZXJhdG9yKClgKSwgdGhpc1xuICogcHJvdmlkZXMgYSBtZWFucyB0byByZXBlYXRlZGx5IGNyZWF0ZSBzdHJlYW1zIGZyb20gdGhlIHVuZGVybHlpbmcgZGF0YVxuICogc291cmNlcy5cbiAqL1xuZXhwb3J0IGFic3RyYWN0IGNsYXNzIERhdGFTb3VyY2Uge1xuICAvKipcbiAgICogT2J0YWluIGEgbmV3IHN0cmVhbSBvZiBiaW5hcnkgZGF0YSBjaHVua3MuXG4gICAqXG4gICAqIFN0YXJ0cyB0aGUgbmV3IHN0cmVhbSBmcm9tIHRoZSBiZWdpbm5pbmcgb2YgdGhlIGRhdGEgc291cmNlLCBldmVuIGlmIG90aGVyXG4gICAqIHN0cmVhbXMgaGF2ZSBiZWVuIG9idGFpbmVkIHByZXZpb3VzbHkuXG4gICAqL1xuICBhYnN0cmFjdCBhc3luYyBpdGVyYXRvcigpOiBQcm9taXNlPEJ5dGVDaHVua0l0ZXJhdG9yPjtcblxuICAvLyBUT0RPKHNvZXJnZWwpOiBjb25zaWRlciBjaGFpbmFibGUgRGF0YXNldCBjb25zdHJ1Y3Rpb24gaGVyZVxufVxuXG4vLyBUT0RPKHNvZXJnZWwpOiBjb25zaWRlciBjb252ZW5pZW5jZSBmYWN0b3J5IGZ1bmN0aW9ucyBoZXJlXG4vLyBpbiBjb21iaW5hdGlvbiB3aXRoIGNoYWluYWJsZSBzb3VyY2UtPmRhdGFzZXQgYWJvdmUsIGUuZy46XG4vLyB0Zi5kYXRhLnVybCguLi4pLmFzQ3N2RGF0YXNldCgpLnNodWZmbGUoKS5iYXRjaCgpXG4iXX0=","/**\n * @license\n * Copyright 2018 Google LLC. All Rights Reserved.\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n *\n * =============================================================================\n */\nimport { LazyIterator, OneToManyIterator } from './lazy_iterator';\nexport class StringIterator extends LazyIterator {\n /**\n * Splits a string stream on a given separator.\n *\n * It is assumed that the incoming chunk boundaries have no semantic meaning,\n * so conceptually the incoming stream is treated simply as the concatenation\n * of its elements.\n *\n * The outgoing stream provides chunks corresponding to the results of the\n * standard string split() operation (even if such a chunk spanned incoming\n * chunks). The separators are not included.\n *\n * A typical usage is to split a text file (represented as a stream with\n * arbitrary chunk boundaries) into lines.\n *\n * @param upstream A readable stream of strings that can be treated as\n * concatenated.\n * @param separator A character to split on.\n */\n split(separator) {\n return new SplitIterator(this, separator);\n }\n}\n// ============================================================================\n// The following private classes serve to implement the chainable methods\n// on StringIterator. Unfortunately they can't be placed in separate files, due\n// to resulting trouble with circular imports.\n// ============================================================================\n// We wanted multiple inheritance, e.g.\n// class SplitIterator extends QueueIterator, StringIterator\n// but the TypeScript mixin approach is a bit hacky, so we take this adapter\n// approach instead.\nclass SplitIterator extends StringIterator {\n constructor(upstream, separator) {\n super();\n this.upstream = upstream;\n this.impl = new SplitIteratorImpl(upstream, separator);\n }\n summary() {\n return this.impl.summary();\n }\n async next() {\n return this.impl.next();\n }\n}\nclass SplitIteratorImpl extends OneToManyIterator {\n constructor(upstream, separator) {\n super();\n this.upstream = upstream;\n this.separator = separator;\n // A partial string at the end of an upstream chunk\n this.carryover = '';\n }\n summary() {\n return `${this.upstream.summary()} -> Split('${this.separator}')`;\n }\n async pump() {\n const chunkResult = await this.upstream.next();\n if (chunkResult.done) {\n if (this.carryover === '') {\n return false;\n }\n // Pretend that the pump succeeded in order to emit the small last batch.\n // The next pump() call will actually fail.\n this.outputQueue.push(this.carryover);\n this.carryover = '';\n return true;\n }\n const lines = chunkResult.value.split(this.separator);\n // Note the behavior: \" ab \".split(' ') === ['', 'ab', '']\n // Thus the carryover may be '' if the separator falls on a chunk\n // boundary; this produces the correct result.\n lines[0] = this.carryover + lines[0];\n for (const line of lines.slice(0, -1)) {\n this.outputQueue.push(line);\n }\n this.carryover = lines[lines.length - 1];\n return true;\n }\n}\n//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic3RyaW5nX2l0ZXJhdG9yLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vLi4vdGZqcy1kYXRhL3NyYy9pdGVyYXRvcnMvc3RyaW5nX2l0ZXJhdG9yLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBOzs7Ozs7Ozs7Ozs7Ozs7O0dBZ0JHO0FBRUgsT0FBTyxFQUFDLFlBQVksRUFBRSxpQkFBaUIsRUFBQyxNQUFNLGlCQUFpQixDQUFDO0FBRWhFLE1BQU0sT0FBZ0IsY0FBZSxTQUFRLFlBQW9CO0lBQy9EOzs7Ozs7Ozs7Ozs7Ozs7OztPQWlCRztJQUNILEtBQUssQ0FBQyxTQUFpQjtRQUNyQixPQUFPLElBQUksYUFBYSxDQUFDLElBQUksRUFBRSxTQUFTLENBQUMsQ0FBQztJQUM1QyxDQUFDO0NBQ0Y7QUFFRCwrRUFBK0U7QUFDL0UseUVBQXlFO0FBQ3pFLGdGQUFnRjtBQUNoRiw4Q0FBOEM7QUFDOUMsK0VBQStFO0FBRS9FLHVDQUF1QztBQUN2QyxzRUFBc0U7QUFDdEUsNEVBQTRFO0FBQzVFLG9CQUFvQjtBQUVwQixNQUFNLGFBQWMsU0FBUSxjQUFjO0lBR3hDLFlBQXNCLFFBQThCLEVBQUUsU0FBaUI7UUFDckUsS0FBSyxFQUFFLENBQUM7UUFEWSxhQUFRLEdBQVIsUUFBUSxDQUFzQjtRQUVsRCxJQUFJLENBQUMsSUFBSSxHQUFHLElBQUksaUJBQWlCLENBQUMsUUFBUSxFQUFFLFNBQVMsQ0FBQyxDQUFDO0lBQ3pELENBQUM7SUFFRCxPQUFPO1FBQ0wsT0FBTyxJQUFJLENBQUMsSUFBSSxDQUFDLE9BQU8sRUFBRSxDQUFDO0lBQzdCLENBQUM7SUFFRCxLQUFLLENBQUMsSUFBSTtRQUNSLE9BQU8sSUFBSSxDQUFDLElBQUksQ0FBQyxJQUFJLEVBQUUsQ0FBQztJQUMxQixDQUFDO0NBQ0Y7QUFFRCxNQUFNLGlCQUFrQixTQUFRLGlCQUF5QjtJQUl2RCxZQUNjLFFBQThCLEVBQVksU0FBaUI7UUFDdkUsS0FBSyxFQUFFLENBQUM7UUFESSxhQUFRLEdBQVIsUUFBUSxDQUFzQjtRQUFZLGNBQVMsR0FBVCxTQUFTLENBQVE7UUFKekUsbURBQW1EO1FBQ25ELGNBQVMsR0FBRyxFQUFFLENBQUM7SUFLZixDQUFDO0lBRUQsT0FBTztRQUNMLE9BQU8sR0FBRyxJQUFJLENBQUMsUUFBUSxDQUFDLE9BQU8sRUFBRSxjQUFjLElBQUksQ0FBQyxTQUFTLElBQUksQ0FBQztJQUNwRSxDQUFDO0lBRUQsS0FBSyxDQUFDLElBQUk7UUFDUixNQUFNLFdBQVcsR0FBRyxNQUFNLElBQUksQ0FBQyxRQUFRLENBQUMsSUFBSSxFQUFFLENBQUM7UUFDL0MsSUFBSSxXQUFXLENBQUMsSUFBSSxFQUFFO1lBQ3BCLElBQUksSUFBSSxDQUFDLFNBQVMsS0FBSyxFQUFFLEVBQUU7Z0JBQ3pCLE9BQU8sS0FBSyxDQUFDO2FBQ2Q7WUFFRCx5RUFBeUU7WUFDekUsMkNBQTJDO1lBQzNDLElBQUksQ0FBQyxXQUFXLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxTQUFTLENBQUMsQ0FBQztZQUN0QyxJQUFJLENBQUMsU0FBUyxHQUFHLEVBQUUsQ0FBQztZQUNwQixPQUFPLElBQUksQ0FBQztTQUNiO1FBQ0QsTUFBTSxLQUFLLEdBQUcsV0FBVyxDQUFDLEtBQUssQ0FBQyxLQUFLLENBQUMsSUFBSSxDQUFDLFNBQVMsQ0FBQyxDQUFDO1FBQ3RELDBEQUEwRDtRQUMxRCxpRUFBaUU7UUFDakUsOENBQThDO1FBRTlDLEtBQUssQ0FBQyxDQUFDLENBQUMsR0FBRyxJQUFJLENBQUMsU0FBUyxHQUFHLEtBQUssQ0FBQyxDQUFDLENBQUMsQ0FBQztRQUNyQyxLQUFLLE1BQU0sSUFBSSxJQUFJLEtBQUssQ0FBQyxLQUFLLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLEVBQUU7WUFDckMsSUFBSSxDQUFDLFdBQVcsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLENBQUM7U0FDN0I7UUFDRCxJQUFJLENBQUMsU0FBUyxHQUFHLEtBQUssQ0FBQyxLQUFLLENBQUMsTUFBTSxHQUFHLENBQUMsQ0FBQyxDQUFDO1FBRXpDLE9BQU8sSUFBSSxDQUFDO0lBQ2QsQ0FBQztDQUNGIiwic291cmNlc0NvbnRlbnQiOlsiLyoqXG4gKiBAbGljZW5zZVxuICogQ29weXJpZ2h0IDIwMTggR29vZ2xlIExMQy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC5cbiAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSBcIkxpY2Vuc2VcIik7XG4gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuXG4gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXRcbiAqXG4gKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjBcbiAqXG4gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlXG4gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiBcIkFTIElTXCIgQkFTSVMsXG4gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC5cbiAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmRcbiAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLlxuICpcbiAqID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4gKi9cblxuaW1wb3J0IHtMYXp5SXRlcmF0b3IsIE9uZVRvTWFueUl0ZXJhdG9yfSBmcm9tICcuL2xhenlfaXRlcmF0b3InO1xuXG5leHBvcnQgYWJzdHJhY3QgY2xhc3MgU3RyaW5nSXRlcmF0b3IgZXh0ZW5kcyBMYXp5SXRlcmF0b3I8c3RyaW5nPiB7XG4gIC8qKlxuICAgKiBTcGxpdHMgYSBzdHJpbmcgc3RyZWFtIG9uIGEgZ2l2ZW4gc2VwYXJhdG9yLlxuICAgKlxuICAgKiBJdCBpcyBhc3N1bWVkIHRoYXQgdGhlIGluY29taW5nIGNodW5rIGJvdW5kYXJpZXMgaGF2ZSBubyBzZW1hbnRpYyBtZWFuaW5nLFxuICAgKiBzbyBjb25jZXB0dWFsbHkgdGhlIGluY29taW5nIHN0cmVhbSBpcyB0cmVhdGVkIHNpbXBseSBhcyB0aGUgY29uY2F0ZW5hdGlvblxuICAgKiBvZiBpdHMgZWxlbWVudHMuXG4gICAqXG4gICAqIFRoZSBvdXRnb2luZyBzdHJlYW0gcHJvdmlkZXMgY2h1bmtzIGNvcnJlc3BvbmRpbmcgdG8gdGhlIHJlc3VsdHMgb2YgdGhlXG4gICAqIHN0YW5kYXJkIHN0cmluZyBzcGxpdCgpIG9wZXJhdGlvbiAoZXZlbiBpZiBzdWNoIGEgY2h1bmsgc3Bhbm5lZCBpbmNvbWluZ1xuICAgKiBjaHVua3MpLiAgVGhlIHNlcGFyYXRvcnMgYXJlIG5vdCBpbmNsdWRlZC5cbiAgICpcbiAgICogQSB0eXBpY2FsIHVzYWdlIGlzIHRvIHNwbGl0IGEgdGV4dCBmaWxlIChyZXByZXNlbnRlZCBhcyBhIHN0cmVhbSB3aXRoXG4gICAqIGFyYml0cmFyeSBjaHVuayBib3VuZGFyaWVzKSBpbnRvIGxpbmVzLlxuICAgKlxuICAgKiBAcGFyYW0gdXBzdHJlYW0gQSByZWFkYWJsZSBzdHJlYW0gb2Ygc3RyaW5ncyB0aGF0IGNhbiBiZSB0cmVhdGVkIGFzXG4gICAqICAgY29uY2F0ZW5hdGVkLlxuICAgKiBAcGFyYW0gc2VwYXJhdG9yIEEgY2hhcmFjdGVyIHRvIHNwbGl0IG9uLlxuICAgKi9cbiAgc3BsaXQoc2VwYXJhdG9yOiBzdHJpbmcpOiBTdHJpbmdJdGVyYXRvciB7XG4gICAgcmV0dXJuIG5ldyBTcGxpdEl0ZXJhdG9yKHRoaXMsIHNlcGFyYXRvcik7XG4gIH1cbn1cblxuLy8gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuLy8gVGhlIGZvbGxvd2luZyBwcml2YXRlIGNsYXNzZXMgc2VydmUgdG8gaW1wbGVtZW50IHRoZSBjaGFpbmFibGUgbWV0aG9kc1xuLy8gb24gU3RyaW5nSXRlcmF0b3IuICBVbmZvcnR1bmF0ZWx5IHRoZXkgY2FuJ3QgYmUgcGxhY2VkIGluIHNlcGFyYXRlIGZpbGVzLCBkdWVcbi8vIHRvIHJlc3VsdGluZyB0cm91YmxlIHdpdGggY2lyY3VsYXIgaW1wb3J0cy5cbi8vID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cblxuLy8gV2Ugd2FudGVkIG11bHRpcGxlIGluaGVyaXRhbmNlLCBlLmcuXG4vLyAgIGNsYXNzIFNwbGl0SXRlcmF0b3IgZXh0ZW5kcyBRdWV1ZUl0ZXJhdG9yPHN0cmluZz4sIFN0cmluZ0l0ZXJhdG9yXG4vLyBidXQgdGhlIFR5cGVTY3JpcHQgbWl4aW4gYXBwcm9hY2ggaXMgYSBiaXQgaGFja3ksIHNvIHdlIHRha2UgdGhpcyBhZGFwdGVyXG4vLyBhcHByb2FjaCBpbnN0ZWFkLlxuXG5jbGFzcyBTcGxpdEl0ZXJhdG9yIGV4dGVuZHMgU3RyaW5nSXRlcmF0b3Ige1xuICBwcml2YXRlIGltcGw6IFNwbGl0SXRlcmF0b3JJbXBsO1xuXG4gIGNvbnN0cnVjdG9yKHByb3RlY3RlZCB1cHN0cmVhbTogTGF6eUl0ZXJhdG9yPHN0cmluZz4sIHNlcGFyYXRvcjogc3RyaW5nKSB7XG4gICAgc3VwZXIoKTtcbiAgICB0aGlzLmltcGwgPSBuZXcgU3BsaXRJdGVyYXRvckltcGwodXBzdHJlYW0sIHNlcGFyYXRvcik7XG4gIH1cblxuICBzdW1tYXJ5KCkge1xuICAgIHJldHVybiB0aGlzLmltcGwuc3VtbWFyeSgpO1xuICB9XG5cbiAgYXN5bmMgbmV4dCgpIHtcbiAgICByZXR1cm4gdGhpcy5pbXBsLm5leHQoKTtcbiAgfVxufVxuXG5jbGFzcyBTcGxpdEl0ZXJhdG9ySW1wbCBleHRlbmRzIE9uZVRvTWFueUl0ZXJhdG9yPHN0cmluZz4ge1xuICAvLyBBIHBhcnRpYWwgc3RyaW5nIGF0IHRoZSBlbmQgb2YgYW4gdXBzdHJlYW0gY2h1bmtcbiAgY2FycnlvdmVyID0gJyc7XG5cbiAgY29uc3RydWN0b3IoXG4gICAgICBwcm90ZWN0ZWQgdXBzdHJlYW06IExhenlJdGVyYXRvcjxzdHJpbmc+LCBwcm90ZWN0ZWQgc2VwYXJhdG9yOiBzdHJpbmcpIHtcbiAgICBzdXBlcigpO1xuICB9XG5cbiAgc3VtbWFyeSgpIHtcbiAgICByZXR1cm4gYCR7dGhpcy51cHN0cmVhbS5zdW1tYXJ5KCl9IC0+IFNwbGl0KCcke3RoaXMuc2VwYXJhdG9yfScpYDtcbiAgfVxuXG4gIGFzeW5jIHB1bXAoKTogUHJvbWlzZTxib29sZWFuPiB7XG4gICAgY29uc3QgY2h1bmtSZXN1bHQgPSBhd2FpdCB0aGlzLnVwc3RyZWFtLm5leHQoKTtcbiAgICBpZiAoY2h1bmtSZXN1bHQuZG9uZSkge1xuICAgICAgaWYgKHRoaXMuY2FycnlvdmVyID09PSAnJykge1xuICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICB9XG5cbiAgICAgIC8vIFByZXRlbmQgdGhhdCB0aGUgcHVtcCBzdWNjZWVkZWQgaW4gb3JkZXIgdG8gZW1pdCB0aGUgc21hbGwgbGFzdCBiYXRjaC5cbiAgICAgIC8vIFRoZSBuZXh0IHB1bXAoKSBjYWxsIHdpbGwgYWN0dWFsbHkgZmFpbC5cbiAgICAgIHRoaXMub3V0cHV0UXVldWUucHVzaCh0aGlzLmNhcnJ5b3Zlcik7XG4gICAgICB0aGlzLmNhcnJ5b3ZlciA9ICcnO1xuICAgICAgcmV0dXJuIHRydWU7XG4gICAgfVxuICAgIGNvbnN0IGxpbmVzID0gY2h1bmtSZXN1bHQudmFsdWUuc3BsaXQodGhpcy5zZXBhcmF0b3IpO1xuICAgIC8vIE5vdGUgdGhlIGJlaGF2aW9yOiBcIiBhYiBcIi5zcGxpdCgnICcpID09PSBbJycsICdhYicsICcnXVxuICAgIC8vIFRodXMgdGhlIGNhcnJ5b3ZlciBtYXkgYmUgJycgaWYgdGhlIHNlcGFyYXRvciBmYWxscyBvbiBhIGNodW5rXG4gICAgLy8gYm91bmRhcnk7IHRoaXMgcHJvZHVjZXMgdGhlIGNvcnJlY3QgcmVzdWx0LlxuXG4gICAgbGluZXNbMF0gPSB0aGlzLmNhcnJ5b3ZlciArIGxpbmVzWzBdO1xuICAgIGZvciAoY29uc3QgbGluZSBvZiBsaW5lcy5zbGljZSgwLCAtMSkpIHtcbiAgICAgIHRoaXMub3V0cHV0UXVldWUucHVzaChsaW5lKTtcbiAgICB9XG4gICAgdGhpcy5jYXJyeW92ZXIgPSBsaW5lc1tsaW5lcy5sZW5ndGggLSAxXTtcblxuICAgIHJldHVybiB0cnVlO1xuICB9XG59XG4iXX0=","/**\n * @license\n * Copyright 2018 Google LLC. All Rights Reserved.\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n *\n * =============================================================================\n */\nimport { env } from '@tensorflow/tfjs-core';\nimport { LazyIterator, OneToManyIterator } from './lazy_iterator';\nimport { StringIterator } from './string_iterator';\nexport class ByteChunkIterator extends LazyIterator {\n /**\n * Decode a stream of UTF8-encoded byte arrays to a stream of strings.\n *\n * The byte arrays producetd from the ByteChunkIterator on which this is\n * called will be interpreted as concatenated. No assumptions are made about\n * the boundaries of the incoming chunks, so a multi-byte UTF8 encoding of a\n * character may span the boundary between chunks. This naturally happens,\n * for instance, when reading fixed-size byte arrays from a file.\n */\n decodeUTF8() {\n return new Utf8Iterator(this);\n }\n}\n// ============================================================================\n// The following private classes serve to implement the chainable methods\n// on ByteChunkIterator. Unfortunately they can't be placed in separate files,\n// due to resulting trouble with circular imports.\n// ============================================================================\n// We wanted multiple inheritance, e.g.\n// class Utf8Iterator extends QueueIterator, StringIterator\n// but the TypeScript mixin approach is a bit hacky, so we take this adapter\n// approach instead.\nclass Utf8Iterator extends StringIterator {\n constructor(upstream) {\n super();\n this.upstream = upstream;\n this.impl = new Utf8IteratorImpl(upstream);\n }\n summary() {\n return this.impl.summary();\n }\n async next() {\n return this.impl.next();\n }\n}\n/**\n * Decode a stream of UTF8-encoded byte arrays to a stream of strings.\n *\n * This is tricky because the incoming byte array boundaries may disrupt a\n * multi-byte UTF8 character. Thus any incomplete character data at the end of\n * a chunk must be carried over and prepended to the next chunk before\n * decoding. Luckily with native decoder, TextDecoder in browser and\n * string_decoder in node, byte array boundaries are handled automatically.\n *\n * In the context of an input pipeline for machine learning, UTF8 decoding is\n * needed to parse text files containing training examples or prediction\n * requests (e.g., formatted as CSV or JSON). We cannot use the built-in\n * decoding provided by FileReader.readAsText() because here we are in a\n * streaming context, which FileReader does not support.\n *\n * @param upstream A `LazyIterator` of `Uint8Arrays` containing UTF8-encoded\n * text, which should be interpreted as concatenated. No assumptions are\n * made about the boundaries of the incoming chunks, so a multi-byte UTF8\n * encoding of a character may span the boundary between chunks. This\n * naturally happens, for instance, when reading fixed-size byte arrays from a\n * file.\n */\nclass Utf8IteratorImpl extends OneToManyIterator {\n constructor(upstream) {\n super();\n this.upstream = upstream;\n if (env().get('IS_BROWSER')) {\n this.decoder = new TextDecoder('utf-8');\n }\n else {\n // tslint:disable-next-line:no-require-imports\n const { StringDecoder } = require('string_decoder');\n this.decoder = new StringDecoder('utf8');\n }\n }\n summary() {\n return `${this.upstream.summary()} -> Utf8`;\n }\n async pump() {\n const chunkResult = await this.upstream.next();\n let chunk;\n if (chunkResult.done) {\n return false;\n }\n else {\n chunk = chunkResult.value;\n }\n let text;\n if (env().get('IS_BROWSER')) {\n text = this.decoder.decode(chunk, { stream: true });\n }\n else {\n text = this.decoder.write(Buffer.from(chunk.buffer));\n }\n this.outputQueue.push(text);\n return true;\n }\n}\n//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYnl0ZV9jaHVua19pdGVyYXRvci5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uLy4uL3RmanMtZGF0YS9zcmMvaXRlcmF0b3JzL2J5dGVfY2h1bmtfaXRlcmF0b3IudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUE7Ozs7Ozs7Ozs7Ozs7Ozs7R0FnQkc7QUFFSCxPQUFPLEVBQUMsR0FBRyxFQUFDLE1BQU0sdUJBQXVCLENBQUM7QUFDMUMsT0FBTyxFQUFDLFlBQVksRUFBRSxpQkFBaUIsRUFBQyxNQUFNLGlCQUFpQixDQUFDO0FBQ2hFLE9BQU8sRUFBQyxjQUFjLEVBQUMsTUFBTSxtQkFBbUIsQ0FBQztBQUVqRCxNQUFNLE9BQWdCLGlCQUFrQixTQUFRLFlBQXdCO0lBQ3RFOzs7Ozs7OztPQVFHO0lBQ0gsVUFBVTtRQUNSLE9BQU8sSUFBSSxZQUFZLENBQUMsSUFBSSxDQUFDLENBQUM7SUFDaEMsQ0FBQztDQUNGO0FBRUQsK0VBQStFO0FBQy9FLHlFQUF5RTtBQUN6RSwrRUFBK0U7QUFDL0Usa0RBQWtEO0FBQ2xELCtFQUErRTtBQUUvRSx1Q0FBdUM7QUFDdkMscUVBQXFFO0FBQ3JFLDRFQUE0RTtBQUM1RSxvQkFBb0I7QUFFcEIsTUFBTSxZQUFhLFNBQVEsY0FBYztJQUd2QyxZQUFzQixRQUFrQztRQUN0RCxLQUFLLEVBQUUsQ0FBQztRQURZLGFBQVEsR0FBUixRQUFRLENBQTBCO1FBRXRELElBQUksQ0FBQyxJQUFJLEdBQUcsSUFBSSxnQkFBZ0IsQ0FBQyxRQUFRLENBQUMsQ0FBQztJQUM3QyxDQUFDO0lBRUQsT0FBTztRQUNMLE9BQU8sSUFBSSxDQUFDLElBQUksQ0FBQyxPQUFPLEVBQUUsQ0FBQztJQUM3QixDQUFDO0lBRUQsS0FBSyxDQUFDLElBQUk7UUFDUixPQUFPLElBQUksQ0FBQyxJQUFJLENBQUMsSUFBSSxFQUFFLENBQUM7SUFDMUIsQ0FBQztDQUNGO0FBRUQ7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7OztHQXFCRztBQUNILE1BQU0sZ0JBQWlCLFNBQVEsaUJBQXlCO0lBTXRELFlBQStCLFFBQWtDO1FBQy9ELEtBQUssRUFBRSxDQUFDO1FBRHFCLGFBQVEsR0FBUixRQUFRLENBQTBCO1FBRS9ELElBQUksR0FBRyxFQUFFLENBQUMsR0FBRyxDQUFDLFlBQVksQ0FBQyxFQUFFO1lBQzNCLElBQUksQ0FBQyxPQUFPLEdBQUcsSUFBSSxXQUFXLENBQUMsT0FBTyxDQUFDLENBQUM7U0FDekM7YUFBTTtZQUNMLDhDQUE4QztZQUM5QyxNQUFNLEVBQUMsYUFBYSxFQUFDLEdBQUcsT0FBTyxDQUFDLGdCQUFnQixDQUFDLENBQUM7WUFDbEQsSUFBSSxDQUFDLE9BQU8sR0FBRyxJQUFJLGFBQWEsQ0FBQyxNQUFNLENBQUMsQ0FBQztTQUMxQztJQUNILENBQUM7SUFDRCxPQUFPO1FBQ0wsT0FBTyxHQUFHLElBQUksQ0FBQyxRQUFRLENBQUMsT0FBTyxFQUFFLFVBQVUsQ0FBQztJQUM5QyxDQUFDO0lBRUQsS0FBSyxDQUFDLElBQUk7UUFDUixNQUFNLFdBQVcsR0FBRyxNQUFNLElBQUksQ0FBQyxRQUFRLENBQUMsSUFBSSxFQUFFLENBQUM7UUFDL0MsSUFBSSxLQUFLLENBQUM7UUFDVixJQUFJLFdBQVcsQ0FBQyxJQUFJLEVBQUU7WUFDcEIsT0FBTyxLQUFLLENBQUM7U0FDZDthQUFNO1lBQ0wsS0FBSyxHQUFHLFdBQVcsQ0FBQyxLQUFLLENBQUM7U0FDM0I7UUFFRCxJQUFJLElBQVksQ0FBQztRQUNqQixJQUFJLEdBQUcsRUFBRSxDQUFDLEdBQUcsQ0FBQyxZQUFZLENBQUMsRUFBRTtZQUMzQixJQUFJLEdBQUcsSUFBSSxDQUFDLE9BQU8sQ0FBQyxNQUFNLENBQUMsS0FBSyxFQUFFLEVBQUMsTUFBTSxFQUFFLElBQUksRUFBQyxDQUFDLENBQUM7U0FDbkQ7YUFBTTtZQUNMLElBQUksR0FBRyxJQUFJLENBQUMsT0FBTyxDQUFDLEtBQUssQ0FBQyxNQUFNLENBQUMsSUFBSSxDQUFDLEtBQUssQ0FBQyxNQUFNLENBQUMsQ0FBQyxDQUFDO1NBQ3REO1FBQ0QsSUFBSSxDQUFDLFdBQVcsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLENBQUM7UUFDNUIsT0FBTyxJQUFJLENBQUM7SUFDZCxDQUFDO0NBQ0YiLCJzb3VyY2VzQ29udGVudCI6WyIvKipcbiAqIEBsaWNlbnNlXG4gKiBDb3B5cmlnaHQgMjAxOCBHb29nbGUgTExDLiBBbGwgUmlnaHRzIFJlc2VydmVkLlxuICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlIFwiTGljZW5zZVwiKTtcbiAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS5cbiAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdFxuICpcbiAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMFxuICpcbiAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmVcbiAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuIFwiQVMgSVNcIiBCQVNJUyxcbiAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLlxuICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZFxuICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuXG4gKlxuICogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbiAqL1xuXG5pbXBvcnQge2Vudn0gZnJvbSAnQHRlbnNvcmZsb3cvdGZqcy1jb3JlJztcbmltcG9ydCB7TGF6eUl0ZXJhdG9yLCBPbmVUb01hbnlJdGVyYXRvcn0gZnJvbSAnLi9sYXp5X2l0ZXJhdG9yJztcbmltcG9ydCB7U3RyaW5nSXRlcmF0b3J9IGZyb20gJy4vc3RyaW5nX2l0ZXJhdG9yJztcblxuZXhwb3J0IGFic3RyYWN0IGNsYXNzIEJ5dGVDaHVua0l0ZXJhdG9yIGV4dGVuZHMgTGF6eUl0ZXJhdG9yPFVpbnQ4QXJyYXk+IHtcbiAgLyoqXG4gICAqIERlY29kZSBhIHN0cmVhbSBvZiBVVEY4LWVuY29kZWQgYnl0ZSBhcnJheXMgdG8gYSBzdHJlYW0gb2Ygc3RyaW5ncy5cbiAgICpcbiAgICogVGhlIGJ5dGUgYXJyYXlzIHByb2R1Y2V0ZCBmcm9tIHRoZSBCeXRlQ2h1bmtJdGVyYXRvciBvbiB3aGljaCB0aGlzIGlzXG4gICAqIGNhbGxlZCB3aWxsIGJlIGludGVycHJldGVkIGFzIGNvbmNhdGVuYXRlZC4gIE5vIGFzc3VtcHRpb25zIGFyZSBtYWRlIGFib3V0XG4gICAqIHRoZSBib3VuZGFyaWVzIG9mIHRoZSBpbmNvbWluZyBjaHVua3MsIHNvIGEgbXVsdGktYnl0ZSBVVEY4IGVuY29kaW5nIG9mIGFcbiAgICogY2hhcmFjdGVyIG1heSBzcGFuIHRoZSBib3VuZGFyeSBiZXR3ZWVuIGNodW5rcy4gIFRoaXMgbmF0dXJhbGx5IGhhcHBlbnMsXG4gICAqIGZvciBpbnN0YW5jZSwgd2hlbiByZWFkaW5nIGZpeGVkLXNpemUgYnl0ZSBhcnJheXMgZnJvbSBhIGZpbGUuXG4gICAqL1xuICBkZWNvZGVVVEY4KCk6IFN0cmluZ0l0ZXJhdG9yIHtcbiAgICByZXR1cm4gbmV3IFV0ZjhJdGVyYXRvcih0aGlzKTtcbiAgfVxufVxuXG4vLyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4vLyBUaGUgZm9sbG93aW5nIHByaXZhdGUgY2xhc3NlcyBzZXJ2ZSB0byBpbXBsZW1lbnQgdGhlIGNoYWluYWJsZSBtZXRob2RzXG4vLyBvbiBCeXRlQ2h1bmtJdGVyYXRvci4gIFVuZm9ydHVuYXRlbHkgdGhleSBjYW4ndCBiZSBwbGFjZWQgaW4gc2VwYXJhdGUgZmlsZXMsXG4vLyBkdWUgdG8gcmVzdWx0aW5nIHRyb3VibGUgd2l0aCBjaXJjdWxhciBpbXBvcnRzLlxuLy8gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuXG4vLyBXZSB3YW50ZWQgbXVsdGlwbGUgaW5oZXJpdGFuY2UsIGUuZy5cbi8vICAgY2xhc3MgVXRmOEl0ZXJhdG9yIGV4dGVuZHMgUXVldWVJdGVyYXRvcjxzdHJpbmc+LCBTdHJpbmdJdGVyYXRvclxuLy8gYnV0IHRoZSBUeXBlU2NyaXB0IG1peGluIGFwcHJvYWNoIGlzIGEgYml0IGhhY2t5LCBzbyB3ZSB0YWtlIHRoaXMgYWRhcHRlclxuLy8gYXBwcm9hY2ggaW5zdGVhZC5cblxuY2xhc3MgVXRmOEl0ZXJhdG9yIGV4dGVuZHMgU3RyaW5nSXRlcmF0b3Ige1xuICBwcml2YXRlIGltcGw6IFV0ZjhJdGVyYXRvckltcGw7XG5cbiAgY29uc3RydWN0b3IocHJvdGVjdGVkIHVwc3RyZWFtOiBMYXp5SXRlcmF0b3I8VWludDhBcnJheT4pIHtcbiAgICBzdXBlcigpO1xuICAgIHRoaXMuaW1wbCA9IG5ldyBVdGY4SXRlcmF0b3JJbXBsKHVwc3RyZWFtKTtcbiAgfVxuXG4gIHN1bW1hcnkoKSB7XG4gICAgcmV0dXJuIHRoaXMuaW1wbC5zdW1tYXJ5KCk7XG4gIH1cblxuICBhc3luYyBuZXh0KCkge1xuICAgIHJldHVybiB0aGlzLmltcGwubmV4dCgpO1xuICB9XG59XG5cbi8qKlxuICogRGVjb2RlIGEgc3RyZWFtIG9mIFVURjgtZW5jb2RlZCBieXRlIGFycmF5cyB0byBhIHN0cmVhbSBvZiBzdHJpbmdzLlxuICpcbiAqIFRoaXMgaXMgdHJpY2t5IGJlY2F1c2UgdGhlIGluY29taW5nIGJ5dGUgYXJyYXkgYm91bmRhcmllcyBtYXkgZGlzcnVwdCBhXG4gKiBtdWx0aS1ieXRlIFVURjggY2hhcmFjdGVyLiBUaHVzIGFueSBpbmNvbXBsZXRlIGNoYXJhY3RlciBkYXRhIGF0IHRoZSBlbmQgb2ZcbiAqIGEgY2h1bmsgbXVzdCBiZSBjYXJyaWVkIG92ZXIgYW5kIHByZXBlbmRlZCB0byB0aGUgbmV4dCBjaHVuayBiZWZvcmVcbiAqIGRlY29kaW5nLiBMdWNraWx5IHdpdGggbmF0aXZlIGRlY29kZXIsIFRleHREZWNvZGVyIGluIGJyb3dzZXIgYW5kXG4gKiBzdHJpbmdfZGVjb2RlciBpbiBub2RlLCBieXRlIGFycmF5IGJvdW5kYXJpZXMgYXJlIGhhbmRsZWQgYXV0b21hdGljYWxseS5cbiAqXG4gKiBJbiB0aGUgY29udGV4dCBvZiBhbiBpbnB1dCBwaXBlbGluZSBmb3IgbWFjaGluZSBsZWFybmluZywgVVRGOCBkZWNvZGluZyBpc1xuICogbmVlZGVkIHRvIHBhcnNlIHRleHQgZmlsZXMgY29udGFpbmluZyB0cmFpbmluZyBleGFtcGxlcyBvciBwcmVkaWN0aW9uXG4gKiByZXF1ZXN0cyAoZS5nLiwgZm9ybWF0dGVkIGFzIENTViBvciBKU09OKS4gV2UgY2Fubm90IHVzZSB0aGUgYnVpbHQtaW5cbiAqIGRlY29kaW5nIHByb3ZpZGVkIGJ5IEZpbGVSZWFkZXIucmVhZEFzVGV4dCgpIGJlY2F1c2UgaGVyZSB3ZSBhcmUgaW4gYVxuICogc3RyZWFtaW5nIGNvbnRleHQsIHdoaWNoIEZpbGVSZWFkZXIgZG9lcyBub3Qgc3VwcG9ydC5cbiAqXG4gKiBAcGFyYW0gdXBzdHJlYW0gQSBgTGF6eUl0ZXJhdG9yYCBvZiBgVWludDhBcnJheXNgIGNvbnRhaW5pbmcgVVRGOC1lbmNvZGVkXG4gKiAgIHRleHQsIHdoaWNoIHNob3VsZCBiZSBpbnRlcnByZXRlZCBhcyBjb25jYXRlbmF0ZWQuICBObyBhc3N1bXB0aW9ucyBhcmVcbiAqICAgbWFkZSBhYm91dCB0aGUgYm91bmRhcmllcyBvZiB0aGUgaW5jb21pbmcgY2h1bmtzLCBzbyBhIG11bHRpLWJ5dGUgVVRGOFxuICogICBlbmNvZGluZyBvZiBhIGNoYXJhY3RlciBtYXkgc3BhbiB0aGUgYm91bmRhcnkgYmV0d2VlbiBjaHVua3MuICBUaGlzXG4gKiAgIG5hdHVyYWxseSBoYXBwZW5zLCBmb3IgaW5zdGFuY2UsIHdoZW4gcmVhZGluZyBmaXhlZC1zaXplIGJ5dGUgYXJyYXlzIGZyb20gYVxuICogICBmaWxlLlxuICovXG5jbGFzcyBVdGY4SXRlcmF0b3JJbXBsIGV4dGVuZHMgT25lVG9NYW55SXRlcmF0b3I8c3RyaW5nPiB7XG4gIC8vIGBkZWNvZGVyYCBhcyBgYW55YCBoZXJlIHRvIGR5bmFtaWNhbGx5IGFzc2lnbiB2YWx1ZSBiYXNlZCBvbiB0aGVcbiAgLy8gZW52aXJvbm1lbnQuXG4gIC8vIHRzbGludDpkaXNhYmxlLW5leHQtbGluZTpuby1hbnlcbiAgZGVjb2RlcjogYW55O1xuXG4gIGNvbnN0cnVjdG9yKHByb3RlY3RlZCByZWFkb25seSB1cHN0cmVhbTogTGF6eUl0ZXJhdG9yPFVpbnQ4QXJyYXk+KSB7XG4gICAgc3VwZXIoKTtcbiAgICBpZiAoZW52KCkuZ2V0KCdJU19CUk9XU0VSJykpIHtcbiAgICAgIHRoaXMuZGVjb2RlciA9IG5ldyBUZXh0RGVjb2RlcigndXRmLTgnKTtcbiAgICB9IGVsc2Uge1xuICAgICAgLy8gdHNsaW50OmRpc2FibGUtbmV4dC1saW5lOm5vLXJlcXVpcmUtaW1wb3J0c1xuICAgICAgY29uc3Qge1N0cmluZ0RlY29kZXJ9ID0gcmVxdWlyZSgnc3RyaW5nX2RlY29kZXInKTtcbiAgICAgIHRoaXMuZGVjb2RlciA9IG5ldyBTdHJpbmdEZWNvZGVyKCd1dGY4Jyk7XG4gICAgfVxuICB9XG4gIHN1bW1hcnkoKSB7XG4gICAgcmV0dXJuIGAke3RoaXMudXBzdHJlYW0uc3VtbWFyeSgpfSAtPiBVdGY4YDtcbiAgfVxuXG4gIGFzeW5jIHB1bXAoKTogUHJvbWlzZTxib29sZWFuPiB7XG4gICAgY29uc3QgY2h1bmtSZXN1bHQgPSBhd2FpdCB0aGlzLnVwc3RyZWFtLm5leHQoKTtcbiAgICBsZXQgY2h1bms7XG4gICAgaWYgKGNodW5rUmVzdWx0LmRvbmUpIHtcbiAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9IGVsc2Uge1xuICAgICAgY2h1bmsgPSBjaHVua1Jlc3VsdC52YWx1ZTtcbiAgICB9XG5cbiAgICBsZXQgdGV4dDogc3RyaW5nO1xuICAgIGlmIChlbnYoKS5nZXQoJ0lTX0JST1dTRVInKSkge1xuICAgICAgdGV4dCA9IHRoaXMuZGVjb2Rlci5kZWNvZGUoY2h1bmssIHtzdHJlYW06IHRydWV9KTtcbiAgICB9IGVsc2Uge1xuICAgICAgdGV4dCA9IHRoaXMuZGVjb2Rlci53cml0ZShCdWZmZXIuZnJvbShjaHVuay5idWZmZXIpKTtcbiAgICB9XG4gICAgdGhpcy5vdXRwdXRRdWV1ZS5wdXNoKHRleHQpO1xuICAgIHJldHVybiB0cnVlO1xuICB9XG59XG4iXX0=","/**\n * @license\n * Copyright 2018 Google LLC. All Rights Reserved.\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n *\n * =============================================================================\n */\n// inspired by https://github.com/maxogden/filereader-stream\nimport { env, util } from '@tensorflow/tfjs-core';\nimport { ByteChunkIterator } from './byte_chunk_iterator';\n/**\n * Provide a stream of chunks from a File, Blob, or Uint8Array.\n * @param file The source File, Blob or Uint8Array.\n * @param options Optional settings controlling file reading.\n * @returns a lazy Iterator of Uint8Arrays containing sequential chunks of the\n * input File, Blob or Uint8Array.\n */\nexport class FileChunkIterator extends ByteChunkIterator {\n constructor(file, options = {}) {\n super();\n this.file = file;\n this.options = options;\n util.assert((file instanceof Uint8Array) ||\n (env().get('IS_BROWSER') ?\n (file instanceof File || file instanceof Blob) :\n false), () => 'FileChunkIterator only supports File, Blob and Uint8Array ' +\n 'right now.');\n this.offset = options.offset || 0;\n // default 1MB chunk has tolerable perf on large files\n this.chunkSize = options.chunkSize || 1024 * 1024;\n }\n summary() {\n return `FileChunks ${this.file}`;\n }\n async next() {\n if (this.offset >= ((this.file instanceof Uint8Array) ?\n this.file.byteLength :\n this.file.size)) {\n return { value: null, done: true };\n }\n const chunk = new Promise((resolve, reject) => {\n const end = this.offset + this.chunkSize;\n if (this.file instanceof Uint8Array) {\n // Note if end > this.uint8Array.byteLength, we just get a small last\n // chunk.\n resolve(new Uint8Array(this.file.slice(this.offset, end)));\n }\n else {\n // This branch assumes that this.file type is File or Blob, which\n // means it is in the browser environment.\n // TODO(soergel): is this a performance issue?\n const fileReader = new FileReader();\n fileReader.onload = (event) => {\n let data = fileReader.result;\n // Not sure we can trust the return type of\n // FileReader.readAsArrayBuffer See e.g.\n // https://github.com/node-file-api/FileReader/issues/2\n if (data instanceof ArrayBuffer) {\n data = new Uint8Array(data);\n }\n if (!(data instanceof Uint8Array)) {\n return reject(new TypeError('FileReader returned unknown type.'));\n }\n resolve(data);\n };\n fileReader.onabort = (event) => {\n return reject(new Error('Aborted'));\n };\n fileReader.onerror = (event) => {\n return reject(new Error(event.type));\n };\n // TODO(soergel): better handle onabort, onerror\n // Note if end > this.file.size, we just get a small last chunk.\n const slice = this.file.slice(this.offset, end);\n // We can't use readAsText here (even if we know the file is text)\n // because the slice boundary may fall within a multi-byte character.\n fileReader.readAsArrayBuffer(slice);\n }\n this.offset = end;\n });\n return { value: (await chunk), done: false };\n }\n}\n//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZmlsZV9jaHVua19pdGVyYXRvci5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uLy4uL3RmanMtZGF0YS9zcmMvaXRlcmF0b3JzL2ZpbGVfY2h1bmtfaXRlcmF0b3IudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUE7Ozs7Ozs7Ozs7Ozs7Ozs7R0FnQkc7QUFFSCw0REFBNEQ7QUFDNUQsT0FBTyxFQUFDLEdBQUcsRUFBRSxJQUFJLEVBQUMsTUFBTSx1QkFBdUIsQ0FBQztBQUVoRCxPQUFPLEVBQUMsaUJBQWlCLEVBQUMsTUFBTSx1QkFBdUIsQ0FBQztBQVN4RDs7Ozs7O0dBTUc7QUFDSCxNQUFNLE9BQU8saUJBQWtCLFNBQVEsaUJBQWlCO0lBSXRELFlBQ2MsSUFBaUIsRUFDakIsVUFBb0MsRUFBRTtRQUNsRCxLQUFLLEVBQUUsQ0FBQztRQUZJLFNBQUksR0FBSixJQUFJLENBQWE7UUFDakIsWUFBTyxHQUFQLE9BQU8sQ0FBK0I7UUFFbEQsSUFBSSxDQUFDLE1BQU0sQ0FDUCxDQUFDLElBQUksWUFBWSxVQUFVLENBQUM7WUFDeEIsQ0FBQyxHQUFHLEVBQUUsQ0FBQyxHQUFHLENBQUMsWUFBWSxDQUFDLENBQUMsQ0FBQztnQkFDckIsQ0FBQyxJQUFJLFlBQVksSUFBSSxJQUFJLElBQUksWUFBWSxJQUFJLENBQUMsQ0FBQyxDQUFDO2dCQUNoRCxLQUFLLENBQUMsRUFDZixHQUFHLEVBQUUsQ0FBQyw0REFBNEQ7WUFDOUQsWUFBWSxDQUFDLENBQUM7UUFDdEIsSUFBSSxDQUFDLE1BQU0sR0FBRyxPQUFPLENBQUMsTUFBTSxJQUFJLENBQUMsQ0FBQztRQUNsQyxzREFBc0Q7UUFDdEQsSUFBSSxDQUFDLFNBQVMsR0FBRyxPQUFPLENBQUMsU0FBUyxJQUFJLElBQUksR0FBRyxJQUFJLENBQUM7SUFDcEQsQ0FBQztJQUVELE9BQU87UUFDTCxPQUFPLGNBQWMsSUFBSSxDQUFDLElBQUksRUFBRSxDQUFDO0lBQ25DLENBQUM7SUFFRCxLQUFLLENBQUMsSUFBSTtRQUNSLElBQUksSUFBSSxDQUFDLE1BQU0sSUFBSSxDQUFDLENBQUMsSUFBSSxDQUFDLElBQUksWUFBWSxVQUFVLENBQUMsQ0FBQyxDQUFDO1lBQy9CLElBQUksQ0FBQyxJQUFJLENBQUMsVUFBVSxDQUFDLENBQUM7WUFDdEIsSUFBSSxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsRUFBRTtZQUN2QyxPQUFPLEVBQUMsS0FBSyxFQUFFLElBQUksRUFBRSxJQUFJLEVBQUUsSUFBSSxFQUFDLENBQUM7U0FDbEM7UUFDRCxNQUFNLEtBQUssR0FBRyxJQUFJLE9BQU8sQ0FBYSxDQUFDLE9BQU8sRUFBRSxNQUFNLEVBQUUsRUFBRTtZQUN4RCxNQUFNLEdBQUcsR0FBRyxJQUFJLENBQUMsTUFBTSxHQUFHLElBQUksQ0FBQyxTQUFTLENBQUM7WUFDekMsSUFBSSxJQUFJLENBQUMsSUFBSSxZQUFZLFVBQVUsRUFBRTtnQkFDbkMscUVBQXFFO2dCQUNyRSxTQUFTO2dCQUNULE9BQU8sQ0FBQyxJQUFJLFVBQVUsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLEtBQUssQ0FBQyxJQUFJLENBQUMsTUFBTSxFQUFFLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQzthQUM1RDtpQkFBTTtnQkFDTCxpRUFBaUU7Z0JBQ2pFLDBDQUEwQztnQkFFMUMsOENBQThDO2dCQUM5QyxNQUFNLFVBQVUsR0FBRyxJQUFJLFVBQVUsRUFBRSxDQUFDO2dCQUNwQyxVQUFVLENBQUMsTUFBTSxHQUFHLENBQUMsS0FBSyxFQUFFLEVBQUU7b0JBQzVCLElBQUksSUFBSSxHQUFrQyxVQUFVLENBQUMsTUFBTSxDQUFDO29CQUM1RCwyQ0FBMkM7b0JBQzNDLHdDQUF3QztvQkFDeEMsdURBQXVEO29CQUN2RCxJQUFJLElBQUksWUFBWSxXQUFXLEVBQUU7d0JBQy9CLElBQUksR0FBRyxJQUFJLFVBQVUsQ0FBQyxJQUFJLENBQUMsQ0FBQztxQkFDN0I7b0JBQ0QsSUFBSSxDQUFDLENBQUMsSUFBSSxZQUFZLFVBQVUsQ0FBQyxFQUFFO3dCQUNqQyxPQUFPLE1BQU0sQ0FBQyxJQUFJLFNBQVMsQ0FBQyxtQ0FBbUMsQ0FBQyxDQUFDLENBQUM7cUJBQ25FO29CQUNELE9BQU8sQ0FBQyxJQUFJLENBQUMsQ0FBQztnQkFDaEIsQ0FBQyxDQUFDO2dCQUNGLFVBQVUsQ0FBQyxPQUFPLEdBQUcsQ0FBQyxLQUFLLEVBQUUsRUFBRTtvQkFDN0IsT0FBTyxNQUFNLENBQUMsSUFBSSxLQUFLLENBQUMsU0FBUyxDQUFDLENBQUMsQ0FBQztnQkFDdEMsQ0FBQyxDQUFDO2dCQUNGLFVBQVUsQ0FBQyxPQUFPLEdBQUcsQ0FBQyxLQUFLLEVBQUUsRUFBRTtvQkFDN0IsT0FBTyxNQUFNLENBQUMsSUFBSSxLQUFLLENBQUMsS0FBSyxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUM7Z0JBQ3ZDLENBQUMsQ0FBQztnQkFDRixnREFBZ0Q7Z0JBQ2hELGdFQUFnRTtnQkFDaEUsTUFBTSxLQUFLLEdBQUcsSUFBSSxDQUFDLElBQUksQ0FBQyxLQUFLLENBQUMsSUFBSSxDQUFDLE1BQU0sRUFBRSxHQUFHLENBQUMsQ0FBQztnQkFDaEQsa0VBQWtFO2dCQUNsRSxxRUFBcUU7Z0JBQ3JFLFVBQVUsQ0FBQyxpQkFBaUIsQ0FBQyxLQUFLLENBQUMsQ0FBQzthQUNyQztZQUNELElBQUksQ0FBQyxNQUFNLEdBQUcsR0FBRyxDQUFDO1FBQ3BCLENBQUMsQ0FBQyxDQUFDO1FBQ0gsT0FBTyxFQUFDLEtBQUssRUFBRSxDQUFDLE1BQU0sS0FBSyxDQUFDLEVBQUUsSUFBSSxFQUFFLEtBQUssRUFBQyxDQUFDO0lBQzdDLENBQUM7Q0FDRiIsInNvdXJjZXNDb250ZW50IjpbIi8qKlxuICogQGxpY2Vuc2VcbiAqIENvcHlyaWdodCAyMDE4IEdvb2dsZSBMTEMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuXG4gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgXCJMaWNlbnNlXCIpO1xuICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLlxuICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0XG4gKlxuICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wXG4gKlxuICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZVxuICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gXCJBUyBJU1wiIEJBU0lTLFxuICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuXG4gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kXG4gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS5cbiAqXG4gKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuICovXG5cbi8vIGluc3BpcmVkIGJ5IGh0dHBzOi8vZ2l0aHViLmNvbS9tYXhvZ2Rlbi9maWxlcmVhZGVyLXN0cmVhbVxuaW1wb3J0IHtlbnYsIHV0aWx9IGZyb20gJ0B0ZW5zb3JmbG93L3RmanMtY29yZSc7XG5pbXBvcnQge0ZpbGVFbGVtZW50fSBmcm9tICcuLi90eXBlcyc7XG5pbXBvcnQge0J5dGVDaHVua0l0ZXJhdG9yfSBmcm9tICcuL2J5dGVfY2h1bmtfaXRlcmF0b3InO1xuXG5leHBvcnQgaW50ZXJmYWNlIEZpbGVDaHVua0l0ZXJhdG9yT3B0aW9ucyB7XG4gIC8qKiBUaGUgYnl0ZSBvZmZzZXQgYXQgd2hpY2ggdG8gYmVnaW4gcmVhZGluZyB0aGUgRmlsZSBvciBCbG9iLiBEZWZhdWx0IDAuICovXG4gIG9mZnNldD86IG51bWJlcjtcbiAgLyoqIFRoZSBudW1iZXIgb2YgYnl0ZXMgdG8gcmVhZCBhdCBhIHRpbWUuIERlZmF1bHQgMU1CLiAqL1xuICBjaHVua1NpemU/OiBudW1iZXI7XG59XG5cbi8qKlxuICogUHJvdmlkZSBhIHN0cmVhbSBvZiBjaHVua3MgZnJvbSBhIEZpbGUsIEJsb2IsIG9yIFVpbnQ4QXJyYXkuXG4gKiBAcGFyYW0gZmlsZSBUaGUgc291cmNlIEZpbGUsIEJsb2Igb3IgVWludDhBcnJheS5cbiAqIEBwYXJhbSBvcHRpb25zIE9wdGlvbmFsIHNldHRpbmdzIGNvbnRyb2xsaW5nIGZpbGUgcmVhZGluZy5cbiAqIEByZXR1cm5zIGEgbGF6eSBJdGVyYXRvciBvZiBVaW50OEFycmF5cyBjb250YWluaW5nIHNlcXVlbnRpYWwgY2h1bmtzIG9mIHRoZVxuICogICBpbnB1dCBGaWxlLCBCbG9iIG9yIFVpbnQ4QXJyYXkuXG4gKi9cbmV4cG9ydCBjbGFzcyBGaWxlQ2h1bmtJdGVyYXRvciBleHRlbmRzIEJ5dGVDaHVua0l0ZXJhdG9yIHtcbiAgb2Zmc2V0OiBudW1iZXI7XG4gIGNodW5rU2l6ZTogbnVtYmVyO1xuXG4gIGNvbnN0cnVjdG9yKFxuICAgICAgcHJvdGVjdGVkIGZpbGU6IEZpbGVFbGVtZW50LFxuICAgICAgcHJvdGVjdGVkIG9wdGlvbnM6IEZpbGVDaHVua0l0ZXJhdG9yT3B0aW9ucyA9IHt9KSB7XG4gICAgc3VwZXIoKTtcbiAgICB1dGlsLmFzc2VydChcbiAgICAgICAgKGZpbGUgaW5zdGFuY2VvZiBVaW50OEFycmF5KSB8fFxuICAgICAgICAgICAgKGVudigpLmdldCgnSVNfQlJPV1NFUicpID9cbiAgICAgICAgICAgICAgICAgKGZpbGUgaW5zdGFuY2VvZiBGaWxlIHx8IGZpbGUgaW5zdGFuY2VvZiBCbG9iKSA6XG4gICAgICAgICAgICAgICAgIGZhbHNlKSxcbiAgICAgICAgKCkgPT4gJ0ZpbGVDaHVua0l0ZXJhdG9yIG9ubHkgc3VwcG9ydHMgRmlsZSwgQmxvYiBhbmQgVWludDhBcnJheSAnICtcbiAgICAgICAgICAgICdyaWdodCBub3cuJyk7XG4gICAgdGhpcy5vZmZzZXQgPSBvcHRpb25zLm9mZnNldCB8fCAwO1xuICAgIC8vIGRlZmF1bHQgMU1CIGNodW5rIGhhcyB0b2xlcmFibGUgcGVyZiBvbiBsYXJnZSBmaWxlc1xuICAgIHRoaXMuY2h1bmtTaXplID0gb3B0aW9ucy5jaHVua1NpemUgfHwgMTAyNCAqIDEwMjQ7XG4gIH1cblxuICBzdW1tYXJ5KCkge1xuICAgIHJldHVybiBgRmlsZUNodW5rcyAke3RoaXMuZmlsZX1gO1xuICB9XG5cbiAgYXN5bmMgbmV4dCgpOiBQcm9taXNlPEl0ZXJhdG9yUmVzdWx0PFVpbnQ4QXJyYXk+PiB7XG4gICAgaWYgKHRoaXMub2Zmc2V0ID49ICgodGhpcy5maWxlIGluc3RhbmNlb2YgVWludDhBcnJheSkgP1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuZmlsZS5ieXRlTGVuZ3RoIDpcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGlzLmZpbGUuc2l6ZSkpIHtcbiAgICAgIHJldHVybiB7dmFsdWU6IG51bGwsIGRvbmU6IHRydWV9O1xuICAgIH1cbiAgICBjb25zdCBjaHVuayA9IG5ldyBQcm9taXNlPFVpbnQ4QXJyYXk+KChyZXNvbHZlLCByZWplY3QpID0+IHtcbiAgICAgIGNvbnN0IGVuZCA9IHRoaXMub2Zmc2V0ICsgdGhpcy5jaHVua1NpemU7XG4gICAgICBpZiAodGhpcy5maWxlIGluc3RhbmNlb2YgVWludDhBcnJheSkge1xuICAgICAgICAvLyBOb3RlIGlmIGVuZCA+IHRoaXMudWludDhBcnJheS5ieXRlTGVuZ3RoLCB3ZSBqdXN0IGdldCBhIHNtYWxsIGxhc3RcbiAgICAgICAgLy8gY2h1bmsuXG4gICAgICAgIHJlc29sdmUobmV3IFVpbnQ4QXJyYXkodGhpcy5maWxlLnNsaWNlKHRoaXMub2Zmc2V0LCBlbmQpKSk7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICAvLyBUaGlzIGJyYW5jaCBhc3N1bWVzIHRoYXQgdGhpcy5maWxlIHR5cGUgaXMgRmlsZSBvciBCbG9iLCB3aGljaFxuICAgICAgICAvLyBtZWFucyBpdCBpcyBpbiB0aGUgYnJvd3NlciBlbnZpcm9ubWVudC5cblxuICAgICAgICAvLyBUT0RPKHNvZXJnZWwpOiBpcyB0aGlzIGEgcGVyZm9ybWFuY2UgaXNzdWU/XG4gICAgICAgIGNvbnN0IGZpbGVSZWFkZXIgPSBuZXcgRmlsZVJlYWRlcigpO1xuICAgICAgICBmaWxlUmVhZGVyLm9ubG9hZCA9IChldmVudCkgPT4ge1xuICAgICAgICAgIGxldCBkYXRhOiBzdHJpbmd8QXJyYXlCdWZmZXJ8VWludDhBcnJheSA9IGZpbGVSZWFkZXIucmVzdWx0O1xuICAgICAgICAgIC8vIE5vdCBzdXJlIHdlIGNhbiB0cnVzdCB0aGUgcmV0dXJuIHR5cGUgb2ZcbiAgICAgICAgICAvLyBGaWxlUmVhZGVyLnJlYWRBc0FycmF5QnVmZmVyIFNlZSBlLmcuXG4gICAgICAgICAgLy8gaHR0cHM6Ly9naXRodWIuY29tL25vZGUtZmlsZS1hcGkvRmlsZVJlYWRlci9pc3N1ZXMvMlxuICAgICAgICAgIGlmIChkYXRhIGluc3RhbmNlb2YgQXJyYXlCdWZmZXIpIHtcbiAgICAgICAgICAgIGRhdGEgPSBuZXcgVWludDhBcnJheShkYXRhKTtcbiAgICAgICAgICB9XG4gICAgICAgICAgaWYgKCEoZGF0YSBpbnN0YW5jZW9mIFVpbnQ4QXJyYXkpKSB7XG4gICAgICAgICAgICByZXR1cm4gcmVqZWN0KG5ldyBUeXBlRXJyb3IoJ0ZpbGVSZWFkZXIgcmV0dXJuZWQgdW5rbm93biB0eXBlLicpKTtcbiAgICAgICAgICB9XG4gICAgICAgICAgcmVzb2x2ZShkYXRhKTtcbiAgICAgICAgfTtcbiAgICAgICAgZmlsZVJlYWRlci5vbmFib3J0ID0gKGV2ZW50KSA9PiB7XG4gICAgICAgICAgcmV0dXJuIHJlamVjdChuZXcgRXJyb3IoJ0Fib3J0ZWQnKSk7XG4gICAgICAgIH07XG4gICAgICAgIGZpbGVSZWFkZXIub25lcnJvciA9IChldmVudCkgPT4ge1xuICAgICAgICAgIHJldHVybiByZWplY3QobmV3IEVycm9yKGV2ZW50LnR5cGUpKTtcbiAgICAgICAgfTtcbiAgICAgICAgLy8gVE9ETyhzb2VyZ2VsKTogYmV0dGVyIGhhbmRsZSBvbmFib3J0LCBvbmVycm9yXG4gICAgICAgIC8vIE5vdGUgaWYgZW5kID4gdGhpcy5maWxlLnNpemUsIHdlIGp1c3QgZ2V0IGEgc21hbGwgbGFzdCBjaHVuay5cbiAgICAgICAgY29uc3Qgc2xpY2UgPSB0aGlzLmZpbGUuc2xpY2UodGhpcy5vZmZzZXQsIGVuZCk7XG4gICAgICAgIC8vIFdlIGNhbid0IHVzZSByZWFkQXNUZXh0IGhlcmUgKGV2ZW4gaWYgd2Uga25vdyB0aGUgZmlsZSBpcyB0ZXh0KVxuICAgICAgICAvLyBiZWNhdXNlIHRoZSBzbGljZSBib3VuZGFyeSBtYXkgZmFsbCB3aXRoaW4gYSBtdWx0aS1ieXRlIGNoYXJhY3Rlci5cbiAgICAgICAgZmlsZVJlYWRlci5yZWFkQXNBcnJheUJ1ZmZlcihzbGljZSk7XG4gICAgICB9XG4gICAgICB0aGlzLm9mZnNldCA9IGVuZDtcbiAgICB9KTtcbiAgICByZXR1cm4ge3ZhbHVlOiAoYXdhaXQgY2h1bmspLCBkb25lOiBmYWxzZX07XG4gIH1cbn1cbiJdfQ==","/**\n * @license\n * Copyright 2018 Google LLC. All Rights Reserved.\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n *\n * =============================================================================\n */\nimport { util } from '@tensorflow/tfjs-core';\nimport { FileChunkIterator } from './file_chunk_iterator';\n/**\n * Provide a stream of chunks from a URL.\n *\n * Note this class first downloads the entire file into memory before providing\n * the first element from the stream. This is because the Fetch API does not\n * yet reliably provide a reader stream for the response body.\n */\nexport async function urlChunkIterator(url, options = {}, fetchFunc) {\n let urlString;\n let requestInit;\n if ((typeof url) === 'string') {\n urlString = url;\n }\n else {\n urlString = url.url;\n requestInit = getRequestInitFromRequest(url);\n }\n const response = await (fetchFunc || util.fetch)(urlString, requestInit);\n if (response.ok) {\n const uint8Array = new Uint8Array(await response.arrayBuffer());\n return new FileChunkIterator(uint8Array, options);\n }\n else {\n throw new Error(response.statusText);\n }\n}\n// Generate RequestInit from Request to match tf.util.fetch signature.\nconst getRequestInitFromRequest = (request) => {\n const init = {\n method: request.method,\n headers: request.headers,\n body: request.body,\n mode: request.mode,\n credentials: request.credentials,\n cache: request.cache,\n redirect: request.redirect,\n referrer: request.referrer,\n integrity: request.integrity,\n };\n return init;\n};\n//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidXJsX2NodW5rX2l0ZXJhdG9yLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vLi4vdGZqcy1kYXRhL3NyYy9pdGVyYXRvcnMvdXJsX2NodW5rX2l0ZXJhdG9yLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBOzs7Ozs7Ozs7Ozs7Ozs7O0dBZ0JHO0FBRUgsT0FBTyxFQUFDLElBQUksRUFBQyxNQUFNLHVCQUF1QixDQUFDO0FBQzNDLE9BQU8sRUFBQyxpQkFBaUIsRUFBMkIsTUFBTSx1QkFBdUIsQ0FBQztBQUVsRjs7Ozs7O0dBTUc7QUFDSCxNQUFNLENBQUMsS0FBSyxVQUFVLGdCQUFnQixDQUNsQyxHQUFnQixFQUFFLFVBQW9DLEVBQUUsRUFDeEQsU0FBb0I7SUFDdEIsSUFBSSxTQUFTLENBQUM7SUFDZCxJQUFJLFdBQVcsQ0FBQztJQUNoQixJQUFJLENBQUMsT0FBTyxHQUFHLENBQUMsS0FBSyxRQUFRLEVBQUU7UUFDN0IsU0FBUyxHQUFHLEdBQWEsQ0FBQztLQUMzQjtTQUFNO1FBQ0wsU0FBUyxHQUFJLEdBQWUsQ0FBQyxHQUFHLENBQUM7UUFDakMsV0FBVyxHQUFHLHlCQUF5QixDQUFDLEdBQWMsQ0FBQyxDQUFDO0tBQ3pEO0lBQ0QsTUFBTSxRQUFRLEdBQUcsTUFBTSxDQUFDLFNBQVMsSUFBSSxJQUFJLENBQUMsS0FBSyxDQUFDLENBQUMsU0FBUyxFQUFFLFdBQVcsQ0FBQyxDQUFDO0lBQ3pFLElBQUksUUFBUSxDQUFDLEVBQUUsRUFBRTtRQUNmLE1BQU0sVUFBVSxHQUFHLElBQUksVUFBVSxDQUFDLE1BQU0sUUFBUSxDQUFDLFdBQVcsRUFBRSxDQUFDLENBQUM7UUFDaEUsT0FBTyxJQUFJLGlCQUFpQixDQUFDLFVBQVUsRUFBRSxPQUFPLENBQUMsQ0FBQztLQUNuRDtTQUFNO1FBQ0wsTUFBTSxJQUFJLEtBQUssQ0FBQyxRQUFRLENBQUMsVUFBVSxDQUFDLENBQUM7S0FDdEM7QUFDSCxDQUFDO0FBRUQsc0VBQXNFO0FBQ3RFLE1BQU0seUJBQXlCLEdBQUcsQ0FBQyxPQUFnQixFQUFFLEVBQUU7SUFDckQsTUFBTSxJQUFJLEdBQUc7UUFDWCxNQUFNLEVBQUUsT0FBTyxDQUFDLE1BQU07UUFDdEIsT0FBTyxFQUFFLE9BQU8sQ0FBQyxPQUFPO1FBQ3hCLElBQUksRUFBRSxPQUFPLENBQUMsSUFBSTtRQUNsQixJQUFJLEVBQUUsT0FBTyxDQUFDLElBQUk7UUFDbEIsV0FBVyxFQUFFLE9BQU8sQ0FBQyxXQUFXO1FBQ2hDLEtBQUssRUFBRSxPQUFPLENBQUMsS0FBSztRQUNwQixRQUFRLEVBQUUsT0FBTyxDQUFDLFFBQVE7UUFDMUIsUUFBUSxFQUFFLE9BQU8sQ0FBQyxRQUFRO1FBQzFCLFNBQVMsRUFBRSxPQUFPLENBQUMsU0FBUztLQUM3QixDQUFDO0lBQ0YsT0FBTyxJQUFJLENBQUM7QUFDZCxDQUFDLENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyIvKipcbiAqIEBsaWNlbnNlXG4gKiBDb3B5cmlnaHQgMjAxOCBHb29nbGUgTExDLiBBbGwgUmlnaHRzIFJlc2VydmVkLlxuICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlIFwiTGljZW5zZVwiKTtcbiAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS5cbiAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdFxuICpcbiAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMFxuICpcbiAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmVcbiAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuIFwiQVMgSVNcIiBCQVNJUyxcbiAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLlxuICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZFxuICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuXG4gKlxuICogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbiAqL1xuXG5pbXBvcnQge3V0aWx9IGZyb20gJ0B0ZW5zb3JmbG93L3RmanMtY29yZSc7XG5pbXBvcnQge0ZpbGVDaHVua0l0ZXJhdG9yLCBGaWxlQ2h1bmtJdGVyYXRvck9wdGlvbnN9IGZyb20gJy4vZmlsZV9jaHVua19pdGVyYXRvcic7XG5cbi8qKlxuICogUHJvdmlkZSBhIHN0cmVhbSBvZiBjaHVua3MgZnJvbSBhIFVSTC5cbiAqXG4gKiBOb3RlIHRoaXMgY2xhc3MgZmlyc3QgZG93bmxvYWRzIHRoZSBlbnRpcmUgZmlsZSBpbnRvIG1lbW9yeSBiZWZvcmUgcHJvdmlkaW5nXG4gKiB0aGUgZmlyc3QgZWxlbWVudCBmcm9tIHRoZSBzdHJlYW0uICBUaGlzIGlzIGJlY2F1c2UgdGhlIEZldGNoIEFQSSBkb2VzIG5vdFxuICogeWV0IHJlbGlhYmx5IHByb3ZpZGUgYSByZWFkZXIgc3RyZWFtIGZvciB0aGUgcmVzcG9uc2UgYm9keS5cbiAqL1xuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIHVybENodW5rSXRlcmF0b3IoXG4gICAgdXJsOiBSZXF1ZXN0SW5mbywgb3B0aW9uczogRmlsZUNodW5rSXRlcmF0b3JPcHRpb25zID0ge30sXG4gICAgZmV0Y2hGdW5jPzogRnVuY3Rpb24pIHtcbiAgbGV0IHVybFN0cmluZztcbiAgbGV0IHJlcXVlc3RJbml0O1xuICBpZiAoKHR5cGVvZiB1cmwpID09PSAnc3RyaW5nJykge1xuICAgIHVybFN0cmluZyA9IHVybCBhcyBzdHJpbmc7XG4gIH0gZWxzZSB7XG4gICAgdXJsU3RyaW5nID0gKHVybCBhcyBSZXF1ZXN0KS51cmw7XG4gICAgcmVxdWVzdEluaXQgPSBnZXRSZXF1ZXN0SW5pdEZyb21SZXF1ZXN0KHVybCBhcyBSZXF1ZXN0KTtcbiAgfVxuICBjb25zdCByZXNwb25zZSA9IGF3YWl0IChmZXRjaEZ1bmMgfHwgdXRpbC5mZXRjaCkodXJsU3RyaW5nLCByZXF1ZXN0SW5pdCk7XG4gIGlmIChyZXNwb25zZS5vaykge1xuICAgIGNvbnN0IHVpbnQ4QXJyYXkgPSBuZXcgVWludDhBcnJheShhd2FpdCByZXNwb25zZS5hcnJheUJ1ZmZlcigpKTtcbiAgICByZXR1cm4gbmV3IEZpbGVDaHVua0l0ZXJhdG9yKHVpbnQ4QXJyYXksIG9wdGlvbnMpO1xuICB9IGVsc2Uge1xuICAgIHRocm93IG5ldyBFcnJvcihyZXNwb25zZS5zdGF0dXNUZXh0KTtcbiAgfVxufVxuXG4vLyBHZW5lcmF0ZSBSZXF1ZXN0SW5pdCBmcm9tIFJlcXVlc3QgdG8gbWF0Y2ggdGYudXRpbC5mZXRjaCBzaWduYXR1cmUuXG5jb25zdCBnZXRSZXF1ZXN0SW5pdEZyb21SZXF1ZXN0ID0gKHJlcXVlc3Q6IFJlcXVlc3QpID0+IHtcbiAgY29uc3QgaW5pdCA9IHtcbiAgICBtZXRob2Q6IHJlcXVlc3QubWV0aG9kLFxuICAgIGhlYWRlcnM6IHJlcXVlc3QuaGVhZGVycyxcbiAgICBib2R5OiByZXF1ZXN0LmJvZHksXG4gICAgbW9kZTogcmVxdWVzdC5tb2RlLFxuICAgIGNyZWRlbnRpYWxzOiByZXF1ZXN0LmNyZWRlbnRpYWxzLFxuICAgIGNhY2hlOiByZXF1ZXN0LmNhY2hlLFxuICAgIHJlZGlyZWN0OiByZXF1ZXN0LnJlZGlyZWN0LFxuICAgIHJlZmVycmVyOiByZXF1ZXN0LnJlZmVycmVyLFxuICAgIGludGVncml0eTogcmVxdWVzdC5pbnRlZ3JpdHksXG4gIH07XG4gIHJldHVybiBpbml0O1xufTtcbiJdfQ==","/**\n * @license\n * Copyright 2018 Google LLC. All Rights Reserved.\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n *\n * =============================================================================\n */\n// Skip tslint any type check cause this method is aiming to check type of\n// input.\n// tslint:disable-next-line:no-any\nexport function isLocalPath(source) {\n return (typeof source === 'string') && source.slice(0, 7) === 'file://';\n}\n//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic291cmNlX3V0aWwuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi8uLi90ZmpzLWRhdGEvc3JjL3V0aWwvc291cmNlX3V0aWwudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUE7Ozs7Ozs7Ozs7Ozs7Ozs7R0FnQkc7QUFFSCwwRUFBMEU7QUFDMUUsU0FBUztBQUNULGtDQUFrQztBQUNsQyxNQUFNLFVBQVUsV0FBVyxDQUFDLE1BQVc7SUFDckMsT0FBTyxDQUFDLE9BQU8sTUFBTSxLQUFLLFFBQVEsQ0FBQyxJQUFJLE1BQU0sQ0FBQyxLQUFLLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxLQUFLLFNBQVMsQ0FBQztBQUMxRSxDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiLyoqXG4gKiBAbGljZW5zZVxuICogQ29weXJpZ2h0IDIwMTggR29vZ2xlIExMQy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC5cbiAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSBcIkxpY2Vuc2VcIik7XG4gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuXG4gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXRcbiAqXG4gKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjBcbiAqXG4gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlXG4gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiBcIkFTIElTXCIgQkFTSVMsXG4gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC5cbiAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmRcbiAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLlxuICpcbiAqID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4gKi9cblxuLy8gU2tpcCB0c2xpbnQgYW55IHR5cGUgY2hlY2sgY2F1c2UgdGhpcyBtZXRob2QgaXMgYWltaW5nIHRvIGNoZWNrIHR5cGUgb2Zcbi8vIGlucHV0LlxuLy8gdHNsaW50OmRpc2FibGUtbmV4dC1saW5lOm5vLWFueVxuZXhwb3J0IGZ1bmN0aW9uIGlzTG9jYWxQYXRoKHNvdXJjZTogYW55KTogYm9vbGVhbiB7XG4gIHJldHVybiAodHlwZW9mIHNvdXJjZSA9PT0gJ3N0cmluZycpICYmIHNvdXJjZS5zbGljZSgwLCA3KSA9PT0gJ2ZpbGU6Ly8nO1xufVxuIl19","/**\n * @license\n * Copyright 2018 Google LLC. All Rights Reserved.\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n *\n * =============================================================================\n */\nimport { env } from '@tensorflow/tfjs-core';\nimport { DataSource } from '../datasource';\nimport { FileChunkIterator } from '../iterators/file_chunk_iterator';\nimport { isLocalPath } from '../util/source_util';\n/**\n * Represents a file, blob, or Uint8Array readable as a stream of binary data\n * chunks.\n */\nexport class FileDataSource extends DataSource {\n /**\n * Create a `FileDataSource`.\n *\n * @param input Local file path, or `File`/`Blob`/`Uint8Array` object to\n * read. Local file only works in node environment.\n * @param options Options passed to the underlying `FileChunkIterator`s,\n * such as {chunksize: 1024}.\n */\n constructor(input, options = {}) {\n super();\n this.input = input;\n this.options = options;\n }\n async iterator() {\n if (isLocalPath(this.input) && env().get('IS_NODE')) {\n // tslint:disable-next-line:no-require-imports\n const fs = require('fs');\n this.input = fs.readFileSync(this.input.slice(7));\n }\n // TODO(kangyizhang): Add LocalFileChunkIterator to split local streaming\n // with file in browser.\n return new FileChunkIterator(this.input, this.options);\n }\n}\n//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZmlsZV9kYXRhX3NvdXJjZS5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uLy4uL3RmanMtZGF0YS9zcmMvc291cmNlcy9maWxlX2RhdGFfc291cmNlLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBOzs7Ozs7Ozs7Ozs7Ozs7O0dBZ0JHO0FBRUgsT0FBTyxFQUFDLEdBQUcsRUFBQyxNQUFNLHVCQUF1QixDQUFDO0FBQzFDLE9BQU8sRUFBQyxVQUFVLEVBQUMsTUFBTSxlQUFlLENBQUM7QUFFekMsT0FBTyxFQUFDLGlCQUFpQixFQUEyQixNQUFNLGtDQUFrQyxDQUFDO0FBRTdGLE9BQU8sRUFBQyxXQUFXLEVBQUMsTUFBTSxxQkFBcUIsQ0FBQztBQUVoRDs7O0dBR0c7QUFDSCxNQUFNLE9BQU8sY0FBZSxTQUFRLFVBQVU7SUFDNUM7Ozs7Ozs7T0FPRztJQUNILFlBQ2MsS0FBeUIsRUFDaEIsVUFBb0MsRUFBRTtRQUMzRCxLQUFLLEVBQUUsQ0FBQztRQUZJLFVBQUssR0FBTCxLQUFLLENBQW9CO1FBQ2hCLFlBQU8sR0FBUCxPQUFPLENBQStCO0lBRTdELENBQUM7SUFFRCxLQUFLLENBQUMsUUFBUTtRQUNaLElBQUksV0FBVyxDQUFDLElBQUksQ0FBQyxLQUFLLENBQUMsSUFBSSxHQUFHLEVBQUUsQ0FBQyxHQUFHLENBQUMsU0FBUyxDQUFDLEVBQUU7WUFDbkQsOENBQThDO1lBQzlDLE1BQU0sRUFBRSxHQUFHLE9BQU8sQ0FBQyxJQUFJLENBQUMsQ0FBQztZQUN6QixJQUFJLENBQUMsS0FBSyxHQUFHLEVBQUUsQ0FBQyxZQUFZLENBQUUsSUFBSSxDQUFDLEtBQWdCLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUM7U0FDL0Q7UUFDRCx5RUFBeUU7UUFDekUsd0JBQXdCO1FBQ3hCLE9BQU8sSUFBSSxpQkFBaUIsQ0FBQyxJQUFJLENBQUMsS0FBb0IsRUFBRSxJQUFJLENBQUMsT0FBTyxDQUFDLENBQUM7SUFDeEUsQ0FBQztDQUNGIiwic291cmNlc0NvbnRlbnQiOlsiLyoqXG4gKiBAbGljZW5zZVxuICogQ29weXJpZ2h0IDIwMTggR29vZ2xlIExMQy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC5cbiAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSBcIkxpY2Vuc2VcIik7XG4gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuXG4gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXRcbiAqXG4gKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjBcbiAqXG4gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlXG4gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiBcIkFTIElTXCIgQkFTSVMsXG4gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC5cbiAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmRcbiAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLlxuICpcbiAqID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4gKi9cblxuaW1wb3J0IHtlbnZ9IGZyb20gJ0B0ZW5zb3JmbG93L3RmanMtY29yZSc7XG5pbXBvcnQge0RhdGFTb3VyY2V9IGZyb20gJy4uL2RhdGFzb3VyY2UnO1xuaW1wb3J0IHtCeXRlQ2h1bmtJdGVyYXRvcn0gZnJvbSAnLi4vaXRlcmF0b3JzL2J5dGVfY2h1bmtfaXRlcmF0b3InO1xuaW1wb3J0IHtGaWxlQ2h1bmtJdGVyYXRvciwgRmlsZUNodW5rSXRlcmF0b3JPcHRpb25zfSBmcm9tICcuLi9pdGVyYXRvcnMvZmlsZV9jaHVua19pdGVyYXRvcic7XG5pbXBvcnQge0ZpbGVFbGVtZW50fSBmcm9tICcuLi90eXBlcyc7XG5pbXBvcnQge2lzTG9jYWxQYXRofSBmcm9tICcuLi91dGlsL3NvdXJjZV91dGlsJztcblxuLyoqXG4gKiBSZXByZXNlbnRzIGEgZmlsZSwgYmxvYiwgb3IgVWludDhBcnJheSByZWFkYWJsZSBhcyBhIHN0cmVhbSBvZiBiaW5hcnkgZGF0YVxuICogY2h1bmtzLlxuICovXG5leHBvcnQgY2xhc3MgRmlsZURhdGFTb3VyY2UgZXh0ZW5kcyBEYXRhU291cmNlIHtcbiAgLyoqXG4gICAqIENyZWF0ZSBhIGBGaWxlRGF0YVNvdXJjZWAuXG4gICAqXG4gICAqIEBwYXJhbSBpbnB1dCBMb2NhbCBmaWxlIHBhdGgsIG9yIGBGaWxlYC9gQmxvYmAvYFVpbnQ4QXJyYXlgIG9iamVjdCB0b1xuICAgKiAgICAgcmVhZC4gTG9jYWwgZmlsZSBvbmx5IHdvcmtzIGluIG5vZGUgZW52aXJvbm1lbnQuXG4gICAqIEBwYXJhbSBvcHRpb25zIE9wdGlvbnMgcGFzc2VkIHRvIHRoZSB1bmRlcmx5aW5nIGBGaWxlQ2h1bmtJdGVyYXRvcmBzLFxuICAgKiAgIHN1Y2ggYXMge2NodW5rc2l6ZTogMTAyNH0uXG4gICAqL1xuICBjb25zdHJ1Y3RvcihcbiAgICAgIHByb3RlY3RlZCBpbnB1dDogRmlsZUVsZW1lbnR8c3RyaW5nLFxuICAgICAgcHJvdGVjdGVkIHJlYWRvbmx5IG9wdGlvbnM6IEZpbGVDaHVua0l0ZXJhdG9yT3B0aW9ucyA9IHt9KSB7XG4gICAgc3VwZXIoKTtcbiAgfVxuXG4gIGFzeW5jIGl0ZXJhdG9yKCk6IFByb21pc2U8Qnl0ZUNodW5rSXRlcmF0b3I+IHtcbiAgICBpZiAoaXNMb2NhbFBhdGgodGhpcy5pbnB1dCkgJiYgZW52KCkuZ2V0KCdJU19OT0RFJykpIHtcbiAgICAgIC8vIHRzbGludDpkaXNhYmxlLW5leHQtbGluZTpuby1yZXF1aXJlLWltcG9ydHNcbiAgICAgIGNvbnN0IGZzID0gcmVxdWlyZSgnZnMnKTtcbiAgICAgIHRoaXMuaW5wdXQgPSBmcy5yZWFkRmlsZVN5bmMoKHRoaXMuaW5wdXQgYXMgc3RyaW5nKS5zbGljZSg3KSk7XG4gICAgfVxuICAgIC8vIFRPRE8oa2FuZ3lpemhhbmcpOiBBZGQgTG9jYWxGaWxlQ2h1bmtJdGVyYXRvciB0byBzcGxpdCBsb2NhbCBzdHJlYW1pbmdcbiAgICAvLyB3aXRoIGZpbGUgaW4gYnJvd3Nlci5cbiAgICByZXR1cm4gbmV3IEZpbGVDaHVua0l0ZXJhdG9yKHRoaXMuaW5wdXQgYXMgRmlsZUVsZW1lbnQsIHRoaXMub3B0aW9ucyk7XG4gIH1cbn1cbiJdfQ==","/**\n * @license\n * Copyright 2018 Google LLC. All Rights Reserved.\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n *\n * =============================================================================\n */\nimport { DataSource } from '../datasource';\nimport { urlChunkIterator } from '../iterators/url_chunk_iterator';\nimport { isLocalPath } from '../util/source_util';\nimport { FileDataSource } from './file_data_source';\n/*\n * Represents a URL readable as a stream of binary data chunks.\n */\nexport class URLDataSource extends DataSource {\n /**\n * Create a `URLDataSource`.\n *\n * @param url A source URL string, or a `Request` object.\n * @param options Options passed to the underlying `FileChunkIterator`s,\n * such as {chunksize: 1024}.\n */\n constructor(url, fileOptions = {}) {\n super();\n this.url = url;\n this.fileOptions = fileOptions;\n }\n // TODO(soergel): provide appropriate caching options. Currently this\n // will download the URL anew for each call to iterator(). Since we have\n // to treat the downloaded file as a blob/buffer anyway, we may as well retain\n // it-- but that raises GC issues. Also we may want a persistent disk cache.\n async iterator() {\n if (isLocalPath(this.url)) {\n return (new FileDataSource(this.url, this.fileOptions))\n .iterator();\n }\n else {\n return urlChunkIterator(this.url, this.fileOptions);\n }\n }\n}\n//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidXJsX2RhdGFfc291cmNlLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vLi4vdGZqcy1kYXRhL3NyYy9zb3VyY2VzL3VybF9kYXRhX3NvdXJjZS50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQTs7Ozs7Ozs7Ozs7Ozs7OztHQWdCRztBQUVILE9BQU8sRUFBQyxVQUFVLEVBQUMsTUFBTSxlQUFlLENBQUM7QUFHekMsT0FBTyxFQUFDLGdCQUFnQixFQUFDLE1BQU0saUNBQWlDLENBQUM7QUFDakUsT0FBTyxFQUFDLFdBQVcsRUFBQyxNQUFNLHFCQUFxQixDQUFDO0FBQ2hELE9BQU8sRUFBQyxjQUFjLEVBQUMsTUFBTSxvQkFBb0IsQ0FBQztBQUVsRDs7R0FFRztBQUNILE1BQU0sT0FBTyxhQUFjLFNBQVEsVUFBVTtJQUMzQzs7Ozs7O09BTUc7SUFDSCxZQUN1QixHQUFnQixFQUNoQixjQUF3QyxFQUFFO1FBQy9ELEtBQUssRUFBRSxDQUFDO1FBRmEsUUFBRyxHQUFILEdBQUcsQ0FBYTtRQUNoQixnQkFBVyxHQUFYLFdBQVcsQ0FBK0I7SUFFakUsQ0FBQztJQUVELHNFQUFzRTtJQUN0RSx5RUFBeUU7SUFDekUsOEVBQThFO0lBQzlFLDZFQUE2RTtJQUM3RSxLQUFLLENBQUMsUUFBUTtRQUNaLElBQUksV0FBVyxDQUFDLElBQUksQ0FBQyxHQUFHLENBQUMsRUFBRTtZQUN6QixPQUFPLENBQUMsSUFBSSxjQUFjLENBQUMsSUFBSSxDQUFDLEdBQWEsRUFBRSxJQUFJLENBQUMsV0FBVyxDQUFDLENBQUM7aUJBQzVELFFBQVEsRUFBRSxDQUFDO1NBQ2pCO2FBQU07WUFDTCxPQUFPLGdCQUFnQixDQUFDLElBQUksQ0FBQyxHQUFHLEVBQUUsSUFBSSxDQUFDLFdBQVcsQ0FBQyxDQUFDO1NBQ3JEO0lBQ0gsQ0FBQztDQUNGIiwic291cmNlc0NvbnRlbnQiOlsiLyoqXG4gKiBAbGljZW5zZVxuICogQ29weXJpZ2h0IDIwMTggR29vZ2xlIExMQy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC5cbiAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSBcIkxpY2Vuc2VcIik7XG4gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuXG4gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXRcbiAqXG4gKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjBcbiAqXG4gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlXG4gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiBcIkFTIElTXCIgQkFTSVMsXG4gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC5cbiAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmRcbiAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLlxuICpcbiAqID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4gKi9cblxuaW1wb3J0IHtEYXRhU291cmNlfSBmcm9tICcuLi9kYXRhc291cmNlJztcbmltcG9ydCB7Qnl0ZUNodW5rSXRlcmF0b3J9IGZyb20gJy4uL2l0ZXJhdG9ycy9ieXRlX2NodW5rX2l0ZXJhdG9yJztcbmltcG9ydCB7RmlsZUNodW5rSXRlcmF0b3JPcHRpb25zfSBmcm9tICcuLi9pdGVyYXRvcnMvZmlsZV9jaHVua19pdGVyYXRvcic7XG5pbXBvcnQge3VybENodW5rSXRlcmF0b3J9IGZyb20gJy4uL2l0ZXJhdG9ycy91cmxfY2h1bmtfaXRlcmF0b3InO1xuaW1wb3J0IHtpc0xvY2FsUGF0aH0gZnJvbSAnLi4vdXRpbC9zb3VyY2VfdXRpbCc7XG5pbXBvcnQge0ZpbGVEYXRhU291cmNlfSBmcm9tICcuL2ZpbGVfZGF0YV9zb3VyY2UnO1xuXG4vKlxuICogUmVwcmVzZW50cyBhIFVSTCByZWFkYWJsZSBhcyBhIHN0cmVhbSBvZiBiaW5hcnkgZGF0YSBjaHVua3MuXG4gKi9cbmV4cG9ydCBjbGFzcyBVUkxEYXRhU291cmNlIGV4dGVuZHMgRGF0YVNvdXJjZSB7XG4gIC8qKlxuICAgKiBDcmVhdGUgYSBgVVJMRGF0YVNvdXJjZWAuXG4gICAqXG4gICAqIEBwYXJhbSB1cmwgQSBzb3VyY2UgVVJMIHN0cmluZywgb3IgYSBgUmVxdWVzdGAgb2JqZWN0LlxuICAgKiBAcGFyYW0gb3B0aW9ucyBPcHRpb25zIHBhc3NlZCB0byB0aGUgdW5kZXJseWluZyBgRmlsZUNodW5rSXRlcmF0b3JgcyxcbiAgICogICBzdWNoIGFzIHtjaHVua3NpemU6IDEwMjR9LlxuICAgKi9cbiAgY29uc3RydWN0b3IoXG4gICAgICBwcm90ZWN0ZWQgcmVhZG9ubHkgdXJsOiBSZXF1ZXN0SW5mbyxcbiAgICAgIHByb3RlY3RlZCByZWFkb25seSBmaWxlT3B0aW9uczogRmlsZUNodW5rSXRlcmF0b3JPcHRpb25zID0ge30pIHtcbiAgICBzdXBlcigpO1xuICB9XG5cbiAgLy8gVE9ETyhzb2VyZ2VsKTogcHJvdmlkZSBhcHByb3ByaWF0ZSBjYWNoaW5nIG9wdGlvbnMuICBDdXJyZW50bHkgdGhpc1xuICAvLyB3aWxsIGRvd25sb2FkIHRoZSBVUkwgYW5ldyBmb3IgZWFjaCBjYWxsIHRvIGl0ZXJhdG9yKCkuICBTaW5jZSB3ZSBoYXZlXG4gIC8vIHRvIHRyZWF0IHRoZSBkb3dubG9hZGVkIGZpbGUgYXMgYSBibG9iL2J1ZmZlciBhbnl3YXksIHdlIG1heSBhcyB3ZWxsIHJldGFpblxuICAvLyBpdC0tIGJ1dCB0aGF0IHJhaXNlcyBHQyBpc3N1ZXMuICBBbHNvIHdlIG1heSB3YW50IGEgcGVyc2lzdGVudCBkaXNrIGNhY2hlLlxuICBhc3luYyBpdGVyYXRvcigpOiBQcm9taXNlPEJ5dGVDaHVua0l0ZXJhdG9yPiB7XG4gICAgaWYgKGlzTG9jYWxQYXRoKHRoaXMudXJsKSkge1xuICAgICAgcmV0dXJuIChuZXcgRmlsZURhdGFTb3VyY2UodGhpcy51cmwgYXMgc3RyaW5nLCB0aGlzLmZpbGVPcHRpb25zKSlcbiAgICAgICAgICAuaXRlcmF0b3IoKTtcbiAgICB9IGVsc2Uge1xuICAgICAgcmV0dXJuIHVybENodW5rSXRlcmF0b3IodGhpcy51cmwsIHRoaXMuZmlsZU9wdGlvbnMpO1xuICAgIH1cbiAgfVxufVxuIl19","/**\n * @license\n * Copyright 2018 Google LLC. All Rights Reserved.\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n *\n * =============================================================================\n */\nimport { datasetFromIteratorFn } from './dataset';\nimport { CSVDataset } from './datasets/csv_dataset';\nimport { iteratorFromFunction } from './iterators/lazy_iterator';\nimport { MicrophoneIterator } from './iterators/microphone_iterator';\nimport { WebcamIterator } from './iterators/webcam_iterator';\nimport { URLDataSource } from './sources/url_data_source';\n/**\n * Create a `CSVDataset` by reading and decoding CSV file(s) from provided URL\n * or local path if it's in Node environment.\n *\n * Note: If isLabel in columnConfigs is `true` for at least one column, the\n * element in returned `CSVDataset` will be an object of\n * `{xs:features, ys:labels}`: xs is a dict of features key/value pairs, ys\n * is a dict of labels key/value pairs. If no column is marked as label,\n * returns a dict of features only.\n *\n * ```js\n * const csvUrl =\n * 'https://storage.googleapis.com/tfjs-examples/multivariate-linear-regression/data/boston-housing-train.csv';\n *\n * async function run() {\n * // We want to predict the column \"medv\", which represents a median value of\n * // a home (in $1000s), so we mark it as a label.\n * const csvDataset = tf.data.csv(\n * csvUrl, {\n * columnConfigs: {\n * medv: {\n * isLabel: true\n * }\n * }\n * });\n *\n * // Number of features is the number of column names minus one for the label\n * // column.\n * const numOfFeatures = (await csvDataset.columnNames()).length - 1;\n *\n * // Prepare the Dataset for training.\n * const flattenedDataset =\n * csvDataset\n * .map(({xs, ys}) =>\n * {\n * // Convert xs(features) and ys(labels) from object form (keyed by\n * // column name) to array form.\n * return {xs:Object.values(xs), ys:Object.values(ys)};\n * })\n * .batch(10);\n *\n * // Define the model.\n * const model = tf.sequential();\n * model.add(tf.layers.dense({\n * inputShape: [numOfFeatures],\n * units: 1\n * }));\n * model.compile({\n * optimizer: tf.train.sgd(0.000001),\n * loss: 'meanSquaredError'\n * });\n *\n * // Fit the model using the prepared Dataset\n * return model.fitDataset(flattenedDataset, {\n * epochs: 10,\n * callbacks: {\n * onEpochEnd: async (epoch, logs) => {\n * console.log(epoch + ':' + logs.loss);\n * }\n * }\n * });\n * }\n *\n * await run();\n * ```\n *\n * @param source URL or local path to get CSV file. If it's a local path, it\n * must have prefix `file://` and it only works in node environment.\n * @param csvConfig (Optional) A CSVConfig object that contains configurations\n * of reading and decoding from CSV file(s).\n *\n * @doc {\n * heading: 'Data',\n * subheading: 'Creation',\n * namespace: 'data',\n * configParamIndices: [1]\n * }\n */\nexport function csv(source, csvConfig = {}) {\n return new CSVDataset(new URLDataSource(source), csvConfig);\n}\n/**\n * Create a `Dataset` that produces each element by calling a provided function.\n *\n * Note that repeated iterations over this `Dataset` may produce different\n * results, because the function will be called anew for each element of each\n * iteration.\n *\n * Also, beware that the sequence of calls to this function may be out of order\n * in time with respect to the logical order of the Dataset. This is due to the\n * asynchronous lazy nature of stream processing, and depends on downstream\n * transformations (e.g. .shuffle()). If the provided function is pure, this is\n * no problem, but if it is a closure over a mutable state (e.g., a traversal\n * pointer), then the order of the produced elements may be scrambled.\n *\n * ```js\n * let i = -1;\n * const func = () =>\n * ++i < 5 ? {value: i, done: false} : {value: null, done: true};\n * const ds = tf.data.func(func);\n * await ds.forEachAsync(e => console.log(e));\n * ```\n *\n * @param f A function that produces one data element on each call.\n */\nexport function func(f) {\n const iter = iteratorFromFunction(f);\n return datasetFromIteratorFn(async () => iter);\n}\n/**\n * Create a `Dataset` that produces each element from provided JavaScript\n * generator, which is a function*\n * (https://developer.mozilla.org/en-US/docs/Web/JavaScript/Guide/Iterators_and_Generators#Generator_functions),\n * or a function that returns an\n * iterator\n * (https://developer.mozilla.org/en-US/docs/Web/JavaScript/Guide/Iterators_and_Generators#Generator_functions).\n *\n * The returned iterator should have `.next()` function that returns element in\n * format of `{value: TensorContainer, done:boolean}`.\n *\n * Example of creating a dataset from an iterator factory:\n * ```js\n * function makeIterator() {\n * const numElements = 10;\n * let index = 0;\n *\n * const iterator = {\n * next: () => {\n * let result;\n * if (index < numElements) {\n * result = {value: index, done: false};\n * index++;\n * return result;\n * }\n * return {value: index, done: true};\n * }\n * };\n * return iterator;\n * }\n * const ds = tf.data.generator(makeIterator);\n * await ds.forEachAsync(e => console.log(e));\n * ```\n *\n * Example of creating a dataset from a generator:\n * ```js\n * function* dataGenerator() {\n * const numElements = 10;\n * let index = 0;\n * while (index < numElements) {\n * const x = index;\n * index++;\n * yield x;\n * }\n * }\n *\n * const ds = tf.data.generator(dataGenerator);\n * await ds.forEachAsync(e => console.log(e));\n * ```\n *\n * @param generator A JavaScript generator function that returns a JavaScript\n * iterator.\n *\n * @doc {\n * heading: 'Data',\n * subheading: 'Creation',\n * namespace: 'data',\n * configParamIndices: [1]\n * }\n */\nexport function generator(generator) {\n return datasetFromIteratorFn(async () => {\n const gen = await generator();\n return iteratorFromFunction(() => gen.next());\n });\n}\n/**\n * Create an iterator that generates `Tensor`s from webcam video stream. This\n * API only works in Browser environment when the device has webcam.\n *\n * Note: this code snippet only works when the device has a webcam. It will\n * request permission to open the webcam when running.\n * ```js\n * const videoElement = document.createElement('video');\n * videoElement.width = 100;\n * videoElement.height = 100;\n * const cam = await tf.data.webcam(videoElement);\n * const img = await cam.capture();\n * img.print();\n * cam.stop();\n * ```\n *\n * @param webcamVideoElement A `HTMLVideoElement` used to play video from\n * webcam. If this element is not provided, a hidden `HTMLVideoElement` will\n * be created. In that case, `resizeWidth` and `resizeHeight` must be\n * provided to set the generated tensor shape.\n * @param webcamConfig A `WebcamConfig` object that contains configurations of\n * reading and manipulating data from webcam video stream.\n *\n * @doc {\n * heading: 'Data',\n * subheading: 'Creation',\n * namespace: 'data',\n * ignoreCI: true\n * }\n */\nexport async function webcam(webcamVideoElement, webcamConfig) {\n return WebcamIterator.create(webcamVideoElement, webcamConfig);\n}\n/**\n * Create an iterator that generates frequency-domain spectrogram `Tensor`s from\n * microphone audio stream with browser's native FFT. This API only works in\n * browser environment when the device has microphone.\n *\n * Note: this code snippet only works when the device has a microphone. It will\n * request permission to open the microphone when running.\n * ```js\n * const mic = await tf.data.microphone({\n * fftSize: 1024,\n * columnTruncateLength: 232,\n * numFramesPerSpectrogram: 43,\n * sampleRateHz:44100,\n * includeSpectrogram: true,\n * includeWaveform: true\n * });\n * const audioData = await mic.capture();\n * const spectrogramTensor = audioData.spectrogram;\n * spectrogramTensor.print();\n * const waveformTensor = audioData.waveform;\n * waveformTensor.print();\n * mic.stop();\n * ```\n *\n * @param microphoneConfig A `MicrophoneConfig` object that contains\n * configurations of reading audio data from microphone.\n *\n * @doc {\n * heading: 'Data',\n * subheading: 'Creation',\n * namespace: 'data',\n * ignoreCI: true\n * }\n */\nexport async function microphone(microphoneConfig) {\n return MicrophoneIterator.create(microphoneConfig);\n}\n//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicmVhZGVycy5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uL3RmanMtZGF0YS9zcmMvcmVhZGVycy50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQTs7Ozs7Ozs7Ozs7Ozs7OztHQWdCRztBQUdILE9BQU8sRUFBVSxxQkFBcUIsRUFBQyxNQUFNLFdBQVcsQ0FBQztBQUN6RCxPQUFPLEVBQUMsVUFBVSxFQUFDLE1BQU0sd0JBQXdCLENBQUM7QUFDbEQsT0FBTyxFQUFDLG9CQUFvQixFQUFDLE1BQU0sMkJBQTJCLENBQUM7QUFDL0QsT0FBTyxFQUFDLGtCQUFrQixFQUFDLE1BQU0saUNBQWlDLENBQUM7QUFDbkUsT0FBTyxFQUFDLGNBQWMsRUFBQyxNQUFNLDZCQUE2QixDQUFDO0FBQzNELE9BQU8sRUFBQyxhQUFhLEVBQUMsTUFBTSwyQkFBMkIsQ0FBQztBQUd4RDs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7R0E2RUc7QUFDSCxNQUFNLFVBQVUsR0FBRyxDQUNmLE1BQW1CLEVBQUUsWUFBdUIsRUFBRTtJQUNoRCxPQUFPLElBQUksVUFBVSxDQUFDLElBQUksYUFBYSxDQUFDLE1BQU0sQ0FBQyxFQUFFLFNBQVMsQ0FBQyxDQUFDO0FBQzlELENBQUM7QUFFRDs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7R0F1Qkc7QUFDSCxNQUFNLFVBQVUsSUFBSSxDQUNoQixDQUFzRDtJQUN4RCxNQUFNLElBQUksR0FBRyxvQkFBb0IsQ0FBQyxDQUFDLENBQUMsQ0FBQztJQUNyQyxPQUFPLHFCQUFxQixDQUFDLEtBQUssSUFBSSxFQUFFLENBQUMsSUFBSSxDQUFDLENBQUM7QUFDakQsQ0FBQztBQUVEOzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7OztHQTJERztBQUNILE1BQU0sVUFBVSxTQUFTLENBQ3JCLFNBQWtEO0lBQ3BELE9BQU8scUJBQXFCLENBQUMsS0FBSyxJQUFJLEVBQUU7UUFDdEMsTUFBTSxHQUFHLEdBQUcsTUFBTSxTQUFTLEVBQUUsQ0FBQztRQUM5QixPQUFPLG9CQUFvQixDQUFDLEdBQUcsRUFBRSxDQUFDLEdBQUcsQ0FBQyxJQUFJLEVBQUUsQ0FBQyxDQUFDO0lBQ2hELENBQUMsQ0FBQyxDQUFDO0FBQ0wsQ0FBQztBQUVEOzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7OztHQTZCRztBQUNILE1BQU0sQ0FBQyxLQUFLLFVBQVUsTUFBTSxDQUN4QixrQkFBcUMsRUFDckMsWUFBMkI7SUFDN0IsT0FBTyxjQUFjLENBQUMsTUFBTSxDQUFDLGtCQUFrQixFQUFFLFlBQVksQ0FBQyxDQUFDO0FBQ2pFLENBQUM7QUFFRDs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7O0dBaUNHO0FBQ0gsTUFBTSxDQUFDLEtBQUssVUFBVSxVQUFVLENBQUMsZ0JBQW1DO0lBRWxFLE9BQU8sa0JBQWtCLENBQUMsTUFBTSxDQUFDLGdCQUFnQixDQUFDLENBQUM7QUFDckQsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbIi8qKlxuICogQGxpY2Vuc2VcbiAqIENvcHlyaWdodCAyMDE4IEdvb2dsZSBMTEMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuXG4gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgXCJMaWNlbnNlXCIpO1xuICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLlxuICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0XG4gKlxuICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wXG4gKlxuICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZVxuICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gXCJBUyBJU1wiIEJBU0lTLFxuICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuXG4gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kXG4gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS5cbiAqXG4gKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuICovXG5cbmltcG9ydCB7VGVuc29yQ29udGFpbmVyfSBmcm9tICdAdGVuc29yZmxvdy90ZmpzLWNvcmUnO1xuaW1wb3J0IHtEYXRhc2V0LCBkYXRhc2V0RnJvbUl0ZXJhdG9yRm59IGZyb20gJy4vZGF0YXNldCc7XG5pbXBvcnQge0NTVkRhdGFzZXR9IGZyb20gJy4vZGF0YXNldHMvY3N2X2RhdGFzZXQnO1xuaW1wb3J0IHtpdGVyYXRvckZyb21GdW5jdGlvbn0gZnJvbSAnLi9pdGVyYXRvcnMvbGF6eV9pdGVyYXRvcic7XG5pbXBvcnQge01pY3JvcGhvbmVJdGVyYXRvcn0gZnJvbSAnLi9pdGVyYXRvcnMvbWljcm9waG9uZV9pdGVyYXRvcic7XG5pbXBvcnQge1dlYmNhbUl0ZXJhdG9yfSBmcm9tICcuL2l0ZXJhdG9ycy93ZWJjYW1faXRlcmF0b3InO1xuaW1wb3J0IHtVUkxEYXRhU291cmNlfSBmcm9tICcuL3NvdXJjZXMvdXJsX2RhdGFfc291cmNlJztcbmltcG9ydCB7Q1NWQ29uZmlnLCBNaWNyb3Bob25lQ29uZmlnLCBXZWJjYW1Db25maWd9IGZyb20gJy4vdHlwZXMnO1xuXG4vKipcbiAqIENyZWF0ZSBhIGBDU1ZEYXRhc2V0YCBieSByZWFkaW5nIGFuZCBkZWNvZGluZyBDU1YgZmlsZShzKSBmcm9tIHByb3ZpZGVkIFVSTFxuICogb3IgbG9jYWwgcGF0aCBpZiBpdCdzIGluIE5vZGUgZW52aXJvbm1lbnQuXG4gKlxuICogTm90ZTogSWYgaXNMYWJlbCBpbiBjb2x1bW5Db25maWdzIGlzIGB0cnVlYCBmb3IgYXQgbGVhc3Qgb25lIGNvbHVtbiwgdGhlXG4gKiBlbGVtZW50IGluIHJldHVybmVkIGBDU1ZEYXRhc2V0YCB3aWxsIGJlIGFuIG9iamVjdCBvZlxuICogYHt4czpmZWF0dXJlcywgeXM6bGFiZWxzfWA6IHhzIGlzIGEgZGljdCBvZiBmZWF0dXJlcyBrZXkvdmFsdWUgcGFpcnMsIHlzXG4gKiBpcyBhIGRpY3Qgb2YgbGFiZWxzIGtleS92YWx1ZSBwYWlycy4gSWYgbm8gY29sdW1uIGlzIG1hcmtlZCBhcyBsYWJlbCxcbiAqIHJldHVybnMgYSBkaWN0IG9mIGZlYXR1cmVzIG9ubHkuXG4gKlxuICogYGBganNcbiAqIGNvbnN0IGNzdlVybCA9XG4gKiAnaHR0cHM6Ly9zdG9yYWdlLmdvb2dsZWFwaXMuY29tL3RmanMtZXhhbXBsZXMvbXVsdGl2YXJpYXRlLWxpbmVhci1yZWdyZXNzaW9uL2RhdGEvYm9zdG9uLWhvdXNpbmctdHJhaW4uY3N2JztcbiAqXG4gKiBhc3luYyBmdW5jdGlvbiBydW4oKSB7XG4gKiAgIC8vIFdlIHdhbnQgdG8gcHJlZGljdCB0aGUgY29sdW1uIFwibWVkdlwiLCB3aGljaCByZXByZXNlbnRzIGEgbWVkaWFuIHZhbHVlIG9mXG4gKiAgIC8vIGEgaG9tZSAoaW4gJDEwMDBzKSwgc28gd2UgbWFyayBpdCBhcyBhIGxhYmVsLlxuICogICBjb25zdCBjc3ZEYXRhc2V0ID0gdGYuZGF0YS5jc3YoXG4gKiAgICAgY3N2VXJsLCB7XG4gKiAgICAgICBjb2x1bW5Db25maWdzOiB7XG4gKiAgICAgICAgIG1lZHY6IHtcbiAqICAgICAgICAgICBpc0xhYmVsOiB0cnVlXG4gKiAgICAgICAgIH1cbiAqICAgICAgIH1cbiAqICAgICB9KTtcbiAqXG4gKiAgIC8vIE51bWJlciBvZiBmZWF0dXJlcyBpcyB0aGUgbnVtYmVyIG9mIGNvbHVtbiBuYW1lcyBtaW51cyBvbmUgZm9yIHRoZSBsYWJlbFxuICogICAvLyBjb2x1bW4uXG4gKiAgIGNvbnN0IG51bU9mRmVhdHVyZXMgPSAoYXdhaXQgY3N2RGF0YXNldC5jb2x1bW5OYW1lcygpKS5sZW5ndGggLSAxO1xuICpcbiAqICAgLy8gUHJlcGFyZSB0aGUgRGF0YXNldCBmb3IgdHJhaW5pbmcuXG4gKiAgIGNvbnN0IGZsYXR0ZW5lZERhdGFzZXQgPVxuICogICAgIGNzdkRhdGFzZXRcbiAqICAgICAubWFwKCh7eHMsIHlzfSkgPT5cbiAqICAgICAgIHtcbiAqICAgICAgICAgLy8gQ29udmVydCB4cyhmZWF0dXJlcykgYW5kIHlzKGxhYmVscykgZnJvbSBvYmplY3QgZm9ybSAoa2V5ZWQgYnlcbiAqICAgICAgICAgLy8gY29sdW1uIG5hbWUpIHRvIGFycmF5IGZvcm0uXG4gKiAgICAgICAgIHJldHVybiB7eHM6T2JqZWN0LnZhbHVlcyh4cyksIHlzOk9iamVjdC52YWx1ZXMoeXMpfTtcbiAqICAgICAgIH0pXG4gKiAgICAgLmJhdGNoKDEwKTtcbiAqXG4gKiAgIC8vIERlZmluZSB0aGUgbW9kZWwuXG4gKiAgIGNvbnN0IG1vZGVsID0gdGYuc2VxdWVudGlhbCgpO1xuICogICBtb2RlbC5hZGQodGYubGF5ZXJzLmRlbnNlKHtcbiAqICAgICBpbnB1dFNoYXBlOiBbbnVtT2ZGZWF0dXJlc10sXG4gKiAgICAgdW5pdHM6IDFcbiAqICAgfSkpO1xuICogICBtb2RlbC5jb21waWxlKHtcbiAqICAgICBvcHRpbWl6ZXI6IHRmLnRyYWluLnNnZCgwLjAwMDAwMSksXG4gKiAgICAgbG9zczogJ21lYW5TcXVhcmVkRXJyb3InXG4gKiAgIH0pO1xuICpcbiAqICAgLy8gRml0IHRoZSBtb2RlbCB1c2luZyB0aGUgcHJlcGFyZWQgRGF0YXNldFxuICogICByZXR1cm4gbW9kZWwuZml0RGF0YXNldChmbGF0dGVuZWREYXRhc2V0LCB7XG4gKiAgICAgZXBvY2hzOiAxMCxcbiAqICAgICBjYWxsYmFja3M6IHtcbiAqICAgICAgIG9uRXBvY2hFbmQ6IGFzeW5jIChlcG9jaCwgbG9ncykgPT4ge1xuICogICAgICAgICBjb25zb2xlLmxvZyhlcG9jaCArICc6JyArIGxvZ3MubG9zcyk7XG4gKiAgICAgICB9XG4gKiAgICAgfVxuICogICB9KTtcbiAqIH1cbiAqXG4gKiBhd2FpdCBydW4oKTtcbiAqIGBgYFxuICpcbiAqIEBwYXJhbSBzb3VyY2UgVVJMIG9yIGxvY2FsIHBhdGggdG8gZ2V0IENTViBmaWxlLiBJZiBpdCdzIGEgbG9jYWwgcGF0aCwgaXRcbiAqIG11c3QgaGF2ZSBwcmVmaXggYGZpbGU6Ly9gIGFuZCBpdCBvbmx5IHdvcmtzIGluIG5vZGUgZW52aXJvbm1lbnQuXG4gKiBAcGFyYW0gY3N2Q29uZmlnIChPcHRpb25hbCkgQSBDU1ZDb25maWcgb2JqZWN0IHRoYXQgY29udGFpbnMgY29uZmlndXJhdGlvbnNcbiAqICAgICBvZiByZWFkaW5nIGFuZCBkZWNvZGluZyBmcm9tIENTViBmaWxlKHMpLlxuICpcbiAqIEBkb2Mge1xuICogICBoZWFkaW5nOiAnRGF0YScsXG4gKiAgIHN1YmhlYWRpbmc6ICdDcmVhdGlvbicsXG4gKiAgIG5hbWVzcGFjZTogJ2RhdGEnLFxuICogICBjb25maWdQYXJhbUluZGljZXM6IFsxXVxuICogIH1cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGNzdihcbiAgICBzb3VyY2U6IFJlcXVlc3RJbmZvLCBjc3ZDb25maWc6IENTVkNvbmZpZyA9IHt9KTogQ1NWRGF0YXNldCB7XG4gIHJldHVybiBuZXcgQ1NWRGF0YXNldChuZXcgVVJMRGF0YVNvdXJjZShzb3VyY2UpLCBjc3ZDb25maWcpO1xufVxuXG4vKipcbiAqIENyZWF0ZSBhIGBEYXRhc2V0YCB0aGF0IHByb2R1Y2VzIGVhY2ggZWxlbWVudCBieSBjYWxsaW5nIGEgcHJvdmlkZWQgZnVuY3Rpb24uXG4gKlxuICogTm90ZSB0aGF0IHJlcGVhdGVkIGl0ZXJhdGlvbnMgb3ZlciB0aGlzIGBEYXRhc2V0YCBtYXkgcHJvZHVjZSBkaWZmZXJlbnRcbiAqIHJlc3VsdHMsIGJlY2F1c2UgdGhlIGZ1bmN0aW9uIHdpbGwgYmUgY2FsbGVkIGFuZXcgZm9yIGVhY2ggZWxlbWVudCBvZiBlYWNoXG4gKiBpdGVyYXRpb24uXG4gKlxuICogQWxzbywgYmV3YXJlIHRoYXQgdGhlIHNlcXVlbmNlIG9mIGNhbGxzIHRvIHRoaXMgZnVuY3Rpb24gbWF5IGJlIG91dCBvZiBvcmRlclxuICogaW4gdGltZSB3aXRoIHJlc3BlY3QgdG8gdGhlIGxvZ2ljYWwgb3JkZXIgb2YgdGhlIERhdGFzZXQuIFRoaXMgaXMgZHVlIHRvIHRoZVxuICogYXN5bmNocm9ub3VzIGxhenkgbmF0dXJlIG9mIHN0cmVhbSBwcm9jZXNzaW5nLCBhbmQgZGVwZW5kcyBvbiBkb3duc3RyZWFtXG4gKiB0cmFuc2Zvcm1hdGlvbnMgKGUuZy4gLnNodWZmbGUoKSkuIElmIHRoZSBwcm92aWRlZCBmdW5jdGlvbiBpcyBwdXJlLCB0aGlzIGlzXG4gKiBubyBwcm9ibGVtLCBidXQgaWYgaXQgaXMgYSBjbG9zdXJlIG92ZXIgYSBtdXRhYmxlIHN0YXRlIChlLmcuLCBhIHRyYXZlcnNhbFxuICogcG9pbnRlciksIHRoZW4gdGhlIG9yZGVyIG9mIHRoZSBwcm9kdWNlZCBlbGVtZW50cyBtYXkgYmUgc2NyYW1ibGVkLlxuICpcbiAqIGBgYGpzXG4gKiBsZXQgaSA9IC0xO1xuICogY29uc3QgZnVuYyA9ICgpID0+XG4gKiAgICArK2kgPCA1ID8ge3ZhbHVlOiBpLCBkb25lOiBmYWxzZX0gOiB7dmFsdWU6IG51bGwsIGRvbmU6IHRydWV9O1xuICogY29uc3QgZHMgPSB0Zi5kYXRhLmZ1bmMoZnVuYyk7XG4gKiBhd2FpdCBkcy5mb3JFYWNoQXN5bmMoZSA9PiBjb25zb2xlLmxvZyhlKSk7XG4gKiBgYGBcbiAqXG4gKiBAcGFyYW0gZiBBIGZ1bmN0aW9uIHRoYXQgcHJvZHVjZXMgb25lIGRhdGEgZWxlbWVudCBvbiBlYWNoIGNhbGwuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBmdW5jPFQgZXh0ZW5kcyBUZW5zb3JDb250YWluZXI+KFxuICAgIGY6ICgpID0+IEl0ZXJhdG9yUmVzdWx0PFQ+fCBQcm9taXNlPEl0ZXJhdG9yUmVzdWx0PFQ+Pik6IERhdGFzZXQ8VD4ge1xuICBjb25zdCBpdGVyID0gaXRlcmF0b3JGcm9tRnVuY3Rpb24oZik7XG4gIHJldHVybiBkYXRhc2V0RnJvbUl0ZXJhdG9yRm4oYXN5bmMgKCkgPT4gaXRlcik7XG59XG5cbi8qKlxuICogQ3JlYXRlIGEgYERhdGFzZXRgIHRoYXQgcHJvZHVjZXMgZWFjaCBlbGVtZW50IGZyb20gcHJvdmlkZWQgSmF2YVNjcmlwdFxuICogZ2VuZXJhdG9yLCB3aGljaCBpcyBhIGZ1bmN0aW9uKlxuICogKGh0dHBzOi8vZGV2ZWxvcGVyLm1vemlsbGEub3JnL2VuLVVTL2RvY3MvV2ViL0phdmFTY3JpcHQvR3VpZGUvSXRlcmF0b3JzX2FuZF9HZW5lcmF0b3JzI0dlbmVyYXRvcl9mdW5jdGlvbnMpLFxuICogb3IgYSBmdW5jdGlvbiB0aGF0IHJldHVybnMgYW5cbiAqIGl0ZXJhdG9yXG4gKiAoaHR0cHM6Ly9kZXZlbG9wZXIubW96aWxsYS5vcmcvZW4tVVMvZG9jcy9XZWIvSmF2YVNjcmlwdC9HdWlkZS9JdGVyYXRvcnNfYW5kX0dlbmVyYXRvcnMjR2VuZXJhdG9yX2Z1bmN0aW9ucykuXG4gKlxuICogVGhlIHJldHVybmVkIGl0ZXJhdG9yIHNob3VsZCBoYXZlIGAubmV4dCgpYCBmdW5jdGlvbiB0aGF0IHJldHVybnMgZWxlbWVudCBpblxuICogZm9ybWF0IG9mIGB7dmFsdWU6IFRlbnNvckNvbnRhaW5lciwgZG9uZTpib29sZWFufWAuXG4gKlxuICogRXhhbXBsZSBvZiBjcmVhdGluZyBhIGRhdGFzZXQgZnJvbSBhbiBpdGVyYXRvciBmYWN0b3J5OlxuICogYGBganNcbiAqIGZ1bmN0aW9uIG1ha2VJdGVyYXRvcigpIHtcbiAqICAgY29uc3QgbnVtRWxlbWVudHMgPSAxMDtcbiAqICAgbGV0IGluZGV4ID0gMDtcbiAqXG4gKiAgIGNvbnN0IGl0ZXJhdG9yID0ge1xuICogICAgIG5leHQ6ICgpID0+IHtcbiAqICAgICAgIGxldCByZXN1bHQ7XG4gKiAgICAgICBpZiAoaW5kZXggPCBudW1FbGVtZW50cykge1xuICogICAgICAgICByZXN1bHQgPSB7dmFsdWU6IGluZGV4LCBkb25lOiBmYWxzZX07XG4gKiAgICAgICAgIGluZGV4Kys7XG4gKiAgICAgICAgIHJldHVybiByZXN1bHQ7XG4gKiAgICAgICB9XG4gKiAgICAgICByZXR1cm4ge3ZhbHVlOiBpbmRleCwgZG9uZTogdHJ1ZX07XG4gKiAgICAgfVxuICogICB9O1xuICogICByZXR1cm4gaXRlcmF0b3I7XG4gKiB9XG4gKiBjb25zdCBkcyA9IHRmLmRhdGEuZ2VuZXJhdG9yKG1ha2VJdGVyYXRvcik7XG4gKiBhd2FpdCBkcy5mb3JFYWNoQXN5bmMoZSA9PiBjb25zb2xlLmxvZyhlKSk7XG4gKiBgYGBcbiAqXG4gKiBFeGFtcGxlIG9mIGNyZWF0aW5nIGEgZGF0YXNldCBmcm9tIGEgZ2VuZXJhdG9yOlxuICogYGBganNcbiAqIGZ1bmN0aW9uKiBkYXRhR2VuZXJhdG9yKCkge1xuICogICBjb25zdCBudW1FbGVtZW50cyA9IDEwO1xuICogICBsZXQgaW5kZXggPSAwO1xuICogICB3aGlsZSAoaW5kZXggPCBudW1FbGVtZW50cykge1xuICogICAgIGNvbnN0IHggPSBpbmRleDtcbiAqICAgICBpbmRleCsrO1xuICogICAgIHlpZWxkIHg7XG4gKiAgIH1cbiAqIH1cbiAqXG4gKiBjb25zdCBkcyA9IHRmLmRhdGEuZ2VuZXJhdG9yKGRhdGFHZW5lcmF0b3IpO1xuICogYXdhaXQgZHMuZm9yRWFjaEFzeW5jKGUgPT4gY29uc29sZS5sb2coZSkpO1xuICogYGBgXG4gKlxuICogQHBhcmFtIGdlbmVyYXRvciBBIEphdmFTY3JpcHQgZ2VuZXJhdG9yIGZ1bmN0aW9uIHRoYXQgcmV0dXJucyBhIEphdmFTY3JpcHRcbiAqICAgICBpdGVyYXRvci5cbiAqXG4gKiBAZG9jIHtcbiAqICAgaGVhZGluZzogJ0RhdGEnLFxuICogICBzdWJoZWFkaW5nOiAnQ3JlYXRpb24nLFxuICogICBuYW1lc3BhY2U6ICdkYXRhJyxcbiAqICAgY29uZmlnUGFyYW1JbmRpY2VzOiBbMV1cbiAqICB9XG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBnZW5lcmF0b3I8VCBleHRlbmRzIFRlbnNvckNvbnRhaW5lcj4oXG4gICAgZ2VuZXJhdG9yOiAoKSA9PiBJdGVyYXRvcjxUPnwgUHJvbWlzZTxJdGVyYXRvcjxUPj4pOiBEYXRhc2V0PFQ+IHtcbiAgcmV0dXJuIGRhdGFzZXRGcm9tSXRlcmF0b3JGbihhc3luYyAoKSA9PiB7XG4gICAgY29uc3QgZ2VuID0gYXdhaXQgZ2VuZXJhdG9yKCk7XG4gICAgcmV0dXJuIGl0ZXJhdG9yRnJvbUZ1bmN0aW9uKCgpID0+IGdlbi5uZXh0KCkpO1xuICB9KTtcbn1cblxuLyoqXG4gKiBDcmVhdGUgYW4gaXRlcmF0b3IgdGhhdCBnZW5lcmF0ZXMgYFRlbnNvcmBzIGZyb20gd2ViY2FtIHZpZGVvIHN0cmVhbS4gVGhpc1xuICogQVBJIG9ubHkgd29ya3MgaW4gQnJvd3NlciBlbnZpcm9ubWVudCB3aGVuIHRoZSBkZXZpY2UgaGFzIHdlYmNhbS5cbiAqXG4gKiBOb3RlOiB0aGlzIGNvZGUgc25pcHBldCBvbmx5IHdvcmtzIHdoZW4gdGhlIGRldmljZSBoYXMgYSB3ZWJjYW0uIEl0IHdpbGxcbiAqIHJlcXVlc3QgcGVybWlzc2lvbiB0byBvcGVuIHRoZSB3ZWJjYW0gd2hlbiBydW5uaW5nLlxuICogYGBganNcbiAqIGNvbnN0IHZpZGVvRWxlbWVudCA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ3ZpZGVvJyk7XG4gKiB2aWRlb0VsZW1lbnQud2lkdGggPSAxMDA7XG4gKiB2aWRlb0VsZW1lbnQuaGVpZ2h0ID0gMTAwO1xuICogY29uc3QgY2FtID0gYXdhaXQgdGYuZGF0YS53ZWJjYW0odmlkZW9FbGVtZW50KTtcbiAqIGNvbnN0IGltZyA9IGF3YWl0IGNhbS5jYXB0dXJlKCk7XG4gKiBpbWcucHJpbnQoKTtcbiAqIGNhbS5zdG9wKCk7XG4gKiBgYGBcbiAqXG4gKiBAcGFyYW0gd2ViY2FtVmlkZW9FbGVtZW50IEEgYEhUTUxWaWRlb0VsZW1lbnRgIHVzZWQgdG8gcGxheSB2aWRlbyBmcm9tXG4gKiAgICAgd2ViY2FtLiBJZiB0aGlzIGVsZW1lbnQgaXMgbm90IHByb3ZpZGVkLCBhIGhpZGRlbiBgSFRNTFZpZGVvRWxlbWVudGAgd2lsbFxuICogICAgIGJlIGNyZWF0ZWQuIEluIHRoYXQgY2FzZSwgYHJlc2l6ZVdpZHRoYCBhbmQgYHJlc2l6ZUhlaWdodGAgbXVzdCBiZVxuICogICAgIHByb3ZpZGVkIHRvIHNldCB0aGUgZ2VuZXJhdGVkIHRlbnNvciBzaGFwZS5cbiAqIEBwYXJhbSB3ZWJjYW1Db25maWcgQSBgV2ViY2FtQ29uZmlnYCBvYmplY3QgdGhhdCBjb250YWlucyBjb25maWd1cmF0aW9ucyBvZlxuICogICAgIHJlYWRpbmcgYW5kIG1hbmlwdWxhdGluZyBkYXRhIGZyb20gd2ViY2FtIHZpZGVvIHN0cmVhbS5cbiAqXG4gKiBAZG9jIHtcbiAqICAgaGVhZGluZzogJ0RhdGEnLFxuICogICBzdWJoZWFkaW5nOiAnQ3JlYXRpb24nLFxuICogICBuYW1lc3BhY2U6ICdkYXRhJyxcbiAqICAgaWdub3JlQ0k6IHRydWVcbiAqICB9XG4gKi9cbmV4cG9ydCBhc3luYyBmdW5jdGlvbiB3ZWJjYW0oXG4gICAgd2ViY2FtVmlkZW9FbGVtZW50PzogSFRNTFZpZGVvRWxlbWVudCxcbiAgICB3ZWJjYW1Db25maWc/OiBXZWJjYW1Db25maWcpOiBQcm9taXNlPFdlYmNhbUl0ZXJhdG9yPiB7XG4gIHJldHVybiBXZWJjYW1JdGVyYXRvci5jcmVhdGUod2ViY2FtVmlkZW9FbGVtZW50LCB3ZWJjYW1Db25maWcpO1xufVxuXG4vKipcbiAqIENyZWF0ZSBhbiBpdGVyYXRvciB0aGF0IGdlbmVyYXRlcyBmcmVxdWVuY3ktZG9tYWluIHNwZWN0cm9ncmFtIGBUZW5zb3JgcyBmcm9tXG4gKiBtaWNyb3Bob25lIGF1ZGlvIHN0cmVhbSB3aXRoIGJyb3dzZXIncyBuYXRpdmUgRkZULiBUaGlzIEFQSSBvbmx5IHdvcmtzIGluXG4gKiBicm93c2VyIGVudmlyb25tZW50IHdoZW4gdGhlIGRldmljZSBoYXMgbWljcm9waG9uZS5cbiAqXG4gKiBOb3RlOiB0aGlzIGNvZGUgc25pcHBldCBvbmx5IHdvcmtzIHdoZW4gdGhlIGRldmljZSBoYXMgYSBtaWNyb3Bob25lLiBJdCB3aWxsXG4gKiByZXF1ZXN0IHBlcm1pc3Npb24gdG8gb3BlbiB0aGUgbWljcm9waG9uZSB3aGVuIHJ1bm5pbmcuXG4gKiBgYGBqc1xuICogY29uc3QgbWljID0gYXdhaXQgdGYuZGF0YS5taWNyb3Bob25lKHtcbiAqICAgZmZ0U2l6ZTogMTAyNCxcbiAqICAgY29sdW1uVHJ1bmNhdGVMZW5ndGg6IDIzMixcbiAqICAgbnVtRnJhbWVzUGVyU3BlY3Ryb2dyYW06IDQzLFxuICogICBzYW1wbGVSYXRlSHo6NDQxMDAsXG4gKiAgIGluY2x1ZGVTcGVjdHJvZ3JhbTogdHJ1ZSxcbiAqICAgaW5jbHVkZVdhdmVmb3JtOiB0cnVlXG4gKiB9KTtcbiAqIGNvbnN0IGF1ZGlvRGF0YSA9IGF3YWl0IG1pYy5jYXB0dXJlKCk7XG4gKiBjb25zdCBzcGVjdHJvZ3JhbVRlbnNvciA9IGF1ZGlvRGF0YS5zcGVjdHJvZ3JhbTtcbiAqIHNwZWN0cm9ncmFtVGVuc29yLnByaW50KCk7XG4gKiBjb25zdCB3YXZlZm9ybVRlbnNvciA9IGF1ZGlvRGF0YS53YXZlZm9ybTtcbiAqIHdhdmVmb3JtVGVuc29yLnByaW50KCk7XG4gKiBtaWMuc3RvcCgpO1xuICogYGBgXG4gKlxuICogQHBhcmFtIG1pY3JvcGhvbmVDb25maWcgQSBgTWljcm9waG9uZUNvbmZpZ2Agb2JqZWN0IHRoYXQgY29udGFpbnNcbiAqICAgICBjb25maWd1cmF0aW9ucyBvZiByZWFkaW5nIGF1ZGlvIGRhdGEgZnJvbSBtaWNyb3Bob25lLlxuICpcbiAqIEBkb2Mge1xuICogICBoZWFkaW5nOiAnRGF0YScsXG4gKiAgIHN1YmhlYWRpbmc6ICdDcmVhdGlvbicsXG4gKiAgIG5hbWVzcGFjZTogJ2RhdGEnLFxuICogICBpZ25vcmVDSTogdHJ1ZVxuICogIH1cbiAqL1xuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIG1pY3JvcGhvbmUobWljcm9waG9uZUNvbmZpZz86IE1pY3JvcGhvbmVDb25maWcpOlxuICAgIFByb21pc2U8TWljcm9waG9uZUl0ZXJhdG9yPiB7XG4gIHJldHVybiBNaWNyb3Bob25lSXRlcmF0b3IuY3JlYXRlKG1pY3JvcGhvbmVDb25maWcpO1xufVxuIl19","/** @license See the LICENSE file. */\n// This code is auto-generated, do not modify this file!\nconst version = '3.21.0';\nexport { version };\n//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidmVyc2lvbi5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uL3RmanMtZGF0YS9zcmMvdmVyc2lvbi50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxxQ0FBcUM7QUFFckMsd0RBQXdEO0FBQ3hELE1BQU0sT0FBTyxHQUFHLFFBQVEsQ0FBQztBQUN6QixPQUFPLEVBQUMsT0FBTyxFQUFDLENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyIvKiogQGxpY2Vuc2UgU2VlIHRoZSBMSUNFTlNFIGZpbGUuICovXG5cbi8vIFRoaXMgY29kZSBpcyBhdXRvLWdlbmVyYXRlZCwgZG8gbm90IG1vZGlmeSB0aGlzIGZpbGUhXG5jb25zdCB2ZXJzaW9uID0gJzMuMjEuMCc7XG5leHBvcnQge3ZlcnNpb259O1xuIl19","/**\n * @license\n * Copyright 2019 Google LLC. All Rights Reserved.\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n * =============================================================================\n */\nimport { util } from '@tensorflow/tfjs-core';\nexport function assertNotComplex(tensor, opName) {\n if (!Array.isArray(tensor)) {\n tensor = [tensor];\n }\n tensor.forEach(t => {\n if (t != null) {\n util.assert(t.dtype !== 'complex64', () => `${opName} does not support complex64 tensors in the CPU backend.`);\n }\n });\n}\n//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY3B1X3V0aWwuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi90ZmpzLWJhY2tlbmQtY3B1L3NyYy9jcHVfdXRpbC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQTs7Ozs7Ozs7Ozs7Ozs7O0dBZUc7QUFFSCxPQUFPLEVBQWEsSUFBSSxFQUFDLE1BQU0sdUJBQXVCLENBQUM7QUFFdkQsTUFBTSxVQUFVLGdCQUFnQixDQUM1QixNQUErQixFQUFFLE1BQWM7SUFDakQsSUFBSSxDQUFDLEtBQUssQ0FBQyxPQUFPLENBQUMsTUFBTSxDQUFDLEVBQUU7UUFDMUIsTUFBTSxHQUFHLENBQUMsTUFBTSxDQUFDLENBQUM7S0FDbkI7SUFDRCxNQUFNLENBQUMsT0FBTyxDQUFDLENBQUMsQ0FBQyxFQUFFO1FBQ2pCLElBQUksQ0FBQyxJQUFJLElBQUksRUFBRTtZQUNiLElBQUksQ0FBQyxNQUFNLENBQ1AsQ0FBQyxDQUFDLEtBQUssS0FBSyxXQUFXLEVBQ3ZCLEdBQUcsRUFBRSxDQUFDLEdBQ0YsTUFBTSx5REFBeUQsQ0FBQyxDQUFDO1NBQzFFO0lBQ0gsQ0FBQyxDQUFDLENBQUM7QUFDTCxDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiLyoqXG4gKiBAbGljZW5zZVxuICogQ29weXJpZ2h0IDIwMTkgR29vZ2xlIExMQy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC5cbiAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSBcIkxpY2Vuc2VcIik7XG4gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuXG4gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXRcbiAqXG4gKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjBcbiAqXG4gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlXG4gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiBcIkFTIElTXCIgQkFTSVMsXG4gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC5cbiAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmRcbiAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLlxuICogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbiAqL1xuXG5pbXBvcnQge1RlbnNvckluZm8sIHV0aWx9IGZyb20gJ0B0ZW5zb3JmbG93L3RmanMtY29yZSc7XG5cbmV4cG9ydCBmdW5jdGlvbiBhc3NlcnROb3RDb21wbGV4KFxuICAgIHRlbnNvcjogVGVuc29ySW5mb3xUZW5zb3JJbmZvW10sIG9wTmFtZTogc3RyaW5nKTogdm9pZCB7XG4gIGlmICghQXJyYXkuaXNBcnJheSh0ZW5zb3IpKSB7XG4gICAgdGVuc29yID0gW3RlbnNvcl07XG4gIH1cbiAgdGVuc29yLmZvckVhY2godCA9PiB7XG4gICAgaWYgKHQgIT0gbnVsbCkge1xuICAgICAgdXRpbC5hc3NlcnQoXG4gICAgICAgICAgdC5kdHlwZSAhPT0gJ2NvbXBsZXg2NCcsXG4gICAgICAgICAgKCkgPT4gYCR7XG4gICAgICAgICAgICAgIG9wTmFtZX0gZG9lcyBub3Qgc3VwcG9ydCBjb21wbGV4NjQgdGVuc29ycyBpbiB0aGUgQ1BVIGJhY2tlbmQuYCk7XG4gICAgfVxuICB9KTtcbn1cbiJdfQ==","/**\n * @license\n * Copyright 2021 Google LLC. All Rights Reserved.\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n * =============================================================================\n */\nimport { backend_util, buffer, DataStorage, engine, env, kernel_impls, KernelBackend, util } from '@tensorflow/tfjs-core';\nconst whereImpl = kernel_impls.whereImpl;\nimport { assertNotComplex } from './cpu_util';\nexport class MathBackendCPU extends KernelBackend {\n constructor() {\n super();\n this.blockSize = 48;\n this.firstUse = true;\n this.data = new DataStorage(this, engine());\n }\n nextDataId() {\n return MathBackendCPU.nextDataId++;\n }\n write(values, shape, dtype) {\n if (this.firstUse) {\n this.firstUse = false;\n if (env().get('IS_NODE')) {\n backend_util.warn('\\n============================\\n' +\n 'Hi, looks like you are running TensorFlow.js in ' +\n 'Node.js. To speed things up dramatically, install our node ' +\n 'backend, visit https://github.com/tensorflow/tfjs-node for more details. ' +\n '\\n============================');\n }\n }\n const dataId = { id: this.nextDataId() };\n this.data.set(dataId, { values, dtype, refCount: 1 });\n return dataId;\n }\n /**\n * Create a data bucket in cpu backend.\n * @param shape Shape of the `TensorInfo`.\n * @param dtype DType of the `TensorInfo`.\n * @param values The value of the `TensorInfo` stored as a flattened array.\n */\n makeTensorInfo(shape, dtype, values) {\n let outId;\n if (dtype === 'string' && values != null && values.length > 0 &&\n util.isString(values[0])) {\n const encodedValues = values.map(d => util.encodeString(d));\n outId = this.write(encodedValues, shape, dtype);\n }\n else {\n outId = this.write(values, shape, dtype);\n }\n return { dataId: outId, shape, dtype };\n }\n /** Return refCount of a `TensorData`. */\n refCount(dataId) {\n if (this.data.has(dataId)) {\n const tensorData = this.data.get(dataId);\n return tensorData.refCount;\n }\n return 0;\n }\n /** Increase refCount of a `TensorData`. */\n incRef(dataId) {\n const tensorData = this.data.get(dataId);\n tensorData.refCount++;\n }\n /** Decrease refCount of a `TensorData`. */\n decRef(dataId) {\n if (this.data.has(dataId)) {\n const tensorData = this.data.get(dataId);\n tensorData.refCount--;\n }\n }\n move(dataId, values, shape, dtype, refCount) {\n this.data.set(dataId, { values, dtype, refCount });\n }\n numDataIds() {\n return this.data.numDataIds();\n }\n async read(dataId) {\n return this.readSync(dataId);\n }\n readSync(dataId) {\n const { dtype, complexTensorInfos } = this.data.get(dataId);\n if (dtype === 'complex64') {\n const realValues = this.readSync(complexTensorInfos.real.dataId);\n const imagValues = this.readSync(complexTensorInfos.imag.dataId);\n return backend_util.mergeRealAndImagArrays(realValues, imagValues);\n }\n return this.data.get(dataId).values;\n }\n bufferSync(t) {\n const data = this.readSync(t.dataId);\n if (t.dtype === 'string') {\n try {\n // Decode the bytes into string.\n const strings = data.map(d => util.decodeString(d));\n return buffer(t.shape, t.dtype, strings);\n }\n catch (_a) {\n throw new Error('Failed to decode encoded string bytes into utf-8');\n }\n }\n return buffer(t.shape, t.dtype, data);\n }\n makeOutput(values, shape, dtype) {\n return engine().makeTensorFromTensorInfo(this.makeTensorInfo(shape, dtype, values), this);\n }\n /**\n * Dispose the memory if the dataId has 0 refCount. Return true if the memory\n * is released or memory is not managed in this backend, false if memory is\n * not cleared.\n * @param dataId\n * @oaram force Optional, remove the data regardless of refCount\n */\n disposeData(dataId, force = false) {\n if (this.data.has(dataId)) {\n this.data.get(dataId).refCount--;\n if (!force && this.data.get(dataId).refCount > 0) {\n return false;\n }\n const { complexTensorInfos } = this.data.get(dataId);\n if (complexTensorInfos != null) {\n this.disposeData(complexTensorInfos.real.dataId, true);\n this.disposeData(complexTensorInfos.imag.dataId, true);\n }\n this.data.delete(dataId);\n }\n return true;\n }\n disposeIntermediateTensorInfo(tensorInfo) {\n this.disposeData(tensorInfo.dataId);\n }\n async time(f) {\n const start = util.now();\n f();\n const kernelMs = util.now() - start;\n return { kernelMs };\n }\n memory() {\n return {\n // Unreliable due to automatic gc. The numbers above are cumulative.\n unreliable: true,\n reasons: ['The reported memory is an upper bound. Due to automatic garbage ' +\n 'collection, the true allocated memory may be less.']\n };\n }\n where(condition) {\n assertNotComplex([condition], 'where');\n const condVals = this.readSync(condition.dataId);\n return whereImpl(condition.shape, condVals);\n }\n dispose() { }\n floatPrecision() {\n return 32;\n }\n /** Returns the smallest representable number. */\n epsilon() {\n return super.epsilon();\n }\n}\nMathBackendCPU.nextDataId = 0;\n//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYmFja2VuZF9jcHUuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi90ZmpzLWJhY2tlbmQtY3B1L3NyYy9iYWNrZW5kX2NwdS50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQTs7Ozs7Ozs7Ozs7Ozs7O0dBZUc7QUFFSCxPQUFPLEVBQUMsWUFBWSxFQUFxQixNQUFNLEVBQUUsV0FBVyxFQUFZLE1BQU0sRUFBRSxHQUFHLEVBQUUsWUFBWSxFQUFFLGFBQWEsRUFBMEUsSUFBSSxFQUFDLE1BQU0sdUJBQXVCLENBQUM7QUFFN04sTUFBTSxTQUFTLEdBQUcsWUFBWSxDQUFDLFNBQVMsQ0FBQztBQUN6QyxPQUFPLEVBQUMsZ0JBQWdCLEVBQUMsTUFBTSxZQUFZLENBQUM7QUFnQjVDLE1BQU0sT0FBTyxjQUFlLFNBQVEsYUFBYTtJQVUvQztRQUNFLEtBQUssRUFBRSxDQUFDO1FBVkgsY0FBUyxHQUFHLEVBQUUsQ0FBQztRQUdkLGFBQVEsR0FBRyxJQUFJLENBQUM7UUFRdEIsSUFBSSxDQUFDLElBQUksR0FBRyxJQUFJLFdBQVcsQ0FBQyxJQUFJLEVBQUUsTUFBTSxFQUFFLENBQUMsQ0FBQztJQUM5QyxDQUFDO0lBUE8sVUFBVTtRQUNoQixPQUFPLGNBQWMsQ0FBQyxVQUFVLEVBQUUsQ0FBQztJQUNyQyxDQUFDO0lBT0QsS0FBSyxDQUFDLE1BQWtDLEVBQUUsS0FBZSxFQUFFLEtBQWU7UUFFeEUsSUFBSSxJQUFJLENBQUMsUUFBUSxFQUFFO1lBQ2pCLElBQUksQ0FBQyxRQUFRLEdBQUcsS0FBSyxDQUFDO1lBQ3RCLElBQUksR0FBRyxFQUFFLENBQUMsR0FBRyxDQUFDLFNBQVMsQ0FBQyxFQUFFO2dCQUN4QixZQUFZLENBQUMsSUFBSSxDQUNiLGtDQUFrQztvQkFDbEMsa0RBQWtEO29CQUNsRCw2REFBNkQ7b0JBQzdELDJFQUEyRTtvQkFDM0UsZ0NBQWdDLENBQUMsQ0FBQzthQUN2QztTQUNGO1FBQ0QsTUFBTSxNQUFNLEdBQUcs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Q0FBQztJQUNwQixDQUFDO0lBRUQsTUFBTTtRQUNKLE9BQU87WUFDTCxvRUFBb0U7WUFDcEUsVUFBVSxFQUFFLElBQUk7WUFDaEIsT0FBTyxFQUNILENBQUMsa0VBQWtFO29CQUNsRSxvREFBb0QsQ0FBQztTQUMzRCxDQUFDO0lBQ0osQ0FBQztJQUVELEtBQUssQ0FBQyxTQUFpQjtRQUNyQixnQkFBZ0IsQ0FBQyxDQUFDLFNBQVMsQ0FBQyxFQUFFLE9BQU8sQ0FBQyxDQUFDO1FBRXZDLE1BQU0sUUFBUSxHQUFHLElBQUksQ0FBQyxRQUFRLENBQUMsU0FBUyxDQUFDLE1BQU0sQ0FBZSxDQUFDO1FBQy9ELE9BQU8sU0FBUyxDQUFDLFNBQVMsQ0FBQyxLQUFLLEVBQUUsUUFBUSxDQUFDLENBQUM7SUFDOUMsQ0FBQztJQUVELE9BQU8sS0FBSSxDQUFDO0lBRVosY0FBYztRQUNaLE9BQU8sRUFBRSxDQUFDO0lBQ1osQ0FBQztJQUVELGtEQUFrRDtJQUNsRCxPQUFPO1FBQ0wsT0FBTyxLQUFLLENBQUMsT0FBTyxFQUFFLENBQUM7SUFDekIsQ0FBQzs7QUE3TGMseUJBQVUsR0FBRyxDQUFDLENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyIvKipcbiAqIEBsaWNlbnNlXG4gKiBDb3B5cmlnaHQgMjAyMSBHb29nbGUgTExDLiBBbGwgUmlnaHRzIFJlc2VydmVkLlxuICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlIFwiTGljZW5zZVwiKTtcbiAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS5cbiAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdFxuICpcbiAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMFxuICpcbiAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmVcbiAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuIFwiQVMgSVNcIiBCQVNJUyxcbiAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLlxuICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZFxuICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuXG4gKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuICovXG5cbmltcG9ydCB7YmFja2VuZF91dGlsLCBCYWNrZW5kVGltaW5nSW5mbywgYnVmZmVyLCBEYXRhU3RvcmFnZSwgRGF0YVR5cGUsIGVuZ2luZSwgZW52LCBrZXJuZWxfaW1wbHMsIEtlcm5lbEJhY2tlbmQsIFJhbmssIFNoYXBlTWFwLCBUZW5zb3IsIFRlbnNvcjJELCBUZW5zb3JCdWZmZXIsIFRlbnNvckluZm8sIFR5cGVkQXJyYXksIHV0aWx9IGZyb20gJ0B0ZW5zb3JmbG93L3RmanMtY29yZSc7XG5cbmNvbnN0IHdoZXJlSW1wbCA9IGtlcm5lbF9pbXBscy53aGVyZUltcGw7XG5pbXBvcnQge2Fzc2VydE5vdENvbXBsZXh9IGZyb20gJy4vY3B1X3V0aWwnO1xuXG5pbnRlcmZhY2UgRGF0YUlkIHt9XG5cbmV4cG9ydCBpbnRlcmZhY2UgVGVuc29yRGF0YTxEIGV4dGVuZHMgRGF0YVR5cGU+IHtcbiAgdmFsdWVzPzogYmFja2VuZF91dGlsLkJhY2tlbmRWYWx1ZXM7XG4gIGR0eXBlOiBEO1xuICAvLyBGb3IgY29tcGxleCBudW1iZXJzLCB0aGUgcmVhbCBhbmQgaW1hZ2luYXJ5IHBhcnRzIGFyZSBzdG9yZWQgYXMgdGhlaXIgb3duXG4gIC8vIGluZGl2aWR1YWwgdGVuc29ycywgd2l0aCBhIHBhcmVudCBqb2luaW5nIHRoZSB0d28gd2l0aCB0aGVcbiAgLy8gY29tcGxleFRlbnNvckluZm9zIGZpZWxkLlxuICBjb21wbGV4VGVuc29ySW5mb3M/OiB7cmVhbDogVGVuc29ySW5mbywgaW1hZzogVGVuc29ySW5mb307XG4gIC8vIHJlZkNvdW50IGtlZXBzIHRyYWNrIG9mIGhvdyBtYW55IHRlbnNvcnMgcmVmZXJlbmNlIGl0LiBVc2VkIGZvciBtZW1vcnlcbiAgLy8gbWFuYWdlbWVudC5cbiAgcmVmQ291bnQ6IG51bWJlcjtcbn1cblxuZXhwb3J0IGNsYXNzIE1hdGhCYWNrZW5kQ1BVIGV4dGVuZHMgS2VybmVsQmFja2VuZCB7XG4gIHB1YmxpYyBibG9ja1NpemUgPSA0ODtcblxuICBkYXRhOiBEYXRhU3RvcmFnZTxUZW5zb3JEYXRhPERhdGFUeXBlPj47XG4gIHByaXZhdGUgZmlyc3RVc2UgPSB0cnVlO1xuICBwcml2YXRlIHN0YXRpYyBuZXh0RGF0YUlkID0gMDtcbiAgcHJpdmF0ZSBuZXh0RGF0YUlkKCk6IG51bWJlciB7XG4gICAgcmV0dXJuIE1hdGhCYWNrZW5kQ1BVLm5leHREYXRhSWQrKztcbiAgfVxuXG4gIGNvbnN0cnVjdG9yKCkge1xuICAgIHN1cGVyKCk7XG4gICAgdGhpcy5kYXRhID0gbmV3IERhdGFTdG9yYWdlKHRoaXMsIGVuZ2luZSgpKTtcbiAgfVxuXG4gIHdyaXRlKHZhbHVlczogYmFja2VuZF91dGlsLkJhY2tlbmRWYWx1ZXMsIHNoYXBlOiBudW1iZXJbXSwgZHR5cGU6IERhdGFUeXBlKTpcbiAgICAgIERhdGFJZCB7XG4gICAgaWYgKHRoaXMuZmlyc3RVc2UpIHtcbiAgICAgIHRoaXMuZmlyc3RVc2UgPSBmYWxzZTtcbiAgICAgIGlmIChlbnYoKS5nZXQoJ0lTX05PREUnKSkge1xuICAgICAgICBiYWNrZW5kX3V0aWwud2FybihcbiAgICAgICAgICAgICdcXG49PT09PT09PT09PT09PT09PT09PT09PT09PT09XFxuJyArXG4gICAgICAgICAgICAnSGksIGxvb2tzIGxpa2UgeW91IGFyZSBydW5uaW5nIFRlbnNvckZsb3cuanMgaW4gJyArXG4gICAgICAgICAgICAnTm9kZS5qcy4gVG8gc3BlZWQgdGhpbmdzIHVwIGRyYW1hdGljYWxseSwgaW5zdGFsbCBvdXIgbm9kZSAnICtcbiAgICAgICAgICAgICdiYWNrZW5kLCB2aXNpdCBodHRwczovL2dpdGh1Yi5jb20vdGVuc29yZmxvdy90ZmpzLW5vZGUgZm9yIG1vcmUgZGV0YWlscy4gJyArXG4gICAgICAgICAgICAnXFxuPT09PT09PT09PT09PT09PT09PT09PT09PT09PScpO1xuICAgICAgfVxuICAgIH1cbiAgICBjb25zdCBkYXRhSWQgPSB7aWQ6IHRoaXMubmV4dERhdGFJZCgpfTtcblxuICAgIHRoaXMuZGF0YS5zZXQoZGF0YUlkLCB7dmFsdWVzLCBkdHlwZSwgcmVmQ291bnQ6IDF9KTtcblxuICAgIHJldHVybiBkYXRhSWQ7XG4gIH1cblxuICAvKipcbiAgICogQ3JlYXRlIGEgZGF0YSBidWNrZXQgaW4gY3B1IGJhY2tlbmQuXG4gICAqIEBwYXJhbSBzaGFwZSBTaGFwZSBvZiB0aGUgYFRlbnNvckluZm9gLlxuICAgKiBAcGFyYW0gZHR5cGUgRFR5cGUgb2YgdGhlIGBUZW5zb3JJbmZvYC5cbiAgICogQHBhcmFtIHZhbHVlcyBUaGUgdmFsdWUgb2YgdGhlIGBUZW5zb3JJbmZvYCBzdG9yZWQgYXMgYSBmbGF0dGVuZWQgYXJyYXkuXG4gICAqL1xuICBtYWtlVGVuc29ySW5mbyhcbiAgICAgIHNoYXBlOiBudW1iZXJbXSwgZHR5cGU6IERhdGFUeXBlLFxuICAgICAgdmFsdWVzPzogYmFja2VuZF91dGlsLkJhY2tlbmRWYWx1ZXN8c3RyaW5nW10pOiBUZW5zb3JJbmZvIHtcbiAgICBsZXQgb3V0SWQ7XG4gICAgaWYgKGR0eXBlID09PSAnc3RyaW5nJyAmJiB2YWx1ZXMgIT0gbnVsbCAmJiB2YWx1ZXMubGVuZ3RoID4gMCAmJlxuICAgICAgICB1dGlsLmlzU3RyaW5nKHZhbHVlc1swXSkpIHtcbiAgICAgIGNvbnN0IGVuY29kZWRWYWx1ZXMgPVxuICAgICAgICAgICh2YWx1ZXMgYXMge30gYXMgc3RyaW5nW10pLm1hcChkID0+IHV0aWwuZW5jb2RlU3RyaW5nKGQpKTtcblxuICAgICAgb3V0SWQgPSB0aGlzLndyaXRlKGVuY29kZWRWYWx1ZXMsIHNoYXBlLCBkdHlwZSk7XG4gICAgfSBlbHNlIHtcbiAgICAgIG91dElkID0gdGhpcy53cml0ZSh2YWx1ZXMgYXMgVHlwZWRBcnJheSwgc2hhcGUsIGR0eXBlKTtcbiAgICB9XG5cbiAgICByZXR1cm4ge2RhdGFJZDogb3V0SWQsIHNoYXBlLCBkdHlwZX07XG4gIH1cblxuICAvKiogUmV0dXJuIHJlZkNvdW50IG9mIGEgYFRlbnNvckRhdGFgLiAqL1xuICByZWZDb3VudChkYXRhSWQ6IERhdGFJZCk6IG51bWJlciB7XG4gICAgaWYgKHRoaXMuZGF0YS5oYXMoZGF0YUlkKSkge1xuICAgICAgY29uc3QgdGVuc29yRGF0YSA9IHRoaXMuZGF0YS5nZXQoZGF0YUlkKTtcbiAgICAgIHJldHVybiB0ZW5zb3JEYXRhLnJlZkNvdW50O1xuICAgIH1cbiAgICByZXR1cm4gMDtcbiAgfVxuXG4gIC8qKiBJbmNyZWFzZSByZWZDb3VudCBvZiBhIGBUZW5zb3JEYXRhYC4gKi9cbiAgaW5jUmVmKGRhdGFJZDogRGF0YUlkKTogdm9pZCB7XG4gICAgY29uc3QgdGVuc29yRGF0YSA9IHRoaXMuZGF0YS5nZXQoZGF0YUlkKTtcbiAgICB0ZW5zb3JEYXRhLnJlZkNvdW50Kys7XG4gIH1cblxuICAvKiogRGVjcmVhc2UgcmVmQ291bnQgb2YgYSBgVGVuc29yRGF0YWAuICovXG4gIGRlY1JlZihkYXRhSWQ6IERhdGFJZCk6IHZvaWQge1xuICAgIGlmICh0aGlzLmRhdGEuaGFzKGRhdGFJZCkpIHtcbiAgICAgIGNvbnN0IHRlbnNvckRhdGEgPSB0aGlzLmRhdGEuZ2V0KGRhdGFJZCk7XG4gICAgICB0ZW5zb3JEYXRhLnJlZkNvdW50LS07XG4gICAgfVxuICB9XG5cbiAgbW92ZShcbiAgICAgIGRhdGFJZDogRGF0YUlkLCB2YWx1ZXM6IGJhY2tlbmRfdXRpbC5CYWNrZW5kVmFsdWVzLCBzaGFwZTogbnVtYmVyW10sXG4gICAgICBkdHlwZTogRGF0YVR5cGUsIHJlZkNvdW50OiBudW1iZXIpOiB2b2lkIHtcbiAgICB0aGlzLmRhdGEuc2V0KGRhdGFJZCwge3ZhbHVlcywgZHR5cGUsIHJlZkNvdW50fSk7XG4gIH1cblxuICBudW1EYXRhSWRzKCk6IG51bWJlciB7XG4gICAgcmV0dXJuIHRoaXMuZGF0YS5udW1EYXRhSWRzKCk7XG4gIH1cblxuICBhc3luYyByZWFkKGRhdGFJZDogRGF0YUlkKTogUHJvbWlzZTxiYWNrZW5kX3V0aWwuQmFja2VuZFZhbHVlcz4ge1xuICAgIHJldHVybiB0aGlzLnJlYWRTeW5jKGRhdGFJZCk7XG4gIH1cbiAgcmVhZFN5bmMoZGF0YUlkOiBEYXRhSWQpOiBiYWNrZW5kX3V0aWwuQmFja2VuZFZhbHVlcyB7XG4gICAgY29uc3Qge2R0eXBlLCBjb21wbGV4VGVuc29ySW5mb3N9ID0gdGhpcy5kYXRhLmdldChkYXRhSWQpO1xuXG4gICAgaWYgKGR0eXBlID09PSAnY29tcGxleDY0Jykge1xuICAgICAgY29uc3QgcmVhbFZhbHVlcyA9XG4gICAgICAgICAgdGhpcy5yZWFkU3luYyhjb21wbGV4VGVuc29ySW5mb3MucmVhbC5kYXRhSWQpIGFzIEZsb2F0MzJBcnJheTtcbiAgICAgIGNvbnN0IGltYWdWYWx1ZXMgPVxuICAgICAgICAgIHRoaXMucmVhZFN5bmMoY29tcGxleFRlbnNvckluZm9zLmltYWcuZGF0YUlkKSBhcyBGbG9hdDMyQXJyYXk7XG4gICAgICByZXR1cm4gYmFja2VuZF91dGlsLm1lcmdlUmVhbEFuZEltYWdBcnJheXMocmVhbFZhbHVlcywgaW1hZ1ZhbHVlcyk7XG4gICAgfVxuXG4gICAgcmV0dXJuIHRoaXMuZGF0YS5nZXQoZGF0YUlkKS52YWx1ZXM7XG4gIH1cblxuICBidWZmZXJTeW5jPFIgZXh0ZW5kcyBSYW5rLCBEIGV4dGVuZHMgRGF0YVR5cGU+KHQ6IFRlbnNvckluZm8pOlxuICAgICAgVGVuc29yQnVmZmVyPFIsIEQ+IHtcbiAgICBjb25zdCBkYXRhID0gdGhpcy5yZWFkU3luYyh0LmRhdGFJZCk7XG4gICAgaWYgKHQuZHR5cGUgPT09ICdzdHJpbmcnKSB7XG4gICAgICB0cnkge1xuICAgICAgICAvLyBEZWNvZGUgdGhlIGJ5dGVzIGludG8gc3RyaW5nLlxuICAgICAgICBjb25zdCBzdHJpbmdzID0gKGRhdGEgYXMgVWludDhBcnJheVtdKS5tYXAoZCA9PiB1dGlsLmRlY29kZVN0cmluZyhkKSk7XG4gICAgICAgIHJldHVybiBidWZmZXIodC5zaGFwZSBhcyBTaGFwZU1hcFtSXSwgdC5kdHlwZSwgc3RyaW5ncykgYXNcbiAgICAgICAgICAgIFRlbnNvckJ1ZmZlcjxSLCBEPjtcbiAgICAgIH0gY2F0Y2gge1xuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ0ZhaWxlZCB0byBkZWNvZGUgZW5jb2RlZCBzdHJpbmcgYnl0ZXMgaW50byB1dGYtOCcpO1xuICAgICAgfVxuICAgIH1cbiAgICByZXR1cm4gYnVmZmVyKHQuc2hhcGUgYXMgU2hhcGVNYXBbUl0sIHQuZHR5cGUsIGRhdGEgYXMgVHlwZWRBcnJheSkgYXNcbiAgICAgICAgVGVuc29yQnVmZmVyPFIsIEQ+O1xuICB9XG5cbiAgbWFrZU91dHB1dDxUIGV4dGVuZHMgVGVuc29yPihcbiAgICAgIHZhbHVlczogYmFja2VuZF91dGlsLkJhY2tlbmRWYWx1ZXMsIHNoYXBlOiBudW1iZXJbXSwgZHR5cGU6IERhdGFUeXBlKTogVCB7XG4gICAgcmV0dXJuIGVuZ2luZSgpLm1ha2VUZW5zb3JGcm9tVGVuc29ySW5mbyhcbiAgICAgICAgICAgICAgIHRoaXMubWFrZVRlbnNvckluZm8oc2hhcGUsIGR0eXBlLCB2YWx1ZXMpLCB0aGlzKSBhcyBUO1xuICB9XG5cbiAgLyoqXG4gICAqIERpc3Bvc2UgdGhlIG1lbW9yeSBpZiB0aGUgZGF0YUlkIGhhcyAwIHJlZkNvdW50LiBSZXR1cm4gdHJ1ZSBpZiB0aGUgbWVtb3J5XG4gICAqIGlzIHJlbGVhc2VkIG9yIG1lbW9yeSBpcyBub3QgbWFuYWdlZCBpbiB0aGlzIGJhY2tlbmQsIGZhbHNlIGlmIG1lbW9yeSBpc1xuICAgKiBub3QgY2xlYXJlZC5cbiAgICogQHBhcmFtIGRhdGFJZFxuICAgKiBAb2FyYW0gZm9yY2UgT3B0aW9uYWwsIHJlbW92ZSB0aGUgZGF0YSByZWdhcmRsZXNzIG9mIHJlZkNvdW50XG4gICAqL1xuICBkaXNwb3NlRGF0YShkYXRhSWQ6IERhdGFJZCwgZm9yY2UgPSBmYWxzZSk6IGJvb2xlYW4ge1xuICAgIGlmICh0aGlzLmRhdGEuaGFzKGRhdGFJZCkpIHtcbiAgICAgIHRoaXMuZGF0YS5nZXQoZGF0YUlkKS5yZWZDb3VudC0tO1xuICAgICAgaWYgKCFmb3JjZSAmJiB0aGlzLmRhdGEuZ2V0KGRhdGFJZCkucmVmQ291bnQgPiAwKSB7XG4gICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgIH1cblxuICAgICAgY29uc3Qge2NvbXBsZXhUZW5zb3JJbmZvc30gPSB0aGlzLmRhdGEuZ2V0KGRhdGFJZCk7XG5cbiAgICAgIGlmIChjb21wbGV4VGVuc29ySW5mb3MgIT0gbnVsbCkge1xuICAgICAgICB0aGlzLmRpc3Bvc2VEYXRhKGNvbXBsZXhUZW5zb3JJbmZvcy5yZWFsLmRhdGFJZCwgdHJ1ZSk7XG4gICAgICAgIHRoaXMuZGlzcG9zZURhdGEoY29tcGxleFRlbnNvckluZm9zLmltYWcuZGF0YUlkLCB0cnVlKTtcbiAgICAgIH1cblxuICAgICAgdGhpcy5kYXRhLmRlbGV0ZShkYXRhSWQpO1xuICAgIH1cbiAgICByZXR1cm4gdHJ1ZTtcbiAgfVxuXG4gIGRpc3Bvc2VJbnRlcm1lZGlhdGVUZW5zb3JJbmZvKHRlbnNvckluZm86IFRlbnNvckluZm8pOiB2b2lkIHtcbiAgICB0aGlzLmRpc3Bvc2VEYXRhKHRlbnNvckluZm8uZGF0YUlkKTtcbiAgfVxuXG4gIGFzeW5jIHRpbWUoZjogKCkgPT4gdm9pZCk6IFByb21pc2U8QmFja2VuZFRpbWluZ0luZm8+IHtcbiAgICBjb25zdCBzdGFydCA9IHV0aWwubm93KCk7XG4gICAgZigpO1xuICAgIGNvbnN0IGtlcm5lbE1zID0gdXRpbC5ub3coKSAtIHN0YXJ0O1xuICAgIHJldHVybiB7a2VybmVsTXN9O1xuICB9XG5cbiAgbWVtb3J5KCkge1xuICAgIHJldHVybiB7XG4gICAgICAvLyBVbnJlbGlhYmxlIGR1ZSB0byBhdXRvbWF0aWMgZ2MuIFRoZSBudW1iZXJzIGFib3ZlIGFyZSBjdW11bGF0aXZlLlxuICAgICAgdW5yZWxpYWJsZTogdHJ1ZSxcbiAgICAgIHJlYXNvbnM6XG4gICAgICAgICAgWydUaGUgcmVwb3J0ZWQgbWVtb3J5IGlzIGFuIHVwcGVyIGJvdW5kLiBEdWUgdG8gYXV0b21hdGljIGdhcmJhZ2UgJyArXG4gICAgICAgICAgICdjb2xsZWN0aW9uLCB0aGUgdHJ1ZSBhbGxvY2F0ZWQgbWVtb3J5IG1heSBiZSBsZXNzLiddXG4gICAgfTtcbiAgfVxuXG4gIHdoZXJlKGNvbmRpdGlvbjogVGVuc29yKTogVGVuc29yMkQge1xuICAgIGFzc2VydE5vdENvbXBsZXgoW2NvbmRpdGlvbl0sICd3aGVyZScpO1xuXG4gICAgY29uc3QgY29uZFZhbHMgPSB0aGlzLnJlYWRTeW5jKGNvbmRpdGlvbi5kYXRhSWQpIGFzIFR5cGVkQXJyYXk7XG4gICAgcmV0dXJuIHdoZXJlSW1wbChjb25kaXRpb24uc2hhcGUsIGNvbmRWYWxzKTtcbiAgfVxuXG4gIGRpc3Bvc2UoKSB7fVxuXG4gIGZsb2F0UHJlY2lzaW9uKCk6IDE2fDMyIHtcbiAgICByZXR1cm4gMzI7XG4gIH1cblxuICAvKiogUmV0dXJucyB0aGUgc21hbGxlc3QgcmVwcmVzZW50YWJsZSBudW1iZXIuICAqL1xuICBlcHNpbG9uKCk6IG51bWJlciB7XG4gICAgcmV0dXJuIHN1cGVyLmVwc2lsb24oKTtcbiAgfVxufVxuIl19","/**\n * @license\n * Copyright 2020 Google LLC. All Rights Reserved.\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n * =============================================================================\n */\nimport { util } from '@tensorflow/tfjs-core';\nimport { assertNotComplex } from '../cpu_util';\n/**\n * Template that creates a `KernelFunc` for unary ops.\n * @param name Kernel name.\n * @param op A `SimpleUnaryOperation` for the kernel.\n * @param dtype Optional. If set, the result has this dtype. Otherwise, the\n * result has the same dtype as the input. This is mainly used in certain\n * kernels that return bool type, such as isFinite, isInf, etc.\n */\nexport function unaryKernelFunc(name, op, dtype) {\n return ({ inputs, attrs, backend }) => {\n const { x } = inputs;\n assertNotComplex(x, name);\n if (x.dtype === 'string' || dtype === 'string') {\n throw new Error('unaryKernelFunc does not support string input/output');\n }\n const cpuBackend = backend;\n const values = cpuBackend.data.get(x.dataId).values;\n const xSize = util.sizeFromShape(x.shape);\n const $dtype = dtype || x.dtype;\n const newValues = util.getArrayFromDType($dtype, xSize);\n for (let i = 0; i < xSize; ++i) {\n newValues[i] = op(values[i], attrs);\n }\n return cpuBackend.makeTensorInfo(x.shape, $dtype, newValues);\n };\n}\n/**\n * Template that creates a `KernelFunc` for unary ops from the given\n * `SimpleUnaryImpl`..\n * @param name Kernel name.\n * @param unaryImpl A `SimpleUnaryImpl` that implements the op.\n * @param dtype Optional. If set, the result has this dtype. Otherwise, the\n * result has the same dtype as the input. This is mainly used in certain\n * kernels that return bool type, such as isFinite, isInf, etc.\n */\nexport function unaryKernelFuncFromImpl(name, unaryImpl, dtype) {\n return ({ inputs, attrs, backend }) => {\n const { x } = inputs;\n assertNotComplex(x, name);\n if (x.dtype === 'string' || dtype === 'string') {\n throw new Error('unaryKernelFunc does not support string input/output');\n }\n const cpuBackend = backend;\n const values = cpuBackend.data.get(x.dataId).values;\n const $dtype = dtype || x.dtype;\n const newValues = unaryImpl(values, $dtype, attrs);\n return cpuBackend.makeTensorInfo(x.shape, $dtype, newValues);\n };\n}\n//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidW5hcnlfdXRpbHMuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi8uLi90ZmpzLWJhY2tlbmQtY3B1L3NyYy91dGlscy91bmFyeV91dGlscy50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQTs7Ozs7Ozs7Ozs7Ozs7O0dBZUc7QUFFSCxPQUFPLEVBQWdELElBQUksRUFBQyxNQUFNLHVCQUF1QixDQUFDO0FBRzFGLE9BQU8sRUFBQyxnQkFBZ0IsRUFBQyxNQUFNLGFBQWEsQ0FBQztBQUk3Qzs7Ozs7OztHQU9HO0FBQ0gsTUFBTSxVQUFVLGVBQWUsQ0FDM0IsSUFBWSxFQUFFLEVBQXdCLEVBQUUsS0FBZ0I7SUFDMUQsT0FBTyxDQUFDLEVBQUMsTUFBTSxFQUFFLEtBQUssRUFBRSxPQUFPLEVBQUMsRUFBRSxFQUFFO1FBQ2xDLE1BQU0sRUFBQyxDQUFDLEVBQUMsR0FBRyxNQUFxQixDQUFDO1FBQ2xDLGdCQUFnQixDQUFDLENBQUMsRUFBRSxJQUFJLENBQUMsQ0FBQztRQUMxQixJQUFJLENBQUMsQ0FBQyxLQUFLLEtBQUssUUFBUSxJQUFJLEtBQUssS0FBSyxRQUFRLEVBQUU7WUFDOUMsTUFBTSxJQUFJLEtBQUssQ0FBQyxzREFBc0QsQ0FBQyxDQUFDO1NBQ3pFO1FBRUQsTUFBTSxVQUFVLEdBQUcsT0FBeUIsQ0FBQztRQUM3QyxNQUFNLE1BQU0sR0FBRyxVQUFVLENBQUMsSUFBSSxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsTUFBTSxDQUFDLENBQUMsTUFBb0IsQ0FBQztRQUNsRSxNQUFNLEtBQUssR0FBRyxJQUFJLENBQUMsYUFBYSxDQUFDLENBQUMsQ0FBQyxLQUFLLENBQUMsQ0FBQztRQUMxQyxNQUFNLE1BQU0sR0FBRyxLQUFLLElBQUksQ0FBQyxDQUFDLEtBQUssQ0FBQztRQUNoQyxNQUFNLFNBQVMsR0FBRyxJQUFJLENBQUMsaUJBQWlCLENBQUMsTUFBTSxFQUFFLEtBQUssQ0FBQyxDQUFDO1FBQ3hELEtBQUssSUFBSSxDQUFDLEdBQUcsQ0FBQyxFQUFFLENBQUMsR0FBRyxLQUFLLEVBQUUsRUFBRSxDQUFDLEVBQUU7WUFDOUIsU0FBUyxDQUFDLENBQUMsQ0FBQyxHQUFHLEVBQUUsQ0FBQyxNQUFNLENBQUMsQ0FBQyxDQUFDLEVBQUUsS0FBSyxDQUFDLENBQUM7U0FDckM7UUFDRCxPQUFPLFVBQVUsQ0FBQyxjQUFjLENBQUMsQ0FBQyxDQUFDLEtBQUssRUFBRSxNQUFNLEVBQUUsU0FBUyxDQUFDLENBQUM7SUFDL0QsQ0FBQyxDQUFDO0FBQ0osQ0FBQztBQUVEOzs7Ozs7OztHQVFHO0FBQ0gsTUFBTSxVQUFVLHVCQUF1QixDQUNuQyxJQUFZLEVBQUUsU0FBMEIsRUFBRSxLQUFnQjtJQUM1RCxPQUFPLENBQUMsRUFBQyxNQUFNLEVBQUUsS0FBSyxFQUFFLE9BQU8sRUFBQyxFQUFFLEVBQUU7UUFDbEMsTUFBTSxFQUFDLENBQUMsRUFBQyxHQUFHLE1BQXFCLENBQUM7UUFDbEMsZ0JBQWdCLENBQUMsQ0FBQyxFQUFFLElBQUksQ0FBQyxDQUFDO1FBQzFCLElBQUksQ0FBQyxDQUFDLEtBQUssS0FBSyxRQUFRLElBQUksS0FBSyxLQUFLLFFBQVEsRUFBRTtZQUM5QyxNQUFNLElBQUksS0FBSyxDQUFDLHNEQUFzRCxDQUFDLENBQUM7U0FDekU7UUFFRCxNQUFNLFVBQVUsR0FBRyxPQUF5QixDQUFDO1FBQzdDLE1BQU0sTUFBTSxHQUFHLFVBQVUsQ0FBQyxJQUFJLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxNQUFNLENBQUMsQ0FBQyxNQUFvQixDQUFDO1FBQ2xFLE1BQU0sTUFBTSxHQUFHLEtBQUssSUFBSSxDQUFDLENBQUMsS0FBSyxDQUFDO1FBQ2hDLE1BQU0sU0FBUyxHQUFHLFNBQVMsQ0FBQyxNQUFNLEVBQUUsTUFBTSxFQUFFLEtBQUssQ0FBQyxDQUFDO1FBQ25ELE9BQU8sVUFBVSxDQUFDLGNBQWMsQ0FBQyxDQUFDLENBQUMsS0FBSyxFQUFFLE1BQU0sRUFBRSxTQUFTLENBQUMsQ0FBQztJQUMvRCxDQUFDLENBQUM7QUFDSixDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiLyoqXG4gKiBAbGljZW5zZVxuICogQ29weXJpZ2h0IDIwMjAgR29vZ2xlIExMQy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC5cbiAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSBcIkxpY2Vuc2VcIik7XG4gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuXG4gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXRcbiAqXG4gKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjBcbiAqXG4gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlXG4gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiBcIkFTIElTXCIgQkFTSVMsXG4gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC5cbiAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmRcbiAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLlxuICogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbiAqL1xuXG5pbXBvcnQge0RhdGFUeXBlLCBLZXJuZWxGdW5jLCBUeXBlZEFycmF5LCBVbmFyeUlucHV0cywgdXRpbH0gZnJvbSAnQHRlbnNvcmZsb3cvdGZqcy1jb3JlJztcblxuaW1wb3J0IHtNYXRoQmFja2VuZENQVX0gZnJvbSAnLi4vYmFja2VuZF9jcHUnO1xuaW1wb3J0IHthc3NlcnROb3RDb21wbGV4fSBmcm9tICcuLi9jcHVfdXRpbCc7XG5cbmltcG9ydCB7U2ltcGxlVW5hcnlJbXBsLCBTaW1wbGVVbmFyeU9wZXJhdGlvbn0gZnJvbSAnLi91bmFyeV90eXBlcyc7XG5cbi8qKlxuICogVGVtcGxhdGUgdGhhdCBjcmVhdGVzIGEgYEtlcm5lbEZ1bmNgIGZvciB1bmFyeSBvcHMuXG4gKiBAcGFyYW0gbmFtZSBLZXJuZWwgbmFtZS5cbiAqIEBwYXJhbSBvcCBBIGBTaW1wbGVVbmFyeU9wZXJhdGlvbmAgZm9yIHRoZSBrZXJuZWwuXG4gKiBAcGFyYW0gZHR5cGUgT3B0aW9uYWwuIElmIHNldCwgdGhlIHJlc3VsdCBoYXMgdGhpcyBkdHlwZS4gT3RoZXJ3aXNlLCB0aGVcbiAqICAgICByZXN1bHQgaGFzIHRoZSBzYW1lIGR0eXBlIGFzIHRoZSBpbnB1dC4gVGhpcyBpcyBtYWlubHkgdXNlZCBpbiBjZXJ0YWluXG4gKiAgICAga2VybmVscyB0aGF0IHJldHVybiBib29sIHR5cGUsIHN1Y2ggYXMgaXNGaW5pdGUsIGlzSW5mLCBldGMuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiB1bmFyeUtlcm5lbEZ1bmMoXG4gICAgbmFtZTogc3RyaW5nLCBvcDogU2ltcGxlVW5hcnlPcGVyYXRpb24sIGR0eXBlPzogRGF0YVR5cGUpOiBLZXJuZWxGdW5jIHtcbiAgcmV0dXJuICh7aW5wdXRzLCBhdHRycywgYmFja2VuZH0pID0+IHtcbiAgICBjb25zdCB7eH0gPSBpbnB1dHMgYXMgVW5hcnlJbnB1dHM7XG4gICAgYXNzZXJ0Tm90Q29tcGxleCh4LCBuYW1lKTtcbiAgICBpZiAoeC5kdHlwZSA9PT0gJ3N0cmluZycgfHwgZHR5cGUgPT09ICdzdHJpbmcnKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoJ3VuYXJ5S2VybmVsRnVuYyBkb2VzIG5vdCBzdXBwb3J0IHN0cmluZyBpbnB1dC9vdXRwdXQnKTtcbiAgICB9XG5cbiAgICBjb25zdCBjcHVCYWNrZW5kID0gYmFja2VuZCBhcyBNYXRoQmFja2VuZENQVTtcbiAgICBjb25zdCB2YWx1ZXMgPSBjcHVCYWNrZW5kLmRhdGEuZ2V0KHguZGF0YUlkKS52YWx1ZXMgYXMgVHlwZWRBcnJheTtcbiAgICBjb25zdCB4U2l6ZSA9IHV0aWwuc2l6ZUZyb21TaGFwZSh4LnNoYXBlKTtcbiAgICBjb25zdCAkZHR5cGUgPSBkdHlwZSB8fCB4LmR0eXBlO1xuICAgIGNvbnN0IG5ld1ZhbHVlcyA9IHV0aWwuZ2V0QXJyYXlGcm9tRFR5cGUoJGR0eXBlLCB4U2l6ZSk7XG4gICAgZm9yIChsZXQgaSA9IDA7IGkgPCB4U2l6ZTsgKytpKSB7XG4gICAgICBuZXdWYWx1ZXNbaV0gPSBvcCh2YWx1ZXNbaV0sIGF0dHJzKTtcbiAgICB9XG4gICAgcmV0dXJuIGNwdUJhY2tlbmQubWFrZVRlbnNvckluZm8oeC5zaGFwZSwgJGR0eXBlLCBuZXdWYWx1ZXMpO1xuICB9O1xufVxuXG4vKipcbiAqIFRlbXBsYXRlIHRoYXQgY3JlYXRlcyBhIGBLZXJuZWxGdW5jYCBmb3IgdW5hcnkgb3BzIGZyb20gdGhlIGdpdmVuXG4gKiBgU2ltcGxlVW5hcnlJbXBsYC4uXG4gKiBAcGFyYW0gbmFtZSBLZXJuZWwgbmFtZS5cbiAqIEBwYXJhbSB1bmFyeUltcGwgQSBgU2ltcGxlVW5hcnlJbXBsYCB0aGF0IGltcGxlbWVudHMgdGhlIG9wLlxuICogQHBhcmFtIGR0eXBlIE9wdGlvbmFsLiBJZiBzZXQsIHRoZSByZXN1bHQgaGFzIHRoaXMgZHR5cGUuIE90aGVyd2lzZSwgdGhlXG4gKiAgICAgcmVzdWx0IGhhcyB0aGUgc2FtZSBkdHlwZSBhcyB0aGUgaW5wdXQuIFRoaXMgaXMgbWFpbmx5IHVzZWQgaW4gY2VydGFpblxuICogICAgIGtlcm5lbHMgdGhhdCByZXR1cm4gYm9vbCB0eXBlLCBzdWNoIGFzIGlzRmluaXRlLCBpc0luZiwgZXRjLlxuICovXG5leHBvcnQgZnVuY3Rpb24gdW5hcnlLZXJuZWxGdW5jRnJvbUltcGwoXG4gICAgbmFtZTogc3RyaW5nLCB1bmFyeUltcGw6IFNpbXBsZVVuYXJ5SW1wbCwgZHR5cGU/OiBEYXRhVHlwZSk6IEtlcm5lbEZ1bmMge1xuICByZXR1cm4gKHtpbnB1dHMsIGF0dHJzLCBiYWNrZW5kfSkgPT4ge1xuICAgIGNvbnN0IHt4fSA9IGlucHV0cyBhcyBVbmFyeUlucHV0cztcbiAgICBhc3NlcnROb3RDb21wbGV4KHgsIG5hbWUpO1xuICAgIGlmICh4LmR0eXBlID09PSAnc3RyaW5nJyB8fCBkdHlwZSA9PT0gJ3N0cmluZycpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcigndW5hcnlLZXJuZWxGdW5jIGRvZXMgbm90IHN1cHBvcnQgc3RyaW5nIGlucHV0L291dHB1dCcpO1xuICAgIH1cblxuICAgIGNvbnN0IGNwdUJhY2tlbmQgPSBiYWNrZW5kIGFzIE1hdGhCYWNrZW5kQ1BVO1xuICAgIGNvbnN0IHZhbHVlcyA9IGNwdUJhY2tlbmQuZGF0YS5nZXQoeC5kYXRhSWQpLnZhbHVlcyBhcyBUeXBlZEFycmF5O1xuICAgIGNvbnN0ICRkdHlwZSA9IGR0eXBlIHx8IHguZHR5cGU7XG4gICAgY29uc3QgbmV3VmFsdWVzID0gdW5hcnlJbXBsKHZhbHVlcywgJGR0eXBlLCBhdHRycyk7XG4gICAgcmV0dXJuIGNwdUJhY2tlbmQubWFrZVRlbnNvckluZm8oeC5zaGFwZSwgJGR0eXBlLCBuZXdWYWx1ZXMpO1xuICB9O1xufVxuIl19","/**\n * @license\n * Copyright 2020 Google LLC. All Rights Reserved.\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n * =============================================================================\n */\n/*\n * base.ts contains all the exports from tfjs-backend-cpu\n * without auto-kernel registration\n */\nimport { registerBackend } from '@tensorflow/tfjs-core';\nimport { MathBackendCPU } from './backend_cpu';\nimport * as shared from './shared';\nexport { MathBackendCPU } from './backend_cpu';\nexport { version as version_cpu } from './version';\nexport { shared };\n// Side effects for default initialization of MathBackendCPU\nregisterBackend('cpu', () => new MathBackendCPU(), 1 /* priority */);\n//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYmFzZS5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uL3RmanMtYmFja2VuZC1jcHUvc3JjL2Jhc2UudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUE7Ozs7Ozs7Ozs7Ozs7OztHQWVHO0FBRUg7OztHQUdHO0FBQ0gsT0FBTyxFQUFDLGVBQWUsRUFBQyxNQUFNLHVCQUF1QixDQUFDO0FBQ3RELE9BQU8sRUFBQyxjQUFjLEVBQUMsTUFBTSxlQUFlLENBQUM7QUFDN0MsT0FBTyxLQUFLLE1BQU0sTUFBTSxVQUFVLENBQUM7QUFFbkMsT0FBTyxFQUFDLGNBQWMsRUFBQyxNQUFNLGVBQWUsQ0FBQztBQUM3QyxPQUFPLEVBQUMsT0FBTyxJQUFJLFdBQVcsRUFBQyxNQUFNLFdBQVcsQ0FBQztBQUNqRCxPQUFPLEVBQUMsTUFBTSxFQUFDLENBQUM7QUFFaEIsNERBQTREO0FBQzVELGVBQWUsQ0FBQyxLQUFLLEVBQUUsR0FBRyxFQUFFLENBQUMsSUFBSSxjQUFjLEVBQUUsRUFBRSxDQUFDLENBQUMsY0FBYyxDQUFDLENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyIvKipcbiAqIEBsaWNlbnNlXG4gKiBDb3B5cmlnaHQgMjAyMCBHb29nbGUgTExDLiBBbGwgUmlnaHRzIFJlc2VydmVkLlxuICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlIFwiTGljZW5zZVwiKTtcbiAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS5cbiAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdFxuICpcbiAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMFxuICpcbiAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmVcbiAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuIFwiQVMgSVNcIiBCQVNJUyxcbiAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLlxuICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZFxuICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuXG4gKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuICovXG5cbi8qXG4gKiBiYXNlLnRzIGNvbnRhaW5zIGFsbCB0aGUgZXhwb3J0cyBmcm9tIHRmanMtYmFja2VuZC1jcHVcbiAqIHdpdGhvdXQgYXV0by1rZXJuZWwgcmVnaXN0cmF0aW9uXG4gKi9cbmltcG9ydCB7cmVnaXN0ZXJCYWNrZW5kfSBmcm9tICdAdGVuc29yZmxvdy90ZmpzLWNvcmUnO1xuaW1wb3J0IHtNYXRoQmFja2VuZENQVX0gZnJvbSAnLi9iYWNrZW5kX2NwdSc7XG5pbXBvcnQgKiBhcyBzaGFyZWQgZnJvbSAnLi9zaGFyZWQnO1xuXG5leHBvcnQge01hdGhCYWNrZW5kQ1BVfSBmcm9tICcuL2JhY2tlbmRfY3B1JztcbmV4cG9ydCB7dmVyc2lvbiBhcyB2ZXJzaW9uX2NwdX0gZnJvbSAnLi92ZXJzaW9uJztcbmV4cG9ydCB7c2hhcmVkfTtcblxuLy8gU2lkZSBlZmZlY3RzIGZvciBkZWZhdWx0IGluaXRpYWxpemF0aW9uIG9mIE1hdGhCYWNrZW5kQ1BVXG5yZWdpc3RlckJhY2tlbmQoJ2NwdScsICgpID0+IG5ldyBNYXRoQmFja2VuZENQVSgpLCAxIC8qIHByaW9yaXR5ICovKTtcbiJdfQ==","/**\n * @license\n * Copyright 2020 Google LLC. All Rights Reserved.\n * Licensed under the Apache License, Version 2.0 (the License);\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an AS IS BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n * =============================================================================\n */\nimport { Elu } from '@tensorflow/tfjs-core';\nimport { unaryKernelFunc } from '../utils/unary_utils';\nexport const elu = unaryKernelFunc(Elu, (xi) => xi >= 0 ? xi : (Math.exp(xi) - 1));\nexport const eluConfig = {\n kernelName: Elu,\n backendName: 'cpu',\n kernelFunc: elu,\n};\n//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiRWx1LmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vLi4vdGZqcy1iYWNrZW5kLWNwdS9zcmMva2VybmVscy9FbHUudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUE7Ozs7Ozs7Ozs7Ozs7OztHQWVHO0FBRUgsT0FBTyxFQUFDLEdBQUcsRUFBZSxNQUFNLHVCQUF1QixDQUFDO0FBRXhELE9BQU8sRUFBQyxlQUFlLEVBQUMsTUFBTSxzQkFBc0IsQ0FBQztBQUVyRCxNQUFNLENBQUMsTUFBTSxHQUFHLEdBQ1osZUFBZSxDQUFDLEdBQUcsRUFBRSxDQUFDLEVBQUUsRUFBRSxFQUFFLENBQUMsRUFBRSxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxHQUFHLENBQUMsRUFBRSxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQztBQUVwRSxNQUFNLENBQUMsTUFBTSxTQUFTLEdBQWlCO0lBQ3JDLFVBQVUsRUFBRSxHQUFHO0lBQ2YsV0FBVyxFQUFFLEtBQUs7SUFDbEIsVUFBVSxFQUFFLEdBQUc7Q0FDaEIsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbIi8qKlxuICogQGxpY2Vuc2VcbiAqIENvcHlyaWdodCAyMDIwIEdvb2dsZSBMTEMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuXG4gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgTGljZW5zZSk7XG4gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuXG4gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXRcbiAqXG4gKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjBcbiAqXG4gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlXG4gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiBBUyBJUyBCQVNJUyxcbiAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLlxuICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZFxuICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuXG4gKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuICovXG5cbmltcG9ydCB7RWx1LCBLZXJuZWxDb25maWd9IGZyb20gJ0B0ZW5zb3JmbG93L3RmanMtY29yZSc7XG5cbmltcG9ydCB7dW5hcnlLZXJuZWxGdW5jfSBmcm9tICcuLi91dGlscy91bmFyeV91dGlscyc7XG5cbmV4cG9ydCBjb25zdCBlbHUgPVxuICAgIHVuYXJ5S2VybmVsRnVuYyhFbHUsICh4aSkgPT4geGkgPj0gMCA/IHhpIDogKE1hdGguZXhwKHhpKSAtIDEpKTtcblxuZXhwb3J0IGNvbnN0IGVsdUNvbmZpZzogS2VybmVsQ29uZmlnID0ge1xuICBrZXJuZWxOYW1lOiBFbHUsXG4gIGJhY2tlbmROYW1lOiAnY3B1JyxcbiAga2VybmVsRnVuYzogZWx1LFxufTtcbiJdfQ==","/**\n * @license\n * Copyright 2020 Google LLC. All Rights Reserved.\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n * =============================================================================\n */\nimport { Identity } from '@tensorflow/tfjs-core';\nexport function identity(args) {\n const { inputs, backend } = args;\n const { x } = inputs;\n backend.incRef(x.dataId);\n return { dataId: x.dataId, shape: x.shape, dtype: x.dtype };\n}\nexport const identityConfig = {\n kernelName: Identity,\n backendName: 'cpu',\n kernelFunc: identity\n};\n//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiSWRlbnRpdHkuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi8uLi90ZmpzLWJhY2tlbmQtY3B1L3NyYy9rZXJuZWxzL0lkZW50aXR5LnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBOzs7Ozs7Ozs7Ozs7Ozs7R0FlRztBQUVILE9BQU8sRUFBQyxRQUFRLEVBQXVELE1BQU0sdUJBQXVCLENBQUM7QUFJckcsTUFBTSxVQUFVLFFBQVEsQ0FDcEIsSUFBdUQ7SUFDekQsTUFBTSxFQUFDLE1BQU0sRUFBRSxPQUFPLEVBQUMsR0FBRyxJQUFJLENBQUM7SUFDL0IsTUFBTSxFQUFDLENBQUMsRUFBQyxHQUFHLE1BQU0sQ0FBQztJQUVuQixPQUFPLENBQUMsTUFBTSxDQUFDLENBQUMsQ0FBQyxNQUFNLENBQUMsQ0FBQztJQUV6QixPQUFPLEVBQUMsTUFBTSxFQUFFLENBQUMsQ0FBQyxNQUFNLEVBQUUsS0FBSyxFQUFFLENBQUMsQ0FBQyxLQUFLLEVBQUUsS0FBSyxFQUFFLENBQUMsQ0FBQyxLQUFLLEVBQUMsQ0FBQztBQUM1RCxDQUFDO0FBRUQsTUFBTSxDQUFDLE1BQU0sY0FBYyxHQUFpQjtJQUMxQyxVQUFVLEVBQUUsUUFBUTtJQUNwQixXQUFXLEVBQUUsS0FBSztJQUNsQixVQUFVLEVBQUUsUUFBNEI7Q0FDekMsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbIi8qKlxuICogQGxpY2Vuc2VcbiAqIENvcHlyaWdodCAyMDIwIEdvb2dsZSBMTEMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuXG4gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgXCJMaWNlbnNlXCIpO1xuICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLlxuICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0XG4gKlxuICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wXG4gKlxuICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZVxuICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gXCJBUyBJU1wiIEJBU0lTLFxuICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuXG4gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kXG4gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS5cbiAqID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4gKi9cblxuaW1wb3J0IHtJZGVudGl0eSwgSWRlbnRpdHlJbnB1dHMsIEtlcm5lbENvbmZpZywgS2VybmVsRnVuYywgVGVuc29ySW5mb30gZnJvbSAnQHRlbnNvcmZsb3cvdGZqcy1jb3JlJztcblxuaW1wb3J0IHtNYXRoQmFja2VuZENQVX0gZnJvbSAnLi4vYmFja2VuZF9jcHUnO1xuXG5leHBvcnQgZnVuY3Rpb24gaWRlbnRpdHkoXG4gICAgYXJnczoge2lucHV0czogSWRlbnRpdHlJbnB1dHMsIGJhY2tlbmQ6IE1hdGhCYWNrZW5kQ1BVfSk6IFRlbnNvckluZm8ge1xuICBjb25zdCB7aW5wdXRzLCBiYWNrZW5kfSA9IGFyZ3M7XG4gIGNvbnN0IHt4fSA9IGlucHV0cztcblxuICBiYWNrZW5kLmluY1JlZih4LmRhdGFJZCk7XG5cbiAgcmV0dXJuIHtkYXRhSWQ6IHguZGF0YUlkLCBzaGFwZTogeC5zaGFwZSwgZHR5cGU6IHguZHR5cGV9O1xufVxuXG5leHBvcnQgY29uc3QgaWRlbnRpdHlDb25maWc6IEtlcm5lbENvbmZpZyA9IHtcbiAga2VybmVsTmFtZTogSWRlbnRpdHksXG4gIGJhY2tlbmROYW1lOiAnY3B1JyxcbiAga2VybmVsRnVuYzogaWRlbnRpdHkgYXMge30gYXMgS2VybmVsRnVuY1xufTtcbiJdfQ==","/**\n * @license\n * Copyright 2020 Google LLC. All Rights Reserved.\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n * =============================================================================\n */\nimport { LeakyRelu, util } from '@tensorflow/tfjs-core';\nimport { assertNotComplex } from '../cpu_util';\nexport function leakyRelu(args) {\n const { inputs, backend, attrs } = args;\n const { x } = inputs;\n const { alpha } = attrs;\n assertNotComplex([x], 'leakyRelu');\n const xSize = util.sizeFromShape(x.shape);\n const xVals = backend.data.get(x.dataId).values;\n const outVals = util.getTypedArrayFromDType('float32', xSize);\n for (let i = 0; i < xVals.length; i++) {\n outVals[i] = xVals[i] < 0 ? alpha * xVals[i] : xVals[i];\n }\n return backend.makeTensorInfo(x.shape, 'float32', outVals);\n}\nexport const leakyReluConfig = {\n kernelName: LeakyRelu,\n backendName: 'cpu',\n kernelFunc: leakyRelu\n};\n//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiTGVha3lSZWx1LmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vLi4vdGZqcy1iYWNrZW5kLWNwdS9zcmMva2VybmVscy9MZWFreVJlbHUudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUE7Ozs7Ozs7Ozs7Ozs7OztHQWVHO0FBRUgsT0FBTyxFQUEyQixTQUFTLEVBQTJELElBQUksRUFBQyxNQUFNLHVCQUF1QixDQUFDO0FBR3pJLE9BQU8sRUFBQyxnQkFBZ0IsRUFBQyxNQUFNLGFBQWEsQ0FBQztBQUU3QyxNQUFNLFVBQVUsU0FBUyxDQUFDLElBSXpCO0lBQ0MsTUFBTSxFQUFDLE1BQU0sRUFBRSxPQUFPLEVBQUUsS0FBSyxFQUFDLEdBQUcsSUFBSSxDQUFDO0lBQ3RDLE1BQU0sRUFBQyxDQUFDLEVBQUMsR0FBRyxNQUFNLENBQUM7SUFDbkIsTUFBTSxFQUFDLEtBQUssRUFBQyxHQUFHLEtBQUssQ0FBQztJQUV0QixnQkFBZ0IsQ0FBQyxDQUFDLENBQUMsQ0FBQyxFQUFFLFdBQVcsQ0FBQyxDQUFDO0lBRW5DLE1BQU0sS0FBSyxHQUFHLElBQUksQ0FBQyxhQUFhLENBQUMsQ0FBQyxDQUFDLEtBQUssQ0FBQyxDQUFDO0lBQzFDLE1BQU0sS0FBSyxHQUFHLE9BQU8sQ0FBQyxJQUFJLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxNQUFNLENBQUMsQ0FBQyxNQUFvQixDQUFDO0lBQzlELE1BQU0sT0FBTyxHQUFHLElBQUksQ0FBQyxzQkFBc0IsQ0FBQyxTQUFTLEVBQUUsS0FBSyxDQUFDLENBQUM7SUFFOUQsS0FBSyxJQUFJLENBQUMsR0FBRyxDQUFDLEVBQUUsQ0FBQyxHQUFHLEtBQUssQ0FBQyxNQUFNLEVBQUUsQ0FBQyxFQUFFLEVBQUU7UUFDckMsT0FBTyxDQUFDLENBQUMsQ0FBQyxHQUFHLEtBQUssQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLEtBQUssR0FBRyxLQUFLLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUMsQ0FBQztLQUN6RDtJQUVELE9BQU8sT0FBTyxDQUFDLGNBQWMsQ0FBQyxDQUFDLENBQUMsS0FBSyxFQUFFLFNBQVMsRUFBRSxPQUFPLENBQUMsQ0FBQztBQUM3RCxDQUFDO0FBRUQsTUFBTSxDQUFDLE1BQU0sZUFBZSxHQUFpQjtJQUMzQyxVQUFVLEVBQUUsU0FBUztJQUNyQixXQUFXLEVBQUUsS0FBSztJQUNsQixVQUFVLEVBQUUsU0FBNkI7Q0FDMUMsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbIi8qKlxuICogQGxpY2Vuc2VcbiAqIENvcHlyaWdodCAyMDIwIEdvb2dsZSBMTEMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuXG4gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgXCJMaWNlbnNlXCIpO1xuICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLlxuICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0XG4gKlxuICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wXG4gKlxuICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZVxuICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gXCJBUyBJU1wiIEJBU0lTLFxuICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuXG4gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kXG4gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS5cbiAqID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4gKi9cblxuaW1wb3J0IHtLZXJuZWxDb25maWcsIEtlcm5lbEZ1bmMsIExlYWt5UmVsdSwgTGVha3lSZWx1QXR0cnMsIExlYWt5UmVsdUlucHV0cywgVGVuc29ySW5mbywgVHlwZWRBcnJheSwgdXRpbH0gZnJvbSAnQHRlbnNvcmZsb3cvdGZqcy1jb3JlJztcblxuaW1wb3J0IHtNYXRoQmFja2VuZENQVX0gZnJvbSAnLi4vYmFja2VuZF9jcHUnO1xuaW1wb3J0IHthc3NlcnROb3RDb21wbGV4fSBmcm9tICcuLi9jcHVfdXRpbCc7XG5cbmV4cG9ydCBmdW5jdGlvbiBsZWFreVJlbHUoYXJnczoge1xuICBpbnB1dHM6IExlYWt5UmVsdUlucHV0cyxcbiAgYmFja2VuZDogTWF0aEJhY2tlbmRDUFUsXG4gIGF0dHJzOiBMZWFreVJlbHVBdHRyc1xufSk6IFRlbnNvckluZm8ge1xuICBjb25zdCB7aW5wdXRzLCBiYWNrZW5kLCBhdHRyc30gPSBhcmdzO1xuICBjb25zdCB7eH0gPSBpbnB1dHM7XG4gIGNvbnN0IHthbHBoYX0gPSBhdHRycztcblxuICBhc3NlcnROb3RDb21wbGV4KFt4XSwgJ2xlYWt5UmVsdScpO1xuXG4gIGNvbnN0IHhTaXplID0gdXRpbC5zaXplRnJvbVNoYXBlKHguc2hhcGUpO1xuICBjb25zdCB4VmFscyA9IGJhY2tlbmQuZGF0YS5nZXQoeC5kYXRhSWQpLnZhbHVlcyBhcyBUeXBlZEFycmF5O1xuICBjb25zdCBvdXRWYWxzID0gdXRpbC5nZXRUeXBlZEFycmF5RnJvbURUeXBlKCdmbG9hdDMyJywgeFNpemUpO1xuXG4gIGZvciAobGV0IGkgPSAwOyBpIDwgeFZhbHMubGVuZ3RoOyBpKyspIHtcbiAgICBvdXRWYWxzW2ldID0geFZhbHNbaV0gPCAwID8gYWxwaGEgKiB4VmFsc1tpXSA6IHhWYWxzW2ldO1xuICB9XG5cbiAgcmV0dXJuIGJhY2tlbmQubWFrZVRlbnNvckluZm8oeC5zaGFwZSwgJ2Zsb2F0MzInLCBvdXRWYWxzKTtcbn1cblxuZXhwb3J0IGNvbnN0IGxlYWt5UmVsdUNvbmZpZzogS2VybmVsQ29uZmlnID0ge1xuICBrZXJuZWxOYW1lOiBMZWFreVJlbHUsXG4gIGJhY2tlbmROYW1lOiAnY3B1JyxcbiAga2VybmVsRnVuYzogbGVha3lSZWx1IGFzIHt9IGFzIEtlcm5lbEZ1bmNcbn07XG4iXX0=","/**\n * @license\n * Copyright 2020 Google LLC. All Rights Reserved.\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n * =============================================================================\n */\nimport { backend_util, util } from '@tensorflow/tfjs-core';\n/**\n * Template that creates implementation for binary ops. Supports broadcast.\n */\nexport function createSimpleBinaryKernelImpl(op) {\n return (aShape, bShape, aVals, bVals, dtype) => {\n const newShape = backend_util.assertAndGetBroadcastShape(aShape, bShape);\n const resultRank = newShape.length;\n const resultStrides = util.computeStrides(newShape);\n const resultSize = util.sizeFromShape(newShape);\n const result = util.getTypedArrayFromDType(dtype, resultSize);\n const aRank = aShape.length;\n const bRank = bShape.length;\n const aStrides = util.computeStrides(aShape);\n const bStrides = util.computeStrides(bShape);\n const aBroadcastDims = backend_util.getBroadcastDims(aShape, newShape);\n const bBroadcastDims = backend_util.getBroadcastDims(bShape, newShape);\n if (aBroadcastDims.length + bBroadcastDims.length === 0) {\n for (let i = 0; i < result.length; ++i) {\n result[i] = op(aVals[i % aVals.length], bVals[i % bVals.length]);\n }\n }\n else {\n for (let i = 0; i < result.length; ++i) {\n const loc = util.indexToLoc(i, resultRank, resultStrides);\n const aLoc = loc.slice(-aRank);\n aBroadcastDims.forEach(d => aLoc[d] = 0);\n const aIndex = util.locToIndex(aLoc, aRank, aStrides);\n const bLoc = loc.slice(-bRank);\n bBroadcastDims.forEach(d => bLoc[d] = 0);\n const bIndex = util.locToIndex(bLoc, bRank, bStrides);\n result[i] = op(aVals[aIndex], bVals[bIndex]);\n }\n }\n return [result, newShape];\n };\n}\n//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYmluYXJ5X2ltcGwuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi8uLi90ZmpzLWJhY2tlbmQtY3B1L3NyYy91dGlscy9iaW5hcnlfaW1wbC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQTs7Ozs7Ozs7Ozs7Ozs7O0dBZUc7QUFFSCxPQUFPLEVBQUMsWUFBWSxFQUFxRCxJQUFJLEVBQUMsTUFBTSx1QkFBdUIsQ0FBQztBQUk1Rzs7R0FFRztBQUNILE1BQU0sVUFBVSw0QkFBNEIsQ0FBQyxFQUF5QjtJQUVwRSxPQUFPLENBQUMsTUFBZ0IsRUFBRSxNQUFnQixFQUFFLEtBQWlCLEVBQ3JELEtBQWlCLEVBQUUsS0FBZSxFQUEwQixFQUFFO1FBQ3BFLE1BQU0sUUFBUSxHQUFHLFlBQVksQ0FBQywwQkFBMEIsQ0FBQyxNQUFNLEVBQUUsTUFBTSxDQUFDLENBQUM7UUFFekUsTUFBTSxVQUFVLEdBQUcsUUFBUSxDQUFDLE1BQU0sQ0FBQztRQUNuQyxNQUFNLGFBQWEsR0FBRyxJQUFJLENBQUMsY0FBYyxDQUFDLFFBQVEsQ0FBQyxDQUFDO1FBQ3BELE1BQU0sVUFBVSxHQUFHLElBQUksQ0FBQyxhQUFhLENBQUMsUUFBUSxDQUFDLENBQUM7UUFFaEQsTUFBTSxNQUFNLEdBQ1IsSUFBSSxDQUFDLHNCQUFzQixDQUFDLEtBQXdCLEVBQUUsVUFBVSxDQUFDLENBQUM7UUFFdEUsTUFBTSxLQUFLLEdBQUcsTUFBTSxDQUFDLE1BQU0sQ0FBQztRQUM1QixNQUFNLEtBQUssR0FBRyxNQUFNLENBQUMsTUFBTSxDQUFDO1FBRTVCLE1BQU0sUUFBUSxHQUFHLElBQUksQ0FBQyxjQUFjLENBQUMsTUFBTSxDQUFDLENBQUM7UUFDN0MsTUFBTSxRQUFRLEdBQUcsSUFBSSxDQUFDLGNBQWMsQ0FBQyxNQUFNLENBQUMsQ0FBQztRQUU3QyxNQUFNLGNBQWMsR0FBRyxZQUFZLENBQUMsZ0JBQWdCLENBQUMsTUFBTSxFQUFFLFFBQVEsQ0FBQyxDQUFDO1FBQ3ZFLE1BQU0sY0FBYyxHQUFHLFlBQVksQ0FBQyxnQkFBZ0IsQ0FBQyxNQUFNLEVBQUUsUUFBUSxDQUFDLENBQUM7UUFFdkUsSUFBSSxjQUFjLENBQUMsTUFBTSxHQUFHLGNBQWMsQ0FBQyxNQUFNLEtBQUssQ0FBQyxFQUFFO1lBQ3ZELEtBQUssSUFBSSxDQUFDLEdBQUcsQ0FBQyxFQUFFLENBQUMsR0FBRyxNQUFNLENBQUMsTUFBTSxFQUFFLEVBQUUsQ0FBQyxFQUFFO2dCQUN0QyxNQUFNLENBQUMsQ0FBQyxDQUFDLEdBQUcsRUFBRSxDQUFDLEtBQUssQ0FBQyxDQUFDLEdBQUcsS0FBSyxDQUFDLE1BQU0sQ0FBQyxFQUFFLEtBQUssQ0FBQyxDQUFDLEdBQUcsS0FBSyxDQUFDLE1BQU0sQ0FBQyxDQUFDLENBQUM7YUFDbEU7U0FDRjthQUFNO1lBQ0wsS0FBSyxJQUFJLENBQUMsR0FBRyxDQUFDLEVBQUUsQ0FBQyxHQUFHLE1BQU0sQ0FBQyxNQUFNLEVBQUUsRUFBRSxDQUFDLEVBQUU7Z0JBQ3RDLE1BQU0sR0FBRyxHQUFHLElBQUksQ0FBQyxVQUFVLENBQUMsQ0FBQyxFQUFFLFVBQVUsRUFBRSxhQUFhLENBQUMsQ0FBQztnQkFFMUQsTUFBTSxJQUFJLEdBQUcsR0FBRyxDQUFDLEtBQUssQ0FBQyxDQUFDLEtBQUssQ0FBQyxDQUFDO2dCQUMvQixjQUFjLENBQUMsT0FBTyxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDO2dCQUN6QyxNQUFNLE1BQU0sR0FBRyxJQUFJLENBQUMsVUFBVSxDQUFDLElBQUksRUFBRSxLQUFLLEVBQUUsUUFBUSxDQUFDLENBQUM7Z0JBRXRELE1BQU0sSUFBSSxHQUFHLEdBQUcsQ0FBQyxLQUFLLENBQUMsQ0FBQyxLQUFLLENBQUMsQ0FBQztnQkFDL0IsY0FBYyxDQUFDLE9BQU8sQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQztnQkFDekMsTUFBTSxNQUFNLEdBQUcsSUFBSSxDQUFDLFVBQVUsQ0FBQyxJQUFJLEVBQUUsS0FBSyxFQUFFLFFBQVEsQ0FBQyxDQUFDO2dCQUV0RCxNQUFNLENBQUMsQ0FBQyxDQUFDLEdBQUcsRUFBRSxDQUFDLEtBQUssQ0FBQyxNQUFNLENBQUMsRUFBRSxLQUFLLENBQUMsTUFBTSxDQUFDLENBQUMsQ0FBQzthQUM5QztTQUNGO1FBRUQsT0FBTyxDQUFDLE1BQU0sRUFBRSxRQUFRLENBQUMsQ0FBQztJQUM1QixDQUFDLENBQUM7QUFDSixDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiLyoqXG4gKiBAbGljZW5zZVxuICogQ29weXJpZ2h0IDIwMjAgR29vZ2xlIExMQy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC5cbiAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSBcIkxpY2Vuc2VcIik7XG4gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuXG4gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXRcbiAqXG4gKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjBcbiAqXG4gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlXG4gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiBcIkFTIElTXCIgQkFTSVMsXG4gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC5cbiAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmRcbiAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLlxuICogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbiAqL1xuXG5pbXBvcnQge2JhY2tlbmRfdXRpbCwgRGF0YVR5cGUsIERhdGFWYWx1ZXMsIE51bWVyaWNEYXRhVHlwZSwgVHlwZWRBcnJheSwgdXRpbH0gZnJvbSAnQHRlbnNvcmZsb3cvdGZqcy1jb3JlJztcblxuaW1wb3J0IHtTaW1wbGVCaW5hcnlLZXJuZWxJbXBsLCBTaW1wbGVCaW5hcnlPcGVyYXRpb259IGZyb20gJy4vYmluYXJ5X3R5cGVzJztcblxuLyoqXG4gKiBUZW1wbGF0ZSB0aGF0IGNyZWF0ZXMgaW1wbGVtZW50YXRpb24gZm9yIGJpbmFyeSBvcHMuIFN1cHBvcnRzIGJyb2FkY2FzdC5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGNyZWF0ZVNpbXBsZUJpbmFyeUtlcm5lbEltcGwob3A6IFNpbXBsZUJpbmFyeU9wZXJhdGlvbik6XG4gICAgU2ltcGxlQmluYXJ5S2VybmVsSW1wbCB7XG4gIHJldHVybiAoYVNoYXBlOiBudW1iZXJbXSwgYlNoYXBlOiBudW1iZXJbXSwgYVZhbHM6IERhdGFWYWx1ZXMsXG4gICAgICAgICAgYlZhbHM6IERhdGFWYWx1ZXMsIGR0eXBlOiBEYXRhVHlwZSk6IFtUeXBlZEFycmF5LCBudW1iZXJbXV0gPT4ge1xuICAgIGNvbnN0IG5ld1NoYXBlID0gYmFja2VuZF91dGlsLmFzc2VydEFuZEdldEJyb2FkY2FzdFNoYXBlKGFTaGFwZSwgYlNoYXBlKTtcblxuICAgIGNvbnN0IHJlc3VsdFJhbmsgPSBuZXdTaGFwZS5sZW5ndGg7XG4gICAgY29uc3QgcmVzdWx0U3RyaWRlcyA9IHV0aWwuY29tcHV0ZVN0cmlkZXMobmV3U2hhcGUpO1xuICAgIGNvbnN0IHJlc3VsdFNpemUgPSB1dGlsLnNpemVGcm9tU2hhcGUobmV3U2hhcGUpO1xuXG4gICAgY29uc3QgcmVzdWx0ID1cbiAgICAgICAgdXRpbC5nZXRUeXBlZEFycmF5RnJvbURUeXBlKGR0eXBlIGFzIE51bWVyaWNEYXRhVHlwZSwgcmVzdWx0U2l6ZSk7XG5cbiAgICBjb25zdCBhUmFuayA9IGFTaGFwZS5sZW5ndGg7XG4gICAgY29uc3QgYlJhbmsgPSBiU2hhcGUubGVuZ3RoO1xuXG4gICAgY29uc3QgYVN0cmlkZXMgPSB1dGlsLmNvbXB1dGVTdHJpZGVzKGFTaGFwZSk7XG4gICAgY29uc3QgYlN0cmlkZXMgPSB1dGlsLmNvbXB1dGVTdHJpZGVzKGJTaGFwZSk7XG5cbiAgICBjb25zdCBhQnJvYWRjYXN0RGltcyA9IGJhY2tlbmRfdXRpbC5nZXRCcm9hZGNhc3REaW1zKGFTaGFwZSwgbmV3U2hhcGUpO1xuICAgIGNvbnN0IGJCcm9hZGNhc3REaW1zID0gYmFja2VuZF91dGlsLmdldEJyb2FkY2FzdERpbXMoYlNoYXBlLCBuZXdTaGFwZSk7XG5cbiAgICBpZiAoYUJyb2FkY2FzdERpbXMubGVuZ3RoICsgYkJyb2FkY2FzdERpbXMubGVuZ3RoID09PSAwKSB7XG4gICAgICBmb3IgKGxldCBpID0gMDsgaSA8IHJlc3VsdC5sZW5ndGg7ICsraSkge1xuICAgICAgICByZXN1bHRbaV0gPSBvcChhVmFsc1tpICUgYVZhbHMubGVuZ3RoXSwgYlZhbHNbaSAlIGJWYWxzLmxlbmd0aF0pO1xuICAgICAgfVxuICAgIH0gZWxzZSB7XG4gICAgICBmb3IgKGxldCBpID0gMDsgaSA8IHJlc3VsdC5sZW5ndGg7ICsraSkge1xuICAgICAgICBjb25zdCBsb2MgPSB1dGlsLmluZGV4VG9Mb2MoaSwgcmVzdWx0UmFuaywgcmVzdWx0U3RyaWRlcyk7XG5cbiAgICAgICAgY29uc3QgYUxvYyA9IGxvYy5zbGljZSgtYVJhbmspO1xuICAgICAgICBhQnJvYWRjYXN0RGltcy5mb3JFYWNoKGQgPT4gYUxvY1tkXSA9IDApO1xuICAgICAgICBjb25zdCBhSW5kZXggPSB1dGlsLmxvY1RvSW5kZXgoYUxvYywgYVJhbmssIGFTdHJpZGVzKTtcblxuICAgICAgICBjb25zdCBiTG9jID0gbG9jLnNsaWNlKC1iUmFuayk7XG4gICAgICAgIGJCcm9hZGNhc3REaW1zLmZvckVhY2goZCA9PiBiTG9jW2RdID0gMCk7XG4gICAgICAgIGNvbnN0IGJJbmRleCA9IHV0aWwubG9jVG9JbmRleChiTG9jLCBiUmFuaywgYlN0cmlkZXMpO1xuXG4gICAgICAgIHJlc3VsdFtpXSA9IG9wKGFWYWxzW2FJbmRleF0sIGJWYWxzW2JJbmRleF0pO1xuICAgICAgfVxuICAgIH1cblxuICAgIHJldHVybiBbcmVzdWx0LCBuZXdTaGFwZV07XG4gIH07XG59XG4iXX0=","/**\n * @license\n * Copyright 2020 Google LLC. All Rights Reserved.\n * Licensed under the Apache License, Version 2.0 (the License);\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an AS IS BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n * =============================================================================\n */\nimport { Prelu } from '@tensorflow/tfjs-core';\nimport { assertNotComplex } from '../cpu_util';\nimport { createSimpleBinaryKernelImpl } from '../utils/binary_impl';\nconst preluImpl = createSimpleBinaryKernelImpl((xValue, aValue) => xValue < 0 ? aValue * xValue : xValue);\nexport function prelu(args) {\n const { inputs, backend } = args;\n const { x, alpha } = inputs;\n assertNotComplex([x, alpha], 'prelu');\n const aVals = backend.data.get(x.dataId).values;\n const bVals = backend.data.get(alpha.dataId).values;\n const [resultData, resultShape] = preluImpl(x.shape, alpha.shape, aVals, bVals, 'float32');\n return backend.makeTensorInfo(resultShape, 'float32', resultData);\n}\nexport const preluConfig = {\n kernelName: Prelu,\n backendName: 'cpu',\n kernelFunc: prelu,\n};\n//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiUHJlbHUuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi8uLi90ZmpzLWJhY2tlbmQtY3B1L3NyYy9rZXJuZWxzL1ByZWx1LnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBOzs7Ozs7Ozs7Ozs7Ozs7R0FlRztBQUVILE9BQU8sRUFBZSxLQUFLLEVBQXNDLE1BQU0sdUJBQXVCLENBQUM7QUFHL0YsT0FBTyxFQUFDLGdCQUFnQixFQUFDLE1BQU0sYUFBYSxDQUFDO0FBQzdDLE9BQU8sRUFBQyw0QkFBNEIsRUFBQyxNQUFNLHNCQUFzQixDQUFDO0FBRWxFLE1BQU0sU0FBUyxHQUFHLDRCQUE0QixDQUMxQyxDQUFDLE1BQWMsRUFBRSxNQUFjLEVBQUUsRUFBRSxDQUFDLE1BQU0sR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLE1BQU0sR0FBRyxNQUFNLENBQUMsQ0FBQyxDQUFDLE1BQU0sQ0FBQyxDQUFDO0FBRS9FLE1BQU0sVUFBVSxLQUFLLENBQUMsSUFBb0Q7SUFFeEUsTUFBTSxFQUFDLE1BQU0sRUFBRSxPQUFPLEVBQUMsR0FBRyxJQUFJLENBQUM7SUFDL0IsTUFBTSxFQUFDLENBQUMsRUFBRSxLQUFLLEVBQUMsR0FBRyxNQUFNLENBQUM7SUFFMUIsZ0JBQWdCLENBQUMsQ0FBQyxDQUFDLEVBQUUsS0FBSyxDQUFDLEVBQUUsT0FBTyxDQUFDLENBQUM7SUFFdEMsTUFBTSxLQUFLLEdBQUcsT0FBTyxDQUFDLElBQUksQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLE1BQU0sQ0FBQyxDQUFDLE1BQW9CLENBQUM7SUFDOUQsTUFBTSxLQUFLLEdBQUcsT0FBTyxDQUFDLElBQUksQ0FBQyxHQUFHLENBQUMsS0FBSyxDQUFDLE1BQU0sQ0FBQyxDQUFDLE1BQW9CLENBQUM7SUFFbEUsTUFBTSxDQUFDLFVBQVUsRUFBRSxXQUFXLENBQUMsR0FDM0IsU0FBUyxDQUFDLENBQUMsQ0FBQyxLQUFLLEVBQUUsS0FBSyxDQUFDLEtBQUssRUFBRSxLQUFLLEVBQUUsS0FBSyxFQUFFLFNBQVMsQ0FBQyxDQUFDO0lBRTdELE9BQU8sT0FBTyxDQUFDLGNBQWMsQ0FBQyxXQUFXLEVBQUUsU0FBUyxFQUFFLFVBQVUsQ0FBQyxDQUFDO0FBQ3BFLENBQUM7QUFFRCxNQUFNLENBQUMsTUFBTSxXQUFXLEdBQWlCO0lBQ3ZDLFVBQVUsRUFBRSxLQUFLO0lBQ2pCLFdBQVcsRUFBRSxLQUFLO0lBQ2xCLFVBQVUsRUFBRSxLQUFLO0NBQ2xCLENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyIvKipcbiAqIEBsaWNlbnNlXG4gKiBDb3B5cmlnaHQgMjAyMCBHb29nbGUgTExDLiBBbGwgUmlnaHRzIFJlc2VydmVkLlxuICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlIExpY2Vuc2UpO1xuICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLlxuICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0XG4gKlxuICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wXG4gKlxuICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZVxuICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gQVMgSVMgQkFTSVMsXG4gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC5cbiAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmRcbiAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLlxuICogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbiAqL1xuXG5pbXBvcnQge0tlcm5lbENvbmZpZywgUHJlbHUsIFByZWx1SW5wdXRzLCBUZW5zb3JJbmZvLCBUeXBlZEFycmF5fSBmcm9tICdAdGVuc29yZmxvdy90ZmpzLWNvcmUnO1xuXG5pbXBvcnQge01hdGhCYWNrZW5kQ1BVfSBmcm9tICcuLi9iYWNrZW5kX2NwdSc7XG5pbXBvcnQge2Fzc2VydE5vdENvbXBsZXh9IGZyb20gJy4uL2NwdV91dGlsJztcbmltcG9ydCB7Y3JlYXRlU2ltcGxlQmluYXJ5S2VybmVsSW1wbH0gZnJvbSAnLi4vdXRpbHMvYmluYXJ5X2ltcGwnO1xuXG5jb25zdCBwcmVsdUltcGwgPSBjcmVhdGVTaW1wbGVCaW5hcnlLZXJuZWxJbXBsKFxuICAgICh4VmFsdWU6IG51bWJlciwgYVZhbHVlOiBudW1iZXIpID0+IHhWYWx1ZSA8IDAgPyBhVmFsdWUgKiB4VmFsdWUgOiB4VmFsdWUpO1xuXG5leHBvcnQgZnVuY3Rpb24gcHJlbHUoYXJnczoge2lucHV0czogUHJlbHVJbnB1dHMsIGJhY2tlbmQ6IE1hdGhCYWNrZW5kQ1BVfSk6XG4gICAgVGVuc29ySW5mbyB7XG4gIGNvbnN0IHtpbnB1dHMsIGJhY2tlbmR9ID0gYXJncztcbiAgY29uc3Qge3gsIGFscGhhfSA9IGlucHV0cztcblxuICBhc3NlcnROb3RDb21wbGV4KFt4LCBhbHBoYV0sICdwcmVsdScpO1xuXG4gIGNvbnN0IGFWYWxzID0gYmFja2VuZC5kYXRhLmdldCh4LmRhdGFJZCkudmFsdWVzIGFzIFR5cGVkQXJyYXk7XG4gIGNvbnN0IGJWYWxzID0gYmFja2VuZC5kYXRhLmdldChhbHBoYS5kYXRhSWQpLnZhbHVlcyBhcyBUeXBlZEFycmF5O1xuXG4gIGNvbnN0IFtyZXN1bHREYXRhLCByZXN1bHRTaGFwZV0gPVxuICAgICAgcHJlbHVJbXBsKHguc2hhcGUsIGFscGhhLnNoYXBlLCBhVmFscywgYlZhbHMsICdmbG9hdDMyJyk7XG5cbiAgcmV0dXJuIGJhY2tlbmQubWFrZVRlbnNvckluZm8ocmVzdWx0U2hhcGUsICdmbG9hdDMyJywgcmVzdWx0RGF0YSk7XG59XG5cbmV4cG9ydCBjb25zdCBwcmVsdUNvbmZpZzogS2VybmVsQ29uZmlnID0ge1xuICBrZXJuZWxOYW1lOiBQcmVsdSxcbiAgYmFja2VuZE5hbWU6ICdjcHUnLFxuICBrZXJuZWxGdW5jOiBwcmVsdSxcbn07XG4iXX0=","/**\n * @license\n * Copyright 2020 Google LLC. All Rights Reserved.\n * Licensed under the Apache License, Version 2.0 (the License);\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an AS IS BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n * =============================================================================\n */\nimport { Relu } from '@tensorflow/tfjs-core';\nimport { unaryKernelFunc } from '../utils/unary_utils';\nexport const relu = unaryKernelFunc(Relu, (xi) => Math.max(0, xi));\nexport const reluConfig = {\n kernelName: Relu,\n backendName: 'cpu',\n kernelFunc: relu,\n};\n//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiUmVsdS5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uLy4uL3RmanMtYmFja2VuZC1jcHUvc3JjL2tlcm5lbHMvUmVsdS50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQTs7Ozs7Ozs7Ozs7Ozs7O0dBZUc7QUFFSCxPQUFPLEVBQWUsSUFBSSxFQUFDLE1BQU0sdUJBQXVCLENBQUM7QUFFekQsT0FBTyxFQUFDLGVBQWUsRUFBQyxNQUFNLHNCQUFzQixDQUFDO0FBRXJELE1BQU0sQ0FBQyxNQUFNLElBQUksR0FBRyxlQUFlLENBQUMsSUFBSSxFQUFFLENBQUMsRUFBRSxFQUFFLEVBQUUsQ0FBQyxJQUFJLENBQUMsR0FBRyxDQUFDLENBQUMsRUFBRSxFQUFFLENBQUMsQ0FBQyxDQUFDO0FBRW5FLE1BQU0sQ0FBQyxNQUFNLFVBQVUsR0FBaUI7SUFDdEMsVUFBVSxFQUFFLElBQUk7SUFDaEIsV0FBVyxFQUFFLEtBQUs7SUFDbEIsVUFBVSxFQUFFLElBQUk7Q0FDakIsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbIi8qKlxuICogQGxpY2Vuc2VcbiAqIENvcHlyaWdodCAyMDIwIEdvb2dsZSBMTEMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuXG4gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgTGljZW5zZSk7XG4gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuXG4gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXRcbiAqXG4gKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjBcbiAqXG4gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlXG4gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiBBUyBJUyBCQVNJUyxcbiAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLlxuICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZFxuICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuXG4gKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuICovXG5cbmltcG9ydCB7S2VybmVsQ29uZmlnLCBSZWx1fSBmcm9tICdAdGVuc29yZmxvdy90ZmpzLWNvcmUnO1xuXG5pbXBvcnQge3VuYXJ5S2VybmVsRnVuY30gZnJvbSAnLi4vdXRpbHMvdW5hcnlfdXRpbHMnO1xuXG5leHBvcnQgY29uc3QgcmVsdSA9IHVuYXJ5S2VybmVsRnVuYyhSZWx1LCAoeGkpID0+IE1hdGgubWF4KDAsIHhpKSk7XG5cbmV4cG9ydCBjb25zdCByZWx1Q29uZmlnOiBLZXJuZWxDb25maWcgPSB7XG4gIGtlcm5lbE5hbWU6IFJlbHUsXG4gIGJhY2tlbmROYW1lOiAnY3B1JyxcbiAga2VybmVsRnVuYzogcmVsdSxcbn07XG4iXX0=","/**\n * @license\n * Copyright 2020 Google LLC. All Rights Reserved.\n * Licensed under the Apache License, Version 2.0 (the License);\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an AS IS BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n * =============================================================================\n */\nimport { Relu6 } from '@tensorflow/tfjs-core';\nimport { unaryKernelFunc } from '../utils/unary_utils';\nexport const relu6 = unaryKernelFunc(Relu6, (xi) => Math.min(Math.max(0, xi), 6));\nexport const relu6Config = {\n kernelName: Relu6,\n backendName: 'cpu',\n kernelFunc: relu6,\n};\n//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiUmVsdTYuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi8uLi90ZmpzLWJhY2tlbmQtY3B1L3NyYy9rZXJuZWxzL1JlbHU2LnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBOzs7Ozs7Ozs7Ozs7Ozs7R0FlRztBQUVILE9BQU8sRUFBZSxLQUFLLEVBQUMsTUFBTSx1QkFBdUIsQ0FBQztBQUUxRCxPQUFPLEVBQUMsZUFBZSxFQUFDLE1BQU0sc0JBQXNCLENBQUM7QUFFckQsTUFBTSxDQUFDLE1BQU0sS0FBSyxHQUNkLGVBQWUsQ0FBQyxLQUFLLEVBQUUsQ0FBQyxFQUFFLEVBQUUsRUFBRSxDQUFDLElBQUksQ0FBQyxHQUFHLENBQUMsSUFBSSxDQUFDLEdBQUcsQ0FBQyxDQUFDLEVBQUUsRUFBRSxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsQ0FBQztBQUVqRSxNQUFNLENBQUMsTUFBTSxXQUFXLEdBQWlCO0lBQ3ZDLFVBQVUsRUFBRSxLQUFLO0lBQ2pCLFdBQVcsRUFBRSxLQUFLO0lBQ2xCLFVBQVUsRUFBRSxLQUFLO0NBQ2xCLENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyIvKipcbiAqIEBsaWNlbnNlXG4gKiBDb3B5cmlnaHQgMjAyMCBHb29nbGUgTExDLiBBbGwgUmlnaHRzIFJlc2VydmVkLlxuICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlIExpY2Vuc2UpO1xuICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLlxuICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0XG4gKlxuICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wXG4gKlxuICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZVxuICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gQVMgSVMgQkFTSVMsXG4gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC5cbiAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmRcbiAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLlxuICogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbiAqL1xuXG5pbXBvcnQge0tlcm5lbENvbmZpZywgUmVsdTZ9IGZyb20gJ0B0ZW5zb3JmbG93L3RmanMtY29yZSc7XG5cbmltcG9ydCB7dW5hcnlLZXJuZWxGdW5jfSBmcm9tICcuLi91dGlscy91bmFyeV91dGlscyc7XG5cbmV4cG9ydCBjb25zdCByZWx1NiA9XG4gICAgdW5hcnlLZXJuZWxGdW5jKFJlbHU2LCAoeGkpID0+IE1hdGgubWluKE1hdGgubWF4KDAsIHhpKSwgNikpO1xuXG5leHBvcnQgY29uc3QgcmVsdTZDb25maWc6IEtlcm5lbENvbmZpZyA9IHtcbiAga2VybmVsTmFtZTogUmVsdTYsXG4gIGJhY2tlbmROYW1lOiAnY3B1JyxcbiAga2VybmVsRnVuYzogcmVsdTYsXG59O1xuIl19","/**\n * @license\n * Copyright 2020 Google LLC. All Rights Reserved.\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n * =============================================================================\n */\nimport { util } from '@tensorflow/tfjs-core';\n/**\n * Template that creates implementation for unary op.\n */\nexport function createSimpleUnaryImpl(op) {\n return (values, dtype, attrs) => {\n const newValues = util.getTypedArrayFromDType(dtype, values.length);\n for (let i = 0; i < values.length; ++i) {\n newValues[i] = op(values[i], attrs);\n }\n return newValues;\n };\n}\n//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidW5hcnlfaW1wbC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uLy4uL3RmanMtYmFja2VuZC1jcHUvc3JjL3V0aWxzL3VuYXJ5X2ltcGwudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUE7Ozs7Ozs7Ozs7Ozs7OztHQWVHO0FBRUgsT0FBTyxFQUFrQixJQUFJLEVBQUMsTUFBTSx1QkFBdUIsQ0FBQztBQUk1RDs7R0FFRztBQUNILE1BQU0sVUFBVSxxQkFBcUIsQ0FBQyxFQUF3QjtJQUU1RCxPQUFPLENBQUMsTUFBTSxFQUFFLEtBQUssRUFBRSxLQUFLLEVBQUUsRUFBRTtRQUM5QixNQUFNLFNBQVMsR0FDWCxJQUFJLENBQUMsc0JBQXNCLENBQUMsS0FBd0IsRUFBRSxNQUFNLENBQUMsTUFBTSxDQUFDLENBQUM7UUFDekUsS0FBSyxJQUFJLENBQUMsR0FBRyxDQUFDLEVBQUUsQ0FBQyxHQUFHLE1BQU0sQ0FBQyxNQUFNLEVBQUUsRUFBRSxDQUFDLEVBQUU7WUFDdEMsU0FBUyxDQUFDLENBQUMsQ0FBQyxHQUFHLEVBQUUsQ0FBQyxNQUFNLENBQUMsQ0FBQyxDQUFDLEVBQUUsS0FBSyxDQUFDLENBQUM7U0FDckM7UUFDRCxPQUFPLFNBQVMsQ0FBQztJQUNuQixDQUFDLENBQUM7QUFDSixDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiLyoqXG4gKiBAbGljZW5zZVxuICogQ29weXJpZ2h0IDIwMjAgR29vZ2xlIExMQy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC5cbiAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSBcIkxpY2Vuc2VcIik7XG4gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuXG4gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXRcbiAqXG4gKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjBcbiAqXG4gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlXG4gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiBcIkFTIElTXCIgQkFTSVMsXG4gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC5cbiAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmRcbiAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLlxuICogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbiAqL1xuXG5pbXBvcnQge051bWVyaWNEYXRhVHlwZSwgdXRpbH0gZnJvbSAnQHRlbnNvcmZsb3cvdGZqcy1jb3JlJztcblxuaW1wb3J0IHtTaW1wbGVVbmFyeUltcGwsIFNpbXBsZVVuYXJ5T3BlcmF0aW9ufSBmcm9tICcuL3VuYXJ5X3R5cGVzJztcblxuLyoqXG4gKiBUZW1wbGF0ZSB0aGF0IGNyZWF0ZXMgaW1wbGVtZW50YXRpb24gZm9yIHVuYXJ5IG9wLlxuICovXG5leHBvcnQgZnVuY3Rpb24gY3JlYXRlU2ltcGxlVW5hcnlJbXBsKG9wOiBTaW1wbGVVbmFyeU9wZXJhdGlvbik6XG4gICAgU2ltcGxlVW5hcnlJbXBsIHtcbiAgcmV0dXJuICh2YWx1ZXMsIGR0eXBlLCBhdHRycykgPT4ge1xuICAgIGNvbnN0IG5ld1ZhbHVlcyA9XG4gICAgICAgIHV0aWwuZ2V0VHlwZWRBcnJheUZyb21EVHlwZShkdHlwZSBhcyBOdW1lcmljRGF0YVR5cGUsIHZhbHVlcy5sZW5ndGgpO1xuICAgIGZvciAobGV0IGkgPSAwOyBpIDwgdmFsdWVzLmxlbmd0aDsgKytpKSB7XG4gICAgICBuZXdWYWx1ZXNbaV0gPSBvcCh2YWx1ZXNbaV0sIGF0dHJzKTtcbiAgICB9XG4gICAgcmV0dXJuIG5ld1ZhbHVlcztcbiAgfTtcbn1cbiJdfQ==","/**\n * @license\n * Copyright 2020 Google LLC. All Rights Reserved.\n * Licensed under the Apache License, Version 2.0 (the License);\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an AS IS BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n * =============================================================================\n */\nimport { Sigmoid } from '@tensorflow/tfjs-core';\nimport { createSimpleUnaryImpl } from '../utils/unary_impl';\nimport { unaryKernelFunc } from '../utils/unary_utils';\nexport const sigmoidImpl = createSimpleUnaryImpl((xi) => 1 / (1 + Math.exp(-xi)));\nexport const sigmoid = unaryKernelFunc(Sigmoid, (xi) => 1 / (1 + Math.exp(-xi)));\nexport const sigmoidConfig = {\n kernelName: Sigmoid,\n backendName: 'cpu',\n kernelFunc: sigmoid,\n};\n//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiU2lnbW9pZC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uLy4uL3RmanMtYmFja2VuZC1jcHUvc3JjL2tlcm5lbHMvU2lnbW9pZC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQTs7Ozs7Ozs7Ozs7Ozs7O0dBZUc7QUFFSCxPQUFPLEVBQWUsT0FBTyxFQUFDLE1BQU0sdUJBQXVCLENBQUM7QUFFNUQsT0FBTyxFQUFDLHFCQUFxQixFQUFDLE1BQU0scUJBQXFCLENBQUM7QUFDMUQsT0FBTyxFQUFDLGVBQWUsRUFBQyxNQUFNLHNCQUFzQixDQUFDO0FBRXJELE1BQU0sQ0FBQyxNQUFNLFdBQVcsR0FDcEIscUJBQXFCLENBQUMsQ0FBQyxFQUFFLEVBQUUsRUFBRSxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsR0FBRyxJQUFJLENBQUMsR0FBRyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxDQUFDO0FBQzNELE1BQU0sQ0FBQyxNQUFNLE9BQU8sR0FDaEIsZUFBZSxDQUFDLE9BQU8sRUFBRSxDQUFDLEVBQUUsRUFBRSxFQUFFLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxHQUFHLElBQUksQ0FBQyxHQUFHLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUM7QUFFOUQsTUFBTSxDQUFDLE1BQU0sYUFBYSxHQUFpQjtJQUN6QyxVQUFVLEVBQUUsT0FBTztJQUNuQixXQUFXLEVBQUUsS0FBSztJQUNsQixVQUFVLEVBQUUsT0FBTztDQUNwQixDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiLyoqXG4gKiBAbGljZW5zZVxuICogQ29weXJpZ2h0IDIwMjAgR29vZ2xlIExMQy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC5cbiAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSBMaWNlbnNlKTtcbiAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS5cbiAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdFxuICpcbiAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMFxuICpcbiAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmVcbiAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuIEFTIElTIEJBU0lTLFxuICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuXG4gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kXG4gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS5cbiAqID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4gKi9cblxuaW1wb3J0IHtLZXJuZWxDb25maWcsIFNpZ21vaWR9IGZyb20gJ0B0ZW5zb3JmbG93L3RmanMtY29yZSc7XG5cbmltcG9ydCB7Y3JlYXRlU2ltcGxlVW5hcnlJbXBsfSBmcm9tICcuLi91dGlscy91bmFyeV9pbXBsJztcbmltcG9ydCB7dW5hcnlLZXJuZWxGdW5jfSBmcm9tICcuLi91dGlscy91bmFyeV91dGlscyc7XG5cbmV4cG9ydCBjb25zdCBzaWdtb2lkSW1wbCA9XG4gICAgY3JlYXRlU2ltcGxlVW5hcnlJbXBsKCh4aSkgPT4gMSAvICgxICsgTWF0aC5leHAoLXhpKSkpO1xuZXhwb3J0IGNvbnN0IHNpZ21vaWQgPVxuICAgIHVuYXJ5S2VybmVsRnVuYyhTaWdtb2lkLCAoeGkpID0+IDEgLyAoMSArIE1hdGguZXhwKC14aSkpKTtcblxuZXhwb3J0IGNvbnN0IHNpZ21vaWRDb25maWc6IEtlcm5lbENvbmZpZyA9IHtcbiAga2VybmVsTmFtZTogU2lnbW9pZCxcbiAgYmFja2VuZE5hbWU6ICdjcHUnLFxuICBrZXJuZWxGdW5jOiBzaWdtb2lkLFxufTtcbiJdfQ==","/**\n * @license\n * Copyright 2020 Google LLC. All Rights Reserved.\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n * =============================================================================\n */\nimport { elu } from '../kernels/Elu';\nimport { identity } from '../kernels/Identity';\nimport { leakyRelu } from '../kernels/LeakyRelu';\nimport { prelu } from '../kernels/Prelu';\nimport { relu } from '../kernels/Relu';\nimport { relu6 } from '../kernels/Relu6';\nimport { sigmoid } from '../kernels/Sigmoid';\nexport function applyActivation(backend, x, activation, preluActivationWeights, leakyreluAlpha) {\n if (activation === 'linear') {\n return identity({ inputs: { x }, backend });\n }\n else if (activation === 'relu') {\n return relu({ inputs: { x }, backend });\n }\n else if (activation === 'elu') {\n return elu({ inputs: { x }, backend });\n }\n else if (activation === 'relu6') {\n return relu6({ inputs: { x }, backend });\n }\n else if (activation === 'prelu') {\n return prelu({ inputs: { x, alpha: preluActivationWeights }, backend });\n }\n else if (activation === 'leakyrelu') {\n return leakyRelu({ inputs: { x }, backend, attrs: { alpha: leakyreluAlpha } });\n }\n else if (activation === 'sigmoid') {\n return sigmoid({ inputs: { x }, backend });\n }\n throw new Error(`Activation ${activation} has not been implemented for the CPU backend.`);\n}\n//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZnVzZWRfdXRpbHMuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi8uLi90ZmpzLWJhY2tlbmQtY3B1L3NyYy91dGlscy9mdXNlZF91dGlscy50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQTs7Ozs7Ozs7Ozs7Ozs7O0dBZUc7QUFLSCxPQUFPLEVBQUMsR0FBRyxFQUFDLE1BQU0sZ0JBQWdCLENBQUM7QUFDbkMsT0FBTyxFQUFDLFFBQVEsRUFBQyxNQUFNLHFCQUFxQixDQUFDO0FBQzdDLE9BQU8sRUFBQyxTQUFTLEVBQUMsTUFBTSxzQkFBc0IsQ0FBQztBQUMvQyxPQUFPLEVBQUMsS0FBSyxFQUFDLE1BQU0sa0JBQWtCLENBQUM7QUFDdkMsT0FBTyxFQUFDLElBQUksRUFBQyxNQUFNLGlCQUFpQixDQUFDO0FBQ3JDLE9BQU8sRUFBQyxLQUFLLEVBQUMsTUFBTSxrQkFBa0IsQ0FBQztBQUN2QyxPQUFPLEVBQUMsT0FBTyxFQUFDLE1BQU0sb0JBQW9CLENBQUM7QUFFM0MsTUFBTSxVQUFVLGVBQWUsQ0FDM0IsT0FBdUIsRUFBRSxDQUFhLEVBQUUsVUFBbUMsRUFDM0Usc0JBQW1DLEVBQUUsY0FBdUI7SUFDOUQsSUFBSSxVQUFVLEtBQUssUUFBUSxFQUFFO1FBQzNCLE9BQU8sUUFBUSxDQUFDLEVBQUMsTUFBTSxFQUFFLEVBQUMsQ0FBQyxFQUFDLEVBQUUsT0FBTyxFQUFDLENBQUMsQ0FBQztLQUN6QztTQUFNLElBQUksVUFBVSxLQUFLLE1BQU0sRUFBRTtRQUNoQyxPQUFPLElBQUksQ0FBQyxFQUFDLE1BQU0sRUFBRSxFQUFDLENBQUMsRUFBQyxFQUFFLE9BQU8sRUFBQyxDQUFlLENBQUM7S0FDbkQ7U0FBTSxJQUFJLFVBQVUsS0FBSyxLQUFLLEVBQUU7UUFDL0IsT0FBTyxHQUFHLENBQUMsRUFBQyxNQUFNLEVBQUUsRUFBQyxDQUFDLEVBQUMsRUFBRSxPQUFPLEVBQUMsQ0FBZSxDQUFDO0tBQ2xEO1NBQU0sSUFBSSxVQUFVLEtBQUssT0FBTyxFQUFFO1FBQ2pDLE9BQU8sS0FBSyxDQUFDLEVBQUMsTUFBTSxFQUFFLEVBQUMsQ0FBQyxFQUFDLEVBQUUsT0FBTyxFQUFDLENBQWUsQ0FBQztLQUNwRDtTQUFNLElBQUksVUFBVSxLQUFLLE9BQU8sRUFBRTtRQUNqQyxPQUFPLEtBQUssQ0FBQyxFQUFDLE1BQU0sRUFBRSxFQUFDLENBQUMsRUFBRSxLQUFLLEVBQUUsc0JBQXNCLEVBQUMsRUFBRSxPQUFPLEVBQUMsQ0FBQyxDQUFDO0tBQ3JFO1NBQU0sSUFBSSxVQUFVLEtBQUssV0FBVyxFQUFFO1FBQ3JDLE9BQU8sU0FBUyxDQUFDLEVBQUMsTUFBTSxFQUFFLEVBQUMsQ0FBQyxFQUFDLEVBQUUsT0FBTyxFQUFFLEtBQUssRUFBRSxFQUFDLEtBQUssRUFBRSxjQUFjLEVBQUMsRUFBQyxDQUFDLENBQUM7S0FDMUU7U0FBTSxJQUFJLFVBQVUsS0FBSyxTQUFTLEVBQUU7UUFDbkMsT0FBTyxPQUFPLENBQUMsRUFBQyxNQUFNLEVBQUUsRUFBQyxDQUFDLEVBQUMsRUFBRSxPQUFPLEVBQUMsQ0FBZSxDQUFDO0tBQ3REO0lBQ0QsTUFBTSxJQUFJLEtBQUssQ0FDWCxjQUFjLFVBQVUsZ0RBQWdELENBQUMsQ0FBQztBQUNoRixDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiLyoqXG4gKiBAbGljZW5zZVxuICogQ29weXJpZ2h0IDIwMjAgR29vZ2xlIExMQy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC5cbiAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSBcIkxpY2Vuc2VcIik7XG4gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuXG4gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXRcbiAqXG4gKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjBcbiAqXG4gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlXG4gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiBcIkFTIElTXCIgQkFTSVMsXG4gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC5cbiAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmRcbiAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLlxuICogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbiAqL1xuXG5pbXBvcnQge19GdXNlZE1hdE11bCwgX0Z1c2VkTWF0TXVsQXR0cnMsIF9GdXNlZE1hdE11bElucHV0cywgYmFja2VuZF91dGlsLCBUZW5zb3JJbmZvfSBmcm9tICdAdGVuc29yZmxvdy90ZmpzLWNvcmUnO1xuXG5pbXBvcnQge01hdGhCYWNrZW5kQ1BVfSBmcm9tICcuLi9iYWNrZW5kX2NwdSc7XG5pbXBvcnQge2VsdX0gZnJvbSAnLi4va2VybmVscy9FbHUnO1xuaW1wb3J0IHtpZGVudGl0eX0gZnJvbSAnLi4va2VybmVscy9JZGVudGl0eSc7XG5pbXBvcnQge2xlYWt5UmVsdX0gZnJvbSAnLi4va2VybmVscy9MZWFreVJlbHUnO1xuaW1wb3J0IHtwcmVsdX0gZnJvbSAnLi4va2VybmVscy9QcmVsdSc7XG5pbXBvcnQge3JlbHV9IGZyb20gJy4uL2tlcm5lbHMvUmVsdSc7XG5pbXBvcnQge3JlbHU2fSBmcm9tICcuLi9rZXJuZWxzL1JlbHU2JztcbmltcG9ydCB7c2lnbW9pZH0gZnJvbSAnLi4va2VybmVscy9TaWdtb2lkJztcblxuZXhwb3J0IGZ1bmN0aW9uIGFwcGx5QWN0aXZhdGlvbihcbiAgICBiYWNrZW5kOiBNYXRoQmFja2VuZENQVSwgeDogVGVuc29ySW5mbywgYWN0aXZhdGlvbjogYmFja2VuZF91dGlsLkFjdGl2YXRpb24sXG4gICAgcHJlbHVBY3RpdmF0aW9uV2VpZ2h0cz86IFRlbnNvckluZm8sIGxlYWt5cmVsdUFscGhhPzogbnVtYmVyKTogVGVuc29ySW5mbyB7XG4gIGlmIChhY3RpdmF0aW9uID09PSAnbGluZWFyJykge1xuICAgIHJldHVybiBpZGVudGl0eSh7aW5wdXRzOiB7eH0sIGJhY2tlbmR9KTtcbiAgfSBlbHNlIGlmIChhY3RpdmF0aW9uID09PSAncmVsdScpIHtcbiAgICByZXR1cm4gcmVsdSh7aW5wdXRzOiB7eH0sIGJhY2tlbmR9KSBhcyBUZW5zb3JJbmZvO1xuICB9IGVsc2UgaWYgKGFjdGl2YXRpb24gPT09ICdlbHUnKSB7XG4gICAgcmV0dXJuIGVsdSh7aW5wdXRzOiB7eH0sIGJhY2tlbmR9KSBhcyBUZW5zb3JJbmZvO1xuICB9IGVsc2UgaWYgKGFjdGl2YXRpb24gPT09ICdyZWx1NicpIHtcbiAgICByZXR1cm4gcmVsdTYoe2lucHV0czoge3h9LCBiYWNrZW5kfSkgYXMgVGVuc29ySW5mbztcbiAgfSBlbHNlIGlmIChhY3RpdmF0aW9uID09PSAncHJlbHUnKSB7XG4gICAgcmV0dXJuIHByZWx1KHtpbnB1dHM6IHt4LCBhbHBoYTogcHJlbHVBY3RpdmF0aW9uV2VpZ2h0c30sIGJhY2tlbmR9KTtcbiAgfSBlbHNlIGlmIChhY3RpdmF0aW9uID09PSAnbGVha3lyZWx1Jykge1xuICAgIHJldHVybiBsZWFreVJlbHUoe2lucHV0czoge3h9LCBiYWNrZW5kLCBhdHRyczoge2FscGhhOiBsZWFreXJlbHVBbHBoYX19KTtcbiAgfSBlbHNlIGlmIChhY3RpdmF0aW9uID09PSAnc2lnbW9pZCcpIHtcbiAgICByZXR1cm4gc2lnbW9pZCh7aW5wdXRzOiB7eH0sIGJhY2tlbmR9KSBhcyBUZW5zb3JJbmZvO1xuICB9XG4gIHRocm93IG5ldyBFcnJvcihcbiAgICAgIGBBY3RpdmF0aW9uICR7YWN0aXZhdGlvbn0gaGFzIG5vdCBiZWVuIGltcGxlbWVudGVkIGZvciB0aGUgQ1BVIGJhY2tlbmQuYCk7XG59XG4iXX0=","/**\n * @license\n * Copyright 2020 Google LLC. All Rights Reserved.\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n * =============================================================================\n */\nimport { Complex } from '@tensorflow/tfjs-core';\nexport function complex(args) {\n const { inputs, backend } = args;\n const { real, imag } = inputs;\n const realVals = backend.data.get(real.dataId).values;\n const imagVals = backend.data.get(imag.dataId).values;\n const complexInfo = backend.makeTensorInfo(real.shape, 'complex64');\n const complex = backend.data.get(complexInfo.dataId);\n // The complex tensor owns the underlying real and imag tensorInfos, only the\n // complex tensor tracks refCount, when complexData is disposed the\n // underlying tensorData will be disposed.\n complex.complexTensorInfos = {\n real: backend.makeTensorInfo(real.shape, 'float32', realVals),\n imag: backend.makeTensorInfo(imag.shape, 'float32', imagVals)\n };\n return complexInfo;\n}\nexport const complexConfig = {\n kernelName: Complex,\n backendName: 'cpu',\n kernelFunc: complex\n};\n//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiQ29tcGxleC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uLy4uL3RmanMtYmFja2VuZC1jcHUvc3JjL2tlcm5lbHMvQ29tcGxleC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQTs7Ozs7Ozs7Ozs7Ozs7O0dBZUc7QUFFSCxPQUFPLEVBQUMsT0FBTyxFQUFrRSxNQUFNLHVCQUF1QixDQUFDO0FBSS9HLE1BQU0sVUFBVSxPQUFPLENBQUMsSUFBc0Q7SUFFNUUsTUFBTSxFQUFDLE1BQU0sRUFBRSxPQUFPLEVBQUMsR0FBRyxJQUFJLENBQUM7SUFDL0IsTUFBTSxFQUFDLElBQUksRUFBRSxJQUFJLEVBQUMsR0FBRyxNQUFNLENBQUM7SUFFNUIsTUFBTSxRQUFRLEdBQUcsT0FBTyxDQUFDLElBQUksQ0FBQyxHQUFHLENBQUMsSUFBSSxDQUFDLE1BQU0sQ0FBQyxDQUFDLE1BQW9CLENBQUM7SUFDcEUsTUFBTSxRQUFRLEdBQUcsT0FBTyxDQUFDLElBQUksQ0FBQyxHQUFHLENBQUMsSUFBSSxDQUFDLE1BQU0sQ0FBQyxDQUFDLE1BQW9CLENBQUM7SUFFcEUsTUFBTSxXQUFXLEdBQUcsT0FBTyxDQUFDLGNBQWMsQ0FBQyxJQUFJLENBQUMsS0FBSyxFQUFFLFdBQVcsQ0FBQyxDQUFDO0lBRXBFLE1BQU0sT0FBTyxHQUFHLE9BQU8sQ0FBQyxJQUFJLENBQUMsR0FBRyxDQUFDLFdBQVcsQ0FBQyxNQUFNLENBQUMsQ0FBQztJQUVyRCw2RUFBNkU7SUFDN0UsbUVBQW1FO0lBQ25FLDBDQUEwQztJQUMxQyxPQUFPLENBQUMsa0JBQWtCLEdBQUc7UUFDM0IsSUFBSSxFQUFFLE9BQU8sQ0FBQyxjQUFjLENBQUMsSUFBSSxDQUFDLEtBQUssRUFBRSxTQUFTLEVBQUUsUUFBUSxDQUFDO1FBQzdELElBQUksRUFBRSxPQUFPLENBQUMsY0FBYyxDQUFDLElBQUksQ0FBQyxLQUFLLEVBQUUsU0FBUyxFQUFFLFFBQVEsQ0FBQztLQUM5RCxDQUFDO0lBRUYsT0FBTyxXQUFXLENBQUM7QUFDckIsQ0FBQztBQUVELE1BQU0sQ0FBQyxNQUFNLGFBQWEsR0FBaUI7SUFDekMsVUFBVSxFQUFFLE9BQU87SUFDbkIsV0FBVyxFQUFFLEtBQUs7SUFDbEIsVUFBVSxFQUFFLE9BQTJCO0NBQ3hDLENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyIvKipcbiAqIEBsaWNlbnNlXG4gKiBDb3B5cmlnaHQgMjAyMCBHb29nbGUgTExDLiBBbGwgUmlnaHRzIFJlc2VydmVkLlxuICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlIFwiTGljZW5zZVwiKTtcbiAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS5cbiAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdFxuICpcbiAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMFxuICpcbiAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmVcbiAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuIFwiQVMgSVNcIiBCQVNJUyxcbiAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLlxuICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZFxuICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuXG4gKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuICovXG5cbmltcG9ydCB7Q29tcGxleCwgQ29tcGxleElucHV0cywgS2VybmVsQ29uZmlnLCBLZXJuZWxGdW5jLCBUZW5zb3JJbmZvLCBUeXBlZEFycmF5fSBmcm9tICdAdGVuc29yZmxvdy90ZmpzLWNvcmUnO1xuXG5pbXBvcnQge01hdGhCYWNrZW5kQ1BVfSBmcm9tICcuLi9iYWNrZW5kX2NwdSc7XG5cbmV4cG9ydCBmdW5jdGlvbiBjb21wbGV4KGFyZ3M6IHtpbnB1dHM6IENvbXBsZXhJbnB1dHMsIGJhY2tlbmQ6IE1hdGhCYWNrZW5kQ1BVfSk6XG4gICAgVGVuc29ySW5mbyB7XG4gIGNvbnN0IHtpbnB1dHMsIGJhY2tlbmR9ID0gYXJncztcbiAgY29uc3Qge3JlYWwsIGltYWd9ID0gaW5wdXRzO1xuXG4gIGNvbnN0IHJlYWxWYWxzID0gYmFja2VuZC5kYXRhLmdldChyZWFsLmRhdGFJZCkudmFsdWVzIGFzIFR5cGVkQXJyYXk7XG4gIGNvbnN0IGltYWdWYWxzID0gYmFja2VuZC5kYXRhLmdldChpbWFnLmRhdGFJZCkudmFsdWVzIGFzIFR5cGVkQXJyYXk7XG5cbiAgY29uc3QgY29tcGxleEluZm8gPSBiYWNrZW5kLm1ha2VUZW5zb3JJbmZvKHJlYWwuc2hhcGUsICdjb21wbGV4NjQnKTtcblxuICBjb25zdCBjb21wbGV4ID0gYmFja2VuZC5kYXRhLmdldChjb21wbGV4SW5mby5kYXRhSWQpO1xuXG4gIC8vIFRoZSBjb21wbGV4IHRlbnNvciBvd25zIHRoZSB1bmRlcmx5aW5nIHJlYWwgYW5kIGltYWcgdGVuc29ySW5mb3MsIG9ubHkgdGhlXG4gIC8vIGNvbXBsZXggdGVuc29yIHRyYWNrcyByZWZDb3VudCwgd2hlbiBjb21wbGV4RGF0YSBpcyBkaXNwb3NlZCB0aGVcbiAgLy8gdW5kZXJseWluZyB0ZW5zb3JEYXRhIHdpbGwgYmUgZGlzcG9zZWQuXG4gIGNvbXBsZXguY29tcGxleFRlbnNvckluZm9zID0ge1xuICAgIHJlYWw6IGJhY2tlbmQubWFrZVRlbnNvckluZm8ocmVhbC5zaGFwZSwgJ2Zsb2F0MzInLCByZWFsVmFscyksXG4gICAgaW1hZzogYmFja2VuZC5tYWtlVGVuc29ySW5mbyhpbWFnLnNoYXBlLCAnZmxvYXQzMicsIGltYWdWYWxzKVxuICB9O1xuXG4gIHJldHVybiBjb21wbGV4SW5mbztcbn1cblxuZXhwb3J0IGNvbnN0IGNvbXBsZXhDb25maWc6IEtlcm5lbENvbmZpZyA9IHtcbiAga2VybmVsTmFtZTogQ29tcGxleCxcbiAgYmFja2VuZE5hbWU6ICdjcHUnLFxuICBrZXJuZWxGdW5jOiBjb21wbGV4IGFzIHt9IGFzIEtlcm5lbEZ1bmNcbn07XG4iXX0=","/**\n * @license\n * Copyright 2020 Google LLC. All Rights Reserved.\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n * =============================================================================\n */\nimport { util } from '@tensorflow/tfjs-core';\nimport { complex } from '../kernels/Complex';\n/**\n * Generates a tensorInfo with all zeros value.\n * @param backend cpu backend.\n * @param shape Shape for the zeros tensor.\n * @param dtype Optional. If set, the result has this dtype.\n */\nexport function zeros(backend, shape, dtype = 'float32') {\n if (dtype === 'complex64') {\n const real = zeros(backend, shape, 'float32');\n const imag = zeros(backend, shape, 'float32');\n return complex({ inputs: { real, imag }, backend });\n }\n const values = util.makeZerosTypedArray(util.sizeFromShape(shape), dtype);\n return backend.makeTensorInfo(shape, dtype, values);\n}\n//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiemVyb3NfaW1wbC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uLy4uL3RmanMtYmFja2VuZC1jcHUvc3JjL3V0aWxzL3plcm9zX2ltcGwudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUE7Ozs7Ozs7Ozs7Ozs7OztHQWVHO0FBRUgsT0FBTyxFQUF1QixJQUFJLEVBQUMsTUFBTSx1QkFBdUIsQ0FBQztBQUVqRSxPQUFPLEVBQUMsT0FBTyxFQUFDLE1BQU0sb0JBQW9CLENBQUM7QUFFM0M7Ozs7O0dBS0c7QUFDSCxNQUFNLFVBQVUsS0FBSyxDQUNqQixPQUF1QixFQUFFLEtBQWUsRUFDeEMsUUFBa0IsU0FBUztJQUM3QixJQUFJLEtBQUssS0FBSyxXQUFXLEVBQUU7UUFDekIsTUFBTSxJQUFJLEdBQUcsS0FBSyxDQUFDLE9BQU8sRUFBRSxLQUFLLEVBQUUsU0FBUyxDQUFDLENBQUM7UUFDOUMsTUFBTSxJQUFJLEdBQUcsS0FBSyxDQUFDLE9BQU8sRUFBRSxLQUFLLEVBQUUsU0FBUyxDQUFDLENBQUM7UUFFOUMsT0FBTyxPQUFPLENBQUMsRUFBQyxNQUFNLEVBQUUsRUFBQyxJQUFJLEVBQUUsSUFBSSxFQUFDLEVBQUUsT0FBTyxFQUFDLENBQUMsQ0FBQztLQUNqRDtJQUVELE1BQU0sTUFBTSxHQUFHLElBQUksQ0FBQyxtQkFBbUIsQ0FBQyxJQUFJLENBQUMsYUFBYSxDQUFDLEtBQUssQ0FBQyxFQUFFLEtBQUssQ0FBQyxDQUFDO0lBRTFFLE9BQU8sT0FBTyxDQUFDLGNBQWMsQ0FBQyxLQUFLLEVBQUUsS0FBSyxFQUFFLE1BQU0sQ0FBQyxDQUFDO0FBQ3RELENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyIvKipcbiAqIEBsaWNlbnNlXG4gKiBDb3B5cmlnaHQgMjAyMCBHb29nbGUgTExDLiBBbGwgUmlnaHRzIFJlc2VydmVkLlxuICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlIFwiTGljZW5zZVwiKTtcbiAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS5cbiAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdFxuICpcbiAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMFxuICpcbiAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmVcbiAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuIFwiQVMgSVNcIiBCQVNJUyxcbiAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLlxuICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZFxuICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuXG4gKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuICovXG5cbmltcG9ydCB7RGF0YVR5cGUsIFRlbnNvckluZm8sIHV0aWx9IGZyb20gJ0B0ZW5zb3JmbG93L3RmanMtY29yZSc7XG5pbXBvcnQge01hdGhCYWNrZW5kQ1BVfSBmcm9tICcuLi9iYWNrZW5kX2NwdSc7XG5pbXBvcnQge2NvbXBsZXh9IGZyb20gJy4uL2tlcm5lbHMvQ29tcGxleCc7XG5cbi8qKlxuICogR2VuZXJhdGVzIGEgdGVuc29ySW5mbyB3aXRoIGFsbCB6ZXJvcyB2YWx1ZS5cbiAqIEBwYXJhbSBiYWNrZW5kIGNwdSBiYWNrZW5kLlxuICogQHBhcmFtIHNoYXBlIFNoYXBlIGZvciB0aGUgemVyb3MgdGVuc29yLlxuICogQHBhcmFtIGR0eXBlIE9wdGlvbmFsLiBJZiBzZXQsIHRoZSByZXN1bHQgaGFzIHRoaXMgZHR5cGUuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiB6ZXJvcyhcbiAgICBiYWNrZW5kOiBNYXRoQmFja2VuZENQVSwgc2hhcGU6IG51bWJlcltdLFxuICAgIGR0eXBlOiBEYXRhVHlwZSA9ICdmbG9hdDMyJyk6IFRlbnNvckluZm8ge1xuICBpZiAoZHR5cGUgPT09ICdjb21wbGV4NjQnKSB7XG4gICAgY29uc3QgcmVhbCA9IHplcm9zKGJhY2tlbmQsIHNoYXBlLCAnZmxvYXQzMicpO1xuICAgIGNvbnN0IGltYWcgPSB6ZXJvcyhiYWNrZW5kLCBzaGFwZSwgJ2Zsb2F0MzInKTtcblxuICAgIHJldHVybiBjb21wbGV4KHtpbnB1dHM6IHtyZWFsLCBpbWFnfSwgYmFja2VuZH0pO1xuICB9XG5cbiAgY29uc3QgdmFsdWVzID0gdXRpbC5tYWtlWmVyb3NUeXBlZEFycmF5KHV0aWwuc2l6ZUZyb21TaGFwZShzaGFwZSksIGR0eXBlKTtcblxuICByZXR1cm4gYmFja2VuZC5tYWtlVGVuc29ySW5mbyhzaGFwZSwgZHR5cGUsIHZhbHVlcyk7XG59XG4iXX0=","/**\n * @license\n * Copyright 2020 Google LLC. All Rights Reserved.\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n * =============================================================================\n */\nimport { Real } from '@tensorflow/tfjs-core';\nexport function real(args) {\n const { inputs, backend } = args;\n const { input } = inputs;\n const real = backend.data.get(input.dataId).complexTensorInfos.real;\n const realVal = backend.data.get(real.dataId).values;\n // When complex tensor is disposed, its underlying parts will be disposed too.\n // Make new tensor out of the real value of the complex. This makes sure the\n // value is still accessible even if complex tensor is disposed.\n return backend.makeTensorInfo(real.shape, real.dtype, realVal);\n}\nexport const realConfig = {\n kernelName: Real,\n backendName: 'cpu',\n kernelFunc: real\n};\n//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiUmVhbC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uLy4uL3RmanMtYmFja2VuZC1jcHUvc3JjL2tlcm5lbHMvUmVhbC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQTs7Ozs7Ozs7Ozs7Ozs7O0dBZUc7QUFFSCxPQUFPLEVBQTJCLElBQUksRUFBeUIsTUFBTSx1QkFBdUIsQ0FBQztBQUk3RixNQUFNLFVBQVUsSUFBSSxDQUFDLElBQW1EO0lBRXRFLE1BQU0sRUFBQyxNQUFNLEVBQUUsT0FBTyxFQUFDLEdBQUcsSUFBSSxDQUFDO0lBQy9CLE1BQU0sRUFBQyxLQUFLLEVBQUMsR0FBRyxNQUFNLENBQUM7SUFFdkIsTUFBTSxJQUFJLEdBQUcsT0FBTyxDQUFDLElBQUksQ0FBQyxHQUFHLENBQUMsS0FBSyxDQUFDLE1BQU0sQ0FBQyxDQUFDLGtCQUFrQixDQUFDLElBQUksQ0FBQztJQUNwRSxNQUFNLE9BQU8sR0FBRyxPQUFPLENBQUMsSUFBSSxDQUFDLEdBQUcsQ0FBQyxJQUFJLENBQUMsTUFBTSxDQUFDLENBQUMsTUFBTSxDQUFDO0lBRXJELDhFQUE4RTtJQUM5RSw0RUFBNEU7SUFDNUUsZ0VBQWdFO0lBQ2hFLE9BQU8sT0FBTyxDQUFDLGNBQWMsQ0FBQyxJQUFJLENBQUMsS0FBSyxFQUFFLElBQUksQ0FBQyxLQUFLLEVBQUUsT0FBTyxDQUFDLENBQUM7QUFDakUsQ0FBQztBQUVELE1BQU0sQ0FBQyxNQUFNLFVBQVUsR0FBaUI7SUFDdEMsVUFBVSxFQUFFLElBQUk7SUFDaEIsV0FBVyxFQUFFLEtBQUs7SUFDbEIsVUFBVSxFQUFFLElBQXdCO0NBQ3JDLENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyIvKipcbiAqIEBsaWNlbnNlXG4gKiBDb3B5cmlnaHQgMjAyMCBHb29nbGUgTExDLiBBbGwgUmlnaHRzIFJlc2VydmVkLlxuICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlIFwiTGljZW5zZVwiKTtcbiAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS5cbiAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdFxuICpcbiAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMFxuICpcbiAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmVcbiAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuIFwiQVMgSVNcIiBCQVNJUyxcbiAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLlxuICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZFxuICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuXG4gKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuICovXG5cbmltcG9ydCB7S2VybmVsQ29uZmlnLCBLZXJuZWxGdW5jLCBSZWFsLCBSZWFsSW5wdXRzLCBUZW5zb3JJbmZvfSBmcm9tICdAdGVuc29yZmxvdy90ZmpzLWNvcmUnO1xuXG5pbXBvcnQge01hdGhCYWNrZW5kQ1BVfSBmcm9tICcuLi9iYWNrZW5kX2NwdSc7XG5cbmV4cG9ydCBmdW5jdGlvbiByZWFsKGFyZ3M6IHtpbnB1dHM6IFJlYWxJbnB1dHMsIGJhY2tlbmQ6IE1hdGhCYWNrZW5kQ1BVfSk6XG4gICAgVGVuc29ySW5mbyB7XG4gIGNvbnN0IHtpbnB1dHMsIGJhY2tlbmR9ID0gYXJncztcbiAgY29uc3Qge2lucHV0fSA9IGlucHV0cztcblxuICBjb25zdCByZWFsID0gYmFja2VuZC5kYXRhLmdldChpbnB1dC5kYXRhSWQpLmNvbXBsZXhUZW5zb3JJbmZvcy5yZWFsO1xuICBjb25zdCByZWFsVmFsID0gYmFja2VuZC5kYXRhLmdldChyZWFsLmRhdGFJZCkudmFsdWVzO1xuXG4gIC8vIFdoZW4gY29tcGxleCB0ZW5zb3IgaXMgZGlzcG9zZWQsIGl0cyB1bmRlcmx5aW5nIHBhcnRzIHdpbGwgYmUgZGlzcG9zZWQgdG9vLlxuICAvLyBNYWtlIG5ldyB0ZW5zb3Igb3V0IG9mIHRoZSByZWFsIHZhbHVlIG9mIHRoZSBjb21wbGV4LiBUaGlzIG1ha2VzIHN1cmUgdGhlXG4gIC8vIHZhbHVlIGlzIHN0aWxsIGFjY2Vzc2libGUgZXZlbiBpZiBjb21wbGV4IHRlbnNvciBpcyBkaXNwb3NlZC5cbiAgcmV0dXJuIGJhY2tlbmQubWFrZVRlbnNvckluZm8ocmVhbC5zaGFwZSwgcmVhbC5kdHlwZSwgcmVhbFZhbCk7XG59XG5cbmV4cG9ydCBjb25zdCByZWFsQ29uZmlnOiBLZXJuZWxDb25maWcgPSB7XG4gIGtlcm5lbE5hbWU6IFJlYWwsXG4gIGJhY2tlbmROYW1lOiAnY3B1JyxcbiAga2VybmVsRnVuYzogcmVhbCBhcyB7fSBhcyBLZXJuZWxGdW5jXG59O1xuIl19","/**\n * @license\n * Copyright 2020 Google LLC. All Rights Reserved.\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n * =============================================================================\n */\nimport { Cast, util } from '@tensorflow/tfjs-core';\nimport { createSimpleBinaryKernelImpl } from '../utils/binary_impl';\nimport { zeros } from '../utils/zeros_impl';\nimport { complex } from './Complex';\nimport { identity } from './Identity';\nimport { real } from './Real';\nexport function castImpl(values, shape, inputType, dtype) {\n if (dtype === 'int32') {\n const resultValues = Int32Array.from(values);\n return [shape, 'int32', resultValues];\n }\n if (dtype === 'bool') {\n // This is essentially the result of notEqual(x, 0). We avoid using\n // kernel notEqual to avoid circular dependency, i.e. binary_utils ->\n // cast -> notEqual -> binary_utils.\n const zero = util.toTypedArray([0], inputType);\n const [resultData, resultShape] = createSimpleBinaryKernelImpl((a, b) => (a !== b) ? 1 : 0)(shape, [], values, zero, 'bool');\n return [resultShape, 'bool', resultData];\n }\n throw new Error(`Error in Cast: failed to cast ${inputType} to ${dtype}`);\n}\nexport function cast(args) {\n const { inputs, backend, attrs } = args;\n const { x } = inputs;\n const { dtype } = attrs;\n // Casting to complex64.\n if (dtype === 'complex64') {\n if (x.dtype === 'complex64') {\n return identity({ inputs: { x }, backend });\n }\n const zerosTensorInfo = zeros(backend, x.shape, x.dtype);\n const floatX = cast({ inputs: { x }, backend, attrs: { dtype: 'float32' } });\n const result = complex({ inputs: { real: floatX, imag: zerosTensorInfo }, backend });\n backend.disposeIntermediateTensorInfo(zerosTensorInfo);\n backend.disposeIntermediateTensorInfo(floatX);\n return result;\n }\n // Casting from complex64\n if (x.dtype === 'complex64') {\n const realPart = real({ inputs: { input: x }, backend });\n const result = cast({ inputs: { x: realPart }, backend, attrs: { dtype } });\n backend.disposeIntermediateTensorInfo(realPart);\n return result;\n }\n if (!util.hasEncodingLoss(x.dtype, dtype)) {\n // We don't change the underlying data, since we cast to higher\n // precision.\n const result = identity({ inputs: { x }, backend });\n return { dataId: result.dataId, shape: result.shape, dtype };\n }\n const values = backend.data.get(x.dataId).values;\n const [resultShape, resultType, resultData] = castImpl(values, x.shape, x.dtype, dtype);\n return backend.makeTensorInfo(resultShape, resultType, resultData);\n}\nexport const castConfig = {\n kernelName: Cast,\n backendName: 'cpu',\n kernelFunc: cast\n};\n//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiQ2FzdC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uLy4uL3RmanMtYmFja2VuZC1jcHUvc3JjL2tlcm5lbHMvQ2FzdC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQTs7Ozs7Ozs7Ozs7Ozs7O0dBZUc7QUFDSCxPQUFPLEVBQUMsSUFBSSxFQUFxRixJQUFJLEVBQUMsTUFBTSx1QkFBdUIsQ0FBQztBQUdwSSxPQUFPLEVBQUMsNEJBQTRCLEVBQUMsTUFBTSxzQkFBc0IsQ0FBQztBQUNsRSxPQUFPLEVBQUMsS0FBSyxFQUFDLE1BQU0scUJBQXFCLENBQUM7QUFFMUMsT0FBTyxFQUFDLE9BQU8sRUFBQyxNQUFNLFdBQVcsQ0FBQztBQUNsQyxPQUFPLEVBQUMsUUFBUSxFQUFDLE1BQU0sWUFBWSxDQUFDO0FBQ3BDLE9BQU8sRUFBQyxJQUFJLEVBQUMsTUFBTSxRQUFRLENBQUM7QUFFNUIsTUFBTSxVQUFVLFFBQVEsQ0FDcEIsTUFBa0IsRUFBRSxLQUFlLEVBQUUsU0FBbUIsRUFDeEQsS0FBZTtJQUNqQixJQUFJLEtBQUssS0FBSyxPQUFPLEVBQUU7UUFDckIsTUFBTSxZQUFZLEdBQUcsVUFBVSxDQUFDLElBQUksQ0FBQyxNQUFNLENBQUMsQ0FBQztRQUM3QyxPQUFPLENBQUMsS0FBSyxFQUFFLE9BQU8sRUFBRSxZQUFZLENBQUMsQ0FBQztLQUN2QztJQUVELElBQUksS0FBSyxLQUFLLE1BQU0sRUFBRTtRQUNwQixtRUFBbUU7UUFDbkUscUVBQXFFO1FBQ3JFLG9DQUFvQztRQUNwQyxNQUFNLElBQUksR0FBRyxJQUFJLENBQUMsWUFBWSxDQUFDLENBQUMsQ0FBQyxDQUFDLEVBQUUsU0FBUyxDQUFDLENBQUM7UUFFL0MsTUFBTSxDQUFDLFVBQVUsRUFBRSxXQUFXLENBQUMsR0FBRyw0QkFBNEIsQ0FDMUQsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxFQUFFLEVBQUUsQ0FBQyxDQUFDLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQyxD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QUssRUFBRSxDQUFDLENBQUMsS0FBSyxFQUFFLEtBQUssQ0FBQyxDQUFDO0lBQzlDLE9BQU8sT0FBTyxDQUFDLGNBQWMsQ0FBQyxXQUFXLEVBQUUsVUFBVSxFQUFFLFVBQVUsQ0FBQyxDQUFDO0FBQ3JFLENBQUM7QUFFRCxNQUFNLENBQUMsTUFBTSxVQUFVLEdBQWlCO0lBQ3RDLFVBQVUsRUFBRSxJQUFJO0lBQ2hCLFdBQVcsRUFBRSxLQUFLO0lBQ2xCLFVBQVUsRUFBRSxJQUF3QjtDQUNyQyxDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiLyoqXG4gKiBAbGljZW5zZVxuICogQ29weXJpZ2h0IDIwMjAgR29vZ2xlIExMQy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC5cbiAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSBcIkxpY2Vuc2VcIik7XG4gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuXG4gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXRcbiAqXG4gKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjBcbiAqXG4gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlXG4gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiBcIkFTIElTXCIgQkFTSVMsXG4gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC5cbiAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmRcbiAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLlxuICogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbiAqL1xuaW1wb3J0IHtDYXN0LCBDYXN0QXR0cnMsIENhc3RJbnB1dHMsIERhdGFUeXBlLCBLZXJuZWxDb25maWcsIEtlcm5lbEZ1bmMsIFRlbnNvckluZm8sIFR5cGVkQXJyYXksIHV0aWx9IGZyb20gJ0B0ZW5zb3JmbG93L3RmanMtY29yZSc7XG5cbmltcG9ydCB7TWF0aEJhY2tlbmRDUFV9IGZyb20gJy4uL2JhY2tlbmRfY3B1JztcbmltcG9ydCB7Y3JlYXRlU2ltcGxlQmluYXJ5S2VybmVsSW1wbH0gZnJvbSAnLi4vdXRpbHMvYmluYXJ5X2ltcGwnO1xuaW1wb3J0IHt6ZXJvc30gZnJvbSAnLi4vdXRpbHMvemVyb3NfaW1wbCc7XG5cbmltcG9ydCB7Y29tcGxleH0gZnJvbSAnLi9Db21wbGV4JztcbmltcG9ydCB7aWRlbnRpdHl9IGZyb20gJy4vSWRlbnRpdHknO1xuaW1wb3J0IHtyZWFsfSBmcm9tICcuL1JlYWwnO1xuXG5leHBvcnQgZnVuY3Rpb24gY2FzdEltcGwoXG4gICAgdmFsdWVzOiBUeXBlZEFycmF5LCBzaGFwZTogbnVtYmVyW10sIGlucHV0VHlwZTogRGF0YVR5cGUsXG4gICAgZHR5cGU6IERhdGFUeXBlKTogW251bWJlcltdLCBEYXRhVHlwZSwgVHlwZWRBcnJheV0ge1xuICBpZiAoZHR5cGUgPT09ICdpbnQzMicpIHtcbiAgICBjb25zdCByZXN1bHRWYWx1ZXMgPSBJbnQzMkFycmF5LmZyb20odmFsdWVzKTtcbiAgICByZXR1cm4gW3NoYXBlLCAnaW50MzInLCByZXN1bHRWYWx1ZXNdO1xuICB9XG5cbiAgaWYgKGR0eXBlID09PSAnYm9vbCcpIHtcbiAgICAvLyBUaGlzIGlzIGVzc2VudGlhbGx5IHRoZSByZXN1bHQgb2Ygbm90RXF1YWwoeCwgMCkuIFdlIGF2b2lkIHVzaW5nXG4gICAgLy8ga2VybmVsIG5vdEVxdWFsIHRvIGF2b2lkIGNpcmN1bGFyIGRlcGVuZGVuY3ksIGkuZS4gYmluYXJ5X3V0aWxzIC0+XG4gICAgLy8gY2FzdCAtPiBub3RFcXVhbCAtPiBiaW5hcnlfdXRpbHMuXG4gICAgY29uc3QgemVybyA9IHV0aWwudG9UeXBlZEFycmF5KFswXSwgaW5wdXRUeXBlKTtcblxuICAgIGNvbnN0IFtyZXN1bHREYXRhLCByZXN1bHRTaGFwZV0gPSBjcmVhdGVTaW1wbGVCaW5hcnlLZXJuZWxJbXBsKFxuICAgICAgICAoYSwgYikgPT4gKGEgIT09IGIpID8gMSA6IDApKHNoYXBlLCBbXSwgdmFsdWVzLCB6ZXJvLCAnYm9vbCcpO1xuXG4gICAgcmV0dXJuIFtyZXN1bHRTaGFwZSwgJ2Jvb2wnLCByZXN1bHREYXRhXTtcbiAgfVxuICB0aHJvdyBuZXcgRXJyb3IoYEVycm9yIGluIENhc3Q6IGZhaWxlZCB0byBjYXN0ICR7aW5wdXRUeXBlfSB0byAke2R0eXBlfWApO1xufVxuXG5leHBvcnQgZnVuY3Rpb24gY2FzdChcbiAgICBhcmdzOiB7aW5wdXRzOiBDYXN0SW5wdXRzLCBiYWNrZW5kOiBNYXRoQmFja2VuZENQVSwgYXR0cnM6IENhc3RBdHRyc30pOlxuICAgIFRlbnNvckluZm8ge1xuICBjb25zdCB7aW5wdXRzLCBiYWNrZW5kLCBhdHRyc30gPSBhcmdzO1xuICBjb25zdCB7eH0gPSBpbnB1dHM7XG4gIGNvbnN0IHtkdHlwZX0gPSBhdHRycztcblxuICAvLyBDYXN0aW5nIHRvIGNvbXBsZXg2NC5cbiAgaWYgKGR0eXBlID09PSAnY29tcGxleDY0Jykge1xuICAgIGlmICh4LmR0eXBlID09PSAnY29tcGxleDY0Jykge1xuICAgICAgcmV0dXJuIGlkZW50aXR5KHtpbnB1dHM6IHt4fSwgYmFja2VuZH0pO1xuICAgIH1cblxuICAgIGNvbnN0IHplcm9zVGVuc29ySW5mbyA9IHplcm9zKGJhY2tlbmQsIHguc2hhcGUsIHguZHR5cGUpO1xuICAgIGNvbnN0IGZsb2F0WCA9IGNhc3Qoe2lucHV0czoge3h9LCBiYWNrZW5kLCBhdHRyczoge2R0eXBlOiAnZmxvYXQzMid9fSk7XG5cbiAgICBjb25zdCByZXN1bHQgPVxuICAgICAgICBjb21wbGV4KHtpbnB1dHM6IHtyZWFsOiBmbG9hdFgsIGltYWc6IHplcm9zVGVuc29ySW5mb30sIGJhY2tlbmR9KTtcblxuICAgIGJhY2tlbmQuZGlzcG9zZUludGVybWVkaWF0ZVRlbnNvckluZm8oemVyb3NUZW5zb3JJbmZvKTtcbiAgICBiYWNrZW5kLmRpc3Bvc2VJbnRlcm1lZGlhdGVUZW5zb3JJbmZvKGZsb2F0WCk7XG5cbiAgICByZXR1cm4gcmVzdWx0O1xuICB9XG5cbiAgLy8gQ2FzdGluZyBmcm9tIGNvbXBsZXg2NFxuICBpZiAoeC5kdHlwZSA9PT0gJ2NvbXBsZXg2NCcpIHtcbiAgICBjb25zdCByZWFsUGFydCA9IHJlYWwoe2lucHV0czoge2lucHV0OiB4fSwgYmFja2VuZH0pO1xuICAgIGNvbnN0IHJlc3VsdCA9IGNhc3Qoe2lucHV0czoge3g6IHJlYWxQYXJ0fSwgYmFja2VuZCwgYXR0cnM6IHtkdHlwZX19KTtcblxuICAgIGJhY2tlbmQuZGlzcG9zZUludGVybWVkaWF0ZVRlbnNvckluZm8ocmVhbFBhcnQpO1xuXG4gICAgcmV0dXJuIHJlc3VsdDtcbiAgfVxuXG4gIGlmICghdXRpbC5oYXNFbmNvZGluZ0xvc3MoeC5kdHlwZSwgZHR5cGUpKSB7XG4gICAgLy8gV2UgZG9uJ3QgY2hhbmdlIHRoZSB1bmRlcmx5aW5nIGRhdGEsIHNpbmNlIHdlIGNhc3QgdG8gaGlnaGVyXG4gICAgLy8gcHJlY2lzaW9uLlxuICAgIGNvbnN0IHJlc3VsdCA9IGlkZW50aXR5KHtpbnB1dHM6IHt4fSwgYmFja2VuZH0pO1xuICAgIHJldHVybiB7ZGF0YUlkOiByZXN1bHQuZGF0YUlkLCBzaGFwZTogcmVzdWx0LnNoYXBlLCBkdHlwZX07XG4gIH1cblxuICBjb25zdCB2YWx1ZXMgPSBiYWNrZW5kLmRhdGEuZ2V0KHguZGF0YUlkKS52YWx1ZXMgYXMgVHlwZWRBcnJheTtcbiAgY29uc3QgW3Jlc3VsdFNoYXBlLCByZXN1bHRUeXBlLCByZXN1bHREYXRhXSA9XG4gICAgICBjYXN0SW1wbCh2YWx1ZXMsIHguc2hhcGUsIHguZHR5cGUsIGR0eXBlKTtcbiAgcmV0dXJuIGJhY2tlbmQubWFrZVRlbnNvckluZm8ocmVzdWx0U2hhcGUsIHJlc3VsdFR5cGUsIHJlc3VsdERhdGEpO1xufVxuXG5leHBvcnQgY29uc3QgY2FzdENvbmZpZzogS2VybmVsQ29uZmlnID0ge1xuICBrZXJuZWxOYW1lOiBDYXN0LFxuICBiYWNrZW5kTmFtZTogJ2NwdScsXG4gIGtlcm5lbEZ1bmM6IGNhc3QgYXMge30gYXMgS2VybmVsRnVuY1xufTtcbiJdfQ==","/**\n * @license\n * Copyright 2020 Google LLC. All Rights Reserved.\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n * =============================================================================\n */\nimport { backend_util, util } from '@tensorflow/tfjs-core';\nimport { assertNotComplex } from '../cpu_util';\nimport { cast } from '../kernels/Cast';\nimport { complex } from '../kernels/Complex';\n/**\n * Template that creates a `KernelFunc` for binary ops.\n * @param name Kernel name.\n * @param binaryKernelImpl A `SimpleBinaryKernelImpl` for the kernel.\n * @param binaryKernelComplexImpl Optional. If exists, represents a\n * `ComplexBinaryKernelImpl` for the kernel, will be used when input dtype\n * is `complex64`.\n * @param dtype Optional. If set, the result has this dtype. Otherwise, the\n * result has the same dtype as the first input. This is mainly used in\n * comparison kernels, such as Equal, Less, Greater, etc.\n */\nexport function binaryKernelFunc(name, simpleImpl, complexImpl, dtype) {\n if (complexImpl == null) {\n return ({ inputs, backend }) => {\n const { a, b } = inputs;\n const cpuBackend = backend;\n assertNotComplex([a, b], name);\n const aVals = cpuBackend.data.get(a.dataId).values;\n const bVals = cpuBackend.data.get(b.dataId).values;\n const decodedAVals = a.dtype === 'string' ?\n // tslint:disable-next-line: no-any\n backend_util.fromUint8ToStringArray(aVals) :\n aVals;\n const decodedBVals = a.dtype === 'string' ?\n // tslint:disable-next-line: no-any\n backend_util.fromUint8ToStringArray(bVals) :\n bVals;\n const $dtype = dtype || a.dtype;\n const [resultData, resultShape] = simpleImpl(a.shape, b.shape, decodedAVals, decodedBVals, $dtype);\n return cpuBackend.makeTensorInfo(resultShape, $dtype, resultData);\n };\n }\n return ({ inputs, backend }) => {\n const { a, b } = inputs;\n const cpuBackend = backend;\n if (a.dtype === 'complex64' || b.dtype === 'complex64') {\n const $aComplex = cast({ inputs: { x: a }, backend: cpuBackend, attrs: { dtype: 'complex64' } });\n const $aComplexVals = cpuBackend.data.get($aComplex.dataId);\n const aReal = $aComplexVals.complexTensorInfos.real;\n const aImag = $aComplexVals.complexTensorInfos.imag;\n const aRealVals = cpuBackend.data.get(aReal.dataId).values;\n const aImagVals = cpuBackend.data.get(aImag.dataId).values;\n const $bComplex = cast({ inputs: { x: b }, backend: cpuBackend, attrs: { dtype: 'complex64' } });\n const $bComplexVals = cpuBackend.data.get($bComplex.dataId);\n const bReal = $bComplexVals.complexTensorInfos.real;\n const bImag = $bComplexVals.complexTensorInfos.imag;\n const bRealVals = cpuBackend.data.get(bReal.dataId).values;\n const bImagVals = cpuBackend.data.get(bImag.dataId).values;\n const [resultRealData, resultImagData, resultShape] = complexImpl(a.shape, b.shape, aRealVals, aImagVals, bRealVals, bImagVals);\n const resultReal = cpuBackend.makeTensorInfo(resultShape, 'float32', resultRealData);\n const resultImag = cpuBackend.makeTensorInfo(resultShape, 'float32', resultImagData);\n const result = complex({ inputs: { real: resultReal, imag: resultImag }, backend: cpuBackend });\n cpuBackend.disposeIntermediateTensorInfo($aComplex);\n cpuBackend.disposeIntermediateTensorInfo($bComplex);\n cpuBackend.disposeIntermediateTensorInfo(resultReal);\n cpuBackend.disposeIntermediateTensorInfo(resultImag);\n return result;\n }\n else {\n const aVals = cpuBackend.data.get(a.dataId).values;\n const bVals = cpuBackend.data.get(b.dataId).values;\n const $dtype = dtype || a.dtype;\n const [resultData, resultShape] = simpleImpl(a.shape, b.shape, aVals, bVals, $dtype);\n return cpuBackend.makeTensorInfo(resultShape, $dtype, resultData);\n }\n };\n}\n/**\n * Template that creates the complex type implementation for binary ops.\n * Supports broadcast.\n */\nexport function createComplexBinaryKernelImpl(op) {\n return (aShape, bShape, aRealVals, aImagVals, bRealVals, bImagVals) => {\n const resultShape = backend_util.assertAndGetBroadcastShape(aShape, bShape);\n const resultSize = util.sizeFromShape(resultShape);\n const resultRank = resultShape.length;\n const resultStrides = util.computeStrides(resultShape);\n const resultRealVals = util.getTypedArrayFromDType('float32', resultSize);\n const resultImagVals = util.getTypedArrayFromDType('float32', resultSize);\n const aBroadcastDims = backend_util.getBroadcastDims(aShape, resultShape);\n const bBroadcastDims = backend_util.getBroadcastDims(bShape, resultShape);\n const aVals = backend_util.mergeRealAndImagArrays(aRealVals, aImagVals);\n const bVals = backend_util.mergeRealAndImagArrays(bRealVals, bImagVals);\n const aRank = aShape.length;\n const aStrides = util.computeStrides(aShape);\n const bRank = bShape.length;\n const bStrides = util.computeStrides(bShape);\n if (aBroadcastDims.length + bBroadcastDims.length === 0) {\n for (let i = 0; i < resultRealVals.length; i++) {\n const aIdx = i % aVals.length;\n const bIdx = i % bVals.length;\n const result = op(aVals[aIdx * 2], aVals[aIdx * 2 + 1], bVals[bIdx * 2], bVals[bIdx * 2 + 1]);\n resultRealVals[i] = result.real;\n resultImagVals[i] = result.imag;\n }\n }\n else {\n for (let i = 0; i < resultRealVals.length; i++) {\n const loc = util.indexToLoc(i, resultRank, resultStrides);\n const aLoc = loc.slice(-aRank);\n aBroadcastDims.forEach(d => aLoc[d] = 0);\n const aIndex = util.locToIndex(aLoc, aRank, aStrides);\n const bLoc = loc.slice(-bRank);\n bBroadcastDims.forEach(d => bLoc[d] = 0);\n const bIndex = util.locToIndex(bLoc, bRank, bStrides);\n const opResult = op(aVals[aIndex * 2], aVals[aIndex * 2 + 1], bVals[bIndex * 2], bVals[bIndex * 2 + 1]);\n resultRealVals[i] = opResult.real;\n resultImagVals[i] = opResult.imag;\n }\n }\n return [resultRealVals, resultImagVals, resultShape];\n };\n}\n//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYmluYXJ5X3V0aWxzLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vLi4vdGZqcy1iYWNrZW5kLWNwdS9zcmMvdXRpbHMvYmluYXJ5X3V0aWxzLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBOzs7Ozs7Ozs7Ozs7Ozs7R0FlRztBQUVILE9BQU8sRUFBQyxZQUFZLEVBQWtELElBQUksRUFBQyxNQUFNLHVCQUF1QixDQUFDO0FBR3pHLE9BQU8sRUFBQyxnQkFBZ0IsRUFBQyxNQUFNLGFBQWEsQ0FBQztBQUM3QyxPQUFPLEVBQUMsSUFBSSxFQUFDLE1BQU0saUJBQWlCLENBQUM7QUFDckMsT0FBTyxFQUFDLE9BQU8sRUFBQyxNQUFNLG9CQUFvQixDQUFDO0FBSTNDOzs7Ozs7Ozs7O0dBVUc7QUFDSCxNQUFNLFVBQVUsZ0JBQWdCLENBQzVCLElBQVksRUFBRSxVQUFrQyxFQUNoRCxXQUFxQyxFQUFFLEtBQWdCO0lBQ3pELElBQUksV0FBVyxJQUFJLElBQUksRUFBRTtRQUN2QixPQUFPLENBQUMsRUFBQyxNQUFNLEVBQUUsT0FBTyxFQUFDLEVBQUUsRUFBRTtZQUMzQixNQUFNLEVBQUMsQ0FBQyxFQUFFLENBQUMsRUFBQyxHQUFHLE1BQXNCLENBQUM7WUFDdEMsTUFBTSxVQUFVLEdBQUcsT0FBeUIsQ0FBQztZQUU3QyxnQkFBZ0IsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsRUFBRSxJQUFJLENBQUMsQ0FBQztZQUUvQixNQUFNLEtBQUssR0FBRyxVQUFVLENBQUMsSUFBSSxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsTUFBTSxDQUFDLENBQUMsTUFBb0IsQ0FBQztZQUNqRSxNQUFNLEtBQUssR0FBRyxVQUFVLENBQUMsSUFBSSxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsTUFBTSxDQUFDLENBQUMsTUFBb0IsQ0FBQztZQUVqRSxNQUFNLFlBQVksR0FBRyxDQUFDLENBQUMsS0FBSyxLQUFLLFFBQVEsQ0FBQyxD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QUFLLENBQUMsQ0FBQztnQkFDL0IsY0FBYyxDQUFDLE9BQU8sQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQztnQkFDekMsTUFBTSxNQUFNLEdBQUcsSUFBSSxDQUFDLFVBQVUsQ0FBQyxJQUFJLEVBQUUsS0FBSyxFQUFFLFFBQVEsQ0FBQyxDQUFDO2dCQUV0RCxNQUFNLElBQUksR0FBRyxHQUFHLENBQUMsS0FBSyxDQUFDLENBQUMsS0FBSyxDQUFDLENBQUM7Z0JBQy9CLGNBQWMsQ0FBQyxPQUFPLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUM7Z0JBQ3pDLE1BQU0sTUFBTSxHQUFHLElBQUksQ0FBQyxVQUFVLENBQUMsSUFBSSxFQUFFLEtBQUssRUFBRSxRQUFRLENBQUMsQ0FBQztnQkFFdEQsTUFBTSxRQUFRLEdBQ1YsRUFBRSxDQUFDLEtBQUssQ0FBQyxNQUFNLEdBQUcsQ0FBQyxDQUFDLEVBQUUsS0FBSyxDQUFDLE1BQU0sR0FBRyxDQUFDLEdBQUcsQ0FBQyxDQUFDLEVBQUUsS0FBSyxDQUFDLE1BQU0sR0FBRyxDQUFDLENBQUMsRUFDM0QsS0FBSyxDQUFDLE1BQU0sR0FBRyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQztnQkFFOUIsY0FBYyxDQUFDLENBQUMsQ0FBQyxHQUFHLFFBQVEsQ0FBQyxJQUFJLENBQUM7Z0JBQ2xDLGNBQWMsQ0FBQyxDQUFDLENBQUMsR0FBRyxRQUFRLENBQUMsSUFBSSxDQUFDO2FBQ25DO1NBQ0Y7UUFDRCxPQUFPLENBQUMsY0FBYyxFQUFFLGNBQWMsRUFBRSxXQUFXLENBQUMsQ0FBQztJQUN2RCxDQUFDLENBQUM7QUFDSixDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiLyoqXG4gKiBAbGljZW5zZVxuICogQ29weXJpZ2h0IDIwMjAgR29vZ2xlIExMQy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC5cbiAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSBcIkxpY2Vuc2VcIik7XG4gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuXG4gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXRcbiAqXG4gKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjBcbiAqXG4gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlXG4gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiBcIkFTIElTXCIgQkFTSVMsXG4gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC5cbiAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmRcbiAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLlxuICogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbiAqL1xuXG5pbXBvcnQge2JhY2tlbmRfdXRpbCwgQmluYXJ5SW5wdXRzLCBEYXRhVHlwZSwgS2VybmVsRnVuYywgVHlwZWRBcnJheSwgdXRpbH0gZnJvbSAnQHRlbnNvcmZsb3cvdGZqcy1jb3JlJztcblxuaW1wb3J0IHtNYXRoQmFja2VuZENQVX0gZnJvbSAnLi4vYmFja2VuZF9jcHUnO1xuaW1wb3J0IHthc3NlcnROb3RDb21wbGV4fSBmcm9tICcuLi9jcHVfdXRpbCc7XG5pbXBvcnQge2Nhc3R9IGZyb20gJy4uL2tlcm5lbHMvQ2FzdCc7XG5pbXBvcnQge2NvbXBsZXh9IGZyb20gJy4uL2tlcm5lbHMvQ29tcGxleCc7XG5cbmltcG9ydCB7Q29tcGxleEJpbmFyeUtlcm5lbEltcGwsIENvbXBsZXhCaW5hcnlPcGVyYXRpb24sIFNpbXBsZUJpbmFyeUtlcm5lbEltcGx9IGZyb20gJy4vYmluYXJ5X3R5cGVzJztcblxuLyoqXG4gKiBUZW1wbGF0ZSB0aGF0IGNyZWF0ZXMgYSBgS2VybmVsRnVuY2AgZm9yIGJpbmFyeSBvcHMuXG4gKiBAcGFyYW0gbmFtZSBLZXJuZWwgbmFtZS5cbiAqIEBwYXJhbSBiaW5hcnlLZXJuZWxJbXBsIEEgYFNpbXBsZUJpbmFyeUtlcm5lbEltcGxgIGZvciB0aGUga2VybmVsLlxuICogQHBhcmFtIGJpbmFyeUtlcm5lbENvbXBsZXhJbXBsIE9wdGlvbmFsLiBJZiBleGlzdHMsIHJlcHJlc2VudHMgYVxuICogICAgIGBDb21wbGV4QmluYXJ5S2VybmVsSW1wbGAgZm9yIHRoZSBrZXJuZWwsIHdpbGwgYmUgdXNlZCB3aGVuIGlucHV0IGR0eXBlXG4gKiAgICAgaXMgYGNvbXBsZXg2NGAuXG4gKiBAcGFyYW0gZHR5cGUgT3B0aW9uYWwuIElmIHNldCwgdGhlIHJlc3VsdCBoYXMgdGhpcyBkdHlwZS4gT3RoZXJ3aXNlLCB0aGVcbiAqICAgICByZXN1bHQgaGFzIHRoZSBzYW1lIGR0eXBlIGFzIHRoZSBmaXJzdCBpbnB1dC4gVGhpcyBpcyBtYWlubHkgdXNlZCBpblxuICogICAgIGNvbXBhcmlzb24ga2VybmVscywgc3VjaCBhcyBFcXVhbCwgTGVzcywgR3JlYXRlciwgZXRjLlxuICovXG5leHBvcnQgZnVuY3Rpb24gYmluYXJ5S2VybmVsRnVuYyhcbiAgICBuYW1lOiBzdHJpbmcsIHNpbXBsZUltcGw6IFNpbXBsZUJpbmFyeUtlcm5lbEltcGwsXG4gICAgY29tcGxleEltcGw/OiBDb21wbGV4QmluYXJ5S2VybmVsSW1wbCwgZHR5cGU/OiBEYXRhVHlwZSk6IEtlcm5lbEZ1bmMge1xuICBpZiAoY29tcGxleEltcGwgPT0gbnVsbCkge1xuICAgIHJldHVybiAoe2lucHV0cywgYmFja2VuZH0pID0+IHtcbiAgICAgIGNvbnN0IHthLCBifSA9IGlucHV0cyBhcyBCaW5hcnlJbnB1dHM7XG4gICAgICBjb25zdCBjcHVCYWNrZW5kID0gYmFja2VuZCBhcyBNYXRoQmFja2VuZENQVTtcblxuICAgICAgYXNzZXJ0Tm90Q29tcGxleChbYSwgYl0sIG5hbWUpO1xuXG4gICAgICBjb25zdCBhVmFscyA9IGNwdUJhY2tlbmQuZGF0YS5nZXQoYS5kYXRhSWQpLnZhbHVlcyBhcyBUeXBlZEFycmF5O1xuICAgICAgY29uc3QgYlZhbHMgPSBjcHVCYWNrZW5kLmRhdGEuZ2V0KGIuZGF0YUlkKS52YWx1ZXMgYXMgVHlwZWRBcnJheTtcblxuICAgICAgY29uc3QgZGVjb2RlZEFWYWxzID0gYS5kdHlwZSA9PT0gJ3N0cmluZycgP1xuICAgICAgICAgIC8vIHRzbGludDpkaXNhYmxlLW5leHQtbGluZTogbm8tYW55XG4gICAgICAgICAgYmFja2VuZF91dGlsLmZyb21VaW50OFRvU3RyaW5nQXJyYXkoYVZhbHMgYXMgYW55IGFzIFVpbnQ4QXJyYXlbXSkgOlxuICAgICAgICAgIGFWYWxzO1xuICAgICAgY29uc3QgZGVjb2RlZEJWYWxzID0gYS5kdHlwZSA9PT0gJ3N0cmluZycgP1xuICAgICAgICAgIC8vIHRzbGludDpkaXNhYmxlLW5leHQtbGluZTogbm8tYW55XG4gICAgICAgICAgYmFja2VuZF91dGlsLmZyb21VaW50OFRvU3RyaW5nQXJyYXkoYlZhbHMgYXMgYW55IGFzIFVpbnQ4QXJyYXlbXSkgOlxuICAgICAgICAgIGJWYWxzO1xuICAgICAgY29uc3QgJGR0eXBlID0gZHR5cGUgfHwgYS5kdHlwZTtcblxuICAgICAgY29uc3QgW3Jlc3VsdERhdGEsIHJlc3VsdFNoYXBlXSA9XG4gICAgICAgICAgc2ltcGxlSW1wbChhLnNoYXBlLCBiLnNoYXBlLCBkZWNvZGVkQVZhbHMsIGRlY29kZWRCVmFscywgJGR0eXBlKTtcblxuICAgICAgcmV0dXJuIGNwdUJhY2tlbmQubWFrZVRlbnNvckluZm8ocmVzdWx0U2hhcGUsICRkdHlwZSwgcmVzdWx0RGF0YSk7XG4gICAgfTtcbiAgfVxuXG4gIHJldHVybiAoe2lucHV0cywgYmFja2VuZH0pID0+IHtcbiAgICBjb25zdCB7YSwgYn0gPSBpbnB1dHMgYXMgQmluYXJ5SW5wdXRzO1xuICAgIGNvbnN0IGNwdUJhY2tlbmQgPSBiYWNrZW5kIGFzIE1hdGhCYWNrZW5kQ1BVO1xuXG4gICAgaWYgKGEuZHR5cGUgPT09ICdjb21wbGV4NjQnIHx8IGIuZHR5cGUgPT09ICdjb21wbGV4NjQnKSB7XG4gICAgICBjb25zdCAkYUNvbXBsZXggPSBjYXN0KFxuICAgICAgICAgIHtpbnB1dHM6IHt4OiBhfSwgYmFja2VuZDogY3B1QmFja2VuZCwgYXR0cnM6IHtkdHlwZTogJ2NvbXBsZXg2NCd9fSk7XG5cbiAgICAgIGNvbnN0ICRhQ29tcGxleFZhbHMgPSBjcHVCYWNrZW5kLmRhdGEuZ2V0KCRhQ29tcGxleC5kYXRhSWQpO1xuXG4gICAgICBjb25zdCBhUmVhbCA9ICRhQ29tcGxleFZhbHMuY29tcGxleFRlbnNvckluZm9zLnJlYWw7XG4gICAgICBjb25zdCBhSW1hZyA9ICRhQ29tcGxleFZhbHMuY29tcGxleFRlbnNvckluZm9zLmltYWc7XG5cbiAgICAgIGNvbnN0IGFSZWFsVmFscyA9XG4gICAgICAgICAgY3B1QmFja2VuZC5kYXRhLmdldChhUmVhbC5kYXRhSWQpLnZhbHVlcyBhcyBGbG9hdDMyQXJyYXk7XG4gICAgICBjb25zdCBhSW1hZ1ZhbHMgPVxuICAgICAgICAgIGNwdUJhY2tlbmQuZGF0YS5nZXQoYUltYWcuZGF0YUlkKS52YWx1ZXMgYXMgRmxvYXQzMkFycmF5O1xuXG4gICAgICBjb25zdCAkYkNvbXBsZXggPSBjYXN0KFxuICAgICAgICAgIHtpbnB1dHM6IHt4OiBifSwgYmFja2VuZDogY3B1QmFja2VuZCwgYXR0cnM6IHtkdHlwZTogJ2NvbXBsZXg2NCd9fSk7XG5cbiAgICAgIGNvbnN0ICRiQ29tcGxleFZhbHMgPSBjcHVCYWNrZW5kLmRhdGEuZ2V0KCRiQ29tcGxleC5kYXRhSWQpO1xuXG4gICAgICBjb25zdCBiUmVhbCA9ICRiQ29tcGxleFZhbHMuY29tcGxleFRlbnNvckluZm9zLnJlYWw7XG4gICAgICBjb25zdCBiSW1hZyA9ICRiQ29tcGxleFZhbHMuY29tcGxleFRlbnNvckluZm9zLmltYWc7XG5cbiAgICAgIGNvbnN0IGJSZWFsVmFscyA9XG4gICAgICAgICAgY3B1QmFja2VuZC5kYXRhLmdldChiUmVhbC5kYXRhSWQpLnZhbHVlcyBhcyBGbG9hdDMyQXJyYXk7XG4gICAgICBjb25zdCBiSW1hZ1ZhbHMgPVxuICAgICAgICAgIGNwdUJhY2tlbmQuZGF0YS5nZXQoYkltYWcuZGF0YUlkKS52YWx1ZXMgYXMgRmxvYXQzMkFycmF5O1xuXG4gICAgICBjb25zdCBbcmVzdWx0UmVhbERhdGEsIHJlc3VsdEltYWdEYXRhLCByZXN1bHRTaGFwZV0gPSBjb21wbGV4SW1wbChcbiAgICAgICAgICBhLnNoYXBlLCBiLnNoYXBlLCBhUmVhbFZhbHMsIGFJbWFnVmFscywgYlJlYWxWYWxzLCBiSW1hZ1ZhbHMpO1xuXG4gICAgICBjb25zdCByZXN1bHRSZWFsID1cbiAgICAgICAgICBjcHVCYWNrZW5kLm1ha2VUZW5zb3JJbmZvKHJlc3VsdFNoYXBlLCAnZmxvYXQzMicsIHJlc3VsdFJlYWxEYXRhKTtcblxuICAgICAgY29uc3QgcmVzdWx0SW1hZyA9XG4gICAgICAgICAgY3B1QmFja2VuZC5tYWtlVGVuc29ySW5mbyhyZXN1bHRTaGFwZSwgJ2Zsb2F0MzInLCByZXN1bHRJbWFnRGF0YSk7XG5cbiAgICAgIGNvbnN0IHJlc3VsdCA9IGNvbXBsZXgoXG4gICAgICAgICAge2lucHV0czoge3JlYWw6IHJlc3VsdFJlYWwsIGltYWc6IHJlc3VsdEltYWd9LCBiYWNrZW5kOiBjcHVCYWNrZW5kfSk7XG5cbiAgICAgIGNwdUJhY2tlbmQuZGlzcG9zZUludGVybWVkaWF0ZVRlbnNvckluZm8oJGFDb21wbGV4KTtcbiAgICAgIGNwdUJhY2tlbmQuZGlzcG9zZUludGVybWVkaWF0ZVRlbnNvckluZm8oJGJDb21wbGV4KTtcbiAgICAgIGNwdUJhY2tlbmQuZGlzcG9zZUludGVybWVkaWF0ZVRlbnNvckluZm8ocmVzdWx0UmVhbCk7XG4gICAgICBjcHVCYWNrZW5kLmRpc3Bvc2VJbnRlcm1lZGlhdGVUZW5zb3JJbmZvKHJlc3VsdEltYWcpO1xuXG4gICAgICByZXR1cm4gcmVzdWx0O1xuICAgIH0gZWxzZSB7XG4gICAgICBjb25zdCBhVmFscyA9IGNwdUJhY2tlbmQuZGF0YS5nZXQoYS5kYXRhSWQpLnZhbHVlcyBhcyBUeXBlZEFycmF5O1xuICAgICAgY29uc3QgYlZhbHMgPSBjcHVCYWNrZW5kLmRhdGEuZ2V0KGIuZGF0YUlkKS52YWx1ZXMgYXMgVHlwZWRBcnJheTtcblxuICAgICAgY29uc3QgJGR0eXBlID0gZHR5cGUgfHwgYS5kdHlwZTtcblxuICAgICAgY29uc3QgW3Jlc3VsdERhdGEsIHJlc3VsdFNoYXBlXSA9XG4gICAgICAgICAgc2ltcGxlSW1wbChhLnNoYXBlLCBiLnNoYXBlLCBhVmFscywgYlZhbHMsICRkdHlwZSk7XG5cbiAgICAgIHJldHVybiBjcHVCYWNrZW5kLm1ha2VUZW5zb3JJbmZvKHJlc3VsdFNoYXBlLCAkZHR5cGUsIHJlc3VsdERhdGEpO1xuICAgIH1cbiAgfTtcbn1cblxuLyoqXG4gKiBUZW1wbGF0ZSB0aGF0IGNyZWF0ZXMgdGhlIGNvbXBsZXggdHlwZSBpbXBsZW1lbnRhdGlvbiBmb3IgYmluYXJ5IG9wcy5cbiAqIFN1cHBvcnRzIGJyb2FkY2FzdC5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGNyZWF0ZUNvbXBsZXhCaW5hcnlLZXJuZWxJbXBsKG9wOiBDb21wbGV4QmluYXJ5T3BlcmF0aW9uKTpcbiAgICBDb21wbGV4QmluYXJ5S2VybmVsSW1wbCB7XG4gIHJldHVybiAoYVNoYXBlOiBudW1iZXJbXSwgYlNoYXBlOiBudW1iZXJbXSwgYVJlYWxWYWxzOiBGbG9hdDMyQXJyYXksXG4gICAgICAgICAgYUltYWdWYWxzOiBGbG9hdDMyQXJyYXksIGJSZWFsVmFsczogRmxvYXQzMkFycmF5LFxuICAgICAgICAgIGJJbWFnVmFsczogRmxvYXQzMkFycmF5KTogW1R5cGVkQXJyYXksIFR5cGVkQXJyYXksIG51bWJlcltdXSA9PiB7XG4gICAgY29uc3QgcmVzdWx0U2hhcGUgPSBiYWNrZW5kX3V0aWwuYXNzZXJ0QW5kR2V0QnJvYWRjYXN0U2hhcGUoYVNoYXBlLCBiU2hhcGUpO1xuICAgIGNvbnN0IHJlc3VsdFNpemUgPSB1dGlsLnNpemVGcm9tU2hhcGUocmVzdWx0U2hhcGUpO1xuICAgIGNvbnN0IHJlc3VsdFJhbmsgPSByZXN1bHRTaGFwZS5sZW5ndGg7XG4gICAgY29uc3QgcmVzdWx0U3RyaWRlcyA9IHV0aWwuY29tcHV0ZVN0cmlkZXMocmVzdWx0U2hhcGUpO1xuXG4gICAgY29uc3QgcmVzdWx0UmVhbFZhbHMgPSB1dGlsLmdldFR5cGVkQXJyYXlGcm9tRFR5cGUoJ2Zsb2F0MzInLCByZXN1bHRTaXplKTtcbiAgICBjb25zdCByZXN1bHRJbWFnVmFscyA9IHV0aWwuZ2V0VHlwZWRBcnJheUZyb21EVHlwZSgnZmxvYXQzMicsIHJlc3VsdFNpemUpO1xuXG4gICAgY29uc3QgYUJyb2FkY2FzdERpbXMgPSBiYWNrZW5kX3V0aWwuZ2V0QnJvYWRjYXN0RGltcyhhU2hhcGUsIHJlc3VsdFNoYXBlKTtcbiAgICBjb25zdCBiQnJvYWRjYXN0RGltcyA9IGJhY2tlbmRfdXRpbC5nZXRCcm9hZGNhc3REaW1zKGJTaGFwZSwgcmVzdWx0U2hhcGUpO1xuXG4gICAgY29uc3QgYVZhbHMgPSBiYWNrZW5kX3V0aWwubWVyZ2VSZWFsQW5kSW1hZ0FycmF5cyhhUmVhbFZhbHMsIGFJbWFnVmFscyk7XG4gICAgY29uc3QgYlZhbHMgPSBiYWNrZW5kX3V0aWwubWVyZ2VSZWFsQW5kSW1hZ0FycmF5cyhiUmVhbFZhbHMsIGJJbWFnVmFscyk7XG5cbiAgICBjb25zdCBhUmFuayA9IGFTaGFwZS5sZW5ndGg7XG4gICAgY29uc3QgYVN0cmlkZXMgPSB1dGlsLmNvbXB1dGVTdHJpZGVzKGFTaGFwZSk7XG5cbiAgICBjb25zdCBiUmFuayA9IGJTaGFwZS5sZW5ndGg7XG4gICAgY29uc3QgYlN0cmlkZXMgPSB1dGlsLmNvbXB1dGVTdHJpZGVzKGJTaGFwZSk7XG5cbiAgICBpZiAoYUJyb2FkY2FzdERpbXMubGVuZ3RoICsgYkJyb2FkY2FzdERpbXMubGVuZ3RoID09PSAwKSB7XG4gICAgICBmb3IgKGxldCBpID0gMDsgaSA8IHJlc3VsdFJlYWxWYWxzLmxlbmd0aDsgaSsrKSB7XG4gICAgICAgIGNvbnN0IGFJZHggPSBpICUgYVZhbHMubGVuZ3RoO1xuICAgICAgICBjb25zdCBiSWR4ID0gaSAlIGJWYWxzLmxlbmd0aDtcblxuICAgICAgICBjb25zdCByZXN1bHQgPVxuICAgICAgICAgICAgb3AoYVZhbHNbYUlkeCAqIDJdLCBhVmFsc1thSWR4ICogMiArIDFdLCBiVmFsc1tiSWR4ICogMl0sXG4gICAgICAgICAgICAgICBiVmFsc1tiSWR4ICogMiArIDFdKTtcblxuICAgICAgICByZXN1bHRSZWFsVmFsc1tpXSA9IHJlc3VsdC5yZWFsO1xuICAgICAgICByZXN1bHRJbWFnVmFsc1tpXSA9IHJlc3VsdC5pbWFnO1xuICAgICAgfVxuICAgIH0gZWxzZSB7XG4gICAgICBmb3IgKGxldCBpID0gMDsgaSA8IHJlc3VsdFJlYWxWYWxzLmxlbmd0aDsgaSsrKSB7XG4gICAgICAgIGNvbnN0IGxvYyA9IHV0aWwuaW5kZXhUb0xvYyhpLCByZXN1bHRSYW5rLCByZXN1bHRTdHJpZGVzKTtcblxuICAgICAgICBjb25zdCBhTG9jID0gbG9jLnNsaWNlKC1hUmFuayk7XG4gICAgICAgIGFCcm9hZGNhc3REaW1zLmZvckVhY2goZCA9PiBhTG9jW2RdID0gMCk7XG4gICAgICAgIGNvbnN0IGFJbmRleCA9IHV0aWwubG9jVG9JbmRleChhTG9jLCBhUmFuaywgYVN0cmlkZXMpO1xuXG4gICAgICAgIGNvbnN0IGJMb2MgPSBsb2Muc2xpY2UoLWJSYW5rKTtcbiAgICAgICAgYkJyb2FkY2FzdERpbXMuZm9yRWFjaChkID0+IGJMb2NbZF0gPSAwKTtcbiAgICAgICAgY29uc3QgYkluZGV4ID0gdXRpbC5sb2NUb0luZGV4KGJMb2MsIGJSYW5rLCBiU3RyaWRlcyk7XG5cbiAgICAgICAgY29uc3Qgb3BSZXN1bHQgPVxuICAgICAgICAgICAgb3AoYVZhbHNbYUluZGV4ICogMl0sIGFWYWxzW2FJbmRleCAqIDIgKyAxXSwgYlZhbHNbYkluZGV4ICogMl0sXG4gICAgICAgICAgICAgICBiVmFsc1tiSW5kZXggKiAyICsgMV0pO1xuXG4gICAgICAgIHJlc3VsdFJlYWxWYWxzW2ldID0gb3BSZXN1bHQucmVhbDtcbiAgICAgICAgcmVzdWx0SW1hZ1ZhbHNbaV0gPSBvcFJlc3VsdC5pbWFnO1xuICAgICAgfVxuICAgIH1cbiAgICByZXR1cm4gW3Jlc3VsdFJlYWxWYWxzLCByZXN1bHRJbWFnVmFscywgcmVzdWx0U2hhcGVdO1xuICB9O1xufVxuIl19","/**\n * @license\n * Copyright 2020 Google LLC. All Rights Reserved.\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n * =============================================================================\n */\nimport { Add } from '@tensorflow/tfjs-core';\nimport { createSimpleBinaryKernelImpl } from '../utils/binary_impl';\nimport { binaryKernelFunc, createComplexBinaryKernelImpl } from '../utils/binary_utils';\nexport const addImpl = createSimpleBinaryKernelImpl(((a, b) => a + b));\nexport const addComplexImpl = createComplexBinaryKernelImpl(((aReal, aImag, bReal, bImag) => {\n return { real: aReal + bReal, imag: aImag + bImag };\n}));\nexport const add = binaryKernelFunc(Add, addImpl, addComplexImpl);\nexport const addConfig = {\n kernelName: Add,\n backendName: 'cpu',\n kernelFunc: add\n};\n//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiQWRkLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vLi4vdGZqcy1iYWNrZW5kLWNwdS9zcmMva2VybmVscy9BZGQudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUE7Ozs7Ozs7Ozs7Ozs7OztHQWVHO0FBRUgsT0FBTyxFQUFDLEdBQUcsRUFBZSxNQUFNLHVCQUF1QixDQUFDO0FBRXhELE9BQU8sRUFBQyw0QkFBNEIsRUFBQyxNQUFNLHNCQUFzQixDQUFDO0FBQ2xFLE9BQU8sRUFBQyxnQkFBZ0IsRUFBRSw2QkFBNkIsRUFBQyxNQUFNLHVCQUF1QixDQUFDO0FBRXRGLE1BQU0sQ0FBQyxNQUFNLE9BQU8sR0FDaEIsNEJBQTRCLENBQUMsQ0FBQyxDQUFDLENBQVMsRUFBRSxDQUFTLEVBQUUsRUFBRSxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDO0FBQ3BFLE1BQU0sQ0FBQyxNQUFNLGNBQWMsR0FDdkIsNkJBQTZCLENBQUMsQ0FBQyxDQUFDLEtBQUssRUFBRSxLQUFLLEVBQUUsS0FBSyxFQUFFLEtBQUssRUFBRSxFQUFFO0lBQzVELE9BQU8sRUFBQyxJQUFJLEVBQUUsS0FBSyxHQUFHLEtBQUssRUFBRSxJQUFJLEVBQUUsS0FBSyxHQUFHLEtBQUssRUFBQyxDQUFDO0FBQ3BELENBQUMsQ0FBQyxDQUFDLENBQUM7QUFFUixNQUFNLENBQUMsTUFBTSxHQUFHLEdBQUcsZ0JBQWdCLENBQUMsR0FBRyxFQUFFLE9BQU8sRUFBRSxjQUFjLENBQUMsQ0FBQztBQUVsRSxNQUFNLENBQUMsTUFBTSxTQUFTLEdBQWlCO0lBQ3JDLFVBQVUsRUFBRSxHQUFHO0lBQ2YsV0FBVyxFQUFFLEtBQUs7SUFDbEIsVUFBVSxFQUFFLEdBQUc7Q0FDaEIsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbIi8qKlxuICogQGxpY2Vuc2VcbiAqIENvcHlyaWdodCAyMDIwIEdvb2dsZSBMTEMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuXG4gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgXCJMaWNlbnNlXCIpO1xuICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLlxuICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0XG4gKlxuICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wXG4gKlxuICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZVxuICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gXCJBUyBJU1wiIEJBU0lTLFxuICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuXG4gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kXG4gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS5cbiAqID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4gKi9cblxuaW1wb3J0IHtBZGQsIEtlcm5lbENvbmZpZ30gZnJvbSAnQHRlbnNvcmZsb3cvdGZqcy1jb3JlJztcblxuaW1wb3J0IHtjcmVhdGVTaW1wbGVCaW5hcnlLZXJuZWxJbXBsfSBmcm9tICcuLi91dGlscy9iaW5hcnlfaW1wbCc7XG5pbXBvcnQge2JpbmFyeUtlcm5lbEZ1bmMsIGNyZWF0ZUNvbXBsZXhCaW5hcnlLZXJuZWxJbXBsfSBmcm9tICcuLi91dGlscy9iaW5hcnlfdXRpbHMnO1xuXG5leHBvcnQgY29uc3QgYWRkSW1wbCA9XG4gICAgY3JlYXRlU2ltcGxlQmluYXJ5S2VybmVsSW1wbCgoKGE6IG51bWJlciwgYjogbnVtYmVyKSA9PiBhICsgYikpO1xuZXhwb3J0IGNvbnN0IGFkZENvbXBsZXhJbXBsID1cbiAgICBjcmVhdGVDb21wbGV4QmluYXJ5S2VybmVsSW1wbCgoKGFSZWFsLCBhSW1hZywgYlJlYWwsIGJJbWFnKSA9PiB7XG4gICAgICByZXR1cm4ge3JlYWw6IGFSZWFsICsgYlJlYWwsIGltYWc6IGFJbWFnICsgYkltYWd9O1xuICAgIH0pKTtcblxuZXhwb3J0IGNvbnN0IGFkZCA9IGJpbmFyeUtlcm5lbEZ1bmMoQWRkLCBhZGRJbXBsLCBhZGRDb21wbGV4SW1wbCk7XG5cbmV4cG9ydCBjb25zdCBhZGRDb25maWc6IEtlcm5lbENvbmZpZyA9IHtcbiAga2VybmVsTmFtZTogQWRkLFxuICBiYWNrZW5kTmFtZTogJ2NwdScsXG4gIGtlcm5lbEZ1bmM6IGFkZFxufTtcbiJdfQ==","/**\n * @license\n * Copyright 2020 Google LLC. All Rights Reserved.\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n * =============================================================================\n */\nimport { Reshape, util } from '@tensorflow/tfjs-core';\nexport function reshape(args) {\n const { inputs, backend, attrs } = args;\n const { x } = inputs;\n const { shape } = attrs;\n const xSize = util.sizeFromShape(x.shape);\n const $shape = util.inferFromImplicitShape(shape, xSize);\n const $xSize = util.sizeFromShape($shape);\n util.assert(xSize === $xSize, () => `The new shape (${$shape}) has ${$xSize} elements and the old ` +\n `shape (${x.shape}) has ${xSize} elements. The new shape and old ` +\n `shape must have the same number of elements.`);\n backend.incRef(x.dataId);\n const xData = backend.data.get(x.dataId);\n if (xData.complexTensorInfos != null) {\n const real = xData.complexTensorInfos.real;\n const imag = xData.complexTensorInfos.imag;\n real.shape = $shape;\n imag.shape = $shape;\n }\n return { dataId: x.dataId, shape: $shape, dtype: x.dtype };\n}\nexport const reshapeConfig = {\n kernelName: Reshape,\n backendName: 'cpu',\n kernelFunc: reshape\n};\n//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiUmVzaGFwZS5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uLy4uL3RmanMtYmFja2VuZC1jcHUvc3JjL2tlcm5lbHMvUmVzaGFwZS50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQTs7Ozs7Ozs7Ozs7Ozs7O0dBZUc7QUFFSCxPQUFPLEVBQTJCLE9BQU8sRUFBMkMsSUFBSSxFQUFDLE1BQU0sdUJBQXVCLENBQUM7QUFJdkgsTUFBTSxVQUFVLE9BQU8sQ0FDbkIsSUFDeUU7SUFFM0UsTUFBTSxFQUFDLE1BQU0sRUFBRSxPQUFPLEVBQUUsS0FBSyxFQUFDLEdBQUcsSUFBSSxDQUFDO0lBQ3RDLE1BQU0sRUFBQyxDQUFDLEVBQUMsR0FBRyxNQUFNLENBQUM7SUFDbkIsTUFBTSxFQUFDLEtBQUssRUFBQyxHQUFHLEtBQUssQ0FBQztJQUV0QixNQUFNLEtBQUssR0FBRyxJQUFJLENBQUMsYUFBYSxDQUFDLENBQUMsQ0FBQyxLQUFLLENBQUMsQ0FBQztJQUMxQyxNQUFNLE1BQU0sR0FBRyxJQUFJLENBQUMsc0JBQXNCLENBQUMsS0FBSyxFQUFFLEtBQUssQ0FBQyxDQUFDO0lBQ3pELE1BQU0sTUFBTSxHQUFHLElBQUksQ0FBQyxhQUFhLENBQUMsTUFBTSxDQUFDLENBQUM7SUFFMUMsSUFBSSxDQUFDLE1BQU0sQ0FDUCxLQUFLLEtBQUssTUFBTSxFQUNoQixHQUFHLEVBQUUsQ0FBQyxrQkFBa0IsTUFBTSxTQUFTLE1BQU0sd0JBQXdCO1FBQ2pFLFVBQVUsQ0FBQyxDQUFDLEtBQUssU0FBUyxLQUFLLG1DQUFtQztRQUNsRSw4Q0FBOEMsQ0FBQyxDQUFDO0lBRXhELE9BQU8sQ0FBQyxNQUFNLENBQUMsQ0FBQyxDQUFDLE1BQU0sQ0FBQyxDQUFDO0lBRXpCLE1BQU0sS0FBSyxHQUFHLE9BQU8sQ0FBQyxJQUFJLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxNQUFNLENBQUMsQ0FBQztJQUV6QyxJQUFJLEtBQUssQ0FBQyxrQkFBa0IsSUFBSSxJQUFJLEVBQUU7UUFDcEMsTUFBTSxJQUFJLEdBQUcsS0FBSyxDQUFDLGtCQUFrQixDQUFDLElBQUksQ0FBQztRQUMzQyxNQUFNLElBQUksR0FBRyxLQUFLLENBQUMsa0JBQWtCLENBQUMsSUFBSSxDQUFDO1FBRTNDLElBQUksQ0FBQyxLQUFLLEdBQUcsTUFBTSxDQUFDO1FBQ3BCLElBQUksQ0FBQyxLQUFLLEdBQUcsTUFBTSxDQUFDO0tBQ3JCO0lBRUQsT0FBTyxFQUFDLE1BQU0sRUFBRSxDQUFDLENBQUMsTUFBTSxFQUFFLEtBQUssRUFBRSxNQUFNLEVBQUUsS0FBSyxFQUFFLENBQUMsQ0FBQyxLQUFLLEVBQUMsQ0FBQztBQUMzRCxDQUFDO0FBRUQsTUFBTSxDQUFDLE1BQU0sYUFBYSxHQUFpQjtJQUN6QyxVQUFVLEVBQUUsT0FBTztJQUNuQixXQUFXLEVBQUUsS0FBSztJQUNsQixVQUFVLEVBQUUsT0FBMkI7Q0FDeEMsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbIi8qKlxuICogQGxpY2Vuc2VcbiAqIENvcHlyaWdodCAyMDIwIEdvb2dsZSBMTEMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuXG4gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgXCJMaWNlbnNlXCIpO1xuICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLlxuICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0XG4gKlxuICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wXG4gKlxuICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZVxuICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gXCJBUyBJU1wiIEJBU0lTLFxuICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuXG4gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kXG4gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS5cbiAqID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4gKi9cblxuaW1wb3J0IHtLZXJuZWxDb25maWcsIEtlcm5lbEZ1bmMsIFJlc2hhcGUsIFJlc2hhcGVBdHRycywgUmVzaGFwZUlucHV0cywgVGVuc29ySW5mbywgdXRpbH0gZnJvbSAnQHRlbnNvcmZsb3cvdGZqcy1jb3JlJztcblxuaW1wb3J0IHtNYXRoQmFja2VuZENQVX0gZnJvbSAnLi4vYmFja2VuZF9jcHUnO1xuXG5leHBvcnQgZnVuY3Rpb24gcmVzaGFwZShcbiAgICBhcmdzOlxuICAgICAgICB7aW5wdXRzOiBSZXNoYXBlSW5wdXRzLCBiYWNrZW5kOiBNYXRoQmFja2VuZENQVSwgYXR0cnM6IFJlc2hhcGVBdHRyc30pOlxuICAgIFRlbnNvckluZm8ge1xuICBjb25zdCB7aW5wdXRzLCBiYWNrZW5kLCBhdHRyc30gPSBhcmdzO1xuICBjb25zdCB7eH0gPSBpbnB1dHM7XG4gIGNvbnN0IHtzaGFwZX0gPSBhdHRycztcblxuICBjb25zdCB4U2l6ZSA9IHV0aWwuc2l6ZUZyb21TaGFwZSh4LnNoYXBlKTtcbiAgY29uc3QgJHNoYXBlID0gdXRpbC5pbmZlckZyb21JbXBsaWNpdFNoYXBlKHNoYXBlLCB4U2l6ZSk7XG4gIGNvbnN0ICR4U2l6ZSA9IHV0aWwuc2l6ZUZyb21TaGFwZSgkc2hhcGUpO1xuXG4gIHV0aWwuYXNzZXJ0KFxuICAgICAgeFNpemUgPT09ICR4U2l6ZSxcbiAgICAgICgpID0+IGBUaGUgbmV3IHNoYXBlICgkeyRzaGFwZX0pIGhhcyAkeyR4U2l6ZX0gZWxlbWVudHMgYW5kIHRoZSBvbGQgYCArXG4gICAgICAgICAgYHNoYXBlICgke3guc2hhcGV9KSBoYXMgJHt4U2l6ZX0gZWxlbWVudHMuIFRoZSBuZXcgc2hhcGUgYW5kIG9sZCBgICtcbiAgICAgICAgICBgc2hhcGUgbXVzdCBoYXZlIHRoZSBzYW1lIG51bWJlciBvZiBlbGVtZW50cy5gKTtcblxuICBiYWNrZW5kLmluY1JlZih4LmRhdGFJZCk7XG5cbiAgY29uc3QgeERhdGEgPSBiYWNrZW5kLmRhdGEuZ2V0KHguZGF0YUlkKTtcblxuICBpZiAoeERhdGEuY29tcGxleFRlbnNvckluZm9zICE9IG51bGwpIHtcbiAgICBjb25zdCByZWFsID0geERhdGEuY29tcGxleFRlbnNvckluZm9zLnJlYWw7XG4gICAgY29uc3QgaW1hZyA9IHhEYXRhLmNvbXBsZXhUZW5zb3JJbmZvcy5pbWFnO1xuXG4gICAgcmVhbC5zaGFwZSA9ICRzaGFwZTtcbiAgICBpbWFnLnNoYXBlID0gJHNoYXBlO1xuICB9XG5cbiAgcmV0dXJuIHtkYXRhSWQ6IHguZGF0YUlkLCBzaGFwZTogJHNoYXBlLCBkdHlwZTogeC5kdHlwZX07XG59XG5cbmV4cG9ydCBjb25zdCByZXNoYXBlQ29uZmlnOiBLZXJuZWxDb25maWcgPSB7XG4gIGtlcm5lbE5hbWU6IFJlc2hhcGUsXG4gIGJhY2tlbmROYW1lOiAnY3B1JyxcbiAga2VybmVsRnVuYzogcmVzaGFwZSBhcyB7fSBhcyBLZXJuZWxGdW5jXG59O1xuIl19","/**\n * @license\n * Copyright 2020 Google LLC. All Rights Reserved.\n * Licensed under the Apache License, Version 2.0 (the License);\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an AS IS BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n * =============================================================================\n */\nimport { BatchMatMul, broadcast_util, buffer, util } from '@tensorflow/tfjs-core';\nimport { assertNotComplex } from '../cpu_util';\nimport { reshape } from './Reshape';\nexport function batchMatMul(args) {\n const { inputs, backend, attrs } = args;\n const { a, b } = inputs;\n const { transposeA, transposeB } = attrs;\n assertNotComplex([a, b], 'matMul');\n const aRank = a.shape.length;\n const bRank = b.shape.length;\n const innerShapeA = transposeA ? a.shape[aRank - 2] : a.shape[aRank - 1];\n const innerShapeB = transposeB ? b.shape[bRank - 1] : b.shape[bRank - 2];\n const outerShapeA = transposeA ? a.shape[aRank - 1] : a.shape[aRank - 2];\n const outerShapeB = transposeB ? b.shape[bRank - 2] : b.shape[bRank - 1];\n const outerDimsA = a.shape.slice(0, -2);\n const outerDimsB = b.shape.slice(0, -2);\n const batchDimA = util.sizeFromShape(outerDimsA);\n const batchDimB = util.sizeFromShape(outerDimsB);\n const outShapeOuterDims = broadcast_util.assertAndGetBroadcastShape(a.shape.slice(0, -2), b.shape.slice(0, -2));\n const outShape = outShapeOuterDims.concat([outerShapeA, outerShapeB]);\n util.assert(innerShapeA === innerShapeB, () => `Error in matMul: inner shapes (${innerShapeA}) and (` +\n `${innerShapeB}) of Tensors with shapes ${a.shape} and ` +\n `${b.shape} and transposeA=${transposeA}` +\n ` and transposeB=${transposeB} must match.`);\n const a3dShape = transposeA ? [batchDimA, innerShapeA, outerShapeA] :\n [batchDimA, outerShapeA, innerShapeA];\n const b3dShape = transposeB ? [batchDimB, outerShapeB, innerShapeB] :\n [batchDimB, innerShapeB, outerShapeB];\n // The rest of the implementation is designed to operate on rank-3 tensors\n const a3d = reshape({ inputs: { x: a }, backend, attrs: { shape: a3dShape } });\n const b3d = reshape({ inputs: { x: b }, backend, attrs: { shape: b3dShape } });\n const sharedDim = transposeA ? a3d.shape[1] : a3d.shape[2];\n const leftDim = transposeA ? a3d.shape[2] : a3d.shape[1];\n const rightDim = transposeB ? b3d.shape[1] : b3d.shape[2];\n const batchDim = Math.max(batchDimA, batchDimB);\n const a3dValues = backend.data.get(a3d.dataId).values;\n const b3dValues = backend.data.get(b3d.dataId).values;\n const a3dStrides = util.computeStrides(a3d.shape);\n const b3dStrides = util.computeStrides(b3d.shape);\n const [aBatch, aOuterStep, aInnerStep] = transposeA ?\n [a3dStrides[0], 1, a3dStrides[1]] :\n [a3dStrides[0], a3dStrides[1], 1];\n const [bInnerStep, bOuterStep, bBatch] = transposeB ?\n [1, b3dStrides[1], b3dStrides[0]] :\n [b3dStrides[1], 1, b3dStrides[0]];\n const size = leftDim * rightDim;\n const result = buffer([batchDim, leftDim, rightDim], a3d.dtype);\n const resVals = result.values;\n const blockSize = backend.blockSize;\n for (let bi = 0; bi < batchDim; bi++) {\n for (let i0 = 0; i0 < leftDim; i0 += blockSize) {\n for (let j0 = 0; j0 < rightDim; j0 += blockSize) {\n for (let k0 = 0; k0 < sharedDim; k0 += blockSize) {\n // for when blockSize doesn't evenly divide the input\n const iBlock = Math.min(i0 + blockSize, leftDim);\n const jBlock = Math.min(j0 + blockSize, rightDim);\n const kBlock = Math.min(k0 + blockSize, sharedDim);\n for (let i = i0; i < iBlock; i++) {\n for (let j = j0; j < jBlock; j++) {\n let sum = 0.0;\n for (let k = k0; k < kBlock; k++) {\n const batchOffsetA = Math.min(bi, batchDimA - 1) * aBatch;\n const batchOffsetB = Math.min(bi, batchDimB - 1) * bBatch;\n const aVal = a3dValues[batchOffsetA + i * aOuterStep + k * aInnerStep];\n const bVal = b3dValues[k * bInnerStep + j * bOuterStep + batchOffsetB];\n sum += aVal * bVal;\n }\n resVals[bi * size + (i * rightDim + j)] += sum;\n }\n }\n }\n }\n }\n }\n backend.disposeIntermediateTensorInfo(a3d);\n backend.disposeIntermediateTensorInfo(b3d);\n // set correct shape on output.\n return backend.makeTensorInfo(outShape, result.dtype, result.values);\n}\nexport const batchMatMulConfig = {\n kernelName: BatchMatMul,\n backendName: 'cpu',\n kernelFunc: batchMatMul,\n};\n//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiQmF0Y2hNYXRNdWwuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi8uLi90ZmpzLWJhY2tlbmQtY3B1L3NyYy9rZXJuZWxzL0JhdGNoTWF0TXVsLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBOzs7Ozs7Ozs7Ozs7Ozs7R0FlRztBQUVILE9BQU8sRUFBQyxXQUFXLEVBQXVDLGNBQWMsRUFBRSxNQUFNLEVBQXdDLElBQUksRUFBQyxNQUFNLHVCQUF1QixDQUFDO0FBRzNKLE9BQU8sRUFBQyxnQkFBZ0IsRUFBQyxNQUFNLGFBQWEsQ0FBQztBQUU3QyxPQUFPLEVBQUMsT0FBTyxFQUFDLE1BQU0sV0FBVyxDQUFDO0FBRWxDLE1BQU0sVUFBVSxXQUFXLENBQUMsSUFJM0I7SUFDQyxNQUFNLEVBQUMsTUFBTSxFQUFFLE9BQU8sRUFBRSxLQUFLLEVBQUMsR0FBRyxJQUFJLENBQUM7SUFDdEMsTUFBTSxFQUFDLENBQUMsRUFBRSxDQUFDLEVBQUMsR0FBRyxNQUFNLENBQUM7SUFDdEIsTUFBTSxFQUFDLFVBQVUsRUFBRSxVQUFVLEVBQUMsR0FBRyxLQUFLLENBQUM7SUFFdkMsZ0JBQWdCLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLEVBQUUsUUFBUSxDQUFDLENBQUM7SUFFbkMsTUFBTSxLQUFLLEdBQUcsQ0FBQyxDQUFDLEtBQUssQ0FBQyxNQUFNLENBQUM7SUFDN0IsTUFBTSxLQUFLLEdBQUcsQ0FBQyxDQUFDLEtBQUssQ0FBQyxNQUFNLENBQUM7SUFFN0IsTUFBTSxXQUFXLEdBQUcsVUFBVSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsS0FBSyxDQUFDLEtBQUssR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLEtBQUssQ0FBQyxLQUFLLEdBQUcsQ0FBQyxDQUFDLENBQUM7SUFDekUsTUFBTSxXQUFXLEdBQUcsVUFBVSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsS0FBSyxDQUFDLEtBQUss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TSxDQUFDLE1BQW9CLENBQUMsQ0FBQztBQUMzRCxDQUFDO0FBRUQsTUFBTSxDQUFDLE1BQU0saUJBQWlCLEdBQWlCO0lBQzdDLFVBQVUsRUFBRSxXQUFXO0lBQ3ZCLFdBQVcsRUFBRSxLQUFLO0lBQ2xCLFVBQVUsRUFBRSxXQUErQjtDQUM1QyxDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiLyoqXG4gKiBAbGljZW5zZVxuICogQ29weXJpZ2h0IDIwMjAgR29vZ2xlIExMQy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC5cbiAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSBMaWNlbnNlKTtcbiAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS5cbiAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdFxuICpcbiAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMFxuICpcbiAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmVcbiAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuIEFTIElTIEJBU0lTLFxuICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuXG4gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kXG4gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS5cbiAqID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4gKi9cblxuaW1wb3J0IHtCYXRjaE1hdE11bCwgQmF0Y2hNYXRNdWxBdHRycywgQmF0Y2hNYXRNdWxJbnB1dHMsIGJyb2FkY2FzdF91dGlsLCBidWZmZXIsIEtlcm5lbENvbmZpZywgS2VybmVsRnVuYywgVHlwZWRBcnJheSwgdXRpbH0gZnJvbSAnQHRlbnNvcmZsb3cvdGZqcy1jb3JlJztcblxuaW1wb3J0IHtNYXRoQmFja2VuZENQVX0gZnJvbSAnLi4vYmFja2VuZF9jcHUnO1xuaW1wb3J0IHthc3NlcnROb3RDb21wbGV4fSBmcm9tICcuLi9jcHVfdXRpbCc7XG5cbmltcG9ydCB7cmVzaGFwZX0gZnJvbSAnLi9SZXNoYXBlJztcblxuZXhwb3J0IGZ1bmN0aW9uIGJhdGNoTWF0TXVsKGFyZ3M6IHtcbiAgaW5wdXRzOiBCYXRjaE1hdE11bElucHV0cyxcbiAgYXR0cnM6IEJhdGNoTWF0TXVsQXR0cnMsXG4gIGJhY2tlbmQ6IE1hdGhCYWNrZW5kQ1BVXG59KSB7XG4gIGNvbnN0IHtpbnB1dHMsIGJhY2tlbmQsIGF0dHJzfSA9IGFyZ3M7XG4gIGNvbnN0IHthLCBifSA9IGlucHV0cztcbiAgY29uc3Qge3RyYW5zcG9zZUEsIHRyYW5zcG9zZUJ9ID0gYXR0cnM7XG5cbiAgYXNzZXJ0Tm90Q29tcGxleChbYSwgYl0sICdtYXRNdWwnKTtcblxuICBjb25zdCBhUmFuayA9IGEuc2hhcGUubGVuZ3RoO1xuICBjb25zdCBiUmFuayA9IGIuc2hhcGUubGVuZ3RoO1xuXG4gIGNvbnN0IGlubmVyU2hhcGVBID0gdHJhbnNwb3NlQSA/IGEuc2hhcGVbYVJhbmsgLSAyXSA6IGEuc2hhcGVbYVJhbmsgLSAxXTtcbiAgY29uc3QgaW5uZXJTaGFwZUIgPSB0cmFuc3Bvc2VCID8gYi5zaGFwZVtiUmFuayAtIDFdIDogYi5zaGFwZVtiUmFuayAtIDJdO1xuXG4gIGNvbnN0IG91dGVyU2hhcGVBID0gdHJhbnNwb3NlQSA/IGEuc2hhcGVbYVJhbmsgLSAxXSA6IGEuc2hhcGVbYVJhbmsgLSAyXTtcbiAgY29uc3Qgb3V0ZXJTaGFwZUIgPSB0cmFuc3Bvc2VCID8gYi5zaGFwZVtiUmFuayAtIDJdIDogYi5zaGFwZVtiUmFuayAtIDFdO1xuXG4gIGNvbnN0IG91dGVyRGltc0EgPSBhLnNoYXBlLnNsaWNlKDAsIC0yKTtcbiAgY29uc3Qgb3V0ZXJEaW1zQiA9IGIuc2hhcGUuc2xpY2UoMCwgLTIpO1xuXG4gIGNvbnN0IGJhdGNoRGltQSA9IHV0aWwuc2l6ZUZyb21TaGFwZShvdXRlckRpbXNBKTtcbiAgY29uc3QgYmF0Y2hEaW1CID0gdXRpbC5zaXplRnJvbVNoYXBlKG91dGVyRGltc0IpO1xuXG4gIGNvbnN0IG91dFNoYXBlT3V0ZXJEaW1zID0gYnJvYWRjYXN0X3V0aWwuYXNzZXJ0QW5kR2V0QnJvYWRjYXN0U2hhcGUoXG4gICAgICBhLnNoYXBlLnNsaWNlKDAsIC0yKSwgYi5zaGFwZS5zbGljZSgwLCAtMikpO1xuICBjb25zdCBvdXRTaGFwZSA9IG91dFNoYXBlT3V0ZXJEaW1zLmNvbmNhdChbb3V0ZXJTaGFwZUEsIG91dGVyU2hhcGVCXSk7XG5cbiAgdXRpbC5hc3NlcnQoXG4gICAgICBpbm5lclNoYXBlQSA9PT0gaW5uZXJTaGFwZUIsXG4gICAgICAoKSA9PiBgRXJyb3IgaW4gbWF0TXVsOiBpbm5lciBzaGFwZXMgKCR7aW5uZXJTaGFwZUF9KSBhbmQgKGAgK1xuICAgICAgICAgIGAke2lubmVyU2hhcGVCfSkgb2YgVGVuc29ycyB3aXRoIHNoYXBlcyAke2Euc2hhcGV9IGFuZCBgICtcbiAgICAgICAgICBgJHtiLnNoYXBlfSBhbmQgdHJhbnNwb3NlQT0ke3RyYW5zcG9zZUF9YCArXG4gICAgICAgICAgYCBhbmQgdHJhbnNwb3NlQj0ke3RyYW5zcG9zZUJ9IG11c3QgbWF0Y2guYCk7XG5cbiAgY29uc3QgYTNkU2hhcGUgPSB0cmFuc3Bvc2VBID8gW2JhdGNoRGltQSwgaW5uZXJTaGFwZUEsIG91dGVyU2hhcGVBXSA6XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFtiYXRjaERpbUEsIG91dGVyU2hhcGVBLCBpbm5lclNoYXBlQV07XG4gIGNvbnN0IGIzZFNoYXBlID0gdHJhbnNwb3NlQiA/IFtiYXRjaERpbUIsIG91dGVyU2hhcGVCLCBpbm5lclNoYXBlQl0gOlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbYmF0Y2hEaW1CLCBpbm5lclNoYXBlQiwgb3V0ZXJTaGFwZUJdO1xuXG4gIC8vIFRoZSByZXN0IG9mIHRoZSBpbXBsZW1lbnRhdGlvbiBpcyBkZXNpZ25lZCB0byBvcGVyYXRlIG9uIHJhbmstMyB0ZW5zb3JzXG4gIGNvbnN0IGEzZCA9IHJlc2hhcGUoe2lucHV0czoge3g6IGF9LCBiYWNrZW5kLCBhdHRyczoge3NoYXBlOiBhM2RTaGFwZX19KTtcbiAgY29uc3QgYjNkID0gcmVzaGFwZSh7aW5wdXRzOiB7eDogYn0sIGJhY2tlbmQsIGF0dHJzOiB7c2hhcGU6IGIzZFNoYXBlfX0pO1xuXG4gIGNvbnN0IHNoYXJlZERpbSA9IHRyYW5zcG9zZUEgPyBhM2Quc2hhcGVbMV0gOiBhM2Quc2hhcGVbMl07XG4gIGNvbnN0IGxlZnREaW0gPSB0cmFuc3Bvc2VBID8gYTNkLnNoYXBlWzJdIDogYTNkLnNoYXBlWzFdO1xuICBjb25zdCByaWdodERpbSA9IHRyYW5zcG9zZUIgPyBiM2Quc2hhcGVbMV0gOiBiM2Quc2hhcGVbMl07XG4gIGNvbnN0IGJhdGNoRGltID0gTWF0aC5tYXgoYmF0Y2hEaW1BLCBiYXRjaERpbUIpO1xuXG4gIGNvbnN0IGEzZFZhbHVlcyA9IGJhY2tlbmQuZGF0YS5nZXQoYTNkLmRhdGFJZCkudmFsdWVzIGFzIFR5cGVkQXJyYXk7XG4gIGNvbnN0IGIzZFZhbHVlcyA9IGJhY2tlbmQuZGF0YS5nZXQoYjNkLmRhdGFJZCkudmFsdWVzIGFzIFR5cGVkQXJyYXk7XG5cbiAgY29uc3QgYTNkU3RyaWRlcyA9IHV0aWwuY29tcHV0ZVN0cmlkZXMoYTNkLnNoYXBlKTtcbiAgY29uc3QgYjNkU3RyaWRlcyA9IHV0aWwuY29tcHV0ZVN0cmlkZXMoYjNkLnNoYXBlKTtcblxuICBjb25zdCBbYUJhdGNoLCBhT3V0ZXJTdGVwLCBhSW5uZXJTdGVwXSA9IHRyYW5zcG9zZUEgP1xuICAgICAgW2EzZFN0cmlkZXNbMF0sIDEsIGEzZFN0cmlkZXNbMV1dIDpcbiAgICAgIFthM2RTdHJpZGVzWzBdLCBhM2RTdHJpZGVzWzFdLCAxXTtcbiAgY29uc3QgW2JJbm5lclN0ZXAsIGJPdXRlclN0ZXAsIGJCYXRjaF0gPSB0cmFuc3Bvc2VCID9cbiAgICAgIFsxLCBiM2RTdHJpZGVzWzFdLCBiM2RTdHJpZGVzWzBdXSA6XG4gICAgICBbYjNkU3RyaWRlc1sxXSwgMSwgYjNkU3RyaWRlc1swXV07XG5cbiAgY29uc3Qgc2l6ZSA9IGxlZnREaW0gKiByaWdodERpbTtcbiAgY29uc3QgcmVzdWx0ID0gYnVmZmVyKFtiYXRjaERpbSwgbGVmdERpbSwgcmlnaHREaW1dLCBhM2QuZHR5cGUpO1xuXG4gIGNvbnN0IHJlc1ZhbHMgPSByZXN1bHQudmFsdWVzIGFzIFR5cGVkQXJyYXk7XG4gIGNvbnN0IGJsb2NrU2l6ZSA9IGJhY2tlbmQuYmxvY2tTaXplO1xuXG4gIGZvciAobGV0IGJpID0gMDsgYmkgPCBiYXRjaERpbTsgYmkrKykge1xuICAgIGZvciAobGV0IGkwID0gMDsgaTAgPCBsZWZ0RGltOyBpMCArPSBibG9ja1NpemUpIHtcbiAgICAgIGZvciAobGV0IGowID0gMDsgajAgPCByaWdodERpbTsgajAgKz0gYmxvY2tTaXplKSB7XG4gICAgICAgIGZvciAobGV0IGswID0gMDsgazAgPCBzaGFyZWREaW07IGswICs9IGJsb2NrU2l6ZSkge1xuICAgICAgICAgIC8vIGZvciB3aGVuIGJsb2NrU2l6ZSBkb2Vzbid0IGV2ZW5seSBkaXZpZGUgdGhlIGlucHV0XG4gICAgICAgICAgY29uc3QgaUJsb2NrID0gTWF0aC5taW4oaTAgKyBibG9ja1NpemUsIGxlZnREaW0pO1xuICAgICAgICAgIGNvbnN0IGpCbG9jayA9IE1hdGgubWluKGowICsgYmxvY2tTaXplLCByaWdodERpbSk7XG4gICAgICAgICAgY29uc3Qga0Jsb2NrID0gTWF0aC5taW4oazAgKyBibG9ja1NpemUsIHNoYXJlZERpbSk7XG5cbiAgICAgICAgICBmb3IgKGxldCBpID0gaTA7IGkgPCBpQmxvY2s7IGkrKykge1xuICAgICAgICAgICAgZm9yIChsZXQgaiA9IGowOyBqIDwgakJsb2NrOyBqKyspIHtcbiAgICAgICAgICAgICAgbGV0IHN1bSA9IDAuMDtcblxuICAgICAgICAgICAgICBmb3IgKGxldCBrID0gazA7IGsgPCBrQmxvY2s7IGsrKykge1xuICAgICAgICAgICAgICAgIGNvbnN0IGJhdGNoT2Zmc2V0QSA9IE1hdGgubWluKGJpLCBiYXRjaERpbUEgLSAxKSAqIGFCYXRjaDtcbiAgICAgICAgICAgICAgICBjb25zdCBiYXRjaE9mZnNldEIgPSBNYXRoLm1pbihiaSwgYmF0Y2hEaW1CIC0gMSkgKiBiQmF0Y2g7XG4gICAgICAgICAgICAgICAgY29uc3QgYVZhbCA9XG4gICAgICAgICAgICAgICAgICAgIGEzZFZhbHVlc1tiYXRjaE9mZnNldEEgKyBpICogYU91dGVyU3RlcCArIGsgKiBhSW5uZXJTdGVwXTtcbiAgICAgICAgICAgICAgICBjb25zdCBiVmFsID1cbiAgICAgICAgICAgICAgICAgICAgYjNkVmFsdWVzW2sgKiBiSW5uZXJTdGVwICsgaiAqIGJPdXRlclN0ZXAgKyBiYXRjaE9mZnNldEJdO1xuICAgICAgICAgICAgICAgIHN1bSArPSBhVmFsICogYlZhbDtcbiAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICByZXNWYWxzW2JpICogc2l6ZSArIChpICogcmlnaHREaW0gKyBqKV0gKz0gc3VtO1xuICAgICAgICAgICAgfVxuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgfVxuICAgIH1cbiAgfVxuXG4gIGJhY2tlbmQuZGlzcG9zZUludGVybWVkaWF0ZVRlbnNvckluZm8oYTNkKTtcbiAgYmFja2VuZC5kaXNwb3NlSW50ZXJtZWRpYXRlVGVuc29ySW5mbyhiM2QpO1xuXG4gIC8vIHNldCBjb3JyZWN0IHNoYXBlIG9uIG91dHB1dC5cbiAgcmV0dXJuIGJhY2tlbmQubWFrZVRlbnNvckluZm8oXG4gICAgICBvdXRTaGFwZSwgcmVzdWx0LmR0eXBlLCByZXN1bHQudmFsdWVzIGFzIFR5cGVkQXJyYXkpO1xufVxuXG5leHBvcnQgY29uc3QgYmF0Y2hNYXRNdWxDb25maWc6IEtlcm5lbENvbmZpZyA9IHtcbiAga2VybmVsTmFtZTogQmF0Y2hNYXRNdWwsXG4gIGJhY2tlbmROYW1lOiAnY3B1JyxcbiAga2VybmVsRnVuYzogYmF0Y2hNYXRNdWwgYXMge30gYXMgS2VybmVsRnVuYyxcbn07XG4iXX0=","/**\n * @license\n * Copyright 2020 Google LLC. All Rights Reserved.\n * Licensed under the Apache License, Version 2.0 (the License);\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an AS IS BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n * =============================================================================\n */\nimport { _FusedMatMul } from '@tensorflow/tfjs-core';\nimport { applyActivation } from '../utils/fused_utils';\nimport { add } from './Add';\nimport { batchMatMul } from './BatchMatMul';\nexport function _fusedMatMul(args) {\n const { inputs, backend, attrs } = args;\n const { a, b, bias, preluActivationWeights } = inputs;\n const { transposeA, transposeB, activation, leakyreluAlpha } = attrs;\n let current;\n let addRes;\n let activationRes;\n const intermediates = [];\n const matMulRes = batchMatMul({ inputs: { a, b }, attrs: { transposeA, transposeB }, backend });\n current = matMulRes;\n if (bias) {\n addRes = add({ inputs: { a: current, b: bias }, backend });\n intermediates.push(current);\n current = addRes;\n }\n if (activation) {\n activationRes = applyActivation(backend, current, activation, preluActivationWeights, leakyreluAlpha);\n intermediates.push(current);\n current = activationRes;\n }\n for (const i of intermediates) {\n backend.disposeIntermediateTensorInfo(i);\n }\n return current;\n}\nexport const _fusedMatMulConfig = {\n kernelName: _FusedMatMul,\n backendName: 'cpu',\n kernelFunc: _fusedMatMul,\n};\n//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiX0Z1c2VkTWF0TXVsLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vLi4vdGZqcy1iYWNrZW5kLWNwdS9zcmMva2VybmVscy9fRnVzZWRNYXRNdWwudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUE7Ozs7Ozs7Ozs7Ozs7OztHQWVHO0FBRUgsT0FBTyxFQUFDLFlBQVksRUFBOEUsTUFBTSx1QkFBdUIsQ0FBQztBQUdoSSxPQUFPLEVBQUMsZUFBZSxFQUFDLE1BQU0sc0JBQXNCLENBQUM7QUFFckQsT0FBTyxFQUFDLEdBQUcsRUFBQyxNQUFNLE9BQU8sQ0FBQztBQUMxQixPQUFPLEVBQUMsV0FBVyxFQUFDLE1BQU0sZUFBZSxDQUFDO0FBRTFDLE1BQU0sVUFBVSxZQUFZLENBQUMsSUFJNUI7SUFDQyxNQUFNLEVBQUMsTUFBTSxFQUFFLE9BQU8sRUFBRSxLQUFLLEVBQUMsR0FBRyxJQUFJLENBQUM7SUFDdEMsTUFBTSxFQUFDLENBQUMsRUFBRSxDQUFDLEVBQUUsSUFBSSxFQUFFLHNCQUFzQixFQUFDLEdBQUcsTUFBTSxDQUFDO0lBQ3BELE1BQU0sRUFBQyxVQUFVLEVBQUUsVUFBVSxFQUFFLFVBQVUsRUFBRSxjQUFjLEVBQUMsR0FBRyxLQUFLLENBQUM7SUFFbkUsSUFBSSxPQUFPLENBQUM7SUFDWixJQUFJLE1BQU0sQ0FBQztJQUNYLElBQUksYUFBYSxDQUFDO0lBRWxCLE1BQU0sYUFBYSxHQUFpQixFQUFFLENBQUM7SUFFdkMsTUFBTSxTQUFTLEdBQ1gsV0FBVyxDQUFDLEVBQUMsTUFBTSxFQUFFLEVBQUMsQ0FBQyxFQUFFLENBQUMsRUFBQyxFQUFFLEtBQUssRUFBRSxFQUFDLFVBQVUsRUFBRSxVQUFVLEVBQUMsRUFBRSxPQUFPLEVBQUMsQ0FBQyxDQUFDO0lBQzVFLE9BQU8sR0FBRyxTQUFTLENBQUM7SUFFcEIsSUFBSSxJQUFJLEVBQUU7UUFDUixNQUFNLEdBQUcsR0FBRyxDQUFDLEVBQUMsTUFBTSxFQUFFLEVBQUMsQ0FBQyxFQUFFLE9BQU8sRUFBRSxDQUFDLEVBQUUsSUFBSSxFQUFDLEVBQUUsT0FBTyxFQUFDLENBQWUsQ0FBQztRQUNyRSxhQUFhLENBQUMsSUFBSSxDQUFDLE9BQU8sQ0FBQyxDQUFDO1FBQzVCLE9BQU8sR0FBRyxNQUFNLENBQUM7S0FDbEI7SUFDRCxJQUFJLFVBQVUsRUFBRTtRQUNkLGFBQWEsR0FBRyxlQUFlLENBQzNCLE9BQU8sRUFBRSxPQUFPLEVBQUUsVUFBVSxFQUFFLHNCQUFzQixFQUFFLGNBQWMsQ0FBQyxDQUFDO1FBQzFFLGFBQWEsQ0FBQyxJQUFJLENBQUMsT0FBTyxDQUFDLENBQUM7UUFDNUIsT0FBTyxHQUFHLGFBQWEsQ0FBQztLQUN6QjtJQUVELEtBQUssTUFBTSxDQUFDLElBQUksYUFBYSxFQUFFO1FBQzdCLE9BQU8sQ0FBQyw2QkFBNkIsQ0FBQyxDQUFDLENBQUMsQ0FBQztLQUMxQztJQUVELE9BQU8sT0FBTyxDQUFDO0FBQ2pCLENBQUM7QUFFRCxNQUFNLENBQUMsTUFBTSxrQkFBa0IsR0FBaUI7SUFDOUMsVUFBVSxFQUFFLFlBQVk7SUFDeEIsV0FBVyxFQUFFLEtBQUs7SUFDbEIsVUFBVSxFQUFFLFlBQWdDO0NBQzdDLENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyIvKipcbiAqIEBsaWNlbnNlXG4gKiBDb3B5cmlnaHQgMjAyMCBHb29nbGUgTExDLiBBbGwgUmlnaHRzIFJlc2VydmVkLlxuICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlIExpY2Vuc2UpO1xuICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLlxuICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0XG4gKlxuICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wXG4gKlxuICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZVxuICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gQVMgSVMgQkFTSVMsXG4gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC5cbiAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmRcbiAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLlxuICogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbiAqL1xuXG5pbXBvcnQge19GdXNlZE1hdE11bCwgX0Z1c2VkTWF0TXVsQXR0cnMsIF9GdXNlZE1hdE11bElucHV0cywgS2VybmVsQ29uZmlnLCBLZXJuZWxGdW5jLCBUZW5zb3JJbmZvfSBmcm9tICdAdGVuc29yZmxvdy90ZmpzLWNvcmUnO1xuXG5pbXBvcnQge01hdGhCYWNrZW5kQ1BVfSBmcm9tICcuLi9iYWNrZW5kX2NwdSc7XG5pbXBvcnQge2FwcGx5QWN0aXZhdGlvbn0gZnJvbSAnLi4vdXRpbHMvZnVzZWRfdXRpbHMnO1xuXG5pbXBvcnQge2FkZH0gZnJvbSAnLi9BZGQnO1xuaW1wb3J0IHtiYXRjaE1hdE11bH0gZnJvbSAnLi9CYXRjaE1hdE11bCc7XG5cbmV4cG9ydCBmdW5jdGlvbiBfZnVzZWRNYXRNdWwoYXJnczoge1xuICBpbnB1dHM6IF9GdXNlZE1hdE11bElucHV0cyxcbiAgYXR0cnM6IF9GdXNlZE1hdE11bEF0dHJzLFxuICBiYWNrZW5kOiBNYXRoQmFja2VuZENQVVxufSkge1xuICBjb25zdCB7aW5wdXRzLCBiYWNrZW5kLCBhdHRyc30gPSBhcmdzO1xuICBjb25zdCB7YSwgYiwgYmlhcywgcHJlbHVBY3RpdmF0aW9uV2VpZ2h0c30gPSBpbnB1dHM7XG4gIGNvbnN0IHt0cmFuc3Bvc2VBLCB0cmFuc3Bvc2VCLCBhY3RpdmF0aW9uLCBsZWFreXJlbHVBbHBoYX0gPSBhdHRycztcblxuICBsZXQgY3VycmVudDtcbiAgbGV0IGFkZFJlcztcbiAgbGV0IGFjdGl2YXRpb25SZXM7XG5cbiAgY29uc3QgaW50ZXJtZWRpYXRlczogVGVuc29ySW5mb1tdID0gW107XG5cbiAgY29uc3QgbWF0TXVsUmVzID1cbiAgICAgIGJhdGNoTWF0TXVsKHtpbnB1dHM6IHthLCBifSwgYXR0cnM6IHt0cmFuc3Bvc2VBLCB0cmFuc3Bvc2VCfSwgYmFja2VuZH0pO1xuICBjdXJyZW50ID0gbWF0TXVsUmVzO1xuXG4gIGlmIChiaWFzKSB7XG4gICAgYWRkUmVzID0gYWRkKHtpbnB1dHM6IHthOiBjdXJyZW50LCBiOiBiaWFzfSwgYmFja2VuZH0pIGFzIFRlbnNvckluZm87XG4gICAgaW50ZXJtZWRpYXRlcy5wdXNoKGN1cnJlbnQpO1xuICAgIGN1cnJlbnQgPSBhZGRSZXM7XG4gIH1cbiAgaWYgKGFjdGl2YXRpb24pIHtcbiAgICBhY3RpdmF0aW9uUmVzID0gYXBwbHlBY3RpdmF0aW9uKFxuICAgICAgICBiYWNrZW5kLCBjdXJyZW50LCBhY3RpdmF0aW9uLCBwcmVsdUFjdGl2YXRpb25XZWlnaHRzLCBsZWFreXJlbHVBbHBoYSk7XG4gICAgaW50ZXJtZWRpYXRlcy5wdXNoKGN1cnJlbnQpO1xuICAgIGN1cnJlbnQgPSBhY3RpdmF0aW9uUmVzO1xuICB9XG5cbiAgZm9yIChjb25zdCBpIG9mIGludGVybWVkaWF0ZXMpIHtcbiAgICBiYWNrZW5kLmRpc3Bvc2VJbnRlcm1lZGlhdGVUZW5zb3JJbmZvKGkpO1xuICB9XG5cbiAgcmV0dXJuIGN1cnJlbnQ7XG59XG5cbmV4cG9ydCBjb25zdCBfZnVzZWRNYXRNdWxDb25maWc6IEtlcm5lbENvbmZpZyA9IHtcbiAga2VybmVsTmFtZTogX0Z1c2VkTWF0TXVsLFxuICBiYWNrZW5kTmFtZTogJ2NwdScsXG4gIGtlcm5lbEZ1bmM6IF9mdXNlZE1hdE11bCBhcyB7fSBhcyBLZXJuZWxGdW5jLFxufTtcbiJdfQ==","/**\n * @license\n * Copyright 2020 Google LLC. All Rights Reserved.\n * Licensed under the Apache License, Version 2.0 (the License);\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an AS IS BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n * =============================================================================\n */\nimport { Abs, util } from '@tensorflow/tfjs-core';\nimport { assertNotComplex } from '../cpu_util';\nexport function simpleAbsImpl(vals) {\n const resultValues = new Float32Array(vals.length);\n for (let i = 0; i < vals.length; ++i) {\n resultValues[i] = Math.abs(vals[i]);\n }\n return resultValues;\n}\nexport const abs = (args) => {\n const { x } = args.inputs;\n const cpuBackend = args.backend;\n assertNotComplex(x, 'abs');\n let resultValues = new Float32Array(util.sizeFromShape(x.shape));\n const values = cpuBackend.data.get(x.dataId).values;\n resultValues = simpleAbsImpl(values);\n return cpuBackend.makeOutput(resultValues, x.shape, x.dtype);\n};\nexport const absConfig = {\n kernelName: Abs,\n backendName: 'cpu',\n kernelFunc: abs,\n};\n//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiQWJzLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vLi4vdGZqcy1iYWNrZW5kLWNwdS9zcmMva2VybmVscy9BYnMudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUE7Ozs7Ozs7Ozs7Ozs7OztHQWVHO0FBRUgsT0FBTyxFQUFDLEdBQUcsRUFBbUQsSUFBSSxFQUFDLE1BQU0sdUJBQXVCLENBQUM7QUFHakcsT0FBTyxFQUFDLGdCQUFnQixFQUFDLE1BQU0sYUFBYSxDQUFDO0FBRTdDLE1BQU0sVUFBVSxhQUFhLENBQUMsSUFBZ0I7SUFDNUMsTUFBTSxZQUFZLEdBQUcsSUFBSSxZQUFZLENBQUMsSUFBSSxDQUFDLE1BQU0sQ0FBQyxDQUFDO0lBQ25ELEtBQUssSUFBSSxDQUFDLEdBQUcsQ0FBQyxFQUFFLENBQUMsR0FBRyxJQUFJLENBQUMsTUFBTSxFQUFFLEVBQUUsQ0FBQyxFQUFFO1FBQ3BDLFlBQVksQ0FBQyxDQUFDLENBQUMsR0FBRyxJQUFJLENBQUMsR0FBRyxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDO0tBQ3JDO0lBQ0QsT0FBTyxZQUFZLENBQUM7QUFDdEIsQ0FBQztBQUVELE1BQU0sQ0FBQyxNQUFNLEdBQUcsR0FBRyxDQUFDLElBQWtELEVBQUUsRUFBRTtJQUN4RSxNQUFNLEVBQUMsQ0FBQyxFQUFDLEdBQUcsSUFBSSxDQUFDLE1BQU0sQ0FBQztJQUN4QixNQUFNLFVBQVUsR0FBRyxJQUFJLENBQUMsT0FBTyxDQUFDO0lBRWhDLGdCQUFnQixDQUFDLENBQUMsRUFBRSxLQUFLLENBQUMsQ0FBQztJQUUzQixJQUFJLFlBQVksR0FBRyxJQUFJLFlBQVksQ0FBQyxJQUFJLENBQUMsYUFBYSxDQUFDLENBQUMsQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDO0lBQ2pFLE1BQU0sTUFBTSxHQUFHLFVBQVUsQ0FBQyxJQUFJLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxNQUFNLENBQUMsQ0FBQyxNQUFvQixDQUFDO0lBQ2xFLFlBQVksR0FBRyxhQUFhLENBQUMsTUFBTSxDQUFDLENBQUM7SUFFckMsT0FBTyxVQUFVLENBQUMsVUFBVSxDQUFDLFlBQVksRUFBRSxDQUFDLENBQUMsS0FBSyxFQUFFLENBQUMsQ0FBQyxLQUFLLENBQUMsQ0FBQztBQUMvRCxDQUFDLENBQUM7QUFFRixNQUFNLENBQUMsTUFBTSxTQUFTLEdBQWlCO0lBQ3JDLFVBQVUsRUFBRSxHQUFHO0lBQ2YsV0FBVyxFQUFFLEtBQUs7SUFDbEIsVUFBVSxFQUFFLEdBQXVCO0NBQ3BDLENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyIvKipcbiAqIEBsaWNlbnNlXG4gKiBDb3B5cmlnaHQgMjAyMCBHb29nbGUgTExDLiBBbGwgUmlnaHRzIFJlc2VydmVkLlxuICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlIExpY2Vuc2UpO1xuICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLlxuICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0XG4gKlxuICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wXG4gKlxuICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZVxuICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gQVMgSVMgQkFTSVMsXG4gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC5cbiAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmRcbiAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLlxuICogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbiAqL1xuXG5pbXBvcnQge0FicywgQWJzSW5wdXRzLCBLZXJuZWxDb25maWcsIEtlcm5lbEZ1bmMsIFR5cGVkQXJyYXksIHV0aWx9IGZyb20gJ0B0ZW5zb3JmbG93L3RmanMtY29yZSc7XG5cbmltcG9ydCB7TWF0aEJhY2tlbmRDUFV9IGZyb20gJy4uL2JhY2tlbmRfY3B1JztcbmltcG9ydCB7YXNzZXJ0Tm90Q29tcGxleH0gZnJvbSAnLi4vY3B1X3V0aWwnO1xuXG5leHBvcnQgZnVuY3Rpb24gc2ltcGxlQWJzSW1wbCh2YWxzOiBUeXBlZEFycmF5KTogRmxvYXQzMkFycmF5IHtcbiAgY29uc3QgcmVzdWx0VmFsdWVzID0gbmV3IEZsb2F0MzJBcnJheSh2YWxzLmxlbmd0aCk7XG4gIGZvciAobGV0IGkgPSAwOyBpIDwgdmFscy5sZW5ndGg7ICsraSkge1xuICAgIHJlc3VsdFZhbHVlc1tpXSA9IE1hdGguYWJzKHZhbHNbaV0pO1xuICB9XG4gIHJldHVybiByZXN1bHRWYWx1ZXM7XG59XG5cbmV4cG9ydCBjb25zdCBhYnMgPSAoYXJnczoge2lucHV0czogQWJzSW5wdXRzLCBiYWNrZW5kOiBNYXRoQmFja2VuZENQVX0pID0+IHtcbiAgY29uc3Qge3h9ID0gYXJncy5pbnB1dHM7XG4gIGNvbnN0IGNwdUJhY2tlbmQgPSBhcmdzLmJhY2tlbmQ7XG5cbiAgYXNzZXJ0Tm90Q29tcGxleCh4LCAnYWJzJyk7XG5cbiAgbGV0IHJlc3VsdFZhbHVlcyA9IG5ldyBGbG9hdDMyQXJyYXkodXRpbC5zaXplRnJvbVNoYXBlKHguc2hhcGUpKTtcbiAgY29uc3QgdmFsdWVzID0gY3B1QmFja2VuZC5kYXRhLmdldCh4LmRhdGFJZCkudmFsdWVzIGFzIFR5cGVkQXJyYXk7XG4gIHJlc3VsdFZhbHVlcyA9IHNpbXBsZUFic0ltcGwodmFsdWVzKTtcblxuICByZXR1cm4gY3B1QmFja2VuZC5tYWtlT3V0cHV0KHJlc3VsdFZhbHVlcywgeC5zaGFwZSwgeC5kdHlwZSk7XG59O1xuXG5leHBvcnQgY29uc3QgYWJzQ29uZmlnOiBLZXJuZWxDb25maWcgPSB7XG4gIGtlcm5lbE5hbWU6IEFicyxcbiAgYmFja2VuZE5hbWU6ICdjcHUnLFxuICBrZXJuZWxGdW5jOiBhYnMgYXMge30gYXMgS2VybmVsRnVuYyxcbn07XG4iXX0=","/**\n * @license\n * Copyright 2020 Google LLC. All Rights Reserved.\n * Licensed under the Apache License, Version 2.0 (the License);\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an AS IS BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n * =============================================================================\n */\nimport { Acos } from '@tensorflow/tfjs-core';\nimport { unaryKernelFunc } from '../utils/unary_utils';\nexport const acos = unaryKernelFunc(Acos, (xi) => Math.acos(xi));\nexport const acosConfig = {\n kernelName: Acos,\n backendName: 'cpu',\n kernelFunc: acos,\n};\n//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiQWNvcy5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uLy4uL3RmanMtYmFja2VuZC1jcHUvc3JjL2tlcm5lbHMvQWNvcy50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQTs7Ozs7Ozs7Ozs7Ozs7O0dBZUc7QUFFSCxPQUFPLEVBQUMsSUFBSSxFQUFlLE1BQU0sdUJBQXVCLENBQUM7QUFFekQsT0FBTyxFQUFDLGVBQWUsRUFBQyxNQUFNLHNCQUFzQixDQUFDO0FBRXJELE1BQU0sQ0FBQyxNQUFNLElBQUksR0FBRyxlQUFlLENBQUMsSUFBSSxFQUFFLENBQUMsRUFBRSxFQUFFLEVBQUUsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUM7QUFFakUsTUFBTSxDQUFDLE1BQU0sVUFBVSxHQUFpQjtJQUN0QyxVQUFVLEVBQUUsSUFBSTtJQUNoQixXQUFXLEVBQUUsS0FBSztJQUNsQixVQUFVLEVBQUUsSUFBSTtDQUNqQixDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiLyoqXG4gKiBAbGljZW5zZVxuICogQ29weXJpZ2h0IDIwMjAgR29vZ2xlIExMQy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC5cbiAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSBMaWNlbnNlKTtcbiAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS5cbiAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdFxuICpcbiAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMFxuICpcbiAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmVcbiAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuIEFTIElTIEJBU0lTLFxuICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuXG4gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kXG4gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS5cbiAqID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4gKi9cblxuaW1wb3J0IHtBY29zLCBLZXJuZWxDb25maWd9IGZyb20gJ0B0ZW5zb3JmbG93L3RmanMtY29yZSc7XG5cbmltcG9ydCB7dW5hcnlLZXJuZWxGdW5jfSBmcm9tICcuLi91dGlscy91bmFyeV91dGlscyc7XG5cbmV4cG9ydCBjb25zdCBhY29zID0gdW5hcnlLZXJuZWxGdW5jKEFjb3MsICh4aSkgPT4gTWF0aC5hY29zKHhpKSk7XG5cbmV4cG9ydCBjb25zdCBhY29zQ29uZmlnOiBLZXJuZWxDb25maWcgPSB7XG4gIGtlcm5lbE5hbWU6IEFjb3MsXG4gIGJhY2tlbmROYW1lOiAnY3B1JyxcbiAga2VybmVsRnVuYzogYWNvcyxcbn07XG4iXX0=","/**\n * @license\n * Copyright 2020 Google LLC. All Rights Reserved.\n * Licensed under the Apache License, Version 2.0 (the License);\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an AS IS BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n * =============================================================================\n */\nimport { Acosh } from '@tensorflow/tfjs-core';\nimport { unaryKernelFunc } from '../utils/unary_utils';\nexport const acosh = unaryKernelFunc(Acosh, (xi) => Math.acosh(xi));\nexport const acoshConfig = {\n kernelName: Acosh,\n backendName: 'cpu',\n kernelFunc: acosh,\n};\n//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiQWNvc2guanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi8uLi90ZmpzLWJhY2tlbmQtY3B1L3NyYy9rZXJuZWxzL0Fjb3NoLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBOzs7Ozs7Ozs7Ozs7Ozs7R0FlRztBQUVILE9BQU8sRUFBQyxLQUFLLEVBQWUsTUFBTSx1QkFBdUIsQ0FBQztBQUUxRCxPQUFPLEVBQUMsZUFBZSxFQUFDLE1BQU0sc0JBQXNCLENBQUM7QUFFckQsTUFBTSxDQUFDLE1BQU0sS0FBSyxHQUFHLGVBQWUsQ0FBQyxLQUFLLEVBQUUsQ0FBQyxFQUFFLEVBQUUsRUFBRSxDQUFDLElBQUksQ0FBQyxLQUFLLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQztBQUVwRSxNQUFNLENBQUMsTUFBTSxXQUFXLEdBQWlCO0lBQ3ZDLFVBQVUsRUFBRSxLQUFLO0lBQ2pCLFdBQVcsRUFBRSxLQUFLO0lBQ2xCLFVBQVUsRUFBRSxLQUFLO0NBQ2xCLENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyIvKipcbiAqIEBsaWNlbnNlXG4gKiBDb3B5cmlnaHQgMjAyMCBHb29nbGUgTExDLiBBbGwgUmlnaHRzIFJlc2VydmVkLlxuICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlIExpY2Vuc2UpO1xuICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLlxuICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0XG4gKlxuICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wXG4gKlxuICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZVxuICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gQVMgSVMgQkFTSVMsXG4gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC5cbiAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmRcbiAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLlxuICogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbiAqL1xuXG5pbXBvcnQge0Fjb3NoLCBLZXJuZWxDb25maWd9IGZyb20gJ0B0ZW5zb3JmbG93L3RmanMtY29yZSc7XG5cbmltcG9ydCB7dW5hcnlLZXJuZWxGdW5jfSBmcm9tICcuLi91dGlscy91bmFyeV91dGlscyc7XG5cbmV4cG9ydCBjb25zdCBhY29zaCA9IHVuYXJ5S2VybmVsRnVuYyhBY29zaCwgKHhpKSA9PiBNYXRoLmFjb3NoKHhpKSk7XG5cbmV4cG9ydCBjb25zdCBhY29zaENvbmZpZzogS2VybmVsQ29uZmlnID0ge1xuICBrZXJuZWxOYW1lOiBBY29zaCxcbiAgYmFja2VuZE5hbWU6ICdjcHUnLFxuICBrZXJuZWxGdW5jOiBhY29zaCxcbn07XG4iXX0=","/**\n * @license\n * Copyright 2020 Google LLC. All Rights Reserved.\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n * =============================================================================\n */\nimport { AddN, buffer } from '@tensorflow/tfjs-core';\nimport { assertNotComplex } from '../cpu_util';\nexport function addN(args) {\n const { inputs, backend } = args;\n const tensors = inputs;\n assertNotComplex(inputs, 'addN');\n const vals = tensors.map(t => backend.data.get(t.dataId).values);\n const outBuf = buffer(tensors[0].shape, tensors[0].dtype);\n const outVals = outBuf.values;\n for (let i = 0; i < tensors.length; i++) {\n const currVals = vals[i];\n for (let j = 0; j < outVals.length; j++) {\n outVals[j] += currVals[j];\n }\n }\n return backend.makeTensorInfo(outBuf.shape, outBuf.dtype, outBuf.values);\n}\nexport const addNConfig = {\n kernelName: AddN,\n backendName: 'cpu',\n kernelFunc: addN\n};\n//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiQWRkTi5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uLy4uL3RmanMtYmFja2VuZC1jcHUvc3JjL2tlcm5lbHMvQWRkTi50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQTs7Ozs7Ozs7Ozs7Ozs7O0dBZUc7QUFFSCxPQUFPLEVBQUMsSUFBSSxFQUFjLE1BQU0sRUFBMkQsTUFBTSx1QkFBdUIsQ0FBQztBQUd6SCxPQUFPLEVBQUMsZ0JBQWdCLEVBQUMsTUFBTSxhQUFhLENBQUM7QUFFN0MsTUFBTSxVQUFVLElBQUksQ0FBQyxJQUFtRDtJQUV0RSxNQUFNLEVBQUMsTUFBTSxFQUFFLE9BQU8sRUFBQyxHQUFHLElBQUksQ0FBQztJQUMvQixNQUFNLE9BQU8sR0FBRyxNQUFrQixDQUFDO0lBRW5DLGdCQUFnQixDQUFDLE1BQU0sRUFBRSxNQUFNLENBQUMsQ0FBQztJQUVqQyxNQUFNLElBQUksR0FDTixPQUFPLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsT0FBTyxDQUFDLElBQUksQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLE1BQU0sQ0FBQyxDQUFDLE1BQW9CLENBQUMsQ0FBQztJQUN0RSxNQUFNLE1BQU0sR0FBRyxNQUFNLENBQUMsT0FBTyxDQUFDLENBQUMsQ0FBQyxDQUFDLEtBQUssRUFBRSxPQUFPLENBQUMsQ0FBQyxDQUFDLENBQUMsS0FBa0IsQ0FBQyxDQUFDO0lBQ3ZFLE1BQU0sT0FBTyxHQUFHLE1BQU0sQ0FBQyxNQUFNLENBQUM7SUFDOUIsS0FBSyxJQUFJLENBQUMsR0FBRyxDQUFDLEVBQUUsQ0FBQyxHQUFHLE9BQU8sQ0FBQyxNQUFNLEVBQUUsQ0FBQyxFQUFFLEVBQUU7UUFDdkMsTUFBTSxRQUFRLEdBQUcsSUFBSSxDQUFDLENBQUMsQ0FBQyxDQUFDO1FBQ3pCLEtBQUssSUFBSSxDQUFDLEdBQUcsQ0FBQyxFQUFFLENBQUMsR0FBRyxPQUFPLENBQUMsTUFBTSxFQUFFLENBQUMsRUFBRSxFQUFFO1lBQ3ZDLE9BQU8sQ0FBQyxDQUFDLENBQUMsSUFBSSxRQUFRLENBQUMsQ0FBQyxDQUFDLENBQUM7U0FDM0I7S0FDRjtJQUVELE9BQU8sT0FBTyxDQUFDLGNBQWMsQ0FBQyxNQUFNLENBQUMsS0FBSyxFQUFFLE1BQU0sQ0FBQyxLQUFLLEVBQUUsTUFBTSxDQUFDLE1BQU0sQ0FBQyxDQUFDO0FBQzNFLENBQUM7QUFFRCxNQUFNLENBQUMsTUFBTSxVQUFVLEdBQWlCO0lBQ3RDLFVBQVUsRUFBRSxJQUFJO0lBQ2hCLFdBQVcsRUFBRSxLQUFLO0lBQ2xCLFVBQVUsRUFBRSxJQUF3QjtDQUNyQyxDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiLyoqXG4gKiBAbGljZW5zZVxuICogQ29weXJpZ2h0IDIwMjAgR29vZ2xlIExMQy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC5cbiAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSBcIkxpY2Vuc2VcIik7XG4gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuXG4gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXRcbiAqXG4gKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjBcbiAqXG4gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlXG4gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiBcIkFTIElTXCIgQkFTSVMsXG4gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC5cbiAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmRcbiAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLlxuICogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbiAqL1xuXG5pbXBvcnQge0FkZE4sIEFkZE5JbnB1dHMsIGJ1ZmZlciwgS2VybmVsQ29uZmlnLCBLZXJuZWxGdW5jLCBUZW5zb3IsIFRlbnNvckluZm8sIFR5cGVkQXJyYXl9IGZyb20gJ0B0ZW5zb3JmbG93L3RmanMtY29yZSc7XG5cbmltcG9ydCB7TWF0aEJhY2tlbmRDUFV9IGZyb20gJy4uL2JhY2tlbmRfY3B1JztcbmltcG9ydCB7YXNzZXJ0Tm90Q29tcGxleH0gZnJvbSAnLi4vY3B1X3V0aWwnO1xuXG5leHBvcnQgZnVuY3Rpb24gYWRkTihhcmdzOiB7aW5wdXRzOiBBZGROSW5wdXRzLCBiYWNrZW5kOiBNYXRoQmFja2VuZENQVX0pOlxuICAgIFRlbnNvckluZm8ge1xuICBjb25zdCB7aW5wdXRzLCBiYWNrZW5kfSA9IGFyZ3M7XG4gIGNvbnN0IHRlbnNvcnMgPSBpbnB1dHMgYXMgVGVuc29yW107XG5cbiAgYXNzZXJ0Tm90Q29tcGxleChpbnB1dHMsICdhZGROJyk7XG5cbiAgY29uc3QgdmFscyA9XG4gICAgICB0ZW5zb3JzLm1hcCh0ID0+IGJhY2tlbmQuZGF0YS5nZXQodC5kYXRhSWQpLnZhbHVlcyBhcyBUeXBlZEFycmF5KTtcbiAgY29uc3Qgb3V0QnVmID0gYnVmZmVyKHRlbnNvcnNbMF0uc2hhcGUsIHRlbnNvcnNbMF0uZHR5cGUgYXMgJ2Zsb2F0MzInKTtcbiAgY29uc3Qgb3V0VmFscyA9IG91dEJ1Zi52YWx1ZXM7XG4gIGZvciAobGV0IGkgPSAwOyBpIDwgdGVuc29ycy5sZW5ndGg7IGkrKykge1xuICAgIGNvbnN0IGN1cnJWYWxzID0gdmFsc1tpXTtcbiAgICBmb3IgKGxldCBqID0gMDsgaiA8IG91dFZhbHMubGVuZ3RoOyBqKyspIHtcbiAgICAgIG91dFZhbHNbal0gKz0gY3VyclZhbHNbal07XG4gICAgfVxuICB9XG5cbiAgcmV0dXJuIGJhY2tlbmQubWFrZVRlbnNvckluZm8ob3V0QnVmLnNoYXBlLCBvdXRCdWYuZHR5cGUsIG91dEJ1Zi52YWx1ZXMpO1xufVxuXG5leHBvcnQgY29uc3QgYWRkTkNvbmZpZzogS2VybmVsQ29uZmlnID0ge1xuICBrZXJuZWxOYW1lOiBBZGROLFxuICBiYWNrZW5kTmFtZTogJ2NwdScsXG4gIGtlcm5lbEZ1bmM6IGFkZE4gYXMge30gYXMgS2VybmVsRnVuY1xufTtcbiJdfQ==","/**\n * @license\n * Copyright 2020 Google LLC. All Rights Reserved.\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n * =============================================================================\n */\nimport { util } from '@tensorflow/tfjs-core';\nexport function transposeImpl(xVals, xShape, dtype, perm, newShape) {\n const xRank = xShape.length;\n const xSize = util.sizeFromShape(xShape);\n const xStrides = util.computeStrides(xShape);\n const newStrides = util.computeStrides(newShape);\n const result = util.getTypedArrayFromDType(dtype, util.sizeFromShape(newShape));\n for (let i = 0; i < xSize; ++i) {\n const loc = util.indexToLoc(i, xRank, xStrides);\n // Permute location.\n const newLoc = new Array(loc.length);\n for (let i = 0; i < newLoc.length; i++) {\n newLoc[i] = loc[perm[i]];\n }\n const newIndex = util.locToIndex(newLoc, xRank, newStrides);\n result[newIndex] = xVals[i];\n }\n return result;\n}\n//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiVHJhbnNwb3NlX2ltcGwuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi8uLi90ZmpzLWJhY2tlbmQtY3B1L3NyYy9rZXJuZWxzL1RyYW5zcG9zZV9pbXBsLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBOzs7Ozs7Ozs7Ozs7Ozs7R0FlRztBQUdILE9BQU8sRUFBQyxJQUFJLEVBQUMsTUFBTSx1QkFBdUIsQ0FBQztBQUUzQyxNQUFNLFVBQVUsYUFBYSxDQUN6QixLQUFpQixFQUFFLE1BQWdCLEVBQUUsS0FBZSxFQUFFLElBQWMsRUFDcEUsUUFBa0I7SUFDcEIsTUFBTSxLQUFLLEdBQUcsTUFBTSxDQUFDLE1BQU0sQ0FBQztJQUM1QixNQUFNLEtBQUssR0FBRyxJQUFJLENBQUMsYUFBYSxDQUFDLE1BQU0sQ0FBQyxDQUFDO0lBQ3pDLE1BQU0sUUFBUSxHQUFHLElBQUksQ0FBQyxjQUFjLENBQUMsTUFBTSxDQUFDLENBQUM7SUFDN0MsTUFBTSxVQUFVLEdBQUcsSUFBSSxDQUFDLGNBQWMsQ0FBQyxRQUFRLENBQUMsQ0FBQztJQUVqRCxNQUFNLE1BQU0sR0FBRyxJQUFJLENBQUMsc0JBQXNCLENBQ3RDLEtBQXdCLEVBQUUsSUFBSSxDQUFDLGFBQWEsQ0FBQyxRQUFRLENBQUMsQ0FBQyxDQUFDO0lBRTVELEtBQUssSUFBSSxDQUFDLEdBQUcsQ0FBQyxFQUFFLENBQUMsR0FBRyxLQUFLLEVBQUUsRUFBRSxDQUFDLEVBQUU7UUFDOUIsTUFBTSxHQUFHLEdBQUcsSUFBSSxDQUFDLFVBQVUsQ0FBQyxDQUFDLEVBQUUsS0FBSyxFQUFFLFFBQVEsQ0FBQyxDQUFDO1FBRWhELG9CQUFvQjtRQUNwQixNQUFNLE1BQU0sR0FBYSxJQUFJLEtBQUssQ0FBQyxHQUFHLENBQUMsTUFBTSxDQUFDLENBQUM7UUFDL0MsS0FBSyxJQUFJLENBQUMsR0FBRyxDQUFDLEVBQUUsQ0FBQyxHQUFHLE1BQU0sQ0FBQyxNQUFNLEVBQUUsQ0FBQyxFQUFFLEVBQUU7WUFDdEMsTUFBTSxDQUFDLENBQUMsQ0FBQyxHQUFHLEdBQUcsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQztTQUMxQjtRQUVELE1BQU0sUUFBUSxHQUFHLElBQUksQ0FBQyxVQUFVLENBQUMsTUFBTSxFQUFFLEtBQUssRUFBRSxVQUFVLENBQUMsQ0FBQztRQUM1RCxNQUFNLENBQUMsUUFBUSxDQUFDLEdBQUcsS0FBSyxDQUFDLENBQUMsQ0FBQyxDQUFDO0tBQzdCO0lBQ0QsT0FBTyxNQUFNLENBQUM7QUFDaEIsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbIi8qKlxuICogQGxpY2Vuc2VcbiAqIENvcHlyaWdodCAyMDIwIEdvb2dsZSBMTEMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuXG4gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgXCJMaWNlbnNlXCIpO1xuICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLlxuICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0XG4gKlxuICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wXG4gKlxuICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZVxuICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gXCJBUyBJU1wiIEJBU0lTLFxuICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuXG4gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kXG4gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS5cbiAqID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4gKi9cblxuaW1wb3J0IHtEYXRhVHlwZSwgTnVtZXJpY0RhdGFUeXBlLCBUeXBlZEFycmF5fSBmcm9tICdAdGVuc29yZmxvdy90ZmpzLWNvcmUnO1xuaW1wb3J0IHt1dGlsfSBmcm9tICdAdGVuc29yZmxvdy90ZmpzLWNvcmUnO1xuXG5leHBvcnQgZnVuY3Rpb24gdHJhbnNwb3NlSW1wbChcbiAgICB4VmFsczogVHlwZWRBcnJheSwgeFNoYXBlOiBudW1iZXJbXSwgZHR5cGU6IERhdGFUeXBlLCBwZXJtOiBudW1iZXJbXSxcbiAgICBuZXdTaGFwZTogbnVtYmVyW10pOiBUeXBlZEFycmF5IHtcbiAgY29uc3QgeFJhbmsgPSB4U2hhcGUubGVuZ3RoO1xuICBjb25zdCB4U2l6ZSA9IHV0aWwuc2l6ZUZyb21TaGFwZSh4U2hhcGUpO1xuICBjb25zdCB4U3RyaWRlcyA9IHV0aWwuY29tcHV0ZVN0cmlkZXMoeFNoYXBlKTtcbiAgY29uc3QgbmV3U3RyaWRlcyA9IHV0aWwuY29tcHV0ZVN0cmlkZXMobmV3U2hhcGUpO1xuXG4gIGNvbnN0IHJlc3VsdCA9IHV0aWwuZ2V0VHlwZWRBcnJheUZyb21EVHlwZShcbiAgICAgIGR0eXBlIGFzIE51bWVyaWNEYXRhVHlwZSwgdXRpbC5zaXplRnJvbVNoYXBlKG5ld1NoYXBlKSk7XG5cbiAgZm9yIChsZXQgaSA9IDA7IGkgPCB4U2l6ZTsgKytpKSB7XG4gICAgY29uc3QgbG9jID0gdXRpbC5pbmRleFRvTG9jKGksIHhSYW5rLCB4U3RyaWRlcyk7XG5cbiAgICAvLyBQZXJtdXRlIGxvY2F0aW9uLlxuICAgIGNvbnN0IG5ld0xvYzogbnVtYmVyW10gPSBuZXcgQXJyYXkobG9jLmxlbmd0aCk7XG4gICAgZm9yIChsZXQgaSA9IDA7IGkgPCBuZXdMb2MubGVuZ3RoOyBpKyspIHtcbiAgICAgIG5ld0xvY1tpXSA9IGxvY1twZXJtW2ldXTtcbiAgICB9XG5cbiAgICBjb25zdCBuZXdJbmRleCA9IHV0aWwubG9jVG9JbmRleChuZXdMb2MsIHhSYW5rLCBuZXdTdHJpZGVzKTtcbiAgICByZXN1bHRbbmV3SW5kZXhdID0geFZhbHNbaV07XG4gIH1cbiAgcmV0dXJuIHJlc3VsdDtcbn1cbiJdfQ==","/**\n * @license\n * Copyright 2020 Google LLC. All Rights Reserved.\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n * =============================================================================\n */\nimport { Transpose } from '@tensorflow/tfjs-core';\nimport { assertNotComplex } from '../cpu_util';\nimport { transposeImpl } from './Transpose_impl';\nexport function transpose(args) {\n const { inputs, attrs, backend } = args;\n const { x } = inputs;\n const { perm } = attrs;\n assertNotComplex(x, 'transpose');\n const xRank = x.shape.length;\n const newShape = new Array(xRank);\n for (let i = 0; i < newShape.length; i++) {\n newShape[i] = x.shape[perm[i]];\n }\n const values = backend.data.get(x.dataId).values;\n const result = transposeImpl(values, x.shape, x.dtype, perm, newShape);\n const dataId = backend.write(result, newShape, x.dtype);\n return { dataId, shape: newShape, dtype: x.dtype };\n}\nexport const transposeConfig = {\n kernelName: Transpose,\n backendName: 'cpu',\n kernelFunc: transpose\n};\n//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiVHJhbnNwb3NlLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vLi4vdGZqcy1iYWNrZW5kLWNwdS9zcmMva2VybmVscy9UcmFuc3Bvc2UudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUE7Ozs7Ozs7Ozs7Ozs7OztHQWVHO0FBRUgsT0FBTyxFQUF1QyxTQUFTLEVBQThDLE1BQU0sdUJBQXVCLENBQUM7QUFHbkksT0FBTyxFQUFDLGdCQUFnQixFQUFDLE1BQU0sYUFBYSxDQUFDO0FBRTdDLE9BQU8sRUFBQyxhQUFhLEVBQUMsTUFBTSxrQkFBa0IsQ0FBQztBQUUvQyxNQUFNLFVBQVUsU0FBUyxDQUFDLElBSXpCO0lBQ0MsTUFBTSxFQUFDLE1BQU0sRUFBRSxLQUFLLEVBQUUsT0FBTyxFQUFDLEdBQUcsSUFBSSxDQUFDO0lBQ3RDLE1BQU0sRUFBQyxDQUFDLEVBQUMsR0FBRyxNQUFNLENBQUM7SUFDbkIsTUFBTSxFQUFDLElBQUksRUFBQyxHQUFHLEtBQUssQ0FBQztJQUVyQixnQkFBZ0IsQ0FBQyxDQUFDLEVBQUUsV0FBVyxDQUFDLENBQUM7SUFFakMsTUFBTSxLQUFLLEdBQUcsQ0FBQyxDQUFDLEtBQUssQ0FBQyxNQUFNLENBQUM7SUFFN0IsTUFBTSxRQUFRLEdBQWEsSUFBSSxLQUFLLENBQUMsS0FBSyxDQUFDLENBQUM7SUFDNUMsS0FBSyxJQUFJLENBQUMsR0FBRyxDQUFDLEVBQUUsQ0FBQyxHQUFHLFFBQVEsQ0FBQyxNQUFNLEVBQUUsQ0FBQyxFQUFFLEVBQUU7UUFDeEMsUUFBUSxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxLQUFLLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUM7S0FDaEM7SUFFRCxNQUFNLE1BQU0sR0FBRyxPQUFPLENBQUMsSUFBSSxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsTUFBTSxDQUFDLENBQUMsTUFBb0IsQ0FBQztJQUMvRCxNQUFNLE1BQU0sR0FBRyxhQUFhLENBQUMsTUFBTSxFQUFFLENBQUMsQ0FBQyxLQUFLLEVBQUUsQ0FBQyxDQUFDLEtBQUssRUFBRSxJQUFJLEVBQUUsUUFBUSxDQUFDLENBQUM7SUFFdkUsTUFBTSxNQUFNLEdBQUcsT0FBTyxDQUFDLEtBQUssQ0FBQyxNQUFNLEVBQUUsUUFBUSxFQUFFLENBQUMsQ0FBQyxLQUFLLENBQUMsQ0FBQztJQUN4RCxPQUFPLEVBQUMsTUFBTSxFQUFFLEtBQUssRUFBRSxRQUFRLEVBQUUsS0FBSyxFQUFFLENBQUMsQ0FBQyxLQUFLLEVBQUMsQ0FBQztBQUNuRCxDQUFDO0FBRUQsTUFBTSxDQUFDLE1BQU0sZUFBZSxHQUFpQjtJQUMzQyxVQUFVLEVBQUUsU0FBUztJQUNyQixXQUFXLEVBQUUsS0FBSztJQUNsQixVQUFVLEVBQUUsU0FBNkI7Q0FDMUMsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbIi8qKlxuICogQGxpY2Vuc2VcbiAqIENvcHlyaWdodCAyMDIwIEdvb2dsZSBMTEMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuXG4gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgXCJMaWNlbnNlXCIpO1xuICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLlxuICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0XG4gKlxuICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wXG4gKlxuICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZVxuICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gXCJBUyBJU1wiIEJBU0lTLFxuICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuXG4gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kXG4gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS5cbiAqID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4gKi9cblxuaW1wb3J0IHtLZXJuZWxDb25maWcsIEtlcm5lbEZ1bmMsIFRlbnNvckluZm8sIFRyYW5zcG9zZSwgVHJhbnNwb3NlQXR0cnMsIFRyYW5zcG9zZUlucHV0cywgVHlwZWRBcnJheX0gZnJvbSAnQHRlbnNvcmZsb3cvdGZqcy1jb3JlJztcblxuaW1wb3J0IHtNYXRoQmFja2VuZENQVX0gZnJvbSAnLi4vYmFja2VuZF9jcHUnO1xuaW1wb3J0IHthc3NlcnROb3RDb21wbGV4fSBmcm9tICcuLi9jcHVfdXRpbCc7XG5cbmltcG9ydCB7dHJhbnNwb3NlSW1wbH0gZnJvbSAnLi9UcmFuc3Bvc2VfaW1wbCc7XG5cbmV4cG9ydCBmdW5jdGlvbiB0cmFuc3Bvc2UoYXJnczoge1xuICBpbnB1dHM6IFRyYW5zcG9zZUlucHV0cyxcbiAgYXR0cnM6IFRyYW5zcG9zZUF0dHJzLFxuICBiYWNrZW5kOiBNYXRoQmFja2VuZENQVVxufSk6IFRlbnNvckluZm8ge1xuICBjb25zdCB7aW5wdXRzLCBhdHRycywgYmFja2VuZH0gPSBhcmdzO1xuICBjb25zdCB7eH0gPSBpbnB1dHM7XG4gIGNvbnN0IHtwZXJtfSA9IGF0dHJzO1xuXG4gIGFzc2VydE5vdENvbXBsZXgoeCwgJ3RyYW5zcG9zZScpO1xuXG4gIGNvbnN0IHhSYW5rID0geC5zaGFwZS5sZW5ndGg7XG5cbiAgY29uc3QgbmV3U2hhcGU6IG51bWJlcltdID0gbmV3IEFycmF5KHhSYW5rKTtcbiAgZm9yIChsZXQgaSA9IDA7IGkgPCBuZXdTaGFwZS5sZW5ndGg7IGkrKykge1xuICAgIG5ld1NoYXBlW2ldID0geC5zaGFwZVtwZXJtW2ldXTtcbiAgfVxuXG4gIGNvbnN0IHZhbHVlcyA9IGJhY2tlbmQuZGF0YS5nZXQoeC5kYXRhSWQpLnZhbHVlcyBhcyBUeXBlZEFycmF5O1xuICBjb25zdCByZXN1bHQgPSB0cmFuc3Bvc2VJbXBsKHZhbHVlcywgeC5zaGFwZSwgeC5kdHlwZSwgcGVybSwgbmV3U2hhcGUpO1xuXG4gIGNvbnN0IGRhdGFJZCA9IGJhY2tlbmQud3JpdGUocmVzdWx0LCBuZXdTaGFwZSwgeC5kdHlwZSk7XG4gIHJldHVybiB7ZGF0YUlkLCBzaGFwZTogbmV3U2hhcGUsIGR0eXBlOiB4LmR0eXBlfTtcbn1cblxuZXhwb3J0IGNvbnN0IHRyYW5zcG9zZUNvbmZpZzogS2VybmVsQ29uZmlnID0ge1xuICBrZXJuZWxOYW1lOiBUcmFuc3Bvc2UsXG4gIGJhY2tlbmROYW1lOiAnY3B1JyxcbiAga2VybmVsRnVuYzogdHJhbnNwb3NlIGFzIHt9IGFzIEtlcm5lbEZ1bmNcbn07XG4iXX0=","/**\n * @license\n * Copyright 2020 Google LLC. All Rights Reserved.\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n * =============================================================================\n */\nimport { All, backend_util, util } from '@tensorflow/tfjs-core';\nimport { assertNotComplex } from '../cpu_util';\nimport { reshape } from './Reshape';\nimport { transpose } from './Transpose';\nexport function all(args) {\n const { inputs, backend, attrs } = args;\n const { x } = inputs;\n const { axis, keepDims } = attrs;\n assertNotComplex(x, 'all');\n const origAxes = util.parseAxisParam(axis, x.shape);\n let axes = origAxes;\n const permutedAxes = backend_util.getAxesPermutation(axes, x.shape.length);\n let $x = x;\n if (permutedAxes != null) {\n $x = transpose({ inputs: { x }, backend, attrs: { perm: permutedAxes } });\n axes = backend_util.getInnerMostAxes(axes.length, x.shape.length);\n }\n backend_util.assertAxesAreInnerMostDims('all', axes, $x.shape.length);\n const [outShape, reduceShape] = backend_util.computeOutAndReduceShapes($x.shape, axes);\n const reduceSize = util.sizeFromShape(reduceShape);\n const vals = util.makeZerosTypedArray(util.sizeFromShape(outShape), $x.dtype);\n const aVals = backend.data.get($x.dataId).values;\n for (let i = 0; i < vals.length; ++i) {\n const offset = i * reduceSize;\n let all = aVals[offset];\n for (let j = 0; j < reduceSize; ++j) {\n const value = aVals[offset + j];\n all = all && value;\n }\n vals[i] = all;\n }\n if (permutedAxes != null) {\n backend.disposeIntermediateTensorInfo($x);\n }\n const result = backend.makeTensorInfo(outShape, $x.dtype, vals);\n if (keepDims) {\n const expandedShape = backend_util.expandShapeToKeepDim(outShape, origAxes);\n const reshapedResult = reshape({ inputs: { x: result }, backend, attrs: { shape: expandedShape } });\n backend.disposeIntermediateTensorInfo(result);\n return reshapedResult;\n }\n return result;\n}\nexport const allConfig = {\n kernelName: All,\n backendName: 'cpu',\n kernelFunc: all\n};\n//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiQWxsLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vLi4vdGZqcy1iYWNrZW5kLWNwdS9zcmMva2VybmVscy9BbGwudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUE7Ozs7Ozs7Ozs7Ozs7OztHQWVHO0FBRUgsT0FBTyxFQUFDLEdBQUcsRUFBdUIsWUFBWSxFQUFvRCxJQUFJLEVBQUMsTUFBTSx1QkFBdUIsQ0FBQztBQUdySSxPQUFPLEVBQUMsZ0JBQWdCLEVBQUMsTUFBTSxhQUFhLENBQUM7QUFDN0MsT0FBTyxFQUFDLE9BQU8sRUFBQyxNQUFNLFdBQVcsQ0FBQztBQUNsQyxPQUFPLEVBQUMsU0FBUyxFQUFDLE1BQU0sYUFBYSxDQUFDO0FBRXRDLE1BQU0sVUFBVSxHQUFHLENBQ2YsSUFBbUU7SUFFckUsTUFBTSxFQUFDLE1BQU0sRUFBRSxPQUFPLEVBQUUsS0FBSyxFQUFDLEdBQUcsSUFBSSxDQUFDO0lBQ3RDLE1BQU0sRUFBQyxDQUFDLEVBQUMsR0FBRyxNQUFNLENBQUM7SUFDbkIsTUFBTSxFQUFDLElBQUksRUFBRSxRQUFRLEVBQUMsR0FBRyxLQUFLLENBQUM7SUFFL0IsZ0JBQWdCLENBQUMsQ0FBQyxFQUFFLEtBQUssQ0FBQyxDQUFDO0lBRTNCLE1BQU0sUUFBUSxHQUFHLElBQUksQ0FBQyxjQUFjLENBQUMsSUFBSSxFQUFFLENBQUMsQ0FBQyxLQUFLLENBQUMsQ0FBQztJQUNwRCxJQUFJLElBQUksR0FBRyxRQUFRLENBQUM7SUFDcEIsTUFBTSxZQUFZLEdBQUcsWUFBWSxDQUFDLGtCQUFrQixDQUFDLElBQUksRUFBRSxDQUFDLENBQUMsS0FBSyxDQUFDLE1BQU0sQ0FBQyxDQUFDO0lBQzNFLElBQUksRUFBRSxHQUFHLENBQUMsQ0FBQztJQUNYLElBQUksWUFBWSxJQUFJLElBQUksRUFBRTtRQUN4QixFQUFFLEdBQUcsU0FBUyxDQUFDLEVBQUMsTUFBTSxFQUFFLEVBQUMsQ0FBQyxFQUFDLEVBQUUsT0FBTyxFQUFFLEtBQUssRUFBRSxFQUFDLElBQUksRUFBRSxZQUFZLEVBQUMsRUFBQyxDQUFDLENBQUM7UUFDcEUsSUFBSSxHQUFHLFlBQVksQ0FBQyxnQkFBZ0IsQ0FBQyxJQUFJLENBQUMsTUFBTSxFQUFFLENBQUMsQ0FBQyxLQUFLLENBQUMsTUFBTSxDQUFDLENBQUM7S0FDbkU7SUFFRCxZQUFZLENBQUMsMEJBQTBCLENBQUMsS0FBSyxFQUFFLElBQUksRUFBRSxFQUFFLENBQUMsS0FBSyxDQUFDLE1BQU0sQ0FBQyxDQUFDO0lBQ3RFLE1BQU0sQ0FBQyxRQUFRLEVBQUUsV0FBVyxDQUFDLEdBQ3pCLFlBQVksQ0FBQyx5QkFBeUIsQ0FBQyxFQUFFLENBQUMsS0FBSyxFQUFFLElBQUksQ0FBQyxDQUFDO0lBQzNELE1BQU0sVUFBVSxHQUFHLElBQUksQ0FBQyxhQUFhLENBQUMsV0FBVyxDQUFDLENBQUM7SUFDbkQsTUFBTSxJQUFJLEdBQUcsSUFBSSxDQUFDLG1CQUFtQixDQUFDLElBQUksQ0FBQyxhQUFhLENBQUMsUUFBUSxDQUFDLEVBQUUsRUFBRSxDQUFDLEtBQUssQ0FBQyxDQUFDO0lBRTlFLE1BQU0sS0FBSyxHQUFHLE9BQU8sQ0FBQyxJQUFJLENBQUMsR0FBRyxDQUFDLEVBQUUsQ0FBQyxNQUFNLENBQUMsQ0FBQyxNQUFvQixDQUFDO0lBQy9ELEtBQUssSUFBSSxDQUFDLEdBQUcsQ0FBQyxFQUFFLENBQUMsR0FBRyxJQUFJLENBQUMsTUFBTSxFQUFFLEVBQUUsQ0FBQyxFQUFFO1FBQ3BDLE1BQU0sTUFBTSxHQUFHLENBQUMsR0FBRyxVQUFVLENBQUM7UUFDOUIsSUFBSSxHQUFHLEdBQUcsS0FBSyxDQUFDLE1BQU0sQ0FBQyxDQUFDO1FBQ3hCLEtBQUssSUFBSSxDQUFDLEdBQUcsQ0FBQyxFQUFFLENBQUMsR0FBRyxVQUFVLEVBQUUsRUFBRSxDQUFDLEVBQUU7WUFDbkMsTUFBTSxLQUFLLEdBQUcsS0FBSyxDQUFDLE1BQU0sR0FBRyxDQUFDLENBQUMsQ0FBQztZQUNoQyxHQUFHLEdBQUcsR0FBRyxJQUFJLEtBQUssQ0FBQztTQUNwQjtRQUNELElBQUksQ0FBQyxDQUFDLENBQUMsR0FBRyxHQUFHLENBQUM7S0FDZjtJQUVELElBQUksWUFBWSxJQUFJLElBQUksRUFBRTtRQUN4QixPQUFPLENBQUMsNkJBQTZCLENBQUMsRUFBRSxDQUFDLENBQUM7S0FDM0M7SUFFRCxNQUFNLE1BQU0sR0FBRyxPQUFPLENBQUMsY0FBYyxDQUFDLFFBQVEsRUFBRSxFQUFFLENBQUMsS0FBSyxFQUFFLElBQUksQ0FBQyxDQUFDO0lBRWhFLElBQUksUUFBUSxFQUFFO1FBQ1osTUFBTSxhQUFhLEdBQUcsWUFBWSxDQUFDLG9CQUFvQixDQUFDLFFBQVEsRUFBRSxRQUFRLENBQUMsQ0FBQztRQUM1RSxNQUFNLGNBQWMsR0FDaEIsT0FBTyxDQUFDLEVBQUMsTUFBTSxFQUFFLEVBQUMsQ0FBQyxFQUFFLE1BQU0sRUFBQyxFQUFFLE9BQU8sRUFBRSxLQUFLLEVBQUUsRUFBQyxLQUFLLEVBQUUsYUFBYSxFQUFDLEVBQUMsQ0FBQyxDQUFDO1FBRTNFLE9BQU8sQ0FBQyw2QkFBNkIsQ0FBQyxNQUFNLENBQUMsQ0FBQztRQUU5QyxPQUFPLGNBQWMsQ0FBQztLQUN2QjtJQUVELE9BQU8sTUFBTSxDQUFDO0FBQ2hCLENBQUM7QUFFRCxNQUFNLENBQUMsTUFBTSxTQUFTLEdBQWlCO0lBQ3JDLFVBQVUsRUFBRSxHQUFHO0lBQ2YsV0FBVyxFQUFFLEtBQUs7SUFDbEIsVUFBVSxFQUFFLEdBQXVCO0NBQ3BDLENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyIvKipcbiAqIEBsaWNlbnNlXG4gKiBDb3B5cmlnaHQgMjAyMCBHb29nbGUgTExDLiBBbGwgUmlnaHRzIFJlc2VydmVkLlxuICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlIFwiTGljZW5zZVwiKTtcbiAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS5cbiAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdFxuICpcbiAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMFxuICpcbiAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmVcbiAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuIFwiQVMgSVNcIiBCQVNJUyxcbiAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLlxuICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZFxuICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuXG4gKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuICovXG5cbmltcG9ydCB7QWxsLCBBbGxBdHRycywgQWxsSW5wdXRzLCBiYWNrZW5kX3V0aWwsIEtlcm5lbENvbmZpZywgS2VybmVsRnVuYywgVGVuc29ySW5mbywgVHlwZWRBcnJheSwgdXRpbH0gZnJvbSAnQHRlbnNvcmZsb3cvdGZqcy1jb3JlJztcblxuaW1wb3J0IHtNYXRoQmFja2VuZENQVX0gZnJvbSAnLi4vYmFja2VuZF9jcHUnO1xuaW1wb3J0IHthc3NlcnROb3RDb21wbGV4fSBmcm9tICcuLi9jcHVfdXRpbCc7XG5pbXBvcnQge3Jlc2hhcGV9IGZyb20gJy4vUmVzaGFwZSc7XG5pbXBvcnQge3RyYW5zcG9zZX0gZnJvbSAnLi9UcmFuc3Bvc2UnO1xuXG5leHBvcnQgZnVuY3Rpb24gYWxsKFxuICAgIGFyZ3M6IHtpbnB1dHM6IEFsbElucHV0cywgYmFja2VuZDogTWF0aEJhY2tlbmRDUFUsIGF0dHJzOiBBbGxBdHRyc30pOlxuICAgIFRlbnNvckluZm8ge1xuICBjb25zdCB7aW5wdXRzLCBiYWNrZW5kLCBhdHRyc30gPSBhcmdzO1xuICBjb25zdCB7eH0gPSBpbnB1dHM7XG4gIGNvbnN0IHtheGlzLCBrZWVwRGltc30gPSBhdHRycztcblxuICBhc3NlcnROb3RDb21wbGV4KHgsICdhbGwnKTtcblxuICBjb25zdCBvcmlnQXhlcyA9IHV0aWwucGFyc2VBeGlzUGFyYW0oYXhpcywgeC5zaGFwZSk7XG4gIGxldCBheGVzID0gb3JpZ0F4ZXM7XG4gIGNvbnN0IHBlcm11dGVkQXhlcyA9IGJhY2tlbmRfdXRpbC5nZXRBeGVzUGVybXV0YXRpb24oYXhlcywgeC5zaGFwZS5sZW5ndGgpO1xuICBsZXQgJHggPSB4O1xuICBpZiAocGVybXV0ZWRBeGVzICE9IG51bGwpIHtcbiAgICAkeCA9IHRyYW5zcG9zZSh7aW5wdXRzOiB7eH0sIGJhY2tlbmQsIGF0dHJzOiB7cGVybTogcGVybXV0ZWRBeGVzfX0pO1xuICAgIGF4ZXMgPSBiYWNrZW5kX3V0aWwuZ2V0SW5uZXJNb3N0QXhlcyhheGVzLmxlbmd0aCwgeC5zaGFwZS5sZW5ndGgpO1xuICB9XG5cbiAgYmFja2VuZF91dGlsLmFzc2VydEF4ZXNBcmVJbm5lck1vc3REaW1zKCdhbGwnLCBheGVzLCAkeC5zaGFwZS5sZW5ndGgpO1xuICBjb25zdCBbb3V0U2hhcGUsIHJlZHVjZVNoYXBlXSA9XG4gICAgICBiYWNrZW5kX3V0aWwuY29tcHV0ZU91dEFuZFJlZHVjZVNoYXBlcygkeC5zaGFwZSwgYXhlcyk7XG4gIGNvbnN0IHJlZHVjZVNpemUgPSB1dGlsLnNpemVGcm9tU2hhcGUocmVkdWNlU2hhcGUpO1xuICBjb25zdCB2YWxzID0gdXRpbC5tYWtlWmVyb3NUeXBlZEFycmF5KHV0aWwuc2l6ZUZyb21TaGFwZShvdXRTaGFwZSksICR4LmR0eXBlKTtcblxuICBjb25zdCBhVmFscyA9IGJhY2tlbmQuZGF0YS5nZXQoJHguZGF0YUlkKS52YWx1ZXMgYXMgVHlwZWRBcnJheTtcbiAgZm9yIChsZXQgaSA9IDA7IGkgPCB2YWxzLmxlbmd0aDsgKytpKSB7XG4gICAgY29uc3Qgb2Zmc2V0ID0gaSAqIHJlZHVjZVNpemU7XG4gICAgbGV0IGFsbCA9IGFWYWxzW29mZnNldF07XG4gICAgZm9yIChsZXQgaiA9IDA7IGogPCByZWR1Y2VTaXplOyArK2opIHtcbiAgICAgIGNvbnN0IHZhbHVlID0gYVZhbHNbb2Zmc2V0ICsgal07XG4gICAgICBhbGwgPSBhbGwgJiYgdmFsdWU7XG4gICAgfVxuICAgIHZhbHNbaV0gPSBhbGw7XG4gIH1cblxuICBpZiAocGVybXV0ZWRBeGVzICE9IG51bGwpIHtcbiAgICBiYWNrZW5kLmRpc3Bvc2VJbnRlcm1lZGlhdGVUZW5zb3JJbmZvKCR4KTtcbiAgfVxuXG4gIGNvbnN0IHJlc3VsdCA9IGJhY2tlbmQubWFrZVRlbnNvckluZm8ob3V0U2hhcGUsICR4LmR0eXBlLCB2YWxzKTtcblxuICBpZiAoa2VlcERpbXMpIHtcbiAgICBjb25zdCBleHBhbmRlZFNoYXBlID0gYmFja2VuZF91dGlsLmV4cGFuZFNoYXBlVG9LZWVwRGltKG91dFNoYXBlLCBvcmlnQXhlcyk7XG4gICAgY29uc3QgcmVzaGFwZWRSZXN1bHQgPVxuICAgICAgICByZXNoYXBlKHtpbnB1dHM6IHt4OiByZXN1bHR9LCBiYWNrZW5kLCBhdHRyczoge3NoYXBlOiBleHBhbmRlZFNoYXBlfX0pO1xuXG4gICAgYmFja2VuZC5kaXNwb3NlSW50ZXJtZWRpYXRlVGVuc29ySW5mbyhyZXN1bHQpO1xuXG4gICAgcmV0dXJuIHJlc2hhcGVkUmVzdWx0O1xuICB9XG5cbiAgcmV0dXJuIHJlc3VsdDtcbn1cblxuZXhwb3J0IGNvbnN0IGFsbENvbmZpZzogS2VybmVsQ29uZmlnID0ge1xuICBrZXJuZWxOYW1lOiBBbGwsXG4gIGJhY2tlbmROYW1lOiAnY3B1JyxcbiAga2VybmVsRnVuYzogYWxsIGFzIHt9IGFzIEtlcm5lbEZ1bmNcbn07XG4iXX0=","/**\n * @license\n * Copyright 2020 Google LLC. All Rights Reserved.\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n * =============================================================================\n */\nimport { Any, backend_util, util } from '@tensorflow/tfjs-core';\nimport { assertNotComplex } from '../cpu_util';\nimport { reshape } from './Reshape';\nimport { transpose } from './Transpose';\nexport function any(args) {\n const { inputs, backend, attrs } = args;\n const { x } = inputs;\n const { axis, keepDims } = attrs;\n assertNotComplex(x, 'any');\n const origAxes = util.parseAxisParam(axis, x.shape);\n let axes = origAxes;\n const permutedAxes = backend_util.getAxesPermutation(axes, x.shape.length);\n let $x = x;\n if (permutedAxes != null) {\n $x = transpose({ inputs: { x }, backend, attrs: { perm: permutedAxes } });\n axes = backend_util.getInnerMostAxes(axes.length, x.shape.length);\n }\n backend_util.assertAxesAreInnerMostDims('any', axes, $x.shape.length);\n const [outShape, reduceShape] = backend_util.computeOutAndReduceShapes($x.shape, axes);\n const reduceSize = util.sizeFromShape(reduceShape);\n const vals = util.makeZerosTypedArray(util.sizeFromShape(outShape), $x.dtype);\n const aVals = backend.data.get($x.dataId).values;\n for (let i = 0; i < vals.length; ++i) {\n const offset = i * reduceSize;\n let anyVal = aVals[offset];\n for (let j = 0; j < reduceSize; ++j) {\n const value = aVals[offset + j];\n anyVal = anyVal || value;\n }\n vals[i] = anyVal;\n }\n if (permutedAxes != null) {\n backend.disposeIntermediateTensorInfo($x);\n }\n const result = backend.makeTensorInfo(outShape, $x.dtype, vals);\n if (keepDims) {\n const expandedShape = backend_util.expandShapeToKeepDim(outShape, origAxes);\n const reshapedResult = reshape({ inputs: { x: result }, backend, attrs: { shape: expandedShape } });\n backend.disposeIntermediateTensorInfo(result);\n return reshapedResult;\n }\n return result;\n}\nexport const anyConfig = {\n kernelName: Any,\n backendName: 'cpu',\n kernelFunc: any\n};\n//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiQW55LmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vLi4vdGZqcy1iYWNrZW5kLWNwdS9zcmMva2VybmVscy9BbnkudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUE7Ozs7Ozs7Ozs7Ozs7OztHQWVHO0FBRUgsT0FBTyxFQUFDLEdBQUcsRUFBdUIsWUFBWSxFQUFvRCxJQUFJLEVBQUMsTUFBTSx1QkFBdUIsQ0FBQztBQUdySSxPQUFPLEVBQUMsZ0JBQWdCLEVBQUMsTUFBTSxhQUFhLENBQUM7QUFDN0MsT0FBTyxFQUFDLE9BQU8sRUFBQyxNQUFNLFdBQVcsQ0FBQztBQUNsQyxPQUFPLEVBQUMsU0FBUyxFQUFDLE1BQU0sYUFBYSxDQUFDO0FBRXRDLE1BQU0sVUFBVSxHQUFHLENBQ2YsSUFBbUU7SUFFckUsTUFBTSxFQUFDLE1BQU0sRUFBRSxPQUFPLEVBQUUsS0FBSyxFQUFDLEdBQUcsSUFBSSxDQUFDO0lBQ3RDLE1BQU0sRUFBQyxDQUFDLEVBQUMsR0FBRyxNQUFNLENBQUM7SUFDbkIsTUFBTSxFQUFDLElBQUksRUFBRSxRQUFRLEVBQUMsR0FBRyxLQUFLLENBQUM7SUFFL0IsZ0JBQWdCLENBQUMsQ0FBQyxFQUFFLEtBQUssQ0FBQyxDQUFDO0lBRTNCLE1BQU0sUUFBUSxHQUFHLElBQUksQ0FBQyxjQUFjLENBQUMsSUFBSSxFQUFFLENBQUMsQ0FBQyxLQUFLLENBQUMsQ0FBQztJQUNwRCxJQUFJLElBQUksR0FBRyxRQUFRLENBQUM7SUFDcEIsTUFBTSxZQUFZLEdBQUcsWUFBWSxDQUFDLGtCQUFrQixDQUFDLElBQUksRUFBRSxDQUFDLENBQUMsS0FBSyxDQUFDLE1BQU0sQ0FBQyxDQUFDO0lBQzNFLElBQUksRUFBRSxHQUFHLENBQUMsQ0FBQztJQUNYLElBQUksWUFBWSxJQUFJLElBQUksRUFBRTtRQUN4QixFQUFFLEdBQUcsU0FBUyxDQUFDLEVBQUMsTUFBTSxFQUFFLEVBQUMsQ0FBQyxFQUFDLEVBQUUsT0FBTyxFQUFFLEtBQUssRUFBRSxFQUFDLElBQUksRUFBRSxZQUFZLEVBQUMsRUFBQyxDQUFDLENBQUM7UUFDcEUsSUFBSSxHQUFHLFlBQVksQ0FBQyxnQkFBZ0IsQ0FBQyxJQUFJLENBQUMsTUFBTSxFQUFFLENBQUMsQ0FBQyxLQUFLLENBQUMsTUFBTSxDQUFDLENBQUM7S0FDbkU7SUFFRCxZQUFZLENBQUMsMEJBQTBCLENBQUMsS0FBSyxFQUFFLElBQUksRUFBRSxFQUFFLENBQUMsS0FBSyxDQUFDLE1BQU0sQ0FBQyxDQUFDO0lBQ3RFLE1BQU0sQ0FBQyxRQUFRLEVBQUUsV0FBVyxDQUFDLEdBQ3pCLFlBQVksQ0FBQyx5QkFBeUIsQ0FBQyxFQUFFLENBQUMsS0FBSyxFQUFFLElBQUksQ0FBQyxDQUFDO0lBQzNELE1BQU0sVUFBVSxHQUFHLElBQUksQ0FBQyxhQUFhLENBQUMsV0FBVyxDQUFDLENBQUM7SUFDbkQsTUFBTSxJQUFJLEdBQUcsSUFBSSxDQUFDLG1CQUFtQixDQUFDLElBQUksQ0FBQyxhQUFhLENBQUMsUUFBUSxDQUFDLEVBQUUsRUFBRSxDQUFDLEtBQUssQ0FBQyxDQUFDO0lBRTlFLE1BQU0sS0FBSyxHQUFHLE9BQU8sQ0FBQyxJQUFJLENBQUMsR0FBRyxDQUFDLEVBQUUsQ0FBQyxNQUFNLENBQUMsQ0FBQyxNQUFvQixDQUFDO0lBQy9ELEtBQUssSUFBSSxDQUFDLEdBQUcsQ0FBQyxFQUFFLENBQUMsR0FBRyxJQUFJLENBQUMsTUFBTSxFQUFFLEVBQUUsQ0FBQyxFQUFFO1FBQ3BDLE1BQU0sTUFBTSxHQUFHLENBQUMsR0FBRyxVQUFVLENBQUM7UUFDOUIsSUFBSSxNQUFNLEdBQUcsS0FBSyxDQUFDLE1BQU0sQ0FBQyxDQUFDO1FBQzNCLEtBQUssSUFBSSxDQUFDLEdBQUcsQ0FBQyxFQUFFLENBQUMsR0FBRyxVQUFVLEVBQUUsRUFBRSxDQUFDLEVBQUU7WUFDbkMsTUFBTSxLQUFLLEdBQUcsS0FBSyxDQUFDLE1BQU0sR0FBRyxDQUFDLENBQUMsQ0FBQztZQUNoQyxNQUFNLEdBQUcsTUFBTSxJQUFJLEtBQUssQ0FBQztTQUMxQjtRQUNELElBQUksQ0FBQyxDQUFDLENBQUMsR0FBRyxNQUFNLENBQUM7S0FDbEI7SUFFRCxJQUFJLFlBQVksSUFBSSxJQUFJLEVBQUU7UUFDeEIsT0FBTyxDQUFDLDZCQUE2QixDQUFDLEVBQUUsQ0FBQyxDQUFDO0tBQzNDO0lBRUQsTUFBTSxNQUFNLEdBQUcsT0FBTyxDQUFDLGNBQWMsQ0FBQyxRQUFRLEVBQUUsRUFBRSxDQUFDLEtBQUssRUFBRSxJQUFJLENBQUMsQ0FBQztJQUVoRSxJQUFJLFFBQVEsRUFBRTtRQUNaLE1BQU0sYUFBYSxHQUFHLFlBQVksQ0FBQyxvQkFBb0IsQ0FBQyxRQUFRLEVBQUUsUUFBUSxDQUFDLENBQUM7UUFDNUUsTUFBTSxjQUFjLEdBQ2hCLE9BQU8sQ0FBQyxFQUFDLE1BQU0sRUFBRSxFQUFDLENBQUMsRUFBRSxNQUFNLEVBQUMsRUFBRSxPQUFPLEVBQUUsS0FBSyxFQUFFLEVBQUMsS0FBSyxFQUFFLGFBQWEsRUFBQyxFQUFDLENBQUMsQ0FBQztRQUUzRSxPQUFPLENBQUMsNkJBQTZCLENBQUMsTUFBTSxDQUFDLENBQUM7UUFFOUMsT0FBTyxjQUFjLENBQUM7S0FDdkI7SUFFRCxPQUFPLE1BQU0sQ0FBQztBQUNoQixDQUFDO0FBRUQsTUFBTSxDQUFDLE1BQU0sU0FBUyxHQUFpQjtJQUNyQyxVQUFVLEVBQUUsR0FBRztJQUNmLFdBQVcsRUFBRSxLQUFLO0lBQ2xCLFVBQVUsRUFBRSxHQUF1QjtDQUNwQyxDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiLyoqXG4gKiBAbGljZW5zZVxuICogQ29weXJpZ2h0IDIwMjAgR29vZ2xlIExMQy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC5cbiAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSBcIkxpY2Vuc2VcIik7XG4gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuXG4gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXRcbiAqXG4gKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjBcbiAqXG4gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlXG4gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiBcIkFTIElTXCIgQkFTSVMsXG4gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC5cbiAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmRcbiAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLlxuICogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbiAqL1xuXG5pbXBvcnQge0FueSwgQW55QXR0cnMsIEFueUlucHV0cywgYmFja2VuZF91dGlsLCBLZXJuZWxDb25maWcsIEtlcm5lbEZ1bmMsIFRlbnNvckluZm8sIFR5cGVkQXJyYXksIHV0aWx9IGZyb20gJ0B0ZW5zb3JmbG93L3RmanMtY29yZSc7XG5cbmltcG9ydCB7TWF0aEJhY2tlbmRDUFV9IGZyb20gJy4uL2JhY2tlbmRfY3B1JztcbmltcG9ydCB7YXNzZXJ0Tm90Q29tcGxleH0gZnJvbSAnLi4vY3B1X3V0aWwnO1xuaW1wb3J0IHtyZXNoYXBlfSBmcm9tICcuL1Jlc2hhcGUnO1xuaW1wb3J0IHt0cmFuc3Bvc2V9IGZyb20gJy4vVHJhbnNwb3NlJztcblxuZXhwb3J0IGZ1bmN0aW9uIGFueShcbiAgICBhcmdzOiB7aW5wdXRzOiBBbnlJbnB1dHMsIGJhY2tlbmQ6IE1hdGhCYWNrZW5kQ1BVLCBhdHRyczogQW55QXR0cnN9KTpcbiAgICBUZW5zb3JJbmZvIHtcbiAgY29uc3Qge2lucHV0cywgYmFja2VuZCwgYXR0cnN9ID0gYXJncztcbiAgY29uc3Qge3h9ID0gaW5wdXRzO1xuICBjb25zdCB7YXhpcywga2VlcERpbXN9ID0gYXR0cnM7XG5cbiAgYXNzZXJ0Tm90Q29tcGxleCh4LCAnYW55Jyk7XG5cbiAgY29uc3Qgb3JpZ0F4ZXMgPSB1dGlsLnBhcnNlQXhpc1BhcmFtKGF4aXMsIHguc2hhcGUpO1xuICBsZXQgYXhlcyA9IG9yaWdBeGVzO1xuICBjb25zdCBwZXJtdXRlZEF4ZXMgPSBiYWNrZW5kX3V0aWwuZ2V0QXhlc1Blcm11dGF0aW9uKGF4ZXMsIHguc2hhcGUubGVuZ3RoKTtcbiAgbGV0ICR4ID0geDtcbiAgaWYgKHBlcm11dGVkQXhlcyAhPSBudWxsKSB7XG4gICAgJHggPSB0cmFuc3Bvc2Uoe2lucHV0czoge3h9LCBiYWNrZW5kLCBhdHRyczoge3Blcm06IHBlcm11dGVkQXhlc319KTtcbiAgICBheGVzID0gYmFja2VuZF91dGlsLmdldElubmVyTW9zdEF4ZXMoYXhlcy5sZW5ndGgsIHguc2hhcGUubGVuZ3RoKTtcbiAgfVxuXG4gIGJhY2tlbmRfdXRpbC5hc3NlcnRBeGVzQXJlSW5uZXJNb3N0RGltcygnYW55JywgYXhlcywgJHguc2hhcGUubGVuZ3RoKTtcbiAgY29uc3QgW291dFNoYXBlLCByZWR1Y2VTaGFwZV0gPVxuICAgICAgYmFja2VuZF91dGlsLmNvbXB1dGVPdXRBbmRSZWR1Y2VTaGFwZXMoJHguc2hhcGUsIGF4ZXMpO1xuICBjb25zdCByZWR1Y2VTaXplID0gdXRpbC5zaXplRnJvbVNoYXBlKHJlZHVjZVNoYXBlKTtcbiAgY29uc3QgdmFscyA9IHV0aWwubWFrZVplcm9zVHlwZWRBcnJheSh1dGlsLnNpemVGcm9tU2hhcGUob3V0U2hhcGUpLCAkeC5kdHlwZSk7XG5cbiAgY29uc3QgYVZhbHMgPSBiYWNrZW5kLmRhdGEuZ2V0KCR4LmRhdGFJZCkudmFsdWVzIGFzIFR5cGVkQXJyYXk7XG4gIGZvciAobGV0IGkgPSAwOyBpIDwgdmFscy5sZW5ndGg7ICsraSkge1xuICAgIGNvbnN0IG9mZnNldCA9IGkgKiByZWR1Y2VTaXplO1xuICAgIGxldCBhbnlWYWwgPSBhVmFsc1tvZmZzZXRdO1xuICAgIGZvciAobGV0IGogPSAwOyBqIDwgcmVkdWNlU2l6ZTsgKytqKSB7XG4gICAgICBjb25zdCB2YWx1ZSA9IGFWYWxzW29mZnNldCArIGpdO1xuICAgICAgYW55VmFsID0gYW55VmFsIHx8IHZhbHVlO1xuICAgIH1cbiAgICB2YWxzW2ldID0gYW55VmFsO1xuICB9XG5cbiAgaWYgKHBlcm11dGVkQXhlcyAhPSBudWxsKSB7XG4gICAgYmFja2VuZC5kaXNwb3NlSW50ZXJtZWRpYXRlVGVuc29ySW5mbygkeCk7XG4gIH1cblxuICBjb25zdCByZXN1bHQgPSBiYWNrZW5kLm1ha2VUZW5zb3JJbmZvKG91dFNoYXBlLCAkeC5kdHlwZSwgdmFscyk7XG5cbiAgaWYgKGtlZXBEaW1zKSB7XG4gICAgY29uc3QgZXhwYW5kZWRTaGFwZSA9IGJhY2tlbmRfdXRpbC5leHBhbmRTaGFwZVRvS2VlcERpbShvdXRTaGFwZSwgb3JpZ0F4ZXMpO1xuICAgIGNvbnN0IHJlc2hhcGVkUmVzdWx0ID1cbiAgICAgICAgcmVzaGFwZSh7aW5wdXRzOiB7eDogcmVzdWx0fSwgYmFja2VuZCwgYXR0cnM6IHtzaGFwZTogZXhwYW5kZWRTaGFwZX19KTtcblxuICAgIGJhY2tlbmQuZGlzcG9zZUludGVybWVkaWF0ZVRlbnNvckluZm8ocmVzdWx0KTtcblxuICAgIHJldHVybiByZXNoYXBlZFJlc3VsdDtcbiAgfVxuXG4gIHJldHVybiByZXN1bHQ7XG59XG5cbmV4cG9ydCBjb25zdCBhbnlDb25maWc6IEtlcm5lbENvbmZpZyA9IHtcbiAga2VybmVsTmFtZTogQW55LFxuICBiYWNrZW5kTmFtZTogJ2NwdScsXG4gIGtlcm5lbEZ1bmM6IGFueSBhcyB7fSBhcyBLZXJuZWxGdW5jXG59O1xuIl19","/**\n * @license\n * Copyright 2020 Google LLC. All Rights Reserved.\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n * =============================================================================\n */\nimport { ArgMax, backend_util, util } from '@tensorflow/tfjs-core';\nimport { assertNotComplex } from '../cpu_util';\nimport { transpose } from './Transpose';\nexport function argMax(args) {\n const { inputs, backend, attrs } = args;\n const { x } = inputs;\n const { axis } = attrs;\n assertNotComplex(x, 'argMax');\n let axes = util.parseAxisParam(axis, x.shape);\n const permutedAxes = backend_util.getAxesPermutation(axes, x.shape.length);\n let $x = x;\n const intermediateTensorInfos = [];\n if (permutedAxes != null) {\n $x = transpose({ inputs: { x }, backend, attrs: { perm: permutedAxes } });\n intermediateTensorInfos.push($x);\n axes = backend_util.getInnerMostAxes(axes.length, $x.shape.length);\n }\n axes = [axes[0]];\n backend_util.assertAxesAreInnerMostDims('argMax', axes, $x.shape.length);\n const [outShape, reduceShape] = backend_util.computeOutAndReduceShapes($x.shape, axes);\n const outSize = util.sizeFromShape(outShape);\n const vals = util.makeZerosTypedArray(outSize, 'int32');\n const reduceSize = util.sizeFromShape(reduceShape);\n const aVals = backend.data.get($x.dataId).values;\n for (let i = 0; i < vals.length; ++i) {\n const offset = i * reduceSize;\n let max = aVals[offset];\n let maxIndex = 0;\n for (let j = 0; j < reduceSize; ++j) {\n const value = aVals[offset + j];\n if (value > max) {\n max = value;\n maxIndex = j;\n }\n }\n vals[i] = maxIndex;\n }\n intermediateTensorInfos.forEach(t => backend.disposeIntermediateTensorInfo(t));\n return backend.makeTensorInfo(outShape, 'int32', vals);\n}\nexport const argMaxConfig = {\n kernelName: ArgMax,\n backendName: 'cpu',\n kernelFunc: argMax\n};\n//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiQXJnTWF4LmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vLi4vdGZqcy1iYWNrZW5kLWNwdS9zcmMva2VybmVscy9BcmdNYXgudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUE7Ozs7Ozs7Ozs7Ozs7OztHQWVHO0FBRUgsT0FBTyxFQUFDLE1BQU0sRUFBNkIsWUFBWSxFQUFvRCxJQUFJLEVBQUMsTUFBTSx1QkFBdUIsQ0FBQztBQUc5SSxPQUFPLEVBQUMsZ0JBQWdCLEVBQUMsTUFBTSxhQUFhLENBQUM7QUFDN0MsT0FBTyxFQUFDLFNBQVMsRUFBQyxNQUFNLGFBQWEsQ0FBQztBQUV0QyxNQUFNLFVBQVUsTUFBTSxDQUNsQixJQUF5RTtJQUUzRSxNQUFNLEVBQUMsTUFBTSxFQUFFLE9BQU8sRUFBRSxLQUFLLEVBQUMsR0FBRyxJQUFJLENBQUM7SUFDdEMsTUFBTSxFQUFDLENBQUMsRUFBQyxHQUFHLE1BQU0sQ0FBQztJQUNuQixNQUFNLEVBQUMsSUFBSSxFQUFDLEdBQUcsS0FBSyxDQUFDO0lBRXJCLGdCQUFnQixDQUFDLENBQUMsRUFBRSxRQUFRLENBQUMsQ0FBQztJQUU5QixJQUFJLElBQUksR0FBRyxJQUFJLENBQUMsY0FBYyxDQUFDLElBQUksRUFBRSxDQUFDLENBQUMsS0FBSyxDQUFDLENBQUM7SUFDOUMsTUFBTSxZQUFZLEdBQUcsWUFBWSxDQUFDLGtCQUFrQixDQUFDLElBQUksRUFBRSxDQUFDLENBQUMsS0FBSyxDQUFDLE1BQU0sQ0FBQyxDQUFDO0lBQzNFLElBQUksRUFBRSxHQUFHLENBQUMsQ0FBQztJQUNYLE1BQU0sdUJBQXVCLEdBQUcsRUFBRSxDQUFDO0lBQ25DLElBQUksWUFBWSxJQUFJLElBQUksRUFBRTtRQUN4QixFQUFFLEdBQUcsU0FBUyxDQUFDLEVBQUMsTUFBTSxFQUFFLEVBQUMsQ0FBQyxFQUFDLEVBQUUsT0FBTyxFQUFFLEtBQUssRUFBRSxFQUFDLElBQUksRUFBRSxZQUFZLEVBQUMsRUFBQyxDQUFDLENBQUM7UUFDcEUsdUJBQXVCLENBQUMsSUFBSSxDQUFDLEVBQUUsQ0FBQyxDQUFDO1FBQ2pDLElBQUksR0FBRyxZQUFZLENBQUMsZ0JBQWdCLENBQUMsSUFBSSxDQUFDLE1BQU0sRUFBRSxFQUFFLENBQUMsS0FBSyxDQUFDLE1BQU0sQ0FBQyxDQUFDO0tBQ3BFO0lBRUQsSUFBSSxHQUFHLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUM7SUFDakIsWUFBWSxDQUFDLDBCQUEwQixDQUFDLFFBQVEsRUFBRSxJQUFJLEVBQUUsRUFBRSxDQUFDLEtBQUssQ0FBQyxNQUFNLENBQUMsQ0FBQztJQUN6RSxNQUFNLENBQUMsUUFBUSxFQUFFLFdBQVcsQ0FBQyxHQUN6QixZQUFZLENBQUMseUJBQXlCLENBQUMsRUFBRSxDQUFDLEtBQUssRUFBRSxJQUFJLENBQUMsQ0FBQztJQUUzRCxNQUFNLE9BQU8sR0FBRyxJQUFJLENBQUMsYUFBYSxDQUFDLFFBQVEsQ0FBQyxDQUFDO0lBQzdDLE1BQU0sSUFBSSxHQUFHLElBQUksQ0FBQyxtQkFBbUIsQ0FBQyxPQUFPLEVBQUUsT0FBTyxDQUFDLENBQUM7SUFDeEQsTUFBTSxVQUFVLEdBQUcsSUFBSSxDQUFDLGFBQWEsQ0FBQyxXQUFXLENBQUMsQ0FBQztJQUVuRCxNQUFNLEtBQUssR0FBRyxPQUFPLENBQUMsSUFBSSxDQUFDLEdBQUcsQ0FBQyxFQUFFLENBQUMsTUFBTSxDQUFDLENBQUMsTUFBb0IsQ0FBQztJQUMvRCxLQUFLLElBQUksQ0FBQyxHQUFHLENBQUMsRUFBRSxDQUFDLEdBQUcsSUFBSSxDQUFDLE1BQU0sRUFBRSxFQUFFLENBQUMsRUFBRTtRQUNwQyxNQUFNLE1BQU0sR0FBRyxDQUFDLEdBQUcsVUFBVSxDQUFDO1FBQzlCLElBQUksR0FBRyxHQUFHLEtBQUssQ0FBQyxNQUFNLENBQUMsQ0FBQztRQUN4QixJQUFJLFFBQVEsR0FBRyxDQUFDLENBQUM7UUFDakIsS0FBSyxJQUFJLENBQUMsR0FBRyxDQUFDLEVBQUUsQ0FBQyxHQUFHLFVBQVUsRUFBRSxFQUFFLENBQUMsRUFBRTtZQUNuQyxNQUFNLEtBQUssR0FBRyxLQUFLLENBQUMsTUFBTSxHQUFHLENBQUMsQ0FBQyxDQUFDO1lBQ2hDLElBQUksS0FBSyxHQUFHLEdBQUcsRUFBRTtnQkFDZixHQUFHLEdBQUcsS0FBSyxDQUFDO2dCQUNaLFFBQVEsR0FBRyxDQUFDLENBQUM7YUFDZDtTQUNGO1FBQ0QsSUFBSSxDQUFDLENBQUMsQ0FBQyxHQUFHLFFBQVEsQ0FBQztLQUNwQjtJQUVELHVCQUF1QixDQUFDLE9BQU8sQ0FDM0IsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxPQUFPLENBQUMsNkJBQTZCLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQztJQUVuRCxPQUFPLE9BQU8sQ0FBQyxjQUFjLENBQUMsUUFBUSxFQUFFLE9BQU8sRUFBRSxJQUFJLENBQUMsQ0FBQztBQUN6RCxDQUFDO0FBRUQsTUFBTSxDQUFDLE1BQU0sWUFBWSxHQUFpQjtJQUN4QyxVQUFVLEVBQUUsTUFBTTtJQUNsQixXQUFXLEVBQUUsS0FBSztJQUNsQixVQUFVLEVBQUUsTUFBMEI7Q0FDdkMsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbIi8qKlxuICogQGxpY2Vuc2VcbiAqIENvcHlyaWdodCAyMDIwIEdvb2dsZSBMTEMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuXG4gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgXCJMaWNlbnNlXCIpO1xuICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLlxuICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0XG4gKlxuICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wXG4gKlxuICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZVxuICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gXCJBUyBJU1wiIEJBU0lTLFxuICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuXG4gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kXG4gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS5cbiAqID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4gKi9cblxuaW1wb3J0IHtBcmdNYXgsIEFyZ01heEF0dHJzLCBBcmdNYXhJbnB1dHMsIGJhY2tlbmRfdXRpbCwgS2VybmVsQ29uZmlnLCBLZXJuZWxGdW5jLCBUZW5zb3JJbmZvLCBUeXBlZEFycmF5LCB1dGlsfSBmcm9tICdAdGVuc29yZmxvdy90ZmpzLWNvcmUnO1xuXG5pbXBvcnQge01hdGhCYWNrZW5kQ1BVfSBmcm9tICcuLi9iYWNrZW5kX2NwdSc7XG5pbXBvcnQge2Fzc2VydE5vdENvbXBsZXh9IGZyb20gJy4uL2NwdV91dGlsJztcbmltcG9ydCB7dHJhbnNwb3NlfSBmcm9tICcuL1RyYW5zcG9zZSc7XG5cbmV4cG9ydCBmdW5jdGlvbiBhcmdNYXgoXG4gICAgYXJnczoge2lucHV0czogQXJnTWF4SW5wdXRzLCBiYWNrZW5kOiBNYXRoQmFja2VuZENQVSwgYXR0cnM6IEFyZ01heEF0dHJzfSk6XG4gICAgVGVuc29ySW5mbyB7XG4gIGNvbnN0IHtpbnB1dHMsIGJhY2tlbmQsIGF0dHJzfSA9IGFyZ3M7XG4gIGNvbnN0IHt4fSA9IGlucHV0cztcbiAgY29uc3Qge2F4aXN9ID0gYXR0cnM7XG5cbiAgYXNzZXJ0Tm90Q29tcGxleCh4LCAnYXJnTWF4Jyk7XG5cbiAgbGV0IGF4ZXMgPSB1dGlsLnBhcnNlQXhpc1BhcmFtKGF4aXMsIHguc2hhcGUpO1xuICBjb25zdCBwZXJtdXRlZEF4ZXMgPSBiYWNrZW5kX3V0aWwuZ2V0QXhlc1Blcm11dGF0aW9uKGF4ZXMsIHguc2hhcGUubGVuZ3RoKTtcbiAgbGV0ICR4ID0geDtcbiAgY29uc3QgaW50ZXJtZWRpYXRlVGVuc29ySW5mb3MgPSBbXTtcbiAgaWYgKHBlcm11dGVkQXhlcyAhPSBudWxsKSB7XG4gICAgJHggPSB0cmFuc3Bvc2Uoe2lucHV0czoge3h9LCBiYWNrZW5kLCBhdHRyczoge3Blcm06IHBlcm11dGVkQXhlc319KTtcbiAgICBpbnRlcm1lZGlhdGVUZW5zb3JJbmZvcy5wdXNoKCR4KTtcbiAgICBheGVzID0gYmFja2VuZF91dGlsLmdldElubmVyTW9zdEF4ZXMoYXhlcy5sZW5ndGgsICR4LnNoYXBlLmxlbmd0aCk7XG4gIH1cblxuICBheGVzID0gW2F4ZXNbMF1dO1xuICBiYWNrZW5kX3V0aWwuYXNzZXJ0QXhlc0FyZUlubmVyTW9zdERpbXMoJ2FyZ01heCcsIGF4ZXMsICR4LnNoYXBlLmxlbmd0aCk7XG4gIGNvbnN0IFtvdXRTaGFwZSwgcmVkdWNlU2hhcGVdID1cbiAgICAgIGJhY2tlbmRfdXRpbC5jb21wdXRlT3V0QW5kUmVkdWNlU2hhcGVzKCR4LnNoYXBlLCBheGVzKTtcblxuICBjb25zdCBvdXRTaXplID0gdXRpbC5zaXplRnJvbVNoYXBlKG91dFNoYXBlKTtcbiAgY29uc3QgdmFscyA9IHV0aWwubWFrZVplcm9zVHlwZWRBcnJheShvdXRTaXplLCAnaW50MzInKTtcbiAgY29uc3QgcmVkdWNlU2l6ZSA9IHV0aWwuc2l6ZUZyb21TaGFwZShyZWR1Y2VTaGFwZSk7XG5cbiAgY29uc3QgYVZhbHMgPSBiYWNrZW5kLmRhdGEuZ2V0KCR4LmRhdGFJZCkudmFsdWVzIGFzIFR5cGVkQXJyYXk7XG4gIGZvciAobGV0IGkgPSAwOyBpIDwgdmFscy5sZW5ndGg7ICsraSkge1xuICAgIGNvbnN0IG9mZnNldCA9IGkgKiByZWR1Y2VTaXplO1xuICAgIGxldCBtYXggPSBhVmFsc1tvZmZzZXRdO1xuICAgIGxldCBtYXhJbmRleCA9IDA7XG4gICAgZm9yIChsZXQgaiA9IDA7IGogPCByZWR1Y2VTaXplOyArK2opIHtcbiAgICAgIGNvbnN0IHZhbHVlID0gYVZhbHNbb2Zmc2V0ICsgal07XG4gICAgICBpZiAodmFsdWUgPiBtYXgpIHtcbiAgICAgICAgbWF4ID0gdmFsdWU7XG4gICAgICAgIG1heEluZGV4ID0gajtcbiAgICAgIH1cbiAgICB9XG4gICAgdmFsc1tpXSA9IG1heEluZGV4O1xuICB9XG5cbiAgaW50ZXJtZWRpYXRlVGVuc29ySW5mb3MuZm9yRWFjaChcbiAgICAgIHQgPT4gYmFja2VuZC5kaXNwb3NlSW50ZXJtZWRpYXRlVGVuc29ySW5mbyh0KSk7XG5cbiAgcmV0dXJuIGJhY2tlbmQubWFrZVRlbnNvckluZm8ob3V0U2hhcGUsICdpbnQzMicsIHZhbHMpO1xufVxuXG5leHBvcnQgY29uc3QgYXJnTWF4Q29uZmlnOiBLZXJuZWxDb25maWcgPSB7XG4gIGtlcm5lbE5hbWU6IEFyZ01heCxcbiAgYmFja2VuZE5hbWU6ICdjcHUnLFxuICBrZXJuZWxGdW5jOiBhcmdNYXggYXMge30gYXMgS2VybmVsRnVuY1xufTtcbiJdfQ==","/**\n * @license\n * Copyright 2020 Google LLC. All Rights Reserved.\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n * =============================================================================\n */\nimport { ArgMin, backend_util, util } from '@tensorflow/tfjs-core';\nimport { assertNotComplex } from '../cpu_util';\nimport { transpose } from './Transpose';\nexport function argMin(args) {\n const { inputs, backend, attrs } = args;\n const { x } = inputs;\n const { axis } = attrs;\n assertNotComplex(x, 'argMin');\n let axes = util.parseAxisParam(axis, x.shape);\n const permutedAxes = backend_util.getAxesPermutation(axes, x.shape.length);\n let $x = x;\n const intermediateTensorInfos = [];\n if (permutedAxes != null) {\n $x = transpose({ inputs: { x }, backend, attrs: { perm: permutedAxes } });\n intermediateTensorInfos.push($x);\n axes = backend_util.getInnerMostAxes(axes.length, $x.shape.length);\n }\n axes = [axes[0]];\n backend_util.assertAxesAreInnerMostDims('argMin', axes, $x.shape.length);\n const [outShape, reduceShape] = backend_util.computeOutAndReduceShapes($x.shape, axes);\n const outSize = util.sizeFromShape(outShape);\n const vals = util.makeZerosTypedArray(outSize, 'int32');\n const reduceSize = util.sizeFromShape(reduceShape);\n const aVals = backend.data.get($x.dataId).values;\n for (let i = 0; i < vals.length; ++i) {\n const offset = i * reduceSize;\n let min = aVals[offset];\n let minIndex = 0;\n for (let j = 0; j < reduceSize; ++j) {\n const value = aVals[offset + j];\n if (value < min) {\n min = value;\n minIndex = j;\n }\n }\n vals[i] = minIndex;\n }\n intermediateTensorInfos.forEach(t => backend.disposeIntermediateTensorInfo(t));\n return backend.makeTensorInfo(outShape, 'int32', vals);\n}\nexport const argMinConfig = {\n kernelName: ArgMin,\n backendName: 'cpu',\n kernelFunc: argMin\n};\n//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiQXJnTWluLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vLi4vdGZqcy1iYWNrZW5kLWNwdS9zcmMva2VybmVscy9BcmdNaW4udHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUE7Ozs7Ozs7Ozs7Ozs7OztHQWVHO0FBRUgsT0FBTyxFQUFDLE1BQU0sRUFBNkIsWUFBWSxFQUFvRCxJQUFJLEVBQUMsTUFBTSx1QkFBdUIsQ0FBQztBQUc5SSxPQUFPLEVBQUMsZ0JBQWdCLEVBQUMsTUFBTSxhQUFhLENBQUM7QUFDN0MsT0FBTyxFQUFDLFNBQVMsRUFBQyxNQUFNLGFBQWEsQ0FBQztBQUV0QyxNQUFNLFVBQVUsTUFBTSxDQUNsQixJQUF5RTtJQUUzRSxNQUFNLEVBQUMsTUFBTSxFQUFFLE9BQU8sRUFBRSxLQUFLLEVBQUMsR0FBRyxJQUFJLENBQUM7SUFDdEMsTUFBTSxFQUFDLENBQUMsRUFBQyxHQUFHLE1BQU0sQ0FBQztJQUNuQixNQUFNLEVBQUMsSUFBSSxFQUFDLEdBQUcsS0FBSyxDQUFDO0lBRXJCLGdCQUFnQixDQUFDLENBQUMsRUFBRSxRQUFRLENBQUMsQ0FBQztJQUU5QixJQUFJLElBQUksR0FBRyxJQUFJLENBQUMsY0FBYyxDQUFDLElBQUksRUFBRSxDQUFDLENBQUMsS0FBSyxDQUFDLENBQUM7SUFDOUMsTUFBTSxZQUFZLEdBQUcsWUFBWSxDQUFDLGtCQUFrQixDQUFDLElBQUksRUFBRSxDQUFDLENBQUMsS0FBSyxDQUFDLE1BQU0sQ0FBQyxDQUFDO0lBQzNFLElBQUksRUFBRSxHQUFHLENBQUMsQ0FBQztJQUNYLE1BQU0sdUJBQXVCLEdBQUcsRUFBRSxDQUFDO0lBQ25DLElBQUksWUFBWSxJQUFJLElBQUksRUFBRTtRQUN4QixFQUFFLEdBQUcsU0FBUyxDQUFDLEVBQUMsTUFBTSxFQUFFLEVBQUMsQ0FBQyxFQUFDLEVBQUUsT0FBTyxFQUFFLEtBQUssRUFBRSxFQUFDLElBQUksRUFBRSxZQUFZLEVBQUMsRUFBQyxDQUFDLENBQUM7UUFDcEUsdUJBQXVCLENBQUMsSUFBSSxDQUFDLEVBQUUsQ0FBQyxDQUFDO1FBQ2pDLElBQUksR0FBRyxZQUFZLENBQUMsZ0JBQWdCLENBQUMsSUFBSSxDQUFDLE1BQU0sRUFBRSxFQUFFLENBQUMsS0FBSyxDQUFDLE1BQU0sQ0FBQyxDQUFDO0tBQ3BFO0lBRUQsSUFBSSxHQUFHLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUM7SUFDakIsWUFBWSxDQUFDLDBCQUEwQixDQUFDLFFBQVEsRUFBRSxJQUFJLEVBQUUsRUFBRSxDQUFDLEtBQUssQ0FBQyxNQUFNLENBQUMsQ0FBQztJQUN6RSxNQUFNLENBQUMsUUFBUSxFQUFFLFdBQVcsQ0FBQyxHQUN6QixZQUFZLENBQUMseUJBQXlCLENBQUMsRUFBRSxDQUFDLEtBQUssRUFBRSxJQUFJLENBQUMsQ0FBQztJQUUzRCxNQUFNLE9BQU8sR0FBRyxJQUFJLENBQUMsYUFBYSxDQUFDLFFBQVEsQ0FBQyxDQUFDO0lBQzdDLE1BQU0sSUFBSSxHQUFHLElBQUksQ0FBQyxtQkFBbUIsQ0FBQyxPQUFPLEVBQUUsT0FBTyxDQUFDLENBQUM7SUFDeEQsTUFBTSxVQUFVLEdBQUcsSUFBSSxDQUFDLGFBQWEsQ0FBQyxXQUFXLENBQUMsQ0FBQztJQUVuRCxNQUFNLEtBQUssR0FBRyxPQUFPLENBQUMsSUFBSSxDQUFDLEdBQUcsQ0FBQyxFQUFFLENBQUMsTUFBTSxDQUFDLENBQUMsTUFBb0IsQ0FBQztJQUMvRCxLQUFLLElBQUksQ0FBQyxHQUFHLENBQUMsRUFBRSxDQUFDLEdBQUcsSUFBSSxDQUFDLE1BQU0sRUFBRSxFQUFFLENBQUMsRUFBRTtRQUNwQyxNQUFNLE1BQU0sR0FBRyxDQUFDLEdBQUcsVUFBVSxDQUFDO1FBQzlCLElBQUksR0FBRyxHQUFHLEtBQUssQ0FBQyxNQUFNLENBQUMsQ0FBQztRQUN4QixJQUFJLFFBQVEsR0FBRyxDQUFDLENBQUM7UUFDakIsS0FBSyxJQUFJLENBQUMsR0FBRyxDQUFDLEVBQUUsQ0FBQyxHQUFHLFVBQVUsRUFBRSxFQUFFLENBQUMsRUFBRTtZQUNuQyxNQUFNLEtBQUssR0FBRyxLQUFLLENBQUMsTUFBTSxHQUFHLENBQUMsQ0FBQyxDQUFDO1lBQ2hDLElBQUksS0FBSyxHQUFHLEdBQUcsRUFBRTtnQkFDZixHQUFHLEdBQUcsS0FBSyxDQUFDO2dCQUNaLFFBQVEsR0FBRyxDQUFDLENBQUM7YUFDZDtTQUNGO1FBQ0QsSUFBSSxDQUFDLENBQUMsQ0FBQyxHQUFHLFFBQVEsQ0FBQztLQUNwQjtJQUVELHVCQUF1QixDQUFDLE9BQU8sQ0FDM0IsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxPQUFPLENBQUMsNkJBQTZCLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQztJQUVuRCxPQUFPLE9BQU8sQ0FBQyxjQUFjLENBQUMsUUFBUSxFQUFFLE9BQU8sRUFBRSxJQUFJLENBQUMsQ0FBQztBQUN6RCxDQUFDO0FBRUQsTUFBTSxDQUFDLE1BQU0sWUFBWSxHQUFpQjtJQUN4QyxVQUFVLEVBQUUsTUFBTTtJQUNsQixXQUFXLEVBQUUsS0FBSztJQUNsQixVQUFVLEVBQUUsTUFBMEI7Q0FDdkMsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbIi8qKlxuICogQGxpY2Vuc2VcbiAqIENvcHlyaWdodCAyMDIwIEdvb2dsZSBMTEMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuXG4gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgXCJMaWNlbnNlXCIpO1xuICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLlxuICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0XG4gKlxuICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wXG4gKlxuICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZVxuICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gXCJBUyBJU1wiIEJBU0lTLFxuICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuXG4gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kXG4gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS5cbiAqID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4gKi9cblxuaW1wb3J0IHtBcmdNaW4sIEFyZ01pbkF0dHJzLCBBcmdNaW5JbnB1dHMsIGJhY2tlbmRfdXRpbCwgS2VybmVsQ29uZmlnLCBLZXJuZWxGdW5jLCBUZW5zb3JJbmZvLCBUeXBlZEFycmF5LCB1dGlsfSBmcm9tICdAdGVuc29yZmxvdy90ZmpzLWNvcmUnO1xuXG5pbXBvcnQge01hdGhCYWNrZW5kQ1BVfSBmcm9tICcuLi9iYWNrZW5kX2NwdSc7XG5pbXBvcnQge2Fzc2VydE5vdENvbXBsZXh9IGZyb20gJy4uL2NwdV91dGlsJztcbmltcG9ydCB7dHJhbnNwb3NlfSBmcm9tICcuL1RyYW5zcG9zZSc7XG5cbmV4cG9ydCBmdW5jdGlvbiBhcmdNaW4oXG4gICAgYXJnczoge2lucHV0czogQXJnTWluSW5wdXRzLCBiYWNrZW5kOiBNYXRoQmFja2VuZENQVSwgYXR0cnM6IEFyZ01pbkF0dHJzfSk6XG4gICAgVGVuc29ySW5mbyB7XG4gIGNvbnN0IHtpbnB1dHMsIGJhY2tlbmQsIGF0dHJzfSA9IGFyZ3M7XG4gIGNvbnN0IHt4fSA9IGlucHV0cztcbiAgY29uc3Qge2F4aXN9ID0gYXR0cnM7XG5cbiAgYXNzZXJ0Tm90Q29tcGxleCh4LCAnYXJnTWluJyk7XG5cbiAgbGV0IGF4ZXMgPSB1dGlsLnBhcnNlQXhpc1BhcmFtKGF4aXMsIHguc2hhcGUpO1xuICBjb25zdCBwZXJtdXRlZEF4ZXMgPSBiYWNrZW5kX3V0aWwuZ2V0QXhlc1Blcm11dGF0aW9uKGF4ZXMsIHguc2hhcGUubGVuZ3RoKTtcbiAgbGV0ICR4ID0geDtcbiAgY29uc3QgaW50ZXJtZWRpYXRlVGVuc29ySW5mb3MgPSBbXTtcbiAgaWYgKHBlcm11dGVkQXhlcyAhPSBudWxsKSB7XG4gICAgJHggPSB0cmFuc3Bvc2Uoe2lucHV0czoge3h9LCBiYWNrZW5kLCBhdHRyczoge3Blcm06IHBlcm11dGVkQXhlc319KTtcbiAgICBpbnRlcm1lZGlhdGVUZW5zb3JJbmZvcy5wdXNoKCR4KTtcbiAgICBheGVzID0gYmFja2VuZF91dGlsLmdldElubmVyTW9zdEF4ZXMoYXhlcy5sZW5ndGgsICR4LnNoYXBlLmxlbmd0aCk7XG4gIH1cblxuICBheGVzID0gW2F4ZXNbMF1dO1xuICBiYWNrZW5kX3V0aWwuYXNzZXJ0QXhlc0FyZUlubmVyTW9zdERpbXMoJ2FyZ01pbicsIGF4ZXMsICR4LnNoYXBlLmxlbmd0aCk7XG4gIGNvbnN0IFtvdXRTaGFwZSwgcmVkdWNlU2hhcGVdID1cbiAgICAgIGJhY2tlbmRfdXRpbC5jb21wdXRlT3V0QW5kUmVkdWNlU2hhcGVzKCR4LnNoYXBlLCBheGVzKTtcblxuICBjb25zdCBvdXRTaXplID0gdXRpbC5zaXplRnJvbVNoYXBlKG91dFNoYXBlKTtcbiAgY29uc3QgdmFscyA9IHV0aWwubWFrZVplcm9zVHlwZWRBcnJheShvdXRTaXplLCAnaW50MzInKTtcbiAgY29uc3QgcmVkdWNlU2l6ZSA9IHV0aWwuc2l6ZUZyb21TaGFwZShyZWR1Y2VTaGFwZSk7XG5cbiAgY29uc3QgYVZhbHMgPSBiYWNrZW5kLmRhdGEuZ2V0KCR4LmRhdGFJZCkudmFsdWVzIGFzIFR5cGVkQXJyYXk7XG4gIGZvciAobGV0IGkgPSAwOyBpIDwgdmFscy5sZW5ndGg7ICsraSkge1xuICAgIGNvbnN0IG9mZnNldCA9IGkgKiByZWR1Y2VTaXplO1xuICAgIGxldCBtaW4gPSBhVmFsc1tvZmZzZXRdO1xuICAgIGxldCBtaW5JbmRleCA9IDA7XG4gICAgZm9yIChsZXQgaiA9IDA7IGogPCByZWR1Y2VTaXplOyArK2opIHtcbiAgICAgIGNvbnN0IHZhbHVlID0gYVZhbHNbb2Zmc2V0ICsgal07XG4gICAgICBpZiAodmFsdWUgPCBtaW4pIHtcbiAgICAgICAgbWluID0gdmFsdWU7XG4gICAgICAgIG1pbkluZGV4ID0gajtcbiAgICAgIH1cbiAgICB9XG4gICAgdmFsc1tpXSA9IG1pbkluZGV4O1xuICB9XG5cbiAgaW50ZXJtZWRpYXRlVGVuc29ySW5mb3MuZm9yRWFjaChcbiAgICAgIHQgPT4gYmFja2VuZC5kaXNwb3NlSW50ZXJtZWRpYXRlVGVuc29ySW5mbyh0KSk7XG5cbiAgcmV0dXJuIGJhY2tlbmQubWFrZVRlbnNvckluZm8ob3V0U2hhcGUsICdpbnQzMicsIHZhbHMpO1xufVxuXG5leHBvcnQgY29uc3QgYXJnTWluQ29uZmlnOiBLZXJuZWxDb25maWcgPSB7XG4gIGtlcm5lbE5hbWU6IEFyZ01pbixcbiAgYmFja2VuZE5hbWU6ICdjcHUnLFxuICBrZXJuZWxGdW5jOiBhcmdNaW4gYXMge30gYXMgS2VybmVsRnVuY1xufTtcbiJdfQ==","/**\n * @license\n * Copyright 2020 Google LLC. All Rights Reserved.\n * Licensed under the Apache License, Version 2.0 (the License);\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an AS IS BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n * =============================================================================\n */\nimport { Asin } from '@tensorflow/tfjs-core';\nimport { unaryKernelFunc } from '../utils/unary_utils';\nexport const asin = unaryKernelFunc(Asin, (xi) => Math.asin(xi));\nexport const asinConfig = {\n kernelName: Asin,\n backendName: 'cpu',\n kernelFunc: asin,\n};\n//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiQXNpbi5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uLy4uL3RmanMtYmFja2VuZC1jcHUvc3JjL2tlcm5lbHMvQXNpbi50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQTs7Ozs7Ozs7Ozs7Ozs7O0dBZUc7QUFFSCxPQUFPLEVBQUMsSUFBSSxFQUFlLE1BQU0sdUJBQXVCLENBQUM7QUFFekQsT0FBTyxFQUFDLGVBQWUsRUFBQyxNQUFNLHNCQUFzQixDQUFDO0FBRXJELE1BQU0sQ0FBQyxNQUFNLElBQUksR0FBRyxlQUFlLENBQUMsSUFBSSxFQUFFLENBQUMsRUFBRSxFQUFFLEVBQUUsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUM7QUFFakUsTUFBTSxDQUFDLE1BQU0sVUFBVSxHQUFpQjtJQUN0QyxVQUFVLEVBQUUsSUFBSTtJQUNoQixXQUFXLEVBQUUsS0FBSztJQUNsQixVQUFVLEVBQUUsSUFBSTtDQUNqQixDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiLyoqXG4gKiBAbGljZW5zZVxuICogQ29weXJpZ2h0IDIwMjAgR29vZ2xlIExMQy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC5cbiAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSBMaWNlbnNlKTtcbiAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS5cbiAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdFxuICpcbiAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMFxuICpcbiAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmVcbiAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuIEFTIElTIEJBU0lTLFxuICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuXG4gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kXG4gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS5cbiAqID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4gKi9cblxuaW1wb3J0IHtBc2luLCBLZXJuZWxDb25maWd9IGZyb20gJ0B0ZW5zb3JmbG93L3RmanMtY29yZSc7XG5cbmltcG9ydCB7dW5hcnlLZXJuZWxGdW5jfSBmcm9tICcuLi91dGlscy91bmFyeV91dGlscyc7XG5cbmV4cG9ydCBjb25zdCBhc2luID0gdW5hcnlLZXJuZWxGdW5jKEFzaW4sICh4aSkgPT4gTWF0aC5hc2luKHhpKSk7XG5cbmV4cG9ydCBjb25zdCBhc2luQ29uZmlnOiBLZXJuZWxDb25maWcgPSB7XG4gIGtlcm5lbE5hbWU6IEFzaW4sXG4gIGJhY2tlbmROYW1lOiAnY3B1JyxcbiAga2VybmVsRnVuYzogYXNpbixcbn07XG4iXX0=","/**\n * @license\n * Copyright 2020 Google LLC. All Rights Reserved.\n * Licensed under the Apache License, Version 2.0 (the License);\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an AS IS BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n * =============================================================================\n */\nimport { Asinh } from '@tensorflow/tfjs-core';\nimport { unaryKernelFunc } from '../utils/unary_utils';\nexport const asinh = unaryKernelFunc(Asinh, (xi) => Math.asinh(xi));\nexport const asinhConfig = {\n kernelName: Asinh,\n backendName: 'cpu',\n kernelFunc: asinh,\n};\n//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiQXNpbmguanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi8uLi90ZmpzLWJhY2tlbmQtY3B1L3NyYy9rZXJuZWxzL0FzaW5oLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBOzs7Ozs7Ozs7Ozs7Ozs7R0FlRztBQUVILE9BQU8sRUFBQyxLQUFLLEVBQWUsTUFBTSx1QkFBdUIsQ0FBQztBQUUxRCxPQUFPLEVBQUMsZUFBZSxFQUFDLE1BQU0sc0JBQXNCLENBQUM7QUFFckQsTUFBTSxDQUFDLE1BQU0sS0FBSyxHQUFHLGVBQWUsQ0FBQyxLQUFLLEVBQUUsQ0FBQyxFQUFFLEVBQUUsRUFBRSxDQUFDLElBQUksQ0FBQyxLQUFLLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQztBQUVwRSxNQUFNLENBQUMsTUFBTSxXQUFXLEdBQWlCO0lBQ3ZDLFVBQVUsRUFBRSxLQUFLO0lBQ2pCLFdBQVcsRUFBRSxLQUFLO0lBQ2xCLFVBQVUsRUFBRSxLQUFLO0NBQ2xCLENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyIvKipcbiAqIEBsaWNlbnNlXG4gKiBDb3B5cmlnaHQgMjAyMCBHb29nbGUgTExDLiBBbGwgUmlnaHRzIFJlc2VydmVkLlxuICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlIExpY2Vuc2UpO1xuICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLlxuICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0XG4gKlxuICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wXG4gKlxuICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZVxuICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gQVMgSVMgQkFTSVMsXG4gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC5cbiAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmRcbiAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLlxuICogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbiAqL1xuXG5pbXBvcnQge0FzaW5oLCBLZXJuZWxDb25maWd9IGZyb20gJ0B0ZW5zb3JmbG93L3RmanMtY29yZSc7XG5cbmltcG9ydCB7dW5hcnlLZXJuZWxGdW5jfSBmcm9tICcuLi91dGlscy91bmFyeV91dGlscyc7XG5cbmV4cG9ydCBjb25zdCBhc2luaCA9IHVuYXJ5S2VybmVsRnVuYyhBc2luaCwgKHhpKSA9PiBNYXRoLmFzaW5oKHhpKSk7XG5cbmV4cG9ydCBjb25zdCBhc2luaENvbmZpZzogS2VybmVsQ29uZmlnID0ge1xuICBrZXJuZWxOYW1lOiBBc2luaCxcbiAgYmFja2VuZE5hbWU6ICdjcHUnLFxuICBrZXJuZWxGdW5jOiBhc2luaCxcbn07XG4iXX0=","/**\n * @license\n * Copyright 2020 Google LLC. All Rights Reserved.\n * Licensed under the Apache License, Version 2.0 (the License);\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an AS IS BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n * =============================================================================\n */\nimport { Atan } from '@tensorflow/tfjs-core';\nimport { unaryKernelFunc } from '../utils/unary_utils';\nexport const atan = unaryKernelFunc(Atan, (xi) => Math.atan(xi));\nexport const atanConfig = {\n kernelName: Atan,\n backendName: 'cpu',\n kernelFunc: atan,\n};\n//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiQXRhbi5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uLy4uL3RmanMtYmFja2VuZC1jcHUvc3JjL2tlcm5lbHMvQXRhbi50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQTs7Ozs7Ozs7Ozs7Ozs7O0dBZUc7QUFFSCxPQUFPLEVBQUMsSUFBSSxFQUFlLE1BQU0sdUJBQXVCLENBQUM7QUFFekQsT0FBTyxFQUFDLGVBQWUsRUFBQyxNQUFNLHNCQUFzQixDQUFDO0FBRXJELE1BQU0sQ0FBQyxNQUFNLElBQUksR0FBRyxlQUFlLENBQUMsSUFBSSxFQUFFLENBQUMsRUFBRSxFQUFFLEVBQUUsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUM7QUFFakUsTUFBTSxDQUFDLE1BQU0sVUFBVSxHQUFpQjtJQUN0QyxVQUFVLEVBQUUsSUFBSTtJQUNoQixXQUFXLEVBQUUsS0FBSztJQUNsQixVQUFVLEVBQUUsSUFBSTtDQUNqQixDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiLyoqXG4gKiBAbGljZW5zZVxuICogQ29weXJpZ2h0IDIwMjAgR29vZ2xlIExMQy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC5cbiAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSBMaWNlbnNlKTtcbiAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS5cbiAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdFxuICpcbiAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMFxuICpcbiAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmVcbiAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuIEFTIElTIEJBU0lTLFxuICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuXG4gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kXG4gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS5cbiAqID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4gKi9cblxuaW1wb3J0IHtBdGFuLCBLZXJuZWxDb25maWd9IGZyb20gJ0B0ZW5zb3JmbG93L3RmanMtY29yZSc7XG5cbmltcG9ydCB7dW5hcnlLZXJuZWxGdW5jfSBmcm9tICcuLi91dGlscy91bmFyeV91dGlscyc7XG5cbmV4cG9ydCBjb25zdCBhdGFuID0gdW5hcnlLZXJuZWxGdW5jKEF0YW4sICh4aSkgPT4gTWF0aC5hdGFuKHhpKSk7XG5cbmV4cG9ydCBjb25zdCBhdGFuQ29uZmlnOiBLZXJuZWxDb25maWcgPSB7XG4gIGtlcm5lbE5hbWU6IEF0YW4sXG4gIGJhY2tlbmROYW1lOiAnY3B1JyxcbiAga2VybmVsRnVuYzogYXRhbixcbn07XG4iXX0=","/**\n * @license\n * Copyright 2020 Google LLC. All Rights Reserved.\n * Licensed under the Apache License, Version 2.0 (the License);\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an AS IS BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n * =============================================================================\n */\nimport { Atan2 } from '@tensorflow/tfjs-core';\nimport { createSimpleBinaryKernelImpl } from '../utils/binary_impl';\nimport { binaryKernelFunc } from '../utils/binary_utils';\nexport const atan2Impl = createSimpleBinaryKernelImpl((aValue, bValue) => Math.atan2(aValue, bValue));\nexport const atan2 = binaryKernelFunc(Atan2, atan2Impl);\nexport const atan2Config = {\n kernelName: Atan2,\n backendName: 'cpu',\n kernelFunc: atan2,\n};\n//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiQXRhbjIuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi8uLi90ZmpzLWJhY2tlbmQtY3B1L3NyYy9rZXJuZWxzL0F0YW4yLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBOzs7Ozs7Ozs7Ozs7Ozs7R0FlRztBQUVILE9BQU8sRUFBQyxLQUFLLEVBQWUsTUFBTSx1QkFBdUIsQ0FBQztBQUMxRCxPQUFPLEVBQUMsNEJBQTRCLEVBQUMsTUFBTSxzQkFBc0IsQ0FBQztBQUNsRSxPQUFPLEVBQUMsZ0JBQWdCLEVBQUMsTUFBTSx1QkFBdUIsQ0FBQztBQUV2RCxNQUFNLENBQUMsTUFBTSxTQUFTLEdBQUcsNEJBQTRCLENBQ2pELENBQUMsTUFBTSxFQUFFLE1BQU0sRUFBRSxFQUFFLENBQUMsSUFBSSxDQUFDLEtBQUssQ0FBQyxNQUFnQixFQUFFLE1BQWdCLENBQUMsQ0FBQyxDQUFDO0FBRXhFLE1BQU0sQ0FBQyxNQUFNLEtBQUssR0FBRyxnQkFBZ0IsQ0FBQyxLQUFLLEVBQUUsU0FBUyxDQUFDLENBQUM7QUFFeEQsTUFBTSxDQUFDLE1BQU0sV0FBVyxHQUFpQjtJQUN2QyxVQUFVLEVBQUUsS0FBSztJQUNqQixXQUFXLEVBQUUsS0FBSztJQUNsQixVQUFVLEVBQUUsS0FBSztDQUNsQixDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiLyoqXG4gKiBAbGljZW5zZVxuICogQ29weXJpZ2h0IDIwMjAgR29vZ2xlIExMQy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC5cbiAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSBMaWNlbnNlKTtcbiAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS5cbiAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdFxuICpcbiAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMFxuICpcbiAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmVcbiAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuIEFTIElTIEJBU0lTLFxuICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuXG4gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kXG4gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS5cbiAqID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4gKi9cblxuaW1wb3J0IHtBdGFuMiwgS2VybmVsQ29uZmlnfSBmcm9tICdAdGVuc29yZmxvdy90ZmpzLWNvcmUnO1xuaW1wb3J0IHtjcmVhdGVTaW1wbGVCaW5hcnlLZXJuZWxJbXBsfSBmcm9tICcuLi91dGlscy9iaW5hcnlfaW1wbCc7XG5pbXBvcnQge2JpbmFyeUtlcm5lbEZ1bmN9IGZyb20gJy4uL3V0aWxzL2JpbmFyeV91dGlscyc7XG5cbmV4cG9ydCBjb25zdCBhdGFuMkltcGwgPSBjcmVhdGVTaW1wbGVCaW5hcnlLZXJuZWxJbXBsKFxuICAgIChhVmFsdWUsIGJWYWx1ZSkgPT4gTWF0aC5hdGFuMihhVmFsdWUgYXMgbnVtYmVyLCBiVmFsdWUgYXMgbnVtYmVyKSk7XG5cbmV4cG9ydCBjb25zdCBhdGFuMiA9IGJpbmFyeUtlcm5lbEZ1bmMoQXRhbjIsIGF0YW4ySW1wbCk7XG5cbmV4cG9ydCBjb25zdCBhdGFuMkNvbmZpZzogS2VybmVsQ29uZmlnID0ge1xuICBrZXJuZWxOYW1lOiBBdGFuMixcbiAgYmFja2VuZE5hbWU6ICdjcHUnLFxuICBrZXJuZWxGdW5jOiBhdGFuMixcbn07XG4iXX0=","/**\n * @license\n * Copyright 2020 Google LLC. All Rights Reserved.\n * Licensed under the Apache License, Version 2.0 (the License);\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an AS IS BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n * =============================================================================\n */\nimport { Atanh } from '@tensorflow/tfjs-core';\nimport { unaryKernelFunc } from '../utils/unary_utils';\nexport const atanh = unaryKernelFunc(Atanh, (xi) => Math.atanh(xi));\nexport const atanhConfig = {\n kernelName: Atanh,\n backendName: 'cpu',\n kernelFunc: atanh,\n};\n//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiQXRhbmguanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi8uLi90ZmpzLWJhY2tlbmQtY3B1L3NyYy9rZXJuZWxzL0F0YW5oLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBOzs7Ozs7Ozs7Ozs7Ozs7R0FlRztBQUVILE9BQU8sRUFBQyxLQUFLLEVBQWUsTUFBTSx1QkFBdUIsQ0FBQztBQUUxRCxPQUFPLEVBQUMsZUFBZSxFQUFDLE1BQU0sc0JBQXNCLENBQUM7QUFFckQsTUFBTSxDQUFDLE1BQU0sS0FBSyxHQUFHLGVBQWUsQ0FBQyxLQUFLLEVBQUUsQ0FBQyxFQUFFLEVBQUUsRUFBRSxDQUFDLElBQUksQ0FBQyxLQUFLLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQztBQUVwRSxNQUFNLENBQUMsTUFBTSxXQUFXLEdBQWlCO0lBQ3ZDLFVBQVUsRUFBRSxLQUFLO0lBQ2pCLFdBQVcsRUFBRSxLQUFLO0lBQ2xCLFVBQVUsRUFBRSxLQUFLO0NBQ2xCLENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyIvKipcbiAqIEBsaWNlbnNlXG4gKiBDb3B5cmlnaHQgMjAyMCBHb29nbGUgTExDLiBBbGwgUmlnaHRzIFJlc2VydmVkLlxuICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlIExpY2Vuc2UpO1xuICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLlxuICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0XG4gKlxuICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wXG4gKlxuICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZVxuICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gQVMgSVMgQkFTSVMsXG4gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC5cbiAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmRcbiAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLlxuICogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbiAqL1xuXG5pbXBvcnQge0F0YW5oLCBLZXJuZWxDb25maWd9IGZyb20gJ0B0ZW5zb3JmbG93L3RmanMtY29yZSc7XG5cbmltcG9ydCB7dW5hcnlLZXJuZWxGdW5jfSBmcm9tICcuLi91dGlscy91bmFyeV91dGlscyc7XG5cbmV4cG9ydCBjb25zdCBhdGFuaCA9IHVuYXJ5S2VybmVsRnVuYyhBdGFuaCwgKHhpKSA9PiBNYXRoLmF0YW5oKHhpKSk7XG5cbmV4cG9ydCBjb25zdCBhdGFuaENvbmZpZzogS2VybmVsQ29uZmlnID0ge1xuICBrZXJuZWxOYW1lOiBBdGFuaCxcbiAgYmFja2VuZE5hbWU6ICdjcHUnLFxuICBrZXJuZWxGdW5jOiBhdGFuaCxcbn07XG4iXX0=","/**\n * @license\n * Copyright 2020 Google LLC. All Rights Reserved.\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n * =============================================================================\n */\nimport { buffer } from '@tensorflow/tfjs-core';\nexport function pool(xValues, xShape, dtype, strides, convInfo, poolType) {\n const strideHeight = convInfo.strideHeight;\n const strideWidth = convInfo.strideWidth;\n const dilationHeight = convInfo.dilationHeight;\n const dilationWidth = convInfo.dilationWidth;\n const effectiveFilterHeight = convInfo.effectiveFilterHeight;\n const effectiveFilterWidth = convInfo.effectiveFilterWidth;\n const padTop = convInfo.padInfo.top;\n const padLeft = convInfo.padInfo.left;\n const initialValue = (poolType === 'max' ? Number.NEGATIVE_INFINITY :\n Number.POSITIVE_INFINITY);\n const output = buffer(convInfo.outShape, dtype);\n const outputVals = output.values;\n const outputBatchStrides = convInfo.outShape[1] * convInfo.outShape[2] * convInfo.outShape[3];\n const outputRowStrides = convInfo.outShape[2] * convInfo.outShape[3];\n const outputColStrides = convInfo.outShape[3];\n for (let b = 0; b < convInfo.batchSize; ++b) {\n const outputBatchOffset = b * outputBatchStrides;\n const inputBatchOffset = b * strides[0];\n for (let d = 0; d < convInfo.inChannels; ++d) {\n for (let yR = 0; yR < convInfo.outHeight; ++yR) {\n const xRCorner = yR * strideHeight - padTop;\n const xRMin = Math.max(0, xRCorner);\n const xRMax = Math.min(convInfo.inHeight, effectiveFilterHeight + xRCorner);\n const outputRowOffset = outputBatchOffset + yR * outputRowStrides;\n for (let yC = 0; yC < convInfo.outWidth; ++yC) {\n const xCCorner = yC * strideWidth - padLeft;\n const xCMin = Math.max(0, xCCorner);\n const xCMax = Math.min(convInfo.inWidth, effectiveFilterWidth + xCCorner);\n let minMaxValue = initialValue;\n let avgValue = 0;\n let count = 0;\n for (let xR = xRMin; xR < xRMax; xR += dilationHeight) {\n const xROffset = inputBatchOffset + xR * strides[1];\n for (let xC = xCMin; xC < xCMax; xC += dilationWidth) {\n const xCOffset = xROffset + xC * strides[2];\n const pixel = xValues[xCOffset + d];\n if ((poolType === 'max' && pixel > minMaxValue)) {\n minMaxValue = pixel;\n }\n else if (poolType === 'avg') {\n avgValue += pixel;\n count++;\n }\n }\n if (isNaN(minMaxValue)) {\n break;\n }\n }\n const outputOffset = outputRowOffset + yC * outputColStrides + d;\n outputVals[outputOffset] =\n poolType === 'avg' ? avgValue / count : minMaxValue;\n }\n }\n }\n }\n return output;\n}\nexport function maxPoolPositions(xValues, xShape, dtype, convInfo, flattenPositions = false, includeBatchInIndex = false) {\n const maxPositions = buffer(convInfo.outShape, 'int32');\n const strideHeight = convInfo.strideHeight;\n const strideWidth = convInfo.strideWidth;\n const dilationHeight = convInfo.dilationHeight;\n const dilationWidth = convInfo.dilationWidth;\n const effectiveFilterHeight = convInfo.effectiveFilterHeight;\n const effectiveFilterWidth = convInfo.effectiveFilterWidth;\n const padTop = convInfo.padInfo.top;\n const padLeft = convInfo.padInfo.left;\n const xBuf = buffer(xShape, dtype, xValues);\n for (let b = 0; b < convInfo.batchSize; ++b) {\n for (let d = 0; d < convInfo.inChannels; ++d) {\n for (let yR = 0; yR < convInfo.outHeight; ++yR) {\n const xRCorner = yR * strideHeight - padTop;\n let xRMin = xRCorner;\n while (xRMin < 0) {\n xRMin += dilationHeight;\n }\n // const xRMin = Math.max(0, xRCorner);\n const xRMax = Math.min(convInfo.inHeight, effectiveFilterHeight + xRCorner);\n for (let yC = 0; yC < convInfo.outWidth; ++yC) {\n const xCCorner = yC * strideWidth - padLeft;\n let xCMin = xCCorner;\n while (xCMin < 0) {\n xCMin += dilationWidth;\n }\n const xCMax = Math.min(convInfo.inWidth, effectiveFilterWidth + xCCorner);\n let maxValue = Number.NEGATIVE_INFINITY;\n let maxPosition = -1;\n for (let xR = xRMin; xR < xRMax; xR += dilationHeight) {\n const wR = xR - xRCorner;\n for (let xC = xCMin; xC < xCMax; xC += dilationWidth) {\n const wC = xC - xCCorner;\n const pixel = xBuf.get(b, xR, xC, d);\n if (pixel > maxValue) {\n maxValue = pixel;\n if (flattenPositions) {\n maxPosition = includeBatchInIndex ?\n ((b * convInfo.inHeight + xR) * convInfo.inWidth + xC) *\n convInfo.inChannels +\n d :\n (xR * convInfo.inWidth + xC) * convInfo.inChannels + d;\n }\n else {\n maxPosition = wR * effectiveFilterWidth + wC;\n }\n }\n }\n }\n maxPositions.set(maxPosition, b, yR, yC, d);\n }\n }\n }\n }\n return maxPositions;\n}\nexport function pool3d(xValues, xShape, dtype, strides, convInfo, poolType) {\n const strideDepth = convInfo.strideDepth;\n const strideHeight = convInfo.strideHeight;\n const strideWidth = convInfo.strideWidth;\n const dilationDepth = convInfo.dilationDepth;\n const dilationHeight = convInfo.dilationHeight;\n const dilationWidth = convInfo.dilationWidth;\n const effectiveFilterDepth = convInfo.effectiveFilterDepth;\n const effectiveFilterHeight = convInfo.effectiveFilterHeight;\n const effectiveFilterWidth = convInfo.effectiveFilterWidth;\n const padFront = convInfo.padInfo.front;\n const padTop = convInfo.padInfo.top;\n const padLeft = convInfo.padInfo.left;\n const initialValue = (poolType === 'max' ? Number.NEGATIVE_INFINITY :\n Number.POSITIVE_INFINITY);\n const output = buffer(convInfo.outShape, dtype);\n const outputVals = output.values;\n const outputBatchStrides = convInfo.outShape[1] * convInfo.outShape[2] *\n convInfo.outShape[3] * convInfo.outShape[4];\n const outputDepthStrides = convInfo.outShape[2] * convInfo.outShape[3] * convInfo.outShape[4];\n const outputRowStrides = convInfo.outShape[3] * convInfo.outShape[4];\n const outputColStrides = convInfo.outShape[4];\n for (let batch = 0; batch < convInfo.batchSize; ++batch) {\n const outputBatchOffset = batch * outputBatchStrides;\n const inputBatchOffset = batch * strides[0];\n for (let channel = 0; channel < convInfo.inChannels; ++channel) {\n for (let yDepth = 0; yDepth < convInfo.outDepth; ++yDepth) {\n const xDepthCorner = yDepth * strideDepth - padFront;\n let xDepthMin = xDepthCorner;\n while (xDepthMin < 0) {\n xDepthMin += dilationDepth;\n }\n const xDepthMax = Math.min(convInfo.inDepth, effectiveFilterDepth + xDepthCorner);\n const outputDepthOffset = outputBatchOffset + yDepth * outputDepthStrides;\n for (let yRow = 0; yRow < convInfo.outHeight; ++yRow) {\n const xRowCorner = yRow * strideHeight - padTop;\n let xRowMin = xRowCorner;\n while (xRowMin < 0) {\n xRowMin += dilationHeight;\n }\n const xRowMax = Math.min(convInfo.inHeight, effectiveFilterHeight + xRowCorner);\n const outputRowOffset = outputDepthOffset + yRow * outputRowStrides;\n for (let yCol = 0; yCol < convInfo.outWidth; ++yCol) {\n const xColCorner = yCol * strideWidth - padLeft;\n let xColMin = xColCorner;\n while (xColMin < 0) {\n xColMin += dilationWidth;\n }\n const xColMax = Math.min(convInfo.inWidth, effectiveFilterWidth + xColCorner);\n // Shader code begins\n const outputColOffset = outputRowOffset + yCol * outputColStrides;\n let minMaxValue = initialValue;\n let avgValue = 0;\n let count = 0;\n for (let xDepth = xDepthMin; xDepth < xDepthMax; xDepth += dilationDepth) {\n const xDepthOffset = inputBatchOffset + xDepth * strides[1];\n for (let xRow = xRowMin; xRow < xRowMax; xRow += dilationHeight) {\n const xRowOffset = xDepthOffset + xRow * strides[2];\n for (let xCol = xColMin; xCol < xColMax; xCol += dilationWidth) {\n const xColOffset = xRowOffset + xCol * strides[3];\n const pixel = xValues[xColOffset + channel];\n if ((poolType === 'max' && pixel > minMaxValue)) {\n minMaxValue = pixel;\n }\n else if (poolType === 'avg') {\n avgValue += pixel;\n count++;\n }\n if (isNaN(minMaxValue)) {\n break;\n }\n }\n if (isNaN(minMaxValue)) {\n break;\n }\n }\n if (isNaN(minMaxValue)) {\n break;\n }\n }\n const outputOffset = outputColOffset + channel;\n outputVals[outputOffset] =\n poolType === 'avg' ? avgValue / count : minMaxValue;\n }\n }\n }\n }\n }\n return output;\n}\nexport function maxPool3dPositions(xBuf, convInfo) {\n const maxPositions = buffer(convInfo.outShape, 'int32');\n const strideDepth = convInfo.strideDepth;\n const strideHeight = convInfo.strideHeight;\n const strideWidth = convInfo.strideWidth;\n const dilationDepth = convInfo.dilationDepth;\n const dilationHeight = convInfo.dilationHeight;\n const dilationWidth = convInfo.dilationWidth;\n const effectiveFilterDepth = convInfo.effectiveFilterDepth;\n const effectiveFilterHeight = convInfo.effectiveFilterHeight;\n const effectiveFilterWidth = convInfo.effectiveFilterWidth;\n const padFront = convInfo.padInfo.front;\n const padTop = convInfo.padInfo.top;\n const padLeft = convInfo.padInfo.left;\n for (let batch = 0; batch < convInfo.batchSize; ++batch) {\n for (let channel = 0; channel < convInfo.inChannels; ++channel) {\n for (let yDepth = 0; yDepth < convInfo.outDepth; ++yDepth) {\n const xDepthCorner = yDepth * strideDepth - padFront;\n let xDepthMin = xDepthCorner;\n while (xDepthMin < 0) {\n xDepthMin += dilationDepth;\n }\n const xDepthMax = Math.min(convInfo.inDepth, effectiveFilterDepth + xDepthCorner);\n for (let yRow = 0; yRow < convInfo.outHeight; ++yRow) {\n const xRowCorner = yRow * strideHeight - padTop;\n let xRowMin = xRowCorner;\n while (xRowMin < 0) {\n xRowMin += dilationHeight;\n }\n const xRowMax = Math.min(convInfo.inHeight, effectiveFilterHeight + xRowCorner);\n for (let yCol = 0; yCol < convInfo.outWidth; ++yCol) {\n const xColCorner = yCol * strideWidth - padLeft;\n let xColMin = xColCorner;\n while (xColMin < 0) {\n xColMin += dilationWidth;\n }\n const xColMax = Math.min(convInfo.inWidth, effectiveFilterWidth + xColCorner);\n // Shader code begins\n let maxValue = Number.NEGATIVE_INFINITY;\n let maxPosition = -1;\n for (let xDepth = xDepthMin; xDepth < xDepthMax; xDepth += dilationDepth) {\n const wDepth = xDepth - xDepthCorner;\n for (let xRow = xRowMin; xRow < xRowMax; xRow += dilationHeight) {\n const wRow = xRow - xRowCorner;\n for (let xCol = xColMin; xCol < xColMax; xCol += dilationWidth) {\n const wCol = xCol - xColCorner;\n const pixel = xBuf.get(batch, xDepth, xRow, xCol, channel);\n if (pixel >= maxValue) {\n maxValue = pixel;\n maxPosition =\n wDepth * effectiveFilterHeight * effectiveFilterWidth +\n wRow * effectiveFilterHeight + wCol;\n }\n }\n }\n }\n maxPositions.set(maxPosition, batch, yDepth, yRow, yCol, channel);\n }\n }\n }\n }\n }\n return maxPositions;\n}\n//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicG9vbF91dGlscy5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uLy4uL3RmanMtYmFja2VuZC1jcHUvc3JjL3V0aWxzL3Bvb2xfdXRpbHMudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUE7Ozs7Ozs7Ozs7Ozs7OztHQWVHO0FBRUgsT0FBTyxFQUFlLE1BQU0sRUFBMkMsTUFBTSx1QkFBdUIsQ0FBQztBQUVyRyxNQUFNLFVBQVUsSUFBSSxDQUNoQixPQUFtQixFQUFFLE1BQWdCLEVBQUUsS0FBZSxFQUFFLE9BQWlCLEVBQ3pFLFFBQWlDLEVBQ2pDLFFBQXFCO0lBQ3ZCLE1BQU0sWUFBWSxHQUFHLFFBQVEsQ0FBQyxZQUFZLENBQUM7SUFDM0MsTUFBTSxXQUFXLEdBQUcsUUFBUSxDQUFDLFdBQVcsQ0FBQztJQUN6QyxNQUFNLGNBQWMsR0FBRyxRQUFRLENBQUMsY0FBYyxDQUFDO0lBQy9DLE1BQU0sYUFBYSxHQUFHLFFBQVEsQ0FBQyxhQUFhLENBQUM7SUFDN0MsTUFBTSxxQkFBcUIsR0FBRyxRQUFRLENBQUMscUJBQXFCLENBQUM7SUFDN0QsTUFBTSxvQkFBb0IsR0FBRyxRQUFRLENBQUMsb0JBQW9CLENBQUM7SUFDM0QsTUFBTSxNQUFNLEdBQUcsUUFBUSxDQUFDLE9BQU8sQ0FBQyxHQUFHLENBQUM7SUFDcEMsTUFBTSxPQUFPLEdBQUcsUUFBUSxDQUFDLE9BQU8sQ0FBQyxJQUFJLENBQUM7SUFFdEMsTUFBTSxZQUFZLEdBQ2QsQ0FBQyxRQUFRLEtBQUssS0FBSyxDQUFDLENBQUMsQ0FBQyxNQUFNLENBQUMsaUJBQWlCLENBQUMsQ0FBQztRQUMxQixNQUFNLENBQUMsaUJBQWlCLENBQUMsQ0FBQztJQUVwRCxNQUFNLE1BQU0sR0FBRyxNQUFNLENBQUMsUUFBUSxDQUFDLFFBQVEsRUFBRSxLQUFLLENBQUMsQ0FBQztJQUNoRCxNQUFNLFVBQVUsR0FBRyxNQUFNLENBQUMsTUFBTSxDQUFDO0lBRWpDLE1BQU0sa0JBQWtC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WSxDQUFDLEdBQUcsQ0FBQyxXQUFXLEVBQUUsS0FBSyxFQUFFLE1BQU0sRUFBRSxJQUFJLEVBQUUsSUFBSSxFQUFFLE9BQU8sQ0FBQyxDQUFDO3FCQUNuRTtpQkFDRjthQUNGO1NBQ0Y7S0FDRjtJQUVELE9BQU8sWUFBWSxDQUFDO0FBQ3RCLENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyIvKipcbiAqIEBsaWNlbnNlXG4gKiBDb3B5cmlnaHQgMjAyMCBHb29nbGUgTExDLiBBbGwgUmlnaHRzIFJlc2VydmVkLlxuICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlIFwiTGljZW5zZVwiKTtcbiAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS5cbiAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdFxuICpcbiAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMFxuICpcbiAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmVcbiAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuIFwiQVMgSVNcIiBCQVNJUyxcbiAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLlxuICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZFxuICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuXG4gKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuICovXG5cbmltcG9ydCB7YmFja2VuZF91dGlsLCBidWZmZXIsIERhdGFUeXBlLCBSYW5rLCBUZW5zb3JCdWZmZXIsIFR5cGVkQXJyYXl9IGZyb20gJ0B0ZW5zb3JmbG93L3RmanMtY29yZSc7XG5cbmV4cG9ydCBmdW5jdGlvbiBwb29sKFxuICAgIHhWYWx1ZXM6IFR5cGVkQXJyYXksIHhTaGFwZTogbnVtYmVyW10sIGR0eXBlOiBEYXRhVHlwZSwgc3RyaWRlczogbnVtYmVyW10sXG4gICAgY29udkluZm86IGJhY2tlbmRfdXRpbC5Db252MkRJbmZvLFxuICAgIHBvb2xUeXBlOiAnbWF4J3wnYXZnJyk6IFRlbnNvckJ1ZmZlcjxSYW5rLCBEYXRhVHlwZT4ge1xuICBjb25zdCBzdHJpZGVIZWlnaHQgPSBjb252SW5mby5zdHJpZGVIZWlnaHQ7XG4gIGNvbnN0IHN0cmlkZVdpZHRoID0gY29udkluZm8uc3RyaWRlV2lkdGg7XG4gIGNvbnN0IGRpbGF0aW9uSGVpZ2h0ID0gY29udkluZm8uZGlsYXRpb25IZWlnaHQ7XG4gIGNvbnN0IGRpbGF0aW9uV2lkdGggPSBjb252SW5mby5kaWxhdGlvbldpZHRoO1xuICBjb25zdCBlZmZlY3RpdmVGaWx0ZXJIZWlnaHQgPSBjb252SW5mby5lZmZlY3RpdmVGaWx0ZXJIZWlnaHQ7XG4gIGNvbnN0IGVmZmVjdGl2ZUZpbHRlcldpZHRoID0gY29udkluZm8uZWZmZWN0aXZlRmlsdGVyV2lkdGg7XG4gIGNvbnN0IHBhZFRvcCA9IGNvbnZJbmZvLnBhZEluZm8udG9wO1xuICBjb25zdCBwYWRMZWZ0ID0gY29udkluZm8ucGFkSW5mby5sZWZ0O1xuXG4gIGNvbnN0IGluaXRpYWxWYWx1ZSA9XG4gICAgICAocG9vbFR5cGUgPT09ICdtYXgnID8gTnVtYmVyLk5FR0FUSVZFX0lORklOSVRZIDpcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBOdW1iZXIuUE9TSVRJVkVfSU5GSU5JVFkpO1xuXG4gIGNvbnN0IG91dHB1dCA9IGJ1ZmZlcihjb252SW5mby5vdXRTaGFwZSwgZHR5cGUpO1xuICBjb25zdCBvdXRwdXRWYWxzID0gb3V0cHV0LnZhbHVlcztcblxuICBjb25zdCBvdXRwdXRCYXRjaFN0cmlkZXMgPVxuICAgICAgY29udkluZm8ub3V0U2hhcGVbMV0gKiBjb252SW5mby5vdXRTaGFwZVsyXSAqIGNvbnZJbmZvLm91dFNoYXBlWzNdO1xuICBjb25zdCBvdXRwdXRSb3dTdHJpZGVzID0gY29udkluZm8ub3V0U2hhcGVbMl0gKiBjb252SW5mby5vdXRTaGFwZVszXTtcbiAgY29uc3Qgb3V0cHV0Q29sU3RyaWRlcyA9IGNvbnZJbmZvLm91dFNoYXBlWzNdO1xuXG4gIGZvciAobGV0IGIgPSAwOyBiIDwgY29udkluZm8uYmF0Y2hTaXplOyArK2IpIHtcbiAgICBjb25zdCBvdXRwdXRCYXRjaE9mZnNldCA9IGIgKiBvdXRwdXRCYXRjaFN0cmlkZXM7XG4gICAgY29uc3QgaW5wdXRCYXRjaE9mZnNldCA9IGIgKiBzdHJpZGVzWzBdO1xuICAgIGZvciAobGV0IGQgPSAwOyBkIDwgY29udkluZm8uaW5DaGFubmVsczsgKytkKSB7XG4gICAgICBmb3IgKGxldCB5UiA9IDA7IHlSIDwgY29udkluZm8ub3V0SGVpZ2h0OyArK3lSKSB7XG4gICAgICAgIGNvbnN0IHhSQ29ybmVyID0geVIgKiBzdHJpZGVIZWlnaHQgLSBwYWRUb3A7XG4gICAgICAgIGNvbnN0IHhSTWluID0gTWF0aC5tYXgoMCwgeFJDb3JuZXIpO1xuICAgICAgICBjb25zdCB4Uk1heCA9XG4gICAgICAgICAgICBNYXRoLm1pbihjb252SW5mby5pbkhlaWdodCwgZWZmZWN0aXZlRmlsdGVySGVpZ2h0ICsgeFJDb3JuZXIpO1xuICAgICAgICBjb25zdCBvdXRwdXRSb3dPZmZzZXQgPSBvdXRwdXRCYXRjaE9mZnNldCArIHlSICogb3V0cHV0Um93U3RyaWRlcztcbiAgICAgICAgZm9yIChsZXQgeUMgPSAwOyB5QyA8IGNvbnZJbmZvLm91dFdpZHRoOyArK3lDKSB7XG4gICAgICAgICAgY29uc3QgeENDb3JuZXIgPSB5QyAqIHN0cmlkZVdpZHRoIC0gcGFkTGVmdDtcbiAgICAgICAgICBjb25zdCB4Q01pbiA9IE1hdGgubWF4KDAsIHhDQ29ybmVyKTtcbiAgICAgICAgICBjb25zdCB4Q01heCA9XG4gICAgICAgICAgICAgIE1hdGgubWluKGNvbnZJbmZvLmluV2lkdGgsIGVmZmVjdGl2ZUZpbHRlcldpZHRoICsgeENDb3JuZXIpO1xuICAgICAgICAgIGxldCBtaW5NYXhWYWx1ZSA9IGluaXRpYWxWYWx1ZTtcbiAgICAgICAgICBsZXQgYXZnVmFsdWUgPSAwO1xuICAgICAgICAgIGxldCBjb3VudCA9IDA7XG4gICAgICAgICAgZm9yIChsZXQgeFIgPSB4Uk1pbjsgeFIgPCB4Uk1heDsgeFIgKz0gZGlsYXRpb25IZWlnaHQpIHtcbiAgICAgICAgICAgIGNvbnN0IHhST2Zmc2V0ID0gaW5wdXRCYXRjaE9mZnNldCArIHhSICogc3RyaWRlc1sxXTtcbiAgICAgICAgICAgIGZvciAobGV0IHhDID0geENNaW47IHhDIDwgeENNYXg7IHhDICs9IGRpbGF0aW9uV2lkdGgpIHtcbiAgICAgICAgICAgICAgY29uc3QgeENPZmZzZXQgPSB4Uk9mZnNldCArIHhDICogc3RyaWRlc1syXTtcbiAgICAgICAgICAgICAgY29uc3QgcGl4ZWwgPSB4VmFsdWVzW3hDT2Zmc2V0ICsgZF07XG4gICAgICAgICAgICAgIGlmICgocG9vbFR5cGUgPT09ICdtYXgnICYmIHBpeGVsID4gbWluTWF4VmFsdWUpKSB7XG4gICAgICAgICAgICAgICAgbWluTWF4VmFsdWUgPSBwaXhlbDtcbiAgICAgICAgICAgICAgfSBlbHNlIGlmIChwb29sVHlwZSA9PT0gJ2F2ZycpIHtcbiAgICAgICAgICAgICAgICBhdmdWYWx1ZSArPSBwaXhlbDtcbiAgICAgICAgICAgICAgICBjb3VudCsrO1xuICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBpZiAoaXNOYU4obWluTWF4VmFsdWUpKSB7XG4gICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgfVxuICAgICAgICAgIH1cbiAgICAgICAgICBjb25zdCBvdXRwdXRPZmZzZXQgPSBvdXRwdXRSb3dPZmZzZXQgKyB5QyAqIG91dHB1dENvbFN0cmlkZXMgKyBkO1xuICAgICAgICAgIG91dHB1dFZhbHNbb3V0cHV0T2Zmc2V0XSA9XG4gICAgICAgICAgICAgIHBvb2xUeXBlID09PSAnYXZnJyA/IGF2Z1ZhbHVlIC8gY291bnQgOiBtaW5NYXhWYWx1ZTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH1cbiAgfVxuICByZXR1cm4gb3V0cHV0O1xufVxuXG5leHBvcnQgZnVuY3Rpb24gbWF4UG9vbFBvc2l0aW9ucyhcbiAgICB4VmFsdWVzOiBUeXBlZEFycmF5LCB4U2hhcGU6IG51bWJlcltdLCBkdHlwZTogRGF0YVR5cGUsXG4gICAgY29udkluZm86IGJhY2tlbmRfdXRpbC5Db252MkRJbmZvLCBmbGF0dGVuUG9zaXRpb25zID0gZmFsc2UsXG4gICAgaW5jbHVkZUJhdGNoSW5JbmRleCA9IGZhbHNlKTogVGVuc29yQnVmZmVyPFJhbmssICdpbnQzMic+IHtcbiAgY29uc3QgbWF4UG9zaXRpb25zID0gYnVmZmVyKGNvbnZJbmZvLm91dFNoYXBlLCAnaW50MzInKTtcbiAgY29uc3Qgc3RyaWRlSGVpZ2h0ID0gY29udkluZm8uc3RyaWRlSGVpZ2h0O1xuICBjb25zdCBzdHJpZGVXaWR0aCA9IGNvbnZJbmZvLnN0cmlkZVdpZHRoO1xuICBjb25zdCBkaWxhdGlvbkhlaWdodCA9IGNvbnZJbmZvLmRpbGF0aW9uSGVpZ2h0O1xuICBjb25zdCBkaWxhdGlvbldpZHRoID0gY29udkluZm8uZGlsYXRpb25XaWR0aDtcbiAgY29uc3QgZWZmZWN0aXZlRmlsdGVySGVpZ2h0ID0gY29udkluZm8uZWZmZWN0aXZlRmlsdGVySGVpZ2h0O1xuICBjb25zdCBlZmZlY3RpdmVGaWx0ZXJXaWR0aCA9IGNvbnZJbmZvLmVmZmVjdGl2ZUZpbHRlcldpZHRoO1xuICBjb25zdCBwYWRUb3AgPSBjb252SW5mby5wYWRJbmZvLnRvcDtcbiAgY29uc3QgcGFkTGVmdCA9IGNvbnZJbmZvLnBhZEluZm8ubGVmdDtcblxuICBjb25zdCB4QnVmID0gYnVmZmVyKHhTaGFwZSwgZHR5cGUsIHhWYWx1ZXMpO1xuICBmb3IgKGxldCBiID0gMDsgYiA8IGNvbnZJbmZvLmJhdGNoU2l6ZTsgKytiKSB7XG4gICAgZm9yIChsZXQgZCA9IDA7IGQgPCBjb252SW5mby5pbkNoYW5uZWxzOyArK2QpIHtcbiAgICAgIGZvciAobGV0IHlSID0gMDsgeVIgPCBjb252SW5mby5vdXRIZWlnaHQ7ICsreVIpIHtcbiAgICAgICAgY29uc3QgeFJDb3JuZXIgPSB5UiAqIHN0cmlkZUhlaWdodCAtIHBhZFRvcDtcbiAgICAgICAgbGV0IHhSTWluID0geFJDb3JuZXI7XG4gICAgICAgIHdoaWxlICh4Uk1pbiA8IDApIHtcbiAgICAgICAgICB4Uk1pbiArPSBkaWxhdGlvbkhlaWdodDtcbiAgICAgICAgfVxuICAgICAgICAvLyBjb25zdCB4Uk1pbiA9IE1hdGgubWF4KDAsIHhSQ29ybmVyKTtcbiAgICAgICAgY29uc3QgeFJNYXggPVxuICAgICAgICAgICAgTWF0aC5taW4oY29udkluZm8uaW5IZWlnaHQsIGVmZmVjdGl2ZUZpbHRlckhlaWdodCArIHhSQ29ybmVyKTtcbiAgICAgICAgZm9yIChsZXQgeUMgPSAwOyB5QyA8IGNvbnZJbmZvLm91dFdpZHRoOyArK3lDKSB7XG4gICAgICAgICAgY29uc3QgeENDb3JuZXIgPSB5QyAqIHN0cmlkZVdpZHRoIC0gcGFkTGVmdDtcbiAgICAgICAgICBsZXQgeENNaW4gPSB4Q0Nvcm5lcjtcbiAgICAgICAgICB3aGlsZSAoeENNaW4gPCAwKSB7XG4gICAgICAgICAgICB4Q01pbiArPSBkaWxhdGlvbldpZHRoO1xuICAgICAgICAgIH1cbiAgICAgICAgICBjb25zdCB4Q01heCA9XG4gICAgICAgICAgICAgIE1hdGgubWluKGNvbnZJbmZvLmluV2lkdGgsIGVmZmVjdGl2ZUZpbHRlcldpZHRoICsgeENDb3JuZXIpO1xuICAgICAgICAgIGxldCBtYXhWYWx1ZSA9IE51bWJlci5ORUdBVElWRV9JTkZJTklUWTtcbiAgICAgICAgICBsZXQgbWF4UG9zaXRpb24gPSAtMTtcblxuICAgICAgICAgIGZvciAobGV0IHhSID0geFJNaW47IHhSIDwgeFJNYXg7IHhSICs9IGRpbGF0aW9uSGVpZ2h0KSB7XG4gICAgICAgICAgICBjb25zdCB3UiA9IHhSIC0geFJDb3JuZXI7XG4gICAgICAgICAgICBmb3IgKGxldCB4QyA9IHhDTWluOyB4QyA8IHhDTWF4OyB4QyArPSBkaWxhdGlvbldpZHRoKSB7XG4gICAgICAgICAgICAgIGNvbnN0IHdDID0geEMgLSB4Q0Nvcm5lcjtcbiAgICAgICAgICAgICAgY29uc3QgcGl4ZWwgPSB4QnVmLmdldChiLCB4UiwgeEMsIGQpO1xuICAgICAgICAgICAgICBpZiAocGl4ZWwgPiBtYXhWYWx1ZSkge1xuICAgICAgICAgICAgICAgIG1heFZhbHVlID0gcGl4ZWwgYXMgbnVtYmVyO1xuICAgICAgICAgICAgICAgIGlmIChmbGF0dGVuUG9zaXRpb25zKSB7XG4gICAgICAgICAgICAgICAgICBtYXhQb3NpdGlvbiA9IGluY2x1ZGVCYXRjaEluSW5kZXggP1xuICAgICAgICAgICAgICAgICAgICAgICgoYiAqIGNvbnZJbmZvLmluSGVpZ2h0ICsgeFIpICogY29udkluZm8uaW5XaWR0aCArIHhDKSAqXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb252SW5mby5pbkNoYW5uZWxzICtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgZCA6XG4gICAgICAgICAgICAgICAgICAgICAgKHhSICogY29udkluZm8uaW5XaWR0aCArIHhDKSAqIGNvbnZJbmZvLmluQ2hhbm5lbHMgKyBkO1xuICAgICAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgICBtYXhQb3NpdGlvbiA9IHdSICogZWZmZWN0aXZlRmlsdGVyV2lkdGggKyB3QztcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9XG4gICAgICAgICAgbWF4UG9zaXRpb25zLnNldChtYXhQb3NpdGlvbiwgYiwgeVIsIHlDLCBkKTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH1cbiAgfVxuICByZXR1cm4gbWF4UG9zaXRpb25zO1xufVxuXG5leHBvcnQgZnVuY3Rpb24gcG9vbDNkKFxuICAgIHhWYWx1ZXM6IFR5cGVkQXJyYXksIHhTaGFwZTogbnVtYmVyW10sIGR0eXBlOiBEYXRhVHlwZSwgc3RyaWRlczogbnVtYmVyW10sXG4gICAgY29udkluZm86IGJhY2tlbmRfdXRpbC5Db252M0RJbmZvLFxuICAgIHBvb2xUeXBlOiAnbWF4J3wnYXZnJyk6IFRlbnNvckJ1ZmZlcjxSYW5rLCBEYXRhVHlwZT4ge1xuICBjb25zdCBzdHJpZGVEZXB0aCA9IGNvbnZJbmZvLnN0cmlkZURlcHRoO1xuICBjb25zdCBzdHJpZGVIZWlnaHQgPSBjb252SW5mby5zdHJpZGVIZWlnaHQ7XG4gIGNvbnN0IHN0cmlkZVdpZHRoID0gY29udkluZm8uc3RyaWRlV2lkdGg7XG4gIGNvbnN0IGRpbGF0aW9uRGVwdGggPSBjb252SW5mby5kaWxhdGlvbkRlcHRoO1xuICBjb25zdCBkaWxhdGlvbkhlaWdodCA9IGNvbnZJbmZvLmRpbGF0aW9uSGVpZ2h0O1xuICBjb25zdCBkaWxhdGlvbldpZHRoID0gY29udkluZm8uZGlsYXRpb25XaWR0aDtcbiAgY29uc3QgZWZmZWN0aXZlRmlsdGVyRGVwdGggPSBjb252SW5mby5lZmZlY3RpdmVGaWx0ZXJEZXB0aDtcbiAgY29uc3QgZWZmZWN0aXZlRmlsdGVySGVpZ2h0ID0gY29udkluZm8uZWZmZWN0aXZlRmlsdGVySGVpZ2h0O1xuICBjb25zdCBlZmZlY3RpdmVGaWx0ZXJXaWR0aCA9IGNvbnZJbmZvLmVmZmVjdGl2ZUZpbHRlcldpZHRoO1xuICBjb25zdCBwYWRGcm9udCA9IGNvbnZJbmZvLnBhZEluZm8uZnJvbnQ7XG4gIGNvbnN0IHBhZFRvcCA9IGNvbnZJbmZvLnBhZEluZm8udG9wO1xuICBjb25zdCBwYWRMZWZ0ID0gY29udkluZm8ucGFkSW5mby5sZWZ0O1xuXG4gIGNvbnN0IGluaXRpYWxWYWx1ZSA9XG4gICAgICAocG9vbFR5cGUgPT09ICdtYXgnID8gTnVtYmVyLk5FR0FUSVZFX0lORklOSVRZIDpcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBOdW1iZXIuUE9TSVRJVkVfSU5GSU5JVFkpO1xuXG4gIGNvbnN0IG91dHB1dCA9IGJ1ZmZlcihjb252SW5mby5vdXRTaGFwZSwgZHR5cGUpO1xuICBjb25zdCBvdXRwdXRWYWxzID0gb3V0cHV0LnZhbHVlcztcblxuICBjb25zdCBvdXRwdXRCYXRjaFN0cmlkZXMgPSBjb252SW5mby5vdXRTaGFwZVsxXSAqIGNvbnZJbmZvLm91dFNoYXBlWzJdICpcbiAgICAgIGNvbnZJbmZvLm91dFNoYXBlWzNdICogY29udkluZm8ub3V0U2hhcGVbNF07XG4gIGNvbnN0IG91dHB1dERlcHRoU3RyaWRlcyA9XG4gICAgICBjb252SW5mby5vdXRTaGFwZVsyXSAqIGNvbnZJbmZvLm91dFNoYXBlWzNdICogY29udkluZm8ub3V0U2hhcGVbNF07XG4gIGNvbnN0IG91dHB1dFJvd1N0cmlkZXMgPSBjb252SW5mby5vdXRTaGFwZVszXSAqIGNvbnZJbmZvLm91dFNoYXBlWzRdO1xuICBjb25zdCBvdXRwdXRDb2xTdHJpZGVzID0gY29udkluZm8ub3V0U2hhcGVbNF07XG5cbiAgZm9yIChsZXQgYmF0Y2ggPSAwOyBiYXRjaCA8IGNvbnZJbmZvLmJhdGNoU2l6ZTsgKytiYXRjaCkge1xuICAgIGNvbnN0IG91dHB1dEJhdGNoT2Zmc2V0ID0gYmF0Y2ggKiBvdXRwdXRCYXRjaFN0cmlkZXM7XG4gICAgY29uc3QgaW5wdXRCYXRjaE9mZnNldCA9IGJhdGNoICogc3RyaWRlc1swXTtcbiAgICBmb3IgKGxldCBjaGFubmVsID0gMDsgY2hhbm5lbCA8IGNvbnZJbmZvLmluQ2hhbm5lbHM7ICsrY2hhbm5lbCkge1xuICAgICAgZm9yIChsZXQgeURlcHRoID0gMDsgeURlcHRoIDwgY29udkluZm8ub3V0RGVwdGg7ICsreURlcHRoKSB7XG4gICAgICAgIGNvbnN0IHhEZXB0aENvcm5lciA9IHlEZXB0aCAqIHN0cmlkZURlcHRoIC0gcGFkRnJvbnQ7XG4gICAgICAgIGxldCB4RGVwdGhNaW4gPSB4RGVwdGhDb3JuZXI7XG4gICAgICAgIHdoaWxlICh4RGVwdGhNaW4gPCAwKSB7XG4gICAgICAgICAgeERlcHRoTWluICs9IGRpbGF0aW9uRGVwdGg7XG4gICAgICAgIH1cbiAgICAgICAgY29uc3QgeERlcHRoTWF4ID1cbiAgICAgICAgICAgIE1hdGgubWluKGNvbnZJbmZvLmluRGVwdGgsIGVmZmVjdGl2ZUZpbHRlckRlcHRoICsgeERlcHRoQ29ybmVyKTtcbiAgICAgICAgY29uc3Qgb3V0cHV0RGVwdGhPZmZzZXQgPVxuICAgICAgICAgICAgb3V0cHV0QmF0Y2hPZmZzZXQgKyB5RGVwdGggKiBvdXRwdXREZXB0aFN0cmlkZXM7XG4gICAgICAgIGZvciAobGV0IHlSb3cgPSAwOyB5Um93IDwgY29udkluZm8ub3V0SGVpZ2h0OyArK3lSb3cpIHtcbiAgICAgICAgICBjb25zdCB4Um93Q29ybmVyID0geVJvdyAqIHN0cmlkZUhlaWdodCAtIHBhZFRvcDtcbiAgICAgICAgICBsZXQgeFJvd01pbiA9IHhSb3dDb3JuZXI7XG4gICAgICAgICAgd2hpbGUgKHhSb3dNaW4gPCAwKSB7XG4gICAgICAgICAgICB4Um93TWluICs9IGRpbGF0aW9uSGVpZ2h0O1xuICAgICAgICAgIH1cbiAgICAgICAgICBjb25zdCB4Um93TWF4ID1cbiAgICAgICAgICAgICAgTWF0aC5taW4oY29udkluZm8uaW5IZWlnaHQsIGVmZmVjdGl2ZUZpbHRlckhlaWdodCArIHhSb3dDb3JuZXIpO1xuICAgICAgICAgIGNvbnN0IG91dHB1dFJvd09mZnNldCA9IG91dHB1dERlcHRoT2Zmc2V0ICsgeVJvdyAqIG91dHB1dFJvd1N0cmlkZXM7XG4gICAgICAgICAgZm9yIChsZXQgeUNvbCA9IDA7IHlDb2wgPCBjb252SW5mby5vdXRXaWR0aDsgKyt5Q29sKSB7XG4gICAgICAgICAgICBjb25zdCB4Q29sQ29ybmVyID0geUNvbCAqIHN0cmlkZVdpZHRoIC0gcGFkTGVmdDtcbiAgICAgICAgICAgIGxldCB4Q29sTWluID0geENvbENvcm5lcjtcbiAgICAgICAgICAgIHdoaWxlICh4Q29sTWluIDwgMCkge1xuICAgICAgICAgICAgICB4Q29sTWluICs9IGRpbGF0aW9uV2lkdGg7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBjb25zdCB4Q29sTWF4ID1cbiAgICAgICAgICAgICAgICBNYXRoLm1pbihjb252SW5mby5pbldpZHRoLCBlZmZlY3RpdmVGaWx0ZXJXaWR0aCArIHhDb2xDb3JuZXIpO1xuICAgICAgICAgICAgLy8gU2hhZGVyIGNvZGUgYmVnaW5zXG4gICAgICAgICAgICBjb25zdCBvdXRwdXRDb2xPZmZzZXQgPSBvdXRwdXRSb3dPZmZzZXQgKyB5Q29sICogb3V0cHV0Q29sU3RyaWRlcztcbiAgICAgICAgICAgIGxldCBtaW5NYXhWYWx1ZSA9IGluaXRpYWxWYWx1ZTtcbiAgICAgICAgICAgIGxldCBhdmdWYWx1ZSA9IDA7XG4gICAgICAgICAgICBsZXQgY291bnQgPSAwO1xuICAgICAgICAgICAgZm9yIChsZXQgeERlcHRoID0geERlcHRoTWluOyB4RGVwdGggPCB4RGVwdGhNYXg7XG4gICAgICAgICAgICAgICAgIHhEZXB0aCArPSBkaWxhdGlvbkRlcHRoKSB7XG4gICAgICAgICAgICAgIGNvbnN0IHhEZXB0aE9mZnNldCA9IGlucHV0QmF0Y2hPZmZzZXQgKyB4RGVwdGggKiBzdHJpZGVzWzFdO1xuICAgICAgICAgICAgICBmb3IgKGxldCB4Um93ID0geFJvd01pbjsgeFJvdyA8IHhSb3dNYXg7IHhSb3cgKz0gZGlsYXRpb25IZWlnaHQpIHtcbiAgICAgICAgICAgICAgICBjb25zdCB4Um93T2Zmc2V0ID0geERlcHRoT2Zmc2V0ICsgeFJvdyAqIHN0cmlkZXNbMl07XG4gICAgICAgICAgICAgICAgZm9yIChsZXQgeENvbCA9IHhDb2xNaW47IHhDb2wgPCB4Q29sTWF4O1xuICAgICAgICAgICAgICAgICAgICAgeENvbCArPSBkaWxhdGlvbldpZHRoKSB7XG4gICAgICAgICAgICAgICAgICBjb25zdCB4Q29sT2Zmc2V0ID0geFJvd09mZnNldCArIHhDb2wgKiBzdHJpZGVzWzNdO1xuICAgICAgICAgICAgICAgICAgY29uc3QgcGl4ZWwgPSB4VmFsdWVzW3hDb2xPZmZzZXQgKyBjaGFubmVsXTtcbiAgICAgICAgICAgICAgICAgIGlmICgocG9vbFR5cGUgPT09ICdtYXgnICYmIHBpeGVsID4gbWluTWF4VmFsdWUpKSB7XG4gICAgICAgICAgICAgICAgICAgIG1pbk1heFZhbHVlID0gcGl4ZWw7XG4gICAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKHBvb2xUeXBlID09PSAnYXZnJykge1xuICAgICAgICAgICAgICAgICAgICBhdmdWYWx1ZSArPSBwaXhlbDtcbiAgICAgICAgICAgICAgICAgICAgY291bnQrKztcbiAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgIGlmIChpc05hTihtaW5NYXhWYWx1ZSkpIHtcbiAgICAgICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGlmIChpc05hTihtaW5NYXhWYWx1ZSkpIHtcbiAgICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICBpZiAoaXNOYU4obWluTWF4VmFsdWUpKSB7XG4gICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGNvbnN0IG91dHB1dE9mZnNldCA9IG91dHB1dENvbE9mZnNldCArIGNoYW5uZWw7XG4gICAgICAgICAgICBvdXRwdXRWYWxzW291dHB1dE9mZnNldF0gPVxuICAgICAgICAgICAgICAgIHBvb2xUeXBlID09PSAnYXZnJyA/IGF2Z1ZhbHVlIC8gY291bnQgOiBtaW5NYXhWYWx1ZTtcbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9XG4gIH1cblxuICByZXR1cm4gb3V0cHV0O1xufVxuXG5leHBvcnQgZnVuY3Rpb24gbWF4UG9vbDNkUG9zaXRpb25zKFxuICAgIHhCdWY6IFRlbnNvckJ1ZmZlcjxSYW5rLCBEYXRhVHlwZT4sXG4gICAgY29udkluZm86IGJhY2tlbmRfdXRpbC5Db252M0RJbmZvKTogVGVuc29yQnVmZmVyPFJhbmssIERhdGFUeXBlPiB7XG4gIGNvbnN0IG1heFBvc2l0aW9ucyA9IGJ1ZmZlcihjb252SW5mby5vdXRTaGFwZSwgJ2ludDMyJyk7XG4gIGNvbnN0IHN0cmlkZURlcHRoID0gY29udkluZm8uc3RyaWRlRGVwdGg7XG4gIGNvbnN0IHN0cmlkZUhlaWdodCA9IGNvbnZJbmZvLnN0cmlkZUhlaWdodDtcbiAgY29uc3Qgc3RyaWRlV2lkdGggPSBjb252SW5mby5zdHJpZGVXaWR0aDtcbiAgY29uc3QgZGlsYXRpb25EZXB0aCA9IGNvbnZJbmZvLmRpbGF0aW9uRGVwdGg7XG4gIGNvbnN0IGRpbGF0aW9uSGVpZ2h0ID0gY29udkluZm8uZGlsYXRpb25IZWlnaHQ7XG4gIGNvbnN0IGRpbGF0aW9uV2lkdGggPSBjb252SW5mby5kaWxhdGlvbldpZHRoO1xuICBjb25zdCBlZmZlY3RpdmVGaWx0ZXJEZXB0aCA9IGNvbnZJbmZvLmVmZmVjdGl2ZUZpbHRlckRlcHRoO1xuICBjb25zdCBlZmZlY3RpdmVGaWx0ZXJIZWlnaHQgPSBjb252SW5mby5lZmZlY3RpdmVGaWx0ZXJIZWlnaHQ7XG4gIGNvbnN0IGVmZmVjdGl2ZUZpbHRlcldpZHRoID0gY29udkluZm8uZWZmZWN0aXZlRmlsdGVyV2lkdGg7XG4gIGNvbnN0IHBhZEZyb250ID0gY29udkluZm8ucGFkSW5mby5mcm9udDtcbiAgY29uc3QgcGFkVG9wID0gY29udkluZm8ucGFkSW5mby50b3A7XG4gIGNvbnN0IHBhZExlZnQgPSBjb252SW5mby5wYWRJbmZvLmxlZnQ7XG5cbiAgZm9yIChsZXQgYmF0Y2ggPSAwOyBiYXRjaCA8IGNvbnZJbmZvLmJhdGNoU2l6ZTsgKytiYXRjaCkge1xuICAgIGZvciAobGV0IGNoYW5uZWwgPSAwOyBjaGFubmVsIDwgY29udkluZm8uaW5DaGFubmVsczsgKytjaGFubmVsKSB7XG4gICAgICBmb3IgKGxldCB5RGVwdGggPSAwOyB5RGVwdGggPCBjb252SW5mby5vdXREZXB0aDsgKyt5RGVwdGgpIHtcbiAgICAgICAgY29uc3QgeERlcHRoQ29ybmVyID0geURlcHRoICogc3RyaWRlRGVwdGggLSBwYWRGcm9udDtcbiAgICAgICAgbGV0IHhEZXB0aE1pbiA9IHhEZXB0aENvcm5lcjtcbiAgICAgICAgd2hpbGUgKHhEZXB0aE1pbiA8IDApIHtcbiAgICAgICAgICB4RGVwdGhNaW4gKz0gZGlsYXRpb25EZXB0aDtcbiAgICAgICAgfVxuICAgICAgICBjb25zdCB4RGVwdGhNYXggPVxuICAgICAgICAgICAgTWF0aC5taW4oY29udkluZm8uaW5EZXB0aCwgZWZmZWN0aXZlRmlsdGVyRGVwdGggKyB4RGVwdGhDb3JuZXIpO1xuICAgICAgICBmb3IgKGxldCB5Um93ID0gMDsgeVJvdyA8IGNvbnZJbmZvLm91dEhlaWdodDsgKyt5Um93KSB7XG4gICAgICAgICAgY29uc3QgeFJvd0Nvcm5lciA9IHlSb3cgKiBzdHJpZGVIZWlnaHQgLSBwYWRUb3A7XG4gICAgICAgICAgbGV0IHhSb3dNaW4gPSB4Um93Q29ybmVyO1xuICAgICAgICAgIHdoaWxlICh4Um93TWluIDwgMCkge1xuICAgICAgICAgICAgeFJvd01pbiArPSBkaWxhdGlvbkhlaWdodDtcbiAgICAgICAgICB9XG4gICAgICAgICAgY29uc3QgeFJvd01heCA9XG4gICAgICAgICAgICAgIE1hdGgubWluKGNvbnZJbmZvLmluSGVpZ2h0LCBlZmZlY3RpdmVGaWx0ZXJIZWlnaHQgKyB4Um93Q29ybmVyKTtcbiAgICAgICAgICBmb3IgKGxldCB5Q29sID0gMDsgeUNvbCA8IGNvbnZJbmZvLm91dFdpZHRoOyArK3lDb2wpIHtcbiAgICAgICAgICAgIGNvbnN0IHhDb2xDb3JuZXIgPSB5Q29sICogc3RyaWRlV2lkdGggLSBwYWRMZWZ0O1xuICAgICAgICAgICAgbGV0IHhDb2xNaW4gPSB4Q29sQ29ybmVyO1xuICAgICAgICAgICAgd2hpbGUgKHhDb2xNaW4gPCAwKSB7XG4gICAgICAgICAgICAgIHhDb2xNaW4gKz0gZGlsYXRpb25XaWR0aDtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGNvbnN0IHhDb2xNYXggPVxuICAgICAgICAgICAgICAgIE1hdGgubWluKGNvbnZJbmZvLmluV2lkdGgsIGVmZmVjdGl2ZUZpbHRlcldpZHRoICsgeENvbENvcm5lcik7XG5cbiAgICAgICAgICAgIC8vIFNoYWRlciBjb2RlIGJlZ2luc1xuICAgICAgICAgICAgbGV0IG1heFZhbHVlID0gTnVtYmVyLk5FR0FUSVZFX0lORklOSVRZO1xuICAgICAgICAgICAgbGV0IG1heFBvc2l0aW9uID0gLTE7XG5cbiAgICAgICAgICAgIGZvciAobGV0IHhEZXB0aCA9IHhEZXB0aE1pbjsgeERlcHRoIDwgeERlcHRoTWF4O1xuICAgICAgICAgICAgICAgICB4RGVwdGggKz0gZGlsYXRpb25EZXB0aCkge1xuICAgICAgICAgICAgICBjb25zdCB3RGVwdGggPSB4RGVwdGggLSB4RGVwdGhDb3JuZXI7XG4gICAgICAgICAgICAgIGZvciAobGV0IHhSb3cgPSB4Um93TWluOyB4Um93IDwgeFJvd01heDsgeFJvdyArPSBkaWxhdGlvbkhlaWdodCkge1xuICAgICAgICAgICAgICAgIGNvbnN0IHdSb3cgPSB4Um93IC0geFJvd0Nvcm5lcjtcbiAgICAgICAgICAgICAgICBmb3IgKGxldCB4Q29sID0geENvbE1pbjsgeENvbCA8IHhDb2xNYXg7XG4gICAgICAgICAgICAgICAgICAgICB4Q29sICs9IGRpbGF0aW9uV2lkdGgpIHtcbiAgICAgICAgICAgICAgICAgIGNvbnN0IHdDb2wgPSB4Q29sIC0geENvbENvcm5lcjtcbiAgICAgICAgICAgICAgICAgIGNvbnN0IHBpeGVsID0geEJ1Zi5nZXQoYmF0Y2gsIHhEZXB0aCwgeFJvdywgeENvbCwgY2hhbm5lbCk7XG4gICAgICAgICAgICAgICAgICBpZiAocGl4ZWwgPj0gbWF4VmFsdWUpIHtcbiAgICAgICAgICAgICAgICAgICAgbWF4VmFsdWUgPSBwaXhlbCBhcyBudW1iZXI7XG4gICAgICAgICAgICAgICAgICAgIG1heFBvc2l0aW9uID1cbiAgICAgICAgICAgICAgICAgICAgICAgIHdEZXB0aCAqIGVmZmVjdGl2ZUZpbHRlckhlaWdodCAqIGVmZmVjdGl2ZUZpbHRlcldpZHRoICtcbiAgICAgICAgICAgICAgICAgICAgICAgIHdSb3cgKiBlZmZlY3RpdmVGaWx0ZXJIZWlnaHQgKyB3Q29sO1xuICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBtYXhQb3NpdGlvbnMuc2V0KG1heFBvc2l0aW9uLCBiYXRjaCwgeURlcHRoLCB5Um93LCB5Q29sLCBjaGFubmVsKTtcbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9XG4gIH1cblxuICByZXR1cm4gbWF4UG9zaXRpb25zO1xufVxuIl19","/**\n * @license\n * Copyright 2020 Google LLC. All Rights Reserved.\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n * =============================================================================\n */\nimport { AvgPool, backend_util, util } from '@tensorflow/tfjs-core';\nimport { assertNotComplex } from '../cpu_util';\nimport { pool } from '../utils/pool_utils';\nimport { identity } from './Identity';\nexport function avgPool(args) {\n const { inputs, backend, attrs } = args;\n const { x } = inputs;\n assertNotComplex(x, 'avgPool');\n const { filterSize, strides, pad, dimRoundingMode } = attrs;\n const dilations = 1;\n util.assert(backend_util.eitherStridesOrDilationsAreOne(strides, dilations), () => 'Error in avgPool: Either strides or dilations must be 1. ' +\n `Got strides ${strides} and dilations '${dilations}'`);\n const convInfo = backend_util.computePool2DInfo(x.shape, filterSize, strides, dilations, pad, dimRoundingMode);\n let res;\n if (convInfo.filterWidth === 1 && convInfo.filterHeight === 1 &&\n util.arraysEqual(convInfo.inShape, convInfo.outShape)) {\n res = identity({ inputs: { x }, backend });\n }\n else {\n const xValues = backend.data.get(x.dataId).values;\n const strides = util.computeStrides(x.shape);\n const buffer = pool(xValues, x.shape, x.dtype, strides, convInfo, 'avg');\n res = backend.makeTensorInfo(convInfo.outShape, x.dtype, buffer.values);\n }\n return res;\n}\nexport const avgPoolConfig = {\n kernelName: AvgPool,\n backendName: 'cpu',\n kernelFunc: avgPool\n};\n//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiQXZnUG9vbC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uLy4uL3RmanMtYmFja2VuZC1jcHUvc3JjL2tlcm5lbHMvQXZnUG9vbC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQTs7Ozs7Ozs7Ozs7Ozs7O0dBZUc7QUFDSCxPQUFPLEVBQUMsT0FBTyxFQUErQixZQUFZLEVBQW9ELElBQUksRUFBQyxNQUFNLHVCQUF1QixDQUFDO0FBR2pKLE9BQU8sRUFBQyxnQkFBZ0IsRUFBQyxNQUFNLGFBQWEsQ0FBQztBQUM3QyxPQUFPLEVBQUMsSUFBSSxFQUFDLE1BQU0scUJBQXFCLENBQUM7QUFDekMsT0FBTyxFQUFDLFFBQVEsRUFBQyxNQUFNLFlBQVksQ0FBQztBQUVwQyxNQUFNLFVBQVUsT0FBTyxDQUNuQixJQUN5RTtJQUUzRSxNQUFNLEVBQUMsTUFBTSxFQUFFLE9BQU8sRUFBRSxLQUFLLEVBQUMsR0FBRyxJQUFJLENBQUM7SUFDdEMsTUFBTSxFQUFDLENBQUMsRUFBQyxHQUFHLE1BQU0sQ0FBQztJQUNuQixnQkFBZ0IsQ0FBQyxDQUFDLEVBQUUsU0FBUyxDQUFDLENBQUM7SUFDL0IsTUFBTSxFQUFDLFVBQVUsRUFBRSxPQUFPLEVBQUUsR0FBRyxFQUFFLGVBQWUsRUFBQyxHQUFHLEtBQUssQ0FBQztJQUMxRCxNQUFNLFNBQVMsR0FBRyxDQUFDLENBQUM7SUFFcEIsSUFBSSxDQUFDLE1BQU0sQ0FDUCxZQUFZLENBQUMsOEJBQThCLENBQUMsT0FBTyxFQUFFLFNBQVMsQ0FBQyxFQUMvRCxHQUFHLEVBQUUsQ0FBQywyREFBMkQ7UUFDN0QsZUFBZSxPQUFPLG1CQUFtQixTQUFTLEdBQUcsQ0FBQyxDQUFDO0lBRS9ELE1BQU0sUUFBUSxHQUFHLFlBQVksQ0FBQyxpQkFBaUIsQ0FDM0MsQ0FBQyxDQUFDLEtBQXlDLEVBQUUsVUFBVSxFQUFFLE9BQU8sRUFDaEUsU0FBUyxFQUFFLEdBQUcsRUFBRSxlQUFlLENBQUMsQ0FBQztJQUNyQyxJQUFJLEdBQWUsQ0FBQztJQUVwQixJQUFJLFFBQVEsQ0FBQyxXQUFXLEtBQUssQ0FBQyxJQUFJLFFBQVEsQ0FBQyxZQUFZLEtBQUssQ0FBQztRQUN6RCxJQUFJLENBQUMsV0FBVyxDQUFDLFFBQVEsQ0FBQyxPQUFPLEVBQUUsUUFBUSxDQUFDLFFBQVEsQ0FBQyxFQUFFO1FBQ3pELEdBQUcsR0FBRyxRQUFRLENBQUMsRUFBQyxNQUFNLEVBQUUsRUFBQyxDQUFDLEVBQUMsRUFBRSxPQUFPLEVBQUMsQ0FBQyxDQUFDO0tBQ3hDO1NBQU07UUFDTCxNQUFNLE9BQU8sR0FBRyxPQUFPLENBQUMsSUFBSSxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsTUFBTSxDQUFDLENBQUMsTUFBb0IsQ0FBQztRQUNoRSxNQUFNLE9BQU8sR0FBRyxJQUFJLENBQUMsY0FBYyxDQUFDLENBQUMsQ0FBQyxLQUFLLENBQUMsQ0FBQztRQUM3QyxNQUFNLE1BQU0sR0FBRyxJQUFJLENBQUMsT0FBTyxFQUFFLENBQUMsQ0FBQyxLQUFLLEVBQUUsQ0FBQyxDQUFDLEtBQUssRUFBRSxPQUFPLEVBQUUsUUFBUSxFQUFFLEtBQUssQ0FBQyxDQUFDO1FBQ3pFLEdBQUcsR0FBRyxPQUFPLENBQUMsY0FBYyxDQUN4QixRQUFRLENBQUMsUUFBUSxFQUFFLENBQUMsQ0FBQyxLQUFLLEVBQUUsTUFBTSxDQUFDLE1BQW9CLENBQUMsQ0FBQztLQUM5RDtJQUNELE9BQU8sR0FBRyxDQUFDO0FBQ2IsQ0FBQztBQUVELE1BQU0sQ0FBQyxNQUFNLGFBQWEsR0FBaUI7SUFDekMsVUFBVSxFQUFFLE9BQU87SUFDbkIsV0FBVyxFQUFFLEtBQUs7SUFDbEIsVUFBVSxFQUFFLE9BQTJCO0NBQ3hDLENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyIvKipcbiAqIEBsaWNlbnNlXG4gKiBDb3B5cmlnaHQgMjAyMCBHb29nbGUgTExDLiBBbGwgUmlnaHRzIFJlc2VydmVkLlxuICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlIFwiTGljZW5zZVwiKTtcbiAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS5cbiAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdFxuICpcbiAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMFxuICpcbiAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmVcbiAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuIFwiQVMgSVNcIiBCQVNJUyxcbiAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLlxuICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZFxuICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuXG4gKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuICovXG5pbXBvcnQge0F2Z1Bvb2wsIEF2Z1Bvb2xBdHRycywgQXZnUG9vbElucHV0cywgYmFja2VuZF91dGlsLCBLZXJuZWxDb25maWcsIEtlcm5lbEZ1bmMsIFRlbnNvckluZm8sIFR5cGVkQXJyYXksIHV0aWx9IGZyb20gJ0B0ZW5zb3JmbG93L3RmanMtY29yZSc7XG5cbmltcG9ydCB7TWF0aEJhY2tlbmRDUFV9IGZyb20gJy4uL2JhY2tlbmRfY3B1JztcbmltcG9ydCB7YXNzZXJ0Tm90Q29tcGxleH0gZnJvbSAnLi4vY3B1X3V0aWwnO1xuaW1wb3J0IHtwb29sfSBmcm9tICcuLi91dGlscy9wb29sX3V0aWxzJztcbmltcG9ydCB7aWRlbnRpdHl9IGZyb20gJy4vSWRlbnRpdHknO1xuXG5leHBvcnQgZnVuY3Rpb24gYXZnUG9vbChcbiAgICBhcmdzOlxuICAgICAgICB7aW5wdXRzOiBBdmdQb29sSW5wdXRzLCBiYWNrZW5kOiBNYXRoQmFja2VuZENQVSwgYXR0cnM6IEF2Z1Bvb2xBdHRyc30pOlxuICAgIFRlbnNvckluZm8ge1xuICBjb25zdCB7aW5wdXRzLCBiYWNrZW5kLCBhdHRyc30gPSBhcmdzO1xuICBjb25zdCB7eH0gPSBpbnB1dHM7XG4gIGFzc2VydE5vdENvbXBsZXgoeCwgJ2F2Z1Bvb2wnKTtcbiAgY29uc3Qge2ZpbHRlclNpemUsIHN0cmlkZXMsIHBhZCwgZGltUm91bmRpbmdNb2RlfSA9IGF0dHJzO1xuICBjb25zdCBkaWxhdGlvbnMgPSAxO1xuXG4gIHV0aWwuYXNzZXJ0KFxuICAgICAgYmFja2VuZF91dGlsLmVpdGhlclN0cmlkZXNPckRpbGF0aW9uc0FyZU9uZShzdHJpZGVzLCBkaWxhdGlvbnMpLFxuICAgICAgKCkgPT4gJ0Vycm9yIGluIGF2Z1Bvb2w6IEVpdGhlciBzdHJpZGVzIG9yIGRpbGF0aW9ucyBtdXN0IGJlIDEuICcgK1xuICAgICAgICAgIGBHb3Qgc3RyaWRlcyAke3N0cmlkZXN9IGFuZCBkaWxhdGlvbnMgJyR7ZGlsYXRpb25zfSdgKTtcblxuICBjb25zdCBjb252SW5mbyA9IGJhY2tlbmRfdXRpbC5jb21wdXRlUG9vbDJESW5mbyhcbiAgICAgIHguc2hhcGUgYXMgW251bWJlciwgbnVtYmVyLCBudW1iZXIsIG51bWJlcl0sIGZpbHRlclNpemUsIHN0cmlkZXMsXG4gICAgICBkaWxhdGlvbnMsIHBhZCwgZGltUm91bmRpbmdNb2RlKTtcbiAgbGV0IHJlczogVGVuc29ySW5mbztcblxuICBpZiAoY29udkluZm8uZmlsdGVyV2lkdGggPT09IDEgJiYgY29udkluZm8uZmlsdGVySGVpZ2h0ID09PSAxICYmXG4gICAgICB1dGlsLmFycmF5c0VxdWFsKGNvbnZJbmZvLmluU2hhcGUsIGNvbnZJbmZvLm91dFNoYXBlKSkge1xuICAgIHJlcyA9IGlkZW50aXR5KHtpbnB1dHM6IHt4fSwgYmFja2VuZH0pO1xuICB9IGVsc2Uge1xuICAgIGNvbnN0IHhWYWx1ZXMgPSBiYWNrZW5kLmRhdGEuZ2V0KHguZGF0YUlkKS52YWx1ZXMgYXMgVHlwZWRBcnJheTtcbiAgICBjb25zdCBzdHJpZGVzID0gdXRpbC5jb21wdXRlU3RyaWRlcyh4LnNoYXBlKTtcbiAgICBjb25zdCBidWZmZXIgPSBwb29sKHhWYWx1ZXMsIHguc2hhcGUsIHguZHR5cGUsIHN0cmlkZXMsIGNvbnZJbmZvLCAnYXZnJyk7XG4gICAgcmVzID0gYmFja2VuZC5tYWtlVGVuc29ySW5mbyhcbiAgICAgICAgY29udkluZm8ub3V0U2hhcGUsIHguZHR5cGUsIGJ1ZmZlci52YWx1ZXMgYXMgVHlwZWRBcnJheSk7XG4gIH1cbiAgcmV0dXJuIHJlcztcbn1cblxuZXhwb3J0IGNvbnN0IGF2Z1Bvb2xDb25maWc6IEtlcm5lbENvbmZpZyA9IHtcbiAga2VybmVsTmFtZTogQXZnUG9vbCxcbiAgYmFja2VuZE5hbWU6ICdjcHUnLFxuICBrZXJuZWxGdW5jOiBhdmdQb29sIGFzIHt9IGFzIEtlcm5lbEZ1bmNcbn07XG4iXX0=","/**\n * @license\n * Copyright 2020 Google LLC. All Rights Reserved.\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n * =============================================================================\n */\nimport { AvgPool3D, backend_util, util } from '@tensorflow/tfjs-core';\nimport { assertNotComplex } from '../cpu_util';\nimport { pool3d } from '../utils/pool_utils';\nexport function avgPool3D(args) {\n const { inputs, backend, attrs } = args;\n const { x } = inputs;\n const { filterSize, strides, pad, dimRoundingMode, dataFormat } = attrs;\n assertNotComplex(x, 'avgPool3d');\n const convInfo = backend_util.computePool3DInfo(x.shape, filterSize, strides, 1 /* dilations */, pad, dimRoundingMode, dataFormat);\n const xValues = backend.data.get(x.dataId).values;\n const outBuf = pool3d(xValues, x.shape, x.dtype, util.computeStrides(x.shape), convInfo, 'avg');\n return backend.makeTensorInfo(outBuf.shape, 'float32', outBuf.values);\n}\nexport const avgPool3DConfig = {\n kernelName: AvgPool3D,\n backendName: 'cpu',\n kernelFunc: avgPool3D\n};\n//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiQXZnUG9vbDNELmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vLi4vdGZqcy1iYWNrZW5kLWNwdS9zcmMva2VybmVscy9BdmdQb29sM0QudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUE7Ozs7Ozs7Ozs7Ozs7OztHQWVHO0FBRUgsT0FBTyxFQUFDLFNBQVMsRUFBbUMsWUFBWSxFQUFvRCxJQUFJLEVBQUMsTUFBTSx1QkFBdUIsQ0FBQztBQUd2SixPQUFPLEVBQUMsZ0JBQWdCLEVBQUMsTUFBTSxhQUFhLENBQUM7QUFDN0MsT0FBTyxFQUFDLE1BQU0sRUFBQyxNQUFNLHFCQUFxQixDQUFDO0FBRTNDLE1BQU0sVUFBVSxTQUFTLENBQUMsSUFJekI7SUFDQyxNQUFNLEVBQUMsTUFBTSxFQUFFLE9BQU8sRUFBRSxLQUFLLEVBQUMsR0FBRyxJQUFJLENBQUM7SUFDdEMsTUFBTSxFQUFDLENBQUMsRUFBQyxHQUFHLE1BQU0sQ0FBQztJQUNuQixNQUFNLEVBQUMsVUFBVSxFQUFFLE9BQU8sRUFBRSxHQUFHLEVBQUUsZUFBZSxFQUFFLFVBQVUsRUFBQyxHQUFHLEtBQUssQ0FBQztJQUV0RSxnQkFBZ0IsQ0FBQyxDQUFDLEVBQUUsV0FBVyxDQUFDLENBQUM7SUFFakMsTUFBTSxRQUFRLEdBQUcsWUFBWSxDQUFDLGlCQUFpQixDQUMzQyxDQUFDLENBQUMsS0FBaUQsRUFBRSxVQUFVLEVBQUUsT0FBTyxFQUN4RSxDQUFDLENBQUMsZUFBZSxFQUFFLEdBQUcsRUFBRSxlQUFlLEVBQUUsVUFBVSxDQUFDLENBQUM7SUFFekQsTUFBTSxPQUFPLEdBQUcsT0FBTyxDQUFDLElBQUksQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLE1BQU0sQ0FBQyxDQUFDLE1BQW9CLENBQUM7SUFDaEUsTUFBTSxNQUFNLEdBQUcsTUFBTSxDQUNqQixPQUFPLEVBQUUsQ0FBQyxDQUFDLEtBQUssRUFBRSxDQUFDLENBQUMsS0FBSyxFQUFFLElBQUksQ0FBQyxjQUFjLENBQUMsQ0FBQyxDQUFDLEtBQUssQ0FBQyxFQUFFLFFBQVEsRUFBRSxLQUFLLENBQUMsQ0FBQztJQUU5RSxPQUFPLE9BQU8sQ0FBQyxjQUFjLENBQUMsTUFBTSxDQUFDLEtBQUssRUFBRSxTQUFTLEVBQUUsTUFBTSxDQUFDLE1BQU0sQ0FBQyxDQUFDO0FBQ3hFLENBQUM7QUFFRCxNQUFNLENBQUMsTUFBTSxlQUFlLEdBQWlCO0lBQzNDLFVBQVUsRUFBRSxTQUFTO0lBQ3JCLFdBQVcsRUFBRSxLQUFLO0lBQ2xCLFVBQVUsRUFBRSxTQUE2QjtDQUMxQyxDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiLyoqXG4gKiBAbGljZW5zZVxuICogQ29weXJpZ2h0IDIwMjAgR29vZ2xlIExMQy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC5cbiAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSBcIkxpY2Vuc2VcIik7XG4gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuXG4gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXRcbiAqXG4gKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjBcbiAqXG4gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlXG4gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiBcIkFTIElTXCIgQkFTSVMsXG4gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC5cbiAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmRcbiAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLlxuICogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbiAqL1xuXG5pbXBvcnQge0F2Z1Bvb2wzRCwgQXZnUG9vbDNEQXR0cnMsIEF2Z1Bvb2wzRElucHV0cywgYmFja2VuZF91dGlsLCBLZXJuZWxDb25maWcsIEtlcm5lbEZ1bmMsIFRlbnNvckluZm8sIFR5cGVkQXJyYXksIHV0aWx9IGZyb20gJ0B0ZW5zb3JmbG93L3RmanMtY29yZSc7XG5cbmltcG9ydCB7TWF0aEJhY2tlbmRDUFV9IGZyb20gJy4uL2JhY2tlbmRfY3B1JztcbmltcG9ydCB7YXNzZXJ0Tm90Q29tcGxleH0gZnJvbSAnLi4vY3B1X3V0aWwnO1xuaW1wb3J0IHtwb29sM2R9IGZyb20gJy4uL3V0aWxzL3Bvb2xfdXRpbHMnO1xuXG5leHBvcnQgZnVuY3Rpb24gYXZnUG9vbDNEKGFyZ3M6IHtcbiAgaW5wdXRzOiBBdmdQb29sM0RJbnB1dHMsXG4gIGJhY2tlbmQ6IE1hdGhCYWNrZW5kQ1BVLFxuICBhdHRyczogQXZnUG9vbDNEQXR0cnNcbn0pOiBUZW5zb3JJbmZvIHtcbiAgY29uc3Qge2lucHV0cywgYmFja2VuZCwgYXR0cnN9ID0gYXJncztcbiAgY29uc3Qge3h9ID0gaW5wdXRzO1xuICBjb25zdCB7ZmlsdGVyU2l6ZSwgc3RyaWRlcywgcGFkLCBkaW1Sb3VuZGluZ01vZGUsIGRhdGFGb3JtYXR9ID0gYXR0cnM7XG5cbiAgYXNzZXJ0Tm90Q29tcGxleCh4LCAnYXZnUG9vbDNkJyk7XG5cbiAgY29uc3QgY29udkluZm8gPSBiYWNrZW5kX3V0aWwuY29tcHV0ZVBvb2wzREluZm8oXG4gICAgICB4LnNoYXBlIGFzIFtudW1iZXIsIG51bWJlciwgbnVtYmVyLCBudW1iZXIsIG51bWJlcl0sIGZpbHRlclNpemUsIHN0cmlkZXMsXG4gICAgICAxIC8qIGRpbGF0aW9ucyAqLywgcGFkLCBkaW1Sb3VuZGluZ01vZGUsIGRhdGFGb3JtYXQpO1xuXG4gIGNvbnN0IHhWYWx1ZXMgPSBiYWNrZW5kLmRhdGEuZ2V0KHguZGF0YUlkKS52YWx1ZXMgYXMgVHlwZWRBcnJheTtcbiAgY29uc3Qgb3V0QnVmID0gcG9vbDNkKFxuICAgICAgeFZhbHVlcywgeC5zaGFwZSwgeC5kdHlwZSwgdXRpbC5jb21wdXRlU3RyaWRlcyh4LnNoYXBlKSwgY29udkluZm8sICdhdmcnKTtcblxuICByZXR1cm4gYmFja2VuZC5tYWtlVGVuc29ySW5mbyhvdXRCdWYuc2hhcGUsICdmbG9hdDMyJywgb3V0QnVmLnZhbHVlcyk7XG59XG5cbmV4cG9ydCBjb25zdCBhdmdQb29sM0RDb25maWc6IEtlcm5lbENvbmZpZyA9IHtcbiAga2VybmVsTmFtZTogQXZnUG9vbDNELFxuICBiYWNrZW5kTmFtZTogJ2NwdScsXG4gIGtlcm5lbEZ1bmM6IGF2Z1Bvb2wzRCBhcyB7fSBhcyBLZXJuZWxGdW5jXG59O1xuIl19","/**\n * @license\n * Copyright 2020 Google LLC. All Rights Reserved.\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n * =============================================================================\n */\nimport { AvgPool3DGrad, backend_util, buffer } from '@tensorflow/tfjs-core';\nimport { assertNotComplex } from '../cpu_util';\nexport function avgPool3DGrad(args) {\n const { inputs, backend, attrs } = args;\n const { dy, input } = inputs;\n const { filterSize, strides, pad, dimRoundingMode } = attrs;\n assertNotComplex([dy, input], 'avgPool3DGrad');\n const convInfo = backend_util.computePool3DInfo(input.shape, filterSize, strides, 1 /* dilations */, pad, dimRoundingMode);\n const strideDepth = convInfo.strideDepth;\n const strideHeight = convInfo.strideHeight;\n const strideWidth = convInfo.strideWidth;\n const filterDepth = convInfo.filterDepth;\n const filterHeight = convInfo.filterHeight;\n const filterWidth = convInfo.filterWidth;\n const dilationDepth = convInfo.dilationDepth;\n const dilationHeight = convInfo.dilationHeight;\n const dilationWidth = convInfo.dilationWidth;\n const effectiveFilterDepth = convInfo.effectiveFilterDepth;\n const effectiveFilterHeight = convInfo.effectiveFilterHeight;\n const effectiveFilterWidth = convInfo.effectiveFilterWidth;\n const padFront = effectiveFilterDepth - 1 - convInfo.padInfo.front;\n const padLeft = effectiveFilterWidth - 1 - convInfo.padInfo.left;\n const padTop = effectiveFilterHeight - 1 - convInfo.padInfo.top;\n const dx = buffer(input.shape, 'float32');\n const avgMultiplier = 1 / (filterDepth * filterHeight * filterWidth);\n const dyBuf = backend.bufferSync(dy);\n for (let batch = 0; batch < convInfo.batchSize; ++batch) {\n for (let channel = 0; channel < convInfo.inChannels; ++channel) {\n for (let dxDepth = 0; dxDepth < convInfo.inDepth; ++dxDepth) {\n for (let dxRow = 0; dxRow < convInfo.inHeight; ++dxRow) {\n for (let dxCol = 0; dxCol < convInfo.inWidth; ++dxCol) {\n // Shader code begins.\n const dyDepthCorner = dxDepth - padFront;\n const dyRowCorner = dxRow - padTop;\n const dyColCorner = dxCol - padLeft;\n let dotProd = 0;\n for (let wDepth = 0; wDepth < effectiveFilterDepth; wDepth += dilationDepth) {\n const dyDepth = (dyDepthCorner + wDepth) / strideDepth;\n if (dyDepth < 0 || dyDepth >= convInfo.outDepth ||\n Math.floor(dyDepth) !== dyDepth) {\n continue;\n }\n for (let wRow = 0; wRow < effectiveFilterHeight; wRow += dilationHeight) {\n const dyRow = (dyRowCorner + wRow) / strideHeight;\n if (dyRow < 0 || dyRow >= convInfo.outHeight ||\n Math.floor(dyRow) !== dyRow) {\n continue;\n }\n for (let wCol = 0; wCol < effectiveFilterWidth; wCol += dilationWidth) {\n const dyCol = (dyColCorner + wCol) / strideWidth;\n if (dyCol < 0 || dyCol >= convInfo.outWidth ||\n Math.floor(dyCol) !== dyCol) {\n continue;\n }\n const pixel = dyBuf.get(batch, dyDepth, dyRow, dyCol, channel);\n dotProd += pixel;\n }\n }\n }\n dx.set(dotProd * avgMultiplier, batch, dxDepth, dxRow, dxCol, channel);\n }\n }\n }\n }\n }\n return backend.makeTensorInfo(dx.shape, dx.dtype, dx.values);\n}\nexport const avgPool3DGradConfig = {\n kernelName: AvgPool3DGrad,\n backendName: 'cpu',\n kernelFunc: avgPool3DGrad\n};\n//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiQXZnUG9vbDNER3JhZC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uLy4uL3RmanMtYmFja2VuZC1jcHUvc3JjL2tlcm5lbHMvQXZnUG9vbDNER3JhZC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQTs7Ozs7Ozs7Ozs7Ozs7O0dBZUc7QUFFSCxPQUFPLEVBQUMsYUFBYSxFQUEyQyxZQUFZLEVBQUUsTUFBTSxFQUE2QyxNQUFNLHVCQUF1QixDQUFDO0FBRy9KLE9BQU8sRUFBQyxnQkFBZ0IsRUFBQyxNQUFNLGFBQWEsQ0FBQztBQUU3QyxNQUFNLFVBQVUsYUFBYSxDQUFDLElBSTdCO0lBQ0MsTUFBTSxFQUFDLE1BQU0sRUFBRSxPQUFPLEVBQUUsS0FBSyxFQUFDLEdBQUcsSUFBSSxDQUFDO0lBQ3RDLE1BQU0sRUFBQyxFQUFFLEVBQUUsS0FBSyxFQUFDLEdBQUcsTUFBTSxDQUFDO0lBQzNCLE1BQU0sRUFBQyxVQUFVLEVBQUUsT0FBTyxFQUFFLEdBQUcsRUFBRSxlQUFlLEVBQUMsR0FBRyxLQUFLLENBQUM7SUFFMUQsZ0JBQWdCLENBQUMsQ0FBQyxFQUFFLEVBQUUsS0FBSyxDQUFDLEVBQUUsZUFBZSxDQUFDLENBQUM7SUFFL0MsTUFBTSxRQUFRLEdBQUcsWUFBWSxDQUFDLGlCQUFpQixDQUMzQyxLQUFLLENBQUMsS0FBaUQsRUFBRSxVQUFVLEVBQ25FLE9BQU8sRUFBRSxDQUFDLENBQUMsZUFBZSxFQUFFLEdBQUcsRUFBRSxlQUFlLENBQUMsQ0FBQztJQUV0RCxNQUFNLFdBQVcsR0FBRyxRQUFRLENBQUMsV0FBVyxDQUFDO0lBQ3pDLE1BQU0sWUFBWSxHQUFHLFFBQVEsQ0FBQyxZQUFZLENBQUM7SUFDM0MsTUFBTSxXQUFXLEdBQUcsUUFBUSxDQUFDLFdBQVcsQ0FBQztJQUN6QyxNQUFNLFdBQVcsR0FBRyxRQUFRLENBQUMsV0FBVyxDQUFDO0lBQ3pDLE1BQU0sWUFBWSxHQUFHLFFBQVEsQ0FBQyxZQUFZLENBQUM7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S0FBSyxFQUFFO29DQUMvQixTQUFTO2lDQUNWO2dDQUNELEtBQUssSUFBSSxJQUFJLEdBQUcsQ0FBQyxFQUFFLElBQUksR0FBRyxvQkFBb0IsRUFDekMsSUFBSSxJQUFJLGFBQWEsRUFBRTtvQ0FDMUIsTUFBTSxLQUFLLEdBQUcsQ0FBQyxXQUFXLEdBQUcsSUFBSSxDQUFDLEdBQUcsV0FBVyxDQUFDO29DQUNqRCxJQUFJLEtBQUssR0FBRyxDQUFDLElBQUksS0FBSyxJQUFJLFFBQVEsQ0FBQyxRQUFRO3dDQUN2QyxJQUFJLENBQUMsS0FBSyxDQUFDLEtBQUssQ0FBQyxLQUFLLEtBQUssRUFBRTt3Q0FDL0IsU0FBUztxQ0FDVjtvQ0FFRCxNQUFNLEtBQUssR0FDUCxLQUFLLENBQUMsR0FBRyxDQUFDLEtBQUssRUFBRSxPQUFPLEVBQUUsS0FBSyxFQUFFLEtBQUssRUFBRSxPQUFPLENBQUMsQ0FBQztvQ0FDckQsT0FBTyxJQUFJLEtBQUssQ0FBQztpQ0FDbEI7NkJBQ0Y7eUJBQ0Y7d0JBQ0QsRUFBRSxDQUFDLEdBQUcsQ0FDRixPQUFPLEdBQUcsYUFBYSxFQUFFLEtBQUssRUFBRSxPQUFPLEVBQUUsS0FBSyxFQUFFLEtBQUssRUFBRSxPQUFPLENBQUMsQ0FBQztxQkFDckU7aUJBQ0Y7YUFDRjtTQUNGO0tBQ0Y7SUFFRCxPQUFPLE9BQU8sQ0FBQyxjQUFjLENBQUMsRUFBRSxDQUFDLEtBQUssRUFBRSxFQUFFLENBQUMsS0FBSyxFQUFFLEVBQUUsQ0FBQyxNQUFNLENBQUMsQ0FBQztBQUMvRCxDQUFDO0FBRUQsTUFBTSxDQUFDLE1BQU0sbUJBQW1CLEdBQWlCO0lBQy9DLFVBQVUsRUFBRSxhQUFhO0lBQ3pCLFdBQVcsRUFBRSxLQUFLO0lBQ2xCLFVBQVUsRUFBRSxhQUFpQztDQUM5QyxDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiLyoqXG4gKiBAbGljZW5zZVxuICogQ29weXJpZ2h0IDIwMjAgR29vZ2xlIExMQy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC5cbiAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSBcIkxpY2Vuc2VcIik7XG4gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuXG4gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXRcbiAqXG4gKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjBcbiAqXG4gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlXG4gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiBcIkFTIElTXCIgQkFTSVMsXG4gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC5cbiAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmRcbiAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLlxuICogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbiAqL1xuXG5pbXBvcnQge0F2Z1Bvb2wzREdyYWQsIEF2Z1Bvb2wzREdyYWRBdHRycywgQXZnUG9vbDNER3JhZElucHV0cywgYmFja2VuZF91dGlsLCBidWZmZXIsIEtlcm5lbENvbmZpZywgS2VybmVsRnVuYywgUmFuaywgVGVuc29ySW5mb30gZnJvbSAnQHRlbnNvcmZsb3cvdGZqcy1jb3JlJztcblxuaW1wb3J0IHtNYXRoQmFja2VuZENQVX0gZnJvbSAnLi4vYmFja2VuZF9jcHUnO1xuaW1wb3J0IHthc3NlcnROb3RDb21wbGV4fSBmcm9tICcuLi9jcHVfdXRpbCc7XG5cbmV4cG9ydCBmdW5jdGlvbiBhdmdQb29sM0RHcmFkKGFyZ3M6IHtcbiAgaW5wdXRzOiBBdmdQb29sM0RHcmFkSW5wdXRzLFxuICBiYWNrZW5kOiBNYXRoQmFja2VuZENQVSxcbiAgYXR0cnM6IEF2Z1Bvb2wzREdyYWRBdHRyc1xufSk6IFRlbnNvckluZm8ge1xuICBjb25zdCB7aW5wdXRzLCBiYWNrZW5kLCBhdHRyc30gPSBhcmdzO1xuICBjb25zdCB7ZHksIGlucHV0fSA9IGlucHV0cztcbiAgY29uc3Qge2ZpbHRlclNpemUsIHN0cmlkZXMsIHBhZCwgZGltUm91bmRpbmdNb2RlfSA9IGF0dHJzO1xuXG4gIGFzc2VydE5vdENvbXBsZXgoW2R5LCBpbnB1dF0sICdhdmdQb29sM0RHcmFkJyk7XG5cbiAgY29uc3QgY29udkluZm8gPSBiYWNrZW5kX3V0aWwuY29tcHV0ZVBvb2wzREluZm8oXG4gICAgICBpbnB1dC5zaGFwZSBhcyBbbnVtYmVyLCBudW1iZXIsIG51bWJlciwgbnVtYmVyLCBudW1iZXJdLCBmaWx0ZXJTaXplLFxuICAgICAgc3RyaWRlcywgMSAvKiBkaWxhdGlvbnMgKi8sIHBhZCwgZGltUm91bmRpbmdNb2RlKTtcblxuICBjb25zdCBzdHJpZGVEZXB0aCA9IGNvbnZJbmZvLnN0cmlkZURlcHRoO1xuICBjb25zdCBzdHJpZGVIZWlnaHQgPSBjb252SW5mby5zdHJpZGVIZWlnaHQ7XG4gIGNvbnN0IHN0cmlkZVdpZHRoID0gY29udkluZm8uc3RyaWRlV2lkdGg7XG4gIGNvbnN0IGZpbHRlckRlcHRoID0gY29udkluZm8uZmlsdGVyRGVwdGg7XG4gIGNvbnN0IGZpbHRlckhlaWdodCA9IGNvbnZJbmZvLmZpbHRlckhlaWdodDtcbiAgY29uc3QgZmlsdGVyV2lkdGggPSBjb252SW5mby5maWx0ZXJXaWR0aDtcbiAgY29uc3QgZGlsYXRpb25EZXB0aCA9IGNvbnZJbmZvLmRpbGF0aW9uRGVwdGg7XG4gIGNvbnN0IGRpbGF0aW9uSGVpZ2h0ID0gY29udkluZm8uZGlsYXRpb25IZWlnaHQ7XG4gIGNvbnN0IGRpbGF0aW9uV2lkdGggPSBjb252SW5mby5kaWxhdGlvbldpZHRoO1xuICBjb25zdCBlZmZlY3RpdmVGaWx0ZXJEZXB0aCA9IGNvbnZJbmZvLmVmZmVjdGl2ZUZpbHRlckRlcHRoO1xuICBjb25zdCBlZmZlY3RpdmVGaWx0ZXJIZWlnaHQgPSBjb252SW5mby5lZmZlY3RpdmVGaWx0ZXJIZWlnaHQ7XG4gIGNvbnN0IGVmZmVjdGl2ZUZpbHRlcldpZHRoID0gY29udkluZm8uZWZmZWN0aXZlRmlsdGVyV2lkdGg7XG4gIGNvbnN0IHBhZEZyb250ID0gZWZmZWN0aXZlRmlsdGVyRGVwdGggLSAxIC0gY29udkluZm8ucGFkSW5mby5mcm9udDtcbiAgY29uc3QgcGFkTGVmdCA9IGVmZmVjdGl2ZUZpbHRlcldpZHRoIC0gMSAtIGNvbnZJbmZvLnBhZEluZm8ubGVmdDtcbiAgY29uc3QgcGFkVG9wID0gZWZmZWN0aXZlRmlsdGVySGVpZ2h0IC0gMSAtIGNvbnZJbmZvLnBhZEluZm8udG9wO1xuICBjb25zdCBkeCA9IGJ1ZmZlcihpbnB1dC5zaGFwZSwgJ2Zsb2F0MzInKTtcblxuICBjb25zdCBhdmdNdWx0aXBsaWVyID0gMSAvIChmaWx0ZXJEZXB0aCAqIGZpbHRlckhlaWdodCAqIGZpbHRlcldpZHRoKTtcblxuICBjb25zdCBkeUJ1ZiA9IGJhY2tlbmQuYnVmZmVyU3luYzxSYW5rLCAnZmxvYXQzMic+KGR5KTtcblxuICBmb3IgKGxldCBiYXRjaCA9IDA7IGJhdGNoIDwgY29udkluZm8uYmF0Y2hTaXplOyArK2JhdGNoKSB7XG4gICAgZm9yIChsZXQgY2hhbm5lbCA9IDA7IGNoYW5uZWwgPCBjb252SW5mby5pbkNoYW5uZWxzOyArK2NoYW5uZWwpIHtcbiAgICAgIGZvciAobGV0IGR4RGVwdGggPSAwOyBkeERlcHRoIDwgY29udkluZm8uaW5EZXB0aDsgKytkeERlcHRoKSB7XG4gICAgICAgIGZvciAobGV0IGR4Um93ID0gMDsgZHhSb3cgPCBjb252SW5mby5pbkhlaWdodDsgKytkeFJvdykge1xuICAgICAgICAgIGZvciAobGV0IGR4Q29sID0gMDsgZHhDb2wgPCBjb252SW5mby5pbldpZHRoOyArK2R4Q29sKSB7XG4gICAgICAgICAgICAvLyBTaGFkZXIgY29kZSBiZWdpbnMuXG4gICAgICAgICAgICBjb25zdCBkeURlcHRoQ29ybmVyID0gZHhEZXB0aCAtIHBhZEZyb250O1xuICAgICAgICAgICAgY29uc3QgZHlSb3dDb3JuZXIgPSBkeFJvdyAtIHBhZFRvcDtcbiAgICAgICAgICAgIGNvbnN0IGR5Q29sQ29ybmVyID0gZHhDb2wgLSBwYWRMZWZ0O1xuICAgICAgICAgICAgbGV0IGRvdFByb2QgPSAwO1xuICAgICAgICAgICAgZm9yIChsZXQgd0RlcHRoID0gMDsgd0RlcHRoIDwgZWZmZWN0aXZlRmlsdGVyRGVwdGg7XG4gICAgICAgICAgICAgICAgIHdEZXB0aCArPSBkaWxhdGlvbkRlcHRoKSB7XG4gICAgICAgICAgICAgIGNvbnN0IGR5RGVwdGggPSAoZHlEZXB0aENvcm5lciArIHdEZXB0aCkgLyBzdHJpZGVEZXB0aDtcbiAgICAgICAgICAgICAgaWYgKGR5RGVwdGggPCAwIHx8IGR5RGVwdGggPj0gY29udkluZm8ub3V0RGVwdGggfHxcbiAgICAgICAgICAgICAgICAgIE1hdGguZmxvb3IoZHlEZXB0aCkgIT09IGR5RGVwdGgpIHtcbiAgICAgICAgICAgICAgICBjb250aW51ZTtcbiAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICBmb3IgKGxldCB3Um93ID0gMDsgd1JvdyA8IGVmZmVjdGl2ZUZpbHRlckhlaWdodDtcbiAgICAgICAgICAgICAgICAgICB3Um93ICs9IGRpbGF0aW9uSGVpZ2h0KSB7XG4gICAgICAgICAgICAgICAgY29uc3QgZHlSb3cgPSAoZHlSb3dDb3JuZXIgKyB3Um93KSAvIHN0cmlkZUhlaWdodDtcbiAgICAgICAgICAgICAgICBpZiAoZHlSb3cgPCAwIHx8IGR5Um93ID49IGNvbnZJbmZvLm91dEhlaWdodCB8fFxuICAgICAgICAgICAgICAgICAgICBNYXRoLmZsb29yKGR5Um93KSAhPT0gZHlSb3cpIHtcbiAgICAgICAgICAgICAgICAgIGNvbnRpbnVlO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBmb3IgKGxldCB3Q29sID0gMDsgd0NvbCA8IGVmZmVjdGl2ZUZpbHRlcldpZHRoO1xuICAgICAgICAgICAgICAgICAgICAgd0NvbCArPSBkaWxhdGlvbldpZHRoKSB7XG4gICAgICAgICAgICAgICAgICBjb25zdCBkeUNvbCA9IChkeUNvbENvcm5lciArIHdDb2wpIC8gc3RyaWRlV2lkdGg7XG4gICAgICAgICAgICAgICAgICBpZiAoZHlDb2wgPCAwIHx8IGR5Q29sID49IGNvbnZJbmZvLm91dFdpZHRoIHx8XG4gICAgICAgICAgICAgICAgICAgICAgTWF0aC5mbG9vcihkeUNvbCkgIT09IGR5Q29sKSB7XG4gICAgICAgICAgICAgICAgICAgIGNvbnRpbnVlO1xuICAgICAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgICAgICBjb25zdCBwaXhlbCA9XG4gICAgICAgICAgICAgICAgICAgICAgZHlCdWYuZ2V0KGJhdGNoLCBkeURlcHRoLCBkeVJvdywgZHlDb2wsIGNoYW5uZWwpO1xuICAgICAgICAgICAgICAgICAgZG90UHJvZCArPSBwaXhlbDtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGR4LnNldChcbiAgICAgICAgICAgICAgICBkb3RQcm9kICogYXZnTXVsdGlwbGllciwgYmF0Y2gsIGR4RGVwdGgsIGR4Um93LCBkeENvbCwgY2hhbm5lbCk7XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICB9XG4gICAgfVxuICB9XG5cbiAgcmV0dXJuIGJhY2tlbmQubWFrZVRlbnNvckluZm8oZHguc2hhcGUsIGR4LmR0eXBlLCBkeC52YWx1ZXMpO1xufVxuXG5leHBvcnQgY29uc3QgYXZnUG9vbDNER3JhZENvbmZpZzogS2VybmVsQ29uZmlnID0ge1xuICBrZXJuZWxOYW1lOiBBdmdQb29sM0RHcmFkLFxuICBiYWNrZW5kTmFtZTogJ2NwdScsXG4gIGtlcm5lbEZ1bmM6IGF2Z1Bvb2wzREdyYWQgYXMge30gYXMgS2VybmVsRnVuY1xufTtcbiJdfQ==","/**\n * @license\n * Copyright 2020 Google LLC. All Rights Reserved.\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n * =============================================================================\n */\nimport { AvgPoolGrad, backend_util, buffer } from '@tensorflow/tfjs-core';\nimport { assertNotComplex } from '../cpu_util';\nexport function avgPoolGrad(args) {\n const { inputs, backend, attrs } = args;\n const { dy, input } = inputs;\n const x = input;\n assertNotComplex([dy, input], 'avgPoolGrad');\n const { filterSize, strides, pad } = attrs;\n const convInfo = backend_util.computePool2DInfo(x.shape, filterSize, strides, 1 /* dilations */, pad);\n const strideHeight = convInfo.strideHeight;\n const strideWidth = convInfo.strideWidth;\n const filterHeight = convInfo.filterHeight;\n const filterWidth = convInfo.filterWidth;\n const dilationHeight = convInfo.dilationHeight;\n const dilationWidth = convInfo.dilationWidth;\n const effectiveFilterHeight = convInfo.effectiveFilterHeight;\n const effectiveFilterWidth = convInfo.effectiveFilterWidth;\n const padLeft = effectiveFilterWidth - 1 - convInfo.padInfo.left;\n const padTop = effectiveFilterHeight - 1 - convInfo.padInfo.top;\n const dx = buffer(x.shape, 'float32');\n const avgMultiplier = 1 / (filterHeight * filterWidth);\n const dyData = backend.data.get(dy.dataId).values;\n const dyBuf = buffer(dy.shape, 'float32', dyData);\n for (let b = 0; b < convInfo.batchSize; ++b) {\n for (let d = 0; d < convInfo.inChannels; ++d) {\n for (let dxR = 0; dxR < convInfo.inHeight; ++dxR) {\n for (let dxC = 0; dxC < convInfo.inWidth; ++dxC) {\n // Shader code begins.\n const dyRCorner = dxR - padTop;\n const dyCCorner = dxC - padLeft;\n let dotProd = 0;\n for (let wR = 0; wR < effectiveFilterHeight; wR += dilationHeight) {\n const dyR = (dyRCorner + wR) / strideHeight;\n if (dyR < 0 || dyR >= convInfo.outHeight ||\n Math.floor(dyR) !== dyR) {\n continue;\n }\n for (let wC = 0; wC < effectiveFilterWidth; wC += dilationWidth) {\n const dyC = (dyCCorner + wC) / strideWidth;\n if (dyC < 0 || dyC >= convInfo.outWidth ||\n Math.floor(dyC) !== dyC) {\n continue;\n }\n const pixel = dyBuf.get(b, dyR, dyC, d);\n dotProd += pixel;\n }\n }\n dx.set(dotProd * avgMultiplier, b, dxR, dxC, d);\n }\n }\n }\n }\n return backend.makeTensorInfo(dx.shape, dx.dtype, dx.values);\n}\nexport const avgPoolGradConfig = {\n kernelName: AvgPoolGrad,\n backendName: 'cpu',\n kernelFunc: avgPoolGrad\n};\n//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiQXZnUG9vbEdyYWQuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi8uLi90ZmpzLWJhY2tlbmQtY3B1L3NyYy9rZXJuZWxzL0F2Z1Bvb2xHcmFkLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBOzs7Ozs7Ozs7Ozs7Ozs7R0FlRztBQUNILE9BQU8sRUFBQyxXQUFXLEVBQXVDLFlBQVksRUFBRSxNQUFNLEVBQTZDLE1BQU0sdUJBQXVCLENBQUM7QUFHekosT0FBTyxFQUFDLGdCQUFnQixFQUFDLE1BQU0sYUFBYSxDQUFDO0FBRTdDLE1BQU0sVUFBVSxXQUFXLENBQUMsSUFJM0I7SUFDQyxNQUFNLEVBQUMsTUFBTSxFQUFFLE9BQU8sRUFBRSxLQUFLLEVBQUMsR0FBRyxJQUFJLENBQUM7SUFDdEMsTUFBTSxFQUFDLEVBQUUsRUFBRSxLQUFLLEVBQUMsR0FBRyxNQUFNLENBQUM7SUFDM0IsTUFBTSxDQUFDLEdBQUcsS0FBSyxDQUFDO0lBQ2hCLGdCQUFnQixDQUFDLENBQUMsRUFBRSxFQUFFLEtBQUssQ0FBQyxFQUFFLGFBQWEsQ0FBQyxDQUFDO0lBQzdDLE1BQU0sRUFBQyxVQUFVLEVBQUUsT0FBTyxFQUFFLEdBQUcsRUFBQyxHQUFHLEtBQUssQ0FBQztJQUV6QyxNQUFNLFFBQVEsR0FBRyxZQUFZLENBQUMsaUJBQWlCLENBQzNDLENBQUMsQ0FBQyxLQUF5QyxFQUFFLFVBQVUsRUFBRSxPQUFPLEVBQ2hFLENBQUMsQ0FBQyxlQUFlLEVBQUUsR0FBRyxDQUFDLENBQUM7SUFDNUIsTUFBTSxZQUFZLEdBQUcsUUFBUSxDQUFDLFlBQVksQ0FBQztJQUMzQyxNQUFNLFdBQVcsR0FBRyxRQUFRLENBQUMsV0FBVyxDQUFDO0lBQ3pDLE1BQU0sWUFBWSxHQUFHLFFBQVEsQ0FBQyxZQUFZLENBQUM7SUFDM0MsTUFBTSxXQUFXLEdBQUcsUUFBUSxDQUFDLFdBQVcsQ0FBQztJQUN6QyxNQUFNLGNBQWMsR0FBRyxRQUFRLENBQUMsY0FB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O0tBQ0Y7SUFDRCxPQUFPLE9BQU8sQ0FBQyxjQUFjLENBQUMsRUFBRSxDQUFDLEtBQUssRUFBRSxFQUFFLENBQUMsS0FBSyxFQUFFLEVBQUUsQ0FBQyxNQUFNLENBQUMsQ0FBQztBQUMvRCxDQUFDO0FBRUQsTUFBTSxDQUFDLE1BQU0saUJBQWlCLEdBQWlCO0lBQzdDLFVBQVUsRUFBRSxXQUFXO0lBQ3ZCLFdBQVcsRUFBRSxLQUFLO0lBQ2xCLFVBQVUsRUFBRSxXQUErQjtDQUM1QyxDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiLyoqXG4gKiBAbGljZW5zZVxuICogQ29weXJpZ2h0IDIwMjAgR29vZ2xlIExMQy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC5cbiAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSBcIkxpY2Vuc2VcIik7XG4gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuXG4gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXRcbiAqXG4gKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjBcbiAqXG4gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlXG4gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiBcIkFTIElTXCIgQkFTSVMsXG4gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC5cbiAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmRcbiAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLlxuICogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbiAqL1xuaW1wb3J0IHtBdmdQb29sR3JhZCwgQXZnUG9vbEdyYWRBdHRycywgQXZnUG9vbEdyYWRJbnB1dHMsIGJhY2tlbmRfdXRpbCwgYnVmZmVyLCBLZXJuZWxDb25maWcsIEtlcm5lbEZ1bmMsIFJhbmssIFRlbnNvckluZm99IGZyb20gJ0B0ZW5zb3JmbG93L3RmanMtY29yZSc7XG5cbmltcG9ydCB7TWF0aEJhY2tlbmRDUFV9IGZyb20gJy4uL2JhY2tlbmRfY3B1JztcbmltcG9ydCB7YXNzZXJ0Tm90Q29tcGxleH0gZnJvbSAnLi4vY3B1X3V0aWwnO1xuXG5leHBvcnQgZnVuY3Rpb24gYXZnUG9vbEdyYWQoYXJnczoge1xuICBpbnB1dHM6IEF2Z1Bvb2xHcmFkSW5wdXRzLFxuICBiYWNrZW5kOiBNYXRoQmFja2VuZENQVSxcbiAgYXR0cnM6IEF2Z1Bvb2xHcmFkQXR0cnNcbn0pOiBUZW5zb3JJbmZvIHtcbiAgY29uc3Qge2lucHV0cywgYmFja2VuZCwgYXR0cnN9ID0gYXJncztcbiAgY29uc3Qge2R5LCBpbnB1dH0gPSBpbnB1dHM7XG4gIGNvbnN0IHggPSBpbnB1dDtcbiAgYXNzZXJ0Tm90Q29tcGxleChbZHksIGlucHV0XSwgJ2F2Z1Bvb2xHcmFkJyk7XG4gIGNvbnN0IHtmaWx0ZXJTaXplLCBzdHJpZGVzLCBwYWR9ID0gYXR0cnM7XG5cbiAgY29uc3QgY29udkluZm8gPSBiYWNrZW5kX3V0aWwuY29tcHV0ZVBvb2wyREluZm8oXG4gICAgICB4LnNoYXBlIGFzIFtudW1iZXIsIG51bWJlciwgbnVtYmVyLCBudW1iZXJdLCBmaWx0ZXJTaXplLCBzdHJpZGVzLFxuICAgICAgMSAvKiBkaWxhdGlvbnMgKi8sIHBhZCk7XG4gIGNvbnN0IHN0cmlkZUhlaWdodCA9IGNvbnZJbmZvLnN0cmlkZUhlaWdodDtcbiAgY29uc3Qgc3RyaWRlV2lkdGggPSBjb252SW5mby5zdHJpZGVXaWR0aDtcbiAgY29uc3QgZmlsdGVySGVpZ2h0ID0gY29udkluZm8uZmlsdGVySGVpZ2h0O1xuICBjb25zdCBmaWx0ZXJXaWR0aCA9IGNvbnZJbmZvLmZpbHRlcldpZHRoO1xuICBjb25zdCBkaWxhdGlvbkhlaWdodCA9IGNvbnZJbmZvLmRpbGF0aW9uSGVpZ2h0O1xuICBjb25zdCBkaWxhdGlvbldpZHRoID0gY29udkluZm8uZGlsYXRpb25XaWR0aDtcbiAgY29uc3QgZWZmZWN0aXZlRmlsdGVySGVpZ2h0ID0gY29udkluZm8uZWZmZWN0aXZlRmlsdGVySGVpZ2h0O1xuICBjb25zdCBlZmZlY3RpdmVGaWx0ZXJXaWR0aCA9IGNvbnZJbmZvLmVmZmVjdGl2ZUZpbHRlcldpZHRoO1xuICBjb25zdCBwYWRMZWZ0ID0gZWZmZWN0aXZlRmlsdGVyV2lkdGggLSAxIC0gY29udkluZm8ucGFkSW5mby5sZWZ0O1xuICBjb25zdCBwYWRUb3AgPSBlZmZlY3RpdmVGaWx0ZXJIZWlnaHQgLSAxIC0gY29udkluZm8ucGFkSW5mby50b3A7XG4gIGNvbnN0IGR4ID1cbiAgICAgIGJ1ZmZlcjxSYW5rLlI0Pih4LnNoYXBlIGFzIFtudW1iZXIsIG51bWJlciwgbnVtYmVyLCBudW1iZXJdLCAnZmxvYXQzMicpO1xuXG4gIGNvbnN0IGF2Z011bHRpcGxpZXIgPSAxIC8gKGZpbHRlckhlaWdodCAqIGZpbHRlcldpZHRoKTtcblxuICBjb25zdCBkeURhdGEgPSBiYWNrZW5kLmRhdGEuZ2V0KGR5LmRhdGFJZCkudmFsdWVzIGFzIEZsb2F0MzJBcnJheTtcbiAgY29uc3QgZHlCdWYgPSBidWZmZXI8UmFuay5SND4oXG4gICAgICBkeS5zaGFwZSBhcyBbbnVtYmVyLCBudW1iZXIsIG51bWJlciwgbnVtYmVyXSwgJ2Zsb2F0MzInLCBkeURhdGEpO1xuXG4gIGZvciAobGV0IGIgPSAwOyBiIDwgY29udkluZm8uYmF0Y2hTaXplOyArK2IpIHtcbiAgICBmb3IgKGxldCBkID0gMDsgZCA8IGNvbnZJbmZvLmluQ2hhbm5lbHM7ICsrZCkge1xuICAgICAgZm9yIChsZXQgZHhSID0gMDsgZHhSIDwgY29udkluZm8uaW5IZWlnaHQ7ICsrZHhSKSB7XG4gICAgICAgIGZvciAobGV0IGR4QyA9IDA7IGR4QyA8IGNvbnZJbmZvLmluV2lkdGg7ICsrZHhDKSB7XG4gICAgICAgICAgLy8gU2hhZGVyIGNvZGUgYmVnaW5zLlxuICAgICAgICAgIGNvbnN0IGR5UkNvcm5lciA9IGR4UiAtIHBhZFRvcDtcbiAgICAgICAgICBjb25zdCBkeUNDb3JuZXIgPSBkeEMgLSBwYWRMZWZ0O1xuICAgICAgICAgIGxldCBkb3RQcm9kID0gMDtcbiAgICAgICAgICBmb3IgKGxldCB3UiA9IDA7IHdSIDwgZWZmZWN0aXZlRmlsdGVySGVpZ2h0OyB3UiArPSBkaWxhdGlvbkhlaWdodCkge1xuICAgICAgICAgICAgY29uc3QgZHlSID0gKGR5UkNvcm5lciArIHdSKSAvIHN0cmlkZUhlaWdodDtcbiAgICAgICAgICAgIGlmIChkeVIgPCAwIHx8IGR5UiA+PSBjb252SW5mby5vdXRIZWlnaHQgfHxcbiAgICAgICAgICAgICAgICBNYXRoLmZsb29yKGR5UikgIT09IGR5Uikge1xuICAgICAgICAgICAgICBjb250aW51ZTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGZvciAobGV0IHdDID0gMDsgd0MgPCBlZmZlY3RpdmVGaWx0ZXJXaWR0aDsgd0MgKz0gZGlsYXRpb25XaWR0aCkge1xuICAgICAgICAgICAgICBjb25zdCBkeUMgPSAoZHlDQ29ybmVyICsgd0MpIC8gc3RyaWRlV2lkdGg7XG4gICAgICAgICAgICAgIGlmIChkeUMgPCAwIHx8IGR5QyA+PSBjb252SW5mby5vdXRXaWR0aCB8fFxuICAgICAgICAgICAgICAgICAgTWF0aC5mbG9vcihkeUMpICE9PSBkeUMpIHtcbiAgICAgICAgICAgICAgICBjb250aW51ZTtcbiAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgIGNvbnN0IHBpeGVsID0gZHlCdWYuZ2V0KGIsIGR5UiwgZHlDLCBkKTtcbiAgICAgICAgICAgICAgZG90UHJvZCArPSBwaXhlbDtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9XG4gICAgICAgICAgZHguc2V0KGRvdFByb2QgKiBhdmdNdWx0aXBsaWVyLCBiLCBkeFIsIGR4QywgZCk7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9XG4gIH1cbiAgcmV0dXJuIGJhY2tlbmQubWFrZVRlbnNvckluZm8oZHguc2hhcGUsIGR4LmR0eXBlLCBkeC52YWx1ZXMpO1xufVxuXG5leHBvcnQgY29uc3QgYXZnUG9vbEdyYWRDb25maWc6IEtlcm5lbENvbmZpZyA9IHtcbiAga2VybmVsTmFtZTogQXZnUG9vbEdyYWQsXG4gIGJhY2tlbmROYW1lOiAnY3B1JyxcbiAga2VybmVsRnVuYzogYXZnUG9vbEdyYWQgYXMge30gYXMgS2VybmVsRnVuY1xufTtcbiJdfQ==","/**\n * @license\n * Copyright 2020 Google LLC. All Rights Reserved.\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n * =============================================================================\n */\nimport { FusedBatchNorm, util } from '@tensorflow/tfjs-core';\nimport { assertNotComplex } from '../cpu_util';\nexport function batchNorm(args) {\n const { inputs, backend, attrs } = args;\n const { x, scale, offset, mean, variance } = inputs;\n util.assert(mean.shape.length === variance.shape.length, () => 'Batch normalization gradient requires mean and variance to have ' +\n 'equal ranks.');\n util.assert(offset == null || mean.shape.length === offset.shape.length, () => 'Batch normalization gradient requires mean and offset to have ' +\n 'equal ranks.');\n util.assert(scale == null || mean.shape.length === scale.shape.length, () => 'Batch normalization gradient requires mean and scale to have ' +\n 'equal ranks.');\n assertNotComplex([x, mean, variance, scale, offset], 'batchNorm');\n let { varianceEpsilon } = attrs;\n if (varianceEpsilon == null) {\n varianceEpsilon = 0.001;\n }\n const xVals = backend.data.get(x.dataId).values;\n const mVals = backend.data.get(mean.dataId).values;\n const varVals = backend.data.get(variance.dataId).values;\n const sVals = scale ? backend.data.get(scale.dataId).values :\n new Float32Array([1]);\n const offVals = offset ?\n backend.data.get(offset.dataId).values :\n new Float32Array([0]);\n const outVals = new Float32Array(xVals.length);\n const offValsLength = offVals.length;\n const sValsLength = sVals.length;\n const varValsLength = varVals.length;\n const mValsLength = mVals.length;\n let offi = 0;\n let mi = 0;\n let si = 0;\n let vi = 0;\n for (let i = 0; i < xVals.length; ++i) {\n outVals[i] = offVals[offi++] +\n (xVals[i] - mVals[mi++]) * sVals[si++] /\n Math.sqrt(varVals[vi++] + varianceEpsilon);\n if (offi >= offValsLength) {\n offi = 0;\n }\n if (mi >= mValsLength) {\n mi = 0;\n }\n if (si >= sValsLength) {\n si = 0;\n }\n if (vi >= varValsLength) {\n vi = 0;\n }\n }\n return backend.makeTensorInfo(x.shape, x.dtype, outVals);\n}\nexport const batchNormConfig = {\n kernelName: FusedBatchNorm,\n backendName: 'cpu',\n kernelFunc: batchNorm,\n};\n//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiQmF0Y2hOb3JtLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vLi4vdGZqcy1iYWNrZW5kLWNwdS9zcmMva2VybmVscy9CYXRjaE5vcm0udHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUE7Ozs7Ozs7Ozs7Ozs7OztHQWVHO0FBRUgsT0FBTyxFQUFDLGNBQWMsRUFBK0YsSUFBSSxFQUFDLE1BQU0sdUJBQXVCLENBQUM7QUFHeEosT0FBTyxFQUFDLGdCQUFnQixFQUFDLE1BQU0sYUFBYSxDQUFDO0FBRTdDLE1BQU0sVUFBVSxTQUFTLENBQUMsSUFJekI7SUFDQyxNQUFNLEVBQUMsTUFBTSxFQUFFLE9BQU8sRUFBRSxLQUFLLEVBQUMsR0FBRyxJQUFJLENBQUM7SUFDdEMsTUFBTSxFQUFDLENBQUMsRUFBRSxLQUFLLEVBQUUsTUFBTSxFQUFFLElBQUksRUFBRSxRQUFRLEVBQUMsR0FBRyxNQUFNLENBQUM7SUFFbEQsSUFBSSxDQUFDLE1BQU0sQ0FDUCxJQUFJLENBQUMsS0FBSyxDQUFDLE1BQU0sS0FBSyxRQUFRLENBQUMsS0FBSyxDQUFDLE1BQU0sRUFDM0MsR0FBRyxFQUFFLENBQUMsa0VBQWtFO1FBQ3BFLGNBQWMsQ0FBQyxDQUFDO0lBQ3hCLElBQUksQ0FBQyxNQUFNLENBQ1AsTUFBTSxJQUFJLElBQUksSUFBSSxJQUFJLENBQUMsS0FBSyxDQUFDLE1BQU0sS0FBSyxNQUFNLENBQUMsS0FBSyxDQUFDLE1BQU0sRUFDM0QsR0FBRyxFQUFFLENBQUMsZ0VBQWdFO1FBQ2xFLGNBQWMsQ0FBQyxDQUFDO0lBQ3hCLElBQUksQ0FBQyxNQUFNLENBQ1AsS0FBSyxJQUFJLElBQUksSUFBSSxJQUFJLENBQUMsS0FBSyxDQUFDLE1BQU0sS0FBSyxLQUFLLENBQUMsS0FBSyxDQUFDLE1BQU0sRUFDekQsR0FBRyxFQUFFLENBQUMsK0RBQStEO1FBQ2pFLGNBQWMsQ0FBQyxDQUFDO0lBRXhCLGdCQUFnQixDQUFDLENBQUMsQ0FBQyxF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QUFXLEVBQUUsS0FBSztJQUNsQixVQUFVLEVBQUUsU0FBNkI7Q0FDMUMsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbIi8qKlxuICogQGxpY2Vuc2VcbiAqIENvcHlyaWdodCAyMDIwIEdvb2dsZSBMTEMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuXG4gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgXCJMaWNlbnNlXCIpO1xuICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLlxuICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0XG4gKlxuICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wXG4gKlxuICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZVxuICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gXCJBUyBJU1wiIEJBU0lTLFxuICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuXG4gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kXG4gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS5cbiAqID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4gKi9cblxuaW1wb3J0IHtGdXNlZEJhdGNoTm9ybSwgRnVzZWRCYXRjaE5vcm1BdHRycywgRnVzZWRCYXRjaE5vcm1JbnB1dHMsIEtlcm5lbENvbmZpZywgS2VybmVsRnVuYywgVGVuc29ySW5mbywgVHlwZWRBcnJheSwgdXRpbH0gZnJvbSAnQHRlbnNvcmZsb3cvdGZqcy1jb3JlJztcblxuaW1wb3J0IHtNYXRoQmFja2VuZENQVX0gZnJvbSAnLi4vYmFja2VuZF9jcHUnO1xuaW1wb3J0IHthc3NlcnROb3RDb21wbGV4fSBmcm9tICcuLi9jcHVfdXRpbCc7XG5cbmV4cG9ydCBmdW5jdGlvbiBiYXRjaE5vcm0oYXJnczoge1xuICBpbnB1dHM6IEZ1c2VkQmF0Y2hOb3JtSW5wdXRzLFxuICBiYWNrZW5kOiBNYXRoQmFja2VuZENQVSxcbiAgYXR0cnM6IEZ1c2VkQmF0Y2hOb3JtQXR0cnNcbn0pOiBUZW5zb3JJbmZvIHtcbiAgY29uc3Qge2lucHV0cywgYmFja2VuZCwgYXR0cnN9ID0gYXJncztcbiAgY29uc3Qge3gsIHNjYWxlLCBvZmZzZXQsIG1lYW4sIHZhcmlhbmNlfSA9IGlucHV0cztcblxuICB1dGlsLmFzc2VydChcbiAgICAgIG1lYW4uc2hhcGUubGVuZ3RoID09PSB2YXJpYW5jZS5zaGFwZS5sZW5ndGgsXG4gICAgICAoKSA9PiAnQmF0Y2ggbm9ybWFsaXphdGlvbiBncmFkaWVudCByZXF1aXJlcyBtZWFuIGFuZCB2YXJpYW5jZSB0byBoYXZlICcgK1xuICAgICAgICAgICdlcXVhbCByYW5rcy4nKTtcbiAgdXRpbC5hc3NlcnQoXG4gICAgICBvZmZzZXQgPT0gbnVsbCB8fCBtZWFuLnNoYXBlLmxlbmd0aCA9PT0gb2Zmc2V0LnNoYXBlLmxlbmd0aCxcbiAgICAgICgpID0+ICdCYXRjaCBub3JtYWxpemF0aW9uIGdyYWRpZW50IHJlcXVpcmVzIG1lYW4gYW5kIG9mZnNldCB0byBoYXZlICcgK1xuICAgICAgICAgICdlcXVhbCByYW5rcy4nKTtcbiAgdXRpbC5hc3NlcnQoXG4gICAgICBzY2FsZSA9PSBudWxsIHx8IG1lYW4uc2hhcGUubGVuZ3RoID09PSBzY2FsZS5zaGFwZS5sZW5ndGgsXG4gICAgICAoKSA9PiAnQmF0Y2ggbm9ybWFsaXphdGlvbiBncmFkaWVudCByZXF1aXJlcyBtZWFuIGFuZCBzY2FsZSB0byBoYXZlICcgK1xuICAgICAgICAgICdlcXVhbCByYW5rcy4nKTtcblxuICBhc3NlcnROb3RDb21wbGV4KFt4LCBtZWFuLCB2YXJpYW5jZSwgc2NhbGUsIG9mZnNldF0sICdiYXRjaE5vcm0nKTtcblxuICBsZXQge3ZhcmlhbmNlRXBzaWxvbn0gPSBhdHRycztcbiAgaWYgKHZhcmlhbmNlRXBzaWxvbiA9PSBudWxsKSB7XG4gICAgdmFyaWFuY2VFcHNpbG9uID0gMC4wMDE7XG4gIH1cblxuICBjb25zdCB4VmFscyA9IGJhY2tlbmQuZGF0YS5nZXQoeC5kYXRhSWQpLnZhbHVlcyBhcyBUeXBlZEFycmF5O1xuICBjb25zdCBtVmFscyA9IGJhY2tlbmQuZGF0YS5nZXQobWVhbi5kYXRhSWQpLnZhbHVlcyBhcyBUeXBlZEFycmF5O1xuICBjb25zdCB2YXJWYWxzID0gYmFja2VuZC5kYXRhLmdldCh2YXJpYW5jZS5kYXRhSWQpLnZhbHVlcyBhcyBUeXBlZEFycmF5O1xuICBjb25zdCBzVmFscyA9IHNjYWxlID8gYmFja2VuZC5kYXRhLmdldChzY2FsZS5kYXRhSWQpLnZhbHVlcyBhcyBUeXBlZEFycmF5IDpcbiAgICAgICAgICAgICAgICAgICAgICAgIG5ldyBGbG9hdDMyQXJyYXkoWzFdKTtcbiAgY29uc3Qgb2ZmVmFscyA9IG9mZnNldCA/XG4gICAgICBiYWNrZW5kLmRhdGEuZ2V0KG9mZnNldC5kYXRhSWQpLnZhbHVlcyBhcyBUeXBlZEFycmF5IDpcbiAgICAgIG5ldyBGbG9hdDMyQXJyYXkoWzBdKTtcbiAgY29uc3Qgb3V0VmFscyA9IG5ldyBGbG9hdDMyQXJyYXkoeFZhbHMubGVuZ3RoKTtcblxuICBjb25zdCBvZmZWYWxzTGVuZ3RoID0gb2ZmVmFscy5sZW5ndGg7XG4gIGNvbnN0IHNWYWxzTGVuZ3RoID0gc1ZhbHMubGVuZ3RoO1xuICBjb25zdCB2YXJWYWxzTGVuZ3RoID0gdmFyVmFscy5sZW5ndGg7XG4gIGNvbnN0IG1WYWxzTGVuZ3RoID0gbVZhbHMubGVuZ3RoO1xuXG4gIGxldCBvZmZpID0gMDtcbiAgbGV0IG1pID0gMDtcbiAgbGV0IHNpID0gMDtcbiAgbGV0IHZpID0gMDtcbiAgZm9yIChsZXQgaSA9IDA7IGkgPCB4VmFscy5sZW5ndGg7ICsraSkge1xuICAgIG91dFZhbHNbaV0gPSBvZmZWYWxzW29mZmkrK10gK1xuICAgICAgICAoeFZhbHNbaV0gLSBtVmFsc1ttaSsrXSkgKiBzVmFsc1tzaSsrXSAvXG4gICAgICAgICAgICBNYXRoLnNxcnQodmFyVmFsc1t2aSsrXSArIHZhcmlhbmNlRXBzaWxvbik7XG4gICAgaWYgKG9mZmkgPj0gb2ZmVmFsc0xlbmd0aCkge1xuICAgICAgb2ZmaSA9IDA7XG4gICAgfVxuICAgIGlmIChtaSA+PSBtVmFsc0xlbmd0aCkge1xuICAgICAgbWkgPSAwO1xuICAgIH1cbiAgICBpZiAoc2kgPj0gc1ZhbHNMZW5ndGgpIHtcbiAgICAgIHNpID0gMDtcbiAgICB9XG4gICAgaWYgKHZpID49IHZhclZhbHNMZW5ndGgpIHtcbiAgICAgIHZpID0gMDtcbiAgICB9XG4gIH1cbiAgcmV0dXJuIGJhY2tlbmQubWFrZVRlbnNvckluZm8oeC5zaGFwZSwgeC5kdHlwZSwgb3V0VmFscyk7XG59XG5cbmV4cG9ydCBjb25zdCBiYXRjaE5vcm1Db25maWc6IEtlcm5lbENvbmZpZyA9IHtcbiAga2VybmVsTmFtZTogRnVzZWRCYXRjaE5vcm0sXG4gIGJhY2tlbmROYW1lOiAnY3B1JyxcbiAga2VybmVsRnVuYzogYmF0Y2hOb3JtIGFzIHt9IGFzIEtlcm5lbEZ1bmMsXG59O1xuIl19","/**\n * @license\n * Copyright 2020 Google LLC. All Rights Reserved.\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n * =============================================================================\n */\nimport { backend_util, buffer, Slice, slice_util, util } from '@tensorflow/tfjs-core';\nimport { assertNotComplex } from '../cpu_util';\nexport function sliceImpl(vals, begin, size, shape, dtype) {\n const isContinous = slice_util.isSliceContinous(shape, begin, size);\n const length = util.sizeFromShape(size);\n const xStrides = util.computeStrides(shape);\n if (isContinous) {\n const flatOffset = slice_util.computeFlatOffset(begin, xStrides);\n if (dtype === 'string') {\n return vals.slice(flatOffset, flatOffset + length);\n }\n return vals.subarray(flatOffset, flatOffset + length);\n }\n const decodedData = dtype === 'string' ?\n backend_util.fromUint8ToStringArray(vals) :\n vals;\n const inBuf = buffer(shape, dtype, decodedData);\n const outBuf = buffer(size, dtype);\n for (let i = 0; i < outBuf.size; ++i) {\n const outLoc = outBuf.indexToLoc(i);\n const inLoc = outLoc.map((idx, j) => idx + begin[j]);\n outBuf.set(inBuf.get(...inLoc), ...outLoc);\n }\n if (dtype === 'string') {\n return backend_util.fromStringArrayToUint8(outBuf.values);\n }\n return outBuf.values;\n}\nexport function slice(args) {\n const { inputs, backend, attrs } = args;\n const { x } = inputs;\n const { begin, size } = attrs;\n assertNotComplex(x, 'slice');\n const [$begin, $size] = slice_util.parseSliceParams(x, begin, size);\n slice_util.assertParamsValid(x, $begin, $size);\n const vals = backend.data.get(x.dataId).values;\n const outVals = sliceImpl(vals, $begin, $size, x.shape, x.dtype);\n return backend.makeTensorInfo($size, x.dtype, outVals);\n}\nexport const sliceConfig = {\n kernelName: Slice,\n backendName: 'cpu',\n kernelFunc: slice\n};\n//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiU2xpY2UuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi8uLi90ZmpzLWJhY2tlbmQtY3B1L3NyYy9rZXJuZWxzL1NsaWNlLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBOzs7Ozs7Ozs7Ozs7Ozs7R0FlRztBQUVILE9BQU8sRUFBQyxZQUFZLEVBQWlCLE1BQU0sRUFBc0MsS0FBSyxFQUFFLFVBQVUsRUFBbUQsSUFBSSxFQUFDLE1BQU0sdUJBQXVCLENBQUM7QUFHeEwsT0FBTyxFQUFDLGdCQUFnQixFQUFDLE1BQU0sYUFBYSxDQUFDO0FBRTdDLE1BQU0sVUFBVSxTQUFTLENBQ3JCLElBQW1CLEVBQUUsS0FBZSxFQUFFLElBQWMsRUFBRSxLQUFlLEVBQ3JFLEtBQWU7SUFDakIsTUFBTSxXQUFXLEdBQUcsVUFBVSxDQUFDLGdCQUFnQixDQUFDLEtBQUssRUFBRSxLQUFLLEVBQUUsSUFBSSxDQUFDLENBQUM7SUFDcEUsTUFBTSxNQUFNLEdBQUcsSUFBSSxDQUFDLGFBQWEsQ0FBQyxJQUFJLENBQUMsQ0FBQztJQUN4QyxNQUFNLFFBQVEsR0FBRyxJQUFJLENBQUMsY0FBYyxDQUFDLEtBQUssQ0FBQyxDQUFDO0lBRTVDLElBQUksV0FBVyxFQUFFO1FBQ2YsTUFBTSxVQUFVLEdBQUcsVUFBVSxDQUFDLGlCQUFpQixDQUFDLEtBQUssRUFBRSxRQUFRLENBQUMsQ0FBQztRQUVqRSxJQUFJLEtBQUssS0FBSyxRQUFRLEVBQUU7WUFDdEIsT0FBUSxJQUFxQixDQUFDLEtBQUssQ0FBQyxVQUFVLEVBQUUsVUFBVSxHQUFHLE1BQU0sQ0FBQyxDQUFDO1NBQ3RFO1FBRUQsT0FBUSxJQUFtQixDQUFDLFFBQVEsQ0FBQyxVQUFVLEVBQUUsVUFBVSxHQUFHLE1BQU0sQ0FBQyxDQUFDO0tBQ3ZFO0lBRUQsTUFBTSxXQUFXLEdBQUcsS0FBSyxLQUFLLFFBQVEsQ0FBQyxDQUFDO1FBQ3BDLFlBQVksQ0FBQyxzQkFBc0IsQ0FBQyxJQUFvQixDQUFDLENBQUMsQ0FBQztRQUMzRCxJQUFrQixDQUFDO0lBRXZCLE1BQU0sS0FBSyxHQUFHLE1BQU0sQ0FBQyxLQUFLLEVBQUUsS0FBSyxFQUFFLFdBQVcsQ0FBQyxDQUFDO0lBQ2hELE1BQU0sTUFBTSxHQUFHLE1BQU0sQ0FBQyxJQUFJLEVBQUUsS0FBSyxDQUFDLENBQUM7SUFDbkMsS0FBSyxJQUFJLENBQUMsR0FBRyxDQUFDLEVBQUUsQ0FBQyxHQUFHLE1BQU0sQ0FBQyxJQUFJLEVBQUUsRUFBRSxDQUFDLEVBQUU7UUFDcEMsTUFBTSxNQUFNLEdBQUcsTUFBTSxDQUFDLFVBQVUsQ0FBQyxDQUFDLENBQUMsQ0FBQztRQUNwQyxNQUFNLEtBQUssR0FBRyxNQUFNLENBQUMsR0FBRyxDQUFDLENBQUMsR0FBVyxFQUFFLENBQUMsRUFBRSxFQUFFLENBQUMsR0FBRyxHQUFHLEtBQUssQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDO1FBQzdELE1BQU0sQ0FBQyxHQUFHLENBQUMsS0FBSyxDQUFDLEdBQUcsQ0FBQyxHQUFHLEtBQUssQ0FBQyxFQUFFLEdBQUcsTUFBTSxDQUFDLENBQUM7S0FDNUM7SUFFRCxJQUFJLEtBQUssS0FBSyxRQUFRLEVBQUU7UUFDdEIsT0FBTyxZQUFZLENBQUMsc0JBQXNCLENBQUMsTUFBTSxDQUFDLE1BQWtCLENBQUMsQ0FBQztLQUN2RTtJQUNELE9BQU8sTUFBTSxDQUFDLE1BQW9CLENBQUM7QUFDckMsQ0FBQztBQUVELE1BQU0sVUFBVSxLQUFLLENBQ2pCLElBQXVFO0lBRXpFLE1BQU0sRUFBQyxNQUFNLEVBQUUsT0FBTyxFQUFFLEtBQUssRUFBQyxHQUFHLElBQUksQ0FBQztJQUN0QyxNQUFNLEVBQUMsQ0FBQyxFQUFDLEdBQUcsTUFBTSxDQUFDO0lBQ25CLE1BQU0sRUFBQyxLQUFLLEVBQUUsSUFBSSxFQUFDLEdBQUcsS0FBSyxDQUFDO0lBRTVCLGdCQUFnQixDQUFDLENBQUMsRUFBRSxPQUFPLENBQUMsQ0FBQztJQUU3QixNQUFNLENBQUMsTUFBTSxFQUFFLEtBQUssQ0FBQyxHQUFHLFVBQVUsQ0FBQyxnQkFBZ0IsQ0FBQyxDQUFDLEVBQUUsS0FBSyxFQUFFLElBQUksQ0FBQyxDQUFDO0lBQ3BFLFVBQVUsQ0FBQyxpQkFBaUIsQ0FBQyxDQUFDLEVBQUUsTUFBTSxFQUFFLEtBQUssQ0FBQyxDQUFDO0lBRS9DLE1BQU0sSUFBSSxHQUFHLE9BQU8sQ0FBQyxJQUFJLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxNQUFNLENBQUMsQ0FBQyxNQUFNLENBQUM7SUFDL0MsTUFBTSxPQUFPLEdBQUcsU0FBUyxDQUFDLElBQUksRUFBRSxNQUFNLEVBQUUsS0FBSyxFQUFFLENBQUMsQ0FBQyxLQUFLLEVBQUUsQ0FBQyxDQUFDLEtBQUssQ0FBQyxDQUFDO0lBQ2pFLE9BQU8sT0FBTyxDQUFDLGNBQWMsQ0FBQyxLQUFLLEVBQUUsQ0FBQyxDQUFDLEtBQUssRUFBRSxPQUFPLENBQUMsQ0FBQztBQUN6RCxDQUFDO0FBRUQsTUFBTSxDQUFDLE1BQU0sV0FBVyxHQUFpQjtJQUN2QyxVQUFVLEVBQUUsS0FBSztJQUNqQixXQUFXLEVBQUUsS0FBSztJQUNsQixVQUFVLEVBQUUsS0FBeUI7Q0FDdEMsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbIi8qKlxuICogQGxpY2Vuc2VcbiAqIENvcHlyaWdodCAyMDIwIEdvb2dsZSBMTEMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuXG4gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgXCJMaWNlbnNlXCIpO1xuICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLlxuICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0XG4gKlxuICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wXG4gKlxuICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZVxuICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gXCJBUyBJU1wiIEJBU0lTLFxuICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuXG4gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kXG4gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS5cbiAqID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4gKi9cblxuaW1wb3J0IHtiYWNrZW5kX3V0aWwsIEJhY2tlbmRWYWx1ZXMsIGJ1ZmZlciwgRGF0YVR5cGUsIEtlcm5lbENvbmZpZywgS2VybmVsRnVuYywgU2xpY2UsIHNsaWNlX3V0aWwsIFNsaWNlQXR0cnMsIFNsaWNlSW5wdXRzLCBUZW5zb3JJbmZvLCBUeXBlZEFycmF5LCB1dGlsfSBmcm9tICdAdGVuc29yZmxvdy90ZmpzLWNvcmUnO1xuXG5pbXBvcnQge01hdGhCYWNrZW5kQ1BVfSBmcm9tICcuLi9iYWNrZW5kX2NwdSc7XG5pbXBvcnQge2Fzc2VydE5vdENvbXBsZXh9IGZyb20gJy4uL2NwdV91dGlsJztcblxuZXhwb3J0IGZ1bmN0aW9uIHNsaWNlSW1wbChcbiAgICB2YWxzOiBCYWNrZW5kVmFsdWVzLCBiZWdpbjogbnVtYmVyW10sIHNpemU6IG51bWJlcltdLCBzaGFwZTogbnVtYmVyW10sXG4gICAgZHR5cGU6IERhdGFUeXBlKTogQmFja2VuZFZhbHVlcyB7XG4gIGNvbnN0IGlzQ29udGlub3VzID0gc2xpY2VfdXRpbC5pc1NsaWNlQ29udGlub3VzKHNoYXBlLCBiZWdpbiwgc2l6ZSk7XG4gIGNvbnN0IGxlbmd0aCA9IHV0aWwuc2l6ZUZyb21TaGFwZShzaXplKTtcbiAgY29uc3QgeFN0cmlkZXMgPSB1dGlsLmNvbXB1dGVTdHJpZGVzKHNoYXBlKTtcblxuICBpZiAoaXNDb250aW5vdXMpIHtcbiAgICBjb25zdCBmbGF0T2Zmc2V0ID0gc2xpY2VfdXRpbC5jb21wdXRlRmxhdE9mZnNldChiZWdpbiwgeFN0cmlkZXMpO1xuXG4gICAgaWYgKGR0eXBlID09PSAnc3RyaW5nJykge1xuICAgICAgcmV0dXJuICh2YWxzIGFzIFVpbnQ4QXJyYXlbXSkuc2xpY2UoZmxhdE9mZnNldCwgZmxhdE9mZnNldCArIGxlbmd0aCk7XG4gICAgfVxuXG4gICAgcmV0dXJuICh2YWxzIGFzIFR5cGVkQXJyYXkpLnN1YmFycmF5KGZsYXRPZmZzZXQsIGZsYXRPZmZzZXQgKyBsZW5ndGgpO1xuICB9XG5cbiAgY29uc3QgZGVjb2RlZERhdGEgPSBkdHlwZSA9PT0gJ3N0cmluZycgP1xuICAgICAgYmFja2VuZF91dGlsLmZyb21VaW50OFRvU3RyaW5nQXJyYXkodmFscyBhcyBVaW50OEFycmF5W10pIDpcbiAgICAgIHZhbHMgYXMgVHlwZWRBcnJheTtcblxuICBjb25zdCBpbkJ1ZiA9IGJ1ZmZlcihzaGFwZSwgZHR5cGUsIGRlY29kZWREYXRhKTtcbiAgY29uc3Qgb3V0QnVmID0gYnVmZmVyKHNpemUsIGR0eXBlKTtcbiAgZm9yIChsZXQgaSA9IDA7IGkgPCBvdXRCdWYuc2l6ZTsgKytpKSB7XG4gICAgY29uc3Qgb3V0TG9jID0gb3V0QnVmLmluZGV4VG9Mb2MoaSk7XG4gICAgY29uc3QgaW5Mb2MgPSBvdXRMb2MubWFwKChpZHg6IG51bWJlciwgaikgPT4gaWR4ICsgYmVnaW5bal0pO1xuICAgIG91dEJ1Zi5zZXQoaW5CdWYuZ2V0KC4uLmluTG9jKSwgLi4ub3V0TG9jKTtcbiAgfVxuXG4gIGlmIChkdHlwZSA9PT0gJ3N0cmluZycpIHtcbiAgICByZXR1cm4gYmFja2VuZF91dGlsLmZyb21TdHJpbmdBcnJheVRvVWludDgob3V0QnVmLnZhbHVlcyBhcyBzdHJpbmdbXSk7XG4gIH1cbiAgcmV0dXJuIG91dEJ1Zi52YWx1ZXMgYXMgVHlwZWRBcnJheTtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIHNsaWNlKFxuICAgIGFyZ3M6IHtpbnB1dHM6IFNsaWNlSW5wdXRzLCBiYWNrZW5kOiBNYXRoQmFja2VuZENQVSwgYXR0cnM6IFNsaWNlQXR0cnN9KTpcbiAgICBUZW5zb3JJbmZvIHtcbiAgY29uc3Qge2lucHV0cywgYmFja2VuZCwgYXR0cnN9ID0gYXJncztcbiAgY29uc3Qge3h9ID0gaW5wdXRzO1xuICBjb25zdCB7YmVnaW4sIHNpemV9ID0gYXR0cnM7XG5cbiAgYXNzZXJ0Tm90Q29tcGxleCh4LCAnc2xpY2UnKTtcblxuICBjb25zdCBbJGJlZ2luLCAkc2l6ZV0gPSBzbGljZV91dGlsLnBhcnNlU2xpY2VQYXJhbXMoeCwgYmVnaW4sIHNpemUpO1xuICBzbGljZV91dGlsLmFzc2VydFBhcmFtc1ZhbGlkKHgsICRiZWdpbiwgJHNpemUpO1xuXG4gIGNvbnN0IHZhbHMgPSBiYWNrZW5kLmRhdGEuZ2V0KHguZGF0YUlkKS52YWx1ZXM7XG4gIGNvbnN0IG91dFZhbHMgPSBzbGljZUltcGwodmFscywgJGJlZ2luLCAkc2l6ZSwgeC5zaGFwZSwgeC5kdHlwZSk7XG4gIHJldHVybiBiYWNrZW5kLm1ha2VUZW5zb3JJbmZvKCRzaXplLCB4LmR0eXBlLCBvdXRWYWxzKTtcbn1cblxuZXhwb3J0IGNvbnN0IHNsaWNlQ29uZmlnOiBLZXJuZWxDb25maWcgPSB7XG4gIGtlcm5lbE5hbWU6IFNsaWNlLFxuICBiYWNrZW5kTmFtZTogJ2NwdScsXG4gIGtlcm5lbEZ1bmM6IHNsaWNlIGFzIHt9IGFzIEtlcm5lbEZ1bmNcbn07XG4iXX0=","/**\n * @license\n * Copyright 2020 Google LLC. All Rights Reserved.\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n * =============================================================================\n */\nimport { backend_util, BatchToSpaceND } from '@tensorflow/tfjs-core';\nimport { assertNotComplex } from '../cpu_util';\nimport { reshape } from './Reshape';\nimport { slice } from './Slice';\nimport { transpose } from './Transpose';\nexport function batchToSpaceND(args) {\n const { inputs, backend, attrs } = args;\n const { x } = inputs;\n const { blockShape, crops } = attrs;\n assertNotComplex([x], 'batchToSpaceND');\n const prod = blockShape.reduce((a, b) => a * b);\n const reshaped = backend_util.getReshaped(x.shape, blockShape, prod);\n const permuted = backend_util.getPermuted(reshaped.length, blockShape.length);\n const reshapedPermuted = backend_util.getReshapedPermuted(x.shape, blockShape, prod);\n const sliceBeginCoords = backend_util.getSliceBeginCoords(crops, blockShape.length);\n const sliceSize = backend_util.getSliceSize(reshapedPermuted, crops, blockShape.length);\n const xReshaped = reshape({ inputs: { x }, backend, attrs: { shape: reshaped } });\n const xTransposed = transpose({ inputs: { x: xReshaped }, backend, attrs: { perm: permuted } });\n const xTransposedReshaped = reshape({ inputs: { x: xTransposed }, backend, attrs: { shape: reshapedPermuted } });\n const result = slice({\n inputs: { x: xTransposedReshaped },\n backend,\n attrs: { begin: sliceBeginCoords, size: sliceSize }\n });\n backend.disposeIntermediateTensorInfo(xReshaped);\n backend.disposeIntermediateTensorInfo(xTransposed);\n backend.disposeIntermediateTensorInfo(xTransposedReshaped);\n return result;\n}\nexport const batchToSpaceNDConfig = {\n kernelName: BatchToSpaceND,\n backendName: 'cpu',\n kernelFunc: batchToSpaceND\n};\n//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiQmF0Y2hUb1NwYWNlTkQuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi8uLi90ZmpzLWJhY2tlbmQtY3B1L3NyYy9rZXJuZWxzL0JhdGNoVG9TcGFjZU5ELnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBOzs7Ozs7Ozs7Ozs7Ozs7R0FlRztBQUVILE9BQU8sRUFBQyxZQUFZLEVBQUUsY0FBYyxFQUFrRixNQUFNLHVCQUF1QixDQUFDO0FBR3BKLE9BQU8sRUFBQyxnQkFBZ0IsRUFBQyxNQUFNLGFBQWEsQ0FBQztBQUM3QyxPQUFPLEVBQUMsT0FBTyxFQUFDLE1BQU0sV0FBVyxDQUFDO0FBQ2xDLE9BQU8sRUFBQyxLQUFLLEVBQUMsTUFBTSxTQUFTLENBQUM7QUFDOUIsT0FBTyxFQUFDLFNBQVMsRUFBQyxNQUFNLGFBQWEsQ0FBQztBQUV0QyxNQUFNLFVBQVUsY0FBYyxDQUFDLElBSTlCO0lBQ0MsTUFBTSxFQUFDLE1BQU0sRUFBRSxPQUFPLEVBQUUsS0FBSyxFQUFDLEdBQUcsSUFBSSxDQUFDO0lBQ3RDLE1BQU0sRUFBQyxDQUFDLEVBQUMsR0FBRyxNQUFNLENBQUM7SUFDbkIsTUFBTSxFQUFDLFVBQVUsRUFBRSxLQUFLLEVBQUMsR0FBRyxLQUFLLENBQUM7SUFFbEMsZ0JBQWdCLENBQUMsQ0FBQyxDQUFDLENBQUMsRUFBRSxnQkFBZ0IsQ0FBQyxDQUFDO0lBRXhDLE1BQU0sSUFBSSxHQUFHLFVBQVUsQ0FBQyxNQUFNLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxFQUFFLEVBQUUsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUM7SUFFaEQsTUFBTSxRQUFRLEdBQUcsWUFBWSxDQUFDLFdBQVcsQ0FBQyxDQUFDLENBQUMsS0FBSyxFQUFFLFVBQVUsRUFBRSxJQUFJLENBQUMsQ0FBQztJQUNyRSxNQUFNLFFBQVEsR0FBRyxZQUFZLENBQUMsV0FBVyxDQUFDLFFBQVEsQ0FBQyxNQUFNLEVBQUUsVUFBVSxDQUFDLE1BQU0sQ0FBQyxDQUFDO0lBQzlFLE1BQU0sZ0JBQWdCLEdBQ2xCLFlBQVksQ0FBQyxtQkFBbUIsQ0FBQyxDQUFDLENBQUMsS0FBSyxFQUFFLFVBQVUsRUFBRSxJQUFJLENBQUMsQ0FBQztJQUNoRSxNQUFNLGdCQUFnQixHQUNsQixZQUFZLENBQUMsbUJBQW1CLENBQUMsS0FBSyxFQUFFLFVBQVUsQ0FBQyxNQUFNLENBQUMsQ0FBQztJQUMvRCxNQUFNLFNBQVMsR0FDWCxZQUFZLENBQUMsWUFBWSxDQUFDLGdCQUFnQixFQUFFLEtBQUssRUFBRSxVQUFVLENBQUMsTUFBTSxDQUFDLENBQUM7SUFFMUUsTUFBTSxTQUFTLEdBQUcsT0FBTyxDQUFDLEVBQUMsTUFBTSxFQUFFLEVBQUMsQ0FBQyxFQUFDLEVBQUUsT0FBTyxFQUFFLEtBQUssRUFBRSxFQUFDLEtBQUssRUFBRSxRQUFRLEVBQUMsRUFBQyxDQUFDLENBQUM7SUFDNUUsTUFBTSxXQUFXLEdBQ2IsU0FBUyxDQUFDLEVBQUMsTUFBTSxFQUFFLEVBQUMsQ0FBQyxFQUFFLFNBQVMsRUFBQyxFQUFFLE9BQU8sRUFBRSxLQUFLLEVBQUUsRUFBQyxJQUFJLEVBQUUsUUFBUSxFQUFDLEVBQUMsQ0FBQyxDQUFDO0lBQzFFLE1BQU0sbUJBQW1CLEdBQUcsT0FBTyxDQUMvQixFQUFDLE1BQU0sRUFBRSxFQUFDLENBQUMsRUFBRSxXQUFXLEVBQUMsRUFBRSxPQUFPLEVBQUUsS0FBSyxFQUFFLEVBQUMsS0FBSyxFQUFFLGdCQUFnQixFQUFDLEVBQUMsQ0FBQyxDQUFDO0lBQzNFLE1BQU0sTUFBTSxHQUFHLEtBQUssQ0FBQztRQUNuQixNQUFNLEVBQUUsRUFBQyxDQUFDLEVBQUUsbUJBQW1CLEVBQUM7UUFDaEMsT0FBTztRQUNQLEtBQUssRUFBRSxFQUFDLEtBQUssRUFBRSxnQkFBZ0IsRUFBRSxJQUFJLEVBQUUsU0FBUyxFQUFDO0tBQ2xELENBQUMsQ0FBQztJQUVILE9BQU8sQ0FBQyw2QkFBNkIsQ0FBQyxTQUFTLENBQUMsQ0FBQztJQUNqRCxPQUFPLENBQUMsNkJBQTZCLENBQUMsV0FBVyxDQUFDLENBQUM7SUFDbkQsT0FBTyxDQUFDLDZCQUE2QixDQUFDLG1CQUFtQixDQUFDLENBQUM7SUFFM0QsT0FBTyxNQUFNLENBQUM7QUFDaEIsQ0FBQztBQUVELE1BQU0sQ0FBQyxNQUFNLG9CQUFvQixHQUFpQjtJQUNoRCxVQUFVLEVBQUUsY0FBYztJQUMxQixXQUFXLEVBQUUsS0FBSztJQUNsQixVQUFVLEVBQUUsY0FBa0M7Q0FDL0MsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbIi8qKlxuICogQGxpY2Vuc2VcbiAqIENvcHlyaWdodCAyMDIwIEdvb2dsZSBMTEMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuXG4gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgXCJMaWNlbnNlXCIpO1xuICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLlxuICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0XG4gKlxuICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wXG4gKlxuICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZVxuICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gXCJBUyBJU1wiIEJBU0lTLFxuICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuXG4gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kXG4gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS5cbiAqID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4gKi9cblxuaW1wb3J0IHtiYWNrZW5kX3V0aWwsIEJhdGNoVG9TcGFjZU5ELCBCYXRjaFRvU3BhY2VOREF0dHJzLCBCYXRjaFRvU3BhY2VORElucHV0cywgS2VybmVsQ29uZmlnLCBLZXJuZWxGdW5jLCBUZW5zb3JJbmZvfSBmcm9tICdAdGVuc29yZmxvdy90ZmpzLWNvcmUnO1xuXG5pbXBvcnQge01hdGhCYWNrZW5kQ1BVfSBmcm9tICcuLi9iYWNrZW5kX2NwdSc7XG5pbXBvcnQge2Fzc2VydE5vdENvbXBsZXh9IGZyb20gJy4uL2NwdV91dGlsJztcbmltcG9ydCB7cmVzaGFwZX0gZnJvbSAnLi9SZXNoYXBlJztcbmltcG9ydCB7c2xpY2V9IGZyb20gJy4vU2xpY2UnO1xuaW1wb3J0IHt0cmFuc3Bvc2V9IGZyb20gJy4vVHJhbnNwb3NlJztcblxuZXhwb3J0IGZ1bmN0aW9uIGJhdGNoVG9TcGFjZU5EKGFyZ3M6IHtcbiAgaW5wdXRzOiBCYXRjaFRvU3BhY2VORElucHV0cyxcbiAgYmFja2VuZDogTWF0aEJhY2tlbmRDUFUsXG4gIGF0dHJzOiBCYXRjaFRvU3BhY2VOREF0dHJzXG59KTogVGVuc29ySW5mbyB7XG4gIGNvbnN0IHtpbnB1dHMsIGJhY2tlbmQsIGF0dHJzfSA9IGFyZ3M7XG4gIGNvbnN0IHt4fSA9IGlucHV0cztcbiAgY29uc3Qge2Jsb2NrU2hhcGUsIGNyb3BzfSA9IGF0dHJzO1xuXG4gIGFzc2VydE5vdENvbXBsZXgoW3hdLCAnYmF0Y2hUb1NwYWNlTkQnKTtcblxuICBjb25zdCBwcm9kID0gYmxvY2tTaGFwZS5yZWR1Y2UoKGEsIGIpID0+IGEgKiBiKTtcblxuICBjb25zdCByZXNoYXBlZCA9IGJhY2tlbmRfdXRpbC5nZXRSZXNoYXBlZCh4LnNoYXBlLCBibG9ja1NoYXBlLCBwcm9kKTtcbiAgY29uc3QgcGVybXV0ZWQgPSBiYWNrZW5kX3V0aWwuZ2V0UGVybXV0ZWQocmVzaGFwZWQubGVuZ3RoLCBibG9ja1NoYXBlLmxlbmd0aCk7XG4gIGNvbnN0IHJlc2hhcGVkUGVybXV0ZWQgPVxuICAgICAgYmFja2VuZF91dGlsLmdldFJlc2hhcGVkUGVybXV0ZWQoeC5zaGFwZSwgYmxvY2tTaGFwZSwgcHJvZCk7XG4gIGNvbnN0IHNsaWNlQmVnaW5Db29yZHMgPVxuICAgICAgYmFja2VuZF91dGlsLmdldFNsaWNlQmVnaW5Db29yZHMoY3JvcHMsIGJsb2NrU2hhcGUubGVuZ3RoKTtcbiAgY29uc3Qgc2xpY2VTaXplID1cbiAgICAgIGJhY2tlbmRfdXRpbC5nZXRTbGljZVNpemUocmVzaGFwZWRQZXJtdXRlZCwgY3JvcHMsIGJsb2NrU2hhcGUubGVuZ3RoKTtcblxuICBjb25zdCB4UmVzaGFwZWQgPSByZXNoYXBlKHtpbnB1dHM6IHt4fSwgYmFja2VuZCwgYXR0cnM6IHtzaGFwZTogcmVzaGFwZWR9fSk7XG4gIGNvbnN0IHhUcmFuc3Bvc2VkID1cbiAgICAgIHRyYW5zcG9zZSh7aW5wdXRzOiB7eDogeFJlc2hhcGVkfSwgYmFja2VuZCwgYXR0cnM6IHtwZXJtOiBwZXJtdXRlZH19KTtcbiAgY29uc3QgeFRyYW5zcG9zZWRSZXNoYXBlZCA9IHJlc2hhcGUoXG4gICAgICB7aW5wdXRzOiB7eDogeFRyYW5zcG9zZWR9LCBiYWNrZW5kLCBhdHRyczoge3NoYXBlOiByZXNoYXBlZFBlcm11dGVkfX0pO1xuICBjb25zdCByZXN1bHQgPSBzbGljZSh7XG4gICAgaW5wdXRzOiB7eDogeFRyYW5zcG9zZWRSZXNoYXBlZH0sXG4gICAgYmFja2VuZCxcbiAgICBhdHRyczoge2JlZ2luOiBzbGljZUJlZ2luQ29vcmRzLCBzaXplOiBzbGljZVNpemV9XG4gIH0pO1xuXG4gIGJhY2tlbmQuZGlzcG9zZUludGVybWVkaWF0ZVRlbnNvckluZm8oeFJlc2hhcGVkKTtcbiAgYmFja2VuZC5kaXNwb3NlSW50ZXJtZWRpYXRlVGVuc29ySW5mbyh4VHJhbnNwb3NlZCk7XG4gIGJhY2tlbmQuZGlzcG9zZUludGVybWVkaWF0ZVRlbnNvckluZm8oeFRyYW5zcG9zZWRSZXNoYXBlZCk7XG5cbiAgcmV0dXJuIHJlc3VsdDtcbn1cblxuZXhwb3J0IGNvbnN0IGJhdGNoVG9TcGFjZU5EQ29uZmlnOiBLZXJuZWxDb25maWcgPSB7XG4gIGtlcm5lbE5hbWU6IEJhdGNoVG9TcGFjZU5ELFxuICBiYWNrZW5kTmFtZTogJ2NwdScsXG4gIGtlcm5lbEZ1bmM6IGJhdGNoVG9TcGFjZU5EIGFzIHt9IGFzIEtlcm5lbEZ1bmNcbn07XG4iXX0=","/**\n * @license\n * Copyright 2020 Google LLC. All Rights Reserved.\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n * =============================================================================\n */\nimport { buffer, util } from '@tensorflow/tfjs-core';\nexport function bincountImpl(xVals, weightsVals, weightsDtype, weightsShape, size) {\n const weightsSize = util.sizeFromShape(weightsShape);\n const outVals = util.makeZerosTypedArray(size, weightsDtype);\n for (let i = 0; i < xVals.length; i++) {\n const value = xVals[i];\n if (value < 0) {\n throw new Error('Input x must be non-negative!');\n }\n if (value >= size) {\n continue;\n }\n if (weightsSize > 0) {\n outVals[value] += weightsVals[i];\n }\n else {\n outVals[value] += 1;\n }\n }\n return outVals;\n}\nexport function bincountReduceImpl(xBuf, weightsBuf, size, binaryOutput = false) {\n const numRows = xBuf.shape[0];\n const numCols = xBuf.shape[1];\n const outBuf = buffer([numRows, size], weightsBuf.dtype);\n for (let i = 0; i < numRows; i++) {\n for (let j = 0; j < numCols; j++) {\n const value = xBuf.get(i, j);\n if (value < 0) {\n throw new Error('Input x must be non-negative!');\n }\n if (value >= size) {\n continue;\n }\n if (binaryOutput) {\n outBuf.set(1, i, value);\n }\n else {\n if (weightsBuf.size > 0) {\n outBuf.set(outBuf.get(i, value) + weightsBuf.get(i, j), i, value);\n }\n else {\n outBuf.set(outBuf.get(i, value) + 1, i, value);\n }\n }\n }\n }\n return outBuf;\n}\n//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiQmluY291bnRfaW1wbC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uLy4uL3RmanMtYmFja2VuZC1jcHUvc3JjL2tlcm5lbHMvQmluY291bnRfaW1wbC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQTs7Ozs7Ozs7Ozs7Ozs7O0dBZUc7QUFFSCxPQUFPLEVBQUMsTUFBTSxFQUE0QyxJQUFJLEVBQUMsTUFBTSx1QkFBdUIsQ0FBQztBQUU3RixNQUFNLFVBQVUsWUFBWSxDQUN4QixLQUFpQixFQUFFLFdBQXVCLEVBQUUsWUFBc0IsRUFDbEUsWUFBc0IsRUFBRSxJQUFZO0lBQ3RDLE1BQU0sV0FBVyxHQUFHLElBQUksQ0FBQyxhQUFhLENBQUMsWUFBWSxDQUFDLENBQUM7SUFDckQsTUFBTSxPQUFPLEdBQUcsSUFBSSxDQUFDLG1CQUFtQixDQUFDLElBQUksRUFBRSxZQUFZLENBQWUsQ0FBQztJQUUzRSxLQUFLLElBQUksQ0FBQyxHQUFHLENBQUMsRUFBRSxDQUFDLEdBQUcsS0FBSyxDQUFDLE1BQU0sRUFBRSxDQUFDLEVBQUUsRUFBRTtRQUNyQyxNQUFNLEtBQUssR0FBRyxLQUFLLENBQUMsQ0FBQyxDQUFDLENBQUM7UUFDdkIsSUFBSSxLQUFLLEdBQUcsQ0FBQyxFQUFFO1lBQ2IsTUFBTSxJQUFJLEtBQUssQ0FBQywrQkFBK0IsQ0FBQyxDQUFDO1NBQ2xEO1FBRUQsSUFBSSxLQUFLLElBQUksSUFBSSxFQUFFO1lBQ2pCLFNBQVM7U0FDVjtRQUVELElBQUksV0FBVyxHQUFHLENBQUMsRUFBRTtZQUNuQixPQUFPLENBQUMsS0FBSyxDQUFDLElBQUksV0FBVyxDQUFDLENBQUMsQ0FBQyxDQUFDO1NBQ2xDO2FBQU07WUFDTCxPQUFPLENBQUMsS0FBSyxDQUFDLElBQUksQ0FBQyxDQUFDO1NBQ3JCO0tBQ0Y7SUFFRCxPQUFPLE9BQU8sQ0FBQztBQUNqQixDQUFDO0FBRUQsTUFBTSxVQUFVLGtCQUFrQixDQUM5QixJQUFxQixFQUFFLFVBQTJCLEVBQUUsSUFBWSxFQUNoRSxZQUFZLEdBQUcsS0FBSztJQUN0QixNQUFNLE9BQU8sR0FBRyxJQUFJLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQyxDQUFDO0lBQzlCLE1BQU0sT0FBTyxHQUFHLElBQUksQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDLENBQUM7SUFFOUIsTUFBTSxNQUFNLEdBQUcsTUFBTSxDQUFDLENBQUMsT0FBTyxFQUFFLElBQUksQ0FBQyxFQUFFLFVBQVUsQ0FBQyxLQUFLLENBQUMsQ0FBQztJQUV6RCxLQUFLLElBQUksQ0FBQyxHQUFHLENBQUMsRUFBRSxDQUFDLEdBQUcsT0FBTyxFQUFFLENBQUMsRUFBRSxFQUFFO1FBQ2hDLEtBQUssSUFBSSxDQUFDLEdBQUcsQ0FBQyxFQUFFLENBQUMsR0FBRyxPQUFPLEVBQUUsQ0FBQyxFQUFFLEVBQUU7WUFDaEMsTUFBTSxLQUFLLEdBQUcsSUFBSSxDQUFDLEdBQUcsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUM7WUFDN0IsSUFBSSxLQUFLLEdBQUcsQ0FBQyxFQUFFO2dCQUNiLE1BQU0sSUFBSSxLQUFLLENBQUMsK0JBQStCLENBQUMsQ0FBQzthQUNsRDtZQUVELElBQUksS0FBSyxJQUFJLElBQUksRUFBRTtnQkFDakIsU0FBUzthQUNWO1lBRUQsSUFBSSxZQUFZLEVBQUU7Z0JBQ2hCLE1BQU0sQ0FBQyxHQUFHLENBQUMsQ0FBQyxFQUFFLENBQUMsRUFBRSxLQUFLLENBQUMsQ0FBQzthQUN6QjtpQkFBTTtnQkFDTCxJQUFJLFVBQVUsQ0FBQyxJQUFJLEdBQUcsQ0FBQyxFQUFFO29CQUN2QixNQUFNLENBQUMsR0FBRyxDQUFDLE1BQU0sQ0FBQyxHQUFHLENBQUMsQ0FBQyxFQUFFLEtBQUssQ0FBQyxHQUFHLFVBQVUsQ0FBQyxHQUFHLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxFQUFFLENBQUMsRUFBRSxLQUFLLENBQUMsQ0FBQztpQkFDbkU7cUJBQU07b0JBQ0wsTUFBTSxDQUFDLEdBQUcsQ0FBQyxNQUFNLENBQUMsR0FBRyxDQUFDLENBQUMsRUFBRSxLQUFLLENBQUMsR0FBRyxDQUFDLEVBQUUsQ0FBQyxFQUFFLEtBQUssQ0FBQyxDQUFDO2lCQUNoRDthQUNGO1NBQ0Y7S0FDRjtJQUVELE9BQU8sTUFBeUIsQ0FBQztBQUNuQyxDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiLyoqXG4gKiBAbGljZW5zZVxuICogQ29weXJpZ2h0IDIwMjAgR29vZ2xlIExMQy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC5cbiAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSBcIkxpY2Vuc2VcIik7XG4gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuXG4gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXRcbiAqXG4gKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjBcbiAqXG4gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlXG4gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiBcIkFTIElTXCIgQkFTSVMsXG4gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC5cbiAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmRcbiAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLlxuICogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbiAqL1xuXG5pbXBvcnQge2J1ZmZlciwgRGF0YVR5cGUsIFJhbmssIFRlbnNvckJ1ZmZlciwgVHlwZWRBcnJheSwgdXRpbH0gZnJvbSAnQHRlbnNvcmZsb3cvdGZqcy1jb3JlJztcblxuZXhwb3J0IGZ1bmN0aW9uIGJpbmNvdW50SW1wbChcbiAgICB4VmFsczogVHlwZWRBcnJheSwgd2VpZ2h0c1ZhbHM6IFR5cGVkQXJyYXksIHdlaWdodHNEdHlwZTogRGF0YVR5cGUsXG4gICAgd2VpZ2h0c1NoYXBlOiBudW1iZXJbXSwgc2l6ZTogbnVtYmVyKTogVHlwZWRBcnJheSB7XG4gIGNvbnN0IHdlaWdodHNTaXplID0gdXRpbC5zaXplRnJvbVNoYXBlKHdlaWdodHNTaGFwZSk7XG4gIGNvbnN0IG91dFZhbHMgPSB1dGlsLm1ha2VaZXJvc1R5cGVkQXJyYXkoc2l6ZSwgd2VpZ2h0c0R0eXBlKSBhcyBUeXBlZEFycmF5O1xuXG4gIGZvciAobGV0IGkgPSAwOyBpIDwgeFZhbHMubGVuZ3RoOyBpKyspIHtcbiAgICBjb25zdCB2YWx1ZSA9IHhWYWxzW2ldO1xuICAgIGlmICh2YWx1ZSA8IDApIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcignSW5wdXQgeCBtdXN0IGJlIG5vbi1uZWdhdGl2ZSEnKTtcbiAgICB9XG5cbiAgICBpZiAodmFsdWUgPj0gc2l6ZSkge1xuICAgICAgY29udGludWU7XG4gICAgfVxuXG4gICAgaWYgKHdlaWdodHNTaXplID4gMCkge1xuICAgICAgb3V0VmFsc1t2YWx1ZV0gKz0gd2VpZ2h0c1ZhbHNbaV07XG4gICAgfSBlbHNlIHtcbiAgICAgIG91dFZhbHNbdmFsdWVdICs9IDE7XG4gICAgfVxuICB9XG5cbiAgcmV0dXJuIG91dFZhbHM7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBiaW5jb3VudFJlZHVjZUltcGw8UiBleHRlbmRzIFJhbms+KFxuICAgIHhCdWY6IFRlbnNvckJ1ZmZlcjxSPiwgd2VpZ2h0c0J1ZjogVGVuc29yQnVmZmVyPFI+LCBzaXplOiBudW1iZXIsXG4gICAgYmluYXJ5T3V0cHV0ID0gZmFsc2UpOiBUZW5zb3JCdWZmZXI8Uj4ge1xuICBjb25zdCBudW1Sb3dzID0geEJ1Zi5zaGFwZVswXTtcbiAgY29uc3QgbnVtQ29scyA9IHhCdWYuc2hhcGVbMV07XG5cbiAgY29uc3Qgb3V0QnVmID0gYnVmZmVyKFtudW1Sb3dzLCBzaXplXSwgd2VpZ2h0c0J1Zi5kdHlwZSk7XG5cbiAgZm9yIChsZXQgaSA9IDA7IGkgPCBudW1Sb3dzOyBpKyspIHtcbiAgICBmb3IgKGxldCBqID0gMDsgaiA8IG51bUNvbHM7IGorKykge1xuICAgICAgY29uc3QgdmFsdWUgPSB4QnVmLmdldChpLCBqKTtcbiAgICAgIGlmICh2YWx1ZSA8IDApIHtcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKCdJbnB1dCB4IG11c3QgYmUgbm9uLW5lZ2F0aXZlIScpO1xuICAgICAgfVxuXG4gICAgICBpZiAodmFsdWUgPj0gc2l6ZSkge1xuICAgICAgICBjb250aW51ZTtcbiAgICAgIH1cblxuICAgICAgaWYgKGJpbmFyeU91dHB1dCkge1xuICAgICAgICBvdXRCdWYuc2V0KDEsIGksIHZhbHVlKTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIGlmICh3ZWlnaHRzQnVmLnNpemUgPiAwKSB7XG4gICAgICAgICAgb3V0QnVmLnNldChvdXRCdWYuZ2V0KGksIHZhbHVlKSArIHdlaWdodHNCdWYuZ2V0KGksIGopLCBpLCB2YWx1ZSk7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgb3V0QnVmLnNldChvdXRCdWYuZ2V0KGksIHZhbHVlKSArIDEsIGksIHZhbHVlKTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH1cbiAgfVxuXG4gIHJldHVybiBvdXRCdWYgYXMgVGVuc29yQnVmZmVyPFI+O1xufVxuIl19","/**\n * @license\n * Copyright 2020 Google LLC. All Rights Reserved.\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n * =============================================================================\n */\nimport { Bincount } from '@tensorflow/tfjs-core';\nimport { bincountImpl } from './Bincount_impl';\nexport function bincount(args) {\n const { inputs, backend, attrs } = args;\n const { x, weights } = inputs;\n const { size } = attrs;\n const xVals = backend.data.get(x.dataId).values;\n const weightsVals = backend.data.get(weights.dataId).values;\n const outVals = bincountImpl(xVals, weightsVals, weights.dtype, weights.shape, size);\n return backend.makeTensorInfo([size], weights.dtype, outVals);\n}\nexport const bincountConfig = {\n kernelName: Bincount,\n backendName: 'cpu',\n kernelFunc: bincount\n};\n//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiQmluY291bnQuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi8uLi90ZmpzLWJhY2tlbmQtY3B1L3NyYy9rZXJuZWxzL0JpbmNvdW50LnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBOzs7Ozs7Ozs7Ozs7Ozs7R0FlRztBQUVILE9BQU8sRUFBQyxRQUFRLEVBQWtGLE1BQU0sdUJBQXVCLENBQUM7QUFHaEksT0FBTyxFQUFDLFlBQVksRUFBQyxNQUFNLGlCQUFpQixDQUFDO0FBRTdDLE1BQU0sVUFBVSxRQUFRLENBQUMsSUFJeEI7SUFDQyxNQUFNLEVBQUMsTUFBTSxFQUFFLE9BQU8sRUFBRSxLQUFLLEVBQUMsR0FBRyxJQUFJLENBQUM7SUFDdEMsTUFBTSxFQUFDLENBQUMsRUFBRSxPQUFPLEVBQUMsR0FBRyxNQUFNLENBQUM7SUFDNUIsTUFBTSxFQUFDLElBQUksRUFBQyxHQUFHLEtBQUssQ0FBQztJQUVyQixNQUFNLEtBQUssR0FBRyxPQUFPLENBQUMsSUFBSSxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsTUFBTSxDQUFDLENBQUMsTUFBb0IsQ0FBQztJQUM5RCxNQUFNLFdBQVcsR0FBRyxPQUFPLENBQUMsSUFBSSxDQUFDLEdBQUcsQ0FBQyxPQUFPLENBQUMsTUFBTSxDQUFDLENBQUMsTUFBb0IsQ0FBQztJQUUxRSxNQUFNLE9BQU8sR0FDVCxZQUFZLENBQUMsS0FBSyxFQUFFLFdBQVcsRUFBRSxPQUFPLENBQUMsS0FBSyxFQUFFLE9BQU8sQ0FBQyxLQUFLLEVBQUUsSUFBSSxDQUFDLENBQUM7SUFFekUsT0FBTyxPQUFPLENBQUMsY0FBYyxDQUFDLENBQUMsSUFBSSxDQUFDLEVBQUUsT0FBTyxDQUFDLEtBQUssRUFBRSxPQUFPLENBQUMsQ0FBQztBQUNoRSxDQUFDO0FBRUQsTUFBTSxDQUFDLE1BQU0sY0FBYyxHQUFpQjtJQUMxQyxVQUFVLEVBQUUsUUFBUTtJQUNwQixXQUFXLEVBQUUsS0FBSztJQUNsQixVQUFVLEVBQUUsUUFBNEI7Q0FDekMsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbIi8qKlxuICogQGxpY2Vuc2VcbiAqIENvcHlyaWdodCAyMDIwIEdvb2dsZSBMTEMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuXG4gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgXCJMaWNlbnNlXCIpO1xuICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLlxuICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0XG4gKlxuICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wXG4gKlxuICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZVxuICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gXCJBUyBJU1wiIEJBU0lTLFxuICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuXG4gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kXG4gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS5cbiAqID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4gKi9cblxuaW1wb3J0IHtCaW5jb3VudCwgQmluY291bnRBdHRycywgQmluY291bnRJbnB1dHMsIEtlcm5lbENvbmZpZywgS2VybmVsRnVuYywgVGVuc29ySW5mbywgVHlwZWRBcnJheX0gZnJvbSAnQHRlbnNvcmZsb3cvdGZqcy1jb3JlJztcblxuaW1wb3J0IHtNYXRoQmFja2VuZENQVX0gZnJvbSAnLi4vYmFja2VuZF9jcHUnO1xuaW1wb3J0IHtiaW5jb3VudEltcGx9IGZyb20gJy4vQmluY291bnRfaW1wbCc7XG5cbmV4cG9ydCBmdW5jdGlvbiBiaW5jb3VudChhcmdzOiB7XG4gIGlucHV0czogQmluY291bnRJbnB1dHMsXG4gIGJhY2tlbmQ6IE1hdGhCYWNrZW5kQ1BVLFxuICBhdHRyczogQmluY291bnRBdHRyc1xufSk6IFRlbnNvckluZm8ge1xuICBjb25zdCB7aW5wdXRzLCBiYWNrZW5kLCBhdHRyc30gPSBhcmdzO1xuICBjb25zdCB7eCwgd2VpZ2h0c30gPSBpbnB1dHM7XG4gIGNvbnN0IHtzaXplfSA9IGF0dHJzO1xuXG4gIGNvbnN0IHhWYWxzID0gYmFja2VuZC5kYXRhLmdldCh4LmRhdGFJZCkudmFsdWVzIGFzIFR5cGVkQXJyYXk7XG4gIGNvbnN0IHdlaWdodHNWYWxzID0gYmFja2VuZC5kYXRhLmdldCh3ZWlnaHRzLmRhdGFJZCkudmFsdWVzIGFzIFR5cGVkQXJyYXk7XG5cbiAgY29uc3Qgb3V0VmFscyA9XG4gICAgICBiaW5jb3VudEltcGwoeFZhbHMsIHdlaWdodHNWYWxzLCB3ZWlnaHRzLmR0eXBlLCB3ZWlnaHRzLnNoYXBlLCBzaXplKTtcblxuICByZXR1cm4gYmFja2VuZC5tYWtlVGVuc29ySW5mbyhbc2l6ZV0sIHdlaWdodHMuZHR5cGUsIG91dFZhbHMpO1xufVxuXG5leHBvcnQgY29uc3QgYmluY291bnRDb25maWc6IEtlcm5lbENvbmZpZyA9IHtcbiAga2VybmVsTmFtZTogQmluY291bnQsXG4gIGJhY2tlbmROYW1lOiAnY3B1JyxcbiAga2VybmVsRnVuYzogYmluY291bnQgYXMge30gYXMgS2VybmVsRnVuY1xufTtcbiJdfQ==","/**\n * @license\n * Copyright 2021 Google LLC. All Rights Reserved.\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n * =============================================================================\n */\nimport { backend_util, BroadcastArgs } from '@tensorflow/tfjs-core';\nexport function broadcastArgs(args) {\n const { inputs, backend } = args;\n const { s0, s1 } = inputs;\n const s0Vals = backend.data.get(s0.dataId).values;\n const s1Vals = backend.data.get(s1.dataId).values;\n const broadcastShape = backend_util.assertAndGetBroadcastShape(Array.from(s0Vals), Array.from(s1Vals));\n return backend.makeTensorInfo([broadcastShape.length], 'int32', Int32Array.from(broadcastShape));\n}\nexport const broadcastArgsConfig = {\n kernelName: BroadcastArgs,\n backendName: 'cpu',\n kernelFunc: broadcastArgs\n};\n//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiQnJvYWRjYXN0QXJncy5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uLy4uL3RmanMtYmFja2VuZC1jcHUvc3JjL2tlcm5lbHMvQnJvYWRjYXN0QXJncy50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQTs7Ozs7Ozs7Ozs7Ozs7O0dBZUc7QUFFSCxPQUFPLEVBQUMsWUFBWSxFQUFFLGFBQWEsRUFBNEQsTUFBTSx1QkFBdUIsQ0FBQztBQUk3SCxNQUFNLFVBQVUsYUFBYSxDQUFDLElBRzdCO0lBQ0MsTUFBTSxFQUFDLE1BQU0sRUFBRSxPQUFPLEVBQUMsR0FBRyxJQUFJLENBQUM7SUFDL0IsTUFBTSxFQUFDLEVBQUUsRUFBRSxFQUFFLEVBQUMsR0FBRyxNQUFNLENBQUM7SUFFeEIsTUFBTSxNQUFNLEdBQUcsT0FBTyxDQUFDLElBQUksQ0FBQyxHQUFHLENBQUMsRUFBRSxDQUFDLE1BQU0sQ0FBQyxDQUFDLE1BQW9CLENBQUM7SUFDaEUsTUFBTSxNQUFNLEdBQUcsT0FBTyxDQUFDLElBQUksQ0FBQyxHQUFHLENBQUMsRUFBRSxDQUFDLE1BQU0sQ0FBQyxDQUFDLE1BQW9CLENBQUM7SUFFaEUsTUFBTSxjQUFjLEdBQUcsWUFBWSxDQUFDLDBCQUEwQixDQUMxRCxLQUFLLENBQUMsSUFBSSxDQUFDLE1BQU0sQ0FBQyxFQUFFLEtBQUssQ0FBQyxJQUFJLENBQUMsTUFBTSxDQUFDLENBQUMsQ0FBQztJQUU1QyxPQUFPLE9BQU8sQ0FBQyxjQUFjLENBQ3pCLENBQUMsY0FBYyxDQUFDLE1BQU0sQ0FBQyxFQUFFLE9BQU8sRUFBRSxVQUFVLENBQUMsSUFBSSxDQUFDLGNBQWMsQ0FBQyxDQUFDLENBQUM7QUFDekUsQ0FBQztBQUVELE1BQU0sQ0FBQyxNQUFNLG1CQUFtQixHQUFpQjtJQUMvQyxVQUFVLEVBQUUsYUFBYTtJQUN6QixXQUFXLEVBQUUsS0FBSztJQUNsQixVQUFVLEVBQUUsYUFBYTtDQUMxQixDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiLyoqXG4gKiBAbGljZW5zZVxuICogQ29weXJpZ2h0IDIwMjEgR29vZ2xlIExMQy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC5cbiAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSBcIkxpY2Vuc2VcIik7XG4gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuXG4gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXRcbiAqXG4gKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjBcbiAqXG4gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlXG4gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiBcIkFTIElTXCIgQkFTSVMsXG4gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC5cbiAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmRcbiAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLlxuICogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbiAqL1xuXG5pbXBvcnQge2JhY2tlbmRfdXRpbCwgQnJvYWRjYXN0QXJncywgQnJvYWRjYXN0QXJnc0lucHV0cywgS2VybmVsQ29uZmlnLCBUZW5zb3JJbmZvLCBUeXBlZEFycmF5fSBmcm9tICdAdGVuc29yZmxvdy90ZmpzLWNvcmUnO1xuXG5pbXBvcnQge01hdGhCYWNrZW5kQ1BVfSBmcm9tICcuLi9iYWNrZW5kX2NwdSc7XG5cbmV4cG9ydCBmdW5jdGlvbiBicm9hZGNhc3RBcmdzKGFyZ3M6IHtcbiAgaW5wdXRzOiBCcm9hZGNhc3RBcmdzSW5wdXRzLFxuICBiYWNrZW5kOiBNYXRoQmFja2VuZENQVSxcbn0pOiBUZW5zb3JJbmZvIHtcbiAgY29uc3Qge2lucHV0cywgYmFja2VuZH0gPSBhcmdzO1xuICBjb25zdCB7czAsIHMxfSA9IGlucHV0cztcblxuICBjb25zdCBzMFZhbHMgPSBiYWNrZW5kLmRhdGEuZ2V0KHMwLmRhdGFJZCkudmFsdWVzIGFzIFR5cGVkQXJyYXk7XG4gIGNvbnN0IHMxVmFscyA9IGJhY2tlbmQuZGF0YS5nZXQoczEuZGF0YUlkKS52YWx1ZXMgYXMgVHlwZWRBcnJheTtcblxuICBjb25zdCBicm9hZGNhc3RTaGFwZSA9IGJhY2tlbmRfdXRpbC5hc3NlcnRBbmRHZXRCcm9hZGNhc3RTaGFwZShcbiAgICAgIEFycmF5LmZyb20oczBWYWxzKSwgQXJyYXkuZnJvbShzMVZhbHMpKTtcblxuICByZXR1cm4gYmFja2VuZC5tYWtlVGVuc29ySW5mbyhcbiAgICAgIFticm9hZGNhc3RTaGFwZS5sZW5ndGhdLCAnaW50MzInLCBJbnQzMkFycmF5LmZyb20oYnJvYWRjYXN0U2hhcGUpKTtcbn1cblxuZXhwb3J0IGNvbnN0IGJyb2FkY2FzdEFyZ3NDb25maWc6IEtlcm5lbENvbmZpZyA9IHtcbiAga2VybmVsTmFtZTogQnJvYWRjYXN0QXJncyxcbiAgYmFja2VuZE5hbWU6ICdjcHUnLFxuICBrZXJuZWxGdW5jOiBicm9hZGNhc3RBcmdzXG59O1xuIl19","/**\n * @license\n * Copyright 2020 Google LLC. All Rights Reserved.\n * Licensed under the Apache License, Version 2.0 (the License);\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an AS IS BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n * =============================================================================\n */\nimport { Ceil } from '@tensorflow/tfjs-core';\nimport { createSimpleUnaryImpl } from '../utils/unary_impl';\nimport { unaryKernelFuncFromImpl } from '../utils/unary_utils';\nexport const ceilImpl = createSimpleUnaryImpl((xi) => Math.ceil(xi));\nexport const ceil = unaryKernelFuncFromImpl(Ceil, ceilImpl);\nexport const ceilConfig = {\n kernelName: Ceil,\n backendName: 'cpu',\n kernelFunc: ceil,\n};\n//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiQ2VpbC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uLy4uL3RmanMtYmFja2VuZC1jcHUvc3JjL2tlcm5lbHMvQ2VpbC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQTs7Ozs7Ozs7Ozs7Ozs7O0dBZUc7QUFFSCxPQUFPLEVBQUMsSUFBSSxFQUFlLE1BQU0sdUJBQXVCLENBQUM7QUFFekQsT0FBTyxFQUFDLHFCQUFxQixFQUFDLE1BQU0scUJBQXFCLENBQUM7QUFDMUQsT0FBTyxFQUFDLHVCQUF1QixFQUFDLE1BQU0sc0JBQXNCLENBQUM7QUFFN0QsTUFBTSxDQUFDLE1BQU0sUUFBUSxHQUFHLHFCQUFxQixDQUFDLENBQUMsRUFBRSxFQUFFLEVBQUUsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUM7QUFDckUsTUFBTSxDQUFDLE1BQU0sSUFBSSxHQUFHLHVCQUF1QixDQUFDLElBQUksRUFBRSxRQUFRLENBQUMsQ0FBQztBQUU1RCxNQUFNLENBQUMsTUFBTSxVQUFVLEdBQWlCO0lBQ3RDLFVBQVUsRUFBRSxJQUFJO0lBQ2hCLFdBQVcsRUFBRSxLQUFLO0lBQ2xCLFVBQVUsRUFBRSxJQUFJO0NBQ2pCLENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyIvKipcbiAqIEBsaWNlbnNlXG4gKiBDb3B5cmlnaHQgMjAyMCBHb29nbGUgTExDLiBBbGwgUmlnaHRzIFJlc2VydmVkLlxuICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlIExpY2Vuc2UpO1xuICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLlxuICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0XG4gKlxuICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wXG4gKlxuICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZVxuICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gQVMgSVMgQkFTSVMsXG4gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC5cbiAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmRcbiAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLlxuICogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbiAqL1xuXG5pbXBvcnQge0NlaWwsIEtlcm5lbENvbmZpZ30gZnJvbSAnQHRlbnNvcmZsb3cvdGZqcy1jb3JlJztcblxuaW1wb3J0IHtjcmVhdGVTaW1wbGVVbmFyeUltcGx9IGZyb20gJy4uL3V0aWxzL3VuYXJ5X2ltcGwnO1xuaW1wb3J0IHt1bmFyeUtlcm5lbEZ1bmNGcm9tSW1wbH0gZnJvbSAnLi4vdXRpbHMvdW5hcnlfdXRpbHMnO1xuXG5leHBvcnQgY29uc3QgY2VpbEltcGwgPSBjcmVhdGVTaW1wbGVVbmFyeUltcGwoKHhpKSA9PiBNYXRoLmNlaWwoeGkpKTtcbmV4cG9ydCBjb25zdCBjZWlsID0gdW5hcnlLZXJuZWxGdW5jRnJvbUltcGwoQ2VpbCwgY2VpbEltcGwpO1xuXG5leHBvcnQgY29uc3QgY2VpbENvbmZpZzogS2VybmVsQ29uZmlnID0ge1xuICBrZXJuZWxOYW1lOiBDZWlsLFxuICBiYWNrZW5kTmFtZTogJ2NwdScsXG4gIGtlcm5lbEZ1bmM6IGNlaWwsXG59O1xuIl19","/**\n * @license\n * Copyright 2020 Google LLC. All Rights Reserved.\n * Licensed under the Apache License, Version 2.0 (the License);\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an AS IS BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n * =============================================================================\n */\nimport { ClipByValue } from '@tensorflow/tfjs-core';\nimport { unaryKernelFunc } from '../utils/unary_utils';\nexport const clipByValue = unaryKernelFunc(ClipByValue, (xi, attrs) => {\n const clipAttrs = attrs;\n if (xi > clipAttrs.clipValueMax) {\n return clipAttrs.clipValueMax;\n }\n return xi < clipAttrs.clipValueMin ? clipAttrs.clipValueMin : xi;\n});\nexport const clipByValueConfig = {\n kernelName: ClipByValue,\n backendName: 'cpu',\n kernelFunc: clipByValue,\n};\n//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiQ2xpcEJ5VmFsdWUuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi8uLi90ZmpzLWJhY2tlbmQtY3B1L3NyYy9rZXJuZWxzL0NsaXBCeVZhbHVlLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBOzs7Ozs7Ozs7Ozs7Ozs7R0FlRztBQUVILE9BQU8sRUFBQyxXQUFXLEVBQWlDLE1BQU0sdUJBQXVCLENBQUM7QUFFbEYsT0FBTyxFQUFDLGVBQWUsRUFBQyxNQUFNLHNCQUFzQixDQUFDO0FBRXJELE1BQU0sQ0FBQyxNQUFNLFdBQVcsR0FBRyxlQUFlLENBQUMsV0FBVyxFQUFFLENBQUMsRUFBRSxFQUFFLEtBQUssRUFBRSxFQUFFO0lBQ3BFLE1BQU0sU0FBUyxHQUFHLEtBQStCLENBQUM7SUFDbEQsSUFBSSxFQUFFLEdBQUcsU0FBUyxDQUFDLFlBQVksRUFBRTtRQUMvQixPQUFPLFNBQVMsQ0FBQyxZQUFZLENBQUM7S0FDL0I7SUFDRCxPQUFPLEVBQUUsR0FBRyxTQUFTLENBQUMsWUFBWSxDQUFDLENBQUMsQ0FBQyxTQUFTLENBQUMsWUFBWSxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUM7QUFDbkUsQ0FBQyxDQUFDLENBQUM7QUFFSCxNQUFNLENBQUMsTUFBTSxpQkFBaUIsR0FBaUI7SUFDN0MsVUFBVSxFQUFFLFdBQVc7SUFDdkIsV0FBVyxFQUFFLEtBQUs7SUFDbEIsVUFBVSxFQUFFLFdBQVc7Q0FDeEIsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbIi8qKlxuICogQGxpY2Vuc2VcbiAqIENvcHlyaWdodCAyMDIwIEdvb2dsZSBMTEMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuXG4gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgTGljZW5zZSk7XG4gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuXG4gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXRcbiAqXG4gKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjBcbiAqXG4gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlXG4gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiBBUyBJUyBCQVNJUyxcbiAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLlxuICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZFxuICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuXG4gKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuICovXG5cbmltcG9ydCB7Q2xpcEJ5VmFsdWUsIENsaXBCeVZhbHVlQXR0cnMsIEtlcm5lbENvbmZpZ30gZnJvbSAnQHRlbnNvcmZsb3cvdGZqcy1jb3JlJztcblxuaW1wb3J0IHt1bmFyeUtlcm5lbEZ1bmN9IGZyb20gJy4uL3V0aWxzL3VuYXJ5X3V0aWxzJztcblxuZXhwb3J0IGNvbnN0IGNsaXBCeVZhbHVlID0gdW5hcnlLZXJuZWxGdW5jKENsaXBCeVZhbHVlLCAoeGksIGF0dHJzKSA9PiB7XG4gIGNvbnN0IGNsaXBBdHRycyA9IGF0dHJzIGFzIHt9IGFzIENsaXBCeVZhbHVlQXR0cnM7XG4gIGlmICh4aSA+IGNsaXBBdHRycy5jbGlwVmFsdWVNYXgpIHtcbiAgICByZXR1cm4gY2xpcEF0dHJzLmNsaXBWYWx1ZU1heDtcbiAgfVxuICByZXR1cm4geGkgPCBjbGlwQXR0cnMuY2xpcFZhbHVlTWluID8gY2xpcEF0dHJzLmNsaXBWYWx1ZU1pbiA6IHhpO1xufSk7XG5cbmV4cG9ydCBjb25zdCBjbGlwQnlWYWx1ZUNvbmZpZzogS2VybmVsQ29uZmlnID0ge1xuICBrZXJuZWxOYW1lOiBDbGlwQnlWYWx1ZSxcbiAgYmFja2VuZE5hbWU6ICdjcHUnLFxuICBrZXJuZWxGdW5jOiBjbGlwQnlWYWx1ZSxcbn07XG4iXX0=","/**\n * @license\n * Copyright 2020 Google LLC. All Rights Reserved.\n * Licensed under the Apache License, Version 2.0 (the License);\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an AS IS BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n * =============================================================================\n */\nimport { ComplexAbs, util } from '@tensorflow/tfjs-core';\nexport const complexAbs = (args) => {\n const { x } = args.inputs;\n const cpuBackend = args.backend;\n const resultValues = new Float32Array(util.sizeFromShape(x.shape));\n const complexVals = cpuBackend.data.get(x.dataId);\n const real = complexVals.complexTensorInfos.real;\n const imag = complexVals.complexTensorInfos.imag;\n const realVals = cpuBackend.data.get(real.dataId).values;\n const imagVals = cpuBackend.data.get(imag.dataId).values;\n for (let i = 0; i < realVals.length; i++) {\n const real = realVals[i];\n const imag = imagVals[i];\n resultValues[i] = Math.hypot(real, imag);\n }\n return cpuBackend.makeOutput(resultValues, x.shape, 'float32');\n};\nexport const complexAbsConfig = {\n kernelName: ComplexAbs,\n backendName: 'cpu',\n kernelFunc: complexAbs,\n};\n//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiQ29tcGxleEFicy5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uLy4uL3RmanMtYmFja2VuZC1jcHUvc3JjL2tlcm5lbHMvQ29tcGxleEFicy50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQTs7Ozs7Ozs7Ozs7Ozs7O0dBZUc7QUFFSCxPQUFPLEVBQUMsVUFBVSxFQUE4QyxJQUFJLEVBQUMsTUFBTSx1QkFBdUIsQ0FBQztBQUluRyxNQUFNLENBQUMsTUFBTSxVQUFVLEdBQ25CLENBQUMsSUFBeUQsRUFBRSxFQUFFO0lBQzVELE1BQU0sRUFBQyxDQUFDLEVBQUMsR0FBRyxJQUFJLENBQUMsTUFBTSxDQUFDO0lBQ3hCLE1BQU0sVUFBVSxHQUFHLElBQUksQ0FBQyxPQUFPLENBQUM7SUFDaEMsTUFBTSxZQUFZLEdBQUcsSUFBSSxZQUFZLENBQUMsSUFBSSxDQUFDLGFBQWEsQ0FBQyxDQUFDLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQztJQUNuRSxNQUFNLFdBQVcsR0FBRyxVQUFVLENBQUMsSUFBSSxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsTUFBTSxDQUFDLENBQUM7SUFDbEQsTUFBTSxJQUFJLEdBQUcsV0FBVyxDQUFDLGtCQUFrQixDQUFDLElBQUksQ0FBQztJQUNqRCxNQUFNLElBQUksR0FBRyxXQUFXLENBQUMsa0JBQWtCLENBQUMsSUFBSSxDQUFDO0lBQ2pELE1BQU0sUUFBUSxHQUFHLFVBQVUsQ0FBQyxJQUFJLENBQUMsR0FBRyxDQUFDLElBQUksQ0FBQyxNQUFNLENBQUMsQ0FBQyxNQUFzQixDQUFDO0lBQ3pFLE1BQU0sUUFBUSxHQUFHLFVBQVUsQ0FBQyxJQUFJLENBQUMsR0FBRyxDQUFDLElBQUksQ0FBQyxNQUFNLENBQUMsQ0FBQyxNQUFzQixDQUFDO0lBQ3pFLEtBQUssSUFBSSxDQUFDLEdBQUcsQ0FBQyxFQUFFLENBQUMsR0FBRyxRQUFRLENBQUMsTUFBTSxFQUFFLENBQUMsRUFBRSxFQUFFO1FBQ3hDLE1BQU0sSUFBSSxHQUFHLFFBQVEsQ0FBQyxDQUFDLENBQUMsQ0FBQztRQUN6QixNQUFNLElBQUksR0FBRyxRQUFRLENBQUMsQ0FBQyxDQUFDLENBQUM7UUFDekIsWUFBWSxDQUFDLENBQUMsQ0FBQyxHQUFHLElBQUksQ0FBQyxLQUFLLENBQUMsSUFBSSxFQUFFLElBQUksQ0FBQyxDQUFDO0tBQzFDO0lBRUQsT0FBTyxVQUFVLENBQUMsVUFBVSxDQUFDLFlBQVksRUFBRSxDQUFDLENBQUMsS0FBSyxFQUFFLFNBQVMsQ0FBQyxDQUFDO0FBQ2pFLENBQUMsQ0FBQztBQUVOLE1BQU0sQ0FBQyxNQUFNLGdCQUFnQixHQUFpQjtJQUM1QyxVQUFVLEVBQUUsVUFBVTtJQUN0QixXQUFXLEVBQUUsS0FBSztJQUNsQixVQUFVLEVBQUUsVUFBOEI7Q0FDM0MsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbIi8qKlxuICogQGxpY2Vuc2VcbiAqIENvcHlyaWdodCAyMDIwIEdvb2dsZSBMTEMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuXG4gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgTGljZW5zZSk7XG4gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuXG4gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXRcbiAqXG4gKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjBcbiAqXG4gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlXG4gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiBBUyBJUyBCQVNJUyxcbiAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLlxuICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZFxuICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuXG4gKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuICovXG5cbmltcG9ydCB7Q29tcGxleEFicywgQ29tcGxleEFic0lucHV0cywgS2VybmVsQ29uZmlnLCBLZXJuZWxGdW5jLCB1dGlsfSBmcm9tICdAdGVuc29yZmxvdy90ZmpzLWNvcmUnO1xuXG5pbXBvcnQge01hdGhCYWNrZW5kQ1BVfSBmcm9tICcuLi9iYWNrZW5kX2NwdSc7XG5cbmV4cG9ydCBjb25zdCBjb21wbGV4QWJzID1cbiAgICAoYXJnczoge2lucHV0czogQ29tcGxleEFic0lucHV0cywgYmFja2VuZDogTWF0aEJhY2tlbmRDUFV9KSA9PiB7XG4gICAgICBjb25zdCB7eH0gPSBhcmdzLmlucHV0cztcbiAgICAgIGNvbnN0IGNwdUJhY2tlbmQgPSBhcmdzLmJhY2tlbmQ7XG4gICAgICBjb25zdCByZXN1bHRWYWx1ZXMgPSBuZXcgRmxvYXQzMkFycmF5KHV0aWwuc2l6ZUZyb21TaGFwZSh4LnNoYXBlKSk7XG4gICAgICBjb25zdCBjb21wbGV4VmFscyA9IGNwdUJhY2tlbmQuZGF0YS5nZXQoeC5kYXRhSWQpO1xuICAgICAgY29uc3QgcmVhbCA9IGNvbXBsZXhWYWxzLmNvbXBsZXhUZW5zb3JJbmZvcy5yZWFsO1xuICAgICAgY29uc3QgaW1hZyA9IGNvbXBsZXhWYWxzLmNvbXBsZXhUZW5zb3JJbmZvcy5pbWFnO1xuICAgICAgY29uc3QgcmVhbFZhbHMgPSBjcHVCYWNrZW5kLmRhdGEuZ2V0KHJlYWwuZGF0YUlkKS52YWx1ZXMgYXMgRmxvYXQzMkFycmF5O1xuICAgICAgY29uc3QgaW1hZ1ZhbHMgPSBjcHVCYWNrZW5kLmRhdGEuZ2V0KGltYWcuZGF0YUlkKS52YWx1ZXMgYXMgRmxvYXQzMkFycmF5O1xuICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCByZWFsVmFscy5sZW5ndGg7IGkrKykge1xuICAgICAgICBjb25zdCByZWFsID0gcmVhbFZhbHNbaV07XG4gICAgICAgIGNvbnN0IGltYWcgPSBpbWFnVmFsc1tpXTtcbiAgICAgICAgcmVzdWx0VmFsdWVzW2ldID0gTWF0aC5oeXBvdChyZWFsLCBpbWFnKTtcbiAgICAgIH1cblxuICAgICAgcmV0dXJuIGNwdUJhY2tlbmQubWFrZU91dHB1dChyZXN1bHRWYWx1ZXMsIHguc2hhcGUsICdmbG9hdDMyJyk7XG4gICAgfTtcblxuZXhwb3J0IGNvbnN0IGNvbXBsZXhBYnNDb25maWc6IEtlcm5lbENvbmZpZyA9IHtcbiAga2VybmVsTmFtZTogQ29tcGxleEFicyxcbiAgYmFja2VuZE5hbWU6ICdjcHUnLFxuICBrZXJuZWxGdW5jOiBjb21wbGV4QWJzIGFzIHt9IGFzIEtlcm5lbEZ1bmMsXG59O1xuIl19","/**\n * @license\n * Copyright 2020 Google LLC. All Rights Reserved.\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n * =============================================================================\n */\nimport { backend_util, util } from '@tensorflow/tfjs-core';\nexport function concatImpl(inputs, outShape, dtype, simplyConcat) {\n const outVals = util.getArrayFromDType(dtype, util.sizeFromShape(outShape));\n if (simplyConcat && dtype !== 'string') {\n // Use built-in TypedArray.set() method for speed.\n let offset = 0;\n inputs.forEach(input => {\n const size = util.sizeFromShape(input.shape);\n outVals.set(input.vals, offset);\n offset += size;\n });\n }\n else {\n let colOffset = 0;\n inputs.forEach(input => {\n const decodedData = dtype === 'string' ?\n backend_util.fromUint8ToStringArray(input.vals) :\n input.vals;\n let tIdx = 0;\n for (let row = 0; row < input.shape[0]; ++row) {\n const resIdx = row * outShape[1] + colOffset;\n for (let col = 0; col < input.shape[1]; ++col) {\n outVals[resIdx + col] = decodedData[tIdx++];\n }\n }\n colOffset += input.shape[1];\n });\n }\n return outVals;\n}\n//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiQ29uY2F0X2ltcGwuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi8uLi90ZmpzLWJhY2tlbmQtY3B1L3NyYy9rZXJuZWxzL0NvbmNhdF9pbXBsLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBOzs7Ozs7Ozs7Ozs7Ozs7R0FlRztBQUVILE9BQU8sRUFBQyxZQUFZLEVBQXVDLElBQUksRUFBQyxNQUFNLHVCQUF1QixDQUFDO0FBRTlGLE1BQU0sVUFBVSxVQUFVLENBQ3RCLE1BQXFELEVBQUUsUUFBa0IsRUFDekUsS0FBZSxFQUFFLFlBQXFCO0lBQ3hDLE1BQU0sT0FBTyxHQUFHLElBQUksQ0FBQyxpQkFBaUIsQ0FBQyxLQUFLLEVBQUUsSUFBSSxDQUFDLGFBQWEsQ0FBQyxRQUFRLENBQUMsQ0FBQyxDQUFDO0lBRTVFLElBQUksWUFBWSxJQUFJLEtBQUssS0FBSyxRQUFRLEVBQUU7UUFDdEMsa0RBQWtEO1FBQ2xELElBQUksTUFBTSxHQUFHLENBQUMsQ0FBQztRQUNmLE1BQU0sQ0FBQyxPQUFPLENBQUMsS0FBSyxDQUFDLEVBQUU7WUFDckIsTUFBTSxJQUFJLEdBQUcsSUFBSSxDQUFDLGFBQWEsQ0FBQyxLQUFLLENBQUMsS0FBSyxDQUFDLENBQUM7WUFFNUMsT0FBc0IsQ0FBQyxHQUFHLENBQUMsS0FBSyxDQUFDLElBQWtCLEVBQUUsTUFBTSxDQUFDLENBQUM7WUFDOUQsTUFBTSxJQUFJLElBQUksQ0FBQztRQUNqQixDQUFDLENBQUMsQ0FBQztLQUNKO1NBQU07UUFDTCxJQUFJLFNBQVMsR0FBRyxDQUFDLENBQUM7UUFFbEIsTUFBTSxDQUFDLE9BQU8sQ0FBQyxLQUFLLENBQUMsRUFBRTtZQUNyQixNQUFNLFdBQVcsR0FBRyxLQUFLLEtBQUssUUFBUSxDQUFDLENBQUM7Z0JBQ3BDLFlBQVksQ0FBQyxzQkFBc0IsQ0FBQyxLQUFLLENBQUMsSUFBb0IsQ0FBQyxDQUFDLENBQUM7Z0JBQ2pFLEtBQUssQ0FBQyxJQUFrQixDQUFDO1lBRTdCLElBQUksSUFBSSxHQUFHLENBQUMsQ0FBQztZQUViLEtBQUssSUFBSSxHQUFHLEdBQUcsQ0FBQyxFQUFFLEdBQUcsR0FBRyxLQUFLLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQyxFQUFFLEVBQUUsR0FBRyxFQUFFO2dCQUM3QyxNQUFNLE1BQU0sR0FBRyxHQUFHLEdBQUcsUUFBUSxDQUFDLENBQUMsQ0FBQyxHQUFHLFNBQVMsQ0FBQztnQkFDN0MsS0FBSyxJQUFJLEdBQUcsR0FBRyxDQUFDLEVBQUUsR0FBRyxHQUFHLEtBQUssQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDLEVBQUUsRUFBRSxHQUFHLEVBQUU7b0JBQzdDLE9BQU8sQ0FBQyxNQUFNLEdBQUcsR0FBRyxDQUFDLEdBQUcsV0FBVyxDQUFDLElBQUksRUFBRSxDQUFDLENBQUM7aUJBQzdDO2FBQ0Y7WUFFRCxTQUFTLElBQUksS0FBSyxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUMsQ0FBQztRQUM5QixDQUFDLENBQUMsQ0FBQztLQUNKO0lBRUQsT0FBTyxPQUFPLENBQUM7QUFDakIsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbIi8qKlxuICogQGxpY2Vuc2VcbiAqIENvcHlyaWdodCAyMDIwIEdvb2dsZSBMTEMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuXG4gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgXCJMaWNlbnNlXCIpO1xuICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLlxuICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0XG4gKlxuICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wXG4gKlxuICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZVxuICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gXCJBUyBJU1wiIEJBU0lTLFxuICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuXG4gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kXG4gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS5cbiAqID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4gKi9cblxuaW1wb3J0IHtiYWNrZW5kX3V0aWwsIEJhY2tlbmRWYWx1ZXMsIERhdGFUeXBlLCBUeXBlZEFycmF5LCB1dGlsfSBmcm9tICdAdGVuc29yZmxvdy90ZmpzLWNvcmUnO1xuXG5leHBvcnQgZnVuY3Rpb24gY29uY2F0SW1wbChcbiAgICBpbnB1dHM6IEFycmF5PHt2YWxzOiBCYWNrZW5kVmFsdWVzLCBzaGFwZTogbnVtYmVyW119Piwgb3V0U2hhcGU6IG51bWJlcltdLFxuICAgIGR0eXBlOiBEYXRhVHlwZSwgc2ltcGx5Q29uY2F0OiBib29sZWFuKTogVHlwZWRBcnJheXxzdHJpbmdbXSB7XG4gIGNvbnN0IG91dFZhbHMgPSB1dGlsLmdldEFycmF5RnJvbURUeXBlKGR0eXBlLCB1dGlsLnNpemVGcm9tU2hhcGUob3V0U2hhcGUpKTtcblxuICBpZiAoc2ltcGx5Q29uY2F0ICYmIGR0eXBlICE9PSAnc3RyaW5nJykge1xuICAgIC8vIFVzZSBidWlsdC1pbiBUeXBlZEFycmF5LnNldCgpIG1ldGhvZCBmb3Igc3BlZWQuXG4gICAgbGV0IG9mZnNldCA9IDA7XG4gICAgaW5wdXRzLmZvckVhY2goaW5wdXQgPT4ge1xuICAgICAgY29uc3Qgc2l6ZSA9IHV0aWwuc2l6ZUZyb21TaGFwZShpbnB1dC5zaGFwZSk7XG5cbiAgICAgIChvdXRWYWxzIGFzIFR5cGVkQXJyYXkpLnNldChpbnB1dC52YWxzIGFzIFR5cGVkQXJyYXksIG9mZnNldCk7XG4gICAgICBvZmZzZXQgKz0gc2l6ZTtcbiAgICB9KTtcbiAgfSBlbHNlIHtcbiAgICBsZXQgY29sT2Zmc2V0ID0gMDtcblxuICAgIGlucHV0cy5mb3JFYWNoKGlucHV0ID0+IHtcbiAgICAgIGNvbnN0IGRlY29kZWREYXRhID0gZHR5cGUgPT09ICdzdHJpbmcnID9cbiAgICAgICAgICBiYWNrZW5kX3V0aWwuZnJvbVVpbnQ4VG9TdHJpbmdBcnJheShpbnB1dC52YWxzIGFzIFVpbnQ4QXJyYXlbXSkgOlxuICAgICAgICAgIGlucHV0LnZhbHMgYXMgVHlwZWRBcnJheTtcblxuICAgICAgbGV0IHRJZHggPSAwO1xuXG4gICAgICBmb3IgKGxldCByb3cgPSAwOyByb3cgPCBpbnB1dC5zaGFwZVswXTsgKytyb3cpIHtcbiAgICAgICAgY29uc3QgcmVzSWR4ID0gcm93ICogb3V0U2hhcGVbMV0gKyBjb2xPZmZzZXQ7XG4gICAgICAgIGZvciAobGV0IGNvbCA9IDA7IGNvbCA8IGlucHV0LnNoYXBlWzFdOyArK2NvbCkge1xuICAgICAgICAgIG91dFZhbHNbcmVzSWR4ICsgY29sXSA9IGRlY29kZWREYXRhW3RJZHgrK107XG4gICAgICAgIH1cbiAgICAgIH1cblxuICAgICAgY29sT2Zmc2V0ICs9IGlucHV0LnNoYXBlWzFdO1xuICAgIH0pO1xuICB9XG5cbiAgcmV0dXJuIG91dFZhbHM7XG59XG4iXX0=","/**\n * @license\n * Copyright 2020 Google LLC. All Rights Reserved.\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n * =============================================================================\n */\nimport { Imag } from '@tensorflow/tfjs-core';\nexport function imag(args) {\n const { inputs, backend } = args;\n const { input } = inputs;\n const imag = backend.data.get(input.dataId).complexTensorInfos.imag;\n const imagVal = backend.data.get(imag.dataId).values;\n // When complex tensor is disposed, its underlying parts will be disposed too.\n // Make new tensor out of the imag value of the complex. This makes sure the\n // value is still accessible even if complex tensor is disposed.\n return backend.makeTensorInfo(imag.shape, imag.dtype, imagVal);\n}\nexport const imagConfig = {\n kernelName: Imag,\n backendName: 'cpu',\n kernelFunc: imag\n};\n//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiSW1hZy5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uLy4uL3RmanMtYmFja2VuZC1jcHUvc3JjL2tlcm5lbHMvSW1hZy50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQTs7Ozs7Ozs7Ozs7Ozs7O0dBZUc7QUFFSCxPQUFPLEVBQUMsSUFBSSxFQUFtRCxNQUFNLHVCQUF1QixDQUFDO0FBSTdGLE1BQU0sVUFBVSxJQUFJLENBQUMsSUFBbUQ7SUFFdEUsTUFBTSxFQUFDLE1BQU0sRUFBRSxPQUFPLEVBQUMsR0FBRyxJQUFJLENBQUM7SUFDL0IsTUFBTSxFQUFDLEtBQUssRUFBQyxHQUFHLE1BQU0sQ0FBQztJQUV2QixNQUFNLElBQUksR0FBRyxPQUFPLENBQUMsSUFBSSxDQUFDLEdBQUcsQ0FBQyxLQUFLLENBQUMsTUFBTSxDQUFDLENBQUMsa0JBQWtCLENBQUMsSUFBSSxDQUFDO0lBQ3BFLE1BQU0sT0FBTyxHQUFHLE9BQU8sQ0FBQyxJQUFJLENBQUMsR0FBRyxDQUFDLElBQUksQ0FBQyxNQUFNLENBQUMsQ0FBQyxNQUFNLENBQUM7SUFFckQsOEVBQThFO0lBQzlFLDRFQUE0RTtJQUM1RSxnRUFBZ0U7SUFDaEUsT0FBTyxPQUFPLENBQUMsY0FBYyxDQUFDLElBQUksQ0FBQyxLQUFLLEVBQUUsSUFBSSxDQUFDLEtBQUssRUFBRSxPQUFPLENBQUMsQ0FBQztBQUNqRSxDQUFDO0FBRUQsTUFBTSxDQUFDLE1BQU0sVUFBVSxHQUFpQjtJQUN0QyxVQUFVLEVBQUUsSUFBSTtJQUNoQixXQUFXLEVBQUUsS0FBSztJQUNsQixVQUFVLEVBQUUsSUFBd0I7Q0FDckMsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbIi8qKlxuICogQGxpY2Vuc2VcbiAqIENvcHlyaWdodCAyMDIwIEdvb2dsZSBMTEMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuXG4gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgXCJMaWNlbnNlXCIpO1xuICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLlxuICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0XG4gKlxuICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wXG4gKlxuICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZVxuICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gXCJBUyBJU1wiIEJBU0lTLFxuICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuXG4gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kXG4gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS5cbiAqID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4gKi9cblxuaW1wb3J0IHtJbWFnLCBJbWFnSW5wdXRzLCBLZXJuZWxDb25maWcsIEtlcm5lbEZ1bmMsIFRlbnNvckluZm99IGZyb20gJ0B0ZW5zb3JmbG93L3RmanMtY29yZSc7XG5cbmltcG9ydCB7TWF0aEJhY2tlbmRDUFV9IGZyb20gJy4uL2JhY2tlbmRfY3B1JztcblxuZXhwb3J0IGZ1bmN0aW9uIGltYWcoYXJnczoge2lucHV0czogSW1hZ0lucHV0cywgYmFja2VuZDogTWF0aEJhY2tlbmRDUFV9KTpcbiAgICBUZW5zb3JJbmZvIHtcbiAgY29uc3Qge2lucHV0cywgYmFja2VuZH0gPSBhcmdzO1xuICBjb25zdCB7aW5wdXR9ID0gaW5wdXRzO1xuXG4gIGNvbnN0IGltYWcgPSBiYWNrZW5kLmRhdGEuZ2V0KGlucHV0LmRhdGFJZCkuY29tcGxleFRlbnNvckluZm9zLmltYWc7XG4gIGNvbnN0IGltYWdWYWwgPSBiYWNrZW5kLmRhdGEuZ2V0KGltYWcuZGF0YUlkKS52YWx1ZXM7XG5cbiAgLy8gV2hlbiBjb21wbGV4IHRlbnNvciBpcyBkaXNwb3NlZCwgaXRzIHVuZGVybHlpbmcgcGFydHMgd2lsbCBiZSBkaXNwb3NlZCB0b28uXG4gIC8vIE1ha2UgbmV3IHRlbnNvciBvdXQgb2YgdGhlIGltYWcgdmFsdWUgb2YgdGhlIGNvbXBsZXguIFRoaXMgbWFrZXMgc3VyZSB0aGVcbiAgLy8gdmFsdWUgaXMgc3RpbGwgYWNjZXNzaWJsZSBldmVuIGlmIGNvbXBsZXggdGVuc29yIGlzIGRpc3Bvc2VkLlxuICByZXR1cm4gYmFja2VuZC5tYWtlVGVuc29ySW5mbyhpbWFnLnNoYXBlLCBpbWFnLmR0eXBlLCBpbWFnVmFsKTtcbn1cblxuZXhwb3J0IGNvbnN0IGltYWdDb25maWc6IEtlcm5lbENvbmZpZyA9IHtcbiAga2VybmVsTmFtZTogSW1hZyxcbiAgYmFja2VuZE5hbWU6ICdjcHUnLFxuICBrZXJuZWxGdW5jOiBpbWFnIGFzIHt9IGFzIEtlcm5lbEZ1bmNcbn07XG4iXX0=","/**\n * @license\n * Copyright 2020 Google LLC. All Rights Reserved.\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n * =============================================================================\n */\nimport { backend_util, Concat, util } from '@tensorflow/tfjs-core';\nimport { complex } from './Complex';\nimport { concatImpl } from './Concat_impl';\nimport { identity } from './Identity';\nimport { imag } from './Imag';\nimport { real } from './Real';\nimport { reshape } from './Reshape';\nexport function concat(args) {\n const { inputs, backend, attrs } = args;\n const { axis } = attrs;\n const $axis = util.parseAxisParam(axis, inputs[0].shape)[0];\n const shapes = inputs.map(t => t.shape);\n backend_util.assertParamsConsistent(shapes, $axis);\n let outShape = backend_util.computeOutShape(inputs.map(t => t.shape), $axis);\n if (util.sizeFromShape(outShape) === 0) {\n return backend.makeTensorInfo(outShape, inputs[0].dtype, []);\n }\n // Keep only non-empty tensors (ignore tensors with 0 in their shape).\n const $inputs = inputs.filter(t => util.sizeFromShape(t.shape) > 0);\n if ($inputs.length === 1) {\n return identity({ inputs: { x: $inputs[0] }, backend });\n }\n if ($inputs[0].dtype === 'complex64') {\n const reals = $inputs.map((t) => real({ inputs: { input: t }, backend }));\n const imags = $inputs.map((t) => imag({ inputs: { input: t }, backend }));\n const realConcated = concat({ inputs: reals, backend, attrs: { axis: $axis } });\n const imagConcated = concat({ inputs: imags, backend, attrs: { axis: $axis } });\n const result = complex({ inputs: { real: realConcated, imag: imagConcated }, backend });\n reals.forEach(r => backend.disposeIntermediateTensorInfo(r));\n imags.forEach(i => backend.disposeIntermediateTensorInfo(i));\n backend.disposeIntermediateTensorInfo(realConcated);\n backend.disposeIntermediateTensorInfo(imagConcated);\n return result;\n }\n // Any concat of n-dimensional tensors across any axis can be reduced to\n // a concatenation of two-dimensional tensors across the axis 1 by first\n // partitioning the axes of the original tensors into those less than the\n // axis to be concatenated and the rest. Then reshape the tensors\n // into a two-dimensional tensor by collapsing these two sets of axes and\n // concatenate the resulting matrices across the axis 1, finally reshaping\n // the result to have the proper shape.\n const inputs2D = $inputs.map(t => {\n const innerSize = util.sizeFromShape(t.shape.slice($axis));\n const shape = [-1, innerSize];\n return reshape({ inputs: { x: t }, backend, attrs: { shape } });\n });\n const inputsValShapes = inputs2D.map(t => {\n return { vals: backend.data.get(t.dataId).values, shape: t.shape };\n });\n // Concats 2d tensors along axis=1.\n outShape =\n backend_util.computeOutShape(inputs2D.map(t => t.shape), 1 /* axis */);\n const simplyConcat = inputs2D[0].shape[0] === 1;\n const outVals = concatImpl(inputsValShapes, outShape, inputs[0].dtype, simplyConcat);\n const finalOutShape = backend_util.computeOutShape($inputs.map(t => t.shape), $axis);\n const outInfo = backend.makeTensorInfo(finalOutShape, inputs[0].dtype, outVals);\n inputs2D.forEach(t => backend.disposeIntermediateTensorInfo(t));\n return outInfo;\n}\nexport const concatConfig = {\n kernelName: Concat,\n backendName: 'cpu',\n kernelFunc: concat\n};\n//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiQ29uY2F0LmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vLi4vdGZqcy1iYWNrZW5kLWNwdS9zcmMva2VybmVscy9Db25jYXQudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUE7Ozs7Ozs7Ozs7Ozs7OztHQWVHO0FBRUgsT0FBTyxFQUFDLFlBQVksRUFBRSxNQUFNLEVBQW1FLElBQUksRUFBQyxNQUFNLHVCQUF1QixDQUFDO0FBSWxJLE9BQU8sRUFBQyxPQUFPLEVBQUMsTUFBTSxXQUFXLENBQUM7QUFDbEMsT0FBTyxFQUFDLFVBQVUsRUFBQyxNQUFNLGVBQWUsQ0FBQztBQUN6QyxPQUFPLEVBQUMsUUFBUSxFQUFDLE1BQU0sWUFBWSxDQUFDO0FBQ3BDLE9BQU8sRUFBQyxJQUFJLEVBQUMsTUFBTSxRQUFRLENBQUM7QUFDNUIsT0FBTyxFQUFDLElBQUksRUFBQyxNQUFNLFFBQVEsQ0FBQztBQUM1QixPQUFPLEVBQUMsT0FBTyxFQUFDLE1BQU0sV0FBVyxDQUFDO0FBRWxDLE1BQU0sVUFBVSxNQUFNLENBQ2xCLElBQXlFO0lBRTNFLE1BQU0sRUFBQyxNQUFNLEVBQUUsT0FBTyxFQUFFLEtBQUssRUFBQyxHQUFHLElBQUksQ0FBQztJQUN0QyxNQUFNLEVBQUMsSUFBSSxFQUFDLEdBQUcsS0FBSyxDQUFDO0lBRXJCLE1BQU0sS0FBSyxHQUFHLElBQUksQ0FBQyxjQUFjLENBQUMsSUFBSSxFQUFFLE1BQU0sQ0FBQyxDQUFDLENBQUMsQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQztJQUU1RCxNQUFNLE1BQU0sR0FBRyxNQUFNLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLEtBQUssQ0FBQyxDQUFDO0lBQ3hDLFlBQVksQ0FBQyxzQkFBc0IsQ0FBQyxNQUFNLEVBQUUsS0FBSyxDQUFDLENBQUM7SUFFbkQsSUFBSSxRQUFRLEdBQUcsWUFBWSxDQUFDLGVBQWUsQ0FBQyxNQUFNLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLEtBQUssQ0FBQyxFQUFFLEtBQUssQ0FBQyxDQUFDO0lBRTdFLElBQUksSUFBSSxDQUFDLGFBQWEsQ0FBQyxRQUFRLENBQUMsS0FBSyxDQUFDLEVBQUU7UUFDdEMsT0FBTyxPQUFPLENBQUMsY0FBYyxDQUFDLFFBQVEsRUFBRSxNQUFNLENBQUMsQ0FBQyxDQUFDLENBQUMsS0FBSyxFQUFFLEVBQUUsQ0FBQyxDQUFDO0tBQzlEO0lBRUQsc0VBQXNFO0lBQ3RFLE1BQU0sT0FBTyxHQUFHLE1BQU0sQ0FBQyxNQUFNLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxJQUFJLENBQUMsYUFBYSxDQUFDLENBQUMsQ0FBQyxLQUFLLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQztJQUNwRSxJQUFJLE9BQU8sQ0FBQyxNQUFNLEtBQUssQ0FBQyxFQUFFO1FBQ3hCLE9BQU8sUUFBUSxDQUFDLEVBQUMsTUFBTSxFQUFFLEVBQUMsQ0FBQyxFQUFFLE9BQU8sQ0FBQyxDQUFDLENBQUMsRUFBQyxFQUFFLE9BQU8sRUFBQyxDQUFDLENBQUM7S0FDckQ7SUFFRCxJQUFJLE9BQU8sQ0FBQyxDQUFDLENBQUMsQ0FBQyxLQUFLLEtBQUssV0FBVyxFQUFFO1FBQ3BDLE1BQU0sS0FBSyxHQUFHLE9BQU8sQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLEVBQUUsRUFBRSxDQUFDLElBQUksQ0FBQyxFQUFDLE1BQU0sRUFBRSxFQUFDLEtBQUssRUFBRSxDQUFDLEVBQUMsRUFBRSxPQUFPLEVBQUMsQ0FBQyxDQUFDLENBQUM7UUFDdEUsTUFBTSxLQUFLLEdBQUcsT0FBTyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsRUFBRSxFQUFFLENBQUMsSUFBSSxDQUFDLEVBQUMsTUFBTSxFQUFFLEVBQUMsS0FBSyxFQUFFLENBQUMsRUFBQyxFQUFFLE9BQU8sRUFBQyxDQUFDLENBQUMsQ0FBQztRQUV0RSxNQUFNLFlBQVksR0FBRyxNQUFNLENBQUMsRUFBQyxNQUFNLEVB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QUMsRUFBRSxDQUFDLE9BQU8sQ0FBQyw2QkFBNkIsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDO0lBRWhFLE9BQU8sT0FBTyxDQUFDO0FBQ2pCLENBQUM7QUFFRCxNQUFNLENBQUMsTUFBTSxZQUFZLEdBQWlCO0lBQ3hDLFVBQVUsRUFBRSxNQUFNO0lBQ2xCLFdBQVcsRUFBRSxLQUFLO0lBQ2xCLFVBQVUsRUFBRSxNQUEwQjtDQUN2QyxDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiLyoqXG4gKiBAbGljZW5zZVxuICogQ29weXJpZ2h0IDIwMjAgR29vZ2xlIExMQy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC5cbiAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSBcIkxpY2Vuc2VcIik7XG4gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuXG4gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXRcbiAqXG4gKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjBcbiAqXG4gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlXG4gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiBcIkFTIElTXCIgQkFTSVMsXG4gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC5cbiAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmRcbiAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLlxuICogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbiAqL1xuXG5pbXBvcnQge2JhY2tlbmRfdXRpbCwgQ29uY2F0LCBDb25jYXRBdHRycywgQ29uY2F0SW5wdXRzLCBLZXJuZWxDb25maWcsIEtlcm5lbEZ1bmMsIFRlbnNvckluZm8sIHV0aWx9IGZyb20gJ0B0ZW5zb3JmbG93L3RmanMtY29yZSc7XG5cbmltcG9ydCB7TWF0aEJhY2tlbmRDUFV9IGZyb20gJy4uL2JhY2tlbmRfY3B1JztcblxuaW1wb3J0IHtjb21wbGV4fSBmcm9tICcuL0NvbXBsZXgnO1xuaW1wb3J0IHtjb25jYXRJbXBsfSBmcm9tICcuL0NvbmNhdF9pbXBsJztcbmltcG9ydCB7aWRlbnRpdHl9IGZyb20gJy4vSWRlbnRpdHknO1xuaW1wb3J0IHtpbWFnfSBmcm9tICcuL0ltYWcnO1xuaW1wb3J0IHtyZWFsfSBmcm9tICcuL1JlYWwnO1xuaW1wb3J0IHtyZXNoYXBlfSBmcm9tICcuL1Jlc2hhcGUnO1xuXG5leHBvcnQgZnVuY3Rpb24gY29uY2F0KFxuICAgIGFyZ3M6IHtpbnB1dHM6IENvbmNhdElucHV0cywgYmFja2VuZDogTWF0aEJhY2tlbmRDUFUsIGF0dHJzOiBDb25jYXRBdHRyc30pOlxuICAgIFRlbnNvckluZm8ge1xuICBjb25zdCB7aW5wdXRzLCBiYWNrZW5kLCBhdHRyc30gPSBhcmdzO1xuICBjb25zdCB7YXhpc30gPSBhdHRycztcblxuICBjb25zdCAkYXhpcyA9IHV0aWwucGFyc2VBeGlzUGFyYW0oYXhpcywgaW5wdXRzWzBdLnNoYXBlKVswXTtcblxuICBjb25zdCBzaGFwZXMgPSBpbnB1dHMubWFwKHQgPT4gdC5zaGFwZSk7XG4gIGJhY2tlbmRfdXRpbC5hc3NlcnRQYXJhbXNDb25zaXN0ZW50KHNoYXBlcywgJGF4aXMpO1xuXG4gIGxldCBvdXRTaGFwZSA9IGJhY2tlbmRfdXRpbC5jb21wdXRlT3V0U2hhcGUoaW5wdXRzLm1hcCh0ID0+IHQuc2hhcGUpLCAkYXhpcyk7XG5cbiAgaWYgKHV0aWwuc2l6ZUZyb21TaGFwZShvdXRTaGFwZSkgPT09IDApIHtcbiAgICByZXR1cm4gYmFja2VuZC5tYWtlVGVuc29ySW5mbyhvdXRTaGFwZSwgaW5wdXRzWzBdLmR0eXBlLCBbXSk7XG4gIH1cblxuICAvLyBLZWVwIG9ubHkgbm9uLWVtcHR5IHRlbnNvcnMgKGlnbm9yZSB0ZW5zb3JzIHdpdGggMCBpbiB0aGVpciBzaGFwZSkuXG4gIGNvbnN0ICRpbnB1dHMgPSBpbnB1dHMuZmlsdGVyKHQgPT4gdXRpbC5zaXplRnJvbVNoYXBlKHQuc2hhcGUpID4gMCk7XG4gIGlmICgkaW5wdXRzLmxlbmd0aCA9PT0gMSkge1xuICAgIHJldHVybiBpZGVudGl0eSh7aW5wdXRzOiB7eDogJGlucHV0c1swXX0sIGJhY2tlbmR9KTtcbiAgfVxuXG4gIGlmICgkaW5wdXRzWzBdLmR0eXBlID09PSAnY29tcGxleDY0Jykge1xuICAgIGNvbnN0IHJlYWxzID0gJGlucHV0cy5tYXAoKHQpID0+IHJlYWwoe2lucHV0czoge2lucHV0OiB0fSwgYmFja2VuZH0pKTtcbiAgICBjb25zdCBpbWFncyA9ICRpbnB1dHMubWFwKCh0KSA9PiBpbWFnKHtpbnB1dHM6IHtpbnB1dDogdH0sIGJhY2tlbmR9KSk7XG5cbiAgICBjb25zdCByZWFsQ29uY2F0ZWQgPSBjb25jYXQoe2lucHV0czogcmVhbHMsIGJhY2tlbmQsIGF0dHJzOiB7YXhpczogJGF4aXN9fSk7XG4gICAgY29uc3QgaW1hZ0NvbmNhdGVkID0gY29uY2F0KHtpbnB1dHM6IGltYWdzLCBiYWNrZW5kLCBhdHRyczoge2F4aXM6ICRheGlzfX0pO1xuXG4gICAgY29uc3QgcmVzdWx0ID1cbiAgICAgICAgY29tcGxleCh7aW5wdXRzOiB7cmVhbDogcmVhbENvbmNhdGVkLCBpbWFnOiBpbWFnQ29uY2F0ZWR9LCBiYWNrZW5kfSk7XG5cbiAgICByZWFscy5mb3JFYWNoKHIgPT4gYmFja2VuZC5kaXNwb3NlSW50ZXJtZWRpYXRlVGVuc29ySW5mbyhyKSk7XG4gICAgaW1hZ3MuZm9yRWFjaChpID0+IGJhY2tlbmQuZGlzcG9zZUludGVybWVkaWF0ZVRlbnNvckluZm8oaSkpO1xuICAgIGJhY2tlbmQuZGlzcG9zZUludGVybWVkaWF0ZVRlbnNvckluZm8ocmVhbENvbmNhdGVkKTtcbiAgICBiYWNrZW5kLmRpc3Bvc2VJbnRlcm1lZGlhdGVUZW5zb3JJbmZvKGltYWdDb25jYXRlZCk7XG5cbiAgICByZXR1cm4gcmVzdWx0O1xuICB9XG5cbiAgLy8gQW55IGNvbmNhdCBvZiBuLWRpbWVuc2lvbmFsIHRlbnNvcnMgYWNyb3NzIGFueSBheGlzIGNhbiBiZSByZWR1Y2VkIHRvXG4gIC8vIGEgY29uY2F0ZW5hdGlvbiBvZiB0d28tZGltZW5zaW9uYWwgdGVuc29ycyBhY3Jvc3MgdGhlIGF4aXMgMSBieSBmaXJzdFxuICAvLyBwYXJ0aXRpb25pbmcgdGhlIGF4ZXMgb2YgdGhlIG9yaWdpbmFsIHRlbnNvcnMgaW50byB0aG9zZSBsZXNzIHRoYW4gdGhlXG4gIC8vIGF4aXMgdG8gYmUgY29uY2F0ZW5hdGVkIGFuZCB0aGUgcmVzdC4gVGhlbiByZXNoYXBlIHRoZSB0ZW5zb3JzXG4gIC8vIGludG8gYSB0d28tZGltZW5zaW9uYWwgdGVuc29yIGJ5IGNvbGxhcHNpbmcgdGhlc2UgdHdvIHNldHMgb2YgYXhlcyBhbmRcbiAgLy8gY29uY2F0ZW5hdGUgdGhlIHJlc3VsdGluZyBtYXRyaWNlcyBhY3Jvc3MgdGhlIGF4aXMgMSwgZmluYWxseSByZXNoYXBpbmdcbiAgLy8gdGhlIHJlc3VsdCB0byBoYXZlIHRoZSBwcm9wZXIgc2hhcGUuXG4gIGNvbnN0IGlucHV0czJEID0gJGlucHV0cy5tYXAodCA9PiB7XG4gICAgY29uc3QgaW5uZXJTaXplID0gdXRpbC5zaXplRnJvbVNoYXBlKHQuc2hhcGUuc2xpY2UoJGF4aXMpKTtcbiAgICBjb25zdCBzaGFwZSA9IFstMSwgaW5uZXJTaXplXTtcbiAgICByZXR1cm4gcmVzaGFwZSh7aW5wdXRzOiB7eDogdH0sIGJhY2tlbmQsIGF0dHJzOiB7c2hhcGV9fSk7XG4gIH0pO1xuXG4gIGNvbnN0IGlucHV0c1ZhbFNoYXBlcyA9IGlucHV0czJELm1hcCh0ID0+IHtcbiAgICByZXR1cm4ge3ZhbHM6IGJhY2tlbmQuZGF0YS5nZXQodC5kYXRhSWQpLnZhbHVlcywgc2hhcGU6IHQuc2hhcGV9O1xuICB9KTtcblxuICAvLyBDb25jYXRzIDJkIHRlbnNvcnMgYWxvbmcgYXhpcz0xLlxuICBvdXRTaGFwZSA9XG4gICAgICBiYWNrZW5kX3V0aWwuY29tcHV0ZU91dFNoYXBlKGlucHV0czJELm1hcCh0ID0+IHQuc2hhcGUpLCAxIC8qIGF4aXMgKi8pO1xuICBjb25zdCBzaW1wbHlDb25jYXQgPSBpbnB1dHMyRFswXS5zaGFwZVswXSA9PT0gMTtcbiAgY29uc3Qgb3V0VmFscyA9XG4gICAgICBjb25jYXRJbXBsKGlucHV0c1ZhbFNoYXBlcywgb3V0U2hhcGUsIGlucHV0c1swXS5kdHlwZSwgc2ltcGx5Q29uY2F0KTtcblxuICBjb25zdCBmaW5hbE91dFNoYXBlID1cbiAgICAgIGJhY2tlbmRfdXRpbC5jb21wdXRlT3V0U2hhcGUoJGlucHV0cy5tYXAodCA9PiB0LnNoYXBlKSwgJGF4aXMpO1xuXG4gIGNvbnN0IG91dEluZm8gPVxuICAgICAgYmFja2VuZC5tYWtlVGVuc29ySW5mbyhmaW5hbE91dFNoYXBlLCBpbnB1dHNbMF0uZHR5cGUsIG91dFZhbHMpO1xuXG4gIGlucHV0czJELmZvckVhY2godCA9PiBiYWNrZW5kLmRpc3Bvc2VJbnRlcm1lZGlhdGVUZW5zb3JJbmZvKHQpKTtcblxuICByZXR1cm4gb3V0SW5mbztcbn1cblxuZXhwb3J0IGNvbnN0IGNvbmNhdENvbmZpZzogS2VybmVsQ29uZmlnID0ge1xuICBrZXJuZWxOYW1lOiBDb25jYXQsXG4gIGJhY2tlbmROYW1lOiAnY3B1JyxcbiAga2VybmVsRnVuYzogY29uY2F0IGFzIHt9IGFzIEtlcm5lbEZ1bmNcbn07XG4iXX0=","/**\n * @license\n * Copyright 2020 Google LLC. All Rights Reserved.\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n * =============================================================================\n */\nimport { backend_util, Conv2D, TensorBuffer, util } from '@tensorflow/tfjs-core';\nimport { assertNotComplex } from '../cpu_util';\nexport function conv2D(args) {\n const { inputs, backend, attrs } = args;\n const { x, filter } = inputs;\n const { strides, pad, dataFormat, dilations, dimRoundingMode } = attrs;\n assertNotComplex([x, filter], 'conv2d');\n const $dataFormat = backend_util.convertConv2DDataFormat(dataFormat);\n const convInfo = backend_util.computeConv2DInfo(x.shape, filter.shape, strides, dilations, pad, dimRoundingMode, false /* depthwise */, $dataFormat);\n const filterHeight = convInfo.filterHeight;\n const filterWidth = convInfo.filterWidth;\n const dilationHeight = convInfo.dilationHeight;\n const dilationWidth = convInfo.dilationWidth;\n const padLeft = convInfo.padInfo.left;\n const padTop = convInfo.padInfo.top;\n const isChannelsLast = convInfo.dataFormat === 'channelsLast';\n const y = new TensorBuffer(convInfo.outShape, x.dtype);\n const xStrides = util.computeStrides(x.shape);\n const filterStrides = util.computeStrides(filter.shape);\n const xBatchStride = xStrides[0];\n const xRowStride = isChannelsLast ? xStrides[1] : xStrides[2];\n const xColStride = isChannelsLast ? xStrides[2] : 1;\n const xChannelStride = isChannelsLast ? 1 : xStrides[1];\n const yBatchStride = y.strides[0];\n const yRowStride = isChannelsLast ? y.strides[1] : y.strides[2];\n const yColStride = isChannelsLast ? y.strides[2] : 1;\n const yChannelStride = isChannelsLast ? 1 : y.strides[1];\n const xVals = backend.data.get(x.dataId).values;\n const wVals = backend.data.get(filter.dataId).values;\n const yVals = y.values;\n for (let b = 0; b < convInfo.batchSize; ++b) {\n const xOffset1 = b * xBatchStride;\n const yOffset1 = b * yBatchStride;\n for (let yR = 0; yR < convInfo.outHeight; ++yR) {\n const yOffset2 = yOffset1 + yR * yRowStride;\n const xRCorner = yR * convInfo.strideHeight - padTop;\n for (let wR = 0; wR < filterHeight; ++wR) {\n const xR = xRCorner + wR * dilationHeight;\n if (xR < 0 || xR >= convInfo.inHeight) {\n continue;\n }\n const wOffset1 = wR * filterStrides[0];\n const xOffset2 = xOffset1 + xR * xRowStride;\n for (let yC = 0; yC < convInfo.outWidth; ++yC) {\n const yOffset3 = yOffset2 + yC * yColStride;\n const xCCorner = yC * convInfo.strideWidth - padLeft;\n for (let wC = 0; wC < filterWidth; ++wC) {\n const xC = xCCorner + wC * dilationWidth;\n if (xC < 0 || xC >= convInfo.inWidth) {\n continue;\n }\n const wOffset2 = wOffset1 + wC * filterStrides[1];\n const xOffset3 = xOffset2 + xC * xColStride;\n let wOffset3 = wOffset2;\n for (let d1 = 0; d1 < convInfo.inChannels; ++d1) {\n const xVal = xVals[xOffset3 + d1 * xChannelStride];\n for (let d2 = 0; d2 < convInfo.outChannels; ++d2) {\n yVals[yOffset3 + d2 * yChannelStride] +=\n xVal * wVals[wOffset3 + d2];\n }\n wOffset3 += convInfo.outChannels;\n }\n }\n }\n }\n }\n }\n return backend.makeTensorInfo(y.shape, y.dtype, yVals);\n}\nexport const conv2DConfig = {\n kernelName: Conv2D,\n backendName: 'cpu',\n kernelFunc: conv2D\n};\n//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiQ29udjJELmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vLi4vdGZqcy1iYWNrZW5kLWNwdS9zcmMva2VybmVscy9Db252MkQudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUE7Ozs7Ozs7Ozs7Ozs7OztHQWVHO0FBRUgsT0FBTyxFQUFDLFlBQVksRUFBRSxNQUFNLEVBQXVELFlBQVksRUFBMEIsSUFBSSxFQUFDLE1BQU0sdUJBQXVCLENBQUM7QUFHNUosT0FBTyxFQUFDLGdCQUFnQixFQUFDLE1BQU0sYUFBYSxDQUFDO0FBRTdDLE1BQU0sVUFBVSxNQUFNLENBQ2xCLElBQXlFO0lBRTNFLE1BQU0sRUFBQyxNQUFNLEVBQUUsT0FBTyxFQUFFLEtBQUssRUFBQyxHQUFHLElBQUksQ0FBQztJQUN0QyxNQUFNLEVBQUMsQ0FBQyxFQUFFLE1BQU0sRUFBQyxHQUFHLE1BQU0sQ0FBQztJQUMzQixNQUFNLEVBQUMsT0FBTyxFQUFFLEdBQUcsRUFBRSxVQUFVLEVBQUUsU0FBUyxFQUFFLGVBQWUsRUFBQyxHQUFHLEtBQUssQ0FBQztJQUVyRSxnQkFBZ0IsQ0FBQyxDQUFDLENBQUMsRUFBRSxNQUFNLENBQUMsRUFBRSxRQUFRLENBQUMsQ0FBQztJQUV4QyxNQUFNLFdBQVcsR0FBRyxZQUFZLENBQUMsdUJBQXVCLENBQUMsVUFBVSxDQUFDLENBQUM7SUFDckUsTUFBTSxRQUFRLEdBQUcsWUFBWSxDQUFDLGlCQUFpQixDQUMzQyxDQUFDLENBQUMsS0FBeUMsRUFDM0MsTUFBTSxDQUFDLEtBQXlDLEVBQUUsT0FBTyxFQUFFLFNBQVMsRUFBRSxHQUFHLEVBQ3pFLGVBQWUsRUFBRSxLQUFLLENBQUMsZUFBZSxFQUFFLFdBQVcsQ0FBQyxDQUFDO0lBRXpELE1BQU0sWUFBWSxHQUFHLFFBQVEsQ0FBQyxZQUFZLENBQUM7SUFDM0MsTUFBTSxXQUFXLEdBQUcsUUFBUSxDQUFDLFdBQVcsQ0FBQztJQUN6QyxNQUFNLGNBQWMsR0FBRyxRQUFR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S0FBSyxJQUFJLEVBQUUsR0FBRyxDQUFDLEVBQUUsRUFBRSxHQUFHLFFBQVEsQ0FBQyxXQUFXLEVBQUUsRUFBRSxFQUFFLEVBQUU7Z0NBQ2hELEtBQUssQ0FBQyxRQUFRLEdBQUcsRUFBRSxHQUFHLGNBQWMsQ0FBQztvQ0FDakMsSUFBSSxHQUFHLEtBQUssQ0FBQyxRQUFRLEdBQUcsRUFBRSxDQUFDLENBQUM7NkJBQ2pDOzRCQUNELFFBQVEsSUFBSSxRQUFRLENBQUMsV0FBVyxDQUFDO3lCQUNsQztxQkFDRjtpQkFDRjthQUNGO1NBQ0Y7S0FDRjtJQUVELE9BQU8sT0FBTyxDQUFDLGNBQWMsQ0FBQyxDQUFDLENBQUMsS0FBSyxFQUFFLENBQUMsQ0FBQyxLQUFLLEVBQUUsS0FBSyxDQUFDLENBQUM7QUFDekQsQ0FBQztBQUVELE1BQU0sQ0FBQyxNQUFNLFlBQVksR0FBaUI7SUFDeEMsVUFBVSxFQUFFLE1BQU07SUFDbEIsV0FBVyxFQUFFLEtBQUs7SUFDbEIsVUFBVSxFQUFFLE1BQTBCO0NBQ3ZDLENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyIvKipcbiAqIEBsaWNlbnNlXG4gKiBDb3B5cmlnaHQgMjAyMCBHb29nbGUgTExDLiBBbGwgUmlnaHRzIFJlc2VydmVkLlxuICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlIFwiTGljZW5zZVwiKTtcbiAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS5cbiAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdFxuICpcbiAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMFxuICpcbiAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmVcbiAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuIFwiQVMgSVNcIiBCQVNJUyxcbiAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLlxuICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZFxuICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuXG4gKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuICovXG5cbmltcG9ydCB7YmFja2VuZF91dGlsLCBDb252MkQsIENvbnYyREF0dHJzLCBDb252MkRJbnB1dHMsIEtlcm5lbENvbmZpZywgS2VybmVsRnVuYywgVGVuc29yQnVmZmVyLCBUZW5zb3JJbmZvLCBUeXBlZEFycmF5LCB1dGlsfSBmcm9tICdAdGVuc29yZmxvdy90ZmpzLWNvcmUnO1xuXG5pbXBvcnQge01hdGhCYWNrZW5kQ1BVfSBmcm9tICcuLi9iYWNrZW5kX2NwdSc7XG5pbXBvcnQge2Fzc2VydE5vdENvbXBsZXh9IGZyb20gJy4uL2NwdV91dGlsJztcblxuZXhwb3J0IGZ1bmN0aW9uIGNvbnYyRChcbiAgICBhcmdzOiB7aW5wdXRzOiBDb252MkRJbnB1dHMsIGJhY2tlbmQ6IE1hdGhCYWNrZW5kQ1BVLCBhdHRyczogQ29udjJEQXR0cnN9KTpcbiAgICBUZW5zb3JJbmZvIHtcbiAgY29uc3Qge2lucHV0cywgYmFja2VuZCwgYXR0cnN9ID0gYXJncztcbiAgY29uc3Qge3gsIGZpbHRlcn0gPSBpbnB1dHM7XG4gIGNvbnN0IHtzdHJpZGVzLCBwYWQsIGRhdGFGb3JtYXQsIGRpbGF0aW9ucywgZGltUm91bmRpbmdNb2RlfSA9IGF0dHJzO1xuXG4gIGFzc2VydE5vdENvbXBsZXgoW3gsIGZpbHRlcl0sICdjb252MmQnKTtcblxuICBjb25zdCAkZGF0YUZvcm1hdCA9IGJhY2tlbmRfdXRpbC5jb252ZXJ0Q29udjJERGF0YUZvcm1hdChkYXRhRm9ybWF0KTtcbiAgY29uc3QgY29udkluZm8gPSBiYWNrZW5kX3V0aWwuY29tcHV0ZUNvbnYyREluZm8oXG4gICAgICB4LnNoYXBlIGFzIFtudW1iZXIsIG51bWJlciwgbnVtYmVyLCBudW1iZXJdLFxuICAgICAgZmlsdGVyLnNoYXBlIGFzIFtudW1iZXIsIG51bWJlciwgbnVtYmVyLCBudW1iZXJdLCBzdHJpZGVzLCBkaWxhdGlvbnMsIHBhZCxcbiAgICAgIGRpbVJvdW5kaW5nTW9kZSwgZmFsc2UgLyogZGVwdGh3aXNlICovLCAkZGF0YUZvcm1hdCk7XG5cbiAgY29uc3QgZmlsdGVySGVpZ2h0ID0gY29udkluZm8uZmlsdGVySGVpZ2h0O1xuICBjb25zdCBmaWx0ZXJXaWR0aCA9IGNvbnZJbmZvLmZpbHRlcldpZHRoO1xuICBjb25zdCBkaWxhdGlvbkhlaWdodCA9IGNvbnZJbmZvLmRpbGF0aW9uSGVpZ2h0O1xuICBjb25zdCBkaWxhdGlvbldpZHRoID0gY29udkluZm8uZGlsYXRpb25XaWR0aDtcbiAgY29uc3QgcGFkTGVmdCA9IGNvbnZJbmZvLnBhZEluZm8ubGVmdDtcbiAgY29uc3QgcGFkVG9wID0gY29udkluZm8ucGFkSW5mby50b3A7XG4gIGNvbnN0IGlzQ2hhbm5lbHNMYXN0ID0gY29udkluZm8uZGF0YUZvcm1hdCA9PT0gJ2NoYW5uZWxzTGFzdCc7XG5cbiAgY29uc3QgeSA9IG5ldyBUZW5zb3JCdWZmZXIoY29udkluZm8ub3V0U2hhcGUsIHguZHR5cGUgYXMgJ2Zsb2F0MzInKTtcblxuICBjb25zdCB4U3RyaWRlcyA9IHV0aWwuY29tcHV0ZVN0cmlkZXMoeC5zaGFwZSk7XG4gIGNvbnN0IGZpbHRlclN0cmlkZXMgPSB1dGlsLmNvbXB1dGVTdHJpZGVzKGZpbHRlci5zaGFwZSk7XG5cbiAgY29uc3QgeEJhdGNoU3RyaWRlID0geFN0cmlkZXNbMF07XG4gIGNvbnN0IHhSb3dTdHJpZGUgPSBpc0NoYW5uZWxzTGFzdCA/IHhTdHJpZGVzWzFdIDogeFN0cmlkZXNbMl07XG4gIGNvbnN0IHhDb2xTdHJpZGUgPSBpc0NoYW5uZWxzTGFzdCA/IHhTdHJpZGVzWzJdIDogMTtcbiAgY29uc3QgeENoYW5uZWxTdHJpZGUgPSBpc0NoYW5uZWxzTGFzdCA/IDEgOiB4U3RyaWRlc1sxXTtcbiAgY29uc3QgeUJhdGNoU3RyaWRlID0geS5zdHJpZGVzWzBdO1xuICBjb25zdCB5Um93U3RyaWRlID0gaXNDaGFubmVsc0xhc3QgPyB5LnN0cmlkZXNbMV0gOiB5LnN0cmlkZXNbMl07XG4gIGNvbnN0IHlDb2xTdHJpZGUgPSBpc0NoYW5uZWxzTGFzdCA/IHkuc3RyaWRlc1syXSA6IDE7XG4gIGNvbnN0IHlDaGFubmVsU3RyaWRlID0gaXNDaGFubmVsc0xhc3QgPyAxIDogeS5zdHJpZGVzWzFdO1xuXG4gIGNvbnN0IHhWYWxzID0gYmFja2VuZC5kYXRhLmdldCh4LmRhdGFJZCkudmFsdWVzIGFzIFR5cGVkQXJyYXk7XG4gIGNvbnN0IHdWYWxzID0gYmFja2VuZC5kYXRhLmdldChmaWx0ZXIuZGF0YUlkKS52YWx1ZXMgYXMgVHlwZWRBcnJheTtcbiAgY29uc3QgeVZhbHMgPSB5LnZhbHVlcztcblxuICBmb3IgKGxldCBiID0gMDsgYiA8IGNvbnZJbmZvLmJhdGNoU2l6ZTsgKytiKSB7XG4gICAgY29uc3QgeE9mZnNldDEgPSBiICogeEJhdGNoU3RyaWRlO1xuICAgIGNvbnN0IHlPZmZzZXQxID0gYiAqIHlCYXRjaFN0cmlkZTtcbiAgICBmb3IgKGxldCB5UiA9IDA7IHlSIDwgY29udkluZm8ub3V0SGVpZ2h0OyArK3lSKSB7XG4gICAgICBjb25zdCB5T2Zmc2V0MiA9IHlPZmZzZXQxICsgeVIgKiB5Um93U3RyaWRlO1xuICAgICAgY29uc3QgeFJDb3JuZXIgPSB5UiAqIGNvbnZJbmZvLnN0cmlkZUhlaWdodCAtIHBhZFRvcDtcbiAgICAgIGZvciAobGV0IHdSID0gMDsgd1IgPCBmaWx0ZXJIZWlnaHQ7ICsrd1IpIHtcbiAgICAgICAgY29uc3QgeFIgPSB4UkNvcm5lciArIHdSICogZGlsYXRpb25IZWlnaHQ7XG4gICAgICAgIGlmICh4UiA8IDAgfHwgeFIgPj0gY29udkluZm8uaW5IZWlnaHQpIHtcbiAgICAgICAgICBjb250aW51ZTtcbiAgICAgICAgfVxuICAgICAgICBjb25zdCB3T2Zmc2V0MSA9IHdSICogZmlsdGVyU3RyaWRlc1swXTtcbiAgICAgICAgY29uc3QgeE9mZnNldDIgPSB4T2Zmc2V0MSArIHhSICogeFJvd1N0cmlkZTtcbiAgICAgICAgZm9yIChsZXQgeUMgPSAwOyB5QyA8IGNvbnZJbmZvLm91dFdpZHRoOyArK3lDKSB7XG4gICAgICAgICAgY29uc3QgeU9mZnNldDMgPSB5T2Zmc2V0MiArIHlDICogeUNvbFN0cmlkZTtcbiAgICAgICAgICBjb25zdCB4Q0Nvcm5lciA9IHlDICogY29udkluZm8uc3RyaWRlV2lkdGggLSBwYWRMZWZ0O1xuICAgICAgICAgIGZvciAobGV0IHdDID0gMDsgd0MgPCBmaWx0ZXJXaWR0aDsgKyt3Qykge1xuICAgICAgICAgICAgY29uc3QgeEMgPSB4Q0Nvcm5lciArIHdDICogZGlsYXRpb25XaWR0aDtcbiAgICAgICAgICAgIGlmICh4QyA8IDAgfHwgeEMgPj0gY29udkluZm8uaW5XaWR0aCkge1xuICAgICAgICAgICAgICBjb250aW51ZTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGNvbnN0IHdPZmZzZXQyID0gd09mZnNldDEgKyB3QyAqIGZpbHRlclN0cmlkZXNbMV07XG4gICAgICAgICAgICBjb25zdCB4T2Zmc2V0MyA9IHhPZmZzZXQyICsgeEMgKiB4Q29sU3RyaWRlO1xuICAgICAgICAgICAgbGV0IHdPZmZzZXQzID0gd09mZnNldDI7XG4gICAgICAgICAgICBmb3IgKGxldCBkMSA9IDA7IGQxIDwgY29udkluZm8uaW5DaGFubmVsczsgKytkMSkge1xuICAgICAgICAgICAgICBjb25zdCB4VmFsID0geFZhbHNbeE9mZnNldDMgKyBkMSAqIHhDaGFubmVsU3RyaWRlXTtcbiAgICAgICAgICAgICAgZm9yIChsZXQgZDIgPSAwOyBkMiA8IGNvbnZJbmZvLm91dENoYW5uZWxzOyArK2QyKSB7XG4gICAgICAgICAgICAgICAgeVZhbHNbeU9mZnNldDMgKyBkMiAqIHlDaGFubmVsU3RyaWRlXSArPVxuICAgICAgICAgICAgICAgICAgICB4VmFsICogd1ZhbHNbd09mZnNldDMgKyBkMl07XG4gICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgd09mZnNldDMgKz0gY29udkluZm8ub3V0Q2hhbm5lbHM7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICB9XG4gICAgfVxuICB9XG5cbiAgcmV0dXJuIGJhY2tlbmQubWFrZVRlbnNvckluZm8oeS5zaGFwZSwgeS5kdHlwZSwgeVZhbHMpO1xufVxuXG5leHBvcnQgY29uc3QgY29udjJEQ29uZmlnOiBLZXJuZWxDb25maWcgPSB7XG4gIGtlcm5lbE5hbWU6IENvbnYyRCxcbiAgYmFja2VuZE5hbWU6ICdjcHUnLFxuICBrZXJuZWxGdW5jOiBjb252MkQgYXMge30gYXMgS2VybmVsRnVuY1xufTtcbiJdfQ==","/**\n * @license\n * Copyright 2020 Google LLC. All Rights Reserved.\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n * =============================================================================\n */\nimport { backend_util, Conv2DBackpropFilter, TensorBuffer } from '@tensorflow/tfjs-core';\nimport { assertNotComplex } from '../cpu_util';\nexport function conv2DBackpropFilter(args) {\n const { inputs, backend, attrs } = args;\n const { x, dy } = inputs;\n const { strides, pad, dataFormat, dimRoundingMode, filterShape } = attrs;\n assertNotComplex([x, dy], 'conv2dBackpropFilter');\n const $dataFormat = backend_util.convertConv2DDataFormat(dataFormat);\n const convInfo = backend_util.computeConv2DInfo(x.shape, filterShape, strides, 1 /* dilations */, pad, dimRoundingMode, false /* depthwise */, $dataFormat);\n const { strideHeight, strideWidth, filterHeight, filterWidth } = convInfo;\n const isChannelsLast = convInfo.dataFormat === 'channelsLast';\n const dW = new TensorBuffer(convInfo.filterShape, 'float32');\n const leftPad = convInfo.padInfo.left;\n const topPad = convInfo.padInfo.top;\n const xVals = backend.data.get(x.dataId).values;\n const dyVals = backend.data.get(dy.dataId).values;\n const xBuf = new TensorBuffer(x.shape, x.dtype, xVals);\n const dyBuf = new TensorBuffer(dy.shape, dy.dtype, dyVals);\n for (let wR = 0; wR < filterHeight; ++wR) {\n const yRMin = Math.max(0, Math.ceil((topPad - wR) / strideHeight));\n const yRMax = Math.min(convInfo.outHeight, (convInfo.inHeight + topPad - wR) / strideHeight);\n for (let wC = 0; wC < filterWidth; ++wC) {\n const yCMin = Math.max(0, Math.ceil((leftPad - wC) / strideWidth));\n const yCMax = Math.min(convInfo.outWidth, (convInfo.inWidth + leftPad - wC) / strideWidth);\n for (let d1 = 0; d1 < convInfo.inChannels; ++d1) {\n for (let d2 = 0; d2 < convInfo.outChannels; ++d2) {\n let dotProd = 0;\n for (let b = 0; b < convInfo.batchSize; ++b) {\n for (let yR = yRMin; yR < yRMax; ++yR) {\n const xR = wR + yR * strideHeight - topPad;\n for (let yC = yCMin; yC < yCMax; ++yC) {\n const xC = wC + yC * strideWidth - leftPad;\n if (isChannelsLast) {\n dotProd += xBuf.get(b, xR, xC, d1) *\n dyBuf.get(b, yR, yC, d2);\n }\n else {\n dotProd += xBuf.get(b, d1, xR, xC) *\n dyBuf.get(b, d2, yR, yC);\n }\n }\n }\n }\n dW.set(dotProd, wR, wC, d1, d2);\n }\n }\n }\n }\n return backend.makeTensorInfo(dW.shape, dW.dtype, dW.values);\n}\nexport const conv2DBackpropFilterConfig = {\n kernelName: Conv2DBackpropFilter,\n backendName: 'cpu',\n kernelFunc: conv2DBackpropFilter\n};\n//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiQ29udjJEQmFja3Byb3BGaWx0ZXIuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi8uLi90ZmpzLWJhY2tlbmQtY3B1L3NyYy9rZXJuZWxzL0NvbnYyREJhY2twcm9wRmlsdGVyLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBOzs7Ozs7Ozs7Ozs7Ozs7R0FlRztBQUVILE9BQU8sRUFBQyxZQUFZLEVBQUUsb0JBQW9CLEVBQW1GLFlBQVksRUFBeUIsTUFBTSx1QkFBdUIsQ0FBQztBQUdoTSxPQUFPLEVBQUMsZ0JBQWdCLEVBQUMsTUFBTSxhQUFhLENBQUM7QUFFN0MsTUFBTSxVQUFVLG9CQUFvQixDQUFDLElBSXBDO0lBQ0MsTUFBTSxFQUFDLE1BQU0sRUFBRSxPQUFPLEVBQUUsS0FBSyxFQUFDLEdBQUcsSUFBSSxDQUFDO0lBQ3RDLE1BQU0sRUFBQyxDQUFDLEVBQUUsRUFBRSxFQUFDLEdBQUcsTUFBTSxDQUFDO0lBQ3ZCLE1BQU0sRUFBQyxPQUFPLEVBQUUsR0FBRyxFQUFFLFVBQVUsRUFBRSxlQUFlLEVBQUUsV0FBVyxFQUFDLEdBQUcsS0FBSyxDQUFDO0lBRXZFLGdCQUFnQixDQUFDLENBQUMsQ0FBQyxFQUFFLEVBQUUsQ0FBQyxFQUFFLHNCQUFzQixDQUFDLENBQUM7SUFFbEQsTUFBTSxXQUFXLEdBQUcsWUFBWSxDQUFDLHVCQUF1QixDQUFDLFVBQVUsQ0FBQyxDQUFDO0lBQ3JFLE1BQU0sUUFBUSxHQUFHLFlBQVksQ0FBQyxpQkFBaUIsQ0FDM0MsQ0FBQyxDQUFDLEtBQXlDLEVBQUUsV0FBVyxFQUFFLE9BQU8sRUFDakUsQ0FBQyxDQUFDLGVBQWUsRUFBRSxHQUFHLEVBQUUsZUFBZSxFQUFFLEtBQUssQ0FBQyxlQUFlLEVBQzlELFdBQVcsQ0FBQyxDQUFDO0lBRWpCLE1BQU0sRUFBQyxZQUFZLEVBQUUsV0FBVyxFQUFFLFlBQVksRUFBRSxXQUFXLEVBQUMsR0FBRyxRQUFRLENBQUM7SUFDeEUsTUFBTSxjQUFj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RyxDQUFDLENBQUMsRUFBRSxFQUFFLEVBQUUsRUFBRSxFQUFFLEVBQUUsQ0FBWTt3Q0FDekMsS0FBSyxDQUFDLEdBQUcsQ0FBQyxDQUFDLEVBQUUsRUFBRSxFQUFFLEVBQUUsRUFBRSxFQUFFLENBQVksQ0FBQztpQ0FDMUM7cUNBQU07b0NBQ0wsT0FBTyxJQUFLLElBQUksQ0FBQyxHQUFHLENBQUMsQ0FBQyxFQUFFLEVBQUUsRUFBRSxFQUFFLEVBQUUsRUFBRSxDQUFZO3dDQUN6QyxLQUFLLENBQUMsR0FBRyxDQUFDLENBQUMsRUFBRSxFQUFFLEVBQUUsRUFBRSxFQUFFLEVBQUUsQ0FBWSxDQUFDO2lDQUMxQzs2QkFDRjt5QkFDRjtxQkFDRjtvQkFDRCxFQUFFLENBQUMsR0FBRyxDQUFDLE9BQU8sRUFBRSxFQUFFLEVBQUUsRUFBRSxFQUFFLEVBQUUsRUFBRSxFQUFFLENBQUMsQ0FBQztpQkFDakM7YUFDRjtTQUNGO0tBQ0Y7SUFFRCxPQUFPLE9BQU8sQ0FBQyxjQUFjLENBQUMsRUFBRSxDQUFDLEtBQUssRUFBRSxFQUFFLENBQUMsS0FBSyxFQUFFLEVBQUUsQ0FBQyxNQUFNLENBQUMsQ0FBQztBQUMvRCxDQUFDO0FBRUQsTUFBTSxDQUFDLE1BQU0sMEJBQTBCLEdBQWlCO0lBQ3RELFVBQVUsRUFBRSxvQkFBb0I7SUFDaEMsV0FBVyxFQUFFLEtBQUs7SUFDbEIsVUFBVSxFQUFFLG9CQUF3QztDQUNyRCxDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiLyoqXG4gKiBAbGljZW5zZVxuICogQ29weXJpZ2h0IDIwMjAgR29vZ2xlIExMQy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC5cbiAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSBcIkxpY2Vuc2VcIik7XG4gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuXG4gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXRcbiAqXG4gKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjBcbiAqXG4gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlXG4gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiBcIkFTIElTXCIgQkFTSVMsXG4gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC5cbiAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmRcbiAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLlxuICogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbiAqL1xuXG5pbXBvcnQge2JhY2tlbmRfdXRpbCwgQ29udjJEQmFja3Byb3BGaWx0ZXIsIENvbnYyREJhY2twcm9wRmlsdGVyQXR0cnMsIENvbnYyREJhY2twcm9wRmlsdGVySW5wdXRzLCBLZXJuZWxDb25maWcsIEtlcm5lbEZ1bmMsIFRlbnNvckJ1ZmZlciwgVGVuc29ySW5mbywgVHlwZWRBcnJheX0gZnJvbSAnQHRlbnNvcmZsb3cvdGZqcy1jb3JlJztcblxuaW1wb3J0IHtNYXRoQmFja2VuZENQVX0gZnJvbSAnLi4vYmFja2VuZF9jcHUnO1xuaW1wb3J0IHthc3NlcnROb3RDb21wbGV4fSBmcm9tICcuLi9jcHVfdXRpbCc7XG5cbmV4cG9ydCBmdW5jdGlvbiBjb252MkRCYWNrcHJvcEZpbHRlcihhcmdzOiB7XG4gIGlucHV0czogQ29udjJEQmFja3Byb3BGaWx0ZXJJbnB1dHMsXG4gIGJhY2tlbmQ6IE1hdGhCYWNrZW5kQ1BVLFxuICBhdHRyczogQ29udjJEQmFja3Byb3BGaWx0ZXJBdHRyc1xufSk6IFRlbnNvckluZm8ge1xuICBjb25zdCB7aW5wdXRzLCBiYWNrZW5kLCBhdHRyc30gPSBhcmdzO1xuICBjb25zdCB7eCwgZHl9ID0gaW5wdXRzO1xuICBjb25zdCB7c3RyaWRlcywgcGFkLCBkYXRhRm9ybWF0LCBkaW1Sb3VuZGluZ01vZGUsIGZpbHRlclNoYXBlfSA9IGF0dHJzO1xuXG4gIGFzc2VydE5vdENvbXBsZXgoW3gsIGR5XSwgJ2NvbnYyZEJhY2twcm9wRmlsdGVyJyk7XG5cbiAgY29uc3QgJGRhdGFGb3JtYXQgPSBiYWNrZW5kX3V0aWwuY29udmVydENvbnYyRERhdGFGb3JtYXQoZGF0YUZvcm1hdCk7XG4gIGNvbnN0IGNvbnZJbmZvID0gYmFja2VuZF91dGlsLmNvbXB1dGVDb252MkRJbmZvKFxuICAgICAgeC5zaGFwZSBhcyBbbnVtYmVyLCBudW1iZXIsIG51bWJlciwgbnVtYmVyXSwgZmlsdGVyU2hhcGUsIHN0cmlkZXMsXG4gICAgICAxIC8qIGRpbGF0aW9ucyAqLywgcGFkLCBkaW1Sb3VuZGluZ01vZGUsIGZhbHNlIC8qIGRlcHRod2lzZSAqLyxcbiAgICAgICRkYXRhRm9ybWF0KTtcblxuICBjb25zdCB7c3RyaWRlSGVpZ2h0LCBzdHJpZGVXaWR0aCwgZmlsdGVySGVpZ2h0LCBmaWx0ZXJXaWR0aH0gPSBjb252SW5mbztcbiAgY29uc3QgaXNDaGFubmVsc0xhc3QgPSBjb252SW5mby5kYXRhRm9ybWF0ID09PSAnY2hhbm5lbHNMYXN0JztcbiAgY29uc3QgZFcgPSBuZXcgVGVuc29yQnVmZmVyKGNvbnZJbmZvLmZpbHRlclNoYXBlLCAnZmxvYXQzMicpO1xuXG4gIGNvbnN0IGxlZnRQYWQgPSBjb252SW5mby5wYWRJbmZvLmxlZnQ7XG4gIGNvbnN0IHRvcFBhZCA9IGNvbnZJbmZvLnBhZEluZm8udG9wO1xuICBjb25zdCB4VmFscyA9IGJhY2tlbmQuZGF0YS5nZXQoeC5kYXRhSWQpLnZhbHVlcyBhcyBUeXBlZEFycmF5O1xuICBjb25zdCBkeVZhbHMgPSBiYWNrZW5kLmRhdGEuZ2V0KGR5LmRhdGFJZCkudmFsdWVzIGFzIFR5cGVkQXJyYXk7XG5cbiAgY29uc3QgeEJ1ZiA9IG5ldyBUZW5zb3JCdWZmZXIoeC5zaGFwZSwgeC5kdHlwZSwgeFZhbHMpO1xuICBjb25zdCBkeUJ1ZiA9IG5ldyBUZW5zb3JCdWZmZXIoZHkuc2hhcGUsIGR5LmR0eXBlLCBkeVZhbHMpO1xuXG4gIGZvciAobGV0IHdSID0gMDsgd1IgPCBmaWx0ZXJIZWlnaHQ7ICsrd1IpIHtcbiAgICBjb25zdCB5Uk1pbiA9IE1hdGgubWF4KDAsIE1hdGguY2VpbCgodG9wUGFkIC0gd1IpIC8gc3RyaWRlSGVpZ2h0KSk7XG4gICAgY29uc3QgeVJNYXggPSBNYXRoLm1pbihcbiAgICAgICAgY29udkluZm8ub3V0SGVpZ2h0LCAoY29udkluZm8uaW5IZWlnaHQgKyB0b3BQYWQgLSB3UikgLyBzdHJpZGVIZWlnaHQpO1xuXG4gICAgZm9yIChsZXQgd0MgPSAwOyB3QyA8IGZpbHRlcldpZHRoOyArK3dDKSB7XG4gICAgICBjb25zdCB5Q01pbiA9IE1hdGgubWF4KDAsIE1hdGguY2VpbCgobGVmdFBhZCAtIHdDKSAvIHN0cmlkZVdpZHRoKSk7XG4gICAgICBjb25zdCB5Q01heCA9IE1hdGgubWluKFxuICAgICAgICAgIGNvbnZJbmZvLm91dFdpZHRoLCAoY29udkluZm8uaW5XaWR0aCArIGxlZnRQYWQgLSB3QykgLyBzdHJpZGVXaWR0aCk7XG5cbiAgICAgIGZvciAobGV0IGQxID0gMDsgZDEgPCBjb252SW5mby5pbkNoYW5uZWxzOyArK2QxKSB7XG4gICAgICAgIGZvciAobGV0IGQyID0gMDsgZDIgPCBjb252SW5mby5vdXRDaGFubmVsczsgKytkMikge1xuICAgICAgICAgIGxldCBkb3RQcm9kID0gMDtcbiAgICAgICAgICBmb3IgKGxldCBiID0gMDsgYiA8IGNvbnZJbmZvLmJhdGNoU2l6ZTsgKytiKSB7XG4gICAgICAgICAgICBmb3IgKGxldCB5UiA9IHlSTWluOyB5UiA8IHlSTWF4OyArK3lSKSB7XG4gICAgICAgICAgICAgIGNvbnN0IHhSID0gd1IgKyB5UiAqIHN0cmlkZUhlaWdodCAtIHRvcFBhZDtcbiAgICAgICAgICAgICAgZm9yIChsZXQgeUMgPSB5Q01pbjsgeUMgPCB5Q01heDsgKyt5Qykge1xuICAgICAgICAgICAgICAgIGNvbnN0IHhDID0gd0MgKyB5QyAqIHN0cmlkZVdpZHRoIC0gbGVmdFBhZDtcbiAgICAgICAgICAgICAgICBpZiAoaXNDaGFubmVsc0xhc3QpIHtcbiAgICAgICAgICAgICAgICAgIGRvdFByb2QgKz0gKHhCdWYuZ2V0KGIsIHhSLCB4QywgZDEpIGFzIG51bWJlcikgKlxuICAgICAgICAgICAgICAgICAgICAgIChkeUJ1Zi5nZXQoYiwgeVIsIHlDLCBkMikgYXMgbnVtYmVyKTtcbiAgICAgICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgICAgZG90UHJvZCArPSAoeEJ1Zi5nZXQoYiwgZDEsIHhSLCB4QykgYXMgbnVtYmVyKSAqXG4gICAgICAgICAgICAgICAgICAgICAgKGR5QnVmLmdldChiLCBkMiwgeVIsIHlDKSBhcyBudW1iZXIpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICAgIH1cbiAgICAgICAgICBkVy5zZXQoZG90UHJvZCwgd1IsIHdDLCBkMSwgZDIpO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfVxuICB9XG5cbiAgcmV0dXJuIGJhY2tlbmQubWFrZVRlbnNvckluZm8oZFcuc2hhcGUsIGRXLmR0eXBlLCBkVy52YWx1ZXMpO1xufVxuXG5leHBvcnQgY29uc3QgY29udjJEQmFja3Byb3BGaWx0ZXJDb25maWc6IEtlcm5lbENvbmZpZyA9IHtcbiAga2VybmVsTmFtZTogQ29udjJEQmFja3Byb3BGaWx0ZXIsXG4gIGJhY2tlbmROYW1lOiAnY3B1JyxcbiAga2VybmVsRnVuYzogY29udjJEQmFja3Byb3BGaWx0ZXIgYXMge30gYXMgS2VybmVsRnVuY1xufTtcbiJdfQ==","/**\n * @license\n * Copyright 2020 Google LLC. All Rights Reserved.\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n * =============================================================================\n */\nimport { backend_util, Conv2DBackpropInput, TensorBuffer, util } from '@tensorflow/tfjs-core';\nimport { assertNotComplex } from '../cpu_util';\nexport function conv2DBackpropInput(args) {\n const { inputs, backend, attrs } = args;\n const { dy, filter } = inputs;\n const { inputShape, strides, pad, dataFormat, dimRoundingMode } = attrs;\n assertNotComplex([dy, filter], 'conv2dBackpropInput');\n const filterStrides = util.computeStrides(filter.shape);\n const dyStrides = util.computeStrides(dy.shape);\n let $dataFormat = backend_util.convertConv2DDataFormat(dataFormat);\n const convInfo = backend_util.computeConv2DInfo(inputShape, filter.shape, strides, 1 /* dilations */, pad, dimRoundingMode, false, $dataFormat);\n const dx = new TensorBuffer(convInfo.inShape, 'float32');\n const dxValues = dx.values;\n const dyValues = backend.data.get(dy.dataId).values;\n const fltValues = backend.data.get(filter.dataId).values;\n const [fltS0, fltS1, fltS2] = filterStrides;\n const { batchSize, filterHeight, filterWidth, inChannels, inHeight, inWidth, outChannels, outHeight, outWidth, strideHeight, strideWidth } = convInfo;\n $dataFormat = convInfo.dataFormat;\n const topPad = filterHeight - 1 - convInfo.padInfo.top;\n const leftPad = filterWidth - 1 - convInfo.padInfo.left;\n const isChannelsLast = $dataFormat === 'channelsLast';\n const xBatchStride = dx.strides[0];\n const xRowStride = isChannelsLast ? dx.strides[1] : dx.strides[2];\n const xColStride = isChannelsLast ? dx.strides[2] : 1;\n const xChannelStride = isChannelsLast ? 1 : dx.strides[1];\n const yBatchStride = dyStrides[0];\n const yRowStride = isChannelsLast ? dyStrides[1] : dyStrides[2];\n const yColStride = isChannelsLast ? dyStrides[2] : 1;\n const yChannelStride = isChannelsLast ? 1 : dyStrides[1];\n for (let b = 0; b < batchSize; ++b) {\n for (let d1 = 0; d1 < inChannels; ++d1) {\n for (let xR = 0; xR < inHeight; ++xR) {\n const xRCorner = xR - topPad;\n const xRMin = Math.max(0, Math.ceil(xRCorner / strideHeight));\n const yRMax = Math.min(outHeight, (filterHeight + xRCorner) / strideHeight);\n for (let xC = 0; xC < inWidth; ++xC) {\n const xCCorner = xC - leftPad;\n const xCMin = Math.max(0, Math.ceil(xCCorner / strideWidth));\n const yCMax = Math.min(outWidth, (filterWidth + xCCorner) / strideWidth);\n let dotProd = 0;\n for (let yR = xRMin; yR < yRMax; ++yR) {\n const wR = yR * strideHeight - xRCorner;\n for (let yC = xCMin; yC < yCMax; ++yC) {\n const wC = yC * strideWidth - xCCorner;\n const dyOffset = yBatchStride * b + yRowStride * yR + yColStride * yC;\n const fltOffset = fltS0 * (filterHeight - 1 - wR) +\n fltS1 * (filterWidth - 1 - wC) + fltS2 * d1;\n for (let d2 = 0; d2 < outChannels; ++d2) {\n const pixel = dyValues[dyOffset + yChannelStride * d2];\n const weight = fltValues[fltOffset + d2];\n dotProd += pixel * weight;\n }\n }\n }\n const dxOffset = xBatchStride * b + xRowStride * xR +\n xColStride * xC + xChannelStride * d1;\n dxValues[dxOffset] = dotProd;\n }\n }\n }\n }\n return backend.makeTensorInfo(dx.shape, dx.dtype, dx.values);\n}\nexport const conv2DBackpropInputConfig = {\n kernelName: Conv2DBackpropInput,\n backendName: 'cpu',\n kernelFunc: conv2DBackpropInput\n};\n//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiQ29udjJEQmFja3Byb3BJbnB1dC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uLy4uL3RmanMtYmFja2VuZC1jcHUvc3JjL2tlcm5lbHMvQ29udjJEQmFja3Byb3BJbnB1dC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQTs7Ozs7Ozs7Ozs7Ozs7O0dBZUc7QUFFSCxPQUFPLEVBQUMsWUFBWSxFQUFFLG1CQUFtQixFQUFpRixZQUFZLEVBQTBCLElBQUksRUFBQyxNQUFNLHVCQUF1QixDQUFDO0FBR25NLE9BQU8sRUFBQyxnQkFBZ0IsRUFBQyxNQUFNLGFBQWEsQ0FBQztBQUU3QyxNQUFNLFVBQVUsbUJBQW1CLENBQUMsSUFJbkM7SUFDQyxNQUFNLEVBQUMsTUFBTSxFQUFFLE9BQU8sRUFBRSxLQUFLLEVBQUMsR0FBRyxJQUFJLENBQUM7SUFDdEMsTUFBTSxFQUFDLEVBQUUsRUFBRSxNQUFNLEVBQUMsR0FBRyxNQUFNLENBQUM7SUFDNUIsTUFBTSxFQUFDLFVBQVUsRUFBRSxPQUFPLEVBQUUsR0FBRyxFQUFFLFVBQVUsRUFBRSxlQUFlLEVBQUMsR0FBRyxLQUFLLENBQUM7SUFFdEUsZ0JBQWdCLENBQUMsQ0FBQyxFQUFFLEVBQUUsTUFBTSxDQUFDLEVBQUUscUJBQXFCLENBQUMsQ0FBQztJQUV0RCxNQUFNLGFBQWEsR0FBRyxJQUFJLENBQUMsY0FBYyxDQUFDLE1BQU0sQ0FBQyxLQUFLLENBQUMsQ0FBQztJQUN4RCxNQUFNLFNBQVMsR0FBRyxJQUFJLENBQUMsY0FBYyxDQUFDLEVBQUUsQ0FBQyxLQUFLLENBQUMsQ0FBQztJQUVoRCxJQUFJLFdBQVcsR0FBRyxZQUFZLENBQUMsdUJBQXVCLENBQUMsVUFBVSxDQUFDLENBQUM7SUFDbkUsTUFBTSxRQUFRLEdBQUcsWUFBWSxDQUFDLGlCQUFpQixDQUMzQyxVQUFVLEVBQUUsTUFBTSxDQUFDLEtBQXlDLEVBQUUsT0FBTyxFQUNyRSxDQUFDLENBQUMsZUFBZSxFQUFFLEdB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RUFBRSxDQUFDOzRCQUVoRCxLQUFLLElBQUksRUFBRSxHQUFHLENBQUMsRUFBRSxFQUFFLEdBQUcsV0FBVyxFQUFFLEVBQUUsRUFBRSxFQUFFO2dDQUN2QyxNQUFNLEtBQUssR0FBRyxRQUFRLENBQUMsUUFBUSxHQUFHLGNBQWMsR0FBRyxFQUFFLENBQUMsQ0FBQztnQ0FDdkQsTUFBTSxNQUFNLEdBQUcsU0FBUyxDQUFDLFNBQVMsR0FBRyxFQUFFLENBQUMsQ0FBQztnQ0FDekMsT0FBTyxJQUFJLEtBQUssR0FBRyxNQUFNLENBQUM7NkJBQzNCO3lCQUNGO3FCQUNGO29CQUNELE1BQU0sUUFBUSxHQUFHLFlBQVksR0FBRyxDQUFDLEdBQUcsVUFBVSxHQUFHLEVBQUU7d0JBQy9DLFVBQVUsR0FBRyxFQUFFLEdBQUcsY0FBYyxHQUFHLEVBQUUsQ0FBQztvQkFDMUMsUUFBUSxDQUFDLFFBQVEsQ0FBQyxHQUFHLE9BQU8sQ0FBQztpQkFDOUI7YUFDRjtTQUNGO0tBQ0Y7SUFFRCxPQUFPLE9BQU8sQ0FBQyxjQUFjLENBQUMsRUFBRSxDQUFDLEtBQUssRUFBRSxFQUFFLENBQUMsS0FBSyxFQUFFLEVBQUUsQ0FBQyxNQUFNLENBQUMsQ0FBQztBQUMvRCxDQUFDO0FBRUQsTUFBTSxDQUFDLE1BQU0seUJBQXlCLEdBQWlCO0lBQ3JELFVBQVUsRUFBRSxtQkFBbUI7SUFDL0IsV0FBVyxFQUFFLEtBQUs7SUFDbEIsVUFBVSxFQUFFLG1CQUF1QztDQUNwRCxDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiLyoqXG4gKiBAbGljZW5zZVxuICogQ29weXJpZ2h0IDIwMjAgR29vZ2xlIExMQy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC5cbiAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSBcIkxpY2Vuc2VcIik7XG4gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuXG4gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXRcbiAqXG4gKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjBcbiAqXG4gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlXG4gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiBcIkFTIElTXCIgQkFTSVMsXG4gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC5cbiAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmRcbiAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLlxuICogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbiAqL1xuXG5pbXBvcnQge2JhY2tlbmRfdXRpbCwgQ29udjJEQmFja3Byb3BJbnB1dCwgQ29udjJEQmFja3Byb3BJbnB1dEF0dHJzLCBDb252MkRCYWNrcHJvcElucHV0SW5wdXRzLCBLZXJuZWxDb25maWcsIEtlcm5lbEZ1bmMsIFRlbnNvckJ1ZmZlciwgVGVuc29ySW5mbywgVHlwZWRBcnJheSwgdXRpbH0gZnJvbSAnQHRlbnNvcmZsb3cvdGZqcy1jb3JlJztcblxuaW1wb3J0IHtNYXRoQmFja2VuZENQVX0gZnJvbSAnLi4vYmFja2VuZF9jcHUnO1xuaW1wb3J0IHthc3NlcnROb3RDb21wbGV4fSBmcm9tICcuLi9jcHVfdXRpbCc7XG5cbmV4cG9ydCBmdW5jdGlvbiBjb252MkRCYWNrcHJvcElucHV0KGFyZ3M6IHtcbiAgaW5wdXRzOiBDb252MkRCYWNrcHJvcElucHV0SW5wdXRzLFxuICBiYWNrZW5kOiBNYXRoQmFja2VuZENQVSxcbiAgYXR0cnM6IENvbnYyREJhY2twcm9wSW5wdXRBdHRyc1xufSk6IFRlbnNvckluZm8ge1xuICBjb25zdCB7aW5wdXRzLCBiYWNrZW5kLCBhdHRyc30gPSBhcmdzO1xuICBjb25zdCB7ZHksIGZpbHRlcn0gPSBpbnB1dHM7XG4gIGNvbnN0IHtpbnB1dFNoYXBlLCBzdHJpZGVzLCBwYWQsIGRhdGFGb3JtYXQsIGRpbVJvdW5kaW5nTW9kZX0gPSBhdHRycztcblxuICBhc3NlcnROb3RDb21wbGV4KFtkeSwgZmlsdGVyXSwgJ2NvbnYyZEJhY2twcm9wSW5wdXQnKTtcblxuICBjb25zdCBmaWx0ZXJTdHJpZGVzID0gdXRpbC5jb21wdXRlU3RyaWRlcyhmaWx0ZXIuc2hhcGUpO1xuICBjb25zdCBkeVN0cmlkZXMgPSB1dGlsLmNvbXB1dGVTdHJpZGVzKGR5LnNoYXBlKTtcblxuICBsZXQgJGRhdGFGb3JtYXQgPSBiYWNrZW5kX3V0aWwuY29udmVydENvbnYyRERhdGFGb3JtYXQoZGF0YUZvcm1hdCk7XG4gIGNvbnN0IGNvbnZJbmZvID0gYmFja2VuZF91dGlsLmNvbXB1dGVDb252MkRJbmZvKFxuICAgICAgaW5wdXRTaGFwZSwgZmlsdGVyLnNoYXBlIGFzIFtudW1iZXIsIG51bWJlciwgbnVtYmVyLCBudW1iZXJdLCBzdHJpZGVzLFxuICAgICAgMSAvKiBkaWxhdGlvbnMgKi8sIHBhZCwgZGltUm91bmRpbmdNb2RlLCBmYWxzZSwgJGRhdGFGb3JtYXQpO1xuXG4gIGNvbnN0IGR4ID0gbmV3IFRlbnNvckJ1ZmZlcihjb252SW5mby5pblNoYXBlLCAnZmxvYXQzMicpO1xuICBjb25zdCBkeFZhbHVlcyA9IGR4LnZhbHVlcztcbiAgY29uc3QgZHlWYWx1ZXMgPSBiYWNrZW5kLmRhdGEuZ2V0KGR5LmRhdGFJZCkudmFsdWVzIGFzIFR5cGVkQXJyYXk7XG4gIGNvbnN0IGZsdFZhbHVlcyA9IGJhY2tlbmQuZGF0YS5nZXQoZmlsdGVyLmRhdGFJZCkudmFsdWVzIGFzIFR5cGVkQXJyYXk7XG4gIGNvbnN0IFtmbHRTMCwgZmx0UzEsIGZsdFMyXSA9IGZpbHRlclN0cmlkZXM7XG4gIGNvbnN0IHtcbiAgICBiYXRjaFNpemUsXG4gICAgZmlsdGVySGVpZ2h0LFxuICAgIGZpbHRlcldpZHRoLFxuICAgIGluQ2hhbm5lbHMsXG4gICAgaW5IZWlnaHQsXG4gICAgaW5XaWR0aCxcbiAgICBvdXRDaGFubmVscyxcbiAgICBvdXRIZWlnaHQsXG4gICAgb3V0V2lkdGgsXG4gICAgc3RyaWRlSGVpZ2h0LFxuICAgIHN0cmlkZVdpZHRoXG4gIH0gPSBjb252SW5mbztcbiAgJGRhdGFGb3JtYXQgPSBjb252SW5mby5kYXRhRm9ybWF0O1xuICBjb25zdCB0b3BQYWQgPSBmaWx0ZXJIZWlnaHQgLSAxIC0gY29udkluZm8ucGFkSW5mby50b3A7XG4gIGNvbnN0IGxlZnRQYWQgPSBmaWx0ZXJXaWR0aCAtIDEgLSBjb252SW5mby5wYWRJbmZvLmxlZnQ7XG5cbiAgY29uc3QgaXNDaGFubmVsc0xhc3QgPSAkZGF0YUZvcm1hdCA9PT0gJ2NoYW5uZWxzTGFzdCc7XG4gIGNvbnN0IHhCYXRjaFN0cmlkZSA9IGR4LnN0cmlkZXNbMF07XG4gIGNvbnN0IHhSb3dTdHJpZGUgPSBpc0NoYW5uZWxzTGFzdCA/IGR4LnN0cmlkZXNbMV0gOiBkeC5zdHJpZGVzWzJdO1xuICBjb25zdCB4Q29sU3RyaWRlID0gaXNDaGFubmVsc0xhc3QgPyBkeC5zdHJpZGVzWzJdIDogMTtcbiAgY29uc3QgeENoYW5uZWxTdHJpZGUgPSBpc0NoYW5uZWxzTGFzdCA/IDEgOiBkeC5zdHJpZGVzWzFdO1xuICBjb25zdCB5QmF0Y2hTdHJpZGUgPSBkeVN0cmlkZXNbMF07XG4gIGNvbnN0IHlSb3dTdHJpZGUgPSBpc0NoYW5uZWxzTGFzdCA/IGR5U3RyaWRlc1sxXSA6IGR5U3RyaWRlc1syXTtcbiAgY29uc3QgeUNvbFN0cmlkZSA9IGlzQ2hhbm5lbHNMYXN0ID8gZHlTdHJpZGVzWzJdIDogMTtcbiAgY29uc3QgeUNoYW5uZWxTdHJpZGUgPSBpc0NoYW5uZWxzTGFzdCA/IDEgOiBkeVN0cmlkZXNbMV07XG5cbiAgZm9yIChsZXQgYiA9IDA7IGIgPCBiYXRjaFNpemU7ICsrYikge1xuICAgIGZvciAobGV0IGQxID0gMDsgZDEgPCBpbkNoYW5uZWxzOyArK2QxKSB7XG4gICAgICBmb3IgKGxldCB4UiA9IDA7IHhSIDwgaW5IZWlnaHQ7ICsreFIpIHtcbiAgICAgICAgY29uc3QgeFJDb3JuZXIgPSB4UiAtIHRvcFBhZDtcbiAgICAgICAgY29uc3QgeFJNaW4gPSBNYXRoLm1heCgwLCBNYXRoLmNlaWwoeFJDb3JuZXIgLyBzdHJpZGVIZWlnaHQpKTtcbiAgICAgICAgY29uc3QgeVJNYXggPVxuICAgICAgICAgICAgTWF0aC5taW4ob3V0SGVpZ2h0LCAoZmlsdGVySGVpZ2h0ICsgeFJDb3JuZXIpIC8gc3RyaWRlSGVpZ2h0KTtcblxuICAgICAgICBmb3IgKGxldCB4QyA9IDA7IHhDIDwgaW5XaWR0aDsgKyt4Qykge1xuICAgICAgICAgIGNvbnN0IHhDQ29ybmVyID0geEMgLSBsZWZ0UGFkO1xuICAgICAgICAgIGNvbnN0IHhDTWluID0gTWF0aC5tYXgoMCwgTWF0aC5jZWlsKHhDQ29ybmVyIC8gc3RyaWRlV2lkdGgpKTtcbiAgICAgICAgICBjb25zdCB5Q01heCA9XG4gICAgICAgICAgICAgIE1hdGgubWluKG91dFdpZHRoLCAoZmlsdGVyV2lkdGggKyB4Q0Nvcm5lcikgLyBzdHJpZGVXaWR0aCk7XG5cbiAgICAgICAgICBsZXQgZG90UHJvZCA9IDA7XG4gICAgICAgICAgZm9yIChsZXQgeVIgPSB4Uk1pbjsgeVIgPCB5Uk1heDsgKyt5Uikge1xuICAgICAgICAgICAgY29uc3Qgd1IgPSB5UiAqIHN0cmlkZUhlaWdodCAtIHhSQ29ybmVyO1xuXG4gICAgICAgICAgICBmb3IgKGxldCB5QyA9IHhDTWluOyB5QyA8IHlDTWF4OyArK3lDKSB7XG4gICAgICAgICAgICAgIGNvbnN0IHdDID0geUMgKiBzdHJpZGVXaWR0aCAtIHhDQ29ybmVyO1xuICAgICAgICAgICAgICBjb25zdCBkeU9mZnNldCA9XG4gICAgICAgICAgICAgICAgICB5QmF0Y2hTdHJpZGUgKiBiICsgeVJvd1N0cmlkZSAqIHlSICsgeUNvbFN0cmlkZSAqIHlDO1xuICAgICAgICAgICAgICBjb25zdCBmbHRPZmZzZXQgPSBmbHRTMCAqIChmaWx0ZXJIZWlnaHQgLSAxIC0gd1IpICtcbiAgICAgICAgICAgICAgICAgIGZsdFMxICogKGZpbHRlcldpZHRoIC0gMSAtIHdDKSArIGZsdFMyICogZDE7XG5cbiAgICAgICAgICAgICAgZm9yIChsZXQgZDIgPSAwOyBkMiA8IG91dENoYW5uZWxzOyArK2QyKSB7XG4gICAgICAgICAgICAgICAgY29uc3QgcGl4ZWwgPSBkeVZhbHVlc1tkeU9mZnNldCArIHlDaGFubmVsU3RyaWRlICogZDJdO1xuICAgICAgICAgICAgICAgIGNvbnN0IHdlaWdodCA9IGZsdFZhbHVlc1tmbHRPZmZzZXQgKyBkMl07XG4gICAgICAgICAgICAgICAgZG90UHJvZCArPSBwaXhlbCAqIHdlaWdodDtcbiAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICAgIH1cbiAgICAgICAgICBjb25zdCBkeE9mZnNldCA9IHhCYXRjaFN0cmlkZSAqIGIgKyB4Um93U3RyaWRlICogeFIgK1xuICAgICAgICAgICAgICB4Q29sU3RyaWRlICogeEMgKyB4Q2hhbm5lbFN0cmlkZSAqIGQxO1xuICAgICAgICAgIGR4VmFsdWVzW2R4T2Zmc2V0XSA9IGRvdFByb2Q7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9XG4gIH1cblxuICByZXR1cm4gYmFja2VuZC5tYWtlVGVuc29ySW5mbyhkeC5zaGFwZSwgZHguZHR5cGUsIGR4LnZhbHVlcyk7XG59XG5cbmV4cG9ydCBjb25zdCBjb252MkRCYWNrcHJvcElucHV0Q29uZmlnOiBLZXJuZWxDb25maWcgPSB7XG4gIGtlcm5lbE5hbWU6IENvbnYyREJhY2twcm9wSW5wdXQsXG4gIGJhY2tlbmROYW1lOiAnY3B1JyxcbiAga2VybmVsRnVuYzogY29udjJEQmFja3Byb3BJbnB1dCBhcyB7fSBhcyBLZXJuZWxGdW5jXG59O1xuIl19","/**\n * @license\n * Copyright 2020 Google LLC. All Rights Reserved.\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n * =============================================================================\n */\nimport { backend_util, Conv3D, TensorBuffer, util } from '@tensorflow/tfjs-core';\nimport { assertNotComplex } from '../cpu_util';\nexport function conv3D(args) {\n const { inputs, backend, attrs } = args;\n const { x, filter } = inputs;\n const { strides, pad, dilations } = attrs;\n assertNotComplex([x, filter], 'conv3d');\n const convInfo = backend_util.computeConv3DInfo(x.shape, filter.shape, strides, dilations, pad);\n const { filterDepth, filterHeight, filterWidth, dilationDepth, dilationHeight, dilationWidth, padInfo } = convInfo;\n const padFront = padInfo.front;\n const padLeft = padInfo.left;\n const padTop = padInfo.top;\n const y = new TensorBuffer(convInfo.outShape, x.dtype);\n const xVals = backend.data.get(x.dataId).values;\n const wVals = backend.data.get(filter.dataId).values;\n const yVals = y.values;\n const xStrides = util.computeStrides(x.shape);\n const filterStrides = util.computeStrides(filter.shape);\n for (let b = 0; b < convInfo.batchSize; ++b) {\n const xOffset1 = b * xStrides[0];\n const yOffset1 = b * y.strides[0];\n for (let yF = 0; yF < convInfo.outDepth; ++yF) {\n const yOffset2 = yOffset1 + yF * y.strides[1];\n const xFCorner = yF * convInfo.strideDepth - padFront;\n for (let wF = 0; wF < filterDepth; ++wF) {\n const xF = xFCorner + wF * dilationDepth;\n if (xF < 0 || xF >= convInfo.inDepth) {\n continue;\n }\n const wOffset1 = wF * filterStrides[0];\n const xOffset2 = xOffset1 + xF * xStrides[1];\n for (let yR = 0; yR < convInfo.outHeight; ++yR) {\n const yOffset3 = yOffset2 + yR * y.strides[2];\n const xRCorner = yR * convInfo.strideHeight - padTop;\n for (let wR = 0; wR < filterHeight; ++wR) {\n const xR = xRCorner + wR * dilationHeight;\n if (xR < 0 || xR >= convInfo.inHeight) {\n continue;\n }\n const wOffset2 = wOffset1 + wR * filterStrides[1];\n const xOffset3 = xOffset2 + xR * xStrides[2];\n for (let yC = 0; yC < convInfo.outWidth; ++yC) {\n const yOffset4 = yOffset3 + yC * convInfo.outChannels;\n const xCCorner = yC * convInfo.strideWidth - padLeft;\n for (let wC = 0; wC < filterWidth; ++wC) {\n const xC = xCCorner + wC * dilationWidth;\n if (xC < 0 || xC >= convInfo.inWidth) {\n continue;\n }\n const wOffset3 = wOffset2 + wC * filterStrides[2];\n const xOffset4 = xOffset3 + xC * convInfo.inChannels;\n let wOffset4 = wOffset3;\n for (let d1 = 0; d1 < convInfo.inChannels; ++d1) {\n const xVal = xVals[xOffset4 + d1];\n for (let d2 = 0; d2 < convInfo.outChannels; ++d2) {\n yVals[yOffset4 + d2] += xVal * wVals[wOffset4 + d2];\n }\n wOffset4 += convInfo.outChannels;\n }\n }\n }\n }\n }\n }\n }\n }\n return backend.makeTensorInfo(y.shape, y.dtype, y.values);\n}\nexport const conv3DConfig = {\n kernelName: Conv3D,\n backendName: 'cpu',\n kernelFunc: conv3D\n};\n//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiQ29udjNELmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vLi4vdGZqcy1iYWNrZW5kLWNwdS9zcmMva2VybmVscy9Db252M0QudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUE7Ozs7Ozs7Ozs7Ozs7OztHQWVHO0FBRUgsT0FBTyxFQUFDLFlBQVksRUFBRSxNQUFNLEVBQXVELFlBQVksRUFBMEIsSUFBSSxFQUFDLE1BQU0sdUJBQXVCLENBQUM7QUFHNUosT0FBTyxFQUFDLGdCQUFnQixFQUFDLE1BQU0sYUFBYSxDQUFDO0FBRTdDLE1BQU0sVUFBVSxNQUFNLENBQ2xCLElBQXlFO0lBRTNFLE1BQU0sRUFBQyxNQUFNLEVBQUUsT0FBTyxFQUFFLEtBQUssRUFBQyxHQUFHLElBQUksQ0FBQztJQUN0QyxNQUFNLEVBQUMsQ0FBQyxFQUFFLE1BQU0sRUFBQyxHQUFHLE1BQU0sQ0FBQztJQUMzQixNQUFNLEVBQUMsT0FBTyxFQUFFLEdBQUcsRUFBRSxTQUFTLEVBQUMsR0FBRyxLQUFLLENBQUM7SUFFeEMsZ0JBQWdCLENBQUMsQ0FBQyxDQUFDLEVBQUUsTUFBTSxDQUFDLEVBQUUsUUFBUSxDQUFDLENBQUM7SUFFeEMsTUFBTSxRQUFRLEdBQUcsWUFBWSxDQUFDLGlCQUFpQixDQUMzQyxDQUFDLENBQUMsS0FBaUQsRUFDbkQsTUFBTSxDQUFDLEtBQWlELEVBQUUsT0FBTyxFQUNqRSxTQUFTLEVBQUUsR0FBRyxDQUFDLENBQUM7SUFFcEIsTUFBTSxFQUNKLFdBQVcsRUFDWCxZQUFZLEVBQ1osV0FBVyxFQUNYLGFBQWEsRUFDYixjQUFjLEVBQ2QsYUFBYSxFQUNiLE9BQU8sRUFDUixHQUFHLFFBQVEsQ0FBQztJQUNiLE1BQU0sUUFBUSxHQUFHLE9BQU8sQ0FBQyxLQUFLLENBQUM7SUFDL0IsTUFBTSxPQUFPLEdBQUcsT0FBTyxDQUFDLElBQUksQ0FBQztJQUM3QixNQUFNLE1BQU0sR0FBRyxPQUFPLENBQUMsR0FBRyxDQUFDO0lB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QUVELE9BQU8sT0FBTyxDQUFDLGNBQWMsQ0FBQyxDQUFDLENBQUMsS0FBSyxFQUFFLENBQUMsQ0FBQyxLQUFLLEVBQUUsQ0FBQyxDQUFDLE1BQU0sQ0FBQyxDQUFDO0FBQzVELENBQUM7QUFFRCxNQUFNLENBQUMsTUFBTSxZQUFZLEdBQWlCO0lBQ3hDLFVBQVUsRUFBRSxNQUFNO0lBQ2xCLFdBQVcsRUFBRSxLQUFLO0lBQ2xCLFVBQVUsRUFBRSxNQUEwQjtDQUN2QyxDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiLyoqXG4gKiBAbGljZW5zZVxuICogQ29weXJpZ2h0IDIwMjAgR29vZ2xlIExMQy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC5cbiAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSBcIkxpY2Vuc2VcIik7XG4gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuXG4gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXRcbiAqXG4gKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjBcbiAqXG4gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlXG4gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiBcIkFTIElTXCIgQkFTSVMsXG4gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC5cbiAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmRcbiAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLlxuICogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbiAqL1xuXG5pbXBvcnQge2JhY2tlbmRfdXRpbCwgQ29udjNELCBDb252M0RBdHRycywgQ29udjNESW5wdXRzLCBLZXJuZWxDb25maWcsIEtlcm5lbEZ1bmMsIFRlbnNvckJ1ZmZlciwgVGVuc29ySW5mbywgVHlwZWRBcnJheSwgdXRpbH0gZnJvbSAnQHRlbnNvcmZsb3cvdGZqcy1jb3JlJztcblxuaW1wb3J0IHtNYXRoQmFja2VuZENQVX0gZnJvbSAnLi4vYmFja2VuZF9jcHUnO1xuaW1wb3J0IHthc3NlcnROb3RDb21wbGV4fSBmcm9tICcuLi9jcHVfdXRpbCc7XG5cbmV4cG9ydCBmdW5jdGlvbiBjb252M0QoXG4gICAgYXJnczoge2lucHV0czogQ29udjNESW5wdXRzLCBiYWNrZW5kOiBNYXRoQmFja2VuZENQVSwgYXR0cnM6IENvbnYzREF0dHJzfSk6XG4gICAgVGVuc29ySW5mbyB7XG4gIGNvbnN0IHtpbnB1dHMsIGJhY2tlbmQsIGF0dHJzfSA9IGFyZ3M7XG4gIGNvbnN0IHt4LCBmaWx0ZXJ9ID0gaW5wdXRzO1xuICBjb25zdCB7c3RyaWRlcywgcGFkLCBkaWxhdGlvbnN9ID0gYXR0cnM7XG5cbiAgYXNzZXJ0Tm90Q29tcGxleChbeCwgZmlsdGVyXSwgJ2NvbnYzZCcpO1xuXG4gIGNvbnN0IGNvbnZJbmZvID0gYmFja2VuZF91dGlsLmNvbXB1dGVDb252M0RJbmZvKFxuICAgICAgeC5zaGFwZSBhcyBbbnVtYmVyLCBudW1iZXIsIG51bWJlciwgbnVtYmVyLCBudW1iZXJdLFxuICAgICAgZmlsdGVyLnNoYXBlIGFzIFtudW1iZXIsIG51bWJlciwgbnVtYmVyLCBudW1iZXIsIG51bWJlcl0sIHN0cmlkZXMsXG4gICAgICBkaWxhdGlvbnMsIHBhZCk7XG5cbiAgY29uc3Qge1xuICAgIGZpbHRlckRlcHRoLFxuICAgIGZpbHRlckhlaWdodCxcbiAgICBmaWx0ZXJXaWR0aCxcbiAgICBkaWxhdGlvbkRlcHRoLFxuICAgIGRpbGF0aW9uSGVpZ2h0LFxuICAgIGRpbGF0aW9uV2lkdGgsXG4gICAgcGFkSW5mb1xuICB9ID0gY29udkluZm87XG4gIGNvbnN0IHBhZEZyb250ID0gcGFkSW5mby5mcm9udDtcbiAgY29uc3QgcGFkTGVmdCA9IHBhZEluZm8ubGVmdDtcbiAgY29uc3QgcGFkVG9wID0gcGFkSW5mby50b3A7XG4gIGNvbnN0IHkgPSBuZXcgVGVuc29yQnVmZmVyKGNvbnZJbmZvLm91dFNoYXBlLCB4LmR0eXBlIGFzICdmbG9hdDMyJyk7XG5cbiAgY29uc3QgeFZhbHMgPSBiYWNrZW5kLmRhdGEuZ2V0KHguZGF0YUlkKS52YWx1ZXMgYXMgVHlwZWRBcnJheTtcbiAgY29uc3Qgd1ZhbHMgPSBiYWNrZW5kLmRhdGEuZ2V0KGZpbHRlci5kYXRhSWQpLnZhbHVlcyBhcyBUeXBlZEFycmF5O1xuICBjb25zdCB5VmFscyA9IHkudmFsdWVzO1xuXG4gIGNvbnN0IHhTdHJpZGVzID0gdXRpbC5jb21wdXRlU3RyaWRlcyh4LnNoYXBlKTtcbiAgY29uc3QgZmlsdGVyU3RyaWRlcyA9IHV0aWwuY29tcHV0ZVN0cmlkZXMoZmlsdGVyLnNoYXBlKTtcblxuICBmb3IgKGxldCBiID0gMDsgYiA8IGNvbnZJbmZvLmJhdGNoU2l6ZTsgKytiKSB7XG4gICAgY29uc3QgeE9mZnNldDEgPSBiICogeFN0cmlkZXNbMF07XG4gICAgY29uc3QgeU9mZnNldDEgPSBiICogeS5zdHJpZGVzWzBdO1xuICAgIGZvciAobGV0IHlGID0gMDsgeUYgPCBjb252SW5mby5vdXREZXB0aDsgKyt5Rikge1xuICAgICAgY29uc3QgeU9mZnNldDIgPSB5T2Zmc2V0MSArIHlGICogeS5zdHJpZGVzWzFdO1xuICAgICAgY29uc3QgeEZDb3JuZXIgPSB5RiAqIGNvbnZJbmZvLnN0cmlkZURlcHRoIC0gcGFkRnJvbnQ7XG4gICAgICBmb3IgKGxldCB3RiA9IDA7IHdGIDwgZmlsdGVyRGVwdGg7ICsrd0YpIHtcbiAgICAgICAgY29uc3QgeEYgPSB4RkNvcm5lciArIHdGICogZGlsYXRpb25EZXB0aDtcbiAgICAgICAgaWYgKHhGIDwgMCB8fCB4RiA+PSBjb252SW5mby5pbkRlcHRoKSB7XG4gICAgICAgICAgY29udGludWU7XG4gICAgICAgIH1cbiAgICAgICAgY29uc3Qgd09mZnNldDEgPSB3RiAqIGZpbHRlclN0cmlkZXNbMF07XG4gICAgICAgIGNvbnN0IHhPZmZzZXQyID0geE9mZnNldDEgKyB4RiAqIHhTdHJpZGVzWzFdO1xuXG4gICAgICAgIGZvciAobGV0IHlSID0gMDsgeVIgPCBjb252SW5mby5vdXRIZWlnaHQ7ICsreVIpIHtcbiAgICAgICAgICBjb25zdCB5T2Zmc2V0MyA9IHlPZmZzZXQyICsgeVIgKiB5LnN0cmlkZXNbMl07XG4gICAgICAgICAgY29uc3QgeFJDb3JuZXIgPSB5UiAqIGNvbnZJbmZvLnN0cmlkZUhlaWdodCAtIHBhZFRvcDtcbiAgICAgICAgICBmb3IgKGxldCB3UiA9IDA7IHdSIDwgZmlsdGVySGVpZ2h0OyArK3dSKSB7XG4gICAgICAgICAgICBjb25zdCB4UiA9IHhSQ29ybmVyICsgd1IgKiBkaWxhdGlvbkhlaWdodDtcbiAgICAgICAgICAgIGlmICh4UiA8IDAgfHwgeFIgPj0gY29udkluZm8uaW5IZWlnaHQpIHtcbiAgICAgICAgICAgICAgY29udGludWU7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBjb25zdCB3T2Zmc2V0MiA9IHdPZmZzZXQxICsgd1IgKiBmaWx0ZXJTdHJpZGVzWzFdO1xuICAgICAgICAgICAgY29uc3QgeE9mZnNldDMgPSB4T2Zmc2V0MiArIHhSICogeFN0cmlkZXNbMl07XG4gICAgICAgICAgICBmb3IgKGxldCB5QyA9IDA7IHlDIDwgY29udkluZm8ub3V0V2lkdGg7ICsreUMpIHtcbiAgICAgICAgICAgICAgY29uc3QgeU9mZnNldDQgPSB5T2Zmc2V0MyArIHlDICogY29udkluZm8ub3V0Q2hhbm5lbHM7XG4gICAgICAgICAgICAgIGNvbnN0IHhDQ29ybmVyID0geUMgKiBjb252SW5mby5zdHJpZGVXaWR0aCAtIHBhZExlZnQ7XG4gICAgICAgICAgICAgIGZvciAobGV0IHdDID0gMDsgd0MgPCBmaWx0ZXJXaWR0aDsgKyt3Qykge1xuICAgICAgICAgICAgICAgIGNvbnN0IHhDID0geENDb3JuZXIgKyB3QyAqIGRpbGF0aW9uV2lkdGg7XG4gICAgICAgICAgICAgICAgaWYgKHhDIDwgMCB8fCB4QyA+PSBjb252SW5mby5pbldpZHRoKSB7XG4gICAgICAgICAgICAgICAgICBjb250aW51ZTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgY29uc3Qgd09mZnNldDMgPSB3T2Zmc2V0MiArIHdDICogZmlsdGVyU3RyaWRlc1syXTtcbiAgICAgICAgICAgICAgICBjb25zdCB4T2Zmc2V0NCA9IHhPZmZzZXQzICsgeEMgKiBjb252SW5mby5pbkNoYW5uZWxzO1xuICAgICAgICAgICAgICAgIGxldCB3T2Zmc2V0NCA9IHdPZmZzZXQzO1xuICAgICAgICAgICAgICAgIGZvciAobGV0IGQxID0gMDsgZDEgPCBjb252SW5mby5pbkNoYW5uZWxzOyArK2QxKSB7XG4gICAgICAgICAgICAgICAgICBjb25zdCB4VmFsID0geFZhbHNbeE9mZnNldDQgKyBkMV07XG4gICAgICAgICAgICAgICAgICBmb3IgKGxldCBkMiA9IDA7IGQyIDwgY29udkluZm8ub3V0Q2hhbm5lbHM7ICsrZDIpIHtcbiAgICAgICAgICAgICAgICAgICAgeVZhbHNbeU9mZnNldDQgKyBkMl0gKz0geFZhbCAqIHdWYWxzW3dPZmZzZXQ0ICsgZDJdO1xuICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgd09mZnNldDQgKz0gY29udkluZm8ub3V0Q2hhbm5lbHM7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICB9XG4gICAgfVxuICB9XG5cbiAgcmV0dXJuIGJhY2tlbmQubWFrZVRlbnNvckluZm8oeS5zaGFwZSwgeS5kdHlwZSwgeS52YWx1ZXMpO1xufVxuXG5leHBvcnQgY29uc3QgY29udjNEQ29uZmlnOiBLZXJuZWxDb25maWcgPSB7XG4gIGtlcm5lbE5hbWU6IENvbnYzRCxcbiAgYmFja2VuZE5hbWU6ICdjcHUnLFxuICBrZXJuZWxGdW5jOiBjb252M0QgYXMge30gYXMgS2VybmVsRnVuY1xufTtcbiJdfQ==","/**\n * @license\n * Copyright 2020 Google LLC. All Rights Reserved.\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n * =============================================================================\n */\nimport { backend_util, Conv3DBackpropFilterV2, TensorBuffer, util } from '@tensorflow/tfjs-core';\nimport { assertNotComplex } from '../cpu_util';\nexport function conv3DBackpropFilterV2(args) {\n const { inputs, backend, attrs } = args;\n const { x, dy } = inputs;\n const { strides, pad, filterShape } = attrs;\n assertNotComplex([x, dy], 'conv3dBackpropFilterV2');\n const xStrides = util.computeStrides(x.shape);\n const dyStrides = util.computeStrides(dy.shape);\n const convInfo = backend_util.computeConv3DInfo(x.shape, filterShape, strides, 1 /* dilations */, pad);\n const strideDepth = convInfo.strideDepth;\n const strideHeight = convInfo.strideHeight;\n const strideWidth = convInfo.strideWidth;\n const filterDepth = convInfo.filterDepth;\n const filterHeight = convInfo.filterHeight;\n const filterWidth = convInfo.filterWidth;\n const dw = new TensorBuffer(convInfo.filterShape, 'float32');\n const dwValues = dw.values;\n const [dwS0, dwS1, dwS2, dwS3] = dw.strides;\n const dyValues = backend.data.get(dy.dataId).values;\n const [dyS0, dyS1, dyS2, dyS3] = dyStrides;\n const xValues = backend.data.get(x.dataId).values;\n const [xS0, xS1, xS2, xS3] = xStrides;\n const frontPad = convInfo.padInfo.front;\n const leftPad = convInfo.padInfo.left;\n const topPad = convInfo.padInfo.top;\n for (let wF = 0; wF < filterDepth; ++wF) {\n const yFMin = Math.max(0, Math.ceil((frontPad - wF) / strideDepth));\n const yFMax = Math.min(convInfo.outDepth, (convInfo.inDepth + frontPad - wF) / strideDepth);\n const wOffset1 = wF * dwS0;\n for (let wR = 0; wR < filterHeight; ++wR) {\n const yRMin = Math.max(0, Math.ceil((topPad - wR) / strideHeight));\n const yRMax = Math.min(convInfo.outHeight, (convInfo.inHeight + topPad - wR) / strideHeight);\n const wOffset2 = wR * dwS1 + wOffset1;\n for (let wC = 0; wC < filterWidth; ++wC) {\n const yCMin = Math.max(0, Math.ceil((leftPad - wC) / strideWidth));\n const yCMax = Math.min(convInfo.outWidth, (convInfo.inWidth + leftPad - wC) / strideWidth);\n const wOffset3 = wC * dwS2 + wOffset2;\n for (let d1 = 0; d1 < convInfo.inChannels; ++d1) {\n const wOffset4 = d1 * dwS3 + wOffset3;\n for (let d2 = 0; d2 < convInfo.outChannels; ++d2) {\n let dotProd = 0;\n for (let b = 0; b < convInfo.batchSize; ++b) {\n const xOffset1 = b * xS0;\n const yOffset1 = b * dyS0;\n for (let yF = yFMin; yF < yFMax; ++yF) {\n const xF = wF + yF * strideDepth - frontPad;\n const xOffset2 = xF * xS1 + xOffset1;\n const yOffset2 = yF * dyS1 + yOffset1;\n for (let yR = yRMin; yR < yRMax; ++yR) {\n const xR = wR + yR * strideHeight - topPad;\n const xOffset3 = xR * xS2 + xOffset2;\n const yOffset3 = yR * dyS2 + yOffset2;\n for (let yC = yCMin; yC < yCMax; ++yC) {\n const xC = wC + yC * strideWidth - leftPad;\n const xOffset4 = xC * xS3 + xOffset3;\n const yOffset4 = yC * dyS3 + yOffset3;\n dotProd += xValues[xOffset4 + d1] * dyValues[yOffset4 + d2];\n }\n }\n }\n }\n dwValues[wOffset4 + d2] = dotProd;\n }\n }\n }\n }\n }\n return backend.makeTensorInfo(dw.shape, dw.dtype, dw.values);\n}\nexport const conv3DBackpropFilterV2Config = {\n kernelName: Conv3DBackpropFilterV2,\n backendName: 'cpu',\n kernelFunc: conv3DBackpropFilterV2\n};\n//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiQ29udjNEQmFja3Byb3BGaWx0ZXJWMi5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uLy4uL3RmanMtYmFja2VuZC1jcHUvc3JjL2tlcm5lbHMvQ29udjNEQmFja3Byb3BGaWx0ZXJWMi50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQTs7Ozs7Ozs7Ozs7Ozs7O0dBZUc7QUFFSCxPQUFPLEVBQUMsWUFBWSxFQUFFLHNCQUFzQixFQUF1RixZQUFZLEVBQTBCLElBQUksRUFBQyxNQUFNLHVCQUF1QixDQUFDO0FBRzVNLE9BQU8sRUFBQyxnQkFBZ0IsRUFBQyxNQUFNLGFBQWEsQ0FBQztBQUU3QyxNQUFNLFVBQVUsc0JBQXNCLENBQUMsSUFJdEM7SUFDQyxNQUFNLEVBQUMsTUFBTSxFQUFFLE9BQU8sRUFBRSxLQUFLLEVBQUMsR0FBRyxJQUFJLENBQUM7SUFDdEMsTUFBTSxFQUFDLENBQUMsRUFBRSxFQUFFLEVBQUMsR0FBRyxNQUFNLENBQUM7SUFDdkIsTUFBTSxFQUFDLE9BQU8sRUFBRSxHQUFHLEVBQUUsV0FBVyxFQUFDLEdBQUcsS0FBSyxDQUFDO0lBRTFDLGdCQUFnQixDQUFDLENBQUMsQ0FBQyxFQUFFLEVBQUUsQ0FBQyxFQUFFLHdCQUF3QixDQUFDLENBQUM7SUFFcEQsTUFBTSxRQUFRLEdBQUcsSUFBSSxDQUFDLGNBQWMsQ0FBQyxDQUFDLENBQUMsS0FBSyxDQUFDLENBQUM7SUFDOUMsTUFBTSxTQUFTLEdBQUcsSUFBSSxDQUFDLGNBQWMsQ0FBQyxFQUFFLENBQUMsS0FBSyxDQUFDLENBQUM7SUFFaEQsTUFBTSxRQUFRLEdBQUcsWUFBWSxDQUFDLGlCQUFpQixDQUMzQyxDQUFDLENBQUMsS0FBaUQsRUFBRSxXQUFXLEVBQUUsT0FBTyxFQUN6RSxDQUFDLENBQUMsZUFBZSxFQUFFLEdBQUcsQ0FBQyxDQUFDO0lBRTVCLE1BQU0sV0FBVyxHQUFHLFFBQVEsQ0FBQyxXQUFXLENBQUM7SUFDekMsTUFBTSxZQUFZLEdBQUcsUUFBUSxDQUFDLFlBQVksQ0FBQztJQUMzQyxNQUFNLFdBQVcsR0FBRyxRQUFRLENBQUMsV0FBVyxDQUFDO0lBQ3pDLE1BQU0sV0FBVyxHQUFHLFFBQVEsQ0FBQyxXQUFXLENBQUM7SUFDekMsTUFBTSxZQUFZLEdBQUcsUUFBUSxDQUFDLFlBQVksQ0FBQztJQUMzQyxNQUFNLFdBQVcsR0FBRyxRQUFRLENBQUMsV0FBVyxDQUFDO0lBRXpDLE1BQU0sRUFBRSxHQUFHLElBQUksWUFBWSxDQUFDLFFBQVEsQ0FBQyxXQUFXLEVBQUUsU0FBUyxDQUFDLENBQUM7SUFDN0QsTUFBTSxRQUFRLEdBQUcsRUFBRSxDQUFDLE1BQU0sQ0FBQztJQUMzQixNQUFNLENBQUMsSUFBSSxFQUFFLElBQUksRUFBRSxJQUFJLEVBQUUsSUFBSSxDQUFDLEdBQUcsRUFBRSxDQUFDLE9BQU8sQ0FBQztJQUM1QyxNQUFNLFFBQVEsR0FBRyxPQUFPLENBQUMsSUFBSSxDQUFDLEdBQUcsQ0FBQyxFQUFFLENBQUMsTUFBTSxDQUFDLENBQUMsTUFBb0IsQ0FBQztJQUNsRSxNQUFNLENBQUMsSUFBSSxFQUFFLElBQUksRUFBRSxJQUFJLEVBQUUsSUFBSSxDQUFDLEdBQUcsU0FBUyxDQUFDO0lBQzNDLE1BQU0sT0FBTyxHQUFHLE9BQU8sQ0FBQyxJQUFJLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxNQUFNLENBQUMsQ0FBQyxNQUFvQixDQUFDO0lBQ2hFLE1BQU0sQ0FBQyxHQUFHLEVBQUUsR0FBRyxFQUFFLEdBQUcsRUFBRSxHQUFHLENBQUMsR0FBRyxRQUFRLENBQUM7SUFFdEMsTUFBTSxRQUFRLEdBQUcsUUFBUSxDQUFDLE9BQU8sQ0FBQyxLQUFLLENBQUM7SUFDeEMsTUFBTSxPQUFPLEdBQUcsUUFBUSxDQUFDLE9BQU8sQ0FBQyxJQUFJLENBQUM7SUFDdEMsTUFBTSxNQUFNLEdBQUcsUUFBUSxDQUFDLE9BQU8sQ0FBQyxHQUFHLENBQUM7SUFFcEMsS0FBSyxJQUFJLEVBQUUsR0FBRyxDQUFDLEVBQUUsRUFBRSxHQUFHLFdBQVcsRUFBRSxFQUFFLEVBQUUsRUFBRTtRQUN2QyxNQUFNLEtBQUssR0FBRyxJQUFJLENBQUMsR0FBRyxDQUFDLENBQUMsRUFBRSxJQUFJLENBQUMsSUFBSSxDQUFDLENBQUMsUUFBUSxHQUFHLEVBQUUsQ0FBQyxHQUFHLFdBQVcsQ0FBQyxDQUFDLENBQUM7UUFDcEUsTUFBTSxLQUFLLEdBQUcsSUFBSSxDQUFDLEdBQUcsQ0FDbEIsUUFBUSxDQUFDLFFBQVEsRUFBRSxDQUFDLFFBQVEsQ0FBQyxPQUFPLEdBQUcsUUFBUSxHQUFHLEVBQUUsQ0FBQyxHQUFHLFdBQVcsQ0FBQyxDQUFDO1FBQ3pFLE1BQU0sUUFBUSxHQUFHLEVBQUUsR0FBRyxJQUFJLENBQUM7UUFFM0IsS0FBSyxJQUFJLEVBQUUsR0FBRyxDQUFDLEVBQUUsRUFBRSxHQUFHLFlBQVksRUFBRSxFQUFFLEVBQUUsRUFBRTtZQUN4QyxNQUFNLEtBQUssR0FBRyxJQUFJLENBQUMsR0FBRyxDQUFDLENBQUMsRUFBRSxJQUFJLENBQUMsSUFBSSxDQUFDLENBQUMsTUFBTSxHQUFHLEVBQUUsQ0FBQyxHQUFHLFlBQVksQ0FBQyxDQUFDLENBQUM7WUFDbkUsTUFBTSxLQUFLLEdBQUcsSUFBSSxDQUFDLEdBQUcsQ0FDbEIsUUFBUSxDQUFDLFNBQVMsRUFBRSxDQUFDLFFBQVEsQ0FBQyxRQUFRLEdBQUcsTUFBTSxHQUFHLEVBQUUsQ0FBQyxHQUFHLFlBQVksQ0FBQyxDQUFDO1lBQzFFLE1BQU0sUUFBUSxHQUFHLEVBQUUsR0FBRyxJQUFJLEdBQUcsUUFBUSxDQUFDO1lBRXRDLEtBQUssSUFBSSxFQUFFLEdBQUcsQ0FBQyxFQUFFLEVBQUUsR0FBRyxXQUFXLEVBQUUsRUFBRSxFQUFFLEVBQUU7Z0JBQ3ZDLE1BQU0sS0FBSyxHQUFHLElBQUksQ0FBQyxHQUFHLENBQUMsQ0FBQyxFQUFFLElBQUksQ0FBQyxJQUFJLENBQUMsQ0FBQyxPQUFPLEdBQUcsRUFBRSxDQUFDLEdBQUcsV0FBVyxDQUFDLENBQUMsQ0FBQztnQkFDbkUsTUFBTSxLQUFLLEdBQUcsSUFBSSxDQUFDLEdBQUcsQ0FDbEIsUUFBUSxDQUFDLFFBQVEsRUFBRSxDQUFDLFFBQVEsQ0FBQyxPQUFPLEdBQUcsT0FBTyxHQUFHLEVBQUUsQ0FBQyxHQUFHLFdBQVcsQ0FBQyxDQUFDO2dCQUN4RSxNQUFNLFFBQVEsR0FBRyxFQUFFLEdBQUcsSUFBSSxHQUFHLFFBQVEsQ0FBQztnQkFFdEMsS0FBSyxJQUFJLEVBQUUsR0FBRyxDQUFDLEVBQUUsRUFBRSxHQUFHLFFBQVEsQ0FBQyxVQUFVLEVBQUUsRUFBRSxFQUFFLEVBQUU7b0JBQy9DLE1BQU0sUUFBUSxHQUFHLEVBQUUsR0FBRyxJQUFJLEdBQUcsUUFBUSxDQUFDO29CQUV0QyxLQUFLLElBQUksRUFBRSxHQUFHLENBQUMsRUFBRSxFQUFFLEdBQUcsUUFBUSxDQUFDLFdBQVcsRUFBRSxFQUFFLEVBQUUsRUFBRTt3QkFDaEQsSUFBSSxPQUFPLEdBQUcsQ0FBQyxDQUFDO3dCQUNoQixLQUFLLElBQUksQ0FBQyxHQUFHLENBQUMsRUFBRSxDQUFDLEdBQUcsUUFBUSxDQUFDLFNBQVMsRUFBRSxFQUFFLENBQUMsRUFBRTs0QkFDM0MsTUFBTSxRQUFRLEdBQUcsQ0FBQyxHQUFHLEdBQUcsQ0FBQzs0QkFDekIsTUFBTSxRQUFRLEdBQUcsQ0FBQyxHQUFHLElBQUksQ0FBQzs0QkFFMUIsS0FBSyxJQUFJLEVBQUUsR0FBRyxLQUFLLEVBQUUsRUFBRSxHQUFHLEtBQUssRUFBRSxFQUFFLEVBQUUsRUFBRTtnQ0FDckMsTUFBTSxFQUFFLEdBQUcsRUFBRSxHQUFHLEVBQUUsR0FBRyxXQUFXLEdBQUcsUUFBUSxDQUFDO2dDQUM1QyxNQUFNLFFBQVEsR0FBRyxFQUFFLEdBQUcsR0FBRyxHQUFHLFFBQVEsQ0FBQztnQ0FDckMsTUFBTSxRQUFRLEdBQUcsRUFBRSxHQUFHLElBQUksR0FBRyxRQUFRLENBQUM7Z0NBRXRDLEtBQUssSUFBSSxFQUFFLEdBQUcsS0FBSyxFQUFFLEVBQUUsR0FBRyxLQUFLLEVBQUUsRUFBRSxFQUFFLEVBQUU7b0NBQ3JDLE1BQU0sRUFBRSxHQUFHLEVBQUUsR0FBRyxFQUFFLEdBQUcsWUFBWSxHQUFHLE1BQU0sQ0FBQztvQ0FDM0MsTUFBTSxRQUFRLEdBQUcsRUFBRSxHQUFHLEdBQUcsR0FBRyxRQUFRLENBQUM7b0NBQ3JDLE1BQU0sUUFBUSxHQUFHLEVBQUUsR0FBRyxJQUFJLEdBQUcsUUFBUSxDQUFDO29DQUV0QyxLQUFLLElBQUksRUFBRSxHQUFHLEtBQUssRUFBRSxFQUFFLEdBQUcsS0FBSyxFQUFFLEVBQUUsRUFBRSxFQUFFO3dDQUNyQyxNQUFNLEVBQUUsR0FBRyxFQUFFLEdBQUcsRUFBRSxHQUFHLFdBQVcsR0FBRyxPQUFPLENBQUM7d0NBQzNDLE1BQU0sUUFBUSxHQUFHLEVBQUUsR0FBRyxHQUFHLEdBQUcsUUFBUSxDQUFDO3dDQUNyQyxNQUFNLFFBQVEsR0FBRyxFQUFFLEdBQUcsSUFBSSxHQUFHLFFBQVEsQ0FBQzt3Q0FFdEMsT0FBTyxJQUFJLE9BQU8sQ0FBQyxRQUFRLEdBQUcsRUFBRSxDQUFDLEdBQUcsUUFBUSxDQUFDLFFBQVEsR0FBRyxFQUFFLENBQUMsQ0FBQztxQ0FDN0Q7aUNBQ0Y7NkJBQ0Y7eUJBQ0Y7d0JBQ0QsUUFBUSxDQUFDLFFBQVEsR0FBRyxFQUFFLENBQUMsR0FBRyxPQUFPLENBQUM7cUJBQ25DO2lCQUNGO2FBQ0Y7U0FDRjtLQUNGO0lBRUQsT0FBTyxPQUFPLENBQUMsY0FBYyxDQUFDLEVBQUUsQ0FBQyxLQUFLLEVBQUUsRUFBRSxDQUFDLEtBQUssRUFBRSxFQUFFLENBQUMsTUFBTSxDQUFDLENBQUM7QUFDL0QsQ0FBQztBQUVELE1BQU0sQ0FBQyxNQUFNLDRCQUE0QixHQUFpQjtJQUN4RCxVQUFVLEVBQUUsc0JBQXNCO0lBQ2xDLFdBQVcsRUFBRSxLQUFLO0lBQ2xCLFVBQVUsRUFBRSxzQkFBMEM7Q0FDdkQsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbIi8qKlxuICogQGxpY2Vuc2VcbiAqIENvcHlyaWdodCAyMDIwIEdvb2dsZSBMTEMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuXG4gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgXCJMaWNlbnNlXCIpO1xuICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLlxuICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0XG4gKlxuICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wXG4gKlxuICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZVxuICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gXCJBUyBJU1wiIEJBU0lTLFxuICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuXG4gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kXG4gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS5cbiAqID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4gKi9cblxuaW1wb3J0IHtiYWNrZW5kX3V0aWwsIENvbnYzREJhY2twcm9wRmlsdGVyVjIsIENvbnYzREJhY2twcm9wRmlsdGVyVjJBdHRycywgQ29udjNEQmFja3Byb3BGaWx0ZXJWMklucHV0cywgS2VybmVsQ29uZmlnLCBLZXJuZWxGdW5jLCBUZW5zb3JCdWZmZXIsIFRlbnNvckluZm8sIFR5cGVkQXJyYXksIHV0aWx9IGZyb20gJ0B0ZW5zb3JmbG93L3RmanMtY29yZSc7XG5cbmltcG9ydCB7TWF0aEJhY2tlbmRDUFV9IGZyb20gJy4uL2JhY2tlbmRfY3B1JztcbmltcG9ydCB7YXNzZXJ0Tm90Q29tcGxleH0gZnJvbSAnLi4vY3B1X3V0aWwnO1xuXG5leHBvcnQgZnVuY3Rpb24gY29udjNEQmFja3Byb3BGaWx0ZXJWMihhcmdzOiB7XG4gIGlucHV0czogQ29udjNEQmFja3Byb3BGaWx0ZXJWMklucHV0cyxcbiAgYmFja2VuZDogTWF0aEJhY2tlbmRDUFUsXG4gIGF0dHJzOiBDb252M0RCYWNrcHJvcEZpbHRlclYyQXR0cnNcbn0pOiBUZW5zb3JJbmZvIHtcbiAgY29uc3Qge2lucHV0cywgYmFja2VuZCwgYXR0cnN9ID0gYXJncztcbiAgY29uc3Qge3gsIGR5fSA9IGlucHV0cztcbiAgY29uc3Qge3N0cmlkZXMsIHBhZCwgZmlsdGVyU2hhcGV9ID0gYXR0cnM7XG5cbiAgYXNzZXJ0Tm90Q29tcGxleChbeCwgZHldLCAnY29udjNkQmFja3Byb3BGaWx0ZXJWMicpO1xuXG4gIGNvbnN0IHhTdHJpZGVzID0gdXRpbC5jb21wdXRlU3RyaWRlcyh4LnNoYXBlKTtcbiAgY29uc3QgZHlTdHJpZGVzID0gdXRpbC5jb21wdXRlU3RyaWRlcyhkeS5zaGFwZSk7XG5cbiAgY29uc3QgY29udkluZm8gPSBiYWNrZW5kX3V0aWwuY29tcHV0ZUNvbnYzREluZm8oXG4gICAgICB4LnNoYXBlIGFzIFtudW1iZXIsIG51bWJlciwgbnVtYmVyLCBudW1iZXIsIG51bWJlcl0sIGZpbHRlclNoYXBlLCBzdHJpZGVzLFxuICAgICAgMSAvKiBkaWxhdGlvbnMgKi8sIHBhZCk7XG5cbiAgY29uc3Qgc3RyaWRlRGVwdGggPSBjb252SW5mby5zdHJpZGVEZXB0aDtcbiAgY29uc3Qgc3RyaWRlSGVpZ2h0ID0gY29udkluZm8uc3RyaWRlSGVpZ2h0O1xuICBjb25zdCBzdHJpZGVXaWR0aCA9IGNvbnZJbmZvLnN0cmlkZVdpZHRoO1xuICBjb25zdCBmaWx0ZXJEZXB0aCA9IGNvbnZJbmZvLmZpbHRlckRlcHRoO1xuICBjb25zdCBmaWx0ZXJIZWlnaHQgPSBjb252SW5mby5maWx0ZXJIZWlnaHQ7XG4gIGNvbnN0IGZpbHRlcldpZHRoID0gY29udkluZm8uZmlsdGVyV2lkdGg7XG5cbiAgY29uc3QgZHcgPSBuZXcgVGVuc29yQnVmZmVyKGNvbnZJbmZvLmZpbHRlclNoYXBlLCAnZmxvYXQzMicpO1xuICBjb25zdCBkd1ZhbHVlcyA9IGR3LnZhbHVlcztcbiAgY29uc3QgW2R3UzAsIGR3UzEsIGR3UzIsIGR3UzNdID0gZHcuc3RyaWRlcztcbiAgY29uc3QgZHlWYWx1ZXMgPSBiYWNrZW5kLmRhdGEuZ2V0KGR5LmRhdGFJZCkudmFsdWVzIGFzIFR5cGVkQXJyYXk7XG4gIGNvbnN0IFtkeVMwLCBkeVMxLCBkeVMyLCBkeVMzXSA9IGR5U3RyaWRlcztcbiAgY29uc3QgeFZhbHVlcyA9IGJhY2tlbmQuZGF0YS5nZXQoeC5kYXRhSWQpLnZhbHVlcyBhcyBUeXBlZEFycmF5O1xuICBjb25zdCBbeFMwLCB4UzEsIHhTMiwgeFMzXSA9IHhTdHJpZGVzO1xuXG4gIGNvbnN0IGZyb250UGFkID0gY29udkluZm8ucGFkSW5mby5mcm9udDtcbiAgY29uc3QgbGVmdFBhZCA9IGNvbnZJbmZvLnBhZEluZm8ubGVmdDtcbiAgY29uc3QgdG9wUGFkID0gY29udkluZm8ucGFkSW5mby50b3A7XG5cbiAgZm9yIChsZXQgd0YgPSAwOyB3RiA8IGZpbHRlckRlcHRoOyArK3dGKSB7XG4gICAgY29uc3QgeUZNaW4gPSBNYXRoLm1heCgwLCBNYXRoLmNlaWwoKGZyb250UGFkIC0gd0YpIC8gc3RyaWRlRGVwdGgpKTtcbiAgICBjb25zdCB5Rk1heCA9IE1hdGgubWluKFxuICAgICAgICBjb252SW5mby5vdXREZXB0aCwgKGNvbnZJbmZvLmluRGVwdGggKyBmcm9udFBhZCAtIHdGKSAvIHN0cmlkZURlcHRoKTtcbiAgICBjb25zdCB3T2Zmc2V0MSA9IHdGICogZHdTMDtcblxuICAgIGZvciAobGV0IHdSID0gMDsgd1IgPCBmaWx0ZXJIZWlnaHQ7ICsrd1IpIHtcbiAgICAgIGNvbnN0IHlSTWluID0gTWF0aC5tYXgoMCwgTWF0aC5jZWlsKCh0b3BQYWQgLSB3UikgLyBzdHJpZGVIZWlnaHQpKTtcbiAgICAgIGNvbnN0IHlSTWF4ID0gTWF0aC5taW4oXG4gICAgICAgICAgY29udkluZm8ub3V0SGVpZ2h0LCAoY29udkluZm8uaW5IZWlnaHQgKyB0b3BQYWQgLSB3UikgLyBzdHJpZGVIZWlnaHQpO1xuICAgICAgY29uc3Qgd09mZnNldDIgPSB3UiAqIGR3UzEgKyB3T2Zmc2V0MTtcblxuICAgICAgZm9yIChsZXQgd0MgPSAwOyB3QyA8IGZpbHRlcldpZHRoOyArK3dDKSB7XG4gICAgICAgIGNvbnN0IHlDTWluID0gTWF0aC5tYXgoMCwgTWF0aC5jZWlsKChsZWZ0UGFkIC0gd0MpIC8gc3RyaWRlV2lkdGgpKTtcbiAgICAgICAgY29uc3QgeUNNYXggPSBNYXRoLm1pbihcbiAgICAgICAgICAgIGNvbnZJbmZvLm91dFdpZHRoLCAoY29udkluZm8uaW5XaWR0aCArIGxlZnRQYWQgLSB3QykgLyBzdHJpZGVXaWR0aCk7XG4gICAgICAgIGNvbnN0IHdPZmZzZXQzID0gd0MgKiBkd1MyICsgd09mZnNldDI7XG5cbiAgICAgICAgZm9yIChsZXQgZDEgPSAwOyBkMSA8IGNvbnZJbmZvLmluQ2hhbm5lbHM7ICsrZDEpIHtcbiAgICAgICAgICBjb25zdCB3T2Zmc2V0NCA9IGQxICogZHdTMyArIHdPZmZzZXQzO1xuXG4gICAgICAgICAgZm9yIChsZXQgZDIgPSAwOyBkMiA8IGNvbnZJbmZvLm91dENoYW5uZWxzOyArK2QyKSB7XG4gICAgICAgICAgICBsZXQgZG90UHJvZCA9IDA7XG4gICAgICAgICAgICBmb3IgKGxldCBiID0gMDsgYiA8IGNvbnZJbmZvLmJhdGNoU2l6ZTsgKytiKSB7XG4gICAgICAgICAgICAgIGNvbnN0IHhPZmZzZXQxID0gYiAqIHhTMDtcbiAgICAgICAgICAgICAgY29uc3QgeU9mZnNldDEgPSBiICogZHlTMDtcblxuICAgICAgICAgICAgICBmb3IgKGxldCB5RiA9IHlGTWluOyB5RiA8IHlGTWF4OyArK3lGKSB7XG4gICAgICAgICAgICAgICAgY29uc3QgeEYgPSB3RiArIHlGICogc3RyaWRlRGVwdGggLSBmcm9udFBhZDtcbiAgICAgICAgICAgICAgICBjb25zdCB4T2Zmc2V0MiA9IHhGICogeFMxICsgeE9mZnNldDE7XG4gICAgICAgICAgICAgICAgY29uc3QgeU9mZnNldDIgPSB5RiAqIGR5UzEgKyB5T2Zmc2V0MTtcblxuICAgICAgICAgICAgICAgIGZvciAobGV0IHlSID0geVJNaW47IHlSIDwgeVJNYXg7ICsreVIpIHtcbiAgICAgICAgICAgICAgICAgIGNvbnN0IHhSID0gd1IgKyB5UiAqIHN0cmlkZUhlaWdodCAtIHRvcFBhZDtcbiAgICAgICAgICAgICAgICAgIGNvbnN0IHhPZmZzZXQzID0geFIgKiB4UzIgKyB4T2Zmc2V0MjtcbiAgICAgICAgICAgICAgICAgIGNvbnN0IHlPZmZzZXQzID0geVIgKiBkeVMyICsgeU9mZnNldDI7XG5cbiAgICAgICAgICAgICAgICAgIGZvciAobGV0IHlDID0geUNNaW47IHlDIDwgeUNNYXg7ICsreUMpIHtcbiAgICAgICAgICAgICAgICAgICAgY29uc3QgeEMgPSB3QyArIHlDICogc3RyaWRlV2lkdGggLSBsZWZ0UGFkO1xuICAgICAgICAgICAgICAgICAgICBjb25zdCB4T2Zmc2V0NCA9IHhDICogeFMzICsgeE9mZnNldDM7XG4gICAgICAgICAgICAgICAgICAgIGNvbnN0IHlPZmZzZXQ0ID0geUMgKiBkeVMzICsgeU9mZnNldDM7XG5cbiAgICAgICAgICAgICAgICAgICAgZG90UHJvZCArPSB4VmFsdWVzW3hPZmZzZXQ0ICsgZDFdICogZHlWYWx1ZXNbeU9mZnNldDQgKyBkMl07XG4gICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBkd1ZhbHVlc1t3T2Zmc2V0NCArIGQyXSA9IGRvdFByb2Q7XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICB9XG4gICAgfVxuICB9XG5cbiAgcmV0dXJuIGJhY2tlbmQubWFrZVRlbnNvckluZm8oZHcuc2hhcGUsIGR3LmR0eXBlLCBkdy52YWx1ZXMpO1xufVxuXG5leHBvcnQgY29uc3QgY29udjNEQmFja3Byb3BGaWx0ZXJWMkNvbmZpZzogS2VybmVsQ29uZmlnID0ge1xuICBrZXJuZWxOYW1lOiBDb252M0RCYWNrcHJvcEZpbHRlclYyLFxuICBiYWNrZW5kTmFtZTogJ2NwdScsXG4gIGtlcm5lbEZ1bmM6IGNvbnYzREJhY2twcm9wRmlsdGVyVjIgYXMge30gYXMgS2VybmVsRnVuY1xufTtcbiJdfQ==","/**\n * @license\n * Copyright 2020 Google LLC. All Rights Reserved.\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n * =============================================================================\n */\nimport { backend_util, Conv3DBackpropInputV2, TensorBuffer, util } from '@tensorflow/tfjs-core';\nimport { assertNotComplex } from '../cpu_util';\nexport function conv3DBackpropInputV2(args) {\n const { inputs, backend, attrs } = args;\n const { dy, filter } = inputs;\n const { pad, strides, inputShape } = attrs;\n assertNotComplex([dy], 'conv3dBackpropInputV2');\n const dyStrides = util.computeStrides(dy.shape);\n const filterStrides = util.computeStrides(filter.shape);\n const convInfo = backend_util.computeConv3DInfo(inputShape, filter.shape, strides, 1 /* dilations */, pad);\n const dx = new TensorBuffer(convInfo.inShape, 'float32');\n const dxValues = dx.values;\n const [dxS0, dxS1, dxS2, dxS3] = dx.strides;\n const dyValues = backend.data.get(dy.dataId).values;\n const [dyS0, dyS1, dyS2, dyS3] = dyStrides;\n const fltValues = backend.data.get(filter.dataId).values;\n const [fltS0, fltS1, fltS2, fltS3] = filterStrides;\n const { batchSize, filterDepth, filterHeight, filterWidth, inChannels, inDepth, inHeight, inWidth, outChannels, outDepth, outHeight, outWidth, strideDepth, strideHeight, strideWidth } = convInfo;\n const frontPad = filterDepth - 1 - convInfo.padInfo.front;\n const topPad = filterHeight - 1 - convInfo.padInfo.top;\n const leftPad = filterWidth - 1 - convInfo.padInfo.left;\n for (let b = 0; b < batchSize; ++b) {\n for (let d1 = 0; d1 < inChannels; ++d1) {\n // Frames of depth\n for (let xF = 0; xF < inDepth; ++xF) {\n const xFCorner = xF - frontPad;\n const xFMin = Math.max(0, Math.ceil(xFCorner / strideDepth));\n const yFMax = Math.min(outDepth, (filterDepth + xFCorner) / strideDepth);\n // Rows as per standard 2d matrix notation\n for (let xR = 0; xR < inHeight; ++xR) {\n const xRCorner = xR - topPad;\n const xRMin = Math.max(0, Math.ceil(xRCorner / strideHeight));\n const yRMax = Math.min(outHeight, (filterHeight + xRCorner) / strideHeight);\n // Columns as per standard 2d matrix notation\n for (let xC = 0; xC < inWidth; ++xC) {\n const xCCorner = xC - leftPad;\n const xCMin = Math.max(0, Math.ceil(xCCorner / strideWidth));\n const yCMax = Math.min(outWidth, (filterWidth + xCCorner) / strideWidth);\n let dotProd = 0;\n for (let yF = xFMin; yF < yFMax; ++yF) {\n const wF = yF * strideDepth - xFCorner;\n for (let yR = xRMin; yR < yRMax; ++yR) {\n const wR = yR * strideHeight - xRCorner;\n for (let yC = xCMin; yC < yCMax; ++yC) {\n const wC = yC * strideWidth - xCCorner;\n const dyOffset = dyS0 * b + dyS1 * yF + dyS2 * yR + dyS3 * yC;\n const fltOffset = fltS0 * (filterDepth - 1 - wF) +\n fltS1 * (filterHeight - 1 - wR) +\n fltS2 * (filterWidth - 1 - wC) + fltS3 * d1;\n for (let d2 = 0; d2 < outChannels; ++d2) {\n const pixel = dyValues[dyOffset + d2];\n const weight = fltValues[fltOffset + d2];\n dotProd += pixel * weight;\n }\n }\n }\n }\n dxValues[dxS0 * b + dxS1 * xF + dxS2 * xR + dxS3 * xC + d1] =\n dotProd;\n }\n }\n }\n }\n }\n return backend.makeTensorInfo(dx.shape, dx.dtype, dx.values);\n}\nexport const conv3DBackpropInputV2Config = {\n kernelName: Conv3DBackpropInputV2,\n backendName: 'cpu',\n kernelFunc: conv3DBackpropInputV2\n};\n//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiQ29udjNEQmFja3Byb3BJbnB1dFYyLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vLi4vdGZqcy1iYWNrZW5kLWNwdS9zcmMva2VybmVscy9Db252M0RCYWNrcHJvcElucHV0VjIudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUE7Ozs7Ozs7Ozs7Ozs7OztHQWVHO0FBRUgsT0FBTyxFQUFDLFlBQVksRUFBRSxxQkFBcUIsRUFBcUYsWUFBWSxFQUEwQixJQUFJLEVBQUMsTUFBTSx1QkFBdUIsQ0FBQztBQUd6TSxPQUFPLEVBQUMsZ0JBQWdCLEVBQUMsTUFBTSxhQUFhLENBQUM7QUFFN0MsTUFBTSxVQUFVLHFCQUFxQixDQUFDLElBSXJDO0lBQ0MsTUFBTSxFQUFDLE1BQU0sRUFBRSxPQUFPLEVBQUUsS0FBSyxFQUFDLEdBQUcsSUFBSSxDQUFDO0lBQ3RDLE1BQU0sRUFBQyxFQUFFLEVBQUUsTUFBTSxFQUFDLEdBQUcsTUFBTSxDQUFDO0lBQzVCLE1BQU0sRUFBQyxHQUFHLEVBQUUsT0FBTyxFQUFFLFVBQVUsRUFBQyxHQUFHLEtBQUssQ0FBQztJQUV6QyxnQkFBZ0IsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxFQUFFLHVCQUF1QixDQUFDLENBQUM7SUFFaEQsTUFBTSxTQUFTLEdBQUcsSUFBSSxDQUFDLGNBQWMsQ0FBQyxFQUFFLENBQUMsS0FBSyxDQUFDLENBQUM7SUFDaEQsTUFBTSxhQUFhLEdBQUcsSUFBSSxDQUFDLGNBQWMsQ0FBQyxNQUFNLENBQUMsS0FBSyxDQUFDLENBQUM7SUFFeEQsTUFBTSxRQUFRLEdBQUcsWUFBWSxDQUFDLGlCQUFpQixDQUMzQyxVQUFVLEVBQUUsTUFBTSxDQUFDLEtBQWlELEVBQ3BFLE9BQU8sRUFBRSxDQUFDLENBQUMsZUFBZSxFQUFFLEdBQUcsQ0FBQyxDQUFDO0lBRXJDLE1BQU0sRUFBRSxHQUFHLElBQUksWUFBWSxDQUFDLFFBQVEsQ0FBQyxPQUFPLEVBQUUsU0FBUyxDQUFDLENBQUM7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LFdBQVcsRUFBRSxFQUFFLEVBQUUsRUFBRTt3Q0FDdkMsTUFBTSxLQUFLLEdBQUcsUUFBUSxDQUFDLFFBQVEsR0FBRyxFQUFFLENBQUMsQ0FBQzt3Q0FDdEMsTUFBTSxNQUFNLEdBQUcsU0FBUyxDQUFDLFNBQVMsR0FBRyxFQUFFLENBQUMsQ0FBQzt3Q0FDekMsT0FBTyxJQUFJLEtBQUssR0FBRyxNQUFNLENBQUM7cUNBQzNCO2lDQUNGOzZCQUNGO3lCQUNGO3dCQUNELFFBQVEsQ0FBQyxJQUFJLEdBQUcsQ0FBQyxHQUFHLElBQUksR0FBRyxFQUFFLEdBQUcsSUFBSSxHQUFHLEVBQUUsR0FBRyxJQUFJLEdBQUcsRUFBRSxHQUFHLEVBQUUsQ0FBQzs0QkFDdkQsT0FBTyxDQUFDO3FCQUNiO2lCQUNGO2FBQ0Y7U0FDRjtLQUNGO0lBRUQsT0FBTyxPQUFPLENBQUMsY0FBYyxDQUFDLEVBQUUsQ0FBQyxLQUFLLEVBQUUsRUFBRSxDQUFDLEtBQUssRUFBRSxFQUFFLENBQUMsTUFBTSxDQUFDLENBQUM7QUFDL0QsQ0FBQztBQUVELE1BQU0sQ0FBQyxNQUFNLDJCQUEyQixHQUFpQjtJQUN2RCxVQUFVLEVBQUUscUJBQXFCO0lBQ2pDLFdBQVcsRUFBRSxLQUFLO0lBQ2xCLFVBQVUsRUFBRSxxQkFBeUM7Q0FDdEQsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbIi8qKlxuICogQGxpY2Vuc2VcbiAqIENvcHlyaWdodCAyMDIwIEdvb2dsZSBMTEMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuXG4gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgXCJMaWNlbnNlXCIpO1xuICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLlxuICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0XG4gKlxuICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wXG4gKlxuICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZVxuICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gXCJBUyBJU1wiIEJBU0lTLFxuICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuXG4gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kXG4gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS5cbiAqID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4gKi9cblxuaW1wb3J0IHtiYWNrZW5kX3V0aWwsIENvbnYzREJhY2twcm9wSW5wdXRWMiwgQ29udjNEQmFja3Byb3BJbnB1dFYyQXR0cnMsIENvbnYzREJhY2twcm9wSW5wdXRWMklucHV0cywgS2VybmVsQ29uZmlnLCBLZXJuZWxGdW5jLCBUZW5zb3JCdWZmZXIsIFRlbnNvckluZm8sIFR5cGVkQXJyYXksIHV0aWx9IGZyb20gJ0B0ZW5zb3JmbG93L3RmanMtY29yZSc7XG5cbmltcG9ydCB7TWF0aEJhY2tlbmRDUFV9IGZyb20gJy4uL2JhY2tlbmRfY3B1JztcbmltcG9ydCB7YXNzZXJ0Tm90Q29tcGxleH0gZnJvbSAnLi4vY3B1X3V0aWwnO1xuXG5leHBvcnQgZnVuY3Rpb24gY29udjNEQmFja3Byb3BJbnB1dFYyKGFyZ3M6IHtcbiAgaW5wdXRzOiBDb252M0RCYWNrcHJvcElucHV0VjJJbnB1dHMsXG4gIGJhY2tlbmQ6IE1hdGhCYWNrZW5kQ1BVLFxuICBhdHRyczogQ29udjNEQmFja3Byb3BJbnB1dFYyQXR0cnNcbn0pOiBUZW5zb3JJbmZvIHtcbiAgY29uc3Qge2lucHV0cywgYmFja2VuZCwgYXR0cnN9ID0gYXJncztcbiAgY29uc3Qge2R5LCBmaWx0ZXJ9ID0gaW5wdXRzO1xuICBjb25zdCB7cGFkLCBzdHJpZGVzLCBpbnB1dFNoYXBlfSA9IGF0dHJzO1xuXG4gIGFzc2VydE5vdENvbXBsZXgoW2R5XSwgJ2NvbnYzZEJhY2twcm9wSW5wdXRWMicpO1xuXG4gIGNvbnN0IGR5U3RyaWRlcyA9IHV0aWwuY29tcHV0ZVN0cmlkZXMoZHkuc2hhcGUpO1xuICBjb25zdCBmaWx0ZXJTdHJpZGVzID0gdXRpbC5jb21wdXRlU3RyaWRlcyhmaWx0ZXIuc2hhcGUpO1xuXG4gIGNvbnN0IGNvbnZJbmZvID0gYmFja2VuZF91dGlsLmNvbXB1dGVDb252M0RJbmZvKFxuICAgICAgaW5wdXRTaGFwZSwgZmlsdGVyLnNoYXBlIGFzIFtudW1iZXIsIG51bWJlciwgbnVtYmVyLCBudW1iZXIsIG51bWJlcl0sXG4gICAgICBzdHJpZGVzLCAxIC8qIGRpbGF0aW9ucyAqLywgcGFkKTtcblxuICBjb25zdCBkeCA9IG5ldyBUZW5zb3JCdWZmZXIoY29udkluZm8uaW5TaGFwZSwgJ2Zsb2F0MzInKTtcbiAgY29uc3QgZHhWYWx1ZXMgPSBkeC52YWx1ZXM7XG4gIGNvbnN0IFtkeFMwLCBkeFMxLCBkeFMyLCBkeFMzXSA9IGR4LnN0cmlkZXM7XG4gIGNvbnN0IGR5VmFsdWVzID0gYmFja2VuZC5kYXRhLmdldChkeS5kYXRhSWQpLnZhbHVlcyBhcyBUeXBlZEFycmF5O1xuICBjb25zdCBbZHlTMCwgZHlTMSwgZHlTMiwgZHlTM10gPSBkeVN0cmlkZXM7XG4gIGNvbnN0IGZsdFZhbHVlcyA9IGJhY2tlbmQuZGF0YS5nZXQoZmlsdGVyLmRhdGFJZCkudmFsdWVzIGFzIFR5cGVkQXJyYXk7XG4gIGNvbnN0IFtmbHRTMCwgZmx0UzEsIGZsdFMyLCBmbHRTM10gPSBmaWx0ZXJTdHJpZGVzO1xuICBjb25zdCB7XG4gICAgYmF0Y2hTaXplLFxuICAgIGZpbHRlckRlcHRoLFxuICAgIGZpbHRlckhlaWdodCxcbiAgICBmaWx0ZXJXaWR0aCxcbiAgICBpbkNoYW5uZWxzLFxuICAgIGluRGVwdGgsXG4gICAgaW5IZWlnaHQsXG4gICAgaW5XaWR0aCxcbiAgICBvdXRDaGFubmVscyxcbiAgICBvdXREZXB0aCxcbiAgICBvdXRIZWlnaHQsXG4gICAgb3V0V2lkdGgsXG4gICAgc3RyaWRlRGVwdGgsXG4gICAgc3RyaWRlSGVpZ2h0LFxuICAgIHN0cmlkZVdpZHRoXG4gIH0gPSBjb252SW5mbztcbiAgY29uc3QgZnJvbnRQYWQgPSBmaWx0ZXJEZXB0aCAtIDEgLSBjb252SW5mby5wYWRJbmZvLmZyb250O1xuICBjb25zdCB0b3BQYWQgPSBmaWx0ZXJIZWlnaHQgLSAxIC0gY29udkluZm8ucGFkSW5mby50b3A7XG4gIGNvbnN0IGxlZnRQYWQgPSBmaWx0ZXJXaWR0aCAtIDEgLSBjb252SW5mby5wYWRJbmZvLmxlZnQ7XG5cbiAgZm9yIChsZXQgYiA9IDA7IGIgPCBiYXRjaFNpemU7ICsrYikge1xuICAgIGZvciAobGV0IGQxID0gMDsgZDEgPCBpbkNoYW5uZWxzOyArK2QxKSB7XG4gICAgICAvLyBGcmFtZXMgb2YgZGVwdGhcbiAgICAgIGZvciAobGV0IHhGID0gMDsgeEYgPCBpbkRlcHRoOyArK3hGKSB7XG4gICAgICAgIGNvbnN0IHhGQ29ybmVyID0geEYgLSBmcm9udFBhZDtcbiAgICAgICAgY29uc3QgeEZNaW4gPSBNYXRoLm1heCgwLCBNYXRoLmNlaWwoeEZDb3JuZXIgLyBzdHJpZGVEZXB0aCkpO1xuICAgICAgICBjb25zdCB5Rk1heCA9XG4gICAgICAgICAgICBNYXRoLm1pbihvdXREZXB0aCwgKGZpbHRlckRlcHRoICsgeEZDb3JuZXIpIC8gc3RyaWRlRGVwdGgpO1xuXG4gICAgICAgIC8vIFJvd3MgYXMgcGVyIHN0YW5kYXJkIDJkIG1hdHJpeCBub3RhdGlvblxuICAgICAgICBmb3IgKGxldCB4UiA9IDA7IHhSIDwgaW5IZWlnaHQ7ICsreFIpIHtcbiAgICAgICAgICBjb25zdCB4UkNvcm5lciA9IHhSIC0gdG9wUGFkO1xuICAgICAgICAgIGNvbnN0IHhSTWluID0gTWF0aC5tYXgoMCwgTWF0aC5jZWlsKHhSQ29ybmVyIC8gc3RyaWRlSGVpZ2h0KSk7XG4gICAgICAgICAgY29uc3QgeVJNYXggPVxuICAgICAgICAgICAgICBNYXRoLm1pbihvdXRIZWlnaHQsIChmaWx0ZXJIZWlnaHQgKyB4UkNvcm5lcikgLyBzdHJpZGVIZWlnaHQpO1xuICAgICAgICAgIC8vIENvbHVtbnMgYXMgcGVyIHN0YW5kYXJkIDJkIG1hdHJpeCBub3RhdGlvblxuICAgICAgICAgIGZvciAobGV0IHhDID0gMDsgeEMgPCBpbldpZHRoOyArK3hDKSB7XG4gICAgICAgICAgICBjb25zdCB4Q0Nvcm5lciA9IHhDIC0gbGVmdFBhZDtcbiAgICAgICAgICAgIGNvbnN0IHhDTWluID0gTWF0aC5tYXgoMCwgTWF0aC5jZWlsKHhDQ29ybmVyIC8gc3RyaWRlV2lkdGgpKTtcbiAgICAgICAgICAgIGNvbnN0IHlDTWF4ID1cbiAgICAgICAgICAgICAgICBNYXRoLm1pbihvdXRXaWR0aCwgKGZpbHRlcldpZHRoICsgeENDb3JuZXIpIC8gc3RyaWRlV2lkdGgpO1xuXG4gICAgICAgICAgICBsZXQgZG90UHJvZCA9IDA7XG4gICAgICAgICAgICBmb3IgKGxldCB5RiA9IHhGTWluOyB5RiA8IHlGTWF4OyArK3lGKSB7XG4gICAgICAgICAgICAgIGNvbnN0IHdGID0geUYgKiBzdHJpZGVEZXB0aCAtIHhGQ29ybmVyO1xuXG4gICAgICAgICAgICAgIGZvciAobGV0IHlSID0geFJNaW47IHlSIDwgeVJNYXg7ICsreVIpIHtcbiAgICAgICAgICAgICAgICBjb25zdCB3UiA9IHlSICogc3RyaWRlSGVpZ2h0IC0geFJDb3JuZXI7XG5cbiAgICAgICAgICAgICAgICBmb3IgKGxldCB5QyA9IHhDTWluOyB5QyA8IHlDTWF4OyArK3lDKSB7XG4gICAgICAgICAgICAgICAgICBjb25zdCB3QyA9IHlDICogc3RyaWRlV2lkdGggLSB4Q0Nvcm5lcjtcbiAgICAgICAgICAgICAgICAgIGNvbnN0IGR5T2Zmc2V0ID0gZHlTMCAqIGIgKyBkeVMxICogeUYgKyBkeVMyICogeVIgKyBkeVMzICogeUM7XG4gICAgICAgICAgICAgICAgICBjb25zdCBmbHRPZmZzZXQgPSBmbHRTMCAqIChmaWx0ZXJEZXB0aCAtIDEgLSB3RikgK1xuICAgICAgICAgICAgICAgICAgICAgIGZsdFMxICogKGZpbHRlckhlaWdodCAtIDEgLSB3UikgK1xuICAgICAgICAgICAgICAgICAgICAgIGZsdFMyICogKGZpbHRlcldpZHRoIC0gMSAtIHdDKSArIGZsdFMzICogZDE7XG5cbiAgICAgICAgICAgICAgICAgIGZvciAobGV0IGQyID0gMDsgZDIgPCBvdXRDaGFubmVsczsgKytkMikge1xuICAgICAgICAgICAgICAgICAgICBjb25zdCBwaXhlbCA9IGR5VmFsdWVzW2R5T2Zmc2V0ICsgZDJdO1xuICAgICAgICAgICAgICAgICAgICBjb25zdCB3ZWlnaHQgPSBmbHRWYWx1ZXNbZmx0T2Zmc2V0ICsgZDJdO1xuICAgICAgICAgICAgICAgICAgICBkb3RQcm9kICs9IHBpeGVsICogd2VpZ2h0O1xuICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICAgICAgZHhWYWx1ZXNbZHhTMCAqIGIgKyBkeFMxICogeEYgKyBkeFMyICogeFIgKyBkeFMzICogeEMgKyBkMV0gPVxuICAgICAgICAgICAgICAgIGRvdFByb2Q7XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICB9XG4gICAgfVxuICB9XG5cbiAgcmV0dXJuIGJhY2tlbmQubWFrZVRlbnNvckluZm8oZHguc2hhcGUsIGR4LmR0eXBlLCBkeC52YWx1ZXMpO1xufVxuXG5leHBvcnQgY29uc3QgY29udjNEQmFja3Byb3BJbnB1dFYyQ29uZmlnOiBLZXJuZWxDb25maWcgPSB7XG4gIGtlcm5lbE5hbWU6IENvbnYzREJhY2twcm9wSW5wdXRWMixcbiAgYmFja2VuZE5hbWU6ICdjcHUnLFxuICBrZXJuZWxGdW5jOiBjb252M0RCYWNrcHJvcElucHV0VjIgYXMge30gYXMgS2VybmVsRnVuY1xufTtcbiJdfQ==","/**\n * @license\n * Copyright 2020 Google LLC. All Rights Reserved.\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n * =============================================================================\n */\nimport { Cos } from '@tensorflow/tfjs-core';\nimport { unaryKernelFunc } from '../utils/unary_utils';\nexport const cos = unaryKernelFunc(Cos, (xi) => Math.cos(xi));\nexport const cosConfig = {\n kernelName: Cos,\n backendName: 'cpu',\n kernelFunc: cos,\n};\n//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiQ29zLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vLi4vdGZqcy1iYWNrZW5kLWNwdS9zcmMva2VybmVscy9Db3MudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUE7Ozs7Ozs7Ozs7Ozs7OztHQWVHO0FBRUgsT0FBTyxFQUFDLEdBQUcsRUFBZSxNQUFNLHVCQUF1QixDQUFDO0FBRXhELE9BQU8sRUFBQyxlQUFlLEVBQUMsTUFBTSxzQkFBc0IsQ0FBQztBQUVyRCxNQUFNLENBQUMsTUFBTSxHQUFHLEdBQUcsZUFBZSxDQUFDLEdBQUcsRUFBRSxDQUFDLEVBQUUsRUFBRSxFQUFFLENBQUMsSUFBSSxDQUFDLEdBQUcsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDO0FBRTlELE1BQU0sQ0FBQyxNQUFNLFNBQVMsR0FBaUI7SUFDckMsVUFBVSxFQUFFLEdBQUc7SUFDZixXQUFXLEVBQUUsS0FBSztJQUNsQixVQUFVLEVBQUUsR0FBRztDQUNoQixDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiLyoqXG4gKiBAbGljZW5zZVxuICogQ29weXJpZ2h0IDIwMjAgR29vZ2xlIExMQy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC5cbiAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSBcIkxpY2Vuc2VcIik7XG4gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuXG4gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXRcbiAqXG4gKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjBcbiAqXG4gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlXG4gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiBcIkFTIElTXCIgQkFTSVMsXG4gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC5cbiAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmRcbiAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLlxuICogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbiAqL1xuXG5pbXBvcnQge0NvcywgS2VybmVsQ29uZmlnfSBmcm9tICdAdGVuc29yZmxvdy90ZmpzLWNvcmUnO1xuXG5pbXBvcnQge3VuYXJ5S2VybmVsRnVuY30gZnJvbSAnLi4vdXRpbHMvdW5hcnlfdXRpbHMnO1xuXG5leHBvcnQgY29uc3QgY29zID0gdW5hcnlLZXJuZWxGdW5jKENvcywgKHhpKSA9PiBNYXRoLmNvcyh4aSkpO1xuXG5leHBvcnQgY29uc3QgY29zQ29uZmlnOiBLZXJuZWxDb25maWcgPSB7XG4gIGtlcm5lbE5hbWU6IENvcyxcbiAgYmFja2VuZE5hbWU6ICdjcHUnLFxuICBrZXJuZWxGdW5jOiBjb3MsXG59O1xuIl19","/**\n * @license\n * Copyright 2020 Google LLC. All Rights Reserved.\n * Licensed under the Apache License, Version 2.0 (the License);\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an AS IS BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n * =============================================================================\n */\nimport { Cosh } from '@tensorflow/tfjs-core';\nimport { unaryKernelFunc } from '../utils/unary_utils';\nexport const cosh = unaryKernelFunc(Cosh, (xi) => Math.cosh(xi));\nexport const coshConfig = {\n kernelName: Cosh,\n backendName: 'cpu',\n kernelFunc: cosh,\n};\n//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiQ29zaC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uLy4uL3RmanMtYmFja2VuZC1jcHUvc3JjL2tlcm5lbHMvQ29zaC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQTs7Ozs7Ozs7Ozs7Ozs7O0dBZUc7QUFFSCxPQUFPLEVBQUMsSUFBSSxFQUFlLE1BQU0sdUJBQXVCLENBQUM7QUFFekQsT0FBTyxFQUFDLGVBQWUsRUFBQyxNQUFNLHNCQUFzQixDQUFDO0FBRXJELE1BQU0sQ0FBQyxNQUFNLElBQUksR0FBRyxlQUFlLENBQUMsSUFBSSxFQUFFLENBQUMsRUFBRSxFQUFFLEVBQUUsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUM7QUFFakUsTUFBTSxDQUFDLE1BQU0sVUFBVSxHQUFpQjtJQUN0QyxVQUFVLEVBQUUsSUFBSTtJQUNoQixXQUFXLEVBQUUsS0FBSztJQUNsQixVQUFVLEVBQUUsSUFBSTtDQUNqQixDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiLyoqXG4gKiBAbGljZW5zZVxuICogQ29weXJpZ2h0IDIwMjAgR29vZ2xlIExMQy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC5cbiAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSBMaWNlbnNlKTtcbiAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS5cbiAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdFxuICpcbiAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMFxuICpcbiAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmVcbiAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuIEFTIElTIEJBU0lTLFxuICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuXG4gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kXG4gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS5cbiAqID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4gKi9cblxuaW1wb3J0IHtDb3NoLCBLZXJuZWxDb25maWd9IGZyb20gJ0B0ZW5zb3JmbG93L3RmanMtY29yZSc7XG5cbmltcG9ydCB7dW5hcnlLZXJuZWxGdW5jfSBmcm9tICcuLi91dGlscy91bmFyeV91dGlscyc7XG5cbmV4cG9ydCBjb25zdCBjb3NoID0gdW5hcnlLZXJuZWxGdW5jKENvc2gsICh4aSkgPT4gTWF0aC5jb3NoKHhpKSk7XG5cbmV4cG9ydCBjb25zdCBjb3NoQ29uZmlnOiBLZXJuZWxDb25maWcgPSB7XG4gIGtlcm5lbE5hbWU6IENvc2gsXG4gIGJhY2tlbmROYW1lOiAnY3B1JyxcbiAga2VybmVsRnVuYzogY29zaCxcbn07XG4iXX0=","/**\n * @license\n * Copyright 2020 Google LLC. All Rights Reserved.\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n * =============================================================================\n */\nimport { buffer, CropAndResize, util } from '@tensorflow/tfjs-core';\nexport function cropAndResize(args) {\n const { inputs, backend, attrs } = args;\n const { image, boxes, boxInd } = inputs;\n const { cropSize, method, extrapolationValue } = attrs;\n const [batch, imageHeight, imageWidth, numChannels] = image.shape;\n const numBoxes = boxes.shape[0];\n const [cropHeight, cropWidth] = cropSize;\n const output = buffer([numBoxes, cropHeight, cropWidth, numChannels], 'float32');\n const boxVals = backend.data.get(boxes.dataId).values;\n const boxIndVals = backend.data.get(boxInd.dataId).values;\n const imageVals = backend.data.get(image.dataId).values;\n const inStride = util.computeStrides(image.shape); // to calculate flat indexes into image\n const outStride = util.computeStrides(output.shape); // to calculate flat indexes into output\n // Reference implementation\n // tslint:disable-next-line:max-line-length\n // https://github.com/tensorflow/tensorflow/blob/master/tensorflow/core/kernels/crop_and_resize_op.cc\n for (let b = 0; b < numBoxes; b++) {\n const startInd = b * 4;\n const y1 = boxVals[startInd];\n const x1 = boxVals[startInd + 1];\n const y2 = boxVals[startInd + 2];\n const x2 = boxVals[startInd + 3];\n const bInd = boxIndVals[b];\n if (bInd >= batch) {\n continue;\n }\n const heightScale = (cropHeight > 1) ? (y2 - y1) * (imageHeight - 1) / (cropHeight - 1) : 0;\n const widthScale = (cropWidth > 1) ? (x2 - x1) * (imageWidth - 1) / (cropWidth - 1) : 0;\n for (let y = 0; y < cropHeight; y++) {\n const yInd = (cropHeight > 1) ?\n y1 * (imageHeight - 1) + y * (heightScale) :\n 0.5 * (y1 + y2) * (imageHeight - 1);\n if (yInd < 0 || yInd > imageHeight - 1) {\n for (let x = 0; x < cropWidth; x++) {\n for (let c = 0; c < numChannels; c++) {\n const ind = c + x * outStride[2] + y * outStride[1] + b * outStride[0];\n output.values[ind] = extrapolationValue;\n }\n }\n continue;\n }\n if (method === 'bilinear') {\n const topInd = Math.floor(yInd);\n const bottomInd = Math.ceil(yInd);\n const yLerp = yInd - topInd;\n for (let x = 0; x < cropWidth; x++) {\n const xInd = (cropWidth > 1) ?\n x1 * (imageWidth - 1) + x * widthScale :\n 0.5 * (x1 + x2) * (imageWidth - 1);\n if (xInd < 0 || xInd > imageWidth - 1) {\n for (let c = 0; c < numChannels; c++) {\n const ind = c + x * outStride[2] + y * outStride[1] + b * outStride[0];\n output.values[ind] = extrapolationValue;\n }\n continue;\n }\n const leftInd = Math.floor(xInd);\n const rightInd = Math.ceil(xInd);\n const xLerp = xInd - leftInd;\n for (let c = 0; c < numChannels; c++) {\n let ind = c + leftInd * inStride[2] + topInd * inStride[1] +\n bInd * inStride[0];\n const topLeft = imageVals[ind];\n ind = c + rightInd * inStride[2] + topInd * inStride[1] +\n bInd * inStride[0];\n const topRight = imageVals[ind];\n ind = c + leftInd * inStride[2] + bottomInd * inStride[1] +\n bInd * inStride[0];\n const bottomLeft = imageVals[ind];\n ind = c + rightInd * inStride[2] + bottomInd * inStride[1] +\n bInd * inStride[0];\n const bottomRight = imageVals[ind];\n const top = topLeft + (topRight - topLeft) * xLerp;\n const bottom = bottomLeft + (bottomRight - bottomLeft) * xLerp;\n ind = c + x * outStride[2] + y * outStride[1] + b * outStride[0];\n output.values[ind] = top + ((bottom - top) * yLerp);\n }\n }\n }\n else { // method == \"nearest\"\n for (let x = 0; x < cropWidth; ++x) {\n const xInd = (cropWidth > 1) ?\n x1 * (imageWidth - 1) + x * widthScale :\n 0.5 * (x1 + x2) * (imageWidth - 1);\n if (xInd < 0 || xInd > imageWidth - 1) {\n for (let c = 0; c < numChannels; c++) {\n const ind = c + x * outStride[2] + y * outStride[1] + b * outStride[0];\n output.values[ind] = extrapolationValue;\n }\n continue;\n }\n const closestX = Math.round(xInd);\n const closestY = Math.round(yInd);\n for (let c = 0; c < numChannels; c++) {\n const inInd = c + closestX * inStride[2] + closestY * inStride[1] +\n bInd * inStride[0];\n const outInd = c + x * outStride[2] + y * outStride[1] + b * outStride[0];\n output.values[outInd] = imageVals[inInd];\n }\n }\n }\n }\n }\n return backend.makeTensorInfo(output.shape, output.dtype, output.values);\n}\nexport const cropAndResizeConfig = {\n kernelName: CropAndResize,\n backendName: 'cpu',\n kernelFunc: cropAndResize\n};\n//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiQ3JvcEFuZFJlc2l6ZS5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uLy4uL3RmanMtYmFja2VuZC1jcHUvc3JjL2tlcm5lbHMvQ3JvcEFuZFJlc2l6ZS50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQTs7Ozs7Ozs7Ozs7Ozs7O0dBZUc7QUFFSCxPQUFPLEVBQUMsTUFBTSxFQUFFLGFBQWEsRUFBNkYsSUFBSSxFQUFDLE1BQU0sdUJBQXVCLENBQUM7QUFJN0osTUFBTSxVQUFVLGFBQWEsQ0FBQyxJQUk3QjtJQUNDLE1BQU0sRUFBQyxNQUFNLEVBQUUsT0FBTyxFQUFFLEtBQUssRUFBQyxHQUFHLElBQUksQ0FBQztJQUN0QyxNQUFNLEVBQUMsS0FBSyxFQUFFLEtBQUssRUFBRSxNQUFNLEVBQUMsR0FBRyxNQUFNLENBQUM7SUFDdEMsTUFBTSxFQUFDLFFBQVEsRUFBRSxNQUFNLEVBQUUsa0JBQWtCLEVBQUMsR0FBRyxLQUFLLENBQUM7SUFFckQsTUFBTSxDQUFDLEtBQUssRUFBRSxXQUFXLEVBQUUsVUFBVSxFQUFFLFdBQVcsQ0FBQyxHQUFHLEtBQUssQ0FBQyxLQUFLLENBQUM7SUFDbEUsTUFBTSxRQUFRLEdBQUcsS0FBSyxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUMsQ0FBQztJQUVoQyxNQUFNLENBQUMsVUFBVSxFQUFFLFNBQVMsQ0FBQyxHQUFHLFFBQVEsQ0FBQztJQUN6QyxNQUFNLE1BQU0sR0FDUixNQUFNLENBQUMsQ0FBQyxRQUFRLEVBQUUsVUFBVSxFQUFFLFNBQVMsRUFBRSxXQUFXLENBQUMsRUFBRSxTQUFTLENBQUMsQ0FBQztJQUV0RSxNQUFNLE9BQU8sR0FBRyxPQUFPLENBQUMsSUFBSSxDQUFDLEdBQUcsQ0FBQyxLQUFLLENBQUMsTUFBTSxDQUFDLENBQUMsTUFBb0IsQ0FBQztJQUNwRSxNQUFNLFVBQVUsR0FBRyxPQUFPLENBQUMsSUFBSSxDQUFDLEdBQUcsQ0FBQyxNQUFNLENBQUMsTUFBTSxDQUFD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dCAyMDIwIEdvb2dsZSBMTEMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuXG4gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgXCJMaWNlbnNlXCIpO1xuICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLlxuICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0XG4gKlxuICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wXG4gKlxuICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZVxuICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gXCJBUyBJU1wiIEJBU0lTLFxuICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuXG4gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kXG4gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS5cbiAqID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4gKi9cblxuaW1wb3J0IHtidWZmZXIsIENyb3BBbmRSZXNpemUsIENyb3BBbmRSZXNpemVBdHRycywgQ3JvcEFuZFJlc2l6ZUlucHV0cywgS2VybmVsQ29uZmlnLCBLZXJuZWxGdW5jLCBUZW5zb3JJbmZvLCBUeXBlZEFycmF5LCB1dGlsfSBmcm9tICdAdGVuc29yZmxvdy90ZmpzLWNvcmUnO1xuXG5pbXBvcnQge01hdGhCYWNrZW5kQ1BVfSBmcm9tICcuLi9iYWNrZW5kX2NwdSc7XG5cbmV4cG9ydCBmdW5jdGlvbiBjcm9wQW5kUmVzaXplKGFyZ3M6IHtcbiAgaW5wdXRzOiBDcm9wQW5kUmVzaXplSW5wdXRzLFxuICBiYWNrZW5kOiBNYXRoQmFja2VuZENQVSxcbiAgYXR0cnM6IENyb3BBbmRSZXNpemVBdHRyc1xufSk6IFRlbnNvckluZm8ge1xuICBjb25zdCB7aW5wdXRzLCBiYWNrZW5kLCBhdHRyc30gPSBhcmdzO1xuICBjb25zdCB7aW1hZ2UsIGJveGVzLCBib3hJbmR9ID0gaW5wdXRzO1xuICBjb25zdCB7Y3JvcFNpemUsIG1ldGhvZCwgZXh0cmFwb2xhdGlvblZhbHVlfSA9IGF0dHJzO1xuXG4gIGNvbnN0IFtiYXRjaCwgaW1hZ2VIZWlnaHQsIGltYWdlV2lkdGgsIG51bUNoYW5uZWxzXSA9IGltYWdlLnNoYXBlO1xuICBjb25zdCBudW1Cb3hlcyA9IGJveGVzLnNoYXBlWzBdO1xuXG4gIGNvbnN0IFtjcm9wSGVpZ2h0LCBjcm9wV2lkdGhdID0gY3JvcFNpemU7XG4gIGNvbnN0IG91dHB1dCA9XG4gICAgICBidWZmZXIoW251bUJveGVzLCBjcm9wSGVpZ2h0LCBjcm9wV2lkdGgsIG51bUNoYW5uZWxzXSwgJ2Zsb2F0MzInKTtcblxuICBjb25zdCBib3hWYWxzID0gYmFja2VuZC5kYXRhLmdldChib3hlcy5kYXRhSWQpLnZhbHVlcyBhcyBUeXBlZEFycmF5O1xuICBjb25zdCBib3hJbmRWYWxzID0gYmFja2VuZC5kYXRhLmdldChib3hJbmQuZGF0YUlkKS52YWx1ZXMgYXMgVHlwZWRBcnJheTtcbiAgY29uc3QgaW1hZ2VWYWxzID0gYmFja2VuZC5kYXRhLmdldChpbWFnZS5kYXRhSWQpLnZhbHVlcyBhcyBUeXBlZEFycmF5O1xuXG4gIGNvbnN0IGluU3RyaWRlID1cbiAgICAgIHV0aWwuY29tcHV0ZVN0cmlkZXMoaW1hZ2Uuc2hhcGUpOyAgLy8gdG8gY2FsY3VsYXRlIGZsYXQgaW5kZXhlcyBpbnRvIGltYWdlXG4gIGNvbnN0IG91dFN0cmlkZSA9IHV0aWwuY29tcHV0ZVN0cmlkZXMoXG4gICAgICBvdXRwdXQuc2hhcGUpOyAgLy8gdG8gY2FsY3VsYXRlIGZsYXQgaW5kZXhlcyBpbnRvIG91dHB1dFxuXG4gIC8vIFJlZmVyZW5jZSBpbXBsZW1lbnRhdGlvblxuICAvLyB0c2xpbnQ6ZGlzYWJsZS1uZXh0LWxpbmU6bWF4LWxpbmUtbGVuZ3RoXG4gIC8vIGh0dHBzOi8vZ2l0aHViLmNvbS90ZW5zb3JmbG93L3RlbnNvcmZsb3cvYmxvYi9tYXN0ZXIvdGVuc29yZmxvdy9jb3JlL2tlcm5lbHMvY3JvcF9hbmRfcmVzaXplX29wLmNjXG4gIGZvciAobGV0IGIgPSAwOyBiIDwgbnVtQm94ZXM7IGIrKykge1xuICAgIGNvbnN0IHN0YXJ0SW5kID0gYiAqIDQ7XG4gICAgY29uc3QgeTEgPSBib3hWYWxzW3N0YXJ0SW5kXTtcbiAgICBjb25zdCB4MSA9IGJveFZhbHNbc3RhcnRJbmQgKyAxXTtcbiAgICBjb25zdCB5MiA9IGJveFZhbHNbc3RhcnRJbmQgKyAyXTtcbiAgICBjb25zdCB4MiA9IGJveFZhbHNbc3RhcnRJbmQgKyAzXTtcblxuICAgIGNvbnN0IGJJbmQ6IG51bWJlciA9IGJveEluZFZhbHNbYl07XG4gICAgaWYgKGJJbmQgPj0gYmF0Y2gpIHtcbiAgICAgIGNvbnRpbnVlO1xuICAgIH1cblxuICAgIGNvbnN0IGhlaWdodFNjYWxlID1cbiAgICAgICAgKGNyb3BIZWlnaHQgPiAxKSA/ICh5MiAtIHkxKSAqIChpbWFnZUhlaWdodCAtIDEpIC8gKGNyb3BIZWlnaHQgLSAxKSA6IDA7XG4gICAgY29uc3Qgd2lkdGhTY2FsZSA9XG4gICAgICAgIChjcm9wV2lkdGggPiAxKSA/ICh4MiAtIHgxKSAqIChpbWFnZVdpZHRoIC0gMSkgLyAoY3JvcFdpZHRoIC0gMSkgOiAwO1xuXG4gICAgZm9yIChsZXQgeSA9IDA7IHkgPCBjcm9wSGVpZ2h0OyB5KyspIHtcbiAgICAgIGNvbnN0IHlJbmQ6IG51bWJlciA9IChjcm9wSGVpZ2h0ID4gMSkgP1xuICAgICAgICAgIHkxICogKGltYWdlSGVpZ2h0IC0gMSkgKyB5ICogKGhlaWdodFNjYWxlKSA6XG4gICAgICAgICAgMC41ICogKHkxICsgeTIpICogKGltYWdlSGVpZ2h0IC0gMSk7XG5cbiAgICAgIGlmICh5SW5kIDwgMCB8fCB5SW5kID4gaW1hZ2VIZWlnaHQgLSAxKSB7XG4gICAgICAgIGZvciAobGV0IHggPSAwOyB4IDwgY3JvcFdpZHRoOyB4KyspIHtcbiAgICAgICAgICBmb3IgKGxldCBjID0gMDsgYyA8IG51bUNoYW5uZWxzOyBjKyspIHtcbiAgICAgICAgICAgIGNvbnN0IGluZCA9XG4gICAgICAgICAgICAgICAgYyArIHggKiBvdXRTdHJpZGVbMl0gKyB5ICogb3V0U3RyaWRlWzFdICsgYiAqIG91dFN0cmlkZVswXTtcbiAgICAgICAgICAgIG91dHB1dC52YWx1ZXNbaW5kXSA9IGV4dHJhcG9sYXRpb25WYWx1ZTtcbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgY29udGludWU7XG4gICAgICB9XG5cbiAgICAgIGlmIChtZXRob2QgPT09ICdiaWxpbmVhcicpIHtcbiAgICAgICAgY29uc3QgdG9wSW5kID0gTWF0aC5mbG9vcih5SW5kKTtcbiAgICAgICAgY29uc3QgYm90dG9tSW5kID0gTWF0aC5jZWlsKHlJbmQpO1xuICAgICAgICBjb25zdCB5TGVycCA9IHlJbmQgLSB0b3BJbmQ7XG5cbiAgICAgICAgZm9yIChsZXQgeCA9IDA7IHggPCBjcm9wV2lkdGg7IHgrKykge1xuICAgICAgICAgIGNvbnN0IHhJbmQgPSAoY3JvcFdpZHRoID4gMSkgP1xuICAgICAgICAgICAgICB4MSAqIChpbWFnZVdpZHRoIC0gMSkgKyB4ICogd2lkdGhTY2FsZSA6XG4gICAgICAgICAgICAgIDAuNSAqICh4MSArIHgyKSAqIChpbWFnZVdpZHRoIC0gMSk7XG5cbiAgICAgICAgICBpZiAoeEluZCA8IDAgfHwgeEluZCA+IGltYWdlV2lkdGggLSAxKSB7XG4gICAgICAgICAgICBmb3IgKGxldCBjID0gMDsgYyA8IG51bUNoYW5uZWxzOyBjKyspIHtcbiAgICAgICAgICAgICAgY29uc3QgaW5kID1cbiAgICAgICAgICAgICAgICAgIGMgKyB4ICogb3V0U3RyaWRlWzJdICsgeSAqIG91dFN0cmlkZVsxXSArIGIgKiBvdXRTdHJpZGVbMF07XG4gICAgICAgICAgICAgIG91dHB1dC52YWx1ZXNbaW5kXSA9IGV4dHJhcG9sYXRpb25WYWx1ZTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGNvbnRpbnVlO1xuICAgICAgICAgIH1cblxuICAgICAgICAgIGNvbnN0IGxlZnRJbmQgPSBNYXRoLmZsb29yKHhJbmQpO1xuICAgICAgICAgIGNvbnN0IHJpZ2h0SW5kID0gTWF0aC5jZWlsKHhJbmQpO1xuICAgICAgICAgIGNvbnN0IHhMZXJwID0geEluZCAtIGxlZnRJbmQ7XG5cbiAgICAgICAgICBmb3IgKGxldCBjID0gMDsgYyA8IG51bUNoYW5uZWxzOyBjKyspIHtcbiAgICAgICAgICAgIGxldCBpbmQgPSBjICsgbGVmdEluZCAqIGluU3RyaWRlWzJdICsgdG9wSW5kICogaW5TdHJpZGVbMV0gK1xuICAgICAgICAgICAgICAgIGJJbmQgKiBpblN0cmlkZVswXTtcbiAgICAgICAgICAgIGNvbnN0IHRvcExlZnQgPSBpbWFnZVZhbHNbaW5kXTtcblxuICAgICAgICAgICAgaW5kID0gYyArIHJpZ2h0SW5kICogaW5TdHJpZGVbMl0gKyB0b3BJbmQgKiBpblN0cmlkZVsxXSArXG4gICAgICAgICAgICAgICAgYkluZCAqIGluU3RyaWRlWzBdO1xuICAgICAgICAgICAgY29uc3QgdG9wUmlnaHQgPSBpbWFnZVZhbHNbaW5kXTtcblxuICAgICAgICAgICAgaW5kID0gYyArIGxlZnRJbmQgKiBpblN0cmlkZVsyXSArIGJvdHRvbUluZCAqIGluU3RyaWRlWzFdICtcbiAgICAgICAgICAgICAgICBiSW5kICogaW5TdHJpZGVbMF07XG4gICAgICAgICAgICBjb25zdCBib3R0b21MZWZ0ID0gaW1hZ2VWYWxzW2luZF07XG5cbiAgICAgICAgICAgIGluZCA9IGMgKyByaWdodEluZCAqIGluU3RyaWRlWzJdICsgYm90dG9tSW5kICogaW5TdHJpZGVbMV0gK1xuICAgICAgICAgICAgICAgIGJJbmQgKiBpblN0cmlkZVswXTtcbiAgICAgICAgICAgIGNvbnN0IGJvdHRvbVJpZ2h0ID0gaW1hZ2VWYWxzW2luZF07XG5cbiAgICAgICAgICAgIGNvbnN0IHRvcCA9IHRvcExlZnQgKyAodG9wUmlnaHQgLSB0b3BMZWZ0KSAqIHhMZXJwO1xuICAgICAgICAgICAgY29uc3QgYm90dG9tID0gYm90dG9tTGVmdCArIChib3R0b21SaWdodCAtIGJvdHRvbUxlZnQpICogeExlcnA7XG5cbiAgICAgICAgICAgIGluZCA9IGMgKyB4ICogb3V0U3RyaWRlWzJdICsgeSAqIG91dFN0cmlkZVsxXSArIGIgKiBvdXRTdHJpZGVbMF07XG4gICAgICAgICAgICBvdXRwdXQudmFsdWVzW2luZF0gPSB0b3AgKyAoKGJvdHRvbSAtIHRvcCkgKiB5TGVycCk7XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICB9IGVsc2UgeyAgLy8gbWV0aG9kID09IFwibmVhcmVzdFwiXG4gICAgICAgIGZvciAobGV0IHggPSAwOyB4IDwgY3JvcFdpZHRoOyArK3gpIHtcbiAgICAgICAgICBjb25zdCB4SW5kID0gKGNyb3BXaWR0aCA+IDEpID9cbiAgICAgICAgICAgICAgeDEgKiAoaW1hZ2VXaWR0aCAtIDEpICsgeCAqIHdpZHRoU2NhbGUgOlxuICAgICAgICAgICAgICAwLjUgKiAoeDEgKyB4MikgKiAoaW1hZ2VXaWR0aCAtIDEpO1xuXG4gICAgICAgICAgaWYgKHhJbmQgPCAwIHx8IHhJbmQgPiBpbWFnZVdpZHRoIC0gMSkge1xuICAgICAgICAgICAgZm9yIChsZXQgYyA9IDA7IGMgPCBudW1DaGFubmVsczsgYysrKSB7XG4gICAgICAgICAgICAgIGNvbnN0IGluZCA9XG4gICAgICAgICAgICAgICAgICBjICsgeCAqIG91dFN0cmlkZVsyXSArIHkgKiBvdXRTdHJpZGVbMV0gKyBiICogb3V0U3RyaWRlWzBdO1xuICAgICAgICAgICAgICBvdXRwdXQudmFsdWVzW2luZF0gPSBleHRyYXBvbGF0aW9uVmFsdWU7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBjb250aW51ZTtcbiAgICAgICAgICB9XG5cbiAgICAgICAgICBjb25zdCBjbG9zZXN0WCA9IE1hdGgucm91bmQoeEluZCk7XG4gICAgICAgICAgY29uc3QgY2xvc2VzdFkgPSBNYXRoLnJvdW5kKHlJbmQpO1xuICAgICAgICAgIGZvciAobGV0IGMgPSAwOyBjIDwgbnVtQ2hhbm5lbHM7IGMrKykge1xuICAgICAgICAgICAgY29uc3QgaW5JbmQgPSBjICsgY2xvc2VzdFggKiBpblN0cmlkZVsyXSArIGNsb3Nlc3RZICogaW5TdHJpZGVbMV0gK1xuICAgICAgICAgICAgICAgIGJJbmQgKiBpblN0cmlkZVswXTtcbiAgICAgICAgICAgIGNvbnN0IG91dEluZCA9XG4gICAgICAgICAgICAgICAgYyArIHggKiBvdXRTdHJpZGVbMl0gKyB5ICogb3V0U3RyaWRlWzFdICsgYiAqIG91dFN0cmlkZVswXTtcbiAgICAgICAgICAgIG91dHB1dC52YWx1ZXNbb3V0SW5kXSA9IGltYWdlVmFsc1tpbkluZF07XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICB9XG4gICAgfVxuICB9XG5cbiAgcmV0dXJuIGJhY2tlbmQubWFrZVRlbnNvckluZm8ob3V0cHV0LnNoYXBlLCBvdXRwdXQuZHR5cGUsIG91dHB1dC52YWx1ZXMpO1xufVxuXG5leHBvcnQgY29uc3QgY3JvcEFuZFJlc2l6ZUNvbmZpZzogS2VybmVsQ29uZmlnID0ge1xuICBrZXJuZWxOYW1lOiBDcm9wQW5kUmVzaXplLFxuICBiYWNrZW5kTmFtZTogJ2NwdScsXG4gIGtlcm5lbEZ1bmM6IGNyb3BBbmRSZXNpemUgYXMge30gYXMgS2VybmVsRnVuY1xufTtcbiJdfQ==","/**\n * @license\n * Copyright 2022 Google LLC. All Rights Reserved.\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n * =============================================================================\n */\nimport { backend_util, Cumprod, upcastType, util } from '@tensorflow/tfjs-core';\nimport { assertNotComplex } from '../cpu_util';\nimport { transpose } from './Transpose';\nexport function cumprod(args) {\n const { inputs, backend, attrs } = args;\n const { x } = inputs;\n const { axis, exclusive, reverse } = attrs;\n assertNotComplex(x, 'cumprod');\n const permutation = backend_util.getAxesPermutation([axis], x.shape.length);\n let $x = x;\n if (permutation != null) {\n $x = transpose({ inputs: { x }, backend, attrs: { perm: permutation } });\n }\n const permutedAxis = backend_util.getInnerMostAxes(1, x.shape.length)[0];\n if (permutedAxis !== $x.shape.length - 1) {\n throw new Error(`backend.cumprod in CPU expects an inner-most ` +\n `axis=${$x.shape.length - 1} but got axis=${permutedAxis}`);\n }\n const resultDtype = upcastType($x.dtype, 'int32');\n const vals = util.makeOnesTypedArray(util.sizeFromShape($x.shape), resultDtype);\n const aVals = backend.data.get($x.dataId).values;\n const finalDim = $x.shape[$x.shape.length - 1];\n const indexAdjuster = reverse ?\n (i, j) => i + finalDim - j - 1 :\n (i, j) => i + j;\n for (let i = 0; i < aVals.length; i += finalDim) {\n for (let j = 0; j < finalDim; j++) {\n const idx = indexAdjuster(i, j);\n if (j === 0) {\n vals[idx] = exclusive ? 1 : aVals[idx];\n }\n else {\n const prevIdx = indexAdjuster(i, j - 1);\n vals[idx] = exclusive ? aVals[prevIdx] * vals[prevIdx] :\n aVals[idx] * vals[prevIdx];\n }\n }\n }\n const result = backend.makeTensorInfo($x.shape, resultDtype, vals);\n if (permutation != null) {\n const reversePermutation = backend_util.getUndoAxesPermutation(permutation);\n const reverseTransposedResult = transpose({ inputs: { x: result }, backend, attrs: { perm: reversePermutation } });\n backend.disposeIntermediateTensorInfo(result);\n backend.disposeIntermediateTensorInfo($x);\n return reverseTransposedResult;\n }\n return result;\n}\nexport const cumprodConfig = {\n kernelName: Cumprod,\n backendName: 'cpu',\n kernelFunc: cumprod\n};\n//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiQ3VtcHJvZC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uLy4uL3RmanMtYmFja2VuZC1jcHUvc3JjL2tlcm5lbHMvQ3VtcHJvZC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQTs7Ozs7Ozs7Ozs7Ozs7O0dBZUc7QUFFSCxPQUFPLEVBQUMsWUFBWSxFQUFFLE9BQU8sRUFBaUYsVUFBVSxFQUFFLElBQUksRUFBQyxNQUFNLHVCQUF1QixDQUFDO0FBRzdKLE9BQU8sRUFBQyxnQkFBZ0IsRUFBQyxNQUFNLGFBQWEsQ0FBQztBQUM3QyxPQUFPLEVBQUMsU0FBUyxFQUFDLE1BQU0sYUFBYSxDQUFDO0FBRXRDLE1BQU0sVUFBVSxPQUFPLENBQ25CLElBQzJCO0lBQzdCLE1BQU0sRUFBQyxNQUFNLEVBQUUsT0FBTyxFQUFFLEtBQUssRUFBQyxHQUFHLElBQUksQ0FBQztJQUN0QyxNQUFNLEVBQUMsQ0FBQyxFQUFDLEdBQUcsTUFBTSxDQUFDO0lBQ25CLE1BQU0sRUFBQyxJQUFJLEVBQUUsU0FBUyxFQUFFLE9BQU8sRUFBQyxHQUFHLEtBQUssQ0FBQztJQUV6QyxnQkFBZ0IsQ0FBQyxDQUFDLEVBQUUsU0FBUyxDQUFDLENBQUM7SUFFL0IsTUFBTSxXQUFXLEdBQUcsWUFBWSxDQUFDLGtCQUFrQixDQUFDLENBQUMsSUFBSSxDQUFDLEVBQUUsQ0FBQyxDQUFDLEtBQUssQ0FBQyxNQUFNLENBQUMsQ0FBQztJQUM1RSxJQUFJLEVBQUUsR0FBRyxDQUFDLENBQUM7SUFDWCxJQUFJLFdBQVcsSUFBSSxJQUFJLEVBQUU7UUFDdkIsRUFBRSxHQUFHLFNBQVMsQ0FBQyxFQUFDLE1BQU0sRUFBRSxFQUFDLENBQUMsRUFBQyxFQUFFLE9BQU8sRUFBRSxLQUFLLEVBQUUsRUFBQyxJQUFJLEVBQUUsV0FBVyxFQUFDLEVBQUMsQ0FBQyxDQUFDO0tBQ3BFO0lBQ0QsTUFBTSxZQUFZLEdBQUcsWUFBWSxDQUFDLGdCQUFnQixDQUFDLENBQUMsRUFB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QUFDaEIsQ0FBQztBQUVELE1BQU0sQ0FBQyxNQUFNLGFBQWEsR0FBaUI7SUFDekMsVUFBVSxFQUFFLE9BQU87SUFDbkIsV0FBVyxFQUFFLEtBQUs7SUFDbEIsVUFBVSxFQUFFLE9BQTJCO0NBQ3hDLENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyIvKipcbiAqIEBsaWNlbnNlXG4gKiBDb3B5cmlnaHQgMjAyMiBHb29nbGUgTExDLiBBbGwgUmlnaHRzIFJlc2VydmVkLlxuICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlIFwiTGljZW5zZVwiKTtcbiAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS5cbiAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdFxuICpcbiAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMFxuICpcbiAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmVcbiAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuIFwiQVMgSVNcIiBCQVNJUyxcbiAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLlxuICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZFxuICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuXG4gKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuICovXG5cbmltcG9ydCB7YmFja2VuZF91dGlsLCBDdW1wcm9kLCBDdW1wcm9kQXR0cnMsIEN1bXByb2RJbnB1dHMsIEtlcm5lbENvbmZpZywgS2VybmVsRnVuYywgVGVuc29ySW5mbywgVHlwZWRBcnJheSwgdXBjYXN0VHlwZSwgdXRpbH0gZnJvbSAnQHRlbnNvcmZsb3cvdGZqcy1jb3JlJztcblxuaW1wb3J0IHtNYXRoQmFja2VuZENQVX0gZnJvbSAnLi4vYmFja2VuZF9jcHUnO1xuaW1wb3J0IHthc3NlcnROb3RDb21wbGV4fSBmcm9tICcuLi9jcHVfdXRpbCc7XG5pbXBvcnQge3RyYW5zcG9zZX0gZnJvbSAnLi9UcmFuc3Bvc2UnO1xuXG5leHBvcnQgZnVuY3Rpb24gY3VtcHJvZChcbiAgICBhcmdzOiB7aW5wdXRzOiBDdW1wcm9kSW5wdXRzLCBiYWNrZW5kOiBNYXRoQmFja2VuZENQVSxcbiAgICAgICAgICAgYXR0cnM6IEN1bXByb2RBdHRyc30pOiBUZW5zb3JJbmZvIHtcbiAgY29uc3Qge2lucHV0cywgYmFja2VuZCwgYXR0cnN9ID0gYXJncztcbiAgY29uc3Qge3h9ID0gaW5wdXRzO1xuICBjb25zdCB7YXhpcywgZXhjbHVzaXZlLCByZXZlcnNlfSA9IGF0dHJzO1xuXG4gIGFzc2VydE5vdENvbXBsZXgoeCwgJ2N1bXByb2QnKTtcblxuICBjb25zdCBwZXJtdXRhdGlvbiA9IGJhY2tlbmRfdXRpbC5nZXRBeGVzUGVybXV0YXRpb24oW2F4aXNdLCB4LnNoYXBlLmxlbmd0aCk7XG4gIGxldCAkeCA9IHg7XG4gIGlmIChwZXJtdXRhdGlvbiAhPSBudWxsKSB7XG4gICAgJHggPSB0cmFuc3Bvc2Uoe2lucHV0czoge3h9LCBiYWNrZW5kLCBhdHRyczoge3Blcm06IHBlcm11dGF0aW9ufX0pO1xuICB9XG4gIGNvbnN0IHBlcm11dGVkQXhpcyA9IGJhY2tlbmRfdXRpbC5nZXRJbm5lck1vc3RBeGVzKDEsIHguc2hhcGUubGVuZ3RoKVswXTtcblxuICBpZiAocGVybXV0ZWRBeGlzICE9PSAkeC5zaGFwZS5sZW5ndGggLSAxKSB7XG4gICAgdGhyb3cgbmV3IEVycm9yKFxuICAgICAgICBgYmFja2VuZC5jdW1wcm9kIGluIENQVSBleHBlY3RzIGFuIGlubmVyLW1vc3QgYCArXG4gICAgICAgIGBheGlzPSR7JHguc2hhcGUubGVuZ3RoIC0gMX0gYnV0IGdvdCBheGlzPSR7cGVybXV0ZWRBeGlzfWApO1xuICB9XG5cbiAgY29uc3QgcmVzdWx0RHR5cGUgPSB1cGNhc3RUeXBlKCR4LmR0eXBlLCAnaW50MzInKTtcbiAgY29uc3QgdmFscyA9IHV0aWwubWFrZU9uZXNUeXBlZEFycmF5KFxuICAgICAgICAgICAgICAgICAgIHV0aWwuc2l6ZUZyb21TaGFwZSgkeC5zaGFwZSksIHJlc3VsdER0eXBlKSBhcyBUeXBlZEFycmF5O1xuXG4gIGNvbnN0IGFWYWxzID0gYmFja2VuZC5kYXRhLmdldCgkeC5kYXRhSWQpLnZhbHVlcyBhcyBUeXBlZEFycmF5O1xuICBjb25zdCBmaW5hbERpbSA9ICR4LnNoYXBlWyR4LnNoYXBlLmxlbmd0aCAtIDFdO1xuICBjb25zdCBpbmRleEFkanVzdGVyID0gcmV2ZXJzZSA/XG4gICAgICAoaTogbnVtYmVyLCBqOiBudW1iZXIpID0+IGkgKyBmaW5hbERpbSAtIGogLSAxIDpcbiAgICAgIChpOiBudW1iZXIsIGo6IG51bWJlcikgPT4gaSArIGo7XG4gIGZvciAobGV0IGkgPSAwOyBpIDwgYVZhbHMubGVuZ3RoOyBpICs9IGZpbmFsRGltKSB7XG4gICAgZm9yIChsZXQgaiA9IDA7IGogPCBmaW5hbERpbTsgaisrKSB7XG4gICAgICBjb25zdCBpZHggPSBpbmRleEFkanVzdGVyKGksIGopO1xuICAgICAgaWYgKGogPT09IDApIHtcbiAgICAgICAgdmFsc1tpZHhdID0gZXhjbHVzaXZlID8gMSA6IGFWYWxzW2lkeF07XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBjb25zdCBwcmV2SWR4ID0gaW5kZXhBZGp1c3RlcihpLCBqIC0gMSk7XG4gICAgICAgIHZhbHNbaWR4XSA9IGV4Y2x1c2l2ZSA/IGFWYWxzW3ByZXZJZHhdICogdmFsc1twcmV2SWR4XSA6XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFWYWxzW2lkeF0gKiB2YWxzW3ByZXZJZHhdO1xuICAgICAgfVxuICAgIH1cbiAgfVxuXG4gIGNvbnN0IHJlc3VsdCA9IGJhY2tlbmQubWFrZVRlbnNvckluZm8oJHguc2hhcGUsIHJlc3VsdER0eXBlLCB2YWxzKTtcblxuICBpZiAocGVybXV0YXRpb24gIT0gbnVsbCkge1xuICAgIGNvbnN0IHJldmVyc2VQZXJtdXRhdGlvbiA9IGJhY2tlbmRfdXRpbC5nZXRVbmRvQXhlc1Blcm11dGF0aW9uKHBlcm11dGF0aW9uKTtcbiAgICBjb25zdCByZXZlcnNlVHJhbnNwb3NlZFJlc3VsdCA9IHRyYW5zcG9zZShcbiAgICAgICAge2lucHV0czoge3g6IHJlc3VsdH0sIGJhY2tlbmQsIGF0dHJzOiB7cGVybTogcmV2ZXJzZVBlcm11dGF0aW9ufX0pO1xuXG4gICAgYmFja2VuZC5kaXNwb3NlSW50ZXJtZWRpYXRlVGVuc29ySW5mbyhyZXN1bHQpO1xuICAgIGJhY2tlbmQuZGlzcG9zZUludGVybWVkaWF0ZVRlbnNvckluZm8oJHgpO1xuXG4gICAgcmV0dXJuIHJldmVyc2VUcmFuc3Bvc2VkUmVzdWx0O1xuICB9XG5cbiAgcmV0dXJuIHJlc3VsdDtcbn1cblxuZXhwb3J0IGNvbnN0IGN1bXByb2RDb25maWc6IEtlcm5lbENvbmZpZyA9IHtcbiAga2VybmVsTmFtZTogQ3VtcHJvZCxcbiAgYmFja2VuZE5hbWU6ICdjcHUnLFxuICBrZXJuZWxGdW5jOiBjdW1wcm9kIGFzIHt9IGFzIEtlcm5lbEZ1bmNcbn07XG4iXX0=","/**\n * @license\n * Copyright 2020 Google LLC. All Rights Reserved.\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n * =============================================================================\n */\nimport { backend_util, Cumsum, upcastType, util } from '@tensorflow/tfjs-core';\nimport { assertNotComplex } from '../cpu_util';\nimport { transpose } from './Transpose';\nexport function cumsum(args) {\n const { inputs, backend, attrs } = args;\n const { x } = inputs;\n const { axis, exclusive, reverse } = attrs;\n assertNotComplex(x, 'cumsum');\n const permutation = backend_util.getAxesPermutation([axis], x.shape.length);\n let $x = x;\n if (permutation != null) {\n $x = transpose({ inputs: { x }, backend, attrs: { perm: permutation } });\n }\n const permutedAxis = backend_util.getInnerMostAxes(1, x.shape.length)[0];\n if (permutedAxis !== $x.shape.length - 1) {\n throw new Error(`backend.cumsum in CPU expects an inner-most ` +\n `axis=${$x.shape.length - 1} but got axis=${permutedAxis}`);\n }\n const resultDtype = upcastType($x.dtype, 'int32');\n const vals = util.makeZerosTypedArray(util.sizeFromShape($x.shape), resultDtype);\n const aVals = backend.data.get($x.dataId).values;\n const finalDim = $x.shape[$x.shape.length - 1];\n const indexAdjuster = reverse ?\n (i, j) => i + finalDim - j - 1 :\n (i, j) => i + j;\n for (let i = 0; i < aVals.length; i += finalDim) {\n for (let j = 0; j < finalDim; j++) {\n const idx = indexAdjuster(i, j);\n if (j === 0) {\n vals[idx] = exclusive ? 0 : aVals[idx];\n }\n else {\n const prevIdx = indexAdjuster(i, j - 1);\n vals[idx] = exclusive ? aVals[prevIdx] + vals[prevIdx] :\n aVals[idx] + vals[prevIdx];\n }\n }\n }\n const result = backend.makeTensorInfo($x.shape, resultDtype, vals);\n if (permutation != null) {\n const reversePermutation = backend_util.getUndoAxesPermutation(permutation);\n const reverseTransposedResult = transpose({ inputs: { x: result }, backend, attrs: { perm: reversePermutation } });\n backend.disposeIntermediateTensorInfo(result);\n backend.disposeIntermediateTensorInfo($x);\n return reverseTransposedResult;\n }\n return result;\n}\nexport const cumsumConfig = {\n kernelName: Cumsum,\n backendName: 'cpu',\n kernelFunc: cumsum\n};\n//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiQ3Vtc3VtLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vLi4vdGZqcy1iYWNrZW5kLWNwdS9zcmMva2VybmVscy9DdW1zdW0udHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUE7Ozs7Ozs7Ozs7Ozs7OztHQWVHO0FBRUgsT0FBTyxFQUFDLFlBQVksRUFBRSxNQUFNLEVBQStFLFVBQVUsRUFBRSxJQUFJLEVBQUMsTUFBTSx1QkFBdUIsQ0FBQztBQUcxSixPQUFPLEVBQUMsZ0JBQWdCLEVBQUMsTUFBTSxhQUFhLENBQUM7QUFDN0MsT0FBTyxFQUFDLFNBQVMsRUFBQyxNQUFNLGFBQWEsQ0FBQztBQUV0QyxNQUFNLFVBQVUsTUFBTSxDQUNsQixJQUF5RTtJQUUzRSxNQUFNLEVBQUMsTUFBTSxFQUFFLE9BQU8sRUFBRSxLQUFLLEVBQUMsR0FBRyxJQUFJLENBQUM7SUFDdEMsTUFBTSxFQUFDLENBQUMsRUFBQyxHQUFHLE1BQU0sQ0FBQztJQUNuQixNQUFNLEVBQUMsSUFBSSxFQUFFLFNBQVMsRUFBRSxPQUFPLEVBQUMsR0FBRyxLQUFLLENBQUM7SUFFekMsZ0JBQWdCLENBQUMsQ0FBQyxFQUFFLFFBQVEsQ0FBQyxDQUFDO0lBRTlCLE1BQU0sV0FBVyxHQUFHLFlBQVksQ0FBQyxrQkFBa0IsQ0FBQyxDQUFDLElBQUksQ0FBQyxFQUFFLENBQUMsQ0FBQyxLQUFLLENBQUMsTUFBTSxDQUFDLENBQUM7SUFDNUUsSUFBSSxFQUFFLEdBQUcsQ0FBQyxDQUFDO0lBQ1gsSUFBSSxXQUFXLElBQUksSUFBSSxFQUFFO1FBQ3ZCLEVBQUUsR0FBRyxTQUFTLENBQUMsRUFBQyxNQUFNLEVBQUUsRUFBQyxDQUFDLEVBQUMsRUFBRSxPQUFPLEVBQUUsS0FBSyxFQUFFLEVBQUMsSUFBSSxFQUFFLFdBQVcsRUFBQyxFQUFDLENBQUMsQ0FBQztLQUNwRTtJQUNELE1BQU0sWUFBWSxHQUFHLFlBQVksQ0FBQyxnQkFBZ0IsQ0FBQyxDQUFDLEVBQUUs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Q2hCLENBQUM7QUFFRCxNQUFNLENBQUMsTUFBTSxZQUFZLEdBQWlCO0lBQ3hDLFVBQVUsRUFBRSxNQUFNO0lBQ2xCLFdBQVcsRUFBRSxLQUFLO0lBQ2xCLFVBQVUsRUFBRSxNQUEwQjtDQUN2QyxDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiLyoqXG4gKiBAbGljZW5zZVxuICogQ29weXJpZ2h0IDIwMjAgR29vZ2xlIExMQy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC5cbiAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSBcIkxpY2Vuc2VcIik7XG4gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuXG4gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXRcbiAqXG4gKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjBcbiAqXG4gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlXG4gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiBcIkFTIElTXCIgQkFTSVMsXG4gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC5cbiAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmRcbiAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLlxuICogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbiAqL1xuXG5pbXBvcnQge2JhY2tlbmRfdXRpbCwgQ3Vtc3VtLCBDdW1zdW1BdHRycywgQ3Vtc3VtSW5wdXRzLCBLZXJuZWxDb25maWcsIEtlcm5lbEZ1bmMsIFRlbnNvckluZm8sIFR5cGVkQXJyYXksIHVwY2FzdFR5cGUsIHV0aWx9IGZyb20gJ0B0ZW5zb3JmbG93L3RmanMtY29yZSc7XG5cbmltcG9ydCB7TWF0aEJhY2tlbmRDUFV9IGZyb20gJy4uL2JhY2tlbmRfY3B1JztcbmltcG9ydCB7YXNzZXJ0Tm90Q29tcGxleH0gZnJvbSAnLi4vY3B1X3V0aWwnO1xuaW1wb3J0IHt0cmFuc3Bvc2V9IGZyb20gJy4vVHJhbnNwb3NlJztcblxuZXhwb3J0IGZ1bmN0aW9uIGN1bXN1bShcbiAgICBhcmdzOiB7aW5wdXRzOiBDdW1zdW1JbnB1dHMsIGJhY2tlbmQ6IE1hdGhCYWNrZW5kQ1BVLCBhdHRyczogQ3Vtc3VtQXR0cnN9KTpcbiAgICBUZW5zb3JJbmZvIHtcbiAgY29uc3Qge2lucHV0cywgYmFja2VuZCwgYXR0cnN9ID0gYXJncztcbiAgY29uc3Qge3h9ID0gaW5wdXRzO1xuICBjb25zdCB7YXhpcywgZXhjbHVzaXZlLCByZXZlcnNlfSA9IGF0dHJzO1xuXG4gIGFzc2VydE5vdENvbXBsZXgoeCwgJ2N1bXN1bScpO1xuXG4gIGNvbnN0IHBlcm11dGF0aW9uID0gYmFja2VuZF91dGlsLmdldEF4ZXNQZXJtdXRhdGlvbihbYXhpc10sIHguc2hhcGUubGVuZ3RoKTtcbiAgbGV0ICR4ID0geDtcbiAgaWYgKHBlcm11dGF0aW9uICE9IG51bGwpIHtcbiAgICAkeCA9IHRyYW5zcG9zZSh7aW5wdXRzOiB7eH0sIGJhY2tlbmQsIGF0dHJzOiB7cGVybTogcGVybXV0YXRpb259fSk7XG4gIH1cbiAgY29uc3QgcGVybXV0ZWRBeGlzID0gYmFja2VuZF91dGlsLmdldElubmVyTW9zdEF4ZXMoMSwgeC5zaGFwZS5sZW5ndGgpWzBdO1xuXG4gIGlmIChwZXJtdXRlZEF4aXMgIT09ICR4LnNoYXBlLmxlbmd0aCAtIDEpIHtcbiAgICB0aHJvdyBuZXcgRXJyb3IoXG4gICAgICAgIGBiYWNrZW5kLmN1bXN1bSBpbiBDUFUgZXhwZWN0cyBhbiBpbm5lci1tb3N0IGAgK1xuICAgICAgICBgYXhpcz0keyR4LnNoYXBlLmxlbmd0aCAtIDF9IGJ1dCBnb3QgYXhpcz0ke3Blcm11dGVkQXhpc31gKTtcbiAgfVxuXG4gIGNvbnN0IHJlc3VsdER0eXBlID0gdXBjYXN0VHlwZSgkeC5kdHlwZSwgJ2ludDMyJyk7XG4gIGNvbnN0IHZhbHMgPSB1dGlsLm1ha2VaZXJvc1R5cGVkQXJyYXkoXG4gICAgICAgICAgICAgICAgICAgdXRpbC5zaXplRnJvbVNoYXBlKCR4LnNoYXBlKSwgcmVzdWx0RHR5cGUpIGFzIFR5cGVkQXJyYXk7XG5cbiAgY29uc3QgYVZhbHMgPSBiYWNrZW5kLmRhdGEuZ2V0KCR4LmRhdGFJZCkudmFsdWVzIGFzIFR5cGVkQXJyYXk7XG4gIGNvbnN0IGZpbmFsRGltID0gJHguc2hhcGVbJHguc2hhcGUubGVuZ3RoIC0gMV07XG4gIGNvbnN0IGluZGV4QWRqdXN0ZXIgPSByZXZlcnNlID9cbiAgICAgIChpOiBudW1iZXIsIGo6IG51bWJlcikgPT4gaSArIGZpbmFsRGltIC0gaiAtIDEgOlxuICAgICAgKGk6IG51bWJlciwgajogbnVtYmVyKSA9PiBpICsgajtcbiAgZm9yIChsZXQgaSA9IDA7IGkgPCBhVmFscy5sZW5ndGg7IGkgKz0gZmluYWxEaW0pIHtcbiAgICBmb3IgKGxldCBqID0gMDsgaiA8IGZpbmFsRGltOyBqKyspIHtcbiAgICAgIGNvbnN0IGlkeCA9IGluZGV4QWRqdXN0ZXIoaSwgaik7XG4gICAgICBpZiAoaiA9PT0gMCkge1xuICAgICAgICB2YWxzW2lkeF0gPSBleGNsdXNpdmUgPyAwIDogYVZhbHNbaWR4XTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIGNvbnN0IHByZXZJZHggPSBpbmRleEFkanVzdGVyKGksIGogLSAxKTtcbiAgICAgICAgdmFsc1tpZHhdID0gZXhjbHVzaXZlID8gYVZhbHNbcHJldklkeF0gKyB2YWxzW3ByZXZJZHhdIDpcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYVZhbHNbaWR4XSArIHZhbHNbcHJldklkeF07XG4gICAgICB9XG4gICAgfVxuICB9XG5cbiAgY29uc3QgcmVzdWx0ID0gYmFja2VuZC5tYWtlVGVuc29ySW5mbygkeC5zaGFwZSwgcmVzdWx0RHR5cGUsIHZhbHMpO1xuXG4gIGlmIChwZXJtdXRhdGlvbiAhPSBudWxsKSB7XG4gICAgY29uc3QgcmV2ZXJzZVBlcm11dGF0aW9uID0gYmFja2VuZF91dGlsLmdldFVuZG9BeGVzUGVybXV0YXRpb24ocGVybXV0YXRpb24pO1xuICAgIGNvbnN0IHJldmVyc2VUcmFuc3Bvc2VkUmVzdWx0ID0gdHJhbnNwb3NlKFxuICAgICAgICB7aW5wdXRzOiB7eDogcmVzdWx0fSwgYmFja2VuZCwgYXR0cnM6IHtwZXJtOiByZXZlcnNlUGVybXV0YXRpb259fSk7XG5cbiAgICBiYWNrZW5kLmRpc3Bvc2VJbnRlcm1lZGlhdGVUZW5zb3JJbmZvKHJlc3VsdCk7XG4gICAgYmFja2VuZC5kaXNwb3NlSW50ZXJtZWRpYXRlVGVuc29ySW5mbygkeCk7XG5cbiAgICByZXR1cm4gcmV2ZXJzZVRyYW5zcG9zZWRSZXN1bHQ7XG4gIH1cblxuICByZXR1cm4gcmVzdWx0O1xufVxuXG5leHBvcnQgY29uc3QgY3Vtc3VtQ29uZmlnOiBLZXJuZWxDb25maWcgPSB7XG4gIGtlcm5lbE5hbWU6IEN1bXN1bSxcbiAgYmFja2VuZE5hbWU6ICdjcHUnLFxuICBrZXJuZWxGdW5jOiBjdW1zdW0gYXMge30gYXMgS2VybmVsRnVuY1xufTtcbiJdfQ==","/**\n * @license\n * Copyright 2020 Google LLC. All Rights Reserved.\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n * =============================================================================\n */\nimport { DenseBincount } from '@tensorflow/tfjs-core';\nimport { bincountImpl, bincountReduceImpl } from './Bincount_impl';\nexport function denseBincount(args) {\n const { inputs, backend, attrs } = args;\n const { x, weights } = inputs;\n const { size, binaryOutput } = attrs;\n if (x.shape.length === 1) {\n const xVals = backend.data.get(x.dataId).values;\n const weightsVals = backend.data.get(weights.dataId).values;\n const outVals = bincountImpl(xVals, weightsVals, weights.dtype, weights.shape, size);\n return backend.makeTensorInfo([size], weights.dtype, outVals);\n }\n else if (x.shape.length === 2) {\n const xBuf = backend.bufferSync(x);\n const weightsBuf = backend.bufferSync(weights);\n const outBuf = bincountReduceImpl(xBuf, weightsBuf, size, binaryOutput);\n return backend.makeTensorInfo(outBuf.shape, weights.dtype, outBuf.values);\n }\n throw new Error(`Error in denseBincount: input must be at most rank 2, but got rank` +\n `${x.shape.length}.`);\n}\nexport const denseBincountConfig = {\n kernelName: DenseBincount,\n backendName: 'cpu',\n kernelFunc: denseBincount\n};\n//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiRGVuc2VCaW5jb3VudC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uLy4uL3RmanMtYmFja2VuZC1jcHUvc3JjL2tlcm5lbHMvRGVuc2VCaW5jb3VudC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQTs7Ozs7Ozs7Ozs7Ozs7O0dBZUc7QUFFSCxPQUFPLEVBQUMsYUFBYSxFQUFrRyxNQUFNLHVCQUF1QixDQUFDO0FBR3JKLE9BQU8sRUFBQyxZQUFZLEVBQUUsa0JBQWtCLEVBQUMsTUFBTSxpQkFBaUIsQ0FBQztBQUVqRSxNQUFNLFVBQVUsYUFBYSxDQUFDLElBSTdCO0lBQ0MsTUFBTSxFQUFDLE1BQU0sRUFBRSxPQUFPLEVBQUUsS0FBSyxFQUFDLEdBQUcsSUFBSSxDQUFDO0lBQ3RDLE1BQU0sRUFBQyxDQUFDLEVBQUUsT0FBTyxFQUFDLEdBQUcsTUFBTSxDQUFDO0lBQzVCLE1BQU0sRUFBQyxJQUFJLEVBQUUsWUFBWSxFQUFDLEdBQUcsS0FBSyxDQUFDO0lBRW5DLElBQUksQ0FBQyxDQUFDLEtBQUssQ0FBQyxNQUFNLEtBQUssQ0FBQyxFQUFFO1FBQ3hCLE1BQU0sS0FBSyxHQUFHLE9BQU8sQ0FBQyxJQUFJLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxNQUFNLENBQUMsQ0FBQyxNQUFvQixDQUFDO1FBQzlELE1BQU0sV0FBVyxHQUFHLE9BQU8sQ0FBQyxJQUFJLENBQUMsR0FBRyxDQUFDLE9BQU8sQ0FBQyxNQUFNLENBQUMsQ0FBQyxNQUFvQixDQUFDO1FBRTFFLE1BQU0sT0FBTyxHQUNULFlBQVksQ0FBQyxLQUFLLEVBQUUsV0FBVyxFQUFFLE9BQU8sQ0FBQyxLQUFLLEVBQUUsT0FBTyxDQUFDLEtBQUssRUFBRSxJQUFJLENBQUMsQ0FBQztRQUV6RSxPQUFPLE9BQU8sQ0FBQyxjQUFjLENBQUMsQ0FBQyxJQUFJLENBQUMsRUFBRSxPQUFPLENBQUMsS0FBSyxFQUFFLE9BQU8sQ0FBQyxDQUFDO0tBQy9EO1NBQU0sSUFBSSxDQUFDLENBQUMsS0FBSyxDQUFDLE1BQU0sS0FBSyxDQUFDLEVBQUU7UUFDL0IsTUFBTSxJQUFJLEdBQUcsT0FBTyxDQUFDLFVBQVUsQ0FBa0IsQ0FBQyxDQUFDLENBQUM7UUFDcEQsTUFBTSxVQUFVLEdBQUcsT0FBTyxDQUFDLFVBQVUsQ0FBa0IsT0FBTyxDQUFDLENBQUM7UUFFaEUsTUFBTSxNQUFNLEdBQUcsa0JBQWtCLENBQUMsSUFBSSxFQUFFLFVBQVUsRUFBRSxJQUFJLEVBQUUsWUFBWSxDQUFDLENBQUM7UUFFeEUsT0FBTyxPQUFPLENBQUMsY0FBYyxDQUFDLE1BQU0sQ0FBQyxLQUFLLEVBQUUsT0FBTyxDQUFDLEtBQUssRUFBRSxNQUFNLENBQUMsTUFBTSxDQUFDLENBQUM7S0FDM0U7SUFFRCxNQUFNLElBQUksS0FBSyxDQUNYLG9FQUFvRTtRQUNwRSxHQUFHLENBQUMsQ0FBQyxLQUFLLENBQUMsTUFBTSxHQUFHLENBQUMsQ0FBQztBQUM1QixDQUFDO0FBRUQsTUFBTSxDQUFDLE1BQU0sbUJBQW1CLEdBQWlCO0lBQy9DLFVBQVUsRUFBRSxhQUFhO0lBQ3pCLFdBQVcsRUFBRSxLQUFLO0lBQ2xCLFVBQVUsRUFBRSxhQUFpQztDQUM5QyxDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiLyoqXG4gKiBAbGljZW5zZVxuICogQ29weXJpZ2h0IDIwMjAgR29vZ2xlIExMQy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC5cbiAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSBcIkxpY2Vuc2VcIik7XG4gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuXG4gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXRcbiAqXG4gKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjBcbiAqXG4gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlXG4gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiBcIkFTIElTXCIgQkFTSVMsXG4gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC5cbiAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmRcbiAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLlxuICogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbiAqL1xuXG5pbXBvcnQge0RlbnNlQmluY291bnQsIERlbnNlQmluY291bnRBdHRycywgRGVuc2VCaW5jb3VudElucHV0cywgS2VybmVsQ29uZmlnLCBLZXJuZWxGdW5jLCBSYW5rLCBUZW5zb3JJbmZvLCBUeXBlZEFycmF5fSBmcm9tICdAdGVuc29yZmxvdy90ZmpzLWNvcmUnO1xuXG5pbXBvcnQge01hdGhCYWNrZW5kQ1BVfSBmcm9tICcuLi9iYWNrZW5kX2NwdSc7XG5pbXBvcnQge2JpbmNvdW50SW1wbCwgYmluY291bnRSZWR1Y2VJbXBsfSBmcm9tICcuL0JpbmNvdW50X2ltcGwnO1xuXG5leHBvcnQgZnVuY3Rpb24gZGVuc2VCaW5jb3VudChhcmdzOiB7XG4gIGlucHV0czogRGVuc2VCaW5jb3VudElucHV0cyxcbiAgYmFja2VuZDogTWF0aEJhY2tlbmRDUFUsXG4gIGF0dHJzOiBEZW5zZUJpbmNvdW50QXR0cnNcbn0pOiBUZW5zb3JJbmZvIHtcbiAgY29uc3Qge2lucHV0cywgYmFja2VuZCwgYXR0cnN9ID0gYXJncztcbiAgY29uc3Qge3gsIHdlaWdodHN9ID0gaW5wdXRzO1xuICBjb25zdCB7c2l6ZSwgYmluYXJ5T3V0cHV0fSA9IGF0dHJzO1xuXG4gIGlmICh4LnNoYXBlLmxlbmd0aCA9PT0gMSkge1xuICAgIGNvbnN0IHhWYWxzID0gYmFja2VuZC5kYXRhLmdldCh4LmRhdGFJZCkudmFsdWVzIGFzIFR5cGVkQXJyYXk7XG4gICAgY29uc3Qgd2VpZ2h0c1ZhbHMgPSBiYWNrZW5kLmRhdGEuZ2V0KHdlaWdodHMuZGF0YUlkKS52YWx1ZXMgYXMgVHlwZWRBcnJheTtcblxuICAgIGNvbnN0IG91dFZhbHMgPVxuICAgICAgICBiaW5jb3VudEltcGwoeFZhbHMsIHdlaWdodHNWYWxzLCB3ZWlnaHRzLmR0eXBlLCB3ZWlnaHRzLnNoYXBlLCBzaXplKTtcblxuICAgIHJldHVybiBiYWNrZW5kLm1ha2VUZW5zb3JJbmZvKFtzaXplXSwgd2VpZ2h0cy5kdHlwZSwgb3V0VmFscyk7XG4gIH0gZWxzZSBpZiAoeC5zaGFwZS5sZW5ndGggPT09IDIpIHtcbiAgICBjb25zdCB4QnVmID0gYmFja2VuZC5idWZmZXJTeW5jPFJhbmssICdmbG9hdDMyJz4oeCk7XG4gICAgY29uc3Qgd2VpZ2h0c0J1ZiA9IGJhY2tlbmQuYnVmZmVyU3luYzxSYW5rLCAnZmxvYXQzMic+KHdlaWdodHMpO1xuXG4gICAgY29uc3Qgb3V0QnVmID0gYmluY291bnRSZWR1Y2VJbXBsKHhCdWYsIHdlaWdodHNCdWYsIHNpemUsIGJpbmFyeU91dHB1dCk7XG5cbiAgICByZXR1cm4gYmFja2VuZC5tYWtlVGVuc29ySW5mbyhvdXRCdWYuc2hhcGUsIHdlaWdodHMuZHR5cGUsIG91dEJ1Zi52YWx1ZXMpO1xuICB9XG5cbiAgdGhyb3cgbmV3IEVycm9yKFxuICAgICAgYEVycm9yIGluIGRlbnNlQmluY291bnQ6IGlucHV0IG11c3QgYmUgYXQgbW9zdCByYW5rIDIsIGJ1dCBnb3QgcmFua2AgK1xuICAgICAgYCR7eC5zaGFwZS5sZW5ndGh9LmApO1xufVxuXG5leHBvcnQgY29uc3QgZGVuc2VCaW5jb3VudENvbmZpZzogS2VybmVsQ29uZmlnID0ge1xuICBrZXJuZWxOYW1lOiBEZW5zZUJpbmNvdW50LFxuICBiYWNrZW5kTmFtZTogJ2NwdScsXG4gIGtlcm5lbEZ1bmM6IGRlbnNlQmluY291bnQgYXMge30gYXMgS2VybmVsRnVuY1xufTtcbiJdfQ==","/**\n * @license\n * Copyright 2020 Google LLC. All Rights Reserved.\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n * =============================================================================\n */\nimport { DepthToSpace, util } from '@tensorflow/tfjs-core';\nexport function depthToSpace(args) {\n const { inputs, backend, attrs } = args;\n const { x } = inputs;\n const { blockSize, dataFormat } = attrs;\n util.assert(dataFormat === 'NHWC', () => `Only NHWC dataFormat supported on CPU for depthToSpace. Got ${dataFormat}`);\n const batchSize = x.shape[0];\n const inputHeight = x.shape[1];\n const inputWidth = x.shape[2];\n const inputDepth = x.shape[3];\n const outputHeight = inputHeight * blockSize;\n const outputWidth = inputWidth * blockSize;\n const outputDepth = inputDepth / (blockSize * blockSize);\n const xValues = backend.data.get(x.dataId).values;\n const result = new Float32Array(batchSize * outputHeight * outputWidth * outputDepth);\n let outputIdx = 0;\n for (let b = 0; b < batchSize; ++b) {\n for (let h = 0; h < outputHeight; ++h) {\n const inH = Math.floor(h / blockSize);\n const offsetH = (h % blockSize);\n for (let w = 0; w < outputWidth; ++w) {\n const inW = Math.floor(w / blockSize);\n const offsetW = (w % blockSize);\n const offsetD = (offsetH * blockSize + offsetW) * outputDepth;\n for (let d = 0; d < outputDepth; ++d) {\n const inD = d + offsetD;\n const inputIdx = inD + inputDepth * (inW + inputWidth * (inH + inputHeight * b));\n result[outputIdx++] = xValues[inputIdx];\n }\n }\n }\n }\n return backend.makeTensorInfo([batchSize, outputHeight, outputWidth, outputDepth], x.dtype, result);\n}\nexport const depthToSpaceConfig = {\n kernelName: DepthToSpace,\n backendName: 'cpu',\n kernelFunc: depthToSpace\n};\n//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiRGVwdGhUb1NwYWNlLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vLi4vdGZqcy1iYWNrZW5kLWNwdS9zcmMva2VybmVscy9EZXB0aFRvU3BhY2UudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUE7Ozs7Ozs7Ozs7Ozs7OztHQWVHO0FBRUgsT0FBTyxFQUFDLFlBQVksRUFBMkYsSUFBSSxFQUFDLE1BQU0sdUJBQXVCLENBQUM7QUFJbEosTUFBTSxVQUFVLFlBQVksQ0FBQyxJQUk1QjtJQUNDLE1BQU0sRUFBQyxNQUFNLEVBQUUsT0FBTyxFQUFFLEtBQUssRUFBQyxHQUFHLElBQUksQ0FBQztJQUN0QyxNQUFNLEVBQUMsQ0FBQyxFQUFDLEdBQUcsTUFBTSxDQUFDO0lBQ25CLE1BQU0sRUFBQyxTQUFTLEVBQUUsVUFBVSxFQUFDLEdBQUcsS0FBSyxDQUFDO0lBRXRDLElBQUksQ0FBQyxNQUFNLENBQ1AsVUFBVSxLQUFLLE1BQU0sRUFDckIsR0FBRyxFQUFFLENBQUMsK0RBQ0YsVUFBVSxFQUFFLENBQUMsQ0FBQztJQUV0QixNQUFNLFNBQVMsR0FBRyxDQUFDLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQyxDQUFDO0lBQzdCLE1BQU0sV0FBVyxHQUFHLENBQUMsQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDLENBQUM7SUFDL0IsTUFBTSxVQUFVLEdBQUcsQ0FBQyxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUMsQ0FBQztJQUM5QixNQUFNLFVBQVUsR0FBRyxDQUFDLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQyxDQUFDO0lBRTlCLE1BQU0sWUFBWSxHQUFHLFdBQVcsR0FBRyxTQUFTLENBQUM7SUFDN0MsTUFBTSxXQUFXLEdBQUcsVUFBVSxHQUFHLFNBQVMsQ0FBQztJQUMzQyxNQUFNLFdBQVcsR0FBRyxVQUFVLEdBQUcsQ0FBQyxTQUFTLEdBQUcsU0FBUyxDQUFDLENBQUM7SUFFekQsTUFBTSxPQUFPLEdBQUcsT0FBTyxDQUFDLElBQUksQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLE1BQU0sQ0FBQyxDQUFDLE1BQW9CLENBQUM7SUFDaEUsTUFBTSxNQUFNLEdBQ1IsSUFBSSxZQUFZLENBQUMsU0FBUyxHQUFHLFlBQVksR0FBRyxXQUFXLEdBQUcsV0FBVyxDQUFDLENBQUM7SUFFM0UsSUFBSSxTQUFTLEdBQUcsQ0FBQyxDQUFDO0lBQ2xCLEtBQUssSUFBSSxDQUFDLEdBQUcsQ0FBQyxFQUFFLENBQUMsR0FBRyxTQUFTLEVBQUUsRUFBRSxDQUFDLEVBQUU7UUFDbEMsS0FBSyxJQUFJLENBQUMsR0FBRyxDQUFDLEVBQUUsQ0FBQyxHQUFHLFlBQVksRUFBRSxFQUFFLENBQUMsRUFBRTtZQUNyQyxNQUFNLEdBQUcsR0FBRyxJQUFJLENBQUMsS0FBSyxDQUFDLENBQUMsR0FBRyxTQUFTLENBQUMsQ0FBQztZQUN0QyxNQUFNLE9BQU8sR0FBRyxDQUFDLENBQUMsR0FBRyxTQUFTLENBQUMsQ0FBQztZQUNoQyxLQUFLLElBQUksQ0FBQyxHQUFHLENBQUMsRUFBRSxDQUFDLEdBQUcsV0FBVyxFQUFFLEVBQUUsQ0FBQyxFQUFFO2dCQUNwQyxNQUFNLEdBQUcsR0FBRyxJQUFJLENBQUMsS0FBSyxDQUFDLENBQUMsR0FBRyxTQUFTLENBQUMsQ0FBQztnQkFDdEMsTUFBTSxPQUFPLEdBQUcsQ0FBQyxDQUFDLEdBQUcsU0FBUyxDQUFDLENBQUM7Z0JBQ2hDLE1BQU0sT0FBTyxHQUFHLENBQUMsT0FBTyxHQUFHLFNBQVMsR0FBRyxPQUFPLENBQUMsR0FBRyxXQUFXLENBQUM7Z0JBQzlELEtBQUssSUFBSSxDQUFDLEdBQUcsQ0FBQyxFQUFFLENBQUMsR0FBRyxXQUFXLEVBQUUsRUFBRSxDQUFDLEVBQUU7b0JBQ3BDLE1BQU0sR0FBRyxHQUFHLENBQUMsR0FBRyxPQUFPLENBQUM7b0JBQ3hCLE1BQU0sUUFBUSxHQUNWLEdBQUcsR0FBRyxVQUFVLEdBQUcsQ0FBQyxHQUFHLEdBQUcsVUFBVSxHQUFHLENBQUMsR0FBRyxHQUFHLFdBQVcsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDO29CQUNwRSxNQUFNLENBQUMsU0FBUyxFQUFFLENBQUMsR0FBRyxPQUFPLENBQUMsUUFBUSxDQUFDLENBQUM7aUJBQ3pDO2FBQ0Y7U0FDRjtLQUNGO0lBRUQsT0FBTyxPQUFPLENBQUMsY0FBYyxDQUN6QixDQUFDLFNBQVMsRUFBRSxZQUFZLEVBQUUsV0FBVyxFQUFFLFdBQVcsQ0FBQyxFQUFFLENBQUMsQ0FBQyxLQUFLLEVBQUUsTUFBTSxDQUFDLENBQUM7QUFDNUUsQ0FBQztBQUVELE1BQU0sQ0FBQyxNQUFNLGtCQUFrQixHQUFpQjtJQUM5QyxVQUFVLEVBQUUsWUFBWTtJQUN4QixXQUFXLEVBQUUsS0FBSztJQUNsQixVQUFVLEVBQUUsWUFBZ0M7Q0FDN0MsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbIi8qKlxuICogQGxpY2Vuc2VcbiAqIENvcHlyaWdodCAyMDIwIEdvb2dsZSBMTEMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuXG4gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgXCJMaWNlbnNlXCIpO1xuICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLlxuICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0XG4gKlxuICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wXG4gKlxuICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZVxuICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gXCJBUyBJU1wiIEJBU0lTLFxuICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuXG4gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kXG4gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS5cbiAqID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4gKi9cblxuaW1wb3J0IHtEZXB0aFRvU3BhY2UsIERlcHRoVG9TcGFjZUF0dHJzLCBEZXB0aFRvU3BhY2VJbnB1dHMsIEtlcm5lbENvbmZpZywgS2VybmVsRnVuYywgVGVuc29ySW5mbywgVHlwZWRBcnJheSwgdXRpbH0gZnJvbSAnQHRlbnNvcmZsb3cvdGZqcy1jb3JlJztcblxuaW1wb3J0IHtNYXRoQmFja2VuZENQVX0gZnJvbSAnLi4vYmFja2VuZF9jcHUnO1xuXG5leHBvcnQgZnVuY3Rpb24gZGVwdGhUb1NwYWNlKGFyZ3M6IHtcbiAgaW5wdXRzOiBEZXB0aFRvU3BhY2VJbnB1dHMsXG4gIGJhY2tlbmQ6IE1hdGhCYWNrZW5kQ1BVLFxuICBhdHRyczogRGVwdGhUb1NwYWNlQXR0cnNcbn0pOiBUZW5zb3JJbmZvIHtcbiAgY29uc3Qge2lucHV0cywgYmFja2VuZCwgYXR0cnN9ID0gYXJncztcbiAgY29uc3Qge3h9ID0gaW5wdXRzO1xuICBjb25zdCB7YmxvY2tTaXplLCBkYXRhRm9ybWF0fSA9IGF0dHJzO1xuXG4gIHV0aWwuYXNzZXJ0KFxuICAgICAgZGF0YUZvcm1hdCA9PT0gJ05IV0MnLFxuICAgICAgKCkgPT4gYE9ubHkgTkhXQyBkYXRhRm9ybWF0IHN1cHBvcnRlZCBvbiBDUFUgZm9yIGRlcHRoVG9TcGFjZS4gR290ICR7XG4gICAgICAgICAgZGF0YUZvcm1hdH1gKTtcblxuICBjb25zdCBiYXRjaFNpemUgPSB4LnNoYXBlWzBdO1xuICBjb25zdCBpbnB1dEhlaWdodCA9IHguc2hhcGVbMV07XG4gIGNvbnN0IGlucHV0V2lkdGggPSB4LnNoYXBlWzJdO1xuICBjb25zdCBpbnB1dERlcHRoID0geC5zaGFwZVszXTtcblxuICBjb25zdCBvdXRwdXRIZWlnaHQgPSBpbnB1dEhlaWdodCAqIGJsb2NrU2l6ZTtcbiAgY29uc3Qgb3V0cHV0V2lkdGggPSBpbnB1dFdpZHRoICogYmxvY2tTaXplO1xuICBjb25zdCBvdXRwdXREZXB0aCA9IGlucHV0RGVwdGggLyAoYmxvY2tTaXplICogYmxvY2tTaXplKTtcblxuICBjb25zdCB4VmFsdWVzID0gYmFja2VuZC5kYXRhLmdldCh4LmRhdGFJZCkudmFsdWVzIGFzIFR5cGVkQXJyYXk7XG4gIGNvbnN0IHJlc3VsdCA9XG4gICAgICBuZXcgRmxvYXQzMkFycmF5KGJhdGNoU2l6ZSAqIG91dHB1dEhlaWdodCAqIG91dHB1dFdpZHRoICogb3V0cHV0RGVwdGgpO1xuXG4gIGxldCBvdXRwdXRJZHggPSAwO1xuICBmb3IgKGxldCBiID0gMDsgYiA8IGJhdGNoU2l6ZTsgKytiKSB7XG4gICAgZm9yIChsZXQgaCA9IDA7IGggPCBvdXRwdXRIZWlnaHQ7ICsraCkge1xuICAgICAgY29uc3QgaW5IID0gTWF0aC5mbG9vcihoIC8gYmxvY2tTaXplKTtcbiAgICAgIGNvbnN0IG9mZnNldEggPSAoaCAlIGJsb2NrU2l6ZSk7XG4gICAgICBmb3IgKGxldCB3ID0gMDsgdyA8IG91dHB1dFdpZHRoOyArK3cpIHtcbiAgICAgICAgY29uc3QgaW5XID0gTWF0aC5mbG9vcih3IC8gYmxvY2tTaXplKTtcbiAgICAgICAgY29uc3Qgb2Zmc2V0VyA9ICh3ICUgYmxvY2tTaXplKTtcbiAgICAgICAgY29uc3Qgb2Zmc2V0RCA9IChvZmZzZXRIICogYmxvY2tTaXplICsgb2Zmc2V0VykgKiBvdXRwdXREZXB0aDtcbiAgICAgICAgZm9yIChsZXQgZCA9IDA7IGQgPCBvdXRwdXREZXB0aDsgKytkKSB7XG4gICAgICAgICAgY29uc3QgaW5EID0gZCArIG9mZnNldEQ7XG4gICAgICAgICAgY29uc3QgaW5wdXRJZHggPVxuICAgICAgICAgICAgICBpbkQgKyBpbnB1dERlcHRoICogKGluVyArIGlucHV0V2lkdGggKiAoaW5IICsgaW5wdXRIZWlnaHQgKiBiKSk7XG4gICAgICAgICAgcmVzdWx0W291dHB1dElkeCsrXSA9IHhWYWx1ZXNbaW5wdXRJZHhdO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfVxuICB9XG5cbiAgcmV0dXJuIGJhY2tlbmQubWFrZVRlbnNvckluZm8oXG4gICAgICBbYmF0Y2hTaXplLCBvdXRwdXRIZWlnaHQsIG91dHB1dFdpZHRoLCBvdXRwdXREZXB0aF0sIHguZHR5cGUsIHJlc3VsdCk7XG59XG5cbmV4cG9ydCBjb25zdCBkZXB0aFRvU3BhY2VDb25maWc6IEtlcm5lbENvbmZpZyA9IHtcbiAga2VybmVsTmFtZTogRGVwdGhUb1NwYWNlLFxuICBiYWNrZW5kTmFtZTogJ2NwdScsXG4gIGtlcm5lbEZ1bmM6IGRlcHRoVG9TcGFjZSBhcyB7fSBhcyBLZXJuZWxGdW5jXG59O1xuIl19","/**\n * @license\n * Copyright 2020 Google LLC. All Rights Reserved.\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n * =============================================================================\n */\nimport { backend_util, DepthwiseConv2dNative, TensorBuffer, util } from '@tensorflow/tfjs-core';\nimport { assertNotComplex } from '../cpu_util';\nexport function depthwiseConv2dNative(args) {\n const { inputs, backend, attrs } = args;\n const { x, filter } = inputs;\n const { strides, pad, dilations, dimRoundingMode } = attrs;\n assertNotComplex([x, filter], 'depthwiseConv2DNative');\n const xStrides = util.computeStrides(x.shape);\n const filterStrides = util.computeStrides(filter.shape);\n let $dilations = dilations;\n if ($dilations == null) {\n $dilations = [1, 1];\n }\n util.assert(backend_util.eitherStridesOrDilationsAreOne(strides, $dilations), () => 'Error in depthwiseConv2d: Either strides or dilations must be ' +\n `1. Got strides ${strides} and dilations '${$dilations}'`);\n const convInfo = backend_util.computeConv2DInfo(x.shape, filter.shape, strides, $dilations, pad, dimRoundingMode, true /* depthwise */);\n const { filterHeight, filterWidth, dilationHeight, dilationWidth, padInfo } = convInfo;\n const padLeft = padInfo.left;\n const padTop = padInfo.top;\n const chMul = convInfo.outChannels / convInfo.inChannels;\n const y = new TensorBuffer(convInfo.outShape, x.dtype);\n const xVals = backend.data.get(x.dataId).values;\n const wVals = backend.data.get(filter.dataId).values;\n const yVals = y.values;\n for (let b = 0; b < convInfo.batchSize; ++b) {\n const xOffset1 = b * xStrides[0];\n const yOffset1 = b * y.strides[0];\n for (let yR = 0; yR < convInfo.outHeight; ++yR) {\n const yOffset2 = yOffset1 + yR * y.strides[1];\n const xRCorner = yR * convInfo.strideHeight - padTop;\n for (let wR = 0; wR < filterHeight; ++wR) {\n const xR = xRCorner + wR * dilationHeight;\n if (xR < 0 || xR >= convInfo.inHeight) {\n continue;\n }\n const wOffset1 = wR * filterStrides[0];\n const xOffset2 = xOffset1 + xR * xStrides[1];\n for (let yC = 0; yC < convInfo.outWidth; ++yC) {\n const yOffset3 = yOffset2 + yC * y.strides[2];\n const xCCorner = yC * convInfo.strideWidth - padLeft;\n for (let wC = 0; wC < filterWidth; ++wC) {\n const xC = xCCorner + wC * dilationWidth;\n if (xC < 0 || xC >= convInfo.inWidth) {\n continue;\n }\n const wOffset2 = wOffset1 + wC * filterStrides[1];\n const xOffset3 = xOffset2 + xC * convInfo.inChannels;\n let yOffset4 = yOffset3;\n let wOffset3 = wOffset2;\n for (let d1 = 0; d1 < convInfo.inChannels; ++d1) {\n const xVal = xVals[xOffset3 + d1];\n for (let q = 0; q < chMul; ++q) {\n yVals[yOffset4 + q] += xVal * wVals[wOffset3 + q];\n }\n yOffset4 += chMul;\n wOffset3 += chMul;\n }\n }\n }\n }\n }\n }\n return backend.makeTensorInfo(y.shape, y.dtype, y.values);\n}\nexport const depthwiseConv2dNativeConfig = {\n kernelName: DepthwiseConv2dNative,\n backendName: 'cpu',\n kernelFunc: depthwiseConv2dNative\n};\n//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiRGVwdGh3aXNlQ29udjJkTmF0aXZlLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vLi4vdGZqcy1iYWNrZW5kLWNwdS9zcmMva2VybmVscy9EZXB0aHdpc2VDb252MmROYXRpdmUudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUE7Ozs7Ozs7Ozs7Ozs7OztHQWVHO0FBRUgsT0FBTyxFQUFDLFlBQVksRUFBRSxxQkFBcUIsRUFBcUYsWUFBWSxFQUEwQixJQUFJLEVBQUMsTUFBTSx1QkFBdUIsQ0FBQztBQUd6TSxPQUFPLEVBQUMsZ0JBQWdCLEVBQUMsTUFBTSxhQUFhLENBQUM7QUFFN0MsTUFBTSxVQUFVLHFCQUFxQixDQUFDLElBSXJDO0lBQ0MsTUFBTSxFQUFDLE1BQU0sRUFBRSxPQUFPLEVBQUUsS0FBSyxFQUFDLEdBQUcsSUFBSSxDQUFDO0lBQ3RDLE1BQU0sRUFBQyxDQUFDLEVBQUUsTUFBTSxFQUFDLEdBQUcsTUFBTSxDQUFDO0lBQzNCLE1BQU0sRUFBQyxPQUFPLEVBQUUsR0FBRyxFQUFFLFNBQVMsRUFBRSxlQUFlLEVBQUMsR0FBRyxLQUFLLENBQUM7SUFFekQsZ0JBQWdCLENBQUMsQ0FBQyxDQUFDLEVBQUUsTUFBTSxDQUFDLEVBQUUsdUJBQXVCLENBQUMsQ0FBQztJQUV2RCxNQUFNLFFBQVEsR0FBRyxJQUFJLENBQUMsY0FBYyxDQUFDLENBQUMsQ0FBQyxLQUFLLENBQUMsQ0FBQztJQUM5QyxNQUFNLGFBQWEsR0FBRyxJQUFJLENBQUMsY0FBYyxDQUFDLE1BQU0sQ0FBQyxLQUFLLENBQUMsQ0FBQztJQUV4RCxJQUFJLFVBQVUsR0FBRyxTQUFTLENBQUM7SUFDM0IsSUFBSSxVQUFVLElBQUksSUFBSSxFQUFFO1FBQ3RCLFVBQVUsR0FBRyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQztLQUNyQjtJQUVELElBQUksQ0FBQyxNQUFNLENBQ1AsWUFBWSxDQUFDLDhCQUE4QixDQUFDLE9BQU8sRUFBRSxV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LFVBQVUsRUFBRSxxQkFBeUM7Q0FDdEQsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbIi8qKlxuICogQGxpY2Vuc2VcbiAqIENvcHlyaWdodCAyMDIwIEdvb2dsZSBMTEMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuXG4gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgXCJMaWNlbnNlXCIpO1xuICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLlxuICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0XG4gKlxuICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wXG4gKlxuICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZVxuICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gXCJBUyBJU1wiIEJBU0lTLFxuICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuXG4gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kXG4gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS5cbiAqID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4gKi9cblxuaW1wb3J0IHtiYWNrZW5kX3V0aWwsIERlcHRod2lzZUNvbnYyZE5hdGl2ZSwgRGVwdGh3aXNlQ29udjJkTmF0aXZlQXR0cnMsIERlcHRod2lzZUNvbnYyZE5hdGl2ZUlucHV0cywgS2VybmVsQ29uZmlnLCBLZXJuZWxGdW5jLCBUZW5zb3JCdWZmZXIsIFRlbnNvckluZm8sIFR5cGVkQXJyYXksIHV0aWx9IGZyb20gJ0B0ZW5zb3JmbG93L3RmanMtY29yZSc7XG5cbmltcG9ydCB7TWF0aEJhY2tlbmRDUFV9IGZyb20gJy4uL2JhY2tlbmRfY3B1JztcbmltcG9ydCB7YXNzZXJ0Tm90Q29tcGxleH0gZnJvbSAnLi4vY3B1X3V0aWwnO1xuXG5leHBvcnQgZnVuY3Rpb24gZGVwdGh3aXNlQ29udjJkTmF0aXZlKGFyZ3M6IHtcbiAgaW5wdXRzOiBEZXB0aHdpc2VDb252MmROYXRpdmVJbnB1dHMsXG4gIGJhY2tlbmQ6IE1hdGhCYWNrZW5kQ1BVLFxuICBhdHRyczogRGVwdGh3aXNlQ29udjJkTmF0aXZlQXR0cnNcbn0pOiBUZW5zb3JJbmZvIHtcbiAgY29uc3Qge2lucHV0cywgYmFja2VuZCwgYXR0cnN9ID0gYXJncztcbiAgY29uc3Qge3gsIGZpbHRlcn0gPSBpbnB1dHM7XG4gIGNvbnN0IHtzdHJpZGVzLCBwYWQsIGRpbGF0aW9ucywgZGltUm91bmRpbmdNb2RlfSA9IGF0dHJzO1xuXG4gIGFzc2VydE5vdENvbXBsZXgoW3gsIGZpbHRlcl0sICdkZXB0aHdpc2VDb252MkROYXRpdmUnKTtcblxuICBjb25zdCB4U3RyaWRlcyA9IHV0aWwuY29tcHV0ZVN0cmlkZXMoeC5zaGFwZSk7XG4gIGNvbnN0IGZpbHRlclN0cmlkZXMgPSB1dGlsLmNvbXB1dGVTdHJpZGVzKGZpbHRlci5zaGFwZSk7XG5cbiAgbGV0ICRkaWxhdGlvbnMgPSBkaWxhdGlvbnM7XG4gIGlmICgkZGlsYXRpb25zID09IG51bGwpIHtcbiAgICAkZGlsYXRpb25zID0gWzEsIDFdO1xuICB9XG5cbiAgdXRpbC5hc3NlcnQoXG4gICAgICBiYWNrZW5kX3V0aWwuZWl0aGVyU3RyaWRlc09yRGlsYXRpb25zQXJlT25lKHN0cmlkZXMsICRkaWxhdGlvbnMpLFxuICAgICAgKCkgPT4gJ0Vycm9yIGluIGRlcHRod2lzZUNvbnYyZDogRWl0aGVyIHN0cmlkZXMgb3IgZGlsYXRpb25zIG11c3QgYmUgJyArXG4gICAgICAgICAgYDEuIEdvdCBzdHJpZGVzICR7c3RyaWRlc30gYW5kIGRpbGF0aW9ucyAnJHskZGlsYXRpb25zfSdgKTtcblxuICBjb25zdCBjb252SW5mbyA9IGJhY2tlbmRfdXRpbC5jb21wdXRlQ29udjJESW5mbyhcbiAgICAgIHguc2hhcGUgYXMgW251bWJlciwgbnVtYmVyLCBudW1iZXIsIG51bWJlcl0sXG4gICAgICBmaWx0ZXIuc2hhcGUgYXMgW251bWJlciwgbnVtYmVyLCBudW1iZXIsIG51bWJlcl0sIHN0cmlkZXMsICRkaWxhdGlvbnMsXG4gICAgICBwYWQsIGRpbVJvdW5kaW5nTW9kZSwgdHJ1ZSAvKiBkZXB0aHdpc2UgKi8pO1xuXG4gIGNvbnN0IHtmaWx0ZXJIZWlnaHQsIGZpbHRlcldpZHRoLCBkaWxhdGlvbkhlaWdodCwgZGlsYXRpb25XaWR0aCwgcGFkSW5mb30gPVxuICAgICAgY29udkluZm87XG4gIGNvbnN0IHBhZExlZnQgPSBwYWRJbmZvLmxlZnQ7XG4gIGNvbnN0IHBhZFRvcCA9IHBhZEluZm8udG9wO1xuICBjb25zdCBjaE11bCA9IGNvbnZJbmZvLm91dENoYW5uZWxzIC8gY29udkluZm8uaW5DaGFubmVscztcbiAgY29uc3QgeSA9IG5ldyBUZW5zb3JCdWZmZXIoY29udkluZm8ub3V0U2hhcGUsIHguZHR5cGUgYXMgJ2Zsb2F0MzInKTtcbiAgY29uc3QgeFZhbHMgPSBiYWNrZW5kLmRhdGEuZ2V0KHguZGF0YUlkKS52YWx1ZXMgYXMgVHlwZWRBcnJheTtcbiAgY29uc3Qgd1ZhbHMgPSBiYWNrZW5kLmRhdGEuZ2V0KGZpbHRlci5kYXRhSWQpLnZhbHVlcyBhcyBUeXBlZEFycmF5O1xuICBjb25zdCB5VmFscyA9IHkudmFsdWVzO1xuXG4gIGZvciAobGV0IGIgPSAwOyBiIDwgY29udkluZm8uYmF0Y2hTaXplOyArK2IpIHtcbiAgICBjb25zdCB4T2Zmc2V0MSA9IGIgKiB4U3RyaWRlc1swXTtcbiAgICBjb25zdCB5T2Zmc2V0MSA9IGIgKiB5LnN0cmlkZXNbMF07XG4gICAgZm9yIChsZXQgeVIgPSAwOyB5UiA8IGNvbnZJbmZvLm91dEhlaWdodDsgKyt5Uikge1xuICAgICAgY29uc3QgeU9mZnNldDIgPSB5T2Zmc2V0MSArIHlSICogeS5zdHJpZGVzWzFdO1xuICAgICAgY29uc3QgeFJDb3JuZXIgPSB5UiAqIGNvbnZJbmZvLnN0cmlkZUhlaWdodCAtIHBhZFRvcDtcbiAgICAgIGZvciAobGV0IHdSID0gMDsgd1IgPCBmaWx0ZXJIZWlnaHQ7ICsrd1IpIHtcbiAgICAgICAgY29uc3QgeFIgPSB4UkNvcm5lciArIHdSICogZGlsYXRpb25IZWlnaHQ7XG4gICAgICAgIGlmICh4UiA8IDAgfHwgeFIgPj0gY29udkluZm8uaW5IZWlnaHQpIHtcbiAgICAgICAgICBjb250aW51ZTtcbiAgICAgICAgfVxuICAgICAgICBjb25zdCB3T2Zmc2V0MSA9IHdSICogZmlsdGVyU3RyaWRlc1swXTtcbiAgICAgICAgY29uc3QgeE9mZnNldDIgPSB4T2Zmc2V0MSArIHhSICogeFN0cmlkZXNbMV07XG4gICAgICAgIGZvciAobGV0IHlDID0gMDsgeUMgPCBjb252SW5mby5vdXRXaWR0aDsgKyt5Qykge1xuICAgICAgICAgIGNvbnN0IHlPZmZzZXQzID0geU9mZnNldDIgKyB5QyAqIHkuc3RyaWRlc1syXTtcbiAgICAgICAgICBjb25zdCB4Q0Nvcm5lciA9IHlDICogY29udkluZm8uc3RyaWRlV2lkdGggLSBwYWRMZWZ0O1xuICAgICAgICAgIGZvciAobGV0IHdDID0gMDsgd0MgPCBmaWx0ZXJXaWR0aDsgKyt3Qykge1xuICAgICAgICAgICAgY29uc3QgeEMgPSB4Q0Nvcm5lciArIHdDICogZGlsYXRpb25XaWR0aDtcbiAgICAgICAgICAgIGlmICh4QyA8IDAgfHwgeEMgPj0gY29udkluZm8uaW5XaWR0aCkge1xuICAgICAgICAgICAgICBjb250aW51ZTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGNvbnN0IHdPZmZzZXQyID0gd09mZnNldDEgKyB3QyAqIGZpbHRlclN0cmlkZXNbMV07XG4gICAgICAgICAgICBjb25zdCB4T2Zmc2V0MyA9IHhPZmZzZXQyICsgeEMgKiBjb252SW5mby5pbkNoYW5uZWxzO1xuICAgICAgICAgICAgbGV0IHlPZmZzZXQ0ID0geU9mZnNldDM7XG4gICAgICAgICAgICBsZXQgd09mZnNldDMgPSB3T2Zmc2V0MjtcbiAgICAgICAgICAgIGZvciAobGV0IGQxID0gMDsgZDEgPCBjb252SW5mby5pbkNoYW5uZWxzOyArK2QxKSB7XG4gICAgICAgICAgICAgIGNvbnN0IHhWYWwgPSB4VmFsc1t4T2Zmc2V0MyArIGQxXTtcbiAgICAgICAgICAgICAgZm9yIChsZXQgcSA9IDA7IHEgPCBjaE11bDsgKytxKSB7XG4gICAgICAgICAgICAgICAgeVZhbHNbeU9mZnNldDQgKyBxXSArPSB4VmFsICogd1ZhbHNbd09mZnNldDMgKyBxXTtcbiAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICB5T2Zmc2V0NCArPSBjaE11bDtcbiAgICAgICAgICAgICAgd09mZnNldDMgKz0gY2hNdWw7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICB9XG4gICAgfVxuICB9XG5cbiAgcmV0dXJuIGJhY2tlbmQubWFrZVRlbnNvckluZm8oeS5zaGFwZSwgeS5kdHlwZSwgeS52YWx1ZXMpO1xufVxuXG5leHBvcnQgY29uc3QgZGVwdGh3aXNlQ29udjJkTmF0aXZlQ29uZmlnOiBLZXJuZWxDb25maWcgPSB7XG4gIGtlcm5lbE5hbWU6IERlcHRod2lzZUNvbnYyZE5hdGl2ZSxcbiAgYmFja2VuZE5hbWU6ICdjcHUnLFxuICBrZXJuZWxGdW5jOiBkZXB0aHdpc2VDb252MmROYXRpdmUgYXMge30gYXMgS2VybmVsRnVuY1xufTtcbiJdfQ==","/**\n * @license\n * Copyright 2020 Google LLC. All Rights Reserved.\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n * =============================================================================\n */\nimport { backend_util, DepthwiseConv2dNativeBackpropFilter, TensorBuffer } from '@tensorflow/tfjs-core';\nimport { assertNotComplex } from '../cpu_util';\nexport function depthwiseConv2dNativeBackpropFilter(args) {\n const { inputs, backend, attrs } = args;\n const { x, dy } = inputs;\n const { strides, dilations, pad, dimRoundingMode, filterShape } = attrs;\n assertNotComplex([x, dy], 'depthwiseConv2dNativeBackpropFilter');\n const convInfo = backend_util.computeConv2DInfo(x.shape, filterShape, strides, dilations, pad, dimRoundingMode, true /* depthwise */);\n const { strideHeight, strideWidth, filterHeight, filterWidth } = convInfo;\n const dW = new TensorBuffer(convInfo.filterShape, 'float32');\n const leftPad = convInfo.padInfo.left;\n const topPad = convInfo.padInfo.top;\n const chMul = convInfo.outChannels / convInfo.inChannels;\n const xVals = backend.data.get(x.dataId).values;\n const xBuf = new TensorBuffer(x.shape, x.dtype, xVals);\n const dyVals = backend.data.get(dy.dataId).values;\n const dyBuf = new TensorBuffer(dy.shape, dy.dtype, dyVals);\n for (let wR = 0; wR < filterHeight; ++wR) {\n const yRMin = Math.max(0, Math.ceil((topPad - wR) / strideHeight));\n const yRMax = Math.min(convInfo.outHeight, (convInfo.inHeight + topPad - wR) / strideHeight);\n for (let wC = 0; wC < filterWidth; ++wC) {\n const yCMin = Math.max(0, Math.ceil((leftPad - wC) / strideWidth));\n const yCMax = Math.min(convInfo.outWidth, (convInfo.inWidth + leftPad - wC) / strideWidth);\n for (let d2 = 0; d2 < convInfo.outChannels; ++d2) {\n const d1 = Math.trunc(d2 / chMul);\n const dm = d2 % chMul;\n let dotProd = 0;\n for (let b = 0; b < convInfo.batchSize; ++b) {\n for (let yR = yRMin; yR < yRMax; ++yR) {\n const xR = wR + yR * strideHeight - topPad;\n for (let yC = yCMin; yC < yCMax; ++yC) {\n const xC = wC + yC * strideWidth - leftPad;\n dotProd += xBuf.get(b, xR, xC, d1) *\n dyBuf.get(b, yR, yC, d2);\n }\n }\n }\n dW.set(dotProd, wR, wC, d1, dm);\n }\n }\n }\n return backend.makeTensorInfo(dW.shape, dW.dtype, dW.values);\n}\nexport const depthwiseConv2dNativeBackpropFilterConfig = {\n kernelName: DepthwiseConv2dNativeBackpropFilter,\n backendName: 'cpu',\n kernelFunc: depthwiseConv2dNativeBackpropFilter\n};\n//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiRGVwdGh3aXNlQ29udjJkTmF0aXZlQmFja3Byb3BGaWx0ZXIuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi8uLi90ZmpzLWJhY2tlbmQtY3B1L3NyYy9rZXJuZWxzL0RlcHRod2lzZUNvbnYyZE5hdGl2ZUJhY2twcm9wRmlsdGVyLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBOzs7Ozs7Ozs7Ozs7Ozs7R0FlRztBQUVILE9BQU8sRUFBQyxZQUFZLEVBQUUsbUNBQW1DLEVBQWlILFlBQVksRUFBeUIsTUFBTSx1QkFBdUIsQ0FBQztBQUc3TyxPQUFPLEVBQUMsZ0JBQWdCLEVBQUMsTUFBTSxhQUFhLENBQUM7QUFFN0MsTUFBTSxVQUFVLG1DQUFtQyxDQUFDLElBSW5EO0lBQ0MsTUFBTSxFQUFDLE1BQU0sRUFBRSxPQUFPLEVBQUUsS0FBSyxFQUFDLEdBQUcsSUFBSSxDQUFDO0lBQ3RDLE1BQU0sRUFBQyxDQUFDLEVBQUUsRUFBRSxFQUFDLEdBQUcsTUFBTSxDQUFDO0lBQ3ZCLE1BQU0sRUFBQyxPQUFPLEVBQUUsU0FBUyxFQUFFLEdBQUcsRUFBRSxlQUFlLEVBQUUsV0FBVyxFQUFDLEdBQUcsS0FBSyxDQUFDO0lBRXRFLGdCQUFnQixDQUFDLENBQUMsQ0FBQyxFQUFFLEVBQUUsQ0FBQyxFQUFFLHFDQUFxQyxDQUFDLENBQUM7SUFFakUsTUFBTSxRQUFRLEdBQUcsWUFBWSxDQUFDLGlCQUFpQixDQUMzQyxDQUFDLENBQUMsS0FBeUMsRUFBRSxXQUFXLEVBQUUsT0FBTyxFQUNqRSxTQUFTLEVBQUUsR0FBRyxFQUFFLGVBQWUsRUFBRSxJQUFJLENBQUMsZUFBZSxDQUFDLENBQUM7SUFFM0QsTUFBTSxFQUFDLFlBQVksRUFBRSxXQUFXLEVBQUUsWUFBWSxFQUFFLFdBQVcsRUFBQyxHQUFHLFFBQVEsQ0FBQztJQUV4RSxNQUFNLEVBQUUsR0FBRyxJQUFJLFlBQVksQ0FBQyxRQUFRLENBQUMsV0FBVyxFQUFFLFNBQVMsQ0FB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QUUsRUFBRSxDQUFZO2dDQUN6QyxLQUFLLENBQUMsR0FBRyxDQUFDLENBQUMsRUFBRSxFQUFFLEVBQUUsRUFBRSxFQUFFLEVBQUUsQ0FBWSxDQUFDO3lCQUMxQztxQkFDRjtpQkFDRjtnQkFDRCxFQUFFLENBQUMsR0FBRyxDQUFDLE9BQU8sRUFBRSxFQUFFLEVBQUUsRUFBRSxFQUFFLEVBQUUsRUFBRSxFQUFFLENBQUMsQ0FBQzthQUNqQztTQUNGO0tBQ0Y7SUFFRCxPQUFPLE9BQU8sQ0FBQyxjQUFjLENBQUMsRUFBRSxDQUFDLEtBQUssRUFBRSxFQUFFLENBQUMsS0FBSyxFQUFFLEVBQUUsQ0FBQyxNQUFNLENBQUMsQ0FBQztBQUMvRCxDQUFDO0FBRUQsTUFBTSxDQUFDLE1BQU0seUNBQXlDLEdBQWlCO0lBQ3JFLFVBQVUsRUFBRSxtQ0FBbUM7SUFDL0MsV0FBVyxFQUFFLEtBQUs7SUFDbEIsVUFBVSxFQUFFLG1DQUF1RDtDQUNwRSxDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiLyoqXG4gKiBAbGljZW5zZVxuICogQ29weXJpZ2h0IDIwMjAgR29vZ2xlIExMQy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC5cbiAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSBcIkxpY2Vuc2VcIik7XG4gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuXG4gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXRcbiAqXG4gKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjBcbiAqXG4gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlXG4gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiBcIkFTIElTXCIgQkFTSVMsXG4gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC5cbiAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmRcbiAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLlxuICogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbiAqL1xuXG5pbXBvcnQge2JhY2tlbmRfdXRpbCwgRGVwdGh3aXNlQ29udjJkTmF0aXZlQmFja3Byb3BGaWx0ZXIsIERlcHRod2lzZUNvbnYyZE5hdGl2ZUJhY2twcm9wRmlsdGVyQXR0cnMsIERlcHRod2lzZUNvbnYyZE5hdGl2ZUJhY2twcm9wRmlsdGVySW5wdXRzLCBLZXJuZWxDb25maWcsIEtlcm5lbEZ1bmMsIFRlbnNvckJ1ZmZlciwgVGVuc29ySW5mbywgVHlwZWRBcnJheX0gZnJvbSAnQHRlbnNvcmZsb3cvdGZqcy1jb3JlJztcblxuaW1wb3J0IHtNYXRoQmFja2VuZENQVX0gZnJvbSAnLi4vYmFja2VuZF9jcHUnO1xuaW1wb3J0IHthc3NlcnROb3RDb21wbGV4fSBmcm9tICcuLi9jcHVfdXRpbCc7XG5cbmV4cG9ydCBmdW5jdGlvbiBkZXB0aHdpc2VDb252MmROYXRpdmVCYWNrcHJvcEZpbHRlcihhcmdzOiB7XG4gIGlucHV0czogRGVwdGh3aXNlQ29udjJkTmF0aXZlQmFja3Byb3BGaWx0ZXJJbnB1dHMsXG4gIGJhY2tlbmQ6IE1hdGhCYWNrZW5kQ1BVLFxuICBhdHRyczogRGVwdGh3aXNlQ29udjJkTmF0aXZlQmFja3Byb3BGaWx0ZXJBdHRyc1xufSk6IFRlbnNvckluZm8ge1xuICBjb25zdCB7aW5wdXRzLCBiYWNrZW5kLCBhdHRyc30gPSBhcmdzO1xuICBjb25zdCB7eCwgZHl9ID0gaW5wdXRzO1xuICBjb25zdCB7c3RyaWRlcywgZGlsYXRpb25zLCBwYWQsIGRpbVJvdW5kaW5nTW9kZSwgZmlsdGVyU2hhcGV9ID0gYXR0cnM7XG5cbiAgYXNzZXJ0Tm90Q29tcGxleChbeCwgZHldLCAnZGVwdGh3aXNlQ29udjJkTmF0aXZlQmFja3Byb3BGaWx0ZXInKTtcblxuICBjb25zdCBjb252SW5mbyA9IGJhY2tlbmRfdXRpbC5jb21wdXRlQ29udjJESW5mbyhcbiAgICAgIHguc2hhcGUgYXMgW251bWJlciwgbnVtYmVyLCBudW1iZXIsIG51bWJlcl0sIGZpbHRlclNoYXBlLCBzdHJpZGVzLFxuICAgICAgZGlsYXRpb25zLCBwYWQsIGRpbVJvdW5kaW5nTW9kZSwgdHJ1ZSAvKiBkZXB0aHdpc2UgKi8pO1xuXG4gIGNvbnN0IHtzdHJpZGVIZWlnaHQsIHN0cmlkZVdpZHRoLCBmaWx0ZXJIZWlnaHQsIGZpbHRlcldpZHRofSA9IGNvbnZJbmZvO1xuXG4gIGNvbnN0IGRXID0gbmV3IFRlbnNvckJ1ZmZlcihjb252SW5mby5maWx0ZXJTaGFwZSwgJ2Zsb2F0MzInKTtcblxuICBjb25zdCBsZWZ0UGFkID0gY29udkluZm8ucGFkSW5mby5sZWZ0O1xuICBjb25zdCB0b3BQYWQgPSBjb252SW5mby5wYWRJbmZvLnRvcDtcbiAgY29uc3QgY2hNdWwgPSBjb252SW5mby5vdXRDaGFubmVscyAvIGNvbnZJbmZvLmluQ2hhbm5lbHM7XG5cbiAgY29uc3QgeFZhbHMgPSBiYWNrZW5kLmRhdGEuZ2V0KHguZGF0YUlkKS52YWx1ZXMgYXMgVHlwZWRBcnJheTtcbiAgY29uc3QgeEJ1ZiA9IG5ldyBUZW5zb3JCdWZmZXIoeC5zaGFwZSwgeC5kdHlwZSwgeFZhbHMpO1xuICBjb25zdCBkeVZhbHMgPSBiYWNrZW5kLmRhdGEuZ2V0KGR5LmRhdGFJZCkudmFsdWVzIGFzIFR5cGVkQXJyYXk7XG4gIGNvbnN0IGR5QnVmID0gbmV3IFRlbnNvckJ1ZmZlcihkeS5zaGFwZSwgZHkuZHR5cGUsIGR5VmFscyk7XG4gIGZvciAobGV0IHdSID0gMDsgd1IgPCBmaWx0ZXJIZWlnaHQ7ICsrd1IpIHtcbiAgICBjb25zdCB5Uk1pbiA9IE1hdGgubWF4KDAsIE1hdGguY2VpbCgodG9wUGFkIC0gd1IpIC8gc3RyaWRlSGVpZ2h0KSk7XG4gICAgY29uc3QgeVJNYXggPSBNYXRoLm1pbihcbiAgICAgICAgY29udkluZm8ub3V0SGVpZ2h0LCAoY29udkluZm8uaW5IZWlnaHQgKyB0b3BQYWQgLSB3UikgLyBzdHJpZGVIZWlnaHQpO1xuXG4gICAgZm9yIChsZXQgd0MgPSAwOyB3QyA8IGZpbHRlcldpZHRoOyArK3dDKSB7XG4gICAgICBjb25zdCB5Q01pbiA9IE1hdGgubWF4KDAsIE1hdGguY2VpbCgobGVmdFBhZCAtIHdDKSAvIHN0cmlkZVdpZHRoKSk7XG4gICAgICBjb25zdCB5Q01heCA9IE1hdGgubWluKFxuICAgICAgICAgIGNvbnZJbmZvLm91dFdpZHRoLCAoY29udkluZm8uaW5XaWR0aCArIGxlZnRQYWQgLSB3QykgLyBzdHJpZGVXaWR0aCk7XG5cbiAgICAgIGZvciAobGV0IGQyID0gMDsgZDIgPCBjb252SW5mby5vdXRDaGFubmVsczsgKytkMikge1xuICAgICAgICBjb25zdCBkMSA9IE1hdGgudHJ1bmMoZDIgLyBjaE11bCk7XG4gICAgICAgIGNvbnN0IGRtID0gZDIgJSBjaE11bDtcblxuICAgICAgICBsZXQgZG90UHJvZCA9IDA7XG4gICAgICAgIGZvciAobGV0IGIgPSAwOyBiIDwgY29udkluZm8uYmF0Y2hTaXplOyArK2IpIHtcbiAgICAgICAgICBmb3IgKGxldCB5UiA9IHlSTWluOyB5UiA8IHlSTWF4OyArK3lSKSB7XG4gICAgICAgICAgICBjb25zdCB4UiA9IHdSICsgeVIgKiBzdHJpZGVIZWlnaHQgLSB0b3BQYWQ7XG4gICAgICAgICAgICBmb3IgKGxldCB5QyA9IHlDTWluOyB5QyA8IHlDTWF4OyArK3lDKSB7XG4gICAgICAgICAgICAgIGNvbnN0IHhDID0gd0MgKyB5QyAqIHN0cmlkZVdpZHRoIC0gbGVmdFBhZDtcbiAgICAgICAgICAgICAgZG90UHJvZCArPSAoeEJ1Zi5nZXQoYiwgeFIsIHhDLCBkMSkgYXMgbnVtYmVyKSAqXG4gICAgICAgICAgICAgICAgICAoZHlCdWYuZ2V0KGIsIHlSLCB5QywgZDIpIGFzIG51bWJlcik7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIGRXLnNldChkb3RQcm9kLCB3Uiwgd0MsIGQxLCBkbSk7XG4gICAgICB9XG4gICAgfVxuICB9XG5cbiAgcmV0dXJuIGJhY2tlbmQubWFrZVRlbnNvckluZm8oZFcuc2hhcGUsIGRXLmR0eXBlLCBkVy52YWx1ZXMpO1xufVxuXG5leHBvcnQgY29uc3QgZGVwdGh3aXNlQ29udjJkTmF0aXZlQmFja3Byb3BGaWx0ZXJDb25maWc6IEtlcm5lbENvbmZpZyA9IHtcbiAga2VybmVsTmFtZTogRGVwdGh3aXNlQ29udjJkTmF0aXZlQmFja3Byb3BGaWx0ZXIsXG4gIGJhY2tlbmROYW1lOiAnY3B1JyxcbiAga2VybmVsRnVuYzogZGVwdGh3aXNlQ29udjJkTmF0aXZlQmFja3Byb3BGaWx0ZXIgYXMge30gYXMgS2VybmVsRnVuY1xufTtcbiJdfQ==","/**\n * @license\n * Copyright 2020 Google LLC. All Rights Reserved.\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n * =============================================================================\n */\nimport { backend_util, DepthwiseConv2dNativeBackpropInput, TensorBuffer, util } from '@tensorflow/tfjs-core';\nimport { assertNotComplex } from '../cpu_util';\nexport function depthwiseConv2dNativeBackpropInput(args) {\n const { inputs, backend, attrs } = args;\n const { dy, filter } = inputs;\n const { strides, dilations, pad, dimRoundingMode, inputShape } = attrs;\n assertNotComplex([dy, filter], 'depthwiseConv2DNativeBackpropInput');\n const dyStrides = util.computeStrides(dy.shape);\n const filterStrides = util.computeStrides(filter.shape);\n const convInfo = backend_util.computeConv2DInfo(inputShape, filter.shape, strides, dilations, pad, dimRoundingMode, true /* depthwise */);\n const dx = new TensorBuffer(convInfo.inShape, 'float32');\n const dxValues = dx.values;\n const [dxS0, dxS1, dxS2] = dx.strides;\n const dyValues = backend.data.get(dy.dataId).values;\n const [dyS0, dyS1, dyS2] = dyStrides;\n const fltValues = backend.data.get(filter.dataId).values;\n const [fltS0, fltS1, fltS2] = filterStrides;\n const { batchSize, filterHeight, filterWidth, inChannels, inHeight, inWidth, outChannels, outHeight, outWidth, strideHeight, strideWidth } = convInfo;\n const topPad = filterHeight - 1 - convInfo.padInfo.top;\n const leftPad = filterWidth - 1 - convInfo.padInfo.left;\n const chMul = outChannels / inChannels;\n for (let b = 0; b < batchSize; ++b) {\n for (let d1 = 0; d1 < inChannels; ++d1) {\n for (let xR = 0; xR < inHeight; ++xR) {\n const xRCorner = xR - topPad;\n const xRMin = Math.max(0, Math.ceil(xRCorner / strideHeight));\n const yRMax = Math.min(outHeight, (filterHeight + xRCorner) / strideHeight);\n for (let xC = 0; xC < inWidth; ++xC) {\n const xCCorner = xC - leftPad;\n const xCMin = Math.max(0, Math.ceil(xCCorner / strideWidth));\n const yCMax = Math.min(outWidth, (filterWidth + xCCorner) / strideWidth);\n let dotProd = 0;\n for (let yR = xRMin; yR < yRMax; ++yR) {\n const wR = yR * strideHeight - xRCorner;\n for (let yC = xCMin; yC < yCMax; ++yC) {\n const wC = yC * strideWidth - xCCorner;\n const dyOffset = dyS0 * b + dyS1 * yR + dyS2 * yC;\n const fltOffset = fltS0 * (filterHeight - 1 - wR) +\n fltS1 * (filterWidth - 1 - wC) + fltS2 * d1;\n for (let dm = 0; dm < chMul; ++dm) {\n const d2 = d1 * chMul + dm;\n const pixel = dyValues[dyOffset + d2];\n const weight = fltValues[fltOffset + dm];\n dotProd += pixel * weight;\n }\n }\n }\n dxValues[dxS0 * b + dxS1 * xR + dxS2 * xC + d1] = dotProd;\n }\n }\n }\n }\n return backend.makeTensorInfo(dx.shape, dx.dtype, dx.values);\n}\nexport const depthwiseConv2dNativeBackpropInputConfig = {\n kernelName: DepthwiseConv2dNativeBackpropInput,\n backendName: 'cpu',\n kernelFunc: depthwiseConv2dNativeBackpropInput\n};\n//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiRGVwdGh3aXNlQ29udjJkTmF0aXZlQmFja3Byb3BJbnB1dC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uLy4uL3RmanMtYmFja2VuZC1jcHUvc3JjL2tlcm5lbHMvRGVwdGh3aXNlQ29udjJkTmF0aXZlQmFja3Byb3BJbnB1dC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQTs7Ozs7Ozs7Ozs7Ozs7O0dBZUc7QUFFSCxPQUFPLEVBQUMsWUFBWSxFQUFFLGtDQUFrQyxFQUErRyxZQUFZLEVBQTBCLElBQUksRUFBQyxNQUFNLHVCQUF1QixDQUFDO0FBR2hQLE9BQU8sRUFBQyxnQkFBZ0IsRUFBQyxNQUFNLGFBQWEsQ0FBQztBQUU3QyxNQUFNLFVBQVUsa0NBQWtDLENBQUMsSUFJbEQ7SUFDQyxNQUFNLEVBQUMsTUFBTSxFQUFFLE9BQU8sRUFBRSxLQUFLLEVBQUMsR0FBRyxJQUFJLENBQUM7SUFDdEMsTUFBTSxFQUFDLEVBQUUsRUFBRSxNQUFNLEVBQUMsR0FBRyxNQUFNLENBQUM7SUFDNUIsTUFBTSxFQUFDLE9BQU8sRUFBRSxTQUFTLEVBQUUsR0FBRyxFQUFFLGVBQWUsRUFBRSxVQUFVLEVBQUMsR0FBRyxLQUFLLENBQUM7SUFFckUsZ0JBQWdCLENBQUMsQ0FBQyxFQUFFLEVBQUUsTUFBTSxDQUFDLEVBQUUsb0NBQW9DLENBQUMsQ0FBQztJQUVyRSxNQUFNLFNBQVMsR0FBRyxJQUFJLENBQUMsY0FBYyxDQUFDLEVBQUUsQ0FBQyxLQUFLLENBQUMsQ0FBQztJQUNoRCxNQUFNLGFBQWEsR0FBRyxJQUFJLENBQUMsY0FBYyxDQUFDLE1BQU0sQ0FBQyxLQUFLLENBQUMsQ0FBQztJQUV4RCxNQUFNLFFBQVEsR0FBRyxZQUFZLENBQUMsaUJBQWlCLENBQzNDLFVBQVUsRUFBRSxNQUFNLENBQUMsS0FBeUMsRUFBRSxPQUFPLEVBQ3JFLFNBQVMsRUFBRSxHQUFHLEVBQUUsZUFBZSxFQUFFLElBQUksQ0FBQyxlQUFlLENBQUMs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c0Q7Q0FDbkUsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbIi8qKlxuICogQGxpY2Vuc2VcbiAqIENvcHlyaWdodCAyMDIwIEdvb2dsZSBMTEMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuXG4gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgXCJMaWNlbnNlXCIpO1xuICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLlxuICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0XG4gKlxuICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wXG4gKlxuICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZVxuICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gXCJBUyBJU1wiIEJBU0lTLFxuICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuXG4gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kXG4gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS5cbiAqID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4gKi9cblxuaW1wb3J0IHtiYWNrZW5kX3V0aWwsIERlcHRod2lzZUNvbnYyZE5hdGl2ZUJhY2twcm9wSW5wdXQsIERlcHRod2lzZUNvbnYyZE5hdGl2ZUJhY2twcm9wSW5wdXRBdHRycywgRGVwdGh3aXNlQ29udjJkTmF0aXZlQmFja3Byb3BJbnB1dElucHV0cywgS2VybmVsQ29uZmlnLCBLZXJuZWxGdW5jLCBUZW5zb3JCdWZmZXIsIFRlbnNvckluZm8sIFR5cGVkQXJyYXksIHV0aWx9IGZyb20gJ0B0ZW5zb3JmbG93L3RmanMtY29yZSc7XG5cbmltcG9ydCB7TWF0aEJhY2tlbmRDUFV9IGZyb20gJy4uL2JhY2tlbmRfY3B1JztcbmltcG9ydCB7YXNzZXJ0Tm90Q29tcGxleH0gZnJvbSAnLi4vY3B1X3V0aWwnO1xuXG5leHBvcnQgZnVuY3Rpb24gZGVwdGh3aXNlQ29udjJkTmF0aXZlQmFja3Byb3BJbnB1dChhcmdzOiB7XG4gIGlucHV0czogRGVwdGh3aXNlQ29udjJkTmF0aXZlQmFja3Byb3BJbnB1dElucHV0cyxcbiAgYmFja2VuZDogTWF0aEJhY2tlbmRDUFUsXG4gIGF0dHJzOiBEZXB0aHdpc2VDb252MmROYXRpdmVCYWNrcHJvcElucHV0QXR0cnNcbn0pOiBUZW5zb3JJbmZvIHtcbiAgY29uc3Qge2lucHV0cywgYmFja2VuZCwgYXR0cnN9ID0gYXJncztcbiAgY29uc3Qge2R5LCBmaWx0ZXJ9ID0gaW5wdXRzO1xuICBjb25zdCB7c3RyaWRlcywgZGlsYXRpb25zLCBwYWQsIGRpbVJvdW5kaW5nTW9kZSwgaW5wdXRTaGFwZX0gPSBhdHRycztcblxuICBhc3NlcnROb3RDb21wbGV4KFtkeSwgZmlsdGVyXSwgJ2RlcHRod2lzZUNvbnYyRE5hdGl2ZUJhY2twcm9wSW5wdXQnKTtcblxuICBjb25zdCBkeVN0cmlkZXMgPSB1dGlsLmNvbXB1dGVTdHJpZGVzKGR5LnNoYXBlKTtcbiAgY29uc3QgZmlsdGVyU3RyaWRlcyA9IHV0aWwuY29tcHV0ZVN0cmlkZXMoZmlsdGVyLnNoYXBlKTtcblxuICBjb25zdCBjb252SW5mbyA9IGJhY2tlbmRfdXRpbC5jb21wdXRlQ29udjJESW5mbyhcbiAgICAgIGlucHV0U2hhcGUsIGZpbHRlci5zaGFwZSBhcyBbbnVtYmVyLCBudW1iZXIsIG51bWJlciwgbnVtYmVyXSwgc3RyaWRlcyxcbiAgICAgIGRpbGF0aW9ucywgcGFkLCBkaW1Sb3VuZGluZ01vZGUsIHRydWUgLyogZGVwdGh3aXNlICovKTtcblxuICBjb25zdCBkeCA9IG5ldyBUZW5zb3JCdWZmZXIoY29udkluZm8uaW5TaGFwZSwgJ2Zsb2F0MzInKTtcbiAgY29uc3QgZHhWYWx1ZXMgPSBkeC52YWx1ZXM7XG4gIGNvbnN0IFtkeFMwLCBkeFMxLCBkeFMyXSA9IGR4LnN0cmlkZXM7XG4gIGNvbnN0IGR5VmFsdWVzID0gYmFja2VuZC5kYXRhLmdldChkeS5kYXRhSWQpLnZhbHVlcyBhcyBUeXBlZEFycmF5O1xuICBjb25zdCBbZHlTMCwgZHlTMSwgZHlTMl0gPSBkeVN0cmlkZXM7XG4gIGNvbnN0IGZsdFZhbHVlcyA9IGJhY2tlbmQuZGF0YS5nZXQoZmlsdGVyLmRhdGFJZCkudmFsdWVzIGFzIFR5cGVkQXJyYXk7XG4gIGNvbnN0IFtmbHRTMCwgZmx0UzEsIGZsdFMyXSA9IGZpbHRlclN0cmlkZXM7XG4gIGNvbnN0IHtcbiAgICBiYXRjaFNpemUsXG4gICAgZmlsdGVySGVpZ2h0LFxuICAgIGZpbHRlcldpZHRoLFxuICAgIGluQ2hhbm5lbHMsXG4gICAgaW5IZWlnaHQsXG4gICAgaW5XaWR0aCxcbiAgICBvdXRDaGFubmVscyxcbiAgICBvdXRIZWlnaHQsXG4gICAgb3V0V2lkdGgsXG4gICAgc3RyaWRlSGVpZ2h0LFxuICAgIHN0cmlkZVdpZHRoXG4gIH0gPSBjb252SW5mbztcbiAgY29uc3QgdG9wUGFkID0gZmlsdGVySGVpZ2h0IC0gMSAtIGNvbnZJbmZvLnBhZEluZm8udG9wO1xuICBjb25zdCBsZWZ0UGFkID0gZmlsdGVyV2lkdGggLSAxIC0gY29udkluZm8ucGFkSW5mby5sZWZ0O1xuICBjb25zdCBjaE11bCA9IG91dENoYW5uZWxzIC8gaW5DaGFubmVscztcblxuICBmb3IgKGxldCBiID0gMDsgYiA8IGJhdGNoU2l6ZTsgKytiKSB7XG4gICAgZm9yIChsZXQgZDEgPSAwOyBkMSA8IGluQ2hhbm5lbHM7ICsrZDEpIHtcbiAgICAgIGZvciAobGV0IHhSID0gMDsgeFIgPCBpbkhlaWdodDsgKyt4Uikge1xuICAgICAgICBjb25zdCB4UkNvcm5lciA9IHhSIC0gdG9wUGFkO1xuICAgICAgICBjb25zdCB4Uk1pbiA9IE1hdGgubWF4KDAsIE1hdGguY2VpbCh4UkNvcm5lciAvIHN0cmlkZUhlaWdodCkpO1xuICAgICAgICBjb25zdCB5Uk1heCA9XG4gICAgICAgICAgICBNYXRoLm1pbihvdXRIZWlnaHQsIChmaWx0ZXJIZWlnaHQgKyB4UkNvcm5lcikgLyBzdHJpZGVIZWlnaHQpO1xuXG4gICAgICAgIGZvciAobGV0IHhDID0gMDsgeEMgPCBpbldpZHRoOyArK3hDKSB7XG4gICAgICAgICAgY29uc3QgeENDb3JuZXIgPSB4QyAtIGxlZnRQYWQ7XG4gICAgICAgICAgY29uc3QgeENNaW4gPSBNYXRoLm1heCgwLCBNYXRoLmNlaWwoeENDb3JuZXIgLyBzdHJpZGVXaWR0aCkpO1xuICAgICAgICAgIGNvbnN0IHlDTWF4ID1cbiAgICAgICAgICAgICAgTWF0aC5taW4ob3V0V2lkdGgsIChmaWx0ZXJXaWR0aCArIHhDQ29ybmVyKSAvIHN0cmlkZVdpZHRoKTtcblxuICAgICAgICAgIGxldCBkb3RQcm9kID0gMDtcbiAgICAgICAgICBmb3IgKGxldCB5UiA9IHhSTWluOyB5UiA8IHlSTWF4OyArK3lSKSB7XG4gICAgICAgICAgICBjb25zdCB3UiA9IHlSICogc3RyaWRlSGVpZ2h0IC0geFJDb3JuZXI7XG5cbiAgICAgICAgICAgIGZvciAobGV0IHlDID0geENNaW47IHlDIDwgeUNNYXg7ICsreUMpIHtcbiAgICAgICAgICAgICAgY29uc3Qgd0MgPSB5QyAqIHN0cmlkZVdpZHRoIC0geENDb3JuZXI7XG4gICAgICAgICAgICAgIGNvbnN0IGR5T2Zmc2V0ID0gZHlTMCAqIGIgKyBkeVMxICogeVIgKyBkeVMyICogeUM7XG4gICAgICAgICAgICAgIGNvbnN0IGZsdE9mZnNldCA9IGZsdFMwICogKGZpbHRlckhlaWdodCAtIDEgLSB3UikgK1xuICAgICAgICAgICAgICAgICAgZmx0UzEgKiAoZmlsdGVyV2lkdGggLSAxIC0gd0MpICsgZmx0UzIgKiBkMTtcblxuICAgICAgICAgICAgICBmb3IgKGxldCBkbSA9IDA7IGRtIDwgY2hNdWw7ICsrZG0pIHtcbiAgICAgICAgICAgICAgICBjb25zdCBkMiA9IGQxICogY2hNdWwgKyBkbTtcbiAgICAgICAgICAgICAgICBjb25zdCBwaXhlbCA9IGR5VmFsdWVzW2R5T2Zmc2V0ICsgZDJdO1xuICAgICAgICAgICAgICAgIGNvbnN0IHdlaWdodCA9IGZsdFZhbHVlc1tmbHRPZmZzZXQgKyBkbV07XG4gICAgICAgICAgICAgICAgZG90UHJvZCArPSBwaXhlbCAqIHdlaWdodDtcbiAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICAgIH1cbiAgICAgICAgICBkeFZhbHVlc1tkeFMwICogYiArIGR4UzEgKiB4UiArIGR4UzIgKiB4QyArIGQxXSA9IGRvdFByb2Q7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9XG4gIH1cblxuICByZXR1cm4gYmFja2VuZC5tYWtlVGVuc29ySW5mbyhkeC5zaGFwZSwgZHguZHR5cGUsIGR4LnZhbHVlcyk7XG59XG5cbmV4cG9ydCBjb25zdCBkZXB0aHdpc2VDb252MmROYXRpdmVCYWNrcHJvcElucHV0Q29uZmlnOiBLZXJuZWxDb25maWcgPSB7XG4gIGtlcm5lbE5hbWU6IERlcHRod2lzZUNvbnYyZE5hdGl2ZUJhY2twcm9wSW5wdXQsXG4gIGJhY2tlbmROYW1lOiAnY3B1JyxcbiAga2VybmVsRnVuYzogZGVwdGh3aXNlQ29udjJkTmF0aXZlQmFja3Byb3BJbnB1dCBhcyB7fSBhcyBLZXJuZWxGdW5jXG59O1xuIl19","/**\n * @license\n * Copyright 2020 Google LLC. All Rights Reserved.\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n * =============================================================================\n */\nimport { buffer, Diag, util } from '@tensorflow/tfjs-core';\nexport function diag(args) {\n const { inputs, backend } = args;\n const { x } = inputs;\n const xSize = util.sizeFromShape(x.shape);\n const xVals = backend.data.get(x.dataId).values;\n const outBuf = buffer([xSize, xSize], x.dtype);\n const vals = outBuf.values;\n for (let i = 0; i < xVals.length; i++) {\n vals[i * xSize + i] = xVals[i];\n }\n const outShape = [...x.shape, ...x.shape];\n return backend.makeTensorInfo(outShape, outBuf.dtype, outBuf.values);\n}\nexport const diagConfig = {\n kernelName: Diag,\n backendName: 'cpu',\n kernelFunc: diag\n};\n//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiRGlhZy5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uLy4uL3RmanMtYmFja2VuZC1jcHUvc3JjL2tlcm5lbHMvRGlhZy50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQTs7Ozs7Ozs7Ozs7Ozs7O0dBZUc7QUFFSCxPQUFPLEVBQUMsTUFBTSxFQUFFLElBQUksRUFBZ0UsSUFBSSxFQUFDLE1BQU0sdUJBQXVCLENBQUM7QUFJdkgsTUFBTSxVQUFVLElBQUksQ0FBQyxJQUFtRDtJQUV0RSxNQUFNLEVBQUMsTUFBTSxFQUFFLE9BQU8sRUFBQyxHQUFHLElBQUksQ0FBQztJQUMvQixNQUFNLEVBQUMsQ0FBQyxFQUFDLEdBQUcsTUFBTSxDQUFDO0lBRW5CLE1BQU0sS0FBSyxHQUFHLElBQUksQ0FBQyxhQUFhLENBQUMsQ0FBQyxDQUFDLEtBQUssQ0FBQyxDQUFDO0lBRTFDLE1BQU0sS0FBSyxHQUFHLE9BQU8sQ0FBQyxJQUFJLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxNQUFNLENBQUMsQ0FBQyxNQUFvQixDQUFDO0lBQzlELE1BQU0sTUFBTSxHQUFHLE1BQU0sQ0FBQyxDQUFDLEtBQUssRUFBRSxLQUFLLENBQUMsRUFBRSxDQUFDLENBQUMsS0FBSyxDQUFDLENBQUM7SUFDL0MsTUFBTSxJQUFJLEdBQUcsTUFBTSxDQUFDLE1BQU0sQ0FBQztJQUMzQixLQUFLLElBQUksQ0FBQyxHQUFHLENBQUMsRUFBRSxDQUFDLEdBQUcsS0FBSyxDQUFDLE1BQU0sRUFBRSxDQUFDLEVBQUUsRUFBRTtRQUNyQyxJQUFJLENBQUMsQ0FBQyxHQUFHLEtBQUssR0FBRyxDQUFDLENBQUMsR0FBRyxLQUFLLENBQUMsQ0FBQyxDQUFDLENBQUM7S0FDaEM7SUFFRCxNQUFNLFFBQVEsR0FBRyxDQUFDLEdBQUcsQ0FBQyxDQUFDLEtBQUssRUFBRSxHQUFHLENBQUMsQ0FBQyxLQUFLLENBQUMsQ0FBQztJQUUxQyxPQUFPLE9BQU8sQ0FBQyxjQUFjLENBQUMsUUFBUSxFQUFFLE1BQU0sQ0FBQyxLQUFLLEVBQUUsTUFBTSxDQUFDLE1BQU0sQ0FBQyxDQUFDO0FBQ3ZFLENBQUM7QUFFRCxNQUFNLENBQUMsTUFBTSxVQUFVLEdBQWlCO0lBQ3RDLFVBQVUsRUFBRSxJQUFJO0lBQ2hCLFdBQVcsRUFBRSxLQUFLO0lBQ2xCLFVBQVUsRUFBRSxJQUF3QjtDQUNyQyxDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiLyoqXG4gKiBAbGljZW5zZVxuICogQ29weXJpZ2h0IDIwMjAgR29vZ2xlIExMQy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC5cbiAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSBcIkxpY2Vuc2VcIik7XG4gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuXG4gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXRcbiAqXG4gKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjBcbiAqXG4gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlXG4gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiBcIkFTIElTXCIgQkFTSVMsXG4gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC5cbiAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmRcbiAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLlxuICogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbiAqL1xuXG5pbXBvcnQge2J1ZmZlciwgRGlhZywgRGlhZ0lucHV0cywgS2VybmVsQ29uZmlnLCBLZXJuZWxGdW5jLCBUZW5zb3JJbmZvLCBUeXBlZEFycmF5LCB1dGlsfSBmcm9tICdAdGVuc29yZmxvdy90ZmpzLWNvcmUnO1xuXG5pbXBvcnQge01hdGhCYWNrZW5kQ1BVfSBmcm9tICcuLi9iYWNrZW5kX2NwdSc7XG5cbmV4cG9ydCBmdW5jdGlvbiBkaWFnKGFyZ3M6IHtpbnB1dHM6IERpYWdJbnB1dHMsIGJhY2tlbmQ6IE1hdGhCYWNrZW5kQ1BVfSk6XG4gICAgVGVuc29ySW5mbyB7XG4gIGNvbnN0IHtpbnB1dHMsIGJhY2tlbmR9ID0gYXJncztcbiAgY29uc3Qge3h9ID0gaW5wdXRzO1xuXG4gIGNvbnN0IHhTaXplID0gdXRpbC5zaXplRnJvbVNoYXBlKHguc2hhcGUpO1xuXG4gIGNvbnN0IHhWYWxzID0gYmFja2VuZC5kYXRhLmdldCh4LmRhdGFJZCkudmFsdWVzIGFzIFR5cGVkQXJyYXk7XG4gIGNvbnN0IG91dEJ1ZiA9IGJ1ZmZlcihbeFNpemUsIHhTaXplXSwgeC5kdHlwZSk7XG4gIGNvbnN0IHZhbHMgPSBvdXRCdWYudmFsdWVzO1xuICBmb3IgKGxldCBpID0gMDsgaSA8IHhWYWxzLmxlbmd0aDsgaSsrKSB7XG4gICAgdmFsc1tpICogeFNpemUgKyBpXSA9IHhWYWxzW2ldO1xuICB9XG5cbiAgY29uc3Qgb3V0U2hhcGUgPSBbLi4ueC5zaGFwZSwgLi4ueC5zaGFwZV07XG5cbiAgcmV0dXJuIGJhY2tlbmQubWFrZVRlbnNvckluZm8ob3V0U2hhcGUsIG91dEJ1Zi5kdHlwZSwgb3V0QnVmLnZhbHVlcyk7XG59XG5cbmV4cG9ydCBjb25zdCBkaWFnQ29uZmlnOiBLZXJuZWxDb25maWcgPSB7XG4gIGtlcm5lbE5hbWU6IERpYWcsXG4gIGJhY2tlbmROYW1lOiAnY3B1JyxcbiAga2VybmVsRnVuYzogZGlhZyBhcyB7fSBhcyBLZXJuZWxGdW5jXG59O1xuIl19","/**\n * @license\n * Copyright 2020 Google LLC. All Rights Reserved.\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n * =============================================================================\n */\nimport { backend_util, Dilation2D, util } from '@tensorflow/tfjs-core';\nexport const dilation2DConfig = {\n kernelName: Dilation2D,\n backendName: 'cpu',\n kernelFunc: ({ inputs, backend, attrs }) => {\n const { x, filter } = inputs;\n const { strides, pad, dilations } = attrs;\n const cpuBackend = backend;\n const xVals = cpuBackend.data.get(x.dataId).values;\n const xRank = x.shape.length;\n const filterVals = cpuBackend.data.get(filter.dataId).values;\n const filterRank = filter.shape.length;\n const { batchSize, inHeight, inWidth, inChannels, outHeight, outWidth, padInfo, strideHeight, strideWidth, filterHeight, filterWidth, dilationHeight, dilationWidth, outShape } = backend_util.computeDilation2DInfo(x.shape, filter.shape, strides, pad, 'NHWC' /* dataFormat */, dilations);\n const outSize = util.sizeFromShape(outShape);\n const outRank = outShape.length;\n const outputVals = util.getArrayFromDType(x.dtype, outSize);\n // Upsampling the input by fill in `dilation size - 1` values between each\n // input value.\n // This implementation follows the TF c++ implementation:\n // https://github.com/tensorflow/tensorflow/blob/d9a3a849edc198e90172bc58eb293de457f9d986/tensorflow/core/kernels/dilation_ops.cc\n for (let b = 0; b < batchSize; ++b) {\n for (let hOut = 0; hOut < outHeight; ++hOut) {\n const hBeg = hOut * strideHeight - padInfo.top;\n for (let wOut = 0; wOut < outWidth; ++wOut) {\n const wBeg = wOut * strideWidth - padInfo.left;\n for (let d = 0; d < inChannels; ++d) {\n let curVal = Number.MIN_SAFE_INTEGER;\n for (let h = 0; h < filterHeight; ++h) {\n const hIn = hBeg + h * dilationHeight;\n if (hIn >= 0 && hIn < inHeight) {\n for (let w = 0; w < filterWidth; ++w) {\n const wIn = wBeg + w * dilationWidth;\n if (wIn >= 0 && wIn < inWidth) {\n const xIndex = util.locToIndex([b, hIn, wIn, d], xRank, util.computeStrides(x.shape));\n const filterIndex = util.locToIndex([h, w, d], filterRank, util.computeStrides(filter.shape));\n const val = xVals[xIndex] + filterVals[filterIndex];\n if (val > curVal) {\n curVal = val;\n }\n }\n }\n }\n }\n const outputIndex = util.locToIndex([b, hOut, wOut, d], outRank, util.computeStrides(outShape));\n outputVals[outputIndex] = curVal;\n }\n }\n }\n }\n const dataId = cpuBackend.write(util.toTypedArray(outputVals, x.dtype), outShape, x.dtype);\n return { dataId, shape: outShape, dtype: x.dtype };\n }\n};\n//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiRGlsYXRpb24yRC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uLy4uL3RmanMtYmFja2VuZC1jcHUvc3JjL2tlcm5lbHMvRGlsYXRpb24yRC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQTs7Ozs7Ozs7Ozs7Ozs7O0dBZUc7QUFFSCxPQUFPLEVBQUMsWUFBWSxFQUFFLFVBQVUsRUFBK0QsSUFBSSxFQUFDLE1BQU0sdUJBQXVCLENBQUM7QUFJbEksTUFBTSxDQUFDLE1BQU0sZ0JBQWdCLEdBQWlCO0lBQzVDLFVBQVUsRUFBRSxVQUFVO0lBQ3RCLFdBQVcsRUFBRSxLQUFLO0lBQ2xCLFVBQVUsRUFBRSxDQUFDLEVBQUMsTUFBTSxFQUFFLE9BQU8sRUFBRSxLQUFLLEVBQUMsRUFBRSxFQUFFO1FBQ3ZDLE1BQU0sRUFBQyxDQUFDLEVBQUUsTUFBTSxFQUFDLEdBQUcsTUFBMEIsQ0FBQztRQUMvQyxNQUFNLEVBQUMsT0FBTyxFQUFFLEdBQUcsRUFBRSxTQUFTLEVBQUMsR0FBRyxLQUE4QixDQUFDO1FBQ2pFLE1BQU0sVUFBVSxHQUFHLE9BQXlCLENBQUM7UUFFN0MsTUFBTSxLQUFLLEdBQUcsVUFBVSxDQUFDLElBQUksQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLE1BQU0sQ0FBQyxDQUFDLE1BQW9CLENBQUM7UUFDakUsTUFBTSxLQUFLLEdBQUcsQ0FBQyxDQUFDLEtBQUssQ0FBQyxNQUFNLENBQUM7UUFFN0IsTUFBTSxVQUFVLEdBQUcsVUFBVSxDQUFDLElBQUksQ0FBQyxHQUFHLENBQUMsTUFBTSxDQUFDLE1BQU0sQ0FBQyxDQUFDLE1BQW9CLENBQUM7UUFDM0UsTUFBTSxVQUFVLEdBQUcsTUFBTSxDQUFDLEtBQUssQ0FBQyxNQUFNLENBQUM7UUFFdkMsTUFBTSxFQUNKLFNBQVMsRUFDVCxRQUFRLEVBQ1IsT0FBTyxFQUNQLFVBQVUsRUFDVixTQUFTLEVBQ1QsUUFBUSxFQUNSLE9BQU8sRUFDUCxZQUFZLEVBQ1osV0FB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LENBQUMsQ0FBQyxDQUFDO3dCQUNoRSxVQUFVLENBQUMsV0FBVyxDQUFDLEdBQUcsTUFBTSxDQUFDO3FCQUNsQztpQkFDRjthQUNGO1NBQ0Y7UUFFRCxNQUFNLE1BQU0sR0FBRyxVQUFVLENBQUMsS0FBSyxDQUMzQixJQUFJLENBQUMsWUFBWSxDQUFDLFVBQVUsRUFBRSxDQUFDLENBQUMsS0FBSyxDQUFDLEVBQUUsUUFBUSxFQUFFLENBQUMsQ0FBQyxLQUFLLENBQUMsQ0FBQztRQUUvRCxPQUFPLEVBQUMsTUFBTSxFQUFFLEtBQUssRUFBRSxRQUFRLEVBQUUsS0FBSyxFQUFFLENBQUMsQ0FBQyxLQUFLLEVBQUMsQ0FBQztJQUNuRCxDQUFDO0NBQ0YsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbIi8qKlxuICogQGxpY2Vuc2VcbiAqIENvcHlyaWdodCAyMDIwIEdvb2dsZSBMTEMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuXG4gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgXCJMaWNlbnNlXCIpO1xuICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLlxuICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0XG4gKlxuICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wXG4gKlxuICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZVxuICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gXCJBUyBJU1wiIEJBU0lTLFxuICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuXG4gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kXG4gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS5cbiAqID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4gKi9cblxuaW1wb3J0IHtiYWNrZW5kX3V0aWwsIERpbGF0aW9uMkQsIERpbGF0aW9uMkRBdHRycywgRGlsYXRpb24yRElucHV0cywgS2VybmVsQ29uZmlnLCBUeXBlZEFycmF5LCB1dGlsfSBmcm9tICdAdGVuc29yZmxvdy90ZmpzLWNvcmUnO1xuXG5pbXBvcnQge01hdGhCYWNrZW5kQ1BVfSBmcm9tICcuLi9iYWNrZW5kX2NwdSc7XG5cbmV4cG9ydCBjb25zdCBkaWxhdGlvbjJEQ29uZmlnOiBLZXJuZWxDb25maWcgPSB7XG4gIGtlcm5lbE5hbWU6IERpbGF0aW9uMkQsXG4gIGJhY2tlbmROYW1lOiAnY3B1JyxcbiAga2VybmVsRnVuYzogKHtpbnB1dHMsIGJhY2tlbmQsIGF0dHJzfSkgPT4ge1xuICAgIGNvbnN0IHt4LCBmaWx0ZXJ9ID0gaW5wdXRzIGFzIERpbGF0aW9uMkRJbnB1dHM7XG4gICAgY29uc3Qge3N0cmlkZXMsIHBhZCwgZGlsYXRpb25zfSA9IGF0dHJzIGFzIHt9IGFzIERpbGF0aW9uMkRBdHRycztcbiAgICBjb25zdCBjcHVCYWNrZW5kID0gYmFja2VuZCBhcyBNYXRoQmFja2VuZENQVTtcblxuICAgIGNvbnN0IHhWYWxzID0gY3B1QmFja2VuZC5kYXRhLmdldCh4LmRhdGFJZCkudmFsdWVzIGFzIFR5cGVkQXJyYXk7XG4gICAgY29uc3QgeFJhbmsgPSB4LnNoYXBlLmxlbmd0aDtcblxuICAgIGNvbnN0IGZpbHRlclZhbHMgPSBjcHVCYWNrZW5kLmRhdGEuZ2V0KGZpbHRlci5kYXRhSWQpLnZhbHVlcyBhcyBUeXBlZEFycmF5O1xuICAgIGNvbnN0IGZpbHRlclJhbmsgPSBmaWx0ZXIuc2hhcGUubGVuZ3RoO1xuXG4gICAgY29uc3Qge1xuICAgICAgYmF0Y2hTaXplLFxuICAgICAgaW5IZWlnaHQsXG4gICAgICBpbldpZHRoLFxuICAgICAgaW5DaGFubmVscyxcbiAgICAgIG91dEhlaWdodCxcbiAgICAgIG91dFdpZHRoLFxuICAgICAgcGFkSW5mbyxcbiAgICAgIHN0cmlkZUhlaWdodCxcbiAgICAgIHN0cmlkZVdpZHRoLFxuICAgICAgZmlsdGVySGVpZ2h0LFxuICAgICAgZmlsdGVyV2lkdGgsXG4gICAgICBkaWxhdGlvbkhlaWdodCxcbiAgICAgIGRpbGF0aW9uV2lkdGgsXG4gICAgICBvdXRTaGFwZVxuICAgIH0gPVxuICAgICAgICBiYWNrZW5kX3V0aWwuY29tcHV0ZURpbGF0aW9uMkRJbmZvKFxuICAgICAgICAgICAgeC5zaGFwZSBhcyBbbnVtYmVyLCBudW1iZXIsIG51bWJlciwgbnVtYmVyXSxcbiAgICAgICAgICAgIGZpbHRlci5zaGFwZSBhcyBbbnVtYmVyLCBudW1iZXIsIG51bWJlcl0sIHN0cmlkZXMsIHBhZCxcbiAgICAgICAgICAgICdOSFdDJyAvKiBkYXRhRm9ybWF0ICovLCBkaWxhdGlvbnMpO1xuXG4gICAgY29uc3Qgb3V0U2l6ZSA9IHV0aWwuc2l6ZUZyb21TaGFwZShvdXRTaGFwZSk7XG4gICAgY29uc3Qgb3V0UmFuayA9IG91dFNoYXBlLmxlbmd0aDtcbiAgICBjb25zdCBvdXRwdXRWYWxzID0gdXRpbC5nZXRBcnJheUZyb21EVHlwZSh4LmR0eXBlLCBvdXRTaXplKTtcblxuICAgIC8vIFVwc2FtcGxpbmcgdGhlIGlucHV0IGJ5IGZpbGwgaW4gYGRpbGF0aW9uIHNpemUgLSAxYCB2YWx1ZXMgYmV0d2VlbiBlYWNoXG4gICAgLy8gaW5wdXQgdmFsdWUuXG4gICAgLy8gVGhpcyBpbXBsZW1lbnRhdGlvbiBmb2xsb3dzIHRoZSBURiBjKysgaW1wbGVtZW50YXRpb246XG4gICAgLy8gaHR0cHM6Ly9naXRodWIuY29tL3RlbnNvcmZsb3cvdGVuc29yZmxvdy9ibG9iL2Q5YTNhODQ5ZWRjMTk4ZTkwMTcyYmM1OGViMjkzZGU0NTdmOWQ5ODYvdGVuc29yZmxvdy9jb3JlL2tlcm5lbHMvZGlsYXRpb25fb3BzLmNjXG4gICAgZm9yIChsZXQgYiA9IDA7IGIgPCBiYXRjaFNpemU7ICsrYikge1xuICAgICAgZm9yIChsZXQgaE91dCA9IDA7IGhPdXQgPCBvdXRIZWlnaHQ7ICsraE91dCkge1xuICAgICAgICBjb25zdCBoQmVnID0gaE91dCAqIHN0cmlkZUhlaWdodCAtIHBhZEluZm8udG9wO1xuICAgICAgICBmb3IgKGxldCB3T3V0ID0gMDsgd091dCA8IG91dFdpZHRoOyArK3dPdXQpIHtcbiAgICAgICAgICBjb25zdCB3QmVnID0gd091dCAqIHN0cmlkZVdpZHRoIC0gcGFkSW5mby5sZWZ0O1xuICAgICAgICAgIGZvciAobGV0IGQgPSAwOyBkIDwgaW5DaGFubmVsczsgKytkKSB7XG4gICAgICAgICAgICBsZXQgY3VyVmFsID0gTnVtYmVyLk1JTl9TQUZFX0lOVEVHRVI7XG4gICAgICAgICAgICBmb3IgKGxldCBoID0gMDsgaCA8IGZpbHRlckhlaWdodDsgKytoKSB7XG4gICAgICAgICAgICAgIGNvbnN0IGhJbiA9IGhCZWcgKyBoICogZGlsYXRpb25IZWlnaHQ7XG4gICAgICAgICAgICAgIGlmIChoSW4gPj0gMCAmJiBoSW4gPCBpbkhlaWdodCkge1xuICAgICAgICAgICAgICAgIGZvciAobGV0IHcgPSAwOyB3IDwgZmlsdGVyV2lkdGg7ICsrdykge1xuICAgICAgICAgICAgICAgICAgY29uc3Qgd0luID0gd0JlZyArIHcgKiBkaWxhdGlvbldpZHRoO1xuICAgICAgICAgICAgICAgICAgaWYgKHdJbiA+PSAwICYmIHdJbiA8IGluV2lkdGgpIHtcbiAgICAgICAgICAgICAgICAgICAgY29uc3QgeEluZGV4ID0gdXRpbC5sb2NUb0luZGV4KFxuICAgICAgICAgICAgICAgICAgICAgICAgW2IsIGhJbiwgd0luLCBkXSwgeFJhbmssIHV0aWwuY29tcHV0ZVN0cmlkZXMoeC5zaGFwZSkpO1xuICAgICAgICAgICAgICAgICAgICBjb25zdCBmaWx0ZXJJbmRleCA9IHV0aWwubG9jVG9JbmRleChcbiAgICAgICAgICAgICAgICAgICAgICAgIFtoLCB3LCBkXSwgZmlsdGVyUmFuayxcbiAgICAgICAgICAgICAgICAgICAgICAgIHV0aWwuY29tcHV0ZVN0cmlkZXMoZmlsdGVyLnNoYXBlKSk7XG4gICAgICAgICAgICAgICAgICAgIGNvbnN0IHZhbCA9IHhWYWxzW3hJbmRleF0gKyBmaWx0ZXJWYWxzW2ZpbHRlckluZGV4XTtcbiAgICAgICAgICAgICAgICAgICAgaWYgKHZhbCA+IGN1clZhbCkge1xuICAgICAgICAgICAgICAgICAgICAgIGN1clZhbCA9IHZhbDtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICAgICAgY29uc3Qgb3V0cHV0SW5kZXggPSB1dGlsLmxvY1RvSW5kZXgoXG4gICAgICAgICAgICAgICAgW2IsIGhPdXQsIHdPdXQsIGRdLCBvdXRSYW5rLCB1dGlsLmNvbXB1dGVTdHJpZGVzKG91dFNoYXBlKSk7XG4gICAgICAgICAgICBvdXRwdXRWYWxzW291dHB1dEluZGV4XSA9IGN1clZhbDtcbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9XG5cbiAgICBjb25zdCBkYXRhSWQgPSBjcHVCYWNrZW5kLndyaXRlKFxuICAgICAgICB1dGlsLnRvVHlwZWRBcnJheShvdXRwdXRWYWxzLCB4LmR0eXBlKSwgb3V0U2hhcGUsIHguZHR5cGUpO1xuXG4gICAgcmV0dXJuIHtkYXRhSWQsIHNoYXBlOiBvdXRTaGFwZSwgZHR5cGU6IHguZHR5cGV9O1xuICB9XG59O1xuIl19","/**\n * @license\n * Copyright 2020 Google LLC. All Rights Reserved.\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n * =============================================================================\n */\nimport { backend_util, Dilation2DBackpropFilter, util } from '@tensorflow/tfjs-core';\nexport const dilation2DBackpropFilterConfig = {\n kernelName: Dilation2DBackpropFilter,\n backendName: 'cpu',\n kernelFunc: ({ inputs, backend, attrs }) => {\n const { x, filter, dy } = inputs;\n const { strides, pad, dilations } = attrs;\n const cpuBackend = backend;\n const $x = util.toNestedArray(x.shape, cpuBackend.data.get(x.dataId).values);\n const $filter = util.toNestedArray(filter.shape, cpuBackend.data.get(filter.dataId).values);\n const { batchSize, inHeight, inWidth, inChannels, outHeight, outWidth, padInfo, strideHeight, strideWidth, filterHeight, filterWidth, dilationHeight, dilationWidth, outShape } = backend_util.computeDilation2DInfo(x.shape, filter.shape, strides, pad, 'NHWC' /* dataFormat */, dilations);\n util.assert(dy.rank === outShape.length, () => `Error in ${Dilation2DBackpropFilter}, dy ` +\n `must have the same rank as output ${outShape.length}, but got ` +\n `${dy.rank}`);\n const $dy = util.toNestedArray(outShape, cpuBackend.data.get(dy.dataId).values);\n // The computed filter gradients has the same dimensions as the filter:\n // [filterHeight, filterWidth, depth]\n const gradients = util.makeZerosNestedTypedArray(filter.shape, filter.dtype);\n // In the case of multiple argmax branches, we only back-propagate along the\n // last branch, i.e., the one with largest value of `h * filter_cols + w`,\n // similarly to the max-pooling backward routines.\n // This implementation follows the TF c++ implementation:\n // https://github.com/tensorflow/tensorflow/blob/d9a3a849edc198e90172bc58eb293de457f9d986/tensorflow/core/kernels/dilation_ops.cc\n for (let b = 0; b < batchSize; ++b) {\n for (let hOut = 0; hOut < outHeight; ++hOut) {\n const hBeg = hOut * strideHeight - padInfo.top;\n for (let wOut = 0; wOut < outWidth; ++wOut) {\n const wBeg = wOut * strideWidth - padInfo.left;\n for (let d = 0; d < inChannels; ++d) {\n let curVal = Number.MIN_SAFE_INTEGER;\n let hMax = 0;\n let wMax = 0;\n for (let h = 0; h < filterHeight; ++h) {\n const hIn = hBeg + h * dilationHeight;\n if (hIn >= 0 && hIn < inHeight) {\n for (let w = 0; w < filterWidth; ++w) {\n const wIn = wBeg + w * dilationWidth;\n if (wIn >= 0 && wIn < inWidth) {\n const val = $x[b][hIn][wIn][d] + $filter[h][w][d];\n if (val > curVal) {\n curVal = val;\n hMax = h;\n wMax = w;\n }\n }\n }\n }\n }\n gradients[hMax][wMax][d] += $dy[b][hOut][wOut][d];\n }\n }\n }\n }\n const dataId = cpuBackend.write(util.toTypedArray(gradients, x.dtype), filter.shape, filter.dtype);\n return { dataId, shape: filter.shape, dtype: filter.dtype };\n }\n};\n//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiRGlsYXRpb24yREJhY2twcm9wRmlsdGVyLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vLi4vdGZqcy1iYWNrZW5kLWNwdS9zcmMva2VybmVscy9EaWxhdGlvbjJEQmFja3Byb3BGaWx0ZXIudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUE7Ozs7Ozs7Ozs7Ozs7OztHQWVHO0FBRUgsT0FBTyxFQUFDLFlBQVksRUFBbUIsd0JBQXdCLEVBQWtDLElBQUksRUFBQyxNQUFNLHVCQUF1QixDQUFDO0FBS3BJLE1BQU0sQ0FBQyxNQUFNLDhCQUE4QixHQUFpQjtJQUMxRCxVQUFVLEVBQUUsd0JBQXdCO0lBQ3BDLFdBQVcsRUFBRSxLQUFLO0lBQ2xCLFVBQVUsRUFBRSxDQUFDLEVBQUMsTUFBTSxFQUFFLE9BQU8sRUFBRSxLQUFLLEVBQUMsRUFBRSxFQUFFO1FBQ3ZDLE1BQU0sRUFBQyxDQUFDLEVBQUUsTUFBTSxFQUFFLEVBQUUsRUFBQyxHQUNqQixNQUF1RCxDQUFDO1FBQzVELE1BQU0sRUFBQyxPQUFPLEVBQUUsR0FBRyxFQUFFLFNBQVMsRUFBQyxHQUFHLEtBQThCLENBQUM7UUFDakUsTUFBTSxVQUFVLEdBQUcsT0FBeUIsQ0FBQztRQUU3QyxNQUFNLEVBQUUsR0FDSixJQUFJLENBQUMsYUFBYSxDQUNkLENBQUMsQ0FBQyxLQUFLLEVBQUUsVUFBVSxDQUFDLElBQUksQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLE1BQU0sQ0FBQyxDQUFDLE1BQW9CLENBQ2pELENBQUM7UUFFbkIsTUFBTSxPQUFPLEdBQUcsSUFBSSxDQUFDLGFBQWEsQ0FDZCxNQUFNLENBQUMsS0FBSyxFQUNaLFVBQVUsQ0FBQyxJQUFJLENBQUMsR0FBRyxDQUFDLE1BQU0sQ0FBQyxNQUFNLENBQUMsQ0FBQyxNQUNyQixDQUFpQixDQUFDO1FBRXBELE1BQU0sRUFDSixTQUFTLEVBQ1QsUUFBUSxFQUNSLE9BQU8sRUFDUCxVQUFVLEVBQ1YsU0FBUyxFQUNU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Q1QsSUFBSSxHQUFHLENBQUMsQ0FBQzt5Q0FDVjtxQ0FDRjtpQ0FDRjs2QkFDRjt5QkFDRjt3QkFDRCxTQUFTLENBQUMsSUFBSSxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDO3FCQUNuRDtpQkFDRjthQUNGO1NBQ0Y7UUFFRCxNQUFNLE1BQU0sR0FBRyxVQUFVLENBQUMsS0FBSyxDQUMzQixJQUFJLENBQUMsWUFBWSxDQUFDLFNBQVMsRUFBRSxDQUFDLENBQUMsS0FBSyxDQUFDLEVBQUUsTUFBTSxDQUFDLEtBQUssRUFBRSxNQUFNLENBQUMsS0FBSyxDQUFDLENBQUM7UUFFdkUsT0FBTyxFQUFDLE1BQU0sRUFBRSxLQUFLLEVBQUUsTUFBTSxDQUFDLEtBQUssRUFBRSxLQUFLLEVBQUUsTUFBTSxDQUFDLEtBQUssRUFBQyxDQUFDO0lBQzVELENBQUM7Q0FDRixDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiLyoqXG4gKiBAbGljZW5zZVxuICogQ29weXJpZ2h0IDIwMjAgR29vZ2xlIExMQy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC5cbiAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSBcIkxpY2Vuc2VcIik7XG4gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuXG4gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXRcbiAqXG4gKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjBcbiAqXG4gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlXG4gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiBcIkFTIElTXCIgQkFTSVMsXG4gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC5cbiAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmRcbiAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLlxuICogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbiAqL1xuXG5pbXBvcnQge2JhY2tlbmRfdXRpbCwgRGlsYXRpb24yREF0dHJzLCBEaWxhdGlvbjJEQmFja3Byb3BGaWx0ZXIsIFRlbnNvcjNELCBUZW5zb3I0RCwgVHlwZWRBcnJheSwgdXRpbH0gZnJvbSAnQHRlbnNvcmZsb3cvdGZqcy1jb3JlJztcbmltcG9ydCB7S2VybmVsQ29uZmlnfSBmcm9tICdAdGVuc29yZmxvdy90ZmpzLWNvcmUnO1xuXG5pbXBvcnQge01hdGhCYWNrZW5kQ1BVfSBmcm9tICcuLi9iYWNrZW5kX2NwdSc7XG5cbmV4cG9ydCBjb25zdCBkaWxhdGlvbjJEQmFja3Byb3BGaWx0ZXJDb25maWc6IEtlcm5lbENvbmZpZyA9IHtcbiAga2VybmVsTmFtZTogRGlsYXRpb24yREJhY2twcm9wRmlsdGVyLFxuICBiYWNrZW5kTmFtZTogJ2NwdScsXG4gIGtlcm5lbEZ1bmM6ICh7aW5wdXRzLCBiYWNrZW5kLCBhdHRyc30pID0+IHtcbiAgICBjb25zdCB7eCwgZmlsdGVyLCBkeX0gPVxuICAgICAgICBpbnB1dHMgYXMge3g6IFRlbnNvcjRELCBmaWx0ZXI6IFRlbnNvcjNELCBkeTogVGVuc29yNER9O1xuICAgIGNvbnN0IHtzdHJpZGVzLCBwYWQsIGRpbGF0aW9uc30gPSBhdHRycyBhcyB7fSBhcyBEaWxhdGlvbjJEQXR0cnM7XG4gICAgY29uc3QgY3B1QmFja2VuZCA9IGJhY2tlbmQgYXMgTWF0aEJhY2tlbmRDUFU7XG5cbiAgICBjb25zdCAkeCA9XG4gICAgICAgIHV0aWwudG9OZXN0ZWRBcnJheShcbiAgICAgICAgICAgIHguc2hhcGUsIGNwdUJhY2tlbmQuZGF0YS5nZXQoeC5kYXRhSWQpLnZhbHVlcyBhcyBUeXBlZEFycmF5KSBhc1xuICAgICAgICBudW1iZXJbXVtdW11bXTtcblxuICAgIGNvbnN0ICRmaWx0ZXIgPSB1dGlsLnRvTmVzdGVkQXJyYXkoXG4gICAgICAgICAgICAgICAgICAgICAgICBmaWx0ZXIuc2hhcGUsXG4gICAgICAgICAgICAgICAgICAgICAgICBjcHVCYWNrZW5kLmRhdGEuZ2V0KGZpbHRlci5kYXRhSWQpLnZhbHVlcyBhc1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIFR5cGVkQXJyYXkpIGFzIG51bWJlcltdW11bXTtcblxuICAgIGNvbnN0IHtcbiAgICAgIGJhdGNoU2l6ZSxcbiAgICAgIGluSGVpZ2h0LFxuICAgICAgaW5XaWR0aCxcbiAgICAgIGluQ2hhbm5lbHMsXG4gICAgICBvdXRIZWlnaHQsXG4gICAgICBvdXRXaWR0aCxcbiAgICAgIHBhZEluZm8sXG4gICAgICBzdHJpZGVIZWlnaHQsXG4gICAgICBzdHJpZGVXaWR0aCxcbiAgICAgIGZpbHRlckhlaWdodCxcbiAgICAgIGZpbHRlcldpZHRoLFxuICAgICAgZGlsYXRpb25IZWlnaHQsXG4gICAgICBkaWxhdGlvbldpZHRoLFxuICAgICAgb3V0U2hhcGVcbiAgICB9ID1cbiAgICAgICAgYmFja2VuZF91dGlsLmNvbXB1dGVEaWxhdGlvbjJESW5mbyhcbiAgICAgICAgICAgIHguc2hhcGUgYXMgW251bWJlciwgbnVtYmVyLCBudW1iZXIsIG51bWJlcl0sXG4gICAgICAgICAgICBmaWx0ZXIuc2hhcGUgYXMgW251bWJlciwgbnVtYmVyLCBudW1iZXJdLCBzdHJpZGVzLCBwYWQsXG4gICAgICAgICAgICAnTkhXQycgLyogZGF0YUZvcm1hdCAqLywgZGlsYXRpb25zKTtcblxuICAgIHV0aWwuYXNzZXJ0KFxuICAgICAgICBkeS5yYW5rID09PSBvdXRTaGFwZS5sZW5ndGgsXG4gICAgICAgICgpID0+IGBFcnJvciBpbiAke0RpbGF0aW9uMkRCYWNrcHJvcEZpbHRlcn0sIGR5IGAgK1xuICAgICAgICAgICAgYG11c3QgaGF2ZSB0aGUgc2FtZSByYW5rIGFzIG91dHB1dCAke291dFNoYXBlLmxlbmd0aH0sIGJ1dCBnb3QgYCArXG4gICAgICAgICAgICBgJHtkeS5yYW5rfWApO1xuXG4gICAgY29uc3QgJGR5ID1cbiAgICAgICAgdXRpbC50b05lc3RlZEFycmF5KFxuICAgICAgICAgICAgb3V0U2hhcGUsIGNwdUJhY2tlbmQuZGF0YS5nZXQoZHkuZGF0YUlkKS52YWx1ZXMgYXMgVHlwZWRBcnJheSkgYXNcbiAgICAgICAgbnVtYmVyW11bXVtdW107XG5cbiAgICAvLyBUaGUgY29tcHV0ZWQgZmlsdGVyIGdyYWRpZW50cyBoYXMgdGhlIHNhbWUgZGltZW5zaW9ucyBhcyB0aGUgZmlsdGVyOlxuICAgIC8vIFtmaWx0ZXJIZWlnaHQsIGZpbHRlcldpZHRoLCBkZXB0aF1cbiAgICBjb25zdCBncmFkaWVudHMgPSB1dGlsLm1ha2VaZXJvc05lc3RlZFR5cGVkQXJyYXkoXG4gICAgICAgICAgICAgICAgICAgICAgICAgIGZpbHRlci5zaGFwZSwgZmlsdGVyLmR0eXBlKSBhcyBudW1iZXJbXVtdW107XG5cbiAgICAvLyBJbiB0aGUgY2FzZSBvZiBtdWx0aXBsZSBhcmdtYXggYnJhbmNoZXMsIHdlIG9ubHkgYmFjay1wcm9wYWdhdGUgYWxvbmcgdGhlXG4gICAgLy8gbGFzdCBicmFuY2gsIGkuZS4sIHRoZSBvbmUgd2l0aCBsYXJnZXN0IHZhbHVlIG9mIGBoICogZmlsdGVyX2NvbHMgKyB3YCxcbiAgICAvLyBzaW1pbGFybHkgdG8gdGhlIG1heC1wb29saW5nIGJhY2t3YXJkIHJvdXRpbmVzLlxuICAgIC8vIFRoaXMgaW1wbGVtZW50YXRpb24gZm9sbG93cyB0aGUgVEYgYysrIGltcGxlbWVudGF0aW9uOlxuICAgIC8vIGh0dHBzOi8vZ2l0aHViLmNvbS90ZW5zb3JmbG93L3RlbnNvcmZsb3cvYmxvYi9kOWEzYTg0OWVkYzE5OGU5MDE3MmJjNThlYjI5M2RlNDU3ZjlkOTg2L3RlbnNvcmZsb3cvY29yZS9rZXJuZWxzL2RpbGF0aW9uX29wcy5jY1xuICAgIGZvciAobGV0IGIgPSAwOyBiIDwgYmF0Y2hTaXplOyArK2IpIHtcbiAgICAgIGZvciAobGV0IGhPdXQgPSAwOyBoT3V0IDwgb3V0SGVpZ2h0OyArK2hPdXQpIHtcbiAgICAgICAgY29uc3QgaEJlZyA9IGhPdXQgKiBzdHJpZGVIZWlnaHQgLSBwYWRJbmZvLnRvcDtcbiAgICAgICAgZm9yIChsZXQgd091dCA9IDA7IHdPdXQgPCBvdXRXaWR0aDsgKyt3T3V0KSB7XG4gICAgICAgICAgY29uc3Qgd0JlZyA9IHdPdXQgKiBzdHJpZGVXaWR0aCAtIHBhZEluZm8ubGVmdDtcbiAgICAgICAgICBmb3IgKGxldCBkID0gMDsgZCA8IGluQ2hhbm5lbHM7ICsrZCkge1xuICAgICAgICAgICAgbGV0IGN1clZhbCA9IE51bWJlci5NSU5fU0FGRV9JTlRFR0VSO1xuICAgICAgICAgICAgbGV0IGhNYXggPSAwO1xuICAgICAgICAgICAgbGV0IHdNYXggPSAwO1xuICAgICAgICAgICAgZm9yIChsZXQgaCA9IDA7IGggPCBmaWx0ZXJIZWlnaHQ7ICsraCkge1xuICAgICAgICAgICAgICBjb25zdCBoSW4gPSBoQmVnICsgaCAqIGRpbGF0aW9uSGVpZ2h0O1xuICAgICAgICAgICAgICBpZiAoaEluID49IDAgJiYgaEluIDwgaW5IZWlnaHQpIHtcbiAgICAgICAgICAgICAgICBmb3IgKGxldCB3ID0gMDsgdyA8IGZpbHRlcldpZHRoOyArK3cpIHtcbiAgICAgICAgICAgICAgICAgIGNvbnN0IHdJbiA9IHdCZWcgKyB3ICogZGlsYXRpb25XaWR0aDtcbiAgICAgICAgICAgICAgICAgIGlmICh3SW4gPj0gMCAmJiB3SW4gPCBpbldpZHRoKSB7XG4gICAgICAgICAgICAgICAgICAgIGNvbnN0IHZhbCA9ICR4W2JdW2hJbl1bd0luXVtkXSArICRmaWx0ZXJbaF1bd11bZF07XG4gICAgICAgICAgICAgICAgICAgIGlmICh2YWwgPiBjdXJWYWwpIHtcbiAgICAgICAgICAgICAgICAgICAgICBjdXJWYWwgPSB2YWw7XG4gICAgICAgICAgICAgICAgICAgICAgaE1heCA9IGg7XG4gICAgICAgICAgICAgICAgICAgICAgd01heCA9IHc7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGdyYWRpZW50c1toTWF4XVt3TWF4XVtkXSArPSAkZHlbYl1baE91dF1bd091dF1bZF07XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICB9XG4gICAgfVxuXG4gICAgY29uc3QgZGF0YUlkID0gY3B1QmFja2VuZC53cml0ZShcbiAgICAgICAgdXRpbC50b1R5cGVkQXJyYXkoZ3JhZGllbnRzLCB4LmR0eXBlKSwgZmlsdGVyLnNoYXBlLCBmaWx0ZXIuZHR5cGUpO1xuXG4gICAgcmV0dXJuIHtkYXRhSWQsIHNoYXBlOiBmaWx0ZXIuc2hhcGUsIGR0eXBlOiBmaWx0ZXIuZHR5cGV9O1xuICB9XG59O1xuIl19","/**\n * @license\n * Copyright 2020 Google LLC. All Rights Reserved.\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n * =============================================================================\n */\nimport { backend_util, Dilation2DBackpropInput, util } from '@tensorflow/tfjs-core';\nexport const dilation2DBackpropInputConfig = {\n kernelName: Dilation2DBackpropInput,\n backendName: 'cpu',\n kernelFunc: ({ inputs, backend, attrs }) => {\n const { x, filter, dy } = inputs;\n const { strides, pad, dilations } = attrs;\n const cpuBackend = backend;\n const $x = util.toNestedArray(x.shape, cpuBackend.data.get(x.dataId).values);\n const $filter = util.toNestedArray(filter.shape, cpuBackend.data.get(filter.dataId).values);\n const { batchSize, inHeight, inWidth, inChannels, outHeight, outWidth, padInfo, strideHeight, strideWidth, filterHeight, filterWidth, dilationHeight, dilationWidth, outShape } = backend_util.computeDilation2DInfo(x.shape, filter.shape, strides, pad, 'NHWC' /* dataFormat */, dilations);\n util.assert(dy.rank === outShape.length, () => `Error in ${Dilation2DBackpropInput}, dy ` +\n `must have the same rank as output ${outShape.length}, but got ` +\n `${dy.rank}`);\n const $dy = util.toNestedArray(outShape, cpuBackend.data.get(dy.dataId).values);\n // The computed gradients has the same dimensions as the input:\n // [batch, inputHeight, inputCols, inChannel]\n const gradients = util.makeZerosNestedTypedArray(x.shape, x.dtype);\n // In the case of multiple argmax branches, we only back-propagate along the\n // last branch, i.e., the one with largest value of `h * filter_cols + w`,\n // similarly to the max-pooling backward routines.\n // This implementation follows the TF c++ implementation:\n // https://github.com/tensorflow/tensorflow/blob/d9a3a849edc198e90172bc58eb293de457f9d986/tensorflow/core/kernels/dilation_ops.cc\n for (let b = 0; b < batchSize; ++b) {\n for (let hOut = 0; hOut < outHeight; ++hOut) {\n const hBeg = hOut * strideHeight - padInfo.top;\n for (let wOut = 0; wOut < outWidth; ++wOut) {\n const wBeg = wOut * strideWidth - padInfo.left;\n for (let d = 0; d < inChannels; ++d) {\n let curVal = Number.MIN_SAFE_INTEGER;\n let hInMax = (hBeg < 0) ? 0 : hBeg;\n let wInMax = (wBeg < 0) ? 0 : wBeg;\n for (let h = 0; h < filterHeight; ++h) {\n const hIn = hBeg + h * dilationHeight;\n if (hIn >= 0 && hIn < inHeight) {\n for (let w = 0; w < filterWidth; ++w) {\n const wIn = wBeg + w * dilationWidth;\n if (wIn >= 0 && wIn < inWidth) {\n const val = $x[b][hIn][wIn][d] + $filter[h][w][d];\n if (val > curVal) {\n curVal = val;\n hInMax = hIn;\n wInMax = wIn;\n }\n }\n }\n }\n }\n gradients[b][hInMax][wInMax][d] += $dy[b][hOut][wOut][d];\n }\n }\n }\n }\n const dataId = cpuBackend.write(util.toTypedArray(gradients, x.dtype), x.shape, x.dtype);\n return { dataId, shape: x.shape, dtype: x.dtype };\n }\n};\n//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiRGlsYXRpb24yREJhY2twcm9wSW5wdXQuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi8uLi90ZmpzLWJhY2tlbmQtY3B1L3NyYy9rZXJuZWxzL0RpbGF0aW9uMkRCYWNrcHJvcElucHV0LnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBOzs7Ozs7Ozs7Ozs7Ozs7R0FlRztBQUVILE9BQU8sRUFBQyxZQUFZLEVBQW1CLHVCQUF1QixFQUFrQyxJQUFJLEVBQUMsTUFBTSx1QkFBdUIsQ0FBQztBQUtuSSxNQUFNLENBQUMsTUFBTSw2QkFBNkIsR0FBaUI7SUFDekQsVUFBVSxFQUFFLHVCQUF1QjtJQUNuQyxXQUFXLEVBQUUsS0FBSztJQUNsQixVQUFVLEVBQUUsQ0FBQyxFQUFDLE1BQU0sRUFBRSxPQUFPLEVBQUUsS0FBSyxFQUFDLEVBQUUsRUFBRTtRQUN2QyxNQUFNLEVBQUMsQ0FBQyxFQUFFLE1BQU0sRUFBRSxFQUFFLEVBQUMsR0FDakIsTUFBdUQsQ0FBQztRQUM1RCxNQUFNLEVBQUMsT0FBTyxFQUFFLEdBQUcsRUFBRSxTQUFTLEVBQUMsR0FBRyxLQUE4QixDQUFDO1FBQ2pFLE1BQU0sVUFBVSxHQUFHLE9BQXlCLENBQUM7UUFFN0MsTUFBTSxFQUFFLEdBQ0osSUFBSSxDQUFDLGFBQWEsQ0FDZCxDQUFDLENBQUMsS0FBSyxFQUFFLFVBQVUsQ0FBQyxJQUFJLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxNQUFNLENBQUMsQ0FBQyxNQUFvQixDQUNqRCxDQUFDO1FBRW5CLE1BQU0sT0FBTyxHQUFHLElBQUksQ0FBQyxhQUFhLENBQ2QsTUFBTSxDQUFDLEtBQUssRUFDWixVQUFVLENBQUMsSUFBSSxDQUFDLEdBQUcsQ0FBQyxNQUFNLENBQUMsTUFBTSxDQUFDLENBQUMsTUFDckIsQ0FBaUIsQ0FBQztRQUVwRCxNQUFNLEVBQ0osU0FBUyxFQUNULFFBQVEsRUFDUixPQUFPLEVBQ1AsVUFBVSxFQUNWLFNBQVMsRUFDVCxR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LENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDO3dDQUNsRCxJQUFJLEdBQUcsR0FBRyxNQUFNLEVBQUU7NENBQ2hCLE1BQU0sR0FBRyxHQUFHLENBQUM7NENBQ2IsTUFBTSxHQUFHLEdBQUcsQ0FBQzs0Q0FDYixNQUFNLEdBQUcsR0FBRyxDQUFDO3lDQUNkO3FDQUNGO2lDQUNGOzZCQUNGO3lCQUNGO3dCQUNELFNBQVMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxNQUFNLENBQUMsQ0FBQyxNQUFNLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUM7cUJBQzFEO2lCQUNGO2FBQ0Y7U0FDRjtRQUVELE1BQU0sTUFBTSxHQUFHLFVBQVUsQ0FBQyxLQUFLLENBQzNCLElBQUksQ0FBQyxZQUFZLENBQUMsU0FBUyxFQUFFLENBQUMsQ0FBQyxLQUFLLENBQUMsRUFBRSxDQUFDLENBQUMsS0FBSyxFQUFFLENBQUMsQ0FBQyxLQUFLLENBQUMsQ0FBQztRQUU3RCxPQUFPLEVBQUMsTUFBTSxFQUFFLEtBQUssRUFBRSxDQUFDLENBQUMsS0FBSyxFQUFFLEtBQUssRUFBRSxDQUFDLENBQUMsS0FBSyxFQUFDLENBQUM7SUFDbEQsQ0FBQztDQUNGLENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyIvKipcbiAqIEBsaWNlbnNlXG4gKiBDb3B5cmlnaHQgMjAyMCBHb29nbGUgTExDLiBBbGwgUmlnaHRzIFJlc2VydmVkLlxuICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlIFwiTGljZW5zZVwiKTtcbiAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS5cbiAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdFxuICpcbiAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMFxuICpcbiAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmVcbiAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuIFwiQVMgSVNcIiBCQVNJUyxcbiAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLlxuICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZFxuICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuXG4gKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuICovXG5cbmltcG9ydCB7YmFja2VuZF91dGlsLCBEaWxhdGlvbjJEQXR0cnMsIERpbGF0aW9uMkRCYWNrcHJvcElucHV0LCBUZW5zb3IzRCwgVGVuc29yNEQsIFR5cGVkQXJyYXksIHV0aWx9IGZyb20gJ0B0ZW5zb3JmbG93L3RmanMtY29yZSc7XG5pbXBvcnQge0tlcm5lbENvbmZpZ30gZnJvbSAnQHRlbnNvcmZsb3cvdGZqcy1jb3JlJztcblxuaW1wb3J0IHtNYXRoQmFja2VuZENQVX0gZnJvbSAnLi4vYmFja2VuZF9jcHUnO1xuXG5leHBvcnQgY29uc3QgZGlsYXRpb24yREJhY2twcm9wSW5wdXRDb25maWc6IEtlcm5lbENvbmZpZyA9IHtcbiAga2VybmVsTmFtZTogRGlsYXRpb24yREJhY2twcm9wSW5wdXQsXG4gIGJhY2tlbmROYW1lOiAnY3B1JyxcbiAga2VybmVsRnVuYzogKHtpbnB1dHMsIGJhY2tlbmQsIGF0dHJzfSkgPT4ge1xuICAgIGNvbnN0IHt4LCBmaWx0ZXIsIGR5fSA9XG4gICAgICAgIGlucHV0cyBhcyB7eDogVGVuc29yNEQsIGZpbHRlcjogVGVuc29yM0QsIGR5OiBUZW5zb3I0RH07XG4gICAgY29uc3Qge3N0cmlkZXMsIHBhZCwgZGlsYXRpb25zfSA9IGF0dHJzIGFzIHt9IGFzIERpbGF0aW9uMkRBdHRycztcbiAgICBjb25zdCBjcHVCYWNrZW5kID0gYmFja2VuZCBhcyBNYXRoQmFja2VuZENQVTtcblxuICAgIGNvbnN0ICR4ID1cbiAgICAgICAgdXRpbC50b05lc3RlZEFycmF5KFxuICAgICAgICAgICAgeC5zaGFwZSwgY3B1QmFja2VuZC5kYXRhLmdldCh4LmRhdGFJZCkudmFsdWVzIGFzIFR5cGVkQXJyYXkpIGFzXG4gICAgICAgIG51bWJlcltdW11bXVtdO1xuXG4gICAgY29uc3QgJGZpbHRlciA9IHV0aWwudG9OZXN0ZWRBcnJheShcbiAgICAgICAgICAgICAgICAgICAgICAgIGZpbHRlci5zaGFwZSxcbiAgICAgICAgICAgICAgICAgICAgICAgIGNwdUJhY2tlbmQuZGF0YS5nZXQoZmlsdGVyLmRhdGFJZCkudmFsdWVzIGFzXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgVHlwZWRBcnJheSkgYXMgbnVtYmVyW11bXVtdO1xuXG4gICAgY29uc3Qge1xuICAgICAgYmF0Y2hTaXplLFxuICAgICAgaW5IZWlnaHQsXG4gICAgICBpbldpZHRoLFxuICAgICAgaW5DaGFubmVscyxcbiAgICAgIG91dEhlaWdodCxcbiAgICAgIG91dFdpZHRoLFxuICAgICAgcGFkSW5mbyxcbiAgICAgIHN0cmlkZUhlaWdodCxcbiAgICAgIHN0cmlkZVdpZHRoLFxuICAgICAgZmlsdGVySGVpZ2h0LFxuICAgICAgZmlsdGVyV2lkdGgsXG4gICAgICBkaWxhdGlvbkhlaWdodCxcbiAgICAgIGRpbGF0aW9uV2lkdGgsXG4gICAgICBvdXRTaGFwZVxuICAgIH0gPVxuICAgICAgICBiYWNrZW5kX3V0aWwuY29tcHV0ZURpbGF0aW9uMkRJbmZvKFxuICAgICAgICAgICAgeC5zaGFwZSBhcyBbbnVtYmVyLCBudW1iZXIsIG51bWJlciwgbnVtYmVyXSxcbiAgICAgICAgICAgIGZpbHRlci5zaGFwZSBhcyBbbnVtYmVyLCBudW1iZXIsIG51bWJlcl0sIHN0cmlkZXMsIHBhZCxcbiAgICAgICAgICAgICdOSFdDJyAvKiBkYXRhRm9ybWF0ICovLCBkaWxhdGlvbnMpO1xuXG4gICAgdXRpbC5hc3NlcnQoXG4gICAgICAgIGR5LnJhbmsgPT09IG91dFNoYXBlLmxlbmd0aCxcbiAgICAgICAgKCkgPT4gYEVycm9yIGluICR7RGlsYXRpb24yREJhY2twcm9wSW5wdXR9LCBkeSBgICtcbiAgICAgICAgICAgIGBtdXN0IGhhdmUgdGhlIHNhbWUgcmFuayBhcyBvdXRwdXQgJHtvdXRTaGFwZS5sZW5ndGh9LCBidXQgZ290IGAgK1xuICAgICAgICAgICAgYCR7ZHkucmFua31gKTtcblxuICAgIGNvbnN0ICRkeSA9XG4gICAgICAgIHV0aWwudG9OZXN0ZWRBcnJheShcbiAgICAgICAgICAgIG91dFNoYXBlLCBjcHVCYWNrZW5kLmRhdGEuZ2V0KGR5LmRhdGFJZCkudmFsdWVzIGFzIFR5cGVkQXJyYXkpIGFzXG4gICAgICAgIG51bWJlcltdW11bXVtdO1xuXG4gICAgLy8gVGhlIGNvbXB1dGVkIGdyYWRpZW50cyBoYXMgdGhlIHNhbWUgZGltZW5zaW9ucyBhcyB0aGUgaW5wdXQ6XG4gICAgLy8gW2JhdGNoLCBpbnB1dEhlaWdodCwgaW5wdXRDb2xzLCBpbkNoYW5uZWxdXG4gICAgY29uc3QgZ3JhZGllbnRzID1cbiAgICAgICAgdXRpbC5tYWtlWmVyb3NOZXN0ZWRUeXBlZEFycmF5KHguc2hhcGUsIHguZHR5cGUpIGFzIG51bWJlcltdW11bXVtdO1xuXG4gICAgLy8gSW4gdGhlIGNhc2Ugb2YgbXVsdGlwbGUgYXJnbWF4IGJyYW5jaGVzLCB3ZSBvbmx5IGJhY2stcHJvcGFnYXRlIGFsb25nIHRoZVxuICAgIC8vIGxhc3QgYnJhbmNoLCBpLmUuLCB0aGUgb25lIHdpdGggbGFyZ2VzdCB2YWx1ZSBvZiBgaCAqIGZpbHRlcl9jb2xzICsgd2AsXG4gICAgLy8gc2ltaWxhcmx5IHRvIHRoZSBtYXgtcG9vbGluZyBiYWNrd2FyZCByb3V0aW5lcy5cbiAgICAvLyBUaGlzIGltcGxlbWVudGF0aW9uIGZvbGxvd3MgdGhlIFRGIGMrKyBpbXBsZW1lbnRhdGlvbjpcbiAgICAvLyBodHRwczovL2dpdGh1Yi5jb20vdGVuc29yZmxvdy90ZW5zb3JmbG93L2Jsb2IvZDlhM2E4NDllZGMxOThlOTAxNzJiYzU4ZWIyOTNkZTQ1N2Y5ZDk4Ni90ZW5zb3JmbG93L2NvcmUva2VybmVscy9kaWxhdGlvbl9vcHMuY2NcbiAgICBmb3IgKGxldCBiID0gMDsgYiA8IGJhdGNoU2l6ZTsgKytiKSB7XG4gICAgICBmb3IgKGxldCBoT3V0ID0gMDsgaE91dCA8IG91dEhlaWdodDsgKytoT3V0KSB7XG4gICAgICAgIGNvbnN0IGhCZWcgPSBoT3V0ICogc3RyaWRlSGVpZ2h0IC0gcGFkSW5mby50b3A7XG4gICAgICAgIGZvciAobGV0IHdPdXQgPSAwOyB3T3V0IDwgb3V0V2lkdGg7ICsrd091dCkge1xuICAgICAgICAgIGNvbnN0IHdCZWcgPSB3T3V0ICogc3RyaWRlV2lkdGggLSBwYWRJbmZvLmxlZnQ7XG4gICAgICAgICAgZm9yIChsZXQgZCA9IDA7IGQgPCBpbkNoYW5uZWxzOyArK2QpIHtcbiAgICAgICAgICAgIGxldCBjdXJWYWwgPSBOdW1iZXIuTUlOX1NBRkVfSU5URUdFUjtcbiAgICAgICAgICAgIGxldCBoSW5NYXggPSAoaEJlZyA8IDApID8gMCA6IGhCZWc7XG4gICAgICAgICAgICBsZXQgd0luTWF4ID0gKHdCZWcgPCAwKSA/IDAgOiB3QmVnO1xuICAgICAgICAgICAgZm9yIChsZXQgaCA9IDA7IGggPCBmaWx0ZXJIZWlnaHQ7ICsraCkge1xuICAgICAgICAgICAgICBjb25zdCBoSW4gPSBoQmVnICsgaCAqIGRpbGF0aW9uSGVpZ2h0O1xuICAgICAgICAgICAgICBpZiAoaEluID49IDAgJiYgaEluIDwgaW5IZWlnaHQpIHtcbiAgICAgICAgICAgICAgICBmb3IgKGxldCB3ID0gMDsgdyA8IGZpbHRlcldpZHRoOyArK3cpIHtcbiAgICAgICAgICAgICAgICAgIGNvbnN0IHdJbiA9IHdCZWcgKyB3ICogZGlsYXRpb25XaWR0aDtcbiAgICAgICAgICAgICAgICAgIGlmICh3SW4gPj0gMCAmJiB3SW4gPCBpbldpZHRoKSB7XG4gICAgICAgICAgICAgICAgICAgIGNvbnN0IHZhbCA9ICR4W2JdW2hJbl1bd0luXVtkXSArICRmaWx0ZXJbaF1bd11bZF07XG4gICAgICAgICAgICAgICAgICAgIGlmICh2YWwgPiBjdXJWYWwpIHtcbiAgICAgICAgICAgICAgICAgICAgICBjdXJWYWwgPSB2YWw7XG4gICAgICAgICAgICAgICAgICAgICAgaEluTWF4ID0gaEluO1xuICAgICAgICAgICAgICAgICAgICAgIHdJbk1heCA9IHdJbjtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICAgICAgZ3JhZGllbnRzW2JdW2hJbk1heF1bd0luTWF4XVtkXSArPSAkZHlbYl1baE91dF1bd091dF1bZF07XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICB9XG4gICAgfVxuXG4gICAgY29uc3QgZGF0YUlkID0gY3B1QmFja2VuZC53cml0ZShcbiAgICAgICAgdXRpbC50b1R5cGVkQXJyYXkoZ3JhZGllbnRzLCB4LmR0eXBlKSwgeC5zaGFwZSwgeC5kdHlwZSk7XG5cbiAgICByZXR1cm4ge2RhdGFJZCwgc2hhcGU6IHguc2hhcGUsIGR0eXBlOiB4LmR0eXBlfTtcbiAgfVxufTtcbiJdfQ==","/**\n * @license\n * Copyright 2020 Google LLC. All Rights Reserved.\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n * =============================================================================\n */\nimport { Multiply } from '@tensorflow/tfjs-core';\nimport { createSimpleBinaryKernelImpl } from '../utils/binary_impl';\nimport { binaryKernelFunc, createComplexBinaryKernelImpl } from '../utils/binary_utils';\nexport const multiplyImpl = createSimpleBinaryKernelImpl(((aValue, bValue) => aValue * bValue));\nexport const multiplyComplexImpl = createComplexBinaryKernelImpl(((aReal, aImag, bReal, bImag) => {\n return {\n real: aReal * bReal - aImag * bImag,\n imag: aReal * bImag + aImag * bReal\n };\n}));\nexport const multiply = binaryKernelFunc(Multiply, multiplyImpl, multiplyComplexImpl);\nexport const multiplyConfig = {\n kernelName: Multiply,\n backendName: 'cpu',\n kernelFunc: multiply\n};\n//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiTXVsdGlwbHkuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi8uLi90ZmpzLWJhY2tlbmQtY3B1L3NyYy9rZXJuZWxzL011bHRpcGx5LnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBOzs7Ozs7Ozs7Ozs7Ozs7R0FlRztBQUVILE9BQU8sRUFBZSxRQUFRLEVBQUMsTUFBTSx1QkFBdUIsQ0FBQztBQUM3RCxPQUFPLEVBQUMsNEJBQTRCLEVBQUMsTUFBTSxzQkFBc0IsQ0FBQztBQUNsRSxPQUFPLEVBQUMsZ0JBQWdCLEVBQUUsNkJBQTZCLEVBQUMsTUFBTSx1QkFBdUIsQ0FBQztBQUV0RixNQUFNLENBQUMsTUFBTSxZQUFZLEdBQUcsNEJBQTRCLENBQ3BELENBQUMsQ0FBQyxNQUFjLEVBQUUsTUFBYyxFQUFFLEVBQUUsQ0FBQyxNQUFNLEdBQUcsTUFBTSxDQUFDLENBQUMsQ0FBQztBQUMzRCxNQUFNLENBQUMsTUFBTSxtQkFBbUIsR0FDNUIsNkJBQTZCLENBQUMsQ0FBQyxDQUFDLEtBQUssRUFBRSxLQUFLLEVBQUUsS0FBSyxFQUFFLEtBQUssRUFBRSxFQUFFO0lBQzVELE9BQU87UUFDTCxJQUFJLEVBQUUsS0FBSyxHQUFHLEtBQUssR0FBRyxLQUFLLEdBQUcsS0FBSztRQUNuQyxJQUFJLEVBQUUsS0FBSyxHQUFHLEtBQUssR0FBRyxLQUFLLEdBQUcsS0FBSztLQUNwQyxDQUFDO0FBQ0osQ0FBQyxDQUFDLENBQUMsQ0FBQztBQUVSLE1BQU0sQ0FBQyxNQUFNLFFBQVEsR0FDakIsZ0JBQWdCLENBQUMsUUFBUSxFQUFFLFlBQVksRUFBRSxtQkFBbUIsQ0FBQyxDQUFDO0FBRWxFLE1BQU0sQ0FBQyxNQUFNLGNBQWMsR0FBaUI7SUFDMUMsVUFBVSxFQUFFLFFBQVE7SUFDcEIsV0FBVyxFQUFFLEtBQUs7SUFDbEIsVUFBVSxFQUFFLFFBQVE7Q0FDckIsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbIi8qKlxuICogQGxpY2Vuc2VcbiAqIENvcHlyaWdodCAyMDIwIEdvb2dsZSBMTEMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuXG4gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgXCJMaWNlbnNlXCIpO1xuICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLlxuICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0XG4gKlxuICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wXG4gKlxuICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZVxuICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gXCJBUyBJU1wiIEJBU0lTLFxuICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuXG4gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kXG4gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS5cbiAqID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4gKi9cblxuaW1wb3J0IHtLZXJuZWxDb25maWcsIE11bHRpcGx5fSBmcm9tICdAdGVuc29yZmxvdy90ZmpzLWNvcmUnO1xuaW1wb3J0IHtjcmVhdGVTaW1wbGVCaW5hcnlLZXJuZWxJbXBsfSBmcm9tICcuLi91dGlscy9iaW5hcnlfaW1wbCc7XG5pbXBvcnQge2JpbmFyeUtlcm5lbEZ1bmMsIGNyZWF0ZUNvbXBsZXhCaW5hcnlLZXJuZWxJbXBsfSBmcm9tICcuLi91dGlscy9iaW5hcnlfdXRpbHMnO1xuXG5leHBvcnQgY29uc3QgbXVsdGlwbHlJbXBsID0gY3JlYXRlU2ltcGxlQmluYXJ5S2VybmVsSW1wbChcbiAgICAoKGFWYWx1ZTogbnVtYmVyLCBiVmFsdWU6IG51bWJlcikgPT4gYVZhbHVlICogYlZhbHVlKSk7XG5leHBvcnQgY29uc3QgbXVsdGlwbHlDb21wbGV4SW1wbCA9XG4gICAgY3JlYXRlQ29tcGxleEJpbmFyeUtlcm5lbEltcGwoKChhUmVhbCwgYUltYWcsIGJSZWFsLCBiSW1hZykgPT4ge1xuICAgICAgcmV0dXJuIHtcbiAgICAgICAgcmVhbDogYVJlYWwgKiBiUmVhbCAtIGFJbWFnICogYkltYWcsXG4gICAgICAgIGltYWc6IGFSZWFsICogYkltYWcgKyBhSW1hZyAqIGJSZWFsXG4gICAgICB9O1xuICAgIH0pKTtcblxuZXhwb3J0IGNvbnN0IG11bHRpcGx5ID1cbiAgICBiaW5hcnlLZXJuZWxGdW5jKE11bHRpcGx5LCBtdWx0aXBseUltcGwsIG11bHRpcGx5Q29tcGxleEltcGwpO1xuXG5leHBvcnQgY29uc3QgbXVsdGlwbHlDb25maWc6IEtlcm5lbENvbmZpZyA9IHtcbiAga2VybmVsTmFtZTogTXVsdGlwbHksXG4gIGJhY2tlbmROYW1lOiAnY3B1JyxcbiAga2VybmVsRnVuYzogbXVsdGlwbHlcbn07XG4iXX0=","/**\n * @license\n * Copyright 2020 Google LLC. All Rights Reserved.\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n * =============================================================================\n */\nimport { backend_util, Sum, util } from '@tensorflow/tfjs-core';\nimport { assertNotComplex } from '../cpu_util';\nimport { zeros } from '../utils/zeros_impl';\nimport { cast } from './Cast';\nimport { identity } from './Identity';\nimport { reshape } from './Reshape';\nimport { transpose } from './Transpose';\nexport function sum(args) {\n const { inputs, backend, attrs } = args;\n const { x } = inputs;\n const { axis, keepDims } = attrs;\n assertNotComplex(x, 'sum');\n let $x;\n if (x.dtype === 'bool') {\n $x = cast({ inputs: { x }, backend, attrs: { dtype: 'int32' } });\n }\n else {\n $x = identity({ inputs: { x }, backend });\n }\n const xRank = $x.shape.length;\n const axes = util.parseAxisParam(axis, $x.shape);\n const permutation = backend_util.getAxesPermutation(axes, xRank);\n let reductionAxes = axes;\n let permutedX = $x;\n if (permutation != null) {\n permutedX =\n transpose({ inputs: { x: $x }, backend, attrs: { perm: permutation } });\n reductionAxes = backend_util.getInnerMostAxes(reductionAxes.length, xRank);\n }\n backend_util.assertAxesAreInnerMostDims('sum', reductionAxes, permutedX.shape.length);\n const [outShape, reduceShape] = backend_util.computeOutAndReduceShapes(permutedX.shape, reductionAxes);\n const resultDtype = backend_util.upcastType(permutedX.dtype, 'int32');\n let result = zeros(backend, outShape, resultDtype);\n const reduceSize = util.sizeFromShape(reduceShape);\n const vals = backend.data.get(result.dataId).values;\n const aVals = backend.data.get(permutedX.dataId).values;\n for (let i = 0; i < vals.length; ++i) {\n const offset = i * reduceSize;\n let sum = 0;\n for (let j = 0; j < reduceSize; ++j) {\n sum += aVals[offset + j];\n }\n vals[i] = sum;\n }\n if (keepDims) {\n const newShape = backend_util.expandShapeToKeepDim(result.shape, axes);\n const oldResult = result;\n result = reshape({ inputs: { x: result }, backend, attrs: { shape: newShape } });\n backend.disposeIntermediateTensorInfo(oldResult);\n }\n backend.disposeIntermediateTensorInfo($x);\n if (permutation != null) {\n backend.disposeIntermediateTensorInfo(permutedX);\n }\n return result;\n}\nexport const sumConfig = {\n kernelName: Sum,\n backendName: 'cpu',\n kernelFunc: sum\n};\n//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiU3VtLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vLi4vdGZqcy1iYWNrZW5kLWNwdS9zcmMva2VybmVscy9TdW0udHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUE7Ozs7Ozs7Ozs7Ozs7OztHQWVHO0FBRUgsT0FBTyxFQUFDLFlBQVksRUFBNEIsR0FBRyxFQUErQyxJQUFJLEVBQUMsTUFBTSx1QkFBdUIsQ0FBQztBQUdySSxPQUFPLEVBQUMsZ0JBQWdCLEVBQUMsTUFBTSxhQUFhLENBQUM7QUFDN0MsT0FBTyxFQUFDLEtBQUssRUFBQyxNQUFNLHFCQUFxQixDQUFDO0FBQzFDLE9BQU8sRUFBQyxJQUFJLEVBQUMsTUFBTSxRQUFRLENBQUM7QUFDNUIsT0FBTyxFQUFDLFFBQVEsRUFBQyxNQUFNLFlBQVksQ0FBQztBQUNwQyxPQUFPLEVBQUMsT0FBTyxFQUFDLE1BQU0sV0FBVyxDQUFDO0FBQ2xDLE9BQU8sRUFBQyxTQUFTLEVBQUMsTUFBTSxhQUFhLENBQUM7QUFFdEMsTUFBTSxVQUFVLEdBQUcsQ0FDZixJQUFtRTtJQUVyRSxNQUFNLEVBQUMsTUFBTSxFQUFFLE9BQU8sRUFBRSxLQUFLLEVBQUMsR0FBRyxJQUFJLENBQUM7SUFDdEMsTUFBTSxFQUFDLENBQUMsRUFBQyxHQUFHLE1BQU0sQ0FBQztJQUNuQixNQUFNLEVBQUMsSUFBSSxFQUFFLFFBQVEsRUFBQyxHQUFHLEtBQUssQ0FBQztJQUUvQixnQkFBZ0IsQ0FBQyxDQUFDLEVBQUUsS0FBSyxDQUFDLENBQUM7SUFFM0IsSUFBSSxFQUFFLENBQUM7SUFDUCxJQUFJLENBQUMsQ0FBQyxLQUFLLEtBQUssTUFBTSxFQUFFO1FBQ3RCLEVBQUUsR0FBRyxJQUFJLENBQUMsRUFBQyxNQUFNLEVBQUUsRUFBQyxDQUFDLEVBQUMsRUFBRSxPQUFPLEVBQUUsS0FBSyxFQUFFLEVBQUMsS0FBSyxFQUFFLE9BQU8sRUFBQyxFQUFDLENBQUMsQ0FBQztLQUM1RDtTQUFNO1FBQ0ws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QyxDQUFDO0lBRTFDLElBQUksV0FBVyxJQUFJLElBQUksRUFBRTtRQUN2QixPQUFPLENBQUMsNkJBQTZCLENBQUMsU0FBUyxDQUFDLENBQUM7S0FDbEQ7SUFFRCxPQUFPLE1BQU0sQ0FBQztBQUNoQixDQUFDO0FBRUQsTUFBTSxDQUFDLE1BQU0sU0FBUyxHQUFpQjtJQUNyQyxVQUFVLEVBQUUsR0FBRztJQUNmLFdBQVcsRUFBRSxLQUFLO0lBQ2xCLFVBQVUsRUFBRSxHQUF1QjtDQUNwQyxDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiLyoqXG4gKiBAbGljZW5zZVxuICogQ29weXJpZ2h0IDIwMjAgR29vZ2xlIExMQy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC5cbiAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSBcIkxpY2Vuc2VcIik7XG4gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuXG4gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXRcbiAqXG4gKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjBcbiAqXG4gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlXG4gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiBcIkFTIElTXCIgQkFTSVMsXG4gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC5cbiAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmRcbiAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLlxuICogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbiAqL1xuXG5pbXBvcnQge2JhY2tlbmRfdXRpbCwgS2VybmVsQ29uZmlnLCBLZXJuZWxGdW5jLCBTdW0sIFN1bUF0dHJzLCBTdW1JbnB1dHMsIFRlbnNvckluZm8sIFR5cGVkQXJyYXksIHV0aWx9IGZyb20gJ0B0ZW5zb3JmbG93L3RmanMtY29yZSc7XG5cbmltcG9ydCB7TWF0aEJhY2tlbmRDUFV9IGZyb20gJy4uL2JhY2tlbmRfY3B1JztcbmltcG9ydCB7YXNzZXJ0Tm90Q29tcGxleH0gZnJvbSAnLi4vY3B1X3V0aWwnO1xuaW1wb3J0IHt6ZXJvc30gZnJvbSAnLi4vdXRpbHMvemVyb3NfaW1wbCc7XG5pbXBvcnQge2Nhc3R9IGZyb20gJy4vQ2FzdCc7XG5pbXBvcnQge2lkZW50aXR5fSBmcm9tICcuL0lkZW50aXR5JztcbmltcG9ydCB7cmVzaGFwZX0gZnJvbSAnLi9SZXNoYXBlJztcbmltcG9ydCB7dHJhbnNwb3NlfSBmcm9tICcuL1RyYW5zcG9zZSc7XG5cbmV4cG9ydCBmdW5jdGlvbiBzdW0oXG4gICAgYXJnczoge2lucHV0czogU3VtSW5wdXRzLCBiYWNrZW5kOiBNYXRoQmFja2VuZENQVSwgYXR0cnM6IFN1bUF0dHJzfSk6XG4gICAgVGVuc29ySW5mbyB7XG4gIGNvbnN0IHtpbnB1dHMsIGJhY2tlbmQsIGF0dHJzfSA9IGFyZ3M7XG4gIGNvbnN0IHt4fSA9IGlucHV0cztcbiAgY29uc3Qge2F4aXMsIGtlZXBEaW1zfSA9IGF0dHJzO1xuXG4gIGFzc2VydE5vdENvbXBsZXgoeCwgJ3N1bScpO1xuXG4gIGxldCAkeDtcbiAgaWYgKHguZHR5cGUgPT09ICdib29sJykge1xuICAgICR4ID0gY2FzdCh7aW5wdXRzOiB7eH0sIGJhY2tlbmQsIGF0dHJzOiB7ZHR5cGU6ICdpbnQzMid9fSk7XG4gIH0gZWxzZSB7XG4gICAgJHggPSBpZGVudGl0eSh7aW5wdXRzOiB7eH0sIGJhY2tlbmR9KTtcbiAgfVxuXG4gIGNvbnN0IHhSYW5rID0gJHguc2hhcGUubGVuZ3RoO1xuICBjb25zdCBheGVzID0gdXRpbC5wYXJzZUF4aXNQYXJhbShheGlzLCAkeC5zaGFwZSk7XG4gIGNvbnN0IHBlcm11dGF0aW9uID0gYmFja2VuZF91dGlsLmdldEF4ZXNQZXJtdXRhdGlvbihheGVzLCB4UmFuayk7XG5cbiAgbGV0IHJlZHVjdGlvbkF4ZXMgPSBheGVzO1xuICBsZXQgcGVybXV0ZWRYID0gJHg7XG4gIGlmIChwZXJtdXRhdGlvbiAhPSBudWxsKSB7XG4gICAgcGVybXV0ZWRYID1cbiAgICAgICAgdHJhbnNwb3NlKHtpbnB1dHM6IHt4OiAkeH0sIGJhY2tlbmQsIGF0dHJzOiB7cGVybTogcGVybXV0YXRpb259fSk7XG4gICAgcmVkdWN0aW9uQXhlcyA9IGJhY2tlbmRfdXRpbC5nZXRJbm5lck1vc3RBeGVzKHJlZHVjdGlvbkF4ZXMubGVuZ3RoLCB4UmFuayk7XG4gIH1cblxuICBiYWNrZW5kX3V0aWwuYXNzZXJ0QXhlc0FyZUlubmVyTW9zdERpbXMoXG4gICAgICAnc3VtJywgcmVkdWN0aW9uQXhlcywgcGVybXV0ZWRYLnNoYXBlLmxlbmd0aCk7XG5cbiAgY29uc3QgW291dFNoYXBlLCByZWR1Y2VTaGFwZV0gPVxuICAgICAgYmFja2VuZF91dGlsLmNvbXB1dGVPdXRBbmRSZWR1Y2VTaGFwZXMocGVybXV0ZWRYLnNoYXBlLCByZWR1Y3Rpb25BeGVzKTtcbiAgY29uc3QgcmVzdWx0RHR5cGUgPSBiYWNrZW5kX3V0aWwudXBjYXN0VHlwZShwZXJtdXRlZFguZHR5cGUsICdpbnQzMicpO1xuICBsZXQgcmVzdWx0ID0gemVyb3MoYmFja2VuZCwgb3V0U2hhcGUsIHJlc3VsdER0eXBlKTtcbiAgY29uc3QgcmVkdWNlU2l6ZSA9IHV0aWwuc2l6ZUZyb21TaGFwZShyZWR1Y2VTaGFwZSk7XG4gIGNvbnN0IHZhbHMgPSBiYWNrZW5kLmRhdGEuZ2V0KHJlc3VsdC5kYXRhSWQpLnZhbHVlcyBhcyBUeXBlZEFycmF5O1xuXG4gIGNvbnN0IGFWYWxzID0gYmFja2VuZC5kYXRhLmdldChwZXJtdXRlZFguZGF0YUlkKS52YWx1ZXMgYXMgVHlwZWRBcnJheTtcbiAgZm9yIChsZXQgaSA9IDA7IGkgPCB2YWxzLmxlbmd0aDsgKytpKSB7XG4gICAgY29uc3Qgb2Zmc2V0ID0gaSAqIHJlZHVjZVNpemU7XG4gICAgbGV0IHN1bSA9IDA7XG4gICAgZm9yIChsZXQgaiA9IDA7IGogPCByZWR1Y2VTaXplOyArK2opIHtcbiAgICAgIHN1bSArPSBhVmFsc1tvZmZzZXQgKyBqXTtcbiAgICB9XG4gICAgdmFsc1tpXSA9IHN1bTtcbiAgfVxuXG4gIGlmIChrZWVwRGltcykge1xuICAgIGNvbnN0IG5ld1NoYXBlID0gYmFja2VuZF91dGlsLmV4cGFuZFNoYXBlVG9LZWVwRGltKHJlc3VsdC5zaGFwZSwgYXhlcyk7XG4gICAgY29uc3Qgb2xkUmVzdWx0ID0gcmVzdWx0O1xuICAgIHJlc3VsdCA9IHJlc2hhcGUoe2lucHV0czoge3g6IHJlc3VsdH0sIGJhY2tlbmQsIGF0dHJzOiB7c2hhcGU6IG5ld1NoYXBlfX0pO1xuICAgIGJhY2tlbmQuZGlzcG9zZUludGVybWVkaWF0ZVRlbnNvckluZm8ob2xkUmVzdWx0KTtcbiAgfVxuXG4gIGJhY2tlbmQuZGlzcG9zZUludGVybWVkaWF0ZVRlbnNvckluZm8oJHgpO1xuXG4gIGlmIChwZXJtdXRhdGlvbiAhPSBudWxsKSB7XG4gICAgYmFja2VuZC5kaXNwb3NlSW50ZXJtZWRpYXRlVGVuc29ySW5mbyhwZXJtdXRlZFgpO1xuICB9XG5cbiAgcmV0dXJuIHJlc3VsdDtcbn1cblxuZXhwb3J0IGNvbnN0IHN1bUNvbmZpZzogS2VybmVsQ29uZmlnID0ge1xuICBrZXJuZWxOYW1lOiBTdW0sXG4gIGJhY2tlbmROYW1lOiAnY3B1JyxcbiAga2VybmVsRnVuYzogc3VtIGFzIHt9IGFzIEtlcm5lbEZ1bmNcbn07XG4iXX0=","/**\n * @license\n * Copyright 2021 Google LLC. All Rights Reserved.\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n * =============================================================================\n */\nimport { backend_util, Einsum, util } from '@tensorflow/tfjs-core';\nimport { multiply } from './Multiply';\nimport { reshape } from './Reshape';\nimport { sum } from './Sum';\nimport { transpose } from './Transpose';\nexport function einsum(args) {\n const { inputs, backend, attrs } = args;\n const { equation } = attrs;\n const tensors = inputs;\n const { allDims, summedDims, idDims } = backend_util.decodeEinsumEquation(equation, tensors.length);\n backend_util.checkEinsumDimSizes(allDims.length, idDims, tensors);\n const { path, steps } = backend_util.getEinsumComputePath(summedDims, idDims);\n const nSteps = steps.length;\n let out = null;\n let numDimsRemaining = allDims.length;\n const tensorsToDispose = [];\n for (let i = 0; i < nSteps; ++i) {\n for (const idTerm of steps[i]) {\n const { permutationIndices: perm, expandDims: dimsToExpand } = backend_util.getEinsumPermutation(numDimsRemaining, idDims[idTerm]);\n let x;\n if (backend_util.isIdentityPermutation(perm)) {\n x = tensors[idTerm];\n }\n else {\n x = transpose({ inputs: { x: tensors[idTerm] }, backend, attrs: { perm } });\n tensorsToDispose.push(x);\n }\n const targetShape = x.shape.slice();\n for (let k = 0; k < dimsToExpand.length; ++k) {\n targetShape.splice(dimsToExpand[k], 0, 1);\n }\n if (!util.arraysEqual(x.shape, targetShape)) {\n x = reshape({ inputs: { x }, backend, attrs: { shape: targetShape } });\n tensorsToDispose.push(x);\n }\n if (out === null) {\n out = x;\n }\n else {\n // tslint:disable-next-line: no-unnecessary-type-assertion\n out = multiply({ inputs: { a: x, b: out }, backend });\n tensorsToDispose.push(out);\n }\n }\n if (i < nSteps - 1) {\n if (path[i] >= 0) {\n out = sum({\n inputs: { x: out },\n backend,\n attrs: {\n axis: path[i] - (allDims.length - numDimsRemaining),\n keepDims: false\n }\n });\n tensorsToDispose.push(out);\n }\n numDimsRemaining--;\n }\n }\n // Clean up intermediate tensors.\n for (const tensorInfo of tensorsToDispose) {\n if (tensorInfo === out) {\n continue;\n }\n backend.disposeIntermediateTensorInfo(tensorInfo);\n }\n return out;\n}\nexport const einsumConfig = {\n kernelName: Einsum,\n backendName: 'cpu',\n kernelFunc: einsum\n};\n//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiRWluc3VtLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vLi4vdGZqcy1iYWNrZW5kLWNwdS9zcmMva2VybmVscy9FaW5zdW0udHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUE7Ozs7Ozs7Ozs7Ozs7OztHQWVHO0FBRUgsT0FBTyxFQUFDLFlBQVksRUFBRSxNQUFNLEVBQTJFLElBQUksRUFBQyxNQUFNLHVCQUF1QixDQUFDO0FBSTFJLE9BQU8sRUFBQyxRQUFRLEVBQUMsTUFBTSxZQUFZLENBQUM7QUFDcEMsT0FBTyxFQUFDLE9BQU8sRUFBQyxNQUFNLFdBQVcsQ0FBQztBQUNsQyxPQUFPLEVBQUMsR0FBRyxFQUFDLE1BQU0sT0FBTyxDQUFDO0FBQzFCLE9BQU8sRUFBQyxTQUFTLEVBQUMsTUFBTSxhQUFhLENBQUM7QUFFdEMsTUFBTSxVQUFVLE1BQU0sQ0FDbEIsSUFBeUU7SUFFM0UsTUFBTSxFQUFDLE1BQU0sRUFBRSxPQUFPLEVBQUUsS0FBSyxFQUFDLEdBQUcsSUFBSSxDQUFDO0lBQ3RDLE1BQU0sRUFBQyxRQUFRLEVBQUMsR0FBRyxLQUFLLENBQUM7SUFDekIsTUFBTSxPQUFPLEdBQUcsTUFBa0IsQ0FBQztJQUVuQyxNQUFNLEVBQUMsT0FBTyxFQUFFLFVBQVUsRUFBRSxNQUFNLEVBQUMsR0FDL0IsWUFBWSxDQUFDLG9CQUFvQixDQUFDLFFBQVEsRUFBRSxPQUFPLENBQUMsTUFBTSxDQUFDLENBQUM7SUFDaEUsWUFBWSxDQUFDLG1CQUFtQixDQUFDLE9BQU8sQ0FBQyxNQUFNLEVBQUUsTUFBTSxFQUFFLE9BQU8sQ0FBQyxDQUFDO0lBQ2xFLE1BQU0sRUFBQyxJQUFJLEVBQUUsS0FBSyxFQUFDLEdBQUcsWUFBWSxDQUFDLG9CQUFvQixDQUFDLFVBQVUsRUFBRSxNQUFNLENBQUMsQ0FBQztJQUU1RSxNQUFNLE1BQU0sR0FBRyxLQUFLLENBQUMsTUFBTSxDQUFDO0lBQzVCLElBQUksR0FBRyxHQUFvQixJQUFJLENB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LEtBQUssR0FBRyxFQUFFO1lBQ3RCLFNBQVM7U0FDVjtRQUNELE9BQU8sQ0FBQyw2QkFBNkIsQ0FBQyxVQUFVLENBQUMsQ0FBQztLQUNuRDtJQUVELE9BQU8sR0FBRyxDQUFDO0FBQ2IsQ0FBQztBQUVELE1BQU0sQ0FBQyxNQUFNLFlBQVksR0FBaUI7SUFDeEMsVUFBVSxFQUFFLE1BQU07SUFDbEIsV0FBVyxFQUFFLEtBQUs7SUFDbEIsVUFBVSxFQUFFLE1BQTBCO0NBQ3ZDLENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyIvKipcbiAqIEBsaWNlbnNlXG4gKiBDb3B5cmlnaHQgMjAyMSBHb29nbGUgTExDLiBBbGwgUmlnaHRzIFJlc2VydmVkLlxuICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlIFwiTGljZW5zZVwiKTtcbiAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS5cbiAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdFxuICpcbiAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMFxuICpcbiAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmVcbiAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuIFwiQVMgSVNcIiBCQVNJUyxcbiAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLlxuICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZFxuICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuXG4gKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuICovXG5cbmltcG9ydCB7YmFja2VuZF91dGlsLCBFaW5zdW0sIEVpbnN1bUF0dHJzLCBFaW5zdW1JbnB1dHMsIEtlcm5lbENvbmZpZywgS2VybmVsRnVuYywgVGVuc29yLCBUZW5zb3JJbmZvLCB1dGlsfSBmcm9tICdAdGVuc29yZmxvdy90ZmpzLWNvcmUnO1xuXG5pbXBvcnQge01hdGhCYWNrZW5kQ1BVfSBmcm9tICcuLi9iYWNrZW5kX2NwdSc7XG5cbmltcG9ydCB7bXVsdGlwbHl9IGZyb20gJy4vTXVsdGlwbHknO1xuaW1wb3J0IHtyZXNoYXBlfSBmcm9tICcuL1Jlc2hhcGUnO1xuaW1wb3J0IHtzdW19IGZyb20gJy4vU3VtJztcbmltcG9ydCB7dHJhbnNwb3NlfSBmcm9tICcuL1RyYW5zcG9zZSc7XG5cbmV4cG9ydCBmdW5jdGlvbiBlaW5zdW0oXG4gICAgYXJnczoge2lucHV0czogRWluc3VtSW5wdXRzLCBiYWNrZW5kOiBNYXRoQmFja2VuZENQVSwgYXR0cnM6IEVpbnN1bUF0dHJzfSk6XG4gICAgVGVuc29ySW5mbyB7XG4gIGNvbnN0IHtpbnB1dHMsIGJhY2tlbmQsIGF0dHJzfSA9IGFyZ3M7XG4gIGNvbnN0IHtlcXVhdGlvbn0gPSBhdHRycztcbiAgY29uc3QgdGVuc29ycyA9IGlucHV0cyBhcyBUZW5zb3JbXTtcblxuICBjb25zdCB7YWxsRGltcywgc3VtbWVkRGltcywgaWREaW1zfSA9XG4gICAgICBiYWNrZW5kX3V0aWwuZGVjb2RlRWluc3VtRXF1YXRpb24oZXF1YXRpb24sIHRlbnNvcnMubGVuZ3RoKTtcbiAgYmFja2VuZF91dGlsLmNoZWNrRWluc3VtRGltU2l6ZXMoYWxsRGltcy5sZW5ndGgsIGlkRGltcywgdGVuc29ycyk7XG4gIGNvbnN0IHtwYXRoLCBzdGVwc30gPSBiYWNrZW5kX3V0aWwuZ2V0RWluc3VtQ29tcHV0ZVBhdGgoc3VtbWVkRGltcywgaWREaW1zKTtcblxuICBjb25zdCBuU3RlcHMgPSBzdGVwcy5sZW5ndGg7XG4gIGxldCBvdXQ6IFRlbnNvckluZm98bnVsbCA9IG51bGw7XG4gIGxldCBudW1EaW1zUmVtYWluaW5nID0gYWxsRGltcy5sZW5ndGg7XG4gIGNvbnN0IHRlbnNvcnNUb0Rpc3Bvc2U6IFRlbnNvckluZm9bXSA9IFtdO1xuICBmb3IgKGxldCBpID0gMDsgaSA8IG5TdGVwczsgKytpKSB7XG4gICAgZm9yIChjb25zdCBpZFRlcm0gb2Ygc3RlcHNbaV0pIHtcbiAgICAgIGNvbnN0IHtwZXJtdXRhdGlvbkluZGljZXM6IHBlcm0sIGV4cGFuZERpbXM6IGRpbXNUb0V4cGFuZH0gPVxuICAgICAgICAgIGJhY2tlbmRfdXRpbC5nZXRFaW5zdW1QZXJtdXRhdGlvbihudW1EaW1zUmVtYWluaW5nLCBpZERpbXNbaWRUZXJtXSk7XG4gICAgICBsZXQgeDogVGVuc29ySW5mbztcbiAgICAgIGlmIChiYWNrZW5kX3V0aWwuaXNJZGVudGl0eVBlcm11dGF0aW9uKHBlcm0pKSB7XG4gICAgICAgIHggPSB0ZW5zb3JzW2lkVGVybV07XG4gICAgICB9IGVsc2Uge1xuICAgICAgICB4ID0gdHJhbnNwb3NlKHtpbnB1dHM6IHt4OiB0ZW5zb3JzW2lkVGVybV19LCBiYWNrZW5kLCBhdHRyczoge3Blcm19fSk7XG4gICAgICAgIHRlbnNvcnNUb0Rpc3Bvc2UucHVzaCh4KTtcbiAgICAgIH1cbiAgICAgIGNvbnN0IHRhcmdldFNoYXBlOiBudW1iZXJbXSA9IHguc2hhcGUuc2xpY2UoKTtcbiAgICAgIGZvciAobGV0IGsgPSAwOyBrIDwgZGltc1RvRXhwYW5kLmxlbmd0aDsgKytrKSB7XG4gICAgICAgIHRhcmdldFNoYXBlLnNwbGljZShkaW1zVG9FeHBhbmRba10sIDAsIDEpO1xuICAgICAgfVxuXG4gICAgICBpZiAoIXV0aWwuYXJyYXlzRXF1YWwoeC5zaGFwZSwgdGFyZ2V0U2hhcGUpKSB7XG4gICAgICAgIHggPSByZXNoYXBlKHtpbnB1dHM6IHt4fSwgYmFja2VuZCwgYXR0cnM6IHtzaGFwZTogdGFyZ2V0U2hhcGV9fSk7XG4gICAgICAgIHRlbnNvcnNUb0Rpc3Bvc2UucHVzaCh4KTtcbiAgICAgIH1cbiAgICAgIGlmIChvdXQgPT09IG51bGwpIHtcbiAgICAgICAgb3V0ID0geDtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIC8vIHRzbGludDpkaXNhYmxlLW5leHQtbGluZTogbm8tdW5uZWNlc3NhcnktdHlwZS1hc3NlcnRpb25cbiAgICAgICAgb3V0ID0gbXVsdGlwbHkoe2lucHV0czoge2E6IHgsIGI6IG91dH0sIGJhY2tlbmR9KSBhcyBUZW5zb3JJbmZvO1xuICAgICAgICB0ZW5zb3JzVG9EaXNwb3NlLnB1c2gob3V0KTtcbiAgICAgIH1cbiAgICB9XG4gICAgaWYgKGkgPCBuU3RlcHMgLSAxKSB7XG4gICAgICBpZiAocGF0aFtpXSA+PSAwKSB7XG4gICAgICAgIG91dCA9IHN1bSh7XG4gICAgICAgICAgaW5wdXRzOiB7eDogb3V0fSxcbiAgICAgICAgICBiYWNrZW5kLFxuICAgICAgICAgIGF0dHJzOiB7XG4gICAgICAgICAgICBheGlzOiBwYXRoW2ldIC0gKGFsbERpbXMubGVuZ3RoIC0gbnVtRGltc1JlbWFpbmluZyksXG4gICAgICAgICAgICBrZWVwRGltczogZmFsc2VcbiAgICAgICAgICB9XG4gICAgICAgIH0pO1xuICAgICAgICB0ZW5zb3JzVG9EaXNwb3NlLnB1c2gob3V0KTtcbiAgICAgIH1cbiAgICAgIG51bURpbXNSZW1haW5pbmctLTtcbiAgICB9XG4gIH1cblxuICAvLyBDbGVhbiB1cCBpbnRlcm1lZGlhdGUgdGVuc29ycy5cbiAgZm9yIChjb25zdCB0ZW5zb3JJbmZvIG9mIHRlbnNvcnNUb0Rpc3Bvc2UpIHtcbiAgICBpZiAodGVuc29ySW5mbyA9PT0gb3V0KSB7XG4gICAgICBjb250aW51ZTtcbiAgICB9XG4gICAgYmFja2VuZC5kaXNwb3NlSW50ZXJtZWRpYXRlVGVuc29ySW5mbyh0ZW5zb3JJbmZvKTtcbiAgfVxuXG4gIHJldHVybiBvdXQ7XG59XG5cbmV4cG9ydCBjb25zdCBlaW5zdW1Db25maWc6IEtlcm5lbENvbmZpZyA9IHtcbiAga2VybmVsTmFtZTogRWluc3VtLFxuICBiYWNrZW5kTmFtZTogJ2NwdScsXG4gIGtlcm5lbEZ1bmM6IGVpbnN1bSBhcyB7fSBhcyBLZXJuZWxGdW5jXG59O1xuIl19","/**\n * @license\n * Copyright 2020 Google LLC. All Rights Reserved.\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n * =============================================================================\n */\nimport { EluGrad, util } from '@tensorflow/tfjs-core';\nimport { assertNotComplex } from '../cpu_util';\nexport function eluGrad(args) {\n const { inputs, backend } = args;\n const { dy, y } = inputs;\n assertNotComplex([dy, y], 'eluGrad');\n const resultValues = new Float32Array(util.sizeFromShape(y.shape));\n const values = backend.data.get(y.dataId).values;\n const dyValues = backend.data.get(dy.dataId).values;\n for (let i = 0; i < values.length; ++i) {\n const v = values[i];\n if (v >= 1) {\n resultValues[i] = dyValues[i];\n }\n else {\n resultValues[i] = dyValues[i] * (v + 1);\n }\n }\n return backend.makeTensorInfo(y.shape, 'float32', resultValues);\n}\nexport const eluGradConfig = {\n kernelName: EluGrad,\n backendName: 'cpu',\n kernelFunc: eluGrad\n};\n//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiRWx1R3JhZC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uLy4uL3RmanMtYmFja2VuZC1jcHUvc3JjL2tlcm5lbHMvRWx1R3JhZC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQTs7Ozs7Ozs7Ozs7Ozs7O0dBZUc7QUFFSCxPQUFPLEVBQUMsT0FBTyxFQUFtRSxJQUFJLEVBQUMsTUFBTSx1QkFBdUIsQ0FBQztBQUdySCxPQUFPLEVBQUMsZ0JBQWdCLEVBQUMsTUFBTSxhQUFhLENBQUM7QUFFN0MsTUFBTSxVQUFVLE9BQU8sQ0FBQyxJQUFzRDtJQUU1RSxNQUFNLEVBQUMsTUFBTSxFQUFFLE9BQU8sRUFBQyxHQUFHLElBQUksQ0FBQztJQUMvQixNQUFNLEVBQUMsRUFBRSxFQUFFLENBQUMsRUFBQyxHQUFHLE1BQU0sQ0FBQztJQUV2QixnQkFBZ0IsQ0FBQyxDQUFDLEVBQUUsRUFBRSxDQUFDLENBQUMsRUFBRSxTQUFTLENBQUMsQ0FBQztJQUVyQyxNQUFNLFlBQVksR0FBRyxJQUFJLFlBQVksQ0FBQyxJQUFJLENBQUMsYUFBYSxDQUFDLENBQUMsQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDO0lBQ25FLE1BQU0sTUFBTSxHQUFHLE9BQU8sQ0FBQyxJQUFJLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxNQUFNLENBQUMsQ0FBQyxNQUFvQixDQUFDO0lBQy9ELE1BQU0sUUFBUSxHQUFHLE9BQU8sQ0FBQyxJQUFJLENBQUMsR0FBRyxDQUFDLEVBQUUsQ0FBQyxNQUFNLENBQUMsQ0FBQyxNQUFvQixDQUFDO0lBQ2xFLEtBQUssSUFBSSxDQUFDLEdBQUcsQ0FBQyxFQUFFLENBQUMsR0FBRyxNQUFNLENBQUMsTUFBTSxFQUFFLEVBQUUsQ0FBQyxFQUFFO1FBQ3RDLE1BQU0sQ0FBQyxHQUFHLE1BQU0sQ0FBQyxDQUFDLENBQUMsQ0FBQztRQUNwQixJQUFJLENBQUMsSUFBSSxDQUFDLEVBQUU7WUFDVixZQUFZLENBQUMsQ0FBQyxDQUFDLEdBQUcsUUFBUSxDQUFDLENBQUMsQ0FBQyxDQUFDO1NBQy9CO2FBQU07WUFDTCxZQUFZLENBQUMsQ0FBQyxDQUFDLEdBQUcsUUFBUSxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDO1NBQ3pDO0tBQ0Y7SUFFRCxPQUFPLE9BQU8sQ0FBQyxjQUFjLENBQUMsQ0FBQyxDQUFDLEtBQUssRUFBRSxTQUFTLEVBQUUsWUFBWSxDQUFDLENBQUM7QUFDbEUsQ0FBQztBQUVELE1BQU0sQ0FBQyxNQUFNLGFBQWEsR0FBaUI7SUFDekMsVUFBVSxFQUFFLE9BQU87SUFDbkIsV0FBVyxFQUFFLEtBQUs7SUFDbEIsVUFBVSxFQUFFLE9BQTJCO0NBQ3hDLENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyIvKipcbiAqIEBsaWNlbnNlXG4gKiBDb3B5cmlnaHQgMjAyMCBHb29nbGUgTExDLiBBbGwgUmlnaHRzIFJlc2VydmVkLlxuICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlIFwiTGljZW5zZVwiKTtcbiAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS5cbiAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdFxuICpcbiAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMFxuICpcbiAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmVcbiAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuIFwiQVMgSVNcIiBCQVNJUyxcbiAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLlxuICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZFxuICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuXG4gKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuICovXG5cbmltcG9ydCB7RWx1R3JhZCwgRWx1R3JhZElucHV0cywgS2VybmVsQ29uZmlnLCBLZXJuZWxGdW5jLCBUZW5zb3JJbmZvLCBUeXBlZEFycmF5LCB1dGlsfSBmcm9tICdAdGVuc29yZmxvdy90ZmpzLWNvcmUnO1xuXG5pbXBvcnQge01hdGhCYWNrZW5kQ1BVfSBmcm9tICcuLi9iYWNrZW5kX2NwdSc7XG5pbXBvcnQge2Fzc2VydE5vdENvbXBsZXh9IGZyb20gJy4uL2NwdV91dGlsJztcblxuZXhwb3J0IGZ1bmN0aW9uIGVsdUdyYWQoYXJnczoge2lucHV0czogRWx1R3JhZElucHV0cywgYmFja2VuZDogTWF0aEJhY2tlbmRDUFV9KTpcbiAgICBUZW5zb3JJbmZvIHtcbiAgY29uc3Qge2lucHV0cywgYmFja2VuZH0gPSBhcmdzO1xuICBjb25zdCB7ZHksIHl9ID0gaW5wdXRzO1xuXG4gIGFzc2VydE5vdENvbXBsZXgoW2R5LCB5XSwgJ2VsdUdyYWQnKTtcblxuICBjb25zdCByZXN1bHRWYWx1ZXMgPSBuZXcgRmxvYXQzMkFycmF5KHV0aWwuc2l6ZUZyb21TaGFwZSh5LnNoYXBlKSk7XG4gIGNvbnN0IHZhbHVlcyA9IGJhY2tlbmQuZGF0YS5nZXQoeS5kYXRhSWQpLnZhbHVlcyBhcyBUeXBlZEFycmF5O1xuICBjb25zdCBkeVZhbHVlcyA9IGJhY2tlbmQuZGF0YS5nZXQoZHkuZGF0YUlkKS52YWx1ZXMgYXMgVHlwZWRBcnJheTtcbiAgZm9yIChsZXQgaSA9IDA7IGkgPCB2YWx1ZXMubGVuZ3RoOyArK2kpIHtcbiAgICBjb25zdCB2ID0gdmFsdWVzW2ldO1xuICAgIGlmICh2ID49IDEpIHtcbiAgICAgIHJlc3VsdFZhbHVlc1tpXSA9IGR5VmFsdWVzW2ldO1xuICAgIH0gZWxzZSB7XG4gICAgICByZXN1bHRWYWx1ZXNbaV0gPSBkeVZhbHVlc1tpXSAqICh2ICsgMSk7XG4gICAgfVxuICB9XG5cbiAgcmV0dXJuIGJhY2tlbmQubWFrZVRlbnNvckluZm8oeS5zaGFwZSwgJ2Zsb2F0MzInLCByZXN1bHRWYWx1ZXMpO1xufVxuXG5leHBvcnQgY29uc3QgZWx1R3JhZENvbmZpZzogS2VybmVsQ29uZmlnID0ge1xuICBrZXJuZWxOYW1lOiBFbHVHcmFkLFxuICBiYWNrZW5kTmFtZTogJ2NwdScsXG4gIGtlcm5lbEZ1bmM6IGVsdUdyYWQgYXMge30gYXMgS2VybmVsRnVuY1xufTtcbiJdfQ==","/**\n * @license\n * Copyright 2020 Google LLC. All Rights Reserved.\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n * =============================================================================\n */\nimport { Equal } from '@tensorflow/tfjs-core';\nimport { createSimpleBinaryKernelImpl } from '../utils/binary_impl';\nimport { binaryKernelFunc } from '../utils/binary_utils';\nexport const equalImpl = createSimpleBinaryKernelImpl((a, b) => (a === b) ? 1 : 0);\nexport const equal = binaryKernelFunc(Equal, equalImpl, null /* complexImpl */, 'bool');\nexport const equalConfig = {\n kernelName: Equal,\n backendName: 'cpu',\n kernelFunc: equal\n};\n//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiRXF1YWwuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi8uLi90ZmpzLWJhY2tlbmQtY3B1L3NyYy9rZXJuZWxzL0VxdWFsLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBOzs7Ozs7Ozs7Ozs7Ozs7R0FlRztBQUVILE9BQU8sRUFBQyxLQUFLLEVBQWUsTUFBTSx1QkFBdUIsQ0FBQztBQUUxRCxPQUFPLEVBQUMsNEJBQTRCLEVBQUMsTUFBTSxzQkFBc0IsQ0FBQztBQUNsRSxPQUFPLEVBQUMsZ0JBQWdCLEVBQUMsTUFBTSx1QkFBdUIsQ0FBQztBQUV2RCxNQUFNLENBQUMsTUFBTSxTQUFTLEdBQ2xCLDRCQUE0QixDQUFDLENBQUMsQ0FBUyxFQUFFLENBQVMsRUFBRSxFQUFFLENBQUMsQ0FBQyxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUM7QUFDOUUsTUFBTSxDQUFDLE1BQU0sS0FBSyxHQUNkLGdCQUFnQixDQUFDLEtBQUssRUFBRSxTQUFTLEVBQUUsSUFBSSxDQUFDLGlCQUFpQixFQUFFLE1BQU0sQ0FBQyxDQUFDO0FBRXZFLE1BQU0sQ0FBQyxNQUFNLFdBQVcsR0FBaUI7SUFDdkMsVUFBVSxFQUFFLEtBQUs7SUFDakIsV0FBVyxFQUFFLEtBQUs7SUFDbEIsVUFBVSxFQUFFLEtBQUs7Q0FDbEIsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbIi8qKlxuICogQGxpY2Vuc2VcbiAqIENvcHlyaWdodCAyMDIwIEdvb2dsZSBMTEMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuXG4gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgXCJMaWNlbnNlXCIpO1xuICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLlxuICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0XG4gKlxuICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wXG4gKlxuICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZVxuICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gXCJBUyBJU1wiIEJBU0lTLFxuICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuXG4gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kXG4gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS5cbiAqID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4gKi9cblxuaW1wb3J0IHtFcXVhbCwgS2VybmVsQ29uZmlnfSBmcm9tICdAdGVuc29yZmxvdy90ZmpzLWNvcmUnO1xuXG5pbXBvcnQge2NyZWF0ZVNpbXBsZUJpbmFyeUtlcm5lbEltcGx9IGZyb20gJy4uL3V0aWxzL2JpbmFyeV9pbXBsJztcbmltcG9ydCB7YmluYXJ5S2VybmVsRnVuY30gZnJvbSAnLi4vdXRpbHMvYmluYXJ5X3V0aWxzJztcblxuZXhwb3J0IGNvbnN0IGVxdWFsSW1wbCA9XG4gICAgY3JlYXRlU2ltcGxlQmluYXJ5S2VybmVsSW1wbCgoYTogbnVtYmVyLCBiOiBudW1iZXIpID0+IChhID09PSBiKSA/IDEgOiAwKTtcbmV4cG9ydCBjb25zdCBlcXVhbCA9XG4gICAgYmluYXJ5S2VybmVsRnVuYyhFcXVhbCwgZXF1YWxJbXBsLCBudWxsIC8qIGNvbXBsZXhJbXBsICovLCAnYm9vbCcpO1xuXG5leHBvcnQgY29uc3QgZXF1YWxDb25maWc6IEtlcm5lbENvbmZpZyA9IHtcbiAga2VybmVsTmFtZTogRXF1YWwsXG4gIGJhY2tlbmROYW1lOiAnY3B1JyxcbiAga2VybmVsRnVuYzogZXF1YWxcbn07XG4iXX0=","/**\n * @license\n * Copyright 2020 Google LLC. All Rights Reserved.\n * Licensed under the Apache License, Version 2.0 (the License);\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an AS IS BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n * =============================================================================\n */\nimport { backend_util, Erf } from '@tensorflow/tfjs-core';\nimport { unaryKernelFunc } from '../utils/unary_utils';\nconst p = backend_util.ERF_P;\nconst a1 = backend_util.ERF_A1;\nconst a2 = backend_util.ERF_A2;\nconst a3 = backend_util.ERF_A3;\nconst a4 = backend_util.ERF_A4;\nconst a5 = backend_util.ERF_A5;\nexport const erf = unaryKernelFunc(Erf, (xi) => {\n const sign = Math.sign(xi);\n const v = Math.abs(xi);\n const t = 1.0 / (1.0 + p * v);\n return sign *\n (1.0 -\n (((((a5 * t + a4) * t) + a3) * t + a2) * t + a1) * t *\n Math.exp(-v * v));\n});\nexport const erfConfig = {\n kernelName: Erf,\n backendName: 'cpu',\n kernelFunc: erf,\n};\n//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiRXJmLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vLi4vdGZqcy1iYWNrZW5kLWNwdS9zcmMva2VybmVscy9FcmYudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUE7Ozs7Ozs7Ozs7Ozs7OztHQWVHO0FBRUgsT0FBTyxFQUFDLFlBQVksRUFBRSxHQUFHLEVBQWUsTUFBTSx1QkFBdUIsQ0FBQztBQUV0RSxPQUFPLEVBQUMsZUFBZSxFQUFDLE1BQU0sc0JBQXNCLENBQUM7QUFFckQsTUFBTSxDQUFDLEdBQUcsWUFBWSxDQUFDLEtBQUssQ0FBQztBQUM3QixNQUFNLEVBQUUsR0FBRyxZQUFZLENBQUMsTUFBTSxDQUFDO0FBQy9CLE1BQU0sRUFBRSxHQUFHLFlBQVksQ0FBQyxNQUFNLENBQUM7QUFDL0IsTUFBTSxFQUFFLEdBQUcsWUFBWSxDQUFDLE1BQU0sQ0FBQztBQUMvQixNQUFNLEVBQUUsR0FBRyxZQUFZLENBQUMsTUFBTSxDQUFDO0FBQy9CLE1BQU0sRUFBRSxHQUFHLFlBQVksQ0FBQyxNQUFNLENBQUM7QUFFL0IsTUFBTSxDQUFDLE1BQU0sR0FBRyxHQUFHLGVBQWUsQ0FDOUIsR0FBRyxFQUNILENBQUMsRUFBRSxFQUFFLEVBQUU7SUFDTCxNQUFNLElBQUksR0FBRyxJQUFJLENBQUMsSUFBSSxDQUFDLEVBQUUsQ0FBQyxDQUFDO0lBQzNCLE1BQU0sQ0FBQyxHQUFHLElBQUksQ0FBQyxHQUFHLENBQUMsRUFBRSxDQUFDLENBQUM7SUFDdkIsTUFBTSxDQUFDLEdBQUcsR0FBRyxHQUFHLENBQUMsR0FBRyxHQUFHLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQztJQUM5QixPQUFPLElBQUk7UUFDUCxDQUFDLEdBQUc7WUFDSCxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsRUFBRSxHQUFHLENBQUMsR0FBRyxFQUFFLENBQUMsR0FBRyxDQUFDLENBQUMsR0FBRyxFQUFFLENBQUMsR0FBRyxDQUFDLEdBQUcsRUFBRSxDQUFDLEdBQUcsQ0FBQyxHQUFHLEVBQUUsQ0FBQyxHQUFHLENBQUM7Z0JBQ2hELElBQUksQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQztBQUM3QixDQUFDLENBQ0osQ0FBQztBQUVGLE1BQU0sQ0FBQyxNQUFNLFNBQVMsR0FBaUI7SUFDckMsVUFBVSxFQUFFLEdBQUc7SUFDZixXQUFXLEVBQUUsS0FBSztJQUNsQixVQUFVLEVBQUUsR0FBRztDQUNoQixDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiLyoqXG4gKiBAbGljZW5zZVxuICogQ29weXJpZ2h0IDIwMjAgR29vZ2xlIExMQy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC5cbiAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSBMaWNlbnNlKTtcbiAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS5cbiAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdFxuICpcbiAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMFxuICpcbiAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmVcbiAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuIEFTIElTIEJBU0lTLFxuICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuXG4gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kXG4gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS5cbiAqID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4gKi9cblxuaW1wb3J0IHtiYWNrZW5kX3V0aWwsIEVyZiwgS2VybmVsQ29uZmlnfSBmcm9tICdAdGVuc29yZmxvdy90ZmpzLWNvcmUnO1xuXG5pbXBvcnQge3VuYXJ5S2VybmVsRnVuY30gZnJvbSAnLi4vdXRpbHMvdW5hcnlfdXRpbHMnO1xuXG5jb25zdCBwID0gYmFja2VuZF91dGlsLkVSRl9QO1xuY29uc3QgYTEgPSBiYWNrZW5kX3V0aWwuRVJGX0ExO1xuY29uc3QgYTIgPSBiYWNrZW5kX3V0aWwuRVJGX0EyO1xuY29uc3QgYTMgPSBiYWNrZW5kX3V0aWwuRVJGX0EzO1xuY29uc3QgYTQgPSBiYWNrZW5kX3V0aWwuRVJGX0E0O1xuY29uc3QgYTUgPSBiYWNrZW5kX3V0aWwuRVJGX0E1O1xuXG5leHBvcnQgY29uc3QgZXJmID0gdW5hcnlLZXJuZWxGdW5jKFxuICAgIEVyZixcbiAgICAoeGkpID0+IHtcbiAgICAgIGNvbnN0IHNpZ24gPSBNYXRoLnNpZ24oeGkpO1xuICAgICAgY29uc3QgdiA9IE1hdGguYWJzKHhpKTtcbiAgICAgIGNvbnN0IHQgPSAxLjAgLyAoMS4wICsgcCAqIHYpO1xuICAgICAgcmV0dXJuIHNpZ24gKlxuICAgICAgICAgICgxLjAgLVxuICAgICAgICAgICAoKCgoKGE1ICogdCArIGE0KSAqIHQpICsgYTMpICogdCArIGEyKSAqIHQgKyBhMSkgKiB0ICpcbiAgICAgICAgICAgICAgIE1hdGguZXhwKC12ICogdikpO1xuICAgIH0sXG4pO1xuXG5leHBvcnQgY29uc3QgZXJmQ29uZmlnOiBLZXJuZWxDb25maWcgPSB7XG4gIGtlcm5lbE5hbWU6IEVyZixcbiAgYmFja2VuZE5hbWU6ICdjcHUnLFxuICBrZXJuZWxGdW5jOiBlcmYsXG59O1xuIl19","/**\n * @license\n * Copyright 2020 Google LLC. All Rights Reserved.\n * Licensed under the Apache License, Version 2.0 (the License);\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an AS IS BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n * =============================================================================\n */\nimport { Exp } from '@tensorflow/tfjs-core';\nimport { createSimpleUnaryImpl } from '../utils/unary_impl';\nimport { unaryKernelFuncFromImpl } from '../utils/unary_utils';\nexport const expImpl = createSimpleUnaryImpl((xi) => Math.exp(xi));\nexport const exp = unaryKernelFuncFromImpl(Exp, expImpl, 'float32');\nexport const expConfig = {\n kernelName: Exp,\n backendName: 'cpu',\n kernelFunc: exp,\n};\n//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiRXhwLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vLi4vdGZqcy1iYWNrZW5kLWNwdS9zcmMva2VybmVscy9FeHAudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUE7Ozs7Ozs7Ozs7Ozs7OztHQWVHO0FBRUgsT0FBTyxFQUFDLEdBQUcsRUFBZSxNQUFNLHVCQUF1QixDQUFDO0FBRXhELE9BQU8sRUFBQyxxQkFBcUIsRUFBQyxNQUFNLHFCQUFxQixDQUFDO0FBQzFELE9BQU8sRUFBQyx1QkFBdUIsRUFBQyxNQUFNLHNCQUFzQixDQUFDO0FBRTdELE1BQU0sQ0FBQyxNQUFNLE9BQU8sR0FBRyxxQkFBcUIsQ0FBQyxDQUFDLEVBQUUsRUFBRSxFQUFFLENBQUMsSUFBSSxDQUFDLEdBQUcsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDO0FBQ25FLE1BQU0sQ0FBQyxNQUFNLEdBQUcsR0FBRyx1QkFBdUIsQ0FBQyxHQUFHLEVBQUUsT0FBTyxFQUFFLFNBQVMsQ0FBQyxDQUFDO0FBRXBFLE1BQU0sQ0FBQyxNQUFNLFNBQVMsR0FBaUI7SUFDckMsVUFBVSxFQUFFLEdBQUc7SUFDZixXQUFXLEVBQUUsS0FBSztJQUNsQixVQUFVLEVBQUUsR0FBRztDQUNoQixDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiLyoqXG4gKiBAbGljZW5zZVxuICogQ29weXJpZ2h0IDIwMjAgR29vZ2xlIExMQy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC5cbiAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSBMaWNlbnNlKTtcbiAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS5cbiAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdFxuICpcbiAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMFxuICpcbiAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmVcbiAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuIEFTIElTIEJBU0lTLFxuICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuXG4gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kXG4gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS5cbiAqID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4gKi9cblxuaW1wb3J0IHtFeHAsIEtlcm5lbENvbmZpZ30gZnJvbSAnQHRlbnNvcmZsb3cvdGZqcy1jb3JlJztcblxuaW1wb3J0IHtjcmVhdGVTaW1wbGVVbmFyeUltcGx9IGZyb20gJy4uL3V0aWxzL3VuYXJ5X2ltcGwnO1xuaW1wb3J0IHt1bmFyeUtlcm5lbEZ1bmNGcm9tSW1wbH0gZnJvbSAnLi4vdXRpbHMvdW5hcnlfdXRpbHMnO1xuXG5leHBvcnQgY29uc3QgZXhwSW1wbCA9IGNyZWF0ZVNpbXBsZVVuYXJ5SW1wbCgoeGkpID0+IE1hdGguZXhwKHhpKSk7XG5leHBvcnQgY29uc3QgZXhwID0gdW5hcnlLZXJuZWxGdW5jRnJvbUltcGwoRXhwLCBleHBJbXBsLCAnZmxvYXQzMicpO1xuXG5leHBvcnQgY29uc3QgZXhwQ29uZmlnOiBLZXJuZWxDb25maWcgPSB7XG4gIGtlcm5lbE5hbWU6IEV4cCxcbiAgYmFja2VuZE5hbWU6ICdjcHUnLFxuICBrZXJuZWxGdW5jOiBleHAsXG59O1xuIl19","/**\n * @license\n * Copyright 2020 Google LLC. All Rights Reserved.\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n * =============================================================================\n */\nimport { ExpandDims, util } from '@tensorflow/tfjs-core';\nimport { reshape } from './Reshape';\nexport function expandDims(args) {\n const { inputs, backend, attrs } = args;\n const { input } = inputs;\n const { dim } = attrs;\n const inputRank = input.shape.length;\n const newShape = input.shape.slice();\n let $dim = dim;\n if (dim < 0) {\n // Negative value is counted from the tail of rank.\n util.assert(-(inputRank + 1) <= dim, () => `Axis must be in the interval [${-(inputRank + 1)}, ${inputRank}]`);\n $dim = inputRank + dim + 1;\n }\n newShape.splice($dim, 0, 1);\n return reshape({ inputs: { x: input }, backend, attrs: { shape: newShape } });\n}\nexport const expandDimsConfig = {\n kernelName: ExpandDims,\n backendName: 'cpu',\n kernelFunc: expandDims\n};\n//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiRXhwYW5kRGltcy5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uLy4uL3RmanMtYmFja2VuZC1jcHUvc3JjL2tlcm5lbHMvRXhwYW5kRGltcy50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQTs7Ozs7Ozs7Ozs7Ozs7O0dBZUc7QUFFSCxPQUFPLEVBQUMsVUFBVSxFQUEyRSxJQUFJLEVBQUMsTUFBTSx1QkFBdUIsQ0FBQztBQUdoSSxPQUFPLEVBQUMsT0FBTyxFQUFDLE1BQU0sV0FBVyxDQUFDO0FBRWxDLE1BQU0sVUFBVSxVQUFVLENBQUMsSUFJMUI7SUFDQyxNQUFNLEVBQUMsTUFBTSxFQUFFLE9BQU8sRUFBRSxLQUFLLEVBQUMsR0FBRyxJQUFJLENBQUM7SUFDdEMsTUFBTSxFQUFDLEtBQUssRUFBQyxHQUFHLE1BQU0sQ0FBQztJQUN2QixNQUFNLEVBQUMsR0FBRyxFQUFDLEdBQUcsS0FBSyxDQUFDO0lBRXBCLE1BQU0sU0FBUyxHQUFHLEtBQUssQ0FBQyxLQUFLLENBQUMsTUFBTSxDQUFDO0lBQ3JDLE1BQU0sUUFBUSxHQUFHLEtBQUssQ0FBQyxLQUFLLENBQUMsS0FBSyxFQUFFLENBQUM7SUFDckMsSUFBSSxJQUFJLEdBQUcsR0FBRyxDQUFDO0lBQ2YsSUFBSSxHQUFHLEdBQUcsQ0FBQyxFQUFFO1FBQ1gsbURBQW1EO1FBQ25ELElBQUksQ0FBQyxNQUFNLENBQ1AsQ0FBQyxDQUFDLFNBQVMsR0FBRyxDQUFDLENBQUMsSUFBSSxHQUFHLEVBQ3ZCLEdBQUcsRUFBRSxDQUFDLGlDQUFpQyxDQUFFLENBQUMsU0FBUyxHQUFHLENBQUMsQ0FBQyxLQUNwRCxTQUFTLEdBQUcsQ0FBQyxDQUFDO1FBQ3RCLElBQUksR0FBRyxTQUFTLEdBQUcsR0FBRyxHQUFHLENBQUMsQ0FBQztLQUM1QjtJQUNELFFBQVEsQ0FBQyxNQUFNLENBQUMsSUFBSSxFQUFFLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQztJQUU1QixPQUFPLE9BQU8sQ0FBQyxFQUFDLE1BQU0sRUFBRSxFQUFDLENBQUMsRUFBRSxLQUFLLEVBQUMsRUFBRSxPQUFPLEVBQUUsS0FBSyxFQUFFLEVBQUMsS0FBSyxFQUFFLFFBQVEsRUFBQyxFQUFDLENBQUMsQ0FBQztBQUMxRSxDQUFDO0FBRUQsTUFBTSxDQUFDLE1BQU0sZ0JBQWdCLEdBQWlCO0lBQzVDLFVBQVUsRUFBRSxVQUFVO0lBQ3RCLFdBQVcsRUFBRSxLQUFLO0lBQ2xCLFVBQVUsRUFBRSxVQUE4QjtDQUMzQyxDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiLyoqXG4gKiBAbGljZW5zZVxuICogQ29weXJpZ2h0IDIwMjAgR29vZ2xlIExMQy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC5cbiAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSBcIkxpY2Vuc2VcIik7XG4gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuXG4gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXRcbiAqXG4gKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjBcbiAqXG4gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlXG4gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiBcIkFTIElTXCIgQkFTSVMsXG4gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC5cbiAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmRcbiAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLlxuICogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbiAqL1xuXG5pbXBvcnQge0V4cGFuZERpbXMsIEV4cGFuZERpbXNBdHRycywgRXhwYW5kRGltc0lucHV0cywgS2VybmVsQ29uZmlnLCBLZXJuZWxGdW5jLCBUZW5zb3JJbmZvLCB1dGlsfSBmcm9tICdAdGVuc29yZmxvdy90ZmpzLWNvcmUnO1xuXG5pbXBvcnQge01hdGhCYWNrZW5kQ1BVfSBmcm9tICcuLi9iYWNrZW5kX2NwdSc7XG5pbXBvcnQge3Jlc2hhcGV9IGZyb20gJy4vUmVzaGFwZSc7XG5cbmV4cG9ydCBmdW5jdGlvbiBleHBhbmREaW1zKGFyZ3M6IHtcbiAgaW5wdXRzOiBFeHBhbmREaW1zSW5wdXRzLFxuICBiYWNrZW5kOiBNYXRoQmFja2VuZENQVSxcbiAgYXR0cnM6IEV4cGFuZERpbXNBdHRyc1xufSk6IFRlbnNvckluZm8ge1xuICBjb25zdCB7aW5wdXRzLCBiYWNrZW5kLCBhdHRyc30gPSBhcmdzO1xuICBjb25zdCB7aW5wdXR9ID0gaW5wdXRzO1xuICBjb25zdCB7ZGltfSA9IGF0dHJzO1xuXG4gIGNvbnN0IGlucHV0UmFuayA9IGlucHV0LnNoYXBlLmxlbmd0aDtcbiAgY29uc3QgbmV3U2hhcGUgPSBpbnB1dC5zaGFwZS5zbGljZSgpO1xuICBsZXQgJGRpbSA9IGRpbTtcbiAgaWYgKGRpbSA8IDApIHtcbiAgICAvLyBOZWdhdGl2ZSB2YWx1ZSBpcyBjb3VudGVkIGZyb20gdGhlIHRhaWwgb2YgcmFuay5cbiAgICB1dGlsLmFzc2VydChcbiAgICAgICAgLShpbnB1dFJhbmsgKyAxKSA8PSBkaW0sXG4gICAgICAgICgpID0+IGBBeGlzIG11c3QgYmUgaW4gdGhlIGludGVydmFsIFskey0gKGlucHV0UmFuayArIDEpfSwgJHtcbiAgICAgICAgICAgIGlucHV0UmFua31dYCk7XG4gICAgJGRpbSA9IGlucHV0UmFuayArIGRpbSArIDE7XG4gIH1cbiAgbmV3U2hhcGUuc3BsaWNlKCRkaW0sIDAsIDEpO1xuXG4gIHJldHVybiByZXNoYXBlKHtpbnB1dHM6IHt4OiBpbnB1dH0sIGJhY2tlbmQsIGF0dHJzOiB7c2hhcGU6IG5ld1NoYXBlfX0pO1xufVxuXG5leHBvcnQgY29uc3QgZXhwYW5kRGltc0NvbmZpZzogS2VybmVsQ29uZmlnID0ge1xuICBrZXJuZWxOYW1lOiBFeHBhbmREaW1zLFxuICBiYWNrZW5kTmFtZTogJ2NwdScsXG4gIGtlcm5lbEZ1bmM6IGV4cGFuZERpbXMgYXMge30gYXMgS2VybmVsRnVuY1xufTtcbiJdfQ==","/**\n * @license\n * Copyright 2020 Google LLC. All Rights Reserved.\n * Licensed under the Apache License, Version 2.0 (the License);\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an AS IS BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n * =============================================================================\n */\nimport { Expm1 } from '@tensorflow/tfjs-core';\nimport { createSimpleUnaryImpl } from '../utils/unary_impl';\nimport { unaryKernelFuncFromImpl } from '../utils/unary_utils';\nexport const expm1Impl = createSimpleUnaryImpl((xi) => Math.expm1(xi));\nexport const expm1 = unaryKernelFuncFromImpl(Expm1, expm1Impl);\nexport const expm1Config = {\n kernelName: Expm1,\n backendName: 'cpu',\n kernelFunc: expm1,\n};\n//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiRXhwbTEuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi8uLi90ZmpzLWJhY2tlbmQtY3B1L3NyYy9rZXJuZWxzL0V4cG0xLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBOzs7Ozs7Ozs7Ozs7Ozs7R0FlRztBQUVILE9BQU8sRUFBQyxLQUFLLEVBQWUsTUFBTSx1QkFBdUIsQ0FBQztBQUUxRCxPQUFPLEVBQUMscUJBQXFCLEVBQUMsTUFBTSxxQkFBcUIsQ0FBQztBQUMxRCxPQUFPLEVBQUMsdUJBQXVCLEVBQUMsTUFBTSxzQkFBc0IsQ0FBQztBQUU3RCxNQUFNLENBQUMsTUFBTSxTQUFTLEdBQUcscUJBQXFCLENBQUMsQ0FBQyxFQUFFLEVBQUUsRUFBRSxDQUFDLElBQUksQ0FBQyxLQUFLLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQztBQUN2RSxNQUFNLENBQUMsTUFBTSxLQUFLLEdBQUcsdUJBQXVCLENBQUMsS0FBSyxFQUFFLFNBQVMsQ0FBQyxDQUFDO0FBRS9ELE1BQU0sQ0FBQyxNQUFNLFdBQVcsR0FBaUI7SUFDdkMsVUFBVSxFQUFFLEtBQUs7SUFDakIsV0FBVyxFQUFFLEtBQUs7SUFDbEIsVUFBVSxFQUFFLEtBQUs7Q0FDbEIsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbIi8qKlxuICogQGxpY2Vuc2VcbiAqIENvcHlyaWdodCAyMDIwIEdvb2dsZSBMTEMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuXG4gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgTGljZW5zZSk7XG4gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuXG4gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXRcbiAqXG4gKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjBcbiAqXG4gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlXG4gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiBBUyBJUyBCQVNJUyxcbiAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLlxuICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZFxuICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuXG4gKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuICovXG5cbmltcG9ydCB7RXhwbTEsIEtlcm5lbENvbmZpZ30gZnJvbSAnQHRlbnNvcmZsb3cvdGZqcy1jb3JlJztcblxuaW1wb3J0IHtjcmVhdGVTaW1wbGVVbmFyeUltcGx9IGZyb20gJy4uL3V0aWxzL3VuYXJ5X2ltcGwnO1xuaW1wb3J0IHt1bmFyeUtlcm5lbEZ1bmNGcm9tSW1wbH0gZnJvbSAnLi4vdXRpbHMvdW5hcnlfdXRpbHMnO1xuXG5leHBvcnQgY29uc3QgZXhwbTFJbXBsID0gY3JlYXRlU2ltcGxlVW5hcnlJbXBsKCh4aSkgPT4gTWF0aC5leHBtMSh4aSkpO1xuZXhwb3J0IGNvbnN0IGV4cG0xID0gdW5hcnlLZXJuZWxGdW5jRnJvbUltcGwoRXhwbTEsIGV4cG0xSW1wbCk7XG5cbmV4cG9ydCBjb25zdCBleHBtMUNvbmZpZzogS2VybmVsQ29uZmlnID0ge1xuICBrZXJuZWxOYW1lOiBFeHBtMSxcbiAgYmFja2VuZE5hbWU6ICdjcHUnLFxuICBrZXJuZWxGdW5jOiBleHBtMSxcbn07XG4iXX0=","/**\n * @license\n * Copyright 2020 Google LLC. All Rights Reserved.\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n * =============================================================================\n */\nimport { RealDiv } from '@tensorflow/tfjs-core';\nimport { createSimpleBinaryKernelImpl } from '../utils/binary_impl';\nimport { binaryKernelFunc } from '../utils/binary_utils';\nexport const realDivImpl = createSimpleBinaryKernelImpl((a, b) => a / b);\nexport const div = binaryKernelFunc(RealDiv, realDivImpl);\nexport const realDivConfig = {\n kernelName: RealDiv,\n backendName: 'cpu',\n kernelFunc: div\n};\n//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiUmVhbERpdi5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uLy4uL3RmanMtYmFja2VuZC1jcHUvc3JjL2tlcm5lbHMvUmVhbERpdi50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQTs7Ozs7Ozs7Ozs7Ozs7O0dBZUc7QUFFSCxPQUFPLEVBQWUsT0FBTyxFQUFDLE1BQU0sdUJBQXVCLENBQUM7QUFFNUQsT0FBTyxFQUFDLDRCQUE0QixFQUFDLE1BQU0sc0JBQXNCLENBQUM7QUFDbEUsT0FBTyxFQUFDLGdCQUFnQixFQUFDLE1BQU0sdUJBQXVCLENBQUM7QUFFdkQsTUFBTSxDQUFDLE1BQU0sV0FBVyxHQUNwQiw0QkFBNEIsQ0FBQyxDQUFDLENBQVMsRUFBRSxDQUFTLEVBQUUsRUFBRSxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQztBQUNsRSxNQUFNLENBQUMsTUFBTSxHQUFHLEdBQUcsZ0JBQWdCLENBQUMsT0FBTyxFQUFFLFdBQVcsQ0FBQyxDQUFDO0FBRTFELE1BQU0sQ0FBQyxNQUFNLGFBQWEsR0FBaUI7SUFDekMsVUFBVSxFQUFFLE9BQU87SUFDbkIsV0FBVyxFQUFFLEtBQUs7SUFDbEIsVUFBVSxFQUFFLEdBQUc7Q0FDaEIsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbIi8qKlxuICogQGxpY2Vuc2VcbiAqIENvcHlyaWdodCAyMDIwIEdvb2dsZSBMTEMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuXG4gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgXCJMaWNlbnNlXCIpO1xuICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLlxuICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0XG4gKlxuICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wXG4gKlxuICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZVxuICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gXCJBUyBJU1wiIEJBU0lTLFxuICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuXG4gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kXG4gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS5cbiAqID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4gKi9cblxuaW1wb3J0IHtLZXJuZWxDb25maWcsIFJlYWxEaXZ9IGZyb20gJ0B0ZW5zb3JmbG93L3RmanMtY29yZSc7XG5cbmltcG9ydCB7Y3JlYXRlU2ltcGxlQmluYXJ5S2VybmVsSW1wbH0gZnJvbSAnLi4vdXRpbHMvYmluYXJ5X2ltcGwnO1xuaW1wb3J0IHtiaW5hcnlLZXJuZWxGdW5jfSBmcm9tICcuLi91dGlscy9iaW5hcnlfdXRpbHMnO1xuXG5leHBvcnQgY29uc3QgcmVhbERpdkltcGwgPVxuICAgIGNyZWF0ZVNpbXBsZUJpbmFyeUtlcm5lbEltcGwoKGE6IG51bWJlciwgYjogbnVtYmVyKSA9PiBhIC8gYik7XG5leHBvcnQgY29uc3QgZGl2ID0gYmluYXJ5S2VybmVsRnVuYyhSZWFsRGl2LCByZWFsRGl2SW1wbCk7XG5cbmV4cG9ydCBjb25zdCByZWFsRGl2Q29uZmlnOiBLZXJuZWxDb25maWcgPSB7XG4gIGtlcm5lbE5hbWU6IFJlYWxEaXYsXG4gIGJhY2tlbmROYW1lOiAnY3B1JyxcbiAga2VybmVsRnVuYzogZGl2XG59O1xuIl19","/**\n * @license\n * Copyright 2020 Google LLC. All Rights Reserved.\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n * =============================================================================\n */\nimport { Sub } from '@tensorflow/tfjs-core';\nimport { createSimpleBinaryKernelImpl } from '../utils/binary_impl';\nimport { binaryKernelFunc, createComplexBinaryKernelImpl } from '../utils/binary_utils';\nexport const subImpl = createSimpleBinaryKernelImpl(((aValue, bValue) => aValue - bValue));\nexport const subComplexImpl = createComplexBinaryKernelImpl(((aReal, aImag, bReal, bImag) => {\n return { real: aReal - bReal, imag: aImag - bImag };\n}));\nexport const sub = binaryKernelFunc(Sub, subImpl, subComplexImpl);\nexport const subConfig = {\n kernelName: Sub,\n backendName: 'cpu',\n kernelFunc: sub\n};\n//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiU3ViLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vLi4vdGZqcy1iYWNrZW5kLWNwdS9zcmMva2VybmVscy9TdWIudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUE7Ozs7Ozs7Ozs7Ozs7OztHQWVHO0FBRUgsT0FBTyxFQUFlLEdBQUcsRUFBQyxNQUFNLHVCQUF1QixDQUFDO0FBRXhELE9BQU8sRUFBQyw0QkFBNEIsRUFBQyxNQUFNLHNCQUFzQixDQUFDO0FBQ2xFLE9BQU8sRUFBQyxnQkFBZ0IsRUFBRSw2QkFBNkIsRUFBQyxNQUFNLHVCQUF1QixDQUFDO0FBRXRGLE1BQU0sQ0FBQyxNQUFNLE9BQU8sR0FBRyw0QkFBNEIsQ0FDL0MsQ0FBQyxDQUFDLE1BQWMsRUFBRSxNQUFjLEVBQUUsRUFBRSxDQUFDLE1BQU0sR0FBRyxNQUFNLENBQUMsQ0FBQyxDQUFDO0FBQzNELE1BQU0sQ0FBQyxNQUFNLGNBQWMsR0FDdkIsNkJBQTZCLENBQUMsQ0FBQyxDQUFDLEtBQUssRUFBRSxLQUFLLEVBQUUsS0FBSyxFQUFFLEtBQUssRUFBRSxFQUFFO0lBQzVELE9BQU8sRUFBQyxJQUFJLEVBQUUsS0FBSyxHQUFHLEtBQUssRUFBRSxJQUFJLEVBQUUsS0FBSyxHQUFHLEtBQUssRUFBQyxDQUFDO0FBQ3BELENBQUMsQ0FBQyxDQUFDLENBQUM7QUFDUixNQUFNLENBQUMsTUFBTSxHQUFHLEdBQUcsZ0JBQWdCLENBQUMsR0FBRyxFQUFFLE9BQU8sRUFBRSxjQUFjLENBQUMsQ0FBQztBQUVsRSxNQUFNLENBQUMsTUFBTSxTQUFTLEdBQWlCO0lBQ3JDLFVBQVUsRUFBRSxHQUFHO0lBQ2YsV0FBVyxFQUFFLEtBQUs7SUFDbEIsVUFBVSxFQUFFLEdBQUc7Q0FDaEIsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbIi8qKlxuICogQGxpY2Vuc2VcbiAqIENvcHlyaWdodCAyMDIwIEdvb2dsZSBMTEMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuXG4gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgXCJMaWNlbnNlXCIpO1xuICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLlxuICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0XG4gKlxuICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wXG4gKlxuICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZVxuICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gXCJBUyBJU1wiIEJBU0lTLFxuICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuXG4gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kXG4gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS5cbiAqID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4gKi9cblxuaW1wb3J0IHtLZXJuZWxDb25maWcsIFN1Yn0gZnJvbSAnQHRlbnNvcmZsb3cvdGZqcy1jb3JlJztcblxuaW1wb3J0IHtjcmVhdGVTaW1wbGVCaW5hcnlLZXJuZWxJbXBsfSBmcm9tICcuLi91dGlscy9iaW5hcnlfaW1wbCc7XG5pbXBvcnQge2JpbmFyeUtlcm5lbEZ1bmMsIGNyZWF0ZUNvbXBsZXhCaW5hcnlLZXJuZWxJbXBsfSBmcm9tICcuLi91dGlscy9iaW5hcnlfdXRpbHMnO1xuXG5leHBvcnQgY29uc3Qgc3ViSW1wbCA9IGNyZWF0ZVNpbXBsZUJpbmFyeUtlcm5lbEltcGwoXG4gICAgKChhVmFsdWU6IG51bWJlciwgYlZhbHVlOiBudW1iZXIpID0+IGFWYWx1ZSAtIGJWYWx1ZSkpO1xuZXhwb3J0IGNvbnN0IHN1YkNvbXBsZXhJbXBsID1cbiAgICBjcmVhdGVDb21wbGV4QmluYXJ5S2VybmVsSW1wbCgoKGFSZWFsLCBhSW1hZywgYlJlYWwsIGJJbWFnKSA9PiB7XG4gICAgICByZXR1cm4ge3JlYWw6IGFSZWFsIC0gYlJlYWwsIGltYWc6IGFJbWFnIC0gYkltYWd9O1xuICAgIH0pKTtcbmV4cG9ydCBjb25zdCBzdWIgPSBiaW5hcnlLZXJuZWxGdW5jKFN1Yiwgc3ViSW1wbCwgc3ViQ29tcGxleEltcGwpO1xuXG5leHBvcnQgY29uc3Qgc3ViQ29uZmlnOiBLZXJuZWxDb25maWcgPSB7XG4gIGtlcm5lbE5hbWU6IFN1YixcbiAgYmFja2VuZE5hbWU6ICdjcHUnLFxuICBrZXJuZWxGdW5jOiBzdWJcbn07XG4iXX0=","/**\n * @license\n * Copyright 2020 Google LLC. All Rights Reserved.\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n * =============================================================================\n */\nimport { backend_util, util } from '@tensorflow/tfjs-core';\nimport { add } from '../kernels/Add';\nimport { complex } from '../kernels/Complex';\nimport { concat } from '../kernels/Concat';\nimport { identity } from '../kernels/Identity';\nimport { imag } from '../kernels/Imag';\nimport { multiply } from '../kernels/Multiply';\nimport { real } from '../kernels/Real';\nimport { realDivConfig } from '../kernels/RealDiv';\nimport { slice } from '../kernels/Slice';\nimport { sub } from '../kernels/Sub';\n/**\n * Calculate FFT of inner most elements of batch tensor.\n */\nexport function fftBatch(input, inverse, cpuBackend) {\n const inputShape = input.shape;\n const batch = inputShape[0];\n const innerDim = inputShape[1];\n const inputVals = cpuBackend.data.get(input.dataId);\n const real2D = inputVals.complexTensorInfos.real;\n const imag2D = inputVals.complexTensorInfos.imag;\n // Collects real and imaginary values separately.\n const resultShape = [batch, innerDim];\n const resultSize = util.sizeFromShape(resultShape);\n const resultReal = util.getTypedArrayFromDType('float32', resultSize);\n const resultImag = util.getTypedArrayFromDType('float32', resultSize);\n for (let b = 0; b < batch; b++) {\n // TODO: Support slice ops for complex type.\n const r = slice({\n inputs: { x: real2D },\n backend: cpuBackend,\n attrs: { begin: [b, 0], size: [1, innerDim] }\n });\n const i = slice({\n inputs: { x: imag2D },\n backend: cpuBackend,\n attrs: { begin: [b, 0], size: [1, innerDim] }\n });\n const input = complex({ inputs: { real: r, imag: i }, backend: cpuBackend });\n // Run FFT by batch element.\n const { real, imag } = fftImpl(input, inverse, cpuBackend);\n const res = backend_util.mergeRealAndImagArrays(real, imag);\n for (let d = 0; d < innerDim; d++) {\n const c = backend_util.getComplexWithIndex(res, d);\n resultReal[b * innerDim + d] = c.real;\n resultImag[b * innerDim + d] = c.imag;\n }\n cpuBackend.disposeIntermediateTensorInfo(r);\n cpuBackend.disposeIntermediateTensorInfo(i);\n cpuBackend.disposeIntermediateTensorInfo(input);\n }\n const $realInfo = cpuBackend.makeTensorInfo(resultShape, 'float32', resultReal);\n const $imagInfo = cpuBackend.makeTensorInfo(resultShape, 'float32', resultImag);\n const result = complex({ inputs: { real: $realInfo, imag: $imagInfo }, backend: cpuBackend });\n cpuBackend.disposeIntermediateTensorInfo($realInfo);\n cpuBackend.disposeIntermediateTensorInfo($imagInfo);\n return result;\n}\nexport function fftImpl(input, inverse, cpuBackend) {\n const inputSize = util.sizeFromShape(input.shape);\n const inputVals = cpuBackend.data.get(input.dataId);\n const realVals = cpuBackend.data.get(inputVals.complexTensorInfos.real.dataId).values;\n const imagVals = cpuBackend.data.get(inputVals.complexTensorInfos.imag.dataId).values;\n if (isExponentOf2(inputSize)) {\n const result = fftRadix2(realVals, imagVals, inputSize, inverse, cpuBackend);\n const resultShape = [input.shape[0], input.shape[1]];\n if (inverse) {\n const realInfo = cpuBackend.makeTensorInfo(resultShape, 'float32', result.real);\n const imagInfo = cpuBackend.makeTensorInfo(resultShape, 'float32', result.imag);\n const sizeInfo = cpuBackend.makeTensorInfo([], 'float32', util.createScalarValue(inputSize, 'float32'));\n const sizeInfoCopy = identity({ inputs: { x: sizeInfo }, backend: cpuBackend });\n const divRealInfo = realDivConfig.kernelFunc({ inputs: { a: realInfo, b: sizeInfo }, backend: cpuBackend });\n const divImagInfo = realDivConfig.kernelFunc({ inputs: { a: imagInfo, b: sizeInfoCopy }, backend: cpuBackend });\n const divRealVals = cpuBackend.data.get(divRealInfo.dataId).values;\n const divImagVals = cpuBackend.data.get(divImagInfo.dataId).values;\n cpuBackend.disposeIntermediateTensorInfo(realInfo);\n cpuBackend.disposeIntermediateTensorInfo(imagInfo);\n cpuBackend.disposeIntermediateTensorInfo(sizeInfo);\n cpuBackend.disposeIntermediateTensorInfo(sizeInfoCopy);\n cpuBackend.disposeIntermediateTensorInfo(divRealInfo);\n cpuBackend.disposeIntermediateTensorInfo(divImagInfo);\n return { real: divRealVals, imag: divImagVals };\n }\n return result;\n }\n else {\n const data = backend_util.mergeRealAndImagArrays(realVals, imagVals);\n const rawOutput = fourierTransformByMatmul(data, inputSize, inverse);\n return backend_util.splitRealAndImagArrays(rawOutput);\n }\n}\nfunction isExponentOf2(size) {\n return (size & size - 1) === 0;\n}\n// FFT using Cooley-Tukey algorithm on radix 2 dimensional input.\nfunction fftRadix2(realVals, imagVals, size, inverse, cpuBackend) {\n if (size === 1) {\n return { real: realVals, imag: imagVals };\n }\n const data = backend_util.mergeRealAndImagArrays(realVals, imagVals);\n const half = size / 2;\n const evenComplex = backend_util.complexWithEvenIndex(data);\n const evenRealVals = evenComplex.real;\n const evenImagVals = evenComplex.imag;\n const evenShape = [evenRealVals.length];\n const evenRealInfo = cpuBackend.makeTensorInfo(evenShape, 'float32', evenRealVals);\n const evenImagInfo = cpuBackend.makeTensorInfo(evenShape, 'float32', evenImagVals);\n const evenTensorInfo = complex({ inputs: { real: evenRealInfo, imag: evenImagInfo }, backend: cpuBackend });\n const oddComplex = backend_util.complexWithOddIndex(data);\n const oddRealVals = oddComplex.real;\n const oddImagVals = oddComplex.imag;\n const oddShape = [oddRealVals.length];\n const oddRealInfo = cpuBackend.makeTensorInfo(oddShape, 'float32', oddRealVals);\n const oddImagInfo = cpuBackend.makeTensorInfo(oddShape, 'float32', oddImagVals);\n const oddTensorInfo = complex({ inputs: { real: oddRealInfo, imag: oddImagInfo }, backend: cpuBackend });\n // Recursive call for half part of original input.\n const $evenComplex = fftRadix2(evenRealVals, evenImagVals, half, inverse, cpuBackend);\n const $evenRealVals = $evenComplex.real;\n const $evenImagVals = $evenComplex.imag;\n const $evenShape = [$evenRealVals.length];\n const $evenRealInfo = cpuBackend.makeTensorInfo($evenShape, 'float32', $evenRealVals);\n const $evenImagInfo = cpuBackend.makeTensorInfo($evenShape, 'float32', $evenImagVals);\n const $evenTensorInfo = complex({\n inputs: { real: $evenRealInfo, imag: $evenImagInfo },\n backend: cpuBackend\n });\n const $oddComplex = fftRadix2(oddRealVals, oddImagVals, half, inverse, cpuBackend);\n const $oddRealVals = $oddComplex.real;\n const $oddImagVals = $oddComplex.imag;\n const $oddShape = [$oddRealVals.length];\n const $oddRealInfo = cpuBackend.makeTensorInfo($oddShape, 'float32', $oddRealVals);\n const $oddImagInfo = cpuBackend.makeTensorInfo($oddShape, 'float32', $oddImagVals);\n const $oddTensorInfo = complex({ inputs: { real: $oddRealInfo, imag: $oddImagInfo }, backend: cpuBackend });\n const e = backend_util.exponents(size, inverse);\n const eShape = [e.real.length];\n const eRealInfo = cpuBackend.makeTensorInfo(eShape, 'float32', e.real);\n const eImagInfo = cpuBackend.makeTensorInfo(eShape, 'float32', e.imag);\n const complexInfo = complex({ inputs: { real: eRealInfo, imag: eImagInfo }, backend: cpuBackend });\n const exponentInfo = multiply({ inputs: { a: complexInfo, b: $oddTensorInfo }, backend: cpuBackend });\n const addPart = add({\n inputs: { a: $evenTensorInfo, b: exponentInfo },\n backend: cpuBackend\n });\n const subPart = sub({\n inputs: { a: $evenTensorInfo, b: exponentInfo },\n backend: cpuBackend\n });\n const addPartReal = real({ inputs: { input: addPart }, backend: cpuBackend });\n const subPartReal = real({ inputs: { input: subPart }, backend: cpuBackend });\n const addPartImag = imag({ inputs: { input: addPart }, backend: cpuBackend });\n const subPartImag = imag({ inputs: { input: subPart }, backend: cpuBackend });\n const $real = concat({\n inputs: [addPartReal, subPartReal],\n backend: cpuBackend,\n attrs: { axis: 0 }\n });\n const $imag = concat({\n inputs: [addPartImag, subPartImag],\n backend: cpuBackend,\n attrs: { axis: 0 }\n });\n const $realVals = cpuBackend.data.get($real.dataId).values;\n const $imagVals = cpuBackend.data.get($imag.dataId).values;\n cpuBackend.disposeIntermediateTensorInfo(evenRealInfo);\n cpuBackend.disposeIntermediateTensorInfo(evenImagInfo);\n cpuBackend.disposeIntermediateTensorInfo(evenTensorInfo);\n cpuBackend.disposeIntermediateTensorInfo(oddRealInfo);\n cpuBackend.disposeIntermediateTensorInfo(oddImagInfo);\n cpuBackend.disposeIntermediateTensorInfo(oddTensorInfo);\n cpuBackend.disposeIntermediateTensorInfo($evenRealInfo);\n cpuBackend.disposeIntermediateTensorInfo($evenImagInfo);\n cpuBackend.disposeIntermediateTensorInfo($evenTensorInfo);\n cpuBackend.disposeIntermediateTensorInfo($oddRealInfo);\n cpuBackend.disposeIntermediateTensorInfo($oddImagInfo);\n cpuBackend.disposeIntermediateTensorInfo($oddTensorInfo);\n cpuBackend.disposeIntermediateTensorInfo(eRealInfo);\n cpuBackend.disposeIntermediateTensorInfo(eImagInfo);\n cpuBackend.disposeIntermediateTensorInfo(complexInfo);\n cpuBackend.disposeIntermediateTensorInfo(exponentInfo);\n cpuBackend.disposeIntermediateTensorInfo(addPart);\n cpuBackend.disposeIntermediateTensorInfo(subPart);\n cpuBackend.disposeIntermediateTensorInfo(addPartReal);\n cpuBackend.disposeIntermediateTensorInfo(addPartImag);\n cpuBackend.disposeIntermediateTensorInfo(subPartReal);\n cpuBackend.disposeIntermediateTensorInfo(subPartImag);\n cpuBackend.disposeIntermediateTensorInfo($real);\n cpuBackend.disposeIntermediateTensorInfo($imag);\n return { real: $realVals, imag: $imagVals };\n}\n// Calculate fourier transform by multplying sinusoid matrix.\nfunction fourierTransformByMatmul(data, size, inverse) {\n const ret = new Float32Array(size * 2);\n // TODO: Use matmul instead once it supports complex64 type.\n for (let r = 0; r < size; r++) {\n let real = 0.0;\n let imag = 0.0;\n for (let c = 0; c < size; c++) {\n const e = backend_util.exponent(r * c, size, inverse);\n const term = backend_util.getComplexWithIndex(data, c);\n real += term.real * e.real - term.imag * e.imag;\n imag += term.real * e.imag + term.imag * e.real;\n }\n if (inverse) {\n real /= size;\n imag /= size;\n }\n backend_util.assignToTypedArray(ret, real, imag, r);\n }\n return ret;\n}\n//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZmZ0X3V0aWxzLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vLi4vdGZqcy1iYWNrZW5kLWNwdS9zcmMvdXRpbHMvZmZ0X3V0aWxzLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBOzs7Ozs7Ozs7Ozs7Ozs7R0FlRztBQUVILE9BQU8sRUFBQyxZQUFZLEVBQWtDLElBQUksRUFBQyxNQUFNLHVCQUF1QixDQUFDO0FBR3pGLE9BQU8sRUFBQyxHQUFHLEVBQUMsTUFBTSxnQkFBZ0IsQ0FBQztBQUNuQyxPQUFPLEVBQUMsT0FBTyxFQUFDLE1BQU0sb0JBQW9CLENBQUM7QUFDM0MsT0FBTyxFQUFDLE1BQU0sRUFBQyxNQUFNLG1CQUFtQixDQUFDO0FBQ3pDLE9BQU8sRUFBQyxRQUFRLEVBQUMsTUFBTSxxQkFBcUIsQ0FBQztBQUM3QyxPQUFPLEVBQUMsSUFBSSxFQUFDLE1BQU0saUJBQWlCLENBQUM7QUFDckMsT0FBTyxFQUFDLFFBQVEsRUFBQyxNQUFNLHFCQUFxQixDQUFDO0FBQzdDLE9BQU8sRUFBQyxJQUFJLEVBQUMsTUFBTSxpQkFBaUIsQ0FBQztBQUNyQyxPQUFPLEVBQUMsYUFBYSxFQUFDLE1BQU0sb0JBQW9CLENBQUM7QUFDakQsT0FBTyxFQUFDLEtBQUssRUFBQyxNQUFNLGtCQUFrQixDQUFDO0FBQ3ZDLE9BQU8sRUFBQyxHQUFHLEVBQUMsTUFBTSxnQkFBZ0IsQ0FBQztBQUVuQzs7R0FFRztBQUNILE1BQU0sVUFBVSxRQUFRLENBQ3BCLEtBQWlCLEVBQUUsT0FBZ0IsRUFDbkMsVUFBMEI7SUFDNUIsTUFBTSxVQUFVLEdBQUcsS0FBSyxDQUFDLEtBQUssQ0FBQztJQUMvQixNQUFNLEtBQUssR0FBRyxVQUFVLENBQUMsQ0FBQyxDQUFDLENBQUM7SUFDNUIsTUFBTSxRQUFRLEdBQUcsVUFBVSxDQUFDLENBQUMsQ0FBQyxDQUFDO0lBRS9CLE1BQU0sU0FBUyxHQUFHLFVBQVUsQ0FBQyxJQUFJLENBQUMsR0FBRyxD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SUFBSSxPQUFPLEVBQUU7WUFDWCxJQUFJLElBQUksSUFBSSxDQUFDO1lBQ2IsSUFBSSxJQUFJLElBQUksQ0FBQztTQUNkO1FBQ0QsWUFBWSxDQUFDLGtCQUFrQixDQUFDLEdBQUcsRUFBRSxJQUFJLEVBQUUsSUFBSSxFQUFFLENBQUMsQ0FBQyxDQUFDO0tBQ3JEO0lBQ0QsT0FBTyxHQUFHLENBQUM7QUFDYixDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiLyoqXG4gKiBAbGljZW5zZVxuICogQ29weXJpZ2h0IDIwMjAgR29vZ2xlIExMQy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC5cbiAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSBcIkxpY2Vuc2VcIik7XG4gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuXG4gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXRcbiAqXG4gKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjBcbiAqXG4gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlXG4gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiBcIkFTIElTXCIgQkFTSVMsXG4gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC5cbiAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmRcbiAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLlxuICogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbiAqL1xuXG5pbXBvcnQge2JhY2tlbmRfdXRpbCwgVGVuc29yLCBUZW5zb3JJbmZvLCBUeXBlZEFycmF5LCB1dGlsfSBmcm9tICdAdGVuc29yZmxvdy90ZmpzLWNvcmUnO1xuXG5pbXBvcnQge01hdGhCYWNrZW5kQ1BVfSBmcm9tICcuLi9iYWNrZW5kX2NwdSc7XG5pbXBvcnQge2FkZH0gZnJvbSAnLi4va2VybmVscy9BZGQnO1xuaW1wb3J0IHtjb21wbGV4fSBmcm9tICcuLi9rZXJuZWxzL0NvbXBsZXgnO1xuaW1wb3J0IHtjb25jYXR9IGZyb20gJy4uL2tlcm5lbHMvQ29uY2F0JztcbmltcG9ydCB7aWRlbnRpdHl9IGZyb20gJy4uL2tlcm5lbHMvSWRlbnRpdHknO1xuaW1wb3J0IHtpbWFnfSBmcm9tICcuLi9rZXJuZWxzL0ltYWcnO1xuaW1wb3J0IHttdWx0aXBseX0gZnJvbSAnLi4va2VybmVscy9NdWx0aXBseSc7XG5pbXBvcnQge3JlYWx9IGZyb20gJy4uL2tlcm5lbHMvUmVhbCc7XG5pbXBvcnQge3JlYWxEaXZDb25maWd9IGZyb20gJy4uL2tlcm5lbHMvUmVhbERpdic7XG5pbXBvcnQge3NsaWNlfSBmcm9tICcuLi9rZXJuZWxzL1NsaWNlJztcbmltcG9ydCB7c3VifSBmcm9tICcuLi9rZXJuZWxzL1N1Yic7XG5cbi8qKlxuICogQ2FsY3VsYXRlIEZGVCBvZiBpbm5lciBtb3N0IGVsZW1lbnRzIG9mIGJhdGNoIHRlbnNvci5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGZmdEJhdGNoKFxuICAgIGlucHV0OiBUZW5zb3JJbmZvLCBpbnZlcnNlOiBib29sZWFuLFxuICAgIGNwdUJhY2tlbmQ6IE1hdGhCYWNrZW5kQ1BVKTogVGVuc29ySW5mbyB7XG4gIGNvbnN0IGlucHV0U2hhcGUgPSBpbnB1dC5zaGFwZTtcbiAgY29uc3QgYmF0Y2ggPSBpbnB1dFNoYXBlWzBdO1xuICBjb25zdCBpbm5lckRpbSA9IGlucHV0U2hhcGVbMV07XG5cbiAgY29uc3QgaW5wdXRWYWxzID0gY3B1QmFja2VuZC5kYXRhLmdldChpbnB1dC5kYXRhSWQpO1xuXG4gIGNvbnN0IHJlYWwyRCA9IGlucHV0VmFscy5jb21wbGV4VGVuc29ySW5mb3MucmVhbDtcbiAgY29uc3QgaW1hZzJEID0gaW5wdXRWYWxzLmNvbXBsZXhUZW5zb3JJbmZvcy5pbWFnO1xuXG4gIC8vIENvbGxlY3RzIHJlYWwgYW5kIGltYWdpbmFyeSB2YWx1ZXMgc2VwYXJhdGVseS5cbiAgY29uc3QgcmVzdWx0U2hhcGUgPSBbYmF0Y2gsIGlubmVyRGltXTtcbiAgY29uc3QgcmVzdWx0U2l6ZSA9IHV0aWwuc2l6ZUZyb21TaGFwZShyZXN1bHRTaGFwZSk7XG4gIGNvbnN0IHJlc3VsdFJlYWwgPSB1dGlsLmdldFR5cGVkQXJyYXlGcm9tRFR5cGUoJ2Zsb2F0MzInLCByZXN1bHRTaXplKTtcbiAgY29uc3QgcmVzdWx0SW1hZyA9IHV0aWwuZ2V0VHlwZWRBcnJheUZyb21EVHlwZSgnZmxvYXQzMicsIHJlc3VsdFNpemUpO1xuXG4gIGZvciAobGV0IGIgPSAwOyBiIDwgYmF0Y2g7IGIrKykge1xuICAgIC8vIFRPRE86IFN1cHBvcnQgc2xpY2Ugb3BzIGZvciBjb21wbGV4IHR5cGUuXG4gICAgY29uc3QgciA9IHNsaWNlKHtcbiAgICAgIGlucHV0czoge3g6IHJlYWwyRH0sXG4gICAgICBiYWNrZW5kOiBjcHVCYWNrZW5kLFxuICAgICAgYXR0cnM6IHtiZWdpbjogW2IsIDBdLCBzaXplOiBbMSwgaW5uZXJEaW1dfVxuICAgIH0pO1xuICAgIGNvbnN0IGkgPSBzbGljZSh7XG4gICAgICBpbnB1dHM6IHt4OiBpbWFnMkR9LFxuICAgICAgYmFja2VuZDogY3B1QmFja2VuZCxcbiAgICAgIGF0dHJzOiB7YmVnaW46IFtiLCAwXSwgc2l6ZTogWzEsIGlubmVyRGltXX1cbiAgICB9KTtcblxuICAgIGNvbnN0IGlucHV0ID0gY29tcGxleCh7aW5wdXRzOiB7cmVhbDogciwgaW1hZzogaX0sIGJhY2tlbmQ6IGNwdUJhY2tlbmR9KTtcblxuICAgIC8vIFJ1biBGRlQgYnkgYmF0Y2ggZWxlbWVudC5cbiAgICBjb25zdCB7cmVhbCwgaW1hZ30gPSBmZnRJbXBsKGlucHV0LCBpbnZlcnNlLCBjcHVCYWNrZW5kKTtcbiAgICBjb25zdCByZXMgPSBiYWNrZW5kX3V0aWwubWVyZ2VSZWFsQW5kSW1hZ0FycmF5cyhyZWFsLCBpbWFnKTtcblxuICAgIGZvciAobGV0IGQgPSAwOyBkIDwgaW5uZXJEaW07IGQrKykge1xuICAgICAgY29uc3QgYyA9IGJhY2tlbmRfdXRpbC5nZXRDb21wbGV4V2l0aEluZGV4KHJlcywgZCk7XG4gICAgICByZXN1bHRSZWFsW2IgKiBpbm5lckRpbSArIGRdID0gYy5yZWFsO1xuICAgICAgcmVzdWx0SW1hZ1tiICogaW5uZXJEaW0gKyBkXSA9IGMuaW1hZztcbiAgICB9XG5cbiAgICBjcHVCYWNrZW5kLmRpc3Bvc2VJbnRlcm1lZGlhdGVUZW5zb3JJbmZvKHIpO1xuICAgIGNwdUJhY2tlbmQuZGlzcG9zZUludGVybWVkaWF0ZVRlbnNvckluZm8oaSk7XG4gICAgY3B1QmFja2VuZC5kaXNwb3NlSW50ZXJtZWRpYXRlVGVuc29ySW5mbyhpbnB1dCk7XG4gIH1cblxuICBjb25zdCAkcmVhbEluZm86IFRlbnNvckluZm8gPVxuICAgICAgY3B1QmFja2VuZC5tYWtlVGVuc29ySW5mbyhyZXN1bHRTaGFwZSwgJ2Zsb2F0MzInLCByZXN1bHRSZWFsKTtcbiAgY29uc3QgJGltYWdJbmZvOiBUZW5zb3JJbmZvID1cbiAgICAgIGNwdUJhY2tlbmQubWFrZVRlbnNvckluZm8ocmVzdWx0U2hhcGUsICdmbG9hdDMyJywgcmVzdWx0SW1hZyk7XG5cbiAgY29uc3QgcmVzdWx0ID0gY29tcGxleChcbiAgICAgIHtpbnB1dHM6IHtyZWFsOiAkcmVhbEluZm8sIGltYWc6ICRpbWFnSW5mb30sIGJhY2tlbmQ6IGNwdUJhY2tlbmR9KTtcblxuICBjcHVCYWNrZW5kLmRpc3Bvc2VJbnRlcm1lZGlhdGVUZW5zb3JJbmZvKCRyZWFsSW5mbyk7XG4gIGNwdUJhY2tlbmQuZGlzcG9zZUludGVybWVkaWF0ZVRlbnNvckluZm8oJGltYWdJbmZvKTtcblxuICByZXR1cm4gcmVzdWx0O1xufVxuXG5leHBvcnQgZnVuY3Rpb24gZmZ0SW1wbChcbiAgICBpbnB1dDogVGVuc29ySW5mbywgaW52ZXJzZTogYm9vbGVhbixcbiAgICBjcHVCYWNrZW5kOiBNYXRoQmFja2VuZENQVSk6IHtyZWFsOiBGbG9hdDMyQXJyYXksIGltYWc6IEZsb2F0MzJBcnJheX0ge1xuICBjb25zdCBpbnB1dFNpemUgPSB1dGlsLnNpemVGcm9tU2hhcGUoaW5wdXQuc2hhcGUpO1xuXG4gIGNvbnN0IGlucHV0VmFscyA9IGNwdUJhY2tlbmQuZGF0YS5nZXQoaW5wdXQuZGF0YUlkKTtcblxuICBjb25zdCByZWFsVmFscyA9XG4gICAgICBjcHVCYWNrZW5kLmRhdGEuZ2V0KGlucHV0VmFscy5jb21wbGV4VGVuc29ySW5mb3MucmVhbC5kYXRhSWQpLnZhbHVlcyBhc1xuICAgICAgRmxvYXQzMkFycmF5O1xuXG4gIGNvbnN0IGltYWdWYWxzID1cbiAgICAgIGNwdUJhY2tlbmQuZGF0YS5nZXQoaW5wdXRWYWxzLmNvbXBsZXhUZW5zb3JJbmZvcy5pbWFnLmRhdGFJZCkudmFsdWVzIGFzXG4gICAgICBGbG9hdDMyQXJyYXk7XG5cbiAgaWYgKGlzRXhwb25lbnRPZjIoaW5wdXRTaXplKSkge1xuICAgIGNvbnN0IHJlc3VsdCA9XG4gICAgICAgIGZmdFJhZGl4MihyZWFsVmFscywgaW1hZ1ZhbHMsIGlucHV0U2l6ZSwgaW52ZXJzZSwgY3B1QmFja2VuZCk7XG5cbiAgICBjb25zdCByZXN1bHRTaGFwZSA9IFtpbnB1dC5zaGFwZVswXSwgaW5wdXQuc2hhcGVbMV1dO1xuXG4gICAgaWYgKGludmVyc2UpIHtcbiAgICAgIGNvbnN0IHJlYWxJbmZvOiBUZW5zb3JJbmZvID1cbiAgICAgICAgICBjcHVCYWNrZW5kLm1ha2VUZW5zb3JJbmZvKHJlc3VsdFNoYXBlLCAnZmxvYXQzMicsIHJlc3VsdC5yZWFsKTtcbiAgICAgIGNvbnN0IGltYWdJbmZvOiBUZW5zb3JJbmZvID1cbiAgICAgICAgICBjcHVCYWNrZW5kLm1ha2VUZW5zb3JJbmZvKHJlc3VsdFNoYXBlLCAnZmxvYXQzMicsIHJlc3VsdC5pbWFnKTtcblxuICAgICAgY29uc3Qgc2l6ZUluZm86IFRlbnNvckluZm8gPSBjcHVCYWNrZW5kLm1ha2VUZW5zb3JJbmZvKFxuICAgICAgICAgIFtdLCAnZmxvYXQzMicsXG4gICAgICAgICAgdXRpbC5jcmVhdGVTY2FsYXJWYWx1ZShpbnB1dFNpemUgYXMge30gYXMgJ2Zsb2F0MzInLCAnZmxvYXQzMicpKTtcbiAgICAgIGNvbnN0IHNpemVJbmZvQ29weSA9XG4gICAgICAgICAgaWRlbnRpdHkoe2lucHV0czoge3g6IHNpemVJbmZvfSwgYmFja2VuZDogY3B1QmFja2VuZH0pO1xuXG4gICAgICBjb25zdCBkaXZSZWFsSW5mbyA9XG4gICAgICAgICAgcmVhbERpdkNvbmZpZy5rZXJuZWxGdW5jKFxuICAgICAgICAgICAgICB7aW5wdXRzOiB7YTogcmVhbEluZm8sIGI6IHNpemVJbmZvfSwgYmFja2VuZDogY3B1QmFja2VuZH0pIGFzXG4gICAgICAgICAgVGVuc29ySW5mbztcbiAgICAgIGNvbnN0IGRpdkltYWdJbmZvID1cbiAgICAgICAgICByZWFsRGl2Q29uZmlnLmtlcm5lbEZ1bmMoXG4gICAgICAgICAgICAgIHtpbnB1dHM6IHthOiBpbWFnSW5mbywgYjogc2l6ZUluZm9Db3B5fSwgYmFja2VuZDogY3B1QmFja2VuZH0pIGFzXG4gICAgICAgICAgVGVuc29ySW5mbztcblxuICAgICAgY29uc3QgZGl2UmVhbFZhbHMgPVxuICAgICAgICAgIGNwdUJhY2tlbmQuZGF0YS5nZXQoZGl2UmVhbEluZm8uZGF0YUlkKS52YWx1ZXMgYXMgRmxvYXQzMkFycmF5O1xuICAgICAgY29uc3QgZGl2SW1hZ1ZhbHMgPVxuICAgICAgICAgIGNwdUJhY2tlbmQuZGF0YS5nZXQoZGl2SW1hZ0luZm8uZGF0YUlkKS52YWx1ZXMgYXMgRmxvYXQzMkFycmF5O1xuXG4gICAgICBjcHVCYWNrZW5kLmRpc3Bvc2VJbnRlcm1lZGlhdGVUZW5zb3JJbmZvKHJlYWxJbmZvKTtcbiAgICAgIGNwdUJhY2tlbmQuZGlzcG9zZUludGVybWVkaWF0ZVRlbnNvckluZm8oaW1hZ0luZm8pO1xuICAgICAgY3B1QmFja2VuZC5kaXNwb3NlSW50ZXJtZWRpYXRlVGVuc29ySW5mbyhzaXplSW5mbyk7XG4gICAgICBjcHVCYWNrZW5kLmRpc3Bvc2VJbnRlcm1lZGlhdGVUZW5zb3JJbmZvKHNpemVJbmZvQ29weSk7XG4gICAgICBjcHVCYWNrZW5kLmRpc3Bvc2VJbnRlcm1lZGlhdGVUZW5zb3JJbmZvKGRpdlJlYWxJbmZvKTtcbiAgICAgIGNwdUJhY2tlbmQuZGlzcG9zZUludGVybWVkaWF0ZVRlbnNvckluZm8oZGl2SW1hZ0luZm8pO1xuXG4gICAgICByZXR1cm4ge3JlYWw6IGRpdlJlYWxWYWxzLCBpbWFnOiBkaXZJbWFnVmFsc307XG4gICAgfVxuXG4gICAgcmV0dXJuIHJlc3VsdDtcbiAgfSBlbHNlIHtcbiAgICBjb25zdCBkYXRhID0gYmFja2VuZF91dGlsLm1lcmdlUmVhbEFuZEltYWdBcnJheXMocmVhbFZhbHMsIGltYWdWYWxzKTtcblxuICAgIGNvbnN0IHJhd091dHB1dCA9XG4gICAgICAgIGZvdXJpZXJUcmFuc2Zvcm1CeU1hdG11bChkYXRhLCBpbnB1dFNpemUsIGludmVyc2UpIGFzIEZsb2F0MzJBcnJheTtcblxuICAgIHJldHVybiBiYWNrZW5kX3V0aWwuc3BsaXRSZWFsQW5kSW1hZ0FycmF5cyhyYXdPdXRwdXQpO1xuICB9XG59XG5cbmZ1bmN0aW9uIGlzRXhwb25lbnRPZjIoc2l6ZTogbnVtYmVyKTogYm9vbGVhbiB7XG4gIHJldHVybiAoc2l6ZSAmIHNpemUgLSAxKSA9PT0gMDtcbn1cblxuLy8gRkZUIHVzaW5nIENvb2xleS1UdWtleSBhbGdvcml0aG0gb24gcmFkaXggMiBkaW1lbnNpb25hbCBpbnB1dC5cbmZ1bmN0aW9uIGZmdFJhZGl4MihcbiAgICByZWFsVmFsczogRmxvYXQzMkFycmF5LCBpbWFnVmFsczogRmxvYXQzMkFycmF5LCBzaXplOiBudW1iZXIsXG4gICAgaW52ZXJzZTogYm9vbGVhbixcbiAgICBjcHVCYWNrZW5kOiBNYXRoQmFja2VuZENQVSk6IHtyZWFsOiBGbG9hdDMyQXJyYXksIGltYWc6IEZsb2F0MzJBcnJheX0ge1xuICBpZiAoc2l6ZSA9PT0gMSkge1xuICAgIHJldHVybiB7cmVhbDogcmVhbFZhbHMsIGltYWc6IGltYWdWYWxzfTtcbiAgfVxuXG4gIGNvbnN0IGRhdGEgPSBiYWNrZW5kX3V0aWwubWVyZ2VSZWFsQW5kSW1hZ0FycmF5cyhyZWFsVmFscywgaW1hZ1ZhbHMpO1xuXG4gIGNvbnN0IGhhbGYgPSBzaXplIC8gMjtcblxuICBjb25zdCBldmVuQ29tcGxleCA9IGJhY2tlbmRfdXRpbC5jb21wbGV4V2l0aEV2ZW5JbmRleChkYXRhKTtcblxuICBjb25zdCBldmVuUmVhbFZhbHMgPSBldmVuQ29tcGxleC5yZWFsO1xuICBjb25zdCBldmVuSW1hZ1ZhbHMgPSBldmVuQ29tcGxleC5pbWFnO1xuXG4gIGNvbnN0IGV2ZW5TaGFwZSA9IFtldmVuUmVhbFZhbHMubGVuZ3RoXTtcblxuICBjb25zdCBldmVuUmVhbEluZm8gPVxuICAgICAgY3B1QmFja2VuZC5tYWtlVGVuc29ySW5mbyhldmVuU2hhcGUsICdmbG9hdDMyJywgZXZlblJlYWxWYWxzKTtcbiAgY29uc3QgZXZlbkltYWdJbmZvID1cbiAgICAgIGNwdUJhY2tlbmQubWFrZVRlbnNvckluZm8oZXZlblNoYXBlLCAnZmxvYXQzMicsIGV2ZW5JbWFnVmFscyk7XG5cbiAgY29uc3QgZXZlblRlbnNvckluZm8gPSBjb21wbGV4KFxuICAgICAge2lucHV0czoge3JlYWw6IGV2ZW5SZWFsSW5mbywgaW1hZzogZXZlbkltYWdJbmZvfSwgYmFja2VuZDogY3B1QmFja2VuZH0pO1xuXG4gIGNvbnN0IG9kZENvbXBsZXggPSBiYWNrZW5kX3V0aWwuY29tcGxleFdpdGhPZGRJbmRleChkYXRhKTtcblxuICBjb25zdCBvZGRSZWFsVmFscyA9IG9kZENvbXBsZXgucmVhbDtcbiAgY29uc3Qgb2RkSW1hZ1ZhbHMgPSBvZGRDb21wbGV4LmltYWc7XG5cbiAgY29uc3Qgb2RkU2hhcGUgPSBbb2RkUmVhbFZhbHMubGVuZ3RoXTtcblxuICBjb25zdCBvZGRSZWFsSW5mbyA9XG4gICAgICBjcHVCYWNrZW5kLm1ha2VUZW5zb3JJbmZvKG9kZFNoYXBlLCAnZmxvYXQzMicsIG9kZFJlYWxWYWxzKTtcbiAgY29uc3Qgb2RkSW1hZ0luZm8gPVxuICAgICAgY3B1QmFja2VuZC5tYWtlVGVuc29ySW5mbyhvZGRTaGFwZSwgJ2Zsb2F0MzInLCBvZGRJbWFnVmFscyk7XG5cbiAgY29uc3Qgb2RkVGVuc29ySW5mbyA9IGNvbXBsZXgoXG4gICAgICB7aW5wdXRzOiB7cmVhbDogb2RkUmVhbEluZm8sIGltYWc6IG9kZEltYWdJbmZvfSwgYmFja2VuZDogY3B1QmFja2VuZH0pO1xuXG4gIC8vIFJlY3Vyc2l2ZSBjYWxsIGZvciBoYWxmIHBhcnQgb2Ygb3JpZ2luYWwgaW5wdXQuXG4gIGNvbnN0ICRldmVuQ29tcGxleCA9XG4gICAgICBmZnRSYWRpeDIoZXZlblJlYWxWYWxzLCBldmVuSW1hZ1ZhbHMsIGhhbGYsIGludmVyc2UsIGNwdUJhY2tlbmQpO1xuXG4gIGNvbnN0ICRldmVuUmVhbFZhbHMgPSAkZXZlbkNvbXBsZXgucmVhbDtcbiAgY29uc3QgJGV2ZW5JbWFnVmFscyA9ICRldmVuQ29tcGxleC5pbWFnO1xuXG4gIGNvbnN0ICRldmVuU2hhcGUgPSBbJGV2ZW5SZWFsVmFscy5sZW5ndGhdO1xuXG4gIGNvbnN0ICRldmVuUmVhbEluZm8gPVxuICAgICAgY3B1QmFja2VuZC5tYWtlVGVuc29ySW5mbygkZXZlblNoYXBlLCAnZmxvYXQzMicsICRldmVuUmVhbFZhbHMpO1xuICBjb25zdCAkZXZlbkltYWdJbmZvID1cbiAgICAgIGNwdUJhY2tlbmQubWFrZVRlbnNvckluZm8oJGV2ZW5TaGFwZSwgJ2Zsb2F0MzInLCAkZXZlbkltYWdWYWxzKTtcblxuICBjb25zdCAkZXZlblRlbnNvckluZm8gPSBjb21wbGV4KHtcbiAgICBpbnB1dHM6IHtyZWFsOiAkZXZlblJlYWxJbmZvLCBpbWFnOiAkZXZlbkltYWdJbmZvfSxcbiAgICBiYWNrZW5kOiBjcHVCYWNrZW5kXG4gIH0pO1xuXG4gIGNvbnN0ICRvZGRDb21wbGV4ID1cbiAgICAgIGZmdFJhZGl4MihvZGRSZWFsVmFscywgb2RkSW1hZ1ZhbHMsIGhhbGYsIGludmVyc2UsIGNwdUJhY2tlbmQpO1xuXG4gIGNvbnN0ICRvZGRSZWFsVmFscyA9ICRvZGRDb21wbGV4LnJlYWw7XG4gIGNvbnN0ICRvZGRJbWFnVmFscyA9ICRvZGRDb21wbGV4LmltYWc7XG5cbiAgY29uc3QgJG9kZFNoYXBlID0gWyRvZGRSZWFsVmFscy5sZW5ndGhdO1xuXG4gIGNvbnN0ICRvZGRSZWFsSW5mbyA9XG4gICAgICBjcHVCYWNrZW5kLm1ha2VUZW5zb3JJbmZvKCRvZGRTaGFwZSwgJ2Zsb2F0MzInLCAkb2RkUmVhbFZhbHMpO1xuICBjb25zdCAkb2RkSW1hZ0luZm8gPVxuICAgICAgY3B1QmFja2VuZC5tYWtlVGVuc29ySW5mbygkb2RkU2hhcGUsICdmbG9hdDMyJywgJG9kZEltYWdWYWxzKTtcblxuICBjb25zdCAkb2RkVGVuc29ySW5mbyA9IGNvbXBsZXgoXG4gICAgICB7aW5wdXRzOiB7cmVhbDogJG9kZFJlYWxJbmZvLCBpbWFnOiAkb2RkSW1hZ0luZm99LCBiYWNrZW5kOiBjcHVCYWNrZW5kfSk7XG5cbiAgY29uc3QgZSA9IGJhY2tlbmRfdXRpbC5leHBvbmVudHMoc2l6ZSwgaW52ZXJzZSk7XG4gIGNvbnN0IGVTaGFwZSA9IFtlLnJlYWwubGVuZ3RoXTtcblxuICBjb25zdCBlUmVhbEluZm8gPSBjcHVCYWNrZW5kLm1ha2VUZW5zb3JJbmZvKGVTaGFwZSwgJ2Zsb2F0MzInLCBlLnJlYWwpO1xuICBjb25zdCBlSW1hZ0luZm8gPSBjcHVCYWNrZW5kLm1ha2VUZW5zb3JJbmZvKGVTaGFwZSwgJ2Zsb2F0MzInLCBlLmltYWcpO1xuXG4gIGNvbnN0IGNvbXBsZXhJbmZvID0gY29tcGxleChcbiAgICAgIHtpbnB1dHM6IHtyZWFsOiBlUmVhbEluZm8sIGltYWc6IGVJbWFnSW5mb30sIGJhY2tlbmQ6IGNwdUJhY2tlbmR9KTtcblxuICBjb25zdCBleHBvbmVudEluZm8gPVxuICAgICAgbXVsdGlwbHkoXG4gICAgICAgICAge2lucHV0czoge2E6IGNvbXBsZXhJbmZvLCBiOiAkb2RkVGVuc29ySW5mb30sIGJhY2tlbmQ6IGNwdUJhY2tlbmR9KSBhc1xuICAgICAgVGVuc29ySW5mbztcblxuICBjb25zdCBhZGRQYXJ0ID0gYWRkKHtcbiAgICAgICAgICAgICAgICAgICAgaW5wdXRzOiB7YTogJGV2ZW5UZW5zb3JJbmZvLCBiOiBleHBvbmVudEluZm99LFxuICAgICAgICAgICAgICAgICAgICBiYWNrZW5kOiBjcHVCYWNrZW5kXG4gICAgICAgICAgICAgICAgICB9KSBhcyBUZW5zb3JJbmZvO1xuICBjb25zdCBzdWJQYXJ0ID0gc3ViKHtcbiAgICAgICAgICAgICAgICAgICAgaW5wdXRzOiB7YTogJGV2ZW5UZW5zb3JJbmZvLCBiOiBleHBvbmVudEluZm99LFxuICAgICAgICAgICAgICAgICAgICBiYWNrZW5kOiBjcHVCYWNrZW5kXG4gICAgICAgICAgICAgICAgICB9KSBhcyBUZW5zb3JJbmZvO1xuXG4gIGNvbnN0IGFkZFBhcnRSZWFsID0gcmVhbCh7aW5wdXRzOiB7aW5wdXQ6IGFkZFBhcnR9LCBiYWNrZW5kOiBjcHVCYWNrZW5kfSk7XG4gIGNvbnN0IHN1YlBhcnRSZWFsID0gcmVhbCh7aW5wdXRzOiB7aW5wdXQ6IHN1YlBhcnR9LCBiYWNrZW5kOiBjcHVCYWNrZW5kfSk7XG5cbiAgY29uc3QgYWRkUGFydEltYWcgPSBpbWFnKHtpbnB1dHM6IHtpbnB1dDogYWRkUGFydH0sIGJhY2tlbmQ6IGNwdUJhY2tlbmR9KTtcbiAgY29uc3Qgc3ViUGFydEltYWcgPSBpbWFnKHtpbnB1dHM6IHtpbnB1dDogc3ViUGFydH0sIGJhY2tlbmQ6IGNwdUJhY2tlbmR9KTtcblxuICBjb25zdCAkcmVhbCA9IGNvbmNhdCh7XG4gICAgaW5wdXRzOiBbYWRkUGFydFJlYWwgYXMgVGVuc29yLCBzdWJQYXJ0UmVhbCBhcyBUZW5zb3JdLFxuICAgIGJhY2tlbmQ6IGNwdUJhY2tlbmQsXG4gICAgYXR0cnM6IHtheGlzOiAwfVxuICB9KTtcbiAgY29uc3QgJGltYWcgPSBjb25jYXQoe1xuICAgIGlucHV0czogW2FkZFBhcnRJbWFnIGFzIFRlbnNvciwgc3ViUGFydEltYWcgYXMgVGVuc29yXSxcbiAgICBiYWNrZW5kOiBjcHVCYWNrZW5kLFxuICAgIGF0dHJzOiB7YXhpczogMH1cbiAgfSk7XG5cbiAgY29uc3QgJHJlYWxWYWxzID0gY3B1QmFja2VuZC5kYXRhLmdldCgkcmVhbC5kYXRhSWQpLnZhbHVlcyBhcyBGbG9hdDMyQXJyYXk7XG4gIGNvbnN0ICRpbWFnVmFscyA9IGNwdUJhY2tlbmQuZGF0YS5nZXQoJGltYWcuZGF0YUlkKS52YWx1ZXMgYXMgRmxvYXQzMkFycmF5O1xuXG4gIGNwdUJhY2tlbmQuZGlzcG9zZUludGVybWVkaWF0ZVRlbnNvckluZm8oZXZlblJlYWxJbmZvKTtcbiAgY3B1QmFja2VuZC5kaXNwb3NlSW50ZXJtZWRpYXRlVGVuc29ySW5mbyhldmVuSW1hZ0luZm8pO1xuICBjcHVCYWNrZW5kLmRpc3Bvc2VJbnRlcm1lZGlhdGVUZW5zb3JJbmZvKGV2ZW5UZW5zb3JJbmZvKTtcbiAgY3B1QmFja2VuZC5kaXNwb3NlSW50ZXJtZWRpYXRlVGVuc29ySW5mbyhvZGRSZWFsSW5mbyk7XG4gIGNwdUJhY2tlbmQuZGlzcG9zZUludGVybWVkaWF0ZVRlbnNvckluZm8ob2RkSW1hZ0luZm8pO1xuICBjcHVCYWNrZW5kLmRpc3Bvc2VJbnRlcm1lZGlhdGVUZW5zb3JJbmZvKG9kZFRlbnNvckluZm8pO1xuICBjcHVCYWNrZW5kLmRpc3Bvc2VJbnRlcm1lZGlhdGVUZW5zb3JJbmZvKCRldmVuUmVhbEluZm8pO1xuICBjcHVCYWNrZW5kLmRpc3Bvc2VJbnRlcm1lZGlhdGVUZW5zb3JJbmZvKCRldmVuSW1hZ0luZm8pO1xuICBjcHVCYWNrZW5kLmRpc3Bvc2VJbnRlcm1lZGlhdGVUZW5zb3JJbmZvKCRldmVuVGVuc29ySW5mbyk7XG4gIGNwdUJhY2tlbmQuZGlzcG9zZUludGVybWVkaWF0ZVRlbnNvckluZm8oJG9kZFJlYWxJbmZvKTtcbiAgY3B1QmFja2VuZC5kaXNwb3NlSW50ZXJtZWRpYXRlVGVuc29ySW5mbygkb2RkSW1hZ0luZm8pO1xuICBjcHVCYWNrZW5kLmRpc3Bvc2VJbnRlcm1lZGlhdGVUZW5zb3JJbmZvKCRvZGRUZW5zb3JJbmZvKTtcbiAgY3B1QmFja2VuZC5kaXNwb3NlSW50ZXJtZWRpYXRlVGVuc29ySW5mbyhlUmVhbEluZm8pO1xuICBjcHVCYWNrZW5kLmRpc3Bvc2VJbnRlcm1lZGlhdGVUZW5zb3JJbmZvKGVJbWFnSW5mbyk7XG4gIGNwdUJhY2tlbmQuZGlzcG9zZUludGVybWVkaWF0ZVRlbnNvckluZm8oY29tcGxleEluZm8pO1xuICBjcHVCYWNrZW5kLmRpc3Bvc2VJbnRlcm1lZGlhdGVUZW5zb3JJbmZvKGV4cG9uZW50SW5mbyk7XG4gIGNwdUJhY2tlbmQuZGlzcG9zZUludGVybWVkaWF0ZVRlbnNvckluZm8oYWRkUGFydCk7XG4gIGNwdUJhY2tlbmQuZGlzcG9zZUludGVybWVkaWF0ZVRlbnNvckluZm8oc3ViUGFydCk7XG4gIGNwdUJhY2tlbmQuZGlzcG9zZUludGVybWVkaWF0ZVRlbnNvckluZm8oYWRkUGFydFJlYWwpO1xuICBjcHVCYWNrZW5kLmRpc3Bvc2VJbnRlcm1lZGlhdGVUZW5zb3JJbmZvKGFkZFBhcnRJbWFnKTtcbiAgY3B1QmFja2VuZC5kaXNwb3NlSW50ZXJtZWRpYXRlVGVuc29ySW5mbyhzdWJQYXJ0UmVhbCk7XG4gIGNwdUJhY2tlbmQuZGlzcG9zZUludGVybWVkaWF0ZVRlbnNvckluZm8oc3ViUGFydEltYWcpO1xuICBjcHVCYWNrZW5kLmRpc3Bvc2VJbnRlcm1lZGlhdGVUZW5zb3JJbmZvKCRyZWFsKTtcbiAgY3B1QmFja2VuZC5kaXNwb3NlSW50ZXJtZWRpYXRlVGVuc29ySW5mbygkaW1hZyk7XG5cbiAgcmV0dXJuIHtyZWFsOiAkcmVhbFZhbHMsIGltYWc6ICRpbWFnVmFsc307XG59XG5cbi8vIENhbGN1bGF0ZSBmb3VyaWVyIHRyYW5zZm9ybSBieSBtdWx0cGx5aW5nIHNpbnVzb2lkIG1hdHJpeC5cbmZ1bmN0aW9uIGZvdXJpZXJUcmFuc2Zvcm1CeU1hdG11bChcbiAgICBkYXRhOiBUeXBlZEFycmF5LCBzaXplOiBudW1iZXIsIGludmVyc2U6IGJvb2xlYW4pOiBUeXBlZEFycmF5IHtcbiAgY29uc3QgcmV0ID0gbmV3IEZsb2F0MzJBcnJheShzaXplICogMik7XG4gIC8vIFRPRE86IFVzZSBtYXRtdWwgaW5zdGVhZCBvbmNlIGl0IHN1cHBvcnRzIGNvbXBsZXg2NCB0eXBlLlxuICBmb3IgKGxldCByID0gMDsgciA8IHNpemU7IHIrKykge1xuICAgIGxldCByZWFsID0gMC4wO1xuICAgIGxldCBpbWFnID0gMC4wO1xuICAgIGZvciAobGV0IGMgPSAwOyBjIDwgc2l6ZTsgYysrKSB7XG4gICAgICBjb25zdCBlID0gYmFja2VuZF91dGlsLmV4cG9uZW50KHIgKiBjLCBzaXplLCBpbnZlcnNlKTtcbiAgICAgIGNvbnN0IHRlcm0gPSBiYWNrZW5kX3V0aWwuZ2V0Q29tcGxleFdpdGhJbmRleChkYXRhIGFzIEZsb2F0MzJBcnJheSwgYyk7XG4gICAgICByZWFsICs9IHRlcm0ucmVhbCAqIGUucmVhbCAtIHRlcm0uaW1hZyAqIGUuaW1hZztcbiAgICAgIGltYWcgKz0gdGVybS5yZWFsICogZS5pbWFnICsgdGVybS5pbWFnICogZS5yZWFsO1xuICAgIH1cbiAgICBpZiAoaW52ZXJzZSkge1xuICAgICAgcmVhbCAvPSBzaXplO1xuICAgICAgaW1hZyAvPSBzaXplO1xuICAgIH1cbiAgICBiYWNrZW5kX3V0aWwuYXNzaWduVG9UeXBlZEFycmF5KHJldCwgcmVhbCwgaW1hZywgcik7XG4gIH1cbiAgcmV0dXJuIHJldDtcbn1cbiJdfQ==","/**\n * @license\n * Copyright 2020 Google LLC. All Rights Reserved.\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n * =============================================================================\n */\nimport { FFT, util } from '@tensorflow/tfjs-core';\nimport { fftBatch } from '../utils/fft_utils';\nimport { reshape } from './Reshape';\nexport function fft(args) {\n const { inputs, backend } = args;\n const { input } = inputs;\n const inputSize = util.sizeFromShape(input.shape);\n // Collapse all outer dimensions to a single batch dimension.\n const innerDimensionSize = input.shape[input.shape.length - 1];\n const batch = inputSize / innerDimensionSize;\n const input2D = reshape({\n inputs: { x: input },\n backend,\n attrs: { shape: [batch, innerDimensionSize] }\n });\n const result = fftBatch(input2D, false, backend);\n const resultReshaped = reshape({ inputs: { x: result }, backend, attrs: { shape: input.shape } });\n backend.disposeIntermediateTensorInfo(input2D);\n backend.disposeIntermediateTensorInfo(result);\n return resultReshaped;\n}\nexport const fftConfig = {\n kernelName: FFT,\n backendName: 'cpu',\n kernelFunc: fft\n};\n//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiRkZULmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vLi4vdGZqcy1iYWNrZW5kLWNwdS9zcmMva2VybmVscy9GRlQudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUE7Ozs7Ozs7Ozs7Ozs7OztHQWVHO0FBRUgsT0FBTyxFQUFDLEdBQUcsRUFBbUQsSUFBSSxFQUFDLE1BQU0sdUJBQXVCLENBQUM7QUFHakcsT0FBTyxFQUFDLFFBQVEsRUFBQyxNQUFNLG9CQUFvQixDQUFDO0FBQzVDLE9BQU8sRUFBQyxPQUFPLEVBQUMsTUFBTSxXQUFXLENBQUM7QUFFbEMsTUFBTSxVQUFVLEdBQUcsQ0FBQyxJQUFrRDtJQUVwRSxNQUFNLEVBQUMsTUFBTSxFQUFFLE9BQU8sRUFBQyxHQUFHLElBQUksQ0FBQztJQUMvQixNQUFNLEVBQUMsS0FBSyxFQUFDLEdBQUcsTUFBTSxDQUFDO0lBRXZCLE1BQU0sU0FBUyxHQUFHLElBQUksQ0FBQyxhQUFhLENBQUMsS0FBSyxDQUFDLEtBQUssQ0FBQyxDQUFDO0lBRWxELDZEQUE2RDtJQUM3RCxNQUFNLGtCQUFrQixHQUFHLEtBQUssQ0FBQyxLQUFLLENBQUMsS0FBSyxDQUFDLEtBQUssQ0FBQyxNQUFNLEdBQUcsQ0FBQyxDQUFDLENBQUM7SUFDL0QsTUFBTSxLQUFLLEdBQUcsU0FBUyxHQUFHLGtCQUFrQixDQUFDO0lBRTdDLE1BQU0sT0FBTyxHQUFHLE9BQU8sQ0FBQztRQUN0QixNQUFNLEVBQUUsRUFBQyxDQUFDLEVBQUUsS0FBSyxFQUFDO1FBQ2xCLE9BQU87UUFDUCxLQUFLLEVBQUUsRUFBQyxLQUFLLEVBQUUsQ0FBQyxLQUFLLEVBQUUsa0JBQWtCLENBQUMsRUFBQztLQUM1QyxDQUFDLENBQUM7SUFFSCxNQUFNLE1BQU0sR0FBRyxRQUFRLENBQUMsT0FBTyxFQUFFLEtBQUssRUFBRSxPQUFPLENBQUMsQ0FBQztJQUVqRCxNQUFNLGNBQWMsR0FDaEIsT0FBTyxDQUFDLEVBQUMsTUFBTSxFQUFFLEVBQUMsQ0FBQyxFQUFFLE1BQU0sRUFBQyxFQUFFLE9BQU8sRUFBRSxLQUFLLEVBQUUsRUFBQyxLQUFLLEVBQUUsS0FBSyxDQUFDLEtBQUssRUFBQyxFQUFDLENBQUMsQ0FBQztJQUV6RSxPQUFPLENBQUMsNkJBQTZCLENBQUMsT0FBTyxDQUFDLENBQUM7SUFDL0MsT0FBTyxDQUFDLDZCQUE2QixDQUFDLE1BQU0sQ0FBQyxDQUFDO0lBRTlDLE9BQU8sY0FBYyxDQUFDO0FBQ3hCLENBQUM7QUFFRCxNQUFNLENBQUMsTUFBTSxTQUFTLEdBQWlCO0lBQ3JDLFVBQVUsRUFBRSxHQUFHO0lBQ2YsV0FBVyxFQUFFLEtBQUs7SUFDbEIsVUFBVSxFQUFFLEdBQXVCO0NBQ3BDLENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyIvKipcbiAqIEBsaWNlbnNlXG4gKiBDb3B5cmlnaHQgMjAyMCBHb29nbGUgTExDLiBBbGwgUmlnaHRzIFJlc2VydmVkLlxuICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlIFwiTGljZW5zZVwiKTtcbiAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS5cbiAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdFxuICpcbiAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMFxuICpcbiAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmVcbiAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuIFwiQVMgSVNcIiBCQVNJUyxcbiAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLlxuICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZFxuICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuXG4gKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuICovXG5cbmltcG9ydCB7RkZULCBGRlRJbnB1dHMsIEtlcm5lbENvbmZpZywgS2VybmVsRnVuYywgVGVuc29ySW5mbywgdXRpbH0gZnJvbSAnQHRlbnNvcmZsb3cvdGZqcy1jb3JlJztcblxuaW1wb3J0IHtNYXRoQmFja2VuZENQVX0gZnJvbSAnLi4vYmFja2VuZF9jcHUnO1xuaW1wb3J0IHtmZnRCYXRjaH0gZnJvbSAnLi4vdXRpbHMvZmZ0X3V0aWxzJztcbmltcG9ydCB7cmVzaGFwZX0gZnJvbSAnLi9SZXNoYXBlJztcblxuZXhwb3J0IGZ1bmN0aW9uIGZmdChhcmdzOiB7aW5wdXRzOiBGRlRJbnB1dHMsIGJhY2tlbmQ6IE1hdGhCYWNrZW5kQ1BVfSk6XG4gICAgVGVuc29ySW5mbyB7XG4gIGNvbnN0IHtpbnB1dHMsIGJhY2tlbmR9ID0gYXJncztcbiAgY29uc3Qge2lucHV0fSA9IGlucHV0cztcblxuICBjb25zdCBpbnB1dFNpemUgPSB1dGlsLnNpemVGcm9tU2hhcGUoaW5wdXQuc2hhcGUpO1xuXG4gIC8vIENvbGxhcHNlIGFsbCBvdXRlciBkaW1lbnNpb25zIHRvIGEgc2luZ2xlIGJhdGNoIGRpbWVuc2lvbi5cbiAgY29uc3QgaW5uZXJEaW1lbnNpb25TaXplID0gaW5wdXQuc2hhcGVbaW5wdXQuc2hhcGUubGVuZ3RoIC0gMV07XG4gIGNvbnN0IGJhdGNoID0gaW5wdXRTaXplIC8gaW5uZXJEaW1lbnNpb25TaXplO1xuXG4gIGNvbnN0IGlucHV0MkQgPSByZXNoYXBlKHtcbiAgICBpbnB1dHM6IHt4OiBpbnB1dH0sXG4gICAgYmFja2VuZCxcbiAgICBhdHRyczoge3NoYXBlOiBbYmF0Y2gsIGlubmVyRGltZW5zaW9uU2l6ZV19XG4gIH0pO1xuXG4gIGNvbnN0IHJlc3VsdCA9IGZmdEJhdGNoKGlucHV0MkQsIGZhbHNlLCBiYWNrZW5kKTtcblxuICBjb25zdCByZXN1bHRSZXNoYXBlZCA9XG4gICAgICByZXNoYXBlKHtpbnB1dHM6IHt4OiByZXN1bHR9LCBiYWNrZW5kLCBhdHRyczoge3NoYXBlOiBpbnB1dC5zaGFwZX19KTtcblxuICBiYWNrZW5kLmRpc3Bvc2VJbnRlcm1lZGlhdGVUZW5zb3JJbmZvKGlucHV0MkQpO1xuICBiYWNrZW5kLmRpc3Bvc2VJbnRlcm1lZGlhdGVUZW5zb3JJbmZvKHJlc3VsdCk7XG5cbiAgcmV0dXJuIHJlc3VsdFJlc2hhcGVkO1xufVxuXG5leHBvcnQgY29uc3QgZmZ0Q29uZmlnOiBLZXJuZWxDb25maWcgPSB7XG4gIGtlcm5lbE5hbWU6IEZGVCxcbiAgYmFja2VuZE5hbWU6ICdjcHUnLFxuICBrZXJuZWxGdW5jOiBmZnQgYXMge30gYXMgS2VybmVsRnVuY1xufTtcbiJdfQ==","/**\n * @license\n * Copyright 2020 Google LLC. All Rights Reserved.\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n * =============================================================================\n */\nimport { Fill, util } from '@tensorflow/tfjs-core';\nexport function fill(args) {\n const { backend, attrs } = args;\n const { shape, value, dtype } = attrs;\n const $dtype = dtype || util.inferDtype(value);\n const values = util.getArrayFromDType($dtype, util.sizeFromShape(shape));\n fillValues(values, value, $dtype);\n return backend.makeTensorInfo(shape, $dtype, values);\n}\nexport const fillConfig = {\n kernelName: Fill,\n backendName: 'cpu',\n kernelFunc: fill\n};\nfunction fillValues(values, value, dtype) {\n if (dtype === 'string') {\n values.fill(value);\n }\n else {\n values.fill(value);\n }\n}\n//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiRmlsbC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uLy4uL3RmanMtYmFja2VuZC1jcHUvc3JjL2tlcm5lbHMvRmlsbC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQTs7Ozs7Ozs7Ozs7Ozs7O0dBZUc7QUFFSCxPQUFPLEVBQXVCLElBQUksRUFBK0QsSUFBSSxFQUFDLE1BQU0sdUJBQXVCLENBQUM7QUFJcEksTUFBTSxVQUFVLElBQUksQ0FBQyxJQUFpRDtJQUVwRSxNQUFNLEVBQUMsT0FBTyxFQUFFLEtBQUssRUFBQyxHQUFHLElBQUksQ0FBQztJQUM5QixNQUFNLEVBQUMsS0FBSyxFQUFFLEtBQUssRUFBRSxLQUFLLEVBQUMsR0FBRyxLQUFLLENBQUM7SUFFcEMsTUFBTSxNQUFNLEdBQUcsS0FBSyxJQUFJLElBQUksQ0FBQyxVQUFVLENBQUMsS0FBSyxDQUFDLENBQUM7SUFDL0MsTUFBTSxNQUFNLEdBQUcsSUFBSSxDQUFDLGlCQUFpQixDQUFDLE1BQU0sRUFBRSxJQUFJLENBQUMsYUFBYSxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUM7SUFDekUsVUFBVSxDQUFDLE1BQU0sRUFBRSxLQUFLLEVBQUUsTUFBTSxDQUFDLENBQUM7SUFFbEMsT0FBTyxPQUFPLENBQUMsY0FBYyxDQUFDLEtBQUssRUFBRSxNQUFNLEVBQUUsTUFBTSxDQUFDLENBQUM7QUFDdkQsQ0FBQztBQUVELE1BQU0sQ0FBQyxNQUFNLFVBQVUsR0FBaUI7SUFDdEMsVUFBVSxFQUFFLElBQUk7SUFDaEIsV0FBVyxFQUFFLEtBQUs7SUFDbEIsVUFBVSxFQUFFLElBQXdCO0NBQ3JDLENBQUM7QUFFRixTQUFTLFVBQVUsQ0FDZixNQUFrQixFQUFFLEtBQW9CLEVBQUUsS0FBZTtJQUMzRCxJQUFJLEtBQUssS0FBSyxRQUFRLEVBQUU7UUFDckIsTUFBbUIsQ0FBQyxJQUFJLENBQUMsS0FBZSxDQUFDLENBQUM7S0FDNUM7U0FBTTtRQUNKLE1BQXFCLENBQUMsSUFBSSxDQUFDLEtBQWUsQ0FBQyxDQUFDO0tBQzlDO0FBQ0gsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbIi8qKlxuICogQGxpY2Vuc2VcbiAqIENvcHlyaWdodCAyMDIwIEdvb2dsZSBMTEMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuXG4gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgXCJMaWNlbnNlXCIpO1xuICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLlxuICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0XG4gKlxuICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wXG4gKlxuICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZVxuICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gXCJBUyBJU1wiIEJBU0lTLFxuICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuXG4gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kXG4gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS5cbiAqID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4gKi9cblxuaW1wb3J0IHtEYXRhVHlwZSwgRGF0YVZhbHVlcywgRmlsbCwgRmlsbEF0dHJzLCBLZXJuZWxDb25maWcsIEtlcm5lbEZ1bmMsIFRlbnNvckluZm8sIFR5cGVkQXJyYXksIHV0aWx9IGZyb20gJ0B0ZW5zb3JmbG93L3RmanMtY29yZSc7XG5cbmltcG9ydCB7TWF0aEJhY2tlbmRDUFV9IGZyb20gJy4uL2JhY2tlbmRfY3B1JztcblxuZXhwb3J0IGZ1bmN0aW9uIGZpbGwoYXJnczoge2JhY2tlbmQ6IE1hdGhCYWNrZW5kQ1BVLCBhdHRyczogRmlsbEF0dHJzfSk6XG4gICAgVGVuc29ySW5mbyB7XG4gIGNvbnN0IHtiYWNrZW5kLCBhdHRyc30gPSBhcmdzO1xuICBjb25zdCB7c2hhcGUsIHZhbHVlLCBkdHlwZX0gPSBhdHRycztcblxuICBjb25zdCAkZHR5cGUgPSBkdHlwZSB8fCB1dGlsLmluZmVyRHR5cGUodmFsdWUpO1xuICBjb25zdCB2YWx1ZXMgPSB1dGlsLmdldEFycmF5RnJvbURUeXBlKCRkdHlwZSwgdXRpbC5zaXplRnJvbVNoYXBlKHNoYXBlKSk7XG4gIGZpbGxWYWx1ZXModmFsdWVzLCB2YWx1ZSwgJGR0eXBlKTtcblxuICByZXR1cm4gYmFja2VuZC5tYWtlVGVuc29ySW5mbyhzaGFwZSwgJGR0eXBlLCB2YWx1ZXMpO1xufVxuXG5leHBvcnQgY29uc3QgZmlsbENvbmZpZzogS2VybmVsQ29uZmlnID0ge1xuICBrZXJuZWxOYW1lOiBGaWxsLFxuICBiYWNrZW5kTmFtZTogJ2NwdScsXG4gIGtlcm5lbEZ1bmM6IGZpbGwgYXMge30gYXMgS2VybmVsRnVuY1xufTtcblxuZnVuY3Rpb24gZmlsbFZhbHVlcyhcbiAgICB2YWx1ZXM6IERhdGFWYWx1ZXMsIHZhbHVlOiBzdHJpbmd8bnVtYmVyLCBkdHlwZTogRGF0YVR5cGUpOiB2b2lkIHtcbiAgaWYgKGR0eXBlID09PSAnc3RyaW5nJykge1xuICAgICh2YWx1ZXMgYXMgc3RyaW5nW10pLmZpbGwodmFsdWUgYXMgc3RyaW5nKTtcbiAgfSBlbHNlIHtcbiAgICAodmFsdWVzIGFzIFR5cGVkQXJyYXkpLmZpbGwodmFsdWUgYXMgbnVtYmVyKTtcbiAgfVxufVxuIl19","/**\n * @license\n * Copyright 2020 Google LLC. All Rights Reserved.\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n * =============================================================================\n */\nimport { FlipLeftRight, util } from '@tensorflow/tfjs-core';\nexport const flipLeftRightConfig = {\n kernelName: FlipLeftRight,\n backendName: 'cpu',\n kernelFunc: ({ inputs, attrs, backend }) => {\n const { image } = inputs;\n const cpuBackend = backend;\n const output = util.getTypedArrayFromDType(image.dtype, util.sizeFromShape(image.shape));\n const [batch, imageHeight, imageWidth, numChannels] = image.shape;\n const imageVals = cpuBackend.data.get(image.dataId).values;\n for (let batchIdx = 0; batchIdx < batch; batchIdx++) {\n const batchOffset = batchIdx * imageWidth * imageHeight * numChannels;\n for (let row = 0; row < imageHeight; row++) {\n const rowOffset = row * (imageWidth * numChannels);\n for (let col = 0; col < imageWidth; col++) {\n const colOffset = col * numChannels;\n for (let channel = 0; channel < numChannels; channel++) {\n const coordX = Math.round(imageWidth - col - 1);\n const outIdx = batchOffset + rowOffset + colOffset + channel;\n let outputValue = imageVals[outIdx];\n // If the coordinate position falls within the image boundaries...\n if (coordX >= 0 && coordX < imageWidth) {\n // set the output to the image value at the coordinate position.\n const rotatedColOffset = coordX * numChannels;\n const imageIdx = batchOffset + rowOffset + rotatedColOffset + channel;\n outputValue = imageVals[imageIdx];\n }\n output[outIdx] = outputValue;\n }\n }\n }\n }\n const dataId = cpuBackend.write(output, image.shape, image.dtype);\n return { dataId, shape: image.shape, dtype: image.dtype };\n }\n};\n//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiRmxpcExlZnRSaWdodC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uLy4uL3RmanMtYmFja2VuZC1jcHUvc3JjL2tlcm5lbHMvRmxpcExlZnRSaWdodC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQTs7Ozs7Ozs7Ozs7Ozs7O0dBZUc7QUFHSCxPQUFPLEVBQUMsYUFBYSxFQUF1QixJQUFJLEVBQUMsTUFBTSx1QkFBdUIsQ0FBQztBQUkvRSxNQUFNLENBQUMsTUFBTSxtQkFBbUIsR0FBaUI7SUFDL0MsVUFBVSxFQUFFLGFBQWE7SUFDekIsV0FBVyxFQUFFLEtBQUs7SUFDbEIsVUFBVSxFQUFFLENBQUMsRUFBQyxNQUFNLEVBQUUsS0FBSyxFQUFFLE9BQU8sRUFBQyxFQUFFLEVBQUU7UUFDdkMsTUFBTSxFQUFDLEtBQUssRUFBQyxHQUFHLE1BQTZCLENBQUM7UUFDOUMsTUFBTSxVQUFVLEdBQUcsT0FBeUIsQ0FBQztRQUU3QyxNQUFNLE1BQU0sR0FBRyxJQUFJLENBQUMsc0JBQXNCLENBQ3RDLEtBQUssQ0FBQyxLQUF3QixFQUFFLElBQUksQ0FBQyxhQUFhLENBQUMsS0FBSyxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUM7UUFDckUsTUFBTSxDQUFDLEtBQUssRUFBRSxXQUFXLEVBQUUsVUFBVSxFQUFFLFdBQVcsQ0FBQyxHQUFHLEtBQUssQ0FBQyxLQUFLLENBQUM7UUFFbEUsTUFBTSxTQUFTLEdBQUcsVUFBVSxDQUFDLElBQUksQ0FBQyxHQUFHLENBQUMsS0FBSyxDQUFDLE1BQU0sQ0FBQyxDQUFDLE1BQW9CLENBQUM7UUFFekUsS0FBSyxJQUFJLFFBQVEsR0FBRyxDQUFDLEVBQUUsUUFBUSxHQUFHLEtBQUssRUFBRSxRQUFRLEVBQUUsRUFBRTtZQUNuRCxNQUFNLFdBQVcsR0FBRyxRQUFRLEdBQUcsVUFBVSxHQUFHLFdBQVcsR0FBRyxXQUFXLENBQUM7WUFFdEUsS0FBSyxJQUFJLEdBQUcsR0FBRyxDQUFDLEVBQUUsR0FBRyxHQUFHLFdBQVcsRUFBRSxHQUFHLEVBQUUsRUFBRTtnQkFDMUMsTUFBTSxTQUFTLEdBQUcsR0FBRyxHQUFHLENBQUMsVUFBVSxHQUFHLFdBQVcsQ0FBQyxDQUFDO2dCQUVuRCxLQUFLLElBQUksR0FBRyxHQUFHLENBQUMsRUFBRSxHQUFHLEdBQUcsVUFBVSxFQUFFLEdBQUcsRUFBRSxFQUFFO29CQUN6QyxNQUFNLFNBQVMsR0FBRyxHQUFHLEdBQUcsV0FBVyxDQUFDO29CQUVwQyxLQUFLLElBQUksT0FBTyxHQUFHLENBQUMsRUFBRSxPQUFPLEdBQUcsV0FBVyxFQUFFLE9BQU8sRUFBRSxFQUFFO3dCQUN0RCxNQUFNLE1BQU0sR0FBRyxJQUFJLENBQUMsS0FBSyxDQUFDLFVBQVUsR0FBRyxHQUFHLEdBQUcsQ0FBQyxDQUFDLENBQUM7d0JBQ2hELE1BQU0sTUFBTSxHQUFHLFdBQVcsR0FBRyxTQUFTLEdBQUcsU0FBUyxHQUFHLE9BQU8sQ0FBQzt3QkFFN0QsSUFBSSxXQUFXLEdBQUcsU0FBUyxDQUFDLE1BQU0sQ0FBQyxDQUFDO3dCQUNwQyxrRUFBa0U7d0JBQ2xFLElBQUksTUFBTSxJQUFJLENBQUMsSUFBSSxNQUFNLEdBQUcsVUFBVSxFQUFFOzRCQUN0QyxnRUFBZ0U7NEJBQ2hFLE1BQU0sZ0JBQWdCLEdBQUcsTUFBTSxHQUFHLFdBQVcsQ0FBQzs0QkFDOUMsTUFBTSxRQUFRLEdBQ1YsV0FBVyxHQUFHLFNBQVMsR0FBRyxnQkFBZ0IsR0FBRyxPQUFPLENBQUM7NEJBQ3pELFdBQVcsR0FBRyxTQUFTLENBQUMsUUFBUSxDQUFDLENBQUM7eUJBQ25DO3dCQUNELE1BQU0sQ0FBQyxNQUFNLENBQUMsR0FBRyxXQUFXLENBQUM7cUJBQzlCO2lCQUNGO2FBQ0Y7U0FDRjtRQUVELE1BQU0sTUFBTSxHQUFHLFVBQVUsQ0FBQyxLQUFLLENBQUMsTUFBTSxFQUFFLEtBQUssQ0FBQyxLQUFLLEVBQUUsS0FBSyxDQUFDLEtBQUssQ0FBQyxDQUFDO1FBQ2xFLE9BQU8sRUFBQyxNQUFNLEVBQUUsS0FBSyxFQUFFLEtBQUssQ0FBQyxLQUFLLEVBQUUsS0FBSyxFQUFFLEtBQUssQ0FBQyxLQUFLLEVBQUMsQ0FBQztJQUMxRCxDQUFDO0NBQ0YsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbIi8qKlxuICogQGxpY2Vuc2VcbiAqIENvcHlyaWdodCAyMDIwIEdvb2dsZSBMTEMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuXG4gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgXCJMaWNlbnNlXCIpO1xuICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLlxuICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0XG4gKlxuICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wXG4gKlxuICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZVxuICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gXCJBUyBJU1wiIEJBU0lTLFxuICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuXG4gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kXG4gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS5cbiAqID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4gKi9cblxuaW1wb3J0IHtLZXJuZWxDb25maWcsIE51bWVyaWNEYXRhVHlwZSwgVHlwZWRBcnJheX0gZnJvbSAnQHRlbnNvcmZsb3cvdGZqcy1jb3JlJztcbmltcG9ydCB7RmxpcExlZnRSaWdodCwgRmxpcExlZnRSaWdodElucHV0cywgdXRpbH0gZnJvbSAnQHRlbnNvcmZsb3cvdGZqcy1jb3JlJztcblxuaW1wb3J0IHtNYXRoQmFja2VuZENQVX0gZnJvbSAnLi4vYmFja2VuZF9jcHUnO1xuXG5leHBvcnQgY29uc3QgZmxpcExlZnRSaWdodENvbmZpZzogS2VybmVsQ29uZmlnID0ge1xuICBrZXJuZWxOYW1lOiBGbGlwTGVmdFJpZ2h0LFxuICBiYWNrZW5kTmFtZTogJ2NwdScsXG4gIGtlcm5lbEZ1bmM6ICh7aW5wdXRzLCBhdHRycywgYmFja2VuZH0pID0+IHtcbiAgICBjb25zdCB7aW1hZ2V9ID0gaW5wdXRzIGFzIEZsaXBMZWZ0UmlnaHRJbnB1dHM7XG4gICAgY29uc3QgY3B1QmFja2VuZCA9IGJhY2tlbmQgYXMgTWF0aEJhY2tlbmRDUFU7XG5cbiAgICBjb25zdCBvdXRwdXQgPSB1dGlsLmdldFR5cGVkQXJyYXlGcm9tRFR5cGUoXG4gICAgICAgIGltYWdlLmR0eXBlIGFzIE51bWVyaWNEYXRhVHlwZSwgdXRpbC5zaXplRnJvbVNoYXBlKGltYWdlLnNoYXBlKSk7XG4gICAgY29uc3QgW2JhdGNoLCBpbWFnZUhlaWdodCwgaW1hZ2VXaWR0aCwgbnVtQ2hhbm5lbHNdID0gaW1hZ2Uuc2hhcGU7XG5cbiAgICBjb25zdCBpbWFnZVZhbHMgPSBjcHVCYWNrZW5kLmRhdGEuZ2V0KGltYWdlLmRhdGFJZCkudmFsdWVzIGFzIFR5cGVkQXJyYXk7XG5cbiAgICBmb3IgKGxldCBiYXRjaElkeCA9IDA7IGJhdGNoSWR4IDwgYmF0Y2g7IGJhdGNoSWR4KyspIHtcbiAgICAgIGNvbnN0IGJhdGNoT2Zmc2V0ID0gYmF0Y2hJZHggKiBpbWFnZVdpZHRoICogaW1hZ2VIZWlnaHQgKiBudW1DaGFubmVscztcblxuICAgICAgZm9yIChsZXQgcm93ID0gMDsgcm93IDwgaW1hZ2VIZWlnaHQ7IHJvdysrKSB7XG4gICAgICAgIGNvbnN0IHJvd09mZnNldCA9IHJvdyAqIChpbWFnZVdpZHRoICogbnVtQ2hhbm5lbHMpO1xuXG4gICAgICAgIGZvciAobGV0IGNvbCA9IDA7IGNvbCA8IGltYWdlV2lkdGg7IGNvbCsrKSB7XG4gICAgICAgICAgY29uc3QgY29sT2Zmc2V0ID0gY29sICogbnVtQ2hhbm5lbHM7XG5cbiAgICAgICAgICBmb3IgKGxldCBjaGFubmVsID0gMDsgY2hhbm5lbCA8IG51bUNoYW5uZWxzOyBjaGFubmVsKyspIHtcbiAgICAgICAgICAgIGNvbnN0IGNvb3JkWCA9IE1hdGgucm91bmQoaW1hZ2VXaWR0aCAtIGNvbCAtIDEpO1xuICAgICAgICAgICAgY29uc3Qgb3V0SWR4ID0gYmF0Y2hPZmZzZXQgKyByb3dPZmZzZXQgKyBjb2xPZmZzZXQgKyBjaGFubmVsO1xuXG4gICAgICAgICAgICBsZXQgb3V0cHV0VmFsdWUgPSBpbWFnZVZhbHNbb3V0SWR4XTtcbiAgICAgICAgICAgIC8vIElmIHRoZSBjb29yZGluYXRlIHBvc2l0aW9uIGZhbGxzIHdpdGhpbiB0aGUgaW1hZ2UgYm91bmRhcmllcy4uLlxuICAgICAgICAgICAgaWYgKGNvb3JkWCA+PSAwICYmIGNvb3JkWCA8IGltYWdlV2lkdGgpIHtcbiAgICAgICAgICAgICAgLy8gc2V0IHRoZSBvdXRwdXQgdG8gdGhlIGltYWdlIHZhbHVlIGF0IHRoZSBjb29yZGluYXRlIHBvc2l0aW9uLlxuICAgICAgICAgICAgICBjb25zdCByb3RhdGVkQ29sT2Zmc2V0ID0gY29vcmRYICogbnVtQ2hhbm5lbHM7XG4gICAgICAgICAgICAgIGNvbnN0IGltYWdlSWR4ID1cbiAgICAgICAgICAgICAgICAgIGJhdGNoT2Zmc2V0ICsgcm93T2Zmc2V0ICsgcm90YXRlZENvbE9mZnNldCArIGNoYW5uZWw7XG4gICAgICAgICAgICAgIG91dHB1dFZhbHVlID0gaW1hZ2VWYWxzW2ltYWdlSWR4XTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIG91dHB1dFtvdXRJZHhdID0gb3V0cHV0VmFsdWU7XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICB9XG4gICAgfVxuXG4gICAgY29uc3QgZGF0YUlkID0gY3B1QmFja2VuZC53cml0ZShvdXRwdXQsIGltYWdlLnNoYXBlLCBpbWFnZS5kdHlwZSk7XG4gICAgcmV0dXJuIHtkYXRhSWQsIHNoYXBlOiBpbWFnZS5zaGFwZSwgZHR5cGU6IGltYWdlLmR0eXBlfTtcbiAgfVxufTtcbiJdfQ==","/**\n * @license\n * Copyright 2020 Google LLC. All Rights Reserved.\n * Licensed under the Apache License, Version 2.0 (the License);\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an AS IS BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n * =============================================================================\n */\nimport { Floor } from '@tensorflow/tfjs-core';\nimport { createSimpleUnaryImpl } from '../utils/unary_impl';\nimport { unaryKernelFuncFromImpl } from '../utils/unary_utils';\nexport const floorImpl = createSimpleUnaryImpl((xi) => Math.floor(xi));\nexport const floor = unaryKernelFuncFromImpl(Floor, floorImpl);\nexport const floorConfig = {\n kernelName: Floor,\n backendName: 'cpu',\n kernelFunc: floor,\n};\n//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiRmxvb3IuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi8uLi90ZmpzLWJhY2tlbmQtY3B1L3NyYy9rZXJuZWxzL0Zsb29yLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBOzs7Ozs7Ozs7Ozs7Ozs7R0FlRztBQUVILE9BQU8sRUFBQyxLQUFLLEVBQWUsTUFBTSx1QkFBdUIsQ0FBQztBQUUxRCxPQUFPLEVBQUMscUJBQXFCLEVBQUMsTUFBTSxxQkFBcUIsQ0FBQztBQUMxRCxPQUFPLEVBQUMsdUJBQXVCLEVBQUMsTUFBTSxzQkFBc0IsQ0FBQztBQUU3RCxNQUFNLENBQUMsTUFBTSxTQUFTLEdBQUcscUJBQXFCLENBQUMsQ0FBQyxFQUFFLEVBQUUsRUFBRSxDQUFDLElBQUksQ0FBQyxLQUFLLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQztBQUN2RSxNQUFNLENBQUMsTUFBTSxLQUFLLEdBQUcsdUJBQXVCLENBQUMsS0FBSyxFQUFFLFNBQVMsQ0FBQyxDQUFDO0FBRS9ELE1BQU0sQ0FBQyxNQUFNLFdBQVcsR0FBaUI7SUFDdkMsVUFBVSxFQUFFLEtBQUs7SUFDakIsV0FBVyxFQUFFLEtBQUs7SUFDbEIsVUFBVSxFQUFFLEtBQUs7Q0FDbEIsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbIi8qKlxuICogQGxpY2Vuc2VcbiAqIENvcHlyaWdodCAyMDIwIEdvb2dsZSBMTEMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuXG4gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgTGljZW5zZSk7XG4gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuXG4gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXRcbiAqXG4gKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjBcbiAqXG4gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlXG4gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiBBUyBJUyBCQVNJUyxcbiAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLlxuICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZFxuICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuXG4gKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuICovXG5cbmltcG9ydCB7Rmxvb3IsIEtlcm5lbENvbmZpZ30gZnJvbSAnQHRlbnNvcmZsb3cvdGZqcy1jb3JlJztcblxuaW1wb3J0IHtjcmVhdGVTaW1wbGVVbmFyeUltcGx9IGZyb20gJy4uL3V0aWxzL3VuYXJ5X2ltcGwnO1xuaW1wb3J0IHt1bmFyeUtlcm5lbEZ1bmNGcm9tSW1wbH0gZnJvbSAnLi4vdXRpbHMvdW5hcnlfdXRpbHMnO1xuXG5leHBvcnQgY29uc3QgZmxvb3JJbXBsID0gY3JlYXRlU2ltcGxlVW5hcnlJbXBsKCh4aSkgPT4gTWF0aC5mbG9vcih4aSkpO1xuZXhwb3J0IGNvbnN0IGZsb29yID0gdW5hcnlLZXJuZWxGdW5jRnJvbUltcGwoRmxvb3IsIGZsb29ySW1wbCk7XG5cbmV4cG9ydCBjb25zdCBmbG9vckNvbmZpZzogS2VybmVsQ29uZmlnID0ge1xuICBrZXJuZWxOYW1lOiBGbG9vcixcbiAgYmFja2VuZE5hbWU6ICdjcHUnLFxuICBrZXJuZWxGdW5jOiBmbG9vcixcbn07XG4iXX0=","/**\n * @license\n * Copyright 2020 Google LLC. All Rights Reserved.\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n * =============================================================================\n */\nimport { FloorDiv } from '@tensorflow/tfjs-core';\nimport { createSimpleBinaryKernelImpl } from '../utils/binary_impl';\nimport { binaryKernelFunc } from '../utils/binary_utils';\nexport const floorDivImpl = createSimpleBinaryKernelImpl((a, b) => Math.floor(a / b));\nexport const floorDiv = binaryKernelFunc(FloorDiv, floorDivImpl, null /* complexImpl */, 'int32');\nexport const floorDivConfig = {\n kernelName: FloorDiv,\n backendName: 'cpu',\n kernelFunc: floorDiv\n};\n//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiRmxvb3JEaXYuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi8uLi90ZmpzLWJhY2tlbmQtY3B1L3NyYy9rZXJuZWxzL0Zsb29yRGl2LnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBOzs7Ozs7Ozs7Ozs7Ozs7R0FlRztBQUVILE9BQU8sRUFBQyxRQUFRLEVBQWUsTUFBTSx1QkFBdUIsQ0FBQztBQUU3RCxPQUFPLEVBQUMsNEJBQTRCLEVBQUMsTUFBTSxzQkFBc0IsQ0FBQztBQUNsRSxPQUFPLEVBQUMsZ0JBQWdCLEVBQUMsTUFBTSx1QkFBdUIsQ0FBQztBQUV2RCxNQUFNLENBQUMsTUFBTSxZQUFZLEdBQ3JCLDRCQUE0QixDQUFDLENBQUMsQ0FBUyxFQUFFLENBQVMsRUFBRSxFQUFFLENBQUMsSUFBSSxDQUFDLEtBQUssQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQztBQUM5RSxNQUFNLENBQUMsTUFBTSxRQUFRLEdBQ2pCLGdCQUFnQixDQUFDLFFBQVEsRUFBRSxZQUFZLEVBQUUsSUFBSSxDQUFDLGlCQUFpQixFQUFFLE9BQU8sQ0FBQyxDQUFDO0FBRTlFLE1BQU0sQ0FBQyxNQUFNLGNBQWMsR0FBaUI7SUFDMUMsVUFBVSxFQUFFLFFBQVE7SUFDcEIsV0FBVyxFQUFFLEtBQUs7SUFDbEIsVUFBVSxFQUFFLFFBQVE7Q0FDckIsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbIi8qKlxuICogQGxpY2Vuc2VcbiAqIENvcHlyaWdodCAyMDIwIEdvb2dsZSBMTEMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuXG4gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgXCJMaWNlbnNlXCIpO1xuICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLlxuICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0XG4gKlxuICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wXG4gKlxuICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZVxuICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gXCJBUyBJU1wiIEJBU0lTLFxuICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuXG4gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kXG4gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS5cbiAqID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4gKi9cblxuaW1wb3J0IHtGbG9vckRpdiwgS2VybmVsQ29uZmlnfSBmcm9tICdAdGVuc29yZmxvdy90ZmpzLWNvcmUnO1xuXG5pbXBvcnQge2NyZWF0ZVNpbXBsZUJpbmFyeUtlcm5lbEltcGx9IGZyb20gJy4uL3V0aWxzL2JpbmFyeV9pbXBsJztcbmltcG9ydCB7YmluYXJ5S2VybmVsRnVuY30gZnJvbSAnLi4vdXRpbHMvYmluYXJ5X3V0aWxzJztcblxuZXhwb3J0IGNvbnN0IGZsb29yRGl2SW1wbCA9XG4gICAgY3JlYXRlU2ltcGxlQmluYXJ5S2VybmVsSW1wbCgoYTogbnVtYmVyLCBiOiBudW1iZXIpID0+IE1hdGguZmxvb3IoYSAvIGIpKTtcbmV4cG9ydCBjb25zdCBmbG9vckRpdiA9XG4gICAgYmluYXJ5S2VybmVsRnVuYyhGbG9vckRpdiwgZmxvb3JEaXZJbXBsLCBudWxsIC8qIGNvbXBsZXhJbXBsICovLCAnaW50MzInKTtcblxuZXhwb3J0IGNvbnN0IGZsb29yRGl2Q29uZmlnOiBLZXJuZWxDb25maWcgPSB7XG4gIGtlcm5lbE5hbWU6IEZsb29yRGl2LFxuICBiYWNrZW5kTmFtZTogJ2NwdScsXG4gIGtlcm5lbEZ1bmM6IGZsb29yRGl2XG59O1xuIl19","/**\n * @license\n * Copyright 2020 Google LLC. All Rights Reserved.\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n * =============================================================================\n */\nimport { FusedConv2D } from '@tensorflow/tfjs-core';\nimport { applyActivation } from '../utils/fused_utils';\nimport { add } from './Add';\nimport { conv2D } from './Conv2D';\nimport { reshape } from './Reshape';\nexport function fusedConv2D(args) {\n const { inputs, backend, attrs } = args;\n const { x, filter, bias, preluActivationWeights } = inputs;\n const { strides, pad, dataFormat, dilations, dimRoundingMode, activation, leakyreluAlpha } = attrs;\n let result = conv2D({\n inputs: { x, filter },\n backend,\n attrs: { strides, pad, dataFormat, dilations, dimRoundingMode }\n });\n if (bias) {\n const resultOld = result;\n // For NCHW format, if bias is a 1-D tensor, it is supposed to be aligned\n // to the channel of the conv2d's result; if the bias is a scalar, the\n // bias_add is computed as if the bias was broadcasted to the shape of the\n // conv2d's result.\n if (dataFormat === 'NCHW' && bias.shape.length === 1 &&\n bias.shape[0] !== 1) {\n const reshapedBias = reshape({ inputs: { x: bias }, backend, attrs: { shape: [bias.shape[0], 1, 1] } });\n result =\n add({ inputs: { a: result, b: reshapedBias }, backend });\n backend.disposeIntermediateTensorInfo(reshapedBias);\n }\n else {\n // This condition handles NHWC and NCHW (scalar case). The only other case\n // for NCHW (1D case) is handled above.\n result = add({ inputs: { a: result, b: bias }, backend });\n }\n backend.disposeIntermediateTensorInfo(resultOld);\n }\n if (activation) {\n const resultOld = result;\n // For NCHW format, if PReLu activation weights is a 1-D tensor, it is\n // supposed to be aligned with the channel of the conv2d's result. For other\n // cases, whether NCHW or NHWC data format, the conv2d result is\n // already aligned with the activation weights.\n if (dataFormat === 'NCHW' && activation === 'prelu' &&\n preluActivationWeights.shape.length === 1 &&\n preluActivationWeights.shape[0] !== 1) {\n const reshapedAlpha = reshape({\n inputs: { x: preluActivationWeights },\n backend,\n attrs: { shape: [preluActivationWeights.shape[0], 1, 1] }\n });\n result = applyActivation(backend, result, activation, reshapedAlpha, leakyreluAlpha);\n backend.disposeIntermediateTensorInfo(reshapedAlpha);\n }\n else {\n result = applyActivation(backend, result, activation, preluActivationWeights, leakyreluAlpha);\n }\n backend.disposeIntermediateTensorInfo(resultOld);\n }\n return result;\n}\nexport const fusedConv2DConfig = {\n kernelName: FusedConv2D,\n backendName: 'cpu',\n kernelFunc: fusedConv2D\n};\n//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiRnVzZWRDb252MkQuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi8uLi90ZmpzLWJhY2tlbmQtY3B1L3NyYy9rZXJuZWxzL0Z1c2VkQ29udjJELnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBOzs7Ozs7Ozs7Ozs7Ozs7R0FlRztBQUVILE9BQU8sRUFBQyxXQUFXLEVBQTRFLE1BQU0sdUJBQXVCLENBQUM7QUFHN0gsT0FBTyxFQUFDLGVBQWUsRUFBQyxNQUFNLHNCQUFzQixDQUFDO0FBQ3JELE9BQU8sRUFBQyxHQUFHLEVBQUMsTUFBTSxPQUFPLENBQUM7QUFDMUIsT0FBTyxFQUFDLE1BQU0sRUFBQyxNQUFNLFVBQVUsQ0FBQztBQUNoQyxPQUFPLEVBQUMsT0FBTyxFQUFDLE1BQU0sV0FBVyxDQUFDO0FBRWxDLE1BQU0sVUFBVSxXQUFXLENBQUMsSUFJM0I7SUFDQyxNQUFNLEVBQUMsTUFBTSxFQUFFLE9BQU8sRUFBRSxLQUFLLEVBQUMsR0FBRyxJQUFJLENBQUM7SUFDdEMsTUFBTSxFQUFDLENBQUMsRUFBRSxNQUFNLEVBQUUsSUFBSSxFQUFFLHNCQUFzQixFQUFDLEdBQUcsTUFBTSxDQUFDO0lBQ3pELE1BQU0sRUFDSixPQUFPLEVBQ1AsR0FBRyxFQUNILFVBQVUsRUFDVixTQUFTLEVBQ1QsZUFBZSxFQUNmLFVBQVUsRUFDVixjQUFjLEVBQ2YsR0FBRyxLQUFLLENBQUM7SUFFVixJQUFJLE1BQU0sR0FBRyxNQUFNLENBQUM7UUFDbEIsTUFBTSxFQUFFLEVBQUMsQ0FBQyxFQUFFLE1BQU0sRUFBQztRQUNuQixPQUFPO1FBQ1AsS0FBSyxFQUFFLEVBQUMsT0FBTyxFQUFFLEdBQUcsRUFBRSxVQUFVLEVBQUUsU0FBUyxFQUFFLGVBQWUsRUFBQztLQUM5RCxDQUFDLENBQUM7SUFFSCxJQUFJLElBQUksRUFBRTtRQUNSLE1BQU0sU0FBUyxHQUFHLE1BQU0sQ0FBQztRQUN6Qix5RUFBeUU7UUFDekUsc0VBQXNFO1FBQ3RFLDBFQUEwRTtRQUMxRSxtQkFBbUI7UUFDbkIsSUFBSSxVQUFVLEtBQUssTUFBTSxJQUFJLElBQUksQ0FBQyxLQUFLLENBQUMsTUFBTSxLQUFLLENBQUM7WUFDaEQsSUFBSSxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUMsS0FBSyxDQUFDLEVBQUU7WUFDdkIsTUFBTSxZQUFZLEdBQUcsT0FBTyxDQUN4QixFQUFDLE1BQU0sRUFBRSxFQUFDLENBQUMsRUFBRSxJQUFJLEVBQUMsRUFBRSxPQUFPLEVBQUUsS0FBSyxFQUFFLEVBQUMsS0FBSyxFQUFFLENBQUMsSUFBSSxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxDQUFDLEVBQUMsRUFBQyxDQUFDLENBQUM7WUFDekUsTUFBTTtnQkFDRixHQUFHLENBQUMsRUFBQyxNQUFNLEVBQUUsRUFBQyxDQUFDLEVBQUUsTUFBTSxFQUFFLENBQUMsRUFBRSxZQUFZLEVBQUMsRUFBRSxPQUFPLEVBQUMsQ0FBZSxDQUFDO1lBQ3ZFLE9BQU8sQ0FBQyw2QkFBNkIsQ0FBQyxZQUFZLENBQUMsQ0FBQztTQUNyRDthQUFNO1lBQ0wsMEVBQTBFO1lBQzFFLHVDQUF1QztZQUN2QyxNQUFNLEdBQUcsR0FBRyxDQUFDLEVBQUMsTUFBTSxFQUFFLEVBQUMsQ0FBQyxFQUFFLE1BQU0sRUFBRSxDQUFDLEVBQUUsSUFBSSxFQUFDLEVBQUUsT0FBTyxFQUFDLENBQWUsQ0FBQztTQUNyRTtRQUNELE9BQU8sQ0FBQyw2QkFBNkIsQ0FBQyxTQUFTLENBQUMsQ0FBQztLQUNsRDtJQUVELElBQUksVUFBVSxFQUFFO1FBQ2QsTUFBTSxTQUFTLEdBQUcsTUFBTSxDQUFDO1FBQ3pCLHNFQUFzRTtRQUN0RSw0RUFBNEU7UUFDNUUsZ0VBQWdFO1FBQ2hFLCtDQUErQztRQUMvQyxJQUFJLFVBQVUsS0FBSyxNQUFNLElBQUksVUFBVSxLQUFLLE9BQU87WUFDL0Msc0JBQXNCLENBQUMsS0FBSyxDQUFDLE1BQU0sS0FBSyxDQUFDO1lBQ3pDLHNCQUFzQixDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUMsS0FBSyxDQUFDLEVBQUU7WUFDekMsTUFBTSxhQUFhLEdBQUcsT0FBTyxDQUFDO2dCQUM1QixNQUFNLEVBQUUsRUFBQyxDQUFDLEVBQUUsc0JBQXNCLEVBQUM7Z0JBQ25DLE9BQU87Z0JBQ1AsS0FBSyxFQUFFLEVBQUMsS0FBSyxFQUFFLENBQUMsc0JBQXNCLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLENBQUMsRUFBQzthQUN4RCxDQUFDLENBQUM7WUFDSCxNQUFNLEdBQUcsZUFBZSxDQUNwQixPQUFPLEVBQUUsTUFBTSxFQUFFLFVBQVUsRUFBRSxhQUFhLEVBQUUsY0FBYyxDQUFDLENBQUM7WUFDaEUsT0FBTyxDQUFDLDZCQUE2QixDQUFDLGFBQWEsQ0FBQyxDQUFDO1NBQ3REO2FBQU07WUFDTCxNQUFNLEdBQUcsZUFBZSxDQUNwQixPQUFPLEVBQUUsTUFBTSxFQUFFLFVBQVUsRUFBRSxzQkFBc0IsRUFBRSxjQUFjLENBQUMsQ0FBQztTQUMxRTtRQUNELE9BQU8sQ0FBQyw2QkFBNkIsQ0FBQyxTQUFTLENBQUMsQ0FBQztLQUNsRDtJQUVELE9BQU8sTUFBTSxDQUFDO0FBQ2hCLENBQUM7QUFFRCxNQUFNLENBQUMsTUFBTSxpQkFBaUIsR0FBaUI7SUFDN0MsVUFBVSxFQUFFLFdBQVc7SUFDdkIsV0FBVyxFQUFFLEtBQUs7SUFDbEIsVUFBVSxFQUFFLFdBQStCO0NBQzVDLENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyIvKipcbiAqIEBsaWNlbnNlXG4gKiBDb3B5cmlnaHQgMjAyMCBHb29nbGUgTExDLiBBbGwgUmlnaHRzIFJlc2VydmVkLlxuICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlIFwiTGljZW5zZVwiKTtcbiAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS5cbiAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdFxuICpcbiAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMFxuICpcbiAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmVcbiAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuIFwiQVMgSVNcIiBCQVNJUyxcbiAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLlxuICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZFxuICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuXG4gKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuICovXG5cbmltcG9ydCB7RnVzZWRDb252MkQsIEZ1c2VkQ29udjJEQXR0cnMsIEZ1c2VkQ29udjJESW5wdXRzLCBLZXJuZWxDb25maWcsIEtlcm5lbEZ1bmMsIFRlbnNvckluZm99IGZyb20gJ0B0ZW5zb3JmbG93L3RmanMtY29yZSc7XG5cbmltcG9ydCB7TWF0aEJhY2tlbmRDUFV9IGZyb20gJy4uL2JhY2tlbmRfY3B1JztcbmltcG9ydCB7YXBwbHlBY3RpdmF0aW9ufSBmcm9tICcuLi91dGlscy9mdXNlZF91dGlscyc7XG5pbXBvcnQge2FkZH0gZnJvbSAnLi9BZGQnO1xuaW1wb3J0IHtjb252MkR9IGZyb20gJy4vQ29udjJEJztcbmltcG9ydCB7cmVzaGFwZX0gZnJvbSAnLi9SZXNoYXBlJztcblxuZXhwb3J0IGZ1bmN0aW9uIGZ1c2VkQ29udjJEKGFyZ3M6IHtcbiAgaW5wdXRzOiBGdXNlZENvbnYyRElucHV0cyxcbiAgYmFja2VuZDogTWF0aEJhY2tlbmRDUFUsXG4gIGF0dHJzOiBGdXNlZENvbnYyREF0dHJzXG59KTogVGVuc29ySW5mbyB7XG4gIGNvbnN0IHtpbnB1dHMsIGJhY2tlbmQsIGF0dHJzfSA9IGFyZ3M7XG4gIGNvbnN0IHt4LCBmaWx0ZXIsIGJpYXMsIHByZWx1QWN0aXZhdGlvbldlaWdodHN9ID0gaW5wdXRzO1xuICBjb25zdCB7XG4gICAgc3RyaWRlcyxcbiAgICBwYWQsXG4gICAgZGF0YUZvcm1hdCxcbiAgICBkaWxhdGlvbnMsXG4gICAgZGltUm91bmRpbmdNb2RlLFxuICAgIGFjdGl2YXRpb24sXG4gICAgbGVha3lyZWx1QWxwaGFcbiAgfSA9IGF0dHJzO1xuXG4gIGxldCByZXN1bHQgPSBjb252MkQoe1xuICAgIGlucHV0czoge3gsIGZpbHRlcn0sXG4gICAgYmFja2VuZCxcbiAgICBhdHRyczoge3N0cmlkZXMsIHBhZCwgZGF0YUZvcm1hdCwgZGlsYXRpb25zLCBkaW1Sb3VuZGluZ01vZGV9XG4gIH0pO1xuXG4gIGlmIChiaWFzKSB7XG4gICAgY29uc3QgcmVzdWx0T2xkID0gcmVzdWx0O1xuICAgIC8vIEZvciBOQ0hXIGZvcm1hdCwgaWYgYmlhcyBpcyBhIDEtRCB0ZW5zb3IsIGl0IGlzIHN1cHBvc2VkIHRvIGJlIGFsaWduZWRcbiAgICAvLyB0byB0aGUgY2hhbm5lbCBvZiB0aGUgY29udjJkJ3MgcmVzdWx0OyBpZiB0aGUgYmlhcyBpcyBhIHNjYWxhciwgdGhlXG4gICAgLy8gYmlhc19hZGQgaXMgY29tcHV0ZWQgYXMgaWYgdGhlIGJpYXMgd2FzIGJyb2FkY2FzdGVkIHRvIHRoZSBzaGFwZSBvZiB0aGVcbiAgICAvLyBjb252MmQncyByZXN1bHQuXG4gICAgaWYgKGRhdGFGb3JtYXQgPT09ICdOQ0hXJyAmJiBiaWFzLnNoYXBlLmxlbmd0aCA9PT0gMSAmJlxuICAgICAgICBiaWFzLnNoYXBlWzBdICE9PSAxKSB7XG4gICAgICBjb25zdCByZXNoYXBlZEJpYXMgPSByZXNoYXBlKFxuICAgICAgICAgIHtpbnB1dHM6IHt4OiBiaWFzfSwgYmFja2VuZCwgYXR0cnM6IHtzaGFwZTogW2JpYXMuc2hhcGVbMF0sIDEsIDFdfX0pO1xuICAgICAgcmVzdWx0ID1cbiAgICAgICAgICBhZGQoe2lucHV0czoge2E6IHJlc3VsdCwgYjogcmVzaGFwZWRCaWFzfSwgYmFja2VuZH0pIGFzIFRlbnNvckluZm87XG4gICAgICBiYWNrZW5kLmRpc3Bvc2VJbnRlcm1lZGlhdGVUZW5zb3JJbmZvKHJlc2hhcGVkQmlhcyk7XG4gICAgfSBlbHNlIHtcbiAgICAgIC8vIFRoaXMgY29uZGl0aW9uIGhhbmRsZXMgTkhXQyBhbmQgTkNIVyAoc2NhbGFyIGNhc2UpLiBUaGUgb25seSBvdGhlciBjYXNlXG4gICAgICAvLyBmb3IgTkNIVyAoMUQgY2FzZSkgaXMgaGFuZGxlZCBhYm92ZS5cbiAgICAgIHJlc3VsdCA9IGFkZCh7aW5wdXRzOiB7YTogcmVzdWx0LCBiOiBiaWFzfSwgYmFja2VuZH0pIGFzIFRlbnNvckluZm87XG4gICAgfVxuICAgIGJhY2tlbmQuZGlzcG9zZUludGVybWVkaWF0ZVRlbnNvckluZm8ocmVzdWx0T2xkKTtcbiAgfVxuXG4gIGlmIChhY3RpdmF0aW9uKSB7XG4gICAgY29uc3QgcmVzdWx0T2xkID0gcmVzdWx0O1xuICAgIC8vIEZvciBOQ0hXIGZvcm1hdCwgaWYgUFJlTHUgYWN0aXZhdGlvbiB3ZWlnaHRzIGlzIGEgMS1EIHRlbnNvciwgaXQgaXNcbiAgICAvLyBzdXBwb3NlZCB0byBiZSBhbGlnbmVkIHdpdGggdGhlIGNoYW5uZWwgb2YgdGhlIGNvbnYyZCdzIHJlc3VsdC4gRm9yIG90aGVyXG4gICAgLy8gY2FzZXMsIHdoZXRoZXIgTkNIVyBvciBOSFdDIGRhdGEgZm9ybWF0LCB0aGUgY29udjJkIHJlc3VsdCBpc1xuICAgIC8vIGFscmVhZHkgYWxpZ25lZCB3aXRoIHRoZSBhY3RpdmF0aW9uIHdlaWdodHMuXG4gICAgaWYgKGRhdGFGb3JtYXQgPT09ICdOQ0hXJyAmJiBhY3RpdmF0aW9uID09PSAncHJlbHUnICYmXG4gICAgICAgIHByZWx1QWN0aXZhdGlvbldlaWdodHMuc2hhcGUubGVuZ3RoID09PSAxICYmXG4gICAgICAgIHByZWx1QWN0aXZhdGlvbldlaWdodHMuc2hhcGVbMF0gIT09IDEpIHtcbiAgICAgIGNvbnN0IHJlc2hhcGVkQWxwaGEgPSByZXNoYXBlKHtcbiAgICAgICAgaW5wdXRzOiB7eDogcHJlbHVBY3RpdmF0aW9uV2VpZ2h0c30sXG4gICAgICAgIGJhY2tlbmQsXG4gICAgICAgIGF0dHJzOiB7c2hhcGU6IFtwcmVsdUFjdGl2YXRpb25XZWlnaHRzLnNoYXBlWzBdLCAxLCAxXX1cbiAgICAgIH0pO1xuICAgICAgcmVzdWx0ID0gYXBwbHlBY3RpdmF0aW9uKFxuICAgICAgICAgIGJhY2tlbmQsIHJlc3VsdCwgYWN0aXZhdGlvbiwgcmVzaGFwZWRBbHBoYSwgbGVha3lyZWx1QWxwaGEpO1xuICAgICAgYmFja2VuZC5kaXNwb3NlSW50ZXJtZWRpYXRlVGVuc29ySW5mbyhyZXNoYXBlZEFscGhhKTtcbiAgICB9IGVsc2Uge1xuICAgICAgcmVzdWx0ID0gYXBwbHlBY3RpdmF0aW9uKFxuICAgICAgICAgIGJhY2tlbmQsIHJlc3VsdCwgYWN0aXZhdGlvbiwgcHJlbHVBY3RpdmF0aW9uV2VpZ2h0cywgbGVha3lyZWx1QWxwaGEpO1xuICAgIH1cbiAgICBiYWNrZW5kLmRpc3Bvc2VJbnRlcm1lZGlhdGVUZW5zb3JJbmZvKHJlc3VsdE9sZCk7XG4gIH1cblxuICByZXR1cm4gcmVzdWx0O1xufVxuXG5leHBvcnQgY29uc3QgZnVzZWRDb252MkRDb25maWc6IEtlcm5lbENvbmZpZyA9IHtcbiAga2VybmVsTmFtZTogRnVzZWRDb252MkQsXG4gIGJhY2tlbmROYW1lOiAnY3B1JyxcbiAga2VybmVsRnVuYzogZnVzZWRDb252MkQgYXMge30gYXMgS2VybmVsRnVuY1xufTtcbiJdfQ==","/**\n * @license\n * Copyright 2020 Google LLC. All Rights Reserved.\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n * =============================================================================\n */\nimport { FusedDepthwiseConv2D } from '@tensorflow/tfjs-core';\nimport { applyActivation } from '../utils/fused_utils';\nimport { add } from './Add';\nimport { depthwiseConv2dNative } from './DepthwiseConv2dNative';\nexport function fusedDepthwiseConv2D(args) {\n const { inputs, backend, attrs } = args;\n const { x, filter, bias, preluActivationWeights } = inputs;\n const { strides, pad, dataFormat, dilations, dimRoundingMode, activation, leakyreluAlpha } = attrs;\n let result = depthwiseConv2dNative({\n inputs: { x, filter },\n backend,\n attrs: { strides, pad, dataFormat, dilations, dimRoundingMode }\n });\n if (bias) {\n const oldResult = result;\n result = add({ inputs: { a: result, b: bias }, backend });\n backend.disposeIntermediateTensorInfo(oldResult);\n }\n if (activation) {\n const oldResult = result;\n result = applyActivation(backend, result, activation, preluActivationWeights, leakyreluAlpha);\n backend.disposeIntermediateTensorInfo(oldResult);\n }\n return result;\n}\nexport const fusedDepthwiseConv2DConfig = {\n kernelName: FusedDepthwiseConv2D,\n backendName: 'cpu',\n kernelFunc: fusedDepthwiseConv2D\n};\n//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiRnVzZWREZXB0aHdpc2VDb252MkQuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi8uLi90ZmpzLWJhY2tlbmQtY3B1L3NyYy9rZXJuZWxzL0Z1c2VkRGVwdGh3aXNlQ29udjJELnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBOzs7Ozs7Ozs7Ozs7Ozs7R0FlRztBQUVILE9BQU8sRUFBQyxvQkFBb0IsRUFBOEYsTUFBTSx1QkFBdUIsQ0FBQztBQUd4SixPQUFPLEVBQUMsZUFBZSxFQUFDLE1BQU0sc0JBQXNCLENBQUM7QUFDckQsT0FBTyxFQUFDLEdBQUcsRUFBQyxNQUFNLE9BQU8sQ0FBQztBQUMxQixPQUFPLEVBQUMscUJBQXFCLEVBQUMsTUFBTSx5QkFBeUIsQ0FBQztBQUU5RCxNQUFNLFVBQVUsb0JBQW9CLENBQUMsSUFJcEM7SUFDQyxNQUFNLEVBQUMsTUFBTSxFQUFFLE9BQU8sRUFBRSxLQUFLLEVBQUMsR0FBRyxJQUFJLENBQUM7SUFDdEMsTUFBTSxFQUFDLENBQUMsRUFBRSxNQUFNLEVBQUUsSUFBSSxFQUFFLHNCQUFzQixFQUFDLEdBQUcsTUFBTSxDQUFDO0lBQ3pELE1BQU0sRUFDSixPQUFPLEVBQ1AsR0FBRyxFQUNILFVBQVUsRUFDVixTQUFTLEVBQ1QsZUFBZSxFQUNmLFVBQVUsRUFDVixjQUFjLEVBQ2YsR0FBRyxLQUFLLENBQUM7SUFFVixJQUFJLE1BQU0sR0FBRyxxQkFBcUIsQ0FBQztRQUNqQyxNQUFNLEVBQUUsRUFBQyxDQUFDLEVBQUUsTUFBTSxFQUFDO1FBQ25CLE9BQU87UUFDUCxLQUFLLEVBQUUsRUFBQyxPQUFPLEVBQUUsR0FBRyxFQUFFLFVBQVUsRUFBRSxTQUFTLEVBQUUsZUFBZSxFQUFDO0tBQzlELENBQUMsQ0FBQztJQUVILElBQUksSUFBSSxFQUFFO1FBQ1IsTUFBTSxTQUFTLEdBQUcsTUFBTSxDQUFDO1FBQ3pCLE1BQU0sR0FBRyxHQUFHLENBQUMsRUFBQyxNQUFNLEVBQUUsRUFBQyxDQUFDLEVBQUUsTUFBTSxFQUFFLENBQUMsRUFBRSxJQUFJLEVBQUMsRUFBRSxPQUFPLEVBQUMsQ0FBZSxDQUFDO1FBQ3BFLE9BQU8sQ0FBQyw2QkFBNkIsQ0FBQyxTQUFTLENBQUMsQ0FBQztLQUNsRDtJQUNELElBQUksVUFBVSxFQUFFO1FBQ2QsTUFBTSxTQUFTLEdBQUcsTUFBTSxDQUFDO1FBQ3pCLE1BQU0sR0FBRyxlQUFlLENBQ3BCLE9BQU8sRUFBRSxNQUFNLEVBQUUsVUFBVSxFQUFFLHNCQUFzQixFQUFFLGNBQWMsQ0FBQyxDQUFDO1FBQ3pFLE9BQU8sQ0FBQyw2QkFBNkIsQ0FBQyxTQUFTLENBQUMsQ0FBQztLQUNsRDtJQUVELE9BQU8sTUFBTSxDQUFDO0FBQ2hCLENBQUM7QUFFRCxNQUFNLENBQUMsTUFBTSwwQkFBMEIsR0FBaUI7SUFDdEQsVUFBVSxFQUFFLG9CQUFvQjtJQUNoQyxXQUFXLEVBQUUsS0FBSztJQUNsQixVQUFVLEVBQUUsb0JBQXdDO0NBQ3JELENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyIvKipcbiAqIEBsaWNlbnNlXG4gKiBDb3B5cmlnaHQgMjAyMCBHb29nbGUgTExDLiBBbGwgUmlnaHRzIFJlc2VydmVkLlxuICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlIFwiTGljZW5zZVwiKTtcbiAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS5cbiAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdFxuICpcbiAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMFxuICpcbiAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmVcbiAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuIFwiQVMgSVNcIiBCQVNJUyxcbiAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLlxuICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZFxuICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuXG4gKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuICovXG5cbmltcG9ydCB7RnVzZWREZXB0aHdpc2VDb252MkQsIEZ1c2VkRGVwdGh3aXNlQ29udjJEQXR0cnMsIEZ1c2VkRGVwdGh3aXNlQ29udjJESW5wdXRzLCBLZXJuZWxDb25maWcsIEtlcm5lbEZ1bmMsIFRlbnNvckluZm99IGZyb20gJ0B0ZW5zb3JmbG93L3RmanMtY29yZSc7XG5cbmltcG9ydCB7TWF0aEJhY2tlbmRDUFV9IGZyb20gJy4uL2JhY2tlbmRfY3B1JztcbmltcG9ydCB7YXBwbHlBY3RpdmF0aW9ufSBmcm9tICcuLi91dGlscy9mdXNlZF91dGlscyc7XG5pbXBvcnQge2FkZH0gZnJvbSAnLi9BZGQnO1xuaW1wb3J0IHtkZXB0aHdpc2VDb252MmROYXRpdmV9IGZyb20gJy4vRGVwdGh3aXNlQ29udjJkTmF0aXZlJztcblxuZXhwb3J0IGZ1bmN0aW9uIGZ1c2VkRGVwdGh3aXNlQ29udjJEKGFyZ3M6IHtcbiAgaW5wdXRzOiBGdXNlZERlcHRod2lzZUNvbnYyRElucHV0cyxcbiAgYmFja2VuZDogTWF0aEJhY2tlbmRDUFUsXG4gIGF0dHJzOiBGdXNlZERlcHRod2lzZUNvbnYyREF0dHJzXG59KTogVGVuc29ySW5mbyB7XG4gIGNvbnN0IHtpbnB1dHMsIGJhY2tlbmQsIGF0dHJzfSA9IGFyZ3M7XG4gIGNvbnN0IHt4LCBmaWx0ZXIsIGJpYXMsIHByZWx1QWN0aXZhdGlvbldlaWdodHN9ID0gaW5wdXRzO1xuICBjb25zdCB7XG4gICAgc3RyaWRlcyxcbiAgICBwYWQsXG4gICAgZGF0YUZvcm1hdCxcbiAgICBkaWxhdGlvbnMsXG4gICAgZGltUm91bmRpbmdNb2RlLFxuICAgIGFjdGl2YXRpb24sXG4gICAgbGVha3lyZWx1QWxwaGFcbiAgfSA9IGF0dHJzO1xuXG4gIGxldCByZXN1bHQgPSBkZXB0aHdpc2VDb252MmROYXRpdmUoe1xuICAgIGlucHV0czoge3gsIGZpbHRlcn0sXG4gICAgYmFja2VuZCxcbiAgICBhdHRyczoge3N0cmlkZXMsIHBhZCwgZGF0YUZvcm1hdCwgZGlsYXRpb25zLCBkaW1Sb3VuZGluZ01vZGV9XG4gIH0pO1xuXG4gIGlmIChiaWFzKSB7XG4gICAgY29uc3Qgb2xkUmVzdWx0ID0gcmVzdWx0O1xuICAgIHJlc3VsdCA9IGFkZCh7aW5wdXRzOiB7YTogcmVzdWx0LCBiOiBiaWFzfSwgYmFja2VuZH0pIGFzIFRlbnNvckluZm87XG4gICAgYmFja2VuZC5kaXNwb3NlSW50ZXJtZWRpYXRlVGVuc29ySW5mbyhvbGRSZXN1bHQpO1xuICB9XG4gIGlmIChhY3RpdmF0aW9uKSB7XG4gICAgY29uc3Qgb2xkUmVzdWx0ID0gcmVzdWx0O1xuICAgIHJlc3VsdCA9IGFwcGx5QWN0aXZhdGlvbihcbiAgICAgICAgYmFja2VuZCwgcmVzdWx0LCBhY3RpdmF0aW9uLCBwcmVsdUFjdGl2YXRpb25XZWlnaHRzLCBsZWFreXJlbHVBbHBoYSk7XG4gICAgYmFja2VuZC5kaXNwb3NlSW50ZXJtZWRpYXRlVGVuc29ySW5mbyhvbGRSZXN1bHQpO1xuICB9XG5cbiAgcmV0dXJuIHJlc3VsdDtcbn1cblxuZXhwb3J0IGNvbnN0IGZ1c2VkRGVwdGh3aXNlQ29udjJEQ29uZmlnOiBLZXJuZWxDb25maWcgPSB7XG4gIGtlcm5lbE5hbWU6IEZ1c2VkRGVwdGh3aXNlQ29udjJELFxuICBiYWNrZW5kTmFtZTogJ2NwdScsXG4gIGtlcm5lbEZ1bmM6IGZ1c2VkRGVwdGh3aXNlQ29udjJEIGFzIHt9IGFzIEtlcm5lbEZ1bmNcbn07XG4iXX0=","/**\n * @license\n * Copyright 2021 Google LLC. All Rights Reserved.\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n * =============================================================================\n */\nimport { buffer } from '@tensorflow/tfjs-core';\nexport function gatherNdImpl(indicesData, paramsBuf, dtype, numSlices, sliceRank, sliceSize, strides, paramsShape, paramsSize) {\n const outBuf = buffer([numSlices, sliceSize], dtype);\n for (let i = 0; i < numSlices; i++) {\n const index = [];\n let flattenIndex = 0;\n for (let j = 0; j < sliceRank; j++) {\n const dim = indicesData[i * sliceRank + j];\n flattenIndex += dim * strides[j];\n index.push(dim);\n }\n if (flattenIndex < 0 || flattenIndex >= paramsSize / sliceSize) {\n throw new Error(`Invalid indices: ${index} does not index into ${paramsShape}`);\n }\n for (let k = 0; k < sliceSize; k++) {\n outBuf.values[i * sliceSize + k] =\n paramsBuf.get(...paramsBuf.indexToLoc(flattenIndex * sliceSize + k));\n }\n }\n return outBuf;\n}\n//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiR2F0aGVyTmRfSW1wbC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uLy4uL3RmanMtYmFja2VuZC1jcHUvc3JjL2tlcm5lbHMvR2F0aGVyTmRfSW1wbC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQTs7Ozs7Ozs7Ozs7Ozs7O0dBZUc7QUFFSCxPQUFPLEVBQUMsTUFBTSxFQUEyQyxNQUFNLHVCQUF1QixDQUFDO0FBRXZGLE1BQU0sVUFBVSxZQUFZLENBQ3hCLFdBQXVCLEVBQUUsU0FBMEIsRUFBRSxLQUFlLEVBQ3BFLFNBQWlCLEVBQUUsU0FBaUIsRUFBRSxTQUFpQixFQUFFLE9BQWlCLEVBQzFFLFdBQXFCLEVBQUUsVUFBa0I7SUFDM0MsTUFBTSxNQUFNLEdBQUcsTUFBTSxDQUFDLENBQUMsU0FBUyxFQUFFLFNBQVMsQ0FBQyxFQUFFLEtBQUssQ0FBQyxDQUFDO0lBRXJELEtBQUssSUFBSSxDQUFDLEdBQUcsQ0FBQyxFQUFFLENBQUMsR0FBRyxTQUFTLEVBQUUsQ0FBQyxFQUFFLEVBQUU7UUFDbEMsTUFBTSxLQUFLLEdBQUcsRUFBRSxDQUFDO1FBQ2pCLElBQUksWUFBWSxHQUFHLENBQUMsQ0FBQztRQUNyQixLQUFLLElBQUksQ0FBQyxHQUFHLENBQUMsRUFBRSxDQUFDLEdBQUcsU0FBUyxFQUFFLENBQUMsRUFBRSxFQUFFO1lBQ2xDLE1BQU0sR0FBRyxHQUFHLFdBQVcsQ0FBQyxDQUFDLEdBQUcsU0FBUyxHQUFHLENBQUMsQ0FBQyxDQUFDO1lBQzNDLFlBQVksSUFBSSxHQUFHLEdBQUcsT0FBTyxDQUFDLENBQUMsQ0FBQyxDQUFDO1lBQ2pDLEtBQUssQ0FBQyxJQUFJLENBQUMsR0FBRyxDQUFDLENBQUM7U0FDakI7UUFDRCxJQUFJLFlBQVksR0FBRyxDQUFDLElBQUksWUFBWSxJQUFJLFVBQVUsR0FBRyxTQUFTLEVBQUU7WUFDOUQsTUFBTSxJQUFJLEtBQUssQ0FDWCxvQkFBb0IsS0FBSyx3QkFBd0IsV0FBVyxFQUFFLENBQUMsQ0FBQztTQUNyRTtRQUVELEtBQUssSUFBSSxDQUFDLEdBQUcsQ0FBQyxFQUFFLENBQUMsR0FBRyxTQUFTLEVBQUUsQ0FBQyxFQUFFLEVBQUU7WUFDbEMsTUFBTSxDQUFDLE1BQU0sQ0FBQyxDQUFDLEdBQUcsU0FBUyxHQUFHLENBQUMsQ0FBQztnQkFDNUIsU0FBUyxDQUFDLEdBQUcsQ0FBQyxHQUFHLFNBQVMsQ0FBQyxVQUFVLENBQUMsWUFBWSxHQUFHLFNBQVMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDO1NBQzFFO0tBQ0Y7SUFFRCxPQUFPLE1BQXlCLENBQUM7QUFDbkMsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbIi8qKlxuICogQGxpY2Vuc2VcbiAqIENvcHlyaWdodCAyMDIxIEdvb2dsZSBMTEMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuXG4gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgXCJMaWNlbnNlXCIpO1xuICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLlxuICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0XG4gKlxuICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wXG4gKlxuICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZVxuICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gXCJBUyBJU1wiIEJBU0lTLFxuICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuXG4gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kXG4gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS5cbiAqID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4gKi9cblxuaW1wb3J0IHtidWZmZXIsIERhdGFUeXBlLCBSYW5rLCBUZW5zb3JCdWZmZXIsIFR5cGVkQXJyYXl9IGZyb20gJ0B0ZW5zb3JmbG93L3RmanMtY29yZSc7XG5cbmV4cG9ydCBmdW5jdGlvbiBnYXRoZXJOZEltcGw8UiBleHRlbmRzIFJhbms+KFxuICAgIGluZGljZXNEYXRhOiBUeXBlZEFycmF5LCBwYXJhbXNCdWY6IFRlbnNvckJ1ZmZlcjxSPiwgZHR5cGU6IERhdGFUeXBlLFxuICAgIG51bVNsaWNlczogbnVtYmVyLCBzbGljZVJhbms6IG51bWJlciwgc2xpY2VTaXplOiBudW1iZXIsIHN0cmlkZXM6IG51bWJlcltdLFxuICAgIHBhcmFtc1NoYXBlOiBudW1iZXJbXSwgcGFyYW1zU2l6ZTogbnVtYmVyKTogVGVuc29yQnVmZmVyPFI+IHtcbiAgY29uc3Qgb3V0QnVmID0gYnVmZmVyKFtudW1TbGljZXMsIHNsaWNlU2l6ZV0sIGR0eXBlKTtcblxuICBmb3IgKGxldCBpID0gMDsgaSA8IG51bVNsaWNlczsgaSsrKSB7XG4gICAgY29uc3QgaW5kZXggPSBbXTtcbiAgICBsZXQgZmxhdHRlbkluZGV4ID0gMDtcbiAgICBmb3IgKGxldCBqID0gMDsgaiA8IHNsaWNlUmFuazsgaisrKSB7XG4gICAgICBjb25zdCBkaW0gPSBpbmRpY2VzRGF0YVtpICogc2xpY2VSYW5rICsgal07XG4gICAgICBmbGF0dGVuSW5kZXggKz0gZGltICogc3RyaWRlc1tqXTtcbiAgICAgIGluZGV4LnB1c2goZGltKTtcbiAgICB9XG4gICAgaWYgKGZsYXR0ZW5JbmRleCA8IDAgfHwgZmxhdHRlbkluZGV4ID49IHBhcmFtc1NpemUgLyBzbGljZVNpemUpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcihcbiAgICAgICAgICBgSW52YWxpZCBpbmRpY2VzOiAke2luZGV4fSBkb2VzIG5vdCBpbmRleCBpbnRvICR7cGFyYW1zU2hhcGV9YCk7XG4gICAgfVxuXG4gICAgZm9yIChsZXQgayA9IDA7IGsgPCBzbGljZVNpemU7IGsrKykge1xuICAgICAgb3V0QnVmLnZhbHVlc1tpICogc2xpY2VTaXplICsga10gPVxuICAgICAgICAgIHBhcmFtc0J1Zi5nZXQoLi4ucGFyYW1zQnVmLmluZGV4VG9Mb2MoZmxhdHRlbkluZGV4ICogc2xpY2VTaXplICsgaykpO1xuICAgIH1cbiAgfVxuXG4gIHJldHVybiBvdXRCdWYgYXMgVGVuc29yQnVmZmVyPFI+O1xufVxuIl19","/**\n * @license\n * Copyright 2020 Google LLC. All Rights Reserved.\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n * =============================================================================\n */\nimport { backend_util, GatherNd, util } from '@tensorflow/tfjs-core';\nimport { gatherNdImpl } from './GatherNd_Impl';\nexport function gatherNd(args) {\n const { inputs, backend } = args;\n const { params, indices } = inputs;\n const paramsSize = util.sizeFromShape(params.shape);\n const indicesShape = indices.shape;\n const sliceRank = indicesShape[indicesShape.length - 1];\n const [resultShape, numSlices, sliceSize, strides] = backend_util.prepareAndValidate(params, indices);\n if (numSlices === 0) {\n return backend.makeTensorInfo(resultShape, params.dtype, []);\n }\n const indicesData = backend.data.get(indices.dataId).values;\n const paramsBuf = backend.bufferSync(params);\n const outBuf = gatherNdImpl(indicesData, paramsBuf, params.dtype, numSlices, sliceRank, sliceSize, strides, params.shape, paramsSize);\n return backend.makeTensorInfo(resultShape, params.dtype, outBuf.values);\n}\nexport const gatherNdConfig = {\n kernelName: GatherNd,\n backendName: 'cpu',\n kernelFunc: gatherNd\n};\n//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiR2F0aGVyTmQuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi8uLi90ZmpzLWJhY2tlbmQtY3B1L3NyYy9rZXJuZWxzL0dhdGhlck5kLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBOzs7Ozs7Ozs7Ozs7Ozs7R0FlRztBQUVILE9BQU8sRUFBQyxZQUFZLEVBQUUsUUFBUSxFQUEwRSxJQUFJLEVBQUMsTUFBTSx1QkFBdUIsQ0FBQztBQUkzSSxPQUFPLEVBQUMsWUFBWSxFQUFDLE1BQU0saUJBQWlCLENBQUM7QUFFN0MsTUFBTSxVQUFVLFFBQVEsQ0FDcEIsSUFBdUQ7SUFDekQsTUFBTSxFQUFDLE1BQU0sRUFBRSxPQUFPLEVBQUMsR0FBRyxJQUFJLENBQUM7SUFDL0IsTUFBTSxFQUFDLE1BQU0sRUFBRSxPQUFPLEVBQUMsR0FBRyxNQUFNLENBQUM7SUFFakMsTUFBTSxVQUFVLEdBQUcsSUFBSSxDQUFDLGFBQWEsQ0FBQyxNQUFNLENBQUMsS0FBSyxDQUFDLENBQUM7SUFFcEQsTUFBTSxZQUFZLEdBQUcsT0FBTyxDQUFDLEtBQUssQ0FBQztJQUNuQyxNQUFNLFNBQVMsR0FBRyxZQUFZLENBQUMsWUFBWSxDQUFDLE1BQU0sR0FBRyxDQUFDLENBQUMsQ0FBQztJQUV4RCxNQUFNLENBQUMsV0FBVyxFQUFFLFNBQVMsRUFBRSxTQUFTLEVBQUUsT0FBTyxDQUFDLEdBQzlDLFlBQVksQ0FBQyxrQkFBa0IsQ0FBQyxNQUFNLEVBQUUsT0FBTyxDQUFDLENBQUM7SUFDckQsSUFBSSxTQUFTLEtBQUssQ0FBQyxFQUFFO1FBQ25CLE9BQU8sT0FBTyxDQUFDLGNBQWMsQ0FBQyxXQUFXLEVBQUUsTUFBTSxDQUFDLEtBQUssRUFBRSxFQUFFLENBQUMsQ0FBQztLQUM5RDtJQUVELE1BQU0sV0FBVyxHQUFHLE9BQU8sQ0FBQyxJQUFJLENBQUMsR0FBRyxDQUFDLE9BQU8sQ0FBQyxNQUFNLENBQUMsQ0FBQyxNQUFvQixDQUFDO0lBQzFFLE1BQU0sU0FBUyxHQUFHLE9BQU8sQ0FBQyxVQUFVLENBQWtCLE1BQU0sQ0FBQyxDQUFDO0lBQzlELE1BQU0sTUFBTSxHQUFHLFlBQVksQ0FDdkIsV0FBVyxFQUFFLFNBQVMsRUFBRSxNQUFNLENBQUMsS0FBSyxFQUFFLFNBQVMsRUFBRSxTQUFTLEVBQUUsU0FBUyxFQUNyRSxPQUFPLEVBQUUsTUFBTSxDQUFDLEtBQUssRUFBRSxVQUFVLENBQUMsQ0FBQztJQUV2QyxPQUFPLE9BQU8sQ0FBQyxjQUFjLENBQUMsV0FBVyxFQUFFLE1BQU0sQ0FBQyxLQUFLLEVBQUUsTUFBTSxDQUFDLE1BQU0sQ0FBQyxDQUFDO0FBQzFFLENBQUM7QUFFRCxNQUFNLENBQUMsTUFBTSxjQUFjLEdBQWlCO0lBQzFDLFVBQVUsRUFBRSxRQUFRO0lBQ3BCLFdBQVcsRUFBRSxLQUFLO0lBQ2xCLFVBQVUsRUFBRSxRQUE0QjtDQUN6QyxDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiLyoqXG4gKiBAbGljZW5zZVxuICogQ29weXJpZ2h0IDIwMjAgR29vZ2xlIExMQy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC5cbiAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSBcIkxpY2Vuc2VcIik7XG4gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuXG4gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXRcbiAqXG4gKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjBcbiAqXG4gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlXG4gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiBcIkFTIElTXCIgQkFTSVMsXG4gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC5cbiAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmRcbiAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLlxuICogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbiAqL1xuXG5pbXBvcnQge2JhY2tlbmRfdXRpbCwgR2F0aGVyTmQsIEdhdGhlck5kSW5wdXRzLCBLZXJuZWxDb25maWcsIEtlcm5lbEZ1bmMsIFJhbmssIFRlbnNvckluZm8sIFR5cGVkQXJyYXksIHV0aWx9IGZyb20gJ0B0ZW5zb3JmbG93L3RmanMtY29yZSc7XG5cbmltcG9ydCB7TWF0aEJhY2tlbmRDUFV9IGZyb20gJy4uL2JhY2tlbmRfY3B1JztcblxuaW1wb3J0IHtnYXRoZXJOZEltcGx9IGZyb20gJy4vR2F0aGVyTmRfSW1wbCc7XG5cbmV4cG9ydCBmdW5jdGlvbiBnYXRoZXJOZChcbiAgICBhcmdzOiB7aW5wdXRzOiBHYXRoZXJOZElucHV0cywgYmFja2VuZDogTWF0aEJhY2tlbmRDUFV9KTogVGVuc29ySW5mbyB7XG4gIGNvbnN0IHtpbnB1dHMsIGJhY2tlbmR9ID0gYXJncztcbiAgY29uc3Qge3BhcmFtcywgaW5kaWNlc30gPSBpbnB1dHM7XG5cbiAgY29uc3QgcGFyYW1zU2l6ZSA9IHV0aWwuc2l6ZUZyb21TaGFwZShwYXJhbXMuc2hhcGUpO1xuXG4gIGNvbnN0IGluZGljZXNTaGFwZSA9IGluZGljZXMuc2hhcGU7XG4gIGNvbnN0IHNsaWNlUmFuayA9IGluZGljZXNTaGFwZVtpbmRpY2VzU2hhcGUubGVuZ3RoIC0gMV07XG5cbiAgY29uc3QgW3Jlc3VsdFNoYXBlLCBudW1TbGljZXMsIHNsaWNlU2l6ZSwgc3RyaWRlc10gPVxuICAgICAgYmFja2VuZF91dGlsLnByZXBhcmVBbmRWYWxpZGF0ZShwYXJhbXMsIGluZGljZXMpO1xuICBpZiAobnVtU2xpY2VzID09PSAwKSB7XG4gICAgcmV0dXJuIGJhY2tlbmQubWFrZVRlbnNvckluZm8ocmVzdWx0U2hhcGUsIHBhcmFtcy5kdHlwZSwgW10pO1xuICB9XG5cbiAgY29uc3QgaW5kaWNlc0RhdGEgPSBiYWNrZW5kLmRhdGEuZ2V0KGluZGljZXMuZGF0YUlkKS52YWx1ZXMgYXMgVHlwZWRBcnJheTtcbiAgY29uc3QgcGFyYW1zQnVmID0gYmFja2VuZC5idWZmZXJTeW5jPFJhbmssICdmbG9hdDMyJz4ocGFyYW1zKTtcbiAgY29uc3Qgb3V0QnVmID0gZ2F0aGVyTmRJbXBsKFxuICAgICAgaW5kaWNlc0RhdGEsIHBhcmFtc0J1ZiwgcGFyYW1zLmR0eXBlLCBudW1TbGljZXMsIHNsaWNlUmFuaywgc2xpY2VTaXplLFxuICAgICAgc3RyaWRlcywgcGFyYW1zLnNoYXBlLCBwYXJhbXNTaXplKTtcblxuICByZXR1cm4gYmFja2VuZC5tYWtlVGVuc29ySW5mbyhyZXN1bHRTaGFwZSwgcGFyYW1zLmR0eXBlLCBvdXRCdWYudmFsdWVzKTtcbn1cblxuZXhwb3J0IGNvbnN0IGdhdGhlck5kQ29uZmlnOiBLZXJuZWxDb25maWcgPSB7XG4gIGtlcm5lbE5hbWU6IEdhdGhlck5kLFxuICBiYWNrZW5kTmFtZTogJ2NwdScsXG4gIGtlcm5lbEZ1bmM6IGdhdGhlck5kIGFzIHt9IGFzIEtlcm5lbEZ1bmNcbn07XG4iXX0=","/**\n * @license\n * Copyright 2020 Google LLC. All Rights Reserved.\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n * =============================================================================\n */\nimport { buffer } from '@tensorflow/tfjs-core';\nexport function gatherV2Impl(xBuf, indicesBuf, flattenOutputShape) {\n const outBuf = buffer(flattenOutputShape, xBuf.dtype);\n for (let i = 0; i < outBuf.size; ++i) {\n const newLoc = outBuf.indexToLoc(i);\n const originalLoc = newLoc.slice();\n const batchIdx = originalLoc[0];\n const indicesIdx = originalLoc[2];\n const indicesIndex = indicesBuf.locToIndex([batchIdx, indicesIdx]);\n originalLoc[2] = indicesBuf.values[indicesIndex];\n const originalIndex = xBuf.locToIndex(originalLoc);\n if (0 <= originalIndex && originalIndex < xBuf.values.length) {\n outBuf.values[i] = xBuf.values[originalIndex];\n } // Else, index is out of bounds, so leave the default zero val in outBuf.\n }\n return outBuf;\n}\n//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiR2F0aGVyVjJfaW1wbC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uLy4uL3RmanMtYmFja2VuZC1jcHUvc3JjL2tlcm5lbHMvR2F0aGVyVjJfaW1wbC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQTs7Ozs7Ozs7Ozs7Ozs7O0dBZUc7QUFFSCxPQUFPLEVBQUMsTUFBTSxFQUErQixNQUFNLHVCQUF1QixDQUFDO0FBRTNFLE1BQU0sVUFBVSxZQUFZLENBQ3hCLElBQXdCLEVBQUUsVUFBOEIsRUFDeEQsa0JBQTRCO0lBQzlCLE1BQU0sTUFBTSxHQUFHLE1BQU0sQ0FBQyxrQkFBa0IsRUFBRSxJQUFJLENBQUMsS0FBSyxDQUFDLENBQUM7SUFDdEQsS0FBSyxJQUFJLENBQUMsR0FBRyxDQUFDLEVBQUUsQ0FBQyxHQUFHLE1BQU0sQ0FBQyxJQUFJLEVBQUUsRUFBRSxDQUFDLEVBQUU7UUFDcEMsTUFBTSxNQUFNLEdBQUcsTUFBTSxDQUFDLFVBQVUsQ0FBQyxDQUFDLENBQUMsQ0FBQztRQUVwQyxNQUFNLFdBQVcsR0FBYSxNQUFNLENBQUMsS0FBSyxFQUFFLENBQUM7UUFDN0MsTUFBTSxRQUFRLEdBQUcsV0FBVyxDQUFDLENBQUMsQ0FBQyxDQUFDO1FBQ2hDLE1BQU0sVUFBVSxHQUFHLFdBQVcsQ0FBQyxDQUFDLENBQUMsQ0FBQztRQUNsQyxNQUFNLFlBQVksR0FBRyxVQUFVLENBQUMsVUFBVSxDQUFDLENBQUMsUUFBUSxFQUFFLFVBQVUsQ0FBQyxDQUFDLENBQUM7UUFDbkUsV0FBVyxDQUFDLENBQUMsQ0FBQyxHQUFHLFVBQVUsQ0FBQyxNQUFNLENBQUMsWUFBWSxDQUFXLENBQUM7UUFFM0QsTUFBTSxhQUFhLEdBQUcsSUFBSSxDQUFDLFVBQVUsQ0FBQyxXQUFXLENBQUMsQ0FBQztRQUVuRCxJQUFJLENBQUMsSUFBSSxhQUFhLElBQUksYUFBYSxHQUFHLElBQUksQ0FBQyxNQUFNLENBQUMsTUFBTSxFQUFFO1lBQzVELE1BQU0sQ0FBQyxNQUFNLENBQUMsQ0FBQyxDQUFDLEdBQUcsSUFBSSxDQUFDLE1BQU0sQ0FBQyxhQUFhLENBQUMsQ0FBQztTQUMvQyxDQUFDLHlFQUF5RTtLQUM1RTtJQUVELE9BQU8sTUFBNEIsQ0FBQztBQUN0QyxDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiLyoqXG4gKiBAbGljZW5zZVxuICogQ29weXJpZ2h0IDIwMjAgR29vZ2xlIExMQy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC5cbiAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSBcIkxpY2Vuc2VcIik7XG4gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuXG4gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXRcbiAqXG4gKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjBcbiAqXG4gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlXG4gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiBcIkFTIElTXCIgQkFTSVMsXG4gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC5cbiAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmRcbiAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLlxuICogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbiAqL1xuXG5pbXBvcnQge2J1ZmZlciwgRGF0YVR5cGUsIFJhbmssIFRlbnNvckJ1ZmZlcn0gZnJvbSAnQHRlbnNvcmZsb3cvdGZqcy1jb3JlJztcblxuZXhwb3J0IGZ1bmN0aW9uIGdhdGhlclYySW1wbDxSIGV4dGVuZHMgUmFuaywgRCBleHRlbmRzIERhdGFUeXBlPihcbiAgICB4QnVmOiBUZW5zb3JCdWZmZXI8UiwgRD4sIGluZGljZXNCdWY6IFRlbnNvckJ1ZmZlcjxSLCBEPixcbiAgICBmbGF0dGVuT3V0cHV0U2hhcGU6IG51bWJlcltdKTogVGVuc29yQnVmZmVyPFIsIEQ+IHtcbiAgY29uc3Qgb3V0QnVmID0gYnVmZmVyKGZsYXR0ZW5PdXRwdXRTaGFwZSwgeEJ1Zi5kdHlwZSk7XG4gIGZvciAobGV0IGkgPSAwOyBpIDwgb3V0QnVmLnNpemU7ICsraSkge1xuICAgIGNvbnN0IG5ld0xvYyA9IG91dEJ1Zi5pbmRleFRvTG9jKGkpO1xuXG4gICAgY29uc3Qgb3JpZ2luYWxMb2M6IG51bWJlcltdID0gbmV3TG9jLnNsaWNlKCk7XG4gICAgY29uc3QgYmF0Y2hJZHggPSBvcmlnaW5hbExvY1swXTtcbiAgICBjb25zdCBpbmRpY2VzSWR4ID0gb3JpZ2luYWxMb2NbMl07XG4gICAgY29uc3QgaW5kaWNlc0luZGV4ID0gaW5kaWNlc0J1Zi5sb2NUb0luZGV4KFtiYXRjaElkeCwgaW5kaWNlc0lkeF0pO1xuICAgIG9yaWdpbmFsTG9jWzJdID0gaW5kaWNlc0J1Zi52YWx1ZXNbaW5kaWNlc0luZGV4XSBhcyBudW1iZXI7XG5cbiAgICBjb25zdCBvcmlnaW5hbEluZGV4ID0geEJ1Zi5sb2NUb0luZGV4KG9yaWdpbmFsTG9jKTtcblxuICAgIGlmICgwIDw9IG9yaWdpbmFsSW5kZXggJiYgb3JpZ2luYWxJbmRleCA8IHhCdWYudmFsdWVzLmxlbmd0aCkge1xuICAgICAgb3V0QnVmLnZhbHVlc1tpXSA9IHhCdWYudmFsdWVzW29yaWdpbmFsSW5kZXhdO1xuICAgIH0gLy8gRWxzZSwgaW5kZXggaXMgb3V0IG9mIGJvdW5kcywgc28gbGVhdmUgdGhlIGRlZmF1bHQgemVybyB2YWwgaW4gb3V0QnVmLlxuICB9XG5cbiAgcmV0dXJuIG91dEJ1ZiBhcyBUZW5zb3JCdWZmZXI8UiwgRD47XG59XG4iXX0=","/**\n * @license\n * Copyright 2020 Google LLC. All Rights Reserved.\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n * =============================================================================\n */\nimport { backend_util, GatherV2, util } from '@tensorflow/tfjs-core';\nimport { assertNotComplex } from '../cpu_util';\nimport { gatherV2Impl } from './GatherV2_impl';\nimport { reshape } from './Reshape';\nexport function gatherV2(args) {\n const { inputs, backend, attrs } = args;\n const { x, indices } = inputs;\n const { axis, batchDims } = attrs;\n assertNotComplex([x, indices], 'gatherV2');\n // Throw error when any index is out of bound.\n const parsedAxis = util.parseAxisParam(axis, x.shape)[0];\n const indicesVals = backend.data.get(indices.dataId).values;\n const axisDim = x.shape[parsedAxis];\n for (let i = 0; i < indicesVals.length; ++i) {\n const index = indicesVals[i];\n util.assert(index <= axisDim - 1 && index >= 0, () => `GatherV2: the index value ${index} is not in [0, ${axisDim - 1}]`);\n }\n let $batchDims = batchDims;\n if (batchDims == null) {\n $batchDims = 0;\n }\n const indicesSize = util.sizeFromShape(indices.shape);\n const shapeInfo = backend_util.segment_util.collectGatherOpShapeInfo(x, indices, parsedAxis, $batchDims);\n const flattenX = reshape({\n inputs: { x },\n backend,\n attrs: {\n shape: [\n shapeInfo.batchSize, shapeInfo.outerSize, shapeInfo.dimSize,\n shapeInfo.sliceSize\n ]\n }\n });\n const flattenIndex = reshape({\n inputs: { x: indices },\n backend,\n attrs: { shape: [shapeInfo.batchSize, indicesSize / shapeInfo.batchSize] }\n });\n const flattenOutputShape = [\n shapeInfo.batchSize, shapeInfo.outerSize, indicesSize / shapeInfo.batchSize,\n shapeInfo.sliceSize\n ];\n const indicesBuf = backend.bufferSync(flattenIndex);\n const xBuf = backend.bufferSync(flattenX);\n const outBuf = gatherV2Impl(xBuf, indicesBuf, flattenOutputShape);\n backend.disposeIntermediateTensorInfo(flattenX);\n backend.disposeIntermediateTensorInfo(flattenIndex);\n return backend.makeTensorInfo(shapeInfo.outputShape, outBuf.dtype, outBuf.values);\n}\nexport const gatherV2Config = {\n kernelName: GatherV2,\n backendName: 'cpu',\n kernelFunc: gatherV2\n};\n//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiR2F0aGVyVjIuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi8uLi90ZmpzLWJhY2tlbmQtY3B1L3NyYy9rZXJuZWxzL0dhdGhlclYyLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBOzs7Ozs7Ozs7Ozs7Ozs7R0FlRztBQUVILE9BQU8sRUFBQyxZQUFZLEVBQUUsUUFBUSxFQUFtRixJQUFJLEVBQUMsTUFBTSx1QkFBdUIsQ0FBQztBQUdwSixPQUFPLEVBQUMsZ0JBQWdCLEVBQUMsTUFBTSxhQUFhLENBQUM7QUFDN0MsT0FBTyxFQUFDLFlBQVksRUFBQyxNQUFNLGlCQUFpQixDQUFDO0FBQzdDLE9BQU8sRUFBQyxPQUFPLEVBQUMsTUFBTSxXQUFXLENBQUM7QUFFbEMsTUFBTSxVQUFVLFFBQVEsQ0FBQyxJQUl4QjtJQUNDLE1BQU0sRUFBQyxNQUFNLEVBQUUsT0FBTyxFQUFFLEtBQUssRUFBQyxHQUFHLElBQUksQ0FBQztJQUN0QyxNQUFNLEVBQUMsQ0FBQyxFQUFFLE9BQU8sRUFBQyxHQUFHLE1BQU0sQ0FBQztJQUM1QixNQUFNLEVBQUMsSUFBSSxFQUFFLFNBQVMsRUFBQyxHQUFHLEtBQUssQ0FBQztJQUVoQyxnQkFBZ0IsQ0FBQyxDQUFDLENBQUMsRUFBRSxPQUFPLENBQUMsRUFBRSxVQUFVLENBQUMsQ0FBQztJQUUzQyw4Q0FBOEM7SUFDOUMsTUFBTSxVQUFVLEdBQUcsSUFBSSxDQUFDLGNBQWMsQ0FBQyxJQUFJLEVBQUUsQ0FBQyxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDO0lBQ3pELE1BQU0sV0FBVyxHQUFHLE9BQU8sQ0FBQyxJQUFJLENBQUMsR0FBRyxDQUFDLE9BQU8sQ0FBQyxNQUFNLENBQUMsQ0FBQyxNQUFvQixDQUFDO0lBQzFFLE1BQU0sT0FBTyxHQUFHLENBQUMsQ0FBQyxLQUFLLENBQUMsVUFBVSxDQUFDLENBQUM7SUFDcEMsS0FBSyxJQUFJLENBQUMsR0FBRyxDQUFDLEVBQUUsQ0FBQyxHQUFHLFdBQVcsQ0FBQyxNQUFNLEVBQUUsRUFBRSxDQUFDLEVBQUU7UUFDM0MsTUFBTSxLQUFLLEdBQUcsV0FBVyxDQUFDLENBQUMsQ0FBQyxDQUFDO1FBQzdCLElBQUksQ0FBQyxNQUFNLENBQ1AsS0FBSyxJQUFJLE9BQU8sR0FBRyxDQUFDLElBQUksS0FBSyxJQUFJLENBQUMsRUFDbEMsR0FBRyxFQUFFLENBQ0QsNkJBQTZCLEtBQUssa0JBQWtCLE9BQU8sR0FBRyxDQUFDLEdBQUcsQ0FBQyxDQUFDO0tBQzdFO0lBRUQsSUFBSSxVQUFVLEdBQUcsU0FBUyxDQUFDO0lBRTNCLElBQUksU0FBUyxJQUFJLElBQUksRUFBRTtRQUNyQixVQUFVLEdBQUcsQ0FBQyxDQUFDO0tBQ2hCO0lBRUQsTUFBTSxXQUFXLEdBQUcsSUFBSSxDQUFDLGFBQWEsQ0FBQyxPQUFPLENBQUMsS0FBSyxDQUFDLENBQUM7SUFFdEQsTUFBTSxTQUFTLEdBQUcsWUFBWSxDQUFDLFlBQVksQ0FBQyx3QkFBd0IsQ0FDaEUsQ0FBQyxFQUFFLE9BQU8sRUFBRSxVQUFVLEVBQUUsVUFBVSxDQUFDLENBQUM7SUFFeEMsTUFBTSxRQUFRLEdBQUcsT0FBTyxDQUFDO1FBQ3ZCLE1BQU0sRUFBRSxFQUFDLENBQUMsRUFBQztRQUNYLE9BQU87UUFDUCxLQUFLLEVBQUU7WUFDTCxLQUFLLEVBQUU7Z0JBQ0wsU0FBUyxDQUFDLFNBQVMsRUFBRSxTQUFTLENBQUMsU0FBUyxFQUFFLFNBQVMsQ0FBQyxPQUFPO2dCQUMzRCxTQUFTLENBQUMsU0FBUzthQUNwQjtTQUNGO0tBQ0YsQ0FBQyxDQUFDO0lBRUgsTUFBTSxZQUFZLEdBQUcsT0FBTyxDQUFDO1FBQzNCLE1BQU0sRUFBRSxFQUFDLENBQUMsRUFBRSxPQUFPLEVBQUM7UUFDcEIsT0FBTztRQUNQLEtBQUssRUFBRSxFQUFDLEtBQUssRUFBRSxDQUFDLFNBQVMsQ0FBQyxTQUFTLEVBQUUsV0FBVyxHQUFHLFNBQVMsQ0FBQyxTQUFTLENBQUMsRUFBQztLQUN6RSxDQUFDLENBQUM7SUFFSCxNQUFNLGtCQUFrQixHQUFHO1FBQ3pCLFNBQVMsQ0FBQyxTQUFTLEVBQUUsU0FBUyxDQUFDLFNBQVMsRUFBRSxXQUFXLEdBQUcsU0FBUyxDQUFDLFNBQVM7UUFDM0UsU0FBUyxDQUFDLFNBQVM7S0FDcEIsQ0FBQztJQUVGLE1BQU0sVUFBVSxHQUFHLE9BQU8sQ0FBQyxVQUFVLENBQUMsWUFBWSxDQUFDLENBQUM7SUFDcEQsTUFBTSxJQUFJLEdBQUcsT0FBTyxDQUFDLFVBQVUsQ0FBQyxRQUFRLENBQUMsQ0FBQztJQUMxQyxNQUFNLE1BQU0sR0FBRyxZQUFZLENBQUMsSUFBSSxFQUFFLFVBQVUsRUFBRSxrQkFBa0IsQ0FBQyxDQUFDO0lBRWxFLE9BQU8sQ0FBQyw2QkFBNkIsQ0FBQyxRQUFRLENBQUMsQ0FBQztJQUNoRCxPQUFPLENBQUMsNkJBQTZCLENBQUMsWUFBWSxDQUFDLENBQUM7SUFFcEQsT0FBTyxPQUFPLENBQUMsY0FBYyxDQUN6QixTQUFTLENBQUMsV0FBVyxFQUFFLE1BQU0sQ0FBQyxLQUFLLEVBQUUsTUFBTSxDQUFDLE1BQU0sQ0FBQyxDQUFDO0FBQzFELENBQUM7QUFFRCxNQUFNLENBQUMsTUFBTSxjQUFjLEdBQWlCO0lBQzFDLFVBQVUsRUFBRSxRQUFRO0lBQ3BCLFdBQVcsRUFBRSxLQUFLO0lBQ2xCLFVBQVUsRUFBRSxRQUE0QjtDQUN6QyxDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiLyoqXG4gKiBAbGljZW5zZVxuICogQ29weXJpZ2h0IDIwMjAgR29vZ2xlIExMQy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC5cbiAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSBcIkxpY2Vuc2VcIik7XG4gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuXG4gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXRcbiAqXG4gKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjBcbiAqXG4gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlXG4gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiBcIkFTIElTXCIgQkFTSVMsXG4gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC5cbiAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmRcbiAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLlxuICogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbiAqL1xuXG5pbXBvcnQge2JhY2tlbmRfdXRpbCwgR2F0aGVyVjIsIEdhdGhlclYyQXR0cnMsIEdhdGhlclYySW5wdXRzLCBLZXJuZWxDb25maWcsIEtlcm5lbEZ1bmMsIFRlbnNvckluZm8sIFR5cGVkQXJyYXksIHV0aWx9IGZyb20gJ0B0ZW5zb3JmbG93L3RmanMtY29yZSc7XG5cbmltcG9ydCB7TWF0aEJhY2tlbmRDUFV9IGZyb20gJy4uL2JhY2tlbmRfY3B1JztcbmltcG9ydCB7YXNzZXJ0Tm90Q29tcGxleH0gZnJvbSAnLi4vY3B1X3V0aWwnO1xuaW1wb3J0IHtnYXRoZXJWMkltcGx9IGZyb20gJy4vR2F0aGVyVjJfaW1wbCc7XG5pbXBvcnQge3Jlc2hhcGV9IGZyb20gJy4vUmVzaGFwZSc7XG5cbmV4cG9ydCBmdW5jdGlvbiBnYXRoZXJWMihhcmdzOiB7XG4gIGlucHV0czogR2F0aGVyVjJJbnB1dHMsXG4gIGJhY2tlbmQ6IE1hdGhCYWNrZW5kQ1BVLFxuICBhdHRyczogR2F0aGVyVjJBdHRyc1xufSk6IFRlbnNvckluZm8ge1xuICBjb25zdCB7aW5wdXRzLCBiYWNrZW5kLCBhdHRyc30gPSBhcmdzO1xuICBjb25zdCB7eCwgaW5kaWNlc30gPSBpbnB1dHM7XG4gIGNvbnN0IHtheGlzLCBiYXRjaERpbXN9ID0gYXR0cnM7XG5cbiAgYXNzZXJ0Tm90Q29tcGxleChbeCwgaW5kaWNlc10sICdnYXRoZXJWMicpO1xuXG4gIC8vIFRocm93IGVycm9yIHdoZW4gYW55IGluZGV4IGlzIG91dCBvZiBib3VuZC5cbiAgY29uc3QgcGFyc2VkQXhpcyA9IHV0aWwucGFyc2VBeGlzUGFyYW0oYXhpcywgeC5zaGFwZSlbMF07XG4gIGNvbnN0IGluZGljZXNWYWxzID0gYmFja2VuZC5kYXRhLmdldChpbmRpY2VzLmRhdGFJZCkudmFsdWVzIGFzIFR5cGVkQXJyYXk7XG4gIGNvbnN0IGF4aXNEaW0gPSB4LnNoYXBlW3BhcnNlZEF4aXNdO1xuICBmb3IgKGxldCBpID0gMDsgaSA8IGluZGljZXNWYWxzLmxlbmd0aDsgKytpKSB7XG4gICAgY29uc3QgaW5kZXggPSBpbmRpY2VzVmFsc1tpXTtcbiAgICB1dGlsLmFzc2VydChcbiAgICAgICAgaW5kZXggPD0gYXhpc0RpbSAtIDEgJiYgaW5kZXggPj0gMCxcbiAgICAgICAgKCkgPT5cbiAgICAgICAgICAgIGBHYXRoZXJWMjogdGhlIGluZGV4IHZhbHVlICR7aW5kZXh9IGlzIG5vdCBpbiBbMCwgJHtheGlzRGltIC0gMX1dYCk7XG4gIH1cblxuICBsZXQgJGJhdGNoRGltcyA9IGJhdGNoRGltcztcblxuICBpZiAoYmF0Y2hEaW1zID09IG51bGwpIHtcbiAgICAkYmF0Y2hEaW1zID0gMDtcbiAgfVxuXG4gIGNvbnN0IGluZGljZXNTaXplID0gdXRpbC5zaXplRnJvbVNoYXBlKGluZGljZXMuc2hhcGUpO1xuXG4gIGNvbnN0IHNoYXBlSW5mbyA9IGJhY2tlbmRfdXRpbC5zZWdtZW50X3V0aWwuY29sbGVjdEdhdGhlck9wU2hhcGVJbmZvKFxuICAgICAgeCwgaW5kaWNlcywgcGFyc2VkQXhpcywgJGJhdGNoRGltcyk7XG5cbiAgY29uc3QgZmxhdHRlblggPSByZXNoYXBlKHtcbiAgICBpbnB1dHM6IHt4fSxcbiAgICBiYWNrZW5kLFxuICAgIGF0dHJzOiB7XG4gICAgICBzaGFwZTogW1xuICAgICAgICBzaGFwZUluZm8uYmF0Y2hTaXplLCBzaGFwZUluZm8ub3V0ZXJTaXplLCBzaGFwZUluZm8uZGltU2l6ZSxcbiAgICAgICAgc2hhcGVJbmZvLnNsaWNlU2l6ZVxuICAgICAgXVxuICAgIH1cbiAgfSk7XG5cbiAgY29uc3QgZmxhdHRlbkluZGV4ID0gcmVzaGFwZSh7XG4gICAgaW5wdXRzOiB7eDogaW5kaWNlc30sXG4gICAgYmFja2VuZCxcbiAgICBhdHRyczoge3NoYXBlOiBbc2hhcGVJbmZvLmJhdGNoU2l6ZSwgaW5kaWNlc1NpemUgLyBzaGFwZUluZm8uYmF0Y2hTaXplXX1cbiAgfSk7XG5cbiAgY29uc3QgZmxhdHRlbk91dHB1dFNoYXBlID0gW1xuICAgIHNoYXBlSW5mby5iYXRjaFNpemUsIHNoYXBlSW5mby5vdXRlclNpemUsIGluZGljZXNTaXplIC8gc2hhcGVJbmZvLmJhdGNoU2l6ZSxcbiAgICBzaGFwZUluZm8uc2xpY2VTaXplXG4gIF07XG5cbiAgY29uc3QgaW5kaWNlc0J1ZiA9IGJhY2tlbmQuYnVmZmVyU3luYyhmbGF0dGVuSW5kZXgpO1xuICBjb25zdCB4QnVmID0gYmFja2VuZC5idWZmZXJTeW5jKGZsYXR0ZW5YKTtcbiAgY29uc3Qgb3V0QnVmID0gZ2F0aGVyVjJJbXBsKHhCdWYsIGluZGljZXNCdWYsIGZsYXR0ZW5PdXRwdXRTaGFwZSk7XG5cbiAgYmFja2VuZC5kaXNwb3NlSW50ZXJtZWRpYXRlVGVuc29ySW5mbyhmbGF0dGVuWCk7XG4gIGJhY2tlbmQuZGlzcG9zZUludGVybWVkaWF0ZVRlbnNvckluZm8oZmxhdHRlbkluZGV4KTtcblxuICByZXR1cm4gYmFja2VuZC5tYWtlVGVuc29ySW5mbyhcbiAgICAgIHNoYXBlSW5mby5vdXRwdXRTaGFwZSwgb3V0QnVmLmR0eXBlLCBvdXRCdWYudmFsdWVzKTtcbn1cblxuZXhwb3J0IGNvbnN0IGdhdGhlclYyQ29uZmlnOiBLZXJuZWxDb25maWcgPSB7XG4gIGtlcm5lbE5hbWU6IEdhdGhlclYyLFxuICBiYWNrZW5kTmFtZTogJ2NwdScsXG4gIGtlcm5lbEZ1bmM6IGdhdGhlclYyIGFzIHt9IGFzIEtlcm5lbEZ1bmNcbn07XG4iXX0=","/**\n * @license\n * Copyright 2020 Google LLC. All Rights Reserved.\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n * =============================================================================\n */\nimport { Greater } from '@tensorflow/tfjs-core';\nimport { createSimpleBinaryKernelImpl } from '../utils/binary_impl';\nimport { binaryKernelFunc } from '../utils/binary_utils';\nexport const greaterImpl = createSimpleBinaryKernelImpl((a, b) => (a > b) ? 1 : 0);\nexport const greater = binaryKernelFunc(Greater, greaterImpl, null /* complexImpl */, 'bool');\nexport const greaterConfig = {\n kernelName: Greater,\n backendName: 'cpu',\n kernelFunc: greater\n};\n//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiR3JlYXRlci5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uLy4uL3RmanMtYmFja2VuZC1jcHUvc3JjL2tlcm5lbHMvR3JlYXRlci50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQTs7Ozs7Ozs7Ozs7Ozs7O0dBZUc7QUFFSCxPQUFPLEVBQUMsT0FBTyxFQUFlLE1BQU0sdUJBQXVCLENBQUM7QUFFNUQsT0FBTyxFQUFDLDRCQUE0QixFQUFDLE1BQU0sc0JBQXNCLENBQUM7QUFDbEUsT0FBTyxFQUFDLGdCQUFnQixFQUFDLE1BQU0sdUJBQXVCLENBQUM7QUFFdkQsTUFBTSxDQUFDLE1BQU0sV0FBVyxHQUNwQiw0QkFBNEIsQ0FBQyxDQUFDLENBQVMsRUFBRSxDQUFTLEVBQUUsRUFBRSxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDO0FBQzVFLE1BQU0sQ0FBQyxNQUFNLE9BQU8sR0FDaEIsZ0JBQWdCLENBQUMsT0FBTyxFQUFFLFdBQVcsRUFBRSxJQUFJLENBQUMsaUJBQWlCLEVBQUUsTUFBTSxDQUFDLENBQUM7QUFFM0UsTUFBTSxDQUFDLE1BQU0sYUFBYSxHQUFpQjtJQUN6QyxVQUFVLEVBQUUsT0FBTztJQUNuQixXQUFXLEVBQUUsS0FBSztJQUNsQixVQUFVLEVBQUUsT0FBTztDQUNwQixDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiLyoqXG4gKiBAbGljZW5zZVxuICogQ29weXJpZ2h0IDIwMjAgR29vZ2xlIExMQy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC5cbiAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSBcIkxpY2Vuc2VcIik7XG4gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuXG4gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXRcbiAqXG4gKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjBcbiAqXG4gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlXG4gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiBcIkFTIElTXCIgQkFTSVMsXG4gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC5cbiAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmRcbiAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLlxuICogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbiAqL1xuXG5pbXBvcnQge0dyZWF0ZXIsIEtlcm5lbENvbmZpZ30gZnJvbSAnQHRlbnNvcmZsb3cvdGZqcy1jb3JlJztcblxuaW1wb3J0IHtjcmVhdGVTaW1wbGVCaW5hcnlLZXJuZWxJbXBsfSBmcm9tICcuLi91dGlscy9iaW5hcnlfaW1wbCc7XG5pbXBvcnQge2JpbmFyeUtlcm5lbEZ1bmN9IGZyb20gJy4uL3V0aWxzL2JpbmFyeV91dGlscyc7XG5cbmV4cG9ydCBjb25zdCBncmVhdGVySW1wbCA9XG4gICAgY3JlYXRlU2ltcGxlQmluYXJ5S2VybmVsSW1wbCgoYTogbnVtYmVyLCBiOiBudW1iZXIpID0+IChhID4gYikgPyAxIDogMCk7XG5leHBvcnQgY29uc3QgZ3JlYXRlciA9XG4gICAgYmluYXJ5S2VybmVsRnVuYyhHcmVhdGVyLCBncmVhdGVySW1wbCwgbnVsbCAvKiBjb21wbGV4SW1wbCAqLywgJ2Jvb2wnKTtcblxuZXhwb3J0IGNvbnN0IGdyZWF0ZXJDb25maWc6IEtlcm5lbENvbmZpZyA9IHtcbiAga2VybmVsTmFtZTogR3JlYXRlcixcbiAgYmFja2VuZE5hbWU6ICdjcHUnLFxuICBrZXJuZWxGdW5jOiBncmVhdGVyXG59O1xuIl19","/**\n * @license\n * Copyright 2020 Google LLC. All Rights Reserved.\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n * =============================================================================\n */\nimport { GreaterEqual } from '@tensorflow/tfjs-core';\nimport { createSimpleBinaryKernelImpl } from '../utils/binary_impl';\nimport { binaryKernelFunc } from '../utils/binary_utils';\nexport const greaterEqualImpl = createSimpleBinaryKernelImpl((a, b) => (a >= b) ? 1 : 0);\nexport const greaterEqual = binaryKernelFunc(GreaterEqual, greaterEqualImpl, null /* complexImpl */, 'bool');\nexport const greaterEqualConfig = {\n kernelName: GreaterEqual,\n backendName: 'cpu',\n kernelFunc: greaterEqual\n};\n//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiR3JlYXRlckVxdWFsLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vLi4vdGZqcy1iYWNrZW5kLWNwdS9zcmMva2VybmVscy9HcmVhdGVyRXF1YWwudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUE7Ozs7Ozs7Ozs7Ozs7OztHQWVHO0FBRUgsT0FBTyxFQUFDLFlBQVksRUFBZSxNQUFNLHVCQUF1QixDQUFDO0FBRWpFLE9BQU8sRUFBQyw0QkFBNEIsRUFBQyxNQUFNLHNCQUFzQixDQUFDO0FBQ2xFLE9BQU8sRUFBQyxnQkFBZ0IsRUFBQyxNQUFNLHVCQUF1QixDQUFDO0FBRXZELE1BQU0sQ0FBQyxNQUFNLGdCQUFnQixHQUN6Qiw0QkFBNEIsQ0FBQyxDQUFDLENBQVMsRUFBRSxDQUFTLEVBQUUsRUFBRSxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDO0FBQzdFLE1BQU0sQ0FBQyxNQUFNLFlBQVksR0FBRyxnQkFBZ0IsQ0FDeEMsWUFBWSxFQUFFLGdCQUFnQixFQUFFLElBQUksQ0FBQyxpQkFBaUIsRUFBRSxNQUFNLENBQUMsQ0FBQztBQUVwRSxNQUFNLENBQUMsTUFBTSxrQkFBa0IsR0FBaUI7SUFDOUMsVUFBVSxFQUFFLFlBQVk7SUFDeEIsV0FBVyxFQUFFLEtBQUs7SUFDbEIsVUFBVSxFQUFFLFlBQVk7Q0FDekIsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbIi8qKlxuICogQGxpY2Vuc2VcbiAqIENvcHlyaWdodCAyMDIwIEdvb2dsZSBMTEMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuXG4gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgXCJMaWNlbnNlXCIpO1xuICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLlxuICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0XG4gKlxuICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wXG4gKlxuICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZVxuICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gXCJBUyBJU1wiIEJBU0lTLFxuICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuXG4gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kXG4gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS5cbiAqID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4gKi9cblxuaW1wb3J0IHtHcmVhdGVyRXF1YWwsIEtlcm5lbENvbmZpZ30gZnJvbSAnQHRlbnNvcmZsb3cvdGZqcy1jb3JlJztcblxuaW1wb3J0IHtjcmVhdGVTaW1wbGVCaW5hcnlLZXJuZWxJbXBsfSBmcm9tICcuLi91dGlscy9iaW5hcnlfaW1wbCc7XG5pbXBvcnQge2JpbmFyeUtlcm5lbEZ1bmN9IGZyb20gJy4uL3V0aWxzL2JpbmFyeV91dGlscyc7XG5cbmV4cG9ydCBjb25zdCBncmVhdGVyRXF1YWxJbXBsID1cbiAgICBjcmVhdGVTaW1wbGVCaW5hcnlLZXJuZWxJbXBsKChhOiBudW1iZXIsIGI6IG51bWJlcikgPT4gKGEgPj0gYikgPyAxIDogMCk7XG5leHBvcnQgY29uc3QgZ3JlYXRlckVxdWFsID0gYmluYXJ5S2VybmVsRnVuYyhcbiAgICBHcmVhdGVyRXF1YWwsIGdyZWF0ZXJFcXVhbEltcGwsIG51bGwgLyogY29tcGxleEltcGwgKi8sICdib29sJyk7XG5cbmV4cG9ydCBjb25zdCBncmVhdGVyRXF1YWxDb25maWc6IEtlcm5lbENvbmZpZyA9IHtcbiAga2VybmVsTmFtZTogR3JlYXRlckVxdWFsLFxuICBiYWNrZW5kTmFtZTogJ2NwdScsXG4gIGtlcm5lbEZ1bmM6IGdyZWF0ZXJFcXVhbFxufTtcbiJdfQ==","/**\n * @license\n * Copyright 2020 Google LLC. All Rights Reserved.\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n * =============================================================================\n */\nimport { IFFT, util } from '@tensorflow/tfjs-core';\nimport { fftBatch } from '../utils/fft_utils';\nimport { reshape } from './Reshape';\nexport function ifft(args) {\n const { inputs, backend } = args;\n const { input } = inputs;\n const inputSize = util.sizeFromShape(input.shape);\n // Collapse all outer dimensions to a single batch dimension.\n const innerDimensionSize = input.shape[input.shape.length - 1];\n const batch = inputSize / innerDimensionSize;\n const input2D = reshape({\n inputs: { x: input },\n backend,\n attrs: { shape: [batch, innerDimensionSize] }\n });\n const result = fftBatch(input2D, true, backend);\n const resultReshaped = reshape({ inputs: { x: result }, backend, attrs: { shape: input.shape } });\n backend.disposeIntermediateTensorInfo(input2D);\n backend.disposeIntermediateTensorInfo(result);\n return resultReshaped;\n}\nexport const ifftConfig = {\n kernelName: IFFT,\n backendName: 'cpu',\n kernelFunc: ifft\n};\n//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiSUZGVC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uLy4uL3RmanMtYmFja2VuZC1jcHUvc3JjL2tlcm5lbHMvSUZGVC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQTs7Ozs7Ozs7Ozs7Ozs7O0dBZUc7QUFFSCxPQUFPLEVBQUMsSUFBSSxFQUFvRCxJQUFJLEVBQUMsTUFBTSx1QkFBdUIsQ0FBQztBQUduRyxPQUFPLEVBQUMsUUFBUSxFQUFDLE1BQU0sb0JBQW9CLENBQUM7QUFDNUMsT0FBTyxFQUFDLE9BQU8sRUFBQyxNQUFNLFdBQVcsQ0FBQztBQUVsQyxNQUFNLFVBQVUsSUFBSSxDQUFDLElBQW1EO0lBRXRFLE1BQU0sRUFBQyxNQUFNLEVBQUUsT0FBTyxFQUFDLEdBQUcsSUFBSSxDQUFDO0lBQy9CLE1BQU0sRUFBQyxLQUFLLEVBQUMsR0FBRyxNQUFNLENBQUM7SUFFdkIsTUFBTSxTQUFTLEdBQUcsSUFBSSxDQUFDLGFBQWEsQ0FBQyxLQUFLLENBQUMsS0FBSyxDQUFDLENBQUM7SUFFbEQsNkRBQTZEO0lBQzdELE1BQU0sa0JBQWtCLEdBQUcsS0FBSyxDQUFDLEtBQUssQ0FBQyxLQUFLLENBQUMsS0FBSyxDQUFDLE1BQU0sR0FBRyxDQUFDLENBQUMsQ0FBQztJQUMvRCxNQUFNLEtBQUssR0FBRyxTQUFTLEdBQUcsa0JBQWtCLENBQUM7SUFFN0MsTUFBTSxPQUFPLEdBQUcsT0FBTyxDQUFDO1FBQ3RCLE1BQU0sRUFBRSxFQUFDLENBQUMsRUFBRSxLQUFLLEVBQUM7UUFDbEIsT0FBTztRQUNQLEtBQUssRUFBRSxFQUFDLEtBQUssRUFBRSxDQUFDLEtBQUssRUFBRSxrQkFBa0IsQ0FBQyxFQUFDO0tBQzVDLENBQUMsQ0FBQztJQUVILE1BQU0sTUFBTSxHQUFHLFFBQVEsQ0FBQyxPQUFPLEVBQUUsSUFBSSxFQUFFLE9BQU8sQ0FBQyxDQUFDO0lBRWhELE1BQU0sY0FBYyxHQUNoQixPQUFPLENBQUMsRUFBQyxNQUFNLEVBQUUsRUFBQyxDQUFDLEVBQUUsTUFBTSxFQUFDLEVBQUUsT0FBTyxFQUFFLEtBQUssRUFBRSxFQUFDLEtBQUssRUFBRSxLQUFLLENBQUMsS0FBSyxFQUFDLEVBQUMsQ0FBQyxDQUFDO0lBRXpFLE9BQU8sQ0FBQyw2QkFBNkIsQ0FBQyxPQUFPLENBQUMsQ0FBQztJQUMvQyxPQUFPLENBQUMsNkJBQTZCLENBQUMsTUFBTSxDQUFDLENBQUM7SUFFOUMsT0FBTyxjQUFjLENBQUM7QUFDeEIsQ0FBQztBQUVELE1BQU0sQ0FBQyxNQUFNLFVBQVUsR0FBaUI7SUFDdEMsVUFBVSxFQUFFLElBQUk7SUFDaEIsV0FBVyxFQUFFLEtBQUs7SUFDbEIsVUFBVSxFQUFFLElBQXdCO0NBQ3JDLENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyIvKipcbiAqIEBsaWNlbnNlXG4gKiBDb3B5cmlnaHQgMjAyMCBHb29nbGUgTExDLiBBbGwgUmlnaHRzIFJlc2VydmVkLlxuICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlIFwiTGljZW5zZVwiKTtcbiAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS5cbiAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdFxuICpcbiAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMFxuICpcbiAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmVcbiAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuIFwiQVMgSVNcIiBCQVNJUyxcbiAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLlxuICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZFxuICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuXG4gKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuICovXG5cbmltcG9ydCB7SUZGVCwgSUZGVElucHV0cywgS2VybmVsQ29uZmlnLCBLZXJuZWxGdW5jLCBUZW5zb3JJbmZvLCB1dGlsfSBmcm9tICdAdGVuc29yZmxvdy90ZmpzLWNvcmUnO1xuXG5pbXBvcnQge01hdGhCYWNrZW5kQ1BVfSBmcm9tICcuLi9iYWNrZW5kX2NwdSc7XG5pbXBvcnQge2ZmdEJhdGNofSBmcm9tICcuLi91dGlscy9mZnRfdXRpbHMnO1xuaW1wb3J0IHtyZXNoYXBlfSBmcm9tICcuL1Jlc2hhcGUnO1xuXG5leHBvcnQgZnVuY3Rpb24gaWZmdChhcmdzOiB7aW5wdXRzOiBJRkZUSW5wdXRzLCBiYWNrZW5kOiBNYXRoQmFja2VuZENQVX0pOlxuICAgIFRlbnNvckluZm8ge1xuICBjb25zdCB7aW5wdXRzLCBiYWNrZW5kfSA9IGFyZ3M7XG4gIGNvbnN0IHtpbnB1dH0gPSBpbnB1dHM7XG5cbiAgY29uc3QgaW5wdXRTaXplID0gdXRpbC5zaXplRnJvbVNoYXBlKGlucHV0LnNoYXBlKTtcblxuICAvLyBDb2xsYXBzZSBhbGwgb3V0ZXIgZGltZW5zaW9ucyB0byBhIHNpbmdsZSBiYXRjaCBkaW1lbnNpb24uXG4gIGNvbnN0IGlubmVyRGltZW5zaW9uU2l6ZSA9IGlucHV0LnNoYXBlW2lucHV0LnNoYXBlLmxlbmd0aCAtIDFdO1xuICBjb25zdCBiYXRjaCA9IGlucHV0U2l6ZSAvIGlubmVyRGltZW5zaW9uU2l6ZTtcblxuICBjb25zdCBpbnB1dDJEID0gcmVzaGFwZSh7XG4gICAgaW5wdXRzOiB7eDogaW5wdXR9LFxuICAgIGJhY2tlbmQsXG4gICAgYXR0cnM6IHtzaGFwZTogW2JhdGNoLCBpbm5lckRpbWVuc2lvblNpemVdfVxuICB9KTtcblxuICBjb25zdCByZXN1bHQgPSBmZnRCYXRjaChpbnB1dDJELCB0cnVlLCBiYWNrZW5kKTtcblxuICBjb25zdCByZXN1bHRSZXNoYXBlZCA9XG4gICAgICByZXNoYXBlKHtpbnB1dHM6IHt4OiByZXN1bHR9LCBiYWNrZW5kLCBhdHRyczoge3NoYXBlOiBpbnB1dC5zaGFwZX19KTtcblxuICBiYWNrZW5kLmRpc3Bvc2VJbnRlcm1lZGlhdGVUZW5zb3JJbmZvKGlucHV0MkQpO1xuICBiYWNrZW5kLmRpc3Bvc2VJbnRlcm1lZGlhdGVUZW5zb3JJbmZvKHJlc3VsdCk7XG5cbiAgcmV0dXJuIHJlc3VsdFJlc2hhcGVkO1xufVxuXG5leHBvcnQgY29uc3QgaWZmdENvbmZpZzogS2VybmVsQ29uZmlnID0ge1xuICBrZXJuZWxOYW1lOiBJRkZULFxuICBiYWNrZW5kTmFtZTogJ2NwdScsXG4gIGtlcm5lbEZ1bmM6IGlmZnQgYXMge30gYXMgS2VybmVsRnVuY1xufTtcbiJdfQ==","/**\n * @license\n * Copyright 2020 Google LLC. All Rights Reserved.\n * Licensed under the Apache License, Version 2.0 (the License);\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an AS IS BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n * =============================================================================\n */\nimport { IsFinite } from '@tensorflow/tfjs-core';\nimport { unaryKernelFunc } from '../utils/unary_utils';\nexport const isFinite = unaryKernelFunc(IsFinite, (xi) => Number.isFinite(xi) ? 1 : 0, 'bool');\nexport const isFiniteConfig = {\n kernelName: IsFinite,\n backendName: 'cpu',\n kernelFunc: isFinite,\n};\n//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiSXNGaW5pdGUuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi8uLi90ZmpzLWJhY2tlbmQtY3B1L3NyYy9rZXJuZWxzL0lzRmluaXRlLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBOzs7Ozs7Ozs7Ozs7Ozs7R0FlRztBQUVILE9BQU8sRUFBQyxRQUFRLEVBQWUsTUFBTSx1QkFBdUIsQ0FBQztBQUU3RCxPQUFPLEVBQUMsZUFBZSxFQUFDLE1BQU0sc0JBQXNCLENBQUM7QUFFckQsTUFBTSxDQUFDLE1BQU0sUUFBUSxHQUNqQixlQUFlLENBQUMsUUFBUSxFQUFFLENBQUMsRUFBRSxFQUFFLEVBQUUsQ0FBQyxNQUFNLENBQUMsUUFBUSxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsRUFBRSxNQUFNLENBQUMsQ0FBQztBQUUzRSxNQUFNLENBQUMsTUFBTSxjQUFjLEdBQWlCO0lBQzFDLFVBQVUsRUFBRSxRQUFRO0lBQ3BCLFdBQVcsRUFBRSxLQUFLO0lBQ2xCLFVBQVUsRUFBRSxRQUFRO0NBQ3JCLENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyIvKipcbiAqIEBsaWNlbnNlXG4gKiBDb3B5cmlnaHQgMjAyMCBHb29nbGUgTExDLiBBbGwgUmlnaHRzIFJlc2VydmVkLlxuICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlIExpY2Vuc2UpO1xuICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLlxuICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0XG4gKlxuICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wXG4gKlxuICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZVxuICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gQVMgSVMgQkFTSVMsXG4gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC5cbiAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmRcbiAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLlxuICogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbiAqL1xuXG5pbXBvcnQge0lzRmluaXRlLCBLZXJuZWxDb25maWd9IGZyb20gJ0B0ZW5zb3JmbG93L3RmanMtY29yZSc7XG5cbmltcG9ydCB7dW5hcnlLZXJuZWxGdW5jfSBmcm9tICcuLi91dGlscy91bmFyeV91dGlscyc7XG5cbmV4cG9ydCBjb25zdCBpc0Zpbml0ZSA9XG4gICAgdW5hcnlLZXJuZWxGdW5jKElzRmluaXRlLCAoeGkpID0+IE51bWJlci5pc0Zpbml0ZSh4aSkgPyAxIDogMCwgJ2Jvb2wnKTtcblxuZXhwb3J0IGNvbnN0IGlzRmluaXRlQ29uZmlnOiBLZXJuZWxDb25maWcgPSB7XG4gIGtlcm5lbE5hbWU6IElzRmluaXRlLFxuICBiYWNrZW5kTmFtZTogJ2NwdScsXG4gIGtlcm5lbEZ1bmM6IGlzRmluaXRlLFxufTtcbiJdfQ==","/**\n * @license\n * Copyright 2020 Google LLC. All Rights Reserved.\n * Licensed under the Apache License, Version 2.0 (the License);\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an AS IS BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n * =============================================================================\n */\nimport { IsInf } from '@tensorflow/tfjs-core';\nimport { unaryKernelFunc } from '../utils/unary_utils';\nexport const isInf = unaryKernelFunc(IsInf, (xi) => Math.abs(xi) === Infinity ? 1 : 0, 'bool');\nexport const isInfConfig = {\n kernelName: IsInf,\n backendName: 'cpu',\n kernelFunc: isInf,\n};\n//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiSXNJbmYuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi8uLi90ZmpzLWJhY2tlbmQtY3B1L3NyYy9rZXJuZWxzL0lzSW5mLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBOzs7Ozs7Ozs7Ozs7Ozs7R0FlRztBQUVILE9BQU8sRUFBQyxLQUFLLEVBQWUsTUFBTSx1QkFBdUIsQ0FBQztBQUUxRCxPQUFPLEVBQUMsZUFBZSxFQUFDLE1BQU0sc0JBQXNCLENBQUM7QUFFckQsTUFBTSxDQUFDLE1BQU0sS0FBSyxHQUNkLGVBQWUsQ0FBQyxLQUFLLEVBQUUsQ0FBQyxFQUFFLEVBQUUsRUFBRSxDQUFDLElBQUksQ0FBQyxHQUFHLENBQUMsRUFBRSxDQUFDLEtBQUssUUFBUSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsRUFBRSxNQUFNLENBQUMsQ0FBQztBQUU5RSxNQUFNLENBQUMsTUFBTSxXQUFXLEdBQWlCO0lBQ3ZDLFVBQVUsRUFBRSxLQUFLO0lBQ2pCLFdBQVcsRUFBRSxLQUFLO0lBQ2xCLFVBQVUsRUFBRSxLQUFLO0NBQ2xCLENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyIvKipcbiAqIEBsaWNlbnNlXG4gKiBDb3B5cmlnaHQgMjAyMCBHb29nbGUgTExDLiBBbGwgUmlnaHRzIFJlc2VydmVkLlxuICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlIExpY2Vuc2UpO1xuICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLlxuICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0XG4gKlxuICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wXG4gKlxuICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZVxuICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gQVMgSVMgQkFTSVMsXG4gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC5cbiAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmRcbiAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLlxuICogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbiAqL1xuXG5pbXBvcnQge0lzSW5mLCBLZXJuZWxDb25maWd9IGZyb20gJ0B0ZW5zb3JmbG93L3RmanMtY29yZSc7XG5cbmltcG9ydCB7dW5hcnlLZXJuZWxGdW5jfSBmcm9tICcuLi91dGlscy91bmFyeV91dGlscyc7XG5cbmV4cG9ydCBjb25zdCBpc0luZiA9XG4gICAgdW5hcnlLZXJuZWxGdW5jKElzSW5mLCAoeGkpID0+IE1hdGguYWJzKHhpKSA9PT0gSW5maW5pdHkgPyAxIDogMCwgJ2Jvb2wnKTtcblxuZXhwb3J0IGNvbnN0IGlzSW5mQ29uZmlnOiBLZXJuZWxDb25maWcgPSB7XG4gIGtlcm5lbE5hbWU6IElzSW5mLFxuICBiYWNrZW5kTmFtZTogJ2NwdScsXG4gIGtlcm5lbEZ1bmM6IGlzSW5mLFxufTtcbiJdfQ==","/**\n * @license\n * Copyright 2020 Google LLC. All Rights Reserved.\n * Licensed under the Apache License, Version 2.0 (the License);\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an AS IS BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n * =============================================================================\n */\nimport { IsNan } from '@tensorflow/tfjs-core';\nimport { unaryKernelFunc } from '../utils/unary_utils';\nexport const isNaN = unaryKernelFunc(IsNan, (xi) => Number.isNaN(xi) ? 1 : 0, 'bool');\nexport const isNaNConfig = {\n kernelName: IsNan,\n backendName: 'cpu',\n kernelFunc: isNaN,\n};\n//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiSXNOYU4uanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi8uLi90ZmpzLWJhY2tlbmQtY3B1L3NyYy9rZXJuZWxzL0lzTmFOLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBOzs7Ozs7Ozs7Ozs7Ozs7R0FlRztBQUVILE9BQU8sRUFBQyxLQUFLLEVBQWUsTUFBTSx1QkFBdUIsQ0FBQztBQUUxRCxPQUFPLEVBQUMsZUFBZSxFQUFDLE1BQU0sc0JBQXNCLENBQUM7QUFFckQsTUFBTSxDQUFDLE1BQU0sS0FBSyxHQUNkLGVBQWUsQ0FBQyxLQUFLLEVBQUUsQ0FBQyxFQUFFLEVBQUUsRUFBRSxDQUFDLE1BQU0sQ0FBQyxLQUFLLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxFQUFFLE1BQU0sQ0FBQyxDQUFDO0FBRXJFLE1BQU0sQ0FBQyxNQUFNLFdBQVcsR0FBaUI7SUFDdkMsVUFBVSxFQUFFLEtBQUs7SUFDakIsV0FBVyxFQUFFLEtBQUs7SUFDbEIsVUFBVSxFQUFFLEtBQUs7Q0FDbEIsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbIi8qKlxuICogQGxpY2Vuc2VcbiAqIENvcHlyaWdodCAyMDIwIEdvb2dsZSBMTEMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuXG4gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgTGljZW5zZSk7XG4gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuXG4gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXRcbiAqXG4gKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjBcbiAqXG4gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlXG4gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiBBUyBJUyBCQVNJUyxcbiAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLlxuICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZFxuICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuXG4gKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuICovXG5cbmltcG9ydCB7SXNOYW4sIEtlcm5lbENvbmZpZ30gZnJvbSAnQHRlbnNvcmZsb3cvdGZqcy1jb3JlJztcblxuaW1wb3J0IHt1bmFyeUtlcm5lbEZ1bmN9IGZyb20gJy4uL3V0aWxzL3VuYXJ5X3V0aWxzJztcblxuZXhwb3J0IGNvbnN0IGlzTmFOID1cbiAgICB1bmFyeUtlcm5lbEZ1bmMoSXNOYW4sICh4aSkgPT4gTnVtYmVyLmlzTmFOKHhpKSA/IDEgOiAwLCAnYm9vbCcpO1xuXG5leHBvcnQgY29uc3QgaXNOYU5Db25maWc6IEtlcm5lbENvbmZpZyA9IHtcbiAga2VybmVsTmFtZTogSXNOYW4sXG4gIGJhY2tlbmROYW1lOiAnY3B1JyxcbiAga2VybmVsRnVuYzogaXNOYU4sXG59O1xuIl19","/**\n * @license\n * Copyright 2020 Google LLC. All Rights Reserved.\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n * =============================================================================\n */\nimport { Less } from '@tensorflow/tfjs-core';\nimport { createSimpleBinaryKernelImpl } from '../utils/binary_impl';\nimport { binaryKernelFunc } from '../utils/binary_utils';\nexport const lessImpl = createSimpleBinaryKernelImpl((a, b) => (a < b) ? 1 : 0);\nexport const less = binaryKernelFunc(Less, lessImpl, null /* complexImpl */, 'bool');\nexport const lessConfig = {\n kernelName: Less,\n backendName: 'cpu',\n kernelFunc: less\n};\n//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiTGVzcy5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uLy4uL3RmanMtYmFja2VuZC1jcHUvc3JjL2tlcm5lbHMvTGVzcy50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQTs7Ozs7Ozs7Ozs7Ozs7O0dBZUc7QUFFSCxPQUFPLEVBQWUsSUFBSSxFQUFDLE1BQU0sdUJBQXVCLENBQUM7QUFFekQsT0FBTyxFQUFDLDRCQUE0QixFQUFDLE1BQU0sc0JBQXNCLENBQUM7QUFDbEUsT0FBTyxFQUFDLGdCQUFnQixFQUFDLE1BQU0sdUJBQXVCLENBQUM7QUFFdkQsTUFBTSxDQUFDLE1BQU0sUUFBUSxHQUNqQiw0QkFBNEIsQ0FBQyxDQUFDLENBQVMsRUFBRSxDQUFTLEVBQUUsRUFBRSxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDO0FBQzVFLE1BQU0sQ0FBQyxNQUFNLElBQUksR0FDYixnQkFBZ0IsQ0FBQyxJQUFJLEVBQUUsUUFBUSxFQUFFLElBQUksQ0FBQyxpQkFBaUIsRUFBRSxNQUFNLENBQUMsQ0FBQztBQUVyRSxNQUFNLENBQUMsTUFBTSxVQUFVLEdBQWlCO0lBQ3RDLFVBQVUsRUFBRSxJQUFJO0lBQ2hCLFdBQVcsRUFBRSxLQUFLO0lBQ2xCLFVBQVUsRUFBRSxJQUFJO0NBQ2pCLENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyIvKipcbiAqIEBsaWNlbnNlXG4gKiBDb3B5cmlnaHQgMjAyMCBHb29nbGUgTExDLiBBbGwgUmlnaHRzIFJlc2VydmVkLlxuICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlIFwiTGljZW5zZVwiKTtcbiAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS5cbiAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdFxuICpcbiAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMFxuICpcbiAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmVcbiAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuIFwiQVMgSVNcIiBCQVNJUyxcbiAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLlxuICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZFxuICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuXG4gKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuICovXG5cbmltcG9ydCB7S2VybmVsQ29uZmlnLCBMZXNzfSBmcm9tICdAdGVuc29yZmxvdy90ZmpzLWNvcmUnO1xuXG5pbXBvcnQge2NyZWF0ZVNpbXBsZUJpbmFyeUtlcm5lbEltcGx9IGZyb20gJy4uL3V0aWxzL2JpbmFyeV9pbXBsJztcbmltcG9ydCB7YmluYXJ5S2VybmVsRnVuY30gZnJvbSAnLi4vdXRpbHMvYmluYXJ5X3V0aWxzJztcblxuZXhwb3J0IGNvbnN0IGxlc3NJbXBsID1cbiAgICBjcmVhdGVTaW1wbGVCaW5hcnlLZXJuZWxJbXBsKChhOiBudW1iZXIsIGI6IG51bWJlcikgPT4gKGEgPCBiKSA/IDEgOiAwKTtcbmV4cG9ydCBjb25zdCBsZXNzID1cbiAgICBiaW5hcnlLZXJuZWxGdW5jKExlc3MsIGxlc3NJbXBsLCBudWxsIC8qIGNvbXBsZXhJbXBsICovLCAnYm9vbCcpO1xuXG5leHBvcnQgY29uc3QgbGVzc0NvbmZpZzogS2VybmVsQ29uZmlnID0ge1xuICBrZXJuZWxOYW1lOiBMZXNzLFxuICBiYWNrZW5kTmFtZTogJ2NwdScsXG4gIGtlcm5lbEZ1bmM6IGxlc3Ncbn07XG4iXX0=","/**\n * @license\n * Copyright 2020 Google LLC. All Rights Reserved.\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n * =============================================================================\n */\nimport { LessEqual } from '@tensorflow/tfjs-core';\nimport { createSimpleBinaryKernelImpl } from '../utils/binary_impl';\nimport { binaryKernelFunc } from '../utils/binary_utils';\nexport const lessEqualImpl = createSimpleBinaryKernelImpl((a, b) => (a <= b) ? 1 : 0);\nexport const lessEqual = binaryKernelFunc(LessEqual, lessEqualImpl, null /* complexImpl */, 'bool');\nexport const lessEqualConfig = {\n kernelName: LessEqual,\n backendName: 'cpu',\n kernelFunc: lessEqual\n};\n//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiTGVzc0VxdWFsLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vLi4vdGZqcy1iYWNrZW5kLWNwdS9zcmMva2VybmVscy9MZXNzRXF1YWwudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUE7Ozs7Ozs7Ozs7Ozs7OztHQWVHO0FBRUgsT0FBTyxFQUFlLFNBQVMsRUFBQyxNQUFNLHVCQUF1QixDQUFDO0FBRTlELE9BQU8sRUFBQyw0QkFBNEIsRUFBQyxNQUFNLHNCQUFzQixDQUFDO0FBQ2xFLE9BQU8sRUFBQyxnQkFBZ0IsRUFBQyxNQUFNLHVCQUF1QixDQUFDO0FBRXZELE1BQU0sQ0FBQyxNQUFNLGFBQWEsR0FDdEIsNEJBQTRCLENBQUMsQ0FBQyxDQUFTLEVBQUUsQ0FBUyxFQUFFLEVBQUUsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQztBQUM3RSxNQUFNLENBQUMsTUFBTSxTQUFTLEdBQ2xCLGdCQUFnQixDQUFDLFNBQVMsRUFBRSxhQUFhLEVBQUUsSUFBSSxDQUFDLGlCQUFpQixFQUFFLE1BQU0sQ0FBQyxDQUFDO0FBRS9FLE1BQU0sQ0FBQyxNQUFNLGVBQWUsR0FBaUI7SUFDM0MsVUFBVSxFQUFFLFNBQVM7SUFDckIsV0FBVyxFQUFFLEtBQUs7SUFDbEIsVUFBVSxFQUFFLFNBQVM7Q0FDdEIsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbIi8qKlxuICogQGxpY2Vuc2VcbiAqIENvcHlyaWdodCAyMDIwIEdvb2dsZSBMTEMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuXG4gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgXCJMaWNlbnNlXCIpO1xuICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLlxuICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0XG4gKlxuICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wXG4gKlxuICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZVxuICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gXCJBUyBJU1wiIEJBU0lTLFxuICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuXG4gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kXG4gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS5cbiAqID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4gKi9cblxuaW1wb3J0IHtLZXJuZWxDb25maWcsIExlc3NFcXVhbH0gZnJvbSAnQHRlbnNvcmZsb3cvdGZqcy1jb3JlJztcblxuaW1wb3J0IHtjcmVhdGVTaW1wbGVCaW5hcnlLZXJuZWxJbXBsfSBmcm9tICcuLi91dGlscy9iaW5hcnlfaW1wbCc7XG5pbXBvcnQge2JpbmFyeUtlcm5lbEZ1bmN9IGZyb20gJy4uL3V0aWxzL2JpbmFyeV91dGlscyc7XG5cbmV4cG9ydCBjb25zdCBsZXNzRXF1YWxJbXBsID1cbiAgICBjcmVhdGVTaW1wbGVCaW5hcnlLZXJuZWxJbXBsKChhOiBudW1iZXIsIGI6IG51bWJlcikgPT4gKGEgPD0gYikgPyAxIDogMCk7XG5leHBvcnQgY29uc3QgbGVzc0VxdWFsID1cbiAgICBiaW5hcnlLZXJuZWxGdW5jKExlc3NFcXVhbCwgbGVzc0VxdWFsSW1wbCwgbnVsbCAvKiBjb21wbGV4SW1wbCAqLywgJ2Jvb2wnKTtcblxuZXhwb3J0IGNvbnN0IGxlc3NFcXVhbENvbmZpZzogS2VybmVsQ29uZmlnID0ge1xuICBrZXJuZWxOYW1lOiBMZXNzRXF1YWwsXG4gIGJhY2tlbmROYW1lOiAnY3B1JyxcbiAga2VybmVsRnVuYzogbGVzc0VxdWFsXG59O1xuIl19","/**\n * @license\n * Copyright 2020 Google LLC. All Rights Reserved.\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n * =============================================================================\n */\nimport { util } from '@tensorflow/tfjs-core';\nexport function linSpaceImpl(start, stop, num) {\n const step = (stop - start) / (num - 1);\n const values = util.makeZerosTypedArray(num, 'float32');\n values[0] = start;\n for (let i = 1; i < values.length; i++) {\n values[i] = values[i - 1] + step;\n }\n return values;\n}\n//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiTGluU3BhY2VfaW1wbC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uLy4uL3RmanMtYmFja2VuZC1jcHUvc3JjL2tlcm5lbHMvTGluU3BhY2VfaW1wbC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQTs7Ozs7Ozs7Ozs7Ozs7O0dBZUc7QUFFSCxPQUFPLEVBQWEsSUFBSSxFQUFDLE1BQU0sdUJBQXVCLENBQUM7QUFFdkQsTUFBTSxVQUFVLFlBQVksQ0FDeEIsS0FBYSxFQUFFLElBQVksRUFBRSxHQUFXO0lBQzFDLE1BQU0sSUFBSSxHQUFHLENBQUMsSUFBSSxHQUFHLEtBQUssQ0FBQyxHQUFHLENBQUMsR0FBRyxHQUFHLENBQUMsQ0FBQyxDQUFDO0lBRXhDLE1BQU0sTUFBTSxHQUFHLElBQUksQ0FBQyxtQkFBbUIsQ0FBQyxHQUFHLEVBQUUsU0FBUyxDQUFDLENBQUM7SUFDeEQsTUFBTSxDQUFDLENBQUMsQ0FBQyxHQUFHLEtBQUssQ0FBQztJQUNsQixLQUFLLElBQUksQ0FBQyxHQUFHLENBQUMsRUFBRSxDQUFDLEdBQUcsTUFBTSxDQUFDLE1BQU0sRUFBRSxDQUFDLEVBQUUsRUFBRTtRQUN0QyxNQUFNLENBQUMsQ0FBQyxDQUFDLEdBQUcsTUFBTSxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsR0FBRyxJQUFJLENBQUM7S0FDbEM7SUFFRCxPQUFPLE1BQU0sQ0FBQztBQUNoQixDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiLyoqXG4gKiBAbGljZW5zZVxuICogQ29weXJpZ2h0IDIwMjAgR29vZ2xlIExMQy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC5cbiAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSBcIkxpY2Vuc2VcIik7XG4gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuXG4gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXRcbiAqXG4gKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjBcbiAqXG4gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlXG4gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiBcIkFTIElTXCIgQkFTSVMsXG4gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC5cbiAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmRcbiAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLlxuICogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbiAqL1xuXG5pbXBvcnQge1R5cGVkQXJyYXksIHV0aWx9IGZyb20gJ0B0ZW5zb3JmbG93L3RmanMtY29yZSc7XG5cbmV4cG9ydCBmdW5jdGlvbiBsaW5TcGFjZUltcGwoXG4gICAgc3RhcnQ6IG51bWJlciwgc3RvcDogbnVtYmVyLCBudW06IG51bWJlcik6IFR5cGVkQXJyYXkge1xuICBjb25zdCBzdGVwID0gKHN0b3AgLSBzdGFydCkgLyAobnVtIC0gMSk7XG5cbiAgY29uc3QgdmFsdWVzID0gdXRpbC5tYWtlWmVyb3NUeXBlZEFycmF5KG51bSwgJ2Zsb2F0MzInKTtcbiAgdmFsdWVzWzBdID0gc3RhcnQ7XG4gIGZvciAobGV0IGkgPSAxOyBpIDwgdmFsdWVzLmxlbmd0aDsgaSsrKSB7XG4gICAgdmFsdWVzW2ldID0gdmFsdWVzW2kgLSAxXSArIHN0ZXA7XG4gIH1cblxuICByZXR1cm4gdmFsdWVzO1xufVxuIl19","/**\n * @license\n * Copyright 2020 Google LLC. All Rights Reserved.\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n * =============================================================================\n */\nimport { LinSpace } from '@tensorflow/tfjs-core';\nimport { linSpaceImpl } from './LinSpace_impl';\nexport function linSpace(args) {\n const { backend, attrs } = args;\n const { start, stop, num } = attrs;\n const outVals = linSpaceImpl(start, stop, num);\n return backend.makeTensorInfo([outVals.length], 'float32', outVals);\n}\nexport const linSpaceConfig = {\n kernelName: LinSpace,\n backendName: 'cpu',\n kernelFunc: linSpace\n};\n//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiTGluU3BhY2UuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi8uLi90ZmpzLWJhY2tlbmQtY3B1L3NyYy9rZXJuZWxzL0xpblNwYWNlLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBOzs7Ozs7Ozs7Ozs7Ozs7R0FlRztBQUVILE9BQU8sRUFBMkIsUUFBUSxFQUE0QixNQUFNLHVCQUF1QixDQUFDO0FBR3BHLE9BQU8sRUFBQyxZQUFZLEVBQUMsTUFBTSxpQkFBaUIsQ0FBQztBQUU3QyxNQUFNLFVBQVUsUUFBUSxDQUFDLElBQXFEO0lBRTVFLE1BQU0sRUFBQyxPQUFPLEVBQUUsS0FBSyxFQUFDLEdBQUcsSUFBSSxDQUFDO0lBQzlCLE1BQU0sRUFBQyxLQUFLLEVBQUUsSUFBSSxFQUFFLEdBQUcsRUFBQyxHQUFHLEtBQUssQ0FBQztJQUVqQyxNQUFNLE9BQU8sR0FBRyxZQUFZLENBQUMsS0FBSyxFQUFFLElBQUksRUFBRSxHQUFHLENBQUMsQ0FBQztJQUUvQyxPQUFPLE9BQU8sQ0FBQyxjQUFjLENBQUMsQ0FBQyxPQUFPLENBQUMsTUFBTSxDQUFDLEVBQUUsU0FBUyxFQUFFLE9BQU8sQ0FBQyxDQUFDO0FBQ3RFLENBQUM7QUFFRCxNQUFNLENBQUMsTUFBTSxjQUFjLEdBQWlCO0lBQzFDLFVBQVUsRUFBRSxRQUFRO0lBQ3BCLFdBQVcsRUFBRSxLQUFLO0lBQ2xCLFVBQVUsRUFBRSxRQUE0QjtDQUN6QyxDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiLyoqXG4gKiBAbGljZW5zZVxuICogQ29weXJpZ2h0IDIwMjAgR29vZ2xlIExMQy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC5cbiAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSBcIkxpY2Vuc2VcIik7XG4gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuXG4gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXRcbiAqXG4gKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjBcbiAqXG4gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlXG4gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiBcIkFTIElTXCIgQkFTSVMsXG4gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC5cbiAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmRcbiAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLlxuICogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbiAqL1xuXG5pbXBvcnQge0tlcm5lbENvbmZpZywgS2VybmVsRnVuYywgTGluU3BhY2UsIExpblNwYWNlQXR0cnMsIFRlbnNvckluZm99IGZyb20gJ0B0ZW5zb3JmbG93L3RmanMtY29yZSc7XG5cbmltcG9ydCB7TWF0aEJhY2tlbmRDUFV9IGZyb20gJy4uL2JhY2tlbmRfY3B1JztcbmltcG9ydCB7bGluU3BhY2VJbXBsfSBmcm9tICcuL0xpblNwYWNlX2ltcGwnO1xuXG5leHBvcnQgZnVuY3Rpb24gbGluU3BhY2UoYXJnczoge2JhY2tlbmQ6IE1hdGhCYWNrZW5kQ1BVLCBhdHRyczogTGluU3BhY2VBdHRyc30pOlxuICAgIFRlbnNvckluZm8ge1xuICBjb25zdCB7YmFja2VuZCwgYXR0cnN9ID0gYXJncztcbiAgY29uc3Qge3N0YXJ0LCBzdG9wLCBudW19ID0gYXR0cnM7XG5cbiAgY29uc3Qgb3V0VmFscyA9IGxpblNwYWNlSW1wbChzdGFydCwgc3RvcCwgbnVtKTtcblxuICByZXR1cm4gYmFja2VuZC5tYWtlVGVuc29ySW5mbyhbb3V0VmFscy5sZW5ndGhdLCAnZmxvYXQzMicsIG91dFZhbHMpO1xufVxuXG5leHBvcnQgY29uc3QgbGluU3BhY2VDb25maWc6IEtlcm5lbENvbmZpZyA9IHtcbiAga2VybmVsTmFtZTogTGluU3BhY2UsXG4gIGJhY2tlbmROYW1lOiAnY3B1JyxcbiAga2VybmVsRnVuYzogbGluU3BhY2UgYXMge30gYXMgS2VybmVsRnVuY1xufTtcbiJdfQ==","/**\n * @license\n * Copyright 2020 Google LLC. All Rights Reserved.\n * Licensed under the Apache License, Version 2.0 (the License);\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an AS IS BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n * =============================================================================\n */\nimport { Log } from '@tensorflow/tfjs-core';\nimport { createSimpleUnaryImpl } from '../utils/unary_impl';\nimport { unaryKernelFuncFromImpl } from '../utils/unary_utils';\nexport const logImpl = createSimpleUnaryImpl((xi) => Math.log(xi));\nexport const log = unaryKernelFuncFromImpl(Log, logImpl);\nexport const logConfig = {\n kernelName: Log,\n backendName: 'cpu',\n kernelFunc: log,\n};\n//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiTG9nLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vLi4vdGZqcy1iYWNrZW5kLWNwdS9zcmMva2VybmVscy9Mb2cudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUE7Ozs7Ozs7Ozs7Ozs7OztHQWVHO0FBRUgsT0FBTyxFQUFlLEdBQUcsRUFBQyxNQUFNLHVCQUF1QixDQUFDO0FBRXhELE9BQU8sRUFBQyxxQkFBcUIsRUFBQyxNQUFNLHFCQUFxQixDQUFDO0FBQzFELE9BQU8sRUFBQyx1QkFBdUIsRUFBQyxNQUFNLHNCQUFzQixDQUFDO0FBRTdELE1BQU0sQ0FBQyxNQUFNLE9BQU8sR0FBRyxxQkFBcUIsQ0FBQyxDQUFDLEVBQUUsRUFBRSxFQUFFLENBQUMsSUFBSSxDQUFDLEdBQUcsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDO0FBQ25FLE1BQU0sQ0FBQyxNQUFNLEdBQUcsR0FBRyx1QkFBdUIsQ0FBQyxHQUFHLEVBQUUsT0FBTyxDQUFDLENBQUM7QUFFekQsTUFBTSxDQUFDLE1BQU0sU0FBUyxHQUFpQjtJQUNyQyxVQUFVLEVBQUUsR0FBRztJQUNmLFdBQVcsRUFBRSxLQUFLO0lBQ2xCLFVBQVUsRUFBRSxHQUFHO0NBQ2hCLENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyIvKipcbiAqIEBsaWNlbnNlXG4gKiBDb3B5cmlnaHQgMjAyMCBHb29nbGUgTExDLiBBbGwgUmlnaHRzIFJlc2VydmVkLlxuICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlIExpY2Vuc2UpO1xuICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLlxuICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0XG4gKlxuICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wXG4gKlxuICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZVxuICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gQVMgSVMgQkFTSVMsXG4gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC5cbiAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmRcbiAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLlxuICogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbiAqL1xuXG5pbXBvcnQge0tlcm5lbENvbmZpZywgTG9nfSBmcm9tICdAdGVuc29yZmxvdy90ZmpzLWNvcmUnO1xuXG5pbXBvcnQge2NyZWF0ZVNpbXBsZVVuYXJ5SW1wbH0gZnJvbSAnLi4vdXRpbHMvdW5hcnlfaW1wbCc7XG5pbXBvcnQge3VuYXJ5S2VybmVsRnVuY0Zyb21JbXBsfSBmcm9tICcuLi91dGlscy91bmFyeV91dGlscyc7XG5cbmV4cG9ydCBjb25zdCBsb2dJbXBsID0gY3JlYXRlU2ltcGxlVW5hcnlJbXBsKCh4aSkgPT4gTWF0aC5sb2coeGkpKTtcbmV4cG9ydCBjb25zdCBsb2cgPSB1bmFyeUtlcm5lbEZ1bmNGcm9tSW1wbChMb2csIGxvZ0ltcGwpO1xuXG5leHBvcnQgY29uc3QgbG9nQ29uZmlnOiBLZXJuZWxDb25maWcgPSB7XG4gIGtlcm5lbE5hbWU6IExvZyxcbiAgYmFja2VuZE5hbWU6ICdjcHUnLFxuICBrZXJuZWxGdW5jOiBsb2csXG59O1xuIl19","/**\n * @license\n * Copyright 2020 Google LLC. All Rights Reserved.\n * Licensed under the Apache License, Version 2.0 (the License);\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an AS IS BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n * =============================================================================\n */\nimport { Log1p } from '@tensorflow/tfjs-core';\nimport { unaryKernelFunc } from '../utils/unary_utils';\nexport const log1p = unaryKernelFunc(Log1p, (xi) => Math.log1p(xi));\nexport const log1pConfig = {\n kernelName: Log1p,\n backendName: 'cpu',\n kernelFunc: log1p,\n};\n//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiTG9nMXAuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi8uLi90ZmpzLWJhY2tlbmQtY3B1L3NyYy9rZXJuZWxzL0xvZzFwLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBOzs7Ozs7Ozs7Ozs7Ozs7R0FlRztBQUVILE9BQU8sRUFBZSxLQUFLLEVBQUMsTUFBTSx1QkFBdUIsQ0FBQztBQUUxRCxPQUFPLEVBQUMsZUFBZSxFQUFDLE1BQU0sc0JBQXNCLENBQUM7QUFFckQsTUFBTSxDQUFDLE1BQU0sS0FBSyxHQUFHLGVBQWUsQ0FBQyxLQUFLLEVBQUUsQ0FBQyxFQUFFLEVBQUUsRUFBRSxDQUFDLElBQUksQ0FBQyxLQUFLLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQztBQUVwRSxNQUFNLENBQUMsTUFBTSxXQUFXLEdBQWlCO0lBQ3ZDLFVBQVUsRUFBRSxLQUFLO0lBQ2pCLFdBQVcsRUFBRSxLQUFLO0lBQ2xCLFVBQVUsRUFBRSxLQUFLO0NBQ2xCLENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyIvKipcbiAqIEBsaWNlbnNlXG4gKiBDb3B5cmlnaHQgMjAyMCBHb29nbGUgTExDLiBBbGwgUmlnaHRzIFJlc2VydmVkLlxuICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlIExpY2Vuc2UpO1xuICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLlxuICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0XG4gKlxuICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wXG4gKlxuICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZVxuICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gQVMgSVMgQkFTSVMsXG4gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC5cbiAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmRcbiAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLlxuICogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbiAqL1xuXG5pbXBvcnQge0tlcm5lbENvbmZpZywgTG9nMXB9IGZyb20gJ0B0ZW5zb3JmbG93L3RmanMtY29yZSc7XG5cbmltcG9ydCB7dW5hcnlLZXJuZWxGdW5jfSBmcm9tICcuLi91dGlscy91bmFyeV91dGlscyc7XG5cbmV4cG9ydCBjb25zdCBsb2cxcCA9IHVuYXJ5S2VybmVsRnVuYyhMb2cxcCwgKHhpKSA9PiBNYXRoLmxvZzFwKHhpKSk7XG5cbmV4cG9ydCBjb25zdCBsb2cxcENvbmZpZzogS2VybmVsQ29uZmlnID0ge1xuICBrZXJuZWxOYW1lOiBMb2cxcCxcbiAgYmFja2VuZE5hbWU6ICdjcHUnLFxuICBrZXJuZWxGdW5jOiBsb2cxcCxcbn07XG4iXX0=","/**\n * @license\n * Copyright 2020 Google LLC. All Rights Reserved.\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n * =============================================================================\n */\nimport { LogicalAnd } from '@tensorflow/tfjs-core';\nimport { createSimpleBinaryKernelImpl } from '../utils/binary_impl';\nimport { binaryKernelFunc } from '../utils/binary_utils';\nexport const logicalAndImpl = createSimpleBinaryKernelImpl((a, b) => a && b);\nexport const logicalAnd = binaryKernelFunc(LogicalAnd, logicalAndImpl, null /* complexImpl */, 'bool');\nexport const logicalAndConfig = {\n kernelName: LogicalAnd,\n backendName: 'cpu',\n kernelFunc: logicalAnd\n};\n//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiTG9naWNhbEFuZC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uLy4uL3RmanMtYmFja2VuZC1jcHUvc3JjL2tlcm5lbHMvTG9naWNhbEFuZC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQTs7Ozs7Ozs7Ozs7Ozs7O0dBZUc7QUFFSCxPQUFPLEVBQWUsVUFBVSxFQUFDLE1BQU0sdUJBQXVCLENBQUM7QUFFL0QsT0FBTyxFQUFDLDRCQUE0QixFQUFDLE1BQU0sc0JBQXNCLENBQUM7QUFDbEUsT0FBTyxFQUFDLGdCQUFnQixFQUFDLE1BQU0sdUJBQXVCLENBQUM7QUFFdkQsTUFBTSxDQUFDLE1BQU0sY0FBYyxHQUN2Qiw0QkFBNEIsQ0FBQyxDQUFDLENBQVMsRUFBRSxDQUFTLEVBQUUsRUFBRSxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQztBQUNuRSxNQUFNLENBQUMsTUFBTSxVQUFVLEdBQUcsZ0JBQWdCLENBQ3RDLFVBQVUsRUFBRSxjQUFjLEVBQUUsSUFBSSxDQUFDLGlCQUFpQixFQUFFLE1BQU0sQ0FBQyxDQUFDO0FBRWhFLE1BQU0sQ0FBQyxNQUFNLGdCQUFnQixHQUFpQjtJQUM1QyxVQUFVLEVBQUUsVUFBVTtJQUN0QixXQUFXLEVBQUUsS0FBSztJQUNsQixVQUFVLEVBQUUsVUFBVTtDQUN2QixDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiLyoqXG4gKiBAbGljZW5zZVxuICogQ29weXJpZ2h0IDIwMjAgR29vZ2xlIExMQy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC5cbiAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSBcIkxpY2Vuc2VcIik7XG4gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuXG4gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXRcbiAqXG4gKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjBcbiAqXG4gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlXG4gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiBcIkFTIElTXCIgQkFTSVMsXG4gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC5cbiAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmRcbiAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLlxuICogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbiAqL1xuXG5pbXBvcnQge0tlcm5lbENvbmZpZywgTG9naWNhbEFuZH0gZnJvbSAnQHRlbnNvcmZsb3cvdGZqcy1jb3JlJztcblxuaW1wb3J0IHtjcmVhdGVTaW1wbGVCaW5hcnlLZXJuZWxJbXBsfSBmcm9tICcuLi91dGlscy9iaW5hcnlfaW1wbCc7XG5pbXBvcnQge2JpbmFyeUtlcm5lbEZ1bmN9IGZyb20gJy4uL3V0aWxzL2JpbmFyeV91dGlscyc7XG5cbmV4cG9ydCBjb25zdCBsb2dpY2FsQW5kSW1wbCA9XG4gICAgY3JlYXRlU2ltcGxlQmluYXJ5S2VybmVsSW1wbCgoYTogbnVtYmVyLCBiOiBudW1iZXIpID0+IGEgJiYgYik7XG5leHBvcnQgY29uc3QgbG9naWNhbEFuZCA9IGJpbmFyeUtlcm5lbEZ1bmMoXG4gICAgTG9naWNhbEFuZCwgbG9naWNhbEFuZEltcGwsIG51bGwgLyogY29tcGxleEltcGwgKi8sICdib29sJyk7XG5cbmV4cG9ydCBjb25zdCBsb2dpY2FsQW5kQ29uZmlnOiBLZXJuZWxDb25maWcgPSB7XG4gIGtlcm5lbE5hbWU6IExvZ2ljYWxBbmQsXG4gIGJhY2tlbmROYW1lOiAnY3B1JyxcbiAga2VybmVsRnVuYzogbG9naWNhbEFuZFxufTtcbiJdfQ==","/**\n * @license\n * Copyright 2020 Google LLC. All Rights Reserved.\n * Licensed under the Apache License, Version 2.0 (the License);\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an AS IS BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n * =============================================================================\n */\nimport { LogicalNot } from '@tensorflow/tfjs-core';\nimport { unaryKernelFunc } from '../utils/unary_utils';\nexport const logicalNot = unaryKernelFunc(LogicalNot, (xi) => xi ? 0 : 1, 'bool');\nexport const logicalNotConfig = {\n kernelName: LogicalNot,\n backendName: 'cpu',\n kernelFunc: logicalNot,\n};\n//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiTG9naWNhbE5vdC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uLy4uL3RmanMtYmFja2VuZC1jcHUvc3JjL2tlcm5lbHMvTG9naWNhbE5vdC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQTs7Ozs7Ozs7Ozs7Ozs7O0dBZUc7QUFFSCxPQUFPLEVBQWUsVUFBVSxFQUFDLE1BQU0sdUJBQXVCLENBQUM7QUFFL0QsT0FBTyxFQUFDLGVBQWUsRUFBQyxNQUFNLHNCQUFzQixDQUFDO0FBRXJELE1BQU0sQ0FBQyxNQUFNLFVBQVUsR0FDbkIsZUFBZSxDQUFDLFVBQVUsRUFBRSxDQUFDLEVBQUUsRUFBRSxFQUFFLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsRUFBRSxNQUFNLENBQUMsQ0FBQztBQUU1RCxNQUFNLENBQUMsTUFBTSxnQkFBZ0IsR0FBaUI7SUFDNUMsVUFBVSxFQUFFLFVBQVU7SUFDdEIsV0FBVyxFQUFFLEtBQUs7SUFDbEIsVUFBVSxFQUFFLFVBQVU7Q0FDdkIsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbIi8qKlxuICogQGxpY2Vuc2VcbiAqIENvcHlyaWdodCAyMDIwIEdvb2dsZSBMTEMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuXG4gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgTGljZW5zZSk7XG4gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuXG4gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXRcbiAqXG4gKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjBcbiAqXG4gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlXG4gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiBBUyBJUyBCQVNJUyxcbiAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLlxuICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZFxuICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuXG4gKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuICovXG5cbmltcG9ydCB7S2VybmVsQ29uZmlnLCBMb2dpY2FsTm90fSBmcm9tICdAdGVuc29yZmxvdy90ZmpzLWNvcmUnO1xuXG5pbXBvcnQge3VuYXJ5S2VybmVsRnVuY30gZnJvbSAnLi4vdXRpbHMvdW5hcnlfdXRpbHMnO1xuXG5leHBvcnQgY29uc3QgbG9naWNhbE5vdCA9XG4gICAgdW5hcnlLZXJuZWxGdW5jKExvZ2ljYWxOb3QsICh4aSkgPT4geGkgPyAwIDogMSwgJ2Jvb2wnKTtcblxuZXhwb3J0IGNvbnN0IGxvZ2ljYWxOb3RDb25maWc6IEtlcm5lbENvbmZpZyA9IHtcbiAga2VybmVsTmFtZTogTG9naWNhbE5vdCxcbiAgYmFja2VuZE5hbWU6ICdjcHUnLFxuICBrZXJuZWxGdW5jOiBsb2dpY2FsTm90LFxufTtcbiJdfQ==","/**\n * @license\n * Copyright 2020 Google LLC. All Rights Reserved.\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n * =============================================================================\n */\nimport { LogicalOr } from '@tensorflow/tfjs-core';\nimport { createSimpleBinaryKernelImpl } from '../utils/binary_impl';\nimport { binaryKernelFunc } from '../utils/binary_utils';\nexport const logicalOrImpl = createSimpleBinaryKernelImpl((a, b) => a || b);\nexport const logicalOr = binaryKernelFunc(LogicalOr, logicalOrImpl, null /* complexImpl */, 'bool');\nexport const logicalOrConfig = {\n kernelName: LogicalOr,\n backendName: 'cpu',\n kernelFunc: logicalOr\n};\n//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiTG9naWNhbE9yLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vLi4vdGZqcy1iYWNrZW5kLWNwdS9zcmMva2VybmVscy9Mb2dpY2FsT3IudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUE7Ozs7Ozs7Ozs7Ozs7OztHQWVHO0FBRUgsT0FBTyxFQUFlLFNBQVMsRUFBQyxNQUFNLHVCQUF1QixDQUFDO0FBRTlELE9BQU8sRUFBQyw0QkFBNEIsRUFBQyxNQUFNLHNCQUFzQixDQUFDO0FBQ2xFLE9BQU8sRUFBQyxnQkFBZ0IsRUFBQyxNQUFNLHVCQUF1QixDQUFDO0FBRXZELE1BQU0sQ0FBQyxNQUFNLGFBQWEsR0FDdEIsNEJBQTRCLENBQUMsQ0FBQyxDQUFTLEVBQUUsQ0FBUyxFQUFFLEVBQUUsQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUM7QUFDbkUsTUFBTSxDQUFDLE1BQU0sU0FBUyxHQUNsQixnQkFBZ0IsQ0FBQyxTQUFTLEVBQUUsYUFBYSxFQUFFLElBQUksQ0FBQyxpQkFBaUIsRUFBRSxNQUFNLENBQUMsQ0FBQztBQUUvRSxNQUFNLENBQUMsTUFBTSxlQUFlLEdBQWlCO0lBQzNDLFVBQVUsRUFBRSxTQUFTO0lBQ3JCLFdBQVcsRUFBRSxLQUFLO0lBQ2xCLFVBQVUsRUFBRSxTQUFTO0NBQ3RCLENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyIvKipcbiAqIEBsaWNlbnNlXG4gKiBDb3B5cmlnaHQgMjAyMCBHb29nbGUgTExDLiBBbGwgUmlnaHRzIFJlc2VydmVkLlxuICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlIFwiTGljZW5zZVwiKTtcbiAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS5cbiAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdFxuICpcbiAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMFxuICpcbiAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmVcbiAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuIFwiQVMgSVNcIiBCQVNJUyxcbiAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLlxuICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZFxuICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuXG4gKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuICovXG5cbmltcG9ydCB7S2VybmVsQ29uZmlnLCBMb2dpY2FsT3J9IGZyb20gJ0B0ZW5zb3JmbG93L3RmanMtY29yZSc7XG5cbmltcG9ydCB7Y3JlYXRlU2ltcGxlQmluYXJ5S2VybmVsSW1wbH0gZnJvbSAnLi4vdXRpbHMvYmluYXJ5X2ltcGwnO1xuaW1wb3J0IHtiaW5hcnlLZXJuZWxGdW5jfSBmcm9tICcuLi91dGlscy9iaW5hcnlfdXRpbHMnO1xuXG5leHBvcnQgY29uc3QgbG9naWNhbE9ySW1wbCA9XG4gICAgY3JlYXRlU2ltcGxlQmluYXJ5S2VybmVsSW1wbCgoYTogbnVtYmVyLCBiOiBudW1iZXIpID0+IGEgfHwgYik7XG5leHBvcnQgY29uc3QgbG9naWNhbE9yID1cbiAgICBiaW5hcnlLZXJuZWxGdW5jKExvZ2ljYWxPciwgbG9naWNhbE9ySW1wbCwgbnVsbCAvKiBjb21wbGV4SW1wbCAqLywgJ2Jvb2wnKTtcblxuZXhwb3J0IGNvbnN0IGxvZ2ljYWxPckNvbmZpZzogS2VybmVsQ29uZmlnID0ge1xuICBrZXJuZWxOYW1lOiBMb2dpY2FsT3IsXG4gIGJhY2tlbmROYW1lOiAnY3B1JyxcbiAga2VybmVsRnVuYzogbG9naWNhbE9yXG59O1xuIl19","/**\n * @license\n * Copyright 2020 Google LLC. All Rights Reserved.\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n * =============================================================================\n */\nimport { LRN, util } from '@tensorflow/tfjs-core';\nimport { assertNotComplex } from '../cpu_util';\nexport function lRN(args) {\n const { inputs, backend, attrs } = args;\n const { x } = inputs;\n const { depthRadius, bias, alpha, beta } = attrs;\n assertNotComplex(x, 'LRN');\n const channels = x.shape[3];\n const maxD = channels - 1;\n const xValues = backend.data.get(x.dataId).values;\n const size = util.sizeFromShape(x.shape);\n const result = new Float32Array(size);\n function sumAcrossChannels(offset) {\n const currentChannel = offset % channels;\n let beginSumOffset = offset - currentChannel + Math.max(0, currentChannel - depthRadius);\n const endSumOffset = offset - currentChannel + Math.min(currentChannel + depthRadius, maxD);\n let sum = 0.0;\n for (; beginSumOffset <= endSumOffset; beginSumOffset++) {\n const z = xValues[beginSumOffset];\n sum += z * z;\n }\n return sum;\n }\n for (let offset = 0; offset < size; offset++) {\n const sum = sumAcrossChannels(offset);\n const val = xValues[offset] * Math.pow(bias + alpha * sum, -beta);\n result[offset] = val;\n }\n return backend.makeTensorInfo(x.shape, x.dtype, result);\n}\n// tslint:disable-next-line: variable-name\nexport const LRNConfig = {\n kernelName: LRN,\n backendName: 'cpu',\n kernelFunc: lRN\n};\n//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiTFJOLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vLi4vdGZqcy1iYWNrZW5kLWNwdS9zcmMva2VybmVscy9MUk4udHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUE7Ozs7Ozs7Ozs7Ozs7OztHQWVHO0FBRUgsT0FBTyxFQUEyQixHQUFHLEVBQStDLElBQUksRUFBQyxNQUFNLHVCQUF1QixDQUFDO0FBR3ZILE9BQU8sRUFBQyxnQkFBZ0IsRUFBQyxNQUFNLGFBQWEsQ0FBQztBQUU3QyxNQUFNLFVBQVUsR0FBRyxDQUNmLElBQW1FO0lBRXJFLE1BQU0sRUFBQyxNQUFNLEVBQUUsT0FBTyxFQUFFLEtBQUssRUFBQyxHQUFHLElBQUksQ0FBQztJQUN0QyxNQUFNLEVBQUMsQ0FBQyxFQUFDLEdBQUcsTUFBTSxDQUFDO0lBQ25CLE1BQU0sRUFBQyxXQUFXLEVBQUUsSUFBSSxFQUFFLEtBQUssRUFBRSxJQUFJLEVBQUMsR0FBRyxLQUFLLENBQUM7SUFFL0MsZ0JBQWdCLENBQUMsQ0FBQyxFQUFFLEtBQUssQ0FBQyxDQUFDO0lBRTNCLE1BQU0sUUFBUSxHQUFHLENBQUMsQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDLENBQUM7SUFDNUIsTUFBTSxJQUFJLEdBQUcsUUFBUSxHQUFHLENBQUMsQ0FBQztJQUMxQixNQUFNLE9BQU8sR0FBRyxPQUFPLENBQUMsSUFBSSxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsTUFBTSxDQUFDLENBQUMsTUFBb0IsQ0FBQztJQUNoRSxNQUFNLElBQUksR0FBRyxJQUFJLENBQUMsYUFBYSxDQUFDLENBQUMsQ0FBQyxLQUFLLENBQUMsQ0FBQztJQUN6QyxNQUFNLE1BQU0sR0FBRyxJQUFJLFlBQVksQ0FBQyxJQUFJLENBQUMsQ0FBQztJQUV0QyxTQUFTLGlCQUFpQixDQUFDLE1BQWM7UUFDdkMsTUFBTSxjQUFjLEdBQUcsTUFBTSxHQUFHLFFBQVEsQ0FBQztRQUN6QyxJQUFJLGNBQWMsR0FDZCxNQUFNLEdBQUcsY0FBYyxHQUFHLElBQUksQ0FBQyxHQUFHLENBQUMsQ0FBQyxFQUFFLGNBQWMsR0FBRyxXQUFXLENBQUMsQ0FBQztRQUN4RSxNQUFNLFlBQVksR0FDZCxNQUFNLEdBQUcsY0FBYyxHQUFHLElBQUksQ0FBQyxHQUFHLENBQUMsY0FBYyxHQUFHLFdBQVcsRUFBRSxJQUFJLENBQUMsQ0FBQztRQUUzRSxJQUFJLEdBQUcsR0FBRyxHQUFHLENBQUM7UUFDZCxPQUFPLGNBQWMsSUFBSSxZQUFZLEVBQUUsY0FBYyxFQUFFLEVBQUU7WUFDdkQsTUFBTSxDQUFDLEdBQUcsT0FBTyxDQUFDLGNBQWMsQ0FBQyxDQUFDO1lBQ2xDLEdBQUcsSUFBSSxDQUFDLEdBQUcsQ0FBQyxDQUFDO1NBQ2Q7UUFDRCxPQUFPLEdBQUcsQ0FBQztJQUNiLENBQUM7SUFFRCxLQUFLLElBQUksTUFBTSxHQUFHLENBQUMsRUFBRSxNQUFNLEdBQUcsSUFBSSxFQUFFLE1BQU0sRUFBRSxFQUFFO1FBQzVDLE1BQU0sR0FBRyxHQUFHLGlCQUFpQixDQUFDLE1BQU0sQ0FBQyxDQUFDO1FBQ3RDLE1BQU0sR0FBRyxHQUFHLE9BQU8sQ0FBQyxNQUFNLENBQUMsR0FBRyxJQUFJLENBQUMsR0FBRyxDQUFDLElBQUksR0FBRyxLQUFLLEdBQUcsR0FBRyxFQUFFLENBQUMsSUFBSSxDQUFDLENBQUM7UUFDbEUsTUFBTSxDQUFDLE1BQU0sQ0FBQyxHQUFHLEdBQUcsQ0FBQztLQUN0QjtJQUVELE9BQU8sT0FBTyxDQUFDLGNBQWMsQ0FBQyxDQUFDLENBQUMsS0FBSyxFQUFFLENBQUMsQ0FBQyxLQUFLLEVBQUUsTUFBTSxDQUFDLENBQUM7QUFDMUQsQ0FBQztBQUVELDBDQUEwQztBQUMxQyxNQUFNLENBQUMsTUFBTSxTQUFTLEdBQWlCO0lBQ3JDLFVBQVUsRUFBRSxHQUFHO0lBQ2YsV0FBVyxFQUFFLEtBQUs7SUFDbEIsVUFBVSxFQUFFLEdBQXVCO0NBQ3BDLENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyIvKipcbiAqIEBsaWNlbnNlXG4gKiBDb3B5cmlnaHQgMjAyMCBHb29nbGUgTExDLiBBbGwgUmlnaHRzIFJlc2VydmVkLlxuICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlIFwiTGljZW5zZVwiKTtcbiAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS5cbiAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdFxuICpcbiAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMFxuICpcbiAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmVcbiAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuIFwiQVMgSVNcIiBCQVNJUyxcbiAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLlxuICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZFxuICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuXG4gKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuICovXG5cbmltcG9ydCB7S2VybmVsQ29uZmlnLCBLZXJuZWxGdW5jLCBMUk4sIExSTkF0dHJzLCBMUk5JbnB1dHMsIFRlbnNvckluZm8sIFR5cGVkQXJyYXksIHV0aWx9IGZyb20gJ0B0ZW5zb3JmbG93L3RmanMtY29yZSc7XG5cbmltcG9ydCB7TWF0aEJhY2tlbmRDUFV9IGZyb20gJy4uL2JhY2tlbmRfY3B1JztcbmltcG9ydCB7YXNzZXJ0Tm90Q29tcGxleH0gZnJvbSAnLi4vY3B1X3V0aWwnO1xuXG5leHBvcnQgZnVuY3Rpb24gbFJOKFxuICAgIGFyZ3M6IHtpbnB1dHM6IExSTklucHV0cywgYmFja2VuZDogTWF0aEJhY2tlbmRDUFUsIGF0dHJzOiBMUk5BdHRyc30pOlxuICAgIFRlbnNvckluZm8ge1xuICBjb25zdCB7aW5wdXRzLCBiYWNrZW5kLCBhdHRyc30gPSBhcmdzO1xuICBjb25zdCB7eH0gPSBpbnB1dHM7XG4gIGNvbnN0IHtkZXB0aFJhZGl1cywgYmlhcywgYWxwaGEsIGJldGF9ID0gYXR0cnM7XG5cbiAgYXNzZXJ0Tm90Q29tcGxleCh4LCAnTFJOJyk7XG5cbiAgY29uc3QgY2hhbm5lbHMgPSB4LnNoYXBlWzNdO1xuICBjb25zdCBtYXhEID0gY2hhbm5lbHMgLSAxO1xuICBjb25zdCB4VmFsdWVzID0gYmFja2VuZC5kYXRhLmdldCh4LmRhdGFJZCkudmFsdWVzIGFzIFR5cGVkQXJyYXk7XG4gIGNvbnN0IHNpemUgPSB1dGlsLnNpemVGcm9tU2hhcGUoeC5zaGFwZSk7XG4gIGNvbnN0IHJlc3VsdCA9IG5ldyBGbG9hdDMyQXJyYXkoc2l6ZSk7XG5cbiAgZnVuY3Rpb24gc3VtQWNyb3NzQ2hhbm5lbHMob2Zmc2V0OiBudW1iZXIpIHtcbiAgICBjb25zdCBjdXJyZW50Q2hhbm5lbCA9IG9mZnNldCAlIGNoYW5uZWxzO1xuICAgIGxldCBiZWdpblN1bU9mZnNldCA9XG4gICAgICAgIG9mZnNldCAtIGN1cnJlbnRDaGFubmVsICsgTWF0aC5tYXgoMCwgY3VycmVudENoYW5uZWwgLSBkZXB0aFJhZGl1cyk7XG4gICAgY29uc3QgZW5kU3VtT2Zmc2V0ID1cbiAgICAgICAgb2Zmc2V0IC0gY3VycmVudENoYW5uZWwgKyBNYXRoLm1pbihjdXJyZW50Q2hhbm5lbCArIGRlcHRoUmFkaXVzLCBtYXhEKTtcblxuICAgIGxldCBzdW0gPSAwLjA7XG4gICAgZm9yICg7IGJlZ2luU3VtT2Zmc2V0IDw9IGVuZFN1bU9mZnNldDsgYmVnaW5TdW1PZmZzZXQrKykge1xuICAgICAgY29uc3QgeiA9IHhWYWx1ZXNbYmVnaW5TdW1PZmZzZXRdO1xuICAgICAgc3VtICs9IHogKiB6O1xuICAgIH1cbiAgICByZXR1cm4gc3VtO1xuICB9XG5cbiAgZm9yIChsZXQgb2Zmc2V0ID0gMDsgb2Zmc2V0IDwgc2l6ZTsgb2Zmc2V0KyspIHtcbiAgICBjb25zdCBzdW0gPSBzdW1BY3Jvc3NDaGFubmVscyhvZmZzZXQpO1xuICAgIGNvbnN0IHZhbCA9IHhWYWx1ZXNbb2Zmc2V0XSAqIE1hdGgucG93KGJpYXMgKyBhbHBoYSAqIHN1bSwgLWJldGEpO1xuICAgIHJlc3VsdFtvZmZzZXRdID0gdmFsO1xuICB9XG5cbiAgcmV0dXJuIGJhY2tlbmQubWFrZVRlbnNvckluZm8oeC5zaGFwZSwgeC5kdHlwZSwgcmVzdWx0KTtcbn1cblxuLy8gdHNsaW50OmRpc2FibGUtbmV4dC1saW5lOiB2YXJpYWJsZS1uYW1lXG5leHBvcnQgY29uc3QgTFJOQ29uZmlnOiBLZXJuZWxDb25maWcgPSB7XG4gIGtlcm5lbE5hbWU6IExSTixcbiAgYmFja2VuZE5hbWU6ICdjcHUnLFxuICBrZXJuZWxGdW5jOiBsUk4gYXMge30gYXMgS2VybmVsRnVuY1xufTtcbiJdfQ==","/**\n * @license\n * Copyright 2020 Google LLC. All Rights Reserved.\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n * =============================================================================\n */\nimport { LRNGrad, util } from '@tensorflow/tfjs-core';\nimport { assertNotComplex } from '../cpu_util';\nexport function lRNGrad(args) {\n const { inputs, backend, attrs } = args;\n const { x, y, dy } = inputs;\n const { depthRadius, bias, alpha, beta } = attrs;\n assertNotComplex(dy, 'LRNGrad');\n const dySize = util.sizeFromShape(dy.shape);\n const channels = dy.shape[3];\n const dyValues = backend.data.get(dy.dataId).values;\n const xValues = backend.data.get(x.dataId).values;\n const yValues = backend.data.get(y.dataId).values;\n const result = new Float32Array(dySize);\n const size = dySize;\n for (let offset = 0; offset < size; offset++) {\n const currentChannel = offset % channels;\n const depthBegin = (offset - currentChannel) + Math.max(0, currentChannel - depthRadius);\n const depthEnd = (offset - currentChannel) +\n Math.min(channels, currentChannel + depthRadius + 1);\n let norm = 0;\n for (let k = depthBegin; k < depthEnd; k++) {\n norm += Math.pow(xValues[k], 2);\n }\n norm = alpha * norm + bias;\n for (let k = depthBegin; k < depthEnd; k++) {\n let dyi = -2 * alpha * beta * xValues[k] * yValues[offset] / norm;\n if (offset === k) {\n dyi += Math.pow(norm, -beta);\n }\n dyi *= dyValues[offset];\n result[k] += dyi;\n }\n }\n return backend.makeTensorInfo(dy.shape, x.dtype, result);\n}\n// tslint:disable-next-line: variable-name\nexport const LRNGradConfig = {\n kernelName: LRNGrad,\n backendName: 'cpu',\n kernelFunc: lRNGrad\n};\n//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiTFJOR3JhZC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uLy4uL3RmanMtYmFja2VuZC1jcHUvc3JjL2tlcm5lbHMvTFJOR3JhZC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQTs7Ozs7Ozs7Ozs7Ozs7O0dBZUc7QUFFSCxPQUFPLEVBQTJCLE9BQU8sRUFBdUQsSUFBSSxFQUFDLE1BQU0sdUJBQXVCLENBQUM7QUFHbkksT0FBTyxFQUFDLGdCQUFnQixFQUFDLE1BQU0sYUFBYSxDQUFDO0FBRTdDLE1BQU0sVUFBVSxPQUFPLENBQ25CLElBQ3lFO0lBRTNFLE1BQU0sRUFBQyxNQUFNLEVBQUUsT0FBTyxFQUFFLEtBQUssRUFBQyxHQUFHLElBQUksQ0FBQztJQUN0QyxNQUFNLEVBQUMsQ0FBQyxFQUFFLENBQUMsRUFBRSxFQUFFLEVBQUMsR0FBRyxNQUFNLENBQUM7SUFDMUIsTUFBTSxFQUFDLFdBQVcsRUFBRSxJQUFJLEVBQUUsS0FBSyxFQUFFLElBQUksRUFBQyxHQUFHLEtBQUssQ0FBQztJQUUvQyxnQkFBZ0IsQ0FBQyxFQUFFLEVBQUUsU0FBUyxDQUFDLENBQUM7SUFFaEMsTUFBTSxNQUFNLEdBQUcsSUFBSSxDQUFDLGFBQWEsQ0FBQyxFQUFFLENBQUMsS0FBSyxDQUFDLENBQUM7SUFFNUMsTUFBTSxRQUFRLEdBQUcsRUFBRSxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUMsQ0FBQztJQUM3QixNQUFNLFFBQVEsR0FBRyxPQUFPLENBQUMsSUFBSSxDQUFDLEdBQUcsQ0FBQyxFQUFFLENBQUMsTUFBTSxDQUFDLENBQUMsTUFBb0IsQ0FBQztJQUNsRSxNQUFNLE9BQU8sR0FBRyxPQUFPLENBQUMsSUFBSSxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsTUFBTSxDQUFDLENBQUMsTUFBb0IsQ0FBQztJQUNoRSxNQUFNLE9BQU8sR0FBRyxPQUFPLENBQUMsSUFBSSxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsTUFBTSxDQUFDLENBQUMsTUFBb0IsQ0FBQztJQUNoRSxNQUFNLE1BQU0sR0FBRyxJQUFJLFlBQVksQ0FBQyxNQUFNLENBQUMsQ0FBQztJQUN4QyxNQUFNLElBQUksR0FBRyxNQUFNLENBQUM7SUFFcEIsS0FBSyxJQUFJLE1BQU0sR0FBRyxDQUFDLEVBQUUsTUFBTSxHQUFHLElBQUksRUFBRSxNQUFNLEVBQUUsRUFBRTtRQUM1QyxNQUFNLGNBQWMsR0FBRyxNQUFNLEdBQUcsUUFBUSxDQUFDO1FBQ3pDLE1BQU0sVUFBVSxHQUNaLENBQUMsTUFBTSxHQUFHLGNBQWMsQ0FBQyxHQUFHLElBQUksQ0FBQyxHQUFHLENBQUMsQ0FBQyxFQUFFLGNBQWMsR0FBRyxXQUFXLENBQUMsQ0FBQztRQUMxRSxNQUFNLFFBQVEsR0FBRyxDQUFDLE1BQU0sR0FBRyxjQUFjLENBQUM7WUFDdEMsSUFBSSxDQUFDLEdBQUcsQ0FBQyxRQUFRLEVBQUUsY0FBYyxHQUFHLFdBQVcsR0FBRyxDQUFDLENBQUMsQ0FBQztRQUV6RCxJQUFJLElBQUksR0FBRyxDQUFDLENBQUM7UUFDYixLQUFLLElBQUksQ0FBQyxHQUFHLFVBQVUsRUFBRSxDQUFDLEdBQUcsUUFBUSxFQUFFLENBQUMsRUFBRSxFQUFFO1lBQzFDLElBQUksSUFBSSxJQUFJLENBQUMsR0FBRyxDQUFDLE9BQU8sQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQztTQUNqQztRQUNELElBQUksR0FBRyxLQUFLLEdBQUcsSUFBSSxHQUFHLElBQUksQ0FBQztRQUUzQixLQUFLLElBQUksQ0FBQyxHQUFHLFVBQVUsRUFBRSxDQUFDLEdBQUcsUUFBUSxFQUFFLENBQUMsRUFBRSxFQUFFO1lBQzFDLElBQUksR0FBRyxHQUFHLENBQUMsQ0FBQyxHQUFHLEtBQUssR0FBRyxJQUFJLEdBQUcsT0FBTyxDQUFDLENBQUMsQ0FBQyxHQUFHLE9BQU8sQ0FBQyxNQUFNLENBQUMsR0FBRyxJQUFJLENBQUM7WUFDbEUsSUFBSSxNQUFNLEtBQUssQ0FBQyxFQUFFO2dCQUNoQixHQUFHLElBQUksSUFBSSxDQUFDLEdBQUcsQ0FBQyxJQUFJLEVBQUUsQ0FBQyxJQUFJLENBQUMsQ0FBQzthQUM5QjtZQUNELEdBQUcsSUFBSSxRQUFRLENBQUMsTUFBTSxDQUFDLENBQUM7WUFDeEIsTUFBTSxDQUFDLENBQUMsQ0FBQyxJQUFJLEdBQUcsQ0FBQztTQUNsQjtLQUNGO0lBRUQsT0FBTyxPQUFPLENBQUMsY0FBYyxDQUFDLEVBQUUsQ0FBQyxLQUFLLEVBQUUsQ0FBQyxDQUFDLEtBQUssRUFBRSxNQUFNLENBQUMsQ0FBQztBQUMzRCxDQUFDO0FBRUQsMENBQTBDO0FBQzFDLE1BQU0sQ0FBQyxNQUFNLGFBQWEsR0FBaUI7SUFDekMsVUFBVSxFQUFFLE9BQU87SUFDbkIsV0FBVyxFQUFFLEtBQUs7SUFDbEIsVUFBVSxFQUFFLE9BQTJCO0NBQ3hDLENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyIvKipcbiAqIEBsaWNlbnNlXG4gKiBDb3B5cmlnaHQgMjAyMCBHb29nbGUgTExDLiBBbGwgUmlnaHRzIFJlc2VydmVkLlxuICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlIFwiTGljZW5zZVwiKTtcbiAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS5cbiAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdFxuICpcbiAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMFxuICpcbiAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmVcbiAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuIFwiQVMgSVNcIiBCQVNJUyxcbiAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLlxuICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZFxuICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuXG4gKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuICovXG5cbmltcG9ydCB7S2VybmVsQ29uZmlnLCBLZXJuZWxGdW5jLCBMUk5HcmFkLCBMUk5HcmFkQXR0cnMsIExSTkdyYWRJbnB1dHMsIFRlbnNvckluZm8sIFR5cGVkQXJyYXksIHV0aWx9IGZyb20gJ0B0ZW5zb3JmbG93L3RmanMtY29yZSc7XG5cbmltcG9ydCB7TWF0aEJhY2tlbmRDUFV9IGZyb20gJy4uL2JhY2tlbmRfY3B1JztcbmltcG9ydCB7YXNzZXJ0Tm90Q29tcGxleH0gZnJvbSAnLi4vY3B1X3V0aWwnO1xuXG5leHBvcnQgZnVuY3Rpb24gbFJOR3JhZChcbiAgICBhcmdzOlxuICAgICAgICB7aW5wdXRzOiBMUk5HcmFkSW5wdXRzLCBiYWNrZW5kOiBNYXRoQmFja2VuZENQVSwgYXR0cnM6IExSTkdyYWRBdHRyc30pOlxuICAgIFRlbnNvckluZm8ge1xuICBjb25zdCB7aW5wdXRzLCBiYWNrZW5kLCBhdHRyc30gPSBhcmdzO1xuICBjb25zdCB7eCwgeSwgZHl9ID0gaW5wdXRzO1xuICBjb25zdCB7ZGVwdGhSYWRpdXMsIGJpYXMsIGFscGhhLCBiZXRhfSA9IGF0dHJzO1xuXG4gIGFzc2VydE5vdENvbXBsZXgoZHksICdMUk5HcmFkJyk7XG5cbiAgY29uc3QgZHlTaXplID0gdXRpbC5zaXplRnJvbVNoYXBlKGR5LnNoYXBlKTtcblxuICBjb25zdCBjaGFubmVscyA9IGR5LnNoYXBlWzNdO1xuICBjb25zdCBkeVZhbHVlcyA9IGJhY2tlbmQuZGF0YS5nZXQoZHkuZGF0YUlkKS52YWx1ZXMgYXMgVHlwZWRBcnJheTtcbiAgY29uc3QgeFZhbHVlcyA9IGJhY2tlbmQuZGF0YS5nZXQoeC5kYXRhSWQpLnZhbHVlcyBhcyBUeXBlZEFycmF5O1xuICBjb25zdCB5VmFsdWVzID0gYmFja2VuZC5kYXRhLmdldCh5LmRhdGFJZCkudmFsdWVzIGFzIFR5cGVkQXJyYXk7XG4gIGNvbnN0IHJlc3VsdCA9IG5ldyBGbG9hdDMyQXJyYXkoZHlTaXplKTtcbiAgY29uc3Qgc2l6ZSA9IGR5U2l6ZTtcblxuICBmb3IgKGxldCBvZmZzZXQgPSAwOyBvZmZzZXQgPCBzaXplOyBvZmZzZXQrKykge1xuICAgIGNvbnN0IGN1cnJlbnRDaGFubmVsID0gb2Zmc2V0ICUgY2hhbm5lbHM7XG4gICAgY29uc3QgZGVwdGhCZWdpbiA9XG4gICAgICAgIChvZmZzZXQgLSBjdXJyZW50Q2hhbm5lbCkgKyBNYXRoLm1heCgwLCBjdXJyZW50Q2hhbm5lbCAtIGRlcHRoUmFkaXVzKTtcbiAgICBjb25zdCBkZXB0aEVuZCA9IChvZmZzZXQgLSBjdXJyZW50Q2hhbm5lbCkgK1xuICAgICAgICBNYXRoLm1pbihjaGFubmVscywgY3VycmVudENoYW5uZWwgKyBkZXB0aFJhZGl1cyArIDEpO1xuXG4gICAgbGV0IG5vcm0gPSAwO1xuICAgIGZvciAobGV0IGsgPSBkZXB0aEJlZ2luOyBrIDwgZGVwdGhFbmQ7IGsrKykge1xuICAgICAgbm9ybSArPSBNYXRoLnBvdyh4VmFsdWVzW2tdLCAyKTtcbiAgICB9XG4gICAgbm9ybSA9IGFscGhhICogbm9ybSArIGJpYXM7XG5cbiAgICBmb3IgKGxldCBrID0gZGVwdGhCZWdpbjsgayA8IGRlcHRoRW5kOyBrKyspIHtcbiAgICAgIGxldCBkeWkgPSAtMiAqIGFscGhhICogYmV0YSAqIHhWYWx1ZXNba10gKiB5VmFsdWVzW29mZnNldF0gLyBub3JtO1xuICAgICAgaWYgKG9mZnNldCA9PT0gaykge1xuICAgICAgICBkeWkgKz0gTWF0aC5wb3cobm9ybSwgLWJldGEpO1xuICAgICAgfVxuICAgICAgZHlpICo9IGR5VmFsdWVzW29mZnNldF07XG4gICAgICByZXN1bHRba10gKz0gZHlpO1xuICAgIH1cbiAgfVxuXG4gIHJldHVybiBiYWNrZW5kLm1ha2VUZW5zb3JJbmZvKGR5LnNoYXBlLCB4LmR0eXBlLCByZXN1bHQpO1xufVxuXG4vLyB0c2xpbnQ6ZGlzYWJsZS1uZXh0LWxpbmU6IHZhcmlhYmxlLW5hbWVcbmV4cG9ydCBjb25zdCBMUk5HcmFkQ29uZmlnOiBLZXJuZWxDb25maWcgPSB7XG4gIGtlcm5lbE5hbWU6IExSTkdyYWQsXG4gIGJhY2tlbmROYW1lOiAnY3B1JyxcbiAga2VybmVsRnVuYzogbFJOR3JhZCBhcyB7fSBhcyBLZXJuZWxGdW5jXG59O1xuIl19","/**\n * @license\n * Copyright 2020 Google LLC. All Rights Reserved.\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n * =============================================================================\n */\nimport { util } from '@tensorflow/tfjs-core';\nexport function maxImpl(aVals, reduceSize, outShape, dtype) {\n const vals = util.getTypedArrayFromDType(dtype, util.sizeFromShape(outShape));\n for (let i = 0; i < vals.length; ++i) {\n const offset = i * reduceSize;\n let max = aVals[offset];\n for (let j = 0; j < reduceSize; ++j) {\n const value = aVals[offset + j];\n if (Number.isNaN(value) ||\n value > max) { // comparison with NaN always return false\n max = value;\n }\n }\n vals[i] = max;\n }\n return vals;\n}\n//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiTWF4X2ltcGwuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi8uLi90ZmpzLWJhY2tlbmQtY3B1L3NyYy9rZXJuZWxzL01heF9pbXBsLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBOzs7Ozs7Ozs7Ozs7Ozs7R0FlRztBQUVILE9BQU8sRUFBd0MsSUFBSSxFQUFDLE1BQU0sdUJBQXVCLENBQUM7QUFFbEYsTUFBTSxVQUFVLE9BQU8sQ0FDbkIsS0FBaUIsRUFBRSxVQUFrQixFQUFFLFFBQWtCLEVBQ3pELEtBQWU7SUFDakIsTUFBTSxJQUFJLEdBQUcsSUFBSSxDQUFDLHNCQUFzQixDQUNwQyxLQUF3QixFQUFFLElBQUksQ0FBQyxhQUFhLENBQUMsUUFBUSxDQUFDLENBQUMsQ0FBQztJQUU1RCxLQUFLLElBQUksQ0FBQyxHQUFHLENBQUMsRUFBRSxDQUFDLEdBQUcsSUFBSSxDQUFDLE1BQU0sRUFBRSxFQUFFLENBQUMsRUFBRTtRQUNwQyxNQUFNLE1BQU0sR0FBRyxDQUFDLEdBQUcsVUFBVSxDQUFDO1FBQzlCLElBQUksR0FBRyxHQUFHLEtBQUssQ0FBQyxNQUFNLENBQUMsQ0FBQztRQUN4QixLQUFLLElBQUksQ0FBQyxHQUFHLENBQUMsRUFBRSxDQUFDLEdBQUcsVUFBVSxFQUFFLEVBQUUsQ0FBQyxFQUFFO1lBQ25DLE1BQU0sS0FBSyxHQUFHLEtBQUssQ0FBQyxNQUFNLEdBQUcsQ0FBQyxDQUFDLENBQUM7WUFDaEMsSUFBSSxNQUFNLENBQUMsS0FBSyxDQUFDLEtBQUssQ0FBQztnQkFDbkIsS0FBSyxHQUFHLEdBQUcsRUFBRSxFQUFHLDBDQUEwQztnQkFDNUQsR0FBRyxHQUFHLEtBQUssQ0FBQzthQUNiO1NBQ0Y7UUFDRCxJQUFJLENBQUMsQ0FBQyxDQUFDLEdBQUcsR0FBRyxDQUFDO0tBQ2Y7SUFDRCxPQUFPLElBQUksQ0FBQztBQUNkLENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyIvKipcbiAqIEBsaWNlbnNlXG4gKiBDb3B5cmlnaHQgMjAyMCBHb29nbGUgTExDLiBBbGwgUmlnaHRzIFJlc2VydmVkLlxuICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlIFwiTGljZW5zZVwiKTtcbiAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS5cbiAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdFxuICpcbiAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMFxuICpcbiAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmVcbiAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuIFwiQVMgSVNcIiBCQVNJUyxcbiAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLlxuICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZFxuICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuXG4gKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuICovXG5cbmltcG9ydCB7RGF0YVR5cGUsIE51bWVyaWNEYXRhVHlwZSwgVHlwZWRBcnJheSwgdXRpbH0gZnJvbSAnQHRlbnNvcmZsb3cvdGZqcy1jb3JlJztcblxuZXhwb3J0IGZ1bmN0aW9uIG1heEltcGwoXG4gICAgYVZhbHM6IFR5cGVkQXJyYXksIHJlZHVjZVNpemU6IG51bWJlciwgb3V0U2hhcGU6IG51bWJlcltdLFxuICAgIGR0eXBlOiBEYXRhVHlwZSk6IFR5cGVkQXJyYXkge1xuICBjb25zdCB2YWxzID0gdXRpbC5nZXRUeXBlZEFycmF5RnJvbURUeXBlKFxuICAgICAgZHR5cGUgYXMgTnVtZXJpY0RhdGFUeXBlLCB1dGlsLnNpemVGcm9tU2hhcGUob3V0U2hhcGUpKTtcblxuICBmb3IgKGxldCBpID0gMDsgaSA8IHZhbHMubGVuZ3RoOyArK2kpIHtcbiAgICBjb25zdCBvZmZzZXQgPSBpICogcmVkdWNlU2l6ZTtcbiAgICBsZXQgbWF4ID0gYVZhbHNbb2Zmc2V0XTtcbiAgICBmb3IgKGxldCBqID0gMDsgaiA8IHJlZHVjZVNpemU7ICsraikge1xuICAgICAgY29uc3QgdmFsdWUgPSBhVmFsc1tvZmZzZXQgKyBqXTtcbiAgICAgIGlmIChOdW1iZXIuaXNOYU4odmFsdWUpIHx8XG4gICAgICAgICAgdmFsdWUgPiBtYXgpIHsgIC8vIGNvbXBhcmlzb24gd2l0aCBOYU4gYWx3YXlzIHJldHVybiBmYWxzZVxuICAgICAgICBtYXggPSB2YWx1ZTtcbiAgICAgIH1cbiAgICB9XG4gICAgdmFsc1tpXSA9IG1heDtcbiAgfVxuICByZXR1cm4gdmFscztcbn1cbiJdfQ==","/**\n * @license\n * Copyright 2020 Google LLC. All Rights Reserved.\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n * =============================================================================\n */\nimport { Max } from '@tensorflow/tfjs-core';\nimport { backend_util } from '@tensorflow/tfjs-core';\nimport { util } from '@tensorflow/tfjs-core';\nimport { assertNotComplex } from '../cpu_util';\nimport { maxImpl } from './Max_impl';\nimport { transposeImpl } from './Transpose_impl';\nexport function max(args) {\n const { inputs, backend, attrs } = args;\n const { x } = inputs;\n const { reductionIndices, keepDims } = attrs;\n const cpuBackend = backend;\n let xShape = x.shape;\n const xRank = xShape.length;\n const origAxes = util.parseAxisParam(reductionIndices, xShape);\n let axes = origAxes;\n const permutedAxes = backend_util.getAxesPermutation(axes, xRank);\n let xVals = cpuBackend.data.get(x.dataId).values;\n if (permutedAxes != null) {\n const newShape = new Array(xRank);\n for (let i = 0; i < newShape.length; i++) {\n newShape[i] = xShape[permutedAxes[i]];\n }\n xVals = transposeImpl(xVals, xShape, x.dtype, permutedAxes, newShape);\n axes = backend_util.getInnerMostAxes(axes.length, xRank);\n xShape = newShape;\n }\n assertNotComplex(x, 'max');\n backend_util.assertAxesAreInnerMostDims('max', axes, xRank);\n const [maxOutShape, reduceShape] = backend_util.computeOutAndReduceShapes(xShape, axes);\n const reduceSize = util.sizeFromShape(reduceShape);\n const result = maxImpl(xVals, reduceSize, maxOutShape, x.dtype);\n const dataId = cpuBackend.write(result, maxOutShape, x.dtype);\n let outShape = maxOutShape;\n if (keepDims) {\n // reshape\n const newShape = backend_util.expandShapeToKeepDim(maxOutShape, origAxes);\n outShape = newShape;\n }\n return { dataId, shape: outShape, dtype: x.dtype };\n}\nexport const maxConfig = {\n kernelName: Max,\n backendName: 'cpu',\n kernelFunc: max\n};\n//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiTWF4LmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vLi4vdGZqcy1iYWNrZW5kLWNwdS9zcmMva2VybmVscy9NYXgudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUE7Ozs7Ozs7Ozs7Ozs7OztHQWVHO0FBRUgsT0FBTyxFQUFhLEdBQUcsRUFBa0MsTUFBTSx1QkFBdUIsQ0FBQztBQUN2RixPQUFPLEVBQUMsWUFBWSxFQUFlLE1BQU0sdUJBQXVCLENBQUM7QUFDakUsT0FBTyxFQUFhLElBQUksRUFBQyxNQUFNLHVCQUF1QixDQUFDO0FBR3ZELE9BQU8sRUFBQyxnQkFBZ0IsRUFBQyxNQUFNLGFBQWEsQ0FBQztBQUU3QyxPQUFPLEVBQUMsT0FBTyxFQUFDLE1BQU0sWUFBWSxDQUFDO0FBQ25DLE9BQU8sRUFBQyxhQUFhLEVBQUMsTUFBTSxrQkFBa0IsQ0FBQztBQUUvQyxNQUFNLFVBQVUsR0FBRyxDQUNmLElBQW1FO0lBRXJFLE1BQU0sRUFBQyxNQUFNLEVBQUUsT0FBTyxFQUFFLEtBQUssRUFBQyxHQUFHLElBQUksQ0FBQztJQUN0QyxNQUFNLEVBQUMsQ0FBQyxFQUFDLEdBQUcsTUFBTSxDQUFDO0lBQ25CLE1BQU0sRUFBQyxnQkFBZ0IsRUFBRSxRQUFRLEVBQUMsR0FBRyxLQUFLLENBQUM7SUFDM0MsTUFBTSxVQUFVLEdBQUcsT0FBTyxDQUFDO0lBQzNCLElBQUksTUFBTSxHQUFHLENBQUMsQ0FBQyxLQUFLLENBQUM7SUFDckIsTUFBTSxLQUFLLEdBQUcsTUFBTSxDQUFDLE1BQU0sQ0FBQztJQUU1QixNQUFNLFFBQVEsR0FBRyxJQUFJLENBQUMsY0FBYyxDQUFDLGdCQUFnQixFQUFFLE1BQU0sQ0FBQyxDQUFDO0lBQy9ELElBQUksSUFBSSxHQUFHLFFBQVEsQ0FBQztJQUNwQixNQUFNLFlBQVksR0FBRyxZQUFZLENBQUMsa0JBQWtCLENBQUMsSUFBSSxFQUFFLEtBQUssQ0FBQyxDQUFDO0lBQ2xFLElBQUksS0FBSyxHQUFHLFVBQVUsQ0FBQyxJQUFJLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxNQUFNLENBQUMsQ0FBQyxNQUFvQixDQUFDO0lBQy9ELElBQUksWUFBWSxJQUFJLElBQUksRUFBRTtRQUN4QixNQUFNLFFBQVEsR0FBYSxJQUFJLEtBQUssQ0FBQyxLQUFLLENBQUMsQ0FBQztRQUM1QyxLQUFLLElBQUksQ0FBQyxHQUFHLENBQUMsRUFBRSxDQUFDLEdBQUcsUUFBUSxDQUFDLE1BQU0sRUFBRSxDQUFDLEVBQUUsRUFBRTtZQUN4QyxRQUFRLENBQUMsQ0FBQyxDQUFDLEdBQUcsTUFBTSxDQUFDLFlBQVksQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDO1NBQ3ZDO1FBRUQsS0FBSyxHQUFHLGFBQWEsQ0FBQyxLQUFLLEVBQUUsTUFBTSxFQUFFLENBQUMsQ0FBQyxLQUFLLEVBQUUsWUFBWSxFQUFFLFFBQVEsQ0FBQyxDQUFDO1FBQ3RFLElBQUksR0FBRyxZQUFZLENBQUMsZ0JBQWdCLENBQUMsSUFBSSxDQUFDLE1BQU0sRUFBRSxLQUFLLENBQUMsQ0FBQztRQUV6RCxNQUFNLEdBQUcsUUFBUSxDQUFDO0tBQ25CO0lBRUQsZ0JBQWdCLENBQUMsQ0FBQyxFQUFFLEtBQUssQ0FBQyxDQUFDO0lBQzNCLFlBQVksQ0FBQywwQkFBMEIsQ0FBQyxLQUFLLEVBQUUsSUFBSSxFQUFFLEtBQUssQ0FBQyxDQUFDO0lBQzVELE1BQU0sQ0FBQyxXQUFXLEVBQUUsV0FBVyxDQUFDLEdBQzVCLFlBQVksQ0FBQyx5QkFBeUIsQ0FBQyxNQUFNLEVBQUUsSUFBSSxDQUFDLENBQUM7SUFFekQsTUFBTSxVQUFVLEdBQUcsSUFBSSxDQUFDLGFBQWEsQ0FBQyxXQUFXLENBQUMsQ0FBQztJQUVuRCxNQUFNLE1BQU0sR0FBRyxPQUFPLENBQUMsS0FBSyxFQUFFLFVBQVUsRUFBRSxXQUFXLEVBQUUsQ0FBQyxDQUFDLEtBQUssQ0FBQyxDQUFDO0lBQ2hFLE1BQU0sTUFBTSxHQUFHLFVBQVUsQ0FBQyxLQUFLLENBQUMsTUFBTSxFQUFFLFdBQVcsRUFBRSxDQUFDLENBQUMsS0FBSyxDQUFDLENBQUM7SUFFOUQsSUFBSSxRQUFRLEdBQUcsV0FBVyxDQUFDO0lBQzNCLElBQUksUUFBUSxFQUFFO1FBQ1osVUFBVTtRQUNWLE1BQU0sUUFBUSxHQUFHLFlBQVksQ0FBQyxvQkFBb0IsQ0FBQyxXQUFXLEVBQUUsUUFBUSxDQUFDLENBQUM7UUFDMUUsUUFBUSxHQUFHLFFBQVEsQ0FBQztLQUNyQjtJQUVELE9BQU8sRUFBQyxNQUFNLEVBQUUsS0FBSyxFQUFFLFFBQVEsRUFBRSxLQUFLLEVBQUUsQ0FBQyxDQUFDLEtBQUssRUFBQyxDQUFDO0FBQ25ELENBQUM7QUFFRCxNQUFNLENBQUMsTUFBTSxTQUFTLEdBQWlCO0lBQ3JDLFVBQVUsRUFBRSxHQUFHO0lBQ2YsV0FBVyxFQUFFLEtBQUs7SUFDbEIsVUFBVSxFQUFFLEdBQXVCO0NBQ3BDLENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyIvKipcbiAqIEBsaWNlbnNlXG4gKiBDb3B5cmlnaHQgMjAyMCBHb29nbGUgTExDLiBBbGwgUmlnaHRzIFJlc2VydmVkLlxuICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlIFwiTGljZW5zZVwiKTtcbiAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS5cbiAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdFxuICpcbiAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMFxuICpcbiAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmVcbiAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuIFwiQVMgSVNcIiBCQVNJUyxcbiAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLlxuICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZFxuICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuXG4gKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuICovXG5cbmltcG9ydCB7S2VybmVsRnVuYywgTWF4LCBNYXhBdHRycywgTWF4SW5wdXRzLCBUZW5zb3JJbmZvfSBmcm9tICdAdGVuc29yZmxvdy90ZmpzLWNvcmUnO1xuaW1wb3J0IHtiYWNrZW5kX3V0aWwsIEtlcm5lbENvbmZpZ30gZnJvbSAnQHRlbnNvcmZsb3cvdGZqcy1jb3JlJztcbmltcG9ydCB7VHlwZWRBcnJheSwgdXRpbH0gZnJvbSAnQHRlbnNvcmZsb3cvdGZqcy1jb3JlJztcblxuaW1wb3J0IHtNYXRoQmFja2VuZENQVX0gZnJvbSAnLi4vYmFja2VuZF9jcHUnO1xuaW1wb3J0IHthc3NlcnROb3RDb21wbGV4fSBmcm9tICcuLi9jcHVfdXRpbCc7XG5cbmltcG9ydCB7bWF4SW1wbH0gZnJvbSAnLi9NYXhfaW1wbCc7XG5pbXBvcnQge3RyYW5zcG9zZUltcGx9IGZyb20gJy4vVHJhbnNwb3NlX2ltcGwnO1xuXG5leHBvcnQgZnVuY3Rpb24gbWF4KFxuICAgIGFyZ3M6IHtpbnB1dHM6IE1heElucHV0cywgYmFja2VuZDogTWF0aEJhY2tlbmRDUFUsIGF0dHJzOiBNYXhBdHRyc30pOlxuICAgIFRlbnNvckluZm8ge1xuICBjb25zdCB7aW5wdXRzLCBiYWNrZW5kLCBhdHRyc30gPSBhcmdzO1xuICBjb25zdCB7eH0gPSBpbnB1dHM7XG4gIGNvbnN0IHtyZWR1Y3Rpb25JbmRpY2VzLCBrZWVwRGltc30gPSBhdHRycztcbiAgY29uc3QgY3B1QmFja2VuZCA9IGJhY2tlbmQ7XG4gIGxldCB4U2hhcGUgPSB4LnNoYXBlO1xuICBjb25zdCB4UmFuayA9IHhTaGFwZS5sZW5ndGg7XG5cbiAgY29uc3Qgb3JpZ0F4ZXMgPSB1dGlsLnBhcnNlQXhpc1BhcmFtKHJlZHVjdGlvbkluZGljZXMsIHhTaGFwZSk7XG4gIGxldCBheGVzID0gb3JpZ0F4ZXM7XG4gIGNvbnN0IHBlcm11dGVkQXhlcyA9IGJhY2tlbmRfdXRpbC5nZXRBeGVzUGVybXV0YXRpb24oYXhlcywgeFJhbmspO1xuICBsZXQgeFZhbHMgPSBjcHVCYWNrZW5kLmRhdGEuZ2V0KHguZGF0YUlkKS52YWx1ZXMgYXMgVHlwZWRBcnJheTtcbiAgaWYgKHBlcm11dGVkQXhlcyAhPSBudWxsKSB7XG4gICAgY29uc3QgbmV3U2hhcGU6IG51bWJlcltdID0gbmV3IEFycmF5KHhSYW5rKTtcbiAgICBmb3IgKGxldCBpID0gMDsgaSA8IG5ld1NoYXBlLmxlbmd0aDsgaSsrKSB7XG4gICAgICBuZXdTaGFwZVtpXSA9IHhTaGFwZVtwZXJtdXRlZEF4ZXNbaV1dO1xuICAgIH1cblxuICAgIHhWYWxzID0gdHJhbnNwb3NlSW1wbCh4VmFscywgeFNoYXBlLCB4LmR0eXBlLCBwZXJtdXRlZEF4ZXMsIG5ld1NoYXBlKTtcbiAgICBheGVzID0gYmFja2VuZF91dGlsLmdldElubmVyTW9zdEF4ZXMoYXhlcy5sZW5ndGgsIHhSYW5rKTtcblxuICAgIHhTaGFwZSA9IG5ld1NoYXBlO1xuICB9XG5cbiAgYXNzZXJ0Tm90Q29tcGxleCh4LCAnbWF4Jyk7XG4gIGJhY2tlbmRfdXRpbC5hc3NlcnRBeGVzQXJlSW5uZXJNb3N0RGltcygnbWF4JywgYXhlcywgeFJhbmspO1xuICBjb25zdCBbbWF4T3V0U2hhcGUsIHJlZHVjZVNoYXBlXSA9XG4gICAgICBiYWNrZW5kX3V0aWwuY29tcHV0ZU91dEFuZFJlZHVjZVNoYXBlcyh4U2hhcGUsIGF4ZXMpO1xuXG4gIGNvbnN0IHJlZHVjZVNpemUgPSB1dGlsLnNpemVGcm9tU2hhcGUocmVkdWNlU2hhcGUpO1xuXG4gIGNvbnN0IHJlc3VsdCA9IG1heEltcGwoeFZhbHMsIHJlZHVjZVNpemUsIG1heE91dFNoYXBlLCB4LmR0eXBlKTtcbiAgY29uc3QgZGF0YUlkID0gY3B1QmFja2VuZC53cml0ZShyZXN1bHQsIG1heE91dFNoYXBlLCB4LmR0eXBlKTtcblxuICBsZXQgb3V0U2hhcGUgPSBtYXhPdXRTaGFwZTtcbiAgaWYgKGtlZXBEaW1zKSB7XG4gICAgLy8gcmVzaGFwZVxuICAgIGNvbnN0IG5ld1NoYXBlID0gYmFja2VuZF91dGlsLmV4cGFuZFNoYXBlVG9LZWVwRGltKG1heE91dFNoYXBlLCBvcmlnQXhlcyk7XG4gICAgb3V0U2hhcGUgPSBuZXdTaGFwZTtcbiAgfVxuXG4gIHJldHVybiB7ZGF0YUlkLCBzaGFwZTogb3V0U2hhcGUsIGR0eXBlOiB4LmR0eXBlfTtcbn1cblxuZXhwb3J0IGNvbnN0IG1heENvbmZpZzogS2VybmVsQ29uZmlnID0ge1xuICBrZXJuZWxOYW1lOiBNYXgsXG4gIGJhY2tlbmROYW1lOiAnY3B1JyxcbiAga2VybmVsRnVuYzogbWF4IGFzIHt9IGFzIEtlcm5lbEZ1bmNcbn07XG4iXX0=","/**\n * @license\n * Copyright 2020 Google LLC. All Rights Reserved.\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n * =============================================================================\n */\nimport { Maximum } from '@tensorflow/tfjs-core';\nimport { createSimpleBinaryKernelImpl } from '../utils/binary_impl';\nimport { binaryKernelFunc } from '../utils/binary_utils';\nexport const maximumImpl = createSimpleBinaryKernelImpl(((aValue, bValue) => Math.max(aValue, bValue)));\nexport const maximum = binaryKernelFunc(Maximum, maximumImpl);\nexport const maximumConfig = {\n kernelName: Maximum,\n backendName: 'cpu',\n kernelFunc: maximum\n};\n//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiTWF4aW11bS5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uLy4uL3RmanMtYmFja2VuZC1jcHUvc3JjL2tlcm5lbHMvTWF4aW11bS50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQTs7Ozs7Ozs7Ozs7Ozs7O0dBZUc7QUFFSCxPQUFPLEVBQWUsT0FBTyxFQUFDLE1BQU0sdUJBQXVCLENBQUM7QUFFNUQsT0FBTyxFQUFDLDRCQUE0QixFQUFDLE1BQU0sc0JBQXNCLENBQUM7QUFDbEUsT0FBTyxFQUFDLGdCQUFnQixFQUFDLE1BQU0sdUJBQXVCLENBQUM7QUFFdkQsTUFBTSxDQUFDLE1BQU0sV0FBVyxHQUFHLDRCQUE0QixDQUNuRCxDQUFDLENBQUMsTUFBTSxFQUFFLE1BQU0sRUFBRSxFQUFFLENBQUMsSUFBSSxDQUFDLEdBQUcsQ0FBQyxNQUFnQixFQUFFLE1BQWdCLENBQUMsQ0FBQyxDQUFDLENBQUM7QUFDeEUsTUFBTSxDQUFDLE1BQU0sT0FBTyxHQUFHLGdCQUFnQixDQUFDLE9BQU8sRUFBRSxXQUFXLENBQUMsQ0FBQztBQUU5RCxNQUFNLENBQUMsTUFBTSxhQUFhLEdBQWlCO0lBQ3pDLFVBQVUsRUFBRSxPQUFPO0lBQ25CLFdBQVcsRUFBRSxLQUFLO0lBQ2xCLFVBQVUsRUFBRSxPQUFPO0NBQ3BCLENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyIvKipcbiAqIEBsaWNlbnNlXG4gKiBDb3B5cmlnaHQgMjAyMCBHb29nbGUgTExDLiBBbGwgUmlnaHRzIFJlc2VydmVkLlxuICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlIFwiTGljZW5zZVwiKTtcbiAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS5cbiAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdFxuICpcbiAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMFxuICpcbiAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmVcbiAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuIFwiQVMgSVNcIiBCQVNJUyxcbiAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLlxuICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZFxuICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuXG4gKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuICovXG5cbmltcG9ydCB7S2VybmVsQ29uZmlnLCBNYXhpbXVtfSBmcm9tICdAdGVuc29yZmxvdy90ZmpzLWNvcmUnO1xuXG5pbXBvcnQge2NyZWF0ZVNpbXBsZUJpbmFyeUtlcm5lbEltcGx9IGZyb20gJy4uL3V0aWxzL2JpbmFyeV9pbXBsJztcbmltcG9ydCB7YmluYXJ5S2VybmVsRnVuY30gZnJvbSAnLi4vdXRpbHMvYmluYXJ5X3V0aWxzJztcblxuZXhwb3J0IGNvbnN0IG1heGltdW1JbXBsID0gY3JlYXRlU2ltcGxlQmluYXJ5S2VybmVsSW1wbChcbiAgICAoKGFWYWx1ZSwgYlZhbHVlKSA9PiBNYXRoLm1heChhVmFsdWUgYXMgbnVtYmVyLCBiVmFsdWUgYXMgbnVtYmVyKSkpO1xuZXhwb3J0IGNvbnN0IG1heGltdW0gPSBiaW5hcnlLZXJuZWxGdW5jKE1heGltdW0sIG1heGltdW1JbXBsKTtcblxuZXhwb3J0IGNvbnN0IG1heGltdW1Db25maWc6IEtlcm5lbENvbmZpZyA9IHtcbiAga2VybmVsTmFtZTogTWF4aW11bSxcbiAgYmFja2VuZE5hbWU6ICdjcHUnLFxuICBrZXJuZWxGdW5jOiBtYXhpbXVtXG59O1xuIl19","/**\n * @license\n * Copyright 2020 Google LLC. All Rights Reserved.\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n * =============================================================================\n */\nimport { backend_util, MaxPool, util } from '@tensorflow/tfjs-core';\nimport { assertNotComplex } from '../cpu_util';\nimport { pool } from '../utils/pool_utils';\nimport { identity } from './Identity';\nexport function maxPool(args) {\n const { inputs, backend, attrs } = args;\n const { x } = inputs;\n assertNotComplex(x, 'maxPool');\n const { filterSize, strides, pad, dimRoundingMode } = attrs;\n const dilations = 1;\n util.assert(backend_util.eitherStridesOrDilationsAreOne(strides, dilations), () => 'Error in maxPool: Either strides or dilations must be 1. ' +\n `Got strides ${strides} and dilations '${dilations}'`);\n const convInfo = backend_util.computePool2DInfo(x.shape, filterSize, strides, dilations, pad, dimRoundingMode);\n let res;\n if (convInfo.filterWidth === 1 && convInfo.filterHeight === 1 &&\n util.arraysEqual(convInfo.inShape, convInfo.outShape)) {\n res = identity({ inputs: { x }, backend });\n }\n else {\n const xValues = backend.data.get(x.dataId).values;\n const strides = util.computeStrides(x.shape);\n const buffer = pool(xValues, x.shape, x.dtype, strides, convInfo, 'max');\n res = backend.makeTensorInfo(convInfo.outShape, x.dtype, buffer.values);\n }\n return res;\n}\nexport const maxPoolConfig = {\n kernelName: MaxPool,\n backendName: 'cpu',\n kernelFunc: maxPool\n};\n//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiTWF4UG9vbC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uLy4uL3RmanMtYmFja2VuZC1jcHUvc3JjL2tlcm5lbHMvTWF4UG9vbC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQTs7Ozs7Ozs7Ozs7Ozs7O0dBZUc7QUFDSCxPQUFPLEVBQUMsWUFBWSxFQUE0QixPQUFPLEVBQXVELElBQUksRUFBQyxNQUFNLHVCQUF1QixDQUFDO0FBR2pKLE9BQU8sRUFBQyxnQkFBZ0IsRUFBQyxNQUFNLGFBQWEsQ0FBQztBQUM3QyxPQUFPLEVBQUMsSUFBSSxFQUFDLE1BQU0scUJBQXFCLENBQUM7QUFDekMsT0FBTyxFQUFDLFFBQVEsRUFBQyxNQUFNLFlBQVksQ0FBQztBQUVwQyxNQUFNLFVBQVUsT0FBTyxDQUNuQixJQUN5RTtJQUUzRSxNQUFNLEVBQUMsTUFBTSxFQUFFLE9BQU8sRUFBRSxLQUFLLEVBQUMsR0FBRyxJQUFJLENBQUM7SUFDdEMsTUFBTSxFQUFDLENBQUMsRUFBQyxHQUFHLE1BQU0sQ0FBQztJQUNuQixnQkFBZ0IsQ0FBQyxDQUFDLEVBQUUsU0FBUyxDQUFDLENBQUM7SUFDL0IsTUFBTSxFQUFDLFVBQVUsRUFBRSxPQUFPLEVBQUUsR0FBRyxFQUFFLGVBQWUsRUFBQyxHQUFHLEtBQUssQ0FBQztJQUMxRCxNQUFNLFNBQVMsR0FBRyxDQUFDLENBQUM7SUFFcEIsSUFBSSxDQUFDLE1BQU0sQ0FDUCxZQUFZLENBQUMsOEJBQThCLENBQUMsT0FBTyxFQUFFLFNBQVMsQ0FBQyxFQUMvRCxHQUFHLEVBQUUsQ0FBQywyREFBMkQ7UUFDN0QsZUFBZSxPQUFPLG1CQUFtQixTQUFTLEdBQUcsQ0FBQyxDQUFDO0lBRS9ELE1BQU0sUUFBUSxHQUFHLFlBQVksQ0FBQyxpQkFBaUIsQ0FDM0MsQ0FBQyxDQUFDLEtBQXlDLEVBQUUsVUFBVSxFQUFFLE9BQU8sRUFDaEUsU0FBUyxFQUFFLEdBQUcsRUFBRSxlQUFlLENBQUMsQ0FBQztJQUNyQyxJQUFJLEdBQWUsQ0FBQztJQUVwQixJQUFJLFFBQVEsQ0FBQyxXQUFXLEtBQUssQ0FBQyxJQUFJLFFBQVEsQ0FBQyxZQUFZLEtBQUssQ0FBQztRQUN6RCxJQUFJLENBQUMsV0FBVyxDQUFDLFFBQVEsQ0FBQyxPQUFPLEVBQUUsUUFBUSxDQUFDLFFBQVEsQ0FBQyxFQUFFO1FBQ3pELEdBQUcsR0FBRyxRQUFRLENBQUMsRUFBQyxNQUFNLEVBQUUsRUFBQyxDQUFDLEVBQUMsRUFBRSxPQUFPLEVBQUMsQ0FBQyxDQUFDO0tBQ3hDO1NBQU07UUFDTCxNQUFNLE9BQU8sR0FBRyxPQUFPLENBQUMsSUFBSSxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsTUFBTSxDQUFDLENBQUMsTUFBb0IsQ0FBQztRQUNoRSxNQUFNLE9BQU8sR0FBRyxJQUFJLENBQUMsY0FBYyxDQUFDLENBQUMsQ0FBQyxLQUFLLENBQUMsQ0FBQztRQUM3QyxNQUFNLE1BQU0sR0FBRyxJQUFJLENBQUMsT0FBTyxFQUFFLENBQUMsQ0FBQyxLQUFLLEVBQUUsQ0FBQyxDQUFDLEtBQUssRUFBRSxPQUFPLEVBQUUsUUFBUSxFQUFFLEtBQUssQ0FBQyxDQUFDO1FBQ3pFLEdBQUcsR0FBRyxPQUFPLENBQUMsY0FBYyxDQUN4QixRQUFRLENBQUMsUUFBUSxFQUFFLENBQUMsQ0FBQyxLQUFLLEVBQUUsTUFBTSxDQUFDLE1BQW9CLENBQUMsQ0FBQztLQUM5RDtJQUNELE9BQU8sR0FBRyxDQUFDO0FBQ2IsQ0FBQztBQUVELE1BQU0sQ0FBQyxNQUFNLGFBQWEsR0FBaUI7SUFDekMsVUFBVSxFQUFFLE9BQU87SUFDbkIsV0FBVyxFQUFFLEtBQUs7SUFDbEIsVUFBVSxFQUFFLE9BQTJCO0NBQ3hDLENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyIvKipcbiAqIEBsaWNlbnNlXG4gKiBDb3B5cmlnaHQgMjAyMCBHb29nbGUgTExDLiBBbGwgUmlnaHRzIFJlc2VydmVkLlxuICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlIFwiTGljZW5zZVwiKTtcbiAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS5cbiAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdFxuICpcbiAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMFxuICpcbiAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmVcbiAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuIFwiQVMgSVNcIiBCQVNJUyxcbiAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLlxuICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZFxuICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuXG4gKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuICovXG5pbXBvcnQge2JhY2tlbmRfdXRpbCwgS2VybmVsQ29uZmlnLCBLZXJuZWxGdW5jLCBNYXhQb29sLCBNYXhQb29sQXR0cnMsIE1heFBvb2xJbnB1dHMsIFRlbnNvckluZm8sIFR5cGVkQXJyYXksIHV0aWx9IGZyb20gJ0B0ZW5zb3JmbG93L3RmanMtY29yZSc7XG5cbmltcG9ydCB7TWF0aEJhY2tlbmRDUFV9IGZyb20gJy4uL2JhY2tlbmRfY3B1JztcbmltcG9ydCB7YXNzZXJ0Tm90Q29tcGxleH0gZnJvbSAnLi4vY3B1X3V0aWwnO1xuaW1wb3J0IHtwb29sfSBmcm9tICcuLi91dGlscy9wb29sX3V0aWxzJztcbmltcG9ydCB7aWRlbnRpdHl9IGZyb20gJy4vSWRlbnRpdHknO1xuXG5leHBvcnQgZnVuY3Rpb24gbWF4UG9vbChcbiAgICBhcmdzOlxuICAgICAgICB7aW5wdXRzOiBNYXhQb29sSW5wdXRzLCBiYWNrZW5kOiBNYXRoQmFja2VuZENQVSwgYXR0cnM6IE1heFBvb2xBdHRyc30pOlxuICAgIFRlbnNvckluZm8ge1xuICBjb25zdCB7aW5wdXRzLCBiYWNrZW5kLCBhdHRyc30gPSBhcmdzO1xuICBjb25zdCB7eH0gPSBpbnB1dHM7XG4gIGFzc2VydE5vdENvbXBsZXgoeCwgJ21heFBvb2wnKTtcbiAgY29uc3Qge2ZpbHRlclNpemUsIHN0cmlkZXMsIHBhZCwgZGltUm91bmRpbmdNb2RlfSA9IGF0dHJzO1xuICBjb25zdCBkaWxhdGlvbnMgPSAxO1xuXG4gIHV0aWwuYXNzZXJ0KFxuICAgICAgYmFja2VuZF91dGlsLmVpdGhlclN0cmlkZXNPckRpbGF0aW9uc0FyZU9uZShzdHJpZGVzLCBkaWxhdGlvbnMpLFxuICAgICAgKCkgPT4gJ0Vycm9yIGluIG1heFBvb2w6IEVpdGhlciBzdHJpZGVzIG9yIGRpbGF0aW9ucyBtdXN0IGJlIDEuICcgK1xuICAgICAgICAgIGBHb3Qgc3RyaWRlcyAke3N0cmlkZXN9IGFuZCBkaWxhdGlvbnMgJyR7ZGlsYXRpb25zfSdgKTtcblxuICBjb25zdCBjb252SW5mbyA9IGJhY2tlbmRfdXRpbC5jb21wdXRlUG9vbDJESW5mbyhcbiAgICAgIHguc2hhcGUgYXMgW251bWJlciwgbnVtYmVyLCBudW1iZXIsIG51bWJlcl0sIGZpbHRlclNpemUsIHN0cmlkZXMsXG4gICAgICBkaWxhdGlvbnMsIHBhZCwgZGltUm91bmRpbmdNb2RlKTtcbiAgbGV0IHJlczogVGVuc29ySW5mbztcblxuICBpZiAoY29udkluZm8uZmlsdGVyV2lkdGggPT09IDEgJiYgY29udkluZm8uZmlsdGVySGVpZ2h0ID09PSAxICYmXG4gICAgICB1dGlsLmFycmF5c0VxdWFsKGNvbnZJbmZvLmluU2hhcGUsIGNvbnZJbmZvLm91dFNoYXBlKSkge1xuICAgIHJlcyA9IGlkZW50aXR5KHtpbnB1dHM6IHt4fSwgYmFja2VuZH0pO1xuICB9IGVsc2Uge1xuICAgIGNvbnN0IHhWYWx1ZXMgPSBiYWNrZW5kLmRhdGEuZ2V0KHguZGF0YUlkKS52YWx1ZXMgYXMgVHlwZWRBcnJheTtcbiAgICBjb25zdCBzdHJpZGVzID0gdXRpbC5jb21wdXRlU3RyaWRlcyh4LnNoYXBlKTtcbiAgICBjb25zdCBidWZmZXIgPSBwb29sKHhWYWx1ZXMsIHguc2hhcGUsIHguZHR5cGUsIHN0cmlkZXMsIGNvbnZJbmZvLCAnbWF4Jyk7XG4gICAgcmVzID0gYmFja2VuZC5tYWtlVGVuc29ySW5mbyhcbiAgICAgICAgY29udkluZm8ub3V0U2hhcGUsIHguZHR5cGUsIGJ1ZmZlci52YWx1ZXMgYXMgVHlwZWRBcnJheSk7XG4gIH1cbiAgcmV0dXJuIHJlcztcbn1cblxuZXhwb3J0IGNvbnN0IG1heFBvb2xDb25maWc6IEtlcm5lbENvbmZpZyA9IHtcbiAga2VybmVsTmFtZTogTWF4UG9vbCxcbiAgYmFja2VuZE5hbWU6ICdjcHUnLFxuICBrZXJuZWxGdW5jOiBtYXhQb29sIGFzIHt9IGFzIEtlcm5lbEZ1bmNcbn07XG4iXX0=","/**\n * @license\n * Copyright 2020 Google LLC. All Rights Reserved.\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n * =============================================================================\n */\nimport { backend_util, MaxPool3D, util } from '@tensorflow/tfjs-core';\nimport { assertNotComplex } from '../cpu_util';\nimport { pool3d } from '../utils/pool_utils';\nexport function maxPool3D(args) {\n const { inputs, backend, attrs } = args;\n const { x } = inputs;\n const { filterSize, strides, pad, dimRoundingMode, dataFormat } = attrs;\n assertNotComplex(x, 'maxPool3d');\n const convInfo = backend_util.computePool3DInfo(x.shape, filterSize, strides, 1 /* dilations */, pad, dimRoundingMode, dataFormat);\n const xValues = backend.data.get(x.dataId).values;\n const outBuf = pool3d(xValues, x.shape, x.dtype, util.computeStrides(x.shape), convInfo, 'max');\n return backend.makeTensorInfo(outBuf.shape, 'float32', outBuf.values);\n}\nexport const maxPool3DConfig = {\n kernelName: MaxPool3D,\n backendName: 'cpu',\n kernelFunc: maxPool3D\n};\n//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiTWF4UG9vbDNELmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vLi4vdGZqcy1iYWNrZW5kLWNwdS9zcmMva2VybmVscy9NYXhQb29sM0QudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUE7Ozs7Ozs7Ozs7Ozs7OztHQWVHO0FBRUgsT0FBTyxFQUFDLFlBQVksRUFBNEIsU0FBUyxFQUEyRCxJQUFJLEVBQUMsTUFBTSx1QkFBdUIsQ0FBQztBQUd2SixPQUFPLEVBQUMsZ0JBQWdCLEVBQUMsTUFBTSxhQUFhLENBQUM7QUFDN0MsT0FBTyxFQUFDLE1BQU0sRUFBQyxNQUFNLHFCQUFxQixDQUFDO0FBRTNDLE1BQU0sVUFBVSxTQUFTLENBQUMsSUFJekI7SUFDQyxNQUFNLEVBQUMsTUFBTSxFQUFFLE9BQU8sRUFBRSxLQUFLLEVBQUMsR0FBRyxJQUFJLENBQUM7SUFDdEMsTUFBTSxFQUFDLENBQUMsRUFBQyxHQUFHLE1BQU0sQ0FBQztJQUNuQixNQUFNLEVBQUMsVUFBVSxFQUFFLE9BQU8sRUFBRSxHQUFHLEVBQUUsZUFBZSxFQUFFLFVBQVUsRUFBQyxHQUFHLEtBQUssQ0FBQztJQUV0RSxnQkFBZ0IsQ0FBQyxDQUFDLEVBQUUsV0FBVyxDQUFDLENBQUM7SUFFakMsTUFBTSxRQUFRLEdBQUcsWUFBWSxDQUFDLGlCQUFpQixDQUMzQyxDQUFDLENBQUMsS0FBaUQsRUFBRSxVQUFVLEVBQUUsT0FBTyxFQUN4RSxDQUFDLENBQUMsZUFBZSxFQUFFLEdBQUcsRUFBRSxlQUFlLEVBQUUsVUFBVSxDQUFDLENBQUM7SUFFekQsTUFBTSxPQUFPLEdBQUcsT0FBTyxDQUFDLElBQUksQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLE1BQU0sQ0FBQyxDQUFDLE1BQW9CLENBQUM7SUFDaEUsTUFBTSxNQUFNLEdBQUcsTUFBTSxDQUNqQixPQUFPLEVBQUUsQ0FBQyxDQUFDLEtBQUssRUFBRSxDQUFDLENBQUMsS0FBSyxFQUFFLElBQUksQ0FBQyxjQUFjLENBQUMsQ0FBQyxDQUFDLEtBQUssQ0FBQyxFQUFFLFFBQVEsRUFBRSxLQUFLLENBQUMsQ0FBQztJQUU5RSxPQUFPLE9BQU8sQ0FBQyxjQUFjLENBQUMsTUFBTSxDQUFDLEtBQUssRUFBRSxTQUFTLEVBQUUsTUFBTSxDQUFDLE1BQU0sQ0FBQyxDQUFDO0FBQ3hFLENBQUM7QUFFRCxNQUFNLENBQUMsTUFBTSxlQUFlLEdBQWlCO0lBQzNDLFVBQVUsRUFBRSxTQUFTO0lBQ3JCLFdBQVcsRUFBRSxLQUFLO0lBQ2xCLFVBQVUsRUFBRSxTQUE2QjtDQUMxQyxDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiLyoqXG4gKiBAbGljZW5zZVxuICogQ29weXJpZ2h0IDIwMjAgR29vZ2xlIExMQy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC5cbiAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSBcIkxpY2Vuc2VcIik7XG4gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuXG4gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXRcbiAqXG4gKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjBcbiAqXG4gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlXG4gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiBcIkFTIElTXCIgQkFTSVMsXG4gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC5cbiAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmRcbiAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLlxuICogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbiAqL1xuXG5pbXBvcnQge2JhY2tlbmRfdXRpbCwgS2VybmVsQ29uZmlnLCBLZXJuZWxGdW5jLCBNYXhQb29sM0QsIE1heFBvb2wzREF0dHJzLCBNYXhQb29sM0RJbnB1dHMsIFRlbnNvckluZm8sIFR5cGVkQXJyYXksIHV0aWx9IGZyb20gJ0B0ZW5zb3JmbG93L3RmanMtY29yZSc7XG5cbmltcG9ydCB7TWF0aEJhY2tlbmRDUFV9IGZyb20gJy4uL2JhY2tlbmRfY3B1JztcbmltcG9ydCB7YXNzZXJ0Tm90Q29tcGxleH0gZnJvbSAnLi4vY3B1X3V0aWwnO1xuaW1wb3J0IHtwb29sM2R9IGZyb20gJy4uL3V0aWxzL3Bvb2xfdXRpbHMnO1xuXG5leHBvcnQgZnVuY3Rpb24gbWF4UG9vbDNEKGFyZ3M6IHtcbiAgaW5wdXRzOiBNYXhQb29sM0RJbnB1dHMsXG4gIGJhY2tlbmQ6IE1hdGhCYWNrZW5kQ1BVLFxuICBhdHRyczogTWF4UG9vbDNEQXR0cnNcbn0pOiBUZW5zb3JJbmZvIHtcbiAgY29uc3Qge2lucHV0cywgYmFja2VuZCwgYXR0cnN9ID0gYXJncztcbiAgY29uc3Qge3h9ID0gaW5wdXRzO1xuICBjb25zdCB7ZmlsdGVyU2l6ZSwgc3RyaWRlcywgcGFkLCBkaW1Sb3VuZGluZ01vZGUsIGRhdGFGb3JtYXR9ID0gYXR0cnM7XG5cbiAgYXNzZXJ0Tm90Q29tcGxleCh4LCAnbWF4UG9vbDNkJyk7XG5cbiAgY29uc3QgY29udkluZm8gPSBiYWNrZW5kX3V0aWwuY29tcHV0ZVBvb2wzREluZm8oXG4gICAgICB4LnNoYXBlIGFzIFtudW1iZXIsIG51bWJlciwgbnVtYmVyLCBudW1iZXIsIG51bWJlcl0sIGZpbHRlclNpemUsIHN0cmlkZXMsXG4gICAgICAxIC8qIGRpbGF0aW9ucyAqLywgcGFkLCBkaW1Sb3VuZGluZ01vZGUsIGRhdGFGb3JtYXQpO1xuXG4gIGNvbnN0IHhWYWx1ZXMgPSBiYWNrZW5kLmRhdGEuZ2V0KHguZGF0YUlkKS52YWx1ZXMgYXMgVHlwZWRBcnJheTtcbiAgY29uc3Qgb3V0QnVmID0gcG9vbDNkKFxuICAgICAgeFZhbHVlcywgeC5zaGFwZSwgeC5kdHlwZSwgdXRpbC5jb21wdXRlU3RyaWRlcyh4LnNoYXBlKSwgY29udkluZm8sICdtYXgnKTtcblxuICByZXR1cm4gYmFja2VuZC5tYWtlVGVuc29ySW5mbyhvdXRCdWYuc2hhcGUsICdmbG9hdDMyJywgb3V0QnVmLnZhbHVlcyk7XG59XG5cbmV4cG9ydCBjb25zdCBtYXhQb29sM0RDb25maWc6IEtlcm5lbENvbmZpZyA9IHtcbiAga2VybmVsTmFtZTogTWF4UG9vbDNELFxuICBiYWNrZW5kTmFtZTogJ2NwdScsXG4gIGtlcm5lbEZ1bmM6IG1heFBvb2wzRCBhcyB7fSBhcyBLZXJuZWxGdW5jXG59O1xuIl19","/**\n * @license\n * Copyright 2020 Google LLC. All Rights Reserved.\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n * =============================================================================\n */\nimport { backend_util, buffer, MaxPool3DGrad } from '@tensorflow/tfjs-core';\nimport { assertNotComplex } from '../cpu_util';\nimport { maxPool3dPositions } from '../utils/pool_utils';\nexport function maxPool3DGrad(args) {\n const { inputs, backend, attrs } = args;\n const { dy, input } = inputs;\n const { filterSize, strides, pad, dimRoundingMode } = attrs;\n assertNotComplex([dy, input], 'maxPool3DGrad');\n const convInfo = backend_util.computePool3DInfo(input.shape, filterSize, strides, 1 /* dilations */, pad, dimRoundingMode);\n const inputBuf = backend.bufferSync(input);\n const maxPosBuf = maxPool3dPositions(inputBuf, convInfo);\n const strideDepth = convInfo.strideDepth;\n const strideHeight = convInfo.strideHeight;\n const strideWidth = convInfo.strideWidth;\n const dilationDepth = convInfo.dilationDepth;\n const dilationHeight = convInfo.dilationHeight;\n const dilationWidth = convInfo.dilationWidth;\n const effectiveFilterDepth = convInfo.effectiveFilterDepth;\n const effectiveFilterHeight = convInfo.effectiveFilterHeight;\n const effectiveFilterWidth = convInfo.effectiveFilterWidth;\n const padFront = effectiveFilterDepth - 1 - convInfo.padInfo.front;\n const padLeft = effectiveFilterWidth - 1 - convInfo.padInfo.left;\n const padTop = effectiveFilterHeight - 1 - convInfo.padInfo.top;\n const dx = buffer(input.shape, 'float32');\n const dyBuf = backend.bufferSync(dy);\n for (let batch = 0; batch < convInfo.batchSize; ++batch) {\n for (let channel = 0; channel < convInfo.inChannels; ++channel) {\n for (let dxDepth = 0; dxDepth < convInfo.inDepth; ++dxDepth) {\n for (let dxRow = 0; dxRow < convInfo.inHeight; ++dxRow) {\n for (let dxCol = 0; dxCol < convInfo.inWidth; ++dxCol) {\n // Shader code begins\n const dyDepthCorner = dxDepth - padFront;\n const dyRowCorner = dxRow - padTop;\n const dyColCorner = dxCol - padLeft;\n let dotProd = 0;\n for (let wDepth = 0; wDepth < effectiveFilterDepth; wDepth += dilationDepth) {\n const dyDepth = (dyDepthCorner + wDepth) / strideDepth;\n if (dyDepth < 0 || dyDepth >= convInfo.outDepth ||\n Math.floor(dyDepth) !== dyDepth) {\n continue;\n }\n for (let wRow = 0; wRow < effectiveFilterHeight; wRow += dilationHeight) {\n const dyRow = (dyRowCorner + wRow) / strideHeight;\n if (dyRow < 0 || dyRow >= convInfo.outHeight ||\n Math.floor(dyRow) !== dyRow) {\n continue;\n }\n for (let wCol = 0; wCol < effectiveFilterWidth; wCol += dilationWidth) {\n const dyCol = (dyColCorner + wCol) / strideWidth;\n if (dyCol < 0 || dyCol >= convInfo.outWidth ||\n Math.floor(dyCol) !== dyCol) {\n continue;\n }\n const maxPos = effectiveFilterDepth * effectiveFilterHeight *\n effectiveFilterWidth -\n 1 -\n maxPosBuf.get(batch, dyDepth, dyRow, dyCol, channel);\n const curPos = wDepth * effectiveFilterHeight * effectiveFilterWidth +\n wRow * effectiveFilterWidth + wCol;\n const mask = maxPos === curPos ? 1 : 0;\n if (mask === 0) {\n continue;\n }\n const pixel = dyBuf.get(batch, dyDepth, dyRow, dyCol, channel);\n dotProd += pixel * mask;\n }\n }\n }\n dx.set(dotProd, batch, dxDepth, dxRow, dxCol, channel);\n }\n }\n }\n }\n }\n return backend.makeTensorInfo(dx.shape, dx.dtype, dx.values);\n}\nexport const maxPool3DGradConfig = {\n kernelName: MaxPool3DGrad,\n backendName: 'cpu',\n kernelFunc: maxPool3DGrad\n};\n//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiTWF4UG9vbDNER3JhZC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uLy4uL3RmanMtYmFja2VuZC1jcHUvc3JjL2tlcm5lbHMvTWF4UG9vbDNER3JhZC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQTs7Ozs7Ozs7Ozs7Ozs7O0dBZUc7QUFFSCxPQUFPLEVBQUMsWUFBWSxFQUFFLE1BQU0sRUFBNEIsYUFBYSxFQUE0RCxNQUFNLHVCQUF1QixDQUFDO0FBRy9KLE9BQU8sRUFBQyxnQkFBZ0IsRUFBQyxNQUFNLGFBQWEsQ0FBQztBQUM3QyxPQUFPLEVBQUMsa0JBQWtCLEVBQUMsTUFBTSxxQkFBcUIsQ0FBQztBQUV2RCxNQUFNLFVBQVUsYUFBYSxDQUFDLElBSTdCO0lBQ0MsTUFBTSxFQUFDLE1BQU0sRUFBRSxPQUFPLEVBQUUsS0FBSyxFQUFDLEdBQUcsSUFBSSxDQUFDO0lBQ3RDLE1BQU0sRUFBQyxFQUFFLEVBQUUsS0FBSyxFQUFDLEdBQUcsTUFBTSxDQUFDO0lBQzNCLE1BQU0sRUFBQyxVQUFVLEVBQUUsT0FBTyxFQUFFLEdBQUcsRUFBRSxlQUFlLEVBQUMsR0FBRyxLQUFLLENBQUM7SUFFMUQsZ0JBQWdCLENBQUMsQ0FBQyxFQUFFLEVBQUUsS0FBSyxDQUFDLEVBQUUsZUFBZSxDQUFDLENBQUM7SUFFL0MsTUFBTSxRQUFRLEdBQUcsWUFBWSxDQUFDLGlCQUFpQixDQUMzQyxLQUFLLENBQUMsS0FBaUQsRUFBRSxVQUFVLEVBQ25FLE9BQU8sRUFBRSxDQUFDLENBQUMsZUFBZSxFQUFFLEdBQUcsRUFBRSxlQUFlLENBQUMsQ0FBQztJQUV0RCxNQUFNLFFBQVEsR0FBRyxPQUFPLENBQUMsVUFBVSxDQUFDLEtBQUssQ0FBQyxDQUFDO0lBQzNDLE1BQU0sU0FBUyxHQUFHLGtCQUFrQixDQUFDLFFBQVEsRUFBRSxRQUFRLENBQUMsQ0FBQztJQUN6RCxNQUFNLFdBQVcsR0FBRyxRQUFRLENBQUMsV0FBVyxDQUFDO0lBQ3pD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SUFFRCxPQUFPLE9BQU8sQ0FBQyxjQUFjLENBQUMsRUFBRSxDQUFDLEtBQUssRUFBRSxFQUFFLENBQUMsS0FBSyxFQUFFLEVBQUUsQ0FBQyxNQUFNLENBQUMsQ0FBQztBQUMvRCxDQUFDO0FBRUQsTUFBTSxDQUFDLE1BQU0sbUJBQW1CLEdBQWlCO0lBQy9DLFVBQVUsRUFBRSxhQUFhO0lBQ3pCLFdBQVcsRUFBRSxLQUFLO0lBQ2xCLFVBQVUsRUFBRSxhQUFpQztDQUM5QyxDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiLyoqXG4gKiBAbGljZW5zZVxuICogQ29weXJpZ2h0IDIwMjAgR29vZ2xlIExMQy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC5cbiAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSBcIkxpY2Vuc2VcIik7XG4gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuXG4gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXRcbiAqXG4gKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjBcbiAqXG4gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlXG4gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiBcIkFTIElTXCIgQkFTSVMsXG4gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC5cbiAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmRcbiAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLlxuICogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbiAqL1xuXG5pbXBvcnQge2JhY2tlbmRfdXRpbCwgYnVmZmVyLCBLZXJuZWxDb25maWcsIEtlcm5lbEZ1bmMsIE1heFBvb2wzREdyYWQsIE1heFBvb2wzREdyYWRBdHRycywgTWF4UG9vbDNER3JhZElucHV0cywgUmFuaywgVGVuc29ySW5mb30gZnJvbSAnQHRlbnNvcmZsb3cvdGZqcy1jb3JlJztcblxuaW1wb3J0IHtNYXRoQmFja2VuZENQVX0gZnJvbSAnLi4vYmFja2VuZF9jcHUnO1xuaW1wb3J0IHthc3NlcnROb3RDb21wbGV4fSBmcm9tICcuLi9jcHVfdXRpbCc7XG5pbXBvcnQge21heFBvb2wzZFBvc2l0aW9uc30gZnJvbSAnLi4vdXRpbHMvcG9vbF91dGlscyc7XG5cbmV4cG9ydCBmdW5jdGlvbiBtYXhQb29sM0RHcmFkKGFyZ3M6IHtcbiAgaW5wdXRzOiBNYXhQb29sM0RHcmFkSW5wdXRzLFxuICBiYWNrZW5kOiBNYXRoQmFja2VuZENQVSxcbiAgYXR0cnM6IE1heFBvb2wzREdyYWRBdHRyc1xufSk6IFRlbnNvckluZm8ge1xuICBjb25zdCB7aW5wdXRzLCBiYWNrZW5kLCBhdHRyc30gPSBhcmdzO1xuICBjb25zdCB7ZHksIGlucHV0fSA9IGlucHV0cztcbiAgY29uc3Qge2ZpbHRlclNpemUsIHN0cmlkZXMsIHBhZCwgZGltUm91bmRpbmdNb2RlfSA9IGF0dHJzO1xuXG4gIGFzc2VydE5vdENvbXBsZXgoW2R5LCBpbnB1dF0sICdtYXhQb29sM0RHcmFkJyk7XG5cbiAgY29uc3QgY29udkluZm8gPSBiYWNrZW5kX3V0aWwuY29tcHV0ZVBvb2wzREluZm8oXG4gICAgICBpbnB1dC5zaGFwZSBhcyBbbnVtYmVyLCBudW1iZXIsIG51bWJlciwgbnVtYmVyLCBudW1iZXJdLCBmaWx0ZXJTaXplLFxuICAgICAgc3RyaWRlcywgMSAvKiBkaWxhdGlvbnMgKi8sIHBhZCwgZGltUm91bmRpbmdNb2RlKTtcblxuICBjb25zdCBpbnB1dEJ1ZiA9IGJhY2tlbmQuYnVmZmVyU3luYyhpbnB1dCk7XG4gIGNvbnN0IG1heFBvc0J1ZiA9IG1heFBvb2wzZFBvc2l0aW9ucyhpbnB1dEJ1ZiwgY29udkluZm8pO1xuICBjb25zdCBzdHJpZGVEZXB0aCA9IGNvbnZJbmZvLnN0cmlkZURlcHRoO1xuICBjb25zdCBzdHJpZGVIZWlnaHQgPSBjb252SW5mby5zdHJpZGVIZWlnaHQ7XG4gIGNvbnN0IHN0cmlkZVdpZHRoID0gY29udkluZm8uc3RyaWRlV2lkdGg7XG4gIGNvbnN0IGRpbGF0aW9uRGVwdGggPSBjb252SW5mby5kaWxhdGlvbkRlcHRoO1xuICBjb25zdCBkaWxhdGlvbkhlaWdodCA9IGNvbnZJbmZvLmRpbGF0aW9uSGVpZ2h0O1xuICBjb25zdCBkaWxhdGlvbldpZHRoID0gY29udkluZm8uZGlsYXRpb25XaWR0aDtcbiAgY29uc3QgZWZmZWN0aXZlRmlsdGVyRGVwdGggPSBjb252SW5mby5lZmZlY3RpdmVGaWx0ZXJEZXB0aDtcbiAgY29uc3QgZWZmZWN0aXZlRmlsdGVySGVpZ2h0ID0gY29udkluZm8uZWZmZWN0aXZlRmlsdGVySGVpZ2h0O1xuICBjb25zdCBlZmZlY3RpdmVGaWx0ZXJXaWR0aCA9IGNvbnZJbmZvLmVmZmVjdGl2ZUZpbHRlcldpZHRoO1xuICBjb25zdCBwYWRGcm9udCA9IGVmZmVjdGl2ZUZpbHRlckRlcHRoIC0gMSAtIGNvbnZJbmZvLnBhZEluZm8uZnJvbnQ7XG4gIGNvbnN0IHBhZExlZnQgPSBlZmZlY3RpdmVGaWx0ZXJXaWR0aCAtIDEgLSBjb252SW5mby5wYWRJbmZvLmxlZnQ7XG4gIGNvbnN0IHBhZFRvcCA9IGVmZmVjdGl2ZUZpbHRlckhlaWdodCAtIDEgLSBjb252SW5mby5wYWRJbmZvLnRvcDtcbiAgY29uc3QgZHggPSBidWZmZXIoaW5wdXQuc2hhcGUsICdmbG9hdDMyJyk7XG5cbiAgY29uc3QgZHlCdWYgPSBiYWNrZW5kLmJ1ZmZlclN5bmM8UmFuaywgJ2Zsb2F0MzInPihkeSk7XG5cbiAgZm9yIChsZXQgYmF0Y2ggPSAwOyBiYXRjaCA8IGNvbnZJbmZvLmJhdGNoU2l6ZTsgKytiYXRjaCkge1xuICAgIGZvciAobGV0IGNoYW5uZWwgPSAwOyBjaGFubmVsIDwgY29udkluZm8uaW5DaGFubmVsczsgKytjaGFubmVsKSB7XG4gICAgICBmb3IgKGxldCBkeERlcHRoID0gMDsgZHhEZXB0aCA8IGNvbnZJbmZvLmluRGVwdGg7ICsrZHhEZXB0aCkge1xuICAgICAgICBmb3IgKGxldCBkeFJvdyA9IDA7IGR4Um93IDwgY29udkluZm8uaW5IZWlnaHQ7ICsrZHhSb3cpIHtcbiAgICAgICAgICBmb3IgKGxldCBkeENvbCA9IDA7IGR4Q29sIDwgY29udkluZm8uaW5XaWR0aDsgKytkeENvbCkge1xuICAgICAgICAgICAgLy8gU2hhZGVyIGNvZGUgYmVnaW5zXG4gICAgICAgICAgICBjb25zdCBkeURlcHRoQ29ybmVyID0gZHhEZXB0aCAtIHBhZEZyb250O1xuICAgICAgICAgICAgY29uc3QgZHlSb3dDb3JuZXIgPSBkeFJvdyAtIHBhZFRvcDtcbiAgICAgICAgICAgIGNvbnN0IGR5Q29sQ29ybmVyID0gZHhDb2wgLSBwYWRMZWZ0O1xuICAgICAgICAgICAgbGV0IGRvdFByb2QgPSAwO1xuICAgICAgICAgICAgZm9yIChsZXQgd0RlcHRoID0gMDsgd0RlcHRoIDwgZWZmZWN0aXZlRmlsdGVyRGVwdGg7XG4gICAgICAgICAgICAgICAgIHdEZXB0aCArPSBkaWxhdGlvbkRlcHRoKSB7XG4gICAgICAgICAgICAgIGNvbnN0IGR5RGVwdGggPSAoZHlEZXB0aENvcm5lciArIHdEZXB0aCkgLyBzdHJpZGVEZXB0aDtcbiAgICAgICAgICAgICAgaWYgKGR5RGVwdGggPCAwIHx8IGR5RGVwdGggPj0gY29udkluZm8ub3V0RGVwdGggfHxcbiAgICAgICAgICAgICAgICAgIE1hdGguZmxvb3IoZHlEZXB0aCkgIT09IGR5RGVwdGgpIHtcbiAgICAgICAgICAgICAgICBjb250aW51ZTtcbiAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICBmb3IgKGxldCB3Um93ID0gMDsgd1JvdyA8IGVmZmVjdGl2ZUZpbHRlckhlaWdodDtcbiAgICAgICAgICAgICAgICAgICB3Um93ICs9IGRpbGF0aW9uSGVpZ2h0KSB7XG4gICAgICAgICAgICAgICAgY29uc3QgZHlSb3cgPSAoZHlSb3dDb3JuZXIgKyB3Um93KSAvIHN0cmlkZUhlaWdodDtcbiAgICAgICAgICAgICAgICBpZiAoZHlSb3cgPCAwIHx8IGR5Um93ID49IGNvbnZJbmZvLm91dEhlaWdodCB8fFxuICAgICAgICAgICAgICAgICAgICBNYXRoLmZsb29yKGR5Um93KSAhPT0gZHlSb3cpIHtcbiAgICAgICAgICAgICAgICAgIGNvbnRpbnVlO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBmb3IgKGxldCB3Q29sID0gMDsgd0NvbCA8IGVmZmVjdGl2ZUZpbHRlcldpZHRoO1xuICAgICAgICAgICAgICAgICAgICAgd0NvbCArPSBkaWxhdGlvbldpZHRoKSB7XG4gICAgICAgICAgICAgICAgICBjb25zdCBkeUNvbCA9IChkeUNvbENvcm5lciArIHdDb2wpIC8gc3RyaWRlV2lkdGg7XG4gICAgICAgICAgICAgICAgICBpZiAoZHlDb2wgPCAwIHx8IGR5Q29sID49IGNvbnZJbmZvLm91dFdpZHRoIHx8XG4gICAgICAgICAgICAgICAgICAgICAgTWF0aC5mbG9vcihkeUNvbCkgIT09IGR5Q29sKSB7XG4gICAgICAgICAgICAgICAgICAgIGNvbnRpbnVlO1xuICAgICAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgICAgICBjb25zdCBtYXhQb3MgPSBlZmZlY3RpdmVGaWx0ZXJEZXB0aCAqIGVmZmVjdGl2ZUZpbHRlckhlaWdodCAqXG4gICAgICAgICAgICAgICAgICAgICAgICAgIGVmZmVjdGl2ZUZpbHRlcldpZHRoIC1cbiAgICAgICAgICAgICAgICAgICAgICAxIC1cbiAgICAgICAgICAgICAgICAgICAgICAobWF4UG9zQnVmLmdldChiYXRjaCwgZHlEZXB0aCwgZHlSb3csIGR5Q29sLCBjaGFubmVsKSBhc1xuICAgICAgICAgICAgICAgICAgICAgICBudW1iZXIpO1xuICAgICAgICAgICAgICAgICAgY29uc3QgY3VyUG9zID1cbiAgICAgICAgICAgICAgICAgICAgICB3RGVwdGggKiBlZmZlY3RpdmVGaWx0ZXJIZWlnaHQgKiBlZmZlY3RpdmVGaWx0ZXJXaWR0aCArXG4gICAgICAgICAgICAgICAgICAgICAgd1JvdyAqIGVmZmVjdGl2ZUZpbHRlcldpZHRoICsgd0NvbDtcblxuICAgICAgICAgICAgICAgICAgY29uc3QgbWFzayA9IG1heFBvcyA9PT0gY3VyUG9zID8gMSA6IDA7XG4gICAgICAgICAgICAgICAgICBpZiAobWFzayA9PT0gMCkge1xuICAgICAgICAgICAgICAgICAgICBjb250aW51ZTtcbiAgICAgICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICAgICAgY29uc3QgcGl4ZWwgPVxuICAgICAgICAgICAgICAgICAgICAgIGR5QnVmLmdldChiYXRjaCwgZHlEZXB0aCwgZHlSb3csIGR5Q29sLCBjaGFubmVsKTtcbiAgICAgICAgICAgICAgICAgIGRvdFByb2QgKz0gcGl4ZWwgKiBtYXNrO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICAgICAgZHguc2V0KGRvdFByb2QsIGJhdGNoLCBkeERlcHRoLCBkeFJvdywgZHhDb2wsIGNoYW5uZWwpO1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgfVxuICAgIH1cbiAgfVxuXG4gIHJldHVybiBiYWNrZW5kLm1ha2VUZW5zb3JJbmZvKGR4LnNoYXBlLCBkeC5kdHlwZSwgZHgudmFsdWVzKTtcbn1cblxuZXhwb3J0IGNvbnN0IG1heFBvb2wzREdyYWRDb25maWc6IEtlcm5lbENvbmZpZyA9IHtcbiAga2VybmVsTmFtZTogTWF4UG9vbDNER3JhZCxcbiAgYmFja2VuZE5hbWU6ICdjcHUnLFxuICBrZXJuZWxGdW5jOiBtYXhQb29sM0RHcmFkIGFzIHt9IGFzIEtlcm5lbEZ1bmNcbn07XG4iXX0=","/**\n * @license\n * Copyright 2020 Google LLC. All Rights Reserved.\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n * =============================================================================\n */\nimport { backend_util, buffer, MaxPoolGrad } from '@tensorflow/tfjs-core';\nimport { assertNotComplex } from '../cpu_util';\nimport { maxPoolPositions } from '../utils/pool_utils';\nexport function maxPoolGrad(args) {\n const { inputs, backend, attrs } = args;\n const { dy, input, output } = inputs;\n const x = input;\n assertNotComplex([input, output], 'maxPoolGrad');\n const { filterSize, strides, pad, dimRoundingMode } = attrs;\n const convInfo = backend_util.computePool2DInfo(x.shape, filterSize, strides, 1 /* dilations */, pad, dimRoundingMode);\n const xValues = backend.data.get(x.dataId).values;\n const maxPosBuf = buffer(convInfo.outShape, x.dtype, maxPoolPositions(xValues, x.shape, x.dtype, convInfo).values);\n const strideHeight = convInfo.strideHeight;\n const strideWidth = convInfo.strideWidth;\n const dilationHeight = convInfo.dilationHeight;\n const dilationWidth = convInfo.dilationWidth;\n const effectiveFilterHeight = convInfo.effectiveFilterHeight;\n const effectiveFilterWidth = convInfo.effectiveFilterWidth;\n const padLeft = effectiveFilterWidth - 1 - convInfo.padInfo.left;\n const padTop = effectiveFilterHeight - 1 - convInfo.padInfo.top;\n const dx = buffer(x.shape, 'float32');\n const dyData = backend.data.get(dy.dataId).values;\n const dyBuf = buffer(dy.shape, 'float32', dyData);\n for (let b = 0; b < convInfo.batchSize; ++b) {\n for (let d = 0; d < convInfo.inChannels; ++d) {\n for (let dxR = 0; dxR < convInfo.inHeight; ++dxR) {\n for (let dxC = 0; dxC < convInfo.inWidth; ++dxC) {\n // Shader code begins.\n const dyRCorner = dxR - padTop;\n const dyCCorner = dxC - padLeft;\n let dotProd = 0;\n for (let wR = 0; wR < effectiveFilterHeight; wR += dilationHeight) {\n const dyR = (dyRCorner + wR) / strideHeight;\n if (dyR < 0 || dyR >= convInfo.outHeight ||\n Math.floor(dyR) !== dyR) {\n continue;\n }\n for (let wC = 0; wC < effectiveFilterWidth; wC += dilationWidth) {\n const dyC = (dyCCorner + wC) / strideWidth;\n if (dyC < 0 || dyC >= convInfo.outWidth ||\n Math.floor(dyC) !== dyC) {\n continue;\n }\n const maxPos = effectiveFilterHeight * effectiveFilterWidth - 1 -\n maxPosBuf.get(b, dyR, dyC, d);\n const curPos = wR * effectiveFilterWidth + wC;\n const mask = maxPos === curPos ? 1 : 0;\n if (mask === 0) {\n continue;\n }\n const pixel = dyBuf.get(b, dyR, dyC, d);\n dotProd += pixel * mask;\n }\n }\n dx.set(dotProd, b, dxR, dxC, d);\n }\n }\n }\n }\n return backend.makeTensorInfo(dx.shape, dx.dtype, dx.values);\n}\nexport const maxPoolGradConfig = {\n kernelName: MaxPoolGrad,\n backendName: 'cpu',\n kernelFunc: maxPoolGrad\n};\n//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiTWF4UG9vbEdyYWQuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi8uLi90ZmpzLWJhY2tlbmQtY3B1L3NyYy9rZXJuZWxzL01heFBvb2xHcmFkLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBOzs7Ozs7Ozs7Ozs7Ozs7R0FlRztBQUNILE9BQU8sRUFBQyxZQUFZLEVBQUUsTUFBTSxFQUE0QixXQUFXLEVBQW9FLE1BQU0sdUJBQXVCLENBQUM7QUFHckssT0FBTyxFQUFDLGdCQUFnQixFQUFDLE1BQU0sYUFBYSxDQUFDO0FBQzdDLE9BQU8sRUFBQyxnQkFBZ0IsRUFBQyxNQUFNLHFCQUFxQixDQUFDO0FBRXJELE1BQU0sVUFBVSxXQUFXLENBQUMsSUFJM0I7SUFDQyxNQUFNLEVBQUMsTUFBTSxFQUFFLE9BQU8sRUFBRSxLQUFLLEVBQUMsR0FBRyxJQUFJLENBQUM7SUFDdEMsTUFBTSxFQUFDLEVBQUUsRUFBRSxLQUFLLEVBQUUsTUFBTSxFQUFDLEdBQUcsTUFBTSxDQUFDO0lBQ25DLE1BQU0sQ0FBQyxHQUFHLEtBQUssQ0FBQztJQUNoQixnQkFBZ0IsQ0FBQyxDQUFDLEtBQUssRUFBRSxNQUFNLENBQUMsRUFBRSxhQUFhLENBQUMsQ0FBQztJQUNqRCxNQUFNLEVBQUMsVUFBVSxFQUFFLE9BQU8sRUFBRSxHQUFHLEVBQUUsZUFBZSxFQUFDLEdBQUcsS0FBSyxDQUFDO0lBRTFELE1BQU0sUUFBUSxHQUFHLFlBQVksQ0FBQyxpQkFBaUIsQ0FDM0MsQ0FBQyxDQUFDLEtBQXlDLEVBQUUsVUFBVSxFQUFFLE9BQU8sRUFDaEUsQ0FBQyxDQUFDLGVBQWUsRUFBRSxHQUFHLEVBQUUsZUFBZSxDQUFDLENBQUM7SUFDN0MsTUFBTSxPQUFPLEdBQUcsT0FBTyxDQUFDLElBQUksQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLE1BQU0sQ0FBQyxDQUFDLE1BQW9CLENBQUM7SUFDaEUsTUFBTSxTQUFTLEdBQUcsTUFBTSxDQUNwQixRQUFR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O2dDQUMxRCxTQUFTLENBQUMsR0FBRyxDQUFDLENBQUMsRUFBRSxHQUFHLEVBQUUsR0FBRyxFQUFFLENBQUMsQ0FBWSxDQUFDOzRCQUM5QyxNQUFNLE1BQU0sR0FBRyxFQUFFLEdBQUcsb0JBQW9CLEdBQUcsRUFBRSxDQUFDOzRCQUU5QyxNQUFNLElBQUksR0FBRyxNQUFNLEtBQUssTUFBTSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQzs0QkFDdkMsSUFBSSxJQUFJLEtBQUssQ0FBQyxFQUFFO2dDQUNkLFNBQVM7NkJBQ1Y7NEJBRUQsTUFBTSxLQUFLLEdBQUcsS0FBSyxDQUFDLEdBQUcsQ0FBQyxDQUFDLEVBQUUsR0FBRyxFQUFFLEdBQUcsRUFBRSxDQUFDLENBQUMsQ0FBQzs0QkFDeEMsT0FBTyxJQUFJLEtBQUssR0FBRyxJQUFJLENBQUM7eUJBQ3pCO3FCQUNGO29CQUNELEVBQUUsQ0FBQyxHQUFHLENBQUMsT0FBTyxFQUFFLENBQUMsRUFBRSxHQUFHLEVBQUUsR0FBRyxFQUFFLENBQUMsQ0FBQyxDQUFDO2lCQUNqQzthQUNGO1NBQ0Y7S0FDRjtJQUNELE9BQU8sT0FBTyxDQUFDLGNBQWMsQ0FBQyxFQUFFLENBQUMsS0FBSyxFQUFFLEVBQUUsQ0FBQyxLQUFLLEVBQUUsRUFBRSxDQUFDLE1BQU0sQ0FBQyxDQUFDO0FBQy9ELENBQUM7QUFFRCxNQUFNLENBQUMsTUFBTSxpQkFBaUIsR0FBaUI7SUFDN0MsVUFBVSxFQUFFLFdBQVc7SUFDdkIsV0FBVyxFQUFFLEtBQUs7SUFDbEIsVUFBVSxFQUFFLFdBQStCO0NBQzVDLENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyIvKipcbiAqIEBsaWNlbnNlXG4gKiBDb3B5cmlnaHQgMjAyMCBHb29nbGUgTExDLiBBbGwgUmlnaHRzIFJlc2VydmVkLlxuICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlIFwiTGljZW5zZVwiKTtcbiAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS5cbiAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdFxuICpcbiAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMFxuICpcbiAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmVcbiAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuIFwiQVMgSVNcIiBCQVNJUyxcbiAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLlxuICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZFxuICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuXG4gKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuICovXG5pbXBvcnQge2JhY2tlbmRfdXRpbCwgYnVmZmVyLCBLZXJuZWxDb25maWcsIEtlcm5lbEZ1bmMsIE1heFBvb2xHcmFkLCBNYXhQb29sR3JhZEF0dHJzLCBNYXhQb29sR3JhZElucHV0cywgUmFuaywgVGVuc29ySW5mbywgVHlwZWRBcnJheX0gZnJvbSAnQHRlbnNvcmZsb3cvdGZqcy1jb3JlJztcblxuaW1wb3J0IHtNYXRoQmFja2VuZENQVX0gZnJvbSAnLi4vYmFja2VuZF9jcHUnO1xuaW1wb3J0IHthc3NlcnROb3RDb21wbGV4fSBmcm9tICcuLi9jcHVfdXRpbCc7XG5pbXBvcnQge21heFBvb2xQb3NpdGlvbnN9IGZyb20gJy4uL3V0aWxzL3Bvb2xfdXRpbHMnO1xuXG5leHBvcnQgZnVuY3Rpb24gbWF4UG9vbEdyYWQoYXJnczoge1xuICBpbnB1dHM6IE1heFBvb2xHcmFkSW5wdXRzLFxuICBiYWNrZW5kOiBNYXRoQmFja2VuZENQVSxcbiAgYXR0cnM6IE1heFBvb2xHcmFkQXR0cnNcbn0pOiBUZW5zb3JJbmZvIHtcbiAgY29uc3Qge2lucHV0cywgYmFja2VuZCwgYXR0cnN9ID0gYXJncztcbiAgY29uc3Qge2R5LCBpbnB1dCwgb3V0cHV0fSA9IGlucHV0cztcbiAgY29uc3QgeCA9IGlucHV0O1xuICBhc3NlcnROb3RDb21wbGV4KFtpbnB1dCwgb3V0cHV0XSwgJ21heFBvb2xHcmFkJyk7XG4gIGNvbnN0IHtmaWx0ZXJTaXplLCBzdHJpZGVzLCBwYWQsIGRpbVJvdW5kaW5nTW9kZX0gPSBhdHRycztcblxuICBjb25zdCBjb252SW5mbyA9IGJhY2tlbmRfdXRpbC5jb21wdXRlUG9vbDJESW5mbyhcbiAgICAgIHguc2hhcGUgYXMgW251bWJlciwgbnVtYmVyLCBudW1iZXIsIG51bWJlcl0sIGZpbHRlclNpemUsIHN0cmlkZXMsXG4gICAgICAxIC8qIGRpbGF0aW9ucyAqLywgcGFkLCBkaW1Sb3VuZGluZ01vZGUpO1xuICBjb25zdCB4VmFsdWVzID0gYmFja2VuZC5kYXRhLmdldCh4LmRhdGFJZCkudmFsdWVzIGFzIFR5cGVkQXJyYXk7XG4gIGNvbnN0IG1heFBvc0J1ZiA9IGJ1ZmZlcihcbiAgICAgIGNvbnZJbmZvLm91dFNoYXBlLCB4LmR0eXBlLFxuICAgICAgbWF4UG9vbFBvc2l0aW9ucyh4VmFsdWVzLCB4LnNoYXBlLCB4LmR0eXBlLCBjb252SW5mbykudmFsdWVzKTtcbiAgY29uc3Qgc3RyaWRlSGVpZ2h0ID0gY29udkluZm8uc3RyaWRlSGVpZ2h0O1xuICBjb25zdCBzdHJpZGVXaWR0aCA9IGNvbnZJbmZvLnN0cmlkZVdpZHRoO1xuICBjb25zdCBkaWxhdGlvbkhlaWdodCA9IGNvbnZJbmZvLmRpbGF0aW9uSGVpZ2h0O1xuICBjb25zdCBkaWxhdGlvbldpZHRoID0gY29udkluZm8uZGlsYXRpb25XaWR0aDtcbiAgY29uc3QgZWZmZWN0aXZlRmlsdGVySGVpZ2h0ID0gY29udkluZm8uZWZmZWN0aXZlRmlsdGVySGVpZ2h0O1xuICBjb25zdCBlZmZlY3RpdmVGaWx0ZXJXaWR0aCA9IGNvbnZJbmZvLmVmZmVjdGl2ZUZpbHRlcldpZHRoO1xuICBjb25zdCBwYWRMZWZ0ID0gZWZmZWN0aXZlRmlsdGVyV2lkdGggLSAxIC0gY29udkluZm8ucGFkSW5mby5sZWZ0O1xuICBjb25zdCBwYWRUb3AgPSBlZmZlY3RpdmVGaWx0ZXJIZWlnaHQgLSAxIC0gY29udkluZm8ucGFkSW5mby50b3A7XG4gIGNvbnN0IGR4ID1cbiAgICAgIGJ1ZmZlcjxSYW5rLlI0Pih4LnNoYXBlIGFzIFtudW1iZXIsIG51bWJlciwgbnVtYmVyLCBudW1iZXJdLCAnZmxvYXQzMicpO1xuXG4gIGNvbnN0IGR5RGF0YSA9IGJhY2tlbmQuZGF0YS5nZXQoZHkuZGF0YUlkKS52YWx1ZXMgYXMgRmxvYXQzMkFycmF5O1xuICBjb25zdCBkeUJ1ZiA9IGJ1ZmZlcjxSYW5rLlI0PihcbiAgICAgIGR5LnNoYXBlIGFzIFtudW1iZXIsIG51bWJlciwgbnVtYmVyLCBudW1iZXJdLCAnZmxvYXQzMicsIGR5RGF0YSk7XG5cbiAgZm9yIChsZXQgYiA9IDA7IGIgPCBjb252SW5mby5iYXRjaFNpemU7ICsrYikge1xuICAgIGZvciAobGV0IGQgPSAwOyBkIDwgY29udkluZm8uaW5DaGFubmVsczsgKytkKSB7XG4gICAgICBmb3IgKGxldCBkeFIgPSAwOyBkeFIgPCBjb252SW5mby5pbkhlaWdodDsgKytkeFIpIHtcbiAgICAgICAgZm9yIChsZXQgZHhDID0gMDsgZHhDIDwgY29udkluZm8uaW5XaWR0aDsgKytkeEMpIHtcbiAgICAgICAgICAvLyBTaGFkZXIgY29kZSBiZWdpbnMuXG4gICAgICAgICAgY29uc3QgZHlSQ29ybmVyID0gZHhSIC0gcGFkVG9wO1xuICAgICAgICAgIGNvbnN0IGR5Q0Nvcm5lciA9IGR4QyAtIHBhZExlZnQ7XG4gICAgICAgICAgbGV0IGRvdFByb2QgPSAwO1xuICAgICAgICAgIGZvciAobGV0IHdSID0gMDsgd1IgPCBlZmZlY3RpdmVGaWx0ZXJIZWlnaHQ7IHdSICs9IGRpbGF0aW9uSGVpZ2h0KSB7XG4gICAgICAgICAgICBjb25zdCBkeVIgPSAoZHlSQ29ybmVyICsgd1IpIC8gc3RyaWRlSGVpZ2h0O1xuICAgICAgICAgICAgaWYgKGR5UiA8IDAgfHwgZHlSID49IGNvbnZJbmZvLm91dEhlaWdodCB8fFxuICAgICAgICAgICAgICAgIE1hdGguZmxvb3IoZHlSKSAhPT0gZHlSKSB7XG4gICAgICAgICAgICAgIGNvbnRpbnVlO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgZm9yIChsZXQgd0MgPSAwOyB3QyA8IGVmZmVjdGl2ZUZpbHRlcldpZHRoOyB3QyArPSBkaWxhdGlvbldpZHRoKSB7XG4gICAgICAgICAgICAgIGNvbnN0IGR5QyA9IChkeUNDb3JuZXIgKyB3QykgLyBzdHJpZGVXaWR0aDtcbiAgICAgICAgICAgICAgaWYgKGR5QyA8IDAgfHwgZHlDID49IGNvbnZJbmZvLm91dFdpZHRoIHx8XG4gICAgICAgICAgICAgICAgICBNYXRoLmZsb29yKGR5QykgIT09IGR5Qykge1xuICAgICAgICAgICAgICAgIGNvbnRpbnVlO1xuICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgIGNvbnN0IG1heFBvcyA9IGVmZmVjdGl2ZUZpbHRlckhlaWdodCAqIGVmZmVjdGl2ZUZpbHRlcldpZHRoIC0gMSAtXG4gICAgICAgICAgICAgICAgICAobWF4UG9zQnVmLmdldChiLCBkeVIsIGR5QywgZCkgYXMgbnVtYmVyKTtcbiAgICAgICAgICAgICAgY29uc3QgY3VyUG9zID0gd1IgKiBlZmZlY3RpdmVGaWx0ZXJXaWR0aCArIHdDO1xuXG4gICAgICAgICAgICAgIGNvbnN0IG1hc2sgPSBtYXhQb3MgPT09IGN1clBvcyA/IDEgOiAwO1xuICAgICAgICAgICAgICBpZiAobWFzayA9PT0gMCkge1xuICAgICAgICAgICAgICAgIGNvbnRpbnVlO1xuICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgY29uc3QgcGl4ZWwgPSBkeUJ1Zi5nZXQoYiwgZHlSLCBkeUMsIGQpO1xuICAgICAgICAgICAgICBkb3RQcm9kICs9IHBpeGVsICogbWFzaztcbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9XG4gICAgICAgICAgZHguc2V0KGRvdFByb2QsIGIsIGR4UiwgZHhDLCBkKTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH1cbiAgfVxuICByZXR1cm4gYmFja2VuZC5tYWtlVGVuc29ySW5mbyhkeC5zaGFwZSwgZHguZHR5cGUsIGR4LnZhbHVlcyk7XG59XG5cbmV4cG9ydCBjb25zdCBtYXhQb29sR3JhZENvbmZpZzogS2VybmVsQ29uZmlnID0ge1xuICBrZXJuZWxOYW1lOiBNYXhQb29sR3JhZCxcbiAgYmFja2VuZE5hbWU6ICdjcHUnLFxuICBrZXJuZWxGdW5jOiBtYXhQb29sR3JhZCBhcyB7fSBhcyBLZXJuZWxGdW5jXG59O1xuIl19","/**\n * @license\n * Copyright 2020 Google LLC. All Rights Reserved.\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n * =============================================================================\n */\nimport { MaxPoolWithArgmax } from '@tensorflow/tfjs-core';\nimport { backend_util } from '@tensorflow/tfjs-core';\nimport { assertNotComplex } from '../cpu_util';\nimport { maxPoolWithArgmaxImpl } from './MaxPoolWithArgmax_impl';\nexport const maxPoolWithArgmaxConfig = {\n kernelName: MaxPoolWithArgmax,\n backendName: 'cpu',\n kernelFunc: ({ inputs, attrs, backend }) => {\n const { x } = inputs;\n const { filterSize, strides, pad, includeBatchInIndex } = attrs;\n const cpuBackend = backend;\n assertNotComplex(x, 'MaxPoolWithArgmax');\n const values = cpuBackend.data.get(x.dataId).values;\n const convInfo = backend_util.computePool2DInfo(x.shape, filterSize, strides, [1, 1], pad);\n const [pooled, indexes] = maxPoolWithArgmaxImpl(values, x.shape, x.dtype, includeBatchInIndex, convInfo);\n const pooledDataId = cpuBackend.write(pooled, convInfo.outShape, x.dtype);\n const indexesDataId = cpuBackend.write(indexes, convInfo.outShape, x.dtype);\n return [\n { dataId: pooledDataId, shape: convInfo.outShape, dtype: x.dtype },\n { dataId: indexesDataId, shape: convInfo.outShape, dtype: 'int32' }\n ];\n }\n};\n//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiTWF4UG9vbFdpdGhBcmdtYXguanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi8uLi90ZmpzLWJhY2tlbmQtY3B1L3NyYy9rZXJuZWxzL01heFBvb2xXaXRoQXJnbWF4LnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBOzs7Ozs7Ozs7Ozs7Ozs7R0FlRztBQUVILE9BQU8sRUFBQyxpQkFBaUIsRUFBa0QsTUFBTSx1QkFBdUIsQ0FBQztBQUN6RyxPQUFPLEVBQUMsWUFBWSxFQUEyQixNQUFNLHVCQUF1QixDQUFDO0FBRTdFLE9BQU8sRUFBQyxnQkFBZ0IsRUFBQyxNQUFNLGFBQWEsQ0FBQztBQUU3QyxPQUFPLEVBQUMscUJBQXFCLEVBQUMsTUFBTSwwQkFBMEIsQ0FBQztBQUUvRCxNQUFNLENBQUMsTUFBTSx1QkFBdUIsR0FBaUI7SUFDbkQsVUFBVSxFQUFFLGlCQUFpQjtJQUM3QixXQUFXLEVBQUUsS0FBSztJQUNsQixVQUFVLEVBQUUsQ0FBQyxFQUFDLE1BQU0sRUFBRSxLQUFLLEVBQUUsT0FBTyxFQUFDLEVBQUUsRUFBRTtRQUN2QyxNQUFNLEVBQUMsQ0FBQyxFQUFDLEdBQUcsTUFBaUMsQ0FBQztRQUM5QyxNQUFNLEVBQUMsVUFBVSxFQUFFLE9BQU8sRUFBRSxHQUFHLEVBQUUsbUJBQW1CLEVBQUMsR0FDakQsS0FBcUMsQ0FBQztRQUMxQyxNQUFNLFVBQVUsR0FBRyxPQUF5QixDQUFDO1FBQzdDLGdCQUFnQixDQUFDLENBQUMsRUFBRSxtQkFBbUIsQ0FBQyxDQUFDO1FBRXpDLE1BQU0sTUFBTSxHQUFHLFVBQVUsQ0FBQyxJQUFJLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxNQUFNLENBQUMsQ0FBQyxNQUFvQixDQUFDO1FBQ2xFLE1BQU0sUUFBUSxHQUFHLFlBQVksQ0FBQyxpQkFBaUIsQ0FDM0MsQ0FBQyxDQUFDLEtBQXlDLEVBQUUsVUFBVSxFQUFFLE9BQU8sRUFDaEUsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLEVBQUUsR0FBRyxDQUFDLENBQUM7UUFDakIsTUFBTSxDQUFDLE1BQU0sRUFBRSxPQUFPLENBQUMsR0FBRyxxQkFBcUIsQ0FDM0MsTUFBTSxFQUFFLENBQUMsQ0FBQyxLQUFLLEVBQUUsQ0FBQyxDQUFDLEtBQUssRUFBRSxtQkFBbUIsRUFBRSxRQUFRLENBQUMsQ0FBQztRQUU3RCxNQUFNLFlBQVksR0FDZCxVQUFVLENBQUMsS0FBSyxDQUFDLE1BQXNCLEVBQUUsUUFBUSxDQUFDLFFBQVEsRUFBRSxDQUFDLENBQUMsS0FBSyxDQUFDLENBQUM7UUFDekUsTUFBTSxhQUFhLEdBQ2YsVUFBVSxDQUFDLEtBQUssQ0FBQyxPQUFxQixFQUFFLFFBQVEsQ0FBQyxRQUFRLEVBQUUsQ0FBQyxDQUFDLEtBQUssQ0FBQyxDQUFDO1FBQ3hFLE9BQU87WUFDTCxFQUFDLE1BQU0sRUFBRSxZQUFZLEVBQUUsS0FBSyxFQUFFLFFBQVEsQ0FBQyxRQUFRLEVBQUUsS0FBSyxFQUFFLENBQUMsQ0FBQyxLQUFLLEVBQUM7WUFDaEUsRUFBQyxNQUFNLEVBQUUsYUFBYSxFQUFFLEtBQUssRUFBRSxRQUFRLENBQUMsUUFBUSxFQUFFLEtBQUssRUFBRSxPQUFPLEVBQUM7U0FDbEUsQ0FBQztJQUNKLENBQUM7Q0FDRixDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiLyoqXG4gKiBAbGljZW5zZVxuICogQ29weXJpZ2h0IDIwMjAgR29vZ2xlIExMQy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC5cbiAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSBcIkxpY2Vuc2VcIik7XG4gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuXG4gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXRcbiAqXG4gKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjBcbiAqXG4gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlXG4gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiBcIkFTIElTXCIgQkFTSVMsXG4gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC5cbiAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmRcbiAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLlxuICogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbiAqL1xuXG5pbXBvcnQge01heFBvb2xXaXRoQXJnbWF4LCBNYXhQb29sV2l0aEFyZ21heEF0dHJzLCBNYXhQb29sV2l0aEFyZ21heElucHV0c30gZnJvbSAnQHRlbnNvcmZsb3cvdGZqcy1jb3JlJztcbmltcG9ydCB7YmFja2VuZF91dGlsLCBLZXJuZWxDb25maWcsIFR5cGVkQXJyYXl9IGZyb20gJ0B0ZW5zb3JmbG93L3RmanMtY29yZSc7XG5pbXBvcnQge01hdGhCYWNrZW5kQ1BVfSBmcm9tICcuLi9iYWNrZW5kX2NwdSc7XG5pbXBvcnQge2Fzc2VydE5vdENvbXBsZXh9IGZyb20gJy4uL2NwdV91dGlsJztcblxuaW1wb3J0IHttYXhQb29sV2l0aEFyZ21heEltcGx9IGZyb20gJy4vTWF4UG9vbFdpdGhBcmdtYXhfaW1wbCc7XG5cbmV4cG9ydCBjb25zdCBtYXhQb29sV2l0aEFyZ21heENvbmZpZzogS2VybmVsQ29uZmlnID0ge1xuICBrZXJuZWxOYW1lOiBNYXhQb29sV2l0aEFyZ21heCxcbiAgYmFja2VuZE5hbWU6ICdjcHUnLFxuICBrZXJuZWxGdW5jOiAoe2lucHV0cywgYXR0cnMsIGJhY2tlbmR9KSA9PiB7XG4gICAgY29uc3Qge3h9ID0gaW5wdXRzIGFzIE1heFBvb2xXaXRoQXJnbWF4SW5wdXRzO1xuICAgIGNvbnN0IHtmaWx0ZXJTaXplLCBzdHJpZGVzLCBwYWQsIGluY2x1ZGVCYXRjaEluSW5kZXh9ID1cbiAgICAgICAgYXR0cnMgYXMge30gYXMgTWF4UG9vbFdpdGhBcmdtYXhBdHRycztcbiAgICBjb25zdCBjcHVCYWNrZW5kID0gYmFja2VuZCBhcyBNYXRoQmFja2VuZENQVTtcbiAgICBhc3NlcnROb3RDb21wbGV4KHgsICdNYXhQb29sV2l0aEFyZ21heCcpO1xuXG4gICAgY29uc3QgdmFsdWVzID0gY3B1QmFja2VuZC5kYXRhLmdldCh4LmRhdGFJZCkudmFsdWVzIGFzIFR5cGVkQXJyYXk7XG4gICAgY29uc3QgY29udkluZm8gPSBiYWNrZW5kX3V0aWwuY29tcHV0ZVBvb2wyREluZm8oXG4gICAgICAgIHguc2hhcGUgYXMgW251bWJlciwgbnVtYmVyLCBudW1iZXIsIG51bWJlcl0sIGZpbHRlclNpemUsIHN0cmlkZXMsXG4gICAgICAgIFsxLCAxXSwgcGFkKTtcbiAgICBjb25zdCBbcG9vbGVkLCBpbmRleGVzXSA9IG1heFBvb2xXaXRoQXJnbWF4SW1wbChcbiAgICAgICAgdmFsdWVzLCB4LnNoYXBlLCB4LmR0eXBlLCBpbmNsdWRlQmF0Y2hJbkluZGV4LCBjb252SW5mbyk7XG5cbiAgICBjb25zdCBwb29sZWREYXRhSWQgPVxuICAgICAgICBjcHVCYWNrZW5kLndyaXRlKHBvb2xlZCBhcyBGbG9hdDMyQXJyYXksIGNvbnZJbmZvLm91dFNoYXBlLCB4LmR0eXBlKTtcbiAgICBjb25zdCBpbmRleGVzRGF0YUlkID1cbiAgICAgICAgY3B1QmFja2VuZC53cml0ZShpbmRleGVzIGFzIEludDMyQXJyYXksIGNvbnZJbmZvLm91dFNoYXBlLCB4LmR0eXBlKTtcbiAgICByZXR1cm4gW1xuICAgICAge2RhdGFJZDogcG9vbGVkRGF0YUlkLCBzaGFwZTogY29udkluZm8ub3V0U2hhcGUsIGR0eXBlOiB4LmR0eXBlfSxcbiAgICAgIHtkYXRhSWQ6IGluZGV4ZXNEYXRhSWQsIHNoYXBlOiBjb252SW5mby5vdXRTaGFwZSwgZHR5cGU6ICdpbnQzMid9XG4gICAgXTtcbiAgfVxufTtcbiJdfQ==","/**\n * @license\n * Copyright 2020 Google LLC. All Rights Reserved.\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n * =============================================================================\n */\nimport { util } from '@tensorflow/tfjs-core';\nimport { maxPoolPositions, pool } from '../utils/pool_utils';\nexport function maxPoolWithArgmaxImpl(xValues, xShape, dtype, includeBatchInIndex, convInfo) {\n const strides = util.computeStrides(xShape);\n const maxPools = pool(xValues, xShape, dtype, strides, convInfo, 'max');\n const maxPositions = maxPoolPositions(xValues, xShape, dtype, convInfo, true, includeBatchInIndex);\n return [maxPools.values, maxPositions.values];\n}\n//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiTWF4UG9vbFdpdGhBcmdtYXhfaW1wbC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uLy4uL3RmanMtYmFja2VuZC1jcHUvc3JjL2tlcm5lbHMvTWF4UG9vbFdpdGhBcmdtYXhfaW1wbC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQTs7Ozs7Ozs7Ozs7Ozs7O0dBZUc7QUFDSCxPQUFPLEVBQXFDLElBQUksRUFBQyxNQUFNLHVCQUF1QixDQUFDO0FBRS9FLE9BQU8sRUFBQyxnQkFBZ0IsRUFBRSxJQUFJLEVBQUMsTUFBTSxxQkFBcUIsQ0FBQztBQUMzRCxNQUFNLFVBQVUscUJBQXFCLENBQ2pDLE9BQW1CLEVBQUUsTUFBZ0IsRUFBRSxLQUFlLEVBQ3RELG1CQUE0QixFQUFFLFFBQWlDO0lBQ2pFLE1BQU0sT0FBTyxHQUFHLElBQUksQ0FBQyxjQUFjLENBQUMsTUFBTSxDQUFDLENBQUM7SUFDNUMsTUFBTSxRQUFRLEdBQUcsSUFBSSxDQUFDLE9BQU8sRUFBRSxNQUFNLEVBQUUsS0FBSyxFQUFFLE9BQU8sRUFBRSxRQUFRLEVBQUUsS0FBSyxDQUFDLENBQUM7SUFDeEUsTUFBTSxZQUFZLEdBQUcsZ0JBQWdCLENBQ2pDLE9BQU8sRUFBRSxNQUFNLEVBQUUsS0FBSyxFQUFFLFFBQVEsRUFBRSxJQUFJLEVBQUUsbUJBQW1CLENBQUMsQ0FBQztJQUVqRSxPQUFPLENBQUMsUUFBUSxDQUFDLE1BQU0sRUFBRSxZQUFZLENBQUMsTUFBTSxDQUFDLENBQUM7QUFDaEQsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbIi8qKlxuICogQGxpY2Vuc2VcbiAqIENvcHlyaWdodCAyMDIwIEdvb2dsZSBMTEMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuXG4gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgXCJMaWNlbnNlXCIpO1xuICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLlxuICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0XG4gKlxuICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wXG4gKlxuICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZVxuICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gXCJBUyBJU1wiIEJBU0lTLFxuICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuXG4gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kXG4gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS5cbiAqID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4gKi9cbmltcG9ydCB7YmFja2VuZF91dGlsLCBEYXRhVHlwZSwgVHlwZWRBcnJheSwgdXRpbH0gZnJvbSAnQHRlbnNvcmZsb3cvdGZqcy1jb3JlJztcblxuaW1wb3J0IHttYXhQb29sUG9zaXRpb25zLCBwb29sfSBmcm9tICcuLi91dGlscy9wb29sX3V0aWxzJztcbmV4cG9ydCBmdW5jdGlvbiBtYXhQb29sV2l0aEFyZ21heEltcGwoXG4gICAgeFZhbHVlczogVHlwZWRBcnJheSwgeFNoYXBlOiBudW1iZXJbXSwgZHR5cGU6IERhdGFUeXBlLFxuICAgIGluY2x1ZGVCYXRjaEluSW5kZXg6IGJvb2xlYW4sIGNvbnZJbmZvOiBiYWNrZW5kX3V0aWwuQ29udjJESW5mbykge1xuICBjb25zdCBzdHJpZGVzID0gdXRpbC5jb21wdXRlU3RyaWRlcyh4U2hhcGUpO1xuICBjb25zdCBtYXhQb29scyA9IHBvb2woeFZhbHVlcywgeFNoYXBlLCBkdHlwZSwgc3RyaWRlcywgY29udkluZm8sICdtYXgnKTtcbiAgY29uc3QgbWF4UG9zaXRpb25zID0gbWF4UG9vbFBvc2l0aW9ucyhcbiAgICAgIHhWYWx1ZXMsIHhTaGFwZSwgZHR5cGUsIGNvbnZJbmZvLCB0cnVlLCBpbmNsdWRlQmF0Y2hJbkluZGV4KTtcblxuICByZXR1cm4gW21heFBvb2xzLnZhbHVlcywgbWF4UG9zaXRpb25zLnZhbHVlc107XG59XG4iXX0=","/**\n * @license\n * Copyright 2020 Google LLC. All Rights Reserved.\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n * =============================================================================\n */\nimport { backend_util, Mean, util } from '@tensorflow/tfjs-core';\nimport { cast } from './Cast';\nimport { div } from './RealDiv';\nimport { sum } from './Sum';\nexport function mean(args) {\n const { inputs, backend, attrs } = args;\n const { x } = inputs;\n const { axis, keepDims } = attrs;\n const axes = util.parseAxisParam(axis, x.shape);\n const shapes = backend_util.computeOutAndReduceShapes(x.shape, axes);\n const reduceShape = shapes[1];\n const reduceSize = util.sizeFromShape(reduceShape);\n const toDispose = [];\n const reduceSizeScalar = backend.makeTensorInfo([], 'float32', new Float32Array([reduceSize]));\n toDispose.push(reduceSizeScalar);\n const $x = cast({ inputs: { x }, backend, attrs: { dtype: 'float32' } });\n toDispose.push($x);\n const res = div({ inputs: { a: $x, b: reduceSizeScalar }, backend });\n toDispose.push(res);\n const result = sum({ inputs: { x: res }, backend, attrs: { axis, keepDims } });\n toDispose.forEach(t => backend.disposeIntermediateTensorInfo(t));\n return result;\n}\nexport const meanConfig = {\n kernelName: Mean,\n backendName: 'cpu',\n kernelFunc: mean\n};\n//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiTWVhbi5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uLy4uL3RmanMtYmFja2VuZC1jcHUvc3JjL2tlcm5lbHMvTWVhbi50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQTs7Ozs7Ozs7Ozs7Ozs7O0dBZUc7QUFFSCxPQUFPLEVBQUMsWUFBWSxFQUE0QixJQUFJLEVBQXFDLElBQUksRUFBQyxNQUFNLHVCQUF1QixDQUFDO0FBRzVILE9BQU8sRUFBQyxJQUFJLEVBQUMsTUFBTSxRQUFRLENBQUM7QUFDNUIsT0FBTyxFQUFDLEdBQUcsRUFBQyxNQUFNLFdBQVcsQ0FBQztBQUM5QixPQUFPLEVBQUMsR0FBRyxFQUFDLE1BQU0sT0FBTyxDQUFDO0FBRTFCLE1BQU0sVUFBVSxJQUFJLENBQ2hCLElBQXFFO0lBRXZFLE1BQU0sRUFBQyxNQUFNLEVBQUUsT0FBTyxFQUFFLEtBQUssRUFBQyxHQUFHLElBQUksQ0FBQztJQUN0QyxNQUFNLEVBQUMsQ0FBQyxFQUFDLEdBQUcsTUFBTSxDQUFDO0lBQ25CLE1BQU0sRUFBQyxJQUFJLEVBQUUsUUFBUSxFQUFDLEdBQUcsS0FBSyxDQUFDO0lBRS9CLE1BQU0sSUFBSSxHQUFHLElBQUksQ0FBQyxjQUFjLENBQUMsSUFBSSxFQUFFLENBQUMsQ0FBQyxLQUFLLENBQUMsQ0FBQztJQUNoRCxNQUFNLE1BQU0sR0FBRyxZQUFZLENBQUMseUJBQXlCLENBQUMsQ0FBQyxDQUFDLEtBQUssRUFBRSxJQUFJLENBQUMsQ0FBQztJQUNyRSxNQUFNLFdBQVcsR0FBRyxNQUFNLENBQUMsQ0FBQyxDQUFDLENBQUM7SUFDOUIsTUFBTSxVQUFVLEdBQUcsSUFBSSxDQUFDLGFBQWEsQ0FBQyxXQUFXLENBQUMsQ0FBQztJQUNuRCxNQUFNLFNBQVMsR0FBRyxFQUFFLENBQUM7SUFDckIsTUFBTSxnQkFBZ0IsR0FDbEIsT0FBTyxDQUFDLGNBQWMsQ0FBQyxFQUFFLEVBQUUsU0FBUyxFQUFFLElBQUksWUFBWSxDQUFDLENBQUMsVUFBVSxDQUFDLENBQUMsQ0FBQyxDQUFDO0lBQzFFLFNBQVMsQ0FBQyxJQUFJLENBQUMsZ0JBQWdCLENBQUMsQ0FBQztJQUVqQyxNQUFNLEVBQUUsR0FBRyxJQUFJLENBQUMsRUFBQyxNQUFNLEVBQUUsRUFBQyxDQUFDLEVBQUMsRUFBRSxPQUFPLEVBQUUsS0FBSyxFQUFFLEVBQUMsS0FBSyxFQUFFLFNBQVMsRUFBQyxFQUFDLENBQUMsQ0FBQztJQUNuRSxTQUFTLENBQUMsSUFBSSxDQUFDLEVBQUUsQ0FBQyxDQUFDO0lBRW5CLE1BQU0sR0FBRyxHQUNMLEdBQUcsQ0FBQyxFQUFDLE1BQU0sRUFBRSxFQUFDLENBQUMsRUFBRSxFQUFFLEVBQUUsQ0FBQyxFQUFFLGdCQUFnQixFQUFDLEVBQUUsT0FBTyxFQUFDLENBQWUsQ0FBQztJQUN2RSxTQUFTLENBQUMsSUFBSSxDQUFDLEdBQUcsQ0FBQyxDQUFDO0lBRXBCLE1BQU0sTUFBTSxHQUFHLEdBQUcsQ0FBQyxFQUFDLE1BQU0sRUFBRSxFQUFDLENBQUMsRUFBRSxHQUFHLEVBQUMsRUFBRSxPQUFPLEVBQUUsS0FBSyxFQUFFLEVBQUMsSUFBSSxFQUFFLFFBQVEsRUFBQyxFQUFDLENBQUMsQ0FBQztJQUV6RSxTQUFTLENBQUMsT0FBTyxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsT0FBTyxDQUFDLDZCQUE2QixDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUM7SUFFakUsT0FBTyxNQUFNLENBQUM7QUFDaEIsQ0FBQztBQUVELE1BQU0sQ0FBQyxNQUFNLFVBQVUsR0FBaUI7SUFDdEMsVUFBVSxFQUFFLElBQUk7SUFDaEIsV0FBVyxFQUFFLEtBQUs7SUFDbEIsVUFBVSxFQUFFLElBQXdCO0NBQ3JDLENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyIvKipcbiAqIEBsaWNlbnNlXG4gKiBDb3B5cmlnaHQgMjAyMCBHb29nbGUgTExDLiBBbGwgUmlnaHRzIFJlc2VydmVkLlxuICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlIFwiTGljZW5zZVwiKTtcbiAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS5cbiAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdFxuICpcbiAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMFxuICpcbiAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmVcbiAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuIFwiQVMgSVNcIiBCQVNJUyxcbiAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLlxuICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZFxuICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuXG4gKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuICovXG5cbmltcG9ydCB7YmFja2VuZF91dGlsLCBLZXJuZWxDb25maWcsIEtlcm5lbEZ1bmMsIE1lYW4sIE1lYW5BdHRycywgTWVhbklucHV0cywgVGVuc29ySW5mbywgdXRpbH0gZnJvbSAnQHRlbnNvcmZsb3cvdGZqcy1jb3JlJztcblxuaW1wb3J0IHtNYXRoQmFja2VuZENQVX0gZnJvbSAnLi4vYmFja2VuZF9jcHUnO1xuaW1wb3J0IHtjYXN0fSBmcm9tICcuL0Nhc3QnO1xuaW1wb3J0IHtkaXZ9IGZyb20gJy4vUmVhbERpdic7XG5pbXBvcnQge3N1bX0gZnJvbSAnLi9TdW0nO1xuXG5leHBvcnQgZnVuY3Rpb24gbWVhbihcbiAgICBhcmdzOiB7aW5wdXRzOiBNZWFuSW5wdXRzLCBiYWNrZW5kOiBNYXRoQmFja2VuZENQVSwgYXR0cnM6IE1lYW5BdHRyc30pOlxuICAgIFRlbnNvckluZm8ge1xuICBjb25zdCB7aW5wdXRzLCBiYWNrZW5kLCBhdHRyc30gPSBhcmdzO1xuICBjb25zdCB7eH0gPSBpbnB1dHM7XG4gIGNvbnN0IHtheGlzLCBrZWVwRGltc30gPSBhdHRycztcblxuICBjb25zdCBheGVzID0gdXRpbC5wYXJzZUF4aXNQYXJhbShheGlzLCB4LnNoYXBlKTtcbiAgY29uc3Qgc2hhcGVzID0gYmFja2VuZF91dGlsLmNvbXB1dGVPdXRBbmRSZWR1Y2VTaGFwZXMoeC5zaGFwZSwgYXhlcyk7XG4gIGNvbnN0IHJlZHVjZVNoYXBlID0gc2hhcGVzWzFdO1xuICBjb25zdCByZWR1Y2VTaXplID0gdXRpbC5zaXplRnJvbVNoYXBlKHJlZHVjZVNoYXBlKTtcbiAgY29uc3QgdG9EaXNwb3NlID0gW107XG4gIGNvbnN0IHJlZHVjZVNpemVTY2FsYXIgPVxuICAgICAgYmFja2VuZC5tYWtlVGVuc29ySW5mbyhbXSwgJ2Zsb2F0MzInLCBuZXcgRmxvYXQzMkFycmF5KFtyZWR1Y2VTaXplXSkpO1xuICB0b0Rpc3Bvc2UucHVzaChyZWR1Y2VTaXplU2NhbGFyKTtcblxuICBjb25zdCAkeCA9IGNhc3Qoe2lucHV0czoge3h9LCBiYWNrZW5kLCBhdHRyczoge2R0eXBlOiAnZmxvYXQzMid9fSk7XG4gIHRvRGlzcG9zZS5wdXNoKCR4KTtcblxuICBjb25zdCByZXMgPVxuICAgICAgZGl2KHtpbnB1dHM6IHthOiAkeCwgYjogcmVkdWNlU2l6ZVNjYWxhcn0sIGJhY2tlbmR9KSBhcyBUZW5zb3JJbmZvO1xuICB0b0Rpc3Bvc2UucHVzaChyZXMpO1xuXG4gIGNvbnN0IHJlc3VsdCA9IHN1bSh7aW5wdXRzOiB7eDogcmVzfSwgYmFja2VuZCwgYXR0cnM6IHtheGlzLCBrZWVwRGltc319KTtcblxuICB0b0Rpc3Bvc2UuZm9yRWFjaCh0ID0+IGJhY2tlbmQuZGlzcG9zZUludGVybWVkaWF0ZVRlbnNvckluZm8odCkpO1xuXG4gIHJldHVybiByZXN1bHQ7XG59XG5cbmV4cG9ydCBjb25zdCBtZWFuQ29uZmlnOiBLZXJuZWxDb25maWcgPSB7XG4gIGtlcm5lbE5hbWU6IE1lYW4sXG4gIGJhY2tlbmROYW1lOiAnY3B1JyxcbiAga2VybmVsRnVuYzogbWVhbiBhcyB7fSBhcyBLZXJuZWxGdW5jXG59O1xuIl19","/**\n * @license\n * Copyright 2020 Google LLC. All Rights Reserved.\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n * =============================================================================\n */\nimport { backend_util, Min, util } from '@tensorflow/tfjs-core';\nimport { assertNotComplex } from '../cpu_util';\nimport { reshape } from './Reshape';\nimport { transpose } from './Transpose';\nexport function min(args) {\n const { inputs, backend, attrs } = args;\n const { x } = inputs;\n const { axis, keepDims } = attrs;\n assertNotComplex(x, 'min');\n const origAxes = util.parseAxisParam(axis, x.shape);\n let axes = origAxes;\n const permutedAxes = backend_util.getAxesPermutation(axes, x.shape.length);\n let $x = x;\n if (permutedAxes != null) {\n $x = transpose({ inputs: { x }, backend, attrs: { perm: permutedAxes } });\n axes = backend_util.getInnerMostAxes(axes.length, x.shape.length);\n }\n backend_util.assertAxesAreInnerMostDims('min', axes, $x.shape.length);\n const [outShape, reduceShape] = backend_util.computeOutAndReduceShapes($x.shape, axes);\n const reduceSize = util.sizeFromShape(reduceShape);\n const vals = util.makeZerosTypedArray(util.sizeFromShape(outShape), $x.dtype);\n const aVals = backend.data.get($x.dataId).values;\n for (let i = 0; i < vals.length; ++i) {\n const offset = i * reduceSize;\n let min = aVals[offset];\n for (let j = 0; j < reduceSize; ++j) {\n const value = aVals[offset + j];\n if (Number.isNaN(value) ||\n value < min) { // comparison with NaN always return false\n min = value;\n }\n }\n vals[i] = min;\n }\n if (permutedAxes != null) {\n backend.disposeIntermediateTensorInfo($x);\n }\n const result = backend.makeTensorInfo(outShape, $x.dtype, vals);\n if (keepDims) {\n const expandedShape = backend_util.expandShapeToKeepDim(outShape, origAxes);\n const reshapedResult = reshape({ inputs: { x: result }, backend, attrs: { shape: expandedShape } });\n backend.disposeIntermediateTensorInfo(result);\n return reshapedResult;\n }\n return result;\n}\nexport const minConfig = {\n kernelName: Min,\n backendName: 'cpu',\n kernelFunc: min\n};\n//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiTWluLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vLi4vdGZqcy1iYWNrZW5kLWNwdS9zcmMva2VybmVscy9NaW4udHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUE7Ozs7Ozs7Ozs7Ozs7OztHQWVHO0FBRUgsT0FBTyxFQUFDLFlBQVksRUFBNEIsR0FBRyxFQUErQyxJQUFJLEVBQUMsTUFBTSx1QkFBdUIsQ0FBQztBQUdySSxPQUFPLEVBQUMsZ0JBQWdCLEVBQUMsTUFBTSxhQUFhLENBQUM7QUFDN0MsT0FBTyxFQUFDLE9BQU8sRUFBQyxNQUFNLFdBQVcsQ0FBQztBQUNsQyxPQUFPLEVBQUMsU0FBUyxFQUFDLE1BQU0sYUFBYSxDQUFDO0FBRXRDLE1BQU0sVUFBVSxHQUFHLENBQ2YsSUFBbUU7SUFFckUsTUFBTSxFQUFDLE1BQU0sRUFBRSxPQUFPLEVBQUUsS0FBSyxFQUFDLEdBQUcsSUFBSSxDQUFDO0lBQ3RDLE1BQU0sRUFBQyxDQUFDLEVBQUMsR0FBRyxNQUFNLENBQUM7SUFDbkIsTUFBTSxFQUFDLElBQUksRUFBRSxRQUFRLEVBQUMsR0FBRyxLQUFLLENBQUM7SUFFL0IsZ0JBQWdCLENBQUMsQ0FBQyxFQUFFLEtBQUssQ0FBQyxDQUFDO0lBRTNCLE1BQU0sUUFBUSxHQUFHLElBQUksQ0FBQyxjQUFjLENBQUMsSUFBSSxFQUFFLENBQUMsQ0FBQyxLQUFLLENBQUMsQ0FBQztJQUNwRCxJQUFJLElBQUksR0FBRyxRQUFRLENBQUM7SUFDcEIsTUFBTSxZQUFZLEdBQUcsWUFBWSxDQUFDLGtCQUFrQixDQUFDLElBQUksRUFBRSxDQUFDLENBQUMsS0FBSyxDQUFDLE1BQU0sQ0FBQyxDQUFDO0lBQzNFLElBQUksRUFBRSxHQUFHLENBQUMsQ0FBQztJQUNYLElBQUksWUFBWSxJQUFJLElBQUksRUFBRTtRQUN4QixFQUFFLEdBQUcsU0FBUyxDQUFDLEVBQUMsTUFBTSxFQUFFLEVBQUMsQ0FBQyxFQUFDLEVBQUUsT0FBTyxFQUFFLEtBQUssRUFBRSxFQUFDLElBQUksRUFBRSxZQUFZLEVBQUMsRUFBQyxDQUFDLENBQUM7UUFDcEUsSUFBSSxHQUFHLFlBQVksQ0FBQyxnQkFBZ0IsQ0FBQyxJQUFJLENBQUMsTUFBTSxFQUFFLENBQUMsQ0FBQyxLQUFLLENBQUMsTUFBTSxDQUFDLENBQUM7S0FDbkU7SUFFRCxZQUFZLENBQUMsMEJBQTBCLENBQUMsS0FBSyxFQUFFLElBQUksRUFBRSxFQUFFLENBQUMsS0FBSyxDQUFDLE1BQU0sQ0FBQyxDQUFDO0lBQ3RFLE1BQU0sQ0FBQyxRQUFRLEVBQUUsV0FBVyxDQUFDLEdBQ3pCLFlBQVksQ0FBQyx5QkFBeUIsQ0FBQyxFQUFFLENBQUMsS0FBSyxFQUFFLElBQUksQ0FBQyxDQUFDO0lBQzNELE1BQU0sVUFBVSxHQUFHLElBQUksQ0FBQyxhQUFhLENBQUMsV0FBVyxDQUFDLENBQUM7SUFDbkQsTUFBTSxJQUFJLEdBQUcsSUFBSSxDQUFDLG1CQUFtQixDQUFDLElBQUksQ0FBQyxhQUFhLENBQUMsUUFBUSxDQUFDLEVBQUUsRUFBRSxDQUFDLEtBQUssQ0FBQyxDQUFDO0lBRTlFLE1BQU0sS0FBSyxHQUFHLE9BQU8sQ0FBQyxJQUFJLENBQUMsR0FBRyxDQUFDLEVBQUUsQ0FBQyxNQUFNLENBQUMsQ0FBQyxNQUFvQixDQUFDO0lBQy9ELEtBQUssSUFBSSxDQUFDLEdBQUcsQ0FBQyxFQUFFLENBQUMsR0FBRyxJQUFJLENBQUMsTUFBTSxFQUFFLEVBQUUsQ0FBQyxFQUFFO1FBQ3BDLE1BQU0sTUFBTSxHQUFHLENBQUMsR0FBRyxVQUFVLENBQUM7UUFDOUIsSUFBSSxHQUFHLEdBQUcsS0FBSyxDQUFDLE1BQU0sQ0FBQyxDQUFDO1FBQ3hCLEtBQUssSUFBSSxDQUFDLEdBQUcsQ0FBQyxFQUFFLENBQUMsR0FBRyxVQUFVLEVBQUUsRUFBRSxDQUFDLEVBQUU7WUFDbkMsTUFBTSxLQUFLLEdBQUcsS0FBSyxDQUFDLE1BQU0sR0FBRyxDQUFDLENBQUMsQ0FBQztZQUNoQyxJQUFJLE1BQU0sQ0FBQyxLQUFLLENBQUMsS0FBSyxDQUFDO2dCQUNuQixLQUFLLEdBQUcsR0FBRyxFQUFFLEVBQUcsMENBQTBDO2dCQUM1RCxHQUFHLEdBQUcsS0FBSyxDQUFDO2FBQ2I7U0FDRjtRQUNELElBQUksQ0FBQyxDQUFDLENBQUMsR0FBRyxHQUFHLENBQUM7S0FDZjtJQUVELElBQUksWUFBWSxJQUFJLElBQUksRUFBRTtRQUN4QixPQUFPLENBQUMsNkJBQTZCLENBQUMsRUFBRSxDQUFDLENBQUM7S0FDM0M7SUFFRCxNQUFNLE1BQU0sR0FBRyxPQUFPLENBQUMsY0FBYyxDQUFDLFFBQVEsRUFBRSxFQUFFLENBQUMsS0FBSyxFQUFFLElBQUksQ0FBQyxDQUFDO0lBRWhFLElBQUksUUFBUSxFQUFFO1FBQ1osTUFBTSxhQUFhLEdBQUcsWUFBWSxDQUFDLG9CQUFvQixDQUFDLFFBQVEsRUFBRSxRQUFRLENBQUMsQ0FBQztRQUM1RSxNQUFNLGNBQWMsR0FDaEIsT0FBTyxDQUFDLEVBQUMsTUFBTSxFQUFFLEVBQUMsQ0FBQyxFQUFFLE1BQU0sRUFBQyxFQUFFLE9BQU8sRUFBRSxLQUFLLEVBQUUsRUFBQyxLQUFLLEVBQUUsYUFBYSxFQUFDLEVBQUMsQ0FBQyxDQUFDO1FBRTNFLE9BQU8sQ0FBQyw2QkFBNkIsQ0FBQyxNQUFNLENBQUMsQ0FBQztRQUU5QyxPQUFPLGNBQWMsQ0FBQztLQUN2QjtJQUVELE9BQU8sTUFBTSxDQUFDO0FBQ2hCLENBQUM7QUFFRCxNQUFNLENBQUMsTUFBTSxTQUFTLEdBQWlCO0lBQ3JDLFVBQVUsRUFBRSxHQUFHO0lBQ2YsV0FBVyxFQUFFLEtBQUs7SUFDbEIsVUFBVSxFQUFFLEdBQXVCO0NBQ3BDLENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyIvKipcbiAqIEBsaWNlbnNlXG4gKiBDb3B5cmlnaHQgMjAyMCBHb29nbGUgTExDLiBBbGwgUmlnaHRzIFJlc2VydmVkLlxuICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlIFwiTGljZW5zZVwiKTtcbiAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS5cbiAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdFxuICpcbiAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMFxuICpcbiAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmVcbiAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuIFwiQVMgSVNcIiBCQVNJUyxcbiAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLlxuICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZFxuICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuXG4gKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuICovXG5cbmltcG9ydCB7YmFja2VuZF91dGlsLCBLZXJuZWxDb25maWcsIEtlcm5lbEZ1bmMsIE1pbiwgTWluQXR0cnMsIE1pbklucHV0cywgVGVuc29ySW5mbywgVHlwZWRBcnJheSwgdXRpbH0gZnJvbSAnQHRlbnNvcmZsb3cvdGZqcy1jb3JlJztcblxuaW1wb3J0IHtNYXRoQmFja2VuZENQVX0gZnJvbSAnLi4vYmFja2VuZF9jcHUnO1xuaW1wb3J0IHthc3NlcnROb3RDb21wbGV4fSBmcm9tICcuLi9jcHVfdXRpbCc7XG5pbXBvcnQge3Jlc2hhcGV9IGZyb20gJy4vUmVzaGFwZSc7XG5pbXBvcnQge3RyYW5zcG9zZX0gZnJvbSAnLi9UcmFuc3Bvc2UnO1xuXG5leHBvcnQgZnVuY3Rpb24gbWluKFxuICAgIGFyZ3M6IHtpbnB1dHM6IE1pbklucHV0cywgYmFja2VuZDogTWF0aEJhY2tlbmRDUFUsIGF0dHJzOiBNaW5BdHRyc30pOlxuICAgIFRlbnNvckluZm8ge1xuICBjb25zdCB7aW5wdXRzLCBiYWNrZW5kLCBhdHRyc30gPSBhcmdzO1xuICBjb25zdCB7eH0gPSBpbnB1dHM7XG4gIGNvbnN0IHtheGlzLCBrZWVwRGltc30gPSBhdHRycztcblxuICBhc3NlcnROb3RDb21wbGV4KHgsICdtaW4nKTtcblxuICBjb25zdCBvcmlnQXhlcyA9IHV0aWwucGFyc2VBeGlzUGFyYW0oYXhpcywgeC5zaGFwZSk7XG4gIGxldCBheGVzID0gb3JpZ0F4ZXM7XG4gIGNvbnN0IHBlcm11dGVkQXhlcyA9IGJhY2tlbmRfdXRpbC5nZXRBeGVzUGVybXV0YXRpb24oYXhlcywgeC5zaGFwZS5sZW5ndGgpO1xuICBsZXQgJHggPSB4O1xuICBpZiAocGVybXV0ZWRBeGVzICE9IG51bGwpIHtcbiAgICAkeCA9IHRyYW5zcG9zZSh7aW5wdXRzOiB7eH0sIGJhY2tlbmQsIGF0dHJzOiB7cGVybTogcGVybXV0ZWRBeGVzfX0pO1xuICAgIGF4ZXMgPSBiYWNrZW5kX3V0aWwuZ2V0SW5uZXJNb3N0QXhlcyhheGVzLmxlbmd0aCwgeC5zaGFwZS5sZW5ndGgpO1xuICB9XG5cbiAgYmFja2VuZF91dGlsLmFzc2VydEF4ZXNBcmVJbm5lck1vc3REaW1zKCdtaW4nLCBheGVzLCAkeC5zaGFwZS5sZW5ndGgpO1xuICBjb25zdCBbb3V0U2hhcGUsIHJlZHVjZVNoYXBlXSA9XG4gICAgICBiYWNrZW5kX3V0aWwuY29tcHV0ZU91dEFuZFJlZHVjZVNoYXBlcygkeC5zaGFwZSwgYXhlcyk7XG4gIGNvbnN0IHJlZHVjZVNpemUgPSB1dGlsLnNpemVGcm9tU2hhcGUocmVkdWNlU2hhcGUpO1xuICBjb25zdCB2YWxzID0gdXRpbC5tYWtlWmVyb3NUeXBlZEFycmF5KHV0aWwuc2l6ZUZyb21TaGFwZShvdXRTaGFwZSksICR4LmR0eXBlKTtcblxuICBjb25zdCBhVmFscyA9IGJhY2tlbmQuZGF0YS5nZXQoJHguZGF0YUlkKS52YWx1ZXMgYXMgVHlwZWRBcnJheTtcbiAgZm9yIChsZXQgaSA9IDA7IGkgPCB2YWxzLmxlbmd0aDsgKytpKSB7XG4gICAgY29uc3Qgb2Zmc2V0ID0gaSAqIHJlZHVjZVNpemU7XG4gICAgbGV0IG1pbiA9IGFWYWxzW29mZnNldF07XG4gICAgZm9yIChsZXQgaiA9IDA7IGogPCByZWR1Y2VTaXplOyArK2opIHtcbiAgICAgIGNvbnN0IHZhbHVlID0gYVZhbHNbb2Zmc2V0ICsgal07XG4gICAgICBpZiAoTnVtYmVyLmlzTmFOKHZhbHVlKSB8fFxuICAgICAgICAgIHZhbHVlIDwgbWluKSB7ICAvLyBjb21wYXJpc29uIHdpdGggTmFOIGFsd2F5cyByZXR1cm4gZmFsc2VcbiAgICAgICAgbWluID0gdmFsdWU7XG4gICAgICB9XG4gICAgfVxuICAgIHZhbHNbaV0gPSBtaW47XG4gIH1cblxuICBpZiAocGVybXV0ZWRBeGVzICE9IG51bGwpIHtcbiAgICBiYWNrZW5kLmRpc3Bvc2VJbnRlcm1lZGlhdGVUZW5zb3JJbmZvKCR4KTtcbiAgfVxuXG4gIGNvbnN0IHJlc3VsdCA9IGJhY2tlbmQubWFrZVRlbnNvckluZm8ob3V0U2hhcGUsICR4LmR0eXBlLCB2YWxzKTtcblxuICBpZiAoa2VlcERpbXMpIHtcbiAgICBjb25zdCBleHBhbmRlZFNoYXBlID0gYmFja2VuZF91dGlsLmV4cGFuZFNoYXBlVG9LZWVwRGltKG91dFNoYXBlLCBvcmlnQXhlcyk7XG4gICAgY29uc3QgcmVzaGFwZWRSZXN1bHQgPVxuICAgICAgICByZXNoYXBlKHtpbnB1dHM6IHt4OiByZXN1bHR9LCBiYWNrZW5kLCBhdHRyczoge3NoYXBlOiBleHBhbmRlZFNoYXBlfX0pO1xuXG4gICAgYmFja2VuZC5kaXNwb3NlSW50ZXJtZWRpYXRlVGVuc29ySW5mbyhyZXN1bHQpO1xuXG4gICAgcmV0dXJuIHJlc2hhcGVkUmVzdWx0O1xuICB9XG5cbiAgcmV0dXJuIHJlc3VsdDtcbn1cblxuZXhwb3J0IGNvbnN0IG1pbkNvbmZpZzogS2VybmVsQ29uZmlnID0ge1xuICBrZXJuZWxOYW1lOiBNaW4sXG4gIGJhY2tlbmROYW1lOiAnY3B1JyxcbiAga2VybmVsRnVuYzogbWluIGFzIHt9IGFzIEtlcm5lbEZ1bmNcbn07XG4iXX0=","/**\n * @license\n * Copyright 2020 Google LLC. All Rights Reserved.\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n * =============================================================================\n */\nimport { Minimum } from '@tensorflow/tfjs-core';\nimport { createSimpleBinaryKernelImpl } from '../utils/binary_impl';\nimport { binaryKernelFunc } from '../utils/binary_utils';\nexport const minimumImpl = createSimpleBinaryKernelImpl(((aValue, bValue) => Math.min(aValue, bValue)));\nexport const minimum = binaryKernelFunc(Minimum, minimumImpl);\nexport const minimumConfig = {\n kernelName: Minimum,\n backendName: 'cpu',\n kernelFunc: minimum\n};\n//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiTWluaW11bS5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uLy4uL3RmanMtYmFja2VuZC1jcHUvc3JjL2tlcm5lbHMvTWluaW11bS50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQTs7Ozs7Ozs7Ozs7Ozs7O0dBZUc7QUFFSCxPQUFPLEVBQWUsT0FBTyxFQUFDLE1BQU0sdUJBQXVCLENBQUM7QUFFNUQsT0FBTyxFQUFDLDRCQUE0QixFQUFDLE1BQU0sc0JBQXNCLENBQUM7QUFDbEUsT0FBTyxFQUFDLGdCQUFnQixFQUFDLE1BQU0sdUJBQXVCLENBQUM7QUFFdkQsTUFBTSxDQUFDLE1BQU0sV0FBVyxHQUFHLDRCQUE0QixDQUNuRCxDQUFDLENBQUMsTUFBTSxFQUFFLE1BQU0sRUFBRSxFQUFFLENBQUMsSUFBSSxDQUFDLEdBQUcsQ0FBQyxNQUFnQixFQUFFLE1BQWdCLENBQUMsQ0FBQyxDQUFDLENBQUM7QUFDeEUsTUFBTSxDQUFDLE1BQU0sT0FBTyxHQUFHLGdCQUFnQixDQUFDLE9BQU8sRUFBRSxXQUFXLENBQUMsQ0FBQztBQUU5RCxNQUFNLENBQUMsTUFBTSxhQUFhLEdBQWlCO0lBQ3pDLFVBQVUsRUFBRSxPQUFPO0lBQ25CLFdBQVcsRUFBRSxLQUFLO0lBQ2xCLFVBQVUsRUFBRSxPQUFPO0NBQ3BCLENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyIvKipcbiAqIEBsaWNlbnNlXG4gKiBDb3B5cmlnaHQgMjAyMCBHb29nbGUgTExDLiBBbGwgUmlnaHRzIFJlc2VydmVkLlxuICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlIFwiTGljZW5zZVwiKTtcbiAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS5cbiAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdFxuICpcbiAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMFxuICpcbiAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmVcbiAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuIFwiQVMgSVNcIiBCQVNJUyxcbiAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLlxuICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZFxuICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuXG4gKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuICovXG5cbmltcG9ydCB7S2VybmVsQ29uZmlnLCBNaW5pbXVtfSBmcm9tICdAdGVuc29yZmxvdy90ZmpzLWNvcmUnO1xuXG5pbXBvcnQge2NyZWF0ZVNpbXBsZUJpbmFyeUtlcm5lbEltcGx9IGZyb20gJy4uL3V0aWxzL2JpbmFyeV9pbXBsJztcbmltcG9ydCB7YmluYXJ5S2VybmVsRnVuY30gZnJvbSAnLi4vdXRpbHMvYmluYXJ5X3V0aWxzJztcblxuZXhwb3J0IGNvbnN0IG1pbmltdW1JbXBsID0gY3JlYXRlU2ltcGxlQmluYXJ5S2VybmVsSW1wbChcbiAgICAoKGFWYWx1ZSwgYlZhbHVlKSA9PiBNYXRoLm1pbihhVmFsdWUgYXMgbnVtYmVyLCBiVmFsdWUgYXMgbnVtYmVyKSkpO1xuZXhwb3J0IGNvbnN0IG1pbmltdW0gPSBiaW5hcnlLZXJuZWxGdW5jKE1pbmltdW0sIG1pbmltdW1JbXBsKTtcblxuZXhwb3J0IGNvbnN0IG1pbmltdW1Db25maWc6IEtlcm5lbENvbmZpZyA9IHtcbiAga2VybmVsTmFtZTogTWluaW11bSxcbiAgYmFja2VuZE5hbWU6ICdjcHUnLFxuICBrZXJuZWxGdW5jOiBtaW5pbXVtXG59O1xuIl19","/**\n * @license\n * Copyright 2020 Google LLC. All Rights Reserved.\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n * =============================================================================\n */\nimport { MirrorPad, util } from '@tensorflow/tfjs-core';\nimport { assertNotComplex } from '../cpu_util';\nexport function mirrorPad(args) {\n const { inputs, backend, attrs } = args;\n const { x } = inputs;\n const { paddings, mode } = attrs;\n assertNotComplex(x, 'mirrorPad');\n const outShape = paddings.map((p, i) => p[0] /* beforePad */ + x.shape[i] + p[1] /* afterPad */);\n const start = paddings.map(p => p[0]);\n const end = paddings.map((p, i) => p[0] + x.shape[i]);\n const offset = mode === 'reflect' ? 0 : 1;\n const xVals = backend.data.get(x.dataId).values;\n const xRank = x.shape.length;\n const xStrides = util.computeStrides(x.shape);\n const resultSize = util.sizeFromShape(outShape);\n const resultRank = outShape.length;\n const resultStrides = util.computeStrides(outShape);\n const resVals = util.getTypedArrayFromDType(x.dtype, resultSize);\n for (let i = 0; i < resultSize; i++) {\n let coords = util.indexToLoc(i, resultRank, resultStrides);\n for (let i = 0; i < resultRank; i++) {\n if (coords[i] < start[i]) {\n coords[i] = start[i] * 2 - coords[i] - offset;\n }\n else if (coords[i] >= end[i]) {\n coords[i] = (end[i] - 1) * 2 - coords[i] + offset;\n }\n }\n coords = coords.map((c, i) => c - start[i]);\n const inIndex = util.locToIndex(coords, xRank, xStrides);\n resVals[i] = xVals[inIndex];\n }\n const outId = backend.write(resVals, outShape, x.dtype);\n return { dataId: outId, shape: outShape, dtype: x.dtype };\n}\nexport const mirrorPadConfig = {\n kernelName: MirrorPad,\n backendName: 'cpu',\n kernelFunc: mirrorPad\n};\n//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiTWlycm9yUGFkLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vLi4vdGZqcy1iYWNrZW5kLWNwdS9zcmMva2VybmVscy9NaXJyb3JQYWQudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUE7Ozs7Ozs7Ozs7Ozs7OztHQWVHO0FBRUgsT0FBTyxFQUEyQixTQUFTLEVBQTRFLElBQUksRUFBQyxNQUFNLHVCQUF1QixDQUFDO0FBRzFKLE9BQU8sRUFBQyxnQkFBZ0IsRUFBQyxNQUFNLGFBQWEsQ0FBQztBQUU3QyxNQUFNLFVBQVUsU0FBUyxDQUFDLElBSXpCO0lBQ0MsTUFBTSxFQUFDLE1BQU0sRUFBRSxPQUFPLEVBQUUsS0FBSyxFQUFDLEdBQUcsSUFBSSxDQUFDO0lBQ3RDLE1BQU0sRUFBQyxDQUFDLEVBQUMsR0FBRyxNQUFNLENBQUM7SUFDbkIsTUFBTSxFQUFDLFFBQVEsRUFBRSxJQUFJLEVBQUMsR0FBRyxLQUFLLENBQUM7SUFFL0IsZ0JBQWdCLENBQUMsQ0FBQyxFQUFFLFdBQVcsQ0FBQyxDQUFDO0lBRWpDLE1BQU0sUUFBUSxHQUFHLFFBQVEsQ0FBQyxHQUFHLENBQ3pCLENBQUMsQ0FBQyxFQUFFLENBQUMsRUFBRSxFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLGVBQWUsR0FBRyxDQUFDLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxjQUFjLENBQUMsQ0FBQztJQUV2RSxNQUFNLEtBQUssR0FBRyxRQUFRLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUM7SUFDdEMsTUFBTSxHQUFHLEdBQUcsUUFBUSxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLEVBQUUsRUFBRSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUM7SUFDdEQsTUFBTSxNQUFNLEdBQUcsSUFBSSxLQUFLLFNBQVMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUM7SUFFMUMsTUFBTSxLQUFLLEdBQUcsT0FBTyxDQUFDLElBQUksQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLE1BQU0sQ0FBQyxDQUFDLE1BQW9CLENBQUM7SUFDOUQsTUFBTSxLQUFLLEdBQUcsQ0FBQyxDQUFDLEtBQUssQ0FBQyxNQUFNLENBQUM7SUFDN0IsTUFBTSxRQUFRLEdBQUcsSUFBSSxDQUFDLGNBQWMsQ0FBQyxDQUFDLENBQUMsS0FBSyxDQUFDLENBQUM7SUFFOUMsTUFBTSxVQUFVLEdBQUcsSUFBSSxDQUFDLGFBQWEsQ0FBQyxRQUFRLENBQUMsQ0FBQztJQUNoRCxNQUFNLFVBQVUsR0FBRyxRQUFRLENBQUMsTUFBTSxDQUFDO0lBQ25DLE1BQU0sYUFBYSxHQUFHLElBQUksQ0FBQyxjQUFjLENBQUMsUUFBUSxDQUFDLENBQUM7SUFDcEQsTUFBTSxPQUFPLEdBQ1QsSUFBSSxDQUFDLHNCQUFzQixDQUFDLENBQUMsQ0FBQyxLQUF3QixFQUFFLFVBQVUsQ0FBQyxDQUFDO0lBRXhFLEtBQUssSUFBSSxDQUFDLEdBQUcsQ0FBQyxFQUFFLENBQUMsR0FBRyxVQUFVLEVBQUUsQ0FBQyxFQUFFLEVBQUU7UUFDbkMsSUFBSSxNQUFNLEdBQUcsSUFBSSxDQUFDLFVBQVUsQ0FBQyxDQUFDLEVBQUUsVUFBVSxFQUFFLGFBQWEsQ0FBQyxDQUFDO1FBQzNELEtBQUssSUFBSSxDQUFDLEdBQUcsQ0FBQyxFQUFFLENBQUMsR0FBRyxVQUFVLEVBQUUsQ0FBQyxFQUFFLEVBQUU7WUFDbkMsSUFBSSxNQUFNLENBQUMsQ0FBQyxDQUFDLEdBQUcsS0FBSyxDQUFDLENBQUMsQ0FBQyxFQUFFO2dCQUN4QixNQUFNLENBQUMsQ0FBQyxDQUFDLEdBQUcsS0FBSyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsR0FBRyxNQUFNLENBQUMsQ0FBQyxDQUFDLEdBQUcsTUFBTSxDQUFDO2FBQy9DO2lCQUFNLElBQUksTUFBTSxDQUFDLENBQUMsQ0FBQyxJQUFJLEdBQUcsQ0FBQyxDQUFDLENBQUMsRUFBRTtnQkFDOUIsTUFBTSxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxHQUFHLENBQUMsR0FBRyxNQUFNLENBQUMsQ0FBQyxDQUFDLEdBQUcsTUFBTSxDQUFDO2FBQ25EO1NBQ0Y7UUFDRCxNQUFNLEdBQUcsTUFBTSxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLEVBQUUsRUFBRSxDQUFDLENBQUMsR0FBRyxLQUFLLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQztRQUU1QyxNQUFNLE9BQU8sR0FBRyxJQUFJLENBQUMsVUFBVSxDQUFDLE1BQU0sRUFBRSxLQUFLLEVBQUUsUUFBUSxDQUFDLENBQUM7UUFFekQsT0FBTyxDQUFDLENBQUMsQ0FBQyxHQUFHLEtBQUssQ0FBQyxPQUFPLENBQUMsQ0FBQztLQUM3QjtJQUVELE1BQU0sS0FBSyxHQUFHLE9BQU8sQ0FBQyxLQUFLLENBQUMsT0FBTyxFQUFFLFFBQVEsRUFBRSxDQUFDLENBQUMsS0FBSyxDQUFDLENBQUM7SUFFeEQsT0FBTyxFQUFDLE1BQU0sRUFBRSxLQUFLLEVBQUUsS0FBSyxFQUFFLFFBQVEsRUFBRSxLQUFLLEVBQUUsQ0FBQyxDQUFDLEtBQUssRUFBQyxDQUFDO0FBQzFELENBQUM7QUFFRCxNQUFNLENBQUMsTUFBTSxlQUFlLEdBQWlCO0lBQzNDLFVBQVUsRUFBRSxTQUFTO0lBQ3JCLFdBQVcsRUFBRSxLQUFLO0lBQ2xCLFVBQVUsRUFBRSxTQUE2QjtDQUMxQyxDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiLyoqXG4gKiBAbGljZW5zZVxuICogQ29weXJpZ2h0IDIwMjAgR29vZ2xlIExMQy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC5cbiAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSBcIkxpY2Vuc2VcIik7XG4gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuXG4gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXRcbiAqXG4gKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjBcbiAqXG4gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlXG4gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiBcIkFTIElTXCIgQkFTSVMsXG4gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC5cbiAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmRcbiAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLlxuICogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbiAqL1xuXG5pbXBvcnQge0tlcm5lbENvbmZpZywgS2VybmVsRnVuYywgTWlycm9yUGFkLCBNaXJyb3JQYWRBdHRycywgTWlycm9yUGFkSW5wdXRzLCBOdW1lcmljRGF0YVR5cGUsIFRlbnNvckluZm8sIFR5cGVkQXJyYXksIHV0aWx9IGZyb20gJ0B0ZW5zb3JmbG93L3RmanMtY29yZSc7XG5cbmltcG9ydCB7TWF0aEJhY2tlbmRDUFV9IGZyb20gJy4uL2JhY2tlbmRfY3B1JztcbmltcG9ydCB7YXNzZXJ0Tm90Q29tcGxleH0gZnJvbSAnLi4vY3B1X3V0aWwnO1xuXG5leHBvcnQgZnVuY3Rpb24gbWlycm9yUGFkKGFyZ3M6IHtcbiAgaW5wdXRzOiBNaXJyb3JQYWRJbnB1dHMsXG4gIGJhY2tlbmQ6IE1hdGhCYWNrZW5kQ1BVLFxuICBhdHRyczogTWlycm9yUGFkQXR0cnNcbn0pOiBUZW5zb3JJbmZvIHtcbiAgY29uc3Qge2lucHV0cywgYmFja2VuZCwgYXR0cnN9ID0gYXJncztcbiAgY29uc3Qge3h9ID0gaW5wdXRzO1xuICBjb25zdCB7cGFkZGluZ3MsIG1vZGV9ID0gYXR0cnM7XG5cbiAgYXNzZXJ0Tm90Q29tcGxleCh4LCAnbWlycm9yUGFkJyk7XG5cbiAgY29uc3Qgb3V0U2hhcGUgPSBwYWRkaW5ncy5tYXAoXG4gICAgICAocCwgaSkgPT4gcFswXSAvKiBiZWZvcmVQYWQgKi8gKyB4LnNoYXBlW2ldICsgcFsxXSAvKiBhZnRlclBhZCAqLyk7XG5cbiAgY29uc3Qgc3RhcnQgPSBwYWRkaW5ncy5tYXAocCA9PiBwWzBdKTtcbiAgY29uc3QgZW5kID0gcGFkZGluZ3MubWFwKChwLCBpKSA9PiBwWzBdICsgeC5zaGFwZVtpXSk7XG4gIGNvbnN0IG9mZnNldCA9IG1vZGUgPT09ICdyZWZsZWN0JyA/IDAgOiAxO1xuXG4gIGNvbnN0IHhWYWxzID0gYmFja2VuZC5kYXRhLmdldCh4LmRhdGFJZCkudmFsdWVzIGFzIFR5cGVkQXJyYXk7XG4gIGNvbnN0IHhSYW5rID0geC5zaGFwZS5sZW5ndGg7XG4gIGNvbnN0IHhTdHJpZGVzID0gdXRpbC5jb21wdXRlU3RyaWRlcyh4LnNoYXBlKTtcblxuICBjb25zdCByZXN1bHRTaXplID0gdXRpbC5zaXplRnJvbVNoYXBlKG91dFNoYXBlKTtcbiAgY29uc3QgcmVzdWx0UmFuayA9IG91dFNoYXBlLmxlbmd0aDtcbiAgY29uc3QgcmVzdWx0U3RyaWRlcyA9IHV0aWwuY29tcHV0ZVN0cmlkZXMob3V0U2hhcGUpO1xuICBjb25zdCByZXNWYWxzID1cbiAgICAgIHV0aWwuZ2V0VHlwZWRBcnJheUZyb21EVHlwZSh4LmR0eXBlIGFzIE51bWVyaWNEYXRhVHlwZSwgcmVzdWx0U2l6ZSk7XG5cbiAgZm9yIChsZXQgaSA9IDA7IGkgPCByZXN1bHRTaXplOyBpKyspIHtcbiAgICBsZXQgY29vcmRzID0gdXRpbC5pbmRleFRvTG9jKGksIHJlc3VsdFJhbmssIHJlc3VsdFN0cmlkZXMpO1xuICAgIGZvciAobGV0IGkgPSAwOyBpIDwgcmVzdWx0UmFuazsgaSsrKSB7XG4gICAgICBpZiAoY29vcmRzW2ldIDwgc3RhcnRbaV0pIHtcbiAgICAgICAgY29vcmRzW2ldID0gc3RhcnRbaV0gKiAyIC0gY29vcmRzW2ldIC0gb2Zmc2V0O1xuICAgICAgfSBlbHNlIGlmIChjb29yZHNbaV0gPj0gZW5kW2ldKSB7XG4gICAgICAgIGNvb3Jkc1tpXSA9IChlbmRbaV0gLSAxKSAqIDIgLSBjb29yZHNbaV0gKyBvZmZzZXQ7XG4gICAgICB9XG4gICAgfVxuICAgIGNvb3JkcyA9IGNvb3Jkcy5tYXAoKGMsIGkpID0+IGMgLSBzdGFydFtpXSk7XG5cbiAgICBjb25zdCBpbkluZGV4ID0gdXRpbC5sb2NUb0luZGV4KGNvb3JkcywgeFJhbmssIHhTdHJpZGVzKTtcblxuICAgIHJlc1ZhbHNbaV0gPSB4VmFsc1tpbkluZGV4XTtcbiAgfVxuXG4gIGNvbnN0IG91dElkID0gYmFja2VuZC53cml0ZShyZXNWYWxzLCBvdXRTaGFwZSwgeC5kdHlwZSk7XG5cbiAgcmV0dXJuIHtkYXRhSWQ6IG91dElkLCBzaGFwZTogb3V0U2hhcGUsIGR0eXBlOiB4LmR0eXBlfTtcbn1cblxuZXhwb3J0IGNvbnN0IG1pcnJvclBhZENvbmZpZzogS2VybmVsQ29uZmlnID0ge1xuICBrZXJuZWxOYW1lOiBNaXJyb3JQYWQsXG4gIGJhY2tlbmROYW1lOiAnY3B1JyxcbiAga2VybmVsRnVuYzogbWlycm9yUGFkIGFzIHt9IGFzIEtlcm5lbEZ1bmNcbn07XG4iXX0=","/**\n * @license\n * Copyright 2020 Google LLC. All Rights Reserved.\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n * =============================================================================\n */\nimport { Mod } from '@tensorflow/tfjs-core';\nimport { createSimpleBinaryKernelImpl } from '../utils/binary_impl';\nimport { binaryKernelFunc } from '../utils/binary_utils';\nexport const modImpl = createSimpleBinaryKernelImpl(((aValue, bValue) => {\n const rem = aValue % bValue;\n if ((aValue < 0 && bValue < 0) || (aValue >= 0 && bValue >= 0)) {\n return rem;\n }\n else {\n return (rem + bValue) % bValue;\n }\n}));\nexport const mod = binaryKernelFunc(Mod, modImpl);\nexport const modConfig = {\n kernelName: Mod,\n backendName: 'cpu',\n kernelFunc: mod\n};\n//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiTW9kLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vLi4vdGZqcy1iYWNrZW5kLWNwdS9zcmMva2VybmVscy9Nb2QudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUE7Ozs7Ozs7Ozs7Ozs7OztHQWVHO0FBRUgsT0FBTyxFQUFlLEdBQUcsRUFBQyxNQUFNLHVCQUF1QixDQUFDO0FBRXhELE9BQU8sRUFBQyw0QkFBNEIsRUFBQyxNQUFNLHNCQUFzQixDQUFDO0FBQ2xFLE9BQU8sRUFBQyxnQkFBZ0IsRUFBQyxNQUFNLHVCQUF1QixDQUFDO0FBRXZELE1BQU0sQ0FBQyxNQUFNLE9BQU8sR0FDaEIsNEJBQTRCLENBQUMsQ0FBQyxDQUFDLE1BQWMsRUFBRSxNQUFjLEVBQUUsRUFBRTtJQUMvRCxNQUFNLEdBQUcsR0FBRyxNQUFNLEdBQUcsTUFBTSxDQUFDO0lBQzVCLElBQUksQ0FBQyxNQUFNLEdBQUcsQ0FBQyxJQUFJLE1BQU0sR0FBRyxDQUFDLENBQUMsSUFBSSxDQUFDLE1BQU0sSUFBSSxDQUFDLElBQUksTUFBTSxJQUFJLENBQUMsQ0FBQyxFQUFFO1FBQzlELE9BQU8sR0FBRyxDQUFDO0tBQ1o7U0FBTTtRQUNMLE9BQU8sQ0FBQyxHQUFHLEdBQUcsTUFBTSxDQUFDLEdBQUcsTUFBTSxDQUFDO0tBQ2hDO0FBQ0gsQ0FBQyxDQUFDLENBQUMsQ0FBQztBQUVSLE1BQU0sQ0FBQyxNQUFNLEdBQUcsR0FBRyxnQkFBZ0IsQ0FBQyxHQUFHLEVBQUUsT0FBTyxDQUFDLENBQUM7QUFFbEQsTUFBTSxDQUFDLE1BQU0sU0FBUyxHQUFpQjtJQUNyQyxVQUFVLEVBQUUsR0FBRztJQUNmLFdBQVcsRUFBRSxLQUFLO0lBQ2xCLFVBQVUsRUFBRSxHQUFHO0NBQ2hCLENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyIvKipcbiAqIEBsaWNlbnNlXG4gKiBDb3B5cmlnaHQgMjAyMCBHb29nbGUgTExDLiBBbGwgUmlnaHRzIFJlc2VydmVkLlxuICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlIFwiTGljZW5zZVwiKTtcbiAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS5cbiAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdFxuICpcbiAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMFxuICpcbiAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmVcbiAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuIFwiQVMgSVNcIiBCQVNJUyxcbiAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLlxuICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZFxuICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuXG4gKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuICovXG5cbmltcG9ydCB7S2VybmVsQ29uZmlnLCBNb2R9IGZyb20gJ0B0ZW5zb3JmbG93L3RmanMtY29yZSc7XG5cbmltcG9ydCB7Y3JlYXRlU2ltcGxlQmluYXJ5S2VybmVsSW1wbH0gZnJvbSAnLi4vdXRpbHMvYmluYXJ5X2ltcGwnO1xuaW1wb3J0IHtiaW5hcnlLZXJuZWxGdW5jfSBmcm9tICcuLi91dGlscy9iaW5hcnlfdXRpbHMnO1xuXG5leHBvcnQgY29uc3QgbW9kSW1wbCA9XG4gICAgY3JlYXRlU2ltcGxlQmluYXJ5S2VybmVsSW1wbCgoKGFWYWx1ZTogbnVtYmVyLCBiVmFsdWU6IG51bWJlcikgPT4ge1xuICAgICAgY29uc3QgcmVtID0gYVZhbHVlICUgYlZhbHVlO1xuICAgICAgaWYgKChhVmFsdWUgPCAwICYmIGJWYWx1ZSA8IDApIHx8IChhVmFsdWUgPj0gMCAmJiBiVmFsdWUgPj0gMCkpIHtcbiAgICAgICAgcmV0dXJuIHJlbTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHJldHVybiAocmVtICsgYlZhbHVlKSAlIGJWYWx1ZTtcbiAgICAgIH1cbiAgICB9KSk7XG5cbmV4cG9ydCBjb25zdCBtb2QgPSBiaW5hcnlLZXJuZWxGdW5jKE1vZCwgbW9kSW1wbCk7XG5cbmV4cG9ydCBjb25zdCBtb2RDb25maWc6IEtlcm5lbENvbmZpZyA9IHtcbiAga2VybmVsTmFtZTogTW9kLFxuICBiYWNrZW5kTmFtZTogJ2NwdScsXG4gIGtlcm5lbEZ1bmM6IG1vZFxufTtcbiJdfQ==","/**\n * @license\n * Copyright 2020 Google LLC. All Rights Reserved.\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n * =============================================================================\n */\nimport { backend_util, Softmax, util } from '@tensorflow/tfjs-core';\nimport { exp } from './Exp';\nimport { max } from './Max';\nimport { div } from './RealDiv';\nimport { reshape } from './Reshape';\nimport { sub } from './Sub';\nimport { sum } from './Sum';\nexport function softmax(args) {\n const { inputs, backend, attrs } = args;\n const { logits } = inputs;\n const { dim } = attrs;\n const logitsRank = logits.shape.length;\n let $dim = dim;\n if ($dim === -1) {\n $dim = logitsRank - 1;\n }\n if ($dim !== logitsRank - 1) {\n throw Error('Softmax along a non-last dimension is not yet supported. ' +\n `Logits was rank ${logitsRank} and dim was ${$dim}`);\n }\n const axes = util.parseAxisParam([$dim], logits.shape);\n const maxLogit = max({\n inputs: { x: logits },\n backend,\n attrs: { reductionIndices: axes, keepDims: false }\n });\n const expandedShape = backend_util.expandShapeToKeepDim(maxLogit.shape, axes);\n const maxLogitReshaped = reshape({ inputs: { x: maxLogit }, backend, attrs: { shape: expandedShape } });\n const a = sub({ inputs: { a: logits, b: maxLogitReshaped }, backend });\n const b = exp({ inputs: { x: a }, backend });\n const sumExp = sum({ inputs: { x: b }, backend, attrs: { axis: axes, keepDims: false } });\n const sumReshaped = reshape({ inputs: { x: sumExp }, backend, attrs: { shape: expandedShape } });\n const result = div({ inputs: { a: b, b: sumReshaped }, backend });\n backend.disposeIntermediateTensorInfo(maxLogit);\n backend.disposeIntermediateTensorInfo(maxLogitReshaped);\n backend.disposeIntermediateTensorInfo(a);\n backend.disposeIntermediateTensorInfo(b);\n backend.disposeIntermediateTensorInfo(sumExp);\n backend.disposeIntermediateTensorInfo(sumReshaped);\n return result;\n}\nexport const softmaxConfig = {\n kernelName: Softmax,\n backendName: 'cpu',\n kernelFunc: softmax\n};\n//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiU29mdG1heC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uLy4uL3RmanMtYmFja2VuZC1jcHUvc3JjL2tlcm5lbHMvU29mdG1heC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQTs7Ozs7Ozs7Ozs7Ozs7O0dBZUc7QUFFSCxPQUFPLEVBQUMsWUFBWSxFQUE0QixPQUFPLEVBQTJDLElBQUksRUFBQyxNQUFNLHVCQUF1QixDQUFDO0FBSXJJLE9BQU8sRUFBQyxHQUFHLEVBQUMsTUFBTSxPQUFPLENBQUM7QUFDMUIsT0FBTyxFQUFDLEdBQUcsRUFBQyxNQUFNLE9BQU8sQ0FBQztBQUMxQixPQUFPLEVBQUMsR0FBRyxFQUFDLE1BQU0sV0FBVyxDQUFDO0FBQzlCLE9BQU8sRUFBQyxPQUFPLEVBQUMsTUFBTSxXQUFXLENBQUM7QUFDbEMsT0FBTyxFQUFDLEdBQUcsRUFBQyxNQUFNLE9BQU8sQ0FBQztBQUMxQixPQUFPLEVBQUMsR0FBRyxFQUFDLE1BQU0sT0FBTyxDQUFDO0FBRTFCLE1BQU0sVUFBVSxPQUFPLENBQ25CLElBQ3lFO0lBRTNFLE1BQU0sRUFBQyxNQUFNLEVBQUUsT0FBTyxFQUFFLEtBQUssRUFBQyxHQUFHLElBQUksQ0FBQztJQUN0QyxNQUFNLEVBQUMsTUFBTSxFQUFDLEdBQUcsTUFBTSxDQUFDO0lBQ3hCLE1BQU0sRUFBQyxHQUFHLEVBQUMsR0FBRyxLQUFLLENBQUM7SUFFcEIsTUFBTSxVQUFVLEdBQUcsTUFBTSxDQUFDLEtBQUssQ0FBQyxNQUFNLENBQUM7SUFFdkMsSUFBSSxJQUFJLEdBQUcsR0FBRyxDQUFDO0lBQ2YsSUFBSSxJQUFJLEtBQUssQ0FBQyxDQUFDLEVBQUU7UUFDZixJQUFJLEdBQUcsVUFBVSxHQUFHLENBQUMsQ0FBQztLQUN2QjtJQUNELElBQUksSUFBSSxLQUFLLFVBQVUsR0FBRyxDQUFDLEVBQUU7UUFDM0IsTUFBTSxLQUFLLENBQ1AsMkRBQTJEO1lBQzNELG1CQUFtQixVQUFVLGdCQUFnQixJQUFJLEVBQUUsQ0FBQyxDQUFDO0tBQzFEO0lBRUQsTUFBTSxJQUFJLEdBQUcsSUFBSSxDQUFDLGNBQWMsQ0FBQyxDQUFDLElBQUksQ0FBQyxFQUFFLE1BQU0sQ0FBQyxLQUFLLENBQUMsQ0FBQztJQUN2RCxNQUFNLFFBQVEsR0FBRyxHQUFHLENBQUM7UUFDbkIsTUFBTSxFQUFFLEVBQUMsQ0FBQyxFQUFFLE1BQU0sRUFBQztRQUNuQixPQUFPO1FBQ1AsS0FBSyxFQUFFLEVBQUMsZ0JBQWdCLEVBQUUsSUFBSSxFQUFFLFFBQVEsRUFBRSxLQUFLLEVBQUM7S0FDakQsQ0FBQyxDQUFDO0lBQ0gsTUFBTSxhQUFhLEdBQUcsWUFBWSxDQUFDLG9CQUFvQixDQUFDLFFBQVEsQ0FBQyxLQUFLLEVBQUUsSUFBSSxDQUFDLENBQUM7SUFFOUUsTUFBTSxnQkFBZ0IsR0FDbEIsT0FBTyxDQUFDLEVBQUMsTUFBTSxFQUFFLEVBQUMsQ0FBQyxFQUFFLFFBQVEsRUFBQyxFQUFFLE9BQU8sRUFBRSxLQUFLLEVBQUUsRUFBQyxLQUFLLEVBQUUsYUFBYSxFQUFDLEVBQUMsQ0FBQyxDQUFDO0lBQzdFLE1BQU0sQ0FBQyxHQUNILEdBQUcsQ0FBQyxFQUFDLE1BQU0sRUFBRSxFQUFDLENBQUMsRUFBRSxNQUFNLEVBQUUsQ0FBQyxFQUFFLGdCQUFnQixFQUFDLEVBQUUsT0FBTyxFQUFDLENBQWUsQ0FBQztJQUMzRSxNQUFNLENBQUMsR0FBRyxHQUFHLENBQUMsRUFBQyxNQUFNLEVBQUUsRUFBQyxDQUFDLEVBQUUsQ0FBQyxFQUFDLEVBQUUsT0FBTyxFQUFDLENBQWUsQ0FBQztJQUN2RCxNQUFNLE1BQU0sR0FDUixHQUFHLENBQUMsRUFBQyxNQUFNLEVBQUUsRUFBQyxDQUFDLEVBQUUsQ0FBQyxFQUFDLEVBQUUsT0FBTyxFQUFFLEtBQUssRUFBRSxFQUFDLElBQUksRUFBRSxJQUFJLEVBQUUsUUFBUSxFQUFFLEtBQUssRUFBQyxFQUFDLENBQUMsQ0FBQztJQUN6RSxNQUFNLFdBQVcsR0FDYixPQUFPLENBQUMsRUFBQyxNQUFNLEVBQUUsRUFBQyxDQUFDLEVBQUUsTUFBTSxFQUFDLEVBQUUsT0FBTyxFQUFFLEtBQUssRUFBRSxFQUFDLEtBQUssRUFBRSxhQUFhLEVBQUMsRUFBQyxDQUFDLENBQUM7SUFFM0UsTUFBTSxNQUFNLEdBQUcsR0FBRyxDQUFDLEVBQUMsTUFBTSxFQUFFLEVBQUMsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsV0FBVyxFQUFDLEVBQUUsT0FBTyxFQUFDLENBQWUsQ0FBQztJQUU1RSxPQUFPLENBQUMsNkJBQTZCLENBQUMsUUFBUSxDQUFDLENBQUM7SUFDaEQsT0FBTyxDQUFDLDZCQUE2QixDQUFDLGdCQUFnQixDQUFDLENBQUM7SUFDeEQsT0FBTyxDQUFDLDZCQUE2QixDQUFDLENBQUMsQ0FBQyxDQUFDO0lBQ3pDLE9BQU8sQ0FBQyw2QkFBNkIsQ0FBQyxDQUFDLENBQUMsQ0FBQztJQUN6QyxPQUFPLENBQUMsNkJBQTZCLENBQUMsTUFBTSxDQUFDLENBQUM7SUFDOUMsT0FBTyxDQUFDLDZCQUE2QixDQUFDLFdBQVcsQ0FBQyxDQUFDO0lBRW5ELE9BQU8sTUFBTSxDQUFDO0FBQ2hCLENBQUM7QUFFRCxNQUFNLENBQUMsTUFBTSxhQUFhLEdBQWlCO0lBQ3pDLFVBQVUsRUFBRSxPQUFPO0lBQ25CLFdBQVcsRUFBRSxLQUFLO0lBQ2xCLFVBQVUsRUFBRSxPQUEyQjtDQUN4QyxDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiLyoqXG4gKiBAbGljZW5zZVxuICogQ29weXJpZ2h0IDIwMjAgR29vZ2xlIExMQy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC5cbiAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSBcIkxpY2Vuc2VcIik7XG4gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuXG4gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXRcbiAqXG4gKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjBcbiAqXG4gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlXG4gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiBcIkFTIElTXCIgQkFTSVMsXG4gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC5cbiAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmRcbiAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLlxuICogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbiAqL1xuXG5pbXBvcnQge2JhY2tlbmRfdXRpbCwgS2VybmVsQ29uZmlnLCBLZXJuZWxGdW5jLCBTb2Z0bWF4LCBTb2Z0bWF4QXR0cnMsIFNvZnRtYXhJbnB1dHMsIFRlbnNvckluZm8sIHV0aWx9IGZyb20gJ0B0ZW5zb3JmbG93L3RmanMtY29yZSc7XG5cbmltcG9ydCB7TWF0aEJhY2tlbmRDUFV9IGZyb20gJy4uL2JhY2tlbmRfY3B1JztcblxuaW1wb3J0IHtleHB9IGZyb20gJy4vRXhwJztcbmltcG9ydCB7bWF4fSBmcm9tICcuL01heCc7XG5pbXBvcnQge2Rpdn0gZnJvbSAnLi9SZWFsRGl2JztcbmltcG9ydCB7cmVzaGFwZX0gZnJvbSAnLi9SZXNoYXBlJztcbmltcG9ydCB7c3VifSBmcm9tICcuL1N1Yic7XG5pbXBvcnQge3N1bX0gZnJvbSAnLi9TdW0nO1xuXG5leHBvcnQgZnVuY3Rpb24gc29mdG1heChcbiAgICBhcmdzOlxuICAgICAgICB7aW5wdXRzOiBTb2Z0bWF4SW5wdXRzLCBiYWNrZW5kOiBNYXRoQmFja2VuZENQVSwgYXR0cnM6IFNvZnRtYXhBdHRyc30pOlxuICAgIFRlbnNvckluZm8ge1xuICBjb25zdCB7aW5wdXRzLCBiYWNrZW5kLCBhdHRyc30gPSBhcmdzO1xuICBjb25zdCB7bG9naXRzfSA9IGlucHV0cztcbiAgY29uc3Qge2RpbX0gPSBhdHRycztcblxuICBjb25zdCBsb2dpdHNSYW5rID0gbG9naXRzLnNoYXBlLmxlbmd0aDtcblxuICBsZXQgJGRpbSA9IGRpbTtcbiAgaWYgKCRkaW0gPT09IC0xKSB7XG4gICAgJGRpbSA9IGxvZ2l0c1JhbmsgLSAxO1xuICB9XG4gIGlmICgkZGltICE9PSBsb2dpdHNSYW5rIC0gMSkge1xuICAgIHRocm93IEVycm9yKFxuICAgICAgICAnU29mdG1heCBhbG9uZyBhIG5vbi1sYXN0IGRpbWVuc2lvbiBpcyBub3QgeWV0IHN1cHBvcnRlZC4gJyArXG4gICAgICAgIGBMb2dpdHMgd2FzIHJhbmsgJHtsb2dpdHNSYW5rfSBhbmQgZGltIHdhcyAkeyRkaW19YCk7XG4gIH1cblxuICBjb25zdCBheGVzID0gdXRpbC5wYXJzZUF4aXNQYXJhbShbJGRpbV0sIGxvZ2l0cy5zaGFwZSk7XG4gIGNvbnN0IG1heExvZ2l0ID0gbWF4KHtcbiAgICBpbnB1dHM6IHt4OiBsb2dpdHN9LFxuICAgIGJhY2tlbmQsXG4gICAgYXR0cnM6IHtyZWR1Y3Rpb25JbmRpY2VzOiBheGVzLCBrZWVwRGltczogZmFsc2V9XG4gIH0pO1xuICBjb25zdCBleHBhbmRlZFNoYXBlID0gYmFja2VuZF91dGlsLmV4cGFuZFNoYXBlVG9LZWVwRGltKG1heExvZ2l0LnNoYXBlLCBheGVzKTtcblxuICBjb25zdCBtYXhMb2dpdFJlc2hhcGVkID1cbiAgICAgIHJlc2hhcGUoe2lucHV0czoge3g6IG1heExvZ2l0fSwgYmFja2VuZCwgYXR0cnM6IHtzaGFwZTogZXhwYW5kZWRTaGFwZX19KTtcbiAgY29uc3QgYSA9XG4gICAgICBzdWIoe2lucHV0czoge2E6IGxvZ2l0cywgYjogbWF4TG9naXRSZXNoYXBlZH0sIGJhY2tlbmR9KSBhcyBUZW5zb3JJbmZvO1xuICBjb25zdCBiID0gZXhwKHtpbnB1dHM6IHt4OiBhfSwgYmFja2VuZH0pIGFzIFRlbnNvckluZm87XG4gIGNvbnN0IHN1bUV4cCA9XG4gICAgICBzdW0oe2lucHV0czoge3g6IGJ9LCBiYWNrZW5kLCBhdHRyczoge2F4aXM6IGF4ZXMsIGtlZXBEaW1zOiBmYWxzZX19KTtcbiAgY29uc3Qgc3VtUmVzaGFwZWQgPVxuICAgICAgcmVzaGFwZSh7aW5wdXRzOiB7eDogc3VtRXhwfSwgYmFja2VuZCwgYXR0cnM6IHtzaGFwZTogZXhwYW5kZWRTaGFwZX19KTtcblxuICBjb25zdCByZXN1bHQgPSBkaXYoe2lucHV0czoge2E6IGIsIGI6IHN1bVJlc2hhcGVkfSwgYmFja2VuZH0pIGFzIFRlbnNvckluZm87XG5cbiAgYmFja2VuZC5kaXNwb3NlSW50ZXJtZWRpYXRlVGVuc29ySW5mbyhtYXhMb2dpdCk7XG4gIGJhY2tlbmQuZGlzcG9zZUludGVybWVkaWF0ZVRlbnNvckluZm8obWF4TG9naXRSZXNoYXBlZCk7XG4gIGJhY2tlbmQuZGlzcG9zZUludGVybWVkaWF0ZVRlbnNvckluZm8oYSk7XG4gIGJhY2tlbmQuZGlzcG9zZUludGVybWVkaWF0ZVRlbnNvckluZm8oYik7XG4gIGJhY2tlbmQuZGlzcG9zZUludGVybWVkaWF0ZVRlbnNvckluZm8oc3VtRXhwKTtcbiAgYmFja2VuZC5kaXNwb3NlSW50ZXJtZWRpYXRlVGVuc29ySW5mbyhzdW1SZXNoYXBlZCk7XG5cbiAgcmV0dXJuIHJlc3VsdDtcbn1cblxuZXhwb3J0IGNvbnN0IHNvZnRtYXhDb25maWc6IEtlcm5lbENvbmZpZyA9IHtcbiAga2VybmVsTmFtZTogU29mdG1heCxcbiAgYmFja2VuZE5hbWU6ICdjcHUnLFxuICBrZXJuZWxGdW5jOiBzb2Z0bWF4IGFzIHt9IGFzIEtlcm5lbEZ1bmNcbn07XG4iXX0=","/**\n * @license\n * Copyright 2020 Google LLC. All Rights Reserved.\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n * =============================================================================\n */\nimport { Multinomial, util } from '@tensorflow/tfjs-core';\nimport * as seedrandom from 'seedrandom';\nimport { assertNotComplex } from '../cpu_util';\nimport { softmax } from './Softmax';\nexport function multinomial(args) {\n const { inputs, backend, attrs } = args;\n const { logits } = inputs;\n const { numSamples, seed, normalized } = attrs;\n assertNotComplex(logits, 'multinomial');\n const probabilities = normalized ?\n logits :\n softmax({ inputs: { logits }, backend, attrs: { dim: -1 } });\n const batchSize = probabilities.shape[0];\n const numEvents = probabilities.shape[1];\n const probVals = backend.data.get(probabilities.dataId).values;\n const resShape = [batchSize, numSamples];\n const resVals = util.makeZerosTypedArray(util.sizeFromShape(resShape), 'int32');\n for (let b = 0; b < batchSize; ++b) {\n const offset = b * numEvents;\n // The cdf won't include the last event. It will be implicit if no other\n // event happened.\n const cdf = new Float32Array(numEvents - 1);\n cdf[0] = probVals[offset];\n for (let event = 1; event < cdf.length; ++event) {\n cdf[event] = cdf[event - 1] + probVals[offset + event];\n }\n const random = seedrandom.alea(seed.toString());\n const outOffset = b * numSamples;\n for (let sampleId = 0; sampleId < numSamples; ++sampleId) {\n const r = random();\n // Assume last event happened by default.\n resVals[outOffset + sampleId] = cdf.length;\n for (let event = 0; event < cdf.length; event++) {\n if (r < cdf[event]) {\n resVals[outOffset + sampleId] = event;\n break;\n }\n }\n }\n }\n if (!normalized) {\n backend.disposeIntermediateTensorInfo(probabilities);\n }\n return backend.makeTensorInfo(resShape, 'int32', resVals);\n}\nexport const multinomialConfig = {\n kernelName: Multinomial,\n backendName: 'cpu',\n kernelFunc: multinomial\n};\n//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiTXVsdGlub21pYWwuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi8uLi90ZmpzLWJhY2tlbmQtY3B1L3NyYy9rZXJuZWxzL011bHRpbm9taWFsLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBOzs7Ozs7Ozs7Ozs7Ozs7R0FlRztBQUVILE9BQU8sRUFBMkIsV0FBVyxFQUErRCxJQUFJLEVBQUMsTUFBTSx1QkFBdUIsQ0FBQztBQUMvSSxPQUFPLEtBQUssVUFBVSxNQUFNLFlBQVksQ0FBQztBQUd6QyxPQUFPLEVBQUMsZ0JBQWdCLEVBQUMsTUFBTSxhQUFhLENBQUM7QUFFN0MsT0FBTyxFQUFDLE9BQU8sRUFBQyxNQUFNLFdBQVcsQ0FBQztBQUVsQyxNQUFNLFVBQVUsV0FBVyxDQUFDLElBSTNCO0lBQ0MsTUFBTSxFQUFDLE1BQU0sRUFBRSxPQUFPLEVBQUUsS0FBSyxFQUFDLEdBQUcsSUFBSSxDQUFDO0lBQ3RDLE1BQU0sRUFBQyxNQUFNLEVBQUMsR0FBRyxNQUFNLENBQUM7SUFDeEIsTUFBTSxFQUFDLFVBQVUsRUFBRSxJQUFJLEVBQUUsVUFBVSxFQUFDLEdBQUcsS0FBSyxDQUFDO0lBRTdDLGdCQUFnQixDQUFDLE1BQU0sRUFBRSxhQUFhLENBQUMsQ0FBQztJQUV4QyxNQUFNLGFBQWEsR0FBRyxVQUFVLENBQUMsQ0FBQztRQUM5QixNQUFNLENBQUMsQ0FBQztRQUNSLE9BQU8sQ0FBQyxFQUFDLE1BQU0sRUFBRSxFQUFDLE1BQU0sRUFBQyxFQUFFLE9BQU8sRUFBRSxLQUFLLEVBQUUsRUFBQyxHQUFHLEVBQUUsQ0FBQyxDQUFDLEVBQUMsRUFBQyxDQUFDLENBQUM7SUFFM0QsTUFBTSxTQUFTLEdBQUcsYUFBYSxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUMsQ0FBQztJQUN6QyxNQUFNLFNBQVMsR0FBRyxhQUFhLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQyxDQUFDO0lBQ3pDLE1BQU0sUUFBUSxHQUFHLE9BQU8sQ0FBQyxJQUFJLENBQUMsR0FBRyxDQUFDLGFBQWEsQ0FBQyxNQUFNLENBQUMsQ0FBQyxNQUFvQixDQUFDO0lBQzdFLE1BQU0sUUFBUSxHQUFHLENBQUMsU0FBUyxFQUFFLFVBQVUsQ0FBQyxDQUFDO0lBQ3pDLE1BQU0sT0FBTyxHQUNULElBQUksQ0FBQyxtQkFBbUIsQ0FBQyxJQUFJLENBQUMsYUFBYSxDQUFDLFFBQVEsQ0FBQyxFQUFFLE9BQU8sQ0FBQyxDQUFDO0lBRXBFLEtBQUssSUFBSSxDQUFDLEdBQUcsQ0FBQyxFQUFFLENBQUMsR0FBRyxTQUFTLEVBQUUsRUFBRSxDQUFDLEVBQUU7UUFDbEMsTUFBTSxNQUFNLEdBQUcsQ0FBQyxHQUFHLFNBQVMsQ0FBQztRQUM3Qix3RUFBd0U7UUFDeEUsa0JBQWtCO1FBQ2xCLE1BQU0sR0FBRyxHQUFHLElBQUksWUFBWSxDQUFDLFNBQVMsR0FBRyxDQUFDLENBQUMsQ0FBQztRQUM1QyxHQUFHLENBQUMsQ0FBQyxDQUFDLEdBQUcsUUFBUSxDQUFDLE1BQU0sQ0FBQyxDQUFDO1FBQzFCLEtBQUssSUFBSSxLQUFLLEdBQUcsQ0FBQyxFQUFFLEtBQUssR0FBRyxHQUFHLENBQUMsTUFBTSxFQUFFLEVBQUUsS0FBSyxFQUFFO1lBQy9DLEdBQUcsQ0FBQyxLQUFLLENBQUMsR0FBRyxHQUFHLENBQUMsS0FBSyxHQUFHLENBQUMsQ0FBQyxHQUFHLFFBQVEsQ0FBQyxNQUFNLEdBQUcsS0FBSyxDQUFDLENBQUM7U0FDeEQ7UUFFRCxNQUFNLE1BQU0sR0FBRyxVQUFVLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxRQUFRLEVBQUUsQ0FBQyxDQUFDO1FBQ2hELE1BQU0sU0FBUyxHQUFHLENBQUMsR0FBRyxVQUFVLENBQUM7UUFDakMsS0FBSyxJQUFJLFFBQVEsR0FBRyxDQUFDLEVBQUUsUUFBUSxHQUFHLFVBQVUsRUFBRSxFQUFFLFFBQVEsRUFBRTtZQUN4RCxNQUFNLENBQUMsR0FBRyxNQUFNLEVBQUUsQ0FBQztZQUVuQix5Q0FBeUM7WUFDekMsT0FBTyxDQUFDLFNBQVMsR0FBRyxRQUFRLENBQUMsR0FBRyxHQUFHLENBQUMsTUFBTSxDQUFDO1lBRTNDLEtBQUssSUFBSSxLQUFLLEdBQUcsQ0FBQyxFQUFFLEtBQUssR0FBRyxHQUFHLENBQUMsTUFBTSxFQUFFLEtBQUssRUFBRSxFQUFFO2dCQUMvQyxJQUFJLENBQUMsR0FBRyxHQUFHLENBQUMsS0FBSyxDQUFDLEVBQUU7b0JBQ2xCLE9BQU8sQ0FBQyxTQUFTLEdBQUcsUUFBUSxDQUFDLEdBQUcsS0FBSyxDQUFDO29CQUN0QyxNQUFNO2lCQUNQO2FBQ0Y7U0FDRjtLQUNGO0lBRUQsSUFBSSxDQUFDLFVBQVUsRUFBRTtRQUNmLE9BQU8sQ0FBQyw2QkFBNkIsQ0FBQyxhQUFhLENBQUMsQ0FBQztLQUN0RDtJQUVELE9BQU8sT0FBTyxDQUFDLGNBQWMsQ0FBQyxRQUFRLEVBQUUsT0FBTyxFQUFFLE9BQU8sQ0FBQyxDQUFDO0FBQzVELENBQUM7QUFFRCxNQUFNLENBQUMsTUFBTSxpQkFBaUIsR0FBaUI7SUFDN0MsVUFBVSxFQUFFLFdBQVc7SUFDdkIsV0FBVyxFQUFFLEtBQUs7SUFDbEIsVUFBVSxFQUFFLFdBQStCO0NBQzVDLENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyIvKipcbiAqIEBsaWNlbnNlXG4gKiBDb3B5cmlnaHQgMjAyMCBHb29nbGUgTExDLiBBbGwgUmlnaHRzIFJlc2VydmVkLlxuICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlIFwiTGljZW5zZVwiKTtcbiAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS5cbiAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdFxuICpcbiAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMFxuICpcbiAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmVcbiAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuIFwiQVMgSVNcIiBCQVNJUyxcbiAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLlxuICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZFxuICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuXG4gKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuICovXG5cbmltcG9ydCB7S2VybmVsQ29uZmlnLCBLZXJuZWxGdW5jLCBNdWx0aW5vbWlhbCwgTXVsdGlub21pYWxBdHRycywgTXVsdGlub21pYWxJbnB1dHMsIFRlbnNvckluZm8sIFR5cGVkQXJyYXksIHV0aWx9IGZyb20gJ0B0ZW5zb3JmbG93L3RmanMtY29yZSc7XG5pbXBvcnQgKiBhcyBzZWVkcmFuZG9tIGZyb20gJ3NlZWRyYW5kb20nO1xuXG5pbXBvcnQge01hdGhCYWNrZW5kQ1BVfSBmcm9tICcuLi9iYWNrZW5kX2NwdSc7XG5pbXBvcnQge2Fzc2VydE5vdENvbXBsZXh9IGZyb20gJy4uL2NwdV91dGlsJztcblxuaW1wb3J0IHtzb2Z0bWF4fSBmcm9tICcuL1NvZnRtYXgnO1xuXG5leHBvcnQgZnVuY3Rpb24gbXVsdGlub21pYWwoYXJnczoge1xuICBpbnB1dHM6IE11bHRpbm9taWFsSW5wdXRzLFxuICBiYWNrZW5kOiBNYXRoQmFja2VuZENQVSxcbiAgYXR0cnM6IE11bHRpbm9taWFsQXR0cnNcbn0pOiBUZW5zb3JJbmZvIHtcbiAgY29uc3Qge2lucHV0cywgYmFja2VuZCwgYXR0cnN9ID0gYXJncztcbiAgY29uc3Qge2xvZ2l0c30gPSBpbnB1dHM7XG4gIGNvbnN0IHtudW1TYW1wbGVzLCBzZWVkLCBub3JtYWxpemVkfSA9IGF0dHJzO1xuXG4gIGFzc2VydE5vdENvbXBsZXgobG9naXRzLCAnbXVsdGlub21pYWwnKTtcblxuICBjb25zdCBwcm9iYWJpbGl0aWVzID0gbm9ybWFsaXplZCA/XG4gICAgICBsb2dpdHMgOlxuICAgICAgc29mdG1heCh7aW5wdXRzOiB7bG9naXRzfSwgYmFja2VuZCwgYXR0cnM6IHtkaW06IC0xfX0pO1xuXG4gIGNvbnN0IGJhdGNoU2l6ZSA9IHByb2JhYmlsaXRpZXMuc2hhcGVbMF07XG4gIGNvbnN0IG51bUV2ZW50cyA9IHByb2JhYmlsaXRpZXMuc2hhcGVbMV07XG4gIGNvbnN0IHByb2JWYWxzID0gYmFja2VuZC5kYXRhLmdldChwcm9iYWJpbGl0aWVzLmRhdGFJZCkudmFsdWVzIGFzIFR5cGVkQXJyYXk7XG4gIGNvbnN0IHJlc1NoYXBlID0gW2JhdGNoU2l6ZSwgbnVtU2FtcGxlc107XG4gIGNvbnN0IHJlc1ZhbHMgPVxuICAgICAgdXRpbC5tYWtlWmVyb3NUeXBlZEFycmF5KHV0aWwuc2l6ZUZyb21TaGFwZShyZXNTaGFwZSksICdpbnQzMicpO1xuXG4gIGZvciAobGV0IGIgPSAwOyBiIDwgYmF0Y2hTaXplOyArK2IpIHtcbiAgICBjb25zdCBvZmZzZXQgPSBiICogbnVtRXZlbnRzO1xuICAgIC8vIFRoZSBjZGYgd29uJ3QgaW5jbHVkZSB0aGUgbGFzdCBldmVudC4gSXQgd2lsbCBiZSBpbXBsaWNpdCBpZiBubyBvdGhlclxuICAgIC8vIGV2ZW50IGhhcHBlbmVkLlxuICAgIGNvbnN0IGNkZiA9IG5ldyBGbG9hdDMyQXJyYXkobnVtRXZlbnRzIC0gMSk7XG4gICAgY2RmWzBdID0gcHJvYlZhbHNbb2Zmc2V0XTtcbiAgICBmb3IgKGxldCBldmVudCA9IDE7IGV2ZW50IDwgY2RmLmxlbmd0aDsgKytldmVudCkge1xuICAgICAgY2RmW2V2ZW50XSA9IGNkZltldmVudCAtIDFdICsgcHJvYlZhbHNbb2Zmc2V0ICsgZXZlbnRdO1xuICAgIH1cblxuICAgIGNvbnN0IHJhbmRvbSA9IHNlZWRyYW5kb20uYWxlYShzZWVkLnRvU3RyaW5nKCkpO1xuICAgIGNvbnN0IG91dE9mZnNldCA9IGIgKiBudW1TYW1wbGVzO1xuICAgIGZvciAobGV0IHNhbXBsZUlkID0gMDsgc2FtcGxlSWQgPCBudW1TYW1wbGVzOyArK3NhbXBsZUlkKSB7XG4gICAgICBjb25zdCByID0gcmFuZG9tKCk7XG5cbiAgICAgIC8vIEFzc3VtZSBsYXN0IGV2ZW50IGhhcHBlbmVkIGJ5IGRlZmF1bHQuXG4gICAgICByZXNWYWxzW291dE9mZnNldCArIHNhbXBsZUlkXSA9IGNkZi5sZW5ndGg7XG5cbiAgICAgIGZvciAobGV0IGV2ZW50ID0gMDsgZXZlbnQgPCBjZGYubGVuZ3RoOyBldmVudCsrKSB7XG4gICAgICAgIGlmIChyIDwgY2RmW2V2ZW50XSkge1xuICAgICAgICAgIHJlc1ZhbHNbb3V0T2Zmc2V0ICsgc2FtcGxlSWRdID0gZXZlbnQ7XG4gICAgICAgICAgYnJlYWs7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9XG4gIH1cblxuICBpZiAoIW5vcm1hbGl6ZWQpIHtcbiAgICBiYWNrZW5kLmRpc3Bvc2VJbnRlcm1lZGlhdGVUZW5zb3JJbmZvKHByb2JhYmlsaXRpZXMpO1xuICB9XG5cbiAgcmV0dXJuIGJhY2tlbmQubWFrZVRlbnNvckluZm8ocmVzU2hhcGUsICdpbnQzMicsIHJlc1ZhbHMpO1xufVxuXG5leHBvcnQgY29uc3QgbXVsdGlub21pYWxDb25maWc6IEtlcm5lbENvbmZpZyA9IHtcbiAga2VybmVsTmFtZTogTXVsdGlub21pYWwsXG4gIGJhY2tlbmROYW1lOiAnY3B1JyxcbiAga2VybmVsRnVuYzogbXVsdGlub21pYWwgYXMge30gYXMgS2VybmVsRnVuY1xufTtcbiJdfQ==","/**\n * @license\n * Copyright 2020 Google LLC. All Rights Reserved.\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n * =============================================================================\n */\nimport { Neg, util } from '@tensorflow/tfjs-core';\nimport { assertNotComplex } from '../cpu_util';\nimport { multiplyImpl } from './Multiply';\nexport function negImpl(xVals, xShape, xDtype) {\n const minusOne = util.createScalarValue(-1, xDtype);\n return multiplyImpl([], xShape, minusOne, xVals, xDtype);\n}\nexport function neg(args) {\n const { inputs, backend } = args;\n const { x } = inputs;\n assertNotComplex(x, 'neg');\n const xVals = backend.data.get(x.dataId).values;\n const [res, newShape] = negImpl(xVals, x.shape, x.dtype);\n return backend.makeTensorInfo(newShape, x.dtype, res);\n}\nexport const negConfig = {\n kernelName: Neg,\n backendName: 'cpu',\n kernelFunc: neg\n};\n//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiTmVnLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vLi4vdGZqcy1iYWNrZW5kLWNwdS9zcmMva2VybmVscy9OZWcudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUE7Ozs7Ozs7Ozs7Ozs7OztHQWVHO0FBRUgsT0FBTyxFQUFxQyxHQUFHLEVBQXVDLElBQUksRUFBQyxNQUFNLHVCQUF1QixDQUFDO0FBR3pILE9BQU8sRUFBQyxnQkFBZ0IsRUFBQyxNQUFNLGFBQWEsQ0FBQztBQUM3QyxPQUFPLEVBQUMsWUFBWSxFQUFDLE1BQU0sWUFBWSxDQUFDO0FBRXhDLE1BQU0sVUFBVSxPQUFPLENBQUMsS0FBaUIsRUFBRSxNQUFnQixFQUFFLE1BQWdCO0lBRTNFLE1BQU0sUUFBUSxHQUNWLElBQUksQ0FBQyxpQkFBaUIsQ0FBQyxDQUFDLENBQW9CLEVBQUUsTUFBTSxDQUFlLENBQUM7SUFDeEUsT0FBTyxZQUFZLENBQUMsRUFBRSxFQUFFLE1BQU0sRUFBRSxRQUFRLEVBQUUsS0FBSyxFQUFFLE1BQU0sQ0FBQyxDQUFDO0FBQzNELENBQUM7QUFFRCxNQUFNLFVBQVUsR0FBRyxDQUFDLElBQW9EO0lBRXRFLE1BQU0sRUFBQyxNQUFNLEVBQUUsT0FBTyxFQUFDLEdBQUcsSUFBSSxDQUFDO0lBQy9CLE1BQU0sRUFBQyxDQUFDLEVBQUMsR0FBRyxNQUFNLENBQUM7SUFFbkIsZ0JBQWdCLENBQUMsQ0FBQyxFQUFFLEtBQUssQ0FBQyxDQUFDO0lBRTNCLE1BQU0sS0FBSyxHQUFHLE9BQU8sQ0FBQyxJQUFJLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxNQUFNLENBQUMsQ0FBQyxNQUFvQixDQUFDO0lBQzlELE1BQU0sQ0FBQyxHQUFHLEVBQUUsUUFBUSxDQUFDLEdBQUcsT0FBTyxDQUFDLEtBQUssRUFBRSxDQUFDLENBQUMsS0FBSyxFQUFFLENBQUMsQ0FBQyxLQUFLLENBQUMsQ0FBQztJQUV6RCxPQUFPLE9BQU8sQ0FBQyxjQUFjLENBQUMsUUFBUSxFQUFFLENBQUMsQ0FBQyxLQUFLLEVBQUUsR0FBRyxDQUFDLENBQUM7QUFDeEQsQ0FBQztBQUVELE1BQU0sQ0FBQyxNQUFNLFNBQVMsR0FBaUI7SUFDckMsVUFBVSxFQUFFLEdBQUc7SUFDZixXQUFXLEVBQUUsS0FBSztJQUNsQixVQUFVLEVBQUUsR0FBdUI7Q0FDcEMsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbIi8qKlxuICogQGxpY2Vuc2VcbiAqIENvcHlyaWdodCAyMDIwIEdvb2dsZSBMTEMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuXG4gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgXCJMaWNlbnNlXCIpO1xuICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLlxuICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0XG4gKlxuICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wXG4gKlxuICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZVxuICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gXCJBUyBJU1wiIEJBU0lTLFxuICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuXG4gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kXG4gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS5cbiAqID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4gKi9cblxuaW1wb3J0IHtEYXRhVHlwZSwgS2VybmVsQ29uZmlnLCBLZXJuZWxGdW5jLCBOZWcsIFRlbnNvckluZm8sIFR5cGVkQXJyYXksIFVuYXJ5SW5wdXRzLCB1dGlsfSBmcm9tICdAdGVuc29yZmxvdy90ZmpzLWNvcmUnO1xuXG5pbXBvcnQge01hdGhCYWNrZW5kQ1BVfSBmcm9tICcuLi9iYWNrZW5kX2NwdSc7XG5pbXBvcnQge2Fzc2VydE5vdENvbXBsZXh9IGZyb20gJy4uL2NwdV91dGlsJztcbmltcG9ydCB7bXVsdGlwbHlJbXBsfSBmcm9tICcuL011bHRpcGx5JztcblxuZXhwb3J0IGZ1bmN0aW9uIG5lZ0ltcGwoeFZhbHM6IFR5cGVkQXJyYXksIHhTaGFwZTogbnVtYmVyW10sIHhEdHlwZTogRGF0YVR5cGUpOlxuICAgIFtUeXBlZEFycmF5LCBudW1iZXJbXV0ge1xuICBjb25zdCBtaW51c09uZSA9XG4gICAgICB1dGlsLmNyZWF0ZVNjYWxhclZhbHVlKC0xIGFzIHt9IGFzICdmbG9hdDMyJywgeER0eXBlKSBhcyBUeXBlZEFycmF5O1xuICByZXR1cm4gbXVsdGlwbHlJbXBsKFtdLCB4U2hhcGUsIG1pbnVzT25lLCB4VmFscywgeER0eXBlKTtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIG5lZyhhcmdzOiB7aW5wdXRzOiBVbmFyeUlucHV0cywgYmFja2VuZDogTWF0aEJhY2tlbmRDUFV9KTpcbiAgICBUZW5zb3JJbmZvIHtcbiAgY29uc3Qge2lucHV0cywgYmFja2VuZH0gPSBhcmdzO1xuICBjb25zdCB7eH0gPSBpbnB1dHM7XG5cbiAgYXNzZXJ0Tm90Q29tcGxleCh4LCAnbmVnJyk7XG5cbiAgY29uc3QgeFZhbHMgPSBiYWNrZW5kLmRhdGEuZ2V0KHguZGF0YUlkKS52YWx1ZXMgYXMgVHlwZWRBcnJheTtcbiAgY29uc3QgW3JlcywgbmV3U2hhcGVdID0gbmVnSW1wbCh4VmFscywgeC5zaGFwZSwgeC5kdHlwZSk7XG5cbiAgcmV0dXJuIGJhY2tlbmQubWFrZVRlbnNvckluZm8obmV3U2hhcGUsIHguZHR5cGUsIHJlcyk7XG59XG5cbmV4cG9ydCBjb25zdCBuZWdDb25maWc6IEtlcm5lbENvbmZpZyA9IHtcbiAga2VybmVsTmFtZTogTmVnLFxuICBiYWNrZW5kTmFtZTogJ2NwdScsXG4gIGtlcm5lbEZ1bmM6IG5lZyBhcyB7fSBhcyBLZXJuZWxGdW5jXG59O1xuIl19","/**\n * @license\n * Copyright 2020 Google LLC. All Rights Reserved.\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n * =============================================================================\n */\nimport { kernel_impls, NonMaxSuppressionV3 } from '@tensorflow/tfjs-core';\nconst nonMaxSuppressionV3Impl = kernel_impls.nonMaxSuppressionV3Impl;\nimport { assertNotComplex } from '../cpu_util';\nexport function nonMaxSuppressionV3(args) {\n const { inputs, backend, attrs } = args;\n const { boxes, scores } = inputs;\n const { maxOutputSize, iouThreshold, scoreThreshold } = attrs;\n assertNotComplex(boxes, 'NonMaxSuppression');\n const boxesVals = backend.data.get(boxes.dataId).values;\n const scoresVals = backend.data.get(scores.dataId).values;\n const { selectedIndices } = nonMaxSuppressionV3Impl(boxesVals, scoresVals, maxOutputSize, iouThreshold, scoreThreshold);\n return backend.makeTensorInfo([selectedIndices.length], 'int32', new Int32Array(selectedIndices));\n}\nexport const nonMaxSuppressionV3Config = {\n kernelName: NonMaxSuppressionV3,\n backendName: 'cpu',\n kernelFunc: nonMaxSuppressionV3\n};\n//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiTm9uTWF4U3VwcHJlc3Npb25WMy5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uLy4uL3RmanMtYmFja2VuZC1jcHUvc3JjL2tlcm5lbHMvTm9uTWF4U3VwcHJlc3Npb25WMy50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQTs7Ozs7Ozs7Ozs7Ozs7O0dBZUc7QUFFSCxPQUFPLEVBQUMsWUFBWSxFQUE0QixtQkFBbUIsRUFBOEUsTUFBTSx1QkFBdUIsQ0FBQztBQUUvSyxNQUFNLHVCQUF1QixHQUFHLFlBQVksQ0FBQyx1QkFBdUIsQ0FBQztBQUdyRSxPQUFPLEVBQUMsZ0JBQWdCLEVBQUMsTUFBTSxhQUFhLENBQUM7QUFFN0MsTUFBTSxVQUFVLG1CQUFtQixDQUFDLElBSW5DO0lBQ0MsTUFBTSxFQUFDLE1BQU0sRUFBRSxPQUFPLEVBQUUsS0FBSyxFQUFDLEdBQUcsSUFBSSxDQUFDO0lBQ3RDLE1BQU0sRUFBQyxLQUFLLEVBQUUsTUFBTSxFQUFDLEdBQUcsTUFBTSxDQUFDO0lBQy9CLE1BQU0sRUFBQyxhQUFhLEVBQUUsWUFBWSxFQUFFLGNBQWMsRUFBQyxHQUFHLEtBQUssQ0FBQztJQUU1RCxnQkFBZ0IsQ0FBQyxLQUFLLEVBQUUsbUJBQW1CLENBQUMsQ0FBQztJQUU3QyxNQUFNLFNBQVMsR0FBRyxPQUFPLENBQUMsSUFBSSxDQUFDLEdBQUcsQ0FBQyxLQUFLLENBQUMsTUFBTSxDQUFDLENBQUMsTUFBb0IsQ0FBQztJQUN0RSxNQUFNLFVBQVUsR0FBRyxPQUFPLENBQUMsSUFBSSxDQUFDLEdBQUcsQ0FBQyxNQUFNLENBQUMsTUFBTSxDQUFDLENBQUMsTUFBb0IsQ0FBQztJQUV4RSxNQUFNLEVBQUMsZUFBZSxFQUFDLEdBQUcsdUJBQXVCLENBQzdDLFNBQVMsRUFBRSxVQUFVLEVBQUUsYUFBYSxFQUFFLFlBQVksRUFBRSxjQUFjLENBQUMsQ0FBQztJQUV4RSxPQUFPLE9BQU8sQ0FBQyxjQUFjLENBQ3pCLENBQUMsZUFBZSxDQUFDLE1BQU0sQ0FBQyxFQUFFLE9BQU8sRUFBRSxJQUFJLFVBQVUsQ0FBQyxlQUFlLENBQUMsQ0FBQyxDQUFDO0FBQzFFLENBQUM7QUFFRCxNQUFNLENBQUMsTUFBTSx5QkFBeUIsR0FBaUI7SUFDckQsVUFBVSxFQUFFLG1CQUFtQjtJQUMvQixXQUFXLEVBQUUsS0FBSztJQUNsQixVQUFVLEVBQUUsbUJBQXVDO0NBQ3BELENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyIvKipcbiAqIEBsaWNlbnNlXG4gKiBDb3B5cmlnaHQgMjAyMCBHb29nbGUgTExDLiBBbGwgUmlnaHRzIFJlc2VydmVkLlxuICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlIFwiTGljZW5zZVwiKTtcbiAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS5cbiAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdFxuICpcbiAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMFxuICpcbiAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmVcbiAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuIFwiQVMgSVNcIiBCQVNJUyxcbiAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLlxuICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZFxuICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuXG4gKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuICovXG5cbmltcG9ydCB7a2VybmVsX2ltcGxzLCBLZXJuZWxDb25maWcsIEtlcm5lbEZ1bmMsIE5vbk1heFN1cHByZXNzaW9uVjMsIE5vbk1heFN1cHByZXNzaW9uVjNBdHRycywgTm9uTWF4U3VwcHJlc3Npb25WM0lucHV0cywgVGVuc29ySW5mbywgVHlwZWRBcnJheX0gZnJvbSAnQHRlbnNvcmZsb3cvdGZqcy1jb3JlJztcblxuY29uc3Qgbm9uTWF4U3VwcHJlc3Npb25WM0ltcGwgPSBrZXJuZWxfaW1wbHMubm9uTWF4U3VwcHJlc3Npb25WM0ltcGw7XG5cbmltcG9ydCB7TWF0aEJhY2tlbmRDUFV9IGZyb20gJy4uL2JhY2tlbmRfY3B1JztcbmltcG9ydCB7YXNzZXJ0Tm90Q29tcGxleH0gZnJvbSAnLi4vY3B1X3V0aWwnO1xuXG5leHBvcnQgZnVuY3Rpb24gbm9uTWF4U3VwcHJlc3Npb25WMyhhcmdzOiB7XG4gIGlucHV0czogTm9uTWF4U3VwcHJlc3Npb25WM0lucHV0cyxcbiAgYmFja2VuZDogTWF0aEJhY2tlbmRDUFUsXG4gIGF0dHJzOiBOb25NYXhTdXBwcmVzc2lvblYzQXR0cnNcbn0pOiBUZW5zb3JJbmZvIHtcbiAgY29uc3Qge2lucHV0cywgYmFja2VuZCwgYXR0cnN9ID0gYXJncztcbiAgY29uc3Qge2JveGVzLCBzY29yZXN9ID0gaW5wdXRzO1xuICBjb25zdCB7bWF4T3V0cHV0U2l6ZSwgaW91VGhyZXNob2xkLCBzY29yZVRocmVzaG9sZH0gPSBhdHRycztcblxuICBhc3NlcnROb3RDb21wbGV4KGJveGVzLCAnTm9uTWF4U3VwcHJlc3Npb24nKTtcblxuICBjb25zdCBib3hlc1ZhbHMgPSBiYWNrZW5kLmRhdGEuZ2V0KGJveGVzLmRhdGFJZCkudmFsdWVzIGFzIFR5cGVkQXJyYXk7XG4gIGNvbnN0IHNjb3Jlc1ZhbHMgPSBiYWNrZW5kLmRhdGEuZ2V0KHNjb3Jlcy5kYXRhSWQpLnZhbHVlcyBhcyBUeXBlZEFycmF5O1xuXG4gIGNvbnN0IHtzZWxlY3RlZEluZGljZXN9ID0gbm9uTWF4U3VwcHJlc3Npb25WM0ltcGwoXG4gICAgICBib3hlc1ZhbHMsIHNjb3Jlc1ZhbHMsIG1heE91dHB1dFNpemUsIGlvdVRocmVzaG9sZCwgc2NvcmVUaHJlc2hvbGQpO1xuXG4gIHJldHVybiBiYWNrZW5kLm1ha2VUZW5zb3JJbmZvKFxuICAgICAgW3NlbGVjdGVkSW5kaWNlcy5sZW5ndGhdLCAnaW50MzInLCBuZXcgSW50MzJBcnJheShzZWxlY3RlZEluZGljZXMpKTtcbn1cblxuZXhwb3J0IGNvbnN0IG5vbk1heFN1cHByZXNzaW9uVjNDb25maWc6IEtlcm5lbENvbmZpZyA9IHtcbiAga2VybmVsTmFtZTogTm9uTWF4U3VwcHJlc3Npb25WMyxcbiAgYmFja2VuZE5hbWU6ICdjcHUnLFxuICBrZXJuZWxGdW5jOiBub25NYXhTdXBwcmVzc2lvblYzIGFzIHt9IGFzIEtlcm5lbEZ1bmNcbn07XG4iXX0=","/**\n * @license\n * Copyright 2020 Google LLC. All Rights Reserved.\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n * =============================================================================\n */\nimport { kernel_impls, NonMaxSuppressionV4 } from '@tensorflow/tfjs-core';\nconst nonMaxSuppressionV4Impl = kernel_impls.nonMaxSuppressionV4Impl;\nimport { assertNotComplex } from '../cpu_util';\nexport function nonMaxSuppressionV4(args) {\n const { inputs, backend, attrs } = args;\n const { boxes, scores } = inputs;\n const { maxOutputSize, iouThreshold, scoreThreshold, padToMaxOutputSize } = attrs;\n assertNotComplex(boxes, 'NonMaxSuppressionPadded');\n const boxesVals = backend.data.get(boxes.dataId).values;\n const scoresVals = backend.data.get(scores.dataId).values;\n const { selectedIndices, validOutputs } = nonMaxSuppressionV4Impl(boxesVals, scoresVals, maxOutputSize, iouThreshold, scoreThreshold, padToMaxOutputSize);\n return [\n backend.makeTensorInfo([selectedIndices.length], 'int32', new Int32Array(selectedIndices)),\n backend.makeTensorInfo([], 'int32', new Int32Array([validOutputs]))\n ];\n}\nexport const nonMaxSuppressionV4Config = {\n kernelName: NonMaxSuppressionV4,\n backendName: 'cpu',\n kernelFunc: nonMaxSuppressionV4\n};\n//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiTm9uTWF4U3VwcHJlc3Npb25WNC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uLy4uL3RmanMtYmFja2VuZC1jcHUvc3JjL2tlcm5lbHMvTm9uTWF4U3VwcHJlc3Npb25WNC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQTs7Ozs7Ozs7Ozs7Ozs7O0dBZUc7QUFFSCxPQUFPLEVBQUMsWUFBWSxFQUE0QixtQkFBbUIsRUFBOEUsTUFBTSx1QkFBdUIsQ0FBQztBQUUvSyxNQUFNLHVCQUF1QixHQUFHLFlBQVksQ0FBQyx1QkFBdUIsQ0FBQztBQUVyRSxPQUFPLEVBQUMsZ0JBQWdCLEVBQUMsTUFBTSxhQUFhLENBQUM7QUFFN0MsTUFBTSxVQUFVLG1CQUFtQixDQUFDLElBSW5DO0lBQ0MsTUFBTSxFQUFDLE1BQU0sRUFBRSxPQUFPLEVBQUUsS0FBSyxFQUFDLEdBQUcsSUFBSSxDQUFDO0lBQ3RDLE1BQU0sRUFBQyxLQUFLLEVBQUUsTUFBTSxFQUFDLEdBQUcsTUFBTSxDQUFDO0lBQy9CLE1BQU0sRUFBQyxhQUFhLEVBQUUsWUFBWSxFQUFFLGNBQWMsRUFBRSxrQkFBa0IsRUFBQyxHQUNuRSxLQUFLLENBQUM7SUFFVixnQkFBZ0IsQ0FBQyxLQUFLLEVBQUUseUJBQXlCLENBQUMsQ0FBQztJQUVuRCxNQUFNLFNBQVMsR0FBRyxPQUFPLENBQUMsSUFBSSxDQUFDLEdBQUcsQ0FBQyxLQUFLLENBQUMsTUFBTSxDQUFDLENBQUMsTUFBb0IsQ0FBQztJQUN0RSxNQUFNLFVBQVUsR0FBRyxPQUFPLENBQUMsSUFBSSxDQUFDLEdBQUcsQ0FBQyxNQUFNLENBQUMsTUFBTSxDQUFDLENBQUMsTUFBb0IsQ0FBQztJQUV4RSxNQUFNLEVBQUMsZUFBZSxFQUFFLFlBQVksRUFBQyxHQUFHLHVCQUF1QixDQUMzRCxTQUFTLEVBQUUsVUFBVSxFQUFFLGFBQWEsRUFBRSxZQUFZLEVBQUUsY0FBYyxFQUNsRSxrQkFBa0IsQ0FBQyxDQUFDO0lBRXhCLE9BQU87UUFDTCxPQUFPLENBQUMsY0FBYyxDQUNsQixDQUFDLGVBQWUsQ0FBQyxNQUFNLENBQUMsRUFBRSxPQUFPLEVBQUUsSUFBSSxVQUFVLENBQUMsZUFBZSxDQUFDLENBQUM7UUFDdkUsT0FBTyxDQUFDLGNBQWMsQ0FBQyxFQUFFLEVBQUUsT0FBTyxFQUFFLElBQUksVUFBVSxDQUFDLENBQUMsWUFBWSxDQUFDLENBQUMsQ0FBQztLQUNwRSxDQUFDO0FBQ0osQ0FBQztBQUNELE1BQU0sQ0FBQyxNQUFNLHlCQUF5QixHQUFpQjtJQUNyRCxVQUFVLEVBQUUsbUJBQW1CO0lBQy9CLFdBQVcsRUFBRSxLQUFLO0lBQ2xCLFVBQVUsRUFBRSxtQkFBdUM7Q0FDcEQsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbIi8qKlxuICogQGxpY2Vuc2VcbiAqIENvcHlyaWdodCAyMDIwIEdvb2dsZSBMTEMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuXG4gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgXCJMaWNlbnNlXCIpO1xuICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLlxuICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0XG4gKlxuICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wXG4gKlxuICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZVxuICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gXCJBUyBJU1wiIEJBU0lTLFxuICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuXG4gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kXG4gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS5cbiAqID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4gKi9cblxuaW1wb3J0IHtrZXJuZWxfaW1wbHMsIEtlcm5lbENvbmZpZywgS2VybmVsRnVuYywgTm9uTWF4U3VwcHJlc3Npb25WNCwgTm9uTWF4U3VwcHJlc3Npb25WNEF0dHJzLCBOb25NYXhTdXBwcmVzc2lvblY0SW5wdXRzLCBUZW5zb3JJbmZvLCBUeXBlZEFycmF5fSBmcm9tICdAdGVuc29yZmxvdy90ZmpzLWNvcmUnO1xuXG5jb25zdCBub25NYXhTdXBwcmVzc2lvblY0SW1wbCA9IGtlcm5lbF9pbXBscy5ub25NYXhTdXBwcmVzc2lvblY0SW1wbDtcbmltcG9ydCB7TWF0aEJhY2tlbmRDUFV9IGZyb20gJy4uL2JhY2tlbmRfY3B1JztcbmltcG9ydCB7YXNzZXJ0Tm90Q29tcGxleH0gZnJvbSAnLi4vY3B1X3V0aWwnO1xuXG5leHBvcnQgZnVuY3Rpb24gbm9uTWF4U3VwcHJlc3Npb25WNChhcmdzOiB7XG4gIGlucHV0czogTm9uTWF4U3VwcHJlc3Npb25WNElucHV0cyxcbiAgYmFja2VuZDogTWF0aEJhY2tlbmRDUFUsXG4gIGF0dHJzOiBOb25NYXhTdXBwcmVzc2lvblY0QXR0cnNcbn0pOiBbVGVuc29ySW5mbywgVGVuc29ySW5mb10ge1xuICBjb25zdCB7aW5wdXRzLCBiYWNrZW5kLCBhdHRyc30gPSBhcmdzO1xuICBjb25zdCB7Ym94ZXMsIHNjb3Jlc30gPSBpbnB1dHM7XG4gIGNvbnN0IHttYXhPdXRwdXRTaXplLCBpb3VUaHJlc2hvbGQsIHNjb3JlVGhyZXNob2xkLCBwYWRUb01heE91dHB1dFNpemV9ID1cbiAgICAgIGF0dHJzO1xuXG4gIGFzc2VydE5vdENvbXBsZXgoYm94ZXMsICdOb25NYXhTdXBwcmVzc2lvblBhZGRlZCcpO1xuXG4gIGNvbnN0IGJveGVzVmFscyA9IGJhY2tlbmQuZGF0YS5nZXQoYm94ZXMuZGF0YUlkKS52YWx1ZXMgYXMgVHlwZWRBcnJheTtcbiAgY29uc3Qgc2NvcmVzVmFscyA9IGJhY2tlbmQuZGF0YS5nZXQoc2NvcmVzLmRhdGFJZCkudmFsdWVzIGFzIFR5cGVkQXJyYXk7XG5cbiAgY29uc3Qge3NlbGVjdGVkSW5kaWNlcywgdmFsaWRPdXRwdXRzfSA9IG5vbk1heFN1cHByZXNzaW9uVjRJbXBsKFxuICAgICAgYm94ZXNWYWxzLCBzY29yZXNWYWxzLCBtYXhPdXRwdXRTaXplLCBpb3VUaHJlc2hvbGQsIHNjb3JlVGhyZXNob2xkLFxuICAgICAgcGFkVG9NYXhPdXRwdXRTaXplKTtcblxuICByZXR1cm4gW1xuICAgIGJhY2tlbmQubWFrZVRlbnNvckluZm8oXG4gICAgICAgIFtzZWxlY3RlZEluZGljZXMubGVuZ3RoXSwgJ2ludDMyJywgbmV3IEludDMyQXJyYXkoc2VsZWN0ZWRJbmRpY2VzKSksXG4gICAgYmFja2VuZC5tYWtlVGVuc29ySW5mbyhbXSwgJ2ludDMyJywgbmV3IEludDMyQXJyYXkoW3ZhbGlkT3V0cHV0c10pKVxuICBdO1xufVxuZXhwb3J0IGNvbnN0IG5vbk1heFN1cHByZXNzaW9uVjRDb25maWc6IEtlcm5lbENvbmZpZyA9IHtcbiAga2VybmVsTmFtZTogTm9uTWF4U3VwcHJlc3Npb25WNCxcbiAgYmFja2VuZE5hbWU6ICdjcHUnLFxuICBrZXJuZWxGdW5jOiBub25NYXhTdXBwcmVzc2lvblY0IGFzIHt9IGFzIEtlcm5lbEZ1bmNcbn07XG4iXX0=","/**\n * @license\n * Copyright 2019 Google LLC. All Rights Reserved.\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n * =============================================================================\n */\nimport { kernel_impls, NonMaxSuppressionV5 } from '@tensorflow/tfjs-core';\nconst nonMaxSuppressionV5Impl = kernel_impls.nonMaxSuppressionV5Impl;\nimport { assertNotComplex } from '../cpu_util';\nexport function nonMaxSuppressionV5(args) {\n const { inputs, backend, attrs } = args;\n const { boxes, scores } = inputs;\n const { maxOutputSize, iouThreshold, scoreThreshold, softNmsSigma } = attrs;\n assertNotComplex(boxes, 'NonMaxSuppressionWithScore');\n const boxesVals = backend.data.get(boxes.dataId).values;\n const scoresVals = backend.data.get(scores.dataId).values;\n const maxOutputSizeVal = maxOutputSize;\n const iouThresholdVal = iouThreshold;\n const scoreThresholdVal = scoreThreshold;\n const softNmsSigmaVal = softNmsSigma;\n const { selectedIndices, selectedScores } = nonMaxSuppressionV5Impl(boxesVals, scoresVals, maxOutputSizeVal, iouThresholdVal, scoreThresholdVal, softNmsSigmaVal);\n return [\n backend.makeTensorInfo([selectedIndices.length], 'int32', new Int32Array(selectedIndices)),\n backend.makeTensorInfo([selectedScores.length], 'float32', new Float32Array(selectedScores))\n ];\n}\nexport const nonMaxSuppressionV5Config = {\n kernelName: NonMaxSuppressionV5,\n backendName: 'cpu',\n kernelFunc: nonMaxSuppressionV5\n};\n//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiTm9uTWF4U3VwcHJlc3Npb25WNS5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uLy4uL3RmanMtYmFja2VuZC1jcHUvc3JjL2tlcm5lbHMvTm9uTWF4U3VwcHJlc3Npb25WNS50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQTs7Ozs7Ozs7Ozs7Ozs7O0dBZUc7QUFFSCxPQUFPLEVBQUMsWUFBWSxFQUE0QixtQkFBbUIsRUFBOEUsTUFBTSx1QkFBdUIsQ0FBQztBQUUvSyxNQUFNLHVCQUF1QixHQUFHLFlBQVksQ0FBQyx1QkFBdUIsQ0FBQztBQUVyRSxPQUFPLEVBQUMsZ0JBQWdCLEVBQUMsTUFBTSxhQUFhLENBQUM7QUFFN0MsTUFBTSxVQUFVLG1CQUFtQixDQUFDLElBSW5DO0lBQ0MsTUFBTSxFQUFDLE1BQU0sRUFBRSxPQUFPLEVBQUUsS0FBSyxFQUFDLEdBQUcsSUFBSSxDQUFDO0lBQ3RDLE1BQU0sRUFBQyxLQUFLLEVBQUUsTUFBTSxFQUFDLEdBQUcsTUFBTSxDQUFDO0lBQy9CLE1BQU0sRUFBQyxhQUFhLEVBQUUsWUFBWSxFQUFFLGNBQWMsRUFBRSxZQUFZLEVBQUMsR0FBRyxLQUFLLENBQUM7SUFFMUUsZ0JBQWdCLENBQUMsS0FBSyxFQUFFLDRCQUE0QixDQUFDLENBQUM7SUFFdEQsTUFBTSxTQUFTLEdBQUcsT0FBTyxDQUFDLElBQUksQ0FBQyxHQUFHLENBQUMsS0FBSyxDQUFDLE1BQU0sQ0FBQyxDQUFDLE1BQW9CLENBQUM7SUFDdEUsTUFBTSxVQUFVLEdBQUcsT0FBTyxDQUFDLElBQUksQ0FBQyxHQUFHLENBQUMsTUFBTSxDQUFDLE1BQU0sQ0FBQyxDQUFDLE1BQW9CLENBQUM7SUFFeEUsTUFBTSxnQkFBZ0IsR0FBRyxhQUFhLENBQUM7SUFDdkMsTUFBTSxlQUFlLEdBQUcsWUFBWSxDQUFDO0lBQ3JDLE1BQU0saUJBQWlCLEdBQUcsY0FBYyxDQUFDO0lBQ3pDLE1BQU0sZUFBZSxHQUFHLFlBQVksQ0FBQztJQUVyQyxNQUFNLEVBQUMsZUFBZSxFQUFFLGNBQWMsRUFBQyxHQUFHLHVCQUF1QixDQUM3RCxTQUFTLEVBQUUsVUFBVSxFQUFFLGdCQUFnQixFQUFFLGVBQWUsRUFDeEQsaUJBQWlCLEVBQUUsZUFBZSxDQUFDLENBQUM7SUFFeEMsT0FBTztRQUNMLE9BQU8sQ0FBQyxjQUFjLENBQ2xCLENBQUMsZUFBZSxDQUFDLE1BQU0sQ0FBQyxFQUFFLE9BQU8sRUFBRSxJQUFJLFVBQVUsQ0FBQyxlQUFlLENBQUMsQ0FBQztRQUN2RSxPQUFPLENBQUMsY0FBYyxDQUNsQixDQUFDLGNBQWMsQ0FBQyxNQUFNLENBQUMsRUFBRSxTQUFTLEVBQUUsSUFBSSxZQUFZLENBQUMsY0FBYyxDQUFDLENBQUM7S0FDMUUsQ0FBQztBQUNKLENBQUM7QUFFRCxNQUFNLENBQUMsTUFBTSx5QkFBeUIsR0FBaUI7SUFDckQsVUFBVSxFQUFFLG1CQUFtQjtJQUMvQixXQUFXLEVBQUUsS0FBSztJQUNsQixVQUFVLEVBQUUsbUJBQXVDO0NBQ3BELENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyIvKipcbiAqIEBsaWNlbnNlXG4gKiBDb3B5cmlnaHQgMjAxOSBHb29nbGUgTExDLiBBbGwgUmlnaHRzIFJlc2VydmVkLlxuICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlIFwiTGljZW5zZVwiKTtcbiAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS5cbiAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdFxuICpcbiAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMFxuICpcbiAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmVcbiAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuIFwiQVMgSVNcIiBCQVNJUyxcbiAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLlxuICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZFxuICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuXG4gKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuICovXG5cbmltcG9ydCB7a2VybmVsX2ltcGxzLCBLZXJuZWxDb25maWcsIEtlcm5lbEZ1bmMsIE5vbk1heFN1cHByZXNzaW9uVjUsIE5vbk1heFN1cHByZXNzaW9uVjVBdHRycywgTm9uTWF4U3VwcHJlc3Npb25WNUlucHV0cywgVGVuc29ySW5mbywgVHlwZWRBcnJheX0gZnJvbSAnQHRlbnNvcmZsb3cvdGZqcy1jb3JlJztcblxuY29uc3Qgbm9uTWF4U3VwcHJlc3Npb25WNUltcGwgPSBrZXJuZWxfaW1wbHMubm9uTWF4U3VwcHJlc3Npb25WNUltcGw7XG5pbXBvcnQge01hdGhCYWNrZW5kQ1BVfSBmcm9tICcuLi9iYWNrZW5kX2NwdSc7XG5pbXBvcnQge2Fzc2VydE5vdENvbXBsZXh9IGZyb20gJy4uL2NwdV91dGlsJztcblxuZXhwb3J0IGZ1bmN0aW9uIG5vbk1heFN1cHByZXNzaW9uVjUoYXJnczoge1xuICBpbnB1dHM6IE5vbk1heFN1cHByZXNzaW9uVjVJbnB1dHMsXG4gIGJhY2tlbmQ6IE1hdGhCYWNrZW5kQ1BVLFxuICBhdHRyczogTm9uTWF4U3VwcHJlc3Npb25WNUF0dHJzXG59KTogW1RlbnNvckluZm8sIFRlbnNvckluZm9dIHtcbiAgY29uc3Qge2lucHV0cywgYmFja2VuZCwgYXR0cnN9ID0gYXJncztcbiAgY29uc3Qge2JveGVzLCBzY29yZXN9ID0gaW5wdXRzO1xuICBjb25zdCB7bWF4T3V0cHV0U2l6ZSwgaW91VGhyZXNob2xkLCBzY29yZVRocmVzaG9sZCwgc29mdE5tc1NpZ21hfSA9IGF0dHJzO1xuXG4gIGFzc2VydE5vdENvbXBsZXgoYm94ZXMsICdOb25NYXhTdXBwcmVzc2lvbldpdGhTY29yZScpO1xuXG4gIGNvbnN0IGJveGVzVmFscyA9IGJhY2tlbmQuZGF0YS5nZXQoYm94ZXMuZGF0YUlkKS52YWx1ZXMgYXMgVHlwZWRBcnJheTtcbiAgY29uc3Qgc2NvcmVzVmFscyA9IGJhY2tlbmQuZGF0YS5nZXQoc2NvcmVzLmRhdGFJZCkudmFsdWVzIGFzIFR5cGVkQXJyYXk7XG5cbiAgY29uc3QgbWF4T3V0cHV0U2l6ZVZhbCA9IG1heE91dHB1dFNpemU7XG4gIGNvbnN0IGlvdVRocmVzaG9sZFZhbCA9IGlvdVRocmVzaG9sZDtcbiAgY29uc3Qgc2NvcmVUaHJlc2hvbGRWYWwgPSBzY29yZVRocmVzaG9sZDtcbiAgY29uc3Qgc29mdE5tc1NpZ21hVmFsID0gc29mdE5tc1NpZ21hO1xuXG4gIGNvbnN0IHtzZWxlY3RlZEluZGljZXMsIHNlbGVjdGVkU2NvcmVzfSA9IG5vbk1heFN1cHByZXNzaW9uVjVJbXBsKFxuICAgICAgYm94ZXNWYWxzLCBzY29yZXNWYWxzLCBtYXhPdXRwdXRTaXplVmFsLCBpb3VUaHJlc2hvbGRWYWwsXG4gICAgICBzY29yZVRocmVzaG9sZFZhbCwgc29mdE5tc1NpZ21hVmFsKTtcblxuICByZXR1cm4gW1xuICAgIGJhY2tlbmQubWFrZVRlbnNvckluZm8oXG4gICAgICAgIFtzZWxlY3RlZEluZGljZXMubGVuZ3RoXSwgJ2ludDMyJywgbmV3IEludDMyQXJyYXkoc2VsZWN0ZWRJbmRpY2VzKSksXG4gICAgYmFja2VuZC5tYWtlVGVuc29ySW5mbyhcbiAgICAgICAgW3NlbGVjdGVkU2NvcmVzLmxlbmd0aF0sICdmbG9hdDMyJywgbmV3IEZsb2F0MzJBcnJheShzZWxlY3RlZFNjb3JlcykpXG4gIF07XG59XG5cbmV4cG9ydCBjb25zdCBub25NYXhTdXBwcmVzc2lvblY1Q29uZmlnOiBLZXJuZWxDb25maWcgPSB7XG4gIGtlcm5lbE5hbWU6IE5vbk1heFN1cHByZXNzaW9uVjUsXG4gIGJhY2tlbmROYW1lOiAnY3B1JyxcbiAga2VybmVsRnVuYzogbm9uTWF4U3VwcHJlc3Npb25WNSBhcyB7fSBhcyBLZXJuZWxGdW5jXG59O1xuIl19","/**\n * @license\n * Copyright 2020 Google LLC. All Rights Reserved.\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n * =============================================================================\n */\nimport { NotEqual } from '@tensorflow/tfjs-core';\nimport { createSimpleBinaryKernelImpl } from '../utils/binary_impl';\nimport { binaryKernelFunc } from '../utils/binary_utils';\nexport const notEqualImpl = createSimpleBinaryKernelImpl(((a, b) => (a !== b) ? 1 : 0));\nexport const notEqual = binaryKernelFunc(NotEqual, notEqualImpl, null /* complexOp */, 'bool');\nexport const notEqualConfig = {\n kernelName: NotEqual,\n backendName: 'cpu',\n kernelFunc: notEqual\n};\n//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiTm90RXF1YWwuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi8uLi90ZmpzLWJhY2tlbmQtY3B1L3NyYy9rZXJuZWxzL05vdEVxdWFsLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBOzs7Ozs7Ozs7Ozs7Ozs7R0FlRztBQUVILE9BQU8sRUFBZSxRQUFRLEVBQUMsTUFBTSx1QkFBdUIsQ0FBQztBQUU3RCxPQUFPLEVBQUMsNEJBQTRCLEVBQUMsTUFBTSxzQkFBc0IsQ0FBQztBQUNsRSxPQUFPLEVBQUMsZ0JBQWdCLEVBQUMsTUFBTSx1QkFBdUIsQ0FBQztBQUV2RCxNQUFNLENBQUMsTUFBTSxZQUFZLEdBQ3JCLDRCQUE0QixDQUFDLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxFQUFFLEVBQUUsQ0FBQyxDQUFDLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDO0FBQ2hFLE1BQU0sQ0FBQyxNQUFNLFFBQVEsR0FDakIsZ0JBQWdCLENBQUMsUUFBUSxFQUFFLFlBQVksRUFBRSxJQUFJLENBQUMsZUFBZSxFQUFFLE1BQU0sQ0FBQyxDQUFDO0FBRTNFLE1BQU0sQ0FBQyxNQUFNLGNBQWMsR0FBaUI7SUFDMUMsVUFBVSxFQUFFLFFBQVE7SUFDcEIsV0FBVyxFQUFFLEtBQUs7SUFDbEIsVUFBVSxFQUFFLFFBQVE7Q0FDckIsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbIi8qKlxuICogQGxpY2Vuc2VcbiAqIENvcHlyaWdodCAyMDIwIEdvb2dsZSBMTEMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuXG4gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgXCJMaWNlbnNlXCIpO1xuICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLlxuICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0XG4gKlxuICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wXG4gKlxuICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZVxuICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gXCJBUyBJU1wiIEJBU0lTLFxuICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuXG4gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kXG4gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS5cbiAqID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4gKi9cblxuaW1wb3J0IHtLZXJuZWxDb25maWcsIE5vdEVxdWFsfSBmcm9tICdAdGVuc29yZmxvdy90ZmpzLWNvcmUnO1xuXG5pbXBvcnQge2NyZWF0ZVNpbXBsZUJpbmFyeUtlcm5lbEltcGx9IGZyb20gJy4uL3V0aWxzL2JpbmFyeV9pbXBsJztcbmltcG9ydCB7YmluYXJ5S2VybmVsRnVuY30gZnJvbSAnLi4vdXRpbHMvYmluYXJ5X3V0aWxzJztcblxuZXhwb3J0IGNvbnN0IG5vdEVxdWFsSW1wbCA9XG4gICAgY3JlYXRlU2ltcGxlQmluYXJ5S2VybmVsSW1wbCgoKGEsIGIpID0+IChhICE9PSBiKSA/IDEgOiAwKSk7XG5leHBvcnQgY29uc3Qgbm90RXF1YWwgPVxuICAgIGJpbmFyeUtlcm5lbEZ1bmMoTm90RXF1YWwsIG5vdEVxdWFsSW1wbCwgbnVsbCAvKiBjb21wbGV4T3AgKi8sICdib29sJyk7XG5cbmV4cG9ydCBjb25zdCBub3RFcXVhbENvbmZpZzogS2VybmVsQ29uZmlnID0ge1xuICBrZXJuZWxOYW1lOiBOb3RFcXVhbCxcbiAgYmFja2VuZE5hbWU6ICdjcHUnLFxuICBrZXJuZWxGdW5jOiBub3RFcXVhbFxufTtcbiJdfQ==","/**\n * @license\n * Copyright 2020 Google LLC. All Rights Reserved.\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n * =============================================================================\n */\nimport { OneHot, util } from '@tensorflow/tfjs-core';\nimport { assertNotComplex } from '../cpu_util';\nexport function oneHot(args) {\n const { inputs, backend, attrs } = args;\n const { indices } = inputs;\n const { dtype, depth, onValue, offValue } = attrs;\n assertNotComplex(indices, 'oneHot');\n const indicesSize = util.sizeFromShape(indices.shape);\n const res = new Float32Array(indicesSize * depth);\n res.fill(offValue);\n const indicesVal = backend.data.get(indices.dataId).values;\n for (let event = 0; event < indicesSize; ++event) {\n if (indicesVal[event] >= 0 && indicesVal[event] < depth) {\n res[event * depth + indicesVal[event]] = onValue;\n }\n }\n return backend.makeTensorInfo([...indices.shape, depth], dtype, res);\n}\nexport const oneHotConfig = {\n kernelName: OneHot,\n backendName: 'cpu',\n kernelFunc: oneHot\n};\n//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiT25lSG90LmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vLi4vdGZqcy1iYWNrZW5kLWNwdS9zcmMva2VybmVscy9PbmVIb3QudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUE7Ozs7Ozs7Ozs7Ozs7OztHQWVHO0FBRUgsT0FBTyxFQUEyQixNQUFNLEVBQXFELElBQUksRUFBQyxNQUFNLHVCQUF1QixDQUFDO0FBR2hJLE9BQU8sRUFBQyxnQkFBZ0IsRUFBQyxNQUFNLGFBQWEsQ0FBQztBQUU3QyxNQUFNLFVBQVUsTUFBTSxDQUNsQixJQUF5RTtJQUUzRSxNQUFNLEVBQUMsTUFBTSxFQUFFLE9BQU8sRUFBRSxLQUFLLEVBQUMsR0FBRyxJQUFJLENBQUM7SUFDdEMsTUFBTSxFQUFDLE9BQU8sRUFBQyxHQUFHLE1BQU0sQ0FBQztJQUN6QixNQUFNLEVBQUMsS0FBSyxFQUFFLEtBQUssRUFBRSxPQUFPLEVBQUUsUUFBUSxFQUFDLEdBQUcsS0FBSyxDQUFDO0lBRWhELGdCQUFnQixDQUFDLE9BQU8sRUFBRSxRQUFRLENBQUMsQ0FBQztJQUVwQyxNQUFNLFdBQVcsR0FBRyxJQUFJLENBQUMsYUFBYSxDQUFDLE9BQU8sQ0FBQyxLQUFLLENBQUMsQ0FBQztJQUV0RCxNQUFNLEdBQUcsR0FBRyxJQUFJLFlBQVksQ0FBQyxXQUFXLEdBQUcsS0FBSyxDQUFDLENBQUM7SUFDbEQsR0FBRyxDQUFDLElBQUksQ0FBQyxRQUFRLENBQUMsQ0FBQztJQUNuQixNQUFNLFVBQVUsR0FBRyxPQUFPLENBQUMsSUFBSSxDQUFDLEdBQUcsQ0FBQyxPQUFPLENBQUMsTUFBTSxDQUFDLENBQUMsTUFBb0IsQ0FBQztJQUV6RSxLQUFLLElBQUksS0FBSyxHQUFHLENBQUMsRUFBRSxLQUFLLEdBQUcsV0FBVyxFQUFFLEVBQUUsS0FBSyxFQUFFO1FBQ2hELElBQUksVUFBVSxDQUFDLEtBQUssQ0FBQyxJQUFJLENBQUMsSUFBSSxVQUFVLENBQUMsS0FBSyxDQUFDLEdBQUcsS0FBSyxFQUFFO1lBQ3ZELEdBQUcsQ0FBQyxLQUFLLEdBQUcsS0FBSyxHQUFHLFVBQVUsQ0FBQyxLQUFLLENBQUMsQ0FBQyxHQUFHLE9BQU8sQ0FBQztTQUNsRDtLQUNGO0lBRUQsT0FBTyxPQUFPLENBQUMsY0FBYyxDQUFDLENBQUMsR0FBRyxPQUFPLENBQUMsS0FBSyxFQUFFLEtBQUssQ0FBQyxFQUFFLEtBQUssRUFBRSxHQUFHLENBQUMsQ0FBQztBQUN2RSxDQUFDO0FBRUQsTUFBTSxDQUFDLE1BQU0sWUFBWSxHQUFpQjtJQUN4QyxVQUFVLEVBQUUsTUFBTTtJQUNsQixXQUFXLEVBQUUsS0FBSztJQUNsQixVQUFVLEVBQUUsTUFBMEI7Q0FDdkMsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbIi8qKlxuICogQGxpY2Vuc2VcbiAqIENvcHlyaWdodCAyMDIwIEdvb2dsZSBMTEMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuXG4gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgXCJMaWNlbnNlXCIpO1xuICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLlxuICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0XG4gKlxuICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wXG4gKlxuICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZVxuICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gXCJBUyBJU1wiIEJBU0lTLFxuICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuXG4gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kXG4gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS5cbiAqID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4gKi9cblxuaW1wb3J0IHtLZXJuZWxDb25maWcsIEtlcm5lbEZ1bmMsIE9uZUhvdCwgT25lSG90QXR0cnMsIE9uZUhvdElucHV0cywgVGVuc29ySW5mbywgVHlwZWRBcnJheSwgdXRpbH0gZnJvbSAnQHRlbnNvcmZsb3cvdGZqcy1jb3JlJztcblxuaW1wb3J0IHtNYXRoQmFja2VuZENQVX0gZnJvbSAnLi4vYmFja2VuZF9jcHUnO1xuaW1wb3J0IHthc3NlcnROb3RDb21wbGV4fSBmcm9tICcuLi9jcHVfdXRpbCc7XG5cbmV4cG9ydCBmdW5jdGlvbiBvbmVIb3QoXG4gICAgYXJnczoge2lucHV0czogT25lSG90SW5wdXRzLCBiYWNrZW5kOiBNYXRoQmFja2VuZENQVSwgYXR0cnM6IE9uZUhvdEF0dHJzfSk6XG4gICAgVGVuc29ySW5mbyB7XG4gIGNvbnN0IHtpbnB1dHMsIGJhY2tlbmQsIGF0dHJzfSA9IGFyZ3M7XG4gIGNvbnN0IHtpbmRpY2VzfSA9IGlucHV0cztcbiAgY29uc3Qge2R0eXBlLCBkZXB0aCwgb25WYWx1ZSwgb2ZmVmFsdWV9ID0gYXR0cnM7XG5cbiAgYXNzZXJ0Tm90Q29tcGxleChpbmRpY2VzLCAnb25lSG90Jyk7XG5cbiAgY29uc3QgaW5kaWNlc1NpemUgPSB1dGlsLnNpemVGcm9tU2hhcGUoaW5kaWNlcy5zaGFwZSk7XG5cbiAgY29uc3QgcmVzID0gbmV3IEZsb2F0MzJBcnJheShpbmRpY2VzU2l6ZSAqIGRlcHRoKTtcbiAgcmVzLmZpbGwob2ZmVmFsdWUpO1xuICBjb25zdCBpbmRpY2VzVmFsID0gYmFja2VuZC5kYXRhLmdldChpbmRpY2VzLmRhdGFJZCkudmFsdWVzIGFzIFR5cGVkQXJyYXk7XG5cbiAgZm9yIChsZXQgZXZlbnQgPSAwOyBldmVudCA8IGluZGljZXNTaXplOyArK2V2ZW50KSB7XG4gICAgaWYgKGluZGljZXNWYWxbZXZlbnRdID49IDAgJiYgaW5kaWNlc1ZhbFtldmVudF0gPCBkZXB0aCkge1xuICAgICAgcmVzW2V2ZW50ICogZGVwdGggKyBpbmRpY2VzVmFsW2V2ZW50XV0gPSBvblZhbHVlO1xuICAgIH1cbiAgfVxuXG4gIHJldHVybiBiYWNrZW5kLm1ha2VUZW5zb3JJbmZvKFsuLi5pbmRpY2VzLnNoYXBlLCBkZXB0aF0sIGR0eXBlLCByZXMpO1xufVxuXG5leHBvcnQgY29uc3Qgb25lSG90Q29uZmlnOiBLZXJuZWxDb25maWcgPSB7XG4gIGtlcm5lbE5hbWU6IE9uZUhvdCxcbiAgYmFja2VuZE5hbWU6ICdjcHUnLFxuICBrZXJuZWxGdW5jOiBvbmVIb3QgYXMge30gYXMgS2VybmVsRnVuY1xufTtcbiJdfQ==","/**\n * @license\n * Copyright 2020 Google LLC. All Rights Reserved.\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n * =============================================================================\n */\nimport { ZerosLike } from '@tensorflow/tfjs-core';\nimport { complex } from './Complex';\nimport { fill } from './Fill';\nimport { imag } from './Imag';\nimport { real } from './Real';\nexport function zerosLike(args) {\n const { inputs, backend } = args;\n const { x } = inputs;\n if (x.dtype === 'string') {\n throw new Error('zerosLike is not supported for string tensors');\n }\n else if (x.dtype === 'complex64') {\n const realPart = real({ inputs: { input: x }, backend });\n const r = zerosLike({ inputs: { x: realPart }, backend });\n const imagPart = imag({ inputs: { input: x }, backend });\n const i = zerosLike({ inputs: { x: imagPart }, backend });\n const result = complex({ inputs: { real: r, imag: i }, backend });\n backend.disposeIntermediateTensorInfo(realPart);\n backend.disposeIntermediateTensorInfo(r);\n backend.disposeIntermediateTensorInfo(imagPart);\n backend.disposeIntermediateTensorInfo(i);\n return result;\n }\n else {\n return fill({ backend, attrs: { shape: x.shape, value: 0, dtype: x.dtype } });\n }\n}\nexport const zerosLikeConfig = {\n kernelName: ZerosLike,\n backendName: 'cpu',\n kernelFunc: zerosLike\n};\n//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiWmVyb3NMaWtlLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vLi4vdGZqcy1iYWNrZW5kLWNwdS9zcmMva2VybmVscy9aZXJvc0xpa2UudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUE7Ozs7Ozs7Ozs7Ozs7OztHQWVHO0FBRUgsT0FBTyxFQUF1QyxTQUFTLEVBQWtCLE1BQU0sdUJBQXVCLENBQUM7QUFJdkcsT0FBTyxFQUFDLE9BQU8sRUFBQyxNQUFNLFdBQVcsQ0FBQztBQUNsQyxPQUFPLEVBQUMsSUFBSSxFQUFDLE1BQU0sUUFBUSxDQUFDO0FBQzVCLE9BQU8sRUFBQyxJQUFJLEVBQUMsTUFBTSxRQUFRLENBQUM7QUFDNUIsT0FBTyxFQUFDLElBQUksRUFBQyxNQUFNLFFBQVEsQ0FBQztBQUU1QixNQUFNLFVBQVUsU0FBUyxDQUNyQixJQUF3RDtJQUMxRCxNQUFNLEVBQUMsTUFBTSxFQUFFLE9BQU8sRUFBQyxHQUFHLElBQUksQ0FBQztJQUMvQixNQUFNLEVBQUMsQ0FBQyxFQUFDLEdBQUcsTUFBTSxDQUFDO0lBRW5CLElBQUksQ0FBQyxDQUFDLEtBQUssS0FBSyxRQUFRLEVBQUU7UUFDeEIsTUFBTSxJQUFJLEtBQUssQ0FBQywrQ0FBK0MsQ0FBQyxDQUFDO0tBQ2xFO1NBQU0sSUFBSSxDQUFDLENBQUMsS0FBSyxLQUFLLFdBQVcsRUFBRTtRQUNsQyxNQUFNLFFBQVEsR0FBRyxJQUFJLENBQUMsRUFBQyxNQUFNLEVBQUUsRUFBQyxLQUFLLEVBQUUsQ0FBQyxFQUFDLEVBQUUsT0FBTyxFQUFDLENBQUMsQ0FBQztRQUNyRCxNQUFNLENBQUMsR0FBRyxTQUFTLENBQUMsRUFBQyxNQUFNLEVBQUUsRUFBQyxDQUFDLEVBQUUsUUFBUSxFQUFDLEVBQUUsT0FBTyxFQUFDLENBQUMsQ0FBQztRQUN0RCxNQUFNLFFBQVEsR0FBRyxJQUFJLENBQUMsRUFBQyxNQUFNLEVBQUUsRUFBQyxLQUFLLEVBQUUsQ0FBQyxFQUFDLEVBQUUsT0FBTyxFQUFDLENBQUMsQ0FBQztRQUNyRCxNQUFNLENBQUMsR0FBRyxTQUFTLENBQUMsRUFBQyxNQUFNLEVBQUUsRUFBQyxDQUFDLEVBQUUsUUFBUSxFQUFDLEVBQUUsT0FBTyxFQUFDLENBQUMsQ0FBQztRQUV0RCxNQUFNLE1BQU0sR0FBRyxPQUFPLENBQUMsRUFBQyxNQUFNLEVBQUUsRUFBQyxJQUFJLEVBQUUsQ0FBQyxFQUFFLElBQUksRUFBRSxDQUFDLEVBQUMsRUFBRSxPQUFPLEVBQUMsQ0FBQyxDQUFDO1FBRTlELE9BQU8sQ0FBQyw2QkFBNkIsQ0FBQyxRQUFRLENBQUMsQ0FBQztRQUNoRCxPQUFPLENBQUMsNkJBQTZCLENBQUMsQ0FBQyxDQUFDLENBQUM7UUFDekMsT0FBTyxDQUFDLDZCQUE2QixDQUFDLFFBQVEsQ0FBQyxDQUFDO1FBQ2hELE9BQU8sQ0FBQyw2QkFBNkIsQ0FBQyxDQUFDLENBQUMsQ0FBQztRQUV6QyxPQUFPLE1BQU0sQ0FBQztLQUNmO1NBQU07UUFDTCxPQUFPLElBQUksQ0FBQyxFQUFDLE9BQU8sRUFBRSxLQUFLLEVBQUUsRUFBQyxLQUFLLEVBQUUsQ0FBQyxDQUFDLEtBQUssRUFBRSxLQUFLLEVBQUUsQ0FBQyxFQUFFLEtBQUssRUFBRSxDQUFDLENBQUMsS0FBSyxFQUFDLEVBQUMsQ0FBQyxDQUFDO0tBQzNFO0FBQ0gsQ0FBQztBQUVELE1BQU0sQ0FBQyxNQUFNLGVBQWUsR0FBaUI7SUFDM0MsVUFBVSxFQUFFLFNBQVM7SUFDckIsV0FBVyxFQUFFLEtBQUs7SUFDbEIsVUFBVSxFQUFFLFNBQTZCO0NBQzFDLENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyIvKipcbiAqIEBsaWNlbnNlXG4gKiBDb3B5cmlnaHQgMjAyMCBHb29nbGUgTExDLiBBbGwgUmlnaHRzIFJlc2VydmVkLlxuICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlIFwiTGljZW5zZVwiKTtcbiAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS5cbiAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdFxuICpcbiAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMFxuICpcbiAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmVcbiAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuIFwiQVMgSVNcIiBCQVNJUyxcbiAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLlxuICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZFxuICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuXG4gKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuICovXG5cbmltcG9ydCB7S2VybmVsQ29uZmlnLCBLZXJuZWxGdW5jLCBUZW5zb3JJbmZvLCBaZXJvc0xpa2UsIFplcm9zTGlrZUlucHV0c30gZnJvbSAnQHRlbnNvcmZsb3cvdGZqcy1jb3JlJztcblxuaW1wb3J0IHtNYXRoQmFja2VuZENQVX0gZnJvbSAnLi4vYmFja2VuZF9jcHUnO1xuXG5pbXBvcnQge2NvbXBsZXh9IGZyb20gJy4vQ29tcGxleCc7XG5pbXBvcnQge2ZpbGx9IGZyb20gJy4vRmlsbCc7XG5pbXBvcnQge2ltYWd9IGZyb20gJy4vSW1hZyc7XG5pbXBvcnQge3JlYWx9IGZyb20gJy4vUmVhbCc7XG5cbmV4cG9ydCBmdW5jdGlvbiB6ZXJvc0xpa2UoXG4gICAgYXJnczoge2lucHV0czogWmVyb3NMaWtlSW5wdXRzLCBiYWNrZW5kOiBNYXRoQmFja2VuZENQVX0pOiBUZW5zb3JJbmZvIHtcbiAgY29uc3Qge2lucHV0cywgYmFja2VuZH0gPSBhcmdzO1xuICBjb25zdCB7eH0gPSBpbnB1dHM7XG5cbiAgaWYgKHguZHR5cGUgPT09ICdzdHJpbmcnKSB7XG4gICAgdGhyb3cgbmV3IEVycm9yKCd6ZXJvc0xpa2UgaXMgbm90IHN1cHBvcnRlZCBmb3Igc3RyaW5nIHRlbnNvcnMnKTtcbiAgfSBlbHNlIGlmICh4LmR0eXBlID09PSAnY29tcGxleDY0Jykge1xuICAgIGNvbnN0IHJlYWxQYXJ0ID0gcmVhbCh7aW5wdXRzOiB7aW5wdXQ6IHh9LCBiYWNrZW5kfSk7XG4gICAgY29uc3QgciA9IHplcm9zTGlrZSh7aW5wdXRzOiB7eDogcmVhbFBhcnR9LCBiYWNrZW5kfSk7XG4gICAgY29uc3QgaW1hZ1BhcnQgPSBpbWFnKHtpbnB1dHM6IHtpbnB1dDogeH0sIGJhY2tlbmR9KTtcbiAgICBjb25zdCBpID0gemVyb3NMaWtlKHtpbnB1dHM6IHt4OiBpbWFnUGFydH0sIGJhY2tlbmR9KTtcblxuICAgIGNvbnN0IHJlc3VsdCA9IGNvbXBsZXgoe2lucHV0czoge3JlYWw6IHIsIGltYWc6IGl9LCBiYWNrZW5kfSk7XG5cbiAgICBiYWNrZW5kLmRpc3Bvc2VJbnRlcm1lZGlhdGVUZW5zb3JJbmZvKHJlYWxQYXJ0KTtcbiAgICBiYWNrZW5kLmRpc3Bvc2VJbnRlcm1lZGlhdGVUZW5zb3JJbmZvKHIpO1xuICAgIGJhY2tlbmQuZGlzcG9zZUludGVybWVkaWF0ZVRlbnNvckluZm8oaW1hZ1BhcnQpO1xuICAgIGJhY2tlbmQuZGlzcG9zZUludGVybWVkaWF0ZVRlbnNvckluZm8oaSk7XG5cbiAgICByZXR1cm4gcmVzdWx0O1xuICB9IGVsc2Uge1xuICAgIHJldHVybiBmaWxsKHtiYWNrZW5kLCBhdHRyczoge3NoYXBlOiB4LnNoYXBlLCB2YWx1ZTogMCwgZHR5cGU6IHguZHR5cGV9fSk7XG4gIH1cbn1cblxuZXhwb3J0IGNvbnN0IHplcm9zTGlrZUNvbmZpZzogS2VybmVsQ29uZmlnID0ge1xuICBrZXJuZWxOYW1lOiBaZXJvc0xpa2UsXG4gIGJhY2tlbmROYW1lOiAnY3B1JyxcbiAga2VybmVsRnVuYzogemVyb3NMaWtlIGFzIHt9IGFzIEtlcm5lbEZ1bmNcbn07XG4iXX0=","/**\n * @license\n * Copyright 2020 Google LLC. All Rights Reserved.\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n * =============================================================================\n */\nimport { OnesLike } from '@tensorflow/tfjs-core';\nimport { complex } from './Complex';\nimport { fill } from './Fill';\nimport { imag } from './Imag';\nimport { real } from './Real';\nimport { zerosLike } from './ZerosLike';\nexport function onesLike(args) {\n const { inputs, backend } = args;\n const { x } = inputs;\n if (x.dtype === 'string') {\n throw new Error('onesLike is not supported for string tensors');\n }\n else if (x.dtype === 'complex64') {\n const realPart = real({ inputs: { input: x }, backend });\n const r = onesLike({ inputs: { x: realPart }, backend });\n const imagPart = imag({ inputs: { input: x }, backend });\n const i = zerosLike({ inputs: { x: imagPart }, backend });\n const result = complex({ inputs: { real: r, imag: i }, backend });\n backend.disposeIntermediateTensorInfo(realPart);\n backend.disposeIntermediateTensorInfo(r);\n backend.disposeIntermediateTensorInfo(imagPart);\n backend.disposeIntermediateTensorInfo(i);\n return result;\n }\n else {\n return fill({ backend, attrs: { shape: x.shape, value: 1, dtype: x.dtype } });\n }\n}\nexport const onesLikeConfig = {\n kernelName: OnesLike,\n backendName: 'cpu',\n kernelFunc: onesLike\n};\n//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiT25lc0xpa2UuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi8uLi90ZmpzLWJhY2tlbmQtY3B1L3NyYy9rZXJuZWxzL09uZXNMaWtlLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBOzs7Ozs7Ozs7Ozs7Ozs7R0FlRztBQUVILE9BQU8sRUFBMkIsUUFBUSxFQUE2QixNQUFNLHVCQUF1QixDQUFDO0FBR3JHLE9BQU8sRUFBQyxPQUFPLEVBQUMsTUFBTSxXQUFXLENBQUM7QUFDbEMsT0FBTyxFQUFDLElBQUksRUFBQyxNQUFNLFFBQVEsQ0FBQztBQUM1QixPQUFPLEVBQUMsSUFBSSxFQUFDLE1BQU0sUUFBUSxDQUFDO0FBQzVCLE9BQU8sRUFBQyxJQUFJLEVBQUMsTUFBTSxRQUFRLENBQUM7QUFDNUIsT0FBTyxFQUFDLFNBQVMsRUFBQyxNQUFNLGFBQWEsQ0FBQztBQUV0QyxNQUFNLFVBQVUsUUFBUSxDQUNwQixJQUF1RDtJQUN6RCxNQUFNLEVBQUMsTUFBTSxFQUFFLE9BQU8sRUFBQyxHQUFHLElBQUksQ0FBQztJQUMvQixNQUFNLEVBQUMsQ0FBQyxFQUFDLEdBQUcsTUFBTSxDQUFDO0lBRW5CLElBQUksQ0FBQyxDQUFDLEtBQUssS0FBSyxRQUFRLEVBQUU7UUFDeEIsTUFBTSxJQUFJLEtBQUssQ0FBQyw4Q0FBOEMsQ0FBQyxDQUFDO0tBQ2pFO1NBQU0sSUFBSSxDQUFDLENBQUMsS0FBSyxLQUFLLFdBQVcsRUFBRTtRQUNsQyxNQUFNLFFBQVEsR0FBRyxJQUFJLENBQUMsRUFBQyxNQUFNLEVBQUUsRUFBQyxLQUFLLEVBQUUsQ0FBQyxFQUFDLEVBQUUsT0FBTyxFQUFDLENBQUMsQ0FBQztRQUNyRCxNQUFNLENBQUMsR0FBRyxRQUFRLENBQUMsRUFBQyxNQUFNLEVBQUUsRUFBQyxDQUFDLEVBQUUsUUFBUSxFQUFDLEVBQUUsT0FBTyxFQUFDLENBQUMsQ0FBQztRQUNyRCxNQUFNLFFBQVEsR0FBRyxJQUFJLENBQUMsRUFBQyxNQUFNLEVBQUUsRUFBQyxLQUFLLEVBQUUsQ0FBQyxFQUFDLEVBQUUsT0FBTyxFQUFDLENBQUMsQ0FBQztRQUNyRCxNQUFNLENBQUMsR0FBRyxTQUFTLENBQUMsRUFBQyxNQUFNLEVBQUUsRUFBQyxDQUFDLEVBQUUsUUFBUSxFQUFDLEVBQUUsT0FBTyxFQUFDLENBQUMsQ0FBQztRQUV0RCxNQUFNLE1BQU0sR0FBRyxPQUFPLENBQUMsRUFBQyxNQUFNLEVBQUUsRUFBQyxJQUFJLEVBQUUsQ0FBQyxFQUFFLElBQUksRUFBRSxDQUFDLEVBQUMsRUFBRSxPQUFPLEVBQUMsQ0FBQyxDQUFDO1FBRTlELE9BQU8sQ0FBQyw2QkFBNkIsQ0FBQyxRQUFRLENBQUMsQ0FBQztRQUNoRCxPQUFPLENBQUMsNkJBQTZCLENBQUMsQ0FBQyxDQUFDLENBQUM7UUFDekMsT0FBTyxDQUFDLDZCQUE2QixDQUFDLFFBQVEsQ0FBQyxDQUFDO1FBQ2hELE9BQU8sQ0FBQyw2QkFBNkIsQ0FBQyxDQUFDLENBQUMsQ0FBQztRQUV6QyxPQUFPLE1BQU0sQ0FBQztLQUNmO1NBQU07UUFDTCxPQUFPLElBQUksQ0FBQyxFQUFDLE9BQU8sRUFBRSxLQUFLLEVBQUUsRUFBQyxLQUFLLEVBQUUsQ0FBQyxDQUFDLEtBQUssRUFBRSxLQUFLLEVBQUUsQ0FBQyxFQUFFLEtBQUssRUFBRSxDQUFDLENBQUMsS0FBSyxFQUFDLEVBQUMsQ0FBQyxDQUFDO0tBQzNFO0FBQ0gsQ0FBQztBQUVELE1BQU0sQ0FBQyxNQUFNLGNBQWMsR0FBaUI7SUFDMUMsVUFBVSxFQUFFLFFBQVE7SUFDcEIsV0FBVyxFQUFFLEtBQUs7SUFDbEIsVUFBVSxFQUFFLFFBQTRCO0NBQ3pDLENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyIvKipcbiAqIEBsaWNlbnNlXG4gKiBDb3B5cmlnaHQgMjAyMCBHb29nbGUgTExDLiBBbGwgUmlnaHRzIFJlc2VydmVkLlxuICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlIFwiTGljZW5zZVwiKTtcbiAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS5cbiAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdFxuICpcbiAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMFxuICpcbiAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmVcbiAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuIFwiQVMgSVNcIiBCQVNJUyxcbiAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLlxuICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZFxuICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuXG4gKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuICovXG5cbmltcG9ydCB7S2VybmVsQ29uZmlnLCBLZXJuZWxGdW5jLCBPbmVzTGlrZSwgT25lc0xpa2VJbnB1dHMsIFRlbnNvckluZm99IGZyb20gJ0B0ZW5zb3JmbG93L3RmanMtY29yZSc7XG5cbmltcG9ydCB7TWF0aEJhY2tlbmRDUFV9IGZyb20gJy4uL2JhY2tlbmRfY3B1JztcbmltcG9ydCB7Y29tcGxleH0gZnJvbSAnLi9Db21wbGV4JztcbmltcG9ydCB7ZmlsbH0gZnJvbSAnLi9GaWxsJztcbmltcG9ydCB7aW1hZ30gZnJvbSAnLi9JbWFnJztcbmltcG9ydCB7cmVhbH0gZnJvbSAnLi9SZWFsJztcbmltcG9ydCB7emVyb3NMaWtlfSBmcm9tICcuL1plcm9zTGlrZSc7XG5cbmV4cG9ydCBmdW5jdGlvbiBvbmVzTGlrZShcbiAgICBhcmdzOiB7aW5wdXRzOiBPbmVzTGlrZUlucHV0cywgYmFja2VuZDogTWF0aEJhY2tlbmRDUFV9KTogVGVuc29ySW5mbyB7XG4gIGNvbnN0IHtpbnB1dHMsIGJhY2tlbmR9ID0gYXJncztcbiAgY29uc3Qge3h9ID0gaW5wdXRzO1xuXG4gIGlmICh4LmR0eXBlID09PSAnc3RyaW5nJykge1xuICAgIHRocm93IG5ldyBFcnJvcignb25lc0xpa2UgaXMgbm90IHN1cHBvcnRlZCBmb3Igc3RyaW5nIHRlbnNvcnMnKTtcbiAgfSBlbHNlIGlmICh4LmR0eXBlID09PSAnY29tcGxleDY0Jykge1xuICAgIGNvbnN0IHJlYWxQYXJ0ID0gcmVhbCh7aW5wdXRzOiB7aW5wdXQ6IHh9LCBiYWNrZW5kfSk7XG4gICAgY29uc3QgciA9IG9uZXNMaWtlKHtpbnB1dHM6IHt4OiByZWFsUGFydH0sIGJhY2tlbmR9KTtcbiAgICBjb25zdCBpbWFnUGFydCA9IGltYWcoe2lucHV0czoge2lucHV0OiB4fSwgYmFja2VuZH0pO1xuICAgIGNvbnN0IGkgPSB6ZXJvc0xpa2Uoe2lucHV0czoge3g6IGltYWdQYXJ0fSwgYmFja2VuZH0pO1xuXG4gICAgY29uc3QgcmVzdWx0ID0gY29tcGxleCh7aW5wdXRzOiB7cmVhbDogciwgaW1hZzogaX0sIGJhY2tlbmR9KTtcblxuICAgIGJhY2tlbmQuZGlzcG9zZUludGVybWVkaWF0ZVRlbnNvckluZm8ocmVhbFBhcnQpO1xuICAgIGJhY2tlbmQuZGlzcG9zZUludGVybWVkaWF0ZVRlbnNvckluZm8ocik7XG4gICAgYmFja2VuZC5kaXNwb3NlSW50ZXJtZWRpYXRlVGVuc29ySW5mbyhpbWFnUGFydCk7XG4gICAgYmFja2VuZC5kaXNwb3NlSW50ZXJtZWRpYXRlVGVuc29ySW5mbyhpKTtcblxuICAgIHJldHVybiByZXN1bHQ7XG4gIH0gZWxzZSB7XG4gICAgcmV0dXJuIGZpbGwoe2JhY2tlbmQsIGF0dHJzOiB7c2hhcGU6IHguc2hhcGUsIHZhbHVlOiAxLCBkdHlwZTogeC5kdHlwZX19KTtcbiAgfVxufVxuXG5leHBvcnQgY29uc3Qgb25lc0xpa2VDb25maWc6IEtlcm5lbENvbmZpZyA9IHtcbiAga2VybmVsTmFtZTogT25lc0xpa2UsXG4gIGJhY2tlbmROYW1lOiAnY3B1JyxcbiAga2VybmVsRnVuYzogb25lc0xpa2UgYXMge30gYXMgS2VybmVsRnVuY1xufTtcbiJdfQ==","/**\n * @license\n * Copyright 2020 Google LLC. All Rights Reserved.\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n * =============================================================================\n */\nimport { Pack, util } from '@tensorflow/tfjs-core';\nimport { concat } from './Concat';\nimport { expandDims } from './ExpandDims';\nexport function pack(args) {\n const { inputs, backend, attrs } = args;\n const { axis } = attrs;\n if (inputs.length === 1) {\n return expandDims({ inputs: { input: inputs[0] }, backend, attrs: { dim: axis } });\n }\n const shape = inputs[0].shape;\n const dtype = inputs[0].dtype;\n inputs.forEach(t => {\n util.assertShapesMatch(shape, t.shape, 'All tensors passed to stack must have matching shapes');\n util.assert(dtype === t.dtype, () => 'All tensors passed to stack must have matching dtypes');\n });\n const intermediateTensorInfos = [];\n const expandedTensors = inputs.map(t => {\n const expandedT = expandDims({ inputs: { input: t }, backend, attrs: { dim: axis } });\n intermediateTensorInfos.push(expandedT);\n return expandedT;\n });\n const result = concat({ inputs: expandedTensors, backend, attrs: { axis } });\n intermediateTensorInfos.forEach(t => backend.disposeIntermediateTensorInfo(t));\n return result;\n}\nexport const packConfig = {\n kernelName: Pack,\n backendName: 'cpu',\n kernelFunc: pack\n};\n//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiUGFjay5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uLy4uL3RmanMtYmFja2VuZC1jcHUvc3JjL2tlcm5lbHMvUGFjay50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQTs7Ozs7Ozs7Ozs7Ozs7O0dBZUc7QUFFSCxPQUFPLEVBQTJCLElBQUksRUFBcUMsSUFBSSxFQUFDLE1BQU0sdUJBQXVCLENBQUM7QUFHOUcsT0FBTyxFQUFDLE1BQU0sRUFBQyxNQUFNLFVBQVUsQ0FBQztBQUNoQyxPQUFPLEVBQUMsVUFBVSxFQUFDLE1BQU0sY0FBYyxDQUFDO0FBRXhDLE1BQU0sVUFBVSxJQUFJLENBQ2hCLElBQXFFO0lBRXZFLE1BQU0sRUFBQyxNQUFNLEVBQUUsT0FBTyxFQUFFLEtBQUssRUFBQyxHQUFHLElBQUksQ0FBQztJQUN0QyxNQUFNLEVBQUMsSUFBSSxFQUFDLEdBQUcsS0FBSyxDQUFDO0lBRXJCLElBQUksTUFBTSxDQUFDLE1BQU0sS0FBSyxDQUFDLEVBQUU7UUFDdkIsT0FBTyxVQUFVLENBQ2IsRUFBQyxNQUFNLEVBQUUsRUFBQyxLQUFLLEVBQUUsTUFBTSxDQUFDLENBQUMsQ0FBQyxFQUFDLEVBQUUsT0FBTyxFQUFFLEtBQUssRUFBRSxFQUFDLEdBQUcsRUFBRSxJQUFJLEVBQUMsRUFBQyxDQUFDLENBQUM7S0FDaEU7SUFFRCxNQUFNLEtBQUssR0FBRyxNQUFNLENBQUMsQ0FBQyxDQUFDLENBQUMsS0FBSyxDQUFDO0lBQzlCLE1BQU0sS0FBSyxHQUFHLE1BQU0sQ0FBQyxDQUFDLENBQUMsQ0FBQyxLQUFLLENBQUM7SUFFOUIsTUFBTSxDQUFDLE9BQU8sQ0FBQyxDQUFDLENBQUMsRUFBRTtRQUNqQixJQUFJLENBQUMsaUJBQWlCLENBQ2xCLEtBQUssRUFBRSxDQUFDLENBQUMsS0FBSyxFQUNkLHVEQUF1RCxDQUFDLENBQUM7UUFDN0QsSUFBSSxDQUFDLE1BQU0sQ0FDUCxLQUFLLEtBQUssQ0FBQyxDQUFDLEtBQUssRUFDakIsR0FBRyxFQUFFLENBQUMsdURBQXVELENBQUMsQ0FBQztJQUNyRSxDQUFDLENBQUMsQ0FBQztJQUVILE1BQU0sdUJBQXVCLEdBQWlCLEVBQUUsQ0FBQztJQUNqRCxNQUFNLGVBQWUsR0FBRyxNQUFNLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxFQUFFO1FBQ3JDLE1BQU0sU0FBUyxHQUNYLFVBQVUsQ0FBQyxFQUFDLE1BQU0sRUFBRSxFQUFDLEtBQUssRUFBRSxDQUFDLEVBQUMsRUFBRSxPQUFPLEVBQUUsS0FBSyxFQUFFLEVBQUMsR0FBRyxFQUFFLElBQUksRUFBQyxFQUFDLENBQUMsQ0FBQztRQUNsRSx1QkFBdUIsQ0FBQyxJQUFJLENBQUMsU0FBUyxDQUFDLENBQUM7UUFDeEMsT0FBTyxTQUFTLENBQUM7SUFDbkIsQ0FBQyxDQUFDLENBQUM7SUFFSCxNQUFNLE1BQU0sR0FBRyxNQUFNLENBQUMsRUFBQyxNQUFNLEVBQUUsZUFBZSxFQUFFLE9BQU8sRUFBRSxLQUFLLEVBQUUsRUFBQyxJQUFJLEVBQUMsRUFBQyxDQUFDLENBQUM7SUFFekUsdUJBQXVCLENBQUMsT0FBTyxDQUMzQixDQUFDLENBQUMsRUFBRSxDQUFDLE9BQU8sQ0FBQyw2QkFBNkIsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDO0lBRW5ELE9BQU8sTUFBTSxDQUFDO0FBQ2hCLENBQUM7QUFFRCxNQUFNLENBQUMsTUFBTSxVQUFVLEdBQWlCO0lBQ3RDLFVBQVUsRUFBRSxJQUFJO0lBQ2hCLFdBQVcsRUFBRSxLQUFLO0lBQ2xCLFVBQVUsRUFBRSxJQUF3QjtDQUNyQyxDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiLyoqXG4gKiBAbGljZW5zZVxuICogQ29weXJpZ2h0IDIwMjAgR29vZ2xlIExMQy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC5cbiAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSBcIkxpY2Vuc2VcIik7XG4gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuXG4gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXRcbiAqXG4gKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjBcbiAqXG4gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlXG4gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiBcIkFTIElTXCIgQkFTSVMsXG4gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC5cbiAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmRcbiAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLlxuICogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbiAqL1xuXG5pbXBvcnQge0tlcm5lbENvbmZpZywgS2VybmVsRnVuYywgUGFjaywgUGFja0F0dHJzLCBQYWNrSW5wdXRzLCBUZW5zb3JJbmZvLCB1dGlsfSBmcm9tICdAdGVuc29yZmxvdy90ZmpzLWNvcmUnO1xuXG5pbXBvcnQge01hdGhCYWNrZW5kQ1BVfSBmcm9tICcuLi9iYWNrZW5kX2NwdSc7XG5pbXBvcnQge2NvbmNhdH0gZnJvbSAnLi9Db25jYXQnO1xuaW1wb3J0IHtleHBhbmREaW1zfSBmcm9tICcuL0V4cGFuZERpbXMnO1xuXG5leHBvcnQgZnVuY3Rpb24gcGFjayhcbiAgICBhcmdzOiB7aW5wdXRzOiBQYWNrSW5wdXRzLCBiYWNrZW5kOiBNYXRoQmFja2VuZENQVSwgYXR0cnM6IFBhY2tBdHRyc30pOlxuICAgIFRlbnNvckluZm8ge1xuICBjb25zdCB7aW5wdXRzLCBiYWNrZW5kLCBhdHRyc30gPSBhcmdzO1xuICBjb25zdCB7YXhpc30gPSBhdHRycztcblxuICBpZiAoaW5wdXRzLmxlbmd0aCA9PT0gMSkge1xuICAgIHJldHVybiBleHBhbmREaW1zKFxuICAgICAgICB7aW5wdXRzOiB7aW5wdXQ6IGlucHV0c1swXX0sIGJhY2tlbmQsIGF0dHJzOiB7ZGltOiBheGlzfX0pO1xuICB9XG5cbiAgY29uc3Qgc2hhcGUgPSBpbnB1dHNbMF0uc2hhcGU7XG4gIGNvbnN0IGR0eXBlID0gaW5wdXRzWzBdLmR0eXBlO1xuXG4gIGlucHV0cy5mb3JFYWNoKHQgPT4ge1xuICAgIHV0aWwuYXNzZXJ0U2hhcGVzTWF0Y2goXG4gICAgICAgIHNoYXBlLCB0LnNoYXBlLFxuICAgICAgICAnQWxsIHRlbnNvcnMgcGFzc2VkIHRvIHN0YWNrIG11c3QgaGF2ZSBtYXRjaGluZyBzaGFwZXMnKTtcbiAgICB1dGlsLmFzc2VydChcbiAgICAgICAgZHR5cGUgPT09IHQuZHR5cGUsXG4gICAgICAgICgpID0+ICdBbGwgdGVuc29ycyBwYXNzZWQgdG8gc3RhY2sgbXVzdCBoYXZlIG1hdGNoaW5nIGR0eXBlcycpO1xuICB9KTtcblxuICBjb25zdCBpbnRlcm1lZGlhdGVUZW5zb3JJbmZvczogVGVuc29ySW5mb1tdID0gW107XG4gIGNvbnN0IGV4cGFuZGVkVGVuc29ycyA9IGlucHV0cy5tYXAodCA9PiB7XG4gICAgY29uc3QgZXhwYW5kZWRUID1cbiAgICAgICAgZXhwYW5kRGltcyh7aW5wdXRzOiB7aW5wdXQ6IHR9LCBiYWNrZW5kLCBhdHRyczoge2RpbTogYXhpc319KTtcbiAgICBpbnRlcm1lZGlhdGVUZW5zb3JJbmZvcy5wdXNoKGV4cGFuZGVkVCk7XG4gICAgcmV0dXJuIGV4cGFuZGVkVDtcbiAgfSk7XG5cbiAgY29uc3QgcmVzdWx0ID0gY29uY2F0KHtpbnB1dHM6IGV4cGFuZGVkVGVuc29ycywgYmFja2VuZCwgYXR0cnM6IHtheGlzfX0pO1xuXG4gIGludGVybWVkaWF0ZVRlbnNvckluZm9zLmZvckVhY2goXG4gICAgICB0ID0+IGJhY2tlbmQuZGlzcG9zZUludGVybWVkaWF0ZVRlbnNvckluZm8odCkpO1xuXG4gIHJldHVybiByZXN1bHQ7XG59XG5cbmV4cG9ydCBjb25zdCBwYWNrQ29uZmlnOiBLZXJuZWxDb25maWcgPSB7XG4gIGtlcm5lbE5hbWU6IFBhY2ssXG4gIGJhY2tlbmROYW1lOiAnY3B1JyxcbiAga2VybmVsRnVuYzogcGFjayBhcyB7fSBhcyBLZXJuZWxGdW5jXG59O1xuIl19","/**\n * @license\n * Copyright 2020 Google LLC. All Rights Reserved.\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n * =============================================================================\n */\nimport { PadV2, util } from '@tensorflow/tfjs-core';\nimport { assertNotComplex } from '../cpu_util';\nexport function padV2(args) {\n const { inputs, backend, attrs } = args;\n const { x } = inputs;\n const { paddings, constantValue } = attrs;\n assertNotComplex(x, 'pad');\n const outShape = paddings.map((p, i) => p[0] /* beforePad */ + x.shape[i] + p[1] /* afterPad */);\n const start = paddings.map(p => p[0]);\n const xVals = backend.data.get(x.dataId).values;\n const xSize = util.sizeFromShape(x.shape);\n const xRank = x.shape.length;\n const xStrides = util.computeStrides(x.shape);\n const resultSize = util.sizeFromShape(outShape);\n const resultRank = outShape.length;\n const resultStrides = util.computeStrides(outShape);\n const resVals = util.getTypedArrayFromDType(x.dtype, resultSize);\n if (constantValue !== 0) {\n resVals.fill(constantValue);\n }\n for (let i = 0; i < xSize; i++) {\n const coords = util.indexToLoc(i, xRank, xStrides);\n const outCoords = coords.map((c, i) => c + start[i]);\n const outIndex = util.locToIndex(outCoords, resultRank, resultStrides);\n resVals[outIndex] = xVals[i];\n }\n const outId = backend.write(resVals, outShape, x.dtype);\n return { dataId: outId, shape: outShape, dtype: x.dtype };\n}\nexport const padV2Config = {\n kernelName: PadV2,\n backendName: 'cpu',\n kernelFunc: padV2\n};\n//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiUGFkVjIuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi8uLi90ZmpzLWJhY2tlbmQtY3B1L3NyYy9rZXJuZWxzL1BhZFYyLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBOzs7Ozs7Ozs7Ozs7Ozs7R0FlRztBQUVILE9BQU8sRUFBNEMsS0FBSyxFQUFtRCxJQUFJLEVBQUMsTUFBTSx1QkFBdUIsQ0FBQztBQUc5SSxPQUFPLEVBQUMsZ0JBQWdCLEVBQUMsTUFBTSxhQUFhLENBQUM7QUFFN0MsTUFBTSxVQUFVLEtBQUssQ0FDakIsSUFBdUU7SUFFekUsTUFBTSxFQUFDLE1BQU0sRUFBRSxPQUFPLEVBQUUsS0FBSyxFQUFDLEdBQUcsSUFBSSxDQUFDO0lBQ3RDLE1BQU0sRUFBQyxDQUFDLEVBQUMsR0FBRyxNQUFNLENBQUM7SUFDbkIsTUFBTSxFQUFDLFFBQVEsRUFBRSxhQUFhLEVBQUMsR0FBRyxLQUFLLENBQUM7SUFFeEMsZ0JBQWdCLENBQUMsQ0FBQyxFQUFFLEtBQUssQ0FBQyxDQUFDO0lBRTNCLE1BQU0sUUFBUSxHQUFHLFFBQVEsQ0FBQyxHQUFHLENBQ3pCLENBQUMsQ0FBQyxFQUFFLENBQUMsRUFBRSxFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLGVBQWUsR0FBRyxDQUFDLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxjQUFjLENBQUMsQ0FBQztJQUV2RSxNQUFNLEtBQUssR0FBRyxRQUFRLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUM7SUFFdEMsTUFBTSxLQUFLLEdBQUcsT0FBTyxDQUFDLElBQUksQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLE1BQU0sQ0FBQyxDQUFDLE1BQW9CLENBQUM7SUFDOUQsTUFBTSxLQUFLLEdBQUcsSUFBSSxDQUFDLGFBQWEsQ0FBQyxDQUFDLENBQUMsS0FBSyxDQUFDLENBQUM7SUFDMUMsTUFBTSxLQUFLLEdBQUcsQ0FBQyxDQUFDLEtBQUssQ0FBQyxNQUFNLENBQUM7SUFDN0IsTUFBTSxRQUFRLEdBQUcsSUFBSSxDQUFDLGNBQWMsQ0FBQyxDQUFDLENBQUMsS0FBSyxDQUFDLENBQUM7SUFFOUMsTUFBTSxVQUFVLEdBQUcsSUFBSSxDQUFDLGFBQWEsQ0FBQyxRQUFRLENBQUMsQ0FBQztJQUNoRCxNQUFNLFVBQVUsR0FBRyxRQUFRLENBQUMsTUFBTSxDQUFDO0lBQ25DLE1BQU0sYUFBYSxHQUFHLElBQUksQ0FBQyxjQUFjLENBQUMsUUFBUSxDQUFDLENBQUM7SUFDcEQsTUFBTSxPQUFPLEdBQ1QsSUFBSSxDQUFDLHNCQUFzQixDQUFDLENBQUMsQ0FBQyxLQUF3QixFQUFFLFVBQVUsQ0FBQyxDQUFDO0lBRXhFLElBQUksYUFBYSxLQUFLLENBQUMsRUFBRTtRQUN2QixPQUFPLENBQUMsSUFBSSxDQUFDLGFBQWEsQ0FBQyxDQUFDO0tBQzdCO0lBRUQsS0FBSyxJQUFJLENBQUMsR0FBRyxDQUFDLEVBQUUsQ0FBQyxHQUFHLEtBQUssRUFBRSxDQUFDLEVBQUUsRUFBRTtRQUM5QixNQUFNLE1BQU0sR0FBRyxJQUFJLENBQUMsVUFBVSxDQUFDLENBQUMsRUFBRSxLQUFLLEVBQUUsUUFBUSxDQUFDLENBQUM7UUFDbkQsTUFBTSxTQUFTLEdBQUcsTUFBTSxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLEVBQUUsRUFBRSxDQUFDLENBQUMsR0FBRyxLQUFLLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQztRQUNyRCxNQUFNLFFBQVEsR0FBRyxJQUFJLENBQUMsVUFBVSxDQUFDLFNBQVMsRUFBRSxVQUFVLEVBQUUsYUFBYSxDQUFDLENBQUM7UUFFdkUsT0FBTyxDQUFDLFFBQVEsQ0FBQyxHQUFHLEtBQUssQ0FBQyxDQUFDLENBQUMsQ0FBQztLQUM5QjtJQUVELE1BQU0sS0FBSyxHQUFHLE9BQU8sQ0FBQyxLQUFLLENBQUMsT0FBTyxFQUFFLFFBQVEsRUFBRSxDQUFDLENBQUMsS0FBSyxDQUFDLENBQUM7SUFFeEQsT0FBTyxFQUFDLE1BQU0sRUFBRSxLQUFLLEVBQUUsS0FBSyxFQUFFLFFBQVEsRUFBRSxLQUFLLEVBQUUsQ0FBQyxDQUFDLEtBQUssRUFBQyxDQUFDO0FBQzFELENBQUM7QUFFRCxNQUFNLENBQUMsTUFBTSxXQUFXLEdBQWlCO0lBQ3ZDLFVBQVUsRUFBRSxLQUFLO0lBQ2pCLFdBQVcsRUFBRSxLQUFLO0lBQ2xCLFVBQVUsRUFBRSxLQUF5QjtDQUN0QyxDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiLyoqXG4gKiBAbGljZW5zZVxuICogQ29weXJpZ2h0IDIwMjAgR29vZ2xlIExMQy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC5cbiAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSBcIkxpY2Vuc2VcIik7XG4gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuXG4gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXRcbiAqXG4gKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjBcbiAqXG4gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlXG4gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiBcIkFTIElTXCIgQkFTSVMsXG4gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC5cbiAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmRcbiAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLlxuICogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbiAqL1xuXG5pbXBvcnQge0tlcm5lbENvbmZpZywgS2VybmVsRnVuYywgTnVtZXJpY0RhdGFUeXBlLCBQYWRWMiwgUGFkVjJBdHRycywgUGFkVjJJbnB1dHMsIFRlbnNvckluZm8sIFR5cGVkQXJyYXksIHV0aWx9IGZyb20gJ0B0ZW5zb3JmbG93L3RmanMtY29yZSc7XG5cbmltcG9ydCB7TWF0aEJhY2tlbmRDUFV9IGZyb20gJy4uL2JhY2tlbmRfY3B1JztcbmltcG9ydCB7YXNzZXJ0Tm90Q29tcGxleH0gZnJvbSAnLi4vY3B1X3V0aWwnO1xuXG5leHBvcnQgZnVuY3Rpb24gcGFkVjIoXG4gICAgYXJnczoge2lucHV0czogUGFkVjJJbnB1dHMsIGJhY2tlbmQ6IE1hdGhCYWNrZW5kQ1BVLCBhdHRyczogUGFkVjJBdHRyc30pOlxuICAgIFRlbnNvckluZm8ge1xuICBjb25zdCB7aW5wdXRzLCBiYWNrZW5kLCBhdHRyc30gPSBhcmdzO1xuICBjb25zdCB7eH0gPSBpbnB1dHM7XG4gIGNvbnN0IHtwYWRkaW5ncywgY29uc3RhbnRWYWx1ZX0gPSBhdHRycztcblxuICBhc3NlcnROb3RDb21wbGV4KHgsICdwYWQnKTtcblxuICBjb25zdCBvdXRTaGFwZSA9IHBhZGRpbmdzLm1hcChcbiAgICAgIChwLCBpKSA9PiBwWzBdIC8qIGJlZm9yZVBhZCAqLyArIHguc2hhcGVbaV0gKyBwWzFdIC8qIGFmdGVyUGFkICovKTtcblxuICBjb25zdCBzdGFydCA9IHBhZGRpbmdzLm1hcChwID0+IHBbMF0pO1xuXG4gIGNvbnN0IHhWYWxzID0gYmFja2VuZC5kYXRhLmdldCh4LmRhdGFJZCkudmFsdWVzIGFzIFR5cGVkQXJyYXk7XG4gIGNvbnN0IHhTaXplID0gdXRpbC5zaXplRnJvbVNoYXBlKHguc2hhcGUpO1xuICBjb25zdCB4UmFuayA9IHguc2hhcGUubGVuZ3RoO1xuICBjb25zdCB4U3RyaWRlcyA9IHV0aWwuY29tcHV0ZVN0cmlkZXMoeC5zaGFwZSk7XG5cbiAgY29uc3QgcmVzdWx0U2l6ZSA9IHV0aWwuc2l6ZUZyb21TaGFwZShvdXRTaGFwZSk7XG4gIGNvbnN0IHJlc3VsdFJhbmsgPSBvdXRTaGFwZS5sZW5ndGg7XG4gIGNvbnN0IHJlc3VsdFN0cmlkZXMgPSB1dGlsLmNvbXB1dGVTdHJpZGVzKG91dFNoYXBlKTtcbiAgY29uc3QgcmVzVmFscyA9XG4gICAgICB1dGlsLmdldFR5cGVkQXJyYXlGcm9tRFR5cGUoeC5kdHlwZSBhcyBOdW1lcmljRGF0YVR5cGUsIHJlc3VsdFNpemUpO1xuXG4gIGlmIChjb25zdGFudFZhbHVlICE9PSAwKSB7XG4gICAgcmVzVmFscy5maWxsKGNvbnN0YW50VmFsdWUpO1xuICB9XG5cbiAgZm9yIChsZXQgaSA9IDA7IGkgPCB4U2l6ZTsgaSsrKSB7XG4gICAgY29uc3QgY29vcmRzID0gdXRpbC5pbmRleFRvTG9jKGksIHhSYW5rLCB4U3RyaWRlcyk7XG4gICAgY29uc3Qgb3V0Q29vcmRzID0gY29vcmRzLm1hcCgoYywgaSkgPT4gYyArIHN0YXJ0W2ldKTtcbiAgICBjb25zdCBvdXRJbmRleCA9IHV0aWwubG9jVG9JbmRleChvdXRDb29yZHMsIHJlc3VsdFJhbmssIHJlc3VsdFN0cmlkZXMpO1xuXG4gICAgcmVzVmFsc1tvdXRJbmRleF0gPSB4VmFsc1tpXTtcbiAgfVxuXG4gIGNvbnN0IG91dElkID0gYmFja2VuZC53cml0ZShyZXNWYWxzLCBvdXRTaGFwZSwgeC5kdHlwZSk7XG5cbiAgcmV0dXJuIHtkYXRhSWQ6IG91dElkLCBzaGFwZTogb3V0U2hhcGUsIGR0eXBlOiB4LmR0eXBlfTtcbn1cblxuZXhwb3J0IGNvbnN0IHBhZFYyQ29uZmlnOiBLZXJuZWxDb25maWcgPSB7XG4gIGtlcm5lbE5hbWU6IFBhZFYyLFxuICBiYWNrZW5kTmFtZTogJ2NwdScsXG4gIGtlcm5lbEZ1bmM6IHBhZFYyIGFzIHt9IGFzIEtlcm5lbEZ1bmNcbn07XG4iXX0=","/**\n * @license\n * Copyright 2020 Google LLC. All Rights Reserved.\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n * =============================================================================\n */\nimport { Pow } from '@tensorflow/tfjs-core';\nimport { createSimpleBinaryKernelImpl } from '../utils/binary_impl';\nimport { binaryKernelFunc } from '../utils/binary_utils';\nexport const powImpl = createSimpleBinaryKernelImpl((a, b) => Math.pow(a, b));\nexport const pow = binaryKernelFunc(Pow, powImpl);\nexport const powConfig = {\n kernelName: Pow,\n backendName: 'cpu',\n kernelFunc: pow\n};\n//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiUG93LmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vLi4vdGZqcy1iYWNrZW5kLWNwdS9zcmMva2VybmVscy9Qb3cudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUE7Ozs7Ozs7Ozs7Ozs7OztHQWVHO0FBRUgsT0FBTyxFQUFlLEdBQUcsRUFBQyxNQUFNLHVCQUF1QixDQUFDO0FBRXhELE9BQU8sRUFBQyw0QkFBNEIsRUFBQyxNQUFNLHNCQUFzQixDQUFDO0FBQ2xFLE9BQU8sRUFBQyxnQkFBZ0IsRUFBQyxNQUFNLHVCQUF1QixDQUFDO0FBRXZELE1BQU0sQ0FBQyxNQUFNLE9BQU8sR0FDaEIsNEJBQTRCLENBQUMsQ0FBQyxDQUFTLEVBQUUsQ0FBUyxFQUFFLEVBQUUsQ0FBQyxJQUFJLENBQUMsR0FBRyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxDQUFDO0FBQzNFLE1BQU0sQ0FBQyxNQUFNLEdBQUcsR0FBRyxnQkFBZ0IsQ0FBQyxHQUFHLEVBQUUsT0FBTyxDQUFDLENBQUM7QUFFbEQsTUFBTSxDQUFDLE1BQU0sU0FBUyxHQUFpQjtJQUNyQyxVQUFVLEVBQUUsR0FBRztJQUNmLFdBQVcsRUFBRSxLQUFLO0lBQ2xCLFVBQVUsRUFBRSxHQUFHO0NBQ2hCLENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyIvKipcbiAqIEBsaWNlbnNlXG4gKiBDb3B5cmlnaHQgMjAyMCBHb29nbGUgTExDLiBBbGwgUmlnaHRzIFJlc2VydmVkLlxuICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlIFwiTGljZW5zZVwiKTtcbiAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS5cbiAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdFxuICpcbiAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMFxuICpcbiAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmVcbiAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuIFwiQVMgSVNcIiBCQVNJUyxcbiAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLlxuICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZFxuICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuXG4gKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuICovXG5cbmltcG9ydCB7S2VybmVsQ29uZmlnLCBQb3d9IGZyb20gJ0B0ZW5zb3JmbG93L3RmanMtY29yZSc7XG5cbmltcG9ydCB7Y3JlYXRlU2ltcGxlQmluYXJ5S2VybmVsSW1wbH0gZnJvbSAnLi4vdXRpbHMvYmluYXJ5X2ltcGwnO1xuaW1wb3J0IHtiaW5hcnlLZXJuZWxGdW5jfSBmcm9tICcuLi91dGlscy9iaW5hcnlfdXRpbHMnO1xuXG5leHBvcnQgY29uc3QgcG93SW1wbCA9XG4gICAgY3JlYXRlU2ltcGxlQmluYXJ5S2VybmVsSW1wbCgoYTogbnVtYmVyLCBiOiBudW1iZXIpID0+IE1hdGgucG93KGEsIGIpKTtcbmV4cG9ydCBjb25zdCBwb3cgPSBiaW5hcnlLZXJuZWxGdW5jKFBvdywgcG93SW1wbCk7XG5cbmV4cG9ydCBjb25zdCBwb3dDb25maWc6IEtlcm5lbENvbmZpZyA9IHtcbiAga2VybmVsTmFtZTogUG93LFxuICBiYWNrZW5kTmFtZTogJ2NwdScsXG4gIGtlcm5lbEZ1bmM6IHBvd1xufTtcbiJdfQ==","/**\n * @license\n * Copyright 2020 Google LLC. All Rights Reserved.\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n * =============================================================================\n */\nimport { backend_util, Prod, upcastType, util } from '@tensorflow/tfjs-core';\nimport { assertNotComplex } from '../cpu_util';\nimport { transpose } from './Transpose';\nexport function prodImpl(xShape, xDtype, xVals, reductionAxes) {\n const [outShape, reduceShape] = backend_util.computeOutAndReduceShapes(xShape, reductionAxes);\n const outDtype = upcastType(xDtype, 'int32');\n const outVals = util.makeZerosTypedArray(util.sizeFromShape(outShape), outDtype);\n const reduceSize = util.sizeFromShape(reduceShape);\n for (let i = 0; i < outVals.length; ++i) {\n const offset = i * reduceSize;\n let prod = 1;\n for (let j = 0; j < reduceSize; ++j) {\n prod *= xVals[offset + j];\n }\n outVals[i] = prod;\n }\n return { outVals, outShape, outDtype };\n}\nexport function prod(args) {\n const { inputs, backend, attrs } = args;\n const { x } = inputs;\n const { axis, keepDims } = attrs;\n assertNotComplex(x, 'prod');\n const xRank = x.shape.length;\n const axes = util.parseAxisParam(axis, x.shape);\n const permutation = backend_util.getAxesPermutation(axes, xRank);\n let reductionAxes = axes;\n let permutedX = x;\n const intermediateTensorInfos = [];\n if (permutation != null) {\n permutedX = transpose({ inputs: { x }, backend, attrs: { perm: permutation } });\n intermediateTensorInfos.push(permutedX);\n reductionAxes = backend_util.getInnerMostAxes(reductionAxes.length, xRank);\n }\n const xVals = backend.data.get(permutedX.dataId).values;\n const { outVals, outShape, outDtype } = prodImpl(permutedX.shape, permutedX.dtype, xVals, reductionAxes);\n let resultShape = outShape;\n if (keepDims) {\n resultShape = backend_util.expandShapeToKeepDim(outShape, axes);\n }\n intermediateTensorInfos.forEach(t => backend.disposeIntermediateTensorInfo(t));\n return backend.makeTensorInfo(resultShape, outDtype, outVals);\n}\nexport const prodConfig = {\n kernelName: Prod,\n backendName: 'cpu',\n kernelFunc: prod\n};\n//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiUHJvZC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uLy4uL3RmanMtYmFja2VuZC1jcHUvc3JjL2tlcm5lbHMvUHJvZC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQTs7Ozs7Ozs7Ozs7Ozs7O0dBZUc7QUFFSCxPQUFPLEVBQUMsWUFBWSxFQUFzQyxJQUFJLEVBQWlELFVBQVUsRUFBRSxJQUFJLEVBQUMsTUFBTSx1QkFBdUIsQ0FBQztBQUc5SixPQUFPLEVBQUMsZ0JBQWdCLEVBQUMsTUFBTSxhQUFhLENBQUM7QUFDN0MsT0FBTyxFQUFDLFNBQVMsRUFBQyxNQUFNLGFBQWEsQ0FBQztBQUV0QyxNQUFNLFVBQVUsUUFBUSxDQUNwQixNQUFnQixFQUFFLE1BQWdCLEVBQUUsS0FBaUIsRUFDckQsYUFBdUI7SUFFekIsTUFBTSxDQUFDLFFBQVEsRUFBRSxXQUFXLENBQUMsR0FDekIsWUFBWSxDQUFDLHlCQUF5QixDQUFDLE1BQU0sRUFBRSxhQUFhLENBQUMsQ0FBQztJQUNsRSxNQUFNLFFBQVEsR0FBRyxVQUFVLENBQUMsTUFBTSxFQUFFLE9BQU8sQ0FBQyxDQUFDO0lBQzdDLE1BQU0sT0FBTyxHQUFHLElBQUksQ0FBQyxtQkFBbUIsQ0FDcEIsSUFBSSxDQUFDLGFBQWEsQ0FBQyxRQUFRLENBQUMsRUFBRSxRQUFRLENBQWUsQ0FBQztJQUMxRSxNQUFNLFVBQVUsR0FBRyxJQUFJLENBQUMsYUFBYSxDQUFDLFdBQVcsQ0FBQyxDQUFDO0lBRW5ELEtBQUssSUFBSSxDQUFDLEdBQUcsQ0FBQyxFQUFFLENBQUMsR0FBRyxPQUFPLENBQUMsTUFBTSxFQUFFLEVBQUUsQ0FBQyxFQUFFO1FBQ3ZDLE1BQU0sTUFBTSxHQUFHLENBQUMsR0FBRyxVQUFVLENBQUM7UUFDOUIsSUFBSSxJQUFJLEdBQUcsQ0FBQyxDQUFDO1FBQ2IsS0FBSyxJQUFJLENBQUMsR0FBRyxDQUFDLEVBQUUsQ0FBQyxHQUFHLFVBQVUsRUFBRSxFQUFFLENBQUMsRUFBRTtZQUNuQyxJQUFJLElBQUksS0FBSyxDQUFDLE1BQU0sR0FBRyxDQUFDLENBQUMsQ0FBQztTQUMzQjtRQUNELE9BQU8sQ0FBQyxDQUFDLENBQUMsR0FBRyxJQUFJLENBQUM7S0FDbkI7SUFFRCxPQUFPLEVBQUMsT0FBTyxFQUFFLFFBQVEsRUFBRSxRQUFRLEVBQUMsQ0FBQztBQUN2QyxDQUFDO0FBRUQsTUFBTSxVQUFVLElBQUksQ0FDaEIsSUFBcUU7SUFFdkUsTUFBTSxFQUFDLE1BQU0sRUFBRSxPQUFPLEVBQUUsS0FBSyxFQUFDLEdBQUcsSUFBSSxDQUFDO0lBQ3RDLE1BQU0sRUFBQyxDQUFDLEVBQUMsR0FBRyxNQUFNLENBQUM7SUFDbkIsTUFBTSxFQUFDLElBQUksRUFBRSxRQUFRLEVBQUMsR0FBRyxLQUFLLENBQUM7SUFFL0IsZ0JBQWdCLENBQUMsQ0FBQyxFQUFFLE1BQU0sQ0FBQyxDQUFDO0lBRTVCLE1BQU0sS0FBSyxHQUFHLENBQUMsQ0FBQyxLQUFLLENBQUMsTUFBTSxDQUFDO0lBQzdCLE1BQU0sSUFBSSxHQUFHLElBQUksQ0FBQyxjQUFjLENBQUMsSUFBSSxFQUFFLENBQUMsQ0FBQyxLQUFLLENBQUMsQ0FBQztJQUVoRCxNQUFNLFdBQVcsR0FBRyxZQUFZLENBQUMsa0JBQWtCLENBQUMsSUFBSSxFQUFFLEtBQUssQ0FBQyxDQUFDO0lBQ2pFLElBQUksYUFBYSxHQUFHLElBQUksQ0FBQztJQUN6QixJQUFJLFNBQVMsR0FBRyxDQUFDLENBQUM7SUFDbEIsTUFBTSx1QkFBdUIsR0FBRyxFQUFFLENBQUM7SUFDbkMsSUFBSSxXQUFXLElBQUksSUFBSSxFQUFFO1FBQ3ZCLFNBQVMsR0FBRyxTQUFTLENBQUMsRUFBQyxNQUFNLEVBQUUsRUFBQyxDQUFDLEVBQUMsRUFBRSxPQUFPLEVBQUUsS0FBSyxFQUFFLEVBQUMsSUFBSSxFQUFFLFdBQVcsRUFBQyxFQUFDLENBQUMsQ0FBQztRQUMxRSx1QkFBdUIsQ0FBQyxJQUFJLENBQUMsU0FBUyxDQUFDLENBQUM7UUFDeEMsYUFBYSxHQUFHLFlBQVksQ0FBQyxnQkFBZ0IsQ0FBQyxhQUFhLENBQUMsTUFBTSxFQUFFLEtBQUssQ0FBQyxDQUFDO0tBQzVFO0lBRUQsTUFBTSxLQUFLLEdBQUcsT0FBTyxDQUFDLElBQUksQ0FBQyxHQUFHLENBQUMsU0FBUyxDQUFDLE1BQU0sQ0FBQyxDQUFDLE1BQW9CLENBQUM7SUFDdEUsTUFBTSxFQUFDLE9BQU8sRUFBRSxRQUFRLEVBQUUsUUFBUSxFQUFDLEdBQy9CLFFBQVEsQ0FBQyxTQUFTLENBQUMsS0FBSyxFQUFFLFNBQVMsQ0FBQyxLQUFLLEVBQUUsS0FBSyxFQUFFLGFBQWEsQ0FBQyxDQUFDO0lBRXJFLElBQUksV0FBVyxHQUFHLFFBQVEsQ0FBQztJQUMzQixJQUFJLFFBQVEsRUFBRTtRQUNaLFdBQVcsR0FBRyxZQUFZLENBQUMsb0JBQW9CLENBQUMsUUFBUSxFQUFFLElBQUksQ0FBQyxDQUFDO0tBQ2pFO0lBRUQsdUJBQXVCLENBQUMsT0FBTyxDQUMzQixDQUFDLENBQUMsRUFBRSxDQUFDLE9BQU8sQ0FBQyw2QkFBNkIsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDO0lBRW5ELE9BQU8sT0FBTyxDQUFDLGNBQWMsQ0FBQyxXQUFXLEVBQUUsUUFBUSxFQUFFLE9BQU8sQ0FBQyxDQUFDO0FBQ2hFLENBQUM7QUFFRCxNQUFNLENBQUMsTUFBTSxVQUFVLEdBQWlCO0lBQ3RDLFVBQVUsRUFBRSxJQUFJO0lBQ2hCLFdBQVcsRUFBRSxLQUFLO0lBQ2xCLFVBQVUsRUFBRSxJQUF3QjtDQUNyQyxDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiLyoqXG4gKiBAbGljZW5zZVxuICogQ29weXJpZ2h0IDIwMjAgR29vZ2xlIExMQy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC5cbiAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSBcIkxpY2Vuc2VcIik7XG4gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuXG4gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXRcbiAqXG4gKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjBcbiAqXG4gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlXG4gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiBcIkFTIElTXCIgQkFTSVMsXG4gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC5cbiAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmRcbiAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLlxuICogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbiAqL1xuXG5pbXBvcnQge2JhY2tlbmRfdXRpbCwgRGF0YVR5cGUsIEtlcm5lbENvbmZpZywgS2VybmVsRnVuYywgUHJvZCwgUHJvZEF0dHJzLCBQcm9kSW5wdXRzLCBUZW5zb3JJbmZvLCBUeXBlZEFycmF5LCB1cGNhc3RUeXBlLCB1dGlsfSBmcm9tICdAdGVuc29yZmxvdy90ZmpzLWNvcmUnO1xuXG5pbXBvcnQge01hdGhCYWNrZW5kQ1BVfSBmcm9tICcuLi9iYWNrZW5kX2NwdSc7XG5pbXBvcnQge2Fzc2VydE5vdENvbXBsZXh9IGZyb20gJy4uL2NwdV91dGlsJztcbmltcG9ydCB7dHJhbnNwb3NlfSBmcm9tICcuL1RyYW5zcG9zZSc7XG5cbmV4cG9ydCBmdW5jdGlvbiBwcm9kSW1wbChcbiAgICB4U2hhcGU6IG51bWJlcltdLCB4RHR5cGU6IERhdGFUeXBlLCB4VmFsczogVHlwZWRBcnJheSxcbiAgICByZWR1Y3Rpb25BeGVzOiBudW1iZXJbXSk6XG4gICAge291dFZhbHM6IFR5cGVkQXJyYXksIG91dFNoYXBlOiBudW1iZXJbXSwgb3V0RHR5cGU6IERhdGFUeXBlfSB7XG4gIGNvbnN0IFtvdXRTaGFwZSwgcmVkdWNlU2hhcGVdID1cbiAgICAgIGJhY2tlbmRfdXRpbC5jb21wdXRlT3V0QW5kUmVkdWNlU2hhcGVzKHhTaGFwZSwgcmVkdWN0aW9uQXhlcyk7XG4gIGNvbnN0IG91dER0eXBlID0gdXBjYXN0VHlwZSh4RHR5cGUsICdpbnQzMicpO1xuICBjb25zdCBvdXRWYWxzID0gdXRpbC5tYWtlWmVyb3NUeXBlZEFycmF5KFxuICAgICAgICAgICAgICAgICAgICAgIHV0aWwuc2l6ZUZyb21TaGFwZShvdXRTaGFwZSksIG91dER0eXBlKSBhcyBUeXBlZEFycmF5O1xuICBjb25zdCByZWR1Y2VTaXplID0gdXRpbC5zaXplRnJvbVNoYXBlKHJlZHVjZVNoYXBlKTtcblxuICBmb3IgKGxldCBpID0gMDsgaSA8IG91dFZhbHMubGVuZ3RoOyArK2kpIHtcbiAgICBjb25zdCBvZmZzZXQgPSBpICogcmVkdWNlU2l6ZTtcbiAgICBsZXQgcHJvZCA9IDE7XG4gICAgZm9yIChsZXQgaiA9IDA7IGogPCByZWR1Y2VTaXplOyArK2opIHtcbiAgICAgIHByb2QgKj0geFZhbHNbb2Zmc2V0ICsgal07XG4gICAgfVxuICAgIG91dFZhbHNbaV0gPSBwcm9kO1xuICB9XG5cbiAgcmV0dXJuIHtvdXRWYWxzLCBvdXRTaGFwZSwgb3V0RHR5cGV9O1xufVxuXG5leHBvcnQgZnVuY3Rpb24gcHJvZChcbiAgICBhcmdzOiB7aW5wdXRzOiBQcm9kSW5wdXRzLCBiYWNrZW5kOiBNYXRoQmFja2VuZENQVSwgYXR0cnM6IFByb2RBdHRyc30pOlxuICAgIFRlbnNvckluZm8ge1xuICBjb25zdCB7aW5wdXRzLCBiYWNrZW5kLCBhdHRyc30gPSBhcmdzO1xuICBjb25zdCB7eH0gPSBpbnB1dHM7XG4gIGNvbnN0IHtheGlzLCBrZWVwRGltc30gPSBhdHRycztcblxuICBhc3NlcnROb3RDb21wbGV4KHgsICdwcm9kJyk7XG5cbiAgY29uc3QgeFJhbmsgPSB4LnNoYXBlLmxlbmd0aDtcbiAgY29uc3QgYXhlcyA9IHV0aWwucGFyc2VBeGlzUGFyYW0oYXhpcywgeC5zaGFwZSk7XG5cbiAgY29uc3QgcGVybXV0YXRpb24gPSBiYWNrZW5kX3V0aWwuZ2V0QXhlc1Blcm11dGF0aW9uKGF4ZXMsIHhSYW5rKTtcbiAgbGV0IHJlZHVjdGlvbkF4ZXMgPSBheGVzO1xuICBsZXQgcGVybXV0ZWRYID0geDtcbiAgY29uc3QgaW50ZXJtZWRpYXRlVGVuc29ySW5mb3MgPSBbXTtcbiAgaWYgKHBlcm11dGF0aW9uICE9IG51bGwpIHtcbiAgICBwZXJtdXRlZFggPSB0cmFuc3Bvc2Uoe2lucHV0czoge3h9LCBiYWNrZW5kLCBhdHRyczoge3Blcm06IHBlcm11dGF0aW9ufX0pO1xuICAgIGludGVybWVkaWF0ZVRlbnNvckluZm9zLnB1c2gocGVybXV0ZWRYKTtcbiAgICByZWR1Y3Rpb25BeGVzID0gYmFja2VuZF91dGlsLmdldElubmVyTW9zdEF4ZXMocmVkdWN0aW9uQXhlcy5sZW5ndGgsIHhSYW5rKTtcbiAgfVxuXG4gIGNvbnN0IHhWYWxzID0gYmFja2VuZC5kYXRhLmdldChwZXJtdXRlZFguZGF0YUlkKS52YWx1ZXMgYXMgVHlwZWRBcnJheTtcbiAgY29uc3Qge291dFZhbHMsIG91dFNoYXBlLCBvdXREdHlwZX0gPVxuICAgICAgcHJvZEltcGwocGVybXV0ZWRYLnNoYXBlLCBwZXJtdXRlZFguZHR5cGUsIHhWYWxzLCByZWR1Y3Rpb25BeGVzKTtcblxuICBsZXQgcmVzdWx0U2hhcGUgPSBvdXRTaGFwZTtcbiAgaWYgKGtlZXBEaW1zKSB7XG4gICAgcmVzdWx0U2hhcGUgPSBiYWNrZW5kX3V0aWwuZXhwYW5kU2hhcGVUb0tlZXBEaW0ob3V0U2hhcGUsIGF4ZXMpO1xuICB9XG5cbiAgaW50ZXJtZWRpYXRlVGVuc29ySW5mb3MuZm9yRWFjaChcbiAgICAgIHQgPT4gYmFja2VuZC5kaXNwb3NlSW50ZXJtZWRpYXRlVGVuc29ySW5mbyh0KSk7XG5cbiAgcmV0dXJuIGJhY2tlbmQubWFrZVRlbnNvckluZm8ocmVzdWx0U2hhcGUsIG91dER0eXBlLCBvdXRWYWxzKTtcbn1cblxuZXhwb3J0IGNvbnN0IHByb2RDb25maWc6IEtlcm5lbENvbmZpZyA9IHtcbiAga2VybmVsTmFtZTogUHJvZCxcbiAgYmFja2VuZE5hbWU6ICdjcHUnLFxuICBrZXJuZWxGdW5jOiBwcm9kIGFzIHt9IGFzIEtlcm5lbEZ1bmNcbn07XG4iXX0=","/**\n * @license\n * Copyright 2022 Google LLC. All Rights Reserved.\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n * =============================================================================\n */\nimport { util } from '@tensorflow/tfjs-core';\nfunction validateIndices(indices, indicesShape, numParams) {\n indices.forEach((index, i) => {\n if (index < 0 || index >= numParams) {\n const locString = util.indexToLoc(i, indicesShape.length, util.computeStrides(indicesShape))\n .join(',');\n throw new Error(`indices[${locString}] = ${index} is not in [0, ${numParams})`);\n }\n });\n}\nfunction validateSplits(paramsNestedSplits, numParamsDenseValues) {\n // Validate\n for (let dim = 0; dim < paramsNestedSplits.length; ++dim) {\n const splits = paramsNestedSplits[dim];\n const lastSplit = (dim === paramsNestedSplits.length - 1) ?\n numParamsDenseValues :\n paramsNestedSplits[dim + 1].length;\n if (splits.length === 0) {\n throw new Error('Ragged splits may not be empty');\n }\n if (splits[0] < 0) {\n throw new Error('Ragged splits must be non-negative');\n }\n if (splits[splits.length - 1] > lastSplit) {\n throw new Error('Ragged splits must not point past values');\n }\n for (let i = 1; i < splits.length; ++i) {\n if (splits[i - 1] > splits[i]) {\n throw new Error('Ragged splits must be sorted in ascending order');\n }\n }\n }\n}\n// Construct the `splits` output tensors, encoded using a nested vector.\n// Also find the slices of values that need to be copied, and store them\n// in `valueSlices`. The total number of values that will be copied (which\n// we need for allocating the output values tensor) is stored in `numValues`.\nfunction makeSplits(indices, indicesShape, paramsNestedSplits, numParamsDenseValues) {\n const valueSlices = [];\n let numValues = 0;\n const numSplits = indicesShape.length - 1 + paramsNestedSplits.length;\n const outSplits = new Array(numSplits).fill(null).map(() => [0]);\n validateSplits(paramsNestedSplits, numParamsDenseValues);\n // Add `splits` that come from all but the last dimension of the dense\n // Tensor `indices`. In particular, for each dimension D, we add a\n // splits tensor whose values are:\n // range(reduceProd(splits.shape[:D]) + 1) * splits.shape[D+1]\n // E.g., if indices.shape=[2, 3, 4] then we will add splits tensors:\n // [0, 3, 6] # length=2+1, stride=3\n // [0, 4, 8, 12, 16, 20, 24] # length=2*3+1, stride=4\n let nrows = 1;\n for (let dim = 0; dim < indicesShape.length - 1; ++dim) {\n nrows *= indicesShape[dim];\n const rowLength = indicesShape[dim + 1];\n for (let i = 1; i < nrows + 1; ++i) {\n outSplits[dim].push(i * rowLength);\n }\n }\n // Add `splits` that come from `paramsNestedSplits`. Starting with the\n // outermost ragged dimension (i.e., the first `splits` tensor), we work\n // our way in, finding the range of values that should be copied. As we\n // go, we update the output `splits` for each dimension with the appropriate\n // values. In particular, the *lengths* of the slices from `param_splits`\n // should be copied to generate corresponding slice lengths in the output\n // splits. E.g., if we are copying a ragged row with length 4, then we\n // should add a new split point to outSplits that is 4 greater than the\n // previous split point in outSplits.\n for (let i = 0; i < indices.length; ++i) {\n let start = indices[i];\n let limit = indices[i] + 1;\n // Copy splits.\n for (let dim = 0; dim < paramsNestedSplits.length; ++dim) {\n const splits = paramsNestedSplits[dim];\n const outDim = dim + indicesShape.length - 1;\n if (outDim >= 0) {\n const outSplitsOutDim = outSplits[outDim];\n const delta = outSplitsOutDim[outSplitsOutDim.length - 1] - splits[start];\n for (let j = start; j < limit; ++j) {\n outSplits[outDim].push(splits[j + 1] + delta);\n }\n }\n start = splits[start];\n limit = splits[limit];\n }\n if (limit !== start) {\n valueSlices.push([start, limit]);\n numValues += limit - start;\n }\n }\n return { outSplits, valueSlices, numValues };\n}\nfunction getSplits(outSplits) {\n const splitsOut = [];\n for (let i = 0; i < outSplits.length; ++i) {\n const numSplits = outSplits[i].length;\n const splits = util.getArrayFromDType('int32', numSplits);\n splitsOut.push(splits);\n outSplits[i].forEach((value, j) => splits[j] = value);\n }\n return splitsOut;\n}\nfunction computeFlatOuterDims(orig, numOutDims) {\n const outDims = orig.slice(0, numOutDims);\n while (outDims.length < numOutDims) {\n outDims.push(1);\n }\n for (let inDim = numOutDims; inDim < orig.length; inDim++) {\n outDims[numOutDims - 1] *= orig[inDim];\n }\n return outDims;\n}\n// For each slice in `(start, limit)` in `valueSlices`, append\n// `paramsDenseValues[start,...,limit] to `values`. `valueSize` indicates\n// the number of scalars contained in each value paramsDenseValues[i].\nfunction writeValueSlices(paramsDenseValues, paramsDenseValuesShape, valueSlices, valueSize, values, valuesShape) {\n const denseM = computeFlatOuterDims(paramsDenseValuesShape, 2)[1];\n const valuesM = computeFlatOuterDims(valuesShape, 2)[1];\n let outPos = 0;\n for (const slice of valueSlices) {\n for (let i = slice[0]; i < slice[1]; ++i) {\n for (let j = 0; j < valueSize; ++j) {\n values[outPos * valuesM + j] = paramsDenseValues[i * denseM + j];\n }\n ++outPos;\n }\n }\n}\nfunction getValues(paramsDenseValues, paramsDenseValuesShape, paramsDenseValuesDType, valueSlices, numValues) {\n const valuesShape = paramsDenseValuesShape.slice();\n valuesShape[0] = numValues;\n const valuesOut = util.getArrayFromDType(paramsDenseValuesDType, util.sizeFromShape(valuesShape));\n const numElements = paramsDenseValues.length;\n const valueSize = numElements === 0 ? 0 : (numElements / paramsDenseValuesShape[0]);\n writeValueSlices(paramsDenseValues, paramsDenseValuesShape, valueSlices, valueSize, valuesOut, valuesShape);\n return [valuesOut, valuesShape];\n}\nexport function raggedGatherImpl(paramsNestedSplits, paramsNestedSplitsShapes, paramsDenseValues, paramsDenseValuesShape, paramsDenseValuesDType, indices, indicesShape, outputRaggedRank) {\n if (paramsNestedSplits.length === 0) {\n throw new Error('paramsNestedSplits must be non empty');\n }\n if (paramsNestedSplitsShapes[0].length === 0) {\n throw new Error('Split tensors must not be scalars');\n }\n const numParams = paramsNestedSplitsShapes[0][0] - 1;\n validateIndices(indices, indicesShape, numParams);\n if (paramsDenseValuesShape.length === 0) {\n throw new Error('params.rank must be nonzero');\n }\n const numParamsDenseValues = paramsDenseValuesShape[0];\n // Calculate the `splits`, and store the value slices that we need to\n // copy in `valueSlices`.\n const { outSplits, valueSlices, numValues } = makeSplits(indices, indicesShape, paramsNestedSplits, numParamsDenseValues);\n // Write the output tensors.\n const outputNestedSplits = getSplits(outSplits);\n const outputDenseValues = getValues(paramsDenseValues, paramsDenseValuesShape, paramsDenseValuesDType, valueSlices, numValues);\n return [outputNestedSplits, outputDenseValues[0], outputDenseValues[1]];\n}\n//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiUmFnZ2VkR2F0aGVyX2ltcGwuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi8uLi90ZmpzLWJhY2tlbmQtY3B1L3NyYy9rZXJuZWxzL1JhZ2dlZEdhdGhlcl9pbXBsLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBOzs7Ozs7Ozs7Ozs7Ozs7R0FlRztBQUVILE9BQU8sRUFBdUIsSUFBSSxFQUFDLE1BQU0sdUJBQXVCLENBQUM7QUFFakUsU0FBUyxlQUFlLENBQ3BCLE9BQW1CLEVBQUUsWUFBc0IsRUFBRSxTQUFpQjtJQUNoRSxPQUFPLENBQUMsT0FBTyxDQUFDLENBQUMsS0FBYSxFQUFFLENBQVMsRUFBRSxFQUFFO1FBQzNDLElBQUksS0FBSyxHQUFHLENBQUMsSUFBSSxLQUFLLElBQUksU0FBUyxFQUFFO1lBQ25DLE1BQU0sU0FBUyxHQUNYLElBQUksQ0FBQyxVQUFVLENBQ1AsQ0FBQyxFQUFFLFlBQVksQ0FBQyxNQUFNLEVBQUUsSUFBSSxDQUFDLGNBQWMsQ0FBQyxZQUFZLENBQUMsQ0FBQztpQkFDN0QsSUFBSSxDQUFDLEdBQUcsQ0FBQyxDQUFDO1lBQ25CLE1BQU0sSUFBSSxLQUFLLENBQ1gsV0FBVyxTQUFTLE9BQU8sS0FBSyxrQkFBa0IsU0FBUyxHQUFHLENBQUMsQ0FBQztTQUNyRTtJQUNILENBQUMsQ0FBQyxDQUFDO0FBQ0wsQ0FBQztBQUVELFNBQVMsY0FBYyxDQUNuQixrQkFBZ0MsRUFBRSxvQkFBNEI7SUFDaEUsV0FBVztJQUNYLEtBQUssSUFBSSxHQUFHLEdBQUcsQ0FBQyxFQUFFLEdBQUcsR0FBRyxrQkFBa0IsQ0FBQyxNQUFNLEVBQUUsRUFBRSxHQUFHLEVBQUU7UUFDeEQsTUFBTSxNQUFNLEdBQUcsa0JBQWtCLENBQUMsR0FBRyxDQUFDLENBQUM7UUFDdkMsTUFBTSxTQUFTLEdBQUcsQ0FBQyxHQUFHLEtBQUssa0JBQWtCLENBQUMsTUFBTSxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUM7WUFDdkQs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TUFBTSxrQkFBa0IsR0FBRyxTQUFTLENBQUMsU0FBUyxDQUFDLENBQUM7SUFDaEQsTUFBTSxpQkFBaUIsR0FBRyxTQUFTLENBQy9CLGlCQUFpQixFQUFFLHNCQUFzQixFQUFFLHNCQUFzQixFQUNqRSxXQUFXLEVBQUUsU0FBUyxDQUFDLENBQUM7SUFFNUIsT0FBTyxDQUFDLGtCQUFrQixFQUFFLGlCQUFpQixDQUFDLENBQUMsQ0FBQyxFQUFFLGlCQUFpQixDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUM7QUFDMUUsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbIi8qKlxuICogQGxpY2Vuc2VcbiAqIENvcHlyaWdodCAyMDIyIEdvb2dsZSBMTEMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuXG4gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgXCJMaWNlbnNlXCIpO1xuICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLlxuICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0XG4gKlxuICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wXG4gKlxuICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZVxuICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gXCJBUyBJU1wiIEJBU0lTLFxuICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuXG4gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kXG4gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS5cbiAqID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4gKi9cblxuaW1wb3J0IHtEYXRhVHlwZSwgVHlwZWRBcnJheSwgdXRpbH0gZnJvbSAnQHRlbnNvcmZsb3cvdGZqcy1jb3JlJztcblxuZnVuY3Rpb24gdmFsaWRhdGVJbmRpY2VzKFxuICAgIGluZGljZXM6IFR5cGVkQXJyYXksIGluZGljZXNTaGFwZTogbnVtYmVyW10sIG51bVBhcmFtczogbnVtYmVyKSB7XG4gIGluZGljZXMuZm9yRWFjaCgoaW5kZXg6IG51bWJlciwgaTogbnVtYmVyKSA9PiB7XG4gICAgaWYgKGluZGV4IDwgMCB8fCBpbmRleCA+PSBudW1QYXJhbXMpIHtcbiAgICAgIGNvbnN0IGxvY1N0cmluZyA9XG4gICAgICAgICAgdXRpbC5pbmRleFRvTG9jKFxuICAgICAgICAgICAgICAgICAgaSwgaW5kaWNlc1NoYXBlLmxlbmd0aCwgdXRpbC5jb21wdXRlU3RyaWRlcyhpbmRpY2VzU2hhcGUpKVxuICAgICAgICAgICAgICAuam9pbignLCcpO1xuICAgICAgdGhyb3cgbmV3IEVycm9yKFxuICAgICAgICAgIGBpbmRpY2VzWyR7bG9jU3RyaW5nfV0gPSAke2luZGV4fSBpcyBub3QgaW4gWzAsICR7bnVtUGFyYW1zfSlgKTtcbiAgICB9XG4gIH0pO1xufVxuXG5mdW5jdGlvbiB2YWxpZGF0ZVNwbGl0cyhcbiAgICBwYXJhbXNOZXN0ZWRTcGxpdHM6IFR5cGVkQXJyYXlbXSwgbnVtUGFyYW1zRGVuc2VWYWx1ZXM6IG51bWJlcikge1xuICAvLyBWYWxpZGF0ZVxuICBmb3IgKGxldCBkaW0gPSAwOyBkaW0gPCBwYXJhbXNOZXN0ZWRTcGxpdHMubGVuZ3RoOyArK2RpbSkge1xuICAgIGNvbnN0IHNwbGl0cyA9IHBhcmFtc05lc3RlZFNwbGl0c1tkaW1dO1xuICAgIGNvbnN0IGxhc3RTcGxpdCA9IChkaW0gPT09IHBhcmFtc05lc3RlZFNwbGl0cy5sZW5ndGggLSAxKSA/XG4gICAgICAgIG51bVBhcmFtc0RlbnNlVmFsdWVzIDpcbiAgICAgICAgcGFyYW1zTmVzdGVkU3BsaXRzW2RpbSArIDFdLmxlbmd0aDtcbiAgICBpZiAoc3BsaXRzLmxlbmd0aCA9PT0gMCkge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKCdSYWdnZWQgc3BsaXRzIG1heSBub3QgYmUgZW1wdHknKTtcbiAgICB9XG4gICAgaWYgKHNwbGl0c1swXSA8IDApIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcignUmFnZ2VkIHNwbGl0cyBtdXN0IGJlIG5vbi1uZWdhdGl2ZScpO1xuICAgIH1cbiAgICBpZiAoc3BsaXRzW3NwbGl0cy5sZW5ndGggLSAxXSA+IGxhc3RTcGxpdCkge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKCdSYWdnZWQgc3BsaXRzIG11c3Qgbm90IHBvaW50IHBhc3QgdmFsdWVzJyk7XG4gICAgfVxuICAgIGZvciAobGV0IGkgPSAxOyBpIDwgc3BsaXRzLmxlbmd0aDsgKytpKSB7XG4gICAgICBpZiAoc3BsaXRzW2kgLSAxXSA+IHNwbGl0c1tpXSkge1xuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ1JhZ2dlZCBzcGxpdHMgbXVzdCBiZSBzb3J0ZWQgaW4gYXNjZW5kaW5nIG9yZGVyJyk7XG4gICAgICB9XG4gICAgfVxuICB9XG59XG5cbi8vIENvbnN0cnVjdCB0aGUgYHNwbGl0c2Agb3V0cHV0IHRlbnNvcnMsIGVuY29kZWQgdXNpbmcgYSBuZXN0ZWQgdmVjdG9yLlxuLy8gQWxzbyBmaW5kIHRoZSBzbGljZXMgb2YgdmFsdWVzIHRoYXQgbmVlZCB0byBiZSBjb3BpZWQsIGFuZCBzdG9yZSB0aGVtXG4vLyBpbiBgdmFsdWVTbGljZXNgLiAgVGhlIHRvdGFsIG51bWJlciBvZiB2YWx1ZXMgdGhhdCB3aWxsIGJlIGNvcGllZCAod2hpY2hcbi8vIHdlIG5lZWQgZm9yIGFsbG9jYXRpbmcgdGhlIG91dHB1dCB2YWx1ZXMgdGVuc29yKSBpcyBzdG9yZWQgaW4gYG51bVZhbHVlc2AuXG5mdW5jdGlvbiBtYWtlU3BsaXRzKFxuICAgIGluZGljZXM6IFR5cGVkQXJyYXksIGluZGljZXNTaGFwZTogbnVtYmVyW10sXG4gICAgcGFyYW1zTmVzdGVkU3BsaXRzOiBUeXBlZEFycmF5W10sIG51bVBhcmFtc0RlbnNlVmFsdWVzOiBudW1iZXIpIHtcbiAgY29uc3QgdmFsdWVTbGljZXM6IEFycmF5PFtudW1iZXIsIG51bWJlcl0+ID0gW107XG4gIGxldCBudW1WYWx1ZXMgPSAwO1xuXG4gIGNvbnN0IG51bVNwbGl0cyA9IGluZGljZXNTaGFwZS5sZW5ndGggLSAxICsgcGFyYW1zTmVzdGVkU3BsaXRzLmxlbmd0aDtcbiAgY29uc3Qgb3V0U3BsaXRzID0gbmV3IEFycmF5KG51bVNwbGl0cykuZmlsbChudWxsKS5tYXAoKCkgPT4gWzBdKTtcblxuICB2YWxpZGF0ZVNwbGl0cyhwYXJhbXNOZXN0ZWRTcGxpdHMsIG51bVBhcmFtc0RlbnNlVmFsdWVzKTtcblxuICAvLyBBZGQgYHNwbGl0c2AgdGhhdCBjb21lIGZyb20gYWxsIGJ1dCB0aGUgbGFzdCBkaW1lbnNpb24gb2YgdGhlIGRlbnNlXG4gIC8vIFRlbnNvciBgaW5kaWNlc2AuICBJbiBwYXJ0aWN1bGFyLCBmb3IgZWFjaCBkaW1lbnNpb24gRCwgd2UgYWRkIGFcbiAgLy8gc3BsaXRzIHRlbnNvciB3aG9zZSB2YWx1ZXMgYXJlOlxuICAvLyAgIHJhbmdlKHJlZHVjZVByb2Qoc3BsaXRzLnNoYXBlWzpEXSkgKyAxKSAqIHNwbGl0cy5zaGFwZVtEKzFdXG4gIC8vIEUuZy4sIGlmIGluZGljZXMuc2hhcGU9WzIsIDMsIDRdIHRoZW4gd2Ugd2lsbCBhZGQgc3BsaXRzIHRlbnNvcnM6XG4gIC8vICAgWzAsIDMsIDZdICAgICAgICAgICAgICAgICAgICAjIGxlbmd0aD0yKzEsIHN0cmlkZT0zXG4gIC8vICAgWzAsIDQsIDgsIDEyLCAxNiwgMjAsIDI0XSAgICAjIGxlbmd0aD0yKjMrMSwgc3RyaWRlPTRcbiAgbGV0IG5yb3dzID0gMTtcbiAgZm9yIChsZXQgZGltID0gMDsgZGltIDwgaW5kaWNlc1NoYXBlLmxlbmd0aCAtIDE7ICsrZGltKSB7XG4gICAgbnJvd3MgKj0gaW5kaWNlc1NoYXBlW2RpbV07XG4gICAgY29uc3Qgcm93TGVuZ3RoID0gaW5kaWNlc1NoYXBlW2RpbSArIDFdO1xuICAgIGZvciAobGV0IGkgPSAxOyBpIDwgbnJvd3MgKyAxOyArK2kpIHtcbiAgICAgIG91dFNwbGl0c1tkaW1dLnB1c2goaSAqIHJvd0xlbmd0aCk7XG4gICAgfVxuICB9XG5cbiAgLy8gQWRkIGBzcGxpdHNgIHRoYXQgY29tZSBmcm9tIGBwYXJhbXNOZXN0ZWRTcGxpdHNgLiAgU3RhcnRpbmcgd2l0aCB0aGVcbiAgLy8gb3V0ZXJtb3N0IHJhZ2dlZCBkaW1lbnNpb24gKGkuZS4sIHRoZSBmaXJzdCBgc3BsaXRzYCB0ZW5zb3IpLCB3ZSB3b3JrXG4gIC8vIG91ciB3YXkgaW4sIGZpbmRpbmcgdGhlIHJhbmdlIG9mIHZhbHVlcyB0aGF0IHNob3VsZCBiZSBjb3BpZWQuICBBcyB3ZVxuICAvLyBnbywgd2UgdXBkYXRlIHRoZSBvdXRwdXQgYHNwbGl0c2AgZm9yIGVhY2ggZGltZW5zaW9uIHdpdGggdGhlIGFwcHJvcHJpYXRlXG4gIC8vIHZhbHVlcy4gIEluIHBhcnRpY3VsYXIsIHRoZSAqbGVuZ3Rocyogb2YgdGhlIHNsaWNlcyBmcm9tIGBwYXJhbV9zcGxpdHNgXG4gIC8vIHNob3VsZCBiZSBjb3BpZWQgdG8gZ2VuZXJhdGUgY29ycmVzcG9uZGluZyBzbGljZSBsZW5ndGhzIGluIHRoZSBvdXRwdXRcbiAgLy8gc3BsaXRzLiAgRS5nLiwgaWYgd2UgYXJlIGNvcHlpbmcgYSByYWdnZWQgcm93IHdpdGggbGVuZ3RoIDQsIHRoZW4gd2VcbiAgLy8gc2hvdWxkIGFkZCBhIG5ldyBzcGxpdCBwb2ludCB0byBvdXRTcGxpdHMgdGhhdCBpcyA0IGdyZWF0ZXIgdGhhbiB0aGVcbiAgLy8gcHJldmlvdXMgc3BsaXQgcG9pbnQgaW4gb3V0U3BsaXRzLlxuICBmb3IgKGxldCBpID0gMDsgaSA8IGluZGljZXMubGVuZ3RoOyArK2kpIHtcbiAgICBsZXQgc3RhcnQgPSBpbmRpY2VzW2ldO1xuICAgIGxldCBsaW1pdCA9IGluZGljZXNbaV0gKyAxO1xuXG4gICAgLy8gQ29weSBzcGxpdHMuXG4gICAgZm9yIChsZXQgZGltID0gMDsgZGltIDwgcGFyYW1zTmVzdGVkU3BsaXRzLmxlbmd0aDsgKytkaW0pIHtcbiAgICAgIGNvbnN0IHNwbGl0cyA9IHBhcmFtc05lc3RlZFNwbGl0c1tkaW1dO1xuICAgICAgY29uc3Qgb3V0RGltID0gZGltICsgaW5kaWNlc1NoYXBlLmxlbmd0aCAtIDE7XG4gICAgICBpZiAob3V0RGltID49IDApIHtcbiAgICAgICAgY29uc3Qgb3V0U3BsaXRzT3V0RGltID0gb3V0U3BsaXRzW291dERpbV07XG4gICAgICAgIGNvbnN0IGRlbHRhID1cbiAgICAgICAgICAgIG91dFNwbGl0c091dERpbVtvdXRTcGxpdHNPdXREaW0ubGVuZ3RoIC0gMV0gLSBzcGxpdHNbc3RhcnRdO1xuICAgICAgICBmb3IgKGxldCBqID0gc3RhcnQ7IGogPCBsaW1pdDsgKytqKSB7XG4gICAgICAgICAgb3V0U3BsaXRzW291dERpbV0ucHVzaChzcGxpdHNbaiArIDFdICsgZGVsdGEpO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgICBzdGFydCA9IHNwbGl0c1tzdGFydF07XG4gICAgICBsaW1pdCA9IHNwbGl0c1tsaW1pdF07XG4gICAgfVxuICAgIGlmIChsaW1pdCAhPT0gc3RhcnQpIHtcbiAgICAgIHZhbHVlU2xpY2VzLnB1c2goW3N0YXJ0LCBsaW1pdF0pO1xuICAgICAgbnVtVmFsdWVzICs9IGxpbWl0IC0gc3RhcnQ7XG4gICAgfVxuICB9XG5cbiAgcmV0dXJuIHtvdXRTcGxpdHMsIHZhbHVlU2xpY2VzLCBudW1WYWx1ZXN9O1xufVxuXG5mdW5jdGlvbiBnZXRTcGxpdHMob3V0U3BsaXRzOiBudW1iZXJbXVtdKSB7XG4gIGNvbnN0IHNwbGl0c091dDogVHlwZWRBcnJheVtdID0gW107XG4gIGZvciAobGV0IGkgPSAwOyBpIDwgb3V0U3BsaXRzLmxlbmd0aDsgKytpKSB7XG4gICAgY29uc3QgbnVtU3BsaXRzID0gb3V0U3BsaXRzW2ldLmxlbmd0aDtcbiAgICBjb25zdCBzcGxpdHMgPSB1dGlsLmdldEFycmF5RnJvbURUeXBlKCdpbnQzMicsIG51bVNwbGl0cykgYXMgVHlwZWRBcnJheTtcbiAgICBzcGxpdHNPdXQucHVzaChzcGxpdHMpO1xuXG4gICAgb3V0U3BsaXRzW2ldLmZvckVhY2goKHZhbHVlLCBqOiBudW1iZXIpID0+IHNwbGl0c1tqXSA9IHZhbHVlKTtcbiAgfVxuXG4gIHJldHVybiBzcGxpdHNPdXQ7XG59XG5cbmZ1bmN0aW9uIGNvbXB1dGVGbGF0T3V0ZXJEaW1zKG9yaWc6IG51bWJlcltdLCBudW1PdXREaW1zOiBudW1iZXIpIHtcbiAgY29uc3Qgb3V0RGltcyA9IG9yaWcuc2xpY2UoMCwgbnVtT3V0RGltcyk7XG4gIHdoaWxlIChvdXREaW1zLmxlbmd0aCA8IG51bU91dERpbXMpIHtcbiAgICBvdXREaW1zLnB1c2goMSk7XG4gIH1cblxuICBmb3IgKGxldCBpbkRpbSA9IG51bU91dERpbXM7IGluRGltIDwgb3JpZy5sZW5ndGg7IGluRGltKyspIHtcbiAgICBvdXREaW1zW251bU91dERpbXMgLSAxXSAqPSBvcmlnW2luRGltXTtcbiAgfVxuXG4gIHJldHVybiBvdXREaW1zO1xufVxuLy8gRm9yIGVhY2ggc2xpY2UgaW4gYChzdGFydCwgbGltaXQpYCBpbiBgdmFsdWVTbGljZXNgLCBhcHBlbmRcbi8vIGBwYXJhbXNEZW5zZVZhbHVlc1tzdGFydCwuLi4sbGltaXRdIHRvIGB2YWx1ZXNgLiAgYHZhbHVlU2l6ZWAgaW5kaWNhdGVzXG4vLyB0aGUgbnVtYmVyIG9mIHNjYWxhcnMgY29udGFpbmVkIGluIGVhY2ggdmFsdWUgcGFyYW1zRGVuc2VWYWx1ZXNbaV0uXG5mdW5jdGlvbiB3cml0ZVZhbHVlU2xpY2VzKFxuICAgIHBhcmFtc0RlbnNlVmFsdWVzOiBUeXBlZEFycmF5LCBwYXJhbXNEZW5zZVZhbHVlc1NoYXBlOiBudW1iZXJbXSxcbiAgICB2YWx1ZVNsaWNlczogQXJyYXk8W251bWJlciwgbnVtYmVyXT4sIHZhbHVlU2l6ZTogbnVtYmVyLCB2YWx1ZXM6IFR5cGVkQXJyYXksXG4gICAgdmFsdWVzU2hhcGU6IG51bWJlcltdKSB7XG4gIGNvbnN0IGRlbnNlTSA9IGNvbXB1dGVGbGF0T3V0ZXJEaW1zKHBhcmFtc0RlbnNlVmFsdWVzU2hhcGUsIDIpWzFdO1xuICBjb25zdCB2YWx1ZXNNID0gY29tcHV0ZUZsYXRPdXRlckRpbXModmFsdWVzU2hhcGUsIDIpWzFdO1xuXG4gIGxldCBvdXRQb3MgPSAwO1xuICBmb3IgKGNvbnN0IHNsaWNlIG9mIHZhbHVlU2xpY2VzKSB7XG4gICAgZm9yIChsZXQgaSA9IHNsaWNlWzBdOyBpIDwgc2xpY2VbMV07ICsraSkge1xuICAgICAgZm9yIChsZXQgaiA9IDA7IGogPCB2YWx1ZVNpemU7ICsraikge1xuICAgICAgICB2YWx1ZXNbb3V0UG9zICogdmFsdWVzTSArIGpdID0gcGFyYW1zRGVuc2VWYWx1ZXNbaSAqIGRlbnNlTSArIGpdO1xuICAgICAgfVxuICAgICAgKytvdXRQb3M7XG4gICAgfVxuICB9XG59XG5cbmZ1bmN0aW9uIGdldFZhbHVlcyhcbiAgICBwYXJhbXNEZW5zZVZhbHVlczogVHlwZWRBcnJheSwgcGFyYW1zRGVuc2VWYWx1ZXNTaGFwZTogbnVtYmVyW10sXG4gICAgcGFyYW1zRGVuc2VWYWx1ZXNEVHlwZTogRGF0YVR5cGUsIHZhbHVlU2xpY2VzOiBBcnJheTxbbnVtYmVyLCBudW1iZXJdPixcbiAgICBudW1WYWx1ZXM6IG51bWJlcik6IFtUeXBlZEFycmF5LCBudW1iZXJbXV0ge1xuICBjb25zdCB2YWx1ZXNTaGFwZSA9IHBhcmFtc0RlbnNlVmFsdWVzU2hhcGUuc2xpY2UoKTtcbiAgdmFsdWVzU2hhcGVbMF0gPSBudW1WYWx1ZXM7XG5cbiAgY29uc3QgdmFsdWVzT3V0ID0gdXRpbC5nZXRBcnJheUZyb21EVHlwZShcbiAgICAgICAgICAgICAgICAgICAgICAgIHBhcmFtc0RlbnNlVmFsdWVzRFR5cGUsXG4gICAgICAgICAgICAgICAgICAgICAgICB1dGlsLnNpemVGcm9tU2hhcGUodmFsdWVzU2hhcGUpKSBhcyBUeXBlZEFycmF5O1xuXG4gIGNvbnN0IG51bUVsZW1lbnRzID0gcGFyYW1zRGVuc2VWYWx1ZXMubGVuZ3RoO1xuICBjb25zdCB2YWx1ZVNpemUgPVxuICAgICAgbnVtRWxlbWVudHMgPT09IDAgPyAwIDogKG51bUVsZW1lbnRzIC8gcGFyYW1zRGVuc2VWYWx1ZXNTaGFwZVswXSk7XG4gIHdyaXRlVmFsdWVTbGljZXMoXG4gICAgICBwYXJhbXNEZW5zZVZhbHVlcywgcGFyYW1zRGVuc2VWYWx1ZXNTaGFwZSwgdmFsdWVTbGljZXMsIHZhbHVlU2l6ZSxcbiAgICAgIHZhbHVlc091dCwgdmFsdWVzU2hhcGUpO1xuXG4gIHJldHVybiBbdmFsdWVzT3V0LCB2YWx1ZXNTaGFwZV07XG59XG5leHBvcnQgZnVuY3Rpb24gcmFnZ2VkR2F0aGVySW1wbChcbiAgICBwYXJhbXNOZXN0ZWRTcGxpdHM6IFR5cGVkQXJyYXlbXSwgcGFyYW1zTmVzdGVkU3BsaXRzU2hhcGVzOiBudW1iZXJbXVtdLFxuICAgIHBhcmFtc0RlbnNlVmFsdWVzOiBUeXBlZEFycmF5LCBwYXJhbXNEZW5zZVZhbHVlc1NoYXBlOiBudW1iZXJbXSxcbiAgICBwYXJhbXNEZW5zZVZhbHVlc0RUeXBlOiBEYXRhVHlwZSwgaW5kaWNlczogVHlwZWRBcnJheSxcbiAgICBpbmRpY2VzU2hhcGU6IG51bWJlcltdLFxuICAgIG91dHB1dFJhZ2dlZFJhbms6IG51bWJlcik6IFtUeXBlZEFycmF5W10sIFR5cGVkQXJyYXksIG51bWJlcltdXSB7XG4gIGlmIChwYXJhbXNOZXN0ZWRTcGxpdHMubGVuZ3RoID09PSAwKSB7XG4gICAgdGhyb3cgbmV3IEVycm9yKCdwYXJhbXNOZXN0ZWRTcGxpdHMgbXVzdCBiZSBub24gZW1wdHknKTtcbiAgfVxuXG4gIGlmIChwYXJhbXNOZXN0ZWRTcGxpdHNTaGFwZXNbMF0ubGVuZ3RoID09PSAwKSB7XG4gICAgdGhyb3cgbmV3IEVycm9yKCdTcGxpdCB0ZW5zb3JzIG11c3Qgbm90IGJlIHNjYWxhcnMnKTtcbiAgfVxuICBjb25zdCBudW1QYXJhbXMgPSBwYXJhbXNOZXN0ZWRTcGxpdHNTaGFwZXNbMF1bMF0gLSAxO1xuICB2YWxpZGF0ZUluZGljZXMoaW5kaWNlcywgaW5kaWNlc1NoYXBlLCBudW1QYXJhbXMpO1xuXG4gIGlmIChwYXJhbXNEZW5zZVZhbHVlc1NoYXBlLmxlbmd0aCA9PT0gMCkge1xuICAgIHRocm93IG5ldyBFcnJvcigncGFyYW1zLnJhbmsgbXVzdCBiZSBub256ZXJvJyk7XG4gIH1cbiAgY29uc3QgbnVtUGFyYW1zRGVuc2VWYWx1ZXMgPSBwYXJhbXNEZW5zZVZhbHVlc1NoYXBlWzBdO1xuXG4gIC8vIENhbGN1bGF0ZSB0aGUgYHNwbGl0c2AsIGFuZCBzdG9yZSB0aGUgdmFsdWUgc2xpY2VzIHRoYXQgd2UgbmVlZCB0b1xuICAvLyBjb3B5IGluIGB2YWx1ZVNsaWNlc2AuXG4gIGNvbnN0IHtvdXRTcGxpdHMsIHZhbHVlU2xpY2VzLCBudW1WYWx1ZXN9ID0gbWFrZVNwbGl0cyhcbiAgICAgIGluZGljZXMsIGluZGljZXNTaGFwZSwgcGFyYW1zTmVzdGVkU3BsaXRzLCBudW1QYXJhbXNEZW5zZVZhbHVlcyk7XG5cbiAgLy8gV3JpdGUgdGhlIG91dHB1dCB0ZW5zb3JzLlxuICBjb25zdCBvdXRwdXROZXN0ZWRTcGxpdHMgPSBnZXRTcGxpdHMob3V0U3BsaXRzKTtcbiAgY29uc3Qgb3V0cHV0RGVuc2VWYWx1ZXMgPSBnZXRWYWx1ZXMoXG4gICAgICBwYXJhbXNEZW5zZVZhbHVlcywgcGFyYW1zRGVuc2VWYWx1ZXNTaGFwZSwgcGFyYW1zRGVuc2VWYWx1ZXNEVHlwZSxcbiAgICAgIHZhbHVlU2xpY2VzLCBudW1WYWx1ZXMpO1xuXG4gIHJldHVybiBbb3V0cHV0TmVzdGVkU3BsaXRzLCBvdXRwdXREZW5zZVZhbHVlc1swXSwgb3V0cHV0RGVuc2VWYWx1ZXNbMV1dO1xufVxuIl19","/**\n * @license\n * Copyright 2022 Google LLC. All Rights Reserved.\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n * =============================================================================\n */\nimport { RaggedGather } from '@tensorflow/tfjs-core';\nimport { raggedGatherImpl } from './RaggedGather_impl';\nexport function raggedGather(args) {\n const { inputs, backend, attrs } = args;\n const { paramsNestedSplits, paramsDenseValues, indices } = inputs;\n const { outputRaggedRank } = attrs;\n const $paramsNestedSplits = paramsNestedSplits.map(t => backend.data.get(t.dataId).values);\n const $paramsNestedSplitsShapes = paramsNestedSplits.map(t => t.shape);\n const $paramsDenseValues = backend.data.get(paramsDenseValues.dataId).values;\n const $indices = backend.data.get(indices.dataId).values;\n const [outputNestedSplits, outputDenseValues, outputDenseValuesShape] = raggedGatherImpl($paramsNestedSplits, $paramsNestedSplitsShapes, $paramsDenseValues, paramsDenseValues.shape, paramsDenseValues.dtype, $indices, indices.shape, outputRaggedRank);\n const outputNestedSplitsTensors = outputNestedSplits.map((splits) => backend.makeTensorInfo([splits.length], 'int32', splits));\n const outputDenseValuesTensor = backend.makeTensorInfo(outputDenseValuesShape, paramsDenseValues.dtype, outputDenseValues);\n return outputNestedSplitsTensors.concat([outputDenseValuesTensor]);\n}\nexport const raggedGatherConfig = {\n kernelName: RaggedGather,\n backendName: 'cpu',\n kernelFunc: raggedGather,\n};\n//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiUmFnZ2VkR2F0aGVyLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vLi4vdGZqcy1iYWNrZW5kLWNwdS9zcmMva2VybmVscy9SYWdnZWRHYXRoZXIudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUE7Ozs7Ozs7Ozs7Ozs7OztHQWVHO0FBRUgsT0FBTyxFQUEyQixZQUFZLEVBQWdFLE1BQU0sdUJBQXVCLENBQUM7QUFJNUksT0FBTyxFQUFDLGdCQUFnQixFQUFDLE1BQU0scUJBQXFCLENBQUM7QUFFckQsTUFBTSxVQUFVLFlBQVksQ0FBQyxJQUk1QjtJQUNDLE1BQU0sRUFBQyxNQUFNLEVBQUUsT0FBTyxFQUFFLEtBQUssRUFBQyxHQUFHLElBQUksQ0FBQztJQUN0QyxNQUFNLEVBQUMsa0JBQWtCLEVBQUUsaUJBQWlCLEVBQUUsT0FBTyxFQUFDLEdBQUcsTUFBTSxDQUFDO0lBQ2hFLE1BQU0sRUFBQyxnQkFBZ0IsRUFBQyxHQUFHLEtBQUssQ0FBQztJQUVqQyxNQUFNLG1CQUFtQixHQUFHLGtCQUFrQixDQUFDLEdBQUcsQ0FDOUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxPQUFPLENBQUMsSUFBSSxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsTUFBTSxDQUFDLENBQUMsTUFBb0IsQ0FBQyxDQUFDO0lBQzFELE1BQU0seUJBQXlCLEdBQUcsa0JBQWtCLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLEtBQUssQ0FBQyxDQUFDO0lBQ3ZFLE1BQU0sa0JBQWtCLEdBQ3BCLE9BQU8sQ0FBQyxJQUFJLENBQUMsR0FBRyxDQUFDLGlCQUFpQixDQUFDLE1BQU0sQ0FBQyxDQUFDLE1BQW9CLENBQUM7SUFDcEUsTUFBTSxRQUFRLEdBQUcsT0FBTyxDQUFDLElBQUksQ0FBQyxHQUFHLENBQUMsT0FBTyxDQUFDLE1BQU0sQ0FBQyxDQUFDLE1BQW9CLENBQUM7SUFFdkUsTUFBTSxDQUFDLGtCQUFrQixFQUFFLGlCQUFpQixFQUFFLHNCQUFzQixDQUFDLEdBQ2pFLGdCQUFnQixDQUNaLG1CQUFtQixFQUFFLHlCQUF5QixFQUFFLGtCQUFrQixFQUNsRSxpQkFBaUIsQ0FBQyxLQUFLLEVBQUUsaUJBQWlCLENBQUMsS0FBSyxFQUFFLFFBQVEsRUFDMUQsT0FBTyxDQUFDLEtBQUssRUFBRSxnQkFBZ0IsQ0FBQyxDQUFDO0lBRXpDLE1BQU0seUJBQXlCLEdBQUcsa0JBQWtCLENBQUMsR0FBRyxDQUNwRCxDQUFDLE1BQU0sRUFBRSxFQUFFLENBQUMsT0FBTyxDQUFDLGNBQWMsQ0FBQyxDQUFDLE1BQU0sQ0FBQyxNQUFNLENBQUMsRUFBRSxPQUFPLEVBQUUsTUFBTSxDQUFDLENBQUMsQ0FBQztJQUUxRSxNQUFNLHVCQUF1QixHQUFHLE9BQU8sQ0FBQyxjQUFjLENBQ2xELHNCQUFzQixFQUFFLGlCQUFpQixDQUFDLEtBQUssRUFBRSxpQkFBaUIsQ0FBQyxDQUFDO0lBRXhFLE9BQU8seUJBQXlCLENBQUMsTUFBTSxDQUFDLENBQUMsdUJBQXVCLENBQUMsQ0FBQyxDQUFDO0FBQ3JFLENBQUM7QUFFRCxNQUFNLENBQUMsTUFBTSxrQkFBa0IsR0FBaUI7SUFDOUMsVUFBVSxFQUFFLFlBQVk7SUFDeEIsV0FBVyxFQUFFLEtBQUs7SUFDbEIsVUFBVSxFQUFFLFlBQWdDO0NBQzdDLENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyIvKipcbiAqIEBsaWNlbnNlXG4gKiBDb3B5cmlnaHQgMjAyMiBHb29nbGUgTExDLiBBbGwgUmlnaHRzIFJlc2VydmVkLlxuICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlIFwiTGljZW5zZVwiKTtcbiAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS5cbiAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdFxuICpcbiAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMFxuICpcbiAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmVcbiAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuIFwiQVMgSVNcIiBCQVNJUyxcbiAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLlxuICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZFxuICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuXG4gKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuICovXG5cbmltcG9ydCB7S2VybmVsQ29uZmlnLCBLZXJuZWxGdW5jLCBSYWdnZWRHYXRoZXIsIFJhZ2dlZEdhdGhlckF0dHJzLCBSYWdnZWRHYXRoZXJJbnB1dHMsIFRlbnNvckluZm8sIFR5cGVkQXJyYXl9IGZyb20gJ0B0ZW5zb3JmbG93L3RmanMtY29yZSc7XG5cbmltcG9ydCB7TWF0aEJhY2tlbmRDUFV9IGZyb20gJy4uL2JhY2tlbmRfY3B1JztcblxuaW1wb3J0IHtyYWdnZWRHYXRoZXJJbXBsfSBmcm9tICcuL1JhZ2dlZEdhdGhlcl9pbXBsJztcblxuZXhwb3J0IGZ1bmN0aW9uIHJhZ2dlZEdhdGhlcihhcmdzOiB7XG4gIGlucHV0czogUmFnZ2VkR2F0aGVySW5wdXRzLFxuICBiYWNrZW5kOiBNYXRoQmFja2VuZENQVSxcbiAgYXR0cnM6IFJhZ2dlZEdhdGhlckF0dHJzXG59KTogVGVuc29ySW5mb1tdIHtcbiAgY29uc3Qge2lucHV0cywgYmFja2VuZCwgYXR0cnN9ID0gYXJncztcbiAgY29uc3Qge3BhcmFtc05lc3RlZFNwbGl0cywgcGFyYW1zRGVuc2VWYWx1ZXMsIGluZGljZXN9ID0gaW5wdXRzO1xuICBjb25zdCB7b3V0cHV0UmFnZ2VkUmFua30gPSBhdHRycztcblxuICBjb25zdCAkcGFyYW1zTmVzdGVkU3BsaXRzID0gcGFyYW1zTmVzdGVkU3BsaXRzLm1hcChcbiAgICAgIHQgPT4gYmFja2VuZC5kYXRhLmdldCh0LmRhdGFJZCkudmFsdWVzIGFzIFR5cGVkQXJyYXkpO1xuICBjb25zdCAkcGFyYW1zTmVzdGVkU3BsaXRzU2hhcGVzID0gcGFyYW1zTmVzdGVkU3BsaXRzLm1hcCh0ID0+IHQuc2hhcGUpO1xuICBjb25zdCAkcGFyYW1zRGVuc2VWYWx1ZXMgPVxuICAgICAgYmFja2VuZC5kYXRhLmdldChwYXJhbXNEZW5zZVZhbHVlcy5kYXRhSWQpLnZhbHVlcyBhcyBUeXBlZEFycmF5O1xuICBjb25zdCAkaW5kaWNlcyA9IGJhY2tlbmQuZGF0YS5nZXQoaW5kaWNlcy5kYXRhSWQpLnZhbHVlcyBhcyBUeXBlZEFycmF5O1xuXG4gIGNvbnN0IFtvdXRwdXROZXN0ZWRTcGxpdHMsIG91dHB1dERlbnNlVmFsdWVzLCBvdXRwdXREZW5zZVZhbHVlc1NoYXBlXSA9XG4gICAgICByYWdnZWRHYXRoZXJJbXBsKFxuICAgICAgICAgICRwYXJhbXNOZXN0ZWRTcGxpdHMsICRwYXJhbXNOZXN0ZWRTcGxpdHNTaGFwZXMsICRwYXJhbXNEZW5zZVZhbHVlcyxcbiAgICAgICAgICBwYXJhbXNEZW5zZVZhbHVlcy5zaGFwZSwgcGFyYW1zRGVuc2VWYWx1ZXMuZHR5cGUsICRpbmRpY2VzLFxuICAgICAgICAgIGluZGljZXMuc2hhcGUsIG91dHB1dFJhZ2dlZFJhbmspO1xuXG4gIGNvbnN0IG91dHB1dE5lc3RlZFNwbGl0c1RlbnNvcnMgPSBvdXRwdXROZXN0ZWRTcGxpdHMubWFwKFxuICAgICAgKHNwbGl0cykgPT4gYmFja2VuZC5tYWtlVGVuc29ySW5mbyhbc3BsaXRzLmxlbmd0aF0sICdpbnQzMicsIHNwbGl0cykpO1xuXG4gIGNvbnN0IG91dHB1dERlbnNlVmFsdWVzVGVuc29yID0gYmFja2VuZC5tYWtlVGVuc29ySW5mbyhcbiAgICAgIG91dHB1dERlbnNlVmFsdWVzU2hhcGUsIHBhcmFtc0RlbnNlVmFsdWVzLmR0eXBlLCBvdXRwdXREZW5zZVZhbHVlcyk7XG5cbiAgcmV0dXJuIG91dHB1dE5lc3RlZFNwbGl0c1RlbnNvcnMuY29uY2F0KFtvdXRwdXREZW5zZVZhbHVlc1RlbnNvcl0pO1xufVxuXG5leHBvcnQgY29uc3QgcmFnZ2VkR2F0aGVyQ29uZmlnOiBLZXJuZWxDb25maWcgPSB7XG4gIGtlcm5lbE5hbWU6IFJhZ2dlZEdhdGhlcixcbiAgYmFja2VuZE5hbWU6ICdjcHUnLFxuICBrZXJuZWxGdW5jOiByYWdnZWRHYXRoZXIgYXMge30gYXMgS2VybmVsRnVuYyxcbn07XG4iXX0=","/**\n * @license\n * Copyright 2022 Google LLC. All Rights Reserved.\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n * =============================================================================\n */\nimport { backend_util, broadcastTo, reshape, tidy, util } from '@tensorflow/tfjs-core';\nvar RowPartitionType = backend_util.RowPartitionType;\n// Based on\n// https://github.com/tensorflow/tensorflow/blob/master/tensorflow/core/kernels/ragged_tensor_to_tensor_op.cc\nclass RaggedTensorToTensorOp {\n constructor(shape, shapeShape, values, valuesShape, valuesDType, defaultValue, defaultValueShape, rowPartitionValues, rowPartitionValuesShapes, rowPartitionTypeStrings) {\n this.shape = shape;\n this.shapeShape = shapeShape;\n this.values = values;\n this.valuesShape = valuesShape;\n this.valuesDType = valuesDType;\n this.defaultValue = defaultValue;\n this.defaultValueShape = defaultValueShape;\n this.rowPartitionValues = rowPartitionValues;\n this.rowPartitionValuesShapes = rowPartitionValuesShapes;\n this.rowPartitionTypes =\n backend_util.getRowPartitionTypesHelper(rowPartitionTypeStrings);\n this.raggedRank = backend_util.getRaggedRank(this.rowPartitionTypes);\n }\n getRowPartitionTypeByDimension(dimension) {\n if (this.rowPartitionTypes[0] === RowPartitionType.FIRST_DIM_SIZE) {\n return this.rowPartitionTypes[dimension + 1];\n }\n else {\n return this.rowPartitionTypes[dimension];\n }\n }\n // Returns the relationship between dimension and dimension + 1.\n getRowPartitionTensor(dimension) {\n if (this.rowPartitionTypes[0] === RowPartitionType.FIRST_DIM_SIZE) {\n return this.rowPartitionValues[dimension + 1];\n }\n else {\n return this.rowPartitionValues[dimension];\n }\n }\n getMaxWidth(dimension) {\n const rowPartitionTensor = this.getRowPartitionTensor(dimension - 1);\n switch (this.getRowPartitionTypeByDimension(dimension - 1)) {\n case RowPartitionType.VALUE_ROWIDS:\n return RaggedTensorToTensorOp.getMaxWidthValueRowID(rowPartitionTensor);\n case RowPartitionType.ROW_SPLITS:\n return RaggedTensorToTensorOp.getMaxWidthRowSplit(rowPartitionTensor);\n default:\n throw new Error(`Cannot handle partition type ${RowPartitionType[this.getRowPartitionTypeByDimension(dimension - 1)]}`);\n }\n }\n static getMaxWidthRowSplit(rowSplit) {\n const tensorLength = rowSplit.length;\n if (tensorLength === 0 || tensorLength === 1) {\n return 0;\n }\n let maxWidth = 0;\n for (let i = 0; i < tensorLength - 1; ++i) {\n const currentWidth = rowSplit[i + 1] - rowSplit[i];\n if (currentWidth > maxWidth) {\n maxWidth = currentWidth;\n }\n }\n return maxWidth;\n }\n static getMaxWidthValueRowID(valueRowIds) {\n const indexLength = valueRowIds.length;\n if (indexLength === 0) {\n return 0;\n }\n let firstEqualIndex = 0;\n let firstEqualIndexValue = valueRowIds[0];\n let maxWidth = 0;\n for (let i = 1; i < indexLength; ++i) {\n const value = valueRowIds[i];\n if (value !== firstEqualIndexValue) {\n firstEqualIndexValue = value;\n maxWidth = Math.max(i - firstEqualIndex, maxWidth);\n firstEqualIndex = i;\n }\n }\n return Math.max(indexLength - firstEqualIndex, maxWidth);\n }\n tensorShapeFromTensor(t, tShape, isPartial = true) {\n if (tShape.length === 0) {\n if (t[0] === -1) {\n return [];\n }\n throw new Error(`The only valid scalar shape tensor is the fully unknown shape specified as -1.`);\n }\n // MakePartialShape/MakeShapeHelper.\n return makeShape(t, isPartial);\n }\n calculateOutputSize(firstDim) {\n const valueShape = this.valuesShape;\n const defaultValueShape = this.defaultValueShape;\n backend_util.validateDefaultValueShape(defaultValueShape, valueShape);\n const shape = this.tensorShapeFromTensor(this.shape, this.shapeShape);\n const outputShape = backend_util.combineRaggedTensorToTensorShapes(this.raggedRank, shape, valueShape);\n const result = outputShape;\n if (result[0] < 0) {\n result[0] = firstDim;\n }\n for (let i = 1; i <= this.raggedRank; ++i) {\n if (result[i] < 0) {\n result[i] = this.getMaxWidth(i);\n }\n }\n return result;\n }\n /**\n * The outputIndex represents the index in the output tensor\n * where the first element of a particular dimension would be written.\n * If it is -1, it indicates that the index is out of scope.\n * Example, given firstDimension = 10, firstDimensionOutput = 6,\n * and outputIndexMultiplier = 100:\n * result = [0 100 200 300 400 500 -1 -1 -1 -1]\n * If firstDimensionOutput = 11 instead, then:\n * result = [0 100 200 300 400 500 600 700 800 900]\n */\n calculateFirstParentOutputIndex(firstDimension, outputIndexMultiplier, firstDimensionOutput) {\n const minDimension = Math.min(firstDimension, firstDimensionOutput);\n const result = [];\n let currentOutputIndex = 0;\n for (let i = 0; i < minDimension; ++i, currentOutputIndex += outputIndexMultiplier) {\n result.push(currentOutputIndex);\n }\n for (let i = minDimension; i < firstDimension; ++i) {\n result.push(-1);\n }\n util.assert(result.length === firstDimension, () => 'Final length of result must be equal to firstDimension.');\n return result;\n }\n calculateOutputIndexRowSplit(rowSplit, parentOutputIndex, outputIndexMultiplier, outputSize) {\n const rowSplitSize = rowSplit.length;\n const result = [];\n for (let i = 0; i < rowSplitSize - 1; ++i) {\n const rowLength = rowSplit[i + 1] - rowSplit[i];\n let realLength = Math.min(outputSize, rowLength);\n let parentOutputIndexCurrent = parentOutputIndex[i];\n if (parentOutputIndexCurrent === -1) {\n realLength = 0;\n }\n for (let j = 0; j < realLength; ++j) {\n result.push(parentOutputIndexCurrent);\n parentOutputIndexCurrent += outputIndexMultiplier;\n }\n for (let j = 0; j < rowLength - realLength; ++j) {\n result.push(-1);\n }\n }\n if (rowSplitSize > 0 && result.length !== rowSplit[rowSplitSize - 1]) {\n throw new Error('Invalid row split size.');\n }\n return result;\n }\n // Calculate the output index of the first element of a list.\n // The parentOutputIndex is the same computation for the previous list.\n // -1 indicates an element or list that is out of range.\n // The outputIndexMultiplier is the number of output indices one moves\n // forward for each column.\n // E.g., given:\n // valueRowIds:[0 1 2 2 2 3 5 5 6]\n // parentOutputIndex:[1000 1100 2000 2100 -1 3000 4000]\n // outputIndexMultiplier: 10\n // outputSize: 2\n // You get:\n // result = [1000 1100 2000 2010 -1 2100 -1 -1 3000]\n // result[0] = parentOutputIndex[valueRowIds[0]]\n // result[1] = parentOutputIndex[valueRowIds[1]]\n // result[2] = parentOutputIndex[valueRowIds[2]]\n // result[3] = parentOutputIndex[valueRowIds[2] + 10]\n // result[4] = -1 because it is the third element the size is 2.\n // result[5] = parentOutputIndex[valueRowIds[3]]\n // result[6] = -1 because parentOutputIndex[valueRowIds[6]] == -1\n // result[7] = -1 because parentOutputIndex[valueRowIds[6]] == -1\n // result[8] = parentOutputIndex[valueRowIds[7]]\n calculateOutputIndexValueRowID(valueRowIds, parentOutputIndex, outputIndexMultiplier, outputSize) {\n const indexSize = valueRowIds.length;\n const result = [];\n if (indexSize === 0) {\n return [];\n }\n let currentOutputColumn = 0;\n let currentValueRowId = valueRowIds[0];\n if (currentValueRowId >= parentOutputIndex.length) {\n throw new Error(`Got currentValueRowId=${currentValueRowId}, which is not less than ${parentOutputIndex.length}`);\n }\n let currentOutputIndex = parentOutputIndex[currentValueRowId];\n result.push(currentOutputIndex);\n for (let i = 1; i < indexSize; ++i) {\n const nextValueRowId = valueRowIds[i];\n if (nextValueRowId === currentValueRowId) {\n if (currentOutputIndex >= 0) {\n ++currentOutputColumn;\n if (currentOutputColumn < outputSize) {\n currentOutputIndex += outputIndexMultiplier;\n }\n else {\n currentOutputIndex = -1;\n }\n }\n }\n else {\n currentOutputColumn = 0;\n currentValueRowId = nextValueRowId;\n if (nextValueRowId >= parentOutputIndex.length) {\n throw new Error(`Got nextValueRowId=${nextValueRowId} which is not less than ${parentOutputIndex.length}`);\n }\n currentOutputIndex = parentOutputIndex[nextValueRowId];\n }\n result.push(currentOutputIndex);\n }\n if (result.length !== valueRowIds.length) {\n throw new Error('Invalid row ids.');\n }\n return result;\n }\n calculateOutputIndex(dimension, parentOutputIndex, outputIndexMultiplier, outputSize) {\n const rowPartitionTensor = this.getRowPartitionTensor(dimension);\n const partitionType = this.getRowPartitionTypeByDimension(dimension);\n switch (partitionType) {\n case RowPartitionType.VALUE_ROWIDS:\n return this.calculateOutputIndexValueRowID(rowPartitionTensor, parentOutputIndex, outputIndexMultiplier, outputSize);\n case RowPartitionType.ROW_SPLITS:\n if (rowPartitionTensor.length - 1 > parentOutputIndex.length) {\n throw new Error(`Row partition size is greater than output size: ${rowPartitionTensor.length - 1} > ${parentOutputIndex.length}`);\n }\n return this.calculateOutputIndexRowSplit(rowPartitionTensor, parentOutputIndex, outputIndexMultiplier, outputSize);\n default:\n throw new Error(`Unsupported partition type: ${RowPartitionType[partitionType]}`);\n }\n }\n getFirstDimensionSize() {\n const firstPartitionTensor = this.rowPartitionValues[0];\n if (this.rowPartitionTypes.length === 0) {\n throw new Error('No row_partition_types given.');\n }\n const firstPartitionType = this.rowPartitionTypes[0];\n switch (firstPartitionType) {\n case RowPartitionType.FIRST_DIM_SIZE:\n return firstPartitionTensor[0];\n case RowPartitionType.VALUE_ROWIDS:\n throw new Error('Cannot handle VALUE_ROWIDS in first dimension.');\n case RowPartitionType.ROW_SPLITS:\n return this.rowPartitionValuesShapes[0][0] - 1;\n default:\n throw new Error(`Cannot handle type ${RowPartitionType[firstPartitionType]}`);\n }\n }\n compute() {\n const firstPartitionTensor = this.rowPartitionValues[0];\n if (firstPartitionTensor.length <= 0) {\n throw new Error('Invalid first partition input. ' +\n 'Tensor requires at least one element.');\n }\n const firstDimension = this.getFirstDimensionSize();\n const outputSize = this.calculateOutputSize(firstDimension);\n const multiplier = new Array(this.raggedRank + 1);\n multiplier[multiplier.length - 1] = 1;\n for (let i = multiplier.length - 2; i >= 0; --i) {\n multiplier[i] = multiplier[i + 1] * outputSize[i + 1];\n }\n // Full size of the tensor.\n const outputShape = makeShape(outputSize, false);\n const outputTensor = util.getArrayFromDType(this.valuesDType, util.sizeFromShape(outputShape));\n const fullSize = multiplier[0] * outputSize[0];\n if (fullSize > 0) {\n let outputIndex = this.calculateFirstParentOutputIndex(firstDimension, multiplier[0], outputSize[0]);\n for (let i = 1; i <= this.raggedRank; ++i) {\n const newOutputIndex = this.calculateOutputIndex(i - 1, outputIndex, multiplier[i], outputSize[i]);\n outputIndex = newOutputIndex;\n }\n this.setOutput(this.raggedRank, outputIndex, outputTensor, outputShape);\n }\n return [outputShape, outputTensor];\n }\n setOutput(raggedRank, outputIndex, outputTensor, outputShape) {\n if (outputTensor.length === 0) {\n return;\n }\n const valuesBase = this.values;\n const outputBase = outputTensor;\n let elementShape = outputShape.slice();\n elementShape = elementShape.slice(raggedRank + 1);\n const valueElementSize = util.sizeFromShape(elementShape);\n const outputIndexSize = outputIndex.length;\n // Broadcast the default value to value_element_size. (We can skip this\n // if defaultValueTensor.size == 1, since we use fill when that's true.)\n let defaultValue = this.defaultValue;\n if (defaultValue.length !== valueElementSize && defaultValue.length !== 1) {\n const srcShape = this.defaultValueShape;\n tidy(() => {\n const defaultValueTensor = reshape(defaultValue, srcShape);\n const bCastDefault = broadcastTo(defaultValueTensor, elementShape);\n defaultValue = bCastDefault.dataSync();\n });\n }\n // Loop through the outputIndex array, finding contiguous regions that\n // should be copied. Once we find the end of a contiguous region, copy it\n // and add any necessary padding (with defaultValue).\n let srcStart = 0; // Start of contiguous region (in values)\n let dstStart = 0; // Destination for contiguous region (in output)\n let dstEnd = 0; // Destination for contiguous region (in output)\n for (let srcI = 0; srcI <= outputIndexSize; ++srcI) {\n // dstI is the destination where the value at srcI should be copied.\n let dstI = srcI < outputIndexSize ? outputIndex[srcI] : -1;\n // If we're still in a contiguous region, then update dstEnd go to the\n // next srcI.\n if (dstI === dstEnd) {\n ++dstEnd;\n continue;\n }\n // We found the end of contiguous region. This can be because we found\n // a gap (dstI > dstEnd), or a source value that shouldn't be copied\n // because it's out-of-bounds (dstI == -1), or the end of the tensor\n // (dstI === -1).\n if (dstStart < dstEnd) {\n // Copy the contiguous region.\n const src = valuesBase.subarray(srcStart * valueElementSize);\n const dst = outputBase.subarray(dstStart * valueElementSize);\n const nVals = (dstEnd - dstStart) * valueElementSize;\n copyArray(dst, src, nVals);\n }\n // Add any necessary padding (w/ defaultValue).\n if (srcI >= outputIndexSize) {\n // We reached the end of values: pad to the end of output.\n const outputSize = outputTensor.length;\n dstI = Math.floor(outputSize / valueElementSize);\n }\n if (dstI > dstEnd) {\n if (this.defaultValue.length === 1) {\n outputBase\n .subarray(dstEnd * valueElementSize, dstI * valueElementSize)\n .fill(this.defaultValue[0]);\n dstEnd = dstI;\n }\n else {\n while (dstI > dstEnd) {\n const dst = outputBase.slice(dstEnd * valueElementSize);\n copyArray(dst, defaultValue, valueElementSize);\n ++dstEnd;\n }\n }\n }\n // Update indices.\n if (dstI < 0) {\n // srcI should be skipped -- leave it out of the contiguous region.\n srcStart = srcI + 1;\n dstStart = dstEnd;\n }\n else {\n // srcI should be copied -- include it in the contiguous region.\n srcStart = srcI;\n dstStart = dstEnd;\n dstEnd = dstStart + 1;\n }\n }\n }\n}\nfunction copyArray(dst, src, size) {\n for (let i = 0; i < size; i++) {\n dst[i] = src[i];\n }\n}\nfunction makeShape(shape, isPartial) {\n const out = [];\n for (let dim of shape) {\n if (dim < 0) {\n if (!isPartial) {\n throw new Error(`Dimension ${dim} must be >= 0`);\n }\n if (dim < -1) {\n throw new Error(`Dimension ${dim} must be >= -1`);\n }\n dim = -1;\n }\n out.push(dim);\n }\n return out;\n}\nexport function raggedTensorToTensorImpl(shape, shapesShape, values, valuesShape, valuesDType, defaultValue, defaultValueShape, rowPartitionValues, rowPartitionValuesShapes, rowPartitionTypes) {\n return new RaggedTensorToTensorOp(shape, shapesShape, values, valuesShape, valuesDType, defaultValue, defaultValueShape, rowPartitionValues, rowPartitionValuesShapes, rowPartitionTypes)\n .compute();\n}\n//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiUmFnZ2VkVGVuc29yVG9UZW5zb3JfaW1wbC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uLy4uL3RmanMtYmFja2VuZC1jcHUvc3JjL2tlcm5lbHMvUmFnZ2VkVGVuc29yVG9UZW5zb3JfaW1wbC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQTs7Ozs7Ozs7Ozs7Ozs7O0dBZUc7QUFFSCxPQUFPLEVBQUMsWUFBWSxFQUFFLFdBQVcsRUFBWSxPQUFPLEVBQUUsSUFBSSxFQUFjLElBQUksRUFBQyxNQUFNLHVCQUF1QixDQUFDO0FBRTNHLElBQU8sZ0JBQWdCLEdBQUcsWUFBWSxDQUFDLGdCQUFnQixDQUFDO0FBQ3hELFdBQVc7QUFDWCw2R0FBNkc7QUFDN0csTUFBTSxzQkFBc0I7SUFHMUIsWUFDWSxLQUFpQixFQUFVLFVBQW9CLEVBQy9DLE1BQWtCLEVBQVUsV0FBcUIsRUFDakQsV0FBcUIsRUFBVSxZQUF3QixFQUN2RCxpQkFBMkIsRUFDbEIsa0JBQWdDLEVBQ2hDLHdCQUFvQyxFQUNyRCx1QkFBaUM7UUFOekIsVUFBSyxHQUFMLEtBQUssQ0FBWTtRQUFVLGVBQVUsR0FBVixVQUFVLENBQVU7UUFDL0MsV0FBTSxHQUFOLE1BQU0sQ0FBWTtRQUFVLGdCQUFXLEdBQVgsV0FBVyxDQUFVO1FBQ2pELGdCQUFXLEdBQVgsV0FBVyxDQUFVO1FBQVUsaUJBQVksR0FBWixZQUFZLENBQVk7UUFDdkQsc0JBQWlCLEdBQWpCLGlCQUFpQixDQUFVO1FBQ2xCLHVCQUFrQixHQUFsQixrQkFBa0IsQ0FBYztRQUNoQyw2QkFBd0IsR0FBeEIsd0JBQXdCLENBQVk7UUFFdkQsSUFBSSxDQUFDLGlCQUFpQjtZQUNsQixZQUFZLENBQUMsMEJBQTBCLENBQUMsdUJBQXVCLENBQUMsQ0FBQztRQUNyRSxJQUFJLENBQUMsVUFBVSxHQUFHLFlBQVksQ0FBQyxhQUFhLENBQUMsSUFBSSxDQUFDLGlCQUFpQixDQUFDLENBQUM7SUFDdkUsQ0FBQztJQUVPLDhCQUE4QixDQUFDLFNBQWlCO1FBQ3RELElBQUksSUFBSSxDQUFDLGlCQUFpQixDQUFDLENBQUMsQ0FBQyxLQUFLLGdCQUFnQixDQUFDLGNBQWMsRUFBRTtZQUNqRSxPQUFPLElBQUksQ0FBQyxpQkFBaUIsQ0FBQyxTQUFTLEdBQUcsQ0FBQyxDQUFDLENBQUM7U0FDOUM7YUFBTTtZQUNMLE9BQU8sSUFBSSxDQUFDLGlCQUFpQixDQUFDLFNBQVMsQ0FBQyxDQUFDO1NBQzFDO0lBQ0gsQ0FBQztJQUVELGdFQUFnRTtJQUN4RCxxQkFBcUIsQ0FBQyxTQUFpQjtRQUM3QyxJQUFJLElBQUksQ0FBQyxpQkFBaUIsQ0FBQyxDQUFDLENBQUMsS0FBSyxnQkFBZ0IsQ0FBQyxjQUFjLEVBQUU7WUFDakUsT0FBTyxJQUFJLENBQUMsa0JBQWtCLENBQUMsU0FBUyxHQUFHLENBQUMsQ0FBQyxDQUFDO1NBQy9DO2FBQU07WUFDTCxPQUFPLElBQUksQ0FBQyxrQkFBa0IsQ0FBQyxTQUFTLENBQUMsQ0FBQztTQUMzQztJQUNILENBQUM7SUFFTyxXQUFXLENBQUMsU0FBaUI7UUFDbkMsTUFBTSxrQkFBa0IsR0FBRyxJQUFJLENBQUMscUJBQXFCLENBQUMsU0FBUyxHQUFHLENBQUMsQ0FBQyxDQUFDO1FBQ3JFLFFBQVEsSUFBSSxDQUFDLDhCQUE4QixDQUFDLFNBQVMsR0FBRyxDQUFDLENBQUMsRUFBRTtZQUMxRCxLQUFLLGdCQUFnQixDQUFDLFlBQVk7Z0JBQ2hDLE9BQU8sc0JBQXNCLENBQUMscUJBQXFCLENBQUMsa0JBQWtCLENBQUMsQ0FBQztZQUMxRSxLQUFLLGdCQUFnQixDQUFDLFVBQVU7Z0JBQzlCLE9BQU8sc0JBQXNCLENBQUMsbUJBQW1CLENBQUMsa0JBQWtCLENBQUMsQ0FBQztZQUN4RTtnQkFDRSxNQUFNLElBQUksS0FBSyxDQUFDLGdDQUNaLGdCQUFnQixDQUFDLElBQUksQ0FBQyw4QkFBOEIsQ0FDaEQsU0FBUyxHQUFHLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDO1NBQzlCO0lBQ0gsQ0FBQztJQUVELE1BQU0sQ0FBQyxtQkFBbUIsQ0FBQyxRQUFvQjtRQUM3QyxNQUFNLFlBQVksR0FBRyxRQUFRLENBQUMsTUFBTSxDQUFDO1FBQ3JDLElBQUksWUFBWSxLQUFLLENBQUMsSUFBSSxZQUFZLEtBQUssQ0FBQyxFQUFFO1lBQzVDLE9BQU8sQ0FBQyxDQUFDO1NBQ1Y7UUFDRCxJQUFJLFFBQVEsR0FBRyxDQUFDLENBQUM7UUFDakIsS0FBSyxJQUFJLENBQUMsR0FBRyxDQUFDLEVBQUUsQ0FBQyxHQUFHLFlBQVksR0FBRyxDQUFDLEVBQUUsRUFBRSxDQUFDLEVBQUU7WUFDekMsTUFBTSxZQUFZLEdBQUcsUUFBUSxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsR0FBRyxRQUFRLENBQUMsQ0FBQyxDQUFDLENBQUM7WUFDbkQsSUFBSSxZQUFZLEdBQUcsUUFBUSxFQUFFO2dCQUMzQixRQUFRLEdBQUcsWUFBWSxDQUFDO2FBQ3pCO1NBQ0Y7UUFDRCxPQUFPLFFBQVEsQ0FBQztJQUNsQixDQUFDO0lBRUQsTUFBTSxDQUFDLHFCQUFxQixDQUFDLFdBQXVCO1FBQ2xELE1BQU0sV0FBVyxHQUFHLFdBQVcsQ0FBQyxNQUFNLENBQUM7UUFDdkMsSUFBSSxXQUFXLEtBQUssQ0FBQyxFQUFFO1lBQ3JCLE9BQU8sQ0FBQyxDQUFDO1NBQ1Y7UUFDRCxJQUFJLGVBQWUsR0FBRyxDQUFDLENBQUM7UUFDeEIsSUFBSSxvQkFBb0IsR0FBRyxXQUFXLENBQUMsQ0FBQyxDQUFDLENBQUM7UUFDMUMsSUFBSSxRQUFRLEdBQUcsQ0FBQyxDQUFDO1FBQ2pCLEtBQUssSUFBSSxDQUFDLEdBQUcsQ0FBQyxFQUFFLENBQUMsR0FBRyxXQUFXLEVBQUUsRUFBRSxDQUFDLEVBQUU7WUFDcEMsTUFBTSxLQUFLLEdBQUcsV0FBVyxDQUFDLENBQUMsQ0FBQyxDQUFDO1lBQzdCLElBQUksS0FBSyxLQUFLLG9CQUFvQixFQUFFO2dCQUNsQyxvQkFBb0IsR0FBRyxLQUFLLENBQUM7Z0JBQzdCLFFBQVEsR0FBRyxJQUFJLENBQUMsR0FBRyxDQUFDLENBQUMsR0FBRyxlQUFlLEVBQUUsUUFBUSxDQUFDLENBQUM7Z0JBQ25ELGVBQWUsR0FBRyxDQUFDLENBQUM7YUFDckI7U0FDRjtRQUNELE9BQU8sSUFBSSxDQUFDLEdBQUcsQ0FBQyxXQUFXLEdBQUcsZUFBZSxFQUFFLFFBQVEsQ0FBQyxDQUFDO0lBQzNELENBQUM7SUFFTyxxQkFBcUIsQ0FDekIsQ0FBYSxFQUFFLE1BQWdCLEVBQUUsU0FBUyxHQUFHLElBQUk7UUFDbkQsSUFBSSxNQUFNLENBQUMsTUFBTSxLQUFLLENBQUMsRUFBRTtZQUN2QixJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUMsS0FBSyxDQUFDLENBQUMsRUFBRTtnQkFDZixPQUFPLEVBQUUsQ0FBQzthQUNYO1lBQ0QsTUFBTSxJQUFJLEtBQUssQ0FDWCxnRkFBZ0YsQ0FBQyxDQUFDO1NBQ3ZGO1FBQ0Qsb0NBQW9DO1FBQ3BDLE9BQU8sU0FBUyxDQUFDLENBQUMsRUFBRSxTQUFTLENBQUMsQ0FBQztJQUNqQyxDQUFDO0lBRU8sbUJBQW1CLENBQUMsUUFBZ0I7UUFDMUMsTUFBTSxVQUFVLEdBQUcsSUFBSSxDQUFDLFdBQVcsQ0FBQztRQUNwQyxNQUFNLGlCQUFpQixHQUFHLElBQUksQ0FBQyxpQkFBaUIsQ0FBQztRQUVqRCxZQUFZLENBQUMseUJBQXlCLENBQUMsaUJBQWlCLEVBQUUsVUFBVSxDQUFDLENBQUM7UUFFdEUsTUFBTSxLQUFLLEdBQUcsSUFBSSxDQUFDLHFCQUFxQixDQUFDLElBQUksQ0FBQyxLQUFLLEVBQUUsSUFBSSxDQUFDLFVBQVUsQ0FBQyxDQUFDO1FBQ3RFLE1BQU0sV0FBVyxHQUFHLFlBQVksQ0FBQyxpQ0FBaUMsQ0FDOUQsSUFBSSxDQUFDLFVBQVUsRUFBRSxLQUFLLEVBQUUsVUFBVSxDQUFDLENBQUM7UUFFeEMsTUFBTSxNQUFNLEdBQUcsV0FBVyxDQUFDO1FBRTNCLElBQUksTUFBTSxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsRUFBRTtZQUNqQixNQUFNLENBQUMsQ0FBQyxDQUFDLEdBQUcsUUFBUSxDQUFDO1NBQ3RCO1FBQ0QsS0FBSyxJQUFJLENBQUMsR0FBRyxDQUFDLEVBQUUsQ0FBQyxJQUFJLElBQUksQ0FBQyxVQUFVLEVBQUUsRUFBRSxDQUFDLEVBQUU7WUFDekMsSUFBSSxNQUFNLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxFQUFFO2dCQUNqQixNQUFNLENBQUMsQ0FBQyxDQUFDLEdBQUcsSUFBSSxDQUFDLFdBQVcsQ0FBQyxDQUFDLENBQUMsQ0FBQzthQUNqQztTQUNGO1FBRUQsT0FBTyxNQUFNLENBQUM7SUFDaEIsQ0FBQztJQUVEOzs7Ozs7Ozs7T0FTRztJQUNLLCtCQUErQixDQUNuQyxjQUFzQixFQUFFLHFCQUE2QixFQUNyRCxvQkFBNEI7UUFDOUIsTUFBTSxZQUFZLEdBQUcsSUFBSSxDQUFDLEdBQUcsQ0FBQyxjQUFjLEVBQUUsb0JBQW9CLENBQUMsQ0FBQztRQUNwRSxNQUFNLE1BQU0sR0FBYSxFQUFFLENBQUM7UUFDNUIsSUFBSSxrQkFBa0IsR0FBRyxDQUFDLENBQUM7UUFDM0IsS0FBSyxJQUFJLENBQUMsR0FBRyxDQUFDLEVBQUUsQ0FBQyxHQUFHLFlBQVksRUFDM0IsRUFBRSxDQUFDLEVBQUUsa0JBQWtCLElBQUkscUJBQXFCLEVBQUU7WUFDckQsTUFBTSxDQUFDLElBQUksQ0FBQyxrQkFBa0IsQ0FBQyxDQUFDO1NBQ2pDO1FBQ0QsS0FBSyxJQUFJLENBQUMsR0FBRyxZQUFZLEVBQUUsQ0FBQyxHQUFHLGNBQWMsRUFBRSxFQUFFLENBQUMsRUFBRTtZQUNsRCxNQUFNLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUM7U0FDakI7UUFDRCxJQUFJLENBQUMsTUFBTSxDQUNQLE1BQU0sQ0FBQyxNQUFNLEtBQUssY0FBYyxFQUNoQyxHQUFHLEVBQUUsQ0FBQyx5REFBeUQsQ0FBQyxDQUFDO1FBRXJFLE9BQU8sTUFBTSxDQUFDO0lBQ2hCLENBQUM7SUFFTyw0QkFBNEIsQ0FDaEMsUUFBb0IsRUFBRSxpQkFBMkIsRUFDakQscUJBQTZCLEVBQUUsVUFBa0I7UUFDbkQsTUFBTSxZQUFZLEdBQUcsUUFBUSxDQUFDLE1BQU0sQ0FBQztRQUNyQyxNQUFNLE1BQU0sR0FBYSxFQUFFLENBQUM7UUFDNUIsS0FBSyxJQUFJLENBQUMsR0FBRyxDQUFDLEVBQUUsQ0FBQyxHQUFHLFlBQVksR0FBRyxDQUFDLEVBQUUsRUFBRSxDQUFDLEVBQUU7WUFDekMsTUFBTSxTQUFTLEdBQUcsUUFBUSxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsR0FBRyxRQUFRLENBQUMsQ0FBQyxDQUFDLENBQUM7WUFDaEQsSUFBSSxVQUFVLEdBQUcsSUFBSSxDQUFDLEdBQUcsQ0FBQyxVQUFVLEVBQUUsU0FBUyxDQUFDLENBQUM7WUFDakQsSUFBSSx3QkFBd0IsR0FBRyxpQkFBaUIsQ0FBQyxDQUFDLENBQUMsQ0FBQztZQUVwRCxJQUFJLHdCQUF3QixLQUFLLENBQUMsQ0FBQyxFQUFFO2dCQUNuQyxVQUFVLEdBQUcsQ0FBQyxDQUFDO2FBQ2hCO1lBQ0QsS0FBSyxJQUFJLENBQUMsR0FBRyxDQUFDLEVBQUUsQ0FBQyxHQUFHLFVBQVUsRUFBRSxFQUFFLENBQUMsRUFBRTtnQkFDbkMsTUFBTSxDQUFDLElBQUksQ0FBQyx3QkFBd0IsQ0FBQyxDQUFDO2dCQUN0Qyx3QkFBd0IsSUFBSSxxQkFBcUIsQ0FBQzthQUNuRDtZQUNELEtBQUssSUFBSSxDQUFDLEdBQUcsQ0FBQyxFQUFFLENBQUMsR0FBRyxTQUFTLEdBQUcsVUFBVSxFQUFFLEVBQUUsQ0FBQyxFQUFFO2dCQUMvQyxNQUFNLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUM7YUFDakI7U0FDRjtRQUNELElBQUksWUFBWSxHQUFHLENBQUMsSUFBSSxNQUFNLENBQUMsTUFBTSxLQUFLLFFBQVEsQ0FBQyxZQUFZLEdBQUcsQ0FBQyxDQUFDLEVBQUU7WUFDcEUsTUFBTSxJQUFJLEtBQUssQ0FBQyx5QkFBeUIsQ0FBQyxDQUFDO1NBQzVDO1FBRUQsT0FBTyxNQUFNLENBQUM7SUFDaEIsQ0FBQztJQUVELDZEQUE2RDtJQUM3RCx1RUFBdUU7SUFDdkUsd0RBQXdEO0lBQ3hELHNFQUFzRTtJQUN0RSwyQkFBMkI7SUFDM0IsZUFBZTtJQUNmLGtDQUFrQztJQUNsQyx1REFBdUQ7SUFDdkQsNEJBQTRCO0lBQzVCLGdCQUFnQjtJQUNoQixXQUFXO0lBQ1gsb0RBQW9EO0lBQ3BELGdEQUFnRDtJQUNoRCxnREFBZ0Q7SUFDaEQsZ0RBQWdEO0lBQ2hELHFEQUFxRDtJQUNyRCxnRUFBZ0U7SUFDaEUsZ0RBQWdEO0lBQ2hELGlFQUFpRTtJQUNqRSxpRUFBaUU7SUFDakUsZ0RBQWdEO0lBQ3hDLDhCQUE4QixDQUNsQyxXQUF1QixFQUFFLGlCQUEyQixFQUNwRCxxQkFBNkIsRUFBRSxVQUFrQjtRQUNuRCxNQUFNLFNBQVMsR0FBRyxXQUFXLENBQUMsTUFBTSxDQUFDO1FBQ3JDLE1BQU0sTUFBTSxHQUFhLEVBQUUsQ0FBQztRQUM1QixJQUFJLFNBQVMsS0FBSyxDQUFDLEVBQUU7WUFDbkIsT0FBTyxFQUFFLENBQUM7U0FDWDtRQUVELElBQUksbUJBQW1CLEdBQUcsQ0FBQyxDQUFDO1FBQzVCLElBQUksaUJBQWlCLEdBQUcsV0FBVyxDQUFDLENBQUMsQ0FBQyxDQUFDO1FBRXZDLElBQUksaUJBQWlCLElBQUksaUJBQWlCLENBQUMsTUFBTSxFQUFFO1lBQ2pELE1BQU0sSUFBSSxLQUFLLENBQ1gseUJBQXlCLGlCQUFpQiw0QkFDdEMsaUJBQWlCLENBQUMsTUFBTSxFQUFFLENBQUMsQ0FBQztTQUNyQztRQUVELElBQUksa0JBQWtCLEdBQUcsaUJBQWlCLENBQUMsaUJBQWlCLENBQUMsQ0FBQztRQUM5RCxNQUFNLENBQUMsSUFBSSxDQUFDLGtCQUFrQixDQUFDLENBQUM7UUFDaEMsS0FBSyxJQUFJLENBQUMsR0FBRyxDQUFDLEVBQUUsQ0FBQyxHQUFHLFNBQVMsRUFBRSxFQUFFLENBQUMsRUFBRTtZQUNsQyxNQUFNLGNBQWMsR0FBRyxXQUFXLENBQUMsQ0FBQyxDQUFDLENBQUM7WUFDdEMsSUFBSSxjQUFjLEtBQUssaUJBQWlCLEVBQUU7Z0JBQ3hDLElBQUksa0JBQWtCLElBQUksQ0FBQyxFQUFFO29CQUMzQixFQUFFLG1CQUFtQixDQUFDO29CQUN0QixJQUFJLG1CQUFtQixHQUFHLFVBQVUsRUFBRTt3QkFDcEMsa0JBQWtCLElBQUkscUJBQXFCLENBQUM7cUJBQzdDO3lCQUFNO3dCQUNMLGtCQUFrQixHQUFHLENBQUMsQ0FBQyxDQUFDO3FCQUN6QjtpQkFDRjthQUNGO2lCQUFNO2dCQUNMLG1CQUFtQixHQUFHLENBQUMsQ0FBQztnQkFDeEIsaUJBQWlCLEdBQUcsY0FBYyxDQUFDO2dCQUVuQyxJQUFJLGNBQWMsSUFBSSxpQkFBaUIsQ0FBQyxNQUFNLEVBQUU7b0JBQzlDLE1BQU0sSUFBSSxLQUFLLENBQ1gsc0JBQXNCLGNBQWMsMkJBQ2hDLGlCQUFpQixDQUFDLE1BQU0sRUFBRSxDQUFDLENBQUM7aUJBQ3JDO2dCQUVELGtCQUFrQixHQUFHLGlCQUFpQixDQUFDLGNBQWMsQ0FBQyxDQUFDO2FBQ3hEO1lBQ0QsTUFBTSxDQUFDLElBQUksQ0FBQyxrQkFBa0IsQ0FBQyxDQUFDO1NBQ2pDO1FBRUQsSUFBSSxNQUFNLENBQUMsTUFBTSxLQUFLLFdBQVcsQ0FBQyxNQUFNLEVBQUU7WUFDeEMsTUFBTSxJQUFJLEtBQUssQ0FBQyxrQkFBa0IsQ0FBQyxDQUFDO1NBQ3JDO1FBRUQsT0FBTyxNQUFNLENBQUM7SUFDaEIsQ0FBQztJQUVPLG9CQUFvQixDQUN4QixTQUFpQixFQUFFLGlCQUEyQixFQUM5QyxxQkFBNkIsRUFBRSxVQUFrQjtRQUNuRCxNQUFNLGtCQUFrQixHQUFHLElBQUksQ0FBQyxxQkFBcUIsQ0FBQyxTQUFTLENBQUMsQ0FBQztRQUNqRSxNQUFNLGFBQWEsR0FBRyxJQUFJLENBQUMsOEJBQThCLENBQUMsU0FBUyxDQUFDLENBQUM7UUFDckUsUUFBUSxhQUFhLEVBQUU7WUFDckIsS0FBSyxnQkFBZ0IsQ0FBQyxZQUFZO2dCQUNoQyxPQUFPLElBQUksQ0FBQyw4QkFBOEIsQ0FDdEMsa0JBQWtCLEVBQUUsaUJBQWlCLEVBQUUscUJBQXFCLEVBQzVELFVBQVUsQ0FBQyxDQUFDO1lBQ2xCLEtBQUssZ0JBQWdCLENBQUMsVUFBVTtnQkFDOUIsSUFBSSxrQkFBa0IsQ0FBQyxNQUFNLEdBQUcsQ0FBQyxHQUFHLGlCQUFpQixDQUFDLE1BQU0sRUFBRTtvQkFDNUQsTUFBTSxJQUFJLEtBQUssQ0FBQyxtREFDWixrQkFBa0IsQ0FBQyxNQUFNLEdBQUcsQ0FBQyxNQUFNLGlCQUFpQixDQUFDLE1BQU0sRUFBRSxDQUFDLENBQUM7aUJBQ3BFO2dCQUNELE9BQU8sSUFBSSxDQUFDLDRCQUE0QixDQUNwQyxrQkFBa0IsRUFBRSxpQkFBaUIsRUFBRSxxQkFBcUIsRUFDNUQsVUFBVSxDQUFDLENBQUM7WUFDbEI7Z0JBQ0UsTUFBTSxJQUFJLEtBQUssQ0FDWCwrQkFBK0IsZ0JBQWdCLENBQUMsYUFBYSxDQUFDLEVBQUUsQ0FBQyxDQUFDO1NBQ3pFO0lBQ0gsQ0FBQztJQUVPLHFCQUFxQjtRQUMzQixNQUFNLG9CQUFvQixHQUFHLElBQUksQ0FBQyxrQkFBa0IsQ0FBQyxDQUFDLENBQUMsQ0FBQztRQUN4RCxJQUFJLElBQUksQ0FBQyxpQkFBaUIsQ0FBQyxNQUFNLEtBQUssQ0FBQyxFQUFFO1lBQ3ZDLE1BQU0sSUFBSSxLQUFLLENBQUMsK0JBQStCLENBQUMsQ0FBQztTQUNsRDtRQUNELE1BQU0sa0JBQWtCLEdBQUcsSUFBSSxDQUFDLGlCQUFpQixDQUFDLENBQUMsQ0FBQyxDQUFDO1FBQ3JELFFBQVEsa0JBQWtCLEVBQUU7WUFDMUIsS0FBSyxnQkFBZ0IsQ0FBQyxjQUFjO2dCQUNsQyxPQUFPLG9CQUFvQixDQUFDLENBQUMsQ0FBQyxDQUFDO1lBQ2pDLEtBQUssZ0JBQWdCLENBQUMsWUFBWTtnQkFDaEMsTUFBTSxJQUFJLEtBQUssQ0FBQyxnREFBZ0QsQ0FBQyxDQUFDO1lBQ3BFLEtBQUssZ0JBQWdCLENBQUMsVUFBVTtnQkFDOUIsT0FBTyxJQUFJLENBQUMsd0JBQXdCLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDO1lBQ2pEO2dCQUNFLE1BQU0sSUFBSSxLQUFLLENBQ1gsc0JBQXNCLGdCQUFnQixDQUFDLGtCQUFrQixDQUFDLEVBQUUsQ0FBQyxDQUFDO1NBQ3JFO0lBQ0gsQ0FBQztJQUVELE9BQU87UUFDTCxNQUFNLG9CQUFvQixHQUFHLElBQUksQ0FBQyxrQkFBa0IsQ0FBQyxDQUFDLENBQUMsQ0FBQztRQUN4RCxJQUFJLG9CQUFvQixDQUFDLE1BQU0sSUFBSSxDQUFDLEVBQUU7WUFDcEMsTUFBTSxJQUFJLEtBQUssQ0FDWCxpQ0FBaUM7Z0JBQ2pDLHVDQUF1QyxDQUFDLENBQUM7U0FDOUM7UUFDRCxNQUFNLGNBQWMsR0FBRyxJQUFJLENBQUMscUJBQXFCLEVBQUUsQ0FBQztRQUNwRCxNQUFNLFVBQVUsR0FBRyxJQUFJLENBQUMsbUJBQW1CLENBQUMsY0FBYyxDQUFDLENBQUM7UUFDNUQsTUFBTSxVQUFVLEdBQWEsSUFBSSxLQUFLLENBQUMsSUFBSSxDQUFDLFVBQVUsR0FBRyxDQUFDLENBQUMsQ0FBQztRQUU1RCxVQUFVLENBQUMsVUFBVSxDQUFDLE1BQU0sR0FBRyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUM7UUFDdEMsS0FBSyxJQUFJLENBQUMsR0FBRyxVQUFVLENBQUMsTUFBTSxHQUFHLENBQUMsRUFBRSxDQUFDLElBQUksQ0FBQyxFQUFFLEVBQUUsQ0FBQyxFQUFFO1lBQy9DLFVBQVUsQ0FBQyxDQUFDLENBQUMsR0FBRyxVQUFVLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxHQUFHLFVBQVUsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUM7U0FDdkQ7UUFDRCwyQkFBMkI7UUFDM0IsTUFBTSxXQUFXLEdBQWEsU0FBUyxDQUFDLFVBQVUsRUFBRSxLQUFLLENBQUMsQ0FBQztRQUMzRCxNQUFNLFlBQVksR0FDZCxJQUFJLENBQUMsaUJBQWlCLENBQ2xCLElBQUksQ0FBQyxXQUFXLEVBQUUsSUFBSSxDQUFDLGFBQWEsQ0FBQyxXQUFXLENBQUMsQ0FBZSxDQUFDO1FBRXpFLE1BQU0sUUFBUSxHQUFHLFVBQVUsQ0FBQyxDQUFDLENBQUMsR0FBRyxVQUFVLENBQUMsQ0FBQyxDQUFDLENBQUM7UUFDL0MsSUFBSSxRQUFRLEdBQUcsQ0FBQyxFQUFFO1lBQ2hCLElBQUksV0FBVyxHQUFHLElBQUksQ0FBQywrQkFBK0IsQ0FDbEQsY0FBYyxFQUFFLFVBQVUsQ0FBQyxDQUFDLENBQUMsRUFBRSxVQUFVLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQztZQUNsRCxLQUFLLElBQUksQ0FBQyxHQUFHLENBQUMsRUFBRSxDQUFDLElBQUksSUFBSSxDQUFDLFVBQVUsRUFBRSxFQUFFLENBQUMsRUFBRTtnQkFDekMsTUFBTSxjQUFjLEdBQUcsSUFBSSxDQUFDLG9CQUFvQixDQUM1QyxDQUFDLEdBQUcsQ0FBQyxFQUFFLFdBQVcsRUFBRSxVQUFVLENBQUMsQ0FBQyxDQUFDLEVBQUUsVUFBVSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUM7Z0JBQ3RELFdBQVcsR0FBRyxjQUFjLENBQUM7YUFDOUI7WUFFRCxJQUFJLENBQUMsU0FBUyxDQUFDLElBQUksQ0FBQyxVQUFVLEVBQUUsV0FBVyxFQUFFLFlBQVksRUFBRSxXQUFXLENBQUMsQ0FBQztTQUN6RTtRQUVELE9BQU8sQ0FBQyxXQUFXLEVBQUUsWUFBWSxDQUFDLENBQUM7SUFDckMsQ0FBQztJQUNELFNBQVMsQ0FDTCxVQUFrQixFQUFFLFdBQXFCLEVBQUUsWUFBd0IsRUFDbkUsV0FBcUI7UUFDdkIsSUFBSSxZQUFZLENBQUMsTUFBTSxLQUFLLENBQUMsRUFBRTtZQUM3QixPQUFPO1NBQ1I7UUFFRCxNQUFNLFVBQVUsR0FBRyxJQUFJLENBQUMsTUFBTSxDQUFDO1FBQy9CLE1BQU0sVUFBVSxHQUFHLFlBQVksQ0FBQztRQUVoQyxJQUFJLFlBQVksR0FBRyxXQUFXLENBQUMsS0FBSyxFQUFFLENBQUM7UUFDdkMsWUFBWSxHQUFHLFlBQVksQ0FBQyxLQUFLLENBQUMsVUFBVSxHQUFHLENBQUMsQ0FBQyxDQUFDO1FBQ2xELE1BQU0sZ0JBQWdCLEdBQUcsSUFBSSxDQUFDLGFBQWEsQ0FBQyxZQUFZLENBQUMsQ0FBQztRQUMxRCxNQUFNLGVBQWUsR0FBRyxXQUFXLENBQUMsTUFBTSxDQUFDO1FBRTNDLHdFQUF3RTtRQUN4RSx3RUFBd0U7UUFDeEUsSUFBSSxZQUFZLEdBQUcsSUFBSSxDQUFDLFlBQVksQ0FBQztRQUNyQyxJQUFJLFlBQVksQ0FBQyxNQUFNLEtBQUssZ0JBQWdCLElBQUksWUFBWSxDQUFDLE1BQU0sS0FBSyxDQUFDLEVBQUU7WUFDekUsTUFBTSxRQUFRLEdBQUcsSUFBSSxDQUFDLGlCQUFpQixDQUFDO1lBQ3hDLElBQUksQ0FBQyxHQUFHLEVBQUU7Z0JBQ1IsTUFBTSxrQkFBa0IsR0FBRyxPQUFPLENBQUMsWUFBWSxFQUFFLFFBQVEsQ0FBQyxDQUFDO2dCQUMzRCxNQUFNLFlBQVksR0FBRyxXQUFXLENBQUMsa0JBQWtCLEVBQUUsWUFBWSxDQUFDLENBQUM7Z0JBQ25FLFlBQVksR0FBRyxZQUFZLENBQUMsUUFBUSxFQUFFLENBQUM7WUFDekMsQ0FBQyxDQUFDLENBQUM7U0FDSjtRQUVELHNFQUFzRTtRQUN0RSwwRUFBMEU7UUFDMUUscURBQXFEO1FBQ3JELElBQUksUUFBUSxHQUFHLENBQUMsQ0FBQyxDQUFFLHlDQUF5QztRQUM1RCxJQUFJLFFBQVEsR0FBRyxDQUFDLENBQUMsQ0FBRSxnREFBZ0Q7UUFDbkUsSUFBSSxNQUFNLEdBQUcsQ0FBQyxDQUFDLENBQUksZ0RBQWdEO1FBQ25FLEtBQUssSUFBSSxJQUFJLEdBQUcsQ0FBQyxFQUFFLElBQUksSUFBSSxlQUFlLEVBQUUsRUFBRSxJQUFJLEVBQUU7WUFDbEQsb0VBQW9FO1lBQ3BFLElBQUksSUFBSSxHQUFHLElBQUksR0FBRyxlQUFlLENBQUMsQ0FBQyxDQUFDLFdBQVcsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUM7WUFFM0Qsc0VBQXNFO1lBQ3RFLGFBQWE7WUFDYixJQUFJLElBQUksS0FBSyxNQUFNLEVBQUU7Z0JBQ25CLEVBQUUsTUFBTSxDQUFDO2dCQUNULFNBQVM7YUFDVjtZQUVELHVFQUF1RTtZQUN2RSxvRUFBb0U7WUFDcEUsb0VBQW9FO1lBQ3BFLGlCQUFpQjtZQUNqQixJQUFJLFFBQVEsR0FBRyxNQUFNLEVBQUU7Z0JBQ3JCLDhCQUE4QjtnQkFDOUIsTUFBTSxHQUFHLEdBQUcsVUFBVSxDQUFDLFFBQVEsQ0FBQyxRQUFRLEdBQUcsZ0JBQWdCLENBQUMsQ0FBQztnQkFDN0QsTUFBTSxHQUFHLEdBQUcsVUFBVSxDQUFDLFFBQVEsQ0FBQyxRQUFRLEdBQUcsZ0JBQWdCLENBQUMsQ0FBQztnQkFDN0QsTUFBTSxLQUFLLEdBQUcsQ0FBQyxNQUFNLEdBQUcsUUFBUSxDQUFDLEdBQUcsZ0JBQWdCLENBQUM7Z0JBQ3JELFNBQVMsQ0FBQyxHQUFHLEVBQUUsR0FBRyxFQUFFLEtBQUssQ0FBQyxDQUFDO2FBQzVCO1lBRUQsK0NBQStDO1lBQy9DLElBQUksSUFBSSxJQUFJLGVBQWUsRUFBRTtnQkFDM0IsMERBQTBEO2dCQUMxRCxNQUFNLFVBQVUsR0FBRyxZQUFZLENBQUMsTUFBTSxDQUFDO2dCQUN2QyxJQUFJLEdBQUcsSUFBSSxDQUFDLEtBQUssQ0FBQyxVQUFVLEdBQUcsZ0JBQWdCLENBQUMsQ0FBQzthQUNsRDtZQUNELElBQUksSUFBSSxHQUFHLE1BQU0sRUFBRTtnQkFDakIsSUFBSSxJQUFJLENBQUMsWUFBWSxDQUFDLE1BQU0sS0FBSyxDQUFDLEVBQUU7b0JBQ2xDLFVBQVU7eUJBQ0wsUUFBUSxDQUFDLE1BQU0sR0FBRyxnQkFBZ0IsRUFBRSxJQUFJLEdBQUcsZ0JBQWdCLENBQUM7eUJBQzVELElBQUksQ0FBQyxJQUFJLENBQUMsWUFBWSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUM7b0JBQ2hDLE1BQU0sR0FBRyxJQUFJLENBQUM7aUJBQ2Y7cUJBQU07b0JBQ0wsT0FBTyxJQUFJLEdBQUcsTUFBTSxFQUFFO3dCQUNwQixNQUFNLEdBQUcsR0FBRyxVQUFVLENBQUMsS0FBSyxDQUFDLE1BQU0sR0FBRyxnQkFBZ0IsQ0FBQyxDQUFDO3dCQUN4RCxTQUFTLENBQUMsR0FBRyxFQUFFLFlBQVksRUFBRSxnQkFBZ0IsQ0FBQyxDQUFDO3dCQUMvQyxFQUFFLE1BQU0sQ0FBQztxQkFDVjtpQkFDRjthQUNGO1lBRUQsa0JBQWtCO1lBQ2xCLElBQUksSUFBSSxHQUFHLENBQUMsRUFBRTtnQkFDWixtRUFBbUU7Z0JBQ25FLFFBQVEsR0FBRyxJQUFJLEdBQUcsQ0FBQyxDQUFDO2dCQUNwQixRQUFRLEdBQUcsTUFBTSxDQUFDO2FBQ25CO2lCQUFNO2dCQUNMLGdFQUFnRTtnQkFDaEUsUUFBUSxHQUFHLElBQUksQ0FBQztnQkFDaEIsUUFBUSxHQUFHLE1BQU0sQ0FBQztnQkFDbEIsTUFBTSxHQUFHLFFBQVEsR0FBRyxDQUFDLENBQUM7YUFDdkI7U0FDRjtJQUNILENBQUM7Q0FDRjtBQUVELFNBQVMsU0FBUyxDQUFDLEdBQWUsRUFBRSxHQUFlLEVBQUUsSUFBWTtJQUMvRCxLQUFLLElBQUksQ0FBQyxHQUFHLENBQUMsRUFBRSxDQUFDLEdBQUcsSUFBSSxFQUFFLENBQUMsRUFBRSxFQUFFO1FBQzdCLEdBQUcsQ0FBQyxDQUFDLENBQUMsR0FBRyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUM7S0FDakI7QUFDSCxDQUFDO0FBRUQsU0FBUyxTQUFTLENBQUMsS0FBMEIsRUFBRSxTQUFrQjtJQUMvRCxNQUFNLEdBQUcsR0FBYSxFQUFFLENBQUM7SUFDekIsS0FBSyxJQUFJLEdBQUcsSUFBSSxLQUFLLEVBQUU7UUFDckIsSUFBSSxHQUFHLEdBQUcsQ0FBQyxFQUFFO1lBQ1gsSUFBSSxDQUFDLFNBQVMsRUFBRTtnQkFDZCxNQUFNLElBQUksS0FBSyxDQUFDLGFBQWEsR0FBRyxlQUFlLENBQUMsQ0FBQzthQUNsRDtZQUNELElBQUksR0FBRyxHQUFHLENBQUMsQ0FBQyxFQUFFO2dCQUNaLE1BQU0sSUFBSSxLQUFLLENBQUMsYUFBYSxHQUFHLGdCQUFnQixDQUFDLENBQUM7YUFDbkQ7WUFDRCxHQUFHLEdBQUcsQ0FBQyxDQUFDLENBQUM7U0FDVjtRQUNELEdBQUcsQ0FBQyxJQUFJLENBQUMsR0FBRyxDQUFDLENBQUM7S0FDZjtJQUVELE9BQU8sR0FBRyxDQUFDO0FBQ2IsQ0FBQztBQUVELE1BQU0sVUFBVSx3QkFBd0IsQ0FDcEMsS0FBaUIsRUFBRSxXQUFxQixFQUFFLE1BQWtCLEVBQzVELFdBQXFCLEVBQUUsV0FBcUIsRUFBRSxZQUF3QixFQUN0RSxpQkFBMkIsRUFBRSxrQkFBZ0MsRUFDN0Qsd0JBQW9DLEVBQ3BDLGlCQUEyQjtJQUM3QixPQUFPLElBQUksc0JBQXNCLENBQ3RCLEtBQUssRUFBRSxXQUFXLEVBQUUsTUFBTSxFQUFFLFdBQVcsRUFBRSxXQUFXLEVBQUUsWUFBWSxFQUNsRSxpQkFBaUIsRUFBRSxrQkFBa0IsRUFBRSx3QkFBd0IsRUFDL0QsaUJBQWlCLENBQUM7U0FDeEIsT0FBTyxFQUFFLENBQUM7QUFDakIsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbIi8qKlxuICogQGxpY2Vuc2VcbiAqIENvcHlyaWdodCAyMDIyIEdvb2dsZSBMTEMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuXG4gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgXCJMaWNlbnNlXCIpO1xuICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLlxuICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0XG4gKlxuICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wXG4gKlxuICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZVxuICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gXCJBUyBJU1wiIEJBU0lTLFxuICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuXG4gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kXG4gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS5cbiAqID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4gKi9cblxuaW1wb3J0IHtiYWNrZW5kX3V0aWwsIGJyb2FkY2FzdFRvLCBEYXRhVHlwZSwgcmVzaGFwZSwgdGlkeSwgVHlwZWRBcnJheSwgdXRpbH0gZnJvbSAnQHRlbnNvcmZsb3cvdGZqcy1jb3JlJztcblxuaW1wb3J0IFJvd1BhcnRpdGlvblR5cGUgPSBiYWNrZW5kX3V0aWwuUm93UGFydGl0aW9uVHlwZTtcbi8vIEJhc2VkIG9uXG4vLyBodHRwczovL2dpdGh1Yi5jb20vdGVuc29yZmxvdy90ZW5zb3JmbG93L2Jsb2IvbWFzdGVyL3RlbnNvcmZsb3cvY29yZS9rZXJuZWxzL3JhZ2dlZF90ZW5zb3JfdG9fdGVuc29yX29wLmNjXG5jbGFzcyBSYWdnZWRUZW5zb3JUb1RlbnNvck9wIHtcbiAgcHJpdmF0ZSByZWFkb25seSByb3dQYXJ0aXRpb25UeXBlczogUm93UGFydGl0aW9uVHlwZVtdO1xuICBwcml2YXRlIHJlYWRvbmx5IHJhZ2dlZFJhbms6IG51bWJlcjtcbiAgY29uc3RydWN0b3IoXG4gICAgICBwcml2YXRlIHNoYXBlOiBUeXBlZEFycmF5LCBwcml2YXRlIHNoYXBlU2hhcGU6IG51bWJlcltdLFxuICAgICAgcHJpdmF0ZSB2YWx1ZXM6IFR5cGVkQXJyYXksIHByaXZhdGUgdmFsdWVzU2hhcGU6IG51bWJlcltdLFxuICAgICAgcHJpdmF0ZSB2YWx1ZXNEVHlwZTogRGF0YVR5cGUsIHByaXZhdGUgZGVmYXVsdFZhbHVlOiBUeXBlZEFycmF5LFxuICAgICAgcHJpdmF0ZSBkZWZhdWx0VmFsdWVTaGFwZTogbnVtYmVyW10sXG4gICAgICBwcml2YXRlIHJlYWRvbmx5IHJvd1BhcnRpdGlvblZhbHVlczogVHlwZWRBcnJheVtdLFxuICAgICAgcHJpdmF0ZSByZWFkb25seSByb3dQYXJ0aXRpb25WYWx1ZXNTaGFwZXM6IG51bWJlcltdW10sXG4gICAgICByb3dQYXJ0aXRpb25UeXBlU3RyaW5nczogc3RyaW5nW10pIHtcbiAgICB0aGlzLnJvd1BhcnRpdGlvblR5cGVzID1cbiAgICAgICAgYmFja2VuZF91dGlsLmdldFJvd1BhcnRpdGlvblR5cGVzSGVscGVyKHJvd1BhcnRpdGlvblR5cGVTdHJpbmdzKTtcbiAgICB0aGlzLnJhZ2dlZFJhbmsgPSBiYWNrZW5kX3V0aWwuZ2V0UmFnZ2VkUmFuayh0aGlzLnJvd1BhcnRpdGlvblR5cGVzKTtcbiAgfVxuXG4gIHByaXZhdGUgZ2V0Um93UGFydGl0aW9uVHlwZUJ5RGltZW5zaW9uKGRpbWVuc2lvbjogbnVtYmVyKSB7XG4gICAgaWYgKHRoaXMucm93UGFydGl0aW9uVHlwZXNbMF0gPT09IFJvd1BhcnRpdGlvblR5cGUuRklSU1RfRElNX1NJWkUpIHtcbiAgICAgIHJldHVybiB0aGlzLnJvd1BhcnRpdGlvblR5cGVzW2RpbWVuc2lvbiArIDFdO1xuICAgIH0gZWxzZSB7XG4gICAgICByZXR1cm4gdGhpcy5yb3dQYXJ0aXRpb25UeXBlc1tkaW1lbnNpb25dO1xuICAgIH1cbiAgfVxuXG4gIC8vIFJldHVybnMgdGhlIHJlbGF0aW9uc2hpcCBiZXR3ZWVuIGRpbWVuc2lvbiBhbmQgZGltZW5zaW9uICsgMS5cbiAgcHJpdmF0ZSBnZXRSb3dQYXJ0aXRpb25UZW5zb3IoZGltZW5zaW9uOiBudW1iZXIpIHtcbiAgICBpZiAodGhpcy5yb3dQYXJ0aXRpb25UeXBlc1swXSA9PT0gUm93UGFydGl0aW9uVHlwZS5GSVJTVF9ESU1fU0laRSkge1xuICAgICAgcmV0dXJuIHRoaXMucm93UGFydGl0aW9uVmFsdWVzW2RpbWVuc2lvbiArIDFdO1xuICAgIH0gZWxzZSB7XG4gICAgICByZXR1cm4gdGhpcy5yb3dQYXJ0aXRpb25WYWx1ZXNbZGltZW5zaW9uXTtcbiAgICB9XG4gIH1cblxuICBwcml2YXRlIGdldE1heFdpZHRoKGRpbWVuc2lvbjogbnVtYmVyKSB7XG4gICAgY29uc3Qgcm93UGFydGl0aW9uVGVuc29yID0gdGhpcy5nZXRSb3dQYXJ0aXRpb25UZW5zb3IoZGltZW5zaW9uIC0gMSk7XG4gICAgc3dpdGNoICh0aGlzLmdldFJvd1BhcnRpdGlvblR5cGVCeURpbWVuc2lvbihkaW1lbnNpb24gLSAxKSkge1xuICAgICAgY2FzZSBSb3dQYXJ0aXRpb25UeXBlLlZBTFVFX1JPV0lEUzpcbiAgICAgICAgcmV0dXJuIFJhZ2dlZFRlbnNvclRvVGVuc29yT3AuZ2V0TWF4V2lkdGhWYWx1ZVJvd0lEKHJvd1BhcnRpdGlvblRlbnNvcik7XG4gICAgICBjYXNlIFJvd1BhcnRpdGlvblR5cGUuUk9XX1NQTElUUzpcbiAgICAgICAgcmV0dXJuIFJhZ2dlZFRlbnNvclRvVGVuc29yT3AuZ2V0TWF4V2lkdGhSb3dTcGxpdChyb3dQYXJ0aXRpb25UZW5zb3IpO1xuICAgICAgZGVmYXVsdDpcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKGBDYW5ub3QgaGFuZGxlIHBhcnRpdGlvbiB0eXBlICR7XG4gICAgICAgICAgICBSb3dQYXJ0aXRpb25UeXBlW3RoaXMuZ2V0Um93UGFydGl0aW9uVHlwZUJ5RGltZW5zaW9uKFxuICAgICAgICAgICAgICAgIGRpbWVuc2lvbiAtIDEpXX1gKTtcbiAgICB9XG4gIH1cblxuICBzdGF0aWMgZ2V0TWF4V2lkdGhSb3dTcGxpdChyb3dTcGxpdDogVHlwZWRBcnJheSkge1xuICAgIGNvbnN0IHRlbnNvckxlbmd0aCA9IHJvd1NwbGl0Lmxlbmd0aDtcbiAgICBpZiAodGVuc29yTGVuZ3RoID09PSAwIHx8IHRlbnNvckxlbmd0aCA9PT0gMSkge1xuICAgICAgcmV0dXJuIDA7XG4gICAgfVxuICAgIGxldCBtYXhXaWR0aCA9IDA7XG4gICAgZm9yIChsZXQgaSA9IDA7IGkgPCB0ZW5zb3JMZW5ndGggLSAxOyArK2kpIHtcbiAgICAgIGNvbnN0IGN1cnJlbnRXaWR0aCA9IHJvd1NwbGl0W2kgKyAxXSAtIHJvd1NwbGl0W2ldO1xuICAgICAgaWYgKGN1cnJlbnRXaWR0aCA+IG1heFdpZHRoKSB7XG4gICAgICAgIG1heFdpZHRoID0gY3VycmVudFdpZHRoO1xuICAgICAgfVxuICAgIH1cbiAgICByZXR1cm4gbWF4V2lkdGg7XG4gIH1cblxuICBzdGF0aWMgZ2V0TWF4V2lkdGhWYWx1ZVJvd0lEKHZhbHVlUm93SWRzOiBUeXBlZEFycmF5KSB7XG4gICAgY29uc3QgaW5kZXhMZW5ndGggPSB2YWx1ZVJvd0lkcy5sZW5ndGg7XG4gICAgaWYgKGluZGV4TGVuZ3RoID09PSAwKSB7XG4gICAgICByZXR1cm4gMDtcbiAgICB9XG4gICAgbGV0IGZpcnN0RXF1YWxJbmRleCA9IDA7XG4gICAgbGV0IGZpcnN0RXF1YWxJbmRleFZhbHVlID0gdmFsdWVSb3dJZHNbMF07XG4gICAgbGV0IG1heFdpZHRoID0gMDtcbiAgICBmb3IgKGxldCBpID0gMTsgaSA8IGluZGV4TGVuZ3RoOyArK2kpIHtcbiAgICAgIGNvbnN0IHZhbHVlID0gdmFsdWVSb3dJZHNbaV07XG4gICAgICBpZiAodmFsdWUgIT09IGZpcnN0RXF1YWxJbmRleFZhbHVlKSB7XG4gICAgICAgIGZpcnN0RXF1YWxJbmRleFZhbHVlID0gdmFsdWU7XG4gICAgICAgIG1heFdpZHRoID0gTWF0aC5tYXgoaSAtIGZpcnN0RXF1YWxJbmRleCwgbWF4V2lkdGgpO1xuICAgICAgICBmaXJzdEVxdWFsSW5kZXggPSBpO1xuICAgICAgfVxuICAgIH1cbiAgICByZXR1cm4gTWF0aC5tYXgoaW5kZXhMZW5ndGggLSBmaXJzdEVxdWFsSW5kZXgsIG1heFdpZHRoKTtcbiAgfVxuXG4gIHByaXZhdGUgdGVuc29yU2hhcGVGcm9tVGVuc29yKFxuICAgICAgdDogVHlwZWRBcnJheSwgdFNoYXBlOiBudW1iZXJbXSwgaXNQYXJ0aWFsID0gdHJ1ZSkge1xuICAgIGlmICh0U2hhcGUubGVuZ3RoID09PSAwKSB7XG4gICAgICBpZiAodFswXSA9PT0gLTEpIHtcbiAgICAgICAgcmV0dXJuIFtdO1xuICAgICAgfVxuICAgICAgdGhyb3cgbmV3IEVycm9yKFxuICAgICAgICAgIGBUaGUgb25seSB2YWxpZCBzY2FsYXIgc2hhcGUgdGVuc29yIGlzIHRoZSBmdWxseSB1bmtub3duIHNoYXBlIHNwZWNpZmllZCBhcyAtMS5gKTtcbiAgICB9XG4gICAgLy8gTWFrZVBhcnRpYWxTaGFwZS9NYWtlU2hhcGVIZWxwZXIuXG4gICAgcmV0dXJuIG1ha2VTaGFwZSh0LCBpc1BhcnRpYWwpO1xuICB9XG5cbiAgcHJpdmF0ZSBjYWxjdWxhdGVPdXRwdXRTaXplKGZpcnN0RGltOiBudW1iZXIpIHtcbiAgICBjb25zdCB2YWx1ZVNoYXBlID0gdGhpcy52YWx1ZXNTaGFwZTtcbiAgICBjb25zdCBkZWZhdWx0VmFsdWVTaGFwZSA9IHRoaXMuZGVmYXVsdFZhbHVlU2hhcGU7XG5cbiAgICBiYWNrZW5kX3V0aWwudmFsaWRhdGVEZWZhdWx0VmFsdWVTaGFwZShkZWZhdWx0VmFsdWVTaGFwZSwgdmFsdWVTaGFwZSk7XG5cbiAgICBjb25zdCBzaGFwZSA9IHRoaXMudGVuc29yU2hhcGVGcm9tVGVuc29yKHRoaXMuc2hhcGUsIHRoaXMuc2hhcGVTaGFwZSk7XG4gICAgY29uc3Qgb3V0cHV0U2hhcGUgPSBiYWNrZW5kX3V0aWwuY29tYmluZVJhZ2dlZFRlbnNvclRvVGVuc29yU2hhcGVzKFxuICAgICAgICB0aGlzLnJhZ2dlZFJhbmssIHNoYXBlLCB2YWx1ZVNoYXBlKTtcblxuICAgIGNvbnN0IHJlc3VsdCA9IG91dHB1dFNoYXBlO1xuXG4gICAgaWYgKHJlc3VsdFswXSA8IDApIHtcbiAgICAgIHJlc3VsdFswXSA9IGZpcnN0RGltO1xuICAgIH1cbiAgICBmb3IgKGxldCBpID0gMTsgaSA8PSB0aGlzLnJhZ2dlZFJhbms7ICsraSkge1xuICAgICAgaWYgKHJlc3VsdFtpXSA8IDApIHtcbiAgICAgICAgcmVzdWx0W2ldID0gdGhpcy5nZXRNYXhXaWR0aChpKTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICByZXR1cm4gcmVzdWx0O1xuICB9XG5cbiAgLyoqXG4gICAqIFRoZSBvdXRwdXRJbmRleCByZXByZXNlbnRzIHRoZSBpbmRleCBpbiB0aGUgb3V0cHV0IHRlbnNvclxuICAgKiB3aGVyZSB0aGUgZmlyc3QgZWxlbWVudCBvZiBhIHBhcnRpY3VsYXIgZGltZW5zaW9uIHdvdWxkIGJlIHdyaXR0ZW4uXG4gICAqIElmIGl0IGlzIC0xLCBpdCBpbmRpY2F0ZXMgdGhhdCB0aGUgaW5kZXggaXMgb3V0IG9mIHNjb3BlLlxuICAgKiBFeGFtcGxlLCBnaXZlbiBmaXJzdERpbWVuc2lvbiA9IDEwLCBmaXJzdERpbWVuc2lvbk91dHB1dCA9IDYsXG4gICAqIGFuZCBvdXRwdXRJbmRleE11bHRpcGxpZXIgPSAxMDA6XG4gICAqIHJlc3VsdCA9IFswIDEwMCAyMDAgMzAwIDQwMCA1MDAgLTEgLTEgLTEgLTFdXG4gICAqIElmIGZpcnN0RGltZW5zaW9uT3V0cHV0ID0gMTEgaW5zdGVhZCwgdGhlbjpcbiAgICogcmVzdWx0ID0gWzAgMTAwIDIwMCAzMDAgNDAwIDUwMCA2MDAgNzAwIDgwMCA5MDBdXG4gICAqL1xuICBwcml2YXRlIGNhbGN1bGF0ZUZpcnN0UGFyZW50T3V0cHV0SW5kZXgoXG4gICAgICBmaXJzdERpbWVuc2lvbjogbnVtYmVyLCBvdXRwdXRJbmRleE11bHRpcGxpZXI6IG51bWJlcixcbiAgICAgIGZpcnN0RGltZW5zaW9uT3V0cHV0OiBudW1iZXIpIHtcbiAgICBjb25zdCBtaW5EaW1lbnNpb24gPSBNYXRoLm1pbihmaXJzdERpbWVuc2lvbiwgZmlyc3REaW1lbnNpb25PdXRwdXQpO1xuICAgIGNvbnN0IHJlc3VsdDogbnVtYmVyW10gPSBbXTtcbiAgICBsZXQgY3VycmVudE91dHB1dEluZGV4ID0gMDtcbiAgICBmb3IgKGxldCBpID0gMDsgaSA8IG1pbkRpbWVuc2lvbjtcbiAgICAgICAgICsraSwgY3VycmVudE91dHB1dEluZGV4ICs9IG91dHB1dEluZGV4TXVsdGlwbGllcikge1xuICAgICAgcmVzdWx0LnB1c2goY3VycmVudE91dHB1dEluZGV4KTtcbiAgICB9XG4gICAgZm9yIChsZXQgaSA9IG1pbkRpbWVuc2lvbjsgaSA8IGZpcnN0RGltZW5zaW9uOyArK2kpIHtcbiAgICAgIHJlc3VsdC5wdXNoKC0xKTtcbiAgICB9XG4gICAgdXRpbC5hc3NlcnQoXG4gICAgICAgIHJlc3VsdC5sZW5ndGggPT09IGZpcnN0RGltZW5zaW9uLFxuICAgICAgICAoKSA9PiAnRmluYWwgbGVuZ3RoIG9mIHJlc3VsdCBtdXN0IGJlIGVxdWFsIHRvIGZpcnN0RGltZW5zaW9uLicpO1xuXG4gICAgcmV0dXJuIHJlc3VsdDtcbiAgfVxuXG4gIHByaXZhdGUgY2FsY3VsYXRlT3V0cHV0SW5kZXhSb3dTcGxpdChcbiAgICAgIHJvd1NwbGl0OiBUeXBlZEFycmF5LCBwYXJlbnRPdXRwdXRJbmRleDogbnVtYmVyW10sXG4gICAgICBvdXRwdXRJbmRleE11bHRpcGxpZXI6IG51bWJlciwgb3V0cHV0U2l6ZTogbnVtYmVyKSB7XG4gICAgY29uc3Qgcm93U3BsaXRTaXplID0gcm93U3BsaXQubGVuZ3RoO1xuICAgIGNvbnN0IHJlc3VsdDogbnVtYmVyW10gPSBbXTtcbiAgICBmb3IgKGxldCBpID0gMDsgaSA8IHJvd1NwbGl0U2l6ZSAtIDE7ICsraSkge1xuICAgICAgY29uc3Qgcm93TGVuZ3RoID0gcm93U3BsaXRbaSArIDFdIC0gcm93U3BsaXRbaV07XG4gICAgICBsZXQgcmVhbExlbmd0aCA9IE1hdGgubWluKG91dHB1dFNpemUsIHJvd0xlbmd0aCk7XG4gICAgICBsZXQgcGFyZW50T3V0cHV0SW5kZXhDdXJyZW50ID0gcGFyZW50T3V0cHV0SW5kZXhbaV07XG5cbiAgICAgIGlmIChwYXJlbnRPdXRwdXRJbmRleEN1cnJlbnQgPT09IC0xKSB7XG4gICAgICAgIHJlYWxMZW5ndGggPSAwO1xuICAgICAgfVxuICAgICAgZm9yIChsZXQgaiA9IDA7IGogPCByZWFsTGVuZ3RoOyArK2opIHtcbiAgICAgICAgcmVzdWx0LnB1c2gocGFyZW50T3V0cHV0SW5kZXhDdXJyZW50KTtcbiAgICAgICAgcGFyZW50T3V0cHV0SW5kZXhDdXJyZW50ICs9IG91dHB1dEluZGV4TXVsdGlwbGllcjtcbiAgICAgIH1cbiAgICAgIGZvciAobGV0IGogPSAwOyBqIDwgcm93TGVuZ3RoIC0gcmVhbExlbmd0aDsgKytqKSB7XG4gICAgICAgIHJlc3VsdC5wdXNoKC0xKTtcbiAgICAgIH1cbiAgICB9XG4gICAgaWYgKHJvd1NwbGl0U2l6ZSA+IDAgJiYgcmVzdWx0Lmxlbmd0aCAhPT0gcm93U3BsaXRbcm93U3BsaXRTaXplIC0gMV0pIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcignSW52YWxpZCByb3cgc3BsaXQgc2l6ZS4nKTtcbiAgICB9XG5cbiAgICByZXR1cm4gcmVzdWx0O1xuICB9XG5cbiAgLy8gQ2FsY3VsYXRlIHRoZSBvdXRwdXQgaW5kZXggb2YgdGhlIGZpcnN0IGVsZW1lbnQgb2YgYSBsaXN0LlxuICAvLyBUaGUgcGFyZW50T3V0cHV0SW5kZXggaXMgdGhlIHNhbWUgY29tcHV0YXRpb24gZm9yIHRoZSBwcmV2aW91cyBsaXN0LlxuICAvLyAtMSBpbmRpY2F0ZXMgYW4gZWxlbWVudCBvciBsaXN0IHRoYXQgaXMgb3V0IG9mIHJhbmdlLlxuICAvLyBUaGUgb3V0cHV0SW5kZXhNdWx0aXBsaWVyIGlzIHRoZSBudW1iZXIgb2Ygb3V0cHV0IGluZGljZXMgb25lIG1vdmVzXG4gIC8vIGZvcndhcmQgZm9yIGVhY2ggY29sdW1uLlxuICAvLyBFLmcuLCBnaXZlbjpcbiAgLy8gdmFsdWVSb3dJZHM6WzAgMSAyIDIgMiAzIDUgNSA2XVxuICAvLyBwYXJlbnRPdXRwdXRJbmRleDpbMTAwMCAxMTAwIDIwMDAgMjEwMCAtMSAzMDAwIDQwMDBdXG4gIC8vIG91dHB1dEluZGV4TXVsdGlwbGllcjogMTBcbiAgLy8gb3V0cHV0U2l6ZTogMlxuICAvLyBZb3UgZ2V0OlxuICAvLyByZXN1bHQgPSBbMTAwMCAxMTAwIDIwMDAgMjAxMCAtMSAyMTAwIC0xIC0xIDMwMDBdXG4gIC8vIHJlc3VsdFswXSA9IHBhcmVudE91dHB1dEluZGV4W3ZhbHVlUm93SWRzWzBdXVxuICAvLyByZXN1bHRbMV0gPSBwYXJlbnRPdXRwdXRJbmRleFt2YWx1ZVJvd0lkc1sxXV1cbiAgLy8gcmVzdWx0WzJdID0gcGFyZW50T3V0cHV0SW5kZXhbdmFsdWVSb3dJZHNbMl1dXG4gIC8vIHJlc3VsdFszXSA9IHBhcmVudE91dHB1dEluZGV4W3ZhbHVlUm93SWRzWzJdICsgMTBdXG4gIC8vIHJlc3VsdFs0XSA9IC0xIGJlY2F1c2UgaXQgaXMgdGhlIHRoaXJkIGVsZW1lbnQgdGhlIHNpemUgaXMgMi5cbiAgLy8gcmVzdWx0WzVdID0gcGFyZW50T3V0cHV0SW5kZXhbdmFsdWVSb3dJZHNbM11dXG4gIC8vIHJlc3VsdFs2XSA9IC0xIGJlY2F1c2UgcGFyZW50T3V0cHV0SW5kZXhbdmFsdWVSb3dJZHNbNl1dID09IC0xXG4gIC8vIHJlc3VsdFs3XSA9IC0xIGJlY2F1c2UgcGFyZW50T3V0cHV0SW5kZXhbdmFsdWVSb3dJZHNbNl1dID09IC0xXG4gIC8vIHJlc3VsdFs4XSA9IHBhcmVudE91dHB1dEluZGV4W3ZhbHVlUm93SWRzWzddXVxuICBwcml2YXRlIGNhbGN1bGF0ZU91dHB1dEluZGV4VmFsdWVSb3dJRChcbiAgICAgIHZhbHVlUm93SWRzOiBUeXBlZEFycmF5LCBwYXJlbnRPdXRwdXRJbmRleDogbnVtYmVyW10sXG4gICAgICBvdXRwdXRJbmRleE11bHRpcGxpZXI6IG51bWJlciwgb3V0cHV0U2l6ZTogbnVtYmVyKSB7XG4gICAgY29uc3QgaW5kZXhTaXplID0gdmFsdWVSb3dJZHMubGVuZ3RoO1xuICAgIGNvbnN0IHJlc3VsdDogbnVtYmVyW10gPSBbXTtcbiAgICBpZiAoaW5kZXhTaXplID09PSAwKSB7XG4gICAgICByZXR1cm4gW107XG4gICAgfVxuXG4gICAgbGV0IGN1cnJlbnRPdXRwdXRDb2x1bW4gPSAwO1xuICAgIGxldCBjdXJyZW50VmFsdWVSb3dJZCA9IHZhbHVlUm93SWRzWzBdO1xuXG4gICAgaWYgKGN1cnJlbnRWYWx1ZVJvd0lkID49IHBhcmVudE91dHB1dEluZGV4Lmxlbmd0aCkge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKFxuICAgICAgICAgIGBHb3QgY3VycmVudFZhbHVlUm93SWQ9JHtjdXJyZW50VmFsdWVSb3dJZH0sIHdoaWNoIGlzIG5vdCBsZXNzIHRoYW4gJHtcbiAgICAgICAgICAgICAgcGFyZW50T3V0cHV0SW5kZXgubGVuZ3RofWApO1xuICAgIH1cblxuICAgIGxldCBjdXJyZW50T3V0cHV0SW5kZXggPSBwYXJlbnRPdXRwdXRJbmRleFtjdXJyZW50VmFsdWVSb3dJZF07XG4gICAgcmVzdWx0LnB1c2goY3VycmVudE91dHB1dEluZGV4KTtcbiAgICBmb3IgKGxldCBpID0gMTsgaSA8IGluZGV4U2l6ZTsgKytpKSB7XG4gICAgICBjb25zdCBuZXh0VmFsdWVSb3dJZCA9IHZhbHVlUm93SWRzW2ldO1xuICAgICAgaWYgKG5leHRWYWx1ZVJvd0lkID09PSBjdXJyZW50VmFsdWVSb3dJZCkge1xuICAgICAgICBpZiAoY3VycmVudE91dHB1dEluZGV4ID49IDApIHtcbiAgICAgICAgICArK2N1cnJlbnRPdXRwdXRDb2x1bW47XG4gICAgICAgICAgaWYgKGN1cnJlbnRPdXRwdXRDb2x1bW4gPCBvdXRwdXRTaXplKSB7XG4gICAgICAgICAgICBjdXJyZW50T3V0cHV0SW5kZXggKz0gb3V0cHV0SW5kZXhNdWx0aXBsaWVyO1xuICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICBjdXJyZW50T3V0cHV0SW5kZXggPSAtMTtcbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIGN1cnJlbnRPdXRwdXRDb2x1bW4gPSAwO1xuICAgICAgICBjdXJyZW50VmFsdWVSb3dJZCA9IG5leHRWYWx1ZVJvd0lkO1xuXG4gICAgICAgIGlmIChuZXh0VmFsdWVSb3dJZCA+PSBwYXJlbnRPdXRwdXRJbmRleC5sZW5ndGgpIHtcbiAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoXG4gICAgICAgICAgICAgIGBHb3QgbmV4dFZhbHVlUm93SWQ9JHtuZXh0VmFsdWVSb3dJZH0gd2hpY2ggaXMgbm90IGxlc3MgdGhhbiAke1xuICAgICAgICAgICAgICAgICAgcGFyZW50T3V0cHV0SW5kZXgubGVuZ3RofWApO1xuICAgICAgICB9XG5cbiAgICAgICAgY3VycmVudE91dHB1dEluZGV4ID0gcGFyZW50T3V0cHV0SW5kZXhbbmV4dFZhbHVlUm93SWRdO1xuICAgICAgfVxuICAgICAgcmVzdWx0LnB1c2goY3VycmVudE91dHB1dEluZGV4KTtcbiAgICB9XG5cbiAgICBpZiAocmVzdWx0Lmxlbmd0aCAhPT0gdmFsdWVSb3dJZHMubGVuZ3RoKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoJ0ludmFsaWQgcm93IGlkcy4nKTtcbiAgICB9XG5cbiAgICByZXR1cm4gcmVzdWx0O1xuICB9XG5cbiAgcHJpdmF0ZSBjYWxjdWxhdGVPdXRwdXRJbmRleChcbiAgICAgIGRpbWVuc2lvbjogbnVtYmVyLCBwYXJlbnRPdXRwdXRJbmRleDogbnVtYmVyW10sXG4gICAgICBvdXRwdXRJbmRleE11bHRpcGxpZXI6IG51bWJlciwgb3V0cHV0U2l6ZTogbnVtYmVyKSB7XG4gICAgY29uc3Qgcm93UGFydGl0aW9uVGVuc29yID0gdGhpcy5nZXRSb3dQYXJ0aXRpb25UZW5zb3IoZGltZW5zaW9uKTtcbiAgICBjb25zdCBwYXJ0aXRpb25UeXBlID0gdGhpcy5nZXRSb3dQYXJ0aXRpb25UeXBlQnlEaW1lbnNpb24oZGltZW5zaW9uKTtcbiAgICBzd2l0Y2ggKHBhcnRpdGlvblR5cGUpIHtcbiAgICAgIGNhc2UgUm93UGFydGl0aW9uVHlwZS5WQUxVRV9ST1dJRFM6XG4gICAgICAgIHJldHVybiB0aGlzLmNhbGN1bGF0ZU91dHB1dEluZGV4VmFsdWVSb3dJRChcbiAgICAgICAgICAgIHJvd1BhcnRpdGlvblRlbnNvciwgcGFyZW50T3V0cHV0SW5kZXgsIG91dHB1dEluZGV4TXVsdGlwbGllcixcbiAgICAgICAgICAgIG91dHB1dFNpemUpO1xuICAgICAgY2FzZSBSb3dQYXJ0aXRpb25UeXBlLlJPV19TUExJVFM6XG4gICAgICAgIGlmIChyb3dQYXJ0aXRpb25UZW5zb3IubGVuZ3RoIC0gMSA+IHBhcmVudE91dHB1dEluZGV4Lmxlbmd0aCkge1xuICAgICAgICAgIHRocm93IG5ldyBFcnJvcihgUm93IHBhcnRpdGlvbiBzaXplIGlzIGdyZWF0ZXIgdGhhbiBvdXRwdXQgc2l6ZTogJHtcbiAgICAgICAgICAgICAgcm93UGFydGl0aW9uVGVuc29yLmxlbmd0aCAtIDF9ID4gJHtwYXJlbnRPdXRwdXRJbmRleC5sZW5ndGh9YCk7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHRoaXMuY2FsY3VsYXRlT3V0cHV0SW5kZXhSb3dTcGxpdChcbiAgICAgICAgICAgIHJvd1BhcnRpdGlvblRlbnNvciwgcGFyZW50T3V0cHV0SW5kZXgsIG91dHB1dEluZGV4TXVsdGlwbGllcixcbiAgICAgICAgICAgIG91dHB1dFNpemUpO1xuICAgICAgZGVmYXVsdDpcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKFxuICAgICAgICAgICAgYFVuc3VwcG9ydGVkIHBhcnRpdGlvbiB0eXBlOiAke1Jvd1BhcnRpdGlvblR5cGVbcGFydGl0aW9uVHlwZV19YCk7XG4gICAgfVxuICB9XG5cbiAgcHJpdmF0ZSBnZXRGaXJzdERpbWVuc2lvblNpemUoKSB7XG4gICAgY29uc3QgZmlyc3RQYXJ0aXRpb25UZW5zb3IgPSB0aGlzLnJvd1BhcnRpdGlvblZhbHVlc1swXTtcbiAgICBpZiAodGhpcy5yb3dQYXJ0aXRpb25UeXBlcy5sZW5ndGggPT09IDApIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcignTm8gcm93X3BhcnRpdGlvbl90eXBlcyBnaXZlbi4nKTtcbiAgICB9XG4gICAgY29uc3QgZmlyc3RQYXJ0aXRpb25UeXBlID0gdGhpcy5yb3dQYXJ0aXRpb25UeXBlc1swXTtcbiAgICBzd2l0Y2ggKGZpcnN0UGFydGl0aW9uVHlwZSkge1xuICAgICAgY2FzZSBSb3dQYXJ0aXRpb25UeXBlLkZJUlNUX0RJTV9TSVpFOlxuICAgICAgICByZXR1cm4gZmlyc3RQYXJ0aXRpb25UZW5zb3JbMF07XG4gICAgICBjYXNlIFJvd1BhcnRpdGlvblR5cGUuVkFMVUVfUk9XSURTOlxuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ0Nhbm5vdCBoYW5kbGUgVkFMVUVfUk9XSURTIGluIGZpcnN0IGRpbWVuc2lvbi4nKTtcbiAgICAgIGNhc2UgUm93UGFydGl0aW9uVHlwZS5ST1dfU1BMSVRTOlxuICAgICAgICByZXR1cm4gdGhpcy5yb3dQYXJ0aXRpb25WYWx1ZXNTaGFwZXNbMF1bMF0gLSAxO1xuICAgICAgZGVmYXVsdDpcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKFxuICAgICAgICAgICAgYENhbm5vdCBoYW5kbGUgdHlwZSAke1Jvd1BhcnRpdGlvblR5cGVbZmlyc3RQYXJ0aXRpb25UeXBlXX1gKTtcbiAgICB9XG4gIH1cblxuICBjb21wdXRlKCk6IFtudW1iZXJbXSwgVHlwZWRBcnJheV0ge1xuICAgIGNvbnN0IGZpcnN0UGFydGl0aW9uVGVuc29yID0gdGhpcy5yb3dQYXJ0aXRpb25WYWx1ZXNbMF07XG4gICAgaWYgKGZpcnN0UGFydGl0aW9uVGVuc29yLmxlbmd0aCA8PSAwKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoXG4gICAgICAgICAgJ0ludmFsaWQgZmlyc3QgcGFydGl0aW9uIGlucHV0LiAnICtcbiAgICAgICAgICAnVGVuc29yIHJlcXVpcmVzIGF0IGxlYXN0IG9uZSBlbGVtZW50LicpO1xuICAgIH1cbiAgICBjb25zdCBmaXJzdERpbWVuc2lvbiA9IHRoaXMuZ2V0Rmlyc3REaW1lbnNpb25TaXplKCk7XG4gICAgY29uc3Qgb3V0cHV0U2l6ZSA9IHRoaXMuY2FsY3VsYXRlT3V0cHV0U2l6ZShmaXJzdERpbWVuc2lvbik7XG4gICAgY29uc3QgbXVsdGlwbGllcjogbnVtYmVyW10gPSBuZXcgQXJyYXkodGhpcy5yYWdnZWRSYW5rICsgMSk7XG5cbiAgICBtdWx0aXBsaWVyW211bHRpcGxpZXIubGVuZ3RoIC0gMV0gPSAxO1xuICAgIGZvciAobGV0IGkgPSBtdWx0aXBsaWVyLmxlbmd0aCAtIDI7IGkgPj0gMDsgLS1pKSB7XG4gICAgICBtdWx0aXBsaWVyW2ldID0gbXVsdGlwbGllcltpICsgMV0gKiBvdXRwdXRTaXplW2kgKyAxXTtcbiAgICB9XG4gICAgLy8gRnVsbCBzaXplIG9mIHRoZSB0ZW5zb3IuXG4gICAgY29uc3Qgb3V0cHV0U2hhcGU6IG51bWJlcltdID0gbWFrZVNoYXBlKG91dHB1dFNpemUsIGZhbHNlKTtcbiAgICBjb25zdCBvdXRwdXRUZW5zb3IgPVxuICAgICAgICB1dGlsLmdldEFycmF5RnJvbURUeXBlKFxuICAgICAgICAgICAgdGhpcy52YWx1ZXNEVHlwZSwgdXRpbC5zaXplRnJvbVNoYXBlKG91dHB1dFNoYXBlKSkgYXMgVHlwZWRBcnJheTtcblxuICAgIGNvbnN0IGZ1bGxTaXplID0gbXVsdGlwbGllclswXSAqIG91dHB1dFNpemVbMF07XG4gICAgaWYgKGZ1bGxTaXplID4gMCkge1xuICAgICAgbGV0IG91dHB1dEluZGV4ID0gdGhpcy5jYWxjdWxhdGVGaXJzdFBhcmVudE91dHB1dEluZGV4KFxuICAgICAgICAgIGZpcnN0RGltZW5zaW9uLCBtdWx0aXBsaWVyWzBdLCBvdXRwdXRTaXplWzBdKTtcbiAgICAgIGZvciAobGV0IGkgPSAxOyBpIDw9IHRoaXMucmFnZ2VkUmFuazsgKytpKSB7XG4gICAgICAgIGNvbnN0IG5ld091dHB1dEluZGV4ID0gdGhpcy5jYWxjdWxhdGVPdXRwdXRJbmRleChcbiAgICAgICAgICAgIGkgLSAxLCBvdXRwdXRJbmRleCwgbXVsdGlwbGllcltpXSwgb3V0cHV0U2l6ZVtpXSk7XG4gICAgICAgIG91dHB1dEluZGV4ID0gbmV3T3V0cHV0SW5kZXg7XG4gICAgICB9XG5cbiAgICAgIHRoaXMuc2V0T3V0cHV0KHRoaXMucmFnZ2VkUmFuaywgb3V0cHV0SW5kZXgsIG91dHB1dFRlbnNvciwgb3V0cHV0U2hhcGUpO1xuICAgIH1cblxuICAgIHJldHVybiBbb3V0cHV0U2hhcGUsIG91dHB1dFRlbnNvcl07XG4gIH1cbiAgc2V0T3V0cHV0KFxuICAgICAgcmFnZ2VkUmFuazogbnVtYmVyLCBvdXRwdXRJbmRleDogbnVtYmVyW10sIG91dHB1dFRlbnNvcjogVHlwZWRBcnJheSxcbiAgICAgIG91dHB1dFNoYXBlOiBudW1iZXJbXSkge1xuICAgIGlmIChvdXRwdXRUZW5zb3IubGVuZ3RoID09PSAwKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgY29uc3QgdmFsdWVzQmFzZSA9IHRoaXMudmFsdWVzO1xuICAgIGNvbnN0IG91dHB1dEJhc2UgPSBvdXRwdXRUZW5zb3I7XG5cbiAgICBsZXQgZWxlbWVudFNoYXBlID0gb3V0cHV0U2hhcGUuc2xpY2UoKTtcbiAgICBlbGVtZW50U2hhcGUgPSBlbGVtZW50U2hhcGUuc2xpY2UocmFnZ2VkUmFuayArIDEpO1xuICAgIGNvbnN0IHZhbHVlRWxlbWVudFNpemUgPSB1dGlsLnNpemVGcm9tU2hhcGUoZWxlbWVudFNoYXBlKTtcbiAgICBjb25zdCBvdXRwdXRJbmRleFNpemUgPSBvdXRwdXRJbmRleC5sZW5ndGg7XG5cbiAgICAvLyBCcm9hZGNhc3QgdGhlIGRlZmF1bHQgdmFsdWUgdG8gdmFsdWVfZWxlbWVudF9zaXplLiAgKFdlIGNhbiBza2lwIHRoaXNcbiAgICAvLyBpZiBkZWZhdWx0VmFsdWVUZW5zb3Iuc2l6ZSA9PSAxLCBzaW5jZSB3ZSB1c2UgZmlsbCB3aGVuIHRoYXQncyB0cnVlLilcbiAgICBsZXQgZGVmYXVsdFZhbHVlID0gdGhpcy5kZWZhdWx0VmFsdWU7XG4gICAgaWYgKGRlZmF1bHRWYWx1ZS5sZW5ndGggIT09IHZhbHVlRWxlbWVudFNpemUgJiYgZGVmYXVsdFZhbHVlLmxlbmd0aCAhPT0gMSkge1xuICAgICAgY29uc3Qgc3JjU2hhcGUgPSB0aGlzLmRlZmF1bHRWYWx1ZVNoYXBlO1xuICAgICAgdGlkeSgoKSA9PiB7XG4gICAgICAgIGNvbnN0IGRlZmF1bHRWYWx1ZVRlbnNvciA9IHJlc2hhcGUoZGVmYXVsdFZhbHVlLCBzcmNTaGFwZSk7XG4gICAgICAgIGNvbnN0IGJDYXN0RGVmYXVsdCA9IGJyb2FkY2FzdFRvKGRlZmF1bHRWYWx1ZVRlbnNvciwgZWxlbWVudFNoYXBlKTtcbiAgICAgICAgZGVmYXVsdFZhbHVlID0gYkNhc3REZWZhdWx0LmRhdGFTeW5jKCk7XG4gICAgICB9KTtcbiAgICB9XG5cbiAgICAvLyBMb29wIHRocm91Z2ggdGhlIG91dHB1dEluZGV4IGFycmF5LCBmaW5kaW5nIGNvbnRpZ3VvdXMgcmVnaW9ucyB0aGF0XG4gICAgLy8gc2hvdWxkIGJlIGNvcGllZC4gIE9uY2Ugd2UgZmluZCB0aGUgZW5kIG9mIGEgY29udGlndW91cyByZWdpb24sIGNvcHkgaXRcbiAgICAvLyBhbmQgYWRkIGFueSBuZWNlc3NhcnkgcGFkZGluZyAod2l0aCBkZWZhdWx0VmFsdWUpLlxuICAgIGxldCBzcmNTdGFydCA9IDA7ICAvLyBTdGFydCBvZiBjb250aWd1b3VzIHJlZ2lvbiAoaW4gdmFsdWVzKVxuICAgIGxldCBkc3RTdGFydCA9IDA7ICAvLyBEZXN0aW5hdGlvbiBmb3IgY29udGlndW91cyByZWdpb24gKGluIG91dHB1dClcbiAgICBsZXQgZHN0RW5kID0gMDsgICAgLy8gRGVzdGluYXRpb24gZm9yIGNvbnRpZ3VvdXMgcmVnaW9uIChpbiBvdXRwdXQpXG4gICAgZm9yIChsZXQgc3JjSSA9IDA7IHNyY0kgPD0gb3V0cHV0SW5kZXhTaXplOyArK3NyY0kpIHtcbiAgICAgIC8vIGRzdEkgaXMgdGhlIGRlc3RpbmF0aW9uIHdoZXJlIHRoZSB2YWx1ZSBhdCBzcmNJIHNob3VsZCBiZSBjb3BpZWQuXG4gICAgICBsZXQgZHN0SSA9IHNyY0kgPCBvdXRwdXRJbmRleFNpemUgPyBvdXRwdXRJbmRleFtzcmNJXSA6IC0xO1xuXG4gICAgICAvLyBJZiB3ZSdyZSBzdGlsbCBpbiBhIGNvbnRpZ3VvdXMgcmVnaW9uLCB0aGVuIHVwZGF0ZSBkc3RFbmQgZ28gdG8gdGhlXG4gICAgICAvLyBuZXh0IHNyY0kuXG4gICAgICBpZiAoZHN0SSA9PT0gZHN0RW5kKSB7XG4gICAgICAgICsrZHN0RW5kO1xuICAgICAgICBjb250aW51ZTtcbiAgICAgIH1cblxuICAgICAgLy8gV2UgZm91bmQgdGhlIGVuZCBvZiBjb250aWd1b3VzIHJlZ2lvbi4gIFRoaXMgY2FuIGJlIGJlY2F1c2Ugd2UgZm91bmRcbiAgICAgIC8vIGEgZ2FwIChkc3RJID4gZHN0RW5kKSwgb3IgYSBzb3VyY2UgdmFsdWUgdGhhdCBzaG91bGRuJ3QgYmUgY29waWVkXG4gICAgICAvLyBiZWNhdXNlIGl0J3Mgb3V0LW9mLWJvdW5kcyAoZHN0SSA9PSAtMSksIG9yIHRoZSBlbmQgb2YgdGhlIHRlbnNvclxuICAgICAgLy8gKGRzdEkgPT09IC0xKS5cbiAgICAgIGlmIChkc3RTdGFydCA8IGRzdEVuZCkge1xuICAgICAgICAvLyBDb3B5IHRoZSBjb250aWd1b3VzIHJlZ2lvbi5cbiAgICAgICAgY29uc3Qgc3JjID0gdmFsdWVzQmFzZS5zdWJhcnJheShzcmNTdGFydCAqIHZhbHVlRWxlbWVudFNpemUpO1xuICAgICAgICBjb25zdCBkc3QgPSBvdXRwdXRCYXNlLnN1YmFycmF5KGRzdFN0YXJ0ICogdmFsdWVFbGVtZW50U2l6ZSk7XG4gICAgICAgIGNvbnN0IG5WYWxzID0gKGRzdEVuZCAtIGRzdFN0YXJ0KSAqIHZhbHVlRWxlbWVudFNpemU7XG4gICAgICAgIGNvcHlBcnJheShkc3QsIHNyYywgblZhbHMpO1xuICAgICAgfVxuXG4gICAgICAvLyBBZGQgYW55IG5lY2Vzc2FyeSBwYWRkaW5nICh3LyBkZWZhdWx0VmFsdWUpLlxuICAgICAgaWYgKHNyY0kgPj0gb3V0cHV0SW5kZXhTaXplKSB7XG4gICAgICAgIC8vIFdlIHJlYWNoZWQgdGhlIGVuZCBvZiB2YWx1ZXM6IHBhZCB0byB0aGUgZW5kIG9mIG91dHB1dC5cbiAgICAgICAgY29uc3Qgb3V0cHV0U2l6ZSA9IG91dHB1dFRlbnNvci5sZW5ndGg7XG4gICAgICAgIGRzdEkgPSBNYXRoLmZsb29yKG91dHB1dFNpemUgLyB2YWx1ZUVsZW1lbnRTaXplKTtcbiAgICAgIH1cbiAgICAgIGlmIChkc3RJID4gZHN0RW5kKSB7XG4gICAgICAgIGlmICh0aGlzLmRlZmF1bHRWYWx1ZS5sZW5ndGggPT09IDEpIHtcbiAgICAgICAgICBvdXRwdXRCYXNlXG4gICAgICAgICAgICAgIC5zdWJhcnJheShkc3RFbmQgKiB2YWx1ZUVsZW1lbnRTaXplLCBkc3RJICogdmFsdWVFbGVtZW50U2l6ZSlcbiAgICAgICAgICAgICAgLmZpbGwodGhpcy5kZWZhdWx0VmFsdWVbMF0pO1xuICAgICAgICAgIGRzdEVuZCA9IGRzdEk7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgd2hpbGUgKGRzdEkgPiBkc3RFbmQpIHtcbiAgICAgICAgICAgIGNvbnN0IGRzdCA9IG91dHB1dEJhc2Uuc2xpY2UoZHN0RW5kICogdmFsdWVFbGVtZW50U2l6ZSk7XG4gICAgICAgICAgICBjb3B5QXJyYXkoZHN0LCBkZWZhdWx0VmFsdWUsIHZhbHVlRWxlbWVudFNpemUpO1xuICAgICAgICAgICAgKytkc3RFbmQ7XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICB9XG5cbiAgICAgIC8vIFVwZGF0ZSBpbmRpY2VzLlxuICAgICAgaWYgKGRzdEkgPCAwKSB7XG4gICAgICAgIC8vIHNyY0kgc2hvdWxkIGJlIHNraXBwZWQgLS0gbGVhdmUgaXQgb3V0IG9mIHRoZSBjb250aWd1b3VzIHJlZ2lvbi5cbiAgICAgICAgc3JjU3RhcnQgPSBzcmNJICsgMTtcbiAgICAgICAgZHN0U3RhcnQgPSBkc3RFbmQ7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICAvLyBzcmNJIHNob3VsZCBiZSBjb3BpZWQgLS0gaW5jbHVkZSBpdCBpbiB0aGUgY29udGlndW91cyByZWdpb24uXG4gICAgICAgIHNyY1N0YXJ0ID0gc3JjSTtcbiAgICAgICAgZHN0U3RhcnQgPSBkc3RFbmQ7XG4gICAgICAgIGRzdEVuZCA9IGRzdFN0YXJ0ICsgMTtcbiAgICAgIH1cbiAgICB9XG4gIH1cbn1cblxuZnVuY3Rpb24gY29weUFycmF5KGRzdDogVHlwZWRBcnJheSwgc3JjOiBUeXBlZEFycmF5LCBzaXplOiBudW1iZXIpIHtcbiAgZm9yIChsZXQgaSA9IDA7IGkgPCBzaXplOyBpKyspIHtcbiAgICBkc3RbaV0gPSBzcmNbaV07XG4gIH1cbn1cblxuZnVuY3Rpb24gbWFrZVNoYXBlKHNoYXBlOiBudW1iZXJbXXxUeXBlZEFycmF5LCBpc1BhcnRpYWw6IGJvb2xlYW4pIHtcbiAgY29uc3Qgb3V0OiBudW1iZXJbXSA9IFtdO1xuICBmb3IgKGxldCBkaW0gb2Ygc2hhcGUpIHtcbiAgICBpZiAoZGltIDwgMCkge1xuICAgICAgaWYgKCFpc1BhcnRpYWwpIHtcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKGBEaW1lbnNpb24gJHtkaW19IG11c3QgYmUgPj0gMGApO1xuICAgICAgfVxuICAgICAgaWYgKGRpbSA8IC0xKSB7XG4gICAgICAgIHRocm93IG5ldyBFcnJvcihgRGltZW5zaW9uICR7ZGltfSBtdXN0IGJlID49IC0xYCk7XG4gICAgICB9XG4gICAgICBkaW0gPSAtMTtcbiAgICB9XG4gICAgb3V0LnB1c2goZGltKTtcbiAgfVxuXG4gIHJldHVybiBvdXQ7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiByYWdnZWRUZW5zb3JUb1RlbnNvckltcGwoXG4gICAgc2hhcGU6IFR5cGVkQXJyYXksIHNoYXBlc1NoYXBlOiBudW1iZXJbXSwgdmFsdWVzOiBUeXBlZEFycmF5LFxuICAgIHZhbHVlc1NoYXBlOiBudW1iZXJbXSwgdmFsdWVzRFR5cGU6IERhdGFUeXBlLCBkZWZhdWx0VmFsdWU6IFR5cGVkQXJyYXksXG4gICAgZGVmYXVsdFZhbHVlU2hhcGU6IG51bWJlcltdLCByb3dQYXJ0aXRpb25WYWx1ZXM6IFR5cGVkQXJyYXlbXSxcbiAgICByb3dQYXJ0aXRpb25WYWx1ZXNTaGFwZXM6IG51bWJlcltdW10sXG4gICAgcm93UGFydGl0aW9uVHlwZXM6IHN0cmluZ1tdKTogW251bWJlcltdLCBUeXBlZEFycmF5XSB7XG4gIHJldHVybiBuZXcgUmFnZ2VkVGVuc29yVG9UZW5zb3JPcChcbiAgICAgICAgICAgICBzaGFwZSwgc2hhcGVzU2hhcGUsIHZhbHVlcywgdmFsdWVzU2hhcGUsIHZhbHVlc0RUeXBlLCBkZWZhdWx0VmFsdWUsXG4gICAgICAgICAgICAgZGVmYXVsdFZhbHVlU2hhcGUsIHJvd1BhcnRpdGlvblZhbHVlcywgcm93UGFydGl0aW9uVmFsdWVzU2hhcGVzLFxuICAgICAgICAgICAgIHJvd1BhcnRpdGlvblR5cGVzKVxuICAgICAgLmNvbXB1dGUoKTtcbn1cbiJdfQ==","/**\n * @license\n * Copyright 2022 Google LLC. All Rights Reserved.\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n * =============================================================================\n */\nimport { RaggedTensorToTensor } from '@tensorflow/tfjs-core';\nimport { raggedTensorToTensorImpl } from './RaggedTensorToTensor_impl';\nexport function raggedTensorToTensor(args) {\n const { inputs, backend, attrs } = args;\n const { shape, values, defaultValue, rowPartitionTensors } = inputs;\n const { rowPartitionTypes } = attrs;\n const $shape = backend.data.get(shape.dataId).values;\n const $values = backend.data.get(values.dataId).values;\n const $defaultValue = backend.data.get(defaultValue.dataId).values;\n const $rowPartitionValues = rowPartitionTensors.map(t => backend.data.get(t.dataId).values);\n const rowPartitionValuesShapes = rowPartitionTensors.map(t => t.shape);\n const [outputShape, output] = raggedTensorToTensorImpl($shape, shape.shape, $values, values.shape, values.dtype, $defaultValue, defaultValue.shape, $rowPartitionValues, rowPartitionValuesShapes, rowPartitionTypes);\n return backend.makeTensorInfo(outputShape, values.dtype, output);\n}\nexport const raggedTensorToTensorConfig = {\n kernelName: RaggedTensorToTensor,\n backendName: 'cpu',\n kernelFunc: raggedTensorToTensor,\n};\n//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiUmFnZ2VkVGVuc29yVG9UZW5zb3IuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi8uLi90ZmpzLWJhY2tlbmQtY3B1L3NyYy9rZXJuZWxzL1JhZ2dlZFRlbnNvclRvVGVuc29yLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBOzs7Ozs7Ozs7Ozs7Ozs7R0FlRztBQUVILE9BQU8sRUFBMkIsb0JBQW9CLEVBQWdGLE1BQU0sdUJBQXVCLENBQUM7QUFJcEssT0FBTyxFQUFDLHdCQUF3QixFQUFDLE1BQU0sNkJBQTZCLENBQUM7QUFFckUsTUFBTSxVQUFVLG9CQUFvQixDQUFDLElBSXBDO0lBQ0MsTUFBTSxFQUFDLE1BQU0sRUFBRSxPQUFPLEVBQUUsS0FBSyxFQUFDLEdBQUcsSUFBSSxDQUFDO0lBQ3RDLE1BQU0sRUFBQyxLQUFLLEVBQUUsTUFBTSxFQUFFLFlBQVksRUFBRSxtQkFBbUIsRUFBQyxHQUFHLE1BQU0sQ0FBQztJQUNsRSxNQUFNLEVBQUMsaUJBQWlCLEVBQUMsR0FBRyxLQUFLLENBQUM7SUFFbEMsTUFBTSxNQUFNLEdBQUcsT0FBTyxDQUFDLElBQUksQ0FBQyxHQUFHLENBQUMsS0FBSyxDQUFDLE1BQU0sQ0FBQyxDQUFDLE1BQW9CLENBQUM7SUFDbkUsTUFBTSxPQUFPLEdBQUcsT0FBTyxDQUFDLElBQUksQ0FBQyxHQUFHLENBQUMsTUFBTSxDQUFDLE1BQU0sQ0FBQyxDQUFDLE1BQW9CLENBQUM7SUFDckUsTUFBTSxhQUFhLEdBQ2YsT0FBTyxDQUFDLElBQUksQ0FBQyxHQUFHLENBQUMsWUFBWSxDQUFDLE1BQU0sQ0FBQyxDQUFDLE1BQW9CLENBQUM7SUFDL0QsTUFBTSxtQkFBbUIsR0FBRyxtQkFBbUIsQ0FBQyxHQUFHLENBQy9DLENBQUMsQ0FBQyxFQUFFLENBQUMsT0FBTyxDQUFDLElBQUksQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLE1BQU0sQ0FBQyxDQUFDLE1BQW9CLENBQUMsQ0FBQztJQUMxRCxNQUFNLHdCQUF3QixHQUFHLG1CQUFtQixDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxLQUFLLENBQUMsQ0FBQztJQUV2RSxNQUFNLENBQUMsV0FBVyxFQUFFLE1BQU0sQ0FBQyxHQUFHLHdCQUF3QixDQUNsRCxNQUFNLEVBQUUsS0FBSyxDQUFDLEtBQUssRUFBRSxPQUFPLEVBQUUsTUFBTSxDQUFDLEtBQUssRUFBRSxNQUFNLENBQUMsS0FBSyxFQUFFLGFBQWEsRUFDdkUsWUFBWSxDQUFDLEtBQUssRUFBRSxtQkFBbUIsRUFBRSx3QkFBd0IsRUFDakUsaUJBQWlCLENBQUMsQ0FBQztJQUN2QixPQUFPLE9BQU8sQ0FBQyxjQUFjLENBQUMsV0FBVyxFQUFFLE1BQU0sQ0FBQyxLQUFLLEVBQUUsTUFBTSxDQUFDLENBQUM7QUFDbkUsQ0FBQztBQUVELE1BQU0sQ0FBQyxNQUFNLDBCQUEwQixHQUFpQjtJQUN0RCxVQUFVLEVBQUUsb0JBQW9CO0lBQ2hDLFdBQVcsRUFBRSxLQUFLO0lBQ2xCLFVBQVUsRUFBRSxvQkFBd0M7Q0FDckQsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbIi8qKlxuICogQGxpY2Vuc2VcbiAqIENvcHlyaWdodCAyMDIyIEdvb2dsZSBMTEMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuXG4gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgXCJMaWNlbnNlXCIpO1xuICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLlxuICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0XG4gKlxuICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wXG4gKlxuICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZVxuICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gXCJBUyBJU1wiIEJBU0lTLFxuICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuXG4gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kXG4gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS5cbiAqID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4gKi9cblxuaW1wb3J0IHtLZXJuZWxDb25maWcsIEtlcm5lbEZ1bmMsIFJhZ2dlZFRlbnNvclRvVGVuc29yLCBSYWdnZWRUZW5zb3JUb1RlbnNvckF0dHJzLCBSYWdnZWRUZW5zb3JUb1RlbnNvcklucHV0cywgVGVuc29ySW5mbywgVHlwZWRBcnJheX0gZnJvbSAnQHRlbnNvcmZsb3cvdGZqcy1jb3JlJztcblxuaW1wb3J0IHtNYXRoQmFja2VuZENQVX0gZnJvbSAnLi4vYmFja2VuZF9jcHUnO1xuXG5pbXBvcnQge3JhZ2dlZFRlbnNvclRvVGVuc29ySW1wbH0gZnJvbSAnLi9SYWdnZWRUZW5zb3JUb1RlbnNvcl9pbXBsJztcblxuZXhwb3J0IGZ1bmN0aW9uIHJhZ2dlZFRlbnNvclRvVGVuc29yKGFyZ3M6IHtcbiAgaW5wdXRzOiBSYWdnZWRUZW5zb3JUb1RlbnNvcklucHV0cyxcbiAgYmFja2VuZDogTWF0aEJhY2tlbmRDUFUsXG4gIGF0dHJzOiBSYWdnZWRUZW5zb3JUb1RlbnNvckF0dHJzXG59KTogVGVuc29ySW5mbyB7XG4gIGNvbnN0IHtpbnB1dHMsIGJhY2tlbmQsIGF0dHJzfSA9IGFyZ3M7XG4gIGNvbnN0IHtzaGFwZSwgdmFsdWVzLCBkZWZhdWx0VmFsdWUsIHJvd1BhcnRpdGlvblRlbnNvcnN9ID0gaW5wdXRzO1xuICBjb25zdCB7cm93UGFydGl0aW9uVHlwZXN9ID0gYXR0cnM7XG5cbiAgY29uc3QgJHNoYXBlID0gYmFja2VuZC5kYXRhLmdldChzaGFwZS5kYXRhSWQpLnZhbHVlcyBhcyBUeXBlZEFycmF5O1xuICBjb25zdCAkdmFsdWVzID0gYmFja2VuZC5kYXRhLmdldCh2YWx1ZXMuZGF0YUlkKS52YWx1ZXMgYXMgVHlwZWRBcnJheTtcbiAgY29uc3QgJGRlZmF1bHRWYWx1ZSA9XG4gICAgICBiYWNrZW5kLmRhdGEuZ2V0KGRlZmF1bHRWYWx1ZS5kYXRhSWQpLnZhbHVlcyBhcyBUeXBlZEFycmF5O1xuICBjb25zdCAkcm93UGFydGl0aW9uVmFsdWVzID0gcm93UGFydGl0aW9uVGVuc29ycy5tYXAoXG4gICAgICB0ID0+IGJhY2tlbmQuZGF0YS5nZXQodC5kYXRhSWQpLnZhbHVlcyBhcyBUeXBlZEFycmF5KTtcbiAgY29uc3Qgcm93UGFydGl0aW9uVmFsdWVzU2hhcGVzID0gcm93UGFydGl0aW9uVGVuc29ycy5tYXAodCA9PiB0LnNoYXBlKTtcblxuICBjb25zdCBbb3V0cHV0U2hhcGUsIG91dHB1dF0gPSByYWdnZWRUZW5zb3JUb1RlbnNvckltcGwoXG4gICAgICAkc2hhcGUsIHNoYXBlLnNoYXBlLCAkdmFsdWVzLCB2YWx1ZXMuc2hhcGUsIHZhbHVlcy5kdHlwZSwgJGRlZmF1bHRWYWx1ZSxcbiAgICAgIGRlZmF1bHRWYWx1ZS5zaGFwZSwgJHJvd1BhcnRpdGlvblZhbHVlcywgcm93UGFydGl0aW9uVmFsdWVzU2hhcGVzLFxuICAgICAgcm93UGFydGl0aW9uVHlwZXMpO1xuICByZXR1cm4gYmFja2VuZC5tYWtlVGVuc29ySW5mbyhvdXRwdXRTaGFwZSwgdmFsdWVzLmR0eXBlLCBvdXRwdXQpO1xufVxuXG5leHBvcnQgY29uc3QgcmFnZ2VkVGVuc29yVG9UZW5zb3JDb25maWc6IEtlcm5lbENvbmZpZyA9IHtcbiAga2VybmVsTmFtZTogUmFnZ2VkVGVuc29yVG9UZW5zb3IsXG4gIGJhY2tlbmROYW1lOiAnY3B1JyxcbiAga2VybmVsRnVuYzogcmFnZ2VkVGVuc29yVG9UZW5zb3IgYXMge30gYXMgS2VybmVsRnVuYyxcbn07XG4iXX0=","/**\n * @license\n * Copyright 2020 Google LLC. All Rights Reserved.\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n * =============================================================================\n */\nimport { util } from '@tensorflow/tfjs-core';\nexport function rangeImpl(start, stop, step, dtype) {\n const sameStartStop = start === stop;\n const increasingRangeNegativeStep = start < stop && step < 0;\n const decreasingRangePositiveStep = stop < start && step > 1;\n if (sameStartStop || increasingRangeNegativeStep ||\n decreasingRangePositiveStep) {\n return util.makeZerosTypedArray(0, dtype);\n }\n const numElements = Math.abs(Math.ceil((stop - start) / step));\n const values = util.makeZerosTypedArray(numElements, dtype);\n if (stop < start && step === 1) {\n // Auto adjust the step's sign if it hasn't been set\n // (or was set to 1)\n step = -1;\n }\n values[0] = start;\n for (let i = 1; i < values.length; i++) {\n values[i] = values[i - 1] + step;\n }\n return values;\n}\n//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiUmFuZ2VfaW1wbC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uLy4uL3RmanMtYmFja2VuZC1jcHUvc3JjL2tlcm5lbHMvUmFuZ2VfaW1wbC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQTs7Ozs7Ozs7Ozs7Ozs7O0dBZUc7QUFFSCxPQUFPLEVBQWMsSUFBSSxFQUFDLE1BQU0sdUJBQXVCLENBQUM7QUFFeEQsTUFBTSxVQUFVLFNBQVMsQ0FDckIsS0FBYSxFQUFFLElBQVksRUFBRSxJQUFZLEVBQ3pDLEtBQXdCO0lBQzFCLE1BQU0sYUFBYSxHQUFHLEtBQUssS0FBSyxJQUFJLENBQUM7SUFDckMsTUFBTSwyQkFBMkIsR0FBRyxLQUFLLEdBQUcsSUFBSSxJQUFJLElBQUksR0FBRyxDQUFDLENBQUM7SUFDN0QsTUFBTSwyQkFBMkIsR0FBRyxJQUFJLEdBQUcsS0FBSyxJQUFJLElBQUksR0FBRyxDQUFDLENBQUM7SUFFN0QsSUFBSSxhQUFhLElBQUksMkJBQTJCO1FBQzVDLDJCQUEyQixFQUFFO1FBQy9CLE9BQU8sSUFBSSxDQUFDLG1CQUFtQixDQUFDLENBQUMsRUFBRSxLQUFLLENBQUMsQ0FBQztLQUMzQztJQUVELE1BQU0sV0FBVyxHQUFHLElBQUksQ0FBQyxHQUFHLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxDQUFDLElBQUksR0FBRyxLQUFLLENBQUMsR0FBRyxJQUFJLENBQUMsQ0FBQyxDQUFDO0lBQy9ELE1BQU0sTUFBTSxHQUFHLElBQUksQ0FBQyxtQkFBbUIsQ0FBQyxXQUFXLEVBQUUsS0FBSyxDQUFDLENBQUM7SUFFNUQsSUFBSSxJQUFJLEdBQUcsS0FBSyxJQUFJLElBQUksS0FBSyxDQUFDLEVBQUU7UUFDOUIsb0RBQW9EO1FBQ3BELG9CQUFvQjtRQUNwQixJQUFJLEdBQUcsQ0FBQyxDQUFDLENBQUM7S0FDWDtJQUVELE1BQU0sQ0FBQyxDQUFDLENBQUMsR0FBRyxLQUFLLENBQUM7SUFDbEIsS0FBSyxJQUFJLENBQUMsR0FBRyxDQUFDLEVBQUUsQ0FBQyxHQUFHLE1BQU0sQ0FBQyxNQUFNLEVBQUUsQ0FBQyxFQUFFLEVBQUU7UUFDdEMsTUFBTSxDQUFDLENBQUMsQ0FBQyxHQUFHLE1BQU0sQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLEdBQUcsSUFBSSxDQUFDO0tBQ2xDO0lBQ0QsT0FBTyxNQUFNLENBQUM7QUFDaEIsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbIi8qKlxuICogQGxpY2Vuc2VcbiAqIENvcHlyaWdodCAyMDIwIEdvb2dsZSBMTEMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuXG4gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgXCJMaWNlbnNlXCIpO1xuICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLlxuICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0XG4gKlxuICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wXG4gKlxuICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZVxuICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gXCJBUyBJU1wiIEJBU0lTLFxuICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuXG4gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kXG4gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS5cbiAqID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4gKi9cblxuaW1wb3J0IHtEYXRhVHlwZU1hcCwgdXRpbH0gZnJvbSAnQHRlbnNvcmZsb3cvdGZqcy1jb3JlJztcblxuZXhwb3J0IGZ1bmN0aW9uIHJhbmdlSW1wbChcbiAgICBzdGFydDogbnVtYmVyLCBzdG9wOiBudW1iZXIsIHN0ZXA6IG51bWJlcixcbiAgICBkdHlwZTogJ2Zsb2F0MzInfCdpbnQzMicpOiBEYXRhVHlwZU1hcFsnZmxvYXQzMicgfCAnaW50MzInXSB7XG4gIGNvbnN0IHNhbWVTdGFydFN0b3AgPSBzdGFydCA9PT0gc3RvcDtcbiAgY29uc3QgaW5jcmVhc2luZ1JhbmdlTmVnYXRpdmVTdGVwID0gc3RhcnQgPCBzdG9wICYmIHN0ZXAgPCAwO1xuICBjb25zdCBkZWNyZWFzaW5nUmFuZ2VQb3NpdGl2ZVN0ZXAgPSBzdG9wIDwgc3RhcnQgJiYgc3RlcCA+IDE7XG5cbiAgaWYgKHNhbWVTdGFydFN0b3AgfHwgaW5jcmVhc2luZ1JhbmdlTmVnYXRpdmVTdGVwIHx8XG4gICAgICBkZWNyZWFzaW5nUmFuZ2VQb3NpdGl2ZVN0ZXApIHtcbiAgICByZXR1cm4gdXRpbC5tYWtlWmVyb3NUeXBlZEFycmF5KDAsIGR0eXBlKTtcbiAgfVxuXG4gIGNvbnN0IG51bUVsZW1lbnRzID0gTWF0aC5hYnMoTWF0aC5jZWlsKChzdG9wIC0gc3RhcnQpIC8gc3RlcCkpO1xuICBjb25zdCB2YWx1ZXMgPSB1dGlsLm1ha2VaZXJvc1R5cGVkQXJyYXkobnVtRWxlbWVudHMsIGR0eXBlKTtcblxuICBpZiAoc3RvcCA8IHN0YXJ0ICYmIHN0ZXAgPT09IDEpIHtcbiAgICAvLyBBdXRvIGFkanVzdCB0aGUgc3RlcCdzIHNpZ24gaWYgaXQgaGFzbid0IGJlZW4gc2V0XG4gICAgLy8gKG9yIHdhcyBzZXQgdG8gMSlcbiAgICBzdGVwID0gLTE7XG4gIH1cblxuICB2YWx1ZXNbMF0gPSBzdGFydDtcbiAgZm9yIChsZXQgaSA9IDE7IGkgPCB2YWx1ZXMubGVuZ3RoOyBpKyspIHtcbiAgICB2YWx1ZXNbaV0gPSB2YWx1ZXNbaSAtIDFdICsgc3RlcDtcbiAgfVxuICByZXR1cm4gdmFsdWVzO1xufVxuIl19","/**\n * @license\n * Copyright 2020 Google LLC. All Rights Reserved.\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n * =============================================================================\n */\nimport { Range } from '@tensorflow/tfjs-core';\nimport { rangeImpl } from './Range_impl';\nexport function range(args) {\n const { backend, attrs } = args;\n const { start, stop, dtype, step } = attrs;\n const values = rangeImpl(start, stop, step, dtype);\n return backend.makeTensorInfo([values.length], dtype, values);\n}\nexport const rangeConfig = {\n kernelName: Range,\n backendName: 'cpu',\n kernelFunc: range\n};\n//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiUmFuZ2UuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi8uLi90ZmpzLWJhY2tlbmQtY3B1L3NyYy9rZXJuZWxzL1JhbmdlLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBOzs7Ozs7Ozs7Ozs7Ozs7R0FlRztBQUVILE9BQU8sRUFBMkIsS0FBSyxFQUF5QixNQUFNLHVCQUF1QixDQUFDO0FBRzlGLE9BQU8sRUFBQyxTQUFTLEVBQUMsTUFBTSxjQUFjLENBQUM7QUFFdkMsTUFBTSxVQUFVLEtBQUssQ0FBQyxJQUFrRDtJQUV0RSxNQUFNLEVBQUMsT0FBTyxFQUFFLEtBQUssRUFBQyxHQUFHLElBQUksQ0FBQztJQUM5QixNQUFNLEVBQUMsS0FBSyxFQUFFLElBQUksRUFBRSxLQUFLLEVBQUUsSUFBSSxFQUFDLEdBQUcsS0FBSyxDQUFDO0lBRXpDLE1BQU0sTUFBTSxHQUFHLFNBQVMsQ0FBQyxLQUFLLEVBQUUsSUFBSSxFQUFFLElBQUksRUFBRSxLQUFLLENBQUMsQ0FBQztJQUNuRCxPQUFPLE9BQU8sQ0FBQyxjQUFjLENBQUMsQ0FBQyxNQUFNLENBQUMsTUFBTSxDQUFDLEVBQUUsS0FBSyxFQUFFLE1BQU0sQ0FBQyxDQUFDO0FBQ2hFLENBQUM7QUFFRCxNQUFNLENBQUMsTUFBTSxXQUFXLEdBQWlCO0lBQ3ZDLFVBQVUsRUFBRSxLQUFLO0lBQ2pCLFdBQVcsRUFBRSxLQUFLO0lBQ2xCLFVBQVUsRUFBRSxLQUF5QjtDQUN0QyxDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiLyoqXG4gKiBAbGljZW5zZVxuICogQ29weXJpZ2h0IDIwMjAgR29vZ2xlIExMQy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC5cbiAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSBcIkxpY2Vuc2VcIik7XG4gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuXG4gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXRcbiAqXG4gKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjBcbiAqXG4gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlXG4gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiBcIkFTIElTXCIgQkFTSVMsXG4gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC5cbiAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmRcbiAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLlxuICogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbiAqL1xuXG5pbXBvcnQge0tlcm5lbENvbmZpZywgS2VybmVsRnVuYywgUmFuZ2UsIFJhbmdlQXR0cnMsIFRlbnNvckluZm99IGZyb20gJ0B0ZW5zb3JmbG93L3RmanMtY29yZSc7XG5cbmltcG9ydCB7TWF0aEJhY2tlbmRDUFV9IGZyb20gJy4uL2JhY2tlbmRfY3B1JztcbmltcG9ydCB7cmFuZ2VJbXBsfSBmcm9tICcuL1JhbmdlX2ltcGwnO1xuXG5leHBvcnQgZnVuY3Rpb24gcmFuZ2UoYXJnczoge2JhY2tlbmQ6IE1hdGhCYWNrZW5kQ1BVLCBhdHRyczogUmFuZ2VBdHRyc30pOlxuICAgIFRlbnNvckluZm8ge1xuICBjb25zdCB7YmFja2VuZCwgYXR0cnN9ID0gYXJncztcbiAgY29uc3Qge3N0YXJ0LCBzdG9wLCBkdHlwZSwgc3RlcH0gPSBhdHRycztcblxuICBjb25zdCB2YWx1ZXMgPSByYW5nZUltcGwoc3RhcnQsIHN0b3AsIHN0ZXAsIGR0eXBlKTtcbiAgcmV0dXJuIGJhY2tlbmQubWFrZVRlbnNvckluZm8oW3ZhbHVlcy5sZW5ndGhdLCBkdHlwZSwgdmFsdWVzKTtcbn1cblxuZXhwb3J0IGNvbnN0IHJhbmdlQ29uZmlnOiBLZXJuZWxDb25maWcgPSB7XG4gIGtlcm5lbE5hbWU6IFJhbmdlLFxuICBiYWNrZW5kTmFtZTogJ2NwdScsXG4gIGtlcm5lbEZ1bmM6IHJhbmdlIGFzIHt9IGFzIEtlcm5lbEZ1bmNcbn07XG4iXX0=","/**\n * @license\n * Copyright 2020 Google LLC. All Rights Reserved.\n * Licensed under the Apache License, Version 2.0 (the License);\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an AS IS BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n * =============================================================================\n */\nimport { Reciprocal } from '@tensorflow/tfjs-core';\nimport { unaryKernelFunc } from '../utils/unary_utils';\nexport const reciprocal = unaryKernelFunc(Reciprocal, (xi) => 1 / xi);\nexport const reciprocalConfig = {\n kernelName: Reciprocal,\n backendName: 'cpu',\n kernelFunc: reciprocal,\n};\n//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiUmVjaXByb2NhbC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uLy4uL3RmanMtYmFja2VuZC1jcHUvc3JjL2tlcm5lbHMvUmVjaXByb2NhbC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQTs7Ozs7Ozs7Ozs7Ozs7O0dBZUc7QUFFSCxPQUFPLEVBQWUsVUFBVSxFQUFDLE1BQU0sdUJBQXVCLENBQUM7QUFFL0QsT0FBTyxFQUFDLGVBQWUsRUFBQyxNQUFNLHNCQUFzQixDQUFDO0FBRXJELE1BQU0sQ0FBQyxNQUFNLFVBQVUsR0FBRyxlQUFlLENBQUMsVUFBVSxFQUFFLENBQUMsRUFBRSxFQUFFLEVBQUUsQ0FBQyxDQUFDLEdBQUcsRUFBRSxDQUFDLENBQUM7QUFFdEUsTUFBTSxDQUFDLE1BQU0sZ0JBQWdCLEdBQWlCO0lBQzVDLFVBQVUsRUFBRSxVQUFVO0lBQ3RCLFdBQVcsRUFBRSxLQUFLO0lBQ2xCLFVBQVUsRUFBRSxVQUFVO0NBQ3ZCLENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyIvKipcbiAqIEBsaWNlbnNlXG4gKiBDb3B5cmlnaHQgMjAyMCBHb29nbGUgTExDLiBBbGwgUmlnaHRzIFJlc2VydmVkLlxuICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlIExpY2Vuc2UpO1xuICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLlxuICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0XG4gKlxuICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wXG4gKlxuICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZVxuICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gQVMgSVMgQkFTSVMsXG4gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC5cbiAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmRcbiAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLlxuICogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbiAqL1xuXG5pbXBvcnQge0tlcm5lbENvbmZpZywgUmVjaXByb2NhbH0gZnJvbSAnQHRlbnNvcmZsb3cvdGZqcy1jb3JlJztcblxuaW1wb3J0IHt1bmFyeUtlcm5lbEZ1bmN9IGZyb20gJy4uL3V0aWxzL3VuYXJ5X3V0aWxzJztcblxuZXhwb3J0IGNvbnN0IHJlY2lwcm9jYWwgPSB1bmFyeUtlcm5lbEZ1bmMoUmVjaXByb2NhbCwgKHhpKSA9PiAxIC8geGkpO1xuXG5leHBvcnQgY29uc3QgcmVjaXByb2NhbENvbmZpZzogS2VybmVsQ29uZmlnID0ge1xuICBrZXJuZWxOYW1lOiBSZWNpcHJvY2FsLFxuICBiYWNrZW5kTmFtZTogJ2NwdScsXG4gIGtlcm5lbEZ1bmM6IHJlY2lwcm9jYWwsXG59O1xuIl19","/**\n * @license\n * Copyright 2020 Google LLC. All Rights Reserved.\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n * =============================================================================\n */\nimport { ResizeBilinear, util } from '@tensorflow/tfjs-core';\nimport { assertNotComplex } from '../cpu_util';\nexport function resizeBilinear(args) {\n const { inputs, backend, attrs } = args;\n const { images } = inputs;\n const { alignCorners, halfPixelCenters, size } = attrs;\n assertNotComplex(images, 'resizeBilinear');\n const imagesStrides = util.computeStrides(images.shape);\n const [newHeight, newWidth] = size;\n const [batch, oldHeight, oldWidth, numChannels] = images.shape;\n const xValues = backend.data.get(images.dataId).values;\n const result = new Float32Array(util.sizeFromShape([batch, newHeight, newWidth, numChannels]));\n const effectiveInputSize = [\n (alignCorners && newHeight > 1) ? oldHeight - 1 : oldHeight,\n (alignCorners && newWidth > 1) ? oldWidth - 1 : oldWidth\n ];\n const effectiveOutputSize = [\n (alignCorners && newHeight > 1) ? newHeight - 1 : newHeight,\n (alignCorners && newWidth > 1) ? newWidth - 1 : newWidth\n ];\n let outputIdx = 0;\n const effectiveRowSizeRatio = effectiveInputSize[0] / effectiveOutputSize[0];\n const effectiveColSizeRatio = effectiveInputSize[1] / effectiveOutputSize[1];\n for (let b = 0; b < batch; b++) {\n for (let r = 0; r < newHeight; r++) {\n let sourceFracRow;\n if (halfPixelCenters) {\n sourceFracRow = effectiveRowSizeRatio * (r + 0.5) - 0.5;\n }\n else {\n sourceFracRow = effectiveRowSizeRatio * r;\n }\n const sourceRowFloor = Math.max(0, Math.floor(sourceFracRow));\n const rowFrac = sourceFracRow - sourceRowFloor;\n const sourceRowCeil = Math.min(oldHeight - 1, Math.ceil(sourceFracRow));\n const topRowOffset = b * imagesStrides[0] + sourceRowFloor * imagesStrides[1];\n const botRowOffset = b * imagesStrides[0] + sourceRowCeil * imagesStrides[1];\n for (let c = 0; c < newWidth; c++) {\n let sourceFracCol;\n if (halfPixelCenters) {\n sourceFracCol = effectiveColSizeRatio * (c + 0.5) - 0.5;\n }\n else {\n sourceFracCol = effectiveColSizeRatio * c;\n }\n const sourceColFloor = Math.max(0, Math.floor(sourceFracCol));\n const colFrac = sourceFracCol - sourceColFloor;\n const sourceColCeil = Math.min(oldWidth - 1, Math.ceil(sourceFracCol));\n const topLeftOffest = topRowOffset + sourceColFloor * imagesStrides[2];\n const botLeftOffset = botRowOffset + sourceColFloor * imagesStrides[2];\n const topRightOffset = topRowOffset + sourceColCeil * imagesStrides[2];\n const botRightOffest = botRowOffset + sourceColCeil * imagesStrides[2];\n for (let d = 0; d < numChannels; d++) {\n // Begin shader.\n // Compute the fractional index of the source.\n const topLeft = xValues[topLeftOffest + d];\n const bottomLeft = xValues[botLeftOffset + d];\n const topRight = xValues[topRightOffset + d];\n const bottomRight = xValues[botRightOffest + d];\n const top = topLeft + (topRight - topLeft) * colFrac;\n const bottom = bottomLeft + (bottomRight - bottomLeft) * colFrac;\n const newValue = top + (bottom - top) * rowFrac;\n result[outputIdx++] = newValue;\n }\n }\n }\n }\n return backend.makeTensorInfo([batch, newHeight, newWidth, numChannels], 'float32', result);\n}\nexport const resizeBilinearConfig = {\n kernelName: ResizeBilinear,\n backendName: 'cpu',\n kernelFunc: resizeBilinear\n};\n//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiUmVzaXplQmlsaW5lYXIuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi8uLi90ZmpzLWJhY2tlbmQtY3B1L3NyYy9rZXJuZWxzL1Jlc2l6ZUJpbGluZWFyLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBOzs7Ozs7Ozs7Ozs7Ozs7R0FlRztBQUVILE9BQU8sRUFBMkIsY0FBYyxFQUFxRSxJQUFJLEVBQUMsTUFBTSx1QkFBdUIsQ0FBQztBQUd4SixPQUFPLEVBQUMsZ0JBQWdCLEVBQUMsTUFBTSxhQUFhLENBQUM7QUFFN0MsTUFBTSxVQUFVLGNBQWMsQ0FBQyxJQUk5QjtJQUNDLE1BQU0sRUFBQyxNQUFNLEVBQUUsT0FBTyxFQUFFLEtBQUssRUFBQyxHQUFHLElBQUksQ0FBQztJQUN0QyxNQUFNLEVBQUMsTUFBTSxFQUFDLEdBQUcsTUFBTSxDQUFDO0lBQ3hCLE1BQU0sRUFBQyxZQUFZLEVBQUUsZ0JBQWdCLEVBQUUsSUFBSSxFQUFDLEdBQUcsS0FBSyxDQUFDO0lBRXJELGdCQUFnQixDQUFDLE1BQU0sRUFBRSxnQkFBZ0IsQ0FBQyxDQUFDO0lBRTNDLE1BQU0sYUFBYSxHQUFHLElBQUksQ0FBQyxjQUFjLENBQUMsTUFBTSxDQUFDLEtBQUssQ0FBQyxDQUFDO0lBQ3hELE1BQU0sQ0FBQyxTQUFTLEVBQUUsUUFBUSxDQUFDLEdBQUcsSUFBSSxDQUFDO0lBRW5DLE1BQU0sQ0FBQyxLQUFLLEVBQUUsU0FBUyxFQUFFLFFBQVEsRUFBRSxXQUFXLENBQUMsR0FBRyxNQUFNLENBQUMsS0FBSyxDQUFDO0lBQy9ELE1BQU0sT0FBTyxHQUFHLE9BQU8sQ0FBQyxJQUFJLENBQUMsR0FBRyxDQUFDLE1BQU0sQ0FBQyxNQUFNLENBQUMsQ0FBQyxNQUFvQixDQUFDO0lBQ3JFLE1BQU0sTUFBTSxHQUFHLElBQUksWUFBWSxDQUMzQixJQUFJLENBQUMsYUFBYSxDQUFDLENBQUMsS0FBSyxFQUFFLFNBQVMsRUFBRSxRQUFRLEVBQUUsV0FB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QUFDO2lCQUNoQzthQUNGO1NBQ0Y7S0FDRjtJQUVELE9BQU8sT0FBTyxDQUFDLGNBQWMsQ0FDekIsQ0FBQyxLQUFLLEVBQUUsU0FBUyxFQUFFLFFBQVEsRUFBRSxXQUFXLENBQUMsRUFBRSxTQUFTLEVBQUUsTUFBTSxDQUFDLENBQUM7QUFDcEUsQ0FBQztBQUVELE1BQU0sQ0FBQyxNQUFNLG9CQUFvQixHQUFpQjtJQUNoRCxVQUFVLEVBQUUsY0FBYztJQUMxQixXQUFXLEVBQUUsS0FBSztJQUNsQixVQUFVLEVBQUUsY0FBa0M7Q0FDL0MsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbIi8qKlxuICogQGxpY2Vuc2VcbiAqIENvcHlyaWdodCAyMDIwIEdvb2dsZSBMTEMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuXG4gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgXCJMaWNlbnNlXCIpO1xuICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLlxuICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0XG4gKlxuICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wXG4gKlxuICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZVxuICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gXCJBUyBJU1wiIEJBU0lTLFxuICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuXG4gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kXG4gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS5cbiAqID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4gKi9cblxuaW1wb3J0IHtLZXJuZWxDb25maWcsIEtlcm5lbEZ1bmMsIFJlc2l6ZUJpbGluZWFyLCBSZXNpemVCaWxpbmVhckF0dHJzLCBSZXNpemVCaWxpbmVhcklucHV0cywgVGVuc29ySW5mbywgVHlwZWRBcnJheSwgdXRpbH0gZnJvbSAnQHRlbnNvcmZsb3cvdGZqcy1jb3JlJztcblxuaW1wb3J0IHtNYXRoQmFja2VuZENQVX0gZnJvbSAnLi4vYmFja2VuZF9jcHUnO1xuaW1wb3J0IHthc3NlcnROb3RDb21wbGV4fSBmcm9tICcuLi9jcHVfdXRpbCc7XG5cbmV4cG9ydCBmdW5jdGlvbiByZXNpemVCaWxpbmVhcihhcmdzOiB7XG4gIGlucHV0czogUmVzaXplQmlsaW5lYXJJbnB1dHMsXG4gIGJhY2tlbmQ6IE1hdGhCYWNrZW5kQ1BVLFxuICBhdHRyczogUmVzaXplQmlsaW5lYXJBdHRyc1xufSk6IFRlbnNvckluZm8ge1xuICBjb25zdCB7aW5wdXRzLCBiYWNrZW5kLCBhdHRyc30gPSBhcmdzO1xuICBjb25zdCB7aW1hZ2VzfSA9IGlucHV0cztcbiAgY29uc3Qge2FsaWduQ29ybmVycywgaGFsZlBpeGVsQ2VudGVycywgc2l6ZX0gPSBhdHRycztcblxuICBhc3NlcnROb3RDb21wbGV4KGltYWdlcywgJ3Jlc2l6ZUJpbGluZWFyJyk7XG5cbiAgY29uc3QgaW1hZ2VzU3RyaWRlcyA9IHV0aWwuY29tcHV0ZVN0cmlkZXMoaW1hZ2VzLnNoYXBlKTtcbiAgY29uc3QgW25ld0hlaWdodCwgbmV3V2lkdGhdID0gc2l6ZTtcblxuICBjb25zdCBbYmF0Y2gsIG9sZEhlaWdodCwgb2xkV2lkdGgsIG51bUNoYW5uZWxzXSA9IGltYWdlcy5zaGFwZTtcbiAgY29uc3QgeFZhbHVlcyA9IGJhY2tlbmQuZGF0YS5nZXQoaW1hZ2VzLmRhdGFJZCkudmFsdWVzIGFzIFR5cGVkQXJyYXk7XG4gIGNvbnN0IHJlc3VsdCA9IG5ldyBGbG9hdDMyQXJyYXkoXG4gICAgICB1dGlsLnNpemVGcm9tU2hhcGUoW2JhdGNoLCBuZXdIZWlnaHQsIG5ld1dpZHRoLCBudW1DaGFubmVsc10pKTtcblxuICBjb25zdCBlZmZlY3RpdmVJbnB1dFNpemU6IFtudW1iZXIsIG51bWJlcl0gPSBbXG4gICAgKGFsaWduQ29ybmVycyAmJiBuZXdIZWlnaHQgPiAxKSA/IG9sZEhlaWdodCAtIDEgOiBvbGRIZWlnaHQsXG4gICAgKGFsaWduQ29ybmVycyAmJiBuZXdXaWR0aCA+IDEpID8gb2xkV2lkdGggLSAxIDogb2xkV2lkdGhcbiAgXTtcblxuICBjb25zdCBlZmZlY3RpdmVPdXRwdXRTaXplOiBbbnVtYmVyLCBudW1iZXJdID0gW1xuICAgIChhbGlnbkNvcm5lcnMgJiYgbmV3SGVpZ2h0ID4gMSkgPyBuZXdIZWlnaHQgLSAxIDogbmV3SGVpZ2h0LFxuICAgIChhbGlnbkNvcm5lcnMgJiYgbmV3V2lkdGggPiAxKSA/IG5ld1dpZHRoIC0gMSA6IG5ld1dpZHRoXG4gIF07XG4gIGxldCBvdXRwdXRJZHggPSAwO1xuICBjb25zdCBlZmZlY3RpdmVSb3dTaXplUmF0aW8gPSBlZmZlY3RpdmVJbnB1dFNpemVbMF0gLyBlZmZlY3RpdmVPdXRwdXRTaXplWzBdO1xuICBjb25zdCBlZmZlY3RpdmVDb2xTaXplUmF0aW8gPSBlZmZlY3RpdmVJbnB1dFNpemVbMV0gLyBlZmZlY3RpdmVPdXRwdXRTaXplWzFdO1xuICBmb3IgKGxldCBiID0gMDsgYiA8IGJhdGNoOyBiKyspIHtcbiAgICBmb3IgKGxldCByID0gMDsgciA8IG5ld0hlaWdodDsgcisrKSB7XG4gICAgICBsZXQgc291cmNlRnJhY1JvdzogbnVtYmVyO1xuICAgICAgaWYgKGhhbGZQaXhlbENlbnRlcnMpIHtcbiAgICAgICAgc291cmNlRnJhY1JvdyA9IGVmZmVjdGl2ZVJvd1NpemVSYXRpbyAqIChyICsgMC41KSAtIDAuNTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHNvdXJjZUZyYWNSb3cgPSBlZmZlY3RpdmVSb3dTaXplUmF0aW8gKiByO1xuICAgICAgfVxuXG4gICAgICBjb25zdCBzb3VyY2VSb3dGbG9vciA9IE1hdGgubWF4KDAsIE1hdGguZmxvb3Ioc291cmNlRnJhY1JvdykpO1xuICAgICAgY29uc3Qgcm93RnJhYyA9IHNvdXJjZUZyYWNSb3cgLSBzb3VyY2VSb3dGbG9vcjtcbiAgICAgIGNvbnN0IHNvdXJjZVJvd0NlaWwgPSBNYXRoLm1pbihvbGRIZWlnaHQgLSAxLCBNYXRoLmNlaWwoc291cmNlRnJhY1JvdykpO1xuICAgICAgY29uc3QgdG9wUm93T2Zmc2V0ID1cbiAgICAgICAgICBiICogaW1hZ2VzU3RyaWRlc1swXSArIHNvdXJjZVJvd0Zsb29yICogaW1hZ2VzU3RyaWRlc1sxXTtcbiAgICAgIGNvbnN0IGJvdFJvd09mZnNldCA9XG4gICAgICAgICAgYiAqIGltYWdlc1N0cmlkZXNbMF0gKyBzb3VyY2VSb3dDZWlsICogaW1hZ2VzU3RyaWRlc1sxXTtcbiAgICAgIGZvciAobGV0IGMgPSAwOyBjIDwgbmV3V2lkdGg7IGMrKykge1xuICAgICAgICBsZXQgc291cmNlRnJhY0NvbDogbnVtYmVyO1xuICAgICAgICBpZiAoaGFsZlBpeGVsQ2VudGVycykge1xuICAgICAgICAgIHNvdXJjZUZyYWNDb2wgPSBlZmZlY3RpdmVDb2xTaXplUmF0aW8gKiAoYyArIDAuNSkgLSAwLjU7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgc291cmNlRnJhY0NvbCA9IGVmZmVjdGl2ZUNvbFNpemVSYXRpbyAqIGM7XG4gICAgICAgIH1cbiAgICAgICAgY29uc3Qgc291cmNlQ29sRmxvb3IgPSBNYXRoLm1heCgwLCBNYXRoLmZsb29yKHNvdXJjZUZyYWNDb2wpKTtcbiAgICAgICAgY29uc3QgY29sRnJhYyA9IHNvdXJjZUZyYWNDb2wgLSBzb3VyY2VDb2xGbG9vcjtcbiAgICAgICAgY29uc3Qgc291cmNlQ29sQ2VpbCA9IE1hdGgubWluKG9sZFdpZHRoIC0gMSwgTWF0aC5jZWlsKHNvdXJjZUZyYWNDb2wpKTtcbiAgICAgICAgY29uc3QgdG9wTGVmdE9mZmVzdCA9IHRvcFJvd09mZnNldCArIHNvdXJjZUNvbEZsb29yICogaW1hZ2VzU3RyaWRlc1syXTtcbiAgICAgICAgY29uc3QgYm90TGVmdE9mZnNldCA9IGJvdFJvd09mZnNldCArIHNvdXJjZUNvbEZsb29yICogaW1hZ2VzU3RyaWRlc1syXTtcbiAgICAgICAgY29uc3QgdG9wUmlnaHRPZmZzZXQgPSB0b3BSb3dPZmZzZXQgKyBzb3VyY2VDb2xDZWlsICogaW1hZ2VzU3RyaWRlc1syXTtcbiAgICAgICAgY29uc3QgYm90UmlnaHRPZmZlc3QgPSBib3RSb3dPZmZzZXQgKyBzb3VyY2VDb2xDZWlsICogaW1hZ2VzU3RyaWRlc1syXTtcbiAgICAgICAgZm9yIChsZXQgZCA9IDA7IGQgPCBudW1DaGFubmVsczsgZCsrKSB7XG4gICAgICAgICAgLy8gQmVnaW4gc2hhZGVyLlxuXG4gICAgICAgICAgLy8gQ29tcHV0ZSB0aGUgZnJhY3Rpb25hbCBpbmRleCBvZiB0aGUgc291cmNlLlxuICAgICAgICAgIGNvbnN0IHRvcExlZnQgPSB4VmFsdWVzW3RvcExlZnRPZmZlc3QgKyBkXTtcbiAgICAgICAgICBjb25zdCBib3R0b21MZWZ0ID0geFZhbHVlc1tib3RMZWZ0T2Zmc2V0ICsgZF07XG4gICAgICAgICAgY29uc3QgdG9wUmlnaHQgPSB4VmFsdWVzW3RvcFJpZ2h0T2Zmc2V0ICsgZF07XG4gICAgICAgICAgY29uc3QgYm90dG9tUmlnaHQgPSB4VmFsdWVzW2JvdFJpZ2h0T2ZmZXN0ICsgZF07XG5cbiAgICAgICAgICBjb25zdCB0b3AgPSB0b3BMZWZ0ICsgKHRvcFJpZ2h0IC0gdG9wTGVmdCkgKiBjb2xGcmFjO1xuICAgICAgICAgIGNvbnN0IGJvdHRvbSA9IGJvdHRvbUxlZnQgKyAoYm90dG9tUmlnaHQgLSBib3R0b21MZWZ0KSAqIGNvbEZyYWM7XG4gICAgICAgICAgY29uc3QgbmV3VmFsdWUgPSB0b3AgKyAoYm90dG9tIC0gdG9wKSAqIHJvd0ZyYWM7XG5cbiAgICAgICAgICByZXN1bHRbb3V0cHV0SWR4KytdID0gbmV3VmFsdWU7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9XG4gIH1cblxuICByZXR1cm4gYmFja2VuZC5tYWtlVGVuc29ySW5mbyhcbiAgICAgIFtiYXRjaCwgbmV3SGVpZ2h0LCBuZXdXaWR0aCwgbnVtQ2hhbm5lbHNdLCAnZmxvYXQzMicsIHJlc3VsdCk7XG59XG5cbmV4cG9ydCBjb25zdCByZXNpemVCaWxpbmVhckNvbmZpZzogS2VybmVsQ29uZmlnID0ge1xuICBrZXJuZWxOYW1lOiBSZXNpemVCaWxpbmVhcixcbiAgYmFja2VuZE5hbWU6ICdjcHUnLFxuICBrZXJuZWxGdW5jOiByZXNpemVCaWxpbmVhciBhcyB7fSBhcyBLZXJuZWxGdW5jXG59O1xuIl19","/**\n * @license\n * Copyright 2020 Google LLC. All Rights Reserved.\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n * =============================================================================\n */\nimport { ResizeBilinearGrad, util } from '@tensorflow/tfjs-core';\nimport { assertNotComplex } from '../cpu_util';\nexport function resizeBilinearGrad(args) {\n const { inputs, backend, attrs } = args;\n const { images, dy } = inputs;\n const { alignCorners } = attrs;\n assertNotComplex([dy, images], 'resizeBilinearGrad');\n const imagesStrides = util.computeStrides(images.shape);\n const [batch, xHeight, xWidth, depth] = images.shape;\n const [, yHeight, yWidth] = dy.shape;\n const output = new Float32Array(batch * xHeight * xWidth * depth);\n // In the backwards pass, we want to find the pixels that were generated\n // for each pixel in the input image the forward pass and add the\n // corresponding coefficient from dy to the gradient (with some\n // interpolation).\n const effectiveXSize = [\n (alignCorners && yHeight > 1) ? xHeight - 1 : xHeight,\n (alignCorners && yWidth > 1) ? xWidth - 1 : xWidth\n ];\n const effectiveYSize = [\n (alignCorners && yHeight > 1) ? yHeight - 1 : yHeight,\n (alignCorners && yWidth > 1) ? yWidth - 1 : yWidth\n ];\n const heightScale = effectiveXSize[0] / effectiveYSize[0];\n const widthScale = effectiveXSize[1] / effectiveYSize[1];\n // Reference implementation\n // tslint:disable-next-line:max-line-length\n // https://github.com/tensorflow/tensorflow/blob/3039375c86a5bbc9610c7725dcaa95d635f87ba2/tensorflow/core/kernels/resize_bilinear_op.cc#L275\n const dyValues = backend.data.get(dy.dataId).values;\n let offset = 0;\n for (let b = 0; b < batch; b++) {\n const bOffset = b * imagesStrides[0];\n for (let r = 0; r < yHeight; r++) {\n const dxR = r * heightScale;\n const topDxRIndex = Math.floor(dxR);\n const bottomDxRIndex = Math.min(Math.ceil(dxR), xHeight - 1);\n const topDxROffset = bOffset + topDxRIndex * imagesStrides[1];\n const bottomDxROffset = bOffset + bottomDxRIndex * imagesStrides[1];\n const dxRLerp = dxR - topDxRIndex;\n const inverseDxRLerp = 1.0 - dxRLerp;\n for (let c = 0; c < yWidth; c++) {\n const dxC = c * widthScale;\n const leftDxCIndex = Math.floor(dxC);\n const rightDxCIndex = Math.min(Math.ceil(dxC), xWidth - 1);\n const dxCLerp = dxC - leftDxCIndex;\n const inverseDxCLerp = 1.0 - dxCLerp;\n const topLeftRCOffset = topDxROffset + leftDxCIndex * imagesStrides[2];\n const topRightRCOffset = topDxROffset + rightDxCIndex * imagesStrides[2];\n const bottomLeftRCOffset = bottomDxROffset + leftDxCIndex * imagesStrides[2];\n const bottomRightRCOffset = bottomDxROffset + rightDxCIndex * imagesStrides[2];\n const inverseDxRLerpTimesInverseDxCLerp = inverseDxRLerp * inverseDxCLerp;\n const inverseDxRLerpTimesDxCLerp = inverseDxRLerp * dxCLerp;\n const dxRLerpTimesInverseDxCLerp = dxRLerp * inverseDxCLerp;\n const dxRLerpTimesDxCLerp = dxRLerp * dxCLerp;\n for (let d = 0; d < depth; d++) {\n const dyVal = dyValues[offset++];\n output[topLeftRCOffset + d] +=\n dyVal * inverseDxRLerpTimesInverseDxCLerp;\n output[topRightRCOffset + d] += dyVal * inverseDxRLerpTimesDxCLerp;\n output[bottomLeftRCOffset + d] += dyVal * dxRLerpTimesInverseDxCLerp;\n output[bottomRightRCOffset + d] += dyVal * dxRLerpTimesDxCLerp;\n }\n }\n }\n }\n return backend.makeTensorInfo([batch, xWidth, xHeight, depth], 'float32', output);\n}\nexport const resizeBilinearGradConfig = {\n kernelName: ResizeBilinearGrad,\n backendName: 'cpu',\n kernelFunc: resizeBilinearGrad\n};\n//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiUmVzaXplQmlsaW5lYXJHcmFkLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vLi4vdGZqcy1iYWNrZW5kLWNwdS9zcmMva2VybmVscy9SZXNpemVCaWxpbmVhckdyYWQudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUE7Ozs7Ozs7Ozs7Ozs7OztHQWVHO0FBRUgsT0FBTyxFQUEyQixrQkFBa0IsRUFBNkUsSUFBSSxFQUFDLE1BQU0sdUJBQXVCLENBQUM7QUFHcEssT0FBTyxFQUFDLGdCQUFnQixFQUFDLE1BQU0sYUFBYSxDQUFDO0FBRTdDLE1BQU0sVUFBVSxrQkFBa0IsQ0FBQyxJQUlsQztJQUNDLE1BQU0sRUFBQyxNQUFNLEVBQUUsT0FBTyxFQUFFLEtBQUssRUFBQyxHQUFHLElBQUksQ0FBQztJQUN0QyxNQUFNLEVBQUMsTUFBTSxFQUFFLEVBQUUsRUFBQyxHQUFHLE1BQU0sQ0FBQztJQUM1QixNQUFNLEVBQUMsWUFBWSxFQUFDLEdBQUcsS0FBSyxDQUFDO0lBRTdCLGdCQUFnQixDQUFDLENBQUMsRUFBRSxFQUFFLE1BQU0sQ0FBQyxFQUFFLG9CQUFvQixDQUFDLENBQUM7SUFFckQsTUFBTSxhQUFhLEdBQUcsSUFBSSxDQUFDLGNBQWMsQ0FBQyxNQUFNLENBQUMsS0FBSyxDQUFDLENBQUM7SUFFeEQsTUFBTSxDQUFDLEtBQUssRUFBRSxPQUFPLEVBQUUsTUFBTSxFQUFFLEtBQUssQ0FBQyxHQUFHLE1BQU0sQ0FBQyxLQUFLLENBQUM7SUFDckQsTUFBTSxDQUFDLEVBQUUsT0FBTyxFQUFFLE1BQU0sQ0FBQyxHQUFHLEVBQUUsQ0FBQyxLQUFLLENBQUM7SUFFckMsTUFBTSxNQUFNLEdBQUcsSUFBSSxZQUFZLENBQUMsS0FBSyxHQUFHLE9BQU8sR0FBRyxNQUFNLEdBQUcsS0FBSyxDQUFDLENBQUM7SUFFbEUsd0VBQXdFO0lBQ3hFLGlFQUFpRTtJQUNqRSwrREFBK0Q7SUFDL0Qsa0JBQWtCO0lBRWxCLE1BQU0sY0FB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QVUsRUFBRSxrQkFBa0I7SUFDOUIsV0FBVyxFQUFFLEtBQUs7SUFDbEIsVUFBVSxFQUFFLGtCQUFzQztDQUNuRCxDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiLyoqXG4gKiBAbGljZW5zZVxuICogQ29weXJpZ2h0IDIwMjAgR29vZ2xlIExMQy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC5cbiAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSBcIkxpY2Vuc2VcIik7XG4gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuXG4gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXRcbiAqXG4gKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjBcbiAqXG4gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlXG4gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiBcIkFTIElTXCIgQkFTSVMsXG4gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC5cbiAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmRcbiAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLlxuICogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbiAqL1xuXG5pbXBvcnQge0tlcm5lbENvbmZpZywgS2VybmVsRnVuYywgUmVzaXplQmlsaW5lYXJHcmFkLCBSZXNpemVCaWxpbmVhckdyYWRBdHRycywgUmVzaXplQmlsaW5lYXJHcmFkSW5wdXRzLCBUZW5zb3JJbmZvLCBUeXBlZEFycmF5LCB1dGlsfSBmcm9tICdAdGVuc29yZmxvdy90ZmpzLWNvcmUnO1xuXG5pbXBvcnQge01hdGhCYWNrZW5kQ1BVfSBmcm9tICcuLi9iYWNrZW5kX2NwdSc7XG5pbXBvcnQge2Fzc2VydE5vdENvbXBsZXh9IGZyb20gJy4uL2NwdV91dGlsJztcblxuZXhwb3J0IGZ1bmN0aW9uIHJlc2l6ZUJpbGluZWFyR3JhZChhcmdzOiB7XG4gIGlucHV0czogUmVzaXplQmlsaW5lYXJHcmFkSW5wdXRzLFxuICBiYWNrZW5kOiBNYXRoQmFja2VuZENQVSxcbiAgYXR0cnM6IFJlc2l6ZUJpbGluZWFyR3JhZEF0dHJzXG59KTogVGVuc29ySW5mbyB7XG4gIGNvbnN0IHtpbnB1dHMsIGJhY2tlbmQsIGF0dHJzfSA9IGFyZ3M7XG4gIGNvbnN0IHtpbWFnZXMsIGR5fSA9IGlucHV0cztcbiAgY29uc3Qge2FsaWduQ29ybmVyc30gPSBhdHRycztcblxuICBhc3NlcnROb3RDb21wbGV4KFtkeSwgaW1hZ2VzXSwgJ3Jlc2l6ZUJpbGluZWFyR3JhZCcpO1xuXG4gIGNvbnN0IGltYWdlc1N0cmlkZXMgPSB1dGlsLmNvbXB1dGVTdHJpZGVzKGltYWdlcy5zaGFwZSk7XG5cbiAgY29uc3QgW2JhdGNoLCB4SGVpZ2h0LCB4V2lkdGgsIGRlcHRoXSA9IGltYWdlcy5zaGFwZTtcbiAgY29uc3QgWywgeUhlaWdodCwgeVdpZHRoXSA9IGR5LnNoYXBlO1xuXG4gIGNvbnN0IG91dHB1dCA9IG5ldyBGbG9hdDMyQXJyYXkoYmF0Y2ggKiB4SGVpZ2h0ICogeFdpZHRoICogZGVwdGgpO1xuXG4gIC8vIEluIHRoZSBiYWNrd2FyZHMgcGFzcywgd2Ugd2FudCB0byBmaW5kIHRoZSBwaXhlbHMgdGhhdCB3ZXJlIGdlbmVyYXRlZFxuICAvLyBmb3IgZWFjaCBwaXhlbCBpbiB0aGUgaW5wdXQgaW1hZ2UgdGhlIGZvcndhcmQgcGFzcyBhbmQgYWRkIHRoZVxuICAvLyBjb3JyZXNwb25kaW5nIGNvZWZmaWNpZW50IGZyb20gZHkgdG8gdGhlIGdyYWRpZW50ICh3aXRoIHNvbWVcbiAgLy8gaW50ZXJwb2xhdGlvbikuXG5cbiAgY29uc3QgZWZmZWN0aXZlWFNpemU6IFtudW1iZXIsIG51bWJlcl0gPSBbXG4gICAgKGFsaWduQ29ybmVycyAmJiB5SGVpZ2h0ID4gMSkgPyB4SGVpZ2h0IC0gMSA6IHhIZWlnaHQsXG4gICAgKGFsaWduQ29ybmVycyAmJiB5V2lkdGggPiAxKSA/IHhXaWR0aCAtIDEgOiB4V2lkdGhcbiAgXTtcblxuICBjb25zdCBlZmZlY3RpdmVZU2l6ZTogW251bWJlciwgbnVtYmVyXSA9IFtcbiAgICAoYWxpZ25Db3JuZXJzICYmIHlIZWlnaHQgPiAxKSA/IHlIZWlnaHQgLSAxIDogeUhlaWdodCxcbiAgICAoYWxpZ25Db3JuZXJzICYmIHlXaWR0aCA+IDEpID8geVdpZHRoIC0gMSA6IHlXaWR0aFxuICBdO1xuXG4gIGNvbnN0IGhlaWdodFNjYWxlID0gZWZmZWN0aXZlWFNpemVbMF0gLyBlZmZlY3RpdmVZU2l6ZVswXTtcbiAgY29uc3Qgd2lkdGhTY2FsZSA9IGVmZmVjdGl2ZVhTaXplWzFdIC8gZWZmZWN0aXZlWVNpemVbMV07XG5cbiAgLy8gUmVmZXJlbmNlIGltcGxlbWVudGF0aW9uXG4gIC8vIHRzbGludDpkaXNhYmxlLW5leHQtbGluZTptYXgtbGluZS1sZW5ndGhcbiAgLy8gaHR0cHM6Ly9naXRodWIuY29tL3RlbnNvcmZsb3cvdGVuc29yZmxvdy9ibG9iLzMwMzkzNzVjODZhNWJiYzk2MTBjNzcyNWRjYWE5NWQ2MzVmODdiYTIvdGVuc29yZmxvdy9jb3JlL2tlcm5lbHMvcmVzaXplX2JpbGluZWFyX29wLmNjI0wyNzVcbiAgY29uc3QgZHlWYWx1ZXMgPSBiYWNrZW5kLmRhdGEuZ2V0KGR5LmRhdGFJZCkudmFsdWVzIGFzIFR5cGVkQXJyYXk7XG4gIGxldCBvZmZzZXQgPSAwO1xuICBmb3IgKGxldCBiID0gMDsgYiA8IGJhdGNoOyBiKyspIHtcbiAgICBjb25zdCBiT2Zmc2V0ID0gYiAqIGltYWdlc1N0cmlkZXNbMF07XG4gICAgZm9yIChsZXQgciA9IDA7IHIgPCB5SGVpZ2h0OyByKyspIHtcbiAgICAgIGNvbnN0IGR4UiA9IHIgKiBoZWlnaHRTY2FsZTtcbiAgICAgIGNvbnN0IHRvcER4UkluZGV4ID0gTWF0aC5mbG9vcihkeFIpO1xuICAgICAgY29uc3QgYm90dG9tRHhSSW5kZXggPSBNYXRoLm1pbihNYXRoLmNlaWwoZHhSKSwgeEhlaWdodCAtIDEpO1xuXG4gICAgICBjb25zdCB0b3BEeFJPZmZzZXQgPSBiT2Zmc2V0ICsgdG9wRHhSSW5kZXggKiBpbWFnZXNTdHJpZGVzWzFdO1xuICAgICAgY29uc3QgYm90dG9tRHhST2Zmc2V0ID0gYk9mZnNldCArIGJvdHRvbUR4UkluZGV4ICogaW1hZ2VzU3RyaWRlc1sxXTtcblxuICAgICAgY29uc3QgZHhSTGVycCA9IGR4UiAtIHRvcER4UkluZGV4O1xuICAgICAgY29uc3QgaW52ZXJzZUR4UkxlcnAgPSAxLjAgLSBkeFJMZXJwO1xuICAgICAgZm9yIChsZXQgYyA9IDA7IGMgPCB5V2lkdGg7IGMrKykge1xuICAgICAgICBjb25zdCBkeEMgPSBjICogd2lkdGhTY2FsZTtcbiAgICAgICAgY29uc3QgbGVmdER4Q0luZGV4ID0gTWF0aC5mbG9vcihkeEMpO1xuICAgICAgICBjb25zdCByaWdodER4Q0luZGV4ID0gTWF0aC5taW4oTWF0aC5jZWlsKGR4QyksIHhXaWR0aCAtIDEpO1xuICAgICAgICBjb25zdCBkeENMZXJwID0gZHhDIC0gbGVmdER4Q0luZGV4O1xuICAgICAgICBjb25zdCBpbnZlcnNlRHhDTGVycCA9IDEuMCAtIGR4Q0xlcnA7XG5cbiAgICAgICAgY29uc3QgdG9wTGVmdFJDT2Zmc2V0ID0gdG9wRHhST2Zmc2V0ICsgbGVmdER4Q0luZGV4ICogaW1hZ2VzU3RyaWRlc1syXTtcbiAgICAgICAgY29uc3QgdG9wUmlnaHRSQ09mZnNldCA9XG4gICAgICAgICAgICB0b3BEeFJPZmZzZXQgKyByaWdodER4Q0luZGV4ICogaW1hZ2VzU3RyaWRlc1syXTtcbiAgICAgICAgY29uc3QgYm90dG9tTGVmdFJDT2Zmc2V0ID1cbiAgICAgICAgICAgIGJvdHRvbUR4Uk9mZnNldCArIGxlZnREeENJbmRleCAqIGltYWdlc1N0cmlkZXNbMl07XG4gICAgICAgIGNvbnN0IGJvdHRvbVJpZ2h0UkNPZmZzZXQgPVxuICAgICAgICAgICAgYm90dG9tRHhST2Zmc2V0ICsgcmlnaHREeENJbmRleCAqIGltYWdlc1N0cmlkZXNbMl07XG5cbiAgICAgICAgY29uc3QgaW52ZXJzZUR4UkxlcnBUaW1lc0ludmVyc2VEeENMZXJwID1cbiAgICAgICAgICAgIGludmVyc2VEeFJMZXJwICogaW52ZXJzZUR4Q0xlcnA7XG4gICAgICAgIGNvbnN0IGludmVyc2VEeFJMZXJwVGltZXNEeENMZXJwID0gaW52ZXJzZUR4UkxlcnAgKiBkeENMZXJwO1xuICAgICAgICBjb25zdCBkeFJMZXJwVGltZXNJbnZlcnNlRHhDTGVycCA9IGR4UkxlcnAgKiBpbnZlcnNlRHhDTGVycDtcbiAgICAgICAgY29uc3QgZHhSTGVycFRpbWVzRHhDTGVycCA9IGR4UkxlcnAgKiBkeENMZXJwO1xuICAgICAgICBmb3IgKGxldCBkID0gMDsgZCA8IGRlcHRoOyBkKyspIHtcbiAgICAgICAgICBjb25zdCBkeVZhbCA9IGR5VmFsdWVzW29mZnNldCsrXTtcbiAgICAgICAgICBvdXRwdXRbdG9wTGVmdFJDT2Zmc2V0ICsgZF0gKz1cbiAgICAgICAgICAgICAgZHlWYWwgKiBpbnZlcnNlRHhSTGVycFRpbWVzSW52ZXJzZUR4Q0xlcnA7XG4gICAgICAgICAgb3V0cHV0W3RvcFJpZ2h0UkNPZmZzZXQgKyBkXSArPSBkeVZhbCAqIGludmVyc2VEeFJMZXJwVGltZXNEeENMZXJwO1xuICAgICAgICAgIG91dHB1dFtib3R0b21MZWZ0UkNPZmZzZXQgKyBkXSArPSBkeVZhbCAqIGR4UkxlcnBUaW1lc0ludmVyc2VEeENMZXJwO1xuICAgICAgICAgIG91dHB1dFtib3R0b21SaWdodFJDT2Zmc2V0ICsgZF0gKz0gZHlWYWwgKiBkeFJMZXJwVGltZXNEeENMZXJwO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfVxuICB9XG5cbiAgcmV0dXJuIGJhY2tlbmQubWFrZVRlbnNvckluZm8oXG4gICAgICBbYmF0Y2gsIHhXaWR0aCwgeEhlaWdodCwgZGVwdGhdLCAnZmxvYXQzMicsIG91dHB1dCk7XG59XG5cbmV4cG9ydCBjb25zdCByZXNpemVCaWxpbmVhckdyYWRDb25maWc6IEtlcm5lbENvbmZpZyA9IHtcbiAga2VybmVsTmFtZTogUmVzaXplQmlsaW5lYXJHcmFkLFxuICBiYWNrZW5kTmFtZTogJ2NwdScsXG4gIGtlcm5lbEZ1bmM6IHJlc2l6ZUJpbGluZWFyR3JhZCBhcyB7fSBhcyBLZXJuZWxGdW5jXG59O1xuIl19","/**\n * @license\n * Copyright 2020 Google LLC. All Rights Reserved.\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n * =============================================================================\n */\nimport { ResizeNearestNeighbor, util } from '@tensorflow/tfjs-core';\nimport { assertNotComplex } from '../cpu_util';\nexport function resizeNearestNeighbor(args) {\n const { inputs, backend, attrs } = args;\n const { images } = inputs;\n const { alignCorners, halfPixelCenters, size } = attrs;\n assertNotComplex(images, 'resizeNearestNeighbor');\n const imagesStrides = util.computeStrides(images.shape);\n const [newHeight, newWidth] = size;\n const [batch, oldHeight, oldWidth, numChannels] = images.shape;\n const xValues = backend.data.get(images.dataId).values;\n const output = new Float32Array(batch * newHeight * newWidth * numChannels);\n const effectiveInputSize = [\n (alignCorners && newHeight > 1) ? oldHeight - 1 : oldHeight,\n (alignCorners && newWidth > 1) ? oldWidth - 1 : oldWidth\n ];\n const effectiveOutputSize = [\n (alignCorners && newHeight > 1) ? newHeight - 1 : newHeight,\n (alignCorners && newWidth > 1) ? newWidth - 1 : newWidth\n ];\n const effectiveRowSizeRatio = effectiveInputSize[0] / effectiveOutputSize[0];\n const effectiveColSizeRatio = effectiveInputSize[1] / effectiveOutputSize[1];\n let outputOffset = 0;\n for (let b = 0; b < batch; b++) {\n const batchOffset = b * imagesStrides[0];\n for (let r = 0; r < newHeight; r++) {\n const sourceFracRow = halfPixelCenters ?\n effectiveRowSizeRatio * (r + 0.5) :\n effectiveRowSizeRatio * r;\n let sourceNearestRow = Math.min(oldHeight - 1, alignCorners ? Math.round(sourceFracRow) : Math.floor(sourceFracRow));\n if (halfPixelCenters) {\n sourceNearestRow = Math.max(0, sourceNearestRow);\n }\n const rowOffset = batchOffset + sourceNearestRow * imagesStrides[1];\n for (let c = 0; c < newWidth; c++) {\n const sourceFracCol = halfPixelCenters ?\n effectiveColSizeRatio * (c + 0.5) :\n effectiveColSizeRatio * c;\n let sourceNearestCol = Math.min(oldWidth - 1, alignCorners ? Math.round(sourceFracCol) :\n Math.floor(sourceFracCol));\n if (halfPixelCenters) {\n sourceNearestCol = Math.max(0, sourceNearestCol);\n }\n const colOffset = rowOffset + sourceNearestCol * imagesStrides[2];\n for (let d = 0; d < numChannels; d++) {\n // Begin shader.\n // Compute the fractional index of the source.\n const newVal = xValues[colOffset + d];\n output[outputOffset++] = newVal;\n }\n }\n }\n }\n return backend.makeTensorInfo([batch, newHeight, newWidth, numChannels], images.dtype, output);\n}\nexport const resizeNearestNeighborConfig = {\n kernelName: ResizeNearestNeighbor,\n backendName: 'cpu',\n kernelFunc: resizeNearestNeighbor\n};\n//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiUmVzaXplTmVhcmVzdE5laWdoYm9yLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vLi4vdGZqcy1iYWNrZW5kLWNwdS9zcmMva2VybmVscy9SZXNpemVOZWFyZXN0TmVpZ2hib3IudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUE7Ozs7Ozs7Ozs7Ozs7OztHQWVHO0FBRUgsT0FBTyxFQUEyQixxQkFBcUIsRUFBbUYsSUFBSSxFQUFDLE1BQU0sdUJBQXVCLENBQUM7QUFHN0ssT0FBTyxFQUFDLGdCQUFnQixFQUFDLE1BQU0sYUFBYSxDQUFDO0FBRTdDLE1BQU0sVUFBVSxxQkFBcUIsQ0FBQyxJQUlyQztJQUNDLE1BQU0sRUFBQyxNQUFNLEVBQUUsT0FBTyxFQUFFLEtBQUssRUFBQyxHQUFHLElBQUksQ0FBQztJQUN0QyxNQUFNLEVBQUMsTUFBTSxFQUFDLEdBQUcsTUFBTSxDQUFDO0lBQ3hCLE1BQU0sRUFBQyxZQUFZLEVBQUUsZ0JBQWdCLEVBQUUsSUFBSSxFQUFDLEdBQUcsS0FBSyxDQUFDO0lBRXJELGdCQUFnQixDQUFDLE1BQU0sRUFBRSx1QkFBdUIsQ0FBQyxDQUFDO0lBRWxELE1BQU0sYUFBYSxHQUFHLElBQUksQ0FBQyxjQUFjLENBQUMsTUFBTSxDQUFDLEtBQUssQ0FBQyxDQUFDO0lBQ3hELE1BQU0sQ0FBQyxTQUFTLEVBQUUsUUFBUSxDQUFDLEdBQUcsSUFBSSxDQUFDO0lBRW5DLE1BQU0sQ0FBQyxLQUFLLEVBQUUsU0FBUyxFQUFFLFFBQVEsRUFBRSxXQUFXLENBQUMsR0FBRyxNQUFNLENBQUMsS0FBSyxDQUFDO0lBQy9ELE1BQU0sT0FBTyxHQUFHLE9BQU8sQ0FBQyxJQUFJLENBQUMsR0FBRyxDQUFDLE1BQU0sQ0FBQyxNQUFNLENBQUMsQ0FBQyxNQUFvQixDQUFDO0lBQ3JFLE1BQU0sTUFBTSxHQUFHLElBQUksWUFBWSxDQUFDLEtBQUssR0FBRyxTQUFTLEdBQUcsUUFBUSxHQUFHLFdBQVcsQ0FBQyxD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O2dCQUNsRSxLQUFLLElBQUksQ0FBQyxHQUFHLENBQUMsRUFBRSxDQUFDLEdBQUcsV0FBVyxFQUFFLENBQUMsRUFBRSxFQUFFO29CQUNwQyxnQkFBZ0I7b0JBQ2hCLDhDQUE4QztvQkFDOUMsTUFBTSxNQUFNLEdBQUcsT0FBTyxDQUFDLFNBQVMsR0FBRyxDQUFDLENBQUMsQ0FBQztvQkFDdEMsTUFBTSxDQUFDLFlBQVksRUFBRSxDQUFDLEdBQUcsTUFBTSxDQUFDO2lCQUNqQzthQUNGO1NBQ0Y7S0FDRjtJQUVELE9BQU8sT0FBTyxDQUFDLGNBQWMsQ0FDekIsQ0FBQyxLQUFLLEVBQUUsU0FBUyxFQUFFLFFBQVEsRUFBRSxXQUFXLENBQUMsRUFBRSxNQUFNLENBQUMsS0FBSyxFQUFFLE1BQU0sQ0FBQyxDQUFDO0FBQ3ZFLENBQUM7QUFFRCxNQUFNLENBQUMsTUFBTSwyQkFBMkIsR0FBaUI7SUFDdkQsVUFBVSxFQUFFLHFCQUFxQjtJQUNqQyxXQUFXLEVBQUUsS0FBSztJQUNsQixVQUFVLEVBQUUscUJBQXlDO0NBQ3RELENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyIvKipcbiAqIEBsaWNlbnNlXG4gKiBDb3B5cmlnaHQgMjAyMCBHb29nbGUgTExDLiBBbGwgUmlnaHRzIFJlc2VydmVkLlxuICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlIFwiTGljZW5zZVwiKTtcbiAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS5cbiAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdFxuICpcbiAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMFxuICpcbiAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmVcbiAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuIFwiQVMgSVNcIiBCQVNJUyxcbiAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLlxuICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZFxuICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuXG4gKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuICovXG5cbmltcG9ydCB7S2VybmVsQ29uZmlnLCBLZXJuZWxGdW5jLCBSZXNpemVOZWFyZXN0TmVpZ2hib3IsIFJlc2l6ZU5lYXJlc3ROZWlnaGJvckF0dHJzLCBSZXNpemVOZWFyZXN0TmVpZ2hib3JJbnB1dHMsIFRlbnNvckluZm8sIFR5cGVkQXJyYXksIHV0aWx9IGZyb20gJ0B0ZW5zb3JmbG93L3RmanMtY29yZSc7XG5cbmltcG9ydCB7TWF0aEJhY2tlbmRDUFV9IGZyb20gJy4uL2JhY2tlbmRfY3B1JztcbmltcG9ydCB7YXNzZXJ0Tm90Q29tcGxleH0gZnJvbSAnLi4vY3B1X3V0aWwnO1xuXG5leHBvcnQgZnVuY3Rpb24gcmVzaXplTmVhcmVzdE5laWdoYm9yKGFyZ3M6IHtcbiAgaW5wdXRzOiBSZXNpemVOZWFyZXN0TmVpZ2hib3JJbnB1dHMsXG4gIGJhY2tlbmQ6IE1hdGhCYWNrZW5kQ1BVLFxuICBhdHRyczogUmVzaXplTmVhcmVzdE5laWdoYm9yQXR0cnNcbn0pOiBUZW5zb3JJbmZvIHtcbiAgY29uc3Qge2lucHV0cywgYmFja2VuZCwgYXR0cnN9ID0gYXJncztcbiAgY29uc3Qge2ltYWdlc30gPSBpbnB1dHM7XG4gIGNvbnN0IHthbGlnbkNvcm5lcnMsIGhhbGZQaXhlbENlbnRlcnMsIHNpemV9ID0gYXR0cnM7XG5cbiAgYXNzZXJ0Tm90Q29tcGxleChpbWFnZXMsICdyZXNpemVOZWFyZXN0TmVpZ2hib3InKTtcblxuICBjb25zdCBpbWFnZXNTdHJpZGVzID0gdXRpbC5jb21wdXRlU3RyaWRlcyhpbWFnZXMuc2hhcGUpO1xuICBjb25zdCBbbmV3SGVpZ2h0LCBuZXdXaWR0aF0gPSBzaXplO1xuXG4gIGNvbnN0IFtiYXRjaCwgb2xkSGVpZ2h0LCBvbGRXaWR0aCwgbnVtQ2hhbm5lbHNdID0gaW1hZ2VzLnNoYXBlO1xuICBjb25zdCB4VmFsdWVzID0gYmFja2VuZC5kYXRhLmdldChpbWFnZXMuZGF0YUlkKS52YWx1ZXMgYXMgVHlwZWRBcnJheTtcbiAgY29uc3Qgb3V0cHV0ID0gbmV3IEZsb2F0MzJBcnJheShiYXRjaCAqIG5ld0hlaWdodCAqIG5ld1dpZHRoICogbnVtQ2hhbm5lbHMpO1xuXG4gIGNvbnN0IGVmZmVjdGl2ZUlucHV0U2l6ZTogW251bWJlciwgbnVtYmVyXSA9IFtcbiAgICAoYWxpZ25Db3JuZXJzICYmIG5ld0hlaWdodCA+IDEpID8gb2xkSGVpZ2h0IC0gMSA6IG9sZEhlaWdodCxcbiAgICAoYWxpZ25Db3JuZXJzICYmIG5ld1dpZHRoID4gMSkgPyBvbGRXaWR0aCAtIDEgOiBvbGRXaWR0aFxuICBdO1xuXG4gIGNvbnN0IGVmZmVjdGl2ZU91dHB1dFNpemU6IFtudW1iZXIsIG51bWJlcl0gPSBbXG4gICAgKGFsaWduQ29ybmVycyAmJiBuZXdIZWlnaHQgPiAxKSA/IG5ld0hlaWdodCAtIDEgOiBuZXdIZWlnaHQsXG4gICAgKGFsaWduQ29ybmVycyAmJiBuZXdXaWR0aCA+IDEpID8gbmV3V2lkdGggLSAxIDogbmV3V2lkdGhcbiAgXTtcblxuICBjb25zdCBlZmZlY3RpdmVSb3dTaXplUmF0aW8gPSBlZmZlY3RpdmVJbnB1dFNpemVbMF0gLyBlZmZlY3RpdmVPdXRwdXRTaXplWzBdO1xuICBjb25zdCBlZmZlY3RpdmVDb2xTaXplUmF0aW8gPSBlZmZlY3RpdmVJbnB1dFNpemVbMV0gLyBlZmZlY3RpdmVPdXRwdXRTaXplWzFdO1xuXG4gIGxldCBvdXRwdXRPZmZzZXQgPSAwO1xuICBmb3IgKGxldCBiID0gMDsgYiA8IGJhdGNoOyBiKyspIHtcbiAgICBjb25zdCBiYXRjaE9mZnNldCA9IGIgKiBpbWFnZXNTdHJpZGVzWzBdO1xuICAgIGZvciAobGV0IHIgPSAwOyByIDwgbmV3SGVpZ2h0OyByKyspIHtcbiAgICAgIGNvbnN0IHNvdXJjZUZyYWNSb3cgPSBoYWxmUGl4ZWxDZW50ZXJzID9cbiAgICAgICAgICBlZmZlY3RpdmVSb3dTaXplUmF0aW8gKiAociArIDAuNSkgOlxuICAgICAgICAgIGVmZmVjdGl2ZVJvd1NpemVSYXRpbyAqIHI7XG4gICAgICBsZXQgc291cmNlTmVhcmVzdFJvdyA9IE1hdGgubWluKFxuICAgICAgICAgIG9sZEhlaWdodCAtIDEsXG4gICAgICAgICAgYWxpZ25Db3JuZXJzID8gTWF0aC5yb3VuZChzb3VyY2VGcmFjUm93KSA6IE1hdGguZmxvb3Ioc291cmNlRnJhY1JvdykpO1xuICAgICAgaWYgKGhhbGZQaXhlbENlbnRlcnMpIHtcbiAgICAgICAgc291cmNlTmVhcmVzdFJvdyA9IE1hdGgubWF4KDAsIHNvdXJjZU5lYXJlc3RSb3cpO1xuICAgICAgfVxuICAgICAgY29uc3Qgcm93T2Zmc2V0ID0gYmF0Y2hPZmZzZXQgKyBzb3VyY2VOZWFyZXN0Um93ICogaW1hZ2VzU3RyaWRlc1sxXTtcbiAgICAgIGZvciAobGV0IGMgPSAwOyBjIDwgbmV3V2lkdGg7IGMrKykge1xuICAgICAgICBjb25zdCBzb3VyY2VGcmFjQ29sID0gaGFsZlBpeGVsQ2VudGVycyA/XG4gICAgICAgICAgICBlZmZlY3RpdmVDb2xTaXplUmF0aW8gKiAoYyArIDAuNSkgOlxuICAgICAgICAgICAgZWZmZWN0aXZlQ29sU2l6ZVJhdGlvICogYztcbiAgICAgICAgbGV0IHNvdXJjZU5lYXJlc3RDb2wgPSBNYXRoLm1pbihcbiAgICAgICAgICAgIG9sZFdpZHRoIC0gMSxcbiAgICAgICAgICAgIGFsaWduQ29ybmVycyA/IE1hdGgucm91bmQoc291cmNlRnJhY0NvbCkgOlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgTWF0aC5mbG9vcihzb3VyY2VGcmFjQ29sKSk7XG4gICAgICAgIGlmIChoYWxmUGl4ZWxDZW50ZXJzKSB7XG4gICAgICAgICAgc291cmNlTmVhcmVzdENvbCA9IE1hdGgubWF4KDAsIHNvdXJjZU5lYXJlc3RDb2wpO1xuICAgICAgICB9XG4gICAgICAgIGNvbnN0IGNvbE9mZnNldCA9IHJvd09mZnNldCArIHNvdXJjZU5lYXJlc3RDb2wgKiBpbWFnZXNTdHJpZGVzWzJdO1xuICAgICAgICBmb3IgKGxldCBkID0gMDsgZCA8IG51bUNoYW5uZWxzOyBkKyspIHtcbiAgICAgICAgICAvLyBCZWdpbiBzaGFkZXIuXG4gICAgICAgICAgLy8gQ29tcHV0ZSB0aGUgZnJhY3Rpb25hbCBpbmRleCBvZiB0aGUgc291cmNlLlxuICAgICAgICAgIGNvbnN0IG5ld1ZhbCA9IHhWYWx1ZXNbY29sT2Zmc2V0ICsgZF07XG4gICAgICAgICAgb3V0cHV0W291dHB1dE9mZnNldCsrXSA9IG5ld1ZhbDtcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH1cbiAgfVxuXG4gIHJldHVybiBiYWNrZW5kLm1ha2VUZW5zb3JJbmZvKFxuICAgICAgW2JhdGNoLCBuZXdIZWlnaHQsIG5ld1dpZHRoLCBudW1DaGFubmVsc10sIGltYWdlcy5kdHlwZSwgb3V0cHV0KTtcbn1cblxuZXhwb3J0IGNvbnN0IHJlc2l6ZU5lYXJlc3ROZWlnaGJvckNvbmZpZzogS2VybmVsQ29uZmlnID0ge1xuICBrZXJuZWxOYW1lOiBSZXNpemVOZWFyZXN0TmVpZ2hib3IsXG4gIGJhY2tlbmROYW1lOiAnY3B1JyxcbiAga2VybmVsRnVuYzogcmVzaXplTmVhcmVzdE5laWdoYm9yIGFzIHt9IGFzIEtlcm5lbEZ1bmNcbn07XG4iXX0=","/**\n * @license\n * Copyright 2020 Google LLC. All Rights Reserved.\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n * =============================================================================\n */\nimport { ResizeNearestNeighborGrad, util } from '@tensorflow/tfjs-core';\nimport { assertNotComplex } from '../cpu_util';\nexport function resizeNearestNeighborGrad(args) {\n const { inputs, backend, attrs } = args;\n const { images, dy } = inputs;\n const { alignCorners } = attrs;\n assertNotComplex([dy, images], 'resizeNearestNeighborGrad');\n const imagesStrides = util.computeStrides(images.shape);\n const dyStrides = util.computeStrides(dy.shape);\n const [batch, xHeight, xWidth, depth] = images.shape;\n const [, yHeight, yWidth] = dy.shape;\n const output = new Float32Array(batch * xHeight * xWidth * depth);\n const dyValues = backend.data.get(dy.dataId).values;\n // In the backwards pass, we want to find the pixels that were generated\n // for each pixel in the input image the forward pass\n const effectiveXSize = [\n (alignCorners && yHeight > 1) ? xHeight - 1 : xHeight,\n (alignCorners && yWidth > 1) ? xWidth - 1 : xWidth\n ];\n const effectiveYSize = [\n (alignCorners && yHeight > 1) ? yHeight - 1 : yHeight,\n (alignCorners && yWidth > 1) ? yWidth - 1 : yWidth\n ];\n const heightScale = effectiveXSize[0] / effectiveYSize[0];\n const widthScale = effectiveXSize[1] / effectiveYSize[1];\n const invHeightScale = 1 / heightScale;\n const invWidthScale = 1 / widthScale;\n // This defines the size of the window of values around a particular\n // index in dy that we want to search for contributions to dx.\n const winHeight = (Math.ceil(invHeightScale) * 2) + 2;\n const winWidth = (Math.ceil(invWidthScale) * 2) + 2;\n // Loop over the output space.\n for (let b = 0; b < batch; b++) {\n const batchOffset = b * imagesStrides[0];\n for (let r = 0; r < xHeight; r++) {\n const rowOffset = batchOffset + r * imagesStrides[1];\n // Compute bounds for where in dy we will look\n const startRLerp = Math.floor(r * invHeightScale);\n const startDyR = Math.floor(startRLerp - (winHeight / 2));\n for (let c = 0; c < xWidth; c++) {\n const colOffset = rowOffset + c * imagesStrides[2];\n // Compute bounds for where in dy we will look\n const startCLerp = Math.floor(c * invWidthScale);\n const startDyC = Math.floor(startCLerp - (winWidth / 2));\n for (let d = 0; d < depth; d++) {\n let accum = 0;\n // loop over dy\n for (let dyRIndex = 0; dyRIndex < winHeight; dyRIndex++) {\n const dyR = dyRIndex + startDyR;\n // Guard against the window exceeding the bounds of dy\n if (dyR < 0 || dyR >= yHeight) {\n continue;\n }\n const dyROffset = batchOffset + dyR * dyStrides[1];\n const sourceFracRow = dyR * heightScale;\n const sourceNearestRow = Math.min(xHeight - 1, alignCorners ? Math.round(sourceFracRow) :\n Math.floor(sourceFracRow));\n if (r !== sourceNearestRow) {\n continue;\n }\n for (let dyCIndex = 0; dyCIndex < winWidth; dyCIndex++) {\n const dyC = dyCIndex + startDyC;\n // Guard against the window exceeding the bounds of dy\n if (dyC < 0 || dyC >= yWidth) {\n continue;\n }\n const dyCOffset = dyROffset + dyC * dyStrides[2];\n const sourceFracCol = dyC * widthScale;\n const sourceNearestCol = Math.min(xWidth - 1, alignCorners ? Math.round(sourceFracCol) :\n Math.floor(sourceFracCol));\n if (c === sourceNearestCol) {\n accum += dyValues[dyCOffset + d];\n }\n }\n }\n output[colOffset + d] = accum;\n }\n }\n }\n }\n return backend.makeTensorInfo(images.shape, images.dtype, output);\n}\nexport const resizeNearestNeighborGradConfig = {\n kernelName: ResizeNearestNeighborGrad,\n backendName: 'cpu',\n kernelFunc: resizeNearestNeighborGrad\n};\n//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiUmVzaXplTmVhcmVzdE5laWdoYm9yR3JhZC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uLy4uL3RmanMtYmFja2VuZC1jcHUvc3JjL2tlcm5lbHMvUmVzaXplTmVhcmVzdE5laWdoYm9yR3JhZC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQTs7Ozs7Ozs7Ozs7Ozs7O0dBZUc7QUFFSCxPQUFPLEVBQTJCLHlCQUF5QixFQUEyRixJQUFJLEVBQUMsTUFBTSx1QkFBdUIsQ0FBQztBQUd6TCxPQUFPLEVBQUMsZ0JBQWdCLEVBQUMsTUFBTSxhQUFhLENBQUM7QUFFN0MsTUFBTSxVQUFVLHlCQUF5QixDQUFDLElBSXpDO0lBQ0MsTUFBTSxFQUFDLE1BQU0sRUFBRSxPQUFPLEVBQUUsS0FBSyxFQUFDLEdBQUcsSUFBSSxDQUFDO0lBQ3RDLE1BQU0sRUFBQyxNQUFNLEVBQUUsRUFBRSxFQUFDLEdBQUcsTUFBTSxDQUFDO0lBQzVCLE1BQU0sRUFBQyxZQUFZLEVBQUMsR0FBRyxLQUFLLENBQUM7SUFFN0IsZ0JBQWdCLENBQUMsQ0FBQyxFQUFFLEVBQUUsTUFBTSxDQUFDLEVBQUUsMkJBQTJCLENBQUMsQ0FBQztJQUU1RCxNQUFNLGFBQWEsR0FBRyxJQUFJLENBQUMsY0FBYyxDQUFDLE1BQU0sQ0FBQyxLQUFLLENBQUMsQ0FBQztJQUN4RCxNQUFNLFNBQVMsR0FBRyxJQUFJLENBQUMsY0FBYyxDQUFDLEVBQUUsQ0FBQyxLQUFLLENBQUMsQ0FBQztJQUNoRCxNQUFNLENBQUMsS0FBSyxFQUFFLE9BQU8sRUFBRSxNQUFNLEVBQUUsS0FBSyxDQUFDLEdBQUcsTUFBTSxDQUFDLEtBQUssQ0FBQztJQUNyRCxNQUFNLENBQUMsRUFBRSxPQUFPLEVBQUUsTUFBTSxDQUFDLEdBQUcsRUFBRSxDQUFDLEtBQUssQ0FBQztJQUVyQyxNQUFNLE1BQU0sR0FBRyxJQUFJLFlBQVksQ0FBQyxLQUFLLEdBQUcsT0FBTyxHQUFHLE1BQU0sR0FBRyxL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QUksQ0FBQyxHQUFHLENBQzdCLE1BQU0sR0FBRyxDQUFDLEVBQ1YsWUFBWSxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsS0FBSyxDQUFDLGFBQWEsQ0FBQyxDQUFDLENBQUM7Z0NBQzNCLElBQUksQ0FBQyxLQUFLLENBQUMsYUFBYSxDQUFDLENBQUMsQ0FBQzs0QkFFOUMsSUFBSSxDQUFDLEtBQUssZ0JBQWdCLEVBQUU7Z0NBQzFCLEtBQUssSUFBSSxRQUFRLENBQUMsU0FBUyxHQUFHLENBQUMsQ0FBQyxDQUFDOzZCQUNsQzt5QkFDRjtxQkFDRjtvQkFDRCxNQUFNLENBQUMsU0FBUyxHQUFHLENBQUMsQ0FBQyxHQUFHLEtBQUssQ0FBQztpQkFDL0I7YUFDRjtTQUNGO0tBQ0Y7SUFFRCxPQUFPLE9BQU8sQ0FBQyxjQUFjLENBQUMsTUFBTSxDQUFDLEtBQUssRUFBRSxNQUFNLENBQUMsS0FBSyxFQUFFLE1BQU0sQ0FBQyxDQUFDO0FBQ3BFLENBQUM7QUFFRCxNQUFNLENBQUMsTUFBTSwrQkFBK0IsR0FBaUI7SUFDM0QsVUFBVSxFQUFFLHlCQUF5QjtJQUNyQyxXQUFXLEVBQUUsS0FBSztJQUNsQixVQUFVLEVBQUUseUJBQTZDO0NBQzFELENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyIvKipcbiAqIEBsaWNlbnNlXG4gKiBDb3B5cmlnaHQgMjAyMCBHb29nbGUgTExDLiBBbGwgUmlnaHRzIFJlc2VydmVkLlxuICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlIFwiTGljZW5zZVwiKTtcbiAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS5cbiAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdFxuICpcbiAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMFxuICpcbiAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmVcbiAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuIFwiQVMgSVNcIiBCQVNJUyxcbiAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLlxuICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZFxuICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuXG4gKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuICovXG5cbmltcG9ydCB7S2VybmVsQ29uZmlnLCBLZXJuZWxGdW5jLCBSZXNpemVOZWFyZXN0TmVpZ2hib3JHcmFkLCBSZXNpemVOZWFyZXN0TmVpZ2hib3JHcmFkQXR0cnMsIFJlc2l6ZU5lYXJlc3ROZWlnaGJvckdyYWRJbnB1dHMsIFRlbnNvckluZm8sIFR5cGVkQXJyYXksIHV0aWx9IGZyb20gJ0B0ZW5zb3JmbG93L3RmanMtY29yZSc7XG5cbmltcG9ydCB7TWF0aEJhY2tlbmRDUFV9IGZyb20gJy4uL2JhY2tlbmRfY3B1JztcbmltcG9ydCB7YXNzZXJ0Tm90Q29tcGxleH0gZnJvbSAnLi4vY3B1X3V0aWwnO1xuXG5leHBvcnQgZnVuY3Rpb24gcmVzaXplTmVhcmVzdE5laWdoYm9yR3JhZChhcmdzOiB7XG4gIGlucHV0czogUmVzaXplTmVhcmVzdE5laWdoYm9yR3JhZElucHV0cyxcbiAgYmFja2VuZDogTWF0aEJhY2tlbmRDUFUsXG4gIGF0dHJzOiBSZXNpemVOZWFyZXN0TmVpZ2hib3JHcmFkQXR0cnNcbn0pOiBUZW5zb3JJbmZvIHtcbiAgY29uc3Qge2lucHV0cywgYmFja2VuZCwgYXR0cnN9ID0gYXJncztcbiAgY29uc3Qge2ltYWdlcywgZHl9ID0gaW5wdXRzO1xuICBjb25zdCB7YWxpZ25Db3JuZXJzfSA9IGF0dHJzO1xuXG4gIGFzc2VydE5vdENvbXBsZXgoW2R5LCBpbWFnZXNdLCAncmVzaXplTmVhcmVzdE5laWdoYm9yR3JhZCcpO1xuXG4gIGNvbnN0IGltYWdlc1N0cmlkZXMgPSB1dGlsLmNvbXB1dGVTdHJpZGVzKGltYWdlcy5zaGFwZSk7XG4gIGNvbnN0IGR5U3RyaWRlcyA9IHV0aWwuY29tcHV0ZVN0cmlkZXMoZHkuc2hhcGUpO1xuICBjb25zdCBbYmF0Y2gsIHhIZWlnaHQsIHhXaWR0aCwgZGVwdGhdID0gaW1hZ2VzLnNoYXBlO1xuICBjb25zdCBbLCB5SGVpZ2h0LCB5V2lkdGhdID0gZHkuc2hhcGU7XG5cbiAgY29uc3Qgb3V0cHV0ID0gbmV3IEZsb2F0MzJBcnJheShiYXRjaCAqIHhIZWlnaHQgKiB4V2lkdGggKiBkZXB0aCk7XG4gIGNvbnN0IGR5VmFsdWVzID0gYmFja2VuZC5kYXRhLmdldChkeS5kYXRhSWQpLnZhbHVlcyBhcyBUeXBlZEFycmF5O1xuXG4gIC8vIEluIHRoZSBiYWNrd2FyZHMgcGFzcywgd2Ugd2FudCB0byBmaW5kIHRoZSBwaXhlbHMgdGhhdCB3ZXJlIGdlbmVyYXRlZFxuICAvLyBmb3IgZWFjaCBwaXhlbCBpbiB0aGUgaW5wdXQgaW1hZ2UgdGhlIGZvcndhcmQgcGFzc1xuXG4gIGNvbnN0IGVmZmVjdGl2ZVhTaXplOiBbbnVtYmVyLCBudW1iZXJdID0gW1xuICAgIChhbGlnbkNvcm5lcnMgJiYgeUhlaWdodCA+IDEpID8geEhlaWdodCAtIDEgOiB4SGVpZ2h0LFxuICAgIChhbGlnbkNvcm5lcnMgJiYgeVdpZHRoID4gMSkgPyB4V2lkdGggLSAxIDogeFdpZHRoXG4gIF07XG5cbiAgY29uc3QgZWZmZWN0aXZlWVNpemU6IFtudW1iZXIsIG51bWJlcl0gPSBbXG4gICAgKGFsaWduQ29ybmVycyAmJiB5SGVpZ2h0ID4gMSkgPyB5SGVpZ2h0IC0gMSA6IHlIZWlnaHQsXG4gICAgKGFsaWduQ29ybmVycyAmJiB5V2lkdGggPiAxKSA/IHlXaWR0aCAtIDEgOiB5V2lkdGhcbiAgXTtcblxuICBjb25zdCBoZWlnaHRTY2FsZSA9IGVmZmVjdGl2ZVhTaXplWzBdIC8gZWZmZWN0aXZlWVNpemVbMF07XG4gIGNvbnN0IHdpZHRoU2NhbGUgPSBlZmZlY3RpdmVYU2l6ZVsxXSAvIGVmZmVjdGl2ZVlTaXplWzFdO1xuXG4gIGNvbnN0IGludkhlaWdodFNjYWxlID0gMSAvIGhlaWdodFNjYWxlO1xuICBjb25zdCBpbnZXaWR0aFNjYWxlID0gMSAvIHdpZHRoU2NhbGU7XG5cbiAgLy8gVGhpcyBkZWZpbmVzIHRoZSBzaXplIG9mIHRoZSB3aW5kb3cgb2YgdmFsdWVzIGFyb3VuZCBhIHBhcnRpY3VsYXJcbiAgLy8gaW5kZXggaW4gZHkgdGhhdCB3ZSB3YW50IHRvIHNlYXJjaCBmb3IgY29udHJpYnV0aW9ucyB0byBkeC5cbiAgY29uc3Qgd2luSGVpZ2h0ID0gKE1hdGguY2VpbChpbnZIZWlnaHRTY2FsZSkgKiAyKSArIDI7XG4gIGNvbnN0IHdpbldpZHRoID0gKE1hdGguY2VpbChpbnZXaWR0aFNjYWxlKSAqIDIpICsgMjtcblxuICAvLyBMb29wIG92ZXIgdGhlIG91dHB1dCBzcGFjZS5cbiAgZm9yIChsZXQgYiA9IDA7IGIgPCBiYXRjaDsgYisrKSB7XG4gICAgY29uc3QgYmF0Y2hPZmZzZXQgPSBiICogaW1hZ2VzU3RyaWRlc1swXTtcbiAgICBmb3IgKGxldCByID0gMDsgciA8IHhIZWlnaHQ7IHIrKykge1xuICAgICAgY29uc3Qgcm93T2Zmc2V0ID0gYmF0Y2hPZmZzZXQgKyByICogaW1hZ2VzU3RyaWRlc1sxXTtcblxuICAgICAgLy8gQ29tcHV0ZSBib3VuZHMgZm9yIHdoZXJlIGluIGR5IHdlIHdpbGwgbG9va1xuICAgICAgY29uc3Qgc3RhcnRSTGVycCA9IE1hdGguZmxvb3IociAqIGludkhlaWdodFNjYWxlKTtcbiAgICAgIGNvbnN0IHN0YXJ0RHlSID0gTWF0aC5mbG9vcihzdGFydFJMZXJwIC0gKHdpbkhlaWdodCAvIDIpKTtcbiAgICAgIGZvciAobGV0IGMgPSAwOyBjIDwgeFdpZHRoOyBjKyspIHtcbiAgICAgICAgY29uc3QgY29sT2Zmc2V0ID0gcm93T2Zmc2V0ICsgYyAqIGltYWdlc1N0cmlkZXNbMl07XG5cbiAgICAgICAgLy8gQ29tcHV0ZSBib3VuZHMgZm9yIHdoZXJlIGluIGR5IHdlIHdpbGwgbG9va1xuICAgICAgICBjb25zdCBzdGFydENMZXJwID0gTWF0aC5mbG9vcihjICogaW52V2lkdGhTY2FsZSk7XG4gICAgICAgIGNvbnN0IHN0YXJ0RHlDID0gTWF0aC5mbG9vcihzdGFydENMZXJwIC0gKHdpbldpZHRoIC8gMikpO1xuXG4gICAgICAgIGZvciAobGV0IGQgPSAwOyBkIDwgZGVwdGg7IGQrKykge1xuICAgICAgICAgIGxldCBhY2N1bSA9IDA7XG4gICAgICAgICAgLy8gbG9vcCBvdmVyIGR5XG5cbiAgICAgICAgICBmb3IgKGxldCBkeVJJbmRleCA9IDA7IGR5UkluZGV4IDwgd2luSGVpZ2h0OyBkeVJJbmRleCsrKSB7XG4gICAgICAgICAgICBjb25zdCBkeVIgPSBkeVJJbmRleCArIHN0YXJ0RHlSO1xuICAgICAgICAgICAgLy8gR3VhcmQgYWdhaW5zdCB0aGUgd2luZG93IGV4Y2VlZGluZyB0aGUgYm91bmRzIG9mIGR5XG4gICAgICAgICAgICBpZiAoZHlSIDwgMCB8fCBkeVIgPj0geUhlaWdodCkge1xuICAgICAgICAgICAgICBjb250aW51ZTtcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgY29uc3QgZHlST2Zmc2V0ID0gYmF0Y2hPZmZzZXQgKyBkeVIgKiBkeVN0cmlkZXNbMV07XG4gICAgICAgICAgICBjb25zdCBzb3VyY2VGcmFjUm93ID0gZHlSICogaGVpZ2h0U2NhbGU7XG4gICAgICAgICAgICBjb25zdCBzb3VyY2VOZWFyZXN0Um93ID0gTWF0aC5taW4oXG4gICAgICAgICAgICAgICAgeEhlaWdodCAtIDEsXG4gICAgICAgICAgICAgICAgYWxpZ25Db3JuZXJzID8gTWF0aC5yb3VuZChzb3VyY2VGcmFjUm93KSA6XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTWF0aC5mbG9vcihzb3VyY2VGcmFjUm93KSk7XG4gICAgICAgICAgICBpZiAociAhPT0gc291cmNlTmVhcmVzdFJvdykge1xuICAgICAgICAgICAgICBjb250aW51ZTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGZvciAobGV0IGR5Q0luZGV4ID0gMDsgZHlDSW5kZXggPCB3aW5XaWR0aDsgZHlDSW5kZXgrKykge1xuICAgICAgICAgICAgICBjb25zdCBkeUMgPSBkeUNJbmRleCArIHN0YXJ0RHlDO1xuICAgICAgICAgICAgICAvLyBHdWFyZCBhZ2FpbnN0IHRoZSB3aW5kb3cgZXhjZWVkaW5nIHRoZSBib3VuZHMgb2YgZHlcbiAgICAgICAgICAgICAgaWYgKGR5QyA8IDAgfHwgZHlDID49IHlXaWR0aCkge1xuICAgICAgICAgICAgICAgIGNvbnRpbnVlO1xuICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgY29uc3QgZHlDT2Zmc2V0ID0gZHlST2Zmc2V0ICsgZHlDICogZHlTdHJpZGVzWzJdO1xuICAgICAgICAgICAgICBjb25zdCBzb3VyY2VGcmFjQ29sID0gZHlDICogd2lkdGhTY2FsZTtcbiAgICAgICAgICAgICAgY29uc3Qgc291cmNlTmVhcmVzdENvbCA9IE1hdGgubWluKFxuICAgICAgICAgICAgICAgICAgeFdpZHRoIC0gMSxcbiAgICAgICAgICAgICAgICAgIGFsaWduQ29ybmVycyA/IE1hdGgucm91bmQoc291cmNlRnJhY0NvbCkgOlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTWF0aC5mbG9vcihzb3VyY2VGcmFjQ29sKSk7XG5cbiAgICAgICAgICAgICAgaWYgKGMgPT09IHNvdXJjZU5lYXJlc3RDb2wpIHtcbiAgICAgICAgICAgICAgICBhY2N1bSArPSBkeVZhbHVlc1tkeUNPZmZzZXQgKyBkXTtcbiAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICAgIH1cbiAgICAgICAgICBvdXRwdXRbY29sT2Zmc2V0ICsgZF0gPSBhY2N1bTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH1cbiAgfVxuXG4gIHJldHVybiBiYWNrZW5kLm1ha2VUZW5zb3JJbmZvKGltYWdlcy5zaGFwZSwgaW1hZ2VzLmR0eXBlLCBvdXRwdXQpO1xufVxuXG5leHBvcnQgY29uc3QgcmVzaXplTmVhcmVzdE5laWdoYm9yR3JhZENvbmZpZzogS2VybmVsQ29uZmlnID0ge1xuICBrZXJuZWxOYW1lOiBSZXNpemVOZWFyZXN0TmVpZ2hib3JHcmFkLFxuICBiYWNrZW5kTmFtZTogJ2NwdScsXG4gIGtlcm5lbEZ1bmM6IHJlc2l6ZU5lYXJlc3ROZWlnaGJvckdyYWQgYXMge30gYXMgS2VybmVsRnVuY1xufTtcbiJdfQ==","/**\n * @license\n * Copyright 2020 Google LLC. All Rights Reserved.\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n * =============================================================================\n */\nimport { Reverse, TensorBuffer, util } from '@tensorflow/tfjs-core';\nimport { assertNotComplex } from '../cpu_util';\nimport { identity } from './Identity';\nexport function reverse(args) {\n const { inputs, backend, attrs } = args;\n const { x } = inputs;\n const { dims } = attrs;\n assertNotComplex(x, 'reverse');\n const xRank = x.shape.length;\n const $dims = util.parseAxisParam(dims, x.shape);\n if (xRank === 0) {\n return identity({ inputs: { x }, backend });\n }\n const outBuf = new TensorBuffer(x.shape, x.dtype);\n const xBuf = backend.bufferSync(x);\n for (let i = 0; i < outBuf.size; i++) {\n const outLoc = outBuf.indexToLoc(i);\n const inLoc = outLoc.slice();\n $dims.forEach(d => inLoc[d] = x.shape[d] - 1 - inLoc[d]);\n outBuf.set(xBuf.get(...inLoc), ...outLoc);\n }\n return backend.makeTensorInfo(outBuf.shape, outBuf.dtype, outBuf.values);\n}\nexport const reverseConfig = {\n kernelName: Reverse,\n backendName: 'cpu',\n kernelFunc: reverse\n};\n//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiUmV2ZXJzZS5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uLy4uL3RmanMtYmFja2VuZC1jcHUvc3JjL2tlcm5lbHMvUmV2ZXJzZS50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQTs7Ozs7Ozs7Ozs7Ozs7O0dBZUc7QUFFSCxPQUFPLEVBQTJCLE9BQU8sRUFBK0IsWUFBWSxFQUFjLElBQUksRUFBQyxNQUFNLHVCQUF1QixDQUFDO0FBR3JJLE9BQU8sRUFBQyxnQkFBZ0IsRUFBQyxNQUFNLGFBQWEsQ0FBQztBQUM3QyxPQUFPLEVBQUMsUUFBUSxFQUFDLE1BQU0sWUFBWSxDQUFDO0FBRXBDLE1BQU0sVUFBVSxPQUFPLENBQ25CLElBQ3lFO0lBRTNFLE1BQU0sRUFBQyxNQUFNLEVBQUUsT0FBTyxFQUFFLEtBQUssRUFBQyxHQUFHLElBQUksQ0FBQztJQUN0QyxNQUFNLEVBQUMsQ0FBQyxFQUFDLEdBQUcsTUFBTSxDQUFDO0lBQ25CLE1BQU0sRUFBQyxJQUFJLEVBQUMsR0FBRyxLQUFLLENBQUM7SUFFckIsZ0JBQWdCLENBQUMsQ0FBQyxFQUFFLFNBQVMsQ0FBQyxDQUFDO0lBRS9CLE1BQU0sS0FBSyxHQUFHLENBQUMsQ0FBQyxLQUFLLENBQUMsTUFBTSxDQUFDO0lBRTdCLE1BQU0sS0FBSyxHQUFHLElBQUksQ0FBQyxjQUFjLENBQUMsSUFBSSxFQUFFLENBQUMsQ0FBQyxLQUFLLENBQUMsQ0FBQztJQUNqRCxJQUFJLEtBQUssS0FBSyxDQUFDLEVBQUU7UUFDZixPQUFPLFFBQVEsQ0FBQyxFQUFDLE1BQU0sRUFBRSxFQUFDLENBQUMsRUFBQyxFQUFFLE9BQU8sRUFBQyxDQUFDLENBQUM7S0FDekM7SUFFRCxNQUFNLE1BQU0sR0FBRyxJQUFJLFlBQVksQ0FBQyxDQUFDLENBQUMsS0FBSyxFQUFFLENBQUMsQ0FBQyxLQUFLLENBQUMsQ0FBQztJQUNsRCxNQUFNLElBQUksR0FBRyxPQUFPLENBQUMsVUFBVSxDQUFDLENBQUMsQ0FBQyxDQUFDO0lBRW5DLEtBQUssSUFBSSxDQUFDLEdBQUcsQ0FBQyxFQUFFLENBQUMsR0FBRyxNQUFNLENBQUMsSUFBSSxFQUFFLENBQUMsRUFBRSxFQUFFO1FBQ3BDLE1BQU0sTUFBTSxHQUFHLE1BQU0sQ0FBQyxVQUFVLENBQUMsQ0FBQyxDQUFDLENBQUM7UUFDcEMsTUFBTSxLQUFLLEdBQUcsTUFBTSxDQUFDLEtBQUssRUFBRSxDQUFDO1FBQzdCLEtBQUssQ0FBQyxPQUFPLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLEdBQUcsS0FBSyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUM7UUFDekQsTUFBTSxDQUFDLEdBQUcsQ0FBQyxJQUFJLENBQUMsR0FBRyxDQUFDLEdBQUcsS0FBSyxDQUFDLEVBQUUsR0FBRyxNQUFNLENBQUMsQ0FBQztLQUMzQztJQUVELE9BQU8sT0FBTyxDQUFDLGNBQWMsQ0FBQyxNQUFNLENBQUMsS0FBSyxFQUFFLE1BQU0sQ0FBQyxLQUFLLEVBQUUsTUFBTSxDQUFDLE1BQU0sQ0FBQyxDQUFDO0FBQzNFLENBQUM7QUFFRCxNQUFNLENBQUMsTUFBTSxhQUFhLEdBQWlCO0lBQ3pDLFVBQVUsRUFBRSxPQUFPO0lBQ25CLFdBQVcsRUFBRSxLQUFLO0lBQ2xCLFVBQVUsRUFBRSxPQUEyQjtDQUN4QyxDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiLyoqXG4gKiBAbGljZW5zZVxuICogQ29weXJpZ2h0IDIwMjAgR29vZ2xlIExMQy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC5cbiAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSBcIkxpY2Vuc2VcIik7XG4gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuXG4gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXRcbiAqXG4gKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjBcbiAqXG4gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlXG4gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiBcIkFTIElTXCIgQkFTSVMsXG4gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC5cbiAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmRcbiAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLlxuICogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbiAqL1xuXG5pbXBvcnQge0tlcm5lbENvbmZpZywgS2VybmVsRnVuYywgUmV2ZXJzZSwgUmV2ZXJzZUF0dHJzLCBSZXZlcnNlSW5wdXRzLCBUZW5zb3JCdWZmZXIsIFRlbnNvckluZm8sIHV0aWx9IGZyb20gJ0B0ZW5zb3JmbG93L3RmanMtY29yZSc7XG5cbmltcG9ydCB7TWF0aEJhY2tlbmRDUFV9IGZyb20gJy4uL2JhY2tlbmRfY3B1JztcbmltcG9ydCB7YXNzZXJ0Tm90Q29tcGxleH0gZnJvbSAnLi4vY3B1X3V0aWwnO1xuaW1wb3J0IHtpZGVudGl0eX0gZnJvbSAnLi9JZGVudGl0eSc7XG5cbmV4cG9ydCBmdW5jdGlvbiByZXZlcnNlKFxuICAgIGFyZ3M6XG4gICAgICAgIHtpbnB1dHM6IFJldmVyc2VJbnB1dHMsIGJhY2tlbmQ6IE1hdGhCYWNrZW5kQ1BVLCBhdHRyczogUmV2ZXJzZUF0dHJzfSk6XG4gICAgVGVuc29ySW5mbyB7XG4gIGNvbnN0IHtpbnB1dHMsIGJhY2tlbmQsIGF0dHJzfSA9IGFyZ3M7XG4gIGNvbnN0IHt4fSA9IGlucHV0cztcbiAgY29uc3Qge2RpbXN9ID0gYXR0cnM7XG5cbiAgYXNzZXJ0Tm90Q29tcGxleCh4LCAncmV2ZXJzZScpO1xuXG4gIGNvbnN0IHhSYW5rID0geC5zaGFwZS5sZW5ndGg7XG5cbiAgY29uc3QgJGRpbXMgPSB1dGlsLnBhcnNlQXhpc1BhcmFtKGRpbXMsIHguc2hhcGUpO1xuICBpZiAoeFJhbmsgPT09IDApIHtcbiAgICByZXR1cm4gaWRlbnRpdHkoe2lucHV0czoge3h9LCBiYWNrZW5kfSk7XG4gIH1cblxuICBjb25zdCBvdXRCdWYgPSBuZXcgVGVuc29yQnVmZmVyKHguc2hhcGUsIHguZHR5cGUpO1xuICBjb25zdCB4QnVmID0gYmFja2VuZC5idWZmZXJTeW5jKHgpO1xuXG4gIGZvciAobGV0IGkgPSAwOyBpIDwgb3V0QnVmLnNpemU7IGkrKykge1xuICAgIGNvbnN0IG91dExvYyA9IG91dEJ1Zi5pbmRleFRvTG9jKGkpO1xuICAgIGNvbnN0IGluTG9jID0gb3V0TG9jLnNsaWNlKCk7XG4gICAgJGRpbXMuZm9yRWFjaChkID0+IGluTG9jW2RdID0geC5zaGFwZVtkXSAtIDEgLSBpbkxvY1tkXSk7XG4gICAgb3V0QnVmLnNldCh4QnVmLmdldCguLi5pbkxvYyksIC4uLm91dExvYyk7XG4gIH1cblxuICByZXR1cm4gYmFja2VuZC5tYWtlVGVuc29ySW5mbyhvdXRCdWYuc2hhcGUsIG91dEJ1Zi5kdHlwZSwgb3V0QnVmLnZhbHVlcyk7XG59XG5cbmV4cG9ydCBjb25zdCByZXZlcnNlQ29uZmlnOiBLZXJuZWxDb25maWcgPSB7XG4gIGtlcm5lbE5hbWU6IFJldmVyc2UsXG4gIGJhY2tlbmROYW1lOiAnY3B1JyxcbiAga2VybmVsRnVuYzogcmV2ZXJzZSBhcyB7fSBhcyBLZXJuZWxGdW5jXG59O1xuIl19","/**\n * @license\n * Copyright 2020 Google LLC. All Rights Reserved.\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n * =============================================================================\n */\nimport { backend_util, RotateWithOffset, util } from '@tensorflow/tfjs-core';\nexport const rotateWithOffsetConfig = {\n kernelName: RotateWithOffset,\n backendName: 'cpu',\n kernelFunc: ({ inputs, attrs, backend }) => {\n const { image } = inputs;\n const { radians, fillValue, center } = attrs;\n const cpuBackend = backend;\n const output = util.getTypedArrayFromDType(image.dtype, util.sizeFromShape(image.shape));\n const [batch, imageHeight, imageWidth, numChannels] = image.shape;\n const [centerX, centerY] = backend_util.getImageCenter(center, imageHeight, imageWidth);\n const fullOpacityValue = 255;\n const sinFactor = Math.sin(radians);\n const cosFactor = Math.cos(radians);\n const imageVals = cpuBackend.data.get(image.dataId).values;\n for (let batchIdx = 0; batchIdx < batch; batchIdx++) {\n const batchOffset = batchIdx * imageWidth * imageHeight * numChannels;\n for (let row = 0; row < imageHeight; row++) {\n const rowOffset = row * (imageWidth * numChannels);\n for (let col = 0; col < imageWidth; col++) {\n const colOffset = col * numChannels;\n for (let channel = 0; channel < numChannels; channel++) {\n const coords = [batch, row, col, channel];\n const x = coords[2];\n const y = coords[1];\n // coordX/coordY are the result of rotating and translating x/y.\n let coordX = (x - centerX) * cosFactor - (y - centerY) * sinFactor;\n let coordY = (x - centerX) * sinFactor + (y - centerY) * cosFactor;\n coordX = Math.round(coordX + centerX);\n coordY = Math.round(coordY + centerY);\n let outputValue = fillValue;\n if (typeof fillValue !== 'number') {\n if (channel === 3) {\n outputValue = fullOpacityValue;\n }\n else {\n outputValue = fillValue[channel];\n }\n }\n // If the coordinate position falls within the image boundaries...\n if (coordX >= 0 && coordX < imageWidth && coordY >= 0 &&\n coordY < imageHeight) {\n // set the output to the image value at the coordinate position.\n const rotatedRowOffset = coordY * (imageWidth * numChannels);\n const rotatedColOffset = coordX * numChannels;\n const imageIdx = batchOffset + rotatedRowOffset + rotatedColOffset + channel;\n outputValue = imageVals[imageIdx];\n }\n const outIdx = batchOffset + rowOffset + colOffset + channel;\n output[outIdx] = outputValue;\n }\n }\n }\n }\n const dataId = cpuBackend.write(output, image.shape, image.dtype);\n return { dataId, shape: image.shape, dtype: image.dtype };\n }\n};\n//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiUm90YXRlV2l0aE9mZnNldC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uLy4uL3RmanMtYmFja2VuZC1jcHUvc3JjL2tlcm5lbHMvUm90YXRlV2l0aE9mZnNldC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQTs7Ozs7Ozs7Ozs7Ozs7O0dBZUc7QUFHSCxPQUFPLEVBQUMsWUFBWSxFQUFFLGdCQUFnQixFQUFpRCxJQUFJLEVBQUMsTUFBTSx1QkFBdUIsQ0FBQztBQUkxSCxNQUFNLENBQUMsTUFBTSxzQkFBc0IsR0FBaUI7SUFDbEQsVUFBVSxFQUFFLGdCQUFnQjtJQUM1QixXQUFXLEVBQUUsS0FBSztJQUNsQixVQUFVLEVBQUUsQ0FBQyxFQUFDLE1BQU0sRUFBRSxLQUFLLEVBQUUsT0FBTyxFQUFDLEVBQUUsRUFBRTtRQUN2QyxNQUFNLEVBQUMsS0FBSyxFQUFDLEdBQUcsTUFBZ0MsQ0FBQztRQUNqRCxNQUFNLEVBQUMsT0FBTyxFQUFFLFNBQVMsRUFBRSxNQUFNLEVBQUMsR0FBRyxLQUFvQyxDQUFDO1FBQzFFLE1BQU0sVUFBVSxHQUFHLE9BQXlCLENBQUM7UUFFN0MsTUFBTSxNQUFNLEdBQUcsSUFBSSxDQUFDLHNCQUFzQixDQUN0QyxLQUFLLENBQUMsS0FBd0IsRUFBRSxJQUFJLENBQUMsYUFBYSxDQUFDLEtBQUssQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDO1FBQ3JFLE1BQU0sQ0FBQyxLQUFLLEVBQUUsV0FBVyxFQUFFLFVBQVUsRUFBRSxXQUFXLENBQUMsR0FBRyxLQUFLLENBQUMsS0FBSyxDQUFDO1FBRWxFLE1BQU0sQ0FBQyxPQUFPLEVBQUUsT0FBTyxDQUFDLEdBQ3BCLFlBQVksQ0FBQyxjQUFjLENBQUMsTUFBTSxFQUFFLFdBQVcsRUFBRSxVQUFVLENBQUMsQ0FBQztRQUNqRSxNQUFNLGdCQUFnQixHQUFHLEdBQUcsQ0FBQztRQUU3QixNQUFNLFNBQVMsR0FBRyxJQUFJLENBQUMsR0FBRyxDQUFDLE9BQU8sQ0FBQyxDQUFDO1FBQ3BDLE1BQU0sU0FBUyxHQUFHLElBQUksQ0FBQyxHQUFHLENBQUMsT0FBTyxDQUFDLENBQUM7UUFDcEMsTUFBTSxTQUFTLEdBQUcsVUFBVSxDQUFDLElBQUksQ0FBQyxHQUFHLENBQUMsS0FBSyxDQUFDLE1BQU0sQ0FBQyxDQUFDLE1BQW9CLENBQUM7UUFFekUsS0FBSyxJQUFJLFFBQVEsR0FBRyxDQUFDLEVBQUUsUUFBUSxHQUFHLEtBQUssRUFBRSxRQUFRLEVBQUUsRUFBRTtZQUNuRCxNQUFNLFdBQVcsR0FBRyxRQUFRLEdBQUcsVUFBVSxHQUFHLFdBQVcsR0FBRyxXQUFXLENBQUM7WUFFdEUsS0FBSyxJQUFJLEdBQUcsR0FBRyxDQUFDLEVBQUUsR0FBRyxHQUFHLFdBQVcsRUFBRSxHQUFHLEVBQUUsRUFBRTtnQkFDMUMsTUFBTSxTQUFTLEdBQUcsR0FBRyxHQUFHLENBQUMsVUFBVSxHQUFHLFdBQVcsQ0FBQyxDQUFDO2dCQUVuRCxLQUFLLElBQUksR0FBRyxHQUFHLENBQUMsRUFBRSxHQUFHLEdBQUcsVUFBVSxFQUFFLEdBQUcsRUFBRSxFQUFFO29CQUN6QyxNQUFNLFNBQVMsR0FBRyxHQUFHLEdBQUcsV0FBVyxDQUFDO29CQUVwQyxLQUFLLElBQUksT0FBTyxHQUFHLENBQUMsRUFBRSxPQUFPLEdBQUcsV0FBVyxFQUFFLE9BQU8sRUFBRSxFQUFFO3dCQUN0RCxNQUFNLE1BQU0sR0FBRyxDQUFDLEtBQUssRUFBRSxHQUFHLEVBQUUsR0FBRyxFQUFFLE9BQU8sQ0FBQyxDQUFDO3dCQUUxQyxNQUFNLENBQUMsR0FBRyxNQUFNLENBQUMsQ0FBQyxDQUFDLENBQUM7d0JBQ3BCLE1BQU0sQ0FBQyxHQUFHLE1BQU0sQ0FBQyxDQUFDLENBQUMsQ0FBQzt3QkFFcEIsZ0VBQWdFO3dCQUNoRSxJQUFJLE1BQU0sR0FBRyxDQUFDLENBQUMsR0FBRyxPQUFPLENBQUMsR0FBRyxTQUFTLEdBQUcsQ0FBQyxDQUFDLEdBQUcsT0FBTyxDQUFDLEdBQUcsU0FBUyxDQUFDO3dCQUNuRSxJQUFJLE1BQU0sR0FBRyxDQUFDLENBQUMsR0FBRyxPQUFPLENBQUMsR0FBRyxTQUFTLEdBQUcsQ0FBQyxDQUFDLEdBQUcsT0FBTyxDQUFDLEdBQUcsU0FBUyxDQUFDO3dCQUNuRSxNQUFNLEdBQUcsSUFBSSxDQUFDLEtBQUssQ0FBQyxNQUFNLEdBQUcsT0FBTyxDQUFDLENBQUM7d0JBQ3RDLE1BQU0sR0FBRyxJQUFJLENBQUMsS0FBSyxDQUFDLE1BQU0sR0FBRyxPQUFPLENBQUMsQ0FBQzt3QkFFdEMsSUFBSSxXQUFXLEdBQUcsU0FBUyxDQUFDO3dCQUM1QixJQUFJLE9BQU8sU0FBUyxLQUFLLFFBQVEsRUFBRTs0QkFDakMsSUFBSSxPQUFPLEtBQUssQ0FBQyxFQUFFO2dDQUNqQixXQUFXLEdBQUcsZ0JBQWdCLENBQUM7NkJBQ2hDO2lDQUFNO2dDQUNMLFdBQVcsR0FBRyxTQUFTLENBQUMsT0FBTyxDQUFDLENBQUM7NkJBQ2xDO3lCQUNGO3dCQUVELGtFQUFrRTt3QkFDbEUsSUFBSSxNQUFNLElBQUksQ0FBQyxJQUFJLE1BQU0sR0FBRyxVQUFVLElBQUksTUFBTSxJQUFJLENBQUM7NEJBQ2pELE1BQU0sR0FBRyxXQUFXLEVBQUU7NEJBQ3hCLGdFQUFnRTs0QkFDaEUsTUFBTSxnQkFBZ0IsR0FBRyxNQUFNLEdBQUcsQ0FBQyxVQUFVLEdBQUcsV0FBVyxDQUFDLENBQUM7NEJBQzdELE1BQU0sZ0JBQWdCLEdBQUcsTUFBTSxHQUFHLFdBQVcsQ0FBQzs0QkFDOUMsTUFBTSxRQUFRLEdBQ1YsV0FBVyxHQUFHLGdCQUFnQixHQUFHLGdCQUFnQixHQUFHLE9BQU8sQ0FBQzs0QkFDaEUsV0FBVyxHQUFHLFNBQVMsQ0FBQyxRQUFRLENBQUMsQ0FBQzt5QkFDbkM7d0JBRUQsTUFBTSxNQUFNLEdBQUcsV0FBVyxHQUFHLFNBQVMsR0FBRyxTQUFTLEdBQUcsT0FBTyxDQUFDO3dCQUM3RCxNQUFNLENBQUMsTUFBTSxDQUFDLEdBQUcsV0FBcUIsQ0FBQztxQkFDeEM7aUJBQ0Y7YUFDRjtTQUNGO1FBRUQsTUFBTSxNQUFNLEdBQUcsVUFBVSxDQUFDLEtBQUssQ0FBQyxNQUFNLEVBQUUsS0FBSyxDQUFDLEtBQUssRUFBRSxLQUFLLENBQUMsS0FBSyxDQUFDLENBQUM7UUFDbEUsT0FBTyxFQUFDLE1BQU0sRUFBRSxLQUFLLEVBQUUsS0FBSyxDQUFDLEtBQUssRUFBRSxLQUFLLEVBQUUsS0FBSyxDQUFDLEtBQUssRUFBQyxDQUFDO0lBQzFELENBQUM7Q0FDRixDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiLyoqXG4gKiBAbGljZW5zZVxuICogQ29weXJpZ2h0IDIwMjAgR29vZ2xlIExMQy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC5cbiAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSBcIkxpY2Vuc2VcIik7XG4gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuXG4gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXRcbiAqXG4gKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjBcbiAqXG4gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlXG4gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiBcIkFTIElTXCIgQkFTSVMsXG4gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC5cbiAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmRcbiAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLlxuICogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbiAqL1xuXG5pbXBvcnQge0tlcm5lbENvbmZpZywgTnVtZXJpY0RhdGFUeXBlLCBUeXBlZEFycmF5fSBmcm9tICdAdGVuc29yZmxvdy90ZmpzLWNvcmUnO1xuaW1wb3J0IHtiYWNrZW5kX3V0aWwsIFJvdGF0ZVdpdGhPZmZzZXQsIFJvdGF0ZVdpdGhPZmZzZXRBdHRycywgUm90YXRlV2l0aE9mZnNldElucHV0cywgdXRpbH0gZnJvbSAnQHRlbnNvcmZsb3cvdGZqcy1jb3JlJztcblxuaW1wb3J0IHtNYXRoQmFja2VuZENQVX0gZnJvbSAnLi4vYmFja2VuZF9jcHUnO1xuXG5leHBvcnQgY29uc3Qgcm90YXRlV2l0aE9mZnNldENvbmZpZzogS2VybmVsQ29uZmlnID0ge1xuICBrZXJuZWxOYW1lOiBSb3RhdGVXaXRoT2Zmc2V0LFxuICBiYWNrZW5kTmFtZTogJ2NwdScsXG4gIGtlcm5lbEZ1bmM6ICh7aW5wdXRzLCBhdHRycywgYmFja2VuZH0pID0+IHtcbiAgICBjb25zdCB7aW1hZ2V9ID0gaW5wdXRzIGFzIFJvdGF0ZVdpdGhPZmZzZXRJbnB1dHM7XG4gICAgY29uc3Qge3JhZGlhbnMsIGZpbGxWYWx1ZSwgY2VudGVyfSA9IGF0dHJzIGFzIHt9IGFzIFJvdGF0ZVdpdGhPZmZzZXRBdHRycztcbiAgICBjb25zdCBjcHVCYWNrZW5kID0gYmFja2VuZCBhcyBNYXRoQmFja2VuZENQVTtcblxuICAgIGNvbnN0IG91dHB1dCA9IHV0aWwuZ2V0VHlwZWRBcnJheUZyb21EVHlwZShcbiAgICAgICAgaW1hZ2UuZHR5cGUgYXMgTnVtZXJpY0RhdGFUeXBlLCB1dGlsLnNpemVGcm9tU2hhcGUoaW1hZ2Uuc2hhcGUpKTtcbiAgICBjb25zdCBbYmF0Y2gsIGltYWdlSGVpZ2h0LCBpbWFnZVdpZHRoLCBudW1DaGFubmVsc10gPSBpbWFnZS5zaGFwZTtcblxuICAgIGNvbnN0IFtjZW50ZXJYLCBjZW50ZXJZXSA9XG4gICAgICAgIGJhY2tlbmRfdXRpbC5nZXRJbWFnZUNlbnRlcihjZW50ZXIsIGltYWdlSGVpZ2h0LCBpbWFnZVdpZHRoKTtcbiAgICBjb25zdCBmdWxsT3BhY2l0eVZhbHVlID0gMjU1O1xuXG4gICAgY29uc3Qgc2luRmFjdG9yID0gTWF0aC5zaW4ocmFkaWFucyk7XG4gICAgY29uc3QgY29zRmFjdG9yID0gTWF0aC5jb3MocmFkaWFucyk7XG4gICAgY29uc3QgaW1hZ2VWYWxzID0gY3B1QmFja2VuZC5kYXRhLmdldChpbWFnZS5kYXRhSWQpLnZhbHVlcyBhcyBUeXBlZEFycmF5O1xuXG4gICAgZm9yIChsZXQgYmF0Y2hJZHggPSAwOyBiYXRjaElkeCA8IGJhdGNoOyBiYXRjaElkeCsrKSB7XG4gICAgICBjb25zdCBiYXRjaE9mZnNldCA9IGJhdGNoSWR4ICogaW1hZ2VXaWR0aCAqIGltYWdlSGVpZ2h0ICogbnVtQ2hhbm5lbHM7XG5cbiAgICAgIGZvciAobGV0IHJvdyA9IDA7IHJvdyA8IGltYWdlSGVpZ2h0OyByb3crKykge1xuICAgICAgICBjb25zdCByb3dPZmZzZXQgPSByb3cgKiAoaW1hZ2VXaWR0aCAqIG51bUNoYW5uZWxzKTtcblxuICAgICAgICBmb3IgKGxldCBjb2wgPSAwOyBjb2wgPCBpbWFnZVdpZHRoOyBjb2wrKykge1xuICAgICAgICAgIGNvbnN0IGNvbE9mZnNldCA9IGNvbCAqIG51bUNoYW5uZWxzO1xuXG4gICAgICAgICAgZm9yIChsZXQgY2hhbm5lbCA9IDA7IGNoYW5uZWwgPCBudW1DaGFubmVsczsgY2hhbm5lbCsrKSB7XG4gICAgICAgICAgICBjb25zdCBjb29yZHMgPSBbYmF0Y2gsIHJvdywgY29sLCBjaGFubmVsXTtcblxuICAgICAgICAgICAgY29uc3QgeCA9IGNvb3Jkc1syXTtcbiAgICAgICAgICAgIGNvbnN0IHkgPSBjb29yZHNbMV07XG5cbiAgICAgICAgICAgIC8vIGNvb3JkWC9jb29yZFkgYXJlIHRoZSByZXN1bHQgb2Ygcm90YXRpbmcgYW5kIHRyYW5zbGF0aW5nIHgveS5cbiAgICAgICAgICAgIGxldCBjb29yZFggPSAoeCAtIGNlbnRlclgpICogY29zRmFjdG9yIC0gKHkgLSBjZW50ZXJZKSAqIHNpbkZhY3RvcjtcbiAgICAgICAgICAgIGxldCBjb29yZFkgPSAoeCAtIGNlbnRlclgpICogc2luRmFjdG9yICsgKHkgLSBjZW50ZXJZKSAqIGNvc0ZhY3RvcjtcbiAgICAgICAgICAgIGNvb3JkWCA9IE1hdGgucm91bmQoY29vcmRYICsgY2VudGVyWCk7XG4gICAgICAgICAgICBjb29yZFkgPSBNYXRoLnJvdW5kKGNvb3JkWSArIGNlbnRlclkpO1xuXG4gICAgICAgICAgICBsZXQgb3V0cHV0VmFsdWUgPSBmaWxsVmFsdWU7XG4gICAgICAgICAgICBpZiAodHlwZW9mIGZpbGxWYWx1ZSAhPT0gJ251bWJlcicpIHtcbiAgICAgICAgICAgICAgaWYgKGNoYW5uZWwgPT09IDMpIHtcbiAgICAgICAgICAgICAgICBvdXRwdXRWYWx1ZSA9IGZ1bGxPcGFjaXR5VmFsdWU7XG4gICAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgb3V0cHV0VmFsdWUgPSBmaWxsVmFsdWVbY2hhbm5lbF07XG4gICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgLy8gSWYgdGhlIGNvb3JkaW5hdGUgcG9zaXRpb24gZmFsbHMgd2l0aGluIHRoZSBpbWFnZSBib3VuZGFyaWVzLi4uXG4gICAgICAgICAgICBpZiAoY29vcmRYID49IDAgJiYgY29vcmRYIDwgaW1hZ2VXaWR0aCAmJiBjb29yZFkgPj0gMCAmJlxuICAgICAgICAgICAgICAgIGNvb3JkWSA8IGltYWdlSGVpZ2h0KSB7XG4gICAgICAgICAgICAgIC8vIHNldCB0aGUgb3V0cHV0IHRvIHRoZSBpbWFnZSB2YWx1ZSBhdCB0aGUgY29vcmRpbmF0ZSBwb3NpdGlvbi5cbiAgICAgICAgICAgICAgY29uc3Qgcm90YXRlZFJvd09mZnNldCA9IGNvb3JkWSAqIChpbWFnZVdpZHRoICogbnVtQ2hhbm5lbHMpO1xuICAgICAgICAgICAgICBjb25zdCByb3RhdGVkQ29sT2Zmc2V0ID0gY29vcmRYICogbnVtQ2hhbm5lbHM7XG4gICAgICAgICAgICAgIGNvbnN0IGltYWdlSWR4ID1cbiAgICAgICAgICAgICAgICAgIGJhdGNoT2Zmc2V0ICsgcm90YXRlZFJvd09mZnNldCArIHJvdGF0ZWRDb2xPZmZzZXQgKyBjaGFubmVsO1xuICAgICAgICAgICAgICBvdXRwdXRWYWx1ZSA9IGltYWdlVmFsc1tpbWFnZUlkeF07XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIGNvbnN0IG91dElkeCA9IGJhdGNoT2Zmc2V0ICsgcm93T2Zmc2V0ICsgY29sT2Zmc2V0ICsgY2hhbm5lbDtcbiAgICAgICAgICAgIG91dHB1dFtvdXRJZHhdID0gb3V0cHV0VmFsdWUgYXMgbnVtYmVyO1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgfVxuICAgIH1cblxuICAgIGNvbnN0IGRhdGFJZCA9IGNwdUJhY2tlbmQud3JpdGUob3V0cHV0LCBpbWFnZS5zaGFwZSwgaW1hZ2UuZHR5cGUpO1xuICAgIHJldHVybiB7ZGF0YUlkLCBzaGFwZTogaW1hZ2Uuc2hhcGUsIGR0eXBlOiBpbWFnZS5kdHlwZX07XG4gIH1cbn07XG4iXX0=","/**\n * @license\n * Copyright 2020 Google LLC. All Rights Reserved.\n * Licensed under the Apache License, Version 2.0 (the License);\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an AS IS BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n * =============================================================================\n */\nimport { Round } from '@tensorflow/tfjs-core';\nimport { unaryKernelFunc } from '../utils/unary_utils';\nexport const round = unaryKernelFunc(Round, (xi) => {\n // The algorithm is based on banker's rounding.\n const base = Math.floor(xi);\n if (xi - base < 0.5) {\n return Math.floor(xi);\n }\n else if (xi - base > 0.5) {\n return Math.ceil(xi);\n }\n else {\n if (base % 2.0 === 0.0) {\n return base;\n }\n else {\n return base + 1.0;\n }\n }\n});\nexport const roundConfig = {\n kernelName: Round,\n backendName: 'cpu',\n kernelFunc: round,\n};\n//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiUm91bmQuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi8uLi90ZmpzLWJhY2tlbmQtY3B1L3NyYy9rZXJuZWxzL1JvdW5kLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBOzs7Ozs7Ozs7Ozs7Ozs7R0FlRztBQUVILE9BQU8sRUFBZSxLQUFLLEVBQUMsTUFBTSx1QkFBdUIsQ0FBQztBQUUxRCxPQUFPLEVBQUMsZUFBZSxFQUFDLE1BQU0sc0JBQXNCLENBQUM7QUFFckQsTUFBTSxDQUFDLE1BQU0sS0FBSyxHQUFHLGVBQWUsQ0FBQyxLQUFLLEVBQUUsQ0FBQyxFQUFFLEVBQUUsRUFBRTtJQUNqRCwrQ0FBK0M7SUFDL0MsTUFBTSxJQUFJLEdBQUcsSUFBSSxDQUFDLEtBQUssQ0FBQyxFQUFFLENBQUMsQ0FBQztJQUM1QixJQUFJLEVBQUUsR0FBRyxJQUFJLEdBQUcsR0FBRyxFQUFFO1FBQ25CLE9BQU8sSUFBSSxDQUFDLEtBQUssQ0FBQyxFQUFFLENBQUMsQ0FBQztLQUN2QjtTQUFNLElBQUksRUFBRSxHQUFHLElBQUksR0FBRyxHQUFHLEVBQUU7UUFDMUIsT0FBTyxJQUFJLENBQUMsSUFBSSxDQUFDLEVBQUUsQ0FBQyxDQUFDO0tBQ3RCO1NBQU07UUFDTCxJQUFJLElBQUksR0FBRyxHQUFHLEtBQUssR0FBRyxFQUFFO1lBQ3RCLE9BQU8sSUFBSSxDQUFDO1NBQ2I7YUFBTTtZQUNMLE9BQU8sSUFBSSxHQUFHLEdBQUcsQ0FBQztTQUNuQjtLQUNGO0FBQ0gsQ0FBQyxDQUFDLENBQUM7QUFFSCxNQUFNLENBQUMsTUFBTSxXQUFXLEdBQWlCO0lBQ3ZDLFVBQVUsRUFBRSxLQUFLO0lBQ2pCLFdBQVcsRUFBRSxLQUFLO0lBQ2xCLFVBQVUsRUFBRSxLQUFLO0NBQ2xCLENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyIvKipcbiAqIEBsaWNlbnNlXG4gKiBDb3B5cmlnaHQgMjAyMCBHb29nbGUgTExDLiBBbGwgUmlnaHRzIFJlc2VydmVkLlxuICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlIExpY2Vuc2UpO1xuICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLlxuICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0XG4gKlxuICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wXG4gKlxuICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZVxuICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gQVMgSVMgQkFTSVMsXG4gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC5cbiAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmRcbiAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLlxuICogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbiAqL1xuXG5pbXBvcnQge0tlcm5lbENvbmZpZywgUm91bmR9IGZyb20gJ0B0ZW5zb3JmbG93L3RmanMtY29yZSc7XG5cbmltcG9ydCB7dW5hcnlLZXJuZWxGdW5jfSBmcm9tICcuLi91dGlscy91bmFyeV91dGlscyc7XG5cbmV4cG9ydCBjb25zdCByb3VuZCA9IHVuYXJ5S2VybmVsRnVuYyhSb3VuZCwgKHhpKSA9PiB7XG4gIC8vIFRoZSBhbGdvcml0aG0gaXMgYmFzZWQgb24gYmFua2VyJ3Mgcm91bmRpbmcuXG4gIGNvbnN0IGJhc2UgPSBNYXRoLmZsb29yKHhpKTtcbiAgaWYgKHhpIC0gYmFzZSA8IDAuNSkge1xuICAgIHJldHVybiBNYXRoLmZsb29yKHhpKTtcbiAgfSBlbHNlIGlmICh4aSAtIGJhc2UgPiAwLjUpIHtcbiAgICByZXR1cm4gTWF0aC5jZWlsKHhpKTtcbiAgfSBlbHNlIHtcbiAgICBpZiAoYmFzZSAlIDIuMCA9PT0gMC4wKSB7XG4gICAgICByZXR1cm4gYmFzZTtcbiAgICB9IGVsc2Uge1xuICAgICAgcmV0dXJuIGJhc2UgKyAxLjA7XG4gICAgfVxuICB9XG59KTtcblxuZXhwb3J0IGNvbnN0IHJvdW5kQ29uZmlnOiBLZXJuZWxDb25maWcgPSB7XG4gIGtlcm5lbE5hbWU6IFJvdW5kLFxuICBiYWNrZW5kTmFtZTogJ2NwdScsXG4gIGtlcm5lbEZ1bmM6IHJvdW5kLFxufTtcbiJdfQ==","/**\n * @license\n * Copyright 2020 Google LLC. All Rights Reserved.\n * Licensed under the Apache License, Version 2.0 (the License);\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an AS IS BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n * =============================================================================\n */\nimport { Rsqrt } from '@tensorflow/tfjs-core';\nimport { createSimpleUnaryImpl } from '../utils/unary_impl';\nimport { unaryKernelFuncFromImpl } from '../utils/unary_utils';\nexport const rsqrtImpl = createSimpleUnaryImpl((xi) => 1 / Math.sqrt(xi));\nexport const rsqrt = unaryKernelFuncFromImpl(Rsqrt, rsqrtImpl);\nexport const rsqrtConfig = {\n kernelName: Rsqrt,\n backendName: 'cpu',\n kernelFunc: rsqrt,\n};\n//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiUnNxcnQuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi8uLi90ZmpzLWJhY2tlbmQtY3B1L3NyYy9rZXJuZWxzL1JzcXJ0LnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBOzs7Ozs7Ozs7Ozs7Ozs7R0FlRztBQUVILE9BQU8sRUFBZSxLQUFLLEVBQUMsTUFBTSx1QkFBdUIsQ0FBQztBQUUxRCxPQUFPLEVBQUMscUJBQXFCLEVBQUMsTUFBTSxxQkFBcUIsQ0FBQztBQUMxRCxPQUFPLEVBQUMsdUJBQXVCLEVBQUMsTUFBTSxzQkFBc0IsQ0FBQztBQUU3RCxNQUFNLENBQUMsTUFBTSxTQUFTLEdBQUcscUJBQXFCLENBQUMsQ0FBQyxFQUFFLEVBQUUsRUFBRSxDQUFDLENBQUMsR0FBRyxJQUFJLENBQUMsSUFBSSxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUM7QUFDMUUsTUFBTSxDQUFDLE1BQU0sS0FBSyxHQUFHLHVCQUF1QixDQUFDLEtBQUssRUFBRSxTQUFTLENBQUMsQ0FBQztBQUUvRCxNQUFNLENBQUMsTUFBTSxXQUFXLEdBQWlCO0lBQ3ZDLFVBQVUsRUFBRSxLQUFLO0lBQ2pCLFdBQVcsRUFBRSxLQUFLO0lBQ2xCLFVBQVUsRUFBRSxLQUFLO0NBQ2xCLENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyIvKipcbiAqIEBsaWNlbnNlXG4gKiBDb3B5cmlnaHQgMjAyMCBHb29nbGUgTExDLiBBbGwgUmlnaHRzIFJlc2VydmVkLlxuICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlIExpY2Vuc2UpO1xuICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLlxuICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0XG4gKlxuICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wXG4gKlxuICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZVxuICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gQVMgSVMgQkFTSVMsXG4gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC5cbiAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmRcbiAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLlxuICogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbiAqL1xuXG5pbXBvcnQge0tlcm5lbENvbmZpZywgUnNxcnR9IGZyb20gJ0B0ZW5zb3JmbG93L3RmanMtY29yZSc7XG5cbmltcG9ydCB7Y3JlYXRlU2ltcGxlVW5hcnlJbXBsfSBmcm9tICcuLi91dGlscy91bmFyeV9pbXBsJztcbmltcG9ydCB7dW5hcnlLZXJuZWxGdW5jRnJvbUltcGx9IGZyb20gJy4uL3V0aWxzL3VuYXJ5X3V0aWxzJztcblxuZXhwb3J0IGNvbnN0IHJzcXJ0SW1wbCA9IGNyZWF0ZVNpbXBsZVVuYXJ5SW1wbCgoeGkpID0+IDEgLyBNYXRoLnNxcnQoeGkpKTtcbmV4cG9ydCBjb25zdCByc3FydCA9IHVuYXJ5S2VybmVsRnVuY0Zyb21JbXBsKFJzcXJ0LCByc3FydEltcGwpO1xuXG5leHBvcnQgY29uc3QgcnNxcnRDb25maWc6IEtlcm5lbENvbmZpZyA9IHtcbiAga2VybmVsTmFtZTogUnNxcnQsXG4gIGJhY2tlbmROYW1lOiAnY3B1JyxcbiAga2VybmVsRnVuYzogcnNxcnQsXG59O1xuIl19","/**\n * @license\n * Copyright 2020 Google LLC. All Rights Reserved.\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n * =============================================================================\n */\nimport { buffer } from '@tensorflow/tfjs-core';\nexport function scatterImpl(indices, updates, shape, outputSize, sliceSize, numUpdates, sliceRank, strides, defaultValue, sumDupeIndices) {\n const flattenShape = [outputSize / sliceSize, sliceSize];\n const indicesData = indices.values;\n const updatesData = updates.values;\n if (outputSize === 0) {\n return buffer(shape, updates.dtype);\n }\n const outBuf = buffer(flattenShape, updates.dtype);\n if (typeof defaultValue === 'string') {\n outBuf.values.fill(defaultValue);\n }\n else if (typeof defaultValue === 'number') {\n outBuf.values.fill(defaultValue);\n }\n else if (typeof defaultValue === 'boolean') {\n outBuf.values.fill(+defaultValue);\n }\n for (let i = 0; i < numUpdates; i++) {\n const index = [];\n let flattenIndex = 0;\n for (let j = 0; j < sliceRank; j++) {\n const dim = indicesData[i * sliceRank + j];\n index.push(dim);\n flattenIndex += dim * strides[j];\n }\n if (flattenIndex < 0 || flattenIndex >= outputSize / sliceSize) {\n throw new Error(`Invalid indices: ${index} does not index into ${shape}`);\n }\n for (let k = 0; k < sliceSize; k++) {\n if (sumDupeIndices) {\n outBuf.values[flattenIndex * sliceSize + k] +=\n updatesData[i * sliceSize + k];\n }\n else {\n outBuf.values[flattenIndex * sliceSize + k] = updates.rank === 0 ?\n updatesData[0] :\n updatesData[i * sliceSize + k];\n }\n }\n }\n return outBuf;\n}\n//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiU2NhdHRlcl9pbXBsLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vLi4vdGZqcy1iYWNrZW5kLWNwdS9zcmMva2VybmVscy9TY2F0dGVyX2ltcGwudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUE7Ozs7Ozs7Ozs7Ozs7OztHQWVHO0FBQ0gsT0FBTyxFQUFDLE1BQU0sRUFBMkMsTUFBTSx1QkFBdUIsQ0FBQztBQVN2RixNQUFNLFVBQ04sV0FBVyxDQUNQLE9BQWlDLEVBQUUsT0FBMkIsRUFDOUQsS0FBZSxFQUFFLFVBQWtCLEVBQUUsU0FBaUIsRUFBRSxVQUFrQixFQUMxRSxTQUFpQixFQUFFLE9BQWlCLEVBQUUsWUFBb0MsRUFDMUUsY0FBdUI7SUFDekIsTUFBTSxZQUFZLEdBQUcsQ0FBQyxVQUFVLEdBQUcsU0FBUyxFQUFFLFNBQVMsQ0FBQyxDQUFDO0lBRXpELE1BQU0sV0FBVyxHQUFHLE9BQU8sQ0FBQyxNQUFvQixDQUFDO0lBQ2pELE1BQU0sV0FBVyxHQUFHLE9BQU8sQ0FBQyxNQUFNLENBQUM7SUFFbkMsSUFBSSxVQUFVLEtBQUssQ0FBQyxFQUFFO1FBQ3BCLE9BQU8sTUFBTSxDQUFDLEtBQW9CLEVBQUUsT0FBTyxDQUFDLEtBQUssQ0FBQyxDQUFDO0tBQ3BEO0lBRUQsTUFBTSxNQUFNLEdBQUcsTUFBTSxDQUFDLFlBQVksRUFBRSxPQUFPLENBQUMsS0FBSyxDQUFDLENBQUM7SUFDbkQsSUFBSSxPQUFPLFlBQVksS0FBSyxRQUFRLEVBQUU7UUFDbkMsTUFBTSxDQUFDLE1BQW1CLENBQUMsSUFBSSxDQUFDLFlBQVksQ0FBQyxDQUFDO0tBQ2hEO1NBQU0sSUFBSSxPQUFPLFlBQVksS0FBSyxRQUFRLEVBQUU7UUFDMUMsTUFBTSxDQUFDLE1BQXFCLENBQUMsSUFBSSxDQUFDLFlBQVksQ0FBQyxDQUFDO0tBQ2xEO1NBQU0sSUFBSSxPQUFPLFlBQVksS0FBSyxTQUFTLEVBQUU7UUFDM0MsTUFBTSxDQUFDLE1BQXFCLENBQUMsSUFBSSxDQUFDLENBQUMsWUFBWSxDQUFDLENBQUM7S0FDbkQ7SUFFRCxLQUFLLElBQUksQ0FBQyxHQUFHLENBQUMsRUFBRSxDQUFDLEdBQUcsVUFBVSxFQUFFLENBQUMsRUFBRSxFQUFFO1FBQ25DLE1BQU0sS0FBSyxHQUFHLEVBQUUsQ0FBQztRQUNqQixJQUFJLFlBQVksR0FBRyxDQUFDLENBQUM7UUFDckIsS0FBSyxJQUFJLENBQUMsR0FBRyxDQUFDLEVBQUUsQ0FBQyxHQUFHLFNBQVMsRUFBRSxDQUFDLEVBQUUsRUFBRTtZQUNsQyxNQUFNLEdBQUcsR0FBRyxXQUFXLENBQUMsQ0FBQyxHQUFHLFNBQVMsR0FBRyxDQUFDLENBQUMsQ0FBQztZQUMzQyxLQUFLLENBQUMsSUFBSSxDQUFDLEdBQUcsQ0FBQyxDQUFDO1lBQ2hCLFlBQVksSUFBSSxHQUFHLEdBQUcsT0FBTyxDQUFDLENBQUMsQ0FBQyxDQUFDO1NBQ2xDO1FBRUQsSUFBSSxZQUFZLEdBQUcsQ0FBQyxJQUFJLFlBQVksSUFBSSxVQUFVLEdBQUcsU0FBUyxFQUFFO1lBQzlELE1BQU0sSUFBSSxLQUFLLENBQUMsb0JBQW9CLEtBQUssd0JBQXdCLEtBQUssRUFBRSxDQUFDLENBQUM7U0FDM0U7UUFFRCxLQUFLLElBQUksQ0FBQyxHQUFHLENBQUMsRUFBRSxDQUFDLEdBQUcsU0FBUyxFQUFFLENBQUMsRUFBRSxFQUFFO1lBQ2xDLElBQUksY0FBYyxFQUFFO2dCQUNqQixNQUFNLENBQUMsTUFBcUIsQ0FBQyxZQUFZLEdBQUcsU0FBUyxHQUFHLENBQUMsQ0FBQztvQkFDdEQsV0FBMEIsQ0FBQyxDQUFDLEdBQUcsU0FBUyxHQUFHLENBQUMsQ0FBQyxDQUFDO2FBQ3BEO2lCQUFNO2dCQUNMLE1BQU0sQ0FBQyxNQUFNLENBQUMsWUFBWSxHQUFHLFNBQVMsR0FBRyxDQUFDLENBQUMsR0FBRyxPQUFPLENBQUMsSUFBSSxLQUFLLENBQUMsQ0FBQyxDQUFDO29CQUM5RCxXQUFXLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQztvQkFDaEIsV0FBVyxDQUFDLENBQUMsR0FBRyxTQUFTLEdBQUcsQ0FBQyxDQUFDLENBQUM7YUFDcEM7U0FDRjtLQUNGO0lBRUQsT0FBTyxNQUE0QixDQUFDO0FBQ3RDLENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyIvKipcbiAqIEBsaWNlbnNlXG4gKiBDb3B5cmlnaHQgMjAyMCBHb29nbGUgTExDLiBBbGwgUmlnaHRzIFJlc2VydmVkLlxuICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlIFwiTGljZW5zZVwiKTtcbiAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS5cbiAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdFxuICpcbiAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMFxuICpcbiAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmVcbiAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuIFwiQVMgSVNcIiBCQVNJUyxcbiAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLlxuICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZFxuICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuXG4gKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuICovXG5pbXBvcnQge2J1ZmZlciwgUmFuaywgU2hhcGVNYXAsIFRlbnNvckJ1ZmZlciwgVHlwZWRBcnJheX0gZnJvbSAnQHRlbnNvcmZsb3cvdGZqcy1jb3JlJztcblxuaW50ZXJmYWNlIERlZmF1bHRWYWx1ZVR5cGVNYXAge1xuICBib29sOiBib29sZWFuO1xuICBpbnQzMjogbnVtYmVyO1xuICBmbG9hdDMyOiBudW1iZXI7XG4gIHN0cmluZzogc3RyaW5nO1xufVxuXG5leHBvcnQgZnVuY3Rpb25cbnNjYXR0ZXJJbXBsPFIgZXh0ZW5kcyBSYW5rLCBEIGV4dGVuZHMgJ2Zsb2F0MzInfCdpbnQzMid8J2Jvb2wnfCdzdHJpbmcnPihcbiAgICBpbmRpY2VzOiBUZW5zb3JCdWZmZXI8UiwgJ2ludDMyJz4sIHVwZGF0ZXM6IFRlbnNvckJ1ZmZlcjxSLCBEPixcbiAgICBzaGFwZTogbnVtYmVyW10sIG91dHB1dFNpemU6IG51bWJlciwgc2xpY2VTaXplOiBudW1iZXIsIG51bVVwZGF0ZXM6IG51bWJlcixcbiAgICBzbGljZVJhbms6IG51bWJlciwgc3RyaWRlczogbnVtYmVyW10sIGRlZmF1bHRWYWx1ZTogRGVmYXVsdFZhbHVlVHlwZU1hcFtEXSxcbiAgICBzdW1EdXBlSW5kaWNlczogYm9vbGVhbik6IFRlbnNvckJ1ZmZlcjxSLCBEPiB7XG4gIGNvbnN0IGZsYXR0ZW5TaGFwZSA9IFtvdXRwdXRTaXplIC8gc2xpY2VTaXplLCBzbGljZVNpemVdO1xuXG4gIGNvbnN0IGluZGljZXNEYXRhID0gaW5kaWNlcy52YWx1ZXMgYXMgVHlwZWRBcnJheTtcbiAgY29uc3QgdXBkYXRlc0RhdGEgPSB1cGRhdGVzLnZhbHVlcztcblxuICBpZiAob3V0cHV0U2l6ZSA9PT0gMCkge1xuICAgIHJldHVybiBidWZmZXIoc2hhcGUgYXMgU2hhcGVNYXBbUl0sIHVwZGF0ZXMuZHR5cGUpO1xuICB9XG5cbiAgY29uc3Qgb3V0QnVmID0gYnVmZmVyKGZsYXR0ZW5TaGFwZSwgdXBkYXRlcy5kdHlwZSk7XG4gIGlmICh0eXBlb2YgZGVmYXVsdFZhbHVlID09PSAnc3RyaW5nJykge1xuICAgIChvdXRCdWYudmFsdWVzIGFzIHN0cmluZ1tdKS5maWxsKGRlZmF1bHRWYWx1ZSk7XG4gIH0gZWxzZSBpZiAodHlwZW9mIGRlZmF1bHRWYWx1ZSA9PT0gJ251bWJlcicpIHtcbiAgICAob3V0QnVmLnZhbHVlcyBhcyBUeXBlZEFycmF5KS5maWxsKGRlZmF1bHRWYWx1ZSk7XG4gIH0gZWxzZSBpZiAodHlwZW9mIGRlZmF1bHRWYWx1ZSA9PT0gJ2Jvb2xlYW4nKSB7XG4gICAgKG91dEJ1Zi52YWx1ZXMgYXMgVHlwZWRBcnJheSkuZmlsbCgrZGVmYXVsdFZhbHVlKTtcbiAgfVxuXG4gIGZvciAobGV0IGkgPSAwOyBpIDwgbnVtVXBkYXRlczsgaSsrKSB7XG4gICAgY29uc3QgaW5kZXggPSBbXTtcbiAgICBsZXQgZmxhdHRlbkluZGV4ID0gMDtcbiAgICBmb3IgKGxldCBqID0gMDsgaiA8IHNsaWNlUmFuazsgaisrKSB7XG4gICAgICBjb25zdCBkaW0gPSBpbmRpY2VzRGF0YVtpICogc2xpY2VSYW5rICsgal07XG4gICAgICBpbmRleC5wdXNoKGRpbSk7XG4gICAgICBmbGF0dGVuSW5kZXggKz0gZGltICogc3RyaWRlc1tqXTtcbiAgICB9XG5cbiAgICBpZiAoZmxhdHRlbkluZGV4IDwgMCB8fCBmbGF0dGVuSW5kZXggPj0gb3V0cHV0U2l6ZSAvIHNsaWNlU2l6ZSkge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKGBJbnZhbGlkIGluZGljZXM6ICR7aW5kZXh9IGRvZXMgbm90IGluZGV4IGludG8gJHtzaGFwZX1gKTtcbiAgICB9XG5cbiAgICBmb3IgKGxldCBrID0gMDsgayA8IHNsaWNlU2l6ZTsgaysrKSB7XG4gICAgICBpZiAoc3VtRHVwZUluZGljZXMpIHtcbiAgICAgICAgKG91dEJ1Zi52YWx1ZXMgYXMgVHlwZWRBcnJheSlbZmxhdHRlbkluZGV4ICogc2xpY2VTaXplICsga10gKz1cbiAgICAgICAgICAgICh1cGRhdGVzRGF0YSBhcyBUeXBlZEFycmF5KVtpICogc2xpY2VTaXplICsga107XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBvdXRCdWYudmFsdWVzW2ZsYXR0ZW5JbmRleCAqIHNsaWNlU2l6ZSArIGtdID0gdXBkYXRlcy5yYW5rID09PSAwID9cbiAgICAgICAgICAgIHVwZGF0ZXNEYXRhWzBdIDpcbiAgICAgICAgICAgIHVwZGF0ZXNEYXRhW2kgKiBzbGljZVNpemUgKyBrXTtcbiAgICAgIH1cbiAgICB9XG4gIH1cblxuICByZXR1cm4gb3V0QnVmIGFzIFRlbnNvckJ1ZmZlcjxSLCBEPjtcbn1cbiJdfQ==","/**\n * @license\n * Copyright 2020 Google LLC. All Rights Reserved.\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n * =============================================================================\n */\nimport { backend_util, ScatterNd } from '@tensorflow/tfjs-core';\nimport { scatterImpl } from './Scatter_impl';\nexport function scatterNd(args) {\n const { inputs, backend, attrs } = args;\n const { indices, updates } = inputs;\n const { shape } = attrs;\n const { sliceRank, numUpdates, sliceSize, strides, outputSize } = backend_util.calculateShapes(updates, indices, shape);\n const sumDupeIndices = true;\n const indicesBuf = backend.bufferSync(indices);\n const updatesBuf = backend.bufferSync(updates);\n const outBuf = scatterImpl(indicesBuf, updatesBuf, shape, outputSize, sliceSize, numUpdates, sliceRank, strides, 0 /* defaultValue */, sumDupeIndices);\n return backend.makeTensorInfo(shape, outBuf.dtype, outBuf.values);\n}\nexport const scatterNdConfig = {\n kernelName: ScatterNd,\n backendName: 'cpu',\n kernelFunc: scatterNd\n};\n//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiU2NhdHRlck5kLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vLi4vdGZqcy1iYWNrZW5kLWNwdS9zcmMva2VybmVscy9TY2F0dGVyTmQudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUE7Ozs7Ozs7Ozs7Ozs7OztHQWVHO0FBRUgsT0FBTyxFQUFDLFlBQVksRUFBa0MsU0FBUyxFQUE4QyxNQUFNLHVCQUF1QixDQUFDO0FBRzNJLE9BQU8sRUFBQyxXQUFXLEVBQUMsTUFBTSxnQkFBZ0IsQ0FBQztBQUUzQyxNQUFNLFVBQVUsU0FBUyxDQUFDLElBSXpCO0lBQ0MsTUFBTSxFQUFDLE1BQU0sRUFBRSxPQUFPLEVBQUUsS0FBSyxFQUFDLEdBQUcsSUFBSSxDQUFDO0lBQ3RDLE1BQU0sRUFBQyxPQUFPLEVBQUUsT0FBTyxFQUFDLEdBQUcsTUFBTSxDQUFDO0lBQ2xDLE1BQU0sRUFBQyxLQUFLLEVBQUMsR0FBRyxLQUFLLENBQUM7SUFFdEIsTUFBTSxFQUFDLFNBQVMsRUFBRSxVQUFVLEVBQUUsU0FBUyxFQUFFLE9BQU8sRUFBRSxVQUFVLEVBQUMsR0FDekQsWUFBWSxDQUFDLGVBQWUsQ0FBQyxPQUFPLEVBQUUsT0FBTyxFQUFFLEtBQUssQ0FBQyxDQUFDO0lBQzFELE1BQU0sY0FBYyxHQUFHLElBQUksQ0FBQztJQUU1QixNQUFNLFVBQVUsR0FBRyxPQUFPLENBQUMsVUFBVSxDQUFnQixPQUFPLENBQUMsQ0FBQztJQUM5RCxNQUFNLFVBQVUsR0FBRyxPQUFPLENBQUMsVUFBVSxDQUEwQixPQUFPLENBQUMsQ0FBQztJQUV4RSxNQUFNLE1BQU0sR0FBRyxXQUFXLENBQ3RCLFVBQVUsRUFBRSxVQUFVLEVBQUUsS0FBSyxFQUFFLFVBQVUsRUFBRSxTQUFTLEVBQUUsVUFBVSxFQUNoRSxTQUFTLEVBQUUsT0FBTyxFQUFFLENBQUMsQ0FBQyxrQkFBa0IsRUFBRSxjQUFjLENBQUMsQ0FBQztJQUU5RCxPQUFPLE9BQU8sQ0FBQyxjQUFjLENBQUMsS0FBSyxFQUFFLE1BQU0sQ0FBQyxLQUFLLEVBQUUsTUFBTSxDQUFDLE1BQU0sQ0FBQyxDQUFDO0FBQ3BFLENBQUM7QUFFRCxNQUFNLENBQUMsTUFBTSxlQUFlLEdBQWlCO0lBQzNDLFVBQVUsRUFBRSxTQUFTO0lBQ3JCLFdBQVcsRUFBRSxLQUFLO0lBQ2xCLFVBQVUsRUFBRSxTQUE2QjtDQUMxQyxDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiLyoqXG4gKiBAbGljZW5zZVxuICogQ29weXJpZ2h0IDIwMjAgR29vZ2xlIExMQy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC5cbiAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSBcIkxpY2Vuc2VcIik7XG4gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuXG4gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXRcbiAqXG4gKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjBcbiAqXG4gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlXG4gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiBcIkFTIElTXCIgQkFTSVMsXG4gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC5cbiAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmRcbiAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLlxuICogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbiAqL1xuXG5pbXBvcnQge2JhY2tlbmRfdXRpbCwgS2VybmVsQ29uZmlnLCBLZXJuZWxGdW5jLCBSYW5rLCBTY2F0dGVyTmQsIFNjYXR0ZXJOZEF0dHJzLCBTY2F0dGVyTmRJbnB1dHMsIFRlbnNvckluZm99IGZyb20gJ0B0ZW5zb3JmbG93L3RmanMtY29yZSc7XG5cbmltcG9ydCB7TWF0aEJhY2tlbmRDUFV9IGZyb20gJy4uL2JhY2tlbmRfY3B1JztcbmltcG9ydCB7c2NhdHRlckltcGx9IGZyb20gJy4vU2NhdHRlcl9pbXBsJztcblxuZXhwb3J0IGZ1bmN0aW9uIHNjYXR0ZXJOZChhcmdzOiB7XG4gIGlucHV0czogU2NhdHRlck5kSW5wdXRzLFxuICBiYWNrZW5kOiBNYXRoQmFja2VuZENQVSxcbiAgYXR0cnM6IFNjYXR0ZXJOZEF0dHJzXG59KTogVGVuc29ySW5mbyB7XG4gIGNvbnN0IHtpbnB1dHMsIGJhY2tlbmQsIGF0dHJzfSA9IGFyZ3M7XG4gIGNvbnN0IHtpbmRpY2VzLCB1cGRhdGVzfSA9IGlucHV0cztcbiAgY29uc3Qge3NoYXBlfSA9IGF0dHJzO1xuXG4gIGNvbnN0IHtzbGljZVJhbmssIG51bVVwZGF0ZXMsIHNsaWNlU2l6ZSwgc3RyaWRlcywgb3V0cHV0U2l6ZX0gPVxuICAgICAgYmFja2VuZF91dGlsLmNhbGN1bGF0ZVNoYXBlcyh1cGRhdGVzLCBpbmRpY2VzLCBzaGFwZSk7XG4gIGNvbnN0IHN1bUR1cGVJbmRpY2VzID0gdHJ1ZTtcblxuICBjb25zdCBpbmRpY2VzQnVmID0gYmFja2VuZC5idWZmZXJTeW5jPFJhbmssICdpbnQzMic+KGluZGljZXMpO1xuICBjb25zdCB1cGRhdGVzQnVmID0gYmFja2VuZC5idWZmZXJTeW5jPFJhbmssICdpbnQzMid8J2Zsb2F0MzInPih1cGRhdGVzKTtcblxuICBjb25zdCBvdXRCdWYgPSBzY2F0dGVySW1wbChcbiAgICAgIGluZGljZXNCdWYsIHVwZGF0ZXNCdWYsIHNoYXBlLCBvdXRwdXRTaXplLCBzbGljZVNpemUsIG51bVVwZGF0ZXMsXG4gICAgICBzbGljZVJhbmssIHN0cmlkZXMsIDAgLyogZGVmYXVsdFZhbHVlICovLCBzdW1EdXBlSW5kaWNlcyk7XG5cbiAgcmV0dXJuIGJhY2tlbmQubWFrZVRlbnNvckluZm8oc2hhcGUsIG91dEJ1Zi5kdHlwZSwgb3V0QnVmLnZhbHVlcyk7XG59XG5cbmV4cG9ydCBjb25zdCBzY2F0dGVyTmRDb25maWc6IEtlcm5lbENvbmZpZyA9IHtcbiAga2VybmVsTmFtZTogU2NhdHRlck5kLFxuICBiYWNrZW5kTmFtZTogJ2NwdScsXG4gIGtlcm5lbEZ1bmM6IHNjYXR0ZXJOZCBhcyB7fSBhcyBLZXJuZWxGdW5jXG59O1xuIl19","/**\n * @license\n * Copyright 2022 Google LLC. All Rights Reserved.\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n * =============================================================================\n */\nimport { util } from '@tensorflow/tfjs-core';\nfunction lowerBound(array, value) {\n let left = 0;\n let right = array.length;\n let mid = 0;\n while (left < right) {\n mid = Math.floor((left + right) / 2);\n if (array[mid] < value) {\n left = mid + 1;\n }\n else {\n right = mid;\n }\n }\n return right;\n}\nfunction upperBound(array, value) {\n let left = 0;\n let right = array.length;\n let mid = 0;\n while (left < right) {\n mid = Math.floor((left + right) / 2);\n if (array[mid] <= value) {\n left = mid + 1;\n }\n else {\n right = mid;\n }\n }\n return right;\n}\nexport function searchSortedImpl(sortedInputs, values, batchSize, numInputs, numValues, side) {\n const output = util.getArrayFromDType('int32', batchSize * numValues);\n for (let b = 0; b < batchSize; ++b) {\n const sortedInputsSlice = sortedInputs.slice(b * numInputs, (b + 1) * numInputs);\n const outputOffset = b * numValues;\n for (let i = 0; i < numValues; ++i) {\n output[outputOffset + i] = side === 'left' ?\n lowerBound(sortedInputsSlice, values[i + outputOffset]) :\n upperBound(sortedInputsSlice, values[i + outputOffset]);\n }\n }\n return output;\n}\n//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiU2VhcmNoU29ydGVkX2ltcGwuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi8uLi90ZmpzLWJhY2tlbmQtY3B1L3NyYy9rZXJuZWxzL1NlYXJjaFNvcnRlZF9pbXBsLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBOzs7Ozs7Ozs7Ozs7Ozs7R0FlRztBQUVILE9BQU8sRUFBYSxJQUFJLEVBQUMsTUFBTSx1QkFBdUIsQ0FBQztBQUV2RCxTQUFTLFVBQVUsQ0FBQyxLQUFpQixFQUFFLEtBQWE7SUFDbEQsSUFBSSxJQUFJLEdBQUcsQ0FBQyxDQUFDO0lBQ2IsSUFBSSxLQUFLLEdBQUcsS0FBSyxDQUFDLE1BQU0sQ0FBQztJQUN6QixJQUFJLEdBQUcsR0FBRyxDQUFDLENBQUM7SUFDWixPQUFPLElBQUksR0FBRyxLQUFLLEVBQUU7UUFDbkIsR0FBRyxHQUFHLElBQUksQ0FBQyxLQUFLLENBQUMsQ0FBQyxJQUFJLEdBQUcsS0FBSyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUM7UUFDckMsSUFBSSxLQUFLLENBQUMsR0FBRyxDQUFDLEdBQUcsS0FBSyxFQUFFO1lBQ3RCLElBQUksR0FBRyxHQUFHLEdBQUcsQ0FBQyxDQUFDO1NBQ2hCO2FBQU07WUFDTCxLQUFLLEdBQUcsR0FBRyxDQUFDO1NBQ2I7S0FDRjtJQUNELE9BQU8sS0FBSyxDQUFDO0FBQ2YsQ0FBQztBQUVELFNBQVMsVUFBVSxDQUFDLEtBQWlCLEVBQUUsS0FBYTtJQUNsRCxJQUFJLElBQUksR0FBRyxDQUFDLENBQUM7SUFDYixJQUFJLEtBQUssR0FBRyxLQUFLLENBQUMsTUFBTSxDQUFDO0lBQ3pCLElBQUksR0FBRyxHQUFHLENBQUMsQ0FBQztJQUNaLE9BQU8sSUFBSSxHQUFHLEtBQUssRUFBRTtRQUNuQixHQUFHLEdBQUcsSUFBSSxDQUFDLEtBQUssQ0FBQyxDQUFDLElBQUksR0FBRyxLQUFLLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQztRQUNyQyxJQUFJLEtBQUssQ0FBQyxHQUFHLENBQUMsSUFBSSxLQUFLLEVBQUU7WUFDdkIsSUFBSSxHQUFHLEdBQUcsR0FBRyxDQUFDLENBQUM7U0FDaEI7YUFBTTtZQUNMLEtBQUssR0FBRyxHQUFHLENBQUM7U0FDYjtLQUNGO0lBQ0QsT0FBTyxLQUFLLENBQUM7QUFDZixDQUFDO0FBRUQsTUFBTSxVQUFVLGdCQUFnQixDQUM1QixZQUF3QixFQUFFLE1BQWtCLEVBQUUsU0FBaUIsRUFDL0QsU0FBaUIsRUFBRSxTQUFpQixFQUFFLElBQW9CO0lBQzVELE1BQU0sTUFBTSxHQUNSLElBQUksQ0FBQyxpQkFBaUIsQ0FBQyxPQUFPLEVBQUUsU0FBUyxHQUFHLFNBQVMsQ0FBZSxDQUFDO0lBQ3pFLEtBQUssSUFBSSxDQUFDLEdBQUcsQ0FBQyxFQUFFLENBQUMsR0FBRyxTQUFTLEVBQUUsRUFBRSxDQUFDLEVBQUU7UUFDbEMsTUFBTSxpQkFBaUIsR0FDbkIsWUFBWSxDQUFDLEtBQUssQ0FBQyxDQUFDLEdBQUcsU0FBUyxFQUFFLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxHQUFHLFNBQVMsQ0FBQyxDQUFDO1FBQzNELE1BQU0sWUFBWSxHQUFHLENBQUMsR0FBRyxTQUFTLENBQUM7UUFDbkMsS0FBSyxJQUFJLENBQUMsR0FBRyxDQUFDLEVBQUUsQ0FBQyxHQUFHLFNBQVMsRUFBRSxFQUFFLENBQUMsRUFBRTtZQUNsQyxNQUFNLENBQUMsWUFBWSxHQUFHLENBQUMsQ0FBQyxHQUFHLElBQUksS0FBSyxNQUFNLENBQUMsQ0FBQztnQkFDeEMsVUFBVSxDQUFDLGlCQUFpQixFQUFFLE1BQU0sQ0FBQyxDQUFDLEdBQUcsWUFBWSxDQUFDLENBQUMsQ0FBQyxDQUFDO2dCQUN6RCxVQUFVLENBQUMsaUJBQWlCLEVBQUUsTUFBTSxDQUFDLENBQUMsR0FBRyxZQUFZLENBQUMsQ0FBQyxDQUFDO1NBQzdEO0tBQ0Y7SUFDRCxPQUFPLE1BQU0sQ0FBQztBQUNoQixDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiLyoqXG4gKiBAbGljZW5zZVxuICogQ29weXJpZ2h0IDIwMjIgR29vZ2xlIExMQy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC5cbiAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSBcIkxpY2Vuc2VcIik7XG4gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuXG4gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXRcbiAqXG4gKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjBcbiAqXG4gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlXG4gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiBcIkFTIElTXCIgQkFTSVMsXG4gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC5cbiAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmRcbiAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLlxuICogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbiAqL1xuXG5pbXBvcnQge1R5cGVkQXJyYXksIHV0aWx9IGZyb20gJ0B0ZW5zb3JmbG93L3RmanMtY29yZSc7XG5cbmZ1bmN0aW9uIGxvd2VyQm91bmQoYXJyYXk6IFR5cGVkQXJyYXksIHZhbHVlOiBudW1iZXIpIHtcbiAgbGV0IGxlZnQgPSAwO1xuICBsZXQgcmlnaHQgPSBhcnJheS5sZW5ndGg7XG4gIGxldCBtaWQgPSAwO1xuICB3aGlsZSAobGVmdCA8IHJpZ2h0KSB7XG4gICAgbWlkID0gTWF0aC5mbG9vcigobGVmdCArIHJpZ2h0KSAvIDIpO1xuICAgIGlmIChhcnJheVttaWRdIDwgdmFsdWUpIHtcbiAgICAgIGxlZnQgPSBtaWQgKyAxO1xuICAgIH0gZWxzZSB7XG4gICAgICByaWdodCA9IG1pZDtcbiAgICB9XG4gIH1cbiAgcmV0dXJuIHJpZ2h0O1xufVxuXG5mdW5jdGlvbiB1cHBlckJvdW5kKGFycmF5OiBUeXBlZEFycmF5LCB2YWx1ZTogbnVtYmVyKSB7XG4gIGxldCBsZWZ0ID0gMDtcbiAgbGV0IHJpZ2h0ID0gYXJyYXkubGVuZ3RoO1xuICBsZXQgbWlkID0gMDtcbiAgd2hpbGUgKGxlZnQgPCByaWdodCkge1xuICAgIG1pZCA9IE1hdGguZmxvb3IoKGxlZnQgKyByaWdodCkgLyAyKTtcbiAgICBpZiAoYXJyYXlbbWlkXSA8PSB2YWx1ZSkge1xuICAgICAgbGVmdCA9IG1pZCArIDE7XG4gICAgfSBlbHNlIHtcbiAgICAgIHJpZ2h0ID0gbWlkO1xuICAgIH1cbiAgfVxuICByZXR1cm4gcmlnaHQ7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBzZWFyY2hTb3J0ZWRJbXBsKFxuICAgIHNvcnRlZElucHV0czogVHlwZWRBcnJheSwgdmFsdWVzOiBUeXBlZEFycmF5LCBiYXRjaFNpemU6IG51bWJlcixcbiAgICBudW1JbnB1dHM6IG51bWJlciwgbnVtVmFsdWVzOiBudW1iZXIsIHNpZGU6ICdsZWZ0J3wncmlnaHQnKTogVHlwZWRBcnJheSB7XG4gIGNvbnN0IG91dHB1dCA9XG4gICAgICB1dGlsLmdldEFycmF5RnJvbURUeXBlKCdpbnQzMicsIGJhdGNoU2l6ZSAqIG51bVZhbHVlcykgYXMgVHlwZWRBcnJheTtcbiAgZm9yIChsZXQgYiA9IDA7IGIgPCBiYXRjaFNpemU7ICsrYikge1xuICAgIGNvbnN0IHNvcnRlZElucHV0c1NsaWNlID1cbiAgICAgICAgc29ydGVkSW5wdXRzLnNsaWNlKGIgKiBudW1JbnB1dHMsIChiICsgMSkgKiBudW1JbnB1dHMpO1xuICAgIGNvbnN0IG91dHB1dE9mZnNldCA9IGIgKiBudW1WYWx1ZXM7XG4gICAgZm9yIChsZXQgaSA9IDA7IGkgPCBudW1WYWx1ZXM7ICsraSkge1xuICAgICAgb3V0cHV0W291dHB1dE9mZnNldCArIGldID0gc2lkZSA9PT0gJ2xlZnQnID9cbiAgICAgICAgICBsb3dlckJvdW5kKHNvcnRlZElucHV0c1NsaWNlLCB2YWx1ZXNbaSArIG91dHB1dE9mZnNldF0pIDpcbiAgICAgICAgICB1cHBlckJvdW5kKHNvcnRlZElucHV0c1NsaWNlLCB2YWx1ZXNbaSArIG91dHB1dE9mZnNldF0pO1xuICAgIH1cbiAgfVxuICByZXR1cm4gb3V0cHV0O1xufVxuIl19","/**\n * @license\n * Copyright 2022 Google LLC. All Rights Reserved.\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n * =============================================================================\n */\nimport { SearchSorted } from '@tensorflow/tfjs-core';\nimport { searchSortedImpl } from './SearchSorted_impl';\nexport function searchSorted(args) {\n const { inputs, backend, attrs } = args;\n const { sortedSequence, values } = inputs;\n const { side } = attrs;\n const $sortedSequence = backend.data.get(sortedSequence.dataId).values;\n const $values = backend.data.get(values.dataId).values;\n const output = searchSortedImpl($sortedSequence, $values, sortedSequence.shape[0], sortedSequence.shape[1], values.shape[1], side);\n return backend.makeTensorInfo(values.shape, 'int32', output);\n}\nexport const searchSortedConfig = {\n kernelName: SearchSorted,\n backendName: 'cpu',\n kernelFunc: searchSorted,\n};\n//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiU2VhcmNoU29ydGVkLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vLi4vdGZqcy1iYWNrZW5kLWNwdS9zcmMva2VybmVscy9TZWFyY2hTb3J0ZWQudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUE7Ozs7Ozs7Ozs7Ozs7OztHQWVHO0FBRUgsT0FBTyxFQUEyQixZQUFZLEVBQWdFLE1BQU0sdUJBQXVCLENBQUM7QUFJNUksT0FBTyxFQUFDLGdCQUFnQixFQUFDLE1BQU0scUJBQXFCLENBQUM7QUFFckQsTUFBTSxVQUFVLFlBQVksQ0FBQyxJQUk1QjtJQUNDLE1BQU0sRUFBQyxNQUFNLEVBQUUsT0FBTyxFQUFFLEtBQUssRUFBQyxHQUFHLElBQUksQ0FBQztJQUN0QyxNQUFNLEVBQUMsY0FBYyxFQUFFLE1BQU0sRUFBQyxHQUFHLE1BQU0sQ0FBQztJQUN4QyxNQUFNLEVBQUMsSUFBSSxFQUFDLEdBQUcsS0FBSyxDQUFDO0lBRXJCLE1BQU0sZUFBZSxHQUNqQixPQUFPLENBQUMsSUFBSSxDQUFDLEdBQUcsQ0FBQyxjQUFjLENBQUMsTUFBTSxDQUFDLENBQUMsTUFBb0IsQ0FBQztJQUNqRSxNQUFNLE9BQU8sR0FBRyxPQUFPLENBQUMsSUFBSSxDQUFDLEdBQUcsQ0FBQyxNQUFNLENBQUMsTUFBTSxDQUFDLENBQUMsTUFBb0IsQ0FBQztJQUVyRSxNQUFNLE1BQU0sR0FBRyxnQkFBZ0IsQ0FDM0IsZUFBZSxFQUFFLE9BQU8sRUFBRSxjQUFjLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQyxFQUNqRCxjQUFjLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQyxFQUFFLE1BQU0sQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDLEVBQUUsSUFBSSxDQUFDLENBQUM7SUFDcEQsT0FBTyxPQUFPLENBQUMsY0FBYyxDQUFDLE1BQU0sQ0FBQyxLQUFLLEVBQUUsT0FBTyxFQUFFLE1BQU0sQ0FBQyxDQUFDO0FBQy9ELENBQUM7QUFFRCxNQUFNLENBQUMsTUFBTSxrQkFBa0IsR0FBaUI7SUFDOUMsVUFBVSxFQUFFLFlBQVk7SUFDeEIsV0FBVyxFQUFFLEtBQUs7SUFDbEIsVUFBVSxFQUFFLFlBQWdDO0NBQzdDLENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyIvKipcbiAqIEBsaWNlbnNlXG4gKiBDb3B5cmlnaHQgMjAyMiBHb29nbGUgTExDLiBBbGwgUmlnaHRzIFJlc2VydmVkLlxuICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlIFwiTGljZW5zZVwiKTtcbiAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS5cbiAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdFxuICpcbiAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMFxuICpcbiAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmVcbiAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuIFwiQVMgSVNcIiBCQVNJUyxcbiAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLlxuICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZFxuICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuXG4gKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuICovXG5cbmltcG9ydCB7S2VybmVsQ29uZmlnLCBLZXJuZWxGdW5jLCBTZWFyY2hTb3J0ZWQsIFNlYXJjaFNvcnRlZEF0dHJzLCBTZWFyY2hTb3J0ZWRJbnB1dHMsIFRlbnNvckluZm8sIFR5cGVkQXJyYXl9IGZyb20gJ0B0ZW5zb3JmbG93L3RmanMtY29yZSc7XG5cbmltcG9ydCB7TWF0aEJhY2tlbmRDUFV9IGZyb20gJy4uL2JhY2tlbmRfY3B1JztcblxuaW1wb3J0IHtzZWFyY2hTb3J0ZWRJbXBsfSBmcm9tICcuL1NlYXJjaFNvcnRlZF9pbXBsJztcblxuZXhwb3J0IGZ1bmN0aW9uIHNlYXJjaFNvcnRlZChhcmdzOiB7XG4gIGlucHV0czogU2VhcmNoU29ydGVkSW5wdXRzLFxuICBiYWNrZW5kOiBNYXRoQmFja2VuZENQVSxcbiAgYXR0cnM6IFNlYXJjaFNvcnRlZEF0dHJzXG59KTogVGVuc29ySW5mbyB7XG4gIGNvbnN0IHtpbnB1dHMsIGJhY2tlbmQsIGF0dHJzfSA9IGFyZ3M7XG4gIGNvbnN0IHtzb3J0ZWRTZXF1ZW5jZSwgdmFsdWVzfSA9IGlucHV0cztcbiAgY29uc3Qge3NpZGV9ID0gYXR0cnM7XG5cbiAgY29uc3QgJHNvcnRlZFNlcXVlbmNlID1cbiAgICAgIGJhY2tlbmQuZGF0YS5nZXQoc29ydGVkU2VxdWVuY2UuZGF0YUlkKS52YWx1ZXMgYXMgVHlwZWRBcnJheTtcbiAgY29uc3QgJHZhbHVlcyA9IGJhY2tlbmQuZGF0YS5nZXQodmFsdWVzLmRhdGFJZCkudmFsdWVzIGFzIFR5cGVkQXJyYXk7XG5cbiAgY29uc3Qgb3V0cHV0ID0gc2VhcmNoU29ydGVkSW1wbChcbiAgICAgICRzb3J0ZWRTZXF1ZW5jZSwgJHZhbHVlcywgc29ydGVkU2VxdWVuY2Uuc2hhcGVbMF0sXG4gICAgICBzb3J0ZWRTZXF1ZW5jZS5zaGFwZVsxXSwgdmFsdWVzLnNoYXBlWzFdLCBzaWRlKTtcbiAgcmV0dXJuIGJhY2tlbmQubWFrZVRlbnNvckluZm8odmFsdWVzLnNoYXBlLCAnaW50MzInLCBvdXRwdXQpO1xufVxuXG5leHBvcnQgY29uc3Qgc2VhcmNoU29ydGVkQ29uZmlnOiBLZXJuZWxDb25maWcgPSB7XG4gIGtlcm5lbE5hbWU6IFNlYXJjaFNvcnRlZCxcbiAgYmFja2VuZE5hbWU6ICdjcHUnLFxuICBrZXJuZWxGdW5jOiBzZWFyY2hTb3J0ZWQgYXMge30gYXMgS2VybmVsRnVuYyxcbn07XG4iXX0=","/**\n * @license\n * Copyright 2020 Google LLC. All Rights Reserved.\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n * =============================================================================\n */\nimport { Select, upcastType, util } from '@tensorflow/tfjs-core';\nimport { assertNotComplex } from '../cpu_util';\nexport function select(args) {\n const { inputs, backend } = args;\n const { condition, t, e } = inputs;\n assertNotComplex([condition, t, e], 'select');\n const conditionRank = condition.shape.length;\n const values = backend.data.get(condition.dataId).values;\n const tValues = backend.data.get(t.dataId).values;\n const eValues = backend.data.get(e.dataId).values;\n const resultDtype = upcastType(t.dtype, e.dtype);\n const newValues = util.makeZerosTypedArray(util.sizeFromShape(t.shape), resultDtype);\n let index = 0;\n const offset = conditionRank === 0 || conditionRank > 1 || t.shape.length === 1 ?\n 1 :\n util.sizeFromShape(t.shape.slice(1));\n for (let i = 0; i < values.length; i++) {\n for (let j = 0; j < offset; j++) {\n if (values[i] === 1) {\n newValues[index++] = tValues[i];\n }\n else {\n newValues[index++] = eValues[i];\n }\n }\n }\n return backend.makeTensorInfo(t.shape, resultDtype, newValues);\n}\nexport const selectConfig = {\n kernelName: Select,\n backendName: 'cpu',\n kernelFunc: select\n};\n//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiU2VsZWN0LmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vLi4vdGZqcy1iYWNrZW5kLWNwdS9zcmMva2VybmVscy9TZWxlY3QudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUE7Ozs7Ozs7Ozs7Ozs7OztHQWVHO0FBRUgsT0FBTyxFQUEyQixNQUFNLEVBQXdDLFVBQVUsRUFBRSxJQUFJLEVBQUMsTUFBTSx1QkFBdUIsQ0FBQztBQUcvSCxPQUFPLEVBQUMsZ0JBQWdCLEVBQUMsTUFBTSxhQUFhLENBQUM7QUFFN0MsTUFBTSxVQUFVLE1BQU0sQ0FBQyxJQUFxRDtJQUUxRSxNQUFNLEVBQUMsTUFBTSxFQUFFLE9BQU8sRUFBQyxHQUFHLElBQUksQ0FBQztJQUMvQixNQUFNLEVBQUMsU0FBUyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUMsR0FBRyxNQUFNLENBQUM7SUFFakMsZ0JBQWdCLENBQUMsQ0FBQyxTQUFTLEVBQUUsQ0FBQyxFQUFFLENBQUMsQ0FBQyxFQUFFLFFBQVEsQ0FBQyxDQUFDO0lBQzlDLE1BQU0sYUFBYSxHQUFHLFNBQVMsQ0FBQyxLQUFLLENBQUMsTUFBTSxDQUFDO0lBRTdDLE1BQU0sTUFBTSxHQUFHLE9BQU8sQ0FBQyxJQUFJLENBQUMsR0FBRyxDQUFDLFNBQVMsQ0FBQyxNQUFNLENBQUMsQ0FBQyxNQUFvQixDQUFDO0lBQ3ZFLE1BQU0sT0FBTyxHQUFHLE9BQU8sQ0FBQyxJQUFJLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxNQUFNLENBQUMsQ0FBQyxNQUFvQixDQUFDO0lBQ2hFLE1BQU0sT0FBTyxHQUFHLE9BQU8sQ0FBQyxJQUFJLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxNQUFNLENBQUMsQ0FBQyxNQUFvQixDQUFDO0lBQ2hFLE1BQU0sV0FBVyxHQUFHLFVBQVUsQ0FBQyxDQUFDLENBQUMsS0FBSyxFQUFFLENBQUMsQ0FBQyxLQUFLLENBQUMsQ0FBQztJQUNqRCxNQUFNLFNBQVMsR0FDWCxJQUFJLENBQUMsbUJBQW1CLENBQUMsSUFBSSxDQUFDLGFBQWEsQ0FBQyxDQUFDLENBQUMsS0FBSyxDQUFDLEVBQUUsV0FBVyxDQUFDLENBQUM7SUFFdkUsSUFBSSxLQUFLLEdBQUcsQ0FBQyxDQUFDO0lBQ2QsTUFBTSxNQUFNLEdBQ1IsYUFBYSxLQUFLLENBQUMsSUFBSSxhQUFhLEdBQUcsQ0FBQyxJQUFJLENBQUMsQ0FBQyxLQUFLLENBQUMsTUFBTSxLQUFLLENBQUMsQ0FBQyxDQUFDO1FBQ2xFLENBQUMsQ0FBQyxDQUFDO1FBQ0gsSUFBSSxDQUFDLGFBQWEsQ0FBQyxDQUFDLENBQUMsS0FBSyxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDO0lBRXpDLEtBQUssSUFBSSxDQUFDLEdBQUcsQ0FBQyxFQUFFLENBQUMsR0FBRyxNQUFNLENBQUMsTUFBTSxFQUFFLENBQUMsRUFBRSxFQUFFO1FBQ3RDLEtBQUssSUFBSSxDQUFDLEdBQUcsQ0FBQyxFQUFFLENBQUMsR0FBRyxNQUFNLEVBQUUsQ0FBQyxFQUFFLEVBQUU7WUFDL0IsSUFBSSxNQUFNLENBQUMsQ0FBQyxDQUFDLEtBQUssQ0FBQyxFQUFFO2dCQUNuQixTQUFTLENBQUMsS0FBSyxFQUFFLENBQUMsR0FBRyxPQUFPLENBQUMsQ0FBQyxDQUFDLENBQUM7YUFDakM7aUJBQU07Z0JBQ0wsU0FBUyxDQUFDLEtBQUssRUFBRSxDQUFDLEdBQUcsT0FBTyxDQUFDLENBQUMsQ0FBQyxDQUFDO2FBQ2pDO1NBQ0Y7S0FDRjtJQUVELE9BQU8sT0FBTyxDQUFDLGNBQWMsQ0FBQyxDQUFDLENBQUMsS0FBSyxFQUFFLFdBQVcsRUFBRSxTQUFTLENBQUMsQ0FBQztBQUNqRSxDQUFDO0FBRUQsTUFBTSxDQUFDLE1BQU0sWUFBWSxHQUFpQjtJQUN4QyxVQUFVLEVBQUUsTUFBTTtJQUNsQixXQUFXLEVBQUUsS0FBSztJQUNsQixVQUFVLEVBQUUsTUFBMEI7Q0FDdkMsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbIi8qKlxuICogQGxpY2Vuc2VcbiAqIENvcHlyaWdodCAyMDIwIEdvb2dsZSBMTEMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuXG4gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgXCJMaWNlbnNlXCIpO1xuICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLlxuICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0XG4gKlxuICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wXG4gKlxuICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZVxuICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gXCJBUyBJU1wiIEJBU0lTLFxuICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuXG4gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kXG4gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS5cbiAqID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4gKi9cblxuaW1wb3J0IHtLZXJuZWxDb25maWcsIEtlcm5lbEZ1bmMsIFNlbGVjdCwgU2VsZWN0SW5wdXRzLCBUZW5zb3JJbmZvLCBUeXBlZEFycmF5LCB1cGNhc3RUeXBlLCB1dGlsfSBmcm9tICdAdGVuc29yZmxvdy90ZmpzLWNvcmUnO1xuXG5pbXBvcnQge01hdGhCYWNrZW5kQ1BVfSBmcm9tICcuLi9iYWNrZW5kX2NwdSc7XG5pbXBvcnQge2Fzc2VydE5vdENvbXBsZXh9IGZyb20gJy4uL2NwdV91dGlsJztcblxuZXhwb3J0IGZ1bmN0aW9uIHNlbGVjdChhcmdzOiB7aW5wdXRzOiBTZWxlY3RJbnB1dHMsIGJhY2tlbmQ6IE1hdGhCYWNrZW5kQ1BVfSk6XG4gICAgVGVuc29ySW5mbyB7XG4gIGNvbnN0IHtpbnB1dHMsIGJhY2tlbmR9ID0gYXJncztcbiAgY29uc3Qge2NvbmRpdGlvbiwgdCwgZX0gPSBpbnB1dHM7XG5cbiAgYXNzZXJ0Tm90Q29tcGxleChbY29uZGl0aW9uLCB0LCBlXSwgJ3NlbGVjdCcpO1xuICBjb25zdCBjb25kaXRpb25SYW5rID0gY29uZGl0aW9uLnNoYXBlLmxlbmd0aDtcblxuICBjb25zdCB2YWx1ZXMgPSBiYWNrZW5kLmRhdGEuZ2V0KGNvbmRpdGlvbi5kYXRhSWQpLnZhbHVlcyBhcyBUeXBlZEFycmF5O1xuICBjb25zdCB0VmFsdWVzID0gYmFja2VuZC5kYXRhLmdldCh0LmRhdGFJZCkudmFsdWVzIGFzIFR5cGVkQXJyYXk7XG4gIGNvbnN0IGVWYWx1ZXMgPSBiYWNrZW5kLmRhdGEuZ2V0KGUuZGF0YUlkKS52YWx1ZXMgYXMgVHlwZWRBcnJheTtcbiAgY29uc3QgcmVzdWx0RHR5cGUgPSB1cGNhc3RUeXBlKHQuZHR5cGUsIGUuZHR5cGUpO1xuICBjb25zdCBuZXdWYWx1ZXMgPVxuICAgICAgdXRpbC5tYWtlWmVyb3NUeXBlZEFycmF5KHV0aWwuc2l6ZUZyb21TaGFwZSh0LnNoYXBlKSwgcmVzdWx0RHR5cGUpO1xuXG4gIGxldCBpbmRleCA9IDA7XG4gIGNvbnN0IG9mZnNldCA9XG4gICAgICBjb25kaXRpb25SYW5rID09PSAwIHx8IGNvbmRpdGlvblJhbmsgPiAxIHx8IHQuc2hhcGUubGVuZ3RoID09PSAxID9cbiAgICAgIDEgOlxuICAgICAgdXRpbC5zaXplRnJvbVNoYXBlKHQuc2hhcGUuc2xpY2UoMSkpO1xuXG4gIGZvciAobGV0IGkgPSAwOyBpIDwgdmFsdWVzLmxlbmd0aDsgaSsrKSB7XG4gICAgZm9yIChsZXQgaiA9IDA7IGogPCBvZmZzZXQ7IGorKykge1xuICAgICAgaWYgKHZhbHVlc1tpXSA9PT0gMSkge1xuICAgICAgICBuZXdWYWx1ZXNbaW5kZXgrK10gPSB0VmFsdWVzW2ldO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgbmV3VmFsdWVzW2luZGV4KytdID0gZVZhbHVlc1tpXTtcbiAgICAgIH1cbiAgICB9XG4gIH1cblxuICByZXR1cm4gYmFja2VuZC5tYWtlVGVuc29ySW5mbyh0LnNoYXBlLCByZXN1bHREdHlwZSwgbmV3VmFsdWVzKTtcbn1cblxuZXhwb3J0IGNvbnN0IHNlbGVjdENvbmZpZzogS2VybmVsQ29uZmlnID0ge1xuICBrZXJuZWxOYW1lOiBTZWxlY3QsXG4gIGJhY2tlbmROYW1lOiAnY3B1JyxcbiAga2VybmVsRnVuYzogc2VsZWN0IGFzIHt9IGFzIEtlcm5lbEZ1bmNcbn07XG4iXX0=","/**\n * @license\n * Copyright 2020 Google LLC. All Rights Reserved.\n * Licensed under the Apache License, Version 2.0 (the License);\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an AS IS BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n * =============================================================================\n */\nimport { backend_util, Selu } from '@tensorflow/tfjs-core';\nimport { unaryKernelFunc } from '../utils/unary_utils';\nconst scaleAlpha = backend_util.SELU_SCALEALPHA;\nconst scale = backend_util.SELU_SCALE;\nexport const selu = unaryKernelFunc(Selu, (xi) => {\n if (xi >= 0) {\n return scale * xi;\n }\n else {\n return scaleAlpha * (Math.exp(xi) - 1);\n }\n});\nexport const seluConfig = {\n kernelName: Selu,\n backendName: 'cpu',\n kernelFunc: selu,\n};\n//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiU2VsdS5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uLy4uL3RmanMtYmFja2VuZC1jcHUvc3JjL2tlcm5lbHMvU2VsdS50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQTs7Ozs7Ozs7Ozs7Ozs7O0dBZUc7QUFFSCxPQUFPLEVBQUMsWUFBWSxFQUFnQixJQUFJLEVBQUMsTUFBTSx1QkFBdUIsQ0FBQztBQUV2RSxPQUFPLEVBQUMsZUFBZSxFQUFDLE1BQU0sc0JBQXNCLENBQUM7QUFFckQsTUFBTSxVQUFVLEdBQUcsWUFBWSxDQUFDLGVBQWUsQ0FBQztBQUNoRCxNQUFNLEtBQUssR0FBRyxZQUFZLENBQUMsVUFBVSxDQUFDO0FBRXRDLE1BQU0sQ0FBQyxNQUFNLElBQUksR0FBRyxlQUFlLENBQUMsSUFBSSxFQUFFLENBQUMsRUFBRSxFQUFFLEVBQUU7SUFDL0MsSUFBSSxFQUFFLElBQUksQ0FBQyxFQUFFO1FBQ1gsT0FBTyxLQUFLLEdBQUcsRUFBRSxDQUFDO0tBQ25CO1NBQU07UUFDTCxPQUFPLFVBQVUsR0FBRyxDQUFDLElBQUksQ0FBQyxHQUFHLENBQUMsRUFBRSxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUM7S0FDeEM7QUFDSCxDQUFDLENBQUMsQ0FBQztBQUVILE1BQU0sQ0FBQyxNQUFNLFVBQVUsR0FBaUI7SUFDdEMsVUFBVSxFQUFFLElBQUk7SUFDaEIsV0FBVyxFQUFFLEtBQUs7SUFDbEIsVUFBVSxFQUFFLElBQUk7Q0FDakIsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbIi8qKlxuICogQGxpY2Vuc2VcbiAqIENvcHlyaWdodCAyMDIwIEdvb2dsZSBMTEMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuXG4gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgTGljZW5zZSk7XG4gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuXG4gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXRcbiAqXG4gKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjBcbiAqXG4gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlXG4gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiBBUyBJUyBCQVNJUyxcbiAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLlxuICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZFxuICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuXG4gKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuICovXG5cbmltcG9ydCB7YmFja2VuZF91dGlsLCBLZXJuZWxDb25maWcsIFNlbHV9IGZyb20gJ0B0ZW5zb3JmbG93L3RmanMtY29yZSc7XG5cbmltcG9ydCB7dW5hcnlLZXJuZWxGdW5jfSBmcm9tICcuLi91dGlscy91bmFyeV91dGlscyc7XG5cbmNvbnN0IHNjYWxlQWxwaGEgPSBiYWNrZW5kX3V0aWwuU0VMVV9TQ0FMRUFMUEhBO1xuY29uc3Qgc2NhbGUgPSBiYWNrZW5kX3V0aWwuU0VMVV9TQ0FMRTtcblxuZXhwb3J0IGNvbnN0IHNlbHUgPSB1bmFyeUtlcm5lbEZ1bmMoU2VsdSwgKHhpKSA9PiB7XG4gIGlmICh4aSA+PSAwKSB7XG4gICAgcmV0dXJuIHNjYWxlICogeGk7XG4gIH0gZWxzZSB7XG4gICAgcmV0dXJuIHNjYWxlQWxwaGEgKiAoTWF0aC5leHAoeGkpIC0gMSk7XG4gIH1cbn0pO1xuXG5leHBvcnQgY29uc3Qgc2VsdUNvbmZpZzogS2VybmVsQ29uZmlnID0ge1xuICBrZXJuZWxOYW1lOiBTZWx1LFxuICBiYWNrZW5kTmFtZTogJ2NwdScsXG4gIGtlcm5lbEZ1bmM6IHNlbHUsXG59O1xuIl19","/**\n * @license\n * Copyright 2020 Google LLC. All Rights Reserved.\n * Licensed under the Apache License, Version 2.0 (the License);\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an AS IS BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n * =============================================================================\n */\nimport { Sign } from '@tensorflow/tfjs-core';\nimport { unaryKernelFunc } from '../utils/unary_utils';\nexport const sign = unaryKernelFunc(Sign, (xi) => {\n if (xi < 0) {\n return -1;\n }\n else if (xi > 0) {\n return 1;\n }\n else {\n return 0;\n }\n});\nexport const signConfig = {\n kernelName: Sign,\n backendName: 'cpu',\n kernelFunc: sign,\n};\n//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiU2lnbi5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uLy4uL3RmanMtYmFja2VuZC1jcHUvc3JjL2tlcm5lbHMvU2lnbi50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQTs7Ozs7Ozs7Ozs7Ozs7O0dBZUc7QUFFSCxPQUFPLEVBQWUsSUFBSSxFQUFDLE1BQU0sdUJBQXVCLENBQUM7QUFFekQsT0FBTyxFQUFDLGVBQWUsRUFBQyxNQUFNLHNCQUFzQixDQUFDO0FBRXJELE1BQU0sQ0FBQyxNQUFNLElBQUksR0FBRyxlQUFlLENBQUMsSUFBSSxFQUFFLENBQUMsRUFBRSxFQUFFLEVBQUU7SUFDL0MsSUFBSSxFQUFFLEdBQUcsQ0FBQyxFQUFFO1FBQ1YsT0FBTyxDQUFDLENBQUMsQ0FBQztLQUNYO1NBQU0sSUFBSSxFQUFFLEdBQUcsQ0FBQyxFQUFFO1FBQ2pCLE9BQU8sQ0FBQyxDQUFDO0tBQ1Y7U0FBTTtRQUNMLE9BQU8sQ0FBQyxDQUFDO0tBQ1Y7QUFDSCxDQUFDLENBQUMsQ0FBQztBQUVILE1BQU0sQ0FBQyxNQUFNLFVBQVUsR0FBaUI7SUFDdEMsVUFBVSxFQUFFLElBQUk7SUFDaEIsV0FBVyxFQUFFLEtBQUs7SUFDbEIsVUFBVSxFQUFFLElBQUk7Q0FDakIsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbIi8qKlxuICogQGxpY2Vuc2VcbiAqIENvcHlyaWdodCAyMDIwIEdvb2dsZSBMTEMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuXG4gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgTGljZW5zZSk7XG4gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuXG4gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXRcbiAqXG4gKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjBcbiAqXG4gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlXG4gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiBBUyBJUyBCQVNJUyxcbiAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLlxuICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZFxuICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuXG4gKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuICovXG5cbmltcG9ydCB7S2VybmVsQ29uZmlnLCBTaWdufSBmcm9tICdAdGVuc29yZmxvdy90ZmpzLWNvcmUnO1xuXG5pbXBvcnQge3VuYXJ5S2VybmVsRnVuY30gZnJvbSAnLi4vdXRpbHMvdW5hcnlfdXRpbHMnO1xuXG5leHBvcnQgY29uc3Qgc2lnbiA9IHVuYXJ5S2VybmVsRnVuYyhTaWduLCAoeGkpID0+IHtcbiAgaWYgKHhpIDwgMCkge1xuICAgIHJldHVybiAtMTtcbiAgfSBlbHNlIGlmICh4aSA+IDApIHtcbiAgICByZXR1cm4gMTtcbiAgfSBlbHNlIHtcbiAgICByZXR1cm4gMDtcbiAgfVxufSk7XG5cbmV4cG9ydCBjb25zdCBzaWduQ29uZmlnOiBLZXJuZWxDb25maWcgPSB7XG4gIGtlcm5lbE5hbWU6IFNpZ24sXG4gIGJhY2tlbmROYW1lOiAnY3B1JyxcbiAga2VybmVsRnVuYzogc2lnbixcbn07XG4iXX0=","/**\n * @license\n * Copyright 2020 Google LLC. All Rights Reserved.\n * Licensed under the Apache License, Version 2.0 (the License);\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an AS IS BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n * =============================================================================\n */\nimport { Sin } from '@tensorflow/tfjs-core';\nimport { unaryKernelFunc } from '../utils/unary_utils';\nexport const sin = unaryKernelFunc(Sin, (xi) => Math.sin(xi));\nexport const sinConfig = {\n kernelName: Sin,\n backendName: 'cpu',\n kernelFunc: sin,\n};\n//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiU2luLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vLi4vdGZqcy1iYWNrZW5kLWNwdS9zcmMva2VybmVscy9TaW4udHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUE7Ozs7Ozs7Ozs7Ozs7OztHQWVHO0FBRUgsT0FBTyxFQUFlLEdBQUcsRUFBQyxNQUFNLHVCQUF1QixDQUFDO0FBRXhELE9BQU8sRUFBQyxlQUFlLEVBQUMsTUFBTSxzQkFBc0IsQ0FBQztBQUVyRCxNQUFNLENBQUMsTUFBTSxHQUFHLEdBQUcsZUFBZSxDQUFDLEdBQUcsRUFBRSxDQUFDLEVBQUUsRUFBRSxFQUFFLENBQUMsSUFBSSxDQUFDLEdBQUcsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDO0FBRTlELE1BQU0sQ0FBQyxNQUFNLFNBQVMsR0FBaUI7SUFDckMsVUFBVSxFQUFFLEdBQUc7SUFDZixXQUFXLEVBQUUsS0FBSztJQUNsQixVQUFVLEVBQUUsR0FBRztDQUNoQixDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiLyoqXG4gKiBAbGljZW5zZVxuICogQ29weXJpZ2h0IDIwMjAgR29vZ2xlIExMQy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC5cbiAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSBMaWNlbnNlKTtcbiAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS5cbiAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdFxuICpcbiAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMFxuICpcbiAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmVcbiAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuIEFTIElTIEJBU0lTLFxuICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuXG4gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kXG4gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS5cbiAqID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4gKi9cblxuaW1wb3J0IHtLZXJuZWxDb25maWcsIFNpbn0gZnJvbSAnQHRlbnNvcmZsb3cvdGZqcy1jb3JlJztcblxuaW1wb3J0IHt1bmFyeUtlcm5lbEZ1bmN9IGZyb20gJy4uL3V0aWxzL3VuYXJ5X3V0aWxzJztcblxuZXhwb3J0IGNvbnN0IHNpbiA9IHVuYXJ5S2VybmVsRnVuYyhTaW4sICh4aSkgPT4gTWF0aC5zaW4oeGkpKTtcblxuZXhwb3J0IGNvbnN0IHNpbkNvbmZpZzogS2VybmVsQ29uZmlnID0ge1xuICBrZXJuZWxOYW1lOiBTaW4sXG4gIGJhY2tlbmROYW1lOiAnY3B1JyxcbiAga2VybmVsRnVuYzogc2luLFxufTtcbiJdfQ==","/**\n * @license\n * Copyright 2020 Google LLC. All Rights Reserved.\n * Licensed under the Apache License, Version 2.0 (the License);\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an AS IS BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n * =============================================================================\n */\nimport { Sinh } from '@tensorflow/tfjs-core';\nimport { unaryKernelFunc } from '../utils/unary_utils';\nexport const sinh = unaryKernelFunc(Sinh, (xi) => Math.sinh(xi));\nexport const sinhConfig = {\n kernelName: Sinh,\n backendName: 'cpu',\n kernelFunc: sinh,\n};\n//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiU2luaC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uLy4uL3RmanMtYmFja2VuZC1jcHUvc3JjL2tlcm5lbHMvU2luaC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQTs7Ozs7Ozs7Ozs7Ozs7O0dBZUc7QUFFSCxPQUFPLEVBQWUsSUFBSSxFQUFDLE1BQU0sdUJBQXVCLENBQUM7QUFFekQsT0FBTyxFQUFDLGVBQWUsRUFBQyxNQUFNLHNCQUFzQixDQUFDO0FBRXJELE1BQU0sQ0FBQyxNQUFNLElBQUksR0FBRyxlQUFlLENBQUMsSUFBSSxFQUFFLENBQUMsRUFBRSxFQUFFLEVBQUUsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUM7QUFFakUsTUFBTSxDQUFDLE1BQU0sVUFBVSxHQUFpQjtJQUN0QyxVQUFVLEVBQUUsSUFBSTtJQUNoQixXQUFXLEVBQUUsS0FBSztJQUNsQixVQUFVLEVBQUUsSUFBSTtDQUNqQixDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiLyoqXG4gKiBAbGljZW5zZVxuICogQ29weXJpZ2h0IDIwMjAgR29vZ2xlIExMQy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC5cbiAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSBMaWNlbnNlKTtcbiAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS5cbiAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdFxuICpcbiAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMFxuICpcbiAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmVcbiAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuIEFTIElTIEJBU0lTLFxuICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuXG4gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kXG4gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS5cbiAqID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4gKi9cblxuaW1wb3J0IHtLZXJuZWxDb25maWcsIFNpbmh9IGZyb20gJ0B0ZW5zb3JmbG93L3RmanMtY29yZSc7XG5cbmltcG9ydCB7dW5hcnlLZXJuZWxGdW5jfSBmcm9tICcuLi91dGlscy91bmFyeV91dGlscyc7XG5cbmV4cG9ydCBjb25zdCBzaW5oID0gdW5hcnlLZXJuZWxGdW5jKFNpbmgsICh4aSkgPT4gTWF0aC5zaW5oKHhpKSk7XG5cbmV4cG9ydCBjb25zdCBzaW5oQ29uZmlnOiBLZXJuZWxDb25maWcgPSB7XG4gIGtlcm5lbE5hbWU6IFNpbmgsXG4gIGJhY2tlbmROYW1lOiAnY3B1JyxcbiAga2VybmVsRnVuYzogc2luaCxcbn07XG4iXX0=","/**\n * @license\n * Copyright 2020 Google LLC. All Rights Reserved.\n * Licensed under the Apache License, Version 2.0 (the License);\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an AS IS BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n * =============================================================================\n */\nimport { Softplus } from '@tensorflow/tfjs-core';\nimport { unaryKernelFunc } from '../utils/unary_utils';\n// mirrors the implementation of tf.nn.softplus: https://goo.gl/vkcvwX\n// epsilon is the difference between 1.0 and the next representable float.\n// For a single precision 32 bit float this should be 2^-23, see:\n// https://math.byu.edu/~schow/work/IEEEFloatingPoint.htm\nconst epsilon = 1.1920928955078125e-7;\nconst threshold = Math.log(epsilon) + 2.0;\nexport const softplus = unaryKernelFunc(Softplus, (xi) => {\n // Value above which exp(x) may overflow, but softplus(x) == x\n // is within machine epsilon.\n const tooLarge = xi > -threshold;\n // Value below which exp(x) may underflow, but softplus(x) == exp(x)\n // is within machine epsilon.\n const tooSmall = xi < threshold;\n const expX = Math.exp(xi);\n let result;\n if (tooSmall) {\n result = expX;\n }\n else if (tooLarge) {\n result = xi;\n }\n else {\n result = Math.log(1.0 + expX);\n }\n return result;\n});\nexport const softplusConfig = {\n kernelName: Softplus,\n backendName: 'cpu',\n kernelFunc: softplus,\n};\n//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiU29mdHBsdXMuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi8uLi90ZmpzLWJhY2tlbmQtY3B1L3NyYy9rZXJuZWxzL1NvZnRwbHVzLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBOzs7Ozs7Ozs7Ozs7Ozs7R0FlRztBQUVILE9BQU8sRUFBZSxRQUFRLEVBQUMsTUFBTSx1QkFBdUIsQ0FBQztBQUU3RCxPQUFPLEVBQUMsZUFBZSxFQUFDLE1BQU0sc0JBQXNCLENBQUM7QUFFckQsc0VBQXNFO0FBRXRFLDBFQUEwRTtBQUMxRSxpRUFBaUU7QUFDakUseURBQXlEO0FBQ3pELE1BQU0sT0FBTyxHQUFHLHFCQUFxQixDQUFDO0FBQ3RDLE1BQU0sU0FBUyxHQUFHLElBQUksQ0FBQyxHQUFHLENBQUMsT0FBTyxDQUFDLEdBQUcsR0FBRyxDQUFDO0FBRTFDLE1BQU0sQ0FBQyxNQUFNLFFBQVEsR0FBRyxlQUFlLENBQUMsUUFBUSxFQUFFLENBQUMsRUFBRSxFQUFFLEVBQUU7SUFDdkQsOERBQThEO0lBQzlELDZCQUE2QjtJQUM3QixNQUFNLFFBQVEsR0FBRyxFQUFFLEdBQUcsQ0FBQyxTQUFTLENBQUM7SUFFakMsb0VBQW9FO0lBQ3BFLDZCQUE2QjtJQUM3QixNQUFNLFFBQVEsR0FBRyxFQUFFLEdBQUcsU0FBUyxDQUFDO0lBRWhDLE1BQU0sSUFBSSxHQUFHLElBQUksQ0FBQyxHQUFHLENBQUMsRUFBRSxDQUFDLENBQUM7SUFDMUIsSUFBSSxNQUFNLENBQUM7SUFFWCxJQUFJLFFBQVEsRUFBRTtRQUNaLE1BQU0sR0FBRyxJQUFJLENBQUM7S0FDZjtTQUFNLElBQUksUUFBUSxFQUFFO1FBQ25CLE1BQU0sR0FBRyxFQUFFLENBQUM7S0FDYjtTQUFNO1FBQ0wsTUFBTSxHQUFHLElBQUksQ0FBQyxHQUFHLENBQUMsR0FBRyxHQUFHLElBQUksQ0FBQyxDQUFDO0tBQy9CO0lBQ0QsT0FBTyxNQUFNLENBQUM7QUFDaEIsQ0FBQyxDQUFDLENBQUM7QUFFSCxNQUFNLENBQUMsTUFBTSxjQUFjLEdBQWlCO0lBQzFDLFVBQVUsRUFBRSxRQUFRO0lBQ3BCLFdBQVcsRUFBRSxLQUFLO0lBQ2xCLFVBQVUsRUFBRSxRQUFRO0NBQ3JCLENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyIvKipcbiAqIEBsaWNlbnNlXG4gKiBDb3B5cmlnaHQgMjAyMCBHb29nbGUgTExDLiBBbGwgUmlnaHRzIFJlc2VydmVkLlxuICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlIExpY2Vuc2UpO1xuICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLlxuICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0XG4gKlxuICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wXG4gKlxuICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZVxuICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gQVMgSVMgQkFTSVMsXG4gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC5cbiAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmRcbiAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLlxuICogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbiAqL1xuXG5pbXBvcnQge0tlcm5lbENvbmZpZywgU29mdHBsdXN9IGZyb20gJ0B0ZW5zb3JmbG93L3RmanMtY29yZSc7XG5cbmltcG9ydCB7dW5hcnlLZXJuZWxGdW5jfSBmcm9tICcuLi91dGlscy91bmFyeV91dGlscyc7XG5cbi8vIG1pcnJvcnMgdGhlIGltcGxlbWVudGF0aW9uIG9mIHRmLm5uLnNvZnRwbHVzOiBodHRwczovL2dvby5nbC92a2N2d1hcblxuLy8gZXBzaWxvbiBpcyB0aGUgZGlmZmVyZW5jZSBiZXR3ZWVuIDEuMCBhbmQgdGhlIG5leHQgcmVwcmVzZW50YWJsZSBmbG9hdC5cbi8vIEZvciBhIHNpbmdsZSBwcmVjaXNpb24gMzIgYml0IGZsb2F0IHRoaXMgc2hvdWxkIGJlIDJeLTIzLCBzZWU6XG4vLyBodHRwczovL21hdGguYnl1LmVkdS9+c2Nob3cvd29yay9JRUVFRmxvYXRpbmdQb2ludC5odG1cbmNvbnN0IGVwc2lsb24gPSAxLjE5MjA5Mjg5NTUwNzgxMjVlLTc7XG5jb25zdCB0aHJlc2hvbGQgPSBNYXRoLmxvZyhlcHNpbG9uKSArIDIuMDtcblxuZXhwb3J0IGNvbnN0IHNvZnRwbHVzID0gdW5hcnlLZXJuZWxGdW5jKFNvZnRwbHVzLCAoeGkpID0+IHtcbiAgLy8gVmFsdWUgYWJvdmUgd2hpY2ggZXhwKHgpIG1heSBvdmVyZmxvdywgYnV0IHNvZnRwbHVzKHgpID09IHhcbiAgLy8gaXMgd2l0aGluIG1hY2hpbmUgZXBzaWxvbi5cbiAgY29uc3QgdG9vTGFyZ2UgPSB4aSA+IC10aHJlc2hvbGQ7XG5cbiAgLy8gVmFsdWUgYmVsb3cgd2hpY2ggZXhwKHgpIG1heSB1bmRlcmZsb3csIGJ1dCBzb2Z0cGx1cyh4KSA9PSBleHAoeClcbiAgLy8gaXMgd2l0aGluIG1hY2hpbmUgZXBzaWxvbi5cbiAgY29uc3QgdG9vU21hbGwgPSB4aSA8IHRocmVzaG9sZDtcblxuICBjb25zdCBleHBYID0gTWF0aC5leHAoeGkpO1xuICBsZXQgcmVzdWx0O1xuXG4gIGlmICh0b29TbWFsbCkge1xuICAgIHJlc3VsdCA9IGV4cFg7XG4gIH0gZWxzZSBpZiAodG9vTGFyZ2UpIHtcbiAgICByZXN1bHQgPSB4aTtcbiAgfSBlbHNlIHtcbiAgICByZXN1bHQgPSBNYXRoLmxvZygxLjAgKyBleHBYKTtcbiAgfVxuICByZXR1cm4gcmVzdWx0O1xufSk7XG5cbmV4cG9ydCBjb25zdCBzb2Z0cGx1c0NvbmZpZzogS2VybmVsQ29uZmlnID0ge1xuICBrZXJuZWxOYW1lOiBTb2Z0cGx1cyxcbiAgYmFja2VuZE5hbWU6ICdjcHUnLFxuICBrZXJuZWxGdW5jOiBzb2Z0cGx1cyxcbn07XG4iXX0=","/**\n * @license\n * Copyright 2020 Google LLC. All Rights Reserved.\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n * =============================================================================\n */\nimport { backend_util, SpaceToBatchND, util } from '@tensorflow/tfjs-core';\nimport { assertNotComplex } from '../cpu_util';\nimport { padV2Config } from './PadV2';\nimport { reshape } from './Reshape';\nimport { transpose } from './Transpose';\nexport function spaceToBatchND(args) {\n const { inputs, backend, attrs } = args;\n const { x } = inputs;\n const { blockShape, paddings } = attrs;\n assertNotComplex([x], 'spaceToBatchND');\n const prod = util.sizeFromShape(blockShape);\n const completePaddings = [[0, 0]];\n completePaddings.push(...paddings);\n for (let i = 1 + blockShape.length; i < x.shape.length; ++i) {\n completePaddings.push([0, 0]);\n }\n const paddedX = padV2Config.kernelFunc({\n inputs: { x },\n backend,\n attrs: { paddings: completePaddings, constantValue: 0 }\n });\n const reshapedPaddedShape = backend_util.getReshaped(paddedX.shape, blockShape, prod, false);\n const permutedReshapedPaddedPermutation = backend_util.getPermuted(reshapedPaddedShape.length, blockShape.length, false);\n const flattenShape = backend_util.getReshapedPermuted(paddedX.shape, blockShape, prod, false);\n const reshapeInputs = { x: paddedX };\n const reshapeAttrs = { shape: reshapedPaddedShape };\n const paddedXReshaped = reshape({ inputs: reshapeInputs, backend, attrs: reshapeAttrs });\n const transposeInputs = { x: paddedXReshaped };\n const transposeAttrs = { perm: permutedReshapedPaddedPermutation };\n const paddedXT = transpose({ inputs: transposeInputs, backend, attrs: transposeAttrs });\n const resultReshapeInputs = { x: paddedXT };\n const resultReshapeAttrs = { shape: flattenShape };\n const result = reshape({ inputs: resultReshapeInputs, backend, attrs: resultReshapeAttrs });\n backend.disposeIntermediateTensorInfo(paddedX);\n backend.disposeIntermediateTensorInfo(paddedXReshaped);\n backend.disposeIntermediateTensorInfo(paddedXT);\n return result;\n}\nexport const spaceToBatchNDConfig = {\n kernelName: SpaceToBatchND,\n backendName: 'cpu',\n kernelFunc: spaceToBatchND\n};\n//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiU3BhY2VUb0JhdGNoTkQuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi8uLi90ZmpzLWJhY2tlbmQtY3B1L3NyYy9rZXJuZWxzL1NwYWNlVG9CYXRjaE5ELnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBOzs7Ozs7Ozs7Ozs7Ozs7R0FlRztBQUVILE9BQU8sRUFBQyxZQUFZLEVBQXlELGNBQWMsRUFBMEYsSUFBSSxFQUFDLE1BQU0sdUJBQXVCLENBQUM7QUFHeE4sT0FBTyxFQUFDLGdCQUFnQixFQUFDLE1BQU0sYUFBYSxDQUFDO0FBRTdDLE9BQU8sRUFBQyxXQUFXLEVBQUMsTUFBTSxTQUFTLENBQUM7QUFDcEMsT0FBTyxFQUFDLE9BQU8sRUFBQyxNQUFNLFdBQVcsQ0FBQztBQUNsQyxPQUFPLEVBQUMsU0FBUyxFQUFDLE1BQU0sYUFBYSxDQUFDO0FBRXRDLE1BQU0sVUFBVSxjQUFjLENBQUMsSUFJOUI7SUFDQyxNQUFNLEVBQUMsTUFBTSxFQUFFLE9BQU8sRUFBRSxLQUFLLEVBQUMsR0FBRyxJQUFJLENBQUM7SUFDdEMsTUFBTSxFQUFDLENBQUMsRUFBQyxHQUFHLE1BQU0sQ0FBQztJQUNuQixNQUFNLEVBQUMsVUFBVSxFQUFFLFFBQVEsRUFBQyxHQUFHLEtBQUssQ0FBQztJQUVyQyxnQkFBZ0IsQ0FBQyxDQUFDLENBQUMsQ0FBQyxFQUFFLGdCQUFnQixDQUFDLENBQUM7SUFFeEMsTUFBTSxJQUFJLEdBQUcsSUFBSSxDQUFDLGFBQWEsQ0FBQyxVQUFVLENBQUMsQ0FBQztJQUU1QyxNQUFNLGdCQUFnQixHQUE0QixDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUM7SUFDM0QsZ0JBQWdCLENBQUMsSUFBSSxDQUFDLEdBQUksUUFBb0MsQ0FBQyxDQUFDO0lBRWhFLEtBQUssSUFBSSxDQUFDLEdBQUcsQ0FBQyxHQUFHLFVBQVUsQ0FBQyxNQUFNLEVBQUUsQ0FBQyxHQUFHLENBQUMsQ0FBQyxLQUFLLENBQUMsTUFBTSxFQUFFLEVBQUUsQ0FBQyxFQUFFO1FBQzNELGdCQUFnQixDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxDQUFDO0tBQy9CO0lBRUQsTUFBTSxPQUFPLEdBQUcsV0FBVyxDQUFDLFVBQVUsQ0FBQztRQUNyQyxNQUFNLEVBQUUsRUFBQyxDQUFDLEVBQUM7UUFDWCxPQUFPO1FBQ1AsS0FBSyxFQUFFLEVBQUMsUUFBUSxFQUFFLGdCQUFnQixFQUFFLGFBQWEsRUFBRSxDQUFDLEVBQUM7S0FDdEQsQ0FBZSxDQUFDO0lBRWpCLE1BQU0sbUJBQW1CLEdBQ3JCLFlBQVksQ0FBQyxXQUFXLENBQUMsT0FBTyxDQUFDLEtBQUssRUFBRSxVQUFVLEVBQUUsSUFBSSxFQUFFLEtBQUssQ0FBQyxDQUFDO0lBRXJFLE1BQU0saUNBQWlDLEdBQUcsWUFBWSxDQUFDLFdBQVcsQ0FDOUQsbUJBQW1CLENBQUMsTUFBTSxFQUFFLFVBQVUsQ0FBQyxNQUFNLEVBQUUsS0FBSyxDQUFDLENBQUM7SUFFMUQsTUFBTSxZQUFZLEdBQ2QsWUFBWSxDQUFDLG1CQUFtQixDQUFDLE9BQU8sQ0FBQyxLQUFLLEVBQUUsVUFBVSxFQUFFLElBQUksRUFBRSxLQUFLLENBQUMsQ0FBQztJQUU3RSxNQUFNLGFBQWEsR0FBa0IsRUFBQyxDQUFDLEVBQUUsT0FBTyxFQUFDLENBQUM7SUFDbEQsTUFBTSxZQUFZLEdBQWlCLEVBQUMsS0FBSyxFQUFFLG1CQUFtQixFQUFDLENBQUM7SUFDaEUsTUFBTSxlQUFlLEdBQ2pCLE9BQU8sQ0FBQyxFQUFDLE1BQU0sRUFBRSxhQUFhLEVBQUUsT0FBTyxFQUFFLEtBQUssRUFBRSxZQUFZLEVBQUMsQ0FBQyxDQUFDO0lBRW5FLE1BQU0sZUFBZSxHQUFvQixFQUFDLENBQUMsRUFBRSxlQUFlLEVBQUMsQ0FBQztJQUM5RCxNQUFNLGNBQWMsR0FDQyxFQUFDLElBQUksRUFBRSxpQ0FBaUMsRUFBQyxDQUFDO0lBQy9ELE1BQU0sUUFBUSxHQUNWLFNBQVMsQ0FBQyxFQUFDLE1BQU0sRUFBRSxlQUFlLEVBQUUsT0FBTyxFQUFFLEtBQUssRUFBRSxjQUFjLEVBQUMsQ0FBQyxDQUFDO0lBRXpFLE1BQU0sbUJBQW1CLEdBQWtCLEVBQUMsQ0FBQyxFQUFFLFFBQVEsRUFBQyxDQUFDO0lBQ3pELE1BQU0sa0JBQWtCLEdBQWlCLEVBQUMsS0FBSyxFQUFFLFlBQVksRUFBQyxDQUFDO0lBQy9ELE1BQU0sTUFBTSxHQUFHLE9BQU8sQ0FDbEIsRUFBQyxNQUFNLEVBQUUsbUJBQW1CLEVBQUUsT0FBTyxFQUFFLEtBQUssRUFBRSxrQkFBa0IsRUFBQyxDQUFDLENBQUM7SUFFdkUsT0FBTyxDQUFDLDZCQUE2QixDQUFDLE9BQU8sQ0FBQyxDQUFDO0lBQy9DLE9BQU8sQ0FBQyw2QkFBNkIsQ0FBQyxlQUFlLENBQUMsQ0FBQztJQUN2RCxPQUFPLENBQUMsNkJBQTZCLENBQUMsUUFBUSxDQUFDLENBQUM7SUFFaEQsT0FBTyxNQUFNLENBQUM7QUFDaEIsQ0FBQztBQUVELE1BQU0sQ0FBQyxNQUFNLG9CQUFvQixHQUFpQjtJQUNoRCxVQUFVLEVBQUUsY0FBYztJQUMxQixXQUFXLEVBQUUsS0FBSztJQUNsQixVQUFVLEVBQUUsY0FBa0M7Q0FDL0MsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbIi8qKlxuICogQGxpY2Vuc2VcbiAqIENvcHlyaWdodCAyMDIwIEdvb2dsZSBMTEMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuXG4gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgXCJMaWNlbnNlXCIpO1xuICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLlxuICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0XG4gKlxuICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wXG4gKlxuICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZVxuICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gXCJBUyBJU1wiIEJBU0lTLFxuICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuXG4gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kXG4gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS5cbiAqID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4gKi9cblxuaW1wb3J0IHtiYWNrZW5kX3V0aWwsIEtlcm5lbENvbmZpZywgS2VybmVsRnVuYywgUmVzaGFwZUF0dHJzLCBSZXNoYXBlSW5wdXRzLCBTcGFjZVRvQmF0Y2hORCwgU3BhY2VUb0JhdGNoTkRBdHRycywgU3BhY2VUb0JhdGNoTkRJbnB1dHMsIFRlbnNvckluZm8sIFRyYW5zcG9zZUF0dHJzLCBUcmFuc3Bvc2VJbnB1dHMsIHV0aWx9IGZyb20gJ0B0ZW5zb3JmbG93L3RmanMtY29yZSc7XG5cbmltcG9ydCB7TWF0aEJhY2tlbmRDUFV9IGZyb20gJy4uL2JhY2tlbmRfY3B1JztcbmltcG9ydCB7YXNzZXJ0Tm90Q29tcGxleH0gZnJvbSAnLi4vY3B1X3V0aWwnO1xuXG5pbXBvcnQge3BhZFYyQ29uZmlnfSBmcm9tICcuL1BhZFYyJztcbmltcG9ydCB7cmVzaGFwZX0gZnJvbSAnLi9SZXNoYXBlJztcbmltcG9ydCB7dHJhbnNwb3NlfSBmcm9tICcuL1RyYW5zcG9zZSc7XG5cbmV4cG9ydCBmdW5jdGlvbiBzcGFjZVRvQmF0Y2hORChhcmdzOiB7XG4gIGlucHV0czogU3BhY2VUb0JhdGNoTkRJbnB1dHMsXG4gIGJhY2tlbmQ6IE1hdGhCYWNrZW5kQ1BVLFxuICBhdHRyczogU3BhY2VUb0JhdGNoTkRBdHRyc1xufSk6IFRlbnNvckluZm8ge1xuICBjb25zdCB7aW5wdXRzLCBiYWNrZW5kLCBhdHRyc30gPSBhcmdzO1xuICBjb25zdCB7eH0gPSBpbnB1dHM7XG4gIGNvbnN0IHtibG9ja1NoYXBlLCBwYWRkaW5nc30gPSBhdHRycztcblxuICBhc3NlcnROb3RDb21wbGV4KFt4XSwgJ3NwYWNlVG9CYXRjaE5EJyk7XG5cbiAgY29uc3QgcHJvZCA9IHV0aWwuc2l6ZUZyb21TaGFwZShibG9ja1NoYXBlKTtcblxuICBjb25zdCBjb21wbGV0ZVBhZGRpbmdzOiBBcnJheTxbbnVtYmVyLCBudW1iZXJdPiA9IFtbMCwgMF1dO1xuICBjb21wbGV0ZVBhZGRpbmdzLnB1c2goLi4uKHBhZGRpbmdzIGFzIEFycmF5PFtudW1iZXIsIG51bWJlcl0+KSk7XG5cbiAgZm9yIChsZXQgaSA9IDEgKyBibG9ja1NoYXBlLmxlbmd0aDsgaSA8IHguc2hhcGUubGVuZ3RoOyArK2kpIHtcbiAgICBjb21wbGV0ZVBhZGRpbmdzLnB1c2goWzAsIDBdKTtcbiAgfVxuXG4gIGNvbnN0IHBhZGRlZFggPSBwYWRWMkNvbmZpZy5rZXJuZWxGdW5jKHtcbiAgICBpbnB1dHM6IHt4fSxcbiAgICBiYWNrZW5kLFxuICAgIGF0dHJzOiB7cGFkZGluZ3M6IGNvbXBsZXRlUGFkZGluZ3MsIGNvbnN0YW50VmFsdWU6IDB9XG4gIH0pIGFzIFRlbnNvckluZm87XG5cbiAgY29uc3QgcmVzaGFwZWRQYWRkZWRTaGFwZSA9XG4gICAgICBiYWNrZW5kX3V0aWwuZ2V0UmVzaGFwZWQocGFkZGVkWC5zaGFwZSwgYmxvY2tTaGFwZSwgcHJvZCwgZmFsc2UpO1xuXG4gIGNvbnN0IHBlcm11dGVkUmVzaGFwZWRQYWRkZWRQZXJtdXRhdGlvbiA9IGJhY2tlbmRfdXRpbC5nZXRQZXJtdXRlZChcbiAgICAgIHJlc2hhcGVkUGFkZGVkU2hhcGUubGVuZ3RoLCBibG9ja1NoYXBlLmxlbmd0aCwgZmFsc2UpO1xuXG4gIGNvbnN0IGZsYXR0ZW5TaGFwZSA9XG4gICAgICBiYWNrZW5kX3V0aWwuZ2V0UmVzaGFwZWRQZXJtdXRlZChwYWRkZWRYLnNoYXBlLCBibG9ja1NoYXBlLCBwcm9kLCBmYWxzZSk7XG5cbiAgY29uc3QgcmVzaGFwZUlucHV0czogUmVzaGFwZUlucHV0cyA9IHt4OiBwYWRkZWRYfTtcbiAgY29uc3QgcmVzaGFwZUF0dHJzOiBSZXNoYXBlQXR0cnMgPSB7c2hhcGU6IHJlc2hhcGVkUGFkZGVkU2hhcGV9O1xuICBjb25zdCBwYWRkZWRYUmVzaGFwZWQgPVxuICAgICAgcmVzaGFwZSh7aW5wdXRzOiByZXNoYXBlSW5wdXRzLCBiYWNrZW5kLCBhdHRyczogcmVzaGFwZUF0dHJzfSk7XG5cbiAgY29uc3QgdHJhbnNwb3NlSW5wdXRzOiBUcmFuc3Bvc2VJbnB1dHMgPSB7eDogcGFkZGVkWFJlc2hhcGVkfTtcbiAgY29uc3QgdHJhbnNwb3NlQXR0cnM6XG4gICAgICBUcmFuc3Bvc2VBdHRycyA9IHtwZXJtOiBwZXJtdXRlZFJlc2hhcGVkUGFkZGVkUGVybXV0YXRpb259O1xuICBjb25zdCBwYWRkZWRYVCA9XG4gICAgICB0cmFuc3Bvc2Uoe2lucHV0czogdHJhbnNwb3NlSW5wdXRzLCBiYWNrZW5kLCBhdHRyczogdHJhbnNwb3NlQXR0cnN9KTtcblxuICBjb25zdCByZXN1bHRSZXNoYXBlSW5wdXRzOiBSZXNoYXBlSW5wdXRzID0ge3g6IHBhZGRlZFhUfTtcbiAgY29uc3QgcmVzdWx0UmVzaGFwZUF0dHJzOiBSZXNoYXBlQXR0cnMgPSB7c2hhcGU6IGZsYXR0ZW5TaGFwZX07XG4gIGNvbnN0IHJlc3VsdCA9IHJlc2hhcGUoXG4gICAgICB7aW5wdXRzOiByZXN1bHRSZXNoYXBlSW5wdXRzLCBiYWNrZW5kLCBhdHRyczogcmVzdWx0UmVzaGFwZUF0dHJzfSk7XG5cbiAgYmFja2VuZC5kaXNwb3NlSW50ZXJtZWRpYXRlVGVuc29ySW5mbyhwYWRkZWRYKTtcbiAgYmFja2VuZC5kaXNwb3NlSW50ZXJtZWRpYXRlVGVuc29ySW5mbyhwYWRkZWRYUmVzaGFwZWQpO1xuICBiYWNrZW5kLmRpc3Bvc2VJbnRlcm1lZGlhdGVUZW5zb3JJbmZvKHBhZGRlZFhUKTtcblxuICByZXR1cm4gcmVzdWx0O1xufVxuXG5leHBvcnQgY29uc3Qgc3BhY2VUb0JhdGNoTkRDb25maWc6IEtlcm5lbENvbmZpZyA9IHtcbiAga2VybmVsTmFtZTogU3BhY2VUb0JhdGNoTkQsXG4gIGJhY2tlbmROYW1lOiAnY3B1JyxcbiAga2VybmVsRnVuYzogc3BhY2VUb0JhdGNoTkQgYXMge30gYXMgS2VybmVsRnVuY1xufTtcbiJdfQ==","/**\n * @license\n * Copyright 2021 Google LLC. All Rights Reserved.\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n * =============================================================================\n */\nimport { backend_util, util } from '@tensorflow/tfjs-core';\nexport function sparseFillEmptyRowsImpl(indices, indicesShape, indicesDType, values, valuesDType, denseShape, defaultValue) {\n const indicesCount = indicesShape[0];\n const denseRows = denseShape[0];\n const emptyRowIndicator = new Array(denseRows);\n const reverseIndexMap = new Array(indicesCount);\n const rank = indicesShape[1];\n if (denseRows === 0) {\n if (indicesCount !== 0) {\n throw new Error(backend_util.getSparseFillEmptyRowsIndicesDenseShapeMismatch(indicesCount));\n }\n const outputIndices = util.getArrayFromDType(indicesDType, 0);\n const outputValues = util.getArrayFromDType(valuesDType, 0);\n return [\n outputIndices, [0, rank], outputValues, emptyRowIndicator, reverseIndexMap\n ];\n }\n let rowsAreOrdered = true;\n let lastIndicesRow = 0;\n const csrOffset = new Array(denseRows).fill(0);\n for (let i = 0; i < indicesCount; ++i) {\n // indices is a 2d tensor with shape of [N, rank]\n const row = indices[i * rank];\n if (row < 0) {\n throw new Error(backend_util.getSparseFillEmptyRowsNegativeIndexErrorMessage(i, row));\n }\n if (row >= denseRows) {\n throw new Error(backend_util.getSparseFillEmptyRowsOutOfRangeIndexErrorMessage(i, row, denseRows));\n }\n ++csrOffset[row];\n rowsAreOrdered = rowsAreOrdered && (row >= lastIndicesRow);\n lastIndicesRow = row;\n }\n let allRowsFull = true;\n for (let row = 0; row < denseRows; ++row) {\n // csrOffset here describes the number of elements in this dense row\n const rowEmpty = (csrOffset[row] === 0);\n emptyRowIndicator[row] = rowEmpty;\n allRowsFull = allRowsFull && !rowEmpty;\n // In filled version, each row has at least one element.\n csrOffset[row] = Math.max(csrOffset[row], 1);\n // Update csrOffset to represent the number of elements up to and\n // including denseRows + 1:\n // csrOffset[0] == #{elements of row 0}\n // csrOffset[1] == #{elements of row 1} + #{elements of row 0}\n // ..\n // csrOffset[i] == starting index for elements in row i + 1.\n if (row > 0) {\n csrOffset[row] += csrOffset[row - 1];\n }\n }\n if (allRowsFull && rowsAreOrdered) {\n const outputIndices = indices;\n const outputValues = values;\n for (let i = 0; i < indicesCount; ++i) {\n reverseIndexMap[i] = i;\n }\n return [\n outputIndices, [indicesCount, rank], outputValues, emptyRowIndicator,\n reverseIndexMap\n ];\n }\n else {\n const fullIndicesCount = csrOffset[denseRows - 1];\n const outputIndices = util.getArrayFromDType(indicesDType, fullIndicesCount * rank);\n const outputValues = util.getArrayFromDType(valuesDType, fullIndicesCount);\n const filledCount = new Array(denseRows).fill(0);\n // Fill in values for rows that are not missing\n for (let i = 0; i < indicesCount; ++i) {\n // indices is a 2d tensor with shape of [N, rank]\n const row = indices[i * rank];\n const offset = filledCount[row];\n const outputI = ((row === 0) ? 0 : csrOffset[row - 1]) + offset;\n filledCount[row]++; // Increment the filled count for this row.\n for (let j = 0; j < rank; ++j) {\n // indices and outputIndices are 2d tensors with shape of [N, rank]\n outputIndices[outputI * rank + j] = indices[i * rank + j];\n }\n outputValues[outputI] = values[i];\n // We'll need this reverse index map to backprop correctly.\n reverseIndexMap[i] = outputI;\n }\n // Fill in values for rows that are missing\n for (let row = 0; row < denseRows; ++row) {\n const rowCount = filledCount[row];\n if (rowCount === 0) { // We haven't filled this row\n const startingIndex = (row === 0) ? 0 : csrOffset[row - 1];\n // Remaining index values were set to zero already.\n // Just need to set the row index in the right location.\n // outputIndices is a 2d tensor with shape of [N, rank]\n outputIndices[startingIndex * rank + 0] = row;\n for (let col = 1; col < rank; ++col) {\n outputIndices[startingIndex * rank + col] = 0;\n }\n outputValues[startingIndex] = defaultValue;\n }\n }\n return [\n outputIndices, [fullIndicesCount, rank], outputValues, emptyRowIndicator,\n reverseIndexMap\n ];\n }\n}\n//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiU3BhcnNlRmlsbEVtcHR5Um93c19pbXBsLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vLi4vdGZqcy1iYWNrZW5kLWNwdS9zcmMva2VybmVscy9TcGFyc2VGaWxsRW1wdHlSb3dzX2ltcGwudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUE7Ozs7Ozs7Ozs7Ozs7OztHQWVHO0FBRUgsT0FBTyxFQUFDLFlBQVksRUFBd0IsSUFBSSxFQUFDLE1BQU0sdUJBQXVCLENBQUM7QUFFL0UsTUFBTSxVQUFVLHVCQUF1QixDQUNuQyxPQUFtQixFQUFFLFlBQXNCLEVBQUUsWUFBc0IsRUFDbkUsTUFBa0IsRUFBRSxXQUFxQixFQUFFLFVBQXNCLEVBQ2pFLFlBQW9CO0lBRXRCLE1BQU0sWUFBWSxHQUFHLFlBQVksQ0FBQyxDQUFDLENBQUMsQ0FBQztJQUNyQyxNQUFNLFNBQVMsR0FBRyxVQUFVLENBQUMsQ0FBQyxDQUFDLENBQUM7SUFFaEMsTUFBTSxpQkFBaUIsR0FBYyxJQUFJLEtBQUssQ0FBQyxTQUFTLENBQUMsQ0FBQztJQUMxRCxNQUFNLGVBQWUsR0FBYSxJQUFJLEtBQUssQ0FBQyxZQUFZLENBQUMsQ0FBQztJQUUxRCxNQUFNLElBQUksR0FBRyxZQUFZLENBQUMsQ0FBQyxDQUFDLENBQUM7SUFFN0IsSUFBSSxTQUFTLEtBQUssQ0FBQyxFQUFFO1FBQ25CLElBQUksWUFBWSxLQUFLLENBQUMsRUFBRTtZQUN0QixNQUFNLElBQUksS0FBSyxDQUNYLFlBQVksQ0FBQywrQ0FBK0MsQ0FDeEQsWUFBWSxDQUFDLENBQUMsQ0FBQztTQUN4QjtRQUNELE1BQU0sYUFBYSxHQUFHLElBQUksQ0FBQyxpQkFBaUIsQ0FBQyxZQUFZLEVBQUUsQ0FBQyxDQUFlLENBQUM7UUFDNUUsTUFBTSxZQUFZLEdBQUcsSUFBSSxDQUFDLGlCQUFpQixDQUFDLFdBQVcsRUFBRSxDQUFDLENBQWUsQ0FBQztRQUMxRSxPQUFPO1lBQ0wsYUFBYSxFQUFFLENBQUMsQ0FBQyxFQUFFLElBQUksQ0FBQyxFQUFFLFlBQVksRUFBRSxpQkFBaUIsRUFBRSxlQUFlO1NBQzNFLENBQUM7S0FDSDtJQUVELElBQUksY0FBYyxHQUFHLElBQUksQ0FBQztJQUMxQixJQUFJLGNBQWMsR0FBRyxDQUFDLENBQUM7SUFDdkIsTUFBTSxTQUFTLEdBQWEsSUFBSSxLQUFLLENBQUMsU0FBUyxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxDQUFDO0lBRXpELEtBQUssSUFBSSxDQUFDLEdBQUcsQ0FBQyxFQUFFLENBQUMsR0FBRyxZQUFZLEVBQUUsRUFBRSxDQUFDLEVBQUU7UUFDckMsaURBQWlEO1FBQ2pELE1BQU0sR0FBRyxHQUFHLE9BQU8sQ0FBQyxDQUFDLEdBQUcsSUFBSSxDQUFDLENBQUM7UUFDOUIsSUFBSSxHQUFHLEdBQUcsQ0FBQyxFQUFFO1lBQ1gsTUFBTSxJQUFJLEtBQUssQ0FDWCxZQUFZLENBQUMsK0NBQStDLENBQUMsQ0FBQyxFQUFFLEdBQUcsQ0FBQyxDQUFDLENBQUM7U0FDM0U7UUFDRCxJQUFJLEdBQUcsSUFBSSxTQUFTLEVBQUU7WUFDcEIsTUFBTSxJQUFJLEtBQUssQ0FDWCxZQUFZLENBQUMsaURBQWlELENBQzFELENBQUMsRUFBRSxHQUFHLEVBQUUsU0FBUyxDQUFDLENBQUMsQ0FBQztTQUM3QjtRQUNELEVBQUUsU0FBUyxDQUFDLEdBQUcsQ0FBQyxDQUFDO1FBQ2pCLGNBQWMsR0FBRyxjQUFjLElBQUksQ0FBQyxHQUFHLElBQUksY0FBYyxDQUFDLENBQUM7UUFDM0QsY0FBYyxHQUFHLEdBQUcsQ0FBQztLQUN0QjtJQUVELElBQUksV0FBVyxHQUFHLElBQUksQ0FBQztJQUN2QixLQUFLLElBQUksR0FBRyxHQUFHLENBQUMsRUFBRSxHQUFHLEdBQUcsU0FBUyxFQUFFLEVBQUUsR0FBRyxFQUFFO1FBQ3hDLG9FQUFvRTtRQUNwRSxNQUFNLFFBQVEsR0FBRyxDQUFDLFNBQVMsQ0FBQyxHQUFHLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQztRQUN4QyxpQkFBaUIsQ0FBQyxHQUFHLENBQUMsR0FBRyxRQUFRLENBQUM7UUFDbEMsV0FBVyxHQUFHLFdBQVcsSUFBSSxDQUFDLFFBQVEsQ0FBQztRQUN2Qyx3REFBd0Q7UUFDeEQsU0FBUyxDQUFDLEdBQUcsQ0FBQyxHQUFHLElBQUksQ0FBQyxHQUFHLENBQUMsU0FBUyxDQUFDLEdBQUcsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDO1FBQzdDLGlFQUFpRTtRQUNqRSwyQkFBMkI7UUFDM0Isd0NBQXdDO1FBQ3hDLCtEQUErRDtRQUMvRCxNQUFNO1FBQ04sNkRBQTZEO1FBQzdELElBQUksR0FBRyxHQUFHLENBQUMsRUFBRTtZQUNYLFNBQVMsQ0FBQyxHQUFHLENBQUMsSUFBSSxTQUFTLENBQUMsR0FBRyxHQUFHLENBQUMsQ0FBQyxDQUFDO1NBQ3RDO0tBQ0Y7SUFFRCxJQUFJLFdBQVcsSUFBSSxjQUFjLEVBQUU7UUFDakMsTUFBTSxhQUFhLEdBQWUsT0FBTyxDQUFDO1FBQzFDLE1BQU0sWUFBWSxHQUFlLE1BQU0sQ0FBQztRQUN4QyxLQUFLLElBQUksQ0FBQyxHQUFHLENBQUMsRUFBRSxDQUFDLEdBQUcsWUFBWSxFQUFFLEVBQUUsQ0FBQyxFQUFFO1lBQ3JDLGVBQWUsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUM7U0FDeEI7UUFDRCxPQUFPO1lBQ0wsYUFBYSxFQUFFLENBQUMsWUFBWSxFQUFFLElBQUksQ0FBQyxFQUFFLFlBQVksRUFBRSxpQkFBaUI7WUFDcEUsZUFBZTtTQUNoQixDQUFDO0tBQ0g7U0FBTTtRQUNMLE1BQU0sZ0JBQWdCLEdBQUcsU0FBUyxDQUFDLFNBQVMsR0FBRyxDQUFDLENBQUMsQ0FBQztRQUNsRCxNQUFNLGFBQWEsR0FDZixJQUFJLENBQUMsaUJBQWlCLENBQUMsWUFBWSxFQUFFLGdCQUFnQixHQUFHLElBQUksQ0FDbEQsQ0FBQztRQUNmLE1BQU0sWUFBWSxHQUNkLElBQUksQ0FBQyxpQkFBaUIsQ0FBQyxXQUFXLEVBQUUsZ0JBQWdCLENBQWUsQ0FBQztRQUN4RSxNQUFNLFdBQVcsR0FBYSxJQUFJLEtBQUssQ0FBQyxTQUFTLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUM7UUFFM0QsK0NBQStDO1FBQy9DLEtBQUssSUFBSSxDQUFDLEdBQUcsQ0FBQyxFQUFFLENBQUMsR0FBRyxZQUFZLEVBQUUsRUFBRSxDQUFDLEVBQUU7WUFDckMsaURBQWlEO1lBQ2pELE1BQU0sR0FBRyxHQUFHLE9BQU8sQ0FBQyxDQUFDLEdBQUcsSUFBSSxDQUFDLENBQUM7WUFDOUIsTUFBTSxNQUFNLEdBQUcsV0FBVyxDQUFDLEdBQUcsQ0FBQyxDQUFDO1lBQ2hDLE1BQU0sT0FBTyxHQUFHLENBQUMsQ0FBQyxHQUFHLEtBQUssQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsU0FBUyxDQUFDLEdBQUcsR0FBRyxDQUFDLENBQUMsQ0FBQyxHQUFHLE1BQU0sQ0FBQztZQUNoRSxXQUFXLENBQUMsR0FBRyxDQUFDLEVBQUUsQ0FBQyxDQUFFLDJDQUEyQztZQUNoRSxLQUFLLElBQUksQ0FBQyxHQUFHLENBQUMsRUFBRSxDQUFDLEdBQUcsSUFBSSxFQUFFLEVBQUUsQ0FBQyxFQUFFO2dCQUM3QixtRUFBbUU7Z0JBQ25FLGFBQWEsQ0FBQyxPQUFPLEdBQUcsSUFBSSxHQUFHLENBQUMsQ0FBQyxHQUFHLE9BQU8sQ0FBQyxDQUFDLEdBQUcsSUFBSSxHQUFHLENBQUMsQ0FBQyxDQUFDO2FBQzNEO1lBQ0QsWUFBWSxDQUFDLE9BQU8sQ0FBQyxHQUFHLE1BQU0sQ0FBQyxDQUFDLENBQUMsQ0FBQztZQUNsQywyREFBMkQ7WUFDM0QsZUFBZSxDQUFDLENBQUMsQ0FBQyxHQUFHLE9BQU8sQ0FBQztTQUM5QjtRQUVELDJDQUEyQztRQUMzQyxLQUFLLElBQUksR0FBRyxHQUFHLENBQUMsRUFBRSxHQUFHLEdBQUcsU0FBUyxFQUFFLEVBQUUsR0FBRyxFQUFFO1lBQ3hDLE1BQU0sUUFBUSxHQUFHLFdBQVcsQ0FBQyxHQUFHLENBQUMsQ0FBQztZQUNsQyxJQUFJLFFBQVEsS0FBSyxDQUFDLEVBQUUsRUFBRyw2QkFBNkI7Z0JBQ2xELE1BQU0sYUFBYSxHQUFHLENBQUMsR0FBRyxLQUFLLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLFNBQVMsQ0FBQyxHQUFHLEdBQUcsQ0FBQyxDQUFDLENBQUM7Z0JBQzNELG1EQUFtRDtnQkFDbkQsd0RBQXdEO2dCQUN4RCx1REFBdUQ7Z0JBQ3ZELGFBQWEsQ0FBQyxhQUFhLEdBQUcsSUFBSSxHQUFHLENBQUMsQ0FBQyxHQUFHLEdBQUcsQ0FBQztnQkFDOUMsS0FBSyxJQUFJLEdBQUcsR0FBRyxDQUFDLEVBQUUsR0FBRyxHQUFHLElBQUksRUFBRSxFQUFFLEdBQUcsRUFBRTtvQkFDbkMsYUFBYSxDQUFDLGFBQWEsR0FBRyxJQUFJLEdBQUcsR0FBRyxDQUFDLEdBQUcsQ0FBQyxDQUFDO2lCQUMvQztnQkFDRCxZQUFZLENBQUMsYUFBYSxDQUFDLEdBQUcsWUFBWSxDQUFDO2FBQzVDO1NBQ0Y7UUFDRCxPQUFPO1lBQ0wsYUFBYSxFQUFFLENBQUMsZ0JBQWdCLEVBQUUsSUFBSSxDQUFDLEVBQUUsWUFBWSxFQUFFLGlCQUFpQjtZQUN4RSxlQUFlO1NBQ2hCLENBQUM7S0FDSDtBQUNILENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyIvKipcbiAqIEBsaWNlbnNlXG4gKiBDb3B5cmlnaHQgMjAyMSBHb29nbGUgTExDLiBBbGwgUmlnaHRzIFJlc2VydmVkLlxuICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlIFwiTGljZW5zZVwiKTtcbiAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS5cbiAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdFxuICpcbiAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMFxuICpcbiAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmVcbiAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuIFwiQVMgSVNcIiBCQVNJUyxcbiAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLlxuICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZFxuICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuXG4gKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuICovXG5cbmltcG9ydCB7YmFja2VuZF91dGlsLCBEYXRhVHlwZSwgVHlwZWRBcnJheSwgdXRpbH0gZnJvbSAnQHRlbnNvcmZsb3cvdGZqcy1jb3JlJztcblxuZXhwb3J0IGZ1bmN0aW9uIHNwYXJzZUZpbGxFbXB0eVJvd3NJbXBsKFxuICAgIGluZGljZXM6IFR5cGVkQXJyYXksIGluZGljZXNTaGFwZTogbnVtYmVyW10sIGluZGljZXNEVHlwZTogRGF0YVR5cGUsXG4gICAgdmFsdWVzOiBUeXBlZEFycmF5LCB2YWx1ZXNEVHlwZTogRGF0YVR5cGUsIGRlbnNlU2hhcGU6IFR5cGVkQXJyYXksXG4gICAgZGVmYXVsdFZhbHVlOiBudW1iZXIpOlxuICAgIFtUeXBlZEFycmF5LCBudW1iZXJbXSwgVHlwZWRBcnJheSwgYm9vbGVhbltdLCBudW1iZXJbXV0ge1xuICBjb25zdCBpbmRpY2VzQ291bnQgPSBpbmRpY2VzU2hhcGVbMF07XG4gIGNvbnN0IGRlbnNlUm93cyA9IGRlbnNlU2hhcGVbMF07XG5cbiAgY29uc3QgZW1wdHlSb3dJbmRpY2F0b3I6IGJvb2xlYW5bXSA9IG5ldyBBcnJheShkZW5zZVJvd3MpO1xuICBjb25zdCByZXZlcnNlSW5kZXhNYXA6IG51bWJlcltdID0gbmV3IEFycmF5KGluZGljZXNDb3VudCk7XG5cbiAgY29uc3QgcmFuayA9IGluZGljZXNTaGFwZVsxXTtcblxuICBpZiAoZGVuc2VSb3dzID09PSAwKSB7XG4gICAgaWYgKGluZGljZXNDb3VudCAhPT0gMCkge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKFxuICAgICAgICAgIGJhY2tlbmRfdXRpbC5nZXRTcGFyc2VGaWxsRW1wdHlSb3dzSW5kaWNlc0RlbnNlU2hhcGVNaXNtYXRjaChcbiAgICAgICAgICAgICAgaW5kaWNlc0NvdW50KSk7XG4gICAgfVxuICAgIGNvbnN0IG91dHB1dEluZGljZXMgPSB1dGlsLmdldEFycmF5RnJvbURUeXBlKGluZGljZXNEVHlwZSwgMCkgYXMgVHlwZWRBcnJheTtcbiAgICBjb25zdCBvdXRwdXRWYWx1ZXMgPSB1dGlsLmdldEFycmF5RnJvbURUeXBlKHZhbHVlc0RUeXBlLCAwKSBhcyBUeXBlZEFycmF5O1xuICAgIHJldHVybiBbXG4gICAgICBvdXRwdXRJbmRpY2VzLCBbMCwgcmFua10sIG91dHB1dFZhbHVlcywgZW1wdHlSb3dJbmRpY2F0b3IsIHJldmVyc2VJbmRleE1hcFxuICAgIF07XG4gIH1cblxuICBsZXQgcm93c0FyZU9yZGVyZWQgPSB0cnVlO1xuICBsZXQgbGFzdEluZGljZXNSb3cgPSAwO1xuICBjb25zdCBjc3JPZmZzZXQ6IG51bWJlcltdID0gbmV3IEFycmF5KGRlbnNlUm93cykuZmlsbCgwKTtcblxuICBmb3IgKGxldCBpID0gMDsgaSA8IGluZGljZXNDb3VudDsgKytpKSB7XG4gICAgLy8gaW5kaWNlcyBpcyBhIDJkIHRlbnNvciB3aXRoIHNoYXBlIG9mIFtOLCByYW5rXVxuICAgIGNvbnN0IHJvdyA9IGluZGljZXNbaSAqIHJhbmtdO1xuICAgIGlmIChyb3cgPCAwKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoXG4gICAgICAgICAgYmFja2VuZF91dGlsLmdldFNwYXJzZUZpbGxFbXB0eVJvd3NOZWdhdGl2ZUluZGV4RXJyb3JNZXNzYWdlKGksIHJvdykpO1xuICAgIH1cbiAgICBpZiAocm93ID49IGRlbnNlUm93cykge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKFxuICAgICAgICAgIGJhY2tlbmRfdXRpbC5nZXRTcGFyc2VGaWxsRW1wdHlSb3dzT3V0T2ZSYW5nZUluZGV4RXJyb3JNZXNzYWdlKFxuICAgICAgICAgICAgICBpLCByb3csIGRlbnNlUm93cykpO1xuICAgIH1cbiAgICArK2Nzck9mZnNldFtyb3ddO1xuICAgIHJvd3NBcmVPcmRlcmVkID0gcm93c0FyZU9yZGVyZWQgJiYgKHJvdyA+PSBsYXN0SW5kaWNlc1Jvdyk7XG4gICAgbGFzdEluZGljZXNSb3cgPSByb3c7XG4gIH1cblxuICBsZXQgYWxsUm93c0Z1bGwgPSB0cnVlO1xuICBmb3IgKGxldCByb3cgPSAwOyByb3cgPCBkZW5zZVJvd3M7ICsrcm93KSB7XG4gICAgLy8gY3NyT2Zmc2V0IGhlcmUgZGVzY3JpYmVzIHRoZSBudW1iZXIgb2YgZWxlbWVudHMgaW4gdGhpcyBkZW5zZSByb3dcbiAgICBjb25zdCByb3dFbXB0eSA9IChjc3JPZmZzZXRbcm93XSA9PT0gMCk7XG4gICAgZW1wdHlSb3dJbmRpY2F0b3Jbcm93XSA9IHJvd0VtcHR5O1xuICAgIGFsbFJvd3NGdWxsID0gYWxsUm93c0Z1bGwgJiYgIXJvd0VtcHR5O1xuICAgIC8vIEluIGZpbGxlZCB2ZXJzaW9uLCBlYWNoIHJvdyBoYXMgYXQgbGVhc3Qgb25lIGVsZW1lbnQuXG4gICAgY3NyT2Zmc2V0W3Jvd10gPSBNYXRoLm1heChjc3JPZmZzZXRbcm93XSwgMSk7XG4gICAgLy8gVXBkYXRlIGNzck9mZnNldCB0byByZXByZXNlbnQgdGhlIG51bWJlciBvZiBlbGVtZW50cyB1cCB0byBhbmRcbiAgICAvLyBpbmNsdWRpbmcgZGVuc2VSb3dzICsgMTpcbiAgICAvLyAgY3NyT2Zmc2V0WzBdID09ICN7ZWxlbWVudHMgb2Ygcm93IDB9XG4gICAgLy8gIGNzck9mZnNldFsxXSA9PSAje2VsZW1lbnRzIG9mIHJvdyAxfSArICN7ZWxlbWVudHMgb2Ygcm93IDB9XG4gICAgLy8gIC4uXG4gICAgLy8gIGNzck9mZnNldFtpXSA9PSBzdGFydGluZyBpbmRleCBmb3IgZWxlbWVudHMgaW4gcm93IGkgKyAxLlxuICAgIGlmIChyb3cgPiAwKSB7XG4gICAgICBjc3JPZmZzZXRbcm93XSArPSBjc3JPZmZzZXRbcm93IC0gMV07XG4gICAgfVxuICB9XG5cbiAgaWYgKGFsbFJvd3NGdWxsICYmIHJvd3NBcmVPcmRlcmVkKSB7XG4gICAgY29uc3Qgb3V0cHV0SW5kaWNlczogVHlwZWRBcnJheSA9IGluZGljZXM7XG4gICAgY29uc3Qgb3V0cHV0VmFsdWVzOiBUeXBlZEFycmF5ID0gdmFsdWVzO1xuICAgIGZvciAobGV0IGkgPSAwOyBpIDwgaW5kaWNlc0NvdW50OyArK2kpIHtcbiAgICAgIHJldmVyc2VJbmRleE1hcFtpXSA9IGk7XG4gICAgfVxuICAgIHJldHVybiBbXG4gICAgICBvdXRwdXRJbmRpY2VzLCBbaW5kaWNlc0NvdW50LCByYW5rXSwgb3V0cHV0VmFsdWVzLCBlbXB0eVJvd0luZGljYXRvcixcbiAgICAgIHJldmVyc2VJbmRleE1hcFxuICAgIF07XG4gIH0gZWxzZSB7XG4gICAgY29uc3QgZnVsbEluZGljZXNDb3VudCA9IGNzck9mZnNldFtkZW5zZVJvd3MgLSAxXTtcbiAgICBjb25zdCBvdXRwdXRJbmRpY2VzID1cbiAgICAgICAgdXRpbC5nZXRBcnJheUZyb21EVHlwZShpbmRpY2VzRFR5cGUsIGZ1bGxJbmRpY2VzQ291bnQgKiByYW5rKSBhc1xuICAgICAgICBUeXBlZEFycmF5O1xuICAgIGNvbnN0IG91dHB1dFZhbHVlcyA9XG4gICAgICAgIHV0aWwuZ2V0QXJyYXlGcm9tRFR5cGUodmFsdWVzRFR5cGUsIGZ1bGxJbmRpY2VzQ291bnQpIGFzIFR5cGVkQXJyYXk7XG4gICAgY29uc3QgZmlsbGVkQ291bnQ6IG51bWJlcltdID0gbmV3IEFycmF5KGRlbnNlUm93cykuZmlsbCgwKTtcblxuICAgIC8vIEZpbGwgaW4gdmFsdWVzIGZvciByb3dzIHRoYXQgYXJlIG5vdCBtaXNzaW5nXG4gICAgZm9yIChsZXQgaSA9IDA7IGkgPCBpbmRpY2VzQ291bnQ7ICsraSkge1xuICAgICAgLy8gaW5kaWNlcyBpcyBhIDJkIHRlbnNvciB3aXRoIHNoYXBlIG9mIFtOLCByYW5rXVxuICAgICAgY29uc3Qgcm93ID0gaW5kaWNlc1tpICogcmFua107XG4gICAgICBjb25zdCBvZmZzZXQgPSBmaWxsZWRDb3VudFtyb3ddO1xuICAgICAgY29uc3Qgb3V0cHV0SSA9ICgocm93ID09PSAwKSA/IDAgOiBjc3JPZmZzZXRbcm93IC0gMV0pICsgb2Zmc2V0O1xuICAgICAgZmlsbGVkQ291bnRbcm93XSsrOyAgLy8gSW5jcmVtZW50IHRoZSBmaWxsZWQgY291bnQgZm9yIHRoaXMgcm93LlxuICAgICAgZm9yIChsZXQgaiA9IDA7IGogPCByYW5rOyArK2opIHtcbiAgICAgICAgLy8gaW5kaWNlcyBhbmQgb3V0cHV0SW5kaWNlcyBhcmUgMmQgdGVuc29ycyB3aXRoIHNoYXBlIG9mIFtOLCByYW5rXVxuICAgICAgICBvdXRwdXRJbmRpY2VzW291dHB1dEkgKiByYW5rICsgal0gPSBpbmRpY2VzW2kgKiByYW5rICsgal07XG4gICAgICB9XG4gICAgICBvdXRwdXRWYWx1ZXNbb3V0cHV0SV0gPSB2YWx1ZXNbaV07XG4gICAgICAvLyBXZSdsbCBuZWVkIHRoaXMgcmV2ZXJzZSBpbmRleCBtYXAgdG8gYmFja3Byb3AgY29ycmVjdGx5LlxuICAgICAgcmV2ZXJzZUluZGV4TWFwW2ldID0gb3V0cHV0STtcbiAgICB9XG5cbiAgICAvLyBGaWxsIGluIHZhbHVlcyBmb3Igcm93cyB0aGF0IGFyZSBtaXNzaW5nXG4gICAgZm9yIChsZXQgcm93ID0gMDsgcm93IDwgZGVuc2VSb3dzOyArK3Jvdykge1xuICAgICAgY29uc3Qgcm93Q291bnQgPSBmaWxsZWRDb3VudFtyb3ddO1xuICAgICAgaWYgKHJvd0NvdW50ID09PSAwKSB7ICAvLyBXZSBoYXZlbid0IGZpbGxlZCB0aGlzIHJvd1xuICAgICAgICBjb25zdCBzdGFydGluZ0luZGV4ID0gKHJvdyA9PT0gMCkgPyAwIDogY3NyT2Zmc2V0W3JvdyAtIDFdO1xuICAgICAgICAvLyBSZW1haW5pbmcgaW5kZXggdmFsdWVzIHdlcmUgc2V0IHRvIHplcm8gYWxyZWFkeS5cbiAgICAgICAgLy8gSnVzdCBuZWVkIHRvIHNldCB0aGUgcm93IGluZGV4IGluIHRoZSByaWdodCBsb2NhdGlvbi5cbiAgICAgICAgLy8gb3V0cHV0SW5kaWNlcyBpcyBhIDJkIHRlbnNvciB3aXRoIHNoYXBlIG9mIFtOLCByYW5rXVxuICAgICAgICBvdXRwdXRJbmRpY2VzW3N0YXJ0aW5nSW5kZXggKiByYW5rICsgMF0gPSByb3c7XG4gICAgICAgIGZvciAobGV0IGNvbCA9IDE7IGNvbCA8IHJhbms7ICsrY29sKSB7XG4gICAgICAgICAgb3V0cHV0SW5kaWNlc1tzdGFydGluZ0luZGV4ICogcmFuayArIGNvbF0gPSAwO1xuICAgICAgICB9XG4gICAgICAgIG91dHB1dFZhbHVlc1tzdGFydGluZ0luZGV4XSA9IGRlZmF1bHRWYWx1ZTtcbiAgICAgIH1cbiAgICB9XG4gICAgcmV0dXJuIFtcbiAgICAgIG91dHB1dEluZGljZXMsIFtmdWxsSW5kaWNlc0NvdW50LCByYW5rXSwgb3V0cHV0VmFsdWVzLCBlbXB0eVJvd0luZGljYXRvcixcbiAgICAgIHJldmVyc2VJbmRleE1hcFxuICAgIF07XG4gIH1cbn1cbiJdfQ==","/**\n * @license\n * Copyright 2021 Google LLC. All Rights Reserved.\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n * =============================================================================\n */\nimport { SparseFillEmptyRows } from '@tensorflow/tfjs-core';\nimport { sparseFillEmptyRowsImpl } from './SparseFillEmptyRows_impl';\nexport function sparseFillEmptyRows(args) {\n const { inputs, backend } = args;\n const { indices, values, denseShape, defaultValue } = inputs;\n if (denseShape.shape.length !== 1) {\n throw new Error(`Dense shape must be a vector, saw:\n ${denseShape.shape}`);\n }\n if (indices.shape.length !== 2) {\n throw new Error(`Indices must be a matrix, saw:\n ${indices.shape}`);\n }\n if (values.shape.length !== 1) {\n throw new Error(`Values must be a vector, saw:\n ${values.shape}`);\n }\n if (defaultValue.shape.length !== 0) {\n throw new Error(`Default value must be a scalar, saw:\n ${defaultValue.shape}`);\n }\n const $indices = backend.data.get(indices.dataId).values;\n const $values = backend.data.get(values.dataId).values;\n const $denseShape = backend.data.get(denseShape.dataId).values;\n const $defaultValue = backend.data.get(defaultValue.dataId).values[0];\n const [outputIndices, outputIndicesShape, outputValues, emptyRowIndicator, reverseIndexMap] = sparseFillEmptyRowsImpl($indices, indices.shape, indices.dtype, $values, values.dtype, $denseShape, $defaultValue);\n return [\n backend.makeTensorInfo(outputIndicesShape, indices.dtype, outputIndices),\n backend.makeTensorInfo([outputIndicesShape[0]], values.dtype, outputValues),\n backend.makeTensorInfo([emptyRowIndicator.length], 'bool', new Uint8Array(emptyRowIndicator.map((value) => Number(value)))),\n backend.makeTensorInfo([reverseIndexMap.length], indices.dtype, new Int32Array(reverseIndexMap)),\n ];\n}\nexport const sparseFillEmptyRowsConfig = {\n kernelName: SparseFillEmptyRows,\n backendName: 'cpu',\n kernelFunc: sparseFillEmptyRows,\n};\n//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiU3BhcnNlRmlsbEVtcHR5Um93cy5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uLy4uL3RmanMtYmFja2VuZC1jcHUvc3JjL2tlcm5lbHMvU3BhcnNlRmlsbEVtcHR5Um93cy50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQTs7Ozs7Ozs7Ozs7Ozs7O0dBZUc7QUFFSCxPQUFPLEVBQTJCLG1CQUFtQixFQUFvRCxNQUFNLHVCQUF1QixDQUFDO0FBSXZJLE9BQU8sRUFBQyx1QkFBdUIsRUFBQyxNQUFNLDRCQUE0QixDQUFDO0FBRW5FLE1BQU0sVUFBVSxtQkFBbUIsQ0FBQyxJQUduQztJQUNDLE1BQU0sRUFBQyxNQUFNLEVBQUUsT0FBTyxFQUFDLEdBQUcsSUFBSSxDQUFDO0lBQy9CLE1BQU0sRUFBQyxPQUFPLEVBQUUsTUFBTSxFQUFFLFVBQVUsRUFBRSxZQUFZLEVBQUMsR0FBRyxNQUFNLENBQUM7SUFDM0QsSUFBSSxVQUFVLENBQUMsS0FBSyxDQUFDLE1BQU0sS0FBSyxDQUFDLEVBQUU7UUFDakMsTUFBTSxJQUFJLEtBQUssQ0FBQztVQUNWLFVBQVUsQ0FBQyxLQUFLLEVBQUUsQ0FBQyxDQUFDO0tBQzNCO0lBQ0QsSUFBSSxPQUFPLENBQUMsS0FBSyxDQUFDLE1BQU0sS0FBSyxDQUFDLEVBQUU7UUFDOUIsTUFBTSxJQUFJLEtBQUssQ0FBQztVQUNWLE9BQU8sQ0FBQyxLQUFLLEVBQUUsQ0FBQyxDQUFDO0tBQ3hCO0lBQ0QsSUFBSSxNQUFNLENBQUMsS0FBSyxDQUFDLE1BQU0sS0FBSyxDQUFDLEVBQUU7UUFDN0IsTUFBTSxJQUFJLEtBQUssQ0FBQztVQUNWLE1BQU0sQ0FBQyxLQUFLLEVBQUUsQ0FBQyxDQUFDO0tBQ3ZCO0lBQ0QsSUFBSSxZQUFZLENBQUMsS0FBSyxDQUFDLE1BQU0sS0FBSyxDQUFDLEVBQUU7UUFDbkMsTUFBTSxJQUFJLEtBQUssQ0FBQztVQUNWLFlBQVksQ0FBQyxLQUFLLEVBQUUsQ0FBQyxDQUFDO0tBQzdCO0lBRUQsTUFBTSxRQUFRLEdBQUcsT0FBTyxDQUFDLElBQUksQ0FBQyxHQUFHLENBQUMsT0FBTyxDQUFDLE1BQU0sQ0FBQyxDQUFDLE1BQW9CLENBQUM7SUFDdkUsTUFBTSxPQUFPLEdBQUcsT0FBTyxDQUFDLElBQUksQ0FBQyxHQUFHLENBQUMsTUFBTSxDQUFDLE1BQU0sQ0FBQyxDQUFDLE1BQW9CLENBQUM7SUFDckUsTUFBTSxXQUFXLEdBQUcsT0FBTyxDQUFDLElBQUksQ0FBQyxHQUFHLENBQUMsVUFBVSxDQUFDLE1BQU0sQ0FBQyxDQUFDLE1BQW9CLENBQUM7SUFDN0UsTUFBTSxhQUFhLEdBQ2YsT0FBTyxDQUFDLElBQUksQ0FBQyxHQUFHLENBQUMsWUFBWSxDQUFDLE1BQU0sQ0FBQyxDQUFDLE1BQU0sQ0FBQyxDQUFDLENBQVcsQ0FBQztJQUU5RCxNQUFNLENBQUMsYUFBYSxFQUFFLGtCQUFrQixFQUFFLFlBQVksRUFDL0MsaUJBQWlCLEVBQUUsZUFBZSxDQUFDLEdBQ3RDLHVCQUF1QixDQUNuQixRQUFRLEVBQUUsT0FBTyxDQUFDLEtBQUssRUFBRSxPQUFPLENBQUMsS0FBSyxFQUFFLE9BQU8sRUFBRSxNQUFNLENBQUMsS0FBSyxFQUM3RCxXQUFXLEVBQUUsYUFBYSxDQUFDLENBQUM7SUFDcEMsT0FBTztRQUNMLE9BQU8sQ0FBQyxjQUFjLENBQUMsa0JBQWtCLEVBQUUsT0FBTyxDQUFDLEtBQUssRUFBRSxhQUFhLENBQUM7UUFDeEUsT0FBTyxDQUFDLGNBQWMsQ0FDbEIsQ0FBQyxrQkFBa0IsQ0FBQyxDQUFDLENBQUMsQ0FBQyxFQUFFLE1BQU0sQ0FBQyxLQUFLLEVBQUUsWUFBWSxDQUFDO1FBQ3hELE9BQU8sQ0FBQyxjQUFjLENBQ2xCLENBQUMsaUJBQWlCLENBQUMsTUFBTSxDQUFDLEVBQUUsTUFBTSxFQUNsQyxJQUFJLFVBQVUsQ0FDVixpQkFBaUIsQ0FBQyxHQUFHLENBQUMsQ0FBQyxLQUFjLEVBQUUsRUFBRSxDQUFDLE1BQU0sQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDLENBQUM7UUFDbEUsT0FBTyxDQUFDLGNBQWMsQ0FDbEIsQ0FBQyxlQUFlLENBQUMsTUFBTSxDQUFDLEVBQUUsT0FBTyxDQUFDLEtBQUssRUFDdkMsSUFBSSxVQUFVLENBQUMsZUFBZSxDQUFDLENBQUM7S0FDckMsQ0FBQztBQUNKLENBQUM7QUFFRCxNQUFNLENBQUMsTUFBTSx5QkFBeUIsR0FBaUI7SUFDckQsVUFBVSxFQUFFLG1CQUFtQjtJQUMvQixXQUFXLEVBQUUsS0FBSztJQUNsQixVQUFVLEVBQUUsbUJBQXVDO0NBQ3BELENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyIvKipcbiAqIEBsaWNlbnNlXG4gKiBDb3B5cmlnaHQgMjAyMSBHb29nbGUgTExDLiBBbGwgUmlnaHRzIFJlc2VydmVkLlxuICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlIFwiTGljZW5zZVwiKTtcbiAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS5cbiAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdFxuICpcbiAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMFxuICpcbiAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmVcbiAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuIFwiQVMgSVNcIiBCQVNJUyxcbiAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLlxuICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZFxuICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuXG4gKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuICovXG5cbmltcG9ydCB7S2VybmVsQ29uZmlnLCBLZXJuZWxGdW5jLCBTcGFyc2VGaWxsRW1wdHlSb3dzLCBTcGFyc2VGaWxsRW1wdHlSb3dzSW5wdXRzLCBUZW5zb3JJbmZvLCBUeXBlZEFycmF5fSBmcm9tICdAdGVuc29yZmxvdy90ZmpzLWNvcmUnO1xuXG5pbXBvcnQge01hdGhCYWNrZW5kQ1BVfSBmcm9tICcuLi9iYWNrZW5kX2NwdSc7XG5cbmltcG9ydCB7c3BhcnNlRmlsbEVtcHR5Um93c0ltcGx9IGZyb20gJy4vU3BhcnNlRmlsbEVtcHR5Um93c19pbXBsJztcblxuZXhwb3J0IGZ1bmN0aW9uIHNwYXJzZUZpbGxFbXB0eVJvd3MoYXJnczoge1xuICBpbnB1dHM6IFNwYXJzZUZpbGxFbXB0eVJvd3NJbnB1dHMsXG4gIGJhY2tlbmQ6IE1hdGhCYWNrZW5kQ1BVXG59KTogW1RlbnNvckluZm8sIFRlbnNvckluZm8sIFRlbnNvckluZm8sIFRlbnNvckluZm9dIHtcbiAgY29uc3Qge2lucHV0cywgYmFja2VuZH0gPSBhcmdzO1xuICBjb25zdCB7aW5kaWNlcywgdmFsdWVzLCBkZW5zZVNoYXBlLCBkZWZhdWx0VmFsdWV9ID0gaW5wdXRzO1xuICBpZiAoZGVuc2VTaGFwZS5zaGFwZS5sZW5ndGggIT09IDEpIHtcbiAgICB0aHJvdyBuZXcgRXJyb3IoYERlbnNlIHNoYXBlIG11c3QgYmUgYSB2ZWN0b3IsIHNhdzpcbiAgICAgICAgJHtkZW5zZVNoYXBlLnNoYXBlfWApO1xuICB9XG4gIGlmIChpbmRpY2VzLnNoYXBlLmxlbmd0aCAhPT0gMikge1xuICAgIHRocm93IG5ldyBFcnJvcihgSW5kaWNlcyBtdXN0IGJlIGEgbWF0cml4LCBzYXc6XG4gICAgICAgICR7aW5kaWNlcy5zaGFwZX1gKTtcbiAgfVxuICBpZiAodmFsdWVzLnNoYXBlLmxlbmd0aCAhPT0gMSkge1xuICAgIHRocm93IG5ldyBFcnJvcihgVmFsdWVzIG11c3QgYmUgYSB2ZWN0b3IsIHNhdzpcbiAgICAgICAgJHt2YWx1ZXMuc2hhcGV9YCk7XG4gIH1cbiAgaWYgKGRlZmF1bHRWYWx1ZS5zaGFwZS5sZW5ndGggIT09IDApIHtcbiAgICB0aHJvdyBuZXcgRXJyb3IoYERlZmF1bHQgdmFsdWUgbXVzdCBiZSBhIHNjYWxhciwgc2F3OlxuICAgICAgICAke2RlZmF1bHRWYWx1ZS5zaGFwZX1gKTtcbiAgfVxuXG4gIGNvbnN0ICRpbmRpY2VzID0gYmFja2VuZC5kYXRhLmdldChpbmRpY2VzLmRhdGFJZCkudmFsdWVzIGFzIFR5cGVkQXJyYXk7XG4gIGNvbnN0ICR2YWx1ZXMgPSBiYWNrZW5kLmRhdGEuZ2V0KHZhbHVlcy5kYXRhSWQpLnZhbHVlcyBhcyBUeXBlZEFycmF5O1xuICBjb25zdCAkZGVuc2VTaGFwZSA9IGJhY2tlbmQuZGF0YS5nZXQoZGVuc2VTaGFwZS5kYXRhSWQpLnZhbHVlcyBhcyBUeXBlZEFycmF5O1xuICBjb25zdCAkZGVmYXVsdFZhbHVlID1cbiAgICAgIGJhY2tlbmQuZGF0YS5nZXQoZGVmYXVsdFZhbHVlLmRhdGFJZCkudmFsdWVzWzBdIGFzIG51bWJlcjtcblxuICBjb25zdCBbb3V0cHV0SW5kaWNlcywgb3V0cHV0SW5kaWNlc1NoYXBlLCBvdXRwdXRWYWx1ZXMsXG4gICAgICAgICBlbXB0eVJvd0luZGljYXRvciwgcmV2ZXJzZUluZGV4TWFwXSA9XG4gICAgICBzcGFyc2VGaWxsRW1wdHlSb3dzSW1wbChcbiAgICAgICAgICAkaW5kaWNlcywgaW5kaWNlcy5zaGFwZSwgaW5kaWNlcy5kdHlwZSwgJHZhbHVlcywgdmFsdWVzLmR0eXBlLFxuICAgICAgICAgICRkZW5zZVNoYXBlLCAkZGVmYXVsdFZhbHVlKTtcbiAgcmV0dXJuIFtcbiAgICBiYWNrZW5kLm1ha2VUZW5zb3JJbmZvKG91dHB1dEluZGljZXNTaGFwZSwgaW5kaWNlcy5kdHlwZSwgb3V0cHV0SW5kaWNlcyksXG4gICAgYmFja2VuZC5tYWtlVGVuc29ySW5mbyhcbiAgICAgICAgW291dHB1dEluZGljZXNTaGFwZVswXV0sIHZhbHVlcy5kdHlwZSwgb3V0cHV0VmFsdWVzKSxcbiAgICBiYWNrZW5kLm1ha2VUZW5zb3JJbmZvKFxuICAgICAgICBbZW1wdHlSb3dJbmRpY2F0b3IubGVuZ3RoXSwgJ2Jvb2wnLFxuICAgICAgICBuZXcgVWludDhBcnJheShcbiAgICAgICAgICAgIGVtcHR5Um93SW5kaWNhdG9yLm1hcCgodmFsdWU6IGJvb2xlYW4pID0+IE51bWJlcih2YWx1ZSkpKSksXG4gICAgYmFja2VuZC5tYWtlVGVuc29ySW5mbyhcbiAgICAgICAgW3JldmVyc2VJbmRleE1hcC5sZW5ndGhdLCBpbmRpY2VzLmR0eXBlLFxuICAgICAgICBuZXcgSW50MzJBcnJheShyZXZlcnNlSW5kZXhNYXApKSxcbiAgXTtcbn1cblxuZXhwb3J0IGNvbnN0IHNwYXJzZUZpbGxFbXB0eVJvd3NDb25maWc6IEtlcm5lbENvbmZpZyA9IHtcbiAga2VybmVsTmFtZTogU3BhcnNlRmlsbEVtcHR5Um93cyxcbiAgYmFja2VuZE5hbWU6ICdjcHUnLFxuICBrZXJuZWxGdW5jOiBzcGFyc2VGaWxsRW1wdHlSb3dzIGFzIHt9IGFzIEtlcm5lbEZ1bmMsXG59O1xuIl19","/**\n * @license\n * Copyright 2021 Google LLC. All Rights Reserved.\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n * =============================================================================\n */\nimport { backend_util, util } from '@tensorflow/tfjs-core';\nexport function sparseReshapeImpl(inputIndices, inputIndicesShape, inputDType, inputShape, targetShape) {\n const denseSize = util.sizeFromShape(inputShape);\n const nnz = inputIndicesShape[0];\n const outputRank = targetShape.length;\n // Compute the output shape. Determine product of specified dimensions, and\n // find the index of the unspecified one.\n const outputShape = [];\n let product = 1;\n let unknownIndex = -1;\n for (let d = 0; d < outputRank; ++d) {\n const size = targetShape[d];\n if (size === -1) {\n if (unknownIndex !== -1) {\n throw new Error(backend_util\n .getSparseReshapeMultipleNegativeOneOutputDimErrorMessage(unknownIndex, d));\n }\n unknownIndex = d;\n outputShape.push(1);\n }\n else {\n if (size < 0) {\n throw new Error(backend_util.getSparseReshapeNegativeOutputDimErrorMessage(d, size));\n }\n product *= size;\n outputShape.push(size);\n }\n }\n if (unknownIndex !== -1) {\n if (product <= 0) {\n throw new Error(backend_util.getSparseReshapeEmptyTensorZeroOutputDimErrorMessage());\n }\n const missing = Math.trunc(denseSize / product);\n if (product * missing !== denseSize) {\n throw new Error(backend_util.getSparseReshapeInputOutputMultipleErrorMessage(inputShape, outputShape));\n }\n outputShape[unknownIndex] = missing;\n }\n const outputSize = util.sizeFromShape(outputShape);\n if (outputSize !== denseSize) {\n throw new Error(backend_util.getSparseReshapeInputOutputMismatchErrorMessage(inputShape, outputShape));\n }\n const inputRank = inputShape.length;\n const inputStrides = [];\n if (inputRank > 0) {\n inputStrides[inputRank - 1] = 1;\n for (let d = inputRank - 2; d >= 0; --d) {\n inputStrides[d] = inputStrides[d + 1] * inputShape[d + 1];\n }\n }\n const outputStrides = [];\n if (outputRank > 0) {\n outputStrides[outputRank - 1] = 1;\n for (let d = outputRank - 2; d >= 0; --d) {\n outputStrides[d] = outputStrides[d + 1] * outputShape[d + 1];\n }\n }\n const newIndices = util.getArrayFromDType(inputDType, nnz * outputRank);\n for (let i = 0; i < nnz; ++i) {\n let id = 0;\n for (let j = 0; j < inputRank; ++j) {\n // inputIndices is a 2d tensor with shape of [nnz, inputRank]\n id += inputIndices[i * inputRank + j] * inputStrides[j];\n }\n for (let j = 0; j < outputRank; ++j) {\n // newIndices is a 2d tensor with shape of [nnz, outputRank]\n newIndices[i * outputRank + j] = Math.trunc(id / outputStrides[j]);\n id %= outputStrides[j];\n }\n }\n return [newIndices, [nnz, outputRank], outputShape];\n}\n//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiU3BhcnNlUmVzaGFwZV9pbXBsLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vLi4vdGZqcy1iYWNrZW5kLWNwdS9zcmMva2VybmVscy9TcGFyc2VSZXNoYXBlX2ltcGwudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUE7Ozs7Ozs7Ozs7Ozs7OztHQWVHO0FBRUgsT0FBTyxFQUFDLFlBQVksRUFBd0IsSUFBSSxFQUFDLE1BQU0sdUJBQXVCLENBQUM7QUFFL0UsTUFBTSxVQUFVLGlCQUFpQixDQUM3QixZQUF3QixFQUFFLGlCQUEyQixFQUFFLFVBQW9CLEVBQzNFLFVBQW9CLEVBQ3BCLFdBQXFCO0lBQ3ZCLE1BQU0sU0FBUyxHQUFHLElBQUksQ0FBQyxhQUFhLENBQUMsVUFBVSxDQUFDLENBQUM7SUFDakQsTUFBTSxHQUFHLEdBQUcsaUJBQWlCLENBQUMsQ0FBQyxDQUFDLENBQUM7SUFDakMsTUFBTSxVQUFVLEdBQUcsV0FBVyxDQUFDLE1BQU0sQ0FBQztJQUV0QywyRUFBMkU7SUFDM0UseUNBQXlDO0lBQ3pDLE1BQU0sV0FBVyxHQUFhLEVBQUUsQ0FBQztJQUNqQyxJQUFJLE9BQU8sR0FBRyxDQUFDLENBQUM7SUFDaEIsSUFBSSxZQUFZLEdBQUcsQ0FBQyxDQUFDLENBQUM7SUFDdEIsS0FBSyxJQUFJLENBQUMsR0FBRyxDQUFDLEVBQUUsQ0FBQyxHQUFHLFVBQVUsRUFBRSxFQUFFLENBQUMsRUFBRTtRQUNuQyxNQUFNLElBQUksR0FBRyxXQUFXLENBQUMsQ0FBQyxDQUFDLENBQUM7UUFDNUIsSUFBSSxJQUFJLEtBQUssQ0FBQyxDQUFDLEVBQUU7WUFDZixJQUFJLFlBQVksS0FBSyxDQUFDLENBQUMsRUFBRTtnQkFDdkIsTUFBTSxJQUFJLEtBQUssQ0FDWCxZQUFZO3FCQUNQLHdEQUF3RCxDQUNyRCxZQUFZLEVBQUUsQ0FBQyxDQUFDLENBQUMsQ0FBQzthQUMvQjtZQUNELFlBQVksR0FBRyxDQUFDLENBQUM7WUFDakIs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LEdBQUcsQ0FBQyxFQUFFLENBQUMsR0FBRyxVQUFVLEVBQUUsRUFBRSxDQUFDLEVBQUU7WUFDbkMsNERBQTREO1lBQzVELFVBQVUsQ0FBQyxDQUFDLEdBQUcsVUFBVSxHQUFHLENBQUMsQ0FBQyxHQUFHLElBQUksQ0FBQyxLQUFLLENBQUMsRUFBRSxHQUFHLGFBQWEsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDO1lBQ25FLEVBQUUsSUFBSSxhQUFhLENBQUMsQ0FBQyxDQUFDLENBQUM7U0FDeEI7S0FDRjtJQUNELE9BQU8sQ0FBQyxVQUFVLEVBQUUsQ0FBQyxHQUFHLEVBQUUsVUFBVSxDQUFDLEVBQUUsV0FBVyxDQUFDLENBQUM7QUFDdEQsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbIi8qKlxuICogQGxpY2Vuc2VcbiAqIENvcHlyaWdodCAyMDIxIEdvb2dsZSBMTEMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuXG4gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgXCJMaWNlbnNlXCIpO1xuICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLlxuICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0XG4gKlxuICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wXG4gKlxuICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZVxuICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gXCJBUyBJU1wiIEJBU0lTLFxuICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuXG4gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kXG4gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS5cbiAqID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4gKi9cblxuaW1wb3J0IHtiYWNrZW5kX3V0aWwsIERhdGFUeXBlLCBUeXBlZEFycmF5LCB1dGlsfSBmcm9tICdAdGVuc29yZmxvdy90ZmpzLWNvcmUnO1xuXG5leHBvcnQgZnVuY3Rpb24gc3BhcnNlUmVzaGFwZUltcGwoXG4gICAgaW5wdXRJbmRpY2VzOiBUeXBlZEFycmF5LCBpbnB1dEluZGljZXNTaGFwZTogbnVtYmVyW10sIGlucHV0RFR5cGU6IERhdGFUeXBlLFxuICAgIGlucHV0U2hhcGU6IG51bWJlcltdLFxuICAgIHRhcmdldFNoYXBlOiBudW1iZXJbXSk6IFtUeXBlZEFycmF5LCBudW1iZXJbXSwgbnVtYmVyW11dIHtcbiAgY29uc3QgZGVuc2VTaXplID0gdXRpbC5zaXplRnJvbVNoYXBlKGlucHV0U2hhcGUpO1xuICBjb25zdCBubnogPSBpbnB1dEluZGljZXNTaGFwZVswXTtcbiAgY29uc3Qgb3V0cHV0UmFuayA9IHRhcmdldFNoYXBlLmxlbmd0aDtcblxuICAvLyBDb21wdXRlIHRoZSBvdXRwdXQgc2hhcGUuIERldGVybWluZSBwcm9kdWN0IG9mIHNwZWNpZmllZCBkaW1lbnNpb25zLCBhbmRcbiAgLy8gZmluZCB0aGUgaW5kZXggb2YgdGhlIHVuc3BlY2lmaWVkIG9uZS5cbiAgY29uc3Qgb3V0cHV0U2hhcGU6IG51bWJlcltdID0gW107XG4gIGxldCBwcm9kdWN0ID0gMTtcbiAgbGV0IHVua25vd25JbmRleCA9IC0xO1xuICBmb3IgKGxldCBkID0gMDsgZCA8IG91dHB1dFJhbms7ICsrZCkge1xuICAgIGNvbnN0IHNpemUgPSB0YXJnZXRTaGFwZVtkXTtcbiAgICBpZiAoc2l6ZSA9PT0gLTEpIHtcbiAgICAgIGlmICh1bmtub3duSW5kZXggIT09IC0xKSB7XG4gICAgICAgIHRocm93IG5ldyBFcnJvcihcbiAgICAgICAgICAgIGJhY2tlbmRfdXRpbFxuICAgICAgICAgICAgICAgIC5nZXRTcGFyc2VSZXNoYXBlTXVsdGlwbGVOZWdhdGl2ZU9uZU91dHB1dERpbUVycm9yTWVzc2FnZShcbiAgICAgICAgICAgICAgICAgICAgdW5rbm93bkluZGV4LCBkKSk7XG4gICAgICB9XG4gICAgICB1bmtub3duSW5kZXggPSBkO1xuICAgICAgb3V0cHV0U2hhcGUucHVzaCgxKTtcbiAgICB9IGVsc2Uge1xuICAgICAgaWYgKHNpemUgPCAwKSB7XG4gICAgICAgIHRocm93IG5ldyBFcnJvcihcbiAgICAgICAgICAgIGJhY2tlbmRfdXRpbC5nZXRTcGFyc2VSZXNoYXBlTmVnYXRpdmVPdXRwdXREaW1FcnJvck1lc3NhZ2UoXG4gICAgICAgICAgICAgICAgZCwgc2l6ZSkpO1xuICAgICAgfVxuICAgICAgcHJvZHVjdCAqPSBzaXplO1xuICAgICAgb3V0cHV0U2hhcGUucHVzaChzaXplKTtcbiAgICB9XG4gIH1cbiAgaWYgKHVua25vd25JbmRleCAhPT0gLTEpIHtcbiAgICBpZiAocHJvZHVjdCA8PSAwKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoXG4gICAgICAgICAgYmFja2VuZF91dGlsLmdldFNwYXJzZVJlc2hhcGVFbXB0eVRlbnNvclplcm9PdXRwdXREaW1FcnJvck1lc3NhZ2UoKSk7XG4gICAgfVxuICAgIGNvbnN0IG1pc3NpbmcgPSBNYXRoLnRydW5jKGRlbnNlU2l6ZSAvIHByb2R1Y3QpO1xuICAgIGlmIChwcm9kdWN0ICogbWlzc2luZyAhPT0gZGVuc2VTaXplKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoXG4gICAgICAgICAgYmFja2VuZF91dGlsLmdldFNwYXJzZVJlc2hhcGVJbnB1dE91dHB1dE11bHRpcGxlRXJyb3JNZXNzYWdlKFxuICAgICAgICAgICAgICBpbnB1dFNoYXBlLCBvdXRwdXRTaGFwZSkpO1xuICAgIH1cblxuICAgIG91dHB1dFNoYXBlW3Vua25vd25JbmRleF0gPSBtaXNzaW5nO1xuICB9XG4gIGNvbnN0IG91dHB1dFNpemUgPSB1dGlsLnNpemVGcm9tU2hhcGUob3V0cHV0U2hhcGUpO1xuICBpZiAob3V0cHV0U2l6ZSAhPT0gZGVuc2VTaXplKSB7XG4gICAgdGhyb3cgbmV3IEVycm9yKFxuICAgICAgICBiYWNrZW5kX3V0aWwuZ2V0U3BhcnNlUmVzaGFwZUlucHV0T3V0cHV0TWlzbWF0Y2hFcnJvck1lc3NhZ2UoXG4gICAgICAgICAgICBpbnB1dFNoYXBlLCBvdXRwdXRTaGFwZSkpO1xuICB9XG5cbiAgY29uc3QgaW5wdXRSYW5rID0gaW5wdXRTaGFwZS5sZW5ndGg7XG4gIGNvbnN0IGlucHV0U3RyaWRlczogbnVtYmVyW10gPSBbXTtcbiAgaWYgKGlucHV0UmFuayA+IDApIHtcbiAgICBpbnB1dFN0cmlkZXNbaW5wdXRSYW5rIC0gMV0gPSAxO1xuICAgIGZvciAobGV0IGQgPSBpbnB1dFJhbmsgLSAyOyBkID49IDA7IC0tZCkge1xuICAgICAgaW5wdXRTdHJpZGVzW2RdID0gaW5wdXRTdHJpZGVzW2QgKyAxXSAqIGlucHV0U2hhcGVbZCArIDFdO1xuICAgIH1cbiAgfVxuXG4gIGNvbnN0IG91dHB1dFN0cmlkZXM6IG51bWJlcltdID0gW107XG4gIGlmIChvdXRwdXRSYW5rID4gMCkge1xuICAgIG91dHB1dFN0cmlkZXNbb3V0cHV0UmFuayAtIDFdID0gMTtcbiAgICBmb3IgKGxldCBkID0gb3V0cHV0UmFuayAtIDI7IGQgPj0gMDsgLS1kKSB7XG4gICAgICBvdXRwdXRTdHJpZGVzW2RdID0gb3V0cHV0U3RyaWRlc1tkICsgMV0gKiBvdXRwdXRTaGFwZVtkICsgMV07XG4gICAgfVxuICB9XG5cbiAgY29uc3QgbmV3SW5kaWNlcyA9XG4gICAgICB1dGlsLmdldEFycmF5RnJvbURUeXBlKGlucHV0RFR5cGUsIG5ueiAqIG91dHB1dFJhbmspIGFzIFR5cGVkQXJyYXk7XG4gIGZvciAobGV0IGkgPSAwOyBpIDwgbm56OyArK2kpIHtcbiAgICBsZXQgaWQgPSAwO1xuICAgIGZvciAobGV0IGogPSAwOyBqIDwgaW5wdXRSYW5rOyArK2opIHtcbiAgICAgIC8vIGlucHV0SW5kaWNlcyBpcyBhIDJkIHRlbnNvciB3aXRoIHNoYXBlIG9mIFtubnosIGlucHV0UmFua11cbiAgICAgIGlkICs9IGlucHV0SW5kaWNlc1tpICogaW5wdXRSYW5rICsgal0gKiBpbnB1dFN0cmlkZXNbal07XG4gICAgfVxuICAgIGZvciAobGV0IGogPSAwOyBqIDwgb3V0cHV0UmFuazsgKytqKSB7XG4gICAgICAvLyBuZXdJbmRpY2VzIGlzIGEgMmQgdGVuc29yIHdpdGggc2hhcGUgb2YgW25ueiwgb3V0cHV0UmFua11cbiAgICAgIG5ld0luZGljZXNbaSAqIG91dHB1dFJhbmsgKyBqXSA9IE1hdGgudHJ1bmMoaWQgLyBvdXRwdXRTdHJpZGVzW2pdKTtcbiAgICAgIGlkICU9IG91dHB1dFN0cmlkZXNbal07XG4gICAgfVxuICB9XG4gIHJldHVybiBbbmV3SW5kaWNlcywgW25ueiwgb3V0cHV0UmFua10sIG91dHB1dFNoYXBlXTtcbn1cbiJdfQ==","/**\n * @license\n * Copyright 2021 Google LLC. All Rights Reserved.\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n * =============================================================================\n */\nimport { SparseReshape } from '@tensorflow/tfjs-core';\nimport { sparseReshapeImpl } from './SparseReshape_impl';\nexport function sparseReshape(args) {\n const { inputs, backend } = args;\n const { inputIndices, inputShape, newShape } = inputs;\n if (inputIndices.shape.length !== 2) {\n throw new Error(`Input indices should be a matrix but received shape\n ${inputIndices.shape}`);\n }\n if (inputShape.shape.length !== 1) {\n throw new Error(`Input shape should be a vector but received shape\n ${inputShape.shape}`);\n }\n if (newShape.shape.length !== 1) {\n throw new Error(`Target shape should be a vector but received shape ${newShape.shape}`);\n }\n const $inputShape = Array.from(backend.data.get(inputShape.dataId).values);\n const $inputIndices = backend.data.get(inputIndices.dataId).values;\n const targetShape = Array.from(backend.data.get(newShape.dataId).values);\n const [newIndices, indicesShape, outputShape] = sparseReshapeImpl($inputIndices, inputIndices.shape, inputIndices.dtype, $inputShape, targetShape);\n return [\n backend.makeTensorInfo(indicesShape, inputIndices.dtype, newIndices),\n backend.makeTensorInfo([outputShape.length], newShape.dtype, new Int32Array(outputShape)),\n ];\n}\nexport const sparseReshapeConfig = {\n kernelName: SparseReshape,\n backendName: 'cpu',\n kernelFunc: sparseReshape,\n};\n//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiU3BhcnNlUmVzaGFwZS5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uLy4uL3RmanMtYmFja2VuZC1jcHUvc3JjL2tlcm5lbHMvU3BhcnNlUmVzaGFwZS50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQTs7Ozs7Ozs7Ozs7Ozs7O0dBZUc7QUFFSCxPQUFPLEVBQWUsYUFBYSxFQUE4QyxNQUFNLHVCQUF1QixDQUFDO0FBSS9HLE9BQU8sRUFBQyxpQkFBaUIsRUFBQyxNQUFNLHNCQUFzQixDQUFDO0FBRXZELE1BQU0sVUFBVSxhQUFhLENBQ3pCLElBQTREO0lBRTlELE1BQU0sRUFBQyxNQUFNLEVBQUUsT0FBTyxFQUFDLEdBQUcsSUFBSSxDQUFDO0lBQy9CLE1BQU0sRUFBQyxZQUFZLEVBQUUsVUFBVSxFQUFFLFFBQVEsRUFBQyxHQUFHLE1BQU0sQ0FBQztJQUNwRCxJQUFJLFlBQVksQ0FBQyxLQUFLLENBQUMsTUFBTSxLQUFLLENBQUMsRUFBRTtRQUNuQyxNQUFNLElBQUksS0FBSyxDQUFDO1VBQ1YsWUFBWSxDQUFDLEtBQUssRUFBRSxDQUFDLENBQUM7S0FDN0I7SUFDRCxJQUFJLFVBQVUsQ0FBQyxLQUFLLENBQUMsTUFBTSxLQUFLLENBQUMsRUFBRTtRQUNqQyxNQUFNLElBQUksS0FBSyxDQUFDO1VBQ1YsVUFBVSxDQUFDLEtBQUssRUFBRSxDQUFDLENBQUM7S0FDM0I7SUFFRCxJQUFJLFFBQVEsQ0FBQyxLQUFLLENBQUMsTUFBTSxLQUFLLENBQUMsRUFBRTtRQUMvQixNQUFNLElBQUksS0FBSyxDQUNYLHNEQUFzRCxRQUFRLENBQUMsS0FBSyxFQUFFLENBQUMsQ0FBQztLQUM3RTtJQUVELE1BQU0sV0FBVyxHQUNiLEtBQUssQ0FBQyxJQUFJLENBQUMsT0FBTyxDQUFDLElBQUksQ0FBQyxHQUFHLENBQUMsVUFBVSxDQUFDLE1BQU0sQ0FBQyxDQUFDLE1BQW9CLENBQUMsQ0FBQztJQUN6RSxNQUFNLGFBQWEsR0FDZixPQUFPLENBQUMsSUFBSSxDQUFDLEdBQUcsQ0FBQyxZQUFZLENBQUMsTUFBTSxDQUFDLENBQUMsTUFBb0IsQ0FBQztJQUMvRCxNQUFNLFdBQVcsR0FDYixLQUFLLENBQUMsSUFBSSxDQUFDLE9BQU8sQ0FBQyxJQUFJLENBQUMsR0FBRyxDQUFDLFFBQVEsQ0FBQyxNQUFNLENBQUMsQ0FBQyxNQUFvQixDQUFDLENBQUM7SUFFdkUsTUFBTSxDQUFDLFVBQVUsRUFBRSxZQUFZLEVBQUUsV0FBVyxDQUFDLEdBQUcsaUJBQWlCLENBQzdELGFBQWEsRUFBRSxZQUFZLENBQUMsS0FBSyxFQUFFLFlBQVksQ0FBQyxLQUFLLEVBQUUsV0FBVyxFQUNsRSxXQUFXLENBQUMsQ0FBQztJQUNqQixPQUFPO1FBQ0wsT0FBTyxDQUFDLGNBQWMsQ0FBQyxZQUFZLEVBQUUsWUFBWSxDQUFDLEtBQUssRUFBRSxVQUFVLENBQUM7UUFDcEUsT0FBTyxDQUFDLGNBQWMsQ0FDbEIsQ0FBQyxXQUFXLENBQUMsTUFBTSxDQUFDLEVBQUUsUUFBUSxDQUFDLEtBQUssRUFBRSxJQUFJLFVBQVUsQ0FBQyxXQUFXLENBQUMsQ0FBQztLQUN2RSxDQUFDO0FBQ0osQ0FBQztBQUVELE1BQU0sQ0FBQyxNQUFNLG1CQUFtQixHQUFpQjtJQUMvQyxVQUFVLEVBQUUsYUFBYTtJQUN6QixXQUFXLEVBQUUsS0FBSztJQUNsQixVQUFVLEVBQUUsYUFBYTtDQUMxQixDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiLyoqXG4gKiBAbGljZW5zZVxuICogQ29weXJpZ2h0IDIwMjEgR29vZ2xlIExMQy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC5cbiAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSBcIkxpY2Vuc2VcIik7XG4gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuXG4gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXRcbiAqXG4gKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjBcbiAqXG4gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlXG4gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiBcIkFTIElTXCIgQkFTSVMsXG4gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC5cbiAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmRcbiAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLlxuICogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbiAqL1xuXG5pbXBvcnQge0tlcm5lbENvbmZpZywgU3BhcnNlUmVzaGFwZSwgU3BhcnNlUmVzaGFwZUlucHV0cywgVGVuc29ySW5mbywgVHlwZWRBcnJheX0gZnJvbSAnQHRlbnNvcmZsb3cvdGZqcy1jb3JlJztcblxuaW1wb3J0IHtNYXRoQmFja2VuZENQVX0gZnJvbSAnLi4vYmFja2VuZF9jcHUnO1xuXG5pbXBvcnQge3NwYXJzZVJlc2hhcGVJbXBsfSBmcm9tICcuL1NwYXJzZVJlc2hhcGVfaW1wbCc7XG5cbmV4cG9ydCBmdW5jdGlvbiBzcGFyc2VSZXNoYXBlKFxuICAgIGFyZ3M6IHtpbnB1dHM6IFNwYXJzZVJlc2hhcGVJbnB1dHMsIGJhY2tlbmQ6IE1hdGhCYWNrZW5kQ1BVfSk6XG4gICAgW1RlbnNvckluZm8sIFRlbnNvckluZm9dIHtcbiAgY29uc3Qge2lucHV0cywgYmFja2VuZH0gPSBhcmdzO1xuICBjb25zdCB7aW5wdXRJbmRpY2VzLCBpbnB1dFNoYXBlLCBuZXdTaGFwZX0gPSBpbnB1dHM7XG4gIGlmIChpbnB1dEluZGljZXMuc2hhcGUubGVuZ3RoICE9PSAyKSB7XG4gICAgdGhyb3cgbmV3IEVycm9yKGBJbnB1dCBpbmRpY2VzIHNob3VsZCBiZSBhIG1hdHJpeCBidXQgcmVjZWl2ZWQgc2hhcGVcbiAgICAgICAgJHtpbnB1dEluZGljZXMuc2hhcGV9YCk7XG4gIH1cbiAgaWYgKGlucHV0U2hhcGUuc2hhcGUubGVuZ3RoICE9PSAxKSB7XG4gICAgdGhyb3cgbmV3IEVycm9yKGBJbnB1dCBzaGFwZSBzaG91bGQgYmUgYSB2ZWN0b3IgYnV0IHJlY2VpdmVkIHNoYXBlXG4gICAgICAgICR7aW5wdXRTaGFwZS5zaGFwZX1gKTtcbiAgfVxuXG4gIGlmIChuZXdTaGFwZS5zaGFwZS5sZW5ndGggIT09IDEpIHtcbiAgICB0aHJvdyBuZXcgRXJyb3IoXG4gICAgICAgIGBUYXJnZXQgc2hhcGUgc2hvdWxkIGJlIGEgdmVjdG9yIGJ1dCByZWNlaXZlZCBzaGFwZSAke25ld1NoYXBlLnNoYXBlfWApO1xuICB9XG5cbiAgY29uc3QgJGlucHV0U2hhcGUgPVxuICAgICAgQXJyYXkuZnJvbShiYWNrZW5kLmRhdGEuZ2V0KGlucHV0U2hhcGUuZGF0YUlkKS52YWx1ZXMgYXMgVHlwZWRBcnJheSk7XG4gIGNvbnN0ICRpbnB1dEluZGljZXMgPVxuICAgICAgYmFja2VuZC5kYXRhLmdldChpbnB1dEluZGljZXMuZGF0YUlkKS52YWx1ZXMgYXMgVHlwZWRBcnJheTtcbiAgY29uc3QgdGFyZ2V0U2hhcGUgPVxuICAgICAgQXJyYXkuZnJvbShiYWNrZW5kLmRhdGEuZ2V0KG5ld1NoYXBlLmRhdGFJZCkudmFsdWVzIGFzIFR5cGVkQXJyYXkpO1xuXG4gIGNvbnN0IFtuZXdJbmRpY2VzLCBpbmRpY2VzU2hhcGUsIG91dHB1dFNoYXBlXSA9IHNwYXJzZVJlc2hhcGVJbXBsKFxuICAgICAgJGlucHV0SW5kaWNlcywgaW5wdXRJbmRpY2VzLnNoYXBlLCBpbnB1dEluZGljZXMuZHR5cGUsICRpbnB1dFNoYXBlLFxuICAgICAgdGFyZ2V0U2hhcGUpO1xuICByZXR1cm4gW1xuICAgIGJhY2tlbmQubWFrZVRlbnNvckluZm8oaW5kaWNlc1NoYXBlLCBpbnB1dEluZGljZXMuZHR5cGUsIG5ld0luZGljZXMpLFxuICAgIGJhY2tlbmQubWFrZVRlbnNvckluZm8oXG4gICAgICAgIFtvdXRwdXRTaGFwZS5sZW5ndGhdLCBuZXdTaGFwZS5kdHlwZSwgbmV3IEludDMyQXJyYXkob3V0cHV0U2hhcGUpKSxcbiAgXTtcbn1cblxuZXhwb3J0IGNvbnN0IHNwYXJzZVJlc2hhcGVDb25maWc6IEtlcm5lbENvbmZpZyA9IHtcbiAga2VybmVsTmFtZTogU3BhcnNlUmVzaGFwZSxcbiAgYmFja2VuZE5hbWU6ICdjcHUnLFxuICBrZXJuZWxGdW5jOiBzcGFyc2VSZXNoYXBlLFxufTtcbiJdfQ==","/**\n * @license\n * Copyright 2021 Google LLC. All Rights Reserved.\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n * =============================================================================\n */\nimport { backend_util, util } from '@tensorflow/tfjs-core';\nexport function sparseSegmentReductionImpl(input, inputShape, inputDType, indices, segmentIds, isMean = false, defaultValue = 0) {\n const numIndices = indices.length;\n // Flatten the array to two dimensions\n const inputFlat = [inputShape[0], input.length / inputShape[0]];\n const numCol = inputFlat[1];\n // Note that the current implementation assumes that segmentIds values are\n // sorted.\n const lastSegmentIdPlusOne = numIndices > 0 ? segmentIds[numIndices - 1] + 1 : 0;\n const outputRows = lastSegmentIdPlusOne;\n if (outputRows < 0) {\n throw new Error(backend_util.getSparseSegmentReductionNegativeSegmentIdsErrorMessage());\n }\n const outputShape = inputShape.slice();\n outputShape[0] = outputRows;\n const outputLength = outputShape.reduce((product, value) => product * value, 1);\n // Output array is initialized with the value 0 by default.\n const output = util.getArrayFromDType(inputDType, outputLength);\n // Note that we do not initialize the output buffer with a default value, so\n // we need to explicitly set missing indices to the default value.\n if (numIndices === 0) {\n if (outputRows > 0) {\n output.fill(defaultValue);\n }\n return [output, outputShape];\n }\n if (outputRows <= 0) {\n throw new Error(backend_util.getSparseSegmentReductionNegativeSegmentIdsErrorMessage());\n }\n let start = 0, end = 1;\n // Index from which the output is not initialized.\n let uninitializedIndex = 0;\n let outIndex = segmentIds[start];\n while (true) {\n // We initialize nextIndex to 0 to avoid may be uninitialized warning\n let nextIndex = 0;\n if (end < numIndices) {\n nextIndex = segmentIds[end];\n if (outIndex === nextIndex) {\n ++end;\n continue;\n }\n // We have a new segment here. Verify that the segment ids are growing.\n if (outIndex >= nextIndex) {\n throw new Error(backend_util\n .getSparseSegmentReductionNonIncreasingSegmentIdsErrorMessage());\n }\n }\n if (outIndex < 0 || outIndex >= outputRows) {\n throw new Error(backend_util.getSparseSegmentReductionSegmentIdOutOfRangeErrorMessage(outIndex, outputRows));\n }\n // If there is a gap between two indices, we need to set that gap to the\n // default value.\n if (outIndex > uninitializedIndex) {\n output.fill(defaultValue, uninitializedIndex * numCol, outIndex * numCol);\n }\n for (let i = start; i < end; ++i) {\n const index = indices[i];\n if (index < 0 || index >= inputFlat[0]) {\n throw new Error(backend_util.getSparseSegmentReductionIndicesOutOfRangeErrorMessage(i, indices[i], inputFlat[0]));\n }\n for (let j = 0; j < numCol; j++) {\n output[outIndex * numCol + j] += input[index * numCol + j];\n }\n }\n if (isMean) {\n for (let j = 0; j < numCol; j++) {\n output[outIndex * numCol + j] /= end - start;\n }\n }\n start = end;\n ++end;\n uninitializedIndex = outIndex + 1;\n outIndex = nextIndex;\n if (end > numIndices) {\n break;\n }\n }\n // Fill the gap at the end with the default value.\n if (uninitializedIndex < outputRows) {\n output.fill(defaultValue, uninitializedIndex * numCol, outputRows * numCol);\n }\n return [output, outputShape];\n}\n//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiU3BhcnNlU2VnbWVudFJlZHVjdGlvbl9pbXBsLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vLi4vdGZqcy1iYWNrZW5kLWNwdS9zcmMva2VybmVscy9TcGFyc2VTZWdtZW50UmVkdWN0aW9uX2ltcGwudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUE7Ozs7Ozs7Ozs7Ozs7OztHQWVHO0FBRUgsT0FBTyxFQUFDLFlBQVksRUFBd0IsSUFBSSxFQUFDLE1BQU0sdUJBQXVCLENBQUM7QUFFL0UsTUFBTSxVQUFVLDBCQUEwQixDQUN0QyxLQUFpQixFQUFFLFVBQW9CLEVBQUUsVUFBb0IsRUFDN0QsT0FBbUIsRUFBRSxVQUFzQixFQUFFLE1BQU0sR0FBRyxLQUFLLEVBQzNELFlBQVksR0FBRyxDQUFDO0lBQ2xCLE1BQU0sVUFBVSxHQUFHLE9BQU8sQ0FBQyxNQUFNLENBQUM7SUFFbEMsc0NBQXNDO0lBQ3RDLE1BQU0sU0FBUyxHQUFhLENBQUMsVUFBVSxDQUFDLENBQUMsQ0FBQyxFQUFFLEtBQUssQ0FBQyxNQUFNLEdBQUcsVUFBVSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUM7SUFDMUUsTUFBTSxNQUFNLEdBQUcsU0FBUyxDQUFDLENBQUMsQ0FBQyxDQUFDO0lBQzVCLDBFQUEwRTtJQUMxRSxVQUFVO0lBQ1YsTUFBTSxvQkFBb0IsR0FDdEIsVUFBVSxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsVUFBVSxDQUFDLFVBQVUsR0FBRyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQztJQUN4RCxNQUFNLFVBQVUsR0FBRyxvQkFBb0IsQ0FBQztJQUV4QyxJQUFJLFVBQVUsR0FBRyxDQUFDLEVBQUU7UUFDbEIsTUFBTSxJQUFJLEtBQUssQ0FDWCxZQUFZLENBQUMsdURBQXVELEVBQUUsQ0FBQyxDQUFDO0tBQzdFO0lBRUQsTUFBTSxXQUFXLEdBQUcsVUFBVSxDQUFDLEtBQUssRUFBRSxDQUFDO0lB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LE1BQU0sRUFBRSxDQUFDLEVBQUUsRUFBRTtnQkFDL0IsTUFBTSxDQUFDLFFBQVEsR0FBRyxNQUFNLEdBQUcsQ0FBQyxDQUFDLElBQUksR0FBRyxHQUFHLEtBQUssQ0FBQzthQUM5QztTQUNGO1FBRUQsS0FBSyxHQUFHLEdBQUcsQ0FBQztRQUNaLEVBQUUsR0FBRyxDQUFDO1FBQ04sa0JBQWtCLEdBQUcsUUFBUSxHQUFHLENBQUMsQ0FBQztRQUNsQyxRQUFRLEdBQUcsU0FBUyxDQUFDO1FBQ3JCLElBQUksR0FBRyxHQUFHLFVBQVUsRUFBRTtZQUNwQixNQUFNO1NBQ1A7S0FDRjtJQUVELGtEQUFrRDtJQUNsRCxJQUFJLGtCQUFrQixHQUFHLFVBQVUsRUFBRTtRQUNuQyxNQUFNLENBQUMsSUFBSSxDQUFDLFlBQVksRUFBRSxrQkFBa0IsR0FBRyxNQUFNLEVBQUUsVUFBVSxHQUFHLE1BQU0sQ0FBQyxDQUFDO0tBQzdFO0lBRUQsT0FBTyxDQUFDLE1BQU0sRUFBRSxXQUFXLENBQUMsQ0FBQztBQUMvQixDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiLyoqXG4gKiBAbGljZW5zZVxuICogQ29weXJpZ2h0IDIwMjEgR29vZ2xlIExMQy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC5cbiAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSBcIkxpY2Vuc2VcIik7XG4gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuXG4gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXRcbiAqXG4gKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjBcbiAqXG4gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlXG4gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiBcIkFTIElTXCIgQkFTSVMsXG4gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC5cbiAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmRcbiAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLlxuICogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbiAqL1xuXG5pbXBvcnQge2JhY2tlbmRfdXRpbCwgRGF0YVR5cGUsIFR5cGVkQXJyYXksIHV0aWx9IGZyb20gJ0B0ZW5zb3JmbG93L3RmanMtY29yZSc7XG5cbmV4cG9ydCBmdW5jdGlvbiBzcGFyc2VTZWdtZW50UmVkdWN0aW9uSW1wbChcbiAgICBpbnB1dDogVHlwZWRBcnJheSwgaW5wdXRTaGFwZTogbnVtYmVyW10sIGlucHV0RFR5cGU6IERhdGFUeXBlLFxuICAgIGluZGljZXM6IFR5cGVkQXJyYXksIHNlZ21lbnRJZHM6IFR5cGVkQXJyYXksIGlzTWVhbiA9IGZhbHNlLFxuICAgIGRlZmF1bHRWYWx1ZSA9IDApOiBbVHlwZWRBcnJheSwgbnVtYmVyW11dIHtcbiAgY29uc3QgbnVtSW5kaWNlcyA9IGluZGljZXMubGVuZ3RoO1xuXG4gIC8vIEZsYXR0ZW4gdGhlIGFycmF5IHRvIHR3byBkaW1lbnNpb25zXG4gIGNvbnN0IGlucHV0RmxhdDogbnVtYmVyW10gPSBbaW5wdXRTaGFwZVswXSwgaW5wdXQubGVuZ3RoIC8gaW5wdXRTaGFwZVswXV07XG4gIGNvbnN0IG51bUNvbCA9IGlucHV0RmxhdFsxXTtcbiAgLy8gTm90ZSB0aGF0IHRoZSBjdXJyZW50IGltcGxlbWVudGF0aW9uIGFzc3VtZXMgdGhhdCBzZWdtZW50SWRzIHZhbHVlcyBhcmVcbiAgLy8gc29ydGVkLlxuICBjb25zdCBsYXN0U2VnbWVudElkUGx1c09uZSA9XG4gICAgICBudW1JbmRpY2VzID4gMCA/IHNlZ21lbnRJZHNbbnVtSW5kaWNlcyAtIDFdICsgMSA6IDA7XG4gIGNvbnN0IG91dHB1dFJvd3MgPSBsYXN0U2VnbWVudElkUGx1c09uZTtcblxuICBpZiAob3V0cHV0Um93cyA8IDApIHtcbiAgICB0aHJvdyBuZXcgRXJyb3IoXG4gICAgICAgIGJhY2tlbmRfdXRpbC5nZXRTcGFyc2VTZWdtZW50UmVkdWN0aW9uTmVnYXRpdmVTZWdtZW50SWRzRXJyb3JNZXNzYWdlKCkpO1xuICB9XG5cbiAgY29uc3Qgb3V0cHV0U2hhcGUgPSBpbnB1dFNoYXBlLnNsaWNlKCk7XG4gIG91dHB1dFNoYXBlWzBdID0gb3V0cHV0Um93cztcblxuICBjb25zdCBvdXRwdXRMZW5ndGggPVxuICAgICAgb3V0cHV0U2hhcGUucmVkdWNlKChwcm9kdWN0LCB2YWx1ZSkgPT4gcHJvZHVjdCAqIHZhbHVlLCAxKTtcbiAgLy8gT3V0cHV0IGFycmF5IGlzIGluaXRpYWxpemVkIHdpdGggdGhlIHZhbHVlIDAgYnkgZGVmYXVsdC5cbiAgY29uc3Qgb3V0cHV0ID0gdXRpbC5nZXRBcnJheUZyb21EVHlwZShpbnB1dERUeXBlLCBvdXRwdXRMZW5ndGgpIGFzIFR5cGVkQXJyYXk7XG5cbiAgLy8gTm90ZSB0aGF0IHdlIGRvIG5vdCBpbml0aWFsaXplIHRoZSBvdXRwdXQgYnVmZmVyIHdpdGggYSBkZWZhdWx0IHZhbHVlLCBzb1xuICAvLyB3ZSBuZWVkIHRvIGV4cGxpY2l0bHkgc2V0IG1pc3NpbmcgaW5kaWNlcyB0byB0aGUgZGVmYXVsdCB2YWx1ZS5cbiAgaWYgKG51bUluZGljZXMgPT09IDApIHtcbiAgICBpZiAob3V0cHV0Um93cyA+IDApIHtcbiAgICAgIG91dHB1dC5maWxsKGRlZmF1bHRWYWx1ZSk7XG4gICAgfVxuICAgIHJldHVybiBbb3V0cHV0LCBvdXRwdXRTaGFwZV07XG4gIH1cblxuICBpZiAob3V0cHV0Um93cyA8PSAwKSB7XG4gICAgdGhyb3cgbmV3IEVycm9yKFxuICAgICAgICBiYWNrZW5kX3V0aWwuZ2V0U3BhcnNlU2VnbWVudFJlZHVjdGlvbk5lZ2F0aXZlU2VnbWVudElkc0Vycm9yTWVzc2FnZSgpKTtcbiAgfVxuXG4gIGxldCBzdGFydCA9IDAsIGVuZCA9IDE7XG4gIC8vIEluZGV4IGZyb20gd2hpY2ggdGhlIG91dHB1dCBpcyBub3QgaW5pdGlhbGl6ZWQuXG4gIGxldCB1bmluaXRpYWxpemVkSW5kZXggPSAwO1xuICBsZXQgb3V0SW5kZXggPSBzZWdtZW50SWRzW3N0YXJ0XTtcblxuICB3aGlsZSAodHJ1ZSkge1xuICAgIC8vIFdlIGluaXRpYWxpemUgbmV4dEluZGV4IHRvIDAgdG8gYXZvaWQgbWF5IGJlIHVuaW5pdGlhbGl6ZWQgd2FybmluZ1xuICAgIGxldCBuZXh0SW5kZXggPSAwO1xuICAgIGlmIChlbmQgPCBudW1JbmRpY2VzKSB7XG4gICAgICBuZXh0SW5kZXggPSBzZWdtZW50SWRzW2VuZF07XG4gICAgICBpZiAob3V0SW5kZXggPT09IG5leHRJbmRleCkge1xuICAgICAgICArK2VuZDtcbiAgICAgICAgY29udGludWU7XG4gICAgICB9XG4gICAgICAvLyBXZSBoYXZlIGEgbmV3IHNlZ21lbnQgaGVyZS4gIFZlcmlmeSB0aGF0IHRoZSBzZWdtZW50IGlkcyBhcmUgZ3Jvd2luZy5cbiAgICAgIGlmIChvdXRJbmRleCA+PSBuZXh0SW5kZXgpIHtcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKGJhY2tlbmRfdXRpbFxuICAgICAgICAgICAgLmdldFNwYXJzZVNlZ21lbnRSZWR1Y3Rpb25Ob25JbmNyZWFzaW5nU2VnbWVudElkc0Vycm9yTWVzc2FnZSgpKTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICBpZiAob3V0SW5kZXggPCAwIHx8IG91dEluZGV4ID49IG91dHB1dFJvd3MpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcihcbiAgICAgICAgICBiYWNrZW5kX3V0aWwuZ2V0U3BhcnNlU2VnbWVudFJlZHVjdGlvblNlZ21lbnRJZE91dE9mUmFuZ2VFcnJvck1lc3NhZ2UoXG4gICAgICAgICAgICAgIG91dEluZGV4LCBvdXRwdXRSb3dzKSk7XG4gICAgfVxuXG4gICAgLy8gSWYgdGhlcmUgaXMgYSBnYXAgYmV0d2VlbiB0d28gaW5kaWNlcywgd2UgbmVlZCB0byBzZXQgdGhhdCBnYXAgdG8gdGhlXG4gICAgLy8gZGVmYXVsdCB2YWx1ZS5cbiAgICBpZiAob3V0SW5kZXggPiB1bmluaXRpYWxpemVkSW5kZXgpIHtcbiAgICAgIG91dHB1dC5maWxsKGRlZmF1bHRWYWx1ZSwgdW5pbml0aWFsaXplZEluZGV4ICogbnVtQ29sLCBvdXRJbmRleCAqIG51bUNvbCk7XG4gICAgfVxuXG4gICAgZm9yIChsZXQgaSA9IHN0YXJ0OyBpIDwgZW5kOyArK2kpIHtcbiAgICAgIGNvbnN0IGluZGV4ID0gaW5kaWNlc1tpXTtcbiAgICAgIGlmIChpbmRleCA8IDAgfHwgaW5kZXggPj0gaW5wdXRGbGF0WzBdKSB7XG4gICAgICAgIHRocm93IG5ldyBFcnJvcihcbiAgICAgICAgICAgIGJhY2tlbmRfdXRpbC5nZXRTcGFyc2VTZWdtZW50UmVkdWN0aW9uSW5kaWNlc091dE9mUmFuZ2VFcnJvck1lc3NhZ2UoXG4gICAgICAgICAgICAgICAgaSwgaW5kaWNlc1tpXSwgaW5wdXRGbGF0WzBdKSk7XG4gICAgICB9XG4gICAgICBmb3IgKGxldCBqID0gMDsgaiA8IG51bUNvbDsgaisrKSB7XG4gICAgICAgIG91dHB1dFtvdXRJbmRleCAqIG51bUNvbCArIGpdICs9IGlucHV0W2luZGV4ICogbnVtQ29sICsgal07XG4gICAgICB9XG4gICAgfVxuXG4gICAgaWYgKGlzTWVhbikge1xuICAgICAgZm9yIChsZXQgaiA9IDA7IGogPCBudW1Db2w7IGorKykge1xuICAgICAgICBvdXRwdXRbb3V0SW5kZXggKiBudW1Db2wgKyBqXSAvPSBlbmQgLSBzdGFydDtcbiAgICAgIH1cbiAgICB9XG5cbiAgICBzdGFydCA9IGVuZDtcbiAgICArK2VuZDtcbiAgICB1bmluaXRpYWxpemVkSW5kZXggPSBvdXRJbmRleCArIDE7XG4gICAgb3V0SW5kZXggPSBuZXh0SW5kZXg7XG4gICAgaWYgKGVuZCA+IG51bUluZGljZXMpIHtcbiAgICAgIGJyZWFrO1xuICAgIH1cbiAgfVxuXG4gIC8vIEZpbGwgdGhlIGdhcCBhdCB0aGUgZW5kIHdpdGggdGhlIGRlZmF1bHQgdmFsdWUuXG4gIGlmICh1bmluaXRpYWxpemVkSW5kZXggPCBvdXRwdXRSb3dzKSB7XG4gICAgb3V0cHV0LmZpbGwoZGVmYXVsdFZhbHVlLCB1bmluaXRpYWxpemVkSW5kZXggKiBudW1Db2wsIG91dHB1dFJvd3MgKiBudW1Db2wpO1xuICB9XG5cbiAgcmV0dXJuIFtvdXRwdXQsIG91dHB1dFNoYXBlXTtcbn1cbiJdfQ==","/**\n * @license\n * Copyright 2021 Google LLC. All Rights Reserved.\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n * =============================================================================\n */\nimport { SparseSegmentMean } from '@tensorflow/tfjs-core';\nimport { sparseSegmentReductionImpl } from './SparseSegmentReduction_impl';\nexport function sparseSegmentMean(args) {\n const { inputs, backend } = args;\n const { data, indices, segmentIds } = inputs;\n if (data.shape.length < 1) {\n throw new Error(`Data should be at least 1 dimensional but received scalar`);\n }\n if (indices.shape.length !== 1) {\n throw new Error(`Indices should be a vector but received shape\n ${indices.shape}`);\n }\n if (segmentIds.shape.length !== 1) {\n throw new Error(`Segment ids should be a vector but received shape\n ${segmentIds.shape}`);\n }\n if (indices.shape[0] !== segmentIds.shape[0]) {\n throw new Error(`segmentIds and indices should have same size.`);\n }\n const $data = backend.data.get(data.dataId).values;\n const $indices = backend.data.get(indices.dataId).values;\n const $segmentIds = backend.data.get(segmentIds.dataId).values;\n const [outputData, outputDataShape] = sparseSegmentReductionImpl($data, data.shape, data.dtype, $indices, $segmentIds, true);\n return backend.makeTensorInfo(outputDataShape, data.dtype, outputData);\n}\nexport const sparseSegmentMeanConfig = {\n kernelName: SparseSegmentMean,\n backendName: 'cpu',\n kernelFunc: sparseSegmentMean,\n};\n//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiU3BhcnNlU2VnbWVudE1lYW4uanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi8uLi90ZmpzLWJhY2tlbmQtY3B1L3NyYy9rZXJuZWxzL1NwYXJzZVNlZ21lbnRNZWFuLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBOzs7Ozs7Ozs7Ozs7Ozs7R0FlRztBQUVILE9BQU8sRUFBZSxpQkFBaUIsRUFBa0QsTUFBTSx1QkFBdUIsQ0FBQztBQUl2SCxPQUFPLEVBQUMsMEJBQTBCLEVBQUMsTUFBTSwrQkFBK0IsQ0FBQztBQUV6RSxNQUFNLFVBQVUsaUJBQWlCLENBQzdCLElBQWdFO0lBRWxFLE1BQU0sRUFBQyxNQUFNLEVBQUUsT0FBTyxFQUFDLEdBQUcsSUFBSSxDQUFDO0lBQy9CLE1BQU0sRUFBQyxJQUFJLEVBQUUsT0FBTyxFQUFFLFVBQVUsRUFBQyxHQUFHLE1BQU0sQ0FBQztJQUMzQyxJQUFJLElBQUksQ0FBQyxLQUFLLENBQUMsTUFBTSxHQUFHLENBQUMsRUFBRTtRQUN6QixNQUFNLElBQUksS0FBSyxDQUNYLDJEQUEyRCxDQUFDLENBQUM7S0FDbEU7SUFDRCxJQUFJLE9BQU8sQ0FBQyxLQUFLLENBQUMsTUFBTSxLQUFLLENBQUMsRUFBRTtRQUM5QixNQUFNLElBQUksS0FBSyxDQUFDO1lBQ1IsT0FBTyxDQUFDLEtBQUssRUFBRSxDQUFDLENBQUM7S0FDMUI7SUFDRCxJQUFJLFVBQVUsQ0FBQyxLQUFLLENBQUMsTUFBTSxLQUFLLENBQUMsRUFBRTtRQUNqQyxNQUFNLElBQUksS0FBSyxDQUFDO1lBQ1IsVUFBVSxDQUFDLEtBQUssRUFBRSxDQUFDLENBQUM7S0FDN0I7SUFDRCxJQUFJLE9BQU8sQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDLEtBQUssVUFBVSxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUMsRUFBRTtRQUM1QyxNQUFNLElBQUksS0FBSyxDQUFDLCtDQUErQyxDQUFDLENBQUM7S0FDbEU7SUFFRCxNQUFNLEtBQUssR0FBRyxPQUFPLENBQUMsSUFBSSxDQUFDLEdBQUcsQ0FBQyxJQUFJLENBQUMsTUFBTSxDQUFDLENBQUMsTUFBb0IsQ0FBQztJQUNqRSxNQUFNLFFBQVEsR0FBRyxPQUFPLENBQUMsSUFBSSxDQUFDLEdBQUcsQ0FBQyxPQUFPLENBQUMsTUFBTSxDQUFDLENBQUMsTUFBb0IsQ0FBQztJQUN2RSxNQUFNLFdBQVcsR0FBRyxPQUFPLENBQUMsSUFBSSxDQUFDLEdBQUcsQ0FBQyxVQUFVLENBQUMsTUFBTSxDQUFDLENBQUMsTUFBb0IsQ0FBQztJQUU3RSxNQUFNLENBQUMsVUFBVSxFQUFFLGVBQWUsQ0FBQyxHQUFHLDBCQUEwQixDQUM1RCxLQUFLLEVBQUUsSUFBSSxDQUFDLEtBQUssRUFBRSxJQUFJLENBQUMsS0FBSyxFQUFFLFFBQVEsRUFBRSxXQUFXLEVBQUUsSUFBSSxDQUFDLENBQUM7SUFDaEUsT0FBTyxPQUFPLENBQUMsY0FBYyxDQUFDLGVBQWUsRUFBRSxJQUFJLENBQUMsS0FBSyxFQUFFLFVBQVUsQ0FBQyxDQUFDO0FBQ3pFLENBQUM7QUFFRCxNQUFNLENBQUMsTUFBTSx1QkFBdUIsR0FBaUI7SUFDbkQsVUFBVSxFQUFFLGlCQUFpQjtJQUM3QixXQUFXLEVBQUUsS0FBSztJQUNsQixVQUFVLEVBQUUsaUJBQWlCO0NBQzlCLENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyIvKipcbiAqIEBsaWNlbnNlXG4gKiBDb3B5cmlnaHQgMjAyMSBHb29nbGUgTExDLiBBbGwgUmlnaHRzIFJlc2VydmVkLlxuICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlIFwiTGljZW5zZVwiKTtcbiAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS5cbiAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdFxuICpcbiAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMFxuICpcbiAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmVcbiAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuIFwiQVMgSVNcIiBCQVNJUyxcbiAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLlxuICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZFxuICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuXG4gKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuICovXG5cbmltcG9ydCB7S2VybmVsQ29uZmlnLCBTcGFyc2VTZWdtZW50TWVhbiwgU3BhcnNlU2VnbWVudE1lYW5JbnB1dHMsIFRlbnNvckluZm8sIFR5cGVkQXJyYXl9IGZyb20gJ0B0ZW5zb3JmbG93L3RmanMtY29yZSc7XG5cbmltcG9ydCB7TWF0aEJhY2tlbmRDUFV9IGZyb20gJy4uL2JhY2tlbmRfY3B1JztcblxuaW1wb3J0IHtzcGFyc2VTZWdtZW50UmVkdWN0aW9uSW1wbH0gZnJvbSAnLi9TcGFyc2VTZWdtZW50UmVkdWN0aW9uX2ltcGwnO1xuXG5leHBvcnQgZnVuY3Rpb24gc3BhcnNlU2VnbWVudE1lYW4oXG4gICAgYXJnczoge2lucHV0czogU3BhcnNlU2VnbWVudE1lYW5JbnB1dHMsIGJhY2tlbmQ6IE1hdGhCYWNrZW5kQ1BVfSk6XG4gICAgVGVuc29ySW5mbyB7XG4gIGNvbnN0IHtpbnB1dHMsIGJhY2tlbmR9ID0gYXJncztcbiAgY29uc3Qge2RhdGEsIGluZGljZXMsIHNlZ21lbnRJZHN9ID0gaW5wdXRzO1xuICBpZiAoZGF0YS5zaGFwZS5sZW5ndGggPCAxKSB7XG4gICAgdGhyb3cgbmV3IEVycm9yKFxuICAgICAgICBgRGF0YSBzaG91bGQgYmUgYXQgbGVhc3QgMSBkaW1lbnNpb25hbCBidXQgcmVjZWl2ZWQgc2NhbGFyYCk7XG4gIH1cbiAgaWYgKGluZGljZXMuc2hhcGUubGVuZ3RoICE9PSAxKSB7XG4gICAgdGhyb3cgbmV3IEVycm9yKGBJbmRpY2VzIHNob3VsZCBiZSBhIHZlY3RvciBidXQgcmVjZWl2ZWQgc2hhcGVcbiAgICAgICAgICAke2luZGljZXMuc2hhcGV9YCk7XG4gIH1cbiAgaWYgKHNlZ21lbnRJZHMuc2hhcGUubGVuZ3RoICE9PSAxKSB7XG4gICAgdGhyb3cgbmV3IEVycm9yKGBTZWdtZW50IGlkcyBzaG91bGQgYmUgYSB2ZWN0b3IgYnV0IHJlY2VpdmVkIHNoYXBlXG4gICAgICAgICAgJHtzZWdtZW50SWRzLnNoYXBlfWApO1xuICB9XG4gIGlmIChpbmRpY2VzLnNoYXBlWzBdICE9PSBzZWdtZW50SWRzLnNoYXBlWzBdKSB7XG4gICAgdGhyb3cgbmV3IEVycm9yKGBzZWdtZW50SWRzIGFuZCBpbmRpY2VzIHNob3VsZCBoYXZlIHNhbWUgc2l6ZS5gKTtcbiAgfVxuXG4gIGNvbnN0ICRkYXRhID0gYmFja2VuZC5kYXRhLmdldChkYXRhLmRhdGFJZCkudmFsdWVzIGFzIFR5cGVkQXJyYXk7XG4gIGNvbnN0ICRpbmRpY2VzID0gYmFja2VuZC5kYXRhLmdldChpbmRpY2VzLmRhdGFJZCkudmFsdWVzIGFzIFR5cGVkQXJyYXk7XG4gIGNvbnN0ICRzZWdtZW50SWRzID0gYmFja2VuZC5kYXRhLmdldChzZWdtZW50SWRzLmRhdGFJZCkudmFsdWVzIGFzIFR5cGVkQXJyYXk7XG5cbiAgY29uc3QgW291dHB1dERhdGEsIG91dHB1dERhdGFTaGFwZV0gPSBzcGFyc2VTZWdtZW50UmVkdWN0aW9uSW1wbChcbiAgICAgICRkYXRhLCBkYXRhLnNoYXBlLCBkYXRhLmR0eXBlLCAkaW5kaWNlcywgJHNlZ21lbnRJZHMsIHRydWUpO1xuICByZXR1cm4gYmFja2VuZC5tYWtlVGVuc29ySW5mbyhvdXRwdXREYXRhU2hhcGUsIGRhdGEuZHR5cGUsIG91dHB1dERhdGEpO1xufVxuXG5leHBvcnQgY29uc3Qgc3BhcnNlU2VnbWVudE1lYW5Db25maWc6IEtlcm5lbENvbmZpZyA9IHtcbiAga2VybmVsTmFtZTogU3BhcnNlU2VnbWVudE1lYW4sXG4gIGJhY2tlbmROYW1lOiAnY3B1JyxcbiAga2VybmVsRnVuYzogc3BhcnNlU2VnbWVudE1lYW4sXG59O1xuIl19","/**\n * @license\n * Copyright 2021 Google LLC. All Rights Reserved.\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n * =============================================================================\n */\nimport { SparseSegmentSum } from '@tensorflow/tfjs-core';\nimport { sparseSegmentReductionImpl } from './SparseSegmentReduction_impl';\nexport function sparseSegmentSum(args) {\n const { inputs, backend } = args;\n const { data, indices, segmentIds } = inputs;\n if (data.shape.length < 1) {\n throw new Error(`Data should be at least 1 dimensional but received scalar`);\n }\n if (indices.shape.length !== 1) {\n throw new Error(`Indices should be a vector but received shape\n ${indices.shape}`);\n }\n if (segmentIds.shape.length !== 1) {\n throw new Error(`Segment ids should be a vector but received shape\n ${segmentIds.shape}`);\n }\n if (indices.shape[0] !== segmentIds.shape[0]) {\n throw new Error(`segmentIds and indices should have same size.`);\n }\n const $data = backend.data.get(data.dataId).values;\n const $indices = backend.data.get(indices.dataId).values;\n const $segmentIds = backend.data.get(segmentIds.dataId).values;\n const [outputData, outputDataShape] = sparseSegmentReductionImpl($data, data.shape, data.dtype, $indices, $segmentIds);\n return backend.makeTensorInfo(outputDataShape, data.dtype, outputData);\n}\nexport const sparseSegmentSumConfig = {\n kernelName: SparseSegmentSum,\n backendName: 'cpu',\n kernelFunc: sparseSegmentSum,\n};\n//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiU3BhcnNlU2VnbWVudFN1bS5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uLy4uL3RmanMtYmFja2VuZC1jcHUvc3JjL2tlcm5lbHMvU3BhcnNlU2VnbWVudFN1bS50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQTs7Ozs7Ozs7Ozs7Ozs7O0dBZUc7QUFFSCxPQUFPLEVBQWUsZ0JBQWdCLEVBQWlELE1BQU0sdUJBQXVCLENBQUM7QUFJckgsT0FBTyxFQUFDLDBCQUEwQixFQUFDLE1BQU0sK0JBQStCLENBQUM7QUFFekUsTUFBTSxVQUFVLGdCQUFnQixDQUM1QixJQUErRDtJQUVqRSxNQUFNLEVBQUMsTUFBTSxFQUFFLE9BQU8sRUFBQyxHQUFHLElBQUksQ0FBQztJQUMvQixNQUFNLEVBQUMsSUFBSSxFQUFFLE9BQU8sRUFBRSxVQUFVLEVBQUMsR0FBRyxNQUFNLENBQUM7SUFDM0MsSUFBSSxJQUFJLENBQUMsS0FBSyxDQUFDLE1BQU0sR0FBRyxDQUFDLEVBQUU7UUFDekIsTUFBTSxJQUFJLEtBQUssQ0FDWCwyREFBMkQsQ0FBQyxDQUFDO0tBQ2xFO0lBQ0QsSUFBSSxPQUFPLENBQUMsS0FBSyxDQUFDLE1BQU0sS0FBSyxDQUFDLEVBQUU7UUFDOUIsTUFBTSxJQUFJLEtBQUssQ0FBQztXQUNULE9BQU8sQ0FBQyxLQUFLLEVBQUUsQ0FBQyxDQUFDO0tBQ3pCO0lBQ0QsSUFBSSxVQUFVLENBQUMsS0FBSyxDQUFDLE1BQU0sS0FBSyxDQUFDLEVBQUU7UUFDakMsTUFBTSxJQUFJLEtBQUssQ0FBQztXQUNULFVBQVUsQ0FBQyxLQUFLLEVBQUUsQ0FBQyxDQUFDO0tBQzVCO0lBQ0QsSUFBSSxPQUFPLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQyxLQUFLLFVBQVUsQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDLEVBQUU7UUFDNUMsTUFBTSxJQUFJLEtBQUssQ0FBQywrQ0FBK0MsQ0FBQyxDQUFDO0tBQ2xFO0lBRUQsTUFBTSxLQUFLLEdBQUcsT0FBTyxDQUFDLElBQUksQ0FBQyxHQUFHLENBQUMsSUFBSSxDQUFDLE1BQU0sQ0FBQyxDQUFDLE1BQW9CLENBQUM7SUFDakUsTUFBTSxRQUFRLEdBQUcsT0FBTyxDQUFDLElBQUksQ0FBQyxHQUFHLENBQUMsT0FBTyxDQUFDLE1BQU0sQ0FBQyxDQUFDLE1BQW9CLENBQUM7SUFDdkUsTUFBTSxXQUFXLEdBQUcsT0FBTyxDQUFDLElBQUksQ0FBQyxHQUFHLENBQUMsVUFBVSxDQUFDLE1BQU0sQ0FBQyxDQUFDLE1BQW9CLENBQUM7SUFFN0UsTUFBTSxDQUFDLFVBQVUsRUFBRSxlQUFlLENBQUMsR0FBRywwQkFBMEIsQ0FDNUQsS0FBSyxFQUFFLElBQUksQ0FBQyxLQUFLLEVBQUUsSUFBSSxDQUFDLEtBQUssRUFBRSxRQUFRLEVBQUUsV0FBVyxDQUFDLENBQUM7SUFDMUQsT0FBTyxPQUFPLENBQUMsY0FBYyxDQUFDLGVBQWUsRUFBRSxJQUFJLENBQUMsS0FBSyxFQUFFLFVBQVUsQ0FBQyxDQUFDO0FBQ3pFLENBQUM7QUFFRCxNQUFNLENBQUMsTUFBTSxzQkFBc0IsR0FBaUI7SUFDbEQsVUFBVSxFQUFFLGdCQUFnQjtJQUM1QixXQUFXLEVBQUUsS0FBSztJQUNsQixVQUFVLEVBQUUsZ0JBQWdCO0NBQzdCLENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyIvKipcbiAqIEBsaWNlbnNlXG4gKiBDb3B5cmlnaHQgMjAyMSBHb29nbGUgTExDLiBBbGwgUmlnaHRzIFJlc2VydmVkLlxuICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlIFwiTGljZW5zZVwiKTtcbiAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS5cbiAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdFxuICpcbiAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMFxuICpcbiAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmVcbiAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuIFwiQVMgSVNcIiBCQVNJUyxcbiAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLlxuICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZFxuICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuXG4gKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuICovXG5cbmltcG9ydCB7S2VybmVsQ29uZmlnLCBTcGFyc2VTZWdtZW50U3VtLCBTcGFyc2VTZWdtZW50U3VtSW5wdXRzLCBUZW5zb3JJbmZvLCBUeXBlZEFycmF5fSBmcm9tICdAdGVuc29yZmxvdy90ZmpzLWNvcmUnO1xuXG5pbXBvcnQge01hdGhCYWNrZW5kQ1BVfSBmcm9tICcuLi9iYWNrZW5kX2NwdSc7XG5cbmltcG9ydCB7c3BhcnNlU2VnbWVudFJlZHVjdGlvbkltcGx9IGZyb20gJy4vU3BhcnNlU2VnbWVudFJlZHVjdGlvbl9pbXBsJztcblxuZXhwb3J0IGZ1bmN0aW9uIHNwYXJzZVNlZ21lbnRTdW0oXG4gICAgYXJnczoge2lucHV0czogU3BhcnNlU2VnbWVudFN1bUlucHV0cywgYmFja2VuZDogTWF0aEJhY2tlbmRDUFV9KTpcbiAgICBUZW5zb3JJbmZvIHtcbiAgY29uc3Qge2lucHV0cywgYmFja2VuZH0gPSBhcmdzO1xuICBjb25zdCB7ZGF0YSwgaW5kaWNlcywgc2VnbWVudElkc30gPSBpbnB1dHM7XG4gIGlmIChkYXRhLnNoYXBlLmxlbmd0aCA8IDEpIHtcbiAgICB0aHJvdyBuZXcgRXJyb3IoXG4gICAgICAgIGBEYXRhIHNob3VsZCBiZSBhdCBsZWFzdCAxIGRpbWVuc2lvbmFsIGJ1dCByZWNlaXZlZCBzY2FsYXJgKTtcbiAgfVxuICBpZiAoaW5kaWNlcy5zaGFwZS5sZW5ndGggIT09IDEpIHtcbiAgICB0aHJvdyBuZXcgRXJyb3IoYEluZGljZXMgc2hvdWxkIGJlIGEgdmVjdG9yIGJ1dCByZWNlaXZlZCBzaGFwZVxuICAgICAgICAgJHtpbmRpY2VzLnNoYXBlfWApO1xuICB9XG4gIGlmIChzZWdtZW50SWRzLnNoYXBlLmxlbmd0aCAhPT0gMSkge1xuICAgIHRocm93IG5ldyBFcnJvcihgU2VnbWVudCBpZHMgc2hvdWxkIGJlIGEgdmVjdG9yIGJ1dCByZWNlaXZlZCBzaGFwZVxuICAgICAgICAgJHtzZWdtZW50SWRzLnNoYXBlfWApO1xuICB9XG4gIGlmIChpbmRpY2VzLnNoYXBlWzBdICE9PSBzZWdtZW50SWRzLnNoYXBlWzBdKSB7XG4gICAgdGhyb3cgbmV3IEVycm9yKGBzZWdtZW50SWRzIGFuZCBpbmRpY2VzIHNob3VsZCBoYXZlIHNhbWUgc2l6ZS5gKTtcbiAgfVxuXG4gIGNvbnN0ICRkYXRhID0gYmFja2VuZC5kYXRhLmdldChkYXRhLmRhdGFJZCkudmFsdWVzIGFzIFR5cGVkQXJyYXk7XG4gIGNvbnN0ICRpbmRpY2VzID0gYmFja2VuZC5kYXRhLmdldChpbmRpY2VzLmRhdGFJZCkudmFsdWVzIGFzIFR5cGVkQXJyYXk7XG4gIGNvbnN0ICRzZWdtZW50SWRzID0gYmFja2VuZC5kYXRhLmdldChzZWdtZW50SWRzLmRhdGFJZCkudmFsdWVzIGFzIFR5cGVkQXJyYXk7XG5cbiAgY29uc3QgW291dHB1dERhdGEsIG91dHB1dERhdGFTaGFwZV0gPSBzcGFyc2VTZWdtZW50UmVkdWN0aW9uSW1wbChcbiAgICAgICRkYXRhLCBkYXRhLnNoYXBlLCBkYXRhLmR0eXBlLCAkaW5kaWNlcywgJHNlZ21lbnRJZHMpO1xuICByZXR1cm4gYmFja2VuZC5tYWtlVGVuc29ySW5mbyhvdXRwdXREYXRhU2hhcGUsIGRhdGEuZHR5cGUsIG91dHB1dERhdGEpO1xufVxuXG5leHBvcnQgY29uc3Qgc3BhcnNlU2VnbWVudFN1bUNvbmZpZzogS2VybmVsQ29uZmlnID0ge1xuICBrZXJuZWxOYW1lOiBTcGFyc2VTZWdtZW50U3VtLFxuICBiYWNrZW5kTmFtZTogJ2NwdScsXG4gIGtlcm5lbEZ1bmM6IHNwYXJzZVNlZ21lbnRTdW0sXG59O1xuIl19","/**\n * @license\n * Copyright 2020 Google LLC. All Rights Reserved.\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n * =============================================================================\n */\nimport { backend_util, SparseToDense, util } from '@tensorflow/tfjs-core';\nimport { scatterImpl } from './Scatter_impl';\nexport function sparseToDense(args) {\n const { inputs, backend, attrs } = args;\n const { sparseIndices, sparseValues, defaultValue } = inputs;\n const { outputShape } = attrs;\n const { sliceRank, numUpdates, sliceSize, strides, outputSize } = backend_util.calculateShapes(sparseValues, sparseIndices, outputShape);\n const sumDupeIndices = false;\n const indicesBuf = backend.bufferSync(sparseIndices);\n let outBuf;\n switch (sparseValues.dtype) {\n case 'bool': {\n const updatesBuf = backend.bufferSync(sparseValues);\n const $defaultValue = Boolean(backend.data.get(defaultValue.dataId).values[0]);\n outBuf = scatterImpl(indicesBuf, updatesBuf, outputShape, outputSize, sliceSize, numUpdates, sliceRank, strides, $defaultValue, sumDupeIndices);\n break;\n }\n case 'float32': {\n const updatesBuf = backend.bufferSync(sparseValues);\n const $defaultValue = backend.data.get(defaultValue.dataId).values[0];\n outBuf = scatterImpl(indicesBuf, updatesBuf, outputShape, outputSize, sliceSize, numUpdates, sliceRank, strides, $defaultValue, sumDupeIndices);\n break;\n }\n case 'int32': {\n const updatesBuf = backend.bufferSync(sparseValues);\n const $defaultValue = backend.data.get(defaultValue.dataId).values[0];\n outBuf = scatterImpl(indicesBuf, updatesBuf, outputShape, outputSize, sliceSize, numUpdates, sliceRank, strides, $defaultValue, sumDupeIndices);\n break;\n }\n case 'string': {\n const updatesBuf = backend.bufferSync(sparseValues);\n const $defaultValue = util.decodeString(backend.data.get(defaultValue.dataId).values[0]);\n outBuf = scatterImpl(indicesBuf, updatesBuf, outputShape, outputSize, sliceSize, numUpdates, sliceRank, strides, $defaultValue, sumDupeIndices);\n break;\n }\n default:\n throw new Error(`Unsupported type ${sparseValues.dtype}`);\n }\n return backend.makeTensorInfo(outputShape, outBuf.dtype, outBuf.values);\n}\nexport const sparseToDenseConfig = {\n kernelName: SparseToDense,\n backendName: 'cpu',\n kernelFunc: sparseToDense\n};\n//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiU3BhcnNlVG9EZW5zZS5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uLy4uL3RmanMtYmFja2VuZC1jcHUvc3JjL2tlcm5lbHMvU3BhcnNlVG9EZW5zZS50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQTs7Ozs7Ozs7Ozs7Ozs7O0dBZUc7QUFFSCxPQUFPLEVBQUMsWUFBWSxFQUFrQyxhQUFhLEVBQXVELElBQUksRUFBQyxNQUFNLHVCQUF1QixDQUFDO0FBRzdKLE9BQU8sRUFBQyxXQUFXLEVBQUMsTUFBTSxnQkFBZ0IsQ0FBQztBQUUzQyxNQUFNLFVBQVUsYUFBYSxDQUFDLElBSTdCO0lBQ0MsTUFBTSxFQUFDLE1BQU0sRUFBRSxPQUFPLEVBQUUsS0FBSyxFQUFDLEdBQUcsSUFBSSxDQUFDO0lBQ3RDLE1BQU0sRUFBQyxhQUFhLEVBQUUsWUFBWSxFQUFFLFlBQVksRUFBQyxHQUFHLE1BQU0sQ0FBQztJQUMzRCxNQUFNLEVBQUMsV0FBVyxFQUFDLEdBQUcsS0FBSyxDQUFDO0lBRTVCLE1BQU0sRUFBQyxTQUFTLEVBQUUsVUFBVSxFQUFFLFNBQVMsRUFBRSxPQUFPLEVBQUUsVUFBVSxFQUFDLEdBQ3pELFlBQVksQ0FBQyxlQUFlLENBQUMsWUFBWSxFQUFFLGFBQWEsRUFBRSxXQUFXLENBQUMsQ0FBQztJQUMzRSxNQUFNLGNBQWMsR0FBRyxLQUFLLENBQUM7SUFFN0IsTUFBTSxVQUFVLEdBQUcsT0FBTyxDQUFDLFVBQVUsQ0FBZ0IsYUFBYSxDQUFDLENBQUM7SUFFcEUsSUFBSSxNQUFNLENBQUM7SUFDWCxRQUFRLFlBQVksQ0FBQyxLQUFLLEVBQUU7UUFDMUIsS0FBSyxNQUFNLENBQUMsQ0FBQztZQUNYLE1BQU0sVUFBVSxHQUFHLE9BQU8sQ0FBQyxVQUFVLENBQWUsWUFBWSxDQUFDLENBQUM7WUFDbEUsTUFBTSxhQUFhLEdBQ2YsT0FBTyxDQUFDLE9BQU8sQ0FBQyxJQUFJLENBQUMsR0FBRyxDQUFDLFlBQVksQ0FBQyxNQUFNLENBQUMsQ0FBQyxNQUFNLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQztZQUM3RCxNQUFNLEdBQUcsV0FBVyxDQUNoQixVQUFVLEVBQUUsVUFBVSxFQUFFLFdBQVcsRUFBRSxVQUFVLEVBQUUsU0FBUyxFQUMxRCxVQUFVLEVBQUUsU0FBUyxFQUFFLE9BQU8sRUFBRSxhQUFhLEVBQUUsY0FBYyxDQUFDLENBQUM7WUFDbkUsTUFBTTtTQUNQO1FBQ0QsS0FBSyxTQUFTLENBQUMsQ0FBQztZQUNkLE1BQU0sVUFBVSxHQUFHLE9BQU8sQ0FBQyxVQUFVLENBQWtCLFlBQVksQ0FBQyxDQUFDO1lBQ3JFLE1BQU0sYUFBYSxHQUNmLE9BQU8sQ0FBQyxJQUFJLENBQUMsR0FBRyxDQUFDLFlBQVksQ0FBQyxNQUFNLENBQUMsQ0FBQyxNQUFNLENBQUMsQ0FBQyxDQUFXLENBQUM7WUFDOUQsTUFBTSxHQUFHLFdBQVcsQ0FDaEIsVUFBVSxFQUFFLFVBQVUsRUFBRSxXQUFXLEVBQUUsVUFBVSxFQUFFLFNBQVMsRUFDMUQsVUFBVSxFQUFFLFNBQVMsRUFBRSxPQUFPLEVBQUUsYUFBYSxFQUFFLGNBQWMsQ0FBQyxDQUFDO1lBQ25FLE1BQU07U0FDUDtRQUNELEtBQUssT0FBTyxDQUFDLENBQUM7WUFDWixNQUFNLFVBQVUsR0FBRyxPQUFPLENBQUMsVUFBVSxDQUFnQixZQUFZLENBQUMsQ0FBQztZQUNuRSxNQUFNLGFBQWEsR0FDZixPQUFPLENBQUMsSUFBSSxDQUFDLEdBQUcsQ0FBQyxZQUFZLENBQUMsTUFBTSxDQUFDLENBQUMsTUFBTSxDQUFDLENBQUMsQ0FBVyxDQUFDO1lBQzlELE1BQU0sR0FBRyxXQUFXLENBQ2hCLFVBQVUsRUFBRSxVQUFVLEVBQUUsV0FBVyxFQUFFLFVBQVUsRUFBRSxTQUFTLEVBQzFELFVBQVUsRUFBRSxTQUFTLEVBQUUsT0FBTyxFQUFFLGFBQWEsRUFBRSxjQUFjLENBQUMsQ0FBQztZQUNuRSxNQUFNO1NBQ1A7UUFDRCxLQUFLLFFBQVEsQ0FBQyxDQUFDO1lBQ2IsTUFBTSxVQUFVLEdBQUcsT0FBTyxDQUFDLFVBQVUsQ0FBaUIsWUFBWSxDQUFDLENBQUM7WUFDcEUsTUFBTSxhQUFhLEdBQUcsSUFBSSxDQUFDLFlBQVksQ0FDbkMsT0FBTyxDQUFDLElBQUksQ0FBQyxHQUFHLENBQUMsWUFBWSxDQUFDLE1BQU0sQ0FBQyxDQUFDLE1BQU0sQ0FBQyxDQUFDLENBQWUsQ0FBQyxDQUFDO1lBQ25FLE1BQU0sR0FBRyxXQUFXLENBQ2hCLFVBQVUsRUFBRSxVQUFVLEVBQUUsV0FBVyxFQUFFLFVBQVUsRUFBRSxTQUFTLEVBQzFELFVBQVUsRUFBRSxTQUFTLEVBQUUsT0FBTyxFQUFFLGFBQWEsRUFBRSxjQUFjLENBQUMsQ0FBQztZQUNuRSxNQUFNO1NBQ1A7UUFDRDtZQUNFLE1BQU0sSUFBSSxLQUFLLENBQUMsb0JBQW9CLFlBQVksQ0FBQyxLQUFLLEVBQUUsQ0FBQyxDQUFDO0tBQzdEO0lBQ0QsT0FBTyxPQUFPLENBQUMsY0FBYyxDQUFDLFdBQVcsRUFBRSxNQUFNLENBQUMsS0FBSyxFQUFFLE1BQU0sQ0FBQyxNQUFNLENBQUMsQ0FBQztBQUMxRSxDQUFDO0FBRUQsTUFBTSxDQUFDLE1BQU0sbUJBQW1CLEdBQWlCO0lBQy9DLFVBQVUsRUFBRSxhQUFhO0lBQ3pCLFdBQVcsRUFBRSxLQUFLO0lBQ2xCLFVBQVUsRUFBRSxhQUFpQztDQUM5QyxDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiLyoqXG4gKiBAbGljZW5zZVxuICogQ29weXJpZ2h0IDIwMjAgR29vZ2xlIExMQy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC5cbiAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSBcIkxpY2Vuc2VcIik7XG4gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuXG4gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXRcbiAqXG4gKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjBcbiAqXG4gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlXG4gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiBcIkFTIElTXCIgQkFTSVMsXG4gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC5cbiAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmRcbiAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLlxuICogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbiAqL1xuXG5pbXBvcnQge2JhY2tlbmRfdXRpbCwgS2VybmVsQ29uZmlnLCBLZXJuZWxGdW5jLCBSYW5rLCBTcGFyc2VUb0RlbnNlLCBTcGFyc2VUb0RlbnNlQXR0cnMsIFNwYXJzZVRvRGVuc2VJbnB1dHMsIFRlbnNvckluZm8sIHV0aWx9IGZyb20gJ0B0ZW5zb3JmbG93L3RmanMtY29yZSc7XG5cbmltcG9ydCB7TWF0aEJhY2tlbmRDUFV9IGZyb20gJy4uL2JhY2tlbmRfY3B1JztcbmltcG9ydCB7c2NhdHRlckltcGx9IGZyb20gJy4vU2NhdHRlcl9pbXBsJztcblxuZXhwb3J0IGZ1bmN0aW9uIHNwYXJzZVRvRGVuc2UoYXJnczoge1xuICBpbnB1dHM6IFNwYXJzZVRvRGVuc2VJbnB1dHMsXG4gIGJhY2tlbmQ6IE1hdGhCYWNrZW5kQ1BVLFxuICBhdHRyczogU3BhcnNlVG9EZW5zZUF0dHJzXG59KTogVGVuc29ySW5mbyB7XG4gIGNvbnN0IHtpbnB1dHMsIGJhY2tlbmQsIGF0dHJzfSA9IGFyZ3M7XG4gIGNvbnN0IHtzcGFyc2VJbmRpY2VzLCBzcGFyc2VWYWx1ZXMsIGRlZmF1bHRWYWx1ZX0gPSBpbnB1dHM7XG4gIGNvbnN0IHtvdXRwdXRTaGFwZX0gPSBhdHRycztcblxuICBjb25zdCB7c2xpY2VSYW5rLCBudW1VcGRhdGVzLCBzbGljZVNpemUsIHN0cmlkZXMsIG91dHB1dFNpemV9ID1cbiAgICAgIGJhY2tlbmRfdXRpbC5jYWxjdWxhdGVTaGFwZXMoc3BhcnNlVmFsdWVzLCBzcGFyc2VJbmRpY2VzLCBvdXRwdXRTaGFwZSk7XG4gIGNvbnN0IHN1bUR1cGVJbmRpY2VzID0gZmFsc2U7XG5cbiAgY29uc3QgaW5kaWNlc0J1ZiA9IGJhY2tlbmQuYnVmZmVyU3luYzxSYW5rLCAnaW50MzInPihzcGFyc2VJbmRpY2VzKTtcblxuICBsZXQgb3V0QnVmO1xuICBzd2l0Y2ggKHNwYXJzZVZhbHVlcy5kdHlwZSkge1xuICAgIGNhc2UgJ2Jvb2wnOiB7XG4gICAgICBjb25zdCB1cGRhdGVzQnVmID0gYmFja2VuZC5idWZmZXJTeW5jPFJhbmssICdib29sJz4oc3BhcnNlVmFsdWVzKTtcbiAgICAgIGNvbnN0ICRkZWZhdWx0VmFsdWUgPVxuICAgICAgICAgIEJvb2xlYW4oYmFja2VuZC5kYXRhLmdldChkZWZhdWx0VmFsdWUuZGF0YUlkKS52YWx1ZXNbMF0pO1xuICAgICAgb3V0QnVmID0gc2NhdHRlckltcGwoXG4gICAgICAgICAgaW5kaWNlc0J1ZiwgdXBkYXRlc0J1Ziwgb3V0cHV0U2hhcGUsIG91dHB1dFNpemUsIHNsaWNlU2l6ZSxcbiAgICAgICAgICBudW1VcGRhdGVzLCBzbGljZVJhbmssIHN0cmlkZXMsICRkZWZhdWx0VmFsdWUsIHN1bUR1cGVJbmRpY2VzKTtcbiAgICAgIGJyZWFrO1xuICAgIH1cbiAgICBjYXNlICdmbG9hdDMyJzoge1xuICAgICAgY29uc3QgdXBkYXRlc0J1ZiA9IGJhY2tlbmQuYnVmZmVyU3luYzxSYW5rLCAnZmxvYXQzMic+KHNwYXJzZVZhbHVlcyk7XG4gICAgICBjb25zdCAkZGVmYXVsdFZhbHVlID1cbiAgICAgICAgICBiYWNrZW5kLmRhdGEuZ2V0KGRlZmF1bHRWYWx1ZS5kYXRhSWQpLnZhbHVlc1swXSBhcyBudW1iZXI7XG4gICAgICBvdXRCdWYgPSBzY2F0dGVySW1wbChcbiAgICAgICAgICBpbmRpY2VzQnVmLCB1cGRhdGVzQnVmLCBvdXRwdXRTaGFwZSwgb3V0cHV0U2l6ZSwgc2xpY2VTaXplLFxuICAgICAgICAgIG51bVVwZGF0ZXMsIHNsaWNlUmFuaywgc3RyaWRlcywgJGRlZmF1bHRWYWx1ZSwgc3VtRHVwZUluZGljZXMpO1xuICAgICAgYnJlYWs7XG4gICAgfVxuICAgIGNhc2UgJ2ludDMyJzoge1xuICAgICAgY29uc3QgdXBkYXRlc0J1ZiA9IGJhY2tlbmQuYnVmZmVyU3luYzxSYW5rLCAnaW50MzInPihzcGFyc2VWYWx1ZXMpO1xuICAgICAgY29uc3QgJGRlZmF1bHRWYWx1ZSA9XG4gICAgICAgICAgYmFja2VuZC5kYXRhLmdldChkZWZhdWx0VmFsdWUuZGF0YUlkKS52YWx1ZXNbMF0gYXMgbnVtYmVyO1xuICAgICAgb3V0QnVmID0gc2NhdHRlckltcGwoXG4gICAgICAgICAgaW5kaWNlc0J1ZiwgdXBkYXRlc0J1Ziwgb3V0cHV0U2hhcGUsIG91dHB1dFNpemUsIHNsaWNlU2l6ZSxcbiAgICAgICAgICBudW1VcGRhdGVzLCBzbGljZVJhbmssIHN0cmlkZXMsICRkZWZhdWx0VmFsdWUsIHN1bUR1cGVJbmRpY2VzKTtcbiAgICAgIGJyZWFrO1xuICAgIH1cbiAgICBjYXNlICdzdHJpbmcnOiB7XG4gICAgICBjb25zdCB1cGRhdGVzQnVmID0gYmFja2VuZC5idWZmZXJTeW5jPFJhbmssICdzdHJpbmcnPihzcGFyc2VWYWx1ZXMpO1xuICAgICAgY29uc3QgJGRlZmF1bHRWYWx1ZSA9IHV0aWwuZGVjb2RlU3RyaW5nKFxuICAgICAgICAgIGJhY2tlbmQuZGF0YS5nZXQoZGVmYXVsdFZhbHVlLmRhdGFJZCkudmFsdWVzWzBdIGFzIFVpbnQ4QXJyYXkpO1xuICAgICAgb3V0QnVmID0gc2NhdHRlckltcGwoXG4gICAgICAgICAgaW5kaWNlc0J1ZiwgdXBkYXRlc0J1Ziwgb3V0cHV0U2hhcGUsIG91dHB1dFNpemUsIHNsaWNlU2l6ZSxcbiAgICAgICAgICBudW1VcGRhdGVzLCBzbGljZVJhbmssIHN0cmlkZXMsICRkZWZhdWx0VmFsdWUsIHN1bUR1cGVJbmRpY2VzKTtcbiAgICAgIGJyZWFrO1xuICAgIH1cbiAgICBkZWZhdWx0OlxuICAgICAgdGhyb3cgbmV3IEVycm9yKGBVbnN1cHBvcnRlZCB0eXBlICR7c3BhcnNlVmFsdWVzLmR0eXBlfWApO1xuICB9XG4gIHJldHVybiBiYWNrZW5kLm1ha2VUZW5zb3JJbmZvKG91dHB1dFNoYXBlLCBvdXRCdWYuZHR5cGUsIG91dEJ1Zi52YWx1ZXMpO1xufVxuXG5leHBvcnQgY29uc3Qgc3BhcnNlVG9EZW5zZUNvbmZpZzogS2VybmVsQ29uZmlnID0ge1xuICBrZXJuZWxOYW1lOiBTcGFyc2VUb0RlbnNlLFxuICBiYWNrZW5kTmFtZTogJ2NwdScsXG4gIGtlcm5lbEZ1bmM6IHNwYXJzZVRvRGVuc2UgYXMge30gYXMgS2VybmVsRnVuY1xufTtcbiJdfQ==","/**\n * @license\n * Copyright 2020 Google LLC. All Rights Reserved.\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n * =============================================================================\n */\nimport { backend_util } from '@tensorflow/tfjs-core';\nimport { SplitV, util } from '@tensorflow/tfjs-core';\nimport { slice } from './Slice';\nexport function splitV(args) {\n const { inputs, backend, attrs } = args;\n const { x } = inputs;\n const { numOrSizeSplits, axis } = attrs;\n const $axis = util.parseAxisParam(axis, x.shape)[0];\n const splitSizes = backend_util.prepareSplitSize(x, numOrSizeSplits, $axis);\n const begin = new Array(x.shape.length).fill(0);\n const size = x.shape.slice();\n return splitSizes.map(s => {\n const sliceSize = [...size];\n sliceSize[$axis] = s;\n const sliceT = slice({ inputs: { x }, backend, attrs: { begin, size: sliceSize } });\n begin[$axis] += s;\n return sliceT;\n });\n}\nexport const splitVConfig = {\n kernelName: SplitV,\n backendName: 'cpu',\n kernelFunc: splitV\n};\n//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiU3BsaXRWLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vLi4vdGZqcy1iYWNrZW5kLWNwdS9zcmMva2VybmVscy9TcGxpdFYudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUE7Ozs7Ozs7Ozs7Ozs7OztHQWVHO0FBRUgsT0FBTyxFQUFDLFlBQVksRUFBNEIsTUFBTSx1QkFBdUIsQ0FBQztBQUM5RSxPQUFPLEVBQTJCLE1BQU0sRUFBYyxJQUFJLEVBQUMsTUFBTSx1QkFBdUIsQ0FBQztBQUd6RixPQUFPLEVBQUMsS0FBSyxFQUFDLE1BQU0sU0FBUyxDQUFDO0FBRTlCLE1BQU0sVUFBVSxNQUFNLENBQ2xCLElBQXlFO0lBRTNFLE1BQU0sRUFBQyxNQUFNLEVBQUUsT0FBTyxFQUFFLEtBQUssRUFBQyxHQUFHLElBQUksQ0FBQztJQUN0QyxNQUFNLEVBQUMsQ0FBQyxFQUFDLEdBQUcsTUFBTSxDQUFDO0lBQ25CLE1BQU0sRUFBQyxlQUFlLEVBQUUsSUFBSSxFQUFDLEdBQUcsS0FBSyxDQUFDO0lBRXRDLE1BQU0sS0FBSyxHQUFHLElBQUksQ0FBQyxjQUFjLENBQUMsSUFBSSxFQUFFLENBQUMsQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQztJQUNwRCxNQUFNLFVBQVUsR0FBRyxZQUFZLENBQUMsZ0JBQWdCLENBQUMsQ0FBQyxFQUFFLGVBQWUsRUFBRSxLQUFLLENBQUMsQ0FBQztJQUU1RSxNQUFNLEtBQUssR0FBRyxJQUFJLEtBQUssQ0FBQyxDQUFDLENBQUMsS0FBSyxDQUFDLE1BQU0sQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsQ0FBQztJQUNoRCxNQUFNLElBQUksR0FBRyxDQUFDLENBQUMsS0FBSyxDQUFDLEtBQUssRUFBRSxDQUFDO0lBQzdCLE9BQU8sVUFBVSxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsRUFBRTtRQUN4QixNQUFNLFNBQVMsR0FBRyxDQUFDLEdBQUcsSUFBSSxDQUFDLENBQUM7UUFDNUIsU0FBUyxDQUFDLEtBQUssQ0FBQyxHQUFHLENBQUMsQ0FBQztRQUNyQixNQUFNLE1BQU0sR0FDUixLQUFLLENBQUMsRUFBQyxNQUFNLEVBQUUsRUFBQyxDQUFDLEVBQUMsRUFBRSxPQUFPLEVBQUUsS0FBSyxFQUFFLEVBQUMsS0FBSyxFQUFFLElBQUksRUFBRSxTQUFTLEVBQUMsRUFBQyxDQUFDLENBQUM7UUFDbkUsS0FBSyxDQUFDLEtBQUssQ0FBQyxJQUFJLENBQUMsQ0FBQztRQUNsQixPQUFPLE1BQU0sQ0FBQztJQUNoQixDQUFDLENBQUMsQ0FBQztBQUNMLENBQUM7QUFFRCxNQUFNLENBQUMsTUFBTSxZQUFZLEdBQWlCO0lBQ3hDLFVBQVUsRUFBRSxNQUFNO0lBQ2xCLFdBQVcsRUFBRSxLQUFLO0lBQ2xCLFVBQVUsRUFBRSxNQUEwQjtDQUN2QyxDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiLyoqXG4gKiBAbGljZW5zZVxuICogQ29weXJpZ2h0IDIwMjAgR29vZ2xlIExMQy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC5cbiAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSBcIkxpY2Vuc2VcIik7XG4gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuXG4gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXRcbiAqXG4gKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjBcbiAqXG4gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlXG4gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiBcIkFTIElTXCIgQkFTSVMsXG4gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC5cbiAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmRcbiAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLlxuICogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbiAqL1xuXG5pbXBvcnQge2JhY2tlbmRfdXRpbCwgU3BsaXRWQXR0cnMsIFNwbGl0VklucHV0c30gZnJvbSAnQHRlbnNvcmZsb3cvdGZqcy1jb3JlJztcbmltcG9ydCB7S2VybmVsQ29uZmlnLCBLZXJuZWxGdW5jLCBTcGxpdFYsIFRlbnNvckluZm8sIHV0aWx9IGZyb20gJ0B0ZW5zb3JmbG93L3RmanMtY29yZSc7XG5cbmltcG9ydCB7TWF0aEJhY2tlbmRDUFV9IGZyb20gJy4uL2JhY2tlbmRfY3B1JztcbmltcG9ydCB7c2xpY2V9IGZyb20gJy4vU2xpY2UnO1xuXG5leHBvcnQgZnVuY3Rpb24gc3BsaXRWKFxuICAgIGFyZ3M6IHtpbnB1dHM6IFNwbGl0VklucHV0cywgYmFja2VuZDogTWF0aEJhY2tlbmRDUFUsIGF0dHJzOiBTcGxpdFZBdHRyc30pOlxuICAgIFRlbnNvckluZm9bXSB7XG4gIGNvbnN0IHtpbnB1dHMsIGJhY2tlbmQsIGF0dHJzfSA9IGFyZ3M7XG4gIGNvbnN0IHt4fSA9IGlucHV0cztcbiAgY29uc3Qge251bU9yU2l6ZVNwbGl0cywgYXhpc30gPSBhdHRycztcblxuICBjb25zdCAkYXhpcyA9IHV0aWwucGFyc2VBeGlzUGFyYW0oYXhpcywgeC5zaGFwZSlbMF07XG4gIGNvbnN0IHNwbGl0U2l6ZXMgPSBiYWNrZW5kX3V0aWwucHJlcGFyZVNwbGl0U2l6ZSh4LCBudW1PclNpemVTcGxpdHMsICRheGlzKTtcblxuICBjb25zdCBiZWdpbiA9IG5ldyBBcnJheSh4LnNoYXBlLmxlbmd0aCkuZmlsbCgwKTtcbiAgY29uc3Qgc2l6ZSA9IHguc2hhcGUuc2xpY2UoKTtcbiAgcmV0dXJuIHNwbGl0U2l6ZXMubWFwKHMgPT4ge1xuICAgIGNvbnN0IHNsaWNlU2l6ZSA9IFsuLi5zaXplXTtcbiAgICBzbGljZVNpemVbJGF4aXNdID0gcztcbiAgICBjb25zdCBzbGljZVQgPVxuICAgICAgICBzbGljZSh7aW5wdXRzOiB7eH0sIGJhY2tlbmQsIGF0dHJzOiB7YmVnaW4sIHNpemU6IHNsaWNlU2l6ZX19KTtcbiAgICBiZWdpblskYXhpc10gKz0gcztcbiAgICByZXR1cm4gc2xpY2VUO1xuICB9KTtcbn1cblxuZXhwb3J0IGNvbnN0IHNwbGl0VkNvbmZpZzogS2VybmVsQ29uZmlnID0ge1xuICBrZXJuZWxOYW1lOiBTcGxpdFYsXG4gIGJhY2tlbmROYW1lOiAnY3B1JyxcbiAga2VybmVsRnVuYzogc3BsaXRWIGFzIHt9IGFzIEtlcm5lbEZ1bmNcbn07XG4iXX0=","/**\n * @license\n * Copyright 2020 Google LLC. All Rights Reserved.\n * Licensed under the Apache License, Version 2.0 (the License);\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an AS IS BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n * =============================================================================\n */\nimport { Sqrt } from '@tensorflow/tfjs-core';\nimport { createSimpleUnaryImpl } from '../utils/unary_impl';\nimport { unaryKernelFunc } from '../utils/unary_utils';\nexport const sqrtImpl = createSimpleUnaryImpl((xi) => Math.sqrt(xi));\nexport const sqrt = unaryKernelFunc(Sqrt, (xi) => Math.sqrt(xi));\nexport const sqrtConfig = {\n kernelName: Sqrt,\n backendName: 'cpu',\n kernelFunc: sqrt,\n};\n//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiU3FydC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uLy4uL3RmanMtYmFja2VuZC1jcHUvc3JjL2tlcm5lbHMvU3FydC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQTs7Ozs7Ozs7Ozs7Ozs7O0dBZUc7QUFFSCxPQUFPLEVBQWUsSUFBSSxFQUFDLE1BQU0sdUJBQXVCLENBQUM7QUFFekQsT0FBTyxFQUFDLHFCQUFxQixFQUFDLE1BQU0scUJBQXFCLENBQUM7QUFDMUQsT0FBTyxFQUFDLGVBQWUsRUFBQyxNQUFNLHNCQUFzQixDQUFDO0FBRXJELE1BQU0sQ0FBQyxNQUFNLFFBQVEsR0FBRyxxQkFBcUIsQ0FBQyxDQUFDLEVBQUUsRUFBRSxFQUFFLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDO0FBQ3JFLE1BQU0sQ0FBQyxNQUFNLElBQUksR0FBRyxlQUFlLENBQUMsSUFBSSxFQUFFLENBQUMsRUFBRSxFQUFFLEVBQUUsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUM7QUFFakUsTUFBTSxDQUFDLE1BQU0sVUFBVSxHQUFpQjtJQUN0QyxVQUFVLEVBQUUsSUFBSTtJQUNoQixXQUFXLEVBQUUsS0FBSztJQUNsQixVQUFVLEVBQUUsSUFBSTtDQUNqQixDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiLyoqXG4gKiBAbGljZW5zZVxuICogQ29weXJpZ2h0IDIwMjAgR29vZ2xlIExMQy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC5cbiAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSBMaWNlbnNlKTtcbiAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS5cbiAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdFxuICpcbiAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMFxuICpcbiAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmVcbiAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuIEFTIElTIEJBU0lTLFxuICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuXG4gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kXG4gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS5cbiAqID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4gKi9cblxuaW1wb3J0IHtLZXJuZWxDb25maWcsIFNxcnR9IGZyb20gJ0B0ZW5zb3JmbG93L3RmanMtY29yZSc7XG5cbmltcG9ydCB7Y3JlYXRlU2ltcGxlVW5hcnlJbXBsfSBmcm9tICcuLi91dGlscy91bmFyeV9pbXBsJztcbmltcG9ydCB7dW5hcnlLZXJuZWxGdW5jfSBmcm9tICcuLi91dGlscy91bmFyeV91dGlscyc7XG5cbmV4cG9ydCBjb25zdCBzcXJ0SW1wbCA9IGNyZWF0ZVNpbXBsZVVuYXJ5SW1wbCgoeGkpID0+IE1hdGguc3FydCh4aSkpO1xuZXhwb3J0IGNvbnN0IHNxcnQgPSB1bmFyeUtlcm5lbEZ1bmMoU3FydCwgKHhpKSA9PiBNYXRoLnNxcnQoeGkpKTtcblxuZXhwb3J0IGNvbnN0IHNxcnRDb25maWc6IEtlcm5lbENvbmZpZyA9IHtcbiAga2VybmVsTmFtZTogU3FydCxcbiAgYmFja2VuZE5hbWU6ICdjcHUnLFxuICBrZXJuZWxGdW5jOiBzcXJ0LFxufTtcbiJdfQ==","/**\n * @license\n * Copyright 2019 Google LLC. All Rights Reserved.\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n * =============================================================================\n */\nimport { Square } from '@tensorflow/tfjs-core';\nimport { assertNotComplex } from '../cpu_util';\nexport const squareConfig = {\n kernelName: Square,\n backendName: 'cpu',\n kernelFunc: ({ inputs, backend }) => {\n const { x } = inputs;\n const cpuBackend = backend;\n assertNotComplex(x, 'square');\n const values = cpuBackend.data.get(x.dataId).values;\n const newValues = new Float32Array(values.length);\n for (let i = 0; i < values.length; ++i) {\n const value = values[i];\n newValues[i] = value * value;\n }\n const dataId = cpuBackend.write(newValues, x.shape, x.dtype);\n return { dataId, shape: x.shape, dtype: x.dtype };\n }\n};\n//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiU3F1YXJlLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vLi4vdGZqcy1iYWNrZW5kLWNwdS9zcmMva2VybmVscy9TcXVhcmUudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUE7Ozs7Ozs7Ozs7Ozs7OztHQWVHO0FBRUgsT0FBTyxFQUFDLE1BQU0sRUFBZSxNQUFNLHVCQUF1QixDQUFDO0FBRzNELE9BQU8sRUFBQyxnQkFBZ0IsRUFBQyxNQUFNLGFBQWEsQ0FBQztBQUU3QyxNQUFNLENBQUMsTUFBTSxZQUFZLEdBQWlCO0lBQ3hDLFVBQVUsRUFBRSxNQUFNO0lBQ2xCLFdBQVcsRUFBRSxLQUFLO0lBQ2xCLFVBQVUsRUFBRSxDQUFDLEVBQUMsTUFBTSxFQUFFLE9BQU8sRUFBQyxFQUFFLEVBQUU7UUFDaEMsTUFBTSxFQUFDLENBQUMsRUFBQyxHQUFHLE1BQXNCLENBQUM7UUFDbkMsTUFBTSxVQUFVLEdBQUcsT0FBeUIsQ0FBQztRQUM3QyxnQkFBZ0IsQ0FBQyxDQUFDLEVBQUUsUUFBUSxDQUFDLENBQUM7UUFFOUIsTUFBTSxNQUFNLEdBQUcsVUFBVSxDQUFDLElBQUksQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLE1BQU0sQ0FBQyxDQUFDLE1BQXNCLENBQUM7UUFDcEUsTUFBTSxTQUFTLEdBQUcsSUFBSSxZQUFZLENBQUMsTUFBTSxDQUFDLE1BQU0sQ0FBQyxDQUFDO1FBQ2xELEtBQUssSUFBSSxDQUFDLEdBQUcsQ0FBQyxFQUFFLENBQUMsR0FBRyxNQUFNLENBQUMsTUFBTSxFQUFFLEVBQUUsQ0FBQyxFQUFFO1lBQ3RDLE1BQU0sS0FBSyxHQUFHLE1BQU0sQ0FBQyxDQUFDLENBQUMsQ0FBQztZQUN4QixTQUFTLENBQUMsQ0FBQyxDQUFDLEdBQUcsS0FBSyxHQUFHLEtBQUssQ0FBQztTQUM5QjtRQUNELE1BQU0sTUFBTSxHQUFHLFVBQVUsQ0FBQyxLQUFLLENBQUMsU0FBUyxFQUFFLENBQUMsQ0FBQyxLQUFLLEVBQUUsQ0FBQyxDQUFDLEtBQUssQ0FBQyxDQUFDO1FBQzdELE9BQU8sRUFBQyxNQUFNLEVBQUUsS0FBSyxFQUFFLENBQUMsQ0FBQyxLQUFLLEVBQUUsS0FBSyxFQUFFLENBQUMsQ0FBQyxLQUFLLEVBQUMsQ0FBQztJQUNsRCxDQUFDO0NBQ0YsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbIi8qKlxuICogQGxpY2Vuc2VcbiAqIENvcHlyaWdodCAyMDE5IEdvb2dsZSBMTEMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuXG4gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgXCJMaWNlbnNlXCIpO1xuICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLlxuICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0XG4gKlxuICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wXG4gKlxuICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZVxuICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gXCJBUyBJU1wiIEJBU0lTLFxuICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuXG4gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kXG4gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS5cbiAqID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4gKi9cblxuaW1wb3J0IHtTcXVhcmUsIFNxdWFyZUlucHV0c30gZnJvbSAnQHRlbnNvcmZsb3cvdGZqcy1jb3JlJztcbmltcG9ydCB7S2VybmVsQ29uZmlnfSBmcm9tICdAdGVuc29yZmxvdy90ZmpzLWNvcmUnO1xuaW1wb3J0IHtNYXRoQmFja2VuZENQVX0gZnJvbSAnLi4vYmFja2VuZF9jcHUnO1xuaW1wb3J0IHthc3NlcnROb3RDb21wbGV4fSBmcm9tICcuLi9jcHVfdXRpbCc7XG5cbmV4cG9ydCBjb25zdCBzcXVhcmVDb25maWc6IEtlcm5lbENvbmZpZyA9IHtcbiAga2VybmVsTmFtZTogU3F1YXJlLFxuICBiYWNrZW5kTmFtZTogJ2NwdScsXG4gIGtlcm5lbEZ1bmM6ICh7aW5wdXRzLCBiYWNrZW5kfSkgPT4ge1xuICAgIGNvbnN0IHt4fSA9IGlucHV0cyBhcyBTcXVhcmVJbnB1dHM7XG4gICAgY29uc3QgY3B1QmFja2VuZCA9IGJhY2tlbmQgYXMgTWF0aEJhY2tlbmRDUFU7XG4gICAgYXNzZXJ0Tm90Q29tcGxleCh4LCAnc3F1YXJlJyk7XG5cbiAgICBjb25zdCB2YWx1ZXMgPSBjcHVCYWNrZW5kLmRhdGEuZ2V0KHguZGF0YUlkKS52YWx1ZXMgYXMgRmxvYXQzMkFycmF5O1xuICAgIGNvbnN0IG5ld1ZhbHVlcyA9IG5ldyBGbG9hdDMyQXJyYXkodmFsdWVzLmxlbmd0aCk7XG4gICAgZm9yIChsZXQgaSA9IDA7IGkgPCB2YWx1ZXMubGVuZ3RoOyArK2kpIHtcbiAgICAgIGNvbnN0IHZhbHVlID0gdmFsdWVzW2ldO1xuICAgICAgbmV3VmFsdWVzW2ldID0gdmFsdWUgKiB2YWx1ZTtcbiAgICB9XG4gICAgY29uc3QgZGF0YUlkID0gY3B1QmFja2VuZC53cml0ZShuZXdWYWx1ZXMsIHguc2hhcGUsIHguZHR5cGUpO1xuICAgIHJldHVybiB7ZGF0YUlkLCBzaGFwZTogeC5zaGFwZSwgZHR5cGU6IHguZHR5cGV9O1xuICB9XG59O1xuIl19","/**\n * @license\n * Copyright 2020 Google LLC. All Rights Reserved.\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n * =============================================================================\n */\nimport { SquaredDifference } from '@tensorflow/tfjs-core';\nimport { createSimpleBinaryKernelImpl } from '../utils/binary_impl';\nimport { binaryKernelFunc } from '../utils/binary_utils';\nexport const squaredDifferenceImpl = createSimpleBinaryKernelImpl(((a, b) => {\n const diff = a - b;\n return diff * diff;\n}));\nexport const squaredDifference = binaryKernelFunc(SquaredDifference, squaredDifferenceImpl);\nexport const squaredDifferenceConfig = {\n kernelName: SquaredDifference,\n backendName: 'cpu',\n kernelFunc: squaredDifference\n};\n//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiU3F1YXJlZERpZmZlcmVuY2UuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi8uLi90ZmpzLWJhY2tlbmQtY3B1L3NyYy9rZXJuZWxzL1NxdWFyZWREaWZmZXJlbmNlLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBOzs7Ozs7Ozs7Ozs7Ozs7R0FlRztBQUVILE9BQU8sRUFBZSxpQkFBaUIsRUFBQyxNQUFNLHVCQUF1QixDQUFDO0FBRXRFLE9BQU8sRUFBQyw0QkFBNEIsRUFBQyxNQUFNLHNCQUFzQixDQUFDO0FBQ2xFLE9BQU8sRUFBQyxnQkFBZ0IsRUFBQyxNQUFNLHVCQUF1QixDQUFDO0FBRXZELE1BQU0sQ0FBQyxNQUFNLHFCQUFxQixHQUM5Qiw0QkFBNEIsQ0FBQyxDQUFDLENBQUMsQ0FBUyxFQUFFLENBQVMsRUFBRSxFQUFFO0lBQ3JELE1BQU0sSUFBSSxHQUFHLENBQUMsR0FBRyxDQUFDLENBQUM7SUFDbkIsT0FBTyxJQUFJLEdBQUcsSUFBSSxDQUFDO0FBQ3JCLENBQUMsQ0FBQyxDQUFDLENBQUM7QUFDUixNQUFNLENBQUMsTUFBTSxpQkFBaUIsR0FDMUIsZ0JBQWdCLENBQUMsaUJBQWlCLEVBQUUscUJBQXFCLENBQUMsQ0FBQztBQUUvRCxNQUFNLENBQUMsTUFBTSx1QkFBdUIsR0FBaUI7SUFDbkQsVUFBVSxFQUFFLGlCQUFpQjtJQUM3QixXQUFXLEVBQUUsS0FBSztJQUNsQixVQUFVLEVBQUUsaUJBQWlCO0NBQzlCLENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyIvKipcbiAqIEBsaWNlbnNlXG4gKiBDb3B5cmlnaHQgMjAyMCBHb29nbGUgTExDLiBBbGwgUmlnaHRzIFJlc2VydmVkLlxuICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlIFwiTGljZW5zZVwiKTtcbiAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS5cbiAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdFxuICpcbiAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMFxuICpcbiAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmVcbiAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuIFwiQVMgSVNcIiBCQVNJUyxcbiAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLlxuICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZFxuICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuXG4gKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuICovXG5cbmltcG9ydCB7S2VybmVsQ29uZmlnLCBTcXVhcmVkRGlmZmVyZW5jZX0gZnJvbSAnQHRlbnNvcmZsb3cvdGZqcy1jb3JlJztcblxuaW1wb3J0IHtjcmVhdGVTaW1wbGVCaW5hcnlLZXJuZWxJbXBsfSBmcm9tICcuLi91dGlscy9iaW5hcnlfaW1wbCc7XG5pbXBvcnQge2JpbmFyeUtlcm5lbEZ1bmN9IGZyb20gJy4uL3V0aWxzL2JpbmFyeV91dGlscyc7XG5cbmV4cG9ydCBjb25zdCBzcXVhcmVkRGlmZmVyZW5jZUltcGwgPVxuICAgIGNyZWF0ZVNpbXBsZUJpbmFyeUtlcm5lbEltcGwoKChhOiBudW1iZXIsIGI6IG51bWJlcikgPT4ge1xuICAgICAgY29uc3QgZGlmZiA9IGEgLSBiO1xuICAgICAgcmV0dXJuIGRpZmYgKiBkaWZmO1xuICAgIH0pKTtcbmV4cG9ydCBjb25zdCBzcXVhcmVkRGlmZmVyZW5jZSA9XG4gICAgYmluYXJ5S2VybmVsRnVuYyhTcXVhcmVkRGlmZmVyZW5jZSwgc3F1YXJlZERpZmZlcmVuY2VJbXBsKTtcblxuZXhwb3J0IGNvbnN0IHNxdWFyZWREaWZmZXJlbmNlQ29uZmlnOiBLZXJuZWxDb25maWcgPSB7XG4gIGtlcm5lbE5hbWU6IFNxdWFyZWREaWZmZXJlbmNlLFxuICBiYWNrZW5kTmFtZTogJ2NwdScsXG4gIGtlcm5lbEZ1bmM6IHNxdWFyZWREaWZmZXJlbmNlXG59O1xuIl19","/**\n * @license\n * Copyright 2020 Google LLC. All Rights Reserved.\n * Licensed under the Apache License, Version 2.0 (the License);\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an AS IS BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n * =============================================================================\n */\nimport { Step } from '@tensorflow/tfjs-core';\nimport { unaryKernelFunc } from '../utils/unary_utils';\nexport const step = unaryKernelFunc(Step, (xi, attrs) => {\n const stepAttrs = attrs;\n if (isNaN(xi)) {\n return NaN;\n }\n else {\n return xi > 0 ? 1 : stepAttrs.alpha;\n }\n});\nexport const stepConfig = {\n kernelName: Step,\n backendName: 'cpu',\n kernelFunc: step,\n};\n//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiU3RlcC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uLy4uL3RmanMtYmFja2VuZC1jcHUvc3JjL2tlcm5lbHMvU3RlcC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQTs7Ozs7Ozs7Ozs7Ozs7O0dBZUc7QUFFSCxPQUFPLEVBQWUsSUFBSSxFQUFZLE1BQU0sdUJBQXVCLENBQUM7QUFFcEUsT0FBTyxFQUFDLGVBQWUsRUFBQyxNQUFNLHNCQUFzQixDQUFDO0FBRXJELE1BQU0sQ0FBQyxNQUFNLElBQUksR0FBRyxlQUFlLENBQUMsSUFBSSxFQUFFLENBQUMsRUFBRSxFQUFFLEtBQUssRUFBRSxFQUFFO0lBQ3RELE1BQU0sU0FBUyxHQUFHLEtBQXdCLENBQUM7SUFDM0MsSUFBSSxLQUFLLENBQUMsRUFBRSxDQUFDLEVBQUU7UUFDYixPQUFPLEdBQUcsQ0FBQztLQUNaO1NBQU07UUFDTCxPQUFPLEVBQUUsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsU0FBUyxDQUFDLEtBQUssQ0FBQztLQUNyQztBQUNILENBQUMsQ0FBQyxDQUFDO0FBRUgsTUFBTSxDQUFDLE1BQU0sVUFBVSxHQUFpQjtJQUN0QyxVQUFVLEVBQUUsSUFBSTtJQUNoQixXQUFXLEVBQUUsS0FBSztJQUNsQixVQUFVLEVBQUUsSUFBSTtDQUNqQixDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiLyoqXG4gKiBAbGljZW5zZVxuICogQ29weXJpZ2h0IDIwMjAgR29vZ2xlIExMQy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC5cbiAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSBMaWNlbnNlKTtcbiAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS5cbiAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdFxuICpcbiAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMFxuICpcbiAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmVcbiAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuIEFTIElTIEJBU0lTLFxuICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuXG4gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kXG4gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS5cbiAqID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4gKi9cblxuaW1wb3J0IHtLZXJuZWxDb25maWcsIFN0ZXAsIFN0ZXBBdHRyc30gZnJvbSAnQHRlbnNvcmZsb3cvdGZqcy1jb3JlJztcblxuaW1wb3J0IHt1bmFyeUtlcm5lbEZ1bmN9IGZyb20gJy4uL3V0aWxzL3VuYXJ5X3V0aWxzJztcblxuZXhwb3J0IGNvbnN0IHN0ZXAgPSB1bmFyeUtlcm5lbEZ1bmMoU3RlcCwgKHhpLCBhdHRycykgPT4ge1xuICBjb25zdCBzdGVwQXR0cnMgPSBhdHRycyBhcyB7fSBhcyBTdGVwQXR0cnM7XG4gIGlmIChpc05hTih4aSkpIHtcbiAgICByZXR1cm4gTmFOO1xuICB9IGVsc2Uge1xuICAgIHJldHVybiB4aSA+IDAgPyAxIDogc3RlcEF0dHJzLmFscGhhO1xuICB9XG59KTtcblxuZXhwb3J0IGNvbnN0IHN0ZXBDb25maWc6IEtlcm5lbENvbmZpZyA9IHtcbiAga2VybmVsTmFtZTogU3RlcCxcbiAgYmFja2VuZE5hbWU6ICdjcHUnLFxuICBrZXJuZWxGdW5jOiBzdGVwLFxufTtcbiJdfQ==","/**\n * @license\n * Copyright 2020 Google LLC. All Rights Reserved.\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n * =============================================================================\n */\nimport { buffer } from '@tensorflow/tfjs-core';\nexport function stridedSliceImpl(outShape, xBuf, strides, begin) {\n const outBuf = buffer(outShape, xBuf.dtype);\n for (let i = 0; i < outBuf.size; i++) {\n const loc = outBuf.indexToLoc(i);\n const newLoc = new Array(loc.length);\n for (let j = 0; j < newLoc.length; j++) {\n newLoc[j] = loc[j] * strides[j] + begin[j];\n }\n outBuf.set(xBuf.get(...newLoc), ...loc);\n }\n return outBuf;\n}\n//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiU3RyaWRlZFNsaWNlX2ltcGwuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi8uLi90ZmpzLWJhY2tlbmQtY3B1L3NyYy9rZXJuZWxzL1N0cmlkZWRTbGljZV9pbXBsLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBOzs7Ozs7Ozs7Ozs7Ozs7R0FlRztBQUVILE9BQU8sRUFBQyxNQUFNLEVBQXFCLE1BQU0sdUJBQXVCLENBQUM7QUFFakUsTUFBTSxVQUFVLGdCQUFnQixDQUM1QixRQUFrQixFQUFFLElBQXFCLEVBQUUsT0FBaUIsRUFDNUQsS0FBZTtJQUNqQixNQUFNLE1BQU0sR0FBRyxNQUFNLENBQUMsUUFBUSxFQUFFLElBQUksQ0FBQyxLQUFLLENBQUMsQ0FBQztJQUU1QyxLQUFLLElBQUksQ0FBQyxHQUFHLENBQUMsRUFBRSxDQUFDLEdBQUcsTUFBTSxDQUFDLElBQUksRUFBRSxDQUFDLEVBQUUsRUFBRTtRQUNwQyxNQUFNLEdBQUcsR0FBRyxNQUFNLENBQUMsVUFBVSxDQUFDLENBQUMsQ0FBQyxDQUFDO1FBRWpDLE1BQU0sTUFBTSxHQUFhLElBQUksS0FBSyxDQUFDLEdBQUcsQ0FBQyxNQUFNLENBQUMsQ0FBQztRQUMvQyxLQUFLLElBQUksQ0FBQyxHQUFHLENBQUMsRUFBRSxDQUFDLEdBQUcsTUFBTSxDQUFDLE1BQU0sRUFBRSxDQUFDLEVBQUUsRUFBRTtZQUN0QyxNQUFNLENBQUMsQ0FBQyxDQUFDLEdBQUcsR0FBRyxDQUFDLENBQUMsQ0FBQyxHQUFHLE9BQU8sQ0FBQyxDQUFDLENBQUMsR0FBRyxLQUFLLENBQUMsQ0FBQyxDQUFDLENBQUM7U0FDNUM7UUFDRCxNQUFNLENBQUMsR0FBRyxDQUFDLElBQUksQ0FBQyxHQUFHLENBQUMsR0FBRyxNQUFNLENBQUMsRUFBRSxHQUFHLEdBQUcsQ0FBQyxDQUFDO0tBQ3pDO0lBRUQsT0FBTyxNQUF5QixDQUFDO0FBQ25DLENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyIvKipcbiAqIEBsaWNlbnNlXG4gKiBDb3B5cmlnaHQgMjAyMCBHb29nbGUgTExDLiBBbGwgUmlnaHRzIFJlc2VydmVkLlxuICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlIFwiTGljZW5zZVwiKTtcbiAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS5cbiAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdFxuICpcbiAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMFxuICpcbiAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmVcbiAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuIFwiQVMgSVNcIiBCQVNJUyxcbiAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLlxuICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZFxuICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuXG4gKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuICovXG5cbmltcG9ydCB7YnVmZmVyLCBSYW5rLCBUZW5zb3JCdWZmZXJ9IGZyb20gJ0B0ZW5zb3JmbG93L3RmanMtY29yZSc7XG5cbmV4cG9ydCBmdW5jdGlvbiBzdHJpZGVkU2xpY2VJbXBsPFIgZXh0ZW5kcyBSYW5rPihcbiAgICBvdXRTaGFwZTogbnVtYmVyW10sIHhCdWY6IFRlbnNvckJ1ZmZlcjxSPiwgc3RyaWRlczogbnVtYmVyW10sXG4gICAgYmVnaW46IG51bWJlcltdKTogVGVuc29yQnVmZmVyPFI+IHtcbiAgY29uc3Qgb3V0QnVmID0gYnVmZmVyKG91dFNoYXBlLCB4QnVmLmR0eXBlKTtcblxuICBmb3IgKGxldCBpID0gMDsgaSA8IG91dEJ1Zi5zaXplOyBpKyspIHtcbiAgICBjb25zdCBsb2MgPSBvdXRCdWYuaW5kZXhUb0xvYyhpKTtcblxuICAgIGNvbnN0IG5ld0xvYzogbnVtYmVyW10gPSBuZXcgQXJyYXkobG9jLmxlbmd0aCk7XG4gICAgZm9yIChsZXQgaiA9IDA7IGogPCBuZXdMb2MubGVuZ3RoOyBqKyspIHtcbiAgICAgIG5ld0xvY1tqXSA9IGxvY1tqXSAqIHN0cmlkZXNbal0gKyBiZWdpbltqXTtcbiAgICB9XG4gICAgb3V0QnVmLnNldCh4QnVmLmdldCguLi5uZXdMb2MpLCAuLi5sb2MpO1xuICB9XG5cbiAgcmV0dXJuIG91dEJ1ZiBhcyBUZW5zb3JCdWZmZXI8Uj47XG59XG4iXX0=","/**\n * @license\n * Copyright 2020 Google LLC. All Rights Reserved.\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n * =============================================================================\n */\nimport { slice_util, StridedSlice, util } from '@tensorflow/tfjs-core';\nimport { assertNotComplex } from '../cpu_util';\nimport { reshape } from './Reshape';\nimport { slice } from './Slice';\nimport { stridedSliceImpl } from './StridedSlice_impl';\nexport function stridedSlice(args) {\n const { inputs, backend, attrs } = args;\n const { x } = inputs;\n const { begin, end, strides, beginMask, endMask, ellipsisMask, newAxisMask, shrinkAxisMask } = attrs;\n assertNotComplex(x, 'stridedSlice');\n const { finalShapeSparse, finalShape, isIdentity, sliceDim0, isSimpleSlice, begin: $begin, end: $end, strides: $strides } = slice_util.sliceInfo(x.shape, begin, end, strides, beginMask, endMask, ellipsisMask, newAxisMask, shrinkAxisMask);\n let result;\n // ref:\n // https://github.com/tensorflow/tensorflow/blob/master/tensorflow/core/kernels/strided_slice_op.cc\n if (isIdentity) {\n // Optimization #1, slice is a no-op plus reshape\n result = reshape({ inputs: { x }, backend, attrs: { shape: finalShape } });\n }\n else if (sliceDim0 || isSimpleSlice) {\n // Optimization #2, slice is memory contiguous (only occurs in dim 0)\n util.assert(x.shape.length >= 1, () => `Input must have rank at least 1, got: ${x.shape.length}`);\n const size = slice_util.computeOutShape($begin, $end, $strides);\n // To tolerate begin[0] > end[0] (a 0-output slice), we min(begin, end).\n const sliced = slice({ inputs: { x }, backend, attrs: { begin: $begin, size } });\n result =\n reshape({ inputs: { x: sliced }, backend, attrs: { shape: finalShape } });\n backend.disposeIntermediateTensorInfo(sliced);\n }\n else {\n const xBuf = backend.bufferSync(x);\n const outBuf = stridedSliceImpl(finalShapeSparse, xBuf, $strides, $begin);\n result = backend.makeTensorInfo(finalShape, outBuf.dtype, outBuf.values);\n }\n return result;\n}\nexport const stridedSliceConfig = {\n kernelName: StridedSlice,\n backendName: 'cpu',\n kernelFunc: stridedSlice\n};\n//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiU3RyaWRlZFNsaWNlLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vLi4vdGZqcy1iYWNrZW5kLWNwdS9zcmMva2VybmVscy9TdHJpZGVkU2xpY2UudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUE7Ozs7Ozs7Ozs7Ozs7OztHQWVHO0FBRUgsT0FBTyxFQUFpQyxVQUFVLEVBQUUsWUFBWSxFQUFxRCxJQUFJLEVBQUMsTUFBTSx1QkFBdUIsQ0FBQztBQUd4SixPQUFPLEVBQUMsZ0JBQWdCLEVBQUMsTUFBTSxhQUFhLENBQUM7QUFDN0MsT0FBTyxFQUFDLE9BQU8sRUFBQyxNQUFNLFdBQVcsQ0FBQztBQUNsQyxPQUFPLEVBQUMsS0FBSyxFQUFDLE1BQU0sU0FBUyxDQUFDO0FBQzlCLE9BQU8sRUFBQyxnQkFBZ0IsRUFBQyxNQUFNLHFCQUFxQixDQUFDO0FBRXJELE1BQU0sVUFBVSxZQUFZLENBQUMsSUFJNUI7SUFDQyxNQUFNLEVBQUMsTUFBTSxFQUFFLE9BQU8sRUFBRSxLQUFLLEVBQUMsR0FBRyxJQUFJLENBQUM7SUFDdEMsTUFBTSxFQUFDLENBQUMsRUFBQyxHQUFHLE1BQU0sQ0FBQztJQUNuQixNQUFNLEVBQ0osS0FBSyxFQUNMLEdBQUcsRUFDSCxPQUFPLEVBQ1AsU0FBUyxFQUNULE9BQU8sRUFDUCxZQUFZLEVBQ1osV0FBVyxFQUNYLGNBQWMsRUFDZixHQUFHLEtBQUssQ0FBQztJQUVWLGdCQUFnQixDQUFDLENBQUMsRUFBRSxjQUFjLENBQUMsQ0FBQztJQUVwQyxNQUFNLEVBQ0osZ0JBQWdCLEVBQ2hCLFVBQVUsRUFDVixVQUFVLEVBQ1YsU0FBUyxFQUNULGFBQWEsRUFDYixLQUFLLEVBQUUsTUFBTSxFQUNiLEdBQUcsRUFBRSxJQUFJLEVBQ1QsT0FBTyxFQUFFLFFBQVEsRUFDbEIsR0FDRyxVQUFVLENBQUMsU0FBUyxDQUNoQixDQUFDLENBQUMsS0FBSyxFQUFFLEtBQUssRUFBRSxHQUFHLEVBQUUsT0FBTyxFQUFFLFNBQVMsRUFBRSxPQUFPLEVBQUUsWUFBWSxFQUM5RCxXQUFXLEVBQUUsY0FBYyxDQUFDLENBQUM7SUFFckMsSUFBSSxNQUFNLENBQUM7SUFFWCxPQUFPO0lBQ1AsbUdBQW1HO0lBQ25HLElBQUksVUFBVSxFQUFFO1FBQ2QsaURBQWlEO1FBQ2pELE1BQU0sR0FBRyxPQUFPLENBQUMsRUFBQyxNQUFNLEVBQUUsRUFBQyxDQUFDLEVBQUMsRUFBRSxPQUFPLEVBQUUsS0FBSyxFQUFFLEVBQUMsS0FBSyxFQUFFLFVBQVUsRUFBQyxFQUFDLENBQUMsQ0FBQztLQUN0RTtTQUFNLElBQUksU0FBUyxJQUFJLGFBQWEsRUFBRTtRQUNyQyxxRUFBcUU7UUFDckUsSUFBSSxDQUFDLE1BQU0sQ0FDUCxDQUFDLENBQUMsS0FBSyxDQUFDLE1BQU0sSUFBSSxDQUFDLEVBQ25CLEdBQUcsRUFBRSxDQUFDLHlDQUF5QyxDQUFDLENBQUMsS0FBSyxDQUFDLE1BQU0sRUFBRSxDQUFDLENBQUM7UUFFckUsTUFBTSxJQUFJLEdBQUcsVUFBVSxDQUFDLGVBQWUsQ0FBQyxNQUFNLEVBQUUsSUFBSSxFQUFFLFFBQVEsQ0FBQyxDQUFDO1FBQ2hFLHdFQUF3RTtRQUN4RSxNQUFNLE1BQU0sR0FBRyxLQUFLLENBQUMsRUFBQyxNQUFNLEVBQUUsRUFBQyxDQUFDLEVBQUMsRUFBRSxPQUFPLEVBQUUsS0FBSyxFQUFFLEVBQUMsS0FBSyxFQUFFLE1BQU0sRUFBRSxJQUFJLEVBQUMsRUFBQyxDQUFDLENBQUM7UUFDM0UsTUFBTTtZQUNGLE9BQU8sQ0FBQyxFQUFDLE1BQU0sRUFBRSxFQUFDLENBQUMsRUFBRSxNQUFNLEVBQUMsRUFBRSxPQUFPLEVBQUUsS0FBSyxFQUFFLEVBQUMsS0FBSyxFQUFFLFVBQVUsRUFBQyxFQUFDLENBQUMsQ0FBQztRQUN4RSxPQUFPLENBQUMsNkJBQTZCLENBQUMsTUFBTSxDQUFDLENBQUM7S0FDL0M7U0FBTTtRQUNMLE1BQU0sSUFBSSxHQUFHLE9BQU8sQ0FBQyxVQUFVLENBQWtCLENBQUMsQ0FBQyxDQUFDO1FBQ3BELE1BQU0sTUFBTSxHQUFHLGdCQUFnQixDQUFDLGdCQUFnQixFQUFFLElBQUksRUFBRSxRQUFRLEVBQUUsTUFBTSxDQUFDLENBQUM7UUFFMUUsTUFBTSxHQUFHLE9BQU8sQ0FBQyxjQUFjLENBQUMsVUFBVSxFQUFFLE1BQU0sQ0FBQyxLQUFLLEVBQUUsTUFBTSxDQUFDLE1BQU0sQ0FBQyxDQUFDO0tBQzFFO0lBRUQsT0FBTyxNQUFNLENBQUM7QUFDaEIsQ0FBQztBQUVELE1BQU0sQ0FBQyxNQUFNLGtCQUFrQixHQUFpQjtJQUM5QyxVQUFVLEVBQUUsWUFBWTtJQUN4QixXQUFXLEVBQUUsS0FBSztJQUNsQixVQUFVLEVBQUUsWUFBZ0M7Q0FDN0MsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbIi8qKlxuICogQGxpY2Vuc2VcbiAqIENvcHlyaWdodCAyMDIwIEdvb2dsZSBMTEMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuXG4gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgXCJMaWNlbnNlXCIpO1xuICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLlxuICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0XG4gKlxuICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wXG4gKlxuICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZVxuICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gXCJBUyBJU1wiIEJBU0lTLFxuICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuXG4gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kXG4gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS5cbiAqID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4gKi9cblxuaW1wb3J0IHtLZXJuZWxDb25maWcsIEtlcm5lbEZ1bmMsIFJhbmssIHNsaWNlX3V0aWwsIFN0cmlkZWRTbGljZSwgU3RyaWRlZFNsaWNlQXR0cnMsIFN0cmlkZWRTbGljZUlucHV0cywgVGVuc29ySW5mbywgdXRpbH0gZnJvbSAnQHRlbnNvcmZsb3cvdGZqcy1jb3JlJztcblxuaW1wb3J0IHtNYXRoQmFja2VuZENQVX0gZnJvbSAnLi4vYmFja2VuZF9jcHUnO1xuaW1wb3J0IHthc3NlcnROb3RDb21wbGV4fSBmcm9tICcuLi9jcHVfdXRpbCc7XG5pbXBvcnQge3Jlc2hhcGV9IGZyb20gJy4vUmVzaGFwZSc7XG5pbXBvcnQge3NsaWNlfSBmcm9tICcuL1NsaWNlJztcbmltcG9ydCB7c3RyaWRlZFNsaWNlSW1wbH0gZnJvbSAnLi9TdHJpZGVkU2xpY2VfaW1wbCc7XG5cbmV4cG9ydCBmdW5jdGlvbiBzdHJpZGVkU2xpY2UoYXJnczoge1xuICBpbnB1dHM6IFN0cmlkZWRTbGljZUlucHV0cyxcbiAgYmFja2VuZDogTWF0aEJhY2tlbmRDUFUsXG4gIGF0dHJzOiBTdHJpZGVkU2xpY2VBdHRyc1xufSk6IFRlbnNvckluZm8ge1xuICBjb25zdCB7aW5wdXRzLCBiYWNrZW5kLCBhdHRyc30gPSBhcmdzO1xuICBjb25zdCB7eH0gPSBpbnB1dHM7XG4gIGNvbnN0IHtcbiAgICBiZWdpbixcbiAgICBlbmQsXG4gICAgc3RyaWRlcyxcbiAgICBiZWdpbk1hc2ssXG4gICAgZW5kTWFzayxcbiAgICBlbGxpcHNpc01hc2ssXG4gICAgbmV3QXhpc01hc2ssXG4gICAgc2hyaW5rQXhpc01hc2tcbiAgfSA9IGF0dHJzO1xuXG4gIGFzc2VydE5vdENvbXBsZXgoeCwgJ3N0cmlkZWRTbGljZScpO1xuXG4gIGNvbnN0IHtcbiAgICBmaW5hbFNoYXBlU3BhcnNlLFxuICAgIGZpbmFsU2hhcGUsXG4gICAgaXNJZGVudGl0eSxcbiAgICBzbGljZURpbTAsXG4gICAgaXNTaW1wbGVTbGljZSxcbiAgICBiZWdpbjogJGJlZ2luLFxuICAgIGVuZDogJGVuZCxcbiAgICBzdHJpZGVzOiAkc3RyaWRlc1xuICB9ID1cbiAgICAgIHNsaWNlX3V0aWwuc2xpY2VJbmZvKFxuICAgICAgICAgIHguc2hhcGUsIGJlZ2luLCBlbmQsIHN0cmlkZXMsIGJlZ2luTWFzaywgZW5kTWFzaywgZWxsaXBzaXNNYXNrLFxuICAgICAgICAgIG5ld0F4aXNNYXNrLCBzaHJpbmtBeGlzTWFzayk7XG5cbiAgbGV0IHJlc3VsdDtcblxuICAvLyByZWY6XG4gIC8vIGh0dHBzOi8vZ2l0aHViLmNvbS90ZW5zb3JmbG93L3RlbnNvcmZsb3cvYmxvYi9tYXN0ZXIvdGVuc29yZmxvdy9jb3JlL2tlcm5lbHMvc3RyaWRlZF9zbGljZV9vcC5jY1xuICBpZiAoaXNJZGVudGl0eSkge1xuICAgIC8vIE9wdGltaXphdGlvbiAjMSwgc2xpY2UgaXMgYSBuby1vcCBwbHVzIHJlc2hhcGVcbiAgICByZXN1bHQgPSByZXNoYXBlKHtpbnB1dHM6IHt4fSwgYmFja2VuZCwgYXR0cnM6IHtzaGFwZTogZmluYWxTaGFwZX19KTtcbiAgfSBlbHNlIGlmIChzbGljZURpbTAgfHwgaXNTaW1wbGVTbGljZSkge1xuICAgIC8vIE9wdGltaXphdGlvbiAjMiwgc2xpY2UgaXMgbWVtb3J5IGNvbnRpZ3VvdXMgKG9ubHkgb2NjdXJzIGluIGRpbSAwKVxuICAgIHV0aWwuYXNzZXJ0KFxuICAgICAgICB4LnNoYXBlLmxlbmd0aCA+PSAxLFxuICAgICAgICAoKSA9PiBgSW5wdXQgbXVzdCBoYXZlIHJhbmsgYXQgbGVhc3QgMSwgZ290OiAke3guc2hhcGUubGVuZ3RofWApO1xuXG4gICAgY29uc3Qgc2l6ZSA9IHNsaWNlX3V0aWwuY29tcHV0ZU91dFNoYXBlKCRiZWdpbiwgJGVuZCwgJHN0cmlkZXMpO1xuICAgIC8vIFRvIHRvbGVyYXRlIGJlZ2luWzBdID4gZW5kWzBdIChhIDAtb3V0cHV0IHNsaWNlKSwgd2UgbWluKGJlZ2luLCBlbmQpLlxuICAgIGNvbnN0IHNsaWNlZCA9IHNsaWNlKHtpbnB1dHM6IHt4fSwgYmFja2VuZCwgYXR0cnM6IHtiZWdpbjogJGJlZ2luLCBzaXplfX0pO1xuICAgIHJlc3VsdCA9XG4gICAgICAgIHJlc2hhcGUoe2lucHV0czoge3g6IHNsaWNlZH0sIGJhY2tlbmQsIGF0dHJzOiB7c2hhcGU6IGZpbmFsU2hhcGV9fSk7XG4gICAgYmFja2VuZC5kaXNwb3NlSW50ZXJtZWRpYXRlVGVuc29ySW5mbyhzbGljZWQpO1xuICB9IGVsc2Uge1xuICAgIGNvbnN0IHhCdWYgPSBiYWNrZW5kLmJ1ZmZlclN5bmM8UmFuaywgJ2Zsb2F0MzInPih4KTtcbiAgICBjb25zdCBvdXRCdWYgPSBzdHJpZGVkU2xpY2VJbXBsKGZpbmFsU2hhcGVTcGFyc2UsIHhCdWYsICRzdHJpZGVzLCAkYmVnaW4pO1xuXG4gICAgcmVzdWx0ID0gYmFja2VuZC5tYWtlVGVuc29ySW5mbyhmaW5hbFNoYXBlLCBvdXRCdWYuZHR5cGUsIG91dEJ1Zi52YWx1ZXMpO1xuICB9XG5cbiAgcmV0dXJuIHJlc3VsdDtcbn1cblxuZXhwb3J0IGNvbnN0IHN0cmlkZWRTbGljZUNvbmZpZzogS2VybmVsQ29uZmlnID0ge1xuICBrZXJuZWxOYW1lOiBTdHJpZGVkU2xpY2UsXG4gIGJhY2tlbmROYW1lOiAnY3B1JyxcbiAga2VybmVsRnVuYzogc3RyaWRlZFNsaWNlIGFzIHt9IGFzIEtlcm5lbEZ1bmNcbn07XG4iXX0=","/**\n * @license\n * Copyright 2021 Google LLC. All Rights Reserved.\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n * =============================================================================\n */\nimport { util } from '@tensorflow/tfjs-core';\n/**\n * The StringNGramsOp class creates ngrams from ragged string data.\n * The constructor contains all attributes related to the operation such as\n * padding widths and strings, and the compute function can be used to\n * compute the ngrams for different ragged tensor inputs.\n */\nclass StringNGramsOp {\n constructor(separator, nGramWidths, leftPad, rightPad, padWidth, preserveShortSequences) {\n this.separator = util.encodeString(separator);\n this.nGramWidths = nGramWidths;\n this.leftPad = util.encodeString(leftPad);\n this.rightPad = util.encodeString(rightPad);\n this.padWidth = padWidth;\n this.preserveShort = preserveShortSequences;\n }\n getPadWidth(nGramWidth) {\n // Ngrams can be padded with either a fixed pad width or a dynamic pad\n // width depending on the 'padWidth' arg, but in no case should the padding\n // ever be wider than 'nGramWidth' - 1.\n return Math.min(this.padWidth < 0 ? nGramWidth - 1 : this.padWidth, nGramWidth - 1);\n }\n getNumNGrams(length, nGramWidth) {\n const padWidth = this.getPadWidth(nGramWidth);\n return Math.max(0, ((length + 2 * padWidth) - nGramWidth) + 1);\n }\n createNGrams(data, splitIndex, output, outputStartIndex, numNGrams, nGramWidth) {\n for (let nGramIndex = 0; nGramIndex < numNGrams; ++nGramIndex) {\n const padWidth = this.getPadWidth(nGramWidth);\n const leftPadding = Math.max(0, padWidth - nGramIndex);\n const rightPadding = Math.max(0, padWidth - (numNGrams - (nGramIndex + 1)));\n const numTokens = nGramWidth - (leftPadding + rightPadding);\n const dataStartIndex = splitIndex + (leftPadding > 0 ? 0 : nGramIndex - padWidth);\n // Calculate the total expected size of the nGram so we can reserve the\n // correct amount of space in the string.\n let nGramSize = 0;\n // Size of the left padding.\n nGramSize += leftPadding * this.leftPad.length;\n // Size of the tokens.\n for (let n = 0; n < numTokens; ++n) {\n nGramSize += data[dataStartIndex + n].length;\n }\n // Size of the right padding.\n nGramSize += rightPadding * this.rightPad.length;\n // Size of the separators.\n const numSeparators = leftPadding + rightPadding + numTokens - 1;\n nGramSize += numSeparators * this.separator.length;\n // Build the nGram.\n output[outputStartIndex + nGramIndex] = new Uint8Array(nGramSize);\n const nGram = output[outputStartIndex + nGramIndex];\n let nextNGramIndex = 0;\n const appendToNGram = (str) => str.forEach((value) => nGram[nextNGramIndex++] = value);\n for (let n = 0; n < leftPadding; ++n) {\n appendToNGram(this.leftPad);\n appendToNGram(this.separator);\n }\n // Only output first numTokens - 1 pairs of data and separator\n for (let n = 0; n < numTokens - 1; ++n) {\n appendToNGram(data[dataStartIndex + n]);\n appendToNGram(this.separator);\n }\n // Handle case when there are no tokens or no right padding as these\n // can result in consecutive separators.\n if (numTokens > 0) {\n // If we have tokens, then output last and then pair each separator\n // with the right padding that follows, to ensure nGram ends either with\n // the token or with the right pad.\n appendToNGram(data[dataStartIndex + numTokens - 1]);\n for (let n = 0; n < rightPadding; ++n) {\n appendToNGram(this.separator);\n appendToNGram(this.rightPad);\n }\n }\n else {\n // If we don't have tokens, then the last item inserted into the nGram\n // has been the separator from the left padding loop above. Hence,\n // output right pad and separator and make sure to finish with a\n // padding, not a separator.\n for (let n = 0; n < rightPadding - 1; ++n) {\n appendToNGram(this.rightPad);\n appendToNGram(this.separator);\n }\n appendToNGram(this.rightPad);\n }\n }\n }\n // Data and splits together form the definition of the ragged tensor,\n // where data is 1 dimensional and contains the values of the tensor\n // and splits denotes the indices at which each row starts.\n compute(data, splits) {\n // Validate that the splits are valid indices into data, only if there are\n // splits specified.\n const inputDataSize = data.length;\n const splitsSize = splits.length;\n if (splitsSize > 0) {\n let prevSplit = splits[0];\n if (prevSplit !== 0) {\n throw new Error(`First split value must be 0, got ${prevSplit}`);\n }\n for (let i = 1; i < splitsSize; ++i) {\n let validSplits = splits[i] >= prevSplit;\n validSplits = validSplits && (splits[i] <= inputDataSize);\n if (!validSplits) {\n throw new Error(`Invalid split value ${splits[i]}, must be in [${prevSplit}, ${inputDataSize}]`);\n }\n prevSplit = splits[i];\n }\n if (prevSplit !== inputDataSize) {\n throw new Error(`Last split value must be data size. Expected ${inputDataSize}, got ${prevSplit}`);\n }\n }\n const numBatchItems = splitsSize - 1;\n const nGramsSplits = util.getArrayFromDType('int32', splitsSize);\n // If there is no data or size, return an empty ragged tensor.\n if (inputDataSize === 0 || splitsSize === 0) {\n const empty = new Array(inputDataSize);\n for (let i = 0; i <= numBatchItems; ++i) {\n nGramsSplits[i] = 0;\n }\n return [empty, nGramsSplits];\n }\n nGramsSplits[0] = 0;\n for (let i = 1; i <= numBatchItems; ++i) {\n const length = splits[i] - splits[i - 1];\n let numNGrams = 0;\n this.nGramWidths.forEach((nGramWidth) => {\n numNGrams += this.getNumNGrams(length, nGramWidth);\n });\n if (this.preserveShort && length > 0 && numNGrams === 0) {\n numNGrams = 1;\n }\n nGramsSplits[i] = nGramsSplits[i - 1] + numNGrams;\n }\n const nGrams = new Array(nGramsSplits[numBatchItems]);\n for (let i = 0; i < numBatchItems; ++i) {\n const splitIndex = splits[i];\n let outputStartIdx = nGramsSplits[i];\n this.nGramWidths.forEach((nGramWidth) => {\n const length = splits[i + 1] - splits[i];\n const numNGrams = this.getNumNGrams(length, nGramWidth);\n this.createNGrams(data, splitIndex, nGrams, outputStartIdx, numNGrams, nGramWidth);\n outputStartIdx += numNGrams;\n });\n // If we're preserving short sequences, check to see if no sequence was\n // generated by comparing the current output start idx to the original\n // one (nGramSplitsdata). If no ngrams were generated, then they will\n // be equal (since we increment outputStartIdx by numNGrams every\n // time we create a set of ngrams.)\n if (this.preserveShort && outputStartIdx === nGramsSplits[i]) {\n const dataLength = splits[i + 1] - splits[i];\n // One legitimate reason to not have any ngrams when this.preserveShort\n // is true is if the sequence itself is empty. In that case, move on.\n if (dataLength === 0) {\n continue;\n }\n // We don't have to worry about dynamic padding sizes here: if padding\n // was dynamic, every sequence would have had sufficient padding to\n // generate at least one nGram.\n const nGramWidth = dataLength + 2 * this.padWidth;\n const numNGrams = 1;\n this.createNGrams(data, splitIndex, nGrams, outputStartIdx, numNGrams, nGramWidth);\n }\n }\n return [nGrams, nGramsSplits];\n }\n}\nexport function stringNGramsImpl(data, dataSplits, separator, nGramWidths, leftPad, rightPad, padWidth, preserveShortSequences) {\n return new StringNGramsOp(separator, nGramWidths, leftPad, rightPad, padWidth, preserveShortSequences)\n .compute(data, dataSplits);\n}\n//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiU3RyaW5nTkdyYW1zX2ltcGwuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi8uLi90ZmpzLWJhY2tlbmQtY3B1L3NyYy9rZXJuZWxzL1N0cmluZ05HcmFtc19pbXBsLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBOzs7Ozs7Ozs7Ozs7Ozs7R0FlRztBQUVILE9BQU8sRUFBQyxJQUFJLEVBQUMsTUFBTSx1QkFBdUIsQ0FBQztBQUUzQzs7Ozs7R0FLRztBQUNILE1BQU0sY0FBYztJQVFsQixZQUNJLFNBQWlCLEVBQUUsV0FBcUIsRUFBRSxPQUFlLEVBQ3pELFFBQWdCLEVBQUUsUUFBZ0IsRUFBRSxzQkFBK0I7UUFDckUsSUFBSSxDQUFDLFNBQVMsR0FBRyxJQUFJLENBQUMsWUFBWSxDQUFDLFNBQVMsQ0FBQyxDQUFDO1FBQzlDLElBQUksQ0FBQyxXQUFXLEdBQUcsV0FBVyxDQUFDO1FBQy9CLElBQUksQ0FBQyxPQUFPLEdBQUcsSUFBSSxDQUFDLFlBQVksQ0FBQyxPQUFPLENBQUMsQ0FBQztRQUMxQyxJQUFJLENBQUMsUUFBUSxHQUFHLElBQUksQ0FBQyxZQUFZLENBQUMsUUFBUSxDQUFDLENBQUM7UUFDNUMsSUFBSSxDQUFDLFFBQVEsR0FBRyxRQUFRLENBQUM7UUFDekIsSUFBSSxDQUFDLGFBQWEsR0FBRyxzQkFBc0IsQ0FBQztJQUM5QyxDQUFDO0lBRU8sV0FBVyxDQUFDLFVBQWtCO1FBQ3BDLHNFQUFzRTtRQUN0RSwyRUFBMkU7UUFDM0UsdUNBQXVDO1FBQ3ZDLE9BQU8sSUFBSSxDQUFDLEdBQUcsQ0FDWCxJQUFJLENBQUMsUUFBUSxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsVUFBVSxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLFFBQVEsRUFBRSxVQUFVLEdBQUcsQ0FBQyxDQUFDLENBQUM7SUFDMUUsQ0FBQztJQUVPLFlBQVksQ0FBQyxNQUFjLEVBQUUsVUFBa0I7UUFDckQsTUFBTSxRQUFR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QVksQ0FBQyxDQUFDO0lBQ2hDLENBQUM7Q0FDRjtBQUVELE1BQU0sVUFBVSxnQkFBZ0IsQ0FDNUIsSUFBa0IsRUFBRSxVQUFzQixFQUFFLFNBQWlCLEVBQzdELFdBQXFCLEVBQUUsT0FBZSxFQUFFLFFBQWdCLEVBQUUsUUFBZ0IsRUFDMUUsc0JBQStCO0lBQ2pDLE9BQU8sSUFBSSxjQUFjLENBQ2QsU0FBUyxFQUFFLFdBQVcsRUFBRSxPQUFPLEVBQUUsUUFBUSxFQUFFLFFBQVEsRUFDbkQsc0JBQXNCLENBQUM7U0FDN0IsT0FBTyxDQUFDLElBQUksRUFBRSxVQUFVLENBQUMsQ0FBQztBQUNqQyxDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiLyoqXG4gKiBAbGljZW5zZVxuICogQ29weXJpZ2h0IDIwMjEgR29vZ2xlIExMQy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC5cbiAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSBcIkxpY2Vuc2VcIik7XG4gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuXG4gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXRcbiAqXG4gKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjBcbiAqXG4gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlXG4gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiBcIkFTIElTXCIgQkFTSVMsXG4gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC5cbiAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmRcbiAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLlxuICogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbiAqL1xuXG5pbXBvcnQge3V0aWx9IGZyb20gJ0B0ZW5zb3JmbG93L3RmanMtY29yZSc7XG5cbi8qKlxuICogVGhlIFN0cmluZ05HcmFtc09wIGNsYXNzIGNyZWF0ZXMgbmdyYW1zIGZyb20gcmFnZ2VkIHN0cmluZyBkYXRhLlxuICogVGhlIGNvbnN0cnVjdG9yIGNvbnRhaW5zIGFsbCBhdHRyaWJ1dGVzIHJlbGF0ZWQgdG8gdGhlIG9wZXJhdGlvbiBzdWNoIGFzXG4gKiBwYWRkaW5nIHdpZHRocyBhbmQgc3RyaW5ncywgYW5kIHRoZSBjb21wdXRlIGZ1bmN0aW9uIGNhbiBiZSB1c2VkIHRvXG4gKiBjb21wdXRlIHRoZSBuZ3JhbXMgZm9yIGRpZmZlcmVudCByYWdnZWQgdGVuc29yIGlucHV0cy5cbiAqL1xuY2xhc3MgU3RyaW5nTkdyYW1zT3Age1xuICBwcml2YXRlIHNlcGFyYXRvcjogVWludDhBcnJheTtcbiAgcHJpdmF0ZSBuR3JhbVdpZHRoczogbnVtYmVyW107XG4gIHByaXZhdGUgcGFkV2lkdGg6IG51bWJlcjtcbiAgcHJpdmF0ZSBsZWZ0UGFkOiBVaW50OEFycmF5O1xuICBwcml2YXRlIHJpZ2h0UGFkOiBVaW50OEFycmF5O1xuICBwcml2YXRlIHByZXNlcnZlU2hvcnQ6IGJvb2xlYW47XG5cbiAgY29uc3RydWN0b3IoXG4gICAgICBzZXBhcmF0b3I6IHN0cmluZywgbkdyYW1XaWR0aHM6IG51bWJlcltdLCBsZWZ0UGFkOiBzdHJpbmcsXG4gICAgICByaWdodFBhZDogc3RyaW5nLCBwYWRXaWR0aDogbnVtYmVyLCBwcmVzZXJ2ZVNob3J0U2VxdWVuY2VzOiBib29sZWFuKSB7XG4gICAgdGhpcy5zZXBhcmF0b3IgPSB1dGlsLmVuY29kZVN0cmluZyhzZXBhcmF0b3IpO1xuICAgIHRoaXMubkdyYW1XaWR0aHMgPSBuR3JhbVdpZHRocztcbiAgICB0aGlzLmxlZnRQYWQgPSB1dGlsLmVuY29kZVN0cmluZyhsZWZ0UGFkKTtcbiAgICB0aGlzLnJpZ2h0UGFkID0gdXRpbC5lbmNvZGVTdHJpbmcocmlnaHRQYWQpO1xuICAgIHRoaXMucGFkV2lkdGggPSBwYWRXaWR0aDtcbiAgICB0aGlzLnByZXNlcnZlU2hvcnQgPSBwcmVzZXJ2ZVNob3J0U2VxdWVuY2VzO1xuICB9XG5cbiAgcHJpdmF0ZSBnZXRQYWRXaWR0aChuR3JhbVdpZHRoOiBudW1iZXIpIHtcbiAgICAvLyBOZ3JhbXMgY2FuIGJlIHBhZGRlZCB3aXRoIGVpdGhlciBhIGZpeGVkIHBhZCB3aWR0aCBvciBhIGR5bmFtaWMgcGFkXG4gICAgLy8gd2lkdGggZGVwZW5kaW5nIG9uIHRoZSAncGFkV2lkdGgnIGFyZywgYnV0IGluIG5vIGNhc2Ugc2hvdWxkIHRoZSBwYWRkaW5nXG4gICAgLy8gZXZlciBiZSB3aWRlciB0aGFuICduR3JhbVdpZHRoJyAtIDEuXG4gICAgcmV0dXJuIE1hdGgubWluKFxuICAgICAgICB0aGlzLnBhZFdpZHRoIDwgMCA/IG5HcmFtV2lkdGggLSAxIDogdGhpcy5wYWRXaWR0aCwgbkdyYW1XaWR0aCAtIDEpO1xuICB9XG5cbiAgcHJpdmF0ZSBnZXROdW1OR3JhbXMobGVuZ3RoOiBudW1iZXIsIG5HcmFtV2lkdGg6IG51bWJlcikge1xuICAgIGNvbnN0IHBhZFdpZHRoID0gdGhpcy5nZXRQYWRXaWR0aChuR3JhbVdpZHRoKTtcbiAgICByZXR1cm4gTWF0aC5tYXgoMCwgKChsZW5ndGggKyAyICogcGFkV2lkdGgpIC0gbkdyYW1XaWR0aCkgKyAxKTtcbiAgfVxuXG4gIHByaXZhdGUgY3JlYXRlTkdyYW1zKFxuICAgICAgZGF0YTogVWludDhBcnJheVtdLCBzcGxpdEluZGV4OiBudW1iZXIsIG91dHB1dDogVWludDhBcnJheVtdLFxuICAgICAgb3V0cHV0U3RhcnRJbmRleDogbnVtYmVyLCBudW1OR3JhbXM6IG51bWJlciwgbkdyYW1XaWR0aDogbnVtYmVyKSB7XG4gICAgZm9yIChsZXQgbkdyYW1JbmRleCA9IDA7IG5HcmFtSW5kZXggPCBudW1OR3JhbXM7ICsrbkdyYW1JbmRleCkge1xuICAgICAgY29uc3QgcGFkV2lkdGggPSB0aGlzLmdldFBhZFdpZHRoKG5HcmFtV2lkdGgpO1xuICAgICAgY29uc3QgbGVmdFBhZGRpbmcgPSBNYXRoLm1heCgwLCBwYWRXaWR0aCAtIG5HcmFtSW5kZXgpO1xuICAgICAgY29uc3QgcmlnaHRQYWRkaW5nID1cbiAgICAgICAgICBNYXRoLm1heCgwLCBwYWRXaWR0aCAtIChudW1OR3JhbXMgLSAobkdyYW1JbmRleCArIDEpKSk7XG4gICAgICBjb25zdCBudW1Ub2tlbnMgPSBuR3JhbVdpZHRoIC0gKGxlZnRQYWRkaW5nICsgcmlnaHRQYWRkaW5nKTtcbiAgICAgIGNvbnN0IGRhdGFTdGFydEluZGV4ID1cbiAgICAgICAgICBzcGxpdEluZGV4ICsgKGxlZnRQYWRkaW5nID4gMCA/IDAgOiBuR3JhbUluZGV4IC0gcGFkV2lkdGgpO1xuXG4gICAgICAvLyBDYWxjdWxhdGUgdGhlIHRvdGFsIGV4cGVjdGVkIHNpemUgb2YgdGhlIG5HcmFtIHNvIHdlIGNhbiByZXNlcnZlIHRoZVxuICAgICAgLy8gY29ycmVjdCBhbW91bnQgb2Ygc3BhY2UgaW4gdGhlIHN0cmluZy5cbiAgICAgIGxldCBuR3JhbVNpemUgPSAwO1xuICAgICAgLy8gU2l6ZSBvZiB0aGUgbGVmdCBwYWRkaW5nLlxuICAgICAgbkdyYW1TaXplICs9IGxlZnRQYWRkaW5nICogdGhpcy5sZWZ0UGFkLmxlbmd0aDtcbiAgICAgIC8vIFNpemUgb2YgdGhlIHRva2Vucy5cbiAgICAgIGZvciAobGV0IG4gPSAwOyBuIDwgbnVtVG9rZW5zOyArK24pIHtcbiAgICAgICAgbkdyYW1TaXplICs9IGRhdGFbZGF0YVN0YXJ0SW5kZXggKyBuXS5sZW5ndGg7XG4gICAgICB9XG4gICAgICAvLyBTaXplIG9mIHRoZSByaWdodCBwYWRkaW5nLlxuICAgICAgbkdyYW1TaXplICs9IHJpZ2h0UGFkZGluZyAqIHRoaXMucmlnaHRQYWQubGVuZ3RoO1xuICAgICAgLy8gU2l6ZSBvZiB0aGUgc2VwYXJhdG9ycy5cbiAgICAgIGNvbnN0IG51bVNlcGFyYXRvcnMgPSBsZWZ0UGFkZGluZyArIHJpZ2h0UGFkZGluZyArIG51bVRva2VucyAtIDE7XG4gICAgICBuR3JhbVNpemUgKz0gbnVtU2VwYXJhdG9ycyAqIHRoaXMuc2VwYXJhdG9yLmxlbmd0aDtcblxuICAgICAgLy8gQnVpbGQgdGhlIG5HcmFtLlxuICAgICAgb3V0cHV0W291dHB1dFN0YXJ0SW5kZXggKyBuR3JhbUluZGV4XSA9IG5ldyBVaW50OEFycmF5KG5HcmFtU2l6ZSk7XG4gICAgICBjb25zdCBuR3JhbSA9IG91dHB1dFtvdXRwdXRTdGFydEluZGV4ICsgbkdyYW1JbmRleF07XG5cbiAgICAgIGxldCBuZXh0TkdyYW1JbmRleCA9IDA7XG4gICAgICBjb25zdCBhcHBlbmRUb05HcmFtID0gKHN0cjogVWludDhBcnJheSkgPT5cbiAgICAgICAgICBzdHIuZm9yRWFjaCgodmFsdWUpID0+IG5HcmFtW25leHROR3JhbUluZGV4KytdID0gdmFsdWUpO1xuXG4gICAgICBmb3IgKGxldCBuID0gMDsgbiA8IGxlZnRQYWRkaW5nOyArK24pIHtcbiAgICAgICAgYXBwZW5kVG9OR3JhbSh0aGlzLmxlZnRQYWQpO1xuICAgICAgICBhcHBlbmRUb05HcmFtKHRoaXMuc2VwYXJhdG9yKTtcbiAgICAgIH1cbiAgICAgIC8vIE9ubHkgb3V0cHV0IGZpcnN0IG51bVRva2VucyAtIDEgcGFpcnMgb2YgZGF0YSBhbmQgc2VwYXJhdG9yXG4gICAgICBmb3IgKGxldCBuID0gMDsgbiA8IG51bVRva2VucyAtIDE7ICsrbikge1xuICAgICAgICBhcHBlbmRUb05HcmFtKGRhdGFbZGF0YVN0YXJ0SW5kZXggKyBuXSk7XG4gICAgICAgIGFwcGVuZFRvTkdyYW0odGhpcy5zZXBhcmF0b3IpO1xuICAgICAgfVxuICAgICAgLy8gSGFuZGxlIGNhc2Ugd2hlbiB0aGVyZSBhcmUgbm8gdG9rZW5zIG9yIG5vIHJpZ2h0IHBhZGRpbmcgYXMgdGhlc2VcbiAgICAgIC8vIGNhbiByZXN1bHQgaW4gY29uc2VjdXRpdmUgc2VwYXJhdG9ycy5cbiAgICAgIGlmIChudW1Ub2tlbnMgPiAwKSB7XG4gICAgICAgIC8vIElmIHdlIGhhdmUgdG9rZW5zLCB0aGVuIG91dHB1dCBsYXN0IGFuZCB0aGVuIHBhaXIgZWFjaCBzZXBhcmF0b3JcbiAgICAgICAgLy8gd2l0aCB0aGUgcmlnaHQgcGFkZGluZyB0aGF0IGZvbGxvd3MsIHRvIGVuc3VyZSBuR3JhbSBlbmRzIGVpdGhlciB3aXRoXG4gICAgICAgIC8vIHRoZSB0b2tlbiBvciB3aXRoIHRoZSByaWdodCBwYWQuXG4gICAgICAgIGFwcGVuZFRvTkdyYW0oZGF0YVtkYXRhU3RhcnRJbmRleCArIG51bVRva2VucyAtIDFdKTtcbiAgICAgICAgZm9yIChsZXQgbiA9IDA7IG4gPCByaWdodFBhZGRpbmc7ICsrbikge1xuICAgICAgICAgIGFwcGVuZFRvTkdyYW0odGhpcy5zZXBhcmF0b3IpO1xuICAgICAgICAgIGFwcGVuZFRvTkdyYW0odGhpcy5yaWdodFBhZCk7XG4gICAgICAgIH1cbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIC8vIElmIHdlIGRvbid0IGhhdmUgdG9rZW5zLCB0aGVuIHRoZSBsYXN0IGl0ZW0gaW5zZXJ0ZWQgaW50byB0aGUgbkdyYW1cbiAgICAgICAgLy8gaGFzIGJlZW4gdGhlIHNlcGFyYXRvciBmcm9tIHRoZSBsZWZ0IHBhZGRpbmcgbG9vcCBhYm92ZS4gSGVuY2UsXG4gICAgICAgIC8vIG91dHB1dCByaWdodCBwYWQgYW5kIHNlcGFyYXRvciBhbmQgbWFrZSBzdXJlIHRvIGZpbmlzaCB3aXRoIGFcbiAgICAgICAgLy8gcGFkZGluZywgbm90IGEgc2VwYXJhdG9yLlxuICAgICAgICBmb3IgKGxldCBuID0gMDsgbiA8IHJpZ2h0UGFkZGluZyAtIDE7ICsrbikge1xuICAgICAgICAgIGFwcGVuZFRvTkdyYW0odGhpcy5yaWdodFBhZCk7XG4gICAgICAgICAgYXBwZW5kVG9OR3JhbSh0aGlzLnNlcGFyYXRvcik7XG4gICAgICAgIH1cbiAgICAgICAgYXBwZW5kVG9OR3JhbSh0aGlzLnJpZ2h0UGFkKTtcbiAgICAgIH1cbiAgICB9XG4gIH1cblxuICAvLyBEYXRhIGFuZCBzcGxpdHMgdG9nZXRoZXIgZm9ybSB0aGUgZGVmaW5pdGlvbiBvZiB0aGUgcmFnZ2VkIHRlbnNvcixcbiAgLy8gd2hlcmUgZGF0YSBpcyAxIGRpbWVuc2lvbmFsIGFuZCBjb250YWlucyB0aGUgdmFsdWVzIG9mIHRoZSB0ZW5zb3JcbiAgLy8gYW5kIHNwbGl0cyBkZW5vdGVzIHRoZSBpbmRpY2VzIGF0IHdoaWNoIGVhY2ggcm93IHN0YXJ0cy5cbiAgcHVibGljIGNvbXB1dGUoZGF0YTogVWludDhBcnJheVtdLCBzcGxpdHM6IEludDMyQXJyYXkpOlxuICAgICAgW1VpbnQ4QXJyYXlbXSwgSW50MzJBcnJheV0ge1xuICAgIC8vIFZhbGlkYXRlIHRoYXQgdGhlIHNwbGl0cyBhcmUgdmFsaWQgaW5kaWNlcyBpbnRvIGRhdGEsIG9ubHkgaWYgdGhlcmUgYXJlXG4gICAgLy8gc3BsaXRzIHNwZWNpZmllZC5cbiAgICBjb25zdCBpbnB1dERhdGFTaXplID0gZGF0YS5sZW5ndGg7XG4gICAgY29uc3Qgc3BsaXRzU2l6ZSA9IHNwbGl0cy5sZW5ndGg7XG4gICAgaWYgKHNwbGl0c1NpemUgPiAwKSB7XG4gICAgICBsZXQgcHJldlNwbGl0ID0gc3BsaXRzWzBdO1xuICAgICAgaWYgKHByZXZTcGxpdCAhPT0gMCkge1xuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoYEZpcnN0IHNwbGl0IHZhbHVlIG11c3QgYmUgMCwgZ290ICR7cHJldlNwbGl0fWApO1xuICAgICAgfVxuICAgICAgZm9yIChsZXQgaSA9IDE7IGkgPCBzcGxpdHNTaXplOyArK2kpIHtcbiAgICAgICAgbGV0IHZhbGlkU3BsaXRzID0gc3BsaXRzW2ldID49IHByZXZTcGxpdDtcbiAgICAgICAgdmFsaWRTcGxpdHMgPSB2YWxpZFNwbGl0cyAmJiAoc3BsaXRzW2ldIDw9IGlucHV0RGF0YVNpemUpO1xuICAgICAgICBpZiAoIXZhbGlkU3BsaXRzKSB7XG4gICAgICAgICAgdGhyb3cgbmV3IEVycm9yKGBJbnZhbGlkIHNwbGl0IHZhbHVlICR7c3BsaXRzW2ldfSwgbXVzdCBiZSBpbiBbJHtcbiAgICAgICAgICAgICAgcHJldlNwbGl0fSwgJHtpbnB1dERhdGFTaXplfV1gKTtcbiAgICAgICAgfVxuICAgICAgICBwcmV2U3BsaXQgPSBzcGxpdHNbaV07XG4gICAgICB9XG4gICAgICBpZiAocHJldlNwbGl0ICE9PSBpbnB1dERhdGFTaXplKSB7XG4gICAgICAgIHRocm93IG5ldyBFcnJvcihgTGFzdCBzcGxpdCB2YWx1ZSBtdXN0IGJlIGRhdGEgc2l6ZS4gRXhwZWN0ZWQgJHtcbiAgICAgICAgICAgIGlucHV0RGF0YVNpemV9LCBnb3QgJHtwcmV2U3BsaXR9YCk7XG4gICAgICB9XG4gICAgfVxuXG4gICAgY29uc3QgbnVtQmF0Y2hJdGVtcyA9IHNwbGl0c1NpemUgLSAxO1xuICAgIGNvbnN0IG5HcmFtc1NwbGl0cyA9IHV0aWwuZ2V0QXJyYXlGcm9tRFR5cGUoJ2ludDMyJywgc3BsaXRzU2l6ZSk7XG4gICAgLy8gSWYgdGhlcmUgaXMgbm8gZGF0YSBvciBzaXplLCByZXR1cm4gYW4gZW1wdHkgcmFnZ2VkIHRlbnNvci5cbiAgICBpZiAoaW5wdXREYXRhU2l6ZSA9PT0gMCB8fCBzcGxpdHNTaXplID09PSAwKSB7XG4gICAgICBjb25zdCBlbXB0eTogVWludDhBcnJheVtdID0gbmV3IEFycmF5KGlucHV0RGF0YVNpemUpO1xuICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPD0gbnVtQmF0Y2hJdGVtczsgKytpKSB7XG4gICAgICAgIG5HcmFtc1NwbGl0c1tpXSA9IDA7XG4gICAgICB9XG4gICAgICByZXR1cm4gW2VtcHR5LCBuR3JhbXNTcGxpdHNdO1xuICAgIH1cblxuICAgIG5HcmFtc1NwbGl0c1swXSA9IDA7XG4gICAgZm9yIChsZXQgaSA9IDE7IGkgPD0gbnVtQmF0Y2hJdGVtczsgKytpKSB7XG4gICAgICBjb25zdCBsZW5ndGggPSBzcGxpdHNbaV0gLSBzcGxpdHNbaSAtIDFdO1xuICAgICAgbGV0IG51bU5HcmFtcyA9IDA7XG4gICAgICB0aGlzLm5HcmFtV2lkdGhzLmZvckVhY2goKG5HcmFtV2lkdGgpID0+IHtcbiAgICAgICAgbnVtTkdyYW1zICs9IHRoaXMuZ2V0TnVtTkdyYW1zKGxlbmd0aCwgbkdyYW1XaWR0aCk7XG4gICAgICB9KTtcbiAgICAgIGlmICh0aGlzLnByZXNlcnZlU2hvcnQgJiYgbGVuZ3RoID4gMCAmJiBudW1OR3JhbXMgPT09IDApIHtcbiAgICAgICAgbnVtTkdyYW1zID0gMTtcbiAgICAgIH1cbiAgICAgIG5HcmFtc1NwbGl0c1tpXSA9IG5HcmFtc1NwbGl0c1tpIC0gMV0gKyBudW1OR3JhbXM7XG4gICAgfVxuXG4gICAgY29uc3QgbkdyYW1zOiBVaW50OEFycmF5W10gPSBuZXcgQXJyYXkobkdyYW1zU3BsaXRzW251bUJhdGNoSXRlbXNdKTtcblxuICAgIGZvciAobGV0IGkgPSAwOyBpIDwgbnVtQmF0Y2hJdGVtczsgKytpKSB7XG4gICAgICBjb25zdCBzcGxpdEluZGV4ID0gc3BsaXRzW2ldO1xuICAgICAgbGV0IG91dHB1dFN0YXJ0SWR4ID0gbkdyYW1zU3BsaXRzW2ldO1xuICAgICAgdGhpcy5uR3JhbVdpZHRocy5mb3JFYWNoKChuR3JhbVdpZHRoKSA9PiB7XG4gICAgICAgIGNvbnN0IGxlbmd0aCA9IHNwbGl0c1tpICsgMV0gLSBzcGxpdHNbaV07XG4gICAgICAgIGNvbnN0IG51bU5HcmFtcyA9IHRoaXMuZ2V0TnVtTkdyYW1zKGxlbmd0aCwgbkdyYW1XaWR0aCk7XG4gICAgICAgIHRoaXMuY3JlYXRlTkdyYW1zKFxuICAgICAgICAgICAgZGF0YSwgc3BsaXRJbmRleCwgbkdyYW1zLCBvdXRwdXRTdGFydElkeCwgbnVtTkdyYW1zLCBuR3JhbVdpZHRoKTtcbiAgICAgICAgb3V0cHV0U3RhcnRJZHggKz0gbnVtTkdyYW1zO1xuICAgICAgfSk7XG4gICAgICAvLyBJZiB3ZSdyZSBwcmVzZXJ2aW5nIHNob3J0IHNlcXVlbmNlcywgY2hlY2sgdG8gc2VlIGlmIG5vIHNlcXVlbmNlIHdhc1xuICAgICAgLy8gZ2VuZXJhdGVkIGJ5IGNvbXBhcmluZyB0aGUgY3VycmVudCBvdXRwdXQgc3RhcnQgaWR4IHRvIHRoZSBvcmlnaW5hbFxuICAgICAgLy8gb25lIChuR3JhbVNwbGl0c2RhdGEpLiBJZiBubyBuZ3JhbXMgd2VyZSBnZW5lcmF0ZWQsIHRoZW4gdGhleSB3aWxsXG4gICAgICAvLyBiZSBlcXVhbCAoc2luY2Ugd2UgaW5jcmVtZW50IG91dHB1dFN0YXJ0SWR4IGJ5IG51bU5HcmFtcyBldmVyeVxuICAgICAgLy8gdGltZSB3ZSBjcmVhdGUgYSBzZXQgb2YgbmdyYW1zLilcbiAgICAgIGlmICh0aGlzLnByZXNlcnZlU2hvcnQgJiYgb3V0cHV0U3RhcnRJZHggPT09IG5HcmFtc1NwbGl0c1tpXSkge1xuICAgICAgICBjb25zdCBkYXRhTGVuZ3RoID0gc3BsaXRzW2kgKyAxXSAtIHNwbGl0c1tpXTtcbiAgICAgICAgLy8gT25lIGxlZ2l0aW1hdGUgcmVhc29uIHRvIG5vdCBoYXZlIGFueSBuZ3JhbXMgd2hlbiB0aGlzLnByZXNlcnZlU2hvcnRcbiAgICAgICAgLy8gaXMgdHJ1ZSBpcyBpZiB0aGUgc2VxdWVuY2UgaXRzZWxmIGlzIGVtcHR5LiBJbiB0aGF0IGNhc2UsIG1vdmUgb24uXG4gICAgICAgIGlmIChkYXRhTGVuZ3RoID09PSAwKSB7XG4gICAgICAgICAgY29udGludWU7XG4gICAgICAgIH1cbiAgICAgICAgLy8gV2UgZG9uJ3QgaGF2ZSB0byB3b3JyeSBhYm91dCBkeW5hbWljIHBhZGRpbmcgc2l6ZXMgaGVyZTogaWYgcGFkZGluZ1xuICAgICAgICAvLyB3YXMgZHluYW1pYywgZXZlcnkgc2VxdWVuY2Ugd291bGQgaGF2ZSBoYWQgc3VmZmljaWVudCBwYWRkaW5nIHRvXG4gICAgICAgIC8vIGdlbmVyYXRlIGF0IGxlYXN0IG9uZSBuR3JhbS5cbiAgICAgICAgY29uc3QgbkdyYW1XaWR0aCA9IGRhdGFMZW5ndGggKyAyICogdGhpcy5wYWRXaWR0aDtcbiAgICAgICAgY29uc3QgbnVtTkdyYW1zID0gMTtcbiAgICAgICAgdGhpcy5jcmVhdGVOR3JhbXMoXG4gICAgICAgICAgICBkYXRhLCBzcGxpdEluZGV4LCBuR3JhbXMsIG91dHB1dFN0YXJ0SWR4LCBudW1OR3JhbXMsIG5HcmFtV2lkdGgpO1xuICAgICAgfVxuICAgIH1cbiAgICByZXR1cm4gW25HcmFtcywgbkdyYW1zU3BsaXRzXTtcbiAgfVxufVxuXG5leHBvcnQgZnVuY3Rpb24gc3RyaW5nTkdyYW1zSW1wbChcbiAgICBkYXRhOiBVaW50OEFycmF5W10sIGRhdGFTcGxpdHM6IEludDMyQXJyYXksIHNlcGFyYXRvcjogc3RyaW5nLFxuICAgIG5HcmFtV2lkdGhzOiBudW1iZXJbXSwgbGVmdFBhZDogc3RyaW5nLCByaWdodFBhZDogc3RyaW5nLCBwYWRXaWR0aDogbnVtYmVyLFxuICAgIHByZXNlcnZlU2hvcnRTZXF1ZW5jZXM6IGJvb2xlYW4pOiBbVWludDhBcnJheVtdLCBJbnQzMkFycmF5XSB7XG4gIHJldHVybiBuZXcgU3RyaW5nTkdyYW1zT3AoXG4gICAgICAgICAgICAgc2VwYXJhdG9yLCBuR3JhbVdpZHRocywgbGVmdFBhZCwgcmlnaHRQYWQsIHBhZFdpZHRoLFxuICAgICAgICAgICAgIHByZXNlcnZlU2hvcnRTZXF1ZW5jZXMpXG4gICAgICAuY29tcHV0ZShkYXRhLCBkYXRhU3BsaXRzKTtcbn1cbiJdfQ==","/**\n * @license\n * Copyright 2021 Google LLC. All Rights Reserved.\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n * =============================================================================\n */\nimport { StringNGrams } from '@tensorflow/tfjs-core';\nimport { stringNGramsImpl } from './StringNGrams_impl';\nexport function stringNGrams(args) {\n const { inputs, backend, attrs } = args;\n const { separator, nGramWidths, leftPad, rightPad, padWidth, preserveShortSequences } = attrs;\n const { data, dataSplits } = inputs;\n const $data = backend.data.get(data.dataId).values;\n const $dataSplits = backend.data.get(dataSplits.dataId).values;\n const [nGrams, nGramsSplits] = stringNGramsImpl($data, $dataSplits, separator, nGramWidths, leftPad, rightPad, padWidth, preserveShortSequences);\n return [\n backend.makeTensorInfo([nGrams.length], 'string', nGrams),\n backend.makeTensorInfo(dataSplits.shape, 'int32', nGramsSplits),\n ];\n}\nexport const stringNGramsConfig = {\n kernelName: StringNGrams,\n backendName: 'cpu',\n kernelFunc: stringNGrams,\n};\n//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiU3RyaW5nTkdyYW1zLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vLi4vdGZqcy1iYWNrZW5kLWNwdS9zcmMva2VybmVscy9TdHJpbmdOR3JhbXMudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUE7Ozs7Ozs7Ozs7Ozs7OztHQWVHO0FBRUgsT0FBTyxFQUEyQixZQUFZLEVBQW9ELE1BQU0sdUJBQXVCLENBQUM7QUFJaEksT0FBTyxFQUFDLGdCQUFnQixFQUFDLE1BQU0scUJBQXFCLENBQUM7QUFFckQsTUFBTSxVQUFVLFlBQVksQ0FBQyxJQUk1QjtJQUNDLE1BQU0sRUFBQyxNQUFNLEVBQUUsT0FBTyxFQUFFLEtBQUssRUFBQyxHQUFHLElBQUksQ0FBQztJQUN0QyxNQUFNLEVBQ0osU0FBUyxFQUNULFdBQVcsRUFDWCxPQUFPLEVBQ1AsUUFBUSxFQUNSLFFBQVEsRUFDUixzQkFBc0IsRUFDdkIsR0FBRyxLQUFLLENBQUM7SUFDVixNQUFNLEVBQUMsSUFBSSxFQUFFLFVBQVUsRUFBQyxHQUFHLE1BQU0sQ0FBQztJQUNsQyxNQUFNLEtBQUssR0FBRyxPQUFPLENBQUMsSUFBSSxDQUFDLEdBQUcsQ0FBQyxJQUFJLENBQUMsTUFBTSxDQUFDLENBQUMsTUFBc0IsQ0FBQztJQUNuRSxNQUFNLFdBQVcsR0FBRyxPQUFPLENBQUMsSUFBSSxDQUFDLEdBQUcsQ0FBQyxVQUFVLENBQUMsTUFBTSxDQUFDLENBQUMsTUFBb0IsQ0FBQztJQUU3RSxNQUFNLENBQUMsTUFBTSxFQUFFLFlBQVksQ0FBQyxHQUFHLGdCQUFnQixDQUMzQyxLQUFLLEVBQUUsV0FBVyxFQUFFLFNBQVMsRUFBRSxXQUFXLEVBQUUsT0FBTyxFQUFFLFFBQVEsRUFBRSxRQUFRLEVBQ3ZFLHNCQUFzQixDQUFDLENBQUM7SUFDNUIsT0FBTztRQUNMLE9BQU8sQ0FBQyxjQUFjLENBQUMsQ0FBQyxNQUFNLENBQUMsTUFBTSxDQUFDLEVBQUUsUUFBUSxFQUFFLE1BQU0sQ0FBQztRQUN6RCxPQUFPLENBQUMsY0FBYyxDQUFDLFVBQVUsQ0FBQyxLQUFLLEVBQUUsT0FBTyxFQUFFLFlBQVksQ0FBQztLQUNoRSxDQUFDO0FBQ0osQ0FBQztBQUVELE1BQU0sQ0FBQyxNQUFNLGtCQUFrQixHQUFpQjtJQUM5QyxVQUFVLEVBQUUsWUFBWTtJQUN4QixXQUFXLEVBQUUsS0FBSztJQUNsQixVQUFVLEVBQUUsWUFBZ0M7Q0FDN0MsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbIi8qKlxuICogQGxpY2Vuc2VcbiAqIENvcHlyaWdodCAyMDIxIEdvb2dsZSBMTEMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuXG4gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgXCJMaWNlbnNlXCIpO1xuICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLlxuICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0XG4gKlxuICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wXG4gKlxuICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZVxuICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gXCJBUyBJU1wiIEJBU0lTLFxuICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuXG4gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kXG4gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS5cbiAqID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4gKi9cblxuaW1wb3J0IHtLZXJuZWxDb25maWcsIEtlcm5lbEZ1bmMsIFN0cmluZ05HcmFtcywgU3RyaW5nTkdyYW1zQXR0cnMsIFN0cmluZ05HcmFtc0lucHV0cywgVGVuc29ySW5mb30gZnJvbSAnQHRlbnNvcmZsb3cvdGZqcy1jb3JlJztcblxuaW1wb3J0IHtNYXRoQmFja2VuZENQVX0gZnJvbSAnLi4vYmFja2VuZF9jcHUnO1xuXG5pbXBvcnQge3N0cmluZ05HcmFtc0ltcGx9IGZyb20gJy4vU3RyaW5nTkdyYW1zX2ltcGwnO1xuXG5leHBvcnQgZnVuY3Rpb24gc3RyaW5nTkdyYW1zKGFyZ3M6IHtcbiAgaW5wdXRzOiBTdHJpbmdOR3JhbXNJbnB1dHMsXG4gIGJhY2tlbmQ6IE1hdGhCYWNrZW5kQ1BVLFxuICBhdHRyczogU3RyaW5nTkdyYW1zQXR0cnNcbn0pOiBbVGVuc29ySW5mbywgVGVuc29ySW5mb10ge1xuICBjb25zdCB7aW5wdXRzLCBiYWNrZW5kLCBhdHRyc30gPSBhcmdzO1xuICBjb25zdCB7XG4gICAgc2VwYXJhdG9yLFxuICAgIG5HcmFtV2lkdGhzLFxuICAgIGxlZnRQYWQsXG4gICAgcmlnaHRQYWQsXG4gICAgcGFkV2lkdGgsXG4gICAgcHJlc2VydmVTaG9ydFNlcXVlbmNlc1xuICB9ID0gYXR0cnM7XG4gIGNvbnN0IHtkYXRhLCBkYXRhU3BsaXRzfSA9IGlucHV0cztcbiAgY29uc3QgJGRhdGEgPSBiYWNrZW5kLmRhdGEuZ2V0KGRhdGEuZGF0YUlkKS52YWx1ZXMgYXMgVWludDhBcnJheVtdO1xuICBjb25zdCAkZGF0YVNwbGl0cyA9IGJhY2tlbmQuZGF0YS5nZXQoZGF0YVNwbGl0cy5kYXRhSWQpLnZhbHVlcyBhcyBJbnQzMkFycmF5O1xuXG4gIGNvbnN0IFtuR3JhbXMsIG5HcmFtc1NwbGl0c10gPSBzdHJpbmdOR3JhbXNJbXBsKFxuICAgICAgJGRhdGEsICRkYXRhU3BsaXRzLCBzZXBhcmF0b3IsIG5HcmFtV2lkdGhzLCBsZWZ0UGFkLCByaWdodFBhZCwgcGFkV2lkdGgsXG4gICAgICBwcmVzZXJ2ZVNob3J0U2VxdWVuY2VzKTtcbiAgcmV0dXJuIFtcbiAgICBiYWNrZW5kLm1ha2VUZW5zb3JJbmZvKFtuR3JhbXMubGVuZ3RoXSwgJ3N0cmluZycsIG5HcmFtcyksXG4gICAgYmFja2VuZC5tYWtlVGVuc29ySW5mbyhkYXRhU3BsaXRzLnNoYXBlLCAnaW50MzInLCBuR3JhbXNTcGxpdHMpLFxuICBdO1xufVxuXG5leHBvcnQgY29uc3Qgc3RyaW5nTkdyYW1zQ29uZmlnOiBLZXJuZWxDb25maWcgPSB7XG4gIGtlcm5lbE5hbWU6IFN0cmluZ05HcmFtcyxcbiAgYmFja2VuZE5hbWU6ICdjcHUnLFxuICBrZXJuZWxGdW5jOiBzdHJpbmdOR3JhbXMgYXMge30gYXMgS2VybmVsRnVuYyxcbn07XG4iXX0=","/**\n * @license\n * Copyright 2021 Google LLC. All Rights Reserved.\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n * =============================================================================\n */\nimport { util } from '@tensorflow/tfjs-core';\nfunction split(str, delimiters, skipEmpty, result) {\n if (!str.length) {\n return;\n }\n // When the delimiter is empty, the input is split into individual characters.\n if (delimiters.length === 0) {\n for (let i = 0; i < str.length; ++i) {\n result.push(str.subarray(i, i + 1));\n }\n return;\n }\n // When there is one delimiter, the input is split only at that delimiter.\n if (delimiters.length === 1) {\n const delimiter = delimiters[0];\n let f = str.indexOf(delimiter);\n while (f !== -1) {\n const token = str.subarray(0, f);\n if (!skipEmpty || token.length !== 0) {\n result.push(token);\n }\n str = str.subarray(f + 1);\n f = str.indexOf(delimiter);\n }\n if (!skipEmpty || str.length !== 0) {\n result.push(str);\n }\n return;\n }\n // When there are multiple delimiters, the input is split at every instance\n // one of the delimiters appears.\n let tokenStart = 0;\n for (let i = 0; i < str.length + 1; i++) {\n if ((i === str.length) || (delimiters.indexOf(str[i]) !== -1)) {\n const token = str.subarray(tokenStart, i);\n if (!skipEmpty || token.length !== 0) {\n result.push(token);\n }\n tokenStart = i + 1;\n }\n }\n}\nexport function stringSplitImpl(input, delimiter, skipEmpty) {\n const batchSize = input.length;\n // Empty delimiter means split the input character by character.\n const tokens = [];\n let outputSize = 0;\n let maxNumEntries = 0;\n const numIndices = new Array(batchSize);\n for (let i = 0; i < batchSize; ++i) {\n const prevTokensLength = tokens.length;\n split(input[i], delimiter, skipEmpty, tokens);\n const nEntries = tokens.length - prevTokensLength;\n numIndices[i] = nEntries;\n outputSize += nEntries;\n maxNumEntries = Math.max(maxNumEntries, nEntries);\n }\n const indices = util.getArrayFromDType('int32', outputSize * 2);\n const values = new Array(outputSize);\n const shape = [batchSize, maxNumEntries];\n let c = 0;\n for (let i = 0; i < batchSize; ++i) {\n for (let j = 0; j < numIndices[i]; ++j) {\n // indices is a 2d tensor with shape of [outputSize, 2]\n indices[c * 2] = i;\n indices[c * 2 + 1] = j;\n values[c] = tokens[c];\n ++c;\n }\n }\n return [indices, values, shape];\n}\n//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiU3RyaW5nU3BsaXRfaW1wbC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uLy4uL3RmanMtYmFja2VuZC1jcHUvc3JjL2tlcm5lbHMvU3RyaW5nU3BsaXRfaW1wbC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQTs7Ozs7Ozs7Ozs7Ozs7O0dBZUc7QUFFSCxPQUFPLEVBQWEsSUFBSSxFQUFDLE1BQU0sdUJBQXVCLENBQUM7QUFFdkQsU0FBUyxLQUFLLENBQ1YsR0FBZSxFQUFFLFVBQXNCLEVBQUUsU0FBa0IsRUFDM0QsTUFBb0I7SUFDdEIsSUFBSSxDQUFDLEdBQUcsQ0FBQyxNQUFNLEVBQUU7UUFDZixPQUFPO0tBQ1I7SUFDRCw4RUFBOEU7SUFDOUUsSUFBSSxVQUFVLENBQUMsTUFBTSxLQUFLLENBQUMsRUFBRTtRQUMzQixLQUFLLElBQUksQ0FBQyxHQUFHLENBQUMsRUFBRSxDQUFDLEdBQUcsR0FBRyxDQUFDLE1BQU0sRUFBRSxFQUFFLENBQUMsRUFBRTtZQUNuQyxNQUFNLENBQUMsSUFBSSxDQUFDLEdBQUcsQ0FBQyxRQUFRLENBQUMsQ0FBQyxFQUFFLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDO1NBQ3JDO1FBQ0QsT0FBTztLQUNSO0lBQ0QsMEVBQTBFO0lBQzFFLElBQUksVUFBVSxDQUFDLE1BQU0sS0FBSyxDQUFDLEVBQUU7UUFDM0IsTUFBTSxTQUFTLEdBQUcsVUFBVSxDQUFDLENBQUMsQ0FBQyxDQUFDO1FBQ2hDLElBQUksQ0FBQyxHQUFHLEdBQUcsQ0FBQyxPQUFPLENBQUMsU0FBUyxDQUFDLENBQUM7UUFDL0IsT0FBTyxDQUFDLEtBQUssQ0FBQyxDQUFDLEVBQUU7WUFDZixNQUFNLEtBQUssR0FBRyxHQUFHLENBQUMsUUFBUSxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQztZQUNqQyxJQUFJLENBQUMsU0FBUyxJQUFJLEtBQUssQ0FBQyxNQUFNLEtBQUssQ0FBQyxFQUFFO2dCQUNwQyxN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LENBQUMsR0FBRyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUM7WUFDbkIsT0FBTyxDQUFDLENBQUMsR0FBRyxDQUFDLEdBQUcsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDO1lBQ3ZCLE1BQU0sQ0FBQyxDQUFDLENBQUMsR0FBRyxNQUFNLENBQUMsQ0FBQyxDQUFDLENBQUM7WUFDdEIsRUFBRSxDQUFDLENBQUM7U0FDTDtLQUNGO0lBRUQsT0FBTyxDQUFDLE9BQU8sRUFBRSxNQUFNLEVBQUUsS0FBSyxDQUFDLENBQUM7QUFDbEMsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbIi8qKlxuICogQGxpY2Vuc2VcbiAqIENvcHlyaWdodCAyMDIxIEdvb2dsZSBMTEMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuXG4gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgXCJMaWNlbnNlXCIpO1xuICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLlxuICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0XG4gKlxuICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wXG4gKlxuICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZVxuICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gXCJBUyBJU1wiIEJBU0lTLFxuICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuXG4gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kXG4gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS5cbiAqID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4gKi9cblxuaW1wb3J0IHtUeXBlZEFycmF5LCB1dGlsfSBmcm9tICdAdGVuc29yZmxvdy90ZmpzLWNvcmUnO1xuXG5mdW5jdGlvbiBzcGxpdChcbiAgICBzdHI6IFVpbnQ4QXJyYXksIGRlbGltaXRlcnM6IFVpbnQ4QXJyYXksIHNraXBFbXB0eTogYm9vbGVhbixcbiAgICByZXN1bHQ6IFVpbnQ4QXJyYXlbXSk6IHZvaWQge1xuICBpZiAoIXN0ci5sZW5ndGgpIHtcbiAgICByZXR1cm47XG4gIH1cbiAgLy8gV2hlbiB0aGUgZGVsaW1pdGVyIGlzIGVtcHR5LCB0aGUgaW5wdXQgaXMgc3BsaXQgaW50byBpbmRpdmlkdWFsIGNoYXJhY3RlcnMuXG4gIGlmIChkZWxpbWl0ZXJzLmxlbmd0aCA9PT0gMCkge1xuICAgIGZvciAobGV0IGkgPSAwOyBpIDwgc3RyLmxlbmd0aDsgKytpKSB7XG4gICAgICByZXN1bHQucHVzaChzdHIuc3ViYXJyYXkoaSwgaSArIDEpKTtcbiAgICB9XG4gICAgcmV0dXJuO1xuICB9XG4gIC8vIFdoZW4gdGhlcmUgaXMgb25lIGRlbGltaXRlciwgdGhlIGlucHV0IGlzIHNwbGl0IG9ubHkgYXQgdGhhdCBkZWxpbWl0ZXIuXG4gIGlmIChkZWxpbWl0ZXJzLmxlbmd0aCA9PT0gMSkge1xuICAgIGNvbnN0IGRlbGltaXRlciA9IGRlbGltaXRlcnNbMF07XG4gICAgbGV0IGYgPSBzdHIuaW5kZXhPZihkZWxpbWl0ZXIpO1xuICAgIHdoaWxlIChmICE9PSAtMSkge1xuICAgICAgY29uc3QgdG9rZW4gPSBzdHIuc3ViYXJyYXkoMCwgZik7XG4gICAgICBpZiAoIXNraXBFbXB0eSB8fCB0b2tlbi5sZW5ndGggIT09IDApIHtcbiAgICAgICAgcmVzdWx0LnB1c2godG9rZW4pO1xuICAgICAgfVxuICAgICAgc3RyID0gc3RyLnN1YmFycmF5KGYgKyAxKTtcbiAgICAgIGYgPSBzdHIuaW5kZXhPZihkZWxpbWl0ZXIpO1xuICAgIH1cbiAgICBpZiAoIXNraXBFbXB0eSB8fCBzdHIubGVuZ3RoICE9PSAwKSB7XG4gICAgICByZXN1bHQucHVzaChzdHIpO1xuICAgIH1cbiAgICByZXR1cm47XG4gIH1cbiAgLy8gV2hlbiB0aGVyZSBhcmUgbXVsdGlwbGUgZGVsaW1pdGVycywgdGhlIGlucHV0IGlzIHNwbGl0IGF0IGV2ZXJ5IGluc3RhbmNlXG4gIC8vIG9uZSBvZiB0aGUgZGVsaW1pdGVycyBhcHBlYXJzLlxuICBsZXQgdG9rZW5TdGFydCA9IDA7XG4gIGZvciAobGV0IGkgPSAwOyBpIDwgc3RyLmxlbmd0aCArIDE7IGkrKykge1xuICAgIGlmICgoaSA9PT0gc3RyLmxlbmd0aCkgfHwgKGRlbGltaXRlcnMuaW5kZXhPZihzdHJbaV0pICE9PSAtMSkpIHtcbiAgICAgIGNvbnN0IHRva2VuID0gc3RyLnN1YmFycmF5KHRva2VuU3RhcnQsIGkpO1xuICAgICAgaWYgKCFza2lwRW1wdHkgfHwgdG9rZW4ubGVuZ3RoICE9PSAwKSB7XG4gICAgICAgIHJlc3VsdC5wdXNoKHRva2VuKTtcbiAgICAgIH1cbiAgICAgIHRva2VuU3RhcnQgPSBpICsgMTtcbiAgICB9XG4gIH1cbn1cblxuZXhwb3J0IGZ1bmN0aW9uIHN0cmluZ1NwbGl0SW1wbChcbiAgICBpbnB1dDogVWludDhBcnJheVtdLCBkZWxpbWl0ZXI6IFVpbnQ4QXJyYXksXG4gICAgc2tpcEVtcHR5OiBib29sZWFuKTogW1R5cGVkQXJyYXksIFVpbnQ4QXJyYXlbXSwgW251bWJlciwgbnVtYmVyXV0ge1xuICBjb25zdCBiYXRjaFNpemUgPSBpbnB1dC5sZW5ndGg7XG5cbiAgLy8gRW1wdHkgZGVsaW1pdGVyIG1lYW5zIHNwbGl0IHRoZSBpbnB1dCBjaGFyYWN0ZXIgYnkgY2hhcmFjdGVyLlxuICBjb25zdCB0b2tlbnM6IFVpbnQ4QXJyYXlbXSA9IFtdO1xuXG4gIGxldCBvdXRwdXRTaXplID0gMDtcbiAgbGV0IG1heE51bUVudHJpZXMgPSAwO1xuICBjb25zdCBudW1JbmRpY2VzOiBudW1iZXJbXSA9IG5ldyBBcnJheShiYXRjaFNpemUpO1xuICBmb3IgKGxldCBpID0gMDsgaSA8IGJhdGNoU2l6ZTsgKytpKSB7XG4gICAgY29uc3QgcHJldlRva2Vuc0xlbmd0aCA9IHRva2Vucy5sZW5ndGg7XG4gICAgc3BsaXQoaW5wdXRbaV0sIGRlbGltaXRlciwgc2tpcEVtcHR5LCB0b2tlbnMpO1xuICAgIGNvbnN0IG5FbnRyaWVzID0gdG9rZW5zLmxlbmd0aCAtIHByZXZUb2tlbnNMZW5ndGg7XG4gICAgbnVtSW5kaWNlc1tpXSA9IG5FbnRyaWVzO1xuICAgIG91dHB1dFNpemUgKz0gbkVudHJpZXM7XG4gICAgbWF4TnVtRW50cmllcyA9IE1hdGgubWF4KG1heE51bUVudHJpZXMsIG5FbnRyaWVzKTtcbiAgfVxuXG4gIGNvbnN0IGluZGljZXMgPSB1dGlsLmdldEFycmF5RnJvbURUeXBlKCdpbnQzMicsIG91dHB1dFNpemUgKiAyKSBhcyBUeXBlZEFycmF5O1xuICBjb25zdCB2YWx1ZXM6IFVpbnQ4QXJyYXlbXSA9IG5ldyBBcnJheShvdXRwdXRTaXplKTtcbiAgY29uc3Qgc2hhcGU6IFtudW1iZXIsIG51bWJlcl0gPSBbYmF0Y2hTaXplLCBtYXhOdW1FbnRyaWVzXTtcblxuICBsZXQgYyA9IDA7XG4gIGZvciAobGV0IGkgPSAwOyBpIDwgYmF0Y2hTaXplOyArK2kpIHtcbiAgICBmb3IgKGxldCBqID0gMDsgaiA8IG51bUluZGljZXNbaV07ICsraikge1xuICAgICAgLy8gaW5kaWNlcyBpcyBhIDJkIHRlbnNvciB3aXRoIHNoYXBlIG9mIFtvdXRwdXRTaXplLCAyXVxuICAgICAgaW5kaWNlc1tjICogMl0gPSBpO1xuICAgICAgaW5kaWNlc1tjICogMiArIDFdID0gajtcbiAgICAgIHZhbHVlc1tjXSA9IHRva2Vuc1tjXTtcbiAgICAgICsrYztcbiAgICB9XG4gIH1cblxuICByZXR1cm4gW2luZGljZXMsIHZhbHVlcywgc2hhcGVdO1xufVxuIl19","/**\n * @license\n * Copyright 2021 Google LLC. All Rights Reserved.\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n * =============================================================================\n */\nimport { StringSplit } from '@tensorflow/tfjs-core';\nimport { stringSplitImpl } from './StringSplit_impl';\nexport function stringSplit(args) {\n const { inputs, backend, attrs } = args;\n const { skipEmpty } = attrs;\n const { input, delimiter } = inputs;\n if (input.dtype !== 'string') {\n throw new Error('Input must be of datatype string');\n }\n if (input.shape.length !== 1) {\n throw new Error(`Input must be a vector, got shape: ${input.shape}`);\n }\n if (delimiter.shape.length !== 0) {\n throw new Error(`Delimiter must be a scalar, got shape: ${delimiter.shape}`);\n }\n const $input = backend.data.get(input.dataId).values;\n const $delimiter = backend.data.get(delimiter.dataId).values[0];\n const [indices, values, shape] = stringSplitImpl($input, $delimiter, skipEmpty);\n const outputSize = values.length;\n return [\n backend.makeTensorInfo([outputSize, 2], 'int32', indices),\n backend.makeTensorInfo([outputSize], 'string', values),\n backend.makeTensorInfo([2], 'int32', new Int32Array(shape))\n ];\n}\nexport const stringSplitConfig = {\n kernelName: StringSplit,\n backendName: 'cpu',\n kernelFunc: stringSplit,\n};\n//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiU3RyaW5nU3BsaXQuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi8uLi90ZmpzLWJhY2tlbmQtY3B1L3NyYy9rZXJuZWxzL1N0cmluZ1NwbGl0LnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBOzs7Ozs7Ozs7Ozs7Ozs7R0FlRztBQUVILE9BQU8sRUFBMkIsV0FBVyxFQUFrRCxNQUFNLHVCQUF1QixDQUFDO0FBSTdILE9BQU8sRUFBQyxlQUFlLEVBQUMsTUFBTSxvQkFBb0IsQ0FBQztBQUVuRCxNQUFNLFVBQVUsV0FBVyxDQUFDLElBSTNCO0lBQ0MsTUFBTSxFQUFDLE1BQU0sRUFBRSxPQUFPLEVBQUUsS0FBSyxFQUFDLEdBQUcsSUFBSSxDQUFDO0lBQ3RDLE1BQU0sRUFBQyxTQUFTLEVBQUMsR0FBRyxLQUFLLENBQUM7SUFDMUIsTUFBTSxFQUFDLEtBQUssRUFBRSxTQUFTLEVBQUMsR0FBRyxNQUFNLENBQUM7SUFFbEMsSUFBSSxLQUFLLENBQUMsS0FBSyxLQUFLLFFBQVEsRUFBRTtRQUM1QixNQUFNLElBQUksS0FBSyxDQUFDLGtDQUFrQyxDQUFDLENBQUM7S0FDckQ7SUFDRCxJQUFJLEtBQUssQ0FBQyxLQUFLLENBQUMsTUFBTSxLQUFLLENBQUMsRUFBRTtRQUM1QixNQUFNLElBQUksS0FBSyxDQUFDLHNDQUFzQyxLQUFLLENBQUMsS0FBSyxFQUFFLENBQUMsQ0FBQztLQUN0RTtJQUNELElBQUksU0FBUyxDQUFDLEtBQUssQ0FBQyxNQUFNLEtBQUssQ0FBQyxFQUFFO1FBQ2hDLE1BQU0sSUFBSSxLQUFLLENBQ1gsMENBQTBDLFNBQVMsQ0FBQyxLQUFLLEVBQUUsQ0FBQyxDQUFDO0tBQ2xFO0lBRUQsTUFBTSxNQUFNLEdBQUcsT0FBTyxDQUFDLElBQUksQ0FBQyxHQUFHLENBQUMsS0FBSyxDQUFDLE1BQU0sQ0FBQyxDQUFDLE1BQXNCLENBQUM7SUFDckUsTUFBTSxVQUFVLEdBQUcsT0FBTyxDQUFDLElBQUksQ0FBQyxHQUFHLENBQUMsU0FBUyxDQUFDLE1BQU0sQ0FBQyxDQUFDLE1BQU0sQ0FBQyxDQUFDLENBQWUsQ0FBQztJQUU5RSxNQUFNLENBQUMsT0FBTyxFQUFFLE1BQU0sRUFBRSxLQUFLLENBQUMsR0FDMUIsZUFBZSxDQUFDLE1BQU0sRUFBRSxVQUFVLEVBQUUsU0FBUyxDQUFDLENBQUM7SUFDbkQsTUFBTSxVQUFVLEdBQUcsTUFBTSxDQUFDLE1BQU0sQ0FBQztJQUNqQyxPQUFPO1FBQ0wsT0FBTyxDQUFDLGNBQWMsQ0FBQyxDQUFDLFVBQVUsRUFBRSxDQUFDLENBQUMsRUFBRSxPQUFPLEVBQUUsT0FBTyxDQUFDO1FBQ3pELE9BQU8sQ0FBQyxjQUFjLENBQUMsQ0FBQyxVQUFVLENBQUMsRUFBRSxRQUFRLEVBQUUsTUFBTSxDQUFDO1FBQ3RELE9BQU8sQ0FBQyxjQUFjLENBQUMsQ0FBQyxDQUFDLENBQUMsRUFBRSxPQUFPLEVBQUUsSUFBSSxVQUFVLENBQUMsS0FBSyxDQUFDLENBQUM7S0FDNUQsQ0FBQztBQUNKLENBQUM7QUFFRCxNQUFNLENBQUMsTUFBTSxpQkFBaUIsR0FBaUI7SUFDN0MsVUFBVSxFQUFFLFdBQVc7SUFDdkIsV0FBVyxFQUFFLEtBQUs7SUFDbEIsVUFBVSxFQUFFLFdBQStCO0NBQzVDLENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyIvKipcbiAqIEBsaWNlbnNlXG4gKiBDb3B5cmlnaHQgMjAyMSBHb29nbGUgTExDLiBBbGwgUmlnaHRzIFJlc2VydmVkLlxuICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlIFwiTGljZW5zZVwiKTtcbiAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS5cbiAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdFxuICpcbiAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMFxuICpcbiAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmVcbiAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuIFwiQVMgSVNcIiBCQVNJUyxcbiAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLlxuICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZFxuICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuXG4gKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuICovXG5cbmltcG9ydCB7S2VybmVsQ29uZmlnLCBLZXJuZWxGdW5jLCBTdHJpbmdTcGxpdCwgU3RyaW5nU3BsaXRBdHRycywgU3RyaW5nU3BsaXRJbnB1dHMsIFRlbnNvckluZm99IGZyb20gJ0B0ZW5zb3JmbG93L3RmanMtY29yZSc7XG5cbmltcG9ydCB7TWF0aEJhY2tlbmRDUFV9IGZyb20gJy4uL2JhY2tlbmRfY3B1JztcblxuaW1wb3J0IHtzdHJpbmdTcGxpdEltcGx9IGZyb20gJy4vU3RyaW5nU3BsaXRfaW1wbCc7XG5cbmV4cG9ydCBmdW5jdGlvbiBzdHJpbmdTcGxpdChhcmdzOiB7XG4gIGlucHV0czogU3RyaW5nU3BsaXRJbnB1dHMsXG4gIGJhY2tlbmQ6IE1hdGhCYWNrZW5kQ1BVLFxuICBhdHRyczogU3RyaW5nU3BsaXRBdHRyc1xufSk6IFtUZW5zb3JJbmZvLCBUZW5zb3JJbmZvLCBUZW5zb3JJbmZvXSB7XG4gIGNvbnN0IHtpbnB1dHMsIGJhY2tlbmQsIGF0dHJzfSA9IGFyZ3M7XG4gIGNvbnN0IHtza2lwRW1wdHl9ID0gYXR0cnM7XG4gIGNvbnN0IHtpbnB1dCwgZGVsaW1pdGVyfSA9IGlucHV0cztcblxuICBpZiAoaW5wdXQuZHR5cGUgIT09ICdzdHJpbmcnKSB7XG4gICAgdGhyb3cgbmV3IEVycm9yKCdJbnB1dCBtdXN0IGJlIG9mIGRhdGF0eXBlIHN0cmluZycpO1xuICB9XG4gIGlmIChpbnB1dC5zaGFwZS5sZW5ndGggIT09IDEpIHtcbiAgICB0aHJvdyBuZXcgRXJyb3IoYElucHV0IG11c3QgYmUgYSB2ZWN0b3IsIGdvdCBzaGFwZTogJHtpbnB1dC5zaGFwZX1gKTtcbiAgfVxuICBpZiAoZGVsaW1pdGVyLnNoYXBlLmxlbmd0aCAhPT0gMCkge1xuICAgIHRocm93IG5ldyBFcnJvcihcbiAgICAgICAgYERlbGltaXRlciBtdXN0IGJlIGEgc2NhbGFyLCBnb3Qgc2hhcGU6ICR7ZGVsaW1pdGVyLnNoYXBlfWApO1xuICB9XG5cbiAgY29uc3QgJGlucHV0ID0gYmFja2VuZC5kYXRhLmdldChpbnB1dC5kYXRhSWQpLnZhbHVlcyBhcyBVaW50OEFycmF5W107XG4gIGNvbnN0ICRkZWxpbWl0ZXIgPSBiYWNrZW5kLmRhdGEuZ2V0KGRlbGltaXRlci5kYXRhSWQpLnZhbHVlc1swXSBhcyBVaW50OEFycmF5O1xuXG4gIGNvbnN0IFtpbmRpY2VzLCB2YWx1ZXMsIHNoYXBlXSA9XG4gICAgICBzdHJpbmdTcGxpdEltcGwoJGlucHV0LCAkZGVsaW1pdGVyLCBza2lwRW1wdHkpO1xuICBjb25zdCBvdXRwdXRTaXplID0gdmFsdWVzLmxlbmd0aDtcbiAgcmV0dXJuIFtcbiAgICBiYWNrZW5kLm1ha2VUZW5zb3JJbmZvKFtvdXRwdXRTaXplLCAyXSwgJ2ludDMyJywgaW5kaWNlcyksXG4gICAgYmFja2VuZC5tYWtlVGVuc29ySW5mbyhbb3V0cHV0U2l6ZV0sICdzdHJpbmcnLCB2YWx1ZXMpLFxuICAgIGJhY2tlbmQubWFrZVRlbnNvckluZm8oWzJdLCAnaW50MzInLCBuZXcgSW50MzJBcnJheShzaGFwZSkpXG4gIF07XG59XG5cbmV4cG9ydCBjb25zdCBzdHJpbmdTcGxpdENvbmZpZzogS2VybmVsQ29uZmlnID0ge1xuICBrZXJuZWxOYW1lOiBTdHJpbmdTcGxpdCxcbiAgYmFja2VuZE5hbWU6ICdjcHUnLFxuICBrZXJuZWxGdW5jOiBzdHJpbmdTcGxpdCBhcyB7fSBhcyBLZXJuZWxGdW5jLFxufTtcbiJdfQ==","/**\n * @license\n * Copyright 2021 Google LLC. All Rights Reserved.\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n * =============================================================================\n */\nimport { util } from '@tensorflow/tfjs-core';\nexport function stringToHashBucketFastImpl(input, numBuckets) {\n const output = util.getArrayFromDType('int32', input.length);\n for (let i = 0; i < input.length; ++i) {\n output[i] =\n util.fingerPrint64(input[i]).modulo(numBuckets).getLowBitsUnsigned();\n }\n return output;\n}\n//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiU3RyaW5nVG9IYXNoQnVja2V0RmFzdF9pbXBsLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vLi4vdGZqcy1iYWNrZW5kLWNwdS9zcmMva2VybmVscy9TdHJpbmdUb0hhc2hCdWNrZXRGYXN0X2ltcGwudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUE7Ozs7Ozs7Ozs7Ozs7OztHQWVHO0FBRUgsT0FBTyxFQUFhLElBQUksRUFBQyxNQUFNLHVCQUF1QixDQUFDO0FBRXZELE1BQU0sVUFBVSwwQkFBMEIsQ0FDdEMsS0FBbUIsRUFBRSxVQUFrQjtJQUN6QyxNQUFNLE1BQU0sR0FBRyxJQUFJLENBQUMsaUJBQWlCLENBQUMsT0FBTyxFQUFFLEtBQUssQ0FBQyxNQUFNLENBQWUsQ0FBQztJQUUzRSxLQUFLLElBQUksQ0FBQyxHQUFHLENBQUMsRUFBRSxDQUFDLEdBQUcsS0FBSyxDQUFDLE1BQU0sRUFBRSxFQUFFLENBQUMsRUFBRTtRQUNyQyxNQUFNLENBQUMsQ0FBQyxDQUFDO1lBQ0wsSUFBSSxDQUFDLGFBQWEsQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxNQUFNLENBQUMsVUFBVSxDQUFDLENBQUMsa0JBQWtCLEVBQUUsQ0FBQztLQUMxRTtJQUVELE9BQU8sTUFBTSxDQUFDO0FBQ2hCLENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyIvKipcbiAqIEBsaWNlbnNlXG4gKiBDb3B5cmlnaHQgMjAyMSBHb29nbGUgTExDLiBBbGwgUmlnaHRzIFJlc2VydmVkLlxuICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlIFwiTGljZW5zZVwiKTtcbiAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS5cbiAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdFxuICpcbiAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMFxuICpcbiAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmVcbiAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuIFwiQVMgSVNcIiBCQVNJUyxcbiAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLlxuICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZFxuICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuXG4gKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuICovXG5cbmltcG9ydCB7VHlwZWRBcnJheSwgdXRpbH0gZnJvbSAnQHRlbnNvcmZsb3cvdGZqcy1jb3JlJztcblxuZXhwb3J0IGZ1bmN0aW9uIHN0cmluZ1RvSGFzaEJ1Y2tldEZhc3RJbXBsKFxuICAgIGlucHV0OiBVaW50OEFycmF5W10sIG51bUJ1Y2tldHM6IG51bWJlcik6IFR5cGVkQXJyYXkge1xuICBjb25zdCBvdXRwdXQgPSB1dGlsLmdldEFycmF5RnJvbURUeXBlKCdpbnQzMicsIGlucHV0Lmxlbmd0aCkgYXMgVHlwZWRBcnJheTtcblxuICBmb3IgKGxldCBpID0gMDsgaSA8IGlucHV0Lmxlbmd0aDsgKytpKSB7XG4gICAgb3V0cHV0W2ldID1cbiAgICAgICAgdXRpbC5maW5nZXJQcmludDY0KGlucHV0W2ldKS5tb2R1bG8obnVtQnVja2V0cykuZ2V0TG93Qml0c1Vuc2lnbmVkKCk7XG4gIH1cblxuICByZXR1cm4gb3V0cHV0O1xufVxuIl19","/**\n * @license\n * Copyright 2021 Google LLC. All Rights Reserved.\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n * =============================================================================\n */\nimport { StringToHashBucketFast } from '@tensorflow/tfjs-core';\nimport { stringToHashBucketFastImpl } from './StringToHashBucketFast_impl';\nexport function stringToHashBucketFast(args) {\n const { inputs, backend, attrs } = args;\n const { numBuckets } = attrs;\n const { input } = inputs;\n if (input.dtype !== 'string') {\n throw new Error('Input must be of datatype string');\n }\n if (numBuckets <= 0) {\n throw new Error(`Number of buckets must be at least 1`);\n }\n const $input = backend.data.get(input.dataId).values;\n const output = stringToHashBucketFastImpl($input, numBuckets);\n return backend.makeTensorInfo(input.shape, 'int32', output);\n}\nexport const stringToHashBucketFastConfig = {\n kernelName: StringToHashBucketFast,\n backendName: 'cpu',\n kernelFunc: stringToHashBucketFast,\n};\n//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiU3RyaW5nVG9IYXNoQnVja2V0RmFzdC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uLy4uL3RmanMtYmFja2VuZC1jcHUvc3JjL2tlcm5lbHMvU3RyaW5nVG9IYXNoQnVja2V0RmFzdC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQTs7Ozs7Ozs7Ozs7Ozs7O0dBZUc7QUFFSCxPQUFPLEVBQTJCLHNCQUFzQixFQUF3RSxNQUFNLHVCQUF1QixDQUFDO0FBSTlKLE9BQU8sRUFBQywwQkFBMEIsRUFBQyxNQUFNLCtCQUErQixDQUFDO0FBRXpFLE1BQU0sVUFBVSxzQkFBc0IsQ0FBQyxJQUl0QztJQUNDLE1BQU0sRUFBQyxNQUFNLEVBQUUsT0FBTyxFQUFFLEtBQUssRUFBQyxHQUFHLElBQUksQ0FBQztJQUN0QyxNQUFNLEVBQUMsVUFBVSxFQUFDLEdBQUcsS0FBSyxDQUFDO0lBQzNCLE1BQU0sRUFBQyxLQUFLLEVBQUMsR0FBRyxNQUFNLENBQUM7SUFFdkIsSUFBSSxLQUFLLENBQUMsS0FBSyxLQUFLLFFBQVEsRUFBRTtRQUM1QixNQUFNLElBQUksS0FBSyxDQUFDLGtDQUFrQyxDQUFDLENBQUM7S0FDckQ7SUFDRCxJQUFJLFVBQVUsSUFBSSxDQUFDLEVBQUU7UUFDbkIsTUFBTSxJQUFJLEtBQUssQ0FBQyxzQ0FBc0MsQ0FBQyxDQUFDO0tBQ3pEO0lBRUQsTUFBTSxNQUFNLEdBQUcsT0FBTyxDQUFDLElBQUksQ0FBQyxHQUFHLENBQUMsS0FBSyxDQUFDLE1BQU0sQ0FBQyxDQUFDLE1BQXNCLENBQUM7SUFFckUsTUFBTSxNQUFNLEdBQUcsMEJBQTBCLENBQUMsTUFBTSxFQUFFLFVBQVUsQ0FBQyxDQUFDO0lBQzlELE9BQU8sT0FBTyxDQUFDLGNBQWMsQ0FBQyxLQUFLLENBQUMsS0FBSyxFQUFFLE9BQU8sRUFBRSxNQUFNLENBQUMsQ0FBQztBQUM5RCxDQUFDO0FBRUQsTUFBTSxDQUFDLE1BQU0sNEJBQTRCLEdBQWlCO0lBQ3hELFVBQVUsRUFBRSxzQkFBc0I7SUFDbEMsV0FBVyxFQUFFLEtBQUs7SUFDbEIsVUFBVSxFQUFFLHNCQUEwQztDQUN2RCxDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiLyoqXG4gKiBAbGljZW5zZVxuICogQ29weXJpZ2h0IDIwMjEgR29vZ2xlIExMQy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC5cbiAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSBcIkxpY2Vuc2VcIik7XG4gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuXG4gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXRcbiAqXG4gKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjBcbiAqXG4gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlXG4gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiBcIkFTIElTXCIgQkFTSVMsXG4gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC5cbiAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmRcbiAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLlxuICogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbiAqL1xuXG5pbXBvcnQge0tlcm5lbENvbmZpZywgS2VybmVsRnVuYywgU3RyaW5nVG9IYXNoQnVja2V0RmFzdCwgU3RyaW5nVG9IYXNoQnVja2V0RmFzdEF0dHJzLCBTdHJpbmdUb0hhc2hCdWNrZXRGYXN0SW5wdXRzLCBUZW5zb3JJbmZvfSBmcm9tICdAdGVuc29yZmxvdy90ZmpzLWNvcmUnO1xuXG5pbXBvcnQge01hdGhCYWNrZW5kQ1BVfSBmcm9tICcuLi9iYWNrZW5kX2NwdSc7XG5cbmltcG9ydCB7c3RyaW5nVG9IYXNoQnVja2V0RmFzdEltcGx9IGZyb20gJy4vU3RyaW5nVG9IYXNoQnVja2V0RmFzdF9pbXBsJztcblxuZXhwb3J0IGZ1bmN0aW9uIHN0cmluZ1RvSGFzaEJ1Y2tldEZhc3QoYXJnczoge1xuICBpbnB1dHM6IFN0cmluZ1RvSGFzaEJ1Y2tldEZhc3RJbnB1dHMsXG4gIGJhY2tlbmQ6IE1hdGhCYWNrZW5kQ1BVLFxuICBhdHRyczogU3RyaW5nVG9IYXNoQnVja2V0RmFzdEF0dHJzXG59KTogVGVuc29ySW5mbyB7XG4gIGNvbnN0IHtpbnB1dHMsIGJhY2tlbmQsIGF0dHJzfSA9IGFyZ3M7XG4gIGNvbnN0IHtudW1CdWNrZXRzfSA9IGF0dHJzO1xuICBjb25zdCB7aW5wdXR9ID0gaW5wdXRzO1xuXG4gIGlmIChpbnB1dC5kdHlwZSAhPT0gJ3N0cmluZycpIHtcbiAgICB0aHJvdyBuZXcgRXJyb3IoJ0lucHV0IG11c3QgYmUgb2YgZGF0YXR5cGUgc3RyaW5nJyk7XG4gIH1cbiAgaWYgKG51bUJ1Y2tldHMgPD0gMCkge1xuICAgIHRocm93IG5ldyBFcnJvcihgTnVtYmVyIG9mIGJ1Y2tldHMgbXVzdCBiZSBhdCBsZWFzdCAxYCk7XG4gIH1cblxuICBjb25zdCAkaW5wdXQgPSBiYWNrZW5kLmRhdGEuZ2V0KGlucHV0LmRhdGFJZCkudmFsdWVzIGFzIFVpbnQ4QXJyYXlbXTtcblxuICBjb25zdCBvdXRwdXQgPSBzdHJpbmdUb0hhc2hCdWNrZXRGYXN0SW1wbCgkaW5wdXQsIG51bUJ1Y2tldHMpO1xuICByZXR1cm4gYmFja2VuZC5tYWtlVGVuc29ySW5mbyhpbnB1dC5zaGFwZSwgJ2ludDMyJywgb3V0cHV0KTtcbn1cblxuZXhwb3J0IGNvbnN0IHN0cmluZ1RvSGFzaEJ1Y2tldEZhc3RDb25maWc6IEtlcm5lbENvbmZpZyA9IHtcbiAga2VybmVsTmFtZTogU3RyaW5nVG9IYXNoQnVja2V0RmFzdCxcbiAgYmFja2VuZE5hbWU6ICdjcHUnLFxuICBrZXJuZWxGdW5jOiBzdHJpbmdUb0hhc2hCdWNrZXRGYXN0IGFzIHt9IGFzIEtlcm5lbEZ1bmMsXG59O1xuIl19","/**\n * @license\n * Copyright 2020 Google LLC. All Rights Reserved.\n * Licensed under the Apache License, Version 2.0 (the License);\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an AS IS BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n * =============================================================================\n */\nimport { Tan } from '@tensorflow/tfjs-core';\nimport { unaryKernelFunc } from '../utils/unary_utils';\nexport const tan = unaryKernelFunc(Tan, (xi) => Math.tan(xi));\nexport const tanConfig = {\n kernelName: Tan,\n backendName: 'cpu',\n kernelFunc: tan,\n};\n//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiVGFuLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vLi4vdGZqcy1iYWNrZW5kLWNwdS9zcmMva2VybmVscy9UYW4udHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUE7Ozs7Ozs7Ozs7Ozs7OztHQWVHO0FBRUgsT0FBTyxFQUFlLEdBQUcsRUFBQyxNQUFNLHVCQUF1QixDQUFDO0FBRXhELE9BQU8sRUFBQyxlQUFlLEVBQUMsTUFBTSxzQkFBc0IsQ0FBQztBQUVyRCxNQUFNLENBQUMsTUFBTSxHQUFHLEdBQUcsZUFBZSxDQUFDLEdBQUcsRUFBRSxDQUFDLEVBQUUsRUFBRSxFQUFFLENBQUMsSUFBSSxDQUFDLEdBQUcsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDO0FBRTlELE1BQU0sQ0FBQyxNQUFNLFNBQVMsR0FBaUI7SUFDckMsVUFBVSxFQUFFLEdBQUc7SUFDZixXQUFXLEVBQUUsS0FBSztJQUNsQixVQUFVLEVBQUUsR0FBRztDQUNoQixDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiLyoqXG4gKiBAbGljZW5zZVxuICogQ29weXJpZ2h0IDIwMjAgR29vZ2xlIExMQy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC5cbiAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSBMaWNlbnNlKTtcbiAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS5cbiAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdFxuICpcbiAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMFxuICpcbiAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmVcbiAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuIEFTIElTIEJBU0lTLFxuICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuXG4gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kXG4gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS5cbiAqID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4gKi9cblxuaW1wb3J0IHtLZXJuZWxDb25maWcsIFRhbn0gZnJvbSAnQHRlbnNvcmZsb3cvdGZqcy1jb3JlJztcblxuaW1wb3J0IHt1bmFyeUtlcm5lbEZ1bmN9IGZyb20gJy4uL3V0aWxzL3VuYXJ5X3V0aWxzJztcblxuZXhwb3J0IGNvbnN0IHRhbiA9IHVuYXJ5S2VybmVsRnVuYyhUYW4sICh4aSkgPT4gTWF0aC50YW4oeGkpKTtcblxuZXhwb3J0IGNvbnN0IHRhbkNvbmZpZzogS2VybmVsQ29uZmlnID0ge1xuICBrZXJuZWxOYW1lOiBUYW4sXG4gIGJhY2tlbmROYW1lOiAnY3B1JyxcbiAga2VybmVsRnVuYzogdGFuLFxufTtcbiJdfQ==","/**\n * @license\n * Copyright 2020 Google LLC. All Rights Reserved.\n * Licensed under the Apache License, Version 2.0 (the License);\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an AS IS BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n * =============================================================================\n */\nimport { Tanh } from '@tensorflow/tfjs-core';\nimport { unaryKernelFunc } from '../utils/unary_utils';\nexport const tanh = unaryKernelFunc(Tanh, (xi) => Math.tanh(xi));\nexport const tanhConfig = {\n kernelName: Tanh,\n backendName: 'cpu',\n kernelFunc: tanh,\n};\n//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiVGFuaC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uLy4uL3RmanMtYmFja2VuZC1jcHUvc3JjL2tlcm5lbHMvVGFuaC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQTs7Ozs7Ozs7Ozs7Ozs7O0dBZUc7QUFFSCxPQUFPLEVBQWUsSUFBSSxFQUFDLE1BQU0sdUJBQXVCLENBQUM7QUFFekQsT0FBTyxFQUFDLGVBQWUsRUFBQyxNQUFNLHNCQUFzQixDQUFDO0FBRXJELE1BQU0sQ0FBQyxNQUFNLElBQUksR0FBRyxlQUFlLENBQUMsSUFBSSxFQUFFLENBQUMsRUFBRSxFQUFFLEVBQUUsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUM7QUFFakUsTUFBTSxDQUFDLE1BQU0sVUFBVSxHQUFpQjtJQUN0QyxVQUFVLEVBQUUsSUFBSTtJQUNoQixXQUFXLEVBQUUsS0FBSztJQUNsQixVQUFVLEVBQUUsSUFBSTtDQUNqQixDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiLyoqXG4gKiBAbGljZW5zZVxuICogQ29weXJpZ2h0IDIwMjAgR29vZ2xlIExMQy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC5cbiAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSBMaWNlbnNlKTtcbiAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS5cbiAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdFxuICpcbiAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMFxuICpcbiAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmVcbiAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuIEFTIElTIEJBU0lTLFxuICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuXG4gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kXG4gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS5cbiAqID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4gKi9cblxuaW1wb3J0IHtLZXJuZWxDb25maWcsIFRhbmh9IGZyb20gJ0B0ZW5zb3JmbG93L3RmanMtY29yZSc7XG5cbmltcG9ydCB7dW5hcnlLZXJuZWxGdW5jfSBmcm9tICcuLi91dGlscy91bmFyeV91dGlscyc7XG5cbmV4cG9ydCBjb25zdCB0YW5oID0gdW5hcnlLZXJuZWxGdW5jKFRhbmgsICh4aSkgPT4gTWF0aC50YW5oKHhpKSk7XG5cbmV4cG9ydCBjb25zdCB0YW5oQ29uZmlnOiBLZXJuZWxDb25maWcgPSB7XG4gIGtlcm5lbE5hbWU6IFRhbmgsXG4gIGJhY2tlbmROYW1lOiAnY3B1JyxcbiAga2VybmVsRnVuYzogdGFuaCxcbn07XG4iXX0=","/**\n * @license\n * Copyright 2019 Google LLC. All Rights Reserved.\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n * =============================================================================\n */\nimport { buffer } from '@tensorflow/tfjs-core';\n/**\n * An implementation of the tile kernel shared between webgl and cpu for string\n * tensors only.\n */\nexport function tileImpl(xBuf, reps) {\n const newShape = new Array(xBuf.rank);\n for (let i = 0; i < newShape.length; i++) {\n newShape[i] = xBuf.shape[i] * reps[i];\n }\n const result = buffer(newShape, xBuf.dtype);\n for (let i = 0; i < result.values.length; ++i) {\n const newLoc = result.indexToLoc(i);\n const originalLoc = new Array(xBuf.rank);\n for (let j = 0; j < originalLoc.length; j++) {\n originalLoc[j] = newLoc[j] % xBuf.shape[j];\n }\n const originalIndex = xBuf.locToIndex(originalLoc);\n result.values[i] = xBuf.values[originalIndex];\n }\n return result;\n}\n//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiVGlsZV9pbXBsLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vLi4vdGZqcy1iYWNrZW5kLWNwdS9zcmMva2VybmVscy9UaWxlX2ltcGwudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUE7Ozs7Ozs7Ozs7Ozs7OztHQWVHO0FBRUgsT0FBTyxFQUFDLE1BQU0sRUFBK0IsTUFBTSx1QkFBdUIsQ0FBQztBQUUzRTs7O0dBR0c7QUFFSCxNQUFNLFVBQVUsUUFBUSxDQUNwQixJQUErQixFQUMvQixJQUFjO0lBQ2hCLE1BQU0sUUFBUSxHQUFhLElBQUksS0FBSyxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsQ0FBQztJQUNoRCxLQUFLLElBQUksQ0FBQyxHQUFHLENBQUMsRUFBRSxDQUFDLEdBQUcsUUFBUSxDQUFDLE1BQU0sRUFBRSxDQUFDLEVBQUUsRUFBRTtRQUN4QyxRQUFRLENBQUMsQ0FBQyxDQUFDLEdBQUcsSUFBSSxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUMsR0FBRyxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUM7S0FDdkM7SUFDRCxNQUFNLE1BQU0sR0FBRyxNQUFNLENBQUMsUUFBUSxFQUFFLElBQUksQ0FBQyxLQUFLLENBQUMsQ0FBQztJQUM1QyxLQUFLLElBQUksQ0FBQyxHQUFHLENBQUMsRUFBRSxDQUFDLEdBQUcsTUFBTSxDQUFDLE1BQU0sQ0FBQyxNQUFNLEVBQUUsRUFBRSxDQUFDLEVBQUU7UUFDN0MsTUFBTSxNQUFNLEdBQUcsTUFBTSxDQUFDLFVBQVUsQ0FBQyxDQUFDLENBQUMsQ0FBQztRQUVwQyxNQUFNLFdBQVcsR0FBYSxJQUFJLEtBQUssQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLENBQUM7UUFDbkQsS0FBSyxJQUFJLENBQUMsR0FBRyxDQUFDLEVBQUUsQ0FBQyxHQUFHLFdBQVcsQ0FBQyxNQUFNLEVBQUUsQ0FBQyxFQUFFLEVBQUU7WUFDM0MsV0FBVyxDQUFDLENBQUMsQ0FBQyxHQUFHLE1BQU0sQ0FBQyxDQUFDLENBQUMsR0FBRyxJQUFJLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQyxDQUFDO1NBQzVDO1FBRUQsTUFBTSxhQUFhLEdBQUcsSUFBSSxDQUFDLFVBQVUsQ0FBQyxXQUFXLENBQUMsQ0FBQztRQUVuRCxNQUFNLENBQUMsTUFBTSxDQUFDLENBQUMsQ0FBQyxHQUFHLElBQUksQ0FBQyxNQUFNLENBQUMsYUFBYSxDQUFDLENBQUM7S0FDL0M7SUFDRCxPQUFPLE1BQW1DLENBQUM7QUFDN0MsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbIi8qKlxuICogQGxpY2Vuc2VcbiAqIENvcHlyaWdodCAyMDE5IEdvb2dsZSBMTEMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuXG4gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgXCJMaWNlbnNlXCIpO1xuICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLlxuICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0XG4gKlxuICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wXG4gKlxuICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZVxuICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gXCJBUyBJU1wiIEJBU0lTLFxuICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuXG4gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kXG4gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS5cbiAqID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4gKi9cblxuaW1wb3J0IHtidWZmZXIsIERhdGFUeXBlLCBSYW5rLCBUZW5zb3JCdWZmZXJ9IGZyb20gJ0B0ZW5zb3JmbG93L3RmanMtY29yZSc7XG5cbi8qKlxuICogQW4gaW1wbGVtZW50YXRpb24gb2YgdGhlIHRpbGUga2VybmVsIHNoYXJlZCBiZXR3ZWVuIHdlYmdsIGFuZCBjcHUgZm9yIHN0cmluZ1xuICogdGVuc29ycyBvbmx5LlxuICovXG5cbmV4cG9ydCBmdW5jdGlvbiB0aWxlSW1wbDxSIGV4dGVuZHMgUmFuaz4oXG4gICAgeEJ1ZjogVGVuc29yQnVmZmVyPFIsIERhdGFUeXBlPixcbiAgICByZXBzOiBudW1iZXJbXSk6IFRlbnNvckJ1ZmZlcjxSLCBEYXRhVHlwZT4ge1xuICBjb25zdCBuZXdTaGFwZTogbnVtYmVyW10gPSBuZXcgQXJyYXkoeEJ1Zi5yYW5rKTtcbiAgZm9yIChsZXQgaSA9IDA7IGkgPCBuZXdTaGFwZS5sZW5ndGg7IGkrKykge1xuICAgIG5ld1NoYXBlW2ldID0geEJ1Zi5zaGFwZVtpXSAqIHJlcHNbaV07XG4gIH1cbiAgY29uc3QgcmVzdWx0ID0gYnVmZmVyKG5ld1NoYXBlLCB4QnVmLmR0eXBlKTtcbiAgZm9yIChsZXQgaSA9IDA7IGkgPCByZXN1bHQudmFsdWVzLmxlbmd0aDsgKytpKSB7XG4gICAgY29uc3QgbmV3TG9jID0gcmVzdWx0LmluZGV4VG9Mb2MoaSk7XG5cbiAgICBjb25zdCBvcmlnaW5hbExvYzogbnVtYmVyW10gPSBuZXcgQXJyYXkoeEJ1Zi5yYW5rKTtcbiAgICBmb3IgKGxldCBqID0gMDsgaiA8IG9yaWdpbmFsTG9jLmxlbmd0aDsgaisrKSB7XG4gICAgICBvcmlnaW5hbExvY1tqXSA9IG5ld0xvY1tqXSAlIHhCdWYuc2hhcGVbal07XG4gICAgfVxuXG4gICAgY29uc3Qgb3JpZ2luYWxJbmRleCA9IHhCdWYubG9jVG9JbmRleChvcmlnaW5hbExvYyk7XG5cbiAgICByZXN1bHQudmFsdWVzW2ldID0geEJ1Zi52YWx1ZXNbb3JpZ2luYWxJbmRleF07XG4gIH1cbiAgcmV0dXJuIHJlc3VsdCBhcyBUZW5zb3JCdWZmZXI8UiwgRGF0YVR5cGU+O1xufVxuIl19","/**\n * @license\n * Copyright 2020 Google LLC. All Rights Reserved.\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n * =============================================================================\n */\nimport { Tile } from '@tensorflow/tfjs-core';\nimport { assertNotComplex } from '../cpu_util';\nimport { tileImpl } from './Tile_impl';\nexport function tile(args) {\n const { inputs, backend, attrs } = args;\n const { x } = inputs;\n const { reps } = attrs;\n assertNotComplex(x, 'tile');\n const outBuf = tileImpl(backend.bufferSync(x), reps);\n return backend.makeTensorInfo(outBuf.shape, outBuf.dtype, outBuf.values);\n}\nexport const tileConfig = {\n kernelName: Tile,\n backendName: 'cpu',\n kernelFunc: tile\n};\n//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiVGlsZS5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uLy4uL3RmanMtYmFja2VuZC1jcHUvc3JjL2tlcm5lbHMvVGlsZS50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQTs7Ozs7Ozs7Ozs7Ozs7O0dBZUc7QUFFSCxPQUFPLEVBQXVDLElBQUksRUFBd0IsTUFBTSx1QkFBdUIsQ0FBQztBQUd4RyxPQUFPLEVBQUMsZ0JBQWdCLEVBQUMsTUFBTSxhQUFhLENBQUM7QUFDN0MsT0FBTyxFQUFDLFFBQVEsRUFBQyxNQUFNLGFBQWEsQ0FBQztBQUVyQyxNQUFNLFVBQVUsSUFBSSxDQUNoQixJQUFxRTtJQUV2RSxNQUFNLEVBQUMsTUFBTSxFQUFFLE9BQU8sRUFBRSxLQUFLLEVBQUMsR0FBRyxJQUFJLENBQUM7SUFDdEMsTUFBTSxFQUFDLENBQUMsRUFBQyxHQUFHLE1BQU0sQ0FBQztJQUNuQixNQUFNLEVBQUMsSUFBSSxFQUFDLEdBQUcsS0FBSyxDQUFDO0lBRXJCLGdCQUFnQixDQUFDLENBQUMsRUFBRSxNQUFNLENBQUMsQ0FBQztJQUM1QixNQUFNLE1BQU0sR0FBRyxRQUFRLENBQUMsT0FBTyxDQUFDLFVBQVUsQ0FBQyxDQUFDLENBQUMsRUFBRSxJQUFJLENBQUMsQ0FBQztJQUVyRCxPQUFPLE9BQU8sQ0FBQyxjQUFjLENBQUMsTUFBTSxDQUFDLEtBQUssRUFBRSxNQUFNLENBQUMsS0FBSyxFQUFFLE1BQU0sQ0FBQyxNQUFNLENBQUMsQ0FBQztBQUMzRSxDQUFDO0FBRUQsTUFBTSxDQUFDLE1BQU0sVUFBVSxHQUFpQjtJQUN0QyxVQUFVLEVBQUUsSUFBSTtJQUNoQixXQUFXLEVBQUUsS0FBSztJQUNsQixVQUFVLEVBQUUsSUFBd0I7Q0FDckMsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbIi8qKlxuICogQGxpY2Vuc2VcbiAqIENvcHlyaWdodCAyMDIwIEdvb2dsZSBMTEMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuXG4gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgXCJMaWNlbnNlXCIpO1xuICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLlxuICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0XG4gKlxuICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wXG4gKlxuICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZVxuICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gXCJBUyBJU1wiIEJBU0lTLFxuICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuXG4gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kXG4gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS5cbiAqID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4gKi9cblxuaW1wb3J0IHtLZXJuZWxDb25maWcsIEtlcm5lbEZ1bmMsIFRlbnNvckluZm8sIFRpbGUsIFRpbGVBdHRycywgVGlsZUlucHV0c30gZnJvbSAnQHRlbnNvcmZsb3cvdGZqcy1jb3JlJztcblxuaW1wb3J0IHtNYXRoQmFja2VuZENQVX0gZnJvbSAnLi4vYmFja2VuZF9jcHUnO1xuaW1wb3J0IHthc3NlcnROb3RDb21wbGV4fSBmcm9tICcuLi9jcHVfdXRpbCc7XG5pbXBvcnQge3RpbGVJbXBsfSBmcm9tICcuL1RpbGVfaW1wbCc7XG5cbmV4cG9ydCBmdW5jdGlvbiB0aWxlKFxuICAgIGFyZ3M6IHtpbnB1dHM6IFRpbGVJbnB1dHMsIGJhY2tlbmQ6IE1hdGhCYWNrZW5kQ1BVLCBhdHRyczogVGlsZUF0dHJzfSk6XG4gICAgVGVuc29ySW5mbyB7XG4gIGNvbnN0IHtpbnB1dHMsIGJhY2tlbmQsIGF0dHJzfSA9IGFyZ3M7XG4gIGNvbnN0IHt4fSA9IGlucHV0cztcbiAgY29uc3Qge3JlcHN9ID0gYXR0cnM7XG5cbiAgYXNzZXJ0Tm90Q29tcGxleCh4LCAndGlsZScpO1xuICBjb25zdCBvdXRCdWYgPSB0aWxlSW1wbChiYWNrZW5kLmJ1ZmZlclN5bmMoeCksIHJlcHMpO1xuXG4gIHJldHVybiBiYWNrZW5kLm1ha2VUZW5zb3JJbmZvKG91dEJ1Zi5zaGFwZSwgb3V0QnVmLmR0eXBlLCBvdXRCdWYudmFsdWVzKTtcbn1cblxuZXhwb3J0IGNvbnN0IHRpbGVDb25maWc6IEtlcm5lbENvbmZpZyA9IHtcbiAga2VybmVsTmFtZTogVGlsZSxcbiAgYmFja2VuZE5hbWU6ICdjcHUnLFxuICBrZXJuZWxGdW5jOiB0aWxlIGFzIHt9IGFzIEtlcm5lbEZ1bmNcbn07XG4iXX0=","/**\n * @license\n * Copyright 2020 Google LLC. All Rights Reserved.\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n * =============================================================================\n */\n/** An implementation of the TopK kernel shared between webgl and cpu. */\nimport { buffer, util } from '@tensorflow/tfjs-core';\nconst comparePair = (a, b) => {\n const valueDiff = b.value - a.value;\n return valueDiff === 0 ? a.index - b.index : valueDiff;\n};\n/**\n * Partitions array where all elements smaller than the (k+1) smallest element\n * are found to the left of it, and all larger to the right of it.\n * Based on the Floyd-Rivest Algorithm, ref:\n * https://en.wikipedia.org/wiki/Floyd%E2%80%93Rivest_algorithm\n * @param array: Array to partition\n * @param left: Left index for the interval\n * @param right: Right index for the interval\n * @param k: Desired index value, where array[k] is the (k+1)th smallest element\n * when left = 0\n */\nfunction select(array, k, left = 0, right = array.length - 1) {\n while (right > left) {\n // Use select recursively to sample a smaller set of size s\n // the arbitrary constants 600 and 0.5 are used in the original\n // version to minimize execution time.\n if (right - left > 600) {\n const n = right - left + 1;\n const i = k - left + 1;\n const z = Math.log(n);\n const s = 0.5 * Math.exp(2 * z / 3);\n const sd = 0.5 * Math.sqrt(z * s * (n - s) / n) * Math.sign(i - n / 2);\n const newLeft = Math.max(left, Math.floor(k - i * s / n + sd));\n const newRight = Math.min(right, Math.floor(k + (n - i) * s / n + sd));\n select(array, k, newLeft, newRight);\n }\n // partition the elements between left and right around t\n const t = array[k];\n let i = left;\n let j = right;\n util.swap(array, left, k);\n if (comparePair(array[right], t) > 0) {\n util.swap(array, left, right);\n }\n while (i < j) {\n util.swap(array, i, j);\n i++;\n j--;\n while (comparePair(array[i], t) < 0) {\n i = i + 1;\n }\n while (comparePair(array[j], t) > 0) {\n j = j - 1;\n }\n }\n if (comparePair(array[left], t) === 0) {\n util.swap(array, left, j);\n }\n else {\n j = j + 1;\n util.swap(array, j, right);\n }\n // Adjust left and right towards the boundaries of the subset\n // containing the (k - left + 1)th smallest element.\n if (j <= k) {\n left = j + 1;\n }\n if (k <= j) {\n right = j - 1;\n }\n }\n}\nexport function topKImpl(x, xShape, xDtype, k, sorted) {\n // Reshape into a 2d tensor [batch, lastDim] and compute topk along lastDim.\n const lastDim = xShape[xShape.length - 1];\n const [batch, size] = [x.length / lastDim, lastDim];\n const allTopKVals = util.getTypedArrayFromDType(xDtype, batch * k);\n const allTopKIndices = util.getTypedArrayFromDType('int32', batch * k);\n for (let b = 0; b < batch; b++) {\n const offset = b * size;\n const vals = x.subarray(offset, offset + size);\n let valAndInd = new Array(vals.length);\n vals.forEach((value, index) => valAndInd[index] = { value, index });\n if (k < valAndInd.length) {\n select(valAndInd, k);\n valAndInd = valAndInd.slice(0, k);\n }\n if (sorted) {\n valAndInd.sort(comparePair);\n }\n const outOffset = b * k;\n const topKVals = allTopKVals.subarray(outOffset, outOffset + k);\n const topKIndices = allTopKIndices.subarray(outOffset, outOffset + k);\n for (let i = 0; i < k; i++) {\n topKVals[i] = valAndInd[i].value;\n topKIndices[i] = valAndInd[i].index;\n }\n }\n // Reshape back to the original input shape, except that the last\n // dimension is k.\n const outputShape = xShape.slice();\n outputShape[outputShape.length - 1] = k;\n return [\n buffer(outputShape, xDtype, allTopKVals),\n buffer(outputShape, 'int32', allTopKIndices)\n ];\n}\n//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiVG9wS19pbXBsLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vLi4vdGZqcy1iYWNrZW5kLWNwdS9zcmMva2VybmVscy9Ub3BLX2ltcGwudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUE7Ozs7Ozs7Ozs7Ozs7OztHQWVHO0FBRUgseUVBQXlFO0FBRXpFLE9BQU8sRUFBQyxNQUFNLEVBQXFFLElBQUksRUFBQyxNQUFNLHVCQUF1QixDQUFDO0FBT3RILE1BQU0sV0FBVyxHQUFHLENBQUMsQ0FBTyxFQUFFLENBQU8sRUFBRSxFQUFFO0lBQ3ZDLE1BQU0sU0FBUyxHQUFHLENBQUMsQ0FBQyxLQUFLLEdBQUcsQ0FBQyxDQUFDLEtBQUssQ0FBQztJQUNwQyxPQUFPLFNBQVMsS0FBSyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxLQUFLLEdBQUcsQ0FBQyxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUMsU0FBUyxDQUFDO0FBQ3pELENBQUMsQ0FBQztBQUVGOzs7Ozs7Ozs7O0dBVUc7QUFDSCxTQUFTLE1BQU0sQ0FBQyxLQUFhLEVBQUUsQ0FBUyxFQUFFLElBQUksR0FBRyxDQUFDLEVBQUUsS0FBSyxHQUFHLEtBQUssQ0FBQyxNQUFNLEdBQUcsQ0FBQztJQUMxRSxPQUFPLEtBQUssR0FBRyxJQUFJLEVBQUU7UUFDbkIsMkRBQTJEO1FBQzNELCtEQUErRDtRQUMvRCxzQ0FBc0M7UUFDdEMsSUFBSSxLQUFLLEdBQUcsSUFBSSxHQUFHLEdBQUcsRUFBRTtZQUN0QixNQUFNLENBQUMsR0FBRyxLQUFLLEdBQUcsSUFBSSxHQUFHLENBQUMsQ0FBQztZQUMzQixNQUFNLENBQUMsR0FBRyxDQUFDLEdBQUcsSUFBSSxHQUFHLENBQUMsQ0FBQztZQUN2QixNQUFNLENBQUMsR0FBRyxJQUFJLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDO1lBQ3RCLE1BQU0sQ0FBQyxHQUFHLEdBQUcsR0FBRyxJQUFJLENBQUMsR0FBRyxDQUFD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QUcsV0FBVyxDQUFDLFFBQVEsQ0FBQyxTQUFTLEVBQUUsU0FBUyxHQUFHLENBQUMsQ0FBQyxDQUFDO1FBQ2hFLE1BQU0sV0FBVyxHQUFHLGNBQWMsQ0FBQyxRQUFRLENBQUMsU0FBUyxFQUFFLFNBQVMsR0FBRyxDQUFDLENBQUMsQ0FBQztRQUN0RSxLQUFLLElBQUksQ0FBQyxHQUFHLENBQUMsRUFBRSxDQUFDLEdBQUcsQ0FBQyxFQUFFLENBQUMsRUFBRSxFQUFFO1lBQzFCLFFBQVEsQ0FBQyxDQUFDLENBQUMsR0FBRyxTQUFTLENBQUMsQ0FBQyxDQUFDLENBQUMsS0FBSyxDQUFDO1lBQ2pDLFdBQVcsQ0FBQyxDQUFDLENBQUMsR0FBRyxTQUFTLENBQUMsQ0FBQyxDQUFDLENBQUMsS0FBSyxDQUFDO1NBQ3JDO0tBQ0Y7SUFDRCxpRUFBaUU7SUFDakUsa0JBQWtCO0lBQ2xCLE1BQU0sV0FBVyxHQUFHLE1BQU0sQ0FBQyxLQUFLLEVBQUUsQ0FBQztJQUNuQyxXQUFXLENBQUMsV0FBVyxDQUFDLE1BQU0sR0FBRyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUM7SUFFeEMsT0FBTztRQUNMLE1BQU0sQ0FBQyxXQUEwQixFQUFFLE1BQU0sRUFBRSxXQUFXLENBQUM7UUFDdkQsTUFBTSxDQUFDLFdBQTBCLEVBQUUsT0FBTyxFQUFFLGNBQWMsQ0FBQztLQUM1RCxDQUFDO0FBQ0osQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbIi8qKlxuICogQGxpY2Vuc2VcbiAqIENvcHlyaWdodCAyMDIwIEdvb2dsZSBMTEMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuXG4gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgXCJMaWNlbnNlXCIpO1xuICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLlxuICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0XG4gKlxuICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wXG4gKlxuICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZVxuICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gXCJBUyBJU1wiIEJBU0lTLFxuICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuXG4gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kXG4gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS5cbiAqID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4gKi9cblxuLyoqIEFuIGltcGxlbWVudGF0aW9uIG9mIHRoZSBUb3BLIGtlcm5lbCBzaGFyZWQgYmV0d2VlbiB3ZWJnbCBhbmQgY3B1LiAqL1xuXG5pbXBvcnQge2J1ZmZlciwgTnVtZXJpY0RhdGFUeXBlLCBSYW5rLCBTaGFwZU1hcCwgVGVuc29yLCBUZW5zb3JCdWZmZXIsIFR5cGVkQXJyYXksIHV0aWx9IGZyb20gJ0B0ZW5zb3JmbG93L3RmanMtY29yZSc7XG5cbnR5cGUgUGFpciA9IHtcbiAgdmFsdWU6IG51bWJlcixcbiAgaW5kZXg6IG51bWJlclxufTtcblxuY29uc3QgY29tcGFyZVBhaXIgPSAoYTogUGFpciwgYjogUGFpcikgPT4ge1xuICBjb25zdCB2YWx1ZURpZmYgPSBiLnZhbHVlIC0gYS52YWx1ZTtcbiAgcmV0dXJuIHZhbHVlRGlmZiA9PT0gMCA/IGEuaW5kZXggLSBiLmluZGV4IDogdmFsdWVEaWZmO1xufTtcblxuLyoqXG4gKiBQYXJ0aXRpb25zIGFycmF5IHdoZXJlIGFsbCBlbGVtZW50cyBzbWFsbGVyIHRoYW4gdGhlIChrKzEpIHNtYWxsZXN0IGVsZW1lbnRcbiAqIGFyZSBmb3VuZCB0byB0aGUgbGVmdCBvZiBpdCwgYW5kIGFsbCBsYXJnZXIgdG8gdGhlIHJpZ2h0IG9mIGl0LlxuICogQmFzZWQgb24gdGhlIEZsb3lkLVJpdmVzdCBBbGdvcml0aG0sIHJlZjpcbiAqIGh0dHBzOi8vZW4ud2lraXBlZGlhLm9yZy93aWtpL0Zsb3lkJUUyJTgwJTkzUml2ZXN0X2FsZ29yaXRobVxuICogQHBhcmFtIGFycmF5OiBBcnJheSB0byBwYXJ0aXRpb25cbiAqIEBwYXJhbSBsZWZ0OiBMZWZ0IGluZGV4IGZvciB0aGUgaW50ZXJ2YWxcbiAqIEBwYXJhbSByaWdodDogUmlnaHQgaW5kZXggZm9yIHRoZSBpbnRlcnZhbFxuICogQHBhcmFtIGs6IERlc2lyZWQgaW5kZXggdmFsdWUsIHdoZXJlIGFycmF5W2tdIGlzIHRoZSAoaysxKXRoIHNtYWxsZXN0IGVsZW1lbnRcbiAqICAgICAgICAgICB3aGVuIGxlZnQgPSAwXG4gKi9cbmZ1bmN0aW9uIHNlbGVjdChhcnJheTogUGFpcltdLCBrOiBudW1iZXIsIGxlZnQgPSAwLCByaWdodCA9IGFycmF5Lmxlbmd0aCAtIDEpIHtcbiAgd2hpbGUgKHJpZ2h0ID4gbGVmdCkge1xuICAgIC8vIFVzZSBzZWxlY3QgcmVjdXJzaXZlbHkgdG8gc2FtcGxlIGEgc21hbGxlciBzZXQgb2Ygc2l6ZSBzXG4gICAgLy8gdGhlIGFyYml0cmFyeSBjb25zdGFudHMgNjAwIGFuZCAwLjUgYXJlIHVzZWQgaW4gdGhlIG9yaWdpbmFsXG4gICAgLy8gdmVyc2lvbiB0byBtaW5pbWl6ZSBleGVjdXRpb24gdGltZS5cbiAgICBpZiAocmlnaHQgLSBsZWZ0ID4gNjAwKSB7XG4gICAgICBjb25zdCBuID0gcmlnaHQgLSBsZWZ0ICsgMTtcbiAgICAgIGNvbnN0IGkgPSBrIC0gbGVmdCArIDE7XG4gICAgICBjb25zdCB6ID0gTWF0aC5sb2cobik7XG4gICAgICBjb25zdCBzID0gMC41ICogTWF0aC5leHAoMiAqIHogLyAzKTtcbiAgICAgIGNvbnN0IHNkID0gMC41ICogTWF0aC5zcXJ0KHogKiBzICogKG4gLSBzKSAvIG4pICogTWF0aC5zaWduKGkgLSBuIC8gMik7XG4gICAgICBjb25zdCBuZXdMZWZ0ID0gTWF0aC5tYXgobGVmdCwgTWF0aC5mbG9vcihrIC0gaSAqIHMgLyBuICsgc2QpKTtcbiAgICAgIGNvbnN0IG5ld1JpZ2h0ID0gTWF0aC5taW4ocmlnaHQsIE1hdGguZmxvb3IoayArIChuIC0gaSkgKiBzIC8gbiArIHNkKSk7XG4gICAgICBzZWxlY3QoYXJyYXksIGssIG5ld0xlZnQsIG5ld1JpZ2h0KTtcbiAgICB9XG4gICAgLy8gcGFydGl0aW9uIHRoZSBlbGVtZW50cyBiZXR3ZWVuIGxlZnQgYW5kIHJpZ2h0IGFyb3VuZCB0XG4gICAgY29uc3QgdCA9IGFycmF5W2tdO1xuICAgIGxldCBpID0gbGVmdDtcbiAgICBsZXQgaiA9IHJpZ2h0O1xuXG4gICAgdXRpbC5zd2FwKGFycmF5LCBsZWZ0LCBrKTtcblxuICAgIGlmIChjb21wYXJlUGFpcihhcnJheVtyaWdodF0sIHQpID4gMCkge1xuICAgICAgdXRpbC5zd2FwKGFycmF5LCBsZWZ0LCByaWdodCk7XG4gICAgfVxuICAgIHdoaWxlIChpIDwgaikge1xuICAgICAgdXRpbC5zd2FwKGFycmF5LCBpLCBqKTtcbiAgICAgIGkrKztcbiAgICAgIGotLTtcbiAgICAgIHdoaWxlIChjb21wYXJlUGFpcihhcnJheVtpXSwgdCkgPCAwKSB7XG4gICAgICAgIGkgPSBpICsgMTtcbiAgICAgIH1cbiAgICAgIHdoaWxlIChjb21wYXJlUGFpcihhcnJheVtqXSwgdCkgPiAwKSB7XG4gICAgICAgIGogPSBqIC0gMTtcbiAgICAgIH1cbiAgICB9XG4gICAgaWYgKGNvbXBhcmVQYWlyKGFycmF5W2xlZnRdLCB0KSA9PT0gMCkge1xuICAgICAgdXRpbC5zd2FwKGFycmF5LCBsZWZ0LCBqKTtcbiAgICB9IGVsc2Uge1xuICAgICAgaiA9IGogKyAxO1xuICAgICAgdXRpbC5zd2FwKGFycmF5LCBqLCByaWdodCk7XG4gICAgfVxuICAgIC8vIEFkanVzdCBsZWZ0IGFuZCByaWdodCB0b3dhcmRzIHRoZSBib3VuZGFyaWVzIG9mIHRoZSBzdWJzZXRcbiAgICAvLyBjb250YWluaW5nIHRoZSAoayAtIGxlZnQgKyAxKXRoIHNtYWxsZXN0IGVsZW1lbnQuXG4gICAgaWYgKGogPD0gaykge1xuICAgICAgbGVmdCA9IGogKyAxO1xuICAgIH1cbiAgICBpZiAoayA8PSBqKSB7XG4gICAgICByaWdodCA9IGogLSAxO1xuICAgIH1cbiAgfVxufVxuXG5leHBvcnQgZnVuY3Rpb24gdG9wS0ltcGw8VCBleHRlbmRzIFRlbnNvciwgUiBleHRlbmRzIFJhbms+KFxuICAgIHg6IFR5cGVkQXJyYXksIHhTaGFwZTogbnVtYmVyW10sIHhEdHlwZTogTnVtZXJpY0RhdGFUeXBlLCBrOiBudW1iZXIsXG4gICAgc29ydGVkOiBib29sZWFuKTpcbiAgICBbVGVuc29yQnVmZmVyPFIsIE51bWVyaWNEYXRhVHlwZT4sIFRlbnNvckJ1ZmZlcjxSLCAnaW50MzInPl0ge1xuICAvLyBSZXNoYXBlIGludG8gYSAyZCB0ZW5zb3IgW2JhdGNoLCBsYXN0RGltXSBhbmQgY29tcHV0ZSB0b3BrIGFsb25nIGxhc3REaW0uXG4gIGNvbnN0IGxhc3REaW0gPSB4U2hhcGVbeFNoYXBlLmxlbmd0aCAtIDFdO1xuICBjb25zdCBbYmF0Y2gsIHNpemVdID0gW3gubGVuZ3RoIC8gbGFzdERpbSwgbGFzdERpbV07XG4gIGNvbnN0IGFsbFRvcEtWYWxzID0gdXRpbC5nZXRUeXBlZEFycmF5RnJvbURUeXBlKHhEdHlwZSwgYmF0Y2ggKiBrKTtcbiAgY29uc3QgYWxsVG9wS0luZGljZXMgPSB1dGlsLmdldFR5cGVkQXJyYXlGcm9tRFR5cGUoJ2ludDMyJywgYmF0Y2ggKiBrKTtcblxuICBmb3IgKGxldCBiID0gMDsgYiA8IGJhdGNoOyBiKyspIHtcbiAgICBjb25zdCBvZmZzZXQgPSBiICogc2l6ZTtcbiAgICBjb25zdCB2YWxzID0geC5zdWJhcnJheShvZmZzZXQsIG9mZnNldCArIHNpemUpO1xuXG4gICAgbGV0IHZhbEFuZEluZDogUGFpcltdID0gbmV3IEFycmF5KHZhbHMubGVuZ3RoKTtcbiAgICB2YWxzLmZvckVhY2goXG4gICAgICAgICh2YWx1ZTogbnVtYmVyLCBpbmRleDogbnVtYmVyKSA9PiB2YWxBbmRJbmRbaW5kZXhdID0ge3ZhbHVlLCBpbmRleH0pO1xuXG4gICAgaWYgKGsgPCB2YWxBbmRJbmQubGVuZ3RoKSB7XG4gICAgICBzZWxlY3QodmFsQW5kSW5kLCBrKTtcbiAgICAgIHZhbEFuZEluZCA9IHZhbEFuZEluZC5zbGljZSgwLCBrKTtcbiAgICB9XG5cbiAgICBpZiAoc29ydGVkKSB7XG4gICAgICB2YWxBbmRJbmQuc29ydChjb21wYXJlUGFpcik7XG4gICAgfVxuICAgIFxuICAgIGNvbnN0IG91dE9mZnNldCA9IGIgKiBrO1xuICAgIGNvbnN0IHRvcEtWYWxzID0gYWxsVG9wS1ZhbHMuc3ViYXJyYXkob3V0T2Zmc2V0LCBvdXRPZmZzZXQgKyBrKTtcbiAgICBjb25zdCB0b3BLSW5kaWNlcyA9IGFsbFRvcEtJbmRpY2VzLnN1YmFycmF5KG91dE9mZnNldCwgb3V0T2Zmc2V0ICsgayk7XG4gICAgZm9yIChsZXQgaSA9IDA7IGkgPCBrOyBpKyspIHtcbiAgICAgIHRvcEtWYWxzW2ldID0gdmFsQW5kSW5kW2ldLnZhbHVlO1xuICAgICAgdG9wS0luZGljZXNbaV0gPSB2YWxBbmRJbmRbaV0uaW5kZXg7XG4gICAgfVxuICB9XG4gIC8vIFJlc2hhcGUgYmFjayB0byB0aGUgb3JpZ2luYWwgaW5wdXQgc2hhcGUsIGV4Y2VwdCB0aGF0IHRoZSBsYXN0XG4gIC8vIGRpbWVuc2lvbiBpcyBrLlxuICBjb25zdCBvdXRwdXRTaGFwZSA9IHhTaGFwZS5zbGljZSgpO1xuICBvdXRwdXRTaGFwZVtvdXRwdXRTaGFwZS5sZW5ndGggLSAxXSA9IGs7XG5cbiAgcmV0dXJuIFtcbiAgICBidWZmZXIob3V0cHV0U2hhcGUgYXMgU2hhcGVNYXBbUl0sIHhEdHlwZSwgYWxsVG9wS1ZhbHMpLFxuICAgIGJ1ZmZlcihvdXRwdXRTaGFwZSBhcyBTaGFwZU1hcFtSXSwgJ2ludDMyJywgYWxsVG9wS0luZGljZXMpXG4gIF07XG59XG4iXX0=","/**\n * @license\n * Copyright 2020 Google LLC. All Rights Reserved.\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n * =============================================================================\n */\nimport { TopK } from '@tensorflow/tfjs-core';\nimport { assertNotComplex } from '../cpu_util';\nimport { topKImpl } from './TopK_impl';\nexport function topK(args) {\n const { inputs, backend, attrs } = args;\n const { x } = inputs;\n const { k, sorted } = attrs;\n assertNotComplex(x, 'topk');\n const xVals = backend.data.get(x.dataId).values;\n const [allTopKVals, allTopKIndices] = topKImpl(xVals, x.shape, x.dtype, k, sorted);\n return [\n backend.makeTensorInfo(allTopKVals.shape, allTopKVals.dtype, allTopKVals.values),\n backend.makeTensorInfo(allTopKIndices.shape, allTopKIndices.dtype, allTopKIndices.values)\n ];\n}\nexport const topKConfig = {\n kernelName: TopK,\n backendName: 'cpu',\n kernelFunc: topK\n};\n//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiVG9wSy5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uLy4uL3RmanMtYmFja2VuZC1jcHUvc3JjL2tlcm5lbHMvVG9wSy50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQTs7Ozs7Ozs7Ozs7Ozs7O0dBZUc7QUFFSCxPQUFPLEVBQXdELElBQUksRUFBb0MsTUFBTSx1QkFBdUIsQ0FBQztBQUdySSxPQUFPLEVBQUMsZ0JBQWdCLEVBQUMsTUFBTSxhQUFhLENBQUM7QUFDN0MsT0FBTyxFQUFDLFFBQVEsRUFBQyxNQUFNLGFBQWEsQ0FBQztBQUVyQyxNQUFNLFVBQVUsSUFBSSxDQUNoQixJQUFxRTtJQUV2RSxNQUFNLEVBQUMsTUFBTSxFQUFFLE9BQU8sRUFBRSxLQUFLLEVBQUMsR0FBRyxJQUFJLENBQUM7SUFDdEMsTUFBTSxFQUFDLENBQUMsRUFBQyxHQUFHLE1BQU0sQ0FBQztJQUNuQixNQUFNLEVBQUMsQ0FBQyxFQUFFLE1BQU0sRUFBQyxHQUFHLEtBQUssQ0FBQztJQUUxQixnQkFBZ0IsQ0FBQyxDQUFDLEVBQUUsTUFBTSxDQUFDLENBQUM7SUFFNUIsTUFBTSxLQUFLLEdBQUcsT0FBTyxDQUFDLElBQUksQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLE1BQU0sQ0FBQyxDQUFDLE1BQW9CLENBQUM7SUFDOUQsTUFBTSxDQUFDLFdBQVcsRUFBRSxjQUFjLENBQUMsR0FDL0IsUUFBUSxDQUFDLEtBQUssRUFBRSxDQUFDLENBQUMsS0FBSyxFQUFFLENBQUMsQ0FBQyxLQUF3QixFQUFFLENBQUMsRUFBRSxNQUFNLENBQUMsQ0FBQztJQUVwRSxPQUFPO1FBQ0wsT0FBTyxDQUFDLGNBQWMsQ0FDbEIsV0FBVyxDQUFDLEtBQUssRUFBRSxXQUFXLENBQUMsS0FBSyxFQUFFLFdBQVcsQ0FBQyxNQUFNLENBQUM7UUFDN0QsT0FBTyxDQUFDLGNBQWMsQ0FDbEIsY0FBYyxDQUFDLEtBQUssRUFBRSxjQUFjLENBQUMsS0FBSyxFQUFFLGNBQWMsQ0FBQyxNQUFNLENBQUM7S0FDdkUsQ0FBQztBQUNKLENBQUM7QUFFRCxNQUFNLENBQUMsTUFBTSxVQUFVLEdBQWlCO0lBQ3RDLFVBQVUsRUFBRSxJQUFJO0lBQ2hCLFdBQVcsRUFBRSxLQUFLO0lBQ2xCLFVBQVUsRUFBRSxJQUF3QjtDQUNyQyxDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiLyoqXG4gKiBAbGljZW5zZVxuICogQ29weXJpZ2h0IDIwMjAgR29vZ2xlIExMQy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC5cbiAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSBcIkxpY2Vuc2VcIik7XG4gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuXG4gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXRcbiAqXG4gKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjBcbiAqXG4gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlXG4gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiBcIkFTIElTXCIgQkFTSVMsXG4gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC5cbiAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmRcbiAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLlxuICogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbiAqL1xuXG5pbXBvcnQge0tlcm5lbENvbmZpZywgS2VybmVsRnVuYywgTnVtZXJpY0RhdGFUeXBlLCBUZW5zb3JJbmZvLCBUb3BLLCBUb3BLQXR0cnMsIFRvcEtJbnB1dHMsIFR5cGVkQXJyYXl9IGZyb20gJ0B0ZW5zb3JmbG93L3RmanMtY29yZSc7XG5cbmltcG9ydCB7TWF0aEJhY2tlbmRDUFV9IGZyb20gJy4uL2JhY2tlbmRfY3B1JztcbmltcG9ydCB7YXNzZXJ0Tm90Q29tcGxleH0gZnJvbSAnLi4vY3B1X3V0aWwnO1xuaW1wb3J0IHt0b3BLSW1wbH0gZnJvbSAnLi9Ub3BLX2ltcGwnO1xuXG5leHBvcnQgZnVuY3Rpb24gdG9wSyhcbiAgICBhcmdzOiB7aW5wdXRzOiBUb3BLSW5wdXRzLCBiYWNrZW5kOiBNYXRoQmFja2VuZENQVSwgYXR0cnM6IFRvcEtBdHRyc30pOlxuICAgIFtUZW5zb3JJbmZvLCBUZW5zb3JJbmZvXSB7XG4gIGNvbnN0IHtpbnB1dHMsIGJhY2tlbmQsIGF0dHJzfSA9IGFyZ3M7XG4gIGNvbnN0IHt4fSA9IGlucHV0cztcbiAgY29uc3Qge2ssIHNvcnRlZH0gPSBhdHRycztcblxuICBhc3NlcnROb3RDb21wbGV4KHgsICd0b3BrJyk7XG5cbiAgY29uc3QgeFZhbHMgPSBiYWNrZW5kLmRhdGEuZ2V0KHguZGF0YUlkKS52YWx1ZXMgYXMgVHlwZWRBcnJheTtcbiAgY29uc3QgW2FsbFRvcEtWYWxzLCBhbGxUb3BLSW5kaWNlc10gPVxuICAgICAgdG9wS0ltcGwoeFZhbHMsIHguc2hhcGUsIHguZHR5cGUgYXMgTnVtZXJpY0RhdGFUeXBlLCBrLCBzb3J0ZWQpO1xuXG4gIHJldHVybiBbXG4gICAgYmFja2VuZC5tYWtlVGVuc29ySW5mbyhcbiAgICAgICAgYWxsVG9wS1ZhbHMuc2hhcGUsIGFsbFRvcEtWYWxzLmR0eXBlLCBhbGxUb3BLVmFscy52YWx1ZXMpLFxuICAgIGJhY2tlbmQubWFrZVRlbnNvckluZm8oXG4gICAgICAgIGFsbFRvcEtJbmRpY2VzLnNoYXBlLCBhbGxUb3BLSW5kaWNlcy5kdHlwZSwgYWxsVG9wS0luZGljZXMudmFsdWVzKVxuICBdO1xufVxuXG5leHBvcnQgY29uc3QgdG9wS0NvbmZpZzogS2VybmVsQ29uZmlnID0ge1xuICBrZXJuZWxOYW1lOiBUb3BLLFxuICBiYWNrZW5kTmFtZTogJ2NwdScsXG4gIGtlcm5lbEZ1bmM6IHRvcEsgYXMge30gYXMgS2VybmVsRnVuY1xufTtcbiJdfQ==","/**\n * @license\n * Copyright 2021 Google LLC. All Rights Reserved.\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n * =============================================================================\n */\nimport { Transform, util } from '@tensorflow/tfjs-core';\nexport function transform(args) {\n const { inputs, attrs, backend } = args;\n const { image, transforms } = inputs;\n const { interpolation, fillMode, fillValue, outputShape } = attrs;\n const [batch, imageHeight, imageWidth, numChannels] = image.shape;\n const [outHeight, outWidth] = outputShape != null ? outputShape : [imageHeight, imageWidth];\n const outShape = [batch, outHeight, outWidth, numChannels];\n const inStrides = util.computeStrides(image.shape);\n const batchInStride = inStrides[0];\n const rowInStride = inStrides[1];\n const colInStride = inStrides[2];\n const outStrides = util.computeStrides(outShape);\n const batchOutStride = outStrides[0];\n const rowOutStride = outStrides[1];\n const colOutStride = outStrides[2];\n const outVals = util.getTypedArrayFromDType(image.dtype, util.sizeFromShape(outShape));\n outVals.fill(fillValue);\n const imageVals = backend.data.get(image.dataId).values;\n const transformVals = backend.data.get(transforms.dataId).values;\n // Ref TF implementation:\n // https://github.com/tensorflow/tensorflow/blob/master/tensorflow/core/kernels/image/image_ops.h\n for (let b = 0; b < batch; ++b) {\n const transform = transforms.shape[0] === 1 ?\n transformVals :\n transformVals.subarray(b * 8, b * 8 + 8);\n for (let outY = 0; outY < outHeight; ++outY) {\n for (let outX = 0; outX < outWidth; ++outX) {\n for (let channel = 0; channel < numChannels; ++channel) {\n let val;\n const projection = transform[6] * outX + transform[7] * outY + 1;\n if (projection === 0) {\n // Return the fill value for infinite coordinates,\n // which are outside the input image\n continue;\n }\n const inX = (transform[0] * outX + transform[1] * outY + transform[2]) /\n projection;\n const inY = (transform[3] * outX + transform[4] * outY + transform[5]) /\n projection;\n const x = mapCoord(inX, imageWidth, fillMode);\n const y = mapCoord(inY, imageHeight, fillMode);\n switch (interpolation) {\n case 'nearest':\n val = nearestInterpolation(imageVals, imageHeight, imageWidth, batchInStride, rowInStride, colInStride, b, y, x, channel, fillValue);\n break;\n case 'bilinear':\n val = bilinearInterpolation(imageVals, imageHeight, imageWidth, batchInStride, rowInStride, colInStride, b, y, x, channel, fillValue);\n break;\n default:\n throw new Error(`Error in Transform: Expect 'nearest' or ` +\n `'bilinear', but got ${interpolation}`);\n }\n const ind = b * batchOutStride + outY * rowOutStride +\n outX * colOutStride + channel;\n outVals[ind] = val;\n }\n }\n }\n return backend.makeTensorInfo(outShape, image.dtype, outVals);\n }\n const dataId = backend.write(outVals, outShape, image.dtype);\n return { dataId, shape: image.shape, dtype: image.dtype };\n}\nexport const transformConfig = {\n kernelName: Transform,\n backendName: 'cpu',\n kernelFunc: transform\n};\nfunction mapCoord(outCoord, len, mode) {\n switch (mode) {\n case 'reflect':\n return mapCoordReflect(outCoord, len);\n case 'wrap':\n return mapCoordWrap(outCoord, len);\n case 'nearest':\n return mapCoordNearest(outCoord, len);\n case 'constant':\n default:\n return mapCoordConstant(outCoord, len);\n }\n}\nfunction mapCoordReflect(outCoord, len) {\n // Reflect [abcd] to [dcba|abcd|dcba].\n let inCoord = outCoord;\n if (inCoord < 0) {\n if (len <= 1) {\n inCoord = 0;\n }\n else {\n const sz2 = 2 * len;\n if (inCoord < sz2) {\n inCoord = sz2 * Math.trunc(-inCoord / sz2) + inCoord;\n }\n inCoord = inCoord < -len ? inCoord + sz2 : -inCoord - 1;\n }\n }\n else if (inCoord > len - 1) {\n if (len <= 1) {\n inCoord = 0;\n }\n else {\n const sz2 = 2 * len;\n inCoord -= sz2 * Math.trunc(inCoord / sz2);\n if (inCoord >= len) {\n inCoord = sz2 - inCoord - 1;\n }\n }\n }\n // clamp is necessary because when outCoord = 3.5 and len = 4,\n // inCoord = 3.5 and will be rounded to 4 in nearest interpolation.\n return util.clamp(0, inCoord, len - 1);\n}\nfunction mapCoordWrap(outCoord, len) {\n // Wrap [abcd] to [abcd|abcd|abcd].\n let inCoord = outCoord;\n if (inCoord < 0) {\n if (len <= 1) {\n inCoord = 0;\n }\n else {\n const sz = len - 1;\n inCoord += len * (Math.trunc(-inCoord / sz) + 1);\n }\n }\n else if (inCoord > len - 1) {\n if (len <= 1) {\n inCoord = 0;\n }\n else {\n const sz = len - 1;\n inCoord -= len * Math.trunc(inCoord / sz);\n }\n }\n // clamp is necessary because when outCoord = -0.5 and len = 4,\n // inCoord = 3.5 and will be rounded to 4 in nearest interpolation.\n return util.clamp(0, inCoord, len - 1);\n}\nfunction mapCoordConstant(outCoord, len) {\n return outCoord;\n}\nfunction mapCoordNearest(outCoord, len) {\n return util.clamp(0, outCoord, len - 1);\n}\nfunction readWithFillValue(imageVals, imageHeight, imageWidth, batchStride, rowStride, colStride, batch, y, x, channel, fillValue) {\n const ind = batch * batchStride + y * rowStride + x * colStride + channel;\n if (0 <= y && y < imageHeight && 0 <= x && x < imageWidth) {\n return imageVals[ind];\n }\n else {\n return fillValue;\n }\n}\nfunction nearestInterpolation(imageVals, imageHeight, imageWidth, batchStride, rowStride, colStride, batch, y, x, channel, fillValue) {\n const $y = Math.round(y);\n const $x = Math.round(x);\n return readWithFillValue(imageVals, imageHeight, imageWidth, batchStride, rowStride, colStride, batch, $y, $x, channel, fillValue);\n}\nfunction bilinearInterpolation(imageVals, imageHeight, imageWidth, batchStride, rowStride, colStride, batch, y, x, channel, fillValue) {\n const yFloor = Math.floor(y);\n const xFloor = Math.floor(x);\n const yCeil = yFloor + 1;\n const xCeil = xFloor + 1;\n // f(x, yFloor) = (xCeil - x) / (xCeil - xFloor) * f(xFloor, yFloor)\n // + (x - xFloor) / (xCeil - xFloor) * f(xCeil, yFloor)\n const valueYFloor = (xCeil - x) *\n readWithFillValue(imageVals, imageHeight, imageWidth, batchStride, rowStride, colStride, batch, yFloor, xFloor, channel, fillValue) +\n (x - xFloor) *\n readWithFillValue(imageVals, imageHeight, imageWidth, batchStride, rowStride, colStride, batch, yFloor, xCeil, channel, fillValue);\n // f(x, yCeil) = (xCeil - x) / (xCeil - xFloor) * f(xFloor, yCeil)\n // + (x - xFloor) / (xCeil - xFloor) * f(xCeil, yCeil)\n const valueYCeil = (xCeil - x) *\n readWithFillValue(imageVals, imageHeight, imageWidth, batchStride, rowStride, colStride, batch, yCeil, xFloor, channel, fillValue) +\n (x - xFloor) *\n readWithFillValue(imageVals, imageHeight, imageWidth, batchStride, rowStride, colStride, batch, yCeil, xCeil, channel, fillValue);\n // f(x, y) = (yCeil - y) / (yCeil - yFloor) * f(x, yFloor)\n // + (y - yFloor) / (yCeil - yFloor) * f(x, yCeil)\n return (yCeil - y) * valueYFloor + (y - yFloor) * valueYCeil;\n}\n//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiVHJhbnNmb3JtLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vLi4vdGZqcy1iYWNrZW5kLWNwdS9zcmMva2VybmVscy9UcmFuc2Zvcm0udHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUE7Ozs7Ozs7Ozs7Ozs7OztHQWVHO0FBRUgsT0FBTyxFQUF3RCxTQUFTLEVBQStDLElBQUksRUFBQyxNQUFNLHVCQUF1QixDQUFDO0FBSTFKLE1BQU0sVUFBVSxTQUFTLENBQUMsSUFJekI7SUFDQyxNQUFNLEVBQUMsTUFBTSxFQUFFLEtBQUssRUFBRSxPQUFPLEVBQUMsR0FBRyxJQUFJLENBQUM7SUFDdEMsTUFBTSxFQUFDLEtBQUssRUFBRSxVQUFVLEVBQUMsR0FBRyxNQUFNLENBQUM7SUFDbkMsTUFBTSxFQUFDLGFBQWEsRUFBRSxRQUFRLEVBQUUsU0FBUyxFQUFFLFdBQVcsRUFBQyxHQUFHLEtBQUssQ0FBQztJQUVoRSxNQUFNLENBQUMsS0FBSyxFQUFFLFdBQVcsRUFBRSxVQUFVLEVBQUUsV0FBVyxDQUFDLEdBQUcsS0FBSyxDQUFDLEtBQUssQ0FBQztJQUNsRSxNQUFNLENBQUMsU0FBUyxFQUFFLFFBQVEsQ0FBQyxHQUN2QixXQUFXLElBQUksSUFBSSxDQUFDLENBQUMsQ0FBQyxXQUFXLENBQUMsQ0FBQyxDQUFDLENBQUMsV0FBVyxFQUFFLFVBQVUsQ0FBQyxDQUFDO0lBQ2xFLE1BQU0sUUFBUSxHQUFHLENBQUMsS0FBSyxFQUFFLFNBQVMsRUFBRSxRQUFRLEVBQUUsV0FBVyxDQUFDLENBQUM7SUFFM0QsTUFBTSxTQUFTLEdBQUcsSUFBSSxDQUFDLGNBQWMsQ0FBQyxLQUFLLENBQUMsS0FBSyxDQUFDLENBQUM7SUFDbkQsTUFBTSxhQUFhLEdBQUcsU0FBUyxDQUFDLENBQUMsQ0FBQyxDQUFDO0lBQ25DLE1BQU0sV0FBVyxHQUFHLFNBQVMsQ0FBQyxDQUFDLENBQUMsQ0FBQztJQUNqQyxNQUFNLFdBQVcsR0FBRyxTQUFTLENB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RSxTQUFTLEVBQzFELFNBQVMsRUFBRSxLQUFLLEVBQUUsS0FBSyxFQUFFLE1BQU0sRUFBRSxPQUFPLEVBQUUsU0FBUyxDQUFDO1FBQzVELENBQUMsQ0FBQyxHQUFHLE1BQU0sQ0FBQztZQUNSLGlCQUFpQixDQUNiLFNBQVMsRUFBRSxXQUFXLEVBQUUsVUFBVSxFQUFFLFdBQVcsRUFBRSxTQUFTLEVBQzFELFNBQVMsRUFBRSxLQUFLLEVBQUUsS0FBSyxFQUFFLEtBQUssRUFBRSxPQUFPLEVBQUUsU0FBUyxDQUFDLENBQUM7SUFDaEUsMERBQTBEO0lBQzFELDBEQUEwRDtJQUMxRCxPQUFPLENBQUMsS0FBSyxHQUFHLENBQUMsQ0FBQyxHQUFHLFdBQVcsR0FBRyxDQUFDLENBQUMsR0FBRyxNQUFNLENBQUMsR0FBRyxVQUFVLENBQUM7QUFDL0QsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbIi8qKlxuICogQGxpY2Vuc2VcbiAqIENvcHlyaWdodCAyMDIxIEdvb2dsZSBMTEMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuXG4gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgXCJMaWNlbnNlXCIpO1xuICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLlxuICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0XG4gKlxuICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wXG4gKlxuICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZVxuICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gXCJBUyBJU1wiIEJBU0lTLFxuICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuXG4gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kXG4gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS5cbiAqID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4gKi9cblxuaW1wb3J0IHtLZXJuZWxDb25maWcsIEtlcm5lbEZ1bmMsIE51bWVyaWNEYXRhVHlwZSwgVGVuc29ySW5mbywgVHJhbnNmb3JtLCBUcmFuc2Zvcm1BdHRycywgVHJhbnNmb3JtSW5wdXRzLCBUeXBlZEFycmF5LCB1dGlsfSBmcm9tICdAdGVuc29yZmxvdy90ZmpzLWNvcmUnO1xuXG5pbXBvcnQge01hdGhCYWNrZW5kQ1BVfSBmcm9tICcuLi9iYWNrZW5kX2NwdSc7XG5cbmV4cG9ydCBmdW5jdGlvbiB0cmFuc2Zvcm0oYXJnczoge1xuICBpbnB1dHM6IFRyYW5zZm9ybUlucHV0cyxcbiAgYXR0cnM6IFRyYW5zZm9ybUF0dHJzLFxuICBiYWNrZW5kOiBNYXRoQmFja2VuZENQVVxufSk6IFRlbnNvckluZm8ge1xuICBjb25zdCB7aW5wdXRzLCBhdHRycywgYmFja2VuZH0gPSBhcmdzO1xuICBjb25zdCB7aW1hZ2UsIHRyYW5zZm9ybXN9ID0gaW5wdXRzO1xuICBjb25zdCB7aW50ZXJwb2xhdGlvbiwgZmlsbE1vZGUsIGZpbGxWYWx1ZSwgb3V0cHV0U2hhcGV9ID0gYXR0cnM7XG5cbiAgY29uc3QgW2JhdGNoLCBpbWFnZUhlaWdodCwgaW1hZ2VXaWR0aCwgbnVtQ2hhbm5lbHNdID0gaW1hZ2Uuc2hhcGU7XG4gIGNvbnN0IFtvdXRIZWlnaHQsIG91dFdpZHRoXSA9XG4gICAgICBvdXRwdXRTaGFwZSAhPSBudWxsID8gb3V0cHV0U2hhcGUgOiBbaW1hZ2VIZWlnaHQsIGltYWdlV2lkdGhdO1xuICBjb25zdCBvdXRTaGFwZSA9IFtiYXRjaCwgb3V0SGVpZ2h0LCBvdXRXaWR0aCwgbnVtQ2hhbm5lbHNdO1xuXG4gIGNvbnN0IGluU3RyaWRlcyA9IHV0aWwuY29tcHV0ZVN0cmlkZXMoaW1hZ2Uuc2hhcGUpO1xuICBjb25zdCBiYXRjaEluU3RyaWRlID0gaW5TdHJpZGVzWzBdO1xuICBjb25zdCByb3dJblN0cmlkZSA9IGluU3RyaWRlc1sxXTtcbiAgY29uc3QgY29sSW5TdHJpZGUgPSBpblN0cmlkZXNbMl07XG5cbiAgY29uc3Qgb3V0U3RyaWRlcyA9IHV0aWwuY29tcHV0ZVN0cmlkZXMob3V0U2hhcGUpO1xuICBjb25zdCBiYXRjaE91dFN0cmlkZSA9IG91dFN0cmlkZXNbMF07XG4gIGNvbnN0IHJvd091dFN0cmlkZSA9IG91dFN0cmlkZXNbMV07XG4gIGNvbnN0IGNvbE91dFN0cmlkZSA9IG91dFN0cmlkZXNbMl07XG5cbiAgY29uc3Qgb3V0VmFscyA9IHV0aWwuZ2V0VHlwZWRBcnJheUZyb21EVHlwZShcbiAgICAgIGltYWdlLmR0eXBlIGFzIE51bWVyaWNEYXRhVHlwZSwgdXRpbC5zaXplRnJvbVNoYXBlKG91dFNoYXBlKSk7XG5cbiAgb3V0VmFscy5maWxsKGZpbGxWYWx1ZSk7XG5cbiAgY29uc3QgaW1hZ2VWYWxzID0gYmFja2VuZC5kYXRhLmdldChpbWFnZS5kYXRhSWQpLnZhbHVlcyBhcyBUeXBlZEFycmF5O1xuICBjb25zdCB0cmFuc2Zvcm1WYWxzID1cbiAgICAgIGJhY2tlbmQuZGF0YS5nZXQodHJhbnNmb3Jtcy5kYXRhSWQpLnZhbHVlcyBhcyBUeXBlZEFycmF5O1xuXG4gIC8vIFJlZiBURiBpbXBsZW1lbnRhdGlvbjpcbiAgLy8gaHR0cHM6Ly9naXRodWIuY29tL3RlbnNvcmZsb3cvdGVuc29yZmxvdy9ibG9iL21hc3Rlci90ZW5zb3JmbG93L2NvcmUva2VybmVscy9pbWFnZS9pbWFnZV9vcHMuaFxuICBmb3IgKGxldCBiID0gMDsgYiA8IGJhdGNoOyArK2IpIHtcbiAgICBjb25zdCB0cmFuc2Zvcm0gPSB0cmFuc2Zvcm1zLnNoYXBlWzBdID09PSAxID9cbiAgICAgICAgdHJhbnNmb3JtVmFscyA6XG4gICAgICAgIHRyYW5zZm9ybVZhbHMuc3ViYXJyYXkoYiAqIDgsIGIgKiA4ICsgOCk7XG5cbiAgICBmb3IgKGxldCBvdXRZID0gMDsgb3V0WSA8IG91dEhlaWdodDsgKytvdXRZKSB7XG4gICAgICBmb3IgKGxldCBvdXRYID0gMDsgb3V0WCA8IG91dFdpZHRoOyArK291dFgpIHtcbiAgICAgICAgZm9yIChsZXQgY2hhbm5lbCA9IDA7IGNoYW5uZWwgPCBudW1DaGFubmVsczsgKytjaGFubmVsKSB7XG4gICAgICAgICAgbGV0IHZhbDtcblxuICAgICAgICAgIGNvbnN0IHByb2plY3Rpb24gPSB0cmFuc2Zvcm1bNl0gKiBvdXRYICsgdHJhbnNmb3JtWzddICogb3V0WSArIDE7XG5cbiAgICAgICAgICBpZiAocHJvamVjdGlvbiA9PT0gMCkge1xuICAgICAgICAgICAgLy8gUmV0dXJuIHRoZSBmaWxsIHZhbHVlIGZvciBpbmZpbml0ZSBjb29yZGluYXRlcyxcbiAgICAgICAgICAgIC8vIHdoaWNoIGFyZSBvdXRzaWRlIHRoZSBpbnB1dCBpbWFnZVxuICAgICAgICAgICAgY29udGludWU7XG4gICAgICAgICAgfVxuXG4gICAgICAgICAgY29uc3QgaW5YID1cbiAgICAgICAgICAgICAgKHRyYW5zZm9ybVswXSAqIG91dFggKyB0cmFuc2Zvcm1bMV0gKiBvdXRZICsgdHJhbnNmb3JtWzJdKSAvXG4gICAgICAgICAgICAgIHByb2plY3Rpb247XG4gICAgICAgICAgY29uc3QgaW5ZID1cbiAgICAgICAgICAgICAgKHRyYW5zZm9ybVszXSAqIG91dFggKyB0cmFuc2Zvcm1bNF0gKiBvdXRZICsgdHJhbnNmb3JtWzVdKSAvXG4gICAgICAgICAgICAgIHByb2plY3Rpb247XG5cbiAgICAgICAgICBjb25zdCB4ID0gbWFwQ29vcmQoaW5YLCBpbWFnZVdpZHRoLCBmaWxsTW9kZSk7XG4gICAgICAgICAgY29uc3QgeSA9IG1hcENvb3JkKGluWSwgaW1hZ2VIZWlnaHQsIGZpbGxNb2RlKTtcblxuICAgICAgICAgIHN3aXRjaCAoaW50ZXJwb2xhdGlvbikge1xuICAgICAgICAgICAgY2FzZSAnbmVhcmVzdCc6XG4gICAgICAgICAgICAgIHZhbCA9IG5lYXJlc3RJbnRlcnBvbGF0aW9uKFxuICAgICAgICAgICAgICAgICAgaW1hZ2VWYWxzLCBpbWFnZUhlaWdodCwgaW1hZ2VXaWR0aCwgYmF0Y2hJblN0cmlkZSxcbiAgICAgICAgICAgICAgICAgIHJvd0luU3RyaWRlLCBjb2xJblN0cmlkZSwgYiwgeSwgeCwgY2hhbm5lbCwgZmlsbFZhbHVlKTtcbiAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICBjYXNlICdiaWxpbmVhcic6XG4gICAgICAgICAgICAgIHZhbCA9IGJpbGluZWFySW50ZXJwb2xhdGlvbihcbiAgICAgICAgICAgICAgICAgIGltYWdlVmFscywgaW1hZ2VIZWlnaHQsIGltYWdlV2lkdGgsIGJhdGNoSW5TdHJpZGUsXG4gICAgICAgICAgICAgICAgICByb3dJblN0cmlkZSwgY29sSW5TdHJpZGUsIGIsIHksIHgsIGNoYW5uZWwsIGZpbGxWYWx1ZSk7XG4gICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgZGVmYXVsdDpcbiAgICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKFxuICAgICAgICAgICAgICAgICAgYEVycm9yIGluIFRyYW5zZm9ybTogRXhwZWN0ICduZWFyZXN0JyBvciBgICtcbiAgICAgICAgICAgICAgICAgIGAnYmlsaW5lYXInLCBidXQgZ290ICR7aW50ZXJwb2xhdGlvbn1gKTtcbiAgICAgICAgICB9XG5cbiAgICAgICAgICBjb25zdCBpbmQgPVxuICAgICAgICAgICAgICBiICogYmF0Y2hPdXRTdHJpZGUgKyBvdXRZICogcm93T3V0U3RyaWRlICtcbiAgICAgICAgICAgICAgb3V0WCAqIGNvbE91dFN0cmlkZSArIGNoYW5uZWw7XG5cbiAgICAgICAgICBvdXRWYWxzW2luZF0gPSB2YWw7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9XG5cbiAgICByZXR1cm4gYmFja2VuZC5tYWtlVGVuc29ySW5mbyhvdXRTaGFwZSwgaW1hZ2UuZHR5cGUsIG91dFZhbHMpO1xuICB9XG5cbiAgY29uc3QgZGF0YUlkID0gYmFja2VuZC53cml0ZShvdXRWYWxzLCBvdXRTaGFwZSwgaW1hZ2UuZHR5cGUpO1xuICByZXR1cm4ge2RhdGFJZCwgc2hhcGU6IGltYWdlLnNoYXBlLCBkdHlwZTogaW1hZ2UuZHR5cGV9O1xufVxuXG5leHBvcnQgY29uc3QgdHJhbnNmb3JtQ29uZmlnOiBLZXJuZWxDb25maWcgPSB7XG4gIGtlcm5lbE5hbWU6IFRyYW5zZm9ybSxcbiAgYmFja2VuZE5hbWU6ICdjcHUnLFxuICBrZXJuZWxGdW5jOiB0cmFuc2Zvcm0gYXMge30gYXMgS2VybmVsRnVuY1xufTtcblxuZnVuY3Rpb24gbWFwQ29vcmQoXG4gICAgb3V0Q29vcmQ6IG51bWJlciwgbGVuOiBudW1iZXIsXG4gICAgbW9kZTogJ2NvbnN0YW50J3wncmVmbGVjdCd8J3dyYXAnfCduZWFyZXN0Jykge1xuICBzd2l0Y2ggKG1vZGUpIHtcbiAgICBjYXNlICdyZWZsZWN0JzpcbiAgICAgIHJldHVybiBtYXBDb29yZFJlZmxlY3Qob3V0Q29vcmQsIGxlbik7XG4gICAgY2FzZSAnd3JhcCc6XG4gICAgICByZXR1cm4gbWFwQ29vcmRXcmFwKG91dENvb3JkLCBsZW4pO1xuICAgIGNhc2UgJ25lYXJlc3QnOlxuICAgICAgcmV0dXJuIG1hcENvb3JkTmVhcmVzdChvdXRDb29yZCwgbGVuKTtcbiAgICBjYXNlICdjb25zdGFudCc6XG4gICAgZGVmYXVsdDpcbiAgICAgIHJldHVybiBtYXBDb29yZENvbnN0YW50KG91dENvb3JkLCBsZW4pO1xuICB9XG59XG5cbmZ1bmN0aW9uIG1hcENvb3JkUmVmbGVjdChvdXRDb29yZDogbnVtYmVyLCBsZW46IG51bWJlcik6IG51bWJlciB7XG4gIC8vIFJlZmxlY3QgW2FiY2RdIHRvIFtkY2JhfGFiY2R8ZGNiYV0uXG4gIGxldCBpbkNvb3JkID0gb3V0Q29vcmQ7XG4gIGlmIChpbkNvb3JkIDwgMCkge1xuICAgIGlmIChsZW4gPD0gMSkge1xuICAgICAgaW5Db29yZCA9IDA7XG4gICAgfSBlbHNlIHtcbiAgICAgIGNvbnN0IHN6MiA9IDIgKiBsZW47XG4gICAgICBpZiAoaW5Db29yZCA8IHN6Mikge1xuICAgICAgICBpbkNvb3JkID0gc3oyICogTWF0aC50cnVuYygtaW5Db29yZCAvIHN6MikgKyBpbkNvb3JkO1xuICAgICAgfVxuICAgICAgaW5Db29yZCA9IGluQ29vcmQgPCAtbGVuID8gaW5Db29yZCArIHN6MiA6IC1pbkNvb3JkIC0gMTtcbiAgICB9XG4gIH0gZWxzZSBpZiAoaW5Db29yZCA+IGxlbiAtIDEpIHtcbiAgICBpZiAobGVuIDw9IDEpIHtcbiAgICAgIGluQ29vcmQgPSAwO1xuICAgIH0gZWxzZSB7XG4gICAgICBjb25zdCBzejIgPSAyICogbGVuO1xuICAgICAgaW5Db29yZCAtPSBzejIgKiBNYXRoLnRydW5jKGluQ29vcmQgLyBzejIpO1xuICAgICAgaWYgKGluQ29vcmQgPj0gbGVuKSB7XG4gICAgICAgIGluQ29vcmQgPSBzejIgLSBpbkNvb3JkIC0gMTtcbiAgICAgIH1cbiAgICB9XG4gIH1cbiAgLy8gY2xhbXAgaXMgbmVjZXNzYXJ5IGJlY2F1c2Ugd2hlbiBvdXRDb29yZCA9IDMuNSBhbmQgbGVuID0gNCxcbiAgLy8gaW5Db29yZCA9IDMuNSBhbmQgd2lsbCBiZSByb3VuZGVkIHRvIDQgaW4gbmVhcmVzdCBpbnRlcnBvbGF0aW9uLlxuICByZXR1cm4gdXRpbC5jbGFtcCgwLCBpbkNvb3JkLCBsZW4gLSAxKTtcbn1cblxuZnVuY3Rpb24gbWFwQ29vcmRXcmFwKG91dENvb3JkOiBudW1iZXIsIGxlbjogbnVtYmVyKTogbnVtYmVyIHtcbiAgLy8gV3JhcCBbYWJjZF0gdG8gW2FiY2R8YWJjZHxhYmNkXS5cbiAgbGV0IGluQ29vcmQgPSBvdXRDb29yZDtcbiAgaWYgKGluQ29vcmQgPCAwKSB7XG4gICAgaWYgKGxlbiA8PSAxKSB7XG4gICAgICBpbkNvb3JkID0gMDtcbiAgICB9IGVsc2Uge1xuICAgICAgY29uc3Qgc3ogPSBsZW4gLSAxO1xuICAgICAgaW5Db29yZCArPSBsZW4gKiAoTWF0aC50cnVuYygtaW5Db29yZCAvIHN6KSArIDEpO1xuICAgIH1cbiAgfSBlbHNlIGlmIChpbkNvb3JkID4gbGVuIC0gMSkge1xuICAgIGlmIChsZW4gPD0gMSkge1xuICAgICAgaW5Db29yZCA9IDA7XG4gICAgfSBlbHNlIHtcbiAgICAgIGNvbnN0IHN6ID0gbGVuIC0gMTtcbiAgICAgIGluQ29vcmQgLT0gbGVuICogTWF0aC50cnVuYyhpbkNvb3JkIC8gc3opO1xuICAgIH1cbiAgfVxuICAvLyBjbGFtcCBpcyBuZWNlc3NhcnkgYmVjYXVzZSB3aGVuIG91dENvb3JkID0gLTAuNSBhbmQgbGVuID0gNCxcbiAgLy8gaW5Db29yZCA9IDMuNSBhbmQgd2lsbCBiZSByb3VuZGVkIHRvIDQgaW4gbmVhcmVzdCBpbnRlcnBvbGF0aW9uLlxuICByZXR1cm4gdXRpbC5jbGFtcCgwLCBpbkNvb3JkLCBsZW4gLSAxKTtcbn1cblxuZnVuY3Rpb24gbWFwQ29vcmRDb25zdGFudChvdXRDb29yZDogbnVtYmVyLCBsZW46IG51bWJlcik6IG51bWJlciB7XG4gIHJldHVybiBvdXRDb29yZDtcbn1cblxuZnVuY3Rpb24gbWFwQ29vcmROZWFyZXN0KG91dENvb3JkOiBudW1iZXIsIGxlbjogbnVtYmVyKTogbnVtYmVyIHtcbiAgcmV0dXJuIHV0aWwuY2xhbXAoMCwgb3V0Q29vcmQsIGxlbiAtIDEpO1xufVxuXG5mdW5jdGlvbiByZWFkV2l0aEZpbGxWYWx1ZShcbiAgICBpbWFnZVZhbHM6IFR5cGVkQXJyYXksIGltYWdlSGVpZ2h0OiBudW1iZXIsIGltYWdlV2lkdGg6IG51bWJlcixcbiAgICBiYXRjaFN0cmlkZTogbnVtYmVyLCByb3dTdHJpZGU6IG51bWJlciwgY29sU3RyaWRlOiBudW1iZXIsIGJhdGNoOiBudW1iZXIsXG4gICAgeTogbnVtYmVyLCB4OiBudW1iZXIsIGNoYW5uZWw6IG51bWJlciwgZmlsbFZhbHVlOiBudW1iZXIpOiBudW1iZXIge1xuICBjb25zdCBpbmQgPSBiYXRjaCAqIGJhdGNoU3RyaWRlICsgeSAqIHJvd1N0cmlkZSArIHggKiBjb2xTdHJpZGUgKyBjaGFubmVsO1xuICBpZiAoMCA8PSB5ICYmIHkgPCBpbWFnZUhlaWdodCAmJiAwIDw9IHggJiYgeCA8IGltYWdlV2lkdGgpIHtcbiAgICByZXR1cm4gaW1hZ2VWYWxzW2luZF07XG4gIH0gZWxzZSB7XG4gICAgcmV0dXJuIGZpbGxWYWx1ZTtcbiAgfVxufVxuXG5mdW5jdGlvbiBuZWFyZXN0SW50ZXJwb2xhdGlvbihcbiAgICBpbWFnZVZhbHM6IFR5cGVkQXJyYXksIGltYWdlSGVpZ2h0OiBudW1iZXIsIGltYWdlV2lkdGg6IG51bWJlcixcbiAgICBiYXRjaFN0cmlkZTogbnVtYmVyLCByb3dTdHJpZGU6IG51bWJlciwgY29sU3RyaWRlOiBudW1iZXIsIGJhdGNoOiBudW1iZXIsXG4gICAgeTogbnVtYmVyLCB4OiBudW1iZXIsIGNoYW5uZWw6IG51bWJlciwgZmlsbFZhbHVlOiBudW1iZXIpOiBudW1iZXIge1xuICBjb25zdCAkeSA9IE1hdGgucm91bmQoeSk7XG4gIGNvbnN0ICR4ID0gTWF0aC5yb3VuZCh4KTtcblxuICByZXR1cm4gcmVhZFdpdGhGaWxsVmFsdWUoXG4gICAgICBpbWFnZVZhbHMsIGltYWdlSGVpZ2h0LCBpbWFnZVdpZHRoLCBiYXRjaFN0cmlkZSwgcm93U3RyaWRlLCBjb2xTdHJpZGUsXG4gICAgICBiYXRjaCwgJHksICR4LCBjaGFubmVsLCBmaWxsVmFsdWUpO1xufVxuXG5mdW5jdGlvbiBiaWxpbmVhckludGVycG9sYXRpb24oXG4gICAgaW1hZ2VWYWxzOiBUeXBlZEFycmF5LCBpbWFnZUhlaWdodDogbnVtYmVyLCBpbWFnZVdpZHRoOiBudW1iZXIsXG4gICAgYmF0Y2hTdHJpZGU6IG51bWJlciwgcm93U3RyaWRlOiBudW1iZXIsIGNvbFN0cmlkZTogbnVtYmVyLCBiYXRjaDogbnVtYmVyLFxuICAgIHk6IG51bWJlciwgeDogbnVtYmVyLCBjaGFubmVsOiBudW1iZXIsIGZpbGxWYWx1ZTogbnVtYmVyKSB7XG4gIGNvbnN0IHlGbG9vciA9IE1hdGguZmxvb3IoeSk7XG4gIGNvbnN0IHhGbG9vciA9IE1hdGguZmxvb3IoeCk7XG4gIGNvbnN0IHlDZWlsID0geUZsb29yICsgMTtcbiAgY29uc3QgeENlaWwgPSB4Rmxvb3IgKyAxO1xuICAvLyBmKHgsIHlGbG9vcikgPSAoeENlaWwgLSB4KSAvICh4Q2VpbCAtIHhGbG9vcikgKiBmKHhGbG9vciwgeUZsb29yKVxuICAvLyAgICAgICAgICAgICAgICsgKHggLSB4Rmxvb3IpIC8gKHhDZWlsIC0geEZsb29yKSAqIGYoeENlaWwsIHlGbG9vcilcbiAgY29uc3QgdmFsdWVZRmxvb3IgPVxuICAgICAgKHhDZWlsIC0geCkgKlxuICAgICAgICAgIHJlYWRXaXRoRmlsbFZhbHVlKFxuICAgICAgICAgICAgICBpbWFnZVZhbHMsIGltYWdlSGVpZ2h0LCBpbWFnZVdpZHRoLCBiYXRjaFN0cmlkZSwgcm93U3RyaWRlLFxuICAgICAgICAgICAgICBjb2xTdHJpZGUsIGJhdGNoLCB5Rmxvb3IsIHhGbG9vciwgY2hhbm5lbCwgZmlsbFZhbHVlKSArXG4gICAgICAoeCAtIHhGbG9vcikgKlxuICAgICAgICAgIHJlYWRXaXRoRmlsbFZhbHVlKFxuICAgICAgICAgICAgICBpbWFnZVZhbHMsIGltYWdlSGVpZ2h0LCBpbWFnZVdpZHRoLCBiYXRjaFN0cmlkZSwgcm93U3RyaWRlLFxuICAgICAgICAgICAgICBjb2xTdHJpZGUsIGJhdGNoLCB5Rmxvb3IsIHhDZWlsLCBjaGFubmVsLCBmaWxsVmFsdWUpO1xuICAvLyBmKHgsIHlDZWlsKSA9ICh4Q2VpbCAtIHgpIC8gKHhDZWlsIC0geEZsb29yKSAqIGYoeEZsb29yLCB5Q2VpbClcbiAgLy8gICAgICAgICAgICAgKyAoeCAtIHhGbG9vcikgLyAoeENlaWwgLSB4Rmxvb3IpICogZih4Q2VpbCwgeUNlaWwpXG4gIGNvbnN0IHZhbHVlWUNlaWwgPVxuICAgICAgKHhDZWlsIC0geCkgKlxuICAgICAgICAgIHJlYWRXaXRoRmlsbFZhbHVlKFxuICAgICAgICAgICAgICBpbWFnZVZhbHMsIGltYWdlSGVpZ2h0LCBpbWFnZVdpZHRoLCBiYXRjaFN0cmlkZSwgcm93U3RyaWRlLFxuICAgICAgICAgICAgICBjb2xTdHJpZGUsIGJhdGNoLCB5Q2VpbCwgeEZsb29yLCBjaGFubmVsLCBmaWxsVmFsdWUpICtcbiAgICAgICh4IC0geEZsb29yKSAqXG4gICAgICAgICAgcmVhZFdpdGhGaWxsVmFsdWUoXG4gICAgICAgICAgICAgIGltYWdlVmFscywgaW1hZ2VIZWlnaHQsIGltYWdlV2lkdGgsIGJhdGNoU3RyaWRlLCByb3dTdHJpZGUsXG4gICAgICAgICAgICAgIGNvbFN0cmlkZSwgYmF0Y2gsIHlDZWlsLCB4Q2VpbCwgY2hhbm5lbCwgZmlsbFZhbHVlKTtcbiAgLy8gZih4LCB5KSA9ICh5Q2VpbCAtIHkpIC8gKHlDZWlsIC0geUZsb29yKSAqIGYoeCwgeUZsb29yKVxuICAvLyAgICAgICAgICsgKHkgLSB5Rmxvb3IpIC8gKHlDZWlsIC0geUZsb29yKSAqIGYoeCwgeUNlaWwpXG4gIHJldHVybiAoeUNlaWwgLSB5KSAqIHZhbHVlWUZsb29yICsgKHkgLSB5Rmxvb3IpICogdmFsdWVZQ2VpbDtcbn1cbiJdfQ==","/**\n * @license\n * Copyright 2020 Google LLC. All Rights Reserved.\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n * =============================================================================\n */\nimport { TensorBuffer, util } from '@tensorflow/tfjs-core';\nexport function uniqueImpl(values, axis, shape, dtype) {\n // Normalize and validate axis.\n const $axis = util.parseAxisParam(axis, shape)[0];\n // Calculate the new shape that is suitable for extracting data along the\n // given axis.\n //\n // The rank is 3.\n // The size of the 1st dimension is the size of all the axes < the given axis.\n // The size of the 2nd dimension is the same as the size of the given axis.\n // The size of the 3rd dimension is the size of all the axes > the given axis.\n //\n // For example, for a 4D tensor with shape=[2, 3, 5, 4] and axis=2, the\n // newShape would be: [2*3, 5, 4].\n //\n // Note that this is not the final output shape. This will be the shape for an\n // intermediate TensorBuffer (see inputBuffer below) to allow us to extract\n // values along the given axis. To demonstrate how it works, consider the\n // following example:\n //\n // Input: a 3D tensor, with shape [1, 2, 3]\n // [\n // [\n // [1,2,3],\n // [4,5,6]\n // ]\n // ]\n // Axis: 2 (the last axis).\n // Along axis 2, we expect to extract 3 tensors: [1,4], [2,5], [3,6].\n //\n // For this example, newShape would be: [2, 3, 1], where 2 is calculated from\n // 1*2. The re-shaped data would look like:\n //\n // [\n // [\n // [1], [2], [3]\n // ],\n // [\n // [4], [5], [6]\n // ]\n // ]\n //\n // Then, we can construct a 3-level nested loop by the following dimension\n // order to extract the values along the axis (dimension1):\n // i: dimension1 // 0,1,2 (newShape[1])\n // m: dimension0 // 0,1 (newShape[0])\n // n: dimension2 // 0 (newShape[2])\n //\n // m, i, n\n // ---------\n // Iteration 0: data at [0, 0, 0] => \"1\"\n // Iteration 1: data at [1, 0, 0] => \"4\"\n // We got [1,4].\n // Iteration 2: data at [0, 1, 0] => \"2\"\n // Iteration 3: data at [1, 1, 0] => \"5\"\n // We got [2,5].\n // Iteration 4: data at [0, 2, 0] => \"3\"\n // Iteration 5: data at [1, 2, 0] => \"6\"\n // We got [3,6].\n const newShape = [1, shape[0], 1];\n for (let i = 0; i < $axis; i++) {\n newShape[0] *= shape[i];\n }\n newShape[1] = shape[$axis];\n for (let i = $axis + 1; i < shape.length; i++) {\n newShape[2] *= shape[i];\n }\n // A map from unique elements (their string representations) to their values\n // in \"indices\" (below).\n const uniqueElements = {};\n // The indices of each unique element in the original tensor along the given\n // axis. It is 1D and has the same size as the given axis.\n const indices = new Int32Array(shape[$axis]);\n // Create a buffer so we can easily extract value at a given location.\n const inputBuffer = new TensorBuffer(newShape, dtype, values);\n // The indices along the given axis that have unique elements. This is a\n // de-duped version of \"indices\" above.\n const uniqueIndices = [];\n const is1DTensor = newShape[0] === 1 && newShape[2] === 1;\n for (let i = 0; i < shape[$axis]; i++) {\n // Extract values along the axis.\n let element;\n if (is1DTensor) {\n // Fast path for 1D tensor input.\n element = values[i].toString();\n }\n else {\n const axisValues = [];\n for (let m = 0; m < newShape[0]; m++) {\n for (let n = 0; n < newShape[2]; n++) {\n axisValues.push(inputBuffer.get(m, i, n));\n }\n }\n element = axisValues.join(',');\n }\n // Dedup and update various indices.\n if (uniqueElements[element] !== undefined) {\n indices[i] = uniqueElements[element];\n }\n else {\n const uniqueIndex = Object.keys(uniqueElements).length;\n uniqueElements[element] = uniqueIndex;\n indices[i] = uniqueIndex;\n uniqueIndices.push(i);\n }\n }\n // Now we know where each of the unique elements are located along the axis\n // (uniqueIndices). Extract them from input buffer and store them in the\n // output buffer.\n const outputTmpShape = newShape.slice();\n outputTmpShape[1] = Object.keys(uniqueElements).length;\n const outputBuffer = new TensorBuffer(outputTmpShape, dtype);\n uniqueIndices.forEach((uniqueElementIndex, i) => {\n for (let m = 0; m < newShape[0]; m++) {\n for (let n = 0; n < newShape[2]; n++) {\n outputBuffer.set(inputBuffer.get(m, uniqueElementIndex, n), m, i, n);\n }\n }\n });\n // The output shape can be calculated from the input shape with the size of\n // the given axis replaced by the number of unique elements along that axis.\n const outputShape = shape.slice();\n outputShape[$axis] = outputTmpShape[1];\n return {\n outputValues: outputBuffer.values,\n outputShape,\n indices,\n };\n}\n//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiVW5pcXVlX2ltcGwuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi8uLi90ZmpzLWJhY2tlbmQtY3B1L3NyYy9rZXJuZWxzL1VuaXF1ZV9pbXBsLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBOzs7Ozs7Ozs7Ozs7Ozs7R0FlRztBQUVILE9BQU8sRUFBMEIsWUFBWSxFQUFjLElBQUksRUFBQyxNQUFNLHVCQUF1QixDQUFDO0FBRTlGLE1BQU0sVUFBVSxVQUFVLENBQ3RCLE1BQXFCLEVBQUUsSUFBWSxFQUFFLEtBQWUsRUFBRSxLQUFlO0lBS3ZFLCtCQUErQjtJQUMvQixNQUFNLEtBQUssR0FBRyxJQUFJLENBQUMsY0FBYyxDQUFDLElBQUksRUFBRSxLQUFLLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQztJQUVsRCx5RUFBeUU7SUFDekUsY0FBYztJQUNkLEVBQUU7SUFDRixpQkFBaUI7SUFDakIsOEVBQThFO0lBQzlFLDJFQUEyRTtJQUMzRSw4RUFBOEU7SUFDOUUsRUFBRTtJQUNGLHVFQUF1RTtJQUN2RSxrQ0FBa0M7SUFDbEMsRUFBRTtJQUNGLDhFQUE4RTtJQUM5RSwyRUFBMkU7SUFDM0UseUVBQXlFO0lBQ3pFLHFCQUFxQjtJQUNyQixFQUFFO0lBQ0YsMkNBQTJDO0lBQzNDLElBQUk7SUFDSixNQUFNO0lBQ04sZ0JBQWdCO0lBQ2hCLGVBQWU7SUFDZixNQUFNO0lBQ04sSUFBSTtJQUNKLDJCQUEyQjtJQUMzQixxRUFBcUU7SUFDckUsRUFBRTtJQUNGLDZFQUE2RTtJQUM3RSwyQ0FBMkM7SUFDM0MsRUFBRTtJQUNGLElBQUk7SUFDSixNQUFNO0lBQ04sb0JBQW9CO0lBQ3BCLE9BQU87SUFDUCxNQUFNO0lBQ04sb0JBQW9CO0lBQ3BCLE1BQU07SUFDTixJQUFJO0lBQ0osRUFBRTtJQUNGLDBFQUEwRTtJQUMxRSwyREFBMkQ7SUFDM0QsNkNBQTZDO0lBQzdDLDZDQUE2QztJQUM3Qyw2Q0FBNkM7SUFDN0MsRUFBRTtJQUNGLGdDQUFnQztJQUNoQyxpQ0FBaUM7SUFDakMsd0NBQXdDO0lBQ3hDLHdDQUF3QztJQUN4QyxnQkFBZ0I7SUFDaEIsd0NBQXdDO0lBQ3hDLHdDQUF3QztJQUN4QyxnQkFBZ0I7SUFDaEIsd0NBQXdDO0lBQ3hDLHdDQUF3QztJQUN4QyxnQkFBZ0I7SUFDaEIsTUFBTSxRQUFRLEdBQUcsQ0FBQyxDQUFDLEVBQUUsS0FBSyxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDO0lBQ2xDLEtBQUssSUFBSSxDQUFDLEdBQUcsQ0FBQyxFQUFFLENBQUMsR0FBRyxLQUFLLEVBQUUsQ0FBQyxFQUFFLEVBQUU7UUFDOUIsUUFBUSxDQUFDLENBQUMsQ0FBQyxJQUFJLEtBQUssQ0FBQyxDQUFDLENBQUMsQ0FBQztLQUN6QjtJQUNELFFBQVEsQ0FBQyxDQUFDLENBQUMsR0FBRyxLQUFLLENBQUMsS0FBSyxDQUFDLENBQUM7SUFDM0IsS0FBSyxJQUFJLENBQUMsR0FBRyxLQUFLLEdBQUcsQ0FBQyxFQUFFLENBQUMsR0FBRyxLQUFLLENBQUMsTUFBTSxFQUFFLENBQUMsRUFBRSxFQUFFO1FBQzdDLFFBQVEsQ0FBQyxDQUFDLENBQUMsSUFBSSxLQUFLLENBQUMsQ0FBQyxDQUFDLENBQUM7S0FDekI7SUFFRCw0RUFBNEU7SUFDNUUsd0JBQXdCO0lBQ3hCLE1BQU0sY0FBYyxHQUE0QixFQUFFLENBQUM7SUFDbkQsNEVBQTRFO0lBQzVFLDBEQUEwRDtJQUMxRCxNQUFNLE9BQU8sR0FBRyxJQUFJLFVBQVUsQ0FBQyxLQUFLLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQztJQUM3QyxzRUFBc0U7SUFDdEUsTUFBTSxXQUFXLEdBQUcsSUFBSSxZQUFZLENBQUMsUUFBUSxFQUFFLEtBQUssRUFBRSxNQUFvQixDQUFDLENBQUM7SUFDNUUsd0VBQXdFO0lBQ3hFLHVDQUF1QztJQUN2QyxNQUFNLGFBQWEsR0FBYSxFQUFFLENBQUM7SUFDbkMsTUFBTSxVQUFVLEdBQUcsUUFBUSxDQUFDLENBQUMsQ0FBQyxLQUFLLENBQUMsSUFBSSxRQUFRLENBQUMsQ0FBQyxDQUFDLEtBQUssQ0FBQyxDQUFDO0lBQzFELEtBQUssSUFBSSxDQUFDLEdBQUcsQ0FBQyxFQUFFLENBQUMsR0FBRyxLQUFLLENBQUMsS0FBSyxDQUFDLEVBQUUsQ0FBQyxFQUFFLEVBQUU7UUFDckMsaUNBQWlDO1FBQ2pDLElBQUksT0FBZSxDQUFDO1FBQ3BCLElBQUksVUFBVSxFQUFFO1lBQ2QsaUNBQWlDO1lBQ2pDLE9BQU8sR0FBRyxNQUFNLENBQUMsQ0FBQyxDQUFDLENBQUMsUUFBUSxFQUFFLENBQUM7U0FDaEM7YUFBTTtZQUNMLE1BQU0sVUFBVSxHQUFHLEVBQUUsQ0FBQztZQUN0QixLQUFLLElBQUksQ0FBQyxHQUFHLENBQUMsRUFBRSxDQUFDLEdBQUcsUUFBUSxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsRUFBRSxFQUFFO2dCQUNwQyxLQUFLLElBQUksQ0FBQyxHQUFHLENBQUMsRUFBRSxDQUFDLEdBQUcsUUFBUSxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsRUFBRSxFQUFFO29CQUNwQyxVQUFVLENBQUMsSUFBSSxDQUFDLFdBQVcsQ0FBQyxHQUFHLENBQUMsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxDQUFDO2lCQUMzQzthQUNGO1lBQ0QsT0FBTyxHQUFHLFVBQVUsQ0FBQyxJQUFJLENBQUMsR0FBRyxDQUFDLENBQUM7U0FDaEM7UUFFRCxvQ0FBb0M7UUFDcEMsSUFBSSxjQUFjLENBQUMsT0FBTyxDQUFDLEtBQUssU0FBUyxFQUFFO1lBQ3pDLE9BQU8sQ0FBQyxDQUFDLENBQUMsR0FBRyxjQUFjLENBQUMsT0FBTyxDQUFDLENBQUM7U0FDdEM7YUFBTTtZQUNMLE1BQU0sV0FBVyxHQUFHLE1BQU0sQ0FBQyxJQUFJLENBQUMsY0FBYyxDQUFDLENBQUMsTUFBTSxDQUFDO1lBQ3ZELGNBQWMsQ0FBQyxPQUFPLENBQUMsR0FBRyxXQUFXLENBQUM7WUFDdEMsT0FBTyxDQUFDLENBQUMsQ0FBQyxHQUFHLFdBQVcsQ0FBQztZQUN6QixhQUFhLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxDQUFDO1NBQ3ZCO0tBQ0Y7SUFFRCwyRUFBMkU7SUFDM0Usd0VBQXdFO0lBQ3hFLGlCQUFpQjtJQUNqQixNQUFNLGNBQWMsR0FBRyxRQUFRLENBQUMsS0FBSyxFQUFFLENBQUM7SUFDeEMsY0FBYyxDQUFDLENBQUMsQ0FBQyxHQUFHLE1BQU0sQ0FBQyxJQUFJLENBQUMsY0FBYyxDQUFDLENBQUMsTUFBTSxDQUFDO0lBQ3ZELE1BQU0sWUFBWSxHQUFHLElBQUksWUFBWSxDQUFDLGNBQWMsRUFBRSxLQUFLLENBQUMsQ0FBQztJQUM3RCxhQUFhLENBQUMsT0FBTyxDQUFDLENBQUMsa0JBQWtCLEVBQUUsQ0FBQyxFQUFFLEVBQUU7UUFDOUMsS0FBSyxJQUFJLENBQUMsR0FBRyxDQUFDLEVBQUUsQ0FBQyxHQUFHLFFBQVEsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLEVBQUUsRUFBRTtZQUNwQyxLQUFLLElBQUksQ0FBQyxHQUFHLENBQUMsRUFBRSxDQUFDLEdBQUcsUUFBUSxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsRUFBRSxFQUFFO2dCQUNwQyxZQUFZLENBQUMsR0FBRyxDQUFDLFdBQVcsQ0FBQyxHQUFHLENBQUMsQ0FBQyxFQUFFLGtCQUFrQixFQUFFLENBQUMsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUM7YUFDdEU7U0FDRjtJQUNILENBQUMsQ0FBQyxDQUFDO0lBRUgsMkVBQTJFO0lBQzNFLDRFQUE0RTtJQUM1RSxNQUFNLFdBQVcsR0FBRyxLQUFLLENBQUMsS0FBSyxFQUFFLENBQUM7SUFDbEMsV0FBVyxDQUFDLEtBQUssQ0FBQyxHQUFHLGNBQWMsQ0FBQyxDQUFDLENBQUMsQ0FBQztJQUV2QyxPQUFPO1FBQ0wsWUFBWSxFQUFFLFlBQVksQ0FBQyxNQUF1QjtRQUNsRCxXQUFXO1FBQ1gsT0FBTztLQUNSLENBQUM7QUFDSixDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiLyoqXG4gKiBAbGljZW5zZVxuICogQ29weXJpZ2h0IDIwMjAgR29vZ2xlIExMQy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC5cbiAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSBcIkxpY2Vuc2VcIik7XG4gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuXG4gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXRcbiAqXG4gKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjBcbiAqXG4gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlXG4gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiBcIkFTIElTXCIgQkFTSVMsXG4gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC5cbiAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmRcbiAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLlxuICogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbiAqL1xuXG5pbXBvcnQge0JhY2tlbmRWYWx1ZXMsIERhdGFUeXBlLCBUZW5zb3JCdWZmZXIsIFR5cGVkQXJyYXksIHV0aWx9IGZyb20gJ0B0ZW5zb3JmbG93L3RmanMtY29yZSc7XG5cbmV4cG9ydCBmdW5jdGlvbiB1bmlxdWVJbXBsKFxuICAgIHZhbHVlczogQmFja2VuZFZhbHVlcywgYXhpczogbnVtYmVyLCBzaGFwZTogbnVtYmVyW10sIGR0eXBlOiBEYXRhVHlwZSk6IHtcbiAgb3V0cHV0VmFsdWVzOiBCYWNrZW5kVmFsdWVzLFxuICBvdXRwdXRTaGFwZTogbnVtYmVyW10sXG4gIGluZGljZXM6IEJhY2tlbmRWYWx1ZXNcbn0ge1xuICAvLyBOb3JtYWxpemUgYW5kIHZhbGlkYXRlIGF4aXMuXG4gIGNvbnN0ICRheGlzID0gdXRpbC5wYXJzZUF4aXNQYXJhbShheGlzLCBzaGFwZSlbMF07XG5cbiAgLy8gQ2FsY3VsYXRlIHRoZSBuZXcgc2hhcGUgdGhhdCBpcyBzdWl0YWJsZSBmb3IgZXh0cmFjdGluZyBkYXRhIGFsb25nIHRoZVxuICAvLyBnaXZlbiBheGlzLlxuICAvL1xuICAvLyBUaGUgcmFuayBpcyAzLlxuICAvLyBUaGUgc2l6ZSBvZiB0aGUgMXN0IGRpbWVuc2lvbiBpcyB0aGUgc2l6ZSBvZiBhbGwgdGhlIGF4ZXMgPCB0aGUgZ2l2ZW4gYXhpcy5cbiAgLy8gVGhlIHNpemUgb2YgdGhlIDJuZCBkaW1lbnNpb24gaXMgdGhlIHNhbWUgYXMgdGhlIHNpemUgb2YgdGhlIGdpdmVuIGF4aXMuXG4gIC8vIFRoZSBzaXplIG9mIHRoZSAzcmQgZGltZW5zaW9uIGlzIHRoZSBzaXplIG9mIGFsbCB0aGUgYXhlcyA+IHRoZSBnaXZlbiBheGlzLlxuICAvL1xuICAvLyBGb3IgZXhhbXBsZSwgZm9yIGEgNEQgdGVuc29yIHdpdGggc2hhcGU9WzIsIDMsIDUsIDRdIGFuZCBheGlzPTIsIHRoZVxuICAvLyBuZXdTaGFwZSB3b3VsZCBiZTogWzIqMywgNSwgNF0uXG4gIC8vXG4gIC8vIE5vdGUgdGhhdCB0aGlzIGlzIG5vdCB0aGUgZmluYWwgb3V0cHV0IHNoYXBlLiBUaGlzIHdpbGwgYmUgdGhlIHNoYXBlIGZvciBhblxuICAvLyBpbnRlcm1lZGlhdGUgVGVuc29yQnVmZmVyIChzZWUgaW5wdXRCdWZmZXIgYmVsb3cpIHRvIGFsbG93IHVzIHRvIGV4dHJhY3RcbiAgLy8gdmFsdWVzIGFsb25nIHRoZSBnaXZlbiBheGlzLiBUbyBkZW1vbnN0cmF0ZSBob3cgaXQgd29ya3MsIGNvbnNpZGVyIHRoZVxuICAvLyBmb2xsb3dpbmcgZXhhbXBsZTpcbiAgLy9cbiAgLy8gSW5wdXQ6IGEgM0QgdGVuc29yLCB3aXRoIHNoYXBlIFsxLCAyLCAzXVxuICAvLyBbXG4gIC8vICAgW1xuICAvLyAgICAgIFsxLDIsM10sXG4gIC8vICAgICAgWzQsNSw2XVxuICAvLyAgIF1cbiAgLy8gXVxuICAvLyBBeGlzOiAyICh0aGUgbGFzdCBheGlzKS5cbiAgLy8gQWxvbmcgYXhpcyAyLCB3ZSBleHBlY3QgdG8gZXh0cmFjdCAzIHRlbnNvcnM6IFsxLDRdLCBbMiw1XSwgWzMsNl0uXG4gIC8vXG4gIC8vIEZvciB0aGlzIGV4YW1wbGUsIG5ld1NoYXBlIHdvdWxkIGJlOiBbMiwgMywgMV0sIHdoZXJlIDIgaXMgY2FsY3VsYXRlZCBmcm9tXG4gIC8vIDEqMi4gVGhlIHJlLXNoYXBlZCBkYXRhIHdvdWxkIGxvb2sgbGlrZTpcbiAgLy9cbiAgLy8gW1xuICAvLyAgIFtcbiAgLy8gICAgIFsxXSwgWzJdLCBbM11cbiAgLy8gICBdLFxuICAvLyAgIFtcbiAgLy8gICAgIFs0XSwgWzVdLCBbNl1cbiAgLy8gICBdXG4gIC8vIF1cbiAgLy9cbiAgLy8gVGhlbiwgd2UgY2FuIGNvbnN0cnVjdCBhIDMtbGV2ZWwgbmVzdGVkIGxvb3AgYnkgdGhlIGZvbGxvd2luZyBkaW1lbnNpb25cbiAgLy8gb3JkZXIgdG8gZXh0cmFjdCB0aGUgdmFsdWVzIGFsb25nIHRoZSBheGlzIChkaW1lbnNpb24xKTpcbiAgLy8gaTogZGltZW5zaW9uMSAgICAgICAvLyAwLDEsMiAobmV3U2hhcGVbMV0pXG4gIC8vICAgbTogZGltZW5zaW9uMCAgICAgLy8gMCwxICAgKG5ld1NoYXBlWzBdKVxuICAvLyAgICAgbjogZGltZW5zaW9uMiAgIC8vIDAgICAgIChuZXdTaGFwZVsyXSlcbiAgLy9cbiAgLy8gICAgICAgICAgICAgICAgICAgICAgIG0sIGksIG5cbiAgLy8gICAgICAgICAgICAgICAgICAgICAgLS0tLS0tLS0tXG4gIC8vIEl0ZXJhdGlvbiAwOiBkYXRhIGF0IFswLCAwLCAwXSA9PiBcIjFcIlxuICAvLyBJdGVyYXRpb24gMTogZGF0YSBhdCBbMSwgMCwgMF0gPT4gXCI0XCJcbiAgLy8gV2UgZ290IFsxLDRdLlxuICAvLyBJdGVyYXRpb24gMjogZGF0YSBhdCBbMCwgMSwgMF0gPT4gXCIyXCJcbiAgLy8gSXRlcmF0aW9uIDM6IGRhdGEgYXQgWzEsIDEsIDBdID0+IFwiNVwiXG4gIC8vIFdlIGdvdCBbMiw1XS5cbiAgLy8gSXRlcmF0aW9uIDQ6IGRhdGEgYXQgWzAsIDIsIDBdID0+IFwiM1wiXG4gIC8vIEl0ZXJhdGlvbiA1OiBkYXRhIGF0IFsxLCAyLCAwXSA9PiBcIjZcIlxuICAvLyBXZSBnb3QgWzMsNl0uXG4gIGNvbnN0IG5ld1NoYXBlID0gWzEsIHNoYXBlWzBdLCAxXTtcbiAgZm9yIChsZXQgaSA9IDA7IGkgPCAkYXhpczsgaSsrKSB7XG4gICAgbmV3U2hhcGVbMF0gKj0gc2hhcGVbaV07XG4gIH1cbiAgbmV3U2hhcGVbMV0gPSBzaGFwZVskYXhpc107XG4gIGZvciAobGV0IGkgPSAkYXhpcyArIDE7IGkgPCBzaGFwZS5sZW5ndGg7IGkrKykge1xuICAgIG5ld1NoYXBlWzJdICo9IHNoYXBlW2ldO1xuICB9XG5cbiAgLy8gQSBtYXAgZnJvbSB1bmlxdWUgZWxlbWVudHMgKHRoZWlyIHN0cmluZyByZXByZXNlbnRhdGlvbnMpIHRvIHRoZWlyIHZhbHVlc1xuICAvLyBpbiBcImluZGljZXNcIiAoYmVsb3cpLlxuICBjb25zdCB1bmlxdWVFbGVtZW50czoge1trZXk6IHN0cmluZ106IG51bWJlcn0gPSB7fTtcbiAgLy8gVGhlIGluZGljZXMgb2YgZWFjaCB1bmlxdWUgZWxlbWVudCBpbiB0aGUgb3JpZ2luYWwgdGVuc29yIGFsb25nIHRoZSBnaXZlblxuICAvLyBheGlzLiBJdCBpcyAxRCBhbmQgaGFzIHRoZSBzYW1lIHNpemUgYXMgdGhlIGdpdmVuIGF4aXMuXG4gIGNvbnN0IGluZGljZXMgPSBuZXcgSW50MzJBcnJheShzaGFwZVskYXhpc10pO1xuICAvLyBDcmVhdGUgYSBidWZmZXIgc28gd2UgY2FuIGVhc2lseSBleHRyYWN0IHZhbHVlIGF0IGEgZ2l2ZW4gbG9jYXRpb24uXG4gIGNvbnN0IGlucHV0QnVmZmVyID0gbmV3IFRlbnNvckJ1ZmZlcihuZXdTaGFwZSwgZHR5cGUsIHZhbHVlcyBhcyBUeXBlZEFycmF5KTtcbiAgLy8gVGhlIGluZGljZXMgYWxvbmcgdGhlIGdpdmVuIGF4aXMgdGhhdCBoYXZlIHVuaXF1ZSBlbGVtZW50cy4gVGhpcyBpcyBhXG4gIC8vIGRlLWR1cGVkIHZlcnNpb24gb2YgXCJpbmRpY2VzXCIgYWJvdmUuXG4gIGNvbnN0IHVuaXF1ZUluZGljZXM6IG51bWJlcltdID0gW107XG4gIGNvbnN0IGlzMURUZW5zb3IgPSBuZXdTaGFwZVswXSA9PT0gMSAmJiBuZXdTaGFwZVsyXSA9PT0gMTtcbiAgZm9yIChsZXQgaSA9IDA7IGkgPCBzaGFwZVskYXhpc107IGkrKykge1xuICAgIC8vIEV4dHJhY3QgdmFsdWVzIGFsb25nIHRoZSBheGlzLlxuICAgIGxldCBlbGVtZW50OiBzdHJpbmc7XG4gICAgaWYgKGlzMURUZW5zb3IpIHtcbiAgICAgIC8vIEZhc3QgcGF0aCBmb3IgMUQgdGVuc29yIGlucHV0LlxuICAgICAgZWxlbWVudCA9IHZhbHVlc1tpXS50b1N0cmluZygpO1xuICAgIH0gZWxzZSB7XG4gICAgICBjb25zdCBheGlzVmFsdWVzID0gW107XG4gICAgICBmb3IgKGxldCBtID0gMDsgbSA8IG5ld1NoYXBlWzBdOyBtKyspIHtcbiAgICAgICAgZm9yIChsZXQgbiA9IDA7IG4gPCBuZXdTaGFwZVsyXTsgbisrKSB7XG4gICAgICAgICAgYXhpc1ZhbHVlcy5wdXNoKGlucHV0QnVmZmVyLmdldChtLCBpLCBuKSk7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICAgIGVsZW1lbnQgPSBheGlzVmFsdWVzLmpvaW4oJywnKTtcbiAgICB9XG5cbiAgICAvLyBEZWR1cCBhbmQgdXBkYXRlIHZhcmlvdXMgaW5kaWNlcy5cbiAgICBpZiAodW5pcXVlRWxlbWVudHNbZWxlbWVudF0gIT09IHVuZGVmaW5lZCkge1xuICAgICAgaW5kaWNlc1tpXSA9IHVuaXF1ZUVsZW1lbnRzW2VsZW1lbnRdO1xuICAgIH0gZWxzZSB7XG4gICAgICBjb25zdCB1bmlxdWVJbmRleCA9IE9iamVjdC5rZXlzKHVuaXF1ZUVsZW1lbnRzKS5sZW5ndGg7XG4gICAgICB1bmlxdWVFbGVtZW50c1tlbGVtZW50XSA9IHVuaXF1ZUluZGV4O1xuICAgICAgaW5kaWNlc1tpXSA9IHVuaXF1ZUluZGV4O1xuICAgICAgdW5pcXVlSW5kaWNlcy5wdXNoKGkpO1xuICAgIH1cbiAgfVxuXG4gIC8vIE5vdyB3ZSBrbm93IHdoZXJlIGVhY2ggb2YgdGhlIHVuaXF1ZSBlbGVtZW50cyBhcmUgbG9jYXRlZCBhbG9uZyB0aGUgYXhpc1xuICAvLyAodW5pcXVlSW5kaWNlcykuIEV4dHJhY3QgdGhlbSBmcm9tIGlucHV0IGJ1ZmZlciBhbmQgc3RvcmUgdGhlbSBpbiB0aGVcbiAgLy8gb3V0cHV0IGJ1ZmZlci5cbiAgY29uc3Qgb3V0cHV0VG1wU2hhcGUgPSBuZXdTaGFwZS5zbGljZSgpO1xuICBvdXRwdXRUbXBTaGFwZVsxXSA9IE9iamVjdC5rZXlzKHVuaXF1ZUVsZW1lbnRzKS5sZW5ndGg7XG4gIGNvbnN0IG91dHB1dEJ1ZmZlciA9IG5ldyBUZW5zb3JCdWZmZXIob3V0cHV0VG1wU2hhcGUsIGR0eXBlKTtcbiAgdW5pcXVlSW5kaWNlcy5mb3JFYWNoKCh1bmlxdWVFbGVtZW50SW5kZXgsIGkpID0+IHtcbiAgICBmb3IgKGxldCBtID0gMDsgbSA8IG5ld1NoYXBlWzBdOyBtKyspIHtcbiAgICAgIGZvciAobGV0IG4gPSAwOyBuIDwgbmV3U2hhcGVbMl07IG4rKykge1xuICAgICAgICBvdXRwdXRCdWZmZXIuc2V0KGlucHV0QnVmZmVyLmdldChtLCB1bmlxdWVFbGVtZW50SW5kZXgsIG4pLCBtLCBpLCBuKTtcbiAgICAgIH1cbiAgICB9XG4gIH0pO1xuXG4gIC8vIFRoZSBvdXRwdXQgc2hhcGUgY2FuIGJlIGNhbGN1bGF0ZWQgZnJvbSB0aGUgaW5wdXQgc2hhcGUgd2l0aCB0aGUgc2l6ZSBvZlxuICAvLyB0aGUgZ2l2ZW4gYXhpcyByZXBsYWNlZCBieSB0aGUgbnVtYmVyIG9mIHVuaXF1ZSBlbGVtZW50cyBhbG9uZyB0aGF0IGF4aXMuXG4gIGNvbnN0IG91dHB1dFNoYXBlID0gc2hhcGUuc2xpY2UoKTtcbiAgb3V0cHV0U2hhcGVbJGF4aXNdID0gb3V0cHV0VG1wU2hhcGVbMV07XG5cbiAgcmV0dXJuIHtcbiAgICBvdXRwdXRWYWx1ZXM6IG91dHB1dEJ1ZmZlci52YWx1ZXMgYXMgQmFja2VuZFZhbHVlcyxcbiAgICBvdXRwdXRTaGFwZSxcbiAgICBpbmRpY2VzLFxuICB9O1xufVxuIl19","/**\n * @license\n * Copyright 2020 Google LLC. All Rights Reserved.\n * Licensed under the Apache License, Version 2.0 (the License);\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an AS IS BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n * =============================================================================\n */\nimport { Unique } from '@tensorflow/tfjs-core';\nimport { assertNotComplex } from '../cpu_util';\nimport { uniqueImpl } from './Unique_impl';\nexport function unique(args) {\n const { inputs, attrs, backend } = args;\n const { axis } = attrs;\n const { x } = inputs;\n assertNotComplex(x, 'unique');\n const values = backend.data.get(x.dataId).values;\n const { outputValues, outputShape, indices } = uniqueImpl(values, axis, x.shape, x.dtype);\n return [\n backend.makeTensorInfo(outputShape, x.dtype, outputValues),\n backend.makeTensorInfo([indices.length], 'int32', indices),\n ];\n}\nexport const uniqueConfig = {\n kernelName: Unique,\n backendName: 'cpu',\n kernelFunc: unique,\n};\n//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiVW5pcXVlLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vLi4vdGZqcy1iYWNrZW5kLWNwdS9zcmMva2VybmVscy9VbmlxdWUudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUE7Ozs7Ozs7Ozs7Ozs7OztHQWVHO0FBRUgsT0FBTyxFQUF1QyxNQUFNLEVBQTRCLE1BQU0sdUJBQXVCLENBQUM7QUFHOUcsT0FBTyxFQUFDLGdCQUFnQixFQUFDLE1BQU0sYUFBYSxDQUFDO0FBRTdDLE9BQU8sRUFBQyxVQUFVLEVBQUMsTUFBTSxlQUFlLENBQUM7QUFFekMsTUFBTSxVQUFVLE1BQU0sQ0FDbEIsSUFBeUU7SUFFM0UsTUFBTSxFQUFDLE1BQU0sRUFBRSxLQUFLLEVBQUUsT0FBTyxFQUFDLEdBQUcsSUFBSSxDQUFDO0lBQ3RDLE1BQU0sRUFBQyxJQUFJLEVBQUMsR0FBRyxLQUFLLENBQUM7SUFDckIsTUFBTSxFQUFDLENBQUMsRUFBQyxHQUFHLE1BQU0sQ0FBQztJQUNuQixnQkFBZ0IsQ0FBQyxDQUFDLEVBQUUsUUFBUSxDQUFDLENBQUM7SUFFOUIsTUFBTSxNQUFNLEdBQUcsT0FBTyxDQUFDLElBQUksQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLE1BQU0sQ0FBQyxDQUFDLE1BQU0sQ0FBQztJQUNqRCxNQUFNLEVBQUMsWUFBWSxFQUFFLFdBQVcsRUFBRSxPQUFPLEVBQUMsR0FDdEMsVUFBVSxDQUFDLE1BQU0sRUFBRSxJQUFJLEVBQUUsQ0FBQyxDQUFDLEtBQUssRUFBRSxDQUFDLENBQUMsS0FBSyxDQUFDLENBQUM7SUFDL0MsT0FBTztRQUNMLE9BQU8sQ0FBQyxjQUFjLENBQUMsV0FBVyxFQUFFLENBQUMsQ0FBQyxLQUFLLEVBQUUsWUFBWSxDQUFDO1FBQzFELE9BQU8sQ0FBQyxjQUFjLENBQUMsQ0FBQyxPQUFPLENBQUMsTUFBTSxDQUFDLEVBQUUsT0FBTyxFQUFFLE9BQU8sQ0FBQztLQUMzRCxDQUFDO0FBQ0osQ0FBQztBQUVELE1BQU0sQ0FBQyxNQUFNLFlBQVksR0FBaUI7SUFDeEMsVUFBVSxFQUFFLE1BQU07SUFDbEIsV0FBVyxFQUFFLEtBQUs7SUFDbEIsVUFBVSxFQUFFLE1BQTBCO0NBQ3ZDLENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyIvKipcbiAqIEBsaWNlbnNlXG4gKiBDb3B5cmlnaHQgMjAyMCBHb29nbGUgTExDLiBBbGwgUmlnaHRzIFJlc2VydmVkLlxuICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlIExpY2Vuc2UpO1xuICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLlxuICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0XG4gKlxuICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wXG4gKlxuICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZVxuICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gQVMgSVMgQkFTSVMsXG4gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC5cbiAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmRcbiAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLlxuICogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbiAqL1xuXG5pbXBvcnQge0tlcm5lbENvbmZpZywgS2VybmVsRnVuYywgVGVuc29ySW5mbywgVW5pcXVlLCBVbmlxdWVBdHRycywgVW5pcXVlSW5wdXRzfSBmcm9tICdAdGVuc29yZmxvdy90ZmpzLWNvcmUnO1xuXG5pbXBvcnQge01hdGhCYWNrZW5kQ1BVfSBmcm9tICcuLi9iYWNrZW5kX2NwdSc7XG5pbXBvcnQge2Fzc2VydE5vdENvbXBsZXh9IGZyb20gJy4uL2NwdV91dGlsJztcblxuaW1wb3J0IHt1bmlxdWVJbXBsfSBmcm9tICcuL1VuaXF1ZV9pbXBsJztcblxuZXhwb3J0IGZ1bmN0aW9uIHVuaXF1ZShcbiAgICBhcmdzOiB7aW5wdXRzOiBVbmlxdWVJbnB1dHMsIGF0dHJzOiBVbmlxdWVBdHRycywgYmFja2VuZDogTWF0aEJhY2tlbmRDUFV9KTpcbiAgICBUZW5zb3JJbmZvW10ge1xuICBjb25zdCB7aW5wdXRzLCBhdHRycywgYmFja2VuZH0gPSBhcmdzO1xuICBjb25zdCB7YXhpc30gPSBhdHRycztcbiAgY29uc3Qge3h9ID0gaW5wdXRzO1xuICBhc3NlcnROb3RDb21wbGV4KHgsICd1bmlxdWUnKTtcblxuICBjb25zdCB2YWx1ZXMgPSBiYWNrZW5kLmRhdGEuZ2V0KHguZGF0YUlkKS52YWx1ZXM7XG4gIGNvbnN0IHtvdXRwdXRWYWx1ZXMsIG91dHB1dFNoYXBlLCBpbmRpY2VzfSA9XG4gICAgICB1bmlxdWVJbXBsKHZhbHVlcywgYXhpcywgeC5zaGFwZSwgeC5kdHlwZSk7XG4gIHJldHVybiBbXG4gICAgYmFja2VuZC5tYWtlVGVuc29ySW5mbyhvdXRwdXRTaGFwZSwgeC5kdHlwZSwgb3V0cHV0VmFsdWVzKSxcbiAgICBiYWNrZW5kLm1ha2VUZW5zb3JJbmZvKFtpbmRpY2VzLmxlbmd0aF0sICdpbnQzMicsIGluZGljZXMpLFxuICBdO1xufVxuXG5leHBvcnQgY29uc3QgdW5pcXVlQ29uZmlnOiBLZXJuZWxDb25maWcgPSB7XG4gIGtlcm5lbE5hbWU6IFVuaXF1ZSxcbiAgYmFja2VuZE5hbWU6ICdjcHUnLFxuICBrZXJuZWxGdW5jOiB1bmlxdWUgYXMge30gYXMgS2VybmVsRnVuYyxcbn07XG4iXX0=","/**\n * @license\n * Copyright 2020 Google LLC. All Rights Reserved.\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n * =============================================================================\n */\nimport { Unpack } from '@tensorflow/tfjs-core';\nimport { reshape } from './Reshape';\nimport { slice } from './Slice';\nexport function unpack(args) {\n const { inputs, backend, attrs } = args;\n const { value } = inputs;\n let { axis } = attrs;\n if (axis < 0) {\n axis += value.shape.length;\n }\n const valueRank = value.shape.length;\n const num = value.shape[axis];\n const outShape = new Array(valueRank - 1);\n let outIndex = 0;\n for (let i = 0; i < valueRank; i++) {\n if (i !== axis) {\n outShape[outIndex++] = value.shape[i];\n }\n }\n const begin = new Array(valueRank).fill(0);\n const size = value.shape.slice();\n size[axis] = 1;\n const res = new Array(num);\n for (let i = 0; i < res.length; i++) {\n begin[axis] = i;\n const tempRes = slice({ inputs: { x: value }, backend, attrs: { begin, size } });\n res[i] = reshape({ inputs: { x: tempRes }, backend, attrs: { shape: outShape } });\n backend.disposeIntermediateTensorInfo(tempRes);\n }\n return res;\n}\nexport const unpackConfig = {\n kernelName: Unpack,\n backendName: 'cpu',\n kernelFunc: unpack\n};\n//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiVW5wYWNrLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vLi4vdGZqcy1iYWNrZW5kLWNwdS9zcmMva2VybmVscy9VbnBhY2sudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUE7Ozs7Ozs7Ozs7Ozs7OztHQWVHO0FBRUgsT0FBTyxFQUF1QyxNQUFNLEVBQTRCLE1BQU0sdUJBQXVCLENBQUM7QUFHOUcsT0FBTyxFQUFDLE9BQU8sRUFBQyxNQUFNLFdBQVcsQ0FBQztBQUNsQyxPQUFPLEVBQUMsS0FBSyxFQUFDLE1BQU0sU0FBUyxDQUFDO0FBRTlCLE1BQU0sVUFBVSxNQUFNLENBQ2xCLElBQXlFO0lBRTNFLE1BQU0sRUFBQyxNQUFNLEVBQUUsT0FBTyxFQUFFLEtBQUssRUFBQyxHQUFHLElBQUksQ0FBQztJQUN0QyxNQUFNLEVBQUMsS0FBSyxFQUFDLEdBQUcsTUFBTSxDQUFDO0lBQ3ZCLElBQUksRUFBQyxJQUFJLEVBQUMsR0FBRyxLQUFLLENBQUM7SUFFbkIsSUFBSSxJQUFJLEdBQUcsQ0FBQyxFQUFFO1FBQ1osSUFBSSxJQUFJLEtBQUssQ0FBQyxLQUFLLENBQUMsTUFBTSxDQUFDO0tBQzVCO0lBRUQsTUFBTSxTQUFTLEdBQUcsS0FBSyxDQUFDLEtBQUssQ0FBQyxNQUFNLENBQUM7SUFFckMsTUFBTSxHQUFHLEdBQUcsS0FBSyxDQUFDLEtBQUssQ0FBQyxJQUFJLENBQUMsQ0FBQztJQUM5QixNQUFNLFFBQVEsR0FBYSxJQUFJLEtBQUssQ0FBQyxTQUFTLEdBQUcsQ0FBQyxDQUFDLENBQUM7SUFDcEQsSUFBSSxRQUFRLEdBQUcsQ0FBQyxDQUFDO0lBQ2pCLEtBQUssSUFBSSxDQUFDLEdBQUcsQ0FBQyxFQUFFLENBQUMsR0FBRyxTQUFTLEVBQUUsQ0FBQyxFQUFFLEVBQUU7UUFDbEMsSUFBSSxDQUFDLEtBQUssSUFBSSxFQUFFO1lBQ2QsUUFBUSxDQUFDLFFBQVEsRUFBRSxDQUFDLEdBQUcsS0FBSyxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUMsQ0FBQztTQUN2QztLQUNGO0lBRUQsTUFBTSxLQUFLLEdBQUcsSUFBSSxLQUFLLENBQUMsU0FBUyxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxDQUFDO0lBQzNDLE1BQU0sSUFBSSxHQUFHLEtBQUssQ0FBQyxLQUFLLENBQUMsS0FBSyxFQUFFLENBQUM7SUFDakMsSUFBSSxDQUFDLElBQUksQ0FBQyxHQUFHLENBQUMsQ0FBQztJQUNmLE1BQU0sR0FBRyxHQUFHLElBQUksS0FBSyxDQUFDLEdBQUcsQ0FBQyxDQUFDO0lBQzNCLEtBQUssSUFBSSxDQUFDLEdBQUcsQ0FBQyxFQUFFLENBQUMsR0FBRyxHQUFHLENBQUMsTUFBTSxFQUFFLENBQUMsRUFBRSxFQUFFO1FBQ25DLEtBQUssQ0FBQyxJQUFJLENBQUMsR0FBRyxDQUFDLENBQUM7UUFDaEIsTUFBTSxPQUFPLEdBQUcsS0FBSyxDQUFDLEVBQUMsTUFBTSxFQUFFLEVBQUMsQ0FBQyxFQUFFLEtBQUssRUFBQyxFQUFFLE9BQU8sRUFBRSxLQUFLLEVBQUUsRUFBQyxLQUFLLEVBQUUsSUFBSSxFQUFDLEVBQUMsQ0FBQyxDQUFDO1FBQzNFLEdBQUcsQ0FBQyxDQUFDLENBQUMsR0FBRyxPQUFPLENBQUMsRUFBQyxNQUFNLEVBQUUsRUFBQyxDQUFDLEVBQUUsT0FBTyxFQUFDLEVBQUUsT0FBTyxFQUFFLEtBQUssRUFBRSxFQUFDLEtBQUssRUFBRSxRQUFRLEVBQUMsRUFBQyxDQUFDLENBQUM7UUFDNUUsT0FBTyxDQUFDLDZCQUE2QixDQUFDLE9BQU8sQ0FBQyxDQUFDO0tBQ2hEO0lBRUQsT0FBTyxHQUFHLENBQUM7QUFDYixDQUFDO0FBRUQsTUFBTSxDQUFDLE1BQU0sWUFBWSxHQUFpQjtJQUN4QyxVQUFVLEVBQUUsTUFBTTtJQUNsQixXQUFXLEVBQUUsS0FBSztJQUNsQixVQUFVLEVBQUUsTUFBMEI7Q0FDdkMsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbIi8qKlxuICogQGxpY2Vuc2VcbiAqIENvcHlyaWdodCAyMDIwIEdvb2dsZSBMTEMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuXG4gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgXCJMaWNlbnNlXCIpO1xuICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLlxuICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0XG4gKlxuICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wXG4gKlxuICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZVxuICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gXCJBUyBJU1wiIEJBU0lTLFxuICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuXG4gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kXG4gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS5cbiAqID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4gKi9cblxuaW1wb3J0IHtLZXJuZWxDb25maWcsIEtlcm5lbEZ1bmMsIFRlbnNvckluZm8sIFVucGFjaywgVW5wYWNrQXR0cnMsIFVucGFja0lucHV0c30gZnJvbSAnQHRlbnNvcmZsb3cvdGZqcy1jb3JlJztcblxuaW1wb3J0IHtNYXRoQmFja2VuZENQVX0gZnJvbSAnLi4vYmFja2VuZF9jcHUnO1xuaW1wb3J0IHtyZXNoYXBlfSBmcm9tICcuL1Jlc2hhcGUnO1xuaW1wb3J0IHtzbGljZX0gZnJvbSAnLi9TbGljZSc7XG5cbmV4cG9ydCBmdW5jdGlvbiB1bnBhY2soXG4gICAgYXJnczoge2lucHV0czogVW5wYWNrSW5wdXRzLCBiYWNrZW5kOiBNYXRoQmFja2VuZENQVSwgYXR0cnM6IFVucGFja0F0dHJzfSk6XG4gICAgVGVuc29ySW5mb1tdIHtcbiAgY29uc3Qge2lucHV0cywgYmFja2VuZCwgYXR0cnN9ID0gYXJncztcbiAgY29uc3Qge3ZhbHVlfSA9IGlucHV0cztcbiAgbGV0IHtheGlzfSA9IGF0dHJzO1xuXG4gIGlmIChheGlzIDwgMCkge1xuICAgIGF4aXMgKz0gdmFsdWUuc2hhcGUubGVuZ3RoO1xuICB9XG5cbiAgY29uc3QgdmFsdWVSYW5rID0gdmFsdWUuc2hhcGUubGVuZ3RoO1xuXG4gIGNvbnN0IG51bSA9IHZhbHVlLnNoYXBlW2F4aXNdO1xuICBjb25zdCBvdXRTaGFwZTogbnVtYmVyW10gPSBuZXcgQXJyYXkodmFsdWVSYW5rIC0gMSk7XG4gIGxldCBvdXRJbmRleCA9IDA7XG4gIGZvciAobGV0IGkgPSAwOyBpIDwgdmFsdWVSYW5rOyBpKyspIHtcbiAgICBpZiAoaSAhPT0gYXhpcykge1xuICAgICAgb3V0U2hhcGVbb3V0SW5kZXgrK10gPSB2YWx1ZS5zaGFwZVtpXTtcbiAgICB9XG4gIH1cblxuICBjb25zdCBiZWdpbiA9IG5ldyBBcnJheSh2YWx1ZVJhbmspLmZpbGwoMCk7XG4gIGNvbnN0IHNpemUgPSB2YWx1ZS5zaGFwZS5zbGljZSgpO1xuICBzaXplW2F4aXNdID0gMTtcbiAgY29uc3QgcmVzID0gbmV3IEFycmF5KG51bSk7XG4gIGZvciAobGV0IGkgPSAwOyBpIDwgcmVzLmxlbmd0aDsgaSsrKSB7XG4gICAgYmVnaW5bYXhpc10gPSBpO1xuICAgIGNvbnN0IHRlbXBSZXMgPSBzbGljZSh7aW5wdXRzOiB7eDogdmFsdWV9LCBiYWNrZW5kLCBhdHRyczoge2JlZ2luLCBzaXplfX0pO1xuICAgIHJlc1tpXSA9IHJlc2hhcGUoe2lucHV0czoge3g6IHRlbXBSZXN9LCBiYWNrZW5kLCBhdHRyczoge3NoYXBlOiBvdXRTaGFwZX19KTtcbiAgICBiYWNrZW5kLmRpc3Bvc2VJbnRlcm1lZGlhdGVUZW5zb3JJbmZvKHRlbXBSZXMpO1xuICB9XG5cbiAgcmV0dXJuIHJlcztcbn1cblxuZXhwb3J0IGNvbnN0IHVucGFja0NvbmZpZzogS2VybmVsQ29uZmlnID0ge1xuICBrZXJuZWxOYW1lOiBVbnBhY2ssXG4gIGJhY2tlbmROYW1lOiAnY3B1JyxcbiAga2VybmVsRnVuYzogdW5wYWNrIGFzIHt9IGFzIEtlcm5lbEZ1bmNcbn07XG4iXX0=","/**\n * @license\n * Copyright 2020 Google LLC. All Rights Reserved.\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n * =============================================================================\n */\nimport { UnsortedSegmentSum, util } from '@tensorflow/tfjs-core';\nimport { assertNotComplex } from '../cpu_util';\nimport { cast } from './Cast';\nimport { equal } from './Equal';\nimport { expandDims } from './ExpandDims';\nimport { multiply } from './Multiply';\nimport { pack } from './Pack';\nimport { sum } from './Sum';\nexport function unsortedSegmentSum(args) {\n const { inputs, backend, attrs } = args;\n const { x, segmentIds } = inputs;\n const { numSegments } = attrs;\n assertNotComplex(x, 'unsortedSegmentSum');\n const xRank = x.shape.length;\n const segmentIdsRank = segmentIds.shape.length;\n const res = [];\n const intermediates = [];\n // Reshape the segment id's so that they can be broadcast with\n // x. The new shape should be [segmentIds.shape, 1, ..., 1]\n const numIters = xRank - segmentIdsRank;\n let $segmentIds = segmentIds;\n for (let i = 0; i < numIters; ++i) {\n const expanded = expandDims({ inputs: { input: $segmentIds }, backend, attrs: { dim: i + 1 } });\n $segmentIds = expanded;\n intermediates.push(expanded);\n }\n for (let i = 0; i < numSegments; ++i) {\n const scalarValue = util.createScalarValue(i, 'int32');\n const segmentId = backend.makeTensorInfo([], 'int32', scalarValue);\n const mask = equal({ inputs: { a: segmentId, b: $segmentIds }, backend });\n const maskCasted = cast({ inputs: { x: mask }, backend, attrs: { dtype: 'float32' } });\n const mul = multiply({ inputs: { a: maskCasted, b: x }, backend });\n const sumTensorInfo = sum({ inputs: { x: mul }, backend, attrs: { axis: 0, keepDims: false } });\n res.push(sumTensorInfo);\n intermediates.push(segmentId);\n intermediates.push(mask);\n intermediates.push(maskCasted);\n intermediates.push(mul);\n intermediates.push(sumTensorInfo);\n }\n const result = pack({ inputs: res, backend, attrs: { axis: 0 } });\n intermediates.forEach(t => backend.disposeIntermediateTensorInfo(t));\n return result;\n}\nexport const unsortedSegmentSumConfig = {\n kernelName: UnsortedSegmentSum,\n backendName: 'cpu',\n kernelFunc: unsortedSegmentSum\n};\n//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiVW5zb3J0ZWRTZWdtZW50U3VtLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vLi4vdGZqcy1iYWNrZW5kLWNwdS9zcmMva2VybmVscy9VbnNvcnRlZFNlZ21lbnRTdW0udHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUE7Ozs7Ozs7Ozs7Ozs7OztHQWVHO0FBRUgsT0FBTyxFQUF1QyxrQkFBa0IsRUFBcUQsSUFBSSxFQUFDLE1BQU0sdUJBQXVCLENBQUM7QUFHeEosT0FBTyxFQUFDLGdCQUFnQixFQUFDLE1BQU0sYUFBYSxDQUFDO0FBQzdDLE9BQU8sRUFBQyxJQUFJLEVBQUMsTUFBTSxRQUFRLENBQUM7QUFDNUIsT0FBTyxFQUFDLEtBQUssRUFBQyxNQUFNLFNBQVMsQ0FBQztBQUM5QixPQUFPLEVBQUMsVUFBVSxFQUFDLE1BQU0sY0FBYyxDQUFDO0FBQ3hDLE9BQU8sRUFBQyxRQUFRLEVBQUMsTUFBTSxZQUFZLENBQUM7QUFDcEMsT0FBTyxFQUFDLElBQUksRUFBQyxNQUFNLFFBQVEsQ0FBQztBQUM1QixPQUFPLEVBQUMsR0FBRyxFQUFDLE1BQU0sT0FBTyxDQUFDO0FBRTFCLE1BQU0sVUFBVSxrQkFBa0IsQ0FBQyxJQUlsQztJQUNDLE1BQU0sRUFBQyxNQUFNLEVBQUUsT0FBTyxFQUFFLEtBQUssRUFBQyxHQUFHLElBQUksQ0FBQztJQUN0QyxNQUFNLEVBQUMsQ0FBQyxFQUFFLFVBQVUsRUFBQyxHQUFHLE1BQU0sQ0FBQztJQUMvQixNQUFNLEVBQUMsV0FBVyxFQUFDLEdBQUcsS0FBSyxDQUFDO0lBRTVCLGdCQUFnQixDQUFDLENBQUMsRUFBRSxvQkFBb0IsQ0FBQyxDQUFDO0lBRTFDLE1BQU0sS0FBSyxHQUFHLENBQUMsQ0FBQyxLQUFLLENBQUMsTUFBTSxDQUFDO0lBQzdCLE1BQU0sY0FBYyxHQUFHLFVBQVUsQ0FBQyxLQUFLLENBQUMsTUFBTSxDQUFDO0lBQy9DLE1BQU0sR0FBRyxHQUFHLEVBQUUsQ0FBQztJ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eXJpZ2h0IDIwMjAgR29vZ2xlIExMQy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC5cbiAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSBcIkxpY2Vuc2VcIik7XG4gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuXG4gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXRcbiAqXG4gKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjBcbiAqXG4gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlXG4gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiBcIkFTIElTXCIgQkFTSVMsXG4gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC5cbiAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmRcbiAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLlxuICogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbiAqL1xuXG5pbXBvcnQge0tlcm5lbENvbmZpZywgS2VybmVsRnVuYywgVGVuc29ySW5mbywgVW5zb3J0ZWRTZWdtZW50U3VtLCBVbnNvcnRlZFNlZ21lbnRTdW1BdHRycywgVW5zb3J0ZWRTZWdtZW50U3VtSW5wdXRzLCB1dGlsfSBmcm9tICdAdGVuc29yZmxvdy90ZmpzLWNvcmUnO1xuXG5pbXBvcnQge01hdGhCYWNrZW5kQ1BVfSBmcm9tICcuLi9iYWNrZW5kX2NwdSc7XG5pbXBvcnQge2Fzc2VydE5vdENvbXBsZXh9IGZyb20gJy4uL2NwdV91dGlsJztcbmltcG9ydCB7Y2FzdH0gZnJvbSAnLi9DYXN0JztcbmltcG9ydCB7ZXF1YWx9IGZyb20gJy4vRXF1YWwnO1xuaW1wb3J0IHtleHBhbmREaW1zfSBmcm9tICcuL0V4cGFuZERpbXMnO1xuaW1wb3J0IHttdWx0aXBseX0gZnJvbSAnLi9NdWx0aXBseSc7XG5pbXBvcnQge3BhY2t9IGZyb20gJy4vUGFjayc7XG5pbXBvcnQge3N1bX0gZnJvbSAnLi9TdW0nO1xuXG5leHBvcnQgZnVuY3Rpb24gdW5zb3J0ZWRTZWdtZW50U3VtKGFyZ3M6IHtcbiAgaW5wdXRzOiBVbnNvcnRlZFNlZ21lbnRTdW1JbnB1dHMsXG4gIGJhY2tlbmQ6IE1hdGhCYWNrZW5kQ1BVLFxuICBhdHRyczogVW5zb3J0ZWRTZWdtZW50U3VtQXR0cnNcbn0pOiBUZW5zb3JJbmZvIHtcbiAgY29uc3Qge2lucHV0cywgYmFja2VuZCwgYXR0cnN9ID0gYXJncztcbiAgY29uc3Qge3gsIHNlZ21lbnRJZHN9ID0gaW5wdXRzO1xuICBjb25zdCB7bnVtU2VnbWVudHN9ID0gYXR0cnM7XG5cbiAgYXNzZXJ0Tm90Q29tcGxleCh4LCAndW5zb3J0ZWRTZWdtZW50U3VtJyk7XG5cbiAgY29uc3QgeFJhbmsgPSB4LnNoYXBlLmxlbmd0aDtcbiAgY29uc3Qgc2VnbWVudElkc1JhbmsgPSBzZWdtZW50SWRzLnNoYXBlLmxlbmd0aDtcbiAgY29uc3QgcmVzID0gW107XG4gIGNvbnN0IGludGVybWVkaWF0ZXM6IFRlbnNvckluZm9bXSA9IFtdO1xuXG4gIC8vIFJlc2hhcGUgdGhlIHNlZ21lbnQgaWQncyBzbyB0aGF0IHRoZXkgY2FuIGJlIGJyb2FkY2FzdCB3aXRoXG4gIC8vIHguIFRoZSBuZXcgc2hhcGUgc2hvdWxkIGJlIFtzZWdtZW50SWRzLnNoYXBlLCAxLCAuLi4sIDFdXG4gIGNvbnN0IG51bUl0ZXJzID0geFJhbmsgLSBzZWdtZW50SWRzUmFuaztcbiAgbGV0ICRzZWdtZW50SWRzID0gc2VnbWVudElkcztcblxuICBmb3IgKGxldCBpID0gMDsgaSA8IG51bUl0ZXJzOyArK2kpIHtcbiAgICBjb25zdCBleHBhbmRlZCA9IGV4cGFuZERpbXMoXG4gICAgICAgIHtpbnB1dHM6IHtpbnB1dDogJHNlZ21lbnRJZHN9LCBiYWNrZW5kLCBhdHRyczoge2RpbTogaSArIDF9fSk7XG4gICAgJHNlZ21lbnRJZHMgPSBleHBhbmRlZDtcbiAgICBpbnRlcm1lZGlhdGVzLnB1c2goZXhwYW5kZWQpO1xuICB9XG5cbiAgZm9yIChsZXQgaSA9IDA7IGkgPCBudW1TZWdtZW50czsgKytpKSB7XG4gICAgY29uc3Qgc2NhbGFyVmFsdWUgPSB1dGlsLmNyZWF0ZVNjYWxhclZhbHVlKGkgYXMge30gYXMgJ2ludDMyJywgJ2ludDMyJyk7XG4gICAgY29uc3Qgc2VnbWVudElkID0gYmFja2VuZC5tYWtlVGVuc29ySW5mbyhbXSwgJ2ludDMyJywgc2NhbGFyVmFsdWUpO1xuICAgIGNvbnN0IG1hc2sgPVxuICAgICAgICBlcXVhbCh7aW5wdXRzOiB7YTogc2VnbWVudElkLCBiOiAkc2VnbWVudElkc30sIGJhY2tlbmR9KSBhcyBUZW5zb3JJbmZvO1xuICAgIGNvbnN0IG1hc2tDYXN0ZWQgPVxuICAgICAgICBjYXN0KHtpbnB1dHM6IHt4OiBtYXNrfSwgYmFja2VuZCwgYXR0cnM6IHtkdHlwZTogJ2Zsb2F0MzInfX0pO1xuICAgIGNvbnN0IG11bCA9XG4gICAgICAgIG11bHRpcGx5KHtpbnB1dHM6IHthOiBtYXNrQ2FzdGVkLCBiOiB4fSwgYmFja2VuZH0pIGFzIFRlbnNvckluZm87XG4gICAgY29uc3Qgc3VtVGVuc29ySW5mbyA9XG4gICAgICAgIHN1bSh7aW5wdXRzOiB7eDogbXVsfSwgYmFja2VuZCwgYXR0cnM6IHtheGlzOiAwLCBrZWVwRGltczogZmFsc2V9fSk7XG4gICAgcmVzLnB1c2goc3VtVGVuc29ySW5mbyk7XG4gICAgaW50ZXJtZWRpYXRlcy5wdXNoKHNlZ21lbnRJZCk7XG4gICAgaW50ZXJtZWRpYXRlcy5wdXNoKG1hc2spO1xuICAgIGludGVybWVkaWF0ZXMucHVzaChtYXNrQ2FzdGVkKTtcbiAgICBpbnRlcm1lZGlhdGVzLnB1c2gobXVsKTtcbiAgICBpbnRlcm1lZGlhdGVzLnB1c2goc3VtVGVuc29ySW5mbyk7XG4gIH1cblxuICBjb25zdCByZXN1bHQgPSBwYWNrKHtpbnB1dHM6IHJlcywgYmFja2VuZCwgYXR0cnM6IHtheGlzOiAwfX0pO1xuXG4gIGludGVybWVkaWF0ZXMuZm9yRWFjaCh0ID0+IGJhY2tlbmQuZGlzcG9zZUludGVybWVkaWF0ZVRlbnNvckluZm8odCkpO1xuXG4gIHJldHVybiByZXN1bHQ7XG59XG5cbmV4cG9ydCBjb25zdCB1bnNvcnRlZFNlZ21lbnRTdW1Db25maWc6IEtlcm5lbENvbmZpZyA9IHtcbiAga2VybmVsTmFtZTogVW5zb3J0ZWRTZWdtZW50U3VtLFxuICBiYWNrZW5kTmFtZTogJ2NwdScsXG4gIGtlcm5lbEZ1bmM6IHVuc29ydGVkU2VnbWVudFN1bSBhcyB7fSBhcyBLZXJuZWxGdW5jXG59O1xuIl19","/**\n * @license\n * Copyright 2020 Google LLC. All Rights Reserved.\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n * =============================================================================\n */\n// We explicitly import the modular kernels so they get registered in the\n// global registry when we compile the library. A modular build would replace\n// the contents of this file and import only the kernels that are needed.\nimport { registerKernel } from '@tensorflow/tfjs-core';\nimport { _fusedMatMulConfig } from './kernels/_FusedMatMul';\nimport { absConfig } from './kernels/Abs';\nimport { acosConfig } from './kernels/Acos';\nimport { acoshConfig } from './kernels/Acosh';\nimport { addConfig } from './kernels/Add';\nimport { addNConfig } from './kernels/AddN';\nimport { allConfig } from './kernels/All';\nimport { anyConfig } from './kernels/Any';\nimport { argMaxConfig } from './kernels/ArgMax';\nimport { argMinConfig } from './kernels/ArgMin';\nimport { asinConfig } from './kernels/Asin';\nimport { asinhConfig } from './kernels/Asinh';\nimport { atanConfig } from './kernels/Atan';\nimport { atan2Config } from './kernels/Atan2';\nimport { atanhConfig } from './kernels/Atanh';\nimport { avgPoolConfig } from './kernels/AvgPool';\nimport { avgPool3DConfig } from './kernels/AvgPool3D';\nimport { avgPool3DGradConfig } from './kernels/AvgPool3DGrad';\nimport { avgPoolGradConfig } from './kernels/AvgPoolGrad';\nimport { batchMatMulConfig } from './kernels/BatchMatMul';\nimport { batchNormConfig } from './kernels/BatchNorm';\nimport { batchToSpaceNDConfig } from './kernels/BatchToSpaceND';\nimport { bincountConfig } from './kernels/Bincount';\nimport { broadcastArgsConfig } from './kernels/BroadcastArgs';\nimport { castConfig } from './kernels/Cast';\nimport { ceilConfig } from './kernels/Ceil';\nimport { clipByValueConfig } from './kernels/ClipByValue';\nimport { complexConfig } from './kernels/Complex';\nimport { complexAbsConfig } from './kernels/ComplexAbs';\nimport { concatConfig } from './kernels/Concat';\nimport { conv2DConfig } from './kernels/Conv2D';\nimport { conv2DBackpropFilterConfig } from './kernels/Conv2DBackpropFilter';\nimport { conv2DBackpropInputConfig } from './kernels/Conv2DBackpropInput';\nimport { conv3DConfig } from './kernels/Conv3D';\nimport { conv3DBackpropFilterV2Config } from './kernels/Conv3DBackpropFilterV2';\nimport { conv3DBackpropInputV2Config } from './kernels/Conv3DBackpropInputV2';\nimport { cosConfig } from './kernels/Cos';\nimport { coshConfig } from './kernels/Cosh';\nimport { cropAndResizeConfig } from './kernels/CropAndResize';\nimport { cumprodConfig } from './kernels/Cumprod';\nimport { cumsumConfig } from './kernels/Cumsum';\nimport { denseBincountConfig } from './kernels/DenseBincount';\nimport { depthToSpaceConfig } from './kernels/DepthToSpace';\nimport { depthwiseConv2dNativeConfig } from './kernels/DepthwiseConv2dNative';\nimport { depthwiseConv2dNativeBackpropFilterConfig } from './kernels/DepthwiseConv2dNativeBackpropFilter';\nimport { depthwiseConv2dNativeBackpropInputConfig } from './kernels/DepthwiseConv2dNativeBackpropInput';\nimport { diagConfig } from './kernels/Diag';\nimport { dilation2DConfig } from './kernels/Dilation2D';\nimport { dilation2DBackpropFilterConfig } from './kernels/Dilation2DBackpropFilter';\nimport { dilation2DBackpropInputConfig } from './kernels/Dilation2DBackpropInput';\nimport { einsumConfig } from './kernels/Einsum';\nimport { eluConfig } from './kernels/Elu';\nimport { eluGradConfig } from './kernels/EluGrad';\nimport { equalConfig } from './kernels/Equal';\nimport { erfConfig } from './kernels/Erf';\nimport { expConfig } from './kernels/Exp';\nimport { expandDimsConfig } from './kernels/ExpandDims';\nimport { expm1Config } from './kernels/Expm1';\nimport { fftConfig } from './kernels/FFT';\nimport { fillConfig } from './kernels/Fill';\nimport { flipLeftRightConfig } from './kernels/FlipLeftRight';\nimport { floorConfig } from './kernels/Floor';\nimport { floorDivConfig } from './kernels/FloorDiv';\nimport { fusedConv2DConfig } from './kernels/FusedConv2D';\nimport { fusedDepthwiseConv2DConfig } from './kernels/FusedDepthwiseConv2D';\nimport { gatherNdConfig } from './kernels/GatherNd';\nimport { gatherV2Config } from './kernels/GatherV2';\nimport { greaterConfig } from './kernels/Greater';\nimport { greaterEqualConfig } from './kernels/GreaterEqual';\nimport { identityConfig } from './kernels/Identity';\nimport { ifftConfig } from './kernels/IFFT';\nimport { imagConfig } from './kernels/Imag';\nimport { isFiniteConfig } from './kernels/IsFinite';\nimport { isInfConfig } from './kernels/IsInf';\nimport { isNaNConfig } from './kernels/IsNaN';\nimport { leakyReluConfig } from './kernels/LeakyRelu';\nimport { lessConfig } from './kernels/Less';\nimport { lessEqualConfig } from './kernels/LessEqual';\nimport { linSpaceConfig } from './kernels/LinSpace';\nimport { logConfig } from './kernels/Log';\nimport { log1pConfig } from './kernels/Log1p';\nimport { logicalAndConfig } from './kernels/LogicalAnd';\nimport { logicalNotConfig } from './kernels/LogicalNot';\nimport { logicalOrConfig } from './kernels/LogicalOr';\nimport { LRNConfig } from './kernels/LRN';\nimport { LRNGradConfig } from './kernels/LRNGrad';\nimport { maxConfig } from './kernels/Max';\nimport { maximumConfig } from './kernels/Maximum';\nimport { maxPoolConfig } from './kernels/MaxPool';\nimport { maxPool3DConfig } from './kernels/MaxPool3D';\nimport { maxPool3DGradConfig } from './kernels/MaxPool3DGrad';\nimport { maxPoolGradConfig } from './kernels/MaxPoolGrad';\nimport { maxPoolWithArgmaxConfig } from './kernels/MaxPoolWithArgmax';\nimport { meanConfig } from './kernels/Mean';\nimport { minConfig } from './kernels/Min';\nimport { minimumConfig } from './kernels/Minimum';\nimport { mirrorPadConfig } from './kernels/MirrorPad';\nimport { modConfig } from './kernels/Mod';\nimport { multinomialConfig } from './kernels/Multinomial';\nimport { multiplyConfig } from './kernels/Multiply';\nimport { negConfig } from './kernels/Neg';\nimport { nonMaxSuppressionV3Config } from './kernels/NonMaxSuppressionV3';\nimport { nonMaxSuppressionV4Config } from './kernels/NonMaxSuppressionV4';\nimport { nonMaxSuppressionV5Config } from './kernels/NonMaxSuppressionV5';\nimport { notEqualConfig } from './kernels/NotEqual';\nimport { oneHotConfig } from './kernels/OneHot';\nimport { onesLikeConfig } from './kernels/OnesLike';\nimport { packConfig } from './kernels/Pack';\nimport { padV2Config } from './kernels/PadV2';\nimport { powConfig } from './kernels/Pow';\nimport { preluConfig } from './kernels/Prelu';\nimport { prodConfig } from './kernels/Prod';\nimport { raggedGatherConfig } from './kernels/RaggedGather';\nimport { raggedTensorToTensorConfig } from './kernels/RaggedTensorToTensor';\nimport { rangeConfig } from './kernels/Range';\nimport { realConfig } from './kernels/Real';\nimport { realDivConfig } from './kernels/RealDiv';\nimport { reciprocalConfig } from './kernels/Reciprocal';\nimport { reluConfig } from './kernels/Relu';\nimport { relu6Config } from './kernels/Relu6';\nimport { reshapeConfig } from './kernels/Reshape';\nimport { resizeBilinearConfig } from './kernels/ResizeBilinear';\nimport { resizeBilinearGradConfig } from './kernels/ResizeBilinearGrad';\nimport { resizeNearestNeighborConfig } from './kernels/ResizeNearestNeighbor';\nimport { resizeNearestNeighborGradConfig } from './kernels/ResizeNearestNeighborGrad';\nimport { reverseConfig } from './kernels/Reverse';\nimport { rotateWithOffsetConfig } from './kernels/RotateWithOffset';\nimport { roundConfig } from './kernels/Round';\nimport { rsqrtConfig } from './kernels/Rsqrt';\nimport { scatterNdConfig } from './kernels/ScatterNd';\nimport { searchSortedConfig } from './kernels/SearchSorted';\nimport { selectConfig } from './kernels/Select';\nimport { seluConfig } from './kernels/Selu';\nimport { sigmoidConfig } from './kernels/Sigmoid';\nimport { signConfig } from './kernels/Sign';\nimport { sinConfig } from './kernels/Sin';\nimport { sinhConfig } from './kernels/Sinh';\nimport { sliceConfig } from './kernels/Slice';\nimport { softmaxConfig } from './kernels/Softmax';\nimport { softplusConfig } from './kernels/Softplus';\nimport { spaceToBatchNDConfig } from './kernels/SpaceToBatchND';\nimport { sparseFillEmptyRowsConfig } from './kernels/SparseFillEmptyRows';\nimport { sparseReshapeConfig } from './kernels/SparseReshape';\nimport { sparseSegmentMeanConfig } from './kernels/SparseSegmentMean';\nimport { sparseSegmentSumConfig } from './kernels/SparseSegmentSum';\nimport { sparseToDenseConfig } from './kernels/SparseToDense';\nimport { splitVConfig } from './kernels/SplitV';\nimport { sqrtConfig } from './kernels/Sqrt';\nimport { squareConfig } from './kernels/Square';\nimport { squaredDifferenceConfig } from './kernels/SquaredDifference';\nimport { stepConfig } from './kernels/Step';\nimport { stridedSliceConfig } from './kernels/StridedSlice';\nimport { stringNGramsConfig } from './kernels/StringNGrams';\nimport { stringSplitConfig } from './kernels/StringSplit';\nimport { stringToHashBucketFastConfig } from './kernels/StringToHashBucketFast';\nimport { subConfig } from './kernels/Sub';\nimport { sumConfig } from './kernels/Sum';\nimport { tanConfig } from './kernels/Tan';\nimport { tanhConfig } from './kernels/Tanh';\nimport { tileConfig } from './kernels/Tile';\nimport { topKConfig } from './kernels/TopK';\nimport { transformConfig } from './kernels/Transform';\nimport { transposeConfig } from './kernels/Transpose';\nimport { uniqueConfig } from './kernels/Unique';\nimport { unpackConfig } from './kernels/Unpack';\nimport { unsortedSegmentSumConfig } from './kernels/UnsortedSegmentSum';\nimport { zerosLikeConfig } from './kernels/ZerosLike';\n// List all kernel configs here\nconst kernelConfigs = [\n _fusedMatMulConfig,\n absConfig,\n acosConfig,\n acoshConfig,\n addConfig,\n addNConfig,\n allConfig,\n anyConfig,\n argMaxConfig,\n argMinConfig,\n asinConfig,\n asinhConfig,\n atanConfig,\n atan2Config,\n atanhConfig,\n avgPoolConfig,\n avgPool3DConfig,\n avgPool3DGradConfig,\n avgPoolGradConfig,\n batchMatMulConfig,\n batchNormConfig,\n batchToSpaceNDConfig,\n bincountConfig,\n broadcastArgsConfig,\n castConfig,\n ceilConfig,\n clipByValueConfig,\n complexConfig,\n complexAbsConfig,\n concatConfig,\n conv2DConfig,\n conv2DBackpropFilterConfig,\n conv2DBackpropInputConfig,\n conv3DConfig,\n conv3DBackpropFilterV2Config,\n conv3DBackpropInputV2Config,\n cosConfig,\n coshConfig,\n cropAndResizeConfig,\n cumprodConfig,\n cumsumConfig,\n denseBincountConfig,\n depthToSpaceConfig,\n depthwiseConv2dNativeConfig,\n depthwiseConv2dNativeBackpropFilterConfig,\n depthwiseConv2dNativeBackpropInputConfig,\n diagConfig,\n dilation2DConfig,\n dilation2DBackpropFilterConfig,\n dilation2DBackpropInputConfig,\n einsumConfig,\n eluConfig,\n eluGradConfig,\n equalConfig,\n erfConfig,\n expConfig,\n expandDimsConfig,\n expm1Config,\n fftConfig,\n fillConfig,\n flipLeftRightConfig,\n floorConfig,\n floorDivConfig,\n fusedConv2DConfig,\n fusedDepthwiseConv2DConfig,\n gatherNdConfig,\n gatherV2Config,\n greaterConfig,\n greaterEqualConfig,\n identityConfig,\n ifftConfig,\n imagConfig,\n isFiniteConfig,\n isInfConfig,\n isNaNConfig,\n leakyReluConfig,\n lessConfig,\n lessEqualConfig,\n linSpaceConfig,\n logConfig,\n log1pConfig,\n logicalAndConfig,\n logicalNotConfig,\n logicalOrConfig,\n LRNConfig,\n LRNGradConfig,\n maxConfig,\n maximumConfig,\n maxPoolConfig,\n maxPool3DConfig,\n maxPool3DGradConfig,\n maxPoolGradConfig,\n maxPoolWithArgmaxConfig,\n meanConfig,\n minConfig,\n minimumConfig,\n mirrorPadConfig,\n modConfig,\n multinomialConfig,\n multiplyConfig,\n negConfig,\n nonMaxSuppressionV3Config,\n nonMaxSuppressionV4Config,\n nonMaxSuppressionV5Config,\n notEqualConfig,\n oneHotConfig,\n onesLikeConfig,\n packConfig,\n padV2Config,\n powConfig,\n preluConfig,\n prodConfig,\n raggedGatherConfig,\n raggedTensorToTensorConfig,\n rangeConfig,\n realConfig,\n realDivConfig,\n reciprocalConfig,\n reluConfig,\n relu6Config,\n reshapeConfig,\n resizeBilinearConfig,\n resizeBilinearGradConfig,\n resizeNearestNeighborConfig,\n resizeNearestNeighborGradConfig,\n reverseConfig,\n rotateWithOffsetConfig,\n roundConfig,\n rsqrtConfig,\n scatterNdConfig,\n searchSortedConfig,\n selectConfig,\n seluConfig,\n sigmoidConfig,\n signConfig,\n sinConfig,\n sinhConfig,\n sliceConfig,\n softmaxConfig,\n softplusConfig,\n spaceToBatchNDConfig,\n sparseFillEmptyRowsConfig,\n sparseReshapeConfig,\n sparseSegmentMeanConfig,\n sparseSegmentSumConfig,\n sparseToDenseConfig,\n splitVConfig,\n sqrtConfig,\n squareConfig,\n squaredDifferenceConfig,\n stepConfig,\n stridedSliceConfig,\n stringNGramsConfig,\n stringSplitConfig,\n stringToHashBucketFastConfig,\n subConfig,\n sumConfig,\n tanConfig,\n tanhConfig,\n tileConfig,\n topKConfig,\n transformConfig,\n transposeConfig,\n uniqueConfig,\n unpackConfig,\n unsortedSegmentSumConfig,\n zerosLikeConfig\n];\nfor (const kernelConfig of kernelConfigs) {\n registerKernel(kernelConfig);\n}\n//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicmVnaXN0ZXJfYWxsX2tlcm5lbHMuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi90ZmpzLWJhY2tlbmQtY3B1L3NyYy9yZWdpc3Rlcl9hbGxfa2VybmVscy50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQTs7Ozs7Ozs7Ozs7Ozs7O0dBZUc7QUFDSCx5RUFBeUU7QUFDekUsNkVBQTZFO0FBQzdFLHlFQUF5RTtBQUN6RSxPQUFPLEVBQWUsY0FBYyxFQUFDLE1BQU0sdUJBQXVCLENBQUM7QUFFbkUsT0FBTyxFQUFDLGtCQUFrQixFQUFDLE1BQU0sd0JBQXdCLENBQUM7QUFDMUQsT0FBTyxFQUFDLFNBQVMsRUFBQyxNQUFNLGVBQWUsQ0FBQztBQUN4QyxPQUFPLEVBQUMsVUFBVSxFQUFDLE1BQU0sZ0JBQWdCLENBQUM7QUFDMUMsT0FBTyxFQUFDLFdBQVcsRUFBQyxNQUFNLGlCQUFpQixDQUFDO0FBQzVDLE9BQU8sRUFBQyxTQUFTLEVBQUMsTUFBTSxlQUFlLENBQUM7QUFDeEMsT0FBTyxFQUFDLFVBQVUsRUFBQyxNQUFNLGdCQUFnQixDQUFDO0FBQzFDLE9BQU8sRUFBQyxTQUFTLEVBQUMsTUFBTSxlQUFlLENBQUM7QUFDeEMsT0FBTyxFQUFDLFNBQVMsRUFBQyxNQUFNLGVBQWUsQ0FBQztBQUN4QyxPQUFPLEVBQUMsWUFBWSxFQUFDLE1BQU0sa0JBQWtCLENBQUM7QUFDOUMsT0FBTyxFQUFDLFlBQVksRUFBQyxNQUFNLGtCQUFrQixDQUFDO0FBQzlDLE9BQU8sRUFBQyxVQUFVLEVBQUMsTUFBTSxnQkFBZ0IsQ0FBQztBQUMxQyxPQUFPLEVBQUMsV0FBVyxFQUFDLE1BQU0saUJBQWlCLENBQUM7QUFDNUMsT0FBTyxFQUFDLFVBQVUsRUFBQyxNQUFNLGdCQUFnQixDQUFDO0FBQzFDLE9BQU8sRUFBQyxXQUFXLEVBQUMsTUFBTSxpQkFBaUIsQ0FBQztBQUM1QyxPQUFPLEVBQUMsV0FBVyxFQUFDLE1BQU0saUJBQWlCLENB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WUFBWTtJQUNaLFVBQVU7SUFDVixhQUFhO0lBQ2IsVUFBVTtJQUNWLFNBQVM7SUFDVCxVQUFVO0lBQ1YsV0FBVztJQUNYLGFBQWE7SUFDYixjQUFjO0lBQ2Qsb0JBQW9CO0lBQ3BCLHlCQUF5QjtJQUN6QixtQkFBbUI7SUFDbkIsdUJBQXVCO0lBQ3ZCLHNCQUFzQjtJQUN0QixtQkFBbUI7SUFDbkIsWUFBWTtJQUNaLFVBQVU7SUFDVixZQUFZO0lBQ1osdUJBQXVCO0lBQ3ZCLFVBQVU7SUFDVixrQkFBa0I7SUFDbEIsa0JBQWtCO0lBQ2xCLGlCQUFpQjtJQUNqQiw0QkFBNEI7SUFDNUIsU0FBUztJQUNULFNBQVM7SUFDVCxTQUFTO0lBQ1QsVUFBVTtJQUNWLFVBQVU7SUFDVixVQUFVO0lBQ1YsZUFBZTtJQUNmLGVBQWU7SUFDZixZQUFZO0lBQ1osWUFBWTtJQUNaLHdCQUF3QjtJQUN4QixlQUFlO0NBQ2hCLENBQUM7QUFFRixLQUFLLE1BQU0sWUFBWSxJQUFJLGFBQWEsRUFBRTtJQUN4QyxjQUFjLENBQUMsWUFBWSxDQUFDLENBQUM7Q0FDOUIiLCJzb3VyY2VzQ29udGVudCI6WyIvKipcbiAqIEBsaWNlbnNlXG4gKiBDb3B5cmlnaHQgMjAyMCBHb29nbGUgTExDLiBBbGwgUmlnaHRzIFJlc2VydmVkLlxuICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlIFwiTGljZW5zZVwiKTtcbiAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS5cbiAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdFxuICpcbiAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMFxuICpcbiAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmVcbiAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuIFwiQVMgSVNcIiBCQVNJUyxcbiAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLlxuICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZFxuICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuXG4gKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuICovXG4vLyBXZSBleHBsaWNpdGx5IGltcG9ydCB0aGUgbW9kdWxhciBrZXJuZWxzIHNvIHRoZXkgZ2V0IHJlZ2lzdGVyZWQgaW4gdGhlXG4vLyBnbG9iYWwgcmVnaXN0cnkgd2hlbiB3ZSBjb21waWxlIHRoZSBsaWJyYXJ5LiBBIG1vZHVsYXIgYnVpbGQgd291bGQgcmVwbGFjZVxuLy8gdGhlIGNvbnRlbnRzIG9mIHRoaXMgZmlsZSBhbmQgaW1wb3J0IG9ubHkgdGhlIGtlcm5lbHMgdGhhdCBhcmUgbmVlZGVkLlxuaW1wb3J0IHtLZXJuZWxDb25maWcsIHJlZ2lzdGVyS2VybmVsfSBmcm9tICdAdGVuc29yZmxvdy90ZmpzLWNvcmUnO1xuXG5pbXBvcnQge19mdXNlZE1hdE11bENvbmZpZ30gZnJvbSAnLi9rZXJuZWxzL19GdXNlZE1hdE11bCc7XG5pbXBvcnQge2Fic0NvbmZpZ30gZnJvbSAnLi9rZXJuZWxzL0Ficyc7XG5pbXBvcnQge2Fjb3NDb25maWd9IGZyb20gJy4va2VybmVscy9BY29zJztcbmltcG9ydCB7YWNvc2hDb25maWd9IGZyb20gJy4va2VybmVscy9BY29zaCc7XG5pbXBvcnQge2FkZENvbmZpZ30gZnJvbSAnLi9rZXJuZWxzL0FkZCc7XG5pbXBvcnQge2FkZE5Db25maWd9IGZyb20gJy4va2VybmVscy9BZGROJztcbmltcG9ydCB7YWxsQ29uZmlnfSBmcm9tICcuL2tlcm5lbHMvQWxsJztcbmltcG9ydCB7YW55Q29uZmlnfSBmcm9tICcuL2tlcm5lbHMvQW55JztcbmltcG9ydCB7YXJnTWF4Q29uZmlnfSBmcm9tICcuL2tlcm5lbHMvQXJnTWF4JztcbmltcG9ydCB7YXJnTWluQ29uZmlnfSBmcm9tICcuL2tlcm5lbHMvQXJnTWluJztcbmltcG9ydCB7YXNpbkNvbmZpZ30gZnJvbSAnLi9rZXJuZWxzL0FzaW4nO1xuaW1wb3J0IHthc2luaENvbmZpZ30gZnJvbSAnLi9rZXJuZWxzL0FzaW5oJztcbmltcG9ydCB7YXRhbkNvbmZpZ30gZnJvbSAnLi9rZXJuZWxzL0F0YW4nO1xuaW1wb3J0IHthdGFuMkNvbmZpZ30gZnJvbSAnLi9rZXJuZWxzL0F0YW4yJztcbmltcG9ydCB7YXRhbmhDb25maWd9IGZyb20gJy4va2VybmVscy9BdGFuaCc7XG5pbXBvcnQge2F2Z1Bvb2xDb25maWd9IGZyb20gJy4va2VybmVscy9BdmdQb29sJztcbmltcG9ydCB7YXZnUG9vbDNEQ29uZmlnfSBmcm9tICcuL2tlcm5lbHMvQXZnUG9vbDNEJztcbmltcG9ydCB7YXZnUG9vbDNER3JhZENvbmZpZ30gZnJvbSAnLi9rZXJuZWxzL0F2Z1Bvb2wzREdyYWQnO1xuaW1wb3J0IHthdmdQb29sR3JhZENvbmZpZ30gZnJvbSAnLi9rZXJuZWxzL0F2Z1Bvb2xHcmFkJztcbmltcG9ydCB7YmF0Y2hNYXRNdWxDb25maWd9IGZyb20gJy4va2VybmVscy9CYXRjaE1hdE11bCc7XG5pbXBvcnQge2JhdGNoTm9ybUNvbmZpZ30gZnJvbSAnLi9rZXJuZWxzL0JhdGNoTm9ybSc7XG5pbXBvcnQge2JhdGNoVG9TcGFjZU5EQ29uZmlnfSBmcm9tICcuL2tlcm5lbHMvQmF0Y2hUb1NwYWNlTkQnO1xuaW1wb3J0IHtiaW5jb3VudENvbmZpZ30gZnJvbSAnLi9rZXJuZWxzL0JpbmNvdW50JztcbmltcG9ydCB7YnJvYWRjYXN0QXJnc0NvbmZpZ30gZnJvbSAnLi9rZXJuZWxzL0Jyb2FkY2FzdEFyZ3MnO1xuaW1wb3J0IHtjYXN0Q29uZmlnfSBmcm9tICcuL2tlcm5lbHMvQ2FzdCc7XG5pbXBvcnQge2NlaWxDb25maWd9IGZyb20gJy4va2VybmVscy9DZWlsJztcbmltcG9ydCB7Y2xpcEJ5VmFsdWVDb25maWd9IGZyb20gJy4va2VybmVscy9DbGlwQnlWYWx1ZSc7XG5pbXBvcnQge2NvbXBsZXhDb25maWd9IGZyb20gJy4va2VybmVscy9Db21wbGV4JztcbmltcG9ydCB7Y29tcGxleEFic0NvbmZpZ30gZnJvbSAnLi9rZXJuZWxzL0NvbXBsZXhBYnMnO1xuaW1wb3J0IHtjb25jYXRDb25maWd9IGZyb20gJy4va2VybmVscy9Db25jYXQnO1xuaW1wb3J0IHtjb252MkRDb25maWd9IGZyb20gJy4va2VybmVscy9Db252MkQnO1xuaW1wb3J0IHtjb252MkRCYWNrcHJvcEZpbHRlckNvbmZpZ30gZnJvbSAnLi9rZXJuZWxzL0NvbnYyREJhY2twcm9wRmlsdGVyJztcbmltcG9ydCB7Y29udjJEQmFja3Byb3BJbnB1dENvbmZpZ30gZnJvbSAnLi9rZXJuZWxzL0NvbnYyREJhY2twcm9wSW5wdXQnO1xuaW1wb3J0IHtjb252M0RDb25maWd9IGZyb20gJy4va2VybmVscy9Db252M0QnO1xuaW1wb3J0IHtjb252M0RCYWNrcHJvcEZpbHRlclYyQ29uZmlnfSBmcm9tICcuL2tlcm5lbHMvQ29udjNEQmFja3Byb3BGaWx0ZXJWMic7XG5pbXBvcnQge2NvbnYzREJhY2twcm9wSW5wdXRWMkNvbmZpZ30gZnJvbSAnLi9rZXJuZWxzL0NvbnYzREJhY2twcm9wSW5wdXRWMic7XG5pbXBvcnQge2Nvc0NvbmZpZ30gZnJvbSAnLi9rZXJuZWxzL0Nvcyc7XG5pbXBvcnQge2Nvc2hDb25maWd9IGZyb20gJy4va2VybmVscy9Db3NoJztcbmltcG9ydCB7Y3JvcEFuZFJlc2l6ZUNvbmZpZ30gZnJvbSAnLi9rZXJuZWxzL0Nyb3BBbmRSZXNpemUnO1xuaW1wb3J0IHtjdW1wcm9kQ29uZmlnfSBmcm9tICcuL2tlcm5lbHMvQ3VtcHJvZCc7XG5pbXBvcnQge2N1bXN1bUNvbmZpZ30gZnJvbSAnLi9rZXJuZWxzL0N1bXN1bSc7XG5pbXBvcnQge2RlbnNlQmluY291bnRDb25maWd9IGZyb20gJy4va2VybmVscy9EZW5zZUJpbmNvdW50JztcbmltcG9ydCB7ZGVwdGhUb1NwYWNlQ29uZmlnfSBmcm9tICcuL2tlcm5lbHMvRGVwdGhUb1NwYWNlJztcbmltcG9ydCB7ZGVwdGh3aXNlQ29udjJkTmF0aXZlQ29uZmlnfSBmcm9tICcuL2tlcm5lbHMvRGVwdGh3aXNlQ29udjJkTmF0aXZlJztcbmltcG9ydCB7ZGVwdGh3aXNlQ29udjJkTmF0aXZlQmFja3Byb3BGaWx0ZXJDb25maWd9IGZyb20gJy4va2VybmVscy9EZXB0aHdpc2VDb252MmROYXRpdmVCYWNrcHJvcEZpbHRlcic7XG5pbXBvcnQge2RlcHRod2lzZUNvbnYyZE5hdGl2ZUJhY2twcm9wSW5wdXRDb25maWd9IGZyb20gJy4va2VybmVscy9EZXB0aHdpc2VDb252MmROYXRpdmVCYWNrcHJvcElucHV0JztcbmltcG9ydCB7ZGlhZ0NvbmZpZ30gZnJvbSAnLi9rZXJuZWxzL0RpYWcnO1xuaW1wb3J0IHtkaWxhdGlvbjJEQ29uZmlnfSBmcm9tICcuL2tlcm5lbHMvRGlsYXRpb24yRCc7XG5pbXBvcnQge2RpbGF0aW9uMkRCYWNrcHJvcEZpbHRlckNvbmZpZ30gZnJvbSAnLi9rZXJuZWxzL0RpbGF0aW9uMkRCYWNrcHJvcEZpbHRlcic7XG5pbXBvcnQge2RpbGF0aW9uMkRCYWNrcHJvcElucHV0Q29uZmlnfSBmcm9tICcuL2tlcm5lbHMvRGlsYXRpb24yREJhY2twcm9wSW5wdXQnO1xuaW1wb3J0IHtlaW5zdW1Db25maWd9IGZyb20gJy4va2VybmVscy9FaW5zdW0nO1xuaW1wb3J0IHtlbHVDb25maWd9IGZyb20gJy4va2VybmVscy9FbHUnO1xuaW1wb3J0IHtlbHVHcmFkQ29uZmlnfSBmcm9tICcuL2tlcm5lbHMvRWx1R3JhZCc7XG5pbXBvcnQge2VxdWFsQ29uZmlnfSBmcm9tICcuL2tlcm5lbHMvRXF1YWwnO1xuaW1wb3J0IHtlcmZDb25maWd9IGZyb20gJy4va2VybmVscy9FcmYnO1xuaW1wb3J0IHtleHBDb25maWd9IGZyb20gJy4va2VybmVscy9FeHAnO1xuaW1wb3J0IHtleHBhbmREaW1zQ29uZmlnfSBmcm9tICcuL2tlcm5lbHMvRXhwYW5kRGltcyc7XG5pbXBvcnQge2V4cG0xQ29uZmlnfSBmcm9tICcuL2tlcm5lbHMvRXhwbTEnO1xuaW1wb3J0IHtmZnRDb25maWd9IGZyb20gJy4va2VybmVscy9GRlQnO1xuaW1wb3J0IHtmaWxsQ29uZmlnfSBmcm9tICcuL2tlcm5lbHMvRmlsbCc7XG5pbXBvcnQge2ZsaXBMZWZ0UmlnaHRDb25maWd9IGZyb20gJy4va2VybmVscy9GbGlwTGVmdFJpZ2h0JztcbmltcG9ydCB7Zmxvb3JDb25maWd9IGZyb20gJy4va2VybmVscy9GbG9vcic7XG5pbXBvcnQge2Zsb29yRGl2Q29uZmlnfSBmcm9tICcuL2tlcm5lbHMvRmxvb3JEaXYnO1xuaW1wb3J0IHtmdXNlZENvbnYyRENvbmZpZ30gZnJvbSAnLi9rZXJuZWxzL0Z1c2VkQ29udjJEJztcbmltcG9ydCB7ZnVzZWREZXB0aHdpc2VDb252MkRDb25maWd9IGZyb20gJy4va2VybmVscy9GdXNlZERlcHRod2lzZUNvbnYyRCc7XG5pbXBvcnQge2dhdGhlck5kQ29uZmlnfSBmcm9tICcuL2tlcm5lbHMvR2F0aGVyTmQnO1xuaW1wb3J0IHtnYXRoZXJWMkNvbmZpZ30gZnJvbSAnLi9rZXJuZWxzL0dhdGhlclYyJztcbmltcG9ydCB7Z3JlYXRlckNvbmZpZ30gZnJvbSAnLi9rZXJuZWxzL0dyZWF0ZXInO1xuaW1wb3J0IHtncmVhdGVyRXF1YWxDb25maWd9IGZyb20gJy4va2VybmVscy9HcmVhdGVyRXF1YWwnO1xuaW1wb3J0IHtpZGVudGl0eUNvbmZpZ30gZnJvbSAnLi9rZXJuZWxzL0lkZW50aXR5JztcbmltcG9ydCB7aWZmdENvbmZpZ30gZnJvbSAnLi9rZXJuZWxzL0lGRlQnO1xuaW1wb3J0IHtpbWFnQ29uZmlnfSBmcm9tICcuL2tlcm5lbHMvSW1hZyc7XG5pbXBvcnQge2lzRmluaXRlQ29uZmlnfSBmcm9tICcuL2tlcm5lbHMvSXNGaW5pdGUnO1xuaW1wb3J0IHtpc0luZkNvbmZpZ30gZnJvbSAnLi9rZXJuZWxzL0lzSW5mJztcbmltcG9ydCB7aXNOYU5Db25maWd9IGZyb20gJy4va2VybmVscy9Jc05hTic7XG5pbXBvcnQge2xlYWt5UmVsdUNvbmZpZ30gZnJvbSAnLi9rZXJuZWxzL0xlYWt5UmVsdSc7XG5pbXBvcnQge2xlc3NDb25maWd9IGZyb20gJy4va2VybmVscy9MZXNzJztcbmltcG9ydCB7bGVzc0VxdWFsQ29uZmlnfSBmcm9tICcuL2tlcm5lbHMvTGVzc0VxdWFsJztcbmltcG9ydCB7bGluU3BhY2VDb25maWd9IGZyb20gJy4va2VybmVscy9MaW5TcGFjZSc7XG5pbXBvcnQge2xvZ0NvbmZpZ30gZnJvbSAnLi9rZXJuZWxzL0xvZyc7XG5pbXBvcnQge2xvZzFwQ29uZmlnfSBmcm9tICcuL2tlcm5lbHMvTG9nMXAnO1xuaW1wb3J0IHtsb2dpY2FsQW5kQ29uZmlnfSBmcm9tICcuL2tlcm5lbHMvTG9naWNhbEFuZCc7XG5pbXBvcnQge2xvZ2ljYWxOb3RDb25maWd9IGZyb20gJy4va2VybmVscy9Mb2dpY2FsTm90JztcbmltcG9ydCB7bG9naWNhbE9yQ29uZmlnfSBmcm9tICcuL2tlcm5lbHMvTG9naWNhbE9yJztcbmltcG9ydCB7TFJOQ29uZmlnfSBmcm9tICcuL2tlcm5lbHMvTFJOJztcbmltcG9ydCB7TFJOR3JhZENvbmZpZ30gZnJvbSAnLi9rZXJuZWxzL0xSTkdyYWQnO1xuaW1wb3J0IHttYXhDb25maWd9IGZyb20gJy4va2VybmVscy9NYXgnO1xuaW1wb3J0IHttYXhpbXVtQ29uZmlnfSBmcm9tICcuL2tlcm5lbHMvTWF4aW11bSc7XG5pbXBvcnQge21heFBvb2xDb25maWd9IGZyb20gJy4va2VybmVscy9NYXhQb29sJztcbmltcG9ydCB7bWF4UG9vbDNEQ29uZmlnfSBmcm9tICcuL2tlcm5lbHMvTWF4UG9vbDNEJztcbmltcG9ydCB7bWF4UG9vbDNER3JhZENvbmZpZ30gZnJvbSAnLi9rZXJuZWxzL01heFBvb2wzREdyYWQnO1xuaW1wb3J0IHttYXhQb29sR3JhZENvbmZpZ30gZnJvbSAnLi9rZXJuZWxzL01heFBvb2xHcmFkJztcbmltcG9ydCB7bWF4UG9vbFdpdGhBcmdtYXhDb25maWd9IGZyb20gJy4va2VybmVscy9NYXhQb29sV2l0aEFyZ21heCc7XG5pbXBvcnQge21lYW5Db25maWd9IGZyb20gJy4va2VybmVscy9NZWFuJztcbmltcG9ydCB7bWluQ29uZmlnfSBmcm9tICcuL2tlcm5lbHMvTWluJztcbmltcG9ydCB7bWluaW11bUNvbmZpZ30gZnJvbSAnLi9rZXJuZWxzL01pbmltdW0nO1xuaW1wb3J0IHttaXJyb3JQYWRDb25maWd9IGZyb20gJy4va2VybmVscy9NaXJyb3JQYWQnO1xuaW1wb3J0IHttb2RDb25maWd9IGZyb20gJy4va2VybmVscy9Nb2QnO1xuaW1wb3J0IHttdWx0aW5vbWlhbENvbmZpZ30gZnJvbSAnLi9rZXJuZWxzL011bHRpbm9taWFsJztcbmltcG9ydCB7bXVsdGlwbHlDb25maWd9IGZyb20gJy4va2VybmVscy9NdWx0aXBseSc7XG5pbXBvcnQge25lZ0NvbmZpZ30gZnJvbSAnLi9rZXJuZWxzL05lZyc7XG5pbXBvcnQge25vbk1heFN1cHByZXNzaW9uVjNDb25maWd9IGZyb20gJy4va2VybmVscy9Ob25NYXhTdXBwcmVzc2lvblYzJztcbmltcG9ydCB7bm9uTWF4U3VwcHJlc3Npb25WNENvbmZpZ30gZnJvbSAnLi9rZXJuZWxzL05vbk1heFN1cHByZXNzaW9uVjQnO1xuaW1wb3J0IHtub25NYXhTdXBwcmVzc2lvblY1Q29uZmlnfSBmcm9tICcuL2tlcm5lbHMvTm9uTWF4U3VwcHJlc3Npb25WNSc7XG5pbXBvcnQge25vdEVxdWFsQ29uZmlnfSBmcm9tICcuL2tlcm5lbHMvTm90RXF1YWwnO1xuaW1wb3J0IHtvbmVIb3RDb25maWd9IGZyb20gJy4va2VybmVscy9PbmVIb3QnO1xuaW1wb3J0IHtvbmVzTGlrZUNvbmZpZ30gZnJvbSAnLi9rZXJuZWxzL09uZXNMaWtlJztcbmltcG9ydCB7cGFja0NvbmZpZ30gZnJvbSAnLi9rZXJuZWxzL1BhY2snO1xuaW1wb3J0IHtwYWRWMkNvbmZpZ30gZnJvbSAnLi9rZXJuZWxzL1BhZFYyJztcbmltcG9ydCB7cG93Q29uZmlnfSBmcm9tICcuL2tlcm5lbHMvUG93JztcbmltcG9ydCB7cHJlbHVDb25maWd9IGZyb20gJy4va2VybmVscy9QcmVsdSc7XG5pbXBvcnQge3Byb2RDb25maWd9IGZyb20gJy4va2VybmVscy9Qcm9kJztcbmltcG9ydCB7cmFnZ2VkR2F0aGVyQ29uZmlnfSBmcm9tICcuL2tlcm5lbHMvUmFnZ2VkR2F0aGVyJztcbmltcG9ydCB7cmFnZ2VkVGVuc29yVG9UZW5zb3JDb25maWd9IGZyb20gJy4va2VybmVscy9SYWdnZWRUZW5zb3JUb1RlbnNvcic7XG5pbXBvcnQge3JhbmdlQ29uZmlnfSBmcm9tICcuL2tlcm5lbHMvUmFuZ2UnO1xuaW1wb3J0IHtyZWFsQ29uZmlnfSBmcm9tICcuL2tlcm5lbHMvUmVhbCc7XG5pbXBvcnQge3JlYWxEaXZDb25maWd9IGZyb20gJy4va2VybmVscy9SZWFsRGl2JztcbmltcG9ydCB7cmVjaXByb2NhbENvbmZpZ30gZnJvbSAnLi9rZXJuZWxzL1JlY2lwcm9jYWwnO1xuaW1wb3J0IHtyZWx1Q29uZmlnfSBmcm9tICcuL2tlcm5lbHMvUmVsdSc7XG5pbXBvcnQge3JlbHU2Q29uZmlnfSBmcm9tICcuL2tlcm5lbHMvUmVsdTYnO1xuaW1wb3J0IHtyZXNoYXBlQ29uZmlnfSBmcm9tICcuL2tlcm5lbHMvUmVzaGFwZSc7XG5pbXBvcnQge3Jlc2l6ZUJpbGluZWFyQ29uZmlnfSBmcm9tICcuL2tlcm5lbHMvUmVzaXplQmlsaW5lYXInO1xuaW1wb3J0IHtyZXNpemVCaWxpbmVhckdyYWRDb25maWd9IGZyb20gJy4va2VybmVscy9SZXNpemVCaWxpbmVhckdyYWQnO1xuaW1wb3J0IHtyZXNpemVOZWFyZXN0TmVpZ2hib3JDb25maWd9IGZyb20gJy4va2VybmVscy9SZXNpemVOZWFyZXN0TmVpZ2hib3InO1xuaW1wb3J0IHtyZXNpemVOZWFyZXN0TmVpZ2hib3JHcmFkQ29uZmlnfSBmcm9tICcuL2tlcm5lbHMvUmVzaXplTmVhcmVzdE5laWdoYm9yR3JhZCc7XG5pbXBvcnQge3JldmVyc2VDb25maWd9IGZyb20gJy4va2VybmVscy9SZXZlcnNlJztcbmltcG9ydCB7cm90YXRlV2l0aE9mZnNldENvbmZpZ30gZnJvbSAnLi9rZXJuZWxzL1JvdGF0ZVdpdGhPZmZzZXQnO1xuaW1wb3J0IHtyb3VuZENvbmZpZ30gZnJvbSAnLi9rZXJuZWxzL1JvdW5kJztcbmltcG9ydCB7cnNxcnRDb25maWd9IGZyb20gJy4va2VybmVscy9Sc3FydCc7XG5pbXBvcnQge3NjYXR0ZXJOZENvbmZpZ30gZnJvbSAnLi9rZXJuZWxzL1NjYXR0ZXJOZCc7XG5pbXBvcnQge3NlYXJjaFNvcnRlZENvbmZpZ30gZnJvbSAnLi9rZXJuZWxzL1NlYXJjaFNvcnRlZCc7XG5pbXBvcnQge3NlbGVjdENvbmZpZ30gZnJvbSAnLi9rZXJuZWxzL1NlbGVjdCc7XG5pbXBvcnQge3NlbHVDb25maWd9IGZyb20gJy4va2VybmVscy9TZWx1JztcbmltcG9ydCB7c2lnbW9pZENvbmZpZ30gZnJvbSAnLi9rZXJuZWxzL1NpZ21vaWQnO1xuaW1wb3J0IHtzaWduQ29uZmlnfSBmcm9tICcuL2tlcm5lbHMvU2lnbic7XG5pbXBvcnQge3NpbkNvbmZpZ30gZnJvbSAnLi9rZXJuZWxzL1Npbic7XG5pbXBvcnQge3NpbmhDb25maWd9IGZyb20gJy4va2VybmVscy9TaW5oJztcbmltcG9ydCB7c2xpY2VDb25maWd9IGZyb20gJy4va2VybmVscy9TbGljZSc7XG5pbXBvcnQge3NvZnRtYXhDb25maWd9IGZyb20gJy4va2VybmVscy9Tb2Z0bWF4JztcbmltcG9ydCB7c29mdHBsdXNDb25maWd9IGZyb20gJy4va2VybmVscy9Tb2Z0cGx1cyc7XG5pbXBvcnQge3NwYWNlVG9CYXRjaE5EQ29uZmlnfSBmcm9tICcuL2tlcm5lbHMvU3BhY2VUb0JhdGNoTkQnO1xuaW1wb3J0IHtzcGFyc2VGaWxsRW1wdHlSb3dzQ29uZmlnfSBmcm9tICcuL2tlcm5lbHMvU3BhcnNlRmlsbEVtcHR5Um93cyc7XG5pbXBvcnQge3NwYXJzZVJlc2hhcGVDb25maWd9IGZyb20gJy4va2VybmVscy9TcGFyc2VSZXNoYXBlJztcbmltcG9ydCB7c3BhcnNlU2VnbWVudE1lYW5Db25maWd9IGZyb20gJy4va2VybmVscy9TcGFyc2VTZWdtZW50TWVhbic7XG5pbXBvcnQge3NwYXJzZVNlZ21lbnRTdW1Db25maWd9IGZyb20gJy4va2VybmVscy9TcGFyc2VTZWdtZW50U3VtJztcbmltcG9ydCB7c3BhcnNlVG9EZW5zZUNvbmZpZ30gZnJvbSAnLi9rZXJuZWxzL1NwYXJzZVRvRGVuc2UnO1xuaW1wb3J0IHtzcGxpdFZDb25maWd9IGZyb20gJy4va2VybmVscy9TcGxpdFYnO1xuaW1wb3J0IHtzcXJ0Q29uZmlnfSBmcm9tICcuL2tlcm5lbHMvU3FydCc7XG5pbXBvcnQge3NxdWFyZUNvbmZpZ30gZnJvbSAnLi9rZXJuZWxzL1NxdWFyZSc7XG5pbXBvcnQge3NxdWFyZWREaWZmZXJlbmNlQ29uZmlnfSBmcm9tICcuL2tlcm5lbHMvU3F1YXJlZERpZmZlcmVuY2UnO1xuaW1wb3J0IHtzdGVwQ29uZmlnfSBmcm9tICcuL2tlcm5lbHMvU3RlcCc7XG5pbXBvcnQge3N0cmlkZWRTbGljZUNvbmZpZ30gZnJvbSAnLi9rZXJuZWxzL1N0cmlkZWRTbGljZSc7XG5pbXBvcnQge3N0cmluZ05HcmFtc0NvbmZpZ30gZnJvbSAnLi9rZXJuZWxzL1N0cmluZ05HcmFtcyc7XG5pbXBvcnQge3N0cmluZ1NwbGl0Q29uZmlnfSBmcm9tICcuL2tlcm5lbHMvU3RyaW5nU3BsaXQnO1xuaW1wb3J0IHtzdHJpbmdUb0hhc2hCdWNrZXRGYXN0Q29uZmlnfSBmcm9tICcuL2tlcm5lbHMvU3RyaW5nVG9IYXNoQnVja2V0RmFzdCc7XG5pbXBvcnQge3N1YkNvbmZpZ30gZnJvbSAnLi9rZXJuZWxzL1N1Yic7XG5pbXBvcnQge3N1bUNvbmZpZ30gZnJvbSAnLi9rZXJuZWxzL1N1bSc7XG5pbXBvcnQge3RhbkNvbmZpZ30gZnJvbSAnLi9rZXJuZWxzL1Rhbic7XG5pbXBvcnQge3RhbmhDb25maWd9IGZyb20gJy4va2VybmVscy9UYW5oJztcbmltcG9ydCB7dGlsZUNvbmZpZ30gZnJvbSAnLi9rZXJuZWxzL1RpbGUnO1xuaW1wb3J0IHt0b3BLQ29uZmlnfSBmcm9tICcuL2tlcm5lbHMvVG9wSyc7XG5pbXBvcnQge3RyYW5zZm9ybUNvbmZpZ30gZnJvbSAnLi9rZXJuZWxzL1RyYW5zZm9ybSc7XG5pbXBvcnQge3RyYW5zcG9zZUNvbmZpZ30gZnJvbSAnLi9rZXJuZWxzL1RyYW5zcG9zZSc7XG5pbXBvcnQge3VuaXF1ZUNvbmZpZ30gZnJvbSAnLi9rZXJuZWxzL1VuaXF1ZSc7XG5pbXBvcnQge3VucGFja0NvbmZpZ30gZnJvbSAnLi9rZXJuZWxzL1VucGFjayc7XG5pbXBvcnQge3Vuc29ydGVkU2VnbWVudFN1bUNvbmZpZ30gZnJvbSAnLi9rZXJuZWxzL1Vuc29ydGVkU2VnbWVudFN1bSc7XG5pbXBvcnQge3plcm9zTGlrZUNvbmZpZ30gZnJvbSAnLi9rZXJuZWxzL1plcm9zTGlrZSc7XG5cbi8vIExpc3QgYWxsIGtlcm5lbCBjb25maWdzIGhlcmVcbmNvbnN0IGtlcm5lbENvbmZpZ3M6IEtlcm5lbENvbmZpZ1tdID0gW1xuICBfZnVzZWRNYXRNdWxDb25maWcsXG4gIGFic0NvbmZpZyxcbiAgYWNvc0NvbmZpZyxcbiAgYWNvc2hDb25maWcsXG4gIGFkZENvbmZpZyxcbiAgYWRkTkNvbmZpZyxcbiAgYWxsQ29uZmlnLFxuICBhbnlDb25maWcsXG4gIGFyZ01heENvbmZpZyxcbiAgYXJnTWluQ29uZmlnLFxuICBhc2luQ29uZmlnLFxuICBhc2luaENvbmZpZyxcbiAgYXRhbkNvbmZpZyxcbiAgYXRhbjJDb25maWcsXG4gIGF0YW5oQ29uZmlnLFxuICBhdmdQb29sQ29uZmlnLFxuICBhdmdQb29sM0RDb25maWcsXG4gIGF2Z1Bvb2wzREdyYWRDb25maWcsXG4gIGF2Z1Bvb2xHcmFkQ29uZmlnLFxuICBiYXRjaE1hdE11bENvbmZpZyxcbiAgYmF0Y2hOb3JtQ29uZmlnLFxuICBiYXRjaFRvU3BhY2VORENvbmZpZyxcbiAgYmluY291bnRDb25maWcsXG4gIGJyb2FkY2FzdEFyZ3NDb25maWcsXG4gIGNhc3RDb25maWcsXG4gIGNlaWxDb25maWcsXG4gIGNsaXBCeVZhbHVlQ29uZmlnLFxuICBjb21wbGV4Q29uZmlnLFxuICBjb21wbGV4QWJzQ29uZmlnLFxuICBjb25jYXRDb25maWcsXG4gIGNvbnYyRENvbmZpZyxcbiAgY29udjJEQmFja3Byb3BGaWx0ZXJDb25maWcsXG4gIGNvbnYyREJhY2twcm9wSW5wdXRDb25maWcsXG4gIGNvbnYzRENvbmZpZyxcbiAgY29udjNEQmFja3Byb3BGaWx0ZXJWMkNvbmZpZyxcbiAgY29udjNEQmFja3Byb3BJbnB1dFYyQ29uZmlnLFxuICBjb3NDb25maWcsXG4gIGNvc2hDb25maWcsXG4gIGNyb3BBbmRSZXNpemVDb25maWcsXG4gIGN1bXByb2RDb25maWcsXG4gIGN1bXN1bUNvbmZpZyxcbiAgZGVuc2VCaW5jb3VudENvbmZpZyxcbiAgZGVwdGhUb1NwYWNlQ29uZmlnLFxuICBkZXB0aHdpc2VDb252MmROYXRpdmVDb25maWcsXG4gIGRlcHRod2lzZUNvbnYyZE5hdGl2ZUJhY2twcm9wRmlsdGVyQ29uZmlnLFxuICBkZXB0aHdpc2VDb252MmROYXRpdmVCYWNrcHJvcElucHV0Q29uZmlnLFxuICBkaWFnQ29uZmlnLFxuICBkaWxhdGlvbjJEQ29uZmlnLFxuICBkaWxhdGlvbjJEQmFja3Byb3BGaWx0ZXJDb25maWcsXG4gIGRpbGF0aW9uMkRCYWNrcHJvcElucHV0Q29uZmlnLFxuICBlaW5zdW1Db25maWcsXG4gIGVsdUNvbmZpZyxcbiAgZWx1R3JhZENvbmZpZyxcbiAgZXF1YWxDb25maWcsXG4gIGVyZkNvbmZpZyxcbiAgZXhwQ29uZmlnLFxuICBleHBhbmREaW1zQ29uZmlnLFxuICBleHBtMUNvbmZpZyxcbiAgZmZ0Q29uZmlnLFxuICBmaWxsQ29uZmlnLFxuICBmbGlwTGVmdFJpZ2h0Q29uZmlnLFxuICBmbG9vckNvbmZpZyxcbiAgZmxvb3JEaXZDb25maWcsXG4gIGZ1c2VkQ29udjJEQ29uZmlnLFxuICBmdXNlZERlcHRod2lzZUNvbnYyRENvbmZpZyxcbiAgZ2F0aGVyTmRDb25maWcsXG4gIGdhdGhlclYyQ29uZmlnLFxuICBncmVhdGVyQ29uZmlnLFxuICBncmVhdGVyRXF1YWxDb25maWcsXG4gIGlkZW50aXR5Q29uZmlnLFxuICBpZmZ0Q29uZmlnLFxuICBpbWFnQ29uZmlnLFxuICBpc0Zpbml0ZUNvbmZpZyxcbiAgaXNJbmZDb25maWcsXG4gIGlzTmFOQ29uZmlnLFxuICBsZWFreVJlbHVDb25maWcsXG4gIGxlc3NDb25maWcsXG4gIGxlc3NFcXVhbENvbmZpZyxcbiAgbGluU3BhY2VDb25maWcsXG4gIGxvZ0NvbmZpZyxcbiAgbG9nMXBDb25maWcsXG4gIGxvZ2ljYWxBbmRDb25maWcsXG4gIGxvZ2ljYWxOb3RDb25maWcsXG4gIGxvZ2ljYWxPckNvbmZpZyxcbiAgTFJOQ29uZmlnLFxuICBMUk5HcmFkQ29uZmlnLFxuICBtYXhDb25maWcsXG4gIG1heGltdW1Db25maWcsXG4gIG1heFBvb2xDb25maWcsXG4gIG1heFBvb2wzRENvbmZpZyxcbiAgbWF4UG9vbDNER3JhZENvbmZpZyxcbiAgbWF4UG9vbEdyYWRDb25maWcsXG4gIG1heFBvb2xXaXRoQXJnbWF4Q29uZmlnLFxuICBtZWFuQ29uZmlnLFxuICBtaW5Db25maWcsXG4gIG1pbmltdW1Db25maWcsXG4gIG1pcnJvclBhZENvbmZpZyxcbiAgbW9kQ29uZmlnLFxuICBtdWx0aW5vbWlhbENvbmZpZyxcbiAgbXVsdGlwbHlDb25maWcsXG4gIG5lZ0NvbmZpZyxcbiAgbm9uTWF4U3VwcHJlc3Npb25WM0NvbmZpZyxcbiAgbm9uTWF4U3VwcHJlc3Npb25WNENvbmZpZyxcbiAgbm9uTWF4U3VwcHJlc3Npb25WNUNvbmZpZyxcbiAgbm90RXF1YWxDb25maWcsXG4gIG9uZUhvdENvbmZpZyxcbiAgb25lc0xpa2VDb25maWcsXG4gIHBhY2tDb25maWcsXG4gIHBhZFYyQ29uZmlnLFxuICBwb3dDb25maWcsXG4gIHByZWx1Q29uZmlnLFxuICBwcm9kQ29uZmlnLFxuICByYWdnZWRHYXRoZXJDb25maWcsXG4gIHJhZ2dlZFRlbnNvclRvVGVuc29yQ29uZmlnLFxuICByYW5nZUNvbmZpZyxcbiAgcmVhbENvbmZpZyxcbiAgcmVhbERpdkNvbmZpZyxcbiAgcmVjaXByb2NhbENvbmZpZyxcbiAgcmVsdUNvbmZpZyxcbiAgcmVsdTZDb25maWcsXG4gIHJlc2hhcGVDb25maWcsXG4gIHJlc2l6ZUJpbGluZWFyQ29uZmlnLFxuICByZXNpemVCaWxpbmVhckdyYWRDb25maWcsXG4gIHJlc2l6ZU5lYXJlc3ROZWlnaGJvckNvbmZpZyxcbiAgcmVzaXplTmVhcmVzdE5laWdoYm9yR3JhZENvbmZpZyxcbiAgcmV2ZXJzZUNvbmZpZyxcbiAgcm90YXRlV2l0aE9mZnNldENvbmZpZyxcbiAgcm91bmRDb25maWcsXG4gIHJzcXJ0Q29uZmlnLFxuICBzY2F0dGVyTmRDb25maWcsXG4gIHNlYXJjaFNvcnRlZENvbmZpZyxcbiAgc2VsZWN0Q29uZmlnLFxuICBzZWx1Q29uZmlnLFxuICBzaWdtb2lkQ29uZmlnLFxuICBzaWduQ29uZmlnLFxuICBzaW5Db25maWcsXG4gIHNpbmhDb25maWcsXG4gIHNsaWNlQ29uZmlnLFxuICBzb2Z0bWF4Q29uZmlnLFxuICBzb2Z0cGx1c0NvbmZpZyxcbiAgc3BhY2VUb0JhdGNoTkRDb25maWcsXG4gIHNwYXJzZUZpbGxFbXB0eVJvd3NDb25maWcsXG4gIHNwYXJzZVJlc2hhcGVDb25maWcsXG4gIHNwYXJzZVNlZ21lbnRNZWFuQ29uZmlnLFxuICBzcGFyc2VTZWdtZW50U3VtQ29uZmlnLFxuICBzcGFyc2VUb0RlbnNlQ29uZmlnLFxuICBzcGxpdFZDb25maWcsXG4gIHNxcnRDb25maWcsXG4gIHNxdWFyZUNvbmZpZyxcbiAgc3F1YXJlZERpZmZlcmVuY2VDb25maWcsXG4gIHN0ZXBDb25maWcsXG4gIHN0cmlkZWRTbGljZUNvbmZpZyxcbiAgc3RyaW5nTkdyYW1zQ29uZmlnLFxuICBzdHJpbmdTcGxpdENvbmZpZyxcbiAgc3RyaW5nVG9IYXNoQnVja2V0RmFzdENvbmZpZyxcbiAgc3ViQ29uZmlnLFxuICBzdW1Db25maWcsXG4gIHRhbkNvbmZpZyxcbiAgdGFuaENvbmZpZyxcbiAgdGlsZUNvbmZpZyxcbiAgdG9wS0NvbmZpZyxcbiAgdHJhbnNmb3JtQ29uZmlnLFxuICB0cmFuc3Bvc2VDb25maWcsXG4gIHVuaXF1ZUNvbmZpZyxcbiAgdW5wYWNrQ29uZmlnLFxuICB1bnNvcnRlZFNlZ21lbnRTdW1Db25maWcsXG4gIHplcm9zTGlrZUNvbmZpZ1xuXTtcblxuZm9yIChjb25zdCBrZXJuZWxDb25maWcgb2Yga2VybmVsQ29uZmlncykge1xuICByZWdpc3Rlcktlcm5lbChrZXJuZWxDb25maWcpO1xufVxuIl19","/**\n * @license\n * Copyright 2018 Google LLC. All Rights Reserved.\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n * =============================================================================\n */\nimport { env } from '@tensorflow/tfjs-core';\nconst contexts = {};\nconst WEBGL_ATTRIBUTES = {\n alpha: false,\n antialias: false,\n premultipliedAlpha: false,\n preserveDrawingBuffer: false,\n depth: false,\n stencil: false,\n failIfMajorPerformanceCaveat: true\n};\nexport function clearWebGLContext(webGLVersion) {\n delete contexts[webGLVersion];\n}\nexport function setWebGLContext(webGLVersion, gl) {\n contexts[webGLVersion] = gl;\n}\nexport function getWebGLContext(webGLVersion, customCanvas) {\n if (!(webGLVersion in contexts) || customCanvas != null) {\n const newCtx = getWebGLRenderingContext(webGLVersion, customCanvas);\n if (newCtx !== null) {\n contexts[webGLVersion] = newCtx;\n }\n else {\n console.log('Could not get context for WebGL version', webGLVersion);\n return null;\n }\n }\n const gl = contexts[webGLVersion];\n if (gl == null || gl.isContextLost()) {\n delete contexts[webGLVersion];\n return getWebGLContext(webGLVersion);\n }\n gl.disable(gl.DEPTH_TEST);\n gl.disable(gl.STENCIL_TEST);\n gl.disable(gl.BLEND);\n gl.disable(gl.DITHER);\n gl.disable(gl.POLYGON_OFFSET_FILL);\n gl.disable(gl.SAMPLE_COVERAGE);\n gl.enable(gl.SCISSOR_TEST);\n gl.enable(gl.CULL_FACE);\n gl.cullFace(gl.BACK);\n return contexts[webGLVersion];\n}\nfunction createCanvas(webGLVersion) {\n if (typeof OffscreenCanvas !== 'undefined' && webGLVersion === 2) {\n return new OffscreenCanvas(300, 150);\n }\n else if (typeof document !== 'undefined') {\n return document.createElement('canvas');\n }\n else {\n throw new Error('Cannot create a canvas in this context');\n }\n}\nfunction getWebGLRenderingContext(webGLVersion, customCanvas) {\n if (webGLVersion !== 1 && webGLVersion !== 2) {\n throw new Error('Cannot get WebGL rendering context, WebGL is disabled.');\n }\n const canvas = customCanvas == null ? createCanvas(webGLVersion) : customCanvas;\n canvas.addEventListener('webglcontextlost', (ev) => {\n ev.preventDefault();\n delete contexts[webGLVersion];\n }, false);\n if (env().getBool('SOFTWARE_WEBGL_ENABLED')) {\n WEBGL_ATTRIBUTES.failIfMajorPerformanceCaveat = false;\n }\n if (webGLVersion === 1) {\n return (canvas.getContext('webgl', WEBGL_ATTRIBUTES) ||\n canvas.getContext('experimental-webgl', WEBGL_ATTRIBUTES));\n }\n return canvas.getContext('webgl2', WEBGL_ATTRIBUTES);\n}\n//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY2FudmFzX3V0aWwuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi90ZmpzLWJhY2tlbmQtd2ViZ2wvc3JjL2NhbnZhc191dGlsLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBOzs7Ozs7Ozs7Ozs7Ozs7R0FlRztBQUVILE9BQU8sRUFBQyxHQUFHLEVBQUMsTUFBTSx1QkFBdUIsQ0FBQztBQUUxQyxNQUFNLFFBQVEsR0FBMkMsRUFBRSxDQUFDO0FBRTVELE1BQU0sZ0JBQWdCLEdBQTJCO0lBQy9DLEtBQUssRUFBRSxLQUFLO0lBQ1osU0FBUyxFQUFFLEtBQUs7SUFDaEIsa0JBQWtCLEVBQUUsS0FBSztJQUN6QixxQkFBcUIsRUFBRSxLQUFLO0lBQzVCLEtBQUssRUFBRSxLQUFLO0lBQ1osT0FBTyxFQUFFLEtBQUs7SUFDZCw0QkFBNEIsRUFBRSxJQUFJO0NBQ25DLENBQUM7QUFFRixNQUFNLFVBQVUsaUJBQWlCLENBQUMsWUFBb0I7SUFDcEQsT0FBTyxRQUFRLENBQUMsWUFBWSxDQUFDLENBQUM7QUFDaEMsQ0FBQztBQUVELE1BQU0sVUFBVSxlQUFlLENBQzNCLFlBQW9CLEVBQUUsRUFBeUI7SUFDakQsUUFBUSxDQUFDLFlBQVksQ0FBQyxHQUFHLEVBQUUsQ0FBQztBQUM5QixDQUFDO0FBRUQsTUFBTSxVQUFVLGVBQWUsQ0FDM0IsWUFBb0IsRUFDcEIsWUFBZ0Q7SUFDbEQsSUFBSSxDQUFDLENBQUMsWUFBWSxJQUFJLFFBQVEsQ0FBQyxJQUFJLFlBQVksSUFBSSxJQUFJLEVBQUU7UUFDdkQsTUFBTSxNQUFNLEdBQUcsd0JBQXdCLENBQUMsWUFBWSxFQUFFLFlBQVksQ0FBQyxDQUFDO1FBQ3BFLElBQUksTUFBTSxLQUFLLElBQUksRUFBRTtZQUNuQixRQUFRLENBQUMsWUFBWSxDQUFDLEdBQUcsTUFBTSxDQUFDO1NBQ2pDO2FBQU07WUFDTCxPQUFPLENBQUMsR0FBRyxDQUFDLHlDQUF5QyxFQUFFLFlBQVksQ0FBQyxDQUFDO1lBQ3JFLE9BQU8sSUFBSSxDQUFDO1NBQ2I7S0FDRjtJQUNELE1BQU0sRUFBRSxHQUFHLFFBQVEsQ0FBQyxZQUFZLENBQUMsQ0FBQztJQUNsQyxJQUFJLEVBQUUsSUFBSSxJQUFJLElBQUksRUFBRSxDQUFDLGFBQWEsRUFBRSxFQUFFO1FBQ3BDLE9BQU8sUUFBUSxDQUFDLFlBQVksQ0FBQyxDQUFDO1FBQzlCLE9BQU8sZUFBZSxDQUFDLFlBQVksQ0FBQyxDQUFDO0tBQ3RDO0lBRUQsRUFBRSxDQUFDLE9BQU8sQ0FBQyxFQUFFLENBQUMsVUFBVSxDQUFDLENBQUM7SUFDMUIsRUFBRSxDQUFDLE9BQU8sQ0FBQyxFQUFFLENBQUMsWUFBWSxDQUFDLENBQUM7SUFDNUIsRUFBRSxDQUFDLE9BQU8sQ0FBQyxFQUFFLENBQUMsS0FBSyxDQUFDLENBQUM7SUFDckIsRUFBRSxDQUFDLE9BQU8sQ0FBQyxFQUFFLENBQUMsTUFBTSxDQUFDLENBQUM7SUFDdEIsRUFBRSxDQUFDLE9BQU8sQ0FBQyxFQUFFLENBQUMsbUJBQW1CLENBQUMsQ0FBQztJQUNuQyxFQUFFLENBQUMsT0FBTyxDQUFDLEVBQUUsQ0FBQyxlQUFlLENBQUMsQ0FBQztJQUMvQixFQUFFLENBQUMsTUFBTSxDQUFDLEVBQUUsQ0FBQyxZQUFZLENBQUMsQ0FBQztJQUMzQixFQUFFLENBQUMsTUFBTSxDQUFDLEVBQUUsQ0FBQyxTQUFTLENBQUMsQ0FBQztJQUN4QixFQUFFLENBQUMsUUFBUSxDQUFDLEVBQUUsQ0FBQyxJQUFJLENBQUMsQ0FBQztJQUVyQixPQUFPLFFBQVEsQ0FBQyxZQUFZLENBQUMsQ0FBQztBQUNoQyxDQUFDO0FBRUQsU0FBUyxZQUFZLENBQUMsWUFBb0I7SUFDeEMsSUFBSSxPQUFPLGVBQWUsS0FBSyxXQUFXLElBQUksWUFBWSxLQUFLLENBQUMsRUFBRTtRQUNoRSxPQUFPLElBQUksZUFBZSxDQUFDLEdBQUcsRUFBRSxHQUFHLENBQUMsQ0FBQztLQUN0QztTQUFNLElBQUksT0FBTyxRQUFRLEtBQUssV0FBVyxFQUFFO1FBQzFDLE9BQU8sUUFBUSxDQUFDLGFBQWEsQ0FBQyxRQUFRLENBQUMsQ0FBQztLQUN6QztTQUFNO1FBQ0wsTUFBTSxJQUFJLEtBQUssQ0FBQyx3Q0FBd0MsQ0FBQyxDQUFDO0tBQzNEO0FBQ0gsQ0FBQztBQUVELFNBQVMsd0JBQXdCLENBQzdCLFlBQW9CLEVBQ3BCLFlBQWdEO0lBQ2xELElBQUksWUFBWSxLQUFLLENBQUMsSUFBSSxZQUFZLEtBQUssQ0FBQyxFQUFFO1FBQzVDLE1BQU0sSUFBSSxLQUFLLENBQUMsd0RBQXdELENBQUMsQ0FBQztLQUMzRTtJQUNELE1BQU0sTUFBTSxHQUNSLFlBQVksSUFBSSxJQUFJLENBQUMsQ0FBQyxDQUFDLFlBQVksQ0FBQyxZQUFZLENBQUMsQ0FBQyxDQUFDLENBQUMsWUFBWSxDQUFDO0lBRXJFLE1BQU0sQ0FBQyxnQkFBZ0IsQ0FBQyxrQkFBa0IsRUFBRSxDQUFDLEVBQVMsRUFBRSxFQUFFO1FBQ3hELEVBQUUsQ0FBQyxjQUFjLEVBQUUsQ0FBQztRQUNwQixPQUFPLFFBQVEsQ0FBQyxZQUFZLENBQUMsQ0FBQztJQUNoQyxDQUFDLEVBQUUsS0FBSyxDQUFDLENBQUM7SUFFVixJQUFJLEdBQUcsRUFBRSxDQUFDLE9BQU8sQ0FBQyx3QkFBd0IsQ0FBQyxFQUFFO1FBQzNDLGdCQUFnQixDQUFDLDRCQUE0QixHQUFHLEtBQUssQ0FBQztLQUN2RDtJQUVELElBQUksWUFBWSxLQUFLLENBQUMsRUFBRTtRQUN0QixPQUFPLENBQUMsTUFBTSxDQUFDLFVBQVUsQ0FBQyxPQUFPLEVBQUUsZ0JBQWdCLENBQUM7WUFDNUMsTUFBTSxDQUFDLFVBQVUsQ0FBQyxvQkFBb0IsRUFBRSxnQkFBZ0IsQ0FBQyxDQUN4QyxDQUFDO0tBQzNCO0lBQ0QsT0FBTyxNQUFNLENBQUMsVUFBVSxDQUFDLFFBQVEsRUFBRSxnQkFBZ0IsQ0FBMEIsQ0FBQztBQUNoRixDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiLyoqXG4gKiBAbGljZW5zZVxuICogQ29weXJpZ2h0IDIwMTggR29vZ2xlIExMQy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC5cbiAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSBcIkxpY2Vuc2VcIik7XG4gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuXG4gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXRcbiAqXG4gKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjBcbiAqXG4gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlXG4gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiBcIkFTIElTXCIgQkFTSVMsXG4gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC5cbiAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmRcbiAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLlxuICogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbiAqL1xuXG5pbXBvcnQge2Vudn0gZnJvbSAnQHRlbnNvcmZsb3cvdGZqcy1jb3JlJztcblxuY29uc3QgY29udGV4dHM6IHtba2V5OiBzdHJpbmddOiBXZWJHTFJlbmRlcmluZ0NvbnRleHR9ID0ge307XG5cbmNvbnN0IFdFQkdMX0FUVFJJQlVURVM6IFdlYkdMQ29udGV4dEF0dHJpYnV0ZXMgPSB7XG4gIGFscGhhOiBmYWxzZSxcbiAgYW50aWFsaWFzOiBmYWxzZSxcbiAgcHJlbXVsdGlwbGllZEFscGhhOiBmYWxzZSxcbiAgcHJlc2VydmVEcmF3aW5nQnVmZmVyOiBmYWxzZSxcbiAgZGVwdGg6IGZhbHNlLFxuICBzdGVuY2lsOiBmYWxzZSxcbiAgZmFpbElmTWFqb3JQZXJmb3JtYW5jZUNhdmVhdDogdHJ1ZVxufTtcblxuZXhwb3J0IGZ1bmN0aW9uIGNsZWFyV2ViR0xDb250ZXh0KHdlYkdMVmVyc2lvbjogbnVtYmVyKSB7XG4gIGRlbGV0ZSBjb250ZXh0c1t3ZWJHTFZlcnNpb25dO1xufVxuXG5leHBvcnQgZnVuY3Rpb24gc2V0V2ViR0xDb250ZXh0KFxuICAgIHdlYkdMVmVyc2lvbjogbnVtYmVyLCBnbDogV2ViR0xSZW5kZXJpbmdDb250ZXh0KSB7XG4gIGNvbnRleHRzW3dlYkdMVmVyc2lvbl0gPSBnbDtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGdldFdlYkdMQ29udGV4dChcbiAgICB3ZWJHTFZlcnNpb246IG51bWJlcixcbiAgICBjdXN0b21DYW52YXM/OiBIVE1MQ2FudmFzRWxlbWVudHxPZmZzY3JlZW5DYW52YXMpOiBXZWJHTFJlbmRlcmluZ0NvbnRleHQge1xuICBpZiAoISh3ZWJHTFZlcnNpb24gaW4gY29udGV4dHMpIHx8IGN1c3RvbUNhbnZhcyAhPSBudWxsKSB7XG4gICAgY29uc3QgbmV3Q3R4ID0gZ2V0V2ViR0xSZW5kZXJpbmdDb250ZXh0KHdlYkdMVmVyc2lvbiwgY3VzdG9tQ2FudmFzKTtcbiAgICBpZiAobmV3Q3R4ICE9PSBudWxsKSB7XG4gICAgICBjb250ZXh0c1t3ZWJHTFZlcnNpb25dID0gbmV3Q3R4O1xuICAgIH0gZWxzZSB7XG4gICAgICBjb25zb2xlLmxvZygnQ291bGQgbm90IGdldCBjb250ZXh0IGZvciBXZWJHTCB2ZXJzaW9uJywgd2ViR0xWZXJzaW9uKTtcbiAgICAgIHJldHVybiBudWxsO1xuICAgIH1cbiAgfVxuICBjb25zdCBnbCA9IGNvbnRleHRzW3dlYkdMVmVyc2lvbl07XG4gIGlmIChnbCA9PSBudWxsIHx8IGdsLmlzQ29udGV4dExvc3QoKSkge1xuICAgIGRlbGV0ZSBjb250ZXh0c1t3ZWJHTFZlcnNpb25dO1xuICAgIHJldHVybiBnZXRXZWJHTENvbnRleHQod2ViR0xWZXJzaW9uKTtcbiAgfVxuXG4gIGdsLmRpc2FibGUoZ2wuREVQVEhfVEVTVCk7XG4gIGdsLmRpc2FibGUoZ2wuU1RFTkNJTF9URVNUKTtcbiAgZ2wuZGlzYWJsZShnbC5CTEVORCk7XG4gIGdsLmRpc2FibGUoZ2wuRElUSEVSKTtcbiAgZ2wuZGlzYWJsZShnbC5QT0xZR09OX09GRlNFVF9GSUxMKTtcbiAgZ2wuZGlzYWJsZShnbC5TQU1QTEVfQ09WRVJBR0UpO1xuICBnbC5lbmFibGUoZ2wuU0NJU1NPUl9URVNUKTtcbiAgZ2wuZW5hYmxlKGdsLkNVTExfRkFDRSk7XG4gIGdsLmN1bGxGYWNlKGdsLkJBQ0spO1xuXG4gIHJldHVybiBjb250ZXh0c1t3ZWJHTFZlcnNpb25dO1xufVxuXG5mdW5jdGlvbiBjcmVhdGVDYW52YXMod2ViR0xWZXJzaW9uOiBudW1iZXIpIHtcbiAgaWYgKHR5cGVvZiBPZmZzY3JlZW5DYW52YXMgIT09ICd1bmRlZmluZWQnICYmIHdlYkdMVmVyc2lvbiA9PT0gMikge1xuICAgIHJldHVybiBuZXcgT2Zmc2NyZWVuQ2FudmFzKDMwMCwgMTUwKTtcbiAgfSBlbHNlIGlmICh0eXBlb2YgZG9jdW1lbnQgIT09ICd1bmRlZmluZWQnKSB7XG4gICAgcmV0dXJuIGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ2NhbnZhcycpO1xuICB9IGVsc2Uge1xuICAgIHRocm93IG5ldyBFcnJvcignQ2Fubm90IGNyZWF0ZSBhIGNhbnZhcyBpbiB0aGlzIGNvbnRleHQnKTtcbiAgfVxufVxuXG5mdW5jdGlvbiBnZXRXZWJHTFJlbmRlcmluZ0NvbnRleHQoXG4gICAgd2ViR0xWZXJzaW9uOiBudW1iZXIsXG4gICAgY3VzdG9tQ2FudmFzPzogSFRNTENhbnZhc0VsZW1lbnR8T2Zmc2NyZWVuQ2FudmFzKTogV2ViR0xSZW5kZXJpbmdDb250ZXh0IHtcbiAgaWYgKHdlYkdMVmVyc2lvbiAhPT0gMSAmJiB3ZWJHTFZlcnNpb24gIT09IDIpIHtcbiAgICB0aHJvdyBuZXcgRXJyb3IoJ0Nhbm5vdCBnZXQgV2ViR0wgcmVuZGVyaW5nIGNvbnRleHQsIFdlYkdMIGlzIGRpc2FibGVkLicpO1xuICB9XG4gIGNvbnN0IGNhbnZhcyA9XG4gICAgICBjdXN0b21DYW52YXMgPT0gbnVsbCA/IGNyZWF0ZUNhbnZhcyh3ZWJHTFZlcnNpb24pIDogY3VzdG9tQ2FudmFzO1xuXG4gIGNhbnZhcy5hZGRFdmVudExpc3RlbmVyKCd3ZWJnbGNvbnRleHRsb3N0JywgKGV2OiBFdmVudCkgPT4ge1xuICAgIGV2LnByZXZlbnREZWZhdWx0KCk7XG4gICAgZGVsZXRlIGNvbnRleHRzW3dlYkdMVmVyc2lvbl07XG4gIH0sIGZhbHNlKTtcblxuICBpZiAoZW52KCkuZ2V0Qm9vbCgnU09GVFdBUkVfV0VCR0xfRU5BQkxFRCcpKSB7XG4gICAgV0VCR0xfQVRUUklCVVRFUy5mYWlsSWZNYWpvclBlcmZvcm1hbmNlQ2F2ZWF0ID0gZmFsc2U7XG4gIH1cblxuICBpZiAod2ViR0xWZXJzaW9uID09PSAxKSB7XG4gICAgcmV0dXJuIChjYW52YXMuZ2V0Q29udGV4dCgnd2ViZ2wnLCBXRUJHTF9BVFRSSUJVVEVTKSB8fFxuICAgICAgICAgICAgY2FudmFzLmdldENvbnRleHQoJ2V4cGVyaW1lbnRhbC13ZWJnbCcsIFdFQkdMX0FUVFJJQlVURVMpKSBhc1xuICAgICAgICBXZWJHTFJlbmRlcmluZ0NvbnRleHQ7XG4gIH1cbiAgcmV0dXJuIGNhbnZhcy5nZXRDb250ZXh0KCd3ZWJnbDInLCBXRUJHTF9BVFRSSUJVVEVTKSBhcyBXZWJHTFJlbmRlcmluZ0NvbnRleHQ7XG59XG4iXX0=","/**\n * @license\n * Copyright 2017 Google LLC. All Rights Reserved.\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n * =============================================================================\n */\nimport { env, util } from '@tensorflow/tfjs-core';\nexport var PackingScheme;\n(function (PackingScheme) {\n /**\n * All values in a single texel are densely packed without any constraints.\n *\n * This is how the shader encodes a tensor with shape = [2, 3, 4]\n * (indices are [batch, row, col]).\n *\n * 000|001 010|011 020|021\n * ------- ------- -------\n * 002|003 012|013 022|023\n *\n * 100|101 110|111 120|121\n * ------- ------- -------\n * 102|103 112|113 122|123\n *\n */\n PackingScheme[PackingScheme[\"DENSE\"] = 0] = \"DENSE\";\n /**\n * Single texels contain only values from the same batch, and from adjacent\n * rows and columns.\n *\n * This is how the shader encodes a tensor with shape = [2, 3, 5]\n * (indices are [batch, row, col]).\n *\n * 000|001 002|003 004|xxx 020|021 022|023 024|xxx\n * ------- ------- ------- ------- ------- -------\n * 010|011 012|013 014|xxx xxx|xxx xxx|xxx xxx|xxx\n *\n * 100|101 102|103 104|xxx 120|121 122|123 124|xxx\n * ------- ------- ------- ------- ------- -------\n * 110|111 112|113 114|xxx xxx|xxx xxx|xxx xxx|xxx\n *\n */\n PackingScheme[PackingScheme[\"SHARED_BATCH\"] = 1] = \"SHARED_BATCH\";\n})(PackingScheme || (PackingScheme = {}));\nexport var TextureUsage;\n(function (TextureUsage) {\n TextureUsage[TextureUsage[\"RENDER\"] = 0] = \"RENDER\";\n TextureUsage[TextureUsage[\"UPLOAD\"] = 1] = \"UPLOAD\";\n TextureUsage[TextureUsage[\"PIXELS\"] = 2] = \"PIXELS\";\n TextureUsage[TextureUsage[\"DOWNLOAD\"] = 3] = \"DOWNLOAD\";\n})(TextureUsage || (TextureUsage = {}));\nexport var PhysicalTextureType;\n(function (PhysicalTextureType) {\n PhysicalTextureType[PhysicalTextureType[\"UNPACKED_FLOAT16\"] = 0] = \"UNPACKED_FLOAT16\";\n PhysicalTextureType[PhysicalTextureType[\"UNPACKED_FLOAT32\"] = 1] = \"UNPACKED_FLOAT32\";\n PhysicalTextureType[PhysicalTextureType[\"PACKED_4X1_UNSIGNED_BYTE\"] = 2] = \"PACKED_4X1_UNSIGNED_BYTE\";\n PhysicalTextureType[PhysicalTextureType[\"PACKED_2X2_FLOAT32\"] = 3] = \"PACKED_2X2_FLOAT32\";\n PhysicalTextureType[PhysicalTextureType[\"PACKED_2X2_FLOAT16\"] = 4] = \"PACKED_2X2_FLOAT16\";\n})(PhysicalTextureType || (PhysicalTextureType = {}));\nexport function getUnpackedMatrixTextureShapeWidthHeight(rows, columns) {\n return [columns, rows];\n}\nexport function getUnpackedArraySizeFromMatrixSize(matrixSize, channelsPerTexture) {\n return matrixSize * channelsPerTexture;\n}\nexport function getColorMatrixTextureShapeWidthHeight(rows, columns) {\n return [columns * 4, rows];\n}\n/**\n * Get shape for densely packed RGBA texture.\n */\nexport function getDenseTexShape(shape) {\n const size = util.sizeFromShape(shape);\n const texelsNeeded = Math.ceil(size / 4);\n return util.sizeToSquarishShape(texelsNeeded);\n}\nexport function getMatrixSizeFromUnpackedArraySize(unpackedSize, channelsPerTexture) {\n if (unpackedSize % channelsPerTexture !== 0) {\n throw new Error(`unpackedSize (${unpackedSize}) must be a multiple of ` +\n `${channelsPerTexture}`);\n }\n return unpackedSize / channelsPerTexture;\n}\nexport function decodeMatrixFromUnpackedColorRGBAArray(unpackedArray, matrix, channels) {\n const requiredSize = unpackedArray.length * channels / 4;\n if (matrix.length < requiredSize) {\n throw new Error(`matrix length (${matrix.length}) must be >= ${requiredSize}`);\n }\n let dst = 0;\n for (let src = 0; src < unpackedArray.length; src += 4) {\n for (let c = 0; c < channels; c++) {\n matrix[dst++] = unpackedArray[src + c];\n }\n }\n}\nexport function getPackedMatrixTextureShapeWidthHeight(rows, columns) {\n return [\n Math.max(1, Math.ceil(columns / 2)), Math.max(1, Math.ceil(rows / 2))\n ];\n}\nexport function getPackedRGBAArraySizeFromMatrixShape(rows, columns) {\n const [w, h] = getPackedMatrixTextureShapeWidthHeight(rows, columns);\n return w * h * 4;\n}\nexport function getTextureConfig(\n// tslint:disable-next-line:no-any\ngl, textureHalfFloatExtension) {\n // tslint:disable-next-line:no-any\n const glany = gl;\n let internalFormatFloat;\n let internalFormatHalfFloat;\n let internalFormatPackedHalfFloat;\n let internalFormatPackedFloat;\n let textureFormatFloat;\n let downloadTextureFormat;\n let downloadUnpackNumChannels;\n let defaultNumChannels;\n let textureTypeHalfFloat;\n let textureTypeFloat;\n if (env().getNumber('WEBGL_VERSION') === 2) {\n internalFormatFloat = glany.R32F;\n internalFormatHalfFloat = glany.R16F;\n internalFormatPackedHalfFloat = glany.RGBA16F;\n internalFormatPackedFloat = glany.RGBA32F;\n textureFormatFloat = glany.RED;\n downloadUnpackNumChannels = 4;\n defaultNumChannels = 1;\n textureTypeHalfFloat = glany.HALF_FLOAT;\n textureTypeFloat = glany.FLOAT;\n downloadTextureFormat = glany.RGBA8;\n }\n else {\n internalFormatFloat = gl.RGBA;\n internalFormatHalfFloat = gl.RGBA;\n internalFormatPackedHalfFloat = gl.RGBA;\n internalFormatPackedFloat = glany.RGBA;\n textureFormatFloat = gl.RGBA;\n downloadUnpackNumChannels = 4;\n defaultNumChannels = 4;\n textureTypeHalfFloat = textureHalfFloatExtension != null ?\n textureHalfFloatExtension.HALF_FLOAT_OES :\n null;\n textureTypeFloat = gl.FLOAT;\n downloadTextureFormat = gl.RGBA;\n }\n return {\n internalFormatFloat,\n internalFormatHalfFloat,\n internalFormatPackedHalfFloat,\n internalFormatPackedFloat,\n textureFormatFloat,\n downloadTextureFormat,\n downloadUnpackNumChannels,\n defaultNumChannels,\n textureTypeHalfFloat,\n textureTypeFloat\n };\n}\n//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidGV4X3V0aWwuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi90ZmpzLWJhY2tlbmQtd2ViZ2wvc3JjL3RleF91dGlsLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBOzs7Ozs7Ozs7Ozs7Ozs7R0FlRztBQUVILE9BQU8sRUFBaUMsR0FBRyxFQUFjLElBQUksRUFBQyxNQUFNLHVCQUF1QixDQUFDO0FBRTVGLE1BQU0sQ0FBTixJQUFZLGFBbUNYO0FBbkNELFdBQVksYUFBYTtJQUN2Qjs7Ozs7Ozs7Ozs7Ozs7T0FjRztJQUNILG1EQUFLLENBQUE7SUFFTDs7Ozs7Ozs7Ozs7Ozs7O09BZUc7SUFDSCxpRUFBWSxDQUFBO0FBQ2QsQ0FBQyxFQW5DVyxhQUFhLEtBQWIsYUFBYSxRQW1DeEI7QUFFRCxNQUFNLENBQU4sSUFBWSxZQUtYO0FBTEQsV0FBWSxZQUFZO0lBQ3RCLG1EQUFNLENBQUE7SUFDTixtREFBTSxDQUFBO0lBQ04sbURBQU0sQ0FBQTtJQUNOLHVEQUFRLENBQUE7QUFDVixDQUFDLEVBTFcsWUFBWSxLQUFaLFlBQVksUUFLdkI7QUFFRCxNQUFNLENBQU4sSUFBWSxtQkFNWDtBQU5ELFdBQVksbUJBQW1CO0lBQzdCLHFGQUFnQixDQUFBO0lBQ2hCLHFGQUFnQixDQUFBO0lBQ2hCLHFHQUF3QixDQUFBO0lBQ3hCLHlGQUFrQixDQUFBO0lBQ2xCLHlGQUFrQixDQUFBO0FBQ3BCLENBQUMsRUFOVyxtQkFBbUIsS0FBbkIsbUJBQW1CLFFBTTlCO0FBa0NELE1BQU0sVUFBVSx3Q0FBd0MsQ0FDcEQsSUFBWSxFQUFFLE9BQWU7SUFDL0IsT0FBTyxDQUFDLE9BQU8sRUFBRSxJQUFJLENBQUMsQ0FBQztBQUN6QixDQUFDO0FBRUQsTUFBTSxVQUFVLGtDQUFrQyxDQUM5QyxVQUFrQixFQUFFLGtCQUEwQjtJQUNoRCxPQUFPLFVBQVUsR0FBRyxrQkFBa0IsQ0FBQztBQUN6QyxDQUFDO0FBRUQsTUFBTSxVQUFVLHFDQUFxQyxD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a0JBQWtCO1FBQ2xCLHFCQUFxQjtRQUNyQix5QkFBeUI7UUFDekIsa0JBQWtCO1FBQ2xCLG9CQUFvQjtRQUNwQixnQkFBZ0I7S0FDakIsQ0FBQztBQUNKLENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyIvKipcbiAqIEBsaWNlbnNlXG4gKiBDb3B5cmlnaHQgMjAxNyBHb29nbGUgTExDLiBBbGwgUmlnaHRzIFJlc2VydmVkLlxuICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlIFwiTGljZW5zZVwiKTtcbiAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS5cbiAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdFxuICpcbiAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMFxuICpcbiAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmVcbiAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuIFwiQVMgSVNcIiBCQVNJUyxcbiAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLlxuICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZFxuICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuXG4gKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuICovXG5cbmltcG9ydCB7YmFja2VuZF91dGlsLCBEYXRhSWQsIERhdGFUeXBlLCBlbnYsIFRlbnNvckluZm8sIHV0aWx9IGZyb20gJ0B0ZW5zb3JmbG93L3RmanMtY29yZSc7XG5cbmV4cG9ydCBlbnVtIFBhY2tpbmdTY2hlbWUge1xuICAvKipcbiAgICogQWxsIHZhbHVlcyBpbiBhIHNpbmdsZSB0ZXhlbCBhcmUgZGVuc2VseSBwYWNrZWQgd2l0aG91dCBhbnkgY29uc3RyYWludHMuXG4gICAqXG4gICAqIFRoaXMgaXMgaG93IHRoZSBzaGFkZXIgZW5jb2RlcyBhIHRlbnNvciB3aXRoIHNoYXBlID0gWzIsIDMsIDRdXG4gICAqIChpbmRpY2VzIGFyZSBbYmF0Y2gsIHJvdywgY29sXSkuXG4gICAqXG4gICAqIDAwMHwwMDEgICAwMTB8MDExICAgMDIwfDAyMVxuICAgKiAtLS0tLS0tICAgLS0tLS0tLSAgIC0tLS0tLS1cbiAgICogMDAyfDAwMyAgIDAxMnwwMTMgICAwMjJ8MDIzXG4gICAqXG4gICAqIDEwMHwxMDEgICAxMTB8MTExICAgMTIwfDEyMVxuICAgKiAtLS0tLS0tICAgLS0tLS0tLSAgIC0tLS0tLS1cbiAgICogMTAyfDEwMyAgIDExMnwxMTMgICAxMjJ8MTIzXG4gICAqXG4gICAqL1xuICBERU5TRSxcblxuICAvKipcbiAgICogU2luZ2xlIHRleGVscyBjb250YWluIG9ubHkgdmFsdWVzIGZyb20gdGhlIHNhbWUgYmF0Y2gsIGFuZCBmcm9tIGFkamFjZW50XG4gICAqIHJvd3MgYW5kIGNvbHVtbnMuXG4gICAqXG4gICAqIFRoaXMgaXMgaG93IHRoZSBzaGFkZXIgZW5jb2RlcyBhIHRlbnNvciB3aXRoIHNoYXBlID0gWzIsIDMsIDVdXG4gICAqIChpbmRpY2VzIGFyZSBbYmF0Y2gsIHJvdywgY29sXSkuXG4gICAqXG4gICAqIDAwMHwwMDEgICAwMDJ8MDAzICAgMDA0fHh4eCAgIDAyMHwwMjEgICAwMjJ8MDIzICAgMDI0fHh4eFxuICAgKiAtLS0tLS0tICAgLS0tLS0tLSAgIC0tLS0tLS0gICAtLS0tLS0tICAgLS0tLS0tLSAgIC0tLS0tLS1cbiAgICogMDEwfDAxMSAgIDAxMnwwMTMgICAwMTR8eHh4ICAgeHh4fHh4eCAgIHh4eHx4eHggICB4eHh8eHh4XG4gICAqXG4gICAqIDEwMHwxMDEgICAxMDJ8MTAzICAgMTA0fHh4eCAgIDEyMHwxMjEgICAxMjJ8MTIzICAgMTI0fHh4eFxuICAgKiAtLS0tLS0tICAgLS0tLS0tLSAgIC0tLS0tLS0gICAtLS0tLS0tICAgLS0tLS0tLSAgIC0tLS0tLS1cbiAgICogMTEwfDExMSAgIDExMnwxMTMgICAxMTR8eHh4ICAgeHh4fHh4eCAgIHh4eHx4eHggICB4eHh8eHh4XG4gICAqXG4gICAqL1xuICBTSEFSRURfQkFUQ0hcbn1cblxuZXhwb3J0IGVudW0gVGV4dHVyZVVzYWdlIHtcbiAgUkVOREVSLFxuICBVUExPQUQsXG4gIFBJWEVMUyxcbiAgRE9XTkxPQURcbn1cblxuZXhwb3J0IGVudW0gUGh5c2ljYWxUZXh0dXJlVHlwZSB7XG4gIFVOUEFDS0VEX0ZMT0FUMTYsXG4gIFVOUEFDS0VEX0ZMT0FUMzIsXG4gIFBBQ0tFRF80WDFfVU5TSUdORURfQllURSxcbiAgUEFDS0VEXzJYMl9GTE9BVDMyLFxuICBQQUNLRURfMlgyX0ZMT0FUMTZcbn1cblxuZXhwb3J0IGludGVyZmFjZSBUZXh0dXJlIHtcbiAgdGV4dHVyZTogV2ViR0xUZXh0dXJlO1xuICB0ZXhTaGFwZTogW251bWJlciwgbnVtYmVyXTtcbn1cbmV4cG9ydCBpbnRlcmZhY2UgVGV4dHVyZURhdGEge1xuICAvLyBSZXF1aXJlZC5cbiAgc2hhcGU6IG51bWJlcltdO1xuICBkdHlwZTogRGF0YVR5cGU7XG5cbiAgLy8gT3B0aW9uYWwuXG4gIHZhbHVlcz86IGJhY2tlbmRfdXRpbC5CYWNrZW5kVmFsdWVzO1xuICB0ZXh0dXJlPzogVGV4dHVyZTtcbiAgLy8gRm9yIGNvbXBsZXggbnVtYmVycywgdGhlIHJlYWwgYW5kIGltYWdpbmFyeSBwYXJ0cyBhcmUgc3RvcmVkIGFzIHRoZWlyIG93blxuICAvLyBpbmRpdmlkdWFsIHRlbnNvckluZm9zLCB3aXRoIGEgcGFyZW50IGpvaW5pbmcgdGhlIHR3byB3aXRoIHRoZVxuICAvLyBjb21wbGV4VGVuc29ycyBmaWVsZC4gV2hlbiB0aGlzIGlzIGRlZmluZWQsIHRleHR1cmUgd2lsbCBiZSBudWxsLlxuICBjb21wbGV4VGVuc29ySW5mb3M/OiB7cmVhbDogVGVuc29ySW5mbywgaW1hZzogVGVuc29ySW5mb307XG4gIC8qKiBbcm93cywgY29sdW1uc10gc2hhcGUgb2YgdGhlIHRleHR1cmUuICovXG4gIHRleFNoYXBlPzogW251bWJlciwgbnVtYmVyXTtcbiAgdXNhZ2U/OiBUZXh0dXJlVXNhZ2U7XG4gIGlzUGFja2VkPzogYm9vbGVhbjtcblxuICByZWZDb3VudDogbnVtYmVyO1xuXG4gIC8vIEF2YWlsYWJsZSB3aGVuIHRoZSB0ZW5zb3IgaGFzIGJlZW4gc2xpY2VkLlxuICBzbGljZT86IHtcbiAgICAvLyBPZmZzZXQgaW4gdGhlICdmbGF0IGluZGV4JyBzcGFjZS5cbiAgICBmbGF0T2Zmc2V0OiBudW1iZXI7XG4gICAgLy8gVXNlZCBmb3IgY291bnRpbmcgaG93IG1hbnkgc2xpY2VkIHRlbnNvcnMgcG9pbnQgdG8gdGhlIHNhbWUgdGV4dHVyZS5cbiAgICBvcmlnRGF0YUlkOiBEYXRhSWQ7XG4gIH07XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBnZXRVbnBhY2tlZE1hdHJpeFRleHR1cmVTaGFwZVdpZHRoSGVpZ2h0KFxuICAgIHJvd3M6IG51bWJlciwgY29sdW1uczogbnVtYmVyKTogW251bWJlciwgbnVtYmVyXSB7XG4gIHJldHVybiBbY29sdW1ucywgcm93c107XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBnZXRVbnBhY2tlZEFycmF5U2l6ZUZyb21NYXRyaXhTaXplKFxuICAgIG1hdHJpeFNpemU6IG51bWJlciwgY2hhbm5lbHNQZXJUZXh0dXJlOiBudW1iZXIpOiBudW1iZXIge1xuICByZXR1cm4gbWF0cml4U2l6ZSAqIGNoYW5uZWxzUGVyVGV4dHVyZTtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGdldENvbG9yTWF0cml4VGV4dHVyZVNoYXBlV2lkdGhIZWlnaHQoXG4gICAgcm93czogbnVtYmVyLCBjb2x1bW5zOiBudW1iZXIpOiBbbnVtYmVyLCBudW1iZXJdIHtcbiAgcmV0dXJuIFtjb2x1bW5zICogNCwgcm93c107XG59XG5cbi8qKlxuICogR2V0IHNoYXBlIGZvciBkZW5zZWx5IHBhY2tlZCBSR0JBIHRleHR1cmUuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBnZXREZW5zZVRleFNoYXBlKHNoYXBlOiBudW1iZXJbXSk6IFtudW1iZXIsIG51bWJlcl0ge1xuICBjb25zdCBzaXplID0gdXRpbC5zaXplRnJvbVNoYXBlKHNoYXBlKTtcbiAgY29uc3QgdGV4ZWxzTmVlZGVkID0gTWF0aC5jZWlsKHNpemUgLyA0KTtcbiAgcmV0dXJuIHV0aWwuc2l6ZVRvU3F1YXJpc2hTaGFwZSh0ZXhlbHNOZWVkZWQpO1xufVxuXG5leHBvcnQgZnVuY3Rpb24gZ2V0TWF0cml4U2l6ZUZyb21VbnBhY2tlZEFycmF5U2l6ZShcbiAgICB1bnBhY2tlZFNpemU6IG51bWJlciwgY2hhbm5lbHNQZXJUZXh0dXJlOiBudW1iZXIpOiBudW1iZXIge1xuICBpZiAodW5wYWNrZWRTaXplICUgY2hhbm5lbHNQZXJUZXh0dXJlICE9PSAwKSB7XG4gICAgdGhyb3cgbmV3IEVycm9yKFxuICAgICAgICBgdW5wYWNrZWRTaXplICgke3VucGFja2VkU2l6ZX0pIG11c3QgYmUgYSBtdWx0aXBsZSBvZiBgICtcbiAgICAgICAgYCR7Y2hhbm5lbHNQZXJUZXh0dXJlfWApO1xuICB9XG4gIHJldHVybiB1bnBhY2tlZFNpemUgLyBjaGFubmVsc1BlclRleHR1cmU7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBkZWNvZGVNYXRyaXhGcm9tVW5wYWNrZWRDb2xvclJHQkFBcnJheShcbiAgICB1bnBhY2tlZEFycmF5OiBGbG9hdDMyQXJyYXksIG1hdHJpeDogRmxvYXQzMkFycmF5LCBjaGFubmVsczogbnVtYmVyKSB7XG4gIGNvbnN0IHJlcXVpcmVkU2l6ZSA9IHVucGFja2VkQXJyYXkubGVuZ3RoICogY2hhbm5lbHMgLyA0O1xuICBpZiAobWF0cml4Lmxlbmd0aCA8IHJlcXVpcmVkU2l6ZSkge1xuICAgIHRocm93IG5ldyBFcnJvcihcbiAgICAgICAgYG1hdHJpeCBsZW5ndGggKCR7bWF0cml4Lmxlbmd0aH0pIG11c3QgYmUgPj0gJHtyZXF1aXJlZFNpemV9YCk7XG4gIH1cbiAgbGV0IGRzdCA9IDA7XG4gIGZvciAobGV0IHNyYyA9IDA7IHNyYyA8IHVucGFja2VkQXJyYXkubGVuZ3RoOyBzcmMgKz0gNCkge1xuICAgIGZvciAobGV0IGMgPSAwOyBjIDwgY2hhbm5lbHM7IGMrKykge1xuICAgICAgbWF0cml4W2RzdCsrXSA9IHVucGFja2VkQXJyYXlbc3JjICsgY107XG4gICAgfVxuICB9XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBnZXRQYWNrZWRNYXRyaXhUZXh0dXJlU2hhcGVXaWR0aEhlaWdodChcbiAgICByb3dzOiBudW1iZXIsIGNvbHVtbnM6IG51bWJlcik6IFtudW1iZXIsIG51bWJlcl0ge1xuICByZXR1cm4gW1xuICAgIE1hdGgubWF4KDEsIE1hdGguY2VpbChjb2x1bW5zIC8gMikpLCBNYXRoLm1heCgxLCBNYXRoLmNlaWwocm93cyAvIDIpKVxuICBdO1xufVxuXG5leHBvcnQgZnVuY3Rpb24gZ2V0UGFja2VkUkdCQUFycmF5U2l6ZUZyb21NYXRyaXhTaGFwZShcbiAgICByb3dzOiBudW1iZXIsIGNvbHVtbnM6IG51bWJlcik6IG51bWJlciB7XG4gIGNvbnN0IFt3LCBoXSA9IGdldFBhY2tlZE1hdHJpeFRleHR1cmVTaGFwZVdpZHRoSGVpZ2h0KHJvd3MsIGNvbHVtbnMpO1xuICByZXR1cm4gdyAqIGggKiA0O1xufVxuXG5leHBvcnQgaW50ZXJmYWNlIFRleHR1cmVDb25maWcge1xuICBpbnRlcm5hbEZvcm1hdEZsb2F0OiBudW1iZXI7XG4gIHRleHR1cmVGb3JtYXRGbG9hdDogbnVtYmVyO1xuICBpbnRlcm5hbEZvcm1hdFBhY2tlZEhhbGZGbG9hdDogbnVtYmVyO1xuICBpbnRlcm5hbEZvcm1hdEhhbGZGbG9hdDogbnVtYmVyO1xuICBpbnRlcm5hbEZvcm1hdFBhY2tlZEZsb2F0OiBudW1iZXI7XG5cbiAgLy8gVGhlIGZvcm1hdCB0byB1c2UgZHVyaW5nIGEgZ2wucmVhZFBpeGVscyBjYWxsLlxuICBkb3dubG9hZFRleHR1cmVGb3JtYXQ6IG51bWJlcjtcbiAgLy8gSG93IG1hbnkgY2hhbm5lbHMgbmVlZCB0byBiZSB1bnBhY2tlZCBhZnRlciBhIGdsLnJlYWRQaXhlbHMgY2FsbC5cbiAgZG93bmxvYWRVbnBhY2tOdW1DaGFubmVsczogbnVtYmVyO1xuXG4gIGRlZmF1bHROdW1DaGFubmVsczogbnVtYmVyO1xuICB0ZXh0dXJlVHlwZUhhbGZGbG9hdDogbnVtYmVyO1xuICB0ZXh0dXJlVHlwZUZsb2F0OiBudW1iZXI7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBnZXRUZXh0dXJlQ29uZmlnKFxuICAgIC8vIHRzbGludDpkaXNhYmxlLW5leHQtbGluZTpuby1hbnlcbiAgICBnbDogV2ViR0xSZW5kZXJpbmdDb250ZXh0LCB0ZXh0dXJlSGFsZkZsb2F0RXh0ZW5zaW9uPzogYW55KTogVGV4dHVyZUNvbmZpZyB7XG4gIC8vIHRzbGludDpkaXNhYmxlLW5leHQtbGluZTpuby1hbnlcbiAgY29uc3QgZ2xhbnkgPSBnbCBhcyBhbnk7XG5cbiAgbGV0IGludGVybmFsRm9ybWF0RmxvYXQ6IG51bWJlcjtcbiAgbGV0IGludGVybmFsRm9ybWF0SGFsZkZsb2F0OiBudW1iZXI7XG4gIGxldCBpbnRlcm5hbEZvcm1hdFBhY2tlZEhhbGZGbG9hdDogbnVtYmVyO1xuICBsZXQgaW50ZXJuYWxGb3JtYXRQYWNrZWRGbG9hdDogbnVtYmVyO1xuICBsZXQgdGV4dHVyZUZvcm1hdEZsb2F0OiBudW1iZXI7XG5cbiAgbGV0IGRvd25sb2FkVGV4dHVyZUZvcm1hdDogbnVtYmVyO1xuICBsZXQgZG93bmxvYWRVbnBhY2tOdW1DaGFubmVsczogbnVtYmVyO1xuXG4gIGxldCBkZWZhdWx0TnVtQ2hhbm5lbHM6IG51bWJlcjtcbiAgbGV0IHRleHR1cmVUeXBlSGFsZkZsb2F0OiBudW1iZXI7XG4gIGxldCB0ZXh0dXJlVHlwZUZsb2F0OiBudW1iZXI7XG5cbiAgaWYgKGVudigpLmdldE51bWJlcignV0VCR0xfVkVSU0lPTicpID09PSAyKSB7XG4gICAgaW50ZXJuYWxGb3JtYXRGbG9hdCA9IGdsYW55LlIzMkY7XG4gICAgaW50ZXJuYWxGb3JtYXRIYWxmRmxvYXQgPSBnbGFueS5SMTZGO1xuICAgIGludGVybmFsRm9ybWF0UGFja2VkSGFsZkZsb2F0ID0gZ2xhbnkuUkdCQTE2RjtcbiAgICBpbnRlcm5hbEZvcm1hdFBhY2tlZEZsb2F0ID0gZ2xhbnkuUkdCQTMyRjtcbiAgICB0ZXh0dXJlRm9ybWF0RmxvYXQgPSBnbGFueS5SRUQ7XG4gICAgZG93bmxvYWRVbnBhY2tOdW1DaGFubmVscyA9IDQ7XG4gICAgZGVmYXVsdE51bUNoYW5uZWxzID0gMTtcbiAgICB0ZXh0dXJlVHlwZUhhbGZGbG9hdCA9IGdsYW55LkhBTEZfRkxPQVQ7XG4gICAgdGV4dHVyZVR5cGVGbG9hdCA9IGdsYW55LkZMT0FUO1xuICAgIGRvd25sb2FkVGV4dHVyZUZvcm1hdCA9IGdsYW55LlJHQkE4O1xuICB9IGVsc2Uge1xuICAgIGludGVybmFsRm9ybWF0RmxvYXQgPSBnbC5SR0JBO1xuICAgIGludGVybmFsRm9ybWF0SGFsZkZsb2F0ID0gZ2wuUkdCQTtcbiAgICBpbnRlcm5hbEZvcm1hdFBhY2tlZEhhbGZGbG9hdCA9IGdsLlJHQkE7XG4gICAgaW50ZXJuYWxGb3JtYXRQYWNrZWRGbG9hdCA9IGdsYW55LlJHQkE7XG4gICAgdGV4dHVyZUZvcm1hdEZsb2F0ID0gZ2wuUkdCQTtcbiAgICBkb3dubG9hZFVucGFja051bUNoYW5uZWxzID0gNDtcbiAgICBkZWZhdWx0TnVtQ2hhbm5lbHMgPSA0O1xuICAgIHRleHR1cmVUeXBlSGFsZkZsb2F0ID0gdGV4dHVyZUhhbGZGbG9hdEV4dGVuc2lvbiAhPSBudWxsID9cbiAgICAgICAgdGV4dHVyZUhhbGZGbG9hdEV4dGVuc2lvbi5IQUxGX0ZMT0FUX09FUyA6XG4gICAgICAgIG51bGw7XG4gICAgdGV4dHVyZVR5cGVGbG9hdCA9IGdsLkZMT0FUO1xuICAgIGRvd25sb2FkVGV4dHVyZUZvcm1hdCA9IGdsLlJHQkE7XG4gIH1cblxuICByZXR1cm4ge1xuICAgIGludGVybmFsRm9ybWF0RmxvYXQsXG4gICAgaW50ZXJuYWxGb3JtYXRIYWxmRmxvYXQsXG4gICAgaW50ZXJuYWxGb3JtYXRQYWNrZWRIYWxmRmxvYXQsXG4gICAgaW50ZXJuYWxGb3JtYXRQYWNrZWRGbG9hdCxcbiAgICB0ZXh0dXJlRm9ybWF0RmxvYXQsXG4gICAgZG93bmxvYWRUZXh0dXJlRm9ybWF0LFxuICAgIGRvd25sb2FkVW5wYWNrTnVtQ2hhbm5lbHMsXG4gICAgZGVmYXVsdE51bUNoYW5uZWxzLFxuICAgIHRleHR1cmVUeXBlSGFsZkZsb2F0LFxuICAgIHRleHR1cmVUeXBlRmxvYXRcbiAgfTtcbn1cbiJdfQ==","/**\n * @license\n * Copyright 2017 Google LLC. All Rights Reserved.\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n * =============================================================================\n */\nimport { env, util } from '@tensorflow/tfjs-core';\nimport { getWebGLContext } from './canvas_util';\nimport { getTextureConfig } from './tex_util';\nexport function callAndCheck(gl, func) {\n const returnValue = func();\n if (env().getBool('DEBUG')) {\n checkWebGLError(gl);\n }\n return returnValue;\n}\nfunction checkWebGLError(gl) {\n const error = gl.getError();\n if (error !== gl.NO_ERROR) {\n throw new Error('WebGL Error: ' + getWebGLErrorMessage(gl, error));\n }\n}\n// https://en.wikipedia.org/wiki/Half-precision_floating-point_format\nconst MIN_FLOAT16 = 5.96e-8;\nconst MAX_FLOAT16 = 65504;\nexport function canBeRepresented(num) {\n if (env().getBool('WEBGL_RENDER_FLOAT32_ENABLED') || num === 0 ||\n (MIN_FLOAT16 < Math.abs(num) && Math.abs(num) < MAX_FLOAT16)) {\n return true;\n }\n return false;\n}\nexport function getWebGLErrorMessage(gl, status) {\n switch (status) {\n case gl.NO_ERROR:\n return 'NO_ERROR';\n case gl.INVALID_ENUM:\n return 'INVALID_ENUM';\n case gl.INVALID_VALUE:\n return 'INVALID_VALUE';\n case gl.INVALID_OPERATION:\n return 'INVALID_OPERATION';\n case gl.INVALID_FRAMEBUFFER_OPERATION:\n return 'INVALID_FRAMEBUFFER_OPERATION';\n case gl.OUT_OF_MEMORY:\n return 'OUT_OF_MEMORY';\n case gl.CONTEXT_LOST_WEBGL:\n return 'CONTEXT_LOST_WEBGL';\n default:\n return `Unknown error code ${status}`;\n }\n}\nexport function getExtensionOrThrow(gl, extensionName) {\n return throwIfNull(gl, () => gl.getExtension(extensionName), 'Extension \"' + extensionName + '\" not supported on this browser.');\n}\nexport function createVertexShader(gl, vertexShaderSource) {\n const vertexShader = throwIfNull(gl, () => gl.createShader(gl.VERTEX_SHADER), 'Unable to create vertex WebGLShader.');\n callAndCheck(gl, () => gl.shaderSource(vertexShader, vertexShaderSource));\n callAndCheck(gl, () => gl.compileShader(vertexShader));\n if (gl.getShaderParameter(vertexShader, gl.COMPILE_STATUS) === false) {\n console.log(gl.getShaderInfoLog(vertexShader));\n throw new Error('Failed to compile vertex shader.');\n }\n return vertexShader;\n}\nexport function createFragmentShader(gl, fragmentShaderSource) {\n const fragmentShader = throwIfNull(gl, () => gl.createShader(gl.FRAGMENT_SHADER), 'Unable to create fragment WebGLShader.');\n callAndCheck(gl, () => gl.shaderSource(fragmentShader, fragmentShaderSource));\n callAndCheck(gl, () => gl.compileShader(fragmentShader));\n if (env().get('ENGINE_COMPILE_ONLY')) {\n return fragmentShader;\n }\n if (gl.getShaderParameter(fragmentShader, gl.COMPILE_STATUS) === false) {\n logShaderSourceAndInfoLog(fragmentShaderSource, gl.getShaderInfoLog(fragmentShader));\n throw new Error('Failed to compile fragment shader.');\n }\n return fragmentShader;\n}\nconst lineNumberRegex = /ERROR: [0-9]+:([0-9]+):/g;\nexport function logShaderSourceAndInfoLog(shaderSource, shaderInfoLog) {\n const lineNumberRegexResult = lineNumberRegex.exec(shaderInfoLog);\n if (lineNumberRegexResult == null) {\n console.log(`Couldn't parse line number in error: ${shaderInfoLog}`);\n console.log(shaderSource);\n return;\n }\n const lineNumber = +lineNumberRegexResult[1];\n const shaderLines = shaderSource.split('\\n');\n const pad = shaderLines.length.toString().length + 2;\n const linesWithLineNumbers = shaderLines.map((line, lineNumber) => util.rightPad((lineNumber + 1).toString(), pad) + line);\n let maxLineLength = 0;\n for (let i = 0; i < linesWithLineNumbers.length; i++) {\n maxLineLength = Math.max(linesWithLineNumbers[i].length, maxLineLength);\n }\n const beforeErrorLines = linesWithLineNumbers.slice(0, lineNumber - 1);\n const errorLine = linesWithLineNumbers.slice(lineNumber - 1, lineNumber);\n const afterErrorLines = linesWithLineNumbers.slice(lineNumber);\n console.log(beforeErrorLines.join('\\n'));\n console.log(shaderInfoLog.split('\\n')[0]);\n console.log(`%c ${util.rightPad(errorLine[0], maxLineLength)}`, 'border:1px solid red; background-color:#e3d2d2; color:#a61717');\n console.log(afterErrorLines.join('\\n'));\n}\nexport function createProgram(gl) {\n return throwIfNull(gl, () => gl.createProgram(), 'Unable to create WebGLProgram.');\n}\nexport function linkProgram(gl, program) {\n callAndCheck(gl, () => gl.linkProgram(program));\n if (env().get('ENGINE_COMPILE_ONLY')) {\n return;\n }\n if (gl.getProgramParameter(program, gl.LINK_STATUS) === false) {\n console.log(gl.getProgramInfoLog(program));\n throw new Error('Failed to link vertex and fragment shaders.');\n }\n}\nexport function validateProgram(gl, program) {\n callAndCheck(gl, () => gl.validateProgram(program));\n if (gl.getProgramParameter(program, gl.VALIDATE_STATUS) === false) {\n console.log(gl.getProgramInfoLog(program));\n throw new Error('Shader program validation failed.');\n }\n}\nexport function createStaticVertexBuffer(gl, data) {\n const buffer = throwIfNull(gl, () => gl.createBuffer(), 'Unable to create WebGLBuffer');\n callAndCheck(gl, () => gl.bindBuffer(gl.ARRAY_BUFFER, buffer));\n callAndCheck(gl, () => gl.bufferData(gl.ARRAY_BUFFER, data, gl.STATIC_DRAW));\n return buffer;\n}\nexport function createStaticIndexBuffer(gl, data) {\n const buffer = throwIfNull(gl, () => gl.createBuffer(), 'Unable to create WebGLBuffer');\n callAndCheck(gl, () => gl.bindBuffer(gl.ELEMENT_ARRAY_BUFFER, buffer));\n callAndCheck(gl, () => gl.bufferData(gl.ELEMENT_ARRAY_BUFFER, data, gl.STATIC_DRAW));\n return buffer;\n}\nexport function getNumChannels() {\n if (env().getNumber('WEBGL_VERSION') === 2) {\n return 1;\n }\n return 4;\n}\nexport function createTexture(gl) {\n return throwIfNull(gl, () => gl.createTexture(), 'Unable to create WebGLTexture.');\n}\nexport function validateTextureSize(width, height) {\n const maxTextureSize = env().getNumber('WEBGL_MAX_TEXTURE_SIZE');\n if ((width <= 0) || (height <= 0)) {\n const requested = `[${width}x${height}]`;\n throw new Error('Requested texture size ' + requested + ' is invalid.');\n }\n if ((width > maxTextureSize) || (height > maxTextureSize)) {\n const requested = `[${width}x${height}]`;\n const max = `[${maxTextureSize}x${maxTextureSize}]`;\n throw new Error('Requested texture size ' + requested +\n ' greater than WebGL maximum on this browser / GPU ' + max + '.');\n }\n}\nexport function createFramebuffer(gl) {\n return throwIfNull(gl, () => gl.createFramebuffer(), 'Unable to create WebGLFramebuffer.');\n}\nexport function bindVertexBufferToProgramAttribute(gl, program, attribute, buffer, arrayEntriesPerItem, itemStrideInBytes, itemOffsetInBytes) {\n const loc = gl.getAttribLocation(program, attribute);\n if (loc === -1) {\n // The GPU compiler decided to strip out this attribute because it's unused,\n // thus no need to bind.\n return false;\n }\n callAndCheck(gl, () => gl.bindBuffer(gl.ARRAY_BUFFER, buffer));\n callAndCheck(gl, () => gl.vertexAttribPointer(loc, arrayEntriesPerItem, gl.FLOAT, false, itemStrideInBytes, itemOffsetInBytes));\n callAndCheck(gl, () => gl.enableVertexAttribArray(loc));\n return true;\n}\nexport function bindTextureUnit(gl, texture, textureUnit) {\n validateTextureUnit(gl, textureUnit);\n callAndCheck(gl, () => gl.activeTexture(gl.TEXTURE0 + textureUnit));\n callAndCheck(gl, () => gl.bindTexture(gl.TEXTURE_2D, texture));\n}\nexport function unbindTextureUnit(gl, textureUnit) {\n validateTextureUnit(gl, textureUnit);\n callAndCheck(gl, () => gl.activeTexture(gl.TEXTURE0 + textureUnit));\n callAndCheck(gl, () => gl.bindTexture(gl.TEXTURE_2D, null));\n}\nexport function getProgramUniformLocationOrThrow(gl, program, uniformName) {\n return throwIfNull(gl, () => gl.getUniformLocation(program, uniformName), 'uniform \"' + uniformName + '\" not present in program.');\n}\nexport function getProgramUniformLocation(gl, program, uniformName) {\n return gl.getUniformLocation(program, uniformName);\n}\nexport function bindTextureToProgramUniformSampler(gl, texture, uniformSamplerLocation, textureUnit) {\n callAndCheck(gl, () => bindTextureUnit(gl, texture, textureUnit));\n callAndCheck(gl, () => gl.uniform1i(uniformSamplerLocation, textureUnit));\n}\nexport function bindCanvasToFramebuffer(gl) {\n callAndCheck(gl, () => gl.bindFramebuffer(gl.FRAMEBUFFER, null));\n callAndCheck(gl, () => gl.viewport(0, 0, gl.canvas.width, gl.canvas.height));\n callAndCheck(gl, () => gl.scissor(0, 0, gl.canvas.width, gl.canvas.height));\n}\nexport function bindColorTextureToFramebuffer(gl, texture, framebuffer) {\n callAndCheck(gl, () => gl.bindFramebuffer(gl.FRAMEBUFFER, framebuffer));\n callAndCheck(gl, () => gl.framebufferTexture2D(gl.FRAMEBUFFER, gl.COLOR_ATTACHMENT0, gl.TEXTURE_2D, texture, 0));\n}\nexport function unbindColorTextureFromFramebuffer(gl, framebuffer) {\n callAndCheck(gl, () => gl.bindFramebuffer(gl.FRAMEBUFFER, framebuffer));\n callAndCheck(gl, () => gl.framebufferTexture2D(gl.FRAMEBUFFER, gl.COLOR_ATTACHMENT0, gl.TEXTURE_2D, null, 0));\n}\nexport function validateFramebuffer(gl) {\n const status = gl.checkFramebufferStatus(gl.FRAMEBUFFER);\n if (status !== gl.FRAMEBUFFER_COMPLETE) {\n throw new Error('Error binding framebuffer: ' + getFramebufferErrorMessage(gl, status));\n }\n}\nexport function getFramebufferErrorMessage(gl, status) {\n switch (status) {\n case gl.FRAMEBUFFER_INCOMPLETE_ATTACHMENT:\n return 'FRAMEBUFFER_INCOMPLETE_ATTACHMENT';\n case gl.FRAMEBUFFER_INCOMPLETE_MISSING_ATTACHMENT:\n return 'FRAMEBUFFER_INCOMPLETE_MISSING_ATTACHMENT';\n case gl.FRAMEBUFFER_INCOMPLETE_DIMENSIONS:\n return 'FRAMEBUFFER_INCOMPLETE_DIMENSIONS';\n case gl.FRAMEBUFFER_UNSUPPORTED:\n return 'FRAMEBUFFER_UNSUPPORTED';\n default:\n return `unknown error ${status}`;\n }\n}\nfunction throwIfNull(gl, returnTOrNull, failureMessage) {\n const tOrNull = callAndCheck(gl, () => returnTOrNull());\n if (tOrNull == null) {\n throw new Error(failureMessage);\n }\n return tOrNull;\n}\nfunction validateTextureUnit(gl, textureUnit) {\n const maxTextureUnit = gl.MAX_COMBINED_TEXTURE_IMAGE_UNITS - 1;\n const glTextureUnit = textureUnit + gl.TEXTURE0;\n if (glTextureUnit < gl.TEXTURE0 || glTextureUnit > maxTextureUnit) {\n const textureUnitRange = `[gl.TEXTURE0, gl.TEXTURE${maxTextureUnit}]`;\n throw new Error(`textureUnit must be in ${textureUnitRange}.`);\n }\n}\nexport function getBatchDim(shape, dimsToSkip = 2) {\n return util.sizeFromShape(shape.slice(0, shape.length - dimsToSkip));\n}\nexport function getRowsCols(shape) {\n if (shape.length === 0) {\n throw Error('Cannot get rows and columns of an empty shape array.');\n }\n return [\n shape.length > 1 ? shape[shape.length - 2] : 1, shape[shape.length - 1]\n ];\n}\nexport function getShapeAs3D(shape) {\n let shapeAs3D = [1, 1, 1];\n const isScalar = shape.length === 0 || (shape.length === 1 && shape[0] === 1);\n if (!isScalar) {\n shapeAs3D =\n [getBatchDim(shape), ...getRowsCols(shape)];\n }\n return shapeAs3D;\n}\nexport function getTextureShapeFromLogicalShape(logShape, isPacked = false) {\n let maxTexSize = env().getNumber('WEBGL_MAX_TEXTURE_SIZE');\n let maxSizeForNarrowTex = env().getNumber('WEBGL_MAX_SIZE_FOR_NARROW_TEXTURE');\n if (maxSizeForNarrowTex === Infinity &&\n env().getBool('WEBGL_AUTO_SQUARIFY_NARROW_TEXTURE_SHAPE')) {\n maxSizeForNarrowTex = maxTexSize / 2;\n }\n if (isPacked) {\n maxTexSize = maxTexSize * 2;\n maxSizeForNarrowTex = maxSizeForNarrowTex * 2;\n // This logic ensures we accurately count the number of packed texels needed\n // to accommodate the tensor. We can only pack values in the same texel if\n // they are from adjacent pairs of rows/cols within the same batch. So if a\n // tensor has 3 rows, we pretend it has 4 rows in order to account for the\n // fact that the texels containing the third row are half empty.\n logShape = logShape.map((d, i) => i >= logShape.length - 2 ?\n util.nearestLargerEven(logShape[i]) :\n logShape[i]);\n // Packed texture height is at least 2 (the channel height of a single\n // texel).\n if (logShape.length === 1) {\n logShape = [2, logShape[0]];\n }\n }\n // If logical shape is 2, we don't squeeze, since we want to match physical.\n if (logShape.length !== 2) {\n const squeezeResult = util.squeezeShape(logShape);\n logShape = squeezeResult.newShape;\n }\n let size = util.sizeFromShape(logShape);\n let textureShape = null;\n if (logShape.length <= 1 && size <= maxTexSize) {\n textureShape = [1, size];\n }\n else if (logShape.length === 2 && logShape[0] <= maxTexSize &&\n logShape[1] <= maxTexSize) {\n textureShape = logShape;\n }\n else if (logShape.length === 3 && logShape[0] * logShape[1] <= maxTexSize &&\n logShape[2] <= maxTexSize) {\n textureShape = [logShape[0] * logShape[1], logShape[2]];\n }\n else if (logShape.length === 3 && logShape[0] <= maxTexSize &&\n logShape[1] * logShape[2] <= maxTexSize) {\n textureShape = [logShape[0], logShape[1] * logShape[2]];\n }\n else if (logShape.length === 4 &&\n logShape[0] * logShape[1] * logShape[2] <= maxTexSize &&\n logShape[3] <= maxTexSize) {\n textureShape = [logShape[0] * logShape[1] * logShape[2], logShape[3]];\n }\n else if (logShape.length === 4 && logShape[0] <= maxTexSize &&\n logShape[1] * logShape[2] * logShape[3] <= maxTexSize) {\n textureShape = [logShape[0], logShape[1] * logShape[2] * logShape[3]];\n }\n // true if one edge length is 1 (1 or 2, if packed), while another edge\n // length exceeds maxSizeForNarrowTex.\n const isLongNarrowTex = textureShape != null &&\n Math.max(...textureShape) > maxSizeForNarrowTex &&\n Math.min(...textureShape) <= (isPacked ? 2 : 1) &&\n Math.min(...textureShape) > 0;\n if (textureShape == null || isLongNarrowTex) {\n if (isPacked) {\n // For packed textures size equals the number of channels required to\n // accommodate the texture data. However in order to squarify such that\n // inner dimensions stay even, we rewrite size to equal the number of\n // texels. Then in the return statement we rehydrate the squarified\n // dimensions to channel units.\n const batchDim = getBatchDim(logShape);\n let rows = 2, cols = 2;\n if (logShape.length) {\n [rows, cols] = getRowsCols(logShape);\n }\n size = batchDim * (rows / 2) * (cols / 2);\n textureShape =\n util.sizeToSquarishShape(size).map(d => d * 2);\n }\n else {\n textureShape = util.sizeToSquarishShape(size);\n }\n }\n return textureShape;\n}\nfunction isEven(n) {\n return n % 2 === 0;\n}\n/**\n * This determines whether reshaping a packed texture requires rearranging\n * the data within the texture, assuming 2x2 packing.\n */\nexport function isReshapeFree(shape1, shape2) {\n shape1 = shape1.slice(-2);\n shape2 = shape2.slice(-2);\n if (util.arraysEqual(shape1, shape2)) {\n return true;\n }\n if (!shape1.length || !shape2.length) { // One of the shapes is a scalar.\n return true;\n }\n if (shape1[0] === 0 || shape1[1] === 0 || shape2[0] === 0 ||\n shape2[1] === 0) {\n return true;\n }\n if (shape1.length !== shape2.length) { // One of the shapes is a vector.\n const shape1Cols = shape1.slice(-1)[0];\n const shape2Cols = shape2.slice(-1)[0];\n if (shape1Cols === shape2Cols) {\n return true;\n }\n if (isEven(shape1Cols) && isEven(shape2Cols) &&\n (shape1[0] === 1 || shape2[0] === 1)) {\n return true;\n }\n }\n return shape1[1] === shape2[1] && isEven(shape1[0]) && isEven(shape2[0]);\n}\n// We cache webgl params because the environment gets reset between\n// unit tests and we don't want to constantly query the WebGLContext for\n// MAX_TEXTURE_SIZE.\nlet MAX_TEXTURE_SIZE;\nlet MAX_TEXTURES_IN_SHADER;\nexport function getWebGLMaxTextureSize(webGLVersion) {\n if (MAX_TEXTURE_SIZE == null) {\n const gl = getWebGLContext(webGLVersion);\n MAX_TEXTURE_SIZE = gl.getParameter(gl.MAX_TEXTURE_SIZE);\n }\n return MAX_TEXTURE_SIZE;\n}\nexport function resetMaxTextureSize() {\n MAX_TEXTURE_SIZE = null;\n}\nexport function resetMaxTexturesInShader() {\n MAX_TEXTURES_IN_SHADER = null;\n}\nexport function getMaxTexturesInShader(webGLVersion) {\n if (MAX_TEXTURES_IN_SHADER == null) {\n const gl = getWebGLContext(webGLVersion);\n MAX_TEXTURES_IN_SHADER = gl.getParameter(gl.MAX_TEXTURE_IMAGE_UNITS);\n }\n // We cap at 16 to avoid spurious runtime \"memory exhausted\" error.\n return Math.min(16, MAX_TEXTURES_IN_SHADER);\n}\nexport function getWebGLDisjointQueryTimerVersion(webGLVersion) {\n if (webGLVersion === 0) {\n return 0;\n }\n let queryTimerVersion;\n const gl = getWebGLContext(webGLVersion);\n if (hasExtension(gl, 'EXT_disjoint_timer_query_webgl2') &&\n webGLVersion === 2) {\n queryTimerVersion = 2;\n }\n else if (hasExtension(gl, 'EXT_disjoint_timer_query')) {\n queryTimerVersion = 1;\n }\n else {\n queryTimerVersion = 0;\n }\n return queryTimerVersion;\n}\nexport function hasExtension(gl, extensionName) {\n const ext = gl.getExtension(extensionName);\n return ext != null;\n}\nexport function isWebGLVersionEnabled(webGLVersion) {\n try {\n const gl = getWebGLContext(webGLVersion);\n if (gl != null) {\n return true;\n }\n }\n catch (e) {\n console.log('Error when getting WebGL context: ', e);\n return false;\n }\n return false;\n}\nexport function isCapableOfRenderingToFloatTexture(webGLVersion) {\n if (webGLVersion === 0) {\n return false;\n }\n const gl = getWebGLContext(webGLVersion);\n if (webGLVersion === 1) {\n if (!hasExtension(gl, 'OES_texture_float')) {\n return false;\n }\n }\n else {\n if (!hasExtension(gl, 'EXT_color_buffer_float')) {\n return false;\n }\n }\n const isFrameBufferComplete = createFloatTextureAndBindToFramebuffer(gl);\n return isFrameBufferComplete;\n}\n/**\n * Check if we can download values from a float/half-float texture.\n *\n * Note that for performance reasons we use binding a texture to a framebuffer\n * as a proxy for ability to download float values later using readPixels. The\n * texture params of this texture will not match those in readPixels exactly\n * but if we are unable to bind some kind of float texture to the frameBuffer\n * then we definitely will not be able to read float values from it.\n */\nexport function isDownloadFloatTextureEnabled(webGLVersion) {\n if (webGLVersion === 0) {\n return false;\n }\n const gl = getWebGLContext(webGLVersion);\n if (webGLVersion === 1) {\n if (!hasExtension(gl, 'OES_texture_float')) {\n return false;\n }\n if (!hasExtension(gl, 'WEBGL_color_buffer_float')) {\n return false;\n }\n }\n else {\n if (hasExtension(gl, 'EXT_color_buffer_float')) {\n return createFloatTextureAndBindToFramebuffer(gl);\n }\n const COLOR_BUFFER_HALF_FLOAT = 'EXT_color_buffer_half_float';\n if (hasExtension(gl, COLOR_BUFFER_HALF_FLOAT)) {\n const textureHalfFloatExtension = gl.getExtension(COLOR_BUFFER_HALF_FLOAT);\n return createHalfFloatTextureAndBindToFramebuffer(gl, textureHalfFloatExtension);\n }\n return false;\n }\n const isFrameBufferComplete = createFloatTextureAndBindToFramebuffer(gl);\n return isFrameBufferComplete;\n}\nfunction createFloatTextureAndBindToFramebuffer(gl) {\n const texConfig = getTextureConfig(gl);\n const texture = gl.createTexture();\n gl.bindTexture(gl.TEXTURE_2D, texture);\n const width = 1;\n const height = 1;\n gl.texImage2D(gl.TEXTURE_2D, 0, texConfig.internalFormatFloat, width, height, 0, texConfig.textureFormatFloat, texConfig.textureTypeFloat, null);\n const frameBuffer = gl.createFramebuffer();\n gl.bindFramebuffer(gl.FRAMEBUFFER, frameBuffer);\n gl.framebufferTexture2D(gl.FRAMEBUFFER, gl.COLOR_ATTACHMENT0, gl.TEXTURE_2D, texture, 0);\n const isFrameBufferComplete = gl.checkFramebufferStatus(gl.FRAMEBUFFER) === gl.FRAMEBUFFER_COMPLETE;\n gl.bindTexture(gl.TEXTURE_2D, null);\n gl.bindFramebuffer(gl.FRAMEBUFFER, null);\n gl.deleteTexture(texture);\n gl.deleteFramebuffer(frameBuffer);\n return isFrameBufferComplete;\n}\nfunction createHalfFloatTextureAndBindToFramebuffer(\n// tslint:disable-next-line:no-any\ngl, textureHalfFloatExtension) {\n const texConfig = getTextureConfig(gl, textureHalfFloatExtension);\n const texture = gl.createTexture();\n gl.bindTexture(gl.TEXTURE_2D, texture);\n const width = 1;\n const height = 1;\n gl.texImage2D(gl.TEXTURE_2D, 0, texConfig.internalFormatHalfFloat, width, height, 0, texConfig.textureFormatFloat, texConfig.textureTypeHalfFloat, null);\n const frameBuffer = gl.createFramebuffer();\n gl.bindFramebuffer(gl.FRAMEBUFFER, frameBuffer);\n gl.framebufferTexture2D(gl.FRAMEBUFFER, gl.COLOR_ATTACHMENT0, gl.TEXTURE_2D, texture, 0);\n const isFrameBufferComplete = gl.checkFramebufferStatus(gl.FRAMEBUFFER) === gl.FRAMEBUFFER_COMPLETE;\n gl.bindTexture(gl.TEXTURE_2D, null);\n gl.bindFramebuffer(gl.FRAMEBUFFER, null);\n gl.deleteTexture(texture);\n gl.deleteFramebuffer(frameBuffer);\n return isFrameBufferComplete;\n}\nexport function isWebGLFenceEnabled(webGLVersion) {\n if (webGLVersion !== 2) {\n return false;\n }\n const gl = getWebGLContext(webGLVersion);\n // tslint:disable-next-line:no-any\n const isEnabled = gl.fenceSync != null;\n return isEnabled;\n}\nexport function assertNotComplex(tensor, opName) {\n if (!Array.isArray(tensor)) {\n tensor = [tensor];\n }\n tensor.forEach(t => {\n if (t != null) {\n util.assert(t.dtype !== 'complex64', () => `${opName} does not support complex64 tensors ` +\n 'in the WebGL backend.');\n }\n });\n}\n//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoid2ViZ2xfdXRpbC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uL3RmanMtYmFja2VuZC13ZWJnbC9zcmMvd2ViZ2xfdXRpbC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQTs7Ozs7Ozs7Ozs7Ozs7O0dBZUc7QUFFSCxPQUFPLEVBQUMsR0FBRyxFQUFjLElBQUksRUFBQyxNQUFNLHVCQUF1QixDQUFDO0FBRTVELE9BQU8sRUFBQyxlQUFlLEVBQUMsTUFBTSxlQUFlLENBQUM7QUFDOUMsT0FBTyxFQUFDLGdCQUFnQixFQUFDLE1BQU0sWUFBWSxDQUFDO0FBRTVDLE1BQU0sVUFBVSxZQUFZLENBQUksRUFBeUIsRUFBRSxJQUFhO0lBQ3RFLE1BQU0sV0FBVyxHQUFHLElBQUksRUFBRSxDQUFDO0lBQzNCLElBQUksR0FBRyxFQUFFLENBQUMsT0FBTyxDQUFDLE9BQU8sQ0FBQyxFQUFFO1FBQzFCLGVBQWUsQ0FBQyxFQUFFLENBQUMsQ0FBQztLQUNyQjtJQUNELE9BQU8sV0FBVyxDQUFDO0FBQ3JCLENBQUM7QUFFRCxTQUFTLGVBQWUsQ0FBQyxFQUF5QjtJQUNoRCxNQUFNLEtBQUssR0FBRyxFQUFFLENBQUMsUUFBUSxFQUFFLENBQUM7SUFDNUIsSUFBSSxLQUFLLEtBQUssRUFBRSxDQUFDLFFBQVEsRUFBRTtRQUN6QixNQUFNLElBQUksS0FBSyxDQUFDLGVBQWUsR0FBRyxvQkFBb0IsQ0FBQyxFQUFFLEVBQUUsS0FBSyxDQUFDLENBQUMsQ0FBQztLQUNwRTtBQUNILENBQUM7QUFFRCxxRUFBcUU7QUFDckUsTUFBTSxXQUFXLEdBQUcsT0FBTyxDQUFDO0FBQzVCLE1BQU0sV0FBVyxHQUFHLEtBQUssQ0FBQztBQUUxQixNQUFNLFVBQVUsZ0JBQWdCLENBQUMsR0FBVztJQUMxQyxJQUFJLEdBQUcsRUFBRSxDQUFDLE9BQU8sQ0FBQyw4QkFBOEIsQ0FBQyxJQUFJLEdBQUcsS0FBSyxDQUFDO1FBQzFELENBQUMsV0FBVyxHQUFH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QUMsVUFBVSxFQUFFLElBQUksQ0FBQyxDQUFDO0lBQ3BDLEVBQUUsQ0FBQyxlQUFlLENBQUMsRUFBRSxDQUFDLFdBQVcsRUFBRSxJQUFJLENBQUMsQ0FBQztJQUN6QyxFQUFFLENBQUMsYUFBYSxDQUFDLE9BQU8sQ0FBQyxDQUFDO0lBQzFCLEVBQUUsQ0FBQyxpQkFBaUIsQ0FBQyxXQUFXLENBQUMsQ0FBQztJQUVsQyxPQUFPLHFCQUFxQixDQUFDO0FBQy9CLENBQUM7QUFFRCxNQUFNLFVBQVUsbUJBQW1CLENBQUMsWUFBb0I7SUFDdEQsSUFBSSxZQUFZLEtBQUssQ0FBQyxFQUFFO1FBQ3RCLE9BQU8sS0FBSyxDQUFDO0tBQ2Q7SUFDRCxNQUFNLEVBQUUsR0FBRyxlQUFlLENBQUMsWUFBWSxDQUFDLENBQUM7SUFFekMsa0NBQWtDO0lBQ2xDLE1BQU0sU0FBUyxHQUFJLEVBQVUsQ0FBQyxTQUFTLElBQUksSUFBSSxDQUFDO0lBQ2hELE9BQU8sU0FBUyxDQUFDO0FBQ25CLENBQUM7QUFFRCxNQUFNLFVBQVUsZ0JBQWdCLENBQzVCLE1BQStCLEVBQUUsTUFBYztJQUNqRCxJQUFJLENBQUMsS0FBSyxDQUFDLE9BQU8sQ0FBQyxNQUFNLENBQUMsRUFBRTtRQUMxQixNQUFNLEdBQUcsQ0FBQyxNQUFNLENBQUMsQ0FBQztLQUNuQjtJQUNELE1BQU0sQ0FBQyxPQUFPLENBQUMsQ0FBQyxDQUFDLEVBQUU7UUFDakIsSUFBSSxDQUFDLElBQUksSUFBSSxFQUFFO1lBQ2IsSUFBSSxDQUFDLE1BQU0sQ0FDUCxDQUFDLENBQUMsS0FBSyxLQUFLLFdBQVcsRUFDdkIsR0FBRyxFQUFFLENBQUMsR0FBRyxNQUFNLHNDQUFzQztnQkFDakQsdUJBQXVCLENBQUMsQ0FBQztTQUNsQztJQUNILENBQUMsQ0FBQyxDQUFDO0FBQ0wsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbIi8qKlxuICogQGxpY2Vuc2VcbiAqIENvcHlyaWdodCAyMDE3IEdvb2dsZSBMTEMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuXG4gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgXCJMaWNlbnNlXCIpO1xuICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLlxuICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0XG4gKlxuICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wXG4gKlxuICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZVxuICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gXCJBUyBJU1wiIEJBU0lTLFxuICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuXG4gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kXG4gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS5cbiAqID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4gKi9cblxuaW1wb3J0IHtlbnYsIFRlbnNvckluZm8sIHV0aWx9IGZyb20gJ0B0ZW5zb3JmbG93L3RmanMtY29yZSc7XG5cbmltcG9ydCB7Z2V0V2ViR0xDb250ZXh0fSBmcm9tICcuL2NhbnZhc191dGlsJztcbmltcG9ydCB7Z2V0VGV4dHVyZUNvbmZpZ30gZnJvbSAnLi90ZXhfdXRpbCc7XG5cbmV4cG9ydCBmdW5jdGlvbiBjYWxsQW5kQ2hlY2s8VD4oZ2w6IFdlYkdMUmVuZGVyaW5nQ29udGV4dCwgZnVuYzogKCkgPT4gVCk6IFQge1xuICBjb25zdCByZXR1cm5WYWx1ZSA9IGZ1bmMoKTtcbiAgaWYgKGVudigpLmdldEJvb2woJ0RFQlVHJykpIHtcbiAgICBjaGVja1dlYkdMRXJyb3IoZ2wpO1xuICB9XG4gIHJldHVybiByZXR1cm5WYWx1ZTtcbn1cblxuZnVuY3Rpb24gY2hlY2tXZWJHTEVycm9yKGdsOiBXZWJHTFJlbmRlcmluZ0NvbnRleHQpIHtcbiAgY29uc3QgZXJyb3IgPSBnbC5nZXRFcnJvcigpO1xuICBpZiAoZXJyb3IgIT09IGdsLk5PX0VSUk9SKSB7XG4gICAgdGhyb3cgbmV3IEVycm9yKCdXZWJHTCBFcnJvcjogJyArIGdldFdlYkdMRXJyb3JNZXNzYWdlKGdsLCBlcnJvcikpO1xuICB9XG59XG5cbi8vIGh0dHBzOi8vZW4ud2lraXBlZGlhLm9yZy93aWtpL0hhbGYtcHJlY2lzaW9uX2Zsb2F0aW5nLXBvaW50X2Zvcm1hdFxuY29uc3QgTUlOX0ZMT0FUMTYgPSA1Ljk2ZS04O1xuY29uc3QgTUFYX0ZMT0FUMTYgPSA2NTUwNDtcblxuZXhwb3J0IGZ1bmN0aW9uIGNhbkJlUmVwcmVzZW50ZWQobnVtOiBudW1iZXIpOiBib29sZWFuIHtcbiAgaWYgKGVudigpLmdldEJvb2woJ1dFQkdMX1JFTkRFUl9GTE9BVDMyX0VOQUJMRUQnKSB8fCBudW0gPT09IDAgfHxcbiAgICAgIChNSU5fRkxPQVQxNiA8IE1hdGguYWJzKG51bSkgJiYgTWF0aC5hYnMobnVtKSA8IE1BWF9GTE9BVDE2KSkge1xuICAgIHJldHVybiB0cnVlO1xuICB9XG4gIHJldHVybiBmYWxzZTtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGdldFdlYkdMRXJyb3JNZXNzYWdlKFxuICAgIGdsOiBXZWJHTFJlbmRlcmluZ0NvbnRleHQsIHN0YXR1czogbnVtYmVyKTogc3RyaW5nIHtcbiAgc3dpdGNoIChzdGF0dXMpIHtcbiAgICBjYXNlIGdsLk5PX0VSUk9SOlxuICAgICAgcmV0dXJuICdOT19FUlJPUic7XG4gICAgY2FzZSBnbC5JTlZBTElEX0VOVU06XG4gICAgICByZXR1cm4gJ0lOVkFMSURfRU5VTSc7XG4gICAgY2FzZSBnbC5JTlZBTElEX1ZBTFVFOlxuICAgICAgcmV0dXJuICdJTlZBTElEX1ZBTFVFJztcbiAgICBjYXNlIGdsLklOVkFMSURfT1BFUkFUSU9OOlxuICAgICAgcmV0dXJuICdJTlZBTElEX09QRVJBVElPTic7XG4gICAgY2FzZSBnbC5JTlZBTElEX0ZSQU1FQlVGRkVSX09QRVJBVElPTjpcbiAgICAgIHJldHVybiAnSU5WQUxJRF9GUkFNRUJVRkZFUl9PUEVSQVRJT04nO1xuICAgIGNhc2UgZ2wuT1VUX09GX01FTU9SWTpcbiAgICAgIHJldHVybiAnT1VUX09GX01FTU9SWSc7XG4gICAgY2FzZSBnbC5DT05URVhUX0xPU1RfV0VCR0w6XG4gICAgICByZXR1cm4gJ0NPTlRFWFRfTE9TVF9XRUJHTCc7XG4gICAgZGVmYXVsdDpcbiAgICAgIHJldHVybiBgVW5rbm93biBlcnJvciBjb2RlICR7c3RhdHVzfWA7XG4gIH1cbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGdldEV4dGVuc2lvbk9yVGhyb3coXG4gICAgZ2w6IFdlYkdMUmVuZGVyaW5nQ29udGV4dCwgZXh0ZW5zaW9uTmFtZTogc3RyaW5nKToge30ge1xuICByZXR1cm4gdGhyb3dJZk51bGw8e30+KFxuICAgICAgZ2wsICgpID0+IGdsLmdldEV4dGVuc2lvbihleHRlbnNpb25OYW1lKSxcbiAgICAgICdFeHRlbnNpb24gXCInICsgZXh0ZW5zaW9uTmFtZSArICdcIiBub3Qgc3VwcG9ydGVkIG9uIHRoaXMgYnJvd3Nlci4nKTtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGNyZWF0ZVZlcnRleFNoYWRlcihcbiAgICBnbDogV2ViR0xSZW5kZXJpbmdDb250ZXh0LCB2ZXJ0ZXhTaGFkZXJTb3VyY2U6IHN0cmluZyk6IFdlYkdMU2hhZGVyIHtcbiAgY29uc3QgdmVydGV4U2hhZGVyOiBXZWJHTFNoYWRlciA9IHRocm93SWZOdWxsPFdlYkdMU2hhZGVyPihcbiAgICAgIGdsLCAoKSA9PiBnbC5jcmVhdGVTaGFkZXIoZ2wuVkVSVEVYX1NIQURFUiksXG4gICAgICAnVW5hYmxlIHRvIGNyZWF0ZSB2ZXJ0ZXggV2ViR0xTaGFkZXIuJyk7XG4gIGNhbGxBbmRDaGVjayhnbCwgKCkgPT4gZ2wuc2hhZGVyU291cmNlKHZlcnRleFNoYWRlciwgdmVydGV4U2hhZGVyU291cmNlKSk7XG4gIGNhbGxBbmRDaGVjayhnbCwgKCkgPT4gZ2wuY29tcGlsZVNoYWRlcih2ZXJ0ZXhTaGFkZXIpKTtcbiAgaWYgKGdsLmdldFNoYWRlclBhcmFtZXRlcih2ZXJ0ZXhTaGFkZXIsIGdsLkNPTVBJTEVfU1RBVFVTKSA9PT0gZmFsc2UpIHtcbiAgICBjb25zb2xlLmxvZyhnbC5nZXRTaGFkZXJJbmZvTG9nKHZlcnRleFNoYWRlcikpO1xuICAgIHRocm93IG5ldyBFcnJvcignRmFpbGVkIHRvIGNvbXBpbGUgdmVydGV4IHNoYWRlci4nKTtcbiAgfVxuICByZXR1cm4gdmVydGV4U2hhZGVyO1xufVxuXG5leHBvcnQgZnVuY3Rpb24gY3JlYXRlRnJhZ21lbnRTaGFkZXIoXG4gICAgZ2w6IFdlYkdMUmVuZGVyaW5nQ29udGV4dCwgZnJhZ21lbnRTaGFkZXJTb3VyY2U6IHN0cmluZyk6IFdlYkdMU2hhZGVyIHtcbiAgY29uc3QgZnJhZ21lbnRTaGFkZXI6IFdlYkdMU2hhZGVyID0gdGhyb3dJZk51bGw8V2ViR0xTaGFkZXI+KFxuICAgICAgZ2wsICgpID0+IGdsLmNyZWF0ZVNoYWRlcihnbC5GUkFHTUVOVF9TSEFERVIpLFxuICAgICAgJ1VuYWJsZSB0byBjcmVhdGUgZnJhZ21lbnQgV2ViR0xTaGFkZXIuJyk7XG4gIGNhbGxBbmRDaGVjayhnbCwgKCkgPT4gZ2wuc2hhZGVyU291cmNlKGZyYWdtZW50U2hhZGVyLCBmcmFnbWVudFNoYWRlclNvdXJjZSkpO1xuICBjYWxsQW5kQ2hlY2soZ2wsICgpID0+IGdsLmNvbXBpbGVTaGFkZXIoZnJhZ21lbnRTaGFkZXIpKTtcbiAgaWYgKGVudigpLmdldCgnRU5HSU5FX0NPTVBJTEVfT05MWScpKSB7XG4gICAgcmV0dXJuIGZyYWdtZW50U2hhZGVyO1xuICB9XG4gIGlmIChnbC5nZXRTaGFkZXJQYXJhbWV0ZXIoZnJhZ21lbnRTaGFkZXIsIGdsLkNPTVBJTEVfU1RBVFVTKSA9PT0gZmFsc2UpIHtcbiAgICBsb2dTaGFkZXJTb3VyY2VBbmRJbmZvTG9nKFxuICAgICAgICBmcmFnbWVudFNoYWRlclNvdXJjZSwgZ2wuZ2V0U2hhZGVySW5mb0xvZyhmcmFnbWVudFNoYWRlcikpO1xuICAgIHRocm93IG5ldyBFcnJvcignRmFpbGVkIHRvIGNvbXBpbGUgZnJhZ21lbnQgc2hhZGVyLicpO1xuICB9XG4gIHJldHVybiBmcmFnbWVudFNoYWRlcjtcbn1cblxuY29uc3QgbGluZU51bWJlclJlZ2V4ID0gL0VSUk9SOiBbMC05XSs6KFswLTldKyk6L2c7XG5leHBvcnQgZnVuY3Rpb24gbG9nU2hhZGVyU291cmNlQW5kSW5mb0xvZyhcbiAgICBzaGFkZXJTb3VyY2U6IHN0cmluZywgc2hhZGVySW5mb0xvZzogc3RyaW5nKSB7XG4gIGNvbnN0IGxpbmVOdW1iZXJSZWdleFJlc3VsdCA9IGxpbmVOdW1iZXJSZWdleC5leGVjKHNoYWRlckluZm9Mb2cpO1xuICBpZiAobGluZU51bWJlclJlZ2V4UmVzdWx0ID09IG51bGwpIHtcbiAgICBjb25zb2xlLmxvZyhgQ291bGRuJ3QgcGFyc2UgbGluZSBudW1iZXIgaW4gZXJyb3I6ICR7c2hhZGVySW5mb0xvZ31gKTtcbiAgICBjb25zb2xlLmxvZyhzaGFkZXJTb3VyY2UpO1xuICAgIHJldHVybjtcbiAgfVxuXG4gIGNvbnN0IGxpbmVOdW1iZXIgPSArbGluZU51bWJlclJlZ2V4UmVzdWx0WzFdO1xuXG4gIGNvbnN0IHNoYWRlckxpbmVzID0gc2hhZGVyU291cmNlLnNwbGl0KCdcXG4nKTtcbiAgY29uc3QgcGFkID0gc2hhZGVyTGluZXMubGVuZ3RoLnRvU3RyaW5nKCkubGVuZ3RoICsgMjtcbiAgY29uc3QgbGluZXNXaXRoTGluZU51bWJlcnMgPSBzaGFkZXJMaW5lcy5tYXAoXG4gICAgICAobGluZSwgbGluZU51bWJlcikgPT5cbiAgICAgICAgICB1dGlsLnJpZ2h0UGFkKChsaW5lTnVtYmVyICsgMSkudG9TdHJpbmcoKSwgcGFkKSArIGxpbmUpO1xuICBsZXQgbWF4TGluZUxlbmd0aCA9IDA7XG4gIGZvciAobGV0IGkgPSAwOyBpIDwgbGluZXNXaXRoTGluZU51bWJlcnMubGVuZ3RoOyBpKyspIHtcbiAgICBtYXhMaW5lTGVuZ3RoID0gTWF0aC5tYXgobGluZXNXaXRoTGluZU51bWJlcnNbaV0ubGVuZ3RoLCBtYXhMaW5lTGVuZ3RoKTtcbiAgfVxuXG4gIGNvbnN0IGJlZm9yZUVycm9yTGluZXMgPSBsaW5lc1dpdGhMaW5lTnVtYmVycy5zbGljZSgwLCBsaW5lTnVtYmVyIC0gMSk7XG4gIGNvbnN0IGVycm9yTGluZSA9IGxpbmVzV2l0aExpbmVOdW1iZXJzLnNsaWNlKGxpbmVOdW1iZXIgLSAxLCBsaW5lTnVtYmVyKTtcbiAgY29uc3QgYWZ0ZXJFcnJvckxpbmVzID0gbGluZXNXaXRoTGluZU51bWJlcnMuc2xpY2UobGluZU51bWJlcik7XG5cbiAgY29uc29sZS5sb2coYmVmb3JlRXJyb3JMaW5lcy5qb2luKCdcXG4nKSk7XG4gIGNvbnNvbGUubG9nKHNoYWRlckluZm9Mb2cuc3BsaXQoJ1xcbicpWzBdKTtcbiAgY29uc29sZS5sb2coXG4gICAgICBgJWMgJHt1dGlsLnJpZ2h0UGFkKGVycm9yTGluZVswXSwgbWF4TGluZUxlbmd0aCl9YCxcbiAgICAgICdib3JkZXI6MXB4IHNvbGlkIHJlZDsgYmFja2dyb3VuZC1jb2xvcjojZTNkMmQyOyBjb2xvcjojYTYxNzE3Jyk7XG4gIGNvbnNvbGUubG9nKGFmdGVyRXJyb3JMaW5lcy5qb2luKCdcXG4nKSk7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBjcmVhdGVQcm9ncmFtKGdsOiBXZWJHTFJlbmRlcmluZ0NvbnRleHQpOiBXZWJHTFByb2dyYW0ge1xuICByZXR1cm4gdGhyb3dJZk51bGw8V2ViR0xQcm9ncmFtPihcbiAgICAgIGdsLCAoKSA9PiBnbC5jcmVhdGVQcm9ncmFtKCksICdVbmFibGUgdG8gY3JlYXRlIFdlYkdMUHJvZ3JhbS4nKTtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGxpbmtQcm9ncmFtKGdsOiBXZWJHTFJlbmRlcmluZ0NvbnRleHQsIHByb2dyYW06IFdlYkdMUHJvZ3JhbSkge1xuICBjYWxsQW5kQ2hlY2soZ2wsICgpID0+IGdsLmxpbmtQcm9ncmFtKHByb2dyYW0pKTtcbiAgaWYgKGVudigpLmdldCgnRU5HSU5FX0NPTVBJTEVfT05MWScpKSB7XG4gICAgcmV0dXJuO1xuICB9XG4gIGlmIChnbC5nZXRQcm9ncmFtUGFyYW1ldGVyKHByb2dyYW0sIGdsLkxJTktfU1RBVFVTKSA9PT0gZmFsc2UpIHtcbiAgICBjb25zb2xlLmxvZyhnbC5nZXRQcm9ncmFtSW5mb0xvZyhwcm9ncmFtKSk7XG4gICAgdGhyb3cgbmV3IEVycm9yKCdGYWlsZWQgdG8gbGluayB2ZXJ0ZXggYW5kIGZyYWdtZW50IHNoYWRlcnMuJyk7XG4gIH1cbn1cblxuZXhwb3J0IGZ1bmN0aW9uIHZhbGlkYXRlUHJvZ3JhbShcbiAgICBnbDogV2ViR0xSZW5kZXJpbmdDb250ZXh0LCBwcm9ncmFtOiBXZWJHTFByb2dyYW0pIHtcbiAgY2FsbEFuZENoZWNrKGdsLCAoKSA9PiBnbC52YWxpZGF0ZVByb2dyYW0ocHJvZ3JhbSkpO1xuICBpZiAoZ2wuZ2V0UHJvZ3JhbVBhcmFtZXRlcihwcm9ncmFtLCBnbC5WQUxJREFURV9TVEFUVVMpID09PSBmYWxzZSkge1xuICAgIGNvbnNvbGUubG9nKGdsLmdldFByb2dyYW1JbmZvTG9nKHByb2dyYW0pKTtcbiAgICB0aHJvdyBuZXcgRXJyb3IoJ1NoYWRlciBwcm9ncmFtIHZhbGlkYXRpb24gZmFpbGVkLicpO1xuICB9XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBjcmVhdGVTdGF0aWNWZXJ0ZXhCdWZmZXIoXG4gICAgZ2w6IFdlYkdMUmVuZGVyaW5nQ29udGV4dCwgZGF0YTogRmxvYXQzMkFycmF5KTogV2ViR0xCdWZmZXIge1xuICBjb25zdCBidWZmZXI6IFdlYkdMQnVmZmVyID0gdGhyb3dJZk51bGw8V2ViR0xCdWZmZXI+KFxuICAgICAgZ2wsICgpID0+IGdsLmNyZWF0ZUJ1ZmZlcigpLCAnVW5hYmxlIHRvIGNyZWF0ZSBXZWJHTEJ1ZmZlcicpO1xuICBjYWxsQW5kQ2hlY2soZ2wsICgpID0+IGdsLmJpbmRCdWZmZXIoZ2wuQVJSQVlfQlVGRkVSLCBidWZmZXIpKTtcbiAgY2FsbEFuZENoZWNrKGdsLCAoKSA9PiBnbC5idWZmZXJEYXRhKGdsLkFSUkFZX0JVRkZFUiwgZGF0YSwgZ2wuU1RBVElDX0RSQVcpKTtcbiAgcmV0dXJuIGJ1ZmZlcjtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGNyZWF0ZVN0YXRpY0luZGV4QnVmZmVyKFxuICAgIGdsOiBXZWJHTFJlbmRlcmluZ0NvbnRleHQsIGRhdGE6IFVpbnQxNkFycmF5KTogV2ViR0xCdWZmZXIge1xuICBjb25zdCBidWZmZXI6IFdlYkdMQnVmZmVyID0gdGhyb3dJZk51bGw8V2ViR0xCdWZmZXI+KFxuICAgICAgZ2wsICgpID0+IGdsLmNyZWF0ZUJ1ZmZlcigpLCAnVW5hYmxlIHRvIGNyZWF0ZSBXZWJHTEJ1ZmZlcicpO1xuICBjYWxsQW5kQ2hlY2soZ2wsICgpID0+IGdsLmJpbmRCdWZmZXIoZ2wuRUxFTUVOVF9BUlJBWV9CVUZGRVIsIGJ1ZmZlcikpO1xuICBjYWxsQW5kQ2hlY2soXG4gICAgICBnbCwgKCkgPT4gZ2wuYnVmZmVyRGF0YShnbC5FTEVNRU5UX0FSUkFZX0JVRkZFUiwgZGF0YSwgZ2wuU1RBVElDX0RSQVcpKTtcbiAgcmV0dXJuIGJ1ZmZlcjtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGdldE51bUNoYW5uZWxzKCk6IG51bWJlciB7XG4gIGlmIChlbnYoKS5nZXROdW1iZXIoJ1dFQkdMX1ZFUlNJT04nKSA9PT0gMikge1xuICAgIHJldHVybiAxO1xuICB9XG4gIHJldHVybiA0O1xufVxuXG5leHBvcnQgZnVuY3Rpb24gY3JlYXRlVGV4dHVyZShnbDogV2ViR0xSZW5kZXJpbmdDb250ZXh0KTogV2ViR0xUZXh0dXJlIHtcbiAgcmV0dXJuIHRocm93SWZOdWxsPFdlYkdMVGV4dHVyZT4oXG4gICAgICBnbCwgKCkgPT4gZ2wuY3JlYXRlVGV4dHVyZSgpLCAnVW5hYmxlIHRvIGNyZWF0ZSBXZWJHTFRleHR1cmUuJyk7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiB2YWxpZGF0ZVRleHR1cmVTaXplKHdpZHRoOiBudW1iZXIsIGhlaWdodDogbnVtYmVyKSB7XG4gIGNvbnN0IG1heFRleHR1cmVTaXplID0gZW52KCkuZ2V0TnVtYmVyKCdXRUJHTF9NQVhfVEVYVFVSRV9TSVpFJyk7XG4gIGlmICgod2lkdGggPD0gMCkgfHwgKGhlaWdodCA8PSAwKSkge1xuICAgIGNvbnN0IHJlcXVlc3RlZCA9IGBbJHt3aWR0aH14JHtoZWlnaHR9XWA7XG4gICAgdGhyb3cgbmV3IEVycm9yKCdSZXF1ZXN0ZWQgdGV4dHVyZSBzaXplICcgKyByZXF1ZXN0ZWQgKyAnIGlzIGludmFsaWQuJyk7XG4gIH1cbiAgaWYgKCh3aWR0aCA+IG1heFRleHR1cmVTaXplKSB8fCAoaGVpZ2h0ID4gbWF4VGV4dHVyZVNpemUpKSB7XG4gICAgY29uc3QgcmVxdWVzdGVkID0gYFske3dpZHRofXgke2hlaWdodH1dYDtcbiAgICBjb25zdCBtYXggPSBgWyR7bWF4VGV4dHVyZVNpemV9eCR7bWF4VGV4dHVyZVNpemV9XWA7XG4gICAgdGhyb3cgbmV3IEVycm9yKFxuICAgICAgICAnUmVxdWVzdGVkIHRleHR1cmUgc2l6ZSAnICsgcmVxdWVzdGVkICtcbiAgICAgICAgJyBncmVhdGVyIHRoYW4gV2ViR0wgbWF4aW11bSBvbiB0aGlzIGJyb3dzZXIgLyBHUFUgJyArIG1heCArICcuJyk7XG4gIH1cbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGNyZWF0ZUZyYW1lYnVmZmVyKGdsOiBXZWJHTFJlbmRlcmluZ0NvbnRleHQpOiBXZWJHTEZyYW1lYnVmZmVyIHtcbiAgcmV0dXJuIHRocm93SWZOdWxsPFdlYkdMRnJhbWVidWZmZXI+KFxuICAgICAgZ2wsICgpID0+IGdsLmNyZWF0ZUZyYW1lYnVmZmVyKCksICdVbmFibGUgdG8gY3JlYXRlIFdlYkdMRnJhbWVidWZmZXIuJyk7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBiaW5kVmVydGV4QnVmZmVyVG9Qcm9ncmFtQXR0cmlidXRlKFxuICAgIGdsOiBXZWJHTFJlbmRlcmluZ0NvbnRleHQsIHByb2dyYW06IFdlYkdMUHJvZ3JhbSwgYXR0cmlidXRlOiBzdHJpbmcsXG4gICAgYnVmZmVyOiBXZWJHTEJ1ZmZlciwgYXJyYXlFbnRyaWVzUGVySXRlbTogbnVtYmVyLCBpdGVtU3RyaWRlSW5CeXRlczogbnVtYmVyLFxuICAgIGl0ZW1PZmZzZXRJbkJ5dGVzOiBudW1iZXIpOiBib29sZWFuIHtcbiAgY29uc3QgbG9jID0gZ2wuZ2V0QXR0cmliTG9jYXRpb24ocHJvZ3JhbSwgYXR0cmlidXRlKTtcbiAgaWYgKGxvYyA9PT0gLTEpIHtcbiAgICAvLyBUaGUgR1BVIGNvbXBpbGVyIGRlY2lkZWQgdG8gc3RyaXAgb3V0IHRoaXMgYXR0cmlidXRlIGJlY2F1c2UgaXQncyB1bnVzZWQsXG4gICAgLy8gdGh1cyBubyBuZWVkIHRvIGJpbmQuXG4gICAgcmV0dXJuIGZhbHNlO1xuICB9XG4gIGNhbGxBbmRDaGVjayhnbCwgKCkgPT4gZ2wuYmluZEJ1ZmZlcihnbC5BUlJBWV9CVUZGRVIsIGJ1ZmZlcikpO1xuICBjYWxsQW5kQ2hlY2soXG4gICAgICBnbCxcbiAgICAgICgpID0+IGdsLnZlcnRleEF0dHJpYlBvaW50ZXIoXG4gICAgICAgICAgbG9jLCBhcnJheUVudHJpZXNQZXJJdGVtLCBnbC5GTE9BVCwgZmFsc2UsIGl0ZW1TdHJpZGVJbkJ5dGVzLFxuICAgICAgICAgIGl0ZW1PZmZzZXRJbkJ5dGVzKSk7XG4gIGNhbGxBbmRDaGVjayhnbCwgKCkgPT4gZ2wuZW5hYmxlVmVydGV4QXR0cmliQXJyYXkobG9jKSk7XG4gIHJldHVybiB0cnVlO1xufVxuXG5leHBvcnQgZnVuY3Rpb24gYmluZFRleHR1cmVVbml0KFxuICAgIGdsOiBXZWJHTFJlbmRlcmluZ0NvbnRleHQsIHRleHR1cmU6IFdlYkdMVGV4dHVyZSwgdGV4dHVyZVVuaXQ6IG51bWJlcikge1xuICB2YWxpZGF0ZVRleHR1cmVVbml0KGdsLCB0ZXh0dXJlVW5pdCk7XG4gIGNhbGxBbmRDaGVjayhnbCwgKCkgPT4gZ2wuYWN0aXZlVGV4dHVyZShnbC5URVhUVVJFMCArIHRleHR1cmVVbml0KSk7XG4gIGNhbGxBbmRDaGVjayhnbCwgKCkgPT4gZ2wuYmluZFRleHR1cmUoZ2wuVEVYVFVSRV8yRCwgdGV4dHVyZSkpO1xufVxuXG5leHBvcnQgZnVuY3Rpb24gdW5iaW5kVGV4dHVyZVVuaXQoXG4gICAgZ2w6IFdlYkdMUmVuZGVyaW5nQ29udGV4dCwgdGV4dHVyZVVuaXQ6IG51bWJlcikge1xuICB2YWxpZGF0ZVRleHR1cmVVbml0KGdsLCB0ZXh0dXJlVW5pdCk7XG4gIGNhbGxBbmRDaGVjayhnbCwgKCkgPT4gZ2wuYWN0aXZlVGV4dHVyZShnbC5URVhUVVJFMCArIHRleHR1cmVVbml0KSk7XG4gIGNhbGxBbmRDaGVjayhnbCwgKCkgPT4gZ2wuYmluZFRleHR1cmUoZ2wuVEVYVFVSRV8yRCwgbnVsbCkpO1xufVxuXG5leHBvcnQgZnVuY3Rpb24gZ2V0UHJvZ3JhbVVuaWZvcm1Mb2NhdGlvbk9yVGhyb3coXG4gICAgZ2w6IFdlYkdMUmVuZGVyaW5nQ29udGV4dCwgcHJvZ3JhbTogV2ViR0xQcm9ncmFtLFxuICAgIHVuaWZvcm1OYW1lOiBzdHJpbmcpOiBXZWJHTFVuaWZvcm1Mb2NhdGlvbiB7XG4gIHJldHVybiB0aHJvd0lmTnVsbDxXZWJHTFVuaWZvcm1Mb2NhdGlvbj4oXG4gICAgICBnbCwgKCkgPT4gZ2wuZ2V0VW5pZm9ybUxvY2F0aW9uKHByb2dyYW0sIHVuaWZvcm1OYW1lKSxcbiAgICAgICd1bmlmb3JtIFwiJyArIHVuaWZvcm1OYW1lICsgJ1wiIG5vdCBwcmVzZW50IGluIHByb2dyYW0uJyk7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBnZXRQcm9ncmFtVW5pZm9ybUxvY2F0aW9uKFxuICAgIGdsOiBXZWJHTFJlbmRlcmluZ0NvbnRleHQsIHByb2dyYW06IFdlYkdMUHJvZ3JhbSxcbiAgICB1bmlmb3JtTmFtZTogc3RyaW5nKTogV2ViR0xVbmlmb3JtTG9jYXRpb24ge1xuICByZXR1cm4gZ2wuZ2V0VW5pZm9ybUxvY2F0aW9uKHByb2dyYW0sIHVuaWZvcm1OYW1lKTtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGJpbmRUZXh0dXJlVG9Qcm9ncmFtVW5pZm9ybVNhbXBsZXIoXG4gICAgZ2w6IFdlYkdMUmVuZGVyaW5nQ29udGV4dCwgdGV4dHVyZTogV2ViR0xUZXh0dXJlLFxuICAgIHVuaWZvcm1TYW1wbGVyTG9jYXRpb246IFdlYkdMVW5pZm9ybUxvY2F0aW9uLCB0ZXh0dXJlVW5pdDogbnVtYmVyKSB7XG4gIGNhbGxBbmRDaGVjayhnbCwgKCkgPT4gYmluZFRleHR1cmVVbml0KGdsLCB0ZXh0dXJlLCB0ZXh0dXJlVW5pdCkpO1xuICBjYWxsQW5kQ2hlY2soZ2wsICgpID0+IGdsLnVuaWZvcm0xaSh1bmlmb3JtU2FtcGxlckxvY2F0aW9uLCB0ZXh0dXJlVW5pdCkpO1xufVxuXG5leHBvcnQgZnVuY3Rpb24gYmluZENhbnZhc1RvRnJhbWVidWZmZXIoZ2w6IFdlYkdMUmVuZGVyaW5nQ29udGV4dCkge1xuICBjYWxsQW5kQ2hlY2soZ2wsICgpID0+IGdsLmJpbmRGcmFtZWJ1ZmZlcihnbC5GUkFNRUJVRkZFUiwgbnVsbCkpO1xuICBjYWxsQW5kQ2hlY2soZ2wsICgpID0+IGdsLnZpZXdwb3J0KDAsIDAsIGdsLmNhbnZhcy53aWR0aCwgZ2wuY2FudmFzLmhlaWdodCkpO1xuICBjYWxsQW5kQ2hlY2soZ2wsICgpID0+IGdsLnNjaXNzb3IoMCwgMCwgZ2wuY2FudmFzLndpZHRoLCBnbC5jYW52YXMuaGVpZ2h0KSk7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBiaW5kQ29sb3JUZXh0dXJlVG9GcmFtZWJ1ZmZlcihcbiAgICBnbDogV2ViR0xSZW5kZXJpbmdDb250ZXh0LCB0ZXh0dXJlOiBXZWJHTFRleHR1cmUsXG4gICAgZnJhbWVidWZmZXI6IFdlYkdMRnJhbWVidWZmZXIpIHtcbiAgY2FsbEFuZENoZWNrKGdsLCAoKSA9PiBnbC5iaW5kRnJhbWVidWZmZXIoZ2wuRlJBTUVCVUZGRVIsIGZyYW1lYnVmZmVyKSk7XG4gIGNhbGxBbmRDaGVjayhcbiAgICAgIGdsLFxuICAgICAgKCkgPT4gZ2wuZnJhbWVidWZmZXJUZXh0dXJlMkQoXG4gICAgICAgICAgZ2wuRlJBTUVCVUZGRVIsIGdsLkNPTE9SX0FUVEFDSE1FTlQwLCBnbC5URVhUVVJFXzJELCB0ZXh0dXJlLCAwKSk7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiB1bmJpbmRDb2xvclRleHR1cmVGcm9tRnJhbWVidWZmZXIoXG4gICAgZ2w6IFdlYkdMUmVuZGVyaW5nQ29udGV4dCwgZnJhbWVidWZmZXI6IFdlYkdMRnJhbWVidWZmZXIpIHtcbiAgY2FsbEFuZENoZWNrKGdsLCAoKSA9PiBnbC5iaW5kRnJhbWVidWZmZXIoZ2wuRlJBTUVCVUZGRVIsIGZyYW1lYnVmZmVyKSk7XG4gIGNhbGxBbmRDaGVjayhcbiAgICAgIGdsLFxuICAgICAgKCkgPT4gZ2wuZnJhbWVidWZmZXJUZXh0dXJlMkQoXG4gICAgICAgICAgZ2wuRlJBTUVCVUZGRVIsIGdsLkNPTE9SX0FUVEFDSE1FTlQwLCBnbC5URVhUVVJFXzJELCBudWxsLCAwKSk7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiB2YWxpZGF0ZUZyYW1lYnVmZmVyKGdsOiBXZWJHTFJlbmRlcmluZ0NvbnRleHQpIHtcbiAgY29uc3Qgc3RhdHVzID0gZ2wuY2hlY2tGcmFtZWJ1ZmZlclN0YXR1cyhnbC5GUkFNRUJVRkZFUik7XG4gIGlmIChzdGF0dXMgIT09IGdsLkZSQU1FQlVGRkVSX0NPTVBMRVRFKSB7XG4gICAgdGhyb3cgbmV3IEVycm9yKFxuICAgICAgICAnRXJyb3IgYmluZGluZyBmcmFtZWJ1ZmZlcjogJyArIGdldEZyYW1lYnVmZmVyRXJyb3JNZXNzYWdlKGdsLCBzdGF0dXMpKTtcbiAgfVxufVxuXG5leHBvcnQgZnVuY3Rpb24gZ2V0RnJhbWVidWZmZXJFcnJvck1lc3NhZ2UoXG4gICAgZ2w6IFdlYkdMUmVuZGVyaW5nQ29udGV4dCwgc3RhdHVzOiBudW1iZXIpOiBzdHJpbmcge1xuICBzd2l0Y2ggKHN0YXR1cykge1xuICAgIGNhc2UgZ2wuRlJBTUVCVUZGRVJfSU5DT01QTEVURV9BVFRBQ0hNRU5UOlxuICAgICAgcmV0dXJuICdGUkFNRUJVRkZFUl9JTkNPTVBMRVRFX0FUVEFDSE1FTlQnO1xuICAgIGNhc2UgZ2wuRlJBTUVCVUZGRVJfSU5DT01QTEVURV9NSVNTSU5HX0FUVEFDSE1FTlQ6XG4gICAgICByZXR1cm4gJ0ZSQU1FQlVGRkVSX0lOQ09NUExFVEVfTUlTU0lOR19BVFRBQ0hNRU5UJztcbiAgICBjYXNlIGdsLkZSQU1FQlVGRkVSX0lOQ09NUExFVEVfRElNRU5TSU9OUzpcbiAgICAgIHJldHVybiAnRlJBTUVCVUZGRVJfSU5DT01QTEVURV9ESU1FTlNJT05TJztcbiAgICBjYXNlIGdsLkZSQU1FQlVGRkVSX1VOU1VQUE9SVEVEOlxuICAgICAgcmV0dXJuICdGUkFNRUJVRkZFUl9VTlNVUFBPUlRFRCc7XG4gICAgZGVmYXVsdDpcbiAgICAgIHJldHVybiBgdW5rbm93biBlcnJvciAke3N0YXR1c31gO1xuICB9XG59XG5cbmZ1bmN0aW9uIHRocm93SWZOdWxsPFQ+KFxuICAgIGdsOiBXZWJHTFJlbmRlcmluZ0NvbnRleHQsIHJldHVyblRPck51bGw6ICgpID0+IFQgfCBudWxsLFxuICAgIGZhaWx1cmVNZXNzYWdlOiBzdHJpbmcpOiBUIHtcbiAgY29uc3QgdE9yTnVsbDogVHxudWxsID0gY2FsbEFuZENoZWNrKGdsLCAoKSA9PiByZXR1cm5UT3JOdWxsKCkpO1xuICBpZiAodE9yTnVsbCA9PSBudWxsKSB7XG4gICAgdGhyb3cgbmV3IEVycm9yKGZhaWx1cmVNZXNzYWdlKTtcbiAgfVxuICByZXR1cm4gdE9yTnVsbDtcbn1cblxuZnVuY3Rpb24gdmFsaWRhdGVUZXh0dXJlVW5pdChnbDogV2ViR0xSZW5kZXJpbmdDb250ZXh0LCB0ZXh0dXJlVW5pdDogbnVtYmVyKSB7XG4gIGNvbnN0IG1heFRleHR1cmVVbml0ID0gZ2wuTUFYX0NPTUJJTkVEX1RFWFRVUkVfSU1BR0VfVU5JVFMgLSAxO1xuICBjb25zdCBnbFRleHR1cmVVbml0ID0gdGV4dHVyZVVuaXQgKyBnbC5URVhUVVJFMDtcbiAgaWYgKGdsVGV4dHVyZVVuaXQgPCBnbC5URVhUVVJFMCB8fCBnbFRleHR1cmVVbml0ID4gbWF4VGV4dHVyZVVuaXQpIHtcbiAgICBjb25zdCB0ZXh0dXJlVW5pdFJhbmdlID0gYFtnbC5URVhUVVJFMCwgZ2wuVEVYVFVSRSR7bWF4VGV4dHVyZVVuaXR9XWA7XG4gICAgdGhyb3cgbmV3IEVycm9yKGB0ZXh0dXJlVW5pdCBtdXN0IGJlIGluICR7dGV4dHVyZVVuaXRSYW5nZX0uYCk7XG4gIH1cbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGdldEJhdGNoRGltKHNoYXBlOiBudW1iZXJbXSwgZGltc1RvU2tpcCA9IDIpOiBudW1iZXIge1xuICByZXR1cm4gdXRpbC5zaXplRnJvbVNoYXBlKHNoYXBlLnNsaWNlKDAsIHNoYXBlLmxlbmd0aCAtIGRpbXNUb1NraXApKTtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGdldFJvd3NDb2xzKHNoYXBlOiBudW1iZXJbXSk6IFtudW1iZXIsIG51bWJlcl0ge1xuICBpZiAoc2hhcGUubGVuZ3RoID09PSAwKSB7XG4gICAgdGhyb3cgRXJyb3IoJ0Nhbm5vdCBnZXQgcm93cyBhbmQgY29sdW1ucyBvZiBhbiBlbXB0eSBzaGFwZSBhcnJheS4nKTtcbiAgfVxuXG4gIHJldHVybiBbXG4gICAgc2hhcGUubGVuZ3RoID4gMSA/IHNoYXBlW3NoYXBlLmxlbmd0aCAtIDJdIDogMSwgc2hhcGVbc2hhcGUubGVuZ3RoIC0gMV1cbiAgXTtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGdldFNoYXBlQXMzRChzaGFwZTogbnVtYmVyW10pOiBbbnVtYmVyLCBudW1iZXIsIG51bWJlcl0ge1xuICBsZXQgc2hhcGVBczNEOiBbbnVtYmVyLCBudW1iZXIsIG51bWJlcl0gPSBbMSwgMSwgMV07XG4gIGNvbnN0IGlzU2NhbGFyID0gc2hhcGUubGVuZ3RoID09PSAwIHx8IChzaGFwZS5sZW5ndGggPT09IDEgJiYgc2hhcGVbMF0gPT09IDEpO1xuICBpZiAoIWlzU2NhbGFyKSB7XG4gICAgc2hhcGVBczNEID1cbiAgICAgICAgW2dldEJhdGNoRGltKHNoYXBlKSwgLi4uZ2V0Um93c0NvbHMoc2hhcGUpXSBhcyBbbnVtYmVyLCBudW1iZXIsIG51bWJlcl07XG4gIH1cbiAgcmV0dXJuIHNoYXBlQXMzRDtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGdldFRleHR1cmVTaGFwZUZyb21Mb2dpY2FsU2hhcGUoXG4gICAgbG9nU2hhcGU6IG51bWJlcltdLCBpc1BhY2tlZCA9IGZhbHNlKTogW251bWJlciwgbnVtYmVyXSB7XG4gIGxldCBtYXhUZXhTaXplID0gZW52KCkuZ2V0TnVtYmVyKCdXRUJHTF9NQVhfVEVYVFVSRV9TSVpFJyk7XG4gIGxldCBtYXhTaXplRm9yTmFycm93VGV4ID1cbiAgICAgIGVudigpLmdldE51bWJlcignV0VCR0xfTUFYX1NJWkVfRk9SX05BUlJPV19URVhUVVJFJyk7XG4gIGlmIChtYXhTaXplRm9yTmFycm93VGV4ID09PSBJbmZpbml0eSAmJlxuICAgICAgZW52KCkuZ2V0Qm9vbCgnV0VCR0xfQVVUT19TUVVBUklGWV9OQVJST1dfVEVYVFVSRV9TSEFQRScpKSB7XG4gICAgbWF4U2l6ZUZvck5hcnJvd1RleCA9IG1heFRleFNpemUgLyAyO1xuICB9XG5cbiAgaWYgKGlzUGFja2VkKSB7XG4gICAgbWF4VGV4U2l6ZSA9IG1heFRleFNpemUgKiAyO1xuICAgIG1heFNpemVGb3JOYXJyb3dUZXggPSBtYXhTaXplRm9yTmFycm93VGV4ICogMjtcblxuICAgIC8vIFRoaXMgbG9naWMgZW5zdXJlcyB3ZSBhY2N1cmF0ZWx5IGNvdW50IHRoZSBudW1iZXIgb2YgcGFja2VkIHRleGVscyBuZWVkZWRcbiAgICAvLyB0byBhY2NvbW1vZGF0ZSB0aGUgdGVuc29yLiBXZSBjYW4gb25seSBwYWNrIHZhbHVlcyBpbiB0aGUgc2FtZSB0ZXhlbCBpZlxuICAgIC8vIHRoZXkgYXJlIGZyb20gYWRqYWNlbnQgcGFpcnMgb2Ygcm93cy9jb2xzIHdpdGhpbiB0aGUgc2FtZSBiYXRjaC4gU28gaWYgYVxuICAgIC8vIHRlbnNvciBoYXMgMyByb3dzLCB3ZSBwcmV0ZW5kIGl0IGhhcyA0IHJvd3MgaW4gb3JkZXIgdG8gYWNjb3VudCBmb3IgdGhlXG4gICAgLy8gZmFjdCB0aGF0IHRoZSB0ZXhlbHMgY29udGFpbmluZyB0aGUgdGhpcmQgcm93IGFyZSBoYWxmIGVtcHR5LlxuICAgIGxvZ1NoYXBlID0gbG9nU2hhcGUubWFwKFxuICAgICAgICAoZCwgaSkgPT4gaSA+PSBsb2dTaGFwZS5sZW5ndGggLSAyID9cbiAgICAgICAgICAgIHV0aWwubmVhcmVzdExhcmdlckV2ZW4obG9nU2hhcGVbaV0pIDpcbiAgICAgICAgICAgIGxvZ1NoYXBlW2ldKTtcblxuICAgIC8vIFBhY2tlZCB0ZXh0dXJlIGhlaWdodCBpcyBhdCBsZWFzdCAyICh0aGUgY2hhbm5lbCBoZWlnaHQgb2YgYSBzaW5nbGVcbiAgICAvLyB0ZXhlbCkuXG4gICAgaWYgKGxvZ1NoYXBlLmxlbmd0aCA9PT0gMSkge1xuICAgICAgbG9nU2hhcGUgPSBbMiwgbG9nU2hhcGVbMF1dO1xuICAgIH1cbiAgfVxuXG4gIC8vIElmIGxvZ2ljYWwgc2hhcGUgaXMgMiwgd2UgZG9uJ3Qgc3F1ZWV6ZSwgc2luY2Ugd2Ugd2FudCB0byBtYXRjaCBwaHlzaWNhbC5cbiAgaWYgKGxvZ1NoYXBlLmxlbmd0aCAhPT0gMikge1xuICAgIGNvbnN0IHNxdWVlemVSZXN1bHQgPSB1dGlsLnNxdWVlemVTaGFwZShsb2dTaGFwZSk7XG4gICAgbG9nU2hhcGUgPSBzcXVlZXplUmVzdWx0Lm5ld1NoYXBlO1xuICB9XG5cbiAgbGV0IHNpemUgPSB1dGlsLnNpemVGcm9tU2hhcGUobG9nU2hhcGUpO1xuICBsZXQgdGV4dHVyZVNoYXBlOiBbbnVtYmVyLCBudW1iZXJdID0gbnVsbDtcbiAgaWYgKGxvZ1NoYXBlLmxlbmd0aCA8PSAxICYmIHNpemUgPD0gbWF4VGV4U2l6ZSkge1xuICAgIHRleHR1cmVTaGFwZSA9IFsxLCBzaXplXTtcbiAgfSBlbHNlIGlmIChcbiAgICAgIGxvZ1NoYXBlLmxlbmd0aCA9PT0gMiAmJiBsb2dTaGFwZVswXSA8PSBtYXhUZXhTaXplICYmXG4gICAgICBsb2dTaGFwZVsxXSA8PSBtYXhUZXhTaXplKSB7XG4gICAgdGV4dHVyZVNoYXBlID0gbG9nU2hhcGUgYXMgW251bWJlciwgbnVtYmVyXTtcbiAgfSBlbHNlIGlmIChcbiAgICAgIGxvZ1NoYXBlLmxlbmd0aCA9PT0gMyAmJiBsb2dTaGFwZVswXSAqIGxvZ1NoYXBlWzFdIDw9IG1heFRleFNpemUgJiZcbiAgICAgIGxvZ1NoYXBlWzJdIDw9IG1heFRleFNpemUpIHtcbiAgICB0ZXh0dXJlU2hhcGUgPSBbbG9nU2hhcGVbMF0gKiBsb2dTaGFwZVsxXSwgbG9nU2hhcGVbMl1dO1xuICB9IGVsc2UgaWYgKFxuICAgICAgbG9nU2hhcGUubGVuZ3RoID09PSAzICYmIGxvZ1NoYXBlWzBdIDw9IG1heFRleFNpemUgJiZcbiAgICAgIGxvZ1NoYXBlWzFdICogbG9nU2hhcGVbMl0gPD0gbWF4VGV4U2l6ZSkge1xuICAgIHRleHR1cmVTaGFwZSA9IFtsb2dTaGFwZVswXSwgbG9nU2hhcGVbMV0gKiBsb2dTaGFwZVsyXV07XG4gIH0gZWxzZSBpZiAoXG4gICAgICBsb2dTaGFwZS5sZW5ndGggPT09IDQgJiZcbiAgICAgIGxvZ1NoYXBlWzBdICogbG9nU2hhcGVbMV0gKiBsb2dTaGFwZVsyXSA8PSBtYXhUZXhTaXplICYmXG4gICAgICBsb2dTaGFwZVszXSA8PSBtYXhUZXhTaXplKSB7XG4gICAgdGV4dHVyZVNoYXBlID0gW2xvZ1NoYXBlWzBdICogbG9nU2hhcGVbMV0gKiBsb2dTaGFwZVsyXSwgbG9nU2hhcGVbM11dO1xuICB9IGVsc2UgaWYgKFxuICAgICAgbG9nU2hhcGUubGVuZ3RoID09PSA0ICYmIGxvZ1NoYXBlWzBdIDw9IG1heFRleFNpemUgJiZcbiAgICAgIGxvZ1NoYXBlWzFdICogbG9nU2hhcGVbMl0gKiBsb2dTaGFwZVszXSA8PSBtYXhUZXhTaXplKSB7XG4gICAgdGV4dHVyZVNoYXBlID0gW2xvZ1NoYXBlWzBdLCBsb2dTaGFwZVsxXSAqIGxvZ1NoYXBlWzJdICogbG9nU2hhcGVbM11dO1xuICB9XG5cbiAgLy8gdHJ1ZSBpZiBvbmUgZWRnZSBsZW5ndGggaXMgMSAoMSBvciAyLCBpZiBwYWNrZWQpLCB3aGlsZSBhbm90aGVyIGVkZ2VcbiAgLy8gbGVuZ3RoIGV4Y2VlZHMgbWF4U2l6ZUZvck5hcnJvd1RleC5cbiAgY29uc3QgaXNMb25nTmFycm93VGV4ID0gdGV4dHVyZVNoYXBlICE9IG51bGwgJiZcbiAgICAgIE1hdGgubWF4KC4uLnRleHR1cmVTaGFwZSkgPiBtYXhTaXplRm9yTmFycm93VGV4ICYmXG4gICAgICBNYXRoLm1pbiguLi50ZXh0dXJlU2hhcGUpIDw9IChpc1BhY2tlZCA/IDIgOiAxKSAmJlxuICAgICAgTWF0aC5taW4oLi4udGV4dHVyZVNoYXBlKSA+IDA7XG5cbiAgaWYgKHRleHR1cmVTaGFwZSA9PSBudWxsIHx8IGlzTG9uZ05hcnJvd1RleCkge1xuICAgIGlmIChpc1BhY2tlZCkge1xuICAgICAgLy8gRm9yIHBhY2tlZCB0ZXh0dXJlcyBzaXplIGVxdWFscyB0aGUgbnVtYmVyIG9mIGNoYW5uZWxzIHJlcXVpcmVkIHRvXG4gICAgICAvLyBhY2NvbW1vZGF0ZSB0aGUgdGV4dHVyZSBkYXRhLiBIb3dldmVyIGluIG9yZGVyIHRvIHNxdWFyaWZ5IHN1Y2ggdGhhdFxuICAgICAgLy8gaW5uZXIgZGltZW5zaW9ucyBzdGF5IGV2ZW4sIHdlIHJld3JpdGUgc2l6ZSB0byBlcXVhbCB0aGUgbnVtYmVyIG9mXG4gICAgICAvLyB0ZXhlbHMuIFRoZW4gaW4gdGhlIHJldHVybiBzdGF0ZW1lbnQgd2UgcmVoeWRyYXRlIHRoZSBzcXVhcmlmaWVkXG4gICAgICAvLyBkaW1lbnNpb25zIHRvIGNoYW5uZWwgdW5pdHMuXG5cbiAgICAgIGNvbnN0IGJhdGNoRGltID0gZ2V0QmF0Y2hEaW0obG9nU2hhcGUpO1xuICAgICAgbGV0IHJvd3MgPSAyLCBjb2xzID0gMjtcbiAgICAgIGlmIChsb2dTaGFwZS5sZW5ndGgpIHtcbiAgICAgICAgW3Jvd3MsIGNvbHNdID0gZ2V0Um93c0NvbHMobG9nU2hhcGUpO1xuICAgICAgfVxuICAgICAgc2l6ZSA9IGJhdGNoRGltICogKHJvd3MgLyAyKSAqIChjb2xzIC8gMik7XG4gICAgICB0ZXh0dXJlU2hhcGUgPVxuICAgICAgICAgIHV0aWwuc2l6ZVRvU3F1YXJpc2hTaGFwZShzaXplKS5tYXAoZCA9PiBkICogMikgYXMgW251bWJlciwgbnVtYmVyXTtcbiAgICB9IGVsc2Uge1xuICAgICAgdGV4dHVyZVNoYXBlID0gdXRpbC5zaXplVG9TcXVhcmlzaFNoYXBlKHNpemUpO1xuICAgIH1cbiAgfVxuXG4gIHJldHVybiB0ZXh0dXJlU2hhcGU7XG59XG5cbmZ1bmN0aW9uIGlzRXZlbihuOiBudW1iZXIpOiBib29sZWFuIHtcbiAgcmV0dXJuIG4gJSAyID09PSAwO1xufVxuXG4vKipcbiAqIFRoaXMgZGV0ZXJtaW5lcyB3aGV0aGVyIHJlc2hhcGluZyBhIHBhY2tlZCB0ZXh0dXJlIHJlcXVpcmVzIHJlYXJyYW5naW5nXG4gKiB0aGUgZGF0YSB3aXRoaW4gdGhlIHRleHR1cmUsIGFzc3VtaW5nIDJ4MiBwYWNraW5nLlxuICovXG5leHBvcnQgZnVuY3Rpb24gaXNSZXNoYXBlRnJlZShzaGFwZTE6IG51bWJlcltdLCBzaGFwZTI6IG51bWJlcltdKTogYm9vbGVhbiB7XG4gIHNoYXBlMSA9IHNoYXBlMS5zbGljZSgtMik7XG4gIHNoYXBlMiA9IHNoYXBlMi5zbGljZSgtMik7XG5cbiAgaWYgKHV0aWwuYXJyYXlzRXF1YWwoc2hhcGUxLCBzaGFwZTIpKSB7XG4gICAgcmV0dXJuIHRydWU7XG4gIH1cblxuICBpZiAoIXNoYXBlMS5sZW5ndGggfHwgIXNoYXBlMi5sZW5ndGgpIHsgIC8vIE9uZSBvZiB0aGUgc2hhcGVzIGlzIGEgc2NhbGFyLlxuICAgIHJldHVybiB0cnVlO1xuICB9XG5cbiAgaWYgKHNoYXBlMVswXSA9PT0gMCB8fCBzaGFwZTFbMV0gPT09IDAgfHwgc2hhcGUyWzBdID09PSAwIHx8XG4gICAgICBzaGFwZTJbMV0gPT09IDApIHtcbiAgICByZXR1cm4gdHJ1ZTtcbiAgfVxuXG4gIGlmIChzaGFwZTEubGVuZ3RoICE9PSBzaGFwZTIubGVuZ3RoKSB7ICAvLyBPbmUgb2YgdGhlIHNoYXBlcyBpcyBhIHZlY3Rvci5cbiAgICBjb25zdCBzaGFwZTFDb2xzID0gc2hhcGUxLnNsaWNlKC0xKVswXTtcbiAgICBjb25zdCBzaGFwZTJDb2xzID0gc2hhcGUyLnNsaWNlKC0xKVswXTtcbiAgICBpZiAoc2hhcGUxQ29scyA9PT0gc2hhcGUyQ29scykge1xuICAgICAgcmV0dXJuIHRydWU7XG4gICAgfVxuXG4gICAgaWYgKGlzRXZlbihzaGFwZTFDb2xzKSAmJiBpc0V2ZW4oc2hhcGUyQ29scykgJiZcbiAgICAgICAgKHNoYXBlMVswXSA9PT0gMSB8fCBzaGFwZTJbMF0gPT09IDEpKSB7XG4gICAgICByZXR1cm4gdHJ1ZTtcbiAgICB9XG4gIH1cbiAgcmV0dXJuIHNoYXBlMVsxXSA9PT0gc2hhcGUyWzFdICYmIGlzRXZlbihzaGFwZTFbMF0pICYmIGlzRXZlbihzaGFwZTJbMF0pO1xufVxuXG4vLyBXZSBjYWNoZSB3ZWJnbCBwYXJhbXMgYmVjYXVzZSB0aGUgZW52aXJvbm1lbnQgZ2V0cyByZXNldCBiZXR3ZWVuXG4vLyB1bml0IHRlc3RzIGFuZCB3ZSBkb24ndCB3YW50IHRvIGNvbnN0YW50bHkgcXVlcnkgdGhlIFdlYkdMQ29udGV4dCBmb3Jcbi8vIE1BWF9URVhUVVJFX1NJWkUuXG5sZXQgTUFYX1RFWFRVUkVfU0laRTogbnVtYmVyO1xubGV0IE1BWF9URVhUVVJFU19JTl9TSEFERVI6IG51bWJlcjtcblxuZXhwb3J0IGZ1bmN0aW9uIGdldFdlYkdMTWF4VGV4dHVyZVNpemUod2ViR0xWZXJzaW9uOiBudW1iZXIpOiBudW1iZXIge1xuICBpZiAoTUFYX1RFWFRVUkVfU0laRSA9PSBudWxsKSB7XG4gICAgY29uc3QgZ2wgPSBnZXRXZWJHTENvbnRleHQod2ViR0xWZXJzaW9uKTtcbiAgICBNQVhfVEVYVFVSRV9TSVpFID0gZ2wuZ2V0UGFyYW1ldGVyKGdsLk1BWF9URVhUVVJFX1NJWkUpO1xuICB9XG4gIHJldHVybiBNQVhfVEVYVFVSRV9TSVpFO1xufVxuXG5leHBvcnQgZnVuY3Rpb24gcmVzZXRNYXhUZXh0dXJlU2l6ZSgpIHtcbiAgTUFYX1RFWFRVUkVfU0laRSA9IG51bGw7XG59XG5leHBvcnQgZnVuY3Rpb24gcmVzZXRNYXhUZXh0dXJlc0luU2hhZGVyKCkge1xuICBNQVhfVEVYVFVSRVNfSU5fU0hBREVSID0gbnVsbDtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGdldE1heFRleHR1cmVzSW5TaGFkZXIod2ViR0xWZXJzaW9uOiBudW1iZXIpOiBudW1iZXIge1xuICBpZiAoTUFYX1RFWFRVUkVTX0lOX1NIQURFUiA9PSBudWxsKSB7XG4gICAgY29uc3QgZ2wgPSBnZXRXZWJHTENvbnRleHQod2ViR0xWZXJzaW9uKTtcbiAgICBNQVhfVEVYVFVSRVNfSU5fU0hBREVSID0gZ2wuZ2V0UGFyYW1ldGVyKGdsLk1BWF9URVhUVVJFX0lNQUdFX1VOSVRTKTtcbiAgfVxuICAvLyBXZSBjYXAgYXQgMTYgdG8gYXZvaWQgc3B1cmlvdXMgcnVudGltZSBcIm1lbW9yeSBleGhhdXN0ZWRcIiBlcnJvci5cbiAgcmV0dXJuIE1hdGgubWluKDE2LCBNQVhfVEVYVFVSRVNfSU5fU0hBREVSKTtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGdldFdlYkdMRGlzam9pbnRRdWVyeVRpbWVyVmVyc2lvbih3ZWJHTFZlcnNpb246IG51bWJlcik6XG4gICAgbnVtYmVyIHtcbiAgaWYgKHdlYkdMVmVyc2lvbiA9PT0gMCkge1xuICAgIHJldHVybiAwO1xuICB9XG5cbiAgbGV0IHF1ZXJ5VGltZXJWZXJzaW9uOiBudW1iZXI7XG4gIGNvbnN0IGdsID0gZ2V0V2ViR0xDb250ZXh0KHdlYkdMVmVyc2lvbik7XG5cbiAgaWYgKGhhc0V4dGVuc2lvbihnbCwgJ0VYVF9kaXNqb2ludF90aW1lcl9xdWVyeV93ZWJnbDInKSAmJlxuICAgICAgd2ViR0xWZXJzaW9uID09PSAyKSB7XG4gICAgcXVlcnlUaW1lclZlcnNpb24gPSAyO1xuICB9IGVsc2UgaWYgKGhhc0V4dGVuc2lvbihnbCwgJ0VYVF9kaXNqb2ludF90aW1lcl9xdWVyeScpKSB7XG4gICAgcXVlcnlUaW1lclZlcnNpb24gPSAxO1xuICB9IGVsc2Uge1xuICAgIHF1ZXJ5VGltZXJWZXJzaW9uID0gMDtcbiAgfVxuICByZXR1cm4gcXVlcnlUaW1lclZlcnNpb247XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBoYXNFeHRlbnNpb24oZ2w6IFdlYkdMUmVuZGVyaW5nQ29udGV4dCwgZXh0ZW5zaW9uTmFtZTogc3RyaW5nKSB7XG4gIGNvbnN0IGV4dCA9IGdsLmdldEV4dGVuc2lvbihleHRlbnNpb25OYW1lKTtcbiAgcmV0dXJuIGV4dCAhPSBudWxsO1xufVxuXG5leHBvcnQgZnVuY3Rpb24gaXNXZWJHTFZlcnNpb25FbmFibGVkKHdlYkdMVmVyc2lvbjogMXwyKSB7XG4gIHRyeSB7XG4gICAgY29uc3QgZ2wgPSBnZXRXZWJHTENvbnRleHQod2ViR0xWZXJzaW9uKTtcbiAgICBpZiAoZ2wgIT0gbnVsbCkge1xuICAgICAgcmV0dXJuIHRydWU7XG4gICAgfVxuICB9IGNhdGNoIChlKSB7XG4gICAgY29uc29sZS5sb2coJ0Vycm9yIHdoZW4gZ2V0dGluZyBXZWJHTCBjb250ZXh0OiAnLCBlKTtcbiAgICByZXR1cm4gZmFsc2U7XG4gIH1cbiAgcmV0dXJuIGZhbHNlO1xufVxuXG5leHBvcnQgZnVuY3Rpb24gaXNDYXBhYmxlT2ZSZW5kZXJpbmdUb0Zsb2F0VGV4dHVyZSh3ZWJHTFZlcnNpb246IG51bWJlcik6XG4gICAgYm9vbGVhbiB7XG4gIGlmICh3ZWJHTFZlcnNpb24gPT09IDApIHtcbiAgICByZXR1cm4gZmFsc2U7XG4gIH1cblxuICBjb25zdCBnbCA9IGdldFdlYkdMQ29udGV4dCh3ZWJHTFZlcnNpb24pO1xuXG4gIGlmICh3ZWJHTFZlcnNpb24gPT09IDEpIHtcbiAgICBpZiAoIWhhc0V4dGVuc2lvbihnbCwgJ09FU190ZXh0dXJlX2Zsb2F0JykpIHtcbiAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9XG4gIH0gZWxzZSB7XG4gICAgaWYgKCFoYXNFeHRlbnNpb24oZ2wsICdFWFRfY29sb3JfYnVmZmVyX2Zsb2F0JykpIHtcbiAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9XG4gIH1cblxuICBjb25zdCBpc0ZyYW1lQnVmZmVyQ29tcGxldGUgPSBjcmVhdGVGbG9hdFRleHR1cmVBbmRCaW5kVG9GcmFtZWJ1ZmZlcihnbCk7XG4gIHJldHVybiBpc0ZyYW1lQnVmZmVyQ29tcGxldGU7XG59XG5cbi8qKlxuICogQ2hlY2sgaWYgd2UgY2FuIGRvd25sb2FkIHZhbHVlcyBmcm9tIGEgZmxvYXQvaGFsZi1mbG9hdCB0ZXh0dXJlLlxuICpcbiAqIE5vdGUgdGhhdCBmb3IgcGVyZm9ybWFuY2UgcmVhc29ucyB3ZSB1c2UgYmluZGluZyBhIHRleHR1cmUgdG8gYSBmcmFtZWJ1ZmZlclxuICogYXMgYSBwcm94eSBmb3IgYWJpbGl0eSB0byBkb3dubG9hZCBmbG9hdCB2YWx1ZXMgbGF0ZXIgdXNpbmcgcmVhZFBpeGVscy4gVGhlXG4gKiB0ZXh0dXJlIHBhcmFtcyBvZiB0aGlzIHRleHR1cmUgd2lsbCBub3QgbWF0Y2ggdGhvc2UgaW4gcmVhZFBpeGVscyBleGFjdGx5XG4gKiBidXQgaWYgd2UgYXJlIHVuYWJsZSB0byBiaW5kIHNvbWUga2luZCBvZiBmbG9hdCB0ZXh0dXJlIHRvIHRoZSBmcmFtZUJ1ZmZlclxuICogdGhlbiB3ZSBkZWZpbml0ZWx5IHdpbGwgbm90IGJlIGFibGUgdG8gcmVhZCBmbG9hdCB2YWx1ZXMgZnJvbSBpdC5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGlzRG93bmxvYWRGbG9hdFRleHR1cmVFbmFibGVkKHdlYkdMVmVyc2lvbjogbnVtYmVyKTogYm9vbGVhbiB7XG4gIGlmICh3ZWJHTFZlcnNpb24gPT09IDApIHtcbiAgICByZXR1cm4gZmFsc2U7XG4gIH1cblxuICBjb25zdCBnbCA9IGdldFdlYkdMQ29udGV4dCh3ZWJHTFZlcnNpb24pO1xuXG4gIGlmICh3ZWJHTFZlcnNpb24gPT09IDEpIHtcbiAgICBpZiAoIWhhc0V4dGVuc2lvbihnbCwgJ09FU190ZXh0dXJlX2Zsb2F0JykpIHtcbiAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9XG4gICAgaWYgKCFoYXNFeHRlbnNpb24oZ2wsICdXRUJHTF9jb2xvcl9idWZmZXJfZmxvYXQnKSkge1xuICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH1cbiAgfSBlbHNlIHtcbiAgICBpZiAoaGFzRXh0ZW5zaW9uKGdsLCAnRVhUX2NvbG9yX2J1ZmZlcl9mbG9hdCcpKSB7XG4gICAgICByZXR1cm4gY3JlYXRlRmxvYXRUZXh0dXJlQW5kQmluZFRvRnJhbWVidWZmZXIoZ2wpO1xuICAgIH1cblxuICAgIGNvbnN0IENPTE9SX0JVRkZFUl9IQUxGX0ZMT0FUID0gJ0VYVF9jb2xvcl9idWZmZXJfaGFsZl9mbG9hdCc7XG4gICAgaWYgKGhhc0V4dGVuc2lvbihnbCwgQ09MT1JfQlVGRkVSX0hBTEZfRkxPQVQpKSB7XG4gICAgICBjb25zdCB0ZXh0dXJlSGFsZkZsb2F0RXh0ZW5zaW9uID1cbiAgICAgICAgICBnbC5nZXRFeHRlbnNpb24oQ09MT1JfQlVGRkVSX0hBTEZfRkxPQVQpO1xuICAgICAgcmV0dXJuIGNyZWF0ZUhhbGZGbG9hdFRleHR1cmVBbmRCaW5kVG9GcmFtZWJ1ZmZlcihcbiAgICAgICAgICBnbCwgdGV4dHVyZUhhbGZGbG9hdEV4dGVuc2lvbik7XG4gICAgfVxuXG4gICAgcmV0dXJuIGZhbHNlO1xuICB9XG5cbiAgY29uc3QgaXNGcmFtZUJ1ZmZlckNvbXBsZXRlID0gY3JlYXRlRmxvYXRUZXh0dXJlQW5kQmluZFRvRnJhbWVidWZmZXIoZ2wpO1xuICByZXR1cm4gaXNGcmFtZUJ1ZmZlckNvbXBsZXRlO1xufVxuXG5mdW5jdGlvbiBjcmVhdGVGbG9hdFRleHR1cmVBbmRCaW5kVG9GcmFtZWJ1ZmZlcihnbDogV2ViR0xSZW5kZXJpbmdDb250ZXh0KTpcbiAgICBib29sZWFuIHtcbiAgY29uc3QgdGV4Q29uZmlnID0gZ2V0VGV4dHVyZUNvbmZpZyhnbCk7XG5cbiAgY29uc3QgdGV4dHVyZSA9IGdsLmNyZWF0ZVRleHR1cmUoKTtcbiAgZ2wuYmluZFRleHR1cmUoZ2wuVEVYVFVSRV8yRCwgdGV4dHVyZSk7XG5cbiAgY29uc3Qgd2lkdGggPSAxO1xuICBjb25zdCBoZWlnaHQgPSAxO1xuICBnbC50ZXhJbWFnZTJEKFxuICAgICAgZ2wuVEVYVFVSRV8yRCwgMCwgdGV4Q29uZmlnLmludGVybmFsRm9ybWF0RmxvYXQsIHdpZHRoLCBoZWlnaHQsIDAsXG4gICAgICB0ZXhDb25maWcudGV4dHVyZUZvcm1hdEZsb2F0LCB0ZXhDb25maWcudGV4dHVyZVR5cGVGbG9hdCwgbnVsbCk7XG5cbiAgY29uc3QgZnJhbWVCdWZmZXIgPSBnbC5jcmVhdGVGcmFtZWJ1ZmZlcigpO1xuICBnbC5iaW5kRnJhbWVidWZmZXIoZ2wuRlJBTUVCVUZGRVIsIGZyYW1lQnVmZmVyKTtcbiAgZ2wuZnJhbWVidWZmZXJUZXh0dXJlMkQoXG4gICAgICBnbC5GUkFNRUJVRkZFUiwgZ2wuQ09MT1JfQVRUQUNITUVOVDAsIGdsLlRFWFRVUkVfMkQsIHRleHR1cmUsIDApO1xuXG4gIGNvbnN0IGlzRnJhbWVCdWZmZXJDb21wbGV0ZSA9XG4gICAgICBnbC5jaGVja0ZyYW1lYnVmZmVyU3RhdHVzKGdsLkZSQU1FQlVGRkVSKSA9PT0gZ2wuRlJBTUVCVUZGRVJfQ09NUExFVEU7XG5cbiAgZ2wuYmluZFRleHR1cmUoZ2wuVEVYVFVSRV8yRCwgbnVsbCk7XG4gIGdsLmJpbmRGcmFtZWJ1ZmZlcihnbC5GUkFNRUJVRkZFUiwgbnVsbCk7XG4gIGdsLmRlbGV0ZVRleHR1cmUodGV4dHVyZSk7XG4gIGdsLmRlbGV0ZUZyYW1lYnVmZmVyKGZyYW1lQnVmZmVyKTtcblxuICByZXR1cm4gaXNGcmFtZUJ1ZmZlckNvbXBsZXRlO1xufVxuXG5mdW5jdGlvbiBjcmVhdGVIYWxmRmxvYXRUZXh0dXJlQW5kQmluZFRvRnJhbWVidWZmZXIoXG4gICAgLy8gdHNsaW50OmRpc2FibGUtbmV4dC1saW5lOm5vLWFueVxuICAgIGdsOiBXZWJHTFJlbmRlcmluZ0NvbnRleHQsIHRleHR1cmVIYWxmRmxvYXRFeHRlbnNpb246IGFueSk6IGJvb2xlYW4ge1xuICBjb25zdCB0ZXhDb25maWcgPSBnZXRUZXh0dXJlQ29uZmlnKGdsLCB0ZXh0dXJlSGFsZkZsb2F0RXh0ZW5zaW9uKTtcbiAgY29uc3QgdGV4dHVyZSA9IGdsLmNyZWF0ZVRleHR1cmUoKTtcbiAgZ2wuYmluZFRleHR1cmUoZ2wuVEVYVFVSRV8yRCwgdGV4dHVyZSk7XG5cbiAgY29uc3Qgd2lkdGggPSAxO1xuICBjb25zdCBoZWlnaHQgPSAxO1xuICBnbC50ZXhJbWFnZTJEKFxuICAgICAgZ2wuVEVYVFVSRV8yRCwgMCwgdGV4Q29uZmlnLmludGVybmFsRm9ybWF0SGFsZkZsb2F0LCB3aWR0aCwgaGVpZ2h0LCAwLFxuICAgICAgdGV4Q29uZmlnLnRleHR1cmVGb3JtYXRGbG9hdCwgdGV4Q29uZmlnLnRleHR1cmVUeXBlSGFsZkZsb2F0LCBudWxsKTtcblxuICBjb25zdCBmcmFtZUJ1ZmZlciA9IGdsLmNyZWF0ZUZyYW1lYnVmZmVyKCk7XG4gIGdsLmJpbmRGcmFtZWJ1ZmZlcihnbC5GUkFNRUJVRkZFUiwgZnJhbWVCdWZmZXIpO1xuICBnbC5mcmFtZWJ1ZmZlclRleHR1cmUyRChcbiAgICAgIGdsLkZSQU1FQlVGRkVSLCBnbC5DT0xPUl9BVFRBQ0hNRU5UMCwgZ2wuVEVYVFVSRV8yRCwgdGV4dHVyZSwgMCk7XG5cbiAgY29uc3QgaXNGcmFtZUJ1ZmZlckNvbXBsZXRlID1cbiAgICAgIGdsLmNoZWNrRnJhbWVidWZmZXJTdGF0dXMoZ2wuRlJBTUVCVUZGRVIpID09PSBnbC5GUkFNRUJVRkZFUl9DT01QTEVURTtcblxuICBnbC5iaW5kVGV4dHVyZShnbC5URVhUVVJFXzJELCBudWxsKTtcbiAgZ2wuYmluZEZyYW1lYnVmZmVyKGdsLkZSQU1FQlVGRkVSLCBudWxsKTtcbiAgZ2wuZGVsZXRlVGV4dHVyZSh0ZXh0dXJlKTtcbiAgZ2wuZGVsZXRlRnJhbWVidWZmZXIoZnJhbWVCdWZmZXIpO1xuXG4gIHJldHVybiBpc0ZyYW1lQnVmZmVyQ29tcGxldGU7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBpc1dlYkdMRmVuY2VFbmFibGVkKHdlYkdMVmVyc2lvbjogbnVtYmVyKSB7XG4gIGlmICh3ZWJHTFZlcnNpb24gIT09IDIpIHtcbiAgICByZXR1cm4gZmFsc2U7XG4gIH1cbiAgY29uc3QgZ2wgPSBnZXRXZWJHTENvbnRleHQod2ViR0xWZXJzaW9uKTtcblxuICAvLyB0c2xpbnQ6ZGlzYWJsZS1uZXh0LWxpbmU6bm8tYW55XG4gIGNvbnN0IGlzRW5hYmxlZCA9IChnbCBhcyBhbnkpLmZlbmNlU3luYyAhPSBudWxsO1xuICByZXR1cm4gaXNFbmFibGVkO1xufVxuXG5leHBvcnQgZnVuY3Rpb24gYXNzZXJ0Tm90Q29tcGxleChcbiAgICB0ZW5zb3I6IFRlbnNvckluZm98VGVuc29ySW5mb1tdLCBvcE5hbWU6IHN0cmluZyk6IHZvaWQge1xuICBpZiAoIUFycmF5LmlzQXJyYXkodGVuc29yKSkge1xuICAgIHRlbnNvciA9IFt0ZW5zb3JdO1xuICB9XG4gIHRlbnNvci5mb3JFYWNoKHQgPT4ge1xuICAgIGlmICh0ICE9IG51bGwpIHtcbiAgICAgIHV0aWwuYXNzZXJ0KFxuICAgICAgICAgIHQuZHR5cGUgIT09ICdjb21wbGV4NjQnLFxuICAgICAgICAgICgpID0+IGAke29wTmFtZX0gZG9lcyBub3Qgc3VwcG9ydCBjb21wbGV4NjQgdGVuc29ycyBgICtcbiAgICAgICAgICAgICAgJ2luIHRoZSBXZWJHTCBiYWNrZW5kLicpO1xuICAgIH1cbiAgfSk7XG59XG4iXX0=","/**\n * @license\n * Copyright 2019 Google LLC. All Rights Reserved.\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n * =============================================================================\n */\nimport { device_util, env } from '@tensorflow/tfjs-core';\nimport { getMaxTexturesInShader, getWebGLDisjointQueryTimerVersion, getWebGLMaxTextureSize, isCapableOfRenderingToFloatTexture, isDownloadFloatTextureEnabled, isWebGLFenceEnabled, isWebGLVersionEnabled } from './webgl_util';\nconst ENV = env();\n/**\n * This file contains WebGL-specific flag registrations.\n */\n/**\n * True if WebGL is supported.\n */\nENV.registerFlag('HAS_WEBGL', () => ENV.getNumber('WEBGL_VERSION') > 0);\n/** 0: No WebGL, 1: WebGL 1.0, 2: WebGL 2.0. */\nENV.registerFlag('WEBGL_VERSION', () => {\n if (isWebGLVersionEnabled(2)) {\n return 2;\n }\n else if (isWebGLVersionEnabled(1)) {\n return 1;\n }\n return 0;\n});\n/** Whether to check for numerical representation problems. */\nENV.registerFlag('WEBGL_CHECK_NUMERICAL_PROBLEMS', () => false);\nENV.registerFlag('WEBGL_BUFFER_SUPPORTED', () => ENV.get('WEBGL_VERSION') === 2);\n/** Whether the WebGL backend will sometimes forward ops to the CPU. */\nENV.registerFlag('WEBGL_CPU_FORWARD', () => true);\n/** Whether the WebGL backend will always use f16 textures for rendering. */\nENV.registerFlag('WEBGL_FORCE_F16_TEXTURES', () => false);\n/** Whether to turn all packing related flags on. */\nENV.registerFlag('WEBGL_PACK', () => ENV.getBool('HAS_WEBGL'));\n/** Whether we will pack the batchnormalization op. */\nENV.registerFlag('WEBGL_PACK_NORMALIZATION', () => ENV.getBool('WEBGL_PACK'));\n/** Whether we will pack the clip op. */\nENV.registerFlag('WEBGL_PACK_CLIP', () => ENV.getBool('WEBGL_PACK'));\n/** Whether we will pack the depthwise conv op. */\nENV.registerFlag('WEBGL_PACK_DEPTHWISECONV', () => ENV.getBool('WEBGL_PACK'));\n/** Whether we will pack binary ops. */\nENV.registerFlag('WEBGL_PACK_BINARY_OPERATIONS', () => ENV.getBool('WEBGL_PACK'));\n/** Whether we will pack unary ops. */\nENV.registerFlag('WEBGL_PACK_UNARY_OPERATIONS', () => ENV.getBool('WEBGL_PACK'));\n/** Whether we will pack array ops. */\nENV.registerFlag('WEBGL_PACK_ARRAY_OPERATIONS', () => ENV.getBool('WEBGL_PACK'));\n/** Whether we will pack image ops. */\nENV.registerFlag('WEBGL_PACK_IMAGE_OPERATIONS', () => ENV.getBool('WEBGL_PACK'));\n/** Whether we will pack reduce ops. */\nENV.registerFlag('WEBGL_PACK_REDUCE', () => ENV.getBool('WEBGL_PACK'));\n/** Whether packed WebGL kernels lazily unpack their outputs. */\nENV.registerFlag('WEBGL_LAZILY_UNPACK', () => ENV.getBool('WEBGL_PACK'));\n/** Whether we will use the im2col algorithm to speed up convolutions. */\nENV.registerFlag('WEBGL_CONV_IM2COL', () => ENV.getBool('WEBGL_PACK'));\n/** The maximum texture dimension. */\nENV.registerFlag('WEBGL_MAX_TEXTURE_SIZE', () => getWebGLMaxTextureSize(ENV.getNumber('WEBGL_VERSION')));\n/** The maximum texture dimension. */\nENV.registerFlag('WEBGL_MAX_TEXTURES_IN_SHADER', () => getMaxTexturesInShader(ENV.getNumber('WEBGL_VERSION')));\n/**\n * The disjoint_query_timer extension version.\n * 0: disabled, 1: EXT_disjoint_timer_query, 2:\n * EXT_disjoint_timer_query_webgl2.\n * In Firefox with WebGL 2.0,\n * EXT_disjoint_timer_query_webgl2 is not available, so we must use the\n * WebGL 1.0 extension.\n */\nENV.registerFlag('WEBGL_DISJOINT_QUERY_TIMER_EXTENSION_VERSION', () => {\n const webGLVersion = ENV.getNumber('WEBGL_VERSION');\n if (webGLVersion === 0) {\n return 0;\n }\n return getWebGLDisjointQueryTimerVersion(webGLVersion);\n});\n/**\n * Whether the timer object from the disjoint_query_timer extension gives\n * timing information that is reliable.\n */\nENV.registerFlag('WEBGL_DISJOINT_QUERY_TIMER_EXTENSION_RELIABLE', () => ENV.getNumber('WEBGL_DISJOINT_QUERY_TIMER_EXTENSION_VERSION') > 0 &&\n !device_util.isMobile());\n/**\n * Whether the device is physically capable of rendering to float32 textures.\n */\nENV.registerFlag('WEBGL_RENDER_FLOAT32_CAPABLE', () => isCapableOfRenderingToFloatTexture(ENV.getNumber('WEBGL_VERSION')));\n/**\n * Whether rendering to float32 textures is enabled. If disabled, renders to\n * float16 textures.\n */\nENV.registerFlag('WEBGL_RENDER_FLOAT32_ENABLED', () => {\n return ENV.getBool('WEBGL_FORCE_F16_TEXTURES') ?\n false :\n ENV.getBool('WEBGL_RENDER_FLOAT32_CAPABLE');\n});\n/**\n * Whether downloading float textures is enabled (16 or 32 bit). If disabled,\n * uses IEEE 754 encoding of the float32 values to 4 uint8 when downloading.\n */\nENV.registerFlag('WEBGL_DOWNLOAD_FLOAT_ENABLED', () => isDownloadFloatTextureEnabled(ENV.getNumber('WEBGL_VERSION')));\n/** Whether the fence API is available. */\nENV.registerFlag('WEBGL_FENCE_API_ENABLED', () => isWebGLFenceEnabled(ENV.getNumber('WEBGL_VERSION')));\n/**\n * Tensors with size <= than this will be uploaded as uniforms, not textures.\n */\nENV.registerFlag('WEBGL_SIZE_UPLOAD_UNIFORM', () => {\n // Use uniform uploads only when 32bit floats are supported. In\n // 16bit\n // environments there are problems with comparing a 16bit texture value\n // with a 32bit uniform value.\n const useUniforms = ENV.getBool('WEBGL_RENDER_FLOAT32_ENABLED');\n return useUniforms ? 4 : 0;\n});\n/**\n * If the total number of bytes allocated on the GPU is greater than this\n * number, we will aggressively delete textures upon disposal with\n * gl.deleteMatrixTexture, rather than making them available for reuse.\n *\n * Default value -1 indicates that we will never aggressively delete textures.\n */\nENV.registerFlag('WEBGL_DELETE_TEXTURE_THRESHOLD', () => {\n return -1;\n}, threshold => {\n if (threshold < 0 && threshold !== -1) {\n throw new Error(`WEBGL_DELETE_TEXTURE_THRESHOLD must be -1 (indicating never ` +\n `delete) or at least 0, but got ${threshold}.`);\n }\n});\n/**\n * Trigger a manual GL command flush if the threshold of time has passed since\n * previous Kernel execution. This can be useful for Andorid device where GL\n * command flush are delayed un til the end of javascript task. This value is\n * measured in millisecond. Typically you want to set this value to close to 1.\n *\n * Default value 1 for mobile chrome, and -1 for rest cases. -1 indicates that\n * we will not enforce manual flush and depend on system default flush schedule.\n */\nENV.registerFlag('WEBGL_FLUSH_THRESHOLD', () => {\n return device_util.isMobile() ? 1 : -1;\n}, threshold => {\n if (threshold < 0 && threshold !== -1) {\n throw new Error(`WEBGL_FLUSH_THRESHOLD must be -1 (indicating never ` +\n `manual flush) or at least 0, but got ${threshold}.`);\n }\n});\n/**\n * Threshold for input tensor size that determines whether WebGL backend will\n * delegate computation to CPU.\n *\n * Default value is 128.\n */\nENV.registerFlag('CPU_HANDOFF_SIZE_THRESHOLD', () => 128);\n/** Whether we will use shapes uniforms. */\nENV.registerFlag('WEBGL_USE_SHAPES_UNIFORMS', () => false);\n/**\n * Threshold for last dimension of input tensor that determines whether\n * WebGL backend for the Top K op will delegate computation to CPU. If input\n * is smaller than threshold then CPU will be used\n *\n * Default value is 100000.\n */\nENV.registerFlag('TOPK_LAST_DIM_CPU_HANDOFF_SIZE_THRESHOLD', () => 100000);\n/**\n * Threshold for K that determines whether\n * WebGL backend for the Top K op will delegate computation to CPU. If k\n * is larger than threshold then CPU will be used\n *\n * Default value is 128.\n */\nENV.registerFlag('TOPK_K_CPU_HANDOFF_THRESHOLD', () => 128);\n/** Whether we will use the experimental conv op. */\nENV.registerFlag('WEBGL_EXP_CONV', () => false);\n/**\n * If the device performance is low or if no hardware GPU is available, whether\n * software WebGL will be used.\n */\nENV.registerFlag('SOFTWARE_WEBGL_ENABLED', () => ENV.getBool('IS_TEST'));\n/**\n * For narrow texture (physical height or physical width is 1), if the length of\n * any texture edges exceed the threshold, the texture will be reshaped to be\n * more squarish.\n *\n * This flag is used to help some GPUs that could not provide correct\n * interpolations for long skinny triangles. We found Mali GPU probably has this\n * problem: https://github.com/tensorflow/tfjs/issues/6775.\n */\nENV.registerFlag('WEBGL_MAX_SIZE_FOR_NARROW_TEXTURE', () => Infinity);\n/**\n * If the flag is set to true, the max size of the narrow texture will be auto\n * computed and it will be considerred as a threshold to reshape the narrow\n * texture to be more squarish.\n *\n * This flag is used to help some GPUs that could not provide correct\n * interpolations for long skinny triangles. We found Mali GPU probably has this\n * problem: https://github.com/tensorflow/tfjs/issues/6775.\n */\nENV.registerFlag('WEBGL_AUTO_SQUARIFY_NARROW_TEXTURE_SHAPE', () => false);\n/**\n * Whether to use the customized isnan. It's only useful for webgl2 since webgl1\n * doesn't have the builtin isnan.\n */\nENV.registerFlag('WEBGL2_ISNAN_CUSTOM', () => false);\n//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZmxhZ3Nfd2ViZ2wuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi90ZmpzLWJhY2tlbmQtd2ViZ2wvc3JjL2ZsYWdzX3dlYmdsLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBOzs7Ozs7Ozs7Ozs7Ozs7R0FlRztBQUVILE9BQU8sRUFBQyxXQUFXLEVBQUUsR0FBRyxFQUFDLE1BQU0sdUJBQXVCLENBQUM7QUFFdkQsT0FBTyxFQUFDLHNCQUFzQixFQUFFLGlDQUFpQyxFQUFFLHNCQUFzQixFQUFFLGtDQUFrQyxFQUFFLDZCQUE2QixFQUFFLG1CQUFtQixFQUFFLHFCQUFxQixFQUFDLE1BQU0sY0FBYyxDQUFDO0FBRTlOLE1BQU0sR0FBRyxHQUFHLEdBQUcsRUFBRSxDQUFDO0FBRWxCOztHQUVHO0FBRUg7O0dBRUc7QUFDSCxHQUFHLENBQUMsWUFBWSxDQUFDLFdBQVcsRUFBRSxHQUFHLEVBQUUsQ0FBQyxHQUFHLENBQUMsU0FBUyxDQUFDLGVBQWUsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDO0FBRXhFLCtDQUErQztBQUMvQyxHQUFHLENBQUMsWUFBWSxDQUFDLGVBQWUsRUFBRSxHQUFHLEVBQUU7SUFDckMsSUFBSSxxQkFBcUIsQ0FBQyxDQUFDLENBQUMsRUFBRTtRQUM1QixPQUFPLENBQUMsQ0FBQztLQUNWO1NBQU0sSUFBSSxxQkFBcUIsQ0FBQyxDQUFDLENBQUMsRUFBRTtRQUNuQyxPQUFPLENBQUMsQ0FBQztLQUNWO0lBQ0QsT0FBTyxDQUFDLENBQUM7QUFDWCxDQUFDLENBQUMsQ0FBQztBQUVILDhEQUE4RDtBQUM5RCxHQUFHLENBQUMsWUFBWSxDQUFDLGdDQUFnQyxFQUFFLEdBQUcsRUFBRSxDQUFDLEtBQUssQ0FBQyxDQUFDO0FBRWhFLEdBQUcsQ0FBQyxZQUFZLENBQ1osd0JBQXdCLEVBQUUsR0FBRyxFQUFFLENBQUMsR0FBRyxDQUFDLEdBQUcsQ0FBQyxlQUFlLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQztBQUVwRSx1RUFBdUU7QUFDdkUsR0FBRyxDQUFDLFlBQVksQ0FBQyxtQkFBbUIsRUFBRSxHQUFHLEVBQUUsQ0FBQyxJQUFJLENBQUMsQ0FBQztBQUVsRCw0RUFBNEU7QUFDNUUsR0FBRyxDQUFDLFlBQVksQ0FBQywwQkFBMEIsRUFBRSxHQUFHLEVBQUUsQ0FBQyxLQUFLLENBQUMsQ0FBQztBQUUxRCxvREFBb0Q7QUFDcEQsR0FBRyxDQUFDLFlBQVksQ0FBQyxZQUFZLEVBQUUsR0FBRyxFQUFFLENBQUMsR0FBRyxDQUFDLE9BQU8sQ0FBQyxXQUFXLENBQUMsQ0FBQyxDQUFDO0FBRS9ELHNEQUFzRDtBQUN0RCxHQUFHLENBQUMsWUFBWSxDQUFDLDBCQUEwQixFQUFFLEdBQUcsRUFBRSxDQUFDLEdBQUcsQ0FBQyxPQUFPLENBQUMsWUFBWSxDQUFDLENBQUMsQ0FBQztBQUU5RSx3Q0FBd0M7QUFDeEMsR0FBRyxDQUFDLFlBQVksQ0FBQyxpQkFBaUIsRUFBRSxHQUFHLEVBQUUsQ0FBQyxHQUFHLENBQUMsT0FBTyxDQUFDLFlBQVksQ0FBQyxDQUFDLENBQUM7QUFFckUsa0RBQWtEO0FBQ2xELEdBQUcsQ0FBQyxZQUFZLENBQUMsMEJBQTBCLEVBQUUsR0FBRyxFQUFFLENBQUMsR0FBRyxDQUFDLE9BQU8sQ0FBQyxZQUFZLENBQUMsQ0FBQyxDQUFDO0FBRTlFLHVDQUF1QztBQUN2QyxHQUFHLENBQUMsWUFBWSxDQUNaLDhCQUE4QixFQUFFLEdBQUcsRUFBRSxDQUFDLEdBQUcsQ0FBQyxPQUFPLENBQUMsWUFBWSxDQUFDLENBQUMsQ0FBQztBQUVyRSxzQ0FBc0M7QUFDdEMsR0FBRyxDQUFDLFlBQVksQ0FDWiw2QkFBNkIsRUFBRSxHQUFHLEVBQUUsQ0FBQyxHQUFHLENBQUMsT0FBTyxDQUFDLFlBQVksQ0FBQyxDQUFDLENBQUM7QUFFcEUsc0NBQXNDO0FBQ3RDLEdBQUcsQ0FBQyxZQUFZLENBQ1osNkJBQTZCLEVBQUUsR0FBRyxFQUFFLENBQUMsR0FBRyxDQUFDLE9BQU8sQ0FBQyxZQUFZLENBQUMsQ0FBQyxDQUFDO0FBRXBFLHNDQUFzQztBQUN0QyxHQUFHLENBQUMsWUFBWSxDQUNaLDZCQUE2QixFQUFFLEdBQUcsRUFBRSxDQUFDLEdBQUcsQ0FBQyxPQUFPLENBQUMsWUFBWSxDQUFDLENBQUMsQ0FBQztBQUVwRSx1Q0FBdUM7QUFDdkMsR0FBRyxDQUFDLFlBQVksQ0FBQyxtQkFBbUIsRUFBRSxHQUFHLEVBQUUsQ0FBQyxHQUFHLENBQUMsT0FBTyxDQUFDLFlBQVksQ0FBQyxDQUFDLENBQUM7QUFFdkUsZ0VBQWdFO0FBQ2hFLEdBQUcsQ0FBQyxZQUFZLENBQUMscUJBQXFCLEVBQUUsR0FBRyxFQUFFLENBQUMsR0FBRyxDQUFDLE9BQU8sQ0FBQyxZQUFZLENBQUMsQ0FBQyxDQUFDO0FBRXpFLHlFQUF5RTtBQUN6RSxHQUFHLENBQUMsWUFBWSxDQUFDLG1CQUFtQixFQUFFLEdBQUcsRUFBRSxDQUFDLEdBQUcsQ0FBQyxPQUFPLENBQUMsWUFBWSxDQUFDLENBQUMsQ0FBQztBQUV2RSxxQ0FBcUM7QUFDckMsR0FBRyxDQUFDLFlBQVksQ0FDWix3QkFBd0IsRUFDeEIsR0FBRyxFQUFFLENBQUMsc0JBQXNCLENBQUMsR0FBRyxDQUFDLFNBQVMsQ0FBQyxlQUFlLENBQUMsQ0FBQyxDQUFDLENBQUM7QUFFbEUscUNBQXFDO0FBQ3JDLEdBQUcsQ0FBQyxZQUFZLENBQ1osOEJBQThCLEVBQzlCLEdBQUcsRUFBRSxDQUFDLHNCQUFzQixDQUFDLEdBQUcsQ0FBQyxTQUFTLENBQUMsZUFBZSxDQUFDLENBQUMsQ0FBQyxDQUFDO0FBRWxFOzs7Ozs7O0dBT0c7QUFDSCxHQUFHLENBQUMsWUFBWSxDQUFDLDhDQUE4QyxFQUFFLEdBQUcsRUFBRTtJQUNwRSxNQUFNLFlBQVksR0FBRyxHQUFHLENBQUMsU0FBUyxDQUFDLGVBQWUsQ0FBQyxDQUFDO0lBRXBELElBQUksWUFBWSxLQUFLLENBQUMsRUFBRTtRQUN0QixPQUFPLENBQUMsQ0FBQztLQUNWO0lBQ0QsT0FBTyxpQ0FBaUMsQ0FBQyxZQUFZLENBQUMsQ0FBQztBQUN6RCxDQUFDLENBQUMsQ0FBQztBQUVIOzs7R0FHRztBQUNILEdBQUcsQ0FBQyxZQUFZLENBQ1osK0NBQStDLEVBQy9DLEdBQUcsRUFBRSxDQUFDLEdBQUcsQ0FBQyxTQUFTLENBQUMsOENBQThDLENBQUMsR0FBRyxDQUFDO0lBQ25FLENBQUMsV0FBVyxDQUFDLFFBQVEsRUFBRSxDQUFDLENBQUM7QUFFakM7O0dBRUc7QUFDSCxHQUFHLENBQUMsWUFBWSxDQUNaLDhCQUE4QixFQUM5QixHQUFHLEVBQUUsQ0FBQyxrQ0FBa0MsQ0FBQyxHQUFHLENBQUMsU0FBUyxDQUFDLGVBQWUsQ0FBQyxDQUFDLENBQUMsQ0FBQztBQUU5RTs7O0dBR0c7QUFDSCxHQUFHLENBQUMsWUFBWSxDQUFDLDhCQUE4QixFQUFFLEdBQUcsRUFBRTtJQUNwRCxPQUFPLEdBQUcsQ0FBQyxPQUFPLENBQUMsMEJBQTBCLENBQUMsQ0FBQyxDQUFDO1FBQzVDLEtBQUssQ0FBQyxDQUFDO1FBQ1AsR0FBRyxDQUFDLE9BQU8sQ0FBQyw4QkFBOEIsQ0FBQyxDQUFDO0FBQ2xELENBQUMsQ0FBQyxDQUFDO0FBRUg7OztHQUdHO0FBQ0gsR0FBRyxDQUFDLFlBQVksQ0FDWiw4QkFBOEIsRUFDOUIsR0FBRyxFQUFFLENBQUMsNkJBQTZCLENBQUMsR0FBRyxDQUFDLFNBQVMsQ0FBQyxlQUFlLENBQUMsQ0FBQyxDQUFDLENBQUM7QUFFekUsMENBQTBDO0FBQzFDLEdBQUcsQ0FBQyxZQUFZLENBQ1oseUJBQXlCLEVBQ3pCLEdBQUcsRUFBRSxDQUFDLG1CQUFtQixDQUFDLEdBQUcsQ0FBQyxTQUFTLENBQUMsZUFBZSxDQUFDLENBQUMsQ0FBQyxDQUFDO0FBRS9EOztHQUVHO0FBQ0gsR0FBRyxDQUFDLFlBQVksQ0FBQywyQkFBMkIsRUFBRSxHQUFHLEVBQUU7SUFDakQsK0RBQStEO0lBQy9ELFFBQVE7SUFDUix1RUFBdUU7SUFDdkUsOEJBQThCO0lBQzlCLE1BQU0sV0FBVyxHQUFHLEdBQUcsQ0FBQyxPQUFPLENBQUMsOEJBQThCLENBQUMsQ0FBQztJQUNoRSxPQUFPLFdBQVcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUM7QUFDN0IsQ0FBQyxDQUFDLENBQUM7QUFFSDs7Ozs7O0dBTUc7QUFDSCxHQUFHLENBQUMsWUFBWSxDQUNaLGdDQUFnQyxFQUNoQyxHQUFHLEVBQUU7SUFDSCxPQUFPLENBQUMsQ0FBQyxDQUFDO0FBQ1osQ0FBQyxFQUNELFNBQVMsQ0FBQyxFQUFFO0lBQ1YsSUFBSSxTQUFTLEdBQUcsQ0FBQyxJQUFJLFNBQVMsS0FBSyxDQUFDLENBQUMsRUFBRTtRQUNyQyxNQUFNLElBQUksS0FBSyxDQUNYLDhEQUE4RDtZQUM5RCxrQ0FBa0MsU0FBUyxHQUFHLENBQUMsQ0FBQztLQUNyRDtBQUNILENBQUMsQ0FBQyxDQUFDO0FBRVA7Ozs7Ozs7O0dBUUc7QUFDSCxHQUFHLENBQUMsWUFBWSxDQUNaLHVCQUF1QixFQUN2QixHQUFHLEVBQUU7SUFDSCxPQUFPLFdBQVcsQ0FBQyxRQUFRLEVBQUUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQztBQUN6QyxDQUFDLEVBQ0QsU0FBUyxDQUFDLEVBQUU7SUFDVixJQUFJLFNBQVMsR0FBRyxDQUFDLElBQUksU0FBUyxLQUFLLENBQUMsQ0FBQyxFQUFFO1FBQ3JDLE1BQU0sSUFBSSxLQUFLLENBQ1gscURBQXFEO1lBQ3JELHdDQUF3QyxTQUFTLEdBQUcsQ0FBQyxDQUFDO0tBQzNEO0FBQ0gsQ0FBQyxDQUFDLENBQUM7QUFFUDs7Ozs7R0FLRztBQUNILEdBQUcsQ0FBQyxZQUFZLENBQUMsNEJBQTRCLEVBQUUsR0FBRyxFQUFFLENBQUMsR0FBRyxDQUFDLENBQUM7QUFFMUQsMkNBQTJDO0FBQzNDLEdBQUcsQ0FBQyxZQUFZLENBQUMsMkJBQTJCLEVBQUUsR0FBRyxFQUFFLENBQUMsS0FBSyxDQUFDLENBQUM7QUFFM0Q7Ozs7OztHQU1HO0FBQ0gsR0FBRyxDQUFDLFlBQVksQ0FBQywwQ0FBMEMsRUFBRSxHQUFHLEVBQUUsQ0FBQyxNQUFNLENBQUMsQ0FBQztBQUUzRTs7Ozs7O0dBTUc7QUFDSCxHQUFHLENBQUMsWUFBWSxDQUFDLDhCQUE4QixFQUFFLEdBQUcsRUFBRSxDQUFDLEdBQUcsQ0FBQyxDQUFDO0FBRTVELG9EQUFvRDtBQUNwRCxHQUFHLENBQUMsWUFBWSxDQUFDLGdCQUFnQixFQUFFLEdBQUcsRUFBRSxDQUFDLEtBQUssQ0FBQyxDQUFDO0FBRWhEOzs7R0FHRztBQUNILEdBQUcsQ0FBQyxZQUFZLENBQUMsd0JBQXdCLEVBQUUsR0FBRyxFQUFFLENBQUMsR0FBRyxDQUFDLE9BQU8sQ0FBQyxTQUFTLENBQUMsQ0FBQyxDQUFDO0FBRXpFOzs7Ozs7OztHQVFHO0FBQ0gsR0FBRyxDQUFDLFlBQVksQ0FBQyxtQ0FBbUMsRUFBRSxHQUFHLEVBQUUsQ0FBQyxRQUFRLENBQUMsQ0FBQztBQUV0RTs7Ozs7Ozs7R0FRRztBQUNILEdBQUcsQ0FBQyxZQUFZLENBQUMsMENBQTBDLEVBQUUsR0FBRyxFQUFFLENBQUMsS0FBSyxDQUFDLENBQUM7QUFFMUU7OztHQUdHO0FBQ0gsR0FBRyxDQUFDLFlBQVksQ0FBQyxxQkFBcUIsRUFBRSxHQUFHLEVBQUUsQ0FBQyxLQUFLLENBQUMsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbIi8qKlxuICogQGxpY2Vuc2VcbiAqIENvcHlyaWdodCAyMDE5IEdvb2dsZSBMTEMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuXG4gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgXCJMaWNlbnNlXCIpO1xuICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLlxuICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0XG4gKlxuICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wXG4gKlxuICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZVxuICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gXCJBUyBJU1wiIEJBU0lTLFxuICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuXG4gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kXG4gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS5cbiAqID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4gKi9cblxuaW1wb3J0IHtkZXZpY2VfdXRpbCwgZW52fSBmcm9tICdAdGVuc29yZmxvdy90ZmpzLWNvcmUnO1xuXG5pbXBvcnQge2dldE1heFRleHR1cmVzSW5TaGFkZXIsIGdldFdlYkdMRGlzam9pbnRRdWVyeVRpbWVyVmVyc2lvbiwgZ2V0V2ViR0xNYXhUZXh0dXJlU2l6ZSwgaXNDYXBhYmxlT2ZSZW5kZXJpbmdUb0Zsb2F0VGV4dHVyZSwgaXNEb3dubG9hZEZsb2F0VGV4dHVyZUVuYWJsZWQsIGlzV2ViR0xGZW5jZUVuYWJsZWQsIGlzV2ViR0xWZXJzaW9uRW5hYmxlZH0gZnJvbSAnLi93ZWJnbF91dGlsJztcblxuY29uc3QgRU5WID0gZW52KCk7XG5cbi8qKlxuICogVGhpcyBmaWxlIGNvbnRhaW5zIFdlYkdMLXNwZWNpZmljIGZsYWcgcmVnaXN0cmF0aW9ucy5cbiAqL1xuXG4vKipcbiAqIFRydWUgaWYgV2ViR0wgaXMgc3VwcG9ydGVkLlxuICovXG5FTlYucmVnaXN0ZXJGbGFnKCdIQVNfV0VCR0wnLCAoKSA9PiBFTlYuZ2V0TnVtYmVyKCdXRUJHTF9WRVJTSU9OJykgPiAwKTtcblxuLyoqIDA6IE5vIFdlYkdMLCAxOiBXZWJHTCAxLjAsIDI6IFdlYkdMIDIuMC4gKi9cbkVOVi5yZWdpc3RlckZsYWcoJ1dFQkdMX1ZFUlNJT04nLCAoKSA9PiB7XG4gIGlmIChpc1dlYkdMVmVyc2lvbkVuYWJsZWQoMikpIHtcbiAgICByZXR1cm4gMjtcbiAgfSBlbHNlIGlmIChpc1dlYkdMVmVyc2lvbkVuYWJsZWQoMSkpIHtcbiAgICByZXR1cm4gMTtcbiAgfVxuICByZXR1cm4gMDtcbn0pO1xuXG4vKiogV2hldGhlciB0byBjaGVjayBmb3IgbnVtZXJpY2FsIHJlcHJlc2VudGF0aW9uIHByb2JsZW1zLiAqL1xuRU5WLnJlZ2lzdGVyRmxhZygnV0VCR0xfQ0hFQ0tfTlVNRVJJQ0FMX1BST0JMRU1TJywgKCkgPT4gZmFsc2UpO1xuXG5FTlYucmVnaXN0ZXJGbGFnKFxuICAgICdXRUJHTF9CVUZGRVJfU1VQUE9SVEVEJywgKCkgPT4gRU5WLmdldCgnV0VCR0xfVkVSU0lPTicpID09PSAyKTtcblxuLyoqIFdoZXRoZXIgdGhlIFdlYkdMIGJhY2tlbmQgd2lsbCBzb21ldGltZXMgZm9yd2FyZCBvcHMgdG8gdGhlIENQVS4gKi9cbkVOVi5yZWdpc3RlckZsYWcoJ1dFQkdMX0NQVV9GT1JXQVJEJywgKCkgPT4gdHJ1ZSk7XG5cbi8qKiBXaGV0aGVyIHRoZSBXZWJHTCBiYWNrZW5kIHdpbGwgYWx3YXlzIHVzZSBmMTYgdGV4dHVyZXMgZm9yIHJlbmRlcmluZy4gKi9cbkVOVi5yZWdpc3RlckZsYWcoJ1dFQkdMX0ZPUkNFX0YxNl9URVhUVVJFUycsICgpID0+IGZhbHNlKTtcblxuLyoqIFdoZXRoZXIgdG8gdHVybiBhbGwgcGFja2luZyByZWxhdGVkIGZsYWdzIG9uLiAqL1xuRU5WLnJlZ2lzdGVyRmxhZygnV0VCR0xfUEFDSycsICgpID0+IEVOVi5nZXRCb29sKCdIQVNfV0VCR0wnKSk7XG5cbi8qKiBXaGV0aGVyIHdlIHdpbGwgcGFjayB0aGUgYmF0Y2hub3JtYWxpemF0aW9uIG9wLiAqL1xuRU5WLnJlZ2lzdGVyRmxhZygnV0VCR0xfUEFDS19OT1JNQUxJWkFUSU9OJywgKCkgPT4gRU5WLmdldEJvb2woJ1dFQkdMX1BBQ0snKSk7XG5cbi8qKiBXaGV0aGVyIHdlIHdpbGwgcGFjayB0aGUgY2xpcCBvcC4gKi9cbkVOVi5yZWdpc3RlckZsYWcoJ1dFQkdMX1BBQ0tfQ0xJUCcsICgpID0+IEVOVi5nZXRCb29sKCdXRUJHTF9QQUNLJykpO1xuXG4vKiogV2hldGhlciB3ZSB3aWxsIHBhY2sgdGhlIGRlcHRod2lzZSBjb252IG9wLiAqL1xuRU5WLnJlZ2lzdGVyRmxhZygnV0VCR0xfUEFDS19ERVBUSFdJU0VDT05WJywgKCkgPT4gRU5WLmdldEJvb2woJ1dFQkdMX1BBQ0snKSk7XG5cbi8qKiBXaGV0aGVyIHdlIHdpbGwgcGFjayBiaW5hcnkgb3BzLiAqL1xuRU5WLnJlZ2lzdGVyRmxhZyhcbiAgICAnV0VCR0xfUEFDS19CSU5BUllfT1BFUkFUSU9OUycsICgpID0+IEVOVi5nZXRCb29sKCdXRUJHTF9QQUNLJykpO1xuXG4vKiogV2hldGhlciB3ZSB3aWxsIHBhY2sgdW5hcnkgb3BzLiAqL1xuRU5WLnJlZ2lzdGVyRmxhZyhcbiAgICAnV0VCR0xfUEFDS19VTkFSWV9PUEVSQVRJT05TJywgKCkgPT4gRU5WLmdldEJvb2woJ1dFQkdMX1BBQ0snKSk7XG5cbi8qKiBXaGV0aGVyIHdlIHdpbGwgcGFjayBhcnJheSBvcHMuICovXG5FTlYucmVnaXN0ZXJGbGFnKFxuICAgICdXRUJHTF9QQUNLX0FSUkFZX09QRVJBVElPTlMnLCAoKSA9PiBFTlYuZ2V0Qm9vbCgnV0VCR0xfUEFDSycpKTtcblxuLyoqIFdoZXRoZXIgd2Ugd2lsbCBwYWNrIGltYWdlIG9wcy4gKi9cbkVOVi5yZWdpc3RlckZsYWcoXG4gICAgJ1dFQkdMX1BBQ0tfSU1BR0VfT1BFUkFUSU9OUycsICgpID0+IEVOVi5nZXRCb29sKCdXRUJHTF9QQUNLJykpO1xuXG4vKiogV2hldGhlciB3ZSB3aWxsIHBhY2sgcmVkdWNlIG9wcy4gKi9cbkVOVi5yZWdpc3RlckZsYWcoJ1dFQkdMX1BBQ0tfUkVEVUNFJywgKCkgPT4gRU5WLmdldEJvb2woJ1dFQkdMX1BBQ0snKSk7XG5cbi8qKiBXaGV0aGVyIHBhY2tlZCBXZWJHTCBrZXJuZWxzIGxhemlseSB1bnBhY2sgdGhlaXIgb3V0cHV0cy4gKi9cbkVOVi5yZWdpc3RlckZsYWcoJ1dFQkdMX0xBWklMWV9VTlBBQ0snLCAoKSA9PiBFTlYuZ2V0Qm9vbCgnV0VCR0xfUEFDSycpKTtcblxuLyoqIFdoZXRoZXIgd2Ugd2lsbCB1c2UgdGhlIGltMmNvbCBhbGdvcml0aG0gdG8gc3BlZWQgdXAgY29udm9sdXRpb25zLiAqL1xuRU5WLnJlZ2lzdGVyRmxhZygnV0VCR0xfQ09OVl9JTTJDT0wnLCAoKSA9PiBFTlYuZ2V0Qm9vbCgnV0VCR0xfUEFDSycpKTtcblxuLyoqIFRoZSBtYXhpbXVtIHRleHR1cmUgZGltZW5zaW9uLiAqL1xuRU5WLnJlZ2lzdGVyRmxhZyhcbiAgICAnV0VCR0xfTUFYX1RFWFRVUkVfU0laRScsXG4gICAgKCkgPT4gZ2V0V2ViR0xNYXhUZXh0dXJlU2l6ZShFTlYuZ2V0TnVtYmVyKCdXRUJHTF9WRVJTSU9OJykpKTtcblxuLyoqIFRoZSBtYXhpbXVtIHRleHR1cmUgZGltZW5zaW9uLiAqL1xuRU5WLnJlZ2lzdGVyRmxhZyhcbiAgICAnV0VCR0xfTUFYX1RFWFRVUkVTX0lOX1NIQURFUicsXG4gICAgKCkgPT4gZ2V0TWF4VGV4dHVyZXNJblNoYWRlcihFTlYuZ2V0TnVtYmVyKCdXRUJHTF9WRVJTSU9OJykpKTtcblxuLyoqXG4gKiBUaGUgZGlzam9pbnRfcXVlcnlfdGltZXIgZXh0ZW5zaW9uIHZlcnNpb24uXG4gKiAwOiBkaXNhYmxlZCwgMTogRVhUX2Rpc2pvaW50X3RpbWVyX3F1ZXJ5LCAyOlxuICogRVhUX2Rpc2pvaW50X3RpbWVyX3F1ZXJ5X3dlYmdsMi5cbiAqIEluIEZpcmVmb3ggd2l0aCBXZWJHTCAyLjAsXG4gKiBFWFRfZGlzam9pbnRfdGltZXJfcXVlcnlfd2ViZ2wyIGlzIG5vdCBhdmFpbGFibGUsIHNvIHdlIG11c3QgdXNlIHRoZVxuICogV2ViR0wgMS4wIGV4dGVuc2lvbi5cbiAqL1xuRU5WLnJlZ2lzdGVyRmxhZygnV0VCR0xfRElTSk9JTlRfUVVFUllfVElNRVJfRVhURU5TSU9OX1ZFUlNJT04nLCAoKSA9PiB7XG4gIGNvbnN0IHdlYkdMVmVyc2lvbiA9IEVOVi5nZXROdW1iZXIoJ1dFQkdMX1ZFUlNJT04nKTtcblxuICBpZiAod2ViR0xWZXJzaW9uID09PSAwKSB7XG4gICAgcmV0dXJuIDA7XG4gIH1cbiAgcmV0dXJuIGdldFdlYkdMRGlzam9pbnRRdWVyeVRpbWVyVmVyc2lvbih3ZWJHTFZlcnNpb24pO1xufSk7XG5cbi8qKlxuICogV2hldGhlciB0aGUgdGltZXIgb2JqZWN0IGZyb20gdGhlIGRpc2pvaW50X3F1ZXJ5X3RpbWVyIGV4dGVuc2lvbiBnaXZlc1xuICogdGltaW5nIGluZm9ybWF0aW9uIHRoYXQgaXMgcmVsaWFibGUuXG4gKi9cbkVOVi5yZWdpc3RlckZsYWcoXG4gICAgJ1dFQkdMX0RJU0pPSU5UX1FVRVJZX1RJTUVSX0VYVEVOU0lPTl9SRUxJQUJMRScsXG4gICAgKCkgPT4gRU5WLmdldE51bWJlcignV0VCR0xfRElTSk9JTlRfUVVFUllfVElNRVJfRVhURU5TSU9OX1ZFUlNJT04nKSA+IDAgJiZcbiAgICAgICAgIWRldmljZV91dGlsLmlzTW9iaWxlKCkpO1xuXG4vKipcbiAqIFdoZXRoZXIgdGhlIGRldmljZSBpcyBwaHlzaWNhbGx5IGNhcGFibGUgb2YgcmVuZGVyaW5nIHRvIGZsb2F0MzIgdGV4dHVyZXMuXG4gKi9cbkVOVi5yZWdpc3RlckZsYWcoXG4gICAgJ1dFQkdMX1JFTkRFUl9GTE9BVDMyX0NBUEFCTEUnLFxuICAgICgpID0+IGlzQ2FwYWJsZU9mUmVuZGVyaW5nVG9GbG9hdFRleHR1cmUoRU5WLmdldE51bWJlcignV0VCR0xfVkVSU0lPTicpKSk7XG5cbi8qKlxuICogV2hldGhlciByZW5kZXJpbmcgdG8gZmxvYXQzMiB0ZXh0dXJlcyBpcyBlbmFibGVkLiBJZiBkaXNhYmxlZCwgcmVuZGVycyB0b1xuICogZmxvYXQxNiB0ZXh0dXJlcy5cbiAqL1xuRU5WLnJlZ2lzdGVyRmxhZygnV0VCR0xfUkVOREVSX0ZMT0FUMzJfRU5BQkxFRCcsICgpID0+IHtcbiAgcmV0dXJuIEVOVi5nZXRCb29sKCdXRUJHTF9GT1JDRV9GMTZfVEVYVFVSRVMnKSA/XG4gICAgICBmYWxzZSA6XG4gICAgICBFTlYuZ2V0Qm9vbCgnV0VCR0xfUkVOREVSX0ZMT0FUMzJfQ0FQQUJMRScpO1xufSk7XG5cbi8qKlxuICogV2hldGhlciBkb3dubG9hZGluZyBmbG9hdCB0ZXh0dXJlcyBpcyBlbmFibGVkICgxNiBvciAzMiBiaXQpLiBJZiBkaXNhYmxlZCxcbiAqIHVzZXMgSUVFRSA3NTQgZW5jb2Rpbmcgb2YgdGhlIGZsb2F0MzIgdmFsdWVzIHRvIDQgdWludDggd2hlbiBkb3dubG9hZGluZy5cbiAqL1xuRU5WLnJlZ2lzdGVyRmxhZyhcbiAgICAnV0VCR0xfRE9XTkxPQURfRkxPQVRfRU5BQkxFRCcsXG4gICAgKCkgPT4gaXNEb3dubG9hZEZsb2F0VGV4dHVyZUVuYWJsZWQoRU5WLmdldE51bWJlcignV0VCR0xfVkVSU0lPTicpKSk7XG5cbi8qKiBXaGV0aGVyIHRoZSBmZW5jZSBBUEkgaXMgYXZhaWxhYmxlLiAqL1xuRU5WLnJlZ2lzdGVyRmxhZyhcbiAgICAnV0VCR0xfRkVOQ0VfQVBJX0VOQUJMRUQnLFxuICAgICgpID0+IGlzV2ViR0xGZW5jZUVuYWJsZWQoRU5WLmdldE51bWJlcignV0VCR0xfVkVSU0lPTicpKSk7XG5cbi8qKlxuICogVGVuc29ycyB3aXRoIHNpemUgPD0gdGhhbiB0aGlzIHdpbGwgYmUgdXBsb2FkZWQgYXMgdW5pZm9ybXMsIG5vdCB0ZXh0dXJlcy5cbiAqL1xuRU5WLnJlZ2lzdGVyRmxhZygnV0VCR0xfU0laRV9VUExPQURfVU5JRk9STScsICgpID0+IHtcbiAgLy8gVXNlIHVuaWZvcm0gdXBsb2FkcyBvbmx5IHdoZW4gMzJiaXQgZmxvYXRzIGFyZSBzdXBwb3J0ZWQuIEluXG4gIC8vIDE2Yml0XG4gIC8vIGVudmlyb25tZW50cyB0aGVyZSBhcmUgcHJvYmxlbXMgd2l0aCBjb21wYXJpbmcgYSAxNmJpdCB0ZXh0dXJlIHZhbHVlXG4gIC8vIHdpdGggYSAzMmJpdCB1bmlmb3JtIHZhbHVlLlxuICBjb25zdCB1c2VVbmlmb3JtcyA9IEVOVi5nZXRCb29sKCdXRUJHTF9SRU5ERVJfRkxPQVQzMl9FTkFCTEVEJyk7XG4gIHJldHVybiB1c2VVbmlmb3JtcyA/IDQgOiAwO1xufSk7XG5cbi8qKlxuICogSWYgdGhlIHRvdGFsIG51bWJlciBvZiBieXRlcyBhbGxvY2F0ZWQgb24gdGhlIEdQVSBpcyBncmVhdGVyIHRoYW4gdGhpc1xuICogbnVtYmVyLCB3ZSB3aWxsIGFnZ3Jlc3NpdmVseSBkZWxldGUgdGV4dHVyZXMgdXBvbiBkaXNwb3NhbCB3aXRoXG4gKiBnbC5kZWxldGVNYXRyaXhUZXh0dXJlLCByYXRoZXIgdGhhbiBtYWtpbmcgdGhlbSBhdmFpbGFibGUgZm9yIHJldXNlLlxuICpcbiAqIERlZmF1bHQgdmFsdWUgLTEgaW5kaWNhdGVzIHRoYXQgd2Ugd2lsbCBuZXZlciBhZ2dyZXNzaXZlbHkgZGVsZXRlIHRleHR1cmVzLlxuICovXG5FTlYucmVnaXN0ZXJGbGFnKFxuICAgICdXRUJHTF9ERUxFVEVfVEVYVFVSRV9USFJFU0hPTEQnLFxuICAgICgpID0+IHtcbiAgICAgIHJldHVybiAtMTtcbiAgICB9LFxuICAgIHRocmVzaG9sZCA9PiB7XG4gICAgICBpZiAodGhyZXNob2xkIDwgMCAmJiB0aHJlc2hvbGQgIT09IC0xKSB7XG4gICAgICAgIHRocm93IG5ldyBFcnJvcihcbiAgICAgICAgICAgIGBXRUJHTF9ERUxFVEVfVEVYVFVSRV9USFJFU0hPTEQgbXVzdCBiZSAtMSAoaW5kaWNhdGluZyBuZXZlciBgICtcbiAgICAgICAgICAgIGBkZWxldGUpIG9yIGF0IGxlYXN0IDAsIGJ1dCBnb3QgJHt0aHJlc2hvbGR9LmApO1xuICAgICAgfVxuICAgIH0pO1xuXG4vKipcbiAqIFRyaWdnZXIgYSBtYW51YWwgR0wgY29tbWFuZCBmbHVzaCBpZiB0aGUgdGhyZXNob2xkIG9mIHRpbWUgaGFzIHBhc3NlZCBzaW5jZVxuICogcHJldmlvdXMgS2VybmVsIGV4ZWN1dGlvbi4gVGhpcyBjYW4gYmUgdXNlZnVsIGZvciBBbmRvcmlkIGRldmljZSB3aGVyZSBHTFxuICogY29tbWFuZCBmbHVzaCBhcmUgZGVsYXllZCB1biB0aWwgdGhlIGVuZCBvZiBqYXZhc2NyaXB0IHRhc2suIFRoaXMgdmFsdWUgaXNcbiAqIG1lYXN1cmVkIGluIG1pbGxpc2Vjb25kLiBUeXBpY2FsbHkgeW91IHdhbnQgdG8gc2V0IHRoaXMgdmFsdWUgdG8gY2xvc2UgdG8gMS5cbiAqXG4gKiBEZWZhdWx0IHZhbHVlIDEgZm9yIG1vYmlsZSBjaHJvbWUsIGFuZCAtMSBmb3IgcmVzdCBjYXNlcy4gLTEgaW5kaWNhdGVzIHRoYXRcbiAqIHdlIHdpbGwgbm90IGVuZm9yY2UgbWFudWFsIGZsdXNoIGFuZCBkZXBlbmQgb24gc3lzdGVtIGRlZmF1bHQgZmx1c2ggc2NoZWR1bGUuXG4gKi9cbkVOVi5yZWdpc3RlckZsYWcoXG4gICAgJ1dFQkdMX0ZMVVNIX1RIUkVTSE9MRCcsXG4gICAgKCkgPT4ge1xuICAgICAgcmV0dXJuIGRldmljZV91dGlsLmlzTW9iaWxlKCkgPyAxIDogLTE7XG4gICAgfSxcbiAgICB0aHJlc2hvbGQgPT4ge1xuICAgICAgaWYgKHRocmVzaG9sZCA8IDAgJiYgdGhyZXNob2xkICE9PSAtMSkge1xuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoXG4gICAgICAgICAgICBgV0VCR0xfRkxVU0hfVEhSRVNIT0xEIG11c3QgYmUgLTEgKGluZGljYXRpbmcgbmV2ZXIgYCArXG4gICAgICAgICAgICBgbWFudWFsIGZsdXNoKSBvciBhdCBsZWFzdCAwLCBidXQgZ290ICR7dGhyZXNob2xkfS5gKTtcbiAgICAgIH1cbiAgICB9KTtcblxuLyoqXG4gKiBUaHJlc2hvbGQgZm9yIGlucHV0IHRlbnNvciBzaXplIHRoYXQgZGV0ZXJtaW5lcyB3aGV0aGVyIFdlYkdMIGJhY2tlbmQgd2lsbFxuICogZGVsZWdhdGUgY29tcHV0YXRpb24gdG8gQ1BVLlxuICpcbiAqIERlZmF1bHQgdmFsdWUgaXMgMTI4LlxuICovXG5FTlYucmVnaXN0ZXJGbGFnKCdDUFVfSEFORE9GRl9TSVpFX1RIUkVTSE9MRCcsICgpID0+IDEyOCk7XG5cbi8qKiBXaGV0aGVyIHdlIHdpbGwgdXNlIHNoYXBlcyB1bmlmb3Jtcy4gKi9cbkVOVi5yZWdpc3RlckZsYWcoJ1dFQkdMX1VTRV9TSEFQRVNfVU5JRk9STVMnLCAoKSA9PiBmYWxzZSk7XG5cbi8qKlxuICogVGhyZXNob2xkIGZvciBsYXN0IGRpbWVuc2lvbiBvZiBpbnB1dCB0ZW5zb3IgdGhhdCBkZXRlcm1pbmVzIHdoZXRoZXJcbiAqIFdlYkdMIGJhY2tlbmQgZm9yIHRoZSBUb3AgSyBvcCB3aWxsIGRlbGVnYXRlIGNvbXB1dGF0aW9uIHRvIENQVS4gSWYgaW5wdXRcbiAqIGlzIHNtYWxsZXIgdGhhbiB0aHJlc2hvbGQgdGhlbiBDUFUgd2lsbCBiZSB1c2VkXG4gKlxuICogRGVmYXVsdCB2YWx1ZSBpcyAxMDAwMDAuXG4gKi9cbkVOVi5yZWdpc3RlckZsYWcoJ1RPUEtfTEFTVF9ESU1fQ1BVX0hBTkRPRkZfU0laRV9USFJFU0hPTEQnLCAoKSA9PiAxMDAwMDApO1xuXG4vKipcbiAqIFRocmVzaG9sZCBmb3IgSyB0aGF0IGRldGVybWluZXMgd2hldGhlclxuICogV2ViR0wgYmFja2VuZCBmb3IgdGhlIFRvcCBLIG9wIHdpbGwgZGVsZWdhdGUgY29tcHV0YXRpb24gdG8gQ1BVLiBJZiBrXG4gKiBpcyBsYXJnZXIgdGhhbiB0aHJlc2hvbGQgdGhlbiBDUFUgd2lsbCBiZSB1c2VkXG4gKlxuICogRGVmYXVsdCB2YWx1ZSBpcyAxMjguXG4gKi9cbkVOVi5yZWdpc3RlckZsYWcoJ1RPUEtfS19DUFVfSEFORE9GRl9USFJFU0hPTEQnLCAoKSA9PiAxMjgpO1xuXG4vKiogV2hldGhlciB3ZSB3aWxsIHVzZSB0aGUgZXhwZXJpbWVudGFsIGNvbnYgb3AuICovXG5FTlYucmVnaXN0ZXJGbGFnKCdXRUJHTF9FWFBfQ09OVicsICgpID0+IGZhbHNlKTtcblxuLyoqXG4gKiBJZiB0aGUgZGV2aWNlIHBlcmZvcm1hbmNlIGlzIGxvdyBvciBpZiBubyBoYXJkd2FyZSBHUFUgaXMgYXZhaWxhYmxlLCB3aGV0aGVyXG4gKiBzb2Z0d2FyZSBXZWJHTCB3aWxsIGJlIHVzZWQuXG4gKi9cbkVOVi5yZWdpc3RlckZsYWcoJ1NPRlRXQVJFX1dFQkdMX0VOQUJMRUQnLCAoKSA9PiBFTlYuZ2V0Qm9vbCgnSVNfVEVTVCcpKTtcblxuLyoqXG4gKiBGb3IgbmFycm93IHRleHR1cmUgKHBoeXNpY2FsIGhlaWdodCBvciBwaHlzaWNhbCB3aWR0aCBpcyAxKSwgaWYgdGhlIGxlbmd0aCBvZlxuICogYW55IHRleHR1cmUgZWRnZXMgZXhjZWVkIHRoZSB0aHJlc2hvbGQsIHRoZSB0ZXh0dXJlIHdpbGwgYmUgcmVzaGFwZWQgdG8gYmVcbiAqIG1vcmUgc3F1YXJpc2guXG4gKlxuICogVGhpcyBmbGFnIGlzIHVzZWQgdG8gaGVscCBzb21lIEdQVXMgdGhhdCBjb3VsZCBub3QgcHJvdmlkZSBjb3JyZWN0XG4gKiBpbnRlcnBvbGF0aW9ucyBmb3IgbG9uZyBza2lubnkgdHJpYW5nbGVzLiBXZSBmb3VuZCBNYWxpIEdQVSBwcm9iYWJseSBoYXMgdGhpc1xuICogcHJvYmxlbTogaHR0cHM6Ly9naXRodWIuY29tL3RlbnNvcmZsb3cvdGZqcy9pc3N1ZXMvNjc3NS5cbiAqL1xuRU5WLnJlZ2lzdGVyRmxhZygnV0VCR0xfTUFYX1NJWkVfRk9SX05BUlJPV19URVhUVVJFJywgKCkgPT4gSW5maW5pdHkpO1xuXG4vKipcbiAqIElmIHRoZSBmbGFnIGlzIHNldCB0byB0cnVlLCB0aGUgbWF4IHNpemUgb2YgdGhlIG5hcnJvdyB0ZXh0dXJlIHdpbGwgYmUgYXV0b1xuICogY29tcHV0ZWQgYW5kIGl0IHdpbGwgYmUgY29uc2lkZXJyZWQgYXMgYSB0aHJlc2hvbGQgdG8gcmVzaGFwZSB0aGUgbmFycm93XG4gKiB0ZXh0dXJlIHRvIGJlIG1vcmUgc3F1YXJpc2guXG4gKlxuICogVGhpcyBmbGFnIGlzIHVzZWQgdG8gaGVscCBzb21lIEdQVXMgdGhhdCBjb3VsZCBub3QgcHJvdmlkZSBjb3JyZWN0XG4gKiBpbnRlcnBvbGF0aW9ucyBmb3IgbG9uZyBza2lubnkgdHJpYW5nbGVzLiBXZSBmb3VuZCBNYWxpIEdQVSBwcm9iYWJseSBoYXMgdGhpc1xuICogcHJvYmxlbTogaHR0cHM6Ly9naXRodWIuY29tL3RlbnNvcmZsb3cvdGZqcy9pc3N1ZXMvNjc3NS5cbiAqL1xuRU5WLnJlZ2lzdGVyRmxhZygnV0VCR0xfQVVUT19TUVVBUklGWV9OQVJST1dfVEVYVFVSRV9TSEFQRScsICgpID0+IGZhbHNlKTtcblxuLyoqXG4gKiBXaGV0aGVyIHRvIHVzZSB0aGUgY3VzdG9taXplZCBpc25hbi4gSXQncyBvbmx5IHVzZWZ1bCBmb3Igd2ViZ2wyIHNpbmNlIHdlYmdsMVxuICogZG9lc24ndCBoYXZlIHRoZSBidWlsdGluIGlzbmFuLlxuICovXG5FTlYucmVnaXN0ZXJGbGFnKCdXRUJHTDJfSVNOQU5fQ1VTVE9NJywgKCkgPT4gZmFsc2UpO1xuIl19","/**\n * @license\n * Copyright 2018 Google LLC. All Rights Reserved.\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n * =============================================================================\n */\nimport { env } from '@tensorflow/tfjs-core';\nexport function getGlslDifferences() {\n let version;\n let attribute;\n let varyingVs;\n let varyingFs;\n let texture2D;\n let output;\n let defineOutput;\n let defineSpecialNaN;\n let defineSpecialInf;\n let defineRound;\n if (env().getNumber('WEBGL_VERSION') === 2) {\n version = '#version 300 es';\n attribute = 'in';\n varyingVs = 'out';\n varyingFs = 'in';\n texture2D = 'texture';\n output = 'outputColor';\n defineOutput = 'out vec4 outputColor;';\n // Use custom isnan definition to work across differences between\n // implementations on various platforms. While this should happen in ANGLE\n // we still see differences between android and windows (on chrome) when\n // using isnan directly. Since WebGL2 supports uint type and\n // floatBitsToUinT built-in function, we could implment isnan following\n // IEEE 754 rules.\n // NaN defination in IEEE 754-1985 is :\n // - sign = either 0 or 1.\n // - biased exponent = all 1 bits.\n // - fraction = anything except all 0 bits (since all 0 bits represents\n // infinity).\n // https://en.wikipedia.org/wiki/IEEE_754-1985#Representation_of_non-numbers\n defineSpecialNaN = env().getBool('WEBGL2_ISNAN_CUSTOM') ? `\n bool isnan_custom(float val) {\n uint floatToUint = floatBitsToUint(val);\n return (floatToUint & 0x7fffffffu) > 0x7f800000u;\n }\n\n bvec4 isnan_custom(vec4 val) {\n return bvec4(isnan_custom(val.x),\n isnan_custom(val.y), isnan_custom(val.z), isnan_custom(val.w));\n }\n\n #define isnan(value) isnan_custom(value)\n ` :\n '';\n // In webgl 2 we do not need to specify a custom isinf so there is no\n // need for a special INFINITY constant.\n defineSpecialInf = ``;\n defineRound = `\n #define round(value) newRound(value)\n int newRound(float value) {\n return int(floor(value + 0.5));\n }\n\n ivec4 newRound(vec4 value) {\n return ivec4(floor(value + vec4(0.5)));\n }\n `;\n }\n else {\n version = '';\n attribute = 'attribute';\n varyingVs = 'varying';\n varyingFs = 'varying';\n texture2D = 'texture2D';\n output = 'gl_FragColor';\n defineOutput = '';\n // WebGL1 has no built in isnan so we define one here.\n defineSpecialNaN = `\n #define isnan(value) isnan_custom(value)\n bool isnan_custom(float val) {\n return (val > 0. || val < 1. || val == 0.) ? false : true;\n }\n bvec4 isnan_custom(vec4 val) {\n return bvec4(isnan(val.x), isnan(val.y), isnan(val.z), isnan(val.w));\n }\n `;\n defineSpecialInf = `\n uniform float INFINITY;\n\n bool isinf(float val) {\n return abs(val) == INFINITY;\n }\n bvec4 isinf(vec4 val) {\n return equal(abs(val), vec4(INFINITY));\n }\n `;\n defineRound = `\n int round(float value) {\n return int(floor(value + 0.5));\n }\n\n ivec4 round(vec4 value) {\n return ivec4(floor(value + vec4(0.5)));\n }\n `;\n }\n return {\n version,\n attribute,\n varyingVs,\n varyingFs,\n texture2D,\n output,\n defineOutput,\n defineSpecialNaN,\n defineSpecialInf,\n defineRound\n };\n}\n//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZ2xzbF92ZXJzaW9uLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vdGZqcy1iYWNrZW5kLXdlYmdsL3NyYy9nbHNsX3ZlcnNpb24udHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUE7Ozs7Ozs7Ozs7Ozs7OztHQWVHO0FBQ0gsT0FBTyxFQUFDLEdBQUcsRUFBQyxNQUFNLHVCQUF1QixDQUFDO0FBZTFDLE1BQU0sVUFBVSxrQkFBa0I7SUFDaEMsSUFBSSxPQUFlLENBQUM7SUFDcEIsSUFBSSxTQUFpQixDQUFDO0lBQ3RCLElBQUksU0FBaUIsQ0FBQztJQUN0QixJQUFJLFNBQWlCLENBQUM7SUFDdEIsSUFBSSxTQUFpQixDQUFDO0lBQ3RCLElBQUksTUFBYyxDQUFDO0lBQ25CLElBQUksWUFBb0IsQ0FBQztJQUN6QixJQUFJLGdCQUF3QixDQUFDO0lBQzdCLElBQUksZ0JBQXdCLENBQUM7SUFDN0IsSUFBSSxXQUFtQixDQUFDO0lBRXhCLElBQUksR0FBRyxFQUFFLENBQUMsU0FBUyxDQUFDLGVBQWUsQ0FBQyxLQUFLLENBQUMsRUFBRTtRQUMxQyxPQUFPLEdBQUcsaUJBQWlCLENBQUM7UUFDNUIsU0FBUyxHQUFHLElBQUksQ0FBQztRQUNqQixTQUFTLEdBQUcsS0FBSyxDQUFDO1FBQ2xCLFNBQVMsR0FBRyxJQUFJLENBQUM7UUFDakIsU0FBUyxHQUFHLFNBQVMsQ0FBQztRQUN0QixNQUFNLEdBQUcsYUFBYSxDQUFDO1FBQ3ZCLFlBQVksR0FBRyx1QkFBdUIsQ0FBQztRQUV2QyxpRUFBaUU7UUFDakUsMEVBQTBFO1FBQzFFLHdFQUF3RTtRQUN4RSw0REFBNEQ7UUFDNUQsdUVBQXVFO1FBQ3ZFLGtCQUFrQjtRQUNsQix1Q0FBdUM7UUFDdkMsNEJBQTRCO1FBQzVCLG9DQUFvQztRQUNwQyx5RUFBeUU7UUFDekUsZUFBZTtRQUNmLDRFQUE0RTtRQUM1RSxnQkFBZ0IsR0FBRyxHQUFHLEVBQUUsQ0FBQyxPQUFPLENBQUMscUJBQXFCLENBQUMsQ0FBQyxDQUFDLENBQUM7Ozs7Ozs7Ozs7OztLQVl6RCxDQUFDLENBQUM7WUFDdUQsRUFBRSxDQUFDO1FBQzdELHFFQUFxRTtRQUNyRSx3Q0FBd0M7UUFDeEMsZ0JBQWdCLEdBQUcsRUFBRSxDQUFDO1FBQ3RCLFdBQVcsR0FBRzs7Ozs7Ozs7O0tBU2IsQ0FBQztLQUNIO1NBQU07UUFDTCxPQUFPLEdBQUcsRUFBRSxDQUFDO1FBQ2IsU0FBUyxHQUFHLFdBQVcsQ0FBQztRQUN4QixTQUFTLEdBQUcsU0FBUyxDQUFDO1FBQ3RCLFNBQVMsR0FBRyxTQUFTLENBQUM7UUFDdEIsU0FBUyxHQUFHLFdBQVcsQ0FBQztRQUN4QixNQUFNLEdBQUcsY0FBYyxDQUFDO1FBQ3hCLFlBQVksR0FBRyxFQUFFLENBQUM7UUFDbEIsc0RBQXNEO1FBQ3RELGdCQUFnQixHQUFHOzs7Ozs7OztLQVFsQixDQUFDO1FBQ0YsZ0JBQWdCLEdBQUc7Ozs7Ozs7OztLQVNsQixDQUFDO1FBQ0YsV0FBVyxHQUFHOzs7Ozs7OztLQVFiLENBQUM7S0FDSDtJQUVELE9BQU87UUFDTCxPQUFPO1FBQ1AsU0FBUztRQUNULFNBQVM7UUFDVCxTQUFTO1FBQ1QsU0FBUztRQUNULE1BQU07UUFDTixZQUFZO1FBQ1osZ0JBQWdCO1FBQ2hCLGdCQUFnQjtRQUNoQixXQUFXO0tBQ1osQ0FBQztBQUNKLENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyIvKipcbiAqIEBsaWNlbnNlXG4gKiBDb3B5cmlnaHQgMjAxOCBHb29nbGUgTExDLiBBbGwgUmlnaHRzIFJlc2VydmVkLlxuICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlIFwiTGljZW5zZVwiKTtcbiAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS5cbiAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdFxuICpcbiAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMFxuICpcbiAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmVcbiAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuIFwiQVMgSVNcIiBCQVNJUyxcbiAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLlxuICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZFxuICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuXG4gKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuICovXG5pbXBvcnQge2Vudn0gZnJvbSAnQHRlbnNvcmZsb3cvdGZqcy1jb3JlJztcblxuZXhwb3J0IHR5cGUgR0xTTCA9IHtcbiAgdmVyc2lvbjogc3RyaW5nLFxuICBhdHRyaWJ1dGU6IHN0cmluZyxcbiAgdmFyeWluZ1ZzOiBzdHJpbmcsXG4gIHZhcnlpbmdGczogc3RyaW5nLFxuICB0ZXh0dXJlMkQ6IHN0cmluZyxcbiAgb3V0cHV0OiBzdHJpbmcsXG4gIGRlZmluZU91dHB1dDogc3RyaW5nLFxuICBkZWZpbmVTcGVjaWFsTmFOOiBzdHJpbmcsXG4gIGRlZmluZVNwZWNpYWxJbmY6IHN0cmluZyxcbiAgZGVmaW5lUm91bmQ6IHN0cmluZ1xufTtcblxuZXhwb3J0IGZ1bmN0aW9uIGdldEdsc2xEaWZmZXJlbmNlcygpOiBHTFNMIHtcbiAgbGV0IHZlcnNpb246IHN0cmluZztcbiAgbGV0IGF0dHJpYnV0ZTogc3RyaW5nO1xuICBsZXQgdmFyeWluZ1ZzOiBzdHJpbmc7XG4gIGxldCB2YXJ5aW5nRnM6IHN0cmluZztcbiAgbGV0IHRleHR1cmUyRDogc3RyaW5nO1xuICBsZXQgb3V0cHV0OiBzdHJpbmc7XG4gIGxldCBkZWZpbmVPdXRwdXQ6IHN0cmluZztcbiAgbGV0IGRlZmluZVNwZWNpYWxOYU46IHN0cmluZztcbiAgbGV0IGRlZmluZVNwZWNpYWxJbmY6IHN0cmluZztcbiAgbGV0IGRlZmluZVJvdW5kOiBzdHJpbmc7XG5cbiAgaWYgKGVudigpLmdldE51bWJlcignV0VCR0xfVkVSU0lPTicpID09PSAyKSB7XG4gICAgdmVyc2lvbiA9ICcjdmVyc2lvbiAzMDAgZXMnO1xuICAgIGF0dHJpYnV0ZSA9ICdpbic7XG4gICAgdmFyeWluZ1ZzID0gJ291dCc7XG4gICAgdmFyeWluZ0ZzID0gJ2luJztcbiAgICB0ZXh0dXJlMkQgPSAndGV4dHVyZSc7XG4gICAgb3V0cHV0ID0gJ291dHB1dENvbG9yJztcbiAgICBkZWZpbmVPdXRwdXQgPSAnb3V0IHZlYzQgb3V0cHV0Q29sb3I7JztcblxuICAgIC8vIFVzZSBjdXN0b20gaXNuYW4gZGVmaW5pdGlvbiB0byB3b3JrIGFjcm9zcyBkaWZmZXJlbmNlcyBiZXR3ZWVuXG4gICAgLy8gaW1wbGVtZW50YXRpb25zIG9uIHZhcmlvdXMgcGxhdGZvcm1zLiBXaGlsZSB0aGlzIHNob3VsZCBoYXBwZW4gaW4gQU5HTEVcbiAgICAvLyB3ZSBzdGlsbCBzZWUgZGlmZmVyZW5jZXMgYmV0d2VlbiBhbmRyb2lkIGFuZCB3aW5kb3dzIChvbiBjaHJvbWUpIHdoZW5cbiAgICAvLyB1c2luZyBpc25hbiBkaXJlY3RseS4gU2luY2UgV2ViR0wyIHN1cHBvcnRzIHVpbnQgdHlwZSBhbmRcbiAgICAvLyBmbG9hdEJpdHNUb1VpblQgYnVpbHQtaW4gZnVuY3Rpb24sIHdlIGNvdWxkIGltcGxtZW50IGlzbmFuIGZvbGxvd2luZ1xuICAgIC8vIElFRUUgNzU0IHJ1bGVzLlxuICAgIC8vIE5hTiBkZWZpbmF0aW9uIGluIElFRUUgNzU0LTE5ODUgaXMgOlxuICAgIC8vICAgLSBzaWduID0gZWl0aGVyIDAgb3IgMS5cbiAgICAvLyAgIC0gYmlhc2VkIGV4cG9uZW50ID0gYWxsIDEgYml0cy5cbiAgICAvLyAgIC0gZnJhY3Rpb24gPSBhbnl0aGluZyBleGNlcHQgYWxsIDAgYml0cyAoc2luY2UgYWxsIDAgYml0cyByZXByZXNlbnRzXG4gICAgLy8gICBpbmZpbml0eSkuXG4gICAgLy8gaHR0cHM6Ly9lbi53aWtpcGVkaWEub3JnL3dpa2kvSUVFRV83NTQtMTk4NSNSZXByZXNlbnRhdGlvbl9vZl9ub24tbnVtYmVyc1xuICAgIGRlZmluZVNwZWNpYWxOYU4gPSBlbnYoKS5nZXRCb29sKCdXRUJHTDJfSVNOQU5fQ1VTVE9NJykgPyBgXG4gICAgICBib29sIGlzbmFuX2N1c3RvbShmbG9hdCB2YWwpIHtcbiAgICAgICAgdWludCBmbG9hdFRvVWludCA9IGZsb2F0Qml0c1RvVWludCh2YWwpO1xuICAgICAgICByZXR1cm4gKGZsb2F0VG9VaW50ICYgMHg3ZmZmZmZmZnUpID4gMHg3ZjgwMDAwMHU7XG4gICAgICB9XG5cbiAgICAgIGJ2ZWM0IGlzbmFuX2N1c3RvbSh2ZWM0IHZhbCkge1xuICAgICAgICByZXR1cm4gYnZlYzQoaXNuYW5fY3VzdG9tKHZhbC54KSxcbiAgICAgICAgICBpc25hbl9jdXN0b20odmFsLnkpLCBpc25hbl9jdXN0b20odmFsLnopLCBpc25hbl9jdXN0b20odmFsLncpKTtcbiAgICAgIH1cblxuICAgICAgI2RlZmluZSBpc25hbih2YWx1ZSkgaXNuYW5fY3VzdG9tKHZhbHVlKVxuICAgIGAgOlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnJztcbiAgICAvLyBJbiB3ZWJnbCAyIHdlIGRvIG5vdCBuZWVkIHRvIHNwZWNpZnkgYSBjdXN0b20gaXNpbmYgc28gdGhlcmUgaXMgbm9cbiAgICAvLyBuZWVkIGZvciBhIHNwZWNpYWwgSU5GSU5JVFkgY29uc3RhbnQuXG4gICAgZGVmaW5lU3BlY2lhbEluZiA9IGBgO1xuICAgIGRlZmluZVJvdW5kID0gYFxuICAgICAgI2RlZmluZSByb3VuZCh2YWx1ZSkgbmV3Um91bmQodmFsdWUpXG4gICAgICBpbnQgbmV3Um91bmQoZmxvYXQgdmFsdWUpIHtcbiAgICAgICAgcmV0dXJuIGludChmbG9vcih2YWx1ZSArIDAuNSkpO1xuICAgICAgfVxuXG4gICAgICBpdmVjNCBuZXdSb3VuZCh2ZWM0IHZhbHVlKSB7XG4gICAgICAgIHJldHVybiBpdmVjNChmbG9vcih2YWx1ZSArIHZlYzQoMC41KSkpO1xuICAgICAgfVxuICAgIGA7XG4gIH0gZWxzZSB7XG4gICAgdmVyc2lvbiA9ICcnO1xuICAgIGF0dHJpYnV0ZSA9ICdhdHRyaWJ1dGUnO1xuICAgIHZhcnlpbmdWcyA9ICd2YXJ5aW5nJztcbiAgICB2YXJ5aW5nRnMgPSAndmFyeWluZyc7XG4gICAgdGV4dHVyZTJEID0gJ3RleHR1cmUyRCc7XG4gICAgb3V0cHV0ID0gJ2dsX0ZyYWdDb2xvcic7XG4gICAgZGVmaW5lT3V0cHV0ID0gJyc7XG4gICAgLy8gV2ViR0wxIGhhcyBubyBidWlsdCBpbiBpc25hbiBzbyB3ZSBkZWZpbmUgb25lIGhlcmUuXG4gICAgZGVmaW5lU3BlY2lhbE5hTiA9IGBcbiAgICAgICNkZWZpbmUgaXNuYW4odmFsdWUpIGlzbmFuX2N1c3RvbSh2YWx1ZSlcbiAgICAgIGJvb2wgaXNuYW5fY3VzdG9tKGZsb2F0IHZhbCkge1xuICAgICAgICByZXR1cm4gKHZhbCA+IDAuIHx8IHZhbCA8IDEuIHx8IHZhbCA9PSAwLikgPyBmYWxzZSA6IHRydWU7XG4gICAgICB9XG4gICAgICBidmVjNCBpc25hbl9jdXN0b20odmVjNCB2YWwpIHtcbiAgICAgICAgcmV0dXJuIGJ2ZWM0KGlzbmFuKHZhbC54KSwgaXNuYW4odmFsLnkpLCBpc25hbih2YWwueiksIGlzbmFuKHZhbC53KSk7XG4gICAgICB9XG4gICAgYDtcbiAgICBkZWZpbmVTcGVjaWFsSW5mID0gYFxuICAgICAgdW5pZm9ybSBmbG9hdCBJTkZJTklUWTtcblxuICAgICAgYm9vbCBpc2luZihmbG9hdCB2YWwpIHtcbiAgICAgICAgcmV0dXJuIGFicyh2YWwpID09IElORklOSVRZO1xuICAgICAgfVxuICAgICAgYnZlYzQgaXNpbmYodmVjNCB2YWwpIHtcbiAgICAgICAgcmV0dXJuIGVxdWFsKGFicyh2YWwpLCB2ZWM0KElORklOSVRZKSk7XG4gICAgICB9XG4gICAgYDtcbiAgICBkZWZpbmVSb3VuZCA9IGBcbiAgICAgIGludCByb3VuZChmbG9hdCB2YWx1ZSkge1xuICAgICAgICByZXR1cm4gaW50KGZsb29yKHZhbHVlICsgMC41KSk7XG4gICAgICB9XG5cbiAgICAgIGl2ZWM0IHJvdW5kKHZlYzQgdmFsdWUpIHtcbiAgICAgICAgcmV0dXJuIGl2ZWM0KGZsb29yKHZhbHVlICsgdmVjNCgwLjUpKSk7XG4gICAgICB9XG4gICAgYDtcbiAgfVxuXG4gIHJldHVybiB7XG4gICAgdmVyc2lvbixcbiAgICBhdHRyaWJ1dGUsXG4gICAgdmFyeWluZ1ZzLFxuICAgIHZhcnlpbmdGcyxcbiAgICB0ZXh0dXJlMkQsXG4gICAgb3V0cHV0LFxuICAgIGRlZmluZU91dHB1dCxcbiAgICBkZWZpbmVTcGVjaWFsTmFOLFxuICAgIGRlZmluZVNwZWNpYWxJbmYsXG4gICAgZGVmaW5lUm91bmRcbiAgfTtcbn1cbiJdfQ==","/**\n * @license\n * Copyright 2018 Google LLC. All Rights Reserved.\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n * =============================================================================\n */\nimport { util } from '@tensorflow/tfjs-core';\n/**\n * Produces GLSL code that derives logical coordinates from a flat\n * index. The code performs integer division with each stride and decrements\n * the index until the index equals the final dimension coordinate.\n */\nexport function getLogicalCoordinatesFromFlatIndex(coords, shape, index = 'index') {\n const strides = util.computeStrides(shape);\n return strides\n .map((stride, i) => {\n const line1 = `int ${coords[i]} = ${index} / ${stride}`;\n const line2 = i === strides.length - 1 ?\n `int ${coords[i + 1]} = ${index} - ${coords[i]} * ${stride}` :\n `index -= ${coords[i]} * ${stride}`;\n return `${line1}; ${line2};`;\n })\n .join('');\n}\nexport function getOutputLogicalCoordinatesFromFlatIndexByUniform(coords, shape, index = 'index') {\n const strides = util.computeStrides(shape);\n return strides\n .map((_, i) => {\n const line1 = `int ${coords[i]} = ${index} / outShapeStrides[${i}]`;\n const line2 = i === strides.length - 1 ?\n `int ${coords[i + 1]} = ${index} - ${coords[i]} * outShapeStrides[${i}]` :\n `index -= ${coords[i]} * outShapeStrides[${i}]`;\n return `${line1}; ${line2};`;\n })\n .join('');\n}\n// Produces GLSL code that computes strides.\nfunction symbolicallyComputeStrides(indicesArr, variableName) {\n const numCoords = indicesArr.length;\n const shape = indicesArr.map(d => `${variableName}[${d}]`);\n const strides = new Array(numCoords - 1);\n strides[numCoords - 2] = shape[numCoords - 1];\n for (let i = numCoords - 3; i >= 0; --i) {\n strides[i] = `(${strides[i + 1]} * ${shape[i + 1]})`;\n }\n return strides;\n}\nexport function getLogicalCoordinatesFromFlatIndexByUniform(coords, variableName, index = 'index') {\n const indicesArray = coords.map((_, i) => i);\n const strides = symbolicallyComputeStrides(indicesArray, variableName);\n return strides\n .map((_, i) => {\n const line1 = `int ${coords[i]} = ${index} / ${strides[i]}`;\n const line2 = i === strides.length - 1 ?\n `int ${coords[i + 1]} = ${index} - ${coords[i]} * ${strides[i]}` :\n `index -= ${coords[i]} * ${strides[i]}`;\n return `${line1}; ${line2};`;\n })\n .join('');\n}\nfunction buildVec(x) {\n if (x.length === 1) {\n return `${x[0]}`;\n }\n return `vec${x.length}(${x.join(',')})`;\n}\n/**\n * Produces GLSL code that computes the dot product of the input x and y\n * vectors. Handles splitting inputs into increments of vec4s when necessary.\n */\nexport function dotify(x, y) {\n if (x.length !== y.length) {\n throw new Error(`Vectors to be dotted must be of the same length -` +\n `got ${x.length} and ${y.length}`);\n }\n const slices = [];\n const nearestVec4 = Math.floor(x.length / 4);\n const nearestVec4Remainder = x.length % 4;\n for (let i = 0; i < nearestVec4; i++) {\n const xSlice = x.slice(i * 4, i * 4 + 4);\n const ySlice = y.slice(i * 4, i * 4 + 4);\n slices.push(`${buildVec(xSlice)}, ${buildVec(ySlice)}`);\n }\n if (nearestVec4Remainder !== 0) {\n let xSlice = x.slice(nearestVec4 * 4);\n let ySlice = y.slice(nearestVec4 * 4);\n if (xSlice.length === 1) {\n xSlice = xSlice.map(d => `float(${d})`);\n ySlice = ySlice.map(d => `float(${d})`);\n }\n slices.push(`${buildVec(xSlice)}, ${buildVec(ySlice)}`);\n }\n return slices.map((d, i) => `dot(${d})`).join('+');\n}\n/**\n * Produces GLSL that computes the flat index from 3D coordinates.\n */\nexport function getFlatIndexFrom3D(shape) {\n const strides = util.computeStrides(shape).map(d => d.toString());\n return `\n int getFlatIndex(ivec3 coords) {\n return coords.x * ${strides[0]} + coords.y * ${strides[1]} + coords.z;\n }\n`;\n}\nexport function getFlatIndexFrom3DOutput() {\n return `\n int getFlatIndex(ivec3 coords) {\n return coords.x * outShapeStrides[0] + coords.y * outShapeStrides[1] + coords.z;\n }\n`;\n}\nexport const ENCODE_FLOAT_SNIPPET = `\n const float FLOAT_MAX = 1.70141184e38;\n const float FLOAT_MIN = 1.17549435e-38;\n\n lowp vec4 encode_float(highp float v) {\n if (isnan(v)) {\n return vec4(255, 255, 255, 255);\n }\n\n highp float av = abs(v);\n\n if(av < FLOAT_MIN) {\n return vec4(0.0, 0.0, 0.0, 0.0);\n } else if(v > FLOAT_MAX) {\n return vec4(0.0, 0.0, 128.0, 127.0) / 255.0;\n } else if(v < -FLOAT_MAX) {\n return vec4(0.0, 0.0, 128.0, 255.0) / 255.0;\n }\n\n highp vec4 c = vec4(0,0,0,0);\n\n highp float e = floor(log2(av));\n highp float m = exp2(fract(log2(av))) - 1.0;\n\n c[2] = floor(128.0 * m);\n m -= c[2] / 128.0;\n c[1] = floor(32768.0 * m);\n m -= c[1] / 32768.0;\n c[0] = floor(8388608.0 * m);\n\n highp float ebias = e + 127.0;\n c[3] = floor(ebias / 2.0);\n ebias -= c[3] * 2.0;\n c[2] += floor(ebias) * 128.0;\n\n c[3] += 128.0 * step(0.0, -v);\n\n return c / 255.0;\n }\n`;\n//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic2hhZGVyX2NvbXBpbGVyX3V0aWwuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi90ZmpzLWJhY2tlbmQtd2ViZ2wvc3JjL3NoYWRlcl9jb21waWxlcl91dGlsLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBOzs7Ozs7Ozs7Ozs7Ozs7R0FlRztBQUVILE9BQU8sRUFBQyxJQUFJLEVBQUMsTUFBTSx1QkFBdUIsQ0FBQztBQUUzQzs7OztHQUlHO0FBQ0gsTUFBTSxVQUFVLGtDQUFrQyxDQUM5QyxNQUFnQixFQUFFLEtBQWUsRUFBRSxLQUFLLEdBQUcsT0FBTztJQUNwRCxNQUFNLE9BQU8sR0FBRyxJQUFJLENBQUMsY0FBYyxDQUFDLEtBQUssQ0FBQyxDQUFDO0lBQzNDLE9BQU8sT0FBTztTQUNULEdBQUcsQ0FBQyxDQUFDLE1BQU0sRUFBRSxDQUFDLEVBQUUsRUFBRTtRQUNqQixNQUFNLEtBQUssR0FBRyxPQUFPLE1BQU0sQ0FBQyxDQUFDLENBQUMsTUFBTSxLQUFLLE1BQU0sTUFBTSxFQUFFLENBQUM7UUFDeEQsTUFBTSxLQUFLLEdBQUcsQ0FBQyxLQUFLLE9BQU8sQ0FBQyxNQUFNLEdBQUcsQ0FBQyxDQUFDLENBQUM7WUFDcEMsT0FBTyxNQUFNLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxNQUFNLEtBQUssTUFBTSxNQUFNLENBQUMsQ0FBQyxDQUFDLE1BQU0sTUFBTSxFQUFFLENBQUMsQ0FBQztZQUM5RCxZQUFZLE1BQU0sQ0FBQyxDQUFDLENBQUMsTUFBTSxNQUFNLEVBQUUsQ0FBQztRQUN4QyxPQUFPLEdBQUcsS0FBSyxLQUFLLEtBQUssR0FBRyxDQUFDO0lBQy9CLENBQUMsQ0FBQztTQUNELElBQUksQ0FBQyxFQUFFLENBQUMsQ0FBQztBQUNoQixDQUFDO0FBRUQsTUFBTSxVQUFVLGlEQUFpRCxDQUM3RCxNQUFnQixFQUFFLEtBQWUsRUFBRSxLQUFLLEdBQUcsT0FBTztJQUNwRCxNQUFNLE9BQU8sR0FBRyxJ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TSxvQkFBb0IsR0FBRzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7O0NBdUNuQyxDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiLyoqXG4gKiBAbGljZW5zZVxuICogQ29weXJpZ2h0IDIwMTggR29vZ2xlIExMQy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC5cbiAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSBcIkxpY2Vuc2VcIik7XG4gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuXG4gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXRcbiAqXG4gKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjBcbiAqXG4gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlXG4gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiBcIkFTIElTXCIgQkFTSVMsXG4gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC5cbiAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmRcbiAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLlxuICogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbiAqL1xuXG5pbXBvcnQge3V0aWx9IGZyb20gJ0B0ZW5zb3JmbG93L3RmanMtY29yZSc7XG5cbi8qKlxuICogUHJvZHVjZXMgR0xTTCBjb2RlIHRoYXQgZGVyaXZlcyBsb2dpY2FsIGNvb3JkaW5hdGVzIGZyb20gYSBmbGF0XG4gKiBpbmRleC4gVGhlIGNvZGUgcGVyZm9ybXMgaW50ZWdlciBkaXZpc2lvbiB3aXRoIGVhY2ggc3RyaWRlIGFuZCBkZWNyZW1lbnRzXG4gKiB0aGUgaW5kZXggdW50aWwgdGhlIGluZGV4IGVxdWFscyB0aGUgZmluYWwgZGltZW5zaW9uIGNvb3JkaW5hdGUuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBnZXRMb2dpY2FsQ29vcmRpbmF0ZXNGcm9tRmxhdEluZGV4KFxuICAgIGNvb3Jkczogc3RyaW5nW10sIHNoYXBlOiBudW1iZXJbXSwgaW5kZXggPSAnaW5kZXgnKTogc3RyaW5nIHtcbiAgY29uc3Qgc3RyaWRlcyA9IHV0aWwuY29tcHV0ZVN0cmlkZXMoc2hhcGUpO1xuICByZXR1cm4gc3RyaWRlc1xuICAgICAgLm1hcCgoc3RyaWRlLCBpKSA9PiB7XG4gICAgICAgIGNvbnN0IGxpbmUxID0gYGludCAke2Nvb3Jkc1tpXX0gPSAke2luZGV4fSAvICR7c3RyaWRlfWA7XG4gICAgICAgIGNvbnN0IGxpbmUyID0gaSA9PT0gc3RyaWRlcy5sZW5ndGggLSAxID9cbiAgICAgICAgICAgIGBpbnQgJHtjb29yZHNbaSArIDFdfSA9ICR7aW5kZXh9IC0gJHtjb29yZHNbaV19ICogJHtzdHJpZGV9YCA6XG4gICAgICAgICAgICBgaW5kZXggLT0gJHtjb29yZHNbaV19ICogJHtzdHJpZGV9YDtcbiAgICAgICAgcmV0dXJuIGAke2xpbmUxfTsgJHtsaW5lMn07YDtcbiAgICAgIH0pXG4gICAgICAuam9pbignJyk7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBnZXRPdXRwdXRMb2dpY2FsQ29vcmRpbmF0ZXNGcm9tRmxhdEluZGV4QnlVbmlmb3JtKFxuICAgIGNvb3Jkczogc3RyaW5nW10sIHNoYXBlOiBudW1iZXJbXSwgaW5kZXggPSAnaW5kZXgnKTogc3RyaW5nIHtcbiAgY29uc3Qgc3RyaWRlcyA9IHV0aWwuY29tcHV0ZVN0cmlkZXMoc2hhcGUpO1xuICByZXR1cm4gc3RyaWRlc1xuICAgICAgLm1hcCgoXywgaSkgPT4ge1xuICAgICAgICBjb25zdCBsaW5lMSA9IGBpbnQgJHtjb29yZHNbaV19ID0gJHtpbmRleH0gLyBvdXRTaGFwZVN0cmlkZXNbJHtpfV1gO1xuICAgICAgICBjb25zdCBsaW5lMiA9IGkgPT09IHN0cmlkZXMubGVuZ3RoIC0gMSA/XG4gICAgICAgICAgICBgaW50ICR7Y29vcmRzW2kgKyAxXX0gPSAke2luZGV4fSAtICR7Y29vcmRzW2ldfSAqIG91dFNoYXBlU3RyaWRlc1ske1xuICAgICAgICAgICAgICAgIGl9XWAgOlxuICAgICAgICAgICAgYGluZGV4IC09ICR7Y29vcmRzW2ldfSAqIG91dFNoYXBlU3RyaWRlc1ske2l9XWA7XG4gICAgICAgIHJldHVybiBgJHtsaW5lMX07ICR7bGluZTJ9O2A7XG4gICAgICB9KVxuICAgICAgLmpvaW4oJycpO1xufVxuXG4vLyBQcm9kdWNlcyBHTFNMIGNvZGUgdGhhdCBjb21wdXRlcyBzdHJpZGVzLlxuZnVuY3Rpb24gc3ltYm9saWNhbGx5Q29tcHV0ZVN0cmlkZXMoXG4gICAgaW5kaWNlc0FycjogbnVtYmVyW10sIHZhcmlhYmxlTmFtZTogc3RyaW5nKTogc3RyaW5nW10ge1xuICBjb25zdCBudW1Db29yZHMgPSBpbmRpY2VzQXJyLmxlbmd0aDtcbiAgY29uc3Qgc2hhcGUgPSBpbmRpY2VzQXJyLm1hcChkID0+IGAke3ZhcmlhYmxlTmFtZX1bJHtkfV1gKTtcbiAgY29uc3Qgc3RyaWRlcyA9IG5ldyBBcnJheShudW1Db29yZHMgLSAxKTtcbiAgc3RyaWRlc1tudW1Db29yZHMgLSAyXSA9IHNoYXBlW251bUNvb3JkcyAtIDFdO1xuICBmb3IgKGxldCBpID0gbnVtQ29vcmRzIC0gMzsgaSA+PSAwOyAtLWkpIHtcbiAgICBzdHJpZGVzW2ldID0gYCgke3N0cmlkZXNbaSArIDFdfSAqICR7c2hhcGVbaSArIDFdfSlgO1xuICB9XG5cbiAgcmV0dXJuIHN0cmlkZXM7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBnZXRMb2dpY2FsQ29vcmRpbmF0ZXNGcm9tRmxhdEluZGV4QnlVbmlmb3JtKFxuICAgIGNvb3Jkczogc3RyaW5nW10sIHZhcmlhYmxlTmFtZTogc3RyaW5nLCBpbmRleCA9ICdpbmRleCcpOiBzdHJpbmcge1xuICBjb25zdCBpbmRpY2VzQXJyYXkgPSBjb29yZHMubWFwKChfLCBpKSA9PiBpKTtcbiAgY29uc3Qgc3RyaWRlcyA9IHN5bWJvbGljYWxseUNvbXB1dGVTdHJpZGVzKGluZGljZXNBcnJheSwgdmFyaWFibGVOYW1lKTtcbiAgcmV0dXJuIHN0cmlkZXNcbiAgICAgIC5tYXAoKF8sIGkpID0+IHtcbiAgICAgICAgY29uc3QgbGluZTEgPSBgaW50ICR7Y29vcmRzW2ldfSA9ICR7aW5kZXh9IC8gJHtzdHJpZGVzW2ldfWA7XG4gICAgICAgIGNvbnN0IGxpbmUyID0gaSA9PT0gc3RyaWRlcy5sZW5ndGggLSAxID9cbiAgICAgICAgICAgIGBpbnQgJHtjb29yZHNbaSArIDFdfSA9ICR7aW5kZXh9IC0gJHtjb29yZHNbaV19ICogJHtzdHJpZGVzW2ldfWAgOlxuICAgICAgICAgICAgYGluZGV4IC09ICR7Y29vcmRzW2ldfSAqICR7c3RyaWRlc1tpXX1gO1xuICAgICAgICByZXR1cm4gYCR7bGluZTF9OyAke2xpbmUyfTtgO1xuICAgICAgfSlcbiAgICAgIC5qb2luKCcnKTtcbn1cblxuZnVuY3Rpb24gYnVpbGRWZWMoeDogc3RyaW5nW10pOiBzdHJpbmcge1xuICBpZiAoeC5sZW5ndGggPT09IDEpIHtcbiAgICByZXR1cm4gYCR7eFswXX1gO1xuICB9XG4gIHJldHVybiBgdmVjJHt4Lmxlbmd0aH0oJHt4LmpvaW4oJywnKX0pYDtcbn1cblxuLyoqXG4gKiBQcm9kdWNlcyBHTFNMIGNvZGUgdGhhdCBjb21wdXRlcyB0aGUgZG90IHByb2R1Y3Qgb2YgdGhlIGlucHV0IHggYW5kIHlcbiAqIHZlY3RvcnMuIEhhbmRsZXMgc3BsaXR0aW5nIGlucHV0cyBpbnRvIGluY3JlbWVudHMgb2YgdmVjNHMgd2hlbiBuZWNlc3NhcnkuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBkb3RpZnkoeDogc3RyaW5nW10sIHk6IHN0cmluZ1tdKTogc3RyaW5nIHtcbiAgaWYgKHgubGVuZ3RoICE9PSB5Lmxlbmd0aCkge1xuICAgIHRocm93IG5ldyBFcnJvcihcbiAgICAgICAgYFZlY3RvcnMgdG8gYmUgZG90dGVkIG11c3QgYmUgb2YgdGhlIHNhbWUgbGVuZ3RoIC1gICtcbiAgICAgICAgYGdvdCAke3gubGVuZ3RofSBhbmQgJHt5Lmxlbmd0aH1gKTtcbiAgfVxuXG4gIGNvbnN0IHNsaWNlczogc3RyaW5nW10gPSBbXTtcbiAgY29uc3QgbmVhcmVzdFZlYzQgPSBNYXRoLmZsb29yKHgubGVuZ3RoIC8gNCk7XG4gIGNvbnN0IG5lYXJlc3RWZWM0UmVtYWluZGVyID0geC5sZW5ndGggJSA0O1xuXG4gIGZvciAobGV0IGkgPSAwOyBpIDwgbmVhcmVzdFZlYzQ7IGkrKykge1xuICAgIGNvbnN0IHhTbGljZSA9IHguc2xpY2UoaSAqIDQsIGkgKiA0ICsgNCk7XG4gICAgY29uc3QgeVNsaWNlID0geS5zbGljZShpICogNCwgaSAqIDQgKyA0KTtcbiAgICBzbGljZXMucHVzaChgJHtidWlsZFZlYyh4U2xpY2UpfSwgJHtidWlsZFZlYyh5U2xpY2UpfWApO1xuICB9XG5cbiAgaWYgKG5lYXJlc3RWZWM0UmVtYWluZGVyICE9PSAwKSB7XG4gICAgbGV0IHhTbGljZSA9IHguc2xpY2UobmVhcmVzdFZlYzQgKiA0KTtcbiAgICBsZXQgeVNsaWNlID0geS5zbGljZShuZWFyZXN0VmVjNCAqIDQpO1xuICAgIGlmICh4U2xpY2UubGVuZ3RoID09PSAxKSB7XG4gICAgICB4U2xpY2UgPSB4U2xpY2UubWFwKGQgPT4gYGZsb2F0KCR7ZH0pYCk7XG4gICAgICB5U2xpY2UgPSB5U2xpY2UubWFwKGQgPT4gYGZsb2F0KCR7ZH0pYCk7XG4gICAgfVxuICAgIHNsaWNlcy5wdXNoKGAke2J1aWxkVmVjKHhTbGljZSl9LCAke2J1aWxkVmVjKHlTbGljZSl9YCk7XG4gIH1cblxuICByZXR1cm4gc2xpY2VzLm1hcCgoZCwgaSkgPT4gYGRvdCgke2R9KWApLmpvaW4oJysnKTtcbn1cblxuLyoqXG4gKiBQcm9kdWNlcyBHTFNMIHRoYXQgY29tcHV0ZXMgdGhlIGZsYXQgaW5kZXggZnJvbSAzRCBjb29yZGluYXRlcy5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGdldEZsYXRJbmRleEZyb20zRChzaGFwZTogW251bWJlciwgbnVtYmVyLCBudW1iZXJdKTogc3RyaW5nIHtcbiAgY29uc3Qgc3RyaWRlcyA9IHV0aWwuY29tcHV0ZVN0cmlkZXMoc2hhcGUpLm1hcChkID0+IGQudG9TdHJpbmcoKSk7XG5cbiAgcmV0dXJuIGBcbiAgaW50IGdldEZsYXRJbmRleChpdmVjMyBjb29yZHMpIHtcbiAgICByZXR1cm4gY29vcmRzLnggKiAke3N0cmlkZXNbMF19ICsgY29vcmRzLnkgKiAke3N0cmlkZXNbMV19ICsgY29vcmRzLno7XG4gIH1cbmA7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBnZXRGbGF0SW5kZXhGcm9tM0RPdXRwdXQoKTogc3RyaW5nIHtcbiAgcmV0dXJuIGBcbiAgaW50IGdldEZsYXRJbmRleChpdmVjMyBjb29yZHMpIHtcbiAgICByZXR1cm4gY29vcmRzLnggKiBvdXRTaGFwZVN0cmlkZXNbMF0gKyBjb29yZHMueSAqIG91dFNoYXBlU3RyaWRlc1sxXSArIGNvb3Jkcy56O1xuICB9XG5gO1xufVxuXG5leHBvcnQgY29uc3QgRU5DT0RFX0ZMT0FUX1NOSVBQRVQgPSBgXG4gIGNvbnN0IGZsb2F0IEZMT0FUX01BWCA9IDEuNzAxNDExODRlMzg7XG4gIGNvbnN0IGZsb2F0IEZMT0FUX01JTiA9IDEuMTc1NDk0MzVlLTM4O1xuXG4gIGxvd3AgdmVjNCBlbmNvZGVfZmxvYXQoaGlnaHAgZmxvYXQgdikge1xuICAgIGlmIChpc25hbih2KSkge1xuICAgICAgcmV0dXJuIHZlYzQoMjU1LCAyNTUsIDI1NSwgMjU1KTtcbiAgICB9XG5cbiAgICBoaWdocCBmbG9hdCBhdiA9IGFicyh2KTtcblxuICAgIGlmKGF2IDwgRkxPQVRfTUlOKSB7XG4gICAgICByZXR1cm4gdmVjNCgwLjAsIDAuMCwgMC4wLCAwLjApO1xuICAgIH0gZWxzZSBpZih2ID4gRkxPQVRfTUFYKSB7XG4gICAgICByZXR1cm4gdmVjNCgwLjAsIDAuMCwgMTI4LjAsIDEyNy4wKSAvIDI1NS4wO1xuICAgIH0gZWxzZSBpZih2IDwgLUZMT0FUX01BWCkge1xuICAgICAgcmV0dXJuIHZlYzQoMC4wLCAwLjAsICAxMjguMCwgMjU1LjApIC8gMjU1LjA7XG4gICAgfVxuXG4gICAgaGlnaHAgdmVjNCBjID0gdmVjNCgwLDAsMCwwKTtcblxuICAgIGhpZ2hwIGZsb2F0IGUgPSBmbG9vcihsb2cyKGF2KSk7XG4gICAgaGlnaHAgZmxvYXQgbSA9IGV4cDIoZnJhY3QobG9nMihhdikpKSAtIDEuMDtcblxuICAgIGNbMl0gPSBmbG9vcigxMjguMCAqIG0pO1xuICAgIG0gLT0gY1syXSAvIDEyOC4wO1xuICAgIGNbMV0gPSBmbG9vcigzMjc2OC4wICogbSk7XG4gICAgbSAtPSBjWzFdIC8gMzI3NjguMDtcbiAgICBjWzBdID0gZmxvb3IoODM4ODYwOC4wICogbSk7XG5cbiAgICBoaWdocCBmbG9hdCBlYmlhcyA9IGUgKyAxMjcuMDtcbiAgICBjWzNdID0gZmxvb3IoZWJpYXMgLyAyLjApO1xuICAgIGViaWFzIC09IGNbM10gKiAyLjA7XG4gICAgY1syXSArPSBmbG9vcihlYmlhcykgKiAxMjguMDtcblxuICAgIGNbM10gKz0gMTI4LjAgKiBzdGVwKDAuMCwgLXYpO1xuXG4gICAgcmV0dXJuIGMgLyAyNTUuMDtcbiAgfVxuYDtcbiJdfQ==","/**\n * @license\n * Copyright 2017 Google LLC. All Rights Reserved.\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n * =============================================================================\n */\n// Please make sure the shaker key in makeShaderKey in gpgpu_math.ts is well\n// mapped if any shader source code is changed in this file.\nimport { backend_util, util } from '@tensorflow/tfjs-core';\nconst { getBroadcastDims } = backend_util;\nimport { getGlslDifferences } from './glsl_version';\nimport * as shader_util from './shader_compiler_util';\nexport function makeShader(inputsInfo, outputShape, program) {\n const prefixSnippets = [];\n inputsInfo.forEach(x => {\n const size = util.sizeFromShape(x.shapeInfo.logicalShape);\n // Snippet when we decided to upload the values as uniform.\n if (x.shapeInfo.isUniform) {\n prefixSnippets.push(`uniform float ${x.name}${size > 1 ? `[${size}]` : ''};`);\n }\n else {\n prefixSnippets.push(`uniform sampler2D ${x.name};`);\n prefixSnippets.push(`uniform int offset${x.name};`);\n }\n if (program.enableShapeUniforms) {\n const { uniformShape } = getUniformInfoFromShape(program.packedInputs, x.shapeInfo.logicalShape, x.shapeInfo.texShape);\n switch (uniformShape.length) {\n case 1:\n prefixSnippets.push(`uniform int ${x.name}Shape;`);\n break;\n case 2:\n prefixSnippets.push(`uniform ivec2 ${x.name}Shape;`);\n break;\n case 3:\n prefixSnippets.push(`uniform ivec3 ${x.name}Shape;`);\n break;\n case 4:\n prefixSnippets.push(`uniform ivec4 ${x.name}Shape;`);\n break;\n default:\n break;\n }\n prefixSnippets.push(`uniform ivec2 ${x.name}TexShape;`);\n }\n });\n if (program.enableShapeUniforms) {\n switch (outputShape.logicalShape.length) {\n case 1:\n prefixSnippets.push(`uniform int outShape;`);\n break;\n case 2:\n prefixSnippets.push(`uniform ivec2 outShape;`);\n prefixSnippets.push(`uniform int outShapeStrides;`);\n break;\n case 3:\n prefixSnippets.push(`uniform ivec3 outShape;`);\n prefixSnippets.push(`uniform ivec2 outShapeStrides;`);\n break;\n case 4:\n prefixSnippets.push(`uniform ivec4 outShape;`);\n prefixSnippets.push(`uniform ivec3 outShapeStrides;`);\n break;\n default:\n break;\n }\n prefixSnippets.push(`uniform ivec2 outTexShape;`);\n }\n if (program.customUniforms) {\n program.customUniforms.forEach((d) => {\n prefixSnippets.push(`uniform ${d.type} ${d.name}${d.arrayIndex ? `[${d.arrayIndex}]` : ''};`);\n });\n }\n const inputPrefixSnippet = prefixSnippets.join('\\n');\n const inputSamplingSnippet = inputsInfo\n .map(x => getInputSamplingSnippet(x, outputShape, program.packedInputs, program.enableShapeUniforms))\n .join('\\n');\n const outTexShape = outputShape.texShape;\n const glsl = getGlslDifferences();\n const floatTextureSampleSnippet = getFloatTextureSampleSnippet(glsl);\n let outputSamplingSnippet;\n let floatTextureSetOutputSnippet;\n let shaderPrefix = getShaderPrefix(glsl);\n if (outputShape.isPacked) {\n outputSamplingSnippet = getPackedOutputSamplingSnippet(outputShape.logicalShape, outTexShape, program.enableShapeUniforms);\n floatTextureSetOutputSnippet = getFloatTextureSetRGBASnippet(glsl);\n }\n else {\n outputSamplingSnippet = getOutputSamplingSnippet(outputShape.logicalShape, outTexShape, program.enableShapeUniforms);\n floatTextureSetOutputSnippet = getFloatTextureSetRSnippet(glsl);\n }\n if (program.packedInputs) {\n shaderPrefix += SHADER_PACKED_PREFIX;\n }\n const source = [\n shaderPrefix, floatTextureSampleSnippet, floatTextureSetOutputSnippet,\n inputPrefixSnippet, outputSamplingSnippet, inputSamplingSnippet,\n program.userCode\n ].join('\\n');\n return source;\n}\nfunction getSamplerFromInInfo(inInfo, enableShapeUniforms = false) {\n const shape = inInfo.shapeInfo.logicalShape;\n switch (shape.length) {\n case 0:\n return getSamplerScalar(inInfo, enableShapeUniforms);\n case 1:\n return getSampler1D(inInfo, enableShapeUniforms);\n case 2:\n return getSampler2D(inInfo, enableShapeUniforms);\n case 3:\n return getSampler3D(inInfo, enableShapeUniforms);\n case 4:\n return getSampler4D(inInfo, enableShapeUniforms);\n case 5:\n return getSampler5D(inInfo);\n case 6:\n return getSampler6D(inInfo);\n default:\n throw new Error(`${shape.length}-D input sampling` +\n ` is not yet supported`);\n }\n}\nfunction getPackedSamplerFromInInfo(inInfo, enableShapeUniforms) {\n const shape = inInfo.shapeInfo.logicalShape;\n switch (shape.length) {\n case 0:\n return getPackedSamplerScalar(inInfo);\n case 1:\n return getPackedSampler1D(inInfo, enableShapeUniforms);\n case 2:\n return getPackedSampler2D(inInfo, enableShapeUniforms);\n case 3:\n return getPackedSampler3D(inInfo, enableShapeUniforms);\n default:\n return getPackedSamplerND(inInfo, enableShapeUniforms);\n }\n}\nfunction getInputSamplingSnippet(inInfo, outShapeInfo, usesPackedTextures = false, enableShapeUniforms) {\n let res = '';\n if (usesPackedTextures) {\n res += getPackedSamplerFromInInfo(inInfo, enableShapeUniforms);\n }\n else {\n res += getSamplerFromInInfo(inInfo, enableShapeUniforms);\n }\n const inShape = inInfo.shapeInfo.logicalShape;\n const outShape = outShapeInfo.logicalShape;\n if (inShape.length <= outShape.length) {\n if (usesPackedTextures) {\n res += getPackedSamplerAtOutputCoords(inInfo, outShapeInfo);\n }\n else {\n res += getSamplerAtOutputCoords(inInfo, outShapeInfo);\n }\n }\n return res;\n}\nfunction getPackedOutputSamplingSnippet(outShape, outTexShape, enableShapeUniforms) {\n switch (outShape.length) {\n case 0:\n return getOutputScalarCoords();\n case 1:\n return getOutputPacked1DCoords(outShape, outTexShape, enableShapeUniforms);\n case 2:\n return getOutputPacked2DCoords(outShape, outTexShape, enableShapeUniforms);\n case 3:\n return getOutputPacked3DCoords(outShape, outTexShape, enableShapeUniforms);\n default:\n return getOutputPackedNDCoords(outShape, outTexShape, enableShapeUniforms);\n }\n}\nfunction getOutputSamplingSnippet(outShape, outTexShape, enableShapeUniforms) {\n switch (outShape.length) {\n case 0:\n return getOutputScalarCoords();\n case 1:\n return getOutput1DCoords(outShape, outTexShape, enableShapeUniforms);\n case 2:\n return getOutput2DCoords(outShape, outTexShape, enableShapeUniforms);\n case 3:\n return getOutput3DCoords(outShape, outTexShape, enableShapeUniforms);\n case 4:\n return getOutput4DCoords(outShape, outTexShape, enableShapeUniforms);\n case 5:\n return getOutput5DCoords(outShape, outTexShape);\n case 6:\n return getOutput6DCoords(outShape, outTexShape);\n default:\n throw new Error(`${outShape.length}-D output sampling is not yet supported`);\n }\n}\nfunction getFloatTextureSampleSnippet(glsl) {\n return `\n float sampleTexture(sampler2D textureSampler, vec2 uv) {\n return ${glsl.texture2D}(textureSampler, uv).r;\n }\n `;\n}\nfunction getFloatTextureSetRSnippet(glsl) {\n return `\n void setOutput(float val) {\n ${glsl.output} = vec4(val, 0, 0, 0);\n }\n `;\n}\nfunction getFloatTextureSetRGBASnippet(glsl) {\n return `\n void setOutput(vec4 val) {\n ${glsl.output} = val;\n }\n `;\n}\nfunction getShaderPrefix(glsl) {\n const SHADER_PREFIX = `${glsl.version}\n precision highp float;\n precision highp int;\n precision highp sampler2D;\n ${glsl.varyingFs} vec2 resultUV;\n ${glsl.defineOutput}\n const vec2 halfCR = vec2(0.5, 0.5);\n\n struct ivec5\n {\n int x;\n int y;\n int z;\n int w;\n int u;\n };\n\n struct ivec6\n {\n int x;\n int y;\n int z;\n int w;\n int u;\n int v;\n };\n\n uniform float NAN;\n ${glsl.defineSpecialNaN}\n ${glsl.defineSpecialInf}\n ${glsl.defineRound}\n\n int imod(int x, int y) {\n return x - y * (x / y);\n }\n\n int idiv(int a, int b, float sign) {\n int res = a / b;\n int mod = imod(a, b);\n if (sign < 0. && mod != 0) {\n res -= 1;\n }\n return res;\n }\n\n //Based on the work of Dave Hoskins\n //https://www.shadertoy.com/view/4djSRW\n #define HASHSCALE1 443.8975\n float random(float seed){\n vec2 p = resultUV * seed;\n vec3 p3 = fract(vec3(p.xyx) * HASHSCALE1);\n p3 += dot(p3, p3.yzx + 19.19);\n return fract((p3.x + p3.y) * p3.z);\n }\n\n ${SAMPLE_1D_SNIPPET}\n ${SAMPLE_2D_SNIPPET}\n ${SAMPLE_3D_SNIPPET}\n `;\n return SHADER_PREFIX;\n}\nconst SAMPLE_1D_SNIPPET = `\nvec2 uvFromFlat(int texNumR, int texNumC, int index) {\n int texR = index / texNumC;\n int texC = index - texR * texNumC;\n return (vec2(texC, texR) + halfCR) / vec2(texNumC, texNumR);\n}\nvec2 packedUVfrom1D(int texNumR, int texNumC, int index) {\n int texelIndex = index / 2;\n int texR = texelIndex / texNumC;\n int texC = texelIndex - texR * texNumC;\n return (vec2(texC, texR) + halfCR) / vec2(texNumC, texNumR);\n}\n`;\nconst SAMPLE_2D_SNIPPET = `\nvec2 packedUVfrom2D(int texelsInLogicalRow, int texNumR,\n int texNumC, int row, int col) {\n int texelIndex = (row / 2) * texelsInLogicalRow + (col / 2);\n int texR = texelIndex / texNumC;\n int texC = texelIndex - texR * texNumC;\n return (vec2(texC, texR) + halfCR) / vec2(texNumC, texNumR);\n}\n`;\nconst SAMPLE_3D_SNIPPET = `\nvec2 packedUVfrom3D(int texNumR, int texNumC,\n int texelsInBatch, int texelsInLogicalRow, int b,\n int row, int col) {\n int index = b * texelsInBatch + (row / 2) * texelsInLogicalRow + (col / 2);\n int texR = index / texNumC;\n int texC = index - texR * texNumC;\n return (vec2(texC, texR) + halfCR) / vec2(texNumC, texNumR);\n}\n`;\nconst SHADER_PACKED_PREFIX = `\n float getChannel(vec4 frag, vec2 innerDims) {\n vec2 modCoord = mod(innerDims, 2.);\n return modCoord.x == 0. ?\n (modCoord.y == 0. ? frag.r : frag.g) :\n (modCoord.y == 0. ? frag.b : frag.a);\n }\n float getChannel(vec4 frag, int dim) {\n float modCoord = mod(float(dim), 2.);\n return modCoord == 0. ? frag.r : frag.g;\n }\n`;\nfunction getOutputScalarCoords() {\n return `\n int getOutputCoords() {\n return 0;\n }\n `;\n}\nfunction getOutputPacked1DCoords(shape, texShape, enableShapeUniforms) {\n const packedTexShape = [Math.ceil(texShape[0] / 2), Math.ceil(texShape[1] / 2)];\n if (packedTexShape[0] === 1) {\n if (enableShapeUniforms) {\n return `\n int getOutputCoords() {\n return 2 * int(resultUV.x * ceil(float(outTexShape[1]) / 2.0));\n }\n `;\n }\n return `\n int getOutputCoords() {\n return 2 * int(resultUV.x * ${packedTexShape[1]}.0);\n }\n `;\n }\n if (packedTexShape[1] === 1) {\n if (enableShapeUniforms) {\n return `\n int getOutputCoords() {\n return 2 * int(resultUV.y * ceil(float(outTexShape[0]) / 2.0));\n }\n `;\n }\n return `\n int getOutputCoords() {\n return 2 * int(resultUV.y * ${packedTexShape[0]}.0);\n }\n `;\n }\n if (enableShapeUniforms) {\n return `\n int getOutputCoords() {\n ivec2 packedTexShape = ivec2(ceil(float(outTexShape[0]) / 2.0), ceil(float(outTexShape[1]) / 2.0));\n ivec2 resTexRC = ivec2(resultUV.yx *\n vec2(packedTexShape[0], packedTexShape[1]));\n return 2 * (resTexRC.x * packedTexShape[1] + resTexRC.y);\n }\n `;\n }\n return `\n int getOutputCoords() {\n ivec2 resTexRC = ivec2(resultUV.yx *\n vec2(${packedTexShape[0]}, ${packedTexShape[1]}));\n return 2 * (resTexRC.x * ${packedTexShape[1]} + resTexRC.y);\n }\n `;\n}\nfunction getOutput1DCoords(shape, texShape, enableShapeUniforms) {\n if (texShape[0] === 1) {\n if (enableShapeUniforms) {\n return `\n int getOutputCoords() {\n return int(resultUV.x * float(outTexShape[1]));\n }\n `;\n }\n return `\n int getOutputCoords() {\n return int(resultUV.x * ${texShape[1]}.0);\n }\n `;\n }\n if (texShape[1] === 1) {\n if (enableShapeUniforms) {\n return `\n int getOutputCoords() {\n return int(resultUV.y * float(outTexShape[0]));\n }\n `;\n }\n return `\n int getOutputCoords() {\n return int(resultUV.y * ${texShape[0]}.0);\n }\n `;\n }\n if (enableShapeUniforms) {\n return `\n int getOutputCoords() {\n ivec2 resTexRC = ivec2(resultUV.yx *\n vec2(outTexShape[0], outTexShape[1]));\n return resTexRC.x * outTexShape[1] + resTexRC.y;\n }\n `;\n }\n return `\n int getOutputCoords() {\n ivec2 resTexRC = ivec2(resultUV.yx *\n vec2(${texShape[0]}, ${texShape[1]}));\n return resTexRC.x * ${texShape[1]} + resTexRC.y;\n }\n `;\n}\nfunction getOutputPacked3DCoords(shape, texShape, enableShapeUniforms) {\n if (enableShapeUniforms) {\n return `\n ivec3 getOutputCoords() {\n ivec2 packedTexShape = ivec2(ceil(float(outTexShape[0]) / 2.0), ceil(float(outTexShape[1]) / 2.0));\n int texelsInLogicalRow = int(ceil(float(outShape[2]) / 2.0));\n int texelsInBatch = texelsInLogicalRow * int(ceil(float(outShape[1]) / 2.0));\n ivec2 resTexRC = ivec2(resultUV.yx *\n vec2(packedTexShape[0], packedTexShape[1]));\n int index = resTexRC.x * packedTexShape[1] + resTexRC.y;\n\n int b = index / texelsInBatch;\n index -= b * texelsInBatch;\n\n int r = 2 * (index / texelsInLogicalRow);\n int c = imod(index, texelsInLogicalRow) * 2;\n\n return ivec3(b, r, c);\n }\n `;\n }\n const packedTexShape = [Math.ceil(texShape[0] / 2), Math.ceil(texShape[1] / 2)];\n const texelsInLogicalRow = Math.ceil(shape[2] / 2);\n const texelsInBatch = texelsInLogicalRow * Math.ceil(shape[1] / 2);\n return `\n ivec3 getOutputCoords() {\n ivec2 resTexRC = ivec2(resultUV.yx *\n vec2(${packedTexShape[0]}, ${packedTexShape[1]}));\n int index = resTexRC.x * ${packedTexShape[1]} + resTexRC.y;\n\n int b = index / ${texelsInBatch};\n index -= b * ${texelsInBatch};\n\n int r = 2 * (index / ${texelsInLogicalRow});\n int c = imod(index, ${texelsInLogicalRow}) * 2;\n\n return ivec3(b, r, c);\n }\n `;\n}\nfunction getOutput3DCoords(shape, texShape, enableShapeUniforms) {\n if (enableShapeUniforms) {\n const coordsFromIndexSnippet = shader_util.getOutputLogicalCoordinatesFromFlatIndexByUniform(['r', 'c', 'd'], shape);\n return `\n ivec3 getOutputCoords() {\n ivec2 resTexRC = ivec2(resultUV.yx *\n vec2(outTexShape[0], outTexShape[1]));\n int index = resTexRC.x * outTexShape[1] + resTexRC.y;\n ${coordsFromIndexSnippet}\n return ivec3(r, c, d);\n }\n`;\n }\n const coordsFromIndexSnippet = shader_util.getLogicalCoordinatesFromFlatIndex(['r', 'c', 'd'], shape);\n return `\n ivec3 getOutputCoords() {\n ivec2 resTexRC = ivec2(resultUV.yx *\n vec2(${texShape[0]}, ${texShape[1]}));\n int index = resTexRC.x * ${texShape[1]} + resTexRC.y;\n ${coordsFromIndexSnippet}\n return ivec3(r, c, d);\n }\n `;\n}\nfunction getOutputPackedNDCoords(shape, texShape, enableShapeUniforms) {\n if (enableShapeUniforms) {\n // TODO: support 5d and 6d\n return `\n ivec4 getOutputCoords() {\n ivec2 packedTexShape = ivec2(ceil(float(outTexShape[0]) / 2.0), ceil(float(outTexShape[1]) / 2.0));\n ivec2 resTexRC = ivec2(resultUV.yx *\n vec2(packedTexShape[0], packedTexShape[1]));\n int index = resTexRC.x * packedTexShape[1] + resTexRC.y;\n\n int texelsInLogicalRow = int(ceil(float(outShape[3]) / 2.0));\n int texelsInBatch = texelsInLogicalRow * int(ceil(float(outShape[2]) / 2.0));\n int texelsInBatchN = texelsInBatch * outShape[1];\n\n int b2 = index / texelsInBatchN;\n index -= b2 * texelsInBatchN;\n\n int b = index / texelsInBatch;\n index -= b * texelsInBatch;\n\n int r = 2 * (index / texelsInLogicalRow);\n int c = imod(index, texelsInLogicalRow) * 2;\n\n return ivec4(b2, b, r, c);\n }\n `;\n }\n const packedTexShape = [Math.ceil(texShape[0] / 2), Math.ceil(texShape[1] / 2)];\n const texelsInLogicalRow = Math.ceil(shape[shape.length - 1] / 2);\n const texelsInBatch = texelsInLogicalRow * Math.ceil(shape[shape.length - 2] / 2);\n let texelsInBatchN = texelsInBatch;\n let batches = ``;\n let coords = 'b, r, c';\n for (let b = 2; b < shape.length - 1; b++) {\n texelsInBatchN *= shape[shape.length - b - 1];\n batches = `\n int b${b} = index / ${texelsInBatchN};\n index -= b${b} * ${texelsInBatchN};\n ` + batches;\n coords = `b${b}, ` + coords;\n }\n return `\n ivec${shape.length} getOutputCoords() {\n ivec2 resTexRC = ivec2(resultUV.yx *\n vec2(${packedTexShape[0]}, ${packedTexShape[1]}));\n int index = resTexRC.x * ${packedTexShape[1]} + resTexRC.y;\n\n ${batches}\n\n int b = index / ${texelsInBatch};\n index -= b * ${texelsInBatch};\n\n int r = 2 * (index / ${texelsInLogicalRow});\n int c = imod(index, ${texelsInLogicalRow}) * 2;\n\n return ivec${shape.length}(${coords});\n }\n `;\n}\nfunction getOutput4DCoords(shape, texShape, enableShapeUniforms) {\n if (enableShapeUniforms) {\n const coordsFromIndexSnippet = shader_util.getOutputLogicalCoordinatesFromFlatIndexByUniform(['r', 'c', 'd', 'd2'], shape);\n return `\n ivec4 getOutputCoords() {\n ivec2 resTexRC = ivec2(resultUV.yx *\n vec2(outTexShape[0], outTexShape[1]));\n int index = resTexRC.x * outTexShape[1] + resTexRC.y;\n ${coordsFromIndexSnippet}\n return ivec4(r, c, d, d2);\n }\n `;\n }\n const coordsFromIndexSnippet = shader_util.getLogicalCoordinatesFromFlatIndex(['r', 'c', 'd', 'd2'], shape);\n return `\n ivec4 getOutputCoords() {\n ivec2 resTexRC = ivec2(resultUV.yx *\n vec2(${texShape[0]}, ${texShape[1]}));\n int index = resTexRC.x * ${texShape[1]} + resTexRC.y;\n ${coordsFromIndexSnippet}\n return ivec4(r, c, d, d2);\n }\n `;\n}\nfunction getOutput5DCoords(shape, texShape) {\n const coordsFromIndexSnippet = shader_util.getLogicalCoordinatesFromFlatIndex(['r', 'c', 'd', 'd2', 'd3'], shape);\n return `\n ivec5 getOutputCoords() {\n ivec2 resTexRC = ivec2(resultUV.yx * vec2(${texShape[0]},\n ${texShape[1]}));\n\n int index = resTexRC.x * ${texShape[1]} + resTexRC.y;\n\n ${coordsFromIndexSnippet}\n\n ivec5 outShape = ivec5(r, c, d, d2, d3);\n return outShape;\n }\n `;\n}\nfunction getOutput6DCoords(shape, texShape) {\n const coordsFromIndexSnippet = shader_util.getLogicalCoordinatesFromFlatIndex(['r', 'c', 'd', 'd2', 'd3', 'd4'], shape);\n return `\n ivec6 getOutputCoords() {\n ivec2 resTexRC = ivec2(resultUV.yx *\n vec2(${texShape[0]}, ${texShape[1]}));\n int index = resTexRC.x * ${texShape[1]} + resTexRC.y;\n\n ${coordsFromIndexSnippet}\n\n ivec6 result = ivec6(r, c, d, d2, d3, d4);\n return result;\n }\n `;\n}\nfunction getOutputPacked2DCoords(shape, texShape, enableShapeUniforms) {\n const packedTexShape = [Math.ceil(texShape[0] / 2), Math.ceil(texShape[1] / 2)];\n if (util.arraysEqual(shape, texShape)) {\n if (enableShapeUniforms) {\n return `\n ivec2 getOutputCoords() {\n ivec2 packedTexShape = ivec2(ceil(float(outTexShape[0]) / 2.0), ceil(float(outTexShape[1]) / 2.0));\n return 2 * ivec2(resultUV.yx * vec2(packedTexShape[0], packedTexShape[1]));\n }\n `;\n }\n return `\n ivec2 getOutputCoords() {\n return 2 * ivec2(resultUV.yx * vec2(${packedTexShape[0]}, ${packedTexShape[1]}));\n }\n `;\n }\n // texels needed to accommodate a logical row\n const texelsInLogicalRow = Math.ceil(shape[1] / 2);\n /**\n * getOutputCoords\n *\n * resTexRC: The rows and columns of the texels. If you move over one\n * texel to the right in the packed texture, you are moving over one column\n * (not two).\n *\n * index: The texel index\n */\n if (enableShapeUniforms) {\n return `\n ivec2 getOutputCoords() {\n ivec2 packedTexShape = ivec2(ceil(float(outTexShape[0]) / 2.0), ceil(float(outTexShape[1]) / 2.0));\n int texelsInLogicalRow = int(ceil(float(outShape[1]) / 2.0));\n ivec2 resTexRC = ivec2(resultUV.yx *\n vec2(packedTexShape[0], packedTexShape[1]));\n\n int index = resTexRC.x * packedTexShape[1] + resTexRC.y;\n int r = 2 * (index / texelsInLogicalRow);\n int c = imod(index, texelsInLogicalRow) * 2;\n\n return ivec2(r, c);\n }\n `;\n }\n return `\n ivec2 getOutputCoords() {\n ivec2 resTexRC = ivec2(resultUV.yx *\n vec2(${packedTexShape[0]}, ${packedTexShape[1]}));\n\n int index = resTexRC.x * ${packedTexShape[1]} + resTexRC.y;\n int r = 2 * (index / ${texelsInLogicalRow});\n int c = imod(index, ${texelsInLogicalRow}) * 2;\n\n return ivec2(r, c);\n }\n `;\n}\nfunction getOutput2DCoords(shape, texShape, enableShapeUniforms) {\n if (util.arraysEqual(shape, texShape)) {\n if (enableShapeUniforms) {\n return `\n ivec2 getOutputCoords() {\n return ivec2(resultUV.yx * vec2(outTexShape[0], outTexShape[1]));\n }\n `;\n }\n return `\n ivec2 getOutputCoords() {\n return ivec2(resultUV.yx * vec2(${texShape[0]}, ${texShape[1]}));\n }\n `;\n }\n if (shape[1] === 1) {\n if (enableShapeUniforms) {\n return `\n ivec2 getOutputCoords() {\n ivec2 resTexRC = ivec2(resultUV.yx *\n vec2(outTexShape[0], outTexShape[1]));\n int index = resTexRC.x * outTexShape[1] + resTexRC.y;\n return ivec2(index, 0);\n }\n `;\n }\n return `\n ivec2 getOutputCoords() {\n ivec2 resTexRC = ivec2(resultUV.yx *\n vec2(${texShape[0]}, ${texShape[1]}));\n int index = resTexRC.x * ${texShape[1]} + resTexRC.y;\n return ivec2(index, 0);\n }\n `;\n }\n if (shape[0] === 1) {\n if (enableShapeUniforms) {\n return `\n ivec2 getOutputCoords() {\n ivec2 resTexRC = ivec2(resultUV.yx *\n vec2(outTexShape[0], outTexShape[1]));\n int index = resTexRC.x * outTexShape[1] + resTexRC.y;\n return ivec2(0, index);\n }\n `;\n }\n return `\n ivec2 getOutputCoords() {\n ivec2 resTexRC = ivec2(resultUV.yx *\n vec2(${texShape[0]}, ${texShape[1]}));\n int index = resTexRC.x * ${texShape[1]} + resTexRC.y;\n return ivec2(0, index);\n }\n `;\n }\n if (enableShapeUniforms) {\n return `\n ivec2 getOutputCoords() {\n ivec2 resTexRC = ivec2(resultUV.yx *\n vec2(outTexShape[0], outTexShape[1]));\n int index = resTexRC.x * outTexShape[1] + resTexRC.y;\n int r = index / outShape[1];\n int c = index - r * outShape[1];\n return ivec2(r, c);\n }\n `;\n }\n return `\n ivec2 getOutputCoords() {\n ivec2 resTexRC = ivec2(resultUV.yx *\n vec2(${texShape[0]}, ${texShape[1]}));\n int index = resTexRC.x * ${texShape[1]} + resTexRC.y;\n int r = index / ${shape[1]};\n int c = index - r * ${shape[1]};\n return ivec2(r, c);\n }\n `;\n}\nfunction getFlatOffsetUniformName(texName) {\n return `offset${texName}`;\n}\nfunction getPackedSamplerScalar(inputInfo) {\n const texName = inputInfo.name;\n const funcName = 'get' + texName.charAt(0).toUpperCase() + texName.slice(1);\n const glsl = getGlslDifferences();\n return `\n vec4 ${funcName}() {\n return ${glsl.texture2D}(${texName}, halfCR);\n }\n `;\n}\nfunction getSamplerScalar(inputInfo, enableShapeUniforms) {\n const texName = inputInfo.name;\n const funcName = 'get' + texName.charAt(0).toUpperCase() + texName.slice(1);\n if (inputInfo.shapeInfo.isUniform) {\n return `float ${funcName}() {return ${texName};}`;\n }\n const [texNumR, texNumC] = inputInfo.shapeInfo.texShape;\n if (texNumR === 1 && texNumC === 1) {\n return `\n float ${funcName}() {\n return sampleTexture(${texName}, halfCR);\n }\n `;\n }\n const offset = getFlatOffsetUniformName(texName);\n if (enableShapeUniforms) {\n return `\n float ${funcName}() {\n vec2 uv = uvFromFlat(${texName}TexShape[0], ${texName}TexShape[1], ${offset});\n return sampleTexture(${texName}, uv);\n }\n `;\n }\n const [tNumR, tNumC] = inputInfo.shapeInfo.texShape;\n return `\n float ${funcName}() {\n vec2 uv = uvFromFlat(${tNumR}, ${tNumC}, ${offset});\n return sampleTexture(${texName}, uv);\n }\n `;\n}\nfunction getPackedSampler1D(inputInfo, enableShapeUniforms) {\n const texName = inputInfo.name;\n const funcName = 'get' + texName.charAt(0).toUpperCase() + texName.slice(1);\n const texShape = inputInfo.shapeInfo.texShape;\n const glsl = getGlslDifferences();\n if (enableShapeUniforms) {\n return `\n vec4 ${funcName}(int index) {\n ivec2 packedTexShape = ivec2(ceil(float(${texName}TexShape[0]) / 2.0), ceil(float(${texName}TexShape[1]) / 2.0));\n vec2 uv = packedUVfrom1D(\n packedTexShape[0], packedTexShape[1], index);\n return ${glsl.texture2D}(${texName}, uv);\n }\n `;\n }\n const packedTexShape = [Math.ceil(texShape[0] / 2), Math.ceil(texShape[1] / 2)];\n return `\n vec4 ${funcName}(int index) {\n vec2 uv = packedUVfrom1D(\n ${packedTexShape[0]}, ${packedTexShape[1]}, index);\n return ${glsl.texture2D}(${texName}, uv);\n }\n `;\n}\nfunction getSampler1D(inputInfo, enableShapeUniforms) {\n const texName = inputInfo.name;\n const funcName = 'get' + texName.charAt(0).toUpperCase() + texName.slice(1);\n if (inputInfo.shapeInfo.isUniform) {\n // Uniform arrays will be less than 65505 (no risk of float16 overflow).\n return `\n float ${funcName}(int index) {\n ${getUniformSampler(inputInfo)}\n }\n `;\n }\n const texShape = inputInfo.shapeInfo.texShape;\n const tNumR = texShape[0];\n const tNumC = texShape[1];\n if (tNumC === 1 && tNumR === 1) {\n return `\n float ${funcName}(int index) {\n return sampleTexture(${texName}, halfCR);\n }\n `;\n }\n const offset = getFlatOffsetUniformName(texName);\n if (tNumC === 1) {\n if (enableShapeUniforms) {\n return `\n float ${funcName}(int index) {\n vec2 uv = vec2(0.5, (float(index + ${offset}) + 0.5) / float(${texName}TexShape[0]));\n return sampleTexture(${texName}, uv);\n }\n `;\n }\n return `\n float ${funcName}(int index) {\n vec2 uv = vec2(0.5, (float(index + ${offset}) + 0.5) / ${tNumR}.0);\n return sampleTexture(${texName}, uv);\n }\n `;\n }\n if (tNumR === 1) {\n if (enableShapeUniforms) {\n return `\n float ${funcName}(int index) {\n vec2 uv = vec2((float(index + ${offset}) + 0.5) / float(${texName}TexShape[1]), 0.5);\n return sampleTexture(${texName}, uv);\n }\n `;\n }\n return `\n float ${funcName}(int index) {\n vec2 uv = vec2((float(index + ${offset}) + 0.5) / ${tNumC}.0, 0.5);\n return sampleTexture(${texName}, uv);\n }\n `;\n }\n if (enableShapeUniforms) {\n return `\n float ${funcName}(int index) {\n vec2 uv = uvFromFlat(${texName}TexShape[0], ${texName}TexShape[1], index + ${offset});\n return sampleTexture(${texName}, uv);\n }\n `;\n }\n return `\n float ${funcName}(int index) {\n vec2 uv = uvFromFlat(${tNumR}, ${tNumC}, index + ${offset});\n return sampleTexture(${texName}, uv);\n }\n `;\n}\nfunction getPackedSampler2D(inputInfo, enableShapeUniforms) {\n const shape = inputInfo.shapeInfo.logicalShape;\n const texName = inputInfo.name;\n const funcName = 'get' + texName.charAt(0).toUpperCase() + texName.slice(1);\n const texShape = inputInfo.shapeInfo.texShape;\n const texNumR = texShape[0];\n const texNumC = texShape[1];\n const glsl = getGlslDifferences();\n if (texShape != null && util.arraysEqual(shape, texShape)) {\n if (enableShapeUniforms) {\n return `\n vec4 ${funcName}(int row, int col) {\n vec2 uv = (vec2(col, row) + halfCR) / vec2(${texName}TexShape[1], ${texName}TexShape[0]);\n\n return ${glsl.texture2D}(${texName}, uv);\n }\n `;\n }\n return `\n vec4 ${funcName}(int row, int col) {\n vec2 uv = (vec2(col, row) + halfCR) / vec2(${texNumC}.0, ${texNumR}.0);\n\n return ${glsl.texture2D}(${texName}, uv);\n }\n `;\n }\n if (enableShapeUniforms) {\n return `\n vec4 ${funcName}(int row, int col) {\n ivec2 packedTexShape = ivec2(ceil(float(${texName}TexShape[0]) / 2.0), ceil(float(${texName}TexShape[1]) / 2.0));\n int valuesPerRow = int(ceil(float(${texName}Shape[1]) / 2.0));\n vec2 uv = packedUVfrom2D(valuesPerRow, packedTexShape[0], packedTexShape[1], row, col);\n return ${glsl.texture2D}(${texName}, uv);\n }\n `;\n }\n const packedTexShape = [Math.ceil(texShape[0] / 2), Math.ceil(texShape[1] / 2)];\n const valuesPerRow = Math.ceil(shape[1] / 2);\n return `\n vec4 ${funcName}(int row, int col) {\n vec2 uv = packedUVfrom2D(${valuesPerRow}, ${packedTexShape[0]}, ${packedTexShape[1]}, row, col);\n return ${glsl.texture2D}(${texName}, uv);\n }\n `;\n}\nfunction getSampler2D(inputInfo, enableShapeUniforms) {\n const shape = inputInfo.shapeInfo.logicalShape;\n const texName = inputInfo.name;\n const funcName = 'get' + texName.charAt(0).toUpperCase() + texName.slice(1);\n const texShape = inputInfo.shapeInfo.texShape;\n if (texShape != null && util.arraysEqual(shape, texShape)) {\n if (enableShapeUniforms) {\n return `\n float ${funcName}(int row, int col) {\n vec2 uv = (vec2(col, row) + halfCR) / vec2(${texName}TexShape[1], ${texName}TexShape[0]);\n return sampleTexture(${texName}, uv);\n }\n `;\n }\n const texNumR = texShape[0];\n const texNumC = texShape[1];\n return `\n float ${funcName}(int row, int col) {\n vec2 uv = (vec2(col, row) + halfCR) / vec2(${texNumC}.0, ${texNumR}.0);\n return sampleTexture(${texName}, uv);\n }\n `;\n }\n const { newShape, keptDims } = util.squeezeShape(shape);\n const squeezedShape = newShape;\n if (squeezedShape.length < shape.length) {\n const newInputInfo = squeezeInputInfo(inputInfo, squeezedShape);\n const params = ['row', 'col'];\n return `\n ${getSamplerFromInInfo(newInputInfo, enableShapeUniforms)}\n float ${funcName}(int row, int col) {\n return ${funcName}(${getSqueezedParams(params, keptDims)});\n }\n `;\n }\n if (inputInfo.shapeInfo.isUniform) {\n // Uniform arrays will be less than 65505 (no risk of float16 overflow).\n return `\n float ${funcName}(int row, int col) {\n int index = round(dot(vec2(row, col), vec2(${shape[1]}, 1)));\n ${getUniformSampler(inputInfo)}\n }\n `;\n }\n const texNumR = texShape[0];\n const texNumC = texShape[1];\n const offset = getFlatOffsetUniformName(texName);\n if (texNumC === 1) {\n // index is used directly as physical (no risk of float16 overflow).\n if (enableShapeUniforms) {\n return `\n float ${funcName}(int row, int col) {\n float index = dot(vec3(row, col, ${offset}), vec3(${texName}Shape[1], 1, 1));\n vec2 uv = vec2(0.5, (index + 0.5) / float(${texName}TexShape[0]));\n return sampleTexture(${texName}, uv);\n }\n `;\n }\n return `\n float ${funcName}(int row, int col) {\n float index = dot(vec3(row, col, ${offset}), vec3(${shape[1]}, 1, 1));\n vec2 uv = vec2(0.5, (index + 0.5) / ${texNumR}.0);\n return sampleTexture(${texName}, uv);\n }\n `;\n }\n if (texNumR === 1) {\n // index is used directly as physical (no risk of float16 overflow).\n if (enableShapeUniforms) {\n return `\n float ${funcName}(int row, int col) {\n float index = dot(vec3(row, col, ${offset}), vec3(${texName}Shape[1], 1, 1));\n vec2 uv = vec2((index + 0.5) / float(${texName}TexShape[1]), 0.5);\n return sampleTexture(${texName}, uv);\n }\n `;\n }\n return `\n float ${funcName}(int row, int col) {\n float index = dot(vec3(row, col, ${offset}), vec3(${shape[1]}, 1, 1));\n vec2 uv = vec2((index + 0.5) / ${texNumC}.0, 0.5);\n return sampleTexture(${texName}, uv);\n }\n `;\n }\n if (enableShapeUniforms) {\n return `\n float ${funcName}(int row, int col) {\n // Explicitly use integer operations as dot() only works on floats.\n int index = row * ${texName}Shape[1] + col + ${offset};\n vec2 uv = uvFromFlat(${texName}TexShape[0], ${texName}TexShape[1], index);\n return sampleTexture(${texName}, uv);\n }\n `;\n }\n return `\n float ${funcName}(int row, int col) {\n // Explicitly use integer operations as dot() only works on floats.\n int index = row * ${shape[1]} + col + ${offset};\n vec2 uv = uvFromFlat(${texNumR}, ${texNumC}, index);\n return sampleTexture(${texName}, uv);\n }\n`;\n}\nfunction getPackedSampler3D(inputInfo, enableShapeUniforms) {\n const shape = inputInfo.shapeInfo.logicalShape;\n const texName = inputInfo.name;\n const funcName = 'get' + texName.charAt(0).toUpperCase() + texName.slice(1);\n const texShape = inputInfo.shapeInfo.texShape;\n const packedTexShape = [Math.ceil(texShape[0] / 2), Math.ceil(texShape[1] / 2)];\n if (shape[0] === 1) {\n const squeezedShape = shape.slice(1);\n const keptDims = [1, 2];\n const newInputInfo = squeezeInputInfo(inputInfo, squeezedShape);\n const params = ['b', 'row', 'col'];\n return `\n ${getPackedSamplerFromInInfo(newInputInfo, enableShapeUniforms)}\n vec4 ${funcName}(int b, int row, int col) {\n return ${funcName}(${getSqueezedParams(params, keptDims)});\n }\n `;\n }\n const glsl = getGlslDifferences();\n if (enableShapeUniforms) {\n return `\n vec4 ${funcName}(int b, int row, int col) {\n ivec2 packedTexShape = ivec2(ceil(float(${texName}TexShape[0]) / 2.0), ceil(float(${texName}TexShape[1]) / 2.0));\n int valuesPerRow = int(ceil(float(${texName}Shape[2]) / 2.0));\n int texelsInBatch = valuesPerRow * int(ceil(float(${texName}Shape[1]) / 2.0));\n vec2 uv = packedUVfrom3D(\n packedTexShape[0], packedTexShape[1], texelsInBatch, valuesPerRow, b, row, col);\n return ${glsl.texture2D}(${texName}, uv);\n }\n `;\n }\n const texNumR = packedTexShape[0];\n const texNumC = packedTexShape[1];\n const valuesPerRow = Math.ceil(shape[2] / 2);\n const texelsInBatch = valuesPerRow * Math.ceil(shape[1] / 2);\n return `\n vec4 ${funcName}(int b, int row, int col) {\n vec2 uv = packedUVfrom3D(\n ${texNumR}, ${texNumC}, ${texelsInBatch}, ${valuesPerRow}, b, row, col);\n return ${glsl.texture2D}(${texName}, uv);\n }\n `;\n}\nfunction getSampler3D(inputInfo, enableShapeUniforms) {\n const shape = inputInfo.shapeInfo.logicalShape;\n const texName = inputInfo.name;\n const funcName = 'get' + texName.charAt(0).toUpperCase() + texName.slice(1);\n const stride0 = shape[1] * shape[2];\n const stride1 = shape[2];\n const { newShape, keptDims } = util.squeezeShape(shape);\n const squeezedShape = newShape;\n if (squeezedShape.length < shape.length) {\n const newInputInfo = squeezeInputInfo(inputInfo, squeezedShape);\n const params = ['row', 'col', 'depth'];\n return `\n ${getSamplerFromInInfo(newInputInfo, enableShapeUniforms)}\n float ${funcName}(int row, int col, int depth) {\n return ${funcName}(${getSqueezedParams(params, keptDims)});\n }\n `;\n }\n if (inputInfo.shapeInfo.isUniform) {\n // Uniform arrays will be less than 65505 (no risk of float16 overflow).\n return `\n float ${funcName}(int row, int col, int depth) {\n int index = round(dot(vec3(row, col, depth),\n vec3(${stride0}, ${stride1}, 1)));\n ${getUniformSampler(inputInfo)}\n }\n `;\n }\n const texShape = inputInfo.shapeInfo.texShape;\n const texNumR = texShape[0];\n const texNumC = texShape[1];\n const flatOffset = inputInfo.shapeInfo.flatOffset;\n if (texNumC === stride0 && flatOffset == null) {\n // texC is used directly as physical (no risk of float16 overflow).\n if (enableShapeUniforms) {\n return `\n float ${funcName}(int row, int col, int depth) {\n int stride1 = ${texName}Shape[2];\n float texR = float(row);\n float texC = dot(vec2(col, depth), vec2(stride1, 1));\n vec2 uv = (vec2(texC, texR) + halfCR) /\n vec2(${texName}TexShape[1], ${texName}TexShape[0]);\n return sampleTexture(${texName}, uv);\n }\n `;\n }\n return `\n float ${funcName}(int row, int col, int depth) {\n float texR = float(row);\n float texC = dot(vec2(col, depth), vec2(${stride1}, 1));\n vec2 uv = (vec2(texC, texR) + halfCR) /\n vec2(${texNumC}.0, ${texNumR}.0);\n return sampleTexture(${texName}, uv);\n }\n `;\n }\n if (texNumC === stride1 && flatOffset == null) {\n // texR is used directly as physical (no risk of float16 overflow).\n if (enableShapeUniforms) {\n return `\n float ${funcName}(int row, int col, int depth) {\n float texR = dot(vec2(row, col), vec2(${texName}Shape[1], 1));\n float texC = float(depth);\n vec2 uv = (vec2(texC, texR) + halfCR) / vec2(${texName}TexShape[1], ${texName}TexShape[0]);\n return sampleTexture(${texName}, uv);\n }\n `;\n }\n return `\n float ${funcName}(int row, int col, int depth) {\n float texR = dot(vec2(row, col), vec2(${shape[1]}, 1));\n float texC = float(depth);\n vec2 uv = (vec2(texC, texR) + halfCR) / vec2(${texNumC}.0, ${texNumR}.0);\n return sampleTexture(${texName}, uv);\n }\n `;\n }\n const offset = getFlatOffsetUniformName(texName);\n if (enableShapeUniforms) {\n return `\n float ${funcName}(int row, int col, int depth) {\n // Explicitly use integer operations as dot() only works on floats.\n int stride0 = ${texName}Shape[1] * ${texName}Shape[2];\n int stride1 = ${texName}Shape[2];\n int index = row * stride0 + col * stride1 + depth + ${offset};\n vec2 uv = uvFromFlat(${texName}TexShape[0], ${texName}TexShape[1], index);\n return sampleTexture(${texName}, uv);\n }\n `;\n }\n return `\n float ${funcName}(int row, int col, int depth) {\n // Explicitly use integer operations as dot() only works on floats.\n int index = row * ${stride0} + col * ${stride1} + depth + ${offset};\n vec2 uv = uvFromFlat(${texNumR}, ${texNumC}, index);\n return sampleTexture(${texName}, uv);\n }\n `;\n}\nfunction getPackedSamplerND(inputInfo, enableShapeUniforms) {\n const texName = inputInfo.name;\n const funcName = 'get' + texName.charAt(0).toUpperCase() + texName.slice(1);\n const glsl = getGlslDifferences();\n if (enableShapeUniforms) {\n // TODO: support 5d and 6d\n return `\n vec4 ${funcName}(int b2, int b, int row, int col) {\n int valuesPerRow = int(ceil(float(${texName}Shape[3]) / 2.0));\n int texelsInBatch = valuesPerRow * int(ceil(float(${texName}Shape[2]) / 2.0));\n int index = b * texelsInBatch + (row / 2) * valuesPerRow + (col / 2);\n texelsInBatch *= ${texName}Shape[1];\n index = b2 * texelsInBatch + index;\n ivec2 packedTexShape = ivec2(ceil(float(${texName}TexShape[0]) / 2.0), ceil(float(${texName}TexShape[1]) / 2.0));\n int texR = index / packedTexShape[1];\n int texC = index - texR * packedTexShape[1];\n vec2 uv = (vec2(texC, texR) + halfCR) / vec2(packedTexShape[1], packedTexShape[0]); return ${glsl.texture2D}(${texName}, uv);\n }\n `;\n }\n const shape = inputInfo.shapeInfo.logicalShape;\n const rank = shape.length;\n const texShape = inputInfo.shapeInfo.texShape;\n const packedTexShape = [Math.ceil(texShape[0] / 2), Math.ceil(texShape[1] / 2)];\n const texNumR = packedTexShape[0];\n const texNumC = packedTexShape[1];\n const valuesPerRow = Math.ceil(shape[rank - 1] / 2);\n let texelsInBatch = valuesPerRow * Math.ceil(shape[rank - 2] / 2);\n let params = `int b, int row, int col`;\n let index = `b * ${texelsInBatch} + (row / 2) * ${valuesPerRow} + (col / 2)`;\n for (let b = 2; b < rank - 1; b++) {\n params = `int b${b}, ` + params;\n texelsInBatch *= shape[rank - b - 1];\n index = `b${b} * ${texelsInBatch} + ` + index;\n }\n return `\n vec4 ${funcName}(${params}) {\n int index = ${index};\n int texR = index / ${texNumC};\n int texC = index - texR * ${texNumC};\n vec2 uv = (vec2(texC, texR) + halfCR) / vec2(${texNumC}, ${texNumR});\n return ${glsl.texture2D}(${texName}, uv);\n }\n `;\n}\nfunction getSampler4D(inputInfo, enableShapeUniforms) {\n const shape = inputInfo.shapeInfo.logicalShape;\n const texName = inputInfo.name;\n const funcName = 'get' + texName.charAt(0).toUpperCase() + texName.slice(1);\n const stride2 = shape[3];\n const stride1 = shape[2] * stride2;\n const stride0 = shape[1] * stride1;\n const { newShape, keptDims } = util.squeezeShape(shape);\n if (newShape.length < shape.length) {\n const newInputInfo = squeezeInputInfo(inputInfo, newShape);\n const params = ['row', 'col', 'depth', 'depth2'];\n return `\n ${getSamplerFromInInfo(newInputInfo, enableShapeUniforms)}\n float ${funcName}(int row, int col, int depth, int depth2) {\n return ${funcName}(${getSqueezedParams(params, keptDims)});\n }\n `;\n }\n if (inputInfo.shapeInfo.isUniform) {\n // Uniform arrays will be less than 65505 (no risk of float16 overflow).\n return `\n float ${funcName}(int row, int col, int depth, int depth2) {\n int index = round(dot(vec4(row, col, depth, depth2),\n vec4(${stride0}, ${stride1}, ${stride2}, 1)));\n ${getUniformSampler(inputInfo)}\n }\n `;\n }\n const flatOffset = inputInfo.shapeInfo.flatOffset;\n const texShape = inputInfo.shapeInfo.texShape;\n const texNumR = texShape[0];\n const texNumC = texShape[1];\n const stride2Str = `int stride2 = ${texName}Shape[3];`;\n const stride1Str = `int stride1 = ${texName}Shape[2] * stride2;`;\n const stride0Str = `int stride0 = ${texName}Shape[1] * stride1;`;\n if (texNumC === stride0 && flatOffset == null) {\n // texC is used directly as physical (no risk of float16 overflow).\n if (enableShapeUniforms) {\n return `\n float ${funcName}(int row, int col, int depth, int depth2) {\n ${stride2Str}\n ${stride1Str}\n float texR = float(row);\n float texC =\n dot(vec3(col, depth, depth2),\n vec3(stride1, stride2, 1));\n vec2 uv = (vec2(texC, texR) + halfCR) /\n vec2(${texName}TexShape[1], ${texName}TexShape[0]);\n return sampleTexture(${texName}, uv);\n }\n `;\n }\n return `\n float ${funcName}(int row, int col, int depth, int depth2) {\n float texR = float(row);\n float texC =\n dot(vec3(col, depth, depth2),\n vec3(${stride1}, ${stride2}, 1));\n vec2 uv = (vec2(texC, texR) + halfCR) /\n vec2(${texNumC}.0, ${texNumR}.0);\n return sampleTexture(${texName}, uv);\n }\n `;\n }\n if (texNumC === stride2 && flatOffset == null) {\n // texR is used directly as physical (no risk of float16 overflow).\n if (enableShapeUniforms) {\n return `\n float ${funcName}(int row, int col, int depth, int depth2) {\n float texR = dot(vec3(row, col, depth),\n vec3(${texName}Shape[1] * ${texName}Shape[2], ${texName}Shape[2], 1));\n float texC = float(depth2);\n vec2 uv = (vec2(texC, texR) + halfCR) /\n vec2(${texName}TexShape[1], ${texName}TexShape[0]);\n return sampleTexture(${texName}, uv);\n }\n `;\n }\n return `\n float ${funcName}(int row, int col, int depth, int depth2) {\n float texR = dot(vec3(row, col, depth),\n vec3(${shape[1] * shape[2]}, ${shape[2]}, 1));\n float texC = float(depth2);\n vec2 uv = (vec2(texC, texR) + halfCR) /\n vec2(${texNumC}.0, ${texNumR}.0);\n return sampleTexture(${texName}, uv);\n }\n `;\n }\n const offset = getFlatOffsetUniformName(texName);\n if (enableShapeUniforms) {\n return `\n float ${funcName}(int row, int col, int depth, int depth2) {\n // Explicitly use integer operations as dot() only works on floats.\n ${stride2Str}\n ${stride1Str}\n ${stride0Str}\n int index = row * stride0 + col * stride1 +\n depth * stride2 + depth2;\n vec2 uv = uvFromFlat(${texName}TexShape[0], ${texName}TexShape[1], index + ${offset});\n return sampleTexture(${texName}, uv);\n }\n `;\n }\n return `\n float ${funcName}(int row, int col, int depth, int depth2) {\n // Explicitly use integer operations as dot() only works on floats.\n int index = row * ${stride0} + col * ${stride1} +\n depth * ${stride2} + depth2;\n vec2 uv = uvFromFlat(${texNumR}, ${texNumC}, index + ${offset});\n return sampleTexture(${texName}, uv);\n }\n `;\n}\nfunction getSampler5D(inputInfo) {\n const shape = inputInfo.shapeInfo.logicalShape;\n const texName = inputInfo.name;\n const funcName = 'get' + texName.charAt(0).toUpperCase() + texName.slice(1);\n const stride3 = shape[4];\n const stride2 = shape[3] * stride3;\n const stride1 = shape[2] * stride2;\n const stride0 = shape[1] * stride1;\n const { newShape, keptDims } = util.squeezeShape(shape);\n if (newShape.length < shape.length) {\n const newInputInfo = squeezeInputInfo(inputInfo, newShape);\n const params = ['row', 'col', 'depth', 'depth2', 'depth3'];\n return `\n ${getSamplerFromInInfo(newInputInfo)}\n float ${funcName}(int row, int col, int depth, int depth2, int depth3) {\n return ${funcName}(${getSqueezedParams(params, keptDims)});\n }\n `;\n }\n if (inputInfo.shapeInfo.isUniform) {\n // Uniform arrays will be less than 65505 (no risk of float16 overflow).\n return `\n float ${funcName}(int row, int col, int depth, int depth2, int depth3) {\n float index = dot(\n vec4(row, col, depth, depth2),\n vec4(${stride0}, ${stride1}, ${stride2}, ${stride3})) +\n depth3;\n ${getUniformSampler(inputInfo)}\n }\n `;\n }\n const flatOffset = inputInfo.shapeInfo.flatOffset;\n const texShape = inputInfo.shapeInfo.texShape;\n const texNumR = texShape[0];\n const texNumC = texShape[1];\n if (texNumC === stride0 && flatOffset == null) {\n // texC is used directly as physical (no risk of float16 overflow).\n return `\n float ${funcName}(int row, int col, int depth, int depth2, int depth3) {\n int texR = row;\n float texC = dot(vec4(col, depth, depth2, depth3),\n vec4(${stride1}, ${stride2}, ${stride3}, 1));\n vec2 uv = (vec2(texC, texR) + halfCR) /\n vec2(${texNumC}.0, ${texNumR}.0);\n return sampleTexture(${texName}, uv);\n }\n `;\n }\n if (texNumC === stride3 && flatOffset == null) {\n // texR is used directly as physical (no risk of float16 overflow).\n return `\n float ${funcName}(int row, int col, int depth, int depth2, int depth3) {\n float texR = dot(\n vec4(row, col, depth, depth2),\n vec4(${shape[1] * shape[2] * shape[3]},\n ${shape[2] * shape[3]}, ${shape[3]}, 1));\n int texC = depth3;\n vec2 uv = (vec2(texC, texR) + halfCR) /\n vec2(${texNumC}.0, ${texNumR}.0);\n return sampleTexture(${texName}, uv);\n }\n `;\n }\n const offset = getFlatOffsetUniformName(texName);\n return `\n float ${funcName}(int row, int col, int depth, int depth2, int depth3) {\n // Explicitly use integer operations as dot() only works on floats.\n int index = row * ${stride0} + col * ${stride1} + depth * ${stride2} +\n depth2 * ${stride3} + depth3 + ${offset};\n vec2 uv = uvFromFlat(${texNumR}, ${texNumC}, index);\n return sampleTexture(${texName}, uv);\n }\n `;\n}\nfunction getSampler6D(inputInfo) {\n const shape = inputInfo.shapeInfo.logicalShape;\n const texName = inputInfo.name;\n const funcName = 'get' + texName.charAt(0).toUpperCase() + texName.slice(1);\n const { newShape, keptDims } = util.squeezeShape(shape);\n if (newShape.length < shape.length) {\n const newInputInfo = squeezeInputInfo(inputInfo, newShape);\n const params = ['row', 'col', 'depth', 'depth2', 'depth3', 'depth4'];\n return `\n ${getSamplerFromInInfo(newInputInfo)}\n float ${funcName}(int row, int col, int depth,\n int depth2, int depth3, int depth4) {\n return ${funcName}(${getSqueezedParams(params, keptDims)});\n }\n `;\n }\n const stride4 = shape[5];\n const stride3 = shape[4] * stride4;\n const stride2 = shape[3] * stride3;\n const stride1 = shape[2] * stride2;\n const stride0 = shape[1] * stride1;\n if (inputInfo.shapeInfo.isUniform) {\n // Uniform arrays will be less than 65505 (no risk of float16 overflow).\n return `\n float ${funcName}(int row, int col, int depth,\n int depth2, int depth3, int depth4) {\n int index = round(dot(\n vec4(row, col, depth, depth2),\n vec4(${stride0}, ${stride1}, ${stride2}, ${stride3})) +\n dot(\n vec2(depth3, depth4),\n vec2(${stride4}, 1)));\n ${getUniformSampler(inputInfo)}\n }\n `;\n }\n const flatOffset = inputInfo.shapeInfo.flatOffset;\n const texShape = inputInfo.shapeInfo.texShape;\n const texNumR = texShape[0];\n const texNumC = texShape[1];\n if (texNumC === stride0 && flatOffset == null) {\n // texC is used directly as physical (no risk of float16 overflow).\n return `\n float ${funcName}(int row, int col, int depth,\n int depth2, int depth3, int depth4) {\n int texR = row;\n float texC = dot(vec4(col, depth, depth2, depth3),\n vec4(${stride1}, ${stride2}, ${stride3}, ${stride4})) +\n float(depth4);\n vec2 uv = (vec2(texC, texR) + halfCR) /\n vec2(${texNumC}.0, ${texNumR}.0);\n return sampleTexture(${texName}, uv);\n }\n `;\n }\n if (texNumC === stride4 && flatOffset == null) {\n // texR is used directly as physical (no risk of float16 overflow).\n return `\n float ${funcName}(int row, int col, int depth,\n int depth2, int depth3, int depth4) {\n float texR = dot(vec4(row, col, depth, depth2),\n vec4(${shape[1] * shape[2] * shape[3] * shape[4]},\n ${shape[2] * shape[3] * shape[4]},\n ${shape[3] * shape[4]},\n ${shape[4]})) + float(depth3);\n int texC = depth4;\n vec2 uv = (vec2(texC, texR) + halfCR) /\n vec2(${texNumC}.0, ${texNumR}.0);\n return sampleTexture(${texName}, uv);\n }\n `;\n }\n const offset = getFlatOffsetUniformName(texName);\n return `\n float ${funcName}(int row, int col, int depth,\n int depth2, int depth3, int depth4) {\n // Explicitly use integer operations as dot() only works on floats.\n int index = row * ${stride0} + col * ${stride1} + depth * ${stride2} +\n depth2 * ${stride3} + depth3 * ${stride4} + depth4 + ${offset};\n vec2 uv = uvFromFlat(${texNumR}, ${texNumC}, index);\n return sampleTexture(${texName}, uv);\n }\n `;\n}\nfunction getUniformSampler(inputInfo) {\n const texName = inputInfo.name;\n const inSize = util.sizeFromShape(inputInfo.shapeInfo.logicalShape);\n if (inSize < 2) {\n return `return ${texName};`;\n }\n return `\n for (int i = 0; i < ${inSize}; i++) {\n if (i == index) {\n return ${texName}[i];\n }\n }\n `;\n}\nfunction getPackedSamplerAtOutputCoords(inputInfo, outShapeInfo) {\n const texName = inputInfo.name;\n const texFuncSnippet = texName.charAt(0).toUpperCase() + texName.slice(1);\n const funcName = 'get' + texFuncSnippet + 'AtOutCoords';\n const inRank = inputInfo.shapeInfo.logicalShape.length;\n const outRank = outShapeInfo.logicalShape.length;\n const broadcastDims = getBroadcastDims(inputInfo.shapeInfo.logicalShape, outShapeInfo.logicalShape);\n const type = getCoordsDataType(outRank);\n const rankDiff = outRank - inRank;\n let coordsSnippet;\n const fields = ['x', 'y', 'z', 'w', 'u', 'v'];\n if (inRank === 0) {\n coordsSnippet = '';\n }\n else if (outRank < 2 && broadcastDims.length >= 1) {\n coordsSnippet = 'coords = 0;';\n }\n else {\n coordsSnippet =\n broadcastDims.map(d => `coords.${fields[d + rankDiff]} = 0;`)\n .join('\\n');\n }\n let unpackedCoordsSnippet = '';\n if (outRank < 2 && inRank > 0) {\n unpackedCoordsSnippet = 'coords';\n }\n else {\n unpackedCoordsSnippet = inputInfo.shapeInfo.logicalShape\n .map((s, i) => `coords.${fields[i + rankDiff]}`)\n .join(', ');\n }\n let output = `return outputValue;`;\n const inSize = util.sizeFromShape(inputInfo.shapeInfo.logicalShape);\n const isInputScalar = inSize === 1;\n const outSize = util.sizeFromShape(outShapeInfo.logicalShape);\n const isOutputScalar = outSize === 1;\n if (inRank === 1 && !isInputScalar && !isOutputScalar) {\n output = `\n return vec4(outputValue.xy, outputValue.xy);\n `;\n }\n else if (isInputScalar && !isOutputScalar) {\n if (outRank === 1) {\n output = `\n return vec4(outputValue.x, outputValue.x, 0., 0.);\n `;\n }\n else {\n output = `\n return vec4(outputValue.x);\n `;\n }\n }\n else if (broadcastDims.length) {\n const rows = inRank - 2;\n const cols = inRank - 1;\n if (broadcastDims.indexOf(rows) > -1 && broadcastDims.indexOf(cols) > -1) {\n output = `return vec4(outputValue.x);`;\n }\n else if (broadcastDims.indexOf(rows) > -1) {\n output = `return vec4(outputValue.x, outputValue.y, ` +\n `outputValue.x, outputValue.y);`;\n }\n else if (broadcastDims.indexOf(cols) > -1) {\n output = `return vec4(outputValue.xx, outputValue.zz);`;\n }\n }\n return `\n vec4 ${funcName}() {\n ${type} coords = getOutputCoords();\n ${coordsSnippet}\n vec4 outputValue = get${texFuncSnippet}(${unpackedCoordsSnippet});\n ${output}\n }\n `;\n}\nfunction getSamplerAtOutputCoords(inputInfo, outShapeInfo) {\n const texName = inputInfo.name;\n const texFuncSnippet = texName.charAt(0).toUpperCase() + texName.slice(1);\n const funcName = 'get' + texFuncSnippet + 'AtOutCoords';\n const outTexShape = outShapeInfo.texShape;\n const inTexShape = inputInfo.shapeInfo.texShape;\n const inRank = inputInfo.shapeInfo.logicalShape.length;\n const outRank = outShapeInfo.logicalShape.length;\n if (!inputInfo.shapeInfo.isUniform && inRank === outRank &&\n inputInfo.shapeInfo.flatOffset == null &&\n util.arraysEqual(inTexShape, outTexShape)) {\n return `\n float ${funcName}() {\n return sampleTexture(${texName}, resultUV);\n }\n `;\n }\n const type = getCoordsDataType(outRank);\n const broadcastDims = getBroadcastDims(inputInfo.shapeInfo.logicalShape, outShapeInfo.logicalShape);\n const rankDiff = outRank - inRank;\n let coordsSnippet;\n const fields = ['x', 'y', 'z', 'w', 'u', 'v'];\n if (inRank === 0) {\n coordsSnippet = '';\n }\n else if (outRank < 2 && broadcastDims.length >= 1) {\n coordsSnippet = 'coords = 0;';\n }\n else {\n coordsSnippet =\n broadcastDims.map(d => `coords.${fields[d + rankDiff]} = 0;`)\n .join('\\n');\n }\n let unpackedCoordsSnippet = '';\n if (outRank < 2 && inRank > 0) {\n unpackedCoordsSnippet = 'coords';\n }\n else {\n unpackedCoordsSnippet = inputInfo.shapeInfo.logicalShape\n .map((s, i) => `coords.${fields[i + rankDiff]}`)\n .join(', ');\n }\n return `\n float ${funcName}() {\n ${type} coords = getOutputCoords();\n ${coordsSnippet}\n return get${texFuncSnippet}(${unpackedCoordsSnippet});\n }\n `;\n}\nexport function getCoordsDataType(rank) {\n if (rank <= 1) {\n return 'int';\n }\n else if (rank === 2) {\n return 'ivec2';\n }\n else if (rank === 3) {\n return 'ivec3';\n }\n else if (rank === 4) {\n return 'ivec4';\n }\n else if (rank === 5) {\n return 'ivec5';\n }\n else if (rank === 6) {\n return 'ivec6';\n }\n else {\n throw Error(`GPU for rank ${rank} is not yet supported`);\n }\n}\nexport function getUniformInfoFromShape(isPacked, shape, texShape) {\n const { newShape, keptDims } = util.squeezeShape(shape);\n const rank = shape.length;\n const useSqueezePackedShape = isPacked && rank === 3 && shape[0] === 1;\n const squeezeShape = useSqueezePackedShape ? shape.slice(1) : newShape;\n const useSqueezeShape = (!isPacked && rank > 1 && !util.arraysEqual(shape, texShape) &&\n newShape.length < rank) ||\n useSqueezePackedShape;\n const uniformShape = useSqueezeShape ? squeezeShape : shape;\n return { useSqueezeShape, uniformShape, keptDims };\n}\n/** Returns a new input info (a copy) that has a squeezed logical shape. */\nexport function squeezeInputInfo(inInfo, squeezedShape) {\n // Deep copy.\n const newInputInfo = JSON.parse(JSON.stringify(inInfo));\n newInputInfo.shapeInfo.logicalShape = squeezedShape;\n return newInputInfo;\n}\nfunction getSqueezedParams(params, keptDims) {\n return keptDims.map(d => params[d]).join(', ');\n}\n//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic2hhZGVyX2NvbXBpbGVyLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vdGZqcy1iYWNrZW5kLXdlYmdsL3NyYy9zaGFkZXJfY29tcGlsZXIudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUE7Ozs7Ozs7Ozs7Ozs7OztHQWVHO0FBRUgsNEVBQTRFO0FBQzVFLDREQUE0RDtBQUU1RCxPQUFPLEVBQUMsWUFBWSxFQUFFLElBQUksRUFBQyxNQUFNLHVCQUF1QixDQUFDO0FBQ3pELE1BQU0sRUFBQyxnQkFBZ0IsRUFBQyxHQUFHLFlBQVksQ0FBQztBQUN4QyxPQUFPLEVBQUMsa0JBQWtCLEVBQU8sTUFBTSxnQkFBZ0IsQ0FBQztBQUN4RCxPQUFPLEtBQUssV0FBVyxNQUFNLHdCQUF3QixDQUFDO0FBMEJ0RCxNQUFNLFVBQVUsVUFBVSxDQUN0QixVQUF1QixFQUFFLFdBQXNCLEVBQy9DLE9BQXNCO0lBQ3hCLE1BQU0sY0FBYyxHQUFhLEVBQUUsQ0FBQztJQUNwQyxVQUFVLENBQUMsT0FBTyxDQUFDLENBQUMsQ0FBQyxFQUFFO1FBQ3JCLE1BQU0sSUFBSSxHQUFHLElBQUksQ0FBQyxhQUFhLENBQUMsQ0FBQyxDQUFDLFNBQVMsQ0FBQyxZQUFZLENBQUMsQ0FBQztRQUUxRCwyREFBMkQ7UUFDM0QsSUFBSSxDQUFDLENBQUMsU0FBUyxDQUFDLFNBQVMsRUFBRTtZQUN6QixjQUFjLENBQUMsSUFBSSxDQUNmLGlCQUFpQixDQUFDLENBQUMsSUFBSSxHQUFHLElBQUksR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksSUFBSSxHQUFHLENBQUMsQ0FBQyxDQUFDLEVBQUUsR0FBRyxDQUFDLENBQUM7U0FDL0Q7YUFBTTtZQUNMLGNBQWMsQ0FBQyxJQUFJLENBQUMscUJBQXFCLENBQUMsQ0FBQyxJQUFJLEdBQUcsQ0FBQyxDQUFDO1lBQ3BELGNBQWMsQ0FBQyxJQUFJLENBQUMscUJBQXFCLENBQUMsQ0FBQyxJQUFJLEdBQUcsQ0FB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QUMsSUFBSSxDQUFDLFdBQVcsQ0FBQyxLQUFLLEVBQUUsUUFBUSxDQUFDO1FBQzNELFFBQVEsQ0FBQyxNQUFNLEdBQUcsSUFBSSxDQUFDO1FBQ3hCLHFCQUFxQixDQUFDO0lBQzFCLE1BQU0sWUFBWSxHQUFHLGVBQWUsQ0FBQyxDQUFDLENBQUMsWUFBWSxDQUFDLENBQUMsQ0FBQyxLQUFLLENBQUM7SUFDNUQsT0FBTyxFQUFDLGVBQWUsRUFBRSxZQUFZLEVBQUUsUUFBUSxFQUFDLENBQUM7QUFDbkQsQ0FBQztBQUVELDJFQUEyRTtBQUMzRSxNQUFNLFVBQVUsZ0JBQWdCLENBQzVCLE1BQWlCLEVBQUUsYUFBdUI7SUFDNUMsYUFBYTtJQUNiLE1BQU0sWUFBWSxHQUFjLElBQUksQ0FBQyxLQUFLLENBQUMsSUFBSSxDQUFDLFNBQVMsQ0FBQyxNQUFNLENBQUMsQ0FBQyxDQUFDO0lBQ25FLFlBQVksQ0FBQyxTQUFTLENBQUMsWUFBWSxHQUFHLGFBQWEsQ0FBQztJQUNwRCxPQUFPLFlBQVksQ0FBQztBQUN0QixDQUFDO0FBRUQsU0FBUyxpQkFBaUIsQ0FBQyxNQUFnQixFQUFFLFFBQWtCO0lBQzdELE9BQU8sUUFBUSxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLE1BQU0sQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsQ0FBQztBQUNqRCxDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiLyoqXG4gKiBAbGljZW5zZVxuICogQ29weXJpZ2h0IDIwMTcgR29vZ2xlIExMQy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC5cbiAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSBcIkxpY2Vuc2VcIik7XG4gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuXG4gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXRcbiAqXG4gKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjBcbiAqXG4gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlXG4gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiBcIkFTIElTXCIgQkFTSVMsXG4gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC5cbiAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmRcbiAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLlxuICogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbiAqL1xuXG4vLyBQbGVhc2UgbWFrZSBzdXJlIHRoZSBzaGFrZXIga2V5IGluIG1ha2VTaGFkZXJLZXkgaW4gZ3BncHVfbWF0aC50cyBpcyB3ZWxsXG4vLyBtYXBwZWQgaWYgYW55IHNoYWRlciBzb3VyY2UgY29kZSBpcyBjaGFuZ2VkIGluIHRoaXMgZmlsZS5cblxuaW1wb3J0IHtiYWNrZW5kX3V0aWwsIHV0aWx9IGZyb20gJ0B0ZW5zb3JmbG93L3RmanMtY29yZSc7XG5jb25zdCB7Z2V0QnJvYWRjYXN0RGltc30gPSBiYWNrZW5kX3V0aWw7XG5pbXBvcnQge2dldEdsc2xEaWZmZXJlbmNlcywgR0xTTH0gZnJvbSAnLi9nbHNsX3ZlcnNpb24nO1xuaW1wb3J0ICogYXMgc2hhZGVyX3V0aWwgZnJvbSAnLi9zaGFkZXJfY29tcGlsZXJfdXRpbCc7XG5cbmV4cG9ydCB0eXBlIFNoYXBlSW5mbyA9IHtcbiAgbG9naWNhbFNoYXBlOiBudW1iZXJbXSxcbiAgdGV4U2hhcGU6IFtudW1iZXIsIG51bWJlcl0sXG4gIGlzVW5pZm9ybTogYm9vbGVhbixcbiAgaXNQYWNrZWQ6IGJvb2xlYW4sXG4gIGZsYXRPZmZzZXQ6IG51bWJlclxufTtcblxuZXhwb3J0IHR5cGUgSW5wdXRJbmZvID0ge1xuICBuYW1lOiBzdHJpbmcsXG4gIHNoYXBlSW5mbzogU2hhcGVJbmZvXG59O1xuXG5leHBvcnQgdHlwZSBVbmlmb3JtVHlwZSA9XG4gICAgJ2Zsb2F0J3wndmVjMid8J3ZlYzMnfCd2ZWM0J3wnaW50J3wnaXZlYzInfCdpdmVjMyd8J2l2ZWM0JztcblxuaW50ZXJmYWNlIFByb2dyYW1QYXJhbXMge1xuICB1c2VyQ29kZTogc3RyaW5nO1xuICBlbmFibGVTaGFwZVVuaWZvcm1zPzogYm9vbGVhbjtcbiAgcGFja2VkSW5wdXRzPzogYm9vbGVhbjtcbiAgY3VzdG9tVW5pZm9ybXM/OlxuICAgICAgQXJyYXk8e25hbWU6IHN0cmluZzsgYXJyYXlJbmRleD86IG51bWJlcjsgdHlwZTogVW5pZm9ybVR5cGU7fT47XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBtYWtlU2hhZGVyKFxuICAgIGlucHV0c0luZm86IElucHV0SW5mb1tdLCBvdXRwdXRTaGFwZTogU2hhcGVJbmZvLFxuICAgIHByb2dyYW06IFByb2dyYW1QYXJhbXMpOiBzdHJpbmcge1xuICBjb25zdCBwcmVmaXhTbmlwcGV0czogc3RyaW5nW10gPSBbXTtcbiAgaW5wdXRzSW5mby5mb3JFYWNoKHggPT4ge1xuICAgIGNvbnN0IHNpemUgPSB1dGlsLnNpemVGcm9tU2hhcGUoeC5zaGFwZUluZm8ubG9naWNhbFNoYXBlKTtcblxuICAgIC8vIFNuaXBwZXQgd2hlbiB3ZSBkZWNpZGVkIHRvIHVwbG9hZCB0aGUgdmFsdWVzIGFzIHVuaWZvcm0uXG4gICAgaWYgKHguc2hhcGVJbmZvLmlzVW5pZm9ybSkge1xuICAgICAgcHJlZml4U25pcHBldHMucHVzaChcbiAgICAgICAgICBgdW5pZm9ybSBmbG9hdCAke3gubmFtZX0ke3NpemUgPiAxID8gYFske3NpemV9XWAgOiAnJ307YCk7XG4gICAgfSBlbHNlIHtcbiAgICAgIHByZWZpeFNuaXBwZXRzLnB1c2goYHVuaWZvcm0gc2FtcGxlcjJEICR7eC5uYW1lfTtgKTtcbiAgICAgIHByZWZpeFNuaXBwZXRzLnB1c2goYHVuaWZvcm0gaW50IG9mZnNldCR7eC5uYW1lfTtgKTtcbiAgICB9XG5cbiAgICBpZiAocHJvZ3JhbS5lbmFibGVTaGFwZVVuaWZvcm1zKSB7XG4gICAgICBjb25zdCB7dW5pZm9ybVNoYXBlfSA9IGdldFVuaWZvcm1JbmZvRnJvbVNoYXBlKFxuICAgICAgICAgIHByb2dyYW0ucGFja2VkSW5wdXRzLCB4LnNoYXBlSW5mby5sb2dpY2FsU2hhcGUsIHguc2hhcGVJbmZvLnRleFNoYXBlKTtcbiAgICAgIHN3aXRjaCAodW5pZm9ybVNoYXBlLmxlbmd0aCkge1xuICAgICAgICBjYXNlIDE6XG4gICAgICAgICAgcHJlZml4U25pcHBldHMucHVzaChgdW5pZm9ybSBpbnQgJHt4Lm5hbWV9U2hhcGU7YCk7XG4gICAgICAgICAgYnJlYWs7XG4gICAgICAgIGNhc2UgMjpcbiAgICAgICAgICBwcmVmaXhTbmlwcGV0cy5wdXNoKGB1bmlmb3JtIGl2ZWMyICR7eC5uYW1lfVNoYXBlO2ApO1xuICAgICAgICAgIGJyZWFrO1xuICAgICAgICBjYXNlIDM6XG4gICAgICAgICAgcHJlZml4U25pcHBldHMucHVzaChgdW5pZm9ybSBpdmVjMyAke3gubmFtZX1TaGFwZTtgKTtcbiAgICAgICAgICBicmVhaztcbiAgICAgICAgY2FzZSA0OlxuICAgICAgICAgIHByZWZpeFNuaXBwZXRzLnB1c2goYHVuaWZvcm0gaXZlYzQgJHt4Lm5hbWV9U2hhcGU7YCk7XG4gICAgICAgICAgYnJlYWs7XG4gICAgICAgIGRlZmF1bHQ6XG4gICAgICAgICAgYnJlYWs7XG4gICAgICB9XG4gICAgICBwcmVmaXhTbmlwcGV0cy5wdXNoKGB1bmlmb3JtIGl2ZWMyICR7eC5uYW1lfVRleFNoYXBlO2ApO1xuICAgIH1cbiAgfSk7XG5cbiAgaWYgKHByb2dyYW0uZW5hYmxlU2hhcGVVbmlmb3Jtcykge1xuICAgIHN3aXRjaCAob3V0cHV0U2hhcGUubG9naWNhbFNoYXBlLmxlbmd0aCkge1xuICAgICAgY2FzZSAxOlxuICAgICAgICBwcmVmaXhTbmlwcGV0cy5wdXNoKGB1bmlmb3JtIGludCBvdXRTaGFwZTtgKTtcbiAgICAgICAgYnJlYWs7XG4gICAgICBjYXNlIDI6XG4gICAgICAgIHByZWZpeFNuaXBwZXRzLnB1c2goYHVuaWZvcm0gaXZlYzIgb3V0U2hhcGU7YCk7XG4gICAgICAgIHByZWZpeFNuaXBwZXRzLnB1c2goYHVuaWZvcm0gaW50IG91dFNoYXBlU3RyaWRlcztgKTtcbiAgICAgICAgYnJlYWs7XG4gICAgICBjYXNlIDM6XG4gICAgICAgIHByZWZpeFNuaXBwZXRzLnB1c2goYHVuaWZvcm0gaXZlYzMgb3V0U2hhcGU7YCk7XG4gICAgICAgIHByZWZpeFNuaXBwZXRzLnB1c2goYHVuaWZvcm0gaXZlYzIgb3V0U2hhcGVTdHJpZGVzO2ApO1xuICAgICAgICBicmVhaztcbiAgICAgIGNhc2UgNDpcbiAgICAgICAgcHJlZml4U25pcHBldHMucHVzaChgdW5pZm9ybSBpdmVjNCBvdXRTaGFwZTtgKTtcbiAgICAgICAgcHJlZml4U25pcHBldHMucHVzaChgdW5pZm9ybSBpdmVjMyBvdXRTaGFwZVN0cmlkZXM7YCk7XG4gICAgICAgIGJyZWFrO1xuICAgICAgZGVmYXVsdDpcbiAgICAgICAgYnJlYWs7XG4gICAgfVxuICAgIHByZWZpeFNuaXBwZXRzLnB1c2goYHVuaWZvcm0gaXZlYzIgb3V0VGV4U2hhcGU7YCk7XG4gIH1cbiAgaWYgKHByb2dyYW0uY3VzdG9tVW5pZm9ybXMpIHtcbiAgICBwcm9ncmFtLmN1c3RvbVVuaWZvcm1zLmZvckVhY2goKGQpID0+IHtcbiAgICAgIHByZWZpeFNuaXBwZXRzLnB1c2goYHVuaWZvcm0gJHtkLnR5cGV9ICR7ZC5uYW1lfSR7XG4gICAgICAgICAgZC5hcnJheUluZGV4ID8gYFske2QuYXJyYXlJbmRleH1dYCA6ICcnfTtgKTtcbiAgICB9KTtcbiAgfVxuICBjb25zdCBpbnB1dFByZWZpeFNuaXBwZXQgPSBwcmVmaXhTbmlwcGV0cy5qb2luKCdcXG4nKTtcblxuICBjb25zdCBpbnB1dFNhbXBsaW5nU25pcHBldCA9IGlucHV0c0luZm9cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLm1hcChcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHggPT4gZ2V0SW5wdXRTYW1wbGluZ1NuaXBwZXQoXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgeCwgb3V0cHV0U2hhcGUsIHByb2dyYW0ucGFja2VkSW5wdXRzLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHByb2dyYW0uZW5hYmxlU2hhcGVVbmlmb3JtcykpXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC5qb2luKCdcXG4nKTtcbiAgY29uc3Qgb3V0VGV4U2hhcGUgPSBvdXRwdXRTaGFwZS50ZXhTaGFwZTtcbiAgY29uc3QgZ2xzbCA9IGdldEdsc2xEaWZmZXJlbmNlcygpO1xuICBjb25zdCBmbG9hdFRleHR1cmVTYW1wbGVTbmlwcGV0ID0gZ2V0RmxvYXRUZXh0dXJlU2FtcGxlU25pcHBldChnbHNsKTtcbiAgbGV0IG91dHB1dFNhbXBsaW5nU25pcHBldDogc3RyaW5nO1xuICBsZXQgZmxvYXRUZXh0dXJlU2V0T3V0cHV0U25pcHBldDogc3RyaW5nO1xuICBsZXQgc2hhZGVyUHJlZml4ID0gZ2V0U2hhZGVyUHJlZml4KGdsc2wpO1xuXG4gIGlmIChvdXRwdXRTaGFwZS5pc1BhY2tlZCkge1xuICAgIG91dHB1dFNhbXBsaW5nU25pcHBldCA9IGdldFBhY2tlZE91dHB1dFNhbXBsaW5nU25pcHBldChcbiAgICAgICAgb3V0cHV0U2hhcGUubG9naWNhbFNoYXBlLCBvdXRUZXhTaGFwZSwgcHJvZ3JhbS5lbmFibGVTaGFwZVVuaWZvcm1zKTtcbiAgICBmbG9hdFRleHR1cmVTZXRPdXRwdXRTbmlwcGV0ID0gZ2V0RmxvYXRUZXh0dXJlU2V0UkdCQVNuaXBwZXQoZ2xzbCk7XG4gIH0gZWxzZSB7XG4gICAgb3V0cHV0U2FtcGxpbmdTbmlwcGV0ID0gZ2V0T3V0cHV0U2FtcGxpbmdTbmlwcGV0KFxuICAgICAgICBvdXRwdXRTaGFwZS5sb2dpY2FsU2hhcGUsIG91dFRleFNoYXBlLCBwcm9ncmFtLmVuYWJsZVNoYXBlVW5pZm9ybXMpO1xuICAgIGZsb2F0VGV4dHVyZVNldE91dHB1dFNuaXBwZXQgPSBnZXRGbG9hdFRleHR1cmVTZXRSU25pcHBldChnbHNsKTtcbiAgfVxuXG4gIGlmIChwcm9ncmFtLnBhY2tlZElucHV0cykge1xuICAgIHNoYWRlclByZWZpeCArPSBTSEFERVJfUEFDS0VEX1BSRUZJWDtcbiAgfVxuXG4gIGNvbnN0IHNvdXJjZSA9IFtcbiAgICBzaGFkZXJQcmVmaXgsIGZsb2F0VGV4dHVyZVNhbXBsZVNuaXBwZXQsIGZsb2F0VGV4dHVyZVNldE91dHB1dFNuaXBwZXQsXG4gICAgaW5wdXRQcmVmaXhTbmlwcGV0LCBvdXRwdXRTYW1wbGluZ1NuaXBwZXQsIGlucHV0U2FtcGxpbmdTbmlwcGV0LFxuICAgIHByb2dyYW0udXNlckNvZGVcbiAgXS5qb2luKCdcXG4nKTtcbiAgcmV0dXJuIHNvdXJjZTtcbn1cblxuZnVuY3Rpb24gZ2V0U2FtcGxlckZyb21JbkluZm8oXG4gICAgaW5JbmZvOiBJbnB1dEluZm8sIGVuYWJsZVNoYXBlVW5pZm9ybXMgPSBmYWxzZSk6IHN0cmluZyB7XG4gIGNvbnN0IHNoYXBlID0gaW5JbmZvLnNoYXBlSW5mby5sb2dpY2FsU2hhcGU7XG4gIHN3aXRjaCAoc2hhcGUubGVuZ3RoKSB7XG4gICAgY2FzZSAwOlxuICAgICAgcmV0dXJuIGdldFNhbXBsZXJTY2FsYXIoaW5JbmZvLCBlbmFibGVTaGFwZVVuaWZvcm1zKTtcbiAgICBjYXNlIDE6XG4gICAgICByZXR1cm4gZ2V0U2FtcGxlcjFEKGluSW5mbywgZW5hYmxlU2hhcGVVbmlmb3Jtcyk7XG4gICAgY2FzZSAyOlxuICAgICAgcmV0dXJuIGdldFNhbXBsZXIyRChpbkluZm8sIGVuYWJsZVNoYXBlVW5pZm9ybXMpO1xuICAgIGNhc2UgMzpcbiAgICAgIHJldHVybiBnZXRTYW1wbGVyM0QoaW5JbmZvLCBlbmFibGVTaGFwZVVuaWZvcm1zKTtcbiAgICBjYXNlIDQ6XG4gICAgICByZXR1cm4gZ2V0U2FtcGxlcjREKGluSW5mbywgZW5hYmxlU2hhcGVVbmlmb3Jtcyk7XG4gICAgY2FzZSA1OlxuICAgICAgcmV0dXJuIGdldFNhbXBsZXI1RChpbkluZm8pO1xuICAgIGNhc2UgNjpcbiAgICAgIHJldHVybiBnZXRTYW1wbGVyNkQoaW5JbmZvKTtcbiAgICBkZWZhdWx0OlxuICAgICAgdGhyb3cgbmV3IEVycm9yKFxuICAgICAgICAgIGAke3NoYXBlLmxlbmd0aH0tRCBpbnB1dCBzYW1wbGluZ2AgK1xuICAgICAgICAgIGAgaXMgbm90IHlldCBzdXBwb3J0ZWRgKTtcbiAgfVxufVxuXG5mdW5jdGlvbiBnZXRQYWNrZWRTYW1wbGVyRnJvbUluSW5mbyhcbiAgICBpbkluZm86IElucHV0SW5mbywgZW5hYmxlU2hhcGVVbmlmb3JtczogYm9vbGVhbik6IHN0cmluZyB7XG4gIGNvbnN0IHNoYXBlID0gaW5JbmZvLnNoYXBlSW5mby5sb2dpY2FsU2hhcGU7XG4gIHN3aXRjaCAoc2hhcGUubGVuZ3RoKSB7XG4gICAgY2FzZSAwOlxuICAgICAgcmV0dXJuIGdldFBhY2tlZFNhbXBsZXJTY2FsYXIoaW5JbmZvKTtcbiAgICBjYXNlIDE6XG4gICAgICByZXR1cm4gZ2V0UGFja2VkU2FtcGxlcjFEKGluSW5mbywgZW5hYmxlU2hhcGVVbmlmb3Jtcyk7XG4gICAgY2FzZSAyOlxuICAgICAgcmV0dXJuIGdldFBhY2tlZFNhbXBsZXIyRChpbkluZm8sIGVuYWJsZVNoYXBlVW5pZm9ybXMpO1xuICAgIGNhc2UgMzpcbiAgICAgIHJldHVybiBnZXRQYWNrZWRTYW1wbGVyM0QoaW5JbmZvLCBlbmFibGVTaGFwZVVuaWZvcm1zKTtcbiAgICBkZWZhdWx0OlxuICAgICAgcmV0dXJuIGdldFBhY2tlZFNhbXBsZXJORChpbkluZm8sIGVuYWJsZVNoYXBlVW5pZm9ybXMpO1xuICB9XG59XG5cbmZ1bmN0aW9uIGdldElucHV0U2FtcGxpbmdTbmlwcGV0KFxuICAgIGluSW5mbzogSW5wdXRJbmZvLCBvdXRTaGFwZUluZm86IFNoYXBlSW5mbywgdXNlc1BhY2tlZFRleHR1cmVzID0gZmFsc2UsXG4gICAgZW5hYmxlU2hhcGVVbmlmb3JtczogYm9vbGVhbik6IHN0cmluZyB7XG4gIGxldCByZXMgPSAnJztcbiAgaWYgKHVzZXNQYWNrZWRUZXh0dXJlcykge1xuICAgIHJlcyArPSBnZXRQYWNrZWRTYW1wbGVyRnJvbUluSW5mbyhpbkluZm8sIGVuYWJsZVNoYXBlVW5pZm9ybXMpO1xuICB9IGVsc2Uge1xuICAgIHJlcyArPSBnZXRTYW1wbGVyRnJvbUluSW5mbyhpbkluZm8sIGVuYWJsZVNoYXBlVW5pZm9ybXMpO1xuICB9XG5cbiAgY29uc3QgaW5TaGFwZSA9IGluSW5mby5zaGFwZUluZm8ubG9naWNhbFNoYXBlO1xuICBjb25zdCBvdXRTaGFwZSA9IG91dFNoYXBlSW5mby5sb2dpY2FsU2hhcGU7XG4gIGlmIChpblNoYXBlLmxlbmd0aCA8PSBvdXRTaGFwZS5sZW5ndGgpIHtcbiAgICBpZiAodXNlc1BhY2tlZFRleHR1cmVzKSB7XG4gICAgICByZXMgKz0gZ2V0UGFja2VkU2FtcGxlckF0T3V0cHV0Q29vcmRzKGluSW5mbywgb3V0U2hhcGVJbmZvKTtcbiAgICB9IGVsc2Uge1xuICAgICAgcmVzICs9IGdldFNhbXBsZXJBdE91dHB1dENvb3JkcyhpbkluZm8sIG91dFNoYXBlSW5mbyk7XG4gICAgfVxuICB9XG4gIHJldHVybiByZXM7XG59XG5cbmZ1bmN0aW9uIGdldFBhY2tlZE91dHB1dFNhbXBsaW5nU25pcHBldChcbiAgICBvdXRTaGFwZTogbnVtYmVyW10sIG91dFRleFNoYXBlOiBbbnVtYmVyLCBudW1iZXJdLFxuICAgIGVuYWJsZVNoYXBlVW5pZm9ybXM6IGJvb2xlYW4pOiBzdHJpbmcge1xuICBzd2l0Y2ggKG91dFNoYXBlLmxlbmd0aCkge1xuICAgIGNhc2UgMDpcbiAgICAgIHJldHVybiBnZXRPdXRwdXRTY2FsYXJDb29yZHMoKTtcbiAgICBjYXNlIDE6XG4gICAgICByZXR1cm4gZ2V0T3V0cHV0UGFja2VkMURDb29yZHMoXG4gICAgICAgICAgb3V0U2hhcGUgYXMgW251bWJlcl0sIG91dFRleFNoYXBlLCBlbmFibGVTaGFwZVVuaWZvcm1zKTtcbiAgICBjYXNlIDI6XG4gICAgICByZXR1cm4gZ2V0T3V0cHV0UGFja2VkMkRDb29yZHMoXG4gICAgICAgICAgb3V0U2hhcGUgYXMgW251bWJlciwgbnVtYmVyXSwgb3V0VGV4U2hhcGUsIGVuYWJsZVNoYXBlVW5pZm9ybXMpO1xuICAgIGNhc2UgMzpcbiAgICAgIHJldHVybiBnZXRPdXRwdXRQYWNrZWQzRENvb3JkcyhcbiAgICAgICAgICBvdXRTaGFwZSBhcyBbbnVtYmVyLCBudW1iZXIsIG51bWJlcl0sIG91dFRleFNoYXBlLFxuICAgICAgICAgIGVuYWJsZVNoYXBlVW5pZm9ybXMpO1xuICAgIGRlZmF1bHQ6XG4gICAgICByZXR1cm4gZ2V0T3V0cHV0UGFja2VkTkRDb29yZHMoXG4gICAgICAgICAgb3V0U2hhcGUsIG91dFRleFNoYXBlLCBlbmFibGVTaGFwZVVuaWZvcm1zKTtcbiAgfVxufVxuXG5mdW5jdGlvbiBnZXRPdXRwdXRTYW1wbGluZ1NuaXBwZXQoXG4gICAgb3V0U2hhcGU6IG51bWJlcltdLCBvdXRUZXhTaGFwZTogW251bWJlciwgbnVtYmVyXSxcbiAgICBlbmFibGVTaGFwZVVuaWZvcm1zOiBib29sZWFuKTogc3RyaW5nIHtcbiAgc3dpdGNoIChvdXRTaGFwZS5sZW5ndGgpIHtcbiAgICBjYXNlIDA6XG4gICAgICByZXR1cm4gZ2V0T3V0cHV0U2NhbGFyQ29vcmRzKCk7XG4gICAgY2FzZSAxOlxuICAgICAgcmV0dXJuIGdldE91dHB1dDFEQ29vcmRzKFxuICAgICAgICAgIG91dFNoYXBlIGFzIFtudW1iZXJdLCBvdXRUZXhTaGFwZSwgZW5hYmxlU2hhcGVVbmlmb3Jtcyk7XG4gICAgY2FzZSAyOlxuICAgICAgcmV0dXJuIGdldE91dHB1dDJEQ29vcmRzKFxuICAgICAgICAgIG91dFNoYXBlIGFzIFtudW1iZXIsIG51bWJlcl0sIG91dFRleFNoYXBlLCBlbmFibGVTaGFwZVVuaWZvcm1zKTtcbiAgICBjYXNlIDM6XG4gICAgICByZXR1cm4gZ2V0T3V0cHV0M0RDb29yZHMoXG4gICAgICAgICAgb3V0U2hhcGUgYXMgW251bWJlciwgbnVtYmVyLCBudW1iZXJdLCBvdXRUZXhTaGFwZSxcbiAgICAgICAgICBlbmFibGVTaGFwZVVuaWZvcm1zKTtcbiAgICBjYXNlIDQ6XG4gICAgICByZXR1cm4gZ2V0T3V0cHV0NERDb29yZHMoXG4gICAgICAgICAgb3V0U2hhcGUgYXMgW251bWJlciwgbnVtYmVyLCBudW1iZXIsIG51bWJlcl0sIG91dFRleFNoYXBlLFxuICAgICAgICAgIGVuYWJsZVNoYXBlVW5pZm9ybXMpO1xuICAgIGNhc2UgNTpcbiAgICAgIHJldHVybiBnZXRPdXRwdXQ1RENvb3JkcyhcbiAgICAgICAgICBvdXRTaGFwZSBhcyBbbnVtYmVyLCBudW1iZXIsIG51bWJlciwgbnVtYmVyLCBudW1iZXJdLCBvdXRUZXhTaGFwZSk7XG4gICAgY2FzZSA2OlxuICAgICAgcmV0dXJuIGdldE91dHB1dDZEQ29vcmRzKFxuICAgICAgICAgIG91dFNoYXBlIGFzIFtudW1iZXIsIG51bWJlciwgbnVtYmVyLCBudW1iZXIsIG51bWJlciwgbnVtYmVyXSxcbiAgICAgICAgICBvdXRUZXhTaGFwZSk7XG4gICAgZGVmYXVsdDpcbiAgICAgIHRocm93IG5ldyBFcnJvcihcbiAgICAgICAgICBgJHtvdXRTaGFwZS5sZW5ndGh9LUQgb3V0cHV0IHNhbXBsaW5nIGlzIG5vdCB5ZXQgc3VwcG9ydGVkYCk7XG4gIH1cbn1cblxuZnVuY3Rpb24gZ2V0RmxvYXRUZXh0dXJlU2FtcGxlU25pcHBldChnbHNsOiBHTFNMKTogc3RyaW5nIHtcbiAgcmV0dXJuIGBcbiAgICBmbG9hdCBzYW1wbGVUZXh0dXJlKHNhbXBsZXIyRCB0ZXh0dXJlU2FtcGxlciwgdmVjMiB1dikge1xuICAgICAgcmV0dXJuICR7Z2xzbC50ZXh0dXJlMkR9KHRleHR1cmVTYW1wbGVyLCB1dikucjtcbiAgICB9XG4gIGA7XG59XG5cbmZ1bmN0aW9uIGdldEZsb2F0VGV4dHVyZVNldFJTbmlwcGV0KGdsc2w6IEdMU0wpOiBzdHJpbmcge1xuICByZXR1cm4gYFxuICAgIHZvaWQgc2V0T3V0cHV0KGZsb2F0IHZhbCkge1xuICAgICAgJHtnbHNsLm91dHB1dH0gPSB2ZWM0KHZhbCwgMCwgMCwgMCk7XG4gICAgfVxuICBgO1xufVxuXG5mdW5jdGlvbiBnZXRGbG9hdFRleHR1cmVTZXRSR0JBU25pcHBldChnbHNsOiBHTFNMKTogc3RyaW5nIHtcbiAgcmV0dXJuIGBcbiAgICB2b2lkIHNldE91dHB1dCh2ZWM0IHZhbCkge1xuICAgICAgJHtnbHNsLm91dHB1dH0gPSB2YWw7XG4gICAgfVxuICBgO1xufVxuXG5mdW5jdGlvbiBnZXRTaGFkZXJQcmVmaXgoZ2xzbDogR0xTTCk6IHN0cmluZyB7XG4gIGNvbnN0IFNIQURFUl9QUkVGSVggPSBgJHtnbHNsLnZlcnNpb259XG4gICAgcHJlY2lzaW9uIGhpZ2hwIGZsb2F0O1xuICAgIHByZWNpc2lvbiBoaWdocCBpbnQ7XG4gICAgcHJlY2lzaW9uIGhpZ2hwIHNhbXBsZXIyRDtcbiAgICAke2dsc2wudmFyeWluZ0ZzfSB2ZWMyIHJlc3VsdFVWO1xuICAgICR7Z2xzbC5kZWZpbmVPdXRwdXR9XG4gICAgY29uc3QgdmVjMiBoYWxmQ1IgPSB2ZWMyKDAuNSwgMC41KTtcblxuICAgIHN0cnVjdCBpdmVjNVxuICAgIHtcbiAgICAgIGludCB4O1xuICAgICAgaW50IHk7XG4gICAgICBpbnQgejtcbiAgICAgIGludCB3O1xuICAgICAgaW50IHU7XG4gICAgfTtcblxuICAgIHN0cnVjdCBpdmVjNlxuICAgIHtcbiAgICAgIGludCB4O1xuICAgICAgaW50IHk7XG4gICAgICBpbnQgejtcbiAgICAgIGludCB3O1xuICAgICAgaW50IHU7XG4gICAgICBpbnQgdjtcbiAgICB9O1xuXG4gICAgdW5pZm9ybSBmbG9hdCBOQU47XG4gICAgJHtnbHNsLmRlZmluZVNwZWNpYWxOYU59XG4gICAgJHtnbHNsLmRlZmluZVNwZWNpYWxJbmZ9XG4gICAgJHtnbHNsLmRlZmluZVJvdW5kfVxuXG4gICAgaW50IGltb2QoaW50IHgsIGludCB5KSB7XG4gICAgICByZXR1cm4geCAtIHkgKiAoeCAvIHkpO1xuICAgIH1cblxuICAgIGludCBpZGl2KGludCBhLCBpbnQgYiwgZmxvYXQgc2lnbikge1xuICAgICAgaW50IHJlcyA9IGEgLyBiO1xuICAgICAgaW50IG1vZCA9IGltb2QoYSwgYik7XG4gICAgICBpZiAoc2lnbiA8IDAuICYmIG1vZCAhPSAwKSB7XG4gICAgICAgIHJlcyAtPSAxO1xuICAgICAgfVxuICAgICAgcmV0dXJuIHJlcztcbiAgICB9XG5cbiAgICAvL0Jhc2VkIG9uIHRoZSB3b3JrIG9mIERhdmUgSG9za2luc1xuICAgIC8vaHR0cHM6Ly93d3cuc2hhZGVydG95LmNvbS92aWV3LzRkalNSV1xuICAgICNkZWZpbmUgSEFTSFNDQUxFMSA0NDMuODk3NVxuICAgIGZsb2F0IHJhbmRvbShmbG9hdCBzZWVkKXtcbiAgICAgIHZlYzIgcCA9IHJlc3VsdFVWICogc2VlZDtcbiAgICAgIHZlYzMgcDMgID0gZnJhY3QodmVjMyhwLnh5eCkgKiBIQVNIU0NBTEUxKTtcbiAgICAgIHAzICs9IGRvdChwMywgcDMueXp4ICsgMTkuMTkpO1xuICAgICAgcmV0dXJuIGZyYWN0KChwMy54ICsgcDMueSkgKiBwMy56KTtcbiAgICB9XG5cbiAgICAke1NBTVBMRV8xRF9TTklQUEVUfVxuICAgICR7U0FNUExFXzJEX1NOSVBQRVR9XG4gICAgJHtTQU1QTEVfM0RfU05JUFBFVH1cbiAgYDtcblxuICByZXR1cm4gU0hBREVSX1BSRUZJWDtcbn1cblxuY29uc3QgU0FNUExFXzFEX1NOSVBQRVQgPSBgXG52ZWMyIHV2RnJvbUZsYXQoaW50IHRleE51bVIsIGludCB0ZXhOdW1DLCBpbnQgaW5kZXgpIHtcbiAgaW50IHRleFIgPSBpbmRleCAvIHRleE51bUM7XG4gIGludCB0ZXhDID0gaW5kZXggLSB0ZXhSICogdGV4TnVtQztcbiAgcmV0dXJuICh2ZWMyKHRleEMsIHRleFIpICsgaGFsZkNSKSAvIHZlYzIodGV4TnVtQywgdGV4TnVtUik7XG59XG52ZWMyIHBhY2tlZFVWZnJvbTFEKGludCB0ZXhOdW1SLCBpbnQgdGV4TnVtQywgaW50IGluZGV4KSB7XG4gIGludCB0ZXhlbEluZGV4ID0gaW5kZXggLyAyO1xuICBpbnQgdGV4UiA9IHRleGVsSW5kZXggLyB0ZXhOdW1DO1xuICBpbnQgdGV4QyA9IHRleGVsSW5kZXggLSB0ZXhSICogdGV4TnVtQztcbiAgcmV0dXJuICh2ZWMyKHRleEMsIHRleFIpICsgaGFsZkNSKSAvIHZlYzIodGV4TnVtQywgdGV4TnVtUik7XG59XG5gO1xuXG5jb25zdCBTQU1QTEVfMkRfU05JUFBFVCA9IGBcbnZlYzIgcGFja2VkVVZmcm9tMkQoaW50IHRleGVsc0luTG9naWNhbFJvdywgaW50IHRleE51bVIsXG4gIGludCB0ZXhOdW1DLCBpbnQgcm93LCBpbnQgY29sKSB7XG4gIGludCB0ZXhlbEluZGV4ID0gKHJvdyAvIDIpICogdGV4ZWxzSW5Mb2dpY2FsUm93ICsgKGNvbCAvIDIpO1xuICBpbnQgdGV4UiA9IHRleGVsSW5kZXggLyB0ZXhOdW1DO1xuICBpbnQgdGV4QyA9IHRleGVsSW5kZXggLSB0ZXhSICogdGV4TnVtQztcbiAgcmV0dXJuICh2ZWMyKHRleEMsIHRleFIpICsgaGFsZkNSKSAvIHZlYzIodGV4TnVtQywgdGV4TnVtUik7XG59XG5gO1xuXG5jb25zdCBTQU1QTEVfM0RfU05JUFBFVCA9IGBcbnZlYzIgcGFja2VkVVZmcm9tM0QoaW50IHRleE51bVIsIGludCB0ZXhOdW1DLFxuICAgIGludCB0ZXhlbHNJbkJhdGNoLCBpbnQgdGV4ZWxzSW5Mb2dpY2FsUm93LCBpbnQgYixcbiAgICBpbnQgcm93LCBpbnQgY29sKSB7XG4gIGludCBpbmRleCA9IGIgKiB0ZXhlbHNJbkJhdGNoICsgKHJvdyAvIDIpICogdGV4ZWxzSW5Mb2dpY2FsUm93ICsgKGNvbCAvIDIpO1xuICBpbnQgdGV4UiA9IGluZGV4IC8gdGV4TnVtQztcbiAgaW50IHRleEMgPSBpbmRleCAtIHRleFIgKiB0ZXhOdW1DO1xuICByZXR1cm4gKHZlYzIodGV4QywgdGV4UikgKyBoYWxmQ1IpIC8gdmVjMih0ZXhOdW1DLCB0ZXhOdW1SKTtcbn1cbmA7XG5cbmNvbnN0IFNIQURFUl9QQUNLRURfUFJFRklYID0gYFxuICBmbG9hdCBnZXRDaGFubmVsKHZlYzQgZnJhZywgdmVjMiBpbm5lckRpbXMpIHtcbiAgICB2ZWMyIG1vZENvb3JkID0gbW9kKGlubmVyRGltcywgMi4pO1xuICAgIHJldHVybiBtb2RDb29yZC54ID09IDAuID9cbiAgICAgIChtb2RDb29yZC55ID09IDAuID8gZnJhZy5yIDogZnJhZy5nKSA6XG4gICAgICAobW9kQ29vcmQueSA9PSAwLiA/IGZyYWcuYiA6IGZyYWcuYSk7XG4gIH1cbiAgZmxvYXQgZ2V0Q2hhbm5lbCh2ZWM0IGZyYWcsIGludCBkaW0pIHtcbiAgICBmbG9hdCBtb2RDb29yZCA9IG1vZChmbG9hdChkaW0pLCAyLik7XG4gICAgcmV0dXJuIG1vZENvb3JkID09IDAuID8gZnJhZy5yIDogZnJhZy5nO1xuICB9XG5gO1xuXG5mdW5jdGlvbiBnZXRPdXRwdXRTY2FsYXJDb29yZHMoKSB7XG4gIHJldHVybiBgXG4gICAgaW50IGdldE91dHB1dENvb3JkcygpIHtcbiAgICAgIHJldHVybiAwO1xuICAgIH1cbiAgYDtcbn1cblxuZnVuY3Rpb24gZ2V0T3V0cHV0UGFja2VkMURDb29yZHMoXG4gICAgc2hhcGU6IFtudW1iZXJdLCB0ZXhTaGFwZTogW251bWJlciwgbnVtYmVyXSxcbiAgICBlbmFibGVTaGFwZVVuaWZvcm1zOiBib29sZWFuKTogc3RyaW5nIHtcbiAgY29uc3QgcGFja2VkVGV4U2hhcGUgPVxuICAgICAgW01hdGguY2VpbCh0ZXhTaGFwZVswXSAvIDIpLCBNYXRoLmNlaWwodGV4U2hhcGVbMV0gLyAyKV07XG4gIGlmIChwYWNrZWRUZXhTaGFwZVswXSA9PT0gMSkge1xuICAgIGlmIChlbmFibGVTaGFwZVVuaWZvcm1zKSB7XG4gICAgICByZXR1cm4gYFxuICAgICAgaW50IGdldE91dHB1dENvb3JkcygpIHtcbiAgICAgICAgcmV0dXJuIDIgKiBpbnQocmVzdWx0VVYueCAqIGNlaWwoZmxvYXQob3V0VGV4U2hhcGVbMV0pIC8gMi4wKSk7XG4gICAgICB9XG4gICAgYDtcbiAgICB9XG5cbiAgICByZXR1cm4gYFxuICAgICAgaW50IGdldE91dHB1dENvb3JkcygpIHtcbiAgICAgICAgcmV0dXJuIDIgKiBpbnQocmVzdWx0VVYueCAqICR7cGFja2VkVGV4U2hhcGVbMV19LjApO1xuICAgICAgfVxuICAgIGA7XG4gIH1cblxuICBpZiAocGFja2VkVGV4U2hhcGVbMV0gPT09IDEpIHtcbiAgICBpZiAoZW5hYmxlU2hhcGVVbmlmb3Jtcykge1xuICAgICAgcmV0dXJuIGBcbiAgICAgIGludCBnZXRPdXRwdXRDb29yZHMoKSB7XG4gICAgICAgIHJldHVybiAyICogaW50KHJlc3VsdFVWLnkgKiBjZWlsKGZsb2F0KG91dFRleFNoYXBlWzBdKSAvIDIuMCkpO1xuICAgICAgfVxuICAgIGA7XG4gICAgfVxuXG4gICAgcmV0dXJuIGBcbiAgICAgIGludCBnZXRPdXRwdXRDb29yZHMoKSB7XG4gICAgICAgIHJldHVybiAyICogaW50KHJlc3VsdFVWLnkgKiAke3BhY2tlZFRleFNoYXBlWzBdfS4wKTtcbiAgICAgIH1cbiAgICBgO1xuICB9XG5cbiAgaWYgKGVuYWJsZVNoYXBlVW5pZm9ybXMpIHtcbiAgICByZXR1cm4gYFxuICAgIGludCBnZXRPdXRwdXRDb29yZHMoKSB7XG4gICAgICBpdmVjMiBwYWNrZWRUZXhTaGFwZSA9IGl2ZWMyKGNlaWwoZmxvYXQob3V0VGV4U2hhcGVbMF0pIC8gMi4wKSwgY2VpbChmbG9hdChvdXRUZXhTaGFwZVsxXSkgLyAyLjApKTtcbiAgICAgIGl2ZWMyIHJlc1RleFJDID0gaXZlYzIocmVzdWx0VVYueXggKlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2ZWMyKHBhY2tlZFRleFNoYXBlWzBdLCBwYWNrZWRUZXhTaGFwZVsxXSkpO1xuICAgICAgcmV0dXJuIDIgKiAocmVzVGV4UkMueCAqIHBhY2tlZFRleFNoYXBlWzFdICsgcmVzVGV4UkMueSk7XG4gICAgfVxuICBgO1xuICB9XG5cbiAgcmV0dXJuIGBcbiAgICBpbnQgZ2V0T3V0cHV0Q29vcmRzKCkge1xuICAgICAgaXZlYzIgcmVzVGV4UkMgPSBpdmVjMihyZXN1bHRVVi55eCAqXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZlYzIoJHtwYWNrZWRUZXhTaGFwZVswXX0sICR7cGFja2VkVGV4U2hhcGVbMV19KSk7XG4gICAgICByZXR1cm4gMiAqIChyZXNUZXhSQy54ICogJHtwYWNrZWRUZXhTaGFwZVsxXX0gKyByZXNUZXhSQy55KTtcbiAgICB9XG4gIGA7XG59XG5cbmZ1bmN0aW9uIGdldE91dHB1dDFEQ29vcmRzKFxuICAgIHNoYXBlOiBbbnVtYmVyXSwgdGV4U2hhcGU6IFtudW1iZXIsIG51bWJlcl0sXG4gICAgZW5hYmxlU2hhcGVVbmlmb3JtczogYm9vbGVhbik6IHN0cmluZyB7XG4gIGlmICh0ZXhTaGFwZVswXSA9PT0gMSkge1xuICAgIGlmIChlbmFibGVTaGFwZVVuaWZvcm1zKSB7XG4gICAgICByZXR1cm4gYFxuICAgICAgaW50IGdldE91dHB1dENvb3JkcygpIHtcbiAgICAgICAgcmV0dXJuIGludChyZXN1bHRVVi54ICogZmxvYXQob3V0VGV4U2hhcGVbMV0pKTtcbiAgICAgIH1cbiAgICBgO1xuICAgIH1cbiAgICByZXR1cm4gYFxuICAgICAgaW50IGdldE91dHB1dENvb3JkcygpIHtcbiAgICAgICAgcmV0dXJuIGludChyZXN1bHRVVi54ICogJHt0ZXhTaGFwZVsxXX0uMCk7XG4gICAgICB9XG4gICAgYDtcbiAgfVxuICBpZiAodGV4U2hhcGVbMV0gPT09IDEpIHtcbiAgICBpZiAoZW5hYmxlU2hhcGVVbmlmb3Jtcykge1xuICAgICAgcmV0dXJuIGBcbiAgICAgIGludCBnZXRPdXRwdXRDb29yZHMoKSB7XG4gICAgICAgIHJldHVybiBpbnQocmVzdWx0VVYueSAqIGZsb2F0KG91dFRleFNoYXBlWzBdKSk7XG4gICAgICB9XG4gICAgYDtcbiAgICB9XG4gICAgcmV0dXJuIGBcbiAgICAgIGludCBnZXRPdXRwdXRDb29yZHMoKSB7XG4gICAgICAgIHJldHVybiBpbnQocmVzdWx0VVYueSAqICR7dGV4U2hhcGVbMF19LjApO1xuICAgICAgfVxuICAgIGA7XG4gIH1cbiAgaWYgKGVuYWJsZVNoYXBlVW5pZm9ybXMpIHtcbiAgICByZXR1cm4gYFxuICAgIGludCBnZXRPdXRwdXRDb29yZHMoKSB7XG4gICAgICBpdmVjMiByZXNUZXhSQyA9IGl2ZWMyKHJlc3VsdFVWLnl4ICpcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmVjMihvdXRUZXhTaGFwZVswXSwgb3V0VGV4U2hhcGVbMV0pKTtcbiAgICAgIHJldHVybiByZXNUZXhSQy54ICogb3V0VGV4U2hhcGVbMV0gKyByZXNUZXhSQy55O1xuICAgIH1cbiAgYDtcbiAgfVxuICByZXR1cm4gYFxuICAgIGludCBnZXRPdXRwdXRDb29yZHMoKSB7XG4gICAgICBpdmVjMiByZXNUZXhSQyA9IGl2ZWMyKHJlc3VsdFVWLnl4ICpcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmVjMigke3RleFNoYXBlWzBdfSwgJHt0ZXhTaGFwZVsxXX0pKTtcbiAgICAgIHJldHVybiByZXNUZXhSQy54ICogJHt0ZXhTaGFwZVsxXX0gKyByZXNUZXhSQy55O1xuICAgIH1cbiAgYDtcbn1cblxuZnVuY3Rpb24gZ2V0T3V0cHV0UGFja2VkM0RDb29yZHMoXG4gICAgc2hhcGU6IFtudW1iZXIsIG51bWJlciwgbnVtYmVyXSwgdGV4U2hhcGU6IFtudW1iZXIsIG51bWJlcl0sXG4gICAgZW5hYmxlU2hhcGVVbmlmb3JtczogYm9vbGVhbik6IHN0cmluZyB7XG4gIGlmIChlbmFibGVTaGFwZVVuaWZvcm1zKSB7XG4gICAgcmV0dXJuIGBcbiAgICBpdmVjMyBnZXRPdXRwdXRDb29yZHMoKSB7XG4gICAgICBpdmVjMiBwYWNrZWRUZXhTaGFwZSA9IGl2ZWMyKGNlaWwoZmxvYXQob3V0VGV4U2hhcGVbMF0pIC8gMi4wKSwgY2VpbChmbG9hdChvdXRUZXhTaGFwZVsxXSkgLyAyLjApKTtcbiAgICAgIGludCB0ZXhlbHNJbkxvZ2ljYWxSb3cgPSBpbnQoY2VpbChmbG9hdChvdXRTaGFwZVsyXSkgLyAyLjApKTtcbiAgICAgIGludCB0ZXhlbHNJbkJhdGNoID0gdGV4ZWxzSW5Mb2dpY2FsUm93ICogaW50KGNlaWwoZmxvYXQob3V0U2hhcGVbMV0pIC8gMi4wKSk7XG4gICAgICBpdmVjMiByZXNUZXhSQyA9IGl2ZWMyKHJlc3VsdFVWLnl4ICpcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmVjMihwYWNrZWRUZXhTaGFwZVswXSwgcGFja2VkVGV4U2hhcGVbMV0pKTtcbiAgICAgIGludCBpbmRleCA9IHJlc1RleFJDLnggKiBwYWNrZWRUZXhTaGFwZVsxXSArIHJlc1RleFJDLnk7XG5cbiAgICAgIGludCBiID0gaW5kZXggLyB0ZXhlbHNJbkJhdGNoO1xuICAgICAgaW5kZXggLT0gYiAqIHRleGVsc0luQmF0Y2g7XG5cbiAgICAgIGludCByID0gMiAqIChpbmRleCAvIHRleGVsc0luTG9naWNhbFJvdyk7XG4gICAgICBpbnQgYyA9IGltb2QoaW5kZXgsIHRleGVsc0luTG9naWNhbFJvdykgKiAyO1xuXG4gICAgICByZXR1cm4gaXZlYzMoYiwgciwgYyk7XG4gICAgfVxuICBgO1xuICB9XG5cbiAgY29uc3QgcGFja2VkVGV4U2hhcGUgPVxuICAgICAgW01hdGguY2VpbCh0ZXhTaGFwZVswXSAvIDIpLCBNYXRoLmNlaWwodGV4U2hhcGVbMV0gLyAyKV07XG4gIGNvbnN0IHRleGVsc0luTG9naWNhbFJvdyA9IE1hdGguY2VpbChzaGFwZVsyXSAvIDIpO1xuICBjb25zdCB0ZXhlbHNJbkJhdGNoID0gdGV4ZWxzSW5Mb2dpY2FsUm93ICogTWF0aC5jZWlsKHNoYXBlWzFdIC8gMik7XG5cbiAgcmV0dXJuIGBcbiAgICBpdmVjMyBnZXRPdXRwdXRDb29yZHMoKSB7XG4gICAgICBpdmVjMiByZXNUZXhSQyA9IGl2ZWMyKHJlc3VsdFVWLnl4ICpcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmVjMigke3BhY2tlZFRleFNoYXBlWzBdfSwgJHtwYWNrZWRUZXhTaGFwZVsxXX0pKTtcbiAgICAgIGludCBpbmRleCA9IHJlc1RleFJDLnggKiAke3BhY2tlZFRleFNoYXBlWzFdfSArIHJlc1RleFJDLnk7XG5cbiAgICAgIGludCBiID0gaW5kZXggLyAke3RleGVsc0luQmF0Y2h9O1xuICAgICAgaW5kZXggLT0gYiAqICR7dGV4ZWxzSW5CYXRjaH07XG5cbiAgICAgIGludCByID0gMiAqIChpbmRleCAvICR7dGV4ZWxzSW5Mb2dpY2FsUm93fSk7XG4gICAgICBpbnQgYyA9IGltb2QoaW5kZXgsICR7dGV4ZWxzSW5Mb2dpY2FsUm93fSkgKiAyO1xuXG4gICAgICByZXR1cm4gaXZlYzMoYiwgciwgYyk7XG4gICAgfVxuICBgO1xufVxuXG5mdW5jdGlvbiBnZXRPdXRwdXQzRENvb3JkcyhcbiAgICBzaGFwZTogW251bWJlciwgbnVtYmVyLCBudW1iZXJdLCB0ZXhTaGFwZTogW251bWJlciwgbnVtYmVyXSxcbiAgICBlbmFibGVTaGFwZVVuaWZvcm1zOiBib29sZWFuKTogc3RyaW5nIHtcbiAgaWYgKGVuYWJsZVNoYXBlVW5pZm9ybXMpIHtcbiAgICBjb25zdCBjb29yZHNGcm9tSW5kZXhTbmlwcGV0ID1cbiAgICAgICAgc2hhZGVyX3V0aWwuZ2V0T3V0cHV0TG9naWNhbENvb3JkaW5hdGVzRnJvbUZsYXRJbmRleEJ5VW5pZm9ybShcbiAgICAgICAgICAgIFsncicsICdjJywgJ2QnXSwgc2hhcGUpO1xuXG4gICAgcmV0dXJuIGBcbiAgaXZlYzMgZ2V0T3V0cHV0Q29vcmRzKCkge1xuICAgIGl2ZWMyIHJlc1RleFJDID0gaXZlYzIocmVzdWx0VVYueXggKlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgdmVjMihvdXRUZXhTaGFwZVswXSwgb3V0VGV4U2hhcGVbMV0pKTtcbiAgICBpbnQgaW5kZXggPSByZXNUZXhSQy54ICogb3V0VGV4U2hhcGVbMV0gKyByZXNUZXhSQy55O1xuICAgICR7Y29vcmRzRnJvbUluZGV4U25pcHBldH1cbiAgICByZXR1cm4gaXZlYzMociwgYywgZCk7XG4gIH1cbmA7XG4gIH1cbiAgY29uc3QgY29vcmRzRnJvbUluZGV4U25pcHBldCA9XG4gICAgICBzaGFkZXJfdXRpbC5nZXRMb2dpY2FsQ29vcmRpbmF0ZXNGcm9tRmxhdEluZGV4KFsncicsICdjJywgJ2QnXSwgc2hhcGUpO1xuXG4gIHJldHVybiBgXG4gICAgaXZlYzMgZ2V0T3V0cHV0Q29vcmRzKCkge1xuICAgICAgaXZlYzIgcmVzVGV4UkMgPSBpdmVjMihyZXN1bHRVVi55eCAqXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZlYzIoJHt0ZXhTaGFwZVswXX0sICR7dGV4U2hhcGVbMV19KSk7XG4gICAgICBpbnQgaW5kZXggPSByZXNUZXhSQy54ICogJHt0ZXhTaGFwZVsxXX0gKyByZXNUZXhSQy55O1xuICAgICAgJHtjb29yZHNGcm9tSW5kZXhTbmlwcGV0fVxuICAgICAgcmV0dXJuIGl2ZWMzKHIsIGMsIGQpO1xuICAgIH1cbiAgYDtcbn1cblxuZnVuY3Rpb24gZ2V0T3V0cHV0UGFja2VkTkRDb29yZHMoXG4gICAgc2hhcGU6IG51bWJlcltdLCB0ZXhTaGFwZTogW251bWJlciwgbnVtYmVyXSxcbiAgICBlbmFibGVTaGFwZVVuaWZvcm1zOiBib29sZWFuKTogc3RyaW5nIHtcbiAgaWYgKGVuYWJsZVNoYXBlVW5pZm9ybXMpIHtcbiAgICAvLyBUT0RPOiBzdXBwb3J0IDVkIGFuZCA2ZFxuICAgIHJldHVybiBgXG4gICAgaXZlYzQgZ2V0T3V0cHV0Q29vcmRzKCkge1xuICAgICAgaXZlYzIgcGFja2VkVGV4U2hhcGUgPSBpdmVjMihjZWlsKGZsb2F0KG91dFRleFNoYXBlWzBdKSAvIDIuMCksIGNlaWwoZmxvYXQob3V0VGV4U2hhcGVbMV0pIC8gMi4wKSk7XG4gICAgICBpdmVjMiByZXNUZXhSQyA9IGl2ZWMyKHJlc3VsdFVWLnl4ICpcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmVjMihwYWNrZWRUZXhTaGFwZVswXSwgcGFja2VkVGV4U2hhcGVbMV0pKTtcbiAgICAgIGludCBpbmRleCA9IHJlc1RleFJDLnggKiBwYWNrZWRUZXhTaGFwZVsxXSArIHJlc1RleFJDLnk7XG5cbiAgICAgIGludCB0ZXhlbHNJbkxvZ2ljYWxSb3cgPSBpbnQoY2VpbChmbG9hdChvdXRTaGFwZVszXSkgLyAyLjApKTtcbiAgICAgIGludCB0ZXhlbHNJbkJhdGNoID0gdGV4ZWxzSW5Mb2dpY2FsUm93ICogaW50KGNlaWwoZmxvYXQob3V0U2hhcGVbMl0pIC8gMi4wKSk7XG4gICAgICBpbnQgdGV4ZWxzSW5CYXRjaE4gPSB0ZXhlbHNJbkJhdGNoICogb3V0U2hhcGVbMV07XG5cbiAgICAgIGludCBiMiA9IGluZGV4IC8gdGV4ZWxzSW5CYXRjaE47XG4gICAgICBpbmRleCAtPSBiMiAqIHRleGVsc0luQmF0Y2hOO1xuXG4gICAgICBpbnQgYiA9IGluZGV4IC8gdGV4ZWxzSW5CYXRjaDtcbiAgICAgIGluZGV4IC09IGIgKiB0ZXhlbHNJbkJhdGNoO1xuXG4gICAgICBpbnQgciA9IDIgKiAoaW5kZXggLyB0ZXhlbHNJbkxvZ2ljYWxSb3cpO1xuICAgICAgaW50IGMgPSBpbW9kKGluZGV4LCB0ZXhlbHNJbkxvZ2ljYWxSb3cpICogMjtcblxuICAgICAgcmV0dXJuIGl2ZWM0KGIyLCBiLCByLCBjKTtcbiAgICB9XG4gIGA7XG4gIH1cbiAgY29uc3QgcGFja2VkVGV4U2hhcGUgPVxuICAgICAgW01hdGguY2VpbCh0ZXhTaGFwZVswXSAvIDIpLCBNYXRoLmNlaWwodGV4U2hhcGVbMV0gLyAyKV07XG5cbiAgY29uc3QgdGV4ZWxzSW5Mb2dpY2FsUm93ID0gTWF0aC5jZWlsKHNoYXBlW3NoYXBlLmxlbmd0aCAtIDFdIC8gMik7XG4gIGNvbnN0IHRleGVsc0luQmF0Y2ggPVxuICAgICAgdGV4ZWxzSW5Mb2dpY2FsUm93ICogTWF0aC5jZWlsKHNoYXBlW3NoYXBlLmxlbmd0aCAtIDJdIC8gMik7XG4gIGxldCB0ZXhlbHNJbkJhdGNoTiA9IHRleGVsc0luQmF0Y2g7XG4gIGxldCBiYXRjaGVzID0gYGA7XG4gIGxldCBjb29yZHMgPSAnYiwgciwgYyc7XG5cbiAgZm9yIChsZXQgYiA9IDI7IGIgPCBzaGFwZS5sZW5ndGggLSAxOyBiKyspIHtcbiAgICB0ZXhlbHNJbkJhdGNoTiAqPSBzaGFwZVtzaGFwZS5sZW5ndGggLSBiIC0gMV07XG4gICAgYmF0Y2hlcyA9IGBcbiAgICAgIGludCBiJHtifSA9IGluZGV4IC8gJHt0ZXhlbHNJbkJhdGNoTn07XG4gICAgICBpbmRleCAtPSBiJHtifSAqICR7dGV4ZWxzSW5CYXRjaE59O1xuICAgIGAgKyBiYXRjaGVzO1xuICAgIGNvb3JkcyA9IGBiJHtifSwgYCArIGNvb3JkcztcbiAgfVxuXG4gIHJldHVybiBgXG4gICAgaXZlYyR7c2hhcGUubGVuZ3RofSBnZXRPdXRwdXRDb29yZHMoKSB7XG4gICAgICBpdmVjMiByZXNUZXhSQyA9IGl2ZWMyKHJlc3VsdFVWLnl4ICpcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmVjMigke3BhY2tlZFRleFNoYXBlWzBdfSwgJHtwYWNrZWRUZXhTaGFwZVsxXX0pKTtcbiAgICAgIGludCBpbmRleCA9IHJlc1RleFJDLnggKiAke3BhY2tlZFRleFNoYXBlWzFdfSArIHJlc1RleFJDLnk7XG5cbiAgICAgICR7YmF0Y2hlc31cblxuICAgICAgaW50IGIgPSBpbmRleCAvICR7dGV4ZWxzSW5CYXRjaH07XG4gICAgICBpbmRleCAtPSBiICogJHt0ZXhlbHNJbkJhdGNofTtcblxuICAgICAgaW50IHIgPSAyICogKGluZGV4IC8gJHt0ZXhlbHNJbkxvZ2ljYWxSb3d9KTtcbiAgICAgIGludCBjID0gaW1vZChpbmRleCwgJHt0ZXhlbHNJbkxvZ2ljYWxSb3d9KSAqIDI7XG5cbiAgICAgIHJldHVybiBpdmVjJHtzaGFwZS5sZW5ndGh9KCR7Y29vcmRzfSk7XG4gICAgfVxuICBgO1xufVxuXG5mdW5jdGlvbiBnZXRPdXRwdXQ0RENvb3JkcyhcbiAgICBzaGFwZTogW251bWJlciwgbnVtYmVyLCBudW1iZXIsIG51bWJlcl0sIHRleFNoYXBlOiBbbnVtYmVyLCBudW1iZXJdLFxuICAgIGVuYWJsZVNoYXBlVW5pZm9ybXM6IGJvb2xlYW4pOiBzdHJpbmcge1xuICBpZiAoZW5hYmxlU2hhcGVVbmlmb3Jtcykge1xuICAgIGNvbnN0IGNvb3Jkc0Zyb21JbmRleFNuaXBwZXQgPVxuICAgICAgICBzaGFkZXJfdXRpbC5nZXRPdXRwdXRMb2dpY2FsQ29vcmRpbmF0ZXNGcm9tRmxhdEluZGV4QnlVbmlmb3JtKFxuICAgICAgICAgICAgWydyJywgJ2MnLCAnZCcsICdkMiddLCBzaGFwZSk7XG5cbiAgICByZXR1cm4gYFxuICAgIGl2ZWM0IGdldE91dHB1dENvb3JkcygpIHtcbiAgICAgIGl2ZWMyIHJlc1RleFJDID0gaXZlYzIocmVzdWx0VVYueXggKlxuICAgICAgICB2ZWMyKG91dFRleFNoYXBlWzBdLCBvdXRUZXhTaGFwZVsxXSkpO1xuICAgICAgaW50IGluZGV4ID0gcmVzVGV4UkMueCAqIG91dFRleFNoYXBlWzFdICsgcmVzVGV4UkMueTtcbiAgICAgICR7Y29vcmRzRnJvbUluZGV4U25pcHBldH1cbiAgICAgIHJldHVybiBpdmVjNChyLCBjLCBkLCBkMik7XG4gICAgfVxuICBgO1xuICB9XG4gIGNvbnN0IGNvb3Jkc0Zyb21JbmRleFNuaXBwZXQgPSBzaGFkZXJfdXRpbC5nZXRMb2dpY2FsQ29vcmRpbmF0ZXNGcm9tRmxhdEluZGV4KFxuICAgICAgWydyJywgJ2MnLCAnZCcsICdkMiddLCBzaGFwZSk7XG5cbiAgcmV0dXJuIGBcbiAgICBpdmVjNCBnZXRPdXRwdXRDb29yZHMoKSB7XG4gICAgICBpdmVjMiByZXNUZXhSQyA9IGl2ZWMyKHJlc3VsdFVWLnl4ICpcbiAgICAgICAgdmVjMigke3RleFNoYXBlWzBdfSwgJHt0ZXhTaGFwZVsxXX0pKTtcbiAgICAgIGludCBpbmRleCA9IHJlc1RleFJDLnggKiAke3RleFNoYXBlWzFdfSArIHJlc1RleFJDLnk7XG4gICAgICAke2Nvb3Jkc0Zyb21JbmRleFNuaXBwZXR9XG4gICAgICByZXR1cm4gaXZlYzQociwgYywgZCwgZDIpO1xuICAgIH1cbiAgYDtcbn1cblxuZnVuY3Rpb24gZ2V0T3V0cHV0NURDb29yZHMoXG4gICAgc2hhcGU6IFtudW1iZXIsIG51bWJlciwgbnVtYmVyLCBudW1iZXIsIG51bWJlcl0sXG4gICAgdGV4U2hhcGU6IFtudW1iZXIsIG51bWJlcl0pOiBzdHJpbmcge1xuICBjb25zdCBjb29yZHNGcm9tSW5kZXhTbmlwcGV0ID0gc2hhZGVyX3V0aWwuZ2V0TG9naWNhbENvb3JkaW5hdGVzRnJvbUZsYXRJbmRleChcbiAgICAgIFsncicsICdjJywgJ2QnLCAnZDInLCAnZDMnXSwgc2hhcGUpO1xuXG4gIHJldHVybiBgXG4gICAgaXZlYzUgZ2V0T3V0cHV0Q29vcmRzKCkge1xuICAgICAgaXZlYzIgcmVzVGV4UkMgPSBpdmVjMihyZXN1bHRVVi55eCAqIHZlYzIoJHt0ZXhTaGFwZVswXX0sXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICR7dGV4U2hhcGVbMV19KSk7XG5cbiAgICAgIGludCBpbmRleCA9IHJlc1RleFJDLnggKiAke3RleFNoYXBlWzFdfSArIHJlc1RleFJDLnk7XG5cbiAgICAgICR7Y29vcmRzRnJvbUluZGV4U25pcHBldH1cblxuICAgICAgaXZlYzUgb3V0U2hhcGUgPSBpdmVjNShyLCBjLCBkLCBkMiwgZDMpO1xuICAgICAgcmV0dXJuIG91dFNoYXBlO1xuICAgIH1cbiAgYDtcbn1cblxuZnVuY3Rpb24gZ2V0T3V0cHV0NkRDb29yZHMoXG4gICAgc2hhcGU6IFtudW1iZXIsIG51bWJlciwgbnVtYmVyLCBudW1iZXIsIG51bWJlciwgbnVtYmVyXSxcbiAgICB0ZXhTaGFwZTogW251bWJlciwgbnVtYmVyXSk6IHN0cmluZyB7XG4gIGNvbnN0IGNvb3Jkc0Zyb21JbmRleFNuaXBwZXQgPSBzaGFkZXJfdXRpbC5nZXRMb2dpY2FsQ29vcmRpbmF0ZXNGcm9tRmxhdEluZGV4KFxuICAgICAgWydyJywgJ2MnLCAnZCcsICdkMicsICdkMycsICdkNCddLCBzaGFwZSk7XG5cbiAgcmV0dXJuIGBcbiAgICBpdmVjNiBnZXRPdXRwdXRDb29yZHMoKSB7XG4gICAgICBpdmVjMiByZXNUZXhSQyA9IGl2ZWMyKHJlc3VsdFVWLnl4ICpcbiAgICAgICAgdmVjMigke3RleFNoYXBlWzBdfSwgJHt0ZXhTaGFwZVsxXX0pKTtcbiAgICAgIGludCBpbmRleCA9IHJlc1RleFJDLnggKiAke3RleFNoYXBlWzFdfSArIHJlc1RleFJDLnk7XG5cbiAgICAgICR7Y29vcmRzRnJvbUluZGV4U25pcHBldH1cblxuICAgICAgaXZlYzYgcmVzdWx0ID0gaXZlYzYociwgYywgZCwgZDIsIGQzLCBkNCk7XG4gICAgICByZXR1cm4gcmVzdWx0O1xuICAgIH1cbiAgYDtcbn1cblxuZnVuY3Rpb24gZ2V0T3V0cHV0UGFja2VkMkRDb29yZHMoXG4gICAgc2hhcGU6IFtudW1iZXIsIG51bWJlcl0sIHRleFNoYXBlOiBbbnVtYmVyLCBudW1iZXJdLFxuICAgIGVuYWJsZVNoYXBlVW5pZm9ybXM6IGJvb2xlYW4pOiBzdHJpbmcge1xuICBjb25zdCBwYWNrZWRUZXhTaGFwZSA9XG4gICAgICBbTWF0aC5jZWlsKHRleFNoYXBlWzBdIC8gMiksIE1hdGguY2VpbCh0ZXhTaGFwZVsxXSAvIDIpXTtcbiAgaWYgKHV0aWwuYXJyYXlzRXF1YWwoc2hhcGUsIHRleFNoYXBlKSkge1xuICAgIGlmIChlbmFibGVTaGFwZVVuaWZvcm1zKSB7XG4gICAgICByZXR1cm4gYFxuICAgICAgaXZlYzIgZ2V0T3V0cHV0Q29vcmRzKCkge1xuICAgICAgICBpdmVjMiBwYWNrZWRUZXhTaGFwZSA9IGl2ZWMyKGNlaWwoZmxvYXQob3V0VGV4U2hhcGVbMF0pIC8gMi4wKSwgY2VpbChmbG9hdChvdXRUZXhTaGFwZVsxXSkgLyAyLjApKTtcbiAgICAgICAgcmV0dXJuIDIgKiBpdmVjMihyZXN1bHRVVi55eCAqIHZlYzIocGFja2VkVGV4U2hhcGVbMF0sIHBhY2tlZFRleFNoYXBlWzFdKSk7XG4gICAgICB9XG4gICAgYDtcbiAgICB9XG5cbiAgICByZXR1cm4gYFxuICAgICAgaXZlYzIgZ2V0T3V0cHV0Q29vcmRzKCkge1xuICAgICAgICByZXR1cm4gMiAqIGl2ZWMyKHJlc3VsdFVWLnl4ICogdmVjMigke3BhY2tlZFRleFNoYXBlWzBdfSwgJHtcbiAgICAgICAgcGFja2VkVGV4U2hhcGVbMV19KSk7XG4gICAgICB9XG4gICAgYDtcbiAgfVxuXG4gIC8vIHRleGVscyBuZWVkZWQgdG8gYWNjb21tb2RhdGUgYSBsb2dpY2FsIHJvd1xuICBjb25zdCB0ZXhlbHNJbkxvZ2ljYWxSb3cgPSBNYXRoLmNlaWwoc2hhcGVbMV0gLyAyKTtcblxuICAvKipcbiAgICogZ2V0T3V0cHV0Q29vcmRzXG4gICAqXG4gICAqIHJlc1RleFJDOiBUaGUgcm93cyBhbmQgY29sdW1ucyBvZiB0aGUgdGV4ZWxzLiBJZiB5b3UgbW92ZSBvdmVyIG9uZVxuICAgKiB0ZXhlbCB0byB0aGUgcmlnaHQgaW4gdGhlIHBhY2tlZCB0ZXh0dXJlLCB5b3UgYXJlIG1vdmluZyBvdmVyIG9uZSBjb2x1bW5cbiAgICogKG5vdCB0d28pLlxuICAgKlxuICAgKiBpbmRleDogVGhlIHRleGVsIGluZGV4XG4gICAqL1xuICBpZiAoZW5hYmxlU2hhcGVVbmlmb3Jtcykge1xuICAgIHJldHVybiBgXG4gICAgaXZlYzIgZ2V0T3V0cHV0Q29vcmRzKCkge1xuICAgICAgaXZlYzIgcGFja2VkVGV4U2hhcGUgPSBpdmVjMihjZWlsKGZsb2F0KG91dFRleFNoYXBlWzBdKSAvIDIuMCksIGNlaWwoZmxvYXQob3V0VGV4U2hhcGVbMV0pIC8gMi4wKSk7XG4gICAgICBpbnQgdGV4ZWxzSW5Mb2dpY2FsUm93ID0gaW50KGNlaWwoZmxvYXQob3V0U2hhcGVbMV0pIC8gMi4wKSk7XG4gICAgICBpdmVjMiByZXNUZXhSQyA9IGl2ZWMyKHJlc3VsdFVWLnl4ICpcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmVjMihwYWNrZWRUZXhTaGFwZVswXSwgcGFja2VkVGV4U2hhcGVbMV0pKTtcblxuICAgICAgaW50IGluZGV4ID0gcmVzVGV4UkMueCAqIHBhY2tlZFRleFNoYXBlWzFdICsgcmVzVGV4UkMueTtcbiAgICAgIGludCByID0gMiAqIChpbmRleCAvIHRleGVsc0luTG9naWNhbFJvdyk7XG4gICAgICBpbnQgYyA9IGltb2QoaW5kZXgsIHRleGVsc0luTG9naWNhbFJvdykgKiAyO1xuXG4gICAgICByZXR1cm4gaXZlYzIociwgYyk7XG4gICAgfVxuICBgO1xuICB9XG5cbiAgcmV0dXJuIGBcbiAgICBpdmVjMiBnZXRPdXRwdXRDb29yZHMoKSB7XG4gICAgICBpdmVjMiByZXNUZXhSQyA9IGl2ZWMyKHJlc3VsdFVWLnl4ICpcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmVjMigke3BhY2tlZFRleFNoYXBlWzBdfSwgJHtwYWNrZWRUZXhTaGFwZVsxXX0pKTtcblxuICAgICAgaW50IGluZGV4ID0gcmVzVGV4UkMueCAqICR7cGFja2VkVGV4U2hhcGVbMV19ICsgcmVzVGV4UkMueTtcbiAgICAgIGludCByID0gMiAqIChpbmRleCAvICR7dGV4ZWxzSW5Mb2dpY2FsUm93fSk7XG4gICAgICBpbnQgYyA9IGltb2QoaW5kZXgsICR7dGV4ZWxzSW5Mb2dpY2FsUm93fSkgKiAyO1xuXG4gICAgICByZXR1cm4gaXZlYzIociwgYyk7XG4gICAgfVxuICBgO1xufVxuXG5mdW5jdGlvbiBnZXRPdXRwdXQyRENvb3JkcyhcbiAgICBzaGFwZTogW251bWJlciwgbnVtYmVyXSwgdGV4U2hhcGU6IFtudW1iZXIsIG51bWJlcl0sXG4gICAgZW5hYmxlU2hhcGVVbmlmb3JtczogYm9vbGVhbik6IHN0cmluZyB7XG4gIGlmICh1dGlsLmFycmF5c0VxdWFsKHNoYXBlLCB0ZXhTaGFwZSkpIHtcbiAgICBpZiAoZW5hYmxlU2hhcGVVbmlmb3Jtcykge1xuICAgICAgcmV0dXJuIGBcbiAgICAgIGl2ZWMyIGdldE91dHB1dENvb3JkcygpIHtcbiAgICAgICAgcmV0dXJuIGl2ZWMyKHJlc3VsdFVWLnl4ICogdmVjMihvdXRUZXhTaGFwZVswXSwgb3V0VGV4U2hhcGVbMV0pKTtcbiAgICAgIH1cbiAgICBgO1xuICAgIH1cbiAgICByZXR1cm4gYFxuICAgICAgaXZlYzIgZ2V0T3V0cHV0Q29vcmRzKCkge1xuICAgICAgICByZXR1cm4gaXZlYzIocmVzdWx0VVYueXggKiB2ZWMyKCR7dGV4U2hhcGVbMF19LCAke3RleFNoYXBlWzFdfSkpO1xuICAgICAgfVxuICAgIGA7XG4gIH1cbiAgaWYgKHNoYXBlWzFdID09PSAxKSB7XG4gICAgaWYgKGVuYWJsZVNoYXBlVW5pZm9ybXMpIHtcbiAgICAgIHJldHVybiBgXG4gICAgICBpdmVjMiBnZXRPdXRwdXRDb29yZHMoKSB7XG4gICAgICAgIGl2ZWMyIHJlc1RleFJDID0gaXZlYzIocmVzdWx0VVYueXggKlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZlYzIob3V0VGV4U2hhcGVbMF0sIG91dFRleFNoYXBlWzFdKSk7XG4gICAgICAgIGludCBpbmRleCA9IHJlc1RleFJDLnggKiBvdXRUZXhTaGFwZVsxXSArIHJlc1RleFJDLnk7XG4gICAgICAgIHJldHVybiBpdmVjMihpbmRleCwgMCk7XG4gICAgICB9XG4gICAgYDtcbiAgICB9XG4gICAgcmV0dXJuIGBcbiAgICAgIGl2ZWMyIGdldE91dHB1dENvb3JkcygpIHtcbiAgICAgICAgaXZlYzIgcmVzVGV4UkMgPSBpdmVjMihyZXN1bHRVVi55eCAqXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmVjMigke3RleFNoYXBlWzBdfSwgJHt0ZXhTaGFwZVsxXX0pKTtcbiAgICAgICAgaW50IGluZGV4ID0gcmVzVGV4UkMueCAqICR7dGV4U2hhcGVbMV19ICsgcmVzVGV4UkMueTtcbiAgICAgICAgcmV0dXJuIGl2ZWMyKGluZGV4LCAwKTtcbiAgICAgIH1cbiAgICBgO1xuICB9XG4gIGlmIChzaGFwZVswXSA9PT0gMSkge1xuICAgIGlmIChlbmFibGVTaGFwZVVuaWZvcm1zKSB7XG4gICAgICByZXR1cm4gYFxuICAgICAgaXZlYzIgZ2V0T3V0cHV0Q29vcmRzKCkge1xuICAgICAgICBpdmVjMiByZXNUZXhSQyA9IGl2ZWMyKHJlc3VsdFVWLnl4ICpcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2ZWMyKG91dFRleFNoYXBlWzBdLCBvdXRUZXhTaGFwZVsxXSkpO1xuICAgICAgICBpbnQgaW5kZXggPSByZXNUZXhSQy54ICogb3V0VGV4U2hhcGVbMV0gKyByZXNUZXhSQy55O1xuICAgICAgICByZXR1cm4gaXZlYzIoMCwgaW5kZXgpO1xuICAgICAgfVxuICAgIGA7XG4gICAgfVxuICAgIHJldHVybiBgXG4gICAgICBpdmVjMiBnZXRPdXRwdXRDb29yZHMoKSB7XG4gICAgICAgIGl2ZWMyIHJlc1RleFJDID0gaXZlYzIocmVzdWx0VVYueXggKlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZlYzIoJHt0ZXhTaGFwZVswXX0sICR7dGV4U2hhcGVbMV19KSk7XG4gICAgICAgIGludCBpbmRleCA9IHJlc1RleFJDLnggKiAke3RleFNoYXBlWzFdfSArIHJlc1RleFJDLnk7XG4gICAgICAgIHJldHVybiBpdmVjMigwLCBpbmRleCk7XG4gICAgICB9XG4gICAgYDtcbiAgfVxuICBpZiAoZW5hYmxlU2hhcGVVbmlmb3Jtcykge1xuICAgIHJldHVybiBgXG4gICAgaXZlYzIgZ2V0T3V0cHV0Q29vcmRzKCkge1xuICAgICAgaXZlYzIgcmVzVGV4UkMgPSBpdmVjMihyZXN1bHRVVi55eCAqXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZlYzIob3V0VGV4U2hhcGVbMF0sIG91dFRleFNoYXBlWzFdKSk7XG4gICAgICBpbnQgaW5kZXggPSByZXNUZXhSQy54ICogb3V0VGV4U2hhcGVbMV0gKyByZXNUZXhSQy55O1xuICAgICAgaW50IHIgPSBpbmRleCAvIG91dFNoYXBlWzFdO1xuICAgICAgaW50IGMgPSBpbmRleCAtIHIgKiBvdXRTaGFwZVsxXTtcbiAgICAgIHJldHVybiBpdmVjMihyLCBjKTtcbiAgICB9XG4gIGA7XG4gIH1cbiAgcmV0dXJuIGBcbiAgICBpdmVjMiBnZXRPdXRwdXRDb29yZHMoKSB7XG4gICAgICBpdmVjMiByZXNUZXhSQyA9IGl2ZWMyKHJlc3VsdFVWLnl4ICpcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmVjMigke3RleFNoYXBlWzBdfSwgJHt0ZXhTaGFwZVsxXX0pKTtcbiAgICAgIGludCBpbmRleCA9IHJlc1RleFJDLnggKiAke3RleFNoYXBlWzFdfSArIHJlc1RleFJDLnk7XG4gICAgICBpbnQgciA9IGluZGV4IC8gJHtzaGFwZVsxXX07XG4gICAgICBpbnQgYyA9IGluZGV4IC0gciAqICR7c2hhcGVbMV19O1xuICAgICAgcmV0dXJuIGl2ZWMyKHIsIGMpO1xuICAgIH1cbiAgYDtcbn1cblxuZnVuY3Rpb24gZ2V0RmxhdE9mZnNldFVuaWZvcm1OYW1lKHRleE5hbWU6IHN0cmluZyk6IHN0cmluZyB7XG4gIHJldHVybiBgb2Zmc2V0JHt0ZXhOYW1lfWA7XG59XG5cbmZ1bmN0aW9uIGdldFBhY2tlZFNhbXBsZXJTY2FsYXIoaW5wdXRJbmZvOiBJbnB1dEluZm8pOiBzdHJpbmcge1xuICBjb25zdCB0ZXhOYW1lID0gaW5wdXRJbmZvLm5hbWU7XG4gIGNvbnN0IGZ1bmNOYW1lID0gJ2dldCcgKyB0ZXhOYW1lLmNoYXJBdCgwKS50b1VwcGVyQ2FzZSgpICsgdGV4TmFtZS5zbGljZSgxKTtcbiAgY29uc3QgZ2xzbCA9IGdldEdsc2xEaWZmZXJlbmNlcygpO1xuICByZXR1cm4gYFxuICAgIHZlYzQgJHtmdW5jTmFtZX0oKSB7XG4gICAgICByZXR1cm4gJHtnbHNsLnRleHR1cmUyRH0oJHt0ZXhOYW1lfSwgaGFsZkNSKTtcbiAgICB9XG4gIGA7XG59XG5cbmZ1bmN0aW9uIGdldFNhbXBsZXJTY2FsYXIoXG4gICAgaW5wdXRJbmZvOiBJbnB1dEluZm8sIGVuYWJsZVNoYXBlVW5pZm9ybXM6IGJvb2xlYW4pOiBzdHJpbmcge1xuICBjb25zdCB0ZXhOYW1lID0gaW5wdXRJbmZvLm5hbWU7XG4gIGNvbnN0IGZ1bmNOYW1lID0gJ2dldCcgKyB0ZXhOYW1lLmNoYXJBdCgwKS50b1VwcGVyQ2FzZSgpICsgdGV4TmFtZS5zbGljZSgxKTtcbiAgaWYgKGlucHV0SW5mby5zaGFwZUluZm8uaXNVbmlmb3JtKSB7XG4gICAgcmV0dXJuIGBmbG9hdCAke2Z1bmNOYW1lfSgpIHtyZXR1cm4gJHt0ZXhOYW1lfTt9YDtcbiAgfVxuICBjb25zdCBbdGV4TnVtUiwgdGV4TnVtQ10gPSBpbnB1dEluZm8uc2hhcGVJbmZvLnRleFNoYXBlO1xuICBpZiAodGV4TnVtUiA9PT0gMSAmJiB0ZXhOdW1DID09PSAxKSB7XG4gICAgcmV0dXJuIGBcbiAgICAgIGZsb2F0ICR7ZnVuY05hbWV9KCkge1xuICAgICAgICByZXR1cm4gc2FtcGxlVGV4dHVyZSgke3RleE5hbWV9LCBoYWxmQ1IpO1xuICAgICAgfVxuICAgIGA7XG4gIH1cblxuICBjb25zdCBvZmZzZXQgPSBnZXRGbGF0T2Zmc2V0VW5pZm9ybU5hbWUodGV4TmFtZSk7XG4gIGlmIChlbmFibGVTaGFwZVVuaWZvcm1zKSB7XG4gICAgcmV0dXJuIGBcbiAgICBmbG9hdCAke2Z1bmNOYW1lfSgpIHtcbiAgICAgIHZlYzIgdXYgPSB1dkZyb21GbGF0KCR7dGV4TmFtZX1UZXhTaGFwZVswXSwgJHt0ZXhOYW1lfVRleFNoYXBlWzFdLCAke1xuICAgICAgICBvZmZzZXR9KTtcbiAgICAgIHJldHVybiBzYW1wbGVUZXh0dXJlKCR7dGV4TmFtZX0sIHV2KTtcbiAgICB9XG4gIGA7XG4gIH1cblxuICBjb25zdCBbdE51bVIsIHROdW1DXSA9IGlucHV0SW5mby5zaGFwZUluZm8udGV4U2hhcGU7XG4gIHJldHVybiBgXG4gICAgZmxvYXQgJHtmdW5jTmFtZX0oKSB7XG4gICAgICB2ZWMyIHV2ID0gdXZGcm9tRmxhdCgke3ROdW1SfSwgJHt0TnVtQ30sICR7b2Zmc2V0fSk7XG4gICAgICByZXR1cm4gc2FtcGxlVGV4dHVyZSgke3RleE5hbWV9LCB1dik7XG4gICAgfVxuICBgO1xufVxuXG5mdW5jdGlvbiBnZXRQYWNrZWRTYW1wbGVyMUQoXG4gICAgaW5wdXRJbmZvOiBJbnB1dEluZm8sIGVuYWJsZVNoYXBlVW5pZm9ybXM6IGJvb2xlYW4pOiBzdHJpbmcge1xuICBjb25zdCB0ZXhOYW1lID0gaW5wdXRJbmZvLm5hbWU7XG4gIGNvbnN0IGZ1bmNOYW1lID0gJ2dldCcgKyB0ZXhOYW1lLmNoYXJBdCgwKS50b1VwcGVyQ2FzZSgpICsgdGV4TmFtZS5zbGljZSgxKTtcbiAgY29uc3QgdGV4U2hhcGUgPSBpbnB1dEluZm8uc2hhcGVJbmZvLnRleFNoYXBlO1xuICBjb25zdCBnbHNsID0gZ2V0R2xzbERpZmZlcmVuY2VzKCk7XG4gIGlmIChlbmFibGVTaGFwZVVuaWZvcm1zKSB7XG4gICAgcmV0dXJuIGBcbiAgICB2ZWM0ICR7ZnVuY05hbWV9KGludCBpbmRleCkge1xuICAgICAgaXZlYzIgcGFja2VkVGV4U2hhcGUgPSBpdmVjMihjZWlsKGZsb2F0KCR7XG4gICAgICAgIHRleE5hbWV9VGV4U2hhcGVbMF0pIC8gMi4wKSwgY2VpbChmbG9hdCgke3RleE5hbWV9VGV4U2hhcGVbMV0pIC8gMi4wKSk7XG4gICAgICB2ZWMyIHV2ID0gcGFja2VkVVZmcm9tMUQoXG4gICAgICAgIHBhY2tlZFRleFNoYXBlWzBdLCBwYWNrZWRUZXhTaGFwZVsxXSwgaW5kZXgpO1xuICAgICAgcmV0dXJuICR7Z2xzbC50ZXh0dXJlMkR9KCR7dGV4TmFtZX0sIHV2KTtcbiAgICB9XG4gIGA7XG4gIH1cbiAgY29uc3QgcGFja2VkVGV4U2hhcGUgPVxuICAgICAgW01hdGguY2VpbCh0ZXhTaGFwZVswXSAvIDIpLCBNYXRoLmNlaWwodGV4U2hhcGVbMV0gLyAyKV07XG4gIHJldHVybiBgXG4gICAgdmVjNCAke2Z1bmNOYW1lfShpbnQgaW5kZXgpIHtcbiAgICAgIHZlYzIgdXYgPSBwYWNrZWRVVmZyb20xRChcbiAgICAgICAgJHtwYWNrZWRUZXhTaGFwZVswXX0sICR7cGFja2VkVGV4U2hhcGVbMV19LCBpbmRleCk7XG4gICAgICByZXR1cm4gJHtnbHNsLnRleHR1cmUyRH0oJHt0ZXhOYW1lfSwgdXYpO1xuICAgIH1cbiAgYDtcbn1cblxuZnVuY3Rpb24gZ2V0U2FtcGxlcjFEKFxuICAgIGlucHV0SW5mbzogSW5wdXRJbmZvLCBlbmFibGVTaGFwZVVuaWZvcm1zOiBib29sZWFuKTogc3RyaW5nIHtcbiAgY29uc3QgdGV4TmFtZSA9IGlucHV0SW5mby5uYW1lO1xuICBjb25zdCBmdW5jTmFtZSA9ICdnZXQnICsgdGV4TmFtZS5jaGFyQXQoMCkudG9VcHBlckNhc2UoKSArIHRleE5hbWUuc2xpY2UoMSk7XG5cbiAgaWYgKGlucHV0SW5mby5zaGFwZUluZm8uaXNVbmlmb3JtKSB7XG4gICAgLy8gVW5pZm9ybSBhcnJheXMgd2lsbCBiZSBsZXNzIHRoYW4gNjU1MDUgKG5vIHJpc2sgb2YgZmxvYXQxNiBvdmVyZmxvdykuXG4gICAgcmV0dXJuIGBcbiAgICAgIGZsb2F0ICR7ZnVuY05hbWV9KGludCBpbmRleCkge1xuICAgICAgICAke2dldFVuaWZvcm1TYW1wbGVyKGlucHV0SW5mbyl9XG4gICAgICB9XG4gICAgYDtcbiAgfVxuXG4gIGNvbnN0IHRleFNoYXBlID0gaW5wdXRJbmZvLnNoYXBlSW5mby50ZXhTaGFwZTtcbiAgY29uc3QgdE51bVIgPSB0ZXhTaGFwZVswXTtcbiAgY29uc3QgdE51bUMgPSB0ZXhTaGFwZVsxXTtcblxuICBpZiAodE51bUMgPT09IDEgJiYgdE51bVIgPT09IDEpIHtcbiAgICByZXR1cm4gYFxuICAgICAgZmxvYXQgJHtmdW5jTmFtZX0oaW50IGluZGV4KSB7XG4gICAgICAgIHJldHVybiBzYW1wbGVUZXh0dXJlKCR7dGV4TmFtZX0sIGhhbGZDUik7XG4gICAgICB9XG4gICAgYDtcbiAgfVxuICBjb25zdCBvZmZzZXQgPSBnZXRGbGF0T2Zmc2V0VW5pZm9ybU5hbWUodGV4TmFtZSk7XG4gIGlmICh0TnVtQyA9PT0gMSkge1xuICAgIGlmIChlbmFibGVTaGFwZVVuaWZvcm1zKSB7XG4gICAgICByZXR1cm4gYFxuICAgICAgZmxvYXQgJHtmdW5jTmFtZX0oaW50IGluZGV4KSB7XG4gICAgICAgIHZlYzIgdXYgPSB2ZWMyKDAuNSwgKGZsb2F0KGluZGV4ICsgJHtvZmZzZXR9KSArIDAuNSkgLyBmbG9hdCgke1xuICAgICAgICAgIHRleE5hbWV9VGV4U2hhcGVbMF0pKTtcbiAgICAgICAgcmV0dXJuIHNhbXBsZVRleHR1cmUoJHt0ZXhOYW1lfSwgdXYpO1xuICAgICAgfVxuICAgIGA7XG4gICAgfVxuXG4gICAgcmV0dXJuIGBcbiAgICAgIGZsb2F0ICR7ZnVuY05hbWV9KGludCBpbmRleCkge1xuICAgICAgICB2ZWMyIHV2ID0gdmVjMigwLjUsIChmbG9hdChpbmRleCArICR7b2Zmc2V0fSkgKyAwLjUpIC8gJHt0TnVtUn0uMCk7XG4gICAgICAgIHJldHVybiBzYW1wbGVUZXh0dXJlKCR7dGV4TmFtZX0sIHV2KTtcbiAgICAgIH1cbiAgICBgO1xuICB9XG4gIGlmICh0TnVtUiA9PT0gMSkge1xuICAgIGlmIChlbmFibGVTaGFwZVVuaWZvcm1zKSB7XG4gICAgICByZXR1cm4gYFxuICAgICAgZmxvYXQgJHtmdW5jTmFtZX0oaW50IGluZGV4KSB7XG4gICAgICAgIHZlYzIgdXYgPSB2ZWMyKChmbG9hdChpbmRleCArICR7b2Zmc2V0fSkgKyAwLjUpIC8gZmxvYXQoJHtcbiAgICAgICAgICB0ZXhOYW1lfVRleFNoYXBlWzFdKSwgMC41KTtcbiAgICAgICAgcmV0dXJuIHNhbXBsZVRleHR1cmUoJHt0ZXhOYW1lfSwgdXYpO1xuICAgICAgfVxuICAgIGA7XG4gICAgfVxuXG4gICAgcmV0dXJuIGBcbiAgICAgIGZsb2F0ICR7ZnVuY05hbWV9KGludCBpbmRleCkge1xuICAgICAgICB2ZWMyIHV2ID0gdmVjMigoZmxvYXQoaW5kZXggKyAke29mZnNldH0pICsgMC41KSAvICR7dE51bUN9LjAsIDAuNSk7XG4gICAgICAgIHJldHVybiBzYW1wbGVUZXh0dXJlKCR7dGV4TmFtZX0sIHV2KTtcbiAgICAgIH1cbiAgICBgO1xuICB9XG5cbiAgaWYgKGVuYWJsZVNoYXBlVW5pZm9ybXMpIHtcbiAgICByZXR1cm4gYFxuICAgIGZsb2F0ICR7ZnVuY05hbWV9KGludCBpbmRleCkge1xuICAgICAgdmVjMiB1diA9IHV2RnJvbUZsYXQoJHt0ZXhOYW1lfVRleFNoYXBlWzBdLCAke1xuICAgICAgICB0ZXhOYW1lfVRleFNoYXBlWzFdLCBpbmRleCArICR7b2Zmc2V0fSk7XG4gICAgICByZXR1cm4gc2FtcGxlVGV4dHVyZSgke3RleE5hbWV9LCB1dik7XG4gICAgfVxuICBgO1xuICB9XG5cbiAgcmV0dXJuIGBcbiAgICBmbG9hdCAke2Z1bmNOYW1lfShpbnQgaW5kZXgpIHtcbiAgICAgIHZlYzIgdXYgPSB1dkZyb21GbGF0KCR7dE51bVJ9LCAke3ROdW1DfSwgaW5kZXggKyAke29mZnNldH0pO1xuICAgICAgcmV0dXJuIHNhbXBsZVRleHR1cmUoJHt0ZXhOYW1lfSwgdXYpO1xuICAgIH1cbiAgYDtcbn1cblxuZnVuY3Rpb24gZ2V0UGFja2VkU2FtcGxlcjJEKFxuICAgIGlucHV0SW5mbzogSW5wdXRJbmZvLCBlbmFibGVTaGFwZVVuaWZvcm1zOiBib29sZWFuKTogc3RyaW5nIHtcbiAgY29uc3Qgc2hhcGUgPSBpbnB1dEluZm8uc2hhcGVJbmZvLmxvZ2ljYWxTaGFwZTtcbiAgY29uc3QgdGV4TmFtZSA9IGlucHV0SW5mby5uYW1lO1xuICBjb25zdCBmdW5jTmFtZSA9ICdnZXQnICsgdGV4TmFtZS5jaGFyQXQoMCkudG9VcHBlckNhc2UoKSArIHRleE5hbWUuc2xpY2UoMSk7XG4gIGNvbnN0IHRleFNoYXBlID0gaW5wdXRJbmZvLnNoYXBlSW5mby50ZXhTaGFwZTtcblxuICBjb25zdCB0ZXhOdW1SID0gdGV4U2hhcGVbMF07XG4gIGNvbnN0IHRleE51bUMgPSB0ZXhTaGFwZVsxXTtcbiAgY29uc3QgZ2xzbCA9IGdldEdsc2xEaWZmZXJlbmNlcygpO1xuICBpZiAodGV4U2hhcGUgIT0gbnVsbCAmJiB1dGlsLmFycmF5c0VxdWFsKHNoYXBlLCB0ZXhTaGFwZSkpIHtcbiAgICBpZiAoZW5hYmxlU2hhcGVVbmlmb3Jtcykge1xuICAgICAgcmV0dXJuIGBcbiAgICAgIHZlYzQgJHtmdW5jTmFtZX0oaW50IHJvdywgaW50IGNvbCkge1xuICAgICAgICB2ZWMyIHV2ID0gKHZlYzIoY29sLCByb3cpICsgaGFsZkNSKSAvIHZlYzIoJHt0ZXhOYW1lfVRleFNoYXBlWzFdLCAke1xuICAgICAgICAgIHRleE5hbWV9VGV4U2hhcGVbMF0pO1xuXG4gICAgICAgIHJldHVybiAke2dsc2wudGV4dHVyZTJEfSgke3RleE5hbWV9LCB1dik7XG4gICAgICB9XG4gICAgYDtcbiAgICB9XG4gICAgcmV0dXJuIGBcbiAgICAgIHZlYzQgJHtmdW5jTmFtZX0oaW50IHJvdywgaW50IGNvbCkge1xuICAgICAgICB2ZWMyIHV2ID0gKHZlYzIoY29sLCByb3cpICsgaGFsZkNSKSAvIHZlYzIoJHt0ZXhOdW1DfS4wLCAke3RleE51bVJ9LjApO1xuXG4gICAgICAgIHJldHVybiAke2dsc2wudGV4dHVyZTJEfSgke3RleE5hbWV9LCB1dik7XG4gICAgICB9XG4gICAgYDtcbiAgfVxuXG4gIGlmIChlbmFibGVTaGFwZVVuaWZvcm1zKSB7XG4gICAgcmV0dXJuIGBcbiAgICB2ZWM0ICR7ZnVuY05hbWV9KGludCByb3csIGludCBjb2wpIHtcbiAgICAgIGl2ZWMyIHBhY2tlZFRleFNoYXBlID0gaXZlYzIoY2VpbChmbG9hdCgke1xuICAgICAgICB0ZXhOYW1lfVRleFNoYXBlWzBdKSAvIDIuMCksIGNlaWwoZmxvYXQoJHt0ZXhOYW1lfVRleFNoYXBlWzFdKSAvIDIuMCkpO1xuICAgICAgaW50IHZhbHVlc1BlclJvdyA9IGludChjZWlsKGZsb2F0KCR7dGV4TmFtZX1TaGFwZVsxXSkgLyAyLjApKTtcbiAgICAgIHZlYzIgdXYgPSBwYWNrZWRVVmZyb20yRCh2YWx1ZXNQZXJSb3csIHBhY2tlZFRleFNoYXBlWzBdLCBwYWNrZWRUZXhTaGFwZVsxXSwgcm93LCBjb2wpO1xuICAgICAgcmV0dXJuICR7Z2xzbC50ZXh0dXJlMkR9KCR7dGV4TmFtZX0sIHV2KTtcbiAgICB9XG4gIGA7XG4gIH1cbiAgY29uc3QgcGFja2VkVGV4U2hhcGUgPVxuICAgICAgW01hdGguY2VpbCh0ZXhTaGFwZVswXSAvIDIpLCBNYXRoLmNlaWwodGV4U2hhcGVbMV0gLyAyKV07XG4gIGNvbnN0IHZhbHVlc1BlclJvdyA9IE1hdGguY2VpbChzaGFwZVsxXSAvIDIpO1xuXG4gIHJldHVybiBgXG4gICAgdmVjNCAke2Z1bmNOYW1lfShpbnQgcm93LCBpbnQgY29sKSB7XG4gICAgICB2ZWMyIHV2ID0gcGFja2VkVVZmcm9tMkQoJHt2YWx1ZXNQZXJSb3d9LCAke3BhY2tlZFRleFNoYXBlWzBdfSwgJHtcbiAgICAgIHBhY2tlZFRleFNoYXBlWzFdfSwgcm93LCBjb2wpO1xuICAgICAgcmV0dXJuICR7Z2xzbC50ZXh0dXJlMkR9KCR7dGV4TmFtZX0sIHV2KTtcbiAgICB9XG4gIGA7XG59XG5cbmZ1bmN0aW9uIGdldFNhbXBsZXIyRChcbiAgICBpbnB1dEluZm86IElucHV0SW5mbywgZW5hYmxlU2hhcGVVbmlmb3JtczogYm9vbGVhbik6IHN0cmluZyB7XG4gIGNvbnN0IHNoYXBlID0gaW5wdXRJbmZvLnNoYXBlSW5mby5sb2dpY2FsU2hhcGU7XG4gIGNvbnN0IHRleE5hbWUgPSBpbnB1dEluZm8ubmFtZTtcbiAgY29uc3QgZnVuY05hbWUgPSAnZ2V0JyArIHRleE5hbWUuY2hhckF0KDApLnRvVXBwZXJDYXNlKCkgKyB0ZXhOYW1lLnNsaWNlKDEpO1xuICBjb25zdCB0ZXhTaGFwZSA9IGlucHV0SW5mby5zaGFwZUluZm8udGV4U2hhcGU7XG5cbiAgaWYgKHRleFNoYXBlICE9IG51bGwgJiYgdXRpbC5hcnJheXNFcXVhbChzaGFwZSwgdGV4U2hhcGUpKSB7XG4gICAgaWYgKGVuYWJsZVNoYXBlVW5pZm9ybXMpIHtcbiAgICAgIHJldHVybiBgXG4gICAgICBmbG9hdCAke2Z1bmNOYW1lfShpbnQgcm93LCBpbnQgY29sKSB7XG4gICAgICAgIHZlYzIgdXYgPSAodmVjMihjb2wsIHJvdykgKyBoYWxmQ1IpIC8gdmVjMigke3RleE5hbWV9VGV4U2hhcGVbMV0sICR7XG4gICAgICAgICAgdGV4TmFtZX1UZXhTaGFwZVswXSk7XG4gICAgICAgIHJldHVybiBzYW1wbGVUZXh0dXJlKCR7dGV4TmFtZX0sIHV2KTtcbiAgICAgIH1cbiAgICBgO1xuICAgIH1cblxuICAgIGNvbnN0IHRleE51bVIgPSB0ZXhTaGFwZVswXTtcbiAgICBjb25zdCB0ZXhOdW1DID0gdGV4U2hhcGVbMV07XG4gICAgcmV0dXJuIGBcbiAgICBmbG9hdCAke2Z1bmNOYW1lfShpbnQgcm93LCBpbnQgY29sKSB7XG4gICAgICB2ZWMyIHV2ID0gKHZlYzIoY29sLCByb3cpICsgaGFsZkNSKSAvIHZlYzIoJHt0ZXhOdW1DfS4wLCAke3RleE51bVJ9LjApO1xuICAgICAgcmV0dXJuIHNhbXBsZVRleHR1cmUoJHt0ZXhOYW1lfSwgdXYpO1xuICAgIH1cbiAgYDtcbiAgfVxuXG4gIGNvbnN0IHtuZXdTaGFwZSwga2VwdERpbXN9ID0gdXRpbC5zcXVlZXplU2hhcGUoc2hhcGUpO1xuICBjb25zdCBzcXVlZXplZFNoYXBlID0gbmV3U2hhcGU7XG4gIGlmIChzcXVlZXplZFNoYXBlLmxlbmd0aCA8IHNoYXBlLmxlbmd0aCkge1xuICAgIGNvbnN0IG5ld0lucHV0SW5mbyA9IHNxdWVlemVJbnB1dEluZm8oaW5wdXRJbmZvLCBzcXVlZXplZFNoYXBlKTtcbiAgICBjb25zdCBwYXJhbXMgPSBbJ3JvdycsICdjb2wnXTtcbiAgICByZXR1cm4gYFxuICAgICAgJHtnZXRTYW1wbGVyRnJvbUluSW5mbyhuZXdJbnB1dEluZm8sIGVuYWJsZVNoYXBlVW5pZm9ybXMpfVxuICAgICAgZmxvYXQgJHtmdW5jTmFtZX0oaW50IHJvdywgaW50IGNvbCkge1xuICAgICAgICByZXR1cm4gJHtmdW5jTmFtZX0oJHtnZXRTcXVlZXplZFBhcmFtcyhwYXJhbXMsIGtlcHREaW1zKX0pO1xuICAgICAgfVxuICAgIGA7XG4gIH1cblxuICBpZiAoaW5wdXRJbmZvLnNoYXBlSW5mby5pc1VuaWZvcm0pIHtcbiAgICAvLyBVbmlmb3JtIGFycmF5cyB3aWxsIGJlIGxlc3MgdGhhbiA2NTUwNSAobm8gcmlzayBvZiBmbG9hdDE2IG92ZXJmbG93KS5cbiAgICByZXR1cm4gYFxuICAgICAgZmxvYXQgJHtmdW5jTmFtZX0oaW50IHJvdywgaW50IGNvbCkge1xuICAgICAgICBpbnQgaW5kZXggPSByb3VuZChkb3QodmVjMihyb3csIGNvbCksIHZlYzIoJHtzaGFwZVsxXX0sIDEpKSk7XG4gICAgICAgICR7Z2V0VW5pZm9ybVNhbXBsZXIoaW5wdXRJbmZvKX1cbiAgICAgIH1cbiAgICBgO1xuICB9XG5cbiAgY29uc3QgdGV4TnVtUiA9IHRleFNoYXBlWzBdO1xuICBjb25zdCB0ZXhOdW1DID0gdGV4U2hhcGVbMV07XG4gIGNvbnN0IG9mZnNldCA9IGdldEZsYXRPZmZzZXRVbmlmb3JtTmFtZSh0ZXhOYW1lKTtcbiAgaWYgKHRleE51bUMgPT09IDEpIHtcbiAgICAvLyBpbmRleCBpcyB1c2VkIGRpcmVjdGx5IGFzIHBoeXNpY2FsIChubyByaXNrIG9mIGZsb2F0MTYgb3ZlcmZsb3cpLlxuICAgIGlmIChlbmFibGVTaGFwZVVuaWZvcm1zKSB7XG4gICAgICByZXR1cm4gYFxuICAgICAgZmxvYXQgJHtmdW5jTmFtZX0oaW50IHJvdywgaW50IGNvbCkge1xuICAgICAgICBmbG9hdCBpbmRleCA9IGRvdCh2ZWMzKHJvdywgY29sLCAke29mZnNldH0pLCB2ZWMzKCR7XG4gICAgICAgICAgdGV4TmFtZX1TaGFwZVsxXSwgMSwgMSkpO1xuICAgICAgICB2ZWMyIHV2ID0gdmVjMigwLjUsIChpbmRleCArIDAuNSkgLyBmbG9hdCgke3RleE5hbWV9VGV4U2hhcGVbMF0pKTtcbiAgICAgICAgcmV0dXJuIHNhbXBsZVRleHR1cmUoJHt0ZXhOYW1lfSwgdXYpO1xuICAgICAgfVxuICAgIGA7XG4gICAgfVxuICAgIHJldHVybiBgXG4gICAgZmxvYXQgJHtmdW5jTmFtZX0oaW50IHJvdywgaW50IGNvbCkge1xuICAgICAgZmxvYXQgaW5kZXggPSBkb3QodmVjMyhyb3csIGNvbCwgJHtvZmZzZXR9KSwgdmVjMygke3NoYXBlWzFdfSwgMSwgMSkpO1xuICAgICAgdmVjMiB1diA9IHZlYzIoMC41LCAoaW5kZXggKyAwLjUpIC8gJHt0ZXhOdW1SfS4wKTtcbiAgICAgIHJldHVybiBzYW1wbGVUZXh0dXJlKCR7dGV4TmFtZX0sIHV2KTtcbiAgICB9XG4gIGA7XG4gIH1cbiAgaWYgKHRleE51bVIgPT09IDEpIHtcbiAgICAvLyBpbmRleCBpcyB1c2VkIGRpcmVjdGx5IGFzIHBoeXNpY2FsIChubyByaXNrIG9mIGZsb2F0MTYgb3ZlcmZsb3cpLlxuICAgIGlmIChlbmFibGVTaGFwZVVuaWZvcm1zKSB7XG4gICAgICByZXR1cm4gYFxuICAgICAgZmxvYXQgJHtmdW5jTmFtZX0oaW50IHJvdywgaW50IGNvbCkge1xuICAgICAgICBmbG9hdCBpbmRleCA9IGRvdCh2ZWMzKHJvdywgY29sLCAke29mZnNldH0pLCB2ZWMzKCR7XG4gICAgICAgICAgdGV4TmFtZX1TaGFwZVsxXSwgMSwgMSkpO1xuICAgICAgICB2ZWMyIHV2ID0gdmVjMigoaW5kZXggKyAwLjUpIC8gZmxvYXQoJHt0ZXhOYW1lfVRleFNoYXBlWzFdKSwgMC41KTtcbiAgICAgICAgcmV0dXJuIHNhbXBsZVRleHR1cmUoJHt0ZXhOYW1lfSwgdXYpO1xuICAgICAgfVxuICAgIGA7XG4gICAgfVxuICAgIHJldHVybiBgXG4gICAgZmxvYXQgJHtmdW5jTmFtZX0oaW50IHJvdywgaW50IGNvbCkge1xuICAgICAgZmxvYXQgaW5kZXggPSBkb3QodmVjMyhyb3csIGNvbCwgJHtvZmZzZXR9KSwgdmVjMygke3NoYXBlWzFdfSwgMSwgMSkpO1xuICAgICAgdmVjMiB1diA9IHZlYzIoKGluZGV4ICsgMC41KSAvICR7dGV4TnVtQ30uMCwgMC41KTtcbiAgICAgIHJldHVybiBzYW1wbGVUZXh0dXJlKCR7dGV4TmFtZX0sIHV2KTtcbiAgICB9XG4gIGA7XG4gIH1cblxuICBpZiAoZW5hYmxlU2hhcGVVbmlmb3Jtcykge1xuICAgIHJldHVybiBgXG4gICAgICBmbG9hdCAke2Z1bmNOYW1lfShpbnQgcm93LCBpbnQgY29sKSB7XG4gICAgICAgIC8vIEV4cGxpY2l0bHkgdXNlIGludGVnZXIgb3BlcmF0aW9ucyBhcyBkb3QoKSBvbmx5IHdvcmtzIG9uIGZsb2F0cy5cbiAgICAgICAgaW50IGluZGV4ID0gcm93ICogJHt0ZXhOYW1lfVNoYXBlWzFdICsgY29sICsgJHtvZmZzZXR9O1xuICAgICAgICB2ZWMyIHV2ID0gdXZGcm9tRmxhdCgke3RleE5hbWV9VGV4U2hhcGVbMF0sICR7XG4gICAgICAgIHRleE5hbWV9VGV4U2hhcGVbMV0sIGluZGV4KTtcbiAgICAgICAgcmV0dXJuIHNhbXBsZVRleHR1cmUoJHt0ZXhOYW1lfSwgdXYpO1xuICAgICAgfVxuICAgIGA7XG4gIH1cbiAgcmV0dXJuIGBcbiAgZmxvYXQgJHtmdW5jTmFtZX0oaW50IHJvdywgaW50IGNvbCkge1xuICAgIC8vIEV4cGxpY2l0bHkgdXNlIGludGVnZXIgb3BlcmF0aW9ucyBhcyBkb3QoKSBvbmx5IHdvcmtzIG9uIGZsb2F0cy5cbiAgICBpbnQgaW5kZXggPSByb3cgKiAke3NoYXBlWzFdfSArIGNvbCArICR7b2Zmc2V0fTtcbiAgICB2ZWMyIHV2ID0gdXZGcm9tRmxhdCgke3RleE51bVJ9LCAke3RleE51bUN9LCBpbmRleCk7XG4gICAgcmV0dXJuIHNhbXBsZVRleHR1cmUoJHt0ZXhOYW1lfSwgdXYpO1xuICB9XG5gO1xufVxuXG5mdW5jdGlvbiBnZXRQYWNrZWRTYW1wbGVyM0QoXG4gICAgaW5wdXRJbmZvOiBJbnB1dEluZm8sIGVuYWJsZVNoYXBlVW5pZm9ybXM6IGJvb2xlYW4pOiBzdHJpbmcge1xuICBjb25zdCBzaGFwZSA9IGlucHV0SW5mby5zaGFwZUluZm8ubG9naWNhbFNoYXBlO1xuICBjb25zdCB0ZXhOYW1lID0gaW5wdXRJbmZvLm5hbWU7XG4gIGNvbnN0IGZ1bmNOYW1lID0gJ2dldCcgKyB0ZXhOYW1lLmNoYXJBdCgwKS50b1VwcGVyQ2FzZSgpICsgdGV4TmFtZS5zbGljZSgxKTtcbiAgY29uc3QgdGV4U2hhcGUgPSBpbnB1dEluZm8uc2hhcGVJbmZvLnRleFNoYXBlO1xuICBjb25zdCBwYWNrZWRUZXhTaGFwZSA9XG4gICAgICBbTWF0aC5jZWlsKHRleFNoYXBlWzBdIC8gMiksIE1hdGguY2VpbCh0ZXhTaGFwZVsxXSAvIDIpXTtcblxuICBpZiAoc2hhcGVbMF0gPT09IDEpIHtcbiAgICBjb25zdCBzcXVlZXplZFNoYXBlID0gc2hhcGUuc2xpY2UoMSk7XG4gICAgY29uc3Qga2VwdERpbXMgPSBbMSwgMl07XG4gICAgY29uc3QgbmV3SW5wdXRJbmZvID0gc3F1ZWV6ZUlucHV0SW5mbyhpbnB1dEluZm8sIHNxdWVlemVkU2hhcGUpO1xuICAgIGNvbnN0IHBhcmFtcyA9IFsnYicsICdyb3cnLCAnY29sJ107XG4gICAgcmV0dXJuIGBcbiAgICAgICAgJHtnZXRQYWNrZWRTYW1wbGVyRnJvbUluSW5mbyhuZXdJbnB1dEluZm8sIGVuYWJsZVNoYXBlVW5pZm9ybXMpfVxuICAgICAgICB2ZWM0ICR7ZnVuY05hbWV9KGludCBiLCBpbnQgcm93LCBpbnQgY29sKSB7XG4gICAgICAgICAgcmV0dXJuICR7ZnVuY05hbWV9KCR7Z2V0U3F1ZWV6ZWRQYXJhbXMocGFyYW1zLCBrZXB0RGltcyl9KTtcbiAgICAgICAgfVxuICAgICAgYDtcbiAgfVxuXG4gIGNvbnN0IGdsc2wgPSBnZXRHbHNsRGlmZmVyZW5jZXMoKTtcbiAgaWYgKGVuYWJsZVNoYXBlVW5pZm9ybXMpIHtcbiAgICByZXR1cm4gYFxuICAgIHZlYzQgJHtmdW5jTmFtZX0oaW50IGIsIGludCByb3csIGludCBjb2wpIHtcbiAgICAgIGl2ZWMyIHBhY2tlZFRleFNoYXBlID0gaXZlYzIoY2VpbChmbG9hdCgke1xuICAgICAgICB0ZXhOYW1lfVRleFNoYXBlWzBdKSAvIDIuMCksIGNlaWwoZmxvYXQoJHt0ZXhOYW1lfVRleFNoYXBlWzFdKSAvIDIuMCkpO1xuICAgICAgaW50IHZhbHVlc1BlclJvdyA9IGludChjZWlsKGZsb2F0KCR7dGV4TmFtZX1TaGFwZVsyXSkgLyAyLjApKTtcbiAgICAgIGludCB0ZXhlbHNJbkJhdGNoID0gdmFsdWVzUGVyUm93ICogaW50KGNlaWwoZmxvYXQoJHtcbiAgICAgICAgdGV4TmFtZX1TaGFwZVsxXSkgLyAyLjApKTtcbiAgICAgIHZlYzIgdXYgPSBwYWNrZWRVVmZyb20zRChcbiAgICAgICAgcGFja2VkVGV4U2hhcGVbMF0sIHBhY2tlZFRleFNoYXBlWzFdLCB0ZXhlbHNJbkJhdGNoLCB2YWx1ZXNQZXJSb3csIGIsIHJvdywgY29sKTtcbiAgICAgIHJldHVybiAke2dsc2wudGV4dHVyZTJEfSgke3RleE5hbWV9LCB1dik7XG4gICAgfVxuICBgO1xuICB9XG5cbiAgY29uc3QgdGV4TnVtUiA9IHBhY2tlZFRleFNoYXBlWzBdO1xuICBjb25zdCB0ZXhOdW1DID0gcGFja2VkVGV4U2hhcGVbMV07XG5cbiAgY29uc3QgdmFsdWVzUGVyUm93ID0gTWF0aC5jZWlsKHNoYXBlWzJdIC8gMik7XG4gIGNvbnN0IHRleGVsc0luQmF0Y2ggPSB2YWx1ZXNQZXJSb3cgKiBNYXRoLmNlaWwoc2hhcGVbMV0gLyAyKTtcblxuICByZXR1cm4gYFxuICAgIHZlYzQgJHtmdW5jTmFtZX0oaW50IGIsIGludCByb3csIGludCBjb2wpIHtcbiAgICAgIHZlYzIgdXYgPSBwYWNrZWRVVmZyb20zRChcbiAgICAgICAgJHt0ZXhOdW1SfSwgJHt0ZXhOdW1DfSwgJHt0ZXhlbHNJbkJhdGNofSwgJHt2YWx1ZXNQZXJSb3d9LCBiLCByb3csIGNvbCk7XG4gICAgICByZXR1cm4gJHtnbHNsLnRleHR1cmUyRH0oJHt0ZXhOYW1lfSwgdXYpO1xuICAgIH1cbiAgYDtcbn1cblxuZnVuY3Rpb24gZ2V0U2FtcGxlcjNEKFxuICAgIGlucHV0SW5mbzogSW5wdXRJbmZvLCBlbmFibGVTaGFwZVVuaWZvcm1zOiBib29sZWFuKTogc3RyaW5nIHtcbiAgY29uc3Qgc2hhcGUgPSBpbnB1dEluZm8uc2hhcGVJbmZvLmxvZ2ljYWxTaGFwZTtcbiAgY29uc3QgdGV4TmFtZSA9IGlucHV0SW5mby5uYW1lO1xuICBjb25zdCBmdW5jTmFtZSA9ICdnZXQnICsgdGV4TmFtZS5jaGFyQXQoMCkudG9VcHBlckNhc2UoKSArIHRleE5hbWUuc2xpY2UoMSk7XG4gIGNvbnN0IHN0cmlkZTAgPSBzaGFwZVsxXSAqIHNoYXBlWzJdO1xuICBjb25zdCBzdHJpZGUxID0gc2hhcGVbMl07XG5cbiAgY29uc3Qge25ld1NoYXBlLCBrZXB0RGltc30gPSB1dGlsLnNxdWVlemVTaGFwZShzaGFwZSk7XG4gIGNvbnN0IHNxdWVlemVkU2hhcGUgPSBuZXdTaGFwZTtcbiAgaWYgKHNxdWVlemVkU2hhcGUubGVuZ3RoIDwgc2hhcGUubGVuZ3RoKSB7XG4gICAgY29uc3QgbmV3SW5wdXRJbmZvID0gc3F1ZWV6ZUlucHV0SW5mbyhpbnB1dEluZm8sIHNxdWVlemVkU2hhcGUpO1xuICAgIGNvbnN0IHBhcmFtcyA9IFsncm93JywgJ2NvbCcsICdkZXB0aCddO1xuICAgIHJldHVybiBgXG4gICAgICAgICR7Z2V0U2FtcGxlckZyb21JbkluZm8obmV3SW5wdXRJbmZvLCBlbmFibGVTaGFwZVVuaWZvcm1zKX1cbiAgICAgICAgZmxvYXQgJHtmdW5jTmFtZX0oaW50IHJvdywgaW50IGNvbCwgaW50IGRlcHRoKSB7XG4gICAgICAgICAgcmV0dXJuICR7ZnVuY05hbWV9KCR7Z2V0U3F1ZWV6ZWRQYXJhbXMocGFyYW1zLCBrZXB0RGltcyl9KTtcbiAgICAgICAgfVxuICAgICAgYDtcbiAgfVxuXG4gIGlmIChpbnB1dEluZm8uc2hhcGVJbmZvLmlzVW5pZm9ybSkge1xuICAgIC8vIFVuaWZvcm0gYXJyYXlzIHdpbGwgYmUgbGVzcyB0aGFuIDY1NTA1IChubyByaXNrIG9mIGZsb2F0MTYgb3ZlcmZsb3cpLlxuICAgIHJldHVybiBgXG4gICAgICBmbG9hdCAke2Z1bmNOYW1lfShpbnQgcm93LCBpbnQgY29sLCBpbnQgZGVwdGgpIHtcbiAgICAgICAgaW50IGluZGV4ID0gcm91bmQoZG90KHZlYzMocm93LCBjb2wsIGRlcHRoKSxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgdmVjMygke3N0cmlkZTB9LCAke3N0cmlkZTF9LCAxKSkpO1xuICAgICAgICAke2dldFVuaWZvcm1TYW1wbGVyKGlucHV0SW5mbyl9XG4gICAgICB9XG4gICAgYDtcbiAgfVxuXG4gIGNvbnN0IHRleFNoYXBlID0gaW5wdXRJbmZvLnNoYXBlSW5mby50ZXhTaGFwZTtcbiAgY29uc3QgdGV4TnVtUiA9IHRleFNoYXBlWzBdO1xuICBjb25zdCB0ZXhOdW1DID0gdGV4U2hhcGVbMV07XG4gIGNvbnN0IGZsYXRPZmZzZXQgPSBpbnB1dEluZm8uc2hhcGVJbmZvLmZsYXRPZmZzZXQ7XG4gIGlmICh0ZXhOdW1DID09PSBzdHJpZGUwICYmIGZsYXRPZmZzZXQgPT0gbnVsbCkge1xuICAgIC8vIHRleEMgaXMgdXNlZCBkaXJlY3RseSBhcyBwaHlzaWNhbCAobm8gcmlzayBvZiBmbG9hdDE2IG92ZXJmbG93KS5cbiAgICBpZiAoZW5hYmxlU2hhcGVVbmlmb3Jtcykge1xuICAgICAgcmV0dXJuIGBcbiAgICAgIGZsb2F0ICR7ZnVuY05hbWV9KGludCByb3csIGludCBjb2wsIGludCBkZXB0aCkge1xuICAgICAgICBpbnQgc3RyaWRlMSA9ICR7dGV4TmFtZX1TaGFwZVsyXTtcbiAgICAgICAgZmxvYXQgdGV4UiA9IGZsb2F0KHJvdyk7XG4gICAgICAgIGZsb2F0IHRleEMgPSBkb3QodmVjMihjb2wsIGRlcHRoKSwgdmVjMihzdHJpZGUxLCAxKSk7XG4gICAgICAgIHZlYzIgdXYgPSAodmVjMih0ZXhDLCB0ZXhSKSArIGhhbGZDUikgL1xuICAgICAgICAgICAgICAgICAgIHZlYzIoJHt0ZXhOYW1lfVRleFNoYXBlWzFdLCAke3RleE5hbWV9VGV4U2hhcGVbMF0pO1xuICAgICAgICByZXR1cm4gc2FtcGxlVGV4dHVyZSgke3RleE5hbWV9LCB1dik7XG4gICAgICB9XG4gICAgYDtcbiAgICB9XG4gICAgcmV0dXJuIGBcbiAgICAgICAgZmxvYXQgJHtmdW5jTmFtZX0oaW50IHJvdywgaW50IGNvbCwgaW50IGRlcHRoKSB7XG4gICAgICAgICAgZmxvYXQgdGV4UiA9IGZsb2F0KHJvdyk7XG4gICAgICAgICAgZmxvYXQgdGV4QyA9IGRvdCh2ZWMyKGNvbCwgZGVwdGgpLCB2ZWMyKCR7c3RyaWRlMX0sIDEpKTtcbiAgICAgICAgICB2ZWMyIHV2ID0gKHZlYzIodGV4QywgdGV4UikgKyBoYWxmQ1IpIC9cbiAgICAgICAgICAgICAgICAgICAgIHZlYzIoJHt0ZXhOdW1DfS4wLCAke3RleE51bVJ9LjApO1xuICAgICAgICAgIHJldHVybiBzYW1wbGVUZXh0dXJlKCR7dGV4TmFtZX0sIHV2KTtcbiAgICAgICAgfVxuICAgICAgYDtcbiAgfVxuXG4gIGlmICh0ZXhOdW1DID09PSBzdHJpZGUxICYmIGZsYXRPZmZzZXQgPT0gbnVsbCkge1xuICAgIC8vIHRleFIgaXMgdXNlZCBkaXJlY3RseSBhcyBwaHlzaWNhbCAobm8gcmlzayBvZiBmbG9hdDE2IG92ZXJmbG93KS5cbiAgICBpZiAoZW5hYmxlU2hhcGVVbmlmb3Jtcykge1xuICAgICAgcmV0dXJuIGBcbiAgICAgIGZsb2F0ICR7ZnVuY05hbWV9KGludCByb3csIGludCBjb2wsIGludCBkZXB0aCkge1xuICAgICAgICBmbG9hdCB0ZXhSID0gZG90KHZlYzIocm93LCBjb2wpLCB2ZWMyKCR7dGV4TmFtZX1TaGFwZVsxXSwgMSkpO1xuICAgICAgICBmbG9hdCB0ZXhDID0gZmxvYXQoZGVwdGgpO1xuICAgICAgICB2ZWMyIHV2ID0gKHZlYzIodGV4QywgdGV4UikgKyBoYWxmQ1IpIC8gdmVjMigke3RleE5hbWV9VGV4U2hhcGVbMV0sICR7XG4gICAgICAgICAgdGV4TmFtZX1UZXhTaGFwZVswXSk7XG4gICAgICAgIHJldHVybiBzYW1wbGVUZXh0dXJlKCR7dGV4TmFtZX0sIHV2KTtcbiAgICAgIH1cbiAgICBgO1xuICAgIH1cbiAgICByZXR1cm4gYFxuICAgIGZsb2F0ICR7ZnVuY05hbWV9KGludCByb3csIGludCBjb2wsIGludCBkZXB0aCkge1xuICAgICAgZmxvYXQgdGV4UiA9IGRvdCh2ZWMyKHJvdywgY29sKSwgdmVjMigke3NoYXBlWzFdfSwgMSkpO1xuICAgICAgZmxvYXQgdGV4QyA9IGZsb2F0KGRlcHRoKTtcbiAgICAgIHZlYzIgdXYgPSAodmVjMih0ZXhDLCB0ZXhSKSArIGhhbGZDUikgLyB2ZWMyKCR7dGV4TnVtQ30uMCwgJHt0ZXhOdW1SfS4wKTtcbiAgICAgIHJldHVybiBzYW1wbGVUZXh0dXJlKCR7dGV4TmFtZX0sIHV2KTtcbiAgICB9XG4gIGA7XG4gIH1cblxuICBjb25zdCBvZmZzZXQgPSBnZXRGbGF0T2Zmc2V0VW5pZm9ybU5hbWUodGV4TmFtZSk7XG4gIGlmIChlbmFibGVTaGFwZVVuaWZvcm1zKSB7XG4gICAgcmV0dXJuIGBcbiAgICBmbG9hdCAke2Z1bmNOYW1lfShpbnQgcm93LCBpbnQgY29sLCBpbnQgZGVwdGgpIHtcbiAgICAgIC8vIEV4cGxpY2l0bHkgdXNlIGludGVnZXIgb3BlcmF0aW9ucyBhcyBkb3QoKSBvbmx5IHdvcmtzIG9uIGZsb2F0cy5cbiAgICAgIGludCBzdHJpZGUwID0gJHt0ZXhOYW1lfVNoYXBlWzFdICogJHt0ZXhOYW1lfVNoYXBlWzJdO1xuICAgICAgaW50IHN0cmlkZTEgPSAke3RleE5hbWV9U2hhcGVbMl07XG4gICAgICBpbnQgaW5kZXggPSByb3cgKiBzdHJpZGUwICsgY29sICogc3RyaWRlMSArIGRlcHRoICsgJHtvZmZzZXR9O1xuICAgICAgdmVjMiB1diA9IHV2RnJvbUZsYXQoJHt0ZXhOYW1lfVRleFNoYXBlWzBdLCAke3RleE5hbWV9VGV4U2hhcGVbMV0sIGluZGV4KTtcbiAgICAgIHJldHVybiBzYW1wbGVUZXh0dXJlKCR7dGV4TmFtZX0sIHV2KTtcbiAgICB9XG4gICAgYDtcbiAgfVxuICByZXR1cm4gYFxuICAgICAgZmxvYXQgJHtmdW5jTmFtZX0oaW50IHJvdywgaW50IGNvbCwgaW50IGRlcHRoKSB7XG4gICAgICAgIC8vIEV4cGxpY2l0bHkgdXNlIGludGVnZXIgb3BlcmF0aW9ucyBhcyBkb3QoKSBvbmx5IHdvcmtzIG9uIGZsb2F0cy5cbiAgICAgICAgaW50IGluZGV4ID0gcm93ICogJHtzdHJpZGUwfSArIGNvbCAqICR7c3RyaWRlMX0gKyBkZXB0aCArICR7b2Zmc2V0fTtcbiAgICAgICAgdmVjMiB1diA9IHV2RnJvbUZsYXQoJHt0ZXhOdW1SfSwgJHt0ZXhOdW1DfSwgaW5kZXgpO1xuICAgICAgICByZXR1cm4gc2FtcGxlVGV4dHVyZSgke3RleE5hbWV9LCB1dik7XG4gICAgICB9XG4gIGA7XG59XG5cbmZ1bmN0aW9uIGdldFBhY2tlZFNhbXBsZXJORChcbiAgICBpbnB1dEluZm86IElucHV0SW5mbywgZW5hYmxlU2hhcGVVbmlmb3JtczogYm9vbGVhbik6IHN0cmluZyB7XG4gIGNvbnN0IHRleE5hbWUgPSBpbnB1dEluZm8ubmFtZTtcbiAgY29uc3QgZnVuY05hbWUgPSAnZ2V0JyArIHRleE5hbWUuY2hhckF0KDApLnRvVXBwZXJDYXNlKCkgKyB0ZXhOYW1lLnNsaWNlKDEpO1xuICBjb25zdCBnbHNsID0gZ2V0R2xzbERpZmZlcmVuY2VzKCk7XG4gIGlmIChlbmFibGVTaGFwZVVuaWZvcm1zKSB7XG4gICAgLy8gVE9ETzogc3VwcG9ydCA1ZCBhbmQgNmRcbiAgICByZXR1cm4gYFxuICAgIHZlYzQgJHtmdW5jTmFtZX0oaW50IGIyLCBpbnQgYiwgaW50IHJvdywgaW50IGNvbCkge1xuICAgICAgaW50IHZhbHVlc1BlclJvdyA9IGludChjZWlsKGZsb2F0KCR7dGV4TmFtZX1TaGFwZVszXSkgLyAyLjApKTtcbiAgICAgIGludCB0ZXhlbHNJbkJhdGNoID0gdmFsdWVzUGVyUm93ICogaW50KGNlaWwoZmxvYXQoJHtcbiAgICAgICAgdGV4TmFtZX1TaGFwZVsyXSkgLyAyLjApKTtcbiAgICAgIGludCBpbmRleCA9IGIgKiB0ZXhlbHNJbkJhdGNoICsgKHJvdyAvIDIpICogdmFsdWVzUGVyUm93ICsgKGNvbCAvIDIpO1xuICAgICAgdGV4ZWxzSW5CYXRjaCAqPSAke3RleE5hbWV9U2hhcGVbMV07XG4gICAgICBpbmRleCA9IGIyICogdGV4ZWxzSW5CYXRjaCArIGluZGV4O1xuICAgICAgaXZlYzIgcGFja2VkVGV4U2hhcGUgPSBpdmVjMihjZWlsKGZsb2F0KCR7XG4gICAgICAgIHRleE5hbWV9VGV4U2hhcGVbMF0pIC8gMi4wKSwgY2VpbChmbG9hdCgke3RleE5hbWV9VGV4U2hhcGVbMV0pIC8gMi4wKSk7XG4gICAgICBpbnQgdGV4UiA9IGluZGV4IC8gcGFja2VkVGV4U2hhcGVbMV07XG4gICAgICBpbnQgdGV4QyA9IGluZGV4IC0gdGV4UiAqIHBhY2tlZFRleFNoYXBlWzFdO1xuICAgICAgdmVjMiB1diA9ICh2ZWMyKHRleEMsIHRleFIpICsgaGFsZkNSKSAvIHZlYzIocGFja2VkVGV4U2hhcGVbMV0sIHBhY2tlZFRleFNoYXBlWzBdKTsgcmV0dXJuICR7XG4gICAgICAgIGdsc2wudGV4dHVyZTJEfSgke3RleE5hbWV9LCB1dik7XG4gICAgfVxuICBgO1xuICB9XG4gIGNvbnN0IHNoYXBlID0gaW5wdXRJbmZvLnNoYXBlSW5mby5sb2dpY2FsU2hhcGU7XG4gIGNvbnN0IHJhbmsgPSBzaGFwZS5sZW5ndGg7XG4gIGNvbnN0IHRleFNoYXBlID0gaW5wdXRJbmZvLnNoYXBlSW5mby50ZXhTaGFwZTtcbiAgY29uc3QgcGFja2VkVGV4U2hhcGUgPVxuICAgICAgW01hdGguY2VpbCh0ZXhTaGFwZVswXSAvIDIpLCBNYXRoLmNlaWwodGV4U2hhcGVbMV0gLyAyKV07XG4gIGNvbnN0IHRleE51bVIgPSBwYWNrZWRUZXhTaGFwZVswXTtcbiAgY29uc3QgdGV4TnVtQyA9IHBhY2tlZFRleFNoYXBlWzFdO1xuXG4gIGNvbnN0IHZhbHVlc1BlclJvdyA9IE1hdGguY2VpbChzaGFwZVtyYW5rIC0gMV0gLyAyKTtcbiAgbGV0IHRleGVsc0luQmF0Y2ggPSB2YWx1ZXNQZXJSb3cgKiBNYXRoLmNlaWwoc2hhcGVbcmFuayAtIDJdIC8gMik7XG4gIGxldCBwYXJhbXMgPSBgaW50IGIsIGludCByb3csIGludCBjb2xgO1xuICBsZXQgaW5kZXggPSBgYiAqICR7dGV4ZWxzSW5CYXRjaH0gKyAocm93IC8gMikgKiAke3ZhbHVlc1BlclJvd30gKyAoY29sIC8gMilgO1xuICBmb3IgKGxldCBiID0gMjsgYiA8IHJhbmsgLSAxOyBiKyspIHtcbiAgICBwYXJhbXMgPSBgaW50IGIke2J9LCBgICsgcGFyYW1zO1xuICAgIHRleGVsc0luQmF0Y2ggKj0gc2hhcGVbcmFuayAtIGIgLSAxXTtcbiAgICBpbmRleCA9IGBiJHtifSAqICR7dGV4ZWxzSW5CYXRjaH0gKyBgICsgaW5kZXg7XG4gIH1cbiAgcmV0dXJuIGBcbiAgICB2ZWM0ICR7ZnVuY05hbWV9KCR7cGFyYW1zfSkge1xuICAgICAgaW50IGluZGV4ID0gJHtpbmRleH07XG4gICAgICBpbnQgdGV4UiA9IGluZGV4IC8gJHt0ZXhOdW1DfTtcbiAgICAgIGludCB0ZXhDID0gaW5kZXggLSB0ZXhSICogJHt0ZXhOdW1DfTtcbiAgICAgIHZlYzIgdXYgPSAodmVjMih0ZXhDLCB0ZXhSKSArIGhhbGZDUikgLyB2ZWMyKCR7dGV4TnVtQ30sICR7dGV4TnVtUn0pO1xuICAgICAgcmV0dXJuICR7Z2xzbC50ZXh0dXJlMkR9KCR7dGV4TmFtZX0sIHV2KTtcbiAgICB9XG4gIGA7XG59XG5cbmZ1bmN0aW9uIGdldFNhbXBsZXI0RChcbiAgICBpbnB1dEluZm86IElucHV0SW5mbywgZW5hYmxlU2hhcGVVbmlmb3JtczogYm9vbGVhbik6IHN0cmluZyB7XG4gIGNvbnN0IHNoYXBlID0gaW5wdXRJbmZvLnNoYXBlSW5mby5sb2dpY2FsU2hhcGU7XG4gIGNvbnN0IHRleE5hbWUgPSBpbnB1dEluZm8ubmFtZTtcbiAgY29uc3QgZnVuY05hbWUgPSAnZ2V0JyArIHRleE5hbWUuY2hhckF0KDApLnRvVXBwZXJDYXNlKCkgKyB0ZXhOYW1lLnNsaWNlKDEpO1xuICBjb25zdCBzdHJpZGUyID0gc2hhcGVbM107XG4gIGNvbnN0IHN0cmlkZTEgPSBzaGFwZVsyXSAqIHN0cmlkZTI7XG4gIGNvbnN0IHN0cmlkZTAgPSBzaGFwZVsxXSAqIHN0cmlkZTE7XG5cbiAgY29uc3Qge25ld1NoYXBlLCBrZXB0RGltc30gPSB1dGlsLnNxdWVlemVTaGFwZShzaGFwZSk7XG4gIGlmIChuZXdTaGFwZS5sZW5ndGggPCBzaGFwZS5sZW5ndGgpIHtcbiAgICBjb25zdCBuZXdJbnB1dEluZm8gPSBzcXVlZXplSW5wdXRJbmZvKGlucHV0SW5mbywgbmV3U2hhcGUpO1xuICAgIGNvbnN0IHBhcmFtcyA9IFsncm93JywgJ2NvbCcsICdkZXB0aCcsICdkZXB0aDInXTtcbiAgICByZXR1cm4gYFxuICAgICAgJHtnZXRTYW1wbGVyRnJvbUluSW5mbyhuZXdJbnB1dEluZm8sIGVuYWJsZVNoYXBlVW5pZm9ybXMpfVxuICAgICAgZmxvYXQgJHtmdW5jTmFtZX0oaW50IHJvdywgaW50IGNvbCwgaW50IGRlcHRoLCBpbnQgZGVwdGgyKSB7XG4gICAgICAgIHJldHVybiAke2Z1bmNOYW1lfSgke2dldFNxdWVlemVkUGFyYW1zKHBhcmFtcywga2VwdERpbXMpfSk7XG4gICAgICB9XG4gICAgYDtcbiAgfVxuXG4gIGlmIChpbnB1dEluZm8uc2hhcGVJbmZvLmlzVW5pZm9ybSkge1xuICAgIC8vIFVuaWZvcm0gYXJyYXlzIHdpbGwgYmUgbGVzcyB0aGFuIDY1NTA1IChubyByaXNrIG9mIGZsb2F0MTYgb3ZlcmZsb3cpLlxuICAgIHJldHVybiBgXG4gICAgICBmbG9hdCAke2Z1bmNOYW1lfShpbnQgcm93LCBpbnQgY29sLCBpbnQgZGVwdGgsIGludCBkZXB0aDIpIHtcbiAgICAgICAgaW50IGluZGV4ID0gcm91bmQoZG90KHZlYzQocm93LCBjb2wsIGRlcHRoLCBkZXB0aDIpLFxuICAgICAgICAgICAgICAgICAgICAgICAgICB2ZWM0KCR7c3RyaWRlMH0sICR7c3RyaWRlMX0sICR7c3RyaWRlMn0sIDEpKSk7XG4gICAgICAgICR7Z2V0VW5pZm9ybVNhbXBsZXIoaW5wdXRJbmZvKX1cbiAgICAgIH1cbiAgICBgO1xuICB9XG5cbiAgY29uc3QgZmxhdE9mZnNldCA9IGlucHV0SW5mby5zaGFwZUluZm8uZmxhdE9mZnNldDtcbiAgY29uc3QgdGV4U2hhcGUgPSBpbnB1dEluZm8uc2hhcGVJbmZvLnRleFNoYXBlO1xuICBjb25zdCB0ZXhOdW1SID0gdGV4U2hhcGVbMF07XG4gIGNvbnN0IHRleE51bUMgPSB0ZXhTaGFwZVsxXTtcblxuICBjb25zdCBzdHJpZGUyU3RyID0gYGludCBzdHJpZGUyID0gJHt0ZXhOYW1lfVNoYXBlWzNdO2A7XG4gIGNvbnN0IHN0cmlkZTFTdHIgPSBgaW50IHN0cmlkZTEgPSAke3RleE5hbWV9U2hhcGVbMl0gKiBzdHJpZGUyO2A7XG4gIGNvbnN0IHN0cmlkZTBTdHIgPSBgaW50IHN0cmlkZTAgPSAke3RleE5hbWV9U2hhcGVbMV0gKiBzdHJpZGUxO2A7XG4gIGlmICh0ZXhOdW1DID09PSBzdHJpZGUwICYmIGZsYXRPZmZzZXQgPT0gbnVsbCkge1xuICAgIC8vIHRleEMgaXMgdXNlZCBkaXJlY3RseSBhcyBwaHlzaWNhbCAobm8gcmlzayBvZiBmbG9hdDE2IG92ZXJmbG93KS5cbiAgICBpZiAoZW5hYmxlU2hhcGVVbmlmb3Jtcykge1xuICAgICAgcmV0dXJuIGBcbiAgICAgIGZsb2F0ICR7ZnVuY05hbWV9KGludCByb3csIGludCBjb2wsIGludCBkZXB0aCwgaW50IGRlcHRoMikge1xuICAgICAgICAke3N0cmlkZTJTdHJ9XG4gICAgICAgICR7c3RyaWRlMVN0cn1cbiAgICAgICAgZmxvYXQgdGV4UiA9IGZsb2F0KHJvdyk7XG4gICAgICAgIGZsb2F0IHRleEMgPVxuICAgICAgICAgICAgZG90KHZlYzMoY29sLCBkZXB0aCwgZGVwdGgyKSxcbiAgICAgICAgICAgICAgICB2ZWMzKHN0cmlkZTEsIHN0cmlkZTIsIDEpKTtcbiAgICAgICAgdmVjMiB1diA9ICh2ZWMyKHRleEMsIHRleFIpICsgaGFsZkNSKSAvXG4gICAgICAgICAgICAgICAgICAgdmVjMigke3RleE5hbWV9VGV4U2hhcGVbMV0sICR7dGV4TmFtZX1UZXhTaGFwZVswXSk7XG4gICAgICAgIHJldHVybiBzYW1wbGVUZXh0dXJlKCR7dGV4TmFtZX0sIHV2KTtcbiAgICAgIH1cbiAgICBgO1xuICAgIH1cbiAgICByZXR1cm4gYFxuICAgICAgZmxvYXQgJHtmdW5jTmFtZX0oaW50IHJvdywgaW50IGNvbCwgaW50IGRlcHRoLCBpbnQgZGVwdGgyKSB7XG4gICAgICAgIGZsb2F0IHRleFIgPSBmbG9hdChyb3cpO1xuICAgICAgICBmbG9hdCB0ZXhDID1cbiAgICAgICAgICAgIGRvdCh2ZWMzKGNvbCwgZGVwdGgsIGRlcHRoMiksXG4gICAgICAgICAgICAgICAgdmVjMygke3N0cmlkZTF9LCAke3N0cmlkZTJ9LCAxKSk7XG4gICAgICAgIHZlYzIgdXYgPSAodmVjMih0ZXhDLCB0ZXhSKSArIGhhbGZDUikgL1xuICAgICAgICAgICAgICAgICAgIHZlYzIoJHt0ZXhOdW1DfS4wLCAke3RleE51bVJ9LjApO1xuICAgICAgICByZXR1cm4gc2FtcGxlVGV4dHVyZSgke3RleE5hbWV9LCB1dik7XG4gICAgICB9XG4gICAgYDtcbiAgfVxuICBpZiAodGV4TnVtQyA9PT0gc3RyaWRlMiAmJiBmbGF0T2Zmc2V0ID09IG51bGwpIHtcbiAgICAvLyB0ZXhSIGlzIHVzZWQgZGlyZWN0bHkgYXMgcGh5c2ljYWwgKG5vIHJpc2sgb2YgZmxvYXQxNiBvdmVyZmxvdykuXG4gICAgaWYgKGVuYWJsZVNoYXBlVW5pZm9ybXMpIHtcbiAgICAgIHJldHVybiBgXG4gICAgICBmbG9hdCAke2Z1bmNOYW1lfShpbnQgcm93LCBpbnQgY29sLCBpbnQgZGVwdGgsIGludCBkZXB0aDIpIHtcbiAgICAgICAgZmxvYXQgdGV4UiA9IGRvdCh2ZWMzKHJvdywgY29sLCBkZXB0aCksXG4gICAgICAgICAgICAgICAgICAgICAgICAgdmVjMygke3RleE5hbWV9U2hhcGVbMV0gKiAke3RleE5hbWV9U2hhcGVbMl0sICR7XG4gICAgICAgICAgdGV4TmFtZX1TaGFwZVsyXSwgMSkpO1xuICAgICAgICBmbG9hdCB0ZXhDID0gZmxvYXQoZGVwdGgyKTtcbiAgICAgICAgdmVjMiB1diA9ICh2ZWMyKHRleEMsIHRleFIpICsgaGFsZkNSKSAvXG4gICAgICAgICAgICAgICAgICB2ZWMyKCR7dGV4TmFtZX1UZXhTaGFwZVsxXSwgJHt0ZXhOYW1lfVRleFNoYXBlWzBdKTtcbiAgICAgICAgcmV0dXJuIHNhbXBsZVRleHR1cmUoJHt0ZXhOYW1lfSwgdXYpO1xuICAgICAgfVxuICAgIGA7XG4gICAgfVxuICAgIHJldHVybiBgXG4gICAgICBmbG9hdCAke2Z1bmNOYW1lfShpbnQgcm93LCBpbnQgY29sLCBpbnQgZGVwdGgsIGludCBkZXB0aDIpIHtcbiAgICAgICAgZmxvYXQgdGV4UiA9IGRvdCh2ZWMzKHJvdywgY29sLCBkZXB0aCksXG4gICAgICAgICAgICAgICAgICAgICAgICAgdmVjMygke3NoYXBlWzFdICogc2hhcGVbMl19LCAke3NoYXBlWzJdfSwgMSkpO1xuICAgICAgICBmbG9hdCB0ZXhDID0gZmxvYXQoZGVwdGgyKTtcbiAgICAgICAgdmVjMiB1diA9ICh2ZWMyKHRleEMsIHRleFIpICsgaGFsZkNSKSAvXG4gICAgICAgICAgICAgICAgICB2ZWMyKCR7dGV4TnVtQ30uMCwgJHt0ZXhOdW1SfS4wKTtcbiAgICAgICAgcmV0dXJuIHNhbXBsZVRleHR1cmUoJHt0ZXhOYW1lfSwgdXYpO1xuICAgICAgfVxuICAgIGA7XG4gIH1cblxuICBjb25zdCBvZmZzZXQgPSBnZXRGbGF0T2Zmc2V0VW5pZm9ybU5hbWUodGV4TmFtZSk7XG4gIGlmIChlbmFibGVTaGFwZVVuaWZvcm1zKSB7XG4gICAgcmV0dXJuIGBcbiAgICBmbG9hdCAke2Z1bmNOYW1lfShpbnQgcm93LCBpbnQgY29sLCBpbnQgZGVwdGgsIGludCBkZXB0aDIpIHtcbiAgICAgIC8vIEV4cGxpY2l0bHkgdXNlIGludGVnZXIgb3BlcmF0aW9ucyBhcyBkb3QoKSBvbmx5IHdvcmtzIG9uIGZsb2F0cy5cbiAgICAgICR7c3RyaWRlMlN0cn1cbiAgICAgICR7c3RyaWRlMVN0cn1cbiAgICAgICR7c3RyaWRlMFN0cn1cbiAgICAgIGludCBpbmRleCA9IHJvdyAqIHN0cmlkZTAgKyBjb2wgKiBzdHJpZGUxICtcbiAgICAgICAgICBkZXB0aCAqIHN0cmlkZTIgKyBkZXB0aDI7XG4gICAgICB2ZWMyIHV2ID0gdXZGcm9tRmxhdCgke3RleE5hbWV9VGV4U2hhcGVbMF0sICR7XG4gICAgICAgIHRleE5hbWV9VGV4U2hhcGVbMV0sIGluZGV4ICsgJHtvZmZzZXR9KTtcbiAgICAgIHJldHVybiBzYW1wbGVUZXh0dXJlKCR7dGV4TmFtZX0sIHV2KTtcbiAgICB9XG4gIGA7XG4gIH1cbiAgcmV0dXJuIGBcbiAgICBmbG9hdCAke2Z1bmNOYW1lfShpbnQgcm93LCBpbnQgY29sLCBpbnQgZGVwdGgsIGludCBkZXB0aDIpIHtcbiAgICAgIC8vIEV4cGxpY2l0bHkgdXNlIGludGVnZXIgb3BlcmF0aW9ucyBhcyBkb3QoKSBvbmx5IHdvcmtzIG9uIGZsb2F0cy5cbiAgICAgIGludCBpbmRleCA9IHJvdyAqICR7c3RyaWRlMH0gKyBjb2wgKiAke3N0cmlkZTF9ICtcbiAgICAgICAgICBkZXB0aCAqICR7c3RyaWRlMn0gKyBkZXB0aDI7XG4gICAgICB2ZWMyIHV2ID0gdXZGcm9tRmxhdCgke3RleE51bVJ9LCAke3RleE51bUN9LCBpbmRleCArICR7b2Zmc2V0fSk7XG4gICAgICByZXR1cm4gc2FtcGxlVGV4dHVyZSgke3RleE5hbWV9LCB1dik7XG4gICAgfVxuICBgO1xufVxuXG5mdW5jdGlvbiBnZXRTYW1wbGVyNUQoaW5wdXRJbmZvOiBJbnB1dEluZm8pOiBzdHJpbmcge1xuICBjb25zdCBzaGFwZSA9IGlucHV0SW5mby5zaGFwZUluZm8ubG9naWNhbFNoYXBlO1xuICBjb25zdCB0ZXhOYW1lID0gaW5wdXRJbmZvLm5hbWU7XG4gIGNvbnN0IGZ1bmNOYW1lID0gJ2dldCcgKyB0ZXhOYW1lLmNoYXJBdCgwKS50b1VwcGVyQ2FzZSgpICsgdGV4TmFtZS5zbGljZSgxKTtcbiAgY29uc3Qgc3RyaWRlMyA9IHNoYXBlWzRdO1xuICBjb25zdCBzdHJpZGUyID0gc2hhcGVbM10gKiBzdHJpZGUzO1xuICBjb25zdCBzdHJpZGUxID0gc2hhcGVbMl0gKiBzdHJpZGUyO1xuICBjb25zdCBzdHJpZGUwID0gc2hhcGVbMV0gKiBzdHJpZGUxO1xuXG4gIGNvbnN0IHtuZXdTaGFwZSwga2VwdERpbXN9ID0gdXRpbC5zcXVlZXplU2hhcGUoc2hhcGUpO1xuICBpZiAobmV3U2hhcGUubGVuZ3RoIDwgc2hhcGUubGVuZ3RoKSB7XG4gICAgY29uc3QgbmV3SW5wdXRJbmZvID0gc3F1ZWV6ZUlucHV0SW5mbyhpbnB1dEluZm8sIG5ld1NoYXBlKTtcbiAgICBjb25zdCBwYXJhbXMgPSBbJ3JvdycsICdjb2wnLCAnZGVwdGgnLCAnZGVwdGgyJywgJ2RlcHRoMyddO1xuICAgIHJldHVybiBgXG4gICAgICAke2dldFNhbXBsZXJGcm9tSW5JbmZvKG5ld0lucHV0SW5mbyl9XG4gICAgICBmbG9hdCAke2Z1bmNOYW1lfShpbnQgcm93LCBpbnQgY29sLCBpbnQgZGVwdGgsIGludCBkZXB0aDIsIGludCBkZXB0aDMpIHtcbiAgICAgICAgcmV0dXJuICR7ZnVuY05hbWV9KCR7Z2V0U3F1ZWV6ZWRQYXJhbXMocGFyYW1zLCBrZXB0RGltcyl9KTtcbiAgICAgIH1cbiAgICBgO1xuICB9XG5cbiAgaWYgKGlucHV0SW5mby5zaGFwZUluZm8uaXNVbmlmb3JtKSB7XG4gICAgLy8gVW5pZm9ybSBhcnJheXMgd2lsbCBiZSBsZXNzIHRoYW4gNjU1MDUgKG5vIHJpc2sgb2YgZmxvYXQxNiBvdmVyZmxvdykuXG4gICAgcmV0dXJuIGBcbiAgICAgIGZsb2F0ICR7ZnVuY05hbWV9KGludCByb3csIGludCBjb2wsIGludCBkZXB0aCwgaW50IGRlcHRoMiwgaW50IGRlcHRoMykge1xuICAgICAgICBmbG9hdCBpbmRleCA9IGRvdChcbiAgICAgICAgICB2ZWM0KHJvdywgY29sLCBkZXB0aCwgZGVwdGgyKSxcbiAgICAgICAgICB2ZWM0KCR7c3RyaWRlMH0sICR7c3RyaWRlMX0sICR7c3RyaWRlMn0sICR7c3RyaWRlM30pKSArXG4gICAgICAgICAgZGVwdGgzO1xuICAgICAgICAke2dldFVuaWZvcm1TYW1wbGVyKGlucHV0SW5mbyl9XG4gICAgICB9XG4gICAgYDtcbiAgfVxuXG4gIGNvbnN0IGZsYXRPZmZzZXQgPSBpbnB1dEluZm8uc2hhcGVJbmZvLmZsYXRPZmZzZXQ7XG4gIGNvbnN0IHRleFNoYXBlID0gaW5wdXRJbmZvLnNoYXBlSW5mby50ZXhTaGFwZTtcbiAgY29uc3QgdGV4TnVtUiA9IHRleFNoYXBlWzBdO1xuICBjb25zdCB0ZXhOdW1DID0gdGV4U2hhcGVbMV07XG5cbiAgaWYgKHRleE51bUMgPT09IHN0cmlkZTAgJiYgZmxhdE9mZnNldCA9PSBudWxsKSB7XG4gICAgLy8gdGV4QyBpcyB1c2VkIGRpcmVjdGx5IGFzIHBoeXNpY2FsIChubyByaXNrIG9mIGZsb2F0MTYgb3ZlcmZsb3cpLlxuICAgIHJldHVybiBgXG4gICAgICBmbG9hdCAke2Z1bmNOYW1lfShpbnQgcm93LCBpbnQgY29sLCBpbnQgZGVwdGgsIGludCBkZXB0aDIsIGludCBkZXB0aDMpIHtcbiAgICAgICAgaW50IHRleFIgPSByb3c7XG4gICAgICAgIGZsb2F0IHRleEMgPSBkb3QodmVjNChjb2wsIGRlcHRoLCBkZXB0aDIsIGRlcHRoMyksXG4gICAgICAgICAgICAgICAgICAgICAgICAgdmVjNCgke3N0cmlkZTF9LCAke3N0cmlkZTJ9LCAke3N0cmlkZTN9LCAxKSk7XG4gICAgICAgIHZlYzIgdXYgPSAodmVjMih0ZXhDLCB0ZXhSKSArIGhhbGZDUikgL1xuICAgICAgICAgICAgICAgICAgIHZlYzIoJHt0ZXhOdW1DfS4wLCAke3RleE51bVJ9LjApO1xuICAgICAgICByZXR1cm4gc2FtcGxlVGV4dHVyZSgke3RleE5hbWV9LCB1dik7XG4gICAgICB9XG4gICAgYDtcbiAgfVxuXG4gIGlmICh0ZXhOdW1DID09PSBzdHJpZGUzICYmIGZsYXRPZmZzZXQgPT0gbnVsbCkge1xuICAgIC8vIHRleFIgaXMgdXNlZCBkaXJlY3RseSBhcyBwaHlzaWNhbCAobm8gcmlzayBvZiBmbG9hdDE2IG92ZXJmbG93KS5cbiAgICByZXR1cm4gYFxuICAgICAgZmxvYXQgJHtmdW5jTmFtZX0oaW50IHJvdywgaW50IGNvbCwgaW50IGRlcHRoLCBpbnQgZGVwdGgyLCBpbnQgZGVwdGgzKSB7XG4gICAgICAgIGZsb2F0IHRleFIgPSBkb3QoXG4gICAgICAgICAgdmVjNChyb3csIGNvbCwgZGVwdGgsIGRlcHRoMiksXG4gICAgICAgICAgdmVjNCgke3NoYXBlWzFdICogc2hhcGVbMl0gKiBzaGFwZVszXX0sXG4gICAgICAgICAgICAgICAke3NoYXBlWzJdICogc2hhcGVbM119LCAke3NoYXBlWzNdfSwgMSkpO1xuICAgICAgICBpbnQgdGV4QyA9IGRlcHRoMztcbiAgICAgICAgdmVjMiB1diA9ICh2ZWMyKHRleEMsIHRleFIpICsgaGFsZkNSKSAvXG4gICAgICAgICAgICAgICAgICB2ZWMyKCR7dGV4TnVtQ30uMCwgJHt0ZXhOdW1SfS4wKTtcbiAgICAgICAgcmV0dXJuIHNhbXBsZVRleHR1cmUoJHt0ZXhOYW1lfSwgdXYpO1xuICAgICAgfVxuICAgIGA7XG4gIH1cblxuICBjb25zdCBvZmZzZXQgPSBnZXRGbGF0T2Zmc2V0VW5pZm9ybU5hbWUodGV4TmFtZSk7XG4gIHJldHVybiBgXG4gICAgZmxvYXQgJHtmdW5jTmFtZX0oaW50IHJvdywgaW50IGNvbCwgaW50IGRlcHRoLCBpbnQgZGVwdGgyLCBpbnQgZGVwdGgzKSB7XG4gICAgICAvLyBFeHBsaWNpdGx5IHVzZSBpbnRlZ2VyIG9wZXJhdGlvbnMgYXMgZG90KCkgb25seSB3b3JrcyBvbiBmbG9hdHMuXG4gICAgICBpbnQgaW5kZXggPSByb3cgKiAke3N0cmlkZTB9ICsgY29sICogJHtzdHJpZGUxfSArIGRlcHRoICogJHtzdHJpZGUyfSArXG4gICAgICAgICAgZGVwdGgyICogJHtzdHJpZGUzfSArIGRlcHRoMyArICR7b2Zmc2V0fTtcbiAgICAgIHZlYzIgdXYgPSB1dkZyb21GbGF0KCR7dGV4TnVtUn0sICR7dGV4TnVtQ30sIGluZGV4KTtcbiAgICAgIHJldHVybiBzYW1wbGVUZXh0dXJlKCR7dGV4TmFtZX0sIHV2KTtcbiAgICB9XG4gIGA7XG59XG5cbmZ1bmN0aW9uIGdldFNhbXBsZXI2RChpbnB1dEluZm86IElucHV0SW5mbyk6IHN0cmluZyB7XG4gIGNvbnN0IHNoYXBlID0gaW5wdXRJbmZvLnNoYXBlSW5mby5sb2dpY2FsU2hhcGU7XG4gIGNvbnN0IHRleE5hbWUgPSBpbnB1dEluZm8ubmFtZTtcbiAgY29uc3QgZnVuY05hbWUgPSAnZ2V0JyArIHRleE5hbWUuY2hhckF0KDApLnRvVXBwZXJDYXNlKCkgKyB0ZXhOYW1lLnNsaWNlKDEpO1xuXG4gIGNvbnN0IHtuZXdTaGFwZSwga2VwdERpbXN9ID0gdXRpbC5zcXVlZXplU2hhcGUoc2hhcGUpO1xuICBpZiAobmV3U2hhcGUubGVuZ3RoIDwgc2hhcGUubGVuZ3RoKSB7XG4gICAgY29uc3QgbmV3SW5wdXRJbmZvID0gc3F1ZWV6ZUlucHV0SW5mbyhpbnB1dEluZm8sIG5ld1NoYXBlKTtcbiAgICBjb25zdCBwYXJhbXMgPSBbJ3JvdycsICdjb2wnLCAnZGVwdGgnLCAnZGVwdGgyJywgJ2RlcHRoMycsICdkZXB0aDQnXTtcbiAgICByZXR1cm4gYFxuICAgICAgJHtnZXRTYW1wbGVyRnJvbUluSW5mbyhuZXdJbnB1dEluZm8pfVxuICAgICAgZmxvYXQgJHtmdW5jTmFtZX0oaW50IHJvdywgaW50IGNvbCwgaW50IGRlcHRoLFxuICAgICAgICAgICAgICAgICAgICBpbnQgZGVwdGgyLCBpbnQgZGVwdGgzLCBpbnQgZGVwdGg0KSB7XG4gICAgICAgIHJldHVybiAke2Z1bmNOYW1lfSgke2dldFNxdWVlemVkUGFyYW1zKHBhcmFtcywga2VwdERpbXMpfSk7XG4gICAgICB9XG4gICAgYDtcbiAgfVxuXG4gIGNvbnN0IHN0cmlkZTQgPSBzaGFwZVs1XTtcbiAgY29uc3Qgc3RyaWRlMyA9IHNoYXBlWzRdICogc3RyaWRlNDtcbiAgY29uc3Qgc3RyaWRlMiA9IHNoYXBlWzNdICogc3RyaWRlMztcbiAgY29uc3Qgc3RyaWRlMSA9IHNoYXBlWzJdICogc3RyaWRlMjtcbiAgY29uc3Qgc3RyaWRlMCA9IHNoYXBlWzFdICogc3RyaWRlMTtcblxuICBpZiAoaW5wdXRJbmZvLnNoYXBlSW5mby5pc1VuaWZvcm0pIHtcbiAgICAvLyBVbmlmb3JtIGFycmF5cyB3aWxsIGJlIGxlc3MgdGhhbiA2NTUwNSAobm8gcmlzayBvZiBmbG9hdDE2IG92ZXJmbG93KS5cbiAgICByZXR1cm4gYFxuICAgICAgZmxvYXQgJHtmdW5jTmFtZX0oaW50IHJvdywgaW50IGNvbCwgaW50IGRlcHRoLFxuICAgICAgICAgICAgICAgICAgaW50IGRlcHRoMiwgaW50IGRlcHRoMywgaW50IGRlcHRoNCkge1xuICAgICAgICBpbnQgaW5kZXggPSByb3VuZChkb3QoXG4gICAgICAgICAgdmVjNChyb3csIGNvbCwgZGVwdGgsIGRlcHRoMiksXG4gICAgICAgICAgdmVjNCgke3N0cmlkZTB9LCAke3N0cmlkZTF9LCAke3N0cmlkZTJ9LCAke3N0cmlkZTN9KSkgK1xuICAgICAgICAgIGRvdChcbiAgICAgICAgICAgIHZlYzIoZGVwdGgzLCBkZXB0aDQpLFxuICAgICAgICAgICAgdmVjMigke3N0cmlkZTR9LCAxKSkpO1xuICAgICAgICAke2dldFVuaWZvcm1TYW1wbGVyKGlucHV0SW5mbyl9XG4gICAgICB9XG4gICAgYDtcbiAgfVxuXG4gIGNvbnN0IGZsYXRPZmZzZXQgPSBpbnB1dEluZm8uc2hhcGVJbmZvLmZsYXRPZmZzZXQ7XG4gIGNvbnN0IHRleFNoYXBlID0gaW5wdXRJbmZvLnNoYXBlSW5mby50ZXhTaGFwZTtcbiAgY29uc3QgdGV4TnVtUiA9IHRleFNoYXBlWzBdO1xuICBjb25zdCB0ZXhOdW1DID0gdGV4U2hhcGVbMV07XG4gIGlmICh0ZXhOdW1DID09PSBzdHJpZGUwICYmIGZsYXRPZmZzZXQgPT0gbnVsbCkge1xuICAgIC8vIHRleEMgaXMgdXNlZCBkaXJlY3RseSBhcyBwaHlzaWNhbCAobm8gcmlzayBvZiBmbG9hdDE2IG92ZXJmbG93KS5cbiAgICByZXR1cm4gYFxuICAgICAgZmxvYXQgJHtmdW5jTmFtZX0oaW50IHJvdywgaW50IGNvbCwgaW50IGRlcHRoLFxuICAgICAgICAgICAgICAgICAgICBpbnQgZGVwdGgyLCBpbnQgZGVwdGgzLCBpbnQgZGVwdGg0KSB7XG4gICAgICAgIGludCB0ZXhSID0gcm93O1xuICAgICAgICBmbG9hdCB0ZXhDID0gZG90KHZlYzQoY29sLCBkZXB0aCwgZGVwdGgyLCBkZXB0aDMpLFxuICAgICAgICAgIHZlYzQoJHtzdHJpZGUxfSwgJHtzdHJpZGUyfSwgJHtzdHJpZGUzfSwgJHtzdHJpZGU0fSkpICtcbiAgICAgICAgICAgICAgIGZsb2F0KGRlcHRoNCk7XG4gICAgICAgIHZlYzIgdXYgPSAodmVjMih0ZXhDLCB0ZXhSKSArIGhhbGZDUikgL1xuICAgICAgICAgICAgICAgICAgIHZlYzIoJHt0ZXhOdW1DfS4wLCAke3RleE51bVJ9LjApO1xuICAgICAgICByZXR1cm4gc2FtcGxlVGV4dHVyZSgke3RleE5hbWV9LCB1dik7XG4gICAgICB9XG4gICAgYDtcbiAgfVxuICBpZiAodGV4TnVtQyA9PT0gc3RyaWRlNCAmJiBmbGF0T2Zmc2V0ID09IG51bGwpIHtcbiAgICAvLyB0ZXhSIGlzIHVzZWQgZGlyZWN0bHkgYXMgcGh5c2ljYWwgKG5vIHJpc2sgb2YgZmxvYXQxNiBvdmVyZmxvdykuXG4gICAgcmV0dXJuIGBcbiAgICAgIGZsb2F0ICR7ZnVuY05hbWV9KGludCByb3csIGludCBjb2wsIGludCBkZXB0aCxcbiAgICAgICAgICAgICAgICAgICAgaW50IGRlcHRoMiwgaW50IGRlcHRoMywgaW50IGRlcHRoNCkge1xuICAgICAgICBmbG9hdCB0ZXhSID0gZG90KHZlYzQocm93LCBjb2wsIGRlcHRoLCBkZXB0aDIpLFxuICAgICAgICAgIHZlYzQoJHtzaGFwZVsxXSAqIHNoYXBlWzJdICogc2hhcGVbM10gKiBzaGFwZVs0XX0sXG4gICAgICAgICAgICAgICAke3NoYXBlWzJdICogc2hhcGVbM10gKiBzaGFwZVs0XX0sXG4gICAgICAgICAgICAgICAke3NoYXBlWzNdICogc2hhcGVbNF19LFxuICAgICAgICAgICAgICAgJHtzaGFwZVs0XX0pKSArIGZsb2F0KGRlcHRoMyk7XG4gICAgICAgIGludCB0ZXhDID0gZGVwdGg0O1xuICAgICAgICB2ZWMyIHV2ID0gKHZlYzIodGV4QywgdGV4UikgKyBoYWxmQ1IpIC9cbiAgICAgICAgICAgICAgICAgIHZlYzIoJHt0ZXhOdW1DfS4wLCAke3RleE51bVJ9LjApO1xuICAgICAgICByZXR1cm4gc2FtcGxlVGV4dHVyZSgke3RleE5hbWV9LCB1dik7XG4gICAgICB9XG4gICAgYDtcbiAgfVxuICBjb25zdCBvZmZzZXQgPSBnZXRGbGF0T2Zmc2V0VW5pZm9ybU5hbWUodGV4TmFtZSk7XG4gIHJldHVybiBgXG4gICAgZmxvYXQgJHtmdW5jTmFtZX0oaW50IHJvdywgaW50IGNvbCwgaW50IGRlcHRoLFxuICAgICAgICAgICAgICAgICAgaW50IGRlcHRoMiwgaW50IGRlcHRoMywgaW50IGRlcHRoNCkge1xuICAgICAgLy8gRXhwbGljaXRseSB1c2UgaW50ZWdlciBvcGVyYXRpb25zIGFzIGRvdCgpIG9ubHkgd29ya3Mgb24gZmxvYXRzLlxuICAgICAgaW50IGluZGV4ID0gcm93ICogJHtzdHJpZGUwfSArIGNvbCAqICR7c3RyaWRlMX0gKyBkZXB0aCAqICR7c3RyaWRlMn0gK1xuICAgICAgICAgIGRlcHRoMiAqICR7c3RyaWRlM30gKyBkZXB0aDMgKiAke3N0cmlkZTR9ICsgZGVwdGg0ICsgJHtvZmZzZXR9O1xuICAgICAgdmVjMiB1diA9IHV2RnJvbUZsYXQoJHt0ZXhOdW1SfSwgJHt0ZXhOdW1DfSwgaW5kZXgpO1xuICAgICAgcmV0dXJuIHNhbXBsZVRleHR1cmUoJHt0ZXhOYW1lfSwgdXYpO1xuICAgIH1cbiAgYDtcbn1cblxuZnVuY3Rpb24gZ2V0VW5pZm9ybVNhbXBsZXIoaW5wdXRJbmZvOiBJbnB1dEluZm8pOiBzdHJpbmcge1xuICBjb25zdCB0ZXhOYW1lID0gaW5wdXRJbmZvLm5hbWU7XG4gIGNvbnN0IGluU2l6ZSA9IHV0aWwuc2l6ZUZyb21TaGFwZShpbnB1dEluZm8uc2hhcGVJbmZvLmxvZ2ljYWxTaGFwZSk7XG5cbiAgaWYgKGluU2l6ZSA8IDIpIHtcbiAgICByZXR1cm4gYHJldHVybiAke3RleE5hbWV9O2A7XG4gIH1cblxuICByZXR1cm4gYFxuICAgIGZvciAoaW50IGkgPSAwOyBpIDwgJHtpblNpemV9OyBpKyspIHtcbiAgICAgIGlmIChpID09IGluZGV4KSB7XG4gICAgICAgIHJldHVybiAke3RleE5hbWV9W2ldO1xuICAgICAgfVxuICAgIH1cbiAgYDtcbn1cblxuZnVuY3Rpb24gZ2V0UGFja2VkU2FtcGxlckF0T3V0cHV0Q29vcmRzKFxuICAgIGlucHV0SW5mbzogSW5wdXRJbmZvLCBvdXRTaGFwZUluZm86IFNoYXBlSW5mbykge1xuICBjb25zdCB0ZXhOYW1lID0gaW5wdXRJbmZvLm5hbWU7XG4gIGNvbnN0IHRleEZ1bmNTbmlwcGV0ID0gdGV4TmFtZS5jaGFyQXQoMCkudG9VcHBlckNhc2UoKSArIHRleE5hbWUuc2xpY2UoMSk7XG4gIGNvbnN0IGZ1bmNOYW1lID0gJ2dldCcgKyB0ZXhGdW5jU25pcHBldCArICdBdE91dENvb3Jkcyc7XG4gIGNvbnN0IGluUmFuayA9IGlucHV0SW5mby5zaGFwZUluZm8ubG9naWNhbFNoYXBlLmxlbmd0aDtcbiAgY29uc3Qgb3V0UmFuayA9IG91dFNoYXBlSW5mby5sb2dpY2FsU2hhcGUubGVuZ3RoO1xuXG4gIGNvbnN0IGJyb2FkY2FzdERpbXMgPSBnZXRCcm9hZGNhc3REaW1zKFxuICAgICAgaW5wdXRJbmZvLnNoYXBlSW5mby5sb2dpY2FsU2hhcGUsIG91dFNoYXBlSW5mby5sb2dpY2FsU2hhcGUpO1xuXG4gIGNvbnN0IHR5cGUgPSBnZXRDb29yZHNEYXRhVHlwZShvdXRSYW5rKTtcbiAgY29uc3QgcmFua0RpZmYgPSBvdXRSYW5rIC0gaW5SYW5rO1xuICBsZXQgY29vcmRzU25pcHBldDogc3RyaW5nO1xuICBjb25zdCBmaWVsZHMgPSBbJ3gnLCAneScsICd6JywgJ3cnLCAndScsICd2J107XG5cbiAgaWYgKGluUmFuayA9PT0gMCkge1xuICAgIGNvb3Jkc1NuaXBwZXQgPSAnJztcbiAgfSBlbHNlIGlmIChvdXRSYW5rIDwgMiAmJiBicm9hZGNhc3REaW1zLmxlbmd0aCA+PSAxKSB7XG4gICAgY29vcmRzU25pcHBldCA9ICdjb29yZHMgPSAwOyc7XG4gIH0gZWxzZSB7XG4gICAgY29vcmRzU25pcHBldCA9XG4gICAgICAgIGJyb2FkY2FzdERpbXMubWFwKGQgPT4gYGNvb3Jkcy4ke2ZpZWxkc1tkICsgcmFua0RpZmZdfSA9IDA7YClcbiAgICAgICAgICAgIC5qb2luKCdcXG4nKTtcbiAgfVxuICBsZXQgdW5wYWNrZWRDb29yZHNTbmlwcGV0ID0gJyc7XG4gIGlmIChvdXRSYW5rIDwgMiAmJiBpblJhbmsgPiAwKSB7XG4gICAgdW5wYWNrZWRDb29yZHNTbmlwcGV0ID0gJ2Nvb3Jkcyc7XG4gIH0gZWxzZSB7XG4gICAgdW5wYWNrZWRDb29yZHNTbmlwcGV0ID0gaW5wdXRJbmZvLnNoYXBlSW5mby5sb2dpY2FsU2hhcGVcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLm1hcCgocywgaSkgPT4gYGNvb3Jkcy4ke2ZpZWxkc1tpICsgcmFua0RpZmZdfWApXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC5qb2luKCcsICcpO1xuICB9XG5cbiAgbGV0IG91dHB1dCA9IGByZXR1cm4gb3V0cHV0VmFsdWU7YDtcbiAgY29uc3QgaW5TaXplID0gdXRpbC5zaXplRnJvbVNoYXBlKGlucHV0SW5mby5zaGFwZUluZm8ubG9naWNhbFNoYXBlKTtcbiAgY29uc3QgaXNJbnB1dFNjYWxhciA9IGluU2l6ZSA9PT0gMTtcbiAgY29uc3Qgb3V0U2l6ZSA9IHV0aWwuc2l6ZUZyb21TaGFwZShvdXRTaGFwZUluZm8ubG9naWNhbFNoYXBlKTtcbiAgY29uc3QgaXNPdXRwdXRTY2FsYXIgPSBvdXRTaXplID09PSAxO1xuXG4gIGlmIChpblJhbmsgPT09IDEgJiYgIWlzSW5wdXRTY2FsYXIgJiYgIWlzT3V0cHV0U2NhbGFyKSB7XG4gICAgb3V0cHV0ID0gYFxuICAgICAgcmV0dXJuIHZlYzQob3V0cHV0VmFsdWUueHksIG91dHB1dFZhbHVlLnh5KTtcbiAgICBgO1xuICB9IGVsc2UgaWYgKGlzSW5wdXRTY2FsYXIgJiYgIWlzT3V0cHV0U2NhbGFyKSB7XG4gICAgaWYgKG91dFJhbmsgPT09IDEpIHtcbiAgICAgIG91dHB1dCA9IGBcbiAgICAgICAgcmV0dXJuIHZlYzQob3V0cHV0VmFsdWUueCwgb3V0cHV0VmFsdWUueCwgMC4sIDAuKTtcbiAgICAgIGA7XG4gICAgfSBlbHNlIHtcbiAgICAgIG91dHB1dCA9IGBcbiAgICAgICAgcmV0dXJuIHZlYzQob3V0cHV0VmFsdWUueCk7XG4gICAgICBgO1xuICAgIH1cbiAgfSBlbHNlIGlmIChicm9hZGNhc3REaW1zLmxlbmd0aCkge1xuICAgIGNvbnN0IHJvd3MgPSBpblJhbmsgLSAyO1xuICAgIGNvbnN0IGNvbHMgPSBpblJhbmsgLSAxO1xuXG4gICAgaWYgKGJyb2FkY2FzdERpbXMuaW5kZXhPZihyb3dzKSA+IC0xICYmIGJyb2FkY2FzdERpbXMuaW5kZXhPZihjb2xzKSA+IC0xKSB7XG4gICAgICBvdXRwdXQgPSBgcmV0dXJuIHZlYzQob3V0cHV0VmFsdWUueCk7YDtcbiAgICB9IGVsc2UgaWYgKGJyb2FkY2FzdERpbXMuaW5kZXhPZihyb3dzKSA+IC0xKSB7XG4gICAgICBvdXRwdXQgPSBgcmV0dXJuIHZlYzQob3V0cHV0VmFsdWUueCwgb3V0cHV0VmFsdWUueSwgYCArXG4gICAgICAgICAgYG91dHB1dFZhbHVlLngsIG91dHB1dFZhbHVlLnkpO2A7XG4gICAgfSBlbHNlIGlmIChicm9hZGNhc3REaW1zLmluZGV4T2YoY29scykgPiAtMSkge1xuICAgICAgb3V0cHV0ID0gYHJldHVybiB2ZWM0KG91dHB1dFZhbHVlLnh4LCBvdXRwdXRWYWx1ZS56eik7YDtcbiAgICB9XG4gIH1cblxuICByZXR1cm4gYFxuICAgIHZlYzQgJHtmdW5jTmFtZX0oKSB7XG4gICAgICAke3R5cGV9IGNvb3JkcyA9IGdldE91dHB1dENvb3JkcygpO1xuICAgICAgJHtjb29yZHNTbmlwcGV0fVxuICAgICAgdmVjNCBvdXRwdXRWYWx1ZSA9IGdldCR7dGV4RnVuY1NuaXBwZXR9KCR7dW5wYWNrZWRDb29yZHNTbmlwcGV0fSk7XG4gICAgICAke291dHB1dH1cbiAgICB9XG4gIGA7XG59XG5cbmZ1bmN0aW9uIGdldFNhbXBsZXJBdE91dHB1dENvb3JkcyhcbiAgICBpbnB1dEluZm86IElucHV0SW5mbywgb3V0U2hhcGVJbmZvOiBTaGFwZUluZm8pIHtcbiAgY29uc3QgdGV4TmFtZSA9IGlucHV0SW5mby5uYW1lO1xuICBjb25zdCB0ZXhGdW5jU25pcHBldCA9IHRleE5hbWUuY2hhckF0KDApLnRvVXBwZXJDYXNlKCkgKyB0ZXhOYW1lLnNsaWNlKDEpO1xuICBjb25zdCBmdW5jTmFtZSA9ICdnZXQnICsgdGV4RnVuY1NuaXBwZXQgKyAnQXRPdXRDb29yZHMnO1xuICBjb25zdCBvdXRUZXhTaGFwZSA9IG91dFNoYXBlSW5mby50ZXhTaGFwZTtcbiAgY29uc3QgaW5UZXhTaGFwZSA9IGlucHV0SW5mby5zaGFwZUluZm8udGV4U2hhcGU7XG4gIGNvbnN0IGluUmFuayA9IGlucHV0SW5mby5zaGFwZUluZm8ubG9naWNhbFNoYXBlLmxlbmd0aDtcbiAgY29uc3Qgb3V0UmFuayA9IG91dFNoYXBlSW5mby5sb2dpY2FsU2hhcGUubGVuZ3RoO1xuXG4gIGlmICghaW5wdXRJbmZvLnNoYXBlSW5mby5pc1VuaWZvcm0gJiYgaW5SYW5rID09PSBvdXRSYW5rICYmXG4gICAgICBpbnB1dEluZm8uc2hhcGVJbmZvLmZsYXRPZmZzZXQgPT0gbnVsbCAmJlxuICAgICAgdXRpbC5hcnJheXNFcXVhbChpblRleFNoYXBlLCBvdXRUZXhTaGFwZSkpIHtcbiAgICByZXR1cm4gYFxuICAgICAgZmxvYXQgJHtmdW5jTmFtZX0oKSB7XG4gICAgICAgIHJldHVybiBzYW1wbGVUZXh0dXJlKCR7dGV4TmFtZX0sIHJlc3VsdFVWKTtcbiAgICAgIH1cbiAgICBgO1xuICB9XG5cbiAgY29uc3QgdHlwZSA9IGdldENvb3Jkc0RhdGFUeXBlKG91dFJhbmspO1xuICBjb25zdCBicm9hZGNhc3REaW1zID0gZ2V0QnJvYWRjYXN0RGltcyhcbiAgICAgIGlucHV0SW5mby5zaGFwZUluZm8ubG9naWNhbFNoYXBlLCBvdXRTaGFwZUluZm8ubG9naWNhbFNoYXBlKTtcbiAgY29uc3QgcmFua0RpZmYgPSBvdXRSYW5rIC0gaW5SYW5rO1xuICBsZXQgY29vcmRzU25pcHBldDogc3RyaW5nO1xuICBjb25zdCBmaWVsZHMgPSBbJ3gnLCAneScsICd6JywgJ3cnLCAndScsICd2J107XG5cbiAgaWYgKGluUmFuayA9PT0gMCkge1xuICAgIGNvb3Jkc1NuaXBwZXQgPSAnJztcbiAgfSBlbHNlIGlmIChvdXRSYW5rIDwgMiAmJiBicm9hZGNhc3REaW1zLmxlbmd0aCA+PSAxKSB7XG4gICAgY29vcmRzU25pcHBldCA9ICdjb29yZHMgPSAwOyc7XG4gIH0gZWxzZSB7XG4gICAgY29vcmRzU25pcHBldCA9XG4gICAgICAgIGJyb2FkY2FzdERpbXMubWFwKGQgPT4gYGNvb3Jkcy4ke2ZpZWxkc1tkICsgcmFua0RpZmZdfSA9IDA7YClcbiAgICAgICAgICAgIC5qb2luKCdcXG4nKTtcbiAgfVxuICBsZXQgdW5wYWNrZWRDb29yZHNTbmlwcGV0ID0gJyc7XG4gIGlmIChvdXRSYW5rIDwgMiAmJiBpblJhbmsgPiAwKSB7XG4gICAgdW5wYWNrZWRDb29yZHNTbmlwcGV0ID0gJ2Nvb3Jkcyc7XG4gIH0gZWxzZSB7XG4gICAgdW5wYWNrZWRDb29yZHNTbmlwcGV0ID0gaW5wdXRJbmZvLnNoYXBlSW5mby5sb2dpY2FsU2hhcGVcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLm1hcCgocywgaSkgPT4gYGNvb3Jkcy4ke2ZpZWxkc1tpICsgcmFua0RpZmZdfWApXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC5qb2luKCcsICcpO1xuICB9XG5cbiAgcmV0dXJuIGBcbiAgICBmbG9hdCAke2Z1bmNOYW1lfSgpIHtcbiAgICAgICR7dHlwZX0gY29vcmRzID0gZ2V0T3V0cHV0Q29vcmRzKCk7XG4gICAgICAke2Nvb3Jkc1NuaXBwZXR9XG4gICAgICByZXR1cm4gZ2V0JHt0ZXhGdW5jU25pcHBldH0oJHt1bnBhY2tlZENvb3Jkc1NuaXBwZXR9KTtcbiAgICB9XG4gIGA7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBnZXRDb29yZHNEYXRhVHlwZShyYW5rOiBudW1iZXIpOiBzdHJpbmcge1xuICBpZiAocmFuayA8PSAxKSB7XG4gICAgcmV0dXJuICdpbnQnO1xuICB9IGVsc2UgaWYgKHJhbmsgPT09IDIpIHtcbiAgICByZXR1cm4gJ2l2ZWMyJztcbiAgfSBlbHNlIGlmIChyYW5rID09PSAzKSB7XG4gICAgcmV0dXJuICdpdmVjMyc7XG4gIH0gZWxzZSBpZiAocmFuayA9PT0gNCkge1xuICAgIHJldHVybiAnaXZlYzQnO1xuICB9IGVsc2UgaWYgKHJhbmsgPT09IDUpIHtcbiAgICByZXR1cm4gJ2l2ZWM1JztcbiAgfSBlbHNlIGlmIChyYW5rID09PSA2KSB7XG4gICAgcmV0dXJuICdpdmVjNic7XG4gIH0gZWxzZSB7XG4gICAgdGhyb3cgRXJyb3IoYEdQVSBmb3IgcmFuayAke3Jhbmt9IGlzIG5vdCB5ZXQgc3VwcG9ydGVkYCk7XG4gIH1cbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGdldFVuaWZvcm1JbmZvRnJvbVNoYXBlKFxuICAgIGlzUGFja2VkOiBib29sZWFuLCBzaGFwZTogbnVtYmVyW10sIHRleFNoYXBlOiBudW1iZXJbXSkge1xuICBjb25zdCB7bmV3U2hhcGUsIGtlcHREaW1zfSA9IHV0aWwuc3F1ZWV6ZVNoYXBlKHNoYXBlKTtcbiAgY29uc3QgcmFuayA9IHNoYXBlLmxlbmd0aDtcbiAgY29uc3QgdXNlU3F1ZWV6ZVBhY2tlZFNoYXBlID0gaXNQYWNrZWQgJiYgcmFuayA9PT0gMyAmJiBzaGFwZVswXSA9PT0gMTtcbiAgY29uc3Qgc3F1ZWV6ZVNoYXBlID0gdXNlU3F1ZWV6ZVBhY2tlZFNoYXBlID8gc2hhcGUuc2xpY2UoMSkgOiBuZXdTaGFwZTtcbiAgY29uc3QgdXNlU3F1ZWV6ZVNoYXBlID1cbiAgICAgICghaXNQYWNrZWQgJiYgcmFuayA+IDEgJiYgIXV0aWwuYXJyYXlzRXF1YWwoc2hhcGUsIHRleFNoYXBlKSAmJlxuICAgICAgIG5ld1NoYXBlLmxlbmd0aCA8IHJhbmspIHx8XG4gICAgICB1c2VTcXVlZXplUGFja2VkU2hhcGU7XG4gIGNvbnN0IHVuaWZvcm1TaGFwZSA9IHVzZVNxdWVlemVTaGFwZSA/IHNxdWVlemVTaGFwZSA6IHNoYXBlO1xuICByZXR1cm4ge3VzZVNxdWVlemVTaGFwZSwgdW5pZm9ybVNoYXBlLCBrZXB0RGltc307XG59XG5cbi8qKiBSZXR1cm5zIGEgbmV3IGlucHV0IGluZm8gKGEgY29weSkgdGhhdCBoYXMgYSBzcXVlZXplZCBsb2dpY2FsIHNoYXBlLiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHNxdWVlemVJbnB1dEluZm8oXG4gICAgaW5JbmZvOiBJbnB1dEluZm8sIHNxdWVlemVkU2hhcGU6IG51bWJlcltdKTogSW5wdXRJbmZvIHtcbiAgLy8gRGVlcCBjb3B5LlxuICBjb25zdCBuZXdJbnB1dEluZm86IElucHV0SW5mbyA9IEpTT04ucGFyc2UoSlNPTi5zdHJpbmdpZnkoaW5JbmZvKSk7XG4gIG5ld0lucHV0SW5mby5zaGFwZUluZm8ubG9naWNhbFNoYXBlID0gc3F1ZWV6ZWRTaGFwZTtcbiAgcmV0dXJuIG5ld0lucHV0SW5mbztcbn1cblxuZnVuY3Rpb24gZ2V0U3F1ZWV6ZWRQYXJhbXMocGFyYW1zOiBzdHJpbmdbXSwga2VwdERpbXM6IG51bWJlcltdKTogc3RyaW5nIHtcbiAgcmV0dXJuIGtlcHREaW1zLm1hcChkID0+IHBhcmFtc1tkXSkuam9pbignLCAnKTtcbn1cbiJdfQ==","/**\n * @license\n * Copyright 2017 Google LLC. All Rights Reserved.\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n * =============================================================================\n */\nimport { backend_util, env, util } from '@tensorflow/tfjs-core';\nimport * as shader_compiler from './shader_compiler';\nimport { createFragmentShader } from './webgl_util';\nexport function compileProgram(gpgpu, program, inputs, output) {\n const inputInfos = inputs.map((input, i) => {\n const shapeInfo = {\n logicalShape: input.shape,\n texShape: input.isUniform ? null : input.texData.texShape,\n isUniform: input.isUniform,\n isPacked: input.isUniform ? false : input.texData.isPacked,\n flatOffset: null\n };\n if (input.texData != null && input.texData.slice != null &&\n input.texData.slice.flatOffset > 0) {\n shapeInfo.flatOffset = input.texData.slice.flatOffset;\n }\n return { name: program.variableNames[i], shapeInfo };\n });\n const inShapeInfos = inputInfos.map(x => x.shapeInfo);\n const outShapeInfo = {\n logicalShape: output.shape,\n texShape: output.texData.texShape,\n isUniform: false,\n isPacked: output.texData.isPacked,\n flatOffset: null\n };\n const source = shader_compiler.makeShader(inputInfos, outShapeInfo, program);\n const fragmentShader = createFragmentShader(gpgpu.gl, source);\n const webGLProgram = gpgpu.createProgram(fragmentShader);\n if (!env().get('ENGINE_COMPILE_ONLY')) {\n return Object.assign({ program,\n fragmentShader,\n source,\n webGLProgram,\n inShapeInfos,\n outShapeInfo }, getUniformLocations(gpgpu, program, webGLProgram));\n }\n else {\n return {\n program,\n fragmentShader,\n source,\n webGLProgram,\n inShapeInfos,\n outShapeInfo,\n uniformLocations: null,\n customUniformLocations: null,\n infLoc: null,\n nanLoc: null,\n inShapesLocations: null,\n inTexShapesLocations: null,\n outShapeLocation: null,\n outShapeStridesLocation: null,\n outTexShapeLocation: null\n };\n }\n}\nexport function getUniformLocations(gpgpu, program, webGLProgram) {\n const uniformLocations = {};\n const inShapesLocations = {};\n const inTexShapesLocations = {};\n const customUniformLocations = [];\n let outShapeLocation;\n let outTexShapeLocation;\n let outShapeStridesLocation;\n let infLoc = null;\n let nanLoc = null;\n // Add special uniforms (NAN, INFINITY)\n nanLoc = gpgpu.getUniformLocation(webGLProgram, 'NAN', false);\n if (env().getNumber('WEBGL_VERSION') === 1) {\n infLoc = gpgpu.getUniformLocation(webGLProgram, 'INFINITY', false);\n }\n // Add user-defined uniforms\n const shouldThrow = false;\n for (let i = 0; i < program.variableNames.length; i++) {\n const varName = program.variableNames[i];\n uniformLocations[varName] =\n gpgpu.getUniformLocation(webGLProgram, varName, shouldThrow);\n uniformLocations[`offset${varName}`] =\n gpgpu.getUniformLocation(webGLProgram, `offset${varName}`, shouldThrow);\n if (program.enableShapeUniforms) {\n inShapesLocations[`${varName}Shape`] = gpgpu.getUniformLocation(webGLProgram, `${varName}Shape`, shouldThrow);\n inTexShapesLocations[`${varName}TexShape`] = gpgpu.getUniformLocation(webGLProgram, `${varName}TexShape`, shouldThrow);\n }\n }\n if (program.enableShapeUniforms) {\n outShapeLocation =\n gpgpu.getUniformLocation(webGLProgram, 'outShape', shouldThrow);\n outShapeStridesLocation =\n gpgpu.getUniformLocation(webGLProgram, 'outShapeStrides', shouldThrow);\n outTexShapeLocation =\n gpgpu.getUniformLocation(webGLProgram, 'outTexShape', shouldThrow);\n }\n if (program.customUniforms) {\n program.customUniforms.forEach((d, i) => {\n customUniformLocations[i] =\n gpgpu.getUniformLocation(webGLProgram, d.name, shouldThrow);\n });\n }\n return {\n uniformLocations,\n customUniformLocations,\n infLoc,\n nanLoc,\n inShapesLocations,\n inTexShapesLocations,\n outShapeLocation,\n outShapeStridesLocation,\n outTexShapeLocation\n };\n}\nfunction validateBinaryAndProgram(shapeInfos, inputs) {\n if (shapeInfos.length !== inputs.length) {\n throw Error(`Binary was compiled with ${shapeInfos.length} inputs, but ` +\n `was executed with ${inputs.length} inputs`);\n }\n shapeInfos.forEach((s, i) => {\n const shapeA = s.logicalShape;\n const input = inputs[i];\n const shapeB = input.shape;\n if (!util.arraysEqual(shapeA, shapeB)) {\n throw Error(`Binary was compiled with different shapes than ` +\n `the current args. Shapes ${shapeA} and ${shapeB} must match`);\n }\n // The input is uploaded as uniform.\n if (s.isUniform && input.isUniform) {\n return;\n }\n const texShapeA = s.texShape;\n const texShapeB = input.isUniform ? null : input.texData.texShape;\n if (!util.arraysEqual(texShapeA, texShapeB)) {\n throw Error(`Binary was compiled with different texture shapes than the` +\n ` current args. Shape ${texShapeA} and ${texShapeB} must match`);\n }\n });\n}\nexport function runProgram(gpgpu, binary, inputs, output, customUniformValues) {\n if (!binary.program.enableShapeUniforms) {\n validateBinaryAndProgram(binary.inShapeInfos, inputs);\n validateBinaryAndProgram([binary.outShapeInfo], [output]);\n }\n const outTex = output.texData.texture;\n const outTexShape = output.texData.texShape;\n if (output.texData.isPacked) {\n gpgpu.setOutputPackedMatrixTexture(outTex.texture, outTexShape[0], outTexShape[1]);\n }\n else {\n gpgpu.setOutputMatrixTexture(outTex.texture, outTexShape[0], outTexShape[1]);\n }\n gpgpu.setProgram(binary.webGLProgram);\n // Set special uniforms (NAN, INFINITY)\n if (env().getNumber('WEBGL_VERSION') === 1) {\n if (binary.infLoc !== null) {\n gpgpu.gl.uniform1f(binary.infLoc, Infinity);\n }\n }\n if (binary.nanLoc !== null) {\n gpgpu.gl.uniform1f(binary.nanLoc, NaN);\n }\n // Set user-defined inputs\n inputs.forEach((input, i) => {\n const varName = binary.program.variableNames[i];\n const varLoc = binary.uniformLocations[varName];\n const varOffsetLoc = binary.uniformLocations[`offset${varName}`];\n const varShapeLoc = binary.inShapesLocations[`${varName}Shape`];\n const varTexShapeLoc = binary.inTexShapesLocations[`${varName}TexShape`];\n if (varShapeLoc) {\n const { uniformShape } = shader_compiler.getUniformInfoFromShape(binary.program.packedInputs, input.shape, input.texData.texShape);\n switch (uniformShape.length) {\n case 1:\n gpgpu.gl.uniform1iv(varShapeLoc, new Int32Array(uniformShape));\n break;\n case 2:\n gpgpu.gl.uniform2iv(varShapeLoc, new Int32Array(uniformShape));\n break;\n case 3:\n gpgpu.gl.uniform3iv(varShapeLoc, new Int32Array(uniformShape));\n break;\n case 4:\n gpgpu.gl.uniform4iv(varShapeLoc, new Int32Array(uniformShape));\n break;\n default:\n break;\n }\n }\n if (varTexShapeLoc) {\n gpgpu.gl.uniform2i(varTexShapeLoc, input.texData.texShape[0], input.texData.texShape[1]);\n }\n if (varLoc == null) {\n // The compiler inferred that this variable is not used in this shader.\n return;\n }\n if (input.isUniform) {\n // Upload the values of the tensor as uniform.\n if (util.sizeFromShape(input.shape) < 2) {\n gpgpu.gl.uniform1f(varLoc, input.uniformValues[0]);\n }\n else {\n let vals = input.uniformValues;\n if (!(vals instanceof Float32Array)) {\n vals = new Float32Array(vals);\n }\n gpgpu.gl.uniform1fv(varLoc, vals);\n }\n return;\n }\n // If the input was sliced, upload the flat offset index.\n if (input.texData.slice != null && varOffsetLoc != null) {\n gpgpu.gl.uniform1i(varOffsetLoc, input.texData.slice.flatOffset);\n }\n gpgpu.setInputMatrixTexture(input.texData.texture.texture, varLoc, i);\n });\n const outShapeLoc = binary.outShapeLocation;\n if (outShapeLoc) {\n switch (output.shape.length) {\n case 1:\n gpgpu.gl.uniform1iv(outShapeLoc, new Int32Array(output.shape));\n break;\n case 2:\n gpgpu.gl.uniform2iv(outShapeLoc, new Int32Array(output.shape));\n break;\n case 3:\n gpgpu.gl.uniform3iv(outShapeLoc, new Int32Array(output.shape));\n break;\n case 4:\n gpgpu.gl.uniform4iv(outShapeLoc, new Int32Array(output.shape));\n break;\n default:\n break;\n }\n }\n if (binary.outShapeStridesLocation) {\n const strides = util.computeStrides(output.shape);\n switch (output.shape.length) {\n case 2:\n gpgpu.gl.uniform1iv(binary.outShapeStridesLocation, new Int32Array(strides));\n break;\n case 3:\n gpgpu.gl.uniform2iv(binary.outShapeStridesLocation, new Int32Array(strides));\n break;\n case 4:\n gpgpu.gl.uniform3iv(binary.outShapeStridesLocation, new Int32Array(strides));\n break;\n default:\n break;\n }\n }\n if (binary.outTexShapeLocation) {\n gpgpu.gl.uniform2i(binary.outTexShapeLocation, output.texData.texShape[0], output.texData.texShape[1]);\n }\n if (binary.program.customUniforms && customUniformValues) {\n binary.program.customUniforms.forEach((d, i) => {\n const customLoc = binary.customUniformLocations[i];\n const customValue = customUniformValues[i];\n if (d.type === 'float') {\n gpgpu.gl.uniform1fv(customLoc, customValue);\n }\n else if (d.type === 'vec2') {\n gpgpu.gl.uniform2fv(customLoc, customValue);\n }\n else if (d.type === 'vec3') {\n gpgpu.gl.uniform3fv(customLoc, customValue);\n }\n else if (d.type === 'vec4') {\n gpgpu.gl.uniform4fv(customLoc, customValue);\n }\n else if (d.type === 'int') {\n gpgpu.gl.uniform1iv(customLoc, customValue);\n }\n else if (d.type === 'ivec2') {\n gpgpu.gl.uniform2iv(customLoc, customValue);\n }\n else if (d.type === 'ivec3') {\n gpgpu.gl.uniform3iv(customLoc, customValue);\n }\n else if (d.type === 'ivec4') {\n gpgpu.gl.uniform4iv(customLoc, customValue);\n }\n else {\n throw Error(`uniform type ${d.type} is not supported yet.`);\n }\n });\n }\n gpgpu.executeProgram();\n}\nexport function makeShaderKey(program, inputs, output) {\n let keyInputs = '';\n inputs.concat(output).forEach(x => {\n const hasOffset = x.texData != null && x.texData.slice != null &&\n x.texData.slice.flatOffset > 0;\n // TODO: Remove the condition of !x.isUniform.\n if (program.enableShapeUniforms && !x.isUniform) {\n const xTexShape = x.texData.texShape;\n const { useSqueezeShape, uniformShape, keptDims } = shader_compiler.getUniformInfoFromShape(program.packedInputs, x.shape, xTexShape);\n let rank1 = '', rank2 = '', rank34 = '';\n if (uniformShape.length === 1 && program.packedInputs) {\n const packedTexShape = [Math.ceil(xTexShape[0] / 2), Math.ceil(xTexShape[1] / 2)];\n rank1 = `${packedTexShape[0] > 1}_${packedTexShape[1] > 1}`;\n }\n else if (uniformShape.length === 2 && !program.packedInputs) {\n rank2 = `${uniformShape[0] > 1}_${uniformShape[1] > 1}`;\n }\n else if (uniformShape.length > 2 && !program.packedInputs) {\n const strides = util.computeStrides(uniformShape);\n rank34 = `${strides[0] === xTexShape[1]}_${strides[strides.length - 1] === xTexShape[1]}`;\n }\n const xRank = x.shape.length;\n const isLogicalShapTexShapeEqual = uniformShape.length === 2 && util.arraysEqual(x.shape, xTexShape);\n const isScalar = util.sizeFromShape(x.shape) === 1;\n const broadcastDims = backend_util.getBroadcastDims(x.shape, output.shape);\n const isInOutTexShapeEqual = !program.packedInputs &&\n xRank === output.shape.length &&\n util.arraysEqual(xTexShape, output.texData.texShape);\n const isTexShapeGreaterThanOne = program.packedInputs || uniformShape.length > 2 ?\n '' :\n `${xTexShape[0] > 1}_${xTexShape[1] > 1}`;\n // These key components are needed due to shader_compiler is embedding\n // them in the shader.\n // |xRank| is used to determine the coords length. See\n // get[Packed]SamplerAtOutputCoords.\n // |isInOutTexShapeEqual| is used to determine whether going to an\n // optimization path in getSamplerAtOutputCoords.\n // |useSqueezeShape| is extracted from squeezeInputInfo of\n // getSampler[2|3|4]D/getPackedSampler3D.\n // |isScalar| is extracted from isInputScalar/isOutputScalar in\n // getPackedSamplerAtOutputCoords.\n // |broadcastDims| is extracted from get[Packed]SamplerAtOutputCoords.\n // |isLogicalShapTexShapeEqual| is used in\n // getOutput[Packed]2DCoords/get[Packed]Sampler2D.\n // |rank1| is used in getOutputPacked1DCoords.\n // |rank2| is used in getOutput2DCoords.\n // |rank34| is used in getSampler3D/getSampler4D.\n // |isTexShapeGreaterThanOne| are used in\n // getSampler[Scalar|1D|2D]/getOutput1DCoords.\n keyInputs += `${xRank}_${isInOutTexShapeEqual}_${useSqueezeShape ? keptDims : ''}_${uniformShape.length}_${isScalar}_${broadcastDims}_${isLogicalShapTexShapeEqual}_${rank1}_${rank2}_${rank34}_${isTexShapeGreaterThanOne}_${hasOffset}`;\n }\n else {\n const texShape = x.isUniform ? 'uniform' : x.texData.texShape;\n keyInputs += `${x.shape}_${texShape}_${hasOffset}`;\n }\n });\n const keyUserCode = program.userCode;\n let key = program.constructor.name;\n // Fast string concat. See https://jsperf.com/string-concatenation/14.\n key += '_' + keyInputs + '_' + keyUserCode +\n `${env().getNumber('WEBGL_VERSION')}`;\n return key;\n}\nexport function useShapeUniforms(rank) {\n // TODO: Remove the limitaion of rank <= 4.\n return env().getBool('WEBGL_USE_SHAPES_UNIFORMS') && rank <= 4;\n}\n//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZ3BncHVfbWF0aC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uL3RmanMtYmFja2VuZC13ZWJnbC9zcmMvZ3BncHVfbWF0aC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQTs7Ozs7Ozs7Ozs7Ozs7O0dBZUc7QUFFSCxPQUFPLEVBQUMsWUFBWSxFQUFFLEdBQUcsRUFBc0IsSUFBSSxFQUFDLE1BQU0sdUJBQXVCLENBQUM7QUFHbEYsT0FBTyxLQUFLLGVBQWUsTUFBTSxtQkFBbUIsQ0FBQztBQUdyRCxPQUFPLEVBQUMsb0JBQW9CLEVBQUMsTUFBTSxjQUFjLENBQUM7QUErRGxELE1BQU0sVUFBVSxjQUFjLENBQzFCLEtBQW1CLEVBQUUsT0FBcUIsRUFBRSxNQUFvQixFQUNoRSxNQUFrQjtJQUNwQixNQUFNLFVBQVUsR0FBZ0IsTUFBTSxDQUFDLEdBQUcsQ0FBQyxDQUFDLEtBQUssRUFBRSxDQUFDLEVBQUUsRUFBRTtRQUN0RCxNQUFNLFNBQVMsR0FBYztZQUMzQixZQUFZLEVBQUUsS0FBSyxDQUFDLEtBQUs7WUFDekIsUUFBUSxFQUFFLEtBQUssQ0FBQyxTQUFTLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsS0FBSyxDQUFDLE9BQU8sQ0FBQyxRQUFRO1lBQ3pELFNBQVMsRUFBRSxLQUFLLENBQUMsU0FBUztZQUMxQixRQUFRLEVBQUUsS0FBSyxDQUFDLFNBQVMsQ0FBQyxDQUFDLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQyxLQUFLLENBQUMsT0FBTyxDQUFDLFFBQVE7WUFDMUQsVUFBVSxFQUFFLElBQUk7U0FDakIsQ0FBQztRQUNGLElBQUksS0FBSyxDQUFDLE9BQU8sSUFBSSxJQUFJLElBQUksS0FBSyxDQUFDLE9BQU8sQ0FBQyxLQUFLLElBQUksSUFBSTtZQUNwRCxLQUFLLENBQUMsT0FBTyxDQUFDLEtBQUssQ0FBQyxVQUFVLEdBQUcsQ0FBQyxFQUFFO1lBQ3RDLFNBQVMsQ0FBQyxVQUFVLEdB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QUFJLG9CQUFvQixJQUN6QyxlQUFlLENBQUMsQ0FBQyxDQUFDLFFBQVEsQ0FBQyxDQUFDLENBQUMsRUFBRSxJQUFJLFlBQVksQ0FBQyxNQUFNLElBQUksUUFBUSxJQUNsRSxhQUFhLElBQUksMEJBQTBCLElBQUksS0FBSyxJQUFJLEtBQUssSUFDN0QsTUFBTSxJQUFJLHdCQUF3QixJQUFJLFNBQVMsRUFBRSxDQUFDO1NBQ3ZEO2FBQU07WUFDTCxNQUFNLFFBQVEsR0FBRyxDQUFDLENBQUMsU0FBUyxDQUFDLENBQUMsQ0FBQyxTQUFTLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxPQUFPLENBQUMsUUFBUSxDQUFDO1lBQzlELFNBQVMsSUFBSSxHQUFHLENBQUMsQ0FBQyxLQUFLLElBQUksUUFBUSxJQUFJLFNBQVMsRUFBRSxDQUFDO1NBQ3BEO0lBQ0gsQ0FBQyxDQUFDLENBQUM7SUFDSCxNQUFNLFdBQVcsR0FBRyxPQUFPLENBQUMsUUFBUSxDQUFDO0lBQ3JDLElBQUksR0FBRyxHQUFHLE9BQU8sQ0FBQyxXQUFXLENBQUMsSUFBSSxDQUFDO0lBQ25DLHNFQUFzRTtJQUN0RSxHQUFHLElBQUksR0FBRyxHQUFHLFNBQVMsR0FBRyxHQUFHLEdBQUcsV0FBVztRQUN0QyxHQUFHLEdBQUcsRUFBRSxDQUFDLFNBQVMsQ0FBQyxlQUFlLENBQUMsRUFBRSxDQUFDO0lBQzFDLE9BQU8sR0FBRyxDQUFDO0FBQ2IsQ0FBQztBQUVELE1BQU0sVUFBVSxnQkFBZ0IsQ0FBQyxJQUFZO0lBQzNDLDJDQUEyQztJQUMzQyxPQUFPLEdBQUcsRUFBRSxDQUFDLE9BQU8sQ0FBQywyQkFBMkIsQ0FBQyxJQUFJLElBQUksSUFBSSxDQUFDLENBQUM7QUFDakUsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbIi8qKlxuICogQGxpY2Vuc2VcbiAqIENvcHlyaWdodCAyMDE3IEdvb2dsZSBMTEMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuXG4gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgXCJMaWNlbnNlXCIpO1xuICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLlxuICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0XG4gKlxuICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wXG4gKlxuICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZVxuICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gXCJBUyBJU1wiIEJBU0lTLFxuICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuXG4gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kXG4gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS5cbiAqID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4gKi9cblxuaW1wb3J0IHtiYWNrZW5kX3V0aWwsIGVudiwgVGVuc29yLCBUeXBlZEFycmF5LCB1dGlsfSBmcm9tICdAdGVuc29yZmxvdy90ZmpzLWNvcmUnO1xuXG5pbXBvcnQge0dQR1BVQ29udGV4dH0gZnJvbSAnLi9ncGdwdV9jb250ZXh0JztcbmltcG9ydCAqIGFzIHNoYWRlcl9jb21waWxlciBmcm9tICcuL3NoYWRlcl9jb21waWxlcic7XG5pbXBvcnQge0lucHV0SW5mbywgU2hhcGVJbmZvLCBVbmlmb3JtVHlwZX0gZnJvbSAnLi9zaGFkZXJfY29tcGlsZXInO1xuaW1wb3J0IHtQYWNraW5nU2NoZW1lLCBUZXh0dXJlRGF0YSwgVGV4dHVyZVVzYWdlfSBmcm9tICcuL3RleF91dGlsJztcbmltcG9ydCB7Y3JlYXRlRnJhZ21lbnRTaGFkZXJ9IGZyb20gJy4vd2ViZ2xfdXRpbCc7XG5cbmV4cG9ydCBpbnRlcmZhY2UgR1BHUFVQcm9ncmFtIHtcbiAgdmFyaWFibGVOYW1lczogc3RyaW5nW107XG4gIG91dHB1dFNoYXBlOiBudW1iZXJbXTtcbiAgdXNlckNvZGU6IHN0cmluZztcbiAgZW5hYmxlU2hhcGVVbmlmb3Jtcz86IGJvb2xlYW47XG4gIC8qKiBJZiB0cnVlLCB0aGlzIHByb2dyYW0gZXhwZWN0cyBwYWNrZWQgaW5wdXQgdGV4dHVyZXMuIERlZmF1bHRzIHRvIGZhbHNlLiAqL1xuICBwYWNrZWRJbnB1dHM/OiBib29sZWFuO1xuICAvKiogSWYgdHJ1ZSwgdGhpcyBwcm9ncmFtIHByb2R1Y2VzIGEgcGFja2VkIHRleHR1cmUuIERlZmF1bHRzIHRvIGZhbHNlLiAqL1xuICBwYWNrZWRPdXRwdXQ/OiBib29sZWFuO1xuICAvKipcbiAgICogQWZmZWN0cyB3aGF0IHR5cGUgb2YgdGV4dHVyZSB3ZSBhbGxvY2F0ZSBmb3IgdGhlIG91dHB1dC4gRGVmYXVsdHMgdG9cbiAgICogYFRleHR1cmVVc2FnZS5SRU5ERVJgLlxuICAgKi9cbiAgb3V0VGV4VXNhZ2U/OiBUZXh0dXJlVXNhZ2U7XG4gIC8qKlxuICAgKiBUaGUgdHlwZSBvZiBzY2hlbWUgdG8gdXNlIHdoZW4gcGFja2luZyB0ZXhlbHMgZm9yIHRoZSBvdXRwdXQgdmFsdWVzLlxuICAgKiBTZWUgYFBhY2tpbmdTY2hlbWVgIGZvciBkZXRhaWxzLiBEZWZhdWx0cyB0byBgUGFja2luZ1NjaGVtZS5TSEFSRURfQkFUQ0hgLlxuICAgKi9cbiAgb3V0UGFja2luZ1NjaGVtZT86IFBhY2tpbmdTY2hlbWU7XG4gIGN1c3RvbVVuaWZvcm1zPzpcbiAgICAgIEFycmF5PHtuYW1lOiBzdHJpbmc7IGFycmF5SW5kZXg/OiBudW1iZXI7IHR5cGU6IFVuaWZvcm1UeXBlO30+O1xufVxuXG5leHBvcnQgaW50ZXJmYWNlIEdQR1BVQmluYXJ5IHtcbiAgd2ViR0xQcm9ncmFtOiBXZWJHTFByb2dyYW07XG4gIHByb2dyYW06IEdQR1BVUHJvZ3JhbTtcbiAgdW5pZm9ybUxvY2F0aW9uczoge1tuYW1lOiBzdHJpbmddOiBXZWJHTFVuaWZvcm1Mb2NhdGlvbn07XG4gIGN1c3RvbVVuaWZvcm1Mb2NhdGlvbnM/OiBXZWJHTFVuaWZvcm1Mb2NhdGlvbltdO1xuICBzb3VyY2U6IHN0cmluZztcbiAgZnJhZ21lbnRTaGFkZXI6IFdlYkdMU2hhZGVyO1xuICBpblNoYXBlSW5mb3M6IFNoYXBlSW5mb1tdO1xuICBvdXRTaGFwZUluZm86IFNoYXBlSW5mbztcbiAgaW5mTG9jOiBXZWJHTFVuaWZvcm1Mb2NhdGlvbjtcbiAgbmFuTG9jOiBXZWJHTFVuaWZvcm1Mb2NhdGlvbjtcbiAgaW5TaGFwZXNMb2NhdGlvbnM/OiB7W25hbWU6IHN0cmluZ106IFdlYkdMVW5pZm9ybUxvY2F0aW9ufTtcbiAgaW5UZXhTaGFwZXNMb2NhdGlvbnM/OiB7W25hbWU6IHN0cmluZ106IFdlYkdMVW5pZm9ybUxvY2F0aW9ufTtcbiAgb3V0U2hhcGVMb2NhdGlvbj86IFdlYkdMVW5pZm9ybUxvY2F0aW9uO1xuICBvdXRTaGFwZVN0cmlkZXNMb2NhdGlvbj86IFdlYkdMVW5pZm9ybUxvY2F0aW9uO1xuICBvdXRUZXhTaGFwZUxvY2F0aW9uPzogV2ViR0xVbmlmb3JtTG9jYXRpb247XG59XG5cbmV4cG9ydCBpbnRlcmZhY2UgR1BHUFVCaW5hcnlMb2NhdGlvbnMge1xuICB1bmlmb3JtTG9jYXRpb25zOiB7W25hbWU6IHN0cmluZ106IFdlYkdMVW5pZm9ybUxvY2F0aW9ufTtcbiAgY3VzdG9tVW5pZm9ybUxvY2F0aW9ucz86IFdlYkdMVW5pZm9ybUxvY2F0aW9uW107XG4gIGluZkxvYzogV2ViR0xVbmlmb3JtTG9jYXRpb247XG4gIG5hbkxvYzogV2ViR0xVbmlmb3JtTG9jYXRpb247XG4gIGluU2hhcGVzTG9jYXRpb25zPzoge1tuYW1lOiBzdHJpbmddOiBXZWJHTFVuaWZvcm1Mb2NhdGlvbn07XG4gIGluVGV4U2hhcGVzTG9jYXRpb25zPzoge1tuYW1lOiBzdHJpbmddOiBXZWJHTFVuaWZvcm1Mb2NhdGlvbn07XG4gIG91dFNoYXBlTG9jYXRpb24/OiBXZWJHTFVuaWZvcm1Mb2NhdGlvbjtcbiAgb3V0U2hhcGVTdHJpZGVzTG9jYXRpb24/OiBXZWJHTFVuaWZvcm1Mb2NhdGlvbjtcbiAgb3V0VGV4U2hhcGVMb2NhdGlvbj86IFdlYkdMVW5pZm9ybUxvY2F0aW9uO1xufVxuXG5leHBvcnQgaW50ZXJmYWNlIFRlbnNvckRhdGEge1xuICBzaGFwZTogbnVtYmVyW107XG4gIHRleERhdGE6IFRleHR1cmVEYXRhO1xuICBpc1VuaWZvcm06IGJvb2xlYW47XG4gIC8vIEF2YWlsYWJsZSB3aGVuIHdlIGRlY2lkZSB0byB1cGxvYWQgYXMgdW5pZm9ybSBpbnN0ZWFkIG9mIHRleHR1cmUuXG4gIHVuaWZvcm1WYWx1ZXM/OiBUeXBlZEFycmF5O1xufVxuXG5leHBvcnQgZnVuY3Rpb24gY29tcGlsZVByb2dyYW08VCBleHRlbmRzIFRlbnNvciwgSyBleHRlbmRzIFRlbnNvcj4oXG4gICAgZ3BncHU6IEdQR1BVQ29udGV4dCwgcHJvZ3JhbTogR1BHUFVQcm9ncmFtLCBpbnB1dHM6IFRlbnNvckRhdGFbXSxcbiAgICBvdXRwdXQ6IFRlbnNvckRhdGEpOiBHUEdQVUJpbmFyeSB7XG4gIGNvbnN0IGlucHV0SW5mb3M6IElucHV0SW5mb1tdID0gaW5wdXRzLm1hcCgoaW5wdXQsIGkpID0+IHtcbiAgICBjb25zdCBzaGFwZUluZm86IFNoYXBlSW5mbyA9IHtcbiAgICAgIGxvZ2ljYWxTaGFwZTogaW5wdXQuc2hhcGUsXG4gICAgICB0ZXhTaGFwZTogaW5wdXQuaXNVbmlmb3JtID8gbnVsbCA6IGlucHV0LnRleERhdGEudGV4U2hhcGUsXG4gICAgICBpc1VuaWZvcm06IGlucHV0LmlzVW5pZm9ybSxcbiAgICAgIGlzUGFja2VkOiBpbnB1dC5pc1VuaWZvcm0gPyBmYWxzZSA6IGlucHV0LnRleERhdGEuaXNQYWNrZWQsXG4gICAgICBmbGF0T2Zmc2V0OiBudWxsXG4gICAgfTtcbiAgICBpZiAoaW5wdXQudGV4RGF0YSAhPSBudWxsICYmIGlucHV0LnRleERhdGEuc2xpY2UgIT0gbnVsbCAmJlxuICAgICAgICBpbnB1dC50ZXhEYXRhLnNsaWNlLmZsYXRPZmZzZXQgPiAwKSB7XG4gICAgICBzaGFwZUluZm8uZmxhdE9mZnNldCA9IGlucHV0LnRleERhdGEuc2xpY2UuZmxhdE9mZnNldDtcbiAgICB9XG4gICAgcmV0dXJuIHtuYW1lOiBwcm9ncmFtLnZhcmlhYmxlTmFtZXNbaV0sIHNoYXBlSW5mb307XG4gIH0pO1xuICBjb25zdCBpblNoYXBlSW5mb3MgPSBpbnB1dEluZm9zLm1hcCh4ID0+IHguc2hhcGVJbmZvKTtcbiAgY29uc3Qgb3V0U2hhcGVJbmZvOiBTaGFwZUluZm8gPSB7XG4gICAgbG9naWNhbFNoYXBlOiBvdXRwdXQuc2hhcGUsXG4gICAgdGV4U2hhcGU6IG91dHB1dC50ZXhEYXRhLnRleFNoYXBlLFxuICAgIGlzVW5pZm9ybTogZmFsc2UsXG4gICAgaXNQYWNrZWQ6IG91dHB1dC50ZXhEYXRhLmlzUGFja2VkLFxuICAgIGZsYXRPZmZzZXQ6IG51bGxcbiAgfTtcbiAgY29uc3Qgc291cmNlID0gc2hhZGVyX2NvbXBpbGVyLm1ha2VTaGFkZXIoaW5wdXRJbmZvcywgb3V0U2hhcGVJbmZvLCBwcm9ncmFtKTtcbiAgY29uc3QgZnJhZ21lbnRTaGFkZXIgPSBjcmVhdGVGcmFnbWVudFNoYWRlcihncGdwdS5nbCwgc291cmNlKTtcbiAgY29uc3Qgd2ViR0xQcm9ncmFtID0gZ3BncHUuY3JlYXRlUHJvZ3JhbShmcmFnbWVudFNoYWRlcik7XG5cbiAgaWYgKCFlbnYoKS5nZXQoJ0VOR0lORV9DT01QSUxFX09OTFknKSkge1xuICAgIHJldHVybiB7XG4gICAgICBwcm9ncmFtLFxuICAgICAgZnJhZ21lbnRTaGFkZXIsXG4gICAgICBzb3VyY2UsXG4gICAgICB3ZWJHTFByb2dyYW0sXG4gICAgICBpblNoYXBlSW5mb3MsXG4gICAgICBvdXRTaGFwZUluZm8sXG4gICAgICAuLi5nZXRVbmlmb3JtTG9jYXRpb25zKGdwZ3B1LCBwcm9ncmFtLCB3ZWJHTFByb2dyYW0pXG4gICAgfTtcbiAgfSBlbHNlIHtcbiAgICByZXR1cm4ge1xuICAgICAgcHJvZ3JhbSxcbiAgICAgIGZyYWdtZW50U2hhZGVyLFxuICAgICAgc291cmNlLFxuICAgICAgd2ViR0xQcm9ncmFtLFxuICAgICAgaW5TaGFwZUluZm9zLFxuICAgICAgb3V0U2hhcGVJbmZvLFxuICAgICAgdW5pZm9ybUxvY2F0aW9uczogbnVsbCxcbiAgICAgIGN1c3RvbVVuaWZvcm1Mb2NhdGlvbnM6IG51bGwsXG4gICAgICBpbmZMb2M6IG51bGwsXG4gICAgICBuYW5Mb2M6IG51bGwsXG4gICAgICBpblNoYXBlc0xvY2F0aW9uczogbnVsbCxcbiAgICAgIGluVGV4U2hhcGVzTG9jYXRpb25zOiBudWxsLFxuICAgICAgb3V0U2hhcGVMb2NhdGlvbjogbnVsbCxcbiAgICAgIG91dFNoYXBlU3RyaWRlc0xvY2F0aW9uOiBudWxsLFxuICAgICAgb3V0VGV4U2hhcGVMb2NhdGlvbjogbnVsbFxuICAgIH07XG4gIH1cbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGdldFVuaWZvcm1Mb2NhdGlvbnMoXG4gICAgZ3BncHU6IEdQR1BVQ29udGV4dCwgcHJvZ3JhbTogR1BHUFVQcm9ncmFtLFxuICAgIHdlYkdMUHJvZ3JhbTogV2ViR0xQcm9ncmFtKTogR1BHUFVCaW5hcnlMb2NhdGlvbnMge1xuICBjb25zdCB1bmlmb3JtTG9jYXRpb25zOiB7W25hbWU6IHN0cmluZ106IFdlYkdMVW5pZm9ybUxvY2F0aW9ufSA9IHt9O1xuICBjb25zdCBpblNoYXBlc0xvY2F0aW9uczoge1tuYW1lOiBzdHJpbmddOiBXZWJHTFVuaWZvcm1Mb2NhdGlvbn0gPSB7fTtcbiAgY29uc3QgaW5UZXhTaGFwZXNMb2NhdGlvbnM6IHtbbmFtZTogc3RyaW5nXTogV2ViR0xVbmlmb3JtTG9jYXRpb259ID0ge307XG4gIGNvbnN0IGN1c3RvbVVuaWZvcm1Mb2NhdGlvbnM6IFdlYkdMVW5pZm9ybUxvY2F0aW9uW10gPSBbXTtcbiAgbGV0IG91dFNoYXBlTG9jYXRpb246IFdlYkdMVW5pZm9ybUxvY2F0aW9uO1xuICBsZXQgb3V0VGV4U2hhcGVMb2NhdGlvbjogV2ViR0xVbmlmb3JtTG9jYXRpb247XG4gIGxldCBvdXRTaGFwZVN0cmlkZXNMb2NhdGlvbjogV2ViR0xVbmlmb3JtTG9jYXRpb247XG4gIGxldCBpbmZMb2M6IFdlYkdMVW5pZm9ybUxvY2F0aW9uID0gbnVsbDtcbiAgbGV0IG5hbkxvYzogV2ViR0xVbmlmb3JtTG9jYXRpb24gPSBudWxsO1xuXG4gIC8vIEFkZCBzcGVjaWFsIHVuaWZvcm1zIChOQU4sIElORklOSVRZKVxuICBuYW5Mb2MgPSBncGdwdS5nZXRVbmlmb3JtTG9jYXRpb24od2ViR0xQcm9ncmFtLCAnTkFOJywgZmFsc2UpO1xuICBpZiAoZW52KCkuZ2V0TnVtYmVyKCdXRUJHTF9WRVJTSU9OJykgPT09IDEpIHtcbiAgICBpbmZMb2MgPSBncGdwdS5nZXRVbmlmb3JtTG9jYXRpb24od2ViR0xQcm9ncmFtLCAnSU5GSU5JVFknLCBmYWxzZSk7XG4gIH1cblxuICAvLyBBZGQgdXNlci1kZWZpbmVkIHVuaWZvcm1zXG4gIGNvbnN0IHNob3VsZFRocm93ID0gZmFsc2U7XG4gIGZvciAobGV0IGkgPSAwOyBpIDwgcHJvZ3JhbS52YXJpYWJsZU5hbWVzLmxlbmd0aDsgaSsrKSB7XG4gICAgY29uc3QgdmFyTmFtZSA9IHByb2dyYW0udmFyaWFibGVOYW1lc1tpXTtcbiAgICB1bmlmb3JtTG9jYXRpb25zW3Zhck5hbWVdID1cbiAgICAgICAgZ3BncHUuZ2V0VW5pZm9ybUxvY2F0aW9uKHdlYkdMUHJvZ3JhbSwgdmFyTmFtZSwgc2hvdWxkVGhyb3cpO1xuICAgIHVuaWZvcm1Mb2NhdGlvbnNbYG9mZnNldCR7dmFyTmFtZX1gXSA9XG4gICAgICAgIGdwZ3B1LmdldFVuaWZvcm1Mb2NhdGlvbih3ZWJHTFByb2dyYW0sIGBvZmZzZXQke3Zhck5hbWV9YCwgc2hvdWxkVGhyb3cpO1xuICAgIGlmIChwcm9ncmFtLmVuYWJsZVNoYXBlVW5pZm9ybXMpIHtcbiAgICAgIGluU2hhcGVzTG9jYXRpb25zW2Ake3Zhck5hbWV9U2hhcGVgXSA9IGdwZ3B1LmdldFVuaWZvcm1Mb2NhdGlvbihcbiAgICAgICAgICB3ZWJHTFByb2dyYW0sIGAke3Zhck5hbWV9U2hhcGVgLCBzaG91bGRUaHJvdyk7XG4gICAgICBpblRleFNoYXBlc0xvY2F0aW9uc1tgJHt2YXJOYW1lfVRleFNoYXBlYF0gPSBncGdwdS5nZXRVbmlmb3JtTG9jYXRpb24oXG4gICAgICAgICAgd2ViR0xQcm9ncmFtLCBgJHt2YXJOYW1lfVRleFNoYXBlYCwgc2hvdWxkVGhyb3cpO1xuICAgIH1cbiAgfVxuXG4gIGlmIChwcm9ncmFtLmVuYWJsZVNoYXBlVW5pZm9ybXMpIHtcbiAgICBvdXRTaGFwZUxvY2F0aW9uID1cbiAgICAgICAgZ3BncHUuZ2V0VW5pZm9ybUxvY2F0aW9uKHdlYkdMUHJvZ3JhbSwgJ291dFNoYXBlJywgc2hvdWxkVGhyb3cpO1xuICAgIG91dFNoYXBlU3RyaWRlc0xvY2F0aW9uID1cbiAgICAgICAgZ3BncHUuZ2V0VW5pZm9ybUxvY2F0aW9uKHdlYkdMUHJvZ3JhbSwgJ291dFNoYXBlU3RyaWRlcycsIHNob3VsZFRocm93KTtcbiAgICBvdXRUZXhTaGFwZUxvY2F0aW9uID1cbiAgICAgICAgZ3BncHUuZ2V0VW5pZm9ybUxvY2F0aW9uKHdlYkdMUHJvZ3JhbSwgJ291dFRleFNoYXBlJywgc2hvdWxkVGhyb3cpO1xuICB9XG5cbiAgaWYgKHByb2dyYW0uY3VzdG9tVW5pZm9ybXMpIHtcbiAgICBwcm9ncmFtLmN1c3RvbVVuaWZvcm1zLmZvckVhY2goKGQsIGkpID0+IHtcbiAgICAgIGN1c3RvbVVuaWZvcm1Mb2NhdGlvbnNbaV0gPVxuICAgICAgICAgIGdwZ3B1LmdldFVuaWZvcm1Mb2NhdGlvbih3ZWJHTFByb2dyYW0sIGQubmFtZSwgc2hvdWxkVGhyb3cpO1xuICAgIH0pO1xuICB9XG5cbiAgcmV0dXJuIHtcbiAgICB1bmlmb3JtTG9jYXRpb25zLFxuICAgIGN1c3RvbVVuaWZvcm1Mb2NhdGlvbnMsXG4gICAgaW5mTG9jLFxuICAgIG5hbkxvYyxcbiAgICBpblNoYXBlc0xvY2F0aW9ucyxcbiAgICBpblRleFNoYXBlc0xvY2F0aW9ucyxcbiAgICBvdXRTaGFwZUxvY2F0aW9uLFxuICAgIG91dFNoYXBlU3RyaWRlc0xvY2F0aW9uLFxuICAgIG91dFRleFNoYXBlTG9jYXRpb25cbiAgfTtcbn1cblxuZnVuY3Rpb24gdmFsaWRhdGVCaW5hcnlBbmRQcm9ncmFtKFxuICAgIHNoYXBlSW5mb3M6IFNoYXBlSW5mb1tdLCBpbnB1dHM6IFRlbnNvckRhdGFbXSkge1xuICBpZiAoc2hhcGVJbmZvcy5sZW5ndGggIT09IGlucHV0cy5sZW5ndGgpIHtcbiAgICB0aHJvdyBFcnJvcihcbiAgICAgICAgYEJpbmFyeSB3YXMgY29tcGlsZWQgd2l0aCAke3NoYXBlSW5mb3MubGVuZ3RofSBpbnB1dHMsIGJ1dCBgICtcbiAgICAgICAgYHdhcyBleGVjdXRlZCB3aXRoICR7aW5wdXRzLmxlbmd0aH0gaW5wdXRzYCk7XG4gIH1cblxuICBzaGFwZUluZm9zLmZvckVhY2goKHMsIGkpID0+IHtcbiAgICBjb25zdCBzaGFwZUEgPSBzLmxvZ2ljYWxTaGFwZTtcbiAgICBjb25zdCBpbnB1dCA9IGlucHV0c1tpXTtcbiAgICBjb25zdCBzaGFwZUIgPSBpbnB1dC5zaGFwZTtcblxuICAgIGlmICghdXRpbC5hcnJheXNFcXVhbChzaGFwZUEsIHNoYXBlQikpIHtcbiAgICAgIHRocm93IEVycm9yKFxuICAgICAgICAgIGBCaW5hcnkgd2FzIGNvbXBpbGVkIHdpdGggZGlmZmVyZW50IHNoYXBlcyB0aGFuIGAgK1xuICAgICAgICAgIGB0aGUgY3VycmVudCBhcmdzLiBTaGFwZXMgJHtzaGFwZUF9IGFuZCAke3NoYXBlQn0gbXVzdCBtYXRjaGApO1xuICAgIH1cbiAgICAvLyBUaGUgaW5wdXQgaXMgdXBsb2FkZWQgYXMgdW5pZm9ybS5cbiAgICBpZiAocy5pc1VuaWZvcm0gJiYgaW5wdXQuaXNVbmlmb3JtKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgY29uc3QgdGV4U2hhcGVBID0gcy50ZXhTaGFwZTtcbiAgICBjb25zdCB0ZXhTaGFwZUIgPSBpbnB1dC5pc1VuaWZvcm0gPyBudWxsIDogaW5wdXQudGV4RGF0YS50ZXhTaGFwZTtcbiAgICBpZiAoIXV0aWwuYXJyYXlzRXF1YWwodGV4U2hhcGVBLCB0ZXhTaGFwZUIpKSB7XG4gICAgICB0aHJvdyBFcnJvcihcbiAgICAgICAgICBgQmluYXJ5IHdhcyBjb21waWxlZCB3aXRoIGRpZmZlcmVudCB0ZXh0dXJlIHNoYXBlcyB0aGFuIHRoZWAgK1xuICAgICAgICAgIGAgY3VycmVudCBhcmdzLiBTaGFwZSAke3RleFNoYXBlQX0gYW5kICR7dGV4U2hhcGVCfSBtdXN0IG1hdGNoYCk7XG4gICAgfVxuICB9KTtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIHJ1blByb2dyYW08VCBleHRlbmRzIFRlbnNvciwgSyBleHRlbmRzIFRlbnNvcj4oXG4gICAgZ3BncHU6IEdQR1BVQ29udGV4dCwgYmluYXJ5OiBHUEdQVUJpbmFyeSwgaW5wdXRzOiBUZW5zb3JEYXRhW10sXG4gICAgb3V0cHV0OiBUZW5zb3JEYXRhLCBjdXN0b21Vbmlmb3JtVmFsdWVzPzogbnVtYmVyW11bXSk6IHZvaWQge1xuICBpZiAoIWJpbmFyeS5wcm9ncmFtLmVuYWJsZVNoYXBlVW5pZm9ybXMpIHtcbiAgICB2YWxpZGF0ZUJpbmFyeUFuZFByb2dyYW0oYmluYXJ5LmluU2hhcGVJbmZvcywgaW5wdXRzKTtcbiAgICB2YWxpZGF0ZUJpbmFyeUFuZFByb2dyYW0oW2JpbmFyeS5vdXRTaGFwZUluZm9dLCBbb3V0cHV0XSk7XG4gIH1cblxuICBjb25zdCBvdXRUZXggPSBvdXRwdXQudGV4RGF0YS50ZXh0dXJlO1xuICBjb25zdCBvdXRUZXhTaGFwZSA9IG91dHB1dC50ZXhEYXRhLnRleFNoYXBlO1xuICBpZiAob3V0cHV0LnRleERhdGEuaXNQYWNrZWQpIHtcbiAgICBncGdwdS5zZXRPdXRwdXRQYWNrZWRNYXRyaXhUZXh0dXJlKFxuICAgICAgICBvdXRUZXgudGV4dHVyZSwgb3V0VGV4U2hhcGVbMF0sIG91dFRleFNoYXBlWzFdKTtcbiAgfSBlbHNlIHtcbiAgICBncGdwdS5zZXRPdXRwdXRNYXRyaXhUZXh0dXJlKFxuICAgICAgICBvdXRUZXgudGV4dHVyZSwgb3V0VGV4U2hhcGVbMF0sIG91dFRleFNoYXBlWzFdKTtcbiAgfVxuICBncGdwdS5zZXRQcm9ncmFtKGJpbmFyeS53ZWJHTFByb2dyYW0pO1xuXG4gIC8vIFNldCBzcGVjaWFsIHVuaWZvcm1zIChOQU4sIElORklOSVRZKVxuICBpZiAoZW52KCkuZ2V0TnVtYmVyKCdXRUJHTF9WRVJTSU9OJykgPT09IDEpIHtcbiAgICBpZiAoYmluYXJ5LmluZkxvYyAhPT0gbnVsbCkge1xuICAgICAgZ3BncHUuZ2wudW5pZm9ybTFmKGJpbmFyeS5pbmZMb2MsIEluZmluaXR5KTtcbiAgICB9XG4gIH1cbiAgaWYgKGJpbmFyeS5uYW5Mb2MgIT09IG51bGwpIHtcbiAgICBncGdwdS5nbC51bmlmb3JtMWYoYmluYXJ5Lm5hbkxvYywgTmFOKTtcbiAgfVxuXG4gIC8vIFNldCB1c2VyLWRlZmluZWQgaW5wdXRzXG4gIGlucHV0cy5mb3JFYWNoKChpbnB1dCwgaSkgPT4ge1xuICAgIGNvbnN0IHZhck5hbWUgPSBiaW5hcnkucHJvZ3JhbS52YXJpYWJsZU5hbWVzW2ldO1xuICAgIGNvbnN0IHZhckxvYyA9IGJpbmFyeS51bmlmb3JtTG9jYXRpb25zW3Zhck5hbWVdO1xuICAgIGNvbnN0IHZhck9mZnNldExvYyA9IGJpbmFyeS51bmlmb3JtTG9jYXRpb25zW2BvZmZzZXQke3Zhck5hbWV9YF07XG4gICAgY29uc3QgdmFyU2hhcGVMb2MgPSBiaW5hcnkuaW5TaGFwZXNMb2NhdGlvbnNbYCR7dmFyTmFtZX1TaGFwZWBdO1xuICAgIGNvbnN0IHZhclRleFNoYXBlTG9jID0gYmluYXJ5LmluVGV4U2hhcGVzTG9jYXRpb25zW2Ake3Zhck5hbWV9VGV4U2hhcGVgXTtcblxuICAgIGlmICh2YXJTaGFwZUxvYykge1xuICAgICAgY29uc3Qge3VuaWZvcm1TaGFwZX0gPSBzaGFkZXJfY29tcGlsZXIuZ2V0VW5pZm9ybUluZm9Gcm9tU2hhcGUoXG4gICAgICAgICAgYmluYXJ5LnByb2dyYW0ucGFja2VkSW5wdXRzLCBpbnB1dC5zaGFwZSwgaW5wdXQudGV4RGF0YS50ZXhTaGFwZSk7XG4gICAgICBzd2l0Y2ggKHVuaWZvcm1TaGFwZS5sZW5ndGgpIHtcbiAgICAgICAgY2FzZSAxOlxuICAgICAgICAgIGdwZ3B1LmdsLnVuaWZvcm0xaXYodmFyU2hhcGVMb2MsIG5ldyBJbnQzMkFycmF5KHVuaWZvcm1TaGFwZSkpO1xuICAgICAgICAgIGJyZWFrO1xuICAgICAgICBjYXNlIDI6XG4gICAgICAgICAgZ3BncHUuZ2wudW5pZm9ybTJpdih2YXJTaGFwZUxvYywgbmV3IEludDMyQXJyYXkodW5pZm9ybVNoYXBlKSk7XG4gICAgICAgICAgYnJlYWs7XG4gICAgICAgIGNhc2UgMzpcbiAgICAgICAgICBncGdwdS5nbC51bmlmb3JtM2l2KHZhclNoYXBlTG9jLCBuZXcgSW50MzJBcnJheSh1bmlmb3JtU2hhcGUpKTtcbiAgICAgICAgICBicmVhaztcbiAgICAgICAgY2FzZSA0OlxuICAgICAgICAgIGdwZ3B1LmdsLnVuaWZvcm00aXYodmFyU2hhcGVMb2MsIG5ldyBJbnQzMkFycmF5KHVuaWZvcm1TaGFwZSkpO1xuICAgICAgICAgIGJyZWFrO1xuICAgICAgICBkZWZhdWx0OlxuICAgICAgICAgIGJyZWFrO1xuICAgICAgfVxuICAgIH1cbiAgICBpZiAodmFyVGV4U2hhcGVMb2MpIHtcbiAgICAgIGdwZ3B1LmdsLnVuaWZvcm0yaShcbiAgICAgICAgICB2YXJUZXhTaGFwZUxvYywgaW5wdXQudGV4RGF0YS50ZXhTaGFwZVswXSwgaW5wdXQudGV4RGF0YS50ZXhTaGFwZVsxXSk7XG4gICAgfVxuXG4gICAgaWYgKHZhckxvYyA9PSBudWxsKSB7XG4gICAgICAvLyBUaGUgY29tcGlsZXIgaW5mZXJyZWQgdGhhdCB0aGlzIHZhcmlhYmxlIGlzIG5vdCB1c2VkIGluIHRoaXMgc2hhZGVyLlxuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIGlmIChpbnB1dC5pc1VuaWZvcm0pIHtcbiAgICAgIC8vIFVwbG9hZCB0aGUgdmFsdWVzIG9mIHRoZSB0ZW5zb3IgYXMgdW5pZm9ybS5cbiAgICAgIGlmICh1dGlsLnNpemVGcm9tU2hhcGUoaW5wdXQuc2hhcGUpIDwgMikge1xuICAgICAgICBncGdwdS5nbC51bmlmb3JtMWYodmFyTG9jLCBpbnB1dC51bmlmb3JtVmFsdWVzWzBdKTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIGxldCB2YWxzID0gaW5wdXQudW5pZm9ybVZhbHVlcztcbiAgICAgICAgaWYgKCEodmFscyBpbnN0YW5jZW9mIEZsb2F0MzJBcnJheSkpIHtcbiAgICAgICAgICB2YWxzID0gbmV3IEZsb2F0MzJBcnJheSh2YWxzKTtcbiAgICAgICAgfVxuICAgICAgICBncGdwdS5nbC51bmlmb3JtMWZ2KHZhckxvYywgdmFscyk7XG4gICAgICB9XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgLy8gSWYgdGhlIGlucHV0IHdhcyBzbGljZWQsIHVwbG9hZCB0aGUgZmxhdCBvZmZzZXQgaW5kZXguXG4gICAgaWYgKGlucHV0LnRleERhdGEuc2xpY2UgIT0gbnVsbCAmJiB2YXJPZmZzZXRMb2MgIT0gbnVsbCkge1xuICAgICAgZ3BncHUuZ2wudW5pZm9ybTFpKHZhck9mZnNldExvYywgaW5wdXQudGV4RGF0YS5zbGljZS5mbGF0T2Zmc2V0KTtcbiAgICB9XG5cbiAgICBncGdwdS5zZXRJbnB1dE1hdHJpeFRleHR1cmUoaW5wdXQudGV4RGF0YS50ZXh0dXJlLnRleHR1cmUsIHZhckxvYywgaSk7XG4gIH0pO1xuXG4gIGNvbnN0IG91dFNoYXBlTG9jID0gYmluYXJ5Lm91dFNoYXBlTG9jYXRpb247XG4gIGlmIChvdXRTaGFwZUxvYykge1xuICAgIHN3aXRjaCAob3V0cHV0LnNoYXBlLmxlbmd0aCkge1xuICAgICAgY2FzZSAxOlxuICAgICAgICBncGdwdS5nbC51bmlmb3JtMWl2KG91dFNoYXBlTG9jLCBuZXcgSW50MzJBcnJheShvdXRwdXQuc2hhcGUpKTtcbiAgICAgICAgYnJlYWs7XG4gICAgICBjYXNlIDI6XG4gICAgICAgIGdwZ3B1LmdsLnVuaWZvcm0yaXYob3V0U2hhcGVMb2MsIG5ldyBJbnQzMkFycmF5KG91dHB1dC5zaGFwZSkpO1xuICAgICAgICBicmVhaztcbiAgICAgIGNhc2UgMzpcbiAgICAgICAgZ3BncHUuZ2wudW5pZm9ybTNpdihvdXRTaGFwZUxvYywgbmV3IEludDMyQXJyYXkob3V0cHV0LnNoYXBlKSk7XG4gICAgICAgIGJyZWFrO1xuICAgICAgY2FzZSA0OlxuICAgICAgICBncGdwdS5nbC51bmlmb3JtNGl2KG91dFNoYXBlTG9jLCBuZXcgSW50MzJBcnJheShvdXRwdXQuc2hhcGUpKTtcbiAgICAgICAgYnJlYWs7XG4gICAgICBkZWZhdWx0OlxuICAgICAgICBicmVhaztcbiAgICB9XG4gIH1cbiAgaWYgKGJpbmFyeS5vdXRTaGFwZVN0cmlkZXNMb2NhdGlvbikge1xuICAgIGNvbnN0IHN0cmlkZXMgPSB1dGlsLmNvbXB1dGVTdHJpZGVzKG91dHB1dC5zaGFwZSk7XG4gICAgc3dpdGNoIChvdXRwdXQuc2hhcGUubGVuZ3RoKSB7XG4gICAgICBjYXNlIDI6XG4gICAgICAgIGdwZ3B1LmdsLnVuaWZvcm0xaXYoXG4gICAgICAgICAgICBiaW5hcnkub3V0U2hhcGVTdHJpZGVzTG9jYXRpb24sIG5ldyBJbnQzMkFycmF5KHN0cmlkZXMpKTtcbiAgICAgICAgYnJlYWs7XG4gICAgICBjYXNlIDM6XG4gICAgICAgIGdwZ3B1LmdsLnVuaWZvcm0yaXYoXG4gICAgICAgICAgICBiaW5hcnkub3V0U2hhcGVTdHJpZGVzTG9jYXRpb24sIG5ldyBJbnQzMkFycmF5KHN0cmlkZXMpKTtcbiAgICAgICAgYnJlYWs7XG4gICAgICBjYXNlIDQ6XG4gICAgICAgIGdwZ3B1LmdsLnVuaWZvcm0zaXYoXG4gICAgICAgICAgICBiaW5hcnkub3V0U2hhcGVTdHJpZGVzTG9jYXRpb24sIG5ldyBJbnQzMkFycmF5KHN0cmlkZXMpKTtcbiAgICAgICAgYnJlYWs7XG4gICAgICBkZWZhdWx0OlxuICAgICAgICBicmVhaztcbiAgICB9XG4gIH1cbiAgaWYgKGJpbmFyeS5vdXRUZXhTaGFwZUxvY2F0aW9uKSB7XG4gICAgZ3BncHUuZ2wudW5pZm9ybTJpKFxuICAgICAgICBiaW5hcnkub3V0VGV4U2hhcGVMb2NhdGlvbiwgb3V0cHV0LnRleERhdGEudGV4U2hhcGVbMF0sXG4gICAgICAgIG91dHB1dC50ZXhEYXRhLnRleFNoYXBlWzFdKTtcbiAgfVxuXG4gIGlmIChiaW5hcnkucHJvZ3JhbS5jdXN0b21Vbmlmb3JtcyAmJiBjdXN0b21Vbmlmb3JtVmFsdWVzKSB7XG4gICAgYmluYXJ5LnByb2dyYW0uY3VzdG9tVW5pZm9ybXMuZm9yRWFjaCgoZCwgaSkgPT4ge1xuICAgICAgY29uc3QgY3VzdG9tTG9jID0gYmluYXJ5LmN1c3RvbVVuaWZvcm1Mb2NhdGlvbnNbaV07XG4gICAgICBjb25zdCBjdXN0b21WYWx1ZSA9IGN1c3RvbVVuaWZvcm1WYWx1ZXNbaV07XG4gICAgICBpZiAoZC50eXBlID09PSAnZmxvYXQnKSB7XG4gICAgICAgIGdwZ3B1LmdsLnVuaWZvcm0xZnYoY3VzdG9tTG9jLCBjdXN0b21WYWx1ZSk7XG4gICAgICB9IGVsc2UgaWYgKGQudHlwZSA9PT0gJ3ZlYzInKSB7XG4gICAgICAgIGdwZ3B1LmdsLnVuaWZvcm0yZnYoY3VzdG9tTG9jLCBjdXN0b21WYWx1ZSk7XG4gICAgICB9IGVsc2UgaWYgKGQudHlwZSA9PT0gJ3ZlYzMnKSB7XG4gICAgICAgIGdwZ3B1LmdsLnVuaWZvcm0zZnYoY3VzdG9tTG9jLCBjdXN0b21WYWx1ZSk7XG4gICAgICB9IGVsc2UgaWYgKGQudHlwZSA9PT0gJ3ZlYzQnKSB7XG4gICAgICAgIGdwZ3B1LmdsLnVuaWZvcm00ZnYoY3VzdG9tTG9jLCBjdXN0b21WYWx1ZSk7XG4gICAgICB9IGVsc2UgaWYgKGQudHlwZSA9PT0gJ2ludCcpIHtcbiAgICAgICAgZ3BncHUuZ2wudW5pZm9ybTFpdihjdXN0b21Mb2MsIGN1c3RvbVZhbHVlKTtcbiAgICAgIH0gZWxzZSBpZiAoZC50eXBlID09PSAnaXZlYzInKSB7XG4gICAgICAgIGdwZ3B1LmdsLnVuaWZvcm0yaXYoY3VzdG9tTG9jLCBjdXN0b21WYWx1ZSk7XG4gICAgICB9IGVsc2UgaWYgKGQudHlwZSA9PT0gJ2l2ZWMzJykge1xuICAgICAgICBncGdwdS5nbC51bmlmb3JtM2l2KGN1c3RvbUxvYywgY3VzdG9tVmFsdWUpO1xuICAgICAgfSBlbHNlIGlmIChkLnR5cGUgPT09ICdpdmVjNCcpIHtcbiAgICAgICAgZ3BncHUuZ2wudW5pZm9ybTRpdihjdXN0b21Mb2MsIGN1c3RvbVZhbHVlKTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHRocm93IEVycm9yKGB1bmlmb3JtIHR5cGUgJHtkLnR5cGV9IGlzIG5vdCBzdXBwb3J0ZWQgeWV0LmApO1xuICAgICAgfVxuICAgIH0pO1xuICB9XG4gIGdwZ3B1LmV4ZWN1dGVQcm9ncmFtKCk7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBtYWtlU2hhZGVyS2V5KFxuICAgIHByb2dyYW06IEdQR1BVUHJvZ3JhbSwgaW5wdXRzOiBUZW5zb3JEYXRhW10sIG91dHB1dDogVGVuc29yRGF0YSk6IHN0cmluZyB7XG4gIGxldCBrZXlJbnB1dHMgPSAnJztcbiAgaW5wdXRzLmNvbmNhdChvdXRwdXQpLmZvckVhY2goeCA9PiB7XG4gICAgY29uc3QgaGFzT2Zmc2V0ID0geC50ZXhEYXRhICE9IG51bGwgJiYgeC50ZXhEYXRhLnNsaWNlICE9IG51bGwgJiZcbiAgICAgICAgeC50ZXhEYXRhLnNsaWNlLmZsYXRPZmZzZXQgPiAwO1xuICAgIC8vIFRPRE86IFJlbW92ZSB0aGUgY29uZGl0aW9uIG9mICF4LmlzVW5pZm9ybS5cbiAgICBpZiAocHJvZ3JhbS5lbmFibGVTaGFwZVVuaWZvcm1zICYmICF4LmlzVW5pZm9ybSkge1xuICAgICAgY29uc3QgeFRleFNoYXBlID0geC50ZXhEYXRhLnRleFNoYXBlO1xuICAgICAgY29uc3Qge3VzZVNxdWVlemVTaGFwZSwgdW5pZm9ybVNoYXBlLCBrZXB0RGltc30gPVxuICAgICAgICAgIHNoYWRlcl9jb21waWxlci5nZXRVbmlmb3JtSW5mb0Zyb21TaGFwZShcbiAgICAgICAgICAgICAgcHJvZ3JhbS5wYWNrZWRJbnB1dHMsIHguc2hhcGUsIHhUZXhTaGFwZSk7XG4gICAgICBsZXQgcmFuazEgPSAnJywgcmFuazIgPSAnJywgcmFuazM0ID0gJyc7XG4gICAgICBpZiAodW5pZm9ybVNoYXBlLmxlbmd0aCA9PT0gMSAmJiBwcm9ncmFtLnBhY2tlZElucHV0cykge1xuICAgICAgICBjb25zdCBwYWNrZWRUZXhTaGFwZSA9XG4gICAgICAgICAgICBbTWF0aC5jZWlsKHhUZXhTaGFwZVswXSAvIDIpLCBNYXRoLmNlaWwoeFRleFNoYXBlWzFdIC8gMildO1xuICAgICAgICByYW5rMSA9IGAke3BhY2tlZFRleFNoYXBlWzBdID4gMX1fJHtwYWNrZWRUZXhTaGFwZVsxXSA+IDF9YDtcbiAgICAgIH0gZWxzZSBpZiAodW5pZm9ybVNoYXBlLmxlbmd0aCA9PT0gMiAmJiAhcHJvZ3JhbS5wYWNrZWRJbnB1dHMpIHtcbiAgICAgICAgcmFuazIgPSBgJHt1bmlmb3JtU2hhcGVbMF0gPiAxfV8ke3VuaWZvcm1TaGFwZVsxXSA+IDF9YDtcbiAgICAgIH0gZWxzZSBpZiAodW5pZm9ybVNoYXBlLmxlbmd0aCA+IDIgJiYgIXByb2dyYW0ucGFja2VkSW5wdXRzKSB7XG4gICAgICAgIGNvbnN0IHN0cmlkZXMgPSB1dGlsLmNvbXB1dGVTdHJpZGVzKHVuaWZvcm1TaGFwZSk7XG4gICAgICAgIHJhbmszNCA9IGAke3N0cmlkZXNbMF0gPT09IHhUZXhTaGFwZVsxXX1fJHtcbiAgICAgICAgICAgIHN0cmlkZXNbc3RyaWRlcy5sZW5ndGggLSAxXSA9PT0geFRleFNoYXBlWzFdfWA7XG4gICAgICB9XG4gICAgICBjb25zdCB4UmFuayA9IHguc2hhcGUubGVuZ3RoO1xuICAgICAgY29uc3QgaXNMb2dpY2FsU2hhcFRleFNoYXBlRXF1YWwgPVxuICAgICAgICAgIHVuaWZvcm1TaGFwZS5sZW5ndGggPT09IDIgJiYgdXRpbC5hcnJheXNFcXVhbCh4LnNoYXBlLCB4VGV4U2hhcGUpO1xuICAgICAgY29uc3QgaXNTY2FsYXIgPSB1dGlsLnNpemVGcm9tU2hhcGUoeC5zaGFwZSkgPT09IDE7XG4gICAgICBjb25zdCBicm9hZGNhc3REaW1zID1cbiAgICAgICAgICBiYWNrZW5kX3V0aWwuZ2V0QnJvYWRjYXN0RGltcyh4LnNoYXBlLCBvdXRwdXQuc2hhcGUpO1xuICAgICAgY29uc3QgaXNJbk91dFRleFNoYXBlRXF1YWwgPSAhcHJvZ3JhbS5wYWNrZWRJbnB1dHMgJiZcbiAgICAgICAgICB4UmFuayA9PT0gb3V0cHV0LnNoYXBlLmxlbmd0aCAmJlxuICAgICAgICAgIHV0aWwuYXJyYXlzRXF1YWwoeFRleFNoYXBlLCBvdXRwdXQudGV4RGF0YS50ZXhTaGFwZSk7XG4gICAgICBjb25zdCBpc1RleFNoYXBlR3JlYXRlclRoYW5PbmUgPVxuICAgICAgICAgIHByb2dyYW0ucGFja2VkSW5wdXRzIHx8IHVuaWZvcm1TaGFwZS5sZW5ndGggPiAyID9cbiAgICAgICAgICAnJyA6XG4gICAgICAgICAgYCR7eFRleFNoYXBlWzBdID4gMX1fJHt4VGV4U2hhcGVbMV0gPiAxfWA7XG4gICAgICAvLyBUaGVzZSBrZXkgY29tcG9uZW50cyBhcmUgbmVlZGVkIGR1ZSB0byBzaGFkZXJfY29tcGlsZXIgaXMgZW1iZWRkaW5nXG4gICAgICAvLyB0aGVtIGluIHRoZSBzaGFkZXIuXG4gICAgICAvLyB8eFJhbmt8IGlzIHVzZWQgdG8gZGV0ZXJtaW5lIHRoZSBjb29yZHMgbGVuZ3RoLiBTZWVcbiAgICAgIC8vIGdldFtQYWNrZWRdU2FtcGxlckF0T3V0cHV0Q29vcmRzLlxuICAgICAgLy8gfGlzSW5PdXRUZXhTaGFwZUVxdWFsfCBpcyB1c2VkIHRvIGRldGVybWluZSB3aGV0aGVyIGdvaW5nIHRvIGFuXG4gICAgICAvLyBvcHRpbWl6YXRpb24gcGF0aCBpbiBnZXRTYW1wbGVyQXRPdXRwdXRDb29yZHMuXG4gICAgICAvLyB8dXNlU3F1ZWV6ZVNoYXBlfCBpcyBleHRyYWN0ZWQgZnJvbSBzcXVlZXplSW5wdXRJbmZvIG9mXG4gICAgICAvLyBnZXRTYW1wbGVyWzJ8M3w0XUQvZ2V0UGFja2VkU2FtcGxlcjNELlxuICAgICAgLy8gfGlzU2NhbGFyfCBpcyBleHRyYWN0ZWQgZnJvbSBpc0lucHV0U2NhbGFyL2lzT3V0cHV0U2NhbGFyIGluXG4gICAgICAvLyBnZXRQYWNrZWRTYW1wbGVyQXRPdXRwdXRDb29yZHMuXG4gICAgICAvLyB8YnJvYWRjYXN0RGltc3wgaXMgZXh0cmFjdGVkIGZyb20gZ2V0W1BhY2tlZF1TYW1wbGVyQXRPdXRwdXRDb29yZHMuXG4gICAgICAvLyB8aXNMb2dpY2FsU2hhcFRleFNoYXBlRXF1YWx8IGlzIHVzZWQgaW5cbiAgICAgIC8vIGdldE91dHB1dFtQYWNrZWRdMkRDb29yZHMvZ2V0W1BhY2tlZF1TYW1wbGVyMkQuXG4gICAgICAvLyB8cmFuazF8IGlzIHVzZWQgaW4gZ2V0T3V0cHV0UGFja2VkMURDb29yZHMuXG4gICAgICAvLyB8cmFuazJ8IGlzIHVzZWQgaW4gZ2V0T3V0cHV0MkRDb29yZHMuXG4gICAgICAvLyB8cmFuazM0fCBpcyB1c2VkIGluIGdldFNhbXBsZXIzRC9nZXRTYW1wbGVyNEQuXG4gICAgICAvLyB8aXNUZXhTaGFwZUdyZWF0ZXJUaGFuT25lfCBhcmUgdXNlZCBpblxuICAgICAgLy8gZ2V0U2FtcGxlcltTY2FsYXJ8MUR8MkRdL2dldE91dHB1dDFEQ29vcmRzLlxuICAgICAga2V5SW5wdXRzICs9IGAke3hSYW5rfV8ke2lzSW5PdXRUZXhTaGFwZUVxdWFsfV8ke1xuICAgICAgICAgIHVzZVNxdWVlemVTaGFwZSA/IGtlcHREaW1zIDogJyd9XyR7dW5pZm9ybVNoYXBlLmxlbmd0aH1fJHtpc1NjYWxhcn1fJHtcbiAgICAgICAgICBicm9hZGNhc3REaW1zfV8ke2lzTG9naWNhbFNoYXBUZXhTaGFwZUVxdWFsfV8ke3JhbmsxfV8ke3JhbmsyfV8ke1xuICAgICAgICAgIHJhbmszNH1fJHtpc1RleFNoYXBlR3JlYXRlclRoYW5PbmV9XyR7aGFzT2Zmc2V0fWA7XG4gICAgfSBlbHNlIHtcbiAgICAgIGNvbnN0IHRleFNoYXBlID0geC5pc1VuaWZvcm0gPyAndW5pZm9ybScgOiB4LnRleERhdGEudGV4U2hhcGU7XG4gICAgICBrZXlJbnB1dHMgKz0gYCR7eC5zaGFwZX1fJHt0ZXhTaGFwZX1fJHtoYXNPZmZzZXR9YDtcbiAgICB9XG4gIH0pO1xuICBjb25zdCBrZXlVc2VyQ29kZSA9IHByb2dyYW0udXNlckNvZGU7XG4gIGxldCBrZXkgPSBwcm9ncmFtLmNvbnN0cnVjdG9yLm5hbWU7XG4gIC8vIEZhc3Qgc3RyaW5nIGNvbmNhdC4gU2VlIGh0dHBzOi8vanNwZXJmLmNvbS9zdHJpbmctY29uY2F0ZW5hdGlvbi8xNC5cbiAga2V5ICs9ICdfJyArIGtleUlucHV0cyArICdfJyArIGtleVVzZXJDb2RlICtcbiAgICAgIGAke2VudigpLmdldE51bWJlcignV0VCR0xfVkVSU0lPTicpfWA7XG4gIHJldHVybiBrZXk7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiB1c2VTaGFwZVVuaWZvcm1zKHJhbms6IG51bWJlcikge1xuICAvLyBUT0RPOiBSZW1vdmUgdGhlIGxpbWl0YWlvbiBvZiByYW5rIDw9IDQuXG4gIHJldHVybiBlbnYoKS5nZXRCb29sKCdXRUJHTF9VU0VfU0hBUEVTX1VOSUZPUk1TJykgJiYgcmFuayA8PSA0O1xufVxuIl19","/**\n * @license\n * Copyright 2019 Google LLC. All Rights Reserved.\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n * =============================================================================\n */\nimport { getGlslDifferences } from './glsl_version';\nimport { useShapeUniforms } from './gpgpu_math';\nimport * as shader_util from './shader_compiler_util';\nimport { PackingScheme } from './tex_util';\nexport class DecodeMatrixProgram {\n constructor(outputShape) {\n this.variableNames = ['A'];\n this.packedInputs = false;\n this.packedOutput = true;\n this.outPackingScheme = PackingScheme.DENSE;\n this.customUniforms = [{ name: 'texShape', type: 'ivec2' }];\n const glsl = getGlslDifferences();\n this.outputShape = outputShape;\n this.enableShapeUniforms = useShapeUniforms(this.outputShape.length);\n this.userCode = `\n ivec3 outCoordsFromFlatIndex(int index) {\n ${this.enableShapeUniforms ?\n shader_util.getOutputLogicalCoordinatesFromFlatIndexByUniform(['r', 'c', 'd'], outputShape) :\n shader_util.getLogicalCoordinatesFromFlatIndex(['r', 'c', 'd'], outputShape)}\n return ivec3(r, c, d);\n }\n\n void main() {\n ivec2 resTexRC = ivec2(resultUV.yx * vec2(texShape[0], texShape[1]));\n int index = 4 * (resTexRC.x * texShape[1] + resTexRC.y);\n\n vec4 result = vec4(0.);\n\n for (int i=0; i<4; i++) {\n int flatIndex = index + i;\n ivec3 rc = outCoordsFromFlatIndex(flatIndex);\n result[i] = getA(rc.x, rc.y, rc.z);\n }\n\n ${glsl.output} = result;\n }\n `;\n }\n}\n//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZGVjb2RlX21hdHJpeF9ncHUuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi90ZmpzLWJhY2tlbmQtd2ViZ2wvc3JjL2RlY29kZV9tYXRyaXhfZ3B1LnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBOzs7Ozs7Ozs7Ozs7Ozs7R0FlRztBQUVILE9BQU8sRUFBQyxrQkFBa0IsRUFBQyxNQUFNLGdCQUFnQixDQUFDO0FBQ2xELE9BQU8sRUFBZSxnQkFBZ0IsRUFBQyxNQUFNLGNBQWMsQ0FBQztBQUM1RCxPQUFPLEtBQUssV0FBVyxNQUFNLHdCQUF3QixDQUFDO0FBQ3RELE9BQU8sRUFBQyxhQUFhLEVBQUMsTUFBTSxZQUFZLENBQUM7QUFFekMsTUFBTSxPQUFPLG1CQUFtQjtJQVU5QixZQUFZLFdBQXFDO1FBVGpELGtCQUFhLEdBQUcsQ0FBQyxHQUFHLENBQUMsQ0FBQztRQUd0QixpQkFBWSxHQUFHLEtBQUssQ0FBQztRQUNyQixpQkFBWSxHQUFHLElBQUksQ0FBQztRQUNwQixxQkFBZ0IsR0FBRyxhQUFhLENBQUMsS0FBSyxDQUFDO1FBRXZDLG1CQUFjLEdBQUcsQ0FBQyxFQUFDLElBQUksRUFBRSxVQUFVLEVBQUUsSUFBSSxFQUFFLE9BQWdCLEVBQUUsQ0FBQyxDQUFDO1FBRzdELE1BQU0sSUFBSSxHQUFHLGtCQUFrQixFQUFFLENBQUM7UUFDbEMsSUFBSSxDQUFDLFdBQVcsR0FBRyxXQUFXLENBQUM7UUFDL0IsSUFBSSxDQUFDLG1CQUFtQixHQUFHLGdCQUFnQixDQUFDLElBQUksQ0FBQyxXQUFXLENBQUMsTUFBTSxDQUFDLENBQUM7UUFFckUsSUFBSSxDQUFDLFFBQVEsR0FBRzs7VUFHWixJQUFJLENBQUMsbUJBQW1CLENBQUMsQ0FBQztZQUN0QixXQUFXLENBQUMsaURBQWlELENBQ3pELENBQUMsR0FBRyxFQUFFLEdBQUcsRUFBRSxHQUFHLENBQUMsRUFBRSxXQUFXLENBQUMsQ0FBQyxDQUFDO1lBQ25DLFdBQVcsQ0FBQyxrQ0FBa0MsQ0FDMUMsQ0FBQyxHQUFHLEVBQUUsR0FBRyxFQUFFLEdBQUcsQ0FBQyxFQUFFLFdBQVcsQ0FBQzs7Ozs7Ozs7Ozs7Ozs7OztVQWdCbkMsSUFBSSxDQUFDLE1BQU07O0tBRWhCLENBQUM7SUFDSixDQUFDO0NBQ0YiLCJzb3VyY2VzQ29udGVudCI6WyIvKipcbiAqIEBsaWNlbnNlXG4gKiBDb3B5cmlnaHQgMjAxOSBHb29nbGUgTExDLiBBbGwgUmlnaHRzIFJlc2VydmVkLlxuICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlIFwiTGljZW5zZVwiKTtcbiAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS5cbiAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdFxuICpcbiAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMFxuICpcbiAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmVcbiAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuIFwiQVMgSVNcIiBCQVNJUyxcbiAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLlxuICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZFxuICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuXG4gKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuICovXG5cbmltcG9ydCB7Z2V0R2xzbERpZmZlcmVuY2VzfSBmcm9tICcuL2dsc2xfdmVyc2lvbic7XG5pbXBvcnQge0dQR1BVUHJvZ3JhbSwgdXNlU2hhcGVVbmlmb3Jtc30gZnJvbSAnLi9ncGdwdV9tYXRoJztcbmltcG9ydCAqIGFzIHNoYWRlcl91dGlsIGZyb20gJy4vc2hhZGVyX2NvbXBpbGVyX3V0aWwnO1xuaW1wb3J0IHtQYWNraW5nU2NoZW1lfSBmcm9tICcuL3RleF91dGlsJztcblxuZXhwb3J0IGNsYXNzIERlY29kZU1hdHJpeFByb2dyYW0gaW1wbGVtZW50cyBHUEdQVVByb2dyYW0ge1xuICB2YXJpYWJsZU5hbWVzID0gWydBJ107XG4gIHVzZXJDb2RlOiBzdHJpbmc7XG4gIG91dHB1dFNoYXBlOiBbbnVtYmVyLCBudW1iZXIsIG51bWJlcl07XG4gIHBhY2tlZElucHV0cyA9IGZhbHNlO1xuICBwYWNrZWRPdXRwdXQgPSB0cnVlO1xuICBvdXRQYWNraW5nU2NoZW1lID0gUGFja2luZ1NjaGVtZS5ERU5TRTtcbiAgZW5hYmxlU2hhcGVVbmlmb3JtczogYm9vbGVhbjtcbiAgY3VzdG9tVW5pZm9ybXMgPSBbe25hbWU6ICd0ZXhTaGFwZScsIHR5cGU6ICdpdmVjMicgYXMgY29uc3QgfV07XG5cbiAgY29uc3RydWN0b3Iob3V0cHV0U2hhcGU6IFtudW1iZXIsIG51bWJlciwgbnVtYmVyXSkge1xuICAgIGNvbnN0IGdsc2wgPSBnZXRHbHNsRGlmZmVyZW5jZXMoKTtcbiAgICB0aGlzLm91dHB1dFNoYXBlID0gb3V0cHV0U2hhcGU7XG4gICAgdGhpcy5lbmFibGVTaGFwZVVuaWZvcm1zID0gdXNlU2hhcGVVbmlmb3Jtcyh0aGlzLm91dHB1dFNoYXBlLmxlbmd0aCk7XG5cbiAgICB0aGlzLnVzZXJDb2RlID0gYFxuICAgICAgaXZlYzMgb3V0Q29vcmRzRnJvbUZsYXRJbmRleChpbnQgaW5kZXgpIHtcbiAgICAgICAgJHtcbiAgICAgICAgdGhpcy5lbmFibGVTaGFwZVVuaWZvcm1zID9cbiAgICAgICAgICAgIHNoYWRlcl91dGlsLmdldE91dHB1dExvZ2ljYWxDb29yZGluYXRlc0Zyb21GbGF0SW5kZXhCeVVuaWZvcm0oXG4gICAgICAgICAgICAgICAgWydyJywgJ2MnLCAnZCddLCBvdXRwdXRTaGFwZSkgOlxuICAgICAgICAgICAgc2hhZGVyX3V0aWwuZ2V0TG9naWNhbENvb3JkaW5hdGVzRnJvbUZsYXRJbmRleChcbiAgICAgICAgICAgICAgICBbJ3InLCAnYycsICdkJ10sIG91dHB1dFNoYXBlKX1cbiAgICAgICAgcmV0dXJuIGl2ZWMzKHIsIGMsIGQpO1xuICAgICAgfVxuXG4gICAgICB2b2lkIG1haW4oKSB7XG4gICAgICAgIGl2ZWMyIHJlc1RleFJDID0gaXZlYzIocmVzdWx0VVYueXggKiB2ZWMyKHRleFNoYXBlWzBdLCB0ZXhTaGFwZVsxXSkpO1xuICAgICAgICBpbnQgaW5kZXggPSA0ICogKHJlc1RleFJDLnggKiB0ZXhTaGFwZVsxXSArIHJlc1RleFJDLnkpO1xuXG4gICAgICAgIHZlYzQgcmVzdWx0ID0gdmVjNCgwLik7XG5cbiAgICAgICAgZm9yIChpbnQgaT0wOyBpPDQ7IGkrKykge1xuICAgICAgICAgIGludCBmbGF0SW5kZXggPSBpbmRleCArIGk7XG4gICAgICAgICAgaXZlYzMgcmMgPSBvdXRDb29yZHNGcm9tRmxhdEluZGV4KGZsYXRJbmRleCk7XG4gICAgICAgICAgcmVzdWx0W2ldID0gZ2V0QShyYy54LCByYy55LCByYy56KTtcbiAgICAgICAgfVxuXG4gICAgICAgICR7Z2xzbC5vdXRwdXR9ID0gcmVzdWx0O1xuICAgICAgfVxuICAgIGA7XG4gIH1cbn1cbiJdfQ==","/**\n * @license\n * Copyright 2019 Google LLC. All Rights Reserved.\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n * =============================================================================\n */\nimport { getGlslDifferences } from './glsl_version';\nimport { useShapeUniforms } from './gpgpu_math';\nimport * as shader_util from './shader_compiler_util';\nimport { PackingScheme } from './tex_util';\nexport class DecodeMatrixPackedProgram {\n constructor(outputShape) {\n this.variableNames = ['A'];\n this.packedInputs = true;\n this.packedOutput = true;\n this.outPackingScheme = PackingScheme.DENSE;\n this.customUniforms = [{ name: 'texShape', type: 'ivec2' }];\n const glsl = getGlslDifferences();\n this.outputShape = outputShape;\n this.enableShapeUniforms = useShapeUniforms(this.outputShape.length);\n this.userCode = `\n ivec3 outCoordsFromFlatIndex(int index) {\n ${this.enableShapeUniforms ?\n shader_util.getOutputLogicalCoordinatesFromFlatIndexByUniform(['r', 'c', 'd'], outputShape) :\n shader_util.getLogicalCoordinatesFromFlatIndex(['r', 'c', 'd'], outputShape)}\n return ivec3(r, c, d);\n }\n\n void main() {\n ivec2 resTexRC = ivec2(resultUV.yx * vec2(texShape[0], texShape[1]));\n int index = 4 * (resTexRC.x * texShape[1] + resTexRC.y);\n\n vec4 result = vec4(0.);\n\n for (int i=0; i<4; i++) {\n int flatIndex = index + i;\n ivec3 rc = outCoordsFromFlatIndex(flatIndex);\n result[i] = getChannel(getA(rc.x, rc.y, rc.z), vec2(rc.y, rc.z));\n }\n\n ${glsl.output} = result;\n }\n `;\n }\n}\n//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZGVjb2RlX21hdHJpeF9wYWNrZWRfZ3B1LmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vdGZqcy1iYWNrZW5kLXdlYmdsL3NyYy9kZWNvZGVfbWF0cml4X3BhY2tlZF9ncHUudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUE7Ozs7Ozs7Ozs7Ozs7OztHQWVHO0FBRUgsT0FBTyxFQUFDLGtCQUFrQixFQUFDLE1BQU0sZ0JBQWdCLENBQUM7QUFDbEQsT0FBTyxFQUFlLGdCQUFnQixFQUFDLE1BQU0sY0FBYyxDQUFDO0FBQzVELE9BQU8sS0FBSyxXQUFXLE1BQU0sd0JBQXdCLENBQUM7QUFDdEQsT0FBTyxFQUFDLGFBQWEsRUFBQyxNQUFNLFlBQVksQ0FBQztBQUV6QyxNQUFNLE9BQU8seUJBQXlCO0lBVXBDLFlBQVksV0FBcUM7UUFUakQsa0JBQWEsR0FBRyxDQUFDLEdBQUcsQ0FBQyxDQUFDO1FBRXRCLGlCQUFZLEdBQUcsSUFBSSxDQUFDO1FBQ3BCLGlCQUFZLEdBQUcsSUFBSSxDQUFDO1FBRXBCLHFCQUFnQixHQUFHLGFBQWEsQ0FBQyxLQUFLLENBQUM7UUFFdkMsbUJBQWMsR0FBRyxDQUFDLEVBQUMsSUFBSSxFQUFFLFVBQVUsRUFBRSxJQUFJLEVBQUUsT0FBZ0IsRUFBRSxDQUFDLENBQUM7UUFHN0QsTUFBTSxJQUFJLEdBQUcsa0JBQWtCLEVBQUUsQ0FBQztRQUNsQyxJQUFJLENBQUMsV0FBVyxHQUFHLFdBQVcsQ0FBQztRQUMvQixJQUFJLENBQUMsbUJBQW1CLEdBQUcsZ0JBQWdCLENBQUMsSUFBSSxDQUFDLFdBQVcsQ0FBQyxNQUFNLENBQUMsQ0FBQztRQUVyRSxJQUFJLENBQUMsUUFBUSxHQUFHOztVQUdaLElBQUksQ0FBQyxtQkFBbUIsQ0FBQyxDQUFDO1lBQ3RCLFdBQVcsQ0FBQyxpREFBaUQsQ0FDekQsQ0FBQyxHQUFHLEVBQUUsR0FBRyxFQUFFLEdBQUcsQ0FBQyxFQUFFLFdBQVcsQ0FBQyxDQUFDLENBQUM7WUFDbkMsV0FBVyxDQUFDLGtDQUFrQyxDQUMxQyxDQUFDLEdBQUcsRUFBRSxHQUFHLEVBQUUsR0FBRyxDQUFDLEVBQUUsV0FBVyxDQUFDOzs7Ozs7Ozs7Ozs7Ozs7O1VBZ0JuQyxJQUFJLENBQUMsTUFBTTs7S0FFaEIsQ0FBQztJQUNKLENBQUM7Q0FDRiIsInNvdXJjZXNDb250ZW50IjpbIi8qKlxuICogQGxpY2Vuc2VcbiAqIENvcHlyaWdodCAyMDE5IEdvb2dsZSBMTEMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuXG4gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgXCJMaWNlbnNlXCIpO1xuICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLlxuICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0XG4gKlxuICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wXG4gKlxuICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZVxuICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gXCJBUyBJU1wiIEJBU0lTLFxuICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuXG4gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kXG4gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS5cbiAqID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4gKi9cblxuaW1wb3J0IHtnZXRHbHNsRGlmZmVyZW5jZXN9IGZyb20gJy4vZ2xzbF92ZXJzaW9uJztcbmltcG9ydCB7R1BHUFVQcm9ncmFtLCB1c2VTaGFwZVVuaWZvcm1zfSBmcm9tICcuL2dwZ3B1X21hdGgnO1xuaW1wb3J0ICogYXMgc2hhZGVyX3V0aWwgZnJvbSAnLi9zaGFkZXJfY29tcGlsZXJfdXRpbCc7XG5pbXBvcnQge1BhY2tpbmdTY2hlbWV9IGZyb20gJy4vdGV4X3V0aWwnO1xuXG5leHBvcnQgY2xhc3MgRGVjb2RlTWF0cml4UGFja2VkUHJvZ3JhbSBpbXBsZW1lbnRzIEdQR1BVUHJvZ3JhbSB7XG4gIHZhcmlhYmxlTmFtZXMgPSBbJ0EnXTtcbiAgdXNlckNvZGU6IHN0cmluZztcbiAgcGFja2VkSW5wdXRzID0gdHJ1ZTtcbiAgcGFja2VkT3V0cHV0ID0gdHJ1ZTtcbiAgb3V0cHV0U2hhcGU6IFtudW1iZXIsIG51bWJlciwgbnVtYmVyXTtcbiAgb3V0UGFja2luZ1NjaGVtZSA9IFBhY2tpbmdTY2hlbWUuREVOU0U7XG4gIGVuYWJsZVNoYXBlVW5pZm9ybXM6IGJvb2xlYW47XG4gIGN1c3RvbVVuaWZvcm1zID0gW3tuYW1lOiAndGV4U2hhcGUnLCB0eXBlOiAnaXZlYzInIGFzIGNvbnN0IH1dO1xuXG4gIGNvbnN0cnVjdG9yKG91dHB1dFNoYXBlOiBbbnVtYmVyLCBudW1iZXIsIG51bWJlcl0pIHtcbiAgICBjb25zdCBnbHNsID0gZ2V0R2xzbERpZmZlcmVuY2VzKCk7XG4gICAgdGhpcy5vdXRwdXRTaGFwZSA9IG91dHB1dFNoYXBlO1xuICAgIHRoaXMuZW5hYmxlU2hhcGVVbmlmb3JtcyA9IHVzZVNoYXBlVW5pZm9ybXModGhpcy5vdXRwdXRTaGFwZS5sZW5ndGgpO1xuXG4gICAgdGhpcy51c2VyQ29kZSA9IGBcbiAgICAgIGl2ZWMzIG91dENvb3Jkc0Zyb21GbGF0SW5kZXgoaW50IGluZGV4KSB7XG4gICAgICAgICR7XG4gICAgICAgIHRoaXMuZW5hYmxlU2hhcGVVbmlmb3JtcyA/XG4gICAgICAgICAgICBzaGFkZXJfdXRpbC5nZXRPdXRwdXRMb2dpY2FsQ29vcmRpbmF0ZXNGcm9tRmxhdEluZGV4QnlVbmlmb3JtKFxuICAgICAgICAgICAgICAgIFsncicsICdjJywgJ2QnXSwgb3V0cHV0U2hhcGUpIDpcbiAgICAgICAgICAgIHNoYWRlcl91dGlsLmdldExvZ2ljYWxDb29yZGluYXRlc0Zyb21GbGF0SW5kZXgoXG4gICAgICAgICAgICAgICAgWydyJywgJ2MnLCAnZCddLCBvdXRwdXRTaGFwZSl9XG4gICAgICAgIHJldHVybiBpdmVjMyhyLCBjLCBkKTtcbiAgICAgIH1cblxuICAgICAgdm9pZCBtYWluKCkge1xuICAgICAgICBpdmVjMiByZXNUZXhSQyA9IGl2ZWMyKHJlc3VsdFVWLnl4ICogdmVjMih0ZXhTaGFwZVswXSwgdGV4U2hhcGVbMV0pKTtcbiAgICAgICAgaW50IGluZGV4ID0gNCAqIChyZXNUZXhSQy54ICogdGV4U2hhcGVbMV0gKyByZXNUZXhSQy55KTtcblxuICAgICAgICB2ZWM0IHJlc3VsdCA9IHZlYzQoMC4pO1xuXG4gICAgICAgIGZvciAoaW50IGk9MDsgaTw0OyBpKyspIHtcbiAgICAgICAgICBpbnQgZmxhdEluZGV4ID0gaW5kZXggKyBpO1xuICAgICAgICAgIGl2ZWMzIHJjID0gb3V0Q29vcmRzRnJvbUZsYXRJbmRleChmbGF0SW5kZXgpO1xuICAgICAgICAgIHJlc3VsdFtpXSA9IGdldENoYW5uZWwoZ2V0QShyYy54LCByYy55LCByYy56KSwgdmVjMihyYy55LCByYy56KSk7XG4gICAgICAgIH1cblxuICAgICAgICAke2dsc2wub3V0cHV0fSA9IHJlc3VsdDtcbiAgICAgIH1cbiAgICBgO1xuICB9XG59XG4iXX0=","/**\n * @license\n * Copyright 2018 Google LLC. All Rights Reserved.\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n * =============================================================================\n */\nimport { getGlslDifferences } from './glsl_version';\nimport { ENCODE_FLOAT_SNIPPET } from './shader_compiler_util';\nimport { TextureUsage } from './tex_util';\nexport class EncodeFloatProgram {\n constructor(outputShape) {\n this.variableNames = ['A'];\n this.outTexUsage = TextureUsage.DOWNLOAD;\n const glsl = getGlslDifferences();\n this.outputShape = outputShape;\n this.userCode = `\n ${ENCODE_FLOAT_SNIPPET}\n\n void main() {\n float x = getAAtOutCoords();\n ${glsl.output} = encode_float(x);\n }\n `;\n }\n}\n//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZW5jb2RlX2Zsb2F0X2dwdS5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uL3RmanMtYmFja2VuZC13ZWJnbC9zcmMvZW5jb2RlX2Zsb2F0X2dwdS50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQTs7Ozs7Ozs7Ozs7Ozs7O0dBZUc7QUFFSCxPQUFPLEVBQUMsa0JBQWtCLEVBQUMsTUFBTSxnQkFBZ0IsQ0FBQztBQUVsRCxPQUFPLEVBQUMsb0JBQW9CLEVBQUMsTUFBTSx3QkFBd0IsQ0FBQztBQUM1RCxPQUFPLEVBQUMsWUFBWSxFQUFDLE1BQU0sWUFBWSxDQUFDO0FBRXhDLE1BQU0sT0FBTyxrQkFBa0I7SUFNN0IsWUFBWSxXQUFxQjtRQUxqQyxrQkFBYSxHQUFHLENBQUMsR0FBRyxDQUFDLENBQUM7UUFHdEIsZ0JBQVcsR0FBRyxZQUFZLENBQUMsUUFBUSxDQUFDO1FBR2xDLE1BQU0sSUFBSSxHQUFHLGtCQUFrQixFQUFFLENBQUM7UUFDbEMsSUFBSSxDQUFDLFdBQVcsR0FBRyxXQUFXLENBQUM7UUFDL0IsSUFBSSxDQUFDLFFBQVEsR0FBRztRQUNaLG9CQUFvQjs7OztVQUlsQixJQUFJLENBQUMsTUFBTTs7S0FFaEIsQ0FBQztJQUNKLENBQUM7Q0FDRiIsInNvdXJjZXNDb250ZW50IjpbIi8qKlxuICogQGxpY2Vuc2VcbiAqIENvcHlyaWdodCAyMDE4IEdvb2dsZSBMTEMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuXG4gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgXCJMaWNlbnNlXCIpO1xuICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLlxuICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0XG4gKlxuICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wXG4gKlxuICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZVxuICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gXCJBUyBJU1wiIEJBU0lTLFxuICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuXG4gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kXG4gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS5cbiAqID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4gKi9cblxuaW1wb3J0IHtnZXRHbHNsRGlmZmVyZW5jZXN9IGZyb20gJy4vZ2xzbF92ZXJzaW9uJztcbmltcG9ydCB7R1BHUFVQcm9ncmFtfSBmcm9tICcuL2dwZ3B1X21hdGgnO1xuaW1wb3J0IHtFTkNPREVfRkxPQVRfU05JUFBFVH0gZnJvbSAnLi9zaGFkZXJfY29tcGlsZXJfdXRpbCc7XG5pbXBvcnQge1RleHR1cmVVc2FnZX0gZnJvbSAnLi90ZXhfdXRpbCc7XG5cbmV4cG9ydCBjbGFzcyBFbmNvZGVGbG9hdFByb2dyYW0gaW1wbGVtZW50cyBHUEdQVVByb2dyYW0ge1xuICB2YXJpYWJsZU5hbWVzID0gWydBJ107XG4gIHVzZXJDb2RlOiBzdHJpbmc7XG4gIG91dHB1dFNoYXBlOiBudW1iZXJbXTtcbiAgb3V0VGV4VXNhZ2UgPSBUZXh0dXJlVXNhZ2UuRE9XTkxPQUQ7XG5cbiAgY29uc3RydWN0b3Iob3V0cHV0U2hhcGU6IG51bWJlcltdKSB7XG4gICAgY29uc3QgZ2xzbCA9IGdldEdsc2xEaWZmZXJlbmNlcygpO1xuICAgIHRoaXMub3V0cHV0U2hhcGUgPSBvdXRwdXRTaGFwZTtcbiAgICB0aGlzLnVzZXJDb2RlID0gYFxuICAgICAgJHtFTkNPREVfRkxPQVRfU05JUFBFVH1cblxuICAgICAgdm9pZCBtYWluKCkge1xuICAgICAgICBmbG9hdCB4ID0gZ2V0QUF0T3V0Q29vcmRzKCk7XG4gICAgICAgICR7Z2xzbC5vdXRwdXR9ID0gZW5jb2RlX2Zsb2F0KHgpO1xuICAgICAgfVxuICAgIGA7XG4gIH1cbn1cbiJdfQ==","/**\n * @license\n * Copyright 2018 Google LLC. All Rights Reserved.\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n * =============================================================================\n */\nimport { getGlslDifferences } from './glsl_version';\nimport { ENCODE_FLOAT_SNIPPET } from './shader_compiler_util';\nimport { TextureUsage } from './tex_util';\nexport class EncodeFloatPackedProgram {\n constructor(outputShape) {\n this.variableNames = ['A'];\n this.packedInputs = true;\n this.packedOutput = false;\n this.outTexUsage = TextureUsage.DOWNLOAD;\n const glsl = getGlslDifferences();\n this.outputShape = outputShape;\n this.userCode = `\n ${ENCODE_FLOAT_SNIPPET}\n\n void main() {\n ivec3 coords = getOutputCoords();\n float x = getChannel(getAAtOutCoords(), vec2(coords.y, coords.z));\n ${glsl.output} = encode_float(x);\n }\n `;\n }\n}\n//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZW5jb2RlX2Zsb2F0X3BhY2tlZF9ncHUuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi90ZmpzLWJhY2tlbmQtd2ViZ2wvc3JjL2VuY29kZV9mbG9hdF9wYWNrZWRfZ3B1LnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBOzs7Ozs7Ozs7Ozs7Ozs7R0FlRztBQUVILE9BQU8sRUFBQyxrQkFBa0IsRUFBQyxNQUFNLGdCQUFnQixDQUFDO0FBRWxELE9BQU8sRUFBQyxvQkFBb0IsRUFBQyxNQUFNLHdCQUF3QixDQUFDO0FBQzVELE9BQU8sRUFBQyxZQUFZLEVBQUMsTUFBTSxZQUFZLENBQUM7QUFFeEMsTUFBTSxPQUFPLHdCQUF3QjtJQVFuQyxZQUFZLFdBQXFDO1FBUGpELGtCQUFhLEdBQUcsQ0FBQyxHQUFHLENBQUMsQ0FBQztRQUd0QixpQkFBWSxHQUFHLElBQUksQ0FBQztRQUNwQixpQkFBWSxHQUFHLEtBQUssQ0FBQztRQUNyQixnQkFBVyxHQUFHLFlBQVksQ0FBQyxRQUFRLENBQUM7UUFHbEMsTUFBTSxJQUFJLEdBQUcsa0JBQWtCLEVBQUUsQ0FBQztRQUNsQyxJQUFJLENBQUMsV0FBVyxHQUFHLFdBQVcsQ0FBQztRQUMvQixJQUFJLENBQUMsUUFBUSxHQUFHO1FBQ1osb0JBQW9COzs7OztVQUtsQixJQUFJLENBQUMsTUFBTTs7S0FFaEIsQ0FBQztJQUNKLENBQUM7Q0FDRiIsInNvdXJjZXNDb250ZW50IjpbIi8qKlxuICogQGxpY2Vuc2VcbiAqIENvcHlyaWdodCAyMDE4IEdvb2dsZSBMTEMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuXG4gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgXCJMaWNlbnNlXCIpO1xuICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLlxuICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0XG4gKlxuICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wXG4gKlxuICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZVxuICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gXCJBUyBJU1wiIEJBU0lTLFxuICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuXG4gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kXG4gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS5cbiAqID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4gKi9cblxuaW1wb3J0IHtnZXRHbHNsRGlmZmVyZW5jZXN9IGZyb20gJy4vZ2xzbF92ZXJzaW9uJztcbmltcG9ydCB7R1BHUFVQcm9ncmFtfSBmcm9tICcuL2dwZ3B1X21hdGgnO1xuaW1wb3J0IHtFTkNPREVfRkxPQVRfU05JUFBFVH0gZnJvbSAnLi9zaGFkZXJfY29tcGlsZXJfdXRpbCc7XG5pbXBvcnQge1RleHR1cmVVc2FnZX0gZnJvbSAnLi90ZXhfdXRpbCc7XG5cbmV4cG9ydCBjbGFzcyBFbmNvZGVGbG9hdFBhY2tlZFByb2dyYW0gaW1wbGVtZW50cyBHUEdQVVByb2dyYW0ge1xuICB2YXJpYWJsZU5hbWVzID0gWydBJ107XG4gIHVzZXJDb2RlOiBzdHJpbmc7XG4gIG91dHB1dFNoYXBlOiBudW1iZXJbXTtcbiAgcGFja2VkSW5wdXRzID0gdHJ1ZTtcbiAgcGFja2VkT3V0cHV0ID0gZmFsc2U7XG4gIG91dFRleFVzYWdlID0gVGV4dHVyZVVzYWdlLkRPV05MT0FEO1xuXG4gIGNvbnN0cnVjdG9yKG91dHB1dFNoYXBlOiBbbnVtYmVyLCBudW1iZXIsIG51bWJlcl0pIHtcbiAgICBjb25zdCBnbHNsID0gZ2V0R2xzbERpZmZlcmVuY2VzKCk7XG4gICAgdGhpcy5vdXRwdXRTaGFwZSA9IG91dHB1dFNoYXBlO1xuICAgIHRoaXMudXNlckNvZGUgPSBgXG4gICAgICAke0VOQ09ERV9GTE9BVF9TTklQUEVUfVxuXG4gICAgICB2b2lkIG1haW4oKSB7XG4gICAgICAgIGl2ZWMzIGNvb3JkcyA9IGdldE91dHB1dENvb3JkcygpO1xuICAgICAgICBmbG9hdCB4ID0gZ2V0Q2hhbm5lbChnZXRBQXRPdXRDb29yZHMoKSwgdmVjMihjb29yZHMueSwgY29vcmRzLnopKTtcbiAgICAgICAgJHtnbHNsLm91dHB1dH0gPSBlbmNvZGVfZmxvYXQoeCk7XG4gICAgICB9XG4gICAgYDtcbiAgfVxufVxuIl19","/**\n * @license\n * Copyright 2018 Google LLC. All Rights Reserved.\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n * =============================================================================\n */\nimport { getGlslDifferences } from './glsl_version';\nimport { useShapeUniforms } from './gpgpu_math';\nimport * as shader_util from './shader_compiler_util';\nexport class EncodeMatrixProgram {\n constructor(outputShape, inputIsUnsignedByte = false) {\n this.variableNames = ['A'];\n this.customUniforms = [{ name: 'texShape', type: 'ivec2' }];\n const glsl = getGlslDifferences();\n this.outputShape = outputShape;\n this.enableShapeUniforms = useShapeUniforms(this.outputShape.length);\n let output = `result`;\n if (inputIsUnsignedByte) {\n output = `floor(result * 255. + 0.5)`;\n }\n this.userCode = `\n ${this.enableShapeUniforms ? shader_util.getFlatIndexFrom3DOutput() :\n shader_util.getFlatIndexFrom3D(outputShape)}\n\n void main() {\n ivec3 coords = getOutputCoords();\n\n int flatIndex = getFlatIndex(coords);\n int offset = imod(flatIndex, 4);\n\n flatIndex = idiv(flatIndex, 4, 1.);\n\n int r = flatIndex / texShape[1];\n int c = imod(flatIndex, texShape[1]);\n vec2 uv = (vec2(c, r) + halfCR) / vec2(texShape[1], texShape[0]);\n vec4 values = ${glsl.texture2D}(A, uv);\n\n float result;\n\n if(offset == 0) {\n result = values[0];\n } else if(offset == 1) {\n result = values[1];\n } else if(offset == 2) {\n result = values[2];\n } else {\n result = values[3];\n }\n\n ${glsl.output} = vec4(${output}, 0., 0., 0.);\n }\n `;\n }\n}\n//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZW5jb2RlX21hdHJpeF9ncHUuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi90ZmpzLWJhY2tlbmQtd2ViZ2wvc3JjL2VuY29kZV9tYXRyaXhfZ3B1LnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBOzs7Ozs7Ozs7Ozs7Ozs7R0FlRztBQUVILE9BQU8sRUFBQyxrQkFBa0IsRUFBQyxNQUFNLGdCQUFnQixDQUFDO0FBQ2xELE9BQU8sRUFBZSxnQkFBZ0IsRUFBQyxNQUFNLGNBQWMsQ0FBQztBQUM1RCxPQUFPLEtBQUssV0FBVyxNQUFNLHdCQUF3QixDQUFDO0FBRXRELE1BQU0sT0FBTyxtQkFBbUI7SUFPOUIsWUFDSSxXQUFxQyxFQUFFLG1CQUFtQixHQUFHLEtBQUs7UUFQdEUsa0JBQWEsR0FBRyxDQUFDLEdBQUcsQ0FBQyxDQUFDO1FBSXRCLG1CQUFjLEdBQUcsQ0FBQyxFQUFDLElBQUksRUFBRSxVQUFVLEVBQUUsSUFBSSxFQUFFLE9BQWdCLEVBQUUsQ0FBQyxDQUFDO1FBSTdELE1BQU0sSUFBSSxHQUFHLGtCQUFrQixFQUFFLENBQUM7UUFDbEMsSUFBSSxDQUFDLFdBQVcsR0FBRyxXQUFXLENBQUM7UUFDL0IsSUFBSSxDQUFDLG1CQUFtQixHQUFHLGdCQUFnQixDQUFDLElBQUksQ0FBQyxXQUFXLENBQUMsTUFBTSxDQUFDLENBQUM7UUFFckUsSUFBSSxNQUFNLEdBQUcsUUFBUSxDQUFDO1FBQ3RCLElBQUksbUJBQW1CLEVBQUU7WUFDdkIsTUFBTSxHQUFHLDRCQUE0QixDQUFDO1NBQ3ZDO1FBRUQsSUFBSSxDQUFDLFFBQVEsR0FBRztRQUVaLElBQUksQ0FBQyxtQkFBbUIsQ0FBQyxDQUFDLENBQUMsV0FBVyxDQUFDLHdCQUF3QixFQUFFLENBQUMsQ0FBQztZQUN4QyxXQUFXLENBQUMsa0JBQWtCLENBQUMsV0FBVyxDQUFDOzs7Ozs7Ozs7Ozs7O3dCQWF0RCxJQUFJLENBQUMsU0FBUzs7Ozs7Ozs7Ozs7Ozs7VUFjNUIsSUFBSSxDQUFDLE1BQU0sV0FBVyxNQUFNOztLQUVqQyxDQUFDO0lBQ0osQ0FBQztDQUNGIiwic291cmNlc0NvbnRlbnQiOlsiLyoqXG4gKiBAbGljZW5zZVxuICogQ29weXJpZ2h0IDIwMTggR29vZ2xlIExMQy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC5cbiAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSBcIkxpY2Vuc2VcIik7XG4gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuXG4gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXRcbiAqXG4gKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjBcbiAqXG4gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlXG4gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiBcIkFTIElTXCIgQkFTSVMsXG4gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC5cbiAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmRcbiAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLlxuICogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbiAqL1xuXG5pbXBvcnQge2dldEdsc2xEaWZmZXJlbmNlc30gZnJvbSAnLi9nbHNsX3ZlcnNpb24nO1xuaW1wb3J0IHtHUEdQVVByb2dyYW0sIHVzZVNoYXBlVW5pZm9ybXN9IGZyb20gJy4vZ3BncHVfbWF0aCc7XG5pbXBvcnQgKiBhcyBzaGFkZXJfdXRpbCBmcm9tICcuL3NoYWRlcl9jb21waWxlcl91dGlsJztcblxuZXhwb3J0IGNsYXNzIEVuY29kZU1hdHJpeFByb2dyYW0gaW1wbGVtZW50cyBHUEdQVVByb2dyYW0ge1xuICB2YXJpYWJsZU5hbWVzID0gWydBJ107XG4gIHVzZXJDb2RlOiBzdHJpbmc7XG4gIG91dHB1dFNoYXBlOiBudW1iZXJbXTtcbiAgZW5hYmxlU2hhcGVVbmlmb3JtczogYm9vbGVhbjtcbiAgY3VzdG9tVW5pZm9ybXMgPSBbe25hbWU6ICd0ZXhTaGFwZScsIHR5cGU6ICdpdmVjMicgYXMgY29uc3QgfV07XG5cbiAgY29uc3RydWN0b3IoXG4gICAgICBvdXRwdXRTaGFwZTogW251bWJlciwgbnVtYmVyLCBudW1iZXJdLCBpbnB1dElzVW5zaWduZWRCeXRlID0gZmFsc2UpIHtcbiAgICBjb25zdCBnbHNsID0gZ2V0R2xzbERpZmZlcmVuY2VzKCk7XG4gICAgdGhpcy5vdXRwdXRTaGFwZSA9IG91dHB1dFNoYXBlO1xuICAgIHRoaXMuZW5hYmxlU2hhcGVVbmlmb3JtcyA9IHVzZVNoYXBlVW5pZm9ybXModGhpcy5vdXRwdXRTaGFwZS5sZW5ndGgpO1xuXG4gICAgbGV0IG91dHB1dCA9IGByZXN1bHRgO1xuICAgIGlmIChpbnB1dElzVW5zaWduZWRCeXRlKSB7XG4gICAgICBvdXRwdXQgPSBgZmxvb3IocmVzdWx0ICogMjU1LiArIDAuNSlgO1xuICAgIH1cblxuICAgIHRoaXMudXNlckNvZGUgPSBgXG4gICAgICAke1xuICAgICAgICB0aGlzLmVuYWJsZVNoYXBlVW5pZm9ybXMgPyBzaGFkZXJfdXRpbC5nZXRGbGF0SW5kZXhGcm9tM0RPdXRwdXQoKSA6XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNoYWRlcl91dGlsLmdldEZsYXRJbmRleEZyb20zRChvdXRwdXRTaGFwZSl9XG5cbiAgICAgIHZvaWQgbWFpbigpIHtcbiAgICAgICAgaXZlYzMgY29vcmRzID0gZ2V0T3V0cHV0Q29vcmRzKCk7XG5cbiAgICAgICAgaW50IGZsYXRJbmRleCA9IGdldEZsYXRJbmRleChjb29yZHMpO1xuICAgICAgICBpbnQgb2Zmc2V0ID0gaW1vZChmbGF0SW5kZXgsIDQpO1xuXG4gICAgICAgIGZsYXRJbmRleCA9IGlkaXYoZmxhdEluZGV4LCA0LCAxLik7XG5cbiAgICAgICAgaW50IHIgPSBmbGF0SW5kZXggLyB0ZXhTaGFwZVsxXTtcbiAgICAgICAgaW50IGMgPSBpbW9kKGZsYXRJbmRleCwgdGV4U2hhcGVbMV0pO1xuICAgICAgICB2ZWMyIHV2ID0gKHZlYzIoYywgcikgKyBoYWxmQ1IpIC8gdmVjMih0ZXhTaGFwZVsxXSwgdGV4U2hhcGVbMF0pO1xuICAgICAgICB2ZWM0IHZhbHVlcyA9ICR7Z2xzbC50ZXh0dXJlMkR9KEEsIHV2KTtcblxuICAgICAgICBmbG9hdCByZXN1bHQ7XG5cbiAgICAgICAgaWYob2Zmc2V0ID09IDApIHtcbiAgICAgICAgICByZXN1bHQgPSB2YWx1ZXNbMF07XG4gICAgICAgIH0gZWxzZSBpZihvZmZzZXQgPT0gMSkge1xuICAgICAgICAgIHJlc3VsdCA9IHZhbHVlc1sxXTtcbiAgICAgICAgfSBlbHNlIGlmKG9mZnNldCA9PSAyKSB7XG4gICAgICAgICAgcmVzdWx0ID0gdmFsdWVzWzJdO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIHJlc3VsdCA9IHZhbHVlc1szXTtcbiAgICAgICAgfVxuXG4gICAgICAgICR7Z2xzbC5vdXRwdXR9ID0gdmVjNCgke291dHB1dH0sIDAuLCAwLiwgMC4pO1xuICAgICAgfVxuICAgIGA7XG4gIH1cbn1cbiJdfQ==","/**\n * @license\n * Copyright 2018 Google LLC. All Rights Reserved.\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n * =============================================================================\n */\nimport { getGlslDifferences } from './glsl_version';\nimport { useShapeUniforms } from './gpgpu_math';\nimport * as shader_util from './shader_compiler_util';\n/*\nThis is how the shader encodes a tensor with shape = [2, 3, 5]\n(indices are [batch, row, col]).\n\n000|001 002|003 004|xxx 020|021 022|023 024|xxx\n------- ------- ------- ------- ------- -------\n010|011 012|013 014|xxx xxx|xxx xxx|xxx xxx|xxx\n\n100|101 102|103 104|xxx 120|121 122|123 124|xxx\n------- ------- ------- ------- ------- -------\n110|111 112|113 114|xxx xxx|xxx xxx|xxx xxx|xxx\n\nSingle texels contain only values from the same batch, and from adjacent rows\nand columns.\n */\nexport class EncodeMatrixPackedProgram {\n constructor(outputShape, inputIsUnsignedByte = false) {\n this.variableNames = ['A'];\n this.packedInputs = false;\n this.packedOutput = true;\n this.customUniforms = [{ name: 'texShape', type: 'ivec2' }];\n const glsl = getGlslDifferences();\n this.outputShape = outputShape;\n this.enableShapeUniforms = useShapeUniforms(this.outputShape.length);\n let mainLoop = '';\n let output = 'result';\n if (inputIsUnsignedByte) {\n output = 'floor(result * 255. + 0.5)';\n }\n for (let row = 0; row <= 1; row++) {\n for (let col = 0; col <= 1; col++) {\n const channel = row * 2 + col;\n mainLoop += `\n localCoords = coords;\n if(localCoords[2] + ${col} < ${this.enableShapeUniforms ? 'outShape[2]' : `${outputShape[2]}`}) {\n localCoords[2] += ${col};\n if (localCoords[1] + ${row} < ${this.enableShapeUniforms ? 'outShape[1]' : `${outputShape[1]}`}) {\n localCoords[1] += ${row};\n\n flatIndex = getFlatIndex(localCoords);\n offset = imod(flatIndex, 4);\n\n flatIndex = idiv(flatIndex, 4, 1.);\n\n int r = flatIndex / texShape[1];\n int c = imod(flatIndex, texShape[1]);\n vec2 uv = (vec2(c, r) + halfCR) / vec2(texShape[1], texShape[0]);\n values = ${glsl.texture2D}(A, uv);\n\n if (offset == 0) {\n result[${channel}] = values[0];\n } else if (offset == 1) {\n result[${channel}] = values[1];\n } else if (offset == 2) {\n result[${channel}] = values[2];\n } else {\n result[${channel}] = values[3];\n }\n }\n }\n `;\n }\n }\n this.userCode = `\n ${this.enableShapeUniforms ? shader_util.getFlatIndexFrom3DOutput() :\n shader_util.getFlatIndexFrom3D(outputShape)}\n\n void main() {\n ivec3 coords = getOutputCoords();\n\n vec4 result = vec4(0.);\n int flatIndex, r, c, offset;\n ivec3 localCoords;\n vec2 uv;\n vec4 values;\n\n ${mainLoop}\n\n ${glsl.output} = ${output};\n }\n `;\n }\n}\n//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZW5jb2RlX21hdHJpeF9wYWNrZWRfZ3B1LmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vdGZqcy1iYWNrZW5kLXdlYmdsL3NyYy9lbmNvZGVfbWF0cml4X3BhY2tlZF9ncHUudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUE7Ozs7Ozs7Ozs7Ozs7OztHQWVHO0FBRUgsT0FBTyxFQUFDLGtCQUFrQixFQUFDLE1BQU0sZ0JBQWdCLENBQUM7QUFDbEQsT0FBTyxFQUFlLGdCQUFnQixFQUFDLE1BQU0sY0FBYyxDQUFDO0FBQzVELE9BQU8sS0FBSyxXQUFXLE1BQU0sd0JBQXdCLENBQUM7QUFFdEQ7Ozs7Ozs7Ozs7Ozs7O0dBY0c7QUFFSCxNQUFNLE9BQU8seUJBQXlCO0lBU3BDLFlBQ0ksV0FBcUMsRUFBRSxtQkFBbUIsR0FBRyxLQUFLO1FBVHRFLGtCQUFhLEdBQUcsQ0FBQyxHQUFHLENBQUMsQ0FBQztRQUd0QixpQkFBWSxHQUFHLEtBQUssQ0FBQztRQUNyQixpQkFBWSxHQUFHLElBQUksQ0FBQztRQUVwQixtQkFBYyxHQUFHLENBQUMsRUFBQyxJQUFJLEVBQUUsVUFBVSxFQUFFLElBQUksRUFBRSxPQUFnQixFQUFFLENBQUMsQ0FBQztRQUk3RCxNQUFNLElBQUksR0FBRyxrQkFBa0IsRUFBRSxDQUFDO1FBQ2xDLElBQUksQ0FBQyxXQUFXLEdBQUcsV0FBVyxDQUFDO1FBQy9CLElBQUksQ0FBQyxtQkFBbUIsR0FBRyxnQkFBZ0IsQ0FBQyxJQUFJLENBQUMsV0FBVyxDQUFDLE1BQU0sQ0FBQyxDQUFDO1FBRXJFLElBQUksUUFBUSxHQUFHLEVBQUUsQ0FBQztRQUNsQixJQUFJLE1BQU0sR0FBRyxRQUFRLENBQUM7UUFDdEIsSUFBSSxtQkFBbUIsRUFBRTtZQUN2QixNQUFNLEdBQUcsNEJBQTRCLENBQUM7U0FDdkM7UUFFRCxLQUFLLElBQUksR0FBRyxHQUFHLENBQUMsRUFBRSxHQUFHLElBQUksQ0FBQyxFQUFFLEdBQUcsRUFBRSxFQUFFO1lBQ2pDLEtBQUssSUFBSSxHQUFHLEdBQUcsQ0FBQyxFQUFFLEdBQUcsSUFBSSxDQUFDLEVBQUUsR0FBRyxFQUFFLEVBQUU7Z0JBQ2pDLE1BQU0sT0FBTyxHQUFHLEdBQUcsR0FBRyxDQUFDLEdBQUcsR0FBRyxDQUFDO2dCQUU5QixRQUFRLElBQUk7O2dDQUVZLEdBQUcsTUFDdkIsSUFBSSxDQUFDLG1CQUFtQixDQUFDLENBQUMsQ0FBQyxhQUFhLENBQUMsQ0FBQyxDQUFDLEdBQUcsV0FBVyxDQUFDLENBQUMsQ0FBQyxFQUFFOzhCQUM1QyxHQUFHO2lDQUNBLEdBQUcsTUFDeEIsSUFBSSxDQUFDLG1CQUFtQixDQUFDLENBQUMsQ0FBQyxhQUFhLENBQUMsQ0FBQyxDQUFDLEdBQUcsV0FBVyxDQUFDLENBQUMsQ0FBQyxFQUFFO2dDQUMxQyxHQUFHOzs7Ozs7Ozs7O3VCQVVaLElBQUksQ0FBQyxTQUFTOzs7dUJBR2QsT0FBTzs7dUJBRVAsT0FBTzs7dUJBRVAsT0FBTzs7dUJBRVAsT0FBTzs7OztTQUlyQixDQUFDO2FBQ0g7U0FDRjtRQUVELElBQUksQ0FBQyxRQUFRLEdBQUc7VUFFWixJQUFJLENBQUMsbUJBQW1CLENBQUMsQ0FBQyxDQUFDLFdBQVcsQ0FBQyx3QkFBd0IsRUFBRSxDQUFDLENBQUM7WUFDeEMsV0FBVyxDQUFDLGtCQUFrQixDQUFDLFdBQVcsQ0FBQzs7Ozs7Ozs7Ozs7WUFXbEUsUUFBUTs7WUFFUixJQUFJLENBQUMsTUFBTSxNQUFNLE1BQU07O0tBRTlCLENBQUM7SUFDSixDQUFDO0NBQ0YiLCJzb3VyY2VzQ29udGVudCI6WyIvKipcbiAqIEBsaWNlbnNlXG4gKiBDb3B5cmlnaHQgMjAxOCBHb29nbGUgTExDLiBBbGwgUmlnaHRzIFJlc2VydmVkLlxuICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlIFwiTGljZW5zZVwiKTtcbiAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS5cbiAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdFxuICpcbiAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMFxuICpcbiAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmVcbiAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuIFwiQVMgSVNcIiBCQVNJUyxcbiAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLlxuICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZFxuICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuXG4gKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuICovXG5cbmltcG9ydCB7Z2V0R2xzbERpZmZlcmVuY2VzfSBmcm9tICcuL2dsc2xfdmVyc2lvbic7XG5pbXBvcnQge0dQR1BVUHJvZ3JhbSwgdXNlU2hhcGVVbmlmb3Jtc30gZnJvbSAnLi9ncGdwdV9tYXRoJztcbmltcG9ydCAqIGFzIHNoYWRlcl91dGlsIGZyb20gJy4vc2hhZGVyX2NvbXBpbGVyX3V0aWwnO1xuXG4vKlxuVGhpcyBpcyBob3cgdGhlIHNoYWRlciBlbmNvZGVzIGEgdGVuc29yIHdpdGggc2hhcGUgPSBbMiwgMywgNV1cbihpbmRpY2VzIGFyZSBbYmF0Y2gsIHJvdywgY29sXSkuXG5cbjAwMHwwMDEgICAwMDJ8MDAzICAgMDA0fHh4eCAgIDAyMHwwMjEgICAwMjJ8MDIzICAgMDI0fHh4eFxuLS0tLS0tLSAgIC0tLS0tLS0gICAtLS0tLS0tICAgLS0tLS0tLSAgIC0tLS0tLS0gICAtLS0tLS0tXG4wMTB8MDExICAgMDEyfDAxMyAgIDAxNHx4eHggICB4eHh8eHh4ICAgeHh4fHh4eCAgIHh4eHx4eHhcblxuMTAwfDEwMSAgIDEwMnwxMDMgICAxMDR8eHh4ICAgMTIwfDEyMSAgIDEyMnwxMjMgICAxMjR8eHh4XG4tLS0tLS0tICAgLS0tLS0tLSAgIC0tLS0tLS0gICAtLS0tLS0tICAgLS0tLS0tLSAgIC0tLS0tLS1cbjExMHwxMTEgICAxMTJ8MTEzICAgMTE0fHh4eCAgIHh4eHx4eHggICB4eHh8eHh4ICAgeHh4fHh4eFxuXG5TaW5nbGUgdGV4ZWxzIGNvbnRhaW4gb25seSB2YWx1ZXMgZnJvbSB0aGUgc2FtZSBiYXRjaCwgYW5kIGZyb20gYWRqYWNlbnQgcm93c1xuYW5kIGNvbHVtbnMuXG4gKi9cblxuZXhwb3J0IGNsYXNzIEVuY29kZU1hdHJpeFBhY2tlZFByb2dyYW0gaW1wbGVtZW50cyBHUEdQVVByb2dyYW0ge1xuICB2YXJpYWJsZU5hbWVzID0gWydBJ107XG4gIHVzZXJDb2RlOiBzdHJpbmc7XG4gIG91dHB1dFNoYXBlOiBudW1iZXJbXTtcbiAgcGFja2VkSW5wdXRzID0gZmFsc2U7XG4gIHBhY2tlZE91dHB1dCA9IHRydWU7XG4gIGVuYWJsZVNoYXBlVW5pZm9ybXM6IGJvb2xlYW47XG4gIGN1c3RvbVVuaWZvcm1zID0gW3tuYW1lOiAndGV4U2hhcGUnLCB0eXBlOiAnaXZlYzInIGFzIGNvbnN0IH1dO1xuXG4gIGNvbnN0cnVjdG9yKFxuICAgICAgb3V0cHV0U2hhcGU6IFtudW1iZXIsIG51bWJlciwgbnVtYmVyXSwgaW5wdXRJc1Vuc2lnbmVkQnl0ZSA9IGZhbHNlKSB7XG4gICAgY29uc3QgZ2xzbCA9IGdldEdsc2xEaWZmZXJlbmNlcygpO1xuICAgIHRoaXMub3V0cHV0U2hhcGUgPSBvdXRwdXRTaGFwZTtcbiAgICB0aGlzLmVuYWJsZVNoYXBlVW5pZm9ybXMgPSB1c2VTaGFwZVVuaWZvcm1zKHRoaXMub3V0cHV0U2hhcGUubGVuZ3RoKTtcblxuICAgIGxldCBtYWluTG9vcCA9ICcnO1xuICAgIGxldCBvdXRwdXQgPSAncmVzdWx0JztcbiAgICBpZiAoaW5wdXRJc1Vuc2lnbmVkQnl0ZSkge1xuICAgICAgb3V0cHV0ID0gJ2Zsb29yKHJlc3VsdCAqIDI1NS4gKyAwLjUpJztcbiAgICB9XG5cbiAgICBmb3IgKGxldCByb3cgPSAwOyByb3cgPD0gMTsgcm93KyspIHtcbiAgICAgIGZvciAobGV0IGNvbCA9IDA7IGNvbCA8PSAxOyBjb2wrKykge1xuICAgICAgICBjb25zdCBjaGFubmVsID0gcm93ICogMiArIGNvbDtcblxuICAgICAgICBtYWluTG9vcCArPSBgXG4gICAgICAgICAgbG9jYWxDb29yZHMgPSBjb29yZHM7XG4gICAgICAgICAgaWYobG9jYWxDb29yZHNbMl0gKyAke2NvbH0gPCAke1xuICAgICAgICAgICAgdGhpcy5lbmFibGVTaGFwZVVuaWZvcm1zID8gJ291dFNoYXBlWzJdJyA6IGAke291dHB1dFNoYXBlWzJdfWB9KSB7XG4gICAgICAgICAgbG9jYWxDb29yZHNbMl0gKz0gJHtjb2x9O1xuICAgICAgICAgIGlmIChsb2NhbENvb3Jkc1sxXSArICR7cm93fSA8ICR7XG4gICAgICAgICAgICB0aGlzLmVuYWJsZVNoYXBlVW5pZm9ybXMgPyAnb3V0U2hhcGVbMV0nIDogYCR7b3V0cHV0U2hhcGVbMV19YH0pIHtcbiAgICAgICAgICAgIGxvY2FsQ29vcmRzWzFdICs9ICR7cm93fTtcblxuICAgICAgICAgICAgZmxhdEluZGV4ID0gZ2V0RmxhdEluZGV4KGxvY2FsQ29vcmRzKTtcbiAgICAgICAgICAgIG9mZnNldCA9IGltb2QoZmxhdEluZGV4LCA0KTtcblxuICAgICAgICAgICAgZmxhdEluZGV4ID0gaWRpdihmbGF0SW5kZXgsIDQsIDEuKTtcblxuICAgICAgICAgICAgaW50IHIgPSBmbGF0SW5kZXggLyB0ZXhTaGFwZVsxXTtcbiAgICAgICAgICAgIGludCBjID0gaW1vZChmbGF0SW5kZXgsIHRleFNoYXBlWzFdKTtcbiAgICAgICAgICAgIHZlYzIgdXYgPSAodmVjMihjLCByKSArIGhhbGZDUikgLyB2ZWMyKHRleFNoYXBlWzFdLCB0ZXhTaGFwZVswXSk7XG4gICAgICAgICAgICB2YWx1ZXMgPSAke2dsc2wudGV4dHVyZTJEfShBLCB1dik7XG5cbiAgICAgICAgICAgIGlmIChvZmZzZXQgPT0gMCkge1xuICAgICAgICAgICAgICByZXN1bHRbJHtjaGFubmVsfV0gPSB2YWx1ZXNbMF07XG4gICAgICAgICAgICB9IGVsc2UgaWYgKG9mZnNldCA9PSAxKSB7XG4gICAgICAgICAgICAgIHJlc3VsdFske2NoYW5uZWx9XSA9IHZhbHVlc1sxXTtcbiAgICAgICAgICAgIH0gZWxzZSBpZiAob2Zmc2V0ID09IDIpIHtcbiAgICAgICAgICAgICAgcmVzdWx0WyR7Y2hhbm5lbH1dID0gdmFsdWVzWzJdO1xuICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgcmVzdWx0WyR7Y2hhbm5lbH1dID0gdmFsdWVzWzNdO1xuICAgICAgICAgICAgfVxuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICBgO1xuICAgICAgfVxuICAgIH1cblxuICAgIHRoaXMudXNlckNvZGUgPSBgXG4gICAgICAgICR7XG4gICAgICAgIHRoaXMuZW5hYmxlU2hhcGVVbmlmb3JtcyA/IHNoYWRlcl91dGlsLmdldEZsYXRJbmRleEZyb20zRE91dHB1dCgpIDpcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2hhZGVyX3V0aWwuZ2V0RmxhdEluZGV4RnJvbTNEKG91dHB1dFNoYXBlKX1cblxuICAgICAgICB2b2lkIG1haW4oKSB7XG4gICAgICAgICAgaXZlYzMgY29vcmRzID0gZ2V0T3V0cHV0Q29vcmRzKCk7XG5cbiAgICAgICAgICB2ZWM0IHJlc3VsdCA9IHZlYzQoMC4pO1xuICAgICAgICAgIGludCBmbGF0SW5kZXgsIHIsIGMsIG9mZnNldDtcbiAgICAgICAgICBpdmVjMyBsb2NhbENvb3JkcztcbiAgICAgICAgICB2ZWMyIHV2O1xuICAgICAgICAgIHZlYzQgdmFsdWVzO1xuXG4gICAgICAgICAgJHttYWluTG9vcH1cblxuICAgICAgICAgICR7Z2xzbC5vdXRwdXR9ID0gJHtvdXRwdXR9O1xuICAgICAgICB9XG4gICAgYDtcbiAgfVxufVxuIl19","/**\n * @license\n * Copyright 2017 Google LLC. All Rights Reserved.\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n * =============================================================================\n */\nimport { env } from '@tensorflow/tfjs-core';\nimport { getGlslDifferences } from './glsl_version';\nimport * as tex_util from './tex_util';\nimport * as webgl_util from './webgl_util';\nexport function createVertexShader(gl) {\n const glsl = getGlslDifferences();\n const vertexShaderSource = `${glsl.version}\n precision highp float;\n ${glsl.attribute} vec3 clipSpacePos;\n ${glsl.attribute} vec2 uv;\n ${glsl.varyingVs} vec2 resultUV;\n\n void main() {\n gl_Position = vec4(clipSpacePos, 1);\n resultUV = uv;\n }`;\n return webgl_util.createVertexShader(gl, vertexShaderSource);\n}\nexport function createVertexBuffer(gl) {\n // [x y z u v] * [upper-left, lower-left, upper-right, lower-right]\n const vertexArray = new Float32Array([-1, 1, 0, 0, 1, -1, -1, 0, 0, 0, 1, 1, 0, 1, 1, 1, -1, 0, 1, 0]);\n return webgl_util.createStaticVertexBuffer(gl, vertexArray);\n}\nexport function createIndexBuffer(gl) {\n // OpenGL (and WebGL) have \"CCW == front\" winding\n const triangleVertexIndices = new Uint16Array([0, 1, 2, 2, 1, 3]);\n return webgl_util.createStaticIndexBuffer(gl, triangleVertexIndices);\n}\nfunction createAndConfigureTexture(gl, width, height, internalFormat, textureFormat, textureType) {\n webgl_util.validateTextureSize(width, height);\n const texture = webgl_util.createTexture(gl);\n const tex2d = gl.TEXTURE_2D;\n webgl_util.callAndCheck(gl, () => gl.bindTexture(tex2d, texture));\n webgl_util.callAndCheck(gl, () => gl.texParameteri(tex2d, gl.TEXTURE_WRAP_S, gl.CLAMP_TO_EDGE));\n webgl_util.callAndCheck(gl, () => gl.texParameteri(tex2d, gl.TEXTURE_WRAP_T, gl.CLAMP_TO_EDGE));\n webgl_util.callAndCheck(gl, () => gl.texParameteri(tex2d, gl.TEXTURE_MIN_FILTER, gl.NEAREST));\n webgl_util.callAndCheck(gl, () => gl.texParameteri(tex2d, gl.TEXTURE_MAG_FILTER, gl.NEAREST));\n if (env().getNumber('WEBGL_VERSION') === 1) {\n webgl_util.callAndCheck(gl, () => gl.texImage2D(tex2d, 0, internalFormat, width, height, 0, textureFormat, textureType, null));\n }\n else {\n webgl_util.callAndCheck(gl, () => gl\n .texStorage2D(tex2d, 1, internalFormat, width, height));\n }\n webgl_util.callAndCheck(gl, () => gl.bindTexture(gl.TEXTURE_2D, null));\n return { texture, texShape: [height, width] };\n}\nexport function getInternalFormatForFloat32MatrixTexture(textureConfig) {\n return textureConfig.internalFormatFloat;\n}\nexport function createFloat32MatrixTexture(gl, rows, columns, textureConfig) {\n const [width, height] = tex_util.getUnpackedMatrixTextureShapeWidthHeight(rows, columns);\n return createAndConfigureTexture(gl, width, height, getInternalFormatForFloat32MatrixTexture(textureConfig), textureConfig.textureFormatFloat, gl.FLOAT);\n}\nexport function getInternalFormatForFloat16MatrixTexture(textureConfig) {\n return textureConfig.internalFormatHalfFloat;\n}\nexport function createFloat16MatrixTexture(gl, rows, columns, textureConfig) {\n const [width, height] = tex_util.getUnpackedMatrixTextureShapeWidthHeight(rows, columns);\n return createAndConfigureTexture(gl, width, height, getInternalFormatForFloat16MatrixTexture(textureConfig), textureConfig.textureFormatFloat, textureConfig.textureTypeHalfFloat);\n}\nexport function getInternalFormatForUnsignedBytesMatrixTexture(textureConfig) {\n return textureConfig.downloadTextureFormat;\n}\nexport function createUnsignedBytesMatrixTexture(gl, rows, columns, textureConfig) {\n const [width, height] = tex_util.getUnpackedMatrixTextureShapeWidthHeight(rows, columns);\n return createAndConfigureTexture(gl, width, height, getInternalFormatForUnsignedBytesMatrixTexture(textureConfig), gl.RGBA, gl.UNSIGNED_BYTE);\n}\nexport function getInternalFormatForPackedMatrixTexture(textureConfig) {\n return textureConfig.internalFormatPackedFloat;\n}\nexport function createPackedMatrixTexture(gl, rows, columns, textureConfig) {\n const [width, height] = tex_util.getPackedMatrixTextureShapeWidthHeight(rows, columns);\n return createAndConfigureTexture(gl, width, height, getInternalFormatForPackedMatrixTexture(textureConfig), gl.RGBA, gl.FLOAT);\n}\nexport function getInternalFormatForFloat16PackedMatrixTexture(textureConfig) {\n return textureConfig.internalFormatPackedHalfFloat;\n}\nexport function createFloat16PackedMatrixTexture(gl, rows, columns, textureConfig) {\n const [width, height] = tex_util.getPackedMatrixTextureShapeWidthHeight(rows, columns);\n return createAndConfigureTexture(gl, width, height, getInternalFormatForFloat16PackedMatrixTexture(textureConfig), gl.RGBA, textureConfig.textureTypeHalfFloat);\n}\nexport function bindVertexProgramAttributeStreams(gl, program, vertexBuffer) {\n const posOffset = 0; // x is the first buffer element\n const uvOffset = 3 * 4; // uv comes after [x y z]\n const stride = (3 * 4) + (2 * 4); // xyz + uv, each entry is 4-byte float.\n webgl_util.callAndCheck(gl, () => gl.bindBuffer(gl.ARRAY_BUFFER, vertexBuffer));\n const success = webgl_util.bindVertexBufferToProgramAttribute(gl, program, 'clipSpacePos', vertexBuffer, 3, stride, posOffset);\n return success &&\n webgl_util.bindVertexBufferToProgramAttribute(gl, program, 'uv', vertexBuffer, 2, stride, uvOffset);\n}\nexport function uploadDenseMatrixToTexture(gl, texture, width, height, data, textureConfig) {\n webgl_util.callAndCheck(gl, () => gl.bindTexture(gl.TEXTURE_2D, texture));\n let dataForUpload, texelDataType, internalFormat;\n if (data instanceof Uint8Array) {\n dataForUpload = new Uint8Array(width * height * 4);\n texelDataType = gl.UNSIGNED_BYTE;\n internalFormat = gl.RGBA;\n }\n else {\n dataForUpload = new Float32Array(width * height * 4);\n texelDataType = gl.FLOAT;\n internalFormat = textureConfig.internalFormatPackedFloat;\n }\n dataForUpload.set(data);\n if (env().getNumber('WEBGL_VERSION') === 2) {\n webgl_util.callAndCheck(gl, () => gl.texSubImage2D(gl.TEXTURE_2D, 0, 0, 0, width, height, gl.RGBA, texelDataType, dataForUpload));\n }\n else {\n webgl_util.callAndCheck(gl, () => gl.texImage2D(gl.TEXTURE_2D, 0, internalFormat, width, height, 0, gl.RGBA, texelDataType, dataForUpload));\n }\n webgl_util.callAndCheck(gl, () => gl.bindTexture(gl.TEXTURE_2D, null));\n}\nexport function uploadPixelDataToTexture(gl, texture, pixels) {\n webgl_util.callAndCheck(gl, () => gl.bindTexture(gl.TEXTURE_2D, texture));\n if (pixels.data instanceof Uint8Array) {\n if (env().getNumber('WEBGL_VERSION') === 2) {\n webgl_util.callAndCheck(gl, () => gl.texSubImage2D(gl.TEXTURE_2D, 0, 0, 0, pixels.width, pixels.height, gl.RGBA, gl.UNSIGNED_BYTE, pixels.data));\n }\n else {\n webgl_util.callAndCheck(gl, () => gl.texImage2D(gl.TEXTURE_2D, 0, gl.RGBA, pixels.width, pixels.height, 0, gl.RGBA, gl.UNSIGNED_BYTE, pixels.data));\n }\n }\n else {\n if (env().getNumber('WEBGL_VERSION') === 2) {\n webgl_util.callAndCheck(gl, () => gl.texSubImage2D(gl.TEXTURE_2D, 0, 0, 0, gl.RGBA, gl.UNSIGNED_BYTE, pixels));\n }\n else {\n webgl_util.callAndCheck(gl, () => gl.texImage2D(gl.TEXTURE_2D, 0, gl.RGBA, gl.RGBA, gl.UNSIGNED_BYTE, pixels));\n }\n }\n webgl_util.callAndCheck(gl, () => gl.bindTexture(gl.TEXTURE_2D, null));\n}\nexport function createBufferFromOutputTexture(gl2, rows, columns, textureConfig) {\n // Create and bind the buffer.\n const buffer = gl2.createBuffer();\n webgl_util.callAndCheck(gl2, () => gl2.bindBuffer(gl2.PIXEL_PACK_BUFFER, buffer));\n // Initialize the buffer to the size of the texture in bytes.\n const bytesPerFloat = 4;\n const valuesPerTexel = 4;\n const bufferSizeBytes = bytesPerFloat * valuesPerTexel * rows * columns;\n webgl_util.callAndCheck(gl2, () => gl2.bufferData(gl2.PIXEL_PACK_BUFFER, bufferSizeBytes, gl2.STREAM_READ));\n // Enqueue a command on the GPU command queue to copy of texture into the\n // buffer.\n webgl_util.callAndCheck(gl2, () => gl2.readPixels(0, 0, columns, rows, gl2.RGBA, gl2.FLOAT, 0));\n webgl_util.callAndCheck(gl2, () => gl2.bindBuffer(gl2.PIXEL_PACK_BUFFER, null));\n return buffer;\n}\nexport function downloadFloat32MatrixFromBuffer(gl, buffer, size) {\n const gl2 = gl;\n const downloadTarget = new Float32Array(size);\n gl2.bindBuffer(gl2.PIXEL_PACK_BUFFER, buffer);\n gl2.getBufferSubData(gl2.PIXEL_PACK_BUFFER, 0, downloadTarget);\n gl2.bindBuffer(gl2.PIXEL_PACK_BUFFER, null);\n return downloadTarget;\n}\nexport function downloadByteEncodedFloatMatrixFromOutputTexture(gl, rows, columns, textureConfig) {\n const [w, h] = tex_util.getUnpackedMatrixTextureShapeWidthHeight(rows, columns);\n const numChannels = 4;\n const downloadTarget = new Uint8Array(tex_util.getUnpackedArraySizeFromMatrixSize(rows * columns, numChannels));\n webgl_util.callAndCheck(gl, () => gl.readPixels(0, 0, w, h, textureConfig.downloadTextureFormat, gl.UNSIGNED_BYTE, downloadTarget));\n // By wrapping the buffer in a Float32Array, we use native browser IEEE 754\n // decoding of the 4 bytes that back each 32 bit float.\n return new Float32Array(downloadTarget.buffer);\n}\nexport function downloadPackedMatrixFromBuffer(gl, buffer, batch, rows, cols, physicalRows, physicalCols, textureConfig) {\n const gl2 = gl;\n const downloadTarget = new Float32Array(tex_util.getPackedRGBAArraySizeFromMatrixShape(physicalRows, physicalCols));\n gl2.bindBuffer(gl2.PIXEL_PACK_BUFFER, buffer);\n gl2.getBufferSubData(gl2.PIXEL_PACK_BUFFER, 0, downloadTarget);\n gl2.bindBuffer(gl2.PIXEL_PACK_BUFFER, null);\n return downloadTarget;\n}\nexport function downloadMatrixFromPackedOutputTexture(gl, physicalRows, physicalCols) {\n const packedRGBA = new Float32Array(physicalRows * physicalCols * 4);\n webgl_util.callAndCheck(gl, () => gl.readPixels(0, 0, physicalCols, physicalRows, gl.RGBA, gl.FLOAT, packedRGBA));\n return packedRGBA;\n}\n//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZ3BncHVfdXRpbC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uL3RmanMtYmFja2VuZC13ZWJnbC9zcmMvZ3BncHVfdXRpbC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQTs7Ozs7Ozs7Ozs7Ozs7O0dBZUc7QUFFSCxPQUFPLEVBQUMsR0FBRyxFQUF3QixNQUFNLHVCQUF1QixDQUFDO0FBRWpFLE9BQU8sRUFBQyxrQkFBa0IsRUFBQyxNQUFNLGdCQUFnQixDQUFDO0FBQ2xELE9BQU8sS0FBSyxRQUFRLE1BQU0sWUFBWSxDQUFDO0FBRXZDLE9BQU8sS0FBSyxVQUFVLE1BQU0sY0FBYyxDQUFDO0FBRTNDLE1BQU0sVUFBVSxrQkFBa0IsQ0FBQyxFQUF5QjtJQUMxRCxNQUFNLElBQUksR0FBRyxrQkFBa0IsRUFBRSxDQUFDO0lBQ2xDLE1BQU0sa0JBQWtCLEdBQUcsR0FBRyxJQUFJLENBQUMsT0FBTzs7TUFFdEMsSUFBSSxDQUFDLFNBQVM7TUFDZCxJQUFJLENBQUMsU0FBUztNQUNkLElBQUksQ0FBQyxTQUFTOzs7OztNQUtkLENBQUM7SUFDTCxPQUFPLFVBQVUsQ0FBQyxrQkFBa0IsQ0FBQyxFQUFFLEVBQUUsa0JBQWtCLENBQUMsQ0FBQztBQUMvRCxDQUFDO0FBRUQsTUFBTSxVQUFVLGtCQUFrQixDQUFDLEVBQXlCO0lBQzFELG1FQUFtRTtJQUNuRSxNQUFNLFdBQVcsR0FBRyxJQUFJLFlBQVksQ0FDaEMsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxD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QUFNLFVBQVUscUNBQXFDLENBQ2pELEVBQXlCLEVBQUUsWUFBb0IsRUFDL0MsWUFBb0I7SUFDdEIsTUFBTSxVQUFVLEdBQUcsSUFBSSxZQUFZLENBQUMsWUFBWSxHQUFHLFlBQVksR0FBRyxDQUFDLENBQUMsQ0FBQztJQUNyRSxVQUFVLENBQUMsWUFBWSxDQUNuQixFQUFFLEVBQ0YsR0FBRyxFQUFFLENBQUMsRUFBRSxDQUFDLFVBQVUsQ0FDZixDQUFDLEVBQUUsQ0FBQyxFQUFFLFlBQVksRUFBRSxZQUFZLEVBQUUsRUFBRSxDQUFDLElBQUksRUFBRSxFQUFFLENBQUMsS0FBSyxFQUFFLFVBQVUsQ0FBQyxDQUFDLENBQUM7SUFFMUUsT0FBTyxVQUFVLENBQUM7QUFDcEIsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbIi8qKlxuICogQGxpY2Vuc2VcbiAqIENvcHlyaWdodCAyMDE3IEdvb2dsZSBMTEMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuXG4gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgXCJMaWNlbnNlXCIpO1xuICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLlxuICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0XG4gKlxuICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wXG4gKlxuICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZVxuICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gXCJBUyBJU1wiIEJBU0lTLFxuICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuXG4gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kXG4gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS5cbiAqID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4gKi9cblxuaW1wb3J0IHtlbnYsIFBpeGVsRGF0YSwgVHlwZWRBcnJheX0gZnJvbSAnQHRlbnNvcmZsb3cvdGZqcy1jb3JlJztcblxuaW1wb3J0IHtnZXRHbHNsRGlmZmVyZW5jZXN9IGZyb20gJy4vZ2xzbF92ZXJzaW9uJztcbmltcG9ydCAqIGFzIHRleF91dGlsIGZyb20gJy4vdGV4X3V0aWwnO1xuaW1wb3J0IHtUZXh0dXJlLCBUZXh0dXJlQ29uZmlnfSBmcm9tICcuL3RleF91dGlsJztcbmltcG9ydCAqIGFzIHdlYmdsX3V0aWwgZnJvbSAnLi93ZWJnbF91dGlsJztcblxuZXhwb3J0IGZ1bmN0aW9uIGNyZWF0ZVZlcnRleFNoYWRlcihnbDogV2ViR0xSZW5kZXJpbmdDb250ZXh0KTogV2ViR0xTaGFkZXIge1xuICBjb25zdCBnbHNsID0gZ2V0R2xzbERpZmZlcmVuY2VzKCk7XG4gIGNvbnN0IHZlcnRleFNoYWRlclNvdXJjZSA9IGAke2dsc2wudmVyc2lvbn1cbiAgICBwcmVjaXNpb24gaGlnaHAgZmxvYXQ7XG4gICAgJHtnbHNsLmF0dHJpYnV0ZX0gdmVjMyBjbGlwU3BhY2VQb3M7XG4gICAgJHtnbHNsLmF0dHJpYnV0ZX0gdmVjMiB1djtcbiAgICAke2dsc2wudmFyeWluZ1ZzfSB2ZWMyIHJlc3VsdFVWO1xuXG4gICAgdm9pZCBtYWluKCkge1xuICAgICAgZ2xfUG9zaXRpb24gPSB2ZWM0KGNsaXBTcGFjZVBvcywgMSk7XG4gICAgICByZXN1bHRVViA9IHV2O1xuICAgIH1gO1xuICByZXR1cm4gd2ViZ2xfdXRpbC5jcmVhdGVWZXJ0ZXhTaGFkZXIoZ2wsIHZlcnRleFNoYWRlclNvdXJjZSk7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBjcmVhdGVWZXJ0ZXhCdWZmZXIoZ2w6IFdlYkdMUmVuZGVyaW5nQ29udGV4dCk6IFdlYkdMQnVmZmVyIHtcbiAgLy8gW3ggeSB6IHUgdl0gKiBbdXBwZXItbGVmdCwgbG93ZXItbGVmdCwgdXBwZXItcmlnaHQsIGxvd2VyLXJpZ2h0XVxuICBjb25zdCB2ZXJ0ZXhBcnJheSA9IG5ldyBGbG9hdDMyQXJyYXkoXG4gICAgICBbLTEsIDEsIDAsIDAsIDEsIC0xLCAtMSwgMCwgMCwgMCwgMSwgMSwgMCwgMSwgMSwgMSwgLTEsIDAsIDEsIDBdKTtcbiAgcmV0dXJuIHdlYmdsX3V0aWwuY3JlYXRlU3RhdGljVmVydGV4QnVmZmVyKGdsLCB2ZXJ0ZXhBcnJheSk7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBjcmVhdGVJbmRleEJ1ZmZlcihnbDogV2ViR0xSZW5kZXJpbmdDb250ZXh0KTogV2ViR0xCdWZmZXIge1xuICAvLyBPcGVuR0wgKGFuZCBXZWJHTCkgaGF2ZSBcIkNDVyA9PSBmcm9udFwiIHdpbmRpbmdcbiAgY29uc3QgdHJpYW5nbGVWZXJ0ZXhJbmRpY2VzID0gbmV3IFVpbnQxNkFycmF5KFswLCAxLCAyLCAyLCAxLCAzXSk7XG4gIHJldHVybiB3ZWJnbF91dGlsLmNyZWF0ZVN0YXRpY0luZGV4QnVmZmVyKGdsLCB0cmlhbmdsZVZlcnRleEluZGljZXMpO1xufVxuXG5mdW5jdGlvbiBjcmVhdGVBbmRDb25maWd1cmVUZXh0dXJlKFxuICAgIGdsOiBXZWJHTFJlbmRlcmluZ0NvbnRleHQsIHdpZHRoOiBudW1iZXIsIGhlaWdodDogbnVtYmVyLFxuICAgIGludGVybmFsRm9ybWF0OiBudW1iZXIsIHRleHR1cmVGb3JtYXQ6IG51bWJlcixcbiAgICB0ZXh0dXJlVHlwZTogbnVtYmVyKTogVGV4dHVyZSB7XG4gIHdlYmdsX3V0aWwudmFsaWRhdGVUZXh0dXJlU2l6ZSh3aWR0aCwgaGVpZ2h0KTtcbiAgY29uc3QgdGV4dHVyZSA9IHdlYmdsX3V0aWwuY3JlYXRlVGV4dHVyZShnbCk7XG5cbiAgY29uc3QgdGV4MmQgPSBnbC5URVhUVVJFXzJEO1xuICB3ZWJnbF91dGlsLmNhbGxBbmRDaGVjayhnbCwgKCkgPT4gZ2wuYmluZFRleHR1cmUodGV4MmQsIHRleHR1cmUpKTtcbiAgd2ViZ2xfdXRpbC5jYWxsQW5kQ2hlY2soXG4gICAgICBnbCwgKCkgPT4gZ2wudGV4UGFyYW1ldGVyaSh0ZXgyZCwgZ2wuVEVYVFVSRV9XUkFQX1MsIGdsLkNMQU1QX1RPX0VER0UpKTtcbiAgd2ViZ2xfdXRpbC5jYWxsQW5kQ2hlY2soXG4gICAgICBnbCwgKCkgPT4gZ2wudGV4UGFyYW1ldGVyaSh0ZXgyZCwgZ2wuVEVYVFVSRV9XUkFQX1QsIGdsLkNMQU1QX1RPX0VER0UpKTtcbiAgd2ViZ2xfdXRpbC5jYWxsQW5kQ2hlY2soXG4gICAgICBnbCwgKCkgPT4gZ2wudGV4UGFyYW1ldGVyaSh0ZXgyZCwgZ2wuVEVYVFVSRV9NSU5fRklMVEVSLCBnbC5ORUFSRVNUKSk7XG4gIHdlYmdsX3V0aWwuY2FsbEFuZENoZWNrKFxuICAgICAgZ2wsICgpID0+IGdsLnRleFBhcmFtZXRlcmkodGV4MmQsIGdsLlRFWFRVUkVfTUFHX0ZJTFRFUiwgZ2wuTkVBUkVTVCkpO1xuICBpZiAoZW52KCkuZ2V0TnVtYmVyKCdXRUJHTF9WRVJTSU9OJykgPT09IDEpIHtcbiAgICB3ZWJnbF91dGlsLmNhbGxBbmRDaGVjayhcbiAgICAgICAgZ2wsXG4gICAgICAgICgpID0+IGdsLnRleEltYWdlMkQoXG4gICAgICAgICAgICB0ZXgyZCwgMCwgaW50ZXJuYWxGb3JtYXQsIHdpZHRoLCBoZWlnaHQsIDAsIHRleHR1cmVGb3JtYXQsXG4gICAgICAgICAgICB0ZXh0dXJlVHlwZSwgbnVsbCkpO1xuICB9IGVsc2Uge1xuICAgIHdlYmdsX3V0aWwuY2FsbEFuZENoZWNrKFxuICAgICAgICBnbCxcbiAgICAgICAgKCkgPT4gKGdsIGFzIFdlYkdMMlJlbmRlcmluZ0NvbnRleHQpXG4gICAgICAgICAgICAgICAgICAudGV4U3RvcmFnZTJEKHRleDJkLCAxLCBpbnRlcm5hbEZvcm1hdCwgd2lkdGgsIGhlaWdodCkpO1xuICB9XG4gIHdlYmdsX3V0aWwuY2FsbEFuZENoZWNrKGdsLCAoKSA9PiBnbC5iaW5kVGV4dHVyZShnbC5URVhUVVJFXzJELCBudWxsKSk7XG5cbiAgcmV0dXJuIHt0ZXh0dXJlLCB0ZXhTaGFwZTogW2hlaWdodCwgd2lkdGhdfTtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGdldEludGVybmFsRm9ybWF0Rm9yRmxvYXQzMk1hdHJpeFRleHR1cmUoXG4gICAgdGV4dHVyZUNvbmZpZzogVGV4dHVyZUNvbmZpZykge1xuICByZXR1cm4gdGV4dHVyZUNvbmZpZy5pbnRlcm5hbEZvcm1hdEZsb2F0O1xufVxuXG5leHBvcnQgZnVuY3Rpb24gY3JlYXRlRmxvYXQzMk1hdHJpeFRleHR1cmUoXG4gICAgZ2w6IFdlYkdMUmVuZGVyaW5nQ29udGV4dCwgcm93czogbnVtYmVyLCBjb2x1bW5zOiBudW1iZXIsXG4gICAgdGV4dHVyZUNvbmZpZzogVGV4dHVyZUNvbmZpZyk6IFRleHR1cmUge1xuICBjb25zdCBbd2lkdGgsIGhlaWdodF0gPVxuICAgICAgdGV4X3V0aWwuZ2V0VW5wYWNrZWRNYXRyaXhUZXh0dXJlU2hhcGVXaWR0aEhlaWdodChyb3dzLCBjb2x1bW5zKTtcbiAgcmV0dXJuIGNyZWF0ZUFuZENvbmZpZ3VyZVRleHR1cmUoXG4gICAgICBnbCwgd2lkdGgsIGhlaWdodCxcbiAgICAgIGdldEludGVybmFsRm9ybWF0Rm9yRmxvYXQzMk1hdHJpeFRleHR1cmUodGV4dHVyZUNvbmZpZyksXG4gICAgICB0ZXh0dXJlQ29uZmlnLnRleHR1cmVGb3JtYXRGbG9hdCwgZ2wuRkxPQVQpO1xufVxuXG5leHBvcnQgZnVuY3Rpb24gZ2V0SW50ZXJuYWxGb3JtYXRGb3JGbG9hdDE2TWF0cml4VGV4dHVyZShcbiAgICB0ZXh0dXJlQ29uZmlnOiBUZXh0dXJlQ29uZmlnKSB7XG4gIHJldHVybiB0ZXh0dXJlQ29uZmlnLmludGVybmFsRm9ybWF0SGFsZkZsb2F0O1xufVxuXG5leHBvcnQgZnVuY3Rpb24gY3JlYXRlRmxvYXQxNk1hdHJpeFRleHR1cmUoXG4gICAgZ2w6IFdlYkdMUmVuZGVyaW5nQ29udGV4dCwgcm93czogbnVtYmVyLCBjb2x1bW5zOiBudW1iZXIsXG4gICAgdGV4dHVyZUNvbmZpZzogVGV4dHVyZUNvbmZpZyk6IFRleHR1cmUge1xuICBjb25zdCBbd2lkdGgsIGhlaWdodF0gPVxuICAgICAgdGV4X3V0aWwuZ2V0VW5wYWNrZWRNYXRyaXhUZXh0dXJlU2hhcGVXaWR0aEhlaWdodChyb3dzLCBjb2x1bW5zKTtcbiAgcmV0dXJuIGNyZWF0ZUFuZENvbmZpZ3VyZVRleHR1cmUoXG4gICAgICBnbCwgd2lkdGgsIGhlaWdodCxcbiAgICAgIGdldEludGVybmFsRm9ybWF0Rm9yRmxvYXQxNk1hdHJpeFRleHR1cmUodGV4dHVyZUNvbmZpZyksXG4gICAgICB0ZXh0dXJlQ29uZmlnLnRleHR1cmVGb3JtYXRGbG9hdCwgdGV4dHVyZUNvbmZpZy50ZXh0dXJlVHlwZUhhbGZGbG9hdCk7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBnZXRJbnRlcm5hbEZvcm1hdEZvclVuc2lnbmVkQnl0ZXNNYXRyaXhUZXh0dXJlKFxuICAgIHRleHR1cmVDb25maWc6IFRleHR1cmVDb25maWcpIHtcbiAgcmV0dXJuIHRleHR1cmVDb25maWcuZG93bmxvYWRUZXh0dXJlRm9ybWF0O1xufVxuXG5leHBvcnQgZnVuY3Rpb24gY3JlYXRlVW5zaWduZWRCeXRlc01hdHJpeFRleHR1cmUoXG4gICAgZ2w6IFdlYkdMUmVuZGVyaW5nQ29udGV4dCwgcm93czogbnVtYmVyLCBjb2x1bW5zOiBudW1iZXIsXG4gICAgdGV4dHVyZUNvbmZpZzogVGV4dHVyZUNvbmZpZyk6IFRleHR1cmUge1xuICBjb25zdCBbd2lkdGgsIGhlaWdodF0gPVxuICAgICAgdGV4X3V0aWwuZ2V0VW5wYWNrZWRNYXRyaXhUZXh0dXJlU2hhcGVXaWR0aEhlaWdodChyb3dzLCBjb2x1bW5zKTtcbiAgcmV0dXJuIGNyZWF0ZUFuZENvbmZpZ3VyZVRleHR1cmUoXG4gICAgICBnbCwgd2lkdGgsIGhlaWdodCxcbiAgICAgIGdldEludGVybmFsRm9ybWF0Rm9yVW5zaWduZWRCeXRlc01hdHJpeFRleHR1cmUodGV4dHVyZUNvbmZpZyksIGdsLlJHQkEsXG4gICAgICBnbC5VTlNJR05FRF9CWVRFKTtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGdldEludGVybmFsRm9ybWF0Rm9yUGFja2VkTWF0cml4VGV4dHVyZShcbiAgICB0ZXh0dXJlQ29uZmlnOiBUZXh0dXJlQ29uZmlnKSB7XG4gIHJldHVybiB0ZXh0dXJlQ29uZmlnLmludGVybmFsRm9ybWF0UGFja2VkRmxvYXQ7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBjcmVhdGVQYWNrZWRNYXRyaXhUZXh0dXJlKFxuICAgIGdsOiBXZWJHTFJlbmRlcmluZ0NvbnRleHQsIHJvd3M6IG51bWJlciwgY29sdW1uczogbnVtYmVyLFxuICAgIHRleHR1cmVDb25maWc6IFRleHR1cmVDb25maWcpOiBUZXh0dXJlIHtcbiAgY29uc3QgW3dpZHRoLCBoZWlnaHRdID1cbiAgICAgIHRleF91dGlsLmdldFBhY2tlZE1hdHJpeFRleHR1cmVTaGFwZVdpZHRoSGVpZ2h0KHJvd3MsIGNvbHVtbnMpO1xuICByZXR1cm4gY3JlYXRlQW5kQ29uZmlndXJlVGV4dHVyZShcbiAgICAgIGdsLCB3aWR0aCwgaGVpZ2h0LCBnZXRJbnRlcm5hbEZvcm1hdEZvclBhY2tlZE1hdHJpeFRleHR1cmUodGV4dHVyZUNvbmZpZyksXG4gICAgICBnbC5SR0JBLCBnbC5GTE9BVCk7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBnZXRJbnRlcm5hbEZvcm1hdEZvckZsb2F0MTZQYWNrZWRNYXRyaXhUZXh0dXJlKFxuICAgIHRleHR1cmVDb25maWc6IFRleHR1cmVDb25maWcpIHtcbiAgcmV0dXJuIHRleHR1cmVDb25maWcuaW50ZXJuYWxGb3JtYXRQYWNrZWRIYWxmRmxvYXQ7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBjcmVhdGVGbG9hdDE2UGFja2VkTWF0cml4VGV4dHVyZShcbiAgICBnbDogV2ViR0xSZW5kZXJpbmdDb250ZXh0LCByb3dzOiBudW1iZXIsIGNvbHVtbnM6IG51bWJlcixcbiAgICB0ZXh0dXJlQ29uZmlnOiBUZXh0dXJlQ29uZmlnKTogVGV4dHVyZSB7XG4gIGNvbnN0IFt3aWR0aCwgaGVpZ2h0XSA9XG4gICAgICB0ZXhfdXRpbC5nZXRQYWNrZWRNYXRyaXhUZXh0dXJlU2hhcGVXaWR0aEhlaWdodChyb3dzLCBjb2x1bW5zKTtcbiAgcmV0dXJuIGNyZWF0ZUFuZENvbmZpZ3VyZVRleHR1cmUoXG4gICAgICBnbCwgd2lkdGgsIGhlaWdodCxcbiAgICAgIGdldEludGVybmFsRm9ybWF0Rm9yRmxvYXQxNlBhY2tlZE1hdHJpeFRleHR1cmUodGV4dHVyZUNvbmZpZyksIGdsLlJHQkEsXG4gICAgICB0ZXh0dXJlQ29uZmlnLnRleHR1cmVUeXBlSGFsZkZsb2F0KTtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGJpbmRWZXJ0ZXhQcm9ncmFtQXR0cmlidXRlU3RyZWFtcyhcbiAgICBnbDogV2ViR0xSZW5kZXJpbmdDb250ZXh0LCBwcm9ncmFtOiBXZWJHTFByb2dyYW0sXG4gICAgdmVydGV4QnVmZmVyOiBXZWJHTEJ1ZmZlcik6IGJvb2xlYW4ge1xuICBjb25zdCBwb3NPZmZzZXQgPSAwOyAgICAgICAgICAgICAgIC8vIHggaXMgdGhlIGZpcnN0IGJ1ZmZlciBlbGVtZW50XG4gIGNvbnN0IHV2T2Zmc2V0ID0gMyAqIDQ7ICAgICAgICAgICAgLy8gdXYgY29tZXMgYWZ0ZXIgW3ggeSB6XVxuICBjb25zdCBzdHJpZGUgPSAoMyAqIDQpICsgKDIgKiA0KTsgIC8vIHh5eiArIHV2LCBlYWNoIGVudHJ5IGlzIDQtYnl0ZSBmbG9hdC5cbiAgd2ViZ2xfdXRpbC5jYWxsQW5kQ2hlY2soXG4gICAgICBnbCwgKCkgPT4gZ2wuYmluZEJ1ZmZlcihnbC5BUlJBWV9CVUZGRVIsIHZlcnRleEJ1ZmZlcikpO1xuICBjb25zdCBzdWNjZXNzID0gd2ViZ2xfdXRpbC5iaW5kVmVydGV4QnVmZmVyVG9Qcm9ncmFtQXR0cmlidXRlKFxuICAgICAgZ2wsIHByb2dyYW0sICdjbGlwU3BhY2VQb3MnLCB2ZXJ0ZXhCdWZmZXIsIDMsIHN0cmlkZSwgcG9zT2Zmc2V0KTtcbiAgcmV0dXJuIHN1Y2Nlc3MgJiZcbiAgICAgIHdlYmdsX3V0aWwuYmluZFZlcnRleEJ1ZmZlclRvUHJvZ3JhbUF0dHJpYnV0ZShcbiAgICAgICAgICBnbCwgcHJvZ3JhbSwgJ3V2JywgdmVydGV4QnVmZmVyLCAyLCBzdHJpZGUsIHV2T2Zmc2V0KTtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIHVwbG9hZERlbnNlTWF0cml4VG9UZXh0dXJlKFxuICAgIGdsOiBXZWJHTFJlbmRlcmluZ0NvbnRleHQsIHRleHR1cmU6IFdlYkdMVGV4dHVyZSwgd2lkdGg6IG51bWJlcixcbiAgICBoZWlnaHQ6IG51bWJlciwgZGF0YTogVHlwZWRBcnJheSwgdGV4dHVyZUNvbmZpZzogVGV4dHVyZUNvbmZpZykge1xuICB3ZWJnbF91dGlsLmNhbGxBbmRDaGVjayhnbCwgKCkgPT4gZ2wuYmluZFRleHR1cmUoZ2wuVEVYVFVSRV8yRCwgdGV4dHVyZSkpO1xuXG4gIGxldCBkYXRhRm9yVXBsb2FkOiBUeXBlZEFycmF5LCB0ZXhlbERhdGFUeXBlOiBudW1iZXIsIGludGVybmFsRm9ybWF0OiBudW1iZXI7XG4gIGlmIChkYXRhIGluc3RhbmNlb2YgVWludDhBcnJheSkge1xuICAgIGRhdGFGb3JVcGxvYWQgPSBuZXcgVWludDhBcnJheSh3aWR0aCAqIGhlaWdodCAqIDQpO1xuICAgIHRleGVsRGF0YVR5cGUgPSBnbC5VTlNJR05FRF9CWVRFO1xuICAgIGludGVybmFsRm9ybWF0ID0gZ2wuUkdCQTtcbiAgfSBlbHNlIHtcbiAgICBkYXRhRm9yVXBsb2FkID0gbmV3IEZsb2F0MzJBcnJheSh3aWR0aCAqIGhlaWdodCAqIDQpO1xuICAgIHRleGVsRGF0YVR5cGUgPSBnbC5GTE9BVDtcbiAgICBpbnRlcm5hbEZvcm1hdCA9IHRleHR1cmVDb25maWcuaW50ZXJuYWxGb3JtYXRQYWNrZWRGbG9hdDtcbiAgfVxuXG4gIGRhdGFGb3JVcGxvYWQuc2V0KGRhdGEpO1xuICBpZiAoZW52KCkuZ2V0TnVtYmVyKCdXRUJHTF9WRVJTSU9OJykgPT09IDIpIHtcbiAgICB3ZWJnbF91dGlsLmNhbGxBbmRDaGVjayhcbiAgICAgICAgZ2wsXG4gICAgICAgICgpID0+IGdsLnRleFN1YkltYWdlMkQoXG4gICAgICAgICAgICBnbC5URVhUVVJFXzJELCAwLCAwLCAwLCB3aWR0aCwgaGVpZ2h0LCBnbC5SR0JBLCB0ZXhlbERhdGFUeXBlLFxuICAgICAgICAgICAgZGF0YUZvclVwbG9hZCkpO1xuICB9IGVsc2Uge1xuICAgIHdlYmdsX3V0aWwuY2FsbEFuZENoZWNrKFxuICAgICAgICBnbCxcbiAgICAgICAgKCkgPT4gZ2wudGV4SW1hZ2UyRChcbiAgICAgICAgICAgIGdsLlRFWFRVUkVfMkQsIDAsIGludGVybmFsRm9ybWF0LCB3aWR0aCwgaGVpZ2h0LCAwLCBnbC5SR0JBLFxuICAgICAgICAgICAgdGV4ZWxEYXRhVHlwZSwgZGF0YUZvclVwbG9hZCkpO1xuICB9XG5cbiAgd2ViZ2xfdXRpbC5jYWxsQW5kQ2hlY2soZ2wsICgpID0+IGdsLmJpbmRUZXh0dXJlKGdsLlRFWFRVUkVfMkQsIG51bGwpKTtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIHVwbG9hZFBpeGVsRGF0YVRvVGV4dHVyZShcbiAgICBnbDogV2ViR0xSZW5kZXJpbmdDb250ZXh0LCB0ZXh0dXJlOiBXZWJHTFRleHR1cmUsXG4gICAgcGl4ZWxzOiBQaXhlbERhdGF8SW1hZ2VEYXRhfEhUTUxJbWFnZUVsZW1lbnR8SFRNTENhbnZhc0VsZW1lbnR8XG4gICAgSFRNTFZpZGVvRWxlbWVudHxJbWFnZUJpdG1hcCkge1xuICB3ZWJnbF91dGlsLmNhbGxBbmRDaGVjayhnbCwgKCkgPT4gZ2wuYmluZFRleHR1cmUoZ2wuVEVYVFVSRV8yRCwgdGV4dHVyZSkpO1xuICBpZiAoKHBpeGVscyBhcyBQaXhlbERhdGEpLmRhdGEgaW5zdGFuY2VvZiBVaW50OEFycmF5KSB7XG4gICAgaWYgKGVudigpLmdldE51bWJlcignV0VCR0xfVkVSU0lPTicpID09PSAyKSB7XG4gICAgICB3ZWJnbF91dGlsLmNhbGxBbmRDaGVjayhcbiAgICAgICAgICBnbCxcbiAgICAgICAgICAoKSA9PiBnbC50ZXhTdWJJbWFnZTJEKFxuICAgICAgICAgICAgICBnbC5URVhUVVJFXzJELCAwLCAwLCAwLCBwaXhlbHMud2lkdGgsIHBpeGVscy5oZWlnaHQsIGdsLlJHQkEsXG4gICAgICAgICAgICAgIGdsLlVOU0lHTkVEX0JZVEUsIChwaXhlbHMgYXMgUGl4ZWxEYXRhKS5kYXRhKSk7XG4gICAgfSBlbHNlIHtcbiAgICAgIHdlYmdsX3V0aWwuY2FsbEFuZENoZWNrKFxuICAgICAgICAgIGdsLFxuICAgICAgICAgICgpID0+IGdsLnRleEltYWdlMkQoXG4gICAgICAgICAgICAgIGdsLlRFWFRVUkVfMkQsIDAsIGdsLlJHQkEsIHBpeGVscy53aWR0aCwgcGl4ZWxzLmhlaWdodCwgMCxcbiAgICAgICAgICAgICAgZ2wuUkdCQSwgZ2wuVU5TSUdORURfQllURSwgKHBpeGVscyBhcyBQaXhlbERhdGEpLmRhdGEpKTtcbiAgICB9XG4gIH0gZWxzZSB7XG4gICAgaWYgKGVudigpLmdldE51bWJlcignV0VCR0xfVkVSU0lPTicpID09PSAyKSB7XG4gICAgICB3ZWJnbF91dGlsLmNhbGxBbmRDaGVjayhcbiAgICAgICAgICBnbCxcbiAgICAgICAgICAoKSA9PiBnbC50ZXhTdWJJbWFnZTJEKFxuICAgICAgICAgICAgICBnbC5URVhUVVJFXzJELCAwLCAwLCAwLCBnbC5SR0JBLCBnbC5VTlNJR05FRF9CWVRFLFxuICAgICAgICAgICAgICAocGl4ZWxzIGFzIEltYWdlRGF0YSB8IEhUTUxJbWFnZUVsZW1lbnQgfCBIVE1MQ2FudmFzRWxlbWVudCB8XG4gICAgICAgICAgICAgICBIVE1MVmlkZW9FbGVtZW50IHwgSW1hZ2VCaXRtYXApKSk7XG4gICAgfSBlbHNlIHtcbiAgICAgIHdlYmdsX3V0aWwuY2FsbEFuZENoZWNrKFxuICAgICAgICAgIGdsLFxuICAgICAgICAgICgpID0+IGdsLnRleEltYWdlMkQoXG4gICAgICAgICAgICAgIGdsLlRFWFRVUkVfMkQsIDAsIGdsLlJHQkEsIGdsLlJHQkEsIGdsLlVOU0lHTkVEX0JZVEUsXG4gICAgICAgICAgICAgIHBpeGVscyBhcyBJbWFnZURhdGEgfCBIVE1MSW1hZ2VFbGVtZW50IHwgSFRNTENhbnZhc0VsZW1lbnQgfFxuICAgICAgICAgICAgICAgICAgSFRNTFZpZGVvRWxlbWVudCB8IEltYWdlQml0bWFwKSk7XG4gICAgfVxuICB9XG5cbiAgd2ViZ2xfdXRpbC5jYWxsQW5kQ2hlY2soZ2wsICgpID0+IGdsLmJpbmRUZXh0dXJlKGdsLlRFWFRVUkVfMkQsIG51bGwpKTtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGNyZWF0ZUJ1ZmZlckZyb21PdXRwdXRUZXh0dXJlKFxuICAgIGdsMjogV2ViR0wyUmVuZGVyaW5nQ29udGV4dCwgcm93czogbnVtYmVyLCBjb2x1bW5zOiBudW1iZXIsXG4gICAgdGV4dHVyZUNvbmZpZzogVGV4dHVyZUNvbmZpZyk6IFdlYkdMQnVmZmVyIHtcbiAgLy8gQ3JlYXRlIGFuZCBiaW5kIHRoZSBidWZmZXIuXG4gIGNvbnN0IGJ1ZmZlciA9IGdsMi5jcmVhdGVCdWZmZXIoKTtcbiAgd2ViZ2xfdXRpbC5jYWxsQW5kQ2hlY2soXG4gICAgICBnbDIsICgpID0+IGdsMi5iaW5kQnVmZmVyKGdsMi5QSVhFTF9QQUNLX0JVRkZFUiwgYnVmZmVyKSk7XG5cbiAgLy8gSW5pdGlhbGl6ZSB0aGUgYnVmZmVyIHRvIHRoZSBzaXplIG9mIHRoZSB0ZXh0dXJlIGluIGJ5dGVzLlxuICBjb25zdCBieXRlc1BlckZsb2F0ID0gNDtcbiAgY29uc3QgdmFsdWVzUGVyVGV4ZWwgPSA0O1xuICBjb25zdCBidWZmZXJTaXplQnl0ZXMgPSBieXRlc1BlckZsb2F0ICogdmFsdWVzUGVyVGV4ZWwgKiByb3dzICogY29sdW1ucztcblxuICB3ZWJnbF91dGlsLmNhbGxBbmRDaGVjayhcbiAgICAgIGdsMixcbiAgICAgICgpID0+IGdsMi5idWZmZXJEYXRhKFxuICAgICAgICAgIGdsMi5QSVhFTF9QQUNLX0JVRkZFUiwgYnVmZmVyU2l6ZUJ5dGVzLCBnbDIuU1RSRUFNX1JFQUQpKTtcblxuICAvLyBFbnF1ZXVlIGEgY29tbWFuZCBvbiB0aGUgR1BVIGNvbW1hbmQgcXVldWUgdG8gY29weSBvZiB0ZXh0dXJlIGludG8gdGhlXG4gIC8vIGJ1ZmZlci5cbiAgd2ViZ2xfdXRpbC5jYWxsQW5kQ2hlY2soXG4gICAgICBnbDIsICgpID0+IGdsMi5yZWFkUGl4ZWxzKDAsIDAsIGNvbHVtbnMsIHJvd3MsIGdsMi5SR0JBLCBnbDIuRkxPQVQsIDApKTtcblxuICB3ZWJnbF91dGlsLmNhbGxBbmRDaGVjayhcbiAgICAgIGdsMiwgKCkgPT4gZ2wyLmJpbmRCdWZmZXIoZ2wyLlBJWEVMX1BBQ0tfQlVGRkVSLCBudWxsKSk7XG5cbiAgcmV0dXJuIGJ1ZmZlcjtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGRvd25sb2FkRmxvYXQzMk1hdHJpeEZyb21CdWZmZXIoXG4gICAgZ2w6IFdlYkdMUmVuZGVyaW5nQ29udGV4dCwgYnVmZmVyOiBXZWJHTEJ1ZmZlcixcbiAgICBzaXplOiBudW1iZXIpOiBGbG9hdDMyQXJyYXkge1xuICBjb25zdCBnbDIgPSBnbCBhcyBXZWJHTDJSZW5kZXJpbmdDb250ZXh0O1xuXG4gIGNvbnN0IGRvd25sb2FkVGFyZ2V0ID0gbmV3IEZsb2F0MzJBcnJheShzaXplKTtcblxuICBnbDIuYmluZEJ1ZmZlcihnbDIuUElYRUxfUEFDS19CVUZGRVIsIGJ1ZmZlcik7XG4gIGdsMi5nZXRCdWZmZXJTdWJEYXRhKGdsMi5QSVhFTF9QQUNLX0JVRkZFUiwgMCwgZG93bmxvYWRUYXJnZXQpO1xuICBnbDIuYmluZEJ1ZmZlcihnbDIuUElYRUxfUEFDS19CVUZGRVIsIG51bGwpO1xuXG4gIHJldHVybiBkb3dubG9hZFRhcmdldDtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGRvd25sb2FkQnl0ZUVuY29kZWRGbG9hdE1hdHJpeEZyb21PdXRwdXRUZXh0dXJlKFxuICAgIGdsOiBXZWJHTFJlbmRlcmluZ0NvbnRleHQsIHJvd3M6IG51bWJlciwgY29sdW1uczogbnVtYmVyLFxuICAgIHRleHR1cmVDb25maWc6IFRleHR1cmVDb25maWcpIHtcbiAgY29uc3QgW3csIGhdID1cbiAgICAgIHRleF91dGlsLmdldFVucGFja2VkTWF0cml4VGV4dHVyZVNoYXBlV2lkdGhIZWlnaHQocm93cywgY29sdW1ucyk7XG5cbiAgY29uc3QgbnVtQ2hhbm5lbHMgPSA0O1xuICBjb25zdCBkb3dubG9hZFRhcmdldCA9IG5ldyBVaW50OEFycmF5KFxuICAgICAgdGV4X3V0aWwuZ2V0VW5wYWNrZWRBcnJheVNpemVGcm9tTWF0cml4U2l6ZShyb3dzICogY29sdW1ucywgbnVtQ2hhbm5lbHMpKTtcblxuICB3ZWJnbF91dGlsLmNhbGxBbmRDaGVjayhcbiAgICAgIGdsLFxuICAgICAgKCkgPT4gZ2wucmVhZFBpeGVscyhcbiAgICAgICAgICAwLCAwLCB3LCBoLCB0ZXh0dXJlQ29uZmlnLmRvd25sb2FkVGV4dHVyZUZvcm1hdCwgZ2wuVU5TSUdORURfQllURSxcbiAgICAgICAgICBkb3dubG9hZFRhcmdldCkpO1xuXG4gIC8vIEJ5IHdyYXBwaW5nIHRoZSBidWZmZXIgaW4gYSBGbG9hdDMyQXJyYXksIHdlIHVzZSBuYXRpdmUgYnJvd3NlciBJRUVFIDc1NFxuICAvLyBkZWNvZGluZyBvZiB0aGUgNCBieXRlcyB0aGF0IGJhY2sgZWFjaCAzMiBiaXQgZmxvYXQuXG4gIHJldHVybiBuZXcgRmxvYXQzMkFycmF5KGRvd25sb2FkVGFyZ2V0LmJ1ZmZlcik7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBkb3dubG9hZFBhY2tlZE1hdHJpeEZyb21CdWZmZXIoXG4gICAgZ2w6IFdlYkdMUmVuZGVyaW5nQ29udGV4dCwgYnVmZmVyOiBXZWJHTEJ1ZmZlciwgYmF0Y2g6IG51bWJlciwgcm93czogbnVtYmVyLFxuICAgIGNvbHM6IG51bWJlciwgcGh5c2ljYWxSb3dzOiBudW1iZXIsIHBoeXNpY2FsQ29sczogbnVtYmVyLFxuICAgIHRleHR1cmVDb25maWc6IFRleHR1cmVDb25maWcpOiBGbG9hdDMyQXJyYXkge1xuICBjb25zdCBnbDIgPSBnbCBhcyBXZWJHTDJSZW5kZXJpbmdDb250ZXh0O1xuXG4gIGNvbnN0IGRvd25sb2FkVGFyZ2V0ID1cbiAgICAgIG5ldyBGbG9hdDMyQXJyYXkodGV4X3V0aWwuZ2V0UGFja2VkUkdCQUFycmF5U2l6ZUZyb21NYXRyaXhTaGFwZShcbiAgICAgICAgICBwaHlzaWNhbFJvd3MsIHBoeXNpY2FsQ29scykpO1xuXG4gIGdsMi5iaW5kQnVmZmVyKGdsMi5QSVhFTF9QQUNLX0JVRkZFUiwgYnVmZmVyKTtcbiAgZ2wyLmdldEJ1ZmZlclN1YkRhdGEoZ2wyLlBJWEVMX1BBQ0tfQlVGRkVSLCAwLCBkb3dubG9hZFRhcmdldCk7XG4gIGdsMi5iaW5kQnVmZmVyKGdsMi5QSVhFTF9QQUNLX0JVRkZFUiwgbnVsbCk7XG5cbiAgcmV0dXJuIGRvd25sb2FkVGFyZ2V0O1xufVxuXG5leHBvcnQgZnVuY3Rpb24gZG93bmxvYWRNYXRyaXhGcm9tUGFja2VkT3V0cHV0VGV4dHVyZShcbiAgICBnbDogV2ViR0xSZW5kZXJpbmdDb250ZXh0LCBwaHlzaWNhbFJvd3M6IG51bWJlcixcbiAgICBwaHlzaWNhbENvbHM6IG51bWJlcik6IEZsb2F0MzJBcnJheSB7XG4gIGNvbnN0IHBhY2tlZFJHQkEgPSBuZXcgRmxvYXQzMkFycmF5KHBoeXNpY2FsUm93cyAqIHBoeXNpY2FsQ29scyAqIDQpO1xuICB3ZWJnbF91dGlsLmNhbGxBbmRDaGVjayhcbiAgICAgIGdsLFxuICAgICAgKCkgPT4gZ2wucmVhZFBpeGVscyhcbiAgICAgICAgICAwLCAwLCBwaHlzaWNhbENvbHMsIHBoeXNpY2FsUm93cywgZ2wuUkdCQSwgZ2wuRkxPQVQsIHBhY2tlZFJHQkEpKTtcblxuICByZXR1cm4gcGFja2VkUkdCQTtcbn1cbiJdfQ==","/**\n * @license\n * Copyright 2017 Google LLC. All Rights Reserved.\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n * =============================================================================\n */\nimport { env, util } from '@tensorflow/tfjs-core';\nimport { getWebGLContext, setWebGLContext } from './canvas_util';\nimport * as gpgpu_util from './gpgpu_util';\nimport * as tex_util from './tex_util';\nimport * as webgl_util from './webgl_util';\nexport class GPGPUContext {\n constructor(gl) {\n this.outputTexture = null;\n this.program = null;\n this.disposed = false;\n this.vertexAttrsAreBound = false;\n this.itemsToPoll = [];\n const glVersion = env().getNumber('WEBGL_VERSION');\n if (gl != null) {\n this.gl = gl;\n setWebGLContext(glVersion, gl);\n }\n else {\n this.gl = getWebGLContext(glVersion);\n }\n // WebGL 2.0 enables texture floats without an extension.\n let COLOR_BUFFER_FLOAT = 'WEBGL_color_buffer_float';\n const COLOR_BUFFER_HALF_FLOAT = 'EXT_color_buffer_half_float';\n this.parallelCompilationExtension =\n this.gl.getExtension('KHR_parallel_shader_compile');\n if (env().getNumber('WEBGL_VERSION') === 1) {\n const TEXTURE_FLOAT = 'OES_texture_float';\n const TEXTURE_HALF_FLOAT = 'OES_texture_half_float';\n this.textureFloatExtension =\n webgl_util.getExtensionOrThrow(this.gl, TEXTURE_FLOAT);\n if (webgl_util.hasExtension(this.gl, TEXTURE_HALF_FLOAT)) {\n this.textureHalfFloatExtension =\n webgl_util.getExtensionOrThrow(this.gl, TEXTURE_HALF_FLOAT);\n }\n else if (env().get('WEBGL_FORCE_F16_TEXTURES')) {\n throw new Error('GL context does not support half float textures, yet the ' +\n 'environment flag WEBGL_FORCE_F16_TEXTURES is set to true.');\n }\n this.colorBufferFloatExtension = this.gl.getExtension(COLOR_BUFFER_FLOAT);\n if (webgl_util.hasExtension(this.gl, COLOR_BUFFER_HALF_FLOAT)) {\n this.colorBufferHalfFloatExtension =\n webgl_util.getExtensionOrThrow(this.gl, COLOR_BUFFER_HALF_FLOAT);\n }\n else if (env().get('WEBGL_FORCE_F16_TEXTURES')) {\n throw new Error('GL context does not support color renderable half floats, yet ' +\n 'the environment flag WEBGL_FORCE_F16_TEXTURES is set to true.');\n }\n }\n else {\n COLOR_BUFFER_FLOAT = 'EXT_color_buffer_float';\n if (webgl_util.hasExtension(this.gl, COLOR_BUFFER_FLOAT)) {\n this.colorBufferFloatExtension =\n this.gl.getExtension(COLOR_BUFFER_FLOAT);\n }\n else if (webgl_util.hasExtension(this.gl, COLOR_BUFFER_HALF_FLOAT)) {\n this.colorBufferHalfFloatExtension =\n this.gl.getExtension(COLOR_BUFFER_HALF_FLOAT);\n }\n else {\n throw new Error('GL context does not support color renderable floats');\n }\n }\n this.vertexBuffer = gpgpu_util.createVertexBuffer(this.gl);\n this.indexBuffer = gpgpu_util.createIndexBuffer(this.gl);\n this.framebuffer = webgl_util.createFramebuffer(this.gl);\n this.textureConfig =\n tex_util.getTextureConfig(this.gl, this.textureHalfFloatExtension);\n }\n get debug() {\n return env().getBool('DEBUG');\n }\n dispose() {\n if (this.disposed) {\n return;\n }\n if (this.program != null) {\n console.warn('Disposing a GPGPUContext that still has a bound WebGLProgram.' +\n ' This is probably a resource leak, delete the program with ' +\n 'GPGPUContext.deleteProgram before disposing.');\n }\n if (this.outputTexture != null) {\n console.warn('Disposing a GPGPUContext that still has a bound output matrix ' +\n 'texture. This is probably a resource leak, delete the output ' +\n 'matrix texture with GPGPUContext.deleteMatrixTexture before ' +\n 'disposing.');\n }\n const gl = this.gl;\n webgl_util.callAndCheck(gl, () => gl.finish());\n webgl_util.callAndCheck(gl, () => gl.bindFramebuffer(gl.FRAMEBUFFER, null));\n webgl_util.callAndCheck(gl, () => gl.deleteFramebuffer(this.framebuffer));\n webgl_util.callAndCheck(gl, () => gl.bindBuffer(gl.ARRAY_BUFFER, null));\n webgl_util.callAndCheck(gl, () => gl.bindBuffer(gl.ELEMENT_ARRAY_BUFFER, null));\n webgl_util.callAndCheck(gl, () => gl.deleteBuffer(this.indexBuffer));\n this.disposed = true;\n }\n createFloat32MatrixTexture(rows, columns) {\n this.throwIfDisposed();\n return gpgpu_util.createFloat32MatrixTexture(this.gl, rows, columns, this.textureConfig);\n }\n createFloat16MatrixTexture(rows, columns) {\n this.throwIfDisposed();\n return gpgpu_util.createFloat16MatrixTexture(this.gl, rows, columns, this.textureConfig);\n }\n createUnsignedBytesMatrixTexture(rows, columns) {\n this.throwIfDisposed();\n return gpgpu_util.createUnsignedBytesMatrixTexture(this.gl, rows, columns, this.textureConfig);\n }\n uploadPixelDataToTexture(texture, pixels) {\n this.throwIfDisposed();\n gpgpu_util.uploadPixelDataToTexture(this.gl, texture, pixels);\n }\n uploadDenseMatrixToTexture(texture, width, height, data) {\n this.throwIfDisposed();\n gpgpu_util.uploadDenseMatrixToTexture(this.gl, texture, width, height, data, this.textureConfig);\n }\n createFloat16PackedMatrixTexture(rows, columns) {\n this.throwIfDisposed();\n return gpgpu_util.createFloat16PackedMatrixTexture(this.gl, rows, columns, this.textureConfig);\n }\n createPackedMatrixTexture(rows, columns) {\n this.throwIfDisposed();\n return gpgpu_util.createPackedMatrixTexture(this.gl, rows, columns, this.textureConfig);\n }\n deleteMatrixTexture(texture) {\n this.throwIfDisposed();\n if (this.outputTexture === texture) {\n webgl_util.unbindColorTextureFromFramebuffer(this.gl, this.framebuffer);\n this.outputTexture = null;\n }\n webgl_util.callAndCheck(this.gl, () => this.gl.deleteTexture(texture));\n }\n downloadByteEncodedFloatMatrixFromOutputTexture(texture, rows, columns) {\n return this.downloadMatrixDriver(texture, () => gpgpu_util.downloadByteEncodedFloatMatrixFromOutputTexture(this.gl, rows, columns, this.textureConfig));\n }\n downloadPackedMatrixFromBuffer(buffer, batch, rows, columns, physicalRows, physicalCols) {\n return gpgpu_util.downloadPackedMatrixFromBuffer(this.gl, buffer, batch, rows, columns, physicalRows, physicalCols, this.textureConfig);\n }\n downloadFloat32MatrixFromBuffer(buffer, size) {\n return gpgpu_util.downloadFloat32MatrixFromBuffer(this.gl, buffer, size);\n }\n createBufferFromTexture(texture, rows, columns) {\n this.bindTextureToFrameBuffer(texture);\n const result = gpgpu_util.createBufferFromOutputTexture(this.gl, rows, columns, this.textureConfig);\n this.unbindTextureToFrameBuffer();\n return result;\n }\n createAndWaitForFence() {\n const fenceContext = this.createFence(this.gl);\n return this.pollFence(fenceContext);\n }\n createFence(gl) {\n let query;\n let isFencePassed;\n if (env().getBool('WEBGL_FENCE_API_ENABLED')) {\n const gl2 = gl;\n const sync = gl2.fenceSync(gl2.SYNC_GPU_COMMANDS_COMPLETE, 0);\n gl.flush();\n isFencePassed = () => {\n const status = gl2.clientWaitSync(sync, 0, 0);\n return status === gl2.ALREADY_SIGNALED ||\n status === gl2.CONDITION_SATISFIED;\n };\n query = sync;\n }\n else if (env().getNumber('WEBGL_DISJOINT_QUERY_TIMER_EXTENSION_VERSION') > 0) {\n query = this.beginQuery();\n this.endQuery();\n isFencePassed = () => this.isQueryAvailable(query, env().getNumber('WEBGL_DISJOINT_QUERY_TIMER_EXTENSION_VERSION'));\n }\n else {\n // If we have no way to fence, return true immediately. This will fire in\n // WebGL 1.0 when there is no disjoint query timer. In this case, because\n // the fence passes immediately, we'll immediately ask for a download of\n // the texture, which will cause the UI thread to hang.\n isFencePassed = () => true;\n }\n return { query, isFencePassed };\n }\n downloadMatrixFromPackedTexture(texture, physicalRows, physicalCols) {\n return this.downloadMatrixDriver(texture, () => gpgpu_util.downloadMatrixFromPackedOutputTexture(this.gl, physicalRows, physicalCols));\n }\n createProgram(fragmentShader) {\n this.throwIfDisposed();\n const gl = this.gl;\n if (this.vertexShader == null) {\n this.vertexShader = gpgpu_util.createVertexShader(gl);\n }\n const program = webgl_util.createProgram(gl);\n webgl_util.callAndCheck(gl, () => gl.attachShader(program, this.vertexShader));\n webgl_util.callAndCheck(gl, () => gl.attachShader(program, fragmentShader));\n webgl_util.linkProgram(gl, program);\n if (this.debug) {\n webgl_util.validateProgram(gl, program);\n }\n if (!this.vertexAttrsAreBound) {\n this.setProgram(program);\n this.vertexAttrsAreBound = gpgpu_util.bindVertexProgramAttributeStreams(gl, this.program, this.vertexBuffer);\n }\n return program;\n }\n deleteProgram(program) {\n this.throwIfDisposed();\n if (program === this.program) {\n this.program = null;\n }\n if (program != null) {\n webgl_util.callAndCheck(this.gl, () => this.gl.deleteProgram(program));\n }\n }\n setProgram(program) {\n this.throwIfDisposed();\n this.program = program;\n if ((this.program != null) && this.debug) {\n webgl_util.validateProgram(this.gl, this.program);\n }\n webgl_util.callAndCheck(this.gl, () => this.gl.useProgram(program));\n }\n getUniformLocation(program, uniformName, shouldThrow = true) {\n this.throwIfDisposed();\n if (shouldThrow) {\n return webgl_util.getProgramUniformLocationOrThrow(this.gl, program, uniformName);\n }\n else {\n return webgl_util.getProgramUniformLocation(this.gl, program, uniformName);\n }\n }\n getAttributeLocation(program, attribute) {\n this.throwIfDisposed();\n return webgl_util.callAndCheck(this.gl, () => this.gl.getAttribLocation(program, attribute));\n }\n getUniformLocationNoThrow(program, uniformName) {\n this.throwIfDisposed();\n return this.gl.getUniformLocation(program, uniformName);\n }\n setInputMatrixTexture(inputMatrixTexture, uniformLocation, textureUnit) {\n this.throwIfDisposed();\n this.throwIfNoProgram();\n webgl_util.bindTextureToProgramUniformSampler(this.gl, inputMatrixTexture, uniformLocation, textureUnit);\n }\n setOutputMatrixTexture(outputMatrixTexture, rows, columns) {\n this.setOutputMatrixTextureDriver(outputMatrixTexture, columns, rows);\n }\n setOutputPackedMatrixTexture(outputPackedMatrixTexture, rows, columns) {\n this.throwIfDisposed();\n const [width, height] = tex_util.getPackedMatrixTextureShapeWidthHeight(rows, columns);\n this.setOutputMatrixTextureDriver(outputPackedMatrixTexture, width, height);\n }\n setOutputMatrixWriteRegion(startRow, numRows, startColumn, numColumns) {\n this.setOutputMatrixWriteRegionDriver(startColumn, startRow, numColumns, numRows);\n }\n setOutputPackedMatrixWriteRegion(startRow, numRows, startColumn, numColumns) {\n throw new Error('setOutputPackedMatrixWriteRegion not implemented.');\n }\n debugValidate() {\n if (this.program != null) {\n webgl_util.validateProgram(this.gl, this.program);\n }\n webgl_util.validateFramebuffer(this.gl);\n }\n executeProgram() {\n this.throwIfDisposed();\n this.throwIfNoProgram();\n const gl = this.gl;\n if (this.debug) {\n this.debugValidate();\n }\n webgl_util.callAndCheck(gl, () => gl.drawElements(gl.TRIANGLES, 6, gl.UNSIGNED_SHORT, 0));\n }\n blockUntilAllProgramsCompleted() {\n this.throwIfDisposed();\n webgl_util.callAndCheck(this.gl, () => this.gl.finish());\n }\n getQueryTimerExtension() {\n if (this.disjointQueryTimerExtension == null) {\n this.disjointQueryTimerExtension =\n webgl_util.getExtensionOrThrow(this.gl, env().getNumber('WEBGL_DISJOINT_QUERY_TIMER_EXTENSION_VERSION') === 2 ?\n 'EXT_disjoint_timer_query_webgl2' :\n 'EXT_disjoint_timer_query');\n }\n return this.disjointQueryTimerExtension;\n }\n getQueryTimerExtensionWebGL2() {\n return this.getQueryTimerExtension();\n }\n getQueryTimerExtensionWebGL1() {\n return this.getQueryTimerExtension();\n }\n beginQuery() {\n if (env().getNumber('WEBGL_DISJOINT_QUERY_TIMER_EXTENSION_VERSION') === 2) {\n const gl2 = this.gl;\n const ext = this.getQueryTimerExtensionWebGL2();\n const query = gl2.createQuery();\n gl2.beginQuery(ext.TIME_ELAPSED_EXT, query);\n return query;\n }\n const ext = this.getQueryTimerExtensionWebGL1();\n const query = ext.createQueryEXT();\n ext.beginQueryEXT(ext.TIME_ELAPSED_EXT, query);\n return query;\n }\n endQuery() {\n if (env().getNumber('WEBGL_DISJOINT_QUERY_TIMER_EXTENSION_VERSION') === 2) {\n const gl2 = this.gl;\n const ext = this.getQueryTimerExtensionWebGL2();\n gl2.endQuery(ext.TIME_ELAPSED_EXT);\n return;\n }\n const ext = this.getQueryTimerExtensionWebGL1();\n ext.endQueryEXT(ext.TIME_ELAPSED_EXT);\n }\n async waitForQueryAndGetTime(query) {\n await util.repeatedTry(() => this.disposed || // while testing contexts are created / disposed\n // in rapid succession, so without this check we\n // may poll for the query timer indefinitely\n this.isQueryAvailable(query, env().getNumber('WEBGL_DISJOINT_QUERY_TIMER_EXTENSION_VERSION')));\n return this.getQueryTime(query, env().getNumber('WEBGL_DISJOINT_QUERY_TIMER_EXTENSION_VERSION'));\n }\n getQueryTime(query, queryTimerVersion) {\n if (queryTimerVersion === 0) {\n return null;\n }\n if (queryTimerVersion === 2) {\n const gl2 = this.gl;\n const timeElapsedNanos = gl2.getQueryParameter(query, gl2.QUERY_RESULT);\n // Return milliseconds.\n return timeElapsedNanos / 1000000;\n }\n else {\n const ext = this.getQueryTimerExtensionWebGL1();\n const timeElapsedNanos = ext.getQueryObjectEXT(query, ext.QUERY_RESULT_EXT);\n // Return milliseconds.\n return timeElapsedNanos / 1000000;\n }\n }\n isQueryAvailable(query, queryTimerVersion) {\n if (queryTimerVersion === 0) {\n return true;\n }\n if (queryTimerVersion === 2) {\n const gl2 = this.gl;\n const ext = this.getQueryTimerExtensionWebGL2();\n const available = gl2.getQueryParameter(query, gl2.QUERY_RESULT_AVAILABLE);\n if (this.disjoint == null) {\n this.disjoint = this.gl.getParameter(ext.GPU_DISJOINT_EXT);\n }\n return available && !this.disjoint;\n }\n else {\n const ext = this.getQueryTimerExtensionWebGL1();\n const available = ext.getQueryObjectEXT(query, ext.QUERY_RESULT_AVAILABLE_EXT);\n if (this.disjoint == null) {\n this.disjoint = this.gl.getParameter(ext.GPU_DISJOINT_EXT);\n }\n return available && !this.disjoint;\n }\n }\n pollFence(fenceContext) {\n return new Promise(resolve => {\n this.addItemToPoll(() => fenceContext.isFencePassed(), () => resolve());\n });\n }\n pollItems() {\n // Find the last query that has finished.\n const index = linearSearchLastTrue(this.itemsToPoll.map(x => x.isDoneFn));\n for (let i = 0; i <= index; ++i) {\n const { resolveFn } = this.itemsToPoll[i];\n resolveFn();\n }\n this.itemsToPoll = this.itemsToPoll.slice(index + 1);\n }\n addItemToPoll(isDoneFn, resolveFn) {\n this.itemsToPoll.push({ isDoneFn, resolveFn });\n if (this.itemsToPoll.length > 1) {\n // We already have a running loop that polls.\n return;\n }\n // Start a new loop that polls.\n let scheduleFn = undefined;\n if ('setTimeoutCustom' in env().platform) {\n scheduleFn = env().platform.setTimeoutCustom.bind(env().platform);\n }\n util.repeatedTry(() => {\n this.pollItems();\n // End the loop if no more items to poll.\n return this.itemsToPoll.length === 0;\n }, () => 0, null, scheduleFn);\n }\n bindTextureToFrameBuffer(texture) {\n this.throwIfDisposed();\n webgl_util.bindColorTextureToFramebuffer(this.gl, texture, this.framebuffer);\n if (this.debug) {\n webgl_util.validateFramebuffer(this.gl);\n }\n }\n unbindTextureToFrameBuffer() {\n if (this.outputTexture != null) {\n webgl_util.bindColorTextureToFramebuffer(this.gl, this.outputTexture, this.framebuffer);\n if (this.debug) {\n webgl_util.validateFramebuffer(this.gl);\n }\n }\n else {\n webgl_util.unbindColorTextureFromFramebuffer(this.gl, this.framebuffer);\n }\n }\n downloadMatrixDriver(texture, downloadAndDecode) {\n this.bindTextureToFrameBuffer(texture);\n const result = downloadAndDecode();\n this.unbindTextureToFrameBuffer();\n return result;\n }\n setOutputMatrixTextureDriver(outputMatrixTextureMaybePacked, width, height) {\n this.throwIfDisposed();\n const gl = this.gl;\n webgl_util.bindColorTextureToFramebuffer(gl, outputMatrixTextureMaybePacked, this.framebuffer);\n if (this.debug) {\n webgl_util.validateFramebuffer(gl);\n }\n this.outputTexture = outputMatrixTextureMaybePacked;\n webgl_util.callAndCheck(gl, () => gl.viewport(0, 0, width, height));\n webgl_util.callAndCheck(gl, () => gl.scissor(0, 0, width, height));\n }\n setOutputMatrixWriteRegionDriver(x, y, width, height) {\n this.throwIfDisposed();\n webgl_util.callAndCheck(this.gl, () => this.gl.scissor(x, y, width, height));\n }\n throwIfDisposed() {\n if (this.disposed) {\n throw new Error('Attempted to use disposed GPGPUContext.');\n }\n }\n throwIfNoProgram() {\n if (this.program == null) {\n throw new Error('No GPU program is currently set.');\n }\n }\n}\n/**\n * Finds the index of the last true element using linear search.\n * Note: We can't do binary search because Chrome expects us to explicitly\n * test all fences before download:\n * https://github.com/tensorflow/tfjs/issues/1145\n */\nexport function linearSearchLastTrue(arr) {\n let i = 0;\n for (; i < arr.length; ++i) {\n const isDone = arr[i]();\n if (!isDone) {\n break;\n }\n }\n return i - 1;\n}\n//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZ3BncHVfY29udGV4dC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uL3RmanMtYmFja2VuZC13ZWJnbC9zcmMvZ3BncHVfY29udGV4dC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQTs7Ozs7Ozs7Ozs7Ozs7O0dBZUc7QUFFSCxPQUFPLEVBQUMsR0FBRyxFQUF5QixJQUFJLEVBQUMsTUFBTSx1QkFBdUIsQ0FBQztBQUV2RSxPQUFPLEVBQUMsZUFBZSxFQUFFLGVBQWUsRUFBQyxNQUFNLGVBQWUsQ0FBQztBQUMvRCxPQUFPLEtBQUssVUFBVSxNQUFNLGNBQWMsQ0FBQztBQUMzQyxPQUFPLEtBQUssUUFBUSxNQUFNLFlBQVksQ0FBQztBQUd2QyxPQUFPLEtBQUssVUFBVSxNQUFNLGNBQWMsQ0FBQztBQU8zQyxNQUFNLE9BQU8sWUFBWTtJQW1CdkIsWUFBWSxFQUEwQjtRQVB0QyxrQkFBYSxHQUFzQixJQUFJLENBQUM7UUFDeEMsWUFBTyxHQUFzQixJQUFJLENBQUM7UUFDMUIsYUFBUSxHQUFHLEtBQUssQ0FBQztRQXNPakIsd0JBQW1CLEdBQUcsS0FBSyxDQUFDO1FBdVA1QixnQkFBVyxHQUFlLEVBQUUsQ0FBQztRQXZkbkMsTUFBTSxTQUFTLEdBQUcsR0FBRyxFQUFFLENBQUMsU0FBUyxDQUFDLGVBQWUsQ0FBQyxDQUFDO1FBQ25ELElBQUksRUFBRSxJQUFJLElBQUksRUFBRTtZQUNkLElBQUksQ0FBQyxFQUFFLEdBQUcsRUFBRSxDQUFDO1lBQ2IsZUFBZSxDQUFDLFNBQVMsRUFBRSxFQUFFLENBQUMsQ0FBQztTQUNoQzthQUFNO1lBQ0wsSUFBSSxDQUFDLEVBQUUsR0FBRyxlQUFlLENBQUMsU0FBUyxDQUFDLENBQUM7U0FDdEM7UUFDRCx5REFBeUQ7UUFDekQsSUFBSSxrQkFBa0IsR0FBRywwQkFBMEIsQ0FBQztRQUNwRCxNQUFNLHVCQUF1QixHQUFHLDZCQUE2QixDQUFDO1FBQzlELElBQUksQ0FBQyw0QkFBNEI7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QUFFLEtBQWEsRUFBRSxNQUFjO1FBQ3JELElBQUksQ0FBQyxlQUFlLEVBQUUsQ0FBQztRQUN2QixVQUFVLENBQUMsWUFBWSxDQUNuQixJQUFJLENBQUMsRUFBRSxFQUFFLEdBQUcsRUFBRSxDQUFDLElBQUksQ0FBQyxFQUFFLENBQUMsT0FBTyxDQUFDLENBQUMsRUFBRSxDQUFDLEVBQUUsS0FBSyxFQUFFLE1BQU0sQ0FBQyxDQUFDLENBQUM7SUFDM0QsQ0FBQztJQUVPLGVBQWU7UUFDckIsSUFBSSxJQUFJLENBQUMsUUFBUSxFQUFFO1lBQ2pCLE1BQU0sSUFBSSxLQUFLLENBQUMseUNBQXlDLENBQUMsQ0FBQztTQUM1RDtJQUNILENBQUM7SUFFTyxnQkFBZ0I7UUFDdEIsSUFBSSxJQUFJLENBQUMsT0FBTyxJQUFJLElBQUksRUFBRTtZQUN4QixNQUFNLElBQUksS0FBSyxDQUFDLGtDQUFrQyxDQUFDLENBQUM7U0FDckQ7SUFDSCxDQUFDO0NBQ0Y7QUFPRDs7Ozs7R0FLRztBQUNILE1BQU0sVUFBVSxvQkFBb0IsQ0FBQyxHQUF5QjtJQUM1RCxJQUFJLENBQUMsR0FBRyxDQUFDLENBQUM7SUFDVixPQUFPLENBQUMsR0FBRyxHQUFHLENBQUMsTUFBTSxFQUFFLEVBQUUsQ0FBQyxFQUFFO1FBQzFCLE1BQU0sTUFBTSxHQUFHLEdBQUcsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDO1FBQ3hCLElBQUksQ0FBQyxNQUFNLEVBQUU7WUFDWCxNQUFNO1NBQ1A7S0FDRjtJQUNELE9BQU8sQ0FBQyxHQUFHLENBQUMsQ0FBQztBQUNmLENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyIvKipcbiAqIEBsaWNlbnNlXG4gKiBDb3B5cmlnaHQgMjAxNyBHb29nbGUgTExDLiBBbGwgUmlnaHRzIFJlc2VydmVkLlxuICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlIFwiTGljZW5zZVwiKTtcbiAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS5cbiAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdFxuICpcbiAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMFxuICpcbiAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmVcbiAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuIFwiQVMgSVNcIiBCQVNJUyxcbiAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLlxuICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZFxuICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuXG4gKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuICovXG5cbmltcG9ydCB7ZW52LCBQaXhlbERhdGEsIFR5cGVkQXJyYXksIHV0aWx9IGZyb20gJ0B0ZW5zb3JmbG93L3RmanMtY29yZSc7XG5cbmltcG9ydCB7Z2V0V2ViR0xDb250ZXh0LCBzZXRXZWJHTENvbnRleHR9IGZyb20gJy4vY2FudmFzX3V0aWwnO1xuaW1wb3J0ICogYXMgZ3BncHVfdXRpbCBmcm9tICcuL2dwZ3B1X3V0aWwnO1xuaW1wb3J0ICogYXMgdGV4X3V0aWwgZnJvbSAnLi90ZXhfdXRpbCc7XG5pbXBvcnQge1RleHR1cmUsIFRleHR1cmVDb25maWd9IGZyb20gJy4vdGV4X3V0aWwnO1xuaW1wb3J0IHtXZWJHTDFEaXNqb2ludFF1ZXJ5VGltZXJFeHRlbnNpb24sIFdlYkdMMkRpc2pvaW50UXVlcnlUaW1lckV4dGVuc2lvbiwgV2ViR0xQYXJhbGxlbENvbXBpbGF0aW9uRXh0ZW5zaW9ufSBmcm9tICcuL3dlYmdsX3R5cGVzJztcbmltcG9ydCAqIGFzIHdlYmdsX3V0aWwgZnJvbSAnLi93ZWJnbF91dGlsJztcblxuZXhwb3J0IGludGVyZmFjZSBGZW5jZUNvbnRleHQge1xuICBxdWVyeTogV2ViR0xRdWVyeXxXZWJHTFN5bmM7XG4gIGlzRmVuY2VQYXNzZWQoKTogYm9vbGVhbjtcbn1cblxuZXhwb3J0IGNsYXNzIEdQR1BVQ29udGV4dCB7XG4gIGdsOiBXZWJHTFJlbmRlcmluZ0NvbnRleHQ7XG4gIHRleHR1cmVGbG9hdEV4dGVuc2lvbjoge307XG4gIHRleHR1cmVIYWxmRmxvYXRFeHRlbnNpb246IHt9O1xuICBjb2xvckJ1ZmZlckZsb2F0RXh0ZW5zaW9uOiB7fTtcbiAgY29sb3JCdWZmZXJIYWxmRmxvYXRFeHRlbnNpb246IHt9O1xuICBkaXNqb2ludFF1ZXJ5VGltZXJFeHRlbnNpb246IFdlYkdMMkRpc2pvaW50UXVlcnlUaW1lckV4dGVuc2lvbnxcbiAgICAgIFdlYkdMMURpc2pvaW50UXVlcnlUaW1lckV4dGVuc2lvbjtcbiAgcGFyYWxsZWxDb21waWxhdGlvbkV4dGVuc2lvbjogV2ViR0xQYXJhbGxlbENvbXBpbGF0aW9uRXh0ZW5zaW9uO1xuICB2ZXJ0ZXhCdWZmZXI6IFdlYkdMQnVmZmVyO1xuICBpbmRleEJ1ZmZlcjogV2ViR0xCdWZmZXI7XG4gIGZyYW1lYnVmZmVyOiBXZWJHTEZyYW1lYnVmZmVyO1xuICBvdXRwdXRUZXh0dXJlOiBXZWJHTFRleHR1cmV8bnVsbCA9IG51bGw7XG4gIHByb2dyYW06IFdlYkdMUHJvZ3JhbXxudWxsID0gbnVsbDtcbiAgcHJpdmF0ZSBkaXNwb3NlZCA9IGZhbHNlO1xuICBwcml2YXRlIGRpc2pvaW50OiBib29sZWFuO1xuICBwcml2YXRlIHZlcnRleFNoYWRlcjogV2ViR0xTaGFkZXI7XG4gIHRleHR1cmVDb25maWc6IFRleHR1cmVDb25maWc7XG5cbiAgY29uc3RydWN0b3IoZ2w/OiBXZWJHTFJlbmRlcmluZ0NvbnRleHQpIHtcbiAgICBjb25zdCBnbFZlcnNpb24gPSBlbnYoKS5nZXROdW1iZXIoJ1dFQkdMX1ZFUlNJT04nKTtcbiAgICBpZiAoZ2wgIT0gbnVsbCkge1xuICAgICAgdGhpcy5nbCA9IGdsO1xuICAgICAgc2V0V2ViR0xDb250ZXh0KGdsVmVyc2lvbiwgZ2wpO1xuICAgIH0gZWxzZSB7XG4gICAgICB0aGlzLmdsID0gZ2V0V2ViR0xDb250ZXh0KGdsVmVyc2lvbik7XG4gICAgfVxuICAgIC8vIFdlYkdMIDIuMCBlbmFibGVzIHRleHR1cmUgZmxvYXRzIHdpdGhvdXQgYW4gZXh0ZW5zaW9uLlxuICAgIGxldCBDT0xPUl9CVUZGRVJfRkxPQVQgPSAnV0VCR0xfY29sb3JfYnVmZmVyX2Zsb2F0JztcbiAgICBjb25zdCBDT0xPUl9CVUZGRVJfSEFMRl9GTE9BVCA9ICdFWFRfY29sb3JfYnVmZmVyX2hhbGZfZmxvYXQnO1xuICAgIHRoaXMucGFyYWxsZWxDb21waWxhdGlvbkV4dGVuc2lvbiA9XG4gICAgICAgIHRoaXMuZ2wuZ2V0RXh0ZW5zaW9uKCdLSFJfcGFyYWxsZWxfc2hhZGVyX2NvbXBpbGUnKTtcbiAgICBpZiAoZW52KCkuZ2V0TnVtYmVyKCdXRUJHTF9WRVJTSU9OJykgPT09IDEpIHtcbiAgICAgIGNvbnN0IFRFWFRVUkVfRkxPQVQgPSAnT0VTX3RleHR1cmVfZmxvYXQnO1xuICAgICAgY29uc3QgVEVYVFVSRV9IQUxGX0ZMT0FUID0gJ09FU190ZXh0dXJlX2hhbGZfZmxvYXQnO1xuXG4gICAgICB0aGlzLnRleHR1cmVGbG9hdEV4dGVuc2lvbiA9XG4gICAgICAgICAgd2ViZ2xfdXRpbC5nZXRFeHRlbnNpb25PclRocm93KHRoaXMuZ2wsIFRFWFRVUkVfRkxPQVQpO1xuICAgICAgaWYgKHdlYmdsX3V0aWwuaGFzRXh0ZW5zaW9uKHRoaXMuZ2wsIFRFWFRVUkVfSEFMRl9GTE9BVCkpIHtcbiAgICAgICAgdGhpcy50ZXh0dXJlSGFsZkZsb2F0RXh0ZW5zaW9uID1cbiAgICAgICAgICAgIHdlYmdsX3V0aWwuZ2V0RXh0ZW5zaW9uT3JUaHJvdyh0aGlzLmdsLCBURVhUVVJFX0hBTEZfRkxPQVQpO1xuICAgICAgfSBlbHNlIGlmIChlbnYoKS5nZXQoJ1dFQkdMX0ZPUkNFX0YxNl9URVhUVVJFUycpKSB7XG4gICAgICAgIHRocm93IG5ldyBFcnJvcihcbiAgICAgICAgICAgICdHTCBjb250ZXh0IGRvZXMgbm90IHN1cHBvcnQgaGFsZiBmbG9hdCB0ZXh0dXJlcywgeWV0IHRoZSAnICtcbiAgICAgICAgICAgICdlbnZpcm9ubWVudCBmbGFnIFdFQkdMX0ZPUkNFX0YxNl9URVhUVVJFUyBpcyBzZXQgdG8gdHJ1ZS4nKTtcbiAgICAgIH1cblxuICAgICAgdGhpcy5jb2xvckJ1ZmZlckZsb2F0RXh0ZW5zaW9uID0gdGhpcy5nbC5nZXRFeHRlbnNpb24oQ09MT1JfQlVGRkVSX0ZMT0FUKTtcbiAgICAgIGlmICh3ZWJnbF91dGlsLmhhc0V4dGVuc2lvbih0aGlzLmdsLCBDT0xPUl9CVUZGRVJfSEFMRl9GTE9BVCkpIHtcbiAgICAgICAgdGhpcy5jb2xvckJ1ZmZlckhhbGZGbG9hdEV4dGVuc2lvbiA9XG4gICAgICAgICAgICB3ZWJnbF91dGlsLmdldEV4dGVuc2lvbk9yVGhyb3codGhpcy5nbCwgQ09MT1JfQlVGRkVSX0hBTEZfRkxPQVQpO1xuICAgICAgfSBlbHNlIGlmIChlbnYoKS5nZXQoJ1dFQkdMX0ZPUkNFX0YxNl9URVhUVVJFUycpKSB7XG4gICAgICAgIHRocm93IG5ldyBFcnJvcihcbiAgICAgICAgICAgICdHTCBjb250ZXh0IGRvZXMgbm90IHN1cHBvcnQgY29sb3IgcmVuZGVyYWJsZSBoYWxmIGZsb2F0cywgeWV0ICcgK1xuICAgICAgICAgICAgJ3RoZSBlbnZpcm9ubWVudCBmbGFnIFdFQkdMX0ZPUkNFX0YxNl9URVhUVVJFUyBpcyBzZXQgdG8gdHJ1ZS4nKTtcbiAgICAgIH1cbiAgICB9IGVsc2Uge1xuICAgICAgQ09MT1JfQlVGRkVSX0ZMT0FUID0gJ0VYVF9jb2xvcl9idWZmZXJfZmxvYXQnO1xuICAgICAgaWYgKHdlYmdsX3V0aWwuaGFzRXh0ZW5zaW9uKHRoaXMuZ2wsIENPTE9SX0JVRkZFUl9GTE9BVCkpIHtcbiAgICAgICAgdGhpcy5jb2xvckJ1ZmZlckZsb2F0RXh0ZW5zaW9uID1cbiAgICAgICAgICAgIHRoaXMuZ2wuZ2V0RXh0ZW5zaW9uKENPTE9SX0JVRkZFUl9GTE9BVCk7XG4gICAgICB9IGVsc2UgaWYgKHdlYmdsX3V0aWwuaGFzRXh0ZW5zaW9uKHRoaXMuZ2wsIENPTE9SX0JVRkZFUl9IQUxGX0ZMT0FUKSkge1xuICAgICAgICB0aGlzLmNvbG9yQnVmZmVySGFsZkZsb2F0RXh0ZW5zaW9uID1cbiAgICAgICAgICAgIHRoaXMuZ2wuZ2V0RXh0ZW5zaW9uKENPTE9SX0JVRkZFUl9IQUxGX0ZMT0FUKTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHRocm93IG5ldyBFcnJvcignR0wgY29udGV4dCBkb2VzIG5vdCBzdXBwb3J0IGNvbG9yIHJlbmRlcmFibGUgZmxvYXRzJyk7XG4gICAgICB9XG4gICAgfVxuXG4gICAgdGhpcy52ZXJ0ZXhCdWZmZXIgPSBncGdwdV91dGlsLmNyZWF0ZVZlcnRleEJ1ZmZlcih0aGlzLmdsKTtcbiAgICB0aGlzLmluZGV4QnVmZmVyID0gZ3BncHVfdXRpbC5jcmVhdGVJbmRleEJ1ZmZlcih0aGlzLmdsKTtcbiAgICB0aGlzLmZyYW1lYnVmZmVyID0gd2ViZ2xfdXRpbC5jcmVhdGVGcmFtZWJ1ZmZlcih0aGlzLmdsKTtcblxuICAgIHRoaXMudGV4dHVyZUNvbmZpZyA9XG4gICAgICAgIHRleF91dGlsLmdldFRleHR1cmVDb25maWcodGhpcy5nbCwgdGhpcy50ZXh0dXJlSGFsZkZsb2F0RXh0ZW5zaW9uKTtcbiAgfVxuXG4gIHByaXZhdGUgZ2V0IGRlYnVnKCk6IGJvb2xlYW4ge1xuICAgIHJldHVybiBlbnYoKS5nZXRCb29sKCdERUJVRycpO1xuICB9XG5cbiAgcHVibGljIGRpc3Bvc2UoKSB7XG4gICAgaWYgKHRoaXMuZGlzcG9zZWQpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgaWYgKHRoaXMucHJvZ3JhbSAhPSBudWxsKSB7XG4gICAgICBjb25zb2xlLndhcm4oXG4gICAgICAgICAgJ0Rpc3Bvc2luZyBhIEdQR1BVQ29udGV4dCB0aGF0IHN0aWxsIGhhcyBhIGJvdW5kIFdlYkdMUHJvZ3JhbS4nICtcbiAgICAgICAgICAnIFRoaXMgaXMgcHJvYmFibHkgYSByZXNvdXJjZSBsZWFrLCBkZWxldGUgdGhlIHByb2dyYW0gd2l0aCAnICtcbiAgICAgICAgICAnR1BHUFVDb250ZXh0LmRlbGV0ZVByb2dyYW0gYmVmb3JlIGRpc3Bvc2luZy4nKTtcbiAgICB9XG4gICAgaWYgKHRoaXMub3V0cHV0VGV4dHVyZSAhPSBudWxsKSB7XG4gICAgICBjb25zb2xlLndhcm4oXG4gICAgICAgICAgJ0Rpc3Bvc2luZyBhIEdQR1BVQ29udGV4dCB0aGF0IHN0aWxsIGhhcyBhIGJvdW5kIG91dHB1dCBtYXRyaXggJyArXG4gICAgICAgICAgJ3RleHR1cmUuICBUaGlzIGlzIHByb2JhYmx5IGEgcmVzb3VyY2UgbGVhaywgZGVsZXRlIHRoZSBvdXRwdXQgJyArXG4gICAgICAgICAgJ21hdHJpeCB0ZXh0dXJlIHdpdGggR1BHUFVDb250ZXh0LmRlbGV0ZU1hdHJpeFRleHR1cmUgYmVmb3JlICcgK1xuICAgICAgICAgICdkaXNwb3NpbmcuJyk7XG4gICAgfVxuICAgIGNvbnN0IGdsID0gdGhpcy5nbDtcbiAgICB3ZWJnbF91dGlsLmNhbGxBbmRDaGVjayhnbCwgKCkgPT4gZ2wuZmluaXNoKCkpO1xuICAgIHdlYmdsX3V0aWwuY2FsbEFuZENoZWNrKGdsLCAoKSA9PiBnbC5iaW5kRnJhbWVidWZmZXIoZ2wuRlJBTUVCVUZGRVIsIG51bGwpKTtcbiAgICB3ZWJnbF91dGlsLmNhbGxBbmRDaGVjayhnbCwgKCkgPT4gZ2wuZGVsZXRlRnJhbWVidWZmZXIodGhpcy5mcmFtZWJ1ZmZlcikpO1xuICAgIHdlYmdsX3V0aWwuY2FsbEFuZENoZWNrKGdsLCAoKSA9PiBnbC5iaW5kQnVmZmVyKGdsLkFSUkFZX0JVRkZFUiwgbnVsbCkpO1xuICAgIHdlYmdsX3V0aWwuY2FsbEFuZENoZWNrKFxuICAgICAgICBnbCwgKCkgPT4gZ2wuYmluZEJ1ZmZlcihnbC5FTEVNRU5UX0FSUkFZX0JVRkZFUiwgbnVsbCkpO1xuICAgIHdlYmdsX3V0aWwuY2FsbEFuZENoZWNrKGdsLCAoKSA9PiBnbC5kZWxldGVCdWZmZXIodGhpcy5pbmRleEJ1ZmZlcikpO1xuICAgIHRoaXMuZGlzcG9zZWQgPSB0cnVlO1xuICB9XG5cbiAgcHVibGljIGNyZWF0ZUZsb2F0MzJNYXRyaXhUZXh0dXJlKHJvd3M6IG51bWJlciwgY29sdW1uczogbnVtYmVyKTogVGV4dHVyZSB7XG4gICAgdGhpcy50aHJvd0lmRGlzcG9zZWQoKTtcbiAgICByZXR1cm4gZ3BncHVfdXRpbC5jcmVhdGVGbG9hdDMyTWF0cml4VGV4dHVyZShcbiAgICAgICAgdGhpcy5nbCwgcm93cywgY29sdW1ucywgdGhpcy50ZXh0dXJlQ29uZmlnKTtcbiAgfVxuXG4gIHB1YmxpYyBjcmVhdGVGbG9hdDE2TWF0cml4VGV4dHVyZShyb3dzOiBudW1iZXIsIGNvbHVtbnM6IG51bWJlcik6IFRleHR1cmUge1xuICAgIHRoaXMudGhyb3dJZkRpc3Bvc2VkKCk7XG4gICAgcmV0dXJuIGdwZ3B1X3V0aWwuY3JlYXRlRmxvYXQxNk1hdHJpeFRleHR1cmUoXG4gICAgICAgIHRoaXMuZ2wsIHJvd3MsIGNvbHVtbnMsIHRoaXMudGV4dHVyZUNvbmZpZyk7XG4gIH1cblxuICBwdWJsaWMgY3JlYXRlVW5zaWduZWRCeXRlc01hdHJpeFRleHR1cmUocm93czogbnVtYmVyLCBjb2x1bW5zOiBudW1iZXIpOlxuICAgICAgVGV4dHVyZSB7XG4gICAgdGhpcy50aHJvd0lmRGlzcG9zZWQoKTtcbiAgICByZXR1cm4gZ3BncHVfdXRpbC5jcmVhdGVVbnNpZ25lZEJ5dGVzTWF0cml4VGV4dHVyZShcbiAgICAgICAgdGhpcy5nbCwgcm93cywgY29sdW1ucywgdGhpcy50ZXh0dXJlQ29uZmlnKTtcbiAgfVxuXG4gIHB1YmxpYyB1cGxvYWRQaXhlbERhdGFUb1RleHR1cmUoXG4gICAgICB0ZXh0dXJlOiBXZWJHTFRleHR1cmUsXG4gICAgICBwaXhlbHM6IFBpeGVsRGF0YXxJbWFnZURhdGF8SFRNTEltYWdlRWxlbWVudHxIVE1MQ2FudmFzRWxlbWVudHxcbiAgICAgIEltYWdlQml0bWFwKSB7XG4gICAgdGhpcy50aHJvd0lmRGlzcG9zZWQoKTtcbiAgICBncGdwdV91dGlsLnVwbG9hZFBpeGVsRGF0YVRvVGV4dHVyZSh0aGlzLmdsLCB0ZXh0dXJlLCBwaXhlbHMpO1xuICB9XG5cbiAgcHVibGljIHVwbG9hZERlbnNlTWF0cml4VG9UZXh0dXJlKFxuICAgICAgdGV4dHVyZTogV2ViR0xUZXh0dXJlLCB3aWR0aDogbnVtYmVyLCBoZWlnaHQ6IG51bWJlciwgZGF0YTogVHlwZWRBcnJheSkge1xuICAgIHRoaXMudGhyb3dJZkRpc3Bvc2VkKCk7XG4gICAgZ3BncHVfdXRpbC51cGxvYWREZW5zZU1hdHJpeFRvVGV4dHVyZShcbiAgICAgICAgdGhpcy5nbCwgdGV4dHVyZSwgd2lkdGgsIGhlaWdodCwgZGF0YSwgdGhpcy50ZXh0dXJlQ29uZmlnKTtcbiAgfVxuXG4gIHB1YmxpYyBjcmVhdGVGbG9hdDE2UGFja2VkTWF0cml4VGV4dHVyZShyb3dzOiBudW1iZXIsIGNvbHVtbnM6IG51bWJlcik6XG4gICAgICBUZXh0dXJlIHtcbiAgICB0aGlzLnRocm93SWZEaXNwb3NlZCgpO1xuICAgIHJldHVybiBncGdwdV91dGlsLmNyZWF0ZUZsb2F0MTZQYWNrZWRNYXRyaXhUZXh0dXJlKFxuICAgICAgICB0aGlzLmdsLCByb3dzLCBjb2x1bW5zLCB0aGlzLnRleHR1cmVDb25maWcpO1xuICB9XG5cbiAgcHVibGljIGNyZWF0ZVBhY2tlZE1hdHJpeFRleHR1cmUocm93czogbnVtYmVyLCBjb2x1bW5zOiBudW1iZXIpOiBUZXh0dXJlIHtcbiAgICB0aGlzLnRocm93SWZEaXNwb3NlZCgpO1xuICAgIHJldHVybiBncGdwdV91dGlsLmNyZWF0ZVBhY2tlZE1hdHJpeFRleHR1cmUoXG4gICAgICAgIHRoaXMuZ2wsIHJvd3MsIGNvbHVtbnMsIHRoaXMudGV4dHVyZUNvbmZpZyk7XG4gIH1cblxuICBwdWJsaWMgZGVsZXRlTWF0cml4VGV4dHVyZSh0ZXh0dXJlOiBXZWJHTFRleHR1cmUpIHtcbiAgICB0aGlzLnRocm93SWZEaXNwb3NlZCgpO1xuICAgIGlmICh0aGlzLm91dHB1dFRleHR1cmUgPT09IHRleHR1cmUpIHtcbiAgICAgIHdlYmdsX3V0aWwudW5iaW5kQ29sb3JUZXh0dXJlRnJvbUZyYW1lYnVmZmVyKHRoaXMuZ2wsIHRoaXMuZnJhbWVidWZmZXIpO1xuICAgICAgdGhpcy5vdXRwdXRUZXh0dXJlID0gbnVsbDtcbiAgICB9XG4gICAgd2ViZ2xfdXRpbC5jYWxsQW5kQ2hlY2sodGhpcy5nbCwgKCkgPT4gdGhpcy5nbC5kZWxldGVUZXh0dXJlKHRleHR1cmUpKTtcbiAgfVxuXG4gIHB1YmxpYyBkb3dubG9hZEJ5dGVFbmNvZGVkRmxvYXRNYXRyaXhGcm9tT3V0cHV0VGV4dHVyZShcbiAgICAgIHRleHR1cmU6IFdlYkdMVGV4dHVyZSwgcm93czogbnVtYmVyLCBjb2x1bW5zOiBudW1iZXIpOiBGbG9hdDMyQXJyYXkge1xuICAgIHJldHVybiB0aGlzLmRvd25sb2FkTWF0cml4RHJpdmVyKFxuICAgICAgICB0ZXh0dXJlLFxuICAgICAgICAoKSA9PiBncGdwdV91dGlsLmRvd25sb2FkQnl0ZUVuY29kZWRGbG9hdE1hdHJpeEZyb21PdXRwdXRUZXh0dXJlKFxuICAgICAgICAgICAgdGhpcy5nbCwgcm93cywgY29sdW1ucywgdGhpcy50ZXh0dXJlQ29uZmlnKSk7XG4gIH1cblxuICBwdWJsaWMgZG93bmxvYWRQYWNrZWRNYXRyaXhGcm9tQnVmZmVyKFxuICAgICAgYnVmZmVyOiBXZWJHTEJ1ZmZlciwgYmF0Y2g6IG51bWJlciwgcm93czogbnVtYmVyLCBjb2x1bW5zOiBudW1iZXIsXG4gICAgICBwaHlzaWNhbFJvd3M6IG51bWJlciwgcGh5c2ljYWxDb2xzOiBudW1iZXIpOiBGbG9hdDMyQXJyYXkge1xuICAgIHJldHVybiBncGdwdV91dGlsLmRvd25sb2FkUGFja2VkTWF0cml4RnJvbUJ1ZmZlcihcbiAgICAgICAgdGhpcy5nbCwgYnVmZmVyLCBiYXRjaCwgcm93cywgY29sdW1ucywgcGh5c2ljYWxSb3dzLCBwaHlzaWNhbENvbHMsXG4gICAgICAgIHRoaXMudGV4dHVyZUNvbmZpZyk7XG4gIH1cblxuICBwdWJsaWMgZG93bmxvYWRGbG9hdDMyTWF0cml4RnJvbUJ1ZmZlcihidWZmZXI6IFdlYkdMQnVmZmVyLCBzaXplOiBudW1iZXIpOlxuICAgICAgRmxvYXQzMkFycmF5IHtcbiAgICByZXR1cm4gZ3BncHVfdXRpbC5kb3dubG9hZEZsb2F0MzJNYXRyaXhGcm9tQnVmZmVyKHRoaXMuZ2wsIGJ1ZmZlciwgc2l6ZSk7XG4gIH1cblxuICBwdWJsaWMgY3JlYXRlQnVmZmVyRnJvbVRleHR1cmUoXG4gICAgICB0ZXh0dXJlOiBXZWJHTFRleHR1cmUsIHJvd3M6IG51bWJlciwgY29sdW1uczogbnVtYmVyKTogV2ViR0xCdWZmZXIge1xuICAgIHRoaXMuYmluZFRleHR1cmVUb0ZyYW1lQnVmZmVyKHRleHR1cmUpO1xuICAgIGNvbnN0IHJlc3VsdCA9IGdwZ3B1X3V0aWwuY3JlYXRlQnVmZmVyRnJvbU91dHB1dFRleHR1cmUoXG4gICAgICAgIHRoaXMuZ2wgYXMgV2ViR0wyUmVuZGVyaW5nQ29udGV4dCwgcm93cywgY29sdW1ucywgdGhpcy50ZXh0dXJlQ29uZmlnKTtcbiAgICB0aGlzLnVuYmluZFRleHR1cmVUb0ZyYW1lQnVmZmVyKCk7XG4gICAgcmV0dXJuIHJlc3VsdDtcbiAgfVxuXG4gIHB1YmxpYyBjcmVhdGVBbmRXYWl0Rm9yRmVuY2UoKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgY29uc3QgZmVuY2VDb250ZXh0ID0gdGhpcy5jcmVhdGVGZW5jZSh0aGlzLmdsKTtcbiAgICByZXR1cm4gdGhpcy5wb2xsRmVuY2UoZmVuY2VDb250ZXh0KTtcbiAgfVxuXG4gIHByaXZhdGUgY3JlYXRlRmVuY2UoZ2w6IFdlYkdMUmVuZGVyaW5nQ29udGV4dCk6IEZlbmNlQ29udGV4dCB7XG4gICAgbGV0IHF1ZXJ5OiBXZWJHTFF1ZXJ5fFdlYkdMU3luYztcbiAgICBsZXQgaXNGZW5jZVBhc3NlZDogKCkgPT4gYm9vbGVhbjtcblxuICAgIGlmIChlbnYoKS5nZXRCb29sKCdXRUJHTF9GRU5DRV9BUElfRU5BQkxFRCcpKSB7XG4gICAgICBjb25zdCBnbDIgPSBnbCBhcyBXZWJHTDJSZW5kZXJpbmdDb250ZXh0O1xuXG4gICAgICBjb25zdCBzeW5jID0gZ2wyLmZlbmNlU3luYyhnbDIuU1lOQ19HUFVfQ09NTUFORFNfQ09NUExFVEUsIDApO1xuICAgICAgZ2wuZmx1c2goKTtcblxuICAgICAgaXNGZW5jZVBhc3NlZCA9ICgpID0+IHtcbiAgICAgICAgY29uc3Qgc3RhdHVzID0gZ2wyLmNsaWVudFdhaXRTeW5jKHN5bmMsIDAsIDApO1xuICAgICAgICByZXR1cm4gc3RhdHVzID09PSBnbDIuQUxSRUFEWV9TSUdOQUxFRCB8fFxuICAgICAgICAgICAgc3RhdHVzID09PSBnbDIuQ09ORElUSU9OX1NBVElTRklFRDtcbiAgICAgIH07XG5cbiAgICAgIHF1ZXJ5ID0gc3luYztcbiAgICB9IGVsc2UgaWYgKFxuICAgICAgICBlbnYoKS5nZXROdW1iZXIoJ1dFQkdMX0RJU0pPSU5UX1FVRVJZX1RJTUVSX0VYVEVOU0lPTl9WRVJTSU9OJykgPiAwKSB7XG4gICAgICBxdWVyeSA9IHRoaXMuYmVnaW5RdWVyeSgpO1xuICAgICAgdGhpcy5lbmRRdWVyeSgpO1xuICAgICAgaXNGZW5jZVBhc3NlZCA9ICgpID0+IHRoaXMuaXNRdWVyeUF2YWlsYWJsZShcbiAgICAgICAgICBxdWVyeSxcbiAgICAgICAgICBlbnYoKS5nZXROdW1iZXIoJ1dFQkdMX0RJU0pPSU5UX1FVRVJZX1RJTUVSX0VYVEVOU0lPTl9WRVJTSU9OJykpO1xuICAgIH0gZWxzZSB7XG4gICAgICAvLyBJZiB3ZSBoYXZlIG5vIHdheSB0byBmZW5jZSwgcmV0dXJuIHRydWUgaW1tZWRpYXRlbHkuIFRoaXMgd2lsbCBmaXJlIGluXG4gICAgICAvLyBXZWJHTCAxLjAgd2hlbiB0aGVyZSBpcyBubyBkaXNqb2ludCBxdWVyeSB0aW1lci4gSW4gdGhpcyBjYXNlLCBiZWNhdXNlXG4gICAgICAvLyB0aGUgZmVuY2UgcGFzc2VzIGltbWVkaWF0ZWx5LCB3ZSdsbCBpbW1lZGlhdGVseSBhc2sgZm9yIGEgZG93bmxvYWQgb2ZcbiAgICAgIC8vIHRoZSB0ZXh0dXJlLCB3aGljaCB3aWxsIGNhdXNlIHRoZSBVSSB0aHJlYWQgdG8gaGFuZy5cbiAgICAgIGlzRmVuY2VQYXNzZWQgPSAoKSA9PiB0cnVlO1xuICAgIH1cblxuICAgIHJldHVybiB7cXVlcnksIGlzRmVuY2VQYXNzZWR9O1xuICB9XG5cbiAgcHVibGljIGRvd25sb2FkTWF0cml4RnJvbVBhY2tlZFRleHR1cmUoXG4gICAgICB0ZXh0dXJlOiBXZWJHTFRleHR1cmUsIHBoeXNpY2FsUm93czogbnVtYmVyLFxuICAgICAgcGh5c2ljYWxDb2xzOiBudW1iZXIpOiBGbG9hdDMyQXJyYXkge1xuICAgIHJldHVybiB0aGlzLmRvd25sb2FkTWF0cml4RHJpdmVyKFxuICAgICAgICB0ZXh0dXJlLFxuICAgICAgICAoKSA9PiBncGdwdV91dGlsLmRvd25sb2FkTWF0cml4RnJvbVBhY2tlZE91dHB1dFRleHR1cmUoXG4gICAgICAgICAgICB0aGlzLmdsLCBwaHlzaWNhbFJvd3MsIHBoeXNpY2FsQ29scykpO1xuICB9XG5cbiAgcHJpdmF0ZSB2ZXJ0ZXhBdHRyc0FyZUJvdW5kID0gZmFsc2U7XG5cbiAgcHVibGljIGNyZWF0ZVByb2dyYW0oZnJhZ21lbnRTaGFkZXI6IFdlYkdMU2hhZGVyKTogV2ViR0xQcm9ncmFtIHtcbiAgICB0aGlzLnRocm93SWZEaXNwb3NlZCgpO1xuICAgIGNvbnN0IGdsID0gdGhpcy5nbDtcbiAgICBpZiAodGhpcy52ZXJ0ZXhTaGFkZXIgPT0gbnVsbCkge1xuICAgICAgdGhpcy52ZXJ0ZXhTaGFkZXIgPSBncGdwdV91dGlsLmNyZWF0ZVZlcnRleFNoYWRlcihnbCk7XG4gICAgfVxuICAgIGNvbnN0IHByb2dyYW06IFdlYkdMUHJvZ3JhbSA9IHdlYmdsX3V0aWwuY3JlYXRlUHJvZ3JhbShnbCk7XG4gICAgd2ViZ2xfdXRpbC5jYWxsQW5kQ2hlY2soXG4gICAgICAgIGdsLCAoKSA9PiBnbC5hdHRhY2hTaGFkZXIocHJvZ3JhbSwgdGhpcy52ZXJ0ZXhTaGFkZXIpKTtcbiAgICB3ZWJnbF91dGlsLmNhbGxBbmRDaGVjayhnbCwgKCkgPT4gZ2wuYXR0YWNoU2hhZGVyKHByb2dyYW0sIGZyYWdtZW50U2hhZGVyKSk7XG4gICAgd2ViZ2xfdXRpbC5saW5rUHJvZ3JhbShnbCwgcHJvZ3JhbSk7XG4gICAgaWYgKHRoaXMuZGVidWcpIHtcbiAgICAgIHdlYmdsX3V0aWwudmFsaWRhdGVQcm9ncmFtKGdsLCBwcm9ncmFtKTtcbiAgICB9XG4gICAgaWYgKCF0aGlzLnZlcnRleEF0dHJzQXJlQm91bmQpIHtcbiAgICAgIHRoaXMuc2V0UHJvZ3JhbShwcm9ncmFtKTtcbiAgICAgIHRoaXMudmVydGV4QXR0cnNBcmVCb3VuZCA9IGdwZ3B1X3V0aWwuYmluZFZlcnRleFByb2dyYW1BdHRyaWJ1dGVTdHJlYW1zKFxuICAgICAgICAgIGdsLCB0aGlzLnByb2dyYW0sIHRoaXMudmVydGV4QnVmZmVyKTtcbiAgICB9XG4gICAgcmV0dXJuIHByb2dyYW07XG4gIH1cblxuICBwdWJsaWMgZGVsZXRlUHJvZ3JhbShwcm9ncmFtOiBXZWJHTFByb2dyYW0pIHtcbiAgICB0aGlzLnRocm93SWZEaXNwb3NlZCgpO1xuICAgIGlmIChwcm9ncmFtID09PSB0aGlzLnByb2dyYW0pIHtcbiAgICAgIHRoaXMucHJvZ3JhbSA9IG51bGw7XG4gICAgfVxuICAgIGlmIChwcm9ncmFtICE9IG51bGwpIHtcbiAgICAgIHdlYmdsX3V0aWwuY2FsbEFuZENoZWNrKHRoaXMuZ2wsICgpID0+IHRoaXMuZ2wuZGVsZXRlUHJvZ3JhbShwcm9ncmFtKSk7XG4gICAgfVxuICB9XG5cbiAgcHVibGljIHNldFByb2dyYW0ocHJvZ3JhbTogV2ViR0xQcm9ncmFtfG51bGwpIHtcbiAgICB0aGlzLnRocm93SWZEaXNwb3NlZCgpO1xuICAgIHRoaXMucHJvZ3JhbSA9IHByb2dyYW07XG4gICAgaWYgKCh0aGlzLnByb2dyYW0gIT0gbnVsbCkgJiYgdGhpcy5kZWJ1Zykge1xuICAgICAgd2ViZ2xfdXRpbC52YWxpZGF0ZVByb2dyYW0odGhpcy5nbCwgdGhpcy5wcm9ncmFtKTtcbiAgICB9XG4gICAgd2ViZ2xfdXRpbC5jYWxsQW5kQ2hlY2sodGhpcy5nbCwgKCkgPT4gdGhpcy5nbC51c2VQcm9ncmFtKHByb2dyYW0pKTtcbiAgfVxuXG4gIHB1YmxpYyBnZXRVbmlmb3JtTG9jYXRpb24oXG4gICAgICBwcm9ncmFtOiBXZWJHTFByb2dyYW0sIHVuaWZvcm1OYW1lOiBzdHJpbmcsXG4gICAgICBzaG91bGRUaHJvdyA9IHRydWUpOiBXZWJHTFVuaWZvcm1Mb2NhdGlvbiB7XG4gICAgdGhpcy50aHJvd0lmRGlzcG9zZWQoKTtcbiAgICBpZiAoc2hvdWxkVGhyb3cpIHtcbiAgICAgIHJldHVybiB3ZWJnbF91dGlsLmdldFByb2dyYW1Vbmlmb3JtTG9jYXRpb25PclRocm93KFxuICAgICAgICAgIHRoaXMuZ2wsIHByb2dyYW0sIHVuaWZvcm1OYW1lKTtcbiAgICB9IGVsc2Uge1xuICAgICAgcmV0dXJuIHdlYmdsX3V0aWwuZ2V0UHJvZ3JhbVVuaWZvcm1Mb2NhdGlvbihcbiAgICAgICAgICB0aGlzLmdsLCBwcm9ncmFtLCB1bmlmb3JtTmFtZSk7XG4gICAgfVxuICB9XG5cbiAgcHVibGljIGdldEF0dHJpYnV0ZUxvY2F0aW9uKHByb2dyYW06IFdlYkdMUHJvZ3JhbSwgYXR0cmlidXRlOiBzdHJpbmcpOlxuICAgICAgbnVtYmVyIHtcbiAgICB0aGlzLnRocm93SWZEaXNwb3NlZCgpO1xuICAgIHJldHVybiB3ZWJnbF91dGlsLmNhbGxBbmRDaGVjayhcbiAgICAgICAgdGhpcy5nbCwgKCkgPT4gdGhpcy5nbC5nZXRBdHRyaWJMb2NhdGlvbihwcm9ncmFtLCBhdHRyaWJ1dGUpKTtcbiAgfVxuXG4gIHB1YmxpYyBnZXRVbmlmb3JtTG9jYXRpb25Ob1Rocm93KHByb2dyYW06IFdlYkdMUHJvZ3JhbSwgdW5pZm9ybU5hbWU6IHN0cmluZyk6XG4gICAgICBXZWJHTFVuaWZvcm1Mb2NhdGlvbiB7XG4gICAgdGhpcy50aHJvd0lmRGlzcG9zZWQoKTtcbiAgICByZXR1cm4gdGhpcy5nbC5nZXRVbmlmb3JtTG9jYXRpb24ocHJvZ3JhbSwgdW5pZm9ybU5hbWUpO1xuICB9XG5cbiAgcHVibGljIHNldElucHV0TWF0cml4VGV4dHVyZShcbiAgICAgIGlucHV0TWF0cml4VGV4dHVyZTogV2ViR0xUZXh0dXJlLCB1bmlmb3JtTG9jYXRpb246IFdlYkdMVW5pZm9ybUxvY2F0aW9uLFxuICAgICAgdGV4dHVyZVVuaXQ6IG51bWJlcikge1xuICAgIHRoaXMudGhyb3dJZkRpc3Bvc2VkKCk7XG4gICAgdGhpcy50aHJvd0lmTm9Qcm9ncmFtKCk7XG4gICAgd2ViZ2xfdXRpbC5iaW5kVGV4dHVyZVRvUHJvZ3JhbVVuaWZvcm1TYW1wbGVyKFxuICAgICAgICB0aGlzLmdsLCBpbnB1dE1hdHJpeFRleHR1cmUsIHVuaWZvcm1Mb2NhdGlvbiwgdGV4dHVyZVVuaXQpO1xuICB9XG5cbiAgcHVibGljIHNldE91dHB1dE1hdHJpeFRleHR1cmUoXG4gICAgICBvdXRwdXRNYXRyaXhUZXh0dXJlOiBXZWJHTFRleHR1cmUsIHJvd3M6IG51bWJlciwgY29sdW1uczogbnVtYmVyKSB7XG4gICAgdGhpcy5zZXRPdXRwdXRNYXRyaXhUZXh0dXJlRHJpdmVyKG91dHB1dE1hdHJpeFRleHR1cmUsIGNvbHVtbnMsIHJvd3MpO1xuICB9XG5cbiAgcHVibGljIHNldE91dHB1dFBhY2tlZE1hdHJpeFRleHR1cmUoXG4gICAgICBvdXRwdXRQYWNrZWRNYXRyaXhUZXh0dXJlOiBXZWJHTFRleHR1cmUsIHJvd3M6IG51bWJlciwgY29sdW1uczogbnVtYmVyKSB7XG4gICAgdGhpcy50aHJvd0lmRGlzcG9zZWQoKTtcbiAgICBjb25zdCBbd2lkdGgsIGhlaWdodF0gPVxuICAgICAgICB0ZXhfdXRpbC5nZXRQYWNrZWRNYXRyaXhUZXh0dXJlU2hhcGVXaWR0aEhlaWdodChyb3dzLCBjb2x1bW5zKTtcbiAgICB0aGlzLnNldE91dHB1dE1hdHJpeFRleHR1cmVEcml2ZXIob3V0cHV0UGFja2VkTWF0cml4VGV4dHVyZSwgd2lkdGgsIGhlaWdodCk7XG4gIH1cblxuICBwdWJsaWMgc2V0T3V0cHV0TWF0cml4V3JpdGVSZWdpb24oXG4gICAgICBzdGFydFJvdzogbnVtYmVyLCBudW1Sb3dzOiBudW1iZXIsIHN0YXJ0Q29sdW1uOiBudW1iZXIsXG4gICAgICBudW1Db2x1bW5zOiBudW1iZXIpIHtcbiAgICB0aGlzLnNldE91dHB1dE1hdHJpeFdyaXRlUmVnaW9uRHJpdmVyKFxuICAgICAgICBzdGFydENvbHVtbiwgc3RhcnRSb3csIG51bUNvbHVtbnMsIG51bVJvd3MpO1xuICB9XG5cbiAgcHVibGljIHNldE91dHB1dFBhY2tlZE1hdHJpeFdyaXRlUmVnaW9uKFxuICAgICAgc3RhcnRSb3c6IG51bWJlciwgbnVtUm93czogbnVtYmVyLCBzdGFydENvbHVtbjogbnVtYmVyLFxuICAgICAgbnVtQ29sdW1uczogbnVtYmVyKSB7XG4gICAgdGhyb3cgbmV3IEVycm9yKCdzZXRPdXRwdXRQYWNrZWRNYXRyaXhXcml0ZVJlZ2lvbiBub3QgaW1wbGVtZW50ZWQuJyk7XG4gIH1cblxuICBwdWJsaWMgZGVidWdWYWxpZGF0ZSgpIHtcbiAgICBpZiAodGhpcy5wcm9ncmFtICE9IG51bGwpIHtcbiAgICAgIHdlYmdsX3V0aWwudmFsaWRhdGVQcm9ncmFtKHRoaXMuZ2wsIHRoaXMucHJvZ3JhbSk7XG4gICAgfVxuICAgIHdlYmdsX3V0aWwudmFsaWRhdGVGcmFtZWJ1ZmZlcih0aGlzLmdsKTtcbiAgfVxuXG4gIHB1YmxpYyBleGVjdXRlUHJvZ3JhbSgpIHtcbiAgICB0aGlzLnRocm93SWZEaXNwb3NlZCgpO1xuICAgIHRoaXMudGhyb3dJZk5vUHJvZ3JhbSgpO1xuICAgIGNvbnN0IGdsID0gdGhpcy5nbDtcbiAgICBpZiAodGhpcy5kZWJ1Zykge1xuICAgICAgdGhpcy5kZWJ1Z1ZhbGlkYXRlKCk7XG4gICAgfVxuICAgIHdlYmdsX3V0aWwuY2FsbEFuZENoZWNrKFxuICAgICAgICBnbCwgKCkgPT4gZ2wuZHJhd0VsZW1lbnRzKGdsLlRSSUFOR0xFUywgNiwgZ2wuVU5TSUdORURfU0hPUlQsIDApKTtcbiAgfVxuXG4gIHB1YmxpYyBibG9ja1VudGlsQWxsUHJvZ3JhbXNDb21wbGV0ZWQoKSB7XG4gICAgdGhpcy50aHJvd0lmRGlzcG9zZWQoKTtcbiAgICB3ZWJnbF91dGlsLmNhbGxBbmRDaGVjayh0aGlzLmdsLCAoKSA9PiB0aGlzLmdsLmZpbmlzaCgpKTtcbiAgfVxuXG4gIHByaXZhdGUgZ2V0UXVlcnlUaW1lckV4dGVuc2lvbigpOiBXZWJHTDFEaXNqb2ludFF1ZXJ5VGltZXJFeHRlbnNpb25cbiAgICAgIHxXZWJHTDJEaXNqb2ludFF1ZXJ5VGltZXJFeHRlbnNpb24ge1xuICAgIGlmICh0aGlzLmRpc2pvaW50UXVlcnlUaW1lckV4dGVuc2lvbiA9PSBudWxsKSB7XG4gICAgICB0aGlzLmRpc2pvaW50UXVlcnlUaW1lckV4dGVuc2lvbiA9XG4gICAgICAgICAgd2ViZ2xfdXRpbC5nZXRFeHRlbnNpb25PclRocm93KFxuICAgICAgICAgICAgICB0aGlzLmdsLFxuICAgICAgICAgICAgICBlbnYoKS5nZXROdW1iZXIoXG4gICAgICAgICAgICAgICAgICAnV0VCR0xfRElTSk9JTlRfUVVFUllfVElNRVJfRVhURU5TSU9OX1ZFUlNJT04nKSA9PT0gMiA/XG4gICAgICAgICAgICAgICAgICAnRVhUX2Rpc2pvaW50X3RpbWVyX3F1ZXJ5X3dlYmdsMicgOlxuICAgICAgICAgICAgICAgICAgJ0VYVF9kaXNqb2ludF90aW1lcl9xdWVyeScpIGFzXG4gICAgICAgICAgICAgIFdlYkdMMURpc2pvaW50UXVlcnlUaW1lckV4dGVuc2lvbiB8XG4gICAgICAgICAgV2ViR0wyRGlzam9pbnRRdWVyeVRpbWVyRXh0ZW5zaW9uO1xuICAgIH1cbiAgICByZXR1cm4gdGhpcy5kaXNqb2ludFF1ZXJ5VGltZXJFeHRlbnNpb247XG4gIH1cblxuICBwcml2YXRlIGdldFF1ZXJ5VGltZXJFeHRlbnNpb25XZWJHTDIoKTogV2ViR0wyRGlzam9pbnRRdWVyeVRpbWVyRXh0ZW5zaW9uIHtcbiAgICByZXR1cm4gdGhpcy5nZXRRdWVyeVRpbWVyRXh0ZW5zaW9uKCk7XG4gIH1cblxuICBwcml2YXRlIGdldFF1ZXJ5VGltZXJFeHRlbnNpb25XZWJHTDEoKTogV2ViR0wxRGlzam9pbnRRdWVyeVRpbWVyRXh0ZW5zaW9uIHtcbiAgICByZXR1cm4gdGhpcy5nZXRRdWVyeVRpbWVyRXh0ZW5zaW9uKCkgYXMgV2ViR0wxRGlzam9pbnRRdWVyeVRpbWVyRXh0ZW5zaW9uO1xuICB9XG5cbiAgYmVnaW5RdWVyeSgpOiBXZWJHTFF1ZXJ5IHtcbiAgICBpZiAoZW52KCkuZ2V0TnVtYmVyKCdXRUJHTF9ESVNKT0lOVF9RVUVSWV9USU1FUl9FWFRFTlNJT05fVkVSU0lPTicpID09PSAyKSB7XG4gICAgICBjb25zdCBnbDIgPSB0aGlzLmdsIGFzIFdlYkdMMlJlbmRlcmluZ0NvbnRleHQ7XG4gICAgICBjb25zdCBleHQgPSB0aGlzLmdldFF1ZXJ5VGltZXJFeHRlbnNpb25XZWJHTDIoKTtcblxuICAgICAgY29uc3QgcXVlcnkgPSBnbDIuY3JlYXRlUXVlcnkoKTtcbiAgICAgIGdsMi5iZWdpblF1ZXJ5KGV4dC5USU1FX0VMQVBTRURfRVhULCBxdWVyeSk7XG4gICAgICByZXR1cm4gcXVlcnk7XG4gICAgfVxuICAgIGNvbnN0IGV4dCA9IHRoaXMuZ2V0UXVlcnlUaW1lckV4dGVuc2lvbldlYkdMMSgpO1xuICAgIGNvbnN0IHF1ZXJ5ID0gZXh0LmNyZWF0ZVF1ZXJ5RVhUKCkgYXMgV2ViR0xRdWVyeTtcbiAgICBleHQuYmVnaW5RdWVyeUVYVChleHQuVElNRV9FTEFQU0VEX0VYVCwgcXVlcnkpO1xuICAgIHJldHVybiBxdWVyeTtcbiAgfVxuXG4gIGVuZFF1ZXJ5KCkge1xuICAgIGlmIChlbnYoKS5nZXROdW1iZXIoJ1dFQkdMX0RJU0pPSU5UX1FVRVJZX1RJTUVSX0VYVEVOU0lPTl9WRVJTSU9OJykgPT09IDIpIHtcbiAgICAgIGNvbnN0IGdsMiA9IHRoaXMuZ2wgYXMgV2ViR0wyUmVuZGVyaW5nQ29udGV4dDtcbiAgICAgIGNvbnN0IGV4dCA9IHRoaXMuZ2V0UXVlcnlUaW1lckV4dGVuc2lvbldlYkdMMigpO1xuICAgICAgZ2wyLmVuZFF1ZXJ5KGV4dC5USU1FX0VMQVBTRURfRVhUKTtcbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgY29uc3QgZXh0ID0gdGhpcy5nZXRRdWVyeVRpbWVyRXh0ZW5zaW9uV2ViR0wxKCk7XG4gICAgZXh0LmVuZFF1ZXJ5RVhUKGV4dC5USU1FX0VMQVBTRURfRVhUKTtcbiAgfVxuXG4gIHB1YmxpYyBhc3luYyB3YWl0Rm9yUXVlcnlBbmRHZXRUaW1lKHF1ZXJ5OiBXZWJHTFF1ZXJ5KTogUHJvbWlzZTxudW1iZXI+IHtcbiAgICBhd2FpdCB1dGlsLnJlcGVhdGVkVHJ5KFxuICAgICAgICAoKSA9PiB0aGlzLmRpc3Bvc2VkIHx8ICAvLyB3aGlsZSB0ZXN0aW5nIGNvbnRleHRzIGFyZSBjcmVhdGVkIC8gZGlzcG9zZWRcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gaW4gcmFwaWQgc3VjY2Vzc2lvbiwgc28gd2l0aG91dCB0aGlzIGNoZWNrIHdlXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIG1heSBwb2xsIGZvciB0aGUgcXVlcnkgdGltZXIgaW5kZWZpbml0ZWx5XG4gICAgICAgICAgICB0aGlzLmlzUXVlcnlBdmFpbGFibGUoXG4gICAgICAgICAgICAgICAgcXVlcnksXG4gICAgICAgICAgICAgICAgZW52KCkuZ2V0TnVtYmVyKFxuICAgICAgICAgICAgICAgICAgICAnV0VCR0xfRElTSk9JTlRfUVVFUllfVElNRVJfRVhURU5TSU9OX1ZFUlNJT04nKSkpO1xuICAgIHJldHVybiB0aGlzLmdldFF1ZXJ5VGltZShcbiAgICAgICAgcXVlcnksIGVudigpLmdldE51bWJlcignV0VCR0xfRElTSk9JTlRfUVVFUllfVElNRVJfRVhURU5TSU9OX1ZFUlNJT04nKSk7XG4gIH1cblxuICBwcml2YXRlIGdldFF1ZXJ5VGltZShxdWVyeTogV2ViR0xRdWVyeSwgcXVlcnlUaW1lclZlcnNpb246IG51bWJlcik6IG51bWJlciB7XG4gICAgaWYgKHF1ZXJ5VGltZXJWZXJzaW9uID09PSAwKSB7XG4gICAgICByZXR1cm4gbnVsbDtcbiAgICB9XG5cbiAgICBpZiAocXVlcnlUaW1lclZlcnNpb24gPT09IDIpIHtcbiAgICAgIGNvbnN0IGdsMiA9IHRoaXMuZ2wgYXMgV2ViR0wyUmVuZGVyaW5nQ29udGV4dDtcblxuICAgICAgY29uc3QgdGltZUVsYXBzZWROYW5vcyA9IGdsMi5nZXRRdWVyeVBhcmFtZXRlcihxdWVyeSwgZ2wyLlFVRVJZX1JFU1VMVCk7XG4gICAgICAvLyBSZXR1cm4gbWlsbGlzZWNvbmRzLlxuICAgICAgcmV0dXJuIHRpbWVFbGFwc2VkTmFub3MgLyAxMDAwMDAwO1xuICAgIH0gZWxzZSB7XG4gICAgICBjb25zdCBleHQgPSB0aGlzLmdldFF1ZXJ5VGltZXJFeHRlbnNpb25XZWJHTDEoKTtcblxuICAgICAgY29uc3QgdGltZUVsYXBzZWROYW5vcyA9XG4gICAgICAgICAgZXh0LmdldFF1ZXJ5T2JqZWN0RVhUKHF1ZXJ5LCBleHQuUVVFUllfUkVTVUxUX0VYVCk7XG4gICAgICAvLyBSZXR1cm4gbWlsbGlzZWNvbmRzLlxuICAgICAgcmV0dXJuIHRpbWVFbGFwc2VkTmFub3MgLyAxMDAwMDAwO1xuICAgIH1cbiAgfVxuXG4gIHByaXZhdGUgaXNRdWVyeUF2YWlsYWJsZShxdWVyeTogV2ViR0xRdWVyeSwgcXVlcnlUaW1lclZlcnNpb246IG51bWJlcik6XG4gICAgICBib29sZWFuIHtcbiAgICBpZiAocXVlcnlUaW1lclZlcnNpb24gPT09IDApIHtcbiAgICAgIHJldHVybiB0cnVlO1xuICAgIH1cblxuICAgIGlmIChxdWVyeVRpbWVyVmVyc2lvbiA9PT0gMikge1xuICAgICAgY29uc3QgZ2wyID0gdGhpcy5nbCBhcyBXZWJHTDJSZW5kZXJpbmdDb250ZXh0O1xuICAgICAgY29uc3QgZXh0ID0gdGhpcy5nZXRRdWVyeVRpbWVyRXh0ZW5zaW9uV2ViR0wyKCk7XG5cbiAgICAgIGNvbnN0IGF2YWlsYWJsZSA9XG4gICAgICAgICAgZ2wyLmdldFF1ZXJ5UGFyYW1ldGVyKHF1ZXJ5LCBnbDIuUVVFUllfUkVTVUxUX0FWQUlMQUJMRSk7XG4gICAgICBpZiAodGhpcy5kaXNqb2ludCA9PSBudWxsKSB7XG4gICAgICAgIHRoaXMuZGlzam9pbnQgPSB0aGlzLmdsLmdldFBhcmFtZXRlcihleHQuR1BVX0RJU0pPSU5UX0VYVCk7XG4gICAgICB9XG5cbiAgICAgIHJldHVybiBhdmFpbGFibGUgJiYgIXRoaXMuZGlzam9pbnQ7XG4gICAgfSBlbHNlIHtcbiAgICAgIGNvbnN0IGV4dCA9IHRoaXMuZ2V0UXVlcnlUaW1lckV4dGVuc2lvbldlYkdMMSgpO1xuXG4gICAgICBjb25zdCBhdmFpbGFibGUgPVxuICAgICAgICAgIGV4dC5nZXRRdWVyeU9iamVjdEVYVChxdWVyeSwgZXh0LlFVRVJZX1JFU1VMVF9BVkFJTEFCTEVfRVhUKTtcbiAgICAgIGlmICh0aGlzLmRpc2pvaW50ID09IG51bGwpIHtcbiAgICAgICAgdGhpcy5kaXNqb2ludCA9IHRoaXMuZ2wuZ2V0UGFyYW1ldGVyKGV4dC5HUFVfRElTSk9JTlRfRVhUKTtcbiAgICAgIH1cblxuICAgICAgcmV0dXJuIGF2YWlsYWJsZSAmJiAhdGhpcy5kaXNqb2ludDtcbiAgICB9XG4gIH1cblxuICBwb2xsRmVuY2UoZmVuY2VDb250ZXh0OiBGZW5jZUNvbnRleHQpIHtcbiAgICByZXR1cm4gbmV3IFByb21pc2U8dm9pZD4ocmVzb2x2ZSA9PiB7XG4gICAgICB0aGlzLmFkZEl0ZW1Ub1BvbGwoKCkgPT4gZmVuY2VDb250ZXh0LmlzRmVuY2VQYXNzZWQoKSwgKCkgPT4gcmVzb2x2ZSgpKTtcbiAgICB9KTtcbiAgfVxuXG4gIHByaXZhdGUgaXRlbXNUb1BvbGw6IFBvbGxJdGVtW10gPSBbXTtcblxuICBwb2xsSXRlbXMoKTogdm9pZCB7XG4gICAgLy8gRmluZCB0aGUgbGFzdCBxdWVyeSB0aGF0IGhhcyBmaW5pc2hlZC5cbiAgICBjb25zdCBpbmRleCA9IGxpbmVhclNlYXJjaExhc3RUcnVlKHRoaXMuaXRlbXNUb1BvbGwubWFwKHggPT4geC5pc0RvbmVGbikpO1xuICAgIGZvciAobGV0IGkgPSAwOyBpIDw9IGluZGV4OyArK2kpIHtcbiAgICAgIGNvbnN0IHtyZXNvbHZlRm59ID0gdGhpcy5pdGVtc1RvUG9sbFtpXTtcbiAgICAgIHJlc29sdmVGbigpO1xuICAgIH1cbiAgICB0aGlzLml0ZW1zVG9Qb2xsID0gdGhpcy5pdGVtc1RvUG9sbC5zbGljZShpbmRleCArIDEpO1xuICB9XG5cbiAgcHJpdmF0ZSBhZGRJdGVtVG9Qb2xsKGlzRG9uZUZuOiAoKSA9PiBib29sZWFuLCByZXNvbHZlRm46ICgpID0+IHZvaWQpIHtcbiAgICB0aGlzLml0ZW1zVG9Qb2xsLnB1c2goe2lzRG9uZUZuLCByZXNvbHZlRm59KTtcbiAgICBpZiAodGhpcy5pdGVtc1RvUG9sbC5sZW5ndGggPiAxKSB7XG4gICAgICAvLyBXZSBhbHJlYWR5IGhhdmUgYSBydW5uaW5nIGxvb3AgdGhhdCBwb2xscy5cbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgLy8gU3RhcnQgYSBuZXcgbG9vcCB0aGF0IHBvbGxzLlxuICAgIGxldCBzY2hlZHVsZUZuID0gdW5kZWZpbmVkO1xuICAgIGlmICgnc2V0VGltZW91dEN1c3RvbScgaW4gZW52KCkucGxhdGZvcm0pIHtcbiAgICAgIHNjaGVkdWxlRm4gPSBlbnYoKS5wbGF0Zm9ybS5zZXRUaW1lb3V0Q3VzdG9tLmJpbmQoZW52KCkucGxhdGZvcm0pO1xuICAgIH1cbiAgICB1dGlsLnJlcGVhdGVkVHJ5KCgpID0+IHtcbiAgICAgIHRoaXMucG9sbEl0ZW1zKCk7XG4gICAgICAvLyBFbmQgdGhlIGxvb3AgaWYgbm8gbW9yZSBpdGVtcyB0byBwb2xsLlxuICAgICAgcmV0dXJuIHRoaXMuaXRlbXNUb1BvbGwubGVuZ3RoID09PSAwO1xuICAgIH0sICgpID0+IDAsIG51bGwsIHNjaGVkdWxlRm4pO1xuICB9XG5cbiAgcHJpdmF0ZSBiaW5kVGV4dHVyZVRvRnJhbWVCdWZmZXIodGV4dHVyZTogV2ViR0xUZXh0dXJlKSB7XG4gICAgdGhpcy50aHJvd0lmRGlzcG9zZWQoKTtcbiAgICB3ZWJnbF91dGlsLmJpbmRDb2xvclRleHR1cmVUb0ZyYW1lYnVmZmVyKFxuICAgICAgICB0aGlzLmdsLCB0ZXh0dXJlLCB0aGlzLmZyYW1lYnVmZmVyKTtcbiAgICBpZiAodGhpcy5kZWJ1Zykge1xuICAgICAgd2ViZ2xfdXRpbC52YWxpZGF0ZUZyYW1lYnVmZmVyKHRoaXMuZ2wpO1xuICAgIH1cbiAgfVxuXG4gIHByaXZhdGUgdW5iaW5kVGV4dHVyZVRvRnJhbWVCdWZmZXIoKSB7XG4gICAgaWYgKHRoaXMub3V0cHV0VGV4dHVyZSAhPSBudWxsKSB7XG4gICAgICB3ZWJnbF91dGlsLmJpbmRDb2xvclRleHR1cmVUb0ZyYW1lYnVmZmVyKFxuICAgICAgICAgIHRoaXMuZ2wsIHRoaXMub3V0cHV0VGV4dHVyZSwgdGhpcy5mcmFtZWJ1ZmZlcik7XG4gICAgICBpZiAodGhpcy5kZWJ1Zykge1xuICAgICAgICB3ZWJnbF91dGlsLnZhbGlkYXRlRnJhbWVidWZmZXIodGhpcy5nbCk7XG4gICAgICB9XG4gICAgfSBlbHNlIHtcbiAgICAgIHdlYmdsX3V0aWwudW5iaW5kQ29sb3JUZXh0dXJlRnJvbUZyYW1lYnVmZmVyKHRoaXMuZ2wsIHRoaXMuZnJhbWVidWZmZXIpO1xuICAgIH1cbiAgfVxuXG4gIHByaXZhdGUgZG93bmxvYWRNYXRyaXhEcml2ZXIoXG4gICAgICB0ZXh0dXJlOiBXZWJHTFRleHR1cmUsXG4gICAgICBkb3dubG9hZEFuZERlY29kZTogKCkgPT4gRmxvYXQzMkFycmF5KTogRmxvYXQzMkFycmF5IHtcbiAgICB0aGlzLmJpbmRUZXh0dXJlVG9GcmFtZUJ1ZmZlcih0ZXh0dXJlKTtcbiAgICBjb25zdCByZXN1bHQgPSBkb3dubG9hZEFuZERlY29kZSgpO1xuICAgIHRoaXMudW5iaW5kVGV4dHVyZVRvRnJhbWVCdWZmZXIoKTtcblxuICAgIHJldHVybiByZXN1bHQ7XG4gIH1cblxuICBwcml2YXRlIHNldE91dHB1dE1hdHJpeFRleHR1cmVEcml2ZXIoXG4gICAgICBvdXRwdXRNYXRyaXhUZXh0dXJlTWF5YmVQYWNrZWQ6IFdlYkdMVGV4dHVyZSwgd2lkdGg6IG51bWJlcixcbiAgICAgIGhlaWdodDogbnVtYmVyKSB7XG4gICAgdGhpcy50aHJvd0lmRGlzcG9zZWQoKTtcbiAgICBjb25zdCBnbCA9IHRoaXMuZ2w7XG4gICAgd2ViZ2xfdXRpbC5iaW5kQ29sb3JUZXh0dXJlVG9GcmFtZWJ1ZmZlcihcbiAgICAgICAgZ2wsIG91dHB1dE1hdHJpeFRleHR1cmVNYXliZVBhY2tlZCwgdGhpcy5mcmFtZWJ1ZmZlcik7XG4gICAgaWYgKHRoaXMuZGVidWcpIHtcbiAgICAgIHdlYmdsX3V0aWwudmFsaWRhdGVGcmFtZWJ1ZmZlcihnbCk7XG4gICAgfVxuICAgIHRoaXMub3V0cHV0VGV4dHVyZSA9IG91dHB1dE1hdHJpeFRleHR1cmVNYXliZVBhY2tlZDtcbiAgICB3ZWJnbF91dGlsLmNhbGxBbmRDaGVjayhnbCwgKCkgPT4gZ2wudmlld3BvcnQoMCwgMCwgd2lkdGgsIGhlaWdodCkpO1xuICAgIHdlYmdsX3V0aWwuY2FsbEFuZENoZWNrKGdsLCAoKSA9PiBnbC5zY2lzc29yKDAsIDAsIHdpZHRoLCBoZWlnaHQpKTtcbiAgfVxuXG4gIHByaXZhdGUgc2V0T3V0cHV0TWF0cml4V3JpdGVSZWdpb25Ecml2ZXIoXG4gICAgICB4OiBudW1iZXIsIHk6IG51bWJlciwgd2lkdGg6IG51bWJlciwgaGVpZ2h0OiBudW1iZXIpIHtcbiAgICB0aGlzLnRocm93SWZEaXNwb3NlZCgpO1xuICAgIHdlYmdsX3V0aWwuY2FsbEFuZENoZWNrKFxuICAgICAgICB0aGlzLmdsLCAoKSA9PiB0aGlzLmdsLnNjaXNzb3IoeCwgeSwgd2lkdGgsIGhlaWdodCkpO1xuICB9XG5cbiAgcHJpdmF0ZSB0aHJvd0lmRGlzcG9zZWQoKSB7XG4gICAgaWYgKHRoaXMuZGlzcG9zZWQpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcignQXR0ZW1wdGVkIHRvIHVzZSBkaXNwb3NlZCBHUEdQVUNvbnRleHQuJyk7XG4gICAgfVxuICB9XG5cbiAgcHJpdmF0ZSB0aHJvd0lmTm9Qcm9ncmFtKCkge1xuICAgIGlmICh0aGlzLnByb2dyYW0gPT0gbnVsbCkge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKCdObyBHUFUgcHJvZ3JhbSBpcyBjdXJyZW50bHkgc2V0LicpO1xuICAgIH1cbiAgfVxufVxuXG50eXBlIFBvbGxJdGVtID0ge1xuICBpc0RvbmVGbjogKCkgPT4gYm9vbGVhbixcbiAgcmVzb2x2ZUZuOiAoKSA9PiB2b2lkXG59O1xuXG4vKipcbiAqIEZpbmRzIHRoZSBpbmRleCBvZiB0aGUgbGFzdCB0cnVlIGVsZW1lbnQgdXNpbmcgbGluZWFyIHNlYXJjaC5cbiAqIE5vdGU6IFdlIGNhbid0IGRvIGJpbmFyeSBzZWFyY2ggYmVjYXVzZSBDaHJvbWUgZXhwZWN0cyB1cyB0byBleHBsaWNpdGx5XG4gKiB0ZXN0IGFsbCBmZW5jZXMgYmVmb3JlIGRvd25sb2FkOlxuICogaHR0cHM6Ly9naXRodWIuY29tL3RlbnNvcmZsb3cvdGZqcy9pc3N1ZXMvMTE0NVxuICovXG5leHBvcnQgZnVuY3Rpb24gbGluZWFyU2VhcmNoTGFzdFRydWUoYXJyOiBBcnJheTwoKSA9PiBib29sZWFuPik6IG51bWJlciB7XG4gIGxldCBpID0gMDtcbiAgZm9yICg7IGkgPCBhcnIubGVuZ3RoOyArK2kpIHtcbiAgICBjb25zdCBpc0RvbmUgPSBhcnJbaV0oKTtcbiAgICBpZiAoIWlzRG9uZSkge1xuICAgICAgYnJlYWs7XG4gICAgfVxuICB9XG4gIHJldHVybiBpIC0gMTtcbn1cbiJdfQ==","/**\n * @license\n * Copyright 2020 Google LLC. All Rights Reserved.\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n * =============================================================================\n */\n// Import shared functionality from tfjs-backend-cpu without triggering\n// side effects.\n// tslint:disable-next-line: no-imports-from-dist\nimport * as shared from '@tensorflow/tfjs-backend-cpu/dist/shared';\nconst { addImpl: addImplCPU, bincountImpl: bincountImplCPU, bincountReduceImpl: bincountReduceImplCPU, castImpl: castImplCPU, ceilImpl: ceilImplCPU, concatImpl: concatImplCPU, equalImpl: equalImplCPU, expImpl: expImplCPU, expm1Impl: expm1ImplCPU, floorImpl: floorImplCPU, gatherNdImpl: gatherNdImplCPU, gatherV2Impl: gatherV2ImplCPU, greaterImpl: greaterImplCPU, greaterEqualImpl: greaterEqualImplCPU, lessImpl: lessImplCPU, lessEqualImpl: lessEqualImplCPU, linSpaceImpl: linSpaceImplCPU, logImpl: logImplCPU, maxImpl: maxImplCPU, maximumImpl: maximumImplCPU, minimumImpl: minimumImplCPU, multiplyImpl: multiplyImplCPU, negImpl: negImplCPU, notEqualImpl: notEqualImplCPU, prodImpl: prodImplCPU, raggedGatherImpl: raggedGatherImplCPU, raggedTensorToTensorImpl: raggedTensorToTensorImplCPU, rangeImpl: rangeImplCPU, rsqrtImpl: rsqrtImplCPU, scatterImpl: scatterImplCPU, sigmoidImpl: sigmoidImplCPU, simpleAbsImpl: simpleAbsImplCPU, sliceImpl: sliceImplCPU, sparseFillEmptyRowsImpl: sparseFillEmptyRowsImplCPU, sparseReshapeImpl: sparseReshapeImplCPU, sparseSegmentReductionImpl: sparseSegmentReductionImplCPU, sqrtImpl: sqrtImplCPU, stridedSliceImpl: stridedSliceImplCPU, stringNGramsImpl: stringNGramsImplCPU, stringSplitImpl: stringSplitImplCPU, stringToHashBucketFastImpl: stringToHashBucketFastImplCPU, subImpl: subImplCPU, tileImpl: tileImplCPU, topKImpl: topKImplCPU, transposeImpl: transposeImplCPU, uniqueImpl: uniqueImplCPU, } = shared;\nexport { addImplCPU, bincountImplCPU, bincountReduceImplCPU, castImplCPU, ceilImplCPU, concatImplCPU, equalImplCPU, expImplCPU, expm1ImplCPU, floorImplCPU, gatherNdImplCPU, gatherV2ImplCPU, greaterEqualImplCPU, greaterImplCPU, lessEqualImplCPU, lessImplCPU, linSpaceImplCPU, logImplCPU, maxImplCPU, maximumImplCPU, minimumImplCPU, multiplyImplCPU, negImplCPU, notEqualImplCPU, prodImplCPU, raggedGatherImplCPU, raggedTensorToTensorImplCPU, scatterImplCPU, sigmoidImplCPU, simpleAbsImplCPU, sliceImplCPU, sparseFillEmptyRowsImplCPU, sparseReshapeImplCPU, sparseSegmentReductionImplCPU, sqrtImplCPU, stridedSliceImplCPU, stringNGramsImplCPU, stringSplitImplCPU, stringToHashBucketFastImplCPU, subImplCPU, rangeImplCPU, rsqrtImplCPU, tileImplCPU, topKImplCPU, transposeImplCPU, uniqueImplCPU, };\n//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic2hhcmVkLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vLi4vdGZqcy1iYWNrZW5kLXdlYmdsL3NyYy9rZXJuZWxfdXRpbHMvc2hhcmVkLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUNBOzs7Ozs7Ozs7Ozs7Ozs7R0FlRztBQUVILHVFQUF1RTtBQUN2RSxnQkFBZ0I7QUFDaEIsaURBQWlEO0FBQ2pELE9BQU8sS0FBSyxNQUFNLE1BQU0sMENBQTBDLENBQUM7QUFRbkUsTUFBTSxFQUNKLE9BQU8sRUFBRSxVQUFVLEVBQ25CLFlBQVksRUFBRSxlQUFlLEVBQzdCLGtCQUFrQixFQUFFLHFCQUFxQixFQUN6QyxRQUFRLEVBQUUsV0FBVyxFQUNyQixRQUFRLEVBQUUsV0FBVyxFQUNyQixVQUFVLEVBQUUsYUFBYSxFQUN6QixTQUFTLEVBQUUsWUFBWSxFQUN2QixPQUFPLEVBQUUsVUFBVSxFQUNuQixTQUFTLEVBQUUsWUFBWSxFQUN2QixTQUFTLEVBQUUsWUFBWSxFQUN2QixZQUFZLEVBQUUsZUFBZSxFQUM3QixZQUFZLEVBQUUsZUFBZSxFQUM3QixXQUFXLEVBQUUsY0FBYyxFQUMzQixnQkFBZ0IsRUFBRSxtQkFBbUIsRUFDckMsUUFBUSxFQUFFLFdBQVcsRUFDckIsYUFBYSxFQUFFLGdCQUFnQixFQUMvQixZQUFZLEVBQUUsZUFBZSxFQUM3QixPQUFPLEVBQUUsVUFBVSxFQUNuQixPQUFPLEVBQUUsVUFBVSxFQUNuQixXQUFXLEVBQUUsY0FBYyxFQUMzQixXQUFXLEVBQUUsY0FBYyxFQUMzQixZQUFZLEVBQUUsZUFBZSxFQUM3QixPQUFPLEVBQUUsVUFBVSxFQUNuQixZQUFZLEVBQUUsZUFBZSxFQUM3QixRQUFRLEVBQUUsV0FBVyxFQUNyQixnQkFBZ0IsRUFBRSxtQkFBbUIsRUFDckMsd0JBQXdCLEVBQUUsMkJBQTJCLEVBQ3JELFNBQVMsRUFBRSxZQUFZLEVBQ3ZCLFNBQVMsRUFBRSxZQUFZLEVBQ3ZCLFdBQVcsRUFBRSxjQUFjLEVBQzNCLFdBQVcsRUFBRSxjQUFjLEVBQzNCLGFBQWEsRUFBRSxnQkFBZ0IsRUFDL0IsU0FBUyxFQUFFLFlBQVksRUFDdkIsdUJBQXVCLEVBQUUsMEJBQTBCLEVBQ25ELGlCQUFpQixFQUFFLG9CQUFvQixFQUN2QywwQkFBMEIsRUFBRSw2QkFBNkIsRUFDekQsUUFBUSxFQUFFLFdBQVcsRUFDckIsZ0JBQWdCLEVBQUUsbUJBQW1CLEVBQ3JDLGdCQUFnQixFQUFFLG1CQUFtQixFQUNyQyxlQUFlLEVBQUUsa0JBQWtCLEVBQ25DLDBCQUEwQixFQUFFLDZCQUE2QixFQUN6RCxPQUFPLEVBQUUsVUFBVSxFQUNuQixRQUFRLEVBQUUsV0FBVyxFQUNyQixRQUFRLEVBQUUsV0FBVyxFQUNyQixhQUFhLEVBQUUsZ0JBQWdCLEVBQy9CLFVBQVUsRUFBRSxhQUFhLEdBQzFCLEdBQUcsTUFBTSxDQUFDO0FBRVgsT0FBTyxFQUNMLFVBQVUsRUFDVixlQUFlLEVBQ2YscUJBQXFCLEVBQ3JCLFdBQVcsRUFDWCxXQUFXLEVBQ1gsYUFBYSxFQUNiLFlBQVksRUFDWixVQUFVLEVBQ1YsWUFBWSxFQUNaLFlBQVksRUFDWixlQUFlLEVBQ2YsZUFBZSxFQUNmLG1CQUFtQixFQUNuQixjQUFjLEVBQ2QsZ0JBQWdCLEVBQ2hCLFdBQVcsRUFDWCxlQUFlLEVBQ2YsVUFBVSxFQUNWLFVBQVUsRUFDVixjQUFjLEVBQ2QsY0FBYyxFQUNkLGVBQWUsRUFDZixVQUFVLEVBQ1YsZUFBZSxFQUNmLFdBQVcsRUFDWCxtQkFBbUIsRUFDbkIsMkJBQTJCLEVBQzNCLGNBQWMsRUFDZCxjQUFjLEVBQ2QsZ0JBQWdCLEVBQ2hCLFlBQVksRUFDWiwwQkFBMEIsRUFDMUIsb0JBQW9CLEVBQ3BCLDZCQUE2QixFQUM3QixXQUFXLEVBQ1gsbUJBQW1CLEVBQ25CLG1CQUFtQixFQUNuQixrQkFBa0IsRUFDbEIsNkJBQTZCLEVBQzdCLFVBQVUsRUFDVixZQUFZLEVBQ1osWUFBWSxFQUNaLFdBQVcsRUFDWCxXQUFXLEVBQ1gsZ0JBQWdCLEVBQ2hCLGFBQWEsR0FDZCxDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiXG4vKipcbiAqIEBsaWNlbnNlXG4gKiBDb3B5cmlnaHQgMjAyMCBHb29nbGUgTExDLiBBbGwgUmlnaHRzIFJlc2VydmVkLlxuICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlIFwiTGljZW5zZVwiKTtcbiAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS5cbiAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdFxuICpcbiAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMFxuICpcbiAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmVcbiAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuIFwiQVMgSVNcIiBCQVNJUyxcbiAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLlxuICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZFxuICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuXG4gKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuICovXG5cbi8vIEltcG9ydCBzaGFyZWQgZnVuY3Rpb25hbGl0eSBmcm9tIHRmanMtYmFja2VuZC1jcHUgd2l0aG91dCB0cmlnZ2VyaW5nXG4vLyBzaWRlIGVmZmVjdHMuXG4vLyB0c2xpbnQ6ZGlzYWJsZS1uZXh0LWxpbmU6IG5vLWltcG9ydHMtZnJvbS1kaXN0XG5pbXBvcnQgKiBhcyBzaGFyZWQgZnJvbSAnQHRlbnNvcmZsb3cvdGZqcy1iYWNrZW5kLWNwdS9kaXN0L3NoYXJlZCc7XG4vLyB0c2xpbnQ6ZGlzYWJsZS1uZXh0LWxpbmU6IG5vLWltcG9ydHMtZnJvbS1kaXN0XG5pbXBvcnQge1NpbXBsZUJpbmFyeUtlcm5lbEltcGx9IGZyb20gJ0B0ZW5zb3JmbG93L3RmanMtYmFja2VuZC1jcHUvZGlzdC9zaGFyZWQnO1xuLy8gdHNsaW50OmRpc2FibGUtbmV4dC1saW5lOiBuby1pbXBvcnRzLWZyb20tZGlzdFxuaW1wb3J0IHtTaW1wbGVVbmFyeUltcGx9IGZyb20gJ0B0ZW5zb3JmbG93L3RmanMtYmFja2VuZC1jcHUvZGlzdC91dGlscy91bmFyeV90eXBlcyc7XG5cbmV4cG9ydCB0eXBlIFNpbXBsZUJpbmFyeUtlcm5lbEltcGxDUFUgPSBTaW1wbGVCaW5hcnlLZXJuZWxJbXBsO1xuZXhwb3J0IHR5cGUgU2ltcGxlVW5hcnlLZXJuZWxJbXBsQ1BVID0gU2ltcGxlVW5hcnlJbXBsO1xuY29uc3Qge1xuICBhZGRJbXBsOiBhZGRJbXBsQ1BVLFxuICBiaW5jb3VudEltcGw6IGJpbmNvdW50SW1wbENQVSxcbiAgYmluY291bnRSZWR1Y2VJbXBsOiBiaW5jb3VudFJlZHVjZUltcGxDUFUsXG4gIGNhc3RJbXBsOiBjYXN0SW1wbENQVSxcbiAgY2VpbEltcGw6IGNlaWxJbXBsQ1BVLFxuICBjb25jYXRJbXBsOiBjb25jYXRJbXBsQ1BVLFxuICBlcXVhbEltcGw6IGVxdWFsSW1wbENQVSxcbiAgZXhwSW1wbDogZXhwSW1wbENQVSxcbiAgZXhwbTFJbXBsOiBleHBtMUltcGxDUFUsXG4gIGZsb29ySW1wbDogZmxvb3JJbXBsQ1BVLFxuICBnYXRoZXJOZEltcGw6IGdhdGhlck5kSW1wbENQVSxcbiAgZ2F0aGVyVjJJbXBsOiBnYXRoZXJWMkltcGxDUFUsXG4gIGdyZWF0ZXJJbXBsOiBncmVhdGVySW1wbENQVSxcbiAgZ3JlYXRlckVxdWFsSW1wbDogZ3JlYXRlckVxdWFsSW1wbENQVSxcbiAgbGVzc0ltcGw6IGxlc3NJbXBsQ1BVLFxuICBsZXNzRXF1YWxJbXBsOiBsZXNzRXF1YWxJbXBsQ1BVLFxuICBsaW5TcGFjZUltcGw6IGxpblNwYWNlSW1wbENQVSxcbiAgbG9nSW1wbDogbG9nSW1wbENQVSxcbiAgbWF4SW1wbDogbWF4SW1wbENQVSxcbiAgbWF4aW11bUltcGw6IG1heGltdW1JbXBsQ1BVLFxuICBtaW5pbXVtSW1wbDogbWluaW11bUltcGxDUFUsXG4gIG11bHRpcGx5SW1wbDogbXVsdGlwbHlJbXBsQ1BVLFxuICBuZWdJbXBsOiBuZWdJbXBsQ1BVLFxuICBub3RFcXVhbEltcGw6IG5vdEVxdWFsSW1wbENQVSxcbiAgcHJvZEltcGw6IHByb2RJbXBsQ1BVLFxuICByYWdnZWRHYXRoZXJJbXBsOiByYWdnZWRHYXRoZXJJbXBsQ1BVLFxuICByYWdnZWRUZW5zb3JUb1RlbnNvckltcGw6IHJhZ2dlZFRlbnNvclRvVGVuc29ySW1wbENQVSxcbiAgcmFuZ2VJbXBsOiByYW5nZUltcGxDUFUsXG4gIHJzcXJ0SW1wbDogcnNxcnRJbXBsQ1BVLFxuICBzY2F0dGVySW1wbDogc2NhdHRlckltcGxDUFUsXG4gIHNpZ21vaWRJbXBsOiBzaWdtb2lkSW1wbENQVSxcbiAgc2ltcGxlQWJzSW1wbDogc2ltcGxlQWJzSW1wbENQVSxcbiAgc2xpY2VJbXBsOiBzbGljZUltcGxDUFUsXG4gIHNwYXJzZUZpbGxFbXB0eVJvd3NJbXBsOiBzcGFyc2VGaWxsRW1wdHlSb3dzSW1wbENQVSxcbiAgc3BhcnNlUmVzaGFwZUltcGw6IHNwYXJzZVJlc2hhcGVJbXBsQ1BVLFxuICBzcGFyc2VTZWdtZW50UmVkdWN0aW9uSW1wbDogc3BhcnNlU2VnbWVudFJlZHVjdGlvbkltcGxDUFUsXG4gIHNxcnRJbXBsOiBzcXJ0SW1wbENQVSxcbiAgc3RyaWRlZFNsaWNlSW1wbDogc3RyaWRlZFNsaWNlSW1wbENQVSxcbiAgc3RyaW5nTkdyYW1zSW1wbDogc3RyaW5nTkdyYW1zSW1wbENQVSxcbiAgc3RyaW5nU3BsaXRJbXBsOiBzdHJpbmdTcGxpdEltcGxDUFUsXG4gIHN0cmluZ1RvSGFzaEJ1Y2tldEZhc3RJbXBsOiBzdHJpbmdUb0hhc2hCdWNrZXRGYXN0SW1wbENQVSxcbiAgc3ViSW1wbDogc3ViSW1wbENQVSxcbiAgdGlsZUltcGw6IHRpbGVJbXBsQ1BVLFxuICB0b3BLSW1wbDogdG9wS0ltcGxDUFUsXG4gIHRyYW5zcG9zZUltcGw6IHRyYW5zcG9zZUltcGxDUFUsXG4gIHVuaXF1ZUltcGw6IHVuaXF1ZUltcGxDUFUsXG59ID0gc2hhcmVkO1xuXG5leHBvcnQge1xuICBhZGRJbXBsQ1BVLFxuICBiaW5jb3VudEltcGxDUFUsXG4gIGJpbmNvdW50UmVkdWNlSW1wbENQVSxcbiAgY2FzdEltcGxDUFUsXG4gIGNlaWxJbXBsQ1BVLFxuICBjb25jYXRJbXBsQ1BVLFxuICBlcXVhbEltcGxDUFUsXG4gIGV4cEltcGxDUFUsXG4gIGV4cG0xSW1wbENQVSxcbiAgZmxvb3JJbXBsQ1BVLFxuICBnYXRoZXJOZEltcGxDUFUsXG4gIGdhdGhlclYySW1wbENQVSxcbiAgZ3JlYXRlckVxdWFsSW1wbENQVSxcbiAgZ3JlYXRlckltcGxDUFUsXG4gIGxlc3NFcXVhbEltcGxDUFUsXG4gIGxlc3NJbXBsQ1BVLFxuICBsaW5TcGFjZUltcGxDUFUsXG4gIGxvZ0ltcGxDUFUsXG4gIG1heEltcGxDUFUsXG4gIG1heGltdW1JbXBsQ1BVLFxuICBtaW5pbXVtSW1wbENQVSxcbiAgbXVsdGlwbHlJbXBsQ1BVLFxuICBuZWdJbXBsQ1BVLFxuICBub3RFcXVhbEltcGxDUFUsXG4gIHByb2RJbXBsQ1BVLFxuICByYWdnZWRHYXRoZXJJbXBsQ1BVLFxuICByYWdnZWRUZW5zb3JUb1RlbnNvckltcGxDUFUsXG4gIHNjYXR0ZXJJbXBsQ1BVLFxuICBzaWdtb2lkSW1wbENQVSxcbiAgc2ltcGxlQWJzSW1wbENQVSxcbiAgc2xpY2VJbXBsQ1BVLFxuICBzcGFyc2VGaWxsRW1wdHlSb3dzSW1wbENQVSxcbiAgc3BhcnNlUmVzaGFwZUltcGxDUFUsXG4gIHNwYXJzZVNlZ21lbnRSZWR1Y3Rpb25JbXBsQ1BVLFxuICBzcXJ0SW1wbENQVSxcbiAgc3RyaWRlZFNsaWNlSW1wbENQVSxcbiAgc3RyaW5nTkdyYW1zSW1wbENQVSxcbiAgc3RyaW5nU3BsaXRJbXBsQ1BVLFxuICBzdHJpbmdUb0hhc2hCdWNrZXRGYXN0SW1wbENQVSxcbiAgc3ViSW1wbENQVSxcbiAgcmFuZ2VJbXBsQ1BVLFxuICByc3FydEltcGxDUFUsXG4gIHRpbGVJbXBsQ1BVLFxuICB0b3BLSW1wbENQVSxcbiAgdHJhbnNwb3NlSW1wbENQVSxcbiAgdW5pcXVlSW1wbENQVSxcbn07XG4iXX0=","/**\n * @license\n * Copyright 2018 Google LLC. All Rights Reserved.\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n * =============================================================================\n */\nexport function getVecChannels(name, rank) {\n return ['x', 'y', 'z', 'w', 'u', 'v'].slice(0, rank).map(d => `${name}.${d}`);\n}\nexport function getChannels(name, rank) {\n if (rank === 1) {\n return [name];\n }\n return getVecChannels(name, rank);\n}\nexport function getSourceCoords(rank, dims) {\n if (rank === 1) {\n return 'rc';\n }\n let coords = '';\n for (let i = 0; i < rank; i++) {\n coords += dims[i];\n if (i < rank - 1) {\n coords += ',';\n }\n }\n return coords;\n}\n//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicGFja2luZ191dGlsLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vdGZqcy1iYWNrZW5kLXdlYmdsL3NyYy9wYWNraW5nX3V0aWwudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUE7Ozs7Ozs7Ozs7Ozs7OztHQWVHO0FBRUgsTUFBTSxVQUFVLGNBQWMsQ0FBQyxJQUFZLEVBQUUsSUFBWTtJQUN2RCxPQUFPLENBQUMsR0FBRyxFQUFFLEdBQUcsRUFBRSxHQUFHLEVBQUUsR0FBRyxFQUFFLEdBQUcsRUFBRSxHQUFHLENBQUMsQ0FBQyxLQUFLLENBQUMsQ0FBQyxFQUFFLElBQUksQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLEdBQUcsSUFBSSxJQUFJLENBQUMsRUFBRSxDQUFDLENBQUM7QUFDaEYsQ0FBQztBQUVELE1BQU0sVUFBVSxXQUFXLENBQUMsSUFBWSxFQUFFLElBQVk7SUFDcEQsSUFBSSxJQUFJLEtBQUssQ0FBQyxFQUFFO1FBQ2QsT0FBTyxDQUFDLElBQUksQ0FBQyxDQUFDO0tBQ2Y7SUFDRCxPQUFPLGNBQWMsQ0FBQyxJQUFJLEVBQUUsSUFBSSxDQUFDLENBQUM7QUFDcEMsQ0FBQztBQUVELE1BQU0sVUFBVSxlQUFlLENBQUMsSUFBWSxFQUFFLElBQWM7SUFDMUQsSUFBSSxJQUFJLEtBQUssQ0FBQyxFQUFFO1FBQ2QsT0FBTyxJQUFJLENBQUM7S0FDYjtJQUVELElBQUksTUFBTSxHQUFHLEVBQUUsQ0FBQztJQUNoQixLQUFLLElBQUksQ0FBQyxHQUFHLENBQUMsRUFBRSxDQUFDLEdBQUcsSUFBSSxFQUFFLENBQUMsRUFBRSxFQUFFO1FBQzdCLE1BQU0sSUFBSSxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUM7UUFDbEIsSUFBSSxDQUFDLEdBQUcsSUFBSSxHQUFHLENBQUMsRUFBRTtZQUNoQixNQUFNLElBQUksR0FBRyxDQUFDO1NBQ2Y7S0FDRjtJQUNELE9BQU8sTUFBTSxDQUFDO0FBQ2hCLENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyIvKipcbiAqIEBsaWNlbnNlXG4gKiBDb3B5cmlnaHQgMjAxOCBHb29nbGUgTExDLiBBbGwgUmlnaHRzIFJlc2VydmVkLlxuICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlIFwiTGljZW5zZVwiKTtcbiAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS5cbiAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdFxuICpcbiAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMFxuICpcbiAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmVcbiAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuIFwiQVMgSVNcIiBCQVNJUyxcbiAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLlxuICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZFxuICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuXG4gKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuICovXG5cbmV4cG9ydCBmdW5jdGlvbiBnZXRWZWNDaGFubmVscyhuYW1lOiBzdHJpbmcsIHJhbms6IG51bWJlcik6IHN0cmluZ1tdIHtcbiAgcmV0dXJuIFsneCcsICd5JywgJ3onLCAndycsICd1JywgJ3YnXS5zbGljZSgwLCByYW5rKS5tYXAoZCA9PiBgJHtuYW1lfS4ke2R9YCk7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBnZXRDaGFubmVscyhuYW1lOiBzdHJpbmcsIHJhbms6IG51bWJlcik6IHN0cmluZ1tdIHtcbiAgaWYgKHJhbmsgPT09IDEpIHtcbiAgICByZXR1cm4gW25hbWVdO1xuICB9XG4gIHJldHVybiBnZXRWZWNDaGFubmVscyhuYW1lLCByYW5rKTtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGdldFNvdXJjZUNvb3JkcyhyYW5rOiBudW1iZXIsIGRpbXM6IHN0cmluZ1tdKTogc3RyaW5nIHtcbiAgaWYgKHJhbmsgPT09IDEpIHtcbiAgICByZXR1cm4gJ3JjJztcbiAgfVxuXG4gIGxldCBjb29yZHMgPSAnJztcbiAgZm9yIChsZXQgaSA9IDA7IGkgPCByYW5rOyBpKyspIHtcbiAgICBjb29yZHMgKz0gZGltc1tpXTtcbiAgICBpZiAoaSA8IHJhbmsgLSAxKSB7XG4gICAgICBjb29yZHMgKz0gJywnO1xuICAgIH1cbiAgfVxuICByZXR1cm4gY29vcmRzO1xufSJdfQ==","/**\n * @license\n * Copyright 2018 Google LLC. All Rights Reserved.\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n * =============================================================================\n */\nimport { useShapeUniforms } from './gpgpu_math';\nimport { getChannels } from './packing_util';\nimport { getCoordsDataType } from './shader_compiler';\nexport class PackProgram {\n constructor(outputShape) {\n this.variableNames = ['A'];\n this.packedInputs = false;\n this.packedOutput = true;\n // Only input / output 3D tensors.\n this.outputShape = outputShape;\n this.rank = outputShape.length;\n this.enableShapeUniforms = useShapeUniforms(this.outputShape.length);\n if (this.rank === 0) {\n this.userCode = `\n void main() {\n setOutput(vec4(getA(), 0., 0., 0.));\n }\n `;\n }\n else {\n const channels = getChannels('rc', this.rank);\n const dtype = getCoordsDataType(this.rank);\n const outOfBoundsCondition = this.getOutOfBoundsCondition(channels);\n const setup = this.getSetup(channels);\n const output = this.getOutput(channels);\n this.userCode = `\n void main() {\n ${dtype} rc = getOutputCoords();\n\n if(${outOfBoundsCondition}) {\n setOutput(vec4(0));\n } else {\n ${setup}\n\n setOutput(vec4(${output}));\n }\n }\n `;\n }\n }\n getSourceCoordsArr(dims) {\n const coords = [];\n for (let row = 0; row <= 1; row++) {\n for (let col = 0; col <= 1; col++) {\n let coord = `${row === 0 ? 'r' : 'rp1'}, ${col === 0 ? 'c' : 'cp1'}`;\n for (let d = 2; d < this.rank; d++) {\n coord = `${dims[dims.length - 1 - d]},` + coord;\n }\n coords.push(coord);\n }\n }\n return coords;\n }\n getOutOfBoundsCondition(dims) {\n if (this.rank === 1) {\n return `rc > ${this.enableShapeUniforms ? 'outShape' : this.outputShape[0]}`;\n }\n let cond = '';\n for (let i = this.rank - 2; i < this.rank; i++) {\n cond += `${dims[i]} >= ${this.enableShapeUniforms ? `outShape[${i}]` : this.outputShape[i]}`;\n if (i < this.rank - 1) {\n cond += '||';\n }\n }\n return cond;\n }\n getSetup(dims) {\n if (this.rank === 1) {\n return '';\n }\n const innerDims = dims.slice(-2);\n const col = this.enableShapeUniforms ? `outShape[${this.rank} - 1]` :\n this.outputShape[this.rank - 1];\n const row = this.enableShapeUniforms ? `outShape[${this.rank} - 2]` :\n this.outputShape[this.rank - 2];\n return `\n int r = ${innerDims[0]};\n int c = ${innerDims[1]};\n int rp1 = r + 1;\n int cp1 = c + 1;\n\n bool cEdge = cp1 >= ${col};\n bool rEdge = rp1 >= ${row};\n `;\n }\n getOutput(dims) {\n const sourceCoords = this.getSourceCoordsArr(dims);\n if (this.rank === 1) {\n const outShape = this.enableShapeUniforms ? 'outShape' : this.outputShape[0];\n return `getA(rc), (rc + 1 >= ${outShape} ? 0. : getA(rc + 1)), 0, 0`;\n }\n return `getA(${sourceCoords[0]}),\n cEdge ? 0. : getA(${sourceCoords[1]}),\n rEdge ? 0. : getA(${sourceCoords[2]}),\n rEdge || cEdge ? 0. : getA(${sourceCoords[3]})`;\n }\n}\n//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicGFja19ncHUuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi90ZmpzLWJhY2tlbmQtd2ViZ2wvc3JjL3BhY2tfZ3B1LnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBOzs7Ozs7Ozs7Ozs7Ozs7R0FlRztBQUVILE9BQU8sRUFBZSxnQkFBZ0IsRUFBQyxNQUFNLGNBQWMsQ0FBQztBQUM1RCxPQUFPLEVBQUMsV0FBVyxFQUFDLE1BQU0sZ0JBQWdCLENBQUM7QUFDM0MsT0FBTyxFQUFDLGlCQUFpQixFQUFDLE1BQU0sbUJBQW1CLENBQUM7QUFFcEQsTUFBTSxPQUFPLFdBQVc7SUFTdEIsWUFDSSxXQUNZO1FBVmhCLGtCQUFhLEdBQUcsQ0FBQyxHQUFHLENBQUMsQ0FBQztRQUd0QixpQkFBWSxHQUFHLEtBQUssQ0FBQztRQUNyQixpQkFBWSxHQUFHLElBQUksQ0FBQztRQU9DLGtDQUFrQztRQUNyRCxJQUFJLENBQUMsV0FBVyxHQUFHLFdBQVcsQ0FBQztRQUMvQixJQUFJLENBQUMsSUFBSSxHQUFHLFdBQVcsQ0FBQyxNQUFNLENBQUM7UUFDL0IsSUFBSSxDQUFDLG1CQUFtQixHQUFHLGdCQUFnQixDQUFDLElBQUksQ0FBQyxXQUFXLENBQUMsTUFBTSxDQUFDLENBQUM7UUFFckUsSUFBSSxJQUFJLENBQUMsSUFBSSxLQUFLLENBQUMsRUFBRTtZQUNuQixJQUFJLENBQUMsUUFBUSxHQUFHOzs7O09BSWYsQ0FBQztTQUNIO2FBQU07WUFDTCxNQUFNLFFBQVEsR0FBRyxXQUFXLENBQUMsSUFBSSxFQUFFLElBQUksQ0FBQyxJQUFJLENBQUMsQ0FBQztZQUM5QyxNQUFNLEtBQUssR0FBRyxpQkFBaUIsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLENBQUM7WUFDM0MsTUFBTSxvQkFBb0IsR0FBRyxJQUFJLENBQUMsdUJBQXVCLENBQUMsUUFBUSxDQUFDLENBQUM7WUFDcEUsTUFBTSxLQUFLLEdBQUcsSUFBSSxDQUFDLFFBQVEsQ0FB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Q0FBQztRQUV2RSxPQUFPO2dCQUNLLFNBQVMsQ0FBQyxDQUFDLENBQUM7Z0JBQ1osU0FBUyxDQUFDLENBQUMsQ0FBQzs7Ozs0QkFJQSxHQUFHOzRCQUNILEdBQUc7S0FDMUIsQ0FBQztJQUNKLENBQUM7SUFFTyxTQUFTLENBQUMsSUFBYztRQUM5QixNQUFNLFlBQVksR0FBRyxJQUFJLENBQUMsa0JBQWtCLENBQUMsSUFBSSxDQUFDLENBQUM7UUFDbkQsSUFBSSxJQUFJLENBQUMsSUFBSSxLQUFLLENBQUMsRUFBRTtZQUNuQixNQUFNLFFBQVEsR0FDVixJQUFJLENBQUMsbUJBQW1CLENBQUMsQ0FBQyxDQUFDLFVBQVUsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLFdBQVcsQ0FBQyxDQUFDLENBQUMsQ0FBQztZQUNoRSxPQUFPLHdCQUF3QixRQUFRLDZCQUE2QixDQUFDO1NBQ3RFO1FBRUQsT0FBTyxRQUFRLFlBQVksQ0FBQyxDQUFDLENBQUM7Z0NBQ0YsWUFBWSxDQUFDLENBQUMsQ0FBQztnQ0FDZixZQUFZLENBQUMsQ0FBQyxDQUFDO3lDQUNOLFlBQVksQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDO0lBQzFELENBQUM7Q0FDRiIsInNvdXJjZXNDb250ZW50IjpbIi8qKlxuICogQGxpY2Vuc2VcbiAqIENvcHlyaWdodCAyMDE4IEdvb2dsZSBMTEMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuXG4gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgXCJMaWNlbnNlXCIpO1xuICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLlxuICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0XG4gKlxuICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wXG4gKlxuICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZVxuICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gXCJBUyBJU1wiIEJBU0lTLFxuICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuXG4gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kXG4gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS5cbiAqID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4gKi9cblxuaW1wb3J0IHtHUEdQVVByb2dyYW0sIHVzZVNoYXBlVW5pZm9ybXN9IGZyb20gJy4vZ3BncHVfbWF0aCc7XG5pbXBvcnQge2dldENoYW5uZWxzfSBmcm9tICcuL3BhY2tpbmdfdXRpbCc7XG5pbXBvcnQge2dldENvb3Jkc0RhdGFUeXBlfSBmcm9tICcuL3NoYWRlcl9jb21waWxlcic7XG5cbmV4cG9ydCBjbGFzcyBQYWNrUHJvZ3JhbSBpbXBsZW1lbnRzIEdQR1BVUHJvZ3JhbSB7XG4gIHZhcmlhYmxlTmFtZXMgPSBbJ0EnXTtcbiAgb3V0cHV0U2hhcGU6IG51bWJlcltdO1xuICB1c2VyQ29kZTogc3RyaW5nO1xuICBwYWNrZWRJbnB1dHMgPSBmYWxzZTtcbiAgcGFja2VkT3V0cHV0ID0gdHJ1ZTtcbiAgZW5hYmxlU2hhcGVVbmlmb3JtczogYm9vbGVhbjtcbiAgcmFuazogbnVtYmVyO1xuXG4gIGNvbnN0cnVjdG9yKFxuICAgICAgb3V0cHV0U2hhcGU6XG4gICAgICAgICAgbnVtYmVyW10pIHsgIC8vIFRPRE8oaHR0cHM6Ly9naXRodWIuY29tL3RlbnNvcmZsb3cvdGZqcy9pc3N1ZXMvODkzKTpcbiAgICAgICAgICAgICAgICAgICAgICAgLy8gT25seSBpbnB1dCAvIG91dHB1dCAzRCB0ZW5zb3JzLlxuICAgIHRoaXMub3V0cHV0U2hhcGUgPSBvdXRwdXRTaGFwZTtcbiAgICB0aGlzLnJhbmsgPSBvdXRwdXRTaGFwZS5sZW5ndGg7XG4gICAgdGhpcy5lbmFibGVTaGFwZVVuaWZvcm1zID0gdXNlU2hhcGVVbmlmb3Jtcyh0aGlzLm91dHB1dFNoYXBlLmxlbmd0aCk7XG5cbiAgICBpZiAodGhpcy5yYW5rID09PSAwKSB7XG4gICAgICB0aGlzLnVzZXJDb2RlID0gYFxuICAgICAgICB2b2lkIG1haW4oKSB7XG4gICAgICAgICAgc2V0T3V0cHV0KHZlYzQoZ2V0QSgpLCAwLiwgMC4sIDAuKSk7XG4gICAgICAgIH1cbiAgICAgIGA7XG4gICAgfSBlbHNlIHtcbiAgICAgIGNvbnN0IGNoYW5uZWxzID0gZ2V0Q2hhbm5lbHMoJ3JjJywgdGhpcy5yYW5rKTtcbiAgICAgIGNvbnN0IGR0eXBlID0gZ2V0Q29vcmRzRGF0YVR5cGUodGhpcy5yYW5rKTtcbiAgICAgIGNvbnN0IG91dE9mQm91bmRzQ29uZGl0aW9uID0gdGhpcy5nZXRPdXRPZkJvdW5kc0NvbmRpdGlvbihjaGFubmVscyk7XG4gICAgICBjb25zdCBzZXR1cCA9IHRoaXMuZ2V0U2V0dXAoY2hhbm5lbHMpO1xuICAgICAgY29uc3Qgb3V0cHV0ID0gdGhpcy5nZXRPdXRwdXQoY2hhbm5lbHMpO1xuXG4gICAgICB0aGlzLnVzZXJDb2RlID0gYFxuICAgICAgICB2b2lkIG1haW4oKSB7XG4gICAgICAgICAgJHtkdHlwZX0gcmMgPSBnZXRPdXRwdXRDb29yZHMoKTtcblxuICAgICAgICAgIGlmKCR7b3V0T2ZCb3VuZHNDb25kaXRpb259KSB7XG4gICAgICAgICAgICBzZXRPdXRwdXQodmVjNCgwKSk7XG4gICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICR7c2V0dXB9XG5cbiAgICAgICAgICAgIHNldE91dHB1dCh2ZWM0KCR7b3V0cHV0fSkpO1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgYDtcbiAgICB9XG4gIH1cblxuICBwcml2YXRlIGdldFNvdXJjZUNvb3Jkc0FycihkaW1zOiBzdHJpbmdbXSk6IHN0cmluZ1tdIHtcbiAgICBjb25zdCBjb29yZHMgPSBbXTtcblxuICAgIGZvciAobGV0IHJvdyA9IDA7IHJvdyA8PSAxOyByb3crKykge1xuICAgICAgZm9yIChsZXQgY29sID0gMDsgY29sIDw9IDE7IGNvbCsrKSB7XG4gICAgICAgIGxldCBjb29yZCA9IGAke3JvdyA9PT0gMCA/ICdyJyA6ICdycDEnfSwgJHtjb2wgPT09IDAgPyAnYycgOiAnY3AxJ31gO1xuXG4gICAgICAgIGZvciAobGV0IGQgPSAyOyBkIDwgdGhpcy5yYW5rOyBkKyspIHtcbiAgICAgICAgICBjb29yZCA9IGAke2RpbXNbZGltcy5sZW5ndGggLSAxIC0gZF19LGAgKyBjb29yZDtcbiAgICAgICAgfVxuXG4gICAgICAgIGNvb3Jkcy5wdXNoKGNvb3JkKTtcbiAgICAgIH1cbiAgICB9XG4gICAgcmV0dXJuIGNvb3JkcztcbiAgfVxuXG4gIHByaXZhdGUgZ2V0T3V0T2ZCb3VuZHNDb25kaXRpb24oZGltczogc3RyaW5nW10pOiBzdHJpbmcge1xuICAgIGlmICh0aGlzLnJhbmsgPT09IDEpIHtcbiAgICAgIHJldHVybiBgcmMgPiAke1xuICAgICAgICAgIHRoaXMuZW5hYmxlU2hhcGVVbmlmb3JtcyA/ICdvdXRTaGFwZScgOiB0aGlzLm91dHB1dFNoYXBlWzBdfWA7XG4gICAgfVxuXG4gICAgbGV0IGNvbmQgPSAnJztcbiAgICBmb3IgKGxldCBpID0gdGhpcy5yYW5rIC0gMjsgaSA8IHRoaXMucmFuazsgaSsrKSB7XG4gICAgICBjb25kICs9IGAke2RpbXNbaV19ID49ICR7XG4gICAgICAgICAgdGhpcy5lbmFibGVTaGFwZVVuaWZvcm1zID8gYG91dFNoYXBlWyR7aX1dYCA6IHRoaXMub3V0cHV0U2hhcGVbaV19YDtcbiAgICAgIGlmIChpIDwgdGhpcy5yYW5rIC0gMSkge1xuICAgICAgICBjb25kICs9ICd8fCc7XG4gICAgICB9XG4gICAgfVxuXG4gICAgcmV0dXJuIGNvbmQ7XG4gIH1cblxuICBwcml2YXRlIGdldFNldHVwKGRpbXM6IHN0cmluZ1tdKTogc3RyaW5nIHtcbiAgICBpZiAodGhpcy5yYW5rID09PSAxKSB7XG4gICAgICByZXR1cm4gJyc7XG4gICAgfVxuXG4gICAgY29uc3QgaW5uZXJEaW1zID0gZGltcy5zbGljZSgtMik7XG4gICAgY29uc3QgY29sID0gdGhpcy5lbmFibGVTaGFwZVVuaWZvcm1zID8gYG91dFNoYXBlWyR7dGhpcy5yYW5rfSAtIDFdYCA6XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5vdXRwdXRTaGFwZVt0aGlzLnJhbmsgLSAxXTtcbiAgICBjb25zdCByb3cgPSB0aGlzLmVuYWJsZVNoYXBlVW5pZm9ybXMgPyBgb3V0U2hhcGVbJHt0aGlzLnJhbmt9IC0gMl1gIDpcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGlzLm91dHB1dFNoYXBlW3RoaXMucmFuayAtIDJdO1xuXG4gICAgcmV0dXJuIGBcbiAgICAgIGludCByID0gJHtpbm5lckRpbXNbMF19O1xuICAgICAgaW50IGMgPSAke2lubmVyRGltc1sxXX07XG4gICAgICBpbnQgcnAxID0gciArIDE7XG4gICAgICBpbnQgY3AxID0gYyArIDE7XG5cbiAgICAgIGJvb2wgY0VkZ2UgPSBjcDEgPj0gJHtjb2x9O1xuICAgICAgYm9vbCByRWRnZSA9IHJwMSA+PSAke3Jvd307XG4gICAgYDtcbiAgfVxuXG4gIHByaXZhdGUgZ2V0T3V0cHV0KGRpbXM6IHN0cmluZ1tdKTogc3RyaW5nIHtcbiAgICBjb25zdCBzb3VyY2VDb29yZHMgPSB0aGlzLmdldFNvdXJjZUNvb3Jkc0FycihkaW1zKTtcbiAgICBpZiAodGhpcy5yYW5rID09PSAxKSB7XG4gICAgICBjb25zdCBvdXRTaGFwZSA9XG4gICAgICAgICAgdGhpcy5lbmFibGVTaGFwZVVuaWZvcm1zID8gJ291dFNoYXBlJyA6IHRoaXMub3V0cHV0U2hhcGVbMF07XG4gICAgICByZXR1cm4gYGdldEEocmMpLCAocmMgKyAxID49ICR7b3V0U2hhcGV9ID8gMC4gOiBnZXRBKHJjICsgMSkpLCAwLCAwYDtcbiAgICB9XG5cbiAgICByZXR1cm4gYGdldEEoJHtzb3VyY2VDb29yZHNbMF19KSxcbiAgICAgICAgICAgIGNFZGdlID8gMC4gOiBnZXRBKCR7c291cmNlQ29vcmRzWzFdfSksXG4gICAgICAgICAgICByRWRnZSA/IDAuIDogZ2V0QSgke3NvdXJjZUNvb3Jkc1syXX0pLFxuICAgICAgICAgICAgckVkZ2UgfHwgY0VkZ2UgPyAwLiA6IGdldEEoJHtzb3VyY2VDb29yZHNbM119KWA7XG4gIH1cbn1cbiJdfQ==","/**\n * @license\n * Copyright 2018 Google LLC. All Rights Reserved.\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n * =============================================================================\n */\nimport { useShapeUniforms } from './gpgpu_math';\nimport * as shader_util from './shader_compiler_util';\nexport class ReshapePackedProgram {\n constructor(outputShape, inputShape) {\n this.variableNames = ['A'];\n this.packedInputs = true;\n this.packedOutput = true;\n this.customUniforms = [{ name: 'inputShape', type: 'ivec3' }];\n this.outputShape = outputShape;\n this.enableShapeUniforms = useShapeUniforms(this.outputShape.length);\n let mainLoop = ``;\n for (let i = 0; i < 4; i++) {\n let thisRC = `thisRC = rc;`;\n if (i % 2 === 1) {\n thisRC += `thisRC.z += 1;`;\n }\n if (i > 1) {\n thisRC += `thisRC.y += 1;`;\n }\n mainLoop += `\n ${thisRC}\n ${i > 0 ? `if(thisRC.y < rows && thisRC.z < cols){` : ''}\n int flatIndex = getFlatIndex(thisRC);\n\n ivec3 inputRC = inputCoordsFromReshapedOutCoords(flatIndex);\n vec2 inputRCInnerDims = vec2(float(inputRC.y),float(inputRC.z));\n\n result[${i}] =\n getChannel(getA(inputRC.x, inputRC.y, inputRC.z), inputRCInnerDims);\n ${i > 0 ? '}' : ''}\n `;\n }\n this.userCode = `\n ${getReshapedInputCoords(inputShape, this.enableShapeUniforms)}\n ${this.enableShapeUniforms ? shader_util.getFlatIndexFrom3DOutput() :\n shader_util.getFlatIndexFrom3D(outputShape)}\n\n void main() {\n ivec3 rc = getOutputCoords();\n\n vec4 result = vec4(0.);\n\n ivec3 thisRC;\n int rows = ${this.enableShapeUniforms ? 'outShape[1]' : outputShape[1]};\n int cols = ${this.enableShapeUniforms ? 'outShape[2]' : outputShape[2]};\n\n ${mainLoop}\n\n setOutput(result);\n }\n `;\n }\n}\nfunction getReshapedInputCoords(shape, enableShapeUniforms) {\n const coordsFromIndexSnippet = enableShapeUniforms ?\n shader_util.getLogicalCoordinatesFromFlatIndexByUniform(['r', 'c', 'd'], 'inputShape') :\n shader_util.getLogicalCoordinatesFromFlatIndex(['r', 'c', 'd'], shape);\n return `\n ivec3 inputCoordsFromReshapedOutCoords(int index) {\n ${coordsFromIndexSnippet}\n return ivec3(r, c, d);\n }\n `;\n}\n//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicmVzaGFwZV9wYWNrZWRfZ3B1LmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vdGZqcy1iYWNrZW5kLXdlYmdsL3NyYy9yZXNoYXBlX3BhY2tlZF9ncHUudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUE7Ozs7Ozs7Ozs7Ozs7OztHQWVHO0FBRUgsT0FBTyxFQUFlLGdCQUFnQixFQUFDLE1BQU0sY0FBYyxDQUFDO0FBQzVELE9BQU8sS0FBSyxXQUFXLE1BQU0sd0JBQXdCLENBQUM7QUFFdEQsTUFBTSxPQUFPLG9CQUFvQjtJQVMvQixZQUFZLFdBQXFDLEVBQUUsVUFFbEQ7UUFWRCxrQkFBYSxHQUFHLENBQUMsR0FBRyxDQUFDLENBQUM7UUFDdEIsaUJBQVksR0FBRyxJQUFJLENBQUM7UUFDcEIsaUJBQVksR0FBRyxJQUFJLENBQUM7UUFJcEIsbUJBQWMsR0FBRyxDQUFDLEVBQUMsSUFBSSxFQUFFLFlBQVksRUFBRSxJQUFJLEVBQUUsT0FBZ0IsRUFBRSxDQUFDLENBQUM7UUFLL0QsSUFBSSxDQUFDLFdBQVcsR0FBRyxXQUFXLENBQUM7UUFDL0IsSUFBSSxDQUFDLG1CQUFtQixHQUFHLGdCQUFnQixDQUFDLElBQUksQ0FBQyxXQUFXLENBQUMsTUFBTSxDQUFDLENBQUM7UUFFckUsSUFBSSxRQUFRLEdBQUcsRUFBRSxDQUFDO1FBQ2xCLEtBQUssSUFBSSxDQUFDLEdBQUcsQ0FBQyxFQUFFLENBQUMsR0FBRyxDQUFDLEVBQUUsQ0FBQyxFQUFFLEVBQUU7WUFDMUIsSUFBSSxNQUFNLEdBQUcsY0FBYyxDQUFDO1lBQzVCLElBQUksQ0FBQyxHQUFHLENBQUMsS0FBSyxDQUFDLEVBQUU7Z0JBQ2YsTUFBTSxJQUFJLGdCQUFnQixDQUFDO2FBQzVCO1lBQ0QsSUFBSSxDQUFDLEdBQUcsQ0FBQyxFQUFFO2dCQUNULE1BQU0sSUFBSSxnQkFBZ0IsQ0FBQzthQUM1QjtZQUVELFFBQVEsSUFBSTtVQUNSLE1BQU07VUFDTixDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyx5Q0FBeUMsQ0FBQyxDQUFDLENBQUMsRUFBRTs7Ozs7O21CQU03QyxDQUFDOztVQUVWLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsRUFBRTtPQUNuQixDQUFDO1NBQ0g7UUFFRCxJQUFJLENBQUMsUUFBUSxHQUFHO1FBQ1osc0JBQXNCLENBQUMsVUFBVSxFQUFFLElBQUksQ0FBQyxtQkFBbUIsQ0FBQztRQUU1RCxJQUFJLENBQUMsbUJBQW1CLENBQUMsQ0FBQyxDQUFDLFdBQVcsQ0FBQyx3QkFBd0IsRUFBRSxDQUFDLENBQUM7WUFDeEMsV0FBVyxDQUFDLGtCQUFrQixDQUFDLFdBQVcsQ0FBQzs7Ozs7Ozs7cUJBUXpELElBQUksQ0FBQyxtQkFBbUIsQ0FBQyxDQUFDLENBQUMsYUFBYSxDQUFDLENBQUMsQ0FBQyxXQUFXLENBQUMsQ0FBQyxDQUFDO3FCQUN6RCxJQUFJLENBQUMsbUJBQW1CLENBQUMsQ0FBQyxDQUFDLGFBQWEsQ0FBQyxDQUFDLENBQUMsV0FBVyxDQUFDLENBQUMsQ0FBQzs7VUFFcEUsUUFBUTs7OztLQUliLENBQUM7SUFDSixDQUFDO0NBQ0Y7QUFFRCxTQUFTLHNCQUFzQixDQUMzQixLQUErQixFQUFFLG1CQUE0QjtJQUMvRCxNQUFNLHNCQUFzQixHQUFHLG1CQUFtQixDQUFDLENBQUM7UUFDaEQsV0FBVyxDQUFDLDJDQUEyQyxDQUNuRCxDQUFDLEdBQUcsRUFBRSxHQUFHLEVBQUUsR0FBRyxDQUFDLEVBQUUsWUFBWSxDQUFDLENBQUMsQ0FBQztRQUNwQyxXQUFXLENBQUMsa0NBQWtDLENBQUMsQ0FBQyxHQUFHLEVBQUUsR0FBRyxFQUFFLEdBQUcsQ0FBQyxFQUFFLEtBQUssQ0FBQyxDQUFDO0lBRTNFLE9BQU87O1FBRUQsc0JBQXNCOzs7R0FHM0IsQ0FBQztBQUNKLENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyIvKipcbiAqIEBsaWNlbnNlXG4gKiBDb3B5cmlnaHQgMjAxOCBHb29nbGUgTExDLiBBbGwgUmlnaHRzIFJlc2VydmVkLlxuICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlIFwiTGljZW5zZVwiKTtcbiAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS5cbiAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdFxuICpcbiAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMFxuICpcbiAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmVcbiAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuIFwiQVMgSVNcIiBCQVNJUyxcbiAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLlxuICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZFxuICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuXG4gKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuICovXG5cbmltcG9ydCB7R1BHUFVQcm9ncmFtLCB1c2VTaGFwZVVuaWZvcm1zfSBmcm9tICcuL2dwZ3B1X21hdGgnO1xuaW1wb3J0ICogYXMgc2hhZGVyX3V0aWwgZnJvbSAnLi9zaGFkZXJfY29tcGlsZXJfdXRpbCc7XG5cbmV4cG9ydCBjbGFzcyBSZXNoYXBlUGFja2VkUHJvZ3JhbSBpbXBsZW1lbnRzIEdQR1BVUHJvZ3JhbSB7XG4gIHZhcmlhYmxlTmFtZXMgPSBbJ0EnXTtcbiAgcGFja2VkSW5wdXRzID0gdHJ1ZTtcbiAgcGFja2VkT3V0cHV0ID0gdHJ1ZTtcbiAgb3V0cHV0U2hhcGU6IG51bWJlcltdO1xuICB1c2VyQ29kZTogc3RyaW5nO1xuICBlbmFibGVTaGFwZVVuaWZvcm1zOiBib29sZWFuO1xuICBjdXN0b21Vbmlmb3JtcyA9IFt7bmFtZTogJ2lucHV0U2hhcGUnLCB0eXBlOiAnaXZlYzMnIGFzIGNvbnN0IH1dO1xuXG4gIGNvbnN0cnVjdG9yKG91dHB1dFNoYXBlOiBbbnVtYmVyLCBudW1iZXIsIG51bWJlcl0sIGlucHV0U2hhcGU6IFtcbiAgICBudW1iZXIsIG51bWJlciwgbnVtYmVyXG4gIF0pIHtcbiAgICB0aGlzLm91dHB1dFNoYXBlID0gb3V0cHV0U2hhcGU7XG4gICAgdGhpcy5lbmFibGVTaGFwZVVuaWZvcm1zID0gdXNlU2hhcGVVbmlmb3Jtcyh0aGlzLm91dHB1dFNoYXBlLmxlbmd0aCk7XG5cbiAgICBsZXQgbWFpbkxvb3AgPSBgYDtcbiAgICBmb3IgKGxldCBpID0gMDsgaSA8IDQ7IGkrKykge1xuICAgICAgbGV0IHRoaXNSQyA9IGB0aGlzUkMgPSByYztgO1xuICAgICAgaWYgKGkgJSAyID09PSAxKSB7XG4gICAgICAgIHRoaXNSQyArPSBgdGhpc1JDLnogKz0gMTtgO1xuICAgICAgfVxuICAgICAgaWYgKGkgPiAxKSB7XG4gICAgICAgIHRoaXNSQyArPSBgdGhpc1JDLnkgKz0gMTtgO1xuICAgICAgfVxuXG4gICAgICBtYWluTG9vcCArPSBgXG4gICAgICAgICR7dGhpc1JDfVxuICAgICAgICAke2kgPiAwID8gYGlmKHRoaXNSQy55IDwgcm93cyAmJiB0aGlzUkMueiA8IGNvbHMpe2AgOiAnJ31cbiAgICAgICAgICBpbnQgZmxhdEluZGV4ID0gZ2V0RmxhdEluZGV4KHRoaXNSQyk7XG5cbiAgICAgICAgICBpdmVjMyBpbnB1dFJDID0gaW5wdXRDb29yZHNGcm9tUmVzaGFwZWRPdXRDb29yZHMoZmxhdEluZGV4KTtcbiAgICAgICAgICB2ZWMyIGlucHV0UkNJbm5lckRpbXMgPSB2ZWMyKGZsb2F0KGlucHV0UkMueSksZmxvYXQoaW5wdXRSQy56KSk7XG5cbiAgICAgICAgICByZXN1bHRbJHtpfV0gPVxuICAgICAgICAgICAgZ2V0Q2hhbm5lbChnZXRBKGlucHV0UkMueCwgaW5wdXRSQy55LCBpbnB1dFJDLnopLCBpbnB1dFJDSW5uZXJEaW1zKTtcbiAgICAgICAgJHtpID4gMCA/ICd9JyA6ICcnfVxuICAgICAgYDtcbiAgICB9XG5cbiAgICB0aGlzLnVzZXJDb2RlID0gYFxuICAgICAgJHtnZXRSZXNoYXBlZElucHV0Q29vcmRzKGlucHV0U2hhcGUsIHRoaXMuZW5hYmxlU2hhcGVVbmlmb3Jtcyl9XG4gICAgICAke1xuICAgICAgICB0aGlzLmVuYWJsZVNoYXBlVW5pZm9ybXMgPyBzaGFkZXJfdXRpbC5nZXRGbGF0SW5kZXhGcm9tM0RPdXRwdXQoKSA6XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNoYWRlcl91dGlsLmdldEZsYXRJbmRleEZyb20zRChvdXRwdXRTaGFwZSl9XG5cbiAgICAgIHZvaWQgbWFpbigpIHtcbiAgICAgICAgaXZlYzMgcmMgPSBnZXRPdXRwdXRDb29yZHMoKTtcblxuICAgICAgICB2ZWM0IHJlc3VsdCA9IHZlYzQoMC4pO1xuXG4gICAgICAgIGl2ZWMzIHRoaXNSQztcbiAgICAgICAgaW50IHJvd3MgPSAke3RoaXMuZW5hYmxlU2hhcGVVbmlmb3JtcyA/ICdvdXRTaGFwZVsxXScgOiBvdXRwdXRTaGFwZVsxXX07XG4gICAgICAgIGludCBjb2xzID0gJHt0aGlzLmVuYWJsZVNoYXBlVW5pZm9ybXMgPyAnb3V0U2hhcGVbMl0nIDogb3V0cHV0U2hhcGVbMl19O1xuXG4gICAgICAgICR7bWFpbkxvb3B9XG5cbiAgICAgICAgc2V0T3V0cHV0KHJlc3VsdCk7XG4gICAgICB9XG4gICAgYDtcbiAgfVxufVxuXG5mdW5jdGlvbiBnZXRSZXNoYXBlZElucHV0Q29vcmRzKFxuICAgIHNoYXBlOiBbbnVtYmVyLCBudW1iZXIsIG51bWJlcl0sIGVuYWJsZVNoYXBlVW5pZm9ybXM6IGJvb2xlYW4pOiBzdHJpbmcge1xuICBjb25zdCBjb29yZHNGcm9tSW5kZXhTbmlwcGV0ID0gZW5hYmxlU2hhcGVVbmlmb3JtcyA/XG4gICAgICBzaGFkZXJfdXRpbC5nZXRMb2dpY2FsQ29vcmRpbmF0ZXNGcm9tRmxhdEluZGV4QnlVbmlmb3JtKFxuICAgICAgICAgIFsncicsICdjJywgJ2QnXSwgJ2lucHV0U2hhcGUnKSA6XG4gICAgICBzaGFkZXJfdXRpbC5nZXRMb2dpY2FsQ29vcmRpbmF0ZXNGcm9tRmxhdEluZGV4KFsncicsICdjJywgJ2QnXSwgc2hhcGUpO1xuXG4gIHJldHVybiBgXG4gICAgaXZlYzMgaW5wdXRDb29yZHNGcm9tUmVzaGFwZWRPdXRDb29yZHMoaW50IGluZGV4KSB7XG4gICAgICAke2Nvb3Jkc0Zyb21JbmRleFNuaXBwZXR9XG4gICAgICByZXR1cm4gaXZlYzMociwgYywgZCk7XG4gICAgfVxuICBgO1xufVxuIl19","/**\n * @license\n * Copyright 2017 Google LLC. All Rights Reserved.\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n * =============================================================================\n */\nimport { env } from '@tensorflow/tfjs-core';\nimport { getInternalFormatForFloat16MatrixTexture, getInternalFormatForFloat16PackedMatrixTexture, getInternalFormatForFloat32MatrixTexture, getInternalFormatForPackedMatrixTexture, getInternalFormatForUnsignedBytesMatrixTexture } from './gpgpu_util';\nimport { getPackedMatrixTextureShapeWidthHeight, getUnpackedMatrixTextureShapeWidthHeight, PhysicalTextureType, TextureUsage } from './tex_util';\nexport class TextureManager {\n constructor(gpgpu) {\n this.gpgpu = gpgpu;\n this.numUsedTextures = 0;\n this.numFreeTextures = 0;\n this._numBytesAllocated = 0;\n this._numBytesFree = 0; // How many bytes that have been allocated\n // are available for reuse.\n this.freeTextures = {};\n this.logEnabled = false;\n this.usedTextures = {};\n }\n acquireTexture(shapeRC, usage, isPacked) {\n const physicalTexType = getPhysicalFromLogicalTextureType(usage, isPacked);\n const shapeKey = getKeyFromTextureShape(shapeRC, physicalTexType, isPacked);\n if (!(shapeKey in this.freeTextures)) {\n this.freeTextures[shapeKey] = [];\n }\n if (!(shapeKey in this.usedTextures)) {\n this.usedTextures[shapeKey] = [];\n }\n const texBytes = computeBytes(shapeRC, physicalTexType, this.gpgpu.gl, this.gpgpu.textureConfig, isPacked);\n if (this.freeTextures[shapeKey].length > 0) {\n this.numFreeTextures--;\n this.numUsedTextures++;\n this._numBytesFree -= texBytes;\n this.log();\n const newTexture = this.freeTextures[shapeKey].shift();\n this.usedTextures[shapeKey].push(newTexture);\n return newTexture;\n }\n let newTexture;\n if (physicalTexType === PhysicalTextureType.PACKED_2X2_FLOAT32) {\n newTexture = this.gpgpu.createPackedMatrixTexture(shapeRC[0], shapeRC[1]);\n }\n else if (physicalTexType === PhysicalTextureType.PACKED_2X2_FLOAT16) {\n newTexture =\n this.gpgpu.createFloat16PackedMatrixTexture(shapeRC[0], shapeRC[1]);\n }\n else if (physicalTexType === PhysicalTextureType.UNPACKED_FLOAT32) {\n newTexture =\n this.gpgpu.createFloat32MatrixTexture(shapeRC[0], shapeRC[1]);\n }\n else if (physicalTexType === PhysicalTextureType.UNPACKED_FLOAT16) {\n newTexture =\n this.gpgpu.createFloat16MatrixTexture(shapeRC[0], shapeRC[1]);\n }\n else if (physicalTexType === PhysicalTextureType.PACKED_4X1_UNSIGNED_BYTE) {\n newTexture =\n this.gpgpu.createUnsignedBytesMatrixTexture(shapeRC[0], shapeRC[1]);\n }\n this.usedTextures[shapeKey].push(newTexture);\n this.numUsedTextures++;\n this._numBytesAllocated += texBytes;\n this.log();\n return newTexture;\n }\n releaseTexture(texture, shape, logicalTexType, isPacked) {\n if (this.freeTextures == null) {\n // Already disposed.\n return;\n }\n const physicalTexType = getPhysicalFromLogicalTextureType(logicalTexType, isPacked);\n const shapeKey = getKeyFromTextureShape(shape, physicalTexType, isPacked);\n if (!(shapeKey in this.freeTextures)) {\n this.freeTextures[shapeKey] = [];\n }\n const texBytes = computeBytes(shape, physicalTexType, this.gpgpu.gl, this.gpgpu.textureConfig, isPacked);\n const deleteTexThreshold = env().get('WEBGL_DELETE_TEXTURE_THRESHOLD');\n if (deleteTexThreshold !== -1 &&\n this._numBytesAllocated > deleteTexThreshold) {\n this.gpgpu.deleteMatrixTexture(texture.texture);\n this._numBytesAllocated -= texBytes;\n }\n else {\n this.freeTextures[shapeKey].push(texture);\n this.numFreeTextures++;\n this._numBytesFree += texBytes;\n }\n this.numUsedTextures--;\n const texList = this.usedTextures[shapeKey];\n const texIndex = texList.indexOf(texture);\n if (texIndex < 0) {\n throw new Error('Cannot release a texture that was never provided by this ' +\n 'texture manager');\n }\n texList.splice(texIndex, 1);\n this.log();\n }\n log() {\n if (!this.logEnabled) {\n return;\n }\n const total = this.numFreeTextures + this.numUsedTextures;\n console.log('Free/Used', `${this.numFreeTextures} / ${this.numUsedTextures}`, `(${total})`);\n const freeRatio = this._numBytesFree / this._numBytesAllocated;\n console.log(`Bytes allocated: ${this._numBytesAllocated}`);\n console.log(`Bytes unused: ${this._numBytesFree} (${Math.round(100 * freeRatio)}%)`);\n }\n get numBytesAllocated() {\n return this._numBytesAllocated;\n }\n get numBytesFree() {\n return this._numBytesFree;\n }\n getNumUsedTextures() {\n return this.numUsedTextures;\n }\n getNumFreeTextures() {\n return this.numFreeTextures;\n }\n dispose() {\n if (this.freeTextures == null) {\n // Already disposed.\n return;\n }\n for (const texShape in this.freeTextures) {\n this.freeTextures[texShape].forEach(tex => {\n this.gpgpu.deleteMatrixTexture(tex.texture);\n });\n }\n for (const texShape in this.usedTextures) {\n this.usedTextures[texShape].forEach(tex => {\n this.gpgpu.deleteMatrixTexture(tex.texture);\n });\n }\n this.freeTextures = null;\n this.usedTextures = null;\n this.numUsedTextures = 0;\n this.numFreeTextures = 0;\n this._numBytesAllocated = 0;\n this._numBytesFree = 0;\n }\n}\nfunction numBytesForInternalFormat(gl, internalFormat) {\n // tslint:disable-next-line:no-any\n const glany = gl;\n if (internalFormat === glany.R32F) {\n return 4;\n }\n else if (internalFormat === glany.R16F) {\n return 2;\n }\n else if (internalFormat === glany.RGBA32F) {\n return 16;\n }\n else if (internalFormat === gl.RGBA) {\n return 16;\n }\n else if (internalFormat === glany.RGBA16F) {\n return 8;\n }\n else if (internalFormat === glany.RGBA8) {\n return 4;\n }\n throw new Error(`Unknown internal format ${internalFormat}`);\n}\nexport function computeBytes(shape, physicalTexType, gl, textureConfig, isPacked) {\n // It is not possible to infer packed status from the texture type because\n // depending on the textureConfig, different texture types may resolve to the\n // same internal format (e.g. in WebGL1, the internal format for\n // UNPACKED_FLOAT16 textures is gl.RGBA). Therefore we pass in `isPacked`\n // explicitly.\n const internalFormat = internalFormatForPhysicalTexType(physicalTexType, textureConfig);\n let numElements;\n if (isPacked) {\n const [packedWidth, packedHeight] = getPackedMatrixTextureShapeWidthHeight(shape[0], shape[1]);\n numElements = packedWidth * packedHeight;\n }\n else {\n const [width, height] = getUnpackedMatrixTextureShapeWidthHeight(shape[0], shape[1]);\n numElements = width * height;\n }\n const bytesPerElement = numBytesForInternalFormat(gl, internalFormat);\n return numElements * bytesPerElement;\n}\nfunction internalFormatForPhysicalTexType(physicalTexType, textureConfig) {\n switch (physicalTexType) {\n case PhysicalTextureType.PACKED_2X2_FLOAT32:\n return getInternalFormatForPackedMatrixTexture(textureConfig);\n case PhysicalTextureType.PACKED_2X2_FLOAT16:\n return getInternalFormatForFloat16PackedMatrixTexture(textureConfig);\n case PhysicalTextureType.UNPACKED_FLOAT32:\n return getInternalFormatForFloat32MatrixTexture(textureConfig);\n case PhysicalTextureType.UNPACKED_FLOAT16:\n return getInternalFormatForFloat16MatrixTexture(textureConfig);\n case PhysicalTextureType.PACKED_4X1_UNSIGNED_BYTE:\n return getInternalFormatForUnsignedBytesMatrixTexture(textureConfig);\n default:\n throw new Error(`Unknown physical texture type ${physicalTexType}`);\n }\n}\nfunction getPhysicalTextureForRendering(isPacked) {\n if (env().getBool('WEBGL_RENDER_FLOAT32_ENABLED')) {\n if (isPacked) {\n return PhysicalTextureType.PACKED_2X2_FLOAT32;\n }\n return PhysicalTextureType.UNPACKED_FLOAT32;\n }\n if (isPacked) {\n return PhysicalTextureType.PACKED_2X2_FLOAT16;\n }\n return PhysicalTextureType.UNPACKED_FLOAT16;\n}\nfunction getPhysicalFromLogicalTextureType(logicalTexType, isPacked) {\n if (logicalTexType === TextureUsage.UPLOAD) {\n return PhysicalTextureType.PACKED_2X2_FLOAT32;\n }\n else if (logicalTexType === TextureUsage.RENDER || logicalTexType == null) {\n return getPhysicalTextureForRendering(isPacked);\n }\n else if (logicalTexType === TextureUsage.DOWNLOAD ||\n logicalTexType === TextureUsage.PIXELS) {\n return PhysicalTextureType.PACKED_4X1_UNSIGNED_BYTE;\n }\n throw new Error(`Unknown logical texture type ${logicalTexType}`);\n}\nfunction getKeyFromTextureShape(shapeRowsCol, physicalTexType, isPacked) {\n return `${shapeRowsCol[0]}_${shapeRowsCol[1]}_${physicalTexType}_${isPacked}`;\n}\n//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidGV4dHVyZV9tYW5hZ2VyLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vdGZqcy1iYWNrZW5kLXdlYmdsL3NyYy90ZXh0dXJlX21hbmFnZXIudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUE7Ozs7Ozs7Ozs7Ozs7OztHQWVHO0FBRUgsT0FBTyxFQUFDLEdBQUcsRUFBQyxNQUFNLHVCQUF1QixDQUFDO0FBRzFDLE9BQU8sRUFBQyx3Q0FBd0MsRUFBRSw4Q0FBOEMsRUFBRSx3Q0FBd0MsRUFBRSx1Q0FBdUMsRUFBRSw4Q0FBOEMsRUFBQyxNQUFNLGNBQWMsQ0FBQztBQUN6UCxPQUFPLEVBQUMsc0NBQXNDLEVBQUUsd0NBQXdDLEVBQUUsbUJBQW1CLEVBQTBCLFlBQVksRUFBQyxNQUFNLFlBQVksQ0FBQztBQUV2SyxNQUFNLE9BQU8sY0FBYztJQVV6QixZQUFvQixLQUFtQjtRQUFuQixVQUFLLEdBQUwsS0FBSyxDQUFjO1FBVC9CLG9CQUFlLEdBQUcsQ0FBQyxDQUFDO1FBQ3BCLG9CQUFlLEdBQUcsQ0FBQyxDQUFDO1FBQ3BCLHVCQUFrQixHQUFHLENBQUMsQ0FBQztRQUN2QixrQkFBYSxHQUFHLENBQUMsQ0FBQyxDQUFFLDBDQUEwQztRQUMxQywyQkFBMkI7UUFDL0MsaUJBQVksR0FBaUMsRUFBRSxDQUFDO1FBQ2hELGVBQVUsR0FBRyxLQUFLLENBQUM7UUFDbkIsaUJBQVksR0FBaUMsRUFBRSxDQUFDO0lBRWQsQ0FBQztJQUUzQyxjQUFjLENBQ1YsT0FBeUIsRUFBRSxLQUFtQixFQUM5QyxRQUFpQjtRQUNuQixNQUFNLGVBQWUsR0FBRyxpQ0FBaUMsQ0FBQyxLQUFLLEVBQUUsUUFBUSxDQUFDLENBQUM7UUFFM0UsTUFBTSxRQUFRLEdBQUcsc0JBQXNCLENBQUMsT0FBTyxFQUFFLGVBQWUsRUFBRSxRQUFRLENBQUMsQ0FBQztRQUM1RSxJQUFJLENBQUMsQ0FBQyxRQUFRLElBQUksSUFBSSxDQUFDLFlBQVksQ0FBQyxF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QUU7UUFDMUMsT0FBTyxtQkFBbUIsQ0FBQyxrQkFBa0IsQ0FBQztLQUMvQztTQUFNLElBQUksY0FBYyxLQUFLLFlBQVksQ0FBQyxNQUFNLElBQUksY0FBYyxJQUFJLElBQUksRUFBRTtRQUMzRSxPQUFPLDhCQUE4QixDQUFDLFFBQVEsQ0FBQyxDQUFDO0tBQ2pEO1NBQU0sSUFDSCxjQUFjLEtBQUssWUFBWSxDQUFDLFFBQVE7UUFDeEMsY0FBYyxLQUFLLFlBQVksQ0FBQyxNQUFNLEVBQUU7UUFDMUMsT0FBTyxtQkFBbUIsQ0FBQyx3QkFBd0IsQ0FBQztLQUNyRDtJQUNELE1BQU0sSUFBSSxLQUFLLENBQUMsZ0NBQWdDLGNBQWMsRUFBRSxDQUFDLENBQUM7QUFDcEUsQ0FBQztBQUVELFNBQVMsc0JBQXNCLENBQzNCLFlBQThCLEVBQUUsZUFBb0MsRUFDcEUsUUFBaUI7SUFDbkIsT0FBTyxHQUFHLFlBQVksQ0FBQyxDQUFDLENBQUMsSUFBSSxZQUFZLENBQUMsQ0FBQyxDQUFDLElBQUksZUFBZSxJQUFJLFFBQVEsRUFBRSxDQUFDO0FBQ2hGLENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyIvKipcbiAqIEBsaWNlbnNlXG4gKiBDb3B5cmlnaHQgMjAxNyBHb29nbGUgTExDLiBBbGwgUmlnaHRzIFJlc2VydmVkLlxuICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlIFwiTGljZW5zZVwiKTtcbiAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS5cbiAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdFxuICpcbiAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMFxuICpcbiAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmVcbiAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuIFwiQVMgSVNcIiBCQVNJUyxcbiAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLlxuICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZFxuICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuXG4gKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuICovXG5cbmltcG9ydCB7ZW52fSBmcm9tICdAdGVuc29yZmxvdy90ZmpzLWNvcmUnO1xuXG5pbXBvcnQge0dQR1BVQ29udGV4dH0gZnJvbSAnLi9ncGdwdV9jb250ZXh0JztcbmltcG9ydCB7Z2V0SW50ZXJuYWxGb3JtYXRGb3JGbG9hdDE2TWF0cml4VGV4dHVyZSwgZ2V0SW50ZXJuYWxGb3JtYXRGb3JGbG9hdDE2UGFja2VkTWF0cml4VGV4dHVyZSwgZ2V0SW50ZXJuYWxGb3JtYXRGb3JGbG9hdDMyTWF0cml4VGV4dHVyZSwgZ2V0SW50ZXJuYWxGb3JtYXRGb3JQYWNrZWRNYXRyaXhUZXh0dXJlLCBnZXRJbnRlcm5hbEZvcm1hdEZvclVuc2lnbmVkQnl0ZXNNYXRyaXhUZXh0dXJlfSBmcm9tICcuL2dwZ3B1X3V0aWwnO1xuaW1wb3J0IHtnZXRQYWNrZWRNYXRyaXhUZXh0dXJlU2hhcGVXaWR0aEhlaWdodCwgZ2V0VW5wYWNrZWRNYXRyaXhUZXh0dXJlU2hhcGVXaWR0aEhlaWdodCwgUGh5c2ljYWxUZXh0dXJlVHlwZSwgVGV4dHVyZSwgVGV4dHVyZUNvbmZpZywgVGV4dHVyZVVzYWdlfSBmcm9tICcuL3RleF91dGlsJztcblxuZXhwb3J0IGNsYXNzIFRleHR1cmVNYW5hZ2VyIHtcbiAgcHJpdmF0ZSBudW1Vc2VkVGV4dHVyZXMgPSAwO1xuICBwcml2YXRlIG51bUZyZWVUZXh0dXJlcyA9IDA7XG4gIHByaXZhdGUgX251bUJ5dGVzQWxsb2NhdGVkID0gMDtcbiAgcHJpdmF0ZSBfbnVtQnl0ZXNGcmVlID0gMDsgIC8vIEhvdyBtYW55IGJ5dGVzIHRoYXQgaGF2ZSBiZWVuIGFsbG9jYXRlZFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gYXJlIGF2YWlsYWJsZSBmb3IgcmV1c2UuXG4gIHByaXZhdGUgZnJlZVRleHR1cmVzOiB7W3NoYXBlOiBzdHJpbmddOiBUZXh0dXJlW119ID0ge307XG4gIHByaXZhdGUgbG9nRW5hYmxlZCA9IGZhbHNlO1xuICBwcml2YXRlIHVzZWRUZXh0dXJlczoge1tzaGFwZTogc3RyaW5nXTogVGV4dHVyZVtdfSA9IHt9O1xuXG4gIGNvbnN0cnVjdG9yKHByaXZhdGUgZ3BncHU6IEdQR1BVQ29udGV4dCkge31cblxuICBhY3F1aXJlVGV4dHVyZShcbiAgICAgIHNoYXBlUkM6IFtudW1iZXIsIG51bWJlcl0sIHVzYWdlOiBUZXh0dXJlVXNhZ2UsXG4gICAgICBpc1BhY2tlZDogYm9vbGVhbik6IFRleHR1cmUge1xuICAgIGNvbnN0IHBoeXNpY2FsVGV4VHlwZSA9IGdldFBoeXNpY2FsRnJvbUxvZ2ljYWxUZXh0dXJlVHlwZSh1c2FnZSwgaXNQYWNrZWQpO1xuXG4gICAgY29uc3Qgc2hhcGVLZXkgPSBnZXRLZXlGcm9tVGV4dHVyZVNoYXBlKHNoYXBlUkMsIHBoeXNpY2FsVGV4VHlwZSwgaXNQYWNrZWQpO1xuICAgIGlmICghKHNoYXBlS2V5IGluIHRoaXMuZnJlZVRleHR1cmVzKSkge1xuICAgICAgdGhpcy5mcmVlVGV4dHVyZXNbc2hhcGVLZXldID0gW107XG4gICAgfVxuICAgIGlmICghKHNoYXBlS2V5IGluIHRoaXMudXNlZFRleHR1cmVzKSkge1xuICAgICAgdGhpcy51c2VkVGV4dHVyZXNbc2hhcGVLZXldID0gW107XG4gICAgfVxuXG4gICAgY29uc3QgdGV4Qnl0ZXMgPSBjb21wdXRlQnl0ZXMoXG4gICAgICAgIHNoYXBlUkMsIHBoeXNpY2FsVGV4VHlwZSwgdGhpcy5ncGdwdS5nbCwgdGhpcy5ncGdwdS50ZXh0dXJlQ29uZmlnLFxuICAgICAgICBpc1BhY2tlZCk7XG5cbiAgICBpZiAodGhpcy5mcmVlVGV4dHVyZXNbc2hhcGVLZXldLmxlbmd0aCA+IDApIHtcbiAgICAgIHRoaXMubnVtRnJlZVRleHR1cmVzLS07XG4gICAgICB0aGlzLm51bVVzZWRUZXh0dXJlcysrO1xuICAgICAgdGhpcy5fbnVtQnl0ZXNGcmVlIC09IHRleEJ5dGVzO1xuICAgICAgdGhpcy5sb2coKTtcbiAgICAgIGNvbnN0IG5ld1RleHR1cmUgPSB0aGlzLmZyZWVUZXh0dXJlc1tzaGFwZUtleV0uc2hpZnQoKTtcbiAgICAgIHRoaXMudXNlZFRleHR1cmVzW3NoYXBlS2V5XS5wdXNoKG5ld1RleHR1cmUpO1xuICAgICAgcmV0dXJuIG5ld1RleHR1cmU7XG4gICAgfVxuXG4gICAgbGV0IG5ld1RleHR1cmU6IFRleHR1cmU7XG4gICAgaWYgKHBoeXNpY2FsVGV4VHlwZSA9PT0gUGh5c2ljYWxUZXh0dXJlVHlwZS5QQUNLRURfMlgyX0ZMT0FUMzIpIHtcbiAgICAgIG5ld1RleHR1cmUgPSB0aGlzLmdwZ3B1LmNyZWF0ZVBhY2tlZE1hdHJpeFRleHR1cmUoc2hhcGVSQ1swXSwgc2hhcGVSQ1sxXSk7XG4gICAgfSBlbHNlIGlmIChwaHlzaWNhbFRleFR5cGUgPT09IFBoeXNpY2FsVGV4dHVyZVR5cGUuUEFDS0VEXzJYMl9GTE9BVDE2KSB7XG4gICAgICBuZXdUZXh0dXJlID1cbiAgICAgICAgICB0aGlzLmdwZ3B1LmNyZWF0ZUZsb2F0MTZQYWNrZWRNYXRyaXhUZXh0dXJlKHNoYXBlUkNbMF0sIHNoYXBlUkNbMV0pO1xuICAgIH0gZWxzZSBpZiAocGh5c2ljYWxUZXhUeXBlID09PSBQaHlzaWNhbFRleHR1cmVUeXBlLlVOUEFDS0VEX0ZMT0FUMzIpIHtcbiAgICAgIG5ld1RleHR1cmUgPVxuICAgICAgICAgIHRoaXMuZ3BncHUuY3JlYXRlRmxvYXQzMk1hdHJpeFRleHR1cmUoc2hhcGVSQ1swXSwgc2hhcGVSQ1sxXSk7XG4gICAgfSBlbHNlIGlmIChwaHlzaWNhbFRleFR5cGUgPT09IFBoeXNpY2FsVGV4dHVyZVR5cGUuVU5QQUNLRURfRkxPQVQxNikge1xuICAgICAgbmV3VGV4dHVyZSA9XG4gICAgICAgICAgdGhpcy5ncGdwdS5jcmVhdGVGbG9hdDE2TWF0cml4VGV4dHVyZShzaGFwZVJDWzBdLCBzaGFwZVJDWzFdKTtcbiAgICB9IGVsc2UgaWYgKFxuICAgICAgICBwaHlzaWNhbFRleFR5cGUgPT09IFBoeXNpY2FsVGV4dHVyZVR5cGUuUEFDS0VEXzRYMV9VTlNJR05FRF9CWVRFKSB7XG4gICAgICBuZXdUZXh0dXJlID1cbiAgICAgICAgICB0aGlzLmdwZ3B1LmNyZWF0ZVVuc2lnbmVkQnl0ZXNNYXRyaXhUZXh0dXJlKHNoYXBlUkNbMF0sIHNoYXBlUkNbMV0pO1xuICAgIH1cbiAgICB0aGlzLnVzZWRUZXh0dXJlc1tzaGFwZUtleV0ucHVzaChuZXdUZXh0dXJlKTtcblxuICAgIHRoaXMubnVtVXNlZFRleHR1cmVzKys7XG4gICAgdGhpcy5fbnVtQnl0ZXNBbGxvY2F0ZWQgKz0gdGV4Qnl0ZXM7XG4gICAgdGhpcy5sb2coKTtcblxuICAgIHJldHVybiBuZXdUZXh0dXJlO1xuICB9XG5cbiAgcmVsZWFzZVRleHR1cmUoXG4gICAgICB0ZXh0dXJlOiBUZXh0dXJlLCBzaGFwZTogW251bWJlciwgbnVtYmVyXSwgbG9naWNhbFRleFR5cGU6IFRleHR1cmVVc2FnZSxcbiAgICAgIGlzUGFja2VkOiBib29sZWFuKTogdm9pZCB7XG4gICAgaWYgKHRoaXMuZnJlZVRleHR1cmVzID09IG51bGwpIHtcbiAgICAgIC8vIEFscmVhZHkgZGlzcG9zZWQuXG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIGNvbnN0IHBoeXNpY2FsVGV4VHlwZSA9XG4gICAgICAgIGdldFBoeXNpY2FsRnJvbUxvZ2ljYWxUZXh0dXJlVHlwZShsb2dpY2FsVGV4VHlwZSwgaXNQYWNrZWQpO1xuICAgIGNvbnN0IHNoYXBlS2V5ID0gZ2V0S2V5RnJvbVRleHR1cmVTaGFwZShzaGFwZSwgcGh5c2ljYWxUZXhUeXBlLCBpc1BhY2tlZCk7XG4gICAgaWYgKCEoc2hhcGVLZXkgaW4gdGhpcy5mcmVlVGV4dHVyZXMpKSB7XG4gICAgICB0aGlzLmZyZWVUZXh0dXJlc1tzaGFwZUtleV0gPSBbXTtcbiAgICB9XG5cbiAgICBjb25zdCB0ZXhCeXRlcyA9IGNvbXB1dGVCeXRlcyhcbiAgICAgICAgc2hhcGUsIHBoeXNpY2FsVGV4VHlwZSwgdGhpcy5ncGdwdS5nbCwgdGhpcy5ncGdwdS50ZXh0dXJlQ29uZmlnLFxuICAgICAgICBpc1BhY2tlZCk7XG4gICAgY29uc3QgZGVsZXRlVGV4VGhyZXNob2xkID0gZW52KCkuZ2V0KCdXRUJHTF9ERUxFVEVfVEVYVFVSRV9USFJFU0hPTEQnKTtcbiAgICBpZiAoZGVsZXRlVGV4VGhyZXNob2xkICE9PSAtMSAmJlxuICAgICAgICB0aGlzLl9udW1CeXRlc0FsbG9jYXRlZCA+IGRlbGV0ZVRleFRocmVzaG9sZCkge1xuICAgICAgdGhpcy5ncGdwdS5kZWxldGVNYXRyaXhUZXh0dXJlKHRleHR1cmUudGV4dHVyZSk7XG4gICAgICB0aGlzLl9udW1CeXRlc0FsbG9jYXRlZCAtPSB0ZXhCeXRlcztcbiAgICB9IGVsc2Uge1xuICAgICAgdGhpcy5mcmVlVGV4dHVyZXNbc2hhcGVLZXldLnB1c2godGV4dHVyZSk7XG4gICAgICB0aGlzLm51bUZyZWVUZXh0dXJlcysrO1xuICAgICAgdGhpcy5fbnVtQnl0ZXNGcmVlICs9IHRleEJ5dGVzO1xuICAgIH1cblxuICAgIHRoaXMubnVtVXNlZFRleHR1cmVzLS07XG5cbiAgICBjb25zdCB0ZXhMaXN0ID0gdGhpcy51c2VkVGV4dHVyZXNbc2hhcGVLZXldO1xuICAgIGNvbnN0IHRleEluZGV4ID0gdGV4TGlzdC5pbmRleE9mKHRleHR1cmUpO1xuICAgIGlmICh0ZXhJbmRleCA8IDApIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcihcbiAgICAgICAgICAnQ2Fubm90IHJlbGVhc2UgYSB0ZXh0dXJlIHRoYXQgd2FzIG5ldmVyIHByb3ZpZGVkIGJ5IHRoaXMgJyArXG4gICAgICAgICAgJ3RleHR1cmUgbWFuYWdlcicpO1xuICAgIH1cbiAgICB0ZXhMaXN0LnNwbGljZSh0ZXhJbmRleCwgMSk7XG4gICAgdGhpcy5sb2coKTtcbiAgfVxuXG4gIHByaXZhdGUgbG9nKCkge1xuICAgIGlmICghdGhpcy5sb2dFbmFibGVkKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIGNvbnN0IHRvdGFsID0gdGhpcy5udW1GcmVlVGV4dHVyZXMgKyB0aGlzLm51bVVzZWRUZXh0dXJlcztcbiAgICBjb25zb2xlLmxvZyhcbiAgICAgICAgJ0ZyZWUvVXNlZCcsIGAke3RoaXMubnVtRnJlZVRleHR1cmVzfSAvICR7dGhpcy5udW1Vc2VkVGV4dHVyZXN9YCxcbiAgICAgICAgYCgke3RvdGFsfSlgKTtcbiAgICBjb25zdCBmcmVlUmF0aW8gPSB0aGlzLl9udW1CeXRlc0ZyZWUgLyB0aGlzLl9udW1CeXRlc0FsbG9jYXRlZDtcbiAgICBjb25zb2xlLmxvZyhgQnl0ZXMgYWxsb2NhdGVkOiAke3RoaXMuX251bUJ5dGVzQWxsb2NhdGVkfWApO1xuICAgIGNvbnNvbGUubG9nKGBCeXRlcyB1bnVzZWQ6ICR7dGhpcy5fbnVtQnl0ZXNGcmVlfSAoJHtcbiAgICAgICAgTWF0aC5yb3VuZCgxMDAgKiBmcmVlUmF0aW8pfSUpYCk7XG4gIH1cblxuICBnZXQgbnVtQnl0ZXNBbGxvY2F0ZWQoKTogbnVtYmVyIHtcbiAgICByZXR1cm4gdGhpcy5fbnVtQnl0ZXNBbGxvY2F0ZWQ7XG4gIH1cblxuICBnZXQgbnVtQnl0ZXNGcmVlKCk6IG51bWJlciB7XG4gICAgcmV0dXJuIHRoaXMuX251bUJ5dGVzRnJlZTtcbiAgfVxuXG4gIGdldE51bVVzZWRUZXh0dXJlcygpOiBudW1iZXIge1xuICAgIHJldHVybiB0aGlzLm51bVVzZWRUZXh0dXJlcztcbiAgfVxuXG4gIGdldE51bUZyZWVUZXh0dXJlcygpOiBudW1iZXIge1xuICAgIHJldHVybiB0aGlzLm51bUZyZWVUZXh0dXJlcztcbiAgfVxuXG4gIGRpc3Bvc2UoKSB7XG4gICAgaWYgKHRoaXMuZnJlZVRleHR1cmVzID09IG51bGwpIHtcbiAgICAgIC8vIEFscmVhZHkgZGlzcG9zZWQuXG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIGZvciAoY29uc3QgdGV4U2hhcGUgaW4gdGhpcy5mcmVlVGV4dHVyZXMpIHtcbiAgICAgIHRoaXMuZnJlZVRleHR1cmVzW3RleFNoYXBlXS5mb3JFYWNoKHRleCA9PiB7XG4gICAgICAgIHRoaXMuZ3BncHUuZGVsZXRlTWF0cml4VGV4dHVyZSh0ZXgudGV4dHVyZSk7XG4gICAgICB9KTtcbiAgICB9XG4gICAgZm9yIChjb25zdCB0ZXhTaGFwZSBpbiB0aGlzLnVzZWRUZXh0dXJlcykge1xuICAgICAgdGhpcy51c2VkVGV4dHVyZXNbdGV4U2hhcGVdLmZvckVhY2godGV4ID0+IHtcbiAgICAgICAgdGhpcy5ncGdwdS5kZWxldGVNYXRyaXhUZXh0dXJlKHRleC50ZXh0dXJlKTtcbiAgICAgIH0pO1xuICAgIH1cbiAgICB0aGlzLmZyZWVUZXh0dXJlcyA9IG51bGw7XG4gICAgdGhpcy51c2VkVGV4dHVyZXMgPSBudWxsO1xuICAgIHRoaXMubnVtVXNlZFRleHR1cmVzID0gMDtcbiAgICB0aGlzLm51bUZyZWVUZXh0dXJlcyA9IDA7XG4gICAgdGhpcy5fbnVtQnl0ZXNBbGxvY2F0ZWQgPSAwO1xuICAgIHRoaXMuX251bUJ5dGVzRnJlZSA9IDA7XG4gIH1cbn1cblxuZnVuY3Rpb24gbnVtQnl0ZXNGb3JJbnRlcm5hbEZvcm1hdChcbiAgICBnbDogV2ViR0xSZW5kZXJpbmdDb250ZXh0LCBpbnRlcm5hbEZvcm1hdDogbnVtYmVyKTogbnVtYmVyIHtcbiAgLy8gdHNsaW50OmRpc2FibGUtbmV4dC1saW5lOm5vLWFueVxuICBjb25zdCBnbGFueSA9IGdsIGFzIGFueTtcbiAgaWYgKGludGVybmFsRm9ybWF0ID09PSBnbGFueS5SMzJGKSB7XG4gICAgcmV0dXJuIDQ7XG4gIH0gZWxzZSBpZiAoaW50ZXJuYWxGb3JtYXQgPT09IGdsYW55LlIxNkYpIHtcbiAgICByZXR1cm4gMjtcbiAgfSBlbHNlIGlmIChpbnRlcm5hbEZvcm1hdCA9PT0gZ2xhbnkuUkdCQTMyRikge1xuICAgIHJldHVybiAxNjtcbiAgfSBlbHNlIGlmIChpbnRlcm5hbEZvcm1hdCA9PT0gZ2wuUkdCQSkge1xuICAgIHJldHVybiAxNjtcbiAgfSBlbHNlIGlmIChpbnRlcm5hbEZvcm1hdCA9PT0gZ2xhbnkuUkdCQTE2Rikge1xuICAgIHJldHVybiA4O1xuICB9IGVsc2UgaWYgKGludGVybmFsRm9ybWF0ID09PSBnbGFueS5SR0JBOCkge1xuICAgIHJldHVybiA0O1xuICB9XG4gIHRocm93IG5ldyBFcnJvcihgVW5rbm93biBpbnRlcm5hbCBmb3JtYXQgJHtpbnRlcm5hbEZvcm1hdH1gKTtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGNvbXB1dGVCeXRlcyhcbiAgICBzaGFwZTogW251bWJlciwgbnVtYmVyXSwgcGh5c2ljYWxUZXhUeXBlOiBQaHlzaWNhbFRleHR1cmVUeXBlLFxuICAgIGdsOiBXZWJHTFJlbmRlcmluZ0NvbnRleHQsIHRleHR1cmVDb25maWc6IFRleHR1cmVDb25maWcsXG4gICAgaXNQYWNrZWQ6IGJvb2xlYW4pOiBudW1iZXIge1xuICAvLyBJdCBpcyBub3QgcG9zc2libGUgdG8gaW5mZXIgcGFja2VkIHN0YXR1cyBmcm9tIHRoZSB0ZXh0dXJlIHR5cGUgYmVjYXVzZVxuICAvLyBkZXBlbmRpbmcgb24gdGhlIHRleHR1cmVDb25maWcsIGRpZmZlcmVudCAgdGV4dHVyZSB0eXBlcyBtYXkgcmVzb2x2ZSB0byB0aGVcbiAgLy8gc2FtZSBpbnRlcm5hbCBmb3JtYXQgKGUuZy4gaW4gV2ViR0wxLCB0aGUgaW50ZXJuYWwgZm9ybWF0IGZvclxuICAvLyBVTlBBQ0tFRF9GTE9BVDE2IHRleHR1cmVzIGlzIGdsLlJHQkEpLiBUaGVyZWZvcmUgd2UgcGFzcyBpbiBgaXNQYWNrZWRgXG4gIC8vIGV4cGxpY2l0bHkuXG4gIGNvbnN0IGludGVybmFsRm9ybWF0ID1cbiAgICAgIGludGVybmFsRm9ybWF0Rm9yUGh5c2ljYWxUZXhUeXBlKHBoeXNpY2FsVGV4VHlwZSwgdGV4dHVyZUNvbmZpZyk7XG5cbiAgbGV0IG51bUVsZW1lbnRzOiBudW1iZXI7XG4gIGlmIChpc1BhY2tlZCkge1xuICAgIGNvbnN0IFtwYWNrZWRXaWR0aCwgcGFja2VkSGVpZ2h0XSA9XG4gICAgICAgIGdldFBhY2tlZE1hdHJpeFRleHR1cmVTaGFwZVdpZHRoSGVpZ2h0KHNoYXBlWzBdLCBzaGFwZVsxXSk7XG4gICAgbnVtRWxlbWVudHMgPSBwYWNrZWRXaWR0aCAqIHBhY2tlZEhlaWdodDtcblxuICB9IGVsc2Uge1xuICAgIGNvbnN0IFt3aWR0aCwgaGVpZ2h0XSA9XG4gICAgICAgIGdldFVucGFja2VkTWF0cml4VGV4dHVyZVNoYXBlV2lkdGhIZWlnaHQoc2hhcGVbMF0sIHNoYXBlWzFdKTtcbiAgICBudW1FbGVtZW50cyA9IHdpZHRoICogaGVpZ2h0O1xuICB9XG5cbiAgY29uc3QgYnl0ZXNQZXJFbGVtZW50ID0gbnVtQnl0ZXNGb3JJbnRlcm5hbEZvcm1hdChnbCwgaW50ZXJuYWxGb3JtYXQpO1xuICByZXR1cm4gbnVtRWxlbWVudHMgKiBieXRlc1BlckVsZW1lbnQ7XG59XG5cbmZ1bmN0aW9uIGludGVybmFsRm9ybWF0Rm9yUGh5c2ljYWxUZXhUeXBlKFxuICAgIHBoeXNpY2FsVGV4VHlwZTogUGh5c2ljYWxUZXh0dXJlVHlwZSxcbiAgICB0ZXh0dXJlQ29uZmlnOiBUZXh0dXJlQ29uZmlnKTogbnVtYmVyIHtcbiAgc3dpdGNoIChwaHlzaWNhbFRleFR5cGUpIHtcbiAgICBjYXNlIFBoeXNpY2FsVGV4dHVyZVR5cGUuUEFDS0VEXzJYMl9GTE9BVDMyOlxuICAgICAgcmV0dXJuIGdldEludGVybmFsRm9ybWF0Rm9yUGFja2VkTWF0cml4VGV4dHVyZSh0ZXh0dXJlQ29uZmlnKTtcbiAgICBjYXNlIFBoeXNpY2FsVGV4dHVyZVR5cGUuUEFDS0VEXzJYMl9GTE9BVDE2OlxuICAgICAgcmV0dXJuIGdldEludGVybmFsRm9ybWF0Rm9yRmxvYXQxNlBhY2tlZE1hdHJpeFRleHR1cmUodGV4dHVyZUNvbmZpZyk7XG4gICAgY2FzZSBQaHlzaWNhbFRleHR1cmVUeXBlLlVOUEFDS0VEX0ZMT0FUMzI6XG4gICAgICByZXR1cm4gZ2V0SW50ZXJuYWxGb3JtYXRGb3JGbG9hdDMyTWF0cml4VGV4dHVyZSh0ZXh0dXJlQ29uZmlnKTtcbiAgICBjYXNlIFBoeXNpY2FsVGV4dHVyZVR5cGUuVU5QQUNLRURfRkxPQVQxNjpcbiAgICAgIHJldHVybiBnZXRJbnRlcm5hbEZvcm1hdEZvckZsb2F0MTZNYXRyaXhUZXh0dXJlKHRleHR1cmVDb25maWcpO1xuICAgIGNhc2UgUGh5c2ljYWxUZXh0dXJlVHlwZS5QQUNLRURfNFgxX1VOU0lHTkVEX0JZVEU6XG4gICAgICByZXR1cm4gZ2V0SW50ZXJuYWxGb3JtYXRGb3JVbnNpZ25lZEJ5dGVzTWF0cml4VGV4dHVyZSh0ZXh0dXJlQ29uZmlnKTtcbiAgICBkZWZhdWx0OlxuICAgICAgdGhyb3cgbmV3IEVycm9yKGBVbmtub3duIHBoeXNpY2FsIHRleHR1cmUgdHlwZSAke3BoeXNpY2FsVGV4VHlwZX1gKTtcbiAgfVxufVxuXG5mdW5jdGlvbiBnZXRQaHlzaWNhbFRleHR1cmVGb3JSZW5kZXJpbmcoaXNQYWNrZWQ6IGJvb2xlYW4pOlxuICAgIFBoeXNpY2FsVGV4dHVyZVR5cGUge1xuICBpZiAoZW52KCkuZ2V0Qm9vbCgnV0VCR0xfUkVOREVSX0ZMT0FUMzJfRU5BQkxFRCcpKSB7XG4gICAgaWYgKGlzUGFja2VkKSB7XG4gICAgICByZXR1cm4gUGh5c2ljYWxUZXh0dXJlVHlwZS5QQUNLRURfMlgyX0ZMT0FUMzI7XG4gICAgfVxuICAgIHJldHVybiBQaHlzaWNhbFRleHR1cmVUeXBlLlVOUEFDS0VEX0ZMT0FUMzI7XG4gIH1cblxuICBpZiAoaXNQYWNrZWQpIHtcbiAgICByZXR1cm4gUGh5c2ljYWxUZXh0dXJlVHlwZS5QQUNLRURfMlgyX0ZMT0FUMTY7XG4gIH1cbiAgcmV0dXJuIFBoeXNpY2FsVGV4dHVyZVR5cGUuVU5QQUNLRURfRkxPQVQxNjtcbn1cblxuZnVuY3Rpb24gZ2V0UGh5c2ljYWxGcm9tTG9naWNhbFRleHR1cmVUeXBlKFxuICAgIGxvZ2ljYWxUZXhUeXBlOiBUZXh0dXJlVXNhZ2UsIGlzUGFja2VkOiBib29sZWFuKTogUGh5c2ljYWxUZXh0dXJlVHlwZSB7XG4gIGlmIChsb2dpY2FsVGV4VHlwZSA9PT0gVGV4dHVyZVVzYWdlLlVQTE9BRCkge1xuICAgIHJldHVybiBQaHlzaWNhbFRleHR1cmVUeXBlLlBBQ0tFRF8yWDJfRkxPQVQzMjtcbiAgfSBlbHNlIGlmIChsb2dpY2FsVGV4VHlwZSA9PT0gVGV4dHVyZVVzYWdlLlJFTkRFUiB8fCBsb2dpY2FsVGV4VHlwZSA9PSBudWxsKSB7XG4gICAgcmV0dXJuIGdldFBoeXNpY2FsVGV4dHVyZUZvclJlbmRlcmluZyhpc1BhY2tlZCk7XG4gIH0gZWxzZSBpZiAoXG4gICAgICBsb2dpY2FsVGV4VHlwZSA9PT0gVGV4dHVyZVVzYWdlLkRPV05MT0FEIHx8XG4gICAgICBsb2dpY2FsVGV4VHlwZSA9PT0gVGV4dHVyZVVzYWdlLlBJWEVMUykge1xuICAgIHJldHVybiBQaHlzaWNhbFRleHR1cmVUeXBlLlBBQ0tFRF80WDFfVU5TSUdORURfQllURTtcbiAgfVxuICB0aHJvdyBuZXcgRXJyb3IoYFVua25vd24gbG9naWNhbCB0ZXh0dXJlIHR5cGUgJHtsb2dpY2FsVGV4VHlwZX1gKTtcbn1cblxuZnVuY3Rpb24gZ2V0S2V5RnJvbVRleHR1cmVTaGFwZShcbiAgICBzaGFwZVJvd3NDb2w6IFtudW1iZXIsIG51bWJlcl0sIHBoeXNpY2FsVGV4VHlwZTogUGh5c2ljYWxUZXh0dXJlVHlwZSxcbiAgICBpc1BhY2tlZDogYm9vbGVhbik6IHN0cmluZyB7XG4gIHJldHVybiBgJHtzaGFwZVJvd3NDb2xbMF19XyR7c2hhcGVSb3dzQ29sWzFdfV8ke3BoeXNpY2FsVGV4VHlwZX1fJHtpc1BhY2tlZH1gO1xufVxuIl19","/**\n * @license\n * Copyright 2017 Google LLC. All Rights Reserved.\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n * =============================================================================\n */\nimport { useShapeUniforms } from './gpgpu_math';\nexport class UnaryOpProgram {\n constructor(aShape, opSnippet) {\n this.variableNames = ['A'];\n this.outputShape = aShape;\n this.enableShapeUniforms = useShapeUniforms(this.outputShape.length);\n this.userCode = `\n float unaryOperation(float x) {\n ${opSnippet}\n }\n\n void main() {\n float x = getAAtOutCoords();\n float y = unaryOperation(x);\n\n setOutput(y);\n }\n `;\n }\n}\nexport const CHECK_NAN_SNIPPET = `if (isnan(x)) return x;`;\nexport const LINEAR = `return x;`;\nexport const ABS = `return abs(x);`;\nexport function STEP(alpha = 0.0) {\n return CHECK_NAN_SNIPPET + `\n return x > 0.0 ? 1.0 : float(${alpha});\n `;\n}\nexport const ELU = `return (x >= 0.0) ? x : (exp(x) - 1.0);`;\nexport const RELU = CHECK_NAN_SNIPPET + `\n return (x < 0.0) ? 0.0 : x;\n`;\nexport const RELU6 = CHECK_NAN_SNIPPET + `\n return (x < 0.0) ? 0.0 : min(6.0, x);\n`;\nexport const CLONE = 'return x;';\nexport const SIGMOID = `return 1.0 / (1.0 + exp(-1.0 * x));`;\n//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidW5hcnlvcF9ncHUuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi90ZmpzLWJhY2tlbmQtd2ViZ2wvc3JjL3VuYXJ5b3BfZ3B1LnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBOzs7Ozs7Ozs7Ozs7Ozs7R0FlRztBQUVILE9BQU8sRUFBZSxnQkFBZ0IsRUFBQyxNQUFNLGNBQWMsQ0FBQztBQUU1RCxNQUFNLE9BQU8sY0FBYztJQU16QixZQUFZLE1BQWdCLEVBQUUsU0FBaUI7UUFML0Msa0JBQWEsR0FBRyxDQUFDLEdBQUcsQ0FBQyxDQUFDO1FBTXBCLElBQUksQ0FBQyxXQUFXLEdBQUcsTUFBTSxDQUFDO1FBQzFCLElBQUksQ0FBQyxtQkFBbUIsR0FBRyxnQkFBZ0IsQ0FBQyxJQUFJLENBQUMsV0FBVyxDQUFDLE1BQU0sQ0FBQyxDQUFDO1FBQ3JFLElBQUksQ0FBQyxRQUFRLEdBQUc7O1VBRVYsU0FBUzs7Ozs7Ozs7O0tBU2QsQ0FBQztJQUNKLENBQUM7Q0FDRjtBQUVELE1BQU0sQ0FBQyxNQUFNLGlCQUFpQixHQUFHLHlCQUF5QixDQUFDO0FBRTNELE1BQU0sQ0FBQyxNQUFNLE1BQU0sR0FBRyxXQUFXLENBQUM7QUFFbEMsTUFBTSxDQUFDLE1BQU0sR0FBRyxHQUFHLGdCQUFnQixDQUFDO0FBRXBDLE1BQU0sVUFBVSxJQUFJLENBQUMsS0FBSyxHQUFHLEdBQUc7SUFDOUIsT0FBTyxpQkFBaUIsR0FBRzttQ0FDTSxLQUFLO0dBQ3JDLENBQUM7QUFDSixDQUFDO0FBRUQsTUFBTSxDQUFDLE1BQU0sR0FBRyxHQUFHLHlDQUF5QyxDQUFDO0FBQzdELE1BQU0sQ0FBQyxNQUFNLElBQUksR0FBRyxpQkFBaUIsR0FBRzs7Q0FFdkMsQ0FBQztBQUVGLE1BQU0sQ0FBQyxNQUFNLEtBQUssR0FBRyxpQkFBaUIsR0FBRzs7Q0FFeEMsQ0FBQztBQUVGLE1BQU0sQ0FBQyxNQUFNLEtBQUssR0FBRyxXQUFXLENBQUM7QUFFakMsTUFBTSxDQUFDLE1BQU0sT0FBTyxHQUFHLHFDQUFxQyxDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiLyoqXG4gKiBAbGljZW5zZVxuICogQ29weXJpZ2h0IDIwMTcgR29vZ2xlIExMQy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC5cbiAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSBcIkxpY2Vuc2VcIik7XG4gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuXG4gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXRcbiAqXG4gKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjBcbiAqXG4gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlXG4gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiBcIkFTIElTXCIgQkFTSVMsXG4gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC5cbiAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmRcbiAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLlxuICogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbiAqL1xuXG5pbXBvcnQge0dQR1BVUHJvZ3JhbSwgdXNlU2hhcGVVbmlmb3Jtc30gZnJvbSAnLi9ncGdwdV9tYXRoJztcblxuZXhwb3J0IGNsYXNzIFVuYXJ5T3BQcm9ncmFtIGltcGxlbWVudHMgR1BHUFVQcm9ncmFtIHtcbiAgdmFyaWFibGVOYW1lcyA9IFsnQSddO1xuICB1c2VyQ29kZTogc3RyaW5nO1xuICBvdXRwdXRTaGFwZTogbnVtYmVyW107XG4gIGVuYWJsZVNoYXBlVW5pZm9ybXM6IGJvb2xlYW47XG5cbiAgY29uc3RydWN0b3IoYVNoYXBlOiBudW1iZXJbXSwgb3BTbmlwcGV0OiBzdHJpbmcpIHtcbiAgICB0aGlzLm91dHB1dFNoYXBlID0gYVNoYXBlO1xuICAgIHRoaXMuZW5hYmxlU2hhcGVVbmlmb3JtcyA9IHVzZVNoYXBlVW5pZm9ybXModGhpcy5vdXRwdXRTaGFwZS5sZW5ndGgpO1xuICAgIHRoaXMudXNlckNvZGUgPSBgXG4gICAgICBmbG9hdCB1bmFyeU9wZXJhdGlvbihmbG9hdCB4KSB7XG4gICAgICAgICR7b3BTbmlwcGV0fVxuICAgICAgfVxuXG4gICAgICB2b2lkIG1haW4oKSB7XG4gICAgICAgIGZsb2F0IHggPSBnZXRBQXRPdXRDb29yZHMoKTtcbiAgICAgICAgZmxvYXQgeSA9IHVuYXJ5T3BlcmF0aW9uKHgpO1xuXG4gICAgICAgIHNldE91dHB1dCh5KTtcbiAgICAgIH1cbiAgICBgO1xuICB9XG59XG5cbmV4cG9ydCBjb25zdCBDSEVDS19OQU5fU05JUFBFVCA9IGBpZiAoaXNuYW4oeCkpIHJldHVybiB4O2A7XG5cbmV4cG9ydCBjb25zdCBMSU5FQVIgPSBgcmV0dXJuIHg7YDtcblxuZXhwb3J0IGNvbnN0IEFCUyA9IGByZXR1cm4gYWJzKHgpO2A7XG5cbmV4cG9ydCBmdW5jdGlvbiBTVEVQKGFscGhhID0gMC4wKSB7XG4gIHJldHVybiBDSEVDS19OQU5fU05JUFBFVCArIGBcbiAgICByZXR1cm4geCA+IDAuMCA/IDEuMCA6IGZsb2F0KCR7YWxwaGF9KTtcbiAgYDtcbn1cblxuZXhwb3J0IGNvbnN0IEVMVSA9IGByZXR1cm4gKHggPj0gMC4wKSA/IHggOiAoZXhwKHgpIC0gMS4wKTtgO1xuZXhwb3J0IGNvbnN0IFJFTFUgPSBDSEVDS19OQU5fU05JUFBFVCArIGBcbiAgcmV0dXJuICh4IDwgMC4wKSA/IDAuMCA6IHg7XG5gO1xuXG5leHBvcnQgY29uc3QgUkVMVTYgPSBDSEVDS19OQU5fU05JUFBFVCArIGBcbiAgcmV0dXJuICh4IDwgMC4wKSA/IDAuMCA6IG1pbig2LjAsIHgpO1xuYDtcblxuZXhwb3J0IGNvbnN0IENMT05FID0gJ3JldHVybiB4Oyc7XG5cbmV4cG9ydCBjb25zdCBTSUdNT0lEID0gYHJldHVybiAxLjAgLyAoMS4wICsgZXhwKC0xLjAgKiB4KSk7YDtcbiJdfQ==","/**\n * @license\n * Copyright 2018 Google LLC. All Rights Reserved.\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n * =============================================================================\n */\nimport { useShapeUniforms } from './gpgpu_math';\nexport const LINEAR = `return x;`;\nexport const ELU = `\n vec4 result;\n\n result.r = (x.r >= 0.0) ? x.r : (exp(x.r) - 1.0);\n result.g = (x.g >= 0.0) ? x.g : (exp(x.g) - 1.0);\n result.b = (x.b >= 0.0) ? x.b : (exp(x.b) - 1.0);\n result.a = (x.a >= 0.0) ? x.a : (exp(x.a) - 1.0);\n\n return result;\n`;\nexport const RELU = `\n vec4 result = x * vec4(greaterThanEqual(x, vec4(0.0)));\n bvec4 isNaN = isnan(x);\n\n result.r = isNaN.r ? x.r : result.r;\n result.g = isNaN.g ? x.g : result.g;\n result.b = isNaN.b ? x.b : result.b;\n result.a = isNaN.a ? x.a : result.a;\n\n return result;\n`;\nexport const RELU6 = `\n vec4 result = min(x, vec4(6.)) * vec4(greaterThanEqual(x, vec4(0.0)));\n bvec4 isNaN = isnan(x);\n\n result.r = isNaN.r ? x.r : result.r;\n result.g = isNaN.g ? x.g : result.g;\n result.b = isNaN.b ? x.b : result.b;\n result.a = isNaN.a ? x.a : result.a;\n\n return result;\n`;\nexport const SIGMOID = `return 1.0 / (1.0 + exp(-1.0 * x));`;\nexport class UnaryOpPackedProgram {\n constructor(aShape, opSnippet) {\n this.variableNames = ['A'];\n this.packedInputs = true;\n this.packedOutput = true;\n this.outputShape = aShape;\n this.enableShapeUniforms = useShapeUniforms(this.outputShape.length);\n this.userCode = `\n vec4 unaryOperation(vec4 x) {\n ${opSnippet}\n }\n\n void main() {\n vec4 x = getAAtOutCoords();\n vec4 y = unaryOperation(x);\n\n setOutput(y);\n }\n `;\n }\n}\n//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidW5hcnlvcF9wYWNrZWRfZ3B1LmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vdGZqcy1iYWNrZW5kLXdlYmdsL3NyYy91bmFyeW9wX3BhY2tlZF9ncHUudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUE7Ozs7Ozs7Ozs7Ozs7OztHQWVHO0FBRUgsT0FBTyxFQUFlLGdCQUFnQixFQUFDLE1BQU0sY0FBYyxDQUFDO0FBRTVELE1BQU0sQ0FBQyxNQUFNLE1BQU0sR0FBRyxXQUFXLENBQUM7QUFFbEMsTUFBTSxDQUFDLE1BQU0sR0FBRyxHQUFHOzs7Ozs7Ozs7Q0FTbEIsQ0FBQztBQUVGLE1BQU0sQ0FBQyxNQUFNLElBQUksR0FBRzs7Ozs7Ozs7OztDQVVuQixDQUFDO0FBRUYsTUFBTSxDQUFDLE1BQU0sS0FBSyxHQUFHOzs7Ozs7Ozs7O0NBVXBCLENBQUM7QUFFRixNQUFNLENBQUMsTUFBTSxPQUFPLEdBQUcscUNBQXFDLENBQUM7QUFFN0QsTUFBTSxPQUFPLG9CQUFvQjtJQVEvQixZQUFZLE1BQWdCLEVBQUUsU0FBaUI7UUFQL0Msa0JBQWEsR0FBRyxDQUFDLEdBQUcsQ0FBQyxDQUFDO1FBSXRCLGlCQUFZLEdBQUcsSUFBSSxDQUFDO1FBQ3BCLGlCQUFZLEdBQUcsSUFBSSxDQUFDO1FBR2xCLElBQUksQ0FBQyxXQUFXLEdBQUcsTUFBTSxDQUFDO1FBQzFCLElBQUksQ0FBQyxtQkFBbUIsR0FBRyxnQkFBZ0IsQ0FBQyxJQUFJLENBQUMsV0FBVyxDQUFDLE1BQU0sQ0FBQyxDQUFDO1FBQ3JFLElBQUksQ0FBQyxRQUFRLEdBQUc7O1VBRVYsU0FBUzs7Ozs7Ozs7O0tBU2QsQ0FBQztJQUNKLENBQUM7Q0FDRiIsInNvdXJjZXNDb250ZW50IjpbIi8qKlxuICogQGxpY2Vuc2VcbiAqIENvcHlyaWdodCAyMDE4IEdvb2dsZSBMTEMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuXG4gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgXCJMaWNlbnNlXCIpO1xuICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLlxuICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0XG4gKlxuICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wXG4gKlxuICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZVxuICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gXCJBUyBJU1wiIEJBU0lTLFxuICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuXG4gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kXG4gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS5cbiAqID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4gKi9cblxuaW1wb3J0IHtHUEdQVVByb2dyYW0sIHVzZVNoYXBlVW5pZm9ybXN9IGZyb20gJy4vZ3BncHVfbWF0aCc7XG5cbmV4cG9ydCBjb25zdCBMSU5FQVIgPSBgcmV0dXJuIHg7YDtcblxuZXhwb3J0IGNvbnN0IEVMVSA9IGBcbiAgdmVjNCByZXN1bHQ7XG5cbiAgcmVzdWx0LnIgPSAoeC5yID49IDAuMCkgPyB4LnIgOiAoZXhwKHgucikgLSAxLjApO1xuICByZXN1bHQuZyA9ICh4LmcgPj0gMC4wKSA/IHguZyA6IChleHAoeC5nKSAtIDEuMCk7XG4gIHJlc3VsdC5iID0gKHguYiA+PSAwLjApID8geC5iIDogKGV4cCh4LmIpIC0gMS4wKTtcbiAgcmVzdWx0LmEgPSAoeC5hID49IDAuMCkgPyB4LmEgOiAoZXhwKHguYSkgLSAxLjApO1xuXG4gIHJldHVybiByZXN1bHQ7XG5gO1xuXG5leHBvcnQgY29uc3QgUkVMVSA9IGBcbiAgdmVjNCByZXN1bHQgPSB4ICogdmVjNChncmVhdGVyVGhhbkVxdWFsKHgsIHZlYzQoMC4wKSkpO1xuICBidmVjNCBpc05hTiA9IGlzbmFuKHgpO1xuXG4gIHJlc3VsdC5yID0gaXNOYU4uciA/IHguciA6IHJlc3VsdC5yO1xuICByZXN1bHQuZyA9IGlzTmFOLmcgPyB4LmcgOiByZXN1bHQuZztcbiAgcmVzdWx0LmIgPSBpc05hTi5iID8geC5iIDogcmVzdWx0LmI7XG4gIHJlc3VsdC5hID0gaXNOYU4uYSA/IHguYSA6IHJlc3VsdC5hO1xuXG4gIHJldHVybiByZXN1bHQ7XG5gO1xuXG5leHBvcnQgY29uc3QgUkVMVTYgPSBgXG4gIHZlYzQgcmVzdWx0ID0gbWluKHgsIHZlYzQoNi4pKSAqIHZlYzQoZ3JlYXRlclRoYW5FcXVhbCh4LCB2ZWM0KDAuMCkpKTtcbiAgYnZlYzQgaXNOYU4gPSBpc25hbih4KTtcblxuICByZXN1bHQuciA9IGlzTmFOLnIgPyB4LnIgOiByZXN1bHQucjtcbiAgcmVzdWx0LmcgPSBpc05hTi5nID8geC5nIDogcmVzdWx0Lmc7XG4gIHJlc3VsdC5iID0gaXNOYU4uYiA/IHguYiA6IHJlc3VsdC5iO1xuICByZXN1bHQuYSA9IGlzTmFOLmEgPyB4LmEgOiByZXN1bHQuYTtcblxuICByZXR1cm4gcmVzdWx0O1xuYDtcblxuZXhwb3J0IGNvbnN0IFNJR01PSUQgPSBgcmV0dXJuIDEuMCAvICgxLjAgKyBleHAoLTEuMCAqIHgpKTtgO1xuXG5leHBvcnQgY2xhc3MgVW5hcnlPcFBhY2tlZFByb2dyYW0gaW1wbGVtZW50cyBHUEdQVVByb2dyYW0ge1xuICB2YXJpYWJsZU5hbWVzID0gWydBJ107XG4gIHVzZXJDb2RlOiBzdHJpbmc7XG4gIGVuYWJsZVNoYXBlVW5pZm9ybXM6IGJvb2xlYW47XG4gIG91dHB1dFNoYXBlOiBudW1iZXJbXTtcbiAgcGFja2VkSW5wdXRzID0gdHJ1ZTtcbiAgcGFja2VkT3V0cHV0ID0gdHJ1ZTtcblxuICBjb25zdHJ1Y3RvcihhU2hhcGU6IG51bWJlcltdLCBvcFNuaXBwZXQ6IHN0cmluZykge1xuICAgIHRoaXMub3V0cHV0U2hhcGUgPSBhU2hhcGU7XG4gICAgdGhpcy5lbmFibGVTaGFwZVVuaWZvcm1zID0gdXNlU2hhcGVVbmlmb3Jtcyh0aGlzLm91dHB1dFNoYXBlLmxlbmd0aCk7XG4gICAgdGhpcy51c2VyQ29kZSA9IGBcbiAgICAgIHZlYzQgdW5hcnlPcGVyYXRpb24odmVjNCB4KSB7XG4gICAgICAgICR7b3BTbmlwcGV0fVxuICAgICAgfVxuXG4gICAgICB2b2lkIG1haW4oKSB7XG4gICAgICAgIHZlYzQgeCA9IGdldEFBdE91dENvb3JkcygpO1xuICAgICAgICB2ZWM0IHkgPSB1bmFyeU9wZXJhdGlvbih4KTtcblxuICAgICAgICBzZXRPdXRwdXQoeSk7XG4gICAgICB9XG4gICAgYDtcbiAgfVxufVxuIl19","/**\n * @license\n * Copyright 2018 Google LLC. All Rights Reserved.\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n * =============================================================================\n */\nimport { useShapeUniforms } from './gpgpu_math';\nimport { getChannels, getSourceCoords } from './packing_util';\nimport { getCoordsDataType } from './shader_compiler';\nexport class UnpackProgram {\n constructor(outputShape) {\n this.variableNames = ['A'];\n this.packedInputs = true;\n this.packedOutput = false;\n this.outputShape = outputShape;\n this.enableShapeUniforms = useShapeUniforms(this.outputShape.length);\n const rank = outputShape.length;\n const channels = getChannels('rc', rank);\n const dtype = getCoordsDataType(rank);\n const sourceCoords = getSourceCoords(rank, channels);\n const innerDims = channels.slice(-2);\n const coords = rank <= 1 ? 'rc' : `vec2(${innerDims.join(',')})`;\n this.userCode = `\n void main() {\n ${dtype} rc = getOutputCoords();\n vec4 packedInput = getA(${sourceCoords});\n\n setOutput(getChannel(packedInput, ${coords}));\n }\n `;\n }\n}\n//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidW5wYWNrX2dwdS5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uL3RmanMtYmFja2VuZC13ZWJnbC9zcmMvdW5wYWNrX2dwdS50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQTs7Ozs7Ozs7Ozs7Ozs7O0dBZUc7QUFFSCxPQUFPLEVBQWUsZ0JBQWdCLEVBQUMsTUFBTSxjQUFjLENBQUM7QUFDNUQsT0FBTyxFQUFDLFdBQVcsRUFBRSxlQUFlLEVBQUMsTUFBTSxnQkFBZ0IsQ0FBQztBQUM1RCxPQUFPLEVBQUMsaUJBQWlCLEVBQUMsTUFBTSxtQkFBbUIsQ0FBQztBQUVwRCxNQUFNLE9BQU8sYUFBYTtJQVF4QixZQUFZLFdBQXFCO1FBUGpDLGtCQUFhLEdBQUcsQ0FBQyxHQUFHLENBQUMsQ0FBQztRQUN0QixpQkFBWSxHQUFHLElBQUksQ0FBQztRQUNwQixpQkFBWSxHQUFHLEtBQUssQ0FBQztRQU1uQixJQUFJLENBQUMsV0FBVyxHQUFHLFdBQVcsQ0FBQztRQUMvQixJQUFJLENBQUMsbUJBQW1CLEdBQUcsZ0JBQWdCLENBQUMsSUFBSSxDQUFDLFdBQVcsQ0FBQyxNQUFNLENBQUMsQ0FBQztRQUNyRSxNQUFNLElBQUksR0FBRyxXQUFXLENBQUMsTUFBTSxDQUFDO1FBRWhDLE1BQU0sUUFBUSxHQUFHLFdBQVcsQ0FBQyxJQUFJLEVBQUUsSUFBSSxDQUFDLENBQUM7UUFDekMsTUFBTSxLQUFLLEdBQUcsaUJBQWlCLENBQUMsSUFBSSxDQUFDLENBQUM7UUFDdEMsTUFBTSxZQUFZLEdBQUcsZUFBZSxDQUFDLElBQUksRUFBRSxRQUFRLENBQUMsQ0FBQztRQUNyRCxNQUFNLFNBQVMsR0FBRyxRQUFRLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUM7UUFDckMsTUFBTSxNQUFNLEdBQUcsSUFBSSxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxRQUFRLFNBQVMsQ0FBQyxJQUFJLENBQUMsR0FBRyxDQUFDLEdBQUcsQ0FBQztRQUVqRSxJQUFJLENBQUMsUUFBUSxHQUFHOztVQUVWLEtBQUs7a0NBQ21CLFlBQVk7OzRDQUVGLE1BQU07O0tBRTdDLENBQUM7SUFDSixDQUFDO0NBQ0YiLCJzb3VyY2VzQ29udGVudCI6WyIvKipcbiAqIEBsaWNlbnNlXG4gKiBDb3B5cmlnaHQgMjAxOCBHb29nbGUgTExDLiBBbGwgUmlnaHRzIFJlc2VydmVkLlxuICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlIFwiTGljZW5zZVwiKTtcbiAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS5cbiAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdFxuICpcbiAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMFxuICpcbiAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmVcbiAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuIFwiQVMgSVNcIiBCQVNJUyxcbiAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLlxuICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZFxuICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuXG4gKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuICovXG5cbmltcG9ydCB7R1BHUFVQcm9ncmFtLCB1c2VTaGFwZVVuaWZvcm1zfSBmcm9tICcuL2dwZ3B1X21hdGgnO1xuaW1wb3J0IHtnZXRDaGFubmVscywgZ2V0U291cmNlQ29vcmRzfSBmcm9tICcuL3BhY2tpbmdfdXRpbCc7XG5pbXBvcnQge2dldENvb3Jkc0RhdGFUeXBlfSBmcm9tICcuL3NoYWRlcl9jb21waWxlcic7XG5cbmV4cG9ydCBjbGFzcyBVbnBhY2tQcm9ncmFtIGltcGxlbWVudHMgR1BHUFVQcm9ncmFtIHtcbiAgdmFyaWFibGVOYW1lcyA9IFsnQSddO1xuICBwYWNrZWRJbnB1dHMgPSB0cnVlO1xuICBwYWNrZWRPdXRwdXQgPSBmYWxzZTtcbiAgb3V0cHV0U2hhcGU6IG51bWJlcltdO1xuICB1c2VyQ29kZTogc3RyaW5nO1xuICBlbmFibGVTaGFwZVVuaWZvcm1zOiBib29sZWFuO1xuXG4gIGNvbnN0cnVjdG9yKG91dHB1dFNoYXBlOiBudW1iZXJbXSkge1xuICAgIHRoaXMub3V0cHV0U2hhcGUgPSBvdXRwdXRTaGFwZTtcbiAgICB0aGlzLmVuYWJsZVNoYXBlVW5pZm9ybXMgPSB1c2VTaGFwZVVuaWZvcm1zKHRoaXMub3V0cHV0U2hhcGUubGVuZ3RoKTtcbiAgICBjb25zdCByYW5rID0gb3V0cHV0U2hhcGUubGVuZ3RoO1xuXG4gICAgY29uc3QgY2hhbm5lbHMgPSBnZXRDaGFubmVscygncmMnLCByYW5rKTtcbiAgICBjb25zdCBkdHlwZSA9IGdldENvb3Jkc0RhdGFUeXBlKHJhbmspO1xuICAgIGNvbnN0IHNvdXJjZUNvb3JkcyA9IGdldFNvdXJjZUNvb3JkcyhyYW5rLCBjaGFubmVscyk7XG4gICAgY29uc3QgaW5uZXJEaW1zID0gY2hhbm5lbHMuc2xpY2UoLTIpO1xuICAgIGNvbnN0IGNvb3JkcyA9IHJhbmsgPD0gMSA/ICdyYycgOiBgdmVjMigke2lubmVyRGltcy5qb2luKCcsJyl9KWA7XG5cbiAgICB0aGlzLnVzZXJDb2RlID0gYFxuICAgICAgdm9pZCBtYWluKCkge1xuICAgICAgICAke2R0eXBlfSByYyA9IGdldE91dHB1dENvb3JkcygpO1xuICAgICAgICB2ZWM0IHBhY2tlZElucHV0ID0gZ2V0QSgke3NvdXJjZUNvb3Jkc30pO1xuXG4gICAgICAgIHNldE91dHB1dChnZXRDaGFubmVsKHBhY2tlZElucHV0LCAke2Nvb3Jkc30pKTtcbiAgICAgIH1cbiAgICBgO1xuICB9XG59XG4iXX0=","/**\n * @license\n * Copyright 2017 Google LLC. All Rights Reserved.\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n * =============================================================================\n */\n// Import webgl flags.\nimport './flags_webgl';\nimport { backend_util, buffer, DataStorage, engine, env, kernel_impls, KernelBackend, nextFrame, scalar, tidy, util } from '@tensorflow/tfjs-core';\nimport { getWebGLContext } from './canvas_util';\nimport { DecodeMatrixProgram } from './decode_matrix_gpu';\nimport { DecodeMatrixPackedProgram } from './decode_matrix_packed_gpu';\nimport { EncodeFloatProgram } from './encode_float_gpu';\nimport { EncodeFloatPackedProgram } from './encode_float_packed_gpu';\nimport { EncodeMatrixProgram } from './encode_matrix_gpu';\nimport { EncodeMatrixPackedProgram } from './encode_matrix_packed_gpu';\nimport { GPGPUContext } from './gpgpu_context';\nimport * as gpgpu_math from './gpgpu_math';\nimport { getUniformLocations } from './gpgpu_math';\nimport { simpleAbsImplCPU } from './kernel_utils/shared';\nimport { PackProgram } from './pack_gpu';\nimport { ReshapePackedProgram } from './reshape_packed_gpu';\nimport * as tex_util from './tex_util';\nimport { TextureUsage } from './tex_util';\nimport { TextureManager } from './texture_manager';\nimport * as unary_op from './unaryop_gpu';\nimport { UnaryOpProgram } from './unaryop_gpu';\nimport { UnaryOpPackedProgram } from './unaryop_packed_gpu';\nimport { UnpackProgram } from './unpack_gpu';\nimport * as webgl_util from './webgl_util';\nconst whereImpl = kernel_impls.whereImpl;\nexport const EPSILON_FLOAT32 = 1e-7;\nexport const EPSILON_FLOAT16 = 1e-4;\nconst binaryCaches = {};\nexport function getBinaryCache(webGLVersion) {\n if (webGLVersion in binaryCaches) {\n return binaryCaches[webGLVersion];\n }\n binaryCaches[webGLVersion] = {};\n return binaryCaches[webGLVersion];\n}\n// Empirically determined constant used to determine size threshold for handing\n// off execution to the CPU.\nconst CPU_HANDOFF_SIZE_THRESHOLD = env().getNumber('CPU_HANDOFF_SIZE_THRESHOLD');\n// Empirically determined constant used to decide the number of MB on GPU\n// before we warn about high memory use. The MB are this constant * screen area\n// * dpi / 1024 / 1024.\nconst BEFORE_PAGING_CONSTANT = 600;\nfunction numMBBeforeWarning() {\n if (env().global.screen == null) {\n return 1024; // 1 GB.\n }\n return (env().global.screen.height * env().global.screen.width *\n window.devicePixelRatio) *\n BEFORE_PAGING_CONSTANT / 1024 / 1024;\n}\nexport class MathBackendWebGL extends KernelBackend {\n constructor(gpuResource) {\n super();\n // Maps data ids that have a pending read operation, to list of subscribers.\n this.pendingRead = new WeakMap();\n // List of data ids that are scheduled for disposal, but are waiting on a\n // pending read operation.\n this.pendingDisposal = new WeakSet();\n // Used to count the number of 'shallow' sliced tensors that point to the\n // same data id.\n this.dataRefCount = new WeakMap();\n this.numBytesInGPU = 0;\n // Accumulated time spent (including blocking) in uploading data to webgl.\n this.uploadWaitMs = 0;\n // Accumulated time spent (including blocking in downloading data from webgl.\n this.downloadWaitMs = 0;\n // record the last manual GL Flush time.\n this.lastGlFlushTime = 0;\n this.warnedAboutMemory = false;\n this.pendingDeletes = 0;\n this.disposed = false;\n if (!env().getBool('HAS_WEBGL')) {\n throw new Error('WebGL is not supported on this device');\n }\n let newGPGPU;\n if (gpuResource != null) {\n if (gpuResource instanceof GPGPUContext) {\n newGPGPU = gpuResource;\n }\n else {\n const gl = getWebGLContext(env().getNumber('WEBGL_VERSION'), gpuResource);\n newGPGPU = new GPGPUContext(gl);\n }\n this.binaryCache = {};\n this.gpgpuCreatedLocally = false;\n }\n else {\n const gl = getWebGLContext(env().getNumber('WEBGL_VERSION'));\n newGPGPU = new GPGPUContext(gl);\n this.binaryCache = getBinaryCache(env().getNumber('WEBGL_VERSION'));\n this.gpgpuCreatedLocally = true;\n }\n this.gpgpu = newGPGPU;\n this.canvas = this.gpgpu.gl.canvas;\n this.textureManager = new TextureManager(this.gpgpu);\n this.numMBBeforeWarning = numMBBeforeWarning();\n this.texData = new DataStorage(this, engine());\n }\n nextDataId() {\n return MathBackendWebGL.nextDataId++;\n }\n numDataIds() {\n return this.texData.numDataIds() - this.pendingDeletes;\n }\n write(values, shape, dtype) {\n if (env().getBool('WEBGL_CHECK_NUMERICAL_PROBLEMS') ||\n env().getBool('DEBUG')) {\n this.checkNumericalProblems(values);\n }\n if (dtype === 'complex64' && values != null) {\n throw new Error(`Cannot write to a complex64 dtype. ` +\n `Please use tf.complex(real, imag).`);\n }\n const dataId = { id: this.nextDataId() };\n this.texData.set(dataId, { shape, dtype, values, usage: TextureUsage.UPLOAD, refCount: 1 });\n return dataId;\n }\n /** Return refCount of a `TensorData`. */\n refCount(dataId) {\n if (this.texData.has(dataId)) {\n const tensorData = this.texData.get(dataId);\n return tensorData.refCount;\n }\n return 0;\n }\n /** Increase refCount of a `TextureData`. */\n incRef(dataId) {\n const texData = this.texData.get(dataId);\n texData.refCount++;\n }\n /** Decrease refCount of a `TextureData`. */\n decRef(dataId) {\n if (this.texData.has(dataId)) {\n const texData = this.texData.get(dataId);\n texData.refCount--;\n }\n }\n move(dataId, values, shape, dtype, refCount) {\n if (env().getBool('DEBUG')) {\n this.checkNumericalProblems(values);\n }\n if (dtype === 'complex64') {\n throw new Error(`Cannot write to a complex64 dtype. ` +\n `Please use tf.complex(real, imag).`);\n }\n this.texData.set(dataId, { shape, dtype, values, usage: TextureUsage.UPLOAD, refCount });\n }\n disposeIntermediateTensorInfo(tensorInfo) {\n this.disposeData(tensorInfo.dataId);\n }\n readSync(dataId) {\n const texData = this.texData.get(dataId);\n const { values, dtype, complexTensorInfos, slice, shape, isPacked } = texData;\n // The presence of `slice` indicates this tensor is a shallow slice of a\n // different tensor, and is using that original tensor's texture. Run\n // `clone` in order to copy that texture and read from it.\n if (slice != null) {\n let program;\n if (isPacked) {\n program = new UnaryOpPackedProgram(shape, unary_op.CLONE);\n }\n else {\n program = new UnaryOpProgram(shape, unary_op.CLONE);\n }\n const res = this.runWebGLProgram(program, [{ dataId, shape, dtype }], dtype);\n const data = this.readSync(res.dataId);\n this.disposeIntermediateTensorInfo(res);\n return data;\n }\n if (values != null) {\n return this.convertAndCacheOnCPU(dataId);\n }\n if (dtype === 'string') {\n return values;\n }\n const shouldTimeProgram = this.activeTimers != null;\n let start;\n if (shouldTimeProgram) {\n start = util.now();\n }\n let result;\n if (dtype === 'complex64') {\n const realValues = this.readSync(complexTensorInfos.real.dataId);\n const imagValues = this.readSync(complexTensorInfos.imag.dataId);\n result = backend_util.mergeRealAndImagArrays(realValues, imagValues);\n }\n else {\n result = this.getValuesFromTexture(dataId);\n }\n if (shouldTimeProgram) {\n this.downloadWaitMs += util.now() - start;\n }\n return this.convertAndCacheOnCPU(dataId, result);\n }\n async read(dataId) {\n if (this.pendingRead.has(dataId)) {\n const subscribers = this.pendingRead.get(dataId);\n return new Promise(resolve => subscribers.push(resolve));\n }\n const texData = this.texData.get(dataId);\n const { values, shape, slice, dtype, complexTensorInfos, isPacked } = texData;\n // The presence of `slice` indicates this tensor is a shallow slice of a\n // different tensor, and is using that original tensor's texture. Run\n // `clone` in order to copy that texture and read from it.\n if (slice != null) {\n let program;\n if (isPacked) {\n program = new UnaryOpPackedProgram(shape, unary_op.CLONE);\n }\n else {\n program = new UnaryOpProgram(shape, unary_op.CLONE);\n }\n const res = this.runWebGLProgram(program, [{ dataId, shape, dtype }], dtype);\n const data = this.read(res.dataId);\n this.disposeIntermediateTensorInfo(res);\n return data;\n }\n if (values != null) {\n return this.convertAndCacheOnCPU(dataId);\n }\n if (env().getBool('DEBUG')) {\n // getBool('WEBGL_DOWNLOAD_FLOAT_ENABLED') caused a blocking GPU call.\n // For performance reason, only check it for debugging. In production,\n // it doesn't handle this use case anyway, so behavior is not changed.\n if (!env().getBool('WEBGL_DOWNLOAD_FLOAT_ENABLED') &&\n env().getNumber('WEBGL_VERSION') === 2) {\n throw new Error(`tensor.data() with WEBGL_DOWNLOAD_FLOAT_ENABLED=false and ` +\n `WEBGL_VERSION=2 not yet supported.`);\n }\n }\n let buffer = null;\n let tmpDownloadTarget;\n if (dtype !== 'complex64' && env().get('WEBGL_BUFFER_SUPPORTED')) {\n // Possibly copy the texture into a buffer before inserting a fence.\n tmpDownloadTarget = this.decode(dataId);\n const tmpData = this.texData.get(tmpDownloadTarget.dataId);\n buffer = this.gpgpu.createBufferFromTexture(tmpData.texture.texture, ...tex_util.getDenseTexShape(shape));\n }\n this.pendingRead.set(dataId, []);\n if (dtype !== 'complex64') {\n // Create a fence and wait for it to resolve.\n await this.gpgpu.createAndWaitForFence();\n }\n // Download the values from the GPU.\n let vals;\n if (dtype === 'complex64') {\n const ps = await Promise.all([\n this.read(complexTensorInfos.real.dataId),\n this.read(complexTensorInfos.imag.dataId)\n ]);\n const realValues = ps[0];\n const imagValues = ps[1];\n vals = backend_util.mergeRealAndImagArrays(realValues, imagValues);\n }\n else if (buffer == null) {\n vals = this.getValuesFromTexture(dataId);\n }\n else {\n const size = util.sizeFromShape(shape);\n vals = this.gpgpu.downloadFloat32MatrixFromBuffer(buffer, size);\n }\n if (tmpDownloadTarget != null) {\n this.disposeIntermediateTensorInfo(tmpDownloadTarget);\n }\n if (buffer != null) {\n const gl = this.gpgpu.gl;\n webgl_util.callAndCheck(gl, () => gl.deleteBuffer(buffer));\n }\n const dTypeVals = this.convertAndCacheOnCPU(dataId, vals);\n const subscribers = this.pendingRead.get(dataId);\n this.pendingRead.delete(dataId);\n // Notify all pending reads.\n subscribers.forEach(resolve => resolve(dTypeVals));\n if (this.pendingDisposal.has(dataId)) {\n this.pendingDisposal.delete(dataId);\n if (this.disposeData(dataId)) {\n engine().removeDataId(dataId, this);\n }\n this.pendingDeletes--;\n }\n return dTypeVals;\n }\n /**\n * Read tensor to a new texture that is densely packed for ease of use.\n * @param dataId The source tensor.\n * @param options\n * customTexShape: Optional. If set, will use the user defined texture\n * shape to create the texture.\n */\n readToGPU(dataId, options = {}) {\n const texData = this.texData.get(dataId);\n const { values, shape, slice, dtype, isPacked, texture } = texData;\n if (dtype === 'complex64') {\n throw new Error('Does not support reading texture for complex64 dtype.');\n }\n // The presence of `slice` indicates this tensor is a shallow slice of a\n // different tensor, and is using that original tensor's texture. Run\n // `clone` in order to copy that texture and read from it.\n if (slice != null) {\n let program;\n if (isPacked) {\n program = new UnaryOpPackedProgram(shape, unary_op.CLONE);\n }\n else {\n program = new UnaryOpProgram(shape, unary_op.CLONE);\n }\n const res = this.runWebGLProgram(program, [{ dataId, shape, dtype }], dtype);\n const gpuResouorce = this.readToGPU(res, options);\n this.disposeIntermediateTensorInfo(res);\n return gpuResouorce;\n }\n if (texture == null) {\n if (values != null) {\n throw new Error('Data is not on GPU but on CPU.');\n }\n else {\n throw new Error('There is no data on GPU or CPU.');\n }\n }\n // Decode the texture so that it is stored densely (using four channels).\n const tmpTarget = this.decode(dataId, options.customTexShape);\n // Make engine track this tensor, so that we can dispose it later.\n const tensorRef = engine().makeTensorFromTensorInfo(tmpTarget);\n const tmpData = this.texData.get(tmpTarget.dataId);\n return Object.assign({ tensorRef }, tmpData.texture);\n }\n bufferSync(t) {\n const data = this.readSync(t.dataId);\n if (t.dtype === 'string') {\n try {\n // Decode the bytes into string.\n const strings = data.map(d => util.decodeString(d));\n return buffer(t.shape, t.dtype, strings);\n }\n catch (_a) {\n throw new Error('Failed to decode encoded string bytes into utf-8');\n }\n }\n return buffer(t.shape, t.dtype, data);\n }\n checkNumericalProblems(values) {\n if (values == null) {\n return;\n }\n for (let i = 0; i < values.length; i++) {\n const num = values[i];\n if (!webgl_util.canBeRepresented(num)) {\n if (env().getBool('WEBGL_RENDER_FLOAT32_CAPABLE')) {\n throw Error(`The value ${num} cannot be represented with your ` +\n `current settings. Consider enabling float32 rendering: ` +\n `'tf.env().set('WEBGL_RENDER_FLOAT32_ENABLED', true);'`);\n }\n throw Error(`The value ${num} cannot be represented on this device.`);\n }\n }\n }\n getValuesFromTexture(dataId) {\n const { shape, dtype, isPacked } = this.texData.get(dataId);\n const size = util.sizeFromShape(shape);\n if (env().getBool('WEBGL_DOWNLOAD_FLOAT_ENABLED')) {\n const tmpTarget = this.decode(dataId);\n const tmpData = this.texData.get(tmpTarget.dataId);\n const vals = this.gpgpu\n .downloadMatrixFromPackedTexture(tmpData.texture.texture, ...tex_util.getDenseTexShape(shape))\n .subarray(0, size);\n this.disposeIntermediateTensorInfo(tmpTarget);\n return vals;\n }\n const shouldUsePackedProgram = env().getBool('WEBGL_PACK') && isPacked === true;\n const outputShape = shouldUsePackedProgram ? webgl_util.getShapeAs3D(shape) : shape;\n const program = shouldUsePackedProgram ?\n new EncodeFloatPackedProgram(outputShape) :\n new EncodeFloatProgram(outputShape);\n const output = this.runWebGLProgram(program, [{ shape: outputShape, dtype, dataId }], 'float32');\n const tmpData = this.texData.get(output.dataId);\n const vals = this.gpgpu\n .downloadByteEncodedFloatMatrixFromOutputTexture(tmpData.texture.texture, tmpData.texShape[0], tmpData.texShape[1])\n .subarray(0, size);\n this.disposeIntermediateTensorInfo(output);\n return vals;\n }\n timerAvailable() {\n return env().getNumber('WEBGL_DISJOINT_QUERY_TIMER_EXTENSION_RELIABLE') > 0;\n }\n time(f) {\n const oldActiveTimers = this.activeTimers;\n const newActiveTimers = [];\n let outerMostTime = false;\n if (this.programTimersStack == null) {\n this.programTimersStack = newActiveTimers;\n outerMostTime = true;\n }\n else {\n this.activeTimers.push(newActiveTimers);\n }\n this.activeTimers = newActiveTimers;\n f();\n // needing to split these up because util.flatten only accepts certain types\n const flattenedActiveTimerQueries = util.flatten(this.activeTimers.map((d) => d.query))\n .filter(d => d != null);\n const flattenedActiveTimerNames = util.flatten(this.activeTimers.map((d) => d.name))\n .filter(d => d != null);\n this.activeTimers = oldActiveTimers;\n if (outerMostTime) {\n this.programTimersStack = null;\n }\n const res = {\n uploadWaitMs: this.uploadWaitMs,\n downloadWaitMs: this.downloadWaitMs,\n kernelMs: null,\n wallMs: null // will be filled by the engine\n };\n return (async () => {\n if (env().getNumber('WEBGL_DISJOINT_QUERY_TIMER_EXTENSION_RELIABLE') >\n 0) {\n const kernelMs = await Promise.all(flattenedActiveTimerQueries);\n res['kernelMs'] = util.sum(kernelMs);\n res['getExtraProfileInfo'] = () => kernelMs\n .map((d, i) => ({ name: flattenedActiveTimerNames[i], ms: d }))\n .map(d => `${d.name}: ${d.ms}`)\n .join(', ');\n }\n else {\n res['kernelMs'] = {\n error: 'WebGL query timers are not supported in this environment.'\n };\n }\n this.uploadWaitMs = 0;\n this.downloadWaitMs = 0;\n return res;\n })();\n }\n memory() {\n return {\n unreliable: false,\n numBytesInGPU: this.numBytesInGPU,\n numBytesInGPUAllocated: this.textureManager.numBytesAllocated,\n numBytesInGPUFree: this.textureManager.numBytesFree\n };\n }\n startTimer() {\n if (env().getNumber('WEBGL_DISJOINT_QUERY_TIMER_EXTENSION_RELIABLE') > 0) {\n return this.gpgpu.beginQuery();\n }\n return { startMs: util.now(), endMs: null };\n }\n endTimer(query) {\n if (env().getNumber('WEBGL_DISJOINT_QUERY_TIMER_EXTENSION_RELIABLE') > 0) {\n this.gpgpu.endQuery();\n return query;\n }\n query.endMs = util.now();\n return query;\n }\n async getQueryTime(query) {\n if (env().getNumber('WEBGL_DISJOINT_QUERY_TIMER_EXTENSION_RELIABLE') > 0) {\n return this.gpgpu.waitForQueryAndGetTime(query);\n }\n const timerQuery = query;\n return timerQuery.endMs - timerQuery.startMs;\n }\n /**\n * Decrease the RefCount on the dataId and dispose the memory if the dataId\n * has 0 refCount. If there are pending read on the data, the disposal would\n * added to the pending delete queue. Return true if the dataId is removed\n * from backend or the backend does not contain the dataId, false if the\n * dataId is not removed. Memory may or may not be released even when dataId\n * is removed, which also depends on dataRefCount, see `releaseGPU`.\n * @param dataId\n * @oaram force Optional, remove the data regardless of refCount\n */\n disposeData(dataId, force = false) {\n if (this.pendingDisposal.has(dataId)) {\n return false;\n }\n // No-op if already disposed.\n if (!this.texData.has(dataId)) {\n return true;\n }\n // if force flag is set, change refCount to 0, this would ensure disposal\n // when added to the pendingDisposal queue. Memory may or may not be\n // released, which also depends on dataRefCount, see `releaseGPU`.\n if (force) {\n this.texData.get(dataId).refCount = 0;\n }\n else {\n this.texData.get(dataId).refCount--;\n }\n if (!force && this.texData.get(dataId).refCount > 0) {\n return false;\n }\n if (this.pendingRead.has(dataId)) {\n this.pendingDisposal.add(dataId);\n this.pendingDeletes++;\n return false;\n }\n this.releaseGPUData(dataId);\n const { complexTensorInfos } = this.texData.get(dataId);\n if (complexTensorInfos != null) {\n this.disposeData(complexTensorInfos.real.dataId, force);\n this.disposeData(complexTensorInfos.imag.dataId, force);\n }\n this.texData.delete(dataId);\n return true;\n }\n releaseGPUData(dataId) {\n const { texture, dtype, texShape, usage, isPacked, slice } = this.texData.get(dataId);\n const key = slice && slice.origDataId || dataId;\n const refCount = this.dataRefCount.get(key);\n if (refCount > 1) {\n this.dataRefCount.set(key, refCount - 1);\n }\n else {\n this.dataRefCount.delete(key);\n if (texture != null) {\n this.numBytesInGPU -= this.computeBytes(texShape, dtype);\n this.textureManager.releaseTexture(texture, texShape, usage, isPacked);\n }\n }\n const texData = this.texData.get(dataId);\n texData.texture = null;\n texData.texShape = null;\n texData.isPacked = false;\n texData.slice = null;\n }\n getTexture(dataId) {\n this.uploadToGPU(dataId);\n return this.texData.get(dataId).texture.texture;\n }\n /**\n * Returns internal information for the specific data bucket. Used in unit\n * tests.\n */\n getDataInfo(dataId) {\n return this.texData.get(dataId);\n }\n /*\n Tests whether all the inputs to an op are small and on the CPU. This heuristic\n determines when it would be faster to execute a kernel on the CPU. WebGL\n kernels opt into running this check and forwarding when appropriate.\n TODO(https://github.com/tensorflow/tfjs/issues/872): Develop a more\n sustainable strategy for optimizing backend execution of ops.\n */\n shouldExecuteOnCPU(inputs, sizeThreshold = CPU_HANDOFF_SIZE_THRESHOLD) {\n return env().getBool('WEBGL_CPU_FORWARD') &&\n inputs.every(input => this.texData.get(input.dataId).texture == null &&\n util.sizeFromShape(input.shape) < sizeThreshold);\n }\n getGPGPUContext() {\n return this.gpgpu;\n }\n where(condition) {\n backend_util.warn('tf.where() in webgl locks the UI thread. ' +\n 'Call tf.whereAsync() instead');\n const condVals = condition.dataSync();\n return whereImpl(condition.shape, condVals);\n }\n packedUnaryOp(x, op, dtype) {\n const program = new UnaryOpPackedProgram(x.shape, op);\n const outInfo = this.compileAndRun(program, [x], dtype);\n return engine().makeTensorFromTensorInfo(outInfo);\n }\n // TODO(msoulanille) remove this once the backend has been modularized\n // a copy is needed here to break a circular dependency.\n // Also remove the op from unary_op.\n abs(x) {\n // TODO: handle cases when x is complex.\n if (this.shouldExecuteOnCPU([x]) && x.dtype !== 'complex64') {\n const outValues = simpleAbsImplCPU(this.texData.get(x.dataId).values);\n return this.makeOutput(x.shape, x.dtype, outValues);\n }\n if (env().getBool('WEBGL_PACK_UNARY_OPERATIONS')) {\n return this.packedUnaryOp(x, unary_op.ABS, x.dtype);\n }\n const program = new UnaryOpProgram(x.shape, unary_op.ABS);\n const outInfo = this.compileAndRun(program, [x]);\n return engine().makeTensorFromTensorInfo(outInfo);\n }\n makeTensorInfo(shape, dtype, values) {\n let dataId;\n if (dtype === 'string' && values != null && values.length > 0 &&\n util.isString(values[0])) {\n const encodedValues = values.map(d => util.encodeString(d));\n dataId = this.write(encodedValues, shape, dtype);\n }\n else {\n dataId = this.write(values, shape, dtype);\n }\n this.texData.get(dataId).usage = null;\n return { dataId, shape, dtype };\n }\n makeOutput(shape, dtype, values) {\n return engine().makeTensorFromTensorInfo(this.makeTensorInfo(shape, dtype, values), this);\n }\n unpackTensor(input) {\n const program = new UnpackProgram(input.shape);\n return this.runWebGLProgram(program, [input], input.dtype);\n }\n packTensor(input) {\n const program = new PackProgram(input.shape);\n const preventEagerUnpackingOutput = true;\n return this.runWebGLProgram(program, [input], input.dtype, null /* customUniformValues */, preventEagerUnpackingOutput);\n }\n packedReshape(input, afterShape) {\n const input3DShape = [\n webgl_util.getBatchDim(input.shape),\n ...webgl_util.getRowsCols(input.shape)\n ];\n const input3D = {\n dtype: input.dtype,\n shape: input3DShape,\n dataId: input.dataId\n };\n const afterShapeAs3D = [\n webgl_util.getBatchDim(afterShape), ...webgl_util.getRowsCols(afterShape)\n ];\n const program = new ReshapePackedProgram(afterShapeAs3D, input3DShape);\n const preventEagerUnpackingOfOutput = true;\n const customValues = [input3DShape];\n const output = this.runWebGLProgram(program, [input3D], input.dtype, customValues, preventEagerUnpackingOfOutput);\n return { dataId: output.dataId, shape: afterShape, dtype: output.dtype };\n }\n decode(dataId, customTexShape) {\n const texData = this.texData.get(dataId);\n const { isPacked, shape, dtype } = texData;\n if (customTexShape != null) {\n const size = util.sizeFromShape(shape);\n const texSize = customTexShape[0] * customTexShape[1] * 4;\n util.assert(size <= texSize, () => 'customTexShape is too small. ' +\n 'Row * Column * 4 should be equal or larger than the ' +\n 'size of the tensor data.');\n }\n const shapeAs3D = webgl_util.getShapeAs3D(shape);\n let program;\n if (isPacked) {\n program = new DecodeMatrixPackedProgram(shapeAs3D);\n }\n else {\n program = new DecodeMatrixProgram(shapeAs3D);\n }\n const preventEagerUnpackingOfOutput = true;\n const customValues = [customTexShape != null ? customTexShape :\n tex_util.getDenseTexShape(shapeAs3D)];\n const out = this.runWebGLProgram(program, [{ shape: shapeAs3D, dtype, dataId }], dtype, customValues, preventEagerUnpackingOfOutput, customTexShape);\n return { dtype, shape, dataId: out.dataId };\n }\n runWebGLProgram(program, inputs, outputDtype, customUniformValues, preventEagerUnpackingOfOutput = false, customTexShape) {\n const output = this.makeTensorInfo(program.outputShape, outputDtype);\n const outData = this.texData.get(output.dataId);\n if (program.packedOutput) {\n outData.isPacked = true;\n }\n if (program.outPackingScheme === tex_util.PackingScheme.DENSE) {\n const texelShape = customTexShape != null ?\n customTexShape :\n tex_util.getDenseTexShape(program.outputShape);\n // For a densely packed output, we explicitly set texShape\n // so it doesn't get assigned later according to our typical packing\n // scheme wherein a single texel can only contain values from adjacent\n // rows/cols.\n outData.texShape = texelShape.map(d => d * 2);\n }\n if (program.outTexUsage != null) {\n outData.usage = program.outTexUsage;\n }\n if (util.sizeFromShape(output.shape) === 0) {\n // Short-circuit the computation since the result is empty (has 0 in its\n // shape).\n outData.values =\n util.getTypedArrayFromDType(output.dtype, 0);\n return output;\n }\n const dataToDispose = [];\n const inputsData = inputs.map(input => {\n if (input.dtype === 'complex64') {\n throw new Error(`GPGPUProgram does not support complex64 input. For complex64 ` +\n `dtypes, please separate the program into real and imaginary ` +\n `parts.`);\n }\n let texData = this.texData.get(input.dataId);\n if (texData.texture == null) {\n if (!program.packedInputs &&\n util.sizeFromShape(input.shape) <=\n env().getNumber('WEBGL_SIZE_UPLOAD_UNIFORM')) {\n // Upload small tensors that live on the CPU as uniforms, not as\n // textures. Do this only when the environment supports 32bit floats\n // due to problems when comparing 16bit floats with 32bit floats.\n // TODO(https://github.com/tensorflow/tfjs/issues/821): Make it\n // possible for packed shaders to sample from uniforms.\n return {\n shape: input.shape,\n texData: null,\n isUniform: true,\n uniformValues: texData.values\n };\n }\n // This ensures that if a packed program's inputs have not yet been\n // uploaded to the GPU, they get uploaded as packed right off the bat.\n if (program.packedInputs) {\n texData.isPacked = true;\n texData.shape = input.shape;\n }\n }\n this.uploadToGPU(input.dataId);\n if (!!texData.isPacked !== !!program.packedInputs) {\n input = texData.isPacked ? this.unpackTensor(input) :\n this.packTensor(input);\n dataToDispose.push(input);\n texData = this.texData.get(input.dataId);\n }\n else if (texData.isPacked &&\n !webgl_util.isReshapeFree(texData.shape, input.shape)) {\n // This is a special case where a texture exists for a tensor\n // but the shapes are incompatible (due to packing constraints) because\n // the tensor did not have a chance to go through the packed reshape\n // shader. This only happens when we reshape the *same* tensor to form\n // *distinct* inputs to an op, e.g. dotting a vector with itself. This\n // case will disappear once packed uploading is the default.\n const savedInput = input;\n const targetShape = input.shape;\n input.shape = texData.shape;\n input = this.packedReshape(input, targetShape);\n dataToDispose.push(input);\n texData = this.texData.get(input.dataId);\n savedInput.shape = targetShape;\n }\n return { shape: input.shape, texData, isUniform: false };\n });\n this.uploadToGPU(output.dataId);\n const outputData = { shape: output.shape, texData: outData, isUniform: false };\n const key = gpgpu_math.makeShaderKey(program, inputsData, outputData);\n const binary = this.getAndSaveBinary(key, () => {\n return gpgpu_math.compileProgram(this.gpgpu, program, inputsData, outputData);\n });\n const shouldTimeProgram = this.activeTimers != null;\n let query;\n if (shouldTimeProgram) {\n query = this.startTimer();\n }\n if (!env().get('ENGINE_COMPILE_ONLY')) {\n gpgpu_math.runProgram(this.gpgpu, binary, inputsData, outputData, customUniformValues);\n }\n dataToDispose.forEach(info => this.disposeIntermediateTensorInfo(info));\n if (shouldTimeProgram) {\n query = this.endTimer(query);\n this.activeTimers.push({ name: program.constructor.name, query: this.getQueryTime(query) });\n }\n const glFlushThreshold = env().get('WEBGL_FLUSH_THRESHOLD');\n // Manually GL flush requested\n if (glFlushThreshold > 0) {\n const time = util.now();\n if ((time - this.lastGlFlushTime) > glFlushThreshold) {\n this.gpgpu.gl.flush();\n this.lastGlFlushTime = time;\n }\n }\n if (!env().getBool('WEBGL_LAZILY_UNPACK') && outData.isPacked &&\n preventEagerUnpackingOfOutput === false) {\n const unpacked = this.unpackTensor(output);\n this.disposeIntermediateTensorInfo(output);\n return unpacked;\n }\n return output;\n }\n compileAndRun(program, inputs, outputDtype, customUniformValues, preventEagerUnpackingOfOutput = false) {\n outputDtype = outputDtype || inputs[0].dtype;\n const outInfo = this.runWebGLProgram(program, inputs, outputDtype, customUniformValues, preventEagerUnpackingOfOutput);\n return outInfo;\n }\n getAndSaveBinary(key, getBinary) {\n if (!(key in this.binaryCache)) {\n this.binaryCache[key] = getBinary();\n }\n return this.binaryCache[key];\n }\n getTextureManager() {\n return this.textureManager;\n }\n dispose() {\n if (this.disposed) {\n return;\n }\n // Avoid disposing the compiled webgl programs during unit testing because\n // it slows down test execution.\n if (!env().getBool('IS_TEST')) {\n const allKeys = Object.keys(this.binaryCache);\n allKeys.forEach(key => {\n this.gpgpu.deleteProgram(this.binaryCache[key].webGLProgram);\n delete this.binaryCache[key];\n });\n }\n this.textureManager.dispose();\n if (this.canvas != null &&\n (typeof (HTMLCanvasElement) !== 'undefined' &&\n this.canvas instanceof HTMLCanvasElement)) {\n this.canvas.remove();\n }\n else {\n this.canvas = null;\n }\n if (this.gpgpuCreatedLocally) {\n this.gpgpu.program = null;\n this.gpgpu.dispose();\n }\n this.disposed = true;\n }\n floatPrecision() {\n if (this.floatPrecisionValue == null) {\n this.floatPrecisionValue = tidy(() => {\n if (!env().get('WEBGL_RENDER_FLOAT32_ENABLED')) {\n // Momentarily switching DEBUG flag to false so we don't throw an\n // error trying to upload a small value.\n const debugFlag = env().getBool('DEBUG');\n env().set('DEBUG', false);\n const underflowCheckValue = this.abs(scalar(1e-8)).dataSync()[0];\n env().set('DEBUG', debugFlag);\n if (underflowCheckValue > 0) {\n return 32;\n }\n }\n return 16;\n });\n }\n return this.floatPrecisionValue;\n }\n /** Returns the smallest representable number. */\n epsilon() {\n return this.floatPrecision() === 32 ? EPSILON_FLOAT32 : EPSILON_FLOAT16;\n }\n uploadToGPU(dataId) {\n const texData = this.texData.get(dataId);\n const { shape, dtype, values, texture, usage, isPacked } = texData;\n if (texture != null) {\n // Array is already on GPU. No-op.\n return;\n }\n const shouldTimeProgram = this.activeTimers != null;\n let start;\n if (shouldTimeProgram) {\n start = util.now();\n }\n let texShape = texData.texShape;\n if (texShape == null) {\n // This texShape may not be the final texture shape. For packed or dense\n // textures, the texShape will be changed when textures are created.\n texShape = webgl_util.getTextureShapeFromLogicalShape(shape, isPacked);\n texData.texShape = texShape;\n }\n if (values != null) {\n const shapeAs3D = webgl_util.getShapeAs3D(shape);\n let program;\n let width = texShape[1], height = texShape[0];\n const isByteArray = values instanceof Uint8Array || values instanceof Uint8ClampedArray;\n // texture for float array is PhysicalTextureType.PACKED_2X2_FLOAT32, we\n // need to make sure the upload uses the same packed size\n if (isPacked || !isByteArray) {\n [width, height] = tex_util.getPackedMatrixTextureShapeWidthHeight(texShape[0], texShape[1]);\n }\n if (isPacked) {\n program = new EncodeMatrixPackedProgram(shapeAs3D, isByteArray);\n }\n else {\n program = new EncodeMatrixProgram(shapeAs3D, isByteArray);\n }\n // TexShape for float array needs to be the original shape, which byte\n // array needs to be packed size. This allow the data upload shape to be\n // matched with texture creation logic.\n const tempDenseInputTexShape = isByteArray ? [height, width] : texShape;\n const tempDenseInputHandle = this.makeTensorInfo(tempDenseInputTexShape, dtype);\n const tempDenseInputTexData = this.texData.get(tempDenseInputHandle.dataId);\n if (isByteArray) {\n tempDenseInputTexData.usage = TextureUsage.PIXELS;\n }\n else {\n tempDenseInputTexData.usage = TextureUsage.UPLOAD;\n }\n tempDenseInputTexData.texShape = tempDenseInputTexShape;\n this.gpgpu.uploadDenseMatrixToTexture(this.getTexture(tempDenseInputHandle.dataId), width, height, values);\n const customValues = [[height, width]];\n // We want the output to remain packed regardless of the value of\n // WEBGL_PACK.\n const preventEagerUnpacking = true;\n const encodedOutputTarget = this.runWebGLProgram(program, [tempDenseInputHandle], dtype, customValues, preventEagerUnpacking);\n // Have the original texture assume the identity of the encoded output.\n const outputTexData = this.texData.get(encodedOutputTarget.dataId);\n texData.texShape = outputTexData.texShape;\n texData.isPacked = outputTexData.isPacked;\n texData.usage = outputTexData.usage;\n if (!env().get('ENGINE_COMPILE_ONLY')) {\n texData.texture = outputTexData.texture;\n // Once uploaded, don't store the values on cpu.\n texData.values = null;\n this.texData.delete(encodedOutputTarget.dataId);\n }\n else {\n this.disposeData(encodedOutputTarget.dataId);\n }\n this.disposeIntermediateTensorInfo(tempDenseInputHandle);\n if (shouldTimeProgram) {\n this.uploadWaitMs += util.now() - start;\n }\n }\n else {\n const newTexture = this.acquireTexture(texShape, usage, dtype, isPacked);\n texData.texture = newTexture;\n }\n }\n convertAndCacheOnCPU(dataId, float32Values) {\n const texData = this.texData.get(dataId);\n const { dtype } = texData;\n this.releaseGPUData(dataId);\n if (float32Values != null) {\n texData.values = float32ToTypedArray(float32Values, dtype);\n }\n return texData.values;\n }\n acquireTexture(texShape, texType, dtype, isPacked) {\n this.numBytesInGPU += this.computeBytes(texShape, dtype);\n if (!this.warnedAboutMemory &&\n this.numBytesInGPU > this.numMBBeforeWarning * 1024 * 1024) {\n const mb = (this.numBytesInGPU / 1024 / 1024).toFixed(2);\n this.warnedAboutMemory = true;\n console.warn(`High memory usage in GPU: ${mb} MB, ` +\n `most likely due to a memory leak`);\n }\n return this.textureManager.acquireTexture(texShape, texType, isPacked);\n }\n computeBytes(shape, dtype) {\n return shape[0] * shape[1] * util.bytesPerElement(dtype);\n }\n checkCompileCompletion() {\n for (const [, binary] of Object.entries(this.binaryCache)) {\n this.checkCompletion_(binary);\n }\n }\n async checkCompileCompletionAsync() {\n const ps = [];\n if (this.gpgpu.parallelCompilationExtension) {\n for (const [, binary] of Object.entries(this.binaryCache)) {\n ps.push(this.checkCompletionAsync_(binary));\n }\n return Promise.all(ps);\n }\n else {\n for (const [, binary] of Object.entries(this.binaryCache)) {\n const p = new Promise((resolve) => {\n try {\n this.checkCompletion_(binary);\n resolve(true);\n }\n catch (error) {\n throw error;\n }\n });\n ps.push(p);\n }\n return Promise.all(ps);\n }\n }\n async checkCompletionAsync_(binary) {\n if (this.gpgpu.gl.getProgramParameter(binary.webGLProgram, this.gpgpu.parallelCompilationExtension.COMPLETION_STATUS_KHR)) {\n return this.checkCompletion_(binary);\n }\n else {\n await nextFrame();\n return this.checkCompletionAsync_(binary);\n }\n }\n checkCompletion_(binary) {\n if (this.gpgpu.gl.getProgramParameter(binary.webGLProgram, this.gpgpu.gl.LINK_STATUS) === false) {\n console.log(this.gpgpu.gl.getProgramInfoLog(binary.webGLProgram));\n if (this.gpgpu.gl.getShaderParameter(binary.fragmentShader, this.gpgpu.gl.COMPILE_STATUS) === false) {\n webgl_util.logShaderSourceAndInfoLog(binary.source, this.gpgpu.gl.getShaderInfoLog(binary.fragmentShader));\n throw new Error('Failed to compile fragment shader.');\n }\n throw new Error('Failed to link vertex and fragment shaders.');\n }\n return true;\n }\n getUniformLocations() {\n for (const [, binary] of Object.entries(this.binaryCache)) {\n const { uniformLocations, customUniformLocations, infLoc, nanLoc, inShapesLocations, inTexShapesLocations, outShapeLocation, outShapeStridesLocation, outTexShapeLocation } = getUniformLocations(this.gpgpu, binary.program, binary.webGLProgram);\n binary.uniformLocations = uniformLocations;\n binary.customUniformLocations = customUniformLocations;\n binary.infLoc = infLoc;\n binary.nanLoc = nanLoc;\n binary.inShapesLocations = inShapesLocations;\n binary.inTexShapesLocations = inTexShapesLocations;\n binary.outShapeLocation = outShapeLocation;\n binary.outShapeStridesLocation = outShapeStridesLocation;\n binary.outTexShapeLocation = outTexShapeLocation;\n }\n }\n}\nMathBackendWebGL.nextDataId = 0;\nfunction float32ToTypedArray(a, dtype) {\n if (dtype === 'float32' || dtype === 'complex64') {\n return a;\n }\n else if (dtype === 'int32' || dtype === 'bool') {\n const result = (dtype === 'int32') ? new Int32Array(a.length) :\n new Uint8Array(a.length);\n for (let i = 0; i < result.length; ++i) {\n result[i] = Math.round(a[i]);\n }\n return result;\n }\n else {\n throw new Error(`Unknown dtype ${dtype}`);\n }\n}\n//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYmFja2VuZF93ZWJnbC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uL3RmanMtYmFja2VuZC13ZWJnbC9zcmMvYmFja2VuZF93ZWJnbC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQTs7Ozs7Ozs7Ozs7Ozs7O0dBZUc7QUFFSCxzQkFBc0I7QUFDdEIsT0FBTyxlQUFlLENBQUM7QUFHdkIsT0FBTyxFQUFDLFlBQVksRUFBaUIsTUFBTSxFQUFVLFdBQVcsRUFBa0MsTUFBTSxFQUFFLEdBQUcsRUFBVyxZQUFZLEVBQUUsYUFBYSxFQUFjLFNBQVMsRUFBeUMsTUFBTSxFQUF3RCxJQUFJLEVBQTBCLElBQUksRUFBQyxNQUFNLHVCQUF1QixDQUFDO0FBQ2xWLE9BQU8sRUFBQyxlQUFlLEVBQUMsTUFBTSxlQUFlLENBQUM7QUFDOUMsT0FBTyxFQUFDLG1CQUFtQixFQUFDLE1BQU0scUJBQXFCLENBQUM7QUFDeEQsT0FBTyxFQUFDLHlCQUF5QixFQUFDLE1BQU0sNEJBQTRCLENBQUM7QUFDckUsT0FBTyxFQUFDLGtCQUFrQixFQUFDLE1BQU0sb0JBQW9CLENBQUM7QUFDdEQsT0FBTyxFQUFDLHdCQUF3QixFQUFDLE1BQU0sMkJBQTJCLENBQUM7QUFDbkUsT0FBTyxFQUFDLG1CQUFtQixFQUFDLE1BQU0scUJBQXFCLENBQUM7QUFDeEQsT0FBTyxFQUFDLHlCQUF5QixFQUFDLE1BQU0sNEJBQTRCLENBQUM7QUFDckUsT0FBTyxFQUFDLFlBQVksRUFBQyxNQUFNLGlCQUFpQixDQUFDO0FBQzdDLE9BQU8sS0FBSyxVQUFVLE1BQU0sY0FBYyxDQUFDO0FBQzNDLE9BQU8sRUFBQyxtQkFBbUIsRUFBd0MsTUFBTSxjQUFjLENBQUM7QUFDeEYsT0FBTyxFQUFDLGdCQUFnQixFQUFDLE1BQU0sdUJBQXVCLENBQUM7QUFDdkQsT0FBTyxFQUFDLFdBQVcsRUFBQyxNQUFNLFlBQVksQ0FBQztBQUN2QyxPQUFPLEVBQUMsb0JBQW9CLEVBQUMs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UUFDOUQsS0FBSyxJQUFJLENBQUMsR0FBRyxDQUFDLEVBQUUsQ0FBQyxHQUFHLE1BQU0sQ0FBQyxNQUFNLEVBQUUsRUFBRSxDQUFDLEVBQUU7WUFDdEMsTUFBTSxDQUFDLENBQUMsQ0FBQyxHQUFHLElBQUksQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUM7U0FDOUI7UUFDRCxPQUFPLE1BQTJCLENBQUM7S0FDcEM7U0FBTTtRQUNMLE1BQU0sSUFBSSxLQUFLLENBQUMsaUJBQWlCLEtBQUssRUFBRSxDQUFDLENBQUM7S0FDM0M7QUFDSCxDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiLyoqXG4gKiBAbGljZW5zZVxuICogQ29weXJpZ2h0IDIwMTcgR29vZ2xlIExMQy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC5cbiAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSBcIkxpY2Vuc2VcIik7XG4gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuXG4gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXRcbiAqXG4gKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjBcbiAqXG4gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlXG4gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiBcIkFTIElTXCIgQkFTSVMsXG4gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC5cbiAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmRcbiAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLlxuICogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbiAqL1xuXG4vLyBJbXBvcnQgd2ViZ2wgZmxhZ3MuXG5pbXBvcnQgJy4vZmxhZ3Nfd2ViZ2wnO1xuXG5pbXBvcnQgKiBhcyB0ZiBmcm9tICdAdGVuc29yZmxvdy90ZmpzLWNvcmUnO1xuaW1wb3J0IHtiYWNrZW5kX3V0aWwsIEJhY2tlbmRWYWx1ZXMsIGJ1ZmZlciwgRGF0YUlkLCBEYXRhU3RvcmFnZSwgRGF0YVRvR1BVV2ViR0xPcHRpb24sIERhdGFUeXBlLCBlbmdpbmUsIGVudiwgR1BVRGF0YSwga2VybmVsX2ltcGxzLCBLZXJuZWxCYWNrZW5kLCBNZW1vcnlJbmZvLCBuZXh0RnJhbWUsIE51bWVyaWNEYXRhVHlwZSwgUmFuaywgUmVjdXJzaXZlQXJyYXksIHNjYWxhciwgU2hhcGVNYXAsIFRlbnNvciwgVGVuc29yMkQsIFRlbnNvckJ1ZmZlciwgVGVuc29ySW5mbywgdGlkeSwgVGltaW5nSW5mbywgVHlwZWRBcnJheSwgdXRpbH0gZnJvbSAnQHRlbnNvcmZsb3cvdGZqcy1jb3JlJztcbmltcG9ydCB7Z2V0V2ViR0xDb250ZXh0fSBmcm9tICcuL2NhbnZhc191dGlsJztcbmltcG9ydCB7RGVjb2RlTWF0cml4UHJvZ3JhbX0gZnJvbSAnLi9kZWNvZGVfbWF0cml4X2dwdSc7XG5pbXBvcnQge0RlY29kZU1hdHJpeFBhY2tlZFByb2dyYW19IGZyb20gJy4vZGVjb2RlX21hdHJpeF9wYWNrZWRfZ3B1JztcbmltcG9ydCB7RW5jb2RlRmxvYXRQcm9ncmFtfSBmcm9tICcuL2VuY29kZV9mbG9hdF9ncHUnO1xuaW1wb3J0IHtFbmNvZGVGbG9hdFBhY2tlZFByb2dyYW19IGZyb20gJy4vZW5jb2RlX2Zsb2F0X3BhY2tlZF9ncHUnO1xuaW1wb3J0IHtFbmNvZGVNYXRyaXhQcm9ncmFtfSBmcm9tICcuL2VuY29kZV9tYXRyaXhfZ3B1JztcbmltcG9ydCB7RW5jb2RlTWF0cml4UGFja2VkUHJvZ3JhbX0gZnJvbSAnLi9lbmNvZGVfbWF0cml4X3BhY2tlZF9ncHUnO1xuaW1wb3J0IHtHUEdQVUNvbnRleHR9IGZyb20gJy4vZ3BncHVfY29udGV4dCc7XG5pbXBvcnQgKiBhcyBncGdwdV9tYXRoIGZyb20gJy4vZ3BncHVfbWF0aCc7XG5pbXBvcnQge2dldFVuaWZvcm1Mb2NhdGlvbnMsIEdQR1BVQmluYXJ5LCBHUEdQVVByb2dyYW0sIFRlbnNvckRhdGF9IGZyb20gJy4vZ3BncHVfbWF0aCc7XG5pbXBvcnQge3NpbXBsZUFic0ltcGxDUFV9IGZyb20gJy4va2VybmVsX3V0aWxzL3NoYXJlZCc7XG5pbXBvcnQge1BhY2tQcm9ncmFtfSBmcm9tICcuL3BhY2tfZ3B1JztcbmltcG9ydCB7UmVzaGFwZVBhY2tlZFByb2dyYW19IGZyb20gJy4vcmVzaGFwZV9wYWNrZWRfZ3B1JztcbmltcG9ydCAqIGFzIHRleF91dGlsIGZyb20gJy4vdGV4X3V0aWwnO1xuaW1wb3J0IHtUZXh0dXJlLCBUZXh0dXJlRGF0YSwgVGV4dHVyZVVzYWdlfSBmcm9tICcuL3RleF91dGlsJztcbmltcG9ydCB7VGV4dHVyZU1hbmFnZXJ9IGZyb20gJy4vdGV4dHVyZV9tYW5hZ2VyJztcbmltcG9ydCAqIGFzIHVuYXJ5X29wIGZyb20gJy4vdW5hcnlvcF9ncHUnO1xuaW1wb3J0IHtVbmFyeU9wUHJvZ3JhbX0gZnJvbSAnLi91bmFyeW9wX2dwdSc7XG5pbXBvcnQge1VuYXJ5T3BQYWNrZWRQcm9ncmFtfSBmcm9tICcuL3VuYXJ5b3BfcGFja2VkX2dwdSc7XG5pbXBvcnQge1VucGFja1Byb2dyYW19IGZyb20gJy4vdW5wYWNrX2dwdSc7XG5pbXBvcnQgKiBhcyB3ZWJnbF91dGlsIGZyb20gJy4vd2ViZ2xfdXRpbCc7XG5cbmNvbnN0IHdoZXJlSW1wbCA9IGtlcm5lbF9pbXBscy53aGVyZUltcGw7XG5cbmV4cG9ydCBjb25zdCBFUFNJTE9OX0ZMT0FUMzIgPSAxZS03O1xuZXhwb3J0IGNvbnN0IEVQU0lMT05fRkxPQVQxNiA9IDFlLTQ7XG5cbnR5cGUgS2VybmVsSW5mbyA9IHtcbiAgbmFtZTogc3RyaW5nOyBxdWVyeTogUHJvbWlzZTxudW1iZXI+O1xufTtcblxuZXhwb3J0IHR5cGUgVGltZXJOb2RlID0gUmVjdXJzaXZlQXJyYXk8S2VybmVsSW5mbz58S2VybmVsSW5mbztcbmV4cG9ydCBpbnRlcmZhY2UgQ1BVVGltZXJRdWVyeSB7XG4gIHN0YXJ0TXM6IG51bWJlcjtcbiAgZW5kTXM/OiBudW1iZXI7XG59XG5cbmV4cG9ydCBpbnRlcmZhY2UgV2ViR0xNZW1vcnlJbmZvIGV4dGVuZHMgTWVtb3J5SW5mbyB7XG4gIG51bUJ5dGVzSW5HUFU6IG51bWJlcjtcbiAgLy8gVHJhY2tzIHRoZSB0b3RhbCBudW1iZXIgb2YgYnl0ZXMgYWxsb2NhdGVkIG9uIHRoZSBHUFUsIGFjY291bnRpbmcgZm9yIHRoZVxuICAvLyBwaHlzaWNhbCB0ZXh0dXJlIHR5cGUuXG4gIG51bUJ5dGVzSW5HUFVBbGxvY2F0ZWQ6IG51bWJlcjtcbiAgLy8gVHJhY2tzIGJ5dGUgc2l6ZSBvZiB0ZXh0dXJlcyB0aGF0IHdlcmUgY3JlYXRlZCBhbmQgdGhlbiBtYWRlIGF2YWlsYWJsZSBmb3JcbiAgLy8gcmV1c2UgKGRpc3Bvc2VkKS5cbiAgbnVtQnl0ZXNJbkdQVUZyZWU6IG51bWJlcjtcbiAgdW5yZWxpYWJsZTogYm9vbGVhbjtcbn1cblxuZXhwb3J0IGludGVyZmFjZSBXZWJHTFRpbWluZ0luZm8gZXh0ZW5kcyBUaW1pbmdJbmZvIHtcbiAgdXBsb2FkV2FpdE1zOiBudW1iZXI7XG4gIGRvd25sb2FkV2FpdE1zOiBudW1iZXI7XG59XG5cbmNvbnN0IGJpbmFyeUNhY2hlczoge1t3ZWJHTFZlcnNpb246IHN0cmluZ106IHtba2V5OiBzdHJpbmddOiBHUEdQVUJpbmFyeX19ID0ge307XG5cbmV4cG9ydCBmdW5jdGlvbiBnZXRCaW5hcnlDYWNoZSh3ZWJHTFZlcnNpb246IG51bWJlcikge1xuICBpZiAod2ViR0xWZXJzaW9uIGluIGJpbmFyeUNhY2hlcykge1xuICAgIHJldHVybiBiaW5hcnlDYWNoZXNbd2ViR0xWZXJzaW9uXTtcbiAgfVxuICBiaW5hcnlDYWNoZXNbd2ViR0xWZXJzaW9uXSA9IHt9O1xuICByZXR1cm4gYmluYXJ5Q2FjaGVzW3dlYkdMVmVyc2lvbl07XG59XG5cbi8vIEVtcGlyaWNhbGx5IGRldGVybWluZWQgY29uc3RhbnQgdXNlZCB0byBkZXRlcm1pbmUgc2l6ZSB0aHJlc2hvbGQgZm9yIGhhbmRpbmdcbi8vIG9mZiBleGVjdXRpb24gdG8gdGhlIENQVS5cbmNvbnN0IENQVV9IQU5ET0ZGX1NJWkVfVEhSRVNIT0xEID1cbiAgICBlbnYoKS5nZXROdW1iZXIoJ0NQVV9IQU5ET0ZGX1NJWkVfVEhSRVNIT0xEJyk7XG5cbi8vIEVtcGlyaWNhbGx5IGRldGVybWluZWQgY29uc3RhbnQgdXNlZCB0byBkZWNpZGUgdGhlIG51bWJlciBvZiBNQiBvbiBHUFVcbi8vIGJlZm9yZSB3ZSB3YXJuIGFib3V0IGhpZ2ggbWVtb3J5IHVzZS4gVGhlIE1CIGFyZSB0aGlzIGNvbnN0YW50ICogc2NyZWVuIGFyZWFcbi8vICogZHBpIC8gMTAyNCAvIDEwMjQuXG5jb25zdCBCRUZPUkVfUEFHSU5HX0NPTlNUQU5UID0gNjAwO1xuZnVuY3Rpb24gbnVtTUJCZWZvcmVXYXJuaW5nKCk6IG51bWJlciB7XG4gIGlmIChlbnYoKS5nbG9iYWwuc2NyZWVuID09IG51bGwpIHtcbiAgICByZXR1cm4gMTAyNDsgIC8vIDEgR0IuXG4gIH1cbiAgcmV0dXJuIChlbnYoKS5nbG9iYWwuc2NyZWVuLmhlaWdodCAqIGVudigpLmdsb2JhbC5zY3JlZW4ud2lkdGggKlxuICAgICAgICAgIHdpbmRvdy5kZXZpY2VQaXhlbFJhdGlvKSAqXG4gICAgICBCRUZPUkVfUEFHSU5HX0NPTlNUQU5UIC8gMTAyNCAvIDEwMjQ7XG59XG5cbmV4cG9ydCBjbGFzcyBNYXRoQmFja2VuZFdlYkdMIGV4dGVuZHMgS2VybmVsQmFja2VuZCB7XG4gIHRleERhdGE6IERhdGFTdG9yYWdlPFRleHR1cmVEYXRhPjtcbiAgZ3BncHU6IEdQR1BVQ29udGV4dDtcblxuICBwcml2YXRlIHN0YXRpYyBuZXh0RGF0YUlkID0gMDtcbiAgcHJpdmF0ZSBuZXh0RGF0YUlkKCk6IG51bWJlciB7XG4gICAgcmV0dXJuIE1hdGhCYWNrZW5kV2ViR0wubmV4dERhdGFJZCsrO1xuICB9XG4gIC8vIE1hcHMgZGF0YSBpZHMgdGhhdCBoYXZlIGEgcGVuZGluZyByZWFkIG9wZXJhdGlvbiwgdG8gbGlzdCBvZiBzdWJzY3JpYmVycy5cbiAgcHJpdmF0ZSBwZW5kaW5nUmVhZCA9IG5ldyBXZWFrTWFwPERhdGFJZCwgQXJyYXk8KGFycjogVHlwZWRBcnJheSkgPT4gdm9pZD4+KCk7XG4gIC8vIExpc3Qgb2YgZGF0YSBpZHMgdGhhdCBhcmUgc2NoZWR1bGVkIGZvciBkaXNwb3NhbCwgYnV0IGFyZSB3YWl0aW5nIG9uIGFcbiAgLy8gcGVuZGluZyByZWFkIG9wZXJhdGlvbi5cbiAgcHJpdmF0ZSBwZW5kaW5nRGlzcG9zYWwgPSBuZXcgV2Vha1NldDxEYXRhSWQ+KCk7XG5cbiAgLy8gVXNlZCB0byBjb3VudCB0aGUgbnVtYmVyIG9mICdzaGFsbG93JyBzbGljZWQgdGVuc29ycyB0aGF0IHBvaW50IHRvIHRoZVxuICAvLyBzYW1lIGRhdGEgaWQuXG4gIGRhdGFSZWZDb3VudCA9IG5ldyBXZWFrTWFwPERhdGFJZCwgbnVtYmVyPigpO1xuICBwcml2YXRlIG51bUJ5dGVzSW5HUFUgPSAwO1xuXG4gIHByaXZhdGUgY2FudmFzOiBIVE1MQ2FudmFzRWxlbWVudHxPZmZzY3JlZW5DYW52YXM7XG5cbiAgcHJpdmF0ZSBwcm9ncmFtVGltZXJzU3RhY2s6IFRpbWVyTm9kZVtdO1xuICBwcml2YXRlIGFjdGl2ZVRpbWVyczogVGltZXJOb2RlW107XG4gIC8vIEFjY3VtdWxhdGVkIHRpbWUgc3BlbnQgKGluY2x1ZGluZyBibG9ja2luZykgaW4gdXBsb2FkaW5nIGRhdGEgdG8gd2ViZ2wuXG4gIHByaXZhdGUgdXBsb2FkV2FpdE1zID0gMDtcbiAgLy8gQWNjdW11bGF0ZWQgdGltZSBzcGVudCAoaW5jbHVkaW5nIGJsb2NraW5nIGluIGRvd25sb2FkaW5nIGRhdGEgZnJvbSB3ZWJnbC5cbiAgcHJpdmF0ZSBkb3dubG9hZFdhaXRNcyA9IDA7XG5cbiAgLy8gcmVjb3JkIHRoZSBsYXN0IG1hbnVhbCBHTCBGbHVzaCB0aW1lLlxuICBwcml2YXRlIGxhc3RHbEZsdXNoVGltZSA9IDA7XG5cbiAgLy8gTnVtYmVyIG9mIGJpdHMgb2YgcHJlY2lzaW9uIG9mIHRoaXMgYmFja2VuZC5cbiAgcHJpdmF0ZSBmbG9hdFByZWNpc2lvblZhbHVlOiAzMnwxNjtcblxuICBwcml2YXRlIHRleHR1cmVNYW5hZ2VyOiBUZXh0dXJlTWFuYWdlcjtcbiAgcHJpdmF0ZSBiaW5hcnlDYWNoZToge1trZXk6IHN0cmluZ106IEdQR1BVQmluYXJ5fTtcbiAgcHJpdmF0ZSBncGdwdUNyZWF0ZWRMb2NhbGx5OiBib29sZWFuO1xuICBwcml2YXRlIG51bU1CQmVmb3JlV2FybmluZzogbnVtYmVyO1xuICBwcml2YXRlIHdhcm5lZEFib3V0TWVtb3J5ID0gZmFsc2U7XG5cbiAgY29uc3RydWN0b3IoZ3B1UmVzb3VyY2U/OiBHUEdQVUNvbnRleHR8SFRNTENhbnZhc0VsZW1lbnR8T2Zmc2NyZWVuQ2FudmFzKSB7XG4gICAgc3VwZXIoKTtcbiAgICBpZiAoIWVudigpLmdldEJvb2woJ0hBU19XRUJHTCcpKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoJ1dlYkdMIGlzIG5vdCBzdXBwb3J0ZWQgb24gdGhpcyBkZXZpY2UnKTtcbiAgICB9XG5cbiAgICBsZXQgbmV3R1BHUFU7XG4gICAgaWYgKGdwdVJlc291cmNlICE9IG51bGwpIHtcbiAgICAgIGlmIChncHVSZXNvdXJjZSBpbnN0YW5jZW9mIEdQR1BVQ29udGV4dCkge1xuICAgICAgICBuZXdHUEdQVSA9IGdwdVJlc291cmNlO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgY29uc3QgZ2wgPVxuICAgICAgICAgICAgZ2V0V2ViR0xDb250ZXh0KGVudigpLmdldE51bWJlcignV0VCR0xfVkVSU0lPTicpLCBncHVSZXNvdXJjZSk7XG4gICAgICAgIG5ld0dQR1BVID0gbmV3IEdQR1BVQ29udGV4dChnbCk7XG4gICAgICB9XG4gICAgICB0aGlzLmJpbmFyeUNhY2hlID0ge307XG4gICAgICB0aGlzLmdwZ3B1Q3JlYXRlZExvY2FsbHkgPSBmYWxzZTtcbiAgICB9IGVsc2Uge1xuICAgICAgY29uc3QgZ2wgPSBnZXRXZWJHTENvbnRleHQoZW52KCkuZ2V0TnVtYmVyKCdXRUJHTF9WRVJTSU9OJykpO1xuICAgICAgbmV3R1BHUFUgPSBuZXcgR1BHUFVDb250ZXh0KGdsKTtcbiAgICAgIHRoaXMuYmluYXJ5Q2FjaGUgPSBnZXRCaW5hcnlDYWNoZShlbnYoKS5nZXROdW1iZXIoJ1dFQkdMX1ZFUlNJT04nKSk7XG4gICAgICB0aGlzLmdwZ3B1Q3JlYXRlZExvY2FsbHkgPSB0cnVlO1xuICAgIH1cblxuICAgIHRoaXMuZ3BncHUgPSBuZXdHUEdQVTtcbiAgICB0aGlzLmNhbnZhcyA9IHRoaXMuZ3BncHUuZ2wuY2FudmFzO1xuICAgIHRoaXMudGV4dHVyZU1hbmFnZXIgPSBuZXcgVGV4dHVyZU1hbmFnZXIodGhpcy5ncGdwdSk7XG4gICAgdGhpcy5udW1NQkJlZm9yZVdhcm5pbmcgPSBudW1NQkJlZm9yZVdhcm5pbmcoKTtcbiAgICB0aGlzLnRleERhdGEgPSBuZXcgRGF0YVN0b3JhZ2UodGhpcywgZW5naW5lKCkpO1xuICB9XG5cbiAgbnVtRGF0YUlkcygpIHtcbiAgICByZXR1cm4gdGhpcy50ZXhEYXRhLm51bURhdGFJZHMoKSAtIHRoaXMucGVuZGluZ0RlbGV0ZXM7XG4gIH1cblxuICB3cml0ZSh2YWx1ZXM6IEJhY2tlbmRWYWx1ZXMsIHNoYXBlOiBudW1iZXJbXSwgZHR5cGU6IERhdGFUeXBlKTogRGF0YUlkIHtcbiAgICBpZiAoZW52KCkuZ2V0Qm9vbCgnV0VCR0xfQ0hFQ0tfTlVNRVJJQ0FMX1BST0JMRU1TJykgfHxcbiAgICAgICAgZW52KCkuZ2V0Qm9vbCgnREVCVUcnKSkge1xuICAgICAgdGhpcy5jaGVja051bWVyaWNhbFByb2JsZW1zKHZhbHVlcyk7XG4gICAgfVxuICAgIGlmIChkdHlwZSA9PT0gJ2NvbXBsZXg2NCcgJiYgdmFsdWVzICE9IG51bGwpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcihcbiAgICAgICAgICBgQ2Fubm90IHdyaXRlIHRvIGEgY29tcGxleDY0IGR0eXBlLiBgICtcbiAgICAgICAgICBgUGxlYXNlIHVzZSB0Zi5jb21wbGV4KHJlYWwsIGltYWcpLmApO1xuICAgIH1cbiAgICBjb25zdCBkYXRhSWQgPSB7aWQ6IHRoaXMubmV4dERhdGFJZCgpfTtcbiAgICB0aGlzLnRleERhdGEuc2V0KFxuICAgICAgICBkYXRhSWQsXG4gICAgICAgIHtzaGFwZSwgZHR5cGUsIHZhbHVlcywgdXNhZ2U6IFRleHR1cmVVc2FnZS5VUExPQUQsIHJlZkNvdW50OiAxfSk7XG4gICAgcmV0dXJuIGRhdGFJZDtcbiAgfVxuXG4gIC8qKiBSZXR1cm4gcmVmQ291bnQgb2YgYSBgVGVuc29yRGF0YWAuICovXG4gIHJlZkNvdW50KGRhdGFJZDogRGF0YUlkKTogbnVtYmVyIHtcbiAgICBpZiAodGhpcy50ZXhEYXRhLmhhcyhkYXRhSWQpKSB7XG4gICAgICBjb25zdCB0ZW5zb3JEYXRhID0gdGhpcy50ZXhEYXRhLmdldChkYXRhSWQpO1xuICAgICAgcmV0dXJuIHRlbnNvckRhdGEucmVmQ291bnQ7XG4gICAgfVxuICAgIHJldHVybiAwO1xuICB9XG5cbiAgLyoqIEluY3JlYXNlIHJlZkNvdW50IG9mIGEgYFRleHR1cmVEYXRhYC4gKi9cbiAgaW5jUmVmKGRhdGFJZDogRGF0YUlkKTogdm9pZCB7XG4gICAgY29uc3QgdGV4RGF0YSA9IHRoaXMudGV4RGF0YS5nZXQoZGF0YUlkKTtcbiAgICB0ZXhEYXRhLnJlZkNvdW50Kys7XG4gIH1cblxuICAvKiogRGVjcmVhc2UgcmVmQ291bnQgb2YgYSBgVGV4dHVyZURhdGFgLiAqL1xuICBkZWNSZWYoZGF0YUlkOiBEYXRhSWQpOiB2b2lkIHtcbiAgICBpZiAodGhpcy50ZXhEYXRhLmhhcyhkYXRhSWQpKSB7XG4gICAgICBjb25zdCB0ZXhEYXRhID0gdGhpcy50ZXhEYXRhLmdldChkYXRhSWQpO1xuICAgICAgdGV4RGF0YS5yZWZDb3VudC0tO1xuICAgIH1cbiAgfVxuXG4gIG1vdmUoXG4gICAgICBkYXRhSWQ6IERhdGFJZCwgdmFsdWVzOiBCYWNrZW5kVmFsdWVzLCBzaGFwZTogbnVtYmVyW10sIGR0eXBlOiBEYXRhVHlwZSxcbiAgICAgIHJlZkNvdW50OiBudW1iZXIpOiB2b2lkIHtcbiAgICBpZiAoZW52KCkuZ2V0Qm9vbCgnREVCVUcnKSkge1xuICAgICAgdGhpcy5jaGVja051bWVyaWNhbFByb2JsZW1zKHZhbHVlcyk7XG4gICAgfVxuICAgIGlmIChkdHlwZSA9PT0gJ2NvbXBsZXg2NCcpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcihcbiAgICAgICAgICBgQ2Fubm90IHdyaXRlIHRvIGEgY29tcGxleDY0IGR0eXBlLiBgICtcbiAgICAgICAgICBgUGxlYXNlIHVzZSB0Zi5jb21wbGV4KHJlYWwsIGltYWcpLmApO1xuICAgIH1cbiAgICB0aGlzLnRleERhdGEuc2V0KFxuICAgICAgICBkYXRhSWQsIHtzaGFwZSwgZHR5cGUsIHZhbHVlcywgdXNhZ2U6IFRleHR1cmVVc2FnZS5VUExPQUQsIHJlZkNvdW50fSk7XG4gIH1cblxuICBkaXNwb3NlSW50ZXJtZWRpYXRlVGVuc29ySW5mbyh0ZW5zb3JJbmZvOiBUZW5zb3JJbmZvKTogdm9pZCB7XG4gICAgdGhpcy5kaXNwb3NlRGF0YSh0ZW5zb3JJbmZvLmRhdGFJZCk7XG4gIH1cblxuICByZWFkU3luYyhkYXRhSWQ6IERhdGFJZCk6IEJhY2tlbmRWYWx1ZXMge1xuICAgIGNvbnN0IHRleERhdGEgPSB0aGlzLnRleERhdGEuZ2V0KGRhdGFJZCk7XG4gICAgY29uc3Qge3ZhbHVlcywgZHR5cGUsIGNvbXBsZXhUZW5zb3JJbmZvcywgc2xpY2UsIHNoYXBlLCBpc1BhY2tlZH0gPSB0ZXhEYXRhO1xuXG4gICAgLy8gVGhlIHByZXNlbmNlIG9mIGBzbGljZWAgaW5kaWNhdGVzIHRoaXMgdGVuc29yIGlzIGEgc2hhbGxvdyBzbGljZSBvZiBhXG4gICAgLy8gZGlmZmVyZW50IHRlbnNvciwgYW5kIGlzIHVzaW5nIHRoYXQgb3JpZ2luYWwgdGVuc29yJ3MgdGV4dHVyZS4gUnVuXG4gICAgLy8gYGNsb25lYCBpbiBvcmRlciB0byBjb3B5IHRoYXQgdGV4dHVyZSBhbmQgcmVhZCBmcm9tIGl0LlxuICAgIGlmIChzbGljZSAhPSBudWxsKSB7XG4gICAgICBsZXQgcHJvZ3JhbTtcbiAgICAgIGlmIChpc1BhY2tlZCkge1xuICAgICAgICBwcm9ncmFtID0gbmV3IFVuYXJ5T3BQYWNrZWRQcm9ncmFtKHNoYXBlLCB1bmFyeV9vcC5DTE9ORSk7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBwcm9ncmFtID0gbmV3IFVuYXJ5T3BQcm9ncmFtKHNoYXBlLCB1bmFyeV9vcC5DTE9ORSk7XG4gICAgICB9XG4gICAgICBjb25zdCByZXMgPVxuICAgICAgICAgIHRoaXMucnVuV2ViR0xQcm9ncmFtKHByb2dyYW0sIFt7ZGF0YUlkLCBzaGFwZSwgZHR5cGV9XSwgZHR5cGUpO1xuICAgICAgY29uc3QgZGF0YSA9IHRoaXMucmVhZFN5bmMocmVzLmRhdGFJZCk7XG4gICAgICB0aGlzLmRpc3Bvc2VJbnRlcm1lZGlhdGVUZW5zb3JJbmZvKHJlcyk7XG4gICAgICByZXR1cm4gZGF0YTtcbiAgICB9XG4gICAgaWYgKHZhbHVlcyAhPSBudWxsKSB7XG4gICAgICByZXR1cm4gdGhpcy5jb252ZXJ0QW5kQ2FjaGVPbkNQVShkYXRhSWQpO1xuICAgIH1cbiAgICBpZiAoZHR5cGUgPT09ICdzdHJpbmcnKSB7XG4gICAgICByZXR1cm4gdmFsdWVzO1xuICAgIH1cbiAgICBjb25zdCBzaG91bGRUaW1lUHJvZ3JhbSA9IHRoaXMuYWN0aXZlVGltZXJzICE9IG51bGw7XG4gICAgbGV0IHN0YXJ0OiBudW1iZXI7XG4gICAgaWYgKHNob3VsZFRpbWVQcm9ncmFtKSB7XG4gICAgICBzdGFydCA9IHV0aWwubm93KCk7XG4gICAgfVxuXG4gICAgbGV0IHJlc3VsdDogRmxvYXQzMkFycmF5O1xuICAgIGlmIChkdHlwZSA9PT0gJ2NvbXBsZXg2NCcpIHtcbiAgICAgIGNvbnN0IHJlYWxWYWx1ZXMgPVxuICAgICAgICAgIHRoaXMucmVhZFN5bmMoY29tcGxleFRlbnNvckluZm9zLnJlYWwuZGF0YUlkKSBhcyBGbG9hdDMyQXJyYXk7XG4gICAgICBjb25zdCBpbWFnVmFsdWVzID1cbiAgICAgICAgICB0aGlzLnJlYWRTeW5jKGNvbXBsZXhUZW5zb3JJbmZvcy5pbWFnLmRhdGFJZCkgYXMgRmxvYXQzMkFycmF5O1xuICAgICAgcmVzdWx0ID0gYmFja2VuZF91dGlsLm1lcmdlUmVhbEFuZEltYWdBcnJheXMocmVhbFZhbHVlcywgaW1hZ1ZhbHVlcyk7XG4gICAgfSBlbHNlIHtcbiAgICAgIHJlc3VsdCA9IHRoaXMuZ2V0VmFsdWVzRnJvbVRleHR1cmUoZGF0YUlkKTtcbiAgICB9XG5cbiAgICBpZiAoc2hvdWxkVGltZVByb2dyYW0pIHtcbiAgICAgIHRoaXMuZG93bmxvYWRXYWl0TXMgKz0gdXRpbC5ub3coKSAtIHN0YXJ0O1xuICAgIH1cbiAgICByZXR1cm4gdGhpcy5jb252ZXJ0QW5kQ2FjaGVPbkNQVShkYXRhSWQsIHJlc3VsdCk7XG4gIH1cblxuICBhc3luYyByZWFkKGRhdGFJZDogRGF0YUlkKTogUHJvbWlzZTxCYWNrZW5kVmFsdWVzPiB7XG4gICAgaWYgKHRoaXMucGVuZGluZ1JlYWQuaGFzKGRhdGFJZCkpIHtcbiAgICAgIGNvbnN0IHN1YnNjcmliZXJzID0gdGhpcy5wZW5kaW5nUmVhZC5nZXQoZGF0YUlkKTtcbiAgICAgIHJldHVybiBuZXcgUHJvbWlzZTxUeXBlZEFycmF5PihyZXNvbHZlID0+IHN1YnNjcmliZXJzLnB1c2gocmVzb2x2ZSkpO1xuICAgIH1cbiAgICBjb25zdCB0ZXhEYXRhID0gdGhpcy50ZXhEYXRhLmdldChkYXRhSWQpO1xuICAgIGNvbnN0IHt2YWx1ZXMsIHNoYXBlLCBzbGljZSwgZHR5cGUsIGNvbXBsZXhUZW5zb3JJbmZvcywgaXNQYWNrZWR9ID0gdGV4RGF0YTtcblxuICAgIC8vIFRoZSBwcmVzZW5jZSBvZiBgc2xpY2VgIGluZGljYXRlcyB0aGlzIHRlbnNvciBpcyBhIHNoYWxsb3cgc2xpY2Ugb2YgYVxuICAgIC8vIGRpZmZlcmVudCB0ZW5zb3IsIGFuZCBpcyB1c2luZyB0aGF0IG9yaWdpbmFsIHRlbnNvcidzIHRleHR1cmUuIFJ1blxuICAgIC8vIGBjbG9uZWAgaW4gb3JkZXIgdG8gY29weSB0aGF0IHRleHR1cmUgYW5kIHJlYWQgZnJvbSBpdC5cbiAgICBpZiAoc2xpY2UgIT0gbnVsbCkge1xuICAgICAgbGV0IHByb2dyYW07XG4gICAgICBpZiAoaXNQYWNrZWQpIHtcbiAgICAgICAgcHJvZ3JhbSA9IG5ldyBVbmFyeU9wUGFja2VkUHJvZ3JhbShzaGFwZSwgdW5hcnlfb3AuQ0xPTkUpO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgcHJvZ3JhbSA9IG5ldyBVbmFyeU9wUHJvZ3JhbShzaGFwZSwgdW5hcnlfb3AuQ0xPTkUpO1xuICAgICAgfVxuICAgICAgY29uc3QgcmVzID1cbiAgICAgICAgICB0aGlzLnJ1bldlYkdMUHJvZ3JhbShwcm9ncmFtLCBbe2RhdGFJZCwgc2hhcGUsIGR0eXBlfV0sIGR0eXBlKTtcbiAgICAgIGNvbnN0IGRhdGEgPSB0aGlzLnJlYWQocmVzLmRhdGFJZCk7XG4gICAgICB0aGlzLmRpc3Bvc2VJbnRlcm1lZGlhdGVUZW5zb3JJbmZvKHJlcyk7XG4gICAgICByZXR1cm4gZGF0YTtcbiAgICB9XG5cbiAgICBpZiAodmFsdWVzICE9IG51bGwpIHtcbiAgICAgIHJldHVybiB0aGlzLmNvbnZlcnRBbmRDYWNoZU9uQ1BVKGRhdGFJZCk7XG4gICAgfVxuXG4gICAgaWYgKGVudigpLmdldEJvb2woJ0RFQlVHJykpIHtcbiAgICAgIC8vIGdldEJvb2woJ1dFQkdMX0RPV05MT0FEX0ZMT0FUX0VOQUJMRUQnKSBjYXVzZWQgYSBibG9ja2luZyBHUFUgY2FsbC5cbiAgICAgIC8vIEZvciBwZXJmb3JtYW5jZSByZWFzb24sIG9ubHkgY2hlY2sgaXQgZm9yIGRlYnVnZ2luZy4gSW4gcHJvZHVjdGlvbixcbiAgICAgIC8vIGl0IGRvZXNuJ3QgaGFuZGxlIHRoaXMgdXNlIGNhc2UgYW55d2F5LCBzbyBiZWhhdmlvciBpcyBub3QgY2hhbmdlZC5cbiAgICAgIGlmICghZW52KCkuZ2V0Qm9vbCgnV0VCR0xfRE9XTkxPQURfRkxPQVRfRU5BQkxFRCcpICYmXG4gICAgICAgICAgZW52KCkuZ2V0TnVtYmVyKCdXRUJHTF9WRVJTSU9OJykgPT09IDIpIHtcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKFxuICAgICAgICAgICAgYHRlbnNvci5kYXRhKCkgd2l0aCBXRUJHTF9ET1dOTE9BRF9GTE9BVF9FTkFCTEVEPWZhbHNlIGFuZCBgICtcbiAgICAgICAgICAgIGBXRUJHTF9WRVJTSU9OPTIgbm90IHlldCBzdXBwb3J0ZWQuYCk7XG4gICAgICB9XG4gICAgfVxuXG4gICAgbGV0IGJ1ZmZlcjogV2ViR0xCdWZmZXIgPSBudWxsO1xuICAgIGxldCB0bXBEb3dubG9hZFRhcmdldDogVGVuc29ySW5mbztcblxuICAgIGlmIChkdHlwZSAhPT0gJ2NvbXBsZXg2NCcgJiYgZW52KCkuZ2V0KCdXRUJHTF9CVUZGRVJfU1VQUE9SVEVEJykpIHtcbiAgICAgIC8vIFBvc3NpYmx5IGNvcHkgdGhlIHRleHR1cmUgaW50byBhIGJ1ZmZlciBiZWZvcmUgaW5zZXJ0aW5nIGEgZmVuY2UuXG4gICAgICB0bXBEb3dubG9hZFRhcmdldCA9IHRoaXMuZGVjb2RlKGRhdGFJZCk7XG4gICAgICBjb25zdCB0bXBEYXRhID0gdGhpcy50ZXhEYXRhLmdldCh0bXBEb3dubG9hZFRhcmdldC5kYXRhSWQpO1xuXG4gICAgICBidWZmZXIgPSB0aGlzLmdwZ3B1LmNyZWF0ZUJ1ZmZlckZyb21UZXh0dXJlKFxuICAgICAgICAgIHRtcERhdGEudGV4dHVyZS50ZXh0dXJlLCAuLi50ZXhfdXRpbC5nZXREZW5zZVRleFNoYXBlKHNoYXBlKSk7XG4gICAgfVxuXG4gICAgdGhpcy5wZW5kaW5nUmVhZC5zZXQoZGF0YUlkLCBbXSk7XG5cbiAgICBpZiAoZHR5cGUgIT09ICdjb21wbGV4NjQnKSB7XG4gICAgICAvLyBDcmVhdGUgYSBmZW5jZSBhbmQgd2FpdCBmb3IgaXQgdG8gcmVzb2x2ZS5cbiAgICAgIGF3YWl0IHRoaXMuZ3BncHUuY3JlYXRlQW5kV2FpdEZvckZlbmNlKCk7XG4gICAgfVxuXG4gICAgLy8gRG93bmxvYWQgdGhlIHZhbHVlcyBmcm9tIHRoZSBHUFUuXG4gICAgbGV0IHZhbHM6IEZsb2F0MzJBcnJheTtcbiAgICBpZiAoZHR5cGUgPT09ICdjb21wbGV4NjQnKSB7XG4gICAgICBjb25zdCBwcyA9IGF3YWl0IFByb21pc2UuYWxsKFtcbiAgICAgICAgdGhpcy5yZWFkKGNvbXBsZXhUZW5zb3JJbmZvcy5yZWFsLmRhdGFJZCksXG4gICAgICAgIHRoaXMucmVhZChjb21wbGV4VGVuc29ySW5mb3MuaW1hZy5kYXRhSWQpXG4gICAgICBdKTtcblxuICAgICAgY29uc3QgcmVhbFZhbHVlcyA9IHBzWzBdO1xuICAgICAgY29uc3QgaW1hZ1ZhbHVlcyA9IHBzWzFdO1xuICAgICAgdmFscyA9IGJhY2tlbmRfdXRpbC5tZXJnZVJlYWxBbmRJbWFnQXJyYXlzKFxuICAgICAgICAgIHJlYWxWYWx1ZXMgYXMgRmxvYXQzMkFycmF5LCBpbWFnVmFsdWVzIGFzIEZsb2F0MzJBcnJheSk7XG4gICAgfSBlbHNlIGlmIChidWZmZXIgPT0gbnVsbCkge1xuICAgICAgdmFscyA9IHRoaXMuZ2V0VmFsdWVzRnJvbVRleHR1cmUoZGF0YUlkKTtcbiAgICB9IGVsc2Uge1xuICAgICAgY29uc3Qgc2l6ZSA9IHV0aWwuc2l6ZUZyb21TaGFwZShzaGFwZSk7XG4gICAgICB2YWxzID0gdGhpcy5ncGdwdS5kb3dubG9hZEZsb2F0MzJNYXRyaXhGcm9tQnVmZmVyKGJ1ZmZlciwgc2l6ZSk7XG4gICAgfVxuICAgIGlmICh0bXBEb3dubG9hZFRhcmdldCAhPSBudWxsKSB7XG4gICAgICB0aGlzLmRpc3Bvc2VJbnRlcm1lZGlhdGVUZW5zb3JJbmZvKHRtcERvd25sb2FkVGFyZ2V0KTtcbiAgICB9XG4gICAgaWYgKGJ1ZmZlciAhPSBudWxsKSB7XG4gICAgICBjb25zdCBnbCA9IHRoaXMuZ3BncHUuZ2w7XG4gICAgICB3ZWJnbF91dGlsLmNhbGxBbmRDaGVjayhnbCwgKCkgPT4gZ2wuZGVsZXRlQnVmZmVyKGJ1ZmZlcikpO1xuICAgIH1cbiAgICBjb25zdCBkVHlwZVZhbHMgPSB0aGlzLmNvbnZlcnRBbmRDYWNoZU9uQ1BVKGRhdGFJZCwgdmFscyk7XG5cbiAgICBjb25zdCBzdWJzY3JpYmVycyA9IHRoaXMucGVuZGluZ1JlYWQuZ2V0KGRhdGFJZCk7XG4gICAgdGhpcy5wZW5kaW5nUmVhZC5kZWxldGUoZGF0YUlkKTtcblxuICAgIC8vIE5vdGlmeSBhbGwgcGVuZGluZyByZWFkcy5cbiAgICBzdWJzY3JpYmVycy5mb3JFYWNoKHJlc29sdmUgPT4gcmVzb2x2ZShkVHlwZVZhbHMpKTtcbiAgICBpZiAodGhpcy5wZW5kaW5nRGlzcG9zYWwuaGFzKGRhdGFJZCkpIHtcbiAgICAgIHRoaXMucGVuZGluZ0Rpc3Bvc2FsLmRlbGV0ZShkYXRhSWQpO1xuICAgICAgaWYgKHRoaXMuZGlzcG9zZURhdGEoZGF0YUlkKSkge1xuICAgICAgICBlbmdpbmUoKS5yZW1vdmVEYXRhSWQoZGF0YUlkLCB0aGlzKTtcbiAgICAgIH1cbiAgICAgIHRoaXMucGVuZGluZ0RlbGV0ZXMtLTtcbiAgICB9XG4gICAgcmV0dXJuIGRUeXBlVmFscztcbiAgfVxuXG4gIC8qKlxuICAgKiBSZWFkIHRlbnNvciB0byBhIG5ldyB0ZXh0dXJlIHRoYXQgaXMgZGVuc2VseSBwYWNrZWQgZm9yIGVhc2Ugb2YgdXNlLlxuICAgKiBAcGFyYW0gZGF0YUlkIFRoZSBzb3VyY2UgdGVuc29yLlxuICAgKiBAcGFyYW0gb3B0aW9uc1xuICAgKiAgICAgY3VzdG9tVGV4U2hhcGU6IE9wdGlvbmFsLiBJZiBzZXQsIHdpbGwgdXNlIHRoZSB1c2VyIGRlZmluZWQgdGV4dHVyZVxuICAgKiAgICAgc2hhcGUgdG8gY3JlYXRlIHRoZSB0ZXh0dXJlLlxuICAgKi9cbiAgcmVhZFRvR1BVKGRhdGFJZDogRGF0YUlkLCBvcHRpb25zOiBEYXRhVG9HUFVXZWJHTE9wdGlvbiA9IHt9KTogR1BVRGF0YSB7XG4gICAgY29uc3QgdGV4RGF0YSA9IHRoaXMudGV4RGF0YS5nZXQoZGF0YUlkKTtcbiAgICBjb25zdCB7dmFsdWVzLCBzaGFwZSwgc2xpY2UsIGR0eXBlLCBpc1BhY2tlZCwgdGV4dHVyZX0gPSB0ZXhEYXRhO1xuXG4gICAgaWYgKGR0eXBlID09PSAnY29tcGxleDY0Jykge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKCdEb2VzIG5vdCBzdXBwb3J0IHJlYWRpbmcgdGV4dHVyZSBmb3IgY29tcGxleDY0IGR0eXBlLicpO1xuICAgIH1cblxuICAgIC8vIFRoZSBwcmVzZW5jZSBvZiBgc2xpY2VgIGluZGljYXRlcyB0aGlzIHRlbnNvciBpcyBhIHNoYWxsb3cgc2xpY2Ugb2YgYVxuICAgIC8vIGRpZmZlcmVudCB0ZW5zb3IsIGFuZCBpcyB1c2luZyB0aGF0IG9yaWdpbmFsIHRlbnNvcidzIHRleHR1cmUuIFJ1blxuICAgIC8vIGBjbG9uZWAgaW4gb3JkZXIgdG8gY29weSB0aGF0IHRleHR1cmUgYW5kIHJlYWQgZnJvbSBpdC5cbiAgICBpZiAoc2xpY2UgIT0gbnVsbCkge1xuICAgICAgbGV0IHByb2dyYW07XG4gICAgICBpZiAoaXNQYWNrZWQpIHtcbiAgICAgICAgcHJvZ3JhbSA9IG5ldyBVbmFyeU9wUGFja2VkUHJvZ3JhbShzaGFwZSwgdW5hcnlfb3AuQ0xPTkUpO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgcHJvZ3JhbSA9IG5ldyBVbmFyeU9wUHJvZ3JhbShzaGFwZSwgdW5hcnlfb3AuQ0xPTkUpO1xuICAgICAgfVxuICAgICAgY29uc3QgcmVzID1cbiAgICAgICAgICB0aGlzLnJ1bldlYkdMUHJvZ3JhbShwcm9ncmFtLCBbe2RhdGFJZCwgc2hhcGUsIGR0eXBlfV0sIGR0eXBlKTtcbiAgICAgIGNvbnN0IGdwdVJlc291b3JjZSA9IHRoaXMucmVhZFRvR1BVKHJlcywgb3B0aW9ucyk7XG4gICAgICB0aGlzLmRpc3Bvc2VJbnRlcm1lZGlhdGVUZW5zb3JJbmZvKHJlcyk7XG4gICAgICByZXR1cm4gZ3B1UmVzb3VvcmNlO1xuICAgIH1cblxuICAgIGlmICh0ZXh0dXJlID09IG51bGwpIHtcbiAgICAgIGlmICh2YWx1ZXMgIT0gbnVsbCkge1xuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ0RhdGEgaXMgbm90IG9uIEdQVSBidXQgb24gQ1BVLicpO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKCdUaGVyZSBpcyBubyBkYXRhIG9uIEdQVSBvciBDUFUuJyk7XG4gICAgICB9XG4gICAgfVxuXG4gICAgLy8gRGVjb2RlIHRoZSB0ZXh0dXJlIHNvIHRoYXQgaXQgaXMgc3RvcmVkIGRlbnNlbHkgKHVzaW5nIGZvdXIgY2hhbm5lbHMpLlxuICAgIGNvbnN0IHRtcFRhcmdldCA9IHRoaXMuZGVjb2RlKGRhdGFJZCwgb3B0aW9ucy5jdXN0b21UZXhTaGFwZSk7XG5cbiAgICAvLyBNYWtlIGVuZ2luZSB0cmFjayB0aGlzIHRlbnNvciwgc28gdGhhdCB3ZSBjYW4gZGlzcG9zZSBpdCBsYXRlci5cbiAgICBjb25zdCB0ZW5zb3JSZWYgPSBlbmdpbmUoKS5tYWtlVGVuc29yRnJvbVRlbnNvckluZm8odG1wVGFyZ2V0KTtcblxuICAgIGNvbnN0IHRtcERhdGEgPSB0aGlzLnRleERhdGEuZ2V0KHRtcFRhcmdldC5kYXRhSWQpO1xuICAgIHJldHVybiB7dGVuc29yUmVmLCAuLi50bXBEYXRhLnRleHR1cmV9O1xuICB9XG5cbiAgYnVmZmVyU3luYzxSIGV4dGVuZHMgUmFuaywgRCBleHRlbmRzIERhdGFUeXBlPih0OiBUZW5zb3JJbmZvKTpcbiAgICAgIFRlbnNvckJ1ZmZlcjxSLCBEPiB7XG4gICAgY29uc3QgZGF0YSA9IHRoaXMucmVhZFN5bmModC5kYXRhSWQpO1xuICAgIGlmICh0LmR0eXBlID09PSAnc3RyaW5nJykge1xuICAgICAgdHJ5IHtcbiAgICAgICAgLy8gRGVjb2RlIHRoZSBieXRlcyBpbnRvIHN0cmluZy5cbiAgICAgICAgY29uc3Qgc3RyaW5ncyA9IChkYXRhIGFzIFVpbnQ4QXJyYXlbXSkubWFwKGQgPT4gdXRpbC5kZWNvZGVTdHJpbmcoZCkpO1xuICAgICAgICByZXR1cm4gYnVmZmVyKHQuc2hhcGUgYXMgU2hhcGVNYXBbUl0sIHQuZHR5cGUsIHN0cmluZ3MpIGFzXG4gICAgICAgICAgICBUZW5zb3JCdWZmZXI8UiwgRD47XG4gICAgICB9IGNhdGNoIHtcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKCdGYWlsZWQgdG8gZGVjb2RlIGVuY29kZWQgc3RyaW5nIGJ5dGVzIGludG8gdXRmLTgnKTtcbiAgICAgIH1cbiAgICB9XG4gICAgcmV0dXJuIGJ1ZmZlcih0LnNoYXBlIGFzIFNoYXBlTWFwW1JdLCB0LmR0eXBlLCBkYXRhIGFzIFR5cGVkQXJyYXkpIGFzXG4gICAgICAgIFRlbnNvckJ1ZmZlcjxSLCBEPjtcbiAgfVxuXG4gIHByaXZhdGUgY2hlY2tOdW1lcmljYWxQcm9ibGVtcyh2YWx1ZXM6IEJhY2tlbmRWYWx1ZXMpOiB2b2lkIHtcbiAgICBpZiAodmFsdWVzID09IG51bGwpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgZm9yIChsZXQgaSA9IDA7IGkgPCB2YWx1ZXMubGVuZ3RoOyBpKyspIHtcbiAgICAgIGNvbnN0IG51bSA9IHZhbHVlc1tpXSBhcyBudW1iZXI7XG4gICAgICBpZiAoIXdlYmdsX3V0aWwuY2FuQmVSZXByZXNlbnRlZChudW0pKSB7XG4gICAgICAgIGlmIChlbnYoKS5nZXRCb29sKCdXRUJHTF9SRU5ERVJfRkxPQVQzMl9DQVBBQkxFJykpIHtcbiAgICAgICAgICB0aHJvdyBFcnJvcihcbiAgICAgICAgICAgICAgYFRoZSB2YWx1ZSAke251bX0gY2Fubm90IGJlIHJlcHJlc2VudGVkIHdpdGggeW91ciBgICtcbiAgICAgICAgICAgICAgYGN1cnJlbnQgc2V0dGluZ3MuIENvbnNpZGVyIGVuYWJsaW5nIGZsb2F0MzIgcmVuZGVyaW5nOiBgICtcbiAgICAgICAgICAgICAgYCd0Zi5lbnYoKS5zZXQoJ1dFQkdMX1JFTkRFUl9GTE9BVDMyX0VOQUJMRUQnLCB0cnVlKTsnYCk7XG4gICAgICAgIH1cbiAgICAgICAgdGhyb3cgRXJyb3IoYFRoZSB2YWx1ZSAke251bX0gY2Fubm90IGJlIHJlcHJlc2VudGVkIG9uIHRoaXMgZGV2aWNlLmApO1xuICAgICAgfVxuICAgIH1cbiAgfVxuXG4gIHByaXZhdGUgZ2V0VmFsdWVzRnJvbVRleHR1cmUoZGF0YUlkOiBEYXRhSWQpOiBGbG9hdDMyQXJyYXkge1xuICAgIGNvbnN0IHtzaGFwZSwgZHR5cGUsIGlzUGFja2VkfSA9IHRoaXMudGV4RGF0YS5nZXQoZGF0YUlkKTtcbiAgICBjb25zdCBzaXplID0gdXRpbC5zaXplRnJvbVNoYXBlKHNoYXBlKTtcbiAgICBpZiAoZW52KCkuZ2V0Qm9vbCgnV0VCR0xfRE9XTkxPQURfRkxPQVRfRU5BQkxFRCcpKSB7XG4gICAgICBjb25zdCB0bXBUYXJnZXQgPSB0aGlzLmRlY29kZShkYXRhSWQpO1xuICAgICAgY29uc3QgdG1wRGF0YSA9IHRoaXMudGV4RGF0YS5nZXQodG1wVGFyZ2V0LmRhdGFJZCk7XG4gICAgICBjb25zdCB2YWxzID1cbiAgICAgICAgICB0aGlzLmdwZ3B1XG4gICAgICAgICAgICAgIC5kb3dubG9hZE1hdHJpeEZyb21QYWNrZWRUZXh0dXJlKFxuICAgICAgICAgICAgICAgICAgdG1wRGF0YS50ZXh0dXJlLnRleHR1cmUsIC4uLnRleF91dGlsLmdldERlbnNlVGV4U2hhcGUoc2hhcGUpKVxuICAgICAgICAgICAgICAuc3ViYXJyYXkoMCwgc2l6ZSk7XG5cbiAgICAgIHRoaXMuZGlzcG9zZUludGVybWVkaWF0ZVRlbnNvckluZm8odG1wVGFyZ2V0KTtcblxuICAgICAgcmV0dXJuIHZhbHM7XG4gICAgfVxuXG4gICAgY29uc3Qgc2hvdWxkVXNlUGFja2VkUHJvZ3JhbSA9XG4gICAgICAgIGVudigpLmdldEJvb2woJ1dFQkdMX1BBQ0snKSAmJiBpc1BhY2tlZCA9PT0gdHJ1ZTtcbiAgICBjb25zdCBvdXRwdXRTaGFwZSA9XG4gICAgICAgIHNob3VsZFVzZVBhY2tlZFByb2dyYW0gPyB3ZWJnbF91dGlsLmdldFNoYXBlQXMzRChzaGFwZSkgOiBzaGFwZTtcbiAgICBjb25zdCBwcm9ncmFtID0gc2hvdWxkVXNlUGFja2VkUHJvZ3JhbSA/XG4gICAgICAgIG5ldyBFbmNvZGVGbG9hdFBhY2tlZFByb2dyYW0ob3V0cHV0U2hhcGUgYXMgW251bWJlciwgbnVtYmVyLCBudW1iZXJdKSA6XG4gICAgICAgIG5ldyBFbmNvZGVGbG9hdFByb2dyYW0ob3V0cHV0U2hhcGUpO1xuICAgIGNvbnN0IG91dHB1dCA9IHRoaXMucnVuV2ViR0xQcm9ncmFtKFxuICAgICAgICBwcm9ncmFtLCBbe3NoYXBlOiBvdXRwdXRTaGFwZSwgZHR5cGUsIGRhdGFJZH1dLCAnZmxvYXQzMicpO1xuICAgIGNvbnN0IHRtcERhdGEgPSB0aGlzLnRleERhdGEuZ2V0KG91dHB1dC5kYXRhSWQpO1xuICAgIGNvbnN0IHZhbHMgPSB0aGlzLmdwZ3B1XG4gICAgICAgICAgICAgICAgICAgICAuZG93bmxvYWRCeXRlRW5jb2RlZEZsb2F0TWF0cml4RnJvbU91dHB1dFRleHR1cmUoXG4gICAgICAgICAgICAgICAgICAgICAgICAgdG1wRGF0YS50ZXh0dXJlLnRleHR1cmUsIHRtcERhdGEudGV4U2hhcGVbMF0sXG4gICAgICAgICAgICAgICAgICAgICAgICAgdG1wRGF0YS50ZXhTaGFwZVsxXSlcbiAgICAgICAgICAgICAgICAgICAgIC5zdWJhcnJheSgwLCBzaXplKTtcbiAgICB0aGlzLmRpc3Bvc2VJbnRlcm1lZGlhdGVUZW5zb3JJbmZvKG91dHB1dCk7XG5cbiAgICByZXR1cm4gdmFscztcbiAgfVxuXG4gIHRpbWVyQXZhaWxhYmxlKCk6IGJvb2xlYW4ge1xuICAgIHJldHVybiBlbnYoKS5nZXROdW1iZXIoJ1dFQkdMX0RJU0pPSU5UX1FVRVJZX1RJTUVSX0VYVEVOU0lPTl9SRUxJQUJMRScpID4gMDtcbiAgfVxuXG4gIHRpbWUoZjogKCkgPT4gdm9pZCk6IFByb21pc2U8V2ViR0xUaW1pbmdJbmZvPiB7XG4gICAgY29uc3Qgb2xkQWN0aXZlVGltZXJzID0gdGhpcy5hY3RpdmVUaW1lcnM7XG4gICAgY29uc3QgbmV3QWN0aXZlVGltZXJzOiBUaW1lck5vZGVbXSA9IFtdO1xuXG4gICAgbGV0IG91dGVyTW9zdFRpbWUgPSBmYWxzZTtcbiAgICBpZiAodGhpcy5wcm9ncmFtVGltZXJzU3RhY2sgPT0gbnVsbCkge1xuICAgICAgdGhpcy5wcm9ncmFtVGltZXJzU3RhY2sgPSBuZXdBY3RpdmVUaW1lcnM7XG4gICAgICBvdXRlck1vc3RUaW1lID0gdHJ1ZTtcbiAgICB9IGVsc2Uge1xuICAgICAgdGhpcy5hY3RpdmVUaW1lcnMucHVzaChuZXdBY3RpdmVUaW1lcnMpO1xuICAgIH1cbiAgICB0aGlzLmFjdGl2ZVRpbWVycyA9IG5ld0FjdGl2ZVRpbWVycztcblxuICAgIGYoKTtcblxuICAgIC8vIG5lZWRpbmcgdG8gc3BsaXQgdGhlc2UgdXAgYmVjYXVzZSB1dGlsLmZsYXR0ZW4gb25seSBhY2NlcHRzIGNlcnRhaW4gdHlwZXNcbiAgICBjb25zdCBmbGF0dGVuZWRBY3RpdmVUaW1lclF1ZXJpZXMgPVxuICAgICAgICB1dGlsLmZsYXR0ZW4odGhpcy5hY3RpdmVUaW1lcnMubWFwKChkOiBLZXJuZWxJbmZvKSA9PiBkLnF1ZXJ5KSlcbiAgICAgICAgICAgIC5maWx0ZXIoZCA9PiBkICE9IG51bGwpO1xuICAgIGNvbnN0IGZsYXR0ZW5lZEFjdGl2ZVRpbWVyTmFtZXMgPVxuICAgICAgICB1dGlsLmZsYXR0ZW4odGhpcy5hY3RpdmVUaW1lcnMubWFwKChkOiBLZXJuZWxJbmZvKSA9PiBkLm5hbWUpKVxuICAgICAgICAgICAgLmZpbHRlcihkID0+IGQgIT0gbnVsbCk7XG5cbiAgICB0aGlzLmFjdGl2ZVRpbWVycyA9IG9sZEFjdGl2ZVRpbWVycztcblxuICAgIGlmIChvdXRlck1vc3RUaW1lKSB7XG4gICAgICB0aGlzLnByb2dyYW1UaW1lcnNTdGFjayA9IG51bGw7XG4gICAgfVxuXG4gICAgY29uc3QgcmVzOiBXZWJHTFRpbWluZ0luZm8gPSB7XG4gICAgICB1cGxvYWRXYWl0TXM6IHRoaXMudXBsb2FkV2FpdE1zLFxuICAgICAgZG93bmxvYWRXYWl0TXM6IHRoaXMuZG93bmxvYWRXYWl0TXMsXG4gICAgICBrZXJuZWxNczogbnVsbCxcbiAgICAgIHdhbGxNczogbnVsbCAgLy8gd2lsbCBiZSBmaWxsZWQgYnkgdGhlIGVuZ2luZVxuICAgIH07XG5cbiAgICByZXR1cm4gKGFzeW5jICgpID0+IHtcbiAgICAgIGlmIChlbnYoKS5nZXROdW1iZXIoJ1dFQkdMX0RJU0pPSU5UX1FVRVJZX1RJTUVSX0VYVEVOU0lPTl9SRUxJQUJMRScpID5cbiAgICAgICAgICAwKSB7XG4gICAgICAgIGNvbnN0IGtlcm5lbE1zID0gYXdhaXQgUHJvbWlzZS5hbGwoZmxhdHRlbmVkQWN0aXZlVGltZXJRdWVyaWVzKTtcblxuICAgICAgICByZXNbJ2tlcm5lbE1zJ10gPSB1dGlsLnN1bShrZXJuZWxNcyk7XG4gICAgICAgIHJlc1snZ2V0RXh0cmFQcm9maWxlSW5mbyddID0gKCkgPT5cbiAgICAgICAgICAgIGtlcm5lbE1zXG4gICAgICAgICAgICAgICAgLm1hcCgoZCwgaSkgPT4gKHtuYW1lOiBmbGF0dGVuZWRBY3RpdmVUaW1lck5hbWVzW2ldLCBtczogZH0pKVxuICAgICAgICAgICAgICAgIC5tYXAoZCA9PiBgJHtkLm5hbWV9OiAke2QubXN9YClcbiAgICAgICAgICAgICAgICAuam9pbignLCAnKTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHJlc1sna2VybmVsTXMnXSA9IHtcbiAgICAgICAgICBlcnJvcjogJ1dlYkdMIHF1ZXJ5IHRpbWVycyBhcmUgbm90IHN1cHBvcnRlZCBpbiB0aGlzIGVudmlyb25tZW50LidcbiAgICAgICAgfTtcbiAgICAgIH1cblxuICAgICAgdGhpcy51cGxvYWRXYWl0TXMgPSAwO1xuICAgICAgdGhpcy5kb3dubG9hZFdhaXRNcyA9IDA7XG4gICAgICByZXR1cm4gcmVzO1xuICAgIH0pKCk7XG4gIH1cbiAgbWVtb3J5KCk6IFdlYkdMTWVtb3J5SW5mbyB7XG4gICAgcmV0dXJuIHtcbiAgICAgIHVucmVsaWFibGU6IGZhbHNlLFxuICAgICAgbnVtQnl0ZXNJbkdQVTogdGhpcy5udW1CeXRlc0luR1BVLFxuICAgICAgbnVtQnl0ZXNJbkdQVUFsbG9jYXRlZDogdGhpcy50ZXh0dXJlTWFuYWdlci5udW1CeXRlc0FsbG9jYXRlZCxcbiAgICAgIG51bUJ5dGVzSW5HUFVGcmVlOiB0aGlzLnRleHR1cmVNYW5hZ2VyLm51bUJ5dGVzRnJlZVxuICAgIH0gYXMgV2ViR0xNZW1vcnlJbmZvO1xuICB9XG5cbiAgcHJpdmF0ZSBzdGFydFRpbWVyKCk6IFdlYkdMUXVlcnl8Q1BVVGltZXJRdWVyeSB7XG4gICAgaWYgKGVudigpLmdldE51bWJlcignV0VCR0xfRElTSk9JTlRfUVVFUllfVElNRVJfRVhURU5TSU9OX1JFTElBQkxFJykgPiAwKSB7XG4gICAgICByZXR1cm4gdGhpcy5ncGdwdS5iZWdpblF1ZXJ5KCk7XG4gICAgfVxuICAgIHJldHVybiB7c3RhcnRNczogdXRpbC5ub3coKSwgZW5kTXM6IG51bGx9O1xuICB9XG5cbiAgcHJpdmF0ZSBlbmRUaW1lcihxdWVyeTogV2ViR0xRdWVyeXxDUFVUaW1lclF1ZXJ5KTogV2ViR0xRdWVyeXxDUFVUaW1lclF1ZXJ5IHtcbiAgICBpZiAoZW52KCkuZ2V0TnVtYmVyKCdXRUJHTF9ESVNKT0lOVF9RVUVSWV9USU1FUl9FWFRFTlNJT05fUkVMSUFCTEUnKSA+IDApIHtcbiAgICAgIHRoaXMuZ3BncHUuZW5kUXVlcnkoKTtcbiAgICAgIHJldHVybiBxdWVyeTtcbiAgICB9XG4gICAgKHF1ZXJ5IGFzIENQVVRpbWVyUXVlcnkpLmVuZE1zID0gdXRpbC5ub3coKTtcbiAgICByZXR1cm4gcXVlcnk7XG4gIH1cblxuICBwcml2YXRlIGFzeW5jIGdldFF1ZXJ5VGltZShxdWVyeTogV2ViR0xRdWVyeXxDUFVUaW1lclF1ZXJ5KTogUHJvbWlzZTxudW1iZXI+IHtcbiAgICBpZiAoZW52KCkuZ2V0TnVtYmVyKCdXRUJHTF9ESVNKT0lOVF9RVUVSWV9USU1FUl9FWFRFTlNJT05fUkVMSUFCTEUnKSA+IDApIHtcbiAgICAgIHJldHVybiB0aGlzLmdwZ3B1LndhaXRGb3JRdWVyeUFuZEdldFRpbWUocXVlcnkgYXMgV2ViR0xRdWVyeSk7XG4gICAgfVxuICAgIGNvbnN0IHRpbWVyUXVlcnkgPSBxdWVyeSBhcyBDUFVUaW1lclF1ZXJ5O1xuICAgIHJldHVybiB0aW1lclF1ZXJ5LmVuZE1zIC0gdGltZXJRdWVyeS5zdGFydE1zO1xuICB9XG5cbiAgcHJpdmF0ZSBwZW5kaW5nRGVsZXRlcyA9IDA7XG5cbiAgLyoqXG4gICAqIERlY3JlYXNlIHRoZSBSZWZDb3VudCBvbiB0aGUgZGF0YUlkIGFuZCBkaXNwb3NlIHRoZSBtZW1vcnkgaWYgdGhlIGRhdGFJZFxuICAgKiBoYXMgMCByZWZDb3VudC4gSWYgdGhlcmUgYXJlIHBlbmRpbmcgcmVhZCBvbiB0aGUgZGF0YSwgdGhlIGRpc3Bvc2FsIHdvdWxkXG4gICAqIGFkZGVkIHRvIHRoZSBwZW5kaW5nIGRlbGV0ZSBxdWV1ZS4gUmV0dXJuIHRydWUgaWYgdGhlIGRhdGFJZCBpcyByZW1vdmVkXG4gICAqIGZyb20gYmFja2VuZCBvciB0aGUgYmFja2VuZCBkb2VzIG5vdCBjb250YWluIHRoZSBkYXRhSWQsIGZhbHNlIGlmIHRoZVxuICAgKiBkYXRhSWQgaXMgbm90IHJlbW92ZWQuIE1lbW9yeSBtYXkgb3IgbWF5IG5vdCBiZSByZWxlYXNlZCBldmVuIHdoZW4gZGF0YUlkXG4gICAqIGlzIHJlbW92ZWQsIHdoaWNoIGFsc28gZGVwZW5kcyBvbiBkYXRhUmVmQ291bnQsIHNlZSBgcmVsZWFzZUdQVWAuXG4gICAqIEBwYXJhbSBkYXRhSWRcbiAgICogQG9hcmFtIGZvcmNlIE9wdGlvbmFsLCByZW1vdmUgdGhlIGRhdGEgcmVnYXJkbGVzcyBvZiByZWZDb3VudFxuICAgKi9cbiAgZGlzcG9zZURhdGEoZGF0YUlkOiBEYXRhSWQsIGZvcmNlID0gZmFsc2UpOiBib29sZWFuIHtcbiAgICBpZiAodGhpcy5wZW5kaW5nRGlzcG9zYWwuaGFzKGRhdGFJZCkpIHtcbiAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9XG5cbiAgICAvLyBOby1vcCBpZiBhbHJlYWR5IGRpc3Bvc2VkLlxuICAgIGlmICghdGhpcy50ZXhEYXRhLmhhcyhkYXRhSWQpKSB7XG4gICAgICByZXR1cm4gdHJ1ZTtcbiAgICB9XG5cbiAgICAvLyBpZiBmb3JjZSBmbGFnIGlzIHNldCwgY2hhbmdlIHJlZkNvdW50IHRvIDAsIHRoaXMgd291bGQgZW5zdXJlIGRpc3Bvc2FsXG4gICAgLy8gd2hlbiBhZGRlZCB0byB0aGUgcGVuZGluZ0Rpc3Bvc2FsIHF1ZXVlLiBNZW1vcnkgbWF5IG9yIG1heSBub3QgYmVcbiAgICAvLyByZWxlYXNlZCwgd2hpY2ggYWxzbyBkZXBlbmRzIG9uIGRhdGFSZWZDb3VudCwgc2VlIGByZWxlYXNlR1BVYC5cbiAgICBpZiAoZm9yY2UpIHtcbiAgICAgIHRoaXMudGV4RGF0YS5nZXQoZGF0YUlkKS5yZWZDb3VudCA9IDA7XG4gICAgfSBlbHNlIHtcbiAgICAgIHRoaXMudGV4RGF0YS5nZXQoZGF0YUlkKS5yZWZDb3VudC0tO1xuICAgIH1cblxuICAgIGlmICghZm9yY2UgJiYgdGhpcy50ZXhEYXRhLmdldChkYXRhSWQpLnJlZkNvdW50ID4gMCkge1xuICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH1cblxuICAgIGlmICh0aGlzLnBlbmRpbmdSZWFkLmhhcyhkYXRhSWQpKSB7XG4gICAgICB0aGlzLnBlbmRpbmdEaXNwb3NhbC5hZGQoZGF0YUlkKTtcbiAgICAgIHRoaXMucGVuZGluZ0RlbGV0ZXMrKztcbiAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9XG5cbiAgICB0aGlzLnJlbGVhc2VHUFVEYXRhKGRhdGFJZCk7XG4gICAgY29uc3Qge2NvbXBsZXhUZW5zb3JJbmZvc30gPSB0aGlzLnRleERhdGEuZ2V0KGRhdGFJZCk7XG4gICAgaWYgKGNvbXBsZXhUZW5zb3JJbmZvcyAhPSBudWxsKSB7XG4gICAgICB0aGlzLmRpc3Bvc2VEYXRhKGNvbXBsZXhUZW5zb3JJbmZvcy5yZWFsLmRhdGFJZCwgZm9yY2UpO1xuICAgICAgdGhpcy5kaXNwb3NlRGF0YShjb21wbGV4VGVuc29ySW5mb3MuaW1hZy5kYXRhSWQsIGZvcmNlKTtcbiAgICB9XG5cbiAgICB0aGlzLnRleERhdGEuZGVsZXRlKGRhdGFJZCk7XG5cbiAgICByZXR1cm4gdHJ1ZTtcbiAgfVxuXG4gIHByaXZhdGUgcmVsZWFzZUdQVURhdGEoZGF0YUlkOiBEYXRhSWQpOiB2b2lkIHtcbiAgICBjb25zdCB7dGV4dHVyZSwgZHR5cGUsIHRleFNoYXBlLCB1c2FnZSwgaXNQYWNrZWQsIHNsaWNlfSA9XG4gICAgICAgIHRoaXMudGV4RGF0YS5nZXQoZGF0YUlkKTtcbiAgICBjb25zdCBrZXkgPSBzbGljZSAmJiBzbGljZS5vcmlnRGF0YUlkIHx8IGRhdGFJZDtcbiAgICBjb25zdCByZWZDb3VudCA9IHRoaXMuZGF0YVJlZkNvdW50LmdldChrZXkpO1xuXG4gICAgaWYgKHJlZkNvdW50ID4gMSkge1xuICAgICAgdGhpcy5kYXRhUmVmQ291bnQuc2V0KGtleSwgcmVmQ291bnQgLSAxKTtcbiAgICB9IGVsc2Uge1xuICAgICAgdGhpcy5kYXRhUmVmQ291bnQuZGVsZXRlKGtleSk7XG4gICAgICBpZiAodGV4dHVyZSAhPSBudWxsKSB7XG4gICAgICAgIHRoaXMubnVtQnl0ZXNJbkdQVSAtPSB0aGlzLmNvbXB1dGVCeXRlcyh0ZXhTaGFwZSwgZHR5cGUpO1xuICAgICAgICB0aGlzLnRleHR1cmVNYW5hZ2VyLnJlbGVhc2VUZXh0dXJlKHRleHR1cmUsIHRleFNoYXBlLCB1c2FnZSwgaXNQYWNrZWQpO1xuICAgICAgfVxuICAgIH1cblxuICAgIGNvbnN0IHRleERhdGEgPSB0aGlzLnRleERhdGEuZ2V0KGRhdGFJZCk7XG4gICAgdGV4RGF0YS50ZXh0dXJlID0gbnVsbDtcbiAgICB0ZXhEYXRhLnRleFNoYXBlID0gbnVsbDtcbiAgICB0ZXhEYXRhLmlzUGFja2VkID0gZmFsc2U7XG4gICAgdGV4RGF0YS5zbGljZSA9IG51bGw7XG4gIH1cblxuICBnZXRUZXh0dXJlKGRhdGFJZDogRGF0YUlkKTogV2ViR0xUZXh0dXJlIHtcbiAgICB0aGlzLnVwbG9hZFRvR1BVKGRhdGFJZCk7XG4gICAgcmV0dXJuIHRoaXMudGV4RGF0YS5nZXQoZGF0YUlkKS50ZXh0dXJlLnRleHR1cmU7XG4gIH1cblxuICAvKipcbiAgICogUmV0dXJucyBpbnRlcm5hbCBpbmZvcm1hdGlvbiBmb3IgdGhlIHNwZWNpZmljIGRhdGEgYnVja2V0LiBVc2VkIGluIHVuaXRcbiAgICogdGVzdHMuXG4gICAqL1xuICBnZXREYXRhSW5mbyhkYXRhSWQ6IERhdGFJZCk6IFRleHR1cmVEYXRhIHtcbiAgICByZXR1cm4gdGhpcy50ZXhEYXRhLmdldChkYXRhSWQpO1xuICB9XG5cbiAgLypcbiAgVGVzdHMgd2hldGhlciBhbGwgdGhlIGlucHV0cyB0byBhbiBvcCBhcmUgc21hbGwgYW5kIG9uIHRoZSBDUFUuIFRoaXMgaGV1cmlzdGljXG4gIGRldGVybWluZXMgd2hlbiBpdCB3b3VsZCBiZSBmYXN0ZXIgdG8gZXhlY3V0ZSBhIGtlcm5lbCBvbiB0aGUgQ1BVLiBXZWJHTFxuICBrZXJuZWxzIG9wdCBpbnRvIHJ1bm5pbmcgdGhpcyBjaGVjayBhbmQgZm9yd2FyZGluZyB3aGVuIGFwcHJvcHJpYXRlLlxuICBUT0RPKGh0dHBzOi8vZ2l0aHViLmNvbS90ZW5zb3JmbG93L3RmanMvaXNzdWVzLzg3Mik6IERldmVsb3AgYSBtb3JlXG4gIHN1c3RhaW5hYmxlIHN0cmF0ZWd5IGZvciBvcHRpbWl6aW5nIGJhY2tlbmQgZXhlY3V0aW9uIG9mIG9wcy5cbiAgICovXG4gIHNob3VsZEV4ZWN1dGVPbkNQVShcbiAgICAgIGlucHV0czogVGVuc29ySW5mb1tdLFxuICAgICAgc2l6ZVRocmVzaG9sZCA9IENQVV9IQU5ET0ZGX1NJWkVfVEhSRVNIT0xEKTogYm9vbGVhbiB7XG4gICAgcmV0dXJuIGVudigpLmdldEJvb2woJ1dFQkdMX0NQVV9GT1JXQVJEJykgJiZcbiAgICAgICAgaW5wdXRzLmV2ZXJ5KFxuICAgICAgICAgICAgaW5wdXQgPT4gdGhpcy50ZXhEYXRhLmdldChpbnB1dC5kYXRhSWQpLnRleHR1cmUgPT0gbnVsbCAmJlxuICAgICAgICAgICAgICAgIHV0aWwuc2l6ZUZyb21TaGFwZShpbnB1dC5zaGFwZSkgPCBzaXplVGhyZXNob2xkKTtcbiAgfVxuXG4gIGdldEdQR1BVQ29udGV4dCgpOiBHUEdQVUNvbnRleHQge1xuICAgIHJldHVybiB0aGlzLmdwZ3B1O1xuICB9XG5cbiAgd2hlcmUoY29uZGl0aW9uOiBUZW5zb3IpOiBUZW5zb3IyRCB7XG4gICAgYmFja2VuZF91dGlsLndhcm4oXG4gICAgICAgICd0Zi53aGVyZSgpIGluIHdlYmdsIGxvY2tzIHRoZSBVSSB0aHJlYWQuICcgK1xuICAgICAgICAnQ2FsbCB0Zi53aGVyZUFzeW5jKCkgaW5zdGVhZCcpO1xuICAgIGNvbnN0IGNvbmRWYWxzID0gY29uZGl0aW9uLmRhdGFTeW5jKCk7XG4gICAgcmV0dXJuIHdoZXJlSW1wbChjb25kaXRpb24uc2hhcGUsIGNvbmRWYWxzKTtcbiAgfVxuXG4gIHByaXZhdGUgcGFja2VkVW5hcnlPcCh4OiBUZW5zb3JJbmZvLCBvcDogc3RyaW5nLCBkdHlwZTogRGF0YVR5cGUpIHtcbiAgICBjb25zdCBwcm9ncmFtID0gbmV3IFVuYXJ5T3BQYWNrZWRQcm9ncmFtKHguc2hhcGUsIG9wKTtcbiAgICBjb25zdCBvdXRJbmZvID0gdGhpcy5jb21waWxlQW5kUnVuKHByb2dyYW0sIFt4XSwgZHR5cGUpO1xuICAgIHJldHVybiBlbmdpbmUoKS5tYWtlVGVuc29yRnJvbVRlbnNvckluZm8ob3V0SW5mbyk7XG4gIH1cblxuICAvLyBUT0RPKG1zb3VsYW5pbGxlKSByZW1vdmUgdGhpcyBvbmNlIHRoZSBiYWNrZW5kIGhhcyBiZWVuIG1vZHVsYXJpemVkXG4gIC8vIGEgY29weSBpcyBuZWVkZWQgaGVyZSB0byBicmVhayBhIGNpcmN1bGFyIGRlcGVuZGVuY3kuXG4gIC8vIEFsc28gcmVtb3ZlIHRoZSBvcCBmcm9tIHVuYXJ5X29wLlxuICBhYnM8VCBleHRlbmRzIFRlbnNvcj4oeDogVCk6IFQge1xuICAgIC8vIFRPRE86IGhhbmRsZSBjYXNlcyB3aGVuIHggaXMgY29tcGxleC5cbiAgICBpZiAodGhpcy5zaG91bGRFeGVjdXRlT25DUFUoW3hdKSAmJiB4LmR0eXBlICE9PSAnY29tcGxleDY0Jykge1xuICAgICAgY29uc3Qgb3V0VmFsdWVzID1cbiAgICAgICAgICBzaW1wbGVBYnNJbXBsQ1BVKHRoaXMudGV4RGF0YS5nZXQoeC5kYXRhSWQpLnZhbHVlcyBhcyBUeXBlZEFycmF5KTtcbiAgICAgIHJldHVybiB0aGlzLm1ha2VPdXRwdXQoeC5zaGFwZSwgeC5kdHlwZSwgb3V0VmFsdWVzKTtcbiAgICB9XG5cbiAgICBpZiAoZW52KCkuZ2V0Qm9vbCgnV0VCR0xfUEFDS19VTkFSWV9PUEVSQVRJT05TJykpIHtcbiAgICAgIHJldHVybiB0aGlzLnBhY2tlZFVuYXJ5T3AoeCwgdW5hcnlfb3AuQUJTLCB4LmR0eXBlKSBhcyBUO1xuICAgIH1cblxuICAgIGNvbnN0IHByb2dyYW0gPSBuZXcgVW5hcnlPcFByb2dyYW0oeC5zaGFwZSwgdW5hcnlfb3AuQUJTKTtcbiAgICBjb25zdCBvdXRJbmZvID0gdGhpcy5jb21waWxlQW5kUnVuKHByb2dyYW0sIFt4XSk7XG4gICAgcmV0dXJuIGVuZ2luZSgpLm1ha2VUZW5zb3JGcm9tVGVuc29ySW5mbyhvdXRJbmZvKSBhcyBUO1xuICB9XG5cbiAgbWFrZVRlbnNvckluZm8oXG4gICAgICBzaGFwZTogbnVtYmVyW10sIGR0eXBlOiBEYXRhVHlwZSxcbiAgICAgIHZhbHVlcz86IEJhY2tlbmRWYWx1ZXN8c3RyaW5nW10pOiBUZW5zb3JJbmZvIHtcbiAgICBsZXQgZGF0YUlkO1xuICAgIGlmIChkdHlwZSA9PT0gJ3N0cmluZycgJiYgdmFsdWVzICE9IG51bGwgJiYgdmFsdWVzLmxlbmd0aCA+IDAgJiZcbiAgICAgICAgdXRpbC5pc1N0cmluZyh2YWx1ZXNbMF0pKSB7XG4gICAgICBjb25zdCBlbmNvZGVkVmFsdWVzID1cbiAgICAgICAgICAodmFsdWVzIGFzIHt9IGFzIHN0cmluZ1tdKS5tYXAoZCA9PiB1dGlsLmVuY29kZVN0cmluZyhkKSk7XG5cbiAgICAgIGRhdGFJZCA9IHRoaXMud3JpdGUoZW5jb2RlZFZhbHVlcywgc2hhcGUsIGR0eXBlKTtcbiAgICB9IGVsc2Uge1xuICAgICAgZGF0YUlkID0gdGhpcy53cml0ZSh2YWx1ZXMgYXMgVHlwZWRBcnJheSwgc2hhcGUsIGR0eXBlKTtcbiAgICB9XG5cbiAgICB0aGlzLnRleERhdGEuZ2V0KGRhdGFJZCkudXNhZ2UgPSBudWxsO1xuICAgIHJldHVybiB7ZGF0YUlkLCBzaGFwZSwgZHR5cGV9O1xuICB9XG5cbiAgcHJpdmF0ZSBtYWtlT3V0cHV0PFQgZXh0ZW5kcyBUZW5zb3I+KFxuICAgICAgc2hhcGU6IG51bWJlcltdLCBkdHlwZTogRGF0YVR5cGUsIHZhbHVlcz86IEJhY2tlbmRWYWx1ZXMpOiBUIHtcbiAgICByZXR1cm4gZW5naW5lKCkubWFrZVRlbnNvckZyb21UZW5zb3JJbmZvKFxuICAgICAgICAgICAgICAgdGhpcy5tYWtlVGVuc29ySW5mbyhzaGFwZSwgZHR5cGUsIHZhbHVlcyksIHRoaXMpIGFzIFQ7XG4gIH1cblxuICB1bnBhY2tUZW5zb3IoaW5wdXQ6IFRlbnNvckluZm8pOiBUZW5zb3JJbmZvIHtcbiAgICBjb25zdCBwcm9ncmFtID0gbmV3IFVucGFja1Byb2dyYW0oaW5wdXQuc2hhcGUpO1xuICAgIHJldHVybiB0aGlzLnJ1bldlYkdMUHJvZ3JhbShwcm9ncmFtLCBbaW5wdXRdLCBpbnB1dC5kdHlwZSk7XG4gIH1cblxuICBwYWNrVGVuc29yKGlucHV0OiBUZW5zb3JJbmZvKTogVGVuc29ySW5mbyB7XG4gICAgY29uc3QgcHJvZ3JhbSA9IG5ldyBQYWNrUHJvZ3JhbShpbnB1dC5zaGFwZSk7XG4gICAgY29uc3QgcHJldmVudEVhZ2VyVW5wYWNraW5nT3V0cHV0ID0gdHJ1ZTtcbiAgICByZXR1cm4gdGhpcy5ydW5XZWJHTFByb2dyYW0oXG4gICAgICAgIHByb2dyYW0sIFtpbnB1dF0sIGlucHV0LmR0eXBlLCBudWxsIC8qIGN1c3RvbVVuaWZvcm1WYWx1ZXMgKi8sXG4gICAgICAgIHByZXZlbnRFYWdlclVucGFja2luZ091dHB1dCk7XG4gIH1cblxuICBwcml2YXRlIHBhY2tlZFJlc2hhcGUoaW5wdXQ6IFRlbnNvckluZm8sIGFmdGVyU2hhcGU6IG51bWJlcltdKTogVGVuc29ySW5mbyB7XG4gICAgY29uc3QgaW5wdXQzRFNoYXBlID0gW1xuICAgICAgd2ViZ2xfdXRpbC5nZXRCYXRjaERpbShpbnB1dC5zaGFwZSksXG4gICAgICAuLi53ZWJnbF91dGlsLmdldFJvd3NDb2xzKGlucHV0LnNoYXBlKVxuICAgIF0gYXMgW251bWJlciwgbnVtYmVyLCBudW1iZXJdO1xuICAgIGNvbnN0IGlucHV0M0Q6IFRlbnNvckluZm8gPSB7XG4gICAgICBkdHlwZTogaW5wdXQuZHR5cGUsXG4gICAgICBzaGFwZTogaW5wdXQzRFNoYXBlLFxuICAgICAgZGF0YUlkOiBpbnB1dC5kYXRhSWRcbiAgICB9O1xuICAgIGNvbnN0IGFmdGVyU2hhcGVBczNEID0gW1xuICAgICAgd2ViZ2xfdXRpbC5nZXRCYXRjaERpbShhZnRlclNoYXBlKSwgLi4ud2ViZ2xfdXRpbC5nZXRSb3dzQ29scyhhZnRlclNoYXBlKVxuICAgIF0gYXMgW251bWJlciwgbnVtYmVyLCBudW1iZXJdO1xuXG4gICAgY29uc3QgcHJvZ3JhbSA9IG5ldyBSZXNoYXBlUGFja2VkUHJvZ3JhbShhZnRlclNoYXBlQXMzRCwgaW5wdXQzRFNoYXBlKTtcbiAgICBjb25zdCBwcmV2ZW50RWFnZXJVbnBhY2tpbmdPZk91dHB1dCA9IHRydWU7XG4gICAgY29uc3QgY3VzdG9tVmFsdWVzID0gW2lucHV0M0RTaGFwZV07XG4gICAgY29uc3Qgb3V0cHV0ID0gdGhpcy5ydW5XZWJHTFByb2dyYW0oXG4gICAgICAgIHByb2dyYW0sIFtpbnB1dDNEXSwgaW5wdXQuZHR5cGUsIGN1c3RvbVZhbHVlcyxcbiAgICAgICAgcHJldmVudEVhZ2VyVW5wYWNraW5nT2ZPdXRwdXQpO1xuICAgIHJldHVybiB7ZGF0YUlkOiBvdXRwdXQuZGF0YUlkLCBzaGFwZTogYWZ0ZXJTaGFwZSwgZHR5cGU6IG91dHB1dC5kdHlwZX07XG4gIH1cblxuICBwcml2YXRlIGRlY29kZShkYXRhSWQ6IERhdGFJZCwgY3VzdG9tVGV4U2hhcGU/OiBbbnVtYmVyLCBudW1iZXJdKTpcbiAgICAgIFRlbnNvckluZm8ge1xuICAgIGNvbnN0IHRleERhdGEgPSB0aGlzLnRleERhdGEuZ2V0KGRhdGFJZCk7XG4gICAgY29uc3Qge2lzUGFja2VkLCBzaGFwZSwgZHR5cGV9ID0gdGV4RGF0YTtcbiAgICBpZiAoY3VzdG9tVGV4U2hhcGUgIT0gbnVsbCkge1xuICAgICAgY29uc3Qgc2l6ZSA9IHV0aWwuc2l6ZUZyb21TaGFwZShzaGFwZSk7XG4gICAgICBjb25zdCB0ZXhTaXplID0gY3VzdG9tVGV4U2hhcGVbMF0gKiBjdXN0b21UZXhTaGFwZVsxXSAqIDQ7XG4gICAgICB1dGlsLmFzc2VydChcbiAgICAgICAgICBzaXplIDw9IHRleFNpemUsXG4gICAgICAgICAgKCkgPT4gJ2N1c3RvbVRleFNoYXBlIGlzIHRvbyBzbWFsbC4gJyArXG4gICAgICAgICAgICAgICdSb3cgKiBDb2x1bW4gKiA0IHNob3VsZCBiZSBlcXVhbCBvciBsYXJnZXIgdGhhbiB0aGUgJyArXG4gICAgICAgICAgICAgICdzaXplIG9mIHRoZSB0ZW5zb3IgZGF0YS4nKTtcbiAgICB9XG4gICAgY29uc3Qgc2hhcGVBczNEID1cbiAgICAgICAgd2ViZ2xfdXRpbC5nZXRTaGFwZUFzM0Qoc2hhcGUpIGFzIFtudW1iZXIsIG51bWJlciwgbnVtYmVyXTtcbiAgICBsZXQgcHJvZ3JhbTtcbiAgICBpZiAoaXNQYWNrZWQpIHtcbiAgICAgIHByb2dyYW0gPSBuZXcgRGVjb2RlTWF0cml4UGFja2VkUHJvZ3JhbShzaGFwZUFzM0QpO1xuICAgIH0gZWxzZSB7XG4gICAgICBwcm9ncmFtID0gbmV3IERlY29kZU1hdHJpeFByb2dyYW0oc2hhcGVBczNEKTtcbiAgICB9XG4gICAgY29uc3QgcHJldmVudEVhZ2VyVW5wYWNraW5nT2ZPdXRwdXQgPSB0cnVlO1xuICAgIGNvbnN0IGN1c3RvbVZhbHVlcyA9XG4gICAgICAgIFtjdXN0b21UZXhTaGFwZSAhPSBudWxsID8gY3VzdG9tVGV4U2hhcGUgOlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRleF91dGlsLmdldERlbnNlVGV4U2hhcGUoc2hhcGVBczNEKV07XG4gICAgY29uc3Qgb3V0ID0gdGhpcy5ydW5XZWJHTFByb2dyYW0oXG4gICAgICAgIHByb2dyYW0sIFt7c2hhcGU6IHNoYXBlQXMzRCwgZHR5cGUsIGRhdGFJZH1dLCBkdHlwZSwgY3VzdG9tVmFsdWVzLFxuICAgICAgICBwcmV2ZW50RWFnZXJVbnBhY2tpbmdPZk91dHB1dCwgY3VzdG9tVGV4U2hhcGUpO1xuICAgIHJldHVybiB7ZHR5cGUsIHNoYXBlLCBkYXRhSWQ6IG91dC5kYXRhSWR9O1xuICB9XG5cbiAgcnVuV2ViR0xQcm9ncmFtKFxuICAgICAgcHJvZ3JhbTogR1BHUFVQcm9ncmFtLCBpbnB1dHM6IFRlbnNvckluZm9bXSwgb3V0cHV0RHR5cGU6IERhdGFUeXBlLFxuICAgICAgY3VzdG9tVW5pZm9ybVZhbHVlcz86IG51bWJlcltdW10sIHByZXZlbnRFYWdlclVucGFja2luZ09mT3V0cHV0ID0gZmFsc2UsXG4gICAgICBjdXN0b21UZXhTaGFwZT86IFtudW1iZXIsIG51bWJlcl0pOiBUZW5zb3JJbmZvIHtcbiAgICBjb25zdCBvdXRwdXQgPSB0aGlzLm1ha2VUZW5zb3JJbmZvKHByb2dyYW0ub3V0cHV0U2hhcGUsIG91dHB1dER0eXBlKTtcbiAgICBjb25zdCBvdXREYXRhID0gdGhpcy50ZXhEYXRhLmdldChvdXRwdXQuZGF0YUlkKTtcbiAgICBpZiAocHJvZ3JhbS5wYWNrZWRPdXRwdXQpIHtcbiAgICAgIG91dERhdGEuaXNQYWNrZWQgPSB0cnVlO1xuICAgIH1cbiAgICBpZiAocHJvZ3JhbS5vdXRQYWNraW5nU2NoZW1lID09PSB0ZXhfdXRpbC5QYWNraW5nU2NoZW1lLkRFTlNFKSB7XG4gICAgICBjb25zdCB0ZXhlbFNoYXBlID0gY3VzdG9tVGV4U2hhcGUgIT0gbnVsbCA/XG4gICAgICAgICAgY3VzdG9tVGV4U2hhcGUgOlxuICAgICAgICAgIHRleF91dGlsLmdldERlbnNlVGV4U2hhcGUocHJvZ3JhbS5vdXRwdXRTaGFwZSk7XG4gICAgICAvLyBGb3IgYSBkZW5zZWx5IHBhY2tlZCBvdXRwdXQsIHdlIGV4cGxpY2l0bHkgc2V0IHRleFNoYXBlXG4gICAgICAvLyBzbyBpdCBkb2Vzbid0IGdldCBhc3NpZ25lZCBsYXRlciBhY2NvcmRpbmcgdG8gb3VyIHR5cGljYWwgcGFja2luZ1xuICAgICAgLy8gc2NoZW1lIHdoZXJlaW4gYSBzaW5nbGUgdGV4ZWwgY2FuIG9ubHkgY29udGFpbiB2YWx1ZXMgZnJvbSBhZGphY2VudFxuICAgICAgLy8gcm93cy9jb2xzLlxuICAgICAgb3V0RGF0YS50ZXhTaGFwZSA9IHRleGVsU2hhcGUubWFwKGQgPT4gZCAqIDIpIGFzIFtudW1iZXIsIG51bWJlcl07XG4gICAgfVxuICAgIGlmIChwcm9ncmFtLm91dFRleFVzYWdlICE9IG51bGwpIHtcbiAgICAgIG91dERhdGEudXNhZ2UgPSBwcm9ncmFtLm91dFRleFVzYWdlO1xuICAgIH1cblxuICAgIGlmICh1dGlsLnNpemVGcm9tU2hhcGUob3V0cHV0LnNoYXBlKSA9PT0gMCkge1xuICAgICAgLy8gU2hvcnQtY2lyY3VpdCB0aGUgY29tcHV0YXRpb24gc2luY2UgdGhlIHJlc3VsdCBpcyBlbXB0eSAoaGFzIDAgaW4gaXRzXG4gICAgICAvLyBzaGFwZSkuXG4gICAgICBvdXREYXRhLnZhbHVlcyA9XG4gICAgICAgICAgdXRpbC5nZXRUeXBlZEFycmF5RnJvbURUeXBlKG91dHB1dC5kdHlwZSBhcyAnZmxvYXQzMicsIDApO1xuICAgICAgcmV0dXJuIG91dHB1dDtcbiAgICB9XG5cbiAgICBjb25zdCBkYXRhVG9EaXNwb3NlOiBUZW5zb3JJbmZvW10gPSBbXTtcbiAgICBjb25zdCBpbnB1dHNEYXRhOiBUZW5zb3JEYXRhW10gPSBpbnB1dHMubWFwKGlucHV0ID0+IHtcbiAgICAgIGlmIChpbnB1dC5kdHlwZSA9PT0gJ2NvbXBsZXg2NCcpIHtcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKFxuICAgICAgICAgICAgYEdQR1BVUHJvZ3JhbSBkb2VzIG5vdCBzdXBwb3J0IGNvbXBsZXg2NCBpbnB1dC4gRm9yIGNvbXBsZXg2NCBgICtcbiAgICAgICAgICAgIGBkdHlwZXMsIHBsZWFzZSBzZXBhcmF0ZSB0aGUgcHJvZ3JhbSBpbnRvIHJlYWwgYW5kIGltYWdpbmFyeSBgICtcbiAgICAgICAgICAgIGBwYXJ0cy5gKTtcbiAgICAgIH1cblxuICAgICAgbGV0IHRleERhdGEgPSB0aGlzLnRleERhdGEuZ2V0KGlucHV0LmRhdGFJZCk7XG5cbiAgICAgIGlmICh0ZXhEYXRhLnRleHR1cmUgPT0gbnVsbCkge1xuICAgICAgICBpZiAoIXByb2dyYW0ucGFja2VkSW5wdXRzICYmXG4gICAgICAgICAgICB1dGlsLnNpemVGcm9tU2hhcGUoaW5wdXQuc2hhcGUpIDw9XG4gICAgICAgICAgICAgICAgZW52KCkuZ2V0TnVtYmVyKCdXRUJHTF9TSVpFX1VQTE9BRF9VTklGT1JNJykpIHtcbiAgICAgICAgICAvLyBVcGxvYWQgc21hbGwgdGVuc29ycyB0aGF0IGxpdmUgb24gdGhlIENQVSBhcyB1bmlmb3Jtcywgbm90IGFzXG4gICAgICAgICAgLy8gdGV4dHVyZXMuIERvIHRoaXMgb25seSB3aGVuIHRoZSBlbnZpcm9ubWVudCBzdXBwb3J0cyAzMmJpdCBmbG9hdHNcbiAgICAgICAgICAvLyBkdWUgdG8gcHJvYmxlbXMgd2hlbiBjb21wYXJpbmcgMTZiaXQgZmxvYXRzIHdpdGggMzJiaXQgZmxvYXRzLlxuICAgICAgICAgIC8vIFRPRE8oaHR0cHM6Ly9naXRodWIuY29tL3RlbnNvcmZsb3cvdGZqcy9pc3N1ZXMvODIxKTogTWFrZSBpdFxuICAgICAgICAgIC8vIHBvc3NpYmxlIGZvciBwYWNrZWQgc2hhZGVycyB0byBzYW1wbGUgZnJvbSB1bmlmb3Jtcy5cbiAgICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgc2hhcGU6IGlucHV0LnNoYXBlLFxuICAgICAgICAgICAgdGV4RGF0YTogbnVsbCxcbiAgICAgICAgICAgIGlzVW5pZm9ybTogdHJ1ZSxcbiAgICAgICAgICAgIHVuaWZvcm1WYWx1ZXM6IHRleERhdGEudmFsdWVzIGFzIFR5cGVkQXJyYXlcbiAgICAgICAgICB9O1xuICAgICAgICB9XG5cbiAgICAgICAgLy8gVGhpcyBlbnN1cmVzIHRoYXQgaWYgYSBwYWNrZWQgcHJvZ3JhbSdzIGlucHV0cyBoYXZlIG5vdCB5ZXQgYmVlblxuICAgICAgICAvLyB1cGxvYWRlZCB0byB0aGUgR1BVLCB0aGV5IGdldCB1cGxvYWRlZCBhcyBwYWNrZWQgcmlnaHQgb2ZmIHRoZSBiYXQuXG4gICAgICAgIGlmIChwcm9ncmFtLnBhY2tlZElucHV0cykge1xuICAgICAgICAgIHRleERhdGEuaXNQYWNrZWQgPSB0cnVlO1xuICAgICAgICAgIHRleERhdGEuc2hhcGUgPSBpbnB1dC5zaGFwZTtcbiAgICAgICAgfVxuICAgICAgfVxuXG4gICAgICB0aGlzLnVwbG9hZFRvR1BVKGlucHV0LmRhdGFJZCk7XG4gICAgICBpZiAoISF0ZXhEYXRhLmlzUGFja2VkICE9PSAhIXByb2dyYW0ucGFja2VkSW5wdXRzKSB7XG4gICAgICAgIGlucHV0ID0gdGV4RGF0YS5pc1BhY2tlZCA/IHRoaXMudW5wYWNrVGVuc29yKGlucHV0KSA6XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMucGFja1RlbnNvcihpbnB1dCk7XG4gICAgICAgIGRhdGFUb0Rpc3Bvc2UucHVzaChpbnB1dCk7XG4gICAgICAgIHRleERhdGEgPSB0aGlzLnRleERhdGEuZ2V0KGlucHV0LmRhdGFJZCk7XG4gICAgICB9IGVsc2UgaWYgKFxuICAgICAgICAgIHRleERhdGEuaXNQYWNrZWQgJiZcbiAgICAgICAgICAhd2ViZ2xfdXRpbC5pc1Jlc2hhcGVGcmVlKHRleERhdGEuc2hhcGUsIGlucHV0LnNoYXBlKSkge1xuICAgICAgICAvLyBUaGlzIGlzIGEgc3BlY2lhbCBjYXNlIHdoZXJlIGEgdGV4dHVyZSBleGlzdHMgZm9yIGEgdGVuc29yXG4gICAgICAgIC8vIGJ1dCB0aGUgc2hhcGVzIGFyZSBpbmNvbXBhdGlibGUgKGR1ZSB0byBwYWNraW5nIGNvbnN0cmFpbnRzKSBiZWNhdXNlXG4gICAgICAgIC8vIHRoZSB0ZW5zb3IgZGlkIG5vdCBoYXZlIGEgY2hhbmNlIHRvIGdvIHRocm91Z2ggdGhlIHBhY2tlZCByZXNoYXBlXG4gICAgICAgIC8vIHNoYWRlci4gVGhpcyBvbmx5IGhhcHBlbnMgd2hlbiB3ZSByZXNoYXBlIHRoZSAqc2FtZSogdGVuc29yIHRvIGZvcm1cbiAgICAgICAgLy8gKmRpc3RpbmN0KiBpbnB1dHMgdG8gYW4gb3AsIGUuZy4gZG90dGluZyBhIHZlY3RvciB3aXRoIGl0c2VsZi4gVGhpc1xuICAgICAgICAvLyBjYXNlIHdpbGwgZGlzYXBwZWFyIG9uY2UgcGFja2VkIHVwbG9hZGluZyBpcyB0aGUgZGVmYXVsdC5cblxuICAgICAgICBjb25zdCBzYXZlZElucHV0ID0gaW5wdXQ7XG4gICAgICAgIGNvbnN0IHRhcmdldFNoYXBlID0gaW5wdXQuc2hhcGU7XG5cbiAgICAgICAgaW5wdXQuc2hhcGUgPSB0ZXhEYXRhLnNoYXBlO1xuICAgICAgICBpbnB1dCA9IHRoaXMucGFja2VkUmVzaGFwZShpbnB1dCBhcyBUZW5zb3IsIHRhcmdldFNoYXBlKTtcbiAgICAgICAgZGF0YVRvRGlzcG9zZS5wdXNoKGlucHV0KTtcbiAgICAgICAgdGV4RGF0YSA9IHRoaXMudGV4RGF0YS5nZXQoaW5wdXQuZGF0YUlkKTtcblxuICAgICAgICBzYXZlZElucHV0LnNoYXBlID0gdGFyZ2V0U2hhcGU7XG4gICAgICB9XG5cbiAgICAgIHJldHVybiB7c2hhcGU6IGlucHV0LnNoYXBlLCB0ZXhEYXRhLCBpc1VuaWZvcm06IGZhbHNlfTtcbiAgICB9KTtcblxuICAgIHRoaXMudXBsb2FkVG9HUFUob3V0cHV0LmRhdGFJZCk7XG4gICAgY29uc3Qgb3V0cHV0RGF0YTpcbiAgICAgICAgVGVuc29yRGF0YSA9IHtzaGFwZTogb3V0cHV0LnNoYXBlLCB0ZXhEYXRhOiBvdXREYXRhLCBpc1VuaWZvcm06IGZhbHNlfTtcbiAgICBjb25zdCBrZXkgPSBncGdwdV9tYXRoLm1ha2VTaGFkZXJLZXkocHJvZ3JhbSwgaW5wdXRzRGF0YSwgb3V0cHV0RGF0YSk7XG4gICAgY29uc3QgYmluYXJ5ID0gdGhpcy5nZXRBbmRTYXZlQmluYXJ5KGtleSwgKCkgPT4ge1xuICAgICAgcmV0dXJuIGdwZ3B1X21hdGguY29tcGlsZVByb2dyYW0oXG4gICAgICAgICAgdGhpcy5ncGdwdSwgcHJvZ3JhbSwgaW5wdXRzRGF0YSwgb3V0cHV0RGF0YSk7XG4gICAgfSk7XG4gICAgY29uc3Qgc2hvdWxkVGltZVByb2dyYW0gPSB0aGlzLmFjdGl2ZVRpbWVycyAhPSBudWxsO1xuICAgIGxldCBxdWVyeTogV2ViR0xRdWVyeXxDUFVUaW1lclF1ZXJ5O1xuICAgIGlmIChzaG91bGRUaW1lUHJvZ3JhbSkge1xuICAgICAgcXVlcnkgPSB0aGlzLnN0YXJ0VGltZXIoKTtcbiAgICB9XG5cbiAgICBpZiAoIWVudigpLmdldCgnRU5HSU5FX0NPTVBJTEVfT05MWScpKSB7XG4gICAgICBncGdwdV9tYXRoLnJ1blByb2dyYW0oXG4gICAgICAgICAgdGhpcy5ncGdwdSwgYmluYXJ5LCBpbnB1dHNEYXRhLCBvdXRwdXREYXRhLCBjdXN0b21Vbmlmb3JtVmFsdWVzKTtcbiAgICB9XG5cbiAgICBkYXRhVG9EaXNwb3NlLmZvckVhY2goaW5mbyA9PiB0aGlzLmRpc3Bvc2VJbnRlcm1lZGlhdGVUZW5zb3JJbmZvKGluZm8pKTtcblxuICAgIGlmIChzaG91bGRUaW1lUHJvZ3JhbSkge1xuICAgICAgcXVlcnkgPSB0aGlzLmVuZFRpbWVyKHF1ZXJ5KTtcbiAgICAgIHRoaXMuYWN0aXZlVGltZXJzLnB1c2goXG4gICAgICAgICAge25hbWU6IHByb2dyYW0uY29uc3RydWN0b3IubmFtZSwgcXVlcnk6IHRoaXMuZ2V0UXVlcnlUaW1lKHF1ZXJ5KX0pO1xuICAgIH1cblxuICAgIGNvbnN0IGdsRmx1c2hUaHJlc2hvbGQgPSBlbnYoKS5nZXQoJ1dFQkdMX0ZMVVNIX1RIUkVTSE9MRCcpO1xuICAgIC8vIE1hbnVhbGx5IEdMIGZsdXNoIHJlcXVlc3RlZFxuICAgIGlmIChnbEZsdXNoVGhyZXNob2xkID4gMCkge1xuICAgICAgY29uc3QgdGltZSA9IHV0aWwubm93KCk7XG4gICAgICBpZiAoKHRpbWUgLSB0aGlzLmxhc3RHbEZsdXNoVGltZSkgPiBnbEZsdXNoVGhyZXNob2xkKSB7XG4gICAgICAgIHRoaXMuZ3BncHUuZ2wuZmx1c2goKTtcbiAgICAgICAgdGhpcy5sYXN0R2xGbHVzaFRpbWUgPSB0aW1lO1xuICAgICAgfVxuICAgIH1cblxuICAgIGlmICghZW52KCkuZ2V0Qm9vbCgnV0VCR0xfTEFaSUxZX1VOUEFDSycpICYmIG91dERhdGEuaXNQYWNrZWQgJiZcbiAgICAgICAgcHJldmVudEVhZ2VyVW5wYWNraW5nT2ZPdXRwdXQgPT09IGZhbHNlKSB7XG4gICAgICBjb25zdCB1bnBhY2tlZCA9IHRoaXMudW5wYWNrVGVuc29yKG91dHB1dCk7XG4gICAgICB0aGlzLmRpc3Bvc2VJbnRlcm1lZGlhdGVUZW5zb3JJbmZvKG91dHB1dCk7XG4gICAgICByZXR1cm4gdW5wYWNrZWQ7XG4gICAgfVxuICAgIHJldHVybiBvdXRwdXQ7XG4gIH1cblxuICBjb21waWxlQW5kUnVuKFxuICAgICAgcHJvZ3JhbTogR1BHUFVQcm9ncmFtLCBpbnB1dHM6IFRlbnNvckluZm9bXSwgb3V0cHV0RHR5cGU/OiBEYXRhVHlwZSxcbiAgICAgIGN1c3RvbVVuaWZvcm1WYWx1ZXM/OiBudW1iZXJbXVtdLFxuICAgICAgcHJldmVudEVhZ2VyVW5wYWNraW5nT2ZPdXRwdXQgPSBmYWxzZSk6IFRlbnNvckluZm8ge1xuICAgIG91dHB1dER0eXBlID0gb3V0cHV0RHR5cGUgfHwgaW5wdXRzWzBdLmR0eXBlO1xuICAgIGNvbnN0IG91dEluZm8gPSB0aGlzLnJ1bldlYkdMUHJvZ3JhbShcbiAgICAgICAgcHJvZ3JhbSwgaW5wdXRzLCBvdXRwdXREdHlwZSwgY3VzdG9tVW5pZm9ybVZhbHVlcyxcbiAgICAgICAgcHJldmVudEVhZ2VyVW5wYWNraW5nT2ZPdXRwdXQpO1xuICAgIHJldHVybiBvdXRJbmZvO1xuICB9XG5cbiAgcHJpdmF0ZSBnZXRBbmRTYXZlQmluYXJ5KGtleTogc3RyaW5nLCBnZXRCaW5hcnk6ICgpID0+IEdQR1BVQmluYXJ5KTpcbiAgICAgIEdQR1BVQmluYXJ5IHtcbiAgICBpZiAoIShrZXkgaW4gdGhpcy5iaW5hcnlDYWNoZSkpIHtcbiAgICAgIHRoaXMuYmluYXJ5Q2FjaGVba2V5XSA9IGdldEJpbmFyeSgpO1xuICAgIH1cbiAgICByZXR1cm4gdGhpcy5iaW5hcnlDYWNoZVtrZXldO1xuICB9XG5cbiAgZ2V0VGV4dHVyZU1hbmFnZXIoKTogVGV4dHVyZU1hbmFnZXIge1xuICAgIHJldHVybiB0aGlzLnRleHR1cmVNYW5hZ2VyO1xuICB9XG5cbiAgcHJpdmF0ZSBkaXNwb3NlZCA9IGZhbHNlO1xuXG4gIGRpc3Bvc2UoKSB7XG4gICAgaWYgKHRoaXMuZGlzcG9zZWQpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgLy8gQXZvaWQgZGlzcG9zaW5nIHRoZSBjb21waWxlZCB3ZWJnbCBwcm9ncmFtcyBkdXJpbmcgdW5pdCB0ZXN0aW5nIGJlY2F1c2VcbiAgICAvLyBpdCBzbG93cyBkb3duIHRlc3QgZXhlY3V0aW9uLlxuICAgIGlmICghZW52KCkuZ2V0Qm9vbCgnSVNfVEVTVCcpKSB7XG4gICAgICBjb25zdCBhbGxLZXlzID0gT2JqZWN0LmtleXModGhpcy5iaW5hcnlDYWNoZSk7XG4gICAgICBhbGxLZXlzLmZvckVhY2goa2V5ID0+IHtcbiAgICAgICAgdGhpcy5ncGdwdS5kZWxldGVQcm9ncmFtKHRoaXMuYmluYXJ5Q2FjaGVba2V5XS53ZWJHTFByb2dyYW0pO1xuICAgICAgICBkZWxldGUgdGhpcy5iaW5hcnlDYWNoZVtrZXldO1xuICAgICAgfSk7XG4gICAgfVxuICAgIHRoaXMudGV4dHVyZU1hbmFnZXIuZGlzcG9zZSgpO1xuICAgIGlmICh0aGlzLmNhbnZhcyAhPSBudWxsICYmXG4gICAgICAgICh0eXBlb2YgKEhUTUxDYW52YXNFbGVtZW50KSAhPT0gJ3VuZGVmaW5lZCcgJiZcbiAgICAgICAgIHRoaXMuY2FudmFzIGluc3RhbmNlb2YgSFRNTENhbnZhc0VsZW1lbnQpKSB7XG4gICAgICB0aGlzLmNhbnZhcy5yZW1vdmUoKTtcbiAgICB9IGVsc2Uge1xuICAgICAgdGhpcy5jYW52YXMgPSBudWxsO1xuICAgIH1cbiAgICBpZiAodGhpcy5ncGdwdUNyZWF0ZWRMb2NhbGx5KSB7XG4gICAgICB0aGlzLmdwZ3B1LnByb2dyYW0gPSBudWxsO1xuICAgICAgdGhpcy5ncGdwdS5kaXNwb3NlKCk7XG4gICAgfVxuICAgIHRoaXMuZGlzcG9zZWQgPSB0cnVlO1xuICB9XG5cbiAgZmxvYXRQcmVjaXNpb24oKTogMTZ8MzIge1xuICAgIGlmICh0aGlzLmZsb2F0UHJlY2lzaW9uVmFsdWUgPT0gbnVsbCkge1xuICAgICAgdGhpcy5mbG9hdFByZWNpc2lvblZhbHVlID0gdGlkeSgoKSA9PiB7XG4gICAgICAgIGlmICghZW52KCkuZ2V0KCdXRUJHTF9SRU5ERVJfRkxPQVQzMl9FTkFCTEVEJykpIHtcbiAgICAgICAgICAvLyBNb21lbnRhcmlseSBzd2l0Y2hpbmcgREVCVUcgZmxhZyB0byBmYWxzZSBzbyB3ZSBkb24ndCB0aHJvdyBhblxuICAgICAgICAgIC8vIGVycm9yIHRyeWluZyB0byB1cGxvYWQgYSBzbWFsbCB2YWx1ZS5cbiAgICAgICAgICBjb25zdCBkZWJ1Z0ZsYWcgPSBlbnYoKS5nZXRCb29sKCdERUJVRycpO1xuICAgICAgICAgIGVudigpLnNldCgnREVCVUcnLCBmYWxzZSk7XG4gICAgICAgICAgY29uc3QgdW5kZXJmbG93Q2hlY2tWYWx1ZSA9IHRoaXMuYWJzKHNjYWxhcigxZS04KSkuZGF0YVN5bmMoKVswXTtcbiAgICAgICAgICBlbnYoKS5zZXQoJ0RFQlVHJywgZGVidWdGbGFnKTtcblxuICAgICAgICAgIGlmICh1bmRlcmZsb3dDaGVja1ZhbHVlID4gMCkge1xuICAgICAgICAgICAgcmV0dXJuIDMyO1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gMTY7XG4gICAgICB9KTtcbiAgICB9XG4gICAgcmV0dXJuIHRoaXMuZmxvYXRQcmVjaXNpb25WYWx1ZTtcbiAgfVxuXG4gIC8qKiBSZXR1cm5zIHRoZSBzbWFsbGVzdCByZXByZXNlbnRhYmxlIG51bWJlci4gICovXG4gIGVwc2lsb24oKTogbnVtYmVyIHtcbiAgICByZXR1cm4gdGhpcy5mbG9hdFByZWNpc2lvbigpID09PSAzMiA/IEVQU0lMT05fRkxPQVQzMiA6IEVQU0lMT05fRkxPQVQxNjtcbiAgfVxuXG4gIHVwbG9hZFRvR1BVKGRhdGFJZDogRGF0YUlkKTogdm9pZCB7XG4gICAgY29uc3QgdGV4RGF0YSA9IHRoaXMudGV4RGF0YS5nZXQoZGF0YUlkKTtcbiAgICBjb25zdCB7c2hhcGUsIGR0eXBlLCB2YWx1ZXMsIHRleHR1cmUsIHVzYWdlLCBpc1BhY2tlZH0gPSB0ZXhEYXRhO1xuXG4gICAgaWYgKHRleHR1cmUgIT0gbnVsbCkge1xuICAgICAgLy8gQXJyYXkgaXMgYWxyZWFkeSBvbiBHUFUuIE5vLW9wLlxuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICBjb25zdCBzaG91bGRUaW1lUHJvZ3JhbSA9IHRoaXMuYWN0aXZlVGltZXJzICE9IG51bGw7XG4gICAgbGV0IHN0YXJ0OiBudW1iZXI7XG4gICAgaWYgKHNob3VsZFRpbWVQcm9ncmFtKSB7XG4gICAgICBzdGFydCA9IHV0aWwubm93KCk7XG4gICAgfVxuXG4gICAgbGV0IHRleFNoYXBlID0gdGV4RGF0YS50ZXhTaGFwZTtcbiAgICBpZiAodGV4U2hhcGUgPT0gbnVsbCkge1xuICAgICAgLy8gVGhpcyB0ZXhTaGFwZSBtYXkgbm90IGJlIHRoZSBmaW5hbCB0ZXh0dXJlIHNoYXBlLiBGb3IgcGFja2VkIG9yIGRlbnNlXG4gICAgICAvLyB0ZXh0dXJlcywgdGhlIHRleFNoYXBlIHdpbGwgYmUgY2hhbmdlZCB3aGVuIHRleHR1cmVzIGFyZSBjcmVhdGVkLlxuICAgICAgdGV4U2hhcGUgPSB3ZWJnbF91dGlsLmdldFRleHR1cmVTaGFwZUZyb21Mb2dpY2FsU2hhcGUoc2hhcGUsIGlzUGFja2VkKTtcbiAgICAgIHRleERhdGEudGV4U2hhcGUgPSB0ZXhTaGFwZTtcbiAgICB9XG5cbiAgICBpZiAodmFsdWVzICE9IG51bGwpIHtcbiAgICAgIGNvbnN0IHNoYXBlQXMzRCA9IHdlYmdsX3V0aWwuZ2V0U2hhcGVBczNEKHNoYXBlKTtcblxuICAgICAgbGV0IHByb2dyYW07XG4gICAgICBsZXQgd2lkdGggPSB0ZXhTaGFwZVsxXSwgaGVpZ2h0ID0gdGV4U2hhcGVbMF07XG4gICAgICBjb25zdCBpc0J5dGVBcnJheSA9XG4gICAgICAgICAgdmFsdWVzIGluc3RhbmNlb2YgVWludDhBcnJheSB8fCB2YWx1ZXMgaW5zdGFuY2VvZiBVaW50OENsYW1wZWRBcnJheTtcblxuICAgICAgLy8gdGV4dHVyZSBmb3IgZmxvYXQgYXJyYXkgaXMgUGh5c2ljYWxUZXh0dXJlVHlwZS5QQUNLRURfMlgyX0ZMT0FUMzIsIHdlXG4gICAgICAvLyBuZWVkIHRvIG1ha2Ugc3VyZSB0aGUgdXBsb2FkIHVzZXMgdGhlIHNhbWUgcGFja2VkIHNpemVcbiAgICAgIGlmIChpc1BhY2tlZCB8fCAhaXNCeXRlQXJyYXkpIHtcbiAgICAgICAgW3dpZHRoLCBoZWlnaHRdID0gdGV4X3V0aWwuZ2V0UGFja2VkTWF0cml4VGV4dHVyZVNoYXBlV2lkdGhIZWlnaHQoXG4gICAgICAgICAgICB0ZXhTaGFwZVswXSwgdGV4U2hhcGVbMV0pO1xuICAgICAgfVxuXG4gICAgICBpZiAoaXNQYWNrZWQpIHtcbiAgICAgICAgcHJvZ3JhbSA9IG5ldyBFbmNvZGVNYXRyaXhQYWNrZWRQcm9ncmFtKHNoYXBlQXMzRCwgaXNCeXRlQXJyYXkpO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgcHJvZ3JhbSA9IG5ldyBFbmNvZGVNYXRyaXhQcm9ncmFtKHNoYXBlQXMzRCwgaXNCeXRlQXJyYXkpO1xuICAgICAgfVxuXG4gICAgICAvLyBUZXhTaGFwZSBmb3IgZmxvYXQgYXJyYXkgbmVlZHMgdG8gYmUgdGhlIG9yaWdpbmFsIHNoYXBlLCB3aGljaCBieXRlXG4gICAgICAvLyBhcnJheSBuZWVkcyB0byBiZSBwYWNrZWQgc2l6ZS4gVGhpcyBhbGxvdyB0aGUgZGF0YSB1cGxvYWQgc2hhcGUgdG8gYmVcbiAgICAgIC8vIG1hdGNoZWQgd2l0aCB0ZXh0dXJlIGNyZWF0aW9uIGxvZ2ljLlxuICAgICAgY29uc3QgdGVtcERlbnNlSW5wdXRUZXhTaGFwZTogW251bWJlciwgbnVtYmVyXSA9XG4gICAgICAgICAgaXNCeXRlQXJyYXkgPyBbaGVpZ2h0LCB3aWR0aF0gOiB0ZXhTaGFwZTtcbiAgICAgIGNvbnN0IHRlbXBEZW5zZUlucHV0SGFuZGxlID1cbiAgICAgICAgICB0aGlzLm1ha2VUZW5zb3JJbmZvKHRlbXBEZW5zZUlucHV0VGV4U2hhcGUsIGR0eXBlKTtcbiAgICAgIGNvbnN0IHRlbXBEZW5zZUlucHV0VGV4RGF0YSA9XG4gICAgICAgICAgdGhpcy50ZXhEYXRhLmdldCh0ZW1wRGVuc2VJbnB1dEhhbmRsZS5kYXRhSWQpO1xuICAgICAgaWYgKGlzQnl0ZUFycmF5KSB7XG4gICAgICAgIHRlbXBEZW5zZUlucHV0VGV4RGF0YS51c2FnZSA9IFRleHR1cmVVc2FnZS5QSVhFTFM7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICB0ZW1wRGVuc2VJbnB1dFRleERhdGEudXNhZ2UgPSBUZXh0dXJlVXNhZ2UuVVBMT0FEO1xuICAgICAgfVxuICAgICAgdGVtcERlbnNlSW5wdXRUZXhEYXRhLnRleFNoYXBlID0gdGVtcERlbnNlSW5wdXRUZXhTaGFwZTtcbiAgICAgIHRoaXMuZ3BncHUudXBsb2FkRGVuc2VNYXRyaXhUb1RleHR1cmUoXG4gICAgICAgICAgdGhpcy5nZXRUZXh0dXJlKHRlbXBEZW5zZUlucHV0SGFuZGxlLmRhdGFJZCksIHdpZHRoLCBoZWlnaHQsXG4gICAgICAgICAgdmFsdWVzIGFzIFR5cGVkQXJyYXkpO1xuXG4gICAgICBjb25zdCBjdXN0b21WYWx1ZXMgPSBbW2hlaWdodCwgd2lkdGhdXTtcbiAgICAgIC8vIFdlIHdhbnQgdGhlIG91dHB1dCB0byByZW1haW4gcGFja2VkIHJlZ2FyZGxlc3Mgb2YgdGhlIHZhbHVlIG9mXG4gICAgICAvLyBXRUJHTF9QQUNLLlxuICAgICAgY29uc3QgcHJldmVudEVhZ2VyVW5wYWNraW5nID0gdHJ1ZTtcbiAgICAgIGNvbnN0IGVuY29kZWRPdXRwdXRUYXJnZXQgPSB0aGlzLnJ1bldlYkdMUHJvZ3JhbShcbiAgICAgICAgICBwcm9ncmFtLCBbdGVtcERlbnNlSW5wdXRIYW5kbGVdLCBkdHlwZSwgY3VzdG9tVmFsdWVzLFxuICAgICAgICAgIHByZXZlbnRFYWdlclVucGFja2luZyk7XG5cbiAgICAgIC8vIEhhdmUgdGhlIG9yaWdpbmFsIHRleHR1cmUgYXNzdW1lIHRoZSBpZGVudGl0eSBvZiB0aGUgZW5jb2RlZCBvdXRwdXQuXG4gICAgICBjb25zdCBvdXRwdXRUZXhEYXRhID0gdGhpcy50ZXhEYXRhLmdldChlbmNvZGVkT3V0cHV0VGFyZ2V0LmRhdGFJZCk7XG4gICAgICB0ZXhEYXRhLnRleFNoYXBlID0gb3V0cHV0VGV4RGF0YS50ZXhTaGFwZTtcbiAgICAgIHRleERhdGEuaXNQYWNrZWQgPSBvdXRwdXRUZXhEYXRhLmlzUGFja2VkO1xuICAgICAgdGV4RGF0YS51c2FnZSA9IG91dHB1dFRleERhdGEudXNhZ2U7XG5cbiAgICAgIGlmICghZW52KCkuZ2V0KCdFTkdJTkVfQ09NUElMRV9PTkxZJykpIHtcbiAgICAgICAgdGV4RGF0YS50ZXh0dXJlID0gb3V0cHV0VGV4RGF0YS50ZXh0dXJlO1xuICAgICAgICAvLyBPbmNlIHVwbG9hZGVkLCBkb24ndCBzdG9yZSB0aGUgdmFsdWVzIG9uIGNwdS5cbiAgICAgICAgdGV4RGF0YS52YWx1ZXMgPSBudWxsO1xuICAgICAgICB0aGlzLnRleERhdGEuZGVsZXRlKGVuY29kZWRPdXRwdXRUYXJnZXQuZGF0YUlkKTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHRoaXMuZGlzcG9zZURhdGEoZW5jb2RlZE91dHB1dFRhcmdldC5kYXRhSWQpO1xuICAgICAgfVxuXG4gICAgICB0aGlzLmRpc3Bvc2VJbnRlcm1lZGlhdGVUZW5zb3JJbmZvKHRlbXBEZW5zZUlucHV0SGFuZGxlKTtcblxuICAgICAgaWYgKHNob3VsZFRpbWVQcm9ncmFtKSB7XG4gICAgICAgIHRoaXMudXBsb2FkV2FpdE1zICs9IHV0aWwubm93KCkgLSBzdGFydDtcbiAgICAgIH1cbiAgICB9IGVsc2Uge1xuICAgICAgY29uc3QgbmV3VGV4dHVyZSA9IHRoaXMuYWNxdWlyZVRleHR1cmUodGV4U2hhcGUsIHVzYWdlLCBkdHlwZSwgaXNQYWNrZWQpO1xuICAgICAgdGV4RGF0YS50ZXh0dXJlID0gbmV3VGV4dHVyZTtcbiAgICB9XG4gIH1cblxuICBwcml2YXRlIGNvbnZlcnRBbmRDYWNoZU9uQ1BVKGRhdGFJZDogRGF0YUlkLCBmbG9hdDMyVmFsdWVzPzogRmxvYXQzMkFycmF5KTpcbiAgICAgIFR5cGVkQXJyYXkge1xuICAgIGNvbnN0IHRleERhdGEgPSB0aGlzLnRleERhdGEuZ2V0KGRhdGFJZCk7XG4gICAgY29uc3Qge2R0eXBlfSA9IHRleERhdGE7XG5cbiAgICB0aGlzLnJlbGVhc2VHUFVEYXRhKGRhdGFJZCk7XG5cbiAgICBpZiAoZmxvYXQzMlZhbHVlcyAhPSBudWxsKSB7XG4gICAgICB0ZXhEYXRhLnZhbHVlcyA9IGZsb2F0MzJUb1R5cGVkQXJyYXkoZmxvYXQzMlZhbHVlcywgZHR5cGUgYXMgJ2Zsb2F0MzInKTtcbiAgICB9XG4gICAgcmV0dXJuIHRleERhdGEudmFsdWVzIGFzIFR5cGVkQXJyYXk7XG4gIH1cblxuICBwcml2YXRlIGFjcXVpcmVUZXh0dXJlKFxuICAgICAgdGV4U2hhcGU6IFtudW1iZXIsIG51bWJlcl0sIHRleFR5cGU6IFRleHR1cmVVc2FnZSwgZHR5cGU6IERhdGFUeXBlLFxuICAgICAgaXNQYWNrZWQ6IGJvb2xlYW4pOiBUZXh0dXJlIHtcbiAgICB0aGlzLm51bUJ5dGVzSW5HUFUgKz0gdGhpcy5jb21wdXRlQnl0ZXModGV4U2hhcGUsIGR0eXBlKTtcbiAgICBpZiAoIXRoaXMud2FybmVkQWJvdXRNZW1vcnkgJiZcbiAgICAgICAgdGhpcy5udW1CeXRlc0luR1BVID4gdGhpcy5udW1NQkJlZm9yZVdhcm5pbmcgKiAxMDI0ICogMTAyNCkge1xuICAgICAgY29uc3QgbWIgPSAodGhpcy5udW1CeXRlc0luR1BVIC8gMTAyNCAvIDEwMjQpLnRvRml4ZWQoMik7XG4gICAgICB0aGlzLndhcm5lZEFib3V0TWVtb3J5ID0gdHJ1ZTtcbiAgICAgIGNvbnNvbGUud2FybihcbiAgICAgICAgICBgSGlnaCBtZW1vcnkgdXNhZ2UgaW4gR1BVOiAke21ifSBNQiwgYCArXG4gICAgICAgICAgYG1vc3QgbGlrZWx5IGR1ZSB0byBhIG1lbW9yeSBsZWFrYCk7XG4gICAgfVxuICAgIHJldHVybiB0aGlzLnRleHR1cmVNYW5hZ2VyLmFjcXVpcmVUZXh0dXJlKHRleFNoYXBlLCB0ZXhUeXBlLCBpc1BhY2tlZCk7XG4gIH1cblxuICBwcml2YXRlIGNvbXB1dGVCeXRlcyhzaGFwZTogW251bWJlciwgbnVtYmVyXSwgZHR5cGU6IERhdGFUeXBlKSB7XG4gICAgcmV0dXJuIHNoYXBlWzBdICogc2hhcGVbMV0gKiB1dGlsLmJ5dGVzUGVyRWxlbWVudChkdHlwZSk7XG4gIH1cblxuICBjaGVja0NvbXBpbGVDb21wbGV0aW9uKCkge1xuICAgIGZvciAoY29uc3QgWywgYmluYXJ5XSBvZiBPYmplY3QuZW50cmllcyh0aGlzLmJpbmFyeUNhY2hlKSkge1xuICAgICAgdGhpcy5jaGVja0NvbXBsZXRpb25fKGJpbmFyeSk7XG4gICAgfVxuICB9XG5cbiAgYXN5bmMgY2hlY2tDb21waWxlQ29tcGxldGlvbkFzeW5jKCk6IFByb21pc2U8Ym9vbGVhbltdPiB7XG4gICAgY29uc3QgcHMgPSBbXTtcbiAgICBpZiAodGhpcy5ncGdwdS5wYXJhbGxlbENvbXBpbGF0aW9uRXh0ZW5zaW9uKSB7XG4gICAgICBmb3IgKGNvbnN0IFssIGJpbmFyeV0gb2YgT2JqZWN0LmVudHJpZXModGhpcy5iaW5hcnlDYWNoZSkpIHtcbiAgICAgICAgcHMucHVzaCh0aGlzLmNoZWNrQ29tcGxldGlvbkFzeW5jXyhiaW5hcnkpKTtcbiAgICAgIH1cbiAgICAgIHJldHVybiBQcm9taXNlLmFsbChwcyk7XG4gICAgfSBlbHNlIHtcbiAgICAgIGZvciAoY29uc3QgWywgYmluYXJ5XSBvZiBPYmplY3QuZW50cmllcyh0aGlzLmJpbmFyeUNhY2hlKSkge1xuICAgICAgICBjb25zdCBwOiBQcm9taXNlPGJvb2xlYW4+ID0gbmV3IFByb21pc2UoKHJlc29sdmUpID0+IHtcbiAgICAgICAgICB0cnkge1xuICAgICAgICAgICAgdGhpcy5jaGVja0NvbXBsZXRpb25fKGJpbmFyeSk7XG4gICAgICAgICAgICByZXNvbHZlKHRydWUpO1xuICAgICAgICAgIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgICAgICAgICB0aHJvdyBlcnJvcjtcbiAgICAgICAgICB9XG4gICAgICAgIH0pO1xuICAgICAgICBwcy5wdXNoKHApO1xuICAgICAgfVxuICAgICAgcmV0dXJuIFByb21pc2UuYWxsKHBzKTtcbiAgICB9XG4gIH1cblxuICBwcml2YXRlIGFzeW5jIGNoZWNrQ29tcGxldGlvbkFzeW5jXyhiaW5hcnk6IEdQR1BVQmluYXJ5KTogUHJvbWlzZTxib29sZWFuPiB7XG4gICAgaWYgKHRoaXMuZ3BncHUuZ2wuZ2V0UHJvZ3JhbVBhcmFtZXRlcihcbiAgICAgICAgICAgIGJpbmFyeS53ZWJHTFByb2dyYW0sXG4gICAgICAgICAgICB0aGlzLmdwZ3B1LnBhcmFsbGVsQ29tcGlsYXRpb25FeHRlbnNpb24uQ09NUExFVElPTl9TVEFUVVNfS0hSKSkge1xuICAgICAgcmV0dXJuIHRoaXMuY2hlY2tDb21wbGV0aW9uXyhiaW5hcnkpO1xuICAgIH0gZWxzZSB7XG4gICAgICBhd2FpdCBuZXh0RnJhbWUoKTtcbiAgICAgIHJldHVybiB0aGlzLmNoZWNrQ29tcGxldGlvbkFzeW5jXyhiaW5hcnkpO1xuICAgIH1cbiAgfVxuXG4gIHByaXZhdGUgY2hlY2tDb21wbGV0aW9uXyhiaW5hcnk6IEdQR1BVQmluYXJ5KTogYm9vbGVhbiB7XG4gICAgaWYgKHRoaXMuZ3BncHUuZ2wuZ2V0UHJvZ3JhbVBhcmFtZXRlcihcbiAgICAgICAgICAgIGJpbmFyeS53ZWJHTFByb2dyYW0sIHRoaXMuZ3BncHUuZ2wuTElOS19TVEFUVVMpID09PSBmYWxzZSkge1xuICAgICAgY29uc29sZS5sb2codGhpcy5ncGdwdS5nbC5nZXRQcm9ncmFtSW5mb0xvZyhiaW5hcnkud2ViR0xQcm9ncmFtKSk7XG4gICAgICBpZiAodGhpcy5ncGdwdS5nbC5nZXRTaGFkZXJQYXJhbWV0ZXIoXG4gICAgICAgICAgICAgIGJpbmFyeS5mcmFnbWVudFNoYWRlciwgdGhpcy5ncGdwdS5nbC5DT01QSUxFX1NUQVRVUykgPT09IGZhbHNlKSB7XG4gICAgICAgIHdlYmdsX3V0aWwubG9nU2hhZGVyU291cmNlQW5kSW5mb0xvZyhcbiAgICAgICAgICAgIGJpbmFyeS5zb3VyY2UsXG4gICAgICAgICAgICB0aGlzLmdwZ3B1LmdsLmdldFNoYWRlckluZm9Mb2coYmluYXJ5LmZyYWdtZW50U2hhZGVyKSk7XG4gICAgICAgIHRocm93IG5ldyBFcnJvcignRmFpbGVkIHRvIGNvbXBpbGUgZnJhZ21lbnQgc2hhZGVyLicpO1xuICAgICAgfVxuICAgICAgdGhyb3cgbmV3IEVycm9yKCdGYWlsZWQgdG8gbGluayB2ZXJ0ZXggYW5kIGZyYWdtZW50IHNoYWRlcnMuJyk7XG4gICAgfVxuICAgIHJldHVybiB0cnVlO1xuICB9XG5cbiAgZ2V0VW5pZm9ybUxvY2F0aW9ucygpIHtcbiAgICBmb3IgKGNvbnN0IFssIGJpbmFyeV0gb2YgT2JqZWN0LmVudHJpZXModGhpcy5iaW5hcnlDYWNoZSkpIHtcbiAgICAgIGNvbnN0IHtcbiAgICAgICAgdW5pZm9ybUxvY2F0aW9ucyxcbiAgICAgICAgY3VzdG9tVW5pZm9ybUxvY2F0aW9ucyxcbiAgICAgICAgaW5mTG9jLFxuICAgICAgICBuYW5Mb2MsXG4gICAgICAgIGluU2hhcGVzTG9jYXRpb25zLFxuICAgICAgICBpblRleFNoYXBlc0xvY2F0aW9ucyxcbiAgICAgICAgb3V0U2hhcGVMb2NhdGlvbixcbiAgICAgICAgb3V0U2hhcGVTdHJpZGVzTG9jYXRpb24sXG4gICAgICAgIG91dFRleFNoYXBlTG9jYXRpb25cbiAgICAgIH0gPSBnZXRVbmlmb3JtTG9jYXRpb25zKHRoaXMuZ3BncHUsIGJpbmFyeS5wcm9ncmFtLCBiaW5hcnkud2ViR0xQcm9ncmFtKTtcbiAgICAgIGJpbmFyeS51bmlmb3JtTG9jYXRpb25zID0gdW5pZm9ybUxvY2F0aW9ucztcbiAgICAgIGJpbmFyeS5jdXN0b21Vbmlmb3JtTG9jYXRpb25zID0gY3VzdG9tVW5pZm9ybUxvY2F0aW9ucztcbiAgICAgIGJpbmFyeS5pbmZMb2MgPSBpbmZMb2M7XG4gICAgICBiaW5hcnkubmFuTG9jID0gbmFuTG9jO1xuICAgICAgYmluYXJ5LmluU2hhcGVzTG9jYXRpb25zID0gaW5TaGFwZXNMb2NhdGlvbnM7XG4gICAgICBiaW5hcnkuaW5UZXhTaGFwZXNMb2NhdGlvbnMgPSBpblRleFNoYXBlc0xvY2F0aW9ucztcbiAgICAgIGJpbmFyeS5vdXRTaGFwZUxvY2F0aW9uID0gb3V0U2hhcGVMb2NhdGlvbjtcbiAgICAgIGJpbmFyeS5vdXRTaGFwZVN0cmlkZXNMb2NhdGlvbiA9IG91dFNoYXBlU3RyaWRlc0xvY2F0aW9uO1xuICAgICAgYmluYXJ5Lm91dFRleFNoYXBlTG9jYXRpb24gPSBvdXRUZXhTaGFwZUxvY2F0aW9uO1xuICAgIH1cbiAgfVxufVxuXG5mdW5jdGlvbiBmbG9hdDMyVG9UeXBlZEFycmF5PEQgZXh0ZW5kcyBOdW1lcmljRGF0YVR5cGU+KFxuICAgIGE6IEZsb2F0MzJBcnJheSwgZHR5cGU6IEQpOiB0Zi5EYXRhVHlwZU1hcFtEXSB7XG4gIGlmIChkdHlwZSA9PT0gJ2Zsb2F0MzInIHx8IGR0eXBlID09PSAnY29tcGxleDY0Jykge1xuICAgIHJldHVybiBhIGFzIHRmLkRhdGFUeXBlTWFwW0RdO1xuICB9IGVsc2UgaWYgKGR0eXBlID09PSAnaW50MzInIHx8IGR0eXBlID09PSAnYm9vbCcpIHtcbiAgICBjb25zdCByZXN1bHQgPSAoZHR5cGUgPT09ICdpbnQzMicpID8gbmV3IEludDMyQXJyYXkoYS5sZW5ndGgpIDpcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbmV3IFVpbnQ4QXJyYXkoYS5sZW5ndGgpO1xuICAgIGZvciAobGV0IGkgPSAwOyBpIDwgcmVzdWx0Lmxlbmd0aDsgKytpKSB7XG4gICAgICByZXN1bHRbaV0gPSBNYXRoLnJvdW5kKGFbaV0pO1xuICAgIH1cbiAgICByZXR1cm4gcmVzdWx0IGFzIHRmLkRhdGFUeXBlTWFwW0RdO1xuICB9IGVsc2Uge1xuICAgIHRocm93IG5ldyBFcnJvcihgVW5rbm93biBkdHlwZSAke2R0eXBlfWApO1xuICB9XG59XG4iXX0=","/**\n * @license\n * Copyright 2020 Google Inc. All Rights Reserved.\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n * =============================================================================\n */\n// base.ts is the webgl backend without auto kernel registration.\nimport { device_util, registerBackend } from '@tensorflow/tfjs-core';\nimport { MathBackendWebGL } from './backend_webgl';\nexport { version as version_webgl } from './version';\nif (device_util.isBrowser()) {\n registerBackend('webgl', () => new MathBackendWebGL(), 2 /* priority */);\n}\n// Export webgl utilities\nexport * from './webgl';\n// Export forceHalfFlost under webgl namespace for the union bundle.\nimport { forceHalfFloat } from './webgl';\nexport const webgl = { forceHalfFloat };\n//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYmFzZS5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uL3RmanMtYmFja2VuZC13ZWJnbC9zcmMvYmFzZS50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQTs7Ozs7Ozs7Ozs7Ozs7O0dBZUc7QUFFSCxpRUFBaUU7QUFFakUsT0FBTyxFQUFDLFdBQVcsRUFBRSxlQUFlLEVBQUMsTUFBTSx1QkFBdUIsQ0FBQztBQUNuRSxPQUFPLEVBQUMsZ0JBQWdCLEVBQUMsTUFBTSxpQkFBaUIsQ0FBQztBQUNqRCxPQUFPLEVBQUMsT0FBTyxJQUFJLGFBQWEsRUFBQyxNQUFNLFdBQVcsQ0FBQztBQUVuRCxJQUFJLFdBQVcsQ0FBQyxTQUFTLEVBQUUsRUFBRTtJQUMzQixlQUFlLENBQUMsT0FBTyxFQUFFLEdBQUcsRUFBRSxDQUFDLElBQUksZ0JBQWdCLEVBQUUsRUFBRSxDQUFDLENBQUMsY0FBYyxDQUFDLENBQUM7Q0FDMUU7QUFFRCx5QkFBeUI7QUFDekIsY0FBYyxTQUFTLENBQUM7QUFFeEIsb0VBQW9FO0FBQ3BFLE9BQU8sRUFBQyxjQUFjLEVBQUMsTUFBTSxTQUFTLENBQUM7QUFDdkMsTUFBTSxDQUFDLE1BQU0sS0FBSyxHQUFHLEVBQUMsY0FBYyxFQUFDLENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyIvKipcbiAqIEBsaWNlbnNlXG4gKiBDb3B5cmlnaHQgMjAyMCBHb29nbGUgSW5jLiBBbGwgUmlnaHRzIFJlc2VydmVkLlxuICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlIFwiTGljZW5zZVwiKTtcbiAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS5cbiAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdFxuICpcbiAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMFxuICpcbiAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmVcbiAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuIFwiQVMgSVNcIiBCQVNJUyxcbiAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLlxuICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZFxuICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuXG4gKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuICovXG5cbi8vIGJhc2UudHMgaXMgdGhlIHdlYmdsIGJhY2tlbmQgd2l0aG91dCBhdXRvIGtlcm5lbCByZWdpc3RyYXRpb24uXG5cbmltcG9ydCB7ZGV2aWNlX3V0aWwsIHJlZ2lzdGVyQmFja2VuZH0gZnJvbSAnQHRlbnNvcmZsb3cvdGZqcy1jb3JlJztcbmltcG9ydCB7TWF0aEJhY2tlbmRXZWJHTH0gZnJvbSAnLi9iYWNrZW5kX3dlYmdsJztcbmV4cG9ydCB7dmVyc2lvbiBhcyB2ZXJzaW9uX3dlYmdsfSBmcm9tICcuL3ZlcnNpb24nO1xuXG5pZiAoZGV2aWNlX3V0aWwuaXNCcm93c2VyKCkpIHtcbiAgcmVnaXN0ZXJCYWNrZW5kKCd3ZWJnbCcsICgpID0+IG5ldyBNYXRoQmFja2VuZFdlYkdMKCksIDIgLyogcHJpb3JpdHkgKi8pO1xufVxuXG4vLyBFeHBvcnQgd2ViZ2wgdXRpbGl0aWVzXG5leHBvcnQgKiBmcm9tICcuL3dlYmdsJztcblxuLy8gRXhwb3J0IGZvcmNlSGFsZkZsb3N0IHVuZGVyIHdlYmdsIG5hbWVzcGFjZSBmb3IgdGhlIHVuaW9uIGJ1bmRsZS5cbmltcG9ydCB7Zm9yY2VIYWxmRmxvYXR9IGZyb20gJy4vd2ViZ2wnO1xuZXhwb3J0IGNvbnN0IHdlYmdsID0ge2ZvcmNlSGFsZkZsb2F0fTtcbiJdfQ==","/**\n * @license\n * Copyright 2017 Google LLC. All Rights Reserved.\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n * =============================================================================\n */\nimport { backend_util } from '@tensorflow/tfjs-core';\nimport { useShapeUniforms } from './gpgpu_math';\nexport const CHECK_NAN_SNIPPET = `\n if (isnan(a)) return a;\n if (isnan(b)) return b;\n`;\nexport const SQUARED_DIFFERENCE = 'return (a - b) * (a - b);';\nexport class BinaryOpProgram {\n constructor(op, aShape, bShape) {\n this.variableNames = ['A', 'B'];\n this.outputShape = backend_util.assertAndGetBroadcastShape(aShape, bShape);\n this.enableShapeUniforms = useShapeUniforms(this.outputShape.length);\n this.userCode = `\n float binaryOperation(float a, float b) {\n ${op}\n }\n\n void main() {\n float a = getAAtOutCoords();\n float b = getBAtOutCoords();\n setOutput(binaryOperation(a, b));\n }\n `;\n }\n}\n//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYmluYXJ5b3BfZ3B1LmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vdGZqcy1iYWNrZW5kLXdlYmdsL3NyYy9iaW5hcnlvcF9ncHUudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUE7Ozs7Ozs7Ozs7Ozs7OztHQWVHO0FBRUgsT0FBTyxFQUFDLFlBQVksRUFBQyxNQUFNLHVCQUF1QixDQUFDO0FBRW5ELE9BQU8sRUFBZSxnQkFBZ0IsRUFBQyxNQUFNLGNBQWMsQ0FBQztBQUU1RCxNQUFNLENBQUMsTUFBTSxpQkFBaUIsR0FBRzs7O0NBR2hDLENBQUM7QUFFRixNQUFNLENBQUMsTUFBTSxrQkFBa0IsR0FBRywyQkFBMkIsQ0FBQztBQUM5RCxNQUFNLE9BQU8sZUFBZTtJQU0xQixZQUFZLEVBQVUsRUFBRSxNQUFnQixFQUFFLE1BQWdCO1FBTDFELGtCQUFhLEdBQUcsQ0FBQyxHQUFHLEVBQUUsR0FBRyxDQUFDLENBQUM7UUFNekIsSUFBSSxDQUFDLFdBQVcsR0FBRyxZQUFZLENBQUMsMEJBQTBCLENBQUMsTUFBTSxFQUFFLE1BQU0sQ0FBQyxDQUFDO1FBQzNFLElBQUksQ0FBQyxtQkFBbUIsR0FBRyxnQkFBZ0IsQ0FBQyxJQUFJLENBQUMsV0FBVyxDQUFDLE1BQU0sQ0FBQyxDQUFDO1FBQ3JFLElBQUksQ0FBQyxRQUFRLEdBQUc7O1VBRVYsRUFBRTs7Ozs7Ozs7S0FRUCxDQUFDO0lBQ0osQ0FBQztDQUNGIiwic291cmNlc0NvbnRlbnQiOlsiLyoqXG4gKiBAbGljZW5zZVxuICogQ29weXJpZ2h0IDIwMTcgR29vZ2xlIExMQy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC5cbiAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSBcIkxpY2Vuc2VcIik7XG4gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuXG4gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXRcbiAqXG4gKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjBcbiAqXG4gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlXG4gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiBcIkFTIElTXCIgQkFTSVMsXG4gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC5cbiAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmRcbiAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLlxuICogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbiAqL1xuXG5pbXBvcnQge2JhY2tlbmRfdXRpbH0gZnJvbSAnQHRlbnNvcmZsb3cvdGZqcy1jb3JlJztcblxuaW1wb3J0IHtHUEdQVVByb2dyYW0sIHVzZVNoYXBlVW5pZm9ybXN9IGZyb20gJy4vZ3BncHVfbWF0aCc7XG5cbmV4cG9ydCBjb25zdCBDSEVDS19OQU5fU05JUFBFVCA9IGBcbiAgaWYgKGlzbmFuKGEpKSByZXR1cm4gYTtcbiAgaWYgKGlzbmFuKGIpKSByZXR1cm4gYjtcbmA7XG5cbmV4cG9ydCBjb25zdCBTUVVBUkVEX0RJRkZFUkVOQ0UgPSAncmV0dXJuIChhIC0gYikgKiAoYSAtIGIpOyc7XG5leHBvcnQgY2xhc3MgQmluYXJ5T3BQcm9ncmFtIGltcGxlbWVudHMgR1BHUFVQcm9ncmFtIHtcbiAgdmFyaWFibGVOYW1lcyA9IFsnQScsICdCJ107XG4gIG91dHB1dFNoYXBlOiBudW1iZXJbXTtcbiAgdXNlckNvZGU6IHN0cmluZztcbiAgZW5hYmxlU2hhcGVVbmlmb3JtczogYm9vbGVhbjtcblxuICBjb25zdHJ1Y3RvcihvcDogc3RyaW5nLCBhU2hhcGU6IG51bWJlcltdLCBiU2hhcGU6IG51bWJlcltdKSB7XG4gICAgdGhpcy5vdXRwdXRTaGFwZSA9IGJhY2tlbmRfdXRpbC5hc3NlcnRBbmRHZXRCcm9hZGNhc3RTaGFwZShhU2hhcGUsIGJTaGFwZSk7XG4gICAgdGhpcy5lbmFibGVTaGFwZVVuaWZvcm1zID0gdXNlU2hhcGVVbmlmb3Jtcyh0aGlzLm91dHB1dFNoYXBlLmxlbmd0aCk7XG4gICAgdGhpcy51c2VyQ29kZSA9IGBcbiAgICAgIGZsb2F0IGJpbmFyeU9wZXJhdGlvbihmbG9hdCBhLCBmbG9hdCBiKSB7XG4gICAgICAgICR7b3B9XG4gICAgICB9XG5cbiAgICAgIHZvaWQgbWFpbigpIHtcbiAgICAgICAgZmxvYXQgYSA9IGdldEFBdE91dENvb3JkcygpO1xuICAgICAgICBmbG9hdCBiID0gZ2V0QkF0T3V0Q29vcmRzKCk7XG4gICAgICAgIHNldE91dHB1dChiaW5hcnlPcGVyYXRpb24oYSwgYikpO1xuICAgICAgfVxuICAgIGA7XG4gIH1cbn1cbiJdfQ==","/**\n * @license\n * Copyright 2018 Google LLC. All Rights Reserved.\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n * =============================================================================\n */\nimport { backend_util, util } from '@tensorflow/tfjs-core';\nimport { useShapeUniforms } from './gpgpu_math';\nimport { getChannels } from './packing_util';\nimport { getCoordsDataType } from './shader_compiler';\nexport const CHECK_NAN_SNIPPET_PACKED = `\n result.r = isNaN.r ? NAN : result.r;\n result.g = isNaN.g ? NAN : result.g;\n result.b = isNaN.b ? NAN : result.b;\n result.a = isNaN.a ? NAN : result.a;\n`;\nexport const ELU_DER = `\n vec4 bGTEZero = vec4(greaterThanEqual(b, vec4(0.)));\n return (bGTEZero * a) + ((vec4(1.0) - bGTEZero) * (a * (b + vec4(1.0))));\n`;\nexport const NOT_EQUAL = `\n return vec4(notEqual(a, b));\n`;\nexport class BinaryOpPackedProgram {\n constructor(op, aShape, bShape, checkOutOfBounds = false) {\n this.variableNames = ['A', 'B'];\n this.supportsBroadcasting = true;\n this.packedInputs = true;\n this.packedOutput = true;\n this.outputShape = backend_util.assertAndGetBroadcastShape(aShape, bShape);\n const rank = this.outputShape.length;\n this.enableShapeUniforms = useShapeUniforms(rank);\n let checkOutOfBoundsString = '';\n if (checkOutOfBounds) {\n if (rank === 0 || util.sizeFromShape(this.outputShape) === 1) {\n checkOutOfBoundsString = `\n result.y = 0.;\n result.z = 0.;\n result.w = 0.;\n `;\n }\n else {\n const dtype = getCoordsDataType(rank);\n checkOutOfBoundsString = `\n ${dtype} coords = getOutputCoords();\n `;\n if (rank === 1) {\n if (this.enableShapeUniforms) {\n checkOutOfBoundsString += `\n result.y = (coords + 1) >= outShape ? 0. : result.y;\n result.z = 0.;\n result.w = 0.;\n `;\n }\n else {\n checkOutOfBoundsString += `\n result.y = (coords + 1) >= ${this.outputShape[0]} ? 0. : result.y;\n result.z = 0.;\n result.w = 0.;\n `;\n }\n }\n else {\n const channels = getChannels('coords', rank);\n if (this.enableShapeUniforms) {\n checkOutOfBoundsString += `\n bool nextRowOutOfBounds =\n (${channels[rank - 2]} + 1) >= outShape[${rank} - 2];\n bool nextColOutOfBounds =\n (${channels[rank - 1]} + 1) >= outShape[${rank} - 1];\n result.y = nextColOutOfBounds ? 0. : result.y;\n result.z = nextRowOutOfBounds ? 0. : result.z;\n result.w = nextColOutOfBounds || nextRowOutOfBounds ? 0. : result.w;\n `;\n }\n else {\n checkOutOfBoundsString += `\n bool nextRowOutOfBounds =\n (${channels[rank - 2]} + 1) >= ${this.outputShape[rank - 2]};\n bool nextColOutOfBounds =\n (${channels[rank - 1]} + 1) >= ${this.outputShape[rank - 1]};\n result.y = nextColOutOfBounds ? 0. : result.y;\n result.z = nextRowOutOfBounds ? 0. : result.z;\n result.w = nextColOutOfBounds || nextRowOutOfBounds ? 0. : result.w;\n `;\n }\n }\n }\n }\n this.userCode = `\n vec4 binaryOperation(vec4 a, vec4 b) {\n ${op}\n }\n\n void main() {\n vec4 a = getAAtOutCoords();\n vec4 b = getBAtOutCoords();\n\n vec4 result = binaryOperation(a, b);\n ${checkOutOfBoundsString}\n\n setOutput(result);\n }\n `;\n }\n}\n//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYmluYXJ5b3BfcGFja2VkX2dwdS5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uL3RmanMtYmFja2VuZC13ZWJnbC9zcmMvYmluYXJ5b3BfcGFja2VkX2dwdS50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQTs7Ozs7Ozs7Ozs7Ozs7O0dBZUc7QUFFSCxPQUFPLEVBQUMsWUFBWSxFQUFFLElBQUksRUFBQyxNQUFNLHVCQUF1QixDQUFDO0FBRXpELE9BQU8sRUFBZSxnQkFBZ0IsRUFBQyxNQUFNLGNBQWMsQ0FBQztBQUM1RCxPQUFPLEVBQUMsV0FBVyxFQUFDLE1BQU0sZ0JBQWdCLENBQUM7QUFDM0MsT0FBTyxFQUFDLGlCQUFpQixFQUFDLE1BQU0sbUJBQW1CLENBQUM7QUFFcEQsTUFBTSxDQUFDLE1BQU0sd0JBQXdCLEdBQUc7Ozs7O0NBS3ZDLENBQUM7QUFFRixNQUFNLENBQUMsTUFBTSxPQUFPLEdBQUc7OztDQUd0QixDQUFDO0FBRUYsTUFBTSxDQUFDLE1BQU0sU0FBUyxHQUFHOztDQUV4QixDQUFDO0FBRUYsTUFBTSxPQUFPLHFCQUFxQjtJQVNoQyxZQUNJLEVBQVUsRUFBRSxNQUFnQixFQUFFLE1BQWdCLEVBQzlDLGdCQUFnQixHQUFHLEtBQUs7UUFWNUIsa0JBQWEsR0FBRyxDQUFDLEdBQUcsRUFBRSxHQUFHLENBQUMsQ0FBQztRQUczQix5QkFBb0IsR0FBRyxJQUFJLENBQUM7UUFDNUIsaUJBQVksR0FBRyxJQUFJLENBQUM7UUFDcEIsaUJBQVksR0FBRyxJQUFJLENBQUM7UUFNbEIsSUFBSSxDQUFDLFdBQVcsR0FBRyxZQUFZLENBQUMsMEJBQTBCLENBQUMsTUFBTSxFQUFFLE1BQU0sQ0FBQyxDQUFDO1FBQzNFLE1BQU0sSUFBSSxHQUFHLElBQUksQ0FBQyxXQUFXLENBQUMsTUFBTSxDQUFDO1FBQ3JDLElBQUksQ0FBQyxtQkFBbUIsR0FBRyxnQkFBZ0IsQ0FBQyxJQUFJLENBQUMsQ0FBQztRQUNsRCxJQUFJLHNCQUFzQixHQUFHLEVBQUUsQ0FBQztRQUNoQyxJQUFJLGdCQUFnQixFQUFFO1lBQ3BCLElBQUksSUFBSSxLQUFLLENBQUMsSUFBSSxJQUFJLENBQUMsYUFBYSxDQUFDLElBQUksQ0FBQyxXQUFXLENBQUMsS0FBSyxDQUFDLEVBQUU7Z0JBQzVELHNCQUFzQixHQUFHOzs7O1NBSXhCLENBQUM7YUFDSDtpQkFBTTtnQkFDTCxNQUFNLEtBQUssR0FBRyxpQkFBaUIsQ0FBQyxJQUFJLENBQUMsQ0FBQztnQkFDdEMsc0JBQXNCLEdBQUc7WUFDckIsS0FBSztTQUNSLENBQUM7Z0JBQ0YsSUFBSSxJQUFJLEtBQUssQ0FBQyxFQUFFO29CQUNkLElBQUksSUFBSSxDQUFDLG1CQUFtQixFQUFFO3dCQUM1QixzQkFBc0IsSUFBSTs7OztXQUkzQixDQUFDO3FCQUNEO3lCQUFNO3dCQUNMLHNCQUFzQixJQUFJO3lDQUNHLElBQUksQ0FBQyxXQUFXLENBQUMsQ0FBQyxDQUFDOzs7V0FHakQsQ0FBQztxQkFDRDtpQkFDRjtxQkFBTTtvQkFDTCxNQUFNLFFBQVEsR0FBRyxXQUFXLENBQUMsUUFBUSxFQUFFLElBQUksQ0FBQyxDQUFDO29CQUM3QyxJQUFJLElBQUksQ0FBQyxtQkFBbUIsRUFBRTt3QkFDNUIsc0JBQXNCLElBQUk7O2lCQUVyQixRQUFRLENBQUMsSUFBSSxHQUFHLENBQUMsQ0FBQyxxQkFBcUIsSUFBSTs7aUJBRTNDLFFBQVEsQ0FBQyxJQUFJLEdBQUcsQ0FBQyxDQUFDLHFCQUFxQixJQUFJOzs7O1dBSWpELENBQUM7cUJBQ0Q7eUJBQU07d0JBQ0wsc0JBQXNCLElBQUk7O2lCQUVyQixRQUFRLENBQUMsSUFBSSxHQUFHLENBQUMsQ0FBQyxZQUFZLElBQUksQ0FBQyxXQUFXLENBQUMsSUFBSSxHQUFHLENBQUMsQ0FBQzs7aUJBRXhELFFBQVEsQ0FBQyxJQUFJLEdBQUcsQ0FBQyxDQUFDLFlBQVksSUFBSSxDQUFDLFdBQVcsQ0FBQyxJQUFJLEdBQUcsQ0FBQyxDQUFDOzs7O1dBSTlELENBQUM7cUJBQ0Q7aUJBQ0Y7YUFDRjtTQUNGO1FBRUQsSUFBSSxDQUFDLFFBQVEsR0FBRzs7VUFFVixFQUFFOzs7Ozs7OztVQVFGLHNCQUFzQjs7OztLQUkzQixDQUFDO0lBQ0osQ0FBQztDQUNGIiwic291cmNlc0NvbnRlbnQiOlsiLyoqXG4gKiBAbGljZW5zZVxuICogQ29weXJpZ2h0IDIwMTggR29vZ2xlIExMQy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC5cbiAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSBcIkxpY2Vuc2VcIik7XG4gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuXG4gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXRcbiAqXG4gKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjBcbiAqXG4gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlXG4gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiBcIkFTIElTXCIgQkFTSVMsXG4gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC5cbiAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmRcbiAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLlxuICogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbiAqL1xuXG5pbXBvcnQge2JhY2tlbmRfdXRpbCwgdXRpbH0gZnJvbSAnQHRlbnNvcmZsb3cvdGZqcy1jb3JlJztcblxuaW1wb3J0IHtHUEdQVVByb2dyYW0sIHVzZVNoYXBlVW5pZm9ybXN9IGZyb20gJy4vZ3BncHVfbWF0aCc7XG5pbXBvcnQge2dldENoYW5uZWxzfSBmcm9tICcuL3BhY2tpbmdfdXRpbCc7XG5pbXBvcnQge2dldENvb3Jkc0RhdGFUeXBlfSBmcm9tICcuL3NoYWRlcl9jb21waWxlcic7XG5cbmV4cG9ydCBjb25zdCBDSEVDS19OQU5fU05JUFBFVF9QQUNLRUQgPSBgXG4gIHJlc3VsdC5yID0gaXNOYU4uciA/IE5BTiA6IHJlc3VsdC5yO1xuICByZXN1bHQuZyA9IGlzTmFOLmcgPyBOQU4gOiByZXN1bHQuZztcbiAgcmVzdWx0LmIgPSBpc05hTi5iID8gTkFOIDogcmVzdWx0LmI7XG4gIHJlc3VsdC5hID0gaXNOYU4uYSA/IE5BTiA6IHJlc3VsdC5hO1xuYDtcblxuZXhwb3J0IGNvbnN0IEVMVV9ERVIgPSBgXG4gIHZlYzQgYkdURVplcm8gPSB2ZWM0KGdyZWF0ZXJUaGFuRXF1YWwoYiwgdmVjNCgwLikpKTtcbiAgcmV0dXJuIChiR1RFWmVybyAqIGEpICsgKCh2ZWM0KDEuMCkgLSBiR1RFWmVybykgKiAoYSAqIChiICsgdmVjNCgxLjApKSkpO1xuYDtcblxuZXhwb3J0IGNvbnN0IE5PVF9FUVVBTCA9IGBcbiAgcmV0dXJuIHZlYzQobm90RXF1YWwoYSwgYikpO1xuYDtcblxuZXhwb3J0IGNsYXNzIEJpbmFyeU9wUGFja2VkUHJvZ3JhbSBpbXBsZW1lbnRzIEdQR1BVUHJvZ3JhbSB7XG4gIHZhcmlhYmxlTmFtZXMgPSBbJ0EnLCAnQiddO1xuICBvdXRwdXRTaGFwZTogbnVtYmVyW107XG4gIHVzZXJDb2RlOiBzdHJpbmc7XG4gIHN1cHBvcnRzQnJvYWRjYXN0aW5nID0gdHJ1ZTtcbiAgcGFja2VkSW5wdXRzID0gdHJ1ZTtcbiAgcGFja2VkT3V0cHV0ID0gdHJ1ZTtcbiAgZW5hYmxlU2hhcGVVbmlmb3JtczogYm9vbGVhbjtcblxuICBjb25zdHJ1Y3RvcihcbiAgICAgIG9wOiBzdHJpbmcsIGFTaGFwZTogbnVtYmVyW10sIGJTaGFwZTogbnVtYmVyW10sXG4gICAgICBjaGVja091dE9mQm91bmRzID0gZmFsc2UpIHtcbiAgICB0aGlzLm91dHB1dFNoYXBlID0gYmFja2VuZF91dGlsLmFzc2VydEFuZEdldEJyb2FkY2FzdFNoYXBlKGFTaGFwZSwgYlNoYXBlKTtcbiAgICBjb25zdCByYW5rID0gdGhpcy5vdXRwdXRTaGFwZS5sZW5ndGg7XG4gICAgdGhpcy5lbmFibGVTaGFwZVVuaWZvcm1zID0gdXNlU2hhcGVVbmlmb3JtcyhyYW5rKTtcbiAgICBsZXQgY2hlY2tPdXRPZkJvdW5kc1N0cmluZyA9ICcnO1xuICAgIGlmIChjaGVja091dE9mQm91bmRzKSB7XG4gICAgICBpZiAocmFuayA9PT0gMCB8fCB1dGlsLnNpemVGcm9tU2hhcGUodGhpcy5vdXRwdXRTaGFwZSkgPT09IDEpIHtcbiAgICAgICAgY2hlY2tPdXRPZkJvdW5kc1N0cmluZyA9IGBcbiAgICAgICAgICByZXN1bHQueSA9IDAuO1xuICAgICAgICAgIHJlc3VsdC56ID0gMC47XG4gICAgICAgICAgcmVzdWx0LncgPSAwLjtcbiAgICAgICAgYDtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIGNvbnN0IGR0eXBlID0gZ2V0Q29vcmRzRGF0YVR5cGUocmFuayk7XG4gICAgICAgIGNoZWNrT3V0T2ZCb3VuZHNTdHJpbmcgPSBgXG4gICAgICAgICAgJHtkdHlwZX0gY29vcmRzID0gZ2V0T3V0cHV0Q29vcmRzKCk7XG4gICAgICAgIGA7XG4gICAgICAgIGlmIChyYW5rID09PSAxKSB7XG4gICAgICAgICAgaWYgKHRoaXMuZW5hYmxlU2hhcGVVbmlmb3Jtcykge1xuICAgICAgICAgICAgY2hlY2tPdXRPZkJvdW5kc1N0cmluZyArPSBgXG4gICAgICAgICAgICByZXN1bHQueSA9IChjb29yZHMgKyAxKSA+PSBvdXRTaGFwZSA/IDAuIDogcmVzdWx0Lnk7XG4gICAgICAgICAgICByZXN1bHQueiA9IDAuO1xuICAgICAgICAgICAgcmVzdWx0LncgPSAwLjtcbiAgICAgICAgICBgO1xuICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICBjaGVja091dE9mQm91bmRzU3RyaW5nICs9IGBcbiAgICAgICAgICAgIHJlc3VsdC55ID0gKGNvb3JkcyArIDEpID49ICR7dGhpcy5vdXRwdXRTaGFwZVswXX0gPyAwLiA6IHJlc3VsdC55O1xuICAgICAgICAgICAgcmVzdWx0LnogPSAwLjtcbiAgICAgICAgICAgIHJlc3VsdC53ID0gMC47XG4gICAgICAgICAgYDtcbiAgICAgICAgICB9XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgY29uc3QgY2hhbm5lbHMgPSBnZXRDaGFubmVscygnY29vcmRzJywgcmFuayk7XG4gICAgICAgICAgaWYgKHRoaXMuZW5hYmxlU2hhcGVVbmlmb3Jtcykge1xuICAgICAgICAgICAgY2hlY2tPdXRPZkJvdW5kc1N0cmluZyArPSBgXG4gICAgICAgICAgICBib29sIG5leHRSb3dPdXRPZkJvdW5kcyA9XG4gICAgICAgICAgICAgICgke2NoYW5uZWxzW3JhbmsgLSAyXX0gKyAxKSA+PSBvdXRTaGFwZVske3Jhbmt9IC0gMl07XG4gICAgICAgICAgICBib29sIG5leHRDb2xPdXRPZkJvdW5kcyA9XG4gICAgICAgICAgICAgICgke2NoYW5uZWxzW3JhbmsgLSAxXX0gKyAxKSA+PSBvdXRTaGFwZVske3Jhbmt9IC0gMV07XG4gICAgICAgICAgICByZXN1bHQueSA9IG5leHRDb2xPdXRPZkJvdW5kcyA/IDAuIDogcmVzdWx0Lnk7XG4gICAgICAgICAgICByZXN1bHQueiA9IG5leHRSb3dPdXRPZkJvdW5kcyA/IDAuIDogcmVzdWx0Lno7XG4gICAgICAgICAgICByZXN1bHQudyA9IG5leHRDb2xPdXRPZkJvdW5kcyB8fCBuZXh0Um93T3V0T2ZCb3VuZHMgPyAwLiA6IHJlc3VsdC53O1xuICAgICAgICAgIGA7XG4gICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIGNoZWNrT3V0T2ZCb3VuZHNTdHJpbmcgKz0gYFxuICAgICAgICAgICAgYm9vbCBuZXh0Um93T3V0T2ZCb3VuZHMgPVxuICAgICAgICAgICAgICAoJHtjaGFubmVsc1tyYW5rIC0gMl19ICsgMSkgPj0gJHt0aGlzLm91dHB1dFNoYXBlW3JhbmsgLSAyXX07XG4gICAgICAgICAgICBib29sIG5leHRDb2xPdXRPZkJvdW5kcyA9XG4gICAgICAgICAgICAgICgke2NoYW5uZWxzW3JhbmsgLSAxXX0gKyAxKSA+PSAke3RoaXMub3V0cHV0U2hhcGVbcmFuayAtIDFdfTtcbiAgICAgICAgICAgIHJlc3VsdC55ID0gbmV4dENvbE91dE9mQm91bmRzID8gMC4gOiByZXN1bHQueTtcbiAgICAgICAgICAgIHJlc3VsdC56ID0gbmV4dFJvd091dE9mQm91bmRzID8gMC4gOiByZXN1bHQuejtcbiAgICAgICAgICAgIHJlc3VsdC53ID0gbmV4dENvbE91dE9mQm91bmRzIHx8IG5leHRSb3dPdXRPZkJvdW5kcyA/IDAuIDogcmVzdWx0Lnc7XG4gICAgICAgICAgYDtcbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9XG5cbiAgICB0aGlzLnVzZXJDb2RlID0gYFxuICAgICAgdmVjNCBiaW5hcnlPcGVyYXRpb24odmVjNCBhLCB2ZWM0IGIpIHtcbiAgICAgICAgJHtvcH1cbiAgICAgIH1cblxuICAgICAgdm9pZCBtYWluKCkge1xuICAgICAgICB2ZWM0IGEgPSBnZXRBQXRPdXRDb29yZHMoKTtcbiAgICAgICAgdmVjNCBiID0gZ2V0QkF0T3V0Q29vcmRzKCk7XG5cbiAgICAgICAgdmVjNCByZXN1bHQgPSBiaW5hcnlPcGVyYXRpb24oYSwgYik7XG4gICAgICAgICR7Y2hlY2tPdXRPZkJvdW5kc1N0cmluZ31cblxuICAgICAgICBzZXRPdXRwdXQocmVzdWx0KTtcbiAgICAgIH1cbiAgICBgO1xuICB9XG59XG4iXX0=","/**\n * @license\n * Copyright 2020 Google LLC. All Rights Reserved.\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n * =============================================================================\n */\nimport { Identity } from '@tensorflow/tfjs-core';\nexport function identity(args) {\n const { inputs, backend } = args;\n const { x } = inputs;\n backend.incRef(x.dataId);\n return { dataId: x.dataId, shape: x.shape, dtype: x.dtype };\n}\nexport const identityConfig = {\n kernelName: Identity,\n backendName: 'webgl',\n kernelFunc: identity\n};\n//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiSWRlbnRpdHkuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi8uLi90ZmpzLWJhY2tlbmQtd2ViZ2wvc3JjL2tlcm5lbHMvSWRlbnRpdHkudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUE7Ozs7Ozs7Ozs7Ozs7OztHQWVHO0FBRUgsT0FBTyxFQUFDLFFBQVEsRUFBdUQsTUFBTSx1QkFBdUIsQ0FBQztBQUlyRyxNQUFNLFVBQVUsUUFBUSxDQUNwQixJQUF5RDtJQUMzRCxNQUFNLEVBQUMsTUFBTSxFQUFFLE9BQU8sRUFBQyxHQUFHLElBQUksQ0FBQztJQUMvQixNQUFNLEVBQUMsQ0FBQyxFQUFDLEdBQUcsTUFBTSxDQUFDO0lBRW5CLE9BQU8sQ0FBQyxNQUFNLENBQUMsQ0FBQyxDQUFDLE1BQU0sQ0FBQyxDQUFDO0lBRXpCLE9BQU8sRUFBQyxNQUFNLEVBQUUsQ0FBQyxDQUFDLE1BQU0sRUFBRSxLQUFLLEVBQUUsQ0FBQyxDQUFDLEtBQUssRUFBRSxLQUFLLEVBQUUsQ0FBQyxDQUFDLEtBQUssRUFBQyxDQUFDO0FBQzVELENBQUM7QUFFRCxNQUFNLENBQUMsTUFBTSxjQUFjLEdBQWlCO0lBQzFDLFVBQVUsRUFBRSxRQUFRO0lBQ3BCLFdBQVcsRUFBRSxPQUFPO0lBQ3BCLFVBQVUsRUFBRSxRQUE0QjtDQUN6QyxDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiLyoqXG4gKiBAbGljZW5zZVxuICogQ29weXJpZ2h0IDIwMjAgR29vZ2xlIExMQy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC5cbiAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSBcIkxpY2Vuc2VcIik7XG4gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuXG4gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXRcbiAqXG4gKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjBcbiAqXG4gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlXG4gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiBcIkFTIElTXCIgQkFTSVMsXG4gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC5cbiAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmRcbiAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLlxuICogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbiAqL1xuXG5pbXBvcnQge0lkZW50aXR5LCBJZGVudGl0eUlucHV0cywgS2VybmVsQ29uZmlnLCBLZXJuZWxGdW5jLCBUZW5zb3JJbmZvfSBmcm9tICdAdGVuc29yZmxvdy90ZmpzLWNvcmUnO1xuXG5pbXBvcnQge01hdGhCYWNrZW5kV2ViR0x9IGZyb20gJy4uL2JhY2tlbmRfd2ViZ2wnO1xuXG5leHBvcnQgZnVuY3Rpb24gaWRlbnRpdHkoXG4gICAgYXJnczoge2lucHV0czogSWRlbnRpdHlJbnB1dHMsIGJhY2tlbmQ6IE1hdGhCYWNrZW5kV2ViR0x9KTogVGVuc29ySW5mbyB7XG4gIGNvbnN0IHtpbnB1dHMsIGJhY2tlbmR9ID0gYXJncztcbiAgY29uc3Qge3h9ID0gaW5wdXRzO1xuXG4gIGJhY2tlbmQuaW5jUmVmKHguZGF0YUlkKTtcblxuICByZXR1cm4ge2RhdGFJZDogeC5kYXRhSWQsIHNoYXBlOiB4LnNoYXBlLCBkdHlwZTogeC5kdHlwZX07XG59XG5cbmV4cG9ydCBjb25zdCBpZGVudGl0eUNvbmZpZzogS2VybmVsQ29uZmlnID0ge1xuICBrZXJuZWxOYW1lOiBJZGVudGl0eSxcbiAgYmFja2VuZE5hbWU6ICd3ZWJnbCcsXG4gIGtlcm5lbEZ1bmM6IGlkZW50aXR5IGFzIHt9IGFzIEtlcm5lbEZ1bmNcbn07XG4iXX0=","/**\n * @license\n * Copyright 2020 Google LLC. All Rights Reserved.\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n * =============================================================================\n */\nimport { Complex } from '@tensorflow/tfjs-core';\nimport { identity } from './Identity';\n/**\n * In WebGL data is stored in GPU textures which can't be efficiently copied, so\n * complex tensors share data with their real and imaginary components. Complex\n * tensors' reference to the components is tracked by refCount on the individual\n * component. The refCounts are increased by the identity call.\n *\n * When a complex tensor is disposed, it will reduce the refCount on the\n * components by calling disposeData on each.\n */\nexport function complex(args) {\n const { inputs, backend } = args;\n const { real, imag } = inputs;\n const complexInfo = backend.makeTensorInfo(real.shape, 'complex64');\n const complex = backend.texData.get(complexInfo.dataId);\n const realTensorInfo = identity({ inputs: { x: real }, backend });\n const imagTensorInfo = identity({ inputs: { x: imag }, backend });\n complex.complexTensorInfos = { real: realTensorInfo, imag: imagTensorInfo };\n return complexInfo;\n}\nexport const complexConfig = {\n kernelName: Complex,\n backendName: 'webgl',\n kernelFunc: complex\n};\n//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiQ29tcGxleC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uLy4uL3RmanMtYmFja2VuZC13ZWJnbC9zcmMva2VybmVscy9Db21wbGV4LnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBOzs7Ozs7Ozs7Ozs7Ozs7R0FlRztBQUVILE9BQU8sRUFBQyxPQUFPLEVBQXNELE1BQU0sdUJBQXVCLENBQUM7QUFHbkcsT0FBTyxFQUFDLFFBQVEsRUFBQyxNQUFNLFlBQVksQ0FBQztBQUVwQzs7Ozs7Ozs7R0FRRztBQUNILE1BQU0sVUFBVSxPQUFPLENBQ25CLElBQXdEO0lBQzFELE1BQU0sRUFBQyxNQUFNLEVBQUUsT0FBTyxFQUFDLEdBQUcsSUFBSSxDQUFDO0lBQy9CLE1BQU0sRUFBQyxJQUFJLEVBQUUsSUFBSSxFQUFDLEdBQUcsTUFBTSxDQUFDO0lBRTVCLE1BQU0sV0FBVyxHQUFHLE9BQU8sQ0FBQyxjQUFjLENBQUMsSUFBSSxDQUFDLEtBQUssRUFBRSxXQUFXLENBQUMsQ0FBQztJQUNwRSxNQUFNLE9BQU8sR0FBRyxPQUFPLENBQUMsT0FBTyxDQUFDLEdBQUcsQ0FBQyxXQUFXLENBQUMsTUFBTSxDQUFDLENBQUM7SUFFeEQsTUFBTSxjQUFjLEdBQUcsUUFBUSxDQUFDLEVBQUMsTUFBTSxFQUFFLEVBQUMsQ0FBQyxFQUFFLElBQUksRUFBQyxFQUFFLE9BQU8sRUFBQyxDQUFDLENBQUM7SUFFOUQsTUFBTSxjQUFjLEdBQUcsUUFBUSxDQUFDLEVBQUMsTUFBTSxFQUFFLEVBQUMsQ0FBQyxFQUFFLElBQUksRUFBQyxFQUFFLE9BQU8sRUFBQyxDQUFDLENBQUM7SUFFOUQsT0FBTyxDQUFDLGtCQUFrQixHQUFHLEVBQUMsSUFBSSxFQUFFLGNBQWMsRUFBRSxJQUFJLEVBQUUsY0FBYyxFQUFDLENBQUM7SUFFMUUsT0FBTyxXQUFXLENBQUM7QUFDckIsQ0FBQztBQUVELE1BQU0sQ0FBQyxNQUFNLGFBQWEsR0FBaUI7SUFDekMsVUFBVSxFQUFFLE9BQU87SUFDbkIsV0FBVyxFQUFFLE9BQU87SUFDcEIsVUFBVSxFQUFFLE9BQTJCO0NBQ3hDLENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyIvKipcbiAqIEBsaWNlbnNlXG4gKiBDb3B5cmlnaHQgMjAyMCBHb29nbGUgTExDLiBBbGwgUmlnaHRzIFJlc2VydmVkLlxuICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlIFwiTGljZW5zZVwiKTtcbiAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS5cbiAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdFxuICpcbiAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMFxuICpcbiAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmVcbiAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuIFwiQVMgSVNcIiBCQVNJUyxcbiAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLlxuICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZFxuICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuXG4gKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuICovXG5cbmltcG9ydCB7Q29tcGxleCwgQ29tcGxleElucHV0cywgS2VybmVsQ29uZmlnLCBLZXJuZWxGdW5jLCBUZW5zb3JJbmZvfSBmcm9tICdAdGVuc29yZmxvdy90ZmpzLWNvcmUnO1xuXG5pbXBvcnQge01hdGhCYWNrZW5kV2ViR0x9IGZyb20gJy4uL2JhY2tlbmRfd2ViZ2wnO1xuaW1wb3J0IHtpZGVudGl0eX0gZnJvbSAnLi9JZGVudGl0eSc7XG5cbi8qKlxuICogSW4gV2ViR0wgZGF0YSBpcyBzdG9yZWQgaW4gR1BVIHRleHR1cmVzIHdoaWNoIGNhbid0IGJlIGVmZmljaWVudGx5IGNvcGllZCwgc29cbiAqIGNvbXBsZXggdGVuc29ycyBzaGFyZSBkYXRhIHdpdGggdGhlaXIgcmVhbCBhbmQgaW1hZ2luYXJ5IGNvbXBvbmVudHMuIENvbXBsZXhcbiAqIHRlbnNvcnMnIHJlZmVyZW5jZSB0byB0aGUgY29tcG9uZW50cyBpcyB0cmFja2VkIGJ5IHJlZkNvdW50IG9uIHRoZSBpbmRpdmlkdWFsXG4gKiBjb21wb25lbnQuIFRoZSByZWZDb3VudHMgYXJlIGluY3JlYXNlZCBieSB0aGUgaWRlbnRpdHkgY2FsbC5cbiAqXG4gKiBXaGVuIGEgY29tcGxleCB0ZW5zb3IgaXMgZGlzcG9zZWQsIGl0IHdpbGwgcmVkdWNlIHRoZSByZWZDb3VudCBvbiB0aGVcbiAqIGNvbXBvbmVudHMgYnkgY2FsbGluZyBkaXNwb3NlRGF0YSBvbiBlYWNoLlxuICovXG5leHBvcnQgZnVuY3Rpb24gY29tcGxleChcbiAgICBhcmdzOiB7aW5wdXRzOiBDb21wbGV4SW5wdXRzLCBiYWNrZW5kOiBNYXRoQmFja2VuZFdlYkdMfSk6IFRlbnNvckluZm8ge1xuICBjb25zdCB7aW5wdXRzLCBiYWNrZW5kfSA9IGFyZ3M7XG4gIGNvbnN0IHtyZWFsLCBpbWFnfSA9IGlucHV0cztcblxuICBjb25zdCBjb21wbGV4SW5mbyA9IGJhY2tlbmQubWFrZVRlbnNvckluZm8ocmVhbC5zaGFwZSwgJ2NvbXBsZXg2NCcpO1xuICBjb25zdCBjb21wbGV4ID0gYmFja2VuZC50ZXhEYXRhLmdldChjb21wbGV4SW5mby5kYXRhSWQpO1xuXG4gIGNvbnN0IHJlYWxUZW5zb3JJbmZvID0gaWRlbnRpdHkoe2lucHV0czoge3g6IHJlYWx9LCBiYWNrZW5kfSk7XG5cbiAgY29uc3QgaW1hZ1RlbnNvckluZm8gPSBpZGVudGl0eSh7aW5wdXRzOiB7eDogaW1hZ30sIGJhY2tlbmR9KTtcblxuICBjb21wbGV4LmNvbXBsZXhUZW5zb3JJbmZvcyA9IHtyZWFsOiByZWFsVGVuc29ySW5mbywgaW1hZzogaW1hZ1RlbnNvckluZm99O1xuXG4gIHJldHVybiBjb21wbGV4SW5mbztcbn1cblxuZXhwb3J0IGNvbnN0IGNvbXBsZXhDb25maWc6IEtlcm5lbENvbmZpZyA9IHtcbiAga2VybmVsTmFtZTogQ29tcGxleCxcbiAgYmFja2VuZE5hbWU6ICd3ZWJnbCcsXG4gIGtlcm5lbEZ1bmM6IGNvbXBsZXggYXMge30gYXMgS2VybmVsRnVuY1xufTtcbiJdfQ==","/**\n * @license\n * Copyright 2020 Google LLC. All Rights Reserved.\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n * =============================================================================\n */\nimport { env, LeakyRelu, util } from '@tensorflow/tfjs-core';\nimport { BinaryOpProgram } from '../binaryop_gpu';\nimport { BinaryOpPackedProgram } from '../binaryop_packed_gpu';\nexport const LEAKYRELU = `return (a < 0.) ? b * a : a;`;\nexport const LEAKYRELU_PACKED = `\n vec4 aLessThanZero = vec4(lessThan(a, vec4(0.)));\n return (aLessThanZero * (b * a)) + ((vec4(1.0) - aLessThanZero) * a);\n`;\nexport function leakyRelu(args) {\n const { inputs, backend, attrs } = args;\n const { x } = inputs;\n const { alpha } = attrs;\n const $alpha = backend.makeTensorInfo([], 'float32', util.createScalarValue(alpha, 'float32'));\n const program = env().getBool('WEBGL_PACK_BINARY_OPERATIONS') ?\n new BinaryOpPackedProgram(LEAKYRELU_PACKED, x.shape, $alpha.shape) :\n new BinaryOpProgram(LEAKYRELU, x.shape, $alpha.shape);\n const result = backend.runWebGLProgram(program, [x, $alpha], 'float32');\n backend.disposeIntermediateTensorInfo($alpha);\n return result;\n}\nexport const leakyReluConfig = {\n kernelName: LeakyRelu,\n backendName: 'webgl',\n kernelFunc: leakyRelu\n};\n//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiTGVha3lSZWx1LmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vLi4vdGZqcy1iYWNrZW5kLXdlYmdsL3NyYy9rZXJuZWxzL0xlYWt5UmVsdS50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQTs7Ozs7Ozs7Ozs7Ozs7O0dBZUc7QUFFSCxPQUFPLEVBQUMsR0FBRyxFQUE0QixTQUFTLEVBQStDLElBQUksRUFBQyxNQUFNLHVCQUF1QixDQUFDO0FBRWxJLE9BQU8sRUFBQyxlQUFlLEVBQUMsTUFBTSxpQkFBaUIsQ0FBQztBQUNoRCxPQUFPLEVBQUMscUJBQXFCLEVBQUMsTUFBTSx3QkFBd0IsQ0FBQztBQUU3RCxNQUFNLENBQUMsTUFBTSxTQUFTLEdBQUcsOEJBQThCLENBQUM7QUFDeEQsTUFBTSxDQUFDLE1BQU0sZ0JBQWdCLEdBQUc7OztDQUcvQixDQUFDO0FBRUYsTUFBTSxVQUFVLFNBQVMsQ0FBQyxJQUl6QjtJQUNDLE1BQU0sRUFBQyxNQUFNLEVBQUUsT0FBTyxFQUFFLEtBQUssRUFBQyxHQUFHLElBQUksQ0FBQztJQUN0QyxNQUFNLEVBQUMsQ0FBQyxFQUFDLEdBQUcsTUFBTSxDQUFDO0lBQ25CLE1BQU0sRUFBQyxLQUFLLEVBQUMsR0FBRyxLQUFLLENBQUM7SUFFdEIsTUFBTSxNQUFNLEdBQUcsT0FBTyxDQUFDLGNBQWMsQ0FDakMsRUFBRSxFQUFFLFNBQVMsRUFDYixJQUFJLENBQUMsaUJBQWlCLENBQUMsS0FBd0IsRUFBRSxTQUFTLENBQUMsQ0FBQyxDQUFDO0lBRWpFLE1BQU0sT0FBTyxHQUFHLEdBQUcsRUFBRSxDQUFDLE9BQU8sQ0FBQyw4QkFBOEIsQ0FBQyxDQUFDLENBQUM7UUFDM0QsSUFBSSxxQkFBcUIsQ0FBQyxnQkFBZ0IsRUFBRSxDQUFDLENBQUMsS0FBSyxFQUFFLE1BQU0sQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDO1FBQ3BFLElBQUksZUFBZSxDQUFDLFNBQVMsRUFBRSxDQUFDLENBQUMsS0FBSyxFQUFFLE1BQU0sQ0FBQyxLQUFLLENBQUMsQ0FBQztJQUMxRCxNQUFNLE1BQU0sR0FBRyxPQUFPLENBQUMsZUFBZSxDQUFDLE9BQU8sRUFBRSxDQUFDLENBQUMsRUFBRSxNQUFNLENBQUMsRUFBRSxTQUFTLENBQUMsQ0FBQztJQUV4RSxPQUFPLENBQUMsNkJBQTZCLENBQUMsTUFBTSxDQUFDLENBQUM7SUFFOUMsT0FBTyxNQUFNLENBQUM7QUFDaEIsQ0FBQztBQUVELE1BQU0sQ0FBQyxNQUFNLGVBQWUsR0FBaUI7SUFDM0MsVUFBVSxFQUFFLFNBQVM7SUFDckIsV0FBVyxFQUFFLE9BQU87SUFDcEIsVUFBVSxFQUFFLFNBQTZCO0NBQzFDLENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyIvKipcbiAqIEBsaWNlbnNlXG4gKiBDb3B5cmlnaHQgMjAyMCBHb29nbGUgTExDLiBBbGwgUmlnaHRzIFJlc2VydmVkLlxuICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlIFwiTGljZW5zZVwiKTtcbiAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS5cbiAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdFxuICpcbiAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMFxuICpcbiAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmVcbiAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuIFwiQVMgSVNcIiBCQVNJUyxcbiAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLlxuICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZFxuICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuXG4gKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuICovXG5cbmltcG9ydCB7ZW52LCBLZXJuZWxDb25maWcsIEtlcm5lbEZ1bmMsIExlYWt5UmVsdSwgTGVha3lSZWx1QXR0cnMsIExlYWt5UmVsdUlucHV0cywgVGVuc29ySW5mbywgdXRpbH0gZnJvbSAnQHRlbnNvcmZsb3cvdGZqcy1jb3JlJztcbmltcG9ydCB7TWF0aEJhY2tlbmRXZWJHTH0gZnJvbSAnLi4vYmFja2VuZF93ZWJnbCc7XG5pbXBvcnQge0JpbmFyeU9wUHJvZ3JhbX0gZnJvbSAnLi4vYmluYXJ5b3BfZ3B1JztcbmltcG9ydCB7QmluYXJ5T3BQYWNrZWRQcm9ncmFtfSBmcm9tICcuLi9iaW5hcnlvcF9wYWNrZWRfZ3B1JztcblxuZXhwb3J0IGNvbnN0IExFQUtZUkVMVSA9IGByZXR1cm4gKGEgPCAwLikgPyBiICogYSA6IGE7YDtcbmV4cG9ydCBjb25zdCBMRUFLWVJFTFVfUEFDS0VEID0gYFxuICB2ZWM0IGFMZXNzVGhhblplcm8gPSB2ZWM0KGxlc3NUaGFuKGEsIHZlYzQoMC4pKSk7XG4gIHJldHVybiAoYUxlc3NUaGFuWmVybyAqIChiICogYSkpICsgKCh2ZWM0KDEuMCkgLSBhTGVzc1RoYW5aZXJvKSAqIGEpO1xuYDtcblxuZXhwb3J0IGZ1bmN0aW9uIGxlYWt5UmVsdShhcmdzOiB7XG4gIGlucHV0czogTGVha3lSZWx1SW5wdXRzLFxuICBiYWNrZW5kOiBNYXRoQmFja2VuZFdlYkdMLFxuICBhdHRyczogTGVha3lSZWx1QXR0cnNcbn0pOiBUZW5zb3JJbmZvIHtcbiAgY29uc3Qge2lucHV0cywgYmFja2VuZCwgYXR0cnN9ID0gYXJncztcbiAgY29uc3Qge3h9ID0gaW5wdXRzO1xuICBjb25zdCB7YWxwaGF9ID0gYXR0cnM7XG5cbiAgY29uc3QgJGFscGhhID0gYmFja2VuZC5tYWtlVGVuc29ySW5mbyhcbiAgICAgIFtdLCAnZmxvYXQzMicsXG4gICAgICB1dGlsLmNyZWF0ZVNjYWxhclZhbHVlKGFscGhhIGFzIHt9IGFzICdmbG9hdDMyJywgJ2Zsb2F0MzInKSk7XG5cbiAgY29uc3QgcHJvZ3JhbSA9IGVudigpLmdldEJvb2woJ1dFQkdMX1BBQ0tfQklOQVJZX09QRVJBVElPTlMnKSA/XG4gICAgICBuZXcgQmluYXJ5T3BQYWNrZWRQcm9ncmFtKExFQUtZUkVMVV9QQUNLRUQsIHguc2hhcGUsICRhbHBoYS5zaGFwZSkgOlxuICAgICAgbmV3IEJpbmFyeU9wUHJvZ3JhbShMRUFLWVJFTFUsIHguc2hhcGUsICRhbHBoYS5zaGFwZSk7XG4gIGNvbnN0IHJlc3VsdCA9IGJhY2tlbmQucnVuV2ViR0xQcm9ncmFtKHByb2dyYW0sIFt4LCAkYWxwaGFdLCAnZmxvYXQzMicpO1xuXG4gIGJhY2tlbmQuZGlzcG9zZUludGVybWVkaWF0ZVRlbnNvckluZm8oJGFscGhhKTtcblxuICByZXR1cm4gcmVzdWx0O1xufVxuXG5leHBvcnQgY29uc3QgbGVha3lSZWx1Q29uZmlnOiBLZXJuZWxDb25maWcgPSB7XG4gIGtlcm5lbE5hbWU6IExlYWt5UmVsdSxcbiAgYmFja2VuZE5hbWU6ICd3ZWJnbCcsXG4gIGtlcm5lbEZ1bmM6IGxlYWt5UmVsdSBhcyB7fSBhcyBLZXJuZWxGdW5jXG59O1xuIl19","/**\n * @license\n * Copyright 2020 Google LLC. All Rights Reserved.\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n * =============================================================================\n */\nimport { env, Prelu } from '@tensorflow/tfjs-core';\nimport { BinaryOpProgram } from '../binaryop_gpu';\nimport { BinaryOpPackedProgram } from '../binaryop_packed_gpu';\nexport const PRELU = `return (a < 0.) ? b * a : a;`;\nexport const PRELU_PACKED = `\n vec4 aLessThanZero = vec4(lessThan(a, vec4(0.)));\n return (aLessThanZero * (b * a)) + ((vec4(1.0) - aLessThanZero) * a);\n`;\nexport function prelu(args) {\n const { inputs, backend } = args;\n const { x, alpha } = inputs;\n const program = env().getBool('WEBGL_PACK_BINARY_OPERATIONS') ?\n new BinaryOpPackedProgram(PRELU_PACKED, x.shape, alpha.shape) :\n new BinaryOpProgram(PRELU, x.shape, alpha.shape);\n return backend.runWebGLProgram(program, [x, alpha], 'float32');\n}\nexport const preluConfig = {\n kernelName: Prelu,\n backendName: 'webgl',\n kernelFunc: prelu\n};\n//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiUHJlbHUuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi8uLi90ZmpzLWJhY2tlbmQtd2ViZ2wvc3JjL2tlcm5lbHMvUHJlbHUudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUE7Ozs7Ozs7Ozs7Ozs7OztHQWVHO0FBRUgsT0FBTyxFQUFDLEdBQUcsRUFBNEIsS0FBSyxFQUEwQixNQUFNLHVCQUF1QixDQUFDO0FBR3BHLE9BQU8sRUFBQyxlQUFlLEVBQUMsTUFBTSxpQkFBaUIsQ0FBQztBQUNoRCxPQUFPLEVBQUMscUJBQXFCLEVBQUMsTUFBTSx3QkFBd0IsQ0FBQztBQUU3RCxNQUFNLENBQUMsTUFBTSxLQUFLLEdBQUcsOEJBQThCLENBQUM7QUFDcEQsTUFBTSxDQUFDLE1BQU0sWUFBWSxHQUFHOzs7Q0FHM0IsQ0FBQztBQUVGLE1BQU0sVUFBVSxLQUFLLENBQUMsSUFBc0Q7SUFFMUUsTUFBTSxFQUFDLE1BQU0sRUFBRSxPQUFPLEVBQUMsR0FBRyxJQUFJLENBQUM7SUFDL0IsTUFBTSxFQUFDLENBQUMsRUFBRSxLQUFLLEVBQUMsR0FBRyxNQUFNLENBQUM7SUFFMUIsTUFBTSxPQUFPLEdBQUcsR0FBRyxFQUFFLENBQUMsT0FBTyxDQUFDLDhCQUE4QixDQUFDLENBQUMsQ0FBQztRQUMzRCxJQUFJLHFCQUFxQixDQUFDLFlBQVksRUFBRSxDQUFDLENBQUMsS0FBSyxFQUFFLEtBQUssQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDO1FBQy9ELElBQUksZUFBZSxDQUFDLEtBQUssRUFBRSxDQUFDLENBQUMsS0FBSyxFQUFFLEtBQUssQ0FBQyxLQUFLLENBQUMsQ0FBQztJQUNyRCxPQUFPLE9BQU8sQ0FBQyxlQUFlLENBQUMsT0FBTyxFQUFFLENBQUMsQ0FBQyxFQUFFLEtBQUssQ0FBQyxFQUFFLFNBQVMsQ0FBQyxDQUFDO0FBQ2pFLENBQUM7QUFFRCxNQUFNLENBQUMsTUFBTSxXQUFXLEdBQWlCO0lBQ3ZDLFVBQVUsRUFBRSxLQUFLO0lBQ2pCLFdBQVcsRUFBRSxPQUFPO0lBQ3BCLFVBQVUsRUFBRSxLQUF5QjtDQUN0QyxDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiLyoqXG4gKiBAbGljZW5zZVxuICogQ29weXJpZ2h0IDIwMjAgR29vZ2xlIExMQy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC5cbiAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSBcIkxpY2Vuc2VcIik7XG4gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuXG4gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXRcbiAqXG4gKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjBcbiAqXG4gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlXG4gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiBcIkFTIElTXCIgQkFTSVMsXG4gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC5cbiAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmRcbiAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLlxuICogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbiAqL1xuXG5pbXBvcnQge2VudiwgS2VybmVsQ29uZmlnLCBLZXJuZWxGdW5jLCBQcmVsdSwgUHJlbHVJbnB1dHMsIFRlbnNvckluZm99IGZyb20gJ0B0ZW5zb3JmbG93L3RmanMtY29yZSc7XG5cbmltcG9ydCB7TWF0aEJhY2tlbmRXZWJHTH0gZnJvbSAnLi4vYmFja2VuZF93ZWJnbCc7XG5pbXBvcnQge0JpbmFyeU9wUHJvZ3JhbX0gZnJvbSAnLi4vYmluYXJ5b3BfZ3B1JztcbmltcG9ydCB7QmluYXJ5T3BQYWNrZWRQcm9ncmFtfSBmcm9tICcuLi9iaW5hcnlvcF9wYWNrZWRfZ3B1JztcblxuZXhwb3J0IGNvbnN0IFBSRUxVID0gYHJldHVybiAoYSA8IDAuKSA/IGIgKiBhIDogYTtgO1xuZXhwb3J0IGNvbnN0IFBSRUxVX1BBQ0tFRCA9IGBcbiAgdmVjNCBhTGVzc1RoYW5aZXJvID0gdmVjNChsZXNzVGhhbihhLCB2ZWM0KDAuKSkpO1xuICByZXR1cm4gKGFMZXNzVGhhblplcm8gKiAoYiAqIGEpKSArICgodmVjNCgxLjApIC0gYUxlc3NUaGFuWmVybykgKiBhKTtcbmA7XG5cbmV4cG9ydCBmdW5jdGlvbiBwcmVsdShhcmdzOiB7aW5wdXRzOiBQcmVsdUlucHV0cywgYmFja2VuZDogTWF0aEJhY2tlbmRXZWJHTH0pOlxuICAgIFRlbnNvckluZm8ge1xuICBjb25zdCB7aW5wdXRzLCBiYWNrZW5kfSA9IGFyZ3M7XG4gIGNvbnN0IHt4LCBhbHBoYX0gPSBpbnB1dHM7XG5cbiAgY29uc3QgcHJvZ3JhbSA9IGVudigpLmdldEJvb2woJ1dFQkdMX1BBQ0tfQklOQVJZX09QRVJBVElPTlMnKSA/XG4gICAgICBuZXcgQmluYXJ5T3BQYWNrZWRQcm9ncmFtKFBSRUxVX1BBQ0tFRCwgeC5zaGFwZSwgYWxwaGEuc2hhcGUpIDpcbiAgICAgIG5ldyBCaW5hcnlPcFByb2dyYW0oUFJFTFUsIHguc2hhcGUsIGFscGhhLnNoYXBlKTtcbiAgcmV0dXJuIGJhY2tlbmQucnVuV2ViR0xQcm9ncmFtKHByb2dyYW0sIFt4LCBhbHBoYV0sICdmbG9hdDMyJyk7XG59XG5cbmV4cG9ydCBjb25zdCBwcmVsdUNvbmZpZzogS2VybmVsQ29uZmlnID0ge1xuICBrZXJuZWxOYW1lOiBQcmVsdSxcbiAgYmFja2VuZE5hbWU6ICd3ZWJnbCcsXG4gIGtlcm5lbEZ1bmM6IHByZWx1IGFzIHt9IGFzIEtlcm5lbEZ1bmNcbn07XG4iXX0=","/**\n * @license\n * Copyright 2020 Google LLC. All Rights Reserved.\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n * =============================================================================\n */\nimport { backend_util, env, upcastType } from '@tensorflow/tfjs-core';\nimport { BinaryOpProgram } from '../binaryop_gpu';\nimport { BinaryOpPackedProgram } from '../binaryop_packed_gpu';\nimport { complex } from '../kernels/Complex';\nimport { LEAKYRELU, LEAKYRELU_PACKED } from '../kernels/LeakyRelu';\nimport { PRELU, PRELU_PACKED } from '../kernels/Prelu';\nimport * as unary_op from '../unaryop_gpu';\nimport { UnaryOpProgram } from '../unaryop_gpu';\nimport * as unary_packed_op from '../unaryop_packed_gpu';\nimport { UnaryOpPackedProgram } from '../unaryop_packed_gpu';\nexport const CHECK_NAN_SNIPPET_UNARY = `if (isnan(x)) return x;`;\n/**\n * Template that creates a `KernelFunc` for unary ops.\n * @param opSnippet Op snippet to create `UnaryOpProgram`.\n * @param packedOpSnippet Op snippet to create `UnaryOpPackedProgram`.\n * @param dtype Optional. If set, the result has this dtype. Otherwise, the\n * result has the same dtype as the first input. This is mainly used in\n * comparison kernels, such as Equal, Less, Greater, etc.\n */\nexport function unaryKernelFunc({ opSnippet, packedOpSnippet, cpuKernelImpl, dtype }) {\n return ({ inputs, backend }) => {\n const { x } = inputs;\n const webglBackend = backend;\n const $dtype = dtype || x.dtype;\n if (webglBackend.shouldExecuteOnCPU([x]) && cpuKernelImpl != null) {\n const xData = webglBackend.texData.get(x.dataId);\n const outValues = cpuKernelImpl(xData.values, $dtype);\n return webglBackend.makeTensorInfo(x.shape, $dtype, outValues);\n }\n const shouldUsePackedProgram = env().getBool('WEBGL_PACK_UNARY_OPERATIONS') && packedOpSnippet != null;\n let program;\n if (shouldUsePackedProgram) {\n program = new UnaryOpPackedProgram(x.shape, packedOpSnippet);\n }\n else {\n program = new UnaryOpProgram(x.shape, opSnippet);\n }\n return webglBackend.runWebGLProgram(program, [x], $dtype);\n };\n}\n/**\n * Template that creates a `KernelFunc` for binary ops.\n * @param opSnippet Op snippet to create `BinaryOpProgram`.\n * @param packedOpSnippet Op snippet to create `BinaryOpPackedProgram`.\n * @param checkOutOfBoundsForPackedProgram Whether to set checkOutOfBounds=true\n * when creating BinaryOpPackedProgram.\n * @param dtype Optional. If set, the result has this dtype. Otherwise, the\n * result has the same dtype as the first input. This is mainly used in\n * comparison kernels, such as Equal, Less, Greater, etc.\n */\nexport function binaryKernelFunc({ opSnippet, packedOpSnippet, checkOutOfBounds = false, supportsComplex = false, cpuKernelImpl, dtype }) {\n return ({ inputs, backend }) => {\n const { a, b } = inputs;\n const webglBackend = backend;\n if (supportsComplex && a.dtype === 'complex64') {\n const aData = webglBackend.texData.get(a.dataId);\n const bData = webglBackend.texData.get(b.dataId);\n const [real, imag] = [\n [aData.complexTensorInfos.real, bData.complexTensorInfos.real],\n [aData.complexTensorInfos.imag, bData.complexTensorInfos.imag]\n ].map(complexParts => {\n const [aPart, bPart] = complexParts;\n const aHandle = {\n dataId: aPart.dataId,\n dtype: aPart.dtype,\n shape: a.shape\n };\n const bHandle = {\n dataId: bPart.dataId,\n dtype: bPart.dtype,\n shape: b.shape\n };\n const program = new BinaryOpProgram(opSnippet, a.shape, b.shape);\n return webglBackend.runWebGLProgram(program, [aHandle, bHandle], upcastType(aPart.dtype, bPart.dtype));\n });\n const complexOutput = complex({ inputs: { real, imag }, backend: webglBackend });\n webglBackend.disposeIntermediateTensorInfo(real);\n webglBackend.disposeIntermediateTensorInfo(imag);\n // TODO(annxingyuan): Implement CPU forwarding for complex inputs.\n return complexOutput;\n }\n const $dtype = dtype || upcastType(a.dtype, b.dtype);\n if ((a.dtype === 'string' || b.dtype === 'string' ||\n webglBackend.shouldExecuteOnCPU([a, b])) &&\n cpuKernelImpl != null) {\n const aVals = webglBackend.texData.get(a.dataId).values;\n const bVals = webglBackend.texData.get(b.dataId).values;\n const decodedAVals = a.dtype === 'string' ?\n // tslint:disable-next-line: no-any\n backend_util.fromUint8ToStringArray(aVals) :\n aVals;\n const decodedBVals = a.dtype === 'string' ?\n // tslint:disable-next-line: no-any\n backend_util.fromUint8ToStringArray(bVals) :\n bVals;\n const [outValues, outShape] = cpuKernelImpl(a.shape, b.shape, decodedAVals, decodedBVals, $dtype);\n const out = webglBackend.makeTensorInfo(outShape, $dtype);\n const outData = webglBackend.texData.get(out.dataId);\n outData.values = outValues;\n return out;\n }\n const shouldUsePackedProgram = env().getBool('WEBGL_PACK_BINARY_OPERATIONS') &&\n packedOpSnippet != null;\n let program;\n if (shouldUsePackedProgram) {\n program = new BinaryOpPackedProgram(packedOpSnippet, a.shape, b.shape, checkOutOfBounds);\n }\n else {\n program = new BinaryOpProgram(opSnippet, a.shape, b.shape);\n }\n return webglBackend.runWebGLProgram(program, [a, b], $dtype);\n };\n}\nexport function mapActivationToShaderProgram(activation, packed = false) {\n if (activation === 'linear') {\n if (packed) {\n return unary_packed_op.LINEAR;\n }\n return unary_op.LINEAR;\n }\n else if (activation === 'relu') {\n if (packed) {\n return unary_packed_op.RELU;\n }\n return unary_op.RELU;\n }\n else if (activation === 'elu') {\n if (packed) {\n return unary_packed_op.ELU;\n }\n return unary_op.ELU;\n }\n else if (activation === 'relu6') {\n if (packed) {\n return unary_packed_op.RELU6;\n }\n return unary_op.RELU6;\n }\n else if (activation === 'prelu') {\n if (packed) {\n return PRELU_PACKED;\n }\n return PRELU;\n }\n else if (activation === 'leakyrelu') {\n if (packed) {\n return LEAKYRELU_PACKED;\n }\n return LEAKYRELU;\n }\n else if (activation === 'sigmoid') {\n if (packed) {\n return unary_packed_op.SIGMOID;\n }\n return unary_op.SIGMOID;\n }\n throw new Error(`Activation ${activation} has not been implemented for the WebGL backend.`);\n}\n//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoia2VybmVsX2Z1bmNzX3V0aWxzLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vLi4vdGZqcy1iYWNrZW5kLXdlYmdsL3NyYy9rZXJuZWxfdXRpbHMva2VybmVsX2Z1bmNzX3V0aWxzLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBOzs7Ozs7Ozs7Ozs7Ozs7R0FlRztBQUVILE9BQU8sRUFBQyxZQUFZLEVBQTBCLEdBQUcsRUFBdUMsVUFBVSxFQUFDLE1BQU0sdUJBQXVCLENBQUM7QUFHakksT0FBTyxFQUFDLGVBQWUsRUFBQyxNQUFNLGlCQUFpQixDQUFDO0FBQ2hELE9BQU8sRUFBQyxxQkFBcUIsRUFBQyxNQUFNLHdCQUF3QixDQUFDO0FBQzdELE9BQU8sRUFBQyxPQUFPLEVBQUMsTUFBTSxvQkFBb0IsQ0FBQztBQUMzQyxPQUFPLEVBQUMsU0FBUyxFQUFFLGdCQUFnQixFQUFDLE1BQU0sc0JBQXNCLENBQUM7QUFDakUsT0FBTyxFQUFDLEtBQUssRUFBRSxZQUFZLEVBQUMsTUFBTSxrQkFBa0IsQ0FBQztBQUNyRCxPQUFPLEtBQUssUUFBUSxNQUFNLGdCQUFnQixDQUFDO0FBQzNDLE9BQU8sRUFBQyxjQUFjLEVBQUMsTUFBTSxnQkFBZ0IsQ0FBQztBQUM5QyxPQUFPLEtBQUssZUFBZSxNQUFNLHVCQUF1QixDQUFDO0FBQ3pELE9BQU8sRUFBQyxvQkFBb0IsRUFBQyxNQUFNLHVCQUF1QixDQUFDO0FBSTNELE1BQU0sQ0FBQyxNQUFNLHVCQUF1QixHQUFHLHlCQUF5QixDQUFDO0FBU2pFOzs7Ozs7O0dBT0c7QUFDSCxNQUFNLFVBQVUsZUFBZSxDQUMzQixFQUFDLFNBQVMsRUFBRSxlQUFlLEVBQUUsYUFBYSxFQUFFLEtBQUssRUFBd0I7SUFFM0UsT0FBTyxDQUFDLEVBQUMsTUFBTSxFQUFFLE9BQU8sRUFBQyxFQUFFLEVBQUU7UUFDM0IsTUFBTSxFQUFDLENBQUMsRUFBQyxHQUFHLE1BQXFCLENBQUM7UUFDbEMsTUFBTSxZQUFZLEdBQUcsT0FBMkIsQ0FBQztRQUVqRCxNQUFNLE1BQU0sR0FBRyxLQUFLLElBQUksQ0FBQyxDQUFDLEtBQUssQ0FBQztRQUNoQyxJQUFJLFlBQVksQ0FBQyxrQkFBa0IsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksYUFBYSxJQUFJLElBQUksRUFBRTtZQUNqRSxNQUFNLEtBQUssR0FBRyxZQUFZLENBQUMsT0FBTyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsTUFBTSxDQUFDLENBQUM7WUFDakQsTUFBTSxTQUFTLEdBQUcsYUFBYSxDQUFDLEtBQUssQ0FBQyxNQUFvQixFQUFFLE1BQU0sQ0FBQyxDQUFDO1lBQ3BFLE9BQU8sWUFBWSxDQUFDLGNBQWMsQ0FBQyxDQUFDLENBQUMsS0FBSyxFQUFFLE1BQU0sRUFBRSxTQUFTLENBQUMsQ0FBQztTQUNoRTtRQUVELE1BQU0sc0JBQXNCLEdBQ3hCLEdBQUcsRUFBRSxDQUFDLE9BQU8sQ0FBQyw2QkFBNkIsQ0FBQyxJQUFJLGVBQWUsSUFBSSxJQUFJLENBQUM7UUFDNUUsSUFBSSxPQUE0QyxDQUFDO1FBQ2pELElBQUksc0JBQXNCLEVBQUU7WUFDMUIsT0FBTyxHQUFHLElBQUksb0JBQW9CLENBQUMsQ0FBQyxDQUFDLEtBQUssRUFBRSxlQUFlLENBQUMsQ0FBQztTQUM5RDthQUFNO1lBQ0wsT0FBTyxHQUFHLElBQUksY0FBYyxDQUFDLENBQUMsQ0FBQyxLQUFLLEVBQUUsU0FBUyxDQUFDLENBQUM7U0FDbEQ7UUFFRCxPQUFPLFlBQVksQ0FBQyxlQUFlLENBQUMsT0FBTyxFQUFFLENBQUMsQ0FBQyxDQUFDLEVBQUUsTUFBTSxDQUFDLENBQUM7SUFDNUQsQ0FBQyxDQUFDO0FBQ0osQ0FBQztBQVdEOzs7Ozs7Ozs7R0FTRztBQUNILE1BQU0sVUFBVSxnQkFBZ0IsQ0FBQyxFQUMvQixTQUFTLEVBQ1QsZUFBZSxFQUNmLGdCQUFnQixHQUFHLEtBQUssRUFDeEIsZUFBZSxHQUFHLEtBQUssRUFDdkIsYUFBYSxFQUNiLEtBQUssRUFDa0I7SUFDdkIsT0FBTyxDQUFDLEVBQUMsTUFBTSxFQUFFLE9BQU8sRUFBQyxFQUFFLEVBQUU7UUFDM0IsTUFBTSxFQUFDLENBQUMsRUFBRSxDQUFDLEVBQUMsR0FBRyxNQUFzQixDQUFDO1FBQ3RDLE1BQU0sWUFBWSxHQUFHLE9BQTJCLENBQUM7UUFFakQsSUFBSSxlQUFlLElBQUksQ0FBQyxDQUFDLEtBQUssS0FBSyxXQUFXLEVBQUU7WUFDOUMsTUFBTSxLQUFLLEdBQUcsWUFBWSxDQUFDLE9BQU8sQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLE1BQU0sQ0FBQyxDQUFDO1lBQ2pELE1BQU0sS0FBSyxHQUFHLFlBQVksQ0FBQyxPQUFPLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxNQUFNLENBQUMsQ0FBQztZQUVqRCxNQUFNLENBQUMsSUFBSSxFQUFFLElBQUksQ0FBQyxHQUFHO2dCQUNuQixDQUFDLEtBQUssQ0FBQyxrQkFBa0IsQ0FBQyxJQUFJLEVBQUUsS0FBSyxDQUFDLGtCQUFrQixDQUFDLElBQUksQ0FBQztnQkFDOUQsQ0FBQyxLQUFLLENBQUMsa0JBQWtCLENBQUMsSUFBSSxFQUFFLEtBQUssQ0FBQyxrQkFBa0IsQ0FBQyxJQUFJLENBQUM7YUFDL0QsQ0FBQyxHQUFHLENBQUMsWUFBWSxDQUFDLEVBQUU7Z0JBQ25CLE1BQU0sQ0FBQyxLQUFLLEVBQUUsS0FBSyxDQUFDLEdBQUcsWUFBWSxDQUFDO2dCQUVwQyxNQUFNLE9BQU8sR0FBRztvQkFDZCxNQUFNLEVBQUUsS0FBSyxDQUFDLE1BQU07b0JBQ3BCLEtBQUssRUFBRSxLQUFLLENBQUMsS0FBSztvQkFDbEIsS0FBSyxFQUFFLENBQUMsQ0FBQyxLQUFLO2lCQUNmLENBQUM7Z0JBQ0YsTUFBTSxPQUFPLEdBQUc7b0JBQ2QsTUFBTSxFQUFFLEtBQUssQ0FBQyxNQUFNO29CQUNwQixLQUFLLEVBQUUsS0FBSyxDQUFDLEtBQUs7b0JBQ2xCLEtBQUssRUFBRSxDQUFDLENBQUMsS0FBSztpQkFDZixDQUFDO2dCQUVGLE1BQU0sT0FBTyxHQUFHLElBQUksZUFBZSxDQUFDLFNBQVMsRUFBRSxDQUFDLENBQUMsS0FBSyxFQUFFLENBQUMsQ0FBQyxLQUFLLENBQUMsQ0FBQztnQkFDakUsT0FBTyxZQUFZLENBQUMsZUFBZSxDQUMvQixPQUFPLEVBQUUsQ0FBQyxPQUFPLEVBQUUsT0FBTyxDQUFDLEVBQUUsVUFBVSxDQUFDLEtBQUssQ0FBQyxLQUFLLEVBQUUsS0FBSyxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUM7WUFDekUsQ0FBQyxDQUFDLENBQUM7WUFFSCxNQUFNLGFBQWEsR0FDZixPQUFPLENBQUMsRUFBQyxNQUFNLEVBQUUsRUFBQyxJQUFJLEVBQUUsSUFBSSxFQUFDLEVBQUUsT0FBTyxFQUFFLFlBQVksRUFBQyxDQUFDLENBQUM7WUFFM0QsWUFBWSxDQUFDLDZCQUE2QixDQUFDLElBQUksQ0FBQyxDQUFDO1lBQ2pELFlBQVksQ0FBQyw2QkFBNkIsQ0FBQyxJQUFJLENBQUMsQ0FBQztZQUVqRCxrRUFBa0U7WUFFbEUsT0FBTyxhQUFhLENBQUM7U0FDdEI7UUFFRCxNQUFNLE1BQU0sR0FBRyxLQUFLLElBQUksVUFBVSxDQUFDLENBQUMsQ0FBQyxLQUFLLEVBQUUsQ0FBQyxDQUFDLEtBQUssQ0FBQyxDQUFDO1FBQ3JELElBQUksQ0FBQyxDQUFDLENBQUMsS0FBSyxLQUFLLFFBQVEsSUFBSSxDQUFDLENBQUMsS0FBSyxLQUFLLFFBQVE7WUFDNUMsWUFBWSxDQUFDLGtCQUFrQixDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUM7WUFDekMsYUFBYSxJQUFJLElBQUksRUFBRTtZQUN6QixNQUFNLEtBQUssR0FBRyxZQUFZLENBQUMsT0FBTyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsTUFBTSxDQUFDLENBQUMsTUFBb0IsQ0FBQztZQUN0RSxNQUFNLEtBQUssR0FBRyxZQUFZLENBQUMsT0FBTyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsTUFBTSxDQUFDLENBQUMsTUFBb0IsQ0FBQztZQUV0RSxNQUFNLFlBQVksR0FBRyxDQUFDLENBQUMsS0FBSyxLQUFLLFFBQVEsQ0FBQyxDQUFDO2dCQUN2QyxtQ0FBbUM7Z0JBQ25DLFlBQVksQ0FBQyxzQkFBc0IsQ0FBQyxLQUE0QixDQUFDLENBQUMsQ0FBQztnQkFDbkUsS0FBSyxDQUFDO1lBQ1YsTUFBTSxZQUFZLEdBQUcsQ0FBQyxDQUFDLEtBQUssS0FBSyxRQUFRLENBQUMsQ0FBQztnQkFDdkMsbUNBQW1DO2dCQUNuQyxZQUFZLENBQUMsc0JBQXNCLENBQUMsS0FBNEIsQ0FBQyxDQUFDLENBQUM7Z0JBQ25FLEtBQUssQ0FBQztZQUNWLE1BQU0sQ0FBQyxTQUFTLEVBQUUsUUFBUSxDQUFDLEdBQ3ZCLGFBQWEsQ0FBQyxDQUFDLENBQUMsS0FBSyxFQUFFLENBQUMsQ0FBQyxLQUFLLEVBQUUsWUFBWSxFQUFFLFlBQVksRUFBRSxNQUFNLENBQUMsQ0FBQztZQUV4RSxNQUFNLEdBQUcsR0FBRyxZQUFZLENBQUMsY0FBYyxDQUFDLFFBQVEsRUFBRSxNQUFNLENBQUMsQ0FBQztZQUMxRCxNQUFNLE9BQU8sR0FBRyxZQUFZLENBQUMsT0FBTyxDQUFDLEdBQUcsQ0FBQyxHQUFHLENBQUMsTUFBTSxDQUFDLENBQUM7WUFDckQsT0FBTyxDQUFDLE1BQU0sR0FBRyxTQUFTLENBQUM7WUFDM0IsT0FBTyxHQUFHLENBQUM7U0FDWjtRQUVELE1BQU0sc0JBQXNCLEdBQ3hCLEdBQUcsRUFBRSxDQUFDLE9BQU8sQ0FBQyw4QkFBOEIsQ0FBQztZQUM3QyxlQUFlLElBQUksSUFBSSxDQUFDO1FBQzVCLElBQUksT0FBOEMsQ0FBQztRQUNuRCxJQUFJLHNCQUFzQixFQUFFO1lBQzFCLE9BQU8sR0FBRyxJQUFJLHFCQUFxQixDQUMvQixlQUFlLEVBQUUsQ0FBQyxDQUFDLEtBQUssRUFBRSxDQUFDLENBQUMsS0FBSyxFQUFFLGdCQUFnQixDQUFDLENBQUM7U0FDMUQ7YUFBTTtZQUNMLE9BQU8sR0FBRyxJQUFJLGVBQWUsQ0FBQyxTQUFTLEVBQUUsQ0FBQyxDQUFDLEtBQUssRUFBRSxDQUFDLENBQUMsS0FBSyxDQUFDLENBQUM7U0FDNUQ7UUFFRCxPQUFPLFlBQVksQ0FBQyxlQUFlLENBQUMsT0FBTyxFQUFFLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxFQUFFLE1BQU0sQ0FBQyxDQUFDO0lBQy9ELENBQUMsQ0FBQztBQUNKLENBQUM7QUFFRCxNQUFNLFVBQVUsNEJBQTRCLENBQ3hDLFVBQW1DLEVBQUUsTUFBTSxHQUFHLEtBQUs7SUFDckQsSUFBSSxVQUFVLEtBQUssUUFBUSxFQUFFO1FBQzNCLElBQUksTUFBTSxFQUFFO1lBQ1YsT0FBTyxlQUFlLENBQUMsTUFBTSxDQUFDO1NBQy9CO1FBQ0QsT0FBTyxRQUFRLENBQUMsTUFBTSxDQUFDO0tBQ3hCO1NBQU0sSUFBSSxVQUFVLEtBQUssTUFBTSxFQUFFO1FBQ2hDLElBQUksTUFBTSxFQUFFO1lBQ1YsT0FBTyxlQUFlLENBQUMsSUFBSSxDQUFDO1NBQzdCO1FBQ0QsT0FBTyxRQUFRLENBQUMsSUFBSSxDQUFDO0tBQ3RCO1NBQU0sSUFBSSxVQUFVLEtBQUssS0FBSyxFQUFFO1FBQy9CLElBQUksTUFBTSxFQUFFO1lBQ1YsT0FBTyxlQUFlLENBQUMsR0FBRyxDQUFDO1NBQzVCO1FBQ0QsT0FBTyxRQUFRLENBQUMsR0FBRyxDQUFDO0tBQ3JCO1NBQU0sSUFBSSxVQUFVLEtBQUssT0FBTyxFQUFFO1FBQ2pDLElBQUksTUFBTSxFQUFFO1lBQ1YsT0FBTyxlQUFlLENBQUMsS0FBSyxDQUFDO1NBQzlCO1FBQ0QsT0FBTyxRQUFRLENBQUMsS0FBSyxDQUFDO0tBQ3ZCO1NBQU0sSUFBSSxVQUFVLEtBQUssT0FBTyxFQUFFO1FBQ2pDLElBQUksTUFBTSxFQUFFO1lBQ1YsT0FBTyxZQUFZLENBQUM7U0FDckI7UUFDRCxPQUFPLEtBQUssQ0FBQztLQUNkO1NBQU0sSUFBSSxVQUFVLEtBQUssV0FBVyxFQUFFO1FBQ3JDLElBQUksTUFBTSxFQUFFO1lBQ1YsT0FBTyxnQkFBZ0IsQ0FBQztTQUN6QjtRQUNELE9BQU8sU0FBUyxDQUFDO0tBQ2xCO1NBQU0sSUFBSSxVQUFVLEtBQUssU0FBUyxFQUFFO1FBQ25DLElBQUksTUFBTSxFQUFFO1lBQ1YsT0FBTyxlQUFlLENBQUMsT0FBTyxDQUFDO1NBQ2hDO1FBQ0QsT0FBTyxRQUFRLENBQUMsT0FBTyxDQUFDO0tBQ3pCO0lBQ0QsTUFBTSxJQUFJLEtBQUssQ0FBQyxjQUNaLFVBQVUsa0RBQWtELENBQUMsQ0FBQztBQUNwRSxDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiLyoqXG4gKiBAbGljZW5zZVxuICogQ29weXJpZ2h0IDIwMjAgR29vZ2xlIExMQy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC5cbiAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSBcIkxpY2Vuc2VcIik7XG4gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuXG4gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXRcbiAqXG4gKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjBcbiAqXG4gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlXG4gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiBcIkFTIElTXCIgQkFTSVMsXG4gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC5cbiAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmRcbiAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLlxuICogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbiAqL1xuXG5pbXBvcnQge2JhY2tlbmRfdXRpbCwgQmluYXJ5SW5wdXRzLCBEYXRhVHlwZSwgZW52LCBLZXJuZWxGdW5jLCBUeXBlZEFycmF5LCBVbmFyeUlucHV0cywgdXBjYXN0VHlwZX0gZnJvbSAnQHRlbnNvcmZsb3cvdGZqcy1jb3JlJztcblxuaW1wb3J0IHtNYXRoQmFja2VuZFdlYkdMfSBmcm9tICcuLi9iYWNrZW5kX3dlYmdsJztcbmltcG9ydCB7QmluYXJ5T3BQcm9ncmFtfSBmcm9tICcuLi9iaW5hcnlvcF9ncHUnO1xuaW1wb3J0IHtCaW5hcnlPcFBhY2tlZFByb2dyYW19IGZyb20gJy4uL2JpbmFyeW9wX3BhY2tlZF9ncHUnO1xuaW1wb3J0IHtjb21wbGV4fSBmcm9tICcuLi9rZXJuZWxzL0NvbXBsZXgnO1xuaW1wb3J0IHtMRUFLWVJFTFUsIExFQUtZUkVMVV9QQUNLRUR9IGZyb20gJy4uL2tlcm5lbHMvTGVha3lSZWx1JztcbmltcG9ydCB7UFJFTFUsIFBSRUxVX1BBQ0tFRH0gZnJvbSAnLi4va2VybmVscy9QcmVsdSc7XG5pbXBvcnQgKiBhcyB1bmFyeV9vcCBmcm9tICcuLi91bmFyeW9wX2dwdSc7XG5pbXBvcnQge1VuYXJ5T3BQcm9ncmFtfSBmcm9tICcuLi91bmFyeW9wX2dwdSc7XG5pbXBvcnQgKiBhcyB1bmFyeV9wYWNrZWRfb3AgZnJvbSAnLi4vdW5hcnlvcF9wYWNrZWRfZ3B1JztcbmltcG9ydCB7VW5hcnlPcFBhY2tlZFByb2dyYW19IGZyb20gJy4uL3VuYXJ5b3BfcGFja2VkX2dwdSc7XG5cbmltcG9ydCB7U2ltcGxlQmluYXJ5S2VybmVsSW1wbENQVSwgU2ltcGxlVW5hcnlLZXJuZWxJbXBsQ1BVfSBmcm9tICcuL3NoYXJlZCc7XG5cbmV4cG9ydCBjb25zdCBDSEVDS19OQU5fU05JUFBFVF9VTkFSWSA9IGBpZiAoaXNuYW4oeCkpIHJldHVybiB4O2A7XG5cbnR5cGUgVW5hcnlLZXJuZWxGdW5jQ29uZmlnID0ge1xuICBvcFNuaXBwZXQ6IHN0cmluZyxcbiAgcGFja2VkT3BTbmlwcGV0Pzogc3RyaW5nLFxuICBjcHVLZXJuZWxJbXBsPzogU2ltcGxlVW5hcnlLZXJuZWxJbXBsQ1BVLFxuICBkdHlwZT86IERhdGFUeXBlXG59O1xuXG4vKipcbiAqIFRlbXBsYXRlIHRoYXQgY3JlYXRlcyBhIGBLZXJuZWxGdW5jYCBmb3IgdW5hcnkgb3BzLlxuICogQHBhcmFtIG9wU25pcHBldCBPcCBzbmlwcGV0IHRvIGNyZWF0ZSBgVW5hcnlPcFByb2dyYW1gLlxuICogQHBhcmFtIHBhY2tlZE9wU25pcHBldCBPcCBzbmlwcGV0IHRvIGNyZWF0ZSBgVW5hcnlPcFBhY2tlZFByb2dyYW1gLlxuICogQHBhcmFtIGR0eXBlIE9wdGlvbmFsLiBJZiBzZXQsIHRoZSByZXN1bHQgaGFzIHRoaXMgZHR5cGUuIE90aGVyd2lzZSwgdGhlXG4gKiAgICAgcmVzdWx0IGhhcyB0aGUgc2FtZSBkdHlwZSBhcyB0aGUgZmlyc3QgaW5wdXQuIFRoaXMgaXMgbWFpbmx5IHVzZWQgaW5cbiAqICAgICBjb21wYXJpc29uIGtlcm5lbHMsIHN1Y2ggYXMgRXF1YWwsIExlc3MsIEdyZWF0ZXIsIGV0Yy5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHVuYXJ5S2VybmVsRnVuYyhcbiAgICB7b3BTbmlwcGV0LCBwYWNrZWRPcFNuaXBwZXQsIGNwdUtlcm5lbEltcGwsIGR0eXBlfTogVW5hcnlLZXJuZWxGdW5jQ29uZmlnKTpcbiAgICBLZXJuZWxGdW5jIHtcbiAgcmV0dXJuICh7aW5wdXRzLCBiYWNrZW5kfSkgPT4ge1xuICAgIGNvbnN0IHt4fSA9IGlucHV0cyBhcyBVbmFyeUlucHV0cztcbiAgICBjb25zdCB3ZWJnbEJhY2tlbmQgPSBiYWNrZW5kIGFzIE1hdGhCYWNrZW5kV2ViR0w7XG5cbiAgICBjb25zdCAkZHR5cGUgPSBkdHlwZSB8fCB4LmR0eXBlO1xuICAgIGlmICh3ZWJnbEJhY2tlbmQuc2hvdWxkRXhlY3V0ZU9uQ1BVKFt4XSkgJiYgY3B1S2VybmVsSW1wbCAhPSBudWxsKSB7XG4gICAgICBjb25zdCB4RGF0YSA9IHdlYmdsQmFja2VuZC50ZXhEYXRhLmdldCh4LmRhdGFJZCk7XG4gICAgICBjb25zdCBvdXRWYWx1ZXMgPSBjcHVLZXJuZWxJbXBsKHhEYXRhLnZhbHVlcyBhcyBUeXBlZEFycmF5LCAkZHR5cGUpO1xuICAgICAgcmV0dXJuIHdlYmdsQmFja2VuZC5tYWtlVGVuc29ySW5mbyh4LnNoYXBlLCAkZHR5cGUsIG91dFZhbHVlcyk7XG4gICAgfVxuXG4gICAgY29uc3Qgc2hvdWxkVXNlUGFja2VkUHJvZ3JhbSA9XG4gICAgICAgIGVudigpLmdldEJvb2woJ1dFQkdMX1BBQ0tfVU5BUllfT1BFUkFUSU9OUycpICYmIHBhY2tlZE9wU25pcHBldCAhPSBudWxsO1xuICAgIGxldCBwcm9ncmFtOiBVbmFyeU9wUHJvZ3JhbXxVbmFyeU9wUGFja2VkUHJvZ3JhbTtcbiAgICBpZiAoc2hvdWxkVXNlUGFja2VkUHJvZ3JhbSkge1xuICAgICAgcHJvZ3JhbSA9IG5ldyBVbmFyeU9wUGFja2VkUHJvZ3JhbSh4LnNoYXBlLCBwYWNrZWRPcFNuaXBwZXQpO1xuICAgIH0gZWxzZSB7XG4gICAgICBwcm9ncmFtID0gbmV3IFVuYXJ5T3BQcm9ncmFtKHguc2hhcGUsIG9wU25pcHBldCk7XG4gICAgfVxuXG4gICAgcmV0dXJuIHdlYmdsQmFja2VuZC5ydW5XZWJHTFByb2dyYW0ocHJvZ3JhbSwgW3hdLCAkZHR5cGUpO1xuICB9O1xufVxuXG50eXBlIEJpbmFyeUtlcm5lbEZ1bmNDb25maWcgPSB7XG4gIG9wU25pcHBldDogc3RyaW5nLFxuICBwYWNrZWRPcFNuaXBwZXQ/OiBzdHJpbmcsXG4gIGNoZWNrT3V0T2ZCb3VuZHM/OiBib29sZWFuLFxuICBzdXBwb3J0c0NvbXBsZXg/OiBib29sZWFuLFxuICBjcHVLZXJuZWxJbXBsPzogU2ltcGxlQmluYXJ5S2VybmVsSW1wbENQVSxcbiAgZHR5cGU/OiBEYXRhVHlwZVxufTtcblxuLyoqXG4gKiBUZW1wbGF0ZSB0aGF0IGNyZWF0ZXMgYSBgS2VybmVsRnVuY2AgZm9yIGJpbmFyeSBvcHMuXG4gKiBAcGFyYW0gb3BTbmlwcGV0IE9wIHNuaXBwZXQgdG8gY3JlYXRlIGBCaW5hcnlPcFByb2dyYW1gLlxuICogQHBhcmFtIHBhY2tlZE9wU25pcHBldCBPcCBzbmlwcGV0IHRvIGNyZWF0ZSBgQmluYXJ5T3BQYWNrZWRQcm9ncmFtYC5cbiAqIEBwYXJhbSBjaGVja091dE9mQm91bmRzRm9yUGFja2VkUHJvZ3JhbSBXaGV0aGVyIHRvIHNldCBjaGVja091dE9mQm91bmRzPXRydWVcbiAqICAgICB3aGVuIGNyZWF0aW5nIEJpbmFyeU9wUGFja2VkUHJvZ3JhbS5cbiAqIEBwYXJhbSBkdHlwZSBPcHRpb25hbC4gSWYgc2V0LCB0aGUgcmVzdWx0IGhhcyB0aGlzIGR0eXBlLiBPdGhlcndpc2UsIHRoZVxuICogICAgIHJlc3VsdCBoYXMgdGhlIHNhbWUgZHR5cGUgYXMgdGhlIGZpcnN0IGlucHV0LiBUaGlzIGlzIG1haW5seSB1c2VkIGluXG4gKiAgICAgY29tcGFyaXNvbiBrZXJuZWxzLCBzdWNoIGFzIEVxdWFsLCBMZXNzLCBHcmVhdGVyLCBldGMuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBiaW5hcnlLZXJuZWxGdW5jKHtcbiAgb3BTbmlwcGV0LFxuICBwYWNrZWRPcFNuaXBwZXQsXG4gIGNoZWNrT3V0T2ZCb3VuZHMgPSBmYWxzZSxcbiAgc3VwcG9ydHNDb21wbGV4ID0gZmFsc2UsXG4gIGNwdUtlcm5lbEltcGwsXG4gIGR0eXBlXG59OiBCaW5hcnlLZXJuZWxGdW5jQ29uZmlnKTogS2VybmVsRnVuYyB7XG4gIHJldHVybiAoe2lucHV0cywgYmFja2VuZH0pID0+IHtcbiAgICBjb25zdCB7YSwgYn0gPSBpbnB1dHMgYXMgQmluYXJ5SW5wdXRzO1xuICAgIGNvbnN0IHdlYmdsQmFja2VuZCA9IGJhY2tlbmQgYXMgTWF0aEJhY2tlbmRXZWJHTDtcblxuICAgIGlmIChzdXBwb3J0c0NvbXBsZXggJiYgYS5kdHlwZSA9PT0gJ2NvbXBsZXg2NCcpIHtcbiAgICAgIGNvbnN0IGFEYXRhID0gd2ViZ2xCYWNrZW5kLnRleERhdGEuZ2V0KGEuZGF0YUlkKTtcbiAgICAgIGNvbnN0IGJEYXRhID0gd2ViZ2xCYWNrZW5kLnRleERhdGEuZ2V0KGIuZGF0YUlkKTtcblxuICAgICAgY29uc3QgW3JlYWwsIGltYWddID0gW1xuICAgICAgICBbYURhdGEuY29tcGxleFRlbnNvckluZm9zLnJlYWwsIGJEYXRhLmNvbXBsZXhUZW5zb3JJbmZvcy5yZWFsXSxcbiAgICAgICAgW2FEYXRhLmNvbXBsZXhUZW5zb3JJbmZvcy5pbWFnLCBiRGF0YS5jb21wbGV4VGVuc29ySW5mb3MuaW1hZ11cbiAgICAgIF0ubWFwKGNvbXBsZXhQYXJ0cyA9PiB7XG4gICAgICAgIGNvbnN0IFthUGFydCwgYlBhcnRdID0gY29tcGxleFBhcnRzO1xuXG4gICAgICAgIGNvbnN0IGFIYW5kbGUgPSB7XG4gICAgICAgICAgZGF0YUlkOiBhUGFydC5kYXRhSWQsXG4gICAgICAgICAgZHR5cGU6IGFQYXJ0LmR0eXBlLFxuICAgICAgICAgIHNoYXBlOiBhLnNoYXBlXG4gICAgICAgIH07XG4gICAgICAgIGNvbnN0IGJIYW5kbGUgPSB7XG4gICAgICAgICAgZGF0YUlkOiBiUGFydC5kYXRhSWQsXG4gICAgICAgICAgZHR5cGU6IGJQYXJ0LmR0eXBlLFxuICAgICAgICAgIHNoYXBlOiBiLnNoYXBlXG4gICAgICAgIH07XG5cbiAgICAgICAgY29uc3QgcHJvZ3JhbSA9IG5ldyBCaW5hcnlPcFByb2dyYW0ob3BTbmlwcGV0LCBhLnNoYXBlLCBiLnNoYXBlKTtcbiAgICAgICAgcmV0dXJuIHdlYmdsQmFja2VuZC5ydW5XZWJHTFByb2dyYW0oXG4gICAgICAgICAgICBwcm9ncmFtLCBbYUhhbmRsZSwgYkhhbmRsZV0sIHVwY2FzdFR5cGUoYVBhcnQuZHR5cGUsIGJQYXJ0LmR0eXBlKSk7XG4gICAgICB9KTtcblxuICAgICAgY29uc3QgY29tcGxleE91dHB1dCA9XG4gICAgICAgICAgY29tcGxleCh7aW5wdXRzOiB7cmVhbCwgaW1hZ30sIGJhY2tlbmQ6IHdlYmdsQmFja2VuZH0pO1xuXG4gICAgICB3ZWJnbEJhY2tlbmQuZGlzcG9zZUludGVybWVkaWF0ZVRlbnNvckluZm8ocmVhbCk7XG4gICAgICB3ZWJnbEJhY2tlbmQuZGlzcG9zZUludGVybWVkaWF0ZVRlbnNvckluZm8oaW1hZyk7XG5cbiAgICAgIC8vIFRPRE8oYW5ueGluZ3l1YW4pOiBJbXBsZW1lbnQgQ1BVIGZvcndhcmRpbmcgZm9yIGNvbXBsZXggaW5wdXRzLlxuXG4gICAgICByZXR1cm4gY29tcGxleE91dHB1dDtcbiAgICB9XG5cbiAgICBjb25zdCAkZHR5cGUgPSBkdHlwZSB8fCB1cGNhc3RUeXBlKGEuZHR5cGUsIGIuZHR5cGUpO1xuICAgIGlmICgoYS5kdHlwZSA9PT0gJ3N0cmluZycgfHwgYi5kdHlwZSA9PT0gJ3N0cmluZycgfHxcbiAgICAgICAgIHdlYmdsQmFja2VuZC5zaG91bGRFeGVjdXRlT25DUFUoW2EsIGJdKSkgJiZcbiAgICAgICAgY3B1S2VybmVsSW1wbCAhPSBudWxsKSB7XG4gICAgICBjb25zdCBhVmFscyA9IHdlYmdsQmFja2VuZC50ZXhEYXRhLmdldChhLmRhdGFJZCkudmFsdWVzIGFzIFR5cGVkQXJyYXk7XG4gICAgICBjb25zdCBiVmFscyA9IHdlYmdsQmFja2VuZC50ZXhEYXRhLmdldChiLmRhdGFJZCkudmFsdWVzIGFzIFR5cGVkQXJyYXk7XG5cbiAgICAgIGNvbnN0IGRlY29kZWRBVmFscyA9IGEuZHR5cGUgPT09ICdzdHJpbmcnID9cbiAgICAgICAgICAvLyB0c2xpbnQ6ZGlzYWJsZS1uZXh0LWxpbmU6IG5vLWFueVxuICAgICAgICAgIGJhY2tlbmRfdXRpbC5mcm9tVWludDhUb1N0cmluZ0FycmF5KGFWYWxzIGFzIGFueSBhcyBVaW50OEFycmF5W10pIDpcbiAgICAgICAgICBhVmFscztcbiAgICAgIGNvbnN0IGRlY29kZWRCVmFscyA9IGEuZHR5cGUgPT09ICdzdHJpbmcnID9cbiAgICAgICAgICAvLyB0c2xpbnQ6ZGlzYWJsZS1uZXh0LWxpbmU6IG5vLWFueVxuICAgICAgICAgIGJhY2tlbmRfdXRpbC5mcm9tVWludDhUb1N0cmluZ0FycmF5KGJWYWxzIGFzIGFueSBhcyBVaW50OEFycmF5W10pIDpcbiAgICAgICAgICBiVmFscztcbiAgICAgIGNvbnN0IFtvdXRWYWx1ZXMsIG91dFNoYXBlXSA9XG4gICAgICAgICAgY3B1S2VybmVsSW1wbChhLnNoYXBlLCBiLnNoYXBlLCBkZWNvZGVkQVZhbHMsIGRlY29kZWRCVmFscywgJGR0eXBlKTtcblxuICAgICAgY29uc3Qgb3V0ID0gd2ViZ2xCYWNrZW5kLm1ha2VUZW5zb3JJbmZvKG91dFNoYXBlLCAkZHR5cGUpO1xuICAgICAgY29uc3Qgb3V0RGF0YSA9IHdlYmdsQmFja2VuZC50ZXhEYXRhLmdldChvdXQuZGF0YUlkKTtcbiAgICAgIG91dERhdGEudmFsdWVzID0gb3V0VmFsdWVzO1xuICAgICAgcmV0dXJuIG91dDtcbiAgICB9XG5cbiAgICBjb25zdCBzaG91bGRVc2VQYWNrZWRQcm9ncmFtID1cbiAgICAgICAgZW52KCkuZ2V0Qm9vbCgnV0VCR0xfUEFDS19CSU5BUllfT1BFUkFUSU9OUycpICYmXG4gICAgICAgIHBhY2tlZE9wU25pcHBldCAhPSBudWxsO1xuICAgIGxldCBwcm9ncmFtOiBCaW5hcnlPcFByb2dyYW18QmluYXJ5T3BQYWNrZWRQcm9ncmFtO1xuICAgIGlmIChzaG91bGRVc2VQYWNrZWRQcm9ncmFtKSB7XG4gICAgICBwcm9ncmFtID0gbmV3IEJpbmFyeU9wUGFja2VkUHJvZ3JhbShcbiAgICAgICAgICBwYWNrZWRPcFNuaXBwZXQsIGEuc2hhcGUsIGIuc2hhcGUsIGNoZWNrT3V0T2ZCb3VuZHMpO1xuICAgIH0gZWxzZSB7XG4gICAgICBwcm9ncmFtID0gbmV3IEJpbmFyeU9wUHJvZ3JhbShvcFNuaXBwZXQsIGEuc2hhcGUsIGIuc2hhcGUpO1xuICAgIH1cblxuICAgIHJldHVybiB3ZWJnbEJhY2tlbmQucnVuV2ViR0xQcm9ncmFtKHByb2dyYW0sIFthLCBiXSwgJGR0eXBlKTtcbiAgfTtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIG1hcEFjdGl2YXRpb25Ub1NoYWRlclByb2dyYW0oXG4gICAgYWN0aXZhdGlvbjogYmFja2VuZF91dGlsLkFjdGl2YXRpb24sIHBhY2tlZCA9IGZhbHNlKTogc3RyaW5nIHtcbiAgaWYgKGFjdGl2YXRpb24gPT09ICdsaW5lYXInKSB7XG4gICAgaWYgKHBhY2tlZCkge1xuICAgICAgcmV0dXJuIHVuYXJ5X3BhY2tlZF9vcC5MSU5FQVI7XG4gICAgfVxuICAgIHJldHVybiB1bmFyeV9vcC5MSU5FQVI7XG4gIH0gZWxzZSBpZiAoYWN0aXZhdGlvbiA9PT0gJ3JlbHUnKSB7XG4gICAgaWYgKHBhY2tlZCkge1xuICAgICAgcmV0dXJuIHVuYXJ5X3BhY2tlZF9vcC5SRUxVO1xuICAgIH1cbiAgICByZXR1cm4gdW5hcnlfb3AuUkVMVTtcbiAgfSBlbHNlIGlmIChhY3RpdmF0aW9uID09PSAnZWx1Jykge1xuICAgIGlmIChwYWNrZWQpIHtcbiAgICAgIHJldHVybiB1bmFyeV9wYWNrZWRfb3AuRUxVO1xuICAgIH1cbiAgICByZXR1cm4gdW5hcnlfb3AuRUxVO1xuICB9IGVsc2UgaWYgKGFjdGl2YXRpb24gPT09ICdyZWx1NicpIHtcbiAgICBpZiAocGFja2VkKSB7XG4gICAgICByZXR1cm4gdW5hcnlfcGFja2VkX29wLlJFTFU2O1xuICAgIH1cbiAgICByZXR1cm4gdW5hcnlfb3AuUkVMVTY7XG4gIH0gZWxzZSBpZiAoYWN0aXZhdGlvbiA9PT0gJ3ByZWx1Jykge1xuICAgIGlmIChwYWNrZWQpIHtcbiAgICAgIHJldHVybiBQUkVMVV9QQUNLRUQ7XG4gICAgfVxuICAgIHJldHVybiBQUkVMVTtcbiAgfSBlbHNlIGlmIChhY3RpdmF0aW9uID09PSAnbGVha3lyZWx1Jykge1xuICAgIGlmIChwYWNrZWQpIHtcbiAgICAgIHJldHVybiBMRUFLWVJFTFVfUEFDS0VEO1xuICAgIH1cbiAgICByZXR1cm4gTEVBS1lSRUxVO1xuICB9IGVsc2UgaWYgKGFjdGl2YXRpb24gPT09ICdzaWdtb2lkJykge1xuICAgIGlmIChwYWNrZWQpIHtcbiAgICAgIHJldHVybiB1bmFyeV9wYWNrZWRfb3AuU0lHTU9JRDtcbiAgICB9XG4gICAgcmV0dXJuIHVuYXJ5X29wLlNJR01PSUQ7XG4gIH1cbiAgdGhyb3cgbmV3IEVycm9yKGBBY3RpdmF0aW9uICR7XG4gICAgICBhY3RpdmF0aW9ufSBoYXMgbm90IGJlZW4gaW1wbGVtZW50ZWQgZm9yIHRoZSBXZWJHTCBiYWNrZW5kLmApO1xufVxuIl19","/**\n * @license\n * Copyright 2018 Google LLC. All Rights Reserved.\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n * =============================================================================\n */\nimport { useShapeUniforms } from './gpgpu_math';\nexport class MatMulPackedProgram {\n constructor(aShape, bShape, outputShape, transposeA = false, transposeB = false, addBias = false, activation = null, hasPreluActivation = false, hasLeakyreluActivation = false) {\n this.variableNames = ['matrixA', 'matrixB'];\n this.packedInputs = true;\n this.packedOutput = true;\n this.outputShape = outputShape;\n this.enableShapeUniforms = useShapeUniforms(this.outputShape.length);\n const sharedDim = transposeA ? aShape[1] : aShape[2];\n const sharedDimensionPacked = Math.ceil(sharedDim / 2);\n const aSample = transposeA ? 'i * 2, rc.y' : 'rc.y, i * 2';\n const bSample = transposeB ? 'rc.z, i * 2' : 'i * 2, rc.z';\n const aSwizzle = transposeA ? ['a.xxyy', 'a.zzww'] : ['a.xxzz', 'a.yyww'];\n const bSwizzle = transposeB ? ['b.xzxz', 'b.ywyw'] : ['b.xyxy', 'b.zwzw'];\n let activationSnippet = '', applyActivationSnippet = '';\n if (activation) {\n if (hasPreluActivation) {\n activationSnippet = `vec4 activation(vec4 a) {\n vec4 b = getPreluActivationWeightsAtOutCoords();\n ${activation}\n }`;\n }\n else if (hasLeakyreluActivation) {\n activationSnippet = `vec4 activation(vec4 a) {\n vec4 b = getLeakyreluAlphaAtOutCoords();\n ${activation}\n }`;\n }\n else {\n activationSnippet = `vec4 activation(vec4 x) {\n ${activation}\n }`;\n }\n applyActivationSnippet = `result = activation(result);`;\n }\n const addBiasSnippet = addBias ? 'result += getBiasAtOutCoords();' : '';\n if (addBias) {\n this.variableNames.push('bias');\n }\n if (hasPreluActivation) {\n this.variableNames.push('preluActivationWeights');\n }\n if (hasLeakyreluActivation) {\n this.variableNames.push('leakyreluAlpha');\n }\n let batchASnippet = 'rc.x';\n let batchBSnippet = 'rc.x';\n if (aShape[0] < bShape[0]) {\n batchASnippet = `int(min(float(rc.x), ${aShape[0] - 1}.))`;\n }\n else if (bShape[0] < aShape[0]) {\n batchBSnippet = `int(min(float(rc.x), ${bShape[0] - 1}.))`;\n }\n this.userCode = `\n ${activationSnippet}\n // Don't use uniform for sharedDimensionPacked for performance.\n const float sharedDimension = ${sharedDimensionPacked}.0;\n\n vec4 dot2x2ARowBCol(ivec3 rc) {\n vec4 result = vec4(0);\n for (int i = 0; i < ${sharedDimensionPacked}; i++) {\n int batchA = ${batchASnippet};\n int batchB = ${batchBSnippet};\n vec4 a = getMatrixA(batchA, ${aSample});\n vec4 b = getMatrixB(batchB, ${bSample});\n\n // These swizzled products need to be separately added.\n // See: https://github.com/tensorflow/tfjs/issues/1735\n result += (${aSwizzle[0]} * ${bSwizzle[0]});\n result += (${aSwizzle[1]} * ${bSwizzle[1]});\n }\n return result;\n }\n\n void main() {\n ivec3 rc = getOutputCoords();\n vec4 result = dot2x2ARowBCol(rc);\n\n ${addBiasSnippet}\n\n ${applyActivationSnippet}\n\n setOutput(result);\n }\n `;\n }\n}\n//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibXVsbWF0X3BhY2tlZF9ncHUuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi90ZmpzLWJhY2tlbmQtd2ViZ2wvc3JjL211bG1hdF9wYWNrZWRfZ3B1LnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBOzs7Ozs7Ozs7Ozs7Ozs7R0FlRztBQUVILE9BQU8sRUFBZSxnQkFBZ0IsRUFBQyxNQUFNLGNBQWMsQ0FBQztBQUU1RCxNQUFNLE9BQU8sbUJBQW1CO0lBUTlCLFlBQ0ksTUFBZ0MsRUFBRSxNQUFnQyxFQUNsRSxXQUFxQyxFQUFFLFVBQVUsR0FBRyxLQUFLLEVBQ3pELFVBQVUsR0FBRyxLQUFLLEVBQUUsT0FBTyxHQUFHLEtBQUssRUFBRSxhQUFxQixJQUFJLEVBQzlELGtCQUFrQixHQUFHLEtBQUssRUFBRSxzQkFBc0IsR0FBRyxLQUFLO1FBWDlELGtCQUFhLEdBQUcsQ0FBQyxTQUFTLEVBQUUsU0FBUyxDQUFDLENBQUM7UUFDdkMsaUJBQVksR0FBRyxJQUFJLENBQUM7UUFDcEIsaUJBQVksR0FBRyxJQUFJLENBQUM7UUFVbEIsSUFBSSxDQUFDLFdBQVcsR0FBRyxXQUFXLENBQUM7UUFDL0IsSUFBSSxDQUFDLG1CQUFtQixHQUFHLGdCQUFnQixDQUFDLElBQUksQ0FBQyxXQUFXLENBQUMsTUFBTSxDQUFDLENBQUM7UUFFckUsTUFBTSxTQUFTLEdBQUcsVUFBVSxDQUFDLENBQUMsQ0FBQyxNQUFNLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLE1BQU0sQ0FBQyxDQUFDLENBQUMsQ0FBQztRQUNyRCxNQUFNLHFCQUFxQixHQUFHLElBQUksQ0FBQyxJQUFJLENBQUMsU0FBUyxHQUFHLENBQUMsQ0FBQyxDQUFDO1FBRXZELE1BQU0sT0FBTyxHQUFHLFVBQVUsQ0FBQyxDQUFDLENBQUMsYUFBYSxDQUFDLENBQUMsQ0FBQyxhQUFhLENBQUM7UUFDM0QsTUFBTSxPQUFPLEdBQUcsVUFBVSxDQUFDLENBQUMsQ0FBQyxhQUFhLENBQUMsQ0FBQyxDQUFDLGFBQWEsQ0FBQztRQUMzRCxNQUFNLFFBQVEsR0FBRyxVQUFVLENBQUMsQ0FBQyxDQUFDLENBQUMsUUFBUSxFQUFFLFFBQVEsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLFFBQVEsRUFBRSxRQUFRLENBQUMsQ0FBQztRQUMxRSxNQUFNLFFBQVEsR0FBRyxVQUFVLENBQUMsQ0FBQyxDQUFDLENBQUMsUUFBUSxFQUFFLFFBQVEsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLFFBQVEsRUFBRSxRQUFRLENBQUMsQ0FBQztRQUUxRSxJQUFJLGlCQUFpQixHQUFHLEVBQUUsRUFBRSxzQkFBc0IsR0FBRyxFQUFFLENBQUM7UUFDeEQsSUFBSSxVQUFVLEVBQUU7WUFDZCxJQUFJLGtCQUFrQixFQUFFO2dCQUN0QixpQkFBaUIsR0FBRzs7WUFFaEIsVUFBVTtVQUNaLENBQUM7YUFDSjtpQkFBTSxJQUFJLHNCQUFzQixFQUFFO2dCQUNqQyxpQkFBaUIsR0FBRzs7WUFFaEIsVUFBVTtVQUNaLENBQUM7YUFDSjtpQkFBTTtnQkFDTCxpQkFBaUIsR0FBRztZQUNoQixVQUFVO1VBQ1osQ0FBQzthQUNKO1lBRUQsc0JBQXNCLEdBQUcsOEJBQThCLENBQUM7U0FDekQ7UUFFRCxNQUFNLGNBQWMsR0FBRyxPQUFPLENBQUMsQ0FBQyxDQUFDLGlDQUFpQyxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUM7UUFDeEUsSUFBSSxPQUFPLEVBQUU7WUFDWCxJQUFJLENBQUMsYUFBYSxDQUFDLElBQUksQ0FBQyxNQUFNLENBQUMsQ0FBQztTQUNqQztRQUVELElBQUksa0JBQWtCLEVBQUU7WUFDdEIsSUFBSSxDQUFDLGFBQWEsQ0FBQyxJQUFJLENBQUMsd0JBQXdCLENBQUMsQ0FBQztTQUNuRDtRQUVELElBQUksc0JBQXNCLEVBQUU7WUFDMUIsSUFBSSxDQUFDLGFBQWEsQ0FBQyxJQUFJLENBQUMsZ0JBQWdCLENBQUMsQ0FBQztTQUMzQztRQUVELElBQUksYUFBYSxHQUFHLE1BQU0sQ0FBQztRQUMzQixJQUFJLGFBQWEsR0FBRyxNQUFNLENBQUM7UUFDM0IsSUFBSSxNQUFNLENBQUMsQ0FBQyxDQUFDLEdBQUcsTUFBTSxDQUFDLENBQUMsQ0FBQyxFQUFFO1lBQ3pCLGFBQWEsR0FBRyx3QkFBd0IsTUFBTSxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsS0FBSyxDQUFDO1NBQzVEO2FBQU0sSUFBSSxNQUFNLENBQUMsQ0FBQyxDQUFDLEdBQUcsTUFBTSxDQUFDLENBQUMsQ0FBQyxFQUFFO1lBQ2hDLGFBQWEsR0FBRyx3QkFBd0IsTUFBTSxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsS0FBSyxDQUFDO1NBQzVEO1FBRUQsSUFBSSxDQUFDLFFBQVEsR0FBRztRQUNaLGlCQUFpQjs7c0NBRWEscUJBQXFCOzs7OzhCQUk3QixxQkFBcUI7eUJBQzFCLGFBQWE7eUJBQ2IsYUFBYTt3Q0FDRSxPQUFPO3dDQUNQLE9BQU87Ozs7dUJBSXhCLFFBQVEsQ0FBQyxDQUFDLENBQUMsTUFBTSxRQUFRLENBQUMsQ0FBQyxDQUFDO3VCQUM1QixRQUFRLENBQUMsQ0FBQyxDQUFDLE1BQU0sUUFBUSxDQUFDLENBQUMsQ0FBQzs7Ozs7Ozs7O1VBU3pDLGNBQWM7O1VBRWQsc0JBQXNCOzs7O0tBSTNCLENBQUM7SUFDSixDQUFDO0NBQ0YiLCJzb3VyY2VzQ29udGVudCI6WyIvKipcbiAqIEBsaWNlbnNlXG4gKiBDb3B5cmlnaHQgMjAxOCBHb29nbGUgTExDLiBBbGwgUmlnaHRzIFJlc2VydmVkLlxuICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlIFwiTGljZW5zZVwiKTtcbiAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS5cbiAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdFxuICpcbiAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMFxuICpcbiAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmVcbiAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuIFwiQVMgSVNcIiBCQVNJUyxcbiAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLlxuICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZFxuICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuXG4gKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuICovXG5cbmltcG9ydCB7R1BHUFVQcm9ncmFtLCB1c2VTaGFwZVVuaWZvcm1zfSBmcm9tICcuL2dwZ3B1X21hdGgnO1xuXG5leHBvcnQgY2xhc3MgTWF0TXVsUGFja2VkUHJvZ3JhbSBpbXBsZW1lbnRzIEdQR1BVUHJvZ3JhbSB7XG4gIHZhcmlhYmxlTmFtZXMgPSBbJ21hdHJpeEEnLCAnbWF0cml4QiddO1xuICBwYWNrZWRJbnB1dHMgPSB0cnVlO1xuICBwYWNrZWRPdXRwdXQgPSB0cnVlO1xuICBvdXRwdXRTaGFwZTogbnVtYmVyW107XG4gIHVzZXJDb2RlOiBzdHJpbmc7XG4gIGVuYWJsZVNoYXBlVW5pZm9ybXM6IGJvb2xlYW47XG5cbiAgY29uc3RydWN0b3IoXG4gICAgICBhU2hhcGU6IFtudW1iZXIsIG51bWJlciwgbnVtYmVyXSwgYlNoYXBlOiBbbnVtYmVyLCBudW1iZXIsIG51bWJlcl0sXG4gICAgICBvdXRwdXRTaGFwZTogW251bWJlciwgbnVtYmVyLCBudW1iZXJdLCB0cmFuc3Bvc2VBID0gZmFsc2UsXG4gICAgICB0cmFuc3Bvc2VCID0gZmFsc2UsIGFkZEJpYXMgPSBmYWxzZSwgYWN0aXZhdGlvbjogc3RyaW5nID0gbnVsbCxcbiAgICAgIGhhc1ByZWx1QWN0aXZhdGlvbiA9IGZhbHNlLCBoYXNMZWFreXJlbHVBY3RpdmF0aW9uID0gZmFsc2UpIHtcbiAgICB0aGlzLm91dHB1dFNoYXBlID0gb3V0cHV0U2hhcGU7XG4gICAgdGhpcy5lbmFibGVTaGFwZVVuaWZvcm1zID0gdXNlU2hhcGVVbmlmb3Jtcyh0aGlzLm91dHB1dFNoYXBlLmxlbmd0aCk7XG5cbiAgICBjb25zdCBzaGFyZWREaW0gPSB0cmFuc3Bvc2VBID8gYVNoYXBlWzFdIDogYVNoYXBlWzJdO1xuICAgIGNvbnN0IHNoYXJlZERpbWVuc2lvblBhY2tlZCA9IE1hdGguY2VpbChzaGFyZWREaW0gLyAyKTtcblxuICAgIGNvbnN0IGFTYW1wbGUgPSB0cmFuc3Bvc2VBID8gJ2kgKiAyLCByYy55JyA6ICdyYy55LCBpICogMic7XG4gICAgY29uc3QgYlNhbXBsZSA9IHRyYW5zcG9zZUIgPyAncmMueiwgaSAqIDInIDogJ2kgKiAyLCByYy56JztcbiAgICBjb25zdCBhU3dpenpsZSA9IHRyYW5zcG9zZUEgPyBbJ2EueHh5eScsICdhLnp6d3cnXSA6IFsnYS54eHp6JywgJ2EueXl3dyddO1xuICAgIGNvbnN0IGJTd2l6emxlID0gdHJhbnNwb3NlQiA/IFsnYi54enh6JywgJ2IueXd5dyddIDogWydiLnh5eHknLCAnYi56d3p3J107XG5cbiAgICBsZXQgYWN0aXZhdGlvblNuaXBwZXQgPSAnJywgYXBwbHlBY3RpdmF0aW9uU25pcHBldCA9ICcnO1xuICAgIGlmIChhY3RpdmF0aW9uKSB7XG4gICAgICBpZiAoaGFzUHJlbHVBY3RpdmF0aW9uKSB7XG4gICAgICAgIGFjdGl2YXRpb25TbmlwcGV0ID0gYHZlYzQgYWN0aXZhdGlvbih2ZWM0IGEpIHtcbiAgICAgICAgICB2ZWM0IGIgPSBnZXRQcmVsdUFjdGl2YXRpb25XZWlnaHRzQXRPdXRDb29yZHMoKTtcbiAgICAgICAgICAke2FjdGl2YXRpb259XG4gICAgICAgIH1gO1xuICAgICAgfSBlbHNlIGlmIChoYXNMZWFreXJlbHVBY3RpdmF0aW9uKSB7XG4gICAgICAgIGFjdGl2YXRpb25TbmlwcGV0ID0gYHZlYzQgYWN0aXZhdGlvbih2ZWM0IGEpIHtcbiAgICAgICAgICB2ZWM0IGIgPSBnZXRMZWFreXJlbHVBbHBoYUF0T3V0Q29vcmRzKCk7XG4gICAgICAgICAgJHthY3RpdmF0aW9ufVxuICAgICAgICB9YDtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIGFjdGl2YXRpb25TbmlwcGV0ID0gYHZlYzQgYWN0aXZhdGlvbih2ZWM0IHgpIHtcbiAgICAgICAgICAke2FjdGl2YXRpb259XG4gICAgICAgIH1gO1xuICAgICAgfVxuXG4gICAgICBhcHBseUFjdGl2YXRpb25TbmlwcGV0ID0gYHJlc3VsdCA9IGFjdGl2YXRpb24ocmVzdWx0KTtgO1xuICAgIH1cblxuICAgIGNvbnN0IGFkZEJpYXNTbmlwcGV0ID0gYWRkQmlhcyA/ICdyZXN1bHQgKz0gZ2V0Qmlhc0F0T3V0Q29vcmRzKCk7JyA6ICcnO1xuICAgIGlmIChhZGRCaWFzKSB7XG4gICAgICB0aGlzLnZhcmlhYmxlTmFtZXMucHVzaCgnYmlhcycpO1xuICAgIH1cblxuICAgIGlmIChoYXNQcmVsdUFjdGl2YXRpb24pIHtcbiAgICAgIHRoaXMudmFyaWFibGVOYW1lcy5wdXNoKCdwcmVsdUFjdGl2YXRpb25XZWlnaHRzJyk7XG4gICAgfVxuXG4gICAgaWYgKGhhc0xlYWt5cmVsdUFjdGl2YXRpb24pIHtcbiAgICAgIHRoaXMudmFyaWFibGVOYW1lcy5wdXNoKCdsZWFreXJlbHVBbHBoYScpO1xuICAgIH1cblxuICAgIGxldCBiYXRjaEFTbmlwcGV0ID0gJ3JjLngnO1xuICAgIGxldCBiYXRjaEJTbmlwcGV0ID0gJ3JjLngnO1xuICAgIGlmIChhU2hhcGVbMF0gPCBiU2hhcGVbMF0pIHtcbiAgICAgIGJhdGNoQVNuaXBwZXQgPSBgaW50KG1pbihmbG9hdChyYy54KSwgJHthU2hhcGVbMF0gLSAxfS4pKWA7XG4gICAgfSBlbHNlIGlmIChiU2hhcGVbMF0gPCBhU2hhcGVbMF0pIHtcbiAgICAgIGJhdGNoQlNuaXBwZXQgPSBgaW50KG1pbihmbG9hdChyYy54KSwgJHtiU2hhcGVbMF0gLSAxfS4pKWA7XG4gICAgfVxuXG4gICAgdGhpcy51c2VyQ29kZSA9IGBcbiAgICAgICR7YWN0aXZhdGlvblNuaXBwZXR9XG4gICAgICAvLyBEb24ndCB1c2UgdW5pZm9ybSBmb3Igc2hhcmVkRGltZW5zaW9uUGFja2VkIGZvciBwZXJmb3JtYW5jZS5cbiAgICAgIGNvbnN0IGZsb2F0IHNoYXJlZERpbWVuc2lvbiA9ICR7c2hhcmVkRGltZW5zaW9uUGFja2VkfS4wO1xuXG4gICAgICB2ZWM0IGRvdDJ4MkFSb3dCQ29sKGl2ZWMzIHJjKSB7XG4gICAgICAgIHZlYzQgcmVzdWx0ID0gdmVjNCgwKTtcbiAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCAke3NoYXJlZERpbWVuc2lvblBhY2tlZH07IGkrKykge1xuICAgICAgICAgIGludCBiYXRjaEEgPSAke2JhdGNoQVNuaXBwZXR9O1xuICAgICAgICAgIGludCBiYXRjaEIgPSAke2JhdGNoQlNuaXBwZXR9O1xuICAgICAgICAgIHZlYzQgYSA9IGdldE1hdHJpeEEoYmF0Y2hBLCAke2FTYW1wbGV9KTtcbiAgICAgICAgICB2ZWM0IGIgPSBnZXRNYXRyaXhCKGJhdGNoQiwgJHtiU2FtcGxlfSk7XG5cbiAgICAgICAgICAvLyBUaGVzZSBzd2l6emxlZCBwcm9kdWN0cyBuZWVkIHRvIGJlIHNlcGFyYXRlbHkgYWRkZWQuXG4gICAgICAgICAgLy8gU2VlOiBodHRwczovL2dpdGh1Yi5jb20vdGVuc29yZmxvdy90ZmpzL2lzc3Vlcy8xNzM1XG4gICAgICAgICAgcmVzdWx0ICs9ICgke2FTd2l6emxlWzBdfSAqICR7YlN3aXp6bGVbMF19KTtcbiAgICAgICAgICByZXN1bHQgKz0gKCR7YVN3aXp6bGVbMV19ICogJHtiU3dpenpsZVsxXX0pO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiByZXN1bHQ7XG4gICAgICB9XG5cbiAgICAgIHZvaWQgbWFpbigpIHtcbiAgICAgICAgaXZlYzMgcmMgPSBnZXRPdXRwdXRDb29yZHMoKTtcbiAgICAgICAgdmVjNCByZXN1bHQgPSBkb3QyeDJBUm93QkNvbChyYyk7XG5cbiAgICAgICAgJHthZGRCaWFzU25pcHBldH1cblxuICAgICAgICAke2FwcGx5QWN0aXZhdGlvblNuaXBwZXR9XG5cbiAgICAgICAgc2V0T3V0cHV0KHJlc3VsdCk7XG4gICAgICB9XG4gICAgYDtcbiAgfVxufVxuIl19","/**\n * @license\n * Copyright 2018 Google LLC. All Rights Reserved.\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n * =============================================================================\n */\nimport { backend_util } from '@tensorflow/tfjs-core';\n// (Ar + Ai)(Br + Bi) =\n// ArBr + ArBi + AiBr + AiBi = ArBr - AB + ArBi + AiBr\n// Yr = ArBr - AB\n// Yi = ArBi + AiBr\nexport const COMPLEX_MULTIPLY = {\n REAL: 'return areal * breal - aimag * bimag;',\n IMAG: 'return areal * bimag + aimag * breal;'\n};\nexport class BinaryOpComplexProgram {\n constructor(op, aShape, bShape) {\n this.variableNames = ['AReal', 'AImag', 'BReal', 'BImag'];\n this.outputShape = backend_util.assertAndGetBroadcastShape(aShape, bShape);\n this.userCode = `\n float binaryOpComplex(\n float areal, float aimag, float breal, float bimag) {\n ${op}\n }\n\n void main() {\n float areal = getARealAtOutCoords();\n float aimag = getAImagAtOutCoords();\n float breal = getBRealAtOutCoords();\n float bimag = getBImagAtOutCoords();\n setOutput(binaryOpComplex(areal, aimag, breal, bimag));\n }\n `;\n }\n}\n//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYmluYXJ5b3BfY29tcGxleF9ncHUuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi90ZmpzLWJhY2tlbmQtd2ViZ2wvc3JjL2JpbmFyeW9wX2NvbXBsZXhfZ3B1LnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBOzs7Ozs7Ozs7Ozs7Ozs7R0FlRztBQUVILE9BQU8sRUFBQyxZQUFZLEVBQUMsTUFBTSx1QkFBdUIsQ0FBQztBQUduRCx1QkFBdUI7QUFDdkIsc0RBQXNEO0FBQ3RELGlCQUFpQjtBQUNqQixtQkFBbUI7QUFDbkIsTUFBTSxDQUFDLE1BQU0sZ0JBQWdCLEdBQUc7SUFDOUIsSUFBSSxFQUFFLHVDQUF1QztJQUM3QyxJQUFJLEVBQUUsdUNBQXVDO0NBQzlDLENBQUM7QUFFRixNQUFNLE9BQU8sc0JBQXNCO0lBS2pDLFlBQVksRUFBVSxFQUFFLE1BQWdCLEVBQUUsTUFBZ0I7UUFKMUQsa0JBQWEsR0FBRyxDQUFDLE9BQU8sRUFBRSxPQUFPLEVBQUUsT0FBTyxFQUFFLE9BQU8sQ0FBQyxDQUFDO1FBS25ELElBQUksQ0FBQyxXQUFXLEdBQUcsWUFBWSxDQUFDLDBCQUEwQixDQUFDLE1BQU0sRUFBRSxNQUFNLENBQUMsQ0FBQztRQUUzRSxJQUFJLENBQUMsUUFBUSxHQUFHOzs7VUFHVixFQUFFOzs7Ozs7Ozs7O0tBVVAsQ0FBQztJQUNKLENBQUM7Q0FDRiIsInNvdXJjZXNDb250ZW50IjpbIi8qKlxuICogQGxpY2Vuc2VcbiAqIENvcHlyaWdodCAyMDE4IEdvb2dsZSBMTEMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuXG4gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgXCJMaWNlbnNlXCIpO1xuICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLlxuICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0XG4gKlxuICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wXG4gKlxuICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZVxuICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gXCJBUyBJU1wiIEJBU0lTLFxuICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuXG4gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kXG4gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS5cbiAqID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4gKi9cblxuaW1wb3J0IHtiYWNrZW5kX3V0aWx9IGZyb20gJ0B0ZW5zb3JmbG93L3RmanMtY29yZSc7XG5pbXBvcnQge0dQR1BVUHJvZ3JhbX0gZnJvbSAnLi9ncGdwdV9tYXRoJztcblxuLy8gKEFyICsgQWkpKEJyICsgQmkpID1cbi8vIEFyQnIgKyBBckJpICsgQWlCciArIEFpQmkgPSBBckJyIC0gQUIgKyBBckJpICsgQWlCclxuLy8gWXIgPSBBckJyIC0gQUJcbi8vIFlpID0gQXJCaSArIEFpQnJcbmV4cG9ydCBjb25zdCBDT01QTEVYX01VTFRJUExZID0ge1xuICBSRUFMOiAncmV0dXJuIGFyZWFsICogYnJlYWwgLSBhaW1hZyAqIGJpbWFnOycsXG4gIElNQUc6ICdyZXR1cm4gYXJlYWwgKiBiaW1hZyArIGFpbWFnICogYnJlYWw7J1xufTtcblxuZXhwb3J0IGNsYXNzIEJpbmFyeU9wQ29tcGxleFByb2dyYW0gaW1wbGVtZW50cyBHUEdQVVByb2dyYW0ge1xuICB2YXJpYWJsZU5hbWVzID0gWydBUmVhbCcsICdBSW1hZycsICdCUmVhbCcsICdCSW1hZyddO1xuICB1c2VyQ29kZTogc3RyaW5nO1xuICBvdXRwdXRTaGFwZTogbnVtYmVyW107XG5cbiAgY29uc3RydWN0b3Iob3A6IHN0cmluZywgYVNoYXBlOiBudW1iZXJbXSwgYlNoYXBlOiBudW1iZXJbXSkge1xuICAgIHRoaXMub3V0cHV0U2hhcGUgPSBiYWNrZW5kX3V0aWwuYXNzZXJ0QW5kR2V0QnJvYWRjYXN0U2hhcGUoYVNoYXBlLCBiU2hhcGUpO1xuXG4gICAgdGhpcy51c2VyQ29kZSA9IGBcbiAgICAgIGZsb2F0IGJpbmFyeU9wQ29tcGxleChcbiAgICAgICAgICBmbG9hdCBhcmVhbCwgZmxvYXQgYWltYWcsIGZsb2F0IGJyZWFsLCBmbG9hdCBiaW1hZykge1xuICAgICAgICAke29wfVxuICAgICAgfVxuXG4gICAgICB2b2lkIG1haW4oKSB7XG4gICAgICAgIGZsb2F0IGFyZWFsID0gZ2V0QVJlYWxBdE91dENvb3JkcygpO1xuICAgICAgICBmbG9hdCBhaW1hZyA9IGdldEFJbWFnQXRPdXRDb29yZHMoKTtcbiAgICAgICAgZmxvYXQgYnJlYWwgPSBnZXRCUmVhbEF0T3V0Q29vcmRzKCk7XG4gICAgICAgIGZsb2F0IGJpbWFnID0gZ2V0QkltYWdBdE91dENvb3JkcygpO1xuICAgICAgICBzZXRPdXRwdXQoYmluYXJ5T3BDb21wbGV4KGFyZWFsLCBhaW1hZywgYnJlYWwsIGJpbWFnKSk7XG4gICAgICB9XG4gICAgYDtcbiAgfVxufVxuIl19","/**\n * @license\n * Copyright 2020 Google LLC. All Rights Reserved.\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n * =============================================================================\n */\nimport { backend_util, env, Multiply } from '@tensorflow/tfjs-core';\nimport * as binaryop_complex_gpu from '../binaryop_complex_gpu';\nimport { BinaryOpComplexProgram } from '../binaryop_complex_gpu';\nimport { BinaryOpProgram } from '../binaryop_gpu';\nimport { BinaryOpPackedProgram } from '../binaryop_packed_gpu';\nimport { multiplyImplCPU as cpuMultiply } from '../kernel_utils/shared';\nimport { complex } from './Complex';\nconst MUL = 'return a * b;';\nexport function multiply(args) {\n const { inputs, backend } = args;\n const { a, b } = inputs;\n const dtype = backend_util.upcastType(a.dtype, b.dtype);\n if (a.dtype === 'complex64') {\n const aData = backend.texData.get(a.dataId);\n const bData = backend.texData.get(b.dataId);\n const realProgram = new BinaryOpComplexProgram(binaryop_complex_gpu.COMPLEX_MULTIPLY.REAL, a.shape, b.shape);\n const imagProgram = new BinaryOpComplexProgram(binaryop_complex_gpu.COMPLEX_MULTIPLY.IMAG, a.shape, b.shape);\n const inputs = [\n {\n dataId: aData.complexTensorInfos.real.dataId,\n dtype: aData.complexTensorInfos.real.dtype,\n shape: a.shape\n },\n {\n dataId: aData.complexTensorInfos.imag.dataId,\n dtype: aData.complexTensorInfos.imag.dtype,\n shape: a.shape\n },\n {\n dataId: bData.complexTensorInfos.real.dataId,\n dtype: bData.complexTensorInfos.real.dtype,\n shape: b.shape\n },\n {\n dataId: bData.complexTensorInfos.imag.dataId,\n dtype: bData.complexTensorInfos.imag.dtype,\n shape: b.shape\n }\n ];\n const realPart = backend.runWebGLProgram(realProgram, inputs, 'float32');\n const imagPart = backend.runWebGLProgram(imagProgram, inputs, 'float32');\n const complexOutput = complex({ inputs: { real: realPart, imag: imagPart }, backend });\n backend.disposeIntermediateTensorInfo(realPart);\n backend.disposeIntermediateTensorInfo(imagPart);\n // TODO(annxingyuan): CPU forwarding for complex inputs.\n return complexOutput;\n }\n if (backend.shouldExecuteOnCPU([a, b])) {\n const aData = backend.texData.get(a.dataId);\n const bData = backend.texData.get(b.dataId);\n const [outValues, outShape] = cpuMultiply(a.shape, b.shape, aData.values, bData.values, dtype);\n const out = backend.makeTensorInfo(outShape, dtype);\n const outData = backend.texData.get(out.dataId);\n outData.values = outValues;\n return out;\n }\n let program;\n if (env().getBool('WEBGL_PACK_BINARY_OPERATIONS')) {\n program = new BinaryOpPackedProgram(MUL, a.shape, b.shape);\n }\n else {\n program = new BinaryOpProgram(MUL, a.shape, b.shape);\n }\n return backend.runWebGLProgram(program, [a, b], dtype);\n}\nexport const multiplyConfig = {\n kernelName: Multiply,\n backendName: 'webgl',\n kernelFunc: multiply\n};\n//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiTXVsdGlwbHkuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi8uLi90ZmpzLWJhY2tlbmQtd2ViZ2wvc3JjL2tlcm5lbHMvTXVsdGlwbHkudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUE7Ozs7Ozs7Ozs7Ozs7OztHQWVHO0FBRUgsT0FBTyxFQUFDLFlBQVksRUFBZ0IsR0FBRyxFQUFnQixRQUFRLEVBQXlCLE1BQU0sdUJBQXVCLENBQUM7QUFHdEgsT0FBTyxLQUFLLG9CQUFvQixNQUFNLHlCQUF5QixDQUFDO0FBQ2hFLE9BQU8sRUFBQyxzQkFBc0IsRUFBQyxNQUFNLHlCQUF5QixDQUFDO0FBQy9ELE9BQU8sRUFBQyxlQUFlLEVBQUMsTUFBTSxpQkFBaUIsQ0FBQztBQUNoRCxPQUFPLEVBQUMscUJBQXFCLEVBQUMsTUFBTSx3QkFBd0IsQ0FBQztBQUM3RCxPQUFPLEVBQUMsZUFBZSxJQUFJLFdBQVcsRUFBQyxNQUFNLHdCQUF3QixDQUFDO0FBRXRFLE9BQU8sRUFBQyxPQUFPLEVBQUMsTUFBTSxXQUFXLENBQUM7QUFFbEMsTUFBTSxHQUFHLEdBQUcsZUFBZSxDQUFDO0FBRTVCLE1BQU0sVUFBVSxRQUFRLENBQ3BCLElBQXVEO0lBQ3pELE1BQU0sRUFBQyxNQUFNLEVBQUUsT0FBTyxFQUFDLEdBQUcsSUFBSSxDQUFDO0lBQy9CLE1BQU0sRUFBQyxDQUFDLEVBQUUsQ0FBQyxFQUFDLEdBQUcsTUFBTSxDQUFDO0lBQ3RCLE1BQU0sS0FBSyxHQUFHLFlBQVksQ0FBQyxVQUFVLENBQUMsQ0FBQyxDQUFDLEtBQUssRUFBRSxDQUFDLENBQUMsS0FBSyxDQUFDLENBQUM7SUFFeEQsSUFBSSxDQUFDLENBQUMsS0FBSyxLQUFLLFdBQVcsRUFBRTtRQUMzQixNQUFNLEtBQUssR0FBRyxPQUFPLENBQUMsT0FBTyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsTUFBTSxDQUFDLENBQUM7UUFDNUMsTUFBTSxLQUFLLEdBQUcsT0FBTyxD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LE1BQU0sQ0FBQyxDQUFDO1FBQ2hELE9BQU8sQ0FBQyxNQUFNLEdBQUcsU0FBUyxDQUFDO1FBQzNCLE9BQU8sR0FBRyxDQUFDO0tBQ1o7SUFFRCxJQUFJLE9BQThDLENBQUM7SUFDbkQsSUFBSSxHQUFHLEVBQUUsQ0FBQyxPQUFPLENBQUMsOEJBQThCLENBQUMsRUFBRTtRQUNqRCxPQUFPLEdBQUcsSUFBSSxxQkFBcUIsQ0FBQyxHQUFHLEVBQUUsQ0FBQyxDQUFDLEtBQUssRUFBRSxDQUFDLENBQUMsS0FBSyxDQUFDLENBQUM7S0FDNUQ7U0FBTTtRQUNMLE9BQU8sR0FBRyxJQUFJLGVBQWUsQ0FBQyxHQUFHLEVBQUUsQ0FBQyxDQUFDLEtBQUssRUFBRSxDQUFDLENBQUMsS0FBSyxDQUFDLENBQUM7S0FDdEQ7SUFFRCxPQUFPLE9BQU8sQ0FBQyxlQUFlLENBQUMsT0FBTyxFQUFFLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxFQUFFLEtBQUssQ0FBQyxDQUFDO0FBQ3pELENBQUM7QUFFRCxNQUFNLENBQUMsTUFBTSxjQUFjLEdBQWlCO0lBQzFDLFVBQVUsRUFBRSxRQUFRO0lBQ3BCLFdBQVcsRUFBRSxPQUFPO0lBQ3BCLFVBQVUsRUFBRSxRQUFRO0NBQ3JCLENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyIvKipcbiAqIEBsaWNlbnNlXG4gKiBDb3B5cmlnaHQgMjAyMCBHb29nbGUgTExDLiBBbGwgUmlnaHRzIFJlc2VydmVkLlxuICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlIFwiTGljZW5zZVwiKTtcbiAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS5cbiAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdFxuICpcbiAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMFxuICpcbiAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmVcbiAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuIFwiQVMgSVNcIiBCQVNJUyxcbiAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLlxuICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZFxuICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuXG4gKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuICovXG5cbmltcG9ydCB7YmFja2VuZF91dGlsLCBCaW5hcnlJbnB1dHMsIGVudiwgS2VybmVsQ29uZmlnLCBNdWx0aXBseSwgVGVuc29ySW5mbywgVHlwZWRBcnJheX0gZnJvbSAnQHRlbnNvcmZsb3cvdGZqcy1jb3JlJztcblxuaW1wb3J0IHtNYXRoQmFja2VuZFdlYkdMfSBmcm9tICcuLi9iYWNrZW5kX3dlYmdsJztcbmltcG9ydCAqIGFzIGJpbmFyeW9wX2NvbXBsZXhfZ3B1IGZyb20gJy4uL2JpbmFyeW9wX2NvbXBsZXhfZ3B1JztcbmltcG9ydCB7QmluYXJ5T3BDb21wbGV4UHJvZ3JhbX0gZnJvbSAnLi4vYmluYXJ5b3BfY29tcGxleF9ncHUnO1xuaW1wb3J0IHtCaW5hcnlPcFByb2dyYW19IGZyb20gJy4uL2JpbmFyeW9wX2dwdSc7XG5pbXBvcnQge0JpbmFyeU9wUGFja2VkUHJvZ3JhbX0gZnJvbSAnLi4vYmluYXJ5b3BfcGFja2VkX2dwdSc7XG5pbXBvcnQge211bHRpcGx5SW1wbENQVSBhcyBjcHVNdWx0aXBseX0gZnJvbSAnLi4va2VybmVsX3V0aWxzL3NoYXJlZCc7XG5cbmltcG9ydCB7Y29tcGxleH0gZnJvbSAnLi9Db21wbGV4JztcblxuY29uc3QgTVVMID0gJ3JldHVybiBhICogYjsnO1xuXG5leHBvcnQgZnVuY3Rpb24gbXVsdGlwbHkoXG4gICAgYXJnczoge2lucHV0czogQmluYXJ5SW5wdXRzLCBiYWNrZW5kOiBNYXRoQmFja2VuZFdlYkdMfSk6IFRlbnNvckluZm8ge1xuICBjb25zdCB7aW5wdXRzLCBiYWNrZW5kfSA9IGFyZ3M7XG4gIGNvbnN0IHthLCBifSA9IGlucHV0cztcbiAgY29uc3QgZHR5cGUgPSBiYWNrZW5kX3V0aWwudXBjYXN0VHlwZShhLmR0eXBlLCBiLmR0eXBlKTtcblxuICBpZiAoYS5kdHlwZSA9PT0gJ2NvbXBsZXg2NCcpIHtcbiAgICBjb25zdCBhRGF0YSA9IGJhY2tlbmQudGV4RGF0YS5nZXQoYS5kYXRhSWQpO1xuICAgIGNvbnN0IGJEYXRhID0gYmFja2VuZC50ZXhEYXRhLmdldChiLmRhdGFJZCk7XG5cbiAgICBjb25zdCByZWFsUHJvZ3JhbSA9IG5ldyBCaW5hcnlPcENvbXBsZXhQcm9ncmFtKFxuICAgICAgICBiaW5hcnlvcF9jb21wbGV4X2dwdS5DT01QTEVYX01VTFRJUExZLlJFQUwsIGEuc2hhcGUsIGIuc2hhcGUpO1xuICAgIGNvbnN0IGltYWdQcm9ncmFtID0gbmV3IEJpbmFyeU9wQ29tcGxleFByb2dyYW0oXG4gICAgICAgIGJpbmFyeW9wX2NvbXBsZXhfZ3B1LkNPTVBMRVhfTVVMVElQTFkuSU1BRywgYS5zaGFwZSwgYi5zaGFwZSk7XG5cbiAgICBjb25zdCBpbnB1dHMgPSBbXG4gICAgICB7XG4gICAgICAgIGRhdGFJZDogYURhdGEuY29tcGxleFRlbnNvckluZm9zLnJlYWwuZGF0YUlkLFxuICAgICAgICBkdHlwZTogYURhdGEuY29tcGxleFRlbnNvckluZm9zLnJlYWwuZHR5cGUsXG4gICAgICAgIHNoYXBlOiBhLnNoYXBlXG4gICAgICB9LFxuICAgICAge1xuICAgICAgICBkYXRhSWQ6IGFEYXRhLmNvbXBsZXhUZW5zb3JJbmZvcy5pbWFnLmRhdGFJZCxcbiAgICAgICAgZHR5cGU6IGFEYXRhLmNvbXBsZXhUZW5zb3JJbmZvcy5pbWFnLmR0eXBlLFxuICAgICAgICBzaGFwZTogYS5zaGFwZVxuICAgICAgfSxcbiAgICAgIHtcbiAgICAgICAgZGF0YUlkOiBiRGF0YS5jb21wbGV4VGVuc29ySW5mb3MucmVhbC5kYXRhSWQsXG4gICAgICAgIGR0eXBlOiBiRGF0YS5jb21wbGV4VGVuc29ySW5mb3MucmVhbC5kdHlwZSxcbiAgICAgICAgc2hhcGU6IGIuc2hhcGVcbiAgICAgIH0sXG4gICAgICB7XG4gICAgICAgIGRhdGFJZDogYkRhdGEuY29tcGxleFRlbnNvckluZm9zLmltYWcuZGF0YUlkLFxuICAgICAgICBkdHlwZTogYkRhdGEuY29tcGxleFRlbnNvckluZm9zLmltYWcuZHR5cGUsXG4gICAgICAgIHNoYXBlOiBiLnNoYXBlXG4gICAgICB9XG4gICAgXTtcblxuICAgIGNvbnN0IHJlYWxQYXJ0ID0gYmFja2VuZC5ydW5XZWJHTFByb2dyYW0ocmVhbFByb2dyYW0sIGlucHV0cywgJ2Zsb2F0MzInKTtcbiAgICBjb25zdCBpbWFnUGFydCA9IGJhY2tlbmQucnVuV2ViR0xQcm9ncmFtKGltYWdQcm9ncmFtLCBpbnB1dHMsICdmbG9hdDMyJyk7XG5cbiAgICBjb25zdCBjb21wbGV4T3V0cHV0ID1cbiAgICAgICAgY29tcGxleCh7aW5wdXRzOiB7cmVhbDogcmVhbFBhcnQsIGltYWc6IGltYWdQYXJ0fSwgYmFja2VuZH0pO1xuXG4gICAgYmFja2VuZC5kaXNwb3NlSW50ZXJtZWRpYXRlVGVuc29ySW5mbyhyZWFsUGFydCk7XG4gICAgYmFja2VuZC5kaXNwb3NlSW50ZXJtZWRpYXRlVGVuc29ySW5mbyhpbWFnUGFydCk7XG5cbiAgICAvLyBUT0RPKGFubnhpbmd5dWFuKTogQ1BVIGZvcndhcmRpbmcgZm9yIGNvbXBsZXggaW5wdXRzLlxuICAgIHJldHVybiBjb21wbGV4T3V0cHV0O1xuICB9XG5cbiAgaWYgKGJhY2tlbmQuc2hvdWxkRXhlY3V0ZU9uQ1BVKFthLCBiXSkpIHtcbiAgICBjb25zdCBhRGF0YSA9IGJhY2tlbmQudGV4RGF0YS5nZXQoYS5kYXRhSWQpO1xuICAgIGNvbnN0IGJEYXRhID0gYmFja2VuZC50ZXhEYXRhLmdldChiLmRhdGFJZCk7XG4gICAgY29uc3QgW291dFZhbHVlcywgb3V0U2hhcGVdID0gY3B1TXVsdGlwbHkoXG4gICAgICAgIGEuc2hhcGUsIGIuc2hhcGUsIGFEYXRhLnZhbHVlcyBhcyBUeXBlZEFycmF5LFxuICAgICAgICBiRGF0YS52YWx1ZXMgYXMgVHlwZWRBcnJheSwgZHR5cGUpO1xuXG4gICAgY29uc3Qgb3V0ID0gYmFja2VuZC5tYWtlVGVuc29ySW5mbyhvdXRTaGFwZSwgZHR5cGUpO1xuICAgIGNvbnN0IG91dERhdGEgPSBiYWNrZW5kLnRleERhdGEuZ2V0KG91dC5kYXRhSWQpO1xuICAgIG91dERhdGEudmFsdWVzID0gb3V0VmFsdWVzO1xuICAgIHJldHVybiBvdXQ7XG4gIH1cblxuICBsZXQgcHJvZ3JhbTogQmluYXJ5T3BQcm9ncmFtfEJpbmFyeU9wUGFja2VkUHJvZ3JhbTtcbiAgaWYgKGVudigpLmdldEJvb2woJ1dFQkdMX1BBQ0tfQklOQVJZX09QRVJBVElPTlMnKSkge1xuICAgIHByb2dyYW0gPSBuZXcgQmluYXJ5T3BQYWNrZWRQcm9ncmFtKE1VTCwgYS5zaGFwZSwgYi5zaGFwZSk7XG4gIH0gZWxzZSB7XG4gICAgcHJvZ3JhbSA9IG5ldyBCaW5hcnlPcFByb2dyYW0oTVVMLCBhLnNoYXBlLCBiLnNoYXBlKTtcbiAgfVxuXG4gIHJldHVybiBiYWNrZW5kLnJ1bldlYkdMUHJvZ3JhbShwcm9ncmFtLCBbYSwgYl0sIGR0eXBlKTtcbn1cblxuZXhwb3J0IGNvbnN0IG11bHRpcGx5Q29uZmlnOiBLZXJuZWxDb25maWcgPSB7XG4gIGtlcm5lbE5hbWU6IE11bHRpcGx5LFxuICBiYWNrZW5kTmFtZTogJ3dlYmdsJyxcbiAga2VybmVsRnVuYzogbXVsdGlwbHlcbn07XG4iXX0=","/**\n * @license\n * Copyright 2020 Google LLC. All Rights Reserved.\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n * =============================================================================\n */\nimport { Reshape, util } from '@tensorflow/tfjs-core';\nimport { packedReshape } from '../kernel_utils/reshape';\nimport { isReshapeFree } from '../webgl_util';\nexport function reshape(args) {\n const { inputs, backend, attrs } = args;\n const { x } = inputs;\n const { shape } = attrs;\n const webglBackend = backend;\n const xSize = util.sizeFromShape(x.shape);\n const $shape = util.inferFromImplicitShape(shape, xSize);\n const $xSize = util.sizeFromShape($shape);\n util.assert(xSize === $xSize, () => `The new shape (${$shape}) has ${$xSize} elements and the old ` +\n `shape (${x.shape}) has ${xSize} elements. The new shape and old ` +\n `shape must have the same number of elements.`);\n const xTexData = webglBackend.texData.get(x.dataId);\n if (xTexData.isPacked && !isReshapeFree(x.shape, $shape) &&\n !(xTexData.texture !== null && isReshapeFree(xTexData.shape, $shape))) {\n return packedReshape(x, $shape, webglBackend);\n }\n webglBackend.incRef(x.dataId);\n return { dataId: x.dataId, shape: $shape, dtype: x.dtype };\n}\nexport const reshapeConfig = {\n kernelName: Reshape,\n backendName: 'webgl',\n kernelFunc: reshape\n};\n//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiUmVzaGFwZS5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uLy4uL3RmanMtYmFja2VuZC13ZWJnbC9zcmMva2VybmVscy9SZXNoYXBlLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBOzs7Ozs7Ozs7Ozs7Ozs7R0FlRztBQUVILE9BQU8sRUFBMkIsT0FBTyxFQUEyQyxJQUFJLEVBQUMsTUFBTSx1QkFBdUIsQ0FBQztBQUd2SCxPQUFPLEVBQUMsYUFBYSxFQUFDLE1BQU0seUJBQXlCLENBQUM7QUFDdEQsT0FBTyxFQUFDLGFBQWEsRUFBQyxNQUFNLGVBQWUsQ0FBQztBQUU1QyxNQUFNLFVBQVUsT0FBTyxDQUFDLElBSXZCO0lBQ0MsTUFBTSxFQUFDLE1BQU0sRUFBRSxPQUFPLEVBQUUsS0FBSyxFQUFDLEdBQUcsSUFBSSxDQUFDO0lBQ3RDLE1BQU0sRUFBQyxDQUFDLEVBQUMsR0FBRyxNQUFNLENBQUM7SUFDbkIsTUFBTSxFQUFDLEtBQUssRUFBQyxHQUFHLEtBQUssQ0FBQztJQUN0QixNQUFNLFlBQVksR0FBRyxPQUFPLENBQUM7SUFFN0IsTUFBTSxLQUFLLEdBQUcsSUFBSSxDQUFDLGFBQWEsQ0FBQyxDQUFDLENBQUMsS0FBSyxDQUFDLENBQUM7SUFDMUMsTUFBTSxNQUFNLEdBQUcsSUFBSSxDQUFDLHNCQUFzQixDQUFDLEtBQUssRUFBRSxLQUFLLENBQUMsQ0FBQztJQUN6RCxNQUFNLE1BQU0sR0FBRyxJQUFJLENBQUMsYUFBYSxDQUFDLE1BQU0sQ0FBQyxDQUFDO0lBRTFDLElBQUksQ0FBQyxNQUFNLENBQ1AsS0FBSyxLQUFLLE1BQU0sRUFDaEIsR0FBRyxFQUFFLENBQUMsa0JBQWtCLE1BQU0sU0FBUyxNQUFNLHdCQUF3QjtRQUNqRSxVQUFVLENBQUMsQ0FBQyxLQUFLLFNBQVMsS0FBSyxtQ0FBbUM7UUFDbEUsOENBQThDLENBQUMsQ0FBQztJQUV4RCxNQUFNLFFBQVEsR0FBRyxZQUFZLENBQUMsT0FBTyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsTUFBTSxDQUFDLENBQUM7SUFDcEQsSUFBSSxRQUFRLENBQUMsUUFBUSxJQUFJLENBQUMsYUFBYSxDQUFDLENBQUMsQ0FBQyxLQUFLLEVBQUUsTUFBTSxDQUFDO1FBQ3BELENBQUMsQ0FBQyxRQUFRLENBQUMsT0FBTyxLQUFLLElBQUksSUFBSSxhQUFhLENBQUMsUUFBUSxDQUFDLEtBQUssRUFBRSxNQUFNLENBQUMsQ0FBQyxFQUFFO1FBQ3pFLE9BQU8sYUFBYSxDQUFDLENBQUMsRUFBRSxNQUFNLEVBQUUsWUFBWSxDQUFDLENBQUM7S0FDL0M7SUFFRCxZQUFZLENBQUMsTUFBTSxDQUFDLENBQUMsQ0FBQyxNQUFNLENBQUMsQ0FBQztJQUU5QixPQUFPLEVBQUMsTUFBTSxFQUFFLENBQUMsQ0FBQyxNQUFNLEVBQUUsS0FBSyxFQUFFLE1BQU0sRUFBRSxLQUFLLEVBQUUsQ0FBQyxDQUFDLEtBQUssRUFBQyxDQUFDO0FBQzNELENBQUM7QUFFRCxNQUFNLENBQUMsTUFBTSxhQUFhLEdBQWlCO0lBQ3pDLFVBQVUsRUFBRSxPQUFPO0lBQ25CLFdBQVcsRUFBRSxPQUFPO0lBQ3BCLFVBQVUsRUFBRSxPQUEyQjtDQUN4QyxDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiLyoqXG4gKiBAbGljZW5zZVxuICogQ29weXJpZ2h0IDIwMjAgR29vZ2xlIExMQy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC5cbiAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSBcIkxpY2Vuc2VcIik7XG4gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuXG4gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXRcbiAqXG4gKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjBcbiAqXG4gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlXG4gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiBcIkFTIElTXCIgQkFTSVMsXG4gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC5cbiAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmRcbiAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLlxuICogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbiAqL1xuXG5pbXBvcnQge0tlcm5lbENvbmZpZywgS2VybmVsRnVuYywgUmVzaGFwZSwgUmVzaGFwZUF0dHJzLCBSZXNoYXBlSW5wdXRzLCBUZW5zb3JJbmZvLCB1dGlsfSBmcm9tICdAdGVuc29yZmxvdy90ZmpzLWNvcmUnO1xuXG5pbXBvcnQge01hdGhCYWNrZW5kV2ViR0x9IGZyb20gJy4uL2JhY2tlbmRfd2ViZ2wnO1xuaW1wb3J0IHtwYWNrZWRSZXNoYXBlfSBmcm9tICcuLi9rZXJuZWxfdXRpbHMvcmVzaGFwZSc7XG5pbXBvcnQge2lzUmVzaGFwZUZyZWV9IGZyb20gJy4uL3dlYmdsX3V0aWwnO1xuXG5leHBvcnQgZnVuY3Rpb24gcmVzaGFwZShhcmdzOiB7XG4gIGlucHV0czogUmVzaGFwZUlucHV0cyxcbiAgYmFja2VuZDogTWF0aEJhY2tlbmRXZWJHTCxcbiAgYXR0cnM6IFJlc2hhcGVBdHRyc1xufSk6IFRlbnNvckluZm8ge1xuICBjb25zdCB7aW5wdXRzLCBiYWNrZW5kLCBhdHRyc30gPSBhcmdzO1xuICBjb25zdCB7eH0gPSBpbnB1dHM7XG4gIGNvbnN0IHtzaGFwZX0gPSBhdHRycztcbiAgY29uc3Qgd2ViZ2xCYWNrZW5kID0gYmFja2VuZDtcblxuICBjb25zdCB4U2l6ZSA9IHV0aWwuc2l6ZUZyb21TaGFwZSh4LnNoYXBlKTtcbiAgY29uc3QgJHNoYXBlID0gdXRpbC5pbmZlckZyb21JbXBsaWNpdFNoYXBlKHNoYXBlLCB4U2l6ZSk7XG4gIGNvbnN0ICR4U2l6ZSA9IHV0aWwuc2l6ZUZyb21TaGFwZSgkc2hhcGUpO1xuXG4gIHV0aWwuYXNzZXJ0KFxuICAgICAgeFNpemUgPT09ICR4U2l6ZSxcbiAgICAgICgpID0+IGBUaGUgbmV3IHNoYXBlICgkeyRzaGFwZX0pIGhhcyAkeyR4U2l6ZX0gZWxlbWVudHMgYW5kIHRoZSBvbGQgYCArXG4gICAgICAgICAgYHNoYXBlICgke3guc2hhcGV9KSBoYXMgJHt4U2l6ZX0gZWxlbWVudHMuIFRoZSBuZXcgc2hhcGUgYW5kIG9sZCBgICtcbiAgICAgICAgICBgc2hhcGUgbXVzdCBoYXZlIHRoZSBzYW1lIG51bWJlciBvZiBlbGVtZW50cy5gKTtcblxuICBjb25zdCB4VGV4RGF0YSA9IHdlYmdsQmFja2VuZC50ZXhEYXRhLmdldCh4LmRhdGFJZCk7XG4gIGlmICh4VGV4RGF0YS5pc1BhY2tlZCAmJiAhaXNSZXNoYXBlRnJlZSh4LnNoYXBlLCAkc2hhcGUpICYmXG4gICAgICAhKHhUZXhEYXRhLnRleHR1cmUgIT09IG51bGwgJiYgaXNSZXNoYXBlRnJlZSh4VGV4RGF0YS5zaGFwZSwgJHNoYXBlKSkpIHtcbiAgICByZXR1cm4gcGFja2VkUmVzaGFwZSh4LCAkc2hhcGUsIHdlYmdsQmFja2VuZCk7XG4gIH1cblxuICB3ZWJnbEJhY2tlbmQuaW5jUmVmKHguZGF0YUlkKTtcblxuICByZXR1cm4ge2RhdGFJZDogeC5kYXRhSWQsIHNoYXBlOiAkc2hhcGUsIGR0eXBlOiB4LmR0eXBlfTtcbn1cblxuZXhwb3J0IGNvbnN0IHJlc2hhcGVDb25maWc6IEtlcm5lbENvbmZpZyA9IHtcbiAga2VybmVsTmFtZTogUmVzaGFwZSxcbiAgYmFja2VuZE5hbWU6ICd3ZWJnbCcsXG4gIGtlcm5lbEZ1bmM6IHJlc2hhcGUgYXMge30gYXMgS2VybmVsRnVuY1xufTtcbiJdfQ==","/**\n * @license\n * Copyright 2020 Google LLC. All Rights Reserved.\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n * =============================================================================\n */\nimport { ReshapePackedProgram } from '../reshape_packed_gpu';\nimport { getBatchDim, getRowsCols } from '../webgl_util';\nexport function packedReshape(input, afterShape, backend) {\n const input3DShape = [getBatchDim(input.shape),\n ...getRowsCols(input.shape)];\n const input3D = {\n dtype: input.dtype,\n shape: input3DShape,\n dataId: input.dataId\n };\n const afterShapeAs3D = [getBatchDim(afterShape),\n ...getRowsCols(afterShape)];\n const program = new ReshapePackedProgram(afterShapeAs3D, input3DShape);\n const preventEagerUnpackingOfOutput = true;\n const customValues = [input3DShape];\n const output = backend.runWebGLProgram(program, [input3D], input.dtype, customValues, preventEagerUnpackingOfOutput);\n return { dataId: output.dataId, shape: afterShape, dtype: output.dtype };\n}\n//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicmVzaGFwZS5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uLy4uL3RmanMtYmFja2VuZC13ZWJnbC9zcmMva2VybmVsX3V0aWxzL3Jlc2hhcGUudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUE7Ozs7Ozs7Ozs7Ozs7OztHQWVHO0FBS0gsT0FBTyxFQUFDLG9CQUFvQixFQUFDLE1BQU0sdUJBQXVCLENBQUM7QUFDM0QsT0FBTyxFQUFDLFdBQVcsRUFBRSxXQUFXLEVBQUMsTUFBTSxlQUFlLENBQUM7QUFFdkQsTUFBTSxVQUFVLGFBQWEsQ0FDekIsS0FBaUIsRUFBRSxVQUFvQixFQUN2QyxPQUF5QjtJQUMzQixNQUFNLFlBQVksR0FDZCxDQUFDLFdBQVcsQ0FBQyxLQUFLLENBQUMsS0FBSyxDQUFDO1FBQ3hCLEdBQUcsV0FBVyxDQUFDLEtBQUssQ0FBQyxLQUFLLENBQUMsQ0FBNkIsQ0FBQztJQUM5RCxNQUFNLE9BQU8sR0FBZTtRQUMxQixLQUFLLEVBQUUsS0FBSyxDQUFDLEtBQUs7UUFDbEIsS0FBSyxFQUFFLFlBQVk7UUFDbkIsTUFBTSxFQUFFLEtBQUssQ0FBQyxNQUFNO0tBQ3JCLENBQUM7SUFDRixNQUFNLGNBQWMsR0FDaEIsQ0FBQyxXQUFXLENBQUMsVUFBVSxDQUFDO1FBQ3ZCLEdBQUcsV0FBVyxDQUFDLFVBQVUsQ0FBQyxDQUE2QixDQUFDO0lBRTdELE1BQU0sT0FBTyxHQUFHLElBQUksb0JBQW9CLENBQUMsY0FBYyxFQUFFLFlBQVksQ0FBQyxDQUFDO0lBQ3ZFLE1BQU0sNkJBQTZCLEdBQUcsSUFBSSxDQUFDO0lBQzNDLE1BQU0sWUFBWSxHQUFHLENBQUMsWUFBWSxDQUFDLENBQUM7SUFDcEMsTUFBTSxNQUFNLEdBQUcsT0FBTyxDQUFDLGVBQWUsQ0FDbEMsT0FBTyxFQUFFLENBQUMsT0FBTyxDQUFDLEVBQUUsS0FBSyxDQUFDLEtBQUssRUFBRSxZQUFZLEVBQzdDLDZCQUE2QixDQUFDLENBQUM7SUFDbkMsT0FBTyxFQUFDLE1BQU0sRUFBRSxNQUFNLENBQUMsTUFBTSxFQUFFLEtBQUssRUFBRSxVQUFVLEVBQUUsS0FBSyxFQUFFLE1BQU0sQ0FBQyxLQUFLLEVBQUMsQ0FBQztBQUN6RSxDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiLyoqXG4gKiBAbGljZW5zZVxuICogQ29weXJpZ2h0IDIwMjAgR29vZ2xlIExMQy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC5cbiAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSBcIkxpY2Vuc2VcIik7XG4gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuXG4gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXRcbiAqXG4gKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjBcbiAqXG4gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlXG4gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiBcIkFTIElTXCIgQkFTSVMsXG4gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC5cbiAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmRcbiAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLlxuICogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbiAqL1xuXG5pbXBvcnQge1RlbnNvckluZm99IGZyb20gJ0B0ZW5zb3JmbG93L3RmanMtY29yZSc7XG5cbmltcG9ydCB7TWF0aEJhY2tlbmRXZWJHTH0gZnJvbSAnLi4vYmFja2VuZF93ZWJnbCc7XG5pbXBvcnQge1Jlc2hhcGVQYWNrZWRQcm9ncmFtfSBmcm9tICcuLi9yZXNoYXBlX3BhY2tlZF9ncHUnO1xuaW1wb3J0IHtnZXRCYXRjaERpbSwgZ2V0Um93c0NvbHN9IGZyb20gJy4uL3dlYmdsX3V0aWwnO1xuXG5leHBvcnQgZnVuY3Rpb24gcGFja2VkUmVzaGFwZShcbiAgICBpbnB1dDogVGVuc29ySW5mbywgYWZ0ZXJTaGFwZTogbnVtYmVyW10sXG4gICAgYmFja2VuZDogTWF0aEJhY2tlbmRXZWJHTCk6IFRlbnNvckluZm8ge1xuICBjb25zdCBpbnB1dDNEU2hhcGUgPVxuICAgICAgW2dldEJhdGNoRGltKGlucHV0LnNoYXBlKSxcbiAgICAgICAuLi5nZXRSb3dzQ29scyhpbnB1dC5zaGFwZSldIGFzIFtudW1iZXIsIG51bWJlciwgbnVtYmVyXTtcbiAgY29uc3QgaW5wdXQzRDogVGVuc29ySW5mbyA9IHtcbiAgICBkdHlwZTogaW5wdXQuZHR5cGUsXG4gICAgc2hhcGU6IGlucHV0M0RTaGFwZSxcbiAgICBkYXRhSWQ6IGlucHV0LmRhdGFJZFxuICB9O1xuICBjb25zdCBhZnRlclNoYXBlQXMzRCA9XG4gICAgICBbZ2V0QmF0Y2hEaW0oYWZ0ZXJTaGFwZSksXG4gICAgICAgLi4uZ2V0Um93c0NvbHMoYWZ0ZXJTaGFwZSldIGFzIFtudW1iZXIsIG51bWJlciwgbnVtYmVyXTtcblxuICBjb25zdCBwcm9ncmFtID0gbmV3IFJlc2hhcGVQYWNrZWRQcm9ncmFtKGFmdGVyU2hhcGVBczNELCBpbnB1dDNEU2hhcGUpO1xuICBjb25zdCBwcmV2ZW50RWFnZXJVbnBhY2tpbmdPZk91dHB1dCA9IHRydWU7XG4gIGNvbnN0IGN1c3RvbVZhbHVlcyA9IFtpbnB1dDNEU2hhcGVdO1xuICBjb25zdCBvdXRwdXQgPSBiYWNrZW5kLnJ1bldlYkdMUHJvZ3JhbShcbiAgICAgIHByb2dyYW0sIFtpbnB1dDNEXSwgaW5wdXQuZHR5cGUsIGN1c3RvbVZhbHVlcyxcbiAgICAgIHByZXZlbnRFYWdlclVucGFja2luZ09mT3V0cHV0KTtcbiAgcmV0dXJuIHtkYXRhSWQ6IG91dHB1dC5kYXRhSWQsIHNoYXBlOiBhZnRlclNoYXBlLCBkdHlwZTogb3V0cHV0LmR0eXBlfTtcbn1cbiJdfQ==","/**\n * @license\n * Copyright 2020 Google LLC. All Rights Reserved.\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n * =============================================================================\n */\nimport { util } from '@tensorflow/tfjs-core';\nexport class MeanProgram {\n constructor(reduceInfo, divisor) {\n this.variableNames = ['x'];\n const { windowSize, batchSize, inSize, outSize } = reduceInfo;\n this.outputShape = [batchSize, outSize];\n const windowSizeNearestVec4 = Math.floor(windowSize / 4) * 4;\n const windowSizeVec4Remainder = windowSize % 4;\n let updateSnippet = `sumValue += dot(values, ones);`;\n if (divisor != null) {\n const denominator = 1 / divisor;\n updateSnippet = `sumValue += dot(values * ${util.isInt(denominator) ? denominator.toPrecision(2) :\n denominator}, ones);`;\n }\n let checkOutOfBounds = '';\n if (inSize % windowSize > 0) {\n checkOutOfBounds = `\n if (inIdx < 0 || inIdx >= ${inSize}) {\n return 0.0;\n }\n `;\n }\n this.userCode = `\n const vec4 ones = vec4(1.0, 1.0, 1.0, 1.0);\n\n float getValue(int batch, int inIdx) {\n ${checkOutOfBounds}\n return getX(batch, inIdx);\n }\n\n void main() {\n ivec2 coords = getOutputCoords();\n int batch = coords[0];\n int outIdx = coords[1];\n int inOffset = outIdx * ${windowSize};\n\n float sumValue = 0.0;\n\n for (int i = 0; i < ${windowSizeNearestVec4}; i += 4) {\n int inIdx = inOffset + i;\n vec4 values = vec4(\n getValue(batch, inIdx),\n getValue(batch, inIdx + 1),\n getValue(batch, inIdx + 2),\n getValue(batch, inIdx + 3)\n );\n\n ${updateSnippet}\n }\n\n int inIdx = inOffset + ${windowSizeNearestVec4};\n if (${windowSizeVec4Remainder === 1}) {\n vec4 values = vec4(getValue(batch, inIdx), 0.0, 0.0, 0.0);\n\n ${updateSnippet}\n } else if (${windowSizeVec4Remainder === 2}) {\n vec4 values = vec4(\n getValue(batch, inIdx),\n getValue(batch, inIdx + 1), 0.0, 0.0);\n\n ${updateSnippet}\n } else if (${windowSizeVec4Remainder === 3}) {\n vec4 values = vec4(\n getValue(batch, inIdx),\n getValue(batch, inIdx + 1),\n getValue(batch, inIdx + 2), 0.0);\n\n ${updateSnippet}\n }\n setOutput(sumValue);\n }\n `;\n }\n}\n//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibWVhbl9ncHUuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi90ZmpzLWJhY2tlbmQtd2ViZ2wvc3JjL21lYW5fZ3B1LnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBOzs7Ozs7Ozs7Ozs7Ozs7R0FlRztBQUVILE9BQU8sRUFBZSxJQUFJLEVBQUMsTUFBTSx1QkFBdUIsQ0FBQztBQUd6RCxNQUFNLE9BQU8sV0FBVztJQUt0QixZQUFZLFVBQW1DLEVBQUUsT0FBZ0I7UUFKakUsa0JBQWEsR0FBRyxDQUFDLEdBQUcsQ0FBQyxDQUFDO1FBS3BCLE1BQU0sRUFBQyxVQUFVLEVBQUUsU0FBUyxFQUFFLE1BQU0sRUFBRSxPQUFPLEVBQUMsR0FBRyxVQUFVLENBQUM7UUFDNUQsSUFBSSxDQUFDLFdBQVcsR0FBRyxDQUFDLFNBQVMsRUFBRSxPQUFPLENBQUMsQ0FBQztRQUV4QyxNQUFNLHFCQUFxQixHQUFHLElBQUksQ0FBQyxLQUFLLENBQUMsVUFBVSxHQUFHLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQztRQUM3RCxNQUFNLHVCQUF1QixHQUFHLFVBQVUsR0FBRyxDQUFDLENBQUM7UUFFL0MsSUFBSSxhQUFhLEdBQUcsZ0NBQWdDLENBQUM7UUFDckQsSUFBSSxPQUFPLElBQUksSUFBSSxFQUFFO1lBQ25CLE1BQU0sV0FBVyxHQUFHLENBQUMsR0FBRyxPQUFPLENBQUM7WUFDaEMsYUFBYSxHQUFHLDRCQUNaLElBQUksQ0FBQyxLQUFLLENBQUMsV0FBVyxDQUFDLENBQUMsQ0FBQyxDQUFDLFdBQVcsQ0FBQyxXQUFXLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQztnQkFDNUIsV0FBVyxVQUFVLENBQUM7U0FDckQ7UUFFRCxJQUFJLGdCQUFnQixHQUFHLEVBQUUsQ0FBQztRQUMxQixJQUFJLE1BQU0sR0FBRyxVQUFVLEdBQUcsQ0FBQyxFQUFFO1lBQzNCLGdCQUFnQixHQUFHO29DQUNXLE1BQU07OztPQUduQyxDQUFDO1NBQ0g7UUFFRCxJQUFJLENBQUMsUUFBUSxHQUFHOzs7O1VBSVYsZ0JBQWdCOzs7Ozs7OztrQ0FRUSxVQUFVOzs7OzhCQUlkLHFCQUFxQjs7Ozs7Ozs7O1lBU3ZDLGFBQWE7OztpQ0FHUSxxQkFBcUI7Y0FDeEMsdUJBQXVCLEtBQUssQ0FBQzs7O1lBRy9CLGFBQWE7cUJBQ0osdUJBQXVCLEtBQUssQ0FBQzs7Ozs7WUFLdEMsYUFBYTtxQkFDSix1QkFBdUIsS0FBSyxDQUFDOzs7Ozs7WUFNdEMsYUFBYTs7OztLQUlwQixDQUFDO0lBQ0osQ0FBQztDQUNGIiwic291cmNlc0NvbnRlbnQiOlsiLyoqXG4gKiBAbGljZW5zZVxuICogQ29weXJpZ2h0IDIwMjAgR29vZ2xlIExMQy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC5cbiAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSBcIkxpY2Vuc2VcIik7XG4gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuXG4gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXRcbiAqXG4gKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjBcbiAqXG4gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlXG4gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiBcIkFTIElTXCIgQkFTSVMsXG4gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC5cbiAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmRcbiAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLlxuICogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbiAqL1xuXG5pbXBvcnQge2JhY2tlbmRfdXRpbCwgdXRpbH0gZnJvbSAnQHRlbnNvcmZsb3cvdGZqcy1jb3JlJztcbmltcG9ydCB7R1BHUFVQcm9ncmFtfSBmcm9tICcuL2dwZ3B1X21hdGgnO1xuXG5leHBvcnQgY2xhc3MgTWVhblByb2dyYW0gaW1wbGVtZW50cyBHUEdQVVByb2dyYW0ge1xuICB2YXJpYWJsZU5hbWVzID0gWyd4J107XG4gIG91dHB1dFNoYXBlOiBudW1iZXJbXTtcbiAgdXNlckNvZGU6IHN0cmluZztcblxuICBjb25zdHJ1Y3RvcihyZWR1Y2VJbmZvOiBiYWNrZW5kX3V0aWwuUmVkdWNlSW5mbywgZGl2aXNvcj86IG51bWJlcikge1xuICAgIGNvbnN0IHt3aW5kb3dTaXplLCBiYXRjaFNpemUsIGluU2l6ZSwgb3V0U2l6ZX0gPSByZWR1Y2VJbmZvO1xuICAgIHRoaXMub3V0cHV0U2hhcGUgPSBbYmF0Y2hTaXplLCBvdXRTaXplXTtcblxuICAgIGNvbnN0IHdpbmRvd1NpemVOZWFyZXN0VmVjNCA9IE1hdGguZmxvb3Iod2luZG93U2l6ZSAvIDQpICogNDtcbiAgICBjb25zdCB3aW5kb3dTaXplVmVjNFJlbWFpbmRlciA9IHdpbmRvd1NpemUgJSA0O1xuXG4gICAgbGV0IHVwZGF0ZVNuaXBwZXQgPSBgc3VtVmFsdWUgKz0gZG90KHZhbHVlcywgb25lcyk7YDtcbiAgICBpZiAoZGl2aXNvciAhPSBudWxsKSB7XG4gICAgICBjb25zdCBkZW5vbWluYXRvciA9IDEgLyBkaXZpc29yO1xuICAgICAgdXBkYXRlU25pcHBldCA9IGBzdW1WYWx1ZSArPSBkb3QodmFsdWVzICogJHtcbiAgICAgICAgICB1dGlsLmlzSW50KGRlbm9taW5hdG9yKSA/IGRlbm9taW5hdG9yLnRvUHJlY2lzaW9uKDIpIDpcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRlbm9taW5hdG9yfSwgb25lcyk7YDtcbiAgICB9XG5cbiAgICBsZXQgY2hlY2tPdXRPZkJvdW5kcyA9ICcnO1xuICAgIGlmIChpblNpemUgJSB3aW5kb3dTaXplID4gMCkge1xuICAgICAgY2hlY2tPdXRPZkJvdW5kcyA9IGBcbiAgICAgICAgaWYgKGluSWR4IDwgMCB8fCBpbklkeCA+PSAke2luU2l6ZX0pIHtcbiAgICAgICAgICByZXR1cm4gMC4wO1xuICAgICAgICB9XG4gICAgICBgO1xuICAgIH1cblxuICAgIHRoaXMudXNlckNvZGUgPSBgXG4gICAgICBjb25zdCB2ZWM0IG9uZXMgPSB2ZWM0KDEuMCwgMS4wLCAxLjAsIDEuMCk7XG5cbiAgICAgIGZsb2F0IGdldFZhbHVlKGludCBiYXRjaCwgaW50IGluSWR4KSB7XG4gICAgICAgICR7Y2hlY2tPdXRPZkJvdW5kc31cbiAgICAgICAgcmV0dXJuIGdldFgoYmF0Y2gsIGluSWR4KTtcbiAgICAgIH1cblxuICAgICAgdm9pZCBtYWluKCkge1xuICAgICAgICBpdmVjMiBjb29yZHMgPSBnZXRPdXRwdXRDb29yZHMoKTtcbiAgICAgICAgaW50IGJhdGNoID0gY29vcmRzWzBdO1xuICAgICAgICBpbnQgb3V0SWR4ID0gY29vcmRzWzFdO1xuICAgICAgICBpbnQgaW5PZmZzZXQgPSBvdXRJZHggKiAke3dpbmRvd1NpemV9O1xuXG4gICAgICAgIGZsb2F0IHN1bVZhbHVlID0gMC4wO1xuXG4gICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgJHt3aW5kb3dTaXplTmVhcmVzdFZlYzR9OyBpICs9IDQpIHtcbiAgICAgICAgICBpbnQgaW5JZHggPSBpbk9mZnNldCArIGk7XG4gICAgICAgICAgdmVjNCB2YWx1ZXMgPSB2ZWM0KFxuICAgICAgICAgICAgZ2V0VmFsdWUoYmF0Y2gsIGluSWR4KSxcbiAgICAgICAgICAgIGdldFZhbHVlKGJhdGNoLCBpbklkeCArIDEpLFxuICAgICAgICAgICAgZ2V0VmFsdWUoYmF0Y2gsIGluSWR4ICsgMiksXG4gICAgICAgICAgICBnZXRWYWx1ZShiYXRjaCwgaW5JZHggKyAzKVxuICAgICAgICAgICk7XG5cbiAgICAgICAgICAke3VwZGF0ZVNuaXBwZXR9XG4gICAgICAgIH1cblxuICAgICAgICBpbnQgaW5JZHggPSBpbk9mZnNldCArICR7d2luZG93U2l6ZU5lYXJlc3RWZWM0fTtcbiAgICAgICAgaWYgKCR7d2luZG93U2l6ZVZlYzRSZW1haW5kZXIgPT09IDF9KSB7XG4gICAgICAgICAgdmVjNCB2YWx1ZXMgPSB2ZWM0KGdldFZhbHVlKGJhdGNoLCBpbklkeCksIDAuMCwgMC4wLCAwLjApO1xuXG4gICAgICAgICAgJHt1cGRhdGVTbmlwcGV0fVxuICAgICAgICB9IGVsc2UgaWYgKCR7d2luZG93U2l6ZVZlYzRSZW1haW5kZXIgPT09IDJ9KSB7XG4gICAgICAgICAgdmVjNCB2YWx1ZXMgPSB2ZWM0KFxuICAgICAgICAgICAgZ2V0VmFsdWUoYmF0Y2gsIGluSWR4KSxcbiAgICAgICAgICAgIGdldFZhbHVlKGJhdGNoLCBpbklkeCArIDEpLCAwLjAsIDAuMCk7XG5cbiAgICAgICAgICAke3VwZGF0ZVNuaXBwZXR9XG4gICAgICAgIH0gZWxzZSBpZiAoJHt3aW5kb3dTaXplVmVjNFJlbWFpbmRlciA9PT0gM30pIHtcbiAgICAgICAgICB2ZWM0IHZhbHVlcyA9IHZlYzQoXG4gICAgICAgICAgICBnZXRWYWx1ZShiYXRjaCwgaW5JZHgpLFxuICAgICAgICAgICAgZ2V0VmFsdWUoYmF0Y2gsIGluSWR4ICsgMSksXG4gICAgICAgICAgICBnZXRWYWx1ZShiYXRjaCwgaW5JZHggKyAyKSwgMC4wKTtcblxuICAgICAgICAgICR7dXBkYXRlU25pcHBldH1cbiAgICAgICAgfVxuICAgICAgICBzZXRPdXRwdXQoc3VtVmFsdWUpO1xuICAgICAgfVxuICAgIGA7XG4gIH1cbn1cbiJdfQ==","/**\n * @license\n * Copyright 2017 Google LLC. All Rights Reserved.\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n * =============================================================================\n */\nexport class ReduceProgram {\n constructor(reduceInfo, reduceType) {\n this.variableNames = ['x'];\n const { windowSize, batchSize, inSize, outSize } = reduceInfo;\n this.outputShape = [batchSize, outSize];\n let initializationValue = '0.0';\n let compareOp = ``;\n if (reduceType === 'prod') {\n initializationValue = '1.0';\n }\n else if (reduceType === 'min') {\n // WebGL on Firefox Linux can't compile 1/0 so we do 1/eps.\n initializationValue = '1.0 / 1e-20';\n compareOp = `min`;\n }\n else if (reduceType === 'max') {\n // WebGL on Firefox Linux can't compile 1/0 so we do 1/eps.\n initializationValue = '-1.0 / 1e-20';\n compareOp = `max`;\n }\n let returnValue = `${reduceType}(${reduceType}(${reduceType}(` +\n 'minMaxValue[0], minMaxValue[1]), minMaxValue[2]), minMaxValue[3])';\n if (reduceType === 'sum') {\n returnValue = `sumValue`;\n }\n else if (reduceType === 'prod') {\n returnValue = `prodValue`;\n }\n else if (reduceType === 'all') {\n returnValue = `allValue`;\n }\n else if (reduceType === 'any') {\n returnValue = `anyValue`;\n }\n const windowSizeNearestVec4 = Math.floor(windowSize / 4) * 4;\n const windowSizeVec4Remainder = windowSize % 4;\n let updateSnippet = `\n if (${reduceType === 'sum'}) {\n sumValue += dot(values, ones);\n } else if (${reduceType === 'prod'}) {\n vec2 tmp = vec2(values[0], values[1]) * vec2(values[2], values[3]);\n prodValue *= tmp[0] * tmp[1];\n } else {\n minMaxValue = ${compareOp}(values, minMaxValue);\n if (${reduceType === 'min'} || ${reduceType === 'max'}) {\n minMaxValue = ${compareOp}(values, minMaxValue);\n bvec4 isNaN = isnan(values);\n if (isNaN.r || isNaN.g || isNaN.b || isNaN.a) {\n minMaxValue = vec4(NAN);\n }\n }\n }\n `;\n let vecType = `vec4`;\n if (reduceType === 'all') {\n initializationValue = '1.0';\n updateSnippet = `\n bool reducedAllValue = all(values);\n float floatedReducedAllValue = float(reducedAllValue);\n allValue = float(allValue >= 1.0 && floatedReducedAllValue >= 1.0);\n `;\n vecType = `bvec4`;\n }\n else if (reduceType === 'any') {\n initializationValue = '0.0';\n updateSnippet = `\n bool reducedAnyValue = any(values);\n float floatedReducedAnyValue = float(reducedAnyValue);\n anyValue = float(anyValue >= 1.0 || floatedReducedAnyValue >= 1.0);\n `;\n vecType = `bvec4`;\n }\n let checkOutOfBounds = '';\n if (inSize % windowSize > 0) {\n checkOutOfBounds = `\n if (inIdx < 0 || inIdx >= ${inSize}) {\n return initializationValue;\n }\n `;\n }\n this.userCode = `\n const float initializationValue = ${initializationValue};\n const vec4 ones = vec4(1.0, 1.0, 1.0, 1.0);\n\n float getValue(int batch, int inIdx) {\n ${checkOutOfBounds}\n return getX(batch, inIdx);\n }\n\n void main() {\n ivec2 coords = getOutputCoords();\n int batch = coords[0];\n int outIdx = coords[1];\n int inOffset = outIdx * ${windowSize};\n\n vec4 minMaxValue = vec4(${initializationValue});\n float prodValue = 1.0;\n float sumValue = 0.0;\n float allValue = 1.0;\n float anyValue = 0.0;\n\n for (int i = 0; i < ${windowSizeNearestVec4}; i += 4) {\n int inIdx = inOffset + i;\n ${vecType} values = ${vecType}(\n getValue(batch, inIdx),\n getValue(batch, inIdx + 1),\n getValue(batch, inIdx + 2),\n getValue(batch, inIdx + 3)\n );\n\n ${updateSnippet}\n }\n\n int inIdx = inOffset + ${windowSizeNearestVec4};\n if (${windowSizeVec4Remainder === 1}) {\n ${vecType} values = ${vecType}(\n getValue(batch, inIdx),\n initializationValue,\n initializationValue,\n initializationValue\n );\n\n ${updateSnippet}\n } else if (${windowSizeVec4Remainder === 2}) {\n ${vecType} values = ${vecType}(\n getValue(batch, inIdx),\n getValue(batch, inIdx + 1),\n initializationValue,\n initializationValue\n );\n\n ${updateSnippet}\n } else if (${windowSizeVec4Remainder === 3}) {\n ${vecType} values = ${vecType}(\n getValue(batch, inIdx),\n getValue(batch, inIdx + 1),\n getValue(batch, inIdx + 2),\n initializationValue\n );\n\n ${updateSnippet}\n }\n setOutput(${returnValue});\n }\n `;\n }\n}\n//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicmVkdWNlX2dwdS5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uL3RmanMtYmFja2VuZC13ZWJnbC9zcmMvcmVkdWNlX2dwdS50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQTs7Ozs7Ozs7Ozs7Ozs7O0dBZUc7QUFLSCxNQUFNLE9BQU8sYUFBYTtJQUt4QixZQUNJLFVBQW1DLEVBQ25DLFVBQWdEO1FBTnBELGtCQUFhLEdBQUcsQ0FBQyxHQUFHLENBQUMsQ0FBQztRQU9wQixNQUFNLEVBQUMsVUFBVSxFQUFFLFNBQVMsRUFBRSxNQUFNLEVBQUUsT0FBTyxFQUFDLEdBQUcsVUFBVSxDQUFDO1FBQzVELElBQUksQ0FBQyxXQUFXLEdBQUcsQ0FBQyxTQUFTLEVBQUUsT0FBTyxDQUFDLENBQUM7UUFFeEMsSUFBSSxtQkFBbUIsR0FBRyxLQUFLLENBQUM7UUFDaEMsSUFBSSxTQUFTLEdBQUcsRUFBRSxDQUFDO1FBRW5CLElBQUksVUFBVSxLQUFLLE1BQU0sRUFBRTtZQUN6QixtQkFBbUIsR0FBRyxLQUFLLENBQUM7U0FDN0I7YUFBTSxJQUFJLFVBQVUsS0FBSyxLQUFLLEVBQUU7WUFDL0IsMkRBQTJEO1lBQzNELG1CQUFtQixHQUFHLGFBQWEsQ0FBQztZQUNwQyxTQUFTLEdBQUcsS0FBSyxDQUFDO1NBQ25CO2FBQU0sSUFBSSxVQUFVLEtBQUssS0FBSyxFQUFFO1lBQy9CLDJEQUEyRDtZQUMzRCxtQkFBbUIsR0FBRyxjQUFjLENBQUM7WUFDckMsU0FBUyxHQUFHLEtBQUssQ0FBQztTQUNuQjtRQUVELElBQUksV0FBVyxHQUFHLEdBQUcsVUFBVSxJQUFJLFVBQVUsSUFBSSxVQUFVLEdBQUc7WUFDMUQsbUVBQW1FLENBQUM7UUFFeEUsSUFBSSxVQUFVLEtBQUssS0FBSyxFQUFFO1lBQ3hCLFdBQVcsR0FBRyxVQUFVLENBQUM7U0FDMUI7YUFBTSxJQUFJLFVBQVUsS0FBSyxNQUFNLEVBQUU7WUFDaEMsV0FBVyxHQUFHLFdBQVcsQ0FBQztTQUMzQjthQUFNLElBQUksVUFBVSxLQUFLLEtBQUssRUFBRTtZQUMvQixXQUFXLEdBQUcsVUFBVSxDQUFDO1NBQzFCO2FBQU0sSUFBSSxVQUFVLEtBQUssS0FBSyxFQUFFO1lBQy9CLFdBQVcsR0FBRyxVQUFVLENBQUM7U0FDMUI7UUFFRCxNQUFNLHFCQUFxQixHQUFHLElBQUksQ0FBQyxLQUFLLENBQUMsVUFBVSxHQUFHLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQztRQUM3RCxNQUFNLHVCQUF1QixHQUFHLFVBQVUsR0FBRyxDQUFDLENBQUM7UUFFL0MsSUFBSSxhQUFhLEdBQUc7WUFDWixVQUFVLEtBQUssS0FBSzs7bUJBRWIsVUFBVSxLQUFLLE1BQU07Ozs7d0JBSWhCLFNBQVM7Y0FDbkIsVUFBVSxLQUFLLEtBQUssT0FBTyxVQUFVLEtBQUssS0FBSzswQkFDbkMsU0FBUzs7Ozs7OztLQU85QixDQUFDO1FBRUYsSUFBSSxPQUFPLEdBQUcsTUFBTSxDQUFDO1FBRXJCLElBQUksVUFBVSxLQUFLLEtBQUssRUFBRTtZQUN4QixtQkFBbUIsR0FBRyxLQUFLLENBQUM7WUFDNUIsYUFBYSxHQUFHOzs7O09BSWYsQ0FBQztZQUNGLE9BQU8sR0FBRyxPQUFPLENBQUM7U0FDbkI7YUFBTSxJQUFJLFVBQVUsS0FBSyxLQUFLLEVBQUU7WUFDL0IsbUJBQW1CLEdBQUcsS0FBSyxDQUFDO1lBQzVCLGFBQWEsR0FBRzs7OztPQUlmLENBQUM7WUFDRixPQUFPLEdBQUcsT0FBTyxDQUFDO1NBQ25CO1FBRUQsSUFBSSxnQkFBZ0IsR0FBRyxFQUFFLENBQUM7UUFDMUIsSUFBSSxNQUFNLEdBQUcsVUFBVSxHQUFHLENBQUMsRUFBRTtZQUMzQixnQkFBZ0IsR0FBRztvQ0FDVyxNQUFNOzs7T0FHbkMsQ0FBQztTQUNIO1FBQ0QsSUFBSSxDQUFDLFFBQVEsR0FBRzswQ0FDc0IsbUJBQW1COzs7O1VBSW5ELGdCQUFnQjs7Ozs7Ozs7a0NBUVEsVUFBVTs7a0NBRVYsbUJBQW1COzs7Ozs7OEJBTXZCLHFCQUFxQjs7WUFFdkMsT0FBTyxhQUFhLE9BQU87Ozs7Ozs7WUFPM0IsYUFBYTs7O2lDQUdRLHFCQUFxQjtjQUN4Qyx1QkFBdUIsS0FBSyxDQUFDO1lBQy9CLE9BQU8sYUFBYSxPQUFPOzs7Ozs7O1lBTzNCLGFBQWE7cUJBQ0osdUJBQXVCLEtBQUssQ0FBQztZQUN0QyxPQUFPLGFBQWEsT0FBTzs7Ozs7OztZQU8zQixhQUFhO3FCQUNKLHVCQUF1QixLQUFLLENBQUM7WUFDdEMsT0FBTyxhQUFhLE9BQU87Ozs7Ozs7WUFPM0IsYUFBYTs7b0JBRUwsV0FBVzs7S0FFMUIsQ0FBQztJQUNKLENBQUM7Q0FDRiIsInNvdXJjZXNDb250ZW50IjpbIi8qKlxuICogQGxpY2Vuc2VcbiAqIENvcHlyaWdodCAyMDE3IEdvb2dsZSBMTEMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuXG4gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgXCJMaWNlbnNlXCIpO1xuICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLlxuICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0XG4gKlxuICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wXG4gKlxuICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZVxuICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gXCJBUyBJU1wiIEJBU0lTLFxuICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuXG4gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kXG4gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS5cbiAqID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4gKi9cblxuaW1wb3J0IHtiYWNrZW5kX3V0aWx9IGZyb20gJ0B0ZW5zb3JmbG93L3RmanMtY29yZSc7XG5pbXBvcnQge0dQR1BVUHJvZ3JhbX0gZnJvbSAnLi9ncGdwdV9tYXRoJztcblxuZXhwb3J0IGNsYXNzIFJlZHVjZVByb2dyYW0gaW1wbGVtZW50cyBHUEdQVVByb2dyYW0ge1xuICB2YXJpYWJsZU5hbWVzID0gWyd4J107XG4gIG91dHB1dFNoYXBlOiBudW1iZXJbXTtcbiAgdXNlckNvZGU6IHN0cmluZztcblxuICBjb25zdHJ1Y3RvcihcbiAgICAgIHJlZHVjZUluZm86IGJhY2tlbmRfdXRpbC5SZWR1Y2VJbmZvLFxuICAgICAgcmVkdWNlVHlwZTogJ2FsbCd8J2FueSd8J21heCd8J21pbid8J3N1bSd8J3Byb2QnKSB7XG4gICAgY29uc3Qge3dpbmRvd1NpemUsIGJhdGNoU2l6ZSwgaW5TaXplLCBvdXRTaXplfSA9IHJlZHVjZUluZm87XG4gICAgdGhpcy5vdXRwdXRTaGFwZSA9IFtiYXRjaFNpemUsIG91dFNpemVdO1xuXG4gICAgbGV0IGluaXRpYWxpemF0aW9uVmFsdWUgPSAnMC4wJztcbiAgICBsZXQgY29tcGFyZU9wID0gYGA7XG5cbiAgICBpZiAocmVkdWNlVHlwZSA9PT0gJ3Byb2QnKSB7XG4gICAgICBpbml0aWFsaXphdGlvblZhbHVlID0gJzEuMCc7XG4gICAgfSBlbHNlIGlmIChyZWR1Y2VUeXBlID09PSAnbWluJykge1xuICAgICAgLy8gV2ViR0wgb24gRmlyZWZveCBMaW51eCBjYW4ndCBjb21waWxlIDEvMCBzbyB3ZSBkbyAxL2Vwcy5cbiAgICAgIGluaXRpYWxpemF0aW9uVmFsdWUgPSAnMS4wIC8gMWUtMjAnO1xuICAgICAgY29tcGFyZU9wID0gYG1pbmA7XG4gICAgfSBlbHNlIGlmIChyZWR1Y2VUeXBlID09PSAnbWF4Jykge1xuICAgICAgLy8gV2ViR0wgb24gRmlyZWZveCBMaW51eCBjYW4ndCBjb21waWxlIDEvMCBzbyB3ZSBkbyAxL2Vwcy5cbiAgICAgIGluaXRpYWxpemF0aW9uVmFsdWUgPSAnLTEuMCAvIDFlLTIwJztcbiAgICAgIGNvbXBhcmVPcCA9IGBtYXhgO1xuICAgIH1cblxuICAgIGxldCByZXR1cm5WYWx1ZSA9IGAke3JlZHVjZVR5cGV9KCR7cmVkdWNlVHlwZX0oJHtyZWR1Y2VUeXBlfShgICtcbiAgICAgICAgJ21pbk1heFZhbHVlWzBdLCBtaW5NYXhWYWx1ZVsxXSksIG1pbk1heFZhbHVlWzJdKSwgbWluTWF4VmFsdWVbM10pJztcblxuICAgIGlmIChyZWR1Y2VUeXBlID09PSAnc3VtJykge1xuICAgICAgcmV0dXJuVmFsdWUgPSBgc3VtVmFsdWVgO1xuICAgIH0gZWxzZSBpZiAocmVkdWNlVHlwZSA9PT0gJ3Byb2QnKSB7XG4gICAgICByZXR1cm5WYWx1ZSA9IGBwcm9kVmFsdWVgO1xuICAgIH0gZWxzZSBpZiAocmVkdWNlVHlwZSA9PT0gJ2FsbCcpIHtcbiAgICAgIHJldHVyblZhbHVlID0gYGFsbFZhbHVlYDtcbiAgICB9IGVsc2UgaWYgKHJlZHVjZVR5cGUgPT09ICdhbnknKSB7XG4gICAgICByZXR1cm5WYWx1ZSA9IGBhbnlWYWx1ZWA7XG4gICAgfVxuXG4gICAgY29uc3Qgd2luZG93U2l6ZU5lYXJlc3RWZWM0ID0gTWF0aC5mbG9vcih3aW5kb3dTaXplIC8gNCkgKiA0O1xuICAgIGNvbnN0IHdpbmRvd1NpemVWZWM0UmVtYWluZGVyID0gd2luZG93U2l6ZSAlIDQ7XG5cbiAgICBsZXQgdXBkYXRlU25pcHBldCA9IGBcbiAgICAgIGlmICgke3JlZHVjZVR5cGUgPT09ICdzdW0nfSkge1xuICAgICAgICBzdW1WYWx1ZSArPSBkb3QodmFsdWVzLCBvbmVzKTtcbiAgICAgIH0gZWxzZSBpZiAoJHtyZWR1Y2VUeXBlID09PSAncHJvZCd9KSB7XG4gICAgICAgIHZlYzIgdG1wID0gdmVjMih2YWx1ZXNbMF0sIHZhbHVlc1sxXSkgKiB2ZWMyKHZhbHVlc1syXSwgdmFsdWVzWzNdKTtcbiAgICAgICAgcHJvZFZhbHVlICo9IHRtcFswXSAqIHRtcFsxXTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIG1pbk1heFZhbHVlID0gJHtjb21wYXJlT3B9KHZhbHVlcywgbWluTWF4VmFsdWUpO1xuICAgICAgICBpZiAoJHtyZWR1Y2VUeXBlID09PSAnbWluJ30gfHwgJHtyZWR1Y2VUeXBlID09PSAnbWF4J30pIHtcbiAgICAgICAgICBtaW5NYXhWYWx1ZSA9ICR7Y29tcGFyZU9wfSh2YWx1ZXMsIG1pbk1heFZhbHVlKTtcbiAgICAgICAgICBidmVjNCBpc05hTiA9IGlzbmFuKHZhbHVlcyk7XG4gICAgICAgICAgaWYgKGlzTmFOLnIgfHwgaXNOYU4uZyB8fCBpc05hTi5iIHx8IGlzTmFOLmEpIHtcbiAgICAgICAgICAgIG1pbk1heFZhbHVlID0gdmVjNChOQU4pO1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgfVxuICAgIGA7XG5cbiAgICBsZXQgdmVjVHlwZSA9IGB2ZWM0YDtcblxuICAgIGlmIChyZWR1Y2VUeXBlID09PSAnYWxsJykge1xuICAgICAgaW5pdGlhbGl6YXRpb25WYWx1ZSA9ICcxLjAnO1xuICAgICAgdXBkYXRlU25pcHBldCA9IGBcbiAgICAgICAgYm9vbCByZWR1Y2VkQWxsVmFsdWUgPSBhbGwodmFsdWVzKTtcbiAgICAgICAgZmxvYXQgZmxvYXRlZFJlZHVjZWRBbGxWYWx1ZSA9IGZsb2F0KHJlZHVjZWRBbGxWYWx1ZSk7XG4gICAgICAgIGFsbFZhbHVlID0gZmxvYXQoYWxsVmFsdWUgPj0gMS4wICYmIGZsb2F0ZWRSZWR1Y2VkQWxsVmFsdWUgPj0gMS4wKTtcbiAgICAgIGA7XG4gICAgICB2ZWNUeXBlID0gYGJ2ZWM0YDtcbiAgICB9IGVsc2UgaWYgKHJlZHVjZVR5cGUgPT09ICdhbnknKSB7XG4gICAgICBpbml0aWFsaXphdGlvblZhbHVlID0gJzAuMCc7XG4gICAgICB1cGRhdGVTbmlwcGV0ID0gYFxuICAgICAgICBib29sIHJlZHVjZWRBbnlWYWx1ZSA9IGFueSh2YWx1ZXMpO1xuICAgICAgICBmbG9hdCBmbG9hdGVkUmVkdWNlZEFueVZhbHVlID0gZmxvYXQocmVkdWNlZEFueVZhbHVlKTtcbiAgICAgICAgYW55VmFsdWUgPSBmbG9hdChhbnlWYWx1ZSA+PSAxLjAgfHwgZmxvYXRlZFJlZHVjZWRBbnlWYWx1ZSA+PSAxLjApO1xuICAgICAgYDtcbiAgICAgIHZlY1R5cGUgPSBgYnZlYzRgO1xuICAgIH1cblxuICAgIGxldCBjaGVja091dE9mQm91bmRzID0gJyc7XG4gICAgaWYgKGluU2l6ZSAlIHdpbmRvd1NpemUgPiAwKSB7XG4gICAgICBjaGVja091dE9mQm91bmRzID0gYFxuICAgICAgICBpZiAoaW5JZHggPCAwIHx8IGluSWR4ID49ICR7aW5TaXplfSkge1xuICAgICAgICAgIHJldHVybiBpbml0aWFsaXphdGlvblZhbHVlO1xuICAgICAgICB9XG4gICAgICBgO1xuICAgIH1cbiAgICB0aGlzLnVzZXJDb2RlID0gYFxuICAgICAgY29uc3QgZmxvYXQgaW5pdGlhbGl6YXRpb25WYWx1ZSA9ICR7aW5pdGlhbGl6YXRpb25WYWx1ZX07XG4gICAgICBjb25zdCB2ZWM0IG9uZXMgPSB2ZWM0KDEuMCwgMS4wLCAxLjAsIDEuMCk7XG5cbiAgICAgIGZsb2F0IGdldFZhbHVlKGludCBiYXRjaCwgaW50IGluSWR4KSB7XG4gICAgICAgICR7Y2hlY2tPdXRPZkJvdW5kc31cbiAgICAgICAgcmV0dXJuIGdldFgoYmF0Y2gsIGluSWR4KTtcbiAgICAgIH1cblxuICAgICAgdm9pZCBtYWluKCkge1xuICAgICAgICBpdmVjMiBjb29yZHMgPSBnZXRPdXRwdXRDb29yZHMoKTtcbiAgICAgICAgaW50IGJhdGNoID0gY29vcmRzWzBdO1xuICAgICAgICBpbnQgb3V0SWR4ID0gY29vcmRzWzFdO1xuICAgICAgICBpbnQgaW5PZmZzZXQgPSBvdXRJZHggKiAke3dpbmRvd1NpemV9O1xuXG4gICAgICAgIHZlYzQgbWluTWF4VmFsdWUgPSB2ZWM0KCR7aW5pdGlhbGl6YXRpb25WYWx1ZX0pO1xuICAgICAgICBmbG9hdCBwcm9kVmFsdWUgPSAxLjA7XG4gICAgICAgIGZsb2F0IHN1bVZhbHVlID0gMC4wO1xuICAgICAgICBmbG9hdCBhbGxWYWx1ZSA9IDEuMDtcbiAgICAgICAgZmxvYXQgYW55VmFsdWUgPSAwLjA7XG5cbiAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCAke3dpbmRvd1NpemVOZWFyZXN0VmVjNH07IGkgKz0gNCkge1xuICAgICAgICAgIGludCBpbklkeCA9IGluT2Zmc2V0ICsgaTtcbiAgICAgICAgICAke3ZlY1R5cGV9IHZhbHVlcyA9ICR7dmVjVHlwZX0oXG4gICAgICAgICAgICBnZXRWYWx1ZShiYXRjaCwgaW5JZHgpLFxuICAgICAgICAgICAgZ2V0VmFsdWUoYmF0Y2gsIGluSWR4ICsgMSksXG4gICAgICAgICAgICBnZXRWYWx1ZShiYXRjaCwgaW5JZHggKyAyKSxcbiAgICAgICAgICAgIGdldFZhbHVlKGJhdGNoLCBpbklkeCArIDMpXG4gICAgICAgICAgKTtcblxuICAgICAgICAgICR7dXBkYXRlU25pcHBldH1cbiAgICAgICAgfVxuXG4gICAgICAgIGludCBpbklkeCA9IGluT2Zmc2V0ICsgJHt3aW5kb3dTaXplTmVhcmVzdFZlYzR9O1xuICAgICAgICBpZiAoJHt3aW5kb3dTaXplVmVjNFJlbWFpbmRlciA9PT0gMX0pIHtcbiAgICAgICAgICAke3ZlY1R5cGV9IHZhbHVlcyA9ICR7dmVjVHlwZX0oXG4gICAgICAgICAgICBnZXRWYWx1ZShiYXRjaCwgaW5JZHgpLFxuICAgICAgICAgICAgaW5pdGlhbGl6YXRpb25WYWx1ZSxcbiAgICAgICAgICAgIGluaXRpYWxpemF0aW9uVmFsdWUsXG4gICAgICAgICAgICBpbml0aWFsaXphdGlvblZhbHVlXG4gICAgICAgICAgKTtcblxuICAgICAgICAgICR7dXBkYXRlU25pcHBldH1cbiAgICAgICAgfSBlbHNlIGlmICgke3dpbmRvd1NpemVWZWM0UmVtYWluZGVyID09PSAyfSkge1xuICAgICAgICAgICR7dmVjVHlwZX0gdmFsdWVzID0gJHt2ZWNUeXBlfShcbiAgICAgICAgICAgIGdldFZhbHVlKGJhdGNoLCBpbklkeCksXG4gICAgICAgICAgICBnZXRWYWx1ZShiYXRjaCwgaW5JZHggKyAxKSxcbiAgICAgICAgICAgIGluaXRpYWxpemF0aW9uVmFsdWUsXG4gICAgICAgICAgICBpbml0aWFsaXphdGlvblZhbHVlXG4gICAgICAgICAgKTtcblxuICAgICAgICAgICR7dXBkYXRlU25pcHBldH1cbiAgICAgICAgfSBlbHNlIGlmICgke3dpbmRvd1NpemVWZWM0UmVtYWluZGVyID09PSAzfSkge1xuICAgICAgICAgICR7dmVjVHlwZX0gdmFsdWVzID0gJHt2ZWNUeXBlfShcbiAgICAgICAgICAgIGdldFZhbHVlKGJhdGNoLCBpbklkeCksXG4gICAgICAgICAgICBnZXRWYWx1ZShiYXRjaCwgaW5JZHggKyAxKSxcbiAgICAgICAgICAgIGdldFZhbHVlKGJhdGNoLCBpbklkeCArIDIpLFxuICAgICAgICAgICAgaW5pdGlhbGl6YXRpb25WYWx1ZVxuICAgICAgICAgICk7XG5cbiAgICAgICAgICAke3VwZGF0ZVNuaXBwZXR9XG4gICAgICAgIH1cbiAgICAgICAgc2V0T3V0cHV0KCR7cmV0dXJuVmFsdWV9KTtcbiAgICAgIH1cbiAgICBgO1xuICB9XG59XG4iXX0=","/**\n * @license\n * Copyright 2020 Google LLC. All Rights Reserved.\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n * =============================================================================\n */\nimport { backend_util } from '@tensorflow/tfjs-core';\nimport { MeanProgram } from '../mean_gpu';\nimport { ReduceProgram } from '../reduce_gpu';\n// Returns an array of configuration objects that describe each stage of the\n// reduction.\nfunction getReductionStages(inShape) {\n const stages = [];\n while (stages.length === 0 || stages[stages.length - 1].outSize !== 1) {\n const outSize = stages.length ? stages[stages.length - 1].outSize : inShape[1];\n const windowSize = backend_util.computeOptimalWindowSize(outSize);\n stages.push({\n inSize: outSize,\n windowSize,\n outSize: Math.ceil(outSize / windowSize)\n });\n }\n return stages;\n}\nexport function reduce(x, dtype, reductionType, backend) {\n const reductionStages = getReductionStages(x.shape);\n let result = x;\n for (let i = 0; i < reductionStages.length; i++) {\n const { inSize, windowSize, outSize } = reductionStages[i];\n let program;\n let previousResult;\n if (reductionType === 'mean') {\n program = i === 0 ?\n new MeanProgram({ windowSize, inSize, batchSize: x.shape[0], outSize }, inSize) :\n new MeanProgram({ windowSize, inSize, batchSize: x.shape[0], outSize });\n }\n else {\n program = new ReduceProgram({ windowSize, inSize, batchSize: x.shape[0], outSize }, reductionType);\n }\n previousResult = result;\n result = backend.runWebGLProgram(program, [result], dtype);\n if (previousResult.dataId !== x.dataId) {\n backend.disposeIntermediateTensorInfo(previousResult);\n }\n }\n return result;\n}\n//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicmVkdWNlLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vLi4vdGZqcy1iYWNrZW5kLXdlYmdsL3NyYy9rZXJuZWxfdXRpbHMvcmVkdWNlLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBOzs7Ozs7Ozs7Ozs7Ozs7R0FlRztBQUVILE9BQU8sRUFBQyxZQUFZLEVBQXVCLE1BQU0sdUJBQXVCLENBQUM7QUFHekUsT0FBTyxFQUFDLFdBQVcsRUFBQyxNQUFNLGFBQWEsQ0FBQztBQUN4QyxPQUFPLEVBQUMsYUFBYSxFQUFDLE1BQU0sZUFBZSxDQUFDO0FBSTVDLDRFQUE0RTtBQUM1RSxhQUFhO0FBQ2IsU0FBUyxrQkFBa0IsQ0FBQyxPQUFpQjtJQUUzQyxNQUFNLE1BQU0sR0FBRyxFQUFFLENBQUM7SUFFbEIsT0FBTyxNQUFNLENBQUMsTUFBTSxLQUFLLENBQUMsSUFBSSxNQUFNLENBQUMsTUFBTSxDQUFDLE1BQU0sR0FBRyxDQUFDLENBQUMsQ0FBQyxPQUFPLEtBQUssQ0FBQyxFQUFFO1FBQ3JFLE1BQU0sT0FBTyxHQUNULE1BQU0sQ0FBQyxNQUFNLENBQUMsQ0FBQyxDQUFDLE1BQU0sQ0FBQyxNQUFNLENBQUMsTUFBTSxHQUFHLENBQUMsQ0FBQyxDQUFDLE9BQU8sQ0FBQyxDQUFDLENBQUMsT0FBTyxDQUFDLENBQUMsQ0FBQyxDQUFDO1FBQ25FLE1BQU0sVUFBVSxHQUFHLFlBQVksQ0FBQyx3QkFBd0IsQ0FBQyxPQUFPLENBQUMsQ0FBQztRQUNsRSxNQUFNLENBQUMsSUFBSSxDQUFDO1lBQ1YsTUFBTSxFQUFFLE9BQU87WUFDZixVQUFVO1lBQ1YsT0FBTyxFQUFFLElBQUksQ0FBQyxJQUFJLENBQUMsT0FBTyxHQUFHLFVBQVUsQ0FBQztTQUN6QyxDQUFDLENBQUM7S0FDSjtJQUVELE9BQU8sTUFBTSxDQUFDO0FBQ2hCLENBQUM7QUFFRCxNQUFNLFVBQVUsTUFBTSxDQUNsQixDQUFhLEVBQUUsS0FBZSxFQUFFLGFBQTBCLEVBQzFELE9BQXlCO0lBQzNCLE1BQU0sZUFBZSxHQUFHLGtCQUFrQixDQUFDLENBQUMsQ0FBQyxLQUFLLENBQUMsQ0FBQztJQUVwRCxJQUFJLE1BQU0sR0FBRyxDQUFDLENBQUM7SUFDZixLQUFLLElBQUksQ0FBQyxHQUFHLENBQUMsRUFBRSxDQUFDLEdBQUcsZUFBZSxDQUFDLE1BQU0sRUFBRSxDQUFDLEVBQUUsRUFBRTtRQUMvQyxNQUFNLEVBQUMsTUFBTSxFQUFFLFVBQVUsRUFBRSxPQUFPLEVBQUMsR0FBRyxlQUFlLENBQUMsQ0FBQyxDQUFDLENBQUM7UUFFekQsSUFBSSxPQUFrQyxDQUFDO1FBQ3ZDLElBQUksY0FBMEIsQ0FBQztRQUMvQixJQUFJLGFBQWEsS0FBSyxNQUFNLEVBQUU7WUFDNUIsT0FBTyxHQUFHLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQztnQkFDZixJQUFJLFdBQVcsQ0FDWCxFQUFDLFVBQVUsRUFBRSxNQUFNLEVBQUUsU0FBUyxFQUFFLENBQUMsQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDLEVBQUUsT0FBTyxFQUFDLEVBQUUsTUFBTSxDQUFDLENBQUMsQ0FBQztnQkFDbkUsSUFBSSxXQUFXLENBQUMsRUFBQyxVQUFVLEVBQUUsTUFBTSxFQUFFLFNBQVMsRUFBRSxDQUFDLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQyxFQUFFLE9BQU8sRUFBQyxDQUFDLENBQUM7U0FDM0U7YUFBTTtZQUNMLE9BQU8sR0FBRyxJQUFJLGFBQWEsQ0FDdkIsRUFBQyxVQUFVLEVBQUUsTUFBTSxFQUFFLFNBQVMsRUFBRSxDQUFDLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQyxFQUFFLE9BQU8sRUFBQyxFQUFFLGFBQWEsQ0FBQyxDQUFDO1NBQzFFO1FBRUQsY0FBYyxHQUFHLE1BQU0sQ0FBQztRQUN4QixNQUFNLEdBQUcsT0FBTyxDQUFDLGVBQWUsQ0FBQyxPQUFPLEVBQUUsQ0FBQyxNQUFNLENBQUMsRUFBRSxLQUFLLENBQUMsQ0FBQztRQUUzRCxJQUFJLGNBQWMsQ0FBQyxNQUFNLEtBQUssQ0FBQyxDQUFDLE1BQU0sRUFBRTtZQUN0QyxPQUFPLENBQUMsNkJBQTZCLENBQUMsY0FBYyxDQUFDLENBQUM7U0FDdkQ7S0FDRjtJQUVELE9BQU8sTUFBTSxDQUFDO0FBQ2hCLENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyIvKipcbiAqIEBsaWNlbnNlXG4gKiBDb3B5cmlnaHQgMjAyMCBHb29nbGUgTExDLiBBbGwgUmlnaHRzIFJlc2VydmVkLlxuICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlIFwiTGljZW5zZVwiKTtcbiAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS5cbiAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdFxuICpcbiAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMFxuICpcbiAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmVcbiAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuIFwiQVMgSVNcIiBCQVNJUyxcbiAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLlxuICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZFxuICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuXG4gKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuICovXG5cbmltcG9ydCB7YmFja2VuZF91dGlsLCBEYXRhVHlwZSwgVGVuc29ySW5mb30gZnJvbSAnQHRlbnNvcmZsb3cvdGZqcy1jb3JlJztcblxuaW1wb3J0IHtNYXRoQmFja2VuZFdlYkdMfSBmcm9tICcuLi9iYWNrZW5kX3dlYmdsJztcbmltcG9ydCB7TWVhblByb2dyYW19IGZyb20gJy4uL21lYW5fZ3B1JztcbmltcG9ydCB7UmVkdWNlUHJvZ3JhbX0gZnJvbSAnLi4vcmVkdWNlX2dwdSc7XG5cbnR5cGUgUmVkdWNlVHlwZXMgPSAnYWxsJ3wnYW55J3wnbWF4J3wnbWluJ3wnc3VtJ3wncHJvZCd8J21lYW4nO1xuXG4vLyBSZXR1cm5zIGFuIGFycmF5IG9mIGNvbmZpZ3VyYXRpb24gb2JqZWN0cyB0aGF0IGRlc2NyaWJlIGVhY2ggc3RhZ2Ugb2YgdGhlXG4vLyByZWR1Y3Rpb24uXG5mdW5jdGlvbiBnZXRSZWR1Y3Rpb25TdGFnZXMoaW5TaGFwZTogbnVtYmVyW10pOlxuICAgIEFycmF5PHtpblNpemU6IG51bWJlciwgd2luZG93U2l6ZTogbnVtYmVyLCBvdXRTaXplOiBudW1iZXJ9PiB7XG4gIGNvbnN0IHN0YWdlcyA9IFtdO1xuXG4gIHdoaWxlIChzdGFnZXMubGVuZ3RoID09PSAwIHx8IHN0YWdlc1tzdGFnZXMubGVuZ3RoIC0gMV0ub3V0U2l6ZSAhPT0gMSkge1xuICAgIGNvbnN0IG91dFNpemU6IG51bWJlciA9XG4gICAgICAgIHN0YWdlcy5sZW5ndGggPyBzdGFnZXNbc3RhZ2VzLmxlbmd0aCAtIDFdLm91dFNpemUgOiBpblNoYXBlWzFdO1xuICAgIGNvbnN0IHdpbmRvd1NpemUgPSBiYWNrZW5kX3V0aWwuY29tcHV0ZU9wdGltYWxXaW5kb3dTaXplKG91dFNpemUpO1xuICAgIHN0YWdlcy5wdXNoKHtcbiAgICAgIGluU2l6ZTogb3V0U2l6ZSxcbiAgICAgIHdpbmRvd1NpemUsXG4gICAgICBvdXRTaXplOiBNYXRoLmNlaWwob3V0U2l6ZSAvIHdpbmRvd1NpemUpXG4gICAgfSk7XG4gIH1cblxuICByZXR1cm4gc3RhZ2VzO1xufVxuXG5leHBvcnQgZnVuY3Rpb24gcmVkdWNlKFxuICAgIHg6IFRlbnNvckluZm8sIGR0eXBlOiBEYXRhVHlwZSwgcmVkdWN0aW9uVHlwZTogUmVkdWNlVHlwZXMsXG4gICAgYmFja2VuZDogTWF0aEJhY2tlbmRXZWJHTCk6IFRlbnNvckluZm8ge1xuICBjb25zdCByZWR1Y3Rpb25TdGFnZXMgPSBnZXRSZWR1Y3Rpb25TdGFnZXMoeC5zaGFwZSk7XG5cbiAgbGV0IHJlc3VsdCA9IHg7XG4gIGZvciAobGV0IGkgPSAwOyBpIDwgcmVkdWN0aW9uU3RhZ2VzLmxlbmd0aDsgaSsrKSB7XG4gICAgY29uc3Qge2luU2l6ZSwgd2luZG93U2l6ZSwgb3V0U2l6ZX0gPSByZWR1Y3Rpb25TdGFnZXNbaV07XG5cbiAgICBsZXQgcHJvZ3JhbTogUmVkdWNlUHJvZ3JhbXxNZWFuUHJvZ3JhbTtcbiAgICBsZXQgcHJldmlvdXNSZXN1bHQ6IFRlbnNvckluZm87XG4gICAgaWYgKHJlZHVjdGlvblR5cGUgPT09ICdtZWFuJykge1xuICAgICAgcHJvZ3JhbSA9IGkgPT09IDAgP1xuICAgICAgICAgIG5ldyBNZWFuUHJvZ3JhbShcbiAgICAgICAgICAgICAge3dpbmRvd1NpemUsIGluU2l6ZSwgYmF0Y2hTaXplOiB4LnNoYXBlWzBdLCBvdXRTaXplfSwgaW5TaXplKSA6XG4gICAgICAgICAgbmV3IE1lYW5Qcm9ncmFtKHt3aW5kb3dTaXplLCBpblNpemUsIGJhdGNoU2l6ZTogeC5zaGFwZVswXSwgb3V0U2l6ZX0pO1xuICAgIH0gZWxzZSB7XG4gICAgICBwcm9ncmFtID0gbmV3IFJlZHVjZVByb2dyYW0oXG4gICAgICAgICAge3dpbmRvd1NpemUsIGluU2l6ZSwgYmF0Y2hTaXplOiB4LnNoYXBlWzBdLCBvdXRTaXplfSwgcmVkdWN0aW9uVHlwZSk7XG4gICAgfVxuXG4gICAgcHJldmlvdXNSZXN1bHQgPSByZXN1bHQ7XG4gICAgcmVzdWx0ID0gYmFja2VuZC5ydW5XZWJHTFByb2dyYW0ocHJvZ3JhbSwgW3Jlc3VsdF0sIGR0eXBlKTtcblxuICAgIGlmIChwcmV2aW91c1Jlc3VsdC5kYXRhSWQgIT09IHguZGF0YUlkKSB7XG4gICAgICBiYWNrZW5kLmRpc3Bvc2VJbnRlcm1lZGlhdGVUZW5zb3JJbmZvKHByZXZpb3VzUmVzdWx0KTtcbiAgICB9XG4gIH1cblxuICByZXR1cm4gcmVzdWx0O1xufVxuIl19","/**\n * @license\n * Copyright 2017 Google LLC. All Rights Reserved.\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n * =============================================================================\n */\nimport { getCoordsDataType } from './shader_compiler';\nexport class TransposeProgram {\n constructor(aShape, newDim) {\n this.variableNames = ['A'];\n const outputShape = new Array(aShape.length);\n for (let i = 0; i < outputShape.length; i++) {\n outputShape[i] = aShape[newDim[i]];\n }\n this.outputShape = outputShape;\n this.rank = outputShape.length;\n const dtype = getCoordsDataType(this.rank);\n const switched = getSwitchedCoords(newDim);\n this.userCode = `\n void main() {\n ${dtype} resRC = getOutputCoords();\n setOutput(getA(${switched}));\n }\n `;\n }\n}\nfunction getSwitchedCoords(newDim) {\n const rank = newDim.length;\n if (rank > 6) {\n throw Error(`Transpose for rank ${rank} is not yet supported`);\n }\n const originalOrder = ['resRC.x', 'resRC.y', 'resRC.z', 'resRC.w', 'resRC.u', 'resRC.v'];\n const switchedCoords = new Array(rank);\n for (let i = 0; i < newDim.length; i++) {\n switchedCoords[newDim[i]] = originalOrder[i];\n }\n return switchedCoords.join();\n}\n//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidHJhbnNwb3NlX2dwdS5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uL3RmanMtYmFja2VuZC13ZWJnbC9zcmMvdHJhbnNwb3NlX2dwdS50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQTs7Ozs7Ozs7Ozs7Ozs7O0dBZUc7QUFHSCxPQUFPLEVBQUMsaUJBQWlCLEVBQUMsTUFBTSxtQkFBbUIsQ0FBQztBQUVwRCxNQUFNLE9BQU8sZ0JBQWdCO0lBTTNCLFlBQVksTUFBZ0IsRUFBRSxNQUFnQjtRQUw5QyxrQkFBYSxHQUFHLENBQUMsR0FBRyxDQUFDLENBQUM7UUFNcEIsTUFBTSxXQUFXLEdBQWEsSUFBSSxLQUFLLENBQUMsTUFBTSxDQUFDLE1BQU0sQ0FBQyxDQUFDO1FBQ3ZELEtBQUssSUFBSSxDQUFDLEdBQUcsQ0FBQyxFQUFFLENBQUMsR0FBRyxXQUFXLENBQUMsTUFBTSxFQUFFLENBQUMsRUFBRSxFQUFFO1lBQzNDLFdBQVcsQ0FBQyxDQUFDLENBQUMsR0FBRyxNQUFNLENBQUMsTUFBTSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUM7U0FDcEM7UUFDRCxJQUFJLENBQUMsV0FBVyxHQUFHLFdBQVcsQ0FBQztRQUMvQixJQUFJLENBQUMsSUFBSSxHQUFHLFdBQVcsQ0FBQyxNQUFNLENBQUM7UUFDL0IsTUFBTSxLQUFLLEdBQUcsaUJBQWlCLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxDQUFDO1FBQzNDLE1BQU0sUUFBUSxHQUFHLGlCQUFpQixDQUFDLE1BQU0sQ0FBQyxDQUFDO1FBRTNDLElBQUksQ0FBQyxRQUFRLEdBQUc7O1FBRVosS0FBSzt1QkFDVSxRQUFROztLQUUxQixDQUFDO0lBQ0osQ0FBQztDQUNGO0FBRUQsU0FBUyxpQkFBaUIsQ0FBQyxNQUFnQjtJQUN6QyxNQUFNLElBQUksR0FBRyxNQUFNLENBQUMsTUFBTSxDQUFDO0lBQzNCLElBQUksSUFBSSxHQUFHLENBQUMsRUFBRTtRQUNaLE1BQU0sS0FBSyxDQUFDLHNCQUFzQixJQUFJLHVCQUF1QixDQUFDLENBQUM7S0FDaEU7SUFDRCxNQUFNLGFBQWEsR0FDZixDQUFDLFNBQVMsRUFBRSxTQUFTLEVBQUUsU0FBUyxFQUFFLFNBQVMsRUFBRSxTQUFTLEVBQUUsU0FBUyxDQUFDLENBQUM7SUFDdkUsTUFBTSxjQUFjLEdBQUcsSUFBSSxLQUFLLENBQUMsSUFBSSxDQUFDLENBQUM7SUFDdkMsS0FBSyxJQUFJLENBQUMsR0FBRyxDQUFDLEVBQUUsQ0FBQyxHQUFHLE1BQU0sQ0FBQyxNQUFNLEVBQUUsQ0FBQyxFQUFFLEVBQUU7UUFDdEMsY0FBYyxDQUFDLE1BQU0sQ0FBQyxDQUFDLENBQUMsQ0FBQyxHQUFHLGFBQWEsQ0FBQyxDQUFDLENBQUMsQ0FBQztLQUM5QztJQUNELE9BQU8sY0FBYyxDQUFDLElBQUksRUFBRSxDQUFDO0FBQy9CLENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyIvKipcbiAqIEBsaWNlbnNlXG4gKiBDb3B5cmlnaHQgMjAxNyBHb29nbGUgTExDLiBBbGwgUmlnaHRzIFJlc2VydmVkLlxuICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlIFwiTGljZW5zZVwiKTtcbiAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS5cbiAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdFxuICpcbiAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMFxuICpcbiAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmVcbiAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuIFwiQVMgSVNcIiBCQVNJUyxcbiAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLlxuICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZFxuICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuXG4gKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuICovXG5cbmltcG9ydCB7R1BHUFVQcm9ncmFtfSBmcm9tICcuL2dwZ3B1X21hdGgnO1xuaW1wb3J0IHtnZXRDb29yZHNEYXRhVHlwZX0gZnJvbSAnLi9zaGFkZXJfY29tcGlsZXInO1xuXG5leHBvcnQgY2xhc3MgVHJhbnNwb3NlUHJvZ3JhbSBpbXBsZW1lbnRzIEdQR1BVUHJvZ3JhbSB7XG4gIHZhcmlhYmxlTmFtZXMgPSBbJ0EnXTtcbiAgb3V0cHV0U2hhcGU6IG51bWJlcltdO1xuICB1c2VyQ29kZTogc3RyaW5nO1xuICByYW5rOiBudW1iZXI7XG5cbiAgY29uc3RydWN0b3IoYVNoYXBlOiBudW1iZXJbXSwgbmV3RGltOiBudW1iZXJbXSkge1xuICAgIGNvbnN0IG91dHB1dFNoYXBlOiBudW1iZXJbXSA9IG5ldyBBcnJheShhU2hhcGUubGVuZ3RoKTtcbiAgICBmb3IgKGxldCBpID0gMDsgaSA8IG91dHB1dFNoYXBlLmxlbmd0aDsgaSsrKSB7XG4gICAgICBvdXRwdXRTaGFwZVtpXSA9IGFTaGFwZVtuZXdEaW1baV1dO1xuICAgIH1cbiAgICB0aGlzLm91dHB1dFNoYXBlID0gb3V0cHV0U2hhcGU7XG4gICAgdGhpcy5yYW5rID0gb3V0cHV0U2hhcGUubGVuZ3RoO1xuICAgIGNvbnN0IGR0eXBlID0gZ2V0Q29vcmRzRGF0YVR5cGUodGhpcy5yYW5rKTtcbiAgICBjb25zdCBzd2l0Y2hlZCA9IGdldFN3aXRjaGVkQ29vcmRzKG5ld0RpbSk7XG5cbiAgICB0aGlzLnVzZXJDb2RlID0gYFxuICAgIHZvaWQgbWFpbigpIHtcbiAgICAgICR7ZHR5cGV9IHJlc1JDID0gZ2V0T3V0cHV0Q29vcmRzKCk7XG4gICAgICBzZXRPdXRwdXQoZ2V0QSgke3N3aXRjaGVkfSkpO1xuICAgIH1cbiAgICBgO1xuICB9XG59XG5cbmZ1bmN0aW9uIGdldFN3aXRjaGVkQ29vcmRzKG5ld0RpbTogbnVtYmVyW10pOiBzdHJpbmcge1xuICBjb25zdCByYW5rID0gbmV3RGltLmxlbmd0aDtcbiAgaWYgKHJhbmsgPiA2KSB7XG4gICAgdGhyb3cgRXJyb3IoYFRyYW5zcG9zZSBmb3IgcmFuayAke3Jhbmt9IGlzIG5vdCB5ZXQgc3VwcG9ydGVkYCk7XG4gIH1cbiAgY29uc3Qgb3JpZ2luYWxPcmRlciA9XG4gICAgICBbJ3Jlc1JDLngnLCAncmVzUkMueScsICdyZXNSQy56JywgJ3Jlc1JDLncnLCAncmVzUkMudScsICdyZXNSQy52J107XG4gIGNvbnN0IHN3aXRjaGVkQ29vcmRzID0gbmV3IEFycmF5KHJhbmspO1xuICBmb3IgKGxldCBpID0gMDsgaSA8IG5ld0RpbS5sZW5ndGg7IGkrKykge1xuICAgIHN3aXRjaGVkQ29vcmRzW25ld0RpbVtpXV0gPSBvcmlnaW5hbE9yZGVyW2ldO1xuICB9XG4gIHJldHVybiBzd2l0Y2hlZENvb3Jkcy5qb2luKCk7XG59XG4iXX0=","/**\n * @license\n * Copyright 2019 Google LLC. All Rights Reserved.\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n * =============================================================================\n */\nimport { getVecChannels } from './packing_util';\nimport { getCoordsDataType } from './shader_compiler';\nexport class TransposePackedProgram {\n constructor(aShape, newDim) {\n this.variableNames = ['A'];\n this.packedInputs = true;\n this.packedOutput = true;\n const outputShape = new Array(aShape.length);\n for (let i = 0; i < outputShape.length; i++) {\n outputShape[i] = aShape[newDim[i]];\n }\n this.outputShape = outputShape;\n this.rank = outputShape.length;\n if (this.rank > 6) {\n throw Error(`Packed transpose for rank ${this.rank} is not yet supported.`);\n }\n const dtype = getCoordsDataType(this.rank);\n const outputOrder = getVecChannels('rc', this.rank);\n const switchedOrder = new Array(this.rank);\n for (let i = 0; i < newDim.length; i++) {\n switchedOrder[newDim[i]] = outputOrder[i];\n }\n const innerDims = `vec2(${switchedOrder.slice(-2).join()})`;\n const nextColumn = `++${outputOrder[this.rank - 1]} < ${outputShape[this.rank - 1]}`;\n const getc = `getChannel(getA(${switchedOrder.join()}), ${innerDims})`;\n this.userCode = `\n void main() {\n ${dtype} rc = getOutputCoords();\n vec4 result = vec4(0.);\n result[0] = ${getc};\n if(${nextColumn}) {\n result[1] = ${getc};\n }\n --${outputOrder[this.rank - 1]};\n if(++${outputOrder[this.rank - 2]} < ${outputShape[this.rank - 2]}) {\n result[2] = ${getc};\n if(${nextColumn}) {\n result[3] = ${getc};\n }\n }\n setOutput(result);\n }\n `;\n }\n}\n//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidHJhbnNwb3NlX3BhY2tlZF9ncHUuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi90ZmpzLWJhY2tlbmQtd2ViZ2wvc3JjL3RyYW5zcG9zZV9wYWNrZWRfZ3B1LnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBOzs7Ozs7Ozs7Ozs7Ozs7R0FlRztBQUdILE9BQU8sRUFBQyxjQUFjLEVBQUMsTUFBTSxnQkFBZ0IsQ0FBQztBQUM5QyxPQUFPLEVBQUMsaUJBQWlCLEVBQUMsTUFBTSxtQkFBbUIsQ0FBQztBQUVwRCxNQUFNLE9BQU8sc0JBQXNCO0lBUWpDLFlBQVksTUFBZ0IsRUFBRSxNQUFnQjtRQVA5QyxrQkFBYSxHQUFHLENBQUMsR0FBRyxDQUFDLENBQUM7UUFJdEIsaUJBQVksR0FBRyxJQUFJLENBQUM7UUFDcEIsaUJBQVksR0FBRyxJQUFJLENBQUM7UUFHbEIsTUFBTSxXQUFXLEdBQWEsSUFBSSxLQUFLLENBQUMsTUFBTSxDQUFDLE1BQU0sQ0FBQyxDQUFDO1FBQ3ZELEtBQUssSUFBSSxDQUFDLEdBQUcsQ0FBQyxFQUFFLENBQUMsR0FBRyxXQUFXLENBQUMsTUFBTSxFQUFFLENBQUMsRUFBRSxFQUFFO1lBQzNDLFdBQVcsQ0FBQyxDQUFDLENBQUMsR0FBRyxNQUFNLENBQUMsTUFBTSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUM7U0FDcEM7UUFDRCxJQUFJLENBQUMsV0FBVyxHQUFHLFdBQVcsQ0FBQztRQUMvQixJQUFJLENBQUMsSUFBSSxHQUFHLFdBQVcsQ0FBQyxNQUFNLENBQUM7UUFDL0IsSUFBSSxJQUFJLENBQUMsSUFBSSxHQUFHLENBQUMsRUFBRTtZQUNqQixNQUFNLEtBQUssQ0FDUCw2QkFBNkIsSUFBSSxDQUFDLElBQUksd0JBQXdCLENBQUMsQ0FBQztTQUNyRTtRQUNELE1BQU0sS0FBSyxHQUFHLGlCQUFpQixDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsQ0FBQztRQUUzQyxNQUFNLFdBQVcsR0FBRyxjQUFjLENBQUMsSUFBSSxFQUFFLElBQUksQ0FBQyxJQUFJLENBQUMsQ0FBQztRQUNwRCxNQUFNLGFBQWEsR0FBRyxJQUFJLEtBQUssQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLENBQUM7UUFDM0MsS0FBSyxJQUFJLENBQUMsR0FBRyxDQUFDLEVBQUUsQ0FBQyxHQUFHLE1BQU0sQ0FBQyxNQUFNLEVBQUUsQ0FBQyxFQUFFLEVBQUU7WUFDdEMsYUFBYSxDQUFDLE1BQU0sQ0FBQyxDQUFDLENBQUMsQ0FBQyxHQUFHLFdBQVcsQ0FBQyxDQUFDLENBQUMsQ0FBQztTQUMzQztRQUNELE1BQU0sU0FBUyxHQUFHLFFBQVEsYUFBYSxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksRUFBRSxHQUFHLENBQUM7UUFDNUQsTUFBTSxVQUFVLEdBQ1osS0FBSyxXQUFXLENBQUMsSUFBSSxDQUFDLElBQUksR0FBRyxDQUFDLENBQUMsTUFBTSxXQUFXLENBQUMsSUFBSSxDQUFDLElBQUksR0FBRyxDQUFDLENBQUMsRUFBRSxDQUFDO1FBQ3RFLE1BQU0sSUFBSSxHQUFHLG1CQUFtQixhQUFhLENBQUMsSUFBSSxFQUFFLE1BQU0sU0FBUyxHQUFHLENBQUM7UUFFdkUsSUFBSSxDQUFDLFFBQVEsR0FBRzs7UUFFWixLQUFLOztvQkFFTyxJQUFJO1dBQ2IsVUFBVTtzQkFDQyxJQUFJOztVQUVoQixXQUFXLENBQUMsSUFBSSxDQUFDLElBQUksR0FBRyxDQUFDLENBQUM7YUFDdkIsV0FBVyxDQUFDLElBQUksQ0FBQyxJQUFJLEdBQUcsQ0FBQyxDQUFDLE1BQU0sV0FBVyxDQUFDLElBQUksQ0FBQyxJQUFJLEdBQUcsQ0FBQyxDQUFDO3NCQUNqRCxJQUFJO2FBQ2IsVUFBVTt3QkFDQyxJQUFJOzs7OztLQUt2QixDQUFDO0lBQ0osQ0FBQztDQUNGIiwic291cmNlc0NvbnRlbnQiOlsiLyoqXG4gKiBAbGljZW5zZVxuICogQ29weXJpZ2h0IDIwMTkgR29vZ2xlIExMQy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC5cbiAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSBcIkxpY2Vuc2VcIik7XG4gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuXG4gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXRcbiAqXG4gKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjBcbiAqXG4gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlXG4gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiBcIkFTIElTXCIgQkFTSVMsXG4gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC5cbiAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmRcbiAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLlxuICogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbiAqL1xuXG5pbXBvcnQge0dQR1BVUHJvZ3JhbX0gZnJvbSAnLi9ncGdwdV9tYXRoJztcbmltcG9ydCB7Z2V0VmVjQ2hhbm5lbHN9IGZyb20gJy4vcGFja2luZ191dGlsJztcbmltcG9ydCB7Z2V0Q29vcmRzRGF0YVR5cGV9IGZyb20gJy4vc2hhZGVyX2NvbXBpbGVyJztcblxuZXhwb3J0IGNsYXNzIFRyYW5zcG9zZVBhY2tlZFByb2dyYW0gaW1wbGVtZW50cyBHUEdQVVByb2dyYW0ge1xuICB2YXJpYWJsZU5hbWVzID0gWydBJ107XG4gIG91dHB1dFNoYXBlOiBudW1iZXJbXTtcbiAgdXNlckNvZGU6IHN0cmluZztcbiAgcmFuazogbnVtYmVyO1xuICBwYWNrZWRJbnB1dHMgPSB0cnVlO1xuICBwYWNrZWRPdXRwdXQgPSB0cnVlO1xuXG4gIGNvbnN0cnVjdG9yKGFTaGFwZTogbnVtYmVyW10sIG5ld0RpbTogbnVtYmVyW10pIHtcbiAgICBjb25zdCBvdXRwdXRTaGFwZTogbnVtYmVyW10gPSBuZXcgQXJyYXkoYVNoYXBlLmxlbmd0aCk7XG4gICAgZm9yIChsZXQgaSA9IDA7IGkgPCBvdXRwdXRTaGFwZS5sZW5ndGg7IGkrKykge1xuICAgICAgb3V0cHV0U2hhcGVbaV0gPSBhU2hhcGVbbmV3RGltW2ldXTtcbiAgICB9XG4gICAgdGhpcy5vdXRwdXRTaGFwZSA9IG91dHB1dFNoYXBlO1xuICAgIHRoaXMucmFuayA9IG91dHB1dFNoYXBlLmxlbmd0aDtcbiAgICBpZiAodGhpcy5yYW5rID4gNikge1xuICAgICAgdGhyb3cgRXJyb3IoXG4gICAgICAgICAgYFBhY2tlZCB0cmFuc3Bvc2UgZm9yIHJhbmsgJHt0aGlzLnJhbmt9IGlzIG5vdCB5ZXQgc3VwcG9ydGVkLmApO1xuICAgIH1cbiAgICBjb25zdCBkdHlwZSA9IGdldENvb3Jkc0RhdGFUeXBlKHRoaXMucmFuayk7XG5cbiAgICBjb25zdCBvdXRwdXRPcmRlciA9IGdldFZlY0NoYW5uZWxzKCdyYycsIHRoaXMucmFuayk7XG4gICAgY29uc3Qgc3dpdGNoZWRPcmRlciA9IG5ldyBBcnJheSh0aGlzLnJhbmspO1xuICAgIGZvciAobGV0IGkgPSAwOyBpIDwgbmV3RGltLmxlbmd0aDsgaSsrKSB7XG4gICAgICBzd2l0Y2hlZE9yZGVyW25ld0RpbVtpXV0gPSBvdXRwdXRPcmRlcltpXTtcbiAgICB9XG4gICAgY29uc3QgaW5uZXJEaW1zID0gYHZlYzIoJHtzd2l0Y2hlZE9yZGVyLnNsaWNlKC0yKS5qb2luKCl9KWA7XG4gICAgY29uc3QgbmV4dENvbHVtbiA9XG4gICAgICAgIGArKyR7b3V0cHV0T3JkZXJbdGhpcy5yYW5rIC0gMV19IDwgJHtvdXRwdXRTaGFwZVt0aGlzLnJhbmsgLSAxXX1gO1xuICAgIGNvbnN0IGdldGMgPSBgZ2V0Q2hhbm5lbChnZXRBKCR7c3dpdGNoZWRPcmRlci5qb2luKCl9KSwgJHtpbm5lckRpbXN9KWA7XG5cbiAgICB0aGlzLnVzZXJDb2RlID0gYFxuICAgIHZvaWQgbWFpbigpIHtcbiAgICAgICR7ZHR5cGV9IHJjID0gZ2V0T3V0cHV0Q29vcmRzKCk7XG4gICAgICB2ZWM0IHJlc3VsdCA9IHZlYzQoMC4pO1xuICAgICAgcmVzdWx0WzBdID0gJHtnZXRjfTtcbiAgICAgIGlmKCR7bmV4dENvbHVtbn0pIHtcbiAgICAgICAgcmVzdWx0WzFdID0gJHtnZXRjfTtcbiAgICAgIH1cbiAgICAgIC0tJHtvdXRwdXRPcmRlclt0aGlzLnJhbmsgLSAxXX07XG4gICAgICBpZigrKyR7b3V0cHV0T3JkZXJbdGhpcy5yYW5rIC0gMl19IDwgJHtvdXRwdXRTaGFwZVt0aGlzLnJhbmsgLSAyXX0pIHtcbiAgICAgICAgcmVzdWx0WzJdID0gJHtnZXRjfTtcbiAgICAgICAgaWYoJHtuZXh0Q29sdW1ufSkge1xuICAgICAgICAgIHJlc3VsdFszXSA9ICR7Z2V0Y307XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICAgIHNldE91dHB1dChyZXN1bHQpO1xuICAgIH1cbiAgICBgO1xuICB9XG59XG4iXX0=","/**\n * @license\n * Copyright 2020 Google LLC. All Rights Reserved.\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n * =============================================================================\n */\nimport { env } from '@tensorflow/tfjs-core';\nimport { transposeImplCPU } from '../kernel_utils/shared';\nimport { TransposeProgram } from '../transpose_gpu';\nimport { TransposePackedProgram } from '../transpose_packed_gpu';\nexport function transposeImpl(x, perm, backend) {\n const program = env().getBool('WEBGL_PACK_ARRAY_OPERATIONS') ?\n new TransposePackedProgram(x.shape, perm) :\n new TransposeProgram(x.shape, perm);\n return backend.runWebGLProgram(program, [x], x.dtype);\n}\nexport { transposeImplCPU };\n//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiVHJhbnNwb3NlX2ltcGwuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi8uLi90ZmpzLWJhY2tlbmQtd2ViZ2wvc3JjL2tlcm5lbHMvVHJhbnNwb3NlX2ltcGwudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUE7Ozs7Ozs7Ozs7Ozs7OztHQWVHO0FBRUgsT0FBTyxFQUFDLEdBQUcsRUFBYSxNQUFNLHVCQUF1QixDQUFDO0FBR3RELE9BQU8sRUFBQyxnQkFBZ0IsRUFBQyxNQUFNLHdCQUF3QixDQUFDO0FBQ3hELE9BQU8sRUFBQyxnQkFBZ0IsRUFBQyxNQUFNLGtCQUFrQixDQUFDO0FBQ2xELE9BQU8sRUFBQyxzQkFBc0IsRUFBQyxNQUFNLHlCQUF5QixDQUFDO0FBRS9ELE1BQU0sVUFBVSxhQUFhLENBQ3pCLENBQWEsRUFBRSxJQUFjLEVBQUUsT0FBeUI7SUFDMUQsTUFBTSxPQUFPLEdBQUcsR0FBRyxFQUFFLENBQUMsT0FBTyxDQUFDLDZCQUE2QixDQUFDLENBQUMsQ0FBQztRQUMxRCxJQUFJLHNCQUFzQixDQUFDLENBQUMsQ0FBQyxLQUFLLEVBQUUsSUFBSSxDQUFDLENBQUMsQ0FBQztRQUMzQyxJQUFJLGdCQUFnQixDQUFDLENBQUMsQ0FBQyxLQUFLLEVBQUUsSUFBSSxDQUFDLENBQUM7SUFDeEMsT0FBTyxPQUFPLENBQUMsZUFBZSxDQUFDLE9BQU8sRUFBRSxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxLQUFLLENBQUMsQ0FBQztBQUN4RCxDQUFDO0FBRUQsT0FBTyxFQUFDLGdCQUFnQixFQUFDLENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyIvKipcbiAqIEBsaWNlbnNlXG4gKiBDb3B5cmlnaHQgMjAyMCBHb29nbGUgTExDLiBBbGwgUmlnaHRzIFJlc2VydmVkLlxuICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlIFwiTGljZW5zZVwiKTtcbiAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS5cbiAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdFxuICpcbiAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMFxuICpcbiAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmVcbiAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuIFwiQVMgSVNcIiBCQVNJUyxcbiAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLlxuICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZFxuICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuXG4gKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuICovXG5cbmltcG9ydCB7ZW52LCBUZW5zb3JJbmZvfSBmcm9tICdAdGVuc29yZmxvdy90ZmpzLWNvcmUnO1xuXG5pbXBvcnQge01hdGhCYWNrZW5kV2ViR0x9IGZyb20gJy4uL2JhY2tlbmRfd2ViZ2wnO1xuaW1wb3J0IHt0cmFuc3Bvc2VJbXBsQ1BVfSBmcm9tICcuLi9rZXJuZWxfdXRpbHMvc2hhcmVkJztcbmltcG9ydCB7VHJhbnNwb3NlUHJvZ3JhbX0gZnJvbSAnLi4vdHJhbnNwb3NlX2dwdSc7XG5pbXBvcnQge1RyYW5zcG9zZVBhY2tlZFByb2dyYW19IGZyb20gJy4uL3RyYW5zcG9zZV9wYWNrZWRfZ3B1JztcblxuZXhwb3J0IGZ1bmN0aW9uIHRyYW5zcG9zZUltcGwoXG4gICAgeDogVGVuc29ySW5mbywgcGVybTogbnVtYmVyW10sIGJhY2tlbmQ6IE1hdGhCYWNrZW5kV2ViR0wpOiBUZW5zb3JJbmZvIHtcbiAgY29uc3QgcHJvZ3JhbSA9IGVudigpLmdldEJvb2woJ1dFQkdMX1BBQ0tfQVJSQVlfT1BFUkFUSU9OUycpID9cbiAgICAgIG5ldyBUcmFuc3Bvc2VQYWNrZWRQcm9ncmFtKHguc2hhcGUsIHBlcm0pIDpcbiAgICAgIG5ldyBUcmFuc3Bvc2VQcm9ncmFtKHguc2hhcGUsIHBlcm0pO1xuICByZXR1cm4gYmFja2VuZC5ydW5XZWJHTFByb2dyYW0ocHJvZ3JhbSwgW3hdLCB4LmR0eXBlKTtcbn1cblxuZXhwb3J0IHt0cmFuc3Bvc2VJbXBsQ1BVfTtcbiJdfQ==","/**\n * @license\n * Copyright 2020 Google LLC. All Rights Reserved.\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n * =============================================================================\n */\nimport { Sum } from '@tensorflow/tfjs-core';\nimport { sumImpl } from './Sum_impl';\nexport function sum(args) {\n const { inputs, backend, attrs } = args;\n const { x } = inputs;\n const { axis, keepDims } = attrs;\n return sumImpl(x, axis, keepDims, backend);\n}\nexport const sumConfig = {\n kernelName: Sum,\n backendName: 'webgl',\n kernelFunc: sum\n};\n//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiU3VtLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vLi4vdGZqcy1iYWNrZW5kLXdlYmdsL3NyYy9rZXJuZWxzL1N1bS50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQTs7Ozs7Ozs7Ozs7Ozs7O0dBZUc7QUFFSCxPQUFPLEVBQTJCLEdBQUcsRUFBc0IsTUFBTSx1QkFBdUIsQ0FBQztBQUl6RixPQUFPLEVBQUMsT0FBTyxFQUFDLE1BQU0sWUFBWSxDQUFDO0FBRW5DLE1BQU0sVUFBVSxHQUFHLENBQ2YsSUFBcUU7SUFDdkUsTUFBTSxFQUFDLE1BQU0sRUFBRSxPQUFPLEVBQUUsS0FBSyxFQUFDLEdBQUcsSUFBSSxDQUFDO0lBRXRDLE1BQU0sRUFBQyxDQUFDLEVBQUMsR0FBRyxNQUFNLENBQUM7SUFDbkIsTUFBTSxFQUFDLElBQUksRUFBRSxRQUFRLEVBQUMsR0FBRyxLQUFLLENBQUM7SUFFL0IsT0FBTyxPQUFPLENBQUMsQ0FBQyxFQUFFLElBQUksRUFBRSxRQUFRLEVBQUUsT0FBTyxDQUFDLENBQUM7QUFDN0MsQ0FBQztBQUVELE1BQU0sQ0FBQyxNQUFNLFNBQVMsR0FBaUI7SUFDckMsVUFBVSxFQUFFLEdBQUc7SUFDZixXQUFXLEVBQUUsT0FBTztJQUNwQixVQUFVLEVBQUUsR0FBdUI7Q0FDcEMsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbIi8qKlxuICogQGxpY2Vuc2VcbiAqIENvcHlyaWdodCAyMDIwIEdvb2dsZSBMTEMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuXG4gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgXCJMaWNlbnNlXCIpO1xuICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLlxuICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0XG4gKlxuICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wXG4gKlxuICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZVxuICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gXCJBUyBJU1wiIEJBU0lTLFxuICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuXG4gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kXG4gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS5cbiAqID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4gKi9cblxuaW1wb3J0IHtLZXJuZWxDb25maWcsIEtlcm5lbEZ1bmMsIFN1bSwgU3VtQXR0cnMsIFN1bUlucHV0c30gZnJvbSAnQHRlbnNvcmZsb3cvdGZqcy1jb3JlJztcblxuaW1wb3J0IHtNYXRoQmFja2VuZFdlYkdMfSBmcm9tICcuLi9iYWNrZW5kX3dlYmdsJztcblxuaW1wb3J0IHtzdW1JbXBsfSBmcm9tICcuL1N1bV9pbXBsJztcblxuZXhwb3J0IGZ1bmN0aW9uIHN1bShcbiAgICBhcmdzOiB7aW5wdXRzOiBTdW1JbnB1dHMsIGF0dHJzOiBTdW1BdHRycywgYmFja2VuZDogTWF0aEJhY2tlbmRXZWJHTH0pIHtcbiAgY29uc3Qge2lucHV0cywgYmFja2VuZCwgYXR0cnN9ID0gYXJncztcblxuICBjb25zdCB7eH0gPSBpbnB1dHM7XG4gIGNvbnN0IHtheGlzLCBrZWVwRGltc30gPSBhdHRycztcblxuICByZXR1cm4gc3VtSW1wbCh4LCBheGlzLCBrZWVwRGltcywgYmFja2VuZCk7XG59XG5cbmV4cG9ydCBjb25zdCBzdW1Db25maWc6IEtlcm5lbENvbmZpZyA9IHtcbiAga2VybmVsTmFtZTogU3VtLFxuICBiYWNrZW5kTmFtZTogJ3dlYmdsJyxcbiAga2VybmVsRnVuYzogc3VtIGFzIHt9IGFzIEtlcm5lbEZ1bmNcbn07XG4iXX0=","/**\n * @license\n * Copyright 2020 Google LLC. All Rights Reserved.\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n * =============================================================================\n */\nimport { backend_util, sumOutType, util } from '@tensorflow/tfjs-core';\nimport { reduce } from '../kernel_utils/reduce';\nimport { reshape } from './Reshape';\nimport { transposeImpl } from './Transpose_impl';\nexport function sumImpl(x, axis, keepDims, backend) {\n const reductionIndices = axis;\n const xRank = x.shape.length;\n const origAxes = util.parseAxisParam(reductionIndices, x.shape);\n let axes = origAxes;\n const permutedAxes = backend_util.getAxesPermutation(axes, xRank);\n const sumInputIsTransposed = permutedAxes != null;\n let sumInput = x;\n if (sumInputIsTransposed) {\n sumInput = transposeImpl(x, permutedAxes, backend);\n axes = backend_util.getInnerMostAxes(axes.length, xRank);\n }\n backend_util.assertAxesAreInnerMostDims('sum', axes, xRank);\n const [sumOutShape, reduceShape] = backend_util.computeOutAndReduceShapes(sumInput.shape, axes);\n let outShape = sumOutShape;\n if (keepDims) {\n // rather than reshape at the end, set the target shape here.\n outShape = backend_util.expandShapeToKeepDim(sumOutShape, origAxes);\n }\n const inSize = util.sizeFromShape(reduceShape);\n const xSize = util.sizeFromShape(x.shape);\n const batchSize = xSize / inSize;\n const reshapedInput = reshape({ inputs: { x: sumInput }, attrs: { shape: [batchSize, inSize] }, backend });\n const outType = sumOutType(x.dtype);\n const reduced = reduce(reshapedInput, outType, 'sum', backend);\n const out = reshape({ inputs: { x: reduced }, attrs: { shape: outShape }, backend });\n backend.disposeIntermediateTensorInfo(reshapedInput);\n backend.disposeIntermediateTensorInfo(reduced);\n if (sumInputIsTransposed) {\n backend.disposeIntermediateTensorInfo(sumInput);\n }\n return out;\n}\n//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiU3VtX2ltcGwuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi8uLi90ZmpzLWJhY2tlbmQtd2ViZ2wvc3JjL2tlcm5lbHMvU3VtX2ltcGwudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUE7Ozs7Ozs7Ozs7Ozs7OztHQWVHO0FBRUgsT0FBTyxFQUFDLFlBQVksRUFBRSxVQUFVLEVBQWMsSUFBSSxFQUFDLE1BQU0sdUJBQXVCLENBQUM7QUFHakYsT0FBTyxFQUFDLE1BQU0sRUFBQyxNQUFNLHdCQUF3QixDQUFDO0FBQzlDLE9BQU8sRUFBQyxPQUFPLEVBQUMsTUFBTSxXQUFXLENBQUM7QUFFbEMsT0FBTyxFQUFDLGFBQWEsRUFBQyxNQUFNLGtCQUFrQixDQUFDO0FBRS9DLE1BQU0sVUFBVSxPQUFPLENBQ25CLENBQWEsRUFBRSxJQUFxQixFQUFFLFFBQWlCLEVBQ3ZELE9BQXlCO0lBQzNCLE1BQU0sZ0JBQWdCLEdBQUcsSUFBSSxDQUFDO0lBRTlCLE1BQU0sS0FBSyxHQUFHLENBQUMsQ0FBQyxLQUFLLENBQUMsTUFBTSxDQUFDO0lBRTdCLE1BQU0sUUFBUSxHQUFHLElBQUksQ0FBQyxjQUFjLENBQUMsZ0JBQWdCLEVBQUUsQ0FBQyxDQUFDLEtBQUssQ0FBQyxDQUFDO0lBQ2hFLElBQUksSUFBSSxHQUFHLFFBQVEsQ0FBQztJQUNwQixNQUFNLFlBQVksR0FBRyxZQUFZLENBQUMsa0JBQWtCLENBQUMsSUFBSSxFQUFFLEtBQUssQ0FBQyxDQUFDO0lBQ2xFLE1BQU0sb0JBQW9CLEdBQUcsWUFBWSxJQUFJLElBQUksQ0FBQztJQUVsRCxJQUFJLFFBQVEsR0FBRyxDQUFDLENBQUM7SUFDakIsSUFBSSxvQkFBb0IsRUFBRTtRQUN4QixRQUFRLEdBQUcsYUFBYSxDQUFDLENBQUMsRUFBRSxZQUFZLEVBQUUsT0FBTyxDQUFDLENBQUM7UUFFbkQsSUFBSSxHQUFHLFlBQVksQ0FBQyxnQkFBZ0IsQ0FBQyxJQUFJLENBQUMsTUFBTSxFQUFFLEtBQUssQ0FBQyxDQUFDO0tBQzFEO0lBRUQsWUFBWSxDQUFDLDBCQUEwQixDQUFDLEtBQUssRUFBRSxJQUFJLEVBQUUsS0FBSyxDQUFDLENBQUM7SUFDNUQsTUFBTSxDQUFDLFdBQVcsRUFBRSxXQUFXLENBQUMsR0FDNUIsWUFBWSxDQUFDLHlCQUF5QixDQUFDLFFBQVEsQ0FBQyxLQUFLLEVBQUUsSUFBSSxDQUFDLENBQUM7SUFFakUsSUFBSSxRQUFRLEdBQUcsV0FBVyxDQUFDO0lBQzNCLElBQUksUUFBUSxFQUFFO1FBQ1osNkRBQTZEO1FBQzdELFFBQVEsR0FBRyxZQUFZLENBQUMsb0JBQW9CLENBQUMsV0FBVyxFQUFFLFFBQVEsQ0FBQyxDQUFDO0tBQ3JFO0lBRUQsTUFBTSxNQUFNLEdBQUcsSUFBSSxDQUFDLGFBQWEsQ0FBQyxXQUFXLENBQUMsQ0FBQztJQUMvQyxNQUFNLEtBQUssR0FBRyxJQUFJLENBQUMsYUFBYSxDQUFDLENBQUMsQ0FBQyxLQUFLLENBQUMsQ0FBQztJQUMxQyxNQUFNLFNBQVMsR0FBRyxLQUFLLEdBQUcsTUFBTSxDQUFDO0lBQ2pDLE1BQU0sYUFBYSxHQUFHLE9BQU8sQ0FDekIsRUFBQyxNQUFNLEVBQUUsRUFBQyxDQUFDLEVBQUUsUUFBUSxFQUFDLEVBQUUsS0FBSyxFQUFFLEVBQUMsS0FBSyxFQUFFLENBQUMsU0FBUyxFQUFFLE1BQU0sQ0FBQyxFQUFDLEVBQUUsT0FBTyxFQUFDLENBQUMsQ0FBQztJQUUzRSxNQUFNLE9BQU8sR0FBRyxVQUFVLENBQUMsQ0FBQyxDQUFDLEtBQUssQ0FBQyxDQUFDO0lBRXBDLE1BQU0sT0FBTyxHQUFHLE1BQU0sQ0FBQyxhQUFhLEVBQUUsT0FBTyxFQUFFLEtBQUssRUFBRSxPQUFPLENBQUMsQ0FBQztJQUMvRCxNQUFNLEdBQUcsR0FDTCxPQUFPLENBQUMsRUFBQyxNQUFNLEVBQUUsRUFBQyxDQUFDLEVBQUUsT0FBTyxFQUFDLEVBQUUsS0FBSyxFQUFFLEVBQUMsS0FBSyxFQUFFLFFBQVEsRUFBQyxFQUFFLE9BQU8sRUFBQyxDQUFDLENBQUM7SUFFdkUsT0FBTyxDQUFDLDZCQUE2QixDQUFDLGFBQWEsQ0FBQyxDQUFDO0lBQ3JELE9BQU8sQ0FBQyw2QkFBNkIsQ0FBQyxPQUFPLENBQUMsQ0FBQztJQUMvQyxJQUFJLG9CQUFvQixFQUFFO1FBQ3hCLE9BQU8sQ0FBQyw2QkFBNkIsQ0FBQyxRQUFRLENBQUMsQ0FBQztLQUNqRDtJQUVELE9BQU8sR0FBRyxDQUFDO0FBQ2IsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbIi8qKlxuICogQGxpY2Vuc2VcbiAqIENvcHlyaWdodCAyMDIwIEdvb2dsZSBMTEMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuXG4gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgXCJMaWNlbnNlXCIpO1xuICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLlxuICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0XG4gKlxuICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wXG4gKlxuICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZVxuICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gXCJBUyBJU1wiIEJBU0lTLFxuICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuXG4gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kXG4gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS5cbiAqID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4gKi9cblxuaW1wb3J0IHtiYWNrZW5kX3V0aWwsIHN1bU91dFR5cGUsIFRlbnNvckluZm8sIHV0aWx9IGZyb20gJ0B0ZW5zb3JmbG93L3RmanMtY29yZSc7XG5cbmltcG9ydCB7TWF0aEJhY2tlbmRXZWJHTH0gZnJvbSAnLi4vYmFja2VuZF93ZWJnbCc7XG5pbXBvcnQge3JlZHVjZX0gZnJvbSAnLi4va2VybmVsX3V0aWxzL3JlZHVjZSc7XG5pbXBvcnQge3Jlc2hhcGV9IGZyb20gJy4vUmVzaGFwZSc7XG5cbmltcG9ydCB7dHJhbnNwb3NlSW1wbH0gZnJvbSAnLi9UcmFuc3Bvc2VfaW1wbCc7XG5cbmV4cG9ydCBmdW5jdGlvbiBzdW1JbXBsKFxuICAgIHg6IFRlbnNvckluZm8sIGF4aXM6IG51bWJlcnxudW1iZXJbXSwga2VlcERpbXM6IGJvb2xlYW4sXG4gICAgYmFja2VuZDogTWF0aEJhY2tlbmRXZWJHTCk6IFRlbnNvckluZm8ge1xuICBjb25zdCByZWR1Y3Rpb25JbmRpY2VzID0gYXhpcztcblxuICBjb25zdCB4UmFuayA9IHguc2hhcGUubGVuZ3RoO1xuXG4gIGNvbnN0IG9yaWdBeGVzID0gdXRpbC5wYXJzZUF4aXNQYXJhbShyZWR1Y3Rpb25JbmRpY2VzLCB4LnNoYXBlKTtcbiAgbGV0IGF4ZXMgPSBvcmlnQXhlcztcbiAgY29uc3QgcGVybXV0ZWRBeGVzID0gYmFja2VuZF91dGlsLmdldEF4ZXNQZXJtdXRhdGlvbihheGVzLCB4UmFuayk7XG4gIGNvbnN0IHN1bUlucHV0SXNUcmFuc3Bvc2VkID0gcGVybXV0ZWRBeGVzICE9IG51bGw7XG5cbiAgbGV0IHN1bUlucHV0ID0geDtcbiAgaWYgKHN1bUlucHV0SXNUcmFuc3Bvc2VkKSB7XG4gICAgc3VtSW5wdXQgPSB0cmFuc3Bvc2VJbXBsKHgsIHBlcm11dGVkQXhlcywgYmFja2VuZCk7XG5cbiAgICBheGVzID0gYmFja2VuZF91dGlsLmdldElubmVyTW9zdEF4ZXMoYXhlcy5sZW5ndGgsIHhSYW5rKTtcbiAgfVxuXG4gIGJhY2tlbmRfdXRpbC5hc3NlcnRBeGVzQXJlSW5uZXJNb3N0RGltcygnc3VtJywgYXhlcywgeFJhbmspO1xuICBjb25zdCBbc3VtT3V0U2hhcGUsIHJlZHVjZVNoYXBlXSA9XG4gICAgICBiYWNrZW5kX3V0aWwuY29tcHV0ZU91dEFuZFJlZHVjZVNoYXBlcyhzdW1JbnB1dC5zaGFwZSwgYXhlcyk7XG5cbiAgbGV0IG91dFNoYXBlID0gc3VtT3V0U2hhcGU7XG4gIGlmIChrZWVwRGltcykge1xuICAgIC8vIHJhdGhlciB0aGFuIHJlc2hhcGUgYXQgdGhlIGVuZCwgc2V0IHRoZSB0YXJnZXQgc2hhcGUgaGVyZS5cbiAgICBvdXRTaGFwZSA9IGJhY2tlbmRfdXRpbC5leHBhbmRTaGFwZVRvS2VlcERpbShzdW1PdXRTaGFwZSwgb3JpZ0F4ZXMpO1xuICB9XG5cbiAgY29uc3QgaW5TaXplID0gdXRpbC5zaXplRnJvbVNoYXBlKHJlZHVjZVNoYXBlKTtcbiAgY29uc3QgeFNpemUgPSB1dGlsLnNpemVGcm9tU2hhcGUoeC5zaGFwZSk7XG4gIGNvbnN0IGJhdGNoU2l6ZSA9IHhTaXplIC8gaW5TaXplO1xuICBjb25zdCByZXNoYXBlZElucHV0ID0gcmVzaGFwZShcbiAgICAgIHtpbnB1dHM6IHt4OiBzdW1JbnB1dH0sIGF0dHJzOiB7c2hhcGU6IFtiYXRjaFNpemUsIGluU2l6ZV19LCBiYWNrZW5kfSk7XG5cbiAgY29uc3Qgb3V0VHlwZSA9IHN1bU91dFR5cGUoeC5kdHlwZSk7XG5cbiAgY29uc3QgcmVkdWNlZCA9IHJlZHVjZShyZXNoYXBlZElucHV0LCBvdXRUeXBlLCAnc3VtJywgYmFja2VuZCk7XG4gIGNvbnN0IG91dCA9XG4gICAgICByZXNoYXBlKHtpbnB1dHM6IHt4OiByZWR1Y2VkfSwgYXR0cnM6IHtzaGFwZTogb3V0U2hhcGV9LCBiYWNrZW5kfSk7XG5cbiAgYmFja2VuZC5kaXNwb3NlSW50ZXJtZWRpYXRlVGVuc29ySW5mbyhyZXNoYXBlZElucHV0KTtcbiAgYmFja2VuZC5kaXNwb3NlSW50ZXJtZWRpYXRlVGVuc29ySW5mbyhyZWR1Y2VkKTtcbiAgaWYgKHN1bUlucHV0SXNUcmFuc3Bvc2VkKSB7XG4gICAgYmFja2VuZC5kaXNwb3NlSW50ZXJtZWRpYXRlVGVuc29ySW5mbyhzdW1JbnB1dCk7XG4gIH1cblxuICByZXR1cm4gb3V0O1xufVxuIl19","/**\n * @license\n * Copyright 2020 Google LLC. All Rights Reserved.\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n * =============================================================================\n */\nimport { Transpose } from '@tensorflow/tfjs-core';\nimport { transposeImpl } from './Transpose_impl';\nimport { transposeImplCPU as cpuTranspose } from './Transpose_impl';\nexport function transpose(args) {\n const { inputs, backend, attrs } = args;\n const { x } = inputs;\n const { perm } = attrs;\n const webglBackend = backend;\n const xRank = x.shape.length;\n const newShape = new Array(xRank);\n for (let i = 0; i < newShape.length; i++) {\n newShape[i] = x.shape[perm[i]];\n }\n let out;\n if (webglBackend.shouldExecuteOnCPU([x])) {\n const xTexData = webglBackend.texData.get(x.dataId);\n const values = xTexData.values;\n const outValues = cpuTranspose(values, x.shape, x.dtype, perm, newShape);\n out = webglBackend.makeTensorInfo(newShape, x.dtype);\n const outData = webglBackend.texData.get(out.dataId);\n outData.values = outValues;\n }\n else {\n out = transposeImpl(x, perm, webglBackend);\n }\n return out;\n}\nexport const transposeConfig = {\n kernelName: Transpose,\n backendName: 'webgl',\n kernelFunc: transpose\n};\n//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiVHJhbnNwb3NlLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vLi4vdGZqcy1iYWNrZW5kLXdlYmdsL3NyYy9rZXJuZWxzL1RyYW5zcG9zZS50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQTs7Ozs7Ozs7Ozs7Ozs7O0dBZUc7QUFFSCxPQUFPLEVBQXVDLFNBQVMsRUFBOEMsTUFBTSx1QkFBdUIsQ0FBQztBQUluSSxPQUFPLEVBQUMsYUFBYSxFQUFDLE1BQU0sa0JBQWtCLENBQUM7QUFDL0MsT0FBTyxFQUFDLGdCQUFnQixJQUFJLFlBQVksRUFBQyxNQUFNLGtCQUFrQixDQUFDO0FBRWxFLE1BQU0sVUFBVSxTQUFTLENBQUMsSUFJekI7SUFDQyxNQUFNLEVBQUMsTUFBTSxFQUFFLE9BQU8sRUFBRSxLQUFLLEVBQUMsR0FBRyxJQUFJLENBQUM7SUFDdEMsTUFBTSxFQUFDLENBQUMsRUFBQyxHQUFHLE1BQU0sQ0FBQztJQUNuQixNQUFNLEVBQUMsSUFBSSxFQUFDLEdBQUcsS0FBSyxDQUFDO0lBQ3JCLE1BQU0sWUFBWSxHQUFHLE9BQU8sQ0FBQztJQUU3QixNQUFNLEtBQUssR0FBRyxDQUFDLENBQUMsS0FBSyxDQUFDLE1BQU0sQ0FBQztJQUU3QixNQUFNLFFBQVEsR0FBYSxJQUFJLEtBQUssQ0FBQyxLQUFLLENBQUMsQ0FBQztJQUM1QyxLQUFLLElBQUksQ0FBQyxHQUFHLENBQUMsRUFBRSxDQUFDLEdBQUcsUUFBUSxDQUFDLE1BQU0sRUFBRSxDQUFDLEVBQUUsRUFBRTtRQUN4QyxRQUFRLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLEtBQUssQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQztLQUNoQztJQUVELElBQUksR0FBZSxDQUFDO0lBQ3BCLElBQUksWUFBWSxDQUFDLGtCQUFrQixDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsRUFBRTtRQUN4QyxNQUFNLFFBQVEsR0FBRyxZQUFZLENBQUMsT0FBTyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsTUFBTSxDQUFDLENBQUM7UUFDcEQsTUFBTSxNQUFNLEdBQUcsUUFBUSxDQUFDLE1BQW9CLENBQUM7UUFDN0MsTUFBTSxTQUFTLEdBQUcsWUFBWSxDQUFDLE1BQU0sRUFBRSxDQUFDLENBQUMsS0FBSyxFQUFFLENBQUMsQ0FBQyxLQUFLLEVBQUUsSUFBSSxFQUFFLFFBQVEsQ0FBQyxDQUFDO1FBRXpFLEdBQUcsR0FBRyxZQUFZLENBQUMsY0FBYyxDQUFDLFFBQVEsRUFBRSxDQUFDLENBQUMsS0FBSyxDQUFDLENBQUM7UUFDckQsTUFBTSxPQUFPLEdBQUcsWUFBWSxDQUFDLE9BQU8sQ0FBQyxHQUFHLENBQUMsR0FBRyxDQUFDLE1BQU0sQ0FBQyxDQUFDO1FBQ3JELE9BQU8sQ0FBQyxNQUFNLEdBQUcsU0FBUyxDQUFDO0tBQzVCO1NBQU07UUFDTCxHQUFHLEdBQUcsYUFBYSxDQUFDLENBQUMsRUFBRSxJQUFJLEVBQUUsWUFBWSxDQUFDLENBQUM7S0FDNUM7SUFDRCxPQUFPLEdBQUcsQ0FBQztBQUNiLENBQUM7QUFFRCxNQUFNLENBQUMsTUFBTSxlQUFlLEdBQWlCO0lBQzNDLFVBQVUsRUFBRSxTQUFTO0lBQ3JCLFdBQVcsRUFBRSxPQUFPO0lBQ3BCLFVBQVUsRUFBRSxTQUE2QjtDQUMxQyxDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiLyoqXG4gKiBAbGljZW5zZVxuICogQ29weXJpZ2h0IDIwMjAgR29vZ2xlIExMQy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC5cbiAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSBcIkxpY2Vuc2VcIik7XG4gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuXG4gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXRcbiAqXG4gKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjBcbiAqXG4gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlXG4gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiBcIkFTIElTXCIgQkFTSVMsXG4gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC5cbiAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmRcbiAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLlxuICogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbiAqL1xuXG5pbXBvcnQge0tlcm5lbENvbmZpZywgS2VybmVsRnVuYywgVGVuc29ySW5mbywgVHJhbnNwb3NlLCBUcmFuc3Bvc2VBdHRycywgVHJhbnNwb3NlSW5wdXRzLCBUeXBlZEFycmF5fSBmcm9tICdAdGVuc29yZmxvdy90ZmpzLWNvcmUnO1xuXG5pbXBvcnQge01hdGhCYWNrZW5kV2ViR0x9IGZyb20gJy4uL2JhY2tlbmRfd2ViZ2wnO1xuXG5pbXBvcnQge3RyYW5zcG9zZUltcGx9IGZyb20gJy4vVHJhbnNwb3NlX2ltcGwnO1xuaW1wb3J0IHt0cmFuc3Bvc2VJbXBsQ1BVIGFzIGNwdVRyYW5zcG9zZX0gZnJvbSAnLi9UcmFuc3Bvc2VfaW1wbCc7XG5cbmV4cG9ydCBmdW5jdGlvbiB0cmFuc3Bvc2UoYXJnczoge1xuICBpbnB1dHM6IFRyYW5zcG9zZUlucHV0cyxcbiAgYXR0cnM6IFRyYW5zcG9zZUF0dHJzLFxuICBiYWNrZW5kOiBNYXRoQmFja2VuZFdlYkdMXG59KSB7XG4gIGNvbnN0IHtpbnB1dHMsIGJhY2tlbmQsIGF0dHJzfSA9IGFyZ3M7XG4gIGNvbnN0IHt4fSA9IGlucHV0cztcbiAgY29uc3Qge3Blcm19ID0gYXR0cnM7XG4gIGNvbnN0IHdlYmdsQmFja2VuZCA9IGJhY2tlbmQ7XG5cbiAgY29uc3QgeFJhbmsgPSB4LnNoYXBlLmxlbmd0aDtcblxuICBjb25zdCBuZXdTaGFwZTogbnVtYmVyW10gPSBuZXcgQXJyYXkoeFJhbmspO1xuICBmb3IgKGxldCBpID0gMDsgaSA8IG5ld1NoYXBlLmxlbmd0aDsgaSsrKSB7XG4gICAgbmV3U2hhcGVbaV0gPSB4LnNoYXBlW3Blcm1baV1dO1xuICB9XG5cbiAgbGV0IG91dDogVGVuc29ySW5mbztcbiAgaWYgKHdlYmdsQmFja2VuZC5zaG91bGRFeGVjdXRlT25DUFUoW3hdKSkge1xuICAgIGNvbnN0IHhUZXhEYXRhID0gd2ViZ2xCYWNrZW5kLnRleERhdGEuZ2V0KHguZGF0YUlkKTtcbiAgICBjb25zdCB2YWx1ZXMgPSB4VGV4RGF0YS52YWx1ZXMgYXMgVHlwZWRBcnJheTtcbiAgICBjb25zdCBvdXRWYWx1ZXMgPSBjcHVUcmFuc3Bvc2UodmFsdWVzLCB4LnNoYXBlLCB4LmR0eXBlLCBwZXJtLCBuZXdTaGFwZSk7XG5cbiAgICBvdXQgPSB3ZWJnbEJhY2tlbmQubWFrZVRlbnNvckluZm8obmV3U2hhcGUsIHguZHR5cGUpO1xuICAgIGNvbnN0IG91dERhdGEgPSB3ZWJnbEJhY2tlbmQudGV4RGF0YS5nZXQob3V0LmRhdGFJZCk7XG4gICAgb3V0RGF0YS52YWx1ZXMgPSBvdXRWYWx1ZXM7XG4gIH0gZWxzZSB7XG4gICAgb3V0ID0gdHJhbnNwb3NlSW1wbCh4LCBwZXJtLCB3ZWJnbEJhY2tlbmQpO1xuICB9XG4gIHJldHVybiBvdXQ7XG59XG5cbmV4cG9ydCBjb25zdCB0cmFuc3Bvc2VDb25maWc6IEtlcm5lbENvbmZpZyA9IHtcbiAga2VybmVsTmFtZTogVHJhbnNwb3NlLFxuICBiYWNrZW5kTmFtZTogJ3dlYmdsJyxcbiAga2VybmVsRnVuYzogdHJhbnNwb3NlIGFzIHt9IGFzIEtlcm5lbEZ1bmNcbn07XG4iXX0=","/**\n * @license\n * Copyright 2020 Google LLC. All Rights Reserved.\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n * =============================================================================\n */\nimport { broadcast_util, upcastType, util } from '@tensorflow/tfjs-core';\nimport { mapActivationToShaderProgram } from '../kernel_utils/kernel_funcs_utils';\nimport { MatMulPackedProgram } from '../mulmat_packed_gpu';\nimport { multiply } from './Multiply';\nimport { reshape } from './Reshape';\nimport { sum } from './Sum';\nimport { transpose } from './Transpose';\n// Empirically determined minimal shared dimension in matmul before we forward\n// to a.mul(b).sum() in order to take advantage of GPU parallelism. See\n// https://github.com/tensorflow/tfjs-core/pull/1379 for benchmarks.\nexport const MATMUL_SHARED_DIM_THRESHOLD = 1000;\nexport function batchMatMulImpl({ a, b, transposeA, transposeB, backend, bias = null, preluActivationWeights = null, leakyreluAlpha = 0, activation = null }) {\n const aRank = a.shape.length;\n const bRank = b.shape.length;\n const innerShapeA = transposeA ? a.shape[aRank - 2] : a.shape[aRank - 1];\n const innerShapeB = transposeB ? b.shape[bRank - 1] : b.shape[bRank - 2];\n const outerShapeA = transposeA ? a.shape[aRank - 1] : a.shape[aRank - 2];\n const outerShapeB = transposeB ? b.shape[bRank - 2] : b.shape[bRank - 1];\n const outerDimsA = a.shape.slice(0, -2);\n const outerDimsB = b.shape.slice(0, -2);\n const batchDimA = util.sizeFromShape(outerDimsA);\n const batchDimB = util.sizeFromShape(outerDimsB);\n const outShapeOuterDims = broadcast_util.assertAndGetBroadcastShape(a.shape.slice(0, -2), b.shape.slice(0, -2));\n const outShape = outShapeOuterDims.concat([outerShapeA, outerShapeB]);\n util.assert(innerShapeA === innerShapeB, () => `Error in matMul: inner shapes (${innerShapeA}) and (` +\n `${innerShapeB}) of Tensors with shapes ${a.shape} and ` +\n `${b.shape} and transposeA=${transposeA}` +\n ` and transposeB=${transposeB} must match.`);\n const a3dShape = transposeA ?\n [batchDimA, innerShapeA, outerShapeA] :\n [batchDimA, outerShapeA, innerShapeA];\n const b3dShape = transposeB ?\n [batchDimB, outerShapeB, innerShapeB] :\n [batchDimB, innerShapeB, outerShapeB];\n // The rest of the implementation is designed to operate on rank-3 tensors\n const a3d = reshape({ inputs: { x: a }, backend, attrs: { shape: a3dShape } });\n const b3d = reshape({ inputs: { x: b }, backend, attrs: { shape: b3dShape } });\n const intermediates = [a3d, b3d];\n const batchDim = Math.max(batchDimA, batchDimB);\n const sharedDim = transposeA ? a3d.shape[1] : a3d.shape[2];\n const hasBias = bias != null;\n const hasPreluActivationWeights = preluActivationWeights != null;\n const hasLeakyreluAlpha = activation === 'leakyrelu';\n const fusedActivation = activation != null ?\n mapActivationToShaderProgram(activation, true) :\n null;\n const containsFusedOps = hasBias || hasPreluActivationWeights ||\n hasLeakyreluAlpha || fusedActivation != null;\n let out;\n // Since the matrices are vectors, it is faster to call mul().sum()\n // because sum() is O(sqrt(N)) due to divide-and-conquer.\n if ((outerShapeA === 1 || outerShapeB === 1) &&\n sharedDim > MATMUL_SHARED_DIM_THRESHOLD && containsFusedOps === false) {\n let aVec = a3d;\n let bVec = b3d;\n if (transposeA) {\n aVec = transpose({ inputs: { x: a3d }, backend, attrs: { perm: [0, 2, 1] } });\n intermediates.push(aVec);\n }\n if (transposeB) {\n bVec = transpose({ inputs: { x: b3d }, backend, attrs: { perm: [0, 2, 1] } });\n intermediates.push(bVec);\n }\n const shouldReshapeA = outerShapeB !== 1;\n const shouldReshapeB = outerShapeB === 1;\n let aVec3d = aVec;\n if (shouldReshapeA) {\n aVec3d = reshape({\n inputs: { x: aVec },\n backend,\n attrs: { shape: [batchDim, sharedDim, 1] }\n });\n intermediates.push(aVec3d);\n }\n const axis = outerShapeB === 1 ? 2 : 1;\n let bVec3d = bVec;\n if (shouldReshapeB) {\n bVec3d = reshape({\n inputs: { x: bVec },\n backend,\n attrs: { shape: [batchDim, 1, sharedDim] }\n });\n intermediates.push(bVec3d);\n }\n const product = multiply({ inputs: { a: aVec3d, b: bVec3d }, backend });\n out = sum({ inputs: { x: product }, backend, attrs: { axis, keepDims: true } });\n intermediates.push(product);\n }\n else {\n const dtype = upcastType(a.dtype, b.dtype);\n const program = new MatMulPackedProgram(a3dShape, b3dShape, [batchDim, outerShapeA, outerShapeB], transposeA, transposeB, hasBias, fusedActivation, hasPreluActivationWeights, hasLeakyreluAlpha);\n const inputs = [a3d, b3d];\n if (bias != null) {\n inputs.push(bias);\n }\n if (hasPreluActivationWeights) {\n inputs.push(preluActivationWeights);\n }\n if (hasLeakyreluAlpha) {\n const $leakyreluAlpha = backend.makeTensorInfo([], 'float32', util.createScalarValue(leakyreluAlpha, 'float32'));\n inputs.push($leakyreluAlpha);\n intermediates.push($leakyreluAlpha);\n }\n out = backend.runWebGLProgram(program, inputs, dtype);\n }\n const outReshaped = reshape({ inputs: { x: out }, backend, attrs: { shape: outShape } });\n intermediates.push(out);\n for (const i of intermediates) {\n backend.disposeIntermediateTensorInfo(i);\n }\n return outReshaped;\n}\n//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiQmF0Y2hNYXRNdWxfaW1wbC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uLy4uL3RmanMtYmFja2VuZC13ZWJnbC9zcmMva2VybmVscy9CYXRjaE1hdE11bF9pbXBsLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBOzs7Ozs7Ozs7Ozs7Ozs7R0FlRztBQUVILE9BQU8sRUFBZSxjQUFjLEVBQWMsVUFBVSxFQUFFLElBQUksRUFBQyxNQUFNLHVCQUF1QixDQUFDO0FBR2pHLE9BQU8sRUFBQyw0QkFBNEIsRUFBQyxNQUFNLG9DQUFvQyxDQUFDO0FBQ2hGLE9BQU8sRUFBQyxtQkFBbUIsRUFBQyxNQUFNLHNCQUFzQixDQUFDO0FBRXpELE9BQU8sRUFBQyxRQUFRLEVBQUMsTUFBTSxZQUFZLENBQUM7QUFDcEMsT0FBTyxFQUFDLE9BQU8sRUFBQyxNQUFNLFdBQVcsQ0FBQztBQUNsQyxPQUFPLEVBQUMsR0FBRyxFQUFDLE1BQU0sT0FBTyxDQUFDO0FBQzFCLE9BQU8sRUFBQyxTQUFTLEVBQUMsTUFBTSxhQUFhLENBQUM7QUFFdEMsOEVBQThFO0FBQzlFLHVFQUF1RTtBQUN2RSxvRUFBb0U7QUFDcEUsTUFBTSxDQUFDLE1BQU0sMkJBQTJCLEdBQUcsSUFBSSxDQUFDO0FBY2hELE1BQU0sVUFBVSxlQUFlLENBQUMsRUFDOUIsQ0FBQyxFQUNELENBQUMsRUFDRCxVQUFVLEVBQ1YsVUFBVSxFQUNWLE9BQU8sRUFDUCxJQUFJLEdBQUcsSUFBSSxFQUNYLHNCQUFzQixHQUFHLElBQUksRUFDN0IsY0FBYyxHQUFHLENBQUMsRUFDbEIsVUFBVSxHQUFHLElBQUksRUFDQztJQUNsQixNQUFNLEtBQUssR0FBRyxDQUFDLENBQUMsS0FBSyxDQUFDLE1BQU0sQ0FBQztJQUM3QixNQUFNLEtBQUssR0FBRyxDQUFDLENBQUMsS0FBSyxDQUFDLE1BQU0sQ0FBQztJQUU3QixNQUFNLFdBQVcsR0FBRyxVQUFVLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxLQUFLLENBQUMsS0FBSyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsS0FBSyxDQUFDLEtBQUssR0FBRyxDQUFDLENBQUMsQ0FBQztJQUN6RSxNQUFNLFdBQVcsR0FBRyxVQUFVLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxLQUFLLENBQUMsS0FBSyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsS0FBSyxDQUFDLEtBQUssR0FBRyxDQUFDLENBQUMsQ0FBQztJQUV6RSxNQUFNLFdBQVcsR0FBRyxVQUFVLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxLQUFLLENBQUMsS0FBSyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsS0FBSyxDQUFDLEtBQUssR0FBRyxDQUFDLENBQUMsQ0FBQztJQUN6RSxNQUFNLFdBQVcsR0FBRyxVQUFVLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxLQUFLLENBQUMsS0FBSyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsS0FBSyxDQUFDLEtBQUssR0FBRyxDQUFDLENBQUMsQ0FBQztJQUV6RSxNQUFNLFVBQVUsR0FBRyxDQUFDLENBQUMsS0FBSyxDQUFDLEtBQUssQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsQ0FBQztJQUN4QyxNQUFNLFVBQVUsR0FBRyxDQUFDLENBQUMsS0FBSyxDQUFDLEtBQUssQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsQ0FBQztJQUV4QyxNQUFNLFNBQVMsR0FBRyxJQUFJLENBQUMsYUFBYSxDQUFDLFVBQVUsQ0FBQyxDQUFDO0lBQ2pELE1BQU0sU0FBUyxHQUFHLElBQUksQ0FBQyxhQUFhLENBQUMsVUFBVSxDQUFDLENBQUM7SUFFakQsTUFBTSxpQkFBaUIsR0FBRyxjQUFjLENBQUMsMEJBQTBCLENBQy9ELENBQUMsQ0FBQyxLQUFLLENBQUMsS0FBSyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxFQUFFLENB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LE9BQU8sQ0FBQyxjQUFjLENBQzFDLEVBQUUsRUFBRSxTQUFTLEVBQ2IsSUFBSSxDQUFDLGlCQUFpQixDQUFDLGNBQWlDLEVBQUUsU0FBUyxDQUFDLENBQUMsQ0FBQztZQUMxRSxNQUFNLENBQUMsSUFBSSxDQUFDLGVBQWUsQ0FBQyxDQUFDO1lBQzdCLGFBQWEsQ0FBQyxJQUFJLENBQUMsZUFBZSxDQUFDLENBQUM7U0FDckM7UUFFRCxHQUFHLEdBQUcsT0FBTyxDQUFDLGVBQWUsQ0FBQyxPQUFPLEVBQUUsTUFBTSxFQUFFLEtBQUssQ0FBQyxDQUFDO0tBQ3ZEO0lBRUQsTUFBTSxXQUFXLEdBQ2IsT0FBTyxDQUFDLEVBQUMsTUFBTSxFQUFFLEVBQUMsQ0FBQyxFQUFFLEdBQUcsRUFBQyxFQUFFLE9BQU8sRUFBRSxLQUFLLEVBQUUsRUFBQyxLQUFLLEVBQUUsUUFBUSxFQUFDLEVBQUMsQ0FBQyxDQUFDO0lBQ25FLGFBQWEsQ0FBQyxJQUFJLENBQUMsR0FBRyxDQUFDLENBQUM7SUFDeEIsS0FBSyxNQUFNLENBQUMsSUFBSSxhQUFhLEVBQUU7UUFDN0IsT0FBTyxDQUFDLDZCQUE2QixDQUFDLENBQUMsQ0FBQyxDQUFDO0tBQzFDO0lBQ0QsT0FBTyxXQUFXLENBQUM7QUFDckIsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbIi8qKlxuICogQGxpY2Vuc2VcbiAqIENvcHlyaWdodCAyMDIwIEdvb2dsZSBMTEMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuXG4gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgXCJMaWNlbnNlXCIpO1xuICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLlxuICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0XG4gKlxuICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wXG4gKlxuICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZVxuICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gXCJBUyBJU1wiIEJBU0lTLFxuICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuXG4gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kXG4gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS5cbiAqID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4gKi9cblxuaW1wb3J0IHtiYWNrZW5kX3V0aWwsIGJyb2FkY2FzdF91dGlsLCBUZW5zb3JJbmZvLCB1cGNhc3RUeXBlLCB1dGlsfSBmcm9tICdAdGVuc29yZmxvdy90ZmpzLWNvcmUnO1xuXG5pbXBvcnQge01hdGhCYWNrZW5kV2ViR0x9IGZyb20gJy4uL2JhY2tlbmRfd2ViZ2wnO1xuaW1wb3J0IHttYXBBY3RpdmF0aW9uVG9TaGFkZXJQcm9ncmFtfSBmcm9tICcuLi9rZXJuZWxfdXRpbHMva2VybmVsX2Z1bmNzX3V0aWxzJztcbmltcG9ydCB7TWF0TXVsUGFja2VkUHJvZ3JhbX0gZnJvbSAnLi4vbXVsbWF0X3BhY2tlZF9ncHUnO1xuXG5pbXBvcnQge211bHRpcGx5fSBmcm9tICcuL011bHRpcGx5JztcbmltcG9ydCB7cmVzaGFwZX0gZnJvbSAnLi9SZXNoYXBlJztcbmltcG9ydCB7c3VtfSBmcm9tICcuL1N1bSc7XG5pbXBvcnQge3RyYW5zcG9zZX0gZnJvbSAnLi9UcmFuc3Bvc2UnO1xuXG4vLyBFbXBpcmljYWxseSBkZXRlcm1pbmVkIG1pbmltYWwgc2hhcmVkIGRpbWVuc2lvbiBpbiBtYXRtdWwgYmVmb3JlIHdlIGZvcndhcmRcbi8vIHRvIGEubXVsKGIpLnN1bSgpIGluIG9yZGVyIHRvIHRha2UgYWR2YW50YWdlIG9mIEdQVSBwYXJhbGxlbGlzbS4gU2VlXG4vLyBodHRwczovL2dpdGh1Yi5jb20vdGVuc29yZmxvdy90ZmpzLWNvcmUvcHVsbC8xMzc5IGZvciBiZW5jaG1hcmtzLlxuZXhwb3J0IGNvbnN0IE1BVE1VTF9TSEFSRURfRElNX1RIUkVTSE9MRCA9IDEwMDA7XG5cbnR5cGUgQmF0Y2hNYXRNdWxDb25maWcgPSB7XG4gIGE6IFRlbnNvckluZm8sXG4gIGI6IFRlbnNvckluZm8sXG4gIHRyYW5zcG9zZUE6IGJvb2xlYW4sXG4gIHRyYW5zcG9zZUI6IGJvb2xlYW4sXG4gIGJhY2tlbmQ6IE1hdGhCYWNrZW5kV2ViR0wsXG4gIGJpYXM/OiBUZW5zb3JJbmZvLFxuICBwcmVsdUFjdGl2YXRpb25XZWlnaHRzPzogVGVuc29ySW5mbyxcbiAgbGVha3lyZWx1QWxwaGE/OiBudW1iZXIsXG4gIGFjdGl2YXRpb24/OiBiYWNrZW5kX3V0aWwuQWN0aXZhdGlvblxufTtcblxuZXhwb3J0IGZ1bmN0aW9uIGJhdGNoTWF0TXVsSW1wbCh7XG4gIGEsXG4gIGIsXG4gIHRyYW5zcG9zZUEsXG4gIHRyYW5zcG9zZUIsXG4gIGJhY2tlbmQsXG4gIGJpYXMgPSBudWxsLFxuICBwcmVsdUFjdGl2YXRpb25XZWlnaHRzID0gbnVsbCxcbiAgbGVha3lyZWx1QWxwaGEgPSAwLFxuICBhY3RpdmF0aW9uID0gbnVsbFxufTogQmF0Y2hNYXRNdWxDb25maWcpOiBUZW5zb3JJbmZvIHtcbiAgY29uc3QgYVJhbmsgPSBhLnNoYXBlLmxlbmd0aDtcbiAgY29uc3QgYlJhbmsgPSBiLnNoYXBlLmxlbmd0aDtcblxuICBjb25zdCBpbm5lclNoYXBlQSA9IHRyYW5zcG9zZUEgPyBhLnNoYXBlW2FSYW5rIC0gMl0gOiBhLnNoYXBlW2FSYW5rIC0gMV07XG4gIGNvbnN0IGlubmVyU2hhcGVCID0gdHJhbnNwb3NlQiA/IGIuc2hhcGVbYlJhbmsgLSAxXSA6IGIuc2hhcGVbYlJhbmsgLSAyXTtcblxuICBjb25zdCBvdXRlclNoYXBlQSA9IHRyYW5zcG9zZUEgPyBhLnNoYXBlW2FSYW5rIC0gMV0gOiBhLnNoYXBlW2FSYW5rIC0gMl07XG4gIGNvbnN0IG91dGVyU2hhcGVCID0gdHJhbnNwb3NlQiA/IGIuc2hhcGVbYlJhbmsgLSAyXSA6IGIuc2hhcGVbYlJhbmsgLSAxXTtcblxuICBjb25zdCBvdXRlckRpbXNBID0gYS5zaGFwZS5zbGljZSgwLCAtMik7XG4gIGNvbnN0IG91dGVyRGltc0IgPSBiLnNoYXBlLnNsaWNlKDAsIC0yKTtcblxuICBjb25zdCBiYXRjaERpbUEgPSB1dGlsLnNpemVGcm9tU2hhcGUob3V0ZXJEaW1zQSk7XG4gIGNvbnN0IGJhdGNoRGltQiA9IHV0aWwuc2l6ZUZyb21TaGFwZShvdXRlckRpbXNCKTtcblxuICBjb25zdCBvdXRTaGFwZU91dGVyRGltcyA9IGJyb2FkY2FzdF91dGlsLmFzc2VydEFuZEdldEJyb2FkY2FzdFNoYXBlKFxuICAgICAgYS5zaGFwZS5zbGljZSgwLCAtMiksIGIuc2hhcGUuc2xpY2UoMCwgLTIpKTtcbiAgY29uc3Qgb3V0U2hhcGUgPSBvdXRTaGFwZU91dGVyRGltcy5jb25jYXQoW291dGVyU2hhcGVBLCBvdXRlclNoYXBlQl0pO1xuXG4gIHV0aWwuYXNzZXJ0KFxuICAgICAgaW5uZXJTaGFwZUEgPT09IGlubmVyU2hhcGVCLFxuICAgICAgKCkgPT4gYEVycm9yIGluIG1hdE11bDogaW5uZXIgc2hhcGVzICgke2lubmVyU2hhcGVBfSkgYW5kIChgICtcbiAgICAgICAgICBgJHtpbm5lclNoYXBlQn0pIG9mIFRlbnNvcnMgd2l0aCBzaGFwZXMgJHthLnNoYXBlfSBhbmQgYCArXG4gICAgICAgICAgYCR7Yi5zaGFwZX0gYW5kIHRyYW5zcG9zZUE9JHt0cmFuc3Bvc2VBfWAgK1xuICAgICAgICAgIGAgYW5kIHRyYW5zcG9zZUI9JHt0cmFuc3Bvc2VCfSBtdXN0IG1hdGNoLmApO1xuXG4gIGNvbnN0IGEzZFNoYXBlOiBbbnVtYmVyLCBudW1iZXIsIG51bWJlcl0gPSB0cmFuc3Bvc2VBID9cbiAgICAgIFtiYXRjaERpbUEsIGlubmVyU2hhcGVBLCBvdXRlclNoYXBlQV0gOlxuICAgICAgW2JhdGNoRGltQSwgb3V0ZXJTaGFwZUEsIGlubmVyU2hhcGVBXTtcbiAgY29uc3QgYjNkU2hhcGU6IFtudW1iZXIsIG51bWJlciwgbnVtYmVyXSA9IHRyYW5zcG9zZUIgP1xuICAgICAgW2JhdGNoRGltQiwgb3V0ZXJTaGFwZUIsIGlubmVyU2hhcGVCXSA6XG4gICAgICBbYmF0Y2hEaW1CLCBpbm5lclNoYXBlQiwgb3V0ZXJTaGFwZUJdO1xuXG4gIC8vIFRoZSByZXN0IG9mIHRoZSBpbXBsZW1lbnRhdGlvbiBpcyBkZXNpZ25lZCB0byBvcGVyYXRlIG9uIHJhbmstMyB0ZW5zb3JzXG4gIGNvbnN0IGEzZCA9IHJlc2hhcGUoe2lucHV0czoge3g6IGF9LCBiYWNrZW5kLCBhdHRyczoge3NoYXBlOiBhM2RTaGFwZX19KTtcbiAgY29uc3QgYjNkID0gcmVzaGFwZSh7aW5wdXRzOiB7eDogYn0sIGJhY2tlbmQsIGF0dHJzOiB7c2hhcGU6IGIzZFNoYXBlfX0pO1xuXG4gIGNvbnN0IGludGVybWVkaWF0ZXM6IFRlbnNvckluZm9bXSA9IFthM2QsIGIzZF07XG5cbiAgY29uc3QgYmF0Y2hEaW0gPSBNYXRoLm1heChiYXRjaERpbUEsIGJhdGNoRGltQik7XG4gIGNvbnN0IHNoYXJlZERpbSA9IHRyYW5zcG9zZUEgPyBhM2Quc2hhcGVbMV0gOiBhM2Quc2hhcGVbMl07XG5cbiAgY29uc3QgaGFzQmlhcyA9IGJpYXMgIT0gbnVsbDtcbiAgY29uc3QgaGFzUHJlbHVBY3RpdmF0aW9uV2VpZ2h0cyA9IHByZWx1QWN0aXZhdGlvbldlaWdodHMgIT0gbnVsbDtcbiAgY29uc3QgaGFzTGVha3lyZWx1QWxwaGEgPSBhY3RpdmF0aW9uID09PSAnbGVha3lyZWx1JztcbiAgY29uc3QgZnVzZWRBY3RpdmF0aW9uID0gYWN0aXZhdGlvbiAhPSBudWxsID9cbiAgICAgIG1hcEFjdGl2YXRpb25Ub1NoYWRlclByb2dyYW0oYWN0aXZhdGlvbiwgdHJ1ZSkgOlxuICAgICAgbnVsbDtcbiAgY29uc3QgY29udGFpbnNGdXNlZE9wcyA9IGhhc0JpYXMgfHwgaGFzUHJlbHVBY3RpdmF0aW9uV2VpZ2h0cyB8fFxuICAgICAgaGFzTGVha3lyZWx1QWxwaGEgfHwgZnVzZWRBY3RpdmF0aW9uICE9IG51bGw7XG4gIGxldCBvdXQ6IFRlbnNvckluZm87XG5cbiAgLy8gU2luY2UgdGhlIG1hdHJpY2VzIGFyZSB2ZWN0b3JzLCBpdCBpcyBmYXN0ZXIgdG8gY2FsbCBtdWwoKS5zdW0oKVxuICAvLyBiZWNhdXNlIHN1bSgpIGlzIE8oc3FydChOKSkgZHVlIHRvIGRpdmlkZS1hbmQtY29ucXVlci5cbiAgaWYgKChvdXRlclNoYXBlQSA9PT0gMSB8fCBvdXRlclNoYXBlQiA9PT0gMSkgJiZcbiAgICAgIHNoYXJlZERpbSA+IE1BVE1VTF9TSEFSRURfRElNX1RIUkVTSE9MRCAmJiBjb250YWluc0Z1c2VkT3BzID09PSBmYWxzZSkge1xuICAgIGxldCBhVmVjID0gYTNkO1xuICAgIGxldCBiVmVjID0gYjNkO1xuICAgIGlmICh0cmFuc3Bvc2VBKSB7XG4gICAgICBhVmVjID0gdHJhbnNwb3NlKHtpbnB1dHM6IHt4OiBhM2R9LCBiYWNrZW5kLCBhdHRyczoge3Blcm06IFswLCAyLCAxXX19KTtcbiAgICAgIGludGVybWVkaWF0ZXMucHVzaChhVmVjKTtcbiAgICB9XG4gICAgaWYgKHRyYW5zcG9zZUIpIHtcbiAgICAgIGJWZWMgPSB0cmFuc3Bvc2Uoe2lucHV0czoge3g6IGIzZH0sIGJhY2tlbmQsIGF0dHJzOiB7cGVybTogWzAsIDIsIDFdfX0pO1xuICAgICAgaW50ZXJtZWRpYXRlcy5wdXNoKGJWZWMpO1xuICAgIH1cblxuICAgIGNvbnN0IHNob3VsZFJlc2hhcGVBID0gb3V0ZXJTaGFwZUIgIT09IDE7XG4gICAgY29uc3Qgc2hvdWxkUmVzaGFwZUIgPSBvdXRlclNoYXBlQiA9PT0gMTtcblxuICAgIGxldCBhVmVjM2QgPSBhVmVjO1xuICAgIGlmIChzaG91bGRSZXNoYXBlQSkge1xuICAgICAgYVZlYzNkID0gcmVzaGFwZSh7XG4gICAgICAgIGlucHV0czoge3g6IGFWZWN9LFxuICAgICAgICBiYWNrZW5kLFxuICAgICAgICBhdHRyczoge3NoYXBlOiBbYmF0Y2hEaW0sIHNoYXJlZERpbSwgMV19XG4gICAgICB9KTtcblxuICAgICAgaW50ZXJtZWRpYXRlcy5wdXNoKGFWZWMzZCk7XG4gICAgfVxuXG4gICAgY29uc3QgYXhpcyA9IG91dGVyU2hhcGVCID09PSAxID8gMiA6IDE7XG5cbiAgICBsZXQgYlZlYzNkID0gYlZlYztcbiAgICBpZiAoc2hvdWxkUmVzaGFwZUIpIHtcbiAgICAgIGJWZWMzZCA9IHJlc2hhcGUoe1xuICAgICAgICBpbnB1dHM6IHt4OiBiVmVjfSxcbiAgICAgICAgYmFja2VuZCxcbiAgICAgICAgYXR0cnM6IHtzaGFwZTogW2JhdGNoRGltLCAxLCBzaGFyZWREaW1dfVxuICAgICAgfSk7XG5cbiAgICAgIGludGVybWVkaWF0ZXMucHVzaChiVmVjM2QpO1xuICAgIH1cblxuICAgIGNvbnN0IHByb2R1Y3QgPSBtdWx0aXBseSh7aW5wdXRzOiB7YTogYVZlYzNkLCBiOiBiVmVjM2R9LCBiYWNrZW5kfSk7XG4gICAgb3V0ID0gc3VtKHtpbnB1dHM6IHt4OiBwcm9kdWN0fSwgYmFja2VuZCwgYXR0cnM6IHtheGlzLCBrZWVwRGltczogdHJ1ZX19KTtcbiAgICBpbnRlcm1lZGlhdGVzLnB1c2gocHJvZHVjdCk7XG4gIH0gZWxzZSB7XG4gICAgY29uc3QgZHR5cGUgPSB1cGNhc3RUeXBlKGEuZHR5cGUsIGIuZHR5cGUpO1xuXG4gICAgY29uc3QgcHJvZ3JhbSA9IG5ldyBNYXRNdWxQYWNrZWRQcm9ncmFtKFxuICAgICAgICBhM2RTaGFwZSwgYjNkU2hhcGUsIFtiYXRjaERpbSwgb3V0ZXJTaGFwZUEsIG91dGVyU2hhcGVCXSwgdHJhbnNwb3NlQSxcbiAgICAgICAgdHJhbnNwb3NlQiwgaGFzQmlhcywgZnVzZWRBY3RpdmF0aW9uLCBoYXNQcmVsdUFjdGl2YXRpb25XZWlnaHRzLFxuICAgICAgICBoYXNMZWFreXJlbHVBbHBoYSk7XG5cbiAgICBjb25zdCBpbnB1dHM6IFRlbnNvckluZm9bXSA9IFthM2QsIGIzZF07XG4gICAgaWYgKGJpYXMgIT0gbnVsbCkge1xuICAgICAgaW5wdXRzLnB1c2goYmlhcyk7XG4gICAgfVxuICAgIGlmIChoYXNQcmVsdUFjdGl2YXRpb25XZWlnaHRzKSB7XG4gICAgICBpbnB1dHMucHVzaChwcmVsdUFjdGl2YXRpb25XZWlnaHRzKTtcbiAgICB9XG4gICAgaWYgKGhhc0xlYWt5cmVsdUFscGhhKSB7XG4gICAgICBjb25zdCAkbGVha3lyZWx1QWxwaGEgPSBiYWNrZW5kLm1ha2VUZW5zb3JJbmZvKFxuICAgICAgICAgIFtdLCAnZmxvYXQzMicsXG4gICAgICAgICAgdXRpbC5jcmVhdGVTY2FsYXJWYWx1ZShsZWFreXJlbHVBbHBoYSBhcyB7fSBhcyAnZmxvYXQzMicsICdmbG9hdDMyJykpO1xuICAgICAgaW5wdXRzLnB1c2goJGxlYWt5cmVsdUFscGhhKTtcbiAgICAgIGludGVybWVkaWF0ZXMucHVzaCgkbGVha3lyZWx1QWxwaGEpO1xuICAgIH1cblxuICAgIG91dCA9IGJhY2tlbmQucnVuV2ViR0xQcm9ncmFtKHByb2dyYW0sIGlucHV0cywgZHR5cGUpO1xuICB9XG5cbiAgY29uc3Qgb3V0UmVzaGFwZWQgPVxuICAgICAgcmVzaGFwZSh7aW5wdXRzOiB7eDogb3V0fSwgYmFja2VuZCwgYXR0cnM6IHtzaGFwZTogb3V0U2hhcGV9fSk7XG4gIGludGVybWVkaWF0ZXMucHVzaChvdXQpO1xuICBmb3IgKGNvbnN0IGkgb2YgaW50ZXJtZWRpYXRlcykge1xuICAgIGJhY2tlbmQuZGlzcG9zZUludGVybWVkaWF0ZVRlbnNvckluZm8oaSk7XG4gIH1cbiAgcmV0dXJuIG91dFJlc2hhcGVkO1xufVxuIl19","/**\n * @license\n * Copyright 2020 Google LLC. All Rights Reserved.\n * Licensed under the Apache License, Version 2.0 (the License);\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an AS IS BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n * =============================================================================\n */\nimport { _FusedMatMul } from '@tensorflow/tfjs-core';\nimport { batchMatMulImpl } from './BatchMatMul_impl';\nexport function _fusedMatMul(args) {\n const { inputs, backend, attrs } = args;\n const { a, b, bias, preluActivationWeights } = inputs;\n const { transposeA, transposeB, activation, leakyreluAlpha } = attrs;\n return batchMatMulImpl({\n a,\n b,\n transposeA,\n transposeB,\n backend,\n bias,\n preluActivationWeights,\n leakyreluAlpha,\n activation\n });\n}\nexport const _fusedMatMulConfig = {\n kernelName: _FusedMatMul,\n backendName: 'webgl',\n kernelFunc: _fusedMatMul,\n};\n//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiX0Z1c2VkTWF0TXVsLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vLi4vdGZqcy1iYWNrZW5kLXdlYmdsL3NyYy9rZXJuZWxzL19GdXNlZE1hdE11bC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQTs7Ozs7Ozs7Ozs7Ozs7O0dBZUc7QUFFSCxPQUFPLEVBQUMsWUFBWSxFQUFrRSxNQUFNLHVCQUF1QixDQUFDO0FBR3BILE9BQU8sRUFBQyxlQUFlLEVBQUMsTUFBTSxvQkFBb0IsQ0FBQztBQUVuRCxNQUFNLFVBQVUsWUFBWSxDQUFDLElBSTVCO0lBQ0MsTUFBTSxFQUFDLE1BQU0sRUFBRSxPQUFPLEVBQUUsS0FBSyxFQUFDLEdBQUcsSUFBSSxDQUFDO0lBQ3RDLE1BQU0sRUFBQyxDQUFDLEVBQUUsQ0FBQyxFQUFFLElBQUksRUFBRSxzQkFBc0IsRUFBQyxHQUFHLE1BQU0sQ0FBQztJQUNwRCxNQUFNLEVBQUMsVUFBVSxFQUFFLFVBQVUsRUFBRSxVQUFVLEVBQUUsY0FBYyxFQUFDLEdBQUcsS0FBSyxDQUFDO0lBRW5FLE9BQU8sZUFBZSxDQUFDO1FBQ3JCLENBQUM7UUFDRCxDQUFDO1FBQ0QsVUFBVTtRQUNWLFVBQVU7UUFDVixPQUFPO1FBQ1AsSUFBSTtRQUNKLHNCQUFzQjtRQUN0QixjQUFjO1FBQ2QsVUFBVTtLQUNYLENBQUMsQ0FBQztBQUNMLENBQUM7QUFFRCxNQUFNLENBQUMsTUFBTSxrQkFBa0IsR0FBaUI7SUFDOUMsVUFBVSxFQUFFLFlBQVk7SUFDeEIsV0FBVyxFQUFFLE9BQU87SUFDcEIsVUFBVSxFQUFFLFlBQWdDO0NBQzdDLENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyIvKipcbiAqIEBsaWNlbnNlXG4gKiBDb3B5cmlnaHQgMjAyMCBHb29nbGUgTExDLiBBbGwgUmlnaHRzIFJlc2VydmVkLlxuICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlIExpY2Vuc2UpO1xuICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLlxuICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0XG4gKlxuICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wXG4gKlxuICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZVxuICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gQVMgSVMgQkFTSVMsXG4gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC5cbiAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmRcbiAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLlxuICogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbiAqL1xuXG5pbXBvcnQge19GdXNlZE1hdE11bCwgX0Z1c2VkTWF0TXVsQXR0cnMsIF9GdXNlZE1hdE11bElucHV0cywgS2VybmVsQ29uZmlnLCBLZXJuZWxGdW5jfSBmcm9tICdAdGVuc29yZmxvdy90ZmpzLWNvcmUnO1xuXG5pbXBvcnQge01hdGhCYWNrZW5kV2ViR0x9IGZyb20gJy4uL2JhY2tlbmRfd2ViZ2wnO1xuaW1wb3J0IHtiYXRjaE1hdE11bEltcGx9IGZyb20gJy4vQmF0Y2hNYXRNdWxfaW1wbCc7XG5cbmV4cG9ydCBmdW5jdGlvbiBfZnVzZWRNYXRNdWwoYXJnczoge1xuICBpbnB1dHM6IF9GdXNlZE1hdE11bElucHV0cyxcbiAgYXR0cnM6IF9GdXNlZE1hdE11bEF0dHJzLFxuICBiYWNrZW5kOiBNYXRoQmFja2VuZFdlYkdMXG59KSB7XG4gIGNvbnN0IHtpbnB1dHMsIGJhY2tlbmQsIGF0dHJzfSA9IGFyZ3M7XG4gIGNvbnN0IHthLCBiLCBiaWFzLCBwcmVsdUFjdGl2YXRpb25XZWlnaHRzfSA9IGlucHV0cztcbiAgY29uc3Qge3RyYW5zcG9zZUEsIHRyYW5zcG9zZUIsIGFjdGl2YXRpb24sIGxlYWt5cmVsdUFscGhhfSA9IGF0dHJzO1xuXG4gIHJldHVybiBiYXRjaE1hdE11bEltcGwoe1xuICAgIGEsXG4gICAgYixcbiAgICB0cmFuc3Bvc2VBLFxuICAgIHRyYW5zcG9zZUIsXG4gICAgYmFja2VuZCxcbiAgICBiaWFzLFxuICAgIHByZWx1QWN0aXZhdGlvbldlaWdodHMsXG4gICAgbGVha3lyZWx1QWxwaGEsXG4gICAgYWN0aXZhdGlvblxuICB9KTtcbn1cblxuZXhwb3J0IGNvbnN0IF9mdXNlZE1hdE11bENvbmZpZzogS2VybmVsQ29uZmlnID0ge1xuICBrZXJuZWxOYW1lOiBfRnVzZWRNYXRNdWwsXG4gIGJhY2tlbmROYW1lOiAnd2ViZ2wnLFxuICBrZXJuZWxGdW5jOiBfZnVzZWRNYXRNdWwgYXMge30gYXMgS2VybmVsRnVuYyxcbn07XG4iXX0=","/**\n * @license\n * Copyright 2020 Google LLC. All Rights Reserved.\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n * =============================================================================\n */\nimport { Abs, env } from '@tensorflow/tfjs-core';\nimport { simpleAbsImplCPU } from '../kernel_utils/shared';\nimport { UnaryOpProgram } from '../unaryop_gpu';\nimport { UnaryOpPackedProgram } from '../unaryop_packed_gpu';\nconst ABS = `return abs(x);`;\nexport function abs(args) {\n const { inputs, backend } = args;\n const { x } = inputs;\n // TODO: handle cases when x is complex. Once the cpu implementation\n // can handle complex values, refactor to use unaryKernelFunc.\n if (backend.shouldExecuteOnCPU([x]) && x.dtype !== 'complex64') {\n const xData = backend.texData.get(x.dataId);\n const outValues = simpleAbsImplCPU(xData.values);\n return backend.makeTensorInfo(x.shape, x.dtype, outValues);\n }\n let program;\n if (env().getBool('WEBGL_PACK_UNARY_OPERATIONS')) {\n program = new UnaryOpPackedProgram(x.shape, ABS);\n }\n else {\n program = new UnaryOpProgram(x.shape, ABS);\n }\n return backend.runWebGLProgram(program, [x], x.dtype);\n}\nexport const absConfig = {\n kernelName: Abs,\n backendName: 'webgl',\n kernelFunc: abs\n};\n//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiQWJzLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vLi4vdGZqcy1iYWNrZW5kLXdlYmdsL3NyYy9rZXJuZWxzL0Ficy50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQTs7Ozs7Ozs7Ozs7Ozs7O0dBZUc7QUFFSCxPQUFPLEVBQUMsR0FBRyxFQUFhLEdBQUcsRUFBbUQsTUFBTSx1QkFBdUIsQ0FBQztBQUc1RyxPQUFPLEVBQUMsZ0JBQWdCLEVBQUMsTUFBTSx3QkFBd0IsQ0FBQztBQUN4RCxPQUFPLEVBQUMsY0FBYyxFQUFDLE1BQU0sZ0JBQWdCLENBQUM7QUFDOUMsT0FBTyxFQUFDLG9CQUFvQixFQUFDLE1BQU0sdUJBQXVCLENBQUM7QUFFM0QsTUFBTSxHQUFHLEdBQUcsZ0JBQWdCLENBQUM7QUFFN0IsTUFBTSxVQUFVLEdBQUcsQ0FBQyxJQUFvRDtJQUV0RSxNQUFNLEVBQUMsTUFBTSxFQUFFLE9BQU8sRUFBQyxHQUFHLElBQUksQ0FBQztJQUMvQixNQUFNLEVBQUMsQ0FBQyxFQUFDLEdBQUcsTUFBTSxDQUFDO0lBRW5CLG9FQUFvRTtJQUNwRSw4REFBOEQ7SUFDOUQsSUFBSSxPQUFPLENBQUMsa0JBQWtCLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxLQUFLLEtBQUssV0FBVyxFQUFFO1FBQzlELE1BQU0sS0FBSyxHQUFHLE9BQU8sQ0FBQyxPQUFPLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxNQUFNLENBQUMsQ0FBQztRQUM1QyxNQUFNLFNBQVMsR0FBRyxnQkFBZ0IsQ0FBQyxLQUFLLENBQUMsTUFBb0IsQ0FBQyxDQUFDO1FBQy9ELE9BQU8sT0FBTyxDQUFDLGNBQWMsQ0FBQyxDQUFDLENBQUMsS0FBSyxFQUFFLENBQUMsQ0FBQyxLQUFLLEVBQUUsU0FBUyxDQUFDLENBQUM7S0FDNUQ7SUFFRCxJQUFJLE9BQTRDLENBQUM7SUFDakQsSUFBSSxHQUFHLEVBQUUsQ0FBQyxPQUFPLENBQUMsNkJBQTZCLENBQUMsRUFBRTtRQUNoRCxPQUFPLEdBQUcsSUFBSSxvQkFBb0IsQ0FBQyxDQUFDLENBQUMsS0FBSyxFQUFFLEdBQUcsQ0FBQyxDQUFDO0tBQ2xEO1NBQU07UUFDTCxPQUFPLEdBQUcsSUFBSSxjQUFjLENBQUMsQ0FBQyxDQUFDLEtBQUssRUFBRSxHQUFHLENBQUMsQ0FBQztLQUM1QztJQUNELE9BQU8sT0FBTyxDQUFDLGVBQWUsQ0FBQyxPQUFPLEVBQUUsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsS0FBSyxDQUFDLENBQUM7QUFDeEQsQ0FBQztBQUVELE1BQU0sQ0FBQyxNQUFNLFNBQVMsR0FBaUI7SUFDckMsVUFBVSxFQUFFLEdBQUc7SUFDZixXQUFXLEVBQUUsT0FBTztJQUNwQixVQUFVLEVBQUUsR0FBdUI7Q0FDcEMsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbIi8qKlxuICogQGxpY2Vuc2VcbiAqIENvcHlyaWdodCAyMDIwIEdvb2dsZSBMTEMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuXG4gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgXCJMaWNlbnNlXCIpO1xuICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLlxuICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0XG4gKlxuICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wXG4gKlxuICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZVxuICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gXCJBUyBJU1wiIEJBU0lTLFxuICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuXG4gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kXG4gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS5cbiAqID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4gKi9cblxuaW1wb3J0IHtBYnMsIEFic0lucHV0cywgZW52LCBLZXJuZWxDb25maWcsIEtlcm5lbEZ1bmMsIFRlbnNvckluZm8sIFR5cGVkQXJyYXl9IGZyb20gJ0B0ZW5zb3JmbG93L3RmanMtY29yZSc7XG5cbmltcG9ydCB7TWF0aEJhY2tlbmRXZWJHTH0gZnJvbSAnLi4vYmFja2VuZF93ZWJnbCc7XG5pbXBvcnQge3NpbXBsZUFic0ltcGxDUFV9IGZyb20gJy4uL2tlcm5lbF91dGlscy9zaGFyZWQnO1xuaW1wb3J0IHtVbmFyeU9wUHJvZ3JhbX0gZnJvbSAnLi4vdW5hcnlvcF9ncHUnO1xuaW1wb3J0IHtVbmFyeU9wUGFja2VkUHJvZ3JhbX0gZnJvbSAnLi4vdW5hcnlvcF9wYWNrZWRfZ3B1JztcblxuY29uc3QgQUJTID0gYHJldHVybiBhYnMoeCk7YDtcblxuZXhwb3J0IGZ1bmN0aW9uIGFicyhhcmdzOiB7aW5wdXRzOiBBYnNJbnB1dHMsIGJhY2tlbmQ6IE1hdGhCYWNrZW5kV2ViR0x9KTpcbiAgICBUZW5zb3JJbmZvIHtcbiAgY29uc3Qge2lucHV0cywgYmFja2VuZH0gPSBhcmdzO1xuICBjb25zdCB7eH0gPSBpbnB1dHM7XG5cbiAgLy8gVE9ETzogaGFuZGxlIGNhc2VzIHdoZW4geCBpcyBjb21wbGV4LiBPbmNlIHRoZSBjcHUgaW1wbGVtZW50YXRpb25cbiAgLy8gY2FuIGhhbmRsZSBjb21wbGV4IHZhbHVlcywgcmVmYWN0b3IgdG8gdXNlIHVuYXJ5S2VybmVsRnVuYy5cbiAgaWYgKGJhY2tlbmQuc2hvdWxkRXhlY3V0ZU9uQ1BVKFt4XSkgJiYgeC5kdHlwZSAhPT0gJ2NvbXBsZXg2NCcpIHtcbiAgICBjb25zdCB4RGF0YSA9IGJhY2tlbmQudGV4RGF0YS5nZXQoeC5kYXRhSWQpO1xuICAgIGNvbnN0IG91dFZhbHVlcyA9IHNpbXBsZUFic0ltcGxDUFUoeERhdGEudmFsdWVzIGFzIFR5cGVkQXJyYXkpO1xuICAgIHJldHVybiBiYWNrZW5kLm1ha2VUZW5zb3JJbmZvKHguc2hhcGUsIHguZHR5cGUsIG91dFZhbHVlcyk7XG4gIH1cblxuICBsZXQgcHJvZ3JhbTogVW5hcnlPcFByb2dyYW18VW5hcnlPcFBhY2tlZFByb2dyYW07XG4gIGlmIChlbnYoKS5nZXRCb29sKCdXRUJHTF9QQUNLX1VOQVJZX09QRVJBVElPTlMnKSkge1xuICAgIHByb2dyYW0gPSBuZXcgVW5hcnlPcFBhY2tlZFByb2dyYW0oeC5zaGFwZSwgQUJTKTtcbiAgfSBlbHNlIHtcbiAgICBwcm9ncmFtID0gbmV3IFVuYXJ5T3BQcm9ncmFtKHguc2hhcGUsIEFCUyk7XG4gIH1cbiAgcmV0dXJuIGJhY2tlbmQucnVuV2ViR0xQcm9ncmFtKHByb2dyYW0sIFt4XSwgeC5kdHlwZSk7XG59XG5cbmV4cG9ydCBjb25zdCBhYnNDb25maWc6IEtlcm5lbENvbmZpZyA9IHtcbiAga2VybmVsTmFtZTogQWJzLFxuICBiYWNrZW5kTmFtZTogJ3dlYmdsJyxcbiAga2VybmVsRnVuYzogYWJzIGFzIHt9IGFzIEtlcm5lbEZ1bmNcbn07XG4iXX0=","/**\n * @license\n * Copyright 2020 Google LLC. All Rights Reserved.\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n * =============================================================================\n */\nimport { Acos } from '@tensorflow/tfjs-core';\nimport { unaryKernelFunc } from '../kernel_utils/kernel_funcs_utils';\nimport { CHECK_NAN_SNIPPET } from '../unaryop_gpu';\nconst ACOS = CHECK_NAN_SNIPPET + `\n if (abs(x) > 1.) {\n return NAN;\n }\n return acos(x);\n`;\nexport const acos = unaryKernelFunc({ opSnippet: ACOS });\nexport const acosConfig = {\n kernelName: Acos,\n backendName: 'webgl',\n kernelFunc: acos,\n};\n//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiQWNvcy5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uLy4uL3RmanMtYmFja2VuZC13ZWJnbC9zcmMva2VybmVscy9BY29zLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBOzs7Ozs7Ozs7Ozs7Ozs7R0FlRztBQUVILE9BQU8sRUFBQyxJQUFJLEVBQWUsTUFBTSx1QkFBdUIsQ0FBQztBQUV6RCxPQUFPLEVBQUMsZUFBZSxFQUFDLE1BQU0sb0NBQW9DLENBQUM7QUFDbkUsT0FBTyxFQUFDLGlCQUFpQixFQUFDLE1BQU0sZ0JBQWdCLENBQUM7QUFFakQsTUFBTSxJQUFJLEdBQUcsaUJBQWlCLEdBQUc7Ozs7O0NBS2hDLENBQUM7QUFFRixNQUFNLENBQUMsTUFBTSxJQUFJLEdBQUcsZUFBZSxDQUFDLEVBQUMsU0FBUyxFQUFFLElBQUksRUFBQyxDQUFDLENBQUM7QUFFdkQsTUFBTSxDQUFDLE1BQU0sVUFBVSxHQUFpQjtJQUN0QyxVQUFVLEVBQUUsSUFBSTtJQUNoQixXQUFXLEVBQUUsT0FBTztJQUNwQixVQUFVLEVBQUUsSUFBSTtDQUNqQixDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiLyoqXG4gKiBAbGljZW5zZVxuICogQ29weXJpZ2h0IDIwMjAgR29vZ2xlIExMQy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC5cbiAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSBcIkxpY2Vuc2VcIik7XG4gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuXG4gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXRcbiAqXG4gKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjBcbiAqXG4gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlXG4gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiBcIkFTIElTXCIgQkFTSVMsXG4gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC5cbiAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmRcbiAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLlxuICogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbiAqL1xuXG5pbXBvcnQge0Fjb3MsIEtlcm5lbENvbmZpZ30gZnJvbSAnQHRlbnNvcmZsb3cvdGZqcy1jb3JlJztcblxuaW1wb3J0IHt1bmFyeUtlcm5lbEZ1bmN9IGZyb20gJy4uL2tlcm5lbF91dGlscy9rZXJuZWxfZnVuY3NfdXRpbHMnO1xuaW1wb3J0IHtDSEVDS19OQU5fU05JUFBFVH0gZnJvbSAnLi4vdW5hcnlvcF9ncHUnO1xuXG5jb25zdCBBQ09TID0gQ0hFQ0tfTkFOX1NOSVBQRVQgKyBgXG4gIGlmIChhYnMoeCkgPiAxLikge1xuICAgIHJldHVybiBOQU47XG4gIH1cbiAgcmV0dXJuIGFjb3MoeCk7XG5gO1xuXG5leHBvcnQgY29uc3QgYWNvcyA9IHVuYXJ5S2VybmVsRnVuYyh7b3BTbmlwcGV0OiBBQ09TfSk7XG5cbmV4cG9ydCBjb25zdCBhY29zQ29uZmlnOiBLZXJuZWxDb25maWcgPSB7XG4gIGtlcm5lbE5hbWU6IEFjb3MsXG4gIGJhY2tlbmROYW1lOiAnd2ViZ2wnLFxuICBrZXJuZWxGdW5jOiBhY29zLFxufTtcbiJdfQ==","/**\n * @license\n * Copyright 2020 Google LLC. All Rights Reserved.\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n * =============================================================================\n */\nimport { Acosh } from '@tensorflow/tfjs-core';\nimport { unaryKernelFunc } from '../kernel_utils/kernel_funcs_utils';\nimport { CHECK_NAN_SNIPPET } from '../unaryop_gpu';\nconst ACOSH = CHECK_NAN_SNIPPET + `\n if (x < 1.0) return NAN;\nreturn log(x + sqrt(x * x - 1.0));`;\nexport const acosh = unaryKernelFunc({ opSnippet: ACOSH });\nexport const acoshConfig = {\n kernelName: Acosh,\n backendName: 'webgl',\n kernelFunc: acosh,\n};\n//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiQWNvc2guanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi8uLi90ZmpzLWJhY2tlbmQtd2ViZ2wvc3JjL2tlcm5lbHMvQWNvc2gudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQ0E7Ozs7Ozs7Ozs7Ozs7OztHQWVHO0FBRUgsT0FBTyxFQUFDLEtBQUssRUFBZSxNQUFNLHVCQUF1QixDQUFDO0FBRTFELE9BQU8sRUFBQyxlQUFlLEVBQUMsTUFBTSxvQ0FBb0MsQ0FBQztBQUNuRSxPQUFPLEVBQUMsaUJBQWlCLEVBQUMsTUFBTSxnQkFBZ0IsQ0FBQztBQUVqRCxNQUFNLEtBQUssR0FBRyxpQkFBaUIsR0FBRzs7bUNBRUMsQ0FBQztBQUVwQyxNQUFNLENBQUMsTUFBTSxLQUFLLEdBQUcsZUFBZSxDQUFDLEVBQUMsU0FBUyxFQUFFLEtBQUssRUFBQyxDQUFDLENBQUM7QUFFekQsTUFBTSxDQUFDLE1BQU0sV0FBVyxHQUFpQjtJQUN2QyxVQUFVLEVBQUUsS0FBSztJQUNqQixXQUFXLEVBQUUsT0FBTztJQUNwQixVQUFVLEVBQUUsS0FBSztDQUNsQixDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiXG4vKipcbiAqIEBsaWNlbnNlXG4gKiBDb3B5cmlnaHQgMjAyMCBHb29nbGUgTExDLiBBbGwgUmlnaHRzIFJlc2VydmVkLlxuICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlIFwiTGljZW5zZVwiKTtcbiAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS5cbiAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdFxuICpcbiAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMFxuICpcbiAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmVcbiAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuIFwiQVMgSVNcIiBCQVNJUyxcbiAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLlxuICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZFxuICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuXG4gKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuICovXG5cbmltcG9ydCB7QWNvc2gsIEtlcm5lbENvbmZpZ30gZnJvbSAnQHRlbnNvcmZsb3cvdGZqcy1jb3JlJztcblxuaW1wb3J0IHt1bmFyeUtlcm5lbEZ1bmN9IGZyb20gJy4uL2tlcm5lbF91dGlscy9rZXJuZWxfZnVuY3NfdXRpbHMnO1xuaW1wb3J0IHtDSEVDS19OQU5fU05JUFBFVH0gZnJvbSAnLi4vdW5hcnlvcF9ncHUnO1xuXG5jb25zdCBBQ09TSCA9IENIRUNLX05BTl9TTklQUEVUICsgYFxuICBpZiAoeCA8IDEuMCkgcmV0dXJuIE5BTjtcbnJldHVybiBsb2coeCArIHNxcnQoeCAqIHggLSAxLjApKTtgO1xuXG5leHBvcnQgY29uc3QgYWNvc2ggPSB1bmFyeUtlcm5lbEZ1bmMoe29wU25pcHBldDogQUNPU0h9KTtcblxuZXhwb3J0IGNvbnN0IGFjb3NoQ29uZmlnOiBLZXJuZWxDb25maWcgPSB7XG4gIGtlcm5lbE5hbWU6IEFjb3NoLFxuICBiYWNrZW5kTmFtZTogJ3dlYmdsJyxcbiAga2VybmVsRnVuYzogYWNvc2gsXG59O1xuIl19","/**\n * @license\n * Copyright 2020 Google LLC. All Rights Reserved.\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n * =============================================================================\n */\nimport { Add } from '@tensorflow/tfjs-core';\nimport { binaryKernelFunc } from '../kernel_utils/kernel_funcs_utils';\nimport { addImplCPU as cpuAdd } from '../kernel_utils/shared';\nconst ADD = 'return a + b;';\nexport const addKernelFunc = binaryKernelFunc({\n opSnippet: ADD,\n packedOpSnippet: ADD,\n supportsComplex: true,\n cpuKernelImpl: cpuAdd\n});\nexport const addConfig = {\n kernelName: Add,\n backendName: 'webgl',\n kernelFunc: addKernelFunc\n};\n//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiQWRkLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vLi4vdGZqcy1iYWNrZW5kLXdlYmdsL3NyYy9rZXJuZWxzL0FkZC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQTs7Ozs7Ozs7Ozs7Ozs7O0dBZUc7QUFFSCxPQUFPLEVBQUMsR0FBRyxFQUFlLE1BQU0sdUJBQXVCLENBQUM7QUFFeEQsT0FBTyxFQUFDLGdCQUFnQixFQUFDLE1BQU0sb0NBQW9DLENBQUM7QUFDcEUsT0FBTyxFQUFDLFVBQVUsSUFBSSxNQUFNLEVBQUMsTUFBTSx3QkFBd0IsQ0FBQztBQUU1RCxNQUFNLEdBQUcsR0FBRyxlQUFlLENBQUM7QUFFNUIsTUFBTSxDQUFDLE1BQU0sYUFBYSxHQUFHLGdCQUFnQixDQUFDO0lBQzVDLFNBQVMsRUFBRSxHQUFHO0lBQ2QsZUFBZSxFQUFFLEdBQUc7SUFDcEIsZUFBZSxFQUFFLElBQUk7SUFDckIsYUFBYSxFQUFFLE1BQU07Q0FDdEIsQ0FBQyxDQUFDO0FBRUgsTUFBTSxDQUFDLE1BQU0sU0FBUyxHQUFpQjtJQUNyQyxVQUFVLEVBQUUsR0FBRztJQUNmLFdBQVcsRUFBRSxPQUFPO0lBQ3BCLFVBQVUsRUFBRSxhQUFhO0NBQzFCLENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyIvKipcbiAqIEBsaWNlbnNlXG4gKiBDb3B5cmlnaHQgMjAyMCBHb29nbGUgTExDLiBBbGwgUmlnaHRzIFJlc2VydmVkLlxuICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlIFwiTGljZW5zZVwiKTtcbiAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS5cbiAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdFxuICpcbiAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMFxuICpcbiAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmVcbiAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuIFwiQVMgSVNcIiBCQVNJUyxcbiAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLlxuICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZFxuICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuXG4gKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuICovXG5cbmltcG9ydCB7QWRkLCBLZXJuZWxDb25maWd9IGZyb20gJ0B0ZW5zb3JmbG93L3RmanMtY29yZSc7XG5cbmltcG9ydCB7YmluYXJ5S2VybmVsRnVuY30gZnJvbSAnLi4va2VybmVsX3V0aWxzL2tlcm5lbF9mdW5jc191dGlscyc7XG5pbXBvcnQge2FkZEltcGxDUFUgYXMgY3B1QWRkfSBmcm9tICcuLi9rZXJuZWxfdXRpbHMvc2hhcmVkJztcblxuY29uc3QgQUREID0gJ3JldHVybiBhICsgYjsnO1xuXG5leHBvcnQgY29uc3QgYWRkS2VybmVsRnVuYyA9IGJpbmFyeUtlcm5lbEZ1bmMoe1xuICBvcFNuaXBwZXQ6IEFERCxcbiAgcGFja2VkT3BTbmlwcGV0OiBBREQsXG4gIHN1cHBvcnRzQ29tcGxleDogdHJ1ZSxcbiAgY3B1S2VybmVsSW1wbDogY3B1QWRkXG59KTtcblxuZXhwb3J0IGNvbnN0IGFkZENvbmZpZzogS2VybmVsQ29uZmlnID0ge1xuICBrZXJuZWxOYW1lOiBBZGQsXG4gIGJhY2tlbmROYW1lOiAnd2ViZ2wnLFxuICBrZXJuZWxGdW5jOiBhZGRLZXJuZWxGdW5jXG59O1xuIl19","/**\n * @license\n * Copyright 2019 Google LLC. All Rights Reserved.\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n * =============================================================================\n */\nexport class AddNProgram {\n constructor(outputShape, shapes) {\n this.outputShape = [];\n this.outputShape = outputShape;\n this.variableNames = shapes.map((_, i) => `T${i}`);\n const snippets = [];\n // Get target elements from every input tensor.\n this.variableNames.forEach(variable => {\n snippets.push(`float v${variable} = get${variable}AtOutCoords();`);\n });\n // Calculate the sum of all elements.\n const operation = this.variableNames\n .map(variable => {\n return `v${variable}`;\n })\n .join(' + ');\n this.userCode = `\n void main() {\n ${snippets.join('\\n ')}\n\n float result = ${operation};\n setOutput(result);\n }\n `;\n }\n}\n//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYWRkbl9ncHUuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi90ZmpzLWJhY2tlbmQtd2ViZ2wvc3JjL2FkZG5fZ3B1LnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBOzs7Ozs7Ozs7Ozs7Ozs7R0FlRztBQUlILE1BQU0sT0FBTyxXQUFXO0lBS3RCLFlBQVksV0FBcUIsRUFBRSxNQUFrQjtRQUhyRCxnQkFBVyxHQUFhLEVBQUUsQ0FBQztRQUl6QixJQUFJLENBQUMsV0FBVyxHQUFHLFdBQVcsQ0FBQztRQUMvQixJQUFJLENBQUMsYUFBYSxHQUFHLE1BQU0sQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxFQUFFLEVBQUUsQ0FBQyxJQUFJLENBQUMsRUFBRSxDQUFDLENBQUM7UUFFbkQsTUFBTSxRQUFRLEdBQWEsRUFBRSxDQUFDO1FBQzlCLCtDQUErQztRQUMvQyxJQUFJLENBQUMsYUFBYSxDQUFDLE9BQU8sQ0FBQyxRQUFRLENBQUMsRUFBRTtZQUNwQyxRQUFRLENBQUMsSUFBSSxDQUFDLFVBQVUsUUFBUSxTQUFTLFFBQVEsZ0JBQWdCLENBQUMsQ0FBQztRQUNyRSxDQUFDLENBQUMsQ0FBQztRQUVILHFDQUFxQztRQUNyQyxNQUFNLFNBQVMsR0FBRyxJQUFJLENBQUMsYUFBYTthQUNiLEdBQUcsQ0FBQyxRQUFRLENBQUMsRUFBRTtZQUNkLE9BQU8sSUFBSSxRQUFRLEVBQUUsQ0FBQztRQUN4QixDQUFDLENBQUM7YUFDRCxJQUFJLENBQUMsS0FBSyxDQUFDLENBQUM7UUFFbkMsSUFBSSxDQUFDLFFBQVEsR0FBRzs7VUFFVixRQUFRLENBQUMsSUFBSSxDQUFDLFlBQVksQ0FBQzs7eUJBRVosU0FBUzs7O0tBRzdCLENBQUM7SUFDSixDQUFDO0NBQ0YiLCJzb3VyY2VzQ29udGVudCI6WyIvKipcbiAqIEBsaWNlbnNlXG4gKiBDb3B5cmlnaHQgMjAxOSBHb29nbGUgTExDLiBBbGwgUmlnaHRzIFJlc2VydmVkLlxuICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlIFwiTGljZW5zZVwiKTtcbiAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS5cbiAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdFxuICpcbiAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMFxuICpcbiAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmVcbiAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuIFwiQVMgSVNcIiBCQVNJUyxcbiAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLlxuICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZFxuICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuXG4gKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuICovXG5cbmltcG9ydCB7R1BHUFVQcm9ncmFtfSBmcm9tICcuL2dwZ3B1X21hdGgnO1xuXG5leHBvcnQgY2xhc3MgQWRkTlByb2dyYW0gaW1wbGVtZW50cyBHUEdQVVByb2dyYW0ge1xuICB2YXJpYWJsZU5hbWVzOiBzdHJpbmdbXTtcbiAgb3V0cHV0U2hhcGU6IG51bWJlcltdID0gW107XG4gIHVzZXJDb2RlOiBzdHJpbmc7XG5cbiAgY29uc3RydWN0b3Iob3V0cHV0U2hhcGU6IG51bWJlcltdLCBzaGFwZXM6IG51bWJlcltdW10pIHtcbiAgICB0aGlzLm91dHB1dFNoYXBlID0gb3V0cHV0U2hhcGU7XG4gICAgdGhpcy52YXJpYWJsZU5hbWVzID0gc2hhcGVzLm1hcCgoXywgaSkgPT4gYFQke2l9YCk7XG5cbiAgICBjb25zdCBzbmlwcGV0czogc3RyaW5nW10gPSBbXTtcbiAgICAvLyBHZXQgdGFyZ2V0IGVsZW1lbnRzIGZyb20gZXZlcnkgaW5wdXQgdGVuc29yLlxuICAgIHRoaXMudmFyaWFibGVOYW1lcy5mb3JFYWNoKHZhcmlhYmxlID0+IHtcbiAgICAgIHNuaXBwZXRzLnB1c2goYGZsb2F0IHYke3ZhcmlhYmxlfSA9IGdldCR7dmFyaWFibGV9QXRPdXRDb29yZHMoKTtgKTtcbiAgICB9KTtcblxuICAgIC8vIENhbGN1bGF0ZSB0aGUgc3VtIG9mIGFsbCBlbGVtZW50cy5cbiAgICBjb25zdCBvcGVyYXRpb24gPSB0aGlzLnZhcmlhYmxlTmFtZXNcbiAgICAgICAgICAgICAgICAgICAgICAgICAgLm1hcCh2YXJpYWJsZSA9PiB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGB2JHt2YXJpYWJsZX1gO1xuICAgICAgICAgICAgICAgICAgICAgICAgICB9KVxuICAgICAgICAgICAgICAgICAgICAgICAgICAuam9pbignICsgJyk7XG5cbiAgICB0aGlzLnVzZXJDb2RlID0gYFxuICAgICAgdm9pZCBtYWluKCkge1xuICAgICAgICAke3NuaXBwZXRzLmpvaW4oJ1xcbiAgICAgICAgJyl9XG5cbiAgICAgICAgZmxvYXQgcmVzdWx0ID0gJHtvcGVyYXRpb259O1xuICAgICAgICBzZXRPdXRwdXQocmVzdWx0KTtcbiAgICAgIH1cbiAgICBgO1xuICB9XG59XG4iXX0=","/**\n * @license\n * Copyright 2019 Google LLC. All Rights Reserved.\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n * =============================================================================\n */\nexport class AddNPackedProgram {\n constructor(outputShape, shapes) {\n this.outputShape = [];\n this.packedInputs = true;\n this.packedOutput = true;\n this.outputShape = outputShape;\n this.variableNames = shapes.map((_, i) => `T${i}`);\n const snippets = [];\n // Get target elements from every input tensor.\n this.variableNames.forEach(variable => {\n snippets.push(`vec4 v${variable} = get${variable}AtOutCoords();`);\n });\n // Calculate the sum of all elements.\n const operation = this.variableNames\n .map(variable => {\n return `v${variable}`;\n })\n .join(' + ');\n this.userCode = `\n void main() {\n ${snippets.join('\\n ')}\n\n vec4 result = ${operation};\n setOutput(result);\n }\n `;\n }\n}\n//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYWRkbl9wYWNrZWRfZ3B1LmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vdGZqcy1iYWNrZW5kLXdlYmdsL3NyYy9hZGRuX3BhY2tlZF9ncHUudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUE7Ozs7Ozs7Ozs7Ozs7OztHQWVHO0FBSUgsTUFBTSxPQUFPLGlCQUFpQjtJQU81QixZQUFZLFdBQXFCLEVBQUUsTUFBa0I7UUFMckQsZ0JBQVcsR0FBYSxFQUFFLENBQUM7UUFFM0IsaUJBQVksR0FBRyxJQUFJLENBQUM7UUFDcEIsaUJBQVksR0FBRyxJQUFJLENBQUM7UUFHbEIsSUFBSSxDQUFDLFdBQVcsR0FBRyxXQUFXLENBQUM7UUFDL0IsSUFBSSxDQUFDLGFBQWEsR0FBRyxNQUFNLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsRUFBRSxFQUFFLENBQUMsSUFBSSxDQUFDLEVBQUUsQ0FBQyxDQUFDO1FBRW5ELE1BQU0sUUFBUSxHQUFhLEVBQUUsQ0FBQztRQUM5QiwrQ0FBK0M7UUFDL0MsSUFBSSxDQUFDLGFBQWEsQ0FBQyxPQUFPLENBQUMsUUFBUSxDQUFDLEVBQUU7WUFDcEMsUUFBUSxDQUFDLElBQUksQ0FBQyxTQUFTLFFBQVEsU0FBUyxRQUFRLGdCQUFnQixDQUFDLENBQUM7UUFDcEUsQ0FBQyxDQUFDLENBQUM7UUFFSCxxQ0FBcUM7UUFDckMsTUFBTSxTQUFTLEdBQUcsSUFBSSxDQUFDLGFBQWE7YUFDYixHQUFHLENBQUMsUUFBUSxDQUFDLEVBQUU7WUFDZCxPQUFPLElBQUksUUFBUSxFQUFFLENBQUM7UUFDeEIsQ0FBQyxDQUFDO2FBQ0QsSUFBSSxDQUFDLEtBQUssQ0FBQyxDQUFDO1FBRW5DLElBQUksQ0FBQyxRQUFRLEdBQUc7O1VBRVYsUUFBUSxDQUFDLElBQUksQ0FBQyxZQUFZLENBQUM7O3dCQUViLFNBQVM7OztLQUc1QixDQUFDO0lBQ0osQ0FBQztDQUNGIiwic291cmNlc0NvbnRlbnQiOlsiLyoqXG4gKiBAbGljZW5zZVxuICogQ29weXJpZ2h0IDIwMTkgR29vZ2xlIExMQy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC5cbiAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSBcIkxpY2Vuc2VcIik7XG4gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuXG4gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXRcbiAqXG4gKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjBcbiAqXG4gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlXG4gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiBcIkFTIElTXCIgQkFTSVMsXG4gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC5cbiAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmRcbiAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLlxuICogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbiAqL1xuXG5pbXBvcnQge0dQR1BVUHJvZ3JhbX0gZnJvbSAnLi9ncGdwdV9tYXRoJztcblxuZXhwb3J0IGNsYXNzIEFkZE5QYWNrZWRQcm9ncmFtIGltcGxlbWVudHMgR1BHUFVQcm9ncmFtIHtcbiAgdmFyaWFibGVOYW1lczogc3RyaW5nW107XG4gIG91dHB1dFNoYXBlOiBudW1iZXJbXSA9IFtdO1xuICB1c2VyQ29kZTogc3RyaW5nO1xuICBwYWNrZWRJbnB1dHMgPSB0cnVlO1xuICBwYWNrZWRPdXRwdXQgPSB0cnVlO1xuXG4gIGNvbnN0cnVjdG9yKG91dHB1dFNoYXBlOiBudW1iZXJbXSwgc2hhcGVzOiBudW1iZXJbXVtdKSB7XG4gICAgdGhpcy5vdXRwdXRTaGFwZSA9IG91dHB1dFNoYXBlO1xuICAgIHRoaXMudmFyaWFibGVOYW1lcyA9IHNoYXBlcy5tYXAoKF8sIGkpID0+IGBUJHtpfWApO1xuXG4gICAgY29uc3Qgc25pcHBldHM6IHN0cmluZ1tdID0gW107XG4gICAgLy8gR2V0IHRhcmdldCBlbGVtZW50cyBmcm9tIGV2ZXJ5IGlucHV0IHRlbnNvci5cbiAgICB0aGlzLnZhcmlhYmxlTmFtZXMuZm9yRWFjaCh2YXJpYWJsZSA9PiB7XG4gICAgICBzbmlwcGV0cy5wdXNoKGB2ZWM0IHYke3ZhcmlhYmxlfSA9IGdldCR7dmFyaWFibGV9QXRPdXRDb29yZHMoKTtgKTtcbiAgICB9KTtcblxuICAgIC8vIENhbGN1bGF0ZSB0aGUgc3VtIG9mIGFsbCBlbGVtZW50cy5cbiAgICBjb25zdCBvcGVyYXRpb24gPSB0aGlzLnZhcmlhYmxlTmFtZXNcbiAgICAgICAgICAgICAgICAgICAgICAgICAgLm1hcCh2YXJpYWJsZSA9PiB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGB2JHt2YXJpYWJsZX1gO1xuICAgICAgICAgICAgICAgICAgICAgICAgICB9KVxuICAgICAgICAgICAgICAgICAgICAgICAgICAuam9pbignICsgJyk7XG5cbiAgICB0aGlzLnVzZXJDb2RlID0gYFxuICAgICAgdm9pZCBtYWluKCkge1xuICAgICAgICAke3NuaXBwZXRzLmpvaW4oJ1xcbiAgICAgICAgJyl9XG5cbiAgICAgICAgdmVjNCByZXN1bHQgPSAke29wZXJhdGlvbn07XG4gICAgICAgIHNldE91dHB1dChyZXN1bHQpO1xuICAgICAgfVxuICAgIGA7XG4gIH1cbn1cbiJdfQ==","/**\n * @license\n * Copyright 2020 Google LLC. All Rights Reserved.\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n * =============================================================================\n */\nimport { AddN, env, upcastType } from '@tensorflow/tfjs-core';\nimport { AddNProgram } from '../addn_gpu';\nimport { AddNPackedProgram } from '../addn_packed_gpu';\nimport { identity } from './Identity';\nexport function addN(args) {\n const { inputs, backend } = args;\n const tensors = inputs;\n if (tensors.length === 1) {\n return identity({ inputs: { x: tensors[0] }, backend });\n }\n // Limit the number of uploaded textures for optimization.\n if (tensors.length > env().get('WEBGL_MAX_TEXTURES_IN_SHADER')) {\n const midIndex = Math.floor(tensors.length / 2);\n const leftSide = addN({ inputs: tensors.slice(0, midIndex), backend });\n const rightSide = addN({ inputs: tensors.slice(midIndex), backend });\n return addN({ inputs: [leftSide, rightSide], backend });\n }\n const dtype = tensors.map(t => t.dtype).reduce((d1, d2) => upcastType(d1, d2));\n const shapes = tensors.map(t => t.shape);\n // We can make sure shapes are identical in op level.\n const usePackedOp = env().getBool('WEBGL_PACK');\n const program = usePackedOp ?\n new AddNPackedProgram(tensors[0].shape, shapes) :\n new AddNProgram(tensors[0].shape, shapes);\n return backend.runWebGLProgram(program, tensors, dtype);\n}\nexport const addNConfig = {\n kernelName: AddN,\n backendName: 'webgl',\n kernelFunc: addN\n};\n//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiQWRkTi5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uLy4uL3RmanMtYmFja2VuZC13ZWJnbC9zcmMva2VybmVscy9BZGROLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBOzs7Ozs7Ozs7Ozs7Ozs7R0FlRztBQUVILE9BQU8sRUFBQyxJQUFJLEVBQWMsR0FBRyxFQUF3QyxVQUFVLEVBQUMsTUFBTSx1QkFBdUIsQ0FBQztBQUU5RyxPQUFPLEVBQUMsV0FBVyxFQUFDLE1BQU0sYUFBYSxDQUFDO0FBQ3hDLE9BQU8sRUFBQyxpQkFBaUIsRUFBQyxNQUFNLG9CQUFvQixDQUFDO0FBRXJELE9BQU8sRUFBQyxRQUFRLEVBQUMsTUFBTSxZQUFZLENBQUM7QUFFcEMsTUFBTSxVQUFVLElBQUksQ0FBQyxJQUFxRDtJQUV4RSxNQUFNLEVBQUMsTUFBTSxFQUFFLE9BQU8sRUFBQyxHQUFHLElBQUksQ0FBQztJQUUvQixNQUFNLE9BQU8sR0FBRyxNQUFNLENBQUM7SUFDdkIsSUFBSSxPQUFPLENBQUMsTUFBTSxLQUFLLENBQUMsRUFBRTtRQUN4QixPQUFPLFFBQVEsQ0FBQyxFQUFDLE1BQU0sRUFBRSxFQUFDLENBQUMsRUFBRSxPQUFPLENBQUMsQ0FBQyxDQUFDLEVBQUMsRUFBRSxPQUFPLEVBQUMsQ0FBQyxDQUFDO0tBQ3JEO0lBRUQsMERBQTBEO0lBQzFELElBQUksT0FBTyxDQUFDLE1BQU0sR0FBRyxHQUFHLEVBQUUsQ0FBQyxHQUFHLENBQUMsOEJBQThCLENBQUMsRUFBRTtRQUM5RCxNQUFNLFFBQVEsR0FBRyxJQUFJLENBQUMsS0FBSyxDQUFDLE9BQU8sQ0FBQyxNQUFNLEdBQUcsQ0FBQyxDQUFDLENBQUM7UUFDaEQsTUFBTSxRQUFRLEdBQUcsSUFBSSxDQUFDLEVBQUMsTUFBTSxFQUFFLE9BQU8sQ0FBQyxLQUFLLENBQUMsQ0FBQyxFQUFFLFFBQVEsQ0FBQyxFQUFFLE9BQU8sRUFBQyxDQUFDLENBQUM7UUFDckUsTUFBTSxTQUFTLEdBQUcsSUFBSSxDQUFDLEVBQUMsTUFBTSxFQUFFLE9BQU8sQ0FBQyxLQUFLLENBQUMsUUFBUSxDQUFDLEVBQUUsT0FBTyxFQUFDLENBQUMsQ0FBQztRQUNuRSxPQUFPLElBQUksQ0FBQyxFQUFDLE1BQU0sRUFBRSxDQUFDLFFBQVEsRUFBRSxTQUFTLENBQUMsRUFBRSxPQUFPLEVBQUMsQ0FBQyxDQUFDO0tBQ3ZEO0lBRUQsTUFBTSxLQUFLLEdBQ1AsT0FBTyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxLQUFLLENBQUMsQ0FBQyxNQUFNLENBQUMsQ0FBQyxFQUFFLEVBQUUsRUFBRSxFQUFFLEVBQUUsQ0FBQyxVQUFVLENBQUMsRUFBRSxFQUFFLEVBQUUsQ0FBQyxDQUFDLENBQUM7SUFDckUsTUFBTSxNQUFNLEdBQUcsT0FBTyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxLQUFLLENBQUMsQ0FBQztJQUN6QyxxREFBcUQ7SUFDckQsTUFBTSxXQUFXLEdBQUcsR0FBRyxFQUFFLENBQUMsT0FBTyxDQUFDLFlBQVksQ0FBQyxDQUFDO0lBQ2hELE1BQU0sT0FBTyxHQUFHLFdBQVcsQ0FBQyxDQUFDO1FBQ3pCLElBQUksaUJBQWlCLENBQUMsT0FBTyxDQUFDLENBQUMsQ0FBQyxDQUFDLEtBQUssRUFBRSxNQUFNLENBQUMsQ0FBQyxDQUFDO1FBQ2pELElBQUksV0FBVyxDQUFDLE9BQU8sQ0FBQyxDQUFDLENBQUMsQ0FBQyxLQUFLLEVBQUUsTUFBTSxDQUFDLENBQUM7SUFDOUMsT0FBTyxPQUFPLENBQUMsZUFBZSxDQUFDLE9BQU8sRUFBRSxPQUFPLEVBQUUsS0FBSyxDQUFDLENBQUM7QUFDMUQsQ0FBQztBQUVELE1BQU0sQ0FBQyxNQUFNLFVBQVUsR0FBaUI7SUFDdEMsVUFBVSxFQUFFLElBQUk7SUFDaEIsV0FBVyxFQUFFLE9BQU87SUFDcEIsVUFBVSxFQUFFLElBQXdCO0NBQ3JDLENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyIvKipcbiAqIEBsaWNlbnNlXG4gKiBDb3B5cmlnaHQgMjAyMCBHb29nbGUgTExDLiBBbGwgUmlnaHRzIFJlc2VydmVkLlxuICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlIFwiTGljZW5zZVwiKTtcbiAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS5cbiAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdFxuICpcbiAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMFxuICpcbiAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmVcbiAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuIFwiQVMgSVNcIiBCQVNJUyxcbiAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLlxuICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZFxuICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuXG4gKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuICovXG5cbmltcG9ydCB7QWRkTiwgQWRkTklucHV0cywgZW52LCBLZXJuZWxDb25maWcsIEtlcm5lbEZ1bmMsIFRlbnNvckluZm8sIHVwY2FzdFR5cGV9IGZyb20gJ0B0ZW5zb3JmbG93L3RmanMtY29yZSc7XG5cbmltcG9ydCB7QWRkTlByb2dyYW19IGZyb20gJy4uL2FkZG5fZ3B1JztcbmltcG9ydCB7QWRkTlBhY2tlZFByb2dyYW19IGZyb20gJy4uL2FkZG5fcGFja2VkX2dwdSc7XG5pbXBvcnQge01hdGhCYWNrZW5kV2ViR0x9IGZyb20gJy4uL2JhY2tlbmRfd2ViZ2wnO1xuaW1wb3J0IHtpZGVudGl0eX0gZnJvbSAnLi9JZGVudGl0eSc7XG5cbmV4cG9ydCBmdW5jdGlvbiBhZGROKGFyZ3M6IHtpbnB1dHM6IEFkZE5JbnB1dHMsIGJhY2tlbmQ6IE1hdGhCYWNrZW5kV2ViR0x9KTpcbiAgICBUZW5zb3JJbmZvIHtcbiAgY29uc3Qge2lucHV0cywgYmFja2VuZH0gPSBhcmdzO1xuXG4gIGNvbnN0IHRlbnNvcnMgPSBpbnB1dHM7XG4gIGlmICh0ZW5zb3JzLmxlbmd0aCA9PT0gMSkge1xuICAgIHJldHVybiBpZGVudGl0eSh7aW5wdXRzOiB7eDogdGVuc29yc1swXX0sIGJhY2tlbmR9KTtcbiAgfVxuXG4gIC8vIExpbWl0IHRoZSBudW1iZXIgb2YgdXBsb2FkZWQgdGV4dHVyZXMgZm9yIG9wdGltaXphdGlvbi5cbiAgaWYgKHRlbnNvcnMubGVuZ3RoID4gZW52KCkuZ2V0KCdXRUJHTF9NQVhfVEVYVFVSRVNfSU5fU0hBREVSJykpIHtcbiAgICBjb25zdCBtaWRJbmRleCA9IE1hdGguZmxvb3IodGVuc29ycy5sZW5ndGggLyAyKTtcbiAgICBjb25zdCBsZWZ0U2lkZSA9IGFkZE4oe2lucHV0czogdGVuc29ycy5zbGljZSgwLCBtaWRJbmRleCksIGJhY2tlbmR9KTtcbiAgICBjb25zdCByaWdodFNpZGUgPSBhZGROKHtpbnB1dHM6IHRlbnNvcnMuc2xpY2UobWlkSW5kZXgpLCBiYWNrZW5kfSk7XG4gICAgcmV0dXJuIGFkZE4oe2lucHV0czogW2xlZnRTaWRlLCByaWdodFNpZGVdLCBiYWNrZW5kfSk7XG4gIH1cblxuICBjb25zdCBkdHlwZSA9XG4gICAgICB0ZW5zb3JzLm1hcCh0ID0+IHQuZHR5cGUpLnJlZHVjZSgoZDEsIGQyKSA9PiB1cGNhc3RUeXBlKGQxLCBkMikpO1xuICBjb25zdCBzaGFwZXMgPSB0ZW5zb3JzLm1hcCh0ID0+IHQuc2hhcGUpO1xuICAvLyBXZSBjYW4gbWFrZSBzdXJlIHNoYXBlcyBhcmUgaWRlbnRpY2FsIGluIG9wIGxldmVsLlxuICBjb25zdCB1c2VQYWNrZWRPcCA9IGVudigpLmdldEJvb2woJ1dFQkdMX1BBQ0snKTtcbiAgY29uc3QgcHJvZ3JhbSA9IHVzZVBhY2tlZE9wID9cbiAgICAgIG5ldyBBZGROUGFja2VkUHJvZ3JhbSh0ZW5zb3JzWzBdLnNoYXBlLCBzaGFwZXMpIDpcbiAgICAgIG5ldyBBZGROUHJvZ3JhbSh0ZW5zb3JzWzBdLnNoYXBlLCBzaGFwZXMpO1xuICByZXR1cm4gYmFja2VuZC5ydW5XZWJHTFByb2dyYW0ocHJvZ3JhbSwgdGVuc29ycywgZHR5cGUpO1xufVxuXG5leHBvcnQgY29uc3QgYWRkTkNvbmZpZzogS2VybmVsQ29uZmlnID0ge1xuICBrZXJuZWxOYW1lOiBBZGROLFxuICBiYWNrZW5kTmFtZTogJ3dlYmdsJyxcbiAga2VybmVsRnVuYzogYWRkTiBhcyB7fSBhcyBLZXJuZWxGdW5jXG59O1xuIl19","/**\n * @license\n * Copyright 2020 Google LLC. All Rights Reserved.\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n * =============================================================================\n */\nimport { All, backend_util, util } from '@tensorflow/tfjs-core';\nimport { reduce } from '../kernel_utils/reduce';\nimport { reshape } from './Reshape';\nimport { transpose } from './Transpose';\nexport function all(args) {\n const { inputs, backend, attrs } = args;\n const { x } = inputs;\n const { axis, keepDims } = attrs;\n const xRank = x.shape.length;\n const origAxes = util.parseAxisParam(axis, x.shape);\n let axes = origAxes;\n const permutedAxes = backend_util.getAxesPermutation(axes, xRank);\n let permutedX = x;\n if (permutedAxes != null) {\n permutedX = transpose({ inputs: { x }, backend, attrs: { perm: permutedAxes } });\n axes = backend_util.getInnerMostAxes(axes.length, xRank);\n }\n backend_util.assertAxesAreInnerMostDims('all', axes, xRank);\n const [outShape, reduceShape] = backend_util.computeOutAndReduceShapes(permutedX.shape, axes);\n const inSize = util.sizeFromShape(reduceShape);\n const a2D = reshape({ inputs: { x: permutedX }, backend, attrs: { shape: [-1, inSize] } });\n const reduced = reduce(a2D, a2D.dtype, 'all', backend);\n let res;\n if (keepDims) {\n const newShape = backend_util.expandShapeToKeepDim(outShape, origAxes);\n res = reshape({ inputs: { x: reduced }, backend, attrs: { shape: newShape } });\n }\n else {\n res = reshape({ inputs: { x: reduced }, backend, attrs: { shape: outShape } });\n }\n backend.disposeIntermediateTensorInfo(a2D);\n backend.disposeIntermediateTensorInfo(reduced);\n if (permutedAxes != null) {\n backend.disposeIntermediateTensorInfo(permutedX);\n }\n return res;\n}\nexport const allConfig = {\n kernelName: All,\n backendName: 'webgl',\n kernelFunc: all\n};\n//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiQWxsLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vLi4vdGZqcy1iYWNrZW5kLXdlYmdsL3NyYy9rZXJuZWxzL0FsbC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQTs7Ozs7Ozs7Ozs7Ozs7O0dBZUc7QUFFSCxPQUFPLEVBQUMsR0FBRyxFQUF1QixZQUFZLEVBQXdDLElBQUksRUFBQyxNQUFNLHVCQUF1QixDQUFDO0FBR3pILE9BQU8sRUFBQyxNQUFNLEVBQUMsTUFBTSx3QkFBd0IsQ0FBQztBQUU5QyxPQUFPLEVBQUMsT0FBTyxFQUFDLE1BQU0sV0FBVyxDQUFDO0FBQ2xDLE9BQU8sRUFBQyxTQUFTLEVBQUMsTUFBTSxhQUFhLENBQUM7QUFFdEMsTUFBTSxVQUFVLEdBQUcsQ0FDZixJQUFxRTtJQUV2RSxNQUFNLEVBQUMsTUFBTSxFQUFFLE9BQU8sRUFBRSxLQUFLLEVBQUMsR0FBRyxJQUFJLENBQUM7SUFDdEMsTUFBTSxFQUFDLENBQUMsRUFBQyxHQUFHLE1BQU0sQ0FBQztJQUNuQixNQUFNLEVBQUMsSUFBSSxFQUFFLFFBQVEsRUFBQyxHQUFHLEtBQUssQ0FBQztJQUUvQixNQUFNLEtBQUssR0FBRyxDQUFDLENBQUMsS0FBSyxDQUFDLE1BQU0sQ0FBQztJQUU3QixNQUFNLFFBQVEsR0FBRyxJQUFJLENBQUMsY0FBYyxDQUFDLElBQUksRUFBRSxDQUFDLENBQUMsS0FBSyxDQUFDLENBQUM7SUFDcEQsSUFBSSxJQUFJLEdBQUcsUUFBUSxDQUFDO0lBQ3BCLE1BQU0sWUFBWSxHQUFHLFlBQVksQ0FBQyxrQkFBa0IsQ0FBQyxJQUFJLEVBQUUsS0FBSyxDQUFDLENBQUM7SUFDbEUsSUFBSSxTQUFTLEdBQUcsQ0FBQyxDQUFDO0lBQ2xCLElBQUksWUFBWSxJQUFJLElBQUksRUFBRTtRQUN4QixTQUFTLEdBQUcsU0FBUyxDQUFDLEVBQUMsTUFBTSxFQUFFLEVBQUMsQ0FBQyxFQUFDLEVBQUUsT0FBTyxFQUFFLEtBQUssRUFBRSxFQUFDLElBQUksRUFBRSxZQUFZLEVBQUMsRUFBQyxDQUFDLENBQUM7UUFDM0UsSUFBSSxHQUFHLFlBQVksQ0FBQyxnQkFBZ0IsQ0FBQyxJQUFJLENBQUMsTUFBTSxFQUFFLEtBQUssQ0FBQyxDQUFDO0tBQzFEO0lBRUQsWUFBWSxDQUFDLDBCQUEwQixDQUFDLEtBQUssRUFBRSxJQUFJLEVBQUUsS0FBSyxDQUFDLENBQUM7SUFDNUQsTUFBTSxDQUFDLFFBQVEsRUFBRSxXQUFXLENBQUMsR0FDekIsWUFBWSxDQUFDLHlCQUF5QixDQUFDLFNBQVMsQ0FBQyxLQUFLLEVBQUUsSUFBSSxDQUFDLENBQUM7SUFDbEUsTUFBTSxNQUFNLEdBQUcsSUFBSSxDQUFDLGFBQWEsQ0FBQyxXQUFXLENBQUMsQ0FBQztJQUUvQyxNQUFNLEdBQUcsR0FDTCxPQUFPLENBQUMsRUFBQyxNQUFNLEVBQUUsRUFBQyxDQUFDLEVBQUUsU0FBUyxFQUFDLEVBQUUsT0FBTyxFQUFFLEtBQUssRUFBRSxFQUFDLEtBQUssRUFBRSxDQUFDLENBQUMsQ0FBQyxFQUFFLE1BQU0sQ0FBQyxFQUFDLEVBQUMsQ0FBQyxDQUFDO0lBQzdFLE1BQU0sT0FBTyxHQUFHLE1BQU0sQ0FBQyxHQUFHLEVBQUUsR0FBRyxDQUFDLEtBQUssRUFBRSxLQUFLLEVBQUUsT0FBTyxDQUFDLENBQUM7SUFFdkQsSUFBSSxHQUFHLENBQUM7SUFDUixJQUFJLFFBQVEsRUFBRTtRQUNaLE1BQU0sUUFBUSxHQUFHLFlBQVksQ0FBQyxvQkFBb0IsQ0FBQyxRQUFRLEVBQUUsUUFBUSxDQUFDLENBQUM7UUFDdkUsR0FBRyxHQUFHLE9BQU8sQ0FBQyxFQUFDLE1BQU0sRUFBRSxFQUFDLENBQUMsRUFBRSxPQUFPLEVBQUMsRUFBRSxPQUFPLEVBQUUsS0FBSyxFQUFFLEVBQUMsS0FBSyxFQUFFLFFBQVEsRUFBQyxFQUFDLENBQUMsQ0FBQztLQUMxRTtTQUFNO1FBQ0wsR0FBRyxHQUFHLE9BQU8sQ0FBQyxFQUFDLE1BQU0sRUFBRSxFQUFDLENBQUMsRUFBRSxPQUFPLEVBQUMsRUFBRSxPQUFPLEVBQUUsS0FBSyxFQUFFLEVBQUMsS0FBSyxFQUFFLFFBQVEsRUFBQyxFQUFDLENBQUMsQ0FBQztLQUMxRTtJQUVELE9BQU8sQ0FBQyw2QkFBNkIsQ0FBQyxHQUFHLENBQUMsQ0FBQztJQUMzQyxPQUFPLENBQUMsNkJBQTZCLENBQUMsT0FBTyxDQUFDLENBQUM7SUFFL0MsSUFBSSxZQUFZLElBQUksSUFBSSxFQUFFO1FBQ3hCLE9BQU8sQ0FBQyw2QkFBNkIsQ0FBQyxTQUFTLENBQUMsQ0FBQztLQUNsRDtJQUVELE9BQU8sR0FBRyxDQUFDO0FBQ2IsQ0FBQztBQUVELE1BQU0sQ0FBQyxNQUFNLFNBQVMsR0FBaUI7SUFDckMsVUFBVSxFQUFFLEdBQUc7SUFDZixXQUFXLEVBQUUsT0FBTztJQUNwQixVQUFVLEVBQUUsR0FBdUI7Q0FDcEMsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbIi8qKlxuICogQGxpY2Vuc2VcbiAqIENvcHlyaWdodCAyMDIwIEdvb2dsZSBMTEMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuXG4gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgXCJMaWNlbnNlXCIpO1xuICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLlxuICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0XG4gKlxuICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wXG4gKlxuICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZVxuICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gXCJBUyBJU1wiIEJBU0lTLFxuICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuXG4gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kXG4gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS5cbiAqID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4gKi9cblxuaW1wb3J0IHtBbGwsIEFsbEF0dHJzLCBBbGxJbnB1dHMsIGJhY2tlbmRfdXRpbCwgS2VybmVsQ29uZmlnLCBLZXJuZWxGdW5jLCBUZW5zb3JJbmZvLCB1dGlsfSBmcm9tICdAdGVuc29yZmxvdy90ZmpzLWNvcmUnO1xuXG5pbXBvcnQge01hdGhCYWNrZW5kV2ViR0x9IGZyb20gJy4uL2JhY2tlbmRfd2ViZ2wnO1xuaW1wb3J0IHtyZWR1Y2V9IGZyb20gJy4uL2tlcm5lbF91dGlscy9yZWR1Y2UnO1xuXG5pbXBvcnQge3Jlc2hhcGV9IGZyb20gJy4vUmVzaGFwZSc7XG5pbXBvcnQge3RyYW5zcG9zZX0gZnJvbSAnLi9UcmFuc3Bvc2UnO1xuXG5leHBvcnQgZnVuY3Rpb24gYWxsKFxuICAgIGFyZ3M6IHtpbnB1dHM6IEFsbElucHV0cywgYmFja2VuZDogTWF0aEJhY2tlbmRXZWJHTCwgYXR0cnM6IEFsbEF0dHJzfSk6XG4gICAgVGVuc29ySW5mbyB7XG4gIGNvbnN0IHtpbnB1dHMsIGJhY2tlbmQsIGF0dHJzfSA9IGFyZ3M7XG4gIGNvbnN0IHt4fSA9IGlucHV0cztcbiAgY29uc3Qge2F4aXMsIGtlZXBEaW1zfSA9IGF0dHJzO1xuXG4gIGNvbnN0IHhSYW5rID0geC5zaGFwZS5sZW5ndGg7XG5cbiAgY29uc3Qgb3JpZ0F4ZXMgPSB1dGlsLnBhcnNlQXhpc1BhcmFtKGF4aXMsIHguc2hhcGUpO1xuICBsZXQgYXhlcyA9IG9yaWdBeGVzO1xuICBjb25zdCBwZXJtdXRlZEF4ZXMgPSBiYWNrZW5kX3V0aWwuZ2V0QXhlc1Blcm11dGF0aW9uKGF4ZXMsIHhSYW5rKTtcbiAgbGV0IHBlcm11dGVkWCA9IHg7XG4gIGlmIChwZXJtdXRlZEF4ZXMgIT0gbnVsbCkge1xuICAgIHBlcm11dGVkWCA9IHRyYW5zcG9zZSh7aW5wdXRzOiB7eH0sIGJhY2tlbmQsIGF0dHJzOiB7cGVybTogcGVybXV0ZWRBeGVzfX0pO1xuICAgIGF4ZXMgPSBiYWNrZW5kX3V0aWwuZ2V0SW5uZXJNb3N0QXhlcyhheGVzLmxlbmd0aCwgeFJhbmspO1xuICB9XG5cbiAgYmFja2VuZF91dGlsLmFzc2VydEF4ZXNBcmVJbm5lck1vc3REaW1zKCdhbGwnLCBheGVzLCB4UmFuayk7XG4gIGNvbnN0IFtvdXRTaGFwZSwgcmVkdWNlU2hhcGVdID1cbiAgICAgIGJhY2tlbmRfdXRpbC5jb21wdXRlT3V0QW5kUmVkdWNlU2hhcGVzKHBlcm11dGVkWC5zaGFwZSwgYXhlcyk7XG4gIGNvbnN0IGluU2l6ZSA9IHV0aWwuc2l6ZUZyb21TaGFwZShyZWR1Y2VTaGFwZSk7XG5cbiAgY29uc3QgYTJEID1cbiAgICAgIHJlc2hhcGUoe2lucHV0czoge3g6IHBlcm11dGVkWH0sIGJhY2tlbmQsIGF0dHJzOiB7c2hhcGU6IFstMSwgaW5TaXplXX19KTtcbiAgY29uc3QgcmVkdWNlZCA9IHJlZHVjZShhMkQsIGEyRC5kdHlwZSwgJ2FsbCcsIGJhY2tlbmQpO1xuXG4gIGxldCByZXM7XG4gIGlmIChrZWVwRGltcykge1xuICAgIGNvbnN0IG5ld1NoYXBlID0gYmFja2VuZF91dGlsLmV4cGFuZFNoYXBlVG9LZWVwRGltKG91dFNoYXBlLCBvcmlnQXhlcyk7XG4gICAgcmVzID0gcmVzaGFwZSh7aW5wdXRzOiB7eDogcmVkdWNlZH0sIGJhY2tlbmQsIGF0dHJzOiB7c2hhcGU6IG5ld1NoYXBlfX0pO1xuICB9IGVsc2Uge1xuICAgIHJlcyA9IHJlc2hhcGUoe2lucHV0czoge3g6IHJlZHVjZWR9LCBiYWNrZW5kLCBhdHRyczoge3NoYXBlOiBvdXRTaGFwZX19KTtcbiAgfVxuXG4gIGJhY2tlbmQuZGlzcG9zZUludGVybWVkaWF0ZVRlbnNvckluZm8oYTJEKTtcbiAgYmFja2VuZC5kaXNwb3NlSW50ZXJtZWRpYXRlVGVuc29ySW5mbyhyZWR1Y2VkKTtcblxuICBpZiAocGVybXV0ZWRBeGVzICE9IG51bGwpIHtcbiAgICBiYWNrZW5kLmRpc3Bvc2VJbnRlcm1lZGlhdGVUZW5zb3JJbmZvKHBlcm11dGVkWCk7XG4gIH1cblxuICByZXR1cm4gcmVzO1xufVxuXG5leHBvcnQgY29uc3QgYWxsQ29uZmlnOiBLZXJuZWxDb25maWcgPSB7XG4gIGtlcm5lbE5hbWU6IEFsbCxcbiAgYmFja2VuZE5hbWU6ICd3ZWJnbCcsXG4gIGtlcm5lbEZ1bmM6IGFsbCBhcyB7fSBhcyBLZXJuZWxGdW5jXG59O1xuIl19","/**\n * @license\n * Copyright 2020 Google LLC. All Rights Reserved.\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n * =============================================================================\n */\nimport { Any, backend_util, util } from '@tensorflow/tfjs-core';\nimport { reduce } from '../kernel_utils/reduce';\nimport { reshape } from './Reshape';\nimport { transpose } from './Transpose';\nexport function any(args) {\n const { inputs, backend, attrs } = args;\n const { x } = inputs;\n const { axis, keepDims } = attrs;\n const xRank = x.shape.length;\n const origAxes = util.parseAxisParam(axis, x.shape);\n let axes = origAxes;\n const permutedAxes = backend_util.getAxesPermutation(axes, xRank);\n let permutedX = x;\n if (permutedAxes != null) {\n permutedX = transpose({ inputs: { x }, backend, attrs: { perm: permutedAxes } });\n axes = backend_util.getInnerMostAxes(axes.length, xRank);\n }\n backend_util.assertAxesAreInnerMostDims('any', axes, xRank);\n const [outShape, reduceShape] = backend_util.computeOutAndReduceShapes(permutedX.shape, axes);\n const inSize = util.sizeFromShape(reduceShape);\n const a2D = reshape({ inputs: { x: permutedX }, backend, attrs: { shape: [-1, inSize] } });\n const reduced = reduce(a2D, a2D.dtype, 'any', backend);\n let res;\n if (keepDims) {\n const newShape = backend_util.expandShapeToKeepDim(outShape, origAxes);\n res = reshape({ inputs: { x: reduced }, backend, attrs: { shape: newShape } });\n }\n else {\n res = reshape({ inputs: { x: reduced }, backend, attrs: { shape: outShape } });\n }\n backend.disposeIntermediateTensorInfo(a2D);\n backend.disposeIntermediateTensorInfo(reduced);\n if (permutedAxes != null) {\n backend.disposeIntermediateTensorInfo(permutedX);\n }\n return res;\n}\nexport const anyConfig = {\n kernelName: Any,\n backendName: 'webgl',\n kernelFunc: any\n};\n//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiQW55LmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vLi4vdGZqcy1iYWNrZW5kLXdlYmdsL3NyYy9rZXJuZWxzL0FueS50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQTs7Ozs7Ozs7Ozs7Ozs7O0dBZUc7QUFFSCxPQUFPLEVBQUMsR0FBRyxFQUF1QixZQUFZLEVBQXdDLElBQUksRUFBQyxNQUFNLHVCQUF1QixDQUFDO0FBR3pILE9BQU8sRUFBQyxNQUFNLEVBQUMsTUFBTSx3QkFBd0IsQ0FBQztBQUM5QyxPQUFPLEVBQUMsT0FBTyxFQUFDLE1BQU0sV0FBVyxDQUFDO0FBQ2xDLE9BQU8sRUFBQyxTQUFTLEVBQUMsTUFBTSxhQUFhLENBQUM7QUFFdEMsTUFBTSxVQUFVLEdBQUcsQ0FDZixJQUFxRTtJQUV2RSxNQUFNLEVBQUMsTUFBTSxFQUFFLE9BQU8sRUFBRSxLQUFLLEVBQUMsR0FBRyxJQUFJLENBQUM7SUFDdEMsTUFBTSxFQUFDLENBQUMsRUFBQyxHQUFHLE1BQU0sQ0FBQztJQUNuQixNQUFNLEVBQUMsSUFBSSxFQUFFLFFBQVEsRUFBQyxHQUFHLEtBQUssQ0FBQztJQUUvQixNQUFNLEtBQUssR0FBRyxDQUFDLENBQUMsS0FBSyxDQUFDLE1BQU0sQ0FBQztJQUU3QixNQUFNLFFBQVEsR0FBRyxJQUFJLENBQUMsY0FBYyxDQUFDLElBQUksRUFBRSxDQUFDLENBQUMsS0FBSyxDQUFDLENBQUM7SUFDcEQsSUFBSSxJQUFJLEdBQUcsUUFBUSxDQUFDO0lBQ3BCLE1BQU0sWUFBWSxHQUFHLFlBQVksQ0FBQyxrQkFBa0IsQ0FBQyxJQUFJLEVBQUUsS0FBSyxDQUFDLENBQUM7SUFDbEUsSUFBSSxTQUFTLEdBQUcsQ0FBQyxDQUFDO0lBQ2xCLElBQUksWUFBWSxJQUFJLElBQUksRUFBRTtRQUN4QixTQUFTLEdBQUcsU0FBUyxDQUFDLEVBQUMsTUFBTSxFQUFFLEVBQUMsQ0FBQyxFQUFDLEVBQUUsT0FBTyxFQUFFLEtBQUssRUFBRSxFQUFDLElBQUksRUFBRSxZQUFZLEVBQUMsRUFBQyxDQUFDLENBQUM7UUFDM0UsSUFBSSxHQUFHLFlBQVksQ0FBQyxnQkFBZ0IsQ0FBQyxJQUFJLENBQUMsTUFBTSxFQUFFLEtBQUssQ0FBQyxDQUFDO0tBQzFEO0lBRUQsWUFBWSxDQUFDLDBCQUEwQixDQUFDLEtBQUssRUFBRSxJQUFJLEVBQUUsS0FBSyxDQUFDLENBQUM7SUFDNUQsTUFBTSxDQUFDLFFBQVEsRUFBRSxXQUFXLENBQUMsR0FDekIsWUFBWSxDQUFDLHlCQUF5QixDQUFDLFNBQVMsQ0FBQyxLQUFLLEVBQUUsSUFBSSxDQUFDLENBQUM7SUFDbEUsTUFBTSxNQUFNLEdBQUcsSUFBSSxDQUFDLGFBQWEsQ0FBQyxXQUFXLENBQUMsQ0FBQztJQUUvQyxNQUFNLEdBQUcsR0FDTCxPQUFPLENBQUMsRUFBQyxNQUFNLEVBQUUsRUFBQyxDQUFDLEVBQUUsU0FBUyxFQUFDLEVBQUUsT0FBTyxFQUFFLEtBQUssRUFBRSxFQUFDLEtBQUssRUFBRSxDQUFDLENBQUMsQ0FBQyxFQUFFLE1BQU0sQ0FBQyxFQUFDLEVBQUMsQ0FBQyxDQUFDO0lBQzdFLE1BQU0sT0FBTyxHQUFHLE1BQU0sQ0FBQyxHQUFHLEVBQUUsR0FBRyxDQUFDLEtBQUssRUFBRSxLQUFLLEVBQUUsT0FBTyxDQUFDLENBQUM7SUFFdkQsSUFBSSxHQUFHLENBQUM7SUFDUixJQUFJLFFBQVEsRUFBRTtRQUNaLE1BQU0sUUFBUSxHQUFHLFlBQVksQ0FBQyxvQkFBb0IsQ0FBQyxRQUFRLEVBQUUsUUFBUSxDQUFDLENBQUM7UUFDdkUsR0FBRyxHQUFHLE9BQU8sQ0FBQyxFQUFDLE1BQU0sRUFBRSxFQUFDLENBQUMsRUFBRSxPQUFPLEVBQUMsRUFBRSxPQUFPLEVBQUUsS0FBSyxFQUFFLEVBQUMsS0FBSyxFQUFFLFFBQVEsRUFBQyxFQUFDLENBQUMsQ0FBQztLQUMxRTtTQUFNO1FBQ0wsR0FBRyxHQUFHLE9BQU8sQ0FBQyxFQUFDLE1BQU0sRUFBRSxFQUFDLENBQUMsRUFBRSxPQUFPLEVBQUMsRUFBRSxPQUFPLEVBQUUsS0FBSyxFQUFFLEVBQUMsS0FBSyxFQUFFLFFBQVEsRUFBQyxFQUFDLENBQUMsQ0FBQztLQUMxRTtJQUVELE9BQU8sQ0FBQyw2QkFBNkIsQ0FBQyxHQUFHLENBQUMsQ0FBQztJQUMzQyxPQUFPLENBQUMsNkJBQTZCLENBQUMsT0FBTyxDQUFDLENBQUM7SUFFL0MsSUFBSSxZQUFZLElBQUksSUFBSSxFQUFFO1FBQ3hCLE9BQU8sQ0FBQyw2QkFBNkIsQ0FBQyxTQUFTLENBQUMsQ0FBQztLQUNsRDtJQUVELE9BQU8sR0FBRyxDQUFDO0FBQ2IsQ0FBQztBQUVELE1BQU0sQ0FBQyxNQUFNLFNBQVMsR0FBaUI7SUFDckMsVUFBVSxFQUFFLEdBQUc7SUFDZixXQUFXLEVBQUUsT0FBTztJQUNwQixVQUFVLEVBQUUsR0FBdUI7Q0FDcEMsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbIi8qKlxuICogQGxpY2Vuc2VcbiAqIENvcHlyaWdodCAyMDIwIEdvb2dsZSBMTEMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuXG4gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgXCJMaWNlbnNlXCIpO1xuICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLlxuICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0XG4gKlxuICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wXG4gKlxuICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZVxuICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gXCJBUyBJU1wiIEJBU0lTLFxuICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuXG4gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kXG4gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS5cbiAqID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4gKi9cblxuaW1wb3J0IHtBbnksIEFueUF0dHJzLCBBbnlJbnB1dHMsIGJhY2tlbmRfdXRpbCwgS2VybmVsQ29uZmlnLCBLZXJuZWxGdW5jLCBUZW5zb3JJbmZvLCB1dGlsfSBmcm9tICdAdGVuc29yZmxvdy90ZmpzLWNvcmUnO1xuXG5pbXBvcnQge01hdGhCYWNrZW5kV2ViR0x9IGZyb20gJy4uL2JhY2tlbmRfd2ViZ2wnO1xuaW1wb3J0IHtyZWR1Y2V9IGZyb20gJy4uL2tlcm5lbF91dGlscy9yZWR1Y2UnO1xuaW1wb3J0IHtyZXNoYXBlfSBmcm9tICcuL1Jlc2hhcGUnO1xuaW1wb3J0IHt0cmFuc3Bvc2V9IGZyb20gJy4vVHJhbnNwb3NlJztcblxuZXhwb3J0IGZ1bmN0aW9uIGFueShcbiAgICBhcmdzOiB7aW5wdXRzOiBBbnlJbnB1dHMsIGJhY2tlbmQ6IE1hdGhCYWNrZW5kV2ViR0wsIGF0dHJzOiBBbnlBdHRyc30pOlxuICAgIFRlbnNvckluZm8ge1xuICBjb25zdCB7aW5wdXRzLCBiYWNrZW5kLCBhdHRyc30gPSBhcmdzO1xuICBjb25zdCB7eH0gPSBpbnB1dHM7XG4gIGNvbnN0IHtheGlzLCBrZWVwRGltc30gPSBhdHRycztcblxuICBjb25zdCB4UmFuayA9IHguc2hhcGUubGVuZ3RoO1xuXG4gIGNvbnN0IG9yaWdBeGVzID0gdXRpbC5wYXJzZUF4aXNQYXJhbShheGlzLCB4LnNoYXBlKTtcbiAgbGV0IGF4ZXMgPSBvcmlnQXhlcztcbiAgY29uc3QgcGVybXV0ZWRBeGVzID0gYmFja2VuZF91dGlsLmdldEF4ZXNQZXJtdXRhdGlvbihheGVzLCB4UmFuayk7XG4gIGxldCBwZXJtdXRlZFggPSB4O1xuICBpZiAocGVybXV0ZWRBeGVzICE9IG51bGwpIHtcbiAgICBwZXJtdXRlZFggPSB0cmFuc3Bvc2Uoe2lucHV0czoge3h9LCBiYWNrZW5kLCBhdHRyczoge3Blcm06IHBlcm11dGVkQXhlc319KTtcbiAgICBheGVzID0gYmFja2VuZF91dGlsLmdldElubmVyTW9zdEF4ZXMoYXhlcy5sZW5ndGgsIHhSYW5rKTtcbiAgfVxuXG4gIGJhY2tlbmRfdXRpbC5hc3NlcnRBeGVzQXJlSW5uZXJNb3N0RGltcygnYW55JywgYXhlcywgeFJhbmspO1xuICBjb25zdCBbb3V0U2hhcGUsIHJlZHVjZVNoYXBlXSA9XG4gICAgICBiYWNrZW5kX3V0aWwuY29tcHV0ZU91dEFuZFJlZHVjZVNoYXBlcyhwZXJtdXRlZFguc2hhcGUsIGF4ZXMpO1xuICBjb25zdCBpblNpemUgPSB1dGlsLnNpemVGcm9tU2hhcGUocmVkdWNlU2hhcGUpO1xuXG4gIGNvbnN0IGEyRCA9XG4gICAgICByZXNoYXBlKHtpbnB1dHM6IHt4OiBwZXJtdXRlZFh9LCBiYWNrZW5kLCBhdHRyczoge3NoYXBlOiBbLTEsIGluU2l6ZV19fSk7XG4gIGNvbnN0IHJlZHVjZWQgPSByZWR1Y2UoYTJELCBhMkQuZHR5cGUsICdhbnknLCBiYWNrZW5kKTtcblxuICBsZXQgcmVzO1xuICBpZiAoa2VlcERpbXMpIHtcbiAgICBjb25zdCBuZXdTaGFwZSA9IGJhY2tlbmRfdXRpbC5leHBhbmRTaGFwZVRvS2VlcERpbShvdXRTaGFwZSwgb3JpZ0F4ZXMpO1xuICAgIHJlcyA9IHJlc2hhcGUoe2lucHV0czoge3g6IHJlZHVjZWR9LCBiYWNrZW5kLCBhdHRyczoge3NoYXBlOiBuZXdTaGFwZX19KTtcbiAgfSBlbHNlIHtcbiAgICByZXMgPSByZXNoYXBlKHtpbnB1dHM6IHt4OiByZWR1Y2VkfSwgYmFja2VuZCwgYXR0cnM6IHtzaGFwZTogb3V0U2hhcGV9fSk7XG4gIH1cblxuICBiYWNrZW5kLmRpc3Bvc2VJbnRlcm1lZGlhdGVUZW5zb3JJbmZvKGEyRCk7XG4gIGJhY2tlbmQuZGlzcG9zZUludGVybWVkaWF0ZVRlbnNvckluZm8ocmVkdWNlZCk7XG5cbiAgaWYgKHBlcm11dGVkQXhlcyAhPSBudWxsKSB7XG4gICAgYmFja2VuZC5kaXNwb3NlSW50ZXJtZWRpYXRlVGVuc29ySW5mbyhwZXJtdXRlZFgpO1xuICB9XG5cbiAgcmV0dXJuIHJlcztcbn1cblxuZXhwb3J0IGNvbnN0IGFueUNvbmZpZzogS2VybmVsQ29uZmlnID0ge1xuICBrZXJuZWxOYW1lOiBBbnksXG4gIGJhY2tlbmROYW1lOiAnd2ViZ2wnLFxuICBrZXJuZWxGdW5jOiBhbnkgYXMge30gYXMgS2VybmVsRnVuY1xufTtcbiJdfQ==","/**\n * @license\n * Copyright 2017 Google LLC. All Rights Reserved.\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n * =============================================================================\n */\nexport class ArgMinMaxProgram {\n constructor(reduceInfo, op, firstPass) {\n this.variableNames = ['A'];\n const { windowSize, batchSize, outSize } = reduceInfo;\n if (!firstPass) {\n this.variableNames.push('bestIndicesA');\n }\n this.outputShape = [batchSize, outSize];\n const compOp = (op === 'max') ? '>' : '<';\n const indexSnippet = firstPass ?\n 'inOffset + i;' :\n 'round(getBestIndicesA(batch, inOffset + i));';\n this.userCode = `\n void main() {\n ivec2 coords = getOutputCoords();\n int batch = coords[0];\n int outIdx = coords[1];\n int inOffset = outIdx * ${windowSize};\n\n int bestIndex = inOffset;\n float bestValue = getA(batch, bestIndex);\n\n for (int i = 0; i < ${windowSize}; i++) {\n int inIdx = ${indexSnippet};\n float candidate = getA(batch, inIdx);\n if (candidate ${compOp} bestValue) {\n bestValue = candidate;\n bestIndex = inIdx;\n }\n }\n setOutput(float(bestIndex));\n }\n `;\n }\n}\n//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYXJnbWlubWF4X2dwdS5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uL3RmanMtYmFja2VuZC13ZWJnbC9zcmMvYXJnbWlubWF4X2dwdS50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQTs7Ozs7Ozs7Ozs7Ozs7O0dBZUc7QUFLSCxNQUFNLE9BQU8sZ0JBQWdCO0lBSzNCLFlBQ0ksVUFBbUMsRUFBRSxFQUFlLEVBQ3BELFNBQWtCO1FBTnRCLGtCQUFhLEdBQUcsQ0FBQyxHQUFHLENBQUMsQ0FBQztRQU9wQixNQUFNLEVBQUMsVUFBVSxFQUFFLFNBQVMsRUFBRSxPQUFPLEVBQUMsR0FBRyxVQUFVLENBQUM7UUFDcEQsSUFBSSxDQUFDLFNBQVMsRUFBRTtZQUNkLElBQUksQ0FBQyxhQUFhLENBQUMsSUFBSSxDQUFDLGNBQWMsQ0FBQyxDQUFDO1NBQ3pDO1FBQ0QsSUFBSSxDQUFDLFdBQVcsR0FBRyxDQUFDLFNBQVMsRUFBRSxPQUFPLENBQUMsQ0FBQztRQUN4QyxNQUFNLE1BQU0sR0FBRyxDQUFDLEVBQUUsS0FBSyxLQUFLLENBQUMsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUM7UUFDMUMsTUFBTSxZQUFZLEdBQUcsU0FBUyxDQUFDLENBQUM7WUFDNUIsZUFBZSxDQUFDLENBQUM7WUFDakIsOENBQThDLENBQUM7UUFFbkQsSUFBSSxDQUFDLFFBQVEsR0FBRzs7Ozs7a0NBS2MsVUFBVTs7Ozs7OEJBS2QsVUFBVTt3QkFDaEIsWUFBWTs7MEJBRVYsTUFBTTs7Ozs7OztLQU8zQixDQUFDO0lBQ0osQ0FBQztDQUNGIiwic291cmNlc0NvbnRlbnQiOlsiLyoqXG4gKiBAbGljZW5zZVxuICogQ29weXJpZ2h0IDIwMTcgR29vZ2xlIExMQy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC5cbiAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSBcIkxpY2Vuc2VcIik7XG4gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuXG4gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXRcbiAqXG4gKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjBcbiAqXG4gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlXG4gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiBcIkFTIElTXCIgQkFTSVMsXG4gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC5cbiAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmRcbiAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLlxuICogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbiAqL1xuXG5pbXBvcnQge2JhY2tlbmRfdXRpbH0gZnJvbSAnQHRlbnNvcmZsb3cvdGZqcy1jb3JlJztcbmltcG9ydCB7R1BHUFVQcm9ncmFtfSBmcm9tICcuL2dwZ3B1X21hdGgnO1xuXG5leHBvcnQgY2xhc3MgQXJnTWluTWF4UHJvZ3JhbSBpbXBsZW1lbnRzIEdQR1BVUHJvZ3JhbSB7XG4gIHZhcmlhYmxlTmFtZXMgPSBbJ0EnXTtcbiAgb3V0cHV0U2hhcGU6IG51bWJlcltdO1xuICB1c2VyQ29kZTogc3RyaW5nO1xuXG4gIGNvbnN0cnVjdG9yKFxuICAgICAgcmVkdWNlSW5mbzogYmFja2VuZF91dGlsLlJlZHVjZUluZm8sIG9wOiAnbWF4J3wnbWluJyxcbiAgICAgIGZpcnN0UGFzczogYm9vbGVhbikge1xuICAgIGNvbnN0IHt3aW5kb3dTaXplLCBiYXRjaFNpemUsIG91dFNpemV9ID0gcmVkdWNlSW5mbztcbiAgICBpZiAoIWZpcnN0UGFzcykge1xuICAgICAgdGhpcy52YXJpYWJsZU5hbWVzLnB1c2goJ2Jlc3RJbmRpY2VzQScpO1xuICAgIH1cbiAgICB0aGlzLm91dHB1dFNoYXBlID0gW2JhdGNoU2l6ZSwgb3V0U2l6ZV07XG4gICAgY29uc3QgY29tcE9wID0gKG9wID09PSAnbWF4JykgPyAnPicgOiAnPCc7XG4gICAgY29uc3QgaW5kZXhTbmlwcGV0ID0gZmlyc3RQYXNzID9cbiAgICAgICAgJ2luT2Zmc2V0ICsgaTsnIDpcbiAgICAgICAgJ3JvdW5kKGdldEJlc3RJbmRpY2VzQShiYXRjaCwgaW5PZmZzZXQgKyBpKSk7JztcblxuICAgIHRoaXMudXNlckNvZGUgPSBgXG4gICAgICB2b2lkIG1haW4oKSB7XG4gICAgICAgIGl2ZWMyIGNvb3JkcyA9IGdldE91dHB1dENvb3JkcygpO1xuICAgICAgICBpbnQgYmF0Y2ggPSBjb29yZHNbMF07XG4gICAgICAgIGludCBvdXRJZHggPSBjb29yZHNbMV07XG4gICAgICAgIGludCBpbk9mZnNldCA9IG91dElkeCAqICR7d2luZG93U2l6ZX07XG5cbiAgICAgICAgaW50IGJlc3RJbmRleCA9IGluT2Zmc2V0O1xuICAgICAgICBmbG9hdCBiZXN0VmFsdWUgPSBnZXRBKGJhdGNoLCBiZXN0SW5kZXgpO1xuXG4gICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgJHt3aW5kb3dTaXplfTsgaSsrKSB7XG4gICAgICAgICAgaW50IGluSWR4ID0gJHtpbmRleFNuaXBwZXR9O1xuICAgICAgICAgIGZsb2F0IGNhbmRpZGF0ZSA9IGdldEEoYmF0Y2gsIGluSWR4KTtcbiAgICAgICAgICBpZiAoY2FuZGlkYXRlICR7Y29tcE9wfSBiZXN0VmFsdWUpIHtcbiAgICAgICAgICAgIGJlc3RWYWx1ZSA9IGNhbmRpZGF0ZTtcbiAgICAgICAgICAgIGJlc3RJbmRleCA9IGluSWR4O1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICBzZXRPdXRwdXQoZmxvYXQoYmVzdEluZGV4KSk7XG4gICAgICB9XG4gICAgYDtcbiAgfVxufVxuIl19","/**\n * @license\n * Copyright 2019 Google LLC. All Rights Reserved.\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n * =============================================================================\n */\nimport { util } from '@tensorflow/tfjs-core';\nimport { getChannels } from './packing_util';\nimport { getCoordsDataType } from './shader_compiler';\nexport class ArgMinMaxPackedProgram {\n constructor(shape, windowSize, op, firstPass) {\n this.variableNames = ['A'];\n this.packedInputs = true;\n this.packedOutput = true;\n util.assert(shape.length > 2, () => `Packed arg${op.charAt(0).toUpperCase() +\n op.slice(1)} supports only inputs with rank above 2.`);\n const inSize = shape[shape.length - 1];\n const outSize = Math.ceil(inSize / windowSize);\n this.outputShape = shape.slice(0, -1);\n if (outSize > 1) {\n this.outputShape.push(outSize);\n }\n if (!firstPass) {\n this.variableNames.push('bestIndicesA');\n }\n const outShape = this.outputShape;\n const rank = outShape.length;\n const dtype = getCoordsDataType(rank);\n const coords = getChannels('coords', rank);\n let sourceLocSetup;\n let sourceRank;\n if (outSize === 1) {\n sourceRank = rank + 1;\n const sourceLocDType = getCoordsDataType(sourceRank);\n sourceLocSetup = `\n ${sourceLocDType} sourceLocR = ${sourceLocDType}(${coords.join()}, 0);\n ++${coords[rank - 1]};\n ${sourceLocDType} sourceLocG = ${sourceLocDType}(${coords.join()}, 0);\n ++${coords[rank - 2]};\n ${sourceLocDType} sourceLocA = ${sourceLocDType}(${coords.join()}, 0);\n --${coords[rank - 1]};\n ${sourceLocDType} sourceLocB = ${sourceLocDType}(${coords.join()}, 0);\n --${coords[rank - 2]};`;\n }\n else {\n sourceRank = rank;\n sourceLocSetup = `\n ${dtype} sourceLocR = coords;\n ++${coords[rank - 1]};\n ${dtype} sourceLocG = coords;\n ++${coords[rank - 2]};\n ${dtype} sourceLocA = coords;\n --${coords[rank - 1]};\n ${dtype} sourceLocB = coords;\n --${coords[rank - 2]};`;\n }\n const channels = ['x', 'y', 'z', 'w', 'u', 'v'].slice(0, sourceRank);\n const inChannel = '.' + channels[sourceRank - 1]; // e.g. \".b\" for rank 3.\n const intChannels = channels.map(x => 'int ' + x);\n const srcRCoords = getChannels('sourceLocR', sourceRank - 1).concat('inIdx.r');\n const srcGCoords = getChannels('sourceLocG', sourceRank - 1).concat('inIdx.g');\n const srcBCoords = getChannels('sourceLocB', sourceRank - 1).concat('inIdx.b');\n const srcACoords = getChannels('sourceLocA', sourceRank - 1).concat('inIdx.a');\n const compOp = (op === 'max') ? 'greaterThan' : 'lessThan';\n const fetchCandidateIdx = firstPass ? '' : `\n inIdx = round(vec4(getBestIndicesAChannel(${srcRCoords.join()}),\n getBestIndicesAChannel(${srcGCoords.join()}),\n getBestIndicesAChannel(${srcBCoords.join()}),\n getBestIndicesAChannel(${srcACoords.join()})));`;\n const fetchValue = `vec4(\n getAChannel(${srcRCoords.join()}),\n hasNextCol ? getAChannel(${srcGCoords.join()}) : 0.,\n hasNextRow ? getAChannel(${srcBCoords.join()}) : 0.,\n hasNextRow && hasNextCol ? getAChannel(${srcACoords.join()}) : 0.)`;\n const getBestIndicesAChannelSnippet = firstPass ? '' : `\n float getBestIndicesAChannel(${intChannels.join()}) {\n return getChannel(getBestIndicesA(${channels.join()}),\n vec2(${channels.slice(-2).join()}));\n }`;\n this.userCode = `\n float getAChannel(${intChannels.join()}) {\n return getChannel(getA(${channels.join()}),\n vec2(${channels.slice(-2).join()}));\n }\n ${getBestIndicesAChannelSnippet}\n void main() {\n ${dtype} coords = getOutputCoords();\n bool hasNextCol = ${coords[rank - 1]} < ${outShape[rank - 1] - 1};\n bool hasNextRow = ${coords[rank - 2]} < ${outShape[rank - 2] - 1};\n ${sourceLocSetup}\n ivec4 srcIdx = ivec4(sourceLocR${inChannel}, sourceLocG${inChannel},\n sourceLocB${inChannel}, sourceLocA${inChannel}) * ${windowSize};\n ivec4 inIdx = srcIdx;\n vec4 bestIndex = vec4(inIdx);\n vec4 bestValue = ${fetchValue};\n\n for (int i = 0; i < ${windowSize}; i++) {\n inIdx = srcIdx;\n ${fetchCandidateIdx}\n vec4 candidate = ${fetchValue};\n bvec4 nan = isnan(candidate);\n bvec4 replace = bvec4(\n vec4(${compOp}(candidate, bestValue)) * (vec4(1.0) - vec4(nan)));\n\n bestValue = vec4(replace.x ? candidate.x : bestValue.x,\n replace.y ? candidate.y : bestValue.y,\n replace.z ? candidate.z : bestValue.z,\n replace.w ? candidate.w : bestValue.w);\n bestIndex = mix(bestIndex, vec4(inIdx), vec4(replace));\n srcIdx++;\n }\n setOutput(bestIndex);\n }\n `;\n }\n}\n//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYXJnbWlubWF4X3BhY2tlZF9ncHUuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi90ZmpzLWJhY2tlbmQtd2ViZ2wvc3JjL2FyZ21pbm1heF9wYWNrZWRfZ3B1LnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBOzs7Ozs7Ozs7Ozs7Ozs7R0FlRztBQUVILE9BQU8sRUFBQyxJQUFJLEVBQUMsTUFBTSx1QkFBdUIsQ0FBQztBQUczQyxPQUFPLEVBQUMsV0FBVyxFQUFDLE1BQU0sZ0JBQWdCLENBQUM7QUFDM0MsT0FBTyxFQUFDLGlCQUFpQixFQUFDLE1BQU0sbUJBQW1CLENBQUM7QUFFcEQsTUFBTSxPQUFPLHNCQUFzQjtJQU9qQyxZQUNJLEtBQWUsRUFBRSxVQUFrQixFQUFFLEVBQWUsRUFDcEQsU0FBa0I7UUFSdEIsa0JBQWEsR0FBRyxDQUFDLEdBQUcsQ0FBQyxDQUFDO1FBR3RCLGlCQUFZLEdBQUcsSUFBSSxDQUFDO1FBQ3BCLGlCQUFZLEdBQUcsSUFBSSxDQUFDO1FBS2xCLElBQUksQ0FBQyxNQUFNLENBQ1AsS0FBSyxDQUFDLE1BQU0sR0FBRyxDQUFDLEVBQ2hCLEdBQUcsRUFBRSxDQUFDLGFBQ0YsRUFBRSxDQUFDLE1BQU0sQ0FBQyxDQUFDLENBQUMsQ0FBQyxXQUFXLEVBQUU7WUFDMUIsRUFBRSxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUMsMENBQTBDLENBQUMsQ0FBQztRQUMvRCxNQUFNLE1BQU0sR0FBRyxLQUFLLENBQUMsS0FBSyxDQUFDLE1BQU0sR0FBRyxDQUFDLENBQUMsQ0FBQztRQUN2QyxNQUFNLE9BQU8sR0FBRyxJQUFJLENBQUMsSUFBSSxDQUFDLE1BQU0sR0FBRyxVQUFVLENBQUMsQ0FBQztRQUMvQyxJQUFJLENBQUMsV0FBVyxHQUFHLEtBQUssQ0FBQyxLQUFLLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUM7UUFDdEMsSUFBSSxPQUFPLEdBQUcsQ0FBQyxFQUFFO1lBQ2YsSUFBSSxDQUFDLFdBQVcsQ0FBQyxJQUFJLENBQUMsT0FBTyxDQUFDLENBQUM7U0FDaEM7UUFDRCxJQUFJLENBQUMsU0FBUyxFQUFFO1lBQ2QsSUFBSSxDQUFDLGFBQWEsQ0FBQyxJQUFJLENBQUMsY0FBYyxDQUFDLENBQUM7U0FDekM7UUFDRCxNQUFNLFFBQVEsR0FBRyxJQUFJLENBQUMsV0FBVyxDQUFDO1FBQ2xDLE1BQU0sSUFBSSxHQUFHLFFBQVEsQ0FBQyxNQUFNLENBQUM7UUFDN0IsTUFBTSxLQUFLLEdBQUcsaUJBQWlCLENBQUMsSUFBSSxDQUFDLENBQUM7UUFDdEMsTUFBTSxNQUFNLEdBQUcsV0FBVyxDQUFDLFFBQVEsRUFBRSxJQUFJLENBQUMsQ0FBQztRQUUzQyxJQUFJLGNBQWMsQ0FBQztRQUNuQixJQUFJLFVBQVUsQ0FBQztRQUNmLElBQUksT0FBTyxLQUFLLENBQUMsRUFBRTtZQUNqQixVQUFVLEdBQUcsSUFBSSxHQUFHLENBQUMsQ0FBQztZQUN0QixNQUFNLGNBQWMsR0FBRyxpQkFBaUIsQ0FBQyxVQUFVLENBQUMsQ0FBQztZQUNyRCxjQUFjLEdBQUc7VUFDYixjQUFjLGlCQUFpQixjQUFjLElBQUksTUFBTSxDQUFDLElBQUksRUFBRTtZQUM1RCxNQUFNLENBQUMsSUFBSSxHQUFHLENBQUMsQ0FBQztVQUNsQixjQUFjLGlCQUFpQixjQUFjLElBQUksTUFBTSxDQUFDLElBQUksRUFBRTtZQUM1RCxNQUFNLENBQUMsSUFBSSxHQUFHLENBQUMsQ0FBQztVQUNsQixjQUFjLGlCQUFpQixjQUFjLElBQUksTUFBTSxDQUFDLElBQUksRUFBRTtZQUM1RCxNQUFNLENBQUMsSUFBSSxHQUFHLENBQUMsQ0FBQztVQUNsQixjQUFjLGlCQUFpQixjQUFjLElBQUksTUFBTSxDQUFDLElBQUksRUFBRTtZQUM1RCxNQUFNLENBQUMsSUFBSSxHQUFHLENBQUMsQ0FBQyxHQUFHLENBQUM7U0FDM0I7YUFBTTtZQUNMLFVBQVUsR0FBRyxJQUFJLENBQUM7WUFDbEIsY0FBYyxHQUFHO1VBQ2IsS0FBSztZQUNILE1BQU0sQ0FBQyxJQUFJLEdBQUcsQ0FBQyxDQUFDO1VBQ2xCLEtBQUs7WUFDSCxNQUFNLENBQUMsSUFBSSxHQUFHLENBQUMsQ0FBQztVQUNsQixLQUFLO1lBQ0gsTUFBTSxDQUFDLElBQUksR0FBRyxDQUFDLENBQUM7VUFDbEIsS0FBSztZQUNILE1BQU0sQ0FBQyxJQUFJLEdBQUcsQ0FBQyxDQUFDLEdBQUcsQ0FBQztTQUMzQjtRQUNELE1BQU0sUUFBUSxHQUFHLENBQUMsR0FBRyxFQUFFLEdBQUcsRUFBRSxHQUFHLEVBQUUsR0FBRyxFQUFFLEdBQUcsRUFBRSxHQUFHLENBQUMsQ0FBQyxLQUFLLENBQUMsQ0FBQyxFQUFFLFVBQVUsQ0FBQyxDQUFDO1FBQ3JFLE1BQU0sU0FBUyxHQUFHLEdBQUcsR0FBRyxRQUFRLENBQUMsVUFBVSxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUUsd0JBQXdCO1FBQzNFLE1BQU0sV0FBVyxHQUFHLFFBQVEsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxNQUFNLEdBQUcsQ0FBQyxDQUFDLENBQUM7UUFDbEQsTUFBTSxVQUFVLEdBQ1osV0FBVyxDQUFDLFlBQVksRUFBRSxVQUFVLEdBQUcsQ0FBQyxDQUFDLENBQUMsTUFBTSxDQUFDLFNBQVMsQ0FBQyxDQUFDO1FBQ2hFLE1BQU0sVUFBVSxHQUNaLFdBQVcsQ0FBQyxZQUFZLEVBQUUsVUFBVSxHQUFHLENBQUMsQ0FBQyxDQUFDLE1BQU0sQ0FBQyxTQUFTLENBQUMsQ0FBQztRQUNoRSxNQUFNLFVBQVUsR0FDWixXQUFXLENBQUMsWUFBWSxFQUFFLFVBQVUsR0FBRyxDQUFDLENBQUMsQ0FBQyxNQUFNLENBQUMsU0FBUyxDQUFDLENBQUM7UUFDaEUsTUFBTSxVQUFVLEdBQ1osV0FBVyxDQUFDLFlBQVksRUFBRSxVQUFVLEdBQUcsQ0FBQyxDQUFDLENBQUMsTUFBTSxDQUFDLFNBQVMsQ0FBQyxDQUFDO1FBRWhFLE1BQU0sTUFBTSxHQUFHLENBQUMsRUFBRSxLQUFLLEtBQUssQ0FBQyxDQUFDLENBQUMsQ0FBQyxhQUFhLENBQUMsQ0FBQyxDQUFDLFVBQVUsQ0FBQztRQUMzRCxNQUFNLGlCQUFpQixHQUFHLFNBQVMsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQztzREFDTyxVQUFVLENBQUMsSUFBSSxFQUFFO3NEQUNqQixVQUFVLENBQUMsSUFBSSxFQUFFO3NEQUNqQixVQUFVLENBQUMsSUFBSSxFQUFFO3NEQUNqQixVQUFVLENBQUMsSUFBSSxFQUFFLE1BQU0sQ0FBQztRQUUxRSxNQUFNLFVBQVUsR0FBRzswQkFDRyxVQUFVLENBQUMsSUFBSSxFQUFFO3VDQUNKLFVBQVUsQ0FBQyxJQUFJLEVBQUU7dUNBQ2pCLFVBQVUsQ0FBQyxJQUFJLEVBQUU7cURBQ0gsVUFBVSxDQUFDLElBQUksRUFBRSxTQUFTLENBQUM7UUFFNUUsTUFBTSw2QkFBNkIsR0FBRyxTQUFTLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUM7cUNBQ3RCLFdBQVcsQ0FBQyxJQUFJLEVBQUU7NENBQ1gsUUFBUSxDQUFDLElBQUksRUFBRTtpREFDVixRQUFRLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxFQUFFO1FBQ2xFLENBQUM7UUFFTCxJQUFJLENBQUMsUUFBUSxHQUFHOzBCQUNNLFdBQVcsQ0FBQyxJQUFJLEVBQUU7aUNBQ1gsUUFBUSxDQUFDLElBQUksRUFBRTtzQ0FDVixRQUFRLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxFQUFFOztRQUV2RCw2QkFBNkI7O1VBRTNCLEtBQUs7NEJBQ2EsTUFBTSxDQUFDLElBQUksR0FBRyxDQUFDLENBQUMsTUFBTSxRQUFRLENBQUMsSUFBSSxHQUFHLENBQUMsQ0FBQyxHQUFHLENBQUM7NEJBQzVDLE1BQU0sQ0FBQyxJQUFJLEdBQUcsQ0FBQyxDQUFDLE1BQU0sUUFBUSxDQUFDLElBQUksR0FBRyxDQUFDLENBQUMsR0FBRyxDQUFDO1VBQzlELGNBQWM7eUNBQ2lCLFNBQVMsZUFBZSxTQUFTO3NCQUNwRCxTQUFTLGVBQWUsU0FBUyxPQUFPLFVBQVU7OzsyQkFHN0MsVUFBVTs7OEJBRVAsVUFBVTs7WUFFNUIsaUJBQWlCOzZCQUNBLFVBQVU7OzttQkFHcEIsTUFBTTs7Ozs7Ozs7Ozs7S0FXcEIsQ0FBQztJQUNKLENBQUM7Q0FDRiIsInNvdXJjZXNDb250ZW50IjpbIi8qKlxuICogQGxpY2Vuc2VcbiAqIENvcHlyaWdodCAyMDE5IEdvb2dsZSBMTEMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuXG4gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgXCJMaWNlbnNlXCIpO1xuICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLlxuICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0XG4gKlxuICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wXG4gKlxuICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZVxuICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gXCJBUyBJU1wiIEJBU0lTLFxuICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuXG4gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kXG4gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS5cbiAqID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4gKi9cblxuaW1wb3J0IHt1dGlsfSBmcm9tICdAdGVuc29yZmxvdy90ZmpzLWNvcmUnO1xuXG5pbXBvcnQge0dQR1BVUHJvZ3JhbX0gZnJvbSAnLi9ncGdwdV9tYXRoJztcbmltcG9ydCB7Z2V0Q2hhbm5lbHN9IGZyb20gJy4vcGFja2luZ191dGlsJztcbmltcG9ydCB7Z2V0Q29vcmRzRGF0YVR5cGV9IGZyb20gJy4vc2hhZGVyX2NvbXBpbGVyJztcblxuZXhwb3J0IGNsYXNzIEFyZ01pbk1heFBhY2tlZFByb2dyYW0gaW1wbGVtZW50cyBHUEdQVVByb2dyYW0ge1xuICB2YXJpYWJsZU5hbWVzID0gWydBJ107XG4gIG91dHB1dFNoYXBlOiBudW1iZXJbXTtcbiAgdXNlckNvZGU6IHN0cmluZztcbiAgcGFja2VkSW5wdXRzID0gdHJ1ZTtcbiAgcGFja2VkT3V0cHV0ID0gdHJ1ZTtcblxuICBjb25zdHJ1Y3RvcihcbiAgICAgIHNoYXBlOiBudW1iZXJbXSwgd2luZG93U2l6ZTogbnVtYmVyLCBvcDogJ21heCd8J21pbicsXG4gICAgICBmaXJzdFBhc3M6IGJvb2xlYW4pIHtcbiAgICB1dGlsLmFzc2VydChcbiAgICAgICAgc2hhcGUubGVuZ3RoID4gMixcbiAgICAgICAgKCkgPT4gYFBhY2tlZCBhcmcke1xuICAgICAgICAgICAgb3AuY2hhckF0KDApLnRvVXBwZXJDYXNlKCkgK1xuICAgICAgICAgICAgb3Auc2xpY2UoMSl9IHN1cHBvcnRzIG9ubHkgaW5wdXRzIHdpdGggcmFuayBhYm92ZSAyLmApO1xuICAgIGNvbnN0IGluU2l6ZSA9IHNoYXBlW3NoYXBlLmxlbmd0aCAtIDFdO1xuICAgIGNvbnN0IG91dFNpemUgPSBNYXRoLmNlaWwoaW5TaXplIC8gd2luZG93U2l6ZSk7XG4gICAgdGhpcy5vdXRwdXRTaGFwZSA9IHNoYXBlLnNsaWNlKDAsIC0xKTtcbiAgICBpZiAob3V0U2l6ZSA+IDEpIHtcbiAgICAgIHRoaXMub3V0cHV0U2hhcGUucHVzaChvdXRTaXplKTtcbiAgICB9XG4gICAgaWYgKCFmaXJzdFBhc3MpIHtcbiAgICAgIHRoaXMudmFyaWFibGVOYW1lcy5wdXNoKCdiZXN0SW5kaWNlc0EnKTtcbiAgICB9XG4gICAgY29uc3Qgb3V0U2hhcGUgPSB0aGlzLm91dHB1dFNoYXBlO1xuICAgIGNvbnN0IHJhbmsgPSBvdXRTaGFwZS5sZW5ndGg7XG4gICAgY29uc3QgZHR5cGUgPSBnZXRDb29yZHNEYXRhVHlwZShyYW5rKTtcbiAgICBjb25zdCBjb29yZHMgPSBnZXRDaGFubmVscygnY29vcmRzJywgcmFuayk7XG5cbiAgICBsZXQgc291cmNlTG9jU2V0dXA7XG4gICAgbGV0IHNvdXJjZVJhbms7XG4gICAgaWYgKG91dFNpemUgPT09IDEpIHtcbiAgICAgIHNvdXJjZVJhbmsgPSByYW5rICsgMTtcbiAgICAgIGNvbnN0IHNvdXJjZUxvY0RUeXBlID0gZ2V0Q29vcmRzRGF0YVR5cGUoc291cmNlUmFuayk7XG4gICAgICBzb3VyY2VMb2NTZXR1cCA9IGBcbiAgICAgICAgJHtzb3VyY2VMb2NEVHlwZX0gc291cmNlTG9jUiA9ICR7c291cmNlTG9jRFR5cGV9KCR7Y29vcmRzLmpvaW4oKX0sIDApO1xuICAgICAgICArKyR7Y29vcmRzW3JhbmsgLSAxXX07XG4gICAgICAgICR7c291cmNlTG9jRFR5cGV9IHNvdXJjZUxvY0cgPSAke3NvdXJjZUxvY0RUeXBlfSgke2Nvb3Jkcy5qb2luKCl9LCAwKTtcbiAgICAgICAgKyske2Nvb3Jkc1tyYW5rIC0gMl19O1xuICAgICAgICAke3NvdXJjZUxvY0RUeXBlfSBzb3VyY2VMb2NBID0gJHtzb3VyY2VMb2NEVHlwZX0oJHtjb29yZHMuam9pbigpfSwgMCk7XG4gICAgICAgIC0tJHtjb29yZHNbcmFuayAtIDFdfTtcbiAgICAgICAgJHtzb3VyY2VMb2NEVHlwZX0gc291cmNlTG9jQiA9ICR7c291cmNlTG9jRFR5cGV9KCR7Y29vcmRzLmpvaW4oKX0sIDApO1xuICAgICAgICAtLSR7Y29vcmRzW3JhbmsgLSAyXX07YDtcbiAgICB9IGVsc2Uge1xuICAgICAgc291cmNlUmFuayA9IHJhbms7XG4gICAgICBzb3VyY2VMb2NTZXR1cCA9IGBcbiAgICAgICAgJHtkdHlwZX0gc291cmNlTG9jUiA9IGNvb3JkcztcbiAgICAgICAgKyske2Nvb3Jkc1tyYW5rIC0gMV19O1xuICAgICAgICAke2R0eXBlfSBzb3VyY2VMb2NHID0gY29vcmRzO1xuICAgICAgICArKyR7Y29vcmRzW3JhbmsgLSAyXX07XG4gICAgICAgICR7ZHR5cGV9IHNvdXJjZUxvY0EgPSBjb29yZHM7XG4gICAgICAgIC0tJHtjb29yZHNbcmFuayAtIDFdfTtcbiAgICAgICAgJHtkdHlwZX0gc291cmNlTG9jQiA9IGNvb3JkcztcbiAgICAgICAgLS0ke2Nvb3Jkc1tyYW5rIC0gMl19O2A7XG4gICAgfVxuICAgIGNvbnN0IGNoYW5uZWxzID0gWyd4JywgJ3knLCAneicsICd3JywgJ3UnLCAndiddLnNsaWNlKDAsIHNvdXJjZVJhbmspO1xuICAgIGNvbnN0IGluQ2hhbm5lbCA9ICcuJyArIGNoYW5uZWxzW3NvdXJjZVJhbmsgLSAxXTsgIC8vIGUuZy4gXCIuYlwiIGZvciByYW5rIDMuXG4gICAgY29uc3QgaW50Q2hhbm5lbHMgPSBjaGFubmVscy5tYXAoeCA9PiAnaW50ICcgKyB4KTtcbiAgICBjb25zdCBzcmNSQ29vcmRzID1cbiAgICAgICAgZ2V0Q2hhbm5lbHMoJ3NvdXJjZUxvY1InLCBzb3VyY2VSYW5rIC0gMSkuY29uY2F0KCdpbklkeC5yJyk7XG4gICAgY29uc3Qgc3JjR0Nvb3JkcyA9XG4gICAgICAgIGdldENoYW5uZWxzKCdzb3VyY2VMb2NHJywgc291cmNlUmFuayAtIDEpLmNvbmNhdCgnaW5JZHguZycpO1xuICAgIGNvbnN0IHNyY0JDb29yZHMgPVxuICAgICAgICBnZXRDaGFubmVscygnc291cmNlTG9jQicsIHNvdXJjZVJhbmsgLSAxKS5jb25jYXQoJ2luSWR4LmInKTtcbiAgICBjb25zdCBzcmNBQ29vcmRzID1cbiAgICAgICAgZ2V0Q2hhbm5lbHMoJ3NvdXJjZUxvY0EnLCBzb3VyY2VSYW5rIC0gMSkuY29uY2F0KCdpbklkeC5hJyk7XG5cbiAgICBjb25zdCBjb21wT3AgPSAob3AgPT09ICdtYXgnKSA/ICdncmVhdGVyVGhhbicgOiAnbGVzc1RoYW4nO1xuICAgIGNvbnN0IGZldGNoQ2FuZGlkYXRlSWR4ID0gZmlyc3RQYXNzID8gJycgOiBgXG4gICAgICAgICAgaW5JZHggPSByb3VuZCh2ZWM0KGdldEJlc3RJbmRpY2VzQUNoYW5uZWwoJHtzcmNSQ29vcmRzLmpvaW4oKX0pLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICBnZXRCZXN0SW5kaWNlc0FDaGFubmVsKCR7c3JjR0Nvb3Jkcy5qb2luKCl9KSxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZ2V0QmVzdEluZGljZXNBQ2hhbm5lbCgke3NyY0JDb29yZHMuam9pbigpfSksXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgIGdldEJlc3RJbmRpY2VzQUNoYW5uZWwoJHtzcmNBQ29vcmRzLmpvaW4oKX0pKSk7YDtcblxuICAgIGNvbnN0IGZldGNoVmFsdWUgPSBgdmVjNChcbiAgICAgICAgICAgIGdldEFDaGFubmVsKCR7c3JjUkNvb3Jkcy5qb2luKCl9KSxcbiAgICAgICAgICAgIGhhc05leHRDb2wgPyBnZXRBQ2hhbm5lbCgke3NyY0dDb29yZHMuam9pbigpfSkgOiAwLixcbiAgICAgICAgICAgIGhhc05leHRSb3cgPyBnZXRBQ2hhbm5lbCgke3NyY0JDb29yZHMuam9pbigpfSkgOiAwLixcbiAgICAgICAgICAgIGhhc05leHRSb3cgJiYgaGFzTmV4dENvbCA/IGdldEFDaGFubmVsKCR7c3JjQUNvb3Jkcy5qb2luKCl9KSA6IDAuKWA7XG5cbiAgICBjb25zdCBnZXRCZXN0SW5kaWNlc0FDaGFubmVsU25pcHBldCA9IGZpcnN0UGFzcyA/ICcnIDogYFxuICAgICAgZmxvYXQgZ2V0QmVzdEluZGljZXNBQ2hhbm5lbCgke2ludENoYW5uZWxzLmpvaW4oKX0pIHtcbiAgICAgICAgcmV0dXJuIGdldENoYW5uZWwoZ2V0QmVzdEluZGljZXNBKCR7Y2hhbm5lbHMuam9pbigpfSksXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2ZWMyKCR7Y2hhbm5lbHMuc2xpY2UoLTIpLmpvaW4oKX0pKTtcbiAgICAgIH1gO1xuXG4gICAgdGhpcy51c2VyQ29kZSA9IGBcbiAgICAgIGZsb2F0IGdldEFDaGFubmVsKCR7aW50Q2hhbm5lbHMuam9pbigpfSkge1xuICAgICAgICByZXR1cm4gZ2V0Q2hhbm5lbChnZXRBKCR7Y2hhbm5lbHMuam9pbigpfSksXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmVjMigke2NoYW5uZWxzLnNsaWNlKC0yKS5qb2luKCl9KSk7XG4gICAgICB9XG4gICAgICAke2dldEJlc3RJbmRpY2VzQUNoYW5uZWxTbmlwcGV0fVxuICAgICAgdm9pZCBtYWluKCkge1xuICAgICAgICAke2R0eXBlfSBjb29yZHMgPSBnZXRPdXRwdXRDb29yZHMoKTtcbiAgICAgICAgYm9vbCBoYXNOZXh0Q29sID0gJHtjb29yZHNbcmFuayAtIDFdfSA8ICR7b3V0U2hhcGVbcmFuayAtIDFdIC0gMX07XG4gICAgICAgIGJvb2wgaGFzTmV4dFJvdyA9ICR7Y29vcmRzW3JhbmsgLSAyXX0gPCAke291dFNoYXBlW3JhbmsgLSAyXSAtIDF9O1xuICAgICAgICAke3NvdXJjZUxvY1NldHVwfVxuICAgICAgICBpdmVjNCBzcmNJZHggPSBpdmVjNChzb3VyY2VMb2NSJHtpbkNoYW5uZWx9LCBzb3VyY2VMb2NHJHtpbkNoYW5uZWx9LFxuICAgICAgICAgIHNvdXJjZUxvY0Ike2luQ2hhbm5lbH0sIHNvdXJjZUxvY0Eke2luQ2hhbm5lbH0pICogJHt3aW5kb3dTaXplfTtcbiAgICAgICAgaXZlYzQgaW5JZHggPSBzcmNJZHg7XG4gICAgICAgIHZlYzQgYmVzdEluZGV4ID0gdmVjNChpbklkeCk7XG4gICAgICAgIHZlYzQgYmVzdFZhbHVlID0gJHtmZXRjaFZhbHVlfTtcblxuICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8ICR7d2luZG93U2l6ZX07IGkrKykge1xuICAgICAgICAgIGluSWR4ID0gc3JjSWR4O1xuICAgICAgICAgICR7ZmV0Y2hDYW5kaWRhdGVJZHh9XG4gICAgICAgICAgdmVjNCBjYW5kaWRhdGUgPSAke2ZldGNoVmFsdWV9O1xuICAgICAgICAgIGJ2ZWM0IG5hbiA9IGlzbmFuKGNhbmRpZGF0ZSk7XG4gICAgICAgICAgYnZlYzQgcmVwbGFjZSA9IGJ2ZWM0KFxuICAgICAgICAgICAgdmVjNCgke2NvbXBPcH0oY2FuZGlkYXRlLCBiZXN0VmFsdWUpKSAqICh2ZWM0KDEuMCkgLSB2ZWM0KG5hbikpKTtcblxuICAgICAgICAgIGJlc3RWYWx1ZSA9IHZlYzQocmVwbGFjZS54ICA/IGNhbmRpZGF0ZS54IDogYmVzdFZhbHVlLngsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICByZXBsYWNlLnkgID8gY2FuZGlkYXRlLnkgOiBiZXN0VmFsdWUueSxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlcGxhY2UueiAgPyBjYW5kaWRhdGUueiA6IGJlc3RWYWx1ZS56LFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVwbGFjZS53ICA/IGNhbmRpZGF0ZS53IDogYmVzdFZhbHVlLncpO1xuICAgICAgICAgIGJlc3RJbmRleCA9IG1peChiZXN0SW5kZXgsIHZlYzQoaW5JZHgpLCB2ZWM0KHJlcGxhY2UpKTtcbiAgICAgICAgICBzcmNJZHgrKztcbiAgICAgICAgfVxuICAgICAgICBzZXRPdXRwdXQoYmVzdEluZGV4KTtcbiAgICAgIH1cbiAgICBgO1xuICB9XG59XG4iXX0=","/**\n * @license\n * Copyright 2020 Google LLC. All Rights Reserved.\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n * =============================================================================\n */\nimport { backend_util, env, util } from '@tensorflow/tfjs-core';\nimport { ArgMinMaxProgram } from '../argminmax_gpu';\nimport { ArgMinMaxPackedProgram } from '../argminmax_packed_gpu';\nimport { reshape } from '../kernels/Reshape';\nfunction argReduce(backend, x, reduceType, bestIndicesA = null) {\n let batchSize = x.shape[0];\n let inSize = x.shape[1];\n if (bestIndicesA != null) {\n batchSize = bestIndicesA.shape[0];\n inSize = bestIndicesA.shape[1];\n }\n const windowSize = backend_util.computeOptimalWindowSize(inSize);\n const reduceInfo = { windowSize, inSize, batchSize, outSize: Math.ceil(inSize / windowSize) };\n const program = new ArgMinMaxProgram(reduceInfo, reduceType, bestIndicesA == null);\n const inputs = [x];\n if (bestIndicesA != null) {\n inputs.push(bestIndicesA);\n }\n const output = backend.runWebGLProgram(program, inputs, 'int32');\n // No need to run another GPGPU program.\n if (output.shape[1] === 1) {\n return output;\n }\n const result = argReduce(backend, x, reduceType, output);\n backend.disposeIntermediateTensorInfo(output);\n return result;\n}\nfunction argReducePacked(backend, x, reduceType, bestIndicesA = null) {\n const inShape = bestIndicesA != null ? bestIndicesA.shape : x.shape;\n const inSize = inShape[inShape.length - 1];\n const windowSize = backend_util.computeOptimalWindowSize(inSize);\n const program = new ArgMinMaxPackedProgram(inShape, windowSize, reduceType, bestIndicesA == null);\n const inputs = bestIndicesA == null ? [x] : [x, bestIndicesA];\n const output = backend.runWebGLProgram(program, inputs, 'int32');\n if (output.shape.length === x.shape.length) {\n const result = argReducePacked(backend, x, reduceType, output);\n backend.disposeIntermediateTensorInfo(output);\n return result;\n }\n return output;\n}\nexport function argMinMaxReduce(backend, x, axis, reduceType) {\n const axes = [axis];\n backend_util.assertAxesAreInnerMostDims('arg' + reduceType.charAt(0).toUpperCase() + reduceType.slice(1), axes, x.shape.length);\n if (!env().getBool('WEBGL_PACK_REDUCE') || x.shape.length <= 2) {\n const intermediateTensorInfos = [];\n // Eagerly unpack x input since it is passed in to all the shaders which\n // require unpacked inputs.\n const xtexData = backend.texData.get(x.dataId);\n const xIsPacked = xtexData !== null && xtexData.isPacked;\n let xUnPacked = x;\n if (xIsPacked) {\n xUnPacked = backend.unpackTensor(x);\n intermediateTensorInfos.push(xUnPacked);\n }\n const [outShape, reduceShape] = backend_util.computeOutAndReduceShapes(xUnPacked.shape, axes);\n const inSize = util.sizeFromShape(reduceShape);\n const a2D = reshape({ inputs: { x: xUnPacked }, backend, attrs: { shape: [-1, inSize] } });\n intermediateTensorInfos.push(a2D);\n const reduced = argReduce(backend, a2D, reduceType);\n intermediateTensorInfos.push(reduced);\n const reshaped = reshape({ inputs: { x: reduced }, backend, attrs: { shape: outShape } });\n intermediateTensorInfos.forEach(t => backend.disposeIntermediateTensorInfo(t));\n return reshaped;\n }\n return argReducePacked(backend, x, reduceType);\n}\n//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYXJnX21pbl9tYXguanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi8uLi90ZmpzLWJhY2tlbmQtd2ViZ2wvc3JjL2tlcm5lbF91dGlscy9hcmdfbWluX21heC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQTs7Ozs7Ozs7Ozs7Ozs7O0dBZUc7QUFFSCxPQUFPLEVBQUMsWUFBWSxFQUFFLEdBQUcsRUFBYyxJQUFJLEVBQUMsTUFBTSx1QkFBdUIsQ0FBQztBQUUxRSxPQUFPLEVBQUMsZ0JBQWdCLEVBQUMsTUFBTSxrQkFBa0IsQ0FBQztBQUNsRCxPQUFPLEVBQUMsc0JBQXNCLEVBQUMsTUFBTSx5QkFBeUIsQ0FBQztBQUUvRCxPQUFPLEVBQUMsT0FBTyxFQUFDLE1BQU0sb0JBQW9CLENBQUM7QUFFM0MsU0FBUyxTQUFTLENBQ2QsT0FBeUIsRUFBRSxDQUFhLEVBQUUsVUFBdUIsRUFDakUsZUFBMkIsSUFBSTtJQUNqQyxJQUFJLFNBQVMsR0FBRyxDQUFDLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQyxDQUFDO0lBQzNCLElBQUksTUFBTSxHQUFHLENBQUMsQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDLENBQUM7SUFDeEIsSUFBSSxZQUFZLElBQUksSUFBSSxFQUFFO1FBQ3hCLFNBQVMsR0FBRyxZQUFZLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQyxDQUFDO1FBQ2xDLE1BQU0sR0FBRyxZQUFZLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQyxDQUFDO0tBQ2hDO0lBQ0QsTUFBTSxVQUFVLEdBQUcsWUFBWSxDQUFDLHdCQUF3QixDQUFDLE1BQU0sQ0FBQyxDQUFDO0lBQ2pFLE1BQU0sVUFBVSxHQUNaLEVBQUMsVUFBVSxFQUFFLE1BQU0sRUFBRSxTQUFTLEVBQUUsT0FBTyxFQUFFLElBQUksQ0FBQyxJQUFJLENBQUMsTUFBTSxHQUFHLFVBQVUsQ0FBQyxFQUFDLENBQUM7SUFDN0UsTUFBTSxPQUFPLEdBQ1QsSUFBSSxnQkFBZ0Is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LENBQUMsQ0FBQyxDQUFDLENBQUM7UUFDbkQsT0FBTyxRQUFRLENBQUM7S0FDakI7SUFDRCxPQUFPLGVBQWUsQ0FBQyxPQUFPLEVBQUUsQ0FBQyxFQUFFLFVBQVUsQ0FBQyxDQUFDO0FBQ2pELENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyIvKipcbiAqIEBsaWNlbnNlXG4gKiBDb3B5cmlnaHQgMjAyMCBHb29nbGUgTExDLiBBbGwgUmlnaHRzIFJlc2VydmVkLlxuICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlIFwiTGljZW5zZVwiKTtcbiAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS5cbiAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdFxuICpcbiAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMFxuICpcbiAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmVcbiAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuIFwiQVMgSVNcIiBCQVNJUyxcbiAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLlxuICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZFxuICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuXG4gKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuICovXG5cbmltcG9ydCB7YmFja2VuZF91dGlsLCBlbnYsIFRlbnNvckluZm8sIHV0aWx9IGZyb20gJ0B0ZW5zb3JmbG93L3RmanMtY29yZSc7XG5cbmltcG9ydCB7QXJnTWluTWF4UHJvZ3JhbX0gZnJvbSAnLi4vYXJnbWlubWF4X2dwdSc7XG5pbXBvcnQge0FyZ01pbk1heFBhY2tlZFByb2dyYW19IGZyb20gJy4uL2FyZ21pbm1heF9wYWNrZWRfZ3B1JztcbmltcG9ydCB7TWF0aEJhY2tlbmRXZWJHTH0gZnJvbSAnLi4vYmFja2VuZF93ZWJnbCc7XG5pbXBvcnQge3Jlc2hhcGV9IGZyb20gJy4uL2tlcm5lbHMvUmVzaGFwZSc7XG5cbmZ1bmN0aW9uIGFyZ1JlZHVjZShcbiAgICBiYWNrZW5kOiBNYXRoQmFja2VuZFdlYkdMLCB4OiBUZW5zb3JJbmZvLCByZWR1Y2VUeXBlOiAnbWF4J3wnbWluJyxcbiAgICBiZXN0SW5kaWNlc0E6IFRlbnNvckluZm8gPSBudWxsKTogVGVuc29ySW5mbyB7XG4gIGxldCBiYXRjaFNpemUgPSB4LnNoYXBlWzBdO1xuICBsZXQgaW5TaXplID0geC5zaGFwZVsxXTtcbiAgaWYgKGJlc3RJbmRpY2VzQSAhPSBudWxsKSB7XG4gICAgYmF0Y2hTaXplID0gYmVzdEluZGljZXNBLnNoYXBlWzBdO1xuICAgIGluU2l6ZSA9IGJlc3RJbmRpY2VzQS5zaGFwZVsxXTtcbiAgfVxuICBjb25zdCB3aW5kb3dTaXplID0gYmFja2VuZF91dGlsLmNvbXB1dGVPcHRpbWFsV2luZG93U2l6ZShpblNpemUpO1xuICBjb25zdCByZWR1Y2VJbmZvID1cbiAgICAgIHt3aW5kb3dTaXplLCBpblNpemUsIGJhdGNoU2l6ZSwgb3V0U2l6ZTogTWF0aC5jZWlsKGluU2l6ZSAvIHdpbmRvd1NpemUpfTtcbiAgY29uc3QgcHJvZ3JhbSA9XG4gICAgICBuZXcgQXJnTWluTWF4UHJvZ3JhbShyZWR1Y2VJbmZvLCByZWR1Y2VUeXBlLCBiZXN0SW5kaWNlc0EgPT0gbnVsbCk7XG4gIGNvbnN0IGlucHV0cyA9IFt4XTtcbiAgaWYgKGJlc3RJbmRpY2VzQSAhPSBudWxsKSB7XG4gICAgaW5wdXRzLnB1c2goYmVzdEluZGljZXNBKTtcbiAgfVxuICBjb25zdCBvdXRwdXQgPSBiYWNrZW5kLnJ1bldlYkdMUHJvZ3JhbShwcm9ncmFtLCBpbnB1dHMsICdpbnQzMicpO1xuICAvLyBObyBuZWVkIHRvIHJ1biBhbm90aGVyIEdQR1BVIHByb2dyYW0uXG4gIGlmIChvdXRwdXQuc2hhcGVbMV0gPT09IDEpIHtcbiAgICByZXR1cm4gb3V0cHV0O1xuICB9XG4gIGNvbnN0IHJlc3VsdCA9IGFyZ1JlZHVjZShiYWNrZW5kLCB4LCByZWR1Y2VUeXBlLCBvdXRwdXQpO1xuICBiYWNrZW5kLmRpc3Bvc2VJbnRlcm1lZGlhdGVUZW5zb3JJbmZvKG91dHB1dCk7XG4gIHJldHVybiByZXN1bHQ7XG59XG5cbmZ1bmN0aW9uIGFyZ1JlZHVjZVBhY2tlZChcbiAgICBiYWNrZW5kOiBNYXRoQmFja2VuZFdlYkdMLCB4OiBUZW5zb3JJbmZvLCByZWR1Y2VUeXBlOiAnbWF4J3wnbWluJyxcbiAgICBiZXN0SW5kaWNlc0E6IFRlbnNvckluZm8gPSBudWxsKTogVGVuc29ySW5mbyB7XG4gIGNvbnN0IGluU2hhcGUgPSBiZXN0SW5kaWNlc0EgIT0gbnVsbCA/IGJlc3RJbmRpY2VzQS5zaGFwZSA6IHguc2hhcGU7XG4gIGNvbnN0IGluU2l6ZSA9IGluU2hhcGVbaW5TaGFwZS5sZW5ndGggLSAxXTtcbiAgY29uc3Qgd2luZG93U2l6ZSA9IGJhY2tlbmRfdXRpbC5jb21wdXRlT3B0aW1hbFdpbmRvd1NpemUoaW5TaXplKTtcbiAgY29uc3QgcHJvZ3JhbSA9IG5ldyBBcmdNaW5NYXhQYWNrZWRQcm9ncmFtKFxuICAgICAgaW5TaGFwZSwgd2luZG93U2l6ZSwgcmVkdWNlVHlwZSwgYmVzdEluZGljZXNBID09IG51bGwpO1xuICBjb25zdCBpbnB1dHMgPSBiZXN0SW5kaWNlc0EgPT0gbnVsbCA/IFt4XSA6IFt4LCBiZXN0SW5kaWNlc0FdO1xuICBjb25zdCBvdXRwdXQgPSBiYWNrZW5kLnJ1bldlYkdMUHJvZ3JhbShwcm9ncmFtLCBpbnB1dHMsICdpbnQzMicpO1xuICBpZiAob3V0cHV0LnNoYXBlLmxlbmd0aCA9PT0geC5zaGFwZS5sZW5ndGgpIHtcbiAgICBjb25zdCByZXN1bHQgPSBhcmdSZWR1Y2VQYWNrZWQoYmFja2VuZCwgeCwgcmVkdWNlVHlwZSwgb3V0cHV0KTtcbiAgICBiYWNrZW5kLmRpc3Bvc2VJbnRlcm1lZGlhdGVUZW5zb3JJbmZvKG91dHB1dCk7XG4gICAgcmV0dXJuIHJlc3VsdDtcbiAgfVxuICByZXR1cm4gb3V0cHV0O1xufVxuXG5leHBvcnQgZnVuY3Rpb24gYXJnTWluTWF4UmVkdWNlKFxuICAgIGJhY2tlbmQ6IE1hdGhCYWNrZW5kV2ViR0wsIHg6IFRlbnNvckluZm8sIGF4aXM6IG51bWJlcixcbiAgICByZWR1Y2VUeXBlOiAnbWluJ3wnbWF4Jyk6IFRlbnNvckluZm8ge1xuICBjb25zdCBheGVzID0gW2F4aXNdO1xuICBiYWNrZW5kX3V0aWwuYXNzZXJ0QXhlc0FyZUlubmVyTW9zdERpbXMoXG4gICAgICAnYXJnJyArIHJlZHVjZVR5cGUuY2hhckF0KDApLnRvVXBwZXJDYXNlKCkgKyByZWR1Y2VUeXBlLnNsaWNlKDEpLCBheGVzLFxuICAgICAgeC5zaGFwZS5sZW5ndGgpO1xuICBpZiAoIWVudigpLmdldEJvb2woJ1dFQkdMX1BBQ0tfUkVEVUNFJykgfHwgeC5zaGFwZS5sZW5ndGggPD0gMikge1xuICAgIGNvbnN0IGludGVybWVkaWF0ZVRlbnNvckluZm9zID0gW107XG4gICAgLy8gRWFnZXJseSB1bnBhY2sgeCBpbnB1dCBzaW5jZSBpdCBpcyBwYXNzZWQgaW4gdG8gYWxsIHRoZSBzaGFkZXJzIHdoaWNoXG4gICAgLy8gcmVxdWlyZSB1bnBhY2tlZCBpbnB1dHMuXG4gICAgY29uc3QgeHRleERhdGEgPSBiYWNrZW5kLnRleERhdGEuZ2V0KHguZGF0YUlkKTtcbiAgICBjb25zdCB4SXNQYWNrZWQgPSB4dGV4RGF0YSAhPT0gbnVsbCAmJiB4dGV4RGF0YS5pc1BhY2tlZDtcbiAgICBsZXQgeFVuUGFja2VkID0geDtcbiAgICBpZiAoeElzUGFja2VkKSB7XG4gICAgICB4VW5QYWNrZWQgPSBiYWNrZW5kLnVucGFja1RlbnNvcih4KTtcbiAgICAgIGludGVybWVkaWF0ZVRlbnNvckluZm9zLnB1c2goeFVuUGFja2VkKTtcbiAgICB9XG5cbiAgICBjb25zdCBbb3V0U2hhcGUsIHJlZHVjZVNoYXBlXSA9XG4gICAgICAgIGJhY2tlbmRfdXRpbC5jb21wdXRlT3V0QW5kUmVkdWNlU2hhcGVzKHhVblBhY2tlZC5zaGFwZSwgYXhlcyk7XG4gICAgY29uc3QgaW5TaXplID0gdXRpbC5zaXplRnJvbVNoYXBlKHJlZHVjZVNoYXBlKTtcbiAgICBjb25zdCBhMkQgPSByZXNoYXBlKFxuICAgICAgICB7aW5wdXRzOiB7eDogeFVuUGFja2VkfSwgYmFja2VuZCwgYXR0cnM6IHtzaGFwZTogWy0xLCBpblNpemVdfX0pO1xuICAgIGludGVybWVkaWF0ZVRlbnNvckluZm9zLnB1c2goYTJEKTtcblxuICAgIGNvbnN0IHJlZHVjZWQgPSBhcmdSZWR1Y2UoYmFja2VuZCwgYTJELCByZWR1Y2VUeXBlKTtcbiAgICBpbnRlcm1lZGlhdGVUZW5zb3JJbmZvcy5wdXNoKHJlZHVjZWQpO1xuICAgIGNvbnN0IHJlc2hhcGVkID1cbiAgICAgICAgcmVzaGFwZSh7aW5wdXRzOiB7eDogcmVkdWNlZH0sIGJhY2tlbmQsIGF0dHJzOiB7c2hhcGU6IG91dFNoYXBlfX0pO1xuXG4gICAgaW50ZXJtZWRpYXRlVGVuc29ySW5mb3MuZm9yRWFjaChcbiAgICAgICAgdCA9PiBiYWNrZW5kLmRpc3Bvc2VJbnRlcm1lZGlhdGVUZW5zb3JJbmZvKHQpKTtcbiAgICByZXR1cm4gcmVzaGFwZWQ7XG4gIH1cbiAgcmV0dXJuIGFyZ1JlZHVjZVBhY2tlZChiYWNrZW5kLCB4LCByZWR1Y2VUeXBlKTtcbn1cbiJdfQ==","/**\n * @license\n * Copyright 2020 Google LLC. All Rights Reserved.\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n * =============================================================================\n */\nimport { ArgMax, backend_util, util } from '@tensorflow/tfjs-core';\nimport { argMinMaxReduce } from '../kernel_utils/arg_min_max';\nimport { transpose } from './Transpose';\nexport function argMax(args) {\n const { inputs, backend, attrs } = args;\n const { x } = inputs;\n const { axis } = attrs;\n let axes = util.parseAxisParam(axis, x.shape);\n const permutedAxes = backend_util.getAxesPermutation(axes, x.shape.length);\n let $x = x;\n const intermediateTensorInfos = [];\n if (permutedAxes != null) {\n $x = transpose({ inputs: { x }, backend, attrs: { perm: permutedAxes } });\n intermediateTensorInfos.push($x);\n axes = backend_util.getInnerMostAxes(axes.length, $x.shape.length);\n }\n backend_util.assertAxesAreInnerMostDims('argMax', [axes[0]], $x.shape.length);\n const out = argMinMaxReduce(backend, $x, axes[0], 'max');\n intermediateTensorInfos.forEach(t => backend.disposeIntermediateTensorInfo(t));\n return out;\n}\nexport const argMaxConfig = {\n kernelName: ArgMax,\n backendName: 'webgl',\n kernelFunc: argMax\n};\n//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiQXJnTWF4LmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vLi4vdGZqcy1iYWNrZW5kLXdlYmdsL3NyYy9rZXJuZWxzL0FyZ01heC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQTs7Ozs7Ozs7Ozs7Ozs7O0dBZUc7QUFFSCxPQUFPLEVBQUMsTUFBTSxFQUE2QixZQUFZLEVBQXdDLElBQUksRUFBQyxNQUFNLHVCQUF1QixDQUFDO0FBR2xJLE9BQU8sRUFBQyxlQUFlLEVBQUMsTUFBTSw2QkFBNkIsQ0FBQztBQUU1RCxPQUFPLEVBQUMsU0FBUyxFQUFDLE1BQU0sYUFBYSxDQUFDO0FBRXRDLE1BQU0sVUFBVSxNQUFNLENBQ2xCLElBQ3lFO0lBRTNFLE1BQU0sRUFBQyxNQUFNLEVBQUUsT0FBTyxFQUFFLEtBQUssRUFBQyxHQUFHLElBQUksQ0FBQztJQUN0QyxNQUFNLEVBQUMsQ0FBQyxFQUFDLEdBQUcsTUFBTSxDQUFDO0lBQ25CLE1BQU0sRUFBQyxJQUFJLEVBQUMsR0FBRyxLQUFLLENBQUM7SUFFckIsSUFBSSxJQUFJLEdBQUcsSUFBSSxDQUFDLGNBQWMsQ0FBQyxJQUFJLEVBQUUsQ0FBQyxDQUFDLEtBQUssQ0FBQyxDQUFDO0lBQzlDLE1BQU0sWUFBWSxHQUFHLFlBQVksQ0FBQyxrQkFBa0IsQ0FBQyxJQUFJLEVBQUUsQ0FBQyxDQUFDLEtBQUssQ0FBQyxNQUFNLENBQUMsQ0FBQztJQUMzRSxJQUFJLEVBQUUsR0FBRyxDQUFDLENBQUM7SUFDWCxNQUFNLHVCQUF1QixHQUFHLEVBQUUsQ0FBQztJQUNuQyxJQUFJLFlBQVksSUFBSSxJQUFJLEVBQUU7UUFDeEIsRUFBRSxHQUFHLFNBQVMsQ0FBQyxFQUFDLE1BQU0sRUFBRSxFQUFDLENBQUMsRUFBQyxFQUFFLE9BQU8sRUFBRSxLQUFLLEVBQUUsRUFBQyxJQUFJLEVBQUUsWUFBWSxFQUFDLEVBQUMsQ0FBQyxDQUFDO1FBQ3BFLHVCQUF1QixDQUFDLElBQUksQ0FBQyxFQUFFLENBQUMsQ0FBQztRQUNqQyxJQUFJLEdBQUcsWUFBWSxDQUFDLGdCQUFnQixDQUFDLElBQUksQ0FBQyxNQUFNLEVBQUUsRUFBRSxDQUFDLEtBQUssQ0FBQyxNQUFNLENBQUMsQ0FBQztLQUNwRTtJQUVELFlBQVksQ0FBQywwQkFBMEIsQ0FBQyxRQUFRLEVBQUUsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUMsRUFBRSxFQUFFLENBQUMsS0FBSyxDQUFDLE1BQU0sQ0FBQyxDQUFDO0lBQzlFLE1BQU0sR0FBRyxHQUFHLGVBQWUsQ0FBQyxPQUFPLEVBQUUsRUFBRSxFQUFFLElBQUksQ0FBQyxDQUFDLENBQUMsRUFBRSxLQUFLLENBQUMsQ0FBQztJQUV6RCx1QkFBdUIsQ0FBQyxPQUFPLENBQzNCLENBQUMsQ0FBQyxFQUFFLENBQUMsT0FBTyxDQUFDLDZCQUE2QixDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUM7SUFDbkQsT0FBTyxHQUFHLENBQUM7QUFDYixDQUFDO0FBRUQsTUFBTSxDQUFDLE1BQU0sWUFBWSxHQUFpQjtJQUN4QyxVQUFVLEVBQUUsTUFBTTtJQUNsQixXQUFXLEVBQUUsT0FBTztJQUNwQixVQUFVLEVBQUUsTUFBMEI7Q0FDdkMsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbIi8qKlxuICogQGxpY2Vuc2VcbiAqIENvcHlyaWdodCAyMDIwIEdvb2dsZSBMTEMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuXG4gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgXCJMaWNlbnNlXCIpO1xuICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLlxuICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0XG4gKlxuICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wXG4gKlxuICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZVxuICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gXCJBUyBJU1wiIEJBU0lTLFxuICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuXG4gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kXG4gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS5cbiAqID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4gKi9cblxuaW1wb3J0IHtBcmdNYXgsIEFyZ01heEF0dHJzLCBBcmdNYXhJbnB1dHMsIGJhY2tlbmRfdXRpbCwgS2VybmVsQ29uZmlnLCBLZXJuZWxGdW5jLCBUZW5zb3JJbmZvLCB1dGlsfSBmcm9tICdAdGVuc29yZmxvdy90ZmpzLWNvcmUnO1xuXG5pbXBvcnQge01hdGhCYWNrZW5kV2ViR0x9IGZyb20gJy4uL2JhY2tlbmRfd2ViZ2wnO1xuaW1wb3J0IHthcmdNaW5NYXhSZWR1Y2V9IGZyb20gJy4uL2tlcm5lbF91dGlscy9hcmdfbWluX21heCc7XG5cbmltcG9ydCB7dHJhbnNwb3NlfSBmcm9tICcuL1RyYW5zcG9zZSc7XG5cbmV4cG9ydCBmdW5jdGlvbiBhcmdNYXgoXG4gICAgYXJnczpcbiAgICAgICAge2lucHV0czogQXJnTWF4SW5wdXRzLCBiYWNrZW5kOiBNYXRoQmFja2VuZFdlYkdMLCBhdHRyczogQXJnTWF4QXR0cnN9KTpcbiAgICBUZW5zb3JJbmZvIHtcbiAgY29uc3Qge2lucHV0cywgYmFja2VuZCwgYXR0cnN9ID0gYXJncztcbiAgY29uc3Qge3h9ID0gaW5wdXRzO1xuICBjb25zdCB7YXhpc30gPSBhdHRycztcblxuICBsZXQgYXhlcyA9IHV0aWwucGFyc2VBeGlzUGFyYW0oYXhpcywgeC5zaGFwZSk7XG4gIGNvbnN0IHBlcm11dGVkQXhlcyA9IGJhY2tlbmRfdXRpbC5nZXRBeGVzUGVybXV0YXRpb24oYXhlcywgeC5zaGFwZS5sZW5ndGgpO1xuICBsZXQgJHggPSB4O1xuICBjb25zdCBpbnRlcm1lZGlhdGVUZW5zb3JJbmZvcyA9IFtdO1xuICBpZiAocGVybXV0ZWRBeGVzICE9IG51bGwpIHtcbiAgICAkeCA9IHRyYW5zcG9zZSh7aW5wdXRzOiB7eH0sIGJhY2tlbmQsIGF0dHJzOiB7cGVybTogcGVybXV0ZWRBeGVzfX0pO1xuICAgIGludGVybWVkaWF0ZVRlbnNvckluZm9zLnB1c2goJHgpO1xuICAgIGF4ZXMgPSBiYWNrZW5kX3V0aWwuZ2V0SW5uZXJNb3N0QXhlcyhheGVzLmxlbmd0aCwgJHguc2hhcGUubGVuZ3RoKTtcbiAgfVxuXG4gIGJhY2tlbmRfdXRpbC5hc3NlcnRBeGVzQXJlSW5uZXJNb3N0RGltcygnYXJnTWF4JywgW2F4ZXNbMF1dLCAkeC5zaGFwZS5sZW5ndGgpO1xuICBjb25zdCBvdXQgPSBhcmdNaW5NYXhSZWR1Y2UoYmFja2VuZCwgJHgsIGF4ZXNbMF0sICdtYXgnKTtcblxuICBpbnRlcm1lZGlhdGVUZW5zb3JJbmZvcy5mb3JFYWNoKFxuICAgICAgdCA9PiBiYWNrZW5kLmRpc3Bvc2VJbnRlcm1lZGlhdGVUZW5zb3JJbmZvKHQpKTtcbiAgcmV0dXJuIG91dDtcbn1cblxuZXhwb3J0IGNvbnN0IGFyZ01heENvbmZpZzogS2VybmVsQ29uZmlnID0ge1xuICBrZXJuZWxOYW1lOiBBcmdNYXgsXG4gIGJhY2tlbmROYW1lOiAnd2ViZ2wnLFxuICBrZXJuZWxGdW5jOiBhcmdNYXggYXMge30gYXMgS2VybmVsRnVuY1xufTtcbiJdfQ==","/**\n * @license\n * Copyright 2020 Google LLC. All Rights Reserved.\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n * =============================================================================\n */\nimport { ArgMin, backend_util, util } from '@tensorflow/tfjs-core';\nimport { argMinMaxReduce } from '../kernel_utils/arg_min_max';\nimport { transpose } from './Transpose';\nexport function argMin(args) {\n const { inputs, backend, attrs } = args;\n const { x } = inputs;\n const { axis } = attrs;\n let axes = util.parseAxisParam(axis, x.shape);\n const permutedAxes = backend_util.getAxesPermutation(axes, x.shape.length);\n let $x = x;\n const intermediateTensorInfos = [];\n if (permutedAxes != null) {\n $x = transpose({ inputs: { x }, backend, attrs: { perm: permutedAxes } });\n intermediateTensorInfos.push($x);\n axes = backend_util.getInnerMostAxes(axes.length, $x.shape.length);\n }\n backend_util.assertAxesAreInnerMostDims('argMin', [axes[0]], $x.shape.length);\n const out = argMinMaxReduce(backend, $x, axes[0], 'min');\n intermediateTensorInfos.forEach(t => backend.disposeIntermediateTensorInfo(t));\n return out;\n}\nexport const argMinConfig = {\n kernelName: ArgMin,\n backendName: 'webgl',\n kernelFunc: argMin\n};\n//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiQXJnTWluLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vLi4vdGZqcy1iYWNrZW5kLXdlYmdsL3NyYy9rZXJuZWxzL0FyZ01pbi50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQTs7Ozs7Ozs7Ozs7Ozs7O0dBZUc7QUFFSCxPQUFPLEVBQUMsTUFBTSxFQUE2QixZQUFZLEVBQXdDLElBQUksRUFBQyxNQUFNLHVCQUF1QixDQUFDO0FBR2xJLE9BQU8sRUFBQyxlQUFlLEVBQUMsTUFBTSw2QkFBNkIsQ0FBQztBQUM1RCxPQUFPLEVBQUMsU0FBUyxFQUFDLE1BQU0sYUFBYSxDQUFDO0FBRXRDLE1BQU0sVUFBVSxNQUFNLENBQ2xCLElBQ3lFO0lBRTNFLE1BQU0sRUFBQyxNQUFNLEVBQUUsT0FBTyxFQUFFLEtBQUssRUFBQyxHQUFHLElBQUksQ0FBQztJQUN0QyxNQUFNLEVBQUMsQ0FBQyxFQUFDLEdBQUcsTUFBTSxDQUFDO0lBQ25CLE1BQU0sRUFBQyxJQUFJLEVBQUMsR0FBRyxLQUFLLENBQUM7SUFFckIsSUFBSSxJQUFJLEdBQUcsSUFBSSxDQUFDLGNBQWMsQ0FBQyxJQUFJLEVBQUUsQ0FBQyxDQUFDLEtBQUssQ0FBQyxDQUFDO0lBQzlDLE1BQU0sWUFBWSxHQUFHLFlBQVksQ0FBQyxrQkFBa0IsQ0FBQyxJQUFJLEVBQUUsQ0FBQyxDQUFDLEtBQUssQ0FBQyxNQUFNLENBQUMsQ0FBQztJQUMzRSxJQUFJLEVBQUUsR0FBRyxDQUFDLENBQUM7SUFDWCxNQUFNLHVCQUF1QixHQUFHLEVBQUUsQ0FBQztJQUNuQyxJQUFJLFlBQVksSUFBSSxJQUFJLEVBQUU7UUFDeEIsRUFBRSxHQUFHLFNBQVMsQ0FBQyxFQUFDLE1BQU0sRUFBRSxFQUFDLENBQUMsRUFBQyxFQUFFLE9BQU8sRUFBRSxLQUFLLEVBQUUsRUFBQyxJQUFJLEVBQUUsWUFBWSxFQUFDLEVBQUMsQ0FBQyxDQUFDO1FBQ3BFLHVCQUF1QixDQUFDLElBQUksQ0FBQyxFQUFFLENBQUMsQ0FBQztRQUNqQyxJQUFJLEdBQUcsWUFBWSxDQUFDLGdCQUFnQixDQUFDLElBQUksQ0FBQyxNQUFNLEVBQUUsRUFBRSxDQUFDLEtBQUssQ0FBQyxNQUFNLENBQUMsQ0FBQztLQUNwRTtJQUVELFlBQVksQ0FBQywwQkFBMEIsQ0FBQyxRQUFRLEVBQUUsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUMsRUFBRSxFQUFFLENBQUMsS0FBSyxDQUFDLE1BQU0sQ0FBQyxDQUFDO0lBRTlFLE1BQU0sR0FBRyxHQUFHLGVBQWUsQ0FBQyxPQUFPLEVBQUUsRUFBRSxFQUFFLElBQUksQ0FBQyxDQUFDLENBQUMsRUFBRSxLQUFLLENBQUMsQ0FBQztJQUV6RCx1QkFBdUIsQ0FBQyxPQUFPLENBQzNCLENBQUMsQ0FBQyxFQUFFLENBQUMsT0FBTyxDQUFDLDZCQUE2QixDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUM7SUFDbkQsT0FBTyxHQUFHLENBQUM7QUFDYixDQUFDO0FBRUQsTUFBTSxDQUFDLE1BQU0sWUFBWSxHQUFpQjtJQUN4QyxVQUFVLEVBQUUsTUFBTTtJQUNsQixXQUFXLEVBQUUsT0FBTztJQUNwQixVQUFVLEVBQUUsTUFBMEI7Q0FDdkMsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbIi8qKlxuICogQGxpY2Vuc2VcbiAqIENvcHlyaWdodCAyMDIwIEdvb2dsZSBMTEMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuXG4gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgXCJMaWNlbnNlXCIpO1xuICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLlxuICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0XG4gKlxuICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wXG4gKlxuICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZVxuICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gXCJBUyBJU1wiIEJBU0lTLFxuICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuXG4gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kXG4gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS5cbiAqID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4gKi9cblxuaW1wb3J0IHtBcmdNaW4sIEFyZ01pbkF0dHJzLCBBcmdNaW5JbnB1dHMsIGJhY2tlbmRfdXRpbCwgS2VybmVsQ29uZmlnLCBLZXJuZWxGdW5jLCBUZW5zb3JJbmZvLCB1dGlsfSBmcm9tICdAdGVuc29yZmxvdy90ZmpzLWNvcmUnO1xuXG5pbXBvcnQge01hdGhCYWNrZW5kV2ViR0x9IGZyb20gJy4uL2JhY2tlbmRfd2ViZ2wnO1xuaW1wb3J0IHthcmdNaW5NYXhSZWR1Y2V9IGZyb20gJy4uL2tlcm5lbF91dGlscy9hcmdfbWluX21heCc7XG5pbXBvcnQge3RyYW5zcG9zZX0gZnJvbSAnLi9UcmFuc3Bvc2UnO1xuXG5leHBvcnQgZnVuY3Rpb24gYXJnTWluKFxuICAgIGFyZ3M6XG4gICAgICAgIHtpbnB1dHM6IEFyZ01pbklucHV0cywgYmFja2VuZDogTWF0aEJhY2tlbmRXZWJHTCwgYXR0cnM6IEFyZ01pbkF0dHJzfSk6XG4gICAgVGVuc29ySW5mbyB7XG4gIGNvbnN0IHtpbnB1dHMsIGJhY2tlbmQsIGF0dHJzfSA9IGFyZ3M7XG4gIGNvbnN0IHt4fSA9IGlucHV0cztcbiAgY29uc3Qge2F4aXN9ID0gYXR0cnM7XG5cbiAgbGV0IGF4ZXMgPSB1dGlsLnBhcnNlQXhpc1BhcmFtKGF4aXMsIHguc2hhcGUpO1xuICBjb25zdCBwZXJtdXRlZEF4ZXMgPSBiYWNrZW5kX3V0aWwuZ2V0QXhlc1Blcm11dGF0aW9uKGF4ZXMsIHguc2hhcGUubGVuZ3RoKTtcbiAgbGV0ICR4ID0geDtcbiAgY29uc3QgaW50ZXJtZWRpYXRlVGVuc29ySW5mb3MgPSBbXTtcbiAgaWYgKHBlcm11dGVkQXhlcyAhPSBudWxsKSB7XG4gICAgJHggPSB0cmFuc3Bvc2Uoe2lucHV0czoge3h9LCBiYWNrZW5kLCBhdHRyczoge3Blcm06IHBlcm11dGVkQXhlc319KTtcbiAgICBpbnRlcm1lZGlhdGVUZW5zb3JJbmZvcy5wdXNoKCR4KTtcbiAgICBheGVzID0gYmFja2VuZF91dGlsLmdldElubmVyTW9zdEF4ZXMoYXhlcy5sZW5ndGgsICR4LnNoYXBlLmxlbmd0aCk7XG4gIH1cblxuICBiYWNrZW5kX3V0aWwuYXNzZXJ0QXhlc0FyZUlubmVyTW9zdERpbXMoJ2FyZ01pbicsIFtheGVzWzBdXSwgJHguc2hhcGUubGVuZ3RoKTtcblxuICBjb25zdCBvdXQgPSBhcmdNaW5NYXhSZWR1Y2UoYmFja2VuZCwgJHgsIGF4ZXNbMF0sICdtaW4nKTtcblxuICBpbnRlcm1lZGlhdGVUZW5zb3JJbmZvcy5mb3JFYWNoKFxuICAgICAgdCA9PiBiYWNrZW5kLmRpc3Bvc2VJbnRlcm1lZGlhdGVUZW5zb3JJbmZvKHQpKTtcbiAgcmV0dXJuIG91dDtcbn1cblxuZXhwb3J0IGNvbnN0IGFyZ01pbkNvbmZpZzogS2VybmVsQ29uZmlnID0ge1xuICBrZXJuZWxOYW1lOiBBcmdNaW4sXG4gIGJhY2tlbmROYW1lOiAnd2ViZ2wnLFxuICBrZXJuZWxGdW5jOiBhcmdNaW4gYXMge30gYXMgS2VybmVsRnVuY1xufTtcbiJdfQ==","/**\n * @license\n * Copyright 2020 Google LLC. All Rights Reserved.\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n * =============================================================================\n */\nimport { Asin } from '@tensorflow/tfjs-core';\nimport { unaryKernelFunc } from '../kernel_utils/kernel_funcs_utils';\nimport { CHECK_NAN_SNIPPET } from '../unaryop_gpu';\nconst ASIN = CHECK_NAN_SNIPPET + `\n if (abs(x) > 1.) {\n return NAN;\n }\n return asin(x);\n`;\nexport const asin = unaryKernelFunc({ opSnippet: ASIN });\nexport const asinConfig = {\n kernelName: Asin,\n backendName: 'webgl',\n kernelFunc: asin,\n};\n//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiQXNpbi5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uLy4uL3RmanMtYmFja2VuZC13ZWJnbC9zcmMva2VybmVscy9Bc2luLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBOzs7Ozs7Ozs7Ozs7Ozs7R0FlRztBQUVILE9BQU8sRUFBQyxJQUFJLEVBQWUsTUFBTSx1QkFBdUIsQ0FBQztBQUV6RCxPQUFPLEVBQUMsZUFBZSxFQUFDLE1BQU0sb0NBQW9DLENBQUM7QUFDbkUsT0FBTyxFQUFDLGlCQUFpQixFQUFDLE1BQU0sZ0JBQWdCLENBQUM7QUFFakQsTUFBTSxJQUFJLEdBQUcsaUJBQWlCLEdBQUc7Ozs7O0NBS2hDLENBQUM7QUFFRixNQUFNLENBQUMsTUFBTSxJQUFJLEdBQUcsZUFBZSxDQUFDLEVBQUMsU0FBUyxFQUFFLElBQUksRUFBQyxDQUFDLENBQUM7QUFFdkQsTUFBTSxDQUFDLE1BQU0sVUFBVSxHQUFpQjtJQUN0QyxVQUFVLEVBQUUsSUFBSTtJQUNoQixXQUFXLEVBQUUsT0FBTztJQUNwQixVQUFVLEVBQUUsSUFBSTtDQUNqQixDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiLyoqXG4gKiBAbGljZW5zZVxuICogQ29weXJpZ2h0IDIwMjAgR29vZ2xlIExMQy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC5cbiAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSBcIkxpY2Vuc2VcIik7XG4gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuXG4gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXRcbiAqXG4gKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjBcbiAqXG4gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlXG4gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiBcIkFTIElTXCIgQkFTSVMsXG4gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC5cbiAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmRcbiAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLlxuICogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbiAqL1xuXG5pbXBvcnQge0FzaW4sIEtlcm5lbENvbmZpZ30gZnJvbSAnQHRlbnNvcmZsb3cvdGZqcy1jb3JlJztcblxuaW1wb3J0IHt1bmFyeUtlcm5lbEZ1bmN9IGZyb20gJy4uL2tlcm5lbF91dGlscy9rZXJuZWxfZnVuY3NfdXRpbHMnO1xuaW1wb3J0IHtDSEVDS19OQU5fU05JUFBFVH0gZnJvbSAnLi4vdW5hcnlvcF9ncHUnO1xuXG5jb25zdCBBU0lOID0gQ0hFQ0tfTkFOX1NOSVBQRVQgKyBgXG4gIGlmIChhYnMoeCkgPiAxLikge1xuICAgIHJldHVybiBOQU47XG4gIH1cbiAgcmV0dXJuIGFzaW4oeCk7XG5gO1xuXG5leHBvcnQgY29uc3QgYXNpbiA9IHVuYXJ5S2VybmVsRnVuYyh7b3BTbmlwcGV0OiBBU0lOfSk7XG5cbmV4cG9ydCBjb25zdCBhc2luQ29uZmlnOiBLZXJuZWxDb25maWcgPSB7XG4gIGtlcm5lbE5hbWU6IEFzaW4sXG4gIGJhY2tlbmROYW1lOiAnd2ViZ2wnLFxuICBrZXJuZWxGdW5jOiBhc2luLFxufTtcbiJdfQ==","/**\n * @license\n * Copyright 2020 Google LLC. All Rights Reserved.\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n * =============================================================================\n */\nimport { Asinh } from '@tensorflow/tfjs-core';\nimport { unaryKernelFunc } from '../kernel_utils/kernel_funcs_utils';\nimport { CHECK_NAN_SNIPPET } from '../unaryop_gpu';\nconst ASINH = CHECK_NAN_SNIPPET + `return log(x + sqrt(x * x + 1.0));`;\nexport const asinh = unaryKernelFunc({ opSnippet: ASINH });\nexport const asinhConfig = {\n kernelName: Asinh,\n backendName: 'webgl',\n kernelFunc: asinh,\n};\n//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiQXNpbmguanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi8uLi90ZmpzLWJhY2tlbmQtd2ViZ2wvc3JjL2tlcm5lbHMvQXNpbmgudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUE7Ozs7Ozs7Ozs7Ozs7OztHQWVHO0FBRUgsT0FBTyxFQUFDLEtBQUssRUFBZSxNQUFNLHVCQUF1QixDQUFDO0FBRTFELE9BQU8sRUFBQyxlQUFlLEVBQUMsTUFBTSxvQ0FBb0MsQ0FBQztBQUNuRSxPQUFPLEVBQUMsaUJBQWlCLEVBQUMsTUFBTSxnQkFBZ0IsQ0FBQztBQUVqRCxNQUFNLEtBQUssR0FBRyxpQkFBaUIsR0FBRyxvQ0FBb0MsQ0FBQztBQUV2RSxNQUFNLENBQUMsTUFBTSxLQUFLLEdBQUcsZUFBZSxDQUFDLEVBQUMsU0FBUyxFQUFFLEtBQUssRUFBQyxDQUFDLENBQUM7QUFFekQsTUFBTSxDQUFDLE1BQU0sV0FBVyxHQUFpQjtJQUN2QyxVQUFVLEVBQUUsS0FBSztJQUNqQixXQUFXLEVBQUUsT0FBTztJQUNwQixVQUFVLEVBQUUsS0FBSztDQUNsQixDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiLyoqXG4gKiBAbGljZW5zZVxuICogQ29weXJpZ2h0IDIwMjAgR29vZ2xlIExMQy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC5cbiAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSBcIkxpY2Vuc2VcIik7XG4gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuXG4gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXRcbiAqXG4gKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjBcbiAqXG4gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlXG4gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiBcIkFTIElTXCIgQkFTSVMsXG4gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC5cbiAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmRcbiAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLlxuICogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbiAqL1xuXG5pbXBvcnQge0FzaW5oLCBLZXJuZWxDb25maWd9IGZyb20gJ0B0ZW5zb3JmbG93L3RmanMtY29yZSc7XG5cbmltcG9ydCB7dW5hcnlLZXJuZWxGdW5jfSBmcm9tICcuLi9rZXJuZWxfdXRpbHMva2VybmVsX2Z1bmNzX3V0aWxzJztcbmltcG9ydCB7Q0hFQ0tfTkFOX1NOSVBQRVR9IGZyb20gJy4uL3VuYXJ5b3BfZ3B1JztcblxuY29uc3QgQVNJTkggPSBDSEVDS19OQU5fU05JUFBFVCArIGByZXR1cm4gbG9nKHggKyBzcXJ0KHggKiB4ICsgMS4wKSk7YDtcblxuZXhwb3J0IGNvbnN0IGFzaW5oID0gdW5hcnlLZXJuZWxGdW5jKHtvcFNuaXBwZXQ6IEFTSU5IfSk7XG5cbmV4cG9ydCBjb25zdCBhc2luaENvbmZpZzogS2VybmVsQ29uZmlnID0ge1xuICBrZXJuZWxOYW1lOiBBc2luaCxcbiAgYmFja2VuZE5hbWU6ICd3ZWJnbCcsXG4gIGtlcm5lbEZ1bmM6IGFzaW5oLFxufTtcbiJdfQ==","/**\n * @license\n * Copyright 2020 Google LLC. All Rights Reserved.\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n * =============================================================================\n */\nimport { Atan } from '@tensorflow/tfjs-core';\nimport { unaryKernelFunc } from '../kernel_utils/kernel_funcs_utils';\nimport { CHECK_NAN_SNIPPET } from '../unaryop_gpu';\nconst ATAN = CHECK_NAN_SNIPPET + `\n return atan(x);\n`;\nexport const atan = unaryKernelFunc({ opSnippet: ATAN });\nexport const atanConfig = {\n kernelName: Atan,\n backendName: 'webgl',\n kernelFunc: atan,\n};\n//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiQXRhbi5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uLy4uL3RmanMtYmFja2VuZC13ZWJnbC9zcmMva2VybmVscy9BdGFuLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBOzs7Ozs7Ozs7Ozs7Ozs7R0FlRztBQUVILE9BQU8sRUFBQyxJQUFJLEVBQWUsTUFBTSx1QkFBdUIsQ0FBQztBQUV6RCxPQUFPLEVBQUMsZUFBZSxFQUFDLE1BQU0sb0NBQW9DLENBQUM7QUFDbkUsT0FBTyxFQUFDLGlCQUFpQixFQUFDLE1BQU0sZ0JBQWdCLENBQUM7QUFFakQsTUFBTSxJQUFJLEdBQUcsaUJBQWlCLEdBQUc7O0NBRWhDLENBQUM7QUFFRixNQUFNLENBQUMsTUFBTSxJQUFJLEdBQUcsZUFBZSxDQUFDLEVBQUMsU0FBUyxFQUFFLElBQUksRUFBQyxDQUFDLENBQUM7QUFFdkQsTUFBTSxDQUFDLE1BQU0sVUFBVSxHQUFpQjtJQUN0QyxVQUFVLEVBQUUsSUFBSTtJQUNoQixXQUFXLEVBQUUsT0FBTztJQUNwQixVQUFVLEVBQUUsSUFBSTtDQUNqQixDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiLyoqXG4gKiBAbGljZW5zZVxuICogQ29weXJpZ2h0IDIwMjAgR29vZ2xlIExMQy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC5cbiAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSBcIkxpY2Vuc2VcIik7XG4gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuXG4gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXRcbiAqXG4gKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjBcbiAqXG4gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlXG4gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiBcIkFTIElTXCIgQkFTSVMsXG4gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC5cbiAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmRcbiAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLlxuICogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbiAqL1xuXG5pbXBvcnQge0F0YW4sIEtlcm5lbENvbmZpZ30gZnJvbSAnQHRlbnNvcmZsb3cvdGZqcy1jb3JlJztcblxuaW1wb3J0IHt1bmFyeUtlcm5lbEZ1bmN9IGZyb20gJy4uL2tlcm5lbF91dGlscy9rZXJuZWxfZnVuY3NfdXRpbHMnO1xuaW1wb3J0IHtDSEVDS19OQU5fU05JUFBFVH0gZnJvbSAnLi4vdW5hcnlvcF9ncHUnO1xuXG5jb25zdCBBVEFOID0gQ0hFQ0tfTkFOX1NOSVBQRVQgKyBgXG4gIHJldHVybiBhdGFuKHgpO1xuYDtcblxuZXhwb3J0IGNvbnN0IGF0YW4gPSB1bmFyeUtlcm5lbEZ1bmMoe29wU25pcHBldDogQVRBTn0pO1xuXG5leHBvcnQgY29uc3QgYXRhbkNvbmZpZzogS2VybmVsQ29uZmlnID0ge1xuICBrZXJuZWxOYW1lOiBBdGFuLFxuICBiYWNrZW5kTmFtZTogJ3dlYmdsJyxcbiAga2VybmVsRnVuYzogYXRhbixcbn07XG4iXX0=","/**\n * @license\n * Copyright 2020 Google LLC. All Rights Reserved.\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n * =============================================================================\n */\nimport { Atan2 } from '@tensorflow/tfjs-core';\nimport { CHECK_NAN_SNIPPET } from '../binaryop_gpu';\nimport { CHECK_NAN_SNIPPET_PACKED } from '../binaryop_packed_gpu';\nimport { binaryKernelFunc } from '../kernel_utils/kernel_funcs_utils';\nconst ATAN2 = CHECK_NAN_SNIPPET + `\n return atan(a, b);\n`;\nconst ATAN2_PACKED = `\n vec4 result = atan(a, b);\n bvec4 isNaNA = isnan(a);\n bvec4 isNaNB = isnan(b);\n bvec4 isNaN = bvec4(isNaNA.x || isNaNB.x, isNaNA.y || isNaNB.y, isNaNA.z || isNaNB.z, isNaNA.w || isNaNB.w);\n ` +\n CHECK_NAN_SNIPPET_PACKED + `\n return result;\n`;\nexport const atan2 = binaryKernelFunc({ opSnippet: ATAN2, packedOpSnippet: ATAN2_PACKED });\nexport const atan2Config = {\n kernelName: Atan2,\n backendName: 'webgl',\n kernelFunc: atan2,\n};\n//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiQXRhbjIuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi8uLi90ZmpzLWJhY2tlbmQtd2ViZ2wvc3JjL2tlcm5lbHMvQXRhbjIudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUE7Ozs7Ozs7Ozs7Ozs7OztHQWVHO0FBRUgsT0FBTyxFQUFDLEtBQUssRUFBQyxNQUFNLHVCQUF1QixDQUFDO0FBRTVDLE9BQU8sRUFBQyxpQkFBaUIsRUFBQyxNQUFNLGlCQUFpQixDQUFDO0FBQ2xELE9BQU8sRUFBQyx3QkFBd0IsRUFBQyxNQUFNLHdCQUF3QixDQUFDO0FBQ2hFLE9BQU8sRUFBQyxnQkFBZ0IsRUFBQyxNQUFNLG9DQUFvQyxDQUFDO0FBRXBFLE1BQU0sS0FBSyxHQUFHLGlCQUFpQixHQUFHOztDQUVqQyxDQUFDO0FBRUYsTUFBTSxZQUFZLEdBQUc7Ozs7O0dBS2xCO0lBQ0Msd0JBQXdCLEdBQUc7O0NBRTlCLENBQUM7QUFFRixNQUFNLENBQUMsTUFBTSxLQUFLLEdBQ2QsZ0JBQWdCLENBQUMsRUFBQyxTQUFTLEVBQUUsS0FBSyxFQUFFLGVBQWUsRUFBRSxZQUFZLEVBQUMsQ0FBQyxDQUFDO0FBRXhFLE1BQU0sQ0FBQyxNQUFNLFdBQVcsR0FBaUI7SUFDdkMsVUFBVSxFQUFFLEtBQUs7SUFDakIsV0FBVyxFQUFFLE9BQU87SUFDcEIsVUFBVSxFQUFFLEtBQUs7Q0FDbEIsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbIi8qKlxuICogQGxpY2Vuc2VcbiAqIENvcHlyaWdodCAyMDIwIEdvb2dsZSBMTEMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuXG4gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgXCJMaWNlbnNlXCIpO1xuICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLlxuICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0XG4gKlxuICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wXG4gKlxuICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZVxuICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gXCJBUyBJU1wiIEJBU0lTLFxuICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuXG4gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kXG4gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS5cbiAqID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4gKi9cblxuaW1wb3J0IHtBdGFuMn0gZnJvbSAnQHRlbnNvcmZsb3cvdGZqcy1jb3JlJztcbmltcG9ydCB7S2VybmVsQ29uZmlnfSBmcm9tICdAdGVuc29yZmxvdy90ZmpzLWNvcmUnO1xuaW1wb3J0IHtDSEVDS19OQU5fU05JUFBFVH0gZnJvbSAnLi4vYmluYXJ5b3BfZ3B1JztcbmltcG9ydCB7Q0hFQ0tfTkFOX1NOSVBQRVRfUEFDS0VEfSBmcm9tICcuLi9iaW5hcnlvcF9wYWNrZWRfZ3B1JztcbmltcG9ydCB7YmluYXJ5S2VybmVsRnVuY30gZnJvbSAnLi4va2VybmVsX3V0aWxzL2tlcm5lbF9mdW5jc191dGlscyc7XG5cbmNvbnN0IEFUQU4yID0gQ0hFQ0tfTkFOX1NOSVBQRVQgKyBgXG4gIHJldHVybiBhdGFuKGEsIGIpO1xuYDtcblxuY29uc3QgQVRBTjJfUEFDS0VEID0gYFxuICB2ZWM0IHJlc3VsdCA9IGF0YW4oYSwgYik7XG4gIGJ2ZWM0IGlzTmFOQSA9IGlzbmFuKGEpO1xuICBidmVjNCBpc05hTkIgPSBpc25hbihiKTtcbiAgYnZlYzQgaXNOYU4gPSBidmVjNChpc05hTkEueCB8fCBpc05hTkIueCwgaXNOYU5BLnkgfHwgaXNOYU5CLnksIGlzTmFOQS56IHx8IGlzTmFOQi56LCBpc05hTkEudyB8fCBpc05hTkIudyk7XG4gIGAgK1xuICAgIENIRUNLX05BTl9TTklQUEVUX1BBQ0tFRCArIGBcbiAgcmV0dXJuIHJlc3VsdDtcbmA7XG5cbmV4cG9ydCBjb25zdCBhdGFuMiA9XG4gICAgYmluYXJ5S2VybmVsRnVuYyh7b3BTbmlwcGV0OiBBVEFOMiwgcGFja2VkT3BTbmlwcGV0OiBBVEFOMl9QQUNLRUR9KTtcblxuZXhwb3J0IGNvbnN0IGF0YW4yQ29uZmlnOiBLZXJuZWxDb25maWcgPSB7XG4gIGtlcm5lbE5hbWU6IEF0YW4yLFxuICBiYWNrZW5kTmFtZTogJ3dlYmdsJyxcbiAga2VybmVsRnVuYzogYXRhbjIsXG59O1xuIl19","/**\n * @license\n * Copyright 2020 Google LLC. All Rights Reserved.\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n * =============================================================================\n */\nimport { Atanh } from '@tensorflow/tfjs-core';\nimport { unaryKernelFunc } from '../kernel_utils/kernel_funcs_utils';\nimport { CHECK_NAN_SNIPPET } from '../unaryop_gpu';\nconst ATANH = CHECK_NAN_SNIPPET + `\n if ((x < -1.0) || (x > 1.0)) return NAN;\nreturn (log(1.0 + x) - log(1.0 - x)) / 2.0;`;\nexport const atanh = unaryKernelFunc({ opSnippet: ATANH });\nexport const atanhConfig = {\n kernelName: Atanh,\n backendName: 'webgl',\n kernelFunc: atanh,\n};\n//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiQXRhbmguanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi8uLi90ZmpzLWJhY2tlbmQtd2ViZ2wvc3JjL2tlcm5lbHMvQXRhbmgudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUE7Ozs7Ozs7Ozs7Ozs7OztHQWVHO0FBRUgsT0FBTyxFQUFDLEtBQUssRUFBZSxNQUFNLHVCQUF1QixDQUFDO0FBRTFELE9BQU8sRUFBQyxlQUFlLEVBQUMsTUFBTSxvQ0FBb0MsQ0FBQztBQUNuRSxPQUFPLEVBQUMsaUJBQWlCLEVBQUMsTUFBTSxnQkFBZ0IsQ0FBQztBQUVqRCxNQUFNLEtBQUssR0FBRyxpQkFBaUIsR0FBRzs7NENBRVUsQ0FBQztBQUU3QyxNQUFNLENBQUMsTUFBTSxLQUFLLEdBQUcsZUFBZSxDQUFDLEVBQUMsU0FBUyxFQUFFLEtBQUssRUFBQyxDQUFDLENBQUM7QUFFekQsTUFBTSxDQUFDLE1BQU0sV0FBVyxHQUFpQjtJQUN2QyxVQUFVLEVBQUUsS0FBSztJQUNqQixXQUFXLEVBQUUsT0FBTztJQUNwQixVQUFVLEVBQUUsS0FBSztDQUNsQixDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiLyoqXG4gKiBAbGljZW5zZVxuICogQ29weXJpZ2h0IDIwMjAgR29vZ2xlIExMQy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC5cbiAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSBcIkxpY2Vuc2VcIik7XG4gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuXG4gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXRcbiAqXG4gKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjBcbiAqXG4gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlXG4gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiBcIkFTIElTXCIgQkFTSVMsXG4gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC5cbiAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmRcbiAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLlxuICogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbiAqL1xuXG5pbXBvcnQge0F0YW5oLCBLZXJuZWxDb25maWd9IGZyb20gJ0B0ZW5zb3JmbG93L3RmanMtY29yZSc7XG5cbmltcG9ydCB7dW5hcnlLZXJuZWxGdW5jfSBmcm9tICcuLi9rZXJuZWxfdXRpbHMva2VybmVsX2Z1bmNzX3V0aWxzJztcbmltcG9ydCB7Q0hFQ0tfTkFOX1NOSVBQRVR9IGZyb20gJy4uL3VuYXJ5b3BfZ3B1JztcblxuY29uc3QgQVRBTkggPSBDSEVDS19OQU5fU05JUFBFVCArIGBcbiAgaWYgKCh4IDwgLTEuMCkgfHwgKHggPiAxLjApKSByZXR1cm4gTkFOO1xucmV0dXJuIChsb2coMS4wICsgeCkgLSBsb2coMS4wIC0geCkpIC8gMi4wO2A7XG5cbmV4cG9ydCBjb25zdCBhdGFuaCA9IHVuYXJ5S2VybmVsRnVuYyh7b3BTbmlwcGV0OiBBVEFOSH0pO1xuXG5leHBvcnQgY29uc3QgYXRhbmhDb25maWc6IEtlcm5lbENvbmZpZyA9IHtcbiAga2VybmVsTmFtZTogQXRhbmgsXG4gIGJhY2tlbmROYW1lOiAnd2ViZ2wnLFxuICBrZXJuZWxGdW5jOiBhdGFuaCxcbn07XG4iXX0=","/**\n * @license\n * Copyright 2017 Google LLC. All Rights Reserved.\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n * =============================================================================\n */\nexport class Pool2DProgram {\n constructor(convInfo, poolType, computePositions, flattenPositions = false, includeBatchInIndex = false) {\n this.variableNames = ['x'];\n if (poolType === 'avg' && computePositions) {\n throw new Error('Cannot compute positions for average pool.');\n }\n const filterWidth = convInfo.filterWidth;\n const strideHeight = convInfo.strideHeight;\n const strideWidth = convInfo.strideWidth;\n const dilationHeight = convInfo.dilationHeight;\n const dilationWidth = convInfo.dilationWidth;\n const effectiveFilterHeight = convInfo.effectiveFilterHeight;\n const effectiveFilterWidth = convInfo.effectiveFilterWidth;\n const padTop = convInfo.padInfo.top;\n const padLeft = convInfo.padInfo.left;\n this.outputShape = convInfo.outShape;\n const isAvgPool = poolType === 'avg';\n const batchFlattenPositionStr = `((batch * ${convInfo.inHeight} + xR) * ${convInfo.inWidth} + xC) * ${convInfo.inChannels} + d`;\n const flattenPositionStr = `(xR * ${convInfo.inWidth} + xC) * ${convInfo.inChannels} + d`;\n let initializationValue = '0.0';\n if (!isAvgPool) {\n // WebGL on Firefox Linux can't compile 1/0 so we do 1/eps.\n initializationValue = '-1.0 / 1e-20';\n }\n if (computePositions) {\n const compareOp = '>=';\n this.userCode = `\n const ivec2 strides = ivec2(${strideHeight}, ${strideWidth});\n const ivec2 pads = ivec2(${padTop}, ${padLeft});\n\n void main() {\n ivec4 coords = getOutputCoords();\n int batch = coords[0];\n int d = coords[3];\n\n ivec2 xRCCorner = coords.yz * strides - pads;\n int xRCorner = xRCCorner.x;\n int xCCorner = xRCCorner.y;\n\n // max/min x(?, ?, d) to get y(yR, yC, d).\n // ? = to be determined\n float minMaxValue = 0.0;\n float minMaxValueFound = 0.0;\n int minMaxPosition = 0;\n float avgValue = 0.0;\n\n for (int wR = 0; wR < ${effectiveFilterHeight};\n wR += ${dilationHeight}) {\n int xR = xRCorner + wR;\n\n if (xR < 0 || xR >= ${convInfo.inHeight}) {\n continue;\n }\n\n for (int wC = 0; wC < ${effectiveFilterWidth};\n wC += ${dilationWidth}) {\n int xC = xCCorner + wC;\n\n if (xC < 0 || xC >= ${convInfo.inWidth}) {\n continue;\n }\n\n float value = getX(batch, xR, xC, d);\n\n // If a min / max value has already been found, use it. If not,\n // use the current value.\n float currMinMaxValue = mix(\n value, minMaxValue, minMaxValueFound);\n if (value ${compareOp} currMinMaxValue) {\n minMaxValue = value;\n minMaxValueFound = 1.0;\n minMaxPosition = ${flattenPositions ? (includeBatchInIndex ? batchFlattenPositionStr :\n flattenPositionStr) :\n `wR * ${effectiveFilterWidth} + wC`};\n }\n }\n }\n setOutput(float(minMaxPosition));\n }\n `;\n return;\n }\n const compareOp = 'max';\n let returnValue = `${poolType}(${poolType}(${poolType}(` +\n 'minMaxValue[0], minMaxValue[1]), minMaxValue[2]), minMaxValue[3])';\n if (poolType === 'avg') {\n returnValue = `avgValue / count`;\n }\n const filterWidthNearestVec4 = Math.floor(filterWidth / 4) * 4;\n const filterWidthVec4Remainder = filterWidth % 4;\n const updateSnippet = `\n if (${isAvgPool}) {\n avgValue += dot(values, ones);\n } else {\n minMaxValue = ${compareOp}(values, minMaxValue);\n }\n `;\n this.userCode = `\n const ivec2 strides = ivec2(${strideHeight}, ${strideWidth});\n const ivec2 pads = ivec2(${padTop}, ${padLeft});\n const float initializationValue = ${initializationValue};\n const vec4 ones = vec4(1.0, 1.0, 1.0, 1.0);\n\n float count = 0.0;\n\n float getValue(int batch, int xR, int xC, int d) {\n if (xC < 0 || xC >= ${convInfo.inWidth}) {\n return initializationValue;\n }\n count += 1.0;\n return getX(batch, xR, xC, d);\n }\n\n void main() {\n ivec4 coords = getOutputCoords();\n int batch = coords[0];\n int d = coords[3];\n\n ivec2 xRCCorner = coords.yz * strides - pads;\n int xRCorner = xRCCorner.x;\n int xCCorner = xRCCorner.y;\n\n // max/min x(?, ?, d) to get y(yR, yC, d).\n // ? = to be determined\n vec4 minMaxValue = vec4(${initializationValue});\n float avgValue = 0.0;\n count = 0.0;\n\n for (int wR = 0; wR < ${effectiveFilterHeight};\n wR += ${dilationHeight}) {\n int xR = xRCorner + wR;\n\n if (xR < 0 || xR >= ${convInfo.inHeight}) {\n continue;\n }\n\n for (int wC = 0; wC < ${filterWidthNearestVec4}; wC += 4) {\n int xC = xCCorner + wC * ${dilationWidth};\n\n vec4 values = vec4(\n getValue(batch, xR, xC, d),\n getValue(batch, xR, xC + ${dilationWidth}, d),\n getValue(batch, xR, xC + 2 * ${dilationWidth}, d),\n getValue(batch, xR, xC + 3 * ${dilationWidth}, d)\n );\n\n ${updateSnippet}\n }\n\n int xC = xCCorner + ${filterWidthNearestVec4};\n if (${filterWidthVec4Remainder === 1}) {\n vec4 values = vec4(\n getValue(batch, xR, xC, d),\n initializationValue,\n initializationValue,\n initializationValue\n );\n\n ${updateSnippet}\n } else if (${filterWidthVec4Remainder === 2}) {\n vec4 values = vec4(\n getValue(batch, xR, xC, d),\n getValue(batch, xR, xC + ${dilationWidth}, d),\n initializationValue,\n initializationValue\n );\n\n ${updateSnippet}\n } else if (${filterWidthVec4Remainder === 3}) {\n vec4 values = vec4(\n getValue(batch, xR, xC, d),\n getValue(batch, xR, xC + ${dilationWidth}, d),\n getValue(batch, xR, xC + 2 * ${dilationWidth}, d),\n initializationValue\n );\n\n ${updateSnippet}\n }\n }\n setOutput(${returnValue});\n }\n `;\n }\n}\nexport class Pool3DProgram {\n constructor(convInfo, poolType, computePositions, flattenPositions = false, includeBatchInIndex = false) {\n this.variableNames = ['x'];\n if (poolType === 'avg' && computePositions) {\n throw new Error('Cannot compute positions for average pool.');\n }\n const filterWidth = convInfo.filterWidth;\n const strideDepth = convInfo.strideDepth;\n const strideHeight = convInfo.strideHeight;\n const strideWidth = convInfo.strideWidth;\n const dilationDepth = convInfo.dilationDepth;\n const dilationHeight = convInfo.dilationHeight;\n const dilationWidth = convInfo.dilationWidth;\n const effectiveFilterDepth = convInfo.effectiveFilterDepth;\n const effectiveFilterHeight = convInfo.effectiveFilterHeight;\n const effectiveFilterWidth = convInfo.effectiveFilterWidth;\n const padFront = convInfo.padInfo.front;\n const padTop = convInfo.padInfo.top;\n const padLeft = convInfo.padInfo.left;\n this.outputShape = convInfo.outShape;\n const isAvgPool = poolType === 'avg';\n let initializationValue = '0.0';\n if (!isAvgPool) {\n // WebGL on Firefox Linux can't compile 1/0 so we do 1/eps.\n initializationValue = '-1.0 / 1e-20';\n }\n if (computePositions) {\n const compareOp = '>=';\n this.userCode = `\n const ivec3 strides =\n ivec3(${strideDepth}, ${strideHeight}, ${strideWidth});\n const ivec3 pads = ivec3(${padFront}, ${padTop}, ${padLeft});\n\n void main() {\n ivec5 coords = getOutputCoords();\n int batch = coords.x;\n int ch = coords.u;\n\n ivec3 xCorner = ivec3(coords.y, coords.z, coords.w) * strides - pads;\n int xDCorner = xCorner.x;\n int xRCorner = xCorner.y;\n int xCCorner = xCorner.z;\n\n // max/min x(?, ?, ?, ch) to get y(yD, yR, yC, ch).\n // ? = to be determined\n float minMaxValue = 0.0;\n float minMaxValueFound = 0.0;\n int minMaxPosition = 0;\n\n for (int wD = 0; wD < ${effectiveFilterDepth};\n wD += ${dilationDepth}) {\n int xD = xDCorner + wD;\n\n if (xD < 0 || xD >= ${convInfo.inDepth}) {\n continue;\n }\n\n for (int wR = 0; wR < ${effectiveFilterHeight};\n wR += ${dilationHeight}) {\n int xR = xRCorner + wR;\n\n if (xR < 0 || xR >= ${convInfo.inHeight}) {\n continue;\n }\n\n for (int wC = 0; wC < ${effectiveFilterWidth};\n wC += ${dilationWidth}) {\n int xC = xCCorner + wC;\n\n if (xC < 0 || xC >= ${convInfo.inWidth}) {\n continue;\n }\n\n float value = getX(batch, xD, xR, xC, ch);\n\n // If a min / max value has already been found, use it. If not,\n // use the current value.\n float currMinMaxValue = mix(\n value, minMaxValue, minMaxValueFound);\n if (value ${compareOp} currMinMaxValue) {\n minMaxValue = value;\n minMaxValueFound = 1.0;\n minMaxPosition = ${flattenPositions ?\n (includeBatchInIndex ?\n `(((batch * ${convInfo.inDepth} + xD) * ${convInfo.inHeight} + xR) * ${convInfo.inWidth} + xC) * ${convInfo.inChannels} + ch` :\n `((xD * ${convInfo.inHeight} + xR) * ${convInfo.inWidth} + xC) * ${convInfo.inChannels} + ch`) :\n `wD * ${effectiveFilterHeight} * ${effectiveFilterWidth} +\n wR * ${effectiveFilterWidth} + wC`};\n }\n }\n }\n }\n setOutput(float(minMaxPosition));\n }\n `;\n return;\n }\n const compareOp = 'max';\n let returnValue = `${poolType}(${poolType}(${poolType}(` +\n 'minMaxValue[0], minMaxValue[1]), minMaxValue[2]), minMaxValue[3])';\n if (poolType === 'avg') {\n returnValue = `avgValue / count`;\n }\n const filterWidthNearestVec4 = Math.floor(filterWidth / 4) * 4;\n const filterWidthVec4Remainder = filterWidth % 4;\n const updateSnippet = `\n if (${isAvgPool}) {\n avgValue += dot(values, ones);\n } else {\n minMaxValue = ${compareOp}(values, minMaxValue);\n }\n `;\n this.userCode = `\n const ivec3 strides =\n ivec3(${strideDepth}, ${strideHeight}, ${strideWidth});\n const ivec3 pads = ivec3(${padFront}, ${padTop}, ${padLeft});\n const float initializationValue = ${initializationValue};\n const vec4 ones = vec4(1.0, 1.0, 1.0, 1.0);\n\n float count = 0.0;\n\n float getValue(int batch, int xD, int xR, int xC, int ch) {\n if (xC < 0 || xC >= ${convInfo.inWidth}) {\n return initializationValue;\n }\n count += 1.0;\n return getX(batch, xD, xR, xC, ch);\n }\n\n void main() {\n ivec5 coords = getOutputCoords();\n int batch = coords.x;\n int ch = coords.u;\n\n ivec3 xCorner = ivec3(coords.y, coords.z, coords.w) * strides - pads;\n int xDCorner = xCorner.x;\n int xRCorner = xCorner.y;\n int xCCorner = xCorner.z;\n\n // max/min x(?, ?, ?, d) to get y(yD, yR, yC, ch).\n // ? = to be determined\n vec4 minMaxValue = vec4(${initializationValue});\n float avgValue = 0.0;\n count = 0.0;\n\n for (int wD = 0; wD < ${effectiveFilterDepth};\n wD += ${dilationDepth}) {\n int xD = xDCorner + wD;\n\n if (xD < 0 || xD >= ${convInfo.inDepth}) {\n continue;\n }\n\n for (int wR = 0; wR < ${effectiveFilterHeight};\n wR += ${dilationHeight}) {\n int xR = xRCorner + wR;\n\n if (xR < 0 || xR >= ${convInfo.inHeight}) {\n continue;\n }\n\n for (int wC = 0; wC < ${filterWidthNearestVec4}; wC += 4) {\n int xC = xCCorner + wC * ${dilationWidth};\n\n vec4 values = vec4(\n getValue(batch, xD, xR, xC, ch),\n getValue(batch, xD, xR, xC + ${dilationWidth}, ch),\n getValue(batch, xD, xR, xC + 2 * ${dilationWidth}, ch),\n getValue(batch, xD, xR, xC + 3 * ${dilationWidth}, ch)\n );\n\n ${updateSnippet}\n }\n\n int xC = xCCorner + ${filterWidthNearestVec4};\n if (${filterWidthVec4Remainder === 1}) {\n vec4 values = vec4(\n getValue(batch, xD, xR, xC, ch),\n initializationValue,\n initializationValue,\n initializationValue\n );\n\n ${updateSnippet}\n } else if (${filterWidthVec4Remainder === 2}) {\n vec4 values = vec4(\n getValue(batch, xD, xR, xC, ch),\n getValue(batch, xD, xR, xC + ${dilationWidth}, ch),\n initializationValue,\n initializationValue\n );\n\n ${updateSnippet}\n } else if (${filterWidthVec4Remainder === 3}) {\n vec4 values = vec4(\n getValue(batch, xD, xR, xC, ch),\n getValue(batch, xD, xR, xC + ${dilationWidth}, ch),\n getValue(batch, xD, xR, xC + 2 * ${dilationWidth}, ch),\n initializationValue\n );\n\n ${updateSnippet}\n }\n }\n setOutput(${returnValue});\n }\n }\n `;\n }\n}\n//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicG9vbF9ncHUuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi90ZmpzLWJhY2tlbmQtd2ViZ2wvc3JjL3Bvb2xfZ3B1LnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBOzs7Ozs7Ozs7Ozs7Ozs7R0FlRztBQUtILE1BQU0sT0FBTyxhQUFhO0lBS3hCLFlBQ0ksUUFBaUMsRUFBRSxRQUFxQixFQUN4RCxnQkFBeUIsRUFBRSxnQkFBZ0IsR0FBRyxLQUFLLEVBQ25ELG1CQUFtQixHQUFHLEtBQUs7UUFQL0Isa0JBQWEsR0FBRyxDQUFDLEdBQUcsQ0FBQyxDQUFDO1FBUXBCLElBQUksUUFBUSxLQUFLLEtBQUssSUFBSSxnQkFBZ0IsRUFBRTtZQUMxQyxNQUFNLElBQUksS0FBSyxDQUFDLDRDQUE0QyxDQUFDLENBQUM7U0FDL0Q7UUFFRCxNQUFNLFdBQVcsR0FBRyxRQUFRLENBQUMsV0FBVyxDQUFDO1FBQ3pDLE1BQU0sWUFBWSxHQUFHLFFBQVEsQ0FBQyxZQUFZLENBQUM7UUFDM0MsTUFBTSxXQUFXLEdBQUcsUUFBUSxDQUFDLFdBQVcsQ0FBQztRQUN6QyxNQUFNLGNBQWMsR0FBRyxRQUFRLENBQUMsY0FBYyxDQUFDO1FBQy9DLE1BQU0sYUFBYSxHQUFHLFFBQVEsQ0FBQyxhQUFhLENBQUM7UUFDN0MsTUFBTSxxQkFBcUIsR0FBRyxRQUFRLENBQUMscUJBQXFCLENBQUM7UUFDN0QsTUFBTSxvQkFBb0IsR0FBRyxRQUFRLENBQUMsb0JBQW9CLENBQUM7UUFFM0QsTUFBTSxNQUFNLEdBQUcsUUFBUSxDQUFDLE9BQU8sQ0FBQyxHQUFHLENBQUM7UUFDcEMsTUFBTSxPQUFPLEdBQUcsUUFBUSxDQUFDLE9BQU8sQ0FBQyxJQUFJLENBQUM7UUFDdEMsSUFBSSxDQUFDLFdBQVcsR0FBRyxRQUFRLENBQUMsUUFBUSxDQUFDO1FBRXJDLE1BQU0sU0FBUyxHQUFHLFFBQVEsS0FBSyxLQUFLLENBQUM7UUFDckMsTUFBTSx1QkFBdUIsR0FB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QkFBbUI7Ozs7Ozs4QkFNL0IsUUFBUSxDQUFDLE9BQU87Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7a0NBbUJaLG1CQUFtQjs7OztnQ0FJckIsb0JBQW9CO29CQUNoQyxhQUFhOzs7Z0NBR0QsUUFBUSxDQUFDLE9BQU87Ozs7a0NBSWQscUJBQXFCO29CQUNuQyxjQUFjOzs7a0NBR0EsUUFBUSxDQUFDLFFBQVE7Ozs7b0NBSWYsc0JBQXNCO3lDQUNqQixhQUFhOzs7OytDQUlQLGFBQWE7bURBQ1QsYUFBYTttREFDYixhQUFhOzs7Z0JBR2hELGFBQWE7OztrQ0FHSyxzQkFBc0I7a0JBQ3RDLHdCQUF3QixLQUFLLENBQUM7Ozs7Ozs7O2dCQVFoQyxhQUFhO3lCQUNKLHdCQUF3QixLQUFLLENBQUM7OzsrQ0FHUixhQUFhOzs7OztnQkFLNUMsYUFBYTt5QkFDSix3QkFBd0IsS0FBSyxDQUFDOzs7K0NBR1IsYUFBYTttREFDVCxhQUFhOzs7O2dCQUloRCxhQUFhOzs7c0JBR1AsV0FBVzs7O0tBRzVCLENBQUM7SUFDSixDQUFDO0NBQ0YiLCJzb3VyY2VzQ29udGVudCI6WyIvKipcbiAqIEBsaWNlbnNlXG4gKiBDb3B5cmlnaHQgMjAxNyBHb29nbGUgTExDLiBBbGwgUmlnaHRzIFJlc2VydmVkLlxuICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlIFwiTGljZW5zZVwiKTtcbiAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS5cbiAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdFxuICpcbiAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMFxuICpcbiAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmVcbiAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuIFwiQVMgSVNcIiBCQVNJUyxcbiAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLlxuICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZFxuICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuXG4gKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuICovXG5cbmltcG9ydCB7YmFja2VuZF91dGlsfSBmcm9tICdAdGVuc29yZmxvdy90ZmpzLWNvcmUnO1xuaW1wb3J0IHtHUEdQVVByb2dyYW19IGZyb20gJy4vZ3BncHVfbWF0aCc7XG5cbmV4cG9ydCBjbGFzcyBQb29sMkRQcm9ncmFtIGltcGxlbWVudHMgR1BHUFVQcm9ncmFtIHtcbiAgdmFyaWFibGVOYW1lcyA9IFsneCddO1xuICBvdXRwdXRTaGFwZTogbnVtYmVyW107XG4gIHVzZXJDb2RlOiBzdHJpbmc7XG5cbiAgY29uc3RydWN0b3IoXG4gICAgICBjb252SW5mbzogYmFja2VuZF91dGlsLkNvbnYyREluZm8sIHBvb2xUeXBlOiAnbWF4J3wnYXZnJyxcbiAgICAgIGNvbXB1dGVQb3NpdGlvbnM6IGJvb2xlYW4sIGZsYXR0ZW5Qb3NpdGlvbnMgPSBmYWxzZSxcbiAgICAgIGluY2x1ZGVCYXRjaEluSW5kZXggPSBmYWxzZSkge1xuICAgIGlmIChwb29sVHlwZSA9PT0gJ2F2ZycgJiYgY29tcHV0ZVBvc2l0aW9ucykge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKCdDYW5ub3QgY29tcHV0ZSBwb3NpdGlvbnMgZm9yIGF2ZXJhZ2UgcG9vbC4nKTtcbiAgICB9XG5cbiAgICBjb25zdCBmaWx0ZXJXaWR0aCA9IGNvbnZJbmZvLmZpbHRlcldpZHRoO1xuICAgIGNvbnN0IHN0cmlkZUhlaWdodCA9IGNvbnZJbmZvLnN0cmlkZUhlaWdodDtcbiAgICBjb25zdCBzdHJpZGVXaWR0aCA9IGNvbnZJbmZvLnN0cmlkZVdpZHRoO1xuICAgIGNvbnN0IGRpbGF0aW9uSGVpZ2h0ID0gY29udkluZm8uZGlsYXRpb25IZWlnaHQ7XG4gICAgY29uc3QgZGlsYXRpb25XaWR0aCA9IGNvbnZJbmZvLmRpbGF0aW9uV2lkdGg7XG4gICAgY29uc3QgZWZmZWN0aXZlRmlsdGVySGVpZ2h0ID0gY29udkluZm8uZWZmZWN0aXZlRmlsdGVySGVpZ2h0O1xuICAgIGNvbnN0IGVmZmVjdGl2ZUZpbHRlcldpZHRoID0gY29udkluZm8uZWZmZWN0aXZlRmlsdGVyV2lkdGg7XG5cbiAgICBjb25zdCBwYWRUb3AgPSBjb252SW5mby5wYWRJbmZvLnRvcDtcbiAgICBjb25zdCBwYWRMZWZ0ID0gY29udkluZm8ucGFkSW5mby5sZWZ0O1xuICAgIHRoaXMub3V0cHV0U2hhcGUgPSBjb252SW5mby5vdXRTaGFwZTtcblxuICAgIGNvbnN0IGlzQXZnUG9vbCA9IHBvb2xUeXBlID09PSAnYXZnJztcbiAgICBjb25zdCBiYXRjaEZsYXR0ZW5Qb3NpdGlvblN0ciA9IGAoKGJhdGNoICAqICR7Y29udkluZm8uaW5IZWlnaHR9ICsgeFIpICogJHtcbiAgICAgICAgY29udkluZm8uaW5XaWR0aH0gKyB4QykgKiAke2NvbnZJbmZvLmluQ2hhbm5lbHN9ICsgZGA7XG4gICAgY29uc3QgZmxhdHRlblBvc2l0aW9uU3RyID1cbiAgICAgICAgYCh4UiAqICR7Y29udkluZm8uaW5XaWR0aH0gKyB4QykgKiAke2NvbnZJbmZvLmluQ2hhbm5lbHN9ICsgZGA7XG5cbiAgICBsZXQgaW5pdGlhbGl6YXRpb25WYWx1ZSA9ICcwLjAnO1xuICAgIGlmICghaXNBdmdQb29sKSB7XG4gICAgICAvLyBXZWJHTCBvbiBGaXJlZm94IExpbnV4IGNhbid0IGNvbXBpbGUgMS8wIHNvIHdlIGRvIDEvZXBzLlxuICAgICAgaW5pdGlhbGl6YXRpb25WYWx1ZSA9ICctMS4wIC8gMWUtMjAnO1xuICAgIH1cblxuICAgIGlmIChjb21wdXRlUG9zaXRpb25zKSB7XG4gICAgICBjb25zdCBjb21wYXJlT3AgPSAnPj0nO1xuXG4gICAgICB0aGlzLnVzZXJDb2RlID0gYFxuICAgICAgICBjb25zdCBpdmVjMiBzdHJpZGVzID0gaXZlYzIoJHtzdHJpZGVIZWlnaHR9LCAke3N0cmlkZVdpZHRofSk7XG4gICAgICAgIGNvbnN0IGl2ZWMyIHBhZHMgPSBpdmVjMigke3BhZFRvcH0sICR7cGFkTGVmdH0pO1xuXG4gICAgICAgIHZvaWQgbWFpbigpIHtcbiAgICAgICAgICBpdmVjNCBjb29yZHMgPSBnZXRPdXRwdXRDb29yZHMoKTtcbiAgICAgICAgICBpbnQgYmF0Y2ggPSBjb29yZHNbMF07XG4gICAgICAgICAgaW50IGQgPSBjb29yZHNbM107XG5cbiAgICAgICAgICBpdmVjMiB4UkNDb3JuZXIgPSBjb29yZHMueXogKiBzdHJpZGVzIC0gcGFkcztcbiAgICAgICAgICBpbnQgeFJDb3JuZXIgPSB4UkNDb3JuZXIueDtcbiAgICAgICAgICBpbnQgeENDb3JuZXIgPSB4UkNDb3JuZXIueTtcblxuICAgICAgICAgIC8vIG1heC9taW4geCg/LCA/LCBkKSB0byBnZXQgeSh5UiwgeUMsIGQpLlxuICAgICAgICAgIC8vID8gPSB0byBiZSBkZXRlcm1pbmVkXG4gICAgICAgICAgZmxvYXQgbWluTWF4VmFsdWUgPSAwLjA7XG4gICAgICAgICAgZmxvYXQgbWluTWF4VmFsdWVGb3VuZCA9IDAuMDtcbiAgICAgICAgICBpbnQgbWluTWF4UG9zaXRpb24gPSAwO1xuICAgICAgICAgIGZsb2F0IGF2Z1ZhbHVlID0gMC4wO1xuXG4gICAgICAgICAgZm9yIChpbnQgd1IgPSAwOyB3UiA8ICR7ZWZmZWN0aXZlRmlsdGVySGVpZ2h0fTtcbiAgICAgICAgICAgICAgd1IgKz0gJHtkaWxhdGlvbkhlaWdodH0pIHtcbiAgICAgICAgICAgIGludCB4UiA9IHhSQ29ybmVyICsgd1I7XG5cbiAgICAgICAgICAgIGlmICh4UiA8IDAgfHwgeFIgPj0gJHtjb252SW5mby5pbkhlaWdodH0pIHtcbiAgICAgICAgICAgICAgY29udGludWU7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIGZvciAoaW50IHdDID0gMDsgd0MgPCAke2VmZmVjdGl2ZUZpbHRlcldpZHRofTtcbiAgICAgICAgICAgICAgICB3QyArPSAke2RpbGF0aW9uV2lkdGh9KSB7XG4gICAgICAgICAgICAgIGludCB4QyA9IHhDQ29ybmVyICsgd0M7XG5cbiAgICAgICAgICAgICAgaWYgKHhDIDwgMCB8fCB4QyA+PSAke2NvbnZJbmZvLmluV2lkdGh9KSB7XG4gICAgICAgICAgICAgICAgY29udGludWU7XG4gICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICBmbG9hdCB2YWx1ZSA9IGdldFgoYmF0Y2gsIHhSLCB4QywgZCk7XG5cbiAgICAgICAgICAgICAgLy8gSWYgYSBtaW4gLyBtYXggdmFsdWUgaGFzIGFscmVhZHkgYmVlbiBmb3VuZCwgdXNlIGl0LiBJZiBub3QsXG4gICAgICAgICAgICAgIC8vIHVzZSB0aGUgY3VycmVudCB2YWx1ZS5cbiAgICAgICAgICAgICAgZmxvYXQgY3Vyck1pbk1heFZhbHVlID0gbWl4KFxuICAgICAgICAgICAgICAgICAgdmFsdWUsIG1pbk1heFZhbHVlLCBtaW5NYXhWYWx1ZUZvdW5kKTtcbiAgICAgICAgICAgICAgaWYgKHZhbHVlICR7Y29tcGFyZU9wfSBjdXJyTWluTWF4VmFsdWUpIHtcbiAgICAgICAgICAgICAgICBtaW5NYXhWYWx1ZSA9IHZhbHVlO1xuICAgICAgICAgICAgICAgIG1pbk1heFZhbHVlRm91bmQgPSAxLjA7XG4gICAgICAgICAgICAgICAgbWluTWF4UG9zaXRpb24gPSAke1xuICAgICAgICAgIGZsYXR0ZW5Qb3NpdGlvbnMgPyAoaW5jbHVkZUJhdGNoSW5JbmRleCA/IGJhdGNoRmxhdHRlblBvc2l0aW9uU3RyIDpcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmbGF0dGVuUG9zaXRpb25TdHIpIDpcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYHdSICogJHtlZmZlY3RpdmVGaWx0ZXJXaWR0aH0gKyB3Q2B9O1xuICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgICAgfVxuICAgICAgICAgIHNldE91dHB1dChmbG9hdChtaW5NYXhQb3NpdGlvbikpO1xuICAgICAgICB9XG4gICAgICBgO1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIGNvbnN0IGNvbXBhcmVPcCA9ICdtYXgnO1xuXG4gICAgbGV0IHJldHVyblZhbHVlID0gYCR7cG9vbFR5cGV9KCR7cG9vbFR5cGV9KCR7cG9vbFR5cGV9KGAgK1xuICAgICAgICAnbWluTWF4VmFsdWVbMF0sIG1pbk1heFZhbHVlWzFdKSwgbWluTWF4VmFsdWVbMl0pLCBtaW5NYXhWYWx1ZVszXSknO1xuICAgIGlmIChwb29sVHlwZSA9PT0gJ2F2ZycpIHtcbiAgICAgIHJldHVyblZhbHVlID0gYGF2Z1ZhbHVlIC8gY291bnRgO1xuICAgIH1cblxuICAgIGNvbnN0IGZpbHRlcldpZHRoTmVhcmVzdFZlYzQgPSBNYXRoLmZsb29yKGZpbHRlcldpZHRoIC8gNCkgKiA0O1xuICAgIGNvbnN0IGZpbHRlcldpZHRoVmVjNFJlbWFpbmRlciA9IGZpbHRlcldpZHRoICUgNDtcblxuICAgIGNvbnN0IHVwZGF0ZVNuaXBwZXQgPSBgXG4gICAgICBpZiAoJHtpc0F2Z1Bvb2x9KSB7XG4gICAgICAgIGF2Z1ZhbHVlICs9IGRvdCh2YWx1ZXMsIG9uZXMpO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgbWluTWF4VmFsdWUgPSAke2NvbXBhcmVPcH0odmFsdWVzLCBtaW5NYXhWYWx1ZSk7XG4gICAgICB9XG4gICAgYDtcblxuICAgIHRoaXMudXNlckNvZGUgPSBgXG4gICAgICBjb25zdCBpdmVjMiBzdHJpZGVzID0gaXZlYzIoJHtzdHJpZGVIZWlnaHR9LCAke3N0cmlkZVdpZHRofSk7XG4gICAgICBjb25zdCBpdmVjMiBwYWRzID0gaXZlYzIoJHtwYWRUb3B9LCAke3BhZExlZnR9KTtcbiAgICAgIGNvbnN0IGZsb2F0IGluaXRpYWxpemF0aW9uVmFsdWUgPSAke2luaXRpYWxpemF0aW9uVmFsdWV9O1xuICAgICAgY29uc3QgdmVjNCBvbmVzID0gdmVjNCgxLjAsIDEuMCwgMS4wLCAxLjApO1xuXG4gICAgICBmbG9hdCBjb3VudCA9IDAuMDtcblxuICAgICAgZmxvYXQgZ2V0VmFsdWUoaW50IGJhdGNoLCBpbnQgeFIsIGludCB4QywgaW50IGQpIHtcbiAgICAgICAgaWYgKHhDIDwgMCB8fCB4QyA+PSAke2NvbnZJbmZvLmluV2lkdGh9KSB7XG4gICAgICAgICAgcmV0dXJuIGluaXRpYWxpemF0aW9uVmFsdWU7XG4gICAgICAgIH1cbiAgICAgICAgY291bnQgKz0gMS4wO1xuICAgICAgICByZXR1cm4gZ2V0WChiYXRjaCwgeFIsIHhDLCBkKTtcbiAgICAgIH1cblxuICAgICAgdm9pZCBtYWluKCkge1xuICAgICAgICBpdmVjNCBjb29yZHMgPSBnZXRPdXRwdXRDb29yZHMoKTtcbiAgICAgICAgaW50IGJhdGNoID0gY29vcmRzWzBdO1xuICAgICAgICBpbnQgZCA9IGNvb3Jkc1szXTtcblxuICAgICAgICBpdmVjMiB4UkNDb3JuZXIgPSBjb29yZHMueXogKiBzdHJpZGVzIC0gcGFkcztcbiAgICAgICAgaW50IHhSQ29ybmVyID0geFJDQ29ybmVyLng7XG4gICAgICAgIGludCB4Q0Nvcm5lciA9IHhSQ0Nvcm5lci55O1xuXG4gICAgICAgIC8vIG1heC9taW4geCg/LCA/LCBkKSB0byBnZXQgeSh5UiwgeUMsIGQpLlxuICAgICAgICAvLyA/ID0gdG8gYmUgZGV0ZXJtaW5lZFxuICAgICAgICB2ZWM0IG1pbk1heFZhbHVlID0gdmVjNCgke2luaXRpYWxpemF0aW9uVmFsdWV9KTtcbiAgICAgICAgZmxvYXQgYXZnVmFsdWUgPSAwLjA7XG4gICAgICAgIGNvdW50ID0gMC4wO1xuXG4gICAgICAgIGZvciAoaW50IHdSID0gMDsgd1IgPCAke2VmZmVjdGl2ZUZpbHRlckhlaWdodH07XG4gICAgICAgICAgICB3UiArPSAke2RpbGF0aW9uSGVpZ2h0fSkge1xuICAgICAgICAgIGludCB4UiA9IHhSQ29ybmVyICsgd1I7XG5cbiAgICAgICAgICBpZiAoeFIgPCAwIHx8IHhSID49ICR7Y29udkluZm8uaW5IZWlnaHR9KSB7XG4gICAgICAgICAgICBjb250aW51ZTtcbiAgICAgICAgICB9XG5cbiAgICAgICAgICBmb3IgKGludCB3QyA9IDA7IHdDIDwgJHtmaWx0ZXJXaWR0aE5lYXJlc3RWZWM0fTsgd0MgKz0gNCkge1xuICAgICAgICAgICAgaW50IHhDID0geENDb3JuZXIgKyB3QyAqICR7ZGlsYXRpb25XaWR0aH07XG5cbiAgICAgICAgICAgIHZlYzQgdmFsdWVzID0gdmVjNChcbiAgICAgICAgICAgICAgZ2V0VmFsdWUoYmF0Y2gsIHhSLCB4QywgZCksXG4gICAgICAgICAgICAgIGdldFZhbHVlKGJhdGNoLCB4UiwgeEMgKyAke2RpbGF0aW9uV2lkdGh9LCBkKSxcbiAgICAgICAgICAgICAgZ2V0VmFsdWUoYmF0Y2gsIHhSLCB4QyArIDIgKiAke2RpbGF0aW9uV2lkdGh9LCBkKSxcbiAgICAgICAgICAgICAgZ2V0VmFsdWUoYmF0Y2gsIHhSLCB4QyArIDMgKiAke2RpbGF0aW9uV2lkdGh9LCBkKVxuICAgICAgICAgICAgKTtcblxuICAgICAgICAgICAgJHt1cGRhdGVTbmlwcGV0fVxuICAgICAgICAgIH1cblxuICAgICAgICAgIGludCB4QyA9IHhDQ29ybmVyICsgJHtmaWx0ZXJXaWR0aE5lYXJlc3RWZWM0fTtcbiAgICAgICAgICBpZiAoJHtmaWx0ZXJXaWR0aFZlYzRSZW1haW5kZXIgPT09IDF9KSB7XG4gICAgICAgICAgICB2ZWM0IHZhbHVlcyA9IHZlYzQoXG4gICAgICAgICAgICAgIGdldFZhbHVlKGJhdGNoLCB4UiwgeEMsIGQpLFxuICAgICAgICAgICAgICBpbml0aWFsaXphdGlvblZhbHVlLFxuICAgICAgICAgICAgICBpbml0aWFsaXphdGlvblZhbHVlLFxuICAgICAgICAgICAgICBpbml0aWFsaXphdGlvblZhbHVlXG4gICAgICAgICAgICApO1xuXG4gICAgICAgICAgICAke3VwZGF0ZVNuaXBwZXR9XG4gICAgICAgICAgfSBlbHNlIGlmICgke2ZpbHRlcldpZHRoVmVjNFJlbWFpbmRlciA9PT0gMn0pIHtcbiAgICAgICAgICAgIHZlYzQgdmFsdWVzID0gdmVjNChcbiAgICAgICAgICAgICAgZ2V0VmFsdWUoYmF0Y2gsIHhSLCB4QywgZCksXG4gICAgICAgICAgICAgIGdldFZhbHVlKGJhdGNoLCB4UiwgeEMgKyAke2RpbGF0aW9uV2lkdGh9LCBkKSxcbiAgICAgICAgICAgICAgaW5pdGlhbGl6YXRpb25WYWx1ZSxcbiAgICAgICAgICAgICAgaW5pdGlhbGl6YXRpb25WYWx1ZVxuICAgICAgICAgICAgKTtcblxuICAgICAgICAgICAgJHt1cGRhdGVTbmlwcGV0fVxuICAgICAgICAgIH0gZWxzZSBpZiAoJHtmaWx0ZXJXaWR0aFZlYzRSZW1haW5kZXIgPT09IDN9KSB7XG4gICAgICAgICAgICB2ZWM0IHZhbHVlcyA9IHZlYzQoXG4gICAgICAgICAgICAgIGdldFZhbHVlKGJhdGNoLCB4UiwgeEMsIGQpLFxuICAgICAgICAgICAgICBnZXRWYWx1ZShiYXRjaCwgeFIsIHhDICsgJHtkaWxhdGlvbldpZHRofSwgZCksXG4gICAgICAgICAgICAgIGdldFZhbHVlKGJhdGNoLCB4UiwgeEMgKyAyICogJHtkaWxhdGlvbldpZHRofSwgZCksXG4gICAgICAgICAgICAgIGluaXRpYWxpemF0aW9uVmFsdWVcbiAgICAgICAgICAgICk7XG5cbiAgICAgICAgICAgICR7dXBkYXRlU25pcHBldH1cbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgc2V0T3V0cHV0KCR7cmV0dXJuVmFsdWV9KTtcbiAgICAgIH1cbiAgICBgO1xuICB9XG59XG5cbmV4cG9ydCBjbGFzcyBQb29sM0RQcm9ncmFtIGltcGxlbWVudHMgR1BHUFVQcm9ncmFtIHtcbiAgdmFyaWFibGVOYW1lcyA9IFsneCddO1xuICBvdXRwdXRTaGFwZTogbnVtYmVyW107XG4gIHVzZXJDb2RlOiBzdHJpbmc7XG5cbiAgY29uc3RydWN0b3IoXG4gICAgICBjb252SW5mbzogYmFja2VuZF91dGlsLkNvbnYzREluZm8sIHBvb2xUeXBlOiAnbWF4J3wnYXZnJyxcbiAgICAgIGNvbXB1dGVQb3NpdGlvbnM6IGJvb2xlYW4sIGZsYXR0ZW5Qb3NpdGlvbnMgPSBmYWxzZSxcbiAgICAgIGluY2x1ZGVCYXRjaEluSW5kZXggPSBmYWxzZSkge1xuICAgIGlmIChwb29sVHlwZSA9PT0gJ2F2ZycgJiYgY29tcHV0ZVBvc2l0aW9ucykge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKCdDYW5ub3QgY29tcHV0ZSBwb3NpdGlvbnMgZm9yIGF2ZXJhZ2UgcG9vbC4nKTtcbiAgICB9XG5cbiAgICBjb25zdCBmaWx0ZXJXaWR0aCA9IGNvbnZJbmZvLmZpbHRlcldpZHRoO1xuICAgIGNvbnN0IHN0cmlkZURlcHRoID0gY29udkluZm8uc3RyaWRlRGVwdGg7XG4gICAgY29uc3Qgc3RyaWRlSGVpZ2h0ID0gY29udkluZm8uc3RyaWRlSGVpZ2h0O1xuICAgIGNvbnN0IHN0cmlkZVdpZHRoID0gY29udkluZm8uc3RyaWRlV2lkdGg7XG4gICAgY29uc3QgZGlsYXRpb25EZXB0aCA9IGNvbnZJbmZvLmRpbGF0aW9uRGVwdGg7XG4gICAgY29uc3QgZGlsYXRpb25IZWlnaHQgPSBjb252SW5mby5kaWxhdGlvbkhlaWdodDtcbiAgICBjb25zdCBkaWxhdGlvbldpZHRoID0gY29udkluZm8uZGlsYXRpb25XaWR0aDtcbiAgICBjb25zdCBlZmZlY3RpdmVGaWx0ZXJEZXB0aCA9IGNvbnZJbmZvLmVmZmVjdGl2ZUZpbHRlckRlcHRoO1xuICAgIGNvbnN0IGVmZmVjdGl2ZUZpbHRlckhlaWdodCA9IGNvbnZJbmZvLmVmZmVjdGl2ZUZpbHRlckhlaWdodDtcbiAgICBjb25zdCBlZmZlY3RpdmVGaWx0ZXJXaWR0aCA9IGNvbnZJbmZvLmVmZmVjdGl2ZUZpbHRlcldpZHRoO1xuXG4gICAgY29uc3QgcGFkRnJvbnQgPSBjb252SW5mby5wYWRJbmZvLmZyb250O1xuICAgIGNvbnN0IHBhZFRvcCA9IGNvbnZJbmZvLnBhZEluZm8udG9wO1xuICAgIGNvbnN0IHBhZExlZnQgPSBjb252SW5mby5wYWRJbmZvLmxlZnQ7XG4gICAgdGhpcy5vdXRwdXRTaGFwZSA9IGNvbnZJbmZvLm91dFNoYXBlO1xuXG4gICAgY29uc3QgaXNBdmdQb29sID0gcG9vbFR5cGUgPT09ICdhdmcnO1xuXG4gICAgbGV0IGluaXRpYWxpemF0aW9uVmFsdWUgPSAnMC4wJztcbiAgICBpZiAoIWlzQXZnUG9vbCkge1xuICAgICAgLy8gV2ViR0wgb24gRmlyZWZveCBMaW51eCBjYW4ndCBjb21waWxlIDEvMCBzbyB3ZSBkbyAxL2Vwcy5cbiAgICAgIGluaXRpYWxpemF0aW9uVmFsdWUgPSAnLTEuMCAvIDFlLTIwJztcbiAgICB9XG5cbiAgICBpZiAoY29tcHV0ZVBvc2l0aW9ucykge1xuICAgICAgY29uc3QgY29tcGFyZU9wID0gJz49JztcblxuICAgICAgdGhpcy51c2VyQ29kZSA9IGBcbiAgICAgICAgY29uc3QgaXZlYzMgc3RyaWRlcyA9XG4gICAgICAgICAgICBpdmVjMygke3N0cmlkZURlcHRofSwgJHtzdHJpZGVIZWlnaHR9LCAke3N0cmlkZVdpZHRofSk7XG4gICAgICAgIGNvbnN0IGl2ZWMzIHBhZHMgPSBpdmVjMygke3BhZEZyb250fSwgJHtwYWRUb3B9LCAke3BhZExlZnR9KTtcblxuICAgICAgICB2b2lkIG1haW4oKSB7XG4gICAgICAgICAgaXZlYzUgY29vcmRzID0gZ2V0T3V0cHV0Q29vcmRzKCk7XG4gICAgICAgICAgaW50IGJhdGNoID0gY29vcmRzLng7XG4gICAgICAgICAgaW50IGNoID0gY29vcmRzLnU7XG5cbiAgICAgICAgICBpdmVjMyB4Q29ybmVyID0gaXZlYzMoY29vcmRzLnksIGNvb3Jkcy56LCBjb29yZHMudykgKiBzdHJpZGVzIC0gcGFkcztcbiAgICAgICAgICBpbnQgeERDb3JuZXIgPSB4Q29ybmVyLng7XG4gICAgICAgICAgaW50IHhSQ29ybmVyID0geENvcm5lci55O1xuICAgICAgICAgIGludCB4Q0Nvcm5lciA9IHhDb3JuZXIuejtcblxuICAgICAgICAgIC8vIG1heC9taW4geCg/LCA/LCA/LCBjaCkgdG8gZ2V0IHkoeUQsIHlSLCB5QywgY2gpLlxuICAgICAgICAgIC8vID8gPSB0byBiZSBkZXRlcm1pbmVkXG4gICAgICAgICAgZmxvYXQgbWluTWF4VmFsdWUgPSAwLjA7XG4gICAgICAgICAgZmxvYXQgbWluTWF4VmFsdWVGb3VuZCA9IDAuMDtcbiAgICAgICAgICBpbnQgbWluTWF4UG9zaXRpb24gPSAwO1xuXG4gICAgICAgICAgZm9yIChpbnQgd0QgPSAwOyB3RCA8ICR7ZWZmZWN0aXZlRmlsdGVyRGVwdGh9O1xuICAgICAgICAgICAgICB3RCArPSAke2RpbGF0aW9uRGVwdGh9KSB7XG4gICAgICAgICAgICBpbnQgeEQgPSB4RENvcm5lciArIHdEO1xuXG4gICAgICAgICAgICBpZiAoeEQgPCAwIHx8IHhEID49ICR7Y29udkluZm8uaW5EZXB0aH0pIHtcbiAgICAgICAgICAgICAgY29udGludWU7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIGZvciAoaW50IHdSID0gMDsgd1IgPCAke2VmZmVjdGl2ZUZpbHRlckhlaWdodH07XG4gICAgICAgICAgICAgICAgd1IgKz0gJHtkaWxhdGlvbkhlaWdodH0pIHtcbiAgICAgICAgICAgICAgaW50IHhSID0geFJDb3JuZXIgKyB3UjtcblxuICAgICAgICAgICAgICBpZiAoeFIgPCAwIHx8IHhSID49ICR7Y29udkluZm8uaW5IZWlnaHR9KSB7XG4gICAgICAgICAgICAgICAgY29udGludWU7XG4gICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICBmb3IgKGludCB3QyA9IDA7IHdDIDwgJHtlZmZlY3RpdmVGaWx0ZXJXaWR0aH07XG4gICAgICAgICAgICAgICAgICB3QyArPSAke2RpbGF0aW9uV2lkdGh9KSB7XG4gICAgICAgICAgICAgICAgaW50IHhDID0geENDb3JuZXIgKyB3QztcblxuICAgICAgICAgICAgICAgIGlmICh4QyA8IDAgfHwgeEMgPj0gJHtjb252SW5mby5pbldpZHRofSkge1xuICAgICAgICAgICAgICAgICAgY29udGludWU7XG4gICAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgICAgZmxvYXQgdmFsdWUgPSBnZXRYKGJhdGNoLCB4RCwgeFIsIHhDLCBjaCk7XG5cbiAgICAgICAgICAgICAgICAvLyBJZiBhIG1pbiAvIG1heCB2YWx1ZSBoYXMgYWxyZWFkeSBiZWVuIGZvdW5kLCB1c2UgaXQuIElmIG5vdCxcbiAgICAgICAgICAgICAgICAvLyB1c2UgdGhlIGN1cnJlbnQgdmFsdWUuXG4gICAgICAgICAgICAgICAgZmxvYXQgY3Vyck1pbk1heFZhbHVlID0gbWl4KFxuICAgICAgICAgICAgICAgICAgICB2YWx1ZSwgbWluTWF4VmFsdWUsIG1pbk1heFZhbHVlRm91bmQpO1xuICAgICAgICAgICAgICAgIGlmICh2YWx1ZSAke2NvbXBhcmVPcH0gY3Vyck1pbk1heFZhbHVlKSB7XG4gICAgICAgICAgICAgICAgICBtaW5NYXhWYWx1ZSA9IHZhbHVlO1xuICAgICAgICAgICAgICAgICAgbWluTWF4VmFsdWVGb3VuZCA9IDEuMDtcbiAgICAgICAgICAgICAgICAgIG1pbk1heFBvc2l0aW9uID0gJHtcbiAgICAgICAgICBmbGF0dGVuUG9zaXRpb25zID9cbiAgICAgICAgICAgICAgKGluY2x1ZGVCYXRjaEluSW5kZXggP1xuICAgICAgICAgICAgICAgICAgIGAoKChiYXRjaCAqICR7Y29udkluZm8uaW5EZXB0aH0gKyB4RCkgKiAke1xuICAgICAgICAgICAgICAgICAgICAgICBjb252SW5mby5pbkhlaWdodH0gKyB4UikgKiAke2NvbnZJbmZvLmluV2lkdGh9ICsgeEMpICogJHtcbiAgICAgICAgICAgICAgICAgICAgICAgY29udkluZm8uaW5DaGFubmVsc30gKyBjaGAgOlxuICAgICAgICAgICAgICAgICAgIGAoKHhEICogJHtjb252SW5mby5pbkhlaWdodH0gKyB4UikgKiAke1xuICAgICAgICAgICAgICAgICAgICAgICBjb252SW5mby5pbldpZHRofSArIHhDKSAqICR7Y29udkluZm8uaW5DaGFubmVsc30gKyBjaGApIDpcbiAgICAgICAgICAgICAgYHdEICogJHtlZmZlY3RpdmVGaWx0ZXJIZWlnaHR9ICogJHtlZmZlY3RpdmVGaWx0ZXJXaWR0aH0gK1xuICAgICAgICAgICAgICAgICAgICAgIHdSICogJHtlZmZlY3RpdmVGaWx0ZXJXaWR0aH0gKyB3Q2B9O1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICAgIH1cbiAgICAgICAgICBzZXRPdXRwdXQoZmxvYXQobWluTWF4UG9zaXRpb24pKTtcbiAgICAgICAgfVxuICAgICAgYDtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICBjb25zdCBjb21wYXJlT3AgPSAnbWF4JztcblxuICAgIGxldCByZXR1cm5WYWx1ZSA9IGAke3Bvb2xUeXBlfSgke3Bvb2xUeXBlfSgke3Bvb2xUeXBlfShgICtcbiAgICAgICAgJ21pbk1heFZhbHVlWzBdLCBtaW5NYXhWYWx1ZVsxXSksIG1pbk1heFZhbHVlWzJdKSwgbWluTWF4VmFsdWVbM10pJztcbiAgICBpZiAocG9vbFR5cGUgPT09ICdhdmcnKSB7XG4gICAgICByZXR1cm5WYWx1ZSA9IGBhdmdWYWx1ZSAvIGNvdW50YDtcbiAgICB9XG5cbiAgICBjb25zdCBmaWx0ZXJXaWR0aE5lYXJlc3RWZWM0ID0gTWF0aC5mbG9vcihmaWx0ZXJXaWR0aCAvIDQpICogNDtcbiAgICBjb25zdCBmaWx0ZXJXaWR0aFZlYzRSZW1haW5kZXIgPSBmaWx0ZXJXaWR0aCAlIDQ7XG5cbiAgICBjb25zdCB1cGRhdGVTbmlwcGV0ID0gYFxuICAgICAgaWYgKCR7aXNBdmdQb29sfSkge1xuICAgICAgICBhdmdWYWx1ZSArPSBkb3QodmFsdWVzLCBvbmVzKTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIG1pbk1heFZhbHVlID0gJHtjb21wYXJlT3B9KHZhbHVlcywgbWluTWF4VmFsdWUpO1xuICAgICAgfVxuICAgIGA7XG5cbiAgICB0aGlzLnVzZXJDb2RlID0gYFxuICAgICAgY29uc3QgaXZlYzMgc3RyaWRlcyA9XG4gICAgICAgIGl2ZWMzKCR7c3RyaWRlRGVwdGh9LCAke3N0cmlkZUhlaWdodH0sICR7c3RyaWRlV2lkdGh9KTtcbiAgICAgIGNvbnN0IGl2ZWMzIHBhZHMgPSBpdmVjMygke3BhZEZyb250fSwgJHtwYWRUb3B9LCAke3BhZExlZnR9KTtcbiAgICAgIGNvbnN0IGZsb2F0IGluaXRpYWxpemF0aW9uVmFsdWUgPSAke2luaXRpYWxpemF0aW9uVmFsdWV9O1xuICAgICAgY29uc3QgdmVjNCBvbmVzID0gdmVjNCgxLjAsIDEuMCwgMS4wLCAxLjApO1xuXG4gICAgICBmbG9hdCBjb3VudCA9IDAuMDtcblxuICAgICAgZmxvYXQgZ2V0VmFsdWUoaW50IGJhdGNoLCBpbnQgeEQsIGludCB4UiwgaW50IHhDLCBpbnQgY2gpIHtcbiAgICAgICAgaWYgKHhDIDwgMCB8fCB4QyA+PSAke2NvbnZJbmZvLmluV2lkdGh9KSB7XG4gICAgICAgICAgcmV0dXJuIGluaXRpYWxpemF0aW9uVmFsdWU7XG4gICAgICAgIH1cbiAgICAgICAgY291bnQgKz0gMS4wO1xuICAgICAgICByZXR1cm4gZ2V0WChiYXRjaCwgeEQsIHhSLCB4QywgY2gpO1xuICAgICAgfVxuXG4gICAgICB2b2lkIG1haW4oKSB7XG4gICAgICAgIGl2ZWM1IGNvb3JkcyA9IGdldE91dHB1dENvb3JkcygpO1xuICAgICAgICBpbnQgYmF0Y2ggPSBjb29yZHMueDtcbiAgICAgICAgaW50IGNoID0gY29vcmRzLnU7XG5cbiAgICAgICAgaXZlYzMgeENvcm5lciA9IGl2ZWMzKGNvb3Jkcy55LCBjb29yZHMueiwgY29vcmRzLncpICogc3RyaWRlcyAtIHBhZHM7XG4gICAgICAgIGludCB4RENvcm5lciA9IHhDb3JuZXIueDtcbiAgICAgICAgaW50IHhSQ29ybmVyID0geENvcm5lci55O1xuICAgICAgICBpbnQgeENDb3JuZXIgPSB4Q29ybmVyLno7XG5cbiAgICAgICAgLy8gbWF4L21pbiB4KD8sID8sID8sIGQpIHRvIGdldCB5KHlELCB5UiwgeUMsIGNoKS5cbiAgICAgICAgLy8gPyA9IHRvIGJlIGRldGVybWluZWRcbiAgICAgICAgdmVjNCBtaW5NYXhWYWx1ZSA9IHZlYzQoJHtpbml0aWFsaXphdGlvblZhbHVlfSk7XG4gICAgICAgIGZsb2F0IGF2Z1ZhbHVlID0gMC4wO1xuICAgICAgICBjb3VudCA9IDAuMDtcblxuICAgICAgICBmb3IgKGludCB3RCA9IDA7IHdEIDwgJHtlZmZlY3RpdmVGaWx0ZXJEZXB0aH07XG4gICAgICAgICAgICB3RCArPSAke2RpbGF0aW9uRGVwdGh9KSB7XG4gICAgICAgICAgaW50IHhEID0geERDb3JuZXIgKyB3RDtcblxuICAgICAgICAgIGlmICh4RCA8IDAgfHwgeEQgPj0gJHtjb252SW5mby5pbkRlcHRofSkge1xuICAgICAgICAgICAgY29udGludWU7XG4gICAgICAgICAgfVxuXG4gICAgICAgICAgZm9yIChpbnQgd1IgPSAwOyB3UiA8ICR7ZWZmZWN0aXZlRmlsdGVySGVpZ2h0fTtcbiAgICAgICAgICAgIHdSICs9ICR7ZGlsYXRpb25IZWlnaHR9KSB7XG4gICAgICAgICAgICBpbnQgeFIgPSB4UkNvcm5lciArIHdSO1xuXG4gICAgICAgICAgICBpZiAoeFIgPCAwIHx8IHhSID49ICR7Y29udkluZm8uaW5IZWlnaHR9KSB7XG4gICAgICAgICAgICAgIGNvbnRpbnVlO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBmb3IgKGludCB3QyA9IDA7IHdDIDwgJHtmaWx0ZXJXaWR0aE5lYXJlc3RWZWM0fTsgd0MgKz0gNCkge1xuICAgICAgICAgICAgICBpbnQgeEMgPSB4Q0Nvcm5lciArIHdDICogJHtkaWxhdGlvbldpZHRofTtcblxuICAgICAgICAgICAgICB2ZWM0IHZhbHVlcyA9IHZlYzQoXG4gICAgICAgICAgICAgICAgZ2V0VmFsdWUoYmF0Y2gsIHhELCB4UiwgeEMsIGNoKSxcbiAgICAgICAgICAgICAgICBnZXRWYWx1ZShiYXRjaCwgeEQsIHhSLCB4QyArICR7ZGlsYXRpb25XaWR0aH0sIGNoKSxcbiAgICAgICAgICAgICAgICBnZXRWYWx1ZShiYXRjaCwgeEQsIHhSLCB4QyArIDIgKiAke2RpbGF0aW9uV2lkdGh9LCBjaCksXG4gICAgICAgICAgICAgICAgZ2V0VmFsdWUoYmF0Y2gsIHhELCB4UiwgeEMgKyAzICogJHtkaWxhdGlvbldpZHRofSwgY2gpXG4gICAgICAgICAgICAgICk7XG5cbiAgICAgICAgICAgICAgJHt1cGRhdGVTbmlwcGV0fVxuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBpbnQgeEMgPSB4Q0Nvcm5lciArICR7ZmlsdGVyV2lkdGhOZWFyZXN0VmVjNH07XG4gICAgICAgICAgICBpZiAoJHtmaWx0ZXJXaWR0aFZlYzRSZW1haW5kZXIgPT09IDF9KSB7XG4gICAgICAgICAgICAgIHZlYzQgdmFsdWVzID0gdmVjNChcbiAgICAgICAgICAgICAgICBnZXRWYWx1ZShiYXRjaCwgeEQsIHhSLCB4QywgY2gpLFxuICAgICAgICAgICAgICAgIGluaXRpYWxpemF0aW9uVmFsdWUsXG4gICAgICAgICAgICAgICAgaW5pdGlhbGl6YXRpb25WYWx1ZSxcbiAgICAgICAgICAgICAgICBpbml0aWFsaXphdGlvblZhbHVlXG4gICAgICAgICAgICAgICk7XG5cbiAgICAgICAgICAgICAgJHt1cGRhdGVTbmlwcGV0fVxuICAgICAgICAgICAgfSBlbHNlIGlmICgke2ZpbHRlcldpZHRoVmVjNFJlbWFpbmRlciA9PT0gMn0pIHtcbiAgICAgICAgICAgICAgdmVjNCB2YWx1ZXMgPSB2ZWM0KFxuICAgICAgICAgICAgICAgIGdldFZhbHVlKGJhdGNoLCB4RCwgeFIsIHhDLCBjaCksXG4gICAgICAgICAgICAgICAgZ2V0VmFsdWUoYmF0Y2gsIHhELCB4UiwgeEMgKyAke2RpbGF0aW9uV2lkdGh9LCBjaCksXG4gICAgICAgICAgICAgICAgaW5pdGlhbGl6YXRpb25WYWx1ZSxcbiAgICAgICAgICAgICAgICBpbml0aWFsaXphdGlvblZhbHVlXG4gICAgICAgICAgICAgICk7XG5cbiAgICAgICAgICAgICAgJHt1cGRhdGVTbmlwcGV0fVxuICAgICAgICAgICAgfSBlbHNlIGlmICgke2ZpbHRlcldpZHRoVmVjNFJlbWFpbmRlciA9PT0gM30pIHtcbiAgICAgICAgICAgICAgdmVjNCB2YWx1ZXMgPSB2ZWM0KFxuICAgICAgICAgICAgICAgIGdldFZhbHVlKGJhdGNoLCB4RCwgeFIsIHhDLCBjaCksXG4gICAgICAgICAgICAgICAgZ2V0VmFsdWUoYmF0Y2gsIHhELCB4UiwgeEMgKyAke2RpbGF0aW9uV2lkdGh9LCBjaCksXG4gICAgICAgICAgICAgICAgZ2V0VmFsdWUoYmF0Y2gsIHhELCB4UiwgeEMgKyAyICogJHtkaWxhdGlvbldpZHRofSwgY2gpLFxuICAgICAgICAgICAgICAgIGluaXRpYWxpemF0aW9uVmFsdWVcbiAgICAgICAgICAgICAgKTtcblxuICAgICAgICAgICAgICAke3VwZGF0ZVNuaXBwZXR9XG4gICAgICAgICAgICB9XG4gICAgICAgICAgfVxuICAgICAgICAgIHNldE91dHB1dCgke3JldHVyblZhbHVlfSk7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICBgO1xuICB9XG59XG4iXX0=","/**\n * @license\n * Copyright 2020 Google LLC. All Rights Reserved.\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n * =============================================================================\n */\nimport { AvgPool, backend_util, util } from '@tensorflow/tfjs-core';\nimport { Pool2DProgram } from '../pool_gpu';\nimport { assertNotComplex } from '../webgl_util';\nimport { identity } from './Identity';\nexport function avgPool(args) {\n const { inputs, backend, attrs } = args;\n const { x } = inputs;\n assertNotComplex(x, 'avgPool');\n const { filterSize, strides, pad, dimRoundingMode } = attrs;\n const dilations = 1;\n util.assert(backend_util.eitherStridesOrDilationsAreOne(strides, dilations), () => 'Error in avgPool: Either strides or dilations must be 1. ' +\n `Got strides ${strides} and dilations '${dilations}'`);\n const convInfo = backend_util.computePool2DInfo(x.shape, filterSize, strides, dilations, pad, dimRoundingMode);\n if (convInfo.filterWidth === 1 && convInfo.filterHeight === 1 &&\n util.arraysEqual(convInfo.inShape, convInfo.outShape)) {\n return identity({ inputs: { x }, backend });\n }\n const avgPoolProgram = new Pool2DProgram(convInfo, 'avg', false);\n return backend.runWebGLProgram(avgPoolProgram, [x], 'float32');\n}\nexport const avgPoolConfig = {\n kernelName: AvgPool,\n backendName: 'webgl',\n kernelFunc: avgPool\n};\n//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiQXZnUG9vbC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uLy4uL3RmanMtYmFja2VuZC13ZWJnbC9zcmMva2VybmVscy9BdmdQb29sLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBOzs7Ozs7Ozs7Ozs7Ozs7R0FlRztBQUNILE9BQU8sRUFBQyxPQUFPLEVBQStCLFlBQVksRUFBd0MsSUFBSSxFQUFDLE1BQU0sdUJBQXVCLENBQUM7QUFHckksT0FBTyxFQUFDLGFBQWEsRUFBQyxNQUFNLGFBQWEsQ0FBQztBQUMxQyxPQUFPLEVBQUMsZ0JBQWdCLEVBQUMsTUFBTSxlQUFlLENBQUM7QUFDL0MsT0FBTyxFQUFDLFFBQVEsRUFBQyxNQUFNLFlBQVksQ0FBQztBQUVwQyxNQUFNLFVBQVUsT0FBTyxDQUFDLElBSXZCO0lBQ0MsTUFBTSxFQUFDLE1BQU0sRUFBRSxPQUFPLEVBQUUsS0FBSyxFQUFDLEdBQUcsSUFBSSxDQUFDO0lBQ3RDLE1BQU0sRUFBQyxDQUFDLEVBQUMsR0FBRyxNQUFNLENBQUM7SUFDbkIsZ0JBQWdCLENBQUMsQ0FBQyxFQUFFLFNBQVMsQ0FBQyxDQUFDO0lBQy9CLE1BQU0sRUFBQyxVQUFVLEVBQUUsT0FBTyxFQUFFLEdBQUcsRUFBRSxlQUFlLEVBQUMsR0FBRyxLQUFLLENBQUM7SUFDMUQsTUFBTSxTQUFTLEdBQUcsQ0FBQyxDQUFDO0lBRXBCLElBQUksQ0FBQyxNQUFNLENBQ1AsWUFBWSxDQUFDLDhCQUE4QixDQUFDLE9BQU8sRUFBRSxTQUFTLENBQUMsRUFDL0QsR0FBRyxFQUFFLENBQUMsMkRBQTJEO1FBQzdELGVBQWUsT0FBTyxtQkFBbUIsU0FBUyxHQUFHLENBQUMsQ0FBQztJQUUvRCxNQUFNLFFBQVEsR0FBRyxZQUFZLENBQUMsaUJBQWlCLENBQzNDLENBQUMsQ0FBQyxLQUF5QyxFQUFFLFVBQVUsRUFBRSxPQUFPLEVBQ2hFLFNBQVMsRUFBRSxHQUFHLEVBQUUsZUFBZSxDQUFDLENBQUM7SUFDckMsSUFBSSxRQUFRLENBQUMsV0FBVyxLQUFLLENBQUMsSUFBSSxRQUFRLENBQUMsWUFBWSxLQUFLLENBQUM7UUFDekQsSUFBSSxDQUFDLFdBQVcsQ0FBQyxRQUFRLENBQUMsT0FBTyxFQUFFLFFBQVEsQ0FBQyxRQUFRLENBQUMsRUFBRTtRQUN6RCxPQUFPLFFBQVEsQ0FBQyxFQUFDLE1BQU0sRUFBRSxFQUFDLENBQUMsRUFBQyxFQUFFLE9BQU8sRUFBQyxDQUFDLENBQUM7S0FDekM7SUFDRCxNQUFNLGNBQWMsR0FBRyxJQUFJLGFBQWEsQ0FBQyxRQUFRLEVBQUUsS0FBSyxFQUFFLEtBQUssQ0FBQyxDQUFDO0lBQ2pFLE9BQU8sT0FBTyxDQUFDLGVBQWUsQ0FBQyxjQUFjLEVBQUUsQ0FBQyxDQUFDLENBQUMsRUFBRSxTQUFTLENBQUMsQ0FBQztBQUNqRSxDQUFDO0FBRUQsTUFBTSxDQUFDLE1BQU0sYUFBYSxHQUFpQjtJQUN6QyxVQUFVLEVBQUUsT0FBTztJQUNuQixXQUFXLEVBQUUsT0FBTztJQUNwQixVQUFVLEVBQUUsT0FBMkI7Q0FDeEMsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbIi8qKlxuICogQGxpY2Vuc2VcbiAqIENvcHlyaWdodCAyMDIwIEdvb2dsZSBMTEMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuXG4gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgXCJMaWNlbnNlXCIpO1xuICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLlxuICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0XG4gKlxuICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wXG4gKlxuICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZVxuICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gXCJBUyBJU1wiIEJBU0lTLFxuICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuXG4gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kXG4gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS5cbiAqID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4gKi9cbmltcG9ydCB7QXZnUG9vbCwgQXZnUG9vbEF0dHJzLCBBdmdQb29sSW5wdXRzLCBiYWNrZW5kX3V0aWwsIEtlcm5lbENvbmZpZywgS2VybmVsRnVuYywgVGVuc29ySW5mbywgdXRpbH0gZnJvbSAnQHRlbnNvcmZsb3cvdGZqcy1jb3JlJztcblxuaW1wb3J0IHtNYXRoQmFja2VuZFdlYkdMfSBmcm9tICcuLi9iYWNrZW5kX3dlYmdsJztcbmltcG9ydCB7UG9vbDJEUHJvZ3JhbX0gZnJvbSAnLi4vcG9vbF9ncHUnO1xuaW1wb3J0IHthc3NlcnROb3RDb21wbGV4fSBmcm9tICcuLi93ZWJnbF91dGlsJztcbmltcG9ydCB7aWRlbnRpdHl9IGZyb20gJy4vSWRlbnRpdHknO1xuXG5leHBvcnQgZnVuY3Rpb24gYXZnUG9vbChhcmdzOiB7XG4gIGlucHV0czogQXZnUG9vbElucHV0cyxcbiAgYmFja2VuZDogTWF0aEJhY2tlbmRXZWJHTCxcbiAgYXR0cnM6IEF2Z1Bvb2xBdHRyc1xufSk6IFRlbnNvckluZm8ge1xuICBjb25zdCB7aW5wdXRzLCBiYWNrZW5kLCBhdHRyc30gPSBhcmdzO1xuICBjb25zdCB7eH0gPSBpbnB1dHM7XG4gIGFzc2VydE5vdENvbXBsZXgoeCwgJ2F2Z1Bvb2wnKTtcbiAgY29uc3Qge2ZpbHRlclNpemUsIHN0cmlkZXMsIHBhZCwgZGltUm91bmRpbmdNb2RlfSA9IGF0dHJzO1xuICBjb25zdCBkaWxhdGlvbnMgPSAxO1xuXG4gIHV0aWwuYXNzZXJ0KFxuICAgICAgYmFja2VuZF91dGlsLmVpdGhlclN0cmlkZXNPckRpbGF0aW9uc0FyZU9uZShzdHJpZGVzLCBkaWxhdGlvbnMpLFxuICAgICAgKCkgPT4gJ0Vycm9yIGluIGF2Z1Bvb2w6IEVpdGhlciBzdHJpZGVzIG9yIGRpbGF0aW9ucyBtdXN0IGJlIDEuICcgK1xuICAgICAgICAgIGBHb3Qgc3RyaWRlcyAke3N0cmlkZXN9IGFuZCBkaWxhdGlvbnMgJyR7ZGlsYXRpb25zfSdgKTtcblxuICBjb25zdCBjb252SW5mbyA9IGJhY2tlbmRfdXRpbC5jb21wdXRlUG9vbDJESW5mbyhcbiAgICAgIHguc2hhcGUgYXMgW251bWJlciwgbnVtYmVyLCBudW1iZXIsIG51bWJlcl0sIGZpbHRlclNpemUsIHN0cmlkZXMsXG4gICAgICBkaWxhdGlvbnMsIHBhZCwgZGltUm91bmRpbmdNb2RlKTtcbiAgaWYgKGNvbnZJbmZvLmZpbHRlcldpZHRoID09PSAxICYmIGNvbnZJbmZvLmZpbHRlckhlaWdodCA9PT0gMSAmJlxuICAgICAgdXRpbC5hcnJheXNFcXVhbChjb252SW5mby5pblNoYXBlLCBjb252SW5mby5vdXRTaGFwZSkpIHtcbiAgICByZXR1cm4gaWRlbnRpdHkoe2lucHV0czoge3h9LCBiYWNrZW5kfSk7XG4gIH1cbiAgY29uc3QgYXZnUG9vbFByb2dyYW0gPSBuZXcgUG9vbDJEUHJvZ3JhbShjb252SW5mbywgJ2F2ZycsIGZhbHNlKTtcbiAgcmV0dXJuIGJhY2tlbmQucnVuV2ViR0xQcm9ncmFtKGF2Z1Bvb2xQcm9ncmFtLCBbeF0sICdmbG9hdDMyJyk7XG59XG5cbmV4cG9ydCBjb25zdCBhdmdQb29sQ29uZmlnOiBLZXJuZWxDb25maWcgPSB7XG4gIGtlcm5lbE5hbWU6IEF2Z1Bvb2wsXG4gIGJhY2tlbmROYW1lOiAnd2ViZ2wnLFxuICBrZXJuZWxGdW5jOiBhdmdQb29sIGFzIHt9IGFzIEtlcm5lbEZ1bmNcbn07XG4iXX0=","/**\n * @license\n * Copyright 2020 Google LLC. All Rights Reserved.\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n * =============================================================================\n */\nimport { AvgPool3D, backend_util } from '@tensorflow/tfjs-core';\nimport { Pool3DProgram } from '../pool_gpu';\nexport function avgPool3D(args) {\n const { inputs, backend, attrs } = args;\n const { x } = inputs;\n const { filterSize, strides, pad, dimRoundingMode, dataFormat } = attrs;\n const dilations = [1, 1, 1];\n const convInfo = backend_util.computePool3DInfo(x.shape, filterSize, strides, dilations, pad, dimRoundingMode, dataFormat);\n const avgPoolProgram = new Pool3DProgram(convInfo, 'avg', false);\n return backend.runWebGLProgram(avgPoolProgram, [x], 'float32');\n}\nexport const avgPool3DConfig = {\n kernelName: AvgPool3D,\n backendName: 'webgl',\n kernelFunc: avgPool3D\n};\n//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiQXZnUG9vbDNELmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vLi4vdGZqcy1iYWNrZW5kLXdlYmdsL3NyYy9rZXJuZWxzL0F2Z1Bvb2wzRC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQTs7Ozs7Ozs7Ozs7Ozs7O0dBZUc7QUFDSCxPQUFPLEVBQUMsU0FBUyxFQUFtQyxZQUFZLEVBQXVDLE1BQU0sdUJBQXVCLENBQUM7QUFHckksT0FBTyxFQUFDLGFBQWEsRUFBQyxNQUFNLGFBQWEsQ0FBQztBQUUxQyxNQUFNLFVBQVUsU0FBUyxDQUFDLElBSXpCO0lBQ0MsTUFBTSxFQUFDLE1BQU0sRUFBRSxPQUFPLEVBQUUsS0FBSyxFQUFDLEdBQUcsSUFBSSxDQUFDO0lBQ3RDLE1BQU0sRUFBQyxDQUFDLEVBQUMsR0FBRyxNQUFNLENBQUM7SUFDbkIsTUFBTSxFQUFDLFVBQVUsRUFBRSxPQUFPLEVBQUUsR0FBRyxFQUFFLGVBQWUsRUFBRSxVQUFVLEVBQUMsR0FBRyxLQUFLLENBQUM7SUFDdEUsTUFBTSxTQUFTLEdBQTZCLENBQUMsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQztJQUV0RCxNQUFNLFFBQVEsR0FBRyxZQUFZLENBQUMsaUJBQWlCLENBQzNDLENBQUMsQ0FBQyxLQUFpRCxFQUFFLFVBQVUsRUFBRSxPQUFPLEVBQ3hFLFNBQVMsRUFBRSxHQUFHLEVBQUUsZUFBZSxFQUFFLFVBQVUsQ0FBQyxDQUFDO0lBQ2pELE1BQU0sY0FBYyxHQUFHLElBQUksYUFBYSxDQUFDLFFBQVEsRUFBRSxLQUFLLEVBQUUsS0FBSyxDQUFDLENBQUM7SUFDakUsT0FBTyxPQUFPLENBQUMsZUFBZSxDQUFDLGNBQWMsRUFBRSxDQUFDLENBQUMsQ0FBQyxFQUFFLFNBQVMsQ0FBQyxDQUFDO0FBQ2pFLENBQUM7QUFFRCxNQUFNLENBQUMsTUFBTSxlQUFlLEdBQWlCO0lBQzNDLFVBQVUsRUFBRSxTQUFTO0lBQ3JCLFdBQVcsRUFBRSxPQUFPO0lBQ3BCLFVBQVUsRUFBRSxTQUE2QjtDQUMxQyxDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiLyoqXG4gKiBAbGljZW5zZVxuICogQ29weXJpZ2h0IDIwMjAgR29vZ2xlIExMQy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC5cbiAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSBcIkxpY2Vuc2VcIik7XG4gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuXG4gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXRcbiAqXG4gKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjBcbiAqXG4gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlXG4gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiBcIkFTIElTXCIgQkFTSVMsXG4gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC5cbiAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmRcbiAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLlxuICogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbiAqL1xuaW1wb3J0IHtBdmdQb29sM0QsIEF2Z1Bvb2wzREF0dHJzLCBBdmdQb29sM0RJbnB1dHMsIGJhY2tlbmRfdXRpbCwgS2VybmVsQ29uZmlnLCBLZXJuZWxGdW5jLCBUZW5zb3JJbmZvfSBmcm9tICdAdGVuc29yZmxvdy90ZmpzLWNvcmUnO1xuXG5pbXBvcnQge01hdGhCYWNrZW5kV2ViR0x9IGZyb20gJy4uL2JhY2tlbmRfd2ViZ2wnO1xuaW1wb3J0IHtQb29sM0RQcm9ncmFtfSBmcm9tICcuLi9wb29sX2dwdSc7XG5cbmV4cG9ydCBmdW5jdGlvbiBhdmdQb29sM0QoYXJnczoge1xuICBpbnB1dHM6IEF2Z1Bvb2wzRElucHV0cyxcbiAgYmFja2VuZDogTWF0aEJhY2tlbmRXZWJHTCxcbiAgYXR0cnM6IEF2Z1Bvb2wzREF0dHJzXG59KTogVGVuc29ySW5mbyB7XG4gIGNvbnN0IHtpbnB1dHMsIGJhY2tlbmQsIGF0dHJzfSA9IGFyZ3M7XG4gIGNvbnN0IHt4fSA9IGlucHV0cztcbiAgY29uc3Qge2ZpbHRlclNpemUsIHN0cmlkZXMsIHBhZCwgZGltUm91bmRpbmdNb2RlLCBkYXRhRm9ybWF0fSA9IGF0dHJzO1xuICBjb25zdCBkaWxhdGlvbnM6IFtudW1iZXIsIG51bWJlciwgbnVtYmVyXSA9IFsxLCAxLCAxXTtcblxuICBjb25zdCBjb252SW5mbyA9IGJhY2tlbmRfdXRpbC5jb21wdXRlUG9vbDNESW5mbyhcbiAgICAgIHguc2hhcGUgYXMgW251bWJlciwgbnVtYmVyLCBudW1iZXIsIG51bWJlciwgbnVtYmVyXSwgZmlsdGVyU2l6ZSwgc3RyaWRlcyxcbiAgICAgIGRpbGF0aW9ucywgcGFkLCBkaW1Sb3VuZGluZ01vZGUsIGRhdGFGb3JtYXQpO1xuICBjb25zdCBhdmdQb29sUHJvZ3JhbSA9IG5ldyBQb29sM0RQcm9ncmFtKGNvbnZJbmZvLCAnYXZnJywgZmFsc2UpO1xuICByZXR1cm4gYmFja2VuZC5ydW5XZWJHTFByb2dyYW0oYXZnUG9vbFByb2dyYW0sIFt4XSwgJ2Zsb2F0MzInKTtcbn1cblxuZXhwb3J0IGNvbnN0IGF2Z1Bvb2wzRENvbmZpZzogS2VybmVsQ29uZmlnID0ge1xuICBrZXJuZWxOYW1lOiBBdmdQb29sM0QsXG4gIGJhY2tlbmROYW1lOiAnd2ViZ2wnLFxuICBrZXJuZWxGdW5jOiBhdmdQb29sM0QgYXMge30gYXMgS2VybmVsRnVuY1xufTtcbiJdfQ==","/**\n * @license\n * Copyright 2017 Google LLC. All Rights Reserved.\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n * =============================================================================\n */\nexport class AvgPool2DBackpropProgram {\n constructor(convInfo) {\n this.variableNames = ['dy'];\n this.outputShape = convInfo.inShape;\n const filterHeight = convInfo.filterHeight;\n const filterWidth = convInfo.filterWidth;\n const strideHeight = convInfo.strideHeight;\n const strideWidth = convInfo.strideWidth;\n const dilationHeight = convInfo.dilationHeight;\n const dilationWidth = convInfo.dilationWidth;\n const effectiveFilterHeight = convInfo.effectiveFilterHeight;\n const effectiveFilterWidth = convInfo.effectiveFilterWidth;\n const padTop = effectiveFilterHeight - 1 - convInfo.padInfo.top;\n const padLeft = effectiveFilterWidth - 1 - convInfo.padInfo.left;\n const avgMultiplier = 1 / (filterHeight * filterWidth);\n this.userCode = `\n const ivec2 pads = ivec2(${padTop}, ${padLeft});\n const float avgMultiplier = float(${avgMultiplier});\n\n void main() {\n ivec4 coords = getOutputCoords();\n int b = coords[0];\n int d = coords[3];\n\n ivec2 dyRCCorner = coords.yz - pads;\n int dyRCorner = dyRCCorner.x;\n int dyCCorner = dyRCCorner.y;\n\n // Convolve dy(?, ?, d) with pos mask(:, :, d) to get dx(xR, xC, d).\n // ? = to be determined. : = across all values in that axis.\n float dotProd = 0.0;\n for (int wR = 0; wR < ${effectiveFilterHeight};\n wR += ${dilationHeight}) {\n float dyR = float(dyRCorner + wR) / ${strideHeight}.0;\n\n if (dyR < 0.0 || dyR >= ${convInfo.outHeight}.0 || fract(dyR) > 0.0) {\n continue;\n }\n int idyR = int(dyR);\n\n for (int wC = 0; wC < ${effectiveFilterWidth};\n wC+= ${dilationWidth}) {\n float dyC = float(dyCCorner + wC) / ${strideWidth}.0;\n\n if (dyC < 0.0 || dyC >= ${convInfo.outWidth}.0 ||\n fract(dyC) > 0.0) {\n continue;\n }\n int idyC = int(dyC);\n\n float dyValue = getDy(b, idyR, idyC, d);\n\n dotProd += dyValue * avgMultiplier;\n }\n }\n setOutput(dotProd);\n }\n `;\n }\n}\nexport class AvgPool3DBackpropProgram {\n constructor(convInfo) {\n this.variableNames = ['dy'];\n this.outputShape = convInfo.inShape;\n const filterDepth = convInfo.filterDepth;\n const filterHeight = convInfo.filterHeight;\n const filterWidth = convInfo.filterWidth;\n const strideDepth = convInfo.strideDepth;\n const strideHeight = convInfo.strideHeight;\n const strideWidth = convInfo.strideWidth;\n const dilationDepth = convInfo.dilationDepth;\n const dilationHeight = convInfo.dilationHeight;\n const dilationWidth = convInfo.dilationWidth;\n const effectiveFilterDepth = convInfo.effectiveFilterDepth;\n const effectiveFilterHeight = convInfo.effectiveFilterHeight;\n const effectiveFilterWidth = convInfo.effectiveFilterWidth;\n const padFront = effectiveFilterDepth - 1 - convInfo.padInfo.front;\n const padTop = effectiveFilterHeight - 1 - convInfo.padInfo.top;\n const padLeft = effectiveFilterWidth - 1 - convInfo.padInfo.left;\n const avgMultiplier = 1 / (filterDepth * filterHeight * filterWidth);\n this.userCode = `\n const ivec3 pads = ivec3(${padFront}, ${padTop}, ${padLeft});\n const float avgMultiplier = float(${avgMultiplier});\n\n void main() {\n ivec5 coords = getOutputCoords();\n int batch = coords.x;\n int ch = coords.u;\n\n ivec3 dyCorner = ivec3(coords.y, coords.z, coords.w) - pads;\n int dyDCorner = dyCorner.x;\n int dyRCorner = dyCorner.y;\n int dyCCorner = dyCorner.z;\n\n // Convolve dy(?, ?, ?, d) with pos mask(:, :, :, ch) to get\n // dx(xD, xR, xC, ch).\n // ? = to be determined. : = across all values in that axis.\n float dotProd = 0.0;\n\n for (int wD = 0; wD < ${effectiveFilterDepth};\n wD += ${dilationDepth}) {\n float dyD = float(dyDCorner + wD) / ${strideDepth}.0;\n\n if (dyD < 0.0 || dyD >= ${convInfo.outDepth}.0 || fract(dyD) > 0.0) {\n continue;\n }\n int idyD = int(dyD);\n\n for (int wR = 0; wR < ${effectiveFilterHeight};\n wR += ${dilationHeight}) {\n float dyR = float(dyRCorner + wR) / ${strideHeight}.0;\n\n if (dyR < 0.0 || dyR >= ${convInfo.outHeight}.0 ||\n fract(dyR) > 0.0) {\n continue;\n }\n int idyR = int(dyR);\n\n for (int wC = 0; wC < ${effectiveFilterWidth};\n wC += ${dilationWidth}) {\n float dyC = float(dyCCorner + wC) / ${strideWidth}.0;\n\n if (dyC < 0.0 || dyC >= ${convInfo.outWidth}.0 ||\n fract(dyC) > 0.0) {\n continue;\n }\n int idyC = int(dyC);\n\n float dyValue = getDy(batch, idyD, idyR, idyC, ch);\n\n dotProd += dyValue * avgMultiplier;\n }\n }\n }\n setOutput(dotProd);\n }\n `;\n }\n}\n//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYXZnX3Bvb2xfYmFja3Byb3BfZ3B1LmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vdGZqcy1iYWNrZW5kLXdlYmdsL3NyYy9hdmdfcG9vbF9iYWNrcHJvcF9ncHUudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUE7Ozs7Ozs7Ozs7Ozs7OztHQWVHO0FBS0gsTUFBTSxPQUFPLHdCQUF3QjtJQUtuQyxZQUFZLFFBQWlDO1FBSjdDLGtCQUFhLEdBQUcsQ0FBQyxJQUFJLENBQUMsQ0FBQztRQUtyQixJQUFJLENBQUMsV0FBVyxHQUFHLFFBQVEsQ0FBQyxPQUFPLENBQUM7UUFDcEMsTUFBTSxZQUFZLEdBQUcsUUFBUSxDQUFDLFlBQVksQ0FBQztRQUMzQyxNQUFNLFdBQVcsR0FBRyxRQUFRLENBQUMsV0FBVyxDQUFDO1FBQ3pDLE1BQU0sWUFBWSxHQUFHLFFBQVEsQ0FBQyxZQUFZLENBQUM7UUFDM0MsTUFBTSxXQUFXLEdBQUcsUUFBUSxDQUFDLFdBQVcsQ0FBQztRQUN6QyxNQUFNLGNBQWMsR0FBRyxRQUFRLENBQUMsY0FBYyxDQUFDO1FBQy9DLE1BQU0sYUFBYSxHQUFHLFFBQVEsQ0FBQyxhQUFhLENBQUM7UUFDN0MsTUFBTSxxQkFBcUIsR0FBRyxRQUFRLENBQUMscUJBQXFCLENBQUM7UUFDN0QsTUFBTSxvQkFBb0IsR0FBRyxRQUFRLENBQUMsb0JBQW9CLENBQUM7UUFFM0QsTUFBTSxNQUFNLEdBQUcscUJBQXFCLEdBQUcsQ0FBQyxHQUFHLFFBQVEsQ0FBQyxPQUFPLENBQUMsR0FBRyxDQUFDO1FBQ2hFLE1BQU0sT0FBTyxHQUFHLG9CQUFvQixHQUFHLENBQUMsR0FBRyxRQUFRLENBQUMsT0FBTyxDQUFDLElBQUksQ0FBQztRQUVqRSxNQUFNLGFBQWEsR0FBRyxDQUFDLEdBQUcsQ0FBQyxZQUFZLEdBQUcsV0FBVyxDQUFDLENBQUM7UUFFdkQsSUFBSSxDQUFDLFFBQVEsR0FBRztpQ0FDYSxNQUFNLEtBQUssT0FBTzswQ0FDVCxhQUFhOzs7Ozs7Ozs7Ozs7OztnQ0FjdkIscUJBQXFCO29CQUNqQyxjQUFjO2dEQUNjLFlBQVk7O29DQUV4QixRQUFRLENBQUMsU0FBUzs7Ozs7a0NBS3BCLG9CQUFvQjttQkFDbkMsYUFBYTtrREFDa0IsV0FBVzs7c0NBRXZCLFFBQVEsQ0FBQyxRQUFROzs7Ozs7Ozs7Ozs7O0tBYWxELENBQUM7SUFDSixDQUFDO0NBQ0Y7QUFFRCxNQUFNLE9BQU8sd0JBQXdCO0lBS25DLFlBQVksUUFBaUM7UUFKN0Msa0JBQWEsR0FBRyxDQUFDLElBQUksQ0FBQyxDQUFDO1FBS3JCLElBQUksQ0FBQyxXQUFXLEdBQUcsUUFBUSxDQUFDLE9BQU8sQ0FBQztRQUNwQyxNQUFNLFdBQVcsR0FBRyxRQUFRLENBQUMsV0FBVyxDQUFDO1FBQ3pDLE1BQU0sWUFBWSxHQUFHLFFBQVEsQ0FBQyxZQUFZLENBQUM7UUFDM0MsTUFBTSxXQUFXLEdBQUcsUUFBUSxDQUFDLFdBQVcsQ0FBQztRQUN6QyxNQUFNLFdBQVcsR0FBRyxRQUFRLENBQUMsV0FBVyxDQUFDO1FBQ3pDLE1BQU0sWUFBWSxHQUFHLFFBQVEsQ0FBQyxZQUFZLENBQUM7UUFDM0MsTUFBTSxXQUFXLEdBQUcsUUFBUSxDQUFDLFdBQVcsQ0FBQztRQUN6QyxNQUFNLGFBQWEsR0FBRyxRQUFRLENBQUMsYUFBYSxDQUFDO1FBQzdDLE1BQU0sY0FBYyxHQUFHLFFBQVEsQ0FBQyxjQUFjLENBQUM7UUFDL0MsTUFBTSxhQUFhLEdBQUcsUUFBUSxDQUFDLGFBQWEsQ0FBQztRQUM3QyxNQUFNLG9CQUFvQixHQUFHLFFBQVEsQ0FBQyxvQkFBb0IsQ0FBQztRQUMzRCxNQUFNLHFCQUFxQixHQUFHLFFBQVEsQ0FBQyxxQkFBcUIsQ0FBQztRQUM3RCxNQUFNLG9CQUFvQixHQUFHLFFBQVEsQ0FBQyxvQkFBb0IsQ0FBQztRQUUzRCxNQUFNLFFBQVEsR0FBRyxvQkFBb0IsR0FBRyxDQUFDLEdBQUcsUUFBUSxDQUFDLE9BQU8sQ0FBQyxLQUFLLENBQUM7UUFDbkUsTUFBTSxNQUFNLEdBQUcscUJBQXFCLEdBQUcsQ0FBQyxHQUFHLFFBQVEsQ0FBQyxPQUFPLENBQUMsR0FBRyxDQUFDO1FBQ2hFLE1BQU0sT0FBTyxHQUFHLG9CQUFvQixHQUFHLENBQUMsR0FBRyxRQUFRLENBQUMsT0FBTyxDQUFDLElBQUksQ0FBQztRQUVqRSxNQUFNLGFBQWEsR0FBRyxDQUFDLEdBQUcsQ0FBQyxXQUFXLEdBQUcsWUFBWSxHQUFHLFdBQVcsQ0FBQyxDQUFDO1FBRXJFLElBQUksQ0FBQyxRQUFRLEdBQUc7aUNBQ2EsUUFBUSxLQUFLLE1BQU0sS0FBSyxPQUFPOzBDQUN0QixhQUFhOzs7Ozs7Ozs7Ozs7Ozs7OztnQ0FpQnZCLG9CQUFvQjtvQkFDaEMsYUFBYTtnREFDZSxXQUFXOztvQ0FFdkIsUUFBUSxDQUFDLFFBQVE7Ozs7O2tDQUtuQixxQkFBcUI7c0JBQ2pDLGNBQWM7a0RBQ2MsWUFBWTs7c0NBRXhCLFFBQVEsQ0FBQyxTQUFTOzs7Ozs7b0NBTXBCLG9CQUFvQjt3QkFDaEMsYUFBYTtvREFDZSxXQUFXOzt3Q0FFdkIsUUFBUSxDQUFDLFFBQVE7Ozs7Ozs7Ozs7Ozs7O0tBY3BELENBQUM7SUFDSixDQUFDO0NBQ0YiLCJzb3VyY2VzQ29udGVudCI6WyIvKipcbiAqIEBsaWNlbnNlXG4gKiBDb3B5cmlnaHQgMjAxNyBHb29nbGUgTExDLiBBbGwgUmlnaHRzIFJlc2VydmVkLlxuICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlIFwiTGljZW5zZVwiKTtcbiAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS5cbiAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdFxuICpcbiAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMFxuICpcbiAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmVcbiAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuIFwiQVMgSVNcIiBCQVNJUyxcbiAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLlxuICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZFxuICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuXG4gKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuICovXG5cbmltcG9ydCB7YmFja2VuZF91dGlsfSBmcm9tICdAdGVuc29yZmxvdy90ZmpzLWNvcmUnO1xuaW1wb3J0IHtHUEdQVVByb2dyYW19IGZyb20gJy4vZ3BncHVfbWF0aCc7XG5cbmV4cG9ydCBjbGFzcyBBdmdQb29sMkRCYWNrcHJvcFByb2dyYW0gaW1wbGVtZW50cyBHUEdQVVByb2dyYW0ge1xuICB2YXJpYWJsZU5hbWVzID0gWydkeSddO1xuICBvdXRwdXRTaGFwZTogbnVtYmVyW107XG4gIHVzZXJDb2RlOiBzdHJpbmc7XG5cbiAgY29uc3RydWN0b3IoY29udkluZm86IGJhY2tlbmRfdXRpbC5Db252MkRJbmZvKSB7XG4gICAgdGhpcy5vdXRwdXRTaGFwZSA9IGNvbnZJbmZvLmluU2hhcGU7XG4gICAgY29uc3QgZmlsdGVySGVpZ2h0ID0gY29udkluZm8uZmlsdGVySGVpZ2h0O1xuICAgIGNvbnN0IGZpbHRlcldpZHRoID0gY29udkluZm8uZmlsdGVyV2lkdGg7XG4gICAgY29uc3Qgc3RyaWRlSGVpZ2h0ID0gY29udkluZm8uc3RyaWRlSGVpZ2h0O1xuICAgIGNvbnN0IHN0cmlkZVdpZHRoID0gY29udkluZm8uc3RyaWRlV2lkdGg7XG4gICAgY29uc3QgZGlsYXRpb25IZWlnaHQgPSBjb252SW5mby5kaWxhdGlvbkhlaWdodDtcbiAgICBjb25zdCBkaWxhdGlvbldpZHRoID0gY29udkluZm8uZGlsYXRpb25XaWR0aDtcbiAgICBjb25zdCBlZmZlY3RpdmVGaWx0ZXJIZWlnaHQgPSBjb252SW5mby5lZmZlY3RpdmVGaWx0ZXJIZWlnaHQ7XG4gICAgY29uc3QgZWZmZWN0aXZlRmlsdGVyV2lkdGggPSBjb252SW5mby5lZmZlY3RpdmVGaWx0ZXJXaWR0aDtcblxuICAgIGNvbnN0IHBhZFRvcCA9IGVmZmVjdGl2ZUZpbHRlckhlaWdodCAtIDEgLSBjb252SW5mby5wYWRJbmZvLnRvcDtcbiAgICBjb25zdCBwYWRMZWZ0ID0gZWZmZWN0aXZlRmlsdGVyV2lkdGggLSAxIC0gY29udkluZm8ucGFkSW5mby5sZWZ0O1xuXG4gICAgY29uc3QgYXZnTXVsdGlwbGllciA9IDEgLyAoZmlsdGVySGVpZ2h0ICogZmlsdGVyV2lkdGgpO1xuXG4gICAgdGhpcy51c2VyQ29kZSA9IGBcbiAgICAgIGNvbnN0IGl2ZWMyIHBhZHMgPSBpdmVjMigke3BhZFRvcH0sICR7cGFkTGVmdH0pO1xuICAgICAgY29uc3QgZmxvYXQgYXZnTXVsdGlwbGllciA9IGZsb2F0KCR7YXZnTXVsdGlwbGllcn0pO1xuXG4gICAgICB2b2lkIG1haW4oKSB7XG4gICAgICAgIGl2ZWM0IGNvb3JkcyA9IGdldE91dHB1dENvb3JkcygpO1xuICAgICAgICBpbnQgYiA9IGNvb3Jkc1swXTtcbiAgICAgICAgaW50IGQgPSBjb29yZHNbM107XG5cbiAgICAgICAgaXZlYzIgZHlSQ0Nvcm5lciA9IGNvb3Jkcy55eiAtIHBhZHM7XG4gICAgICAgIGludCBkeVJDb3JuZXIgPSBkeVJDQ29ybmVyLng7XG4gICAgICAgIGludCBkeUNDb3JuZXIgPSBkeVJDQ29ybmVyLnk7XG5cbiAgICAgICAgLy8gQ29udm9sdmUgZHkoPywgPywgZCkgd2l0aCBwb3MgbWFzayg6LCA6LCBkKSB0byBnZXQgZHgoeFIsIHhDLCBkKS5cbiAgICAgICAgLy8gPyA9IHRvIGJlIGRldGVybWluZWQuIDogPSBhY3Jvc3MgYWxsIHZhbHVlcyBpbiB0aGF0IGF4aXMuXG4gICAgICAgIGZsb2F0IGRvdFByb2QgPSAwLjA7XG4gICAgICAgIGZvciAoaW50IHdSID0gMDsgd1IgPCAke2VmZmVjdGl2ZUZpbHRlckhlaWdodH07XG4gICAgICAgICAgICB3UiArPSAke2RpbGF0aW9uSGVpZ2h0fSkge1xuICAgICAgICAgIGZsb2F0IGR5UiA9IGZsb2F0KGR5UkNvcm5lciArIHdSKSAvICR7c3RyaWRlSGVpZ2h0fS4wO1xuXG4gICAgICAgICAgaWYgKGR5UiA8IDAuMCB8fCBkeVIgPj0gJHtjb252SW5mby5vdXRIZWlnaHR9LjAgfHwgZnJhY3QoZHlSKSA+IDAuMCkge1xuICAgICAgICAgICAgY29udGludWU7XG4gICAgICAgICAgfVxuICAgICAgICAgIGludCBpZHlSID0gaW50KGR5Uik7XG5cbiAgICAgICAgICBmb3IgKGludCB3QyA9IDA7IHdDIDwgJHtlZmZlY3RpdmVGaWx0ZXJXaWR0aH07XG4gICAgICAgICAgICB3Qys9ICR7ZGlsYXRpb25XaWR0aH0pIHtcbiAgICAgICAgICAgIGZsb2F0IGR5QyA9IGZsb2F0KGR5Q0Nvcm5lciArIHdDKSAvICR7c3RyaWRlV2lkdGh9LjA7XG5cbiAgICAgICAgICAgIGlmIChkeUMgPCAwLjAgfHwgZHlDID49ICR7Y29udkluZm8ub3V0V2lkdGh9LjAgfHxcbiAgICAgICAgICAgICAgICBmcmFjdChkeUMpID4gMC4wKSB7XG4gICAgICAgICAgICAgIGNvbnRpbnVlO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgaW50IGlkeUMgPSBpbnQoZHlDKTtcblxuICAgICAgICAgICAgZmxvYXQgZHlWYWx1ZSA9IGdldER5KGIsIGlkeVIsIGlkeUMsIGQpO1xuXG4gICAgICAgICAgICBkb3RQcm9kICs9IGR5VmFsdWUgKiBhdmdNdWx0aXBsaWVyO1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICBzZXRPdXRwdXQoZG90UHJvZCk7XG4gICAgICB9XG4gICAgYDtcbiAgfVxufVxuXG5leHBvcnQgY2xhc3MgQXZnUG9vbDNEQmFja3Byb3BQcm9ncmFtIGltcGxlbWVudHMgR1BHUFVQcm9ncmFtIHtcbiAgdmFyaWFibGVOYW1lcyA9IFsnZHknXTtcbiAgb3V0cHV0U2hhcGU6IG51bWJlcltdO1xuICB1c2VyQ29kZTogc3RyaW5nO1xuXG4gIGNvbnN0cnVjdG9yKGNvbnZJbmZvOiBiYWNrZW5kX3V0aWwuQ29udjNESW5mbykge1xuICAgIHRoaXMub3V0cHV0U2hhcGUgPSBjb252SW5mby5pblNoYXBlO1xuICAgIGNvbnN0IGZpbHRlckRlcHRoID0gY29udkluZm8uZmlsdGVyRGVwdGg7XG4gICAgY29uc3QgZmlsdGVySGVpZ2h0ID0gY29udkluZm8uZmlsdGVySGVpZ2h0O1xuICAgIGNvbnN0IGZpbHRlcldpZHRoID0gY29udkluZm8uZmlsdGVyV2lkdGg7XG4gICAgY29uc3Qgc3RyaWRlRGVwdGggPSBjb252SW5mby5zdHJpZGVEZXB0aDtcbiAgICBjb25zdCBzdHJpZGVIZWlnaHQgPSBjb252SW5mby5zdHJpZGVIZWlnaHQ7XG4gICAgY29uc3Qgc3RyaWRlV2lkdGggPSBjb252SW5mby5zdHJpZGVXaWR0aDtcbiAgICBjb25zdCBkaWxhdGlvbkRlcHRoID0gY29udkluZm8uZGlsYXRpb25EZXB0aDtcbiAgICBjb25zdCBkaWxhdGlvbkhlaWdodCA9IGNvbnZJbmZvLmRpbGF0aW9uSGVpZ2h0O1xuICAgIGNvbnN0IGRpbGF0aW9uV2lkdGggPSBjb252SW5mby5kaWxhdGlvbldpZHRoO1xuICAgIGNvbnN0IGVmZmVjdGl2ZUZpbHRlckRlcHRoID0gY29udkluZm8uZWZmZWN0aXZlRmlsdGVyRGVwdGg7XG4gICAgY29uc3QgZWZmZWN0aXZlRmlsdGVySGVpZ2h0ID0gY29udkluZm8uZWZmZWN0aXZlRmlsdGVySGVpZ2h0O1xuICAgIGNvbnN0IGVmZmVjdGl2ZUZpbHRlcldpZHRoID0gY29udkluZm8uZWZmZWN0aXZlRmlsdGVyV2lkdGg7XG5cbiAgICBjb25zdCBwYWRGcm9udCA9IGVmZmVjdGl2ZUZpbHRlckRlcHRoIC0gMSAtIGNvbnZJbmZvLnBhZEluZm8uZnJvbnQ7XG4gICAgY29uc3QgcGFkVG9wID0gZWZmZWN0aXZlRmlsdGVySGVpZ2h0IC0gMSAtIGNvbnZJbmZvLnBhZEluZm8udG9wO1xuICAgIGNvbnN0IHBhZExlZnQgPSBlZmZlY3RpdmVGaWx0ZXJXaWR0aCAtIDEgLSBjb252SW5mby5wYWRJbmZvLmxlZnQ7XG5cbiAgICBjb25zdCBhdmdNdWx0aXBsaWVyID0gMSAvIChmaWx0ZXJEZXB0aCAqIGZpbHRlckhlaWdodCAqIGZpbHRlcldpZHRoKTtcblxuICAgIHRoaXMudXNlckNvZGUgPSBgXG4gICAgICBjb25zdCBpdmVjMyBwYWRzID0gaXZlYzMoJHtwYWRGcm9udH0sICR7cGFkVG9wfSwgJHtwYWRMZWZ0fSk7XG4gICAgICBjb25zdCBmbG9hdCBhdmdNdWx0aXBsaWVyID0gZmxvYXQoJHthdmdNdWx0aXBsaWVyfSk7XG5cbiAgICAgIHZvaWQgbWFpbigpIHtcbiAgICAgICAgaXZlYzUgY29vcmRzID0gZ2V0T3V0cHV0Q29vcmRzKCk7XG4gICAgICAgIGludCBiYXRjaCA9IGNvb3Jkcy54O1xuICAgICAgICBpbnQgY2ggPSBjb29yZHMudTtcblxuICAgICAgICBpdmVjMyBkeUNvcm5lciA9IGl2ZWMzKGNvb3Jkcy55LCBjb29yZHMueiwgY29vcmRzLncpIC0gcGFkcztcbiAgICAgICAgaW50IGR5RENvcm5lciA9IGR5Q29ybmVyLng7XG4gICAgICAgIGludCBkeVJDb3JuZXIgPSBkeUNvcm5lci55O1xuICAgICAgICBpbnQgZHlDQ29ybmVyID0gZHlDb3JuZXIuejtcblxuICAgICAgICAvLyBDb252b2x2ZSBkeSg/LCA/LCA/LCBkKSB3aXRoIHBvcyBtYXNrKDosIDosIDosIGNoKSB0byBnZXRcbiAgICAgICAgLy8gZHgoeEQsIHhSLCB4QywgY2gpLlxuICAgICAgICAvLyA/ID0gdG8gYmUgZGV0ZXJtaW5lZC4gOiA9IGFjcm9zcyBhbGwgdmFsdWVzIGluIHRoYXQgYXhpcy5cbiAgICAgICAgZmxvYXQgZG90UHJvZCA9IDAuMDtcblxuICAgICAgICBmb3IgKGludCB3RCA9IDA7IHdEIDwgJHtlZmZlY3RpdmVGaWx0ZXJEZXB0aH07XG4gICAgICAgICAgICB3RCArPSAke2RpbGF0aW9uRGVwdGh9KSB7XG4gICAgICAgICAgZmxvYXQgZHlEID0gZmxvYXQoZHlEQ29ybmVyICsgd0QpIC8gJHtzdHJpZGVEZXB0aH0uMDtcblxuICAgICAgICAgIGlmIChkeUQgPCAwLjAgfHwgZHlEID49ICR7Y29udkluZm8ub3V0RGVwdGh9LjAgfHwgZnJhY3QoZHlEKSA+IDAuMCkge1xuICAgICAgICAgICAgY29udGludWU7XG4gICAgICAgICAgfVxuICAgICAgICAgIGludCBpZHlEID0gaW50KGR5RCk7XG5cbiAgICAgICAgICBmb3IgKGludCB3UiA9IDA7IHdSIDwgJHtlZmZlY3RpdmVGaWx0ZXJIZWlnaHR9O1xuICAgICAgICAgICAgICB3UiArPSAke2RpbGF0aW9uSGVpZ2h0fSkge1xuICAgICAgICAgICAgZmxvYXQgZHlSID0gZmxvYXQoZHlSQ29ybmVyICsgd1IpIC8gJHtzdHJpZGVIZWlnaHR9LjA7XG5cbiAgICAgICAgICAgIGlmIChkeVIgPCAwLjAgfHwgZHlSID49ICR7Y29udkluZm8ub3V0SGVpZ2h0fS4wIHx8XG4gICAgICAgICAgICAgICAgZnJhY3QoZHlSKSA+IDAuMCkge1xuICAgICAgICAgICAgICBjb250aW51ZTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGludCBpZHlSID0gaW50KGR5Uik7XG5cbiAgICAgICAgICAgIGZvciAoaW50IHdDID0gMDsgd0MgPCAke2VmZmVjdGl2ZUZpbHRlcldpZHRofTtcbiAgICAgICAgICAgICAgICB3QyArPSAke2RpbGF0aW9uV2lkdGh9KSB7XG4gICAgICAgICAgICAgIGZsb2F0IGR5QyA9IGZsb2F0KGR5Q0Nvcm5lciArIHdDKSAvICR7c3RyaWRlV2lkdGh9LjA7XG5cbiAgICAgICAgICAgICAgaWYgKGR5QyA8IDAuMCB8fCBkeUMgPj0gJHtjb252SW5mby5vdXRXaWR0aH0uMCB8fFxuICAgICAgICAgICAgICAgICAgZnJhY3QoZHlDKSA+IDAuMCkge1xuICAgICAgICAgICAgICAgIGNvbnRpbnVlO1xuICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgIGludCBpZHlDID0gaW50KGR5Qyk7XG5cbiAgICAgICAgICAgICAgZmxvYXQgZHlWYWx1ZSA9IGdldER5KGJhdGNoLCBpZHlELCBpZHlSLCBpZHlDLCBjaCk7XG5cbiAgICAgICAgICAgICAgZG90UHJvZCArPSBkeVZhbHVlICogYXZnTXVsdGlwbGllcjtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgc2V0T3V0cHV0KGRvdFByb2QpO1xuICAgICAgfVxuICAgIGA7XG4gIH1cbn1cbiJdfQ==","/**\n * @license\n * Copyright 2020 Google LLC. All Rights Reserved.\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n * =============================================================================\n */\nimport { AvgPool3DGrad, backend_util } from '@tensorflow/tfjs-core';\nimport { AvgPool3DBackpropProgram } from '../avg_pool_backprop_gpu';\nexport function avgPool3DGrad(args) {\n const { inputs, backend, attrs } = args;\n const { dy, input } = inputs;\n const x = input;\n const { filterSize, strides, pad, dimRoundingMode } = attrs;\n const dilations = [1, 1, 1];\n const convInfo = backend_util.computePool3DInfo(x.shape, filterSize, strides, dilations, pad, dimRoundingMode);\n const avgPoolBackpropProgram = new AvgPool3DBackpropProgram(convInfo);\n return backend.runWebGLProgram(avgPoolBackpropProgram, [dy], x.dtype);\n}\nexport const avgPool3DGradConfig = {\n kernelName: AvgPool3DGrad,\n backendName: 'webgl',\n kernelFunc: avgPool3DGrad\n};\n//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiQXZnUG9vbDNER3JhZC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uLy4uL3RmanMtYmFja2VuZC13ZWJnbC9zcmMva2VybmVscy9BdmdQb29sM0RHcmFkLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBOzs7Ozs7Ozs7Ozs7Ozs7R0FlRztBQUNILE9BQU8sRUFBQyxhQUFhLEVBQTJDLFlBQVksRUFBdUMsTUFBTSx1QkFBdUIsQ0FBQztBQUVqSixPQUFPLEVBQUMsd0JBQXdCLEVBQUMsTUFBTSwwQkFBMEIsQ0FBQztBQUdsRSxNQUFNLFVBQVUsYUFBYSxDQUFDLElBSTdCO0lBQ0MsTUFBTSxFQUFDLE1BQU0sRUFBRSxPQUFPLEVBQUUsS0FBSyxFQUFDLEdBQUcsSUFBSSxDQUFDO0lBQ3RDLE1BQU0sRUFBQyxFQUFFLEVBQUUsS0FBSyxFQUFDLEdBQUcsTUFBTSxDQUFDO0lBQzNCLE1BQU0sQ0FBQyxHQUFHLEtBQUssQ0FBQztJQUNoQixNQUFNLEVBQUMsVUFBVSxFQUFFLE9BQU8sRUFBRSxHQUFHLEVBQUUsZUFBZSxFQUFDLEdBQUcsS0FBSyxDQUFDO0lBQzFELE1BQU0sU0FBUyxHQUE2QixDQUFDLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUM7SUFFdEQsTUFBTSxRQUFRLEdBQUcsWUFBWSxDQUFDLGlCQUFpQixDQUMzQyxDQUFDLENBQUMsS0FBaUQsRUFBRSxVQUFVLEVBQUUsT0FBTyxFQUN4RSxTQUFTLEVBQUUsR0FBRyxFQUFFLGVBQWUsQ0FBQyxDQUFDO0lBQ3JDLE1BQU0sc0JBQXNCLEdBQUcsSUFBSSx3QkFBd0IsQ0FBQyxRQUFRLENBQUMsQ0FBQztJQUN0RSxPQUFPLE9BQU8sQ0FBQyxlQUFlLENBQUMsc0JBQXNCLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLENBQUMsS0FBSyxDQUFDLENBQUM7QUFDeEUsQ0FBQztBQUVELE1BQU0sQ0FBQyxNQUFNLG1CQUFtQixHQUFpQjtJQUMvQyxVQUFVLEVBQUUsYUFBYTtJQUN6QixXQUFXLEVBQUUsT0FBTztJQUNwQixVQUFVLEVBQUUsYUFBaUM7Q0FDOUMsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbIi8qKlxuICogQGxpY2Vuc2VcbiAqIENvcHlyaWdodCAyMDIwIEdvb2dsZSBMTEMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuXG4gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgXCJMaWNlbnNlXCIpO1xuICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLlxuICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0XG4gKlxuICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wXG4gKlxuICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZVxuICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gXCJBUyBJU1wiIEJBU0lTLFxuICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuXG4gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kXG4gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS5cbiAqID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4gKi9cbmltcG9ydCB7QXZnUG9vbDNER3JhZCwgQXZnUG9vbDNER3JhZEF0dHJzLCBBdmdQb29sM0RHcmFkSW5wdXRzLCBiYWNrZW5kX3V0aWwsIEtlcm5lbENvbmZpZywgS2VybmVsRnVuYywgVGVuc29ySW5mb30gZnJvbSAnQHRlbnNvcmZsb3cvdGZqcy1jb3JlJztcblxuaW1wb3J0IHtBdmdQb29sM0RCYWNrcHJvcFByb2dyYW19IGZyb20gJy4uL2F2Z19wb29sX2JhY2twcm9wX2dwdSc7XG5pbXBvcnQge01hdGhCYWNrZW5kV2ViR0x9IGZyb20gJy4uL2JhY2tlbmRfd2ViZ2wnO1xuXG5leHBvcnQgZnVuY3Rpb24gYXZnUG9vbDNER3JhZChhcmdzOiB7XG4gIGlucHV0czogQXZnUG9vbDNER3JhZElucHV0cyxcbiAgYmFja2VuZDogTWF0aEJhY2tlbmRXZWJHTCxcbiAgYXR0cnM6IEF2Z1Bvb2wzREdyYWRBdHRyc1xufSk6IFRlbnNvckluZm8ge1xuICBjb25zdCB7aW5wdXRzLCBiYWNrZW5kLCBhdHRyc30gPSBhcmdzO1xuICBjb25zdCB7ZHksIGlucHV0fSA9IGlucHV0cztcbiAgY29uc3QgeCA9IGlucHV0O1xuICBjb25zdCB7ZmlsdGVyU2l6ZSwgc3RyaWRlcywgcGFkLCBkaW1Sb3VuZGluZ01vZGV9ID0gYXR0cnM7XG4gIGNvbnN0IGRpbGF0aW9uczogW251bWJlciwgbnVtYmVyLCBudW1iZXJdID0gWzEsIDEsIDFdO1xuXG4gIGNvbnN0IGNvbnZJbmZvID0gYmFja2VuZF91dGlsLmNvbXB1dGVQb29sM0RJbmZvKFxuICAgICAgeC5zaGFwZSBhcyBbbnVtYmVyLCBudW1iZXIsIG51bWJlciwgbnVtYmVyLCBudW1iZXJdLCBmaWx0ZXJTaXplLCBzdHJpZGVzLFxuICAgICAgZGlsYXRpb25zLCBwYWQsIGRpbVJvdW5kaW5nTW9kZSk7XG4gIGNvbnN0IGF2Z1Bvb2xCYWNrcHJvcFByb2dyYW0gPSBuZXcgQXZnUG9vbDNEQmFja3Byb3BQcm9ncmFtKGNvbnZJbmZvKTtcbiAgcmV0dXJuIGJhY2tlbmQucnVuV2ViR0xQcm9ncmFtKGF2Z1Bvb2xCYWNrcHJvcFByb2dyYW0sIFtkeV0sIHguZHR5cGUpO1xufVxuXG5leHBvcnQgY29uc3QgYXZnUG9vbDNER3JhZENvbmZpZzogS2VybmVsQ29uZmlnID0ge1xuICBrZXJuZWxOYW1lOiBBdmdQb29sM0RHcmFkLFxuICBiYWNrZW5kTmFtZTogJ3dlYmdsJyxcbiAga2VybmVsRnVuYzogYXZnUG9vbDNER3JhZCBhcyB7fSBhcyBLZXJuZWxGdW5jXG59O1xuIl19","/**\n * @license\n * Copyright 2020 Google LLC. All Rights Reserved.\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n * =============================================================================\n */\nimport { AvgPoolGrad, backend_util } from '@tensorflow/tfjs-core';\nimport { AvgPool2DBackpropProgram } from '../avg_pool_backprop_gpu';\nimport { assertNotComplex } from '../webgl_util';\nexport function avgPoolGrad(args) {\n const { inputs, backend, attrs } = args;\n const { dy, input } = inputs;\n const x = input;\n assertNotComplex([dy, input], 'avgPoolGrad');\n const { filterSize, strides, pad } = attrs;\n const convInfo = backend_util.computePool2DInfo(x.shape, filterSize, strides, 1 /* dilations */, pad);\n const avgPoolBackpropProgram = new AvgPool2DBackpropProgram(convInfo);\n return backend.runWebGLProgram(avgPoolBackpropProgram, [dy], x.dtype);\n}\nexport const avgPoolGradConfig = {\n kernelName: AvgPoolGrad,\n backendName: 'webgl',\n kernelFunc: avgPoolGrad\n};\n//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiQXZnUG9vbEdyYWQuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi8uLi90ZmpzLWJhY2tlbmQtd2ViZ2wvc3JjL2tlcm5lbHMvQXZnUG9vbEdyYWQudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUE7Ozs7Ozs7Ozs7Ozs7OztHQWVHO0FBQ0gsT0FBTyxFQUFDLFdBQVcsRUFBdUMsWUFBWSxFQUF1QyxNQUFNLHVCQUF1QixDQUFDO0FBRTNJLE9BQU8sRUFBQyx3QkFBd0IsRUFBQyxNQUFNLDBCQUEwQixDQUFDO0FBRWxFLE9BQU8sRUFBQyxnQkFBZ0IsRUFBQyxNQUFNLGVBQWUsQ0FBQztBQUUvQyxNQUFNLFVBQVUsV0FBVyxDQUFDLElBSTNCO0lBQ0MsTUFBTSxFQUFDLE1BQU0sRUFBRSxPQUFPLEVBQUUsS0FBSyxFQUFDLEdBQUcsSUFBSSxDQUFDO0lBQ3RDLE1BQU0sRUFBQyxFQUFFLEVBQUUsS0FBSyxFQUFDLEdBQUcsTUFBTSxDQUFDO0lBQzNCLE1BQU0sQ0FBQyxHQUFHLEtBQUssQ0FBQztJQUNoQixnQkFBZ0IsQ0FBQyxDQUFDLEVBQUUsRUFBRSxLQUFLLENBQUMsRUFBRSxhQUFhLENBQUMsQ0FBQztJQUM3QyxNQUFNLEVBQUMsVUFBVSxFQUFFLE9BQU8sRUFBRSxHQUFHLEVBQUMsR0FBRyxLQUFLLENBQUM7SUFFekMsTUFBTSxRQUFRLEdBQUcsWUFBWSxDQUFDLGlCQUFpQixDQUMzQyxDQUFDLENBQUMsS0FBeUMsRUFBRSxVQUFVLEVBQUUsT0FBTyxFQUNoRSxDQUFDLENBQUMsZUFBZSxFQUFFLEdBQUcsQ0FBQyxDQUFDO0lBQzVCLE1BQU0sc0JBQXNCLEdBQUcsSUFBSSx3QkFBd0IsQ0FBQyxRQUFRLENBQUMsQ0FBQztJQUN0RSxPQUFPLE9BQU8sQ0FBQyxlQUFlLENBQUMsc0JBQXNCLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLENBQUMsS0FBSyxDQUFDLENBQUM7QUFDeEUsQ0FBQztBQUVELE1BQU0sQ0FBQyxNQUFNLGlCQUFpQixHQUFpQjtJQUM3QyxVQUFVLEVBQUUsV0FBVztJQUN2QixXQUFXLEVBQUUsT0FBTztJQUNwQixVQUFVLEVBQUUsV0FBK0I7Q0FDNUMsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbIi8qKlxuICogQGxpY2Vuc2VcbiAqIENvcHlyaWdodCAyMDIwIEdvb2dsZSBMTEMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuXG4gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgXCJMaWNlbnNlXCIpO1xuICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLlxuICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0XG4gKlxuICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wXG4gKlxuICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZVxuICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gXCJBUyBJU1wiIEJBU0lTLFxuICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuXG4gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kXG4gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS5cbiAqID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4gKi9cbmltcG9ydCB7QXZnUG9vbEdyYWQsIEF2Z1Bvb2xHcmFkQXR0cnMsIEF2Z1Bvb2xHcmFkSW5wdXRzLCBiYWNrZW5kX3V0aWwsIEtlcm5lbENvbmZpZywgS2VybmVsRnVuYywgVGVuc29ySW5mb30gZnJvbSAnQHRlbnNvcmZsb3cvdGZqcy1jb3JlJztcblxuaW1wb3J0IHtBdmdQb29sMkRCYWNrcHJvcFByb2dyYW19IGZyb20gJy4uL2F2Z19wb29sX2JhY2twcm9wX2dwdSc7XG5pbXBvcnQge01hdGhCYWNrZW5kV2ViR0x9IGZyb20gJy4uL2JhY2tlbmRfd2ViZ2wnO1xuaW1wb3J0IHthc3NlcnROb3RDb21wbGV4fSBmcm9tICcuLi93ZWJnbF91dGlsJztcblxuZXhwb3J0IGZ1bmN0aW9uIGF2Z1Bvb2xHcmFkKGFyZ3M6IHtcbiAgaW5wdXRzOiBBdmdQb29sR3JhZElucHV0cyxcbiAgYmFja2VuZDogTWF0aEJhY2tlbmRXZWJHTCxcbiAgYXR0cnM6IEF2Z1Bvb2xHcmFkQXR0cnNcbn0pOiBUZW5zb3JJbmZvIHtcbiAgY29uc3Qge2lucHV0cywgYmFja2VuZCwgYXR0cnN9ID0gYXJncztcbiAgY29uc3Qge2R5LCBpbnB1dH0gPSBpbnB1dHM7XG4gIGNvbnN0IHggPSBpbnB1dDtcbiAgYXNzZXJ0Tm90Q29tcGxleChbZHksIGlucHV0XSwgJ2F2Z1Bvb2xHcmFkJyk7XG4gIGNvbnN0IHtmaWx0ZXJTaXplLCBzdHJpZGVzLCBwYWR9ID0gYXR0cnM7XG5cbiAgY29uc3QgY29udkluZm8gPSBiYWNrZW5kX3V0aWwuY29tcHV0ZVBvb2wyREluZm8oXG4gICAgICB4LnNoYXBlIGFzIFtudW1iZXIsIG51bWJlciwgbnVtYmVyLCBudW1iZXJdLCBmaWx0ZXJTaXplLCBzdHJpZGVzLFxuICAgICAgMSAvKiBkaWxhdGlvbnMgKi8sIHBhZCk7XG4gIGNvbnN0IGF2Z1Bvb2xCYWNrcHJvcFByb2dyYW0gPSBuZXcgQXZnUG9vbDJEQmFja3Byb3BQcm9ncmFtKGNvbnZJbmZvKTtcbiAgcmV0dXJuIGJhY2tlbmQucnVuV2ViR0xQcm9ncmFtKGF2Z1Bvb2xCYWNrcHJvcFByb2dyYW0sIFtkeV0sIHguZHR5cGUpO1xufVxuXG5leHBvcnQgY29uc3QgYXZnUG9vbEdyYWRDb25maWc6IEtlcm5lbENvbmZpZyA9IHtcbiAga2VybmVsTmFtZTogQXZnUG9vbEdyYWQsXG4gIGJhY2tlbmROYW1lOiAnd2ViZ2wnLFxuICBrZXJuZWxGdW5jOiBhdmdQb29sR3JhZCBhcyB7fSBhcyBLZXJuZWxGdW5jXG59O1xuIl19","/**\n * @license\n * Copyright 2020 Google LLC. All Rights Reserved.\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n * =============================================================================\n */\nimport { BatchMatMul } from '@tensorflow/tfjs-core';\nimport { batchMatMulImpl } from './BatchMatMul_impl';\nexport function batchMatMul(args) {\n const { inputs, backend, attrs } = args;\n const { a, b } = inputs;\n const { transposeA, transposeB } = attrs;\n return batchMatMulImpl({ a, b, transposeA, transposeB, backend });\n}\nexport const batchMatMulConfig = {\n kernelName: BatchMatMul,\n backendName: 'webgl',\n kernelFunc: batchMatMul,\n};\n//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiQmF0Y2hNYXRNdWwuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi8uLi90ZmpzLWJhY2tlbmQtd2ViZ2wvc3JjL2tlcm5lbHMvQmF0Y2hNYXRNdWwudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUE7Ozs7Ozs7Ozs7Ozs7OztHQWVHO0FBRUgsT0FBTyxFQUFDLFdBQVcsRUFBZ0UsTUFBTSx1QkFBdUIsQ0FBQztBQUdqSCxPQUFPLEVBQUMsZUFBZSxFQUFDLE1BQU0sb0JBQW9CLENBQUM7QUFFbkQsTUFBTSxVQUFVLFdBQVcsQ0FBQyxJQUkzQjtJQUNDLE1BQU0sRUFBQyxNQUFNLEVBQUUsT0FBTyxFQUFFLEtBQUssRUFBQyxHQUFHLElBQUksQ0FBQztJQUN0QyxNQUFNLEVBQUMsQ0FBQyxFQUFFLENBQUMsRUFBQyxHQUFHLE1BQU0sQ0FBQztJQUN0QixNQUFNLEVBQUMsVUFBVSxFQUFFLFVBQVUsRUFBQyxHQUFHLEtBQUssQ0FBQztJQUV2QyxPQUFPLGVBQWUsQ0FBQyxFQUFDLENBQUMsRUFBRSxDQUFDLEVBQUUsVUFBVSxFQUFFLFVBQVUsRUFBRSxPQUFPLEVBQUMsQ0FBQyxDQUFDO0FBQ2xFLENBQUM7QUFFRCxNQUFNLENBQUMsTUFBTSxpQkFBaUIsR0FBaUI7SUFDN0MsVUFBVSxFQUFFLFdBQVc7SUFDdkIsV0FBVyxFQUFFLE9BQU87SUFDcEIsVUFBVSxFQUFFLFdBQStCO0NBQzVDLENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyIvKipcbiAqIEBsaWNlbnNlXG4gKiBDb3B5cmlnaHQgMjAyMCBHb29nbGUgTExDLiBBbGwgUmlnaHRzIFJlc2VydmVkLlxuICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlIFwiTGljZW5zZVwiKTtcbiAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS5cbiAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdFxuICpcbiAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMFxuICpcbiAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmVcbiAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuIFwiQVMgSVNcIiBCQVNJUyxcbiAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLlxuICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZFxuICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuXG4gKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuICovXG5cbmltcG9ydCB7QmF0Y2hNYXRNdWwsIEJhdGNoTWF0TXVsQXR0cnMsIEJhdGNoTWF0TXVsSW5wdXRzLCBLZXJuZWxDb25maWcsIEtlcm5lbEZ1bmN9IGZyb20gJ0B0ZW5zb3JmbG93L3RmanMtY29yZSc7XG5cbmltcG9ydCB7TWF0aEJhY2tlbmRXZWJHTH0gZnJvbSAnLi4vYmFja2VuZF93ZWJnbCc7XG5pbXBvcnQge2JhdGNoTWF0TXVsSW1wbH0gZnJvbSAnLi9CYXRjaE1hdE11bF9pbXBsJztcblxuZXhwb3J0IGZ1bmN0aW9uIGJhdGNoTWF0TXVsKGFyZ3M6IHtcbiAgaW5wdXRzOiBCYXRjaE1hdE11bElucHV0cyxcbiAgYXR0cnM6IEJhdGNoTWF0TXVsQXR0cnMsXG4gIGJhY2tlbmQ6IE1hdGhCYWNrZW5kV2ViR0xcbn0pIHtcbiAgY29uc3Qge2lucHV0cywgYmFja2VuZCwgYXR0cnN9ID0gYXJncztcbiAgY29uc3Qge2EsIGJ9ID0gaW5wdXRzO1xuICBjb25zdCB7dHJhbnNwb3NlQSwgdHJhbnNwb3NlQn0gPSBhdHRycztcblxuICByZXR1cm4gYmF0Y2hNYXRNdWxJbXBsKHthLCBiLCB0cmFuc3Bvc2VBLCB0cmFuc3Bvc2VCLCBiYWNrZW5kfSk7XG59XG5cbmV4cG9ydCBjb25zdCBiYXRjaE1hdE11bENvbmZpZzogS2VybmVsQ29uZmlnID0ge1xuICBrZXJuZWxOYW1lOiBCYXRjaE1hdE11bCxcbiAgYmFja2VuZE5hbWU6ICd3ZWJnbCcsXG4gIGtlcm5lbEZ1bmM6IGJhdGNoTWF0TXVsIGFzIHt9IGFzIEtlcm5lbEZ1bmMsXG59O1xuIl19","/**\n * @license\n * Copyright 2017 Google LLC. All Rights Reserved.\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n * =============================================================================\n */\nimport { backend_util } from '@tensorflow/tfjs-core';\nexport class BatchNormProgram {\n constructor(xShape, meanShape, varianceShape, offsetShape, scaleShape, varianceEpsilon) {\n this.outputShape = [];\n this.variableNames = ['x', 'mean', 'variance'];\n backend_util.assertAndGetBroadcastShape(xShape, meanShape);\n backend_util.assertAndGetBroadcastShape(xShape, varianceShape);\n let offsetSnippet = '0.0';\n if (offsetShape != null) {\n backend_util.assertAndGetBroadcastShape(xShape, offsetShape);\n this.variableNames.push('offset');\n offsetSnippet = 'getOffsetAtOutCoords()';\n }\n let scaleSnippet = '1.0';\n if (scaleShape != null) {\n backend_util.assertAndGetBroadcastShape(xShape, scaleShape);\n this.variableNames.push('scale');\n scaleSnippet = 'getScaleAtOutCoords()';\n }\n this.outputShape = xShape;\n this.userCode = `\n void main() {\n float x = getXAtOutCoords();\n float mean = getMeanAtOutCoords();\n float variance = getVarianceAtOutCoords();\n float offset = ${offsetSnippet};\n float scale = ${scaleSnippet};\n float inv = scale * inversesqrt(variance + float(${varianceEpsilon}));\n setOutput(dot(vec3(x, -mean, offset), vec3(inv, inv, 1)));\n }\n `;\n }\n}\n//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYmF0Y2hub3JtX2dwdS5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uL3RmanMtYmFja2VuZC13ZWJnbC9zcmMvYmF0Y2hub3JtX2dwdS50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQTs7Ozs7Ozs7Ozs7Ozs7O0dBZUc7QUFFSCxPQUFPLEVBQUMsWUFBWSxFQUFDLE1BQU0sdUJBQXVCLENBQUM7QUFHbkQsTUFBTSxPQUFPLGdCQUFnQjtJQUszQixZQUNJLE1BQWdCLEVBQUUsU0FBbUIsRUFBRSxhQUF1QixFQUM5RCxXQUEwQixFQUFFLFVBQXlCLEVBQ3JELGVBQXVCO1FBTjNCLGdCQUFXLEdBQWEsRUFBRSxDQUFDO1FBT3pCLElBQUksQ0FBQyxhQUFhLEdBQUcsQ0FBQyxHQUFHLEVBQUUsTUFBTSxFQUFFLFVBQVUsQ0FBQyxDQUFDO1FBQy9DLFlBQVksQ0FBQywwQkFBMEIsQ0FBQyxNQUFNLEVBQUUsU0FBUyxDQUFDLENBQUM7UUFDM0QsWUFBWSxDQUFDLDBCQUEwQixDQUFDLE1BQU0sRUFBRSxhQUFhLENBQUMsQ0FBQztRQUUvRCxJQUFJLGFBQWEsR0FBRyxLQUFLLENBQUM7UUFDMUIsSUFBSSxXQUFXLElBQUksSUFBSSxFQUFFO1lBQ3ZCLFlBQVksQ0FBQywwQkFBMEIsQ0FBQyxNQUFNLEVBQUUsV0FBVyxDQUFDLENBQUM7WUFDN0QsSUFBSSxDQUFDLGFBQWEsQ0FBQyxJQUFJLENBQUMsUUFBUSxDQUFDLENBQUM7WUFDbEMsYUFBYSxHQUFHLHdCQUF3QixDQUFDO1NBQzFDO1FBRUQsSUFBSSxZQUFZLEdBQUcsS0FBSyxDQUFDO1FBQ3pCLElBQUksVUFBVSxJQUFJLElBQUksRUFBRTtZQUN0QixZQUFZLENBQUMsMEJBQTBCLENBQUMsTUFBTSxFQUFFLFVBQVUsQ0FBQyxDQUFDO1lBQzVELElBQUksQ0FBQyxhQUFhLENBQUMsSUFBSSxDQUFDLE9BQU8sQ0FBQyxDQUFDO1lBQ2pDLFlBQVksR0FBRyx1QkFBdUIsQ0FBQztTQUN4QztRQUVELElBQUksQ0FBQyxXQUFXLEdBQUcsTUFBTSxDQUFDO1FBQzFCLElBQUksQ0FBQyxRQUFRLEdBQUc7Ozs7O3lCQUtLLGFBQWE7d0JBQ2QsWUFBWTsyREFDdUIsZUFBZTs7O0tBR3JFLENBQUM7SUFDSixDQUFDO0NBQ0YiLCJzb3VyY2VzQ29udGVudCI6WyIvKipcbiAqIEBsaWNlbnNlXG4gKiBDb3B5cmlnaHQgMjAxNyBHb29nbGUgTExDLiBBbGwgUmlnaHRzIFJlc2VydmVkLlxuICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlIFwiTGljZW5zZVwiKTtcbiAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS5cbiAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdFxuICpcbiAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMFxuICpcbiAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmVcbiAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuIFwiQVMgSVNcIiBCQVNJUyxcbiAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLlxuICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZFxuICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuXG4gKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuICovXG5cbmltcG9ydCB7YmFja2VuZF91dGlsfSBmcm9tICdAdGVuc29yZmxvdy90ZmpzLWNvcmUnO1xuaW1wb3J0IHtHUEdQVVByb2dyYW19IGZyb20gJy4vZ3BncHVfbWF0aCc7XG5cbmV4cG9ydCBjbGFzcyBCYXRjaE5vcm1Qcm9ncmFtIGltcGxlbWVudHMgR1BHUFVQcm9ncmFtIHtcbiAgdmFyaWFibGVOYW1lczogc3RyaW5nW107XG4gIG91dHB1dFNoYXBlOiBudW1iZXJbXSA9IFtdO1xuICB1c2VyQ29kZTogc3RyaW5nO1xuXG4gIGNvbnN0cnVjdG9yKFxuICAgICAgeFNoYXBlOiBudW1iZXJbXSwgbWVhblNoYXBlOiBudW1iZXJbXSwgdmFyaWFuY2VTaGFwZTogbnVtYmVyW10sXG4gICAgICBvZmZzZXRTaGFwZTogbnVtYmVyW118bnVsbCwgc2NhbGVTaGFwZTogbnVtYmVyW118bnVsbCxcbiAgICAgIHZhcmlhbmNlRXBzaWxvbjogbnVtYmVyKSB7XG4gICAgdGhpcy52YXJpYWJsZU5hbWVzID0gWyd4JywgJ21lYW4nLCAndmFyaWFuY2UnXTtcbiAgICBiYWNrZW5kX3V0aWwuYXNzZXJ0QW5kR2V0QnJvYWRjYXN0U2hhcGUoeFNoYXBlLCBtZWFuU2hhcGUpO1xuICAgIGJhY2tlbmRfdXRpbC5hc3NlcnRBbmRHZXRCcm9hZGNhc3RTaGFwZSh4U2hhcGUsIHZhcmlhbmNlU2hhcGUpO1xuXG4gICAgbGV0IG9mZnNldFNuaXBwZXQgPSAnMC4wJztcbiAgICBpZiAob2Zmc2V0U2hhcGUgIT0gbnVsbCkge1xuICAgICAgYmFja2VuZF91dGlsLmFzc2VydEFuZEdldEJyb2FkY2FzdFNoYXBlKHhTaGFwZSwgb2Zmc2V0U2hhcGUpO1xuICAgICAgdGhpcy52YXJpYWJsZU5hbWVzLnB1c2goJ29mZnNldCcpO1xuICAgICAgb2Zmc2V0U25pcHBldCA9ICdnZXRPZmZzZXRBdE91dENvb3JkcygpJztcbiAgICB9XG5cbiAgICBsZXQgc2NhbGVTbmlwcGV0ID0gJzEuMCc7XG4gICAgaWYgKHNjYWxlU2hhcGUgIT0gbnVsbCkge1xuICAgICAgYmFja2VuZF91dGlsLmFzc2VydEFuZEdldEJyb2FkY2FzdFNoYXBlKHhTaGFwZSwgc2NhbGVTaGFwZSk7XG4gICAgICB0aGlzLnZhcmlhYmxlTmFtZXMucHVzaCgnc2NhbGUnKTtcbiAgICAgIHNjYWxlU25pcHBldCA9ICdnZXRTY2FsZUF0T3V0Q29vcmRzKCknO1xuICAgIH1cblxuICAgIHRoaXMub3V0cHV0U2hhcGUgPSB4U2hhcGU7XG4gICAgdGhpcy51c2VyQ29kZSA9IGBcbiAgICAgIHZvaWQgbWFpbigpIHtcbiAgICAgICAgZmxvYXQgeCA9IGdldFhBdE91dENvb3JkcygpO1xuICAgICAgICBmbG9hdCBtZWFuID0gZ2V0TWVhbkF0T3V0Q29vcmRzKCk7XG4gICAgICAgIGZsb2F0IHZhcmlhbmNlID0gZ2V0VmFyaWFuY2VBdE91dENvb3JkcygpO1xuICAgICAgICBmbG9hdCBvZmZzZXQgPSAke29mZnNldFNuaXBwZXR9O1xuICAgICAgICBmbG9hdCBzY2FsZSA9ICR7c2NhbGVTbmlwcGV0fTtcbiAgICAgICAgZmxvYXQgaW52ID0gc2NhbGUgKiBpbnZlcnNlc3FydCh2YXJpYW5jZSArIGZsb2F0KCR7dmFyaWFuY2VFcHNpbG9ufSkpO1xuICAgICAgICBzZXRPdXRwdXQoZG90KHZlYzMoeCwgLW1lYW4sIG9mZnNldCksIHZlYzMoaW52LCBpbnYsIDEpKSk7XG4gICAgICB9XG4gICAgYDtcbiAgfVxufVxuIl19","/**\n * @license\n * Copyright 2018 Google LLC. All Rights Reserved.\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n * =============================================================================\n */\nimport { backend_util } from '@tensorflow/tfjs-core';\nexport class BatchNormPackedProgram {\n constructor(xShape, meanShape, varianceShape, offsetShape, scaleShape, varianceEpsilon) {\n this.packedInputs = true;\n this.packedOutput = true;\n this.variableNames = ['x', 'mean', 'variance'];\n backend_util.assertAndGetBroadcastShape(xShape, meanShape);\n backend_util.assertAndGetBroadcastShape(xShape, varianceShape);\n let offsetSnippet = 'vec4(0.0)';\n if (offsetShape != null) {\n backend_util.assertAndGetBroadcastShape(xShape, offsetShape);\n this.variableNames.push('offset');\n offsetSnippet = 'getOffsetAtOutCoords()';\n }\n let scaleSnippet = 'vec4(1.0)';\n if (scaleShape != null) {\n backend_util.assertAndGetBroadcastShape(xShape, scaleShape);\n this.variableNames.push('scale');\n scaleSnippet = 'getScaleAtOutCoords()';\n }\n this.outputShape = xShape;\n this.userCode = `\n void main() {\n vec4 offset = ${offsetSnippet};\n vec4 scale = ${scaleSnippet};\n\n vec4 x = getXAtOutCoords();\n vec4 mean = getMeanAtOutCoords();\n vec4 variance = getVarianceAtOutCoords();\n\n vec4 inv = scale * inversesqrt(variance + vec4(${varianceEpsilon}));\n\n setOutput((x - mean) * inv + offset);\n }\n `;\n }\n}\n//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYmF0Y2hub3JtX3BhY2tlZF9ncHUuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi90ZmpzLWJhY2tlbmQtd2ViZ2wvc3JjL2JhdGNobm9ybV9wYWNrZWRfZ3B1LnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBOzs7Ozs7Ozs7Ozs7Ozs7R0FlRztBQUVILE9BQU8sRUFBQyxZQUFZLEVBQUMsTUFBTSx1QkFBdUIsQ0FBQztBQUduRCxNQUFNLE9BQU8sc0JBQXNCO0lBT2pDLFlBQ0ksTUFBZ0IsRUFBRSxTQUFtQixFQUFFLGFBQXVCLEVBQzlELFdBQTBCLEVBQUUsVUFBeUIsRUFDckQsZUFBdUI7UUFOM0IsaUJBQVksR0FBRyxJQUFJLENBQUM7UUFDcEIsaUJBQVksR0FBRyxJQUFJLENBQUM7UUFNbEIsSUFBSSxDQUFDLGFBQWEsR0FBRyxDQUFDLEdBQUcsRUFBRSxNQUFNLEVBQUUsVUFBVSxDQUFDLENBQUM7UUFDL0MsWUFBWSxDQUFDLDBCQUEwQixDQUFDLE1BQU0sRUFBRSxTQUFTLENBQUMsQ0FBQztRQUMzRCxZQUFZLENBQUMsMEJBQTBCLENBQUMsTUFBTSxFQUFFLGFBQWEsQ0FBQyxDQUFDO1FBRS9ELElBQUksYUFBYSxHQUFHLFdBQVcsQ0FBQztRQUNoQyxJQUFJLFdBQVcsSUFBSSxJQUFJLEVBQUU7WUFDdkIsWUFBWSxDQUFDLDBCQUEwQixDQUFDLE1BQU0sRUFBRSxXQUFXLENBQUMsQ0FBQztZQUM3RCxJQUFJLENBQUMsYUFBYSxDQUFDLElBQUksQ0FBQyxRQUFRLENBQUMsQ0FBQztZQUNsQyxhQUFhLEdBQUcsd0JBQXdCLENBQUM7U0FDMUM7UUFFRCxJQUFJLFlBQVksR0FBRyxXQUFXLENBQUM7UUFDL0IsSUFBSSxVQUFVLElBQUksSUFBSSxFQUFFO1lBQ3RCLFlBQVksQ0FBQywwQkFBMEIsQ0FBQyxNQUFNLEVBQUUsVUFBVSxDQUFDLENBQUM7WUFDNUQsSUFBSSxDQUFDLGFBQWEsQ0FBQyxJQUFJLENBQUMsT0FBTyxDQUFDLENBQUM7WUFDakMsWUFBWSxHQUFHLHVCQUF1QixDQUFDO1NBQ3hDO1FBRUQsSUFBSSxDQUFDLFdBQVcsR0FBRyxNQUFNLENBQUM7UUFDMUIsSUFBSSxDQUFDLFFBQVEsR0FBRzs7d0JBRUksYUFBYTt1QkFDZCxZQUFZOzs7Ozs7eURBTXNCLGVBQWU7Ozs7S0FJbkUsQ0FBQztJQUNKLENBQUM7Q0FDRiIsInNvdXJjZXNDb250ZW50IjpbIi8qKlxuICogQGxpY2Vuc2VcbiAqIENvcHlyaWdodCAyMDE4IEdvb2dsZSBMTEMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuXG4gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgXCJMaWNlbnNlXCIpO1xuICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLlxuICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0XG4gKlxuICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wXG4gKlxuICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZVxuICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gXCJBUyBJU1wiIEJBU0lTLFxuICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuXG4gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kXG4gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS5cbiAqID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4gKi9cblxuaW1wb3J0IHtiYWNrZW5kX3V0aWx9IGZyb20gJ0B0ZW5zb3JmbG93L3RmanMtY29yZSc7XG5pbXBvcnQge0dQR1BVUHJvZ3JhbX0gZnJvbSAnLi9ncGdwdV9tYXRoJztcblxuZXhwb3J0IGNsYXNzIEJhdGNoTm9ybVBhY2tlZFByb2dyYW0gaW1wbGVtZW50cyBHUEdQVVByb2dyYW0ge1xuICB2YXJpYWJsZU5hbWVzOiBzdHJpbmdbXTtcbiAgb3V0cHV0U2hhcGU6IG51bWJlcltdO1xuICB1c2VyQ29kZTogc3RyaW5nO1xuICBwYWNrZWRJbnB1dHMgPSB0cnVlO1xuICBwYWNrZWRPdXRwdXQgPSB0cnVlO1xuXG4gIGNvbnN0cnVjdG9yKFxuICAgICAgeFNoYXBlOiBudW1iZXJbXSwgbWVhblNoYXBlOiBudW1iZXJbXSwgdmFyaWFuY2VTaGFwZTogbnVtYmVyW10sXG4gICAgICBvZmZzZXRTaGFwZTogbnVtYmVyW118bnVsbCwgc2NhbGVTaGFwZTogbnVtYmVyW118bnVsbCxcbiAgICAgIHZhcmlhbmNlRXBzaWxvbjogbnVtYmVyKSB7XG4gICAgdGhpcy52YXJpYWJsZU5hbWVzID0gWyd4JywgJ21lYW4nLCAndmFyaWFuY2UnXTtcbiAgICBiYWNrZW5kX3V0aWwuYXNzZXJ0QW5kR2V0QnJvYWRjYXN0U2hhcGUoeFNoYXBlLCBtZWFuU2hhcGUpO1xuICAgIGJhY2tlbmRfdXRpbC5hc3NlcnRBbmRHZXRCcm9hZGNhc3RTaGFwZSh4U2hhcGUsIHZhcmlhbmNlU2hhcGUpO1xuXG4gICAgbGV0IG9mZnNldFNuaXBwZXQgPSAndmVjNCgwLjApJztcbiAgICBpZiAob2Zmc2V0U2hhcGUgIT0gbnVsbCkge1xuICAgICAgYmFja2VuZF91dGlsLmFzc2VydEFuZEdldEJyb2FkY2FzdFNoYXBlKHhTaGFwZSwgb2Zmc2V0U2hhcGUpO1xuICAgICAgdGhpcy52YXJpYWJsZU5hbWVzLnB1c2goJ29mZnNldCcpO1xuICAgICAgb2Zmc2V0U25pcHBldCA9ICdnZXRPZmZzZXRBdE91dENvb3JkcygpJztcbiAgICB9XG5cbiAgICBsZXQgc2NhbGVTbmlwcGV0ID0gJ3ZlYzQoMS4wKSc7XG4gICAgaWYgKHNjYWxlU2hhcGUgIT0gbnVsbCkge1xuICAgICAgYmFja2VuZF91dGlsLmFzc2VydEFuZEdldEJyb2FkY2FzdFNoYXBlKHhTaGFwZSwgc2NhbGVTaGFwZSk7XG4gICAgICB0aGlzLnZhcmlhYmxlTmFtZXMucHVzaCgnc2NhbGUnKTtcbiAgICAgIHNjYWxlU25pcHBldCA9ICdnZXRTY2FsZUF0T3V0Q29vcmRzKCknO1xuICAgIH1cblxuICAgIHRoaXMub3V0cHV0U2hhcGUgPSB4U2hhcGU7XG4gICAgdGhpcy51c2VyQ29kZSA9IGBcbiAgICAgIHZvaWQgbWFpbigpIHtcbiAgICAgICAgdmVjNCBvZmZzZXQgPSAke29mZnNldFNuaXBwZXR9O1xuICAgICAgICB2ZWM0IHNjYWxlID0gJHtzY2FsZVNuaXBwZXR9O1xuXG4gICAgICAgIHZlYzQgeCA9IGdldFhBdE91dENvb3JkcygpO1xuICAgICAgICB2ZWM0IG1lYW4gPSBnZXRNZWFuQXRPdXRDb29yZHMoKTtcbiAgICAgICAgdmVjNCB2YXJpYW5jZSA9IGdldFZhcmlhbmNlQXRPdXRDb29yZHMoKTtcblxuICAgICAgICB2ZWM0IGludiA9IHNjYWxlICogaW52ZXJzZXNxcnQodmFyaWFuY2UgKyB2ZWM0KCR7dmFyaWFuY2VFcHNpbG9ufSkpO1xuXG4gICAgICAgIHNldE91dHB1dCgoeCAtIG1lYW4pICogaW52ICsgb2Zmc2V0KTtcbiAgICAgIH1cbiAgICBgO1xuICB9XG59XG4iXX0=","/**\n * @license\n * Copyright 2020 Google LLC. All Rights Reserved.\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n * =============================================================================\n */\nimport { env, FusedBatchNorm, util } from '@tensorflow/tfjs-core';\nimport { BatchNormProgram } from '../batchnorm_gpu';\nimport { BatchNormPackedProgram } from '../batchnorm_packed_gpu';\nexport const batchNorm = ({ inputs, backend, attrs }) => {\n const { x, mean, variance, offset, scale } = inputs;\n util.assert(mean.shape.length === variance.shape.length, () => 'Batch normalization gradient requires mean and variance to have ' +\n 'equal ranks.');\n util.assert(offset == null || mean.shape.length === offset.shape.length, () => 'Batch normalization gradient requires mean and offset to have ' +\n 'equal ranks.');\n util.assert(scale == null || mean.shape.length === scale.shape.length, () => 'Batch normalization gradient requires mean and scale to have ' +\n 'equal ranks.');\n let { varianceEpsilon } = attrs;\n if (varianceEpsilon == null) {\n varianceEpsilon = 0.001;\n }\n const finalInputs = [x, mean, variance];\n let offsetShape = null;\n if (offset != null) {\n offsetShape = offset.shape;\n finalInputs.push(offset);\n }\n let scaleShape = null;\n if (scale != null) {\n scaleShape = scale.shape;\n finalInputs.push(scale);\n }\n const program = env().getBool('WEBGL_PACK_NORMALIZATION') ?\n new BatchNormPackedProgram(x.shape, mean.shape, variance.shape, offsetShape, scaleShape, varianceEpsilon) :\n new BatchNormProgram(x.shape, mean.shape, variance.shape, offsetShape, scaleShape, varianceEpsilon);\n const output = backend.runWebGLProgram(program, finalInputs, finalInputs[0].dtype);\n return output;\n};\nexport const batchNormConfig = {\n kernelName: FusedBatchNorm,\n backendName: 'webgl',\n kernelFunc: batchNorm,\n};\n//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiQmF0Y2hOb3JtLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vLi4vdGZqcy1iYWNrZW5kLXdlYmdsL3NyYy9rZXJuZWxzL0JhdGNoTm9ybS50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFDQTs7Ozs7Ozs7Ozs7Ozs7O0dBZUc7QUFFSCxPQUFPLEVBQUMsR0FBRyxFQUFFLGNBQWMsRUFBbUYsSUFBSSxFQUFDLE1BQU0sdUJBQXVCLENBQUM7QUFHakosT0FBTyxFQUFDLGdCQUFnQixFQUFDLE1BQU0sa0JBQWtCLENBQUM7QUFDbEQsT0FBTyxFQUFDLHNCQUFzQixFQUFDLE1BQU0seUJBQXlCLENBQUM7QUFFL0QsTUFBTSxDQUFDLE1BQU0sU0FBUyxHQUlILENBQUMsRUFBQyxNQUFNLEVBQUUsT0FBTyxFQUFFLEtBQUssRUFBQyxFQUFFLEVBQUU7SUFDOUMsTUFBTSxFQUFDLENBQUMsRUFBRSxJQUFJLEVBQUUsUUFBUSxFQUFFLE1BQU0sRUFBRSxLQUFLLEVBQUMsR0FBRyxNQUFNLENBQUM7SUFFbEQsSUFBSSxDQUFDLE1BQU0sQ0FDUCxJQUFJLENBQUMsS0FBSyxDQUFDLE1BQU0sS0FBSyxRQUFRLENBQUMsS0FBSyxDQUFDLE1BQU0sRUFDM0MsR0FBRyxFQUFFLENBQUMsa0VBQWtFO1FBQ3BFLGNBQWMsQ0FBQyxDQUFDO0lBQ3hCLElBQUksQ0FBQyxNQUFNLENBQ1AsTUFBTSxJQUFJLElBQUksSUFBSSxJQUFJLENBQUMsS0FBSyxDQUFDLE1BQU0sS0FBSyxNQUFNLENBQUMsS0FBSyxDQUFDLE1BQU0sRUFDM0QsR0FBRyxFQUFFLENBQUMsZ0VBQWdFO1FBQ2xFLGNBQWMsQ0FBQyxDQUFDO0lBQ3hCLElBQUksQ0FBQyxNQUFNLENBQ1AsS0FBSyxJQUFJLElBQUksSUFBSSxJQUFJLENBQUMsS0FBSyxDQUFDLE1BQU0sS0FBSyxLQUFLLENBQUMsS0FBSyxDQUFDLE1BQU0sRUFDekQsR0FBRyxFQUFFLENBQUMsK0RBQStEO1FBQ2pFLGNBQWMsQ0FBQyxDQUFDO0lBRXhCLElBQUksRUFBQyxlQUFlLEVBQUMsR0FBRyxLQUFLLENBQUM7SUFDOUIsSUFBSSxlQUFlLElBQUksSUFBSSxFQUFFO1FBQzNCLGVBQWUsR0FBRyxLQUFLLENBQUM7S0FDekI7SUFFRCxNQUFNLFdBQVcsR0FBRyxDQUFDLENBQUMsRUFBRSxJQUFJLEVBQUUsUUFBUSxDQUFDLENBQUM7SUFFeEMsSUFBSSxXQUFXLEdBQUcsSUFBSSxDQUFDO0lBQ3ZCLElBQUksTUFBTSxJQUFJLElBQUksRUFBRTtRQUNsQixXQUFXLEdBQUcsTUFBTSxDQUFDLEtBQUssQ0FBQztRQUMzQixXQUFXLENBQUMsSUFBSSxDQUFDLE1BQU0sQ0FBQyxDQUFDO0tBQzFCO0lBRUQsSUFBSSxVQUFVLEdBQUcsSUFBSSxDQUFDO0lBQ3RCLElBQUksS0FBSyxJQUFJLElBQUksRUFBRTtRQUNqQixVQUFVLEdBQUcsS0FBSyxDQUFDLEtBQUssQ0FBQztRQUN6QixXQUFXLENBQUMsSUFBSSxDQUFDLEtBQUssQ0FBQyxDQUFDO0tBQ3pCO0lBRUQsTUFBTSxPQUFPLEdBQUcsR0FBRyxFQUFFLENBQUMsT0FBTyxDQUFDLDBCQUEwQixDQUFDLENBQUMsQ0FBQztRQUN2RCxJQUFJLHNCQUFzQixDQUN0QixDQUFDLENBQUMsS0FBSyxFQUFFLElBQUksQ0FBQyxLQUFLLEVBQUUsUUFBUSxDQUFDLEtBQUssRUFBRSxXQUFXLEVBQUUsVUFBVSxFQUM1RCxlQUFlLENBQUMsQ0FBQyxDQUFDO1FBQ3RCLElBQUksZ0JBQWdCLENBQ2hCLENBQUMsQ0FBQyxLQUFLLEVBQUUsSUFBSSxDQUFDLEtBQUssRUFBRSxRQUFRLENBQUMsS0FBSyxFQUFFLFdBQVcsRUFBRSxVQUFVLEVBQzVELGVBQWUsQ0FBQyxDQUFDO0lBQ3pCLE1BQU0sTUFBTSxHQUNSLE9BQU8sQ0FBQyxlQUFlLENBQUMsT0FBTyxFQUFFLFdBQVcsRUFBRSxXQUFXLENBQUMsQ0FBQyxDQUFDLENBQUMsS0FBSyxDQUFDLENBQUM7SUFFeEUsT0FBTyxNQUFNLENBQUM7QUFDaEIsQ0FBQyxDQUFDO0FBRUYsTUFBTSxDQUFDLE1BQU0sZUFBZSxHQUFpQjtJQUMzQyxVQUFVLEVBQUUsY0FBYztJQUMxQixXQUFXLEVBQUUsT0FBTztJQUNwQixVQUFVLEVBQUUsU0FBNkI7Q0FDMUMsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbIlxuLyoqXG4gKiBAbGljZW5zZVxuICogQ29weXJpZ2h0IDIwMjAgR29vZ2xlIExMQy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC5cbiAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSBcIkxpY2Vuc2VcIik7XG4gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuXG4gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXRcbiAqXG4gKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjBcbiAqXG4gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlXG4gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiBcIkFTIElTXCIgQkFTSVMsXG4gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC5cbiAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmRcbiAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLlxuICogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbiAqL1xuXG5pbXBvcnQge2VudiwgRnVzZWRCYXRjaE5vcm0sIEZ1c2VkQmF0Y2hOb3JtQXR0cnMsIEZ1c2VkQmF0Y2hOb3JtSW5wdXRzLCBLZXJuZWxDb25maWcsIEtlcm5lbEZ1bmMsIFRlbnNvckluZm8sIHV0aWx9IGZyb20gJ0B0ZW5zb3JmbG93L3RmanMtY29yZSc7XG5cbmltcG9ydCB7TWF0aEJhY2tlbmRXZWJHTH0gZnJvbSAnLi4vYmFja2VuZF93ZWJnbCc7XG5pbXBvcnQge0JhdGNoTm9ybVByb2dyYW19IGZyb20gJy4uL2JhdGNobm9ybV9ncHUnO1xuaW1wb3J0IHtCYXRjaE5vcm1QYWNrZWRQcm9ncmFtfSBmcm9tICcuLi9iYXRjaG5vcm1fcGFja2VkX2dwdSc7XG5cbmV4cG9ydCBjb25zdCBiYXRjaE5vcm06IChwYXJhbXM6IHtcbiAgaW5wdXRzOiBGdXNlZEJhdGNoTm9ybUlucHV0cyxcbiAgYmFja2VuZDogTWF0aEJhY2tlbmRXZWJHTCxcbiAgYXR0cnM6IEZ1c2VkQmF0Y2hOb3JtQXR0cnNcbn0pID0+IFRlbnNvckluZm8gPSAoe2lucHV0cywgYmFja2VuZCwgYXR0cnN9KSA9PiB7XG4gIGNvbnN0IHt4LCBtZWFuLCB2YXJpYW5jZSwgb2Zmc2V0LCBzY2FsZX0gPSBpbnB1dHM7XG5cbiAgdXRpbC5hc3NlcnQoXG4gICAgICBtZWFuLnNoYXBlLmxlbmd0aCA9PT0gdmFyaWFuY2Uuc2hhcGUubGVuZ3RoLFxuICAgICAgKCkgPT4gJ0JhdGNoIG5vcm1hbGl6YXRpb24gZ3JhZGllbnQgcmVxdWlyZXMgbWVhbiBhbmQgdmFyaWFuY2UgdG8gaGF2ZSAnICtcbiAgICAgICAgICAnZXF1YWwgcmFua3MuJyk7XG4gIHV0aWwuYXNzZXJ0KFxuICAgICAgb2Zmc2V0ID09IG51bGwgfHwgbWVhbi5zaGFwZS5sZW5ndGggPT09IG9mZnNldC5zaGFwZS5sZW5ndGgsXG4gICAgICAoKSA9PiAnQmF0Y2ggbm9ybWFsaXphdGlvbiBncmFkaWVudCByZXF1aXJlcyBtZWFuIGFuZCBvZmZzZXQgdG8gaGF2ZSAnICtcbiAgICAgICAgICAnZXF1YWwgcmFua3MuJyk7XG4gIHV0aWwuYXNzZXJ0KFxuICAgICAgc2NhbGUgPT0gbnVsbCB8fCBtZWFuLnNoYXBlLmxlbmd0aCA9PT0gc2NhbGUuc2hhcGUubGVuZ3RoLFxuICAgICAgKCkgPT4gJ0JhdGNoIG5vcm1hbGl6YXRpb24gZ3JhZGllbnQgcmVxdWlyZXMgbWVhbiBhbmQgc2NhbGUgdG8gaGF2ZSAnICtcbiAgICAgICAgICAnZXF1YWwgcmFua3MuJyk7XG5cbiAgbGV0IHt2YXJpYW5jZUVwc2lsb259ID0gYXR0cnM7XG4gIGlmICh2YXJpYW5jZUVwc2lsb24gPT0gbnVsbCkge1xuICAgIHZhcmlhbmNlRXBzaWxvbiA9IDAuMDAxO1xuICB9XG5cbiAgY29uc3QgZmluYWxJbnB1dHMgPSBbeCwgbWVhbiwgdmFyaWFuY2VdO1xuXG4gIGxldCBvZmZzZXRTaGFwZSA9IG51bGw7XG4gIGlmIChvZmZzZXQgIT0gbnVsbCkge1xuICAgIG9mZnNldFNoYXBlID0gb2Zmc2V0LnNoYXBlO1xuICAgIGZpbmFsSW5wdXRzLnB1c2gob2Zmc2V0KTtcbiAgfVxuXG4gIGxldCBzY2FsZVNoYXBlID0gbnVsbDtcbiAgaWYgKHNjYWxlICE9IG51bGwpIHtcbiAgICBzY2FsZVNoYXBlID0gc2NhbGUuc2hhcGU7XG4gICAgZmluYWxJbnB1dHMucHVzaChzY2FsZSk7XG4gIH1cblxuICBjb25zdCBwcm9ncmFtID0gZW52KCkuZ2V0Qm9vbCgnV0VCR0xfUEFDS19OT1JNQUxJWkFUSU9OJykgP1xuICAgICAgbmV3IEJhdGNoTm9ybVBhY2tlZFByb2dyYW0oXG4gICAgICAgICAgeC5zaGFwZSwgbWVhbi5zaGFwZSwgdmFyaWFuY2Uuc2hhcGUsIG9mZnNldFNoYXBlLCBzY2FsZVNoYXBlLFxuICAgICAgICAgIHZhcmlhbmNlRXBzaWxvbikgOlxuICAgICAgbmV3IEJhdGNoTm9ybVByb2dyYW0oXG4gICAgICAgICAgeC5zaGFwZSwgbWVhbi5zaGFwZSwgdmFyaWFuY2Uuc2hhcGUsIG9mZnNldFNoYXBlLCBzY2FsZVNoYXBlLFxuICAgICAgICAgIHZhcmlhbmNlRXBzaWxvbik7XG4gIGNvbnN0IG91dHB1dCA9XG4gICAgICBiYWNrZW5kLnJ1bldlYkdMUHJvZ3JhbShwcm9ncmFtLCBmaW5hbElucHV0cywgZmluYWxJbnB1dHNbMF0uZHR5cGUpO1xuXG4gIHJldHVybiBvdXRwdXQ7XG59O1xuXG5leHBvcnQgY29uc3QgYmF0Y2hOb3JtQ29uZmlnOiBLZXJuZWxDb25maWcgPSB7XG4gIGtlcm5lbE5hbWU6IEZ1c2VkQmF0Y2hOb3JtLFxuICBiYWNrZW5kTmFtZTogJ3dlYmdsJyxcbiAga2VybmVsRnVuYzogYmF0Y2hOb3JtIGFzIHt9IGFzIEtlcm5lbEZ1bmMsXG59O1xuIl19","/**\n * @license\n * Copyright 2017 Google LLC. All Rights Reserved.\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n * =============================================================================\n */\nimport { getCoordsDataType } from './shader_compiler';\nexport class SliceProgram {\n constructor(destSize) {\n this.variableNames = ['source'];\n this.outputShape = destSize;\n this.rank = destSize.length;\n const dtype = getCoordsDataType(this.rank);\n this.customUniforms = [{ name: 'start', arrayIndex: this.rank, type: 'int' }];\n const sourceCoords = getCoords(this.rank);\n let body;\n const coordSum = destSize.map((_, i) => {\n return `sourceLoc.${coords[i]} = start[${i}] + coords.${coords[i]};`;\n });\n body = `\n ${dtype} sourceLoc;\n ${dtype} coords = getOutputCoords();\n ${coordSum.join('\\n')}\n `;\n this.userCode = `\n void main() {\n ${body}\n setOutput(getSource(${sourceCoords}));\n }\n `;\n }\n}\nconst coords = ['x', 'y', 'z', 'w', 'u', 'v'];\nfunction getCoords(rank) {\n if (rank === 1) {\n return 'sourceLoc';\n }\n else if (rank <= 6) {\n return coords.slice(0, rank).map(x => 'sourceLoc.' + x).join(',');\n }\n else {\n throw Error(`Slicing for rank ${rank} is not yet supported`);\n }\n}\n//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic2xpY2VfZ3B1LmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vdGZqcy1iYWNrZW5kLXdlYmdsL3NyYy9zbGljZV9ncHUudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUE7Ozs7Ozs7Ozs7Ozs7OztHQWVHO0FBR0gsT0FBTyxFQUFDLGlCQUFpQixFQUFjLE1BQU0sbUJBQW1CLENBQUM7QUFFakUsTUFBTSxPQUFPLFlBQVk7SUFPdkIsWUFBWSxRQUFrQjtRQU45QixrQkFBYSxHQUFHLENBQUMsUUFBUSxDQUFDLENBQUM7UUFPekIsSUFBSSxDQUFDLFdBQVcsR0FBRyxRQUFRLENBQUM7UUFDNUIsSUFBSSxDQUFDLElBQUksR0FBRyxRQUFRLENBQUMsTUFBTSxDQUFDO1FBRTVCLE1BQU0sS0FBSyxHQUFHLGlCQUFpQixDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsQ0FBQztRQUMzQyxJQUFJLENBQUMsY0FBYyxHQUFHLENBQUMsRUFBQyxJQUFJLEVBQUUsT0FBTyxFQUFFLFVBQVUsRUFBRSxJQUFJLENBQUMsSUFBSSxFQUFFLElBQUksRUFBRSxLQUFLLEVBQUMsQ0FBQyxDQUFDO1FBQzVFLE1BQU0sWUFBWSxHQUFHLFNBQVMsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLENBQUM7UUFFMUMsSUFBSSxJQUFZLENBQUM7UUFDakIsTUFBTSxRQUFRLEdBQUcsUUFBUSxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLEVBQUUsRUFBRTtZQUNyQyxPQUFPLGFBQWEsTUFBTSxDQUFDLENBQUMsQ0FBQyxZQUFZLENBQUMsY0FBYyxNQUFNLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQztRQUN2RSxDQUFDLENBQUMsQ0FBQztRQUNILElBQUksR0FBRztVQUNELEtBQUs7VUFDTCxLQUFLO1VBQ0wsUUFBUSxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUM7T0FDdEIsQ0FBQztRQUNKLElBQUksQ0FBQyxRQUFRLEdBQUc7O1VBRVYsSUFBSTs4QkFDZ0IsWUFBWTs7S0FFckMsQ0FBQztJQUNKLENBQUM7Q0FDRjtBQUVELE1BQU0sTUFBTSxHQUFHLENBQUMsR0FBRyxFQUFFLEdBQUcsRUFBRSxHQUFHLEVBQUUsR0FBRyxFQUFFLEdBQUcsRUFBRSxHQUFHLENBQUMsQ0FBQztBQUU5QyxTQUFTLFNBQVMsQ0FBQyxJQUFZO0lBQzdCLElBQUksSUFBSSxLQUFLLENBQUMsRUFBRTtRQUNkLE9BQU8sV0FBVyxDQUFDO0tBQ3BCO1NBQU0sSUFBSSxJQUFJLElBQUksQ0FBQyxFQUFFO1FBQ3BCLE9BQU8sTUFBTSxDQUFDLEtBQUssQ0FBQyxDQUFDLEVBQUUsSUFBSSxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsWUFBWSxHQUFHLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxHQUFHLENBQUMsQ0FBQztLQUNuRTtTQUFNO1FBQ0wsTUFBTSxLQUFLLENBQUMsb0JBQW9CLElBQUksdUJBQXVCLENBQUMsQ0FBQztLQUM5RDtBQUNILENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyIvKipcbiAqIEBsaWNlbnNlXG4gKiBDb3B5cmlnaHQgMjAxNyBHb29nbGUgTExDLiBBbGwgUmlnaHRzIFJlc2VydmVkLlxuICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlIFwiTGljZW5zZVwiKTtcbiAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS5cbiAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdFxuICpcbiAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMFxuICpcbiAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmVcbiAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuIFwiQVMgSVNcIiBCQVNJUyxcbiAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLlxuICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZFxuICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuXG4gKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuICovXG5cbmltcG9ydCB7R1BHUFVQcm9ncmFtfSBmcm9tICcuL2dwZ3B1X21hdGgnO1xuaW1wb3J0IHtnZXRDb29yZHNEYXRhVHlwZSwgVW5pZm9ybVR5cGV9IGZyb20gJy4vc2hhZGVyX2NvbXBpbGVyJztcblxuZXhwb3J0IGNsYXNzIFNsaWNlUHJvZ3JhbSBpbXBsZW1lbnRzIEdQR1BVUHJvZ3JhbSB7XG4gIHZhcmlhYmxlTmFtZXMgPSBbJ3NvdXJjZSddO1xuICBvdXRwdXRTaGFwZTogbnVtYmVyW107XG4gIHVzZXJDb2RlOiBzdHJpbmc7XG4gIHJhbms6IG51bWJlcjtcbiAgY3VzdG9tVW5pZm9ybXM6IEFycmF5PHtuYW1lOiBzdHJpbmc7IGFycmF5SW5kZXg6IG51bWJlcjsgdHlwZTogVW5pZm9ybVR5cGU7fT47XG5cbiAgY29uc3RydWN0b3IoZGVzdFNpemU6IG51bWJlcltdKSB7XG4gICAgdGhpcy5vdXRwdXRTaGFwZSA9IGRlc3RTaXplO1xuICAgIHRoaXMucmFuayA9IGRlc3RTaXplLmxlbmd0aDtcblxuICAgIGNvbnN0IGR0eXBlID0gZ2V0Q29vcmRzRGF0YVR5cGUodGhpcy5yYW5rKTtcbiAgICB0aGlzLmN1c3RvbVVuaWZvcm1zID0gW3tuYW1lOiAnc3RhcnQnLCBhcnJheUluZGV4OiB0aGlzLnJhbmssIHR5cGU6ICdpbnQnfV07XG4gICAgY29uc3Qgc291cmNlQ29vcmRzID0gZ2V0Q29vcmRzKHRoaXMucmFuayk7XG5cbiAgICBsZXQgYm9keTogc3RyaW5nO1xuICAgIGNvbnN0IGNvb3JkU3VtID0gZGVzdFNpemUubWFwKChfLCBpKSA9PiB7XG4gICAgICByZXR1cm4gYHNvdXJjZUxvYy4ke2Nvb3Jkc1tpXX0gPSBzdGFydFske2l9XSArIGNvb3Jkcy4ke2Nvb3Jkc1tpXX07YDtcbiAgICB9KTtcbiAgICBib2R5ID0gYFxuICAgICAgICAke2R0eXBlfSBzb3VyY2VMb2M7XG4gICAgICAgICR7ZHR5cGV9IGNvb3JkcyA9IGdldE91dHB1dENvb3JkcygpO1xuICAgICAgICAke2Nvb3JkU3VtLmpvaW4oJ1xcbicpfVxuICAgICAgYDtcbiAgICB0aGlzLnVzZXJDb2RlID0gYFxuICAgICAgdm9pZCBtYWluKCkge1xuICAgICAgICAke2JvZHl9XG4gICAgICAgIHNldE91dHB1dChnZXRTb3VyY2UoJHtzb3VyY2VDb29yZHN9KSk7XG4gICAgICB9XG4gICAgYDtcbiAgfVxufVxuXG5jb25zdCBjb29yZHMgPSBbJ3gnLCAneScsICd6JywgJ3cnLCAndScsICd2J107XG5cbmZ1bmN0aW9uIGdldENvb3JkcyhyYW5rOiBudW1iZXIpOiBzdHJpbmcge1xuICBpZiAocmFuayA9PT0gMSkge1xuICAgIHJldHVybiAnc291cmNlTG9jJztcbiAgfSBlbHNlIGlmIChyYW5rIDw9IDYpIHtcbiAgICByZXR1cm4gY29vcmRzLnNsaWNlKDAsIHJhbmspLm1hcCh4ID0+ICdzb3VyY2VMb2MuJyArIHgpLmpvaW4oJywnKTtcbiAgfSBlbHNlIHtcbiAgICB0aHJvdyBFcnJvcihgU2xpY2luZyBmb3IgcmFuayAke3Jhbmt9IGlzIG5vdCB5ZXQgc3VwcG9ydGVkYCk7XG4gIH1cbn1cbiJdfQ==","/**\n * @license\n * Copyright 2019 Google LLC. All Rights Reserved.\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n * =============================================================================\n */\nimport { getChannels } from './packing_util';\nimport { getCoordsDataType } from './shader_compiler';\nexport class SlicePackedProgram {\n constructor(destSize) {\n this.variableNames = ['source'];\n this.packedInputs = true;\n this.packedOutput = true;\n this.outputShape = destSize;\n this.rank = destSize.length;\n this.customUniforms = [{ name: 'start', arrayIndex: this.rank, type: 'int' }];\n const dtype = getCoordsDataType(this.rank);\n const coords = getChannels('coords', this.rank);\n const sourceLoc = getChannels('sourceLoc', this.rank);\n const innerDims = this.rank === 1 ? 'sourceLoc' : `vec2(${sourceLoc.slice(-2).join()})`;\n const getChannel = `getChannel(getSource(${sourceLoc.join()}), ${innerDims})`;\n const upperRow = `\n result.x = ${getChannel};\n if (++${coords[this.rank - 1]} < ${destSize[this.rank - 1]}) {\n ++${sourceLoc[this.rank - 1]};\n result.y = ${getChannel};\n --${sourceLoc[this.rank - 1]};\n }\n `;\n const lowerRow = this.rank === 1 ? '' : `\n --${coords[this.rank - 1]};\n if (++${coords[this.rank - 2]} < ${destSize[this.rank - 2]}) {\n ++${sourceLoc[this.rank - 2]};\n result.z = ${getChannel};\n if (++${coords[this.rank - 1]} < ${destSize[this.rank - 1]}) {\n ++${sourceLoc[this.rank - 1]};\n result.w = ${getChannel};\n }\n }\n `;\n const sourceLocSetup = this.rank <= 4 ?\n `sourceLoc = coords +\n ${dtype}(${destSize.map((_, i) => `start[${i}]`).join()});` :\n destSize.map((_, i) => `${sourceLoc[i]} = ${coords[i]} + start[${i}];`)\n .join('\\n');\n this.userCode = `\n void main() {\n ${dtype} coords = getOutputCoords();\n ${dtype} sourceLoc;\n ${sourceLocSetup}\n vec4 result = vec4(0.);\n ${upperRow}\n ${lowerRow}\n setOutput(result);\n }\n `;\n }\n}\n//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic2xpY2VfcGFja2VkX2dwdS5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uL3RmanMtYmFja2VuZC13ZWJnbC9zcmMvc2xpY2VfcGFja2VkX2dwdS50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQTs7Ozs7Ozs7Ozs7Ozs7O0dBZUc7QUFHSCxPQUFPLEVBQUMsV0FBVyxFQUFDLE1BQU0sZ0JBQWdCLENBQUM7QUFDM0MsT0FBTyxFQUFDLGlCQUFpQixFQUFjLE1BQU0sbUJBQW1CLENBQUM7QUFFakUsTUFBTSxPQUFPLGtCQUFrQjtJQVM3QixZQUFZLFFBQWtCO1FBUjlCLGtCQUFhLEdBQUcsQ0FBQyxRQUFRLENBQUMsQ0FBQztRQUMzQixpQkFBWSxHQUFHLElBQUksQ0FBQztRQUNwQixpQkFBWSxHQUFHLElBQUksQ0FBQztRQU9sQixJQUFJLENBQUMsV0FBVyxHQUFHLFFBQVEsQ0FBQztRQUM1QixJQUFJLENBQUMsSUFBSSxHQUFHLFFBQVEsQ0FBQyxNQUFNLENBQUM7UUFDNUIsSUFBSSxDQUFDLGNBQWMsR0FBRyxDQUFDLEVBQUMsSUFBSSxFQUFFLE9BQU8sRUFBRSxVQUFVLEVBQUUsSUFBSSxDQUFDLElBQUksRUFBRSxJQUFJLEVBQUUsS0FBSyxFQUFDLENBQUMsQ0FBQztRQUM1RSxNQUFNLEtBQUssR0FBRyxpQkFBaUIsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLENBQUM7UUFDM0MsTUFBTSxNQUFNLEdBQUcsV0FBVyxDQUFDLFFBQVEsRUFBRSxJQUFJLENBQUMsSUFBSSxDQUFDLENBQUM7UUFDaEQsTUFBTSxTQUFTLEdBQUcsV0FBVyxDQUFDLFdBQVcsRUFBRSxJQUFJLENBQUMsSUFBSSxDQUFDLENBQUM7UUFFdEQsTUFBTSxTQUFTLEdBQ1gsSUFBSSxDQUFDLElBQUksS0FBSyxDQUFDLENBQUMsQ0FBQyxDQUFDLFdBQVcsQ0FBQyxDQUFDLENBQUMsUUFBUSxTQUFTLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxFQUFFLEdBQUcsQ0FBQztRQUMxRSxNQUFNLFVBQVUsR0FDWix3QkFBd0IsU0FBUyxDQUFDLElBQUksRUFBRSxNQUFNLFNBQVMsR0FBRyxDQUFDO1FBQy9ELE1BQU0sUUFBUSxHQUFHO21CQUNGLFVBQVU7Y0FDZixNQUFNLENBQUMsSUFBSSxDQUFDLElBQUksR0FBRyxDQUFDLENBQUMsTUFBTSxRQUFRLENBQUMsSUFBSSxDQUFDLElBQUksR0FBRyxDQUFDLENBQUM7WUFDcEQsU0FBUyxDQUFDLElBQUksQ0FBQyxJQUFJLEdBQUcsQ0FBQyxDQUFDO3FCQUNmLFVBQVU7WUFDbkIsU0FBUyxDQUFDLElBQUksQ0FBQyxJQUFJLEdBQUcsQ0FBQyxDQUFDOztLQUUvQixDQUFDO1FBQ0YsTUFBTSxRQUFRLEdBQUcsSUFBSSxDQUFDLElBQUksS0FBSyxDQUFDLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUM7VUFDbEMsTUFBTSxDQUFDLElBQUksQ0FBQyxJQUFJLEdBQUcsQ0FBQyxDQUFDO2NBQ2pCLE1BQU0sQ0FBQyxJQUFJLENBQUMsSUFBSSxHQUFHLENBQUMsQ0FBQyxNQUFNLFFBQVEsQ0FBQyxJQUFJLENBQUMsSUFBSSxHQUFHLENBQUMsQ0FBQztZQUNwRCxTQUFTLENBQUMsSUFBSSxDQUFDLElBQUksR0FBRyxDQUFDLENBQUM7cUJBQ2YsVUFBVTtnQkFDZixNQUFNLENBQUMsSUFBSSxDQUFDLElBQUksR0FBRyxDQUFDLENBQUMsTUFBTSxRQUFRLENBQUMsSUFBSSxDQUFDLElBQUksR0FBRyxDQUFDLENBQUM7Y0FDcEQsU0FBUyxDQUFDLElBQUksQ0FBQyxJQUFJLEdBQUcsQ0FBQyxDQUFDO3VCQUNmLFVBQVU7OztLQUc1QixDQUFDO1FBRUYsTUFBTSxjQUFjLEdBQUcsSUFBSSxDQUFDLElBQUksSUFBSSxDQUFDLENBQUMsQ0FBQztZQUNuQztjQUNNLEtBQUssSUFBSSxRQUFRLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsRUFBRSxFQUFFLENBQUMsU0FBUyxDQUFDLEdBQUcsQ0FBQyxDQUFDLElBQUksRUFBRSxJQUFJLENBQUMsQ0FBQztZQUNqRSxRQUFRLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsRUFBRSxFQUFFLENBQUMsR0FBRyxTQUFTLENBQUMsQ0FBQyxDQUFDLE1BQU0sTUFBTSxDQUFDLENBQUMsQ0FBQyxZQUFZLENBQUMsSUFBSSxDQUFDO2lCQUNsRSxJQUFJLENBQUMsSUFBSSxDQUFDLENBQUM7UUFDcEIsSUFBSSxDQUFDLFFBQVEsR0FBRzs7VUFFVixLQUFLO1VBQ0wsS0FBSztVQUNMLGNBQWM7O1VBRWQsUUFBUTtVQUNSLFFBQVE7OztLQUdiLENBQUM7SUFDSixDQUFDO0NBQ0YiLCJzb3VyY2VzQ29udGVudCI6WyIvKipcbiAqIEBsaWNlbnNlXG4gKiBDb3B5cmlnaHQgMjAxOSBHb29nbGUgTExDLiBBbGwgUmlnaHRzIFJlc2VydmVkLlxuICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlIFwiTGljZW5zZVwiKTtcbiAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS5cbiAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdFxuICpcbiAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMFxuICpcbiAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmVcbiAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuIFwiQVMgSVNcIiBCQVNJUyxcbiAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLlxuICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZFxuICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuXG4gKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuICovXG5cbmltcG9ydCB7R1BHUFVQcm9ncmFtfSBmcm9tICcuL2dwZ3B1X21hdGgnO1xuaW1wb3J0IHtnZXRDaGFubmVsc30gZnJvbSAnLi9wYWNraW5nX3V0aWwnO1xuaW1wb3J0IHtnZXRDb29yZHNEYXRhVHlwZSwgVW5pZm9ybVR5cGV9IGZyb20gJy4vc2hhZGVyX2NvbXBpbGVyJztcblxuZXhwb3J0IGNsYXNzIFNsaWNlUGFja2VkUHJvZ3JhbSBpbXBsZW1lbnRzIEdQR1BVUHJvZ3JhbSB7XG4gIHZhcmlhYmxlTmFtZXMgPSBbJ3NvdXJjZSddO1xuICBwYWNrZWRJbnB1dHMgPSB0cnVlO1xuICBwYWNrZWRPdXRwdXQgPSB0cnVlO1xuICBvdXRwdXRTaGFwZTogbnVtYmVyW107XG4gIHVzZXJDb2RlOiBzdHJpbmc7XG4gIHJhbms6IG51bWJlcjtcbiAgY3VzdG9tVW5pZm9ybXM6IEFycmF5PHtuYW1lOiBzdHJpbmc7IGFycmF5SW5kZXg6IG51bWJlcjsgdHlwZTogVW5pZm9ybVR5cGU7fT47XG5cbiAgY29uc3RydWN0b3IoZGVzdFNpemU6IG51bWJlcltdKSB7XG4gICAgdGhpcy5vdXRwdXRTaGFwZSA9IGRlc3RTaXplO1xuICAgIHRoaXMucmFuayA9IGRlc3RTaXplLmxlbmd0aDtcbiAgICB0aGlzLmN1c3RvbVVuaWZvcm1zID0gW3tuYW1lOiAnc3RhcnQnLCBhcnJheUluZGV4OiB0aGlzLnJhbmssIHR5cGU6ICdpbnQnfV07XG4gICAgY29uc3QgZHR5cGUgPSBnZXRDb29yZHNEYXRhVHlwZSh0aGlzLnJhbmspO1xuICAgIGNvbnN0IGNvb3JkcyA9IGdldENoYW5uZWxzKCdjb29yZHMnLCB0aGlzLnJhbmspO1xuICAgIGNvbnN0IHNvdXJjZUxvYyA9IGdldENoYW5uZWxzKCdzb3VyY2VMb2MnLCB0aGlzLnJhbmspO1xuXG4gICAgY29uc3QgaW5uZXJEaW1zID1cbiAgICAgICAgdGhpcy5yYW5rID09PSAxID8gJ3NvdXJjZUxvYycgOiBgdmVjMigke3NvdXJjZUxvYy5zbGljZSgtMikuam9pbigpfSlgO1xuICAgIGNvbnN0IGdldENoYW5uZWwgPVxuICAgICAgICBgZ2V0Q2hhbm5lbChnZXRTb3VyY2UoJHtzb3VyY2VMb2Muam9pbigpfSksICR7aW5uZXJEaW1zfSlgO1xuICAgIGNvbnN0IHVwcGVyUm93ID0gYFxuICAgICAgcmVzdWx0LnggPSAke2dldENoYW5uZWx9O1xuICAgICAgaWYgKCsrJHtjb29yZHNbdGhpcy5yYW5rIC0gMV19IDwgJHtkZXN0U2l6ZVt0aGlzLnJhbmsgLSAxXX0pIHtcbiAgICAgICAgKyske3NvdXJjZUxvY1t0aGlzLnJhbmsgLSAxXX07XG4gICAgICAgIHJlc3VsdC55ID0gJHtnZXRDaGFubmVsfTtcbiAgICAgICAgLS0ke3NvdXJjZUxvY1t0aGlzLnJhbmsgLSAxXX07XG4gICAgICB9XG4gICAgYDtcbiAgICBjb25zdCBsb3dlclJvdyA9IHRoaXMucmFuayA9PT0gMSA/ICcnIDogYFxuICAgICAgLS0ke2Nvb3Jkc1t0aGlzLnJhbmsgLSAxXX07XG4gICAgICBpZiAoKyske2Nvb3Jkc1t0aGlzLnJhbmsgLSAyXX0gPCAke2Rlc3RTaXplW3RoaXMucmFuayAtIDJdfSkge1xuICAgICAgICArKyR7c291cmNlTG9jW3RoaXMucmFuayAtIDJdfTtcbiAgICAgICAgcmVzdWx0LnogPSAke2dldENoYW5uZWx9O1xuICAgICAgICBpZiAoKyske2Nvb3Jkc1t0aGlzLnJhbmsgLSAxXX0gPCAke2Rlc3RTaXplW3RoaXMucmFuayAtIDFdfSkge1xuICAgICAgICAgICsrJHtzb3VyY2VMb2NbdGhpcy5yYW5rIC0gMV19O1xuICAgICAgICAgIHJlc3VsdC53ID0gJHtnZXRDaGFubmVsfTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgIGA7XG5cbiAgICBjb25zdCBzb3VyY2VMb2NTZXR1cCA9IHRoaXMucmFuayA8PSA0ID9cbiAgICAgICAgYHNvdXJjZUxvYyA9IGNvb3JkcyArXG4gICAgICAgICAgICAke2R0eXBlfSgke2Rlc3RTaXplLm1hcCgoXywgaSkgPT4gYHN0YXJ0WyR7aX1dYCkuam9pbigpfSk7YCA6XG4gICAgICAgIGRlc3RTaXplLm1hcCgoXywgaSkgPT4gYCR7c291cmNlTG9jW2ldfSA9ICR7Y29vcmRzW2ldfSArIHN0YXJ0WyR7aX1dO2ApXG4gICAgICAgICAgICAuam9pbignXFxuJyk7XG4gICAgdGhpcy51c2VyQ29kZSA9IGBcbiAgICAgIHZvaWQgbWFpbigpIHtcbiAgICAgICAgJHtkdHlwZX0gY29vcmRzID0gZ2V0T3V0cHV0Q29vcmRzKCk7XG4gICAgICAgICR7ZHR5cGV9IHNvdXJjZUxvYztcbiAgICAgICAgJHtzb3VyY2VMb2NTZXR1cH1cbiAgICAgICAgdmVjNCByZXN1bHQgPSB2ZWM0KDAuKTtcbiAgICAgICAgJHt1cHBlclJvd31cbiAgICAgICAgJHtsb3dlclJvd31cbiAgICAgICAgc2V0T3V0cHV0KHJlc3VsdCk7XG4gICAgICB9XG4gICAgYDtcbiAgfVxufVxuIl19","/**\n * @license\n * Copyright 2020 Google LLC. All Rights Reserved.\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n * =============================================================================\n */\nimport { env, Slice, slice_util, util } from '@tensorflow/tfjs-core';\nimport { sliceImplCPU } from '../kernel_utils/shared';\nimport { SliceProgram } from '../slice_gpu';\nimport { SlicePackedProgram } from '../slice_packed_gpu';\nfunction shallowSlice(x, begin, size, backend) {\n const xTexData = backend.texData.get(x.dataId);\n const t = backend.makeTensorInfo(size, x.dtype);\n const newTexData = backend.texData.get(t.dataId);\n // Copy texture data from the original tensor.\n Object.assign(newTexData, xTexData);\n newTexData.refCount = 1;\n newTexData.shape = size;\n newTexData.dtype = x.dtype;\n let flatOffset = slice_util.computeFlatOffset(begin, util.computeStrides(x.shape));\n if (xTexData.slice) {\n // We are slicing an already sliced tensor, so we have to accumulate\n // the offset.\n flatOffset += xTexData.slice.flatOffset;\n }\n newTexData.slice = {\n flatOffset,\n // Point to the original dataId, which is used to do ref counting.\n origDataId: xTexData.slice && xTexData.slice.origDataId || x.dataId\n };\n // Increase the ref count for that data bucket.\n const refCount = backend.dataRefCount.get(newTexData.slice.origDataId) || 1;\n backend.dataRefCount.set(newTexData.slice.origDataId, refCount + 1);\n return t;\n}\nexport function slice(args) {\n const { inputs, backend, attrs } = args;\n const { x } = inputs;\n const { begin, size } = attrs;\n const [$begin, $size] = slice_util.parseSliceParams(x, begin, size);\n slice_util.assertParamsValid(x, $begin, $size);\n if (util.sizeFromShape($size) === 0) {\n return backend.makeTensorInfo($size, x.dtype, []);\n }\n // Run on cpu if dtype is string. For string, the backend represents it\n // as Uint8Array[], where each Uint8Array is a character. Given that the\n // computation is only on the outer array, uploading the whole data onto\n // gpu is wasteful. Also, currently webgl doesn't have a design to\n // upload and retrieve Uint8Array[] between cpu and gpu. Therefore, we\n // just run the kernel on cpu if dtype is string.\n if (backend.shouldExecuteOnCPU([x]) || x.dtype === 'string') {\n const xTexData = backend.texData.get(x.dataId);\n const outValues = sliceImplCPU(xTexData.values, $begin, $size, x.shape, x.dtype);\n return backend.makeTensorInfo($size, x.dtype, outValues);\n }\n const { isPacked } = backend.texData.get(x.dataId);\n const isContinous = slice_util.isSliceContinous(x.shape, $begin, $size);\n if (isPacked || !isContinous) {\n const program = env().getBool('WEBGL_PACK_ARRAY_OPERATIONS') ?\n new SlicePackedProgram($size) :\n new SliceProgram($size);\n const customValues = [$begin];\n return backend.runWebGLProgram(program, [x], x.dtype, customValues);\n }\n backend.uploadToGPU(x.dataId);\n return shallowSlice(x, $begin, $size, backend);\n}\nexport const sliceConfig = {\n kernelName: Slice,\n backendName: 'webgl',\n kernelFunc: slice\n};\n//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiU2xpY2UuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi8uLi90ZmpzLWJhY2tlbmQtd2ViZ2wvc3JjL2tlcm5lbHMvU2xpY2UudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUE7Ozs7Ozs7Ozs7Ozs7OztHQWVHO0FBRUgsT0FBTyxFQUFDLEdBQUcsRUFBNEIsS0FBSyxFQUFFLFVBQVUsRUFBbUQsSUFBSSxFQUFDLE1BQU0sdUJBQXVCLENBQUM7QUFHOUksT0FBTyxFQUFDLFlBQVksRUFBQyxNQUFNLHdCQUF3QixDQUFDO0FBQ3BELE9BQU8sRUFBQyxZQUFZLEVBQUMsTUFBTSxjQUFjLENBQUM7QUFDMUMsT0FBTyxFQUFDLGtCQUFrQixFQUFDLE1BQU0scUJBQXFCLENBQUM7QUFFdkQsU0FBUyxZQUFZLENBQ2pCLENBQWEsRUFBRSxLQUFlLEVBQUUsSUFBYyxFQUFFLE9BQXlCO0lBQzNFLE1BQU0sUUFBUSxHQUFHLE9BQU8sQ0FBQyxPQUFPLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxNQUFNLENBQUMsQ0FBQztJQUMvQyxNQUFNLENBQUMsR0FBRyxPQUFPLENBQUMsY0FBYyxDQUFDLElBQUksRUFBRSxDQUFDLENBQUMsS0FBSyxDQUFDLENBQUM7SUFDaEQsTUFBTSxVQUFVLEdBQUcsT0FBTyxDQUFDLE9BQU8sQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLE1BQU0sQ0FBQyxDQUFDO0lBQ2pELDhDQUE4QztJQUM5QyxNQUFNLENBQUMsTUFBTSxDQUFDLFVBQVUsRUFBRSxRQUFRLENBQUMsQ0FBQztJQUNwQyxVQUFVLENBQUMsUUFBUSxHQUFHLENBQUMsQ0FBQztJQUN4QixVQUFVLENBQUMsS0FBSyxHQUFHLElBQUksQ0FBQztJQUN4QixVQUFVLENBQUMsS0FBSyxHQUFHLENBQUMsQ0FBQyxLQUFLLENBQUM7SUFDM0IsSUFBSSxVQUFVLEdBQ1YsVUFBVSxDQUFDLGlCQUFpQixDQUFDLEtBQUssRUFBRSxJQUFJLENBQUMs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NUIsTUFBTSxZQUFZLEdBQUcsQ0FBQyxNQUFNLENBQUMsQ0FBQztRQUM5QixPQUFPLE9BQU8sQ0FBQyxlQUFlLENBQUMsT0FBTyxFQUFFLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLEtBQUssRUFBRSxZQUFZLENBQUMsQ0FBQztLQUNyRTtJQUNELE9BQU8sQ0FBQyxXQUFXLENBQUMsQ0FBQyxDQUFDLE1BQU0sQ0FBQyxDQUFDO0lBQzlCLE9BQU8sWUFBWSxDQUFDLENBQUMsRUFBRSxNQUFNLEVBQUUsS0FBSyxFQUFFLE9BQU8sQ0FBQyxDQUFDO0FBQ2pELENBQUM7QUFFRCxNQUFNLENBQUMsTUFBTSxXQUFXLEdBQWlCO0lBQ3ZDLFVBQVUsRUFBRSxLQUFLO0lBQ2pCLFdBQVcsRUFBRSxPQUFPO0lBQ3BCLFVBQVUsRUFBRSxLQUF5QjtDQUN0QyxDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiLyoqXG4gKiBAbGljZW5zZVxuICogQ29weXJpZ2h0IDIwMjAgR29vZ2xlIExMQy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC5cbiAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSBcIkxpY2Vuc2VcIik7XG4gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuXG4gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXRcbiAqXG4gKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjBcbiAqXG4gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlXG4gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiBcIkFTIElTXCIgQkFTSVMsXG4gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC5cbiAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmRcbiAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLlxuICogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbiAqL1xuXG5pbXBvcnQge2VudiwgS2VybmVsQ29uZmlnLCBLZXJuZWxGdW5jLCBTbGljZSwgc2xpY2VfdXRpbCwgU2xpY2VBdHRycywgU2xpY2VJbnB1dHMsIFRlbnNvckluZm8sIFR5cGVkQXJyYXksIHV0aWx9IGZyb20gJ0B0ZW5zb3JmbG93L3RmanMtY29yZSc7XG5cbmltcG9ydCB7TWF0aEJhY2tlbmRXZWJHTH0gZnJvbSAnLi4vYmFja2VuZF93ZWJnbCc7XG5pbXBvcnQge3NsaWNlSW1wbENQVX0gZnJvbSAnLi4va2VybmVsX3V0aWxzL3NoYXJlZCc7XG5pbXBvcnQge1NsaWNlUHJvZ3JhbX0gZnJvbSAnLi4vc2xpY2VfZ3B1JztcbmltcG9ydCB7U2xpY2VQYWNrZWRQcm9ncmFtfSBmcm9tICcuLi9zbGljZV9wYWNrZWRfZ3B1JztcblxuZnVuY3Rpb24gc2hhbGxvd1NsaWNlKFxuICAgIHg6IFRlbnNvckluZm8sIGJlZ2luOiBudW1iZXJbXSwgc2l6ZTogbnVtYmVyW10sIGJhY2tlbmQ6IE1hdGhCYWNrZW5kV2ViR0wpIHtcbiAgY29uc3QgeFRleERhdGEgPSBiYWNrZW5kLnRleERhdGEuZ2V0KHguZGF0YUlkKTtcbiAgY29uc3QgdCA9IGJhY2tlbmQubWFrZVRlbnNvckluZm8oc2l6ZSwgeC5kdHlwZSk7XG4gIGNvbnN0IG5ld1RleERhdGEgPSBiYWNrZW5kLnRleERhdGEuZ2V0KHQuZGF0YUlkKTtcbiAgLy8gQ29weSB0ZXh0dXJlIGRhdGEgZnJvbSB0aGUgb3JpZ2luYWwgdGVuc29yLlxuICBPYmplY3QuYXNzaWduKG5ld1RleERhdGEsIHhUZXhEYXRhKTtcbiAgbmV3VGV4RGF0YS5yZWZDb3VudCA9IDE7XG4gIG5ld1RleERhdGEuc2hhcGUgPSBzaXplO1xuICBuZXdUZXhEYXRhLmR0eXBlID0geC5kdHlwZTtcbiAgbGV0IGZsYXRPZmZzZXQgPVxuICAgICAgc2xpY2VfdXRpbC5jb21wdXRlRmxhdE9mZnNldChiZWdpbiwgdXRpbC5jb21wdXRlU3RyaWRlcyh4LnNoYXBlKSk7XG4gIGlmICh4VGV4RGF0YS5zbGljZSkge1xuICAgIC8vIFdlIGFyZSBzbGljaW5nIGFuIGFscmVhZHkgc2xpY2VkIHRlbnNvciwgc28gd2UgaGF2ZSB0byBhY2N1bXVsYXRlXG4gICAgLy8gdGhlIG9mZnNldC5cbiAgICBmbGF0T2Zmc2V0ICs9IHhUZXhEYXRhLnNsaWNlLmZsYXRPZmZzZXQ7XG4gIH1cbiAgbmV3VGV4RGF0YS5zbGljZSA9IHtcbiAgICBmbGF0T2Zmc2V0LFxuICAgIC8vIFBvaW50IHRvIHRoZSBvcmlnaW5hbCBkYXRhSWQsIHdoaWNoIGlzIHVzZWQgdG8gZG8gcmVmIGNvdW50aW5nLlxuICAgIG9yaWdEYXRhSWQ6IHhUZXhEYXRhLnNsaWNlICYmIHhUZXhEYXRhLnNsaWNlLm9yaWdEYXRhSWQgfHwgeC5kYXRhSWRcbiAgfTtcblxuICAvLyBJbmNyZWFzZSB0aGUgcmVmIGNvdW50IGZvciB0aGF0IGRhdGEgYnVja2V0LlxuICBjb25zdCByZWZDb3VudCA9IGJhY2tlbmQuZGF0YVJlZkNvdW50LmdldChuZXdUZXhEYXRhLnNsaWNlLm9yaWdEYXRhSWQpIHx8IDE7XG4gIGJhY2tlbmQuZGF0YVJlZkNvdW50LnNldChuZXdUZXhEYXRhLnNsaWNlLm9yaWdEYXRhSWQsIHJlZkNvdW50ICsgMSk7XG4gIHJldHVybiB0O1xufVxuXG5leHBvcnQgZnVuY3Rpb24gc2xpY2UoXG4gICAgYXJnczoge2lucHV0czogU2xpY2VJbnB1dHMsIGJhY2tlbmQ6IE1hdGhCYWNrZW5kV2ViR0wsIGF0dHJzOiBTbGljZUF0dHJzfSk6XG4gICAgVGVuc29ySW5mbyB7XG4gIGNvbnN0IHtpbnB1dHMsIGJhY2tlbmQsIGF0dHJzfSA9IGFyZ3M7XG4gIGNvbnN0IHt4fSA9IGlucHV0cztcbiAgY29uc3Qge2JlZ2luLCBzaXplfSA9IGF0dHJzO1xuXG4gIGNvbnN0IFskYmVnaW4sICRzaXplXSA9IHNsaWNlX3V0aWwucGFyc2VTbGljZVBhcmFtcyh4LCBiZWdpbiwgc2l6ZSk7XG4gIHNsaWNlX3V0aWwuYXNzZXJ0UGFyYW1zVmFsaWQoeCwgJGJlZ2luLCAkc2l6ZSk7XG5cbiAgaWYgKHV0aWwuc2l6ZUZyb21TaGFwZSgkc2l6ZSkgPT09IDApIHtcbiAgICByZXR1cm4gYmFja2VuZC5tYWtlVGVuc29ySW5mbygkc2l6ZSwgeC5kdHlwZSwgW10pO1xuICB9XG5cbiAgLy8gUnVuIG9uIGNwdSBpZiBkdHlwZSBpcyBzdHJpbmcuIEZvciBzdHJpbmcsIHRoZSBiYWNrZW5kIHJlcHJlc2VudHMgaXRcbiAgLy8gYXMgVWludDhBcnJheVtdLCB3aGVyZSBlYWNoIFVpbnQ4QXJyYXkgaXMgYSBjaGFyYWN0ZXIuIEdpdmVuIHRoYXQgdGhlXG4gIC8vIGNvbXB1dGF0aW9uIGlzIG9ubHkgb24gdGhlIG91dGVyIGFycmF5LCB1cGxvYWRpbmcgdGhlIHdob2xlIGRhdGEgb250b1xuICAvLyBncHUgaXMgd2FzdGVmdWwuIEFsc28sIGN1cnJlbnRseSB3ZWJnbCBkb2Vzbid0IGhhdmUgYSBkZXNpZ24gdG9cbiAgLy8gdXBsb2FkIGFuZCByZXRyaWV2ZSBVaW50OEFycmF5W10gYmV0d2VlbiBjcHUgYW5kIGdwdS4gVGhlcmVmb3JlLCB3ZVxuICAvLyBqdXN0IHJ1biB0aGUga2VybmVsIG9uIGNwdSBpZiBkdHlwZSBpcyBzdHJpbmcuXG4gIGlmIChiYWNrZW5kLnNob3VsZEV4ZWN1dGVPbkNQVShbeF0pIHx8IHguZHR5cGUgPT09ICdzdHJpbmcnKSB7XG4gICAgY29uc3QgeFRleERhdGEgPSBiYWNrZW5kLnRleERhdGEuZ2V0KHguZGF0YUlkKTtcbiAgICBjb25zdCBvdXRWYWx1ZXMgPSBzbGljZUltcGxDUFUoXG4gICAgICAgIHhUZXhEYXRhLnZhbHVlcyBhcyBUeXBlZEFycmF5LCAkYmVnaW4sICRzaXplLCB4LnNoYXBlLCB4LmR0eXBlKTtcbiAgICByZXR1cm4gYmFja2VuZC5tYWtlVGVuc29ySW5mbygkc2l6ZSwgeC5kdHlwZSwgb3V0VmFsdWVzKTtcbiAgfVxuXG4gIGNvbnN0IHtpc1BhY2tlZH0gPSBiYWNrZW5kLnRleERhdGEuZ2V0KHguZGF0YUlkKTtcbiAgY29uc3QgaXNDb250aW5vdXMgPSBzbGljZV91dGlsLmlzU2xpY2VDb250aW5vdXMoeC5zaGFwZSwgJGJlZ2luLCAkc2l6ZSk7XG4gIGlmIChpc1BhY2tlZCB8fCAhaXNDb250aW5vdXMpIHtcbiAgICBjb25zdCBwcm9ncmFtID0gZW52KCkuZ2V0Qm9vbCgnV0VCR0xfUEFDS19BUlJBWV9PUEVSQVRJT05TJykgP1xuICAgICAgICBuZXcgU2xpY2VQYWNrZWRQcm9ncmFtKCRzaXplKSA6XG4gICAgICAgIG5ldyBTbGljZVByb2dyYW0oJHNpemUpO1xuICAgIGNvbnN0IGN1c3RvbVZhbHVlcyA9IFskYmVnaW5dO1xuICAgIHJldHVybiBiYWNrZW5kLnJ1bldlYkdMUHJvZ3JhbShwcm9ncmFtLCBbeF0sIHguZHR5cGUsIGN1c3RvbVZhbHVlcyk7XG4gIH1cbiAgYmFja2VuZC51cGxvYWRUb0dQVSh4LmRhdGFJZCk7XG4gIHJldHVybiBzaGFsbG93U2xpY2UoeCwgJGJlZ2luLCAkc2l6ZSwgYmFja2VuZCk7XG59XG5cbmV4cG9ydCBjb25zdCBzbGljZUNvbmZpZzogS2VybmVsQ29uZmlnID0ge1xuICBrZXJuZWxOYW1lOiBTbGljZSxcbiAgYmFja2VuZE5hbWU6ICd3ZWJnbCcsXG4gIGtlcm5lbEZ1bmM6IHNsaWNlIGFzIHt9IGFzIEtlcm5lbEZ1bmNcbn07XG4iXX0=","/**\n * @license\n * Copyright 2020 Google LLC. All Rights Reserved.\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n * =============================================================================\n */\nimport { backend_util, BatchToSpaceND, util } from '@tensorflow/tfjs-core';\nimport { reshape } from './Reshape';\nimport { slice } from './Slice';\nimport { transpose } from './Transpose';\nexport const batchToSpaceND = (args) => {\n const { inputs, backend, attrs } = args;\n const { x } = inputs;\n const { blockShape, crops } = attrs;\n util.assert(x.shape.length <= 4, () => 'batchToSpaceND for rank > 4 with a WebGL backend not ' +\n 'implemented yet');\n const prod = blockShape.reduce((a, b) => a * b);\n const reshaped = backend_util.getReshaped(x.shape, blockShape, prod);\n const permuted = backend_util.getPermuted(reshaped.length, blockShape.length);\n const reshapedPermuted = backend_util.getReshapedPermuted(x.shape, blockShape, prod);\n const sliceBeginCoords = backend_util.getSliceBeginCoords(crops, blockShape.length);\n const sliceSize = backend_util.getSliceSize(reshapedPermuted, crops, blockShape.length);\n const toDispose = [];\n const reshapedIntermediate = reshape({ inputs: { x }, backend, attrs: { shape: reshaped } });\n const transposedIntermediate = transpose({ inputs: { x: reshapedIntermediate }, backend, attrs: { perm: permuted } });\n const reshapedIntermediate2 = reshape({\n inputs: { x: transposedIntermediate },\n backend,\n attrs: { shape: reshapedPermuted }\n });\n const sliced = slice({\n inputs: { x: reshapedIntermediate2 },\n backend,\n attrs: { begin: sliceBeginCoords, size: sliceSize }\n });\n toDispose.push(reshapedIntermediate);\n toDispose.push(transposedIntermediate);\n toDispose.push(reshapedIntermediate2);\n toDispose.forEach(t => backend.disposeIntermediateTensorInfo(t));\n return sliced;\n};\nexport const batchToSpaceNDConfig = {\n kernelName: BatchToSpaceND,\n backendName: 'webgl',\n kernelFunc: batchToSpaceND\n};\n//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiQmF0Y2hUb1NwYWNlTkQuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi8uLi90ZmpzLWJhY2tlbmQtd2ViZ2wvc3JjL2tlcm5lbHMvQmF0Y2hUb1NwYWNlTkQudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUE7Ozs7Ozs7Ozs7Ozs7OztHQWVHO0FBRUgsT0FBTyxFQUFDLFlBQVksRUFBRSxjQUFjLEVBQW1GLElBQUksRUFBQyxNQUFNLHVCQUF1QixDQUFDO0FBSTFKLE9BQU8sRUFBQyxPQUFPLEVBQUMsTUFBTSxXQUFXLENBQUM7QUFDbEMsT0FBTyxFQUFDLEtBQUssRUFBQyxNQUFNLFNBQVMsQ0FBQztBQUM5QixPQUFPLEVBQUMsU0FBUyxFQUFDLE1BQU0sYUFBYSxDQUFDO0FBRXRDLE1BQU0sQ0FBQyxNQUFNLGNBQWMsR0FBRyxDQUFDLElBSTlCLEVBQWMsRUFBRTtJQUNmLE1BQU0sRUFBQyxNQUFNLEVBQUUsT0FBTyxFQUFFLEtBQUssRUFBQyxHQUFHLElBQUksQ0FBQztJQUN0QyxNQUFNLEVBQUMsQ0FBQyxFQUFDLEdBQUcsTUFBTSxDQUFDO0lBQ25CLE1BQU0sRUFBQyxVQUFVLEVBQUUsS0FBSyxFQUFDLEdBQUcsS0FBSyxDQUFDO0lBRWxDLElBQUksQ0FBQyxNQUFNLENBQ1AsQ0FBQyxDQUFDLEtBQUssQ0FBQyxNQUFNLElBQUksQ0FBQyxFQUNuQixHQUFHLEVBQUUsQ0FBQyx1REFBdUQ7UUFDekQsaUJBQWlCLENBQUMsQ0FBQztJQUMzQixNQUFNLElBQUksR0FBRyxVQUFVLENBQUMsTUFBTSxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsRUFBRSxFQUFFLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDO0lBRWhELE1BQU0sUUFBUSxHQUFHLFlBQVksQ0FBQyxXQUFXLENBQUMsQ0FBQyxDQUFDLEtBQUssRUFBRSxVQUFVLEVBQUUsSUFBSSxDQUFDLENBQUM7SUFDckUsTUFBTSxRQUFRLEdBQUcsWUFBWSxDQUFDLFdBQVcsQ0FBQyxRQUFRLENBQUMsTUFBTSxFQUFFLFVBQVUsQ0FBQyxNQUFNLENBQUMsQ0FBQztJQUM5RSxNQUFNLGdCQUFnQixHQUNsQixZQUFZLENBQUMsbUJBQW1CLENBQUMsQ0FBQyxDQUFDLEtBQUssRUFBRSxVQUFVLEVBQUUsSUFBSSxDQUFDLENBQUM7SUFDaEUsTUFBTSxnQkFBZ0IsR0FDbEIsWUFBWSxDQUFDLG1CQUFtQixDQUFDLEtBQUssRUFBRSxVQUFVLENBQUMsTUFBTSxDQUFDLENBQUM7SUFDL0QsTUFBTSxTQUFTLEdBQ1gsWUFBWSxDQUFDLFlBQVksQ0FBQyxnQkFBZ0IsRUFBRSxLQUFLLEVBQUUsVUFBVSxDQUFDLE1BQU0sQ0FBQyxDQUFDO0lBRTFFLE1BQU0sU0FBUyxHQUFHLEVBQUUsQ0FBQztJQUVyQixNQUFNLG9CQUFvQixHQUN0QixPQUFPLENBQUMsRUFBQyxNQUFNLEVBQUUsRUFBQyxDQUFDLEVBQUMsRUFBRSxPQUFPLEVBQUUsS0FBSyxFQUFFLEVBQUMsS0FBSyxFQUFFLFFBQVEsRUFBQyxFQUFDLENBQUMsQ0FBQztJQUM5RCxNQUFNLHNCQUFzQixHQUFHLFNBQVMsQ0FDcEMsRUFBQyxNQUFNLEVBQUUsRUFBQyxDQUFDLEVBQUUsb0JBQW9CLEVBQUMsRUFBRSxPQUFPLEVBQUUsS0FBSyxFQUFFLEVBQUMsSUFBSSxFQUFFLFFBQVEsRUFBQyxFQUFDLENBQUMsQ0FBQztJQUMzRSxNQUFNLHFCQUFxQixHQUFHLE9BQU8sQ0FBQztRQUNwQyxNQUFNLEVBQUUsRUFBQyxDQUFDLEVBQUUsc0JBQXNCLEVBQUM7UUFDbkMsT0FBTztRQUNQLEtBQUssRUFBRSxFQUFDLEtBQUssRUFBRSxnQkFBZ0IsRUFBQztLQUNqQyxDQUFDLENBQUM7SUFDSCxNQUFNLE1BQU0sR0FBRyxLQUFLLENBQUM7UUFDbkIsTUFBTSxFQUFFLEVBQUMsQ0FBQyxFQUFFLHFCQUFxQixFQUFDO1FBQ2xDLE9BQU87UUFDUCxLQUFLLEVBQUUsRUFBQyxLQUFLLEVBQUUsZ0JBQWdCLEVBQUUsSUFBSSxFQUFFLFNBQVMsRUFBQztLQUNsRCxDQUFDLENBQUM7SUFFSCxTQUFTLENBQUMsSUFBSSxDQUFDLG9CQUFvQixDQUFDLENBQUM7SUFDckMsU0FBUyxDQUFDLElBQUksQ0FBQyxzQkFBc0IsQ0FBQyxDQUFDO0lBQ3ZDLFNBQVMsQ0FBQyxJQUFJLENBQUMscUJBQXFCLENBQUMsQ0FBQztJQUV0QyxTQUFTLENBQUMsT0FBTyxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsT0FBTyxDQUFDLDZCQUE2QixDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUM7SUFFakUsT0FBTyxNQUFNLENBQUM7QUFDaEIsQ0FBQyxDQUFDO0FBRUYsTUFBTSxDQUFDLE1BQU0sb0JBQW9CLEdBQWlCO0lBQ2hELFVBQVUsRUFBRSxjQUFjO0lBQzFCLFdBQVcsRUFBRSxPQUFPO0lBQ3BCLFVBQVUsRUFBRSxjQUFrQztDQUMvQyxDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiLyoqXG4gKiBAbGljZW5zZVxuICogQ29weXJpZ2h0IDIwMjAgR29vZ2xlIExMQy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC5cbiAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSBcIkxpY2Vuc2VcIik7XG4gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuXG4gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXRcbiAqXG4gKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjBcbiAqXG4gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlXG4gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiBcIkFTIElTXCIgQkFTSVMsXG4gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC5cbiAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmRcbiAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLlxuICogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbiAqL1xuXG5pbXBvcnQge2JhY2tlbmRfdXRpbCwgQmF0Y2hUb1NwYWNlTkQsIEJhdGNoVG9TcGFjZU5EQXR0cnMsIEJhdGNoVG9TcGFjZU5ESW5wdXRzLCBLZXJuZWxDb25maWcsIEtlcm5lbEZ1bmMsIFRlbnNvckluZm8sIHV0aWx9IGZyb20gJ0B0ZW5zb3JmbG93L3RmanMtY29yZSc7XG5cbmltcG9ydCB7TWF0aEJhY2tlbmRXZWJHTH0gZnJvbSAnLi4vYmFja2VuZF93ZWJnbCc7XG5cbmltcG9ydCB7cmVzaGFwZX0gZnJvbSAnLi9SZXNoYXBlJztcbmltcG9ydCB7c2xpY2V9IGZyb20gJy4vU2xpY2UnO1xuaW1wb3J0IHt0cmFuc3Bvc2V9IGZyb20gJy4vVHJhbnNwb3NlJztcblxuZXhwb3J0IGNvbnN0IGJhdGNoVG9TcGFjZU5EID0gKGFyZ3M6IHtcbiAgaW5wdXRzOiBCYXRjaFRvU3BhY2VORElucHV0cyxcbiAgYmFja2VuZDogTWF0aEJhY2tlbmRXZWJHTCxcbiAgYXR0cnM6IEJhdGNoVG9TcGFjZU5EQXR0cnNcbn0pOiBUZW5zb3JJbmZvID0+IHtcbiAgY29uc3Qge2lucHV0cywgYmFja2VuZCwgYXR0cnN9ID0gYXJncztcbiAgY29uc3Qge3h9ID0gaW5wdXRzO1xuICBjb25zdCB7YmxvY2tTaGFwZSwgY3JvcHN9ID0gYXR0cnM7XG5cbiAgdXRpbC5hc3NlcnQoXG4gICAgICB4LnNoYXBlLmxlbmd0aCA8PSA0LFxuICAgICAgKCkgPT4gJ2JhdGNoVG9TcGFjZU5EIGZvciByYW5rID4gNCB3aXRoIGEgV2ViR0wgYmFja2VuZCBub3QgJyArXG4gICAgICAgICAgJ2ltcGxlbWVudGVkIHlldCcpO1xuICBjb25zdCBwcm9kID0gYmxvY2tTaGFwZS5yZWR1Y2UoKGEsIGIpID0+IGEgKiBiKTtcblxuICBjb25zdCByZXNoYXBlZCA9IGJhY2tlbmRfdXRpbC5nZXRSZXNoYXBlZCh4LnNoYXBlLCBibG9ja1NoYXBlLCBwcm9kKTtcbiAgY29uc3QgcGVybXV0ZWQgPSBiYWNrZW5kX3V0aWwuZ2V0UGVybXV0ZWQocmVzaGFwZWQubGVuZ3RoLCBibG9ja1NoYXBlLmxlbmd0aCk7XG4gIGNvbnN0IHJlc2hhcGVkUGVybXV0ZWQgPVxuICAgICAgYmFja2VuZF91dGlsLmdldFJlc2hhcGVkUGVybXV0ZWQoeC5zaGFwZSwgYmxvY2tTaGFwZSwgcHJvZCk7XG4gIGNvbnN0IHNsaWNlQmVnaW5Db29yZHMgPVxuICAgICAgYmFja2VuZF91dGlsLmdldFNsaWNlQmVnaW5Db29yZHMoY3JvcHMsIGJsb2NrU2hhcGUubGVuZ3RoKTtcbiAgY29uc3Qgc2xpY2VTaXplID1cbiAgICAgIGJhY2tlbmRfdXRpbC5nZXRTbGljZVNpemUocmVzaGFwZWRQZXJtdXRlZCwgY3JvcHMsIGJsb2NrU2hhcGUubGVuZ3RoKTtcblxuICBjb25zdCB0b0Rpc3Bvc2UgPSBbXTtcblxuICBjb25zdCByZXNoYXBlZEludGVybWVkaWF0ZSA9XG4gICAgICByZXNoYXBlKHtpbnB1dHM6IHt4fSwgYmFja2VuZCwgYXR0cnM6IHtzaGFwZTogcmVzaGFwZWR9fSk7XG4gIGNvbnN0IHRyYW5zcG9zZWRJbnRlcm1lZGlhdGUgPSB0cmFuc3Bvc2UoXG4gICAgICB7aW5wdXRzOiB7eDogcmVzaGFwZWRJbnRlcm1lZGlhdGV9LCBiYWNrZW5kLCBhdHRyczoge3Blcm06IHBlcm11dGVkfX0pO1xuICBjb25zdCByZXNoYXBlZEludGVybWVkaWF0ZTIgPSByZXNoYXBlKHtcbiAgICBpbnB1dHM6IHt4OiB0cmFuc3Bvc2VkSW50ZXJtZWRpYXRlfSxcbiAgICBiYWNrZW5kLFxuICAgIGF0dHJzOiB7c2hhcGU6IHJlc2hhcGVkUGVybXV0ZWR9XG4gIH0pO1xuICBjb25zdCBzbGljZWQgPSBzbGljZSh7XG4gICAgaW5wdXRzOiB7eDogcmVzaGFwZWRJbnRlcm1lZGlhdGUyfSxcbiAgICBiYWNrZW5kLFxuICAgIGF0dHJzOiB7YmVnaW46IHNsaWNlQmVnaW5Db29yZHMsIHNpemU6IHNsaWNlU2l6ZX1cbiAgfSk7XG5cbiAgdG9EaXNwb3NlLnB1c2gocmVzaGFwZWRJbnRlcm1lZGlhdGUpO1xuICB0b0Rpc3Bvc2UucHVzaCh0cmFuc3Bvc2VkSW50ZXJtZWRpYXRlKTtcbiAgdG9EaXNwb3NlLnB1c2gocmVzaGFwZWRJbnRlcm1lZGlhdGUyKTtcblxuICB0b0Rpc3Bvc2UuZm9yRWFjaCh0ID0+IGJhY2tlbmQuZGlzcG9zZUludGVybWVkaWF0ZVRlbnNvckluZm8odCkpO1xuXG4gIHJldHVybiBzbGljZWQ7XG59O1xuXG5leHBvcnQgY29uc3QgYmF0Y2hUb1NwYWNlTkRDb25maWc6IEtlcm5lbENvbmZpZyA9IHtcbiAga2VybmVsTmFtZTogQmF0Y2hUb1NwYWNlTkQsXG4gIGJhY2tlbmROYW1lOiAnd2ViZ2wnLFxuICBrZXJuZWxGdW5jOiBiYXRjaFRvU3BhY2VORCBhcyB7fSBhcyBLZXJuZWxGdW5jXG59O1xuIl19","/**\n * @license\n * Copyright 2020 Google LLC. All Rights Reserved.\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n * =============================================================================\n */\nimport { Bincount } from '@tensorflow/tfjs-core';\nimport { bincountImplCPU } from '../kernel_utils/shared';\nexport function bincount(args) {\n const { inputs, backend, attrs } = args;\n const { x, weights } = inputs;\n const { size } = attrs;\n const xVals = backend.readSync(x.dataId);\n const weightsVals = backend.readSync(weights.dataId);\n const outVals = bincountImplCPU(xVals, weightsVals, weights.dtype, weights.shape, size);\n return backend.makeTensorInfo([size], weights.dtype, outVals);\n}\nexport const bincountConfig = {\n kernelName: Bincount,\n backendName: 'webgl',\n kernelFunc: bincount\n};\n//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiQmluY291bnQuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi8uLi90ZmpzLWJhY2tlbmQtd2ViZ2wvc3JjL2tlcm5lbHMvQmluY291bnQudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUE7Ozs7Ozs7Ozs7Ozs7OztHQWVHO0FBRUgsT0FBTyxFQUFDLFFBQVEsRUFBa0YsTUFBTSx1QkFBdUIsQ0FBQztBQUdoSSxPQUFPLEVBQUMsZUFBZSxFQUFDLE1BQU0sd0JBQXdCLENBQUM7QUFFdkQsTUFBTSxVQUFVLFFBQVEsQ0FBQyxJQUl4QjtJQUNDLE1BQU0sRUFBQyxNQUFNLEVBQUUsT0FBTyxFQUFFLEtBQUssRUFBQyxHQUFHLElBQUksQ0FBQztJQUN0QyxNQUFNLEVBQUMsQ0FBQyxFQUFFLE9BQU8sRUFBQyxHQUFHLE1BQU0sQ0FBQztJQUM1QixNQUFNLEVBQUMsSUFBSSxFQUFDLEdBQUcsS0FBSyxDQUFDO0lBRXJCLE1BQU0sS0FBSyxHQUFHLE9BQU8sQ0FBQyxRQUFRLENBQUMsQ0FBQyxDQUFDLE1BQU0sQ0FBZSxDQUFDO0lBQ3ZELE1BQU0sV0FBVyxHQUFHLE9BQU8sQ0FBQyxRQUFRLENBQUMsT0FBTyxDQUFDLE1BQU0sQ0FBZSxDQUFDO0lBRW5FLE1BQU0sT0FBTyxHQUNULGVBQWUsQ0FBQyxLQUFLLEVBQUUsV0FBVyxFQUFFLE9BQU8sQ0FBQyxLQUFLLEVBQUUsT0FBTyxDQUFDLEtBQUssRUFBRSxJQUFJLENBQUMsQ0FBQztJQUU1RSxPQUFPLE9BQU8sQ0FBQyxjQUFjLENBQUMsQ0FBQyxJQUFJLENBQUMsRUFBRSxPQUFPLENBQUMsS0FBSyxFQUFFLE9BQU8sQ0FBQyxDQUFDO0FBQ2hFLENBQUM7QUFFRCxNQUFNLENBQUMsTUFBTSxjQUFjLEdBQWlCO0lBQzFDLFVBQVUsRUFBRSxRQUFRO0lBQ3BCLFdBQVcsRUFBRSxPQUFPO0lBQ3BCLFVBQVUsRUFBRSxRQUE0QjtDQUN6QyxDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiLyoqXG4gKiBAbGljZW5zZVxuICogQ29weXJpZ2h0IDIwMjAgR29vZ2xlIExMQy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC5cbiAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSBcIkxpY2Vuc2VcIik7XG4gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuXG4gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXRcbiAqXG4gKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjBcbiAqXG4gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlXG4gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiBcIkFTIElTXCIgQkFTSVMsXG4gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC5cbiAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmRcbiAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLlxuICogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbiAqL1xuXG5pbXBvcnQge0JpbmNvdW50LCBCaW5jb3VudEF0dHJzLCBCaW5jb3VudElucHV0cywgS2VybmVsQ29uZmlnLCBLZXJuZWxGdW5jLCBUZW5zb3JJbmZvLCBUeXBlZEFycmF5fSBmcm9tICdAdGVuc29yZmxvdy90ZmpzLWNvcmUnO1xuXG5pbXBvcnQge01hdGhCYWNrZW5kV2ViR0x9IGZyb20gJy4uL2JhY2tlbmRfd2ViZ2wnO1xuaW1wb3J0IHtiaW5jb3VudEltcGxDUFV9IGZyb20gJy4uL2tlcm5lbF91dGlscy9zaGFyZWQnO1xuXG5leHBvcnQgZnVuY3Rpb24gYmluY291bnQoYXJnczoge1xuICBpbnB1dHM6IEJpbmNvdW50SW5wdXRzLFxuICBiYWNrZW5kOiBNYXRoQmFja2VuZFdlYkdMLFxuICBhdHRyczogQmluY291bnRBdHRyc1xufSk6IFRlbnNvckluZm8ge1xuICBjb25zdCB7aW5wdXRzLCBiYWNrZW5kLCBhdHRyc30gPSBhcmdzO1xuICBjb25zdCB7eCwgd2VpZ2h0c30gPSBpbnB1dHM7XG4gIGNvbnN0IHtzaXplfSA9IGF0dHJzO1xuXG4gIGNvbnN0IHhWYWxzID0gYmFja2VuZC5yZWFkU3luYyh4LmRhdGFJZCkgYXMgVHlwZWRBcnJheTtcbiAgY29uc3Qgd2VpZ2h0c1ZhbHMgPSBiYWNrZW5kLnJlYWRTeW5jKHdlaWdodHMuZGF0YUlkKSBhcyBUeXBlZEFycmF5O1xuXG4gIGNvbnN0IG91dFZhbHMgPVxuICAgICAgYmluY291bnRJbXBsQ1BVKHhWYWxzLCB3ZWlnaHRzVmFscywgd2VpZ2h0cy5kdHlwZSwgd2VpZ2h0cy5zaGFwZSwgc2l6ZSk7XG5cbiAgcmV0dXJuIGJhY2tlbmQubWFrZVRlbnNvckluZm8oW3NpemVdLCB3ZWlnaHRzLmR0eXBlLCBvdXRWYWxzKTtcbn1cblxuZXhwb3J0IGNvbnN0IGJpbmNvdW50Q29uZmlnOiBLZXJuZWxDb25maWcgPSB7XG4gIGtlcm5lbE5hbWU6IEJpbmNvdW50LFxuICBiYWNrZW5kTmFtZTogJ3dlYmdsJyxcbiAga2VybmVsRnVuYzogYmluY291bnQgYXMge30gYXMgS2VybmVsRnVuY1xufTtcbiJdfQ==","/**\n * @license\n * Copyright 2021 Google LLC. All Rights Reserved.\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n * =============================================================================\n */\nimport { backend_util, BroadcastArgs } from '@tensorflow/tfjs-core';\nexport function broadcastArgs(args) {\n const { inputs, backend } = args;\n const { s0, s1 } = inputs;\n const s0Vals = backend.readSync(s0.dataId);\n const s1Vals = backend.readSync(s1.dataId);\n const broadcastShape = backend_util.assertAndGetBroadcastShape(Array.from(s0Vals), Array.from(s1Vals));\n return backend.makeTensorInfo([broadcastShape.length], 'int32', Int32Array.from(broadcastShape));\n}\nexport const broadcastArgsConfig = {\n kernelName: BroadcastArgs,\n backendName: 'webgl',\n kernelFunc: broadcastArgs\n};\n//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiQnJvYWRjYXN0QXJncy5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uLy4uL3RmanMtYmFja2VuZC13ZWJnbC9zcmMva2VybmVscy9Ccm9hZGNhc3RBcmdzLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBOzs7Ozs7Ozs7Ozs7Ozs7R0FlRztBQUVILE9BQU8sRUFBQyxZQUFZLEVBQUUsYUFBYSxFQUE0RCxNQUFNLHVCQUF1QixDQUFDO0FBRzdILE1BQU0sVUFBVSxhQUFhLENBQUMsSUFHN0I7SUFDQyxNQUFNLEVBQUMsTUFBTSxFQUFFLE9BQU8sRUFBQyxHQUFHLElBQUksQ0FBQztJQUMvQixNQUFNLEVBQUMsRUFBRSxFQUFFLEVBQUUsRUFBQyxHQUFHLE1BQU0sQ0FBQztJQUV4QixNQUFNLE1BQU0sR0FBRyxPQUFPLENBQUMsUUFBUSxDQUFDLEVBQUUsQ0FBQyxNQUFNLENBQWUsQ0FBQztJQUN6RCxNQUFNLE1BQU0sR0FBRyxPQUFPLENBQUMsUUFBUSxDQUFDLEVBQUUsQ0FBQyxNQUFNLENBQWUsQ0FBQztJQUV6RCxNQUFNLGNBQWMsR0FBRyxZQUFZLENBQUMsMEJBQTBCLENBQzFELEtBQUssQ0FBQyxJQUFJLENBQUMsTUFBTSxDQUFDLEVBQUUsS0FBSyxDQUFDLElBQUksQ0FBQyxNQUFNLENBQUMsQ0FBQyxDQUFDO0lBRTVDLE9BQU8sT0FBTyxDQUFDLGNBQWMsQ0FDekIsQ0FBQyxjQUFjLENBQUMsTUFBTSxDQUFDLEVBQUUsT0FBTyxFQUFFLFVBQVUsQ0FBQyxJQUFJLENBQUMsY0FBYyxDQUFDLENBQUMsQ0FBQztBQUN6RSxDQUFDO0FBRUQsTUFBTSxDQUFDLE1BQU0sbUJBQW1CLEdBQWlCO0lBQy9DLFVBQVUsRUFBRSxhQUFhO0lBQ3pCLFdBQVcsRUFBRSxPQUFPO0lBQ3BCLFVBQVUsRUFBRSxhQUFhO0NBQzFCLENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyIvKipcbiAqIEBsaWNlbnNlXG4gKiBDb3B5cmlnaHQgMjAyMSBHb29nbGUgTExDLiBBbGwgUmlnaHRzIFJlc2VydmVkLlxuICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlIFwiTGljZW5zZVwiKTtcbiAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS5cbiAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdFxuICpcbiAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMFxuICpcbiAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmVcbiAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuIFwiQVMgSVNcIiBCQVNJUyxcbiAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLlxuICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZFxuICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuXG4gKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuICovXG5cbmltcG9ydCB7YmFja2VuZF91dGlsLCBCcm9hZGNhc3RBcmdzLCBCcm9hZGNhc3RBcmdzSW5wdXRzLCBLZXJuZWxDb25maWcsIFRlbnNvckluZm8sIFR5cGVkQXJyYXl9IGZyb20gJ0B0ZW5zb3JmbG93L3RmanMtY29yZSc7XG5pbXBvcnQge01hdGhCYWNrZW5kV2ViR0x9IGZyb20gJy4uL2JhY2tlbmRfd2ViZ2wnO1xuXG5leHBvcnQgZnVuY3Rpb24gYnJvYWRjYXN0QXJncyhhcmdzOiB7XG4gIGlucHV0czogQnJvYWRjYXN0QXJnc0lucHV0cyxcbiAgYmFja2VuZDogTWF0aEJhY2tlbmRXZWJHTCxcbn0pOiBUZW5zb3JJbmZvIHtcbiAgY29uc3Qge2lucHV0cywgYmFja2VuZH0gPSBhcmdzO1xuICBjb25zdCB7czAsIHMxfSA9IGlucHV0cztcblxuICBjb25zdCBzMFZhbHMgPSBiYWNrZW5kLnJlYWRTeW5jKHMwLmRhdGFJZCkgYXMgVHlwZWRBcnJheTtcbiAgY29uc3QgczFWYWxzID0gYmFja2VuZC5yZWFkU3luYyhzMS5kYXRhSWQpIGFzIFR5cGVkQXJyYXk7XG5cbiAgY29uc3QgYnJvYWRjYXN0U2hhcGUgPSBiYWNrZW5kX3V0aWwuYXNzZXJ0QW5kR2V0QnJvYWRjYXN0U2hhcGUoXG4gICAgICBBcnJheS5mcm9tKHMwVmFscyksIEFycmF5LmZyb20oczFWYWxzKSk7XG5cbiAgcmV0dXJuIGJhY2tlbmQubWFrZVRlbnNvckluZm8oXG4gICAgICBbYnJvYWRjYXN0U2hhcGUubGVuZ3RoXSwgJ2ludDMyJywgSW50MzJBcnJheS5mcm9tKGJyb2FkY2FzdFNoYXBlKSk7XG59XG5cbmV4cG9ydCBjb25zdCBicm9hZGNhc3RBcmdzQ29uZmlnOiBLZXJuZWxDb25maWcgPSB7XG4gIGtlcm5lbE5hbWU6IEJyb2FkY2FzdEFyZ3MsXG4gIGJhY2tlbmROYW1lOiAnd2ViZ2wnLFxuICBrZXJuZWxGdW5jOiBicm9hZGNhc3RBcmdzXG59O1xuIl19","/**\n * @license\n * Copyright 2020 Google LLC. All Rights Reserved.\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n * =============================================================================\n */\nimport { NotEqual } from '@tensorflow/tfjs-core';\nimport { binaryKernelFunc } from '../kernel_utils/kernel_funcs_utils';\nimport { notEqualImplCPU } from '../kernel_utils/shared';\nconst NOT_EQUAL = `return float(a != b);`;\nexport const notEqual = binaryKernelFunc({ opSnippet: NOT_EQUAL, cpuKernelImpl: notEqualImplCPU, dtype: 'bool' });\nexport const notEqualConfig = {\n kernelName: NotEqual,\n backendName: 'webgl',\n kernelFunc: notEqual,\n};\n//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiTm90RXF1YWwuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi8uLi90ZmpzLWJhY2tlbmQtd2ViZ2wvc3JjL2tlcm5lbHMvTm90RXF1YWwudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUE7Ozs7Ozs7Ozs7Ozs7OztHQWVHO0FBRUgsT0FBTyxFQUFDLFFBQVEsRUFBQyxNQUFNLHVCQUF1QixDQUFDO0FBRS9DLE9BQU8sRUFBQyxnQkFBZ0IsRUFBQyxNQUFNLG9DQUFvQyxDQUFDO0FBQ3BFLE9BQU8sRUFBQyxlQUFlLEVBQUMsTUFBTSx3QkFBd0IsQ0FBQztBQUV2RCxNQUFNLFNBQVMsR0FBRyx1QkFBdUIsQ0FBQztBQUUxQyxNQUFNLENBQUMsTUFBTSxRQUFRLEdBQUcsZ0JBQWdCLENBQ3BDLEVBQUMsU0FBUyxFQUFFLFNBQVMsRUFBRSxhQUFhLEVBQUUsZUFBZSxFQUFFLEtBQUssRUFBRSxNQUFNLEVBQUMsQ0FBQyxDQUFDO0FBRTNFLE1BQU0sQ0FBQyxNQUFNLGNBQWMsR0FBaUI7SUFDMUMsVUFBVSxFQUFFLFFBQVE7SUFDcEIsV0FBVyxFQUFFLE9BQU87SUFDcEIsVUFBVSxFQUFFLFFBQVE7Q0FDckIsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbIi8qKlxuICogQGxpY2Vuc2VcbiAqIENvcHlyaWdodCAyMDIwIEdvb2dsZSBMTEMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuXG4gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgXCJMaWNlbnNlXCIpO1xuICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLlxuICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0XG4gKlxuICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wXG4gKlxuICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZVxuICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gXCJBUyBJU1wiIEJBU0lTLFxuICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuXG4gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kXG4gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS5cbiAqID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4gKi9cblxuaW1wb3J0IHtOb3RFcXVhbH0gZnJvbSAnQHRlbnNvcmZsb3cvdGZqcy1jb3JlJztcbmltcG9ydCB7S2VybmVsQ29uZmlnfSBmcm9tICdAdGVuc29yZmxvdy90ZmpzLWNvcmUnO1xuaW1wb3J0IHtiaW5hcnlLZXJuZWxGdW5jfSBmcm9tICcuLi9rZXJuZWxfdXRpbHMva2VybmVsX2Z1bmNzX3V0aWxzJztcbmltcG9ydCB7bm90RXF1YWxJbXBsQ1BVfSBmcm9tICcuLi9rZXJuZWxfdXRpbHMvc2hhcmVkJztcblxuY29uc3QgTk9UX0VRVUFMID0gYHJldHVybiBmbG9hdChhICE9IGIpO2A7XG5cbmV4cG9ydCBjb25zdCBub3RFcXVhbCA9IGJpbmFyeUtlcm5lbEZ1bmMoXG4gICAge29wU25pcHBldDogTk9UX0VRVUFMLCBjcHVLZXJuZWxJbXBsOiBub3RFcXVhbEltcGxDUFUsIGR0eXBlOiAnYm9vbCd9KTtcblxuZXhwb3J0IGNvbnN0IG5vdEVxdWFsQ29uZmlnOiBLZXJuZWxDb25maWcgPSB7XG4gIGtlcm5lbE5hbWU6IE5vdEVxdWFsLFxuICBiYWNrZW5kTmFtZTogJ3dlYmdsJyxcbiAga2VybmVsRnVuYzogbm90RXF1YWwsXG59O1xuIl19","/**\n * @license\n * Copyright 2020 Google LLC. All Rights Reserved.\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n * =============================================================================\n */\nimport { Real } from '@tensorflow/tfjs-core';\nimport { identity } from './Identity';\nexport function real(args) {\n const { inputs, backend } = args;\n const { input } = inputs;\n const inputData = backend.texData.get(input.dataId);\n return identity({ inputs: { x: inputData.complexTensorInfos.real }, backend });\n}\nexport const realConfig = {\n kernelName: Real,\n backendName: 'webgl',\n kernelFunc: real\n};\n//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiUmVhbC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uLy4uL3RmanMtYmFja2VuZC13ZWJnbC9zcmMva2VybmVscy9SZWFsLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBOzs7Ozs7Ozs7Ozs7Ozs7R0FlRztBQUVILE9BQU8sRUFBMkIsSUFBSSxFQUF5QixNQUFNLHVCQUF1QixDQUFDO0FBRzdGLE9BQU8sRUFBQyxRQUFRLEVBQUMsTUFBTSxZQUFZLENBQUM7QUFFcEMsTUFBTSxVQUFVLElBQUksQ0FBQyxJQUFxRDtJQUV4RSxNQUFNLEVBQUMsTUFBTSxFQUFFLE9BQU8sRUFBQyxHQUFHLElBQUksQ0FBQztJQUMvQixNQUFNLEVBQUMsS0FBSyxFQUFDLEdBQUcsTUFBTSxDQUFDO0lBQ3ZCLE1BQU0sU0FBUyxHQUFHLE9BQU8sQ0FBQyxPQUFPLENBQUMsR0FBRyxDQUFDLEtBQUssQ0FBQyxNQUFNLENBQUMsQ0FBQztJQUVwRCxPQUFPLFFBQVEsQ0FBQyxFQUFDLE1BQU0sRUFBRSxFQUFDLENBQUMsRUFBRSxTQUFTLENBQUMsa0JBQWtCLENBQUMsSUFBSSxFQUFDLEVBQUUsT0FBTyxFQUFDLENBQUMsQ0FBQztBQUM3RSxDQUFDO0FBRUQsTUFBTSxDQUFDLE1BQU0sVUFBVSxHQUFpQjtJQUN0QyxVQUFVLEVBQUUsSUFBSTtJQUNoQixXQUFXLEVBQUUsT0FBTztJQUNwQixVQUFVLEVBQUUsSUFBd0I7Q0FDckMsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbIi8qKlxuICogQGxpY2Vuc2VcbiAqIENvcHlyaWdodCAyMDIwIEdvb2dsZSBMTEMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuXG4gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgXCJMaWNlbnNlXCIpO1xuICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLlxuICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0XG4gKlxuICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wXG4gKlxuICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZVxuICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gXCJBUyBJU1wiIEJBU0lTLFxuICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuXG4gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kXG4gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS5cbiAqID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4gKi9cblxuaW1wb3J0IHtLZXJuZWxDb25maWcsIEtlcm5lbEZ1bmMsIFJlYWwsIFJlYWxJbnB1dHMsIFRlbnNvckluZm99IGZyb20gJ0B0ZW5zb3JmbG93L3RmanMtY29yZSc7XG5cbmltcG9ydCB7TWF0aEJhY2tlbmRXZWJHTH0gZnJvbSAnLi4vYmFja2VuZF93ZWJnbCc7XG5pbXBvcnQge2lkZW50aXR5fSBmcm9tICcuL0lkZW50aXR5JztcblxuZXhwb3J0IGZ1bmN0aW9uIHJlYWwoYXJnczoge2lucHV0czogUmVhbElucHV0cywgYmFja2VuZDogTWF0aEJhY2tlbmRXZWJHTH0pOlxuICAgIFRlbnNvckluZm8ge1xuICBjb25zdCB7aW5wdXRzLCBiYWNrZW5kfSA9IGFyZ3M7XG4gIGNvbnN0IHtpbnB1dH0gPSBpbnB1dHM7XG4gIGNvbnN0IGlucHV0RGF0YSA9IGJhY2tlbmQudGV4RGF0YS5nZXQoaW5wdXQuZGF0YUlkKTtcblxuICByZXR1cm4gaWRlbnRpdHkoe2lucHV0czoge3g6IGlucHV0RGF0YS5jb21wbGV4VGVuc29ySW5mb3MucmVhbH0sIGJhY2tlbmR9KTtcbn1cblxuZXhwb3J0IGNvbnN0IHJlYWxDb25maWc6IEtlcm5lbENvbmZpZyA9IHtcbiAga2VybmVsTmFtZTogUmVhbCxcbiAgYmFja2VuZE5hbWU6ICd3ZWJnbCcsXG4gIGtlcm5lbEZ1bmM6IHJlYWwgYXMge30gYXMgS2VybmVsRnVuY1xufTtcbiJdfQ==","/**\n * @license\n * Copyright 2020 Google LLC. All Rights Reserved.\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n * =============================================================================\n */\nimport * as tf from '@tensorflow/tfjs-core';\nimport { Cast, util } from '@tensorflow/tfjs-core';\nimport { castImplCPU } from '../kernel_utils/shared';\nimport { complex } from './Complex';\nimport { identity } from './Identity';\nimport { notEqual } from './NotEqual';\nimport { real } from './Real';\nimport { int } from '../kernel_utils/int';\nexport function cast(args) {\n const { inputs, backend, attrs } = args;\n const { x } = inputs;\n const { dtype } = attrs;\n // Casting to complex64.\n if (dtype === 'complex64') {\n if (x.dtype === 'complex64') {\n return identity({ inputs: { x }, backend });\n }\n // TODO(annxingyuan): Import kernel function once zeros is modularized.\n const zerosTensor = tf.zeros(x.shape);\n const floatX = cast({ inputs: { x }, backend, attrs: { dtype: 'float32' } });\n const result = complex({ inputs: { real: floatX, imag: zerosTensor }, backend });\n zerosTensor.dispose();\n backend.disposeIntermediateTensorInfo(floatX);\n return result;\n }\n // Casting from complex64\n if (x.dtype === 'complex64') {\n const realPart = real({ inputs: { input: x }, backend });\n const result = cast({ inputs: { x: realPart }, backend, attrs: { dtype } });\n backend.disposeIntermediateTensorInfo(realPart);\n return result;\n }\n if (!util.hasEncodingLoss(x.dtype, dtype)) {\n // We don't change the underlying data, since we cast to higher\n // precision.\n const result = identity({ inputs: { x }, backend });\n return { dataId: result.dataId, shape: result.shape, dtype };\n }\n if (backend.shouldExecuteOnCPU([x])) {\n const values = backend.texData.get(x.dataId).values;\n const [resultShape, resultType, resultData] = castImplCPU(values, x.shape, x.dtype, dtype);\n return backend.makeTensorInfo(resultShape, resultType, resultData);\n }\n if (dtype === 'int32') {\n return int(x, backend);\n }\n if (dtype === 'bool') {\n const zerosTensorInfo = backend.makeTensorInfo([], 'bool', util.getTypedArrayFromDType('bool', 1));\n const binaryInputs = { a: x, b: zerosTensorInfo };\n const result = notEqual({ inputs: binaryInputs, backend });\n backend.disposeIntermediateTensorInfo(zerosTensorInfo);\n return result;\n }\n throw new Error(`Error in Cast: failed to cast ${x.dtype} to ${dtype}`);\n}\nexport const castConfig = {\n kernelName: Cast,\n backendName: 'webgl',\n kernelFunc: cast\n};\n//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiQ2FzdC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uLy4uL3RmanMtYmFja2VuZC13ZWJnbC9zcmMva2VybmVscy9DYXN0LnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBOzs7Ozs7Ozs7Ozs7Ozs7R0FlRztBQUNILE9BQU8sS0FBSyxFQUFFLE1BQU0sdUJBQXVCLENBQUM7QUFDNUMsT0FBTyxFQUFlLElBQUksRUFBMkUsSUFBSSxFQUFDLE1BQU0sdUJBQXVCLENBQUM7QUFHeEksT0FBTyxFQUFDLFdBQVcsRUFBQyxNQUFNLHdCQUF3QixDQUFDO0FBQ25ELE9BQU8sRUFBQyxPQUFPLEVBQUMsTUFBTSxXQUFXLENBQUM7QUFDbEMsT0FBTyxFQUFDLFFBQVEsRUFBQyxNQUFNLFlBQVksQ0FBQztBQUNwQyxPQUFPLEVBQUMsUUFBUSxFQUFDLE1BQU0sWUFBWSxDQUFDO0FBQ3BDLE9BQU8sRUFBQyxJQUFJLEVBQUMsTUFBTSxRQUFRLENBQUM7QUFFNUIsT0FBTyxFQUFDLEdBQUcsRUFBQyxNQUFNLHFCQUFxQixDQUFDO0FBRXhDLE1BQU0sVUFBVSxJQUFJLENBQ2hCLElBQXVFO0lBRXpFLE1BQU0sRUFBQyxNQUFNLEVBQUUsT0FBTyxFQUFFLEtBQUssRUFBQyxHQUFHLElBQUksQ0FBQztJQUN0QyxNQUFNLEVBQUMsQ0FBQyxFQUFDLEdBQUcsTUFBTSxDQUFDO0lBQ25CLE1BQU0sRUFBQyxLQUFLLEVBQUMsR0FBRyxLQUFLLENBQUM7SUFFdEIsd0JBQXdCO0lBQ3hCLElBQUksS0FBSyxLQUFLLFdBQVcsRUFBRTtRQUN6QixJQUFJLENBQUMsQ0FBQyxLQUFLLEtBQUssV0FBVyxFQUFFO1lBQzNCLE9BQU8sUUFBUSxDQUFDLEVBQUMsTUFBTSxFQUFFLEVBQUMsQ0FBQyxFQUFDLEVBQUUsT0FBTyxFQUFDLENBQUMsQ0FBQztTQUN6QztRQUVELHVFQUF1RTtRQUN2RSxNQUFNLFdBQVcsR0FBRyxFQUFFLENBQUMsS0FBSyxDQUFD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Q0FBaUMsQ0FBQyxDQUFDLEtBQUssT0FBTyxLQUFLLEVBQUUsQ0FBQyxDQUFDO0FBQzFFLENBQUM7QUFFRCxNQUFNLENBQUMsTUFBTSxVQUFVLEdBQWlCO0lBQ3RDLFVBQVUsRUFBRSxJQUFJO0lBQ2hCLFdBQVcsRUFBRSxPQUFPO0lBQ3BCLFVBQVUsRUFBRSxJQUF3QjtDQUNyQyxDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiLyoqXG4gKiBAbGljZW5zZVxuICogQ29weXJpZ2h0IDIwMjAgR29vZ2xlIExMQy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC5cbiAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSBcIkxpY2Vuc2VcIik7XG4gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuXG4gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXRcbiAqXG4gKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjBcbiAqXG4gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlXG4gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiBcIkFTIElTXCIgQkFTSVMsXG4gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC5cbiAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmRcbiAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLlxuICogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbiAqL1xuaW1wb3J0ICogYXMgdGYgZnJvbSAnQHRlbnNvcmZsb3cvdGZqcy1jb3JlJztcbmltcG9ydCB7QmluYXJ5SW5wdXRzLCBDYXN0LCBDYXN0QXR0cnMsIENhc3RJbnB1dHMsIEtlcm5lbENvbmZpZywgS2VybmVsRnVuYywgVGVuc29ySW5mbywgVHlwZWRBcnJheSwgdXRpbH0gZnJvbSAnQHRlbnNvcmZsb3cvdGZqcy1jb3JlJztcblxuaW1wb3J0IHtNYXRoQmFja2VuZFdlYkdMfSBmcm9tICcuLi9iYWNrZW5kX3dlYmdsJztcbmltcG9ydCB7Y2FzdEltcGxDUFV9IGZyb20gJy4uL2tlcm5lbF91dGlscy9zaGFyZWQnO1xuaW1wb3J0IHtjb21wbGV4fSBmcm9tICcuL0NvbXBsZXgnO1xuaW1wb3J0IHtpZGVudGl0eX0gZnJvbSAnLi9JZGVudGl0eSc7XG5pbXBvcnQge25vdEVxdWFsfSBmcm9tICcuL05vdEVxdWFsJztcbmltcG9ydCB7cmVhbH0gZnJvbSAnLi9SZWFsJztcblxuaW1wb3J0IHtpbnR9IGZyb20gJy4uL2tlcm5lbF91dGlscy9pbnQnO1xuXG5leHBvcnQgZnVuY3Rpb24gY2FzdChcbiAgICBhcmdzOiB7aW5wdXRzOiBDYXN0SW5wdXRzLCBiYWNrZW5kOiBNYXRoQmFja2VuZFdlYkdMLCBhdHRyczogQ2FzdEF0dHJzfSk6XG4gICAgVGVuc29ySW5mbyB7XG4gIGNvbnN0IHtpbnB1dHMsIGJhY2tlbmQsIGF0dHJzfSA9IGFyZ3M7XG4gIGNvbnN0IHt4fSA9IGlucHV0cztcbiAgY29uc3Qge2R0eXBlfSA9IGF0dHJzO1xuXG4gIC8vIENhc3RpbmcgdG8gY29tcGxleDY0LlxuICBpZiAoZHR5cGUgPT09ICdjb21wbGV4NjQnKSB7XG4gICAgaWYgKHguZHR5cGUgPT09ICdjb21wbGV4NjQnKSB7XG4gICAgICByZXR1cm4gaWRlbnRpdHkoe2lucHV0czoge3h9LCBiYWNrZW5kfSk7XG4gICAgfVxuXG4gICAgLy8gVE9ETyhhbm54aW5neXVhbik6IEltcG9ydCBrZXJuZWwgZnVuY3Rpb24gb25jZSB6ZXJvcyBpcyBtb2R1bGFyaXplZC5cbiAgICBjb25zdCB6ZXJvc1RlbnNvciA9IHRmLnplcm9zKHguc2hhcGUpO1xuICAgIGNvbnN0IGZsb2F0WCA9IGNhc3Qoe2lucHV0czoge3h9LCBiYWNrZW5kLCBhdHRyczoge2R0eXBlOiAnZmxvYXQzMid9fSk7XG5cbiAgICBjb25zdCByZXN1bHQgPVxuICAgICAgICBjb21wbGV4KHtpbnB1dHM6IHtyZWFsOiBmbG9hdFgsIGltYWc6IHplcm9zVGVuc29yfSwgYmFja2VuZH0pO1xuXG4gICAgemVyb3NUZW5zb3IuZGlzcG9zZSgpO1xuICAgIGJhY2tlbmQuZGlzcG9zZUludGVybWVkaWF0ZVRlbnNvckluZm8oZmxvYXRYKTtcblxuICAgIHJldHVybiByZXN1bHQ7XG4gIH1cblxuICAvLyBDYXN0aW5nIGZyb20gY29tcGxleDY0XG4gIGlmICh4LmR0eXBlID09PSAnY29tcGxleDY0Jykge1xuICAgIGNvbnN0IHJlYWxQYXJ0ID0gcmVhbCh7aW5wdXRzOiB7aW5wdXQ6IHh9LCBiYWNrZW5kfSk7XG4gICAgY29uc3QgcmVzdWx0ID0gY2FzdCh7aW5wdXRzOiB7eDogcmVhbFBhcnR9LCBiYWNrZW5kLCBhdHRyczoge2R0eXBlfX0pO1xuICAgIGJhY2tlbmQuZGlzcG9zZUludGVybWVkaWF0ZVRlbnNvckluZm8ocmVhbFBhcnQpO1xuICAgIHJldHVybiByZXN1bHQ7XG4gIH1cblxuICBpZiAoIXV0aWwuaGFzRW5jb2RpbmdMb3NzKHguZHR5cGUsIGR0eXBlKSkge1xuICAgIC8vIFdlIGRvbid0IGNoYW5nZSB0aGUgdW5kZXJseWluZyBkYXRhLCBzaW5jZSB3ZSBjYXN0IHRvIGhpZ2hlclxuICAgIC8vIHByZWNpc2lvbi5cbiAgICBjb25zdCByZXN1bHQgPSBpZGVudGl0eSh7aW5wdXRzOiB7eH0sIGJhY2tlbmR9KTtcbiAgICByZXR1cm4ge2RhdGFJZDogcmVzdWx0LmRhdGFJZCwgc2hhcGU6IHJlc3VsdC5zaGFwZSwgZHR5cGV9O1xuICB9XG5cbiAgaWYgKGJhY2tlbmQuc2hvdWxkRXhlY3V0ZU9uQ1BVKFt4XSkpIHtcbiAgICBjb25zdCB2YWx1ZXMgPSBiYWNrZW5kLnRleERhdGEuZ2V0KHguZGF0YUlkKS52YWx1ZXMgYXMgVHlwZWRBcnJheTtcbiAgICBjb25zdCBbcmVzdWx0U2hhcGUsIHJlc3VsdFR5cGUsIHJlc3VsdERhdGFdID1cbiAgICAgICAgY2FzdEltcGxDUFUodmFsdWVzLCB4LnNoYXBlLCB4LmR0eXBlLCBkdHlwZSk7XG4gICAgcmV0dXJuIGJhY2tlbmQubWFrZVRlbnNvckluZm8ocmVzdWx0U2hhcGUsIHJlc3VsdFR5cGUsIHJlc3VsdERhdGEpO1xuICB9XG5cbiAgaWYgKGR0eXBlID09PSAnaW50MzInKSB7XG4gICAgcmV0dXJuIGludCh4LCBiYWNrZW5kKTtcbiAgfVxuXG4gIGlmIChkdHlwZSA9PT0gJ2Jvb2wnKSB7XG4gICAgY29uc3QgemVyb3NUZW5zb3JJbmZvID0gYmFja2VuZC5tYWtlVGVuc29ySW5mbyhcbiAgICAgICAgW10sICdib29sJywgdXRpbC5nZXRUeXBlZEFycmF5RnJvbURUeXBlKCdib29sJywgMSkpO1xuXG4gICAgY29uc3QgYmluYXJ5SW5wdXRzOiBCaW5hcnlJbnB1dHMgPSB7YTogeCwgYjogemVyb3NUZW5zb3JJbmZvfTtcblxuICAgIGNvbnN0IHJlc3VsdCA9IG5vdEVxdWFsKHtpbnB1dHM6IGJpbmFyeUlucHV0cywgYmFja2VuZH0pIGFzIFRlbnNvckluZm87XG4gICAgYmFja2VuZC5kaXNwb3NlSW50ZXJtZWRpYXRlVGVuc29ySW5mbyh6ZXJvc1RlbnNvckluZm8pO1xuICAgIHJldHVybiByZXN1bHQ7XG4gIH1cblxuICB0aHJvdyBuZXcgRXJyb3IoYEVycm9yIGluIENhc3Q6IGZhaWxlZCB0byBjYXN0ICR7eC5kdHlwZX0gdG8gJHtkdHlwZX1gKTtcbn1cblxuZXhwb3J0IGNvbnN0IGNhc3RDb25maWc6IEtlcm5lbENvbmZpZyA9IHtcbiAga2VybmVsTmFtZTogQ2FzdCxcbiAgYmFja2VuZE5hbWU6ICd3ZWJnbCcsXG4gIGtlcm5lbEZ1bmM6IGNhc3QgYXMge30gYXMgS2VybmVsRnVuY1xufTtcbiJdfQ==","/**\n * @license\n * Copyright 2020 Google LLC. All Rights Reserved.\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n * =============================================================================\n */\nimport { UnaryOpProgram } from '../unaryop_gpu';\nconst TO_INT = `return float(int(x));`;\nexport function int(input, backend) {\n const program = new UnaryOpProgram(input.shape, TO_INT);\n const output = backend.runWebGLProgram(program, [input], 'int32');\n return { dataId: output.dataId, shape: output.shape, dtype: output.dtype };\n}\n//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW50LmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vLi4vdGZqcy1iYWNrZW5kLXdlYmdsL3NyYy9rZXJuZWxfdXRpbHMvaW50LnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBOzs7Ozs7Ozs7Ozs7Ozs7R0FlRztBQUtILE9BQU8sRUFBQyxjQUFjLEVBQUMsTUFBTSxnQkFBZ0IsQ0FBQztBQUU5QyxNQUFNLE1BQU0sR0FBRyx1QkFBdUIsQ0FBQztBQUV2QyxNQUFNLFVBQVUsR0FBRyxDQUFDLEtBQWlCLEVBQUUsT0FBeUI7SUFDOUQsTUFBTSxPQUFPLEdBQUcsSUFBSSxjQUFjLENBQUMsS0FBSyxDQUFDLEtBQUssRUFBRSxNQUFNLENBQUMsQ0FBQztJQUN4RCxNQUFNLE1BQU0sR0FBRyxPQUFPLENBQUMsZUFBZSxDQUFDLE9BQU8sRUFBRSxDQUFDLEtBQUssQ0FBQyxFQUFFLE9BQU8sQ0FBQyxDQUFDO0lBQ2xFLE9BQU8sRUFBQyxNQUFNLEVBQUUsTUFBTSxDQUFDLE1BQU0sRUFBRSxLQUFLLEVBQUUsTUFBTSxDQUFDLEtBQUssRUFBRSxLQUFLLEVBQUUsTUFBTSxDQUFDLEtBQUssRUFBQyxDQUFDO0FBQzNFLENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyIvKipcbiAqIEBsaWNlbnNlXG4gKiBDb3B5cmlnaHQgMjAyMCBHb29nbGUgTExDLiBBbGwgUmlnaHRzIFJlc2VydmVkLlxuICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlIFwiTGljZW5zZVwiKTtcbiAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS5cbiAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdFxuICpcbiAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMFxuICpcbiAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmVcbiAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuIFwiQVMgSVNcIiBCQVNJUyxcbiAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLlxuICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZFxuICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuXG4gKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuICovXG5cbmltcG9ydCB7VGVuc29ySW5mb30gZnJvbSAnQHRlbnNvcmZsb3cvdGZqcy1jb3JlJztcblxuaW1wb3J0IHtNYXRoQmFja2VuZFdlYkdMfSBmcm9tICcuLi9iYWNrZW5kX3dlYmdsJztcbmltcG9ydCB7VW5hcnlPcFByb2dyYW19IGZyb20gJy4uL3VuYXJ5b3BfZ3B1JztcblxuY29uc3QgVE9fSU5UID0gYHJldHVybiBmbG9hdChpbnQoeCkpO2A7XG5cbmV4cG9ydCBmdW5jdGlvbiBpbnQoaW5wdXQ6IFRlbnNvckluZm8sIGJhY2tlbmQ6IE1hdGhCYWNrZW5kV2ViR0wpOiBUZW5zb3JJbmZvIHtcbiAgY29uc3QgcHJvZ3JhbSA9IG5ldyBVbmFyeU9wUHJvZ3JhbShpbnB1dC5zaGFwZSwgVE9fSU5UKTtcbiAgY29uc3Qgb3V0cHV0ID0gYmFja2VuZC5ydW5XZWJHTFByb2dyYW0ocHJvZ3JhbSwgW2lucHV0XSwgJ2ludDMyJyk7XG4gIHJldHVybiB7ZGF0YUlkOiBvdXRwdXQuZGF0YUlkLCBzaGFwZTogb3V0cHV0LnNoYXBlLCBkdHlwZTogb3V0cHV0LmR0eXBlfTtcbn1cbiJdfQ==","/**\n * @license\n * Copyright 2020 Google LLC. All Rights Reserved.\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n * =============================================================================\n */\nimport { Ceil } from '@tensorflow/tfjs-core';\nimport { unaryKernelFunc } from '../kernel_utils/kernel_funcs_utils';\nimport { ceilImplCPU } from '../kernel_utils/shared';\nconst CEIL = `return ceil(x);`;\nexport const ceil = unaryKernelFunc({ opSnippet: CEIL, packedOpSnippet: CEIL, cpuKernelImpl: ceilImplCPU });\nexport const ceilConfig = {\n kernelName: Ceil,\n backendName: 'webgl',\n kernelFunc: ceil\n};\n//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiQ2VpbC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uLy4uL3RmanMtYmFja2VuZC13ZWJnbC9zcmMva2VybmVscy9DZWlsLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBOzs7Ozs7Ozs7Ozs7Ozs7R0FlRztBQUVILE9BQU8sRUFBQyxJQUFJLEVBQTJCLE1BQU0sdUJBQXVCLENBQUM7QUFDckUsT0FBTyxFQUFDLGVBQWUsRUFBQyxNQUFNLG9DQUFvQyxDQUFDO0FBQ25FLE9BQU8sRUFBQyxXQUFXLEVBQUMsTUFBTSx3QkFBd0IsQ0FBQztBQUVuRCxNQUFNLElBQUksR0FBRyxpQkFBaUIsQ0FBQztBQUUvQixNQUFNLENBQUMsTUFBTSxJQUFJLEdBQUcsZUFBZSxDQUMvQixFQUFDLFNBQVMsRUFBRSxJQUFJLEVBQUUsZUFBZSxFQUFFLElBQUksRUFBRSxhQUFhLEVBQUUsV0FBVyxFQUFDLENBQUMsQ0FBQztBQUUxRSxNQUFNLENBQUMsTUFBTSxVQUFVLEdBQWlCO0lBQ3RDLFVBQVUsRUFBRSxJQUFJO0lBQ2hCLFdBQVcsRUFBRSxPQUFPO0lBQ3BCLFVBQVUsRUFBRSxJQUF3QjtDQUNyQyxDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiLyoqXG4gKiBAbGljZW5zZVxuICogQ29weXJpZ2h0IDIwMjAgR29vZ2xlIExMQy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC5cbiAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSBcIkxpY2Vuc2VcIik7XG4gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuXG4gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXRcbiAqXG4gKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjBcbiAqXG4gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlXG4gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiBcIkFTIElTXCIgQkFTSVMsXG4gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC5cbiAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmRcbiAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLlxuICogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbiAqL1xuXG5pbXBvcnQge0NlaWwsIEtlcm5lbENvbmZpZywgS2VybmVsRnVuY30gZnJvbSAnQHRlbnNvcmZsb3cvdGZqcy1jb3JlJztcbmltcG9ydCB7dW5hcnlLZXJuZWxGdW5jfSBmcm9tICcuLi9rZXJuZWxfdXRpbHMva2VybmVsX2Z1bmNzX3V0aWxzJztcbmltcG9ydCB7Y2VpbEltcGxDUFV9IGZyb20gJy4uL2tlcm5lbF91dGlscy9zaGFyZWQnO1xuXG5jb25zdCBDRUlMID0gYHJldHVybiBjZWlsKHgpO2A7XG5cbmV4cG9ydCBjb25zdCBjZWlsID0gdW5hcnlLZXJuZWxGdW5jKFxuICAgIHtvcFNuaXBwZXQ6IENFSUwsIHBhY2tlZE9wU25pcHBldDogQ0VJTCwgY3B1S2VybmVsSW1wbDogY2VpbEltcGxDUFV9KTtcblxuZXhwb3J0IGNvbnN0IGNlaWxDb25maWc6IEtlcm5lbENvbmZpZyA9IHtcbiAga2VybmVsTmFtZTogQ2VpbCxcbiAgYmFja2VuZE5hbWU6ICd3ZWJnbCcsXG4gIGtlcm5lbEZ1bmM6IGNlaWwgYXMge30gYXMgS2VybmVsRnVuY1xufTtcbiJdfQ==","/**\n * @license\n * Copyright 2017 Google LLC. All Rights Reserved.\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n * =============================================================================\n */\nexport class ClipProgram {\n constructor(aShape) {\n this.variableNames = ['A'];\n this.customUniforms = [\n { name: 'minVal', type: 'float' },\n { name: 'maxVal', type: 'float' }\n ];\n this.outputShape = aShape;\n this.userCode = `\n\n void main() {\n float value = getAAtOutCoords();\n if (isnan(value)) {\n setOutput(value);\n return;\n }\n\n setOutput(clamp(value, minVal, maxVal));\n }\n `;\n }\n}\n//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY2xpcF9ncHUuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi90ZmpzLWJhY2tlbmQtd2ViZ2wvc3JjL2NsaXBfZ3B1LnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBOzs7Ozs7Ozs7Ozs7Ozs7R0FlRztBQUtILE1BQU0sT0FBTyxXQUFXO0lBU3RCLFlBQVksTUFBZ0I7UUFSNUIsa0JBQWEsR0FBRyxDQUFDLEdBQUcsQ0FBQyxDQUFDO1FBR3RCLG1CQUFjLEdBQUc7WUFDZixFQUFDLElBQUksRUFBRSxRQUFRLEVBQUUsSUFBSSxFQUFFLE9BQXNCLEVBQUM7WUFDOUMsRUFBQyxJQUFJLEVBQUUsUUFBUSxFQUFFLElBQUksRUFBRSxPQUFzQixFQUFDO1NBQy9DLENBQUM7UUFHQSxJQUFJLENBQUMsV0FBVyxHQUFHLE1BQU0sQ0FBQztRQUMxQixJQUFJLENBQUMsUUFBUSxHQUFHOzs7Ozs7Ozs7OztLQVdmLENBQUM7SUFDSixDQUFDO0NBQ0YiLCJzb3VyY2VzQ29udGVudCI6WyIvKipcbiAqIEBsaWNlbnNlXG4gKiBDb3B5cmlnaHQgMjAxNyBHb29nbGUgTExDLiBBbGwgUmlnaHRzIFJlc2VydmVkLlxuICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlIFwiTGljZW5zZVwiKTtcbiAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS5cbiAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdFxuICpcbiAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMFxuICpcbiAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmVcbiAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuIFwiQVMgSVNcIiBCQVNJUyxcbiAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLlxuICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZFxuICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuXG4gKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuICovXG5cbmltcG9ydCB7R1BHUFVQcm9ncmFtfSBmcm9tICcuL2dwZ3B1X21hdGgnO1xuaW1wb3J0IHtVbmlmb3JtVHlwZX0gZnJvbSAnLi9zaGFkZXJfY29tcGlsZXInO1xuXG5leHBvcnQgY2xhc3MgQ2xpcFByb2dyYW0gaW1wbGVtZW50cyBHUEdQVVByb2dyYW0ge1xuICB2YXJpYWJsZU5hbWVzID0gWydBJ107XG4gIHVzZXJDb2RlOiBzdHJpbmc7XG4gIG91dHB1dFNoYXBlOiBudW1iZXJbXTtcbiAgY3VzdG9tVW5pZm9ybXMgPSBbXG4gICAge25hbWU6ICdtaW5WYWwnLCB0eXBlOiAnZmxvYXQnIGFzIFVuaWZvcm1UeXBlfSxcbiAgICB7bmFtZTogJ21heFZhbCcsIHR5cGU6ICdmbG9hdCcgYXMgVW5pZm9ybVR5cGV9XG4gIF07XG5cbiAgY29uc3RydWN0b3IoYVNoYXBlOiBudW1iZXJbXSkge1xuICAgIHRoaXMub3V0cHV0U2hhcGUgPSBhU2hhcGU7XG4gICAgdGhpcy51c2VyQ29kZSA9IGBcblxuICAgICAgdm9pZCBtYWluKCkge1xuICAgICAgICBmbG9hdCB2YWx1ZSA9IGdldEFBdE91dENvb3JkcygpO1xuICAgICAgICBpZiAoaXNuYW4odmFsdWUpKSB7XG4gICAgICAgICAgc2V0T3V0cHV0KHZhbHVlKTtcbiAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cblxuICAgICAgICBzZXRPdXRwdXQoY2xhbXAodmFsdWUsIG1pblZhbCwgbWF4VmFsKSk7XG4gICAgICB9XG4gICAgYDtcbiAgfVxufVxuIl19","/**\n * @license\n * Copyright 2018 Google LLC. All Rights Reserved.\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n * =============================================================================\n */\nexport class ClipPackedProgram {\n constructor(aShape) {\n this.variableNames = ['A'];\n this.packedInputs = true;\n this.packedOutput = true;\n this.customUniforms = [\n { name: 'minVal', type: 'float' },\n { name: 'maxVal', type: 'float' }\n ];\n this.outputShape = aShape;\n this.userCode = `\n void main() {\n vec4 value = getAAtOutCoords();\n\n if (any(isnan(value))) {\n setOutput(value);\n return;\n }\n\n setOutput(clamp(value, vec4(minVal), vec4(maxVal)));\n }\n `;\n }\n}\n//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY2xpcF9wYWNrZWRfZ3B1LmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vdGZqcy1iYWNrZW5kLXdlYmdsL3NyYy9jbGlwX3BhY2tlZF9ncHUudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUE7Ozs7Ozs7Ozs7Ozs7OztHQWVHO0FBS0gsTUFBTSxPQUFPLGlCQUFpQjtJQVc1QixZQUFZLE1BQWdCO1FBVjVCLGtCQUFhLEdBQUcsQ0FBQyxHQUFHLENBQUMsQ0FBQztRQUN0QixpQkFBWSxHQUFHLElBQUksQ0FBQztRQUNwQixpQkFBWSxHQUFHLElBQUksQ0FBQztRQUdwQixtQkFBYyxHQUFHO1lBQ2YsRUFBQyxJQUFJLEVBQUUsUUFBUSxFQUFFLElBQUksRUFBRSxPQUFzQixFQUFDO1lBQzlDLEVBQUMsSUFBSSxFQUFFLFFBQVEsRUFBRSxJQUFJLEVBQUUsT0FBc0IsRUFBQztTQUMvQyxDQUFDO1FBR0EsSUFBSSxDQUFDLFdBQVcsR0FBRyxNQUFNLENBQUM7UUFDMUIsSUFBSSxDQUFDLFFBQVEsR0FBRzs7Ozs7Ozs7Ozs7S0FXZixDQUFDO0lBQ0osQ0FBQztDQUNGIiwic291cmNlc0NvbnRlbnQiOlsiLyoqXG4gKiBAbGljZW5zZVxuICogQ29weXJpZ2h0IDIwMTggR29vZ2xlIExMQy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC5cbiAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSBcIkxpY2Vuc2VcIik7XG4gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuXG4gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXRcbiAqXG4gKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjBcbiAqXG4gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlXG4gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiBcIkFTIElTXCIgQkFTSVMsXG4gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC5cbiAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmRcbiAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLlxuICogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbiAqL1xuXG5pbXBvcnQge0dQR1BVUHJvZ3JhbX0gZnJvbSAnLi9ncGdwdV9tYXRoJztcbmltcG9ydCB7VW5pZm9ybVR5cGV9IGZyb20gJy4vc2hhZGVyX2NvbXBpbGVyJztcblxuZXhwb3J0IGNsYXNzIENsaXBQYWNrZWRQcm9ncmFtIGltcGxlbWVudHMgR1BHUFVQcm9ncmFtIHtcbiAgdmFyaWFibGVOYW1lcyA9IFsnQSddO1xuICBwYWNrZWRJbnB1dHMgPSB0cnVlO1xuICBwYWNrZWRPdXRwdXQgPSB0cnVlO1xuICB1c2VyQ29kZTogc3RyaW5nO1xuICBvdXRwdXRTaGFwZTogbnVtYmVyW107XG4gIGN1c3RvbVVuaWZvcm1zID0gW1xuICAgIHtuYW1lOiAnbWluVmFsJywgdHlwZTogJ2Zsb2F0JyBhcyBVbmlmb3JtVHlwZX0sXG4gICAge25hbWU6ICdtYXhWYWwnLCB0eXBlOiAnZmxvYXQnIGFzIFVuaWZvcm1UeXBlfVxuICBdO1xuXG4gIGNvbnN0cnVjdG9yKGFTaGFwZTogbnVtYmVyW10pIHtcbiAgICB0aGlzLm91dHB1dFNoYXBlID0gYVNoYXBlO1xuICAgIHRoaXMudXNlckNvZGUgPSBgXG4gICAgICB2b2lkIG1haW4oKSB7XG4gICAgICAgIHZlYzQgdmFsdWUgPSBnZXRBQXRPdXRDb29yZHMoKTtcblxuICAgICAgICBpZiAoYW55KGlzbmFuKHZhbHVlKSkpIHtcbiAgICAgICAgICBzZXRPdXRwdXQodmFsdWUpO1xuICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuXG4gICAgICAgIHNldE91dHB1dChjbGFtcCh2YWx1ZSwgdmVjNChtaW5WYWwpLCB2ZWM0KG1heFZhbCkpKTtcbiAgICAgIH1cbiAgICBgO1xuICB9XG59XG4iXX0=","/**\n * @license\n * Copyright 2020 Google LLC. All Rights Reserved.\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n * =============================================================================\n */\nimport { ClipByValue, env } from '@tensorflow/tfjs-core';\nimport { ClipProgram } from '../clip_gpu';\nimport { ClipPackedProgram } from '../clip_packed_gpu';\nexport function clipByValue(args) {\n const { inputs, backend, attrs } = args;\n const { x } = inputs;\n const { clipValueMin, clipValueMax } = attrs;\n let program;\n if (env().getBool('WEBGL_PACK_CLIP')) {\n program = new ClipPackedProgram(x.shape);\n }\n else {\n program = new ClipProgram(x.shape);\n }\n const customValues = [[clipValueMin], [clipValueMax]];\n return backend.runWebGLProgram(program, [x], x.dtype, customValues);\n}\nexport const clipByValueConfig = {\n kernelName: ClipByValue,\n backendName: 'webgl',\n kernelFunc: clipByValue\n};\n//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiQ2xpcEJ5VmFsdWUuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi8uLi90ZmpzLWJhY2tlbmQtd2ViZ2wvc3JjL2tlcm5lbHMvQ2xpcEJ5VmFsdWUudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUE7Ozs7Ozs7Ozs7Ozs7OztHQWVHO0FBRUgsT0FBTyxFQUFDLFdBQVcsRUFBdUMsR0FBRyxFQUF1QyxNQUFNLHVCQUF1QixDQUFDO0FBR2xJLE9BQU8sRUFBQyxXQUFXLEVBQUMsTUFBTSxhQUFhLENBQUM7QUFDeEMsT0FBTyxFQUFDLGlCQUFpQixFQUFDLE1BQU0sb0JBQW9CLENBQUM7QUFFckQsTUFBTSxVQUFVLFdBQVcsQ0FBQyxJQUkzQjtJQUNDLE1BQU0sRUFBQyxNQUFNLEVBQUUsT0FBTyxFQUFFLEtBQUssRUFBQyxHQUFHLElBQUksQ0FBQztJQUN0QyxNQUFNLEVBQUMsQ0FBQyxFQUFDLEdBQUcsTUFBTSxDQUFDO0lBQ25CLE1BQU0sRUFBQyxZQUFZLEVBQUUsWUFBWSxFQUFDLEdBQUcsS0FBSyxDQUFDO0lBRTNDLElBQUksT0FBTyxDQUFDO0lBQ1osSUFBSSxHQUFHLEVBQUUsQ0FBQyxPQUFPLENBQUMsaUJBQWlCLENBQUMsRUFBRTtRQUNwQyxPQUFPLEdBQUcsSUFBSSxpQkFBaUIsQ0FBQyxDQUFDLENBQUMsS0FBSyxDQUFDLENBQUM7S0FDMUM7U0FBTTtRQUNMLE9BQU8sR0FBRyxJQUFJLFdBQVcsQ0FBQyxDQUFDLENBQUMsS0FBSyxDQUFDLENBQUM7S0FDcEM7SUFDRCxNQUFNLFlBQVksR0FBRyxDQUFDLENBQUMsWUFBWSxDQUFDLEVBQUUsQ0FBQyxZQUFZLENBQUMsQ0FBQyxDQUFDO0lBQ3RELE9BQU8sT0FBTyxDQUFDLGVBQWUsQ0FBQyxPQUFPLEVBQUUsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsS0FBSyxFQUFFLFlBQVksQ0FBQyxDQUFDO0FBQ3RFLENBQUM7QUFFRCxNQUFNLENBQUMsTUFBTSxpQkFBaUIsR0FBaUI7SUFDN0MsVUFBVSxFQUFFLFdBQVc7SUFDdkIsV0FBVyxFQUFFLE9BQU87SUFDcEIsVUFBVSxFQUFFLFdBQStCO0NBQzVDLENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyIvKipcbiAqIEBsaWNlbnNlXG4gKiBDb3B5cmlnaHQgMjAyMCBHb29nbGUgTExDLiBBbGwgUmlnaHRzIFJlc2VydmVkLlxuICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlIFwiTGljZW5zZVwiKTtcbiAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS5cbiAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdFxuICpcbiAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMFxuICpcbiAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmVcbiAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuIFwiQVMgSVNcIiBCQVNJUyxcbiAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLlxuICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZFxuICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuXG4gKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuICovXG5cbmltcG9ydCB7Q2xpcEJ5VmFsdWUsIENsaXBCeVZhbHVlQXR0cnMsIENsaXBCeVZhbHVlSW5wdXRzLCBlbnYsIEtlcm5lbENvbmZpZywgS2VybmVsRnVuYywgVGVuc29ySW5mb30gZnJvbSAnQHRlbnNvcmZsb3cvdGZqcy1jb3JlJztcblxuaW1wb3J0IHtNYXRoQmFja2VuZFdlYkdMfSBmcm9tICcuLi9iYWNrZW5kX3dlYmdsJztcbmltcG9ydCB7Q2xpcFByb2dyYW19IGZyb20gJy4uL2NsaXBfZ3B1JztcbmltcG9ydCB7Q2xpcFBhY2tlZFByb2dyYW19IGZyb20gJy4uL2NsaXBfcGFja2VkX2dwdSc7XG5cbmV4cG9ydCBmdW5jdGlvbiBjbGlwQnlWYWx1ZShhcmdzOiB7XG4gIGlucHV0czogQ2xpcEJ5VmFsdWVJbnB1dHMsXG4gIGJhY2tlbmQ6IE1hdGhCYWNrZW5kV2ViR0wsXG4gIGF0dHJzOiBDbGlwQnlWYWx1ZUF0dHJzXG59KTogVGVuc29ySW5mbyB7XG4gIGNvbnN0IHtpbnB1dHMsIGJhY2tlbmQsIGF0dHJzfSA9IGFyZ3M7XG4gIGNvbnN0IHt4fSA9IGlucHV0cztcbiAgY29uc3Qge2NsaXBWYWx1ZU1pbiwgY2xpcFZhbHVlTWF4fSA9IGF0dHJzO1xuXG4gIGxldCBwcm9ncmFtO1xuICBpZiAoZW52KCkuZ2V0Qm9vbCgnV0VCR0xfUEFDS19DTElQJykpIHtcbiAgICBwcm9ncmFtID0gbmV3IENsaXBQYWNrZWRQcm9ncmFtKHguc2hhcGUpO1xuICB9IGVsc2Uge1xuICAgIHByb2dyYW0gPSBuZXcgQ2xpcFByb2dyYW0oeC5zaGFwZSk7XG4gIH1cbiAgY29uc3QgY3VzdG9tVmFsdWVzID0gW1tjbGlwVmFsdWVNaW5dLCBbY2xpcFZhbHVlTWF4XV07XG4gIHJldHVybiBiYWNrZW5kLnJ1bldlYkdMUHJvZ3JhbShwcm9ncmFtLCBbeF0sIHguZHR5cGUsIGN1c3RvbVZhbHVlcyk7XG59XG5cbmV4cG9ydCBjb25zdCBjbGlwQnlWYWx1ZUNvbmZpZzogS2VybmVsQ29uZmlnID0ge1xuICBrZXJuZWxOYW1lOiBDbGlwQnlWYWx1ZSxcbiAgYmFja2VuZE5hbWU6ICd3ZWJnbCcsXG4gIGtlcm5lbEZ1bmM6IGNsaXBCeVZhbHVlIGFzIHt9IGFzIEtlcm5lbEZ1bmNcbn07XG4iXX0=","/**\n * @license\n * Copyright 2018 Google LLC. All Rights Reserved.\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n * =============================================================================\n */\nexport class ComplexAbsProgram {\n constructor(shape) {\n this.variableNames = ['real', 'imag'];\n this.outputShape = shape;\n this.userCode = `\n void main() {\n float re = abs(getRealAtOutCoords());\n float im = abs(getImagAtOutCoords());\n float mx = max(re, im);\n\n // sadly the length function in glsl is not underflow-safe\n // (at least not on Intel GPUs). So the safe solution is\n // to ensure underflow-safety in all cases.\n setOutput(\n mx == 0.0 ? 0.0 : mx * length(vec2(1, min(re, im)/mx))\n );\n }\n `;\n }\n}\n//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY29tcGxleF9hYnNfZ3B1LmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vdGZqcy1iYWNrZW5kLXdlYmdsL3NyYy9jb21wbGV4X2Fic19ncHUudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUE7Ozs7Ozs7Ozs7Ozs7OztHQWVHO0FBSUgsTUFBTSxPQUFPLGlCQUFpQjtJQUs1QixZQUFZLEtBQWU7UUFKM0Isa0JBQWEsR0FBRyxDQUFDLE1BQU0sRUFBRSxNQUFNLENBQUMsQ0FBQztRQUsvQixJQUFJLENBQUMsV0FBVyxHQUFHLEtBQUssQ0FBQztRQUN6QixJQUFJLENBQUMsUUFBUSxHQUFHOzs7Ozs7Ozs7Ozs7O0tBYWYsQ0FBQztJQUNKLENBQUM7Q0FDRiIsInNvdXJjZXNDb250ZW50IjpbIi8qKlxuICogQGxpY2Vuc2VcbiAqIENvcHlyaWdodCAyMDE4IEdvb2dsZSBMTEMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuXG4gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgXCJMaWNlbnNlXCIpO1xuICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLlxuICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0XG4gKlxuICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wXG4gKlxuICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZVxuICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gXCJBUyBJU1wiIEJBU0lTLFxuICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuXG4gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kXG4gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS5cbiAqID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4gKi9cblxuaW1wb3J0IHtHUEdQVVByb2dyYW19IGZyb20gJy4vZ3BncHVfbWF0aCc7XG5cbmV4cG9ydCBjbGFzcyBDb21wbGV4QWJzUHJvZ3JhbSBpbXBsZW1lbnRzIEdQR1BVUHJvZ3JhbSB7XG4gIHZhcmlhYmxlTmFtZXMgPSBbJ3JlYWwnLCAnaW1hZyddO1xuICB1c2VyQ29kZTogc3RyaW5nO1xuICBvdXRwdXRTaGFwZTogbnVtYmVyW107XG5cbiAgY29uc3RydWN0b3Ioc2hhcGU6IG51bWJlcltdKSB7XG4gICAgdGhpcy5vdXRwdXRTaGFwZSA9IHNoYXBlO1xuICAgIHRoaXMudXNlckNvZGUgPSBgXG4gICAgICB2b2lkIG1haW4oKSB7XG4gICAgICAgIGZsb2F0IHJlID0gYWJzKGdldFJlYWxBdE91dENvb3JkcygpKTtcbiAgICAgICAgZmxvYXQgaW0gPSBhYnMoZ2V0SW1hZ0F0T3V0Q29vcmRzKCkpO1xuICAgICAgICBmbG9hdCBteCA9IG1heChyZSwgaW0pO1xuXG4gICAgICAgIC8vIHNhZGx5IHRoZSBsZW5ndGggZnVuY3Rpb24gaW4gZ2xzbCBpcyBub3QgdW5kZXJmbG93LXNhZmVcbiAgICAgICAgLy8gKGF0IGxlYXN0IG5vdCBvbiBJbnRlbCBHUFVzKS4gU28gdGhlIHNhZmUgc29sdXRpb24gaXNcbiAgICAgICAgLy8gdG8gZW5zdXJlIHVuZGVyZmxvdy1zYWZldHkgaW4gYWxsIGNhc2VzLlxuICAgICAgICBzZXRPdXRwdXQoXG4gICAgICAgICAgbXggPT0gMC4wID8gMC4wIDogbXggKiBsZW5ndGgodmVjMigxLCBtaW4ocmUsIGltKS9teCkpXG4gICAgICAgICk7XG4gICAgICB9XG4gICAgYDtcbiAgfVxufVxuIl19","/**\n * @license\n * Copyright 2020 Google LLC. All Rights Reserved.\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n * =============================================================================\n */\nimport { ComplexAbs } from '@tensorflow/tfjs-core';\nimport { ComplexAbsProgram } from '../complex_abs_gpu';\n// Returns a TensorInfo with the complex shape and the dataId of the\n// underlying part. We need to do this because a reshaped complex tensor is\n// not reflected in its parts.\nfunction makeComplexComponentTensorInfo(complexTensor, complexPart) {\n return {\n dataId: complexPart.dataId,\n dtype: complexPart.dtype,\n shape: complexTensor.shape\n };\n}\nexport function complexAbs(args) {\n const { inputs, backend } = args;\n const { x } = inputs;\n const xData = backend.texData.get(x.dataId);\n const program = new ComplexAbsProgram(x.shape);\n const programInputs = [\n makeComplexComponentTensorInfo(x, xData.complexTensorInfos.real),\n makeComplexComponentTensorInfo(x, xData.complexTensorInfos.imag),\n ];\n return backend.runWebGLProgram(program, programInputs, programInputs[0].dtype);\n}\nexport const complexAbsConfig = {\n kernelName: ComplexAbs,\n backendName: 'webgl',\n kernelFunc: complexAbs\n};\n//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiQ29tcGxleEFicy5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uLy4uL3RmanMtYmFja2VuZC13ZWJnbC9zcmMva2VybmVscy9Db21wbGV4QWJzLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBOzs7Ozs7Ozs7Ozs7Ozs7R0FlRztBQUVILE9BQU8sRUFBQyxVQUFVLEVBQXlELE1BQU0sdUJBQXVCLENBQUM7QUFHekcsT0FBTyxFQUFDLGlCQUFpQixFQUFDLE1BQU0sb0JBQW9CLENBQUM7QUFFckQsb0VBQW9FO0FBQ3BFLDJFQUEyRTtBQUMzRSw4QkFBOEI7QUFDOUIsU0FBUyw4QkFBOEIsQ0FDbkMsYUFBeUIsRUFBRSxXQUF1QjtJQUNwRCxPQUFPO1FBQ0wsTUFBTSxFQUFFLFdBQVcsQ0FBQyxNQUFNO1FBQzFCLEtBQUssRUFBRSxXQUFXLENBQUMsS0FBSztRQUN4QixLQUFLLEVBQUUsYUFBYSxDQUFDLEtBQUs7S0FDM0IsQ0FBQztBQUNKLENBQUM7QUFFRCxNQUFNLFVBQVUsVUFBVSxDQUN0QixJQUEyRDtJQUM3RCxNQUFNLEVBQUMsTUFBTSxFQUFFLE9BQU8sRUFBQyxHQUFHLElBQUksQ0FBQztJQUMvQixNQUFNLEVBQUMsQ0FBQyxFQUFDLEdBQUcsTUFBTSxDQUFDO0lBRW5CLE1BQU0sS0FBSyxHQUFHLE9BQU8sQ0FBQyxPQUFPLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxNQUFNLENBQUMsQ0FBQztJQUU1QyxNQUFNLE9BQU8sR0FBRyxJQUFJLGlCQUFpQixDQUFDLENBQUMsQ0FBQyxLQUFLLENBQUMsQ0FBQztJQUMvQyxNQUFNLGFBQWEsR0FBRztRQUNwQiw4QkFBOEIsQ0FBQyxDQUFDLEVBQUUsS0FBSyxDQUFDLGtCQUFrQixDQUFDLElBQUksQ0FBQztRQUNoRSw4QkFBOEIsQ0FBQyxDQUFDLEVBQUUsS0FBSyxDQUFDLGtCQUFrQixDQUFDLElBQUksQ0FBQztLQUNqRSxDQUFDO0lBRUYsT0FBTyxPQUFPLENBQUMsZUFBZSxDQUMxQixPQUFPLEVBQUUsYUFBYSxFQUFFLGFBQWEsQ0FBQyxDQUFDLENBQUMsQ0FBQyxLQUFLLENBQUMsQ0FBQztBQUN0RCxDQUFDO0FBRUQsTUFBTSxDQUFDLE1BQU0sZ0JBQWdCLEdBQWlCO0lBQzVDLFVBQVUsRUFBRSxVQUFVO0lBQ3RCLFdBQVcsRUFBRSxPQUFPO0lBQ3BCLFVBQVUsRUFBRSxVQUE4QjtDQUMzQyxDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiLyoqXG4gKiBAbGljZW5zZVxuICogQ29weXJpZ2h0IDIwMjAgR29vZ2xlIExMQy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC5cbiAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSBcIkxpY2Vuc2VcIik7XG4gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuXG4gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXRcbiAqXG4gKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjBcbiAqXG4gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlXG4gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiBcIkFTIElTXCIgQkFTSVMsXG4gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC5cbiAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmRcbiAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLlxuICogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbiAqL1xuXG5pbXBvcnQge0NvbXBsZXhBYnMsIENvbXBsZXhBYnNJbnB1dHMsIEtlcm5lbENvbmZpZywgS2VybmVsRnVuYywgVGVuc29ySW5mb30gZnJvbSAnQHRlbnNvcmZsb3cvdGZqcy1jb3JlJztcblxuaW1wb3J0IHtNYXRoQmFja2VuZFdlYkdMfSBmcm9tICcuLi9iYWNrZW5kX3dlYmdsJztcbmltcG9ydCB7Q29tcGxleEFic1Byb2dyYW19IGZyb20gJy4uL2NvbXBsZXhfYWJzX2dwdSc7XG5cbi8vIFJldHVybnMgYSBUZW5zb3JJbmZvIHdpdGggdGhlIGNvbXBsZXggc2hhcGUgYW5kIHRoZSBkYXRhSWQgb2YgdGhlXG4vLyB1bmRlcmx5aW5nIHBhcnQuIFdlIG5lZWQgdG8gZG8gdGhpcyBiZWNhdXNlIGEgcmVzaGFwZWQgY29tcGxleCB0ZW5zb3IgaXNcbi8vIG5vdCByZWZsZWN0ZWQgaW4gaXRzIHBhcnRzLlxuZnVuY3Rpb24gbWFrZUNvbXBsZXhDb21wb25lbnRUZW5zb3JJbmZvKFxuICAgIGNvbXBsZXhUZW5zb3I6IFRlbnNvckluZm8sIGNvbXBsZXhQYXJ0OiBUZW5zb3JJbmZvKTogVGVuc29ySW5mbyB7XG4gIHJldHVybiB7XG4gICAgZGF0YUlkOiBjb21wbGV4UGFydC5kYXRhSWQsXG4gICAgZHR5cGU6IGNvbXBsZXhQYXJ0LmR0eXBlLFxuICAgIHNoYXBlOiBjb21wbGV4VGVuc29yLnNoYXBlXG4gIH07XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBjb21wbGV4QWJzKFxuICAgIGFyZ3M6IHtpbnB1dHM6IENvbXBsZXhBYnNJbnB1dHMsIGJhY2tlbmQ6IE1hdGhCYWNrZW5kV2ViR0x9KTogVGVuc29ySW5mbyB7XG4gIGNvbnN0IHtpbnB1dHMsIGJhY2tlbmR9ID0gYXJncztcbiAgY29uc3Qge3h9ID0gaW5wdXRzO1xuXG4gIGNvbnN0IHhEYXRhID0gYmFja2VuZC50ZXhEYXRhLmdldCh4LmRhdGFJZCk7XG5cbiAgY29uc3QgcHJvZ3JhbSA9IG5ldyBDb21wbGV4QWJzUHJvZ3JhbSh4LnNoYXBlKTtcbiAgY29uc3QgcHJvZ3JhbUlucHV0cyA9IFtcbiAgICBtYWtlQ29tcGxleENvbXBvbmVudFRlbnNvckluZm8oeCwgeERhdGEuY29tcGxleFRlbnNvckluZm9zLnJlYWwpLFxuICAgIG1ha2VDb21wbGV4Q29tcG9uZW50VGVuc29ySW5mbyh4LCB4RGF0YS5jb21wbGV4VGVuc29ySW5mb3MuaW1hZyksXG4gIF07XG5cbiAgcmV0dXJuIGJhY2tlbmQucnVuV2ViR0xQcm9ncmFtKFxuICAgICAgcHJvZ3JhbSwgcHJvZ3JhbUlucHV0cywgcHJvZ3JhbUlucHV0c1swXS5kdHlwZSk7XG59XG5cbmV4cG9ydCBjb25zdCBjb21wbGV4QWJzQ29uZmlnOiBLZXJuZWxDb25maWcgPSB7XG4gIGtlcm5lbE5hbWU6IENvbXBsZXhBYnMsXG4gIGJhY2tlbmROYW1lOiAnd2ViZ2wnLFxuICBrZXJuZWxGdW5jOiBjb21wbGV4QWJzIGFzIHt9IGFzIEtlcm5lbEZ1bmNcbn07XG4iXX0=","/**\n * @license\n * Copyright 2017 Google LLC. All Rights Reserved.\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n * =============================================================================\n */\nimport { backend_util } from '@tensorflow/tfjs-core';\nexport class ConcatProgram {\n // Concats 2d tensors along axis=1. See comments in MathBackendWebGL.concat().\n constructor(shapes) {\n this.outputShape = [];\n this.outputShape = backend_util.computeOutShape(shapes, 1 /* axis */);\n this.variableNames = shapes.map((_, i) => `T${i}`);\n const offsets = new Array(shapes.length - 1);\n offsets[0] = shapes[0][1];\n for (let i = 1; i < offsets.length; i++) {\n offsets[i] = offsets[i - 1] + shapes[i][1];\n }\n const snippets = [`if (yC < ${offsets[0]}) setOutput(getT0(yR, yC));`];\n for (let i = 1; i < offsets.length; i++) {\n const shift = offsets[i - 1];\n snippets.push(`else if (yC < ${offsets[i]}) ` +\n `setOutput(getT${i}(yR, yC-${shift}));`);\n }\n const lastIndex = offsets.length;\n const lastShift = offsets[offsets.length - 1];\n snippets.push(`else setOutput(getT${lastIndex}(yR, yC-${lastShift}));`);\n this.userCode = `\n void main() {\n ivec2 coords = getOutputCoords();\n int yR = coords.x;\n int yC = coords.y;\n\n ${snippets.join('\\n ')}\n }\n `;\n }\n}\n//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY29uY2F0X2dwdS5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uL3RmanMtYmFja2VuZC13ZWJnbC9zcmMvY29uY2F0X2dwdS50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQTs7Ozs7Ozs7Ozs7Ozs7O0dBZUc7QUFFSCxPQUFPLEVBQUMsWUFBWSxFQUFDLE1BQU0sdUJBQXVCLENBQUM7QUFHbkQsTUFBTSxPQUFPLGFBQWE7SUFLeEIsOEVBQThFO0lBQzlFLFlBQVksTUFBK0I7UUFKM0MsZ0JBQVcsR0FBYSxFQUFFLENBQUM7UUFLekIsSUFBSSxDQUFDLFdBQVcsR0FBRyxZQUFZLENBQUMsZUFBZSxDQUFDLE1BQU0sRUFBRSxDQUFDLENBQUMsVUFBVSxDQUFDLENBQUM7UUFDdEUsSUFBSSxDQUFDLGFBQWEsR0FBRyxNQUFNLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsRUFBRSxFQUFFLENBQUMsSUFBSSxDQUFDLEVBQUUsQ0FBQyxDQUFDO1FBRW5ELE1BQU0sT0FBTyxHQUFhLElBQUksS0FBSyxDQUFDLE1BQU0sQ0FBQyxNQUFNLEdBQUcsQ0FBQyxDQUFDLENBQUM7UUFDdkQsT0FBTyxDQUFDLENBQUMsQ0FBQyxHQUFHLE1BQU0sQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQztRQUMxQixLQUFLLElBQUksQ0FBQyxHQUFHLENBQUMsRUFBRSxDQUFDLEdBQUcsT0FBTyxDQUFDLE1BQU0sRUFBRSxDQUFDLEVBQUUsRUFBRTtZQUN2QyxPQUFPLENBQUMsQ0FBQyxDQUFDLEdBQUcsT0FBTyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsR0FBRyxNQUFNLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUM7U0FDNUM7UUFFRCxNQUFNLFFBQVEsR0FBRyxDQUFDLFlBQVksT0FBTyxDQUFDLENBQUMsQ0FBQyw2QkFBNkIsQ0FBQyxDQUFDO1FBQ3ZFLEtBQUssSUFBSSxDQUFDLEdBQUcsQ0FBQyxFQUFFLENBQUMsR0FBRyxPQUFPLENBQUMsTUFBTSxFQUFFLENBQUMsRUFBRSxFQUFFO1lBQ3ZDLE1BQU0sS0FBSyxHQUFHLE9BQU8sQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUM7WUFDN0IsUUFBUSxDQUFDLElBQUksQ0FDVCxpQkFBaUIsT0FBTyxDQUFDLENBQUMsQ0FBQyxJQUFJO2dCQUMvQixpQkFBaUIsQ0FBQyxXQUFXLEtBQUssS0FBSyxDQUFDLENBQUM7U0FDOUM7UUFDRCxNQUFNLFNBQVMsR0FBRyxPQUFPLENBQUMsTUFBTSxDQUFDO1FBQ2pDLE1BQU0sU0FBUyxHQUFHLE9BQU8sQ0FBQyxPQUFPLENBQUMsTUFBTSxHQUFHLENBQUMsQ0FBQyxDQUFDO1FBQzlDLFFBQVEsQ0FBQyxJQUFJLENBQUMsc0JBQXNCLFNBQVMsV0FBVyxTQUFTLEtBQUssQ0FBQyxDQUFDO1FBRXhFLElBQUksQ0FBQyxRQUFRLEdBQUc7Ozs7OztVQU1WLFFBQVEsQ0FBQyxJQUFJLENBQUMsWUFBWSxDQUFDOztLQUVoQyxDQUFDO0lBQ0osQ0FBQztDQUNGIiwic291cmNlc0NvbnRlbnQiOlsiLyoqXG4gKiBAbGljZW5zZVxuICogQ29weXJpZ2h0IDIwMTcgR29vZ2xlIExMQy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC5cbiAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSBcIkxpY2Vuc2VcIik7XG4gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuXG4gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXRcbiAqXG4gKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjBcbiAqXG4gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlXG4gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiBcIkFTIElTXCIgQkFTSVMsXG4gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC5cbiAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmRcbiAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLlxuICogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbiAqL1xuXG5pbXBvcnQge2JhY2tlbmRfdXRpbH0gZnJvbSAnQHRlbnNvcmZsb3cvdGZqcy1jb3JlJztcbmltcG9ydCB7R1BHUFVQcm9ncmFtfSBmcm9tICcuL2dwZ3B1X21hdGgnO1xuXG5leHBvcnQgY2xhc3MgQ29uY2F0UHJvZ3JhbSBpbXBsZW1lbnRzIEdQR1BVUHJvZ3JhbSB7XG4gIHZhcmlhYmxlTmFtZXM6IHN0cmluZ1tdO1xuICBvdXRwdXRTaGFwZTogbnVtYmVyW10gPSBbXTtcbiAgdXNlckNvZGU6IHN0cmluZztcblxuICAvLyBDb25jYXRzIDJkIHRlbnNvcnMgYWxvbmcgYXhpcz0xLiBTZWUgY29tbWVudHMgaW4gTWF0aEJhY2tlbmRXZWJHTC5jb25jYXQoKS5cbiAgY29uc3RydWN0b3Ioc2hhcGVzOiBBcnJheTxbbnVtYmVyLCBudW1iZXJdPikge1xuICAgIHRoaXMub3V0cHV0U2hhcGUgPSBiYWNrZW5kX3V0aWwuY29tcHV0ZU91dFNoYXBlKHNoYXBlcywgMSAvKiBheGlzICovKTtcbiAgICB0aGlzLnZhcmlhYmxlTmFtZXMgPSBzaGFwZXMubWFwKChfLCBpKSA9PiBgVCR7aX1gKTtcblxuICAgIGNvbnN0IG9mZnNldHM6IG51bWJlcltdID0gbmV3IEFycmF5KHNoYXBlcy5sZW5ndGggLSAxKTtcbiAgICBvZmZzZXRzWzBdID0gc2hhcGVzWzBdWzFdO1xuICAgIGZvciAobGV0IGkgPSAxOyBpIDwgb2Zmc2V0cy5sZW5ndGg7IGkrKykge1xuICAgICAgb2Zmc2V0c1tpXSA9IG9mZnNldHNbaSAtIDFdICsgc2hhcGVzW2ldWzFdO1xuICAgIH1cblxuICAgIGNvbnN0IHNuaXBwZXRzID0gW2BpZiAoeUMgPCAke29mZnNldHNbMF19KSBzZXRPdXRwdXQoZ2V0VDAoeVIsIHlDKSk7YF07XG4gICAgZm9yIChsZXQgaSA9IDE7IGkgPCBvZmZzZXRzLmxlbmd0aDsgaSsrKSB7XG4gICAgICBjb25zdCBzaGlmdCA9IG9mZnNldHNbaSAtIDFdO1xuICAgICAgc25pcHBldHMucHVzaChcbiAgICAgICAgICBgZWxzZSBpZiAoeUMgPCAke29mZnNldHNbaV19KSBgICtcbiAgICAgICAgICBgc2V0T3V0cHV0KGdldFQke2l9KHlSLCB5Qy0ke3NoaWZ0fSkpO2ApO1xuICAgIH1cbiAgICBjb25zdCBsYXN0SW5kZXggPSBvZmZzZXRzLmxlbmd0aDtcbiAgICBjb25zdCBsYXN0U2hpZnQgPSBvZmZzZXRzW29mZnNldHMubGVuZ3RoIC0gMV07XG4gICAgc25pcHBldHMucHVzaChgZWxzZSBzZXRPdXRwdXQoZ2V0VCR7bGFzdEluZGV4fSh5UiwgeUMtJHtsYXN0U2hpZnR9KSk7YCk7XG5cbiAgICB0aGlzLnVzZXJDb2RlID0gYFxuICAgICAgdm9pZCBtYWluKCkge1xuICAgICAgICBpdmVjMiBjb29yZHMgPSBnZXRPdXRwdXRDb29yZHMoKTtcbiAgICAgICAgaW50IHlSID0gY29vcmRzLng7XG4gICAgICAgIGludCB5QyA9IGNvb3Jkcy55O1xuXG4gICAgICAgICR7c25pcHBldHMuam9pbignXFxuICAgICAgICAnKX1cbiAgICAgIH1cbiAgICBgO1xuICB9XG59XG4iXX0=","/**\n * @license\n * Copyright 2019 Google LLC. All Rights Reserved.\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n * =============================================================================\n */\nimport { backend_util } from '@tensorflow/tfjs-core';\nimport { getChannels } from './packing_util';\nimport { getCoordsDataType } from './shader_compiler';\nexport class ConcatPackedProgram {\n constructor(shapes, axis) {\n this.packedInputs = true;\n this.packedOutput = true;\n this.outputShape = [];\n this.outputShape = backend_util.computeOutShape(shapes, axis);\n const shape = this.outputShape;\n const rank = shape.length;\n const dtype = getCoordsDataType(rank);\n const coords = getChannels('coords', rank);\n const channels = ['x', 'y', 'z', 'w', 'u', 'v'].slice(0, rank);\n this.variableNames = shapes.map((_, i) => `T${i}`);\n const offsets = new Array(shapes.length - 1);\n offsets[0] = shapes[0][axis];\n for (let i = 1; i < offsets.length; i++) {\n offsets[i] = offsets[i - 1] + shapes[i][axis];\n }\n const channel = channels[axis];\n const lastChannels = channels.slice(-2);\n const allChannels = channels.join();\n let getValueSnippet = `if (${channel} < ${offsets[0]}) {\n return getChannel(\n getT0(${allChannels}), vec2(${lastChannels.join()}));\n }`;\n for (let i = 1; i < offsets.length; i++) {\n const shift = offsets[i - 1];\n // Note: the >= comparison below may seem unnecessary given the check\n // above but is needed to workaround branch execution issues on some\n // devices. It makes all the conditions exclusive without relying on\n // execution order.\n getValueSnippet += `\n if (${channel} < ${offsets[i]} && ${channel} >= ${offsets[i - 1]}) {\n return getChannel(\n getT${i}(${shiftedChannels(channels, channel, shift)}),\n vec2(${shiftedChannels(lastChannels, channel, shift)}));\n }`;\n }\n const lastIndex = offsets.length;\n const shift = offsets[offsets.length - 1];\n getValueSnippet += `\n return getChannel(\n getT${lastIndex}(${shiftedChannels(channels, channel, shift)}),\n vec2(${shiftedChannels(lastChannels, channel, shift)}));`;\n this.userCode = `\n float getValue(${channels.map(x => 'int ' + x)}) {\n ${getValueSnippet}\n }\n\n void main() {\n ${dtype} coords = getOutputCoords();\n vec4 result = vec4(getValue(${coords}), 0., 0., 0.);\n\n ${coords[rank - 1]} = ${coords[rank - 1]} + 1;\n if (${coords[rank - 1]} < ${shape[rank - 1]}) {\n result.g = getValue(${coords});\n }\n\n ${coords[rank - 2]} = ${coords[rank - 2]} + 1;\n if (${coords[rank - 2]} < ${shape[rank - 2]}) {\n result.a = getValue(${coords});\n }\n\n ${coords[rank - 1]} = ${coords[rank - 1]} - 1;\n if (${coords[rank - 2]} < ${shape[rank - 2]} &&\n ${coords[rank - 1]} < ${shape[rank - 1]}) {\n result.b = getValue(${coords});\n }\n setOutput(result);\n }\n `;\n }\n}\n/**\n * Return an expression for coordinates into a vector where a given channel\n * will be offset by [shift].\n *\n * @param channels the channels to consider\n * @param channel the channel we want shifted\n * @param shift the amount to subtract from the channel.\n *\n * @returns a string of the form 'x, y-[shift], z' where any one channel can\n * have the shift applied.\n */\nfunction shiftedChannels(channels, channel, shift) {\n const channelIdx = channels.indexOf(channel);\n const res = channels.map((c, idx) => {\n if (idx === channelIdx) {\n return `${c} - ${shift}`;\n }\n else {\n return c;\n }\n });\n return res.join();\n}\n//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY29uY2F0X3BhY2tlZF9ncHUuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi90ZmpzLWJhY2tlbmQtd2ViZ2wvc3JjL2NvbmNhdF9wYWNrZWRfZ3B1LnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBOzs7Ozs7Ozs7Ozs7Ozs7R0FlRztBQUVILE9BQU8sRUFBQyxZQUFZLEVBQUMsTUFBTSx1QkFBdUIsQ0FBQztBQUduRCxPQUFPLEVBQUMsV0FBVyxFQUFDLE1BQU0sZ0JBQWdCLENBQUM7QUFDM0MsT0FBTyxFQUFDLGlCQUFpQixFQUFDLE1BQU0sbUJBQW1CLENBQUM7QUFFcEQsTUFBTSxPQUFPLG1CQUFtQjtJQU85QixZQUFZLE1BQWtCLEVBQUUsSUFBWTtRQUw1QyxpQkFBWSxHQUFHLElBQUksQ0FBQztRQUNwQixpQkFBWSxHQUFHLElBQUksQ0FBQztRQUNwQixnQkFBVyxHQUFhLEVBQUUsQ0FBQztRQUl6QixJQUFJLENBQUMsV0FBVyxHQUFHLFlBQVksQ0FBQyxlQUFlLENBQUMsTUFBTSxFQUFFLElBQUksQ0FBQyxDQUFDO1FBQzlELE1BQU0sS0FBSyxHQUFHLElBQUksQ0FBQyxXQUFXLENBQUM7UUFDL0IsTUFBTSxJQUFJLEdBQUcsS0FBSyxDQUFDLE1BQU0sQ0FBQztRQUMxQixNQUFNLEtBQUssR0FBRyxpQkFBaUIsQ0FBQyxJQUFJLENBQUMsQ0FBQztRQUN0QyxNQUFNLE1BQU0sR0FBRyxXQUFXLENBQUMsUUFBUSxFQUFFLElBQUksQ0FBQyxDQUFDO1FBQzNDLE1BQU0sUUFBUSxHQUFHLENBQUMsR0FBRyxFQUFFLEdBQUcsRUFBRSxHQUFHLEVBQUUsR0FBRyxFQUFFLEdBQUcsRUFBRSxHQUFHLENBQUMsQ0FBQyxLQUFLLENBQUMsQ0FBQyxFQUFFLElBQUksQ0FBQyxDQUFDO1FBQy9ELElBQUksQ0FBQyxhQUFhLEdBQUcsTUFBTSxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLEVBQUUsRUFBRSxD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Q0FBQyxDQUFDLE1BQU0sS0FBSyxDQUFDLElBQUksR0FBRyxDQUFDLENBQUM7Y0FDckMsTUFBTSxDQUFDLElBQUksR0FBRyxDQUFDLENBQUMsTUFBTSxLQUFLLENBQUMsSUFBSSxHQUFHLENBQUMsQ0FBQztnQ0FDbkIsTUFBTTs7OztLQUlqQyxDQUFDO0lBQ0osQ0FBQztDQUNGO0FBRUQ7Ozs7Ozs7Ozs7R0FVRztBQUNILFNBQVMsZUFBZSxDQUFDLFFBQWtCLEVBQUUsT0FBZSxFQUFFLEtBQWE7SUFDekUsTUFBTSxVQUFVLEdBQUcsUUFBUSxDQUFDLE9BQU8sQ0FBQyxPQUFPLENBQUMsQ0FBQztJQUM3QyxNQUFNLEdBQUcsR0FBRyxRQUFRLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxFQUFFLEdBQUcsRUFBRSxFQUFFO1FBQ2xDLElBQUksR0FBRyxLQUFLLFVBQVUsRUFBRTtZQUN0QixPQUFPLEdBQUcsQ0FBQyxNQUFNLEtBQUssRUFBRSxDQUFDO1NBQzFCO2FBQU07WUFDTCxPQUFPLENBQUMsQ0FBQztTQUNWO0lBQ0gsQ0FBQyxDQUFDLENBQUM7SUFDSCxPQUFPLEdBQUcsQ0FBQyxJQUFJLEVBQUUsQ0FBQztBQUNwQixDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiLyoqXG4gKiBAbGljZW5zZVxuICogQ29weXJpZ2h0IDIwMTkgR29vZ2xlIExMQy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC5cbiAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSBcIkxpY2Vuc2VcIik7XG4gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuXG4gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXRcbiAqXG4gKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjBcbiAqXG4gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlXG4gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiBcIkFTIElTXCIgQkFTSVMsXG4gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC5cbiAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmRcbiAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLlxuICogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbiAqL1xuXG5pbXBvcnQge2JhY2tlbmRfdXRpbH0gZnJvbSAnQHRlbnNvcmZsb3cvdGZqcy1jb3JlJztcblxuaW1wb3J0IHtHUEdQVVByb2dyYW19IGZyb20gJy4vZ3BncHVfbWF0aCc7XG5pbXBvcnQge2dldENoYW5uZWxzfSBmcm9tICcuL3BhY2tpbmdfdXRpbCc7XG5pbXBvcnQge2dldENvb3Jkc0RhdGFUeXBlfSBmcm9tICcuL3NoYWRlcl9jb21waWxlcic7XG5cbmV4cG9ydCBjbGFzcyBDb25jYXRQYWNrZWRQcm9ncmFtIGltcGxlbWVudHMgR1BHUFVQcm9ncmFtIHtcbiAgdmFyaWFibGVOYW1lczogc3RyaW5nW107XG4gIHBhY2tlZElucHV0cyA9IHRydWU7XG4gIHBhY2tlZE91dHB1dCA9IHRydWU7XG4gIG91dHB1dFNoYXBlOiBudW1iZXJbXSA9IFtdO1xuICB1c2VyQ29kZTogc3RyaW5nO1xuXG4gIGNvbnN0cnVjdG9yKHNoYXBlczogbnVtYmVyW11bXSwgYXhpczogbnVtYmVyKSB7XG4gICAgdGhpcy5vdXRwdXRTaGFwZSA9IGJhY2tlbmRfdXRpbC5jb21wdXRlT3V0U2hhcGUoc2hhcGVzLCBheGlzKTtcbiAgICBjb25zdCBzaGFwZSA9IHRoaXMub3V0cHV0U2hhcGU7XG4gICAgY29uc3QgcmFuayA9IHNoYXBlLmxlbmd0aDtcbiAgICBjb25zdCBkdHlwZSA9IGdldENvb3Jkc0RhdGFUeXBlKHJhbmspO1xuICAgIGNvbnN0IGNvb3JkcyA9IGdldENoYW5uZWxzKCdjb29yZHMnLCByYW5rKTtcbiAgICBjb25zdCBjaGFubmVscyA9IFsneCcsICd5JywgJ3onLCAndycsICd1JywgJ3YnXS5zbGljZSgwLCByYW5rKTtcbiAgICB0aGlzLnZhcmlhYmxlTmFtZXMgPSBzaGFwZXMubWFwKChfLCBpKSA9PiBgVCR7aX1gKTtcblxuICAgIGNvbnN0IG9mZnNldHM6IG51bWJlcltdID0gbmV3IEFycmF5KHNoYXBlcy5sZW5ndGggLSAxKTtcbiAgICBvZmZzZXRzWzBdID0gc2hhcGVzWzBdW2F4aXNdO1xuICAgIGZvciAobGV0IGkgPSAxOyBpIDwgb2Zmc2V0cy5sZW5ndGg7IGkrKykge1xuICAgICAgb2Zmc2V0c1tpXSA9IG9mZnNldHNbaSAtIDFdICsgc2hhcGVzW2ldW2F4aXNdO1xuICAgIH1cblxuICAgIGNvbnN0IGNoYW5uZWwgPSBjaGFubmVsc1theGlzXTtcbiAgICBjb25zdCBsYXN0Q2hhbm5lbHMgPSBjaGFubmVscy5zbGljZSgtMik7XG4gICAgY29uc3QgYWxsQ2hhbm5lbHMgPSBjaGFubmVscy5qb2luKCk7XG5cbiAgICBsZXQgZ2V0VmFsdWVTbmlwcGV0ID0gYGlmICgke2NoYW5uZWx9IDwgJHtvZmZzZXRzWzBdfSkge1xuICAgICAgICByZXR1cm4gZ2V0Q2hhbm5lbChcbiAgICAgICAgICAgIGdldFQwKCR7YWxsQ2hhbm5lbHN9KSwgdmVjMigke2xhc3RDaGFubmVscy5qb2luKCl9KSk7XG4gICAgICAgIH1gO1xuICAgIGZvciAobGV0IGkgPSAxOyBpIDwgb2Zmc2V0cy5sZW5ndGg7IGkrKykge1xuICAgICAgY29uc3Qgc2hpZnQgPSBvZmZzZXRzW2kgLSAxXTtcbiAgICAgIC8vIE5vdGU6IHRoZSA+PSBjb21wYXJpc29uIGJlbG93IG1heSBzZWVtIHVubmVjZXNzYXJ5IGdpdmVuIHRoZSBjaGVja1xuICAgICAgLy8gYWJvdmUgYnV0IGlzIG5lZWRlZCB0byB3b3JrYXJvdW5kIGJyYW5jaCBleGVjdXRpb24gaXNzdWVzIG9uIHNvbWVcbiAgICAgIC8vIGRldmljZXMuIEl0IG1ha2VzIGFsbCB0aGUgY29uZGl0aW9ucyBleGNsdXNpdmUgd2l0aG91dCByZWx5aW5nIG9uXG4gICAgICAvLyBleGVjdXRpb24gb3JkZXIuXG4gICAgICBnZXRWYWx1ZVNuaXBwZXQgKz0gYFxuICAgICAgICBpZiAoJHtjaGFubmVsfSA8ICR7b2Zmc2V0c1tpXX0gICYmICR7Y2hhbm5lbH0gPj0gJHtvZmZzZXRzW2kgLSAxXX0pIHtcbiAgICAgICAgICByZXR1cm4gZ2V0Q2hhbm5lbChcbiAgICAgICAgICAgIGdldFQke2l9KCR7c2hpZnRlZENoYW5uZWxzKGNoYW5uZWxzLCBjaGFubmVsLCBzaGlmdCl9KSxcbiAgICAgICAgICAgIHZlYzIoJHtzaGlmdGVkQ2hhbm5lbHMobGFzdENoYW5uZWxzLCBjaGFubmVsLCBzaGlmdCl9KSk7XG4gICAgICAgIH1gO1xuICAgIH1cbiAgICBjb25zdCBsYXN0SW5kZXggPSBvZmZzZXRzLmxlbmd0aDtcbiAgICBjb25zdCBzaGlmdCA9IG9mZnNldHNbb2Zmc2V0cy5sZW5ndGggLSAxXTtcbiAgICBnZXRWYWx1ZVNuaXBwZXQgKz0gYFxuICAgICAgICByZXR1cm4gZ2V0Q2hhbm5lbChcbiAgICAgICAgICBnZXRUJHtsYXN0SW5kZXh9KCR7c2hpZnRlZENoYW5uZWxzKGNoYW5uZWxzLCBjaGFubmVsLCBzaGlmdCl9KSxcbiAgICAgICAgICB2ZWMyKCR7c2hpZnRlZENoYW5uZWxzKGxhc3RDaGFubmVscywgY2hhbm5lbCwgc2hpZnQpfSkpO2A7XG5cbiAgICB0aGlzLnVzZXJDb2RlID0gYFxuICAgICAgZmxvYXQgZ2V0VmFsdWUoJHtjaGFubmVscy5tYXAoeCA9PiAnaW50ICcgKyB4KX0pIHtcbiAgICAgICAgJHtnZXRWYWx1ZVNuaXBwZXR9XG4gICAgICB9XG5cbiAgICAgIHZvaWQgbWFpbigpIHtcbiAgICAgICAgJHtkdHlwZX0gY29vcmRzID0gZ2V0T3V0cHV0Q29vcmRzKCk7XG4gICAgICAgIHZlYzQgcmVzdWx0ID0gdmVjNChnZXRWYWx1ZSgke2Nvb3Jkc30pLCAwLiwgMC4sIDAuKTtcblxuICAgICAgICAke2Nvb3Jkc1tyYW5rIC0gMV19ID0gJHtjb29yZHNbcmFuayAtIDFdfSArIDE7XG4gICAgICAgIGlmICgke2Nvb3Jkc1tyYW5rIC0gMV19IDwgJHtzaGFwZVtyYW5rIC0gMV19KSB7XG4gICAgICAgICAgcmVzdWx0LmcgPSBnZXRWYWx1ZSgke2Nvb3Jkc30pO1xuICAgICAgICB9XG5cbiAgICAgICAgJHtjb29yZHNbcmFuayAtIDJdfSA9ICR7Y29vcmRzW3JhbmsgLSAyXX0gKyAxO1xuICAgICAgICBpZiAoJHtjb29yZHNbcmFuayAtIDJdfSA8ICR7c2hhcGVbcmFuayAtIDJdfSkge1xuICAgICAgICAgIHJlc3VsdC5hID0gZ2V0VmFsdWUoJHtjb29yZHN9KTtcbiAgICAgICAgfVxuXG4gICAgICAgICR7Y29vcmRzW3JhbmsgLSAxXX0gPSAke2Nvb3Jkc1tyYW5rIC0gMV19IC0gMTtcbiAgICAgICAgaWYgKCR7Y29vcmRzW3JhbmsgLSAyXX0gPCAke3NoYXBlW3JhbmsgLSAyXX0gJiZcbiAgICAgICAgICAgICR7Y29vcmRzW3JhbmsgLSAxXX0gPCAke3NoYXBlW3JhbmsgLSAxXX0pIHtcbiAgICAgICAgICByZXN1bHQuYiA9IGdldFZhbHVlKCR7Y29vcmRzfSk7XG4gICAgICAgIH1cbiAgICAgICAgc2V0T3V0cHV0KHJlc3VsdCk7XG4gICAgICB9XG4gICAgYDtcbiAgfVxufVxuXG4vKipcbiAqIFJldHVybiBhbiBleHByZXNzaW9uIGZvciBjb29yZGluYXRlcyBpbnRvIGEgdmVjdG9yIHdoZXJlIGEgZ2l2ZW4gY2hhbm5lbFxuICogd2lsbCBiZSBvZmZzZXQgYnkgW3NoaWZ0XS5cbiAqXG4gKiBAcGFyYW0gY2hhbm5lbHMgdGhlIGNoYW5uZWxzIHRvIGNvbnNpZGVyXG4gKiBAcGFyYW0gY2hhbm5lbCB0aGUgY2hhbm5lbCB3ZSB3YW50IHNoaWZ0ZWRcbiAqIEBwYXJhbSBzaGlmdCAgdGhlIGFtb3VudCB0byBzdWJ0cmFjdCBmcm9tIHRoZSBjaGFubmVsLlxuICpcbiAqIEByZXR1cm5zIGEgc3RyaW5nIG9mIHRoZSBmb3JtICd4LCB5LVtzaGlmdF0sIHonIHdoZXJlIGFueSBvbmUgY2hhbm5lbCBjYW5cbiAqIGhhdmUgdGhlIHNoaWZ0IGFwcGxpZWQuXG4gKi9cbmZ1bmN0aW9uIHNoaWZ0ZWRDaGFubmVscyhjaGFubmVsczogc3RyaW5nW10sIGNoYW5uZWw6IHN0cmluZywgc2hpZnQ6IG51bWJlcikge1xuICBjb25zdCBjaGFubmVsSWR4ID0gY2hhbm5lbHMuaW5kZXhPZihjaGFubmVsKTtcbiAgY29uc3QgcmVzID0gY2hhbm5lbHMubWFwKChjLCBpZHgpID0+IHtcbiAgICBpZiAoaWR4ID09PSBjaGFubmVsSWR4KSB7XG4gICAgICByZXR1cm4gYCR7Y30gLSAke3NoaWZ0fWA7XG4gICAgfSBlbHNlIHtcbiAgICAgIHJldHVybiBjO1xuICAgIH1cbiAgfSk7XG4gIHJldHVybiByZXMuam9pbigpO1xufVxuIl19","/**\n * @license\n * Copyright 2020 Google LLC. All Rights Reserved.\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n * =============================================================================\n */\nimport { Imag } from '@tensorflow/tfjs-core';\nimport { identity } from './Identity';\nexport function imag(args) {\n const { inputs, backend } = args;\n const { input } = inputs;\n const inputData = backend.texData.get(input.dataId);\n return identity({ inputs: { x: inputData.complexTensorInfos.imag }, backend });\n}\nexport const imagConfig = {\n kernelName: Imag,\n backendName: 'webgl',\n kernelFunc: imag\n};\n//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiSW1hZy5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uLy4uL3RmanMtYmFja2VuZC13ZWJnbC9zcmMva2VybmVscy9JbWFnLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBOzs7Ozs7Ozs7Ozs7Ozs7R0FlRztBQUVILE9BQU8sRUFBQyxJQUFJLEVBQW1ELE1BQU0sdUJBQXVCLENBQUM7QUFHN0YsT0FBTyxFQUFDLFFBQVEsRUFBQyxNQUFNLFlBQVksQ0FBQztBQUVwQyxNQUFNLFVBQVUsSUFBSSxDQUFDLElBQXFEO0lBRXhFLE1BQU0sRUFBQyxNQUFNLEVBQUUsT0FBTyxFQUFDLEdBQUcsSUFBSSxDQUFDO0lBQy9CLE1BQU0sRUFBQyxLQUFLLEVBQUMsR0FBRyxNQUFNLENBQUM7SUFDdkIsTUFBTSxTQUFTLEdBQUcsT0FBTyxDQUFDLE9BQU8sQ0FBQyxHQUFHLENBQUMsS0FBSyxDQUFDLE1BQU0sQ0FBQyxDQUFDO0lBRXBELE9BQU8sUUFBUSxDQUFDLEVBQUMsTUFBTSxFQUFFLEVBQUMsQ0FBQyxFQUFFLFNBQVMsQ0FBQyxrQkFBa0IsQ0FBQyxJQUFJLEVBQUMsRUFBRSxPQUFPLEVBQUMsQ0FBQyxDQUFDO0FBQzdFLENBQUM7QUFFRCxNQUFNLENBQUMsTUFBTSxVQUFVLEdBQWlCO0lBQ3RDLFVBQVUsRUFBRSxJQUFJO0lBQ2hCLFdBQVcsRUFBRSxPQUFPO0lBQ3BCLFVBQVUsRUFBRSxJQUF3QjtDQUNyQyxDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiLyoqXG4gKiBAbGljZW5zZVxuICogQ29weXJpZ2h0IDIwMjAgR29vZ2xlIExMQy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC5cbiAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSBcIkxpY2Vuc2VcIik7XG4gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuXG4gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXRcbiAqXG4gKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjBcbiAqXG4gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlXG4gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiBcIkFTIElTXCIgQkFTSVMsXG4gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC5cbiAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmRcbiAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLlxuICogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbiAqL1xuXG5pbXBvcnQge0ltYWcsIEltYWdJbnB1dHMsIEtlcm5lbENvbmZpZywgS2VybmVsRnVuYywgVGVuc29ySW5mb30gZnJvbSAnQHRlbnNvcmZsb3cvdGZqcy1jb3JlJztcblxuaW1wb3J0IHtNYXRoQmFja2VuZFdlYkdMfSBmcm9tICcuLi9iYWNrZW5kX3dlYmdsJztcbmltcG9ydCB7aWRlbnRpdHl9IGZyb20gJy4vSWRlbnRpdHknO1xuXG5leHBvcnQgZnVuY3Rpb24gaW1hZyhhcmdzOiB7aW5wdXRzOiBJbWFnSW5wdXRzLCBiYWNrZW5kOiBNYXRoQmFja2VuZFdlYkdMfSk6XG4gICAgVGVuc29ySW5mbyB7XG4gIGNvbnN0IHtpbnB1dHMsIGJhY2tlbmR9ID0gYXJncztcbiAgY29uc3Qge2lucHV0fSA9IGlucHV0cztcbiAgY29uc3QgaW5wdXREYXRhID0gYmFja2VuZC50ZXhEYXRhLmdldChpbnB1dC5kYXRhSWQpO1xuXG4gIHJldHVybiBpZGVudGl0eSh7aW5wdXRzOiB7eDogaW5wdXREYXRhLmNvbXBsZXhUZW5zb3JJbmZvcy5pbWFnfSwgYmFja2VuZH0pO1xufVxuXG5leHBvcnQgY29uc3QgaW1hZ0NvbmZpZzogS2VybmVsQ29uZmlnID0ge1xuICBrZXJuZWxOYW1lOiBJbWFnLFxuICBiYWNrZW5kTmFtZTogJ3dlYmdsJyxcbiAga2VybmVsRnVuYzogaW1hZyBhcyB7fSBhcyBLZXJuZWxGdW5jXG59O1xuIl19","/**\n * @license\n * Copyright 2020 Google LLC. All Rights Reserved.\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n * =============================================================================\n */\nimport { backend_util, env, util } from '@tensorflow/tfjs-core';\nimport { ConcatProgram } from '../concat_gpu';\nimport { ConcatPackedProgram } from '../concat_packed_gpu';\nimport { concatImplCPU } from '../kernel_utils/shared';\nimport { complex } from './Complex';\nimport { imag } from './Imag';\nimport { real } from './Real';\nimport { reshape } from './Reshape';\nexport function concatImpl(inputs, axis, backend) {\n const dtype = inputs[0].dtype;\n if (dtype === 'complex64') {\n const reals = inputs.map((t) => real({ inputs: { input: t }, backend }));\n const imags = inputs.map((t) => imag({ inputs: { input: t }, backend }));\n const realConcated = concatImpl(reals, axis, backend);\n const imagConcated = concatImpl(imags, axis, backend);\n const result = complex({ inputs: { real: realConcated, imag: imagConcated }, backend });\n reals.forEach(r => backend.disposeIntermediateTensorInfo(r));\n imags.forEach(i => backend.disposeIntermediateTensorInfo(i));\n backend.disposeIntermediateTensorInfo(realConcated);\n backend.disposeIntermediateTensorInfo(imagConcated);\n return result;\n }\n let runOnCpu = backend.shouldExecuteOnCPU(inputs);\n // Run on cpu if dtype is string. For string, the backend represents it\n // as Uint8Array[], where each Uint8Array is a character. Given that the\n // computation is only on the outer array, uploading the whole data onto\n // gpu is wasteful. Also, currently webgl doesn't have a design to\n // upload and retrieve Uint8Array[] between cpu and gpu. Therefore, we\n // just run the kernel on cpu if dtype is string.\n if (dtype === 'string') {\n runOnCpu = true;\n }\n if (runOnCpu) {\n // Any concat of n-dimensional tensors across any axis can be reduced to\n // a concatenation of two-dimensional tensors across the axis 1 by first\n // partitioning the axes of the original tensors into those less than the\n // axis to be concatenated and the rest. Then reshape the tensors\n // into a two-dimensional tensor by collapsing these two sets of axes and\n // concatenate the resulting matrices across the axis 1, finally reshaping\n // the result to have the proper shape.\n const tensors2D = inputs.map(t => {\n const innerSize = util.sizeFromShape(t.shape.slice(axis));\n const shape = [-1, innerSize];\n return reshape({ inputs: { x: t }, backend, attrs: { shape } });\n });\n const inputsValShapes = tensors2D.map(t => {\n return { vals: backend.readSync(t.dataId), shape: t.shape };\n });\n // Concats 2d tensors along axis=1.\n const outShape = backend_util.computeOutShape(tensors2D.map(t => t.shape), 1 /* axis */);\n const simplyConcat = tensors2D[0].shape[0] === 1;\n const outVals = concatImplCPU(inputsValShapes, outShape, dtype, simplyConcat);\n const finalOutShape = backend_util.computeOutShape(inputs.map(t => t.shape), axis);\n const outInfo = backend.makeTensorInfo(finalOutShape, dtype, outVals);\n tensors2D.forEach(t => backend.disposeIntermediateTensorInfo(t));\n return outInfo;\n }\n const maxTexturesInShader = env().getNumber('WEBGL_MAX_TEXTURES_IN_SHADER');\n if (inputs.length > maxTexturesInShader) {\n const reducedInputs = [];\n for (let i = 0; i < inputs.length; i += maxTexturesInShader) {\n const subArray = inputs.slice(i, i + maxTexturesInShader);\n reducedInputs.push(concatImpl(subArray, axis, backend));\n }\n const result = concatImpl(reducedInputs, axis, backend);\n for (const i of reducedInputs) {\n backend.disposeIntermediateTensorInfo(i);\n }\n return result;\n }\n if (env().getBool('WEBGL_PACK_ARRAY_OPERATIONS') &&\n inputs[0].shape.length > 1) {\n const program = new ConcatPackedProgram(inputs.map(t => t.shape), axis);\n return backend.runWebGLProgram(program, inputs, dtype);\n }\n const { tensors2D, outShape } = computeTensors2D(inputs, axis, backend);\n const program = new ConcatProgram(tensors2D.map(t => t.shape));\n const result = backend.runWebGLProgram(program, tensors2D, dtype);\n tensors2D.forEach(r => backend.disposeIntermediateTensorInfo(r));\n const reshapedResult = reshape({ inputs: { x: result }, attrs: { shape: outShape }, backend });\n backend.disposeIntermediateTensorInfo(result);\n return reshapedResult;\n}\nfunction computeTensors2D(inputs, axis, backend) {\n // Any concat of n-dimensional tensors across any axis can be reduced to\n // a concatenation of two-dimensional tensors across the axis 1 by first\n // partitioning the axes of the original tensors into those less than the\n // axis to be concatenated and the rest. Then reshape the tensors\n // into a two-dimensional tensor by collapsing these two sets of axes and\n // concatenate the resulting matrices across the axis 1, finally reshaping\n // the result to have the proper shape.\n const outShape = backend_util.computeOutShape(inputs.map(t => t.shape), axis);\n const tensors2D = inputs.map(x => reshape({\n inputs: { x },\n attrs: { shape: [-1, util.sizeFromShape(x.shape.slice(axis))] },\n backend\n }));\n return { tensors2D, outShape };\n}\n//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiQ29uY2F0X2ltcGwuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi8uLi90ZmpzLWJhY2tlbmQtd2ViZ2wvc3JjL2tlcm5lbHMvQ29uY2F0X2ltcGwudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUE7Ozs7Ozs7Ozs7Ozs7OztHQWVHO0FBRUgsT0FBTyxFQUFDLFlBQVksRUFBZ0IsR0FBRyxFQUFjLElBQUksRUFBQyxNQUFNLHVCQUF1QixDQUFDO0FBR3hGLE9BQU8sRUFBQyxhQUFhLEVBQUMsTUFBTSxlQUFlLENBQUM7QUFDNUMsT0FBTyxFQUFDLG1CQUFtQixFQUFDLE1BQU0sc0JBQXNCLENBQUM7QUFDekQsT0FBTyxFQUFDLGFBQWEsRUFBQyxNQUFNLHdCQUF3QixDQUFDO0FBRXJELE9BQU8sRUFBQyxPQUFPLEVBQUMsTUFBTSxXQUFXLENBQUM7QUFDbEMsT0FBTyxFQUFDLElBQUksRUFBQyxNQUFNLFFBQVEsQ0FBQztBQUM1QixPQUFPLEVBQUMsSUFBSSxFQUFDLE1BQU0sUUFBUSxDQUFDO0FBQzVCLE9BQU8sRUFBQyxPQUFPLEVBQUMsTUFBTSxXQUFXLENBQUM7QUFFbEMsTUFBTSxVQUFVLFVBQVUsQ0FDdEIsTUFBb0IsRUFBRSxJQUFZLEVBQUUsT0FBeUI7SUFDL0QsTUFBTSxLQUFLLEdBQUcsTUFBTSxDQUFDLENBQUMsQ0FBQyxDQUFDLEtBQUssQ0FBQztJQUM5QixJQUFJLEtBQUssS0FBSyxXQUFXLEVBQUU7UUFDekIsTUFBTSxLQUFLLEdBQUcsTUFBTSxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsRUFBRSxFQUFFLENBQUMsSUFBSSxDQUFDLEVBQUMsTUFBTSxFQUFFLEVBQUMsS0FBSyxFQUFFLENBQUMsRUFBQyxFQUFFLE9BQU8sRUFBQyxDQUFDLENBQUMsQ0FBQztRQUNyRSxNQUFNLEtBQUssR0FBRyxNQUFNLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxFQUFFLEVBQUUsQ0FBQyxJQUFJLENBQUMsRUFBQyxNQUFNLEVBQUUsRUFBQyxLQUFLLEVBQUUsQ0FBQyxFQUFDLEVBQUUsT0FBTyxFQUFDLENBQUMsQ0FBQyxDQUFDO1FBRXJFLE1BQU0sWUFBWSxHQUFHLFVBQVUsQ0FBQyxLQUFLLEVBQUUsSUFBSSxFQUFFLE9BQU8sQ0FBQyxDQUFDO1FBQ3RELE1BQU0sWUFBWSxHQUFHLFVBQVUsQ0FBQyxLQUFLLEVBQUUsSUFBSSxFQUFFLE9BQU8sQ0FBQyxDQUFDO1FBRXRELE1BQU0sTUFBTSxHQUNSLE9BQU8sQ0FBQyxFQUFDLE1BQU0sRUFBRSxFQUFDLElBQUksRUFBRSxZQUFZLEVBQUUsSUFBSSxFQUFFLFlBQVksRUFBQyxFQUFFLE9BQU8sRUFBQyxDQUFDLENBQUM7UUFFekUsS0FBSyxDQUFDLE9BQU8sQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLE9BQU8sQ0FBQyw2QkFBNkIsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDO1FBQzdELEtBQUssQ0FBQyxPQUFPLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxPQUFPLENBQUMsNkJBQTZCLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQztRQUM3RCxPQUFPLENBQUMsNkJBQTZCLENBQUMsWUFBWSxDQUFDLENBQUM7UUFDcEQsT0FBTyxDQUFDLDZCQUE2QixDQUFDLFlBQVksQ0FBQyxDQUFDO1FBRXBELE9BQU8sTUFBTSxDQUFDO0tBQ2Y7SUFFRCxJQUFJLFFBQVEsR0FBRyxPQUFPLENBQUMsa0JBQWtCLENBQUMsTUFBTSxDQUFDLENBQUM7SUFFbEQsdUVBQXVFO0lBQ3ZFLHdFQUF3RTtJQUN4RSx3RUFBd0U7SUFDeEUsa0VBQWtFO0lBQ2xFLHNFQUFzRTtJQUN0RSxpREFBaUQ7SUFDakQsSUFBSSxLQUFLLEtBQUssUUFBUSxFQUFFO1FBQ3RCLFFBQVEsR0FBRyxJQUFJLENBQUM7S0FDakI7SUFFRCxJQUFJLFFBQVEsRUFBRTtRQUNaLHdFQUF3RTtRQUN4RSx3RUFBd0U7UUFDeEUseUVBQXlFO1FBQ3pFLGlFQUFpRTtRQUNqRSx5RUFBeUU7UUFDekUsMEVBQTBFO1FBQzFFLHVDQUF1QztRQUN2QyxNQUFNLFNBQVMsR0FBRyxNQUFNLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxFQUFFO1lBQy9CLE1BQU0sU0FBUyxHQUFHLElBQUksQ0FBQyxhQUFhLENBQUMsQ0FBQyxDQUFDLEtBQUssQ0FBQyxLQUFLLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQztZQUMxRCxNQUFNLEtBQUssR0FBRyxDQUFDLENBQUMsQ0FBQyxFQUFFLFNBQVMsQ0FBQyxDQUFDO1lBQzlCLE9BQU8sT0FBTyxDQUFDLEVBQUMsTUFBTSxFQUFFLEVBQUMsQ0FBQyxFQUFFLENBQUMsRUFBQyxFQUFFLE9BQU8sRUFBRSxLQUFLLEVBQUUsRUFBQyxLQUFLLEVBQUMsRUFBQyxDQUFDLENBQUM7UUFDNUQsQ0FBQyxDQUFDLENBQUM7UUFFSCxNQUFNLGVBQWUsR0FBRyxTQUFTLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxFQUFFO1lBQ3hDLE9BQU8sRUFBQyxJQUFJLEVBQUUsT0FBTyxDQUFDLFFBQVEsQ0FBQyxDQUFDLENBQUMsTUFBTSxDQUFDLEVBQUUsS0FBSyxFQUFFLENBQUMsQ0FBQyxLQUFLLEVBQUMsQ0FBQztRQUM1RCxDQUFDLENBQUMsQ0FBQztRQUVILG1DQUFtQztRQUNuQyxNQUFNLFFBQVEsR0FDVixZQUFZLENBQUMsZUFBZSxDQUFDLFNBQVMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsS0FBSyxDQUFDLEVBQUUsQ0FBQyxDQUFDLFVBQVUsQ0FBQyxDQUFDO1FBQzVFLE1BQU0sWUFBWSxHQUFHLFNBQVMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDLEtBQUssQ0FBQyxDQUFDO1FBQ2pELE1BQU0sT0FBTyxHQUNULGFBQWEsQ0FBQyxlQUFlLEVBQUUsUUFBUSxFQUFFLEtBQUssRUFBRSxZQUFZLENBQUMsQ0FBQztRQUVsRSxNQUFNLGFBQWEsR0FDZixZQUFZLENBQUMsZUFBZSxDQUFDLE1BQU0sQ0FBQyxHQUFHLENBQUMsQ0FBQyxD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RTtJQUMxRSx1Q0FBdUM7SUFDdkMsTUFBTSxRQUFRLEdBQUcsWUFBWSxDQUFDLGVBQWUsQ0FBQyxNQUFNLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLEtBQUssQ0FBQyxFQUFFLElBQUksQ0FBQyxDQUFDO0lBQzlFLE1BQU0sU0FBUyxHQUFHLE1BQU0sQ0FBQyxHQUFHLENBQ3hCLENBQUMsQ0FBQyxFQUFFLENBQUMsT0FBTyxDQUFDO1FBQ1gsTUFBTSxFQUFFLEVBQUMsQ0FBQyxFQUFDO1FBQ1gsS0FBSyxFQUFFLEVBQUMsS0FBSyxFQUFFLENBQUMsQ0FBQyxDQUFDLEVBQUUsSUFBSSxDQUFDLGFBQWEsQ0FBQyxDQUFDLENBQUMsS0FBSyxDQUFDLEtBQUssQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLEVBQUM7UUFDN0QsT0FBTztLQUNSLENBQUMsQ0FBQyxDQUFDO0lBRVIsT0FBTyxFQUFDLFNBQVMsRUFBRSxRQUFRLEVBQUMsQ0FBQztBQUMvQixDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiLyoqXG4gKiBAbGljZW5zZVxuICogQ29weXJpZ2h0IDIwMjAgR29vZ2xlIExMQy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC5cbiAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSBcIkxpY2Vuc2VcIik7XG4gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuXG4gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXRcbiAqXG4gKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjBcbiAqXG4gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlXG4gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiBcIkFTIElTXCIgQkFTSVMsXG4gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC5cbiAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmRcbiAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLlxuICogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbiAqL1xuXG5pbXBvcnQge2JhY2tlbmRfdXRpbCwgQ29uY2F0SW5wdXRzLCBlbnYsIFRlbnNvckluZm8sIHV0aWx9IGZyb20gJ0B0ZW5zb3JmbG93L3RmanMtY29yZSc7XG5cbmltcG9ydCB7TWF0aEJhY2tlbmRXZWJHTH0gZnJvbSAnLi4vYmFja2VuZF93ZWJnbCc7XG5pbXBvcnQge0NvbmNhdFByb2dyYW19IGZyb20gJy4uL2NvbmNhdF9ncHUnO1xuaW1wb3J0IHtDb25jYXRQYWNrZWRQcm9ncmFtfSBmcm9tICcuLi9jb25jYXRfcGFja2VkX2dwdSc7XG5pbXBvcnQge2NvbmNhdEltcGxDUFV9IGZyb20gJy4uL2tlcm5lbF91dGlscy9zaGFyZWQnO1xuXG5pbXBvcnQge2NvbXBsZXh9IGZyb20gJy4vQ29tcGxleCc7XG5pbXBvcnQge2ltYWd9IGZyb20gJy4vSW1hZyc7XG5pbXBvcnQge3JlYWx9IGZyb20gJy4vUmVhbCc7XG5pbXBvcnQge3Jlc2hhcGV9IGZyb20gJy4vUmVzaGFwZSc7XG5cbmV4cG9ydCBmdW5jdGlvbiBjb25jYXRJbXBsKFxuICAgIGlucHV0czogQ29uY2F0SW5wdXRzLCBheGlzOiBudW1iZXIsIGJhY2tlbmQ6IE1hdGhCYWNrZW5kV2ViR0wpOiBUZW5zb3JJbmZvIHtcbiAgY29uc3QgZHR5cGUgPSBpbnB1dHNbMF0uZHR5cGU7XG4gIGlmIChkdHlwZSA9PT0gJ2NvbXBsZXg2NCcpIHtcbiAgICBjb25zdCByZWFscyA9IGlucHV0cy5tYXAoKHQpID0+IHJlYWwoe2lucHV0czoge2lucHV0OiB0fSwgYmFja2VuZH0pKTtcbiAgICBjb25zdCBpbWFncyA9IGlucHV0cy5tYXAoKHQpID0+IGltYWcoe2lucHV0czoge2lucHV0OiB0fSwgYmFja2VuZH0pKTtcblxuICAgIGNvbnN0IHJlYWxDb25jYXRlZCA9IGNvbmNhdEltcGwocmVhbHMsIGF4aXMsIGJhY2tlbmQpO1xuICAgIGNvbnN0IGltYWdDb25jYXRlZCA9IGNvbmNhdEltcGwoaW1hZ3MsIGF4aXMsIGJhY2tlbmQpO1xuXG4gICAgY29uc3QgcmVzdWx0ID1cbiAgICAgICAgY29tcGxleCh7aW5wdXRzOiB7cmVhbDogcmVhbENvbmNhdGVkLCBpbWFnOiBpbWFnQ29uY2F0ZWR9LCBiYWNrZW5kfSk7XG5cbiAgICByZWFscy5mb3JFYWNoKHIgPT4gYmFja2VuZC5kaXNwb3NlSW50ZXJtZWRpYXRlVGVuc29ySW5mbyhyKSk7XG4gICAgaW1hZ3MuZm9yRWFjaChpID0+IGJhY2tlbmQuZGlzcG9zZUludGVybWVkaWF0ZVRlbnNvckluZm8oaSkpO1xuICAgIGJhY2tlbmQuZGlzcG9zZUludGVybWVkaWF0ZVRlbnNvckluZm8ocmVhbENvbmNhdGVkKTtcbiAgICBiYWNrZW5kLmRpc3Bvc2VJbnRlcm1lZGlhdGVUZW5zb3JJbmZvKGltYWdDb25jYXRlZCk7XG5cbiAgICByZXR1cm4gcmVzdWx0O1xuICB9XG5cbiAgbGV0IHJ1bk9uQ3B1ID0gYmFja2VuZC5zaG91bGRFeGVjdXRlT25DUFUoaW5wdXRzKTtcblxuICAvLyBSdW4gb24gY3B1IGlmIGR0eXBlIGlzIHN0cmluZy4gRm9yIHN0cmluZywgdGhlIGJhY2tlbmQgcmVwcmVzZW50cyBpdFxuICAvLyBhcyBVaW50OEFycmF5W10sIHdoZXJlIGVhY2ggVWludDhBcnJheSBpcyBhIGNoYXJhY3Rlci4gR2l2ZW4gdGhhdCB0aGVcbiAgLy8gY29tcHV0YXRpb24gaXMgb25seSBvbiB0aGUgb3V0ZXIgYXJyYXksIHVwbG9hZGluZyB0aGUgd2hvbGUgZGF0YSBvbnRvXG4gIC8vIGdwdSBpcyB3YXN0ZWZ1bC4gQWxzbywgY3VycmVudGx5IHdlYmdsIGRvZXNuJ3QgaGF2ZSBhIGRlc2lnbiB0b1xuICAvLyB1cGxvYWQgYW5kIHJldHJpZXZlIFVpbnQ4QXJyYXlbXSBiZXR3ZWVuIGNwdSBhbmQgZ3B1LiBUaGVyZWZvcmUsIHdlXG4gIC8vIGp1c3QgcnVuIHRoZSBrZXJuZWwgb24gY3B1IGlmIGR0eXBlIGlzIHN0cmluZy5cbiAgaWYgKGR0eXBlID09PSAnc3RyaW5nJykge1xuICAgIHJ1bk9uQ3B1ID0gdHJ1ZTtcbiAgfVxuXG4gIGlmIChydW5PbkNwdSkge1xuICAgIC8vIEFueSBjb25jYXQgb2Ygbi1kaW1lbnNpb25hbCB0ZW5zb3JzIGFjcm9zcyBhbnkgYXhpcyBjYW4gYmUgcmVkdWNlZCB0b1xuICAgIC8vIGEgY29uY2F0ZW5hdGlvbiBvZiB0d28tZGltZW5zaW9uYWwgdGVuc29ycyBhY3Jvc3MgdGhlIGF4aXMgMSBieSBmaXJzdFxuICAgIC8vIHBhcnRpdGlvbmluZyB0aGUgYXhlcyBvZiB0aGUgb3JpZ2luYWwgdGVuc29ycyBpbnRvIHRob3NlIGxlc3MgdGhhbiB0aGVcbiAgICAvLyBheGlzIHRvIGJlIGNvbmNhdGVuYXRlZCBhbmQgdGhlIHJlc3QuIFRoZW4gcmVzaGFwZSB0aGUgdGVuc29yc1xuICAgIC8vIGludG8gYSB0d28tZGltZW5zaW9uYWwgdGVuc29yIGJ5IGNvbGxhcHNpbmcgdGhlc2UgdHdvIHNldHMgb2YgYXhlcyBhbmRcbiAgICAvLyBjb25jYXRlbmF0ZSB0aGUgcmVzdWx0aW5nIG1hdHJpY2VzIGFjcm9zcyB0aGUgYXhpcyAxLCBmaW5hbGx5IHJlc2hhcGluZ1xuICAgIC8vIHRoZSByZXN1bHQgdG8gaGF2ZSB0aGUgcHJvcGVyIHNoYXBlLlxuICAgIGNvbnN0IHRlbnNvcnMyRCA9IGlucHV0cy5tYXAodCA9PiB7XG4gICAgICBjb25zdCBpbm5lclNpemUgPSB1dGlsLnNpemVGcm9tU2hhcGUodC5zaGFwZS5zbGljZShheGlzKSk7XG4gICAgICBjb25zdCBzaGFwZSA9IFstMSwgaW5uZXJTaXplXTtcbiAgICAgIHJldHVybiByZXNoYXBlKHtpbnB1dHM6IHt4OiB0fSwgYmFja2VuZCwgYXR0cnM6IHtzaGFwZX19KTtcbiAgICB9KTtcblxuICAgIGNvbnN0IGlucHV0c1ZhbFNoYXBlcyA9IHRlbnNvcnMyRC5tYXAodCA9PiB7XG4gICAgICByZXR1cm4ge3ZhbHM6IGJhY2tlbmQucmVhZFN5bmModC5kYXRhSWQpLCBzaGFwZTogdC5zaGFwZX07XG4gICAgfSk7XG5cbiAgICAvLyBDb25jYXRzIDJkIHRlbnNvcnMgYWxvbmcgYXhpcz0xLlxuICAgIGNvbnN0IG91dFNoYXBlID1cbiAgICAgICAgYmFja2VuZF91dGlsLmNvbXB1dGVPdXRTaGFwZSh0ZW5zb3JzMkQubWFwKHQgPT4gdC5zaGFwZSksIDEgLyogYXhpcyAqLyk7XG4gICAgY29uc3Qgc2ltcGx5Q29uY2F0ID0gdGVuc29yczJEWzBdLnNoYXBlWzBdID09PSAxO1xuICAgIGNvbnN0IG91dFZhbHMgPVxuICAgICAgICBjb25jYXRJbXBsQ1BVKGlucHV0c1ZhbFNoYXBlcywgb3V0U2hhcGUsIGR0eXBlLCBzaW1wbHlDb25jYXQpO1xuXG4gICAgY29uc3QgZmluYWxPdXRTaGFwZSA9XG4gICAgICAgIGJhY2tlbmRfdXRpbC5jb21wdXRlT3V0U2hhcGUoaW5wdXRzLm1hcCh0ID0+IHQuc2hhcGUpLCBheGlzKTtcblxuICAgIGNvbnN0IG91dEluZm8gPSBiYWNrZW5kLm1ha2VUZW5zb3JJbmZvKGZpbmFsT3V0U2hhcGUsIGR0eXBlLCBvdXRWYWxzKTtcblxuICAgIHRlbnNvcnMyRC5mb3JFYWNoKHQgPT4gYmFja2VuZC5kaXNwb3NlSW50ZXJtZWRpYXRlVGVuc29ySW5mbyh0KSk7XG5cbiAgICByZXR1cm4gb3V0SW5mbztcbiAgfVxuXG4gIGNvbnN0IG1heFRleHR1cmVzSW5TaGFkZXIgPSBlbnYoKS5nZXROdW1iZXIoJ1dFQkdMX01BWF9URVhUVVJFU19JTl9TSEFERVInKTtcbiAgaWYgKGlucHV0cy5sZW5ndGggPiBtYXhUZXh0dXJlc0luU2hhZGVyKSB7XG4gICAgY29uc3QgcmVkdWNlZElucHV0cyA9IFtdO1xuICAgIGZvciAobGV0IGkgPSAwOyBpIDwgaW5wdXRzLmxlbmd0aDsgaSArPSBtYXhUZXh0dXJlc0luU2hhZGVyKSB7XG4gICAgICBjb25zdCBzdWJBcnJheSA9IGlucHV0cy5zbGljZShpLCBpICsgbWF4VGV4dHVyZXNJblNoYWRlcik7XG4gICAgICByZWR1Y2VkSW5wdXRzLnB1c2goY29uY2F0SW1wbChzdWJBcnJheSwgYXhpcywgYmFja2VuZCkpO1xuICAgIH1cbiAgICBjb25zdCByZXN1bHQgPSBjb25jYXRJbXBsKHJlZHVjZWRJbnB1dHMsIGF4aXMsIGJhY2tlbmQpO1xuXG4gICAgZm9yIChjb25zdCBpIG9mIHJlZHVjZWRJbnB1dHMpIHtcbiAgICAgIGJhY2tlbmQuZGlzcG9zZUludGVybWVkaWF0ZVRlbnNvckluZm8oaSk7XG4gICAgfVxuXG4gICAgcmV0dXJuIHJlc3VsdDtcbiAgfVxuXG4gIGlmIChlbnYoKS5nZXRCb29sKCdXRUJHTF9QQUNLX0FSUkFZX09QRVJBVElPTlMnKSAmJlxuICAgICAgaW5wdXRzWzBdLnNoYXBlLmxlbmd0aCA+IDEpIHtcbiAgICBjb25zdCBwcm9ncmFtID0gbmV3IENvbmNhdFBhY2tlZFByb2dyYW0oaW5wdXRzLm1hcCh0ID0+IHQuc2hhcGUpLCBheGlzKTtcbiAgICByZXR1cm4gYmFja2VuZC5ydW5XZWJHTFByb2dyYW0ocHJvZ3JhbSwgaW5wdXRzLCBkdHlwZSk7XG4gIH1cblxuICBjb25zdCB7dGVuc29yczJELCBvdXRTaGFwZX0gPSBjb21wdXRlVGVuc29yczJEKGlucHV0cywgYXhpcywgYmFja2VuZCk7XG4gIGNvbnN0IHByb2dyYW0gPVxuICAgICAgbmV3IENvbmNhdFByb2dyYW0odGVuc29yczJELm1hcCh0ID0+IHQuc2hhcGUgYXMgW251bWJlciwgbnVtYmVyXSkpO1xuICBjb25zdCByZXN1bHQgPSBiYWNrZW5kLnJ1bldlYkdMUHJvZ3JhbShwcm9ncmFtLCB0ZW5zb3JzMkQsIGR0eXBlKTtcblxuICB0ZW5zb3JzMkQuZm9yRWFjaChyID0+IGJhY2tlbmQuZGlzcG9zZUludGVybWVkaWF0ZVRlbnNvckluZm8ocikpO1xuICBjb25zdCByZXNoYXBlZFJlc3VsdCA9XG4gICAgICByZXNoYXBlKHtpbnB1dHM6IHt4OiByZXN1bHR9LCBhdHRyczoge3NoYXBlOiBvdXRTaGFwZX0sIGJhY2tlbmR9KTtcbiAgYmFja2VuZC5kaXNwb3NlSW50ZXJtZWRpYXRlVGVuc29ySW5mbyhyZXN1bHQpO1xuXG4gIHJldHVybiByZXNoYXBlZFJlc3VsdDtcbn1cblxuZnVuY3Rpb24gY29tcHV0ZVRlbnNvcnMyRChcbiAgICBpbnB1dHM6IENvbmNhdElucHV0cywgYXhpczogbnVtYmVyLCBiYWNrZW5kOiBNYXRoQmFja2VuZFdlYkdMKSB7XG4gIC8vIEFueSBjb25jYXQgb2Ygbi1kaW1lbnNpb25hbCB0ZW5zb3JzIGFjcm9zcyBhbnkgYXhpcyBjYW4gYmUgcmVkdWNlZCB0b1xuICAvLyBhIGNvbmNhdGVuYXRpb24gb2YgdHdvLWRpbWVuc2lvbmFsIHRlbnNvcnMgYWNyb3NzIHRoZSBheGlzIDEgYnkgZmlyc3RcbiAgLy8gcGFydGl0aW9uaW5nIHRoZSBheGVzIG9mIHRoZSBvcmlnaW5hbCB0ZW5zb3JzIGludG8gdGhvc2UgbGVzcyB0aGFuIHRoZVxuICAvLyBheGlzIHRvIGJlIGNvbmNhdGVuYXRlZCBhbmQgdGhlIHJlc3QuIFRoZW4gcmVzaGFwZSB0aGUgdGVuc29yc1xuICAvLyBpbnRvIGEgdHdvLWRpbWVuc2lvbmFsIHRlbnNvciBieSBjb2xsYXBzaW5nIHRoZXNlIHR3byBzZXRzIG9mIGF4ZXMgYW5kXG4gIC8vIGNvbmNhdGVuYXRlIHRoZSByZXN1bHRpbmcgbWF0cmljZXMgYWNyb3NzIHRoZSBheGlzIDEsIGZpbmFsbHkgcmVzaGFwaW5nXG4gIC8vIHRoZSByZXN1bHQgdG8gaGF2ZSB0aGUgcHJvcGVyIHNoYXBlLlxuICBjb25zdCBvdXRTaGFwZSA9IGJhY2tlbmRfdXRpbC5jb21wdXRlT3V0U2hhcGUoaW5wdXRzLm1hcCh0ID0+IHQuc2hhcGUpLCBheGlzKTtcbiAgY29uc3QgdGVuc29yczJEID0gaW5wdXRzLm1hcChcbiAgICAgIHggPT4gcmVzaGFwZSh7XG4gICAgICAgIGlucHV0czoge3h9LFxuICAgICAgICBhdHRyczoge3NoYXBlOiBbLTEsIHV0aWwuc2l6ZUZyb21TaGFwZSh4LnNoYXBlLnNsaWNlKGF4aXMpKV19LFxuICAgICAgICBiYWNrZW5kXG4gICAgICB9KSk7XG5cbiAgcmV0dXJuIHt0ZW5zb3JzMkQsIG91dFNoYXBlfTtcbn1cbiJdfQ==","/**\n * @license\n * Copyright 2020 Google LLC. All Rights Reserved.\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n * =============================================================================\n */\nimport { backend_util, Concat, util } from '@tensorflow/tfjs-core';\nimport { concatImpl } from './Concat_impl';\nimport { identity } from './Identity';\nexport function concat(args) {\n const { inputs, backend, attrs } = args;\n const { axis } = attrs;\n const $axis = util.parseAxisParam(axis, inputs[0].shape)[0];\n const shapes = inputs.map(t => t.shape);\n backend_util.assertParamsConsistent(shapes, $axis);\n const outShape = backend_util.computeOutShape(inputs.map(t => t.shape), $axis);\n if (util.sizeFromShape(outShape) === 0) {\n return backend.makeTensorInfo(outShape, inputs[0].dtype, []);\n }\n // Keep only non-empty tensors (ignore tensors with 0 in their shape).\n const $inputs = inputs.filter(t => util.sizeFromShape(t.shape) > 0);\n if ($inputs.length === 1) {\n return identity({ inputs: { x: $inputs[0] }, backend });\n }\n return concatImpl($inputs, $axis, backend);\n}\nexport const concatConfig = {\n kernelName: Concat,\n backendName: 'webgl',\n kernelFunc: concat\n};\n//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiQ29uY2F0LmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vLi4vdGZqcy1iYWNrZW5kLXdlYmdsL3NyYy9rZXJuZWxzL0NvbmNhdC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQTs7Ozs7Ozs7Ozs7Ozs7O0dBZUc7QUFFSCxPQUFPLEVBQUMsWUFBWSxFQUFFLE1BQU0sRUFBbUUsSUFBSSxFQUFDLE1BQU0sdUJBQXVCLENBQUM7QUFHbEksT0FBTyxFQUFDLFVBQVUsRUFBQyxNQUFNLGVBQWUsQ0FBQztBQUN6QyxPQUFPLEVBQUMsUUFBUSxFQUFDLE1BQU0sWUFBWSxDQUFDO0FBRXBDLE1BQU0sVUFBVSxNQUFNLENBQ2xCLElBQ3lFO0lBRTNFLE1BQU0sRUFBQyxNQUFNLEVBQUUsT0FBTyxFQUFFLEtBQUssRUFBQyxHQUFHLElBQUksQ0FBQztJQUN0QyxNQUFNLEVBQUMsSUFBSSxFQUFDLEdBQUcsS0FBSyxDQUFDO0lBRXJCLE1BQU0sS0FBSyxHQUFHLElBQUksQ0FBQyxjQUFjLENBQUMsSUFBSSxFQUFFLE1BQU0sQ0FBQyxDQUFDLENBQUMsQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQztJQUU1RCxNQUFNLE1BQU0sR0FBRyxNQUFNLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLEtBQUssQ0FBQyxDQUFDO0lBQ3hDLFlBQVksQ0FBQyxzQkFBc0IsQ0FBQyxNQUFNLEVBQUUsS0FBSyxDQUFDLENBQUM7SUFFbkQsTUFBTSxRQUFRLEdBQ1YsWUFBWSxDQUFDLGVBQWUsQ0FBQyxNQUFNLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLEtBQUssQ0FBQyxFQUFFLEtBQUssQ0FBQyxDQUFDO0lBRWxFLElBQUksSUFBSSxDQUFDLGFBQWEsQ0FBQyxRQUFRLENBQUMsS0FBSyxDQUFDLEVBQUU7UUFDdEMsT0FBTyxPQUFPLENBQUMsY0FBYyxDQUFDLFFBQVEsRUFBRSxNQUFNLENBQUMsQ0FBQyxDQUFDLENBQUMsS0FBSyxFQUFFLEVBQUUsQ0FBQyxDQUFDO0tBQzlEO0lBRUQsc0VBQXNFO0lBQ3RFLE1BQU0sT0FBTyxHQUFHLE1BQU0sQ0FBQyxNQUFNLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxJQUFJLENBQUMsYUFBYSxDQUFDLENBQUMsQ0FBQyxLQUFLLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQztJQUNwRSxJQUFJLE9BQU8sQ0FBQyxNQUFNLEtBQUssQ0FBQyxFQUFFO1FBQ3hCLE9BQU8sUUFBUSxDQUFDLEVBQUMsTUFBTSxFQUFFLEVBQUMsQ0FBQyxFQUFFLE9BQU8sQ0FBQyxDQUFDLENBQUMsRUFBQyxFQUFFLE9BQU8sRUFBQyxDQUFDLENBQUM7S0FDckQ7SUFFRCxPQUFPLFVBQVUsQ0FBQyxPQUFPLEVBQUUsS0FBSyxFQUFFLE9BQU8sQ0FBQyxDQUFDO0FBQzdDLENBQUM7QUFFRCxNQUFNLENBQUMsTUFBTSxZQUFZLEdBQWlCO0lBQ3hDLFVBQVUsRUFBRSxNQUFNO0lBQ2xCLFdBQVcsRUFBRSxPQUFPO0lBQ3BCLFVBQVUsRUFBRSxNQUEwQjtDQUN2QyxDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiLyoqXG4gKiBAbGljZW5zZVxuICogQ29weXJpZ2h0IDIwMjAgR29vZ2xlIExMQy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC5cbiAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSBcIkxpY2Vuc2VcIik7XG4gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuXG4gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXRcbiAqXG4gKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjBcbiAqXG4gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlXG4gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiBcIkFTIElTXCIgQkFTSVMsXG4gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC5cbiAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmRcbiAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLlxuICogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbiAqL1xuXG5pbXBvcnQge2JhY2tlbmRfdXRpbCwgQ29uY2F0LCBDb25jYXRBdHRycywgQ29uY2F0SW5wdXRzLCBLZXJuZWxDb25maWcsIEtlcm5lbEZ1bmMsIFRlbnNvckluZm8sIHV0aWx9IGZyb20gJ0B0ZW5zb3JmbG93L3RmanMtY29yZSc7XG5cbmltcG9ydCB7TWF0aEJhY2tlbmRXZWJHTH0gZnJvbSAnLi4vYmFja2VuZF93ZWJnbCc7XG5pbXBvcnQge2NvbmNhdEltcGx9IGZyb20gJy4vQ29uY2F0X2ltcGwnO1xuaW1wb3J0IHtpZGVudGl0eX0gZnJvbSAnLi9JZGVudGl0eSc7XG5cbmV4cG9ydCBmdW5jdGlvbiBjb25jYXQoXG4gICAgYXJnczpcbiAgICAgICAge2lucHV0czogQ29uY2F0SW5wdXRzLCBhdHRyczogQ29uY2F0QXR0cnMsIGJhY2tlbmQ6IE1hdGhCYWNrZW5kV2ViR0x9KTpcbiAgICBUZW5zb3JJbmZvIHtcbiAgY29uc3Qge2lucHV0cywgYmFja2VuZCwgYXR0cnN9ID0gYXJncztcbiAgY29uc3Qge2F4aXN9ID0gYXR0cnM7XG5cbiAgY29uc3QgJGF4aXMgPSB1dGlsLnBhcnNlQXhpc1BhcmFtKGF4aXMsIGlucHV0c1swXS5zaGFwZSlbMF07XG5cbiAgY29uc3Qgc2hhcGVzID0gaW5wdXRzLm1hcCh0ID0+IHQuc2hhcGUpO1xuICBiYWNrZW5kX3V0aWwuYXNzZXJ0UGFyYW1zQ29uc2lzdGVudChzaGFwZXMsICRheGlzKTtcblxuICBjb25zdCBvdXRTaGFwZSA9XG4gICAgICBiYWNrZW5kX3V0aWwuY29tcHV0ZU91dFNoYXBlKGlucHV0cy5tYXAodCA9PiB0LnNoYXBlKSwgJGF4aXMpO1xuXG4gIGlmICh1dGlsLnNpemVGcm9tU2hhcGUob3V0U2hhcGUpID09PSAwKSB7XG4gICAgcmV0dXJuIGJhY2tlbmQubWFrZVRlbnNvckluZm8ob3V0U2hhcGUsIGlucHV0c1swXS5kdHlwZSwgW10pO1xuICB9XG5cbiAgLy8gS2VlcCBvbmx5IG5vbi1lbXB0eSB0ZW5zb3JzIChpZ25vcmUgdGVuc29ycyB3aXRoIDAgaW4gdGhlaXIgc2hhcGUpLlxuICBjb25zdCAkaW5wdXRzID0gaW5wdXRzLmZpbHRlcih0ID0+IHV0aWwuc2l6ZUZyb21TaGFwZSh0LnNoYXBlKSA+IDApO1xuICBpZiAoJGlucHV0cy5sZW5ndGggPT09IDEpIHtcbiAgICByZXR1cm4gaWRlbnRpdHkoe2lucHV0czoge3g6ICRpbnB1dHNbMF19LCBiYWNrZW5kfSk7XG4gIH1cblxuICByZXR1cm4gY29uY2F0SW1wbCgkaW5wdXRzLCAkYXhpcywgYmFja2VuZCk7XG59XG5cbmV4cG9ydCBjb25zdCBjb25jYXRDb25maWc6IEtlcm5lbENvbmZpZyA9IHtcbiAga2VybmVsTmFtZTogQ29uY2F0LFxuICBiYWNrZW5kTmFtZTogJ3dlYmdsJyxcbiAga2VybmVsRnVuYzogY29uY2F0IGFzIHt9IGFzIEtlcm5lbEZ1bmNcbn07XG4iXX0=","/**\n * @license\n * Copyright 2017 Google LLC. All Rights Reserved.\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n * =============================================================================\n */\nexport class Conv2DProgram {\n constructor(convInfo, addBias = false, activation = null, hasPreluActivationWeights = false, hasLeakyreluAlpha = false) {\n this.variableNames = ['x', 'W'];\n this.outputShape = convInfo.outShape;\n const padTop = convInfo.padInfo.top;\n const padLeft = convInfo.padInfo.left;\n const strideHeight = convInfo.strideHeight;\n const strideWidth = convInfo.strideWidth;\n const dilationHeight = convInfo.dilationHeight;\n const dilationWidth = convInfo.dilationWidth;\n const filterHeight = convInfo.filterHeight;\n const filterWidth = convInfo.filterWidth;\n const inputDepthNearestVec4 = Math.floor(convInfo.inChannels / 4) * 4;\n const inputDepthVec4Remainder = convInfo.inChannels % 4;\n const isChannelsLast = convInfo.dataFormat === 'channelsLast';\n const rowDim = isChannelsLast ? 1 : 2;\n const colDim = isChannelsLast ? 2 : 3;\n const channelDim = isChannelsLast ? 3 : 1;\n let activationSnippet = '', applyActivationSnippet = '';\n if (activation) {\n if (hasPreluActivationWeights) {\n activationSnippet = `float activation(float a) {\n float b = getPreluActivationWeightsAtOutCoords();\n ${activation}\n }`;\n }\n else if (hasLeakyreluAlpha) {\n activationSnippet = `float activation(float a) {\n float b = getLeakyreluAlphaAtOutCoords();\n ${activation}\n }`;\n }\n else {\n activationSnippet = `\n float activation(float x) {\n ${activation}\n }\n `;\n }\n applyActivationSnippet = `result = activation(result);`;\n }\n const addBiasSnippet = addBias ? 'result += getBiasAtOutCoords();' : '';\n if (addBias) {\n this.variableNames.push('bias');\n }\n if (hasPreluActivationWeights) {\n this.variableNames.push('preluActivationWeights');\n }\n if (hasLeakyreluAlpha) {\n this.variableNames.push('leakyreluAlpha');\n }\n this.userCode = `\n ${activationSnippet}\n\n const ivec2 strides = ivec2(${strideHeight}, ${strideWidth});\n const ivec2 pads = ivec2(${padTop}, ${padLeft});\n\n void main() {\n ivec4 coords = getOutputCoords();\n int batch = coords[0];\n int d2 = coords[${channelDim}];\n\n ivec2 xRCCorner =\n ivec2(coords[${rowDim}], coords[${colDim}]) * strides - pads;\n int xRCorner = xRCCorner.x;\n int xCCorner = xRCCorner.y;\n\n // Convolve x(?, ?, d1) with w(:, :, d1, d2) to get y(yR, yC, d2).\n // ? = to be determined. : = across all values in that axis.\n float dotProd = 0.0;\n for (int wR = 0; wR < ${filterHeight}; wR++) {\n int xR = xRCorner + wR * ${dilationHeight};\n\n if (xR < 0 || xR >= ${convInfo.inHeight}) {\n continue;\n }\n\n for (int wC = 0; wC < ${filterWidth}; wC++) {\n int xC = xCCorner + wC * ${dilationWidth};\n\n if (xC < 0 || xC >= ${convInfo.inWidth}) {\n continue;\n }\n\n for (int d1 = 0; d1 < ${inputDepthNearestVec4}; d1 += 4) {\n vec4 wValues = vec4(\n getW(wR, wC, d1, d2),\n getW(wR, wC, d1 + 1, d2),\n getW(wR, wC, d1 + 2, d2),\n getW(wR, wC, d1 + 3, d2)\n );\n\n if (${isChannelsLast}) {\n vec4 xValues = vec4(\n getX(batch, xR, xC, d1),\n getX(batch, xR, xC, d1 + 1),\n getX(batch, xR, xC, d1 + 2),\n getX(batch, xR, xC, d1 + 3)\n );\n dotProd += dot(xValues, wValues);\n } else {\n vec4 xValues = vec4(\n getX(batch, d1, xR, xC),\n getX(batch, d1 + 1, xR, xC),\n getX(batch, d1 + 2, xR, xC),\n getX(batch, d1 + 3, xR, xC)\n );\n dotProd += dot(xValues, wValues);\n }\n }\n\n if (${inputDepthVec4Remainder === 1}) {\n\n if (${isChannelsLast}) {\n dotProd +=\n getX(batch, xR, xC, ${inputDepthNearestVec4}) *\n getW(wR, wC, ${inputDepthNearestVec4}, d2);\n } else {\n dotProd +=\n getX(batch, ${inputDepthNearestVec4}, xR, xC) *\n getW(wR, wC, ${inputDepthNearestVec4}, d2);\n }\n\n } else if (${inputDepthVec4Remainder === 2}) {\n vec2 wValues = vec2(\n getW(wR, wC, ${inputDepthNearestVec4}, d2),\n getW(wR, wC, ${inputDepthNearestVec4} + 1, d2)\n );\n\n if (${isChannelsLast}) {\n vec2 xValues = vec2(\n getX(batch, xR, xC, ${inputDepthNearestVec4}),\n getX(batch, xR, xC, ${inputDepthNearestVec4} + 1)\n );\n dotProd += dot(xValues, wValues);\n } else {\n vec2 xValues = vec2(\n getX(batch, ${inputDepthNearestVec4}, xR, xC),\n getX(batch, ${inputDepthNearestVec4} + 1, xR, xC)\n );\n dotProd += dot(xValues, wValues);\n }\n\n } else if (${inputDepthVec4Remainder === 3}) {\n vec3 wValues = vec3(\n getW(wR, wC, ${inputDepthNearestVec4}, d2),\n getW(wR, wC, ${inputDepthNearestVec4} + 1, d2),\n getW(wR, wC, ${inputDepthNearestVec4} + 2, d2)\n );\n\n if (${isChannelsLast}) {\n vec3 xValues = vec3(\n getX(batch, xR, xC, ${inputDepthNearestVec4}),\n getX(batch, xR, xC, ${inputDepthNearestVec4} + 1),\n getX(batch, xR, xC, ${inputDepthNearestVec4} + 2)\n );\n dotProd += dot(xValues, wValues);\n } else {\n vec3 xValues = vec3(\n getX(batch, ${inputDepthNearestVec4}, xR, xC),\n getX(batch, ${inputDepthNearestVec4} + 1, xR, xC),\n getX(batch, ${inputDepthNearestVec4} + 2, xR, xC)\n );\n dotProd += dot(xValues, wValues);\n }\n\n }\n }\n }\n\n float result = dotProd;\n ${addBiasSnippet}\n ${applyActivationSnippet}\n setOutput(result);\n }\n `;\n }\n}\nexport class Conv3DProgram {\n constructor(convInfo) {\n this.variableNames = ['x', 'W'];\n this.outputShape = convInfo.outShape;\n const padFront = convInfo.padInfo.front;\n const padTop = convInfo.padInfo.top;\n const padLeft = convInfo.padInfo.left;\n const strideDepth = convInfo.strideDepth;\n const strideHeight = convInfo.strideHeight;\n const strideWidth = convInfo.strideWidth;\n const dilationDepth = convInfo.dilationDepth;\n const dilationHeight = convInfo.dilationHeight;\n const dilationWidth = convInfo.dilationWidth;\n const filterDepth = convInfo.filterDepth;\n const filterHeight = convInfo.filterHeight;\n const filterWidth = convInfo.filterWidth;\n const inputDepthNearestVec4 = Math.floor(convInfo.inChannels / 4) * 4;\n const inputDepthVec4Remainder = convInfo.inChannels % 4;\n this.userCode = `\n const ivec3 strides = ivec3(${strideDepth}, ${strideHeight}, ${strideWidth});\n const ivec3 pads = ivec3(${padFront}, ${padTop}, ${padLeft});\n\n void main() {\n ivec5 coords = getOutputCoords();\n int batch = coords.x;\n int d2 = coords.u;\n\n ivec3 xFRCCorner = ivec3(coords.y, coords.z, coords.w) * strides - pads;\n int xFCorner = xFRCCorner.x;\n int xRCorner = xFRCCorner.y;\n int xCCorner = xFRCCorner.z;\n\n // Convolve x(?, ?, ?, d1) with w(:, :, :, d1, d2) to get\n // y(yF, yR, yC, d2). ? = to be determined. : = across all\n // values in that axis.\n float dotProd = 0.0;\n for (int wF = 0; wF < ${filterDepth}; wF++) {\n int xF = xFCorner + wF * ${dilationDepth};\n\n if (xF < 0 || xF >= ${convInfo.inDepth}) {\n continue;\n }\n\n for (int wR = 0; wR < ${filterHeight}; wR++) {\n int xR = xRCorner + wR * ${dilationHeight};\n\n if (xR < 0 || xR >= ${convInfo.inHeight}) {\n continue;\n }\n\n for (int wC = 0; wC < ${filterWidth}; wC++) {\n int xC = xCCorner + wC * ${dilationWidth};\n\n if (xC < 0 || xC >= ${convInfo.inWidth}) {\n continue;\n }\n\n for (int d1 = 0; d1 < ${inputDepthNearestVec4}; d1 += 4) {\n vec4 xValues = vec4(\n getX(batch, xF, xR, xC, d1),\n getX(batch, xF, xR, xC, d1 + 1),\n getX(batch, xF, xR, xC, d1 + 2),\n getX(batch, xF, xR, xC, d1 + 3)\n );\n vec4 wValues = vec4(\n getW(wF, wR, wC, d1, d2),\n getW(wF, wR, wC, d1 + 1, d2),\n getW(wF, wR, wC, d1 + 2, d2),\n getW(wF, wR, wC, d1 + 3, d2)\n );\n\n dotProd += dot(xValues, wValues);\n }\n\n if (${inputDepthVec4Remainder === 1}) {\n dotProd +=\n getX(batch, xF, xR, xC, ${inputDepthNearestVec4}) *\n getW(wF, wR, wC, ${inputDepthNearestVec4}, d2);\n } else if (${inputDepthVec4Remainder === 2}) {\n vec2 xValues = vec2(\n getX(batch, xF, xR, xC, ${inputDepthNearestVec4}),\n getX(batch, xF, xR, xC, ${inputDepthNearestVec4} + 1)\n );\n vec2 wValues = vec2(\n getW(wF, wR, wC, ${inputDepthNearestVec4}, d2),\n getW(wF, wR, wC, ${inputDepthNearestVec4} + 1, d2)\n );\n dotProd += dot(xValues, wValues);\n } else if (${inputDepthVec4Remainder === 3}) {\n vec3 xValues = vec3(\n getX(batch, xF, xR, xC, ${inputDepthNearestVec4}),\n getX(batch, xF, xR, xC, ${inputDepthNearestVec4} + 1),\n getX(batch, xF, xR, xC, ${inputDepthNearestVec4} + 2)\n );\n vec3 wValues = vec3(\n getW(wF, wR, wC, ${inputDepthNearestVec4}, d2),\n getW(wF, wR, wC, ${inputDepthNearestVec4} + 1, d2),\n getW(wF, wR, wC, ${inputDepthNearestVec4} + 2, d2)\n );\n dotProd += dot(xValues, wValues);\n }\n }\n }\n }\n setOutput(dotProd);\n }\n `;\n }\n}\n//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY29udl9ncHUuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi90ZmpzLWJhY2tlbmQtd2ViZ2wvc3JjL2NvbnZfZ3B1LnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBOzs7Ozs7Ozs7Ozs7Ozs7R0FlRztBQUtILE1BQU0sT0FBTyxhQUFhO0lBS3hCLFlBQ0ksUUFBaUMsRUFBRSxPQUFPLEdBQUcsS0FBSyxFQUNsRCxhQUFxQixJQUFJLEVBQUUseUJBQXlCLEdBQUcsS0FBSyxFQUM1RCxpQkFBaUIsR0FBRyxLQUFLO1FBUDdCLGtCQUFhLEdBQUcsQ0FBQyxHQUFHLEVBQUUsR0FBRyxDQUFDLENBQUM7UUFRekIsSUFBSSxDQUFDLFdBQVcsR0FBRyxRQUFRLENBQUMsUUFBUSxDQUFDO1FBQ3JDLE1BQU0sTUFBTSxHQUFHLFFBQVEsQ0FBQyxPQUFPLENBQUMsR0FBRyxDQUFDO1FBQ3BDLE1BQU0sT0FBTyxHQUFHLFFBQVEsQ0FBQyxPQUFPLENBQUMsSUFBSSxDQUFDO1FBQ3RDLE1BQU0sWUFBWSxHQUFHLFFBQVEsQ0FBQyxZQUFZLENBQUM7UUFDM0MsTUFBTSxXQUFXLEdBQUcsUUFBUSxDQUFDLFdBQVcsQ0FBQztRQUN6QyxNQUFNLGNBQWMsR0FBRyxRQUFRLENBQUMsY0FBYyxDQUFDO1FBQy9DLE1BQU0sYUFBYSxHQUFHLFFBQVEsQ0FBQyxhQUFhLENBQUM7UUFDN0MsTUFBTSxZQUFZLEdBQUcsUUFBUSxDQUFDLFlBQVksQ0FBQztRQUMzQyxNQUFNLFdBQVcsR0FBRyxRQUFRLENBQUMsV0FBVyxDQUFDO1FBRXpDLE1BQU0scUJBQXFCLEdBQUcsSUFBSSxDQUFDLEtBQUssQ0FBQyxRQUFRLENBQUMsVUFBVSxHQUFHLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQztRQUN0RSxNQUFNLHVCQUF1QixHQUFHLFFBQVEsQ0FBQyxVQUFVLEdBQUcsQ0FBQyxDQUFDO1FBQ3hELE1BQU0sY0FBYyxHQUFHLFFBQVEsQ0FBQyxVQUFVLEtB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dUJBQXVCLEtBQUssQ0FBQzs7NENBRVoscUJBQXFCOzRDQUNyQixxQkFBcUI7OztxQ0FHNUIscUJBQXFCO3FDQUNyQixxQkFBcUI7OzsyQkFHL0IsdUJBQXVCLEtBQUssQ0FBQzs7NENBRVoscUJBQXFCOzRDQUNyQixxQkFBcUI7NENBQ3JCLHFCQUFxQjs7O3FDQUc1QixxQkFBcUI7cUNBQ3JCLHFCQUFxQjtxQ0FDckIscUJBQXFCOzs7Ozs7Ozs7S0FTckQsQ0FBQztJQUNKLENBQUM7Q0FDRiIsInNvdXJjZXNDb250ZW50IjpbIi8qKlxuICogQGxpY2Vuc2VcbiAqIENvcHlyaWdodCAyMDE3IEdvb2dsZSBMTEMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuXG4gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgXCJMaWNlbnNlXCIpO1xuICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLlxuICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0XG4gKlxuICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wXG4gKlxuICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZVxuICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gXCJBUyBJU1wiIEJBU0lTLFxuICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuXG4gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kXG4gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS5cbiAqID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4gKi9cblxuaW1wb3J0IHtiYWNrZW5kX3V0aWx9IGZyb20gJ0B0ZW5zb3JmbG93L3RmanMtY29yZSc7XG5pbXBvcnQge0dQR1BVUHJvZ3JhbX0gZnJvbSAnLi9ncGdwdV9tYXRoJztcblxuZXhwb3J0IGNsYXNzIENvbnYyRFByb2dyYW0gaW1wbGVtZW50cyBHUEdQVVByb2dyYW0ge1xuICB2YXJpYWJsZU5hbWVzID0gWyd4JywgJ1cnXTtcbiAgb3V0cHV0U2hhcGU6IG51bWJlcltdO1xuICB1c2VyQ29kZTogc3RyaW5nO1xuXG4gIGNvbnN0cnVjdG9yKFxuICAgICAgY29udkluZm86IGJhY2tlbmRfdXRpbC5Db252MkRJbmZvLCBhZGRCaWFzID0gZmFsc2UsXG4gICAgICBhY3RpdmF0aW9uOiBzdHJpbmcgPSBudWxsLCBoYXNQcmVsdUFjdGl2YXRpb25XZWlnaHRzID0gZmFsc2UsXG4gICAgICBoYXNMZWFreXJlbHVBbHBoYSA9IGZhbHNlKSB7XG4gICAgdGhpcy5vdXRwdXRTaGFwZSA9IGNvbnZJbmZvLm91dFNoYXBlO1xuICAgIGNvbnN0IHBhZFRvcCA9IGNvbnZJbmZvLnBhZEluZm8udG9wO1xuICAgIGNvbnN0IHBhZExlZnQgPSBjb252SW5mby5wYWRJbmZvLmxlZnQ7XG4gICAgY29uc3Qgc3RyaWRlSGVpZ2h0ID0gY29udkluZm8uc3RyaWRlSGVpZ2h0O1xuICAgIGNvbnN0IHN0cmlkZVdpZHRoID0gY29udkluZm8uc3RyaWRlV2lkdGg7XG4gICAgY29uc3QgZGlsYXRpb25IZWlnaHQgPSBjb252SW5mby5kaWxhdGlvbkhlaWdodDtcbiAgICBjb25zdCBkaWxhdGlvbldpZHRoID0gY29udkluZm8uZGlsYXRpb25XaWR0aDtcbiAgICBjb25zdCBmaWx0ZXJIZWlnaHQgPSBjb252SW5mby5maWx0ZXJIZWlnaHQ7XG4gICAgY29uc3QgZmlsdGVyV2lkdGggPSBjb252SW5mby5maWx0ZXJXaWR0aDtcblxuICAgIGNvbnN0IGlucHV0RGVwdGhOZWFyZXN0VmVjNCA9IE1hdGguZmxvb3IoY29udkluZm8uaW5DaGFubmVscyAvIDQpICogNDtcbiAgICBjb25zdCBpbnB1dERlcHRoVmVjNFJlbWFpbmRlciA9IGNvbnZJbmZvLmluQ2hhbm5lbHMgJSA0O1xuICAgIGNvbnN0IGlzQ2hhbm5lbHNMYXN0ID0gY29udkluZm8uZGF0YUZvcm1hdCA9PT0gJ2NoYW5uZWxzTGFzdCc7XG5cbiAgICBjb25zdCByb3dEaW0gPSBpc0NoYW5uZWxzTGFzdCA/IDEgOiAyO1xuICAgIGNvbnN0IGNvbERpbSA9IGlzQ2hhbm5lbHNMYXN0ID8gMiA6IDM7XG4gICAgY29uc3QgY2hhbm5lbERpbSA9IGlzQ2hhbm5lbHNMYXN0ID8gMyA6IDE7XG5cbiAgICBsZXQgYWN0aXZhdGlvblNuaXBwZXQgPSAnJywgYXBwbHlBY3RpdmF0aW9uU25pcHBldCA9ICcnO1xuICAgIGlmIChhY3RpdmF0aW9uKSB7XG4gICAgICBpZiAoaGFzUHJlbHVBY3RpdmF0aW9uV2VpZ2h0cykge1xuICAgICAgICBhY3RpdmF0aW9uU25pcHBldCA9IGBmbG9hdCBhY3RpdmF0aW9uKGZsb2F0IGEpIHtcbiAgICAgICAgICBmbG9hdCBiID0gZ2V0UHJlbHVBY3RpdmF0aW9uV2VpZ2h0c0F0T3V0Q29vcmRzKCk7XG4gICAgICAgICAgJHthY3RpdmF0aW9ufVxuICAgICAgICB9YDtcbiAgICAgIH0gZWxzZSBpZiAoaGFzTGVha3lyZWx1QWxwaGEpIHtcbiAgICAgICAgYWN0aXZhdGlvblNuaXBwZXQgPSBgZmxvYXQgYWN0aXZhdGlvbihmbG9hdCBhKSB7XG4gICAgICAgICAgZmxvYXQgYiA9IGdldExlYWt5cmVsdUFscGhhQXRPdXRDb29yZHMoKTtcbiAgICAgICAgICAke2FjdGl2YXRpb259XG4gICAgICAgIH1gO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgYWN0aXZhdGlvblNuaXBwZXQgPSBgXG4gICAgICAgICAgZmxvYXQgYWN0aXZhdGlvbihmbG9hdCB4KSB7XG4gICAgICAgICAgICAke2FjdGl2YXRpb259XG4gICAgICAgICAgfVxuICAgICAgICBgO1xuICAgICAgfVxuXG4gICAgICBhcHBseUFjdGl2YXRpb25TbmlwcGV0ID0gYHJlc3VsdCA9IGFjdGl2YXRpb24ocmVzdWx0KTtgO1xuICAgIH1cblxuICAgIGNvbnN0IGFkZEJpYXNTbmlwcGV0ID0gYWRkQmlhcyA/ICdyZXN1bHQgKz0gZ2V0Qmlhc0F0T3V0Q29vcmRzKCk7JyA6ICcnO1xuICAgIGlmIChhZGRCaWFzKSB7XG4gICAgICB0aGlzLnZhcmlhYmxlTmFtZXMucHVzaCgnYmlhcycpO1xuICAgIH1cblxuICAgIGlmIChoYXNQcmVsdUFjdGl2YXRpb25XZWlnaHRzKSB7XG4gICAgICB0aGlzLnZhcmlhYmxlTmFtZXMucHVzaCgncHJlbHVBY3RpdmF0aW9uV2VpZ2h0cycpO1xuICAgIH1cblxuICAgIGlmIChoYXNMZWFreXJlbHVBbHBoYSkge1xuICAgICAgdGhpcy52YXJpYWJsZU5hbWVzLnB1c2goJ2xlYWt5cmVsdUFscGhhJyk7XG4gICAgfVxuXG4gICAgdGhpcy51c2VyQ29kZSA9IGBcbiAgICAgICR7YWN0aXZhdGlvblNuaXBwZXR9XG5cbiAgICAgIGNvbnN0IGl2ZWMyIHN0cmlkZXMgPSBpdmVjMigke3N0cmlkZUhlaWdodH0sICR7c3RyaWRlV2lkdGh9KTtcbiAgICAgIGNvbnN0IGl2ZWMyIHBhZHMgPSBpdmVjMigke3BhZFRvcH0sICR7cGFkTGVmdH0pO1xuXG4gICAgICB2b2lkIG1haW4oKSB7XG4gICAgICAgIGl2ZWM0IGNvb3JkcyA9IGdldE91dHB1dENvb3JkcygpO1xuICAgICAgICBpbnQgYmF0Y2ggPSBjb29yZHNbMF07XG4gICAgICAgIGludCBkMiA9IGNvb3Jkc1ske2NoYW5uZWxEaW19XTtcblxuICAgICAgICBpdmVjMiB4UkNDb3JuZXIgPVxuICAgICAgICAgICAgaXZlYzIoY29vcmRzWyR7cm93RGltfV0sIGNvb3Jkc1ske2NvbERpbX1dKSAqIHN0cmlkZXMgLSBwYWRzO1xuICAgICAgICBpbnQgeFJDb3JuZXIgPSB4UkNDb3JuZXIueDtcbiAgICAgICAgaW50IHhDQ29ybmVyID0geFJDQ29ybmVyLnk7XG5cbiAgICAgICAgLy8gQ29udm9sdmUgeCg/LCA/LCBkMSkgd2l0aCB3KDosIDosIGQxLCBkMikgdG8gZ2V0IHkoeVIsIHlDLCBkMikuXG4gICAgICAgIC8vID8gPSB0byBiZSBkZXRlcm1pbmVkLiA6ID0gYWNyb3NzIGFsbCB2YWx1ZXMgaW4gdGhhdCBheGlzLlxuICAgICAgICBmbG9hdCBkb3RQcm9kID0gMC4wO1xuICAgICAgICBmb3IgKGludCB3UiA9IDA7IHdSIDwgJHtmaWx0ZXJIZWlnaHR9OyB3UisrKSB7XG4gICAgICAgICAgaW50IHhSID0geFJDb3JuZXIgKyB3UiAqICR7ZGlsYXRpb25IZWlnaHR9O1xuXG4gICAgICAgICAgaWYgKHhSIDwgMCB8fCB4UiA+PSAke2NvbnZJbmZvLmluSGVpZ2h0fSkge1xuICAgICAgICAgICAgY29udGludWU7XG4gICAgICAgICAgfVxuXG4gICAgICAgICAgZm9yIChpbnQgd0MgPSAwOyB3QyA8ICR7ZmlsdGVyV2lkdGh9OyB3QysrKSB7XG4gICAgICAgICAgICBpbnQgeEMgPSB4Q0Nvcm5lciArIHdDICogJHtkaWxhdGlvbldpZHRofTtcblxuICAgICAgICAgICAgaWYgKHhDIDwgMCB8fCB4QyA+PSAke2NvbnZJbmZvLmluV2lkdGh9KSB7XG4gICAgICAgICAgICAgIGNvbnRpbnVlO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBmb3IgKGludCBkMSA9IDA7IGQxIDwgJHtpbnB1dERlcHRoTmVhcmVzdFZlYzR9OyBkMSArPSA0KSB7XG4gICAgICAgICAgICAgIHZlYzQgd1ZhbHVlcyA9IHZlYzQoXG4gICAgICAgICAgICAgICAgZ2V0Vyh3Uiwgd0MsIGQxLCBkMiksXG4gICAgICAgICAgICAgICAgZ2V0Vyh3Uiwgd0MsIGQxICsgMSwgZDIpLFxuICAgICAgICAgICAgICAgIGdldFcod1IsIHdDLCBkMSArIDIsIGQyKSxcbiAgICAgICAgICAgICAgICBnZXRXKHdSLCB3QywgZDEgKyAzLCBkMilcbiAgICAgICAgICAgICAgKTtcblxuICAgICAgICAgICAgICBpZiAoJHtpc0NoYW5uZWxzTGFzdH0pIHtcbiAgICAgICAgICAgICAgICB2ZWM0IHhWYWx1ZXMgPSB2ZWM0KFxuICAgICAgICAgICAgICAgICAgZ2V0WChiYXRjaCwgeFIsIHhDLCBkMSksXG4gICAgICAgICAgICAgICAgICBnZXRYKGJhdGNoLCB4UiwgeEMsIGQxICsgMSksXG4gICAgICAgICAgICAgICAgICBnZXRYKGJhdGNoLCB4UiwgeEMsIGQxICsgMiksXG4gICAgICAgICAgICAgICAgICBnZXRYKGJhdGNoLCB4UiwgeEMsIGQxICsgMylcbiAgICAgICAgICAgICAgICApO1xuICAgICAgICAgICAgICAgIGRvdFByb2QgKz0gZG90KHhWYWx1ZXMsIHdWYWx1ZXMpO1xuICAgICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgIHZlYzQgeFZhbHVlcyA9IHZlYzQoXG4gICAgICAgICAgICAgICAgICBnZXRYKGJhdGNoLCBkMSwgeFIsIHhDKSxcbiAgICAgICAgICAgICAgICAgIGdldFgoYmF0Y2gsIGQxICsgMSwgeFIsIHhDKSxcbiAgICAgICAgICAgICAgICAgIGdldFgoYmF0Y2gsIGQxICsgMiwgeFIsIHhDKSxcbiAgICAgICAgICAgICAgICAgIGdldFgoYmF0Y2gsIGQxICsgMywgeFIsIHhDKVxuICAgICAgICAgICAgICAgICk7XG4gICAgICAgICAgICAgICAgZG90UHJvZCArPSBkb3QoeFZhbHVlcywgd1ZhbHVlcyk7XG4gICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgaWYgKCR7aW5wdXREZXB0aFZlYzRSZW1haW5kZXIgPT09IDF9KSB7XG5cbiAgICAgICAgICAgICAgaWYgKCR7aXNDaGFubmVsc0xhc3R9KSB7XG4gICAgICAgICAgICAgICAgZG90UHJvZCArPVxuICAgICAgICAgICAgICAgICAgICBnZXRYKGJhdGNoLCB4UiwgeEMsICR7aW5wdXREZXB0aE5lYXJlc3RWZWM0fSkgKlxuICAgICAgICAgICAgICAgICAgICBnZXRXKHdSLCB3QywgJHtpbnB1dERlcHRoTmVhcmVzdFZlYzR9LCBkMik7XG4gICAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgZG90UHJvZCArPVxuICAgICAgICAgICAgICAgICAgICBnZXRYKGJhdGNoLCAke2lucHV0RGVwdGhOZWFyZXN0VmVjNH0sIHhSLCB4QykgKlxuICAgICAgICAgICAgICAgICAgICBnZXRXKHdSLCB3QywgJHtpbnB1dERlcHRoTmVhcmVzdFZlYzR9LCBkMik7XG4gICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgfSBlbHNlIGlmICgke2lucHV0RGVwdGhWZWM0UmVtYWluZGVyID09PSAyfSkge1xuICAgICAgICAgICAgICB2ZWMyIHdWYWx1ZXMgPSB2ZWMyKFxuICAgICAgICAgICAgICAgIGdldFcod1IsIHdDLCAke2lucHV0RGVwdGhOZWFyZXN0VmVjNH0sIGQyKSxcbiAgICAgICAgICAgICAgICBnZXRXKHdSLCB3QywgJHtpbnB1dERlcHRoTmVhcmVzdFZlYzR9ICsgMSwgZDIpXG4gICAgICAgICAgICAgICk7XG5cbiAgICAgICAgICAgICAgaWYgKCR7aXNDaGFubmVsc0xhc3R9KSB7XG4gICAgICAgICAgICAgICAgdmVjMiB4VmFsdWVzID0gdmVjMihcbiAgICAgICAgICAgICAgICAgIGdldFgoYmF0Y2gsIHhSLCB4QywgJHtpbnB1dERlcHRoTmVhcmVzdFZlYzR9KSxcbiAgICAgICAgICAgICAgICAgIGdldFgoYmF0Y2gsIHhSLCB4QywgJHtpbnB1dERlcHRoTmVhcmVzdFZlYzR9ICsgMSlcbiAgICAgICAgICAgICAgICApO1xuICAgICAgICAgICAgICAgIGRvdFByb2QgKz0gZG90KHhWYWx1ZXMsIHdWYWx1ZXMpO1xuICAgICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgIHZlYzIgeFZhbHVlcyA9IHZlYzIoXG4gICAgICAgICAgICAgICAgICBnZXRYKGJhdGNoLCAke2lucHV0RGVwdGhOZWFyZXN0VmVjNH0sIHhSLCB4QyksXG4gICAgICAgICAgICAgICAgICBnZXRYKGJhdGNoLCAke2lucHV0RGVwdGhOZWFyZXN0VmVjNH0gKyAxLCB4UiwgeEMpXG4gICAgICAgICAgICAgICAgKTtcbiAgICAgICAgICAgICAgICBkb3RQcm9kICs9IGRvdCh4VmFsdWVzLCB3VmFsdWVzKTtcbiAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICB9IGVsc2UgaWYgKCR7aW5wdXREZXB0aFZlYzRSZW1haW5kZXIgPT09IDN9KSB7XG4gICAgICAgICAgICAgIHZlYzMgd1ZhbHVlcyA9IHZlYzMoXG4gICAgICAgICAgICAgICAgZ2V0Vyh3Uiwgd0MsICR7aW5wdXREZXB0aE5lYXJlc3RWZWM0fSwgZDIpLFxuICAgICAgICAgICAgICAgIGdldFcod1IsIHdDLCAke2lucHV0RGVwdGhOZWFyZXN0VmVjNH0gKyAxLCBkMiksXG4gICAgICAgICAgICAgICAgZ2V0Vyh3Uiwgd0MsICR7aW5wdXREZXB0aE5lYXJlc3RWZWM0fSArIDIsIGQyKVxuICAgICAgICAgICAgICApO1xuXG4gICAgICAgICAgICAgIGlmICgke2lzQ2hhbm5lbHNMYXN0fSkge1xuICAgICAgICAgICAgICAgIHZlYzMgeFZhbHVlcyA9IHZlYzMoXG4gICAgICAgICAgICAgICAgICBnZXRYKGJhdGNoLCB4UiwgeEMsICR7aW5wdXREZXB0aE5lYXJlc3RWZWM0fSksXG4gICAgICAgICAgICAgICAgICBnZXRYKGJhdGNoLCB4UiwgeEMsICR7aW5wdXREZXB0aE5lYXJlc3RWZWM0fSArIDEpLFxuICAgICAgICAgICAgICAgICAgZ2V0WChiYXRjaCwgeFIsIHhDLCAke2lucHV0RGVwdGhOZWFyZXN0VmVjNH0gKyAyKVxuICAgICAgICAgICAgICAgICk7XG4gICAgICAgICAgICAgICAgZG90UHJvZCArPSBkb3QoeFZhbHVlcywgd1ZhbHVlcyk7XG4gICAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgdmVjMyB4VmFsdWVzID0gdmVjMyhcbiAgICAgICAgICAgICAgICAgIGdldFgoYmF0Y2gsICR7aW5wdXREZXB0aE5lYXJlc3RWZWM0fSwgeFIsIHhDKSxcbiAgICAgICAgICAgICAgICAgIGdldFgoYmF0Y2gsICR7aW5wdXREZXB0aE5lYXJlc3RWZWM0fSArIDEsIHhSLCB4QyksXG4gICAgICAgICAgICAgICAgICBnZXRYKGJhdGNoLCAke2lucHV0RGVwdGhOZWFyZXN0VmVjNH0gKyAyLCB4UiwgeEMpXG4gICAgICAgICAgICAgICAgKTtcbiAgICAgICAgICAgICAgICBkb3RQcm9kICs9IGRvdCh4VmFsdWVzLCB3VmFsdWVzKTtcbiAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICB9XG4gICAgICAgICAgfVxuICAgICAgICB9XG5cbiAgICAgICAgZmxvYXQgcmVzdWx0ID0gZG90UHJvZDtcbiAgICAgICAgJHthZGRCaWFzU25pcHBldH1cbiAgICAgICAgJHthcHBseUFjdGl2YXRpb25TbmlwcGV0fVxuICAgICAgICBzZXRPdXRwdXQocmVzdWx0KTtcbiAgICAgIH1cbiAgICBgO1xuICB9XG59XG5cbmV4cG9ydCBjbGFzcyBDb252M0RQcm9ncmFtIGltcGxlbWVudHMgR1BHUFVQcm9ncmFtIHtcbiAgdmFyaWFibGVOYW1lcyA9IFsneCcsICdXJ107XG4gIG91dHB1dFNoYXBlOiBudW1iZXJbXTtcbiAgdXNlckNvZGU6IHN0cmluZztcblxuICBjb25zdHJ1Y3Rvcihjb252SW5mbzogYmFja2VuZF91dGlsLkNvbnYzREluZm8pIHtcbiAgICB0aGlzLm91dHB1dFNoYXBlID0gY29udkluZm8ub3V0U2hhcGU7XG4gICAgY29uc3QgcGFkRnJvbnQgPSBjb252SW5mby5wYWRJbmZvLmZyb250O1xuICAgIGNvbnN0IHBhZFRvcCA9IGNvbnZJbmZvLnBhZEluZm8udG9wO1xuICAgIGNvbnN0IHBhZExlZnQgPSBjb252SW5mby5wYWRJbmZvLmxlZnQ7XG4gICAgY29uc3Qgc3RyaWRlRGVwdGggPSBjb252SW5mby5zdHJpZGVEZXB0aDtcbiAgICBjb25zdCBzdHJpZGVIZWlnaHQgPSBjb252SW5mby5zdHJpZGVIZWlnaHQ7XG4gICAgY29uc3Qgc3RyaWRlV2lkdGggPSBjb252SW5mby5zdHJpZGVXaWR0aDtcbiAgICBjb25zdCBkaWxhdGlvbkRlcHRoID0gY29udkluZm8uZGlsYXRpb25EZXB0aDtcbiAgICBjb25zdCBkaWxhdGlvbkhlaWdodCA9IGNvbnZJbmZvLmRpbGF0aW9uSGVpZ2h0O1xuICAgIGNvbnN0IGRpbGF0aW9uV2lkdGggPSBjb252SW5mby5kaWxhdGlvbldpZHRoO1xuICAgIGNvbnN0IGZpbHRlckRlcHRoID0gY29udkluZm8uZmlsdGVyRGVwdGg7XG4gICAgY29uc3QgZmlsdGVySGVpZ2h0ID0gY29udkluZm8uZmlsdGVySGVpZ2h0O1xuICAgIGNvbnN0IGZpbHRlcldpZHRoID0gY29udkluZm8uZmlsdGVyV2lkdGg7XG5cbiAgICBjb25zdCBpbnB1dERlcHRoTmVhcmVzdFZlYzQgPSBNYXRoLmZsb29yKGNvbnZJbmZvLmluQ2hhbm5lbHMgLyA0KSAqIDQ7XG4gICAgY29uc3QgaW5wdXREZXB0aFZlYzRSZW1haW5kZXIgPSBjb252SW5mby5pbkNoYW5uZWxzICUgNDtcblxuICAgIHRoaXMudXNlckNvZGUgPSBgXG4gICAgICBjb25zdCBpdmVjMyBzdHJpZGVzID0gaXZlYzMoJHtzdHJpZGVEZXB0aH0sICR7c3RyaWRlSGVpZ2h0fSwgJHtcbiAgICAgICAgc3RyaWRlV2lkdGh9KTtcbiAgICAgIGNvbnN0IGl2ZWMzIHBhZHMgPSBpdmVjMygke3BhZEZyb250fSwgJHtwYWRUb3B9LCAke3BhZExlZnR9KTtcblxuICAgICAgdm9pZCBtYWluKCkge1xuICAgICAgICBpdmVjNSBjb29yZHMgPSBnZXRPdXRwdXRDb29yZHMoKTtcbiAgICAgICAgaW50IGJhdGNoID0gY29vcmRzLng7XG4gICAgICAgIGludCBkMiA9IGNvb3Jkcy51O1xuXG4gICAgICAgIGl2ZWMzIHhGUkNDb3JuZXIgPSBpdmVjMyhjb29yZHMueSwgY29vcmRzLnosIGNvb3Jkcy53KSAqIHN0cmlkZXMgLSBwYWRzO1xuICAgICAgICBpbnQgeEZDb3JuZXIgPSB4RlJDQ29ybmVyLng7XG4gICAgICAgIGludCB4UkNvcm5lciA9IHhGUkNDb3JuZXIueTtcbiAgICAgICAgaW50IHhDQ29ybmVyID0geEZSQ0Nvcm5lci56O1xuXG4gICAgICAgIC8vIENvbnZvbHZlIHgoPywgPywgPywgZDEpIHdpdGggdyg6LCA6LCA6LCBkMSwgZDIpIHRvIGdldFxuICAgICAgICAvLyB5KHlGLCB5UiwgeUMsIGQyKS4gPyA9IHRvIGJlIGRldGVybWluZWQuIDogPSBhY3Jvc3MgYWxsXG4gICAgICAgIC8vIHZhbHVlcyBpbiB0aGF0IGF4aXMuXG4gICAgICAgIGZsb2F0IGRvdFByb2QgPSAwLjA7XG4gICAgICAgIGZvciAoaW50IHdGID0gMDsgd0YgPCAke2ZpbHRlckRlcHRofTsgd0YrKykge1xuICAgICAgICAgIGludCB4RiA9IHhGQ29ybmVyICsgd0YgKiAke2RpbGF0aW9uRGVwdGh9O1xuXG4gICAgICAgICAgaWYgKHhGIDwgMCB8fCB4RiA+PSAke2NvbnZJbmZvLmluRGVwdGh9KSB7XG4gICAgICAgICAgICBjb250aW51ZTtcbiAgICAgICAgICB9XG5cbiAgICAgICAgICBmb3IgKGludCB3UiA9IDA7IHdSIDwgJHtmaWx0ZXJIZWlnaHR9OyB3UisrKSB7XG4gICAgICAgICAgICBpbnQgeFIgPSB4UkNvcm5lciArIHdSICogJHtkaWxhdGlvbkhlaWdodH07XG5cbiAgICAgICAgICAgIGlmICh4UiA8IDAgfHwgeFIgPj0gJHtjb252SW5mby5pbkhlaWdodH0pIHtcbiAgICAgICAgICAgICAgY29udGludWU7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIGZvciAoaW50IHdDID0gMDsgd0MgPCAke2ZpbHRlcldpZHRofTsgd0MrKykge1xuICAgICAgICAgICAgICBpbnQgeEMgPSB4Q0Nvcm5lciArIHdDICogJHtkaWxhdGlvbldpZHRofTtcblxuICAgICAgICAgICAgICBpZiAoeEMgPCAwIHx8IHhDID49ICR7Y29udkluZm8uaW5XaWR0aH0pIHtcbiAgICAgICAgICAgICAgICBjb250aW51ZTtcbiAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgIGZvciAoaW50IGQxID0gMDsgZDEgPCAke2lucHV0RGVwdGhOZWFyZXN0VmVjNH07IGQxICs9IDQpIHtcbiAgICAgICAgICAgICAgICB2ZWM0IHhWYWx1ZXMgPSB2ZWM0KFxuICAgICAgICAgICAgICAgICAgZ2V0WChiYXRjaCwgeEYsIHhSLCB4QywgZDEpLFxuICAgICAgICAgICAgICAgICAgZ2V0WChiYXRjaCwgeEYsIHhSLCB4QywgZDEgKyAxKSxcbiAgICAgICAgICAgICAgICAgIGdldFgoYmF0Y2gsIHhGLCB4UiwgeEMsIGQxICsgMiksXG4gICAgICAgICAgICAgICAgICBnZXRYKGJhdGNoLCB4RiwgeFIsIHhDLCBkMSArIDMpXG4gICAgICAgICAgICAgICAgKTtcbiAgICAgICAgICAgICAgICB2ZWM0IHdWYWx1ZXMgPSB2ZWM0KFxuICAgICAgICAgICAgICAgICAgZ2V0Vyh3Riwgd1IsIHdDLCBkMSwgZDIpLFxuICAgICAgICAgICAgICAgICAgZ2V0Vyh3Riwgd1IsIHdDLCBkMSArIDEsIGQyKSxcbiAgICAgICAgICAgICAgICAgIGdldFcod0YsIHdSLCB3QywgZDEgKyAyLCBkMiksXG4gICAgICAgICAgICAgICAgICBnZXRXKHdGLCB3Uiwgd0MsIGQxICsgMywgZDIpXG4gICAgICAgICAgICAgICAgKTtcblxuICAgICAgICAgICAgICAgIGRvdFByb2QgKz0gZG90KHhWYWx1ZXMsIHdWYWx1ZXMpO1xuICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgaWYgKCR7aW5wdXREZXB0aFZlYzRSZW1haW5kZXIgPT09IDF9KSB7XG4gICAgICAgICAgICAgICAgZG90UHJvZCArPVxuICAgICAgICAgICAgICAgICAgZ2V0WChiYXRjaCwgeEYsIHhSLCB4QywgJHtpbnB1dERlcHRoTmVhcmVzdFZlYzR9KSAqXG4gICAgICAgICAgICAgICAgICBnZXRXKHdGLCB3Uiwgd0MsICR7aW5wdXREZXB0aE5lYXJlc3RWZWM0fSwgZDIpO1xuICAgICAgICAgICAgICB9IGVsc2UgaWYgKCR7aW5wdXREZXB0aFZlYzRSZW1haW5kZXIgPT09IDJ9KSB7XG4gICAgICAgICAgICAgICAgdmVjMiB4VmFsdWVzID0gdmVjMihcbiAgICAgICAgICAgICAgICAgIGdldFgoYmF0Y2gsIHhGLCB4UiwgeEMsICR7aW5wdXREZXB0aE5lYXJlc3RWZWM0fSksXG4gICAgICAgICAgICAgICAgICBnZXRYKGJhdGNoLCB4RiwgeFIsIHhDLCAke2lucHV0RGVwdGhOZWFyZXN0VmVjNH0gKyAxKVxuICAgICAgICAgICAgICAgICk7XG4gICAgICAgICAgICAgICAgdmVjMiB3VmFsdWVzID0gdmVjMihcbiAgICAgICAgICAgICAgICAgIGdldFcod0YsIHdSLCB3QywgJHtpbnB1dERlcHRoTmVhcmVzdFZlYzR9LCBkMiksXG4gICAgICAgICAgICAgICAgICBnZXRXKHdGLCB3Uiwgd0MsICR7aW5wdXREZXB0aE5lYXJlc3RWZWM0fSArIDEsIGQyKVxuICAgICAgICAgICAgICAgICk7XG4gICAgICAgICAgICAgICAgZG90UHJvZCArPSBkb3QoeFZhbHVlcywgd1ZhbHVlcyk7XG4gICAgICAgICAgICAgIH0gZWxzZSBpZiAoJHtpbnB1dERlcHRoVmVjNFJlbWFpbmRlciA9PT0gM30pIHtcbiAgICAgICAgICAgICAgICB2ZWMzIHhWYWx1ZXMgPSB2ZWMzKFxuICAgICAgICAgICAgICAgICAgZ2V0WChiYXRjaCwgeEYsIHhSLCB4QywgJHtpbnB1dERlcHRoTmVhcmVzdFZlYzR9KSxcbiAgICAgICAgICAgICAgICAgIGdldFgoYmF0Y2gsIHhGLCB4UiwgeEMsICR7aW5wdXREZXB0aE5lYXJlc3RWZWM0fSArIDEpLFxuICAgICAgICAgICAgICAgICAgZ2V0WChiYXRjaCwgeEYsIHhSLCB4QywgJHtpbnB1dERlcHRoTmVhcmVzdFZlYzR9ICsgMilcbiAgICAgICAgICAgICAgICApO1xuICAgICAgICAgICAgICAgIHZlYzMgd1ZhbHVlcyA9IHZlYzMoXG4gICAgICAgICAgICAgICAgICBnZXRXKHdGLCB3Uiwgd0MsICR7aW5wdXREZXB0aE5lYXJlc3RWZWM0fSwgZDIpLFxuICAgICAgICAgICAgICAgICAgZ2V0Vyh3Riwgd1IsIHdDLCAke2lucHV0RGVwdGhOZWFyZXN0VmVjNH0gKyAxLCBkMiksXG4gICAgICAgICAgICAgICAgICBnZXRXKHdGLCB3Uiwgd0MsICR7aW5wdXREZXB0aE5lYXJlc3RWZWM0fSArIDIsIGQyKVxuICAgICAgICAgICAgICAgICk7XG4gICAgICAgICAgICAgICAgZG90UHJvZCArPSBkb3QoeFZhbHVlcywgd1ZhbHVlcyk7XG4gICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgc2V0T3V0cHV0KGRvdFByb2QpO1xuICAgICAgfVxuICAgIGA7XG4gIH1cbn1cbiJdfQ==","/**\n * @license\n * Copyright 2022 Google LLC. All Rights Reserved.\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n * =============================================================================\n */\nimport { util } from '@tensorflow/tfjs-core';\nimport { useShapeUniforms } from './gpgpu_math';\nexport class Conv2DPackedProgram {\n constructor(convInfo, addBias = false, activation = null, hasPreluActivation = false, hasLeakyReluAlpha = false) {\n this.variableNames = ['x', 'W'];\n this.packedInputs = true;\n this.packedOutput = true;\n this.customUniforms = [\n { name: 'pads', type: 'ivec2' },\n { name: 'strides', type: 'ivec2' },\n { name: 'dilations', type: 'ivec2' },\n { name: 'inDims', type: 'ivec2' },\n ];\n this.outputShape = convInfo.outShape;\n this.enableShapeUniforms = useShapeUniforms(this.outputShape.length);\n const padLeft = convInfo.padInfo.left;\n const strideWidth = convInfo.strideWidth;\n const dilationWidth = convInfo.dilationWidth;\n const filterHeight = convInfo.filterHeight;\n const filterWidth = convInfo.filterWidth;\n const texelsAcross = filterWidth;\n let mainLoop = `\n int xR; int xC; int xCOffset;\n vec4 wTexel; vec4 previous; vec4 final;`;\n for (let c = 0; c < filterWidth; c++) {\n mainLoop += `\n vec4 xTexelC${c * 2};\n int xTexelC${c * 2}Ready;\n vec4 xTexelC${c * 2 + 1};\n int xTexelC${c * 2 + 1}Ready;\n vec4 xC${c};`;\n }\n /**\n * This vectorized implementation works by gathering the values needed for\n * each output channel's dot product into vec4's and then multiplying them\n * all together (this happens in the final double for-loop below). Most of\n * the main loop consists of constructing these vec4's with the minimum\n * number of texture2D calls, which means making use of all four returned\n * values from a texture2D call at once.\n */\n mainLoop += `\n for (int r = 0; r < ${filterHeight}; r++) {\n for (int d1 = 0; d1 < ${convInfo.inChannels}; d1 += 2) {\n `;\n for (let c = 0; c < filterWidth; c++) {\n mainLoop += `\n xTexelC${c * 2} = vec4(0.0);\n xTexelC${c * 2}Ready = 0;\n xTexelC${c * 2 + 1} = vec4(0.0);\n xTexelC${c * 2 + 1}Ready = 0;\n xC${c} = vec4(0.0);`;\n }\n mainLoop += `\n xR = xRCorner + r * dilations[0];\n if (xR >=0 && xR < inDims[0]) {\n `;\n for (let texelC = 0; texelC < (texelsAcross + 1) / 2; texelC++) {\n const colIndex = texelC * 2;\n mainLoop += `\n xC = xCCorner + ${colIndex * dilationWidth};\n `;\n if (strideWidth === 1) {\n if (colIndex < filterWidth) {\n // If padding is odd, the outer texels have to be composed.\n if (padLeft % 2 === 1) {\n // TODO: Ensure vec4 previous does not result in redundant sample,\n // and avoid setting xTexelRC's that exceed the boundary in the\n // first place rather than resetting them to vec4(0)).\n // To compute xCOffset:\n // - If padding is odd, we must add 1 to ensure we ask for an\n // even-numbered row.\n // - We subtract 2 to access the previous texel.\n mainLoop += `\n xCOffset = xC + 1;\n if (xCOffset >= 0 && xCOffset < inDims[1] && xTexelC${colIndex}Ready == 0) {\n xTexelC${colIndex} = getX(batch, xR, xCOffset, d1);\n\n // Need to manually clear unused channels in case\n // we're reading from recycled texture.\n if (xCOffset + 1 >= inDims[1]) {\n xTexelC${colIndex}.zw = vec2(0.0);\n }\n xTexelC${colIndex}Ready = 1;\n }\n `;\n // This texel has been read in previous iteration if the dilation\n // is 1.\n if (dilationWidth === 1 && colIndex > 0) {\n mainLoop += `\n xC${colIndex} = vec4(xTexelC${colIndex - 2}.zw, xTexelC${colIndex}.xy);\n `;\n }\n else {\n mainLoop += `\n xCOffset = xC + 1 - 2;\n\n if (xCOffset >= 0 && xCOffset < inDims[1]) {\n previous = getX(batch, xR, xCOffset, d1);\n\n // Need to manually clear unused channels in case\n // we're reading from recycled texture.\n if (xCOffset + 1 >= inDims[1]) {\n previous.zw = vec2(0.0);\n }\n\n xC${colIndex} = vec4(previous.zw, xTexelC${colIndex}.xy);\n } else {\n xC${colIndex} = vec4(0.0, 0.0, xTexelC${colIndex}.xy);\n }\n `;\n }\n }\n else {\n // Padding is even, so xRC corresponds to a single texel.\n mainLoop += `\n if (xC >= 0 && xC < inDims[1] && xTexelC${colIndex}Ready == 0) {\n xTexelC${colIndex} = getX(batch, xR, xC, d1);\n if (xC + 1 >= inDims[1]) {\n xTexelC${colIndex}.zw = vec2(0.0);\n }\n xTexelC${colIndex}Ready = 1;\n }\n\n xC${colIndex} = xTexelC${colIndex};\n `;\n }\n if (colIndex + 1 < filterWidth) {\n // If dilation is even, the second entry should match the first\n // (either both are composed or both are single samples). But if\n // dilation is odd, then the second entry should be the opposite\n // of the first (if the first is composed, the second is a single\n // sample, and vice versa.)\n const nextTexelOffset = padLeft % 2 === 0 ?\n util.nearestLargerEven(dilationWidth) :\n dilationWidth;\n if ((dilationWidth % 2 === 0 && padLeft % 2 === 1) ||\n (dilationWidth % 2 !== 0 && padLeft % 2 !== 1)) {\n mainLoop += `\n xCOffset = xC + imod(pads[1], 2) + ${nextTexelOffset};\n\n if (xCOffset >= 0 && xCOffset < inDims[1] && xTexelC${colIndex + 1}Ready == 0) {\n xTexelC${colIndex + 1} = getX(batch, xR, xCOffset, d1);\n\n // Need to manually clear unused channels in case\n // we're reading from recycled texture.\n if (xCOffset + 1 >= inDims[1]) {\n xTexelC${colIndex + 1}.zw = vec2(0.0);\n }\n xTexelC${colIndex + 1}Ready = 1;\n }\n `;\n // If dilation > 1 then the xRC's will not be able to share any\n // values, so each xRC will require two unique calls to getX.\n if (dilationWidth > 1) {\n mainLoop += `\n xCOffset -= 2;\n if (xCOffset >= 0 && xCOffset < inDims[1]) {\n previous = getX(batch, xR, xCOffset, d1);\n xC${colIndex + 1} = vec4(previous.zw, xTexelC${colIndex + 1}.xy);\n } else {\n xC${colIndex + 1} = vec4(0.0, 0.0, xTexelC${colIndex + 1}.xy);\n }\n `;\n }\n else {\n mainLoop += `\n xC${colIndex + 1} = vec4(xTexelC${colIndex}.zw, xTexelC${colIndex + 1}.xy);\n `;\n }\n }\n else {\n // If dilation is 1 and padding is odd, we have already read the\n // texel when constructing the previous x value. Here we can\n // simply skip the texture read.\n if (nextTexelOffset === 1) {\n mainLoop += `\n xC${colIndex + 1} = xTexelC${colIndex};\n `;\n }\n else {\n mainLoop += `\n xCOffset = xC + ${nextTexelOffset};\n\n if (xCOffset >= 0 && xCOffset < inDims[1] && xTexelC${colIndex + 1}Ready == 0) {\n xTexelC${colIndex + 1} = getX(batch, xR, xCOffset, d1);\n if (xCOffset + 1 >= inDims[1]) {\n xTexelC${colIndex + 1}.zw = vec2(0.0);\n }\n xTexelC${colIndex + 1}Ready = 1;\n }\n\n xC${colIndex + 1} = xTexelC${colIndex + 1};\n `;\n }\n }\n }\n }\n }\n else { // stride === 2\n if (colIndex < filterWidth) {\n // Depending on whether padLeft is even or odd, we want either the\n // xy or zw channels from X texels for xC${colIndex}. If padLeft is\n // even, xC${colIndex +1} is simply the zw channels of texels we've\n // already sampled. But if padLeft is odd, xC{$c + 1}.zw will\n // need to come from the xy channels of a new texel, hence the `\n // vec4\n // final` initialized below.\n if (padLeft % 2 === 1) {\n mainLoop += `\n xCOffset = xC + 1 - strides[1];\n if(xCOffset >= 0 && xCOffset < inDims[1] && xTexelC${colIndex}Ready == 0) {\n xTexelC${colIndex} = getX(batch, xR, xCOffset, d1);\n // Need to manually clear unused channels in case\n // we're reading from recycled texture.\n if (xCOffset + 1 >= inDims[1]) {\n xTexelC${colIndex}.zw = vec2(0.0);\n }\n xTexelC${colIndex}Ready = 1;\n }\n\n if(xC + 1 >= 0 && xC + 1 < inDims[1] && xTexelC${colIndex + 1}Ready == 0) {\n xTexelC${colIndex + 1} = getX(batch, xR, xC + 1, d1);\n // Need to manually clear unused channels in case\n // we're reading from recycled texture.\n if (xC + 2 >= inDims[1]) {\n xTexelC${colIndex + 1}.zw = vec2(0.0);\n }\n xTexelC${colIndex + 1}Ready = 1;\n }\n\n xC${colIndex} = vec4(xTexelC${colIndex}.zw, xTexelC${colIndex + 1}.zw);\n `;\n if (colIndex + 1 < filterWidth) {\n mainLoop += `\n final = vec4(0.0);\n xCOffset = xC + 1 + strides[1];\n if(xCOffset >= 0 && xCOffset < inDims[1]) {\n final = getX(batch, xR, xCOffset, d1);\n }\n xC${colIndex + 1} = vec4(xTexelC${colIndex + 1}.xy, final.xy);\n `;\n }\n }\n else {\n mainLoop += `\n if(xC >= 0 && xC < inDims[1] && xTexelC${colIndex}Ready == 0) {\n xTexelC${colIndex} = getX(batch, xR, xC, d1);\n if (xC + 1 >= inDims[1]) {\n xTexelC${colIndex}.zw = vec2(0.0);\n }\n xTexelC${colIndex}Ready = 1;\n }\n\n xCOffset = xC + strides[1];\n if(xCOffset >= 0 && xCOffset < inDims[1] && xTexelC${colIndex + 1}Ready == 0) {\n xTexelC${colIndex + 1} = getX(batch, xR, xCOffset, d1);\n if (xCOffset + 1 >= inDims[1]) {\n xTexelC${colIndex + 1}.zw = vec2(0.);\n }\n xTexelC${colIndex + 1}Ready = 1;\n }\n\n xC${colIndex} = vec4(\n xTexelC${colIndex}.xy, xTexelC${colIndex + 1}.xy);\n `;\n if (colIndex + 1 < filterWidth) {\n mainLoop += `\n xC${colIndex + 1} = vec4(xTexelC${colIndex}.zw, xTexelC${colIndex + 1}.zw);\n `;\n }\n }\n }\n }\n // localize the dotProd accumulation within the loop, the theory is for\n // GPU with limited cache, accumulate sum across large amount of\n // veriables will cause lots of cache misses. (i.e. 5x5 filter will have\n // 50 variables)\n if (colIndex < filterWidth) {\n mainLoop += `\n wTexel = getW(r, ${colIndex}, d1, d2);\n dotProd += xC${colIndex}.xxzz * vec4(wTexel.xy, wTexel.xy);\n if(d1 + 1 < ${convInfo.inChannels}) {\n dotProd += xC${colIndex}.yyww * vec4(wTexel.zw, wTexel.zw);\n }\n `;\n if (colIndex + 1 < filterWidth) {\n mainLoop += `\n wTexel = getW(r, ${colIndex + 1}, d1, d2);\n dotProd += xC${colIndex + 1}.xxzz * vec4(wTexel.xy, wTexel.xy);\n if(d1 + 1 < ${convInfo.inChannels}) {\n dotProd += xC${colIndex + 1}.yyww * vec4(wTexel.zw, wTexel.zw);\n }\n `;\n }\n }\n }\n mainLoop += `\n }\n `;\n mainLoop += `\n }\n `;\n mainLoop += `\n }\n `;\n let activationSnippet = '', applyActivationSnippet = '';\n if (activation) {\n if (hasPreluActivation) {\n activationSnippet = `vec4 activation(vec4 a) {\n vec4 b = getPreluActivationWeightsAtOutCoords();\n ${activation}\n }`;\n }\n else if (hasLeakyReluAlpha) {\n activationSnippet = `vec4 activation(vec4 a) {\n vec4 b = getLeakyreluAlphaAtOutCoords();\n ${activation}\n }`;\n }\n else {\n activationSnippet = `vec4 activation(vec4 x) {\n ${activation}\n }`;\n }\n applyActivationSnippet = `result = activation(result);`;\n }\n const addBiasSnippet = addBias ? 'result += getBiasAtOutCoords();' : '';\n if (addBias) {\n this.variableNames.push('bias');\n }\n if (hasPreluActivation) {\n this.variableNames.push('preluActivationWeights');\n }\n if (hasLeakyReluAlpha) {\n this.variableNames.push('leakyreluAlpha');\n }\n this.userCode = `\n ${activationSnippet}\n\n void main() {\n ivec4 coords = getOutputCoords();\n int batch = coords.x;\n ivec2 xRCCorner = coords.yz * strides - pads;\n int d2 = coords.w;\n int xRCorner = xRCCorner.x;\n int xCCorner = xRCCorner.y;\n\n //intialize dotProd with a small epsilon seems to reduce GPU accuracy loss.\n vec4 dotProd = vec4(0.000000000000001);\n\n ${mainLoop}\n\n vec4 result = dotProd - vec4(0.000000000000001);\n ${addBiasSnippet}\n ${applyActivationSnippet}\n setOutput(result);\n }\n `;\n }\n}\n//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY29udl9wYWNrZWRfZ3B1LmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vdGZqcy1iYWNrZW5kLXdlYmdsL3NyYy9jb252X3BhY2tlZF9ncHUudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUE7Ozs7Ozs7Ozs7Ozs7OztHQWVHO0FBRUYsT0FBTyxFQUFlLElBQUksRUFBQyxNQUFNLHVCQUF1QixDQUFDO0FBRXpELE9BQU8sRUFBZSxnQkFBZ0IsRUFBQyxNQUFNLGNBQWMsQ0FBQztBQUU1RCxNQUFNLE9BQU8sbUJBQW1CO0lBYzlCLFlBQ0ksUUFBaUMsRUFBRSxPQUFPLEdBQUcsS0FBSyxFQUNsRCxhQUFxQixJQUFJLEVBQUUsa0JBQWtCLEdBQUcsS0FBSyxFQUNyRCxpQkFBaUIsR0FBRyxLQUFLO1FBaEI3QixrQkFBYSxHQUFHLENBQUMsR0FBRyxFQUFFLEdBQUcsQ0FBQyxDQUFDO1FBQzNCLGlCQUFZLEdBQUcsSUFBSSxDQUFDO1FBQ3BCLGlCQUFZLEdBQUcsSUFBSSxDQUFDO1FBSXBCLG1CQUFjLEdBQUc7WUFDZixFQUFDLElBQUksRUFBRSxNQUFNLEVBQUUsSUFBSSxFQUFFLE9BQWdCLEVBQUU7WUFDdkMsRUFBQyxJQUFJLEVBQUUsU0FBUyxFQUFFLElBQUksRUFBRSxPQUFnQixFQUFFO1lBQzFDLEVBQUMsSUFBSSxFQUFFLFdBQVcsRUFBRSxJQUFJLEVBQUUsT0FBZ0IsRUFBRTtZQUM1QyxFQUFDLElBQUksRUFBRSxRQUFRLEVBQUUsSUFBSSxFQUFFLE9BQWdCLEVBQUU7U0FDMUMsQ0FBQztRQU1BLElBQUksQ0FBQyxXQUFXLEdBQUcsUUFBUSxDQUFDLFFBQVEsQ0FBQztRQUNyQyxJQUFJLENBQUMsbUJBQW1CLEdBQUcsZ0JBQWdCLENBQUMsSUFBSSxDQUFDLFdBQVcsQ0FBQyxNQUFNLENBQUMsQ0FBQztRQUNyRSxNQUFNLE9BQU8sR0FBRyxRQUFRLENBQUMsT0FBTyxDQUFDLElBQUksQ0FBQztRQUN0QyxNQUFN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LElBQUksQ0FBQyxNQUFNLENBQUMsQ0FBQztTQUNqQztRQUVELElBQUksa0JBQWtCLEVBQUU7WUFDdEIsSUFBSSxDQUFDLGFBQWEsQ0FBQyxJQUFJLENBQUMsd0JBQXdCLENBQUMsQ0FBQztTQUNuRDtRQUNELElBQUksaUJBQWlCLEVBQUU7WUFDckIsSUFBSSxDQUFDLGFBQWEsQ0FBQyxJQUFJLENBQUMsZ0JBQWdCLENBQUMsQ0FBQztTQUMzQztRQUVELElBQUksQ0FBQyxRQUFRLEdBQUc7U0FDWixpQkFBaUI7Ozs7Ozs7Ozs7Ozs7V0FhZixRQUFROzs7V0FHUixjQUFjO1dBQ2Qsc0JBQXNCOzs7TUFHM0IsQ0FBQztJQUNKLENBQUM7Q0FDRiIsInNvdXJjZXNDb250ZW50IjpbIi8qKlxuICogQGxpY2Vuc2VcbiAqIENvcHlyaWdodCAyMDIyIEdvb2dsZSBMTEMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuXG4gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgXCJMaWNlbnNlXCIpO1xuICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLlxuICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0XG4gKlxuICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wXG4gKlxuICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZVxuICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gXCJBUyBJU1wiIEJBU0lTLFxuICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuXG4gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kXG4gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS5cbiAqID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4gKi9cblxuIGltcG9ydCB7YmFja2VuZF91dGlsLCB1dGlsfSBmcm9tICdAdGVuc29yZmxvdy90ZmpzLWNvcmUnO1xuXG4gaW1wb3J0IHtHUEdQVVByb2dyYW0sIHVzZVNoYXBlVW5pZm9ybXN9IGZyb20gJy4vZ3BncHVfbWF0aCc7XG5cbiBleHBvcnQgY2xhc3MgQ29udjJEUGFja2VkUHJvZ3JhbSBpbXBsZW1lbnRzIEdQR1BVUHJvZ3JhbSB7XG4gICB2YXJpYWJsZU5hbWVzID0gWyd4JywgJ1cnXTtcbiAgIHBhY2tlZElucHV0cyA9IHRydWU7XG4gICBwYWNrZWRPdXRwdXQgPSB0cnVlO1xuICAgb3V0cHV0U2hhcGU6IG51bWJlcltdO1xuICAgdXNlckNvZGU6IHN0cmluZztcbiAgIGVuYWJsZVNoYXBlVW5pZm9ybXM6IGJvb2xlYW47XG4gICBjdXN0b21Vbmlmb3JtcyA9IFtcbiAgICAge25hbWU6ICdwYWRzJywgdHlwZTogJ2l2ZWMyJyBhcyBjb25zdCB9LFxuICAgICB7bmFtZTogJ3N0cmlkZXMnLCB0eXBlOiAnaXZlYzInIGFzIGNvbnN0IH0sXG4gICAgIHtuYW1lOiAnZGlsYXRpb25zJywgdHlwZTogJ2l2ZWMyJyBhcyBjb25zdCB9LFxuICAgICB7bmFtZTogJ2luRGltcycsIHR5cGU6ICdpdmVjMicgYXMgY29uc3QgfSxcbiAgIF07XG5cbiAgIGNvbnN0cnVjdG9yKFxuICAgICAgIGNvbnZJbmZvOiBiYWNrZW5kX3V0aWwuQ29udjJESW5mbywgYWRkQmlhcyA9IGZhbHNlLFxuICAgICAgIGFjdGl2YXRpb246IHN0cmluZyA9IG51bGwsIGhhc1ByZWx1QWN0aXZhdGlvbiA9IGZhbHNlLFxuICAgICAgIGhhc0xlYWt5UmVsdUFscGhhID0gZmFsc2UpIHtcbiAgICAgdGhpcy5vdXRwdXRTaGFwZSA9IGNvbnZJbmZvLm91dFNoYXBlO1xuICAgICB0aGlzLmVuYWJsZVNoYXBlVW5pZm9ybXMgPSB1c2VTaGFwZVVuaWZvcm1zKHRoaXMub3V0cHV0U2hhcGUubGVuZ3RoKTtcbiAgICAgY29uc3QgcGFkTGVmdCA9IGNvbnZJbmZvLnBhZEluZm8ubGVmdDtcbiAgICAgY29uc3Qgc3RyaWRlV2lkdGggPSBjb252SW5mby5zdHJpZGVXaWR0aDtcbiAgICAgY29uc3QgZGlsYXRpb25XaWR0aCA9IGNvbnZJbmZvLmRpbGF0aW9uV2lkdGg7XG4gICAgIGNvbnN0IGZpbHRlckhlaWdodCA9IGNvbnZJbmZvLmZpbHRlckhlaWdodDtcbiAgICAgY29uc3QgZmlsdGVyV2lkdGggPSBjb252SW5mby5maWx0ZXJXaWR0aDtcbiAgICAgY29uc3QgdGV4ZWxzQWNyb3NzID0gZmlsdGVyV2lkdGg7XG5cbiAgICAgbGV0IG1haW5Mb29wID0gYFxuICAgICAgIGludCB4UjsgaW50IHhDOyBpbnQgeENPZmZzZXQ7XG4gICAgICAgdmVjNCB3VGV4ZWw7IHZlYzQgcHJldmlvdXM7IHZlYzQgZmluYWw7YDtcblxuICAgICBmb3IgKGxldCBjID0gMDsgYyA8IGZpbHRlcldpZHRoOyBjKyspIHtcbiAgICAgICBtYWluTG9vcCArPSBgXG4gICAgICAgICAgIHZlYzQgeFRleGVsQyR7YyAqIDJ9O1xuICAgICAgICAgICBpbnQgeFRleGVsQyR7YyAqIDJ9UmVhZHk7XG4gICAgICAgICAgIHZlYzQgeFRleGVsQyR7YyAqIDIgKyAxfTtcbiAgICAgICAgICAgaW50IHhUZXhlbEMke2MgKiAyICsgMX1SZWFkeTtcbiAgICAgICAgICAgdmVjNCB4QyR7Y307YDtcbiAgICAgfVxuXG4gICAgIC8qKlxuICAgICAgKiBUaGlzIHZlY3Rvcml6ZWQgaW1wbGVtZW50YXRpb24gd29ya3MgYnkgZ2F0aGVyaW5nIHRoZSB2YWx1ZXMgbmVlZGVkIGZvclxuICAgICAgKiBlYWNoIG91dHB1dCBjaGFubmVsJ3MgZG90IHByb2R1Y3QgaW50byB2ZWM0J3MgYW5kIHRoZW4gbXVsdGlwbHlpbmcgdGhlbVxuICAgICAgKiBhbGwgdG9nZXRoZXIgKHRoaXMgaGFwcGVucyBpbiB0aGUgZmluYWwgZG91YmxlIGZvci1sb29wIGJlbG93KS4gTW9zdCBvZlxuICAgICAgKiB0aGUgbWFpbiBsb29wIGNvbnNpc3RzIG9mIGNvbnN0cnVjdGluZyB0aGVzZSB2ZWM0J3Mgd2l0aCB0aGUgbWluaW11bVxuICAgICAgKiBudW1iZXIgb2YgdGV4dHVyZTJEIGNhbGxzLCB3aGljaCBtZWFucyBtYWtpbmcgdXNlIG9mIGFsbCBmb3VyIHJldHVybmVkXG4gICAgICAqIHZhbHVlcyBmcm9tIGEgdGV4dHVyZTJEIGNhbGwgYXQgb25jZS5cbiAgICAgICovXG4gICAgIG1haW5Mb29wICs9IGBcbiAgICAgZm9yIChpbnQgciA9IDA7IHIgPCAke2ZpbHRlckhlaWdodH07IHIrKykge1xuICAgICAgZm9yIChpbnQgZDEgPSAwOyBkMSA8ICR7Y29udkluZm8uaW5DaGFubmVsc307IGQxICs9IDIpIHtcbiAgICAgICBgO1xuICAgICBmb3IgKGxldCBjID0gMDsgYyA8IGZpbHRlcldpZHRoOyBjKyspIHtcbiAgICAgICBtYWluTG9vcCArPSBgXG4gICAgICAgICAgIHhUZXhlbEMke2MgKiAyfSA9IHZlYzQoMC4wKTtcbiAgICAgICAgICAgeFRleGVsQyR7YyAqIDJ9UmVhZHkgPSAwO1xuICAgICAgICAgICB4VGV4ZWxDJHtjICogMiArIDF9ID0gdmVjNCgwLjApO1xuICAgICAgICAgICB4VGV4ZWxDJHtjICogMiArIDF9UmVhZHkgPSAwO1xuICAgICAgICAgICB4QyR7Y30gPSB2ZWM0KDAuMCk7YDtcbiAgICAgfVxuICAgICBtYWluTG9vcCArPSBgXG4gICAgICAgICB4UiA9IHhSQ29ybmVyICsgciAqIGRpbGF0aW9uc1swXTtcbiAgICAgICAgIGlmICh4UiA+PTAgJiYgeFIgPCBpbkRpbXNbMF0pIHtcbiAgICAgICBgO1xuXG4gICAgIGZvciAobGV0IHRleGVsQyA9IDA7IHRleGVsQyA8ICh0ZXhlbHNBY3Jvc3MgKyAxKSAvIDI7IHRleGVsQysrKSB7XG4gICAgICAgY29uc3QgY29sSW5kZXggPSB0ZXhlbEMgKiAyO1xuXG4gICAgICAgbWFpbkxvb3AgKz0gYFxuICAgICAgICAgICB4QyA9IHhDQ29ybmVyICsgJHtjb2xJbmRleCAqIGRpbGF0aW9uV2lkdGh9O1xuICAgICAgICAgICBgO1xuXG4gICAgICAgaWYgKHN0cmlkZVdpZHRoID09PSAxKSB7XG4gICAgICAgICBpZiAoY29sSW5kZXggPCBmaWx0ZXJXaWR0aCkge1xuICAgICAgICAgICAvLyBJZiBwYWRkaW5nIGlzIG9kZCwgdGhlIG91dGVyIHRleGVscyBoYXZlIHRvIGJlIGNvbXBvc2VkLlxuICAgICAgICAgICBpZiAocGFkTGVmdCAlIDIgPT09IDEpIHtcbiAgICAgICAgICAgICAvLyBUT0RPOiBFbnN1cmUgdmVjNCBwcmV2aW91cyBkb2VzIG5vdCByZXN1bHQgaW4gcmVkdW5kYW50IHNhbXBsZSxcbiAgICAgICAgICAgICAvLyBhbmQgYXZvaWQgc2V0dGluZyB4VGV4ZWxSQydzIHRoYXQgZXhjZWVkIHRoZSBib3VuZGFyeSBpbiB0aGVcbiAgICAgICAgICAgICAvLyBmaXJzdCBwbGFjZSByYXRoZXIgdGhhbiByZXNldHRpbmcgdGhlbSB0byB2ZWM0KDApKS5cblxuICAgICAgICAgICAgIC8vIFRvIGNvbXB1dGUgeENPZmZzZXQ6XG4gICAgICAgICAgICAgLy8gLSBJZiBwYWRkaW5nIGlzIG9kZCwgd2UgbXVzdCBhZGQgMSB0byBlbnN1cmUgd2UgYXNrIGZvciBhblxuICAgICAgICAgICAgIC8vIGV2ZW4tbnVtYmVyZWQgcm93LlxuICAgICAgICAgICAgIC8vIC0gV2Ugc3VidHJhY3QgMiB0byBhY2Nlc3MgdGhlIHByZXZpb3VzIHRleGVsLlxuXG4gICAgICAgICAgICAgbWFpbkxvb3AgKz0gYFxuICAgICAgICAgICAgICAgICB4Q09mZnNldCA9IHhDICsgMTtcbiAgICAgICAgICAgICAgICAgaWYgKHhDT2Zmc2V0ID49IDAgJiYgeENPZmZzZXQgPCBpbkRpbXNbMV0gJiYgeFRleGVsQyR7XG4gICAgICAgICAgICAgICAgIGNvbEluZGV4fVJlYWR5ID09IDApIHtcbiAgICAgICAgICAgICAgICAgICB4VGV4ZWxDJHtjb2xJbmRleH0gPSBnZXRYKGJhdGNoLCB4UiwgeENPZmZzZXQsIGQxKTtcblxuICAgICAgICAgICAgICAgICAgIC8vIE5lZWQgdG8gbWFudWFsbHkgY2xlYXIgdW51c2VkIGNoYW5uZWxzIGluIGNhc2VcbiAgICAgICAgICAgICAgICAgICAvLyB3ZSdyZSByZWFkaW5nIGZyb20gcmVjeWNsZWQgdGV4dHVyZS5cbiAgICAgICAgICAgICAgICAgICBpZiAoeENPZmZzZXQgKyAxID49IGluRGltc1sxXSkge1xuICAgICAgICAgICAgICAgICAgICAgeFRleGVsQyR7Y29sSW5kZXh9Lnp3ID0gdmVjMigwLjApO1xuICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICB4VGV4ZWxDJHtjb2xJbmRleH1SZWFkeSA9IDE7XG4gICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgIGA7XG4gICAgICAgICAgICAgLy8gVGhpcyB0ZXhlbCBoYXMgYmVlbiByZWFkIGluIHByZXZpb3VzIGl0ZXJhdGlvbiBpZiB0aGUgZGlsYXRpb25cbiAgICAgICAgICAgICAvLyBpcyAxLlxuICAgICAgICAgICAgIGlmIChkaWxhdGlvbldpZHRoID09PSAxICYmIGNvbEluZGV4ID4gMCkge1xuICAgICAgICAgICAgICAgbWFpbkxvb3AgKz0gYFxuICAgICAgICAgICAgICAgICB4QyR7Y29sSW5kZXh9ID0gdmVjNCh4VGV4ZWxDJHtjb2xJbmRleCAtIDJ9Lnp3LCB4VGV4ZWxDJHtcbiAgICAgICAgICAgICAgICAgICBjb2xJbmRleH0ueHkpO1xuICAgICAgICAgICAgICAgICBgO1xuICAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICBtYWluTG9vcCArPSBgXG4gICAgICAgICAgICAgICAgICAgeENPZmZzZXQgPSB4QyArIDEgLSAyO1xuXG4gICAgICAgICAgICAgICAgICAgaWYgKHhDT2Zmc2V0ID49IDAgJiYgeENPZmZzZXQgPCBpbkRpbXNbMV0pIHtcbiAgICAgICAgICAgICAgICAgICAgIHByZXZpb3VzID0gZ2V0WChiYXRjaCwgeFIsIHhDT2Zmc2V0LCBkMSk7XG5cbiAgICAgICAgICAgICAgICAgICAgIC8vIE5lZWQgdG8gbWFudWFsbHkgY2xlYXIgdW51c2VkIGNoYW5uZWxzIGluIGNhc2VcbiAgICAgICAgICAgICAgICAgICAgIC8vIHdlJ3JlIHJlYWRpbmcgZnJvbSByZWN5Y2xlZCB0ZXh0dXJlLlxuICAgICAgICAgICAgICAgICAgICAgaWYgKHhDT2Zmc2V0ICsgMSA+PSBpbkRpbXNbMV0pIHtcbiAgICAgICAgICAgICAgICAgICAgICAgcHJldmlvdXMuencgPSB2ZWMyKDAuMCk7XG4gICAgICAgICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgICAgICAgIHhDJHtjb2xJbmRleH0gPSB2ZWM0KHByZXZpb3VzLnp3LCB4VGV4ZWxDJHtjb2xJbmRleH0ueHkpO1xuICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgICB4QyR7Y29sSW5kZXh9ID0gdmVjNCgwLjAsIDAuMCwgeFRleGVsQyR7Y29sSW5kZXh9Lnh5KTtcbiAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgYDtcbiAgICAgICAgICAgICB9XG4gICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgLy8gUGFkZGluZyBpcyBldmVuLCBzbyB4UkMgY29ycmVzcG9uZHMgdG8gYSBzaW5nbGUgdGV4ZWwuXG4gICAgICAgICAgICAgbWFpbkxvb3AgKz0gYFxuICAgICAgICAgICAgICAgICBpZiAoeEMgPj0gMCAmJiB4QyA8IGluRGltc1sxXSAmJiB4VGV4ZWxDJHtjb2xJbmRleH1SZWFkeSA9PSAwKSB7XG4gICAgICAgICAgICAgICAgICAgeFRleGVsQyR7Y29sSW5kZXh9ID0gZ2V0WChiYXRjaCwgeFIsIHhDLCBkMSk7XG4gICAgICAgICAgICAgICAgICAgaWYgKHhDICsgMSA+PSBpbkRpbXNbMV0pIHtcbiAgICAgICAgICAgICAgICAgICAgIHhUZXhlbEMke2NvbEluZGV4fS56dyA9IHZlYzIoMC4wKTtcbiAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgeFRleGVsQyR7Y29sSW5kZXh9UmVhZHkgPSAxO1xuICAgICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgICAgeEMke2NvbEluZGV4fSA9IHhUZXhlbEMke2NvbEluZGV4fTtcbiAgICAgICAgICAgICAgICAgYDtcbiAgICAgICAgICAgfVxuXG4gICAgICAgICAgIGlmIChjb2xJbmRleCArIDEgPCBmaWx0ZXJXaWR0aCkge1xuICAgICAgICAgICAgIC8vIElmIGRpbGF0aW9uIGlzIGV2ZW4sIHRoZSBzZWNvbmQgZW50cnkgc2hvdWxkIG1hdGNoIHRoZSBmaXJzdFxuICAgICAgICAgICAgIC8vIChlaXRoZXIgYm90aCBhcmUgY29tcG9zZWQgb3IgYm90aCBhcmUgc2luZ2xlIHNhbXBsZXMpLiBCdXQgaWZcbiAgICAgICAgICAgICAvLyBkaWxhdGlvbiBpcyBvZGQsIHRoZW4gdGhlIHNlY29uZCBlbnRyeSBzaG91bGQgYmUgdGhlIG9wcG9zaXRlXG4gICAgICAgICAgICAgLy8gb2YgdGhlIGZpcnN0IChpZiB0aGUgZmlyc3QgaXMgY29tcG9zZWQsIHRoZSBzZWNvbmQgaXMgYSBzaW5nbGVcbiAgICAgICAgICAgICAvLyBzYW1wbGUsIGFuZCB2aWNlIHZlcnNhLilcblxuICAgICAgICAgICAgIGNvbnN0IG5leHRUZXhlbE9mZnNldCA9IHBhZExlZnQgJSAyID09PSAwID9cbiAgICAgICAgICAgICAgICAgdXRpbC5uZWFyZXN0TGFyZ2VyRXZlbihkaWxhdGlvbldpZHRoKSA6XG4gICAgICAgICAgICAgICAgIGRpbGF0aW9uV2lkdGg7XG5cbiAgICAgICAgICAgICBpZiAoKGRpbGF0aW9uV2lkdGggJSAyID09PSAwICYmIHBhZExlZnQgJSAyID09PSAxKSB8fFxuICAgICAgICAgICAgICAgICAoZGlsYXRpb25XaWR0aCAlIDIgIT09IDAgJiYgcGFkTGVmdCAlIDIgIT09IDEpKSB7XG4gICAgICAgICAgICAgICBtYWluTG9vcCArPSBgXG4gICAgICAgICAgICAgICAgICAgeENPZmZzZXQgPSB4QyArIGltb2QocGFkc1sxXSwgMikgKyAke25leHRUZXhlbE9mZnNldH07XG5cbiAgICAgICAgICAgICAgICAgICBpZiAoeENPZmZzZXQgPj0gMCAmJiB4Q09mZnNldCA8IGluRGltc1sxXSAmJiB4VGV4ZWxDJHtcbiAgICAgICAgICAgICAgICAgICBjb2xJbmRleCArIDF9UmVhZHkgPT0gMCkge1xuICAgICAgICAgICAgICAgICAgICAgeFRleGVsQyR7Y29sSW5kZXggKyAxfSA9IGdldFgoYmF0Y2gsIHhSLCB4Q09mZnNldCwgZDEpO1xuXG4gICAgICAgICAgICAgICAgICAgICAvLyBOZWVkIHRvIG1hbnVhbGx5IGNsZWFyIHVudXNlZCBjaGFubmVscyBpbiBjYXNlXG4gICAgICAgICAgICAgICAgICAgICAvLyB3ZSdyZSByZWFkaW5nIGZyb20gcmVjeWNsZWQgdGV4dHVyZS5cbiAgICAgICAgICAgICAgICAgICAgIGlmICh4Q09mZnNldCArIDEgPj0gaW5EaW1zWzFdKSB7XG4gICAgICAgICAgICAgICAgICAgICAgIHhUZXhlbEMke2NvbEluZGV4ICsgMX0uencgPSB2ZWMyKDAuMCk7XG4gICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICB4VGV4ZWxDJHtjb2xJbmRleCArIDF9UmVhZHkgPSAxO1xuICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICBgO1xuXG4gICAgICAgICAgICAgICAvLyBJZiBkaWxhdGlvbiA+IDEgdGhlbiB0aGUgeFJDJ3Mgd2lsbCBub3QgYmUgYWJsZSB0byBzaGFyZSBhbnlcbiAgICAgICAgICAgICAgIC8vIHZhbHVlcywgc28gZWFjaCB4UkMgd2lsbCByZXF1aXJlIHR3byB1bmlxdWUgY2FsbHMgdG8gZ2V0WC5cbiAgICAgICAgICAgICAgIGlmIChkaWxhdGlvbldpZHRoID4gMSkge1xuICAgICAgICAgICAgICAgICBtYWluTG9vcCArPSBgXG4gICAgICAgICAgICAgICAgICAgICB4Q09mZnNldCAtPSAyO1xuICAgICAgICAgICAgICAgICAgICAgaWYgKHhDT2Zmc2V0ID49IDAgJiYgeENPZmZzZXQgPCBpbkRpbXNbMV0pIHtcbiAgICAgICAgICAgICAgICAgICAgICBwcmV2aW91cyA9IGdldFgoYmF0Y2gsIHhSLCB4Q09mZnNldCwgZDEpO1xuICAgICAgICAgICAgICAgICAgICAgIHhDJHtjb2xJbmRleCArIDF9ID0gdmVjNChwcmV2aW91cy56dywgeFRleGVsQyR7XG4gICAgICAgICAgICAgICAgICAgICAgICBjb2xJbmRleCArIDF9Lnh5KTtcbiAgICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgICAgeEMke2NvbEluZGV4ICsgMX0gPSB2ZWM0KDAuMCwgMC4wLCB4VGV4ZWxDJHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGNvbEluZGV4ICsgMX0ueHkpO1xuICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgYDtcbiAgICAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgIG1haW5Mb29wICs9IGBcbiAgICAgICAgICAgICAgICAgICAgIHhDJHtjb2xJbmRleCArIDF9ID0gdmVjNCh4VGV4ZWxDJHtjb2xJbmRleH0uencsIHhUZXhlbEMke1xuICAgICAgICAgICAgICAgICAgICAgY29sSW5kZXggKyAxfS54eSk7XG4gICAgICAgICAgICAgICAgICAgICBgO1xuICAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgIC8vIElmIGRpbGF0aW9uIGlzIDEgYW5kIHBhZGRpbmcgaXMgb2RkLCB3ZSBoYXZlIGFscmVhZHkgcmVhZCB0aGVcbiAgICAgICAgICAgICAgIC8vIHRleGVsIHdoZW4gY29uc3RydWN0aW5nIHRoZSBwcmV2aW91cyB4IHZhbHVlLiBIZXJlIHdlIGNhblxuICAgICAgICAgICAgICAgLy8gc2ltcGx5IHNraXAgdGhlIHRleHR1cmUgcmVhZC5cbiAgICAgICAgICAgICAgIGlmIChuZXh0VGV4ZWxPZmZzZXQgPT09IDEpIHtcbiAgICAgICAgICAgICAgICAgbWFpbkxvb3AgKz0gYFxuICAgICAgICAgICAgICAgICAgICAgeEMke2NvbEluZGV4ICsgMX0gPSB4VGV4ZWxDJHtjb2xJbmRleH07XG4gICAgICAgICAgICAgICAgICAgICBgO1xuICAgICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICAgbWFpbkxvb3AgKz0gYFxuICAgICAgICAgICAgICAgICAgICAgeENPZmZzZXQgPSB4QyArICR7bmV4dFRleGVsT2Zmc2V0fTtcblxuICAgICAgICAgICAgICAgICAgICAgaWYgKHhDT2Zmc2V0ID49IDAgJiYgeENPZmZzZXQgPCBpbkRpbXNbMV0gJiYgeFRleGVsQyR7XG4gICAgICAgICAgICAgICAgICAgICBjb2xJbmRleCArIDF9UmVhZHkgPT0gMCkge1xuICAgICAgICAgICAgICAgICAgICAgICB4VGV4ZWxDJHtjb2xJbmRleCArIDF9ID0gZ2V0WChiYXRjaCwgeFIsIHhDT2Zmc2V0LCBkMSk7XG4gICAgICAgICAgICAgICAgICAgICAgIGlmICh4Q09mZnNldCArIDEgPj0gaW5EaW1zWzFdKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgeFRleGVsQyR7Y29sSW5kZXggKyAxfS56dyA9IHZlYzIoMC4wKTtcbiAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICB4VGV4ZWxDJHtjb2xJbmRleCArIDF9UmVhZHkgPSAxO1xuICAgICAgICAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgICAgICAgICB4QyR7Y29sSW5kZXggKyAxfSA9IHhUZXhlbEMke2NvbEluZGV4ICsgMX07XG4gICAgICAgICAgICAgICAgICAgICBgO1xuICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgIH1cbiAgICAgICAgICAgfVxuICAgICAgICAgfVxuICAgICAgIH0gZWxzZSB7ICAvLyBzdHJpZGUgPT09IDJcbiAgICAgICAgIGlmIChjb2xJbmRleCA8IGZpbHRlcldpZHRoKSB7XG4gICAgICAgICAgIC8vIERlcGVuZGluZyBvbiB3aGV0aGVyIHBhZExlZnQgaXMgZXZlbiBvciBvZGQsIHdlIHdhbnQgZWl0aGVyIHRoZVxuICAgICAgICAgICAvLyB4eSBvciB6dyBjaGFubmVscyBmcm9tIFggdGV4ZWxzIGZvciB4QyR7Y29sSW5kZXh9LiBJZiBwYWRMZWZ0IGlzXG4gICAgICAgICAgIC8vIGV2ZW4sIHhDJHtjb2xJbmRleCArMX0gaXMgc2ltcGx5IHRoZSB6dyBjaGFubmVscyBvZiB0ZXhlbHMgd2UndmVcbiAgICAgICAgICAgLy8gYWxyZWFkeSBzYW1wbGVkLiBCdXQgaWYgcGFkTGVmdCBpcyBvZGQsIHhDeyRjICsgMX0uencgd2lsbFxuICAgICAgICAgICAvLyBuZWVkIHRvIGNvbWUgZnJvbSB0aGUgeHkgY2hhbm5lbHMgb2YgYSBuZXcgdGV4ZWwsIGhlbmNlIHRoZSBgXG4gICAgICAgICAgIC8vIHZlYzRcbiAgICAgICAgICAgLy8gZmluYWxgIGluaXRpYWxpemVkIGJlbG93LlxuICAgICAgICAgICBpZiAocGFkTGVmdCAlIDIgPT09IDEpIHtcbiAgICAgICAgICAgICBtYWluTG9vcCArPSBgXG4gICAgICAgICAgICAgICAgIHhDT2Zmc2V0ID0geEMgKyAxIC0gc3RyaWRlc1sxXTtcbiAgICAgICAgICAgICAgICAgaWYoeENPZmZzZXQgPj0gMCAmJiB4Q09mZnNldCA8IGluRGltc1sxXSAmJiB4VGV4ZWxDJHtcbiAgICAgICAgICAgICAgICAgY29sSW5kZXh9UmVhZHkgPT0gMCkge1xuICAgICAgICAgICAgICAgICAgIHhUZXhlbEMke2NvbEluZGV4fSA9IGdldFgoYmF0Y2gsIHhSLCB4Q09mZnNldCwgZDEpO1xuICAgICAgICAgICAgICAgICAgIC8vIE5lZWQgdG8gbWFudWFsbHkgY2xlYXIgdW51c2VkIGNoYW5uZWxzIGluIGNhc2VcbiAgICAgICAgICAgICAgICAgICAvLyB3ZSdyZSByZWFkaW5nIGZyb20gcmVjeWNsZWQgdGV4dHVyZS5cbiAgICAgICAgICAgICAgICAgICBpZiAoeENPZmZzZXQgKyAxID49IGluRGltc1sxXSkge1xuICAgICAgICAgICAgICAgICAgICAgeFRleGVsQyR7Y29sSW5kZXh9Lnp3ID0gdmVjMigwLjApO1xuICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICB4VGV4ZWxDJHtjb2xJbmRleH1SZWFkeSA9IDE7XG4gICAgICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICAgICBpZih4QyArIDEgPj0gMCAmJiB4QyArIDEgPCBpbkRpbXNbMV0gJiYgeFRleGVsQyR7XG4gICAgICAgICAgICAgICAgIGNvbEluZGV4ICsgMX1SZWFkeSA9PSAwKSB7XG4gICAgICAgICAgICAgICAgICAgeFRleGVsQyR7Y29sSW5kZXggKyAxfSA9IGdldFgoYmF0Y2gsIHhSLCB4QyArIDEsIGQxKTtcbiAgICAgICAgICAgICAgICAgICAvLyBOZWVkIHRvIG1hbnVhbGx5IGNsZWFyIHVudXNlZCBjaGFubmVscyBpbiBjYXNlXG4gICAgICAgICAgICAgICAgICAgLy8gd2UncmUgcmVhZGluZyBmcm9tIHJlY3ljbGVkIHRleHR1cmUuXG4gICAgICAgICAgICAgICAgICAgaWYgKHhDICsgMiA+PSBpbkRpbXNbMV0pIHtcbiAgICAgICAgICAgICAgICAgICAgIHhUZXhlbEMke2NvbEluZGV4ICsgMX0uencgPSB2ZWMyKDAuMCk7XG4gICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgIHhUZXhlbEMke2NvbEluZGV4ICsgMX1SZWFkeSA9IDE7XG4gICAgICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICAgICB4QyR7Y29sSW5kZXh9ID0gdmVjNCh4VGV4ZWxDJHtjb2xJbmRleH0uencsIHhUZXhlbEMke1xuICAgICAgICAgICAgICAgICBjb2xJbmRleCArIDF9Lnp3KTtcbiAgICAgICAgICAgICAgIGA7XG5cbiAgICAgICAgICAgICBpZiAoY29sSW5kZXggKyAxIDwgZmlsdGVyV2lkdGgpIHtcbiAgICAgICAgICAgICAgIG1haW5Mb29wICs9IGBcbiAgICAgICAgICAgICAgICAgICBmaW5hbCA9IHZlYzQoMC4wKTtcbiAgICAgICAgICAgICAgICAgICB4Q09mZnNldCA9IHhDICsgMSArIHN0cmlkZXNbMV07XG4gICAgICAgICAgICAgICAgICAgaWYoeENPZmZzZXQgPj0gMCAmJiB4Q09mZnNldCA8IGluRGltc1sxXSkge1xuICAgICAgICAgICAgICAgICAgICAgZmluYWwgPSBnZXRYKGJhdGNoLCB4UiwgeENPZmZzZXQsIGQxKTtcbiAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgeEMke2NvbEluZGV4ICsgMX0gPSB2ZWM0KHhUZXhlbEMke2NvbEluZGV4ICsgMX0ueHksIGZpbmFsLnh5KTtcbiAgICAgICAgICAgICAgICAgYDtcbiAgICAgICAgICAgICB9XG4gICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgbWFpbkxvb3AgKz0gYFxuICAgICAgICAgICAgICAgICBpZih4QyA+PSAwICYmIHhDIDwgaW5EaW1zWzFdICYmIHhUZXhlbEMke2NvbEluZGV4fVJlYWR5ID09IDApIHtcbiAgICAgICAgICAgICAgICAgICB4VGV4ZWxDJHtjb2xJbmRleH0gPSBnZXRYKGJhdGNoLCB4UiwgeEMsIGQxKTtcbiAgICAgICAgICAgICAgICAgICBpZiAoeEMgKyAxID49IGluRGltc1sxXSkge1xuICAgICAgICAgICAgICAgICAgICAgeFRleGVsQyR7Y29sSW5kZXh9Lnp3ID0gdmVjMigwLjApO1xuICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICB4VGV4ZWxDJHtjb2xJbmRleH1SZWFkeSA9IDE7XG4gICAgICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICAgICB4Q09mZnNldCA9IHhDICsgc3RyaWRlc1sxXTtcbiAgICAgICAgICAgICAgICAgaWYoeENPZmZzZXQgPj0gMCAmJiB4Q09mZnNldCA8IGluRGltc1sxXSAmJiB4VGV4ZWxDJHtcbiAgICAgICAgICAgICAgICAgY29sSW5kZXggKyAxfVJlYWR5ID09IDApIHtcbiAgICAgICAgICAgICAgICAgICB4VGV4ZWxDJHtjb2xJbmRleCArIDF9ID0gZ2V0WChiYXRjaCwgeFIsIHhDT2Zmc2V0LCBkMSk7XG4gICAgICAgICAgICAgICAgICAgaWYgKHhDT2Zmc2V0ICsgMSA+PSBpbkRpbXNbMV0pIHtcbiAgICAgICAgICAgICAgICAgICAgIHhUZXhlbEMke2NvbEluZGV4ICsgMX0uencgPSB2ZWMyKDAuKTtcbiAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgeFRleGVsQyR7Y29sSW5kZXggKyAxfVJlYWR5ID0gMTtcbiAgICAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgICAgIHhDJHtjb2xJbmRleH0gPSB2ZWM0KFxuICAgICAgICAgICAgICAgICAgIHhUZXhlbEMke2NvbEluZGV4fS54eSwgeFRleGVsQyR7Y29sSW5kZXggKyAxfS54eSk7XG4gICAgICAgICAgICAgICBgO1xuXG4gICAgICAgICAgICAgaWYgKGNvbEluZGV4ICsgMSA8IGZpbHRlcldpZHRoKSB7XG4gICAgICAgICAgICAgICBtYWluTG9vcCArPSBgXG4gICAgICAgICAgICAgICAgICAgeEMke2NvbEluZGV4ICsgMX0gPSB2ZWM0KHhUZXhlbEMke2NvbEluZGV4fS56dywgeFRleGVsQyR7XG4gICAgICAgICAgICAgICAgICAgY29sSW5kZXggKyAxfS56dyk7XG4gICAgICAgICAgICAgICAgIGA7XG4gICAgICAgICAgICAgfVxuICAgICAgICAgICB9XG4gICAgICAgICB9XG4gICAgICAgfVxuXG4gICAgICAgLy8gbG9jYWxpemUgdGhlIGRvdFByb2QgYWNjdW11bGF0aW9uIHdpdGhpbiB0aGUgbG9vcCwgdGhlIHRoZW9yeSBpcyBmb3JcbiAgICAgICAvLyBHUFUgd2l0aCBsaW1pdGVkIGNhY2hlLCBhY2N1bXVsYXRlIHN1bSBhY3Jvc3MgbGFyZ2UgYW1vdW50IG9mXG4gICAgICAgLy8gdmVyaWFibGVzIHdpbGwgY2F1c2UgbG90cyBvZiBjYWNoZSBtaXNzZXMuIChpLmUuIDV4NSBmaWx0ZXIgd2lsbCBoYXZlXG4gICAgICAgLy8gNTAgdmFyaWFibGVzKVxuICAgICAgIGlmIChjb2xJbmRleCA8IGZpbHRlcldpZHRoKSB7XG4gICAgICAgICBtYWluTG9vcCArPSBgXG4gICAgICAgICAgICAgd1RleGVsID0gZ2V0VyhyLCAke2NvbEluZGV4fSwgZDEsIGQyKTtcbiAgICAgICAgICAgICBkb3RQcm9kICs9IHhDJHtjb2xJbmRleH0ueHh6eiAqIHZlYzQod1RleGVsLnh5LCB3VGV4ZWwueHkpO1xuICAgICAgICAgICAgIGlmKGQxICsgMSA8ICR7Y29udkluZm8uaW5DaGFubmVsc30pIHtcbiAgICAgICAgICAgICAgIGRvdFByb2QgKz0geEMke2NvbEluZGV4fS55eXd3ICogdmVjNCh3VGV4ZWwuencsIHdUZXhlbC56dyk7XG4gICAgICAgICAgICAgfVxuICAgICAgICAgICBgO1xuXG4gICAgICAgICBpZiAoY29sSW5kZXggKyAxIDwgZmlsdGVyV2lkdGgpIHtcbiAgICAgICAgICAgbWFpbkxvb3AgKz0gYFxuICAgICAgICAgICAgICAgd1RleGVsID0gZ2V0VyhyLCAke2NvbEluZGV4ICsgMX0sIGQxLCBkMik7XG4gICAgICAgICAgICAgICBkb3RQcm9kICs9IHhDJHtjb2xJbmRleCArIDF9Lnh4enogKiB2ZWM0KHdUZXhlbC54eSwgd1RleGVsLnh5KTtcbiAgICAgICAgICAgICAgIGlmKGQxICsgMSA8ICR7Y29udkluZm8uaW5DaGFubmVsc30pIHtcbiAgICAgICAgICAgICAgICAgZG90UHJvZCArPSB4QyR7Y29sSW5kZXggKyAxfS55eXd3ICogdmVjNCh3VGV4ZWwuencsIHdUZXhlbC56dyk7XG4gICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgYDtcbiAgICAgICAgIH1cbiAgICAgICB9XG4gICAgIH1cbiAgICAgbWFpbkxvb3AgKz0gYFxuICAgICB9XG4gICBgO1xuICAgbWFpbkxvb3AgKz0gYFxuICAgICB9XG4gICBgO1xuICAgbWFpbkxvb3AgKz0gYFxuICAgICB9XG4gICBgO1xuXG4gICAgIGxldCBhY3RpdmF0aW9uU25pcHBldCA9ICcnLCBhcHBseUFjdGl2YXRpb25TbmlwcGV0ID0gJyc7XG4gICAgIGlmIChhY3RpdmF0aW9uKSB7XG4gICAgICAgaWYgKGhhc1ByZWx1QWN0aXZhdGlvbikge1xuICAgICAgICAgYWN0aXZhdGlvblNuaXBwZXQgPSBgdmVjNCBhY3RpdmF0aW9uKHZlYzQgYSkge1xuICAgICAgICAgICB2ZWM0IGIgPSBnZXRQcmVsdUFjdGl2YXRpb25XZWlnaHRzQXRPdXRDb29yZHMoKTtcbiAgICAgICAgICAgJHthY3RpdmF0aW9ufVxuICAgICAgICAgfWA7XG4gICAgICAgfSBlbHNlIGlmIChoYXNMZWFreVJlbHVBbHBoYSkge1xuICAgICAgICAgYWN0aXZhdGlvblNuaXBwZXQgPSBgdmVjNCBhY3RpdmF0aW9uKHZlYzQgYSkge1xuICAgICAgICAgICB2ZWM0IGIgPSBnZXRMZWFreXJlbHVBbHBoYUF0T3V0Q29vcmRzKCk7XG4gICAgICAgICAgICR7YWN0aXZhdGlvbn1cbiAgICAgICAgIH1gO1xuICAgICAgIH0gZWxzZSB7XG4gICAgICAgICBhY3RpdmF0aW9uU25pcHBldCA9IGB2ZWM0IGFjdGl2YXRpb24odmVjNCB4KSB7XG4gICAgICAgICAgICR7YWN0aXZhdGlvbn1cbiAgICAgICAgIH1gO1xuICAgICAgIH1cblxuICAgICAgIGFwcGx5QWN0aXZhdGlvblNuaXBwZXQgPSBgcmVzdWx0ID0gYWN0aXZhdGlvbihyZXN1bHQpO2A7XG4gICAgIH1cblxuICAgICBjb25zdCBhZGRCaWFzU25pcHBldCA9IGFkZEJpYXMgPyAncmVzdWx0ICs9IGdldEJpYXNBdE91dENvb3JkcygpOycgOiAnJztcbiAgICAgaWYgKGFkZEJpYXMpIHtcbiAgICAgICB0aGlzLnZhcmlhYmxlTmFtZXMucHVzaCgnYmlhcycpO1xuICAgICB9XG5cbiAgICAgaWYgKGhhc1ByZWx1QWN0aXZhdGlvbikge1xuICAgICAgIHRoaXMudmFyaWFibGVOYW1lcy5wdXNoKCdwcmVsdUFjdGl2YXRpb25XZWlnaHRzJyk7XG4gICAgIH1cbiAgICAgaWYgKGhhc0xlYWt5UmVsdUFscGhhKSB7XG4gICAgICAgdGhpcy52YXJpYWJsZU5hbWVzLnB1c2goJ2xlYWt5cmVsdUFscGhhJyk7XG4gICAgIH1cblxuICAgICB0aGlzLnVzZXJDb2RlID0gYFxuICAgICAgICR7YWN0aXZhdGlvblNuaXBwZXR9XG5cbiAgICAgICB2b2lkIG1haW4oKSB7XG4gICAgICAgICBpdmVjNCBjb29yZHMgPSBnZXRPdXRwdXRDb29yZHMoKTtcbiAgICAgICAgIGludCBiYXRjaCA9IGNvb3Jkcy54O1xuICAgICAgICAgaXZlYzIgeFJDQ29ybmVyID0gY29vcmRzLnl6ICogc3RyaWRlcyAtIHBhZHM7XG4gICAgICAgICBpbnQgZDIgPSBjb29yZHMudztcbiAgICAgICAgIGludCB4UkNvcm5lciA9IHhSQ0Nvcm5lci54O1xuICAgICAgICAgaW50IHhDQ29ybmVyID0geFJDQ29ybmVyLnk7XG5cbiAgICAgICAgIC8vaW50aWFsaXplIGRvdFByb2Qgd2l0aCBhIHNtYWxsIGVwc2lsb24gc2VlbXMgdG8gcmVkdWNlIEdQVSBhY2N1cmFjeSBsb3NzLlxuICAgICAgICAgdmVjNCBkb3RQcm9kID0gdmVjNCgwLjAwMDAwMDAwMDAwMDAwMSk7XG5cbiAgICAgICAgICR7bWFpbkxvb3B9XG5cbiAgICAgICAgIHZlYzQgcmVzdWx0ID0gZG90UHJvZCAtIHZlYzQoMC4wMDAwMDAwMDAwMDAwMDEpO1xuICAgICAgICAgJHthZGRCaWFzU25pcHBldH1cbiAgICAgICAgICR7YXBwbHlBY3RpdmF0aW9uU25pcHBldH1cbiAgICAgICAgIHNldE91dHB1dChyZXN1bHQpO1xuICAgICAgIH1cbiAgICAgYDtcbiAgIH1cbiB9XG4iXX0=","/**\n * @license\n * Copyright 2019 Google LLC. All Rights Reserved.\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n * =============================================================================\n */\nimport { getGlslDifferences } from './glsl_version';\nimport { useShapeUniforms } from './gpgpu_math';\nexport class Im2ColPackedProgram {\n constructor(outputShape, convInfo) {\n this.variableNames = ['A'];\n this.packedInputs = true;\n this.packedOutput = true;\n this.customUniforms = [\n { name: 'inputShape', type: 'ivec4' },\n { name: 'pad', type: 'ivec2' },\n { name: 'stride', type: 'ivec2' },\n { name: 'dilation', type: 'ivec2' },\n { name: 'inChannels', type: 'int' },\n { name: 'itemsPerBlockRow', type: 'int' },\n { name: 'outWidth', type: 'int' },\n ];\n this.outputShape = outputShape;\n this.enableShapeUniforms = useShapeUniforms(this.outputShape.length);\n const { dataFormat } = convInfo;\n const glsl = getGlslDifferences();\n const isChannelsLast = dataFormat === 'channelsLast';\n const rowDim = isChannelsLast ? 1 : 2;\n const colDim = isChannelsLast ? 2 : 3;\n const boundsCheckingSnippet = this.enableShapeUniforms ?\n 'if(blockIndex < outShape[2] && pos < outShape[1]) {' :\n `if(blockIndex < ${outputShape[2]} && pos < ${outputShape[1]}) {`;\n let unrolled = ``;\n for (let row = 0; row <= 1; row++) {\n for (let col = 0; col <= 1; col++) {\n unrolled += `\n blockIndex = rc.z + ${col};\n pos = rc.y + ${row};\n\n ${boundsCheckingSnippet}\n offsetY = int(blockIndex / outWidth) * stride[0] - pad[0];\n d0 = offsetY + dilation[0] * (pos / itemsPerBlockRow);\n\n if(d0 < inputShape[${rowDim}] && d0 >= 0) {\n // Use custom imod instead mod. On Intel GPU, mod may generate\n // unexpected value.\n // https://github.com/tensorflow/tfjs/issues/5447\n offsetX = imod(blockIndex, outWidth) * stride[1] - pad[1];\n d1 = offsetX + dilation[1] * (imod(pos, itemsPerBlockRow) /\n inChannels);\n\n if(d1 < inputShape[${colDim}] && d1 >= 0) {\n\n ch = imod(pos, inChannels);\n\n if (${isChannelsLast}) {\n innerDims = vec2(d1, ch);\n result[${row * 2 + col}] = getChannel(\n getA(rc.x, d0, int(innerDims.x),\n int(innerDims.y)), innerDims);\n } else {\n innerDims = vec2(d0, d1);\n result[${row * 2 + col}] = getChannel(\n getA(rc.x, ch, int(innerDims.x),\n int(innerDims.y)), innerDims);\n }\n }\n }\n }\n `;\n }\n }\n this.userCode = `\n void main() {\n ivec3 rc = getOutputCoords();\n\n vec4 result = vec4(0);\n\n int blockIndex, pos, offsetY, d0, offsetX, d1, ch;\n vec2 innerDims;\n\n ${unrolled}\n\n ${glsl.output} = result;\n }\n `;\n }\n}\n//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW0yY29sX3BhY2tlZF9ncHUuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi90ZmpzLWJhY2tlbmQtd2ViZ2wvc3JjL2ltMmNvbF9wYWNrZWRfZ3B1LnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBOzs7Ozs7Ozs7Ozs7Ozs7R0FlRztBQUdILE9BQU8sRUFBQyxrQkFBa0IsRUFBQyxNQUFNLGdCQUFnQixDQUFDO0FBQ2xELE9BQU8sRUFBZSxnQkFBZ0IsRUFBQyxNQUFNLGNBQWMsQ0FBQztBQUU1RCxNQUFNLE9BQU8sbUJBQW1CO0lBaUI5QixZQUFZLFdBQXFCLEVBQUUsUUFBaUM7UUFoQnBFLGtCQUFhLEdBQUcsQ0FBQyxHQUFHLENBQUMsQ0FBQztRQUN0QixpQkFBWSxHQUFHLElBQUksQ0FBQztRQUNwQixpQkFBWSxHQUFHLElBQUksQ0FBQztRQUlwQixtQkFBYyxHQUFHO1lBQ2YsRUFBQyxJQUFJLEVBQUUsWUFBWSxFQUFFLElBQUksRUFBRSxPQUFnQixFQUFFO1lBQzdDLEVBQUMsSUFBSSxFQUFFLEtBQUssRUFBRSxJQUFJLEVBQUUsT0FBZ0IsRUFBRTtZQUN0QyxFQUFDLElBQUksRUFBRSxRQUFRLEVBQUUsSUFBSSxFQUFFLE9BQWdCLEVBQUU7WUFDekMsRUFBQyxJQUFJLEVBQUUsVUFBVSxFQUFFLElBQUksRUFBRSxPQUFnQixFQUFFO1lBQzNDLEVBQUMsSUFBSSxFQUFFLFlBQVksRUFBRSxJQUFJLEVBQUUsS0FBYyxFQUFFO1lBQzNDLEVBQUMsSUFBSSxFQUFFLGtCQUFrQixFQUFFLElBQUksRUFBRSxLQUFjLEVBQUU7WUFDakQsRUFBQyxJQUFJLEVBQUUsVUFBVSxFQUFFLElBQUksRUFBRSxLQUFjLEVBQUU7U0FDMUMsQ0FBQztRQUdBLElBQUksQ0FBQyxXQUFXLEdBQUcsV0FBVyxDQUFDO1FBQy9CLElBQUksQ0FBQyxtQkFBbUIsR0FBRyxnQkFBZ0IsQ0FBQyxJQUFJLENBQUMsV0FBVyxDQUFDLE1BQU0sQ0FBQyxDQUFDO1FBQ3JFLE1BQU0sRUFBQyxVQUFVLEVBQUMsR0FBRyxRQUFRLENBQUM7UUFDOUIsTUFBTSxJQUFJLEdBQUcsa0JBQWtCLEVBQUUsQ0FBQztRQUNsQyxNQUFNLGNBQWMsR0FBRyxVQUFVLEtBQUssY0FBYyxDQUFDO1FBQ3JELE1BQU0sTUFBTSxHQUFHLGNBQWMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUM7UUFDdEMsTUFBTSxNQUFNLEdBQUcsY0FBYyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQztRQUV0QyxNQUFNLHFCQUFxQixHQUFHLElBQUksQ0FBQyxtQkFBbUIsQ0FBQyxDQUFDO1lBQ3BELHFEQUFxRCxDQUFDLENBQUM7WUFDdkQsbUJBQW1CLFdBQVcsQ0FBQyxDQUFDLENBQUMsYUFBYSxXQUFXLENBQUMsQ0FBQyxDQUFDLEtBQUssQ0FBQztRQUN0RSxJQUFJLFFBQVEsR0FBRyxFQUFFLENBQUM7UUFFbEIsS0FBSyxJQUFJLEdBQUcsR0FBRyxDQUFDLEVBQUUsR0FBRyxJQUFJLENBQUMsRUFBRSxHQUFHLEVBQUUsRUFBRTtZQUNqQyxLQUFLLElBQUksR0FBRyxHQUFHLENBQUMsRUFBRSxHQUFHLElBQUksQ0FBQyxFQUFFLEdBQUcsRUFBRSxFQUFFO2dCQUNqQyxRQUFRLElBQUk7Z0NBQ1ksR0FBRzt5QkFDVixHQUFHOztZQUVoQixxQkFBcUI7Ozs7aUNBSUEsTUFBTTs7Ozs7Ozs7bUNBUUosTUFBTTs7OztzQkFJbkIsY0FBYzs7MkJBRVQsR0FBRyxHQUFHLENBQUMsR0FBRyxHQUFHOzs7OzsyQkFLYixHQUFHLEdBQUcsQ0FBQyxHQUFHLEdBQUc7Ozs7Ozs7U0FPL0IsQ0FBQzthQUNIO1NBQ0Y7UUFFRCxJQUFJLENBQUMsUUFBUSxHQUFHOzs7Ozs7Ozs7VUFTVixRQUFROztVQUVSLElBQUksQ0FBQyxNQUFNOztLQUVoQixDQUFDO0lBQ0osQ0FBQztDQUNGIiwic291cmNlc0NvbnRlbnQiOlsiLyoqXG4gKiBAbGljZW5zZVxuICogQ29weXJpZ2h0IDIwMTkgR29vZ2xlIExMQy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC5cbiAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSBcIkxpY2Vuc2VcIik7XG4gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuXG4gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXRcbiAqXG4gKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjBcbiAqXG4gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlXG4gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiBcIkFTIElTXCIgQkFTSVMsXG4gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC5cbiAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmRcbiAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLlxuICogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbiAqL1xuXG5pbXBvcnQge2JhY2tlbmRfdXRpbH0gZnJvbSAnQHRlbnNvcmZsb3cvdGZqcy1jb3JlJztcbmltcG9ydCB7Z2V0R2xzbERpZmZlcmVuY2VzfSBmcm9tICcuL2dsc2xfdmVyc2lvbic7XG5pbXBvcnQge0dQR1BVUHJvZ3JhbSwgdXNlU2hhcGVVbmlmb3Jtc30gZnJvbSAnLi9ncGdwdV9tYXRoJztcblxuZXhwb3J0IGNsYXNzIEltMkNvbFBhY2tlZFByb2dyYW0gaW1wbGVtZW50cyBHUEdQVVByb2dyYW0ge1xuICB2YXJpYWJsZU5hbWVzID0gWydBJ107XG4gIHBhY2tlZElucHV0cyA9IHRydWU7XG4gIHBhY2tlZE91dHB1dCA9IHRydWU7XG4gIG91dHB1dFNoYXBlOiBudW1iZXJbXTtcbiAgdXNlckNvZGU6IHN0cmluZztcbiAgZW5hYmxlU2hhcGVVbmlmb3JtczogYm9vbGVhbjtcbiAgY3VzdG9tVW5pZm9ybXMgPSBbXG4gICAge25hbWU6ICdpbnB1dFNoYXBlJywgdHlwZTogJ2l2ZWM0JyBhcyBjb25zdCB9LFxuICAgIHtuYW1lOiAncGFkJywgdHlwZTogJ2l2ZWMyJyBhcyBjb25zdCB9LFxuICAgIHtuYW1lOiAnc3RyaWRlJywgdHlwZTogJ2l2ZWMyJyBhcyBjb25zdCB9LFxuICAgIHtuYW1lOiAnZGlsYXRpb24nLCB0eXBlOiAnaXZlYzInIGFzIGNvbnN0IH0sXG4gICAge25hbWU6ICdpbkNoYW5uZWxzJywgdHlwZTogJ2ludCcgYXMgY29uc3QgfSxcbiAgICB7bmFtZTogJ2l0ZW1zUGVyQmxvY2tSb3cnLCB0eXBlOiAnaW50JyBhcyBjb25zdCB9LFxuICAgIHtuYW1lOiAnb3V0V2lkdGgnLCB0eXBlOiAnaW50JyBhcyBjb25zdCB9LFxuICBdO1xuXG4gIGNvbnN0cnVjdG9yKG91dHB1dFNoYXBlOiBudW1iZXJbXSwgY29udkluZm86IGJhY2tlbmRfdXRpbC5Db252MkRJbmZvKSB7XG4gICAgdGhpcy5vdXRwdXRTaGFwZSA9IG91dHB1dFNoYXBlO1xuICAgIHRoaXMuZW5hYmxlU2hhcGVVbmlmb3JtcyA9IHVzZVNoYXBlVW5pZm9ybXModGhpcy5vdXRwdXRTaGFwZS5sZW5ndGgpO1xuICAgIGNvbnN0IHtkYXRhRm9ybWF0fSA9IGNvbnZJbmZvO1xuICAgIGNvbnN0IGdsc2wgPSBnZXRHbHNsRGlmZmVyZW5jZXMoKTtcbiAgICBjb25zdCBpc0NoYW5uZWxzTGFzdCA9IGRhdGFGb3JtYXQgPT09ICdjaGFubmVsc0xhc3QnO1xuICAgIGNvbnN0IHJvd0RpbSA9IGlzQ2hhbm5lbHNMYXN0ID8gMSA6IDI7XG4gICAgY29uc3QgY29sRGltID0gaXNDaGFubmVsc0xhc3QgPyAyIDogMztcblxuICAgIGNvbnN0IGJvdW5kc0NoZWNraW5nU25pcHBldCA9IHRoaXMuZW5hYmxlU2hhcGVVbmlmb3JtcyA/XG4gICAgICAgICdpZihibG9ja0luZGV4IDwgb3V0U2hhcGVbMl0gJiYgcG9zIDwgb3V0U2hhcGVbMV0pIHsnIDpcbiAgICAgICAgYGlmKGJsb2NrSW5kZXggPCAke291dHB1dFNoYXBlWzJdfSAmJiBwb3MgPCAke291dHB1dFNoYXBlWzFdfSkge2A7XG4gICAgbGV0IHVucm9sbGVkID0gYGA7XG5cbiAgICBmb3IgKGxldCByb3cgPSAwOyByb3cgPD0gMTsgcm93KyspIHtcbiAgICAgIGZvciAobGV0IGNvbCA9IDA7IGNvbCA8PSAxOyBjb2wrKykge1xuICAgICAgICB1bnJvbGxlZCArPSBgXG4gICAgICAgICAgYmxvY2tJbmRleCA9IHJjLnogKyAke2NvbH07XG4gICAgICAgICAgcG9zID0gcmMueSArICR7cm93fTtcblxuICAgICAgICAgICR7Ym91bmRzQ2hlY2tpbmdTbmlwcGV0fVxuICAgICAgICAgICAgb2Zmc2V0WSA9IGludChibG9ja0luZGV4IC8gb3V0V2lkdGgpICogc3RyaWRlWzBdIC0gcGFkWzBdO1xuICAgICAgICAgICAgZDAgPSBvZmZzZXRZICsgZGlsYXRpb25bMF0gKiAocG9zIC8gaXRlbXNQZXJCbG9ja1Jvdyk7XG5cbiAgICAgICAgICAgIGlmKGQwIDwgaW5wdXRTaGFwZVske3Jvd0RpbX1dICYmIGQwID49IDApIHtcbiAgICAgICAgICAgICAgLy8gVXNlIGN1c3RvbSBpbW9kIGluc3RlYWQgbW9kLiBPbiBJbnRlbCBHUFUsIG1vZCBtYXkgZ2VuZXJhdGVcbiAgICAgICAgICAgICAgLy8gdW5leHBlY3RlZCB2YWx1ZS5cbiAgICAgICAgICAgICAgLy8gaHR0cHM6Ly9naXRodWIuY29tL3RlbnNvcmZsb3cvdGZqcy9pc3N1ZXMvNTQ0N1xuICAgICAgICAgICAgICBvZmZzZXRYID0gaW1vZChibG9ja0luZGV4LCBvdXRXaWR0aCkgKiBzdHJpZGVbMV0gLSBwYWRbMV07XG4gICAgICAgICAgICAgIGQxID0gb2Zmc2V0WCArIGRpbGF0aW9uWzFdICogKGltb2QocG9zLCBpdGVtc1BlckJsb2NrUm93KSAvXG4gICAgICAgICAgICAgICAgICBpbkNoYW5uZWxzKTtcblxuICAgICAgICAgICAgICBpZihkMSA8IGlucHV0U2hhcGVbJHtjb2xEaW19XSAmJiBkMSA+PSAwKSB7XG5cbiAgICAgICAgICAgICAgICBjaCA9IGltb2QocG9zLCBpbkNoYW5uZWxzKTtcblxuICAgICAgICAgICAgICAgIGlmICgke2lzQ2hhbm5lbHNMYXN0fSkge1xuICAgICAgICAgICAgICAgICAgaW5uZXJEaW1zID0gdmVjMihkMSwgY2gpO1xuICAgICAgICAgICAgICAgICAgcmVzdWx0WyR7cm93ICogMiArIGNvbH1dID0gZ2V0Q2hhbm5lbChcbiAgICAgICAgICAgICAgICAgICAgZ2V0QShyYy54LCBkMCwgaW50KGlubmVyRGltcy54KSxcbiAgICAgICAgICAgICAgICAgICAgaW50KGlubmVyRGltcy55KSksIGlubmVyRGltcyk7XG4gICAgICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICAgIGlubmVyRGltcyA9IHZlYzIoZDAsIGQxKTtcbiAgICAgICAgICAgICAgICAgIHJlc3VsdFske3JvdyAqIDIgKyBjb2x9XSA9IGdldENoYW5uZWwoXG4gICAgICAgICAgICAgICAgICAgIGdldEEocmMueCwgY2gsIGludChpbm5lckRpbXMueCksXG4gICAgICAgICAgICAgICAgICAgIGludChpbm5lckRpbXMueSkpLCBpbm5lckRpbXMpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICAgIH1cbiAgICAgICAgYDtcbiAgICAgIH1cbiAgICB9XG5cbiAgICB0aGlzLnVzZXJDb2RlID0gYFxuICAgICAgdm9pZCBtYWluKCkge1xuICAgICAgICBpdmVjMyByYyA9IGdldE91dHB1dENvb3JkcygpO1xuXG4gICAgICAgIHZlYzQgcmVzdWx0ID0gdmVjNCgwKTtcblxuICAgICAgICBpbnQgYmxvY2tJbmRleCwgcG9zLCBvZmZzZXRZLCBkMCwgb2Zmc2V0WCwgZDEsIGNoO1xuICAgICAgICB2ZWMyIGlubmVyRGltcztcblxuICAgICAgICAke3Vucm9sbGVkfVxuXG4gICAgICAgICR7Z2xzbC5vdXRwdXR9ID0gcmVzdWx0O1xuICAgICAgfVxuICAgIGA7XG4gIH1cbn1cbiJdfQ==","/**\n * @license\n * Copyright 2020 Google LLC. All Rights Reserved.\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n * =============================================================================\n */\nimport { util } from '@tensorflow/tfjs-core';\nimport { Im2ColPackedProgram } from '../im2col_packed_gpu';\nimport { mapActivationToShaderProgram } from '../kernel_utils/kernel_funcs_utils';\nimport { MatMulPackedProgram } from '../mulmat_packed_gpu';\nimport * as webgl_util from '../webgl_util';\nimport { batchMatMulImpl, MATMUL_SHARED_DIM_THRESHOLD } from './BatchMatMul_impl';\nimport { identity } from './Identity';\nimport { reshape } from './Reshape';\n// Both conv2dByMatMul and conv2dWithIm2Row fuse height and width into one\n// dimension to compute batchMatMul, so bias and activation weights are also\n// supposed to fuse the two dimensions into one.\n//\n// This function computes the target shape for fusing height and width\n// dimensions. Returning null means the shape is already compatible.\n//\n// Even though the bias is not supposed to be a 3-D or a 4-D (including\n// batch) tensor and PReLU activiation weights is not supposed to be a 4-D\n// tensor, we still need to support them, because we haven't disabled\n// them for NHWC format.\n// https://github.com/tensorflow/tfjs/blob/b53bd47e880367ae57493f0ea628abaf08db2d5d/tfjs-core/src/ops/fused/conv2d.ts#L181-L196\nfunction getShapeForBatchMatMul(shape, isChannelsLast) {\n const length = shape.length;\n if (length >= 3) {\n return isChannelsLast ?\n [\n ...shape.slice(0, -3) /* batch */,\n shape[length - 3] * shape[length - 2] /* height * width */,\n shape[length - 1] /* channel */\n ] :\n [\n ...shape.slice(0, -3) /* batch */, shape[length - 3] /* channel */,\n shape[length - 2] * shape[length - 1] /* height * width */\n ];\n }\n else if (!isChannelsLast && length === 1 && shape[0] > 1) {\n return [shape[0], 1];\n }\n else {\n return null;\n }\n}\n// For 1x1 kernels that iterate through every point in the input, convolution\n// can be expressed as matrix multiplication (without need for memory\n// remapping).\nexport function conv2dByMatMul({ x, filter, convInfo, backend, bias = null, preluActivationWeights = null, leakyreluAlpha = 0, activation = null }) {\n // Reshapes conv2D input to 2D tensors, uses matMul and then reshape the\n // result from 2D to 4D.\n const xShape = x.shape;\n const xTexData = backend.texData.get(x.dataId);\n const sharedMatMulDim = convInfo.inChannels;\n const outerShapeX = xShape[0] * xShape[1] * xShape[2];\n const outerShapeFilter = convInfo.outChannels;\n const isChannelsLast = convInfo.dataFormat === 'channelsLast';\n const transposeA = false;\n const transposeB = false;\n let out;\n const intermediates = [];\n if (preluActivationWeights != null) {\n const targetShape = getShapeForBatchMatMul(preluActivationWeights.shape, isChannelsLast);\n if (targetShape != null) {\n preluActivationWeights = reshape({\n inputs: { x: preluActivationWeights },\n backend,\n attrs: { shape: targetShape }\n });\n intermediates.push(preluActivationWeights);\n }\n }\n if (bias != null) {\n const targetShape = getShapeForBatchMatMul(bias.shape, isChannelsLast);\n if (targetShape != null) {\n bias = reshape({ inputs: { x: bias }, backend, attrs: { shape: targetShape } });\n intermediates.push(bias);\n }\n }\n // TODO: Once reduction ops are packed, batchMatMul will always be packed\n // and we can remove this condition.\n const batchMatMulWillBeUnpacked = (outerShapeX === 1 || outerShapeFilter === 1) &&\n sharedMatMulDim > MATMUL_SHARED_DIM_THRESHOLD;\n // The algorithm in the if condition assumes (1) the output will be packed,\n // (2) x is packed, (3) x isChannelsLast, (4) x's packed texture is already\n // on GPU, (5) col is odd, (6) the width, height and inChannels are the same\n // for xTexData.shape and xShape.\n const canOptimize = !batchMatMulWillBeUnpacked && xTexData.isPacked &&\n isChannelsLast && xTexData.texture != null && xShape[2] % 2 !== 0 &&\n util.arraysEqual(xTexData.shape.slice(-3), xShape.slice(-3));\n if (canOptimize) {\n // We avoid expensive packed 2x2 reshape by padding col count to next,\n // even number. When col is odd, the result of packed batchMatMul is\n // the same (has the same texture layout and and values in the texture) as\n // it is for next even col. We make the odd-cols tensor to look like\n // even-cols tensor before the operation and, after the batchMatMul,\n // fix the even-cols result to have odd number of cols.\n const targetShape = xShape[0] * xShape[1] * (xShape[2] + 1);\n const xReshaped = {\n dataId: x.dataId,\n shape: [1, targetShape, convInfo.inChannels],\n dtype: x.dtype\n };\n // xTexData.shape gets referenced from GPGPUBinary.inShapeInfos.\n // Decrementing col count, after batchMatMul->...->compileProgram leads to\n // invalid col count within the reference in GPGPUBinary.inShapeInfos.\n // Alternative fix would be to provide a copy to GPGPUBinary.inShapeInfos\n // in compileProgram method, but that would affect compilation of all\n // programs - instead, provide a copy here, with even col count, before\n // calling batchMatMul->...->compileProgram and after that, the original\n // xTexData.shape is restored.\n const originalXTexDataShape = xTexData.shape;\n xTexData.shape = xTexData.shape.slice();\n xTexData.shape[xTexData.shape.length - 2]++;\n util.assert(webgl_util.isReshapeFree(xTexData.shape, xReshaped.shape), () => `packed reshape ${xTexData.shape} to ${xReshaped.shape} isn't free`);\n const filterReshaped = reshape({\n inputs: { x: filter },\n backend,\n attrs: { shape: [1, convInfo.inChannels, convInfo.outChannels] }\n });\n intermediates.push(filterReshaped);\n const pointwiseConv = batchMatMulImpl({\n a: xReshaped,\n b: filterReshaped,\n backend,\n transposeA,\n transposeB,\n bias,\n activation,\n preluActivationWeights,\n leakyreluAlpha\n });\n const pointwiseConvTexData = backend.texData.get(pointwiseConv.dataId);\n util.assert(pointwiseConvTexData.isPacked, () => 'batchMatMul result is expected to be packed');\n // Restore the input shape to original.\n xTexData.shape = originalXTexDataShape;\n // Set the output shape - there is no need for expensive reshape as data\n // layout is already correct.\n pointwiseConvTexData.shape = convInfo.outShape;\n out = identity({ inputs: { x: pointwiseConv }, backend });\n out.shape = convInfo.outShape;\n intermediates.push(pointwiseConv);\n }\n else {\n const numCols = convInfo.outHeight * convInfo.outWidth;\n const xReshaped = reshape({\n inputs: { x },\n backend,\n attrs: {\n shape: isChannelsLast ?\n [convInfo.batchSize, numCols, convInfo.inChannels] :\n [convInfo.batchSize, convInfo.inChannels, numCols]\n }\n });\n const filterReshaped = reshape({\n inputs: { x: filter },\n backend,\n attrs: { shape: [1, convInfo.inChannels, convInfo.outChannels] }\n });\n const result = batchMatMulImpl({\n a: isChannelsLast ? xReshaped : filterReshaped,\n b: isChannelsLast ? filterReshaped : xReshaped,\n transposeA: !isChannelsLast,\n transposeB,\n backend,\n bias,\n activation,\n preluActivationWeights,\n leakyreluAlpha\n });\n out = reshape({ inputs: { x: result }, backend, attrs: { shape: convInfo.outShape } });\n intermediates.push(xReshaped);\n intermediates.push(filterReshaped);\n intermediates.push(result);\n }\n for (const i of intermediates) {\n backend.disposeIntermediateTensorInfo(i);\n }\n return out;\n}\n// Implements the im2row algorithm as outlined in \"High Performance\n// Convolutional Neural Networks for Document Processing\" (Suvisoft, 2006)\nexport function conv2dWithIm2Row({ x, filter, convInfo, backend, bias = null, preluActivationWeights = null, leakyreluAlpha = 0, activation = null }) {\n // Rearranges conv2d input so each block to be convolved over forms the\n // column of a new matrix with shape [filterWidth * filterHeight *\n // inChannels, outHeight * outWidth]. The filter is also rearranged so each\n // output channel forms a row of a new matrix with shape [outChannels,\n // filterWidth * filterHeight * inChannels]. The convolution is then\n // computed by multiplying these matrices and reshaping the result.\n const { filterWidth, filterHeight, inChannels, outWidth, outHeight, dataFormat } = convInfo;\n const isChannelsLast = dataFormat === 'channelsLast';\n const sharedDim = filterWidth * filterHeight * inChannels;\n const numCols = outHeight * outWidth;\n const x2ColShape = [convInfo.batchSize, sharedDim, numCols];\n const transposeA = true;\n const transposeB = false;\n const intermediates = [];\n if (preluActivationWeights != null) {\n const targetShape = getShapeForBatchMatMul(preluActivationWeights.shape, isChannelsLast);\n if (targetShape != null) {\n preluActivationWeights = reshape({\n inputs: { x: preluActivationWeights },\n backend,\n attrs: { shape: targetShape }\n });\n intermediates.push(preluActivationWeights);\n }\n }\n if (bias != null) {\n const targetShape = getShapeForBatchMatMul(bias.shape, isChannelsLast);\n if (targetShape != null) {\n bias = reshape({ inputs: { x: bias }, backend, attrs: { shape: targetShape } });\n intermediates.push(bias);\n }\n }\n const w2Row = reshape({\n inputs: { x: filter },\n backend,\n attrs: { shape: [1, sharedDim, util.sizeFromShape(filter.shape) / sharedDim] }\n });\n intermediates.push(w2Row);\n const im2ColProgram = new Im2ColPackedProgram(x2ColShape, convInfo);\n const customValues = [\n x.shape, [convInfo.padInfo.top, convInfo.padInfo.left],\n [convInfo.strideHeight, convInfo.strideWidth],\n [convInfo.dilationHeight, convInfo.dilationWidth], [convInfo.inChannels],\n [convInfo.filterWidth * convInfo.inChannels], [convInfo.outWidth]\n ];\n const im2Col = backend.runWebGLProgram(im2ColProgram, [x], 'float32', customValues);\n const im2ColReshaped = reshape({ inputs: { x: im2Col }, backend, attrs: { shape: x2ColShape } });\n intermediates.push(im2Col);\n intermediates.push(im2ColReshaped);\n const hasBias = bias != null;\n const hasPreluActivationWeights = preluActivationWeights != null;\n const hasLeakyreluAlpha = activation === 'leakyrelu';\n const fusedActivation = activation ? mapActivationToShaderProgram(activation, true) : null;\n const matmulProgram = new MatMulPackedProgram(isChannelsLast ? im2ColReshaped.shape :\n w2Row.shape, isChannelsLast ? w2Row.shape :\n im2ColReshaped.shape, isChannelsLast ? [convInfo.batchSize, numCols, convInfo.outChannels] :\n [convInfo.batchSize, convInfo.outChannels, numCols], transposeA, transposeB, hasBias, fusedActivation, hasPreluActivationWeights, hasLeakyreluAlpha);\n const inputs = isChannelsLast ? [im2ColReshaped, w2Row] : [w2Row, im2ColReshaped];\n if (bias) {\n inputs.push(bias);\n }\n if (hasPreluActivationWeights) {\n inputs.push(preluActivationWeights);\n }\n if (hasLeakyreluAlpha) {\n const $leakyreluAlpha = backend.makeTensorInfo([], 'float32', util.createScalarValue(leakyreluAlpha, 'float32'));\n inputs.push($leakyreluAlpha);\n intermediates.push($leakyreluAlpha);\n }\n const product = backend.runWebGLProgram(matmulProgram, inputs, 'float32');\n const out = reshape({ inputs: { x: product }, backend, attrs: { shape: convInfo.outShape } });\n intermediates.push(product);\n for (const i of intermediates) {\n backend.disposeIntermediateTensorInfo(i);\n }\n return out;\n}\n//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiQ29udjJEX2ltcGwuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi8uLi90ZmpzLWJhY2tlbmQtd2ViZ2wvc3JjL2tlcm5lbHMvQ29udjJEX2ltcGwudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUE7Ozs7Ozs7Ozs7Ozs7OztHQWVHO0FBRUgsT0FBTyxFQUEyQixJQUFJLEVBQUMsTUFBTSx1QkFBdUIsQ0FBQztBQUtyRSxPQUFPLEVBQUMsbUJBQW1CLEVBQUMsTUFBTSxzQkFBc0IsQ0FBQztBQUN6RCxPQUFPLEVBQUMsNEJBQTRCLEVBQUMsTUFBTSxvQ0FBb0MsQ0FBQztBQUNoRixPQUFPLEVBQUMsbUJBQW1CLEVBQUMsTUFBTSxzQkFBc0IsQ0FBQztBQUN6RCxPQUFPLEtBQUssVUFBVSxNQUFNLGVBQWUsQ0FBQztBQUU1QyxPQUFPLEVBQUMsZUFBZSxFQUFFLDJCQUEyQixFQUFDLE1BQU0sb0JBQW9CLENBQUM7QUFDaEYsT0FBTyxFQUFDLFFBQVEsRUFBQyxNQUFNLFlBQVksQ0FBQztBQUNwQyxPQUFPLEVBQUMsT0FBTyxFQUFDLE1BQU0sV0FBVyxDQUFDO0FBYWxDLDBFQUEwRTtBQUMxRSw0RUFBNEU7QUFDNUUsZ0RBQWdEO0FBQ2hELEVBQUU7QUFDRixzRUFBc0U7QUFDdEUsb0VBQW9FO0FBQ3BFLEVBQUU7QUFDRix1RUFBdUU7QUFDdkUsMEVBQTBFO0FBQzFFLHFFQUFxRTtBQUNyRSx3QkFBd0I7QUFDeEIsK0hBQStIO0FBQy9ILFNBQVMsc0JBQXNCLENBQzNCLEtBQWUsRUFBRSxjQUF1QjtJQUMxQyxNQUFNLE1BQU0sR0FBRyxLQUFLLENBQUMsTUFBTSxDQUFDO0lBQzVCLElBQUksTUFBTSxJQUFJLENBQUMsRUFBRTtRQUNmLE9BQU8sY0FBYyxDQUFDLENBQUM7WUFDbkI7Z0JBQ0UsR0FBRyxLQUFLLENBQUMsS0FBSyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxDQUFDLFdBQVc7Z0JBQ2pDLEtBQUss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QUFDLEtBQUssRUFBRSxjQUFjLENBQUMsQ0FBQztJQUN2RSxJQUFJLElBQUksRUFBRTtRQUNSLE1BQU0sQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLENBQUM7S0FDbkI7SUFDRCxJQUFJLHlCQUF5QixFQUFFO1FBQzdCLE1BQU0sQ0FBQyxJQUFJLENBQUMsc0JBQXNCLENBQUMsQ0FBQztLQUNyQztJQUNELElBQUksaUJBQWlCLEVBQUU7UUFDckIsTUFBTSxlQUFlLEdBQUcsT0FBTyxDQUFDLGNBQWMsQ0FDMUMsRUFBRSxFQUFFLFNBQVMsRUFDYixJQUFJLENBQUMsaUJBQWlCLENBQUMsY0FBaUMsRUFBRSxTQUFTLENBQUMsQ0FBQyxDQUFDO1FBQzFFLE1BQU0sQ0FBQyxJQUFJLENBQUMsZUFBZSxDQUFDLENBQUM7UUFDN0IsYUFBYSxDQUFDLElBQUksQ0FBQyxlQUFlLENBQUMsQ0FBQztLQUNyQztJQUNELE1BQU0sT0FBTyxHQUFHLE9BQU8sQ0FBQyxlQUFlLENBQUMsYUFBYSxFQUFFLE1BQU0sRUFBRSxTQUFTLENBQUMsQ0FBQztJQUMxRSxNQUFNLEdBQUcsR0FBRyxPQUFPLENBQ2YsRUFBQyxNQUFNLEVBQUUsRUFBQyxDQUFDLEVBQUUsT0FBTyxFQUFDLEVBQUUsT0FBTyxFQUFFLEtBQUssRUFBRSxFQUFDLEtBQUssRUFBRSxRQUFRLENBQUMsUUFBUSxFQUFDLEVBQUMsQ0FBQyxDQUFDO0lBRXhFLGFBQWEsQ0FBQyxJQUFJLENBQUMsT0FBTyxDQUFDLENBQUM7SUFDNUIsS0FBSyxNQUFNLENBQUMsSUFBSSxhQUFhLEVBQUU7UUFDN0IsT0FBTyxDQUFDLDZCQUE2QixDQUFDLENBQUMsQ0FBQyxDQUFDO0tBQzFDO0lBRUQsT0FBTyxHQUFHLENBQUM7QUFDYixDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiLyoqXG4gKiBAbGljZW5zZVxuICogQ29weXJpZ2h0IDIwMjAgR29vZ2xlIExMQy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC5cbiAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSBcIkxpY2Vuc2VcIik7XG4gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuXG4gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXRcbiAqXG4gKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjBcbiAqXG4gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlXG4gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiBcIkFTIElTXCIgQkFTSVMsXG4gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC5cbiAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmRcbiAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLlxuICogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbiAqL1xuXG5pbXBvcnQge2JhY2tlbmRfdXRpbCwgVGVuc29ySW5mbywgdXRpbH0gZnJvbSAnQHRlbnNvcmZsb3cvdGZqcy1jb3JlJztcblxuLy8gaW1wb3J0IHthc3NlcnRBbmRHZXRCcm9hZGNhc3RTaGFwZX0gZnJvbVxuLy8gJy4uLy4uLy4uL3RmanMtY29yZS9zcmMvb3BzL2Jyb2FkY2FzdF91dGlsJztcbmltcG9ydCB7TWF0aEJhY2tlbmRXZWJHTH0gZnJvbSAnLi4vYmFja2VuZF93ZWJnbCc7XG5pbXBvcnQge0ltMkNvbFBhY2tlZFByb2dyYW19IGZyb20gJy4uL2ltMmNvbF9wYWNrZWRfZ3B1JztcbmltcG9ydCB7bWFwQWN0aXZhdGlvblRvU2hhZGVyUHJvZ3JhbX0gZnJvbSAnLi4va2VybmVsX3V0aWxzL2tlcm5lbF9mdW5jc191dGlscyc7XG5pbXBvcnQge01hdE11bFBhY2tlZFByb2dyYW19IGZyb20gJy4uL211bG1hdF9wYWNrZWRfZ3B1JztcbmltcG9ydCAqIGFzIHdlYmdsX3V0aWwgZnJvbSAnLi4vd2ViZ2xfdXRpbCc7XG5cbmltcG9ydCB7YmF0Y2hNYXRNdWxJbXBsLCBNQVRNVUxfU0hBUkVEX0RJTV9USFJFU0hPTER9IGZyb20gJy4vQmF0Y2hNYXRNdWxfaW1wbCc7XG5pbXBvcnQge2lkZW50aXR5fSBmcm9tICcuL0lkZW50aXR5JztcbmltcG9ydCB7cmVzaGFwZX0gZnJvbSAnLi9SZXNoYXBlJztcblxudHlwZSBDb252MkRDb25maWcgPSB7XG4gIHg6IFRlbnNvckluZm8sXG4gIGZpbHRlcjogVGVuc29ySW5mbyxcbiAgY29udkluZm86IGJhY2tlbmRfdXRpbC5Db252MkRJbmZvLFxuICBiYWNrZW5kOiBNYXRoQmFja2VuZFdlYkdMLFxuICBiaWFzPzogVGVuc29ySW5mbyxcbiAgcHJlbHVBY3RpdmF0aW9uV2VpZ2h0cz86IFRlbnNvckluZm8sXG4gIGxlYWt5cmVsdUFscGhhPzogbnVtYmVyLFxuICBhY3RpdmF0aW9uPzogYmFja2VuZF91dGlsLkFjdGl2YXRpb25cbn07XG5cbi8vIEJvdGggY29udjJkQnlNYXRNdWwgYW5kIGNvbnYyZFdpdGhJbTJSb3cgZnVzZSBoZWlnaHQgYW5kIHdpZHRoIGludG8gb25lXG4vLyBkaW1lbnNpb24gdG8gY29tcHV0ZSBiYXRjaE1hdE11bCwgc28gYmlhcyBhbmQgYWN0aXZhdGlvbiB3ZWlnaHRzIGFyZSBhbHNvXG4vLyBzdXBwb3NlZCB0byBmdXNlIHRoZSB0d28gZGltZW5zaW9ucyBpbnRvIG9uZS5cbi8vXG4vLyBUaGlzIGZ1bmN0aW9uIGNvbXB1dGVzIHRoZSB0YXJnZXQgc2hhcGUgZm9yIGZ1c2luZyBoZWlnaHQgYW5kIHdpZHRoXG4vLyBkaW1lbnNpb25zLiBSZXR1cm5pbmcgbnVsbCBtZWFucyB0aGUgc2hhcGUgaXMgYWxyZWFkeSBjb21wYXRpYmxlLlxuLy9cbi8vIEV2ZW4gdGhvdWdoIHRoZSBiaWFzIGlzIG5vdCBzdXBwb3NlZCB0byBiZSBhIDMtRCBvciBhIDQtRCAoaW5jbHVkaW5nXG4vLyBiYXRjaCkgdGVuc29yIGFuZCBQUmVMVSBhY3RpdmlhdGlvbiB3ZWlnaHRzIGlzIG5vdCBzdXBwb3NlZCB0byBiZSBhIDQtRFxuLy8gdGVuc29yLCB3ZSBzdGlsbCBuZWVkIHRvIHN1cHBvcnQgdGhlbSwgYmVjYXVzZSB3ZSBoYXZlbid0IGRpc2FibGVkXG4vLyB0aGVtIGZvciBOSFdDIGZvcm1hdC5cbi8vIGh0dHBzOi8vZ2l0aHViLmNvbS90ZW5zb3JmbG93L3RmanMvYmxvYi9iNTNiZDQ3ZTg4MDM2N2FlNTc0OTNmMGVhNjI4YWJhZjA4ZGIyZDVkL3RmanMtY29yZS9zcmMvb3BzL2Z1c2VkL2NvbnYyZC50cyNMMTgxLUwxOTZcbmZ1bmN0aW9uIGdldFNoYXBlRm9yQmF0Y2hNYXRNdWwoXG4gICAgc2hhcGU6IG51bWJlcltdLCBpc0NoYW5uZWxzTGFzdDogYm9vbGVhbik6IG51bWJlcltdIHtcbiAgY29uc3QgbGVuZ3RoID0gc2hhcGUubGVuZ3RoO1xuICBpZiAobGVuZ3RoID49IDMpIHtcbiAgICByZXR1cm4gaXNDaGFubmVsc0xhc3QgP1xuICAgICAgICBbXG4gICAgICAgICAgLi4uc2hhcGUuc2xpY2UoMCwgLTMpIC8qIGJhdGNoICovLFxuICAgICAgICAgIHNoYXBlW2xlbmd0aCAtIDNdICogc2hhcGVbbGVuZ3RoIC0gMl0gLyogaGVpZ2h0ICogd2lkdGggKi8sXG4gICAgICAgICAgc2hhcGVbbGVuZ3RoIC0gMV0gLyogY2hhbm5lbCAqL1xuICAgICAgICBdIDpcbiAgICAgICAgW1xuICAgICAgICAgIC4uLnNoYXBlLnNsaWNlKDAsIC0zKSAvKiBiYXRjaCAqLywgc2hhcGVbbGVuZ3RoIC0gM10gLyogY2hhbm5lbCAqLyxcbiAgICAgICAgICBzaGFwZVtsZW5ndGggLSAyXSAqIHNoYXBlW2xlbmd0aCAtIDFdIC8qIGhlaWdodCAqIHdpZHRoICovXG4gICAgICAgIF07XG4gIH0gZWxzZSBpZiAoIWlzQ2hhbm5lbHNMYXN0ICYmIGxlbmd0aCA9PT0gMSAmJiBzaGFwZVswXSA+IDEpIHtcbiAgICByZXR1cm4gW3NoYXBlWzBdLCAxXTtcbiAgfSBlbHNlIHtcbiAgICByZXR1cm4gbnVsbDtcbiAgfVxufVxuXG4vLyBGb3IgMXgxIGtlcm5lbHMgdGhhdCBpdGVyYXRlIHRocm91Z2ggZXZlcnkgcG9pbnQgaW4gdGhlIGlucHV0LCBjb252b2x1dGlvblxuLy8gY2FuIGJlIGV4cHJlc3NlZCBhcyBtYXRyaXggbXVsdGlwbGljYXRpb24gKHdpdGhvdXQgbmVlZCBmb3IgbWVtb3J5XG4vLyByZW1hcHBpbmcpLlxuZXhwb3J0IGZ1bmN0aW9uIGNvbnYyZEJ5TWF0TXVsKHtcbiAgeCxcbiAgZmlsdGVyLFxuICBjb252SW5mbyxcbiAgYmFja2VuZCxcbiAgYmlhcyA9IG51bGwsXG4gIHByZWx1QWN0aXZhdGlvbldlaWdodHMgPSBudWxsLFxuICBsZWFreXJlbHVBbHBoYSA9IDAsXG4gIGFjdGl2YXRpb24gPSBudWxsXG59OiBDb252MkRDb25maWcpIHtcbiAgLy8gUmVzaGFwZXMgY29udjJEIGlucHV0IHRvIDJEIHRlbnNvcnMsIHVzZXMgbWF0TXVsIGFuZCB0aGVuIHJlc2hhcGUgdGhlXG4gIC8vIHJlc3VsdCBmcm9tIDJEIHRvIDRELlxuICBjb25zdCB4U2hhcGUgPSB4LnNoYXBlO1xuICBjb25zdCB4VGV4RGF0YSA9IGJhY2tlbmQudGV4RGF0YS5nZXQoeC5kYXRhSWQpO1xuICBjb25zdCBzaGFyZWRNYXRNdWxEaW0gPSBjb252SW5mby5pbkNoYW5uZWxzO1xuICBjb25zdCBvdXRlclNoYXBlWCA9IHhTaGFwZVswXSAqIHhTaGFwZVsxXSAqIHhTaGFwZVsyXTtcbiAgY29uc3Qgb3V0ZXJTaGFwZUZpbHRlciA9IGNvbnZJbmZvLm91dENoYW5uZWxzO1xuICBjb25zdCBpc0NoYW5uZWxzTGFzdCA9IGNvbnZJbmZvLmRhdGFGb3JtYXQgPT09ICdjaGFubmVsc0xhc3QnO1xuICBjb25zdCB0cmFuc3Bvc2VBID0gZmFsc2U7XG4gIGNvbnN0IHRyYW5zcG9zZUIgPSBmYWxzZTtcblxuICBsZXQgb3V0OiBUZW5zb3JJbmZvO1xuICBjb25zdCBpbnRlcm1lZGlhdGVzOiBUZW5zb3JJbmZvW10gPSBbXTtcblxuICBpZiAocHJlbHVBY3RpdmF0aW9uV2VpZ2h0cyAhPSBudWxsKSB7XG4gICAgY29uc3QgdGFyZ2V0U2hhcGUgPVxuICAgICAgICBnZXRTaGFwZUZvckJhdGNoTWF0TXVsKHByZWx1QWN0aXZhdGlvbldlaWdodHMuc2hhcGUsIGlzQ2hhbm5lbHNMYXN0KTtcbiAgICBpZiAodGFyZ2V0U2hhcGUgIT0gbnVsbCkge1xuICAgICAgcHJlbHVBY3RpdmF0aW9uV2VpZ2h0cyA9IHJlc2hhcGUoe1xuICAgICAgICBpbnB1dHM6IHt4OiBwcmVsdUFjdGl2YXRpb25XZWlnaHRzfSxcbiAgICAgICAgYmFja2VuZCxcbiAgICAgICAgYXR0cnM6IHtzaGFwZTogdGFyZ2V0U2hhcGV9XG4gICAgICB9KTtcbiAgICAgIGludGVybWVkaWF0ZXMucHVzaChwcmVsdUFjdGl2YXRpb25XZWlnaHRzKTtcbiAgICB9XG4gIH1cblxuICBpZiAoYmlhcyAhPSBudWxsKSB7XG4gICAgY29uc3QgdGFyZ2V0U2hhcGUgPSBnZXRTaGFwZUZvckJhdGNoTWF0TXVsKGJpYXMuc2hhcGUsIGlzQ2hhbm5lbHNMYXN0KTtcbiAgICBpZiAodGFyZ2V0U2hhcGUgIT0gbnVsbCkge1xuICAgICAgYmlhcyA9IHJlc2hhcGUoe2lucHV0czoge3g6IGJpYXN9LCBiYWNrZW5kLCBhdHRyczoge3NoYXBlOiB0YXJnZXRTaGFwZX19KTtcbiAgICAgIGludGVybWVkaWF0ZXMucHVzaChiaWFzKTtcbiAgICB9XG4gIH1cblxuICAvLyBUT0RPOiBPbmNlIHJlZHVjdGlvbiBvcHMgYXJlIHBhY2tlZCwgYmF0Y2hNYXRNdWwgd2lsbCBhbHdheXMgYmUgcGFja2VkXG4gIC8vIGFuZCB3ZSBjYW4gcmVtb3ZlIHRoaXMgY29uZGl0aW9uLlxuICBjb25zdCBiYXRjaE1hdE11bFdpbGxCZVVucGFja2VkID1cbiAgICAgIChvdXRlclNoYXBlWCA9PT0gMSB8fCBvdXRlclNoYXBlRmlsdGVyID09PSAxKSAmJlxuICAgICAgc2hhcmVkTWF0TXVsRGltID4gTUFUTVVMX1NIQVJFRF9ESU1fVEhSRVNIT0xEO1xuXG4gIC8vIFRoZSBhbGdvcml0aG0gaW4gdGhlIGlmIGNvbmRpdGlvbiBhc3N1bWVzICgxKSB0aGUgb3V0cHV0IHdpbGwgYmUgcGFja2VkLFxuICAvLyAoMikgeCBpcyBwYWNrZWQsICgzKSB4IGlzQ2hhbm5lbHNMYXN0LCAoNCkgIHgncyBwYWNrZWQgdGV4dHVyZSBpcyBhbHJlYWR5XG4gIC8vIG9uIEdQVSwgKDUpIGNvbCBpcyBvZGQsICg2KSB0aGUgd2lkdGgsIGhlaWdodCBhbmQgaW5DaGFubmVscyBhcmUgdGhlIHNhbWVcbiAgLy8gZm9yIHhUZXhEYXRhLnNoYXBlIGFuZCB4U2hhcGUuXG4gIGNvbnN0IGNhbk9wdGltaXplID0gIWJhdGNoTWF0TXVsV2lsbEJlVW5wYWNrZWQgJiYgeFRleERhdGEuaXNQYWNrZWQgJiZcbiAgICAgIGlzQ2hhbm5lbHNMYXN0ICYmIHhUZXhEYXRhLnRleHR1cmUgIT0gbnVsbCAmJiB4U2hhcGVbMl0gJSAyICE9PSAwICYmXG4gICAgICB1dGlsLmFycmF5c0VxdWFsKHhUZXhEYXRhLnNoYXBlLnNsaWNlKC0zKSwgeFNoYXBlLnNsaWNlKC0zKSk7XG5cbiAgaWYgKGNhbk9wdGltaXplKSB7XG4gICAgLy8gV2UgYXZvaWQgZXhwZW5zaXZlIHBhY2tlZCAyeDIgcmVzaGFwZSBieSBwYWRkaW5nIGNvbCBjb3VudCB0byBuZXh0LFxuICAgIC8vIGV2ZW4gbnVtYmVyLiBXaGVuIGNvbCBpcyBvZGQsIHRoZSByZXN1bHQgb2YgcGFja2VkIGJhdGNoTWF0TXVsIGlzXG4gICAgLy8gdGhlIHNhbWUgKGhhcyB0aGUgc2FtZSB0ZXh0dXJlIGxheW91dCBhbmQgYW5kIHZhbHVlcyBpbiB0aGUgdGV4dHVyZSkgYXNcbiAgICAvLyBpdCBpcyBmb3IgbmV4dCBldmVuIGNvbC4gV2UgbWFrZSB0aGUgb2RkLWNvbHMgdGVuc29yIHRvIGxvb2sgbGlrZVxuICAgIC8vIGV2ZW4tY29scyB0ZW5zb3IgYmVmb3JlIHRoZSBvcGVyYXRpb24gYW5kLCBhZnRlciB0aGUgYmF0Y2hNYXRNdWwsXG4gICAgLy8gZml4IHRoZSBldmVuLWNvbHMgcmVzdWx0IHRvIGhhdmUgb2RkIG51bWJlciBvZiBjb2xzLlxuICAgIGNvbnN0IHRhcmdldFNoYXBlID0geFNoYXBlWzBdICogeFNoYXBlWzFdICogKHhTaGFwZVsyXSArIDEpO1xuICAgIGNvbnN0IHhSZXNoYXBlZDogVGVuc29ySW5mbyA9IHtcbiAgICAgIGRhdGFJZDogeC5kYXRhSWQsXG4gICAgICBzaGFwZTogWzEsIHRhcmdldFNoYXBlLCBjb252SW5mby5pbkNoYW5uZWxzXSxcbiAgICAgIGR0eXBlOiB4LmR0eXBlXG4gICAgfTtcbiAgICAvLyB4VGV4RGF0YS5zaGFwZSBnZXRzIHJlZmVyZW5jZWQgZnJvbSBHUEdQVUJpbmFyeS5pblNoYXBlSW5mb3MuXG4gICAgLy8gRGVjcmVtZW50aW5nIGNvbCBjb3VudCwgYWZ0ZXIgYmF0Y2hNYXRNdWwtPi4uLi0+Y29tcGlsZVByb2dyYW0gbGVhZHMgdG9cbiAgICAvLyBpbnZhbGlkIGNvbCBjb3VudCB3aXRoaW4gdGhlIHJlZmVyZW5jZSBpbiBHUEdQVUJpbmFyeS5pblNoYXBlSW5mb3MuXG4gICAgLy8gQWx0ZXJuYXRpdmUgZml4IHdvdWxkIGJlIHRvIHByb3ZpZGUgYSBjb3B5IHRvIEdQR1BVQmluYXJ5LmluU2hhcGVJbmZvc1xuICAgIC8vIGluIGNvbXBpbGVQcm9ncmFtIG1ldGhvZCwgYnV0IHRoYXQgd291bGQgYWZmZWN0IGNvbXBpbGF0aW9uIG9mIGFsbFxuICAgIC8vIHByb2dyYW1zIC0gaW5zdGVhZCwgcHJvdmlkZSBhIGNvcHkgaGVyZSwgd2l0aCBldmVuIGNvbCBjb3VudCwgYmVmb3JlXG4gICAgLy8gY2FsbGluZyBiYXRjaE1hdE11bC0+Li4uLT5jb21waWxlUHJvZ3JhbSBhbmQgYWZ0ZXIgdGhhdCwgdGhlIG9yaWdpbmFsXG4gICAgLy8geFRleERhdGEuc2hhcGUgaXMgcmVzdG9yZWQuXG4gICAgY29uc3Qgb3JpZ2luYWxYVGV4RGF0YVNoYXBlID0geFRleERhdGEuc2hhcGU7XG4gICAgeFRleERhdGEuc2hhcGUgPSB4VGV4RGF0YS5zaGFwZS5zbGljZSgpO1xuICAgIHhUZXhEYXRhLnNoYXBlW3hUZXhEYXRhLnNoYXBlLmxlbmd0aCAtIDJdKys7XG4gICAgdXRpbC5hc3NlcnQoXG4gICAgICAgIHdlYmdsX3V0aWwuaXNSZXNoYXBlRnJlZSh4VGV4RGF0YS5zaGFwZSwgeFJlc2hhcGVkLnNoYXBlKSxcbiAgICAgICAgKCkgPT4gYHBhY2tlZCByZXNoYXBlICR7eFRleERhdGEuc2hhcGV9IHRvICR7XG4gICAgICAgICAgICB4UmVzaGFwZWQuc2hhcGV9IGlzbid0IGZyZWVgKTtcbiAgICBjb25zdCBmaWx0ZXJSZXNoYXBlZCA9IHJlc2hhcGUoe1xuICAgICAgaW5wdXRzOiB7eDogZmlsdGVyfSxcbiAgICAgIGJhY2tlbmQsXG4gICAgICBhdHRyczoge3NoYXBlOiBbMSwgY29udkluZm8uaW5DaGFubmVscywgY29udkluZm8ub3V0Q2hhbm5lbHNdfVxuICAgIH0pO1xuICAgIGludGVybWVkaWF0ZXMucHVzaChmaWx0ZXJSZXNoYXBlZCk7XG4gICAgY29uc3QgcG9pbnR3aXNlQ29udiA9IGJhdGNoTWF0TXVsSW1wbCh7XG4gICAgICBhOiB4UmVzaGFwZWQsXG4gICAgICBiOiBmaWx0ZXJSZXNoYXBlZCxcbiAgICAgIGJhY2tlbmQsXG4gICAgICB0cmFuc3Bvc2VBLFxuICAgICAgdHJhbnNwb3NlQixcbiAgICAgIGJpYXMsXG4gICAgICBhY3RpdmF0aW9uLFxuICAgICAgcHJlbHVBY3RpdmF0aW9uV2VpZ2h0cyxcbiAgICAgIGxlYWt5cmVsdUFscGhhXG4gICAgfSk7XG5cbiAgICBjb25zdCBwb2ludHdpc2VDb252VGV4RGF0YSA9IGJhY2tlbmQudGV4RGF0YS5nZXQocG9pbnR3aXNlQ29udi5kYXRhSWQpO1xuICAgIHV0aWwuYXNzZXJ0KFxuICAgICAgICBwb2ludHdpc2VDb252VGV4RGF0YS5pc1BhY2tlZCxcbiAgICAgICAgKCkgPT4gJ2JhdGNoTWF0TXVsIHJlc3VsdCBpcyBleHBlY3RlZCB0byBiZSBwYWNrZWQnKTtcbiAgICAvLyBSZXN0b3JlIHRoZSBpbnB1dCBzaGFwZSB0byBvcmlnaW5hbC5cbiAgICB4VGV4RGF0YS5zaGFwZSA9IG9yaWdpbmFsWFRleERhdGFTaGFwZTtcbiAgICAvLyBTZXQgdGhlIG91dHB1dCBzaGFwZSAtIHRoZXJlIGlzIG5vIG5lZWQgZm9yIGV4cGVuc2l2ZSByZXNoYXBlIGFzIGRhdGFcbiAgICAvLyBsYXlvdXQgaXMgYWxyZWFkeSBjb3JyZWN0LlxuICAgIHBvaW50d2lzZUNvbnZUZXhEYXRhLnNoYXBlID0gY29udkluZm8ub3V0U2hhcGU7XG5cbiAgICBvdXQgPSBpZGVudGl0eSh7aW5wdXRzOiB7eDogcG9pbnR3aXNlQ29udn0sIGJhY2tlbmR9KTtcbiAgICBvdXQuc2hhcGUgPSBjb252SW5mby5vdXRTaGFwZTtcblxuICAgIGludGVybWVkaWF0ZXMucHVzaChwb2ludHdpc2VDb252KTtcbiAgfSBlbHNlIHtcbiAgICBjb25zdCBudW1Db2xzID0gY29udkluZm8ub3V0SGVpZ2h0ICogY29udkluZm8ub3V0V2lkdGg7XG4gICAgY29uc3QgeFJlc2hhcGVkID0gcmVzaGFwZSh7XG4gICAgICBpbnB1dHM6IHt4fSxcbiAgICAgIGJhY2tlbmQsXG4gICAgICBhdHRyczoge1xuICAgICAgICBzaGFwZTogaXNDaGFubmVsc0xhc3QgP1xuICAgICAgICAgICAgW2NvbnZJbmZvLmJhdGNoU2l6ZSwgbnVtQ29scywgY29udkluZm8uaW5DaGFubmVsc10gOlxuICAgICAgICAgICAgW2NvbnZJbmZvLmJhdGNoU2l6ZSwgY29udkluZm8uaW5DaGFubmVscywgbnVtQ29sc11cbiAgICAgIH1cbiAgICB9KTtcbiAgICBjb25zdCBmaWx0ZXJSZXNoYXBlZCA9IHJlc2hhcGUoe1xuICAgICAgaW5wdXRzOiB7eDogZmlsdGVyfSxcbiAgICAgIGJhY2tlbmQsXG4gICAgICBhdHRyczoge3NoYXBlOiBbMSwgY29udkluZm8uaW5DaGFubmVscywgY29udkluZm8ub3V0Q2hhbm5lbHNdfVxuICAgIH0pO1xuICAgIGNvbnN0IHJlc3VsdCA9IGJhdGNoTWF0TXVsSW1wbCh7XG4gICAgICBhOiBpc0NoYW5uZWxzTGFzdCA/IHhSZXNoYXBlZCA6IGZpbHRlclJlc2hhcGVkLFxuICAgICAgYjogaXNDaGFubmVsc0xhc3QgPyBmaWx0ZXJSZXNoYXBlZCA6IHhSZXNoYXBlZCxcbiAgICAgIHRyYW5zcG9zZUE6ICFpc0NoYW5uZWxzTGFzdCxcbiAgICAgIHRyYW5zcG9zZUIsXG4gICAgICBiYWNrZW5kLFxuICAgICAgYmlhcyxcbiAgICAgIGFjdGl2YXRpb24sXG4gICAgICBwcmVsdUFjdGl2YXRpb25XZWlnaHRzLFxuICAgICAgbGVha3lyZWx1QWxwaGFcbiAgICB9KTtcblxuICAgIG91dCA9IHJlc2hhcGUoXG4gICAgICAgIHtpbnB1dHM6IHt4OiByZXN1bHR9LCBiYWNrZW5kLCBhdHRyczoge3NoYXBlOiBjb252SW5mby5vdXRTaGFwZX19KTtcblxuICAgIGludGVybWVkaWF0ZXMucHVzaCh4UmVzaGFwZWQpO1xuICAgIGludGVybWVkaWF0ZXMucHVzaChmaWx0ZXJSZXNoYXBlZCk7XG4gICAgaW50ZXJtZWRpYXRlcy5wdXNoKHJlc3VsdCk7XG4gIH1cblxuICBmb3IgKGNvbnN0IGkgb2YgaW50ZXJtZWRpYXRlcykge1xuICAgIGJhY2tlbmQuZGlzcG9zZUludGVybWVkaWF0ZVRlbnNvckluZm8oaSk7XG4gIH1cblxuICByZXR1cm4gb3V0O1xufVxuXG4vLyBJbXBsZW1lbnRzIHRoZSBpbTJyb3cgYWxnb3JpdGhtIGFzIG91dGxpbmVkIGluIFwiSGlnaCBQZXJmb3JtYW5jZVxuLy8gQ29udm9sdXRpb25hbCBOZXVyYWwgTmV0d29ya3MgZm9yIERvY3VtZW50IFByb2Nlc3NpbmdcIiAoU3V2aXNvZnQsIDIwMDYpXG5leHBvcnQgZnVuY3Rpb24gY29udjJkV2l0aEltMlJvdyh7XG4gIHgsXG4gIGZpbHRlcixcbiAgY29udkluZm8sXG4gIGJhY2tlbmQsXG4gIGJpYXMgPSBudWxsLFxuICBwcmVsdUFjdGl2YXRpb25XZWlnaHRzID0gbnVsbCxcbiAgbGVha3lyZWx1QWxwaGEgPSAwLFxuICBhY3RpdmF0aW9uID0gbnVsbFxufTogQ29udjJEQ29uZmlnKSB7XG4gIC8vIFJlYXJyYW5nZXMgY29udjJkIGlucHV0IHNvIGVhY2ggYmxvY2sgdG8gYmUgY29udm9sdmVkIG92ZXIgZm9ybXMgdGhlXG4gIC8vIGNvbHVtbiBvZiBhIG5ldyBtYXRyaXggd2l0aCBzaGFwZSBbZmlsdGVyV2lkdGggKiBmaWx0ZXJIZWlnaHQgKlxuICAvLyBpbkNoYW5uZWxzLCBvdXRIZWlnaHQgKiBvdXRXaWR0aF0uIFRoZSBmaWx0ZXIgaXMgYWxzbyByZWFycmFuZ2VkIHNvIGVhY2hcbiAgLy8gb3V0cHV0IGNoYW5uZWwgZm9ybXMgYSByb3cgb2YgYSBuZXcgbWF0cml4IHdpdGggc2hhcGUgW291dENoYW5uZWxzLFxuICAvLyBmaWx0ZXJXaWR0aCAqIGZpbHRlckhlaWdodCAqIGluQ2hhbm5lbHNdLiBUaGUgY29udm9sdXRpb24gaXMgdGhlblxuICAvLyBjb21wdXRlZCBieSBtdWx0aXBseWluZyB0aGVzZSBtYXRyaWNlcyBhbmQgcmVzaGFwaW5nIHRoZSByZXN1bHQuXG4gIGNvbnN0IHtcbiAgICBmaWx0ZXJXaWR0aCxcbiAgICBmaWx0ZXJIZWlnaHQsXG4gICAgaW5DaGFubmVscyxcbiAgICBvdXRXaWR0aCxcbiAgICBvdXRIZWlnaHQsXG4gICAgZGF0YUZvcm1hdFxuICB9ID0gY29udkluZm87XG5cbiAgY29uc3QgaXNDaGFubmVsc0xhc3QgPSBkYXRhRm9ybWF0ID09PSAnY2hhbm5lbHNMYXN0JztcblxuICBjb25zdCBzaGFyZWREaW0gPSBmaWx0ZXJXaWR0aCAqIGZpbHRlckhlaWdodCAqIGluQ2hhbm5lbHM7XG4gIGNvbnN0IG51bUNvbHMgPSBvdXRIZWlnaHQgKiBvdXRXaWR0aDtcbiAgY29uc3QgeDJDb2xTaGFwZSA9IFtjb252SW5mby5iYXRjaFNpemUsIHNoYXJlZERpbSwgbnVtQ29sc107XG4gIGNvbnN0IHRyYW5zcG9zZUEgPSB0cnVlO1xuICBjb25zdCB0cmFuc3Bvc2VCID0gZmFsc2U7XG5cbiAgY29uc3QgaW50ZXJtZWRpYXRlczogVGVuc29ySW5mb1tdID0gW107XG5cbiAgaWYgKHByZWx1QWN0aXZhdGlvbldlaWdodHMgIT0gbnVsbCkge1xuICAgIGNvbnN0IHRhcmdldFNoYXBlID1cbiAgICAgICAgZ2V0U2hhcGVGb3JCYXRjaE1hdE11bChwcmVsdUFjdGl2YXRpb25XZWlnaHRzLnNoYXBlLCBpc0NoYW5uZWxzTGFzdCk7XG4gICAgaWYgKHRhcmdldFNoYXBlICE9IG51bGwpIHtcbiAgICAgIHByZWx1QWN0aXZhdGlvbldlaWdodHMgPSByZXNoYXBlKHtcbiAgICAgICAgaW5wdXRzOiB7eDogcHJlbHVBY3RpdmF0aW9uV2VpZ2h0c30sXG4gICAgICAgIGJhY2tlbmQsXG4gICAgICAgIGF0dHJzOiB7c2hhcGU6IHRhcmdldFNoYXBlfVxuICAgICAgfSk7XG4gICAgICBpbnRlcm1lZGlhdGVzLnB1c2gocHJlbHVBY3RpdmF0aW9uV2VpZ2h0cyk7XG4gICAgfVxuICB9XG5cbiAgaWYgKGJpYXMgIT0gbnVsbCkge1xuICAgIGNvbnN0IHRhcmdldFNoYXBlID0gZ2V0U2hhcGVGb3JCYXRjaE1hdE11bChiaWFzLnNoYXBlLCBpc0NoYW5uZWxzTGFzdCk7XG4gICAgaWYgKHRhcmdldFNoYXBlICE9IG51bGwpIHtcbiAgICAgIGJpYXMgPSByZXNoYXBlKHtpbnB1dHM6IHt4OiBiaWFzfSwgYmFja2VuZCwgYXR0cnM6IHtzaGFwZTogdGFyZ2V0U2hhcGV9fSk7XG4gICAgICBpbnRlcm1lZGlhdGVzLnB1c2goYmlhcyk7XG4gICAgfVxuICB9XG5cbiAgY29uc3QgdzJSb3cgPSByZXNoYXBlKHtcbiAgICBpbnB1dHM6IHt4OiBmaWx0ZXJ9LFxuICAgIGJhY2tlbmQsXG4gICAgYXR0cnM6IHtzaGFwZTogWzEsIHNoYXJlZERpbSwgdXRpbC5zaXplRnJvbVNoYXBlKGZpbHRlci5zaGFwZSkgLyBzaGFyZWREaW1dfVxuICB9KTtcbiAgaW50ZXJtZWRpYXRlcy5wdXNoKHcyUm93KTtcblxuICBjb25zdCBpbTJDb2xQcm9ncmFtID0gbmV3IEltMkNvbFBhY2tlZFByb2dyYW0oeDJDb2xTaGFwZSwgY29udkluZm8pO1xuICBjb25zdCBjdXN0b21WYWx1ZXMgPSBbXG4gICAgeC5zaGFwZSwgW2NvbnZJbmZvLnBhZEluZm8udG9wLCBjb252SW5mby5wYWRJbmZvLmxlZnRdLFxuICAgIFtjb252SW5mby5zdHJpZGVIZWlnaHQsIGNvbnZJbmZvLnN0cmlkZVdpZHRoXSxcbiAgICBbY29udkluZm8uZGlsYXRpb25IZWlnaHQsIGNvbnZJbmZvLmRpbGF0aW9uV2lkdGhdLCBbY29udkluZm8uaW5DaGFubmVsc10sXG4gICAgW2NvbnZJbmZvLmZpbHRlcldpZHRoICogY29udkluZm8uaW5DaGFubmVsc10sIFtjb252SW5mby5vdXRXaWR0aF1cbiAgXTtcbiAgY29uc3QgaW0yQ29sID1cbiAgICAgIGJhY2tlbmQucnVuV2ViR0xQcm9ncmFtKGltMkNvbFByb2dyYW0sIFt4XSwgJ2Zsb2F0MzInLCBjdXN0b21WYWx1ZXMpO1xuICBjb25zdCBpbTJDb2xSZXNoYXBlZCA9XG4gICAgICByZXNoYXBlKHtpbnB1dHM6IHt4OiBpbTJDb2x9LCBiYWNrZW5kLCBhdHRyczoge3NoYXBlOiB4MkNvbFNoYXBlfX0pO1xuXG4gIGludGVybWVkaWF0ZXMucHVzaChpbTJDb2wpO1xuICBpbnRlcm1lZGlhdGVzLnB1c2goaW0yQ29sUmVzaGFwZWQpO1xuXG4gIGNvbnN0IGhhc0JpYXMgPSBiaWFzICE9IG51bGw7XG4gIGNvbnN0IGhhc1ByZWx1QWN0aXZhdGlvbldlaWdodHMgPSBwcmVsdUFjdGl2YXRpb25XZWlnaHRzICE9IG51bGw7XG4gIGNvbnN0IGhhc0xlYWt5cmVsdUFscGhhID0gYWN0aXZhdGlvbiA9PT0gJ2xlYWt5cmVsdSc7XG4gIGNvbnN0IGZ1c2VkQWN0aXZhdGlvbiA9XG4gICAgICBhY3RpdmF0aW9uID8gbWFwQWN0aXZhdGlvblRvU2hhZGVyUHJvZ3JhbShhY3RpdmF0aW9uLCB0cnVlKSA6IG51bGw7XG4gIGNvbnN0IG1hdG11bFByb2dyYW0gPSBuZXcgTWF0TXVsUGFja2VkUHJvZ3JhbShcbiAgICAgIGlzQ2hhbm5lbHNMYXN0ID8gaW0yQ29sUmVzaGFwZWQuc2hhcGUgYXMgW251bWJlciwgbnVtYmVyLCBudW1iZXJdIDpcbiAgICAgICAgICAgICAgICAgICAgICAgdzJSb3cuc2hhcGUgYXMgW251bWJlciwgbnVtYmVyLCBudW1iZXJdLFxuICAgICAgaXNDaGFubmVsc0xhc3QgPyB3MlJvdy5zaGFwZSBhcyBbbnVtYmVyLCBudW1iZXIsIG51bWJlcl0gOlxuICAgICAgICAgICAgICAgICAgICAgICBpbTJDb2xSZXNoYXBlZC5zaGFwZSBhcyBbbnVtYmVyLCBudW1iZXIsIG51bWJlcl0sXG4gICAgICBpc0NoYW5uZWxzTGFzdCA/IFtjb252SW5mby5iYXRjaFNpemUsIG51bUNvbHMsIGNvbnZJbmZvLm91dENoYW5uZWxzXSA6XG4gICAgICAgICAgICAgICAgICAgICAgIFtjb252SW5mby5iYXRjaFNpemUsIGNvbnZJbmZvLm91dENoYW5uZWxzLCBudW1Db2xzXSxcbiAgICAgIHRyYW5zcG9zZUEsIHRyYW5zcG9zZUIsIGhhc0JpYXMsIGZ1c2VkQWN0aXZhdGlvbixcbiAgICAgIGhhc1ByZWx1QWN0aXZhdGlvbldlaWdodHMsIGhhc0xlYWt5cmVsdUFscGhhKTtcbiAgY29uc3QgaW5wdXRzOiBUZW5zb3JJbmZvW10gPVxuICAgICAgaXNDaGFubmVsc0xhc3QgPyBbaW0yQ29sUmVzaGFwZWQsIHcyUm93XSA6IFt3MlJvdywgaW0yQ29sUmVzaGFwZWRdO1xuICBpZiAoYmlhcykge1xuICAgIGlucHV0cy5wdXNoKGJpYXMpO1xuICB9XG4gIGlmIChoYXNQcmVsdUFjdGl2YXRpb25XZWlnaHRzKSB7XG4gICAgaW5wdXRzLnB1c2gocHJlbHVBY3RpdmF0aW9uV2VpZ2h0cyk7XG4gIH1cbiAgaWYgKGhhc0xlYWt5cmVsdUFscGhhKSB7XG4gICAgY29uc3QgJGxlYWt5cmVsdUFscGhhID0gYmFja2VuZC5tYWtlVGVuc29ySW5mbyhcbiAgICAgICAgW10sICdmbG9hdDMyJyxcbiAgICAgICAgdXRpbC5jcmVhdGVTY2FsYXJWYWx1ZShsZWFreXJlbHVBbHBoYSBhcyB7fSBhcyAnZmxvYXQzMicsICdmbG9hdDMyJykpO1xuICAgIGlucHV0cy5wdXNoKCRsZWFreXJlbHVBbHBoYSk7XG4gICAgaW50ZXJtZWRpYXRlcy5wdXNoKCRsZWFreXJlbHVBbHBoYSk7XG4gIH1cbiAgY29uc3QgcHJvZHVjdCA9IGJhY2tlbmQucnVuV2ViR0xQcm9ncmFtKG1hdG11bFByb2dyYW0sIGlucHV0cywgJ2Zsb2F0MzInKTtcbiAgY29uc3Qgb3V0ID0gcmVzaGFwZShcbiAgICAgIHtpbnB1dHM6IHt4OiBwcm9kdWN0fSwgYmFja2VuZCwgYXR0cnM6IHtzaGFwZTogY29udkluZm8ub3V0U2hhcGV9fSk7XG5cbiAgaW50ZXJtZWRpYXRlcy5wdXNoKHByb2R1Y3QpO1xuICBmb3IgKGNvbnN0IGkgb2YgaW50ZXJtZWRpYXRlcykge1xuICAgIGJhY2tlbmQuZGlzcG9zZUludGVybWVkaWF0ZVRlbnNvckluZm8oaSk7XG4gIH1cblxuICByZXR1cm4gb3V0O1xufVxuIl19","/**\n * @license\n * Copyright 2020 Google LLC. All Rights Reserved.\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n * =============================================================================\n */\nimport { backend_util, Conv2D, env } from '@tensorflow/tfjs-core';\nimport { Conv2DProgram } from '../conv_gpu';\nimport { Conv2DPackedProgram } from '../conv_packed_gpu';\nimport { conv2dByMatMul, conv2dWithIm2Row } from './Conv2D_impl';\nimport { reshape } from './Reshape';\nexport function conv2d(args) {\n const { inputs, backend, attrs } = args;\n const { x, filter } = inputs;\n const { strides, pad, dataFormat, dilations, dimRoundingMode } = attrs;\n const $dataFormat = backend_util.convertConv2DDataFormat(dataFormat);\n const convInfo = backend_util.computeConv2DInfo(x.shape, filter.shape, strides, dilations, pad, dimRoundingMode, false /* depthwise */, $dataFormat);\n let out;\n if (convInfo.filterHeight === 1 && convInfo.filterWidth === 1 &&\n convInfo.dilationHeight === 1 && convInfo.dilationWidth === 1 &&\n convInfo.strideHeight === 1 && convInfo.strideWidth === 1 &&\n (convInfo.padInfo.type === 'SAME' || convInfo.padInfo.type === 'VALID')) {\n out = conv2dByMatMul({ x, filter, convInfo, backend });\n }\n else if (convInfo.strideWidth <= 2 && $dataFormat === 'channelsLast'\n && env().getBool('WEBGL_EXP_CONV')) {\n const program = new Conv2DPackedProgram(convInfo);\n const customValues = [\n [convInfo.padInfo.top, convInfo.padInfo.left],\n [convInfo.strideHeight, convInfo.strideWidth],\n [convInfo.dilationHeight, convInfo.dilationWidth],\n [convInfo.inHeight, convInfo.inWidth]\n ];\n out =\n backend.runWebGLProgram(program, [x, filter], 'float32', customValues);\n }\n else if (env().getBool('WEBGL_CONV_IM2COL')) {\n out = conv2dWithIm2Row({ x, filter, convInfo, backend });\n }\n else {\n const program = new Conv2DProgram(convInfo);\n out = backend.runWebGLProgram(program, [x, filter], 'float32');\n }\n const outReshaped = reshape({ inputs: { x: out }, backend, attrs: { shape: convInfo.outShape } });\n backend.disposeIntermediateTensorInfo(out);\n return outReshaped;\n}\nexport const conv2DConfig = {\n kernelName: Conv2D,\n backendName: 'webgl',\n kernelFunc: conv2d,\n};\n//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiQ29udjJELmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vLi4vdGZqcy1iYWNrZW5kLXdlYmdsL3NyYy9rZXJuZWxzL0NvbnYyRC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQTs7Ozs7Ozs7Ozs7Ozs7O0dBZUc7QUFFSCxPQUFPLEVBQUMsWUFBWSxFQUFFLE1BQU0sRUFBNkIsR0FBRyxFQUF1QyxNQUFNLHVCQUF1QixDQUFDO0FBR2pJLE9BQU8sRUFBQyxhQUFhLEVBQUMsTUFBTSxhQUFhLENBQUM7QUFDMUMsT0FBTyxFQUFDLG1CQUFtQixFQUFDLE1BQU0sb0JBQW9CLENBQUM7QUFDdkQsT0FBTyxFQUFDLGNBQWMsRUFBRSxnQkFBZ0IsRUFBQyxNQUFNLGVBQWUsQ0FBQztBQUMvRCxPQUFPLEVBQUMsT0FBTyxFQUFDLE1BQU0sV0FBVyxDQUFDO0FBRWxDLE1BQU0sVUFBVSxNQUFNLENBQ2xCLElBQ3lFO0lBQzNFLE1BQU0sRUFBQyxNQUFNLEVBQUUsT0FBTyxFQUFFLEtBQUssRUFBQyxHQUFHLElBQUksQ0FBQztJQUN0QyxNQUFNLEVBQUMsQ0FBQyxFQUFFLE1BQU0sRUFBQyxHQUFHLE1BQU0sQ0FBQztJQUMzQixNQUFNLEVBQUMsT0FBTyxFQUFFLEdBQUcsRUFBRSxVQUFVLEVBQUUsU0FBUyxFQUFFLGVBQWUsRUFBQyxHQUFHLEtBQUssQ0FBQztJQUVyRSxNQUFNLFdBQVcsR0FBRyxZQUFZLENBQUMsdUJBQXVCLENBQUMsVUFBVSxDQUFDLENBQUM7SUFDckUsTUFBTSxRQUFRLEdBQUcsWUFBWSxDQUFDLGlCQUFpQixDQUMzQyxDQUFDLENBQUMsS0FBeUMsRUFDM0MsTUFBTSxDQUFDLEtBQXlDLEVBQUUsT0FBTyxFQUFFLFNBQVMsRUFBRSxHQUFHLEVBQ3pFLGVBQWUsRUFBRSxLQUFLLENBQUMsZUFBZSxFQUFFLFdBQVcsQ0FBQyxDQUFDO0lBQ3pELElBQUksR0FBZSxDQUFDO0lBRXBCLElBQUksUUFBUSxDQUFDLFlBQVksS0FBSyxDQUFDLElBQUksUUFBUSxDQUFDLFdBQVcsS0FBSyxDQUFDO1FBQ3pELFFBQVEsQ0FBQyxjQUFjLEtBQUssQ0FBQyxJQUFJLFFBQVEsQ0FBQyxhQUFhLEtBQUssQ0FBQztRQUM3RCxRQUFRLENBQUMsWUFBWSxLQUFLLENBQUMsSUFBSSxRQUFRLENBQUMsV0FBVyxLQUFLLENBQUM7UUFDekQsQ0FBQyxRQUFRLENBQUMsT0FBTyxDQUFDLElBQUksS0FBSyxNQUFNLElBQUksUUFBUSxDQUFDLE9BQU8sQ0FBQyxJQUFJLEtBQUssT0FBTyxDQUFDLEVBQUU7UUFDM0UsR0FBRyxHQUFHLGNBQWMsQ0FBQyxFQUFDLENBQUMsRUFBRSxNQUFNLEVBQUUsUUFBUSxFQUFFLE9BQU8sRUFBQyxDQUFDLENBQUM7S0FDdEQ7U0FBTSxJQUFJLFFBQVEsQ0FBQyxXQUFXLElBQUksQ0FBQyxJQUFJLFdBQVcsS0FBSyxjQUFjO1dBQ2pFLEdBQUcsRUFBRSxDQUFDLE9BQU8sQ0FBQyxnQkFBZ0IsQ0FBQyxFQUNoQztRQUNGLE1BQU0sT0FBTyxHQUFHLElBQUksbUJBQW1CLENBQUMsUUFBUSxDQUFDLENBQUM7UUFDbEQsTUFBTSxZQUFZLEdBQUc7WUFDbkIsQ0FBQyxRQUFRLENBQUMsT0FBTyxDQUFDLEdBQUcsRUFBRSxRQUFRLENBQUMsT0FBTyxDQUFDLElBQUksQ0FBQztZQUM3QyxDQUFDLFFBQVEsQ0FBQyxZQUFZLEVBQUUsUUFBUSxDQUFDLFdBQVcsQ0FBQztZQUM3QyxDQUFDLFFBQVEsQ0FBQyxjQUFjLEVBQUUsUUFBUSxDQUFDLGFBQWEsQ0FBQztZQUNqRCxDQUFDLFFBQVEsQ0FBQyxRQUFRLEVBQUUsUUFBUSxDQUFDLE9BQU8sQ0FBQztTQUN0QyxDQUFDO1FBQ0YsR0FBRztZQUNDLE9BQU8sQ0FBQyxlQUFlLENBQUMsT0FBTyxFQUFFLENBQUMsQ0FBQyxFQUFFLE1BQU0sQ0FBQyxFQUFFLFNBQVMsRUFBRSxZQUFZLENBQUMsQ0FBQztLQUM1RTtTQUFNLElBQUksR0FBRyxFQUFFLENBQUMsT0FBTyxDQUFDLG1CQUFtQixDQUFDLEVBQUU7UUFDN0MsR0FBRyxHQUFHLGdCQUFnQixDQUFDLEVBQUMsQ0FBQyxFQUFFLE1BQU0sRUFBRSxRQUFRLEVBQUUsT0FBTyxFQUFDLENBQUMsQ0FBQztLQUN4RDtTQUFNO1FBQ0wsTUFBTSxPQUFPLEdBQUcsSUFBSSxhQUFhLENBQUMsUUFBUSxDQUFDLENBQUM7UUFDNUMsR0FBRyxHQUFHLE9BQU8sQ0FBQyxlQUFlLENBQUMsT0FBTyxFQUFFLENBQUMsQ0FBQyxFQUFFLE1BQU0sQ0FBQyxFQUFFLFNBQVMsQ0FBQyxDQUFDO0tBQ2hFO0lBRUQsTUFBTSxXQUFXLEdBQ2IsT0FBTyxDQUFDLEVBQUMsTUFBTSxFQUFFLEVBQUMsQ0FBQyxFQUFFLEdBQUcsRUFBQyxFQUFFLE9BQU8sRUFBRSxLQUFLLEVBQUUsRUFBQyxLQUFLLEVBQUUsUUFBUSxDQUFDLFFBQVEsRUFBQyxFQUFDLENBQUMsQ0FBQztJQUM1RSxPQUFPLENBQUMsNkJBQTZCLENBQUMsR0FBRyxDQUFDLENBQUM7SUFFM0MsT0FBTyxXQUFXLENBQUM7QUFDckIsQ0FBQztBQUVELE1BQU0sQ0FBQyxNQUFNLFlBQVksR0FBaUI7SUFDeEMsVUFBVSxFQUFFLE1BQU07SUFDbEIsV0FBVyxFQUFFLE9BQU87SUFDcEIsVUFBVSxFQUFFLE1BQTBCO0NBQ3ZDLENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyIvKipcbiAqIEBsaWNlbnNlXG4gKiBDb3B5cmlnaHQgMjAyMCBHb29nbGUgTExDLiBBbGwgUmlnaHRzIFJlc2VydmVkLlxuICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlIFwiTGljZW5zZVwiKTtcbiAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS5cbiAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdFxuICpcbiAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMFxuICpcbiAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmVcbiAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuIFwiQVMgSVNcIiBCQVNJUyxcbiAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLlxuICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZFxuICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuXG4gKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuICovXG5cbmltcG9ydCB7YmFja2VuZF91dGlsLCBDb252MkQsIENvbnYyREF0dHJzLCBDb252MkRJbnB1dHMsIGVudiwgS2VybmVsQ29uZmlnLCBLZXJuZWxGdW5jLCBUZW5zb3JJbmZvfSBmcm9tICdAdGVuc29yZmxvdy90ZmpzLWNvcmUnO1xuXG5pbXBvcnQge01hdGhCYWNrZW5kV2ViR0x9IGZyb20gJy4uL2JhY2tlbmRfd2ViZ2wnO1xuaW1wb3J0IHtDb252MkRQcm9ncmFtfSBmcm9tICcuLi9jb252X2dwdSc7XG5pbXBvcnQge0NvbnYyRFBhY2tlZFByb2dyYW19IGZyb20gJy4uL2NvbnZfcGFja2VkX2dwdSc7XG5pbXBvcnQge2NvbnYyZEJ5TWF0TXVsLCBjb252MmRXaXRoSW0yUm93fSBmcm9tICcuL0NvbnYyRF9pbXBsJztcbmltcG9ydCB7cmVzaGFwZX0gZnJvbSAnLi9SZXNoYXBlJztcblxuZXhwb3J0IGZ1bmN0aW9uIGNvbnYyZChcbiAgICBhcmdzOlxuICAgICAgICB7aW5wdXRzOiBDb252MkRJbnB1dHMsIGF0dHJzOiBDb252MkRBdHRycywgYmFja2VuZDogTWF0aEJhY2tlbmRXZWJHTH0pIHtcbiAgY29uc3Qge2lucHV0cywgYmFja2VuZCwgYXR0cnN9ID0gYXJncztcbiAgY29uc3Qge3gsIGZpbHRlcn0gPSBpbnB1dHM7XG4gIGNvbnN0IHtzdHJpZGVzLCBwYWQsIGRhdGFGb3JtYXQsIGRpbGF0aW9ucywgZGltUm91bmRpbmdNb2RlfSA9IGF0dHJzO1xuXG4gIGNvbnN0ICRkYXRhRm9ybWF0ID0gYmFja2VuZF91dGlsLmNvbnZlcnRDb252MkREYXRhRm9ybWF0KGRhdGFGb3JtYXQpO1xuICBjb25zdCBjb252SW5mbyA9IGJhY2tlbmRfdXRpbC5jb21wdXRlQ29udjJESW5mbyhcbiAgICAgIHguc2hhcGUgYXMgW251bWJlciwgbnVtYmVyLCBudW1iZXIsIG51bWJlcl0sXG4gICAgICBmaWx0ZXIuc2hhcGUgYXMgW251bWJlciwgbnVtYmVyLCBudW1iZXIsIG51bWJlcl0sIHN0cmlkZXMsIGRpbGF0aW9ucywgcGFkLFxuICAgICAgZGltUm91bmRpbmdNb2RlLCBmYWxzZSAvKiBkZXB0aHdpc2UgKi8sICRkYXRhRm9ybWF0KTtcbiAgbGV0IG91dDogVGVuc29ySW5mbztcblxuICBpZiAoY29udkluZm8uZmlsdGVySGVpZ2h0ID09PSAxICYmIGNvbnZJbmZvLmZpbHRlcldpZHRoID09PSAxICYmXG4gICAgICBjb252SW5mby5kaWxhdGlvbkhlaWdodCA9PT0gMSAmJiBjb252SW5mby5kaWxhdGlvbldpZHRoID09PSAxICYmXG4gICAgICBjb252SW5mby5zdHJpZGVIZWlnaHQgPT09IDEgJiYgY29udkluZm8uc3RyaWRlV2lkdGggPT09IDEgJiZcbiAgICAgIChjb252SW5mby5wYWRJbmZvLnR5cGUgPT09ICdTQU1FJyB8fCBjb252SW5mby5wYWRJbmZvLnR5cGUgPT09ICdWQUxJRCcpKSB7XG4gICAgb3V0ID0gY29udjJkQnlNYXRNdWwoe3gsIGZpbHRlciwgY29udkluZm8sIGJhY2tlbmR9KTtcbiAgfSBlbHNlIGlmIChjb252SW5mby5zdHJpZGVXaWR0aCA8PSAyICYmICRkYXRhRm9ybWF0ID09PSAnY2hhbm5lbHNMYXN0J1xuICAgICYmIGVudigpLmdldEJvb2woJ1dFQkdMX0VYUF9DT05WJylcbiAgICApIHtcbiAgICBjb25zdCBwcm9ncmFtID0gbmV3IENvbnYyRFBhY2tlZFByb2dyYW0oY29udkluZm8pO1xuICAgIGNvbnN0IGN1c3RvbVZhbHVlcyA9IFtcbiAgICAgIFtjb252SW5mby5wYWRJbmZvLnRvcCwgY29udkluZm8ucGFkSW5mby5sZWZ0XSxcbiAgICAgIFtjb252SW5mby5zdHJpZGVIZWlnaHQsIGNvbnZJbmZvLnN0cmlkZVdpZHRoXSxcbiAgICAgIFtjb252SW5mby5kaWxhdGlvbkhlaWdodCwgY29udkluZm8uZGlsYXRpb25XaWR0aF0sXG4gICAgICBbY29udkluZm8uaW5IZWlnaHQsIGNvbnZJbmZvLmluV2lkdGhdXG4gICAgXTtcbiAgICBvdXQgPVxuICAgICAgICBiYWNrZW5kLnJ1bldlYkdMUHJvZ3JhbShwcm9ncmFtLCBbeCwgZmlsdGVyXSwgJ2Zsb2F0MzInLCBjdXN0b21WYWx1ZXMpO1xuICB9IGVsc2UgaWYgKGVudigpLmdldEJvb2woJ1dFQkdMX0NPTlZfSU0yQ09MJykpIHtcbiAgICBvdXQgPSBjb252MmRXaXRoSW0yUm93KHt4LCBmaWx0ZXIsIGNvbnZJbmZvLCBiYWNrZW5kfSk7XG4gIH0gZWxzZSB7XG4gICAgY29uc3QgcHJvZ3JhbSA9IG5ldyBDb252MkRQcm9ncmFtKGNvbnZJbmZvKTtcbiAgICBvdXQgPSBiYWNrZW5kLnJ1bldlYkdMUHJvZ3JhbShwcm9ncmFtLCBbeCwgZmlsdGVyXSwgJ2Zsb2F0MzInKTtcbiAgfVxuXG4gIGNvbnN0IG91dFJlc2hhcGVkID1cbiAgICAgIHJlc2hhcGUoe2lucHV0czoge3g6IG91dH0sIGJhY2tlbmQsIGF0dHJzOiB7c2hhcGU6IGNvbnZJbmZvLm91dFNoYXBlfX0pO1xuICBiYWNrZW5kLmRpc3Bvc2VJbnRlcm1lZGlhdGVUZW5zb3JJbmZvKG91dCk7XG5cbiAgcmV0dXJuIG91dFJlc2hhcGVkO1xufVxuXG5leHBvcnQgY29uc3QgY29udjJEQ29uZmlnOiBLZXJuZWxDb25maWcgPSB7XG4gIGtlcm5lbE5hbWU6IENvbnYyRCxcbiAgYmFja2VuZE5hbWU6ICd3ZWJnbCcsXG4gIGtlcm5lbEZ1bmM6IGNvbnYyZCBhcyB7fSBhcyBLZXJuZWxGdW5jLFxufTtcbiJdfQ==","/**\n * @license\n * Copyright 2017 Google LLC. All Rights Reserved.\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n * =============================================================================\n */\nexport class Conv2DDerFilterProgram {\n constructor(convInfo) {\n this.variableNames = ['x', 'dy'];\n this.outputShape = convInfo.filterShape;\n const strideHeight = convInfo.strideHeight;\n const strideWidth = convInfo.strideWidth;\n const padTop = convInfo.padInfo.top;\n const padLeft = convInfo.padInfo.left;\n const isChannelsLast = convInfo.dataFormat === 'channelsLast';\n this.userCode = `\n void main() {\n ivec4 coords = getOutputCoords();\n int wR = coords.x;\n int wC = coords.y;\n int d1 = coords.z;\n int d2 = coords.w;\n\n // Convolve x(?, ?, d1) with dy(:, :, d2) to get dw(wR, wC, d1, d2).\n // ? = to be determined. : = across all values in that axis.\n float dotProd = 0.0;\n\n for (int b = 0; b < ${convInfo.batchSize}; b++) {\n for (int yR = 0; yR < ${convInfo.outHeight}; yR++) {\n int xR = wR + yR * ${strideHeight} - ${padTop};\n\n if (xR < 0 || xR >= ${convInfo.inHeight}) {\n continue;\n }\n\n for (int yC = 0; yC < ${convInfo.outWidth}; yC++) {\n int xC = wC + yC * ${strideWidth} - ${padLeft};\n\n if (xC < 0 || xC >= ${convInfo.inWidth}) {\n continue;\n }\n\n if (${isChannelsLast}) {\n float dyValue = getDy(b, yR, yC, d2);\n float xValue = getX(b, xR, xC, d1);\n dotProd += (xValue * dyValue);\n } else {\n float dyValue = getDy(b, d2, yR, yC);\n float xValue = getX(b, d1, xR, xC);\n dotProd += (xValue * dyValue);\n }\n\n }\n }\n }\n setOutput(dotProd);\n }\n `;\n }\n}\nexport class Conv2DDerInputProgram {\n constructor(convInfo) {\n this.variableNames = ['dy', 'W'];\n this.outputShape = convInfo.inShape;\n const filterHeight = convInfo.filterHeight;\n const filterWidth = convInfo.filterWidth;\n const strideHeight = convInfo.strideHeight;\n const strideWidth = convInfo.strideWidth;\n const isChannelsLast = convInfo.dataFormat === 'channelsLast';\n const padTop = filterHeight - 1 - convInfo.padInfo.top;\n const padLeft = filterWidth - 1 - convInfo.padInfo.left;\n const rowDim = isChannelsLast ? 1 : 2;\n const colDim = isChannelsLast ? 2 : 3;\n const channelDim = isChannelsLast ? 3 : 1;\n this.userCode = `\n const ivec2 pads = ivec2(${padTop}, ${padLeft});\n\n void main() {\n ivec4 coords = getOutputCoords();\n int batch = coords[0];\n int d1 = coords[${channelDim}];\n\n ivec2 dyCorner = ivec2(coords[${rowDim}], coords[${colDim}]) - pads;\n int dyRCorner = dyCorner.x;\n int dyCCorner = dyCorner.y;\n\n // Convolve dy(?, ?, d2) with w(:, :, d1, d2) to compute dx(xR, xC, d1).\n // ? = to be determined. : = across all values in that axis.\n float dotProd = 0.0;\n for (int wR = 0; wR < ${filterHeight}; wR++) {\n float dyR = float(dyRCorner + wR) / ${strideHeight}.0;\n\n if (dyR < 0.0 || dyR >= ${convInfo.outHeight}.0 || fract(dyR) > 0.0) {\n continue;\n }\n int idyR = int(dyR);\n\n int wRPerm = ${filterHeight} - 1 - wR;\n\n for (int wC = 0; wC < ${filterWidth}; wC++) {\n float dyC = float(dyCCorner + wC) / ${strideWidth}.0;\n\n if (dyC < 0.0 || dyC >= ${convInfo.outWidth}.0 ||\n fract(dyC) > 0.0) {\n continue;\n }\n int idyC = int(dyC);\n\n int wCPerm = ${filterWidth} - 1 - wC;\n\n for (int d2 = 0; d2 < ${convInfo.outChannels}; d2++) {\n\n if (${isChannelsLast}) {\n float xValue = getDy(batch, idyR, idyC, d2);\n float wValue = getW(wRPerm, wCPerm, d1, d2);\n dotProd += xValue * wValue;\n } else {\n float xValue = getDy(batch, d2, idyR, idyC);\n float wValue = getW(wRPerm, wCPerm, d1, d2);\n dotProd += xValue * wValue;\n }\n\n }\n }\n }\n setOutput(dotProd);\n }\n `;\n }\n}\nexport class Conv3DDerFilterProgram {\n constructor(convInfo) {\n this.variableNames = ['x', 'dy'];\n this.outputShape = convInfo.filterShape;\n const strideDepth = convInfo.strideDepth;\n const strideHeight = convInfo.strideHeight;\n const strideWidth = convInfo.strideWidth;\n const padFront = convInfo.padInfo.front;\n const padTop = convInfo.padInfo.top;\n const padLeft = convInfo.padInfo.left;\n this.userCode = `\n void main() {\n ivec5 coords = getOutputCoords();\n int wF = coords.x;\n int wR = coords.y;\n int wC = coords.z;\n int d1 = coords.w;\n int d2 = coords.u;\n\n float dotProd = 0.0;\n\n for (int b = 0; b < ${convInfo.batchSize}; b++) {\n for (int yF = 0; yF < ${convInfo.outDepth}; yF++) {\n int xF = wF + yF * ${strideDepth} - ${padFront};\n\n if (xF < 0 || xF >= ${convInfo.inDepth}) {\n continue;\n }\n\n for (int yR = 0; yR < ${convInfo.outHeight}; yR++) {\n int xR = wR + yR * ${strideHeight} - ${padTop};\n\n if (xR < 0 || xR >= ${convInfo.inHeight}) {\n continue;\n }\n\n for (int yC = 0; yC < ${convInfo.outWidth}; yC++) {\n int xC = wC + yC * ${strideWidth} - ${padLeft};\n\n if (xC < 0 || xC >= ${convInfo.inWidth}) {\n continue;\n }\n\n float dyValue = getDy(b, yF, yR, yC, d2);\n float xValue = getX(b, xF, xR, xC, d1);\n dotProd += (xValue * dyValue);\n }\n }\n }\n }\n setOutput(dotProd);\n }\n `;\n }\n}\nexport class Conv3DDerInputProgram {\n constructor(convInfo) {\n this.variableNames = ['dy', 'W'];\n this.outputShape = convInfo.inShape;\n const filterDepth = convInfo.filterDepth;\n const filterHeight = convInfo.filterHeight;\n const filterWidth = convInfo.filterWidth;\n const strideDepth = convInfo.strideDepth;\n const strideHeight = convInfo.strideHeight;\n const strideWidth = convInfo.strideWidth;\n const padFront = filterDepth - 1 - convInfo.padInfo.front;\n const padTop = filterHeight - 1 - convInfo.padInfo.top;\n const padLeft = filterWidth - 1 - convInfo.padInfo.left;\n this.userCode = `\n const ivec3 pads = ivec3(${padFront}, ${padTop}, ${padLeft});\n\n void main() {\n ivec5 coords = getOutputCoords();\n int batch = coords.x;\n int d1 = coords.u;\n\n\n ivec3 dyCorner = ivec3(coords.y, coords.z, coords.w) - pads;\n int dyFCorner = dyCorner.x;\n int dyRCorner = dyCorner.y;\n int dyCCorner = dyCorner.z;\n\n float dotProd = 0.0;\n for (int wF = 0; wF < ${filterDepth}; wF++) {\n float dyF = float(dyFCorner + wF) / ${strideDepth}.0;\n\n if (dyF < 0.0 || dyF >= ${convInfo.outDepth}.0 || fract(dyF) > 0.0) {\n continue;\n }\n int idyF = int(dyF);\n\n int wFPerm = ${filterDepth} - 1 - wF;\n\n for (int wR = 0; wR < ${filterHeight}; wR++) {\n float dyR = float(dyRCorner + wR) / ${strideHeight}.0;\n\n if (dyR < 0.0 || dyR >= ${convInfo.outHeight}.0 ||\n fract(dyR) > 0.0) {\n continue;\n }\n int idyR = int(dyR);\n\n int wRPerm = ${filterHeight} - 1 - wR;\n\n for (int wC = 0; wC < ${filterWidth}; wC++) {\n float dyC = float(dyCCorner + wC) / ${strideWidth}.0;\n\n if (dyC < 0.0 || dyC >= ${convInfo.outWidth}.0 ||\n fract(dyC) > 0.0) {\n continue;\n }\n int idyC = int(dyC);\n\n int wCPerm = ${filterWidth} - 1 - wC;\n\n for (int d2 = 0; d2 < ${convInfo.outChannels}; d2++) {\n float xValue = getDy(batch, idyF, idyR, idyC, d2);\n float wValue = getW(wFPerm, wRPerm, wCPerm, d1, d2);\n dotProd += xValue * wValue;\n }\n }\n }\n }\n setOutput(dotProd);\n }\n `;\n }\n}\n//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY29udl9iYWNrcHJvcF9ncHUuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi90ZmpzLWJhY2tlbmQtd2ViZ2wvc3JjL2NvbnZfYmFja3Byb3BfZ3B1LnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBOzs7Ozs7Ozs7Ozs7Ozs7R0FlRztBQUtILE1BQU0sT0FBTyxzQkFBc0I7SUFLakMsWUFBWSxRQUFpQztRQUo3QyxrQkFBYSxHQUFHLENBQUMsR0FBRyxFQUFFLElBQUksQ0FBQyxDQUFDO1FBSzFCLElBQUksQ0FBQyxXQUFXLEdBQUcsUUFBUSxDQUFDLFdBQVcsQ0FBQztRQUV4QyxNQUFNLFlBQVksR0FBRyxRQUFRLENBQUMsWUFBWSxDQUFDO1FBQzNDLE1BQU0sV0FBVyxHQUFHLFFBQVEsQ0FBQyxXQUFXLENBQUM7UUFDekMsTUFBTSxNQUFNLEdBQUcsUUFBUSxDQUFDLE9BQU8sQ0FBQyxHQUFHLENBQUM7UUFDcEMsTUFBTSxPQUFPLEdBQUcsUUFBUSxDQUFDLE9BQU8sQ0FBQyxJQUFJLENBQUM7UUFDdEMsTUFBTSxjQUFjLEdBQUcsUUFBUSxDQUFDLFVBQVUsS0FBSyxjQUFjLENBQUM7UUFFOUQsSUFBSSxDQUFDLFFBQVEsR0FBRzs7Ozs7Ozs7Ozs7OzhCQVlVLFFBQVEsQ0FBQyxTQUFTO2tDQUNkLFFBQVEsQ0FBQyxTQUFTO2lDQUNuQixZQUFZLE1BQU0sTUFBTTs7a0NBRXZCLFFBQVEsQ0FBQyxRQUFROzs7O29DQUlmLFFBQVEsQ0FBQyxRQUFRO21DQUNsQixXQUFXLE1BQU0sT0FBTzs7b0NBRXZCLFFBQVEsQ0FBQyxPQUFPOzs7O29CQUloQyxjQUFjOzs7Ozs7Ozs7Ozs7Ozs7S0FlN0IsQ0FBQztJQUNKLENBQUM7Q0FDRjtBQUVELE1BQU0sT0FBTyxxQkFBcUI7SUFLaEMsWUFBWSxRQUFpQztRQUo3QyxrQkFBYSxHQUFHLENBQUMsSUFBSSxFQUFFLEdBQUcsQ0FBQyxDQUFDO1FBSzFCLElBQUksQ0FBQyxXQUFX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QVksQ0FBQztRQUMzQyxNQUFNLFdBQVcsR0FBRyxRQUFRLENBQUMsV0FBVyxDQUFDO1FBQ3pDLE1BQU0sV0FBVyxHQUFHLFFBQVEsQ0FBQyxXQUFXLENBQUM7UUFDekMsTUFBTSxZQUFZLEdBQUcsUUFBUSxDQUFDLFlBQVksQ0FBQztRQUMzQyxNQUFNLFdBQVcsR0FBRyxRQUFRLENBQUMsV0FBVyxDQUFDO1FBRXpDLE1BQU0sUUFBUSxHQUFHLFdBQVcsR0FBRyxDQUFDLEdBQUcsUUFBUSxDQUFDLE9BQU8sQ0FBQyxLQUFLLENBQUM7UUFDMUQsTUFBTSxNQUFNLEdBQUcsWUFBWSxHQUFHLENBQUMsR0FBRyxRQUFRLENBQUMsT0FBTyxDQUFDLEdBQUcsQ0FBQztRQUN2RCxNQUFNLE9BQU8sR0FBRyxXQUFXLEdBQUcsQ0FBQyxHQUFHLFFBQVEsQ0FBQyxPQUFPLENBQUMsSUFBSSxDQUFDO1FBRXhELElBQUksQ0FBQyxRQUFRLEdBQUc7aUNBQ2EsUUFBUSxLQUFLLE1BQU0sS0FBSyxPQUFPOzs7Ozs7Ozs7Ozs7OztnQ0FjaEMsV0FBVztnREFDSyxXQUFXOztvQ0FFdkIsUUFBUSxDQUFDLFFBQVE7Ozs7O3lCQUs1QixXQUFXOztrQ0FFRixZQUFZO2tEQUNJLFlBQVk7O3NDQUV4QixRQUFRLENBQUMsU0FBUzs7Ozs7OzJCQU03QixZQUFZOztvQ0FFSCxXQUFXO29EQUNLLFdBQVc7O3dDQUV2QixRQUFRLENBQUMsUUFBUTs7Ozs7OzZCQU01QixXQUFXOztzQ0FFRixRQUFRLENBQUMsV0FBVzs7Ozs7Ozs7OztLQVVyRCxDQUFDO0lBQ0osQ0FBQztDQUNGIiwic291cmNlc0NvbnRlbnQiOlsiLyoqXG4gKiBAbGljZW5zZVxuICogQ29weXJpZ2h0IDIwMTcgR29vZ2xlIExMQy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC5cbiAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSBcIkxpY2Vuc2VcIik7XG4gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuXG4gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXRcbiAqXG4gKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjBcbiAqXG4gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlXG4gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiBcIkFTIElTXCIgQkFTSVMsXG4gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC5cbiAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmRcbiAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLlxuICogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbiAqL1xuXG5pbXBvcnQge2JhY2tlbmRfdXRpbH0gZnJvbSAnQHRlbnNvcmZsb3cvdGZqcy1jb3JlJztcbmltcG9ydCB7R1BHUFVQcm9ncmFtfSBmcm9tICcuL2dwZ3B1X21hdGgnO1xuXG5leHBvcnQgY2xhc3MgQ29udjJERGVyRmlsdGVyUHJvZ3JhbSBpbXBsZW1lbnRzIEdQR1BVUHJvZ3JhbSB7XG4gIHZhcmlhYmxlTmFtZXMgPSBbJ3gnLCAnZHknXTtcbiAgb3V0cHV0U2hhcGU6IG51bWJlcltdO1xuICB1c2VyQ29kZTogc3RyaW5nO1xuXG4gIGNvbnN0cnVjdG9yKGNvbnZJbmZvOiBiYWNrZW5kX3V0aWwuQ29udjJESW5mbykge1xuICAgIHRoaXMub3V0cHV0U2hhcGUgPSBjb252SW5mby5maWx0ZXJTaGFwZTtcblxuICAgIGNvbnN0IHN0cmlkZUhlaWdodCA9IGNvbnZJbmZvLnN0cmlkZUhlaWdodDtcbiAgICBjb25zdCBzdHJpZGVXaWR0aCA9IGNvbnZJbmZvLnN0cmlkZVdpZHRoO1xuICAgIGNvbnN0IHBhZFRvcCA9IGNvbnZJbmZvLnBhZEluZm8udG9wO1xuICAgIGNvbnN0IHBhZExlZnQgPSBjb252SW5mby5wYWRJbmZvLmxlZnQ7XG4gICAgY29uc3QgaXNDaGFubmVsc0xhc3QgPSBjb252SW5mby5kYXRhRm9ybWF0ID09PSAnY2hhbm5lbHNMYXN0JztcblxuICAgIHRoaXMudXNlckNvZGUgPSBgXG4gICAgICB2b2lkIG1haW4oKSB7XG4gICAgICAgIGl2ZWM0IGNvb3JkcyA9IGdldE91dHB1dENvb3JkcygpO1xuICAgICAgICBpbnQgd1IgPSBjb29yZHMueDtcbiAgICAgICAgaW50IHdDID0gY29vcmRzLnk7XG4gICAgICAgIGludCBkMSA9IGNvb3Jkcy56O1xuICAgICAgICBpbnQgZDIgPSBjb29yZHMudztcblxuICAgICAgICAvLyBDb252b2x2ZSB4KD8sID8sIGQxKSB3aXRoIGR5KDosIDosIGQyKSB0byBnZXQgZHcod1IsIHdDLCBkMSwgZDIpLlxuICAgICAgICAvLyA/ID0gdG8gYmUgZGV0ZXJtaW5lZC4gOiA9IGFjcm9zcyBhbGwgdmFsdWVzIGluIHRoYXQgYXhpcy5cbiAgICAgICAgZmxvYXQgZG90UHJvZCA9IDAuMDtcblxuICAgICAgICBmb3IgKGludCBiID0gMDsgYiA8ICR7Y29udkluZm8uYmF0Y2hTaXplfTsgYisrKSB7XG4gICAgICAgICAgZm9yIChpbnQgeVIgPSAwOyB5UiA8ICR7Y29udkluZm8ub3V0SGVpZ2h0fTsgeVIrKykge1xuICAgICAgICAgICAgaW50IHhSID0gd1IgKyB5UiAqICR7c3RyaWRlSGVpZ2h0fSAtICR7cGFkVG9wfTtcblxuICAgICAgICAgICAgaWYgKHhSIDwgMCB8fCB4UiA+PSAke2NvbnZJbmZvLmluSGVpZ2h0fSkge1xuICAgICAgICAgICAgICBjb250aW51ZTtcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgZm9yIChpbnQgeUMgPSAwOyB5QyA8ICR7Y29udkluZm8ub3V0V2lkdGh9OyB5QysrKSB7XG4gICAgICAgICAgICAgIGludCB4QyA9IHdDICsgeUMgKiAke3N0cmlkZVdpZHRofSAtICR7cGFkTGVmdH07XG5cbiAgICAgICAgICAgICAgaWYgKHhDIDwgMCB8fCB4QyA+PSAke2NvbnZJbmZvLmluV2lkdGh9KSB7XG4gICAgICAgICAgICAgICAgY29udGludWU7XG4gICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICBpZiAoJHtpc0NoYW5uZWxzTGFzdH0pIHtcbiAgICAgICAgICAgICAgICBmbG9hdCBkeVZhbHVlID0gZ2V0RHkoYiwgeVIsIHlDLCBkMik7XG4gICAgICAgICAgICAgICAgZmxvYXQgeFZhbHVlID0gZ2V0WChiLCB4UiwgeEMsIGQxKTtcbiAgICAgICAgICAgICAgICBkb3RQcm9kICs9ICh4VmFsdWUgKiBkeVZhbHVlKTtcbiAgICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICBmbG9hdCBkeVZhbHVlID0gZ2V0RHkoYiwgZDIsIHlSLCB5Qyk7XG4gICAgICAgICAgICAgICAgZmxvYXQgeFZhbHVlID0gZ2V0WChiLCBkMSwgeFIsIHhDKTtcbiAgICAgICAgICAgICAgICBkb3RQcm9kICs9ICh4VmFsdWUgKiBkeVZhbHVlKTtcbiAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICB9XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIHNldE91dHB1dChkb3RQcm9kKTtcbiAgICAgIH1cbiAgICBgO1xuICB9XG59XG5cbmV4cG9ydCBjbGFzcyBDb252MkREZXJJbnB1dFByb2dyYW0gaW1wbGVtZW50cyBHUEdQVVByb2dyYW0ge1xuICB2YXJpYWJsZU5hbWVzID0gWydkeScsICdXJ107XG4gIG91dHB1dFNoYXBlOiBudW1iZXJbXTtcbiAgdXNlckNvZGU6IHN0cmluZztcblxuICBjb25zdHJ1Y3Rvcihjb252SW5mbzogYmFja2VuZF91dGlsLkNvbnYyREluZm8pIHtcbiAgICB0aGlzLm91dHB1dFNoYXBlID0gY29udkluZm8uaW5TaGFwZTtcblxuICAgIGNvbnN0IGZpbHRlckhlaWdodCA9IGNvbnZJbmZvLmZpbHRlckhlaWdodDtcbiAgICBjb25zdCBmaWx0ZXJXaWR0aCA9IGNvbnZJbmZvLmZpbHRlcldpZHRoO1xuICAgIGNvbnN0IHN0cmlkZUhlaWdodCA9IGNvbnZJbmZvLnN0cmlkZUhlaWdodDtcbiAgICBjb25zdCBzdHJpZGVXaWR0aCA9IGNvbnZJbmZvLnN0cmlkZVdpZHRoO1xuICAgIGNvbnN0IGlzQ2hhbm5lbHNMYXN0ID0gY29udkluZm8uZGF0YUZvcm1hdCA9PT0gJ2NoYW5uZWxzTGFzdCc7XG5cbiAgICBjb25zdCBwYWRUb3AgPSBmaWx0ZXJIZWlnaHQgLSAxIC0gY29udkluZm8ucGFkSW5mby50b3A7XG4gICAgY29uc3QgcGFkTGVmdCA9IGZpbHRlcldpZHRoIC0gMSAtIGNvbnZJbmZvLnBhZEluZm8ubGVmdDtcblxuICAgIGNvbnN0IHJvd0RpbSA9IGlzQ2hhbm5lbHNMYXN0ID8gMSA6IDI7XG4gICAgY29uc3QgY29sRGltID0gaXNDaGFubmVsc0xhc3QgPyAyIDogMztcbiAgICBjb25zdCBjaGFubmVsRGltID0gaXNDaGFubmVsc0xhc3QgPyAzIDogMTtcblxuICAgIHRoaXMudXNlckNvZGUgPSBgXG4gICAgICBjb25zdCBpdmVjMiBwYWRzID0gaXZlYzIoJHtwYWRUb3B9LCAke3BhZExlZnR9KTtcblxuICAgICAgdm9pZCBtYWluKCkge1xuICAgICAgICBpdmVjNCBjb29yZHMgPSBnZXRPdXRwdXRDb29yZHMoKTtcbiAgICAgICAgaW50IGJhdGNoID0gY29vcmRzWzBdO1xuICAgICAgICBpbnQgZDEgPSBjb29yZHNbJHtjaGFubmVsRGltfV07XG5cbiAgICAgICAgaXZlYzIgZHlDb3JuZXIgPSBpdmVjMihjb29yZHNbJHtyb3dEaW19XSwgY29vcmRzWyR7Y29sRGltfV0pIC0gcGFkcztcbiAgICAgICAgaW50IGR5UkNvcm5lciA9IGR5Q29ybmVyLng7XG4gICAgICAgIGludCBkeUNDb3JuZXIgPSBkeUNvcm5lci55O1xuXG4gICAgICAgIC8vIENvbnZvbHZlIGR5KD8sID8sIGQyKSB3aXRoIHcoOiwgOiwgZDEsIGQyKSB0byBjb21wdXRlIGR4KHhSLCB4QywgZDEpLlxuICAgICAgICAvLyA/ID0gdG8gYmUgZGV0ZXJtaW5lZC4gOiA9IGFjcm9zcyBhbGwgdmFsdWVzIGluIHRoYXQgYXhpcy5cbiAgICAgICAgZmxvYXQgZG90UHJvZCA9IDAuMDtcbiAgICAgICAgZm9yIChpbnQgd1IgPSAwOyB3UiA8ICR7ZmlsdGVySGVpZ2h0fTsgd1IrKykge1xuICAgICAgICAgIGZsb2F0IGR5UiA9IGZsb2F0KGR5UkNvcm5lciArIHdSKSAvICR7c3RyaWRlSGVpZ2h0fS4wO1xuXG4gICAgICAgICAgaWYgKGR5UiA8IDAuMCB8fCBkeVIgPj0gJHtjb252SW5mby5vdXRIZWlnaHR9LjAgfHwgZnJhY3QoZHlSKSA+IDAuMCkge1xuICAgICAgICAgICAgY29udGludWU7XG4gICAgICAgICAgfVxuICAgICAgICAgIGludCBpZHlSID0gaW50KGR5Uik7XG5cbiAgICAgICAgICBpbnQgd1JQZXJtID0gJHtmaWx0ZXJIZWlnaHR9IC0gMSAtIHdSO1xuXG4gICAgICAgICAgZm9yIChpbnQgd0MgPSAwOyB3QyA8ICR7ZmlsdGVyV2lkdGh9OyB3QysrKSB7XG4gICAgICAgICAgICBmbG9hdCBkeUMgPSBmbG9hdChkeUNDb3JuZXIgKyB3QykgLyAke3N0cmlkZVdpZHRofS4wO1xuXG4gICAgICAgICAgICBpZiAoZHlDIDwgMC4wIHx8IGR5QyA+PSAke2NvbnZJbmZvLm91dFdpZHRofS4wIHx8XG4gICAgICAgICAgICAgICAgZnJhY3QoZHlDKSA+IDAuMCkge1xuICAgICAgICAgICAgICBjb250aW51ZTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGludCBpZHlDID0gaW50KGR5Qyk7XG5cbiAgICAgICAgICAgIGludCB3Q1Blcm0gPSAke2ZpbHRlcldpZHRofSAtIDEgLSB3QztcblxuICAgICAgICAgICAgZm9yIChpbnQgZDIgPSAwOyBkMiA8ICR7Y29udkluZm8ub3V0Q2hhbm5lbHN9OyBkMisrKSB7XG5cbiAgICAgICAgICAgICAgaWYgKCR7aXNDaGFubmVsc0xhc3R9KSB7XG4gICAgICAgICAgICAgICAgZmxvYXQgeFZhbHVlID0gZ2V0RHkoYmF0Y2gsIGlkeVIsIGlkeUMsIGQyKTtcbiAgICAgICAgICAgICAgICBmbG9hdCB3VmFsdWUgPSBnZXRXKHdSUGVybSwgd0NQZXJtLCBkMSwgZDIpO1xuICAgICAgICAgICAgICAgIGRvdFByb2QgKz0geFZhbHVlICogd1ZhbHVlO1xuICAgICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgIGZsb2F0IHhWYWx1ZSA9IGdldER5KGJhdGNoLCBkMiwgaWR5UiwgaWR5Qyk7XG4gICAgICAgICAgICAgICAgZmxvYXQgd1ZhbHVlID0gZ2V0Vyh3UlBlcm0sIHdDUGVybSwgZDEsIGQyKTtcbiAgICAgICAgICAgICAgICBkb3RQcm9kICs9IHhWYWx1ZSAqIHdWYWx1ZTtcbiAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICB9XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIHNldE91dHB1dChkb3RQcm9kKTtcbiAgICAgIH1cbiAgICBgO1xuICB9XG59XG5cbmV4cG9ydCBjbGFzcyBDb252M0REZXJGaWx0ZXJQcm9ncmFtIGltcGxlbWVudHMgR1BHUFVQcm9ncmFtIHtcbiAgdmFyaWFibGVOYW1lcyA9IFsneCcsICdkeSddO1xuICBvdXRwdXRTaGFwZTogbnVtYmVyW107XG4gIHVzZXJDb2RlOiBzdHJpbmc7XG5cbiAgY29uc3RydWN0b3IoY29udkluZm86IGJhY2tlbmRfdXRpbC5Db252M0RJbmZvKSB7XG4gICAgdGhpcy5vdXRwdXRTaGFwZSA9IGNvbnZJbmZvLmZpbHRlclNoYXBlO1xuXG4gICAgY29uc3Qgc3RyaWRlRGVwdGggPSBjb252SW5mby5zdHJpZGVEZXB0aDtcbiAgICBjb25zdCBzdHJpZGVIZWlnaHQgPSBjb252SW5mby5zdHJpZGVIZWlnaHQ7XG4gICAgY29uc3Qgc3RyaWRlV2lkdGggPSBjb252SW5mby5zdHJpZGVXaWR0aDtcbiAgICBjb25zdCBwYWRGcm9udCA9IGNvbnZJbmZvLnBhZEluZm8uZnJvbnQ7XG4gICAgY29uc3QgcGFkVG9wID0gY29udkluZm8ucGFkSW5mby50b3A7XG4gICAgY29uc3QgcGFkTGVmdCA9IGNvbnZJbmZvLnBhZEluZm8ubGVmdDtcblxuICAgIHRoaXMudXNlckNvZGUgPSBgXG4gICAgICB2b2lkIG1haW4oKSB7XG4gICAgICAgIGl2ZWM1IGNvb3JkcyA9IGdldE91dHB1dENvb3JkcygpO1xuICAgICAgICBpbnQgd0YgPSBjb29yZHMueDtcbiAgICAgICAgaW50IHdSID0gY29vcmRzLnk7XG4gICAgICAgIGludCB3QyA9IGNvb3Jkcy56O1xuICAgICAgICBpbnQgZDEgPSBjb29yZHMudztcbiAgICAgICAgaW50IGQyID0gY29vcmRzLnU7XG5cbiAgICAgICAgZmxvYXQgZG90UHJvZCA9IDAuMDtcblxuICAgICAgICBmb3IgKGludCBiID0gMDsgYiA8ICR7Y29udkluZm8uYmF0Y2hTaXplfTsgYisrKSB7XG4gICAgICAgICAgZm9yIChpbnQgeUYgPSAwOyB5RiA8ICR7Y29udkluZm8ub3V0RGVwdGh9OyB5RisrKSB7XG4gICAgICAgICAgICBpbnQgeEYgPSB3RiArIHlGICogJHtzdHJpZGVEZXB0aH0gLSAke3BhZEZyb250fTtcblxuICAgICAgICAgICAgaWYgKHhGIDwgMCB8fCB4RiA+PSAke2NvbnZJbmZvLmluRGVwdGh9KSB7XG4gICAgICAgICAgICAgIGNvbnRpbnVlO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBmb3IgKGludCB5UiA9IDA7IHlSIDwgJHtjb252SW5mby5vdXRIZWlnaHR9OyB5UisrKSB7XG4gICAgICAgICAgICAgIGludCB4UiA9IHdSICsgeVIgKiAke3N0cmlkZUhlaWdodH0gLSAke3BhZFRvcH07XG5cbiAgICAgICAgICAgICAgaWYgKHhSIDwgMCB8fCB4UiA+PSAke2NvbnZJbmZvLmluSGVpZ2h0fSkge1xuICAgICAgICAgICAgICAgIGNvbnRpbnVlO1xuICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgZm9yIChpbnQgeUMgPSAwOyB5QyA8ICR7Y29udkluZm8ub3V0V2lkdGh9OyB5QysrKSB7XG4gICAgICAgICAgICAgICAgaW50IHhDID0gd0MgKyB5QyAqICR7c3RyaWRlV2lkdGh9IC0gJHtwYWRMZWZ0fTtcblxuICAgICAgICAgICAgICAgIGlmICh4QyA8IDAgfHwgeEMgPj0gJHtjb252SW5mby5pbldpZHRofSkge1xuICAgICAgICAgICAgICAgICAgY29udGludWU7XG4gICAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgICAgZmxvYXQgZHlWYWx1ZSA9IGdldER5KGIsIHlGLCB5UiwgeUMsIGQyKTtcbiAgICAgICAgICAgICAgICBmbG9hdCB4VmFsdWUgPSBnZXRYKGIsIHhGLCB4UiwgeEMsIGQxKTtcbiAgICAgICAgICAgICAgICBkb3RQcm9kICs9ICh4VmFsdWUgKiBkeVZhbHVlKTtcbiAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICBzZXRPdXRwdXQoZG90UHJvZCk7XG4gICAgICB9XG4gICAgYDtcbiAgfVxufVxuXG5leHBvcnQgY2xhc3MgQ29udjNERGVySW5wdXRQcm9ncmFtIGltcGxlbWVudHMgR1BHUFVQcm9ncmFtIHtcbiAgdmFyaWFibGVOYW1lcyA9IFsnZHknLCAnVyddO1xuICBvdXRwdXRTaGFwZTogbnVtYmVyW107XG4gIHVzZXJDb2RlOiBzdHJpbmc7XG5cbiAgY29uc3RydWN0b3IoY29udkluZm86IGJhY2tlbmRfdXRpbC5Db252M0RJbmZvKSB7XG4gICAgdGhpcy5vdXRwdXRTaGFwZSA9IGNvbnZJbmZvLmluU2hhcGU7XG5cbiAgICBjb25zdCBmaWx0ZXJEZXB0aCA9IGNvbnZJbmZvLmZpbHRlckRlcHRoO1xuICAgIGNvbnN0IGZpbHRlckhlaWdodCA9IGNvbnZJbmZvLmZpbHRlckhlaWdodDtcbiAgICBjb25zdCBmaWx0ZXJXaWR0aCA9IGNvbnZJbmZvLmZpbHRlcldpZHRoO1xuICAgIGNvbnN0IHN0cmlkZURlcHRoID0gY29udkluZm8uc3RyaWRlRGVwdGg7XG4gICAgY29uc3Qgc3RyaWRlSGVpZ2h0ID0gY29udkluZm8uc3RyaWRlSGVpZ2h0O1xuICAgIGNvbnN0IHN0cmlkZVdpZHRoID0gY29udkluZm8uc3RyaWRlV2lkdGg7XG5cbiAgICBjb25zdCBwYWRGcm9udCA9IGZpbHRlckRlcHRoIC0gMSAtIGNvbnZJbmZvLnBhZEluZm8uZnJvbnQ7XG4gICAgY29uc3QgcGFkVG9wID0gZmlsdGVySGVpZ2h0IC0gMSAtIGNvbnZJbmZvLnBhZEluZm8udG9wO1xuICAgIGNvbnN0IHBhZExlZnQgPSBmaWx0ZXJXaWR0aCAtIDEgLSBjb252SW5mby5wYWRJbmZvLmxlZnQ7XG5cbiAgICB0aGlzLnVzZXJDb2RlID0gYFxuICAgICAgY29uc3QgaXZlYzMgcGFkcyA9IGl2ZWMzKCR7cGFkRnJvbnR9LCAke3BhZFRvcH0sICR7cGFkTGVmdH0pO1xuXG4gICAgICB2b2lkIG1haW4oKSB7XG4gICAgICAgIGl2ZWM1IGNvb3JkcyA9IGdldE91dHB1dENvb3JkcygpO1xuICAgICAgICBpbnQgYmF0Y2ggPSBjb29yZHMueDtcbiAgICAgICAgaW50IGQxID0gY29vcmRzLnU7XG5cblxuICAgICAgICBpdmVjMyBkeUNvcm5lciA9IGl2ZWMzKGNvb3Jkcy55LCBjb29yZHMueiwgY29vcmRzLncpIC0gcGFkcztcbiAgICAgICAgaW50IGR5RkNvcm5lciA9IGR5Q29ybmVyLng7XG4gICAgICAgIGludCBkeVJDb3JuZXIgPSBkeUNvcm5lci55O1xuICAgICAgICBpbnQgZHlDQ29ybmVyID0gZHlDb3JuZXIuejtcblxuICAgICAgICBmbG9hdCBkb3RQcm9kID0gMC4wO1xuICAgICAgICBmb3IgKGludCB3RiA9IDA7IHdGIDwgJHtmaWx0ZXJEZXB0aH07IHdGKyspIHtcbiAgICAgICAgICBmbG9hdCBkeUYgPSBmbG9hdChkeUZDb3JuZXIgKyB3RikgLyAke3N0cmlkZURlcHRofS4wO1xuXG4gICAgICAgICAgaWYgKGR5RiA8IDAuMCB8fCBkeUYgPj0gJHtjb252SW5mby5vdXREZXB0aH0uMCB8fCBmcmFjdChkeUYpID4gMC4wKSB7XG4gICAgICAgICAgICBjb250aW51ZTtcbiAgICAgICAgICB9XG4gICAgICAgICAgaW50IGlkeUYgPSBpbnQoZHlGKTtcblxuICAgICAgICAgIGludCB3RlBlcm0gPSAke2ZpbHRlckRlcHRofSAtIDEgLSB3RjtcblxuICAgICAgICAgIGZvciAoaW50IHdSID0gMDsgd1IgPCAke2ZpbHRlckhlaWdodH07IHdSKyspIHtcbiAgICAgICAgICAgIGZsb2F0IGR5UiA9IGZsb2F0KGR5UkNvcm5lciArIHdSKSAvICR7c3RyaWRlSGVpZ2h0fS4wO1xuXG4gICAgICAgICAgICBpZiAoZHlSIDwgMC4wIHx8IGR5UiA+PSAke2NvbnZJbmZvLm91dEhlaWdodH0uMCB8fFxuICAgICAgICAgICAgICBmcmFjdChkeVIpID4gMC4wKSB7XG4gICAgICAgICAgICAgIGNvbnRpbnVlO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgaW50IGlkeVIgPSBpbnQoZHlSKTtcblxuICAgICAgICAgICAgaW50IHdSUGVybSA9ICR7ZmlsdGVySGVpZ2h0fSAtIDEgLSB3UjtcblxuICAgICAgICAgICAgZm9yIChpbnQgd0MgPSAwOyB3QyA8ICR7ZmlsdGVyV2lkdGh9OyB3QysrKSB7XG4gICAgICAgICAgICAgIGZsb2F0IGR5QyA9IGZsb2F0KGR5Q0Nvcm5lciArIHdDKSAvICR7c3RyaWRlV2lkdGh9LjA7XG5cbiAgICAgICAgICAgICAgaWYgKGR5QyA8IDAuMCB8fCBkeUMgPj0gJHtjb252SW5mby5vdXRXaWR0aH0uMCB8fFxuICAgICAgICAgICAgICAgICAgZnJhY3QoZHlDKSA+IDAuMCkge1xuICAgICAgICAgICAgICAgIGNvbnRpbnVlO1xuICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgIGludCBpZHlDID0gaW50KGR5Qyk7XG5cbiAgICAgICAgICAgICAgaW50IHdDUGVybSA9ICR7ZmlsdGVyV2lkdGh9IC0gMSAtIHdDO1xuXG4gICAgICAgICAgICAgIGZvciAoaW50IGQyID0gMDsgZDIgPCAke2NvbnZJbmZvLm91dENoYW5uZWxzfTsgZDIrKykge1xuICAgICAgICAgICAgICAgIGZsb2F0IHhWYWx1ZSA9IGdldER5KGJhdGNoLCBpZHlGLCBpZHlSLCBpZHlDLCBkMik7XG4gICAgICAgICAgICAgICAgZmxvYXQgd1ZhbHVlID0gZ2V0Vyh3RlBlcm0sIHdSUGVybSwgd0NQZXJtLCBkMSwgZDIpO1xuICAgICAgICAgICAgICAgIGRvdFByb2QgKz0geFZhbHVlICogd1ZhbHVlO1xuICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIHNldE91dHB1dChkb3RQcm9kKTtcbiAgICAgIH1cbiAgICBgO1xuICB9XG59XG4iXX0=","/**\n * @license\n * Copyright 2020 Google LLC. All Rights Reserved.\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n * =============================================================================\n */\nimport { backend_util, Conv2DBackpropFilter } from '@tensorflow/tfjs-core';\nimport { Conv2DDerFilterProgram } from '../conv_backprop_gpu';\nexport function conv2DBackpropFilter(args) {\n const { inputs, backend, attrs } = args;\n const { x, dy } = inputs;\n const { strides, pad, dataFormat, dimRoundingMode, filterShape } = attrs;\n const $dataFormat = backend_util.convertConv2DDataFormat(dataFormat);\n const convInfo = backend_util.computeConv2DInfo(x.shape, filterShape, strides, 1 /* dilations */, pad, dimRoundingMode, false /* depthwise */, $dataFormat);\n const program = new Conv2DDerFilterProgram(convInfo);\n return backend.runWebGLProgram(program, [x, dy], 'float32');\n}\nexport const conv2DBackpropFilterConfig = {\n kernelName: Conv2DBackpropFilter,\n backendName: 'webgl',\n kernelFunc: conv2DBackpropFilter,\n};\n//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiQ29udjJEQmFja3Byb3BGaWx0ZXIuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi8uLi90ZmpzLWJhY2tlbmQtd2ViZ2wvc3JjL2tlcm5lbHMvQ29udjJEQmFja3Byb3BGaWx0ZXIudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUE7Ozs7Ozs7Ozs7Ozs7OztHQWVHO0FBRUgsT0FBTyxFQUFDLFlBQVksRUFBRSxvQkFBb0IsRUFBa0YsTUFBTSx1QkFBdUIsQ0FBQztBQUcxSixPQUFPLEVBQUMsc0JBQXNCLEVBQUMsTUFBTSxzQkFBc0IsQ0FBQztBQUU1RCxNQUFNLFVBQVUsb0JBQW9CLENBQUMsSUFJcEM7SUFDQyxNQUFNLEVBQUMsTUFBTSxFQUFFLE9BQU8sRUFBRSxLQUFLLEVBQUMsR0FBRyxJQUFJLENBQUM7SUFDdEMsTUFBTSxFQUFDLENBQUMsRUFBRSxFQUFFLEVBQUMsR0FBRyxNQUFNLENBQUM7SUFDdkIsTUFBTSxFQUFDLE9BQU8sRUFBRSxHQUFHLEVBQUUsVUFBVSxFQUFFLGVBQWUsRUFBRSxXQUFXLEVBQUMsR0FBRyxLQUFLLENBQUM7SUFFdkUsTUFBTSxXQUFXLEdBQUcsWUFBWSxDQUFDLHVCQUF1QixDQUFDLFVBQVUsQ0FBQyxDQUFDO0lBQ3JFLE1BQU0sUUFBUSxHQUFHLFlBQVksQ0FBQyxpQkFBaUIsQ0FDM0MsQ0FBQyxDQUFDLEtBQXlDLEVBQUUsV0FBVyxFQUFFLE9BQU8sRUFDakUsQ0FBQyxDQUFDLGVBQWUsRUFBRSxHQUFHLEVBQUUsZUFBZSxFQUFFLEtBQUssQ0FBQyxlQUFlLEVBQzlELFdBQVcsQ0FBQyxDQUFDO0lBRWpCLE1BQU0sT0FBTyxHQUFHLElBQUksc0JBQXNCLENBQUMsUUFBUSxDQUFDLENBQUM7SUFDckQsT0FBTyxPQUFPLENBQUMsZUFBZSxDQUFDLE9BQU8sRUFBRSxDQUFDLENBQUMsRUFBRSxFQUFFLENBQUMsRUFBRSxTQUFTLENBQUMsQ0FBQztBQUM5RCxDQUFDO0FBRUQsTUFBTSxDQUFDLE1BQU0sMEJBQTBCLEdBQWlCO0lBQ3RELFVBQVUsRUFBRSxvQkFBb0I7SUFDaEMsV0FBVyxFQUFFLE9BQU87SUFDcEIsVUFBVSxFQUFFLG9CQUF3QztDQUNyRCxDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiLyoqXG4gKiBAbGljZW5zZVxuICogQ29weXJpZ2h0IDIwMjAgR29vZ2xlIExMQy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC5cbiAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSBcIkxpY2Vuc2VcIik7XG4gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuXG4gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXRcbiAqXG4gKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjBcbiAqXG4gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlXG4gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiBcIkFTIElTXCIgQkFTSVMsXG4gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC5cbiAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmRcbiAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLlxuICogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbiAqL1xuXG5pbXBvcnQge2JhY2tlbmRfdXRpbCwgQ29udjJEQmFja3Byb3BGaWx0ZXIsIENvbnYyREJhY2twcm9wRmlsdGVyQXR0cnMsIENvbnYyREJhY2twcm9wRmlsdGVySW5wdXRzLCBLZXJuZWxDb25maWcsIEtlcm5lbEZ1bmN9IGZyb20gJ0B0ZW5zb3JmbG93L3RmanMtY29yZSc7XG5cbmltcG9ydCB7TWF0aEJhY2tlbmRXZWJHTH0gZnJvbSAnLi4vYmFja2VuZF93ZWJnbCc7XG5pbXBvcnQge0NvbnYyRERlckZpbHRlclByb2dyYW19IGZyb20gJy4uL2NvbnZfYmFja3Byb3BfZ3B1JztcblxuZXhwb3J0IGZ1bmN0aW9uIGNvbnYyREJhY2twcm9wRmlsdGVyKGFyZ3M6IHtcbiAgaW5wdXRzOiBDb252MkRCYWNrcHJvcEZpbHRlcklucHV0cyxcbiAgYXR0cnM6IENvbnYyREJhY2twcm9wRmlsdGVyQXR0cnMsXG4gIGJhY2tlbmQ6IE1hdGhCYWNrZW5kV2ViR0xcbn0pIHtcbiAgY29uc3Qge2lucHV0cywgYmFja2VuZCwgYXR0cnN9ID0gYXJncztcbiAgY29uc3Qge3gsIGR5fSA9IGlucHV0cztcbiAgY29uc3Qge3N0cmlkZXMsIHBhZCwgZGF0YUZvcm1hdCwgZGltUm91bmRpbmdNb2RlLCBmaWx0ZXJTaGFwZX0gPSBhdHRycztcblxuICBjb25zdCAkZGF0YUZvcm1hdCA9IGJhY2tlbmRfdXRpbC5jb252ZXJ0Q29udjJERGF0YUZvcm1hdChkYXRhRm9ybWF0KTtcbiAgY29uc3QgY29udkluZm8gPSBiYWNrZW5kX3V0aWwuY29tcHV0ZUNvbnYyREluZm8oXG4gICAgICB4LnNoYXBlIGFzIFtudW1iZXIsIG51bWJlciwgbnVtYmVyLCBudW1iZXJdLCBmaWx0ZXJTaGFwZSwgc3RyaWRlcyxcbiAgICAgIDEgLyogZGlsYXRpb25zICovLCBwYWQsIGRpbVJvdW5kaW5nTW9kZSwgZmFsc2UgLyogZGVwdGh3aXNlICovLFxuICAgICAgJGRhdGFGb3JtYXQpO1xuXG4gIGNvbnN0IHByb2dyYW0gPSBuZXcgQ29udjJERGVyRmlsdGVyUHJvZ3JhbShjb252SW5mbyk7XG4gIHJldHVybiBiYWNrZW5kLnJ1bldlYkdMUHJvZ3JhbShwcm9ncmFtLCBbeCwgZHldLCAnZmxvYXQzMicpO1xufVxuXG5leHBvcnQgY29uc3QgY29udjJEQmFja3Byb3BGaWx0ZXJDb25maWc6IEtlcm5lbENvbmZpZyA9IHtcbiAga2VybmVsTmFtZTogQ29udjJEQmFja3Byb3BGaWx0ZXIsXG4gIGJhY2tlbmROYW1lOiAnd2ViZ2wnLFxuICBrZXJuZWxGdW5jOiBjb252MkRCYWNrcHJvcEZpbHRlciBhcyB7fSBhcyBLZXJuZWxGdW5jLFxufTtcbiJdfQ==","/**\n * @license\n * Copyright 2020 Google LLC. All Rights Reserved.\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n * =============================================================================\n */\nimport { backend_util, Conv2DBackpropInput } from '@tensorflow/tfjs-core';\nimport { Conv2DDerInputProgram } from '../conv_backprop_gpu';\nexport function conv2DBackpropInput(args) {\n const { inputs, backend, attrs } = args;\n const { dy, filter } = inputs;\n const { inputShape, strides, pad, dataFormat, dimRoundingMode } = attrs;\n const $dataFormat = backend_util.convertConv2DDataFormat(dataFormat);\n const convInfo = backend_util.computeConv2DInfo(inputShape, filter.shape, strides, 1 /* dilations */, pad, dimRoundingMode, false, $dataFormat);\n const program = new Conv2DDerInputProgram(convInfo);\n return backend.runWebGLProgram(program, [dy, filter], 'float32');\n}\nexport const conv2DBackpropInputConfig = {\n kernelName: Conv2DBackpropInput,\n backendName: 'webgl',\n kernelFunc: conv2DBackpropInput,\n};\n//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiQ29udjJEQmFja3Byb3BJbnB1dC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uLy4uL3RmanMtYmFja2VuZC13ZWJnbC9zcmMva2VybmVscy9Db252MkRCYWNrcHJvcElucHV0LnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBOzs7Ozs7Ozs7Ozs7Ozs7R0FlRztBQUVILE9BQU8sRUFBQyxZQUFZLEVBQUUsbUJBQW1CLEVBQWdGLE1BQU0sdUJBQXVCLENBQUM7QUFHdkosT0FBTyxFQUFDLHFCQUFxQixFQUFDLE1BQU0sc0JBQXNCLENBQUM7QUFFM0QsTUFBTSxVQUFVLG1CQUFtQixDQUFDLElBSW5DO0lBQ0MsTUFBTSxFQUFDLE1BQU0sRUFBRSxPQUFPLEVBQUUsS0FBSyxFQUFDLEdBQUcsSUFBSSxDQUFDO0lBQ3RDLE1BQU0sRUFBQyxFQUFFLEVBQUUsTUFBTSxFQUFDLEdBQUcsTUFBTSxDQUFDO0lBQzVCLE1BQU0sRUFBQyxVQUFVLEVBQUUsT0FBTyxFQUFFLEdBQUcsRUFBRSxVQUFVLEVBQUUsZUFBZSxFQUFDLEdBQUcsS0FBSyxDQUFDO0lBRXRFLE1BQU0sV0FBVyxHQUFHLFlBQVksQ0FBQyx1QkFBdUIsQ0FBQyxVQUFVLENBQUMsQ0FBQztJQUNyRSxNQUFNLFFBQVEsR0FBRyxZQUFZLENBQUMsaUJBQWlCLENBQzNDLFVBQVUsRUFBRSxNQUFNLENBQUMsS0FBeUMsRUFBRSxPQUFPLEVBQ3JFLENBQUMsQ0FBQyxlQUFlLEVBQUUsR0FBRyxFQUFFLGVBQWUsRUFBRSxLQUFLLEVBQUUsV0FBVyxDQUFDLENBQUM7SUFFakUsTUFBTSxPQUFPLEdBQUcsSUFBSSxxQkFBcUIsQ0FBQyxRQUFRLENBQUMsQ0FBQztJQUNwRCxPQUFPLE9BQU8sQ0FBQyxlQUFlLENBQUMsT0FBTyxFQUFFLENBQUMsRUFBRSxFQUFFLE1BQU0sQ0FBQyxFQUFFLFNBQVMsQ0FBQyxDQUFDO0FBQ25FLENBQUM7QUFFRCxNQUFNLENBQUMsTUFBTSx5QkFBeUIsR0FBaUI7SUFDckQsVUFBVSxFQUFFLG1CQUFtQjtJQUMvQixXQUFXLEVBQUUsT0FBTztJQUNwQixVQUFVLEVBQUUsbUJBQXVDO0NBQ3BELENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyIvKipcbiAqIEBsaWNlbnNlXG4gKiBDb3B5cmlnaHQgMjAyMCBHb29nbGUgTExDLiBBbGwgUmlnaHRzIFJlc2VydmVkLlxuICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlIFwiTGljZW5zZVwiKTtcbiAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS5cbiAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdFxuICpcbiAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMFxuICpcbiAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmVcbiAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuIFwiQVMgSVNcIiBCQVNJUyxcbiAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLlxuICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZFxuICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuXG4gKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuICovXG5cbmltcG9ydCB7YmFja2VuZF91dGlsLCBDb252MkRCYWNrcHJvcElucHV0LCBDb252MkRCYWNrcHJvcElucHV0QXR0cnMsIENvbnYyREJhY2twcm9wSW5wdXRJbnB1dHMsIEtlcm5lbENvbmZpZywgS2VybmVsRnVuY30gZnJvbSAnQHRlbnNvcmZsb3cvdGZqcy1jb3JlJztcblxuaW1wb3J0IHtNYXRoQmFja2VuZFdlYkdMfSBmcm9tICcuLi9iYWNrZW5kX3dlYmdsJztcbmltcG9ydCB7Q29udjJERGVySW5wdXRQcm9ncmFtfSBmcm9tICcuLi9jb252X2JhY2twcm9wX2dwdSc7XG5cbmV4cG9ydCBmdW5jdGlvbiBjb252MkRCYWNrcHJvcElucHV0KGFyZ3M6IHtcbiAgaW5wdXRzOiBDb252MkRCYWNrcHJvcElucHV0SW5wdXRzLFxuICBhdHRyczogQ29udjJEQmFja3Byb3BJbnB1dEF0dHJzLFxuICBiYWNrZW5kOiBNYXRoQmFja2VuZFdlYkdMXG59KSB7XG4gIGNvbnN0IHtpbnB1dHMsIGJhY2tlbmQsIGF0dHJzfSA9IGFyZ3M7XG4gIGNvbnN0IHtkeSwgZmlsdGVyfSA9IGlucHV0cztcbiAgY29uc3Qge2lucHV0U2hhcGUsIHN0cmlkZXMsIHBhZCwgZGF0YUZvcm1hdCwgZGltUm91bmRpbmdNb2RlfSA9IGF0dHJzO1xuXG4gIGNvbnN0ICRkYXRhRm9ybWF0ID0gYmFja2VuZF91dGlsLmNvbnZlcnRDb252MkREYXRhRm9ybWF0KGRhdGFGb3JtYXQpO1xuICBjb25zdCBjb252SW5mbyA9IGJhY2tlbmRfdXRpbC5jb21wdXRlQ29udjJESW5mbyhcbiAgICAgIGlucHV0U2hhcGUsIGZpbHRlci5zaGFwZSBhcyBbbnVtYmVyLCBudW1iZXIsIG51bWJlciwgbnVtYmVyXSwgc3RyaWRlcyxcbiAgICAgIDEgLyogZGlsYXRpb25zICovLCBwYWQsIGRpbVJvdW5kaW5nTW9kZSwgZmFsc2UsICRkYXRhRm9ybWF0KTtcblxuICBjb25zdCBwcm9ncmFtID0gbmV3IENvbnYyRERlcklucHV0UHJvZ3JhbShjb252SW5mbyk7XG4gIHJldHVybiBiYWNrZW5kLnJ1bldlYkdMUHJvZ3JhbShwcm9ncmFtLCBbZHksIGZpbHRlcl0sICdmbG9hdDMyJyk7XG59XG5cbmV4cG9ydCBjb25zdCBjb252MkRCYWNrcHJvcElucHV0Q29uZmlnOiBLZXJuZWxDb25maWcgPSB7XG4gIGtlcm5lbE5hbWU6IENvbnYyREJhY2twcm9wSW5wdXQsXG4gIGJhY2tlbmROYW1lOiAnd2ViZ2wnLFxuICBrZXJuZWxGdW5jOiBjb252MkRCYWNrcHJvcElucHV0IGFzIHt9IGFzIEtlcm5lbEZ1bmMsXG59O1xuIl19","/**\n * @license\n * Copyright 2020 Google LLC. All Rights Reserved.\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n * =============================================================================\n */\nimport { backend_util, Conv3D } from '@tensorflow/tfjs-core';\nimport { Conv3DProgram } from '../conv_gpu';\nexport function conv3D(args) {\n const { inputs, backend, attrs } = args;\n const { x, filter } = inputs;\n const { strides, pad, dilations } = attrs;\n const convInfo = backend_util.computeConv3DInfo(x.shape, filter.shape, strides, dilations, pad);\n const program = new Conv3DProgram(convInfo);\n return backend.runWebGLProgram(program, [x, filter], 'float32');\n}\nexport const conv3DConfig = {\n kernelName: Conv3D,\n backendName: 'webgl',\n kernelFunc: conv3D,\n};\n//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiQ29udjNELmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vLi4vdGZqcy1iYWNrZW5kLXdlYmdsL3NyYy9rZXJuZWxzL0NvbnYzRC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQTs7Ozs7Ozs7Ozs7Ozs7O0dBZUc7QUFFSCxPQUFPLEVBQUMsWUFBWSxFQUFFLE1BQU0sRUFBc0QsTUFBTSx1QkFBdUIsQ0FBQztBQUdoSCxPQUFPLEVBQUMsYUFBYSxFQUFDLE1BQU0sYUFBYSxDQUFDO0FBRTFDLE1BQU0sVUFBVSxNQUFNLENBQ2xCLElBQ3lFO0lBQzNFLE1BQU0sRUFBQyxNQUFNLEVBQUUsT0FBTyxFQUFFLEtBQUssRUFBQyxHQUFHLElBQUksQ0FBQztJQUN0QyxNQUFNLEVBQUMsQ0FBQyxFQUFFLE1BQU0sRUFBQyxHQUFHLE1BQU0sQ0FBQztJQUMzQixNQUFNLEVBQUMsT0FBTyxFQUFFLEdBQUcsRUFBRSxTQUFTLEVBQUMsR0FBRyxLQUFLLENBQUM7SUFFeEMsTUFBTSxRQUFRLEdBQUcsWUFBWSxDQUFDLGlCQUFpQixDQUMzQyxDQUFDLENBQUMsS0FBaUQsRUFDbkQsTUFBTSxDQUFDLEtBQWlELEVBQUUsT0FBTyxFQUNqRSxTQUFTLEVBQUUsR0FBRyxDQUFDLENBQUM7SUFFcEIsTUFBTSxPQUFPLEdBQUcsSUFBSSxhQUFhLENBQUMsUUFBUSxDQUFDLENBQUM7SUFDNUMsT0FBTyxPQUFPLENBQUMsZUFBZSxDQUFDLE9BQU8sRUFBRSxDQUFDLENBQUMsRUFBRSxNQUFNLENBQUMsRUFBRSxTQUFTLENBQUMsQ0FBQztBQUNsRSxDQUFDO0FBRUQsTUFBTSxDQUFDLE1BQU0sWUFBWSxHQUFpQjtJQUN4QyxVQUFVLEVBQUUsTUFBTTtJQUNsQixXQUFXLEVBQUUsT0FBTztJQUNwQixVQUFVLEVBQUUsTUFBMEI7Q0FDdkMsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbIi8qKlxuICogQGxpY2Vuc2VcbiAqIENvcHlyaWdodCAyMDIwIEdvb2dsZSBMTEMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuXG4gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgXCJMaWNlbnNlXCIpO1xuICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLlxuICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0XG4gKlxuICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wXG4gKlxuICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZVxuICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gXCJBUyBJU1wiIEJBU0lTLFxuICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuXG4gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kXG4gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS5cbiAqID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4gKi9cblxuaW1wb3J0IHtiYWNrZW5kX3V0aWwsIENvbnYzRCwgQ29udjNEQXR0cnMsIENvbnYzRElucHV0cywgS2VybmVsQ29uZmlnLCBLZXJuZWxGdW5jfSBmcm9tICdAdGVuc29yZmxvdy90ZmpzLWNvcmUnO1xuXG5pbXBvcnQge01hdGhCYWNrZW5kV2ViR0x9IGZyb20gJy4uL2JhY2tlbmRfd2ViZ2wnO1xuaW1wb3J0IHtDb252M0RQcm9ncmFtfSBmcm9tICcuLi9jb252X2dwdSc7XG5cbmV4cG9ydCBmdW5jdGlvbiBjb252M0QoXG4gICAgYXJnczpcbiAgICAgICAge2lucHV0czogQ29udjNESW5wdXRzLCBhdHRyczogQ29udjNEQXR0cnMsIGJhY2tlbmQ6IE1hdGhCYWNrZW5kV2ViR0x9KSB7XG4gIGNvbnN0IHtpbnB1dHMsIGJhY2tlbmQsIGF0dHJzfSA9IGFyZ3M7XG4gIGNvbnN0IHt4LCBmaWx0ZXJ9ID0gaW5wdXRzO1xuICBjb25zdCB7c3RyaWRlcywgcGFkLCBkaWxhdGlvbnN9ID0gYXR0cnM7XG5cbiAgY29uc3QgY29udkluZm8gPSBiYWNrZW5kX3V0aWwuY29tcHV0ZUNvbnYzREluZm8oXG4gICAgICB4LnNoYXBlIGFzIFtudW1iZXIsIG51bWJlciwgbnVtYmVyLCBudW1iZXIsIG51bWJlcl0sXG4gICAgICBmaWx0ZXIuc2hhcGUgYXMgW251bWJlciwgbnVtYmVyLCBudW1iZXIsIG51bWJlciwgbnVtYmVyXSwgc3RyaWRlcyxcbiAgICAgIGRpbGF0aW9ucywgcGFkKTtcblxuICBjb25zdCBwcm9ncmFtID0gbmV3IENvbnYzRFByb2dyYW0oY29udkluZm8pO1xuICByZXR1cm4gYmFja2VuZC5ydW5XZWJHTFByb2dyYW0ocHJvZ3JhbSwgW3gsIGZpbHRlcl0sICdmbG9hdDMyJyk7XG59XG5cbmV4cG9ydCBjb25zdCBjb252M0RDb25maWc6IEtlcm5lbENvbmZpZyA9IHtcbiAga2VybmVsTmFtZTogQ29udjNELFxuICBiYWNrZW5kTmFtZTogJ3dlYmdsJyxcbiAga2VybmVsRnVuYzogY29udjNEIGFzIHt9IGFzIEtlcm5lbEZ1bmMsXG59O1xuIl19","/**\n * @license\n * Copyright 2020 Google LLC. All Rights Reserved.\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n * =============================================================================\n */\nimport { backend_util, Conv3DBackpropFilterV2 } from '@tensorflow/tfjs-core';\nimport { Conv3DDerFilterProgram } from '../conv_backprop_gpu';\nexport function conv3DBackpropFilterV2(args) {\n const { inputs, backend, attrs } = args;\n const { x, dy } = inputs;\n const { strides, pad, filterShape } = attrs;\n const convInfo = backend_util.computeConv3DInfo(x.shape, filterShape, strides, 1 /* dilations */, pad);\n const program = new Conv3DDerFilterProgram(convInfo);\n return backend.runWebGLProgram(program, [x, dy], 'float32');\n}\nexport const conv3DBackpropFilterV2Config = {\n kernelName: Conv3DBackpropFilterV2,\n backendName: 'webgl',\n kernelFunc: conv3DBackpropFilterV2\n};\n//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiQ29udjNEQmFja3Byb3BGaWx0ZXJWMi5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uLy4uL3RmanMtYmFja2VuZC13ZWJnbC9zcmMva2VybmVscy9Db252M0RCYWNrcHJvcEZpbHRlclYyLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBOzs7Ozs7Ozs7Ozs7Ozs7R0FlRztBQUVILE9BQU8sRUFBQyxZQUFZLEVBQUUsc0JBQXNCLEVBQXNGLE1BQU0sdUJBQXVCLENBQUM7QUFHaEssT0FBTyxFQUFDLHNCQUFzQixFQUFDLE1BQU0sc0JBQXNCLENBQUM7QUFFNUQsTUFBTSxVQUFVLHNCQUFzQixDQUFDLElBSXRDO0lBQ0MsTUFBTSxFQUFDLE1BQU0sRUFBRSxPQUFPLEVBQUUsS0FBSyxFQUFDLEdBQUcsSUFBSSxDQUFDO0lBQ3RDLE1BQU0sRUFBQyxDQUFDLEVBQUUsRUFBRSxFQUFDLEdBQUcsTUFBTSxDQUFDO0lBQ3ZCLE1BQU0sRUFBQyxPQUFPLEVBQUUsR0FBRyxFQUFFLFdBQVcsRUFBQyxHQUFHLEtBQUssQ0FBQztJQUUxQyxNQUFNLFFBQVEsR0FBRyxZQUFZLENBQUMsaUJBQWlCLENBQzNDLENBQUMsQ0FBQyxLQUFpRCxFQUFFLFdBQVcsRUFBRSxPQUFPLEVBQ3pFLENBQUMsQ0FBQyxlQUFlLEVBQUUsR0FBRyxDQUFDLENBQUM7SUFFNUIsTUFBTSxPQUFPLEdBQUcsSUFBSSxzQkFBc0IsQ0FBQyxRQUFRLENBQUMsQ0FBQztJQUNyRCxPQUFPLE9BQU8sQ0FBQyxlQUFlLENBQUMsT0FBTyxFQUFFLENBQUMsQ0FBQyxFQUFFLEVBQUUsQ0FBQyxFQUFFLFNBQVMsQ0FBQyxDQUFDO0FBQzlELENBQUM7QUFFRCxNQUFNLENBQUMsTUFBTSw0QkFBNEIsR0FBaUI7SUFDeEQsVUFBVSxFQUFFLHNCQUFzQjtJQUNsQyxXQUFXLEVBQUUsT0FBTztJQUNwQixVQUFVLEVBQUUsc0JBQTBDO0NBQ3ZELENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyIvKipcbiAqIEBsaWNlbnNlXG4gKiBDb3B5cmlnaHQgMjAyMCBHb29nbGUgTExDLiBBbGwgUmlnaHRzIFJlc2VydmVkLlxuICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlIFwiTGljZW5zZVwiKTtcbiAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS5cbiAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdFxuICpcbiAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMFxuICpcbiAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmVcbiAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuIFwiQVMgSVNcIiBCQVNJUyxcbiAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLlxuICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZFxuICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuXG4gKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuICovXG5cbmltcG9ydCB7YmFja2VuZF91dGlsLCBDb252M0RCYWNrcHJvcEZpbHRlclYyLCBDb252M0RCYWNrcHJvcEZpbHRlclYyQXR0cnMsIENvbnYzREJhY2twcm9wRmlsdGVyVjJJbnB1dHMsIEtlcm5lbENvbmZpZywgS2VybmVsRnVuY30gZnJvbSAnQHRlbnNvcmZsb3cvdGZqcy1jb3JlJztcblxuaW1wb3J0IHtNYXRoQmFja2VuZFdlYkdMfSBmcm9tICcuLi9iYWNrZW5kX3dlYmdsJztcbmltcG9ydCB7Q29udjNERGVyRmlsdGVyUHJvZ3JhbX0gZnJvbSAnLi4vY29udl9iYWNrcHJvcF9ncHUnO1xuXG5leHBvcnQgZnVuY3Rpb24gY29udjNEQmFja3Byb3BGaWx0ZXJWMihhcmdzOiB7XG4gIGlucHV0czogQ29udjNEQmFja3Byb3BGaWx0ZXJWMklucHV0cyxcbiAgYXR0cnM6IENvbnYzREJhY2twcm9wRmlsdGVyVjJBdHRycyxcbiAgYmFja2VuZDogTWF0aEJhY2tlbmRXZWJHTFxufSkge1xuICBjb25zdCB7aW5wdXRzLCBiYWNrZW5kLCBhdHRyc30gPSBhcmdzO1xuICBjb25zdCB7eCwgZHl9ID0gaW5wdXRzO1xuICBjb25zdCB7c3RyaWRlcywgcGFkLCBmaWx0ZXJTaGFwZX0gPSBhdHRycztcblxuICBjb25zdCBjb252SW5mbyA9IGJhY2tlbmRfdXRpbC5jb21wdXRlQ29udjNESW5mbyhcbiAgICAgIHguc2hhcGUgYXMgW251bWJlciwgbnVtYmVyLCBudW1iZXIsIG51bWJlciwgbnVtYmVyXSwgZmlsdGVyU2hhcGUsIHN0cmlkZXMsXG4gICAgICAxIC8qIGRpbGF0aW9ucyAqLywgcGFkKTtcblxuICBjb25zdCBwcm9ncmFtID0gbmV3IENvbnYzRERlckZpbHRlclByb2dyYW0oY29udkluZm8pO1xuICByZXR1cm4gYmFja2VuZC5ydW5XZWJHTFByb2dyYW0ocHJvZ3JhbSwgW3gsIGR5XSwgJ2Zsb2F0MzInKTtcbn1cblxuZXhwb3J0IGNvbnN0IGNvbnYzREJhY2twcm9wRmlsdGVyVjJDb25maWc6IEtlcm5lbENvbmZpZyA9IHtcbiAga2VybmVsTmFtZTogQ29udjNEQmFja3Byb3BGaWx0ZXJWMixcbiAgYmFja2VuZE5hbWU6ICd3ZWJnbCcsXG4gIGtlcm5lbEZ1bmM6IGNvbnYzREJhY2twcm9wRmlsdGVyVjIgYXMge30gYXMgS2VybmVsRnVuY1xufTtcbiJdfQ==","/**\n * @license\n * Copyright 2020 Google LLC. All Rights Reserved.\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n * =============================================================================\n */\nimport { backend_util, Conv3DBackpropInputV2 } from '@tensorflow/tfjs-core';\nimport { Conv3DDerInputProgram } from '../conv_backprop_gpu';\nexport function conv3DBackpropInput(args) {\n const { inputs, backend, attrs } = args;\n const { dy, filter } = inputs;\n const { pad, strides, inputShape } = attrs;\n const convInfo = backend_util.computeConv3DInfo(inputShape, filter.shape, strides, 1 /* dilations */, pad);\n const program = new Conv3DDerInputProgram(convInfo);\n return backend.runWebGLProgram(program, [dy, filter], 'float32');\n}\nexport const conv3DBackpropInputConfig = {\n kernelName: Conv3DBackpropInputV2,\n backendName: 'webgl',\n kernelFunc: conv3DBackpropInput,\n};\n//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiQ29udjNEQmFja3Byb3BJbnB1dFYyLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vLi4vdGZqcy1iYWNrZW5kLXdlYmdsL3NyYy9rZXJuZWxzL0NvbnYzREJhY2twcm9wSW5wdXRWMi50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQTs7Ozs7Ozs7Ozs7Ozs7O0dBZUc7QUFFSCxPQUFPLEVBQUMsWUFBWSxFQUFFLHFCQUFxQixFQUFvRixNQUFNLHVCQUF1QixDQUFDO0FBRzdKLE9BQU8sRUFBQyxxQkFBcUIsRUFBQyxNQUFNLHNCQUFzQixDQUFDO0FBRTNELE1BQU0sVUFBVSxtQkFBbUIsQ0FBQyxJQUluQztJQUNDLE1BQU0sRUFBQyxNQUFNLEVBQUUsT0FBTyxFQUFFLEtBQUssRUFBQyxHQUFHLElBQUksQ0FBQztJQUN0QyxNQUFNLEVBQUMsRUFBRSxFQUFFLE1BQU0sRUFBQyxHQUFHLE1BQU0sQ0FBQztJQUM1QixNQUFNLEVBQUMsR0FBRyxFQUFFLE9BQU8sRUFBRSxVQUFVLEVBQUMsR0FBRyxLQUFLLENBQUM7SUFFekMsTUFBTSxRQUFRLEdBQUcsWUFBWSxDQUFDLGlCQUFpQixDQUMzQyxVQUFVLEVBQUUsTUFBTSxDQUFDLEtBQWlELEVBQ3BFLE9BQU8sRUFBRSxDQUFDLENBQUMsZUFBZSxFQUFFLEdBQUcsQ0FBQyxDQUFDO0lBRXJDLE1BQU0sT0FBTyxHQUFHLElBQUkscUJBQXFCLENBQUMsUUFBUSxDQUFDLENBQUM7SUFDcEQsT0FBTyxPQUFPLENBQUMsZUFBZSxDQUFDLE9BQU8sRUFBRSxDQUFDLEVBQUUsRUFBRSxNQUFNLENBQUMsRUFBRSxTQUFTLENBQUMsQ0FBQztBQUNuRSxDQUFDO0FBRUQsTUFBTSxDQUFDLE1BQU0seUJBQXlCLEdBQWlCO0lBQ3JELFVBQVUsRUFBRSxxQkFBcUI7SUFDakMsV0FBVyxFQUFFLE9BQU87SUFDcEIsVUFBVSxFQUFFLG1CQUF1QztDQUNwRCxDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiLyoqXG4gKiBAbGljZW5zZVxuICogQ29weXJpZ2h0IDIwMjAgR29vZ2xlIExMQy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC5cbiAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSBcIkxpY2Vuc2VcIik7XG4gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuXG4gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXRcbiAqXG4gKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjBcbiAqXG4gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlXG4gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiBcIkFTIElTXCIgQkFTSVMsXG4gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC5cbiAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmRcbiAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLlxuICogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbiAqL1xuXG5pbXBvcnQge2JhY2tlbmRfdXRpbCwgQ29udjNEQmFja3Byb3BJbnB1dFYyLCBDb252M0RCYWNrcHJvcElucHV0VjJBdHRycywgQ29udjNEQmFja3Byb3BJbnB1dFYySW5wdXRzLCBLZXJuZWxDb25maWcsIEtlcm5lbEZ1bmN9IGZyb20gJ0B0ZW5zb3JmbG93L3RmanMtY29yZSc7XG5cbmltcG9ydCB7TWF0aEJhY2tlbmRXZWJHTH0gZnJvbSAnLi4vYmFja2VuZF93ZWJnbCc7XG5pbXBvcnQge0NvbnYzRERlcklucHV0UHJvZ3JhbX0gZnJvbSAnLi4vY29udl9iYWNrcHJvcF9ncHUnO1xuXG5leHBvcnQgZnVuY3Rpb24gY29udjNEQmFja3Byb3BJbnB1dChhcmdzOiB7XG4gIGlucHV0czogQ29udjNEQmFja3Byb3BJbnB1dFYySW5wdXRzLFxuICBhdHRyczogQ29udjNEQmFja3Byb3BJbnB1dFYyQXR0cnMsXG4gIGJhY2tlbmQ6IE1hdGhCYWNrZW5kV2ViR0xcbn0pIHtcbiAgY29uc3Qge2lucHV0cywgYmFja2VuZCwgYXR0cnN9ID0gYXJncztcbiAgY29uc3Qge2R5LCBmaWx0ZXJ9ID0gaW5wdXRzO1xuICBjb25zdCB7cGFkLCBzdHJpZGVzLCBpbnB1dFNoYXBlfSA9IGF0dHJzO1xuXG4gIGNvbnN0IGNvbnZJbmZvID0gYmFja2VuZF91dGlsLmNvbXB1dGVDb252M0RJbmZvKFxuICAgICAgaW5wdXRTaGFwZSwgZmlsdGVyLnNoYXBlIGFzIFtudW1iZXIsIG51bWJlciwgbnVtYmVyLCBudW1iZXIsIG51bWJlcl0sXG4gICAgICBzdHJpZGVzLCAxIC8qIGRpbGF0aW9ucyAqLywgcGFkKTtcblxuICBjb25zdCBwcm9ncmFtID0gbmV3IENvbnYzRERlcklucHV0UHJvZ3JhbShjb252SW5mbyk7XG4gIHJldHVybiBiYWNrZW5kLnJ1bldlYkdMUHJvZ3JhbShwcm9ncmFtLCBbZHksIGZpbHRlcl0sICdmbG9hdDMyJyk7XG59XG5cbmV4cG9ydCBjb25zdCBjb252M0RCYWNrcHJvcElucHV0Q29uZmlnOiBLZXJuZWxDb25maWcgPSB7XG4gIGtlcm5lbE5hbWU6IENvbnYzREJhY2twcm9wSW5wdXRWMixcbiAgYmFja2VuZE5hbWU6ICd3ZWJnbCcsXG4gIGtlcm5lbEZ1bmM6IGNvbnYzREJhY2twcm9wSW5wdXQgYXMge30gYXMgS2VybmVsRnVuYyxcbn07XG4iXX0=","/**\n * @license\n * Copyright 2020 Google LLC. All Rights Reserved.\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n * =============================================================================\n */\nimport { Cos } from '@tensorflow/tfjs-core';\nimport { CHECK_NAN_SNIPPET_UNARY, unaryKernelFunc } from '../kernel_utils/kernel_funcs_utils';\nconst COS = CHECK_NAN_SNIPPET_UNARY + `\n return cos(x);\n`;\nexport const cos = unaryKernelFunc({ opSnippet: COS });\nexport const cosConfig = {\n kernelName: Cos,\n backendName: 'webgl',\n kernelFunc: cos,\n};\n//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiQ29zLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vLi4vdGZqcy1iYWNrZW5kLXdlYmdsL3NyYy9rZXJuZWxzL0Nvcy50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQTs7Ozs7Ozs7Ozs7Ozs7O0dBZUc7QUFFSCxPQUFPLEVBQUMsR0FBRyxFQUFlLE1BQU0sdUJBQXVCLENBQUM7QUFFeEQsT0FBTyxFQUFDLHVCQUF1QixFQUFFLGVBQWUsRUFBQyxNQUFNLG9DQUFvQyxDQUFDO0FBRTVGLE1BQU0sR0FBRyxHQUFHLHVCQUF1QixHQUFHOztDQUVyQyxDQUFDO0FBRUYsTUFBTSxDQUFDLE1BQU0sR0FBRyxHQUFHLGVBQWUsQ0FBQyxFQUFDLFNBQVMsRUFBRSxHQUFHLEVBQUMsQ0FBQyxDQUFDO0FBRXJELE1BQU0sQ0FBQyxNQUFNLFNBQVMsR0FBaUI7SUFDckMsVUFBVSxFQUFFLEdBQUc7SUFDZixXQUFXLEVBQUUsT0FBTztJQUNwQixVQUFVLEVBQUUsR0FBRztDQUNoQixDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiLyoqXG4gKiBAbGljZW5zZVxuICogQ29weXJpZ2h0IDIwMjAgR29vZ2xlIExMQy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC5cbiAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSBcIkxpY2Vuc2VcIik7XG4gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuXG4gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXRcbiAqXG4gKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjBcbiAqXG4gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlXG4gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiBcIkFTIElTXCIgQkFTSVMsXG4gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC5cbiAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmRcbiAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLlxuICogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbiAqL1xuXG5pbXBvcnQge0NvcywgS2VybmVsQ29uZmlnfSBmcm9tICdAdGVuc29yZmxvdy90ZmpzLWNvcmUnO1xuXG5pbXBvcnQge0NIRUNLX05BTl9TTklQUEVUX1VOQVJZLCB1bmFyeUtlcm5lbEZ1bmN9IGZyb20gJy4uL2tlcm5lbF91dGlscy9rZXJuZWxfZnVuY3NfdXRpbHMnO1xuXG5jb25zdCBDT1MgPSBDSEVDS19OQU5fU05JUFBFVF9VTkFSWSArIGBcbiAgcmV0dXJuIGNvcyh4KTtcbmA7XG5cbmV4cG9ydCBjb25zdCBjb3MgPSB1bmFyeUtlcm5lbEZ1bmMoe29wU25pcHBldDogQ09TfSk7XG5cbmV4cG9ydCBjb25zdCBjb3NDb25maWc6IEtlcm5lbENvbmZpZyA9IHtcbiAga2VybmVsTmFtZTogQ29zLFxuICBiYWNrZW5kTmFtZTogJ3dlYmdsJyxcbiAga2VybmVsRnVuYzogY29zLFxufTtcbiJdfQ==","/**\n * @license\n * Copyright 2020 Google LLC. All Rights Reserved.\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n * =============================================================================\n */\nimport { Cosh } from '@tensorflow/tfjs-core';\nimport { unaryKernelFunc } from '../kernel_utils/kernel_funcs_utils';\nconst COSH = `\n float e2x = exp(-x);\n return (e2x + 1.0 / e2x) / 2.0;\n`;\nexport const cosh = unaryKernelFunc({ opSnippet: COSH });\nexport const coshConfig = {\n kernelName: Cosh,\n backendName: 'webgl',\n kernelFunc: cosh,\n};\n//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiQ29zaC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uLy4uL3RmanMtYmFja2VuZC13ZWJnbC9zcmMva2VybmVscy9Db3NoLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBOzs7Ozs7Ozs7Ozs7Ozs7R0FlRztBQUVILE9BQU8sRUFBQyxJQUFJLEVBQWUsTUFBTSx1QkFBdUIsQ0FBQztBQUN6RCxPQUFPLEVBQUMsZUFBZSxFQUFDLE1BQU0sb0NBQW9DLENBQUM7QUFFbkUsTUFBTSxJQUFJLEdBQUc7OztDQUdaLENBQUM7QUFFRixNQUFNLENBQUMsTUFBTSxJQUFJLEdBQUcsZUFBZSxDQUFDLEVBQUMsU0FBUyxFQUFFLElBQUksRUFBQyxDQUFDLENBQUM7QUFFdkQsTUFBTSxDQUFDLE1BQU0sVUFBVSxHQUFpQjtJQUN0QyxVQUFVLEVBQUUsSUFBSTtJQUNoQixXQUFXLEVBQUUsT0FBTztJQUNwQixVQUFVLEVBQUUsSUFBSTtDQUNqQixDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiLyoqXG4gKiBAbGljZW5zZVxuICogQ29weXJpZ2h0IDIwMjAgR29vZ2xlIExMQy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC5cbiAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSBcIkxpY2Vuc2VcIik7XG4gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuXG4gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXRcbiAqXG4gKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjBcbiAqXG4gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlXG4gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiBcIkFTIElTXCIgQkFTSVMsXG4gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC5cbiAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmRcbiAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLlxuICogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbiAqL1xuXG5pbXBvcnQge0Nvc2gsIEtlcm5lbENvbmZpZ30gZnJvbSAnQHRlbnNvcmZsb3cvdGZqcy1jb3JlJztcbmltcG9ydCB7dW5hcnlLZXJuZWxGdW5jfSBmcm9tICcuLi9rZXJuZWxfdXRpbHMva2VybmVsX2Z1bmNzX3V0aWxzJztcblxuY29uc3QgQ09TSCA9IGBcbiAgZmxvYXQgZTJ4ID0gZXhwKC14KTtcbiAgcmV0dXJuIChlMnggKyAxLjAgLyBlMngpIC8gMi4wO1xuYDtcblxuZXhwb3J0IGNvbnN0IGNvc2ggPSB1bmFyeUtlcm5lbEZ1bmMoe29wU25pcHBldDogQ09TSH0pO1xuXG5leHBvcnQgY29uc3QgY29zaENvbmZpZzogS2VybmVsQ29uZmlnID0ge1xuICBrZXJuZWxOYW1lOiBDb3NoLFxuICBiYWNrZW5kTmFtZTogJ3dlYmdsJyxcbiAga2VybmVsRnVuYzogY29zaCxcbn07XG4iXX0=","/**\n * @license\n * Copyright 2017 Google LLC. All Rights Reserved.\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n * =============================================================================\n */\nexport class CropAndResizeProgram {\n constructor(imageShape, boxShape, cropSize, method, extrapolationValue) {\n this.variableNames = ['Image', 'Boxes', 'BoxInd'];\n this.outputShape = [];\n const [batch, imageHeight, imageWidth, depth] = imageShape;\n const [numBoxes,] = boxShape;\n const [cropHeight, cropWidth] = cropSize;\n this.outputShape = [numBoxes, cropHeight, cropWidth, depth];\n const methodId = method === 'bilinear' ? 1 : 0;\n const [inputHeightFloat, inputWidthFloat] = [`${imageHeight - 1}.0`, `${imageWidth - 1}.0`];\n const [heightRatio, heightScale, inY] = cropHeight > 1 ?\n [\n `${(imageHeight - 1) / (cropHeight - 1)}`,\n '(y2-y1) * height_ratio',\n `y1*${inputHeightFloat} + float(y)*(height_scale)`,\n ] :\n [\n '0.0',\n '0.0',\n `0.5 * (y1+y2) * ${inputHeightFloat}`,\n ];\n const [widthRatio, widthScale, inX] = cropWidth > 1 ?\n [\n `${(imageWidth - 1) / (cropWidth - 1)}`,\n '(x2-x1) * width_ratio',\n `x1*${inputWidthFloat} + float(x)*(width_scale)`,\n ] :\n [\n '0.0',\n '0.0',\n `0.5 * (x1+x2) * ${inputWidthFloat}`,\n ];\n // Reference implementation\n // tslint:disable-next-line:max-line-length\n // https://github.com/tensorflow/tensorflow/blob/master/tensorflow/core/kernels/crop_and_resize_op_gpu.cu.cc\n this.userCode = `\n const float height_ratio = float(${heightRatio});\n const float width_ratio = float(${widthRatio});\n void main() {\n ivec4 coords = getOutputCoords();\n int b = coords[0];\n int y = coords[1];\n int x = coords[2];\n int d = coords[3];\n\n // get box vals\n float y1 = getBoxes(b,0);\n float x1 = getBoxes(b,1);\n float y2 = getBoxes(b,2);\n float x2 = getBoxes(b,3);\n\n // get image in batch index\n int bInd = round(getBoxInd(b));\n if(bInd < 0 || bInd >= ${batch}) {\n return;\n }\n\n float height_scale = ${heightScale};\n float width_scale = ${widthScale};\n\n float in_y = ${inY};\n if( in_y < 0.0 || in_y > ${inputHeightFloat} ) {\n setOutput(float(${extrapolationValue}));\n return;\n }\n float in_x = ${inX};\n if( in_x < 0.0 || in_x > ${inputWidthFloat} ) {\n setOutput(float(${extrapolationValue}));\n return;\n }\n\n vec2 sourceFracIndexCR = vec2(in_x,in_y);\n if(${methodId} == 1) {\n // Compute the four integer indices.\n ivec2 sourceFloorCR = ivec2(sourceFracIndexCR);\n ivec2 sourceCeilCR = ivec2(ceil(sourceFracIndexCR));\n\n float topLeft = getImage(b, sourceFloorCR.y, sourceFloorCR.x, d);\n float bottomLeft = getImage(b, sourceCeilCR.y, sourceFloorCR.x, d);\n float topRight = getImage(b, sourceFloorCR.y, sourceCeilCR.x, d);\n float bottomRight = getImage(b, sourceCeilCR.y, sourceCeilCR.x, d);\n\n vec2 fracCR = sourceFracIndexCR - vec2(sourceFloorCR);\n\n float top = topLeft + (topRight - topLeft) * fracCR.x;\n float bottom = bottomLeft + (bottomRight - bottomLeft) * fracCR.x;\n float newValue = top + (bottom - top) * fracCR.y;\n setOutput(newValue);\n } else {\n // Compute the coordinators of nearest neighbor point.\n ivec2 sourceNearestCR = ivec2(floor(\n sourceFracIndexCR + vec2(0.5,0.5)));\n float newValue = getImage(b, sourceNearestCR.y, sourceNearestCR.x, d);\n setOutput(newValue);\n }\n }\n `;\n }\n}\n//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY3JvcF9hbmRfcmVzaXplX2dwdS5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uL3RmanMtYmFja2VuZC13ZWJnbC9zcmMvY3JvcF9hbmRfcmVzaXplX2dwdS50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQTs7Ozs7Ozs7Ozs7Ozs7O0dBZUc7QUFJSCxNQUFNLE9BQU8sb0JBQW9CO0lBSy9CLFlBQ0ksVUFBNEMsRUFBRSxRQUEwQixFQUN4RSxRQUEwQixFQUFFLE1BQTRCLEVBQ3hELGtCQUEwQjtRQVA5QixrQkFBYSxHQUFHLENBQUMsT0FBTyxFQUFFLE9BQU8sRUFBRSxRQUFRLENBQUMsQ0FBQztRQUM3QyxnQkFBVyxHQUFhLEVBQUUsQ0FBQztRQU96QixNQUFNLENBQUMsS0FBSyxFQUFFLFdBQVcsRUFBRSxVQUFVLEVBQUUsS0FBSyxDQUFDLEdBQUcsVUFBVSxDQUFDO1FBQzNELE1BQU0sQ0FBQyxRQUFRLEVBQUcsR0FBRyxRQUFRLENBQUM7UUFDOUIsTUFBTSxDQUFDLFVBQVUsRUFBRSxTQUFTLENBQUMsR0FBRyxRQUFRLENBQUM7UUFDekMsSUFBSSxDQUFDLFdBQVcsR0FBRyxDQUFDLFFBQVEsRUFBRSxVQUFVLEVBQUUsU0FBUyxFQUFFLEtBQUssQ0FBQyxDQUFDO1FBQzVELE1BQU0sUUFBUSxHQUFHLE1BQU0sS0FBSyxVQUFVLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDO1FBRS9DLE1BQU0sQ0FBQyxnQkFBZ0IsRUFBRSxlQUFlLENBQUMsR0FDckMsQ0FBQyxHQUFHLFdBQVcsR0FBRyxDQUFDLElBQUksRUFBRSxHQUFHLFVBQVUsR0FBRyxDQUFDLElBQUksQ0FBQyxDQUFDO1FBRXBELE1BQU0sQ0FBQyxXQUFXLEVBQUUsV0FBVyxFQUFFLEdBQUcsQ0FBQyxHQUFHLFVBQVUsR0FBRyxDQUFDLENBQUMsQ0FBQztZQUNwRDtnQkFDRSxHQUFHLENBQUMsV0FBVyxHQUFHLENBQUMsQ0FBQyxHQUFHLENBQUMsVUFBVSxHQUFHLENBQUMsQ0FBQyxFQUFFO2dCQUN6Qyx3QkFBd0I7Z0JBQ3hCLE1BQU0sZ0JBQWdCLDRCQUE0QjthQUNuRCxDQUFDLENBQUM7WUFDSDtnQkFDRSxLQUFLO2dCQUNMLEtBQUs7Z0JBQ0wsbUJBQW1CLGdCQUFnQixFQUFFO2FBQ3RDLENBQUM7UUFDTixNQUFNLENBQUMsVUFBVSxFQUFFLFVBQVUsRUFBRSxHQUFHLENBQUMsR0FBRyxTQUFTLEdBQUcsQ0FBQyxDQUFDLENBQUM7WUFDakQ7Z0JBQ0UsR0FBRyxDQUFDLFVBQVUsR0FBRyxDQUFDLENBQUMsR0FBRyxDQUFDLFNBQVMsR0FBRyxDQUFDLENBQUMsRUFBRTtnQkFDdkMsdUJBQXVCO2dCQUN2QixNQUFNLGVBQWUsMkJBQTJCO2FBQ2pELENBQUMsQ0FBQztZQUNIO2dCQUNFLEtBQUs7Z0JBQ0wsS0FBSztnQkFDTCxtQkFBbUIsZUFBZSxFQUFFO2FBQ3JDLENBQUM7UUFFTiwyQkFBMkI7UUFDM0IsMkNBQTJDO1FBQzNDLDRHQUE0RztRQUM1RyxJQUFJLENBQUMsUUFBUSxHQUFHO3lDQUNxQixXQUFXO3dDQUNaLFVBQVU7Ozs7Ozs7Ozs7Ozs7Ozs7aUNBZ0JqQixLQUFLOzs7OytCQUlQLFdBQVc7OEJBQ1osVUFBVTs7dUJBRWpCLEdBQUc7bUNBQ1MsZ0JBQWdCOzRCQUN2QixrQkFBa0I7Ozt1QkFHdkIsR0FBRzttQ0FDUyxlQUFlOzRCQUN0QixrQkFBa0I7Ozs7O2FBS2pDLFFBQVE7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7OztLQXdCaEIsQ0FBQztJQUNKLENBQUM7Q0FDRiIsInNvdXJjZXNDb250ZW50IjpbIi8qKlxuICogQGxpY2Vuc2VcbiAqIENvcHlyaWdodCAyMDE3IEdvb2dsZSBMTEMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuXG4gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgXCJMaWNlbnNlXCIpO1xuICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLlxuICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0XG4gKlxuICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wXG4gKlxuICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZVxuICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gXCJBUyBJU1wiIEJBU0lTLFxuICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuXG4gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kXG4gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS5cbiAqID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4gKi9cblxuaW1wb3J0IHtHUEdQVVByb2dyYW19IGZyb20gJy4vZ3BncHVfbWF0aCc7XG5cbmV4cG9ydCBjbGFzcyBDcm9wQW5kUmVzaXplUHJvZ3JhbSBpbXBsZW1lbnRzIEdQR1BVUHJvZ3JhbSB7XG4gIHZhcmlhYmxlTmFtZXMgPSBbJ0ltYWdlJywgJ0JveGVzJywgJ0JveEluZCddO1xuICBvdXRwdXRTaGFwZTogbnVtYmVyW10gPSBbXTtcbiAgdXNlckNvZGU6IHN0cmluZztcblxuICBjb25zdHJ1Y3RvcihcbiAgICAgIGltYWdlU2hhcGU6IFtudW1iZXIsIG51bWJlciwgbnVtYmVyLCBudW1iZXJdLCBib3hTaGFwZTogW251bWJlciwgbnVtYmVyXSxcbiAgICAgIGNyb3BTaXplOiBbbnVtYmVyLCBudW1iZXJdLCBtZXRob2Q6ICdiaWxpbmVhcid8J25lYXJlc3QnLFxuICAgICAgZXh0cmFwb2xhdGlvblZhbHVlOiBudW1iZXIpIHtcbiAgICBjb25zdCBbYmF0Y2gsIGltYWdlSGVpZ2h0LCBpbWFnZVdpZHRoLCBkZXB0aF0gPSBpbWFnZVNoYXBlO1xuICAgIGNvbnN0IFtudW1Cb3hlcywgXSA9IGJveFNoYXBlO1xuICAgIGNvbnN0IFtjcm9wSGVpZ2h0LCBjcm9wV2lkdGhdID0gY3JvcFNpemU7XG4gICAgdGhpcy5vdXRwdXRTaGFwZSA9IFtudW1Cb3hlcywgY3JvcEhlaWdodCwgY3JvcFdpZHRoLCBkZXB0aF07XG4gICAgY29uc3QgbWV0aG9kSWQgPSBtZXRob2QgPT09ICdiaWxpbmVhcicgPyAxIDogMDtcblxuICAgIGNvbnN0IFtpbnB1dEhlaWdodEZsb2F0LCBpbnB1dFdpZHRoRmxvYXRdID1cbiAgICAgICAgW2Ake2ltYWdlSGVpZ2h0IC0gMX0uMGAsIGAke2ltYWdlV2lkdGggLSAxfS4wYF07XG5cbiAgICBjb25zdCBbaGVpZ2h0UmF0aW8sIGhlaWdodFNjYWxlLCBpblldID0gY3JvcEhlaWdodCA+IDEgP1xuICAgICAgICBbXG4gICAgICAgICAgYCR7KGltYWdlSGVpZ2h0IC0gMSkgLyAoY3JvcEhlaWdodCAtIDEpfWAsXG4gICAgICAgICAgJyh5Mi15MSkgKiBoZWlnaHRfcmF0aW8nLFxuICAgICAgICAgIGB5MSoke2lucHV0SGVpZ2h0RmxvYXR9ICsgZmxvYXQoeSkqKGhlaWdodF9zY2FsZSlgLFxuICAgICAgICBdIDpcbiAgICAgICAgW1xuICAgICAgICAgICcwLjAnLFxuICAgICAgICAgICcwLjAnLFxuICAgICAgICAgIGAwLjUgKiAoeTEreTIpICogJHtpbnB1dEhlaWdodEZsb2F0fWAsXG4gICAgICAgIF07XG4gICAgY29uc3QgW3dpZHRoUmF0aW8sIHdpZHRoU2NhbGUsIGluWF0gPSBjcm9wV2lkdGggPiAxID9cbiAgICAgICAgW1xuICAgICAgICAgIGAkeyhpbWFnZVdpZHRoIC0gMSkgLyAoY3JvcFdpZHRoIC0gMSl9YCxcbiAgICAgICAgICAnKHgyLXgxKSAqIHdpZHRoX3JhdGlvJyxcbiAgICAgICAgICBgeDEqJHtpbnB1dFdpZHRoRmxvYXR9ICsgZmxvYXQoeCkqKHdpZHRoX3NjYWxlKWAsXG4gICAgICAgIF0gOlxuICAgICAgICBbXG4gICAgICAgICAgJzAuMCcsXG4gICAgICAgICAgJzAuMCcsXG4gICAgICAgICAgYDAuNSAqICh4MSt4MikgKiAke2lucHV0V2lkdGhGbG9hdH1gLFxuICAgICAgICBdO1xuXG4gICAgLy8gUmVmZXJlbmNlIGltcGxlbWVudGF0aW9uXG4gICAgLy8gdHNsaW50OmRpc2FibGUtbmV4dC1saW5lOm1heC1saW5lLWxlbmd0aFxuICAgIC8vIGh0dHBzOi8vZ2l0aHViLmNvbS90ZW5zb3JmbG93L3RlbnNvcmZsb3cvYmxvYi9tYXN0ZXIvdGVuc29yZmxvdy9jb3JlL2tlcm5lbHMvY3JvcF9hbmRfcmVzaXplX29wX2dwdS5jdS5jY1xuICAgIHRoaXMudXNlckNvZGUgPSBgXG4gICAgICBjb25zdCBmbG9hdCBoZWlnaHRfcmF0aW8gPSBmbG9hdCgke2hlaWdodFJhdGlvfSk7XG4gICAgICBjb25zdCBmbG9hdCB3aWR0aF9yYXRpbyA9IGZsb2F0KCR7d2lkdGhSYXRpb30pO1xuICAgICAgdm9pZCBtYWluKCkge1xuICAgICAgICBpdmVjNCBjb29yZHMgPSBnZXRPdXRwdXRDb29yZHMoKTtcbiAgICAgICAgaW50IGIgPSBjb29yZHNbMF07XG4gICAgICAgIGludCB5ID0gY29vcmRzWzFdO1xuICAgICAgICBpbnQgeCA9IGNvb3Jkc1syXTtcbiAgICAgICAgaW50IGQgPSBjb29yZHNbM107XG5cbiAgICAgICAgLy8gZ2V0IGJveCB2YWxzXG4gICAgICAgIGZsb2F0IHkxID0gZ2V0Qm94ZXMoYiwwKTtcbiAgICAgICAgZmxvYXQgeDEgPSBnZXRCb3hlcyhiLDEpO1xuICAgICAgICBmbG9hdCB5MiA9IGdldEJveGVzKGIsMik7XG4gICAgICAgIGZsb2F0IHgyID0gZ2V0Qm94ZXMoYiwzKTtcblxuICAgICAgICAvLyBnZXQgaW1hZ2UgaW4gYmF0Y2ggaW5kZXhcbiAgICAgICAgaW50IGJJbmQgPSByb3VuZChnZXRCb3hJbmQoYikpO1xuICAgICAgICBpZihiSW5kIDwgMCB8fCBiSW5kID49ICR7YmF0Y2h9KSB7XG4gICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG5cbiAgICAgICAgZmxvYXQgaGVpZ2h0X3NjYWxlID0gJHtoZWlnaHRTY2FsZX07XG4gICAgICAgIGZsb2F0IHdpZHRoX3NjYWxlID0gJHt3aWR0aFNjYWxlfTtcblxuICAgICAgICBmbG9hdCBpbl95ID0gJHtpbll9O1xuICAgICAgICBpZiggaW5feSA8IDAuMCB8fCBpbl95ID4gJHtpbnB1dEhlaWdodEZsb2F0fSApIHtcbiAgICAgICAgICBzZXRPdXRwdXQoZmxvYXQoJHtleHRyYXBvbGF0aW9uVmFsdWV9KSk7XG4gICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG4gICAgICAgIGZsb2F0IGluX3ggPSAke2luWH07XG4gICAgICAgIGlmKCBpbl94IDwgMC4wIHx8IGluX3ggPiAke2lucHV0V2lkdGhGbG9hdH0gKSB7XG4gICAgICAgICAgc2V0T3V0cHV0KGZsb2F0KCR7ZXh0cmFwb2xhdGlvblZhbHVlfSkpO1xuICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuXG4gICAgICAgIHZlYzIgc291cmNlRnJhY0luZGV4Q1IgPSB2ZWMyKGluX3gsaW5feSk7XG4gICAgICAgIGlmKCR7bWV0aG9kSWR9ID09IDEpIHtcbiAgICAgICAgICAvLyBDb21wdXRlIHRoZSBmb3VyIGludGVnZXIgaW5kaWNlcy5cbiAgICAgICAgICBpdmVjMiBzb3VyY2VGbG9vckNSID0gaXZlYzIoc291cmNlRnJhY0luZGV4Q1IpO1xuICAgICAgICAgIGl2ZWMyIHNvdXJjZUNlaWxDUiA9IGl2ZWMyKGNlaWwoc291cmNlRnJhY0luZGV4Q1IpKTtcblxuICAgICAgICAgIGZsb2F0IHRvcExlZnQgPSBnZXRJbWFnZShiLCBzb3VyY2VGbG9vckNSLnksIHNvdXJjZUZsb29yQ1IueCwgZCk7XG4gICAgICAgICAgZmxvYXQgYm90dG9tTGVmdCA9IGdldEltYWdlKGIsIHNvdXJjZUNlaWxDUi55LCBzb3VyY2VGbG9vckNSLngsIGQpO1xuICAgICAgICAgIGZsb2F0IHRvcFJpZ2h0ID0gZ2V0SW1hZ2UoYiwgc291cmNlRmxvb3JDUi55LCBzb3VyY2VDZWlsQ1IueCwgZCk7XG4gICAgICAgICAgZmxvYXQgYm90dG9tUmlnaHQgPSBnZXRJbWFnZShiLCBzb3VyY2VDZWlsQ1IueSwgc291cmNlQ2VpbENSLngsIGQpO1xuXG4gICAgICAgICAgdmVjMiBmcmFjQ1IgPSBzb3VyY2VGcmFjSW5kZXhDUiAtIHZlYzIoc291cmNlRmxvb3JDUik7XG5cbiAgICAgICAgICBmbG9hdCB0b3AgPSB0b3BMZWZ0ICsgKHRvcFJpZ2h0IC0gdG9wTGVmdCkgKiBmcmFjQ1IueDtcbiAgICAgICAgICBmbG9hdCBib3R0b20gPSBib3R0b21MZWZ0ICsgKGJvdHRvbVJpZ2h0IC0gYm90dG9tTGVmdCkgKiBmcmFjQ1IueDtcbiAgICAgICAgICBmbG9hdCBuZXdWYWx1ZSA9IHRvcCArIChib3R0b20gLSB0b3ApICogZnJhY0NSLnk7XG4gICAgICAgICAgc2V0T3V0cHV0KG5ld1ZhbHVlKTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAvLyBDb21wdXRlIHRoZSBjb29yZGluYXRvcnMgb2YgbmVhcmVzdCBuZWlnaGJvciBwb2ludC5cbiAgICAgICAgICBpdmVjMiBzb3VyY2VOZWFyZXN0Q1IgPSBpdmVjMihmbG9vcihcbiAgICAgICAgICAgIHNvdXJjZUZyYWNJbmRleENSICsgdmVjMigwLjUsMC41KSkpO1xuICAgICAgICAgIGZsb2F0IG5ld1ZhbHVlID0gZ2V0SW1hZ2UoYiwgc291cmNlTmVhcmVzdENSLnksIHNvdXJjZU5lYXJlc3RDUi54LCBkKTtcbiAgICAgICAgICBzZXRPdXRwdXQobmV3VmFsdWUpO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgYDtcbiAgfVxufVxuIl19","/**\n * @license\n * Copyright 2020 Google LLC. All Rights Reserved.\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n * =============================================================================\n */\nimport { CropAndResize } from '@tensorflow/tfjs-core';\nimport { CropAndResizeProgram } from '../crop_and_resize_gpu';\nexport const cropAndResize = (args) => {\n const { inputs, backend, attrs } = args;\n const { image, boxes, boxInd } = inputs;\n const { cropSize, method, extrapolationValue } = attrs;\n const program = new CropAndResizeProgram(image.shape, boxes.shape, cropSize, method, extrapolationValue);\n return backend.runWebGLProgram(program, [image, boxes, boxInd], 'float32');\n};\nexport const cropAndResizeConfig = {\n kernelName: CropAndResize,\n backendName: 'webgl',\n kernelFunc: cropAndResize\n};\n//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiQ3JvcEFuZFJlc2l6ZS5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uLy4uL3RmanMtYmFja2VuZC13ZWJnbC9zcmMva2VybmVscy9Dcm9wQW5kUmVzaXplLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBOzs7Ozs7Ozs7Ozs7Ozs7R0FlRztBQUVILE9BQU8sRUFBQyxhQUFhLEVBQWdGLE1BQU0sdUJBQXVCLENBQUM7QUFHbkksT0FBTyxFQUFDLG9CQUFvQixFQUFDLE1BQU0sd0JBQXdCLENBQUM7QUFFNUQsTUFBTSxDQUFDLE1BQU0sYUFBYSxHQUFHLENBQUMsSUFJN0IsRUFBYyxFQUFFO0lBQ2YsTUFBTSxFQUFDLE1BQU0sRUFBRSxPQUFPLEVBQUUsS0FBSyxFQUFDLEdBQUcsSUFBSSxDQUFDO0lBQ3RDLE1BQU0sRUFBQyxLQUFLLEVBQUUsS0FBSyxFQUFFLE1BQU0sRUFBQyxHQUFHLE1BQU0sQ0FBQztJQUN0QyxNQUFNLEVBQUMsUUFBUSxFQUFFLE1BQU0sRUFBRSxrQkFBa0IsRUFBQyxHQUFHLEtBQUssQ0FBQztJQUVyRCxNQUFNLE9BQU8sR0FBRyxJQUFJLG9CQUFvQixDQUNwQyxLQUFLLENBQUMsS0FBeUMsRUFDL0MsS0FBSyxDQUFDLEtBQXlCLEVBQUUsUUFBUSxFQUFFLE1BQU0sRUFBRSxrQkFBa0IsQ0FBQyxDQUFDO0lBQzNFLE9BQU8sT0FBTyxDQUFDLGVBQWUsQ0FBQyxPQUFPLEVBQUUsQ0FBQyxLQUFLLEVBQUUsS0FBSyxFQUFFLE1BQU0sQ0FBQyxFQUFFLFNBQVMsQ0FBQyxDQUFDO0FBQzdFLENBQUMsQ0FBQztBQUVGLE1BQU0sQ0FBQyxNQUFNLG1CQUFtQixHQUFpQjtJQUMvQyxVQUFVLEVBQUUsYUFBYTtJQUN6QixXQUFXLEVBQUUsT0FBTztJQUNwQixVQUFVLEVBQUUsYUFBaUM7Q0FDOUMsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbIi8qKlxuICogQGxpY2Vuc2VcbiAqIENvcHlyaWdodCAyMDIwIEdvb2dsZSBMTEMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuXG4gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgXCJMaWNlbnNlXCIpO1xuICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLlxuICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0XG4gKlxuICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wXG4gKlxuICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZVxuICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gXCJBUyBJU1wiIEJBU0lTLFxuICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuXG4gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kXG4gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS5cbiAqID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4gKi9cblxuaW1wb3J0IHtDcm9wQW5kUmVzaXplLCBDcm9wQW5kUmVzaXplQXR0cnMsIENyb3BBbmRSZXNpemVJbnB1dHMsIEtlcm5lbENvbmZpZywgS2VybmVsRnVuYywgVGVuc29ySW5mb30gZnJvbSAnQHRlbnNvcmZsb3cvdGZqcy1jb3JlJztcblxuaW1wb3J0IHtNYXRoQmFja2VuZFdlYkdMfSBmcm9tICcuLi9iYWNrZW5kX3dlYmdsJztcbmltcG9ydCB7Q3JvcEFuZFJlc2l6ZVByb2dyYW19IGZyb20gJy4uL2Nyb3BfYW5kX3Jlc2l6ZV9ncHUnO1xuXG5leHBvcnQgY29uc3QgY3JvcEFuZFJlc2l6ZSA9IChhcmdzOiB7XG4gIGlucHV0czogQ3JvcEFuZFJlc2l6ZUlucHV0cyxcbiAgYmFja2VuZDogTWF0aEJhY2tlbmRXZWJHTCxcbiAgYXR0cnM6IENyb3BBbmRSZXNpemVBdHRyc1xufSk6IFRlbnNvckluZm8gPT4ge1xuICBjb25zdCB7aW5wdXRzLCBiYWNrZW5kLCBhdHRyc30gPSBhcmdzO1xuICBjb25zdCB7aW1hZ2UsIGJveGVzLCBib3hJbmR9ID0gaW5wdXRzO1xuICBjb25zdCB7Y3JvcFNpemUsIG1ldGhvZCwgZXh0cmFwb2xhdGlvblZhbHVlfSA9IGF0dHJzO1xuXG4gIGNvbnN0IHByb2dyYW0gPSBuZXcgQ3JvcEFuZFJlc2l6ZVByb2dyYW0oXG4gICAgICBpbWFnZS5zaGFwZSBhcyBbbnVtYmVyLCBudW1iZXIsIG51bWJlciwgbnVtYmVyXSxcbiAgICAgIGJveGVzLnNoYXBlIGFzIFtudW1iZXIsIG51bWJlcl0sIGNyb3BTaXplLCBtZXRob2QsIGV4dHJhcG9sYXRpb25WYWx1ZSk7XG4gIHJldHVybiBiYWNrZW5kLnJ1bldlYkdMUHJvZ3JhbShwcm9ncmFtLCBbaW1hZ2UsIGJveGVzLCBib3hJbmRdLCAnZmxvYXQzMicpO1xufTtcblxuZXhwb3J0IGNvbnN0IGNyb3BBbmRSZXNpemVDb25maWc6IEtlcm5lbENvbmZpZyA9IHtcbiAga2VybmVsTmFtZTogQ3JvcEFuZFJlc2l6ZSxcbiAgYmFja2VuZE5hbWU6ICd3ZWJnbCcsXG4gIGtlcm5lbEZ1bmM6IGNyb3BBbmRSZXNpemUgYXMge30gYXMgS2VybmVsRnVuY1xufTtcbiJdfQ==","import { getCoordsDataType } from './shader_compiler';\nexport var CumOpType;\n(function (CumOpType) {\n CumOpType[\"Prod\"] = \"*\";\n CumOpType[\"Sum\"] = \"+\";\n})(CumOpType || (CumOpType = {}));\nexport class CumProgram {\n constructor(op, outputShape, exclusive, reverse) {\n this.op = op;\n this.outputShape = outputShape;\n this.variableNames = ['x'];\n this.customUniforms = [{ name: 'index', type: 'float' }];\n const rank = this.outputShape.length;\n const initVal = this.op === CumOpType.Prod ? '1.0' : '0.0';\n const val = exclusive ? initVal : `getX(${getCoords(rank, 'coords', this.op)})`;\n const length = this.outputShape[this.outputShape.length - 1];\n let condition = '';\n let idxString = '';\n // When exclusive is set, the cum op becomes roll op that copies the\n // value from the previous index based on the direction specified by the\n // reverse flag.\n if (exclusive) {\n condition = reverse ? `end != ${length - 1}` : 'end != 0';\n idxString = reverse ? 'end + 1' : 'end - 1';\n }\n else {\n condition = reverse ? `end + pow2 < ${length}` : 'end >= pow2';\n idxString = (reverse ? 'end + pow2' : 'end - pow2');\n }\n this.userCode = `\n void main() {\n ${getCoordsDataType(rank)} coords = getOutputCoords();\n int end = ${getFinalCoord(rank, 'coords', this.op)};\n float val = ${val};\n int pow2 = int(pow(2.0, index));\n if (${condition}) {\n int idx = ${idxString};\n ${getFinalCoord(rank, 'coords', this.op)} = idx;\n val ${this.op}= getX(${getCoords(rank, 'coords', this.op)});\n }\n setOutput(val);\n }\n `;\n }\n}\nfunction getCoords(rank, name, op) {\n if (rank === 1) {\n return `${name}`;\n }\n else if (rank === 2) {\n return `${name}.x, ${name}.y`;\n }\n else if (rank === 3) {\n return `${name}.x, ${name}.y, ${name}.z`;\n }\n else if (rank === 4) {\n return `${name}.x, ${name}.y, ${name}.z, ${name}.w`;\n }\n else {\n throw new Error(`Cumulative ${op} for rank ${rank} is not yet supported`);\n }\n}\nfunction getFinalCoord(rank, name, op) {\n if (rank === 1) {\n return `${name}`;\n }\n else if (rank === 2) {\n return `${name}.y`;\n }\n else if (rank === 3) {\n return `${name}.z`;\n }\n else if (rank === 4) {\n return `${name}.w`;\n }\n else {\n throw new Error(`Cumulative ${op} for rank ${rank} is not yet supported`);\n }\n}\n//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY3VtX2dwdS5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uL3RmanMtYmFja2VuZC13ZWJnbC9zcmMvY3VtX2dwdS50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFpQkEsT0FBTyxFQUFDLGlCQUFpQixFQUFjLE1BQU0sbUJBQW1CLENBQUM7QUFFakUsTUFBTSxDQUFOLElBQVksU0FHWDtBQUhELFdBQVksU0FBUztJQUNuQix1QkFBVSxDQUFBO0lBQ1Ysc0JBQVMsQ0FBQTtBQUNYLENBQUMsRUFIVyxTQUFTLEtBQVQsU0FBUyxRQUdwQjtBQUVELE1BQU0sT0FBTyxVQUFVO0lBS3JCLFlBQ1csRUFBYSxFQUFTLFdBQXFCLEVBQUUsU0FBa0IsRUFDdEUsT0FBZ0I7UUFEVCxPQUFFLEdBQUYsRUFBRSxDQUFXO1FBQVMsZ0JBQVcsR0FBWCxXQUFXLENBQVU7UUFMdEQsa0JBQWEsR0FBRyxDQUFDLEdBQUcsQ0FBQyxDQUFDO1FBRXRCLG1CQUFjLEdBQUcsQ0FBQyxFQUFDLElBQUksRUFBRSxPQUFPLEVBQUUsSUFBSSxFQUFFLE9BQXNCLEVBQUMsQ0FBQyxDQUFDO1FBSy9ELE1BQU0sSUFBSSxHQUFHLElBQUksQ0FBQyxXQUFXLENBQUMsTUFBTSxDQUFDO1FBQ3JDLE1BQU0sT0FBTyxHQUFHLElBQUksQ0FBQyxFQUFFLEtBQUssU0FBUyxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQyxLQUFLLENBQUM7UUFDM0QsTUFBTSxHQUFHLEdBQ0wsU0FBUyxDQUFDLENBQUMsQ0FBQyxPQUFPLENBQUMsQ0FBQyxDQUFDLFFBQVEsU0FBUyxDQUFDLElBQUksRUFBRSxRQUFRLEVBQUUsSUFBSSxDQUFDLEVBQUUsQ0FBQyxHQUFHLENBQUM7UUFDeEUsTUFBTSxNQUFNLEdBQUcsSUFBSSxDQUFDLFdBQVcsQ0FBQyxJQUFJLENBQUMsV0FBVyxDQUFDLE1BQU0sR0FBRyxDQUFDLENBQUMsQ0FBQztRQUM3RCxJQUFJLFNBQVMsR0FBRyxFQUFFLENBQUM7UUFDbkIsSUFBSSxTQUFTLEdBQUcsRUFBRSxDQUFDO1FBQ25CLG9FQUFvRTtRQUNwRSx3RUFBd0U7UUFDeEUsZ0JBQWdCO1FBQ2hCLElBQUksU0FBUyxFQUFFO1lBQ2IsU0FBUyxHQUFHLE9BQU8sQ0FBQyxDQUFDLENBQUMsVUFBVSxNQUFNLEdBQUcsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLFVBQVUsQ0FBQztZQUMxRCxTQUFTLEdBQUcsT0FBTyxDQUFDLENBQUMsQ0FBQyxTQUFTLENBQUMsQ0FBQyxDQUFDLFNBQVMsQ0FBQztTQUM3QzthQUFNO1lBQ0wsU0FBUyxHQUFHLE9BQU8sQ0FBQyxDQUFDLENBQUMsZ0JBQWdCLE1BQU0sRUFBRSxDQUFDLENBQUMsQ0FBQyxhQUFhLENBQUM7WUFDL0QsU0FBUyxHQUFHLENBQUMsT0FBTyxDQUFDLENBQUMsQ0FBQyxZQUFZLENBQUMsQ0FBQyxDQUFDLFlBQVksQ0FBQyxDQUFDO1NBQ3JEO1FBRUQsSUFBSSxDQUFDLFFBQVEsR0FBRzs7VUFFVixpQkFBaUIsQ0FBQyxJQUFJLENBQUM7b0JBQ2IsYUFBYSxDQUFDLElBQUksRUFBRSxRQUFRLEVBQUUsSUFBSSxDQUFDLEVBQUUsQ0FBQztzQkFDcEMsR0FBRzs7Y0FFWCxTQUFTO3NCQUNELFNBQVM7WUFDbkIsYUFBYSxDQUFDLElBQUksRUFBRSxRQUFRLEVBQUUsSUFBSSxDQUFDLEVBQUUsQ0FBQztnQkFDbEMsSUFBSSxDQUFDLEVBQUUsVUFBVSxTQUFTLENBQUMsSUFBSSxFQUFFLFFBQVEsRUFBRSxJQUFJLENBQUMsRUFBRSxDQUFDOzs7O0tBSTlELENBQUM7SUFDSixDQUFDO0NBQ0Y7QUFFRCxTQUFTLFNBQVMsQ0FBQyxJQUFZLEVBQUUsSUFBWSxFQUFFLEVBQWE7SUFDMUQsSUFBSSxJQUFJLEtBQUssQ0FBQyxFQUFFO1FBQ2QsT0FBTyxHQUFHLElBQUksRUFBRSxDQUFDO0tBQ2xCO1NBQU0sSUFBSSxJQUFJLEtBQUssQ0FBQyxFQUFFO1FBQ3JCLE9BQU8sR0FBRyxJQUFJLE9BQU8sSUFBSSxJQUFJLENBQUM7S0FDL0I7U0FBTSxJQUFJLElBQUksS0FBSyxDQUFDLEVBQUU7UUFDckIsT0FBTyxHQUFHLElBQUksT0FBTyxJQUFJLE9BQU8sSUFBSSxJQUFJLENBQUM7S0FDMUM7U0FBTSxJQUFJLElBQUksS0FBSyxDQUFDLEVBQUU7UUFDckIsT0FBTyxHQUFHLElBQUksT0FBTyxJQUFJLE9BQU8sSUFBSSxPQUFPLElBQUksSUFBSSxDQUFDO0tBQ3JEO1NBQU07UUFDTCxNQUFNLElBQUksS0FBSyxDQUFDLGNBQWMsRUFBRSxhQUFhLElBQUksdUJBQXVCLENBQUMsQ0FBQztLQUMzRTtBQUNILENBQUM7QUFFRCxTQUFTLGFBQWEsQ0FBQyxJQUFZLEVBQUUsSUFBWSxFQUFFLEVBQWE7SUFDOUQsSUFBSSxJQUFJLEtBQUssQ0FBQyxFQUFFO1FBQ2QsT0FBTyxHQUFHLElBQUksRUFBRSxDQUFDO0tBQ2xCO1NBQU0sSUFBSSxJQUFJLEtBQUssQ0FBQyxFQUFFO1FBQ3JCLE9BQU8sR0FBRyxJQUFJLElBQUksQ0FBQztLQUNwQjtTQUFNLElBQUksSUFBSSxLQUFLLENBQUMsRUFBRTtRQUNyQixPQUFPLEdBQUcsSUFBSSxJQUFJLENBQUM7S0FDcEI7U0FBTSxJQUFJLElBQUksS0FBSyxDQUFDLEVBQUU7UUFDckIsT0FBTyxHQUFHLElBQUksSUFBSSxDQUFDO0tBQ3BCO1NBQU07UUFDTCxNQUFNLElBQUksS0FBSyxDQUFDLGNBQWMsRUFBRSxhQUFhLElBQUksdUJBQXVCLENBQUMsQ0FBQztLQUMzRTtBQUNILENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyIvKipcbiAqIEBsaWNlbnNlXG4gKiBDb3B5cmlnaHQgMjAyMiBHb29nbGUgTExDLiBBbGwgUmlnaHRzIFJlc2VydmVkLlxuICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlIFwiTGljZW5zZVwiKTtcbiAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS5cbiAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdFxuICpcbiAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMFxuICpcbiAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmVcbiAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuIFwiQVMgSVNcIiBCQVNJUyxcbiAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLlxuICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZFxuICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuXG4gKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuICovXG5pbXBvcnQge0dQR1BVUHJvZ3JhbX0gZnJvbSAnLi9ncGdwdV9tYXRoJztcbmltcG9ydCB7Z2V0Q29vcmRzRGF0YVR5cGUsIFVuaWZvcm1UeXBlfSBmcm9tICcuL3NoYWRlcl9jb21waWxlcic7XG5cbmV4cG9ydCBlbnVtIEN1bU9wVHlwZSB7XG4gIFByb2QgPSAnKicsXG4gIFN1bSA9ICcrJyxcbn1cblxuZXhwb3J0IGNsYXNzIEN1bVByb2dyYW0gaW1wbGVtZW50cyBHUEdQVVByb2dyYW0ge1xuICB2YXJpYWJsZU5hbWVzID0gWyd4J107XG4gIHVzZXJDb2RlOiBzdHJpbmc7XG4gIGN1c3RvbVVuaWZvcm1zID0gW3tuYW1lOiAnaW5kZXgnLCB0eXBlOiAnZmxvYXQnIGFzIFVuaWZvcm1UeXBlfV07XG5cbiAgY29uc3RydWN0b3IoXG4gICAgICBwdWJsaWMgb3A6IEN1bU9wVHlwZSwgcHVibGljIG91dHB1dFNoYXBlOiBudW1iZXJbXSwgZXhjbHVzaXZlOiBib29sZWFuLFxuICAgICAgcmV2ZXJzZTogYm9vbGVhbikge1xuICAgIGNvbnN0IHJhbmsgPSB0aGlzLm91dHB1dFNoYXBlLmxlbmd0aDtcbiAgICBjb25zdCBpbml0VmFsID0gdGhpcy5vcCA9PT0gQ3VtT3BUeXBlLlByb2QgPyAnMS4wJyA6ICcwLjAnO1xuICAgIGNvbnN0IHZhbCA9XG4gICAgICAgIGV4Y2x1c2l2ZSA/IGluaXRWYWwgOiBgZ2V0WCgke2dldENvb3JkcyhyYW5rLCAnY29vcmRzJywgdGhpcy5vcCl9KWA7XG4gICAgY29uc3QgbGVuZ3RoID0gdGhpcy5vdXRwdXRTaGFwZVt0aGlzLm91dHB1dFNoYXBlLmxlbmd0aCAtIDFdO1xuICAgIGxldCBjb25kaXRpb24gPSAnJztcbiAgICBsZXQgaWR4U3RyaW5nID0gJyc7XG4gICAgLy8gV2hlbiBleGNsdXNpdmUgaXMgc2V0LCB0aGUgY3VtIG9wIGJlY29tZXMgcm9sbCBvcCB0aGF0IGNvcGllcyB0aGVcbiAgICAvLyB2YWx1ZSBmcm9tIHRoZSBwcmV2aW91cyBpbmRleCBiYXNlZCBvbiB0aGUgZGlyZWN0aW9uIHNwZWNpZmllZCBieSB0aGVcbiAgICAvLyByZXZlcnNlIGZsYWcuXG4gICAgaWYgKGV4Y2x1c2l2ZSkge1xuICAgICAgY29uZGl0aW9uID0gcmV2ZXJzZSA/IGBlbmQgIT0gJHtsZW5ndGggLSAxfWAgOiAnZW5kICE9IDAnO1xuICAgICAgaWR4U3RyaW5nID0gcmV2ZXJzZSA/ICdlbmQgKyAxJyA6ICdlbmQgLSAxJztcbiAgICB9IGVsc2Uge1xuICAgICAgY29uZGl0aW9uID0gcmV2ZXJzZSA/IGBlbmQgKyBwb3cyIDwgJHtsZW5ndGh9YCA6ICdlbmQgPj0gcG93Mic7XG4gICAgICBpZHhTdHJpbmcgPSAocmV2ZXJzZSA/ICdlbmQgKyBwb3cyJyA6ICdlbmQgLSBwb3cyJyk7XG4gICAgfVxuXG4gICAgdGhpcy51c2VyQ29kZSA9IGBcbiAgICAgIHZvaWQgbWFpbigpIHtcbiAgICAgICAgJHtnZXRDb29yZHNEYXRhVHlwZShyYW5rKX0gY29vcmRzID0gZ2V0T3V0cHV0Q29vcmRzKCk7XG4gICAgICAgIGludCBlbmQgPSAke2dldEZpbmFsQ29vcmQocmFuaywgJ2Nvb3JkcycsIHRoaXMub3ApfTtcbiAgICAgICAgZmxvYXQgdmFsID0gJHt2YWx9O1xuICAgICAgICBpbnQgcG93MiA9IGludChwb3coMi4wLCBpbmRleCkpO1xuICAgICAgICBpZiAoJHtjb25kaXRpb259KSB7XG4gICAgICAgICAgaW50IGlkeCA9ICR7aWR4U3RyaW5nfTtcbiAgICAgICAgICAke2dldEZpbmFsQ29vcmQocmFuaywgJ2Nvb3JkcycsIHRoaXMub3ApfSA9IGlkeDtcbiAgICAgICAgICB2YWwgJHt0aGlzLm9wfT0gZ2V0WCgke2dldENvb3JkcyhyYW5rLCAnY29vcmRzJywgdGhpcy5vcCl9KTtcbiAgICAgICAgfVxuICAgICAgICBzZXRPdXRwdXQodmFsKTtcbiAgICAgIH1cbiAgICBgO1xuICB9XG59XG5cbmZ1bmN0aW9uIGdldENvb3JkcyhyYW5rOiBudW1iZXIsIG5hbWU6IHN0cmluZywgb3A6IEN1bU9wVHlwZSk6IHN0cmluZyB7XG4gIGlmIChyYW5rID09PSAxKSB7XG4gICAgcmV0dXJuIGAke25hbWV9YDtcbiAgfSBlbHNlIGlmIChyYW5rID09PSAyKSB7XG4gICAgcmV0dXJuIGAke25hbWV9LngsICR7bmFtZX0ueWA7XG4gIH0gZWxzZSBpZiAocmFuayA9PT0gMykge1xuICAgIHJldHVybiBgJHtuYW1lfS54LCAke25hbWV9LnksICR7bmFtZX0uemA7XG4gIH0gZWxzZSBpZiAocmFuayA9PT0gNCkge1xuICAgIHJldHVybiBgJHtuYW1lfS54LCAke25hbWV9LnksICR7bmFtZX0ueiwgJHtuYW1lfS53YDtcbiAgfSBlbHNlIHtcbiAgICB0aHJvdyBuZXcgRXJyb3IoYEN1bXVsYXRpdmUgJHtvcH0gZm9yIHJhbmsgJHtyYW5rfSBpcyBub3QgeWV0IHN1cHBvcnRlZGApO1xuICB9XG59XG5cbmZ1bmN0aW9uIGdldEZpbmFsQ29vcmQocmFuazogbnVtYmVyLCBuYW1lOiBzdHJpbmcsIG9wOiBDdW1PcFR5cGUpOiBzdHJpbmcge1xuICBpZiAocmFuayA9PT0gMSkge1xuICAgIHJldHVybiBgJHtuYW1lfWA7XG4gIH0gZWxzZSBpZiAocmFuayA9PT0gMikge1xuICAgIHJldHVybiBgJHtuYW1lfS55YDtcbiAgfSBlbHNlIGlmIChyYW5rID09PSAzKSB7XG4gICAgcmV0dXJuIGAke25hbWV9LnpgO1xuICB9IGVsc2UgaWYgKHJhbmsgPT09IDQpIHtcbiAgICByZXR1cm4gYCR7bmFtZX0ud2A7XG4gIH0gZWxzZSB7XG4gICAgdGhyb3cgbmV3IEVycm9yKGBDdW11bGF0aXZlICR7b3B9IGZvciByYW5rICR7cmFua30gaXMgbm90IHlldCBzdXBwb3J0ZWRgKTtcbiAgfVxufVxuIl19","/**\n * @license\n * Copyright 2022 Google LLC. All Rights Reserved.\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n * =============================================================================\n */\nimport { backend_util } from '@tensorflow/tfjs-core';\nimport { CumProgram } from '../cum_gpu';\nimport { identity } from './Identity';\nimport { transpose } from './Transpose';\nexport function cumImpl(op, x, backend, axis, exclusive, reverse) {\n const xRank = x.shape.length;\n const permutation = backend_util.getAxesPermutation([axis], xRank);\n let permutedX = x;\n if (permutation != null) {\n permutedX = transpose({ inputs: { x }, backend, attrs: { perm: permutation } });\n }\n const permutedAxis = backend_util.getInnerMostAxes(1, xRank)[0];\n if (permutedAxis !== xRank - 1) {\n throw new Error(`WebGL cumprod shader expects an inner-most axis=${x.shape.length - 1} ` +\n `but got axis=${axis}`);\n }\n const size = permutedX.shape[permutedAxis];\n let result = identity({ inputs: { x: permutedX }, backend });\n // Use cum parallel algorithm, inspired by:\n // https://developer.nvidia.com/gpugems/gpugems3/part-vi-gpu-computing/chapter-39-parallel-prefix-sum-scan-cuda\n // Note: although the algorithm is called sum, it works for any associtative\n // operator with an identity.\n for (let i = 0; i <= Math.ceil(Math.log2(size)) - 1; i++) {\n const program = new CumProgram(op, permutedX.shape, false, reverse);\n const customValues = [[i]];\n const prevResult = result;\n result =\n backend.runWebGLProgram(program, [result], result.dtype, customValues);\n backend.disposeIntermediateTensorInfo(prevResult);\n }\n // For exclusive cum, shift the end result in the direction of product or sum\n // and add 1 for product or 0 for sum to the front index.\n if (exclusive) {\n const program = new CumProgram(op, permutedX.shape, exclusive, reverse);\n const prevResult = result;\n result = backend.runWebGLProgram(program, [result], result.dtype);\n backend.disposeIntermediateTensorInfo(prevResult);\n }\n if (permutation != null) {\n const reversePermutation = backend_util.getUndoAxesPermutation(permutation);\n const reverseTransposedResult = transpose({ inputs: { x: result }, backend, attrs: { perm: reversePermutation } });\n backend.disposeIntermediateTensorInfo(result);\n backend.disposeIntermediateTensorInfo(permutedX);\n return reverseTransposedResult;\n }\n return result;\n}\n//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiQ3VtX2ltcGwuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi8uLi90ZmpzLWJhY2tlbmQtd2ViZ2wvc3JjL2tlcm5lbHMvQ3VtX2ltcGwudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUE7Ozs7Ozs7Ozs7Ozs7OztHQWVHO0FBRUgsT0FBTyxFQUFDLFlBQVksRUFBYSxNQUFNLHVCQUF1QixDQUFDO0FBRy9ELE9BQU8sRUFBWSxVQUFVLEVBQUMsTUFBTSxZQUFZLENBQUM7QUFFakQsT0FBTyxFQUFDLFFBQVEsRUFBQyxNQUFNLFlBQVksQ0FBQztBQUNwQyxPQUFPLEVBQUMsU0FBUyxFQUFDLE1BQU0sYUFBYSxDQUFDO0FBRXRDLE1BQU0sVUFBVSxPQUFPLENBQ25CLEVBQWEsRUFBRSxDQUFhLEVBQUUsT0FBeUIsRUFBRSxJQUFZLEVBQ3JFLFNBQWtCLEVBQUUsT0FBZ0I7SUFDdEMsTUFBTSxLQUFLLEdBQUcsQ0FBQyxDQUFDLEtBQUssQ0FBQyxNQUFNLENBQUM7SUFDN0IsTUFBTSxXQUFXLEdBQUcsWUFBWSxDQUFDLGtCQUFrQixDQUFDLENBQUMsSUFBSSxDQUFDLEVBQUUsS0FBSyxDQUFDLENBQUM7SUFDbkUsSUFBSSxTQUFTLEdBQUcsQ0FBQyxDQUFDO0lBQ2xCLElBQUksV0FBVyxJQUFJLElBQUksRUFBRTtRQUN2QixTQUFTLEdBQUcsU0FBUyxDQUFDLEVBQUMsTUFBTSxFQUFFLEVBQUMsQ0FBQyxFQUFDLEVBQUUsT0FBTyxFQUFFLEtBQUssRUFBRSxFQUFDLElBQUksRUFBRSxXQUFXLEVBQUMsRUFBQyxDQUFDLENBQUM7S0FDM0U7SUFDRCxNQUFNLFlBQVksR0FBRyxZQUFZLENBQUMsZ0JBQWdCLENBQUMsQ0FBQyxFQUFFLEtBQUssQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDO0lBRWhFLElBQUksWUFBWSxLQUFLLEtBQUssR0FBRyxDQUFDLEVBQUU7UUFDOUIsTUFBTSxJQUFJLEtBQUssQ0FDWCxtREFDSSxDQUFDLENBQUMsS0FBSyxDQUFDLE1BQU0sR0FBRyxDQUFDLEdBQUc7WUFDekIsZ0JBQWdCLElBQUksRUFBRSxDQUFDLENBQUM7S0FDN0I7SUFDRCxNQUFNLElBQUksR0FBRyxTQUFTLENBQUMsS0FBSyxDQUFDLFlBQVksQ0FBQyxDQUFDO0lBQzNDLElBQUksTUFBTSxHQUFHLFFBQVEsQ0FBQyxFQUFDLE1BQU0sRUFBRSxFQUFDLENBQUMsRUFBRSxTQUFTLEVBQUMsRUFBRSxPQUFPLEVBQUMsQ0FBQyxDQUFDO0lBQ3pELDJDQUEyQztJQUMzQywrR0FBK0c7SUFDL0csNEVBQTRFO0lBQzVFLDZCQUE2QjtJQUU3QixLQUFLLElBQUksQ0FBQyxHQUFHLENBQUMsRUFBRSxDQUFDLElBQUksSUFBSSxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxDQUFDLEdBQUcsQ0FBQyxFQUFFLENBQUMsRUFBRSxFQUFFO1FBQ3hELE1BQU0sT0FBTyxHQUFHLElBQUksVUFBVSxDQUFDLEVBQUUsRUFBRSxTQUFTLENBQUMsS0FBSyxFQUFFLEtBQUssRUFBRSxPQUFPLENBQUMsQ0FBQztRQUNwRSxNQUFNLFlBQVksR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQztRQUMzQixNQUFNLFVBQVUsR0FBRyxNQUFNLENBQUM7UUFDMUIsTUFBTTtZQUNGLE9BQU8sQ0FBQyxlQUFlLENBQUMsT0FBTyxFQUFFLENBQUMsTUFBTSxDQUFDLEVBQUUsTUFBTSxDQUFDLEtBQUssRUFBRSxZQUFZLENBQUMsQ0FBQztRQUMzRSxPQUFPLENBQUMsNkJBQTZCLENBQUMsVUFBVSxDQUFDLENBQUM7S0FDbkQ7SUFDRCw2RUFBNkU7SUFDN0UseURBQXlEO0lBQ3pELElBQUksU0FBUyxFQUFFO1FBQ2IsTUFBTSxPQUFPLEdBQUcsSUFBSSxVQUFVLENBQUMsRUFBRSxFQUFFLFNBQVMsQ0FBQyxLQUFLLEVBQUUsU0FBUyxFQUFFLE9BQU8sQ0FBQyxDQUFDO1FBQ3hFLE1BQU0sVUFBVSxHQUFHLE1BQU0sQ0FBQztRQUMxQixNQUFNLEdBQUcsT0FBTyxDQUFDLGVBQWUsQ0FBQyxPQUFPLEVBQUUsQ0FBQyxNQUFNLENBQUMsRUFBRSxNQUFNLENBQUMsS0FBSyxDQUFDLENBQUM7UUFDbEUsT0FBTyxDQUFDLDZCQUE2QixDQUFDLFVBQVUsQ0FBQyxDQUFDO0tBQ25EO0lBRUQsSUFBSSxXQUFXLElBQUksSUFBSSxFQUFFO1FBQ3ZCLE1BQU0sa0JBQWtCLEdBQUcsWUFBWSxDQUFDLHNCQUFzQixDQUFDLFdBQVcsQ0FBQyxDQUFDO1FBQzVFLE1BQU0sdUJBQXVCLEdBQUcsU0FBUyxDQUNyQyxFQUFDLE1BQU0sRUFBRSxFQUFDLENBQUMsRUFBRSxNQUFNLEVBQUMsRUFBRSxPQUFPLEVBQUUsS0FBSyxFQUFFLEVBQUMsSUFBSSxFQUFFLGtCQUFrQixFQUFDLEVBQUMsQ0FBQyxDQUFDO1FBRXZFLE9BQU8sQ0FBQyw2QkFBNkIsQ0FBQyxNQUFNLENBQUMsQ0FBQztRQUM5QyxPQUFPLENBQUMsNkJBQTZCLENBQUMsU0FBUyxDQUFDLENBQUM7UUFFakQsT0FBTyx1QkFBdUIsQ0FBQztLQUNoQztJQUVELE9BQU8sTUFBTSxDQUFDO0FBQ2hCLENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyIvKipcbiAqIEBsaWNlbnNlXG4gKiBDb3B5cmlnaHQgMjAyMiBHb29nbGUgTExDLiBBbGwgUmlnaHRzIFJlc2VydmVkLlxuICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlIFwiTGljZW5zZVwiKTtcbiAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS5cbiAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdFxuICpcbiAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMFxuICpcbiAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmVcbiAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuIFwiQVMgSVNcIiBCQVNJUyxcbiAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLlxuICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZFxuICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuXG4gKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuICovXG5cbmltcG9ydCB7YmFja2VuZF91dGlsLCBUZW5zb3JJbmZvfSBmcm9tICdAdGVuc29yZmxvdy90ZmpzLWNvcmUnO1xuXG5pbXBvcnQge01hdGhCYWNrZW5kV2ViR0x9IGZyb20gJy4uL2JhY2tlbmRfd2ViZ2wnO1xuaW1wb3J0IHtDdW1PcFR5cGUsIEN1bVByb2dyYW19IGZyb20gJy4uL2N1bV9ncHUnO1xuXG5pbXBvcnQge2lkZW50aXR5fSBmcm9tICcuL0lkZW50aXR5JztcbmltcG9ydCB7dHJhbnNwb3NlfSBmcm9tICcuL1RyYW5zcG9zZSc7XG5cbmV4cG9ydCBmdW5jdGlvbiBjdW1JbXBsKFxuICAgIG9wOiBDdW1PcFR5cGUsIHg6IFRlbnNvckluZm8sIGJhY2tlbmQ6IE1hdGhCYWNrZW5kV2ViR0wsIGF4aXM6IG51bWJlcixcbiAgICBleGNsdXNpdmU6IGJvb2xlYW4sIHJldmVyc2U6IGJvb2xlYW4pOiBUZW5zb3JJbmZvIHtcbiAgY29uc3QgeFJhbmsgPSB4LnNoYXBlLmxlbmd0aDtcbiAgY29uc3QgcGVybXV0YXRpb24gPSBiYWNrZW5kX3V0aWwuZ2V0QXhlc1Blcm11dGF0aW9uKFtheGlzXSwgeFJhbmspO1xuICBsZXQgcGVybXV0ZWRYID0geDtcbiAgaWYgKHBlcm11dGF0aW9uICE9IG51bGwpIHtcbiAgICBwZXJtdXRlZFggPSB0cmFuc3Bvc2Uoe2lucHV0czoge3h9LCBiYWNrZW5kLCBhdHRyczoge3Blcm06IHBlcm11dGF0aW9ufX0pO1xuICB9XG4gIGNvbnN0IHBlcm11dGVkQXhpcyA9IGJhY2tlbmRfdXRpbC5nZXRJbm5lck1vc3RBeGVzKDEsIHhSYW5rKVswXTtcblxuICBpZiAocGVybXV0ZWRBeGlzICE9PSB4UmFuayAtIDEpIHtcbiAgICB0aHJvdyBuZXcgRXJyb3IoXG4gICAgICAgIGBXZWJHTCBjdW1wcm9kIHNoYWRlciBleHBlY3RzIGFuIGlubmVyLW1vc3QgYXhpcz0ke1xuICAgICAgICAgICAgeC5zaGFwZS5sZW5ndGggLSAxfSBgICtcbiAgICAgICAgYGJ1dCBnb3QgYXhpcz0ke2F4aXN9YCk7XG4gIH1cbiAgY29uc3Qgc2l6ZSA9IHBlcm11dGVkWC5zaGFwZVtwZXJtdXRlZEF4aXNdO1xuICBsZXQgcmVzdWx0ID0gaWRlbnRpdHkoe2lucHV0czoge3g6IHBlcm11dGVkWH0sIGJhY2tlbmR9KTtcbiAgLy8gVXNlIGN1bSBwYXJhbGxlbCBhbGdvcml0aG0sIGluc3BpcmVkIGJ5OlxuICAvLyBodHRwczovL2RldmVsb3Blci5udmlkaWEuY29tL2dwdWdlbXMvZ3B1Z2VtczMvcGFydC12aS1ncHUtY29tcHV0aW5nL2NoYXB0ZXItMzktcGFyYWxsZWwtcHJlZml4LXN1bS1zY2FuLWN1ZGFcbiAgLy8gTm90ZTogYWx0aG91Z2ggdGhlIGFsZ29yaXRobSBpcyBjYWxsZWQgc3VtLCBpdCB3b3JrcyBmb3IgYW55IGFzc29jaXRhdGl2ZVxuICAvLyBvcGVyYXRvciB3aXRoIGFuIGlkZW50aXR5LlxuXG4gIGZvciAobGV0IGkgPSAwOyBpIDw9IE1hdGguY2VpbChNYXRoLmxvZzIoc2l6ZSkpIC0gMTsgaSsrKSB7XG4gICAgY29uc3QgcHJvZ3JhbSA9IG5ldyBDdW1Qcm9ncmFtKG9wLCBwZXJtdXRlZFguc2hhcGUsIGZhbHNlLCByZXZlcnNlKTtcbiAgICBjb25zdCBjdXN0b21WYWx1ZXMgPSBbW2ldXTtcbiAgICBjb25zdCBwcmV2UmVzdWx0ID0gcmVzdWx0O1xuICAgIHJlc3VsdCA9XG4gICAgICAgIGJhY2tlbmQucnVuV2ViR0xQcm9ncmFtKHByb2dyYW0sIFtyZXN1bHRdLCByZXN1bHQuZHR5cGUsIGN1c3RvbVZhbHVlcyk7XG4gICAgYmFja2VuZC5kaXNwb3NlSW50ZXJtZWRpYXRlVGVuc29ySW5mbyhwcmV2UmVzdWx0KTtcbiAgfVxuICAvLyBGb3IgZXhjbHVzaXZlIGN1bSwgc2hpZnQgdGhlIGVuZCByZXN1bHQgaW4gdGhlIGRpcmVjdGlvbiBvZiBwcm9kdWN0IG9yIHN1bVxuICAvLyBhbmQgYWRkIDEgZm9yIHByb2R1Y3Qgb3IgMCBmb3Igc3VtIHRvIHRoZSBmcm9udCBpbmRleC5cbiAgaWYgKGV4Y2x1c2l2ZSkge1xuICAgIGNvbnN0IHByb2dyYW0gPSBuZXcgQ3VtUHJvZ3JhbShvcCwgcGVybXV0ZWRYLnNoYXBlLCBleGNsdXNpdmUsIHJldmVyc2UpO1xuICAgIGNvbnN0IHByZXZSZXN1bHQgPSByZXN1bHQ7XG4gICAgcmVzdWx0ID0gYmFja2VuZC5ydW5XZWJHTFByb2dyYW0ocHJvZ3JhbSwgW3Jlc3VsdF0sIHJlc3VsdC5kdHlwZSk7XG4gICAgYmFja2VuZC5kaXNwb3NlSW50ZXJtZWRpYXRlVGVuc29ySW5mbyhwcmV2UmVzdWx0KTtcbiAgfVxuXG4gIGlmIChwZXJtdXRhdGlvbiAhPSBudWxsKSB7XG4gICAgY29uc3QgcmV2ZXJzZVBlcm11dGF0aW9uID0gYmFja2VuZF91dGlsLmdldFVuZG9BeGVzUGVybXV0YXRpb24ocGVybXV0YXRpb24pO1xuICAgIGNvbnN0IHJldmVyc2VUcmFuc3Bvc2VkUmVzdWx0ID0gdHJhbnNwb3NlKFxuICAgICAgICB7aW5wdXRzOiB7eDogcmVzdWx0fSwgYmFja2VuZCwgYXR0cnM6IHtwZXJtOiByZXZlcnNlUGVybXV0YXRpb259fSk7XG5cbiAgICBiYWNrZW5kLmRpc3Bvc2VJbnRlcm1lZGlhdGVUZW5zb3JJbmZvKHJlc3VsdCk7XG4gICAgYmFja2VuZC5kaXNwb3NlSW50ZXJtZWRpYXRlVGVuc29ySW5mbyhwZXJtdXRlZFgpO1xuXG4gICAgcmV0dXJuIHJldmVyc2VUcmFuc3Bvc2VkUmVzdWx0O1xuICB9XG5cbiAgcmV0dXJuIHJlc3VsdDtcbn1cbiJdfQ==","/**\n * @license\n * Copyright 2022 Google LLC. All Rights Reserved.\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n * =============================================================================\n */\nimport { Cumprod } from '@tensorflow/tfjs-core';\nimport { CumOpType } from '../cum_gpu';\nimport { cumImpl } from './Cum_impl';\nexport function cumprod(args) {\n const { inputs, backend, attrs } = args;\n const { x } = inputs;\n const { axis, exclusive, reverse } = attrs;\n return cumImpl(CumOpType.Prod, x, backend, axis, exclusive, reverse);\n}\nexport const cumprodConfig = {\n kernelName: Cumprod,\n backendName: 'webgl',\n kernelFunc: cumprod\n};\n//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiQ3VtcHJvZC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uLy4uL3RmanMtYmFja2VuZC13ZWJnbC9zcmMva2VybmVscy9DdW1wcm9kLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBOzs7Ozs7Ozs7Ozs7Ozs7R0FlRztBQUVILE9BQU8sRUFBQyxPQUFPLEVBQW9FLE1BQU0sdUJBQXVCLENBQUM7QUFHakgsT0FBTyxFQUFDLFNBQVMsRUFBQyxNQUFNLFlBQVksQ0FBQztBQUNyQyxPQUFPLEVBQUMsT0FBTyxFQUFDLE1BQU0sWUFBWSxDQUFDO0FBRW5DLE1BQU0sVUFBVSxPQUFPLENBQUMsSUFJdkI7SUFDQyxNQUFNLEVBQUMsTUFBTSxFQUFFLE9BQU8sRUFBRSxLQUFLLEVBQUMsR0FBRyxJQUFJLENBQUM7SUFDdEMsTUFBTSxFQUFDLENBQUMsRUFBQyxHQUFHLE1BQU0sQ0FBQztJQUNuQixNQUFNLEVBQUMsSUFBSSxFQUFFLFNBQVMsRUFBRSxPQUFPLEVBQUMsR0FBRyxLQUFLLENBQUM7SUFFekMsT0FBTyxPQUFPLENBQUMsU0FBUyxDQUFDLElBQUksRUFBRSxDQUFDLEVBQUUsT0FBTyxFQUFFLElBQUksRUFBRSxTQUFTLEVBQUUsT0FBTyxDQUFDLENBQUM7QUFDdkUsQ0FBQztBQUVELE1BQU0sQ0FBQyxNQUFNLGFBQWEsR0FBaUI7SUFDekMsVUFBVSxFQUFFLE9BQU87SUFDbkIsV0FBVyxFQUFFLE9BQU87SUFDcEIsVUFBVSxFQUFFLE9BQTJCO0NBQ3hDLENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyIvKipcbiAqIEBsaWNlbnNlXG4gKiBDb3B5cmlnaHQgMjAyMiBHb29nbGUgTExDLiBBbGwgUmlnaHRzIFJlc2VydmVkLlxuICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlIFwiTGljZW5zZVwiKTtcbiAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS5cbiAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdFxuICpcbiAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMFxuICpcbiAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmVcbiAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuIFwiQVMgSVNcIiBCQVNJUyxcbiAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLlxuICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZFxuICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuXG4gKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuICovXG5cbmltcG9ydCB7Q3VtcHJvZCwgQ3VtcHJvZEF0dHJzLCBDdW1wcm9kSW5wdXRzLCBLZXJuZWxDb25maWcsIEtlcm5lbEZ1bmMsIFRlbnNvckluZm99IGZyb20gJ0B0ZW5zb3JmbG93L3RmanMtY29yZSc7XG5cbmltcG9ydCB7TWF0aEJhY2tlbmRXZWJHTH0gZnJvbSAnLi4vYmFja2VuZF93ZWJnbCc7XG5pbXBvcnQge0N1bU9wVHlwZX0gZnJvbSAnLi4vY3VtX2dwdSc7XG5pbXBvcnQge2N1bUltcGx9IGZyb20gJy4vQ3VtX2ltcGwnO1xuXG5leHBvcnQgZnVuY3Rpb24gY3VtcHJvZChhcmdzOiB7XG4gIGlucHV0czogQ3VtcHJvZElucHV0cyxcbiAgYmFja2VuZDogTWF0aEJhY2tlbmRXZWJHTCxcbiAgYXR0cnM6IEN1bXByb2RBdHRyc1xufSk6IFRlbnNvckluZm8ge1xuICBjb25zdCB7aW5wdXRzLCBiYWNrZW5kLCBhdHRyc30gPSBhcmdzO1xuICBjb25zdCB7eH0gPSBpbnB1dHM7XG4gIGNvbnN0IHtheGlzLCBleGNsdXNpdmUsIHJldmVyc2V9ID0gYXR0cnM7XG5cbiAgcmV0dXJuIGN1bUltcGwoQ3VtT3BUeXBlLlByb2QsIHgsIGJhY2tlbmQsIGF4aXMsIGV4Y2x1c2l2ZSwgcmV2ZXJzZSk7XG59XG5cbmV4cG9ydCBjb25zdCBjdW1wcm9kQ29uZmlnOiBLZXJuZWxDb25maWcgPSB7XG4gIGtlcm5lbE5hbWU6IEN1bXByb2QsXG4gIGJhY2tlbmROYW1lOiAnd2ViZ2wnLFxuICBrZXJuZWxGdW5jOiBjdW1wcm9kIGFzIHt9IGFzIEtlcm5lbEZ1bmNcbn07XG4iXX0=","/**\n * @license\n * Copyright 2022 Google LLC. All Rights Reserved.\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n * =============================================================================\n */\nimport { Cumsum } from '@tensorflow/tfjs-core';\nimport { CumOpType } from '../cum_gpu';\nimport { cumImpl } from './Cum_impl';\nexport function cumsum(args) {\n const { inputs, backend, attrs } = args;\n const { x } = inputs;\n const { axis, exclusive, reverse } = attrs;\n return cumImpl(CumOpType.Sum, x, backend, axis, exclusive, reverse);\n}\nexport const cumsumConfig = {\n kernelName: Cumsum,\n backendName: 'webgl',\n kernelFunc: cumsum\n};\n//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiQ3Vtc3VtLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vLi4vdGZqcy1iYWNrZW5kLXdlYmdsL3NyYy9rZXJuZWxzL0N1bXN1bS50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQTs7Ozs7Ozs7Ozs7Ozs7O0dBZUc7QUFFSCxPQUFPLEVBQUMsTUFBTSxFQUFrRSxNQUFNLHVCQUF1QixDQUFDO0FBRzlHLE9BQU8sRUFBQyxTQUFTLEVBQUMsTUFBTSxZQUFZLENBQUM7QUFDckMsT0FBTyxFQUFDLE9BQU8sRUFBQyxNQUFNLFlBQVksQ0FBQztBQUVuQyxNQUFNLFVBQVUsTUFBTSxDQUNsQixJQUN5RTtJQUUzRSxNQUFNLEVBQUMsTUFBTSxFQUFFLE9BQU8sRUFBRSxLQUFLLEVBQUMsR0FBRyxJQUFJLENBQUM7SUFDdEMsTUFBTSxFQUFDLENBQUMsRUFBQyxHQUFHLE1BQU0sQ0FBQztJQUNuQixNQUFNLEVBQUMsSUFBSSxFQUFFLFNBQVMsRUFBRSxPQUFPLEVBQUMsR0FBRyxLQUFLLENBQUM7SUFDekMsT0FBTyxPQUFPLENBQUMsU0FBUyxDQUFDLEdBQUcsRUFBRSxDQUFDLEVBQUUsT0FBTyxFQUFFLElBQUksRUFBRSxTQUFTLEVBQUUsT0FBTyxDQUFDLENBQUM7QUFDdEUsQ0FBQztBQUVELE1BQU0sQ0FBQyxNQUFNLFlBQVksR0FBaUI7SUFDeEMsVUFBVSxFQUFFLE1BQU07SUFDbEIsV0FBVyxFQUFFLE9BQU87SUFDcEIsVUFBVSxFQUFFLE1BQTBCO0NBQ3ZDLENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyIvKipcbiAqIEBsaWNlbnNlXG4gKiBDb3B5cmlnaHQgMjAyMiBHb29nbGUgTExDLiBBbGwgUmlnaHRzIFJlc2VydmVkLlxuICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlIFwiTGljZW5zZVwiKTtcbiAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS5cbiAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdFxuICpcbiAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMFxuICpcbiAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmVcbiAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuIFwiQVMgSVNcIiBCQVNJUyxcbiAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLlxuICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZFxuICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuXG4gKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuICovXG5cbmltcG9ydCB7Q3Vtc3VtLCBDdW1zdW1BdHRycywgQ3Vtc3VtSW5wdXRzLCBLZXJuZWxDb25maWcsIEtlcm5lbEZ1bmMsIFRlbnNvckluZm99IGZyb20gJ0B0ZW5zb3JmbG93L3RmanMtY29yZSc7XG5cbmltcG9ydCB7TWF0aEJhY2tlbmRXZWJHTH0gZnJvbSAnLi4vYmFja2VuZF93ZWJnbCc7XG5pbXBvcnQge0N1bU9wVHlwZX0gZnJvbSAnLi4vY3VtX2dwdSc7XG5pbXBvcnQge2N1bUltcGx9IGZyb20gJy4vQ3VtX2ltcGwnO1xuXG5leHBvcnQgZnVuY3Rpb24gY3Vtc3VtKFxuICAgIGFyZ3M6XG4gICAgICAgIHtpbnB1dHM6IEN1bXN1bUlucHV0cywgYmFja2VuZDogTWF0aEJhY2tlbmRXZWJHTCwgYXR0cnM6IEN1bXN1bUF0dHJzfSk6XG4gICAgVGVuc29ySW5mbyB7XG4gIGNvbnN0IHtpbnB1dHMsIGJhY2tlbmQsIGF0dHJzfSA9IGFyZ3M7XG4gIGNvbnN0IHt4fSA9IGlucHV0cztcbiAgY29uc3Qge2F4aXMsIGV4Y2x1c2l2ZSwgcmV2ZXJzZX0gPSBhdHRycztcbiAgcmV0dXJuIGN1bUltcGwoQ3VtT3BUeXBlLlN1bSwgeCwgYmFja2VuZCwgYXhpcywgZXhjbHVzaXZlLCByZXZlcnNlKTtcbn1cblxuZXhwb3J0IGNvbnN0IGN1bXN1bUNvbmZpZzogS2VybmVsQ29uZmlnID0ge1xuICBrZXJuZWxOYW1lOiBDdW1zdW0sXG4gIGJhY2tlbmROYW1lOiAnd2ViZ2wnLFxuICBrZXJuZWxGdW5jOiBjdW1zdW0gYXMge30gYXMgS2VybmVsRnVuY1xufTtcbiJdfQ==","/**\n * @license\n * Copyright 2020 Google LLC. All Rights Reserved.\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n * =============================================================================\n */\nimport { DenseBincount } from '@tensorflow/tfjs-core';\nimport { bincountImplCPU, bincountReduceImplCPU } from '../kernel_utils/shared';\nexport function denseBincount(args) {\n const { inputs, backend, attrs } = args;\n const { x, weights } = inputs;\n const { size, binaryOutput } = attrs;\n if (x.shape.length === 1) {\n const xVals = backend.readSync(x.dataId);\n const weightsVals = backend.readSync(weights.dataId);\n const outVals = bincountImplCPU(xVals, weightsVals, weights.dtype, weights.shape, size);\n return backend.makeTensorInfo([size], weights.dtype, outVals);\n }\n else if (x.shape.length === 2) {\n const xBuf = backend.bufferSync(x);\n const weightsBuf = backend.bufferSync(weights);\n const outBuf = bincountReduceImplCPU(xBuf, weightsBuf, size, binaryOutput);\n return backend.makeTensorInfo(outBuf.shape, weights.dtype, outBuf.values);\n }\n throw new Error(`Error in denseBincount: input must be at most rank 2, but got rank` +\n `${x.shape.length}.`);\n}\nexport const denseBincountConfig = {\n kernelName: DenseBincount,\n backendName: 'webgl',\n kernelFunc: denseBincount\n};\n//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiRGVuc2VCaW5jb3VudC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uLy4uL3RmanMtYmFja2VuZC13ZWJnbC9zcmMva2VybmVscy9EZW5zZUJpbmNvdW50LnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBOzs7Ozs7Ozs7Ozs7Ozs7R0FlRztBQUVILE9BQU8sRUFBQyxhQUFhLEVBQWtHLE1BQU0sdUJBQXVCLENBQUM7QUFHckosT0FBTyxFQUFDLGVBQWUsRUFBRSxxQkFBcUIsRUFBQyxNQUFNLHdCQUF3QixDQUFDO0FBRTlFLE1BQU0sVUFBVSxhQUFhLENBQUMsSUFJN0I7SUFDQyxNQUFNLEVBQUMsTUFBTSxFQUFFLE9BQU8sRUFBRSxLQUFLLEVBQUMsR0FBRyxJQUFJLENBQUM7SUFDdEMsTUFBTSxFQUFDLENBQUMsRUFBRSxPQUFPLEVBQUMsR0FBRyxNQUFNLENBQUM7SUFDNUIsTUFBTSxFQUFDLElBQUksRUFBRSxZQUFZLEVBQUMsR0FBRyxLQUFLLENBQUM7SUFFbkMsSUFBSSxDQUFDLENBQUMsS0FBSyxDQUFDLE1BQU0sS0FBSyxDQUFDLEVBQUU7UUFDeEIsTUFBTSxLQUFLLEdBQUcsT0FBTyxDQUFDLFFBQVEsQ0FBQyxDQUFDLENBQUMsTUFBTSxDQUFlLENBQUM7UUFDdkQsTUFBTSxXQUFXLEdBQUcsT0FBTyxDQUFDLFFBQVEsQ0FBQyxPQUFPLENBQUMsTUFBTSxDQUFlLENBQUM7UUFFbkUsTUFBTSxPQUFPLEdBQ1QsZUFBZSxDQUFDLEtBQUssRUFBRSxXQUFXLEVBQUUsT0FBTyxDQUFDLEtBQUssRUFBRSxPQUFPLENBQUMsS0FBSyxFQUFFLElBQUksQ0FBQyxDQUFDO1FBRTVFLE9BQU8sT0FBTyxDQUFDLGNBQWMsQ0FBQyxDQUFDLElBQUksQ0FBQyxFQUFFLE9BQU8sQ0FBQyxLQUFLLEVBQUUsT0FBTyxDQUFDLENBQUM7S0FDL0Q7U0FBTSxJQUFJLENBQUMsQ0FBQyxLQUFLLENBQUMsTUFBTSxLQUFLLENBQUMsRUFBRTtRQUMvQixNQUFNLElBQUksR0FBRyxPQUFPLENBQUMsVUFBVSxDQUFrQixDQUFDLENBQUMsQ0FBQztRQUNwRCxNQUFNLFVBQVUsR0FBRyxPQUFPLENBQUMsVUFBVSxDQUFrQixPQUFPLENBQUMsQ0FBQztRQUVoRSxNQUFNLE1BQU0sR0FBRyxxQkFBcUIsQ0FBQyxJQUFJLEVBQUUsVUFBVSxFQUFFLElBQUksRUFBRSxZQUFZLENBQUMsQ0FBQztRQUUzRSxPQUFPLE9BQU8sQ0FBQyxjQUFjLENBQUMsTUFBTSxDQUFDLEtBQUssRUFBRSxPQUFPLENBQUMsS0FBSyxFQUFFLE1BQU0sQ0FBQyxNQUFNLENBQUMsQ0FBQztLQUMzRTtJQUVELE1BQU0sSUFBSSxLQUFLLENBQ1gsb0VBQW9FO1FBQ3BFLEdBQUcsQ0FBQyxDQUFDLEtBQUssQ0FBQyxNQUFNLEdBQUcsQ0FBQyxDQUFDO0FBQzVCLENBQUM7QUFFRCxNQUFNLENBQUMsTUFBTSxtQkFBbUIsR0FBaUI7SUFDL0MsVUFBVSxFQUFFLGFBQWE7SUFDekIsV0FBVyxFQUFFLE9BQU87SUFDcEIsVUFBVSxFQUFFLGFBQWlDO0NBQzlDLENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyIvKipcbiAqIEBsaWNlbnNlXG4gKiBDb3B5cmlnaHQgMjAyMCBHb29nbGUgTExDLiBBbGwgUmlnaHRzIFJlc2VydmVkLlxuICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlIFwiTGljZW5zZVwiKTtcbiAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS5cbiAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdFxuICpcbiAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMFxuICpcbiAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmVcbiAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuIFwiQVMgSVNcIiBCQVNJUyxcbiAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLlxuICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZFxuICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuXG4gKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuICovXG5cbmltcG9ydCB7RGVuc2VCaW5jb3VudCwgRGVuc2VCaW5jb3VudEF0dHJzLCBEZW5zZUJpbmNvdW50SW5wdXRzLCBLZXJuZWxDb25maWcsIEtlcm5lbEZ1bmMsIFJhbmssIFRlbnNvckluZm8sIFR5cGVkQXJyYXl9IGZyb20gJ0B0ZW5zb3JmbG93L3RmanMtY29yZSc7XG5cbmltcG9ydCB7TWF0aEJhY2tlbmRXZWJHTH0gZnJvbSAnLi4vYmFja2VuZF93ZWJnbCc7XG5pbXBvcnQge2JpbmNvdW50SW1wbENQVSwgYmluY291bnRSZWR1Y2VJbXBsQ1BVfSBmcm9tICcuLi9rZXJuZWxfdXRpbHMvc2hhcmVkJztcblxuZXhwb3J0IGZ1bmN0aW9uIGRlbnNlQmluY291bnQoYXJnczoge1xuICBpbnB1dHM6IERlbnNlQmluY291bnRJbnB1dHMsXG4gIGJhY2tlbmQ6IE1hdGhCYWNrZW5kV2ViR0wsXG4gIGF0dHJzOiBEZW5zZUJpbmNvdW50QXR0cnNcbn0pOiBUZW5zb3JJbmZvIHtcbiAgY29uc3Qge2lucHV0cywgYmFja2VuZCwgYXR0cnN9ID0gYXJncztcbiAgY29uc3Qge3gsIHdlaWdodHN9ID0gaW5wdXRzO1xuICBjb25zdCB7c2l6ZSwgYmluYXJ5T3V0cHV0fSA9IGF0dHJzO1xuXG4gIGlmICh4LnNoYXBlLmxlbmd0aCA9PT0gMSkge1xuICAgIGNvbnN0IHhWYWxzID0gYmFja2VuZC5yZWFkU3luYyh4LmRhdGFJZCkgYXMgVHlwZWRBcnJheTtcbiAgICBjb25zdCB3ZWlnaHRzVmFscyA9IGJhY2tlbmQucmVhZFN5bmMod2VpZ2h0cy5kYXRhSWQpIGFzIFR5cGVkQXJyYXk7XG5cbiAgICBjb25zdCBvdXRWYWxzID1cbiAgICAgICAgYmluY291bnRJbXBsQ1BVKHhWYWxzLCB3ZWlnaHRzVmFscywgd2VpZ2h0cy5kdHlwZSwgd2VpZ2h0cy5zaGFwZSwgc2l6ZSk7XG5cbiAgICByZXR1cm4gYmFja2VuZC5tYWtlVGVuc29ySW5mbyhbc2l6ZV0sIHdlaWdodHMuZHR5cGUsIG91dFZhbHMpO1xuICB9IGVsc2UgaWYgKHguc2hhcGUubGVuZ3RoID09PSAyKSB7XG4gICAgY29uc3QgeEJ1ZiA9IGJhY2tlbmQuYnVmZmVyU3luYzxSYW5rLCAnZmxvYXQzMic+KHgpO1xuICAgIGNvbnN0IHdlaWdodHNCdWYgPSBiYWNrZW5kLmJ1ZmZlclN5bmM8UmFuaywgJ2Zsb2F0MzInPih3ZWlnaHRzKTtcblxuICAgIGNvbnN0IG91dEJ1ZiA9IGJpbmNvdW50UmVkdWNlSW1wbENQVSh4QnVmLCB3ZWlnaHRzQnVmLCBzaXplLCBiaW5hcnlPdXRwdXQpO1xuXG4gICAgcmV0dXJuIGJhY2tlbmQubWFrZVRlbnNvckluZm8ob3V0QnVmLnNoYXBlLCB3ZWlnaHRzLmR0eXBlLCBvdXRCdWYudmFsdWVzKTtcbiAgfVxuXG4gIHRocm93IG5ldyBFcnJvcihcbiAgICAgIGBFcnJvciBpbiBkZW5zZUJpbmNvdW50OiBpbnB1dCBtdXN0IGJlIGF0IG1vc3QgcmFuayAyLCBidXQgZ290IHJhbmtgICtcbiAgICAgIGAke3guc2hhcGUubGVuZ3RofS5gKTtcbn1cblxuZXhwb3J0IGNvbnN0IGRlbnNlQmluY291bnRDb25maWc6IEtlcm5lbENvbmZpZyA9IHtcbiAga2VybmVsTmFtZTogRGVuc2VCaW5jb3VudCxcbiAgYmFja2VuZE5hbWU6ICd3ZWJnbCcsXG4gIGtlcm5lbEZ1bmM6IGRlbnNlQmluY291bnQgYXMge30gYXMgS2VybmVsRnVuY1xufTtcbiJdfQ==","/**\n * @license\n * Copyright 2018 Google LLC. All Rights Reserved.\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n * =============================================================================\n */\nexport class DepthToSpaceProgram {\n constructor(outputShape, blockSize, dataFormat) {\n this.variableNames = ['x'];\n this.outputShape = [];\n this.outputShape = outputShape;\n this.blockSize = blockSize;\n this.dataFormat = dataFormat;\n this.userCode = `\n void main() {\n ivec4 coords = getOutputCoords();\n int b = coords[0];\n int h = ${this.getHeightCoordString()};\n int w = ${this.getWidthCoordString()};\n int d = ${this.getDepthCoordString()};\n\n int in_h = h / ${blockSize};\n int offset_h = imod(h, ${blockSize});\n int in_w = w / ${blockSize};\n int offset_w = imod(w, ${blockSize});\n int offset_d = (offset_h * ${blockSize} + offset_w) *\n ${this.getOutputDepthSize()};\n int in_d = d + offset_d;\n\n float result = ${this.getInputSamplingString()};\n setOutput(result);\n }\n `;\n }\n getHeightCoordString() {\n if (this.dataFormat === 'NHWC') {\n return `coords[1]`;\n }\n else {\n return `coords[2]`;\n }\n }\n getWidthCoordString() {\n if (this.dataFormat === 'NHWC') {\n return `coords[2]`;\n }\n else {\n return `coords[3]`;\n }\n }\n getDepthCoordString() {\n if (this.dataFormat === 'NHWC') {\n return `coords[3]`;\n }\n else {\n return `coords[1]`;\n }\n }\n getOutputDepthSize() {\n if (this.dataFormat === 'NHWC') {\n return this.outputShape[3];\n }\n else {\n return this.outputShape[1];\n }\n }\n getInputSamplingString() {\n if (this.dataFormat === 'NHWC') {\n return `getX(b, in_h, in_w, in_d)`;\n }\n else {\n return `getX(b, in_d, in_h, in_w)`;\n }\n }\n}\n//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZGVwdGhfdG9fc3BhY2VfZ3B1LmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vdGZqcy1iYWNrZW5kLXdlYmdsL3NyYy9kZXB0aF90b19zcGFjZV9ncHUudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUE7Ozs7Ozs7Ozs7Ozs7OztHQWVHO0FBSUgsTUFBTSxPQUFPLG1CQUFtQjtJQU85QixZQUNJLFdBQXFCLEVBQUUsU0FBaUIsRUFBRSxVQUF5QjtRQVB2RSxrQkFBYSxHQUFHLENBQUMsR0FBRyxDQUFDLENBQUM7UUFDdEIsZ0JBQVcsR0FBYSxFQUFFLENBQUM7UUFPekIsSUFBSSxDQUFDLFdBQVcsR0FBRyxXQUFXLENBQUM7UUFDL0IsSUFBSSxDQUFDLFNBQVMsR0FBRyxTQUFTLENBQUM7UUFDM0IsSUFBSSxDQUFDLFVBQVUsR0FBRyxVQUFVLENBQUM7UUFDN0IsSUFBSSxDQUFDLFFBQVEsR0FBRzs7OztnQkFJSixJQUFJLENBQUMsb0JBQW9CLEVBQUU7Z0JBQzNCLElBQUksQ0FBQyxtQkFBbUIsRUFBRTtnQkFDMUIsSUFBSSxDQUFDLG1CQUFtQixFQUFFOzt1QkFFbkIsU0FBUzsrQkFDRCxTQUFTO3VCQUNqQixTQUFTOytCQUNELFNBQVM7bUNBQ0wsU0FBUztVQUNsQyxJQUFJLENBQUMsa0JBQWtCLEVBQUU7Ozt1QkFHWixJQUFJLENBQUMsc0JBQXNCLEVBQUU7OztHQUdqRCxDQUFDO0lBQ0YsQ0FBQztJQUVPLG9CQUFvQjtRQUMxQixJQUFJLElBQUksQ0FBQyxVQUFVLEtBQUssTUFBTSxFQUFFO1lBQzlCLE9BQU8sV0FBVyxDQUFDO1NBQ3BCO2FBQU07WUFDTCxPQUFPLFdBQVcsQ0FBQztTQUNwQjtJQUNILENBQUM7SUFFTyxtQkFBbUI7UUFDekIsSUFBSSxJQUFJLENBQUMsVUFBVSxLQUFLLE1BQU0sRUFBRTtZQUM5QixPQUFPLFdBQVcsQ0FBQztTQUNwQjthQUFNO1lBQ0wsT0FBTyxXQUFXLENBQUM7U0FDcEI7SUFDSCxDQUFDO0lBRU8sbUJBQW1CO1FBQ3pCLElBQUksSUFBSSxDQUFDLFVBQVUsS0FBSyxNQUFNLEVBQUU7WUFDOUIsT0FBTyxXQUFXLENBQUM7U0FDcEI7YUFBTTtZQUNMLE9BQU8sV0FBVyxDQUFDO1NBQ3BCO0lBQ0gsQ0FBQztJQUVPLGtCQUFrQjtRQUN4QixJQUFJLElBQUksQ0FBQyxVQUFVLEtBQUssTUFBTSxFQUFFO1lBQzlCLE9BQU8sSUFBSSxDQUFDLFdBQVcsQ0FBQyxDQUFDLENBQUMsQ0FBQztTQUM1QjthQUFNO1lBQ0wsT0FBTyxJQUFJLENBQUMsV0FBVyxDQUFDLENBQUMsQ0FBQyxDQUFDO1NBQzVCO0lBQ0gsQ0FBQztJQUVPLHNCQUFzQjtRQUM1QixJQUFJLElBQUksQ0FBQyxVQUFVLEtBQUssTUFBTSxFQUFFO1lBQzlCLE9BQU8sMkJBQTJCLENBQUM7U0FDcEM7YUFBTTtZQUNMLE9BQU8sMkJBQTJCLENBQUM7U0FDcEM7SUFDSCxDQUFDO0NBQ0YiLCJzb3VyY2VzQ29udGVudCI6WyIvKipcbiAqIEBsaWNlbnNlXG4gKiBDb3B5cmlnaHQgMjAxOCBHb29nbGUgTExDLiBBbGwgUmlnaHRzIFJlc2VydmVkLlxuICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlIFwiTGljZW5zZVwiKTtcbiAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS5cbiAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdFxuICpcbiAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMFxuICpcbiAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmVcbiAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuIFwiQVMgSVNcIiBCQVNJUyxcbiAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLlxuICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZFxuICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuXG4gKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuICovXG5cbmltcG9ydCB7R1BHUFVQcm9ncmFtfSBmcm9tICcuL2dwZ3B1X21hdGgnO1xuXG5leHBvcnQgY2xhc3MgRGVwdGhUb1NwYWNlUHJvZ3JhbSBpbXBsZW1lbnRzIEdQR1BVUHJvZ3JhbSB7XG4gIHZhcmlhYmxlTmFtZXMgPSBbJ3gnXTtcbiAgb3V0cHV0U2hhcGU6IG51bWJlcltdID0gW107XG4gIHVzZXJDb2RlOiBzdHJpbmc7XG4gIGJsb2NrU2l6ZTogbnVtYmVyO1xuICBkYXRhRm9ybWF0OiBzdHJpbmc7XG5cbiAgY29uc3RydWN0b3IoXG4gICAgICBvdXRwdXRTaGFwZTogbnVtYmVyW10sIGJsb2NrU2l6ZTogbnVtYmVyLCBkYXRhRm9ybWF0OiAnTkhXQyd8J05DSFcnKSB7XG4gICAgdGhpcy5vdXRwdXRTaGFwZSA9IG91dHB1dFNoYXBlO1xuICAgIHRoaXMuYmxvY2tTaXplID0gYmxvY2tTaXplO1xuICAgIHRoaXMuZGF0YUZvcm1hdCA9IGRhdGFGb3JtYXQ7XG4gICAgdGhpcy51c2VyQ29kZSA9IGBcbiAgICB2b2lkIG1haW4oKSB7XG4gICAgICBpdmVjNCBjb29yZHMgPSBnZXRPdXRwdXRDb29yZHMoKTtcbiAgICAgIGludCBiID0gY29vcmRzWzBdO1xuICAgICAgaW50IGggPSAke3RoaXMuZ2V0SGVpZ2h0Q29vcmRTdHJpbmcoKX07XG4gICAgICBpbnQgdyA9ICR7dGhpcy5nZXRXaWR0aENvb3JkU3RyaW5nKCl9O1xuICAgICAgaW50IGQgPSAke3RoaXMuZ2V0RGVwdGhDb29yZFN0cmluZygpfTtcblxuICAgICAgaW50IGluX2ggPSBoIC8gJHtibG9ja1NpemV9O1xuICAgICAgaW50IG9mZnNldF9oID0gaW1vZChoLCAke2Jsb2NrU2l6ZX0pO1xuICAgICAgaW50IGluX3cgPSB3IC8gJHtibG9ja1NpemV9O1xuICAgICAgaW50IG9mZnNldF93ID0gaW1vZCh3LCAke2Jsb2NrU2l6ZX0pO1xuICAgICAgaW50IG9mZnNldF9kID0gKG9mZnNldF9oICogJHtibG9ja1NpemV9ICsgb2Zmc2V0X3cpICpcbiAgICAgICAgJHt0aGlzLmdldE91dHB1dERlcHRoU2l6ZSgpfTtcbiAgICAgIGludCBpbl9kID0gZCArIG9mZnNldF9kO1xuXG4gICAgICBmbG9hdCByZXN1bHQgPSAke3RoaXMuZ2V0SW5wdXRTYW1wbGluZ1N0cmluZygpfTtcbiAgICAgIHNldE91dHB1dChyZXN1bHQpO1xuICAgIH1cbiAgYDtcbiAgfVxuXG4gIHByaXZhdGUgZ2V0SGVpZ2h0Q29vcmRTdHJpbmcoKTogc3RyaW5nIHtcbiAgICBpZiAodGhpcy5kYXRhRm9ybWF0ID09PSAnTkhXQycpIHtcbiAgICAgIHJldHVybiBgY29vcmRzWzFdYDtcbiAgICB9IGVsc2Uge1xuICAgICAgcmV0dXJuIGBjb29yZHNbMl1gO1xuICAgIH1cbiAgfVxuXG4gIHByaXZhdGUgZ2V0V2lkdGhDb29yZFN0cmluZygpOiBzdHJpbmcge1xuICAgIGlmICh0aGlzLmRhdGFGb3JtYXQgPT09ICdOSFdDJykge1xuICAgICAgcmV0dXJuIGBjb29yZHNbMl1gO1xuICAgIH0gZWxzZSB7XG4gICAgICByZXR1cm4gYGNvb3Jkc1szXWA7XG4gICAgfVxuICB9XG5cbiAgcHJpdmF0ZSBnZXREZXB0aENvb3JkU3RyaW5nKCk6IHN0cmluZyB7XG4gICAgaWYgKHRoaXMuZGF0YUZvcm1hdCA9PT0gJ05IV0MnKSB7XG4gICAgICByZXR1cm4gYGNvb3Jkc1szXWA7XG4gICAgfSBlbHNlIHtcbiAgICAgIHJldHVybiBgY29vcmRzWzFdYDtcbiAgICB9XG4gIH1cblxuICBwcml2YXRlIGdldE91dHB1dERlcHRoU2l6ZSgpOiBudW1iZXIge1xuICAgIGlmICh0aGlzLmRhdGFGb3JtYXQgPT09ICdOSFdDJykge1xuICAgICAgcmV0dXJuIHRoaXMub3V0cHV0U2hhcGVbM107XG4gICAgfSBlbHNlIHtcbiAgICAgIHJldHVybiB0aGlzLm91dHB1dFNoYXBlWzFdO1xuICAgIH1cbiAgfVxuXG4gIHByaXZhdGUgZ2V0SW5wdXRTYW1wbGluZ1N0cmluZygpOiBzdHJpbmcge1xuICAgIGlmICh0aGlzLmRhdGFGb3JtYXQgPT09ICdOSFdDJykge1xuICAgICAgcmV0dXJuIGBnZXRYKGIsIGluX2gsIGluX3csIGluX2QpYDtcbiAgICB9IGVsc2Uge1xuICAgICAgcmV0dXJuIGBnZXRYKGIsIGluX2QsIGluX2gsIGluX3cpYDtcbiAgICB9XG4gIH1cbn1cbiJdfQ==","/**\n * @license\n * Copyright 2020 Google LLC. All Rights Reserved.\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n * =============================================================================\n */\nimport { DepthToSpace } from '@tensorflow/tfjs-core';\nimport { DepthToSpaceProgram } from '../depth_to_space_gpu';\nexport function depthToSpace(args) {\n const { inputs, backend, attrs } = args;\n const { x } = inputs;\n const { blockSize, dataFormat } = attrs;\n const batchSize = x.shape[0];\n const inputHeight = (dataFormat === 'NHWC') ? x.shape[1] : x.shape[2];\n const inputWidth = (dataFormat === 'NHWC') ? x.shape[2] : x.shape[3];\n const inputDepth = (dataFormat === 'NHWC') ? x.shape[3] : x.shape[1];\n const outputHeight = inputHeight * blockSize;\n const outputWidth = inputWidth * blockSize;\n const outputDepth = inputDepth / (blockSize * blockSize);\n const outputShape = (dataFormat === 'NHWC') ?\n [batchSize, outputHeight, outputWidth, outputDepth] :\n [batchSize, outputDepth, outputHeight, outputWidth];\n const program = new DepthToSpaceProgram(outputShape, blockSize, dataFormat);\n return backend.runWebGLProgram(program, [x], x.dtype);\n}\nexport const depthToSpaceConfig = {\n kernelName: DepthToSpace,\n backendName: 'webgl',\n kernelFunc: depthToSpace\n};\n//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiRGVwdGhUb1NwYWNlLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vLi4vdGZqcy1iYWNrZW5kLXdlYmdsL3NyYy9rZXJuZWxzL0RlcHRoVG9TcGFjZS50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQTs7Ozs7Ozs7Ozs7Ozs7O0dBZUc7QUFFSCxPQUFPLEVBQUMsWUFBWSxFQUE4RSxNQUFNLHVCQUF1QixDQUFDO0FBR2hJLE9BQU8sRUFBQyxtQkFBbUIsRUFBQyxNQUFNLHVCQUF1QixDQUFDO0FBRTFELE1BQU0sVUFBVSxZQUFZLENBQUMsSUFJNUI7SUFDQyxNQUFNLEVBQUMsTUFBTSxFQUFFLE9BQU8sRUFBRSxLQUFLLEVBQUMsR0FBRyxJQUFJLENBQUM7SUFDdEMsTUFBTSxFQUFDLENBQUMsRUFBQyxHQUFHLE1BQU0sQ0FBQztJQUNuQixNQUFNLEVBQUMsU0FBUyxFQUFFLFVBQVUsRUFBQyxHQUFHLEtBQUssQ0FBQztJQUV0QyxNQUFNLFNBQVMsR0FBRyxDQUFDLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQyxDQUFDO0lBQzdCLE1BQU0sV0FBVyxHQUFHLENBQUMsVUFBVSxLQUFLLE1BQU0sQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQyxDQUFDO0lBQ3RFLE1BQU0sVUFBVSxHQUFHLENBQUMsVUFBVSxLQUFLLE1BQU0sQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQyxDQUFDO0lBQ3JFLE1BQU0sVUFBVSxHQUFHLENBQUMsVUFBVSxLQUFLLE1BQU0sQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQyxDQUFDO0lBRXJFLE1BQU0sWUFBWSxHQUFHLFdBQVcsR0FBRyxTQUFTLENBQUM7SUFDN0MsTUFBTSxXQUFXLEdBQUcsVUFBVSxHQUFHLFNBQVMsQ0FBQztJQUMzQyxNQUFNLFdBQVcsR0FBRyxVQUFVLEdBQUcsQ0FBQyxTQUFTLEdBQUcsU0FBUyxDQUFDLENBQUM7SUFFekQsTUFBTSxXQUFXLEdBQUcsQ0FBQyxVQUFVLEtBQUssTUFBTSxDQUFDLENBQUMsQ0FBQztRQUN6QyxDQUFDLFNBQVMsRUFBRSxZQUFZLEVBQUUsV0FBVyxFQUFFLFdBQVcsQ0FBQyxDQUFDLENBQUM7UUFDckQsQ0FBQyxTQUFTLEVBQUUsV0FBVyxFQUFFLFlBQVksRUFBRSxXQUFXLENBQUMsQ0FBQztJQUV4RCxNQUFNLE9BQU8sR0FBRyxJQUFJLG1CQUFtQixDQUFDLFdBQVcsRUFBRSxTQUFTLEVBQUUsVUFBVSxDQUFDLENBQUM7SUFDNUUsT0FBTyxPQUFPLENBQUMsZUFBZSxDQUFDLE9BQU8sRUFBRSxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxLQUFLLENBQUMsQ0FBQztBQUN4RCxDQUFDO0FBRUQsTUFBTSxDQUFDLE1BQU0sa0JBQWtCLEdBQWlCO0lBQzlDLFVBQVUsRUFBRSxZQUFZO0lBQ3hCLFdBQVcsRUFBRSxPQUFPO0lBQ3BCLFVBQVUsRUFBRSxZQUFnQztDQUM3QyxDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiLyoqXG4gKiBAbGljZW5zZVxuICogQ29weXJpZ2h0IDIwMjAgR29vZ2xlIExMQy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC5cbiAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSBcIkxpY2Vuc2VcIik7XG4gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuXG4gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXRcbiAqXG4gKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjBcbiAqXG4gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlXG4gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiBcIkFTIElTXCIgQkFTSVMsXG4gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC5cbiAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmRcbiAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLlxuICogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbiAqL1xuXG5pbXBvcnQge0RlcHRoVG9TcGFjZSwgRGVwdGhUb1NwYWNlQXR0cnMsIERlcHRoVG9TcGFjZUlucHV0cywgS2VybmVsQ29uZmlnLCBLZXJuZWxGdW5jLCBUZW5zb3JJbmZvfSBmcm9tICdAdGVuc29yZmxvdy90ZmpzLWNvcmUnO1xuXG5pbXBvcnQge01hdGhCYWNrZW5kV2ViR0x9IGZyb20gJy4uL2JhY2tlbmRfd2ViZ2wnO1xuaW1wb3J0IHtEZXB0aFRvU3BhY2VQcm9ncmFtfSBmcm9tICcuLi9kZXB0aF90b19zcGFjZV9ncHUnO1xuXG5leHBvcnQgZnVuY3Rpb24gZGVwdGhUb1NwYWNlKGFyZ3M6IHtcbiAgaW5wdXRzOiBEZXB0aFRvU3BhY2VJbnB1dHMsXG4gIGJhY2tlbmQ6IE1hdGhCYWNrZW5kV2ViR0wsXG4gIGF0dHJzOiBEZXB0aFRvU3BhY2VBdHRyc1xufSk6IFRlbnNvckluZm8ge1xuICBjb25zdCB7aW5wdXRzLCBiYWNrZW5kLCBhdHRyc30gPSBhcmdzO1xuICBjb25zdCB7eH0gPSBpbnB1dHM7XG4gIGNvbnN0IHtibG9ja1NpemUsIGRhdGFGb3JtYXR9ID0gYXR0cnM7XG5cbiAgY29uc3QgYmF0Y2hTaXplID0geC5zaGFwZVswXTtcbiAgY29uc3QgaW5wdXRIZWlnaHQgPSAoZGF0YUZvcm1hdCA9PT0gJ05IV0MnKSA/IHguc2hhcGVbMV0gOiB4LnNoYXBlWzJdO1xuICBjb25zdCBpbnB1dFdpZHRoID0gKGRhdGFGb3JtYXQgPT09ICdOSFdDJykgPyB4LnNoYXBlWzJdIDogeC5zaGFwZVszXTtcbiAgY29uc3QgaW5wdXREZXB0aCA9IChkYXRhRm9ybWF0ID09PSAnTkhXQycpID8geC5zaGFwZVszXSA6IHguc2hhcGVbMV07XG5cbiAgY29uc3Qgb3V0cHV0SGVpZ2h0ID0gaW5wdXRIZWlnaHQgKiBibG9ja1NpemU7XG4gIGNvbnN0IG91dHB1dFdpZHRoID0gaW5wdXRXaWR0aCAqIGJsb2NrU2l6ZTtcbiAgY29uc3Qgb3V0cHV0RGVwdGggPSBpbnB1dERlcHRoIC8gKGJsb2NrU2l6ZSAqIGJsb2NrU2l6ZSk7XG5cbiAgY29uc3Qgb3V0cHV0U2hhcGUgPSAoZGF0YUZvcm1hdCA9PT0gJ05IV0MnKSA/XG4gICAgICBbYmF0Y2hTaXplLCBvdXRwdXRIZWlnaHQsIG91dHB1dFdpZHRoLCBvdXRwdXREZXB0aF0gOlxuICAgICAgW2JhdGNoU2l6ZSwgb3V0cHV0RGVwdGgsIG91dHB1dEhlaWdodCwgb3V0cHV0V2lkdGhdO1xuXG4gIGNvbnN0IHByb2dyYW0gPSBuZXcgRGVwdGhUb1NwYWNlUHJvZ3JhbShvdXRwdXRTaGFwZSwgYmxvY2tTaXplLCBkYXRhRm9ybWF0KTtcbiAgcmV0dXJuIGJhY2tlbmQucnVuV2ViR0xQcm9ncmFtKHByb2dyYW0sIFt4XSwgeC5kdHlwZSk7XG59XG5cbmV4cG9ydCBjb25zdCBkZXB0aFRvU3BhY2VDb25maWc6IEtlcm5lbENvbmZpZyA9IHtcbiAga2VybmVsTmFtZTogRGVwdGhUb1NwYWNlLFxuICBiYWNrZW5kTmFtZTogJ3dlYmdsJyxcbiAga2VybmVsRnVuYzogZGVwdGhUb1NwYWNlIGFzIHt9IGFzIEtlcm5lbEZ1bmNcbn07XG4iXX0=","/**\n * @license\n * Copyright 2017 Google LLC. All Rights Reserved.\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n * =============================================================================\n */\nimport { useShapeUniforms } from './gpgpu_math';\nexport class DepthwiseConv2DProgram {\n constructor(convInfo, addBias = false, activation = null, hasPreluActivation = false, hasLeakyReluAlpha = false) {\n this.variableNames = ['x', 'W'];\n this.customUniforms = [\n { name: 'pads', type: 'ivec2' },\n { name: 'strides', type: 'ivec2' },\n { name: 'dilations', type: 'ivec2' },\n { name: 'inDims', type: 'ivec2' },\n ];\n this.outputShape = convInfo.outShape;\n this.enableShapeUniforms = useShapeUniforms(this.outputShape.length);\n const filterHeight = convInfo.filterHeight;\n const filterWidth = convInfo.filterWidth;\n const channelMul = convInfo.outChannels / convInfo.inChannels;\n let activationSnippet = '', applyActivationSnippet = '';\n if (activation) {\n if (hasPreluActivation) {\n activationSnippet = `float activation(float a) {\n float b = getPreluActivationWeightsAtOutCoords();\n ${activation}\n }`;\n }\n else if (hasLeakyReluAlpha) {\n activationSnippet = `float activation(float a) {\n float b = getLeakyreluAlphaAtOutCoords();\n ${activation}\n }`;\n }\n else {\n activationSnippet = `\n float activation(float x) {\n ${activation}\n }\n `;\n }\n applyActivationSnippet = `result = activation(result);`;\n }\n const addBiasSnippet = addBias ? 'result += getBiasAtOutCoords();' : '';\n if (addBias) {\n this.variableNames.push('bias');\n }\n if (hasPreluActivation) {\n this.variableNames.push('preluActivationWeights');\n }\n if (hasLeakyReluAlpha) {\n this.variableNames.push('leakyreluAlpha');\n }\n this.userCode = `\n ${activationSnippet}\n\n void main() {\n ivec4 coords = getOutputCoords();\n int batch = coords.x;\n ivec2 xRCCorner = coords.yz * strides - pads;\n int d2 = coords.w;\n int d1 = d2 / ${channelMul};\n int q = d2 - d1 * ${channelMul};\n\n int xRCorner = xRCCorner.x;\n int xCCorner = xRCCorner.y;\n\n // Convolve x(?, ?, d1) with w(:, :, d1, q) to get y(yR, yC, d2).\n // ? = to be determined. : = across all values in that axis.\n float dotProd = 0.0;\n // TO DO(dsmilkov): Flatten the two for loops and vec4 the operations.\n for (int wR = 0; wR < ${filterHeight}; wR++) {\n int xR = xRCorner + wR * dilations[0];\n\n if (xR < 0 || xR >= inDims[0]) {\n continue;\n }\n\n for (int wC = 0; wC < ${filterWidth}; wC++) {\n int xC = xCCorner + wC * dilations[1];\n\n if (xC < 0 || xC >= inDims[1]) {\n continue;\n }\n\n float xVal = getX(batch, xR, xC, d1);\n float wVal = getW(wR, wC, d1, q);\n dotProd += xVal * wVal;\n }\n }\n\n float result = dotProd;\n ${addBiasSnippet}\n ${applyActivationSnippet}\n setOutput(result);\n }\n `;\n }\n}\n//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY29udl9ncHVfZGVwdGh3aXNlLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vdGZqcy1iYWNrZW5kLXdlYmdsL3NyYy9jb252X2dwdV9kZXB0aHdpc2UudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUE7Ozs7Ozs7Ozs7Ozs7OztHQWVHO0FBR0gsT0FBTyxFQUFlLGdCQUFnQixFQUFDLE1BQU0sY0FBYyxDQUFDO0FBRTVELE1BQU0sT0FBTyxzQkFBc0I7SUFZakMsWUFDSSxRQUFpQyxFQUFFLE9BQU8sR0FBRyxLQUFLLEVBQ2xELGFBQXFCLElBQUksRUFBRSxrQkFBa0IsR0FBRyxLQUFLLEVBQ3JELGlCQUFpQixHQUFHLEtBQUs7UUFkN0Isa0JBQWEsR0FBRyxDQUFDLEdBQUcsRUFBRSxHQUFHLENBQUMsQ0FBQztRQUkzQixtQkFBYyxHQUFHO1lBQ2YsRUFBQyxJQUFJLEVBQUUsTUFBTSxFQUFFLElBQUksRUFBRSxPQUFnQixFQUFFO1lBQ3ZDLEVBQUMsSUFBSSxFQUFFLFNBQVMsRUFBRSxJQUFJLEVBQUUsT0FBZ0IsRUFBRTtZQUMxQyxFQUFDLElBQUksRUFBRSxXQUFXLEVBQUUsSUFBSSxFQUFFLE9BQWdCLEVBQUU7WUFDNUMsRUFBQyxJQUFJLEVBQUUsUUFBUSxFQUFFLElBQUksRUFBRSxPQUFnQixFQUFFO1NBQzFDLENBQUM7UUFNQSxJQUFJLENBQUMsV0FBVyxHQUFHLFFBQVEsQ0FBQyxRQUFRLENBQUM7UUFDckMsSUFBSSxDQUFDLG1CQUFtQixHQUFHLGdCQUFnQixDQUFDLElBQUksQ0FBQyxXQUFXLENBQUMsTUFBTSxDQUFDLENBQUM7UUFFckUsTUFBTSxZQUFZLEdBQUcsUUFBUSxDQUFDLFlBQVksQ0FBQztRQUMzQyxNQUFNLFdBQVcsR0FBRyxRQUFRLENBQUMsV0FBVyxDQUFDO1FBQ3pDLE1BQU0sVUFBVSxHQUFHLFFBQVEsQ0FBQyxXQUFXLEdBQUcsUUFBUSxDQUFDLFVBQVUsQ0FBQztRQUU5RCxJQUFJLGlCQUFpQixHQUFHLEVBQUUsRUFBRSxzQkFBc0IsR0FBRyxFQUFFLENBQUM7UUFDeEQsSUFBSSxVQUFVLEVBQUU7WUFDZCxJQUFJLGtCQUFrQixFQUFFO2dCQUN0QixpQkFBaUIsR0FBRzs7WUFFaEIsVUFBVTtVQUNaLENBQUM7YUFDSjtpQkFBTSxJQUFJLGlCQUFpQixFQUFFO2dCQUM1QixpQkFBaUIsR0FBRzs7WUFFaEIsVUFBVTtVQUNaLENBQUM7YUFDSjtpQkFBTTtnQkFDTCxpQkFBaUIsR0FBRzs7Y0FFZCxVQUFVOztTQUVmLENBQUM7YUFDSDtZQUVELHNCQUFzQixHQUFHLDhCQUE4QixDQUFDO1NBQ3pEO1FBRUQsTUFBTSxjQUFjLEdBQUcsT0FBTyxDQUFDLENBQUMsQ0FBQyxpQ0FBaUMsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDO1FBQ3hFLElBQUksT0FBTyxFQUFFO1lBQ1gsSUFBSSxDQUFDLGFBQWEsQ0FBQyxJQUFJLENBQUMsTUFBTSxDQUFDLENBQUM7U0FDakM7UUFFRCxJQUFJLGtCQUFrQixFQUFFO1lBQ3RCLElBQUksQ0FBQyxhQUFhLENBQUMsSUFBSSxDQUFDLHdCQUF3QixDQUFDLENBQUM7U0FDbkQ7UUFDRCxJQUFJLGlCQUFpQixFQUFFO1lBQ3JCLElBQUksQ0FBQyxhQUFhLENBQUMsSUFBSSxDQUFDLGdCQUFnQixDQUFDLENBQUM7U0FDM0M7UUFFRCxJQUFJLENBQUMsUUFBUSxHQUFHO1FBQ1osaUJBQWlCOzs7Ozs7O3dCQU9ELFVBQVU7NEJBQ04sVUFBVTs7Ozs7Ozs7O2dDQVNOLFlBQVk7Ozs7Ozs7a0NBT1YsV0FBVzs7Ozs7Ozs7Ozs7Ozs7VUFjbkMsY0FBYztVQUNkLHNCQUFzQjs7O0tBRzNCLENBQUM7SUFDSixDQUFDO0NBQ0YiLCJzb3VyY2VzQ29udGVudCI6WyIvKipcbiAqIEBsaWNlbnNlXG4gKiBDb3B5cmlnaHQgMjAxNyBHb29nbGUgTExDLiBBbGwgUmlnaHRzIFJlc2VydmVkLlxuICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlIFwiTGljZW5zZVwiKTtcbiAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS5cbiAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdFxuICpcbiAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMFxuICpcbiAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmVcbiAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuIFwiQVMgSVNcIiBCQVNJUyxcbiAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLlxuICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZFxuICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuXG4gKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuICovXG5cbmltcG9ydCB7YmFja2VuZF91dGlsfSBmcm9tICdAdGVuc29yZmxvdy90ZmpzLWNvcmUnO1xuaW1wb3J0IHtHUEdQVVByb2dyYW0sIHVzZVNoYXBlVW5pZm9ybXN9IGZyb20gJy4vZ3BncHVfbWF0aCc7XG5cbmV4cG9ydCBjbGFzcyBEZXB0aHdpc2VDb252MkRQcm9ncmFtIGltcGxlbWVudHMgR1BHUFVQcm9ncmFtIHtcbiAgdmFyaWFibGVOYW1lcyA9IFsneCcsICdXJ107XG4gIG91dHB1dFNoYXBlOiBudW1iZXJbXTtcbiAgdXNlckNvZGU6IHN0cmluZztcbiAgZW5hYmxlU2hhcGVVbmlmb3JtczogYm9vbGVhbjtcbiAgY3VzdG9tVW5pZm9ybXMgPSBbXG4gICAge25hbWU6ICdwYWRzJywgdHlwZTogJ2l2ZWMyJyBhcyBjb25zdCB9LFxuICAgIHtuYW1lOiAnc3RyaWRlcycsIHR5cGU6ICdpdmVjMicgYXMgY29uc3QgfSxcbiAgICB7bmFtZTogJ2RpbGF0aW9ucycsIHR5cGU6ICdpdmVjMicgYXMgY29uc3QgfSxcbiAgICB7bmFtZTogJ2luRGltcycsIHR5cGU6ICdpdmVjMicgYXMgY29uc3QgfSxcbiAgXTtcblxuICBjb25zdHJ1Y3RvcihcbiAgICAgIGNvbnZJbmZvOiBiYWNrZW5kX3V0aWwuQ29udjJESW5mbywgYWRkQmlhcyA9IGZhbHNlLFxuICAgICAgYWN0aXZhdGlvbjogc3RyaW5nID0gbnVsbCwgaGFzUHJlbHVBY3RpdmF0aW9uID0gZmFsc2UsXG4gICAgICBoYXNMZWFreVJlbHVBbHBoYSA9IGZhbHNlKSB7XG4gICAgdGhpcy5vdXRwdXRTaGFwZSA9IGNvbnZJbmZvLm91dFNoYXBlO1xuICAgIHRoaXMuZW5hYmxlU2hhcGVVbmlmb3JtcyA9IHVzZVNoYXBlVW5pZm9ybXModGhpcy5vdXRwdXRTaGFwZS5sZW5ndGgpO1xuXG4gICAgY29uc3QgZmlsdGVySGVpZ2h0ID0gY29udkluZm8uZmlsdGVySGVpZ2h0O1xuICAgIGNvbnN0IGZpbHRlcldpZHRoID0gY29udkluZm8uZmlsdGVyV2lkdGg7XG4gICAgY29uc3QgY2hhbm5lbE11bCA9IGNvbnZJbmZvLm91dENoYW5uZWxzIC8gY29udkluZm8uaW5DaGFubmVscztcblxuICAgIGxldCBhY3RpdmF0aW9uU25pcHBldCA9ICcnLCBhcHBseUFjdGl2YXRpb25TbmlwcGV0ID0gJyc7XG4gICAgaWYgKGFjdGl2YXRpb24pIHtcbiAgICAgIGlmIChoYXNQcmVsdUFjdGl2YXRpb24pIHtcbiAgICAgICAgYWN0aXZhdGlvblNuaXBwZXQgPSBgZmxvYXQgYWN0aXZhdGlvbihmbG9hdCBhKSB7XG4gICAgICAgICAgZmxvYXQgYiA9IGdldFByZWx1QWN0aXZhdGlvbldlaWdodHNBdE91dENvb3JkcygpO1xuICAgICAgICAgICR7YWN0aXZhdGlvbn1cbiAgICAgICAgfWA7XG4gICAgICB9IGVsc2UgaWYgKGhhc0xlYWt5UmVsdUFscGhhKSB7XG4gICAgICAgIGFjdGl2YXRpb25TbmlwcGV0ID0gYGZsb2F0IGFjdGl2YXRpb24oZmxvYXQgYSkge1xuICAgICAgICAgIGZsb2F0IGIgPSBnZXRMZWFreXJlbHVBbHBoYUF0T3V0Q29vcmRzKCk7XG4gICAgICAgICAgJHthY3RpdmF0aW9ufVxuICAgICAgICB9YDtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIGFjdGl2YXRpb25TbmlwcGV0ID0gYFxuICAgICAgICAgIGZsb2F0IGFjdGl2YXRpb24oZmxvYXQgeCkge1xuICAgICAgICAgICAgJHthY3RpdmF0aW9ufVxuICAgICAgICAgIH1cbiAgICAgICAgYDtcbiAgICAgIH1cblxuICAgICAgYXBwbHlBY3RpdmF0aW9uU25pcHBldCA9IGByZXN1bHQgPSBhY3RpdmF0aW9uKHJlc3VsdCk7YDtcbiAgICB9XG5cbiAgICBjb25zdCBhZGRCaWFzU25pcHBldCA9IGFkZEJpYXMgPyAncmVzdWx0ICs9IGdldEJpYXNBdE91dENvb3JkcygpOycgOiAnJztcbiAgICBpZiAoYWRkQmlhcykge1xuICAgICAgdGhpcy52YXJpYWJsZU5hbWVzLnB1c2goJ2JpYXMnKTtcbiAgICB9XG5cbiAgICBpZiAoaGFzUHJlbHVBY3RpdmF0aW9uKSB7XG4gICAgICB0aGlzLnZhcmlhYmxlTmFtZXMucHVzaCgncHJlbHVBY3RpdmF0aW9uV2VpZ2h0cycpO1xuICAgIH1cbiAgICBpZiAoaGFzTGVha3lSZWx1QWxwaGEpIHtcbiAgICAgIHRoaXMudmFyaWFibGVOYW1lcy5wdXNoKCdsZWFreXJlbHVBbHBoYScpO1xuICAgIH1cblxuICAgIHRoaXMudXNlckNvZGUgPSBgXG4gICAgICAke2FjdGl2YXRpb25TbmlwcGV0fVxuXG4gICAgICB2b2lkIG1haW4oKSB7XG4gICAgICAgIGl2ZWM0IGNvb3JkcyA9IGdldE91dHB1dENvb3JkcygpO1xuICAgICAgICBpbnQgYmF0Y2ggPSBjb29yZHMueDtcbiAgICAgICAgaXZlYzIgeFJDQ29ybmVyID0gY29vcmRzLnl6ICogc3RyaWRlcyAtIHBhZHM7XG4gICAgICAgIGludCBkMiA9IGNvb3Jkcy53O1xuICAgICAgICBpbnQgZDEgPSBkMiAvICR7Y2hhbm5lbE11bH07XG4gICAgICAgIGludCBxID0gZDIgLSBkMSAqICR7Y2hhbm5lbE11bH07XG5cbiAgICAgICAgaW50IHhSQ29ybmVyID0geFJDQ29ybmVyLng7XG4gICAgICAgIGludCB4Q0Nvcm5lciA9IHhSQ0Nvcm5lci55O1xuXG4gICAgICAgIC8vIENvbnZvbHZlIHgoPywgPywgZDEpIHdpdGggdyg6LCA6LCBkMSwgcSkgdG8gZ2V0IHkoeVIsIHlDLCBkMikuXG4gICAgICAgIC8vID8gPSB0byBiZSBkZXRlcm1pbmVkLiA6ID0gYWNyb3NzIGFsbCB2YWx1ZXMgaW4gdGhhdCBheGlzLlxuICAgICAgICBmbG9hdCBkb3RQcm9kID0gMC4wO1xuICAgICAgICAvLyBUTyBETyhkc21pbGtvdik6IEZsYXR0ZW4gdGhlIHR3byBmb3IgbG9vcHMgYW5kIHZlYzQgdGhlIG9wZXJhdGlvbnMuXG4gICAgICAgIGZvciAoaW50IHdSID0gMDsgd1IgPCAke2ZpbHRlckhlaWdodH07IHdSKyspIHtcbiAgICAgICAgICBpbnQgeFIgPSB4UkNvcm5lciArIHdSICogZGlsYXRpb25zWzBdO1xuXG4gICAgICAgICAgaWYgKHhSIDwgMCB8fCB4UiA+PSBpbkRpbXNbMF0pIHtcbiAgICAgICAgICAgIGNvbnRpbnVlO1xuICAgICAgICAgIH1cblxuICAgICAgICAgIGZvciAoaW50IHdDID0gMDsgd0MgPCAke2ZpbHRlcldpZHRofTsgd0MrKykge1xuICAgICAgICAgICAgaW50IHhDID0geENDb3JuZXIgKyB3QyAqIGRpbGF0aW9uc1sxXTtcblxuICAgICAgICAgICAgaWYgKHhDIDwgMCB8fCB4QyA+PSBpbkRpbXNbMV0pIHtcbiAgICAgICAgICAgICAgY29udGludWU7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIGZsb2F0IHhWYWwgPSBnZXRYKGJhdGNoLCB4UiwgeEMsIGQxKTtcbiAgICAgICAgICAgIGZsb2F0IHdWYWwgPSBnZXRXKHdSLCB3QywgZDEsIHEpO1xuICAgICAgICAgICAgZG90UHJvZCArPSB4VmFsICogd1ZhbDtcbiAgICAgICAgICB9XG4gICAgICAgIH1cblxuICAgICAgICBmbG9hdCByZXN1bHQgPSBkb3RQcm9kO1xuICAgICAgICAke2FkZEJpYXNTbmlwcGV0fVxuICAgICAgICAke2FwcGx5QWN0aXZhdGlvblNuaXBwZXR9XG4gICAgICAgIHNldE91dHB1dChyZXN1bHQpO1xuICAgICAgfVxuICAgIGA7XG4gIH1cbn1cbiJdfQ==","/**\n * @license\n * Copyright 2018 Google LLC. All Rights Reserved.\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n * =============================================================================\n */\nimport { util } from '@tensorflow/tfjs-core';\nimport { useShapeUniforms } from './gpgpu_math';\nexport class DepthwiseConvPacked2DProgram {\n constructor(convInfo, addBias = false, activation = null, hasPreluActivation = false, hasLeakyReluAlpha = false) {\n this.variableNames = ['x', 'W'];\n this.packedInputs = true;\n this.packedOutput = true;\n this.customUniforms = [\n { name: 'pads', type: 'ivec2' },\n { name: 'strides', type: 'ivec2' },\n { name: 'dilations', type: 'ivec2' },\n { name: 'inDims', type: 'ivec2' },\n ];\n this.outputShape = convInfo.outShape;\n this.enableShapeUniforms = useShapeUniforms(this.outputShape.length);\n const channelMul = convInfo.outChannels / convInfo.inChannels;\n const padLeft = convInfo.padInfo.left;\n const strideWidth = convInfo.strideWidth;\n const dilationWidth = convInfo.dilationWidth;\n const filterHeight = convInfo.filterHeight;\n const filterWidth = convInfo.filterWidth;\n const texelsAcross = filterWidth;\n let mainLoop = `\n int xR; int xC; int xCOffset;\n vec4 wTexel; vec4 previous; vec4 final;`;\n for (let c = 0; c < filterWidth; c++) {\n mainLoop += `\n vec4 xTexelC${c * 2};\n int xTexelC${c * 2}Ready;\n vec4 xTexelC${c * 2 + 1};\n int xTexelC${c * 2 + 1}Ready;\n vec4 xC${c};`;\n }\n /**\n * This vectorized implementation works by gathering the values needed for\n * each output channel's dot product into vec4's and then multiplying them\n * all together (this happens in the final double for-loop below). Most of\n * the main loop consists of constructing these vec4's with the minimum\n * number of texture2D calls, which means making use of all four returned\n * values from a texture2D call at once.\n */\n mainLoop += `\n for (int r = 0; r < ${filterHeight}; r++) {\n `;\n for (let c = 0; c < filterWidth; c++) {\n mainLoop += `\n xTexelC${c * 2} = vec4(0.0);\n xTexelC${c * 2}Ready = 0;\n xTexelC${c * 2 + 1} = vec4(0.0);\n xTexelC${c * 2 + 1}Ready = 0;\n xC${c} = vec4(0.0);`;\n }\n mainLoop += `\n xR = xRCorner + r * dilations[0];\n if (xR >=0 && xR < inDims[0]) {\n `;\n for (let texelC = 0; texelC < (texelsAcross + 1) / 2; texelC++) {\n const colIndex = texelC * 2;\n mainLoop += `\n xC = xCCorner + ${colIndex * dilationWidth};\n `;\n if (strideWidth === 1) {\n if (colIndex < filterWidth) {\n // If padding is odd, the outer texels have to be composed.\n if (padLeft % 2 === 1) {\n // TODO: Ensure vec4 previous does not result in redundant sample,\n // and avoid setting xTexelRC's that exceed the boundary in the\n // first place rather than resetting them to vec4(0)).\n // To compute xCOffset:\n // - If padding is odd, we must add 1 to ensure we ask for an\n // even-numbered row.\n // - We subtract 2 to access the previous texel.\n mainLoop += `\n xCOffset = xC + 1;\n if (xCOffset >= 0 && xCOffset < inDims[1] && xTexelC${colIndex}Ready == 0) {\n xTexelC${colIndex} = getX(batch, xR, xCOffset, d1);\n\n // Need to manually clear unused channels in case\n // we're reading from recycled texture.\n if (xCOffset + 1 >= inDims[1]) {\n xTexelC${colIndex}.zw = vec2(0.0);\n }\n xTexelC${colIndex}Ready = 1;\n }\n `;\n // This texel has been read in previous iteration if the dilation\n // is 1.\n if (dilationWidth === 1 && colIndex > 0) {\n mainLoop += `\n xC${colIndex} = vec4(xTexelC${colIndex - 2}.zw, xTexelC${colIndex}.xy);\n `;\n }\n else {\n mainLoop += `\n xCOffset = xC + 1 - 2;\n\n if (xCOffset >= 0 && xCOffset < inDims[1]) {\n previous = getX(batch, xR, xCOffset, d1);\n\n // Need to manually clear unused channels in case\n // we're reading from recycled texture.\n if (xCOffset + 1 >= inDims[1]) {\n previous.zw = vec2(0.0);\n }\n\n xC${colIndex} = vec4(previous.zw, xTexelC${colIndex}.xy);\n } else {\n xC${colIndex} = vec4(0.0, 0.0, xTexelC${colIndex}.xy);\n }\n `;\n }\n }\n else {\n // Padding is even, so xRC corresponds to a single texel.\n mainLoop += `\n if (xC >= 0 && xC < inDims[1] && xTexelC${colIndex}Ready == 0) {\n xTexelC${colIndex} = getX(batch, xR, xC, d1);\n if (xC + 1 >= inDims[1]) {\n xTexelC${colIndex}.zw = vec2(0.0);\n }\n xTexelC${colIndex}Ready = 1;\n }\n\n xC${colIndex} = xTexelC${colIndex};\n `;\n }\n if (colIndex + 1 < filterWidth) {\n // If dilation is even, the second entry should match the first\n // (either both are composed or both are single samples). But if\n // dilation is odd, then the second entry should be the opposite\n // of the first (if the first is composed, the second is a single\n // sample, and vice versa.)\n const nextTexelOffset = padLeft % 2 === 0 ?\n util.nearestLargerEven(dilationWidth) :\n dilationWidth;\n if ((dilationWidth % 2 === 0 && padLeft % 2 === 1) ||\n (dilationWidth % 2 !== 0 && padLeft % 2 !== 1)) {\n mainLoop += `\n xCOffset = xC + imod(pads[1], 2) + ${nextTexelOffset};\n\n if (xCOffset >= 0 && xCOffset < inDims[1] && xTexelC${colIndex + 1}Ready == 0) {\n xTexelC${colIndex + 1} = getX(batch, xR, xCOffset, d1);\n\n // Need to manually clear unused channels in case\n // we're reading from recycled texture.\n if (xCOffset + 1 >= inDims[1]) {\n xTexelC${colIndex + 1}.zw = vec2(0.0);\n }\n xTexelC${colIndex + 1}Ready = 1;\n }\n `;\n // If dilation > 1 then the xRC's will not be able to share any\n // values, so each xRC will require two unique calls to getX.\n if (dilationWidth > 1) {\n mainLoop += `\n xCOffset -= 2;\n if (xCOffset >= 0 && xCOffset < inDims[1]) {\n previous = getX(batch, xR, xCOffset, d1);\n xC${colIndex + 1} = vec4(previous.zw, xTexelC${colIndex + 1}.xy);\n } else {\n xC${colIndex + 1} = vec4(0.0, 0.0, xTexelC${colIndex + 1}.xy);\n }\n `;\n }\n else {\n mainLoop += `\n xC${colIndex + 1} = vec4(xTexelC${colIndex}.zw, xTexelC${colIndex + 1}.xy);\n `;\n }\n }\n else {\n // If dilation is 1 and padding is odd, we have already read the\n // texel when constructing the previous x value. Here we can\n // simply skip the texture read.\n if (nextTexelOffset === 1) {\n mainLoop += `\n xC${colIndex + 1} = xTexelC${colIndex};\n `;\n }\n else {\n mainLoop += `\n xCOffset = xC + ${nextTexelOffset};\n\n if (xCOffset >= 0 && xCOffset < inDims[1] && xTexelC${colIndex + 1}Ready == 0) {\n xTexelC${colIndex + 1} = getX(batch, xR, xCOffset, d1);\n if (xCOffset + 1 >= inDims[1]) {\n xTexelC${colIndex + 1}.zw = vec2(0.0);\n }\n xTexelC${colIndex + 1}Ready = 1;\n }\n\n xC${colIndex + 1} = xTexelC${colIndex + 1};\n `;\n }\n }\n }\n }\n }\n else { // stride === 2\n if (colIndex < filterWidth) {\n // Depending on whether padLeft is even or odd, we want either the\n // xy or zw channels from X texels for xC${colIndex}. If padLeft is\n // even, xC${colIndex +1} is simply the zw channels of texels we've\n // already sampled. But if padLeft is odd, xC{$c + 1}.zw will\n // need to come from the xy channels of a new texel, hence the `\n // vec4\n // final` initialized below.\n if (padLeft % 2 === 1) {\n mainLoop += `\n xCOffset = xC + 1 - strides[1];\n if(xCOffset >= 0 && xCOffset < inDims[1] && xTexelC${colIndex}Ready == 0) {\n xTexelC${colIndex} = getX(batch, xR, xCOffset, d1);\n // Need to manually clear unused channels in case\n // we're reading from recycled texture.\n if (xCOffset + 1 >= inDims[1]) {\n xTexelC${colIndex}.zw = vec2(0.0);\n }\n xTexelC${colIndex}Ready = 1;\n }\n\n if(xC + 1 >= 0 && xC + 1 < inDims[1] && xTexelC${colIndex + 1}Ready == 0) {\n xTexelC${colIndex + 1} = getX(batch, xR, xC + 1, d1);\n // Need to manually clear unused channels in case\n // we're reading from recycled texture.\n if (xC + 2 >= inDims[1]) {\n xTexelC${colIndex + 1}.zw = vec2(0.0);\n }\n xTexelC${colIndex + 1}Ready = 1;\n }\n\n xC${colIndex} = vec4(xTexelC${colIndex}.zw, xTexelC${colIndex + 1}.zw);\n `;\n if (colIndex + 1 < filterWidth) {\n mainLoop += `\n final = vec4(0.0);\n xCOffset = xC + 1 + strides[1];\n if(xCOffset >= 0 && xCOffset < inDims[1]) {\n final = getX(batch, xR, xCOffset, d1);\n }\n xC${colIndex + 1} = vec4(xTexelC${colIndex + 1}.xy, final.xy);\n `;\n }\n }\n else {\n mainLoop += `\n if(xC >= 0 && xC < inDims[1] && xTexelC${colIndex}Ready == 0) {\n xTexelC${colIndex} = getX(batch, xR, xC, d1);\n if (xC + 1 >= inDims[1]) {\n xTexelC${colIndex}.zw = vec2(0.0);\n }\n xTexelC${colIndex}Ready = 1;\n }\n\n xCOffset = xC + strides[1];\n if(xCOffset >= 0 && xCOffset < inDims[1] && xTexelC${colIndex + 1}Ready == 0) {\n xTexelC${colIndex + 1} = getX(batch, xR, xCOffset, d1);\n if (xCOffset + 1 >= inDims[1]) {\n xTexelC${colIndex + 1}.zw = vec2(0.);\n }\n xTexelC${colIndex + 1}Ready = 1;\n }\n\n xC${colIndex} = vec4(\n xTexelC${colIndex}.xy, xTexelC${colIndex + 1}.xy);\n `;\n if (colIndex + 1 < filterWidth) {\n mainLoop += `\n xC${colIndex + 1} = vec4(xTexelC${colIndex}.zw, xTexelC${colIndex + 1}.zw);\n `;\n }\n }\n }\n }\n // localize the dotProd accumulation within the loop, the theory is for\n // GPU with limited cache, accumulate sum across large amount of\n // veriables will cause lots of cache misses. (i.e. 5x5 filter will have\n // 50 variables)\n if (colIndex < filterWidth) {\n mainLoop += `\n wTexel = getW(r, ${colIndex}, d1, q);\n dotProd += xC${colIndex} * vec4(wTexel.xz, wTexel.xz);\n `;\n if (colIndex + 1 < filterWidth) {\n mainLoop += `\n wTexel = getW(r, ${colIndex + 1}, d1, q);\n dotProd += xC${colIndex + 1} * vec4(wTexel.xz, wTexel.xz);\n `;\n }\n }\n }\n mainLoop += `\n }\n `;\n mainLoop += `\n }\n `;\n let activationSnippet = '', applyActivationSnippet = '';\n if (activation) {\n if (hasPreluActivation) {\n activationSnippet = `vec4 activation(vec4 a) {\n vec4 b = getPreluActivationWeightsAtOutCoords();\n ${activation}\n }`;\n }\n else if (hasLeakyReluAlpha) {\n activationSnippet = `vec4 activation(vec4 a) {\n vec4 b = getLeakyreluAlphaAtOutCoords();\n ${activation}\n }`;\n }\n else {\n activationSnippet = `vec4 activation(vec4 x) {\n ${activation}\n }`;\n }\n applyActivationSnippet = `result = activation(result);`;\n }\n const addBiasSnippet = addBias ? 'result += getBiasAtOutCoords();' : '';\n if (addBias) {\n this.variableNames.push('bias');\n }\n if (hasPreluActivation) {\n this.variableNames.push('preluActivationWeights');\n }\n if (hasLeakyReluAlpha) {\n this.variableNames.push('leakyreluAlpha');\n }\n this.userCode = `\n ${activationSnippet}\n\n void main() {\n ivec4 coords = getOutputCoords();\n int batch = coords.x;\n ivec2 xRCCorner = coords.yz * strides - pads;\n int d2 = coords.w;\n int d1 = d2 / ${channelMul};\n int q = d2 - d1 * ${channelMul};\n int xRCorner = xRCCorner.x;\n int xCCorner = xRCCorner.y;\n\n //intialize dotProd with a small epsilon seems to reduce GPU accuracy loss.\n vec4 dotProd = vec4(0.000000000000001);\n\n ${mainLoop}\n\n vec4 result = dotProd - vec4(0.000000000000001);\n ${addBiasSnippet}\n ${applyActivationSnippet}\n setOutput(result);\n }\n `;\n }\n}\n//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY29udl9wYWNrZWRfZ3B1X2RlcHRod2lzZS5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uL3RmanMtYmFja2VuZC13ZWJnbC9zcmMvY29udl9wYWNrZWRfZ3B1X2RlcHRod2lzZS50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQTs7Ozs7Ozs7Ozs7Ozs7O0dBZUc7QUFFSCxPQUFPLEVBQWUsSUFBSSxFQUFDLE1BQU0sdUJBQXVCLENBQUM7QUFFekQsT0FBTyxFQUFlLGdCQUFnQixFQUFDLE1BQU0sY0FBYyxDQUFDO0FBRTVELE1BQU0sT0FBTyw0QkFBNEI7SUFjdkMsWUFDSSxRQUFpQyxFQUFFLE9BQU8sR0FBRyxLQUFLLEVBQ2xELGFBQXFCLElBQUksRUFBRSxrQkFBa0IsR0FBRyxLQUFLLEVBQ3JELGlCQUFpQixHQUFHLEtBQUs7UUFoQjdCLGtCQUFhLEdBQUcsQ0FBQyxHQUFHLEVBQUUsR0FBRyxDQUFDLENBQUM7UUFDM0IsaUJBQVksR0FBRyxJQUFJLENBQUM7UUFDcEIsaUJBQVksR0FBRyxJQUFJLENBQUM7UUFJcEIsbUJBQWMsR0FBRztZQUNmLEVBQUMsSUFBSSxFQUFFLE1BQU0sRUFBRSxJQUFJLEVBQUUsT0FBZ0IsRUFBRTtZQUN2QyxFQUFDLElBQUksRUFBRSxTQUFTLEVBQUUsSUFBSSxFQUFFLE9BQWdCLEVBQUU7WUFDMUMsRUFBQyxJQUFJLEVBQUUsV0FBVyxFQUFFLElBQUksRUFBRSxPQUFnQixFQUFFO1lBQzVDLEVBQUMsSUFBSSxFQUFFLFFBQVEsRUFBRSxJQUFJLEVBQUUsT0FBZ0IsRUFBRTtTQUMxQyxDQUFDO1FBTUEsSUFBSSxDQUFDLFdBQVcsR0FBRyxRQUFRLENBQUMsUUFBUSxDQUFDO1FBQ3JDLElBQUksQ0FBQyxtQkFBbUIsR0FBRyxnQkFBZ0IsQ0FBQyxJQUFJLENBQUMsV0FBVyxDQUFDLE1BQU0sQ0FBQyxDQUFDO1FBQ3JFLE1BQU0sVUFBVSxHQUFHLFFBQVEsQ0FBQyxXQUFXLEdBQUcsUUFBUSxDQUFDLFVBQVUsQ0FBQztRQUM5RCxNQUFNLE9BQU8sR0FBRyxRQUFRLENBQUMsT0FBTyxDQUFDLElBQUksQ0FBQztRQUN0QyxNQUFNLFdBQVcsR0FBRyxRQUFRLENBQUMsV0FBVyxDQUFDO1FBQ3pDLE1BQU0sYUFBYSxHQUFHLFFBQVEsQ0FBQyxhQUFhLENBQUM7UUFDN0MsTUFBTSxZQUFZLEdBQUcsUUFBUSxDQUFDLFlBQVksQ0FBQztRQUMzQyxNQUFNLFdBQVcsR0FBRyxRQUFRLENBQUMsV0FBVyxDQUFDO1FBQ3pDLE1BQU0sWUFBWSxHQUFHLFdBQVcsQ0FBQztRQUVqQyxJQUFJLFFBQVEsR0FBRzs7OENBRTJCLENBQUM7UUFFM0MsS0FBSyxJQUFJLENBQUMsR0FBRyxDQUFDLEVBQUUsQ0FBQyxHQUFHLFdBQVcsRUFBRSxDQUFDLEVBQUUsRUFBRTtZQUNwQyxRQUFRLElBQUk7d0JBQ00sQ0FBQyxHQUFHLENBQUM7dUJBQ04sQ0FBQyxHQUFHLENBQUM7d0JBQ0osQ0FBQyxHQUFHLENBQUMsR0FBRyxDQUFDO3VCQUNWLENBQUMsR0FBRyxDQUFDLEdBQUcsQ0FBQzttQkFDYixDQUFDLEdBQUcsQ0FBQztTQUNuQjtRQUVEOzs7Ozs7O1dBT0c7UUFDSCxRQUFRLElBQUk7MEJBQ1UsWUFBWTtPQUMvQixDQUFDO1FBQ0osS0FBSyxJQUFJLENBQUMsR0FBRyxDQUFDLEVBQUUsQ0FBQyxHQUFHLFdBQVcsRUFBRSxDQUFDLEVBQUUsRUFBRTtZQUNwQyxRQUFRLElBQUk7bUJBQ0MsQ0FBQyxHQUFHLENBQUM7bUJBQ0wsQ0FBQyxHQUFHLENBQUM7bUJBQ0wsQ0FBQyxHQUFHLENBQUMsR0FBRyxDQUFDO21CQUNULENBQUMsR0FBRyxDQUFDLEdBQUcsQ0FBQztjQUNkLENBQUMsZUFBZSxDQUFDO1NBQzFCO1FBQ0QsUUFBUSxJQUFJOzs7T0FHVCxDQUFDO1FBRUosS0FBSyxJQUFJLE1BQU0sR0FBRyxDQUFDLEVBQUUsTUFBTSxHQUFHLENBQUMsWUFBWSxHQUFHLENBQUMsQ0FBQyxHQUFHLENBQUMsRUFBRSxNQUFNLEVBQUUsRUFBRTtZQUM5RCxNQUFNLFFBQVEsR0FBRyxNQUFNLEdBQUcsQ0FBQyxDQUFDO1lBRTVCLFFBQVEsSUFBSTs0QkFDVSxRQUFRLEdBQUcsYUFBYTtXQUN6QyxDQUFDO1lBRU4sSUFBSSxXQUFXLEtBQUssQ0FBQyxFQUFFO2dCQUNyQixJQUFJLFFBQVEsR0FBRyxXQUFXLEVBQUU7b0JBQzFCLDJEQUEyRDtvQkFDM0QsSUFBSSxPQUFPLEdBQUcsQ0FBQyxLQUFLLENBQUMsRUFBRTt3QkFDckIsa0VBQWtFO3dCQUNsRSwrREFBK0Q7d0JBQy9ELHNEQUFzRDt3QkFFdEQsdUJBQXVCO3dCQUN2Qiw2REFBNkQ7d0JBQzdELHFCQUFxQjt3QkFDckIsZ0RBQWdEO3dCQUVoRCxRQUFRLElBQUk7O3NFQUdSLFFBQVE7MkJBQ0csUUFBUTs7Ozs7NkJBS04sUUFBUTs7MkJBRVYsUUFBUTs7ZUFFcEIsQ0FBQzt3QkFDSixpRUFBaUU7d0JBQ2pFLFFBQVE7d0JBQ1IsSUFBSSxhQUFhLEtBQUssQ0FBQyxJQUFJLFFBQVEsR0FBRyxDQUFDLEVBQUU7NEJBQ3ZDLFFBQVEsSUFBSTtvQkFDTixRQUFRLGtCQUFrQixRQUFRLEdBQUcsQ0FBQyxlQUN4QyxRQUFRO2lCQUNULENBQUM7eUJBQ0w7NkJBQU07NEJBQ0wsUUFBUSxJQUFJOzs7Ozs7Ozs7Ozs7d0JBWUYsUUFBUSwrQkFBK0IsUUFBUTs7d0JBRS9DLFFBQVEsNEJBQTRCLFFBQVE7O21CQUVqRCxDQUFDO3lCQUNQO3FCQUNGO3lCQUFNO3dCQUNMLHlEQUF5RDt3QkFDekQsUUFBUSxJQUFJOzBEQUNrQyxRQUFROzJCQUN2QyxRQUFROzs2QkFFTixRQUFROzsyQkFFVixRQUFROzs7b0JBR2YsUUFBUSxhQUFhLFFBQVE7aUJBQ2hDLENBQUM7cUJBQ1A7b0JBRUQsSUFBSSxRQUFRLEdBQUcsQ0FBQyxHQUFHLFdBQVcsRUFBRTt3QkFDOUIsK0RBQStEO3dCQUMvRCxnRUFBZ0U7d0JBQ2hFLGdFQUFnRTt3QkFDaEUsaUVBQWlFO3dCQUNqRSwyQkFBMkI7d0JBRTNCLE1BQU0sZUFBZSxHQUFHLE9BQU8sR0FBRyxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUM7NEJBQ3ZDLElBQUksQ0FBQyxpQkFBaUIsQ0FBQyxhQUFhLENBQUMsQ0FBQyxDQUFDOzRCQUN2QyxhQUFhLENBQUM7d0JBRWxCLElBQUksQ0FBQyxhQUFhLEdBQUcsQ0FBQyxLQUFLLENBQUMsSUFBSSxPQUFPLEdBQUcsQ0FBQyxLQUFLLENBQUMsQ0FBQzs0QkFDOUMsQ0FBQyxhQUFhLEdBQUcsQ0FBQyxLQUFLLENBQUMsSUFBSSxPQUFPLEdBQUcsQ0FBQyxLQUFLLENBQUMsQ0FBQyxFQUFFOzRCQUNsRCxRQUFRLElBQUk7dURBQzZCLGVBQWU7O3dFQUdwRCxRQUFRLEdBQUcsQ0FBQzs2QkFDRCxRQUFRLEdBQUcsQ0FBQzs7Ozs7K0JBS1YsUUFBUSxHQUFHLENBQUM7OzZCQUVkLFFBQVEsR0FBRyxDQUFDOzttQkFFdEIsQ0FBQzs0QkFFTiwrREFBK0Q7NEJBQy9ELDZEQUE2RDs0QkFDN0QsSUFBSSxhQUFhLEdBQUcsQ0FBQyxFQUFFO2dDQUNyQixRQUFRLElBQUk7Ozs7eUJBSUgsUUFBUSxHQUFHLENBQUMsK0JBQ2QsUUFBUSxHQUFHLENBQUM7O3lCQUVWLFFBQVEsR0FBRyxDQUFDLDRCQUNkLFFBQVEsR0FBRyxDQUFDOztxQkFFZCxDQUFDOzZCQUNQO2lDQUFNO2dDQUNMLFFBQVEsSUFBSTt3QkFDSixRQUFRLEdBQUcsQ0FBQyxrQkFBa0IsUUFBUSxlQUMxQyxRQUFRLEdBQUcsQ0FBQztxQkFDWCxDQUFDOzZCQUNQO3lCQUNGOzZCQUFNOzRCQUNMLGdFQUFnRTs0QkFDaEUsNERBQTREOzRCQUM1RCxnQ0FBZ0M7NEJBQ2hDLElBQUksZUFBZSxLQUFLLENBQUMsRUFBRTtnQ0FDekIsUUFBUSxJQUFJO3dCQUNKLFFBQVEsR0FBRyxDQUFDLGFBQWEsUUFBUTtxQkFDcEMsQ0FBQzs2QkFDUDtpQ0FBTTtnQ0FDTCxRQUFRLElBQUk7c0NBQ1UsZUFBZTs7MEVBR2pDLFFBQVEsR0FBRyxDQUFDOytCQUNELFFBQVEsR0FBRyxDQUFDOztpQ0FFVixRQUFRLEdBQUcsQ0FBQzs7K0JBRWQsUUFBUSxHQUFHLENBQUM7Ozt3QkFHbkIsUUFBUSxHQUFHLENBQUMsYUFBYSxRQUFRLEdBQUcsQ0FBQztxQkFDeEMsQ0FBQzs2QkFDUDt5QkFDRjtxQkFDRjtpQkFDRjthQUNGO2lCQUFNLEVBQUcsZUFBZTtnQkFDdkIsSUFBSSxRQUFRLEdBQUcsV0FBVyxFQUFFO29CQUMxQixrRUFBa0U7b0JBQ2xFLG1FQUFtRTtvQkFDbkUsbUVBQW1FO29CQUNuRSw2REFBNkQ7b0JBQzdELGdFQUFnRTtvQkFDaEUsT0FBTztvQkFDUCw0QkFBNEI7b0JBQzVCLElBQUksT0FBTyxHQUFHLENBQUMsS0FBSyxDQUFDLEVBQUU7d0JBQ3JCLFFBQVEsSUFBSTs7cUVBR1IsUUFBUTsyQkFDRyxRQUFROzs7OzZCQUlOLFFBQVE7OzJCQUVWLFFBQVE7OztpRUFJbkIsUUFBUSxHQUFHLENBQUM7MkJBQ0QsUUFBUSxHQUFHLENBQUM7Ozs7NkJBSVYsUUFBUSxHQUFHLENBQUM7OzJCQUVkLFFBQVEsR0FBRyxDQUFDOzs7b0JBR25CLFFBQVEsa0JBQWtCLFFBQVEsZUFDdEMsUUFBUSxHQUFHLENBQUM7ZUFDYixDQUFDO3dCQUVKLElBQUksUUFBUSxHQUFHLENBQUMsR0FBRyxXQUFXLEVBQUU7NEJBQzlCLFFBQVEsSUFBSTs7Ozs7O3NCQU1KLFFBQVEsR0FBRyxDQUFDLGtCQUFrQixRQUFRLEdBQUcsQ0FBQztpQkFDL0MsQ0FBQzt5QkFDTDtxQkFDRjt5QkFBTTt3QkFDTCxRQUFRLElBQUk7eURBQ2lDLFFBQVE7MkJBQ3RDLFFBQVE7OzZCQUVOLFFBQVE7OzJCQUVWLFFBQVE7Ozs7cUVBS25CLFFBQVEsR0FBRyxDQUFDOzJCQUNELFFBQVEsR0FBRyxDQUFDOzs2QkFFVixRQUFRLEdBQUcsQ0FBQzs7MkJBRWQsUUFBUSxHQUFHLENBQUM7OztvQkFHbkIsUUFBUTsyQkFDRCxRQUFRLGVBQWUsUUFBUSxHQUFHLENBQUM7ZUFDL0MsQ0FBQzt3QkFFSixJQUFJLFFBQVEsR0FBRyxDQUFDLEdBQUcsV0FBVyxFQUFFOzRCQUM5QixRQUFRLElBQUk7c0JBQ0osUUFBUSxHQUFHLENBQUMsa0JBQWtCLFFBQVEsZUFDMUMsUUFBUSxHQUFHLENBQUM7aUJBQ2IsQ0FBQzt5QkFDTDtxQkFDRjtpQkFDRjthQUNGO1lBRUQsdUVBQXVFO1lBQ3ZFLGdFQUFnRTtZQUNoRSx3RUFBd0U7WUFDeEUsZ0JBQWdCO1lBQ2hCLElBQUksUUFBUSxHQUFHLFdBQVcsRUFBRTtnQkFDMUIsUUFBUSxJQUFJOytCQUNXLFFBQVE7MkJBQ1osUUFBUTtXQUN4QixDQUFDO2dCQUVKLElBQUksUUFBUSxHQUFHLENBQUMsR0FBRyxXQUFXLEVBQUU7b0JBQzlCLFFBQVEsSUFBSTtpQ0FDVyxRQUFRLEdBQUcsQ0FBQzs2QkFDaEIsUUFBUSxHQUFHLENBQUM7YUFDNUIsQ0FBQztpQkFDTDthQUNGO1NBQ0Y7UUFDRCxRQUFRLElBQUk7O0dBRWIsQ0FBQztRQUNBLFFBQVEsSUFBSTs7S0FFWCxDQUFDO1FBRUYsSUFBSSxpQkFBaUIsR0FBRyxFQUFFLEVBQUUsc0JBQXNCLEdBQUcsRUFBRSxDQUFDO1FBQ3hELElBQUksVUFBVSxFQUFFO1lBQ2QsSUFBSSxrQkFBa0IsRUFBRTtnQkFDdEIsaUJBQWlCLEdBQUc7O1lBRWhCLFVBQVU7VUFDWixDQUFDO2FBQ0o7aUJBQU0sSUFBSSxpQkFBaUIsRUFBRTtnQkFDNUIsaUJBQWlCLEdBQUc7O1lBRWhCLFVBQVU7VUFDWixDQUFDO2FBQ0o7aUJBQU07Z0JBQ0wsaUJBQWlCLEdBQUc7WUFDaEIsVUFBVTtVQUNaLENBQUM7YUFDSjtZQUVELHNCQUFzQixHQUFHLDhCQUE4QixDQUFDO1NBQ3pEO1FBRUQsTUFBTSxjQUFjLEdBQUcsT0FBTyxDQUFDLENBQUMsQ0FBQyxpQ0FBaUMsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDO1FBQ3hFLElBQUksT0FBTyxFQUFFO1lBQ1gsSUFBSSxDQUFDLGFBQWEsQ0FBQyxJQUFJLENBQUMsTUFBTSxDQUFDLENBQUM7U0FDakM7UUFFRCxJQUFJLGtCQUFrQixFQUFFO1lBQ3RCLElBQUksQ0FBQyxhQUFhLENBQUMsSUFBSSxDQUFDLHdCQUF3QixDQUFDLENBQUM7U0FDbkQ7UUFDRCxJQUFJLGlCQUFpQixFQUFFO1lBQ3JCLElBQUksQ0FBQyxhQUFhLENBQUMsSUFBSSxDQUFDLGdCQUFnQixDQUFDLENBQUM7U0FDM0M7UUFFRCxJQUFJLENBQUMsUUFBUSxHQUFHO1FBQ1osaUJBQWlCOzs7Ozs7O3dCQU9ELFVBQVU7NEJBQ04sVUFBVTs7Ozs7OztVQU81QixRQUFROzs7VUFHUixjQUFjO1VBQ2Qsc0JBQXNCOzs7S0FHM0IsQ0FBQztJQUNKLENBQUM7Q0FDRiIsInNvdXJjZXNDb250ZW50IjpbIi8qKlxuICogQGxpY2Vuc2VcbiAqIENvcHlyaWdodCAyMDE4IEdvb2dsZSBMTEMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuXG4gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgXCJMaWNlbnNlXCIpO1xuICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLlxuICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0XG4gKlxuICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wXG4gKlxuICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZVxuICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gXCJBUyBJU1wiIEJBU0lTLFxuICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuXG4gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kXG4gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS5cbiAqID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4gKi9cblxuaW1wb3J0IHtiYWNrZW5kX3V0aWwsIHV0aWx9IGZyb20gJ0B0ZW5zb3JmbG93L3RmanMtY29yZSc7XG5cbmltcG9ydCB7R1BHUFVQcm9ncmFtLCB1c2VTaGFwZVVuaWZvcm1zfSBmcm9tICcuL2dwZ3B1X21hdGgnO1xuXG5leHBvcnQgY2xhc3MgRGVwdGh3aXNlQ29udlBhY2tlZDJEUHJvZ3JhbSBpbXBsZW1lbnRzIEdQR1BVUHJvZ3JhbSB7XG4gIHZhcmlhYmxlTmFtZXMgPSBbJ3gnLCAnVyddO1xuICBwYWNrZWRJbnB1dHMgPSB0cnVlO1xuICBwYWNrZWRPdXRwdXQgPSB0cnVlO1xuICBvdXRwdXRTaGFwZTogbnVtYmVyW107XG4gIHVzZXJDb2RlOiBzdHJpbmc7XG4gIGVuYWJsZVNoYXBlVW5pZm9ybXM6IGJvb2xlYW47XG4gIGN1c3RvbVVuaWZvcm1zID0gW1xuICAgIHtuYW1lOiAncGFkcycsIHR5cGU6ICdpdmVjMicgYXMgY29uc3QgfSxcbiAgICB7bmFtZTogJ3N0cmlkZXMnLCB0eXBlOiAnaXZlYzInIGFzIGNvbnN0IH0sXG4gICAge25hbWU6ICdkaWxhdGlvbnMnLCB0eXBlOiAnaXZlYzInIGFzIGNvbnN0IH0sXG4gICAge25hbWU6ICdpbkRpbXMnLCB0eXBlOiAnaXZlYzInIGFzIGNvbnN0IH0sXG4gIF07XG5cbiAgY29uc3RydWN0b3IoXG4gICAgICBjb252SW5mbzogYmFja2VuZF91dGlsLkNvbnYyREluZm8sIGFkZEJpYXMgPSBmYWxzZSxcbiAgICAgIGFjdGl2YXRpb246IHN0cmluZyA9IG51bGwsIGhhc1ByZWx1QWN0aXZhdGlvbiA9IGZhbHNlLFxuICAgICAgaGFzTGVha3lSZWx1QWxwaGEgPSBmYWxzZSkge1xuICAgIHRoaXMub3V0cHV0U2hhcGUgPSBjb252SW5mby5vdXRTaGFwZTtcbiAgICB0aGlzLmVuYWJsZVNoYXBlVW5pZm9ybXMgPSB1c2VTaGFwZVVuaWZvcm1zKHRoaXMub3V0cHV0U2hhcGUubGVuZ3RoKTtcbiAgICBjb25zdCBjaGFubmVsTXVsID0gY29udkluZm8ub3V0Q2hhbm5lbHMgLyBjb252SW5mby5pbkNoYW5uZWxzO1xuICAgIGNvbnN0IHBhZExlZnQgPSBjb252SW5mby5wYWRJbmZvLmxlZnQ7XG4gICAgY29uc3Qgc3RyaWRlV2lkdGggPSBjb252SW5mby5zdHJpZGVXaWR0aDtcbiAgICBjb25zdCBkaWxhdGlvbldpZHRoID0gY29udkluZm8uZGlsYXRpb25XaWR0aDtcbiAgICBjb25zdCBmaWx0ZXJIZWlnaHQgPSBjb252SW5mby5maWx0ZXJIZWlnaHQ7XG4gICAgY29uc3QgZmlsdGVyV2lkdGggPSBjb252SW5mby5maWx0ZXJXaWR0aDtcbiAgICBjb25zdCB0ZXhlbHNBY3Jvc3MgPSBmaWx0ZXJXaWR0aDtcblxuICAgIGxldCBtYWluTG9vcCA9IGBcbiAgICAgIGludCB4UjsgaW50IHhDOyBpbnQgeENPZmZzZXQ7XG4gICAgICB2ZWM0IHdUZXhlbDsgdmVjNCBwcmV2aW91czsgdmVjNCBmaW5hbDtgO1xuXG4gICAgZm9yIChsZXQgYyA9IDA7IGMgPCBmaWx0ZXJXaWR0aDsgYysrKSB7XG4gICAgICBtYWluTG9vcCArPSBgXG4gICAgICAgICAgdmVjNCB4VGV4ZWxDJHtjICogMn07XG4gICAgICAgICAgaW50IHhUZXhlbEMke2MgKiAyfVJlYWR5O1xuICAgICAgICAgIHZlYzQgeFRleGVsQyR7YyAqIDIgKyAxfTtcbiAgICAgICAgICBpbnQgeFRleGVsQyR7YyAqIDIgKyAxfVJlYWR5O1xuICAgICAgICAgIHZlYzQgeEMke2N9O2A7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogVGhpcyB2ZWN0b3JpemVkIGltcGxlbWVudGF0aW9uIHdvcmtzIGJ5IGdhdGhlcmluZyB0aGUgdmFsdWVzIG5lZWRlZCBmb3JcbiAgICAgKiBlYWNoIG91dHB1dCBjaGFubmVsJ3MgZG90IHByb2R1Y3QgaW50byB2ZWM0J3MgYW5kIHRoZW4gbXVsdGlwbHlpbmcgdGhlbVxuICAgICAqIGFsbCB0b2dldGhlciAodGhpcyBoYXBwZW5zIGluIHRoZSBmaW5hbCBkb3VibGUgZm9yLWxvb3AgYmVsb3cpLiBNb3N0IG9mXG4gICAgICogdGhlIG1haW4gbG9vcCBjb25zaXN0cyBvZiBjb25zdHJ1Y3RpbmcgdGhlc2UgdmVjNCdzIHdpdGggdGhlIG1pbmltdW1cbiAgICAgKiBudW1iZXIgb2YgdGV4dHVyZTJEIGNhbGxzLCB3aGljaCBtZWFucyBtYWtpbmcgdXNlIG9mIGFsbCBmb3VyIHJldHVybmVkXG4gICAgICogdmFsdWVzIGZyb20gYSB0ZXh0dXJlMkQgY2FsbCBhdCBvbmNlLlxuICAgICAqL1xuICAgIG1haW5Mb29wICs9IGBcbiAgICBmb3IgKGludCByID0gMDsgciA8ICR7ZmlsdGVySGVpZ2h0fTsgcisrKSB7XG4gICAgICBgO1xuICAgIGZvciAobGV0IGMgPSAwOyBjIDwgZmlsdGVyV2lkdGg7IGMrKykge1xuICAgICAgbWFpbkxvb3AgKz0gYFxuICAgICAgICAgIHhUZXhlbEMke2MgKiAyfSA9IHZlYzQoMC4wKTtcbiAgICAgICAgICB4VGV4ZWxDJHtjICogMn1SZWFkeSA9IDA7XG4gICAgICAgICAgeFRleGVsQyR7YyAqIDIgKyAxfSA9IHZlYzQoMC4wKTtcbiAgICAgICAgICB4VGV4ZWxDJHtjICogMiArIDF9UmVhZHkgPSAwO1xuICAgICAgICAgIHhDJHtjfSA9IHZlYzQoMC4wKTtgO1xuICAgIH1cbiAgICBtYWluTG9vcCArPSBgXG4gICAgICAgIHhSID0geFJDb3JuZXIgKyByICogZGlsYXRpb25zWzBdO1xuICAgICAgICBpZiAoeFIgPj0wICYmIHhSIDwgaW5EaW1zWzBdKSB7XG4gICAgICBgO1xuXG4gICAgZm9yIChsZXQgdGV4ZWxDID0gMDsgdGV4ZWxDIDwgKHRleGVsc0Fjcm9zcyArIDEpIC8gMjsgdGV4ZWxDKyspIHtcbiAgICAgIGNvbnN0IGNvbEluZGV4ID0gdGV4ZWxDICogMjtcblxuICAgICAgbWFpbkxvb3AgKz0gYFxuICAgICAgICAgIHhDID0geENDb3JuZXIgKyAke2NvbEluZGV4ICogZGlsYXRpb25XaWR0aH07XG4gICAgICAgICAgYDtcblxuICAgICAgaWYgKHN0cmlkZVdpZHRoID09PSAxKSB7XG4gICAgICAgIGlmIChjb2xJbmRleCA8IGZpbHRlcldpZHRoKSB7XG4gICAgICAgICAgLy8gSWYgcGFkZGluZyBpcyBvZGQsIHRoZSBvdXRlciB0ZXhlbHMgaGF2ZSB0byBiZSBjb21wb3NlZC5cbiAgICAgICAgICBpZiAocGFkTGVmdCAlIDIgPT09IDEpIHtcbiAgICAgICAgICAgIC8vIFRPRE86IEVuc3VyZSB2ZWM0IHByZXZpb3VzIGRvZXMgbm90IHJlc3VsdCBpbiByZWR1bmRhbnQgc2FtcGxlLFxuICAgICAgICAgICAgLy8gYW5kIGF2b2lkIHNldHRpbmcgeFRleGVsUkMncyB0aGF0IGV4Y2VlZCB0aGUgYm91bmRhcnkgaW4gdGhlXG4gICAgICAgICAgICAvLyBmaXJzdCBwbGFjZSByYXRoZXIgdGhhbiByZXNldHRpbmcgdGhlbSB0byB2ZWM0KDApKS5cblxuICAgICAgICAgICAgLy8gVG8gY29tcHV0ZSB4Q09mZnNldDpcbiAgICAgICAgICAgIC8vIC0gSWYgcGFkZGluZyBpcyBvZGQsIHdlIG11c3QgYWRkIDEgdG8gZW5zdXJlIHdlIGFzayBmb3IgYW5cbiAgICAgICAgICAgIC8vIGV2ZW4tbnVtYmVyZWQgcm93LlxuICAgICAgICAgICAgLy8gLSBXZSBzdWJ0cmFjdCAyIHRvIGFjY2VzcyB0aGUgcHJldmlvdXMgdGV4ZWwuXG5cbiAgICAgICAgICAgIG1haW5Mb29wICs9IGBcbiAgICAgICAgICAgICAgICB4Q09mZnNldCA9IHhDICsgMTtcbiAgICAgICAgICAgICAgICBpZiAoeENPZmZzZXQgPj0gMCAmJiB4Q09mZnNldCA8IGluRGltc1sxXSAmJiB4VGV4ZWxDJHtcbiAgICAgICAgICAgICAgICBjb2xJbmRleH1SZWFkeSA9PSAwKSB7XG4gICAgICAgICAgICAgICAgICB4VGV4ZWxDJHtjb2xJbmRleH0gPSBnZXRYKGJhdGNoLCB4UiwgeENPZmZzZXQsIGQxKTtcblxuICAgICAgICAgICAgICAgICAgLy8gTmVlZCB0byBtYW51YWxseSBjbGVhciB1bnVzZWQgY2hhbm5lbHMgaW4gY2FzZVxuICAgICAgICAgICAgICAgICAgLy8gd2UncmUgcmVhZGluZyBmcm9tIHJlY3ljbGVkIHRleHR1cmUuXG4gICAgICAgICAgICAgICAgICBpZiAoeENPZmZzZXQgKyAxID49IGluRGltc1sxXSkge1xuICAgICAgICAgICAgICAgICAgICB4VGV4ZWxDJHtjb2xJbmRleH0uencgPSB2ZWMyKDAuMCk7XG4gICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICB4VGV4ZWxDJHtjb2xJbmRleH1SZWFkeSA9IDE7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICBgO1xuICAgICAgICAgICAgLy8gVGhpcyB0ZXhlbCBoYXMgYmVlbiByZWFkIGluIHByZXZpb3VzIGl0ZXJhdGlvbiBpZiB0aGUgZGlsYXRpb25cbiAgICAgICAgICAgIC8vIGlzIDEuXG4gICAgICAgICAgICBpZiAoZGlsYXRpb25XaWR0aCA9PT0gMSAmJiBjb2xJbmRleCA+IDApIHtcbiAgICAgICAgICAgICAgbWFpbkxvb3AgKz0gYFxuICAgICAgICAgICAgICAgIHhDJHtjb2xJbmRleH0gPSB2ZWM0KHhUZXhlbEMke2NvbEluZGV4IC0gMn0uencsIHhUZXhlbEMke1xuICAgICAgICAgICAgICAgICAgY29sSW5kZXh9Lnh5KTtcbiAgICAgICAgICAgICAgICBgO1xuICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgbWFpbkxvb3AgKz0gYFxuICAgICAgICAgICAgICAgICAgeENPZmZzZXQgPSB4QyArIDEgLSAyO1xuXG4gICAgICAgICAgICAgICAgICBpZiAoeENPZmZzZXQgPj0gMCAmJiB4Q09mZnNldCA8IGluRGltc1sxXSkge1xuICAgICAgICAgICAgICAgICAgICBwcmV2aW91cyA9IGdldFgoYmF0Y2gsIHhSLCB4Q09mZnNldCwgZDEpO1xuXG4gICAgICAgICAgICAgICAgICAgIC8vIE5lZWQgdG8gbWFudWFsbHkgY2xlYXIgdW51c2VkIGNoYW5uZWxzIGluIGNhc2VcbiAgICAgICAgICAgICAgICAgICAgLy8gd2UncmUgcmVhZGluZyBmcm9tIHJlY3ljbGVkIHRleHR1cmUuXG4gICAgICAgICAgICAgICAgICAgIGlmICh4Q09mZnNldCArIDEgPj0gaW5EaW1zWzFdKSB7XG4gICAgICAgICAgICAgICAgICAgICAgcHJldmlvdXMuencgPSB2ZWMyKDAuMCk7XG4gICAgICAgICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICAgICAgICB4QyR7Y29sSW5kZXh9ID0gdmVjNChwcmV2aW91cy56dywgeFRleGVsQyR7Y29sSW5kZXh9Lnh5KTtcbiAgICAgICAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgIHhDJHtjb2xJbmRleH0gPSB2ZWM0KDAuMCwgMC4wLCB4VGV4ZWxDJHtjb2xJbmRleH0ueHkpO1xuICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgYDtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgLy8gUGFkZGluZyBpcyBldmVuLCBzbyB4UkMgY29ycmVzcG9uZHMgdG8gYSBzaW5nbGUgdGV4ZWwuXG4gICAgICAgICAgICBtYWluTG9vcCArPSBgXG4gICAgICAgICAgICAgICAgaWYgKHhDID49IDAgJiYgeEMgPCBpbkRpbXNbMV0gJiYgeFRleGVsQyR7Y29sSW5kZXh9UmVhZHkgPT0gMCkge1xuICAgICAgICAgICAgICAgICAgeFRleGVsQyR7Y29sSW5kZXh9ID0gZ2V0WChiYXRjaCwgeFIsIHhDLCBkMSk7XG4gICAgICAgICAgICAgICAgICBpZiAoeEMgKyAxID49IGluRGltc1sxXSkge1xuICAgICAgICAgICAgICAgICAgICB4VGV4ZWxDJHtjb2xJbmRleH0uencgPSB2ZWMyKDAuMCk7XG4gICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICB4VGV4ZWxDJHtjb2xJbmRleH1SZWFkeSA9IDE7XG4gICAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgICAgeEMke2NvbEluZGV4fSA9IHhUZXhlbEMke2NvbEluZGV4fTtcbiAgICAgICAgICAgICAgICBgO1xuICAgICAgICAgIH1cblxuICAgICAgICAgIGlmIChjb2xJbmRleCArIDEgPCBmaWx0ZXJXaWR0aCkge1xuICAgICAgICAgICAgLy8gSWYgZGlsYXRpb24gaXMgZXZlbiwgdGhlIHNlY29uZCBlbnRyeSBzaG91bGQgbWF0Y2ggdGhlIGZpcnN0XG4gICAgICAgICAgICAvLyAoZWl0aGVyIGJvdGggYXJlIGNvbXBvc2VkIG9yIGJvdGggYXJlIHNpbmdsZSBzYW1wbGVzKS4gQnV0IGlmXG4gICAgICAgICAgICAvLyBkaWxhdGlvbiBpcyBvZGQsIHRoZW4gdGhlIHNlY29uZCBlbnRyeSBzaG91bGQgYmUgdGhlIG9wcG9zaXRlXG4gICAgICAgICAgICAvLyBvZiB0aGUgZmlyc3QgKGlmIHRoZSBmaXJzdCBpcyBjb21wb3NlZCwgdGhlIHNlY29uZCBpcyBhIHNpbmdsZVxuICAgICAgICAgICAgLy8gc2FtcGxlLCBhbmQgdmljZSB2ZXJzYS4pXG5cbiAgICAgICAgICAgIGNvbnN0IG5leHRUZXhlbE9mZnNldCA9IHBhZExlZnQgJSAyID09PSAwID9cbiAgICAgICAgICAgICAgICB1dGlsLm5lYXJlc3RMYXJnZXJFdmVuKGRpbGF0aW9uV2lkdGgpIDpcbiAgICAgICAgICAgICAgICBkaWxhdGlvbldpZHRoO1xuXG4gICAgICAgICAgICBpZiAoKGRpbGF0aW9uV2lkdGggJSAyID09PSAwICYmIHBhZExlZnQgJSAyID09PSAxKSB8fFxuICAgICAgICAgICAgICAgIChkaWxhdGlvbldpZHRoICUgMiAhPT0gMCAmJiBwYWRMZWZ0ICUgMiAhPT0gMSkpIHtcbiAgICAgICAgICAgICAgbWFpbkxvb3AgKz0gYFxuICAgICAgICAgICAgICAgICAgeENPZmZzZXQgPSB4QyArIGltb2QocGFkc1sxXSwgMikgKyAke25leHRUZXhlbE9mZnNldH07XG5cbiAgICAgICAgICAgICAgICAgIGlmICh4Q09mZnNldCA+PSAwICYmIHhDT2Zmc2V0IDwgaW5EaW1zWzFdICYmIHhUZXhlbEMke1xuICAgICAgICAgICAgICAgICAgY29sSW5kZXggKyAxfVJlYWR5ID09IDApIHtcbiAgICAgICAgICAgICAgICAgICAgeFRleGVsQyR7Y29sSW5kZXggKyAxfSA9IGdldFgoYmF0Y2gsIHhSLCB4Q09mZnNldCwgZDEpO1xuXG4gICAgICAgICAgICAgICAgICAgIC8vIE5lZWQgdG8gbWFudWFsbHkgY2xlYXIgdW51c2VkIGNoYW5uZWxzIGluIGNhc2VcbiAgICAgICAgICAgICAgICAgICAgLy8gd2UncmUgcmVhZGluZyBmcm9tIHJlY3ljbGVkIHRleHR1cmUuXG4gICAgICAgICAgICAgICAgICAgIGlmICh4Q09mZnNldCArIDEgPj0gaW5EaW1zWzFdKSB7XG4gICAgICAgICAgICAgICAgICAgICAgeFRleGVsQyR7Y29sSW5kZXggKyAxfS56dyA9IHZlYzIoMC4wKTtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICB4VGV4ZWxDJHtjb2xJbmRleCArIDF9UmVhZHkgPSAxO1xuICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgYDtcblxuICAgICAgICAgICAgICAvLyBJZiBkaWxhdGlvbiA+IDEgdGhlbiB0aGUgeFJDJ3Mgd2lsbCBub3QgYmUgYWJsZSB0byBzaGFyZSBhbnlcbiAgICAgICAgICAgICAgLy8gdmFsdWVzLCBzbyBlYWNoIHhSQyB3aWxsIHJlcXVpcmUgdHdvIHVuaXF1ZSBjYWxscyB0byBnZXRYLlxuICAgICAgICAgICAgICBpZiAoZGlsYXRpb25XaWR0aCA+IDEpIHtcbiAgICAgICAgICAgICAgICBtYWluTG9vcCArPSBgXG4gICAgICAgICAgICAgICAgICAgIHhDT2Zmc2V0IC09IDI7XG4gICAgICAgICAgICAgICAgICAgIGlmICh4Q09mZnNldCA+PSAwICYmIHhDT2Zmc2V0IDwgaW5EaW1zWzFdKSB7XG4gICAgICAgICAgICAgICAgICAgICBwcmV2aW91cyA9IGdldFgoYmF0Y2gsIHhSLCB4Q09mZnNldCwgZDEpO1xuICAgICAgICAgICAgICAgICAgICAgeEMke2NvbEluZGV4ICsgMX0gPSB2ZWM0KHByZXZpb3VzLnp3LCB4VGV4ZWxDJHtcbiAgICAgICAgICAgICAgICAgICAgICAgY29sSW5kZXggKyAxfS54eSk7XG4gICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgICB4QyR7Y29sSW5kZXggKyAxfSA9IHZlYzQoMC4wLCAwLjAsIHhUZXhlbEMke1xuICAgICAgICAgICAgICAgICAgICAgICBjb2xJbmRleCArIDF9Lnh5KTtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICBgO1xuICAgICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgIG1haW5Mb29wICs9IGBcbiAgICAgICAgICAgICAgICAgICAgeEMke2NvbEluZGV4ICsgMX0gPSB2ZWM0KHhUZXhlbEMke2NvbEluZGV4fS56dywgeFRleGVsQyR7XG4gICAgICAgICAgICAgICAgICAgIGNvbEluZGV4ICsgMX0ueHkpO1xuICAgICAgICAgICAgICAgICAgICBgO1xuICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAvLyBJZiBkaWxhdGlvbiBpcyAxIGFuZCBwYWRkaW5nIGlzIG9kZCwgd2UgaGF2ZSBhbHJlYWR5IHJlYWQgdGhlXG4gICAgICAgICAgICAgIC8vIHRleGVsIHdoZW4gY29uc3RydWN0aW5nIHRoZSBwcmV2aW91cyB4IHZhbHVlLiBIZXJlIHdlIGNhblxuICAgICAgICAgICAgICAvLyBzaW1wbHkgc2tpcCB0aGUgdGV4dHVyZSByZWFkLlxuICAgICAgICAgICAgICBpZiAobmV4dFRleGVsT2Zmc2V0ID09PSAxKSB7XG4gICAgICAgICAgICAgICAgbWFpbkxvb3AgKz0gYFxuICAgICAgICAgICAgICAgICAgICB4QyR7Y29sSW5kZXggKyAxfSA9IHhUZXhlbEMke2NvbEluZGV4fTtcbiAgICAgICAgICAgICAgICAgICAgYDtcbiAgICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICBtYWluTG9vcCArPSBgXG4gICAgICAgICAgICAgICAgICAgIHhDT2Zmc2V0ID0geEMgKyAke25leHRUZXhlbE9mZnNldH07XG5cbiAgICAgICAgICAgICAgICAgICAgaWYgKHhDT2Zmc2V0ID49IDAgJiYgeENPZmZzZXQgPCBpbkRpbXNbMV0gJiYgeFRleGVsQyR7XG4gICAgICAgICAgICAgICAgICAgIGNvbEluZGV4ICsgMX1SZWFkeSA9PSAwKSB7XG4gICAgICAgICAgICAgICAgICAgICAgeFRleGVsQyR7Y29sSW5kZXggKyAxfSA9IGdldFgoYmF0Y2gsIHhSLCB4Q09mZnNldCwgZDEpO1xuICAgICAgICAgICAgICAgICAgICAgIGlmICh4Q09mZnNldCArIDEgPj0gaW5EaW1zWzFdKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICB4VGV4ZWxDJHtjb2xJbmRleCArIDF9Lnp3ID0gdmVjMigwLjApO1xuICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICB4VGV4ZWxDJHtjb2xJbmRleCArIDF9UmVhZHkgPSAxO1xuICAgICAgICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgICAgICAgeEMke2NvbEluZGV4ICsgMX0gPSB4VGV4ZWxDJHtjb2xJbmRleCArIDF9O1xuICAgICAgICAgICAgICAgICAgICBgO1xuICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICB9IGVsc2UgeyAgLy8gc3RyaWRlID09PSAyXG4gICAgICAgIGlmIChjb2xJbmRleCA8IGZpbHRlcldpZHRoKSB7XG4gICAgICAgICAgLy8gRGVwZW5kaW5nIG9uIHdoZXRoZXIgcGFkTGVmdCBpcyBldmVuIG9yIG9kZCwgd2Ugd2FudCBlaXRoZXIgdGhlXG4gICAgICAgICAgLy8geHkgb3IgencgY2hhbm5lbHMgZnJvbSBYIHRleGVscyBmb3IgeEMke2NvbEluZGV4fS4gSWYgcGFkTGVmdCBpc1xuICAgICAgICAgIC8vIGV2ZW4sIHhDJHtjb2xJbmRleCArMX0gaXMgc2ltcGx5IHRoZSB6dyBjaGFubmVscyBvZiB0ZXhlbHMgd2UndmVcbiAgICAgICAgICAvLyBhbHJlYWR5IHNhbXBsZWQuIEJ1dCBpZiBwYWRMZWZ0IGlzIG9kZCwgeEN7JGMgKyAxfS56dyB3aWxsXG4gICAgICAgICAgLy8gbmVlZCB0byBjb21lIGZyb20gdGhlIHh5IGNoYW5uZWxzIG9mIGEgbmV3IHRleGVsLCBoZW5jZSB0aGUgYFxuICAgICAgICAgIC8vIHZlYzRcbiAgICAgICAgICAvLyBmaW5hbGAgaW5pdGlhbGl6ZWQgYmVsb3cuXG4gICAgICAgICAgaWYgKHBhZExlZnQgJSAyID09PSAxKSB7XG4gICAgICAgICAgICBtYWluTG9vcCArPSBgXG4gICAgICAgICAgICAgICAgeENPZmZzZXQgPSB4QyArIDEgLSBzdHJpZGVzWzFdO1xuICAgICAgICAgICAgICAgIGlmKHhDT2Zmc2V0ID49IDAgJiYgeENPZmZzZXQgPCBpbkRpbXNbMV0gJiYgeFRleGVsQyR7XG4gICAgICAgICAgICAgICAgY29sSW5kZXh9UmVhZHkgPT0gMCkge1xuICAgICAgICAgICAgICAgICAgeFRleGVsQyR7Y29sSW5kZXh9ID0gZ2V0WChiYXRjaCwgeFIsIHhDT2Zmc2V0LCBkMSk7XG4gICAgICAgICAgICAgICAgICAvLyBOZWVkIHRvIG1hbnVhbGx5IGNsZWFyIHVudXNlZCBjaGFubmVscyBpbiBjYXNlXG4gICAgICAgICAgICAgICAgICAvLyB3ZSdyZSByZWFkaW5nIGZyb20gcmVjeWNsZWQgdGV4dHVyZS5cbiAgICAgICAgICAgICAgICAgIGlmICh4Q09mZnNldCArIDEgPj0gaW5EaW1zWzFdKSB7XG4gICAgICAgICAgICAgICAgICAgIHhUZXhlbEMke2NvbEluZGV4fS56dyA9IHZlYzIoMC4wKTtcbiAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgIHhUZXhlbEMke2NvbEluZGV4fVJlYWR5ID0gMTtcbiAgICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgICBpZih4QyArIDEgPj0gMCAmJiB4QyArIDEgPCBpbkRpbXNbMV0gJiYgeFRleGVsQyR7XG4gICAgICAgICAgICAgICAgY29sSW5kZXggKyAxfVJlYWR5ID09IDApIHtcbiAgICAgICAgICAgICAgICAgIHhUZXhlbEMke2NvbEluZGV4ICsgMX0gPSBnZXRYKGJhdGNoLCB4UiwgeEMgKyAxLCBkMSk7XG4gICAgICAgICAgICAgICAgICAvLyBOZWVkIHRvIG1hbnVhbGx5IGNsZWFyIHVudXNlZCBjaGFubmVscyBpbiBjYXNlXG4gICAgICAgICAgICAgICAgICAvLyB3ZSdyZSByZWFkaW5nIGZyb20gcmVjeWNsZWQgdGV4dHVyZS5cbiAgICAgICAgICAgICAgICAgIGlmICh4QyArIDIgPj0gaW5EaW1zWzFdKSB7XG4gICAgICAgICAgICAgICAgICAgIHhUZXhlbEMke2NvbEluZGV4ICsgMX0uencgPSB2ZWMyKDAuMCk7XG4gICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICB4VGV4ZWxDJHtjb2xJbmRleCArIDF9UmVhZHkgPSAxO1xuICAgICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICAgIHhDJHtjb2xJbmRleH0gPSB2ZWM0KHhUZXhlbEMke2NvbEluZGV4fS56dywgeFRleGVsQyR7XG4gICAgICAgICAgICAgICAgY29sSW5kZXggKyAxfS56dyk7XG4gICAgICAgICAgICAgIGA7XG5cbiAgICAgICAgICAgIGlmIChjb2xJbmRleCArIDEgPCBmaWx0ZXJXaWR0aCkge1xuICAgICAgICAgICAgICBtYWluTG9vcCArPSBgXG4gICAgICAgICAgICAgICAgICBmaW5hbCA9IHZlYzQoMC4wKTtcbiAgICAgICAgICAgICAgICAgIHhDT2Zmc2V0ID0geEMgKyAxICsgc3RyaWRlc1sxXTtcbiAgICAgICAgICAgICAgICAgIGlmKHhDT2Zmc2V0ID49IDAgJiYgeENPZmZzZXQgPCBpbkRpbXNbMV0pIHtcbiAgICAgICAgICAgICAgICAgICAgZmluYWwgPSBnZXRYKGJhdGNoLCB4UiwgeENPZmZzZXQsIGQxKTtcbiAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgIHhDJHtjb2xJbmRleCArIDF9ID0gdmVjNCh4VGV4ZWxDJHtjb2xJbmRleCArIDF9Lnh5LCBmaW5hbC54eSk7XG4gICAgICAgICAgICAgICAgYDtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgbWFpbkxvb3AgKz0gYFxuICAgICAgICAgICAgICAgIGlmKHhDID49IDAgJiYgeEMgPCBpbkRpbXNbMV0gJiYgeFRleGVsQyR7Y29sSW5kZXh9UmVhZHkgPT0gMCkge1xuICAgICAgICAgICAgICAgICAgeFRleGVsQyR7Y29sSW5kZXh9ID0gZ2V0WChiYXRjaCwgeFIsIHhDLCBkMSk7XG4gICAgICAgICAgICAgICAgICBpZiAoeEMgKyAxID49IGluRGltc1sxXSkge1xuICAgICAgICAgICAgICAgICAgICB4VGV4ZWxDJHtjb2xJbmRleH0uencgPSB2ZWMyKDAuMCk7XG4gICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICB4VGV4ZWxDJHtjb2xJbmRleH1SZWFkeSA9IDE7XG4gICAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgICAgeENPZmZzZXQgPSB4QyArIHN0cmlkZXNbMV07XG4gICAgICAgICAgICAgICAgaWYoeENPZmZzZXQgPj0gMCAmJiB4Q09mZnNldCA8IGluRGltc1sxXSAmJiB4VGV4ZWxDJHtcbiAgICAgICAgICAgICAgICBjb2xJbmRleCArIDF9UmVhZHkgPT0gMCkge1xuICAgICAgICAgICAgICAgICAgeFRleGVsQyR7Y29sSW5kZXggKyAxfSA9IGdldFgoYmF0Y2gsIHhSLCB4Q09mZnNldCwgZDEpO1xuICAgICAgICAgICAgICAgICAgaWYgKHhDT2Zmc2V0ICsgMSA+PSBpbkRpbXNbMV0pIHtcbiAgICAgICAgICAgICAgICAgICAgeFRleGVsQyR7Y29sSW5kZXggKyAxfS56dyA9IHZlYzIoMC4pO1xuICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgeFRleGVsQyR7Y29sSW5kZXggKyAxfVJlYWR5ID0gMTtcbiAgICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgICB4QyR7Y29sSW5kZXh9ID0gdmVjNChcbiAgICAgICAgICAgICAgICAgIHhUZXhlbEMke2NvbEluZGV4fS54eSwgeFRleGVsQyR7Y29sSW5kZXggKyAxfS54eSk7XG4gICAgICAgICAgICAgIGA7XG5cbiAgICAgICAgICAgIGlmIChjb2xJbmRleCArIDEgPCBmaWx0ZXJXaWR0aCkge1xuICAgICAgICAgICAgICBtYWluTG9vcCArPSBgXG4gICAgICAgICAgICAgICAgICB4QyR7Y29sSW5kZXggKyAxfSA9IHZlYzQoeFRleGVsQyR7Y29sSW5kZXh9Lnp3LCB4VGV4ZWxDJHtcbiAgICAgICAgICAgICAgICAgIGNvbEluZGV4ICsgMX0uencpO1xuICAgICAgICAgICAgICAgIGA7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICB9XG5cbiAgICAgIC8vIGxvY2FsaXplIHRoZSBkb3RQcm9kIGFjY3VtdWxhdGlvbiB3aXRoaW4gdGhlIGxvb3AsIHRoZSB0aGVvcnkgaXMgZm9yXG4gICAgICAvLyBHUFUgd2l0aCBsaW1pdGVkIGNhY2hlLCBhY2N1bXVsYXRlIHN1bSBhY3Jvc3MgbGFyZ2UgYW1vdW50IG9mXG4gICAgICAvLyB2ZXJpYWJsZXMgd2lsbCBjYXVzZSBsb3RzIG9mIGNhY2hlIG1pc3Nlcy4gKGkuZS4gNXg1IGZpbHRlciB3aWxsIGhhdmVcbiAgICAgIC8vIDUwIHZhcmlhYmxlcylcbiAgICAgIGlmIChjb2xJbmRleCA8IGZpbHRlcldpZHRoKSB7XG4gICAgICAgIG1haW5Mb29wICs9IGBcbiAgICAgICAgICAgIHdUZXhlbCA9IGdldFcociwgJHtjb2xJbmRleH0sIGQxLCBxKTtcbiAgICAgICAgICAgIGRvdFByb2QgKz0geEMke2NvbEluZGV4fSAqIHZlYzQod1RleGVsLnh6LCB3VGV4ZWwueHopO1xuICAgICAgICAgIGA7XG5cbiAgICAgICAgaWYgKGNvbEluZGV4ICsgMSA8IGZpbHRlcldpZHRoKSB7XG4gICAgICAgICAgbWFpbkxvb3AgKz0gYFxuICAgICAgICAgICAgICB3VGV4ZWwgPSBnZXRXKHIsICR7Y29sSW5kZXggKyAxfSwgZDEsIHEpO1xuICAgICAgICAgICAgICBkb3RQcm9kICs9IHhDJHtjb2xJbmRleCArIDF9ICogdmVjNCh3VGV4ZWwueHosIHdUZXhlbC54eik7XG4gICAgICAgICAgICBgO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfVxuICAgIG1haW5Mb29wICs9IGBcbiAgICB9XG4gIGA7XG4gICAgbWFpbkxvb3AgKz0gYFxuICAgICAgfVxuICAgIGA7XG5cbiAgICBsZXQgYWN0aXZhdGlvblNuaXBwZXQgPSAnJywgYXBwbHlBY3RpdmF0aW9uU25pcHBldCA9ICcnO1xuICAgIGlmIChhY3RpdmF0aW9uKSB7XG4gICAgICBpZiAoaGFzUHJlbHVBY3RpdmF0aW9uKSB7XG4gICAgICAgIGFjdGl2YXRpb25TbmlwcGV0ID0gYHZlYzQgYWN0aXZhdGlvbih2ZWM0IGEpIHtcbiAgICAgICAgICB2ZWM0IGIgPSBnZXRQcmVsdUFjdGl2YXRpb25XZWlnaHRzQXRPdXRDb29yZHMoKTtcbiAgICAgICAgICAke2FjdGl2YXRpb259XG4gICAgICAgIH1gO1xuICAgICAgfSBlbHNlIGlmIChoYXNMZWFreVJlbHVBbHBoYSkge1xuICAgICAgICBhY3RpdmF0aW9uU25pcHBldCA9IGB2ZWM0IGFjdGl2YXRpb24odmVjNCBhKSB7XG4gICAgICAgICAgdmVjNCBiID0gZ2V0TGVha3lyZWx1QWxwaGFBdE91dENvb3JkcygpO1xuICAgICAgICAgICR7YWN0aXZhdGlvbn1cbiAgICAgICAgfWA7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBhY3RpdmF0aW9uU25pcHBldCA9IGB2ZWM0IGFjdGl2YXRpb24odmVjNCB4KSB7XG4gICAgICAgICAgJHthY3RpdmF0aW9ufVxuICAgICAgICB9YDtcbiAgICAgIH1cblxuICAgICAgYXBwbHlBY3RpdmF0aW9uU25pcHBldCA9IGByZXN1bHQgPSBhY3RpdmF0aW9uKHJlc3VsdCk7YDtcbiAgICB9XG5cbiAgICBjb25zdCBhZGRCaWFzU25pcHBldCA9IGFkZEJpYXMgPyAncmVzdWx0ICs9IGdldEJpYXNBdE91dENvb3JkcygpOycgOiAnJztcbiAgICBpZiAoYWRkQmlhcykge1xuICAgICAgdGhpcy52YXJpYWJsZU5hbWVzLnB1c2goJ2JpYXMnKTtcbiAgICB9XG5cbiAgICBpZiAoaGFzUHJlbHVBY3RpdmF0aW9uKSB7XG4gICAgICB0aGlzLnZhcmlhYmxlTmFtZXMucHVzaCgncHJlbHVBY3RpdmF0aW9uV2VpZ2h0cycpO1xuICAgIH1cbiAgICBpZiAoaGFzTGVha3lSZWx1QWxwaGEpIHtcbiAgICAgIHRoaXMudmFyaWFibGVOYW1lcy5wdXNoKCdsZWFreXJlbHVBbHBoYScpO1xuICAgIH1cblxuICAgIHRoaXMudXNlckNvZGUgPSBgXG4gICAgICAke2FjdGl2YXRpb25TbmlwcGV0fVxuXG4gICAgICB2b2lkIG1haW4oKSB7XG4gICAgICAgIGl2ZWM0IGNvb3JkcyA9IGdldE91dHB1dENvb3JkcygpO1xuICAgICAgICBpbnQgYmF0Y2ggPSBjb29yZHMueDtcbiAgICAgICAgaXZlYzIgeFJDQ29ybmVyID0gY29vcmRzLnl6ICogc3RyaWRlcyAtIHBhZHM7XG4gICAgICAgIGludCBkMiA9IGNvb3Jkcy53O1xuICAgICAgICBpbnQgZDEgPSBkMiAvICR7Y2hhbm5lbE11bH07XG4gICAgICAgIGludCBxID0gZDIgLSBkMSAqICR7Y2hhbm5lbE11bH07XG4gICAgICAgIGludCB4UkNvcm5lciA9IHhSQ0Nvcm5lci54O1xuICAgICAgICBpbnQgeENDb3JuZXIgPSB4UkNDb3JuZXIueTtcblxuICAgICAgICAvL2ludGlhbGl6ZSBkb3RQcm9kIHdpdGggYSBzbWFsbCBlcHNpbG9uIHNlZW1zIHRvIHJlZHVjZSBHUFUgYWNjdXJhY3kgbG9zcy5cbiAgICAgICAgdmVjNCBkb3RQcm9kID0gdmVjNCgwLjAwMDAwMDAwMDAwMDAwMSk7XG5cbiAgICAgICAgJHttYWluTG9vcH1cblxuICAgICAgICB2ZWM0IHJlc3VsdCA9IGRvdFByb2QgLSB2ZWM0KDAuMDAwMDAwMDAwMDAwMDAxKTtcbiAgICAgICAgJHthZGRCaWFzU25pcHBldH1cbiAgICAgICAgJHthcHBseUFjdGl2YXRpb25TbmlwcGV0fVxuICAgICAgICBzZXRPdXRwdXQocmVzdWx0KTtcbiAgICAgIH1cbiAgICBgO1xuICB9XG59XG4iXX0=","/**\n * @license\n * Copyright 2020 Google LLC. All Rights Reserved.\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n * =============================================================================\n */\nimport { backend_util, DepthwiseConv2dNative, env, util } from '@tensorflow/tfjs-core';\nimport { DepthwiseConv2DProgram } from '../conv_gpu_depthwise';\nimport { DepthwiseConvPacked2DProgram } from '../conv_packed_gpu_depthwise';\nexport function depthwiseConv2dNative(args) {\n const { inputs, backend, attrs } = args;\n const { x, filter } = inputs;\n const { strides, pad, dilations, dimRoundingMode } = attrs;\n let $dilations = dilations;\n if ($dilations == null) {\n $dilations = [1, 1];\n }\n util.assert(backend_util.eitherStridesOrDilationsAreOne(strides, $dilations), () => 'Error in depthwiseConv2d: Either strides or dilations must be ' +\n `1. Got strides ${strides} and dilations '${$dilations}'`);\n const convInfo = backend_util.computeConv2DInfo(x.shape, filter.shape, strides, $dilations, pad, dimRoundingMode, true /* depthwise */);\n let program;\n if (env().getBool('WEBGL_PACK_DEPTHWISECONV') && convInfo.strideWidth <= 2 &&\n convInfo.outChannels / convInfo.inChannels === 1) {\n program = new DepthwiseConvPacked2DProgram(convInfo);\n }\n else {\n program = new DepthwiseConv2DProgram(convInfo);\n }\n const customValues = [\n [convInfo.padInfo.top, convInfo.padInfo.left],\n [convInfo.strideHeight, convInfo.strideWidth],\n [convInfo.dilationHeight, convInfo.dilationWidth],\n [convInfo.inHeight, convInfo.inWidth]\n ];\n return backend.runWebGLProgram(program, [x, filter], 'float32', customValues);\n}\nexport const depthwiseConv2dNativeConfig = {\n kernelName: DepthwiseConv2dNative,\n backendName: 'webgl',\n kernelFunc: depthwiseConv2dNative,\n};\n//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiRGVwdGh3aXNlQ29udjJkTmF0aXZlLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vLi4vdGZqcy1iYWNrZW5kLXdlYmdsL3NyYy9rZXJuZWxzL0RlcHRod2lzZUNvbnYyZE5hdGl2ZS50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQTs7Ozs7Ozs7Ozs7Ozs7O0dBZUc7QUFFSCxPQUFPLEVBQUMsWUFBWSxFQUFFLHFCQUFxQixFQUEyRCxHQUFHLEVBQTRCLElBQUksRUFBQyxNQUFNLHVCQUF1QixDQUFDO0FBR3hLLE9BQU8sRUFBQyxzQkFBc0IsRUFBQyxNQUFNLHVCQUF1QixDQUFDO0FBQzdELE9BQU8sRUFBQyw0QkFBNEIsRUFBQyxNQUFNLDhCQUE4QixDQUFDO0FBRTFFLE1BQU0sVUFBVSxxQkFBcUIsQ0FBQyxJQUlyQztJQUNDLE1BQU0sRUFBQyxNQUFNLEVBQUUsT0FBTyxFQUFFLEtBQUssRUFBQyxHQUFHLElBQUksQ0FBQztJQUN0QyxNQUFNLEVBQUMsQ0FBQyxFQUFFLE1BQU0sRUFBQyxHQUFHLE1BQU0sQ0FBQztJQUMzQixNQUFNLEVBQUMsT0FBTyxFQUFFLEdBQUcsRUFBRSxTQUFTLEVBQUUsZUFBZSxFQUFDLEdBQUcsS0FBSyxDQUFDO0lBRXpELElBQUksVUFBVSxHQUFHLFNBQVMsQ0FBQztJQUMzQixJQUFJLFVBQVUsSUFBSSxJQUFJLEVBQUU7UUFDdEIsVUFBVSxHQUFHLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDO0tBQ3JCO0lBRUQsSUFBSSxDQUFDLE1BQU0sQ0FDUCxZQUFZLENBQUMsOEJBQThCLENBQUMsT0FBTyxFQUFFLFVBQVUsQ0FBQyxFQUNoRSxHQUFHLEVBQUUsQ0FBQyxnRUFBZ0U7UUFDbEUsa0JBQWtCLE9BQU8sbUJBQW1CLFVBQVUsR0FBRyxDQUFDLENBQUM7SUFFbkUsTUFBTSxRQUFRLEdBQUcsWUFBWSxDQUFDLGlCQUFpQixDQUMzQyxDQUFDLENBQUMsS0FBeUMsRUFDM0MsTUFBTSxDQUFDLEtBQXlDLEVBQUUsT0FBTyxFQUFFLFVBQVUsRUFDckUsR0FBRyxFQUFFLGVBQWUsRUFBRSxJQUFJLENBQUMsZUFBZSxDQUFDLENBQUM7SUFFaEQsSUFBSSxPQUE0RCxDQUFDO0lBQ2pFLElBQUksR0FBRyxFQUFFLENBQUMsT0FBTyxDQUFDLDBCQUEwQixDQUFDLElBQUksUUFBUSxDQUFDLFdBQVcsSUFBSSxDQUFDO1FBQ3RFLFFBQVEsQ0FBQyxXQUFXLEdBQUcsUUFBUSxDQUFDLFVBQVUsS0FBSyxDQUFDLEVBQUU7UUFDcEQsT0FBTyxHQUFHLElBQUksNEJBQTRCLENBQUMsUUFBUSxDQUFDLENBQUM7S0FDdEQ7U0FBTTtRQUNMLE9BQU8sR0FBRyxJQUFJLHNCQUFzQixDQUFDLFFBQVEsQ0FBQyxDQUFDO0tBQ2hEO0lBQ0QsTUFBTSxZQUFZLEdBQUc7UUFDbkIsQ0FBQyxRQUFRLENBQUMsT0FBTyxDQUFDLEdBQUcsRUFBRSxRQUFRLENBQUMsT0FBTyxDQUFDLElBQUksQ0FBQztRQUM3QyxDQUFDLFFBQVEsQ0FBQyxZQUFZLEVBQUUsUUFBUSxDQUFDLFdBQVcsQ0FBQztRQUM3QyxDQUFDLFFBQVEsQ0FBQyxjQUFjLEVBQUUsUUFBUSxDQUFDLGFBQWEsQ0FBQztRQUNqRCxDQUFDLFFBQVEsQ0FBQyxRQUFRLEVBQUUsUUFBUSxDQUFDLE9BQU8sQ0FBQztLQUN0QyxDQUFDO0lBQ0YsT0FBTyxPQUFPLENBQUMsZUFBZSxDQUFDLE9BQU8sRUFBRSxDQUFDLENBQUMsRUFBRSxNQUFNLENBQUMsRUFBRSxTQUFTLEVBQUUsWUFBWSxDQUFDLENBQUM7QUFDaEYsQ0FBQztBQUVELE1BQU0sQ0FBQyxNQUFNLDJCQUEyQixHQUFpQjtJQUN2RCxVQUFVLEVBQUUscUJBQXFCO0lBQ2pDLFdBQVcsRUFBRSxPQUFPO0lBQ3BCLFVBQVUsRUFBRSxxQkFBeUM7Q0FDdEQsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbIi8qKlxuICogQGxpY2Vuc2VcbiAqIENvcHlyaWdodCAyMDIwIEdvb2dsZSBMTEMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuXG4gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgXCJMaWNlbnNlXCIpO1xuICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLlxuICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0XG4gKlxuICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wXG4gKlxuICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZVxuICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gXCJBUyBJU1wiIEJBU0lTLFxuICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuXG4gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kXG4gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS5cbiAqID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4gKi9cblxuaW1wb3J0IHtiYWNrZW5kX3V0aWwsIERlcHRod2lzZUNvbnYyZE5hdGl2ZSwgRGVwdGh3aXNlQ29udjJkTmF0aXZlQXR0cnMsIERlcHRod2lzZUNvbnYyZE5hdGl2ZUlucHV0cywgZW52LCBLZXJuZWxDb25maWcsIEtlcm5lbEZ1bmMsIHV0aWx9IGZyb20gJ0B0ZW5zb3JmbG93L3RmanMtY29yZSc7XG5cbmltcG9ydCB7TWF0aEJhY2tlbmRXZWJHTH0gZnJvbSAnLi4vYmFja2VuZF93ZWJnbCc7XG5pbXBvcnQge0RlcHRod2lzZUNvbnYyRFByb2dyYW19IGZyb20gJy4uL2NvbnZfZ3B1X2RlcHRod2lzZSc7XG5pbXBvcnQge0RlcHRod2lzZUNvbnZQYWNrZWQyRFByb2dyYW19IGZyb20gJy4uL2NvbnZfcGFja2VkX2dwdV9kZXB0aHdpc2UnO1xuXG5leHBvcnQgZnVuY3Rpb24gZGVwdGh3aXNlQ29udjJkTmF0aXZlKGFyZ3M6IHtcbiAgaW5wdXRzOiBEZXB0aHdpc2VDb252MmROYXRpdmVJbnB1dHMsXG4gIGF0dHJzOiBEZXB0aHdpc2VDb252MmROYXRpdmVBdHRycyxcbiAgYmFja2VuZDogTWF0aEJhY2tlbmRXZWJHTFxufSkge1xuICBjb25zdCB7aW5wdXRzLCBiYWNrZW5kLCBhdHRyc30gPSBhcmdzO1xuICBjb25zdCB7eCwgZmlsdGVyfSA9IGlucHV0cztcbiAgY29uc3Qge3N0cmlkZXMsIHBhZCwgZGlsYXRpb25zLCBkaW1Sb3VuZGluZ01vZGV9ID0gYXR0cnM7XG5cbiAgbGV0ICRkaWxhdGlvbnMgPSBkaWxhdGlvbnM7XG4gIGlmICgkZGlsYXRpb25zID09IG51bGwpIHtcbiAgICAkZGlsYXRpb25zID0gWzEsIDFdO1xuICB9XG5cbiAgdXRpbC5hc3NlcnQoXG4gICAgICBiYWNrZW5kX3V0aWwuZWl0aGVyU3RyaWRlc09yRGlsYXRpb25zQXJlT25lKHN0cmlkZXMsICRkaWxhdGlvbnMpLFxuICAgICAgKCkgPT4gJ0Vycm9yIGluIGRlcHRod2lzZUNvbnYyZDogRWl0aGVyIHN0cmlkZXMgb3IgZGlsYXRpb25zIG11c3QgYmUgJyArXG4gICAgICAgICAgYDEuIEdvdCBzdHJpZGVzICR7c3RyaWRlc30gYW5kIGRpbGF0aW9ucyAnJHskZGlsYXRpb25zfSdgKTtcblxuICBjb25zdCBjb252SW5mbyA9IGJhY2tlbmRfdXRpbC5jb21wdXRlQ29udjJESW5mbyhcbiAgICAgIHguc2hhcGUgYXMgW251bWJlciwgbnVtYmVyLCBudW1iZXIsIG51bWJlcl0sXG4gICAgICBmaWx0ZXIuc2hhcGUgYXMgW251bWJlciwgbnVtYmVyLCBudW1iZXIsIG51bWJlcl0sIHN0cmlkZXMsICRkaWxhdGlvbnMsXG4gICAgICBwYWQsIGRpbVJvdW5kaW5nTW9kZSwgdHJ1ZSAvKiBkZXB0aHdpc2UgKi8pO1xuXG4gIGxldCBwcm9ncmFtOiBEZXB0aHdpc2VDb252MkRQcm9ncmFtfERlcHRod2lzZUNvbnZQYWNrZWQyRFByb2dyYW07XG4gIGlmIChlbnYoKS5nZXRCb29sKCdXRUJHTF9QQUNLX0RFUFRIV0lTRUNPTlYnKSAmJiBjb252SW5mby5zdHJpZGVXaWR0aCA8PSAyICYmXG4gICAgICBjb252SW5mby5vdXRDaGFubmVscyAvIGNvbnZJbmZvLmluQ2hhbm5lbHMgPT09IDEpIHtcbiAgICBwcm9ncmFtID0gbmV3IERlcHRod2lzZUNvbnZQYWNrZWQyRFByb2dyYW0oY29udkluZm8pO1xuICB9IGVsc2Uge1xuICAgIHByb2dyYW0gPSBuZXcgRGVwdGh3aXNlQ29udjJEUHJvZ3JhbShjb252SW5mbyk7XG4gIH1cbiAgY29uc3QgY3VzdG9tVmFsdWVzID0gW1xuICAgIFtjb252SW5mby5wYWRJbmZvLnRvcCwgY29udkluZm8ucGFkSW5mby5sZWZ0XSxcbiAgICBbY29udkluZm8uc3RyaWRlSGVpZ2h0LCBjb252SW5mby5zdHJpZGVXaWR0aF0sXG4gICAgW2NvbnZJbmZvLmRpbGF0aW9uSGVpZ2h0LCBjb252SW5mby5kaWxhdGlvbldpZHRoXSxcbiAgICBbY29udkluZm8uaW5IZWlnaHQsIGNvbnZJbmZvLmluV2lkdGhdXG4gIF07XG4gIHJldHVybiBiYWNrZW5kLnJ1bldlYkdMUHJvZ3JhbShwcm9ncmFtLCBbeCwgZmlsdGVyXSwgJ2Zsb2F0MzInLCBjdXN0b21WYWx1ZXMpO1xufVxuXG5leHBvcnQgY29uc3QgZGVwdGh3aXNlQ29udjJkTmF0aXZlQ29uZmlnOiBLZXJuZWxDb25maWcgPSB7XG4gIGtlcm5lbE5hbWU6IERlcHRod2lzZUNvbnYyZE5hdGl2ZSxcbiAgYmFja2VuZE5hbWU6ICd3ZWJnbCcsXG4gIGtlcm5lbEZ1bmM6IGRlcHRod2lzZUNvbnYyZE5hdGl2ZSBhcyB7fSBhcyBLZXJuZWxGdW5jLFxufTtcbiJdfQ==","/**\n * @license\n * Copyright 2018 Google LLC. All Rights Reserved.\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n * =============================================================================\n */\nexport class DepthwiseConv2DDerFilterProgram {\n constructor(convInfo) {\n this.variableNames = ['x', 'dy'];\n this.outputShape = convInfo.filterShape;\n const strideHeight = convInfo.strideHeight;\n const strideWidth = convInfo.strideWidth;\n const padTop = convInfo.padInfo.top;\n const padLeft = convInfo.padInfo.left;\n const channelMul = convInfo.outChannels / convInfo.inChannels;\n this.userCode = `\n void main() {\n ivec4 coords = getOutputCoords();\n int wR = coords.x;\n int wC = coords.y;\n int d1 = coords.z;\n int dm = coords.w;\n int d2 = d1 * ${channelMul} + dm;\n\n float dotProd = 0.0;\n\n // TO DO: Vec4 over the batch size\n for (int b = 0; b < ${convInfo.batchSize}; b++) {\n for (int yR = 0; yR < ${convInfo.outHeight}; yR++) {\n int xR = wR + yR * ${strideHeight} - ${padTop};\n\n if (xR < 0 || xR >= ${convInfo.inHeight}) {\n continue;\n }\n\n for (int yC = 0; yC < ${convInfo.outWidth}; yC++) {\n int xC = wC + yC * ${strideWidth} - ${padLeft};\n\n if (xC < 0 || xC >= ${convInfo.inWidth}) {\n continue;\n }\n\n float dyValue = getDy(b, yR, yC, d2);\n float xValue = getX(b, xR, xC, d1);\n dotProd += (xValue * dyValue);\n }\n }\n }\n setOutput(dotProd);\n }\n `;\n }\n}\nexport class DepthwiseConv2DDerInputProgram {\n constructor(convInfo) {\n this.variableNames = ['dy', 'W'];\n this.outputShape = convInfo.inShape;\n const filterHeight = convInfo.filterHeight;\n const filterWidth = convInfo.filterWidth;\n const strideHeight = convInfo.strideHeight;\n const strideWidth = convInfo.strideWidth;\n const padTop = filterHeight - 1 - convInfo.padInfo.top;\n const padLeft = filterWidth - 1 - convInfo.padInfo.left;\n const channelMul = convInfo.outChannels / convInfo.inChannels;\n this.userCode = `\n const ivec2 pads = ivec2(${padTop}, ${padLeft});\n\n void main() {\n ivec4 coords = getOutputCoords();\n int batch = coords[0];\n int d1 = coords[3];\n ivec2 dyCorner = coords.yz - pads;\n int dyRCorner = dyCorner.x;\n int dyCCorner = dyCorner.y;\n\n float dotProd = 0.0;\n\n for (int wR = 0; wR < ${filterHeight}; wR++) {\n float dyR = float(dyRCorner + wR) / ${strideHeight}.0;\n\n if (dyR < 0.0 || dyR >= ${convInfo.outHeight}.0 || fract(dyR) > 0.0) {\n continue;\n }\n int idyR = int(dyR);\n\n int wRPerm = ${filterHeight} - 1 - wR;\n\n for (int wC = 0; wC < ${filterWidth}; wC++) {\n float dyC = float(dyCCorner + wC) / ${strideWidth}.0;\n\n if (dyC < 0.0 || dyC >= ${convInfo.outWidth}.0 ||\n fract(dyC) > 0.0) {\n continue;\n }\n int idyC = int(dyC);\n\n int wCPerm = ${filterWidth} - 1 - wC;\n\n // TO DO: Vec4 over the channelMul\n for (int dm = 0; dm < ${channelMul}; dm++) {\n int d2 = d1 * ${channelMul} + dm;\n float xValue = getDy(batch, idyR, idyC, d2);\n float wValue = getW(wRPerm, wCPerm, d1, dm);\n dotProd += xValue * wValue;\n }\n }\n }\n setOutput(dotProd);\n }\n `;\n }\n}\n//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY29udl9iYWNrcHJvcF9ncHVfZGVwdGh3aXNlLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vdGZqcy1iYWNrZW5kLXdlYmdsL3NyYy9jb252X2JhY2twcm9wX2dwdV9kZXB0aHdpc2UudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUE7Ozs7Ozs7Ozs7Ozs7OztHQWVHO0FBS0gsTUFBTSxPQUFPLCtCQUErQjtJQUsxQyxZQUFZLFFBQWlDO1FBSjdDLGtCQUFhLEdBQUcsQ0FBQyxHQUFHLEVBQUUsSUFBSSxDQUFDLENBQUM7UUFLMUIsSUFBSSxDQUFDLFdBQVcsR0FBRyxRQUFRLENBQUMsV0FBVyxDQUFDO1FBRXhDLE1BQU0sWUFBWSxHQUFHLFFBQVEsQ0FBQyxZQUFZLENBQUM7UUFDM0MsTUFBTSxXQUFXLEdBQUcsUUFBUSxDQUFDLFdBQVcsQ0FBQztRQUN6QyxNQUFNLE1BQU0sR0FBRyxRQUFRLENBQUMsT0FBTyxDQUFDLEdBQUcsQ0FBQztRQUNwQyxNQUFNLE9BQU8sR0FBRyxRQUFRLENBQUMsT0FBTyxDQUFDLElBQUksQ0FBQztRQUN0QyxNQUFNLFVBQVUsR0FBRyxRQUFRLENBQUMsV0FBVyxHQUFHLFFBQVEsQ0FBQyxVQUFVLENBQUM7UUFFOUQsSUFBSSxDQUFDLFFBQVEsR0FBRzs7Ozs7Ozt3QkFPSSxVQUFVOzs7Ozs4QkFLSixRQUFRLENBQUMsU0FBUztrQ0FDZCxRQUFRLENBQUMsU0FBUztpQ0FDbkIsWUFBWSxNQUFNLE1BQU07O2tDQUV2QixRQUFRLENBQUMsUUFBUTs7OztvQ0FJZixRQUFRLENBQUMsUUFBUTttQ0FDbEIsV0FBVyxNQUFNLE9BQU87O29DQUV2QixRQUFRLENBQUMsT0FBTzs7Ozs7Ozs7Ozs7O0tBWS9DLENBQUM7SUFDSixDQUFDO0NBQ0Y7QUFFRCxNQUFNLE9BQU8sOEJBQThCO0lBS3pDLFlBQVksUUFBaUM7UUFKN0Msa0JBQWEsR0FBRyxDQUFDLElBQUksRUFBRSxHQUFHLENBQUMsQ0FBQztRQUsxQixJQUFJLENBQUMsV0FBVyxHQUFHLFFBQVEsQ0FBQyxPQUFPLENBQUM7UUFFcEMsTUFBTSxZQUFZLEdBQUcsUUFBUSxDQUFDLFlBQVksQ0FBQztRQUMzQyxNQUFNLFdBQVcsR0FBRyxRQUFRLENBQUMsV0FBVyxDQUFDO1FBQ3pDLE1BQU0sWUFBWSxHQUFHLFFBQVEsQ0FBQyxZQUFZLENBQUM7UUFDM0MsTUFBTSxXQUFXLEdBQUcsUUFBUSxDQUFDLFdBQVcsQ0FBQztRQUV6QyxNQUFNLE1BQU0sR0FBRyxZQUFZLEdBQUcsQ0FBQyxHQUFHLFFBQVEsQ0FBQyxPQUFPLENBQUMsR0FBRyxDQUFDO1FBQ3ZELE1BQU0sT0FBTyxHQUFHLFdBQVcsR0FBRyxDQUFDLEdBQUcsUUFBUSxDQUFDLE9BQU8sQ0FBQyxJQUFJLENBQUM7UUFDeEQsTUFBTSxVQUFVLEdBQUcsUUFBUSxDQUFDLFdBQVcsR0FBRyxRQUFRLENBQUMsVUFBVSxDQUFDO1FBRTlELElBQUksQ0FBQyxRQUFRLEdBQUc7aUNBQ2EsTUFBTSxLQUFLLE9BQU87Ozs7Ozs7Ozs7OztnQ0FZbkIsWUFBWTtnREFDSSxZQUFZOztvQ0FFeEIsUUFBUSxDQUFDLFNBQVM7Ozs7O3lCQUs3QixZQUFZOztrQ0FFSCxXQUFXO2tEQUNLLFdBQVc7O3NDQUV2QixRQUFRLENBQUMsUUFBUTs7Ozs7OzJCQU01QixXQUFXOzs7b0NBR0YsVUFBVTs4QkFDaEIsVUFBVTs7Ozs7Ozs7O0tBU25DLENBQUM7SUFDSixDQUFDO0NBQ0YiLCJzb3VyY2VzQ29udGVudCI6WyIvKipcbiAqIEBsaWNlbnNlXG4gKiBDb3B5cmlnaHQgMjAxOCBHb29nbGUgTExDLiBBbGwgUmlnaHRzIFJlc2VydmVkLlxuICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlIFwiTGljZW5zZVwiKTtcbiAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS5cbiAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdFxuICpcbiAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMFxuICpcbiAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmVcbiAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuIFwiQVMgSVNcIiBCQVNJUyxcbiAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLlxuICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZFxuICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuXG4gKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuICovXG5cbmltcG9ydCB7YmFja2VuZF91dGlsfSBmcm9tICdAdGVuc29yZmxvdy90ZmpzLWNvcmUnO1xuaW1wb3J0IHtHUEdQVVByb2dyYW19IGZyb20gJy4vZ3BncHVfbWF0aCc7XG5cbmV4cG9ydCBjbGFzcyBEZXB0aHdpc2VDb252MkREZXJGaWx0ZXJQcm9ncmFtIGltcGxlbWVudHMgR1BHUFVQcm9ncmFtIHtcbiAgdmFyaWFibGVOYW1lcyA9IFsneCcsICdkeSddO1xuICBvdXRwdXRTaGFwZTogbnVtYmVyW107XG4gIHVzZXJDb2RlOiBzdHJpbmc7XG5cbiAgY29uc3RydWN0b3IoY29udkluZm86IGJhY2tlbmRfdXRpbC5Db252MkRJbmZvKSB7XG4gICAgdGhpcy5vdXRwdXRTaGFwZSA9IGNvbnZJbmZvLmZpbHRlclNoYXBlO1xuXG4gICAgY29uc3Qgc3RyaWRlSGVpZ2h0ID0gY29udkluZm8uc3RyaWRlSGVpZ2h0O1xuICAgIGNvbnN0IHN0cmlkZVdpZHRoID0gY29udkluZm8uc3RyaWRlV2lkdGg7XG4gICAgY29uc3QgcGFkVG9wID0gY29udkluZm8ucGFkSW5mby50b3A7XG4gICAgY29uc3QgcGFkTGVmdCA9IGNvbnZJbmZvLnBhZEluZm8ubGVmdDtcbiAgICBjb25zdCBjaGFubmVsTXVsID0gY29udkluZm8ub3V0Q2hhbm5lbHMgLyBjb252SW5mby5pbkNoYW5uZWxzO1xuXG4gICAgdGhpcy51c2VyQ29kZSA9IGBcbiAgICAgIHZvaWQgbWFpbigpIHtcbiAgICAgICAgaXZlYzQgY29vcmRzID0gZ2V0T3V0cHV0Q29vcmRzKCk7XG4gICAgICAgIGludCB3UiA9IGNvb3Jkcy54O1xuICAgICAgICBpbnQgd0MgPSBjb29yZHMueTtcbiAgICAgICAgaW50IGQxID0gY29vcmRzLno7XG4gICAgICAgIGludCBkbSA9IGNvb3Jkcy53O1xuICAgICAgICBpbnQgZDIgPSBkMSAqICR7Y2hhbm5lbE11bH0gKyBkbTtcblxuICAgICAgICBmbG9hdCBkb3RQcm9kID0gMC4wO1xuXG4gICAgICAgIC8vIFRPIERPOiBWZWM0IG92ZXIgdGhlIGJhdGNoIHNpemVcbiAgICAgICAgZm9yIChpbnQgYiA9IDA7IGIgPCAke2NvbnZJbmZvLmJhdGNoU2l6ZX07IGIrKykge1xuICAgICAgICAgIGZvciAoaW50IHlSID0gMDsgeVIgPCAke2NvbnZJbmZvLm91dEhlaWdodH07IHlSKyspIHtcbiAgICAgICAgICAgIGludCB4UiA9IHdSICsgeVIgKiAke3N0cmlkZUhlaWdodH0gLSAke3BhZFRvcH07XG5cbiAgICAgICAgICAgIGlmICh4UiA8IDAgfHwgeFIgPj0gJHtjb252SW5mby5pbkhlaWdodH0pIHtcbiAgICAgICAgICAgICAgY29udGludWU7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIGZvciAoaW50IHlDID0gMDsgeUMgPCAke2NvbnZJbmZvLm91dFdpZHRofTsgeUMrKykge1xuICAgICAgICAgICAgICBpbnQgeEMgPSB3QyArIHlDICogJHtzdHJpZGVXaWR0aH0gLSAke3BhZExlZnR9O1xuXG4gICAgICAgICAgICAgIGlmICh4QyA8IDAgfHwgeEMgPj0gJHtjb252SW5mby5pbldpZHRofSkge1xuICAgICAgICAgICAgICAgIGNvbnRpbnVlO1xuICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgZmxvYXQgZHlWYWx1ZSA9IGdldER5KGIsIHlSLCB5QywgZDIpO1xuICAgICAgICAgICAgICBmbG9hdCB4VmFsdWUgPSBnZXRYKGIsIHhSLCB4QywgZDEpO1xuICAgICAgICAgICAgICBkb3RQcm9kICs9ICh4VmFsdWUgKiBkeVZhbHVlKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgc2V0T3V0cHV0KGRvdFByb2QpO1xuICAgICAgfVxuICAgIGA7XG4gIH1cbn1cblxuZXhwb3J0IGNsYXNzIERlcHRod2lzZUNvbnYyRERlcklucHV0UHJvZ3JhbSBpbXBsZW1lbnRzIEdQR1BVUHJvZ3JhbSB7XG4gIHZhcmlhYmxlTmFtZXMgPSBbJ2R5JywgJ1cnXTtcbiAgb3V0cHV0U2hhcGU6IG51bWJlcltdO1xuICB1c2VyQ29kZTogc3RyaW5nO1xuXG4gIGNvbnN0cnVjdG9yKGNvbnZJbmZvOiBiYWNrZW5kX3V0aWwuQ29udjJESW5mbykge1xuICAgIHRoaXMub3V0cHV0U2hhcGUgPSBjb252SW5mby5pblNoYXBlO1xuXG4gICAgY29uc3QgZmlsdGVySGVpZ2h0ID0gY29udkluZm8uZmlsdGVySGVpZ2h0O1xuICAgIGNvbnN0IGZpbHRlcldpZHRoID0gY29udkluZm8uZmlsdGVyV2lkdGg7XG4gICAgY29uc3Qgc3RyaWRlSGVpZ2h0ID0gY29udkluZm8uc3RyaWRlSGVpZ2h0O1xuICAgIGNvbnN0IHN0cmlkZVdpZHRoID0gY29udkluZm8uc3RyaWRlV2lkdGg7XG5cbiAgICBjb25zdCBwYWRUb3AgPSBmaWx0ZXJIZWlnaHQgLSAxIC0gY29udkluZm8ucGFkSW5mby50b3A7XG4gICAgY29uc3QgcGFkTGVmdCA9IGZpbHRlcldpZHRoIC0gMSAtIGNvbnZJbmZvLnBhZEluZm8ubGVmdDtcbiAgICBjb25zdCBjaGFubmVsTXVsID0gY29udkluZm8ub3V0Q2hhbm5lbHMgLyBjb252SW5mby5pbkNoYW5uZWxzO1xuXG4gICAgdGhpcy51c2VyQ29kZSA9IGBcbiAgICAgIGNvbnN0IGl2ZWMyIHBhZHMgPSBpdmVjMigke3BhZFRvcH0sICR7cGFkTGVmdH0pO1xuXG4gICAgICB2b2lkIG1haW4oKSB7XG4gICAgICAgIGl2ZWM0IGNvb3JkcyA9IGdldE91dHB1dENvb3JkcygpO1xuICAgICAgICBpbnQgYmF0Y2ggPSBjb29yZHNbMF07XG4gICAgICAgIGludCBkMSA9IGNvb3Jkc1szXTtcbiAgICAgICAgaXZlYzIgZHlDb3JuZXIgPSBjb29yZHMueXogLSBwYWRzO1xuICAgICAgICBpbnQgZHlSQ29ybmVyID0gZHlDb3JuZXIueDtcbiAgICAgICAgaW50IGR5Q0Nvcm5lciA9IGR5Q29ybmVyLnk7XG5cbiAgICAgICAgZmxvYXQgZG90UHJvZCA9IDAuMDtcblxuICAgICAgICBmb3IgKGludCB3UiA9IDA7IHdSIDwgJHtmaWx0ZXJIZWlnaHR9OyB3UisrKSB7XG4gICAgICAgICAgZmxvYXQgZHlSID0gZmxvYXQoZHlSQ29ybmVyICsgd1IpIC8gJHtzdHJpZGVIZWlnaHR9LjA7XG5cbiAgICAgICAgICBpZiAoZHlSIDwgMC4wIHx8IGR5UiA+PSAke2NvbnZJbmZvLm91dEhlaWdodH0uMCB8fCBmcmFjdChkeVIpID4gMC4wKSB7XG4gICAgICAgICAgICBjb250aW51ZTtcbiAgICAgICAgICB9XG4gICAgICAgICAgaW50IGlkeVIgPSBpbnQoZHlSKTtcblxuICAgICAgICAgIGludCB3UlBlcm0gPSAke2ZpbHRlckhlaWdodH0gLSAxIC0gd1I7XG5cbiAgICAgICAgICBmb3IgKGludCB3QyA9IDA7IHdDIDwgJHtmaWx0ZXJXaWR0aH07IHdDKyspIHtcbiAgICAgICAgICAgIGZsb2F0IGR5QyA9IGZsb2F0KGR5Q0Nvcm5lciArIHdDKSAvICR7c3RyaWRlV2lkdGh9LjA7XG5cbiAgICAgICAgICAgIGlmIChkeUMgPCAwLjAgfHwgZHlDID49ICR7Y29udkluZm8ub3V0V2lkdGh9LjAgfHxcbiAgICAgICAgICAgICAgICBmcmFjdChkeUMpID4gMC4wKSB7XG4gICAgICAgICAgICAgIGNvbnRpbnVlO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgaW50IGlkeUMgPSBpbnQoZHlDKTtcblxuICAgICAgICAgICAgaW50IHdDUGVybSA9ICR7ZmlsdGVyV2lkdGh9IC0gMSAtIHdDO1xuXG4gICAgICAgICAgICAvLyBUTyBETzogVmVjNCBvdmVyIHRoZSBjaGFubmVsTXVsXG4gICAgICAgICAgICBmb3IgKGludCBkbSA9IDA7IGRtIDwgJHtjaGFubmVsTXVsfTsgZG0rKykge1xuICAgICAgICAgICAgICBpbnQgZDIgPSBkMSAqICR7Y2hhbm5lbE11bH0gKyBkbTtcbiAgICAgICAgICAgICAgZmxvYXQgeFZhbHVlID0gZ2V0RHkoYmF0Y2gsIGlkeVIsIGlkeUMsIGQyKTtcbiAgICAgICAgICAgICAgZmxvYXQgd1ZhbHVlID0gZ2V0Vyh3UlBlcm0sIHdDUGVybSwgZDEsIGRtKTtcbiAgICAgICAgICAgICAgZG90UHJvZCArPSB4VmFsdWUgKiB3VmFsdWU7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIHNldE91dHB1dChkb3RQcm9kKTtcbiAgICAgIH1cbiAgICBgO1xuICB9XG59XG4iXX0=","/**\n * @license\n * Copyright 2020 Google LLC. All Rights Reserved.\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n * =============================================================================\n */\nimport { backend_util, DepthwiseConv2dNativeBackpropFilter } from '@tensorflow/tfjs-core';\nimport { DepthwiseConv2DDerFilterProgram } from '../conv_backprop_gpu_depthwise';\nexport function depthwiseConv2dNativeBackpropFilter(args) {\n const { inputs, backend, attrs } = args;\n const { x, dy } = inputs;\n const { strides, dilations, pad, dimRoundingMode, filterShape } = attrs;\n const convInfo = backend_util.computeConv2DInfo(x.shape, filterShape, strides, dilations, pad, dimRoundingMode, true /* depthwise */);\n const program = new DepthwiseConv2DDerFilterProgram(convInfo);\n return backend.runWebGLProgram(program, [x, dy], 'float32');\n}\nexport const depthwiseConv2dNativeBackpropFilterConfig = {\n kernelName: DepthwiseConv2dNativeBackpropFilter,\n backendName: 'webgl',\n kernelFunc: depthwiseConv2dNativeBackpropFilter\n};\n//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiRGVwdGh3aXNlQ29udjJkTmF0aXZlQmFja3Byb3BGaWx0ZXIuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi8uLi90ZmpzLWJhY2tlbmQtd2ViZ2wvc3JjL2tlcm5lbHMvRGVwdGh3aXNlQ29udjJkTmF0aXZlQmFja3Byb3BGaWx0ZXIudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUE7Ozs7Ozs7Ozs7Ozs7OztHQWVHO0FBRUgsT0FBTyxFQUFDLFlBQVksRUFBRSxtQ0FBbUMsRUFBZ0gsTUFBTSx1QkFBdUIsQ0FBQztBQUd2TSxPQUFPLEVBQUMsK0JBQStCLEVBQUMsTUFBTSxnQ0FBZ0MsQ0FBQztBQUUvRSxNQUFNLFVBQVUsbUNBQW1DLENBQUMsSUFJbkQ7SUFDQyxNQUFNLEVBQUMsTUFBTSxFQUFFLE9BQU8sRUFBRSxLQUFLLEVBQUMsR0FBRyxJQUFJLENBQUM7SUFDdEMsTUFBTSxFQUFDLENBQUMsRUFBRSxFQUFFLEVBQUMsR0FBRyxNQUFNLENBQUM7SUFDdkIsTUFBTSxFQUFDLE9BQU8sRUFBRSxTQUFTLEVBQUUsR0FBRyxFQUFFLGVBQWUsRUFBRSxXQUFXLEVBQUMsR0FBRyxLQUFLLENBQUM7SUFFdEUsTUFBTSxRQUFRLEdBQUcsWUFBWSxDQUFDLGlCQUFpQixDQUMzQyxDQUFDLENBQUMsS0FBeUMsRUFBRSxXQUFXLEVBQUUsT0FBTyxFQUNqRSxTQUFTLEVBQUUsR0FBRyxFQUFFLGVBQWUsRUFBRSxJQUFJLENBQUMsZUFBZSxDQUFDLENBQUM7SUFFM0QsTUFBTSxPQUFPLEdBQUcsSUFBSSwrQkFBK0IsQ0FBQyxRQUFRLENBQUMsQ0FBQztJQUM5RCxPQUFPLE9BQU8sQ0FBQyxlQUFlLENBQUMsT0FBTyxFQUFFLENBQUMsQ0FBQyxFQUFFLEVBQUUsQ0FBQyxFQUFFLFNBQVMsQ0FBQyxDQUFDO0FBQzlELENBQUM7QUFFRCxNQUFNLENBQUMsTUFBTSx5Q0FBeUMsR0FBaUI7SUFDckUsVUFBVSxFQUFFLG1DQUFtQztJQUMvQyxXQUFXLEVBQUUsT0FBTztJQUNwQixVQUFVLEVBQUUsbUNBQXVEO0NBQ3BFLENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyIvKipcbiAqIEBsaWNlbnNlXG4gKiBDb3B5cmlnaHQgMjAyMCBHb29nbGUgTExDLiBBbGwgUmlnaHRzIFJlc2VydmVkLlxuICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlIFwiTGljZW5zZVwiKTtcbiAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS5cbiAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdFxuICpcbiAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMFxuICpcbiAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmVcbiAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuIFwiQVMgSVNcIiBCQVNJUyxcbiAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLlxuICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZFxuICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuXG4gKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuICovXG5cbmltcG9ydCB7YmFja2VuZF91dGlsLCBEZXB0aHdpc2VDb252MmROYXRpdmVCYWNrcHJvcEZpbHRlciwgRGVwdGh3aXNlQ29udjJkTmF0aXZlQmFja3Byb3BGaWx0ZXJBdHRycywgRGVwdGh3aXNlQ29udjJkTmF0aXZlQmFja3Byb3BGaWx0ZXJJbnB1dHMsIEtlcm5lbENvbmZpZywgS2VybmVsRnVuY30gZnJvbSAnQHRlbnNvcmZsb3cvdGZqcy1jb3JlJztcblxuaW1wb3J0IHtNYXRoQmFja2VuZFdlYkdMfSBmcm9tICcuLi9iYWNrZW5kX3dlYmdsJztcbmltcG9ydCB7RGVwdGh3aXNlQ29udjJERGVyRmlsdGVyUHJvZ3JhbX0gZnJvbSAnLi4vY29udl9iYWNrcHJvcF9ncHVfZGVwdGh3aXNlJztcblxuZXhwb3J0IGZ1bmN0aW9uIGRlcHRod2lzZUNvbnYyZE5hdGl2ZUJhY2twcm9wRmlsdGVyKGFyZ3M6IHtcbiAgaW5wdXRzOiBEZXB0aHdpc2VDb252MmROYXRpdmVCYWNrcHJvcEZpbHRlcklucHV0cyxcbiAgYXR0cnM6IERlcHRod2lzZUNvbnYyZE5hdGl2ZUJhY2twcm9wRmlsdGVyQXR0cnMsXG4gIGJhY2tlbmQ6IE1hdGhCYWNrZW5kV2ViR0xcbn0pIHtcbiAgY29uc3Qge2lucHV0cywgYmFja2VuZCwgYXR0cnN9ID0gYXJncztcbiAgY29uc3Qge3gsIGR5fSA9IGlucHV0cztcbiAgY29uc3Qge3N0cmlkZXMsIGRpbGF0aW9ucywgcGFkLCBkaW1Sb3VuZGluZ01vZGUsIGZpbHRlclNoYXBlfSA9IGF0dHJzO1xuXG4gIGNvbnN0IGNvbnZJbmZvID0gYmFja2VuZF91dGlsLmNvbXB1dGVDb252MkRJbmZvKFxuICAgICAgeC5zaGFwZSBhcyBbbnVtYmVyLCBudW1iZXIsIG51bWJlciwgbnVtYmVyXSwgZmlsdGVyU2hhcGUsIHN0cmlkZXMsXG4gICAgICBkaWxhdGlvbnMsIHBhZCwgZGltUm91bmRpbmdNb2RlLCB0cnVlIC8qIGRlcHRod2lzZSAqLyk7XG5cbiAgY29uc3QgcHJvZ3JhbSA9IG5ldyBEZXB0aHdpc2VDb252MkREZXJGaWx0ZXJQcm9ncmFtKGNvbnZJbmZvKTtcbiAgcmV0dXJuIGJhY2tlbmQucnVuV2ViR0xQcm9ncmFtKHByb2dyYW0sIFt4LCBkeV0sICdmbG9hdDMyJyk7XG59XG5cbmV4cG9ydCBjb25zdCBkZXB0aHdpc2VDb252MmROYXRpdmVCYWNrcHJvcEZpbHRlckNvbmZpZzogS2VybmVsQ29uZmlnID0ge1xuICBrZXJuZWxOYW1lOiBEZXB0aHdpc2VDb252MmROYXRpdmVCYWNrcHJvcEZpbHRlcixcbiAgYmFja2VuZE5hbWU6ICd3ZWJnbCcsXG4gIGtlcm5lbEZ1bmM6IGRlcHRod2lzZUNvbnYyZE5hdGl2ZUJhY2twcm9wRmlsdGVyIGFzIHt9IGFzIEtlcm5lbEZ1bmNcbn07XG4iXX0=","/**\n * @license\n * Copyright 2020 Google LLC. All Rights Reserved.\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n * =============================================================================\n */\nimport { backend_util, DepthwiseConv2dNativeBackpropInput } from '@tensorflow/tfjs-core';\nimport { DepthwiseConv2DDerInputProgram } from '../conv_backprop_gpu_depthwise';\nexport function depthwiseConv2dNativeBackpropInput(args) {\n const { inputs, backend, attrs } = args;\n const { dy, filter } = inputs;\n const { strides, dilations, pad, dimRoundingMode, inputShape } = attrs;\n const convInfo = backend_util.computeConv2DInfo(inputShape, filter.shape, strides, dilations, pad, dimRoundingMode, true /* depthwise */);\n const program = new DepthwiseConv2DDerInputProgram(convInfo);\n return backend.runWebGLProgram(program, [dy, filter], 'float32');\n}\nexport const depthwiseConv2dNativeBackpropInputConfig = {\n kernelName: DepthwiseConv2dNativeBackpropInput,\n backendName: 'webgl',\n kernelFunc: depthwiseConv2dNativeBackpropInput\n};\n//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiRGVwdGh3aXNlQ29udjJkTmF0aXZlQmFja3Byb3BJbnB1dC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uLy4uL3RmanMtYmFja2VuZC13ZWJnbC9zcmMva2VybmVscy9EZXB0aHdpc2VDb252MmROYXRpdmVCYWNrcHJvcElucHV0LnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBOzs7Ozs7Ozs7Ozs7Ozs7R0FlRztBQUVILE9BQU8sRUFBQyxZQUFZLEVBQUUsa0NBQWtDLEVBQThHLE1BQU0sdUJBQXVCLENBQUM7QUFHcE0sT0FBTyxFQUFDLDhCQUE4QixFQUFDLE1BQU0sZ0NBQWdDLENBQUM7QUFFOUUsTUFBTSxVQUFVLGtDQUFrQyxDQUFDLElBSWxEO0lBQ0MsTUFBTSxFQUFDLE1BQU0sRUFBRSxPQUFPLEVBQUUsS0FBSyxFQUFDLEdBQUcsSUFBSSxDQUFDO0lBQ3RDLE1BQU0sRUFBQyxFQUFFLEVBQUUsTUFBTSxFQUFDLEdBQUcsTUFBTSxDQUFDO0lBQzVCLE1BQU0sRUFBQyxPQUFPLEVBQUUsU0FBUyxFQUFFLEdBQUcsRUFBRSxlQUFlLEVBQUUsVUFBVSxFQUFDLEdBQUcsS0FBSyxDQUFDO0lBRXJFLE1BQU0sUUFBUSxHQUFHLFlBQVksQ0FBQyxpQkFBaUIsQ0FDM0MsVUFBVSxFQUFFLE1BQU0sQ0FBQyxLQUF5QyxFQUFFLE9BQU8sRUFDckUsU0FBUyxFQUFFLEdBQUcsRUFBRSxlQUFlLEVBQUUsSUFBSSxDQUFDLGVBQWUsQ0FBQyxDQUFDO0lBRTNELE1BQU0sT0FBTyxHQUFHLElBQUksOEJBQThCLENBQUMsUUFBUSxDQUFDLENBQUM7SUFDN0QsT0FBTyxPQUFPLENBQUMsZUFBZSxDQUFDLE9BQU8sRUFBRSxDQUFDLEVBQUUsRUFBRSxNQUFNLENBQUMsRUFBRSxTQUFTLENBQUMsQ0FBQztBQUNuRSxDQUFDO0FBRUQsTUFBTSxDQUFDLE1BQU0sd0NBQXdDLEdBQWlCO0lBQ3BFLFVBQVUsRUFBRSxrQ0FBa0M7SUFDOUMsV0FBVyxFQUFFLE9BQU87SUFDcEIsVUFBVSxFQUFFLGtDQUFzRDtDQUNuRSxDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiLyoqXG4gKiBAbGljZW5zZVxuICogQ29weXJpZ2h0IDIwMjAgR29vZ2xlIExMQy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC5cbiAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSBcIkxpY2Vuc2VcIik7XG4gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuXG4gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXRcbiAqXG4gKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjBcbiAqXG4gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlXG4gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiBcIkFTIElTXCIgQkFTSVMsXG4gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC5cbiAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmRcbiAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLlxuICogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbiAqL1xuXG5pbXBvcnQge2JhY2tlbmRfdXRpbCwgRGVwdGh3aXNlQ29udjJkTmF0aXZlQmFja3Byb3BJbnB1dCwgRGVwdGh3aXNlQ29udjJkTmF0aXZlQmFja3Byb3BJbnB1dEF0dHJzLCBEZXB0aHdpc2VDb252MmROYXRpdmVCYWNrcHJvcElucHV0SW5wdXRzLCBLZXJuZWxDb25maWcsIEtlcm5lbEZ1bmN9IGZyb20gJ0B0ZW5zb3JmbG93L3RmanMtY29yZSc7XG5cbmltcG9ydCB7TWF0aEJhY2tlbmRXZWJHTH0gZnJvbSAnLi4vYmFja2VuZF93ZWJnbCc7XG5pbXBvcnQge0RlcHRod2lzZUNvbnYyRERlcklucHV0UHJvZ3JhbX0gZnJvbSAnLi4vY29udl9iYWNrcHJvcF9ncHVfZGVwdGh3aXNlJztcblxuZXhwb3J0IGZ1bmN0aW9uIGRlcHRod2lzZUNvbnYyZE5hdGl2ZUJhY2twcm9wSW5wdXQoYXJnczoge1xuICBpbnB1dHM6IERlcHRod2lzZUNvbnYyZE5hdGl2ZUJhY2twcm9wSW5wdXRJbnB1dHMsXG4gIGF0dHJzOiBEZXB0aHdpc2VDb252MmROYXRpdmVCYWNrcHJvcElucHV0QXR0cnMsXG4gIGJhY2tlbmQ6IE1hdGhCYWNrZW5kV2ViR0xcbn0pIHtcbiAgY29uc3Qge2lucHV0cywgYmFja2VuZCwgYXR0cnN9ID0gYXJncztcbiAgY29uc3Qge2R5LCBmaWx0ZXJ9ID0gaW5wdXRzO1xuICBjb25zdCB7c3RyaWRlcywgZGlsYXRpb25zLCBwYWQsIGRpbVJvdW5kaW5nTW9kZSwgaW5wdXRTaGFwZX0gPSBhdHRycztcblxuICBjb25zdCBjb252SW5mbyA9IGJhY2tlbmRfdXRpbC5jb21wdXRlQ29udjJESW5mbyhcbiAgICAgIGlucHV0U2hhcGUsIGZpbHRlci5zaGFwZSBhcyBbbnVtYmVyLCBudW1iZXIsIG51bWJlciwgbnVtYmVyXSwgc3RyaWRlcyxcbiAgICAgIGRpbGF0aW9ucywgcGFkLCBkaW1Sb3VuZGluZ01vZGUsIHRydWUgLyogZGVwdGh3aXNlICovKTtcblxuICBjb25zdCBwcm9ncmFtID0gbmV3IERlcHRod2lzZUNvbnYyRERlcklucHV0UHJvZ3JhbShjb252SW5mbyk7XG4gIHJldHVybiBiYWNrZW5kLnJ1bldlYkdMUHJvZ3JhbShwcm9ncmFtLCBbZHksIGZpbHRlcl0sICdmbG9hdDMyJyk7XG59XG5cbmV4cG9ydCBjb25zdCBkZXB0aHdpc2VDb252MmROYXRpdmVCYWNrcHJvcElucHV0Q29uZmlnOiBLZXJuZWxDb25maWcgPSB7XG4gIGtlcm5lbE5hbWU6IERlcHRod2lzZUNvbnYyZE5hdGl2ZUJhY2twcm9wSW5wdXQsXG4gIGJhY2tlbmROYW1lOiAnd2ViZ2wnLFxuICBrZXJuZWxGdW5jOiBkZXB0aHdpc2VDb252MmROYXRpdmVCYWNrcHJvcElucHV0IGFzIHt9IGFzIEtlcm5lbEZ1bmNcbn07XG4iXX0=","/**\n * @license\n * Copyright 2019 Google LLC. All Rights Reserved.\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n * =============================================================================\n */\nexport class DiagProgram {\n constructor(size) {\n this.variableNames = ['X'];\n this.outputShape = [size, size];\n this.userCode = `\n void main() {\n ivec2 coords = getOutputCoords();\n float val = coords[0] == coords[1] ? getX(coords[0]) : 0.0;\n setOutput(val);\n }\n `;\n }\n}\n//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZGlhZ19ncHUuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi90ZmpzLWJhY2tlbmQtd2ViZ2wvc3JjL2RpYWdfZ3B1LnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBOzs7Ozs7Ozs7Ozs7Ozs7R0FlRztBQUlILE1BQU0sT0FBTyxXQUFXO0lBS3RCLFlBQVksSUFBWTtRQUp4QixrQkFBYSxHQUFHLENBQUMsR0FBRyxDQUFDLENBQUM7UUFLcEIsSUFBSSxDQUFDLFdBQVcsR0FBRyxDQUFDLElBQUksRUFBRSxJQUFJLENBQUMsQ0FBQztRQUNoQyxJQUFJLENBQUMsUUFBUSxHQUFHOzs7Ozs7S0FNZixDQUFDO0lBQ0osQ0FBQztDQUNGIiwic291cmNlc0NvbnRlbnQiOlsiLyoqXG4gKiBAbGljZW5zZVxuICogQ29weXJpZ2h0IDIwMTkgR29vZ2xlIExMQy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC5cbiAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSBcIkxpY2Vuc2VcIik7XG4gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuXG4gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXRcbiAqXG4gKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjBcbiAqXG4gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlXG4gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiBcIkFTIElTXCIgQkFTSVMsXG4gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC5cbiAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmRcbiAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLlxuICogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbiAqL1xuXG5pbXBvcnQge0dQR1BVUHJvZ3JhbX0gZnJvbSAnLi9ncGdwdV9tYXRoJztcblxuZXhwb3J0IGNsYXNzIERpYWdQcm9ncmFtIGltcGxlbWVudHMgR1BHUFVQcm9ncmFtIHtcbiAgdmFyaWFibGVOYW1lcyA9IFsnWCddO1xuICBvdXRwdXRTaGFwZTogbnVtYmVyW107XG4gIHVzZXJDb2RlOiBzdHJpbmc7XG5cbiAgY29uc3RydWN0b3Ioc2l6ZTogbnVtYmVyKSB7XG4gICAgdGhpcy5vdXRwdXRTaGFwZSA9IFtzaXplLCBzaXplXTtcbiAgICB0aGlzLnVzZXJDb2RlID0gYFxuICAgICAgdm9pZCBtYWluKCkge1xuICAgICAgICAgIGl2ZWMyIGNvb3JkcyA9IGdldE91dHB1dENvb3JkcygpO1xuICAgICAgICAgIGZsb2F0IHZhbCA9IGNvb3Jkc1swXSA9PSBjb29yZHNbMV0gPyBnZXRYKGNvb3Jkc1swXSkgOiAwLjA7XG4gICAgICAgICAgc2V0T3V0cHV0KHZhbCk7XG4gICAgICB9XG4gICAgYDtcbiAgfVxufVxuIl19","/**\n * @license\n * Copyright 2020 Google LLC. All Rights Reserved.\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n * =============================================================================\n */\nimport { Diag, util } from '@tensorflow/tfjs-core';\nimport { DiagProgram } from '../diag_gpu';\nimport { reshape } from './Reshape';\nexport function diag(args) {\n const { inputs, backend } = args;\n const { x } = inputs;\n const outShape = [...x.shape, ...x.shape];\n const xSize = util.sizeFromShape(x.shape);\n const flat = reshape({ inputs: { x }, backend, attrs: { shape: [xSize] } });\n const program = new DiagProgram(xSize);\n const res = backend.runWebGLProgram(program, [flat], flat.dtype);\n const out = reshape({ inputs: { x: res }, backend, attrs: { shape: outShape } });\n backend.disposeIntermediateTensorInfo(flat);\n backend.disposeIntermediateTensorInfo(res);\n return out;\n}\nexport const diagConfig = {\n kernelName: Diag,\n backendName: 'webgl',\n kernelFunc: diag\n};\n//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiRGlhZy5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uLy4uL3RmanMtYmFja2VuZC13ZWJnbC9zcmMva2VybmVscy9EaWFnLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBOzs7Ozs7Ozs7Ozs7Ozs7R0FlRztBQUVILE9BQU8sRUFBQyxJQUFJLEVBQW9ELElBQUksRUFBQyxNQUFNLHVCQUF1QixDQUFDO0FBR25HLE9BQU8sRUFBQyxXQUFXLEVBQUMsTUFBTSxhQUFhLENBQUM7QUFDeEMsT0FBTyxFQUFDLE9BQU8sRUFBQyxNQUFNLFdBQVcsQ0FBQztBQUVsQyxNQUFNLFVBQVUsSUFBSSxDQUFDLElBQXFEO0lBRXhFLE1BQU0sRUFBQyxNQUFNLEVBQUUsT0FBTyxFQUFDLEdBQUcsSUFBSSxDQUFDO0lBQy9CLE1BQU0sRUFBQyxDQUFDLEVBQUMsR0FBRyxNQUFNLENBQUM7SUFFbkIsTUFBTSxRQUFRLEdBQUcsQ0FBQyxHQUFHLENBQUMsQ0FBQyxLQUFLLEVBQUUsR0FBRyxDQUFDLENBQUMsS0FBSyxDQUFDLENBQUM7SUFDMUMsTUFBTSxLQUFLLEdBQUcsSUFBSSxDQUFDLGFBQWEsQ0FBQyxDQUFDLENBQUMsS0FBSyxDQUFDLENBQUM7SUFFMUMsTUFBTSxJQUFJLEdBQUcsT0FBTyxDQUFDLEVBQUMsTUFBTSxFQUFFLEVBQUMsQ0FBQyxFQUFDLEVBQUUsT0FBTyxFQUFFLEtBQUssRUFBRSxFQUFDLEtBQUssRUFBRSxDQUFDLEtBQUssQ0FBQyxFQUFDLEVBQUMsQ0FBQyxDQUFDO0lBRXRFLE1BQU0sT0FBTyxHQUFHLElBQUksV0FBVyxDQUFDLEtBQUssQ0FBQyxDQUFDO0lBQ3ZDLE1BQU0sR0FBRyxHQUFHLE9BQU8sQ0FBQyxlQUFlLENBQUMsT0FBTyxFQUFFLENBQUMsSUFBSSxDQUFDLEVBQUUsSUFBSSxDQUFDLEtBQUssQ0FBQyxDQUFDO0lBRWpFLE1BQU0sR0FBRyxHQUFHLE9BQU8sQ0FBQyxFQUFDLE1BQU0sRUFBRSxFQUFDLENBQUMsRUFBRSxHQUFHLEVBQUMsRUFBRSxPQUFPLEVBQUUsS0FBSyxFQUFFLEVBQUMsS0FBSyxFQUFFLFFBQVEsRUFBQyxFQUFDLENBQUMsQ0FBQztJQUUzRSxPQUFPLENBQUMsNkJBQTZCLENBQUMsSUFBSSxDQUFDLENBQUM7SUFDNUMsT0FBTyxDQUFDLDZCQUE2QixDQUFDLEdBQUcsQ0FBQyxDQUFDO0lBRTNDLE9BQU8sR0FBRyxDQUFDO0FBQ2IsQ0FBQztBQUVELE1BQU0sQ0FBQyxNQUFNLFVBQVUsR0FBaUI7SUFDdEMsVUFBVSxFQUFFLElBQUk7SUFDaEIsV0FBVyxFQUFFLE9BQU87SUFDcEIsVUFBVSxFQUFFLElBQXdCO0NBQ3JDLENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyIvKipcbiAqIEBsaWNlbnNlXG4gKiBDb3B5cmlnaHQgMjAyMCBHb29nbGUgTExDLiBBbGwgUmlnaHRzIFJlc2VydmVkLlxuICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlIFwiTGljZW5zZVwiKTtcbiAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS5cbiAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdFxuICpcbiAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMFxuICpcbiAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmVcbiAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuIFwiQVMgSVNcIiBCQVNJUyxcbiAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLlxuICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZFxuICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuXG4gKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuICovXG5cbmltcG9ydCB7RGlhZywgRGlhZ0lucHV0cywgS2VybmVsQ29uZmlnLCBLZXJuZWxGdW5jLCBUZW5zb3JJbmZvLCB1dGlsfSBmcm9tICdAdGVuc29yZmxvdy90ZmpzLWNvcmUnO1xuXG5pbXBvcnQge01hdGhCYWNrZW5kV2ViR0x9IGZyb20gJy4uL2JhY2tlbmRfd2ViZ2wnO1xuaW1wb3J0IHtEaWFnUHJvZ3JhbX0gZnJvbSAnLi4vZGlhZ19ncHUnO1xuaW1wb3J0IHtyZXNoYXBlfSBmcm9tICcuL1Jlc2hhcGUnO1xuXG5leHBvcnQgZnVuY3Rpb24gZGlhZyhhcmdzOiB7aW5wdXRzOiBEaWFnSW5wdXRzLCBiYWNrZW5kOiBNYXRoQmFja2VuZFdlYkdMfSk6XG4gICAgVGVuc29ySW5mbyB7XG4gIGNvbnN0IHtpbnB1dHMsIGJhY2tlbmR9ID0gYXJncztcbiAgY29uc3Qge3h9ID0gaW5wdXRzO1xuXG4gIGNvbnN0IG91dFNoYXBlID0gWy4uLnguc2hhcGUsIC4uLnguc2hhcGVdO1xuICBjb25zdCB4U2l6ZSA9IHV0aWwuc2l6ZUZyb21TaGFwZSh4LnNoYXBlKTtcblxuICBjb25zdCBmbGF0ID0gcmVzaGFwZSh7aW5wdXRzOiB7eH0sIGJhY2tlbmQsIGF0dHJzOiB7c2hhcGU6IFt4U2l6ZV19fSk7XG5cbiAgY29uc3QgcHJvZ3JhbSA9IG5ldyBEaWFnUHJvZ3JhbSh4U2l6ZSk7XG4gIGNvbnN0IHJlcyA9IGJhY2tlbmQucnVuV2ViR0xQcm9ncmFtKHByb2dyYW0sIFtmbGF0XSwgZmxhdC5kdHlwZSk7XG5cbiAgY29uc3Qgb3V0ID0gcmVzaGFwZSh7aW5wdXRzOiB7eDogcmVzfSwgYmFja2VuZCwgYXR0cnM6IHtzaGFwZTogb3V0U2hhcGV9fSk7XG5cbiAgYmFja2VuZC5kaXNwb3NlSW50ZXJtZWRpYXRlVGVuc29ySW5mbyhmbGF0KTtcbiAgYmFja2VuZC5kaXNwb3NlSW50ZXJtZWRpYXRlVGVuc29ySW5mbyhyZXMpO1xuXG4gIHJldHVybiBvdXQ7XG59XG5cbmV4cG9ydCBjb25zdCBkaWFnQ29uZmlnOiBLZXJuZWxDb25maWcgPSB7XG4gIGtlcm5lbE5hbWU6IERpYWcsXG4gIGJhY2tlbmROYW1lOiAnd2ViZ2wnLFxuICBrZXJuZWxGdW5jOiBkaWFnIGFzIHt9IGFzIEtlcm5lbEZ1bmNcbn07XG4iXX0=","/**\n * @license\n * Copyright 2017 Google LLC. All Rights Reserved.\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n * =============================================================================\n */\nexport class Dilation2DProgram {\n constructor(convInfo) {\n this.variableNames = ['x', 'W'];\n this.outputShape = convInfo.outShape;\n const { inHeight, inWidth, padInfo, strideHeight, strideWidth, filterHeight, filterWidth, dilationHeight, dilationWidth } = convInfo;\n const { top: padTop, left: padLeft } = padInfo;\n this.userCode = `\n const ivec2 strides = ivec2(${strideHeight}, ${strideWidth});\n const ivec2 pads = ivec2(${padTop}, ${padLeft});\n const float neg_infinity = -3.4e38;\n\n void main() {\n ivec4 coords = getOutputCoords();\n int batch = coords.x;\n int d1 = coords.w;\n ivec2 outTopLeftCorner =\n coords.yz * strides - pads;\n int hBeg = outTopLeftCorner.x;\n int wBeg = outTopLeftCorner.y;\n\n float curVal = neg_infinity;\n for (int h = 0; h < ${filterHeight}; h++) {\n int hIn = hBeg + h * ${dilationHeight};\n\n if (hIn >= 0 && hIn < ${inHeight}) {\n for (int w = 0; w < ${filterWidth}; w++) {\n int wIn = wBeg + w * ${dilationWidth};\n\n if (wIn >= 0 && wIn < ${inWidth}) {\n float xVal = getX(batch, hIn, wIn, d1);\n float wVal = getW(h, w, d1);\n\n float val = xVal + wVal;\n if (val > curVal) {\n curVal = val;\n }\n }\n }\n }\n }\n\n float result = curVal;\n setOutput(result);\n }\n `;\n }\n}\n//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZGlsYXRpb25fZ3B1LmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vdGZqcy1iYWNrZW5kLXdlYmdsL3NyYy9kaWxhdGlvbl9ncHUudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUE7Ozs7Ozs7Ozs7Ozs7OztHQWVHO0FBS0gsTUFBTSxPQUFPLGlCQUFpQjtJQUs1QixZQUFZLFFBQWlDO1FBSjdDLGtCQUFhLEdBQUcsQ0FBQyxHQUFHLEVBQUUsR0FBRyxDQUFDLENBQUM7UUFLekIsSUFBSSxDQUFDLFdBQVcsR0FBRyxRQUFRLENBQUMsUUFBUSxDQUFDO1FBRXJDLE1BQU0sRUFDSixRQUFRLEVBQ1IsT0FBTyxFQUNQLE9BQU8sRUFDUCxZQUFZLEVBQ1osV0FBVyxFQUNYLFlBQVksRUFDWixXQUFXLEVBQ1gsY0FBYyxFQUNkLGFBQWEsRUFDZCxHQUFHLFFBQVEsQ0FBQztRQUViLE1BQU0sRUFBQyxHQUFHLEVBQUUsTUFBTSxFQUFFLElBQUksRUFBRSxPQUFPLEVBQUMsR0FBRyxPQUFPLENBQUM7UUFFN0MsSUFBSSxDQUFDLFFBQVEsR0FBRztvQ0FDZ0IsWUFBWSxLQUFLLFdBQVc7aUNBQy9CLE1BQU0sS0FBSyxPQUFPOzs7Ozs7Ozs7Ozs7OzhCQWFyQixZQUFZO2lDQUNULGNBQWM7O2tDQUViLFFBQVE7a0NBQ1IsV0FBVztxQ0FDUixhQUFhOztzQ0FFWixPQUFPOzs7Ozs7Ozs7Ozs7Ozs7O0tBZ0J4QyxDQUFDO0lBQ0osQ0FBQztDQUNGIiwic291cmNlc0NvbnRlbnQiOlsiLyoqXG4gKiBAbGljZW5zZVxuICogQ29weXJpZ2h0IDIwMTcgR29vZ2xlIExMQy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC5cbiAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSBcIkxpY2Vuc2VcIik7XG4gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuXG4gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXRcbiAqXG4gKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjBcbiAqXG4gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlXG4gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiBcIkFTIElTXCIgQkFTSVMsXG4gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC5cbiAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmRcbiAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLlxuICogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbiAqL1xuXG5pbXBvcnQge2JhY2tlbmRfdXRpbH0gZnJvbSAnQHRlbnNvcmZsb3cvdGZqcy1jb3JlJztcbmltcG9ydCB7R1BHUFVQcm9ncmFtfSBmcm9tICcuL2dwZ3B1X21hdGgnO1xuXG5leHBvcnQgY2xhc3MgRGlsYXRpb24yRFByb2dyYW0gaW1wbGVtZW50cyBHUEdQVVByb2dyYW0ge1xuICB2YXJpYWJsZU5hbWVzID0gWyd4JywgJ1cnXTtcbiAgb3V0cHV0U2hhcGU6IG51bWJlcltdO1xuICB1c2VyQ29kZTogc3RyaW5nO1xuXG4gIGNvbnN0cnVjdG9yKGNvbnZJbmZvOiBiYWNrZW5kX3V0aWwuQ29udjJESW5mbykge1xuICAgIHRoaXMub3V0cHV0U2hhcGUgPSBjb252SW5mby5vdXRTaGFwZTtcblxuICAgIGNvbnN0IHtcbiAgICAgIGluSGVpZ2h0LFxuICAgICAgaW5XaWR0aCxcbiAgICAgIHBhZEluZm8sXG4gICAgICBzdHJpZGVIZWlnaHQsXG4gICAgICBzdHJpZGVXaWR0aCxcbiAgICAgIGZpbHRlckhlaWdodCxcbiAgICAgIGZpbHRlcldpZHRoLFxuICAgICAgZGlsYXRpb25IZWlnaHQsXG4gICAgICBkaWxhdGlvbldpZHRoXG4gICAgfSA9IGNvbnZJbmZvO1xuXG4gICAgY29uc3Qge3RvcDogcGFkVG9wLCBsZWZ0OiBwYWRMZWZ0fSA9IHBhZEluZm87XG5cbiAgICB0aGlzLnVzZXJDb2RlID0gYFxuICAgICAgY29uc3QgaXZlYzIgc3RyaWRlcyA9IGl2ZWMyKCR7c3RyaWRlSGVpZ2h0fSwgJHtzdHJpZGVXaWR0aH0pO1xuICAgICAgY29uc3QgaXZlYzIgcGFkcyA9IGl2ZWMyKCR7cGFkVG9wfSwgJHtwYWRMZWZ0fSk7XG4gICAgICBjb25zdCBmbG9hdCBuZWdfaW5maW5pdHkgPSAtMy40ZTM4O1xuXG4gICAgICB2b2lkIG1haW4oKSB7XG4gICAgICAgIGl2ZWM0IGNvb3JkcyA9IGdldE91dHB1dENvb3JkcygpO1xuICAgICAgICBpbnQgYmF0Y2ggPSBjb29yZHMueDtcbiAgICAgICAgaW50IGQxID0gY29vcmRzLnc7XG4gICAgICAgIGl2ZWMyIG91dFRvcExlZnRDb3JuZXIgPVxuICAgICAgICAgICAgY29vcmRzLnl6ICogc3RyaWRlcyAtIHBhZHM7XG4gICAgICAgIGludCBoQmVnID0gb3V0VG9wTGVmdENvcm5lci54O1xuICAgICAgICBpbnQgd0JlZyA9IG91dFRvcExlZnRDb3JuZXIueTtcblxuICAgICAgICBmbG9hdCBjdXJWYWwgPSBuZWdfaW5maW5pdHk7XG4gICAgICAgIGZvciAoaW50IGggPSAwOyBoIDwgJHtmaWx0ZXJIZWlnaHR9OyBoKyspIHtcbiAgICAgICAgICBpbnQgaEluID0gaEJlZyArIGggKiAke2RpbGF0aW9uSGVpZ2h0fTtcblxuICAgICAgICAgIGlmIChoSW4gPj0gMCAmJiBoSW4gPCAke2luSGVpZ2h0fSkge1xuICAgICAgICAgICAgZm9yIChpbnQgdyA9IDA7IHcgPCAke2ZpbHRlcldpZHRofTsgdysrKSB7XG4gICAgICAgICAgICAgIGludCB3SW4gPSB3QmVnICsgdyAqICR7ZGlsYXRpb25XaWR0aH07XG5cbiAgICAgICAgICAgICAgaWYgKHdJbiA+PSAwICYmIHdJbiA8ICR7aW5XaWR0aH0pIHtcbiAgICAgICAgICAgICAgICBmbG9hdCB4VmFsID0gZ2V0WChiYXRjaCwgaEluLCB3SW4sIGQxKTtcbiAgICAgICAgICAgICAgICBmbG9hdCB3VmFsID0gZ2V0VyhoLCB3LCBkMSk7XG5cbiAgICAgICAgICAgICAgICBmbG9hdCB2YWwgPSB4VmFsICsgd1ZhbDtcbiAgICAgICAgICAgICAgICBpZiAodmFsID4gY3VyVmFsKSB7XG4gICAgICAgICAgICAgICAgICBjdXJWYWwgPSB2YWw7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgICAgfVxuICAgICAgICB9XG5cbiAgICAgICAgZmxvYXQgcmVzdWx0ID0gY3VyVmFsO1xuICAgICAgICBzZXRPdXRwdXQocmVzdWx0KTtcbiAgICAgIH1cbiAgICBgO1xuICB9XG59XG4iXX0=","/**\n * @license\n * Copyright 2020 Google LLC. All Rights Reserved.\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n * =============================================================================\n */\nimport { backend_util, Dilation2D } from '@tensorflow/tfjs-core';\nimport { Dilation2DProgram } from '../dilation_gpu';\nimport { reshape } from './Reshape';\nexport function dilation2D(args) {\n const { inputs, backend, attrs } = args;\n const { x, filter } = inputs;\n const { strides, pad, dilations } = attrs;\n const convInfo = backend_util.computeDilation2DInfo(x.shape, filter.shape, strides, pad, 'NHWC' /* dataFormat */, dilations);\n let out;\n const program = new Dilation2DProgram(convInfo);\n out = backend.runWebGLProgram(program, [x, filter], 'float32');\n const outReshaped = reshape({ inputs: { x: out }, backend, attrs: { shape: convInfo.outShape } });\n backend.disposeIntermediateTensorInfo(out);\n return outReshaped;\n}\nexport const dilation2DConfig = {\n kernelName: Dilation2D,\n backendName: 'webgl',\n kernelFunc: dilation2D,\n};\n//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiRGlsYXRpb24yRC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uLy4uL3RmanMtYmFja2VuZC13ZWJnbC9zcmMva2VybmVscy9EaWxhdGlvbjJELnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBOzs7Ozs7Ozs7Ozs7Ozs7R0FlRztBQUVILE9BQU8sRUFBQyxZQUFZLEVBQUUsVUFBVSxFQUEwRSxNQUFNLHVCQUF1QixDQUFDO0FBR3hJLE9BQU8sRUFBQyxpQkFBaUIsRUFBQyxNQUFNLGlCQUFpQixDQUFDO0FBQ2xELE9BQU8sRUFBQyxPQUFPLEVBQUMsTUFBTSxXQUFXLENBQUM7QUFFbEMsTUFBTSxVQUFVLFVBQVUsQ0FBQyxJQUkxQjtJQUNDLE1BQU0sRUFBQyxNQUFNLEVBQUUsT0FBTyxFQUFFLEtBQUssRUFBQyxHQUFHLElBQUksQ0FBQztJQUN0QyxNQUFNLEVBQUMsQ0FBQyxFQUFFLE1BQU0sRUFBQyxHQUFHLE1BQU0sQ0FBQztJQUMzQixNQUFNLEVBQUMsT0FBTyxFQUFFLEdBQUcsRUFBRSxTQUFTLEVBQUMsR0FBRyxLQUFLLENBQUM7SUFFeEMsTUFBTSxRQUFRLEdBQUcsWUFBWSxDQUFDLHFCQUFxQixDQUMvQyxDQUFDLENBQUMsS0FBeUMsRUFDM0MsTUFBTSxDQUFDLEtBQWlDLEVBQUUsT0FBTyxFQUFFLEdBQUcsRUFDdEQsTUFBTSxDQUFDLGdCQUFnQixFQUFFLFNBQVMsQ0FBQyxDQUFDO0lBQ3hDLElBQUksR0FBZSxDQUFDO0lBRXBCLE1BQU0sT0FBTyxHQUFHLElBQUksaUJBQWlCLENBQUMsUUFBUSxDQUFDLENBQUM7SUFDaEQsR0FBRyxHQUFHLE9BQU8sQ0FBQyxlQUFlLENBQUMsT0FBTyxFQUFFLENBQUMsQ0FBQyxFQUFFLE1BQU0sQ0FBQyxFQUFFLFNBQVMsQ0FBQyxDQUFDO0lBRS9ELE1BQU0sV0FBVyxHQUNiLE9BQU8sQ0FBQyxFQUFDLE1BQU0sRUFBRSxFQUFDLENBQUMsRUFBRSxHQUFHLEVBQUMsRUFBRSxPQUFPLEVBQUUsS0FBSyxFQUFFLEVBQUMsS0FBSyxFQUFFLFFBQVEsQ0FBQyxRQUFRLEVBQUMsRUFBQyxDQUFDLENBQUM7SUFDNUUsT0FBTyxDQUFDLDZCQUE2QixDQUFDLEdBQUcsQ0FBQyxDQUFDO0lBRTNDLE9BQU8sV0FBVyxDQUFDO0FBQ3JCLENBQUM7QUFFRCxNQUFNLENBQUMsTUFBTSxnQkFBZ0IsR0FBaUI7SUFDNUMsVUFBVSxFQUFFLFVBQVU7SUFDdEIsV0FBVyxFQUFFLE9BQU87SUFDcEIsVUFBVSxFQUFFLFVBQThCO0NBQzNDLENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyIvKipcbiAqIEBsaWNlbnNlXG4gKiBDb3B5cmlnaHQgMjAyMCBHb29nbGUgTExDLiBBbGwgUmlnaHRzIFJlc2VydmVkLlxuICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlIFwiTGljZW5zZVwiKTtcbiAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS5cbiAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdFxuICpcbiAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMFxuICpcbiAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmVcbiAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuIFwiQVMgSVNcIiBCQVNJUyxcbiAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLlxuICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZFxuICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuXG4gKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuICovXG5cbmltcG9ydCB7YmFja2VuZF91dGlsLCBEaWxhdGlvbjJELCBEaWxhdGlvbjJEQXR0cnMsIERpbGF0aW9uMkRJbnB1dHMsIEtlcm5lbENvbmZpZywgS2VybmVsRnVuYywgVGVuc29ySW5mb30gZnJvbSAnQHRlbnNvcmZsb3cvdGZqcy1jb3JlJztcblxuaW1wb3J0IHtNYXRoQmFja2VuZFdlYkdMfSBmcm9tICcuLi9iYWNrZW5kX3dlYmdsJztcbmltcG9ydCB7RGlsYXRpb24yRFByb2dyYW19IGZyb20gJy4uL2RpbGF0aW9uX2dwdSc7XG5pbXBvcnQge3Jlc2hhcGV9IGZyb20gJy4vUmVzaGFwZSc7XG5cbmV4cG9ydCBmdW5jdGlvbiBkaWxhdGlvbjJEKGFyZ3M6IHtcbiAgaW5wdXRzOiBEaWxhdGlvbjJESW5wdXRzLFxuICBhdHRyczogRGlsYXRpb24yREF0dHJzLFxuICBiYWNrZW5kOiBNYXRoQmFja2VuZFdlYkdMXG59KSB7XG4gIGNvbnN0IHtpbnB1dHMsIGJhY2tlbmQsIGF0dHJzfSA9IGFyZ3M7XG4gIGNvbnN0IHt4LCBmaWx0ZXJ9ID0gaW5wdXRzO1xuICBjb25zdCB7c3RyaWRlcywgcGFkLCBkaWxhdGlvbnN9ID0gYXR0cnM7XG5cbiAgY29uc3QgY29udkluZm8gPSBiYWNrZW5kX3V0aWwuY29tcHV0ZURpbGF0aW9uMkRJbmZvKFxuICAgICAgeC5zaGFwZSBhcyBbbnVtYmVyLCBudW1iZXIsIG51bWJlciwgbnVtYmVyXSxcbiAgICAgIGZpbHRlci5zaGFwZSBhcyBbbnVtYmVyLCBudW1iZXIsIG51bWJlcl0sIHN0cmlkZXMsIHBhZCxcbiAgICAgICdOSFdDJyAvKiBkYXRhRm9ybWF0ICovLCBkaWxhdGlvbnMpO1xuICBsZXQgb3V0OiBUZW5zb3JJbmZvO1xuXG4gIGNvbnN0IHByb2dyYW0gPSBuZXcgRGlsYXRpb24yRFByb2dyYW0oY29udkluZm8pO1xuICBvdXQgPSBiYWNrZW5kLnJ1bldlYkdMUHJvZ3JhbShwcm9ncmFtLCBbeCwgZmlsdGVyXSwgJ2Zsb2F0MzInKTtcblxuICBjb25zdCBvdXRSZXNoYXBlZCA9XG4gICAgICByZXNoYXBlKHtpbnB1dHM6IHt4OiBvdXR9LCBiYWNrZW5kLCBhdHRyczoge3NoYXBlOiBjb252SW5mby5vdXRTaGFwZX19KTtcbiAgYmFja2VuZC5kaXNwb3NlSW50ZXJtZWRpYXRlVGVuc29ySW5mbyhvdXQpO1xuXG4gIHJldHVybiBvdXRSZXNoYXBlZDtcbn1cblxuZXhwb3J0IGNvbnN0IGRpbGF0aW9uMkRDb25maWc6IEtlcm5lbENvbmZpZyA9IHtcbiAga2VybmVsTmFtZTogRGlsYXRpb24yRCxcbiAgYmFja2VuZE5hbWU6ICd3ZWJnbCcsXG4gIGtlcm5lbEZ1bmM6IGRpbGF0aW9uMkQgYXMge30gYXMgS2VybmVsRnVuYyxcbn07XG4iXX0=","/**\n * @license\n * Copyright 2021 Google LLC. All Rights Reserved.\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n * =============================================================================\n */\nimport { backend_util, Einsum, util } from '@tensorflow/tfjs-core';\nimport { multiply } from './Multiply';\nimport { reshape } from './Reshape';\nimport { sum } from './Sum';\nimport { transpose } from './Transpose';\nexport function einsum(args) {\n const { inputs, backend, attrs } = args;\n const { equation } = attrs;\n const tensors = inputs;\n const { allDims, summedDims, idDims } = backend_util.decodeEinsumEquation(equation, tensors.length);\n backend_util.checkEinsumDimSizes(allDims.length, idDims, tensors);\n const { path, steps } = backend_util.getEinsumComputePath(summedDims, idDims);\n const nSteps = steps.length;\n let out = null;\n let numDimsRemaining = allDims.length;\n const tensorsToDispose = [];\n for (let i = 0; i < nSteps; ++i) {\n for (const idTerm of steps[i]) {\n const { permutationIndices: perm, expandDims: dimsToExpand } = backend_util.getEinsumPermutation(numDimsRemaining, idDims[idTerm]);\n let x;\n if (backend_util.isIdentityPermutation(perm)) {\n x = tensors[idTerm];\n }\n else {\n x = transpose({ inputs: { x: tensors[idTerm] }, backend, attrs: { perm } });\n tensorsToDispose.push(x);\n }\n const targetShape = x.shape.slice();\n for (let k = 0; k < dimsToExpand.length; ++k) {\n targetShape.splice(dimsToExpand[k], 0, 1);\n }\n if (!util.arraysEqual(x.shape, targetShape)) {\n x = reshape({ inputs: { x }, backend, attrs: { shape: targetShape } });\n tensorsToDispose.push(x);\n }\n if (out === null) {\n out = x;\n }\n else {\n // tslint:disable-next-line: no-unnecessary-type-assertion\n out = multiply({ inputs: { a: x, b: out }, backend });\n tensorsToDispose.push(out);\n }\n }\n if (i < nSteps - 1) {\n if (path[i] >= 0) {\n out = sum({\n inputs: { x: out },\n backend,\n attrs: {\n axis: path[i] - (allDims.length - numDimsRemaining),\n keepDims: false\n }\n });\n tensorsToDispose.push(out);\n }\n numDimsRemaining--;\n }\n }\n // Clean up intermediate tensors.\n for (const tensorInfo of tensorsToDispose) {\n if (tensorInfo === out) {\n continue;\n }\n backend.disposeIntermediateTensorInfo(tensorInfo);\n }\n return out;\n}\nexport const einsumConfig = {\n kernelName: Einsum,\n backendName: 'webgl',\n kernelFunc: einsum\n};\n//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiRWluc3VtLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vLi4vdGZqcy1iYWNrZW5kLXdlYmdsL3NyYy9rZXJuZWxzL0VpbnN1bS50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQTs7Ozs7Ozs7Ozs7Ozs7O0dBZUc7QUFFSCxPQUFPLEVBQUMsWUFBWSxFQUFFLE1BQU0sRUFBMkUsSUFBSSxFQUFDLE1BQU0sdUJBQXVCLENBQUM7QUFJMUksT0FBTyxFQUFDLFFBQVEsRUFBQyxNQUFNLFlBQVksQ0FBQztBQUNwQyxPQUFPLEVBQUMsT0FBTyxFQUFDLE1BQU0sV0FBVyxDQUFDO0FBQ2xDLE9BQU8sRUFBQyxHQUFHLEVBQUMsTUFBTSxPQUFPLENBQUM7QUFDMUIsT0FBTyxFQUFDLFNBQVMsRUFBQyxNQUFNLGFBQWEsQ0FBQztBQUV0QyxNQUFNLFVBQVUsTUFBTSxDQUNsQixJQUN5RTtJQUUzRSxNQUFNLEVBQUMsTUFBTSxFQUFFLE9BQU8sRUFBRSxLQUFLLEVBQUMsR0FBRyxJQUFJLENBQUM7SUFDdEMsTUFBTSxFQUFDLFFBQVEsRUFBQyxHQUFHLEtBQUssQ0FBQztJQUN6QixNQUFNLE9BQU8sR0FBRyxNQUFrQixDQUFDO0lBRW5DLE1BQU0sRUFBQyxPQUFPLEVBQUUsVUFBVSxFQUFFLE1BQU0sRUFBQyxHQUMvQixZQUFZLENBQUMsb0JBQW9CLENBQUMsUUFBUSxFQUFFLE9BQU8sQ0FBQyxNQUFNLENBQUMsQ0FBQztJQUNoRSxZQUFZLENBQUMsbUJBQW1CLENBQUMsT0FBTyxDQUFDLE1BQU0sRUFBRSxNQUFNLEVBQUUsT0FBTyxDQUFDLENBQUM7SUFDbEUsTUFBTSxFQUFDLElBQUksRUFBRSxLQUFLLEVBQUMsR0FBRyxZQUFZLENBQUMsb0JBQW9CLENBQUMsVUFBVSxFQUFFLE1BQU0sQ0FBQyxDQUFDO0lBRTVFLE1BQU0sTUFBTSxHQUFHLEtBQUssQ0FBQyxNQUFNLENBQUM7SUFDNUIsSUFBSSxHQUFHLEdBQW9CLElBQUks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QVUsS0FBSyxHQUFHLEVBQUU7WUFDdEIsU0FBUztTQUNWO1FBQ0QsT0FBTyxDQUFDLDZCQUE2QixDQUFDLFVBQVUsQ0FBQyxDQUFDO0tBQ25EO0lBRUQsT0FBTyxHQUFHLENBQUM7QUFDYixDQUFDO0FBRUQsTUFBTSxDQUFDLE1BQU0sWUFBWSxHQUFpQjtJQUN4QyxVQUFVLEVBQUUsTUFBTTtJQUNsQixXQUFXLEVBQUUsT0FBTztJQUNwQixVQUFVLEVBQUUsTUFBMEI7Q0FDdkMsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbIi8qKlxuICogQGxpY2Vuc2VcbiAqIENvcHlyaWdodCAyMDIxIEdvb2dsZSBMTEMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuXG4gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgXCJMaWNlbnNlXCIpO1xuICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLlxuICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0XG4gKlxuICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wXG4gKlxuICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZVxuICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gXCJBUyBJU1wiIEJBU0lTLFxuICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuXG4gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kXG4gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS5cbiAqID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4gKi9cblxuaW1wb3J0IHtiYWNrZW5kX3V0aWwsIEVpbnN1bSwgRWluc3VtQXR0cnMsIEVpbnN1bUlucHV0cywgS2VybmVsQ29uZmlnLCBLZXJuZWxGdW5jLCBUZW5zb3IsIFRlbnNvckluZm8sIHV0aWx9IGZyb20gJ0B0ZW5zb3JmbG93L3RmanMtY29yZSc7XG5cbmltcG9ydCB7TWF0aEJhY2tlbmRXZWJHTH0gZnJvbSAnLi4vYmFja2VuZF93ZWJnbCc7XG5cbmltcG9ydCB7bXVsdGlwbHl9IGZyb20gJy4vTXVsdGlwbHknO1xuaW1wb3J0IHtyZXNoYXBlfSBmcm9tICcuL1Jlc2hhcGUnO1xuaW1wb3J0IHtzdW19IGZyb20gJy4vU3VtJztcbmltcG9ydCB7dHJhbnNwb3NlfSBmcm9tICcuL1RyYW5zcG9zZSc7XG5cbmV4cG9ydCBmdW5jdGlvbiBlaW5zdW0oXG4gICAgYXJnczpcbiAgICAgICAge2lucHV0czogRWluc3VtSW5wdXRzLCBiYWNrZW5kOiBNYXRoQmFja2VuZFdlYkdMLCBhdHRyczogRWluc3VtQXR0cnN9KTpcbiAgICBUZW5zb3JJbmZvIHtcbiAgY29uc3Qge2lucHV0cywgYmFja2VuZCwgYXR0cnN9ID0gYXJncztcbiAgY29uc3Qge2VxdWF0aW9ufSA9IGF0dHJzO1xuICBjb25zdCB0ZW5zb3JzID0gaW5wdXRzIGFzIFRlbnNvcltdO1xuXG4gIGNvbnN0IHthbGxEaW1zLCBzdW1tZWREaW1zLCBpZERpbXN9ID1cbiAgICAgIGJhY2tlbmRfdXRpbC5kZWNvZGVFaW5zdW1FcXVhdGlvbihlcXVhdGlvbiwgdGVuc29ycy5sZW5ndGgpO1xuICBiYWNrZW5kX3V0aWwuY2hlY2tFaW5zdW1EaW1TaXplcyhhbGxEaW1zLmxlbmd0aCwgaWREaW1zLCB0ZW5zb3JzKTtcbiAgY29uc3Qge3BhdGgsIHN0ZXBzfSA9IGJhY2tlbmRfdXRpbC5nZXRFaW5zdW1Db21wdXRlUGF0aChzdW1tZWREaW1zLCBpZERpbXMpO1xuXG4gIGNvbnN0IG5TdGVwcyA9IHN0ZXBzLmxlbmd0aDtcbiAgbGV0IG91dDogVGVuc29ySW5mb3xudWxsID0gbnVsbDtcbiAgbGV0IG51bURpbXNSZW1haW5pbmcgPSBhbGxEaW1zLmxlbmd0aDtcbiAgY29uc3QgdGVuc29yc1RvRGlzcG9zZTogVGVuc29ySW5mb1tdID0gW107XG4gIGZvciAobGV0IGkgPSAwOyBpIDwgblN0ZXBzOyArK2kpIHtcbiAgICBmb3IgKGNvbnN0IGlkVGVybSBvZiBzdGVwc1tpXSkge1xuICAgICAgY29uc3Qge3Blcm11dGF0aW9uSW5kaWNlczogcGVybSwgZXhwYW5kRGltczogZGltc1RvRXhwYW5kfSA9XG4gICAgICAgICAgYmFja2VuZF91dGlsLmdldEVpbnN1bVBlcm11dGF0aW9uKG51bURpbXNSZW1haW5pbmcsIGlkRGltc1tpZFRlcm1dKTtcbiAgICAgIGxldCB4OiBUZW5zb3JJbmZvO1xuICAgICAgaWYgKGJhY2tlbmRfdXRpbC5pc0lkZW50aXR5UGVybXV0YXRpb24ocGVybSkpIHtcbiAgICAgICAgeCA9IHRlbnNvcnNbaWRUZXJtXTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHggPSB0cmFuc3Bvc2Uoe2lucHV0czoge3g6IHRlbnNvcnNbaWRUZXJtXX0sIGJhY2tlbmQsIGF0dHJzOiB7cGVybX19KTtcbiAgICAgICAgdGVuc29yc1RvRGlzcG9zZS5wdXNoKHgpO1xuICAgICAgfVxuICAgICAgY29uc3QgdGFyZ2V0U2hhcGU6IG51bWJlcltdID0geC5zaGFwZS5zbGljZSgpO1xuICAgICAgZm9yIChsZXQgayA9IDA7IGsgPCBkaW1zVG9FeHBhbmQubGVuZ3RoOyArK2spIHtcbiAgICAgICAgdGFyZ2V0U2hhcGUuc3BsaWNlKGRpbXNUb0V4cGFuZFtrXSwgMCwgMSk7XG4gICAgICB9XG5cbiAgICAgIGlmICghdXRpbC5hcnJheXNFcXVhbCh4LnNoYXBlLCB0YXJnZXRTaGFwZSkpIHtcbiAgICAgICAgeCA9IHJlc2hhcGUoe2lucHV0czoge3h9LCBiYWNrZW5kLCBhdHRyczoge3NoYXBlOiB0YXJnZXRTaGFwZX19KTtcbiAgICAgICAgdGVuc29yc1RvRGlzcG9zZS5wdXNoKHgpO1xuICAgICAgfVxuICAgICAgaWYgKG91dCA9PT0gbnVsbCkge1xuICAgICAgICBvdXQgPSB4O1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgLy8gdHNsaW50OmRpc2FibGUtbmV4dC1saW5lOiBuby11bm5lY2Vzc2FyeS10eXBlLWFzc2VydGlvblxuICAgICAgICBvdXQgPSBtdWx0aXBseSh7aW5wdXRzOiB7YTogeCwgYjogb3V0fSwgYmFja2VuZH0pIGFzIFRlbnNvckluZm87XG4gICAgICAgIHRlbnNvcnNUb0Rpc3Bvc2UucHVzaChvdXQpO1xuICAgICAgfVxuICAgIH1cbiAgICBpZiAoaSA8IG5TdGVwcyAtIDEpIHtcbiAgICAgIGlmIChwYXRoW2ldID49IDApIHtcbiAgICAgICAgb3V0ID0gc3VtKHtcbiAgICAgICAgICBpbnB1dHM6IHt4OiBvdXR9LFxuICAgICAgICAgIGJhY2tlbmQsXG4gICAgICAgICAgYXR0cnM6IHtcbiAgICAgICAgICAgIGF4aXM6IHBhdGhbaV0gLSAoYWxsRGltcy5sZW5ndGggLSBudW1EaW1zUmVtYWluaW5nKSxcbiAgICAgICAgICAgIGtlZXBEaW1zOiBmYWxzZVxuICAgICAgICAgIH1cbiAgICAgICAgfSk7XG4gICAgICAgIHRlbnNvcnNUb0Rpc3Bvc2UucHVzaChvdXQpO1xuICAgICAgfVxuICAgICAgbnVtRGltc1JlbWFpbmluZy0tO1xuICAgIH1cbiAgfVxuXG4gIC8vIENsZWFuIHVwIGludGVybWVkaWF0ZSB0ZW5zb3JzLlxuICBmb3IgKGNvbnN0IHRlbnNvckluZm8gb2YgdGVuc29yc1RvRGlzcG9zZSkge1xuICAgIGlmICh0ZW5zb3JJbmZvID09PSBvdXQpIHtcbiAgICAgIGNvbnRpbnVlO1xuICAgIH1cbiAgICBiYWNrZW5kLmRpc3Bvc2VJbnRlcm1lZGlhdGVUZW5zb3JJbmZvKHRlbnNvckluZm8pO1xuICB9XG5cbiAgcmV0dXJuIG91dDtcbn1cblxuZXhwb3J0IGNvbnN0IGVpbnN1bUNvbmZpZzogS2VybmVsQ29uZmlnID0ge1xuICBrZXJuZWxOYW1lOiBFaW5zdW0sXG4gIGJhY2tlbmROYW1lOiAnd2ViZ2wnLFxuICBrZXJuZWxGdW5jOiBlaW5zdW0gYXMge30gYXMgS2VybmVsRnVuY1xufTtcbiJdfQ==","/**\n * @license\n * Copyright 2020 Google LLC. All Rights Reserved.\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n * =============================================================================\n */\nimport { Elu } from '@tensorflow/tfjs-core';\nimport { unaryKernelFunc } from '../kernel_utils/kernel_funcs_utils';\nconst ELU = `return (x >= 0.0) ? x : (exp(x) - 1.0);`;\nconst ELU_PACKED = `\n vec4 result;\n\n result.r = (x.r >= 0.0) ? x.r : (exp(x.r) - 1.0);\n result.g = (x.g >= 0.0) ? x.g : (exp(x.g) - 1.0);\n result.b = (x.b >= 0.0) ? x.b : (exp(x.b) - 1.0);\n result.a = (x.a >= 0.0) ? x.a : (exp(x.a) - 1.0);\n\n return result;\n`;\nconst elu = unaryKernelFunc({ opSnippet: ELU, packedOpSnippet: ELU_PACKED });\nexport const eluConfig = {\n kernelName: Elu,\n backendName: 'webgl',\n kernelFunc: elu\n};\n//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiRWx1LmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vLi4vdGZqcy1iYWNrZW5kLXdlYmdsL3NyYy9rZXJuZWxzL0VsdS50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQTs7Ozs7Ozs7Ozs7Ozs7O0dBZUc7QUFFSCxPQUFPLEVBQUMsR0FBRyxFQUEyQixNQUFNLHVCQUF1QixDQUFDO0FBQ3BFLE9BQU8sRUFBQyxlQUFlLEVBQUMsTUFBTSxvQ0FBb0MsQ0FBQztBQUVuRSxNQUFNLEdBQUcsR0FBRyx5Q0FBeUMsQ0FBQztBQUV0RCxNQUFNLFVBQVUsR0FBRzs7Ozs7Ozs7O0NBU2xCLENBQUM7QUFFRixNQUFNLEdBQUcsR0FBRyxlQUFlLENBQUMsRUFBQyxTQUFTLEVBQUUsR0FBRyxFQUFFLGVBQWUsRUFBRSxVQUFVLEVBQUMsQ0FBQyxDQUFDO0FBRTNFLE1BQU0sQ0FBQyxNQUFNLFNBQVMsR0FBaUI7SUFDckMsVUFBVSxFQUFFLEdBQUc7SUFDZixXQUFXLEVBQUUsT0FBTztJQUNwQixVQUFVLEVBQUUsR0FBdUI7Q0FDcEMsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbIi8qKlxuICogQGxpY2Vuc2VcbiAqIENvcHlyaWdodCAyMDIwIEdvb2dsZSBMTEMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuXG4gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgXCJMaWNlbnNlXCIpO1xuICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLlxuICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0XG4gKlxuICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wXG4gKlxuICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZVxuICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gXCJBUyBJU1wiIEJBU0lTLFxuICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuXG4gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kXG4gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS5cbiAqID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4gKi9cblxuaW1wb3J0IHtFbHUsIEtlcm5lbENvbmZpZywgS2VybmVsRnVuY30gZnJvbSAnQHRlbnNvcmZsb3cvdGZqcy1jb3JlJztcbmltcG9ydCB7dW5hcnlLZXJuZWxGdW5jfSBmcm9tICcuLi9rZXJuZWxfdXRpbHMva2VybmVsX2Z1bmNzX3V0aWxzJztcblxuY29uc3QgRUxVID0gYHJldHVybiAoeCA+PSAwLjApID8geCA6IChleHAoeCkgLSAxLjApO2A7XG5cbmNvbnN0IEVMVV9QQUNLRUQgPSBgXG4gIHZlYzQgcmVzdWx0O1xuXG4gIHJlc3VsdC5yID0gKHguciA+PSAwLjApID8geC5yIDogKGV4cCh4LnIpIC0gMS4wKTtcbiAgcmVzdWx0LmcgPSAoeC5nID49IDAuMCkgPyB4LmcgOiAoZXhwKHguZykgLSAxLjApO1xuICByZXN1bHQuYiA9ICh4LmIgPj0gMC4wKSA/IHguYiA6IChleHAoeC5iKSAtIDEuMCk7XG4gIHJlc3VsdC5hID0gKHguYSA+PSAwLjApID8geC5hIDogKGV4cCh4LmEpIC0gMS4wKTtcblxuICByZXR1cm4gcmVzdWx0O1xuYDtcblxuY29uc3QgZWx1ID0gdW5hcnlLZXJuZWxGdW5jKHtvcFNuaXBwZXQ6IEVMVSwgcGFja2VkT3BTbmlwcGV0OiBFTFVfUEFDS0VEfSk7XG5cbmV4cG9ydCBjb25zdCBlbHVDb25maWc6IEtlcm5lbENvbmZpZyA9IHtcbiAga2VybmVsTmFtZTogRWx1LFxuICBiYWNrZW5kTmFtZTogJ3dlYmdsJyxcbiAga2VybmVsRnVuYzogZWx1IGFzIHt9IGFzIEtlcm5lbEZ1bmNcbn07XG4iXX0=","/**\n * @license\n * Copyright 2020 Google LLC. All Rights Reserved.\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n * =============================================================================\n */\nimport { EluGrad, env } from '@tensorflow/tfjs-core';\nimport { BinaryOpProgram } from '../binaryop_gpu';\nimport { BinaryOpPackedProgram } from '../binaryop_packed_gpu';\nconst ELU_DER = `return (b >= 1.0) ? a : a * (b + 1.0);`;\nconst ELU_DER_PACKED = `\n vec4 bGTEZero = vec4(greaterThanEqual(b, vec4(0.)));\n return (bGTEZero * a) + ((vec4(1.0) - bGTEZero) * (a * (b + vec4(1.0))));\n`;\nexport const eluGrad = (args) => {\n const { inputs, backend } = args;\n const { dy, y } = inputs;\n const program = env().getBool('WEBGL_PACK_BINARY_OPERATIONS') ?\n new BinaryOpPackedProgram(ELU_DER_PACKED, dy.shape, y.shape) :\n new BinaryOpProgram(ELU_DER, dy.shape, y.shape);\n return backend.runWebGLProgram(program, [dy, y], dy.dtype);\n};\nexport const eluGradConfig = {\n kernelName: EluGrad,\n backendName: 'webgl',\n kernelFunc: eluGrad\n};\n//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiRWx1R3JhZC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uLy4uL3RmanMtYmFja2VuZC13ZWJnbC9zcmMva2VybmVscy9FbHVHcmFkLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBOzs7Ozs7Ozs7Ozs7Ozs7R0FlRztBQUVILE9BQU8sRUFBQyxPQUFPLEVBQWlCLEdBQUcsRUFBdUMsTUFBTSx1QkFBdUIsQ0FBQztBQUd4RyxPQUFPLEVBQUMsZUFBZSxFQUFDLE1BQU0saUJBQWlCLENBQUM7QUFDaEQsT0FBTyxFQUFDLHFCQUFxQixFQUFDLE1BQU0sd0JBQXdCLENBQUM7QUFFN0QsTUFBTSxPQUFPLEdBQUcsd0NBQXdDLENBQUM7QUFDekQsTUFBTSxjQUFjLEdBQUc7OztDQUd0QixDQUFDO0FBRUYsTUFBTSxDQUFDLE1BQU0sT0FBTyxHQUNoQixDQUFDLElBQXdELEVBQWMsRUFBRTtJQUN2RSxNQUFNLEVBQUMsTUFBTSxFQUFFLE9BQU8sRUFBQyxHQUFHLElBQUksQ0FBQztJQUMvQixNQUFNLEVBQUMsRUFBRSxFQUFFLENBQUMsRUFBQyxHQUFHLE1BQU0sQ0FBQztJQUV2QixNQUFNLE9BQU8sR0FBRyxHQUFHLEVBQUUsQ0FBQyxPQUFPLENBQUMsOEJBQThCLENBQUMsQ0FBQyxDQUFDO1FBQzNELElBQUkscUJBQXFCLENBQUMsY0FBYyxFQUFFLEVBQUUsQ0FBQyxLQUFLLEVBQUUsQ0FBQyxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUM7UUFDOUQsSUFBSSxlQUFlLENBQUMsT0FBTyxFQUFFLEVBQUUsQ0FBQyxLQUFLLEVBQUUsQ0FBQyxDQUFDLEtBQUssQ0FBQyxDQUFDO0lBQ3BELE9BQU8sT0FBTyxDQUFDLGVBQWUsQ0FBQyxPQUFPLEVBQUUsQ0FBQyxFQUFFLEVBQUUsQ0FBQyxDQUFDLEVBQUUsRUFBRSxDQUFDLEtBQUssQ0FBQyxDQUFDO0FBQzdELENBQUMsQ0FBQztBQUVOLE1BQU0sQ0FBQyxNQUFNLGFBQWEsR0FBaUI7SUFDekMsVUFBVSxFQUFFLE9BQU87SUFDbkIsV0FBVyxFQUFFLE9BQU87SUFDcEIsVUFBVSxFQUFFLE9BQTJCO0NBQ3hDLENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyIvKipcbiAqIEBsaWNlbnNlXG4gKiBDb3B5cmlnaHQgMjAyMCBHb29nbGUgTExDLiBBbGwgUmlnaHRzIFJlc2VydmVkLlxuICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlIFwiTGljZW5zZVwiKTtcbiAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS5cbiAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdFxuICpcbiAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMFxuICpcbiAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmVcbiAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuIFwiQVMgSVNcIiBCQVNJUyxcbiAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLlxuICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZFxuICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuXG4gKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuICovXG5cbmltcG9ydCB7RWx1R3JhZCwgRWx1R3JhZElucHV0cywgZW52LCBLZXJuZWxDb25maWcsIEtlcm5lbEZ1bmMsIFRlbnNvckluZm99IGZyb20gJ0B0ZW5zb3JmbG93L3RmanMtY29yZSc7XG5cbmltcG9ydCB7TWF0aEJhY2tlbmRXZWJHTH0gZnJvbSAnLi4vYmFja2VuZF93ZWJnbCc7XG5pbXBvcnQge0JpbmFyeU9wUHJvZ3JhbX0gZnJvbSAnLi4vYmluYXJ5b3BfZ3B1JztcbmltcG9ydCB7QmluYXJ5T3BQYWNrZWRQcm9ncmFtfSBmcm9tICcuLi9iaW5hcnlvcF9wYWNrZWRfZ3B1JztcblxuY29uc3QgRUxVX0RFUiA9IGByZXR1cm4gKGIgPj0gMS4wKSA/IGEgOiBhICogKGIgKyAxLjApO2A7XG5jb25zdCBFTFVfREVSX1BBQ0tFRCA9IGBcbiAgdmVjNCBiR1RFWmVybyA9IHZlYzQoZ3JlYXRlclRoYW5FcXVhbChiLCB2ZWM0KDAuKSkpO1xuICByZXR1cm4gKGJHVEVaZXJvICogYSkgKyAoKHZlYzQoMS4wKSAtIGJHVEVaZXJvKSAqIChhICogKGIgKyB2ZWM0KDEuMCkpKSk7XG5gO1xuXG5leHBvcnQgY29uc3QgZWx1R3JhZCA9XG4gICAgKGFyZ3M6IHtpbnB1dHM6IEVsdUdyYWRJbnB1dHMsIGJhY2tlbmQ6IE1hdGhCYWNrZW5kV2ViR0x9KTogVGVuc29ySW5mbyA9PiB7XG4gICAgICBjb25zdCB7aW5wdXRzLCBiYWNrZW5kfSA9IGFyZ3M7XG4gICAgICBjb25zdCB7ZHksIHl9ID0gaW5wdXRzO1xuXG4gICAgICBjb25zdCBwcm9ncmFtID0gZW52KCkuZ2V0Qm9vbCgnV0VCR0xfUEFDS19CSU5BUllfT1BFUkFUSU9OUycpID9cbiAgICAgICAgICBuZXcgQmluYXJ5T3BQYWNrZWRQcm9ncmFtKEVMVV9ERVJfUEFDS0VELCBkeS5zaGFwZSwgeS5zaGFwZSkgOlxuICAgICAgICAgIG5ldyBCaW5hcnlPcFByb2dyYW0oRUxVX0RFUiwgZHkuc2hhcGUsIHkuc2hhcGUpO1xuICAgICAgcmV0dXJuIGJhY2tlbmQucnVuV2ViR0xQcm9ncmFtKHByb2dyYW0sIFtkeSwgeV0sIGR5LmR0eXBlKTtcbiAgICB9O1xuXG5leHBvcnQgY29uc3QgZWx1R3JhZENvbmZpZzogS2VybmVsQ29uZmlnID0ge1xuICBrZXJuZWxOYW1lOiBFbHVHcmFkLFxuICBiYWNrZW5kTmFtZTogJ3dlYmdsJyxcbiAga2VybmVsRnVuYzogZWx1R3JhZCBhcyB7fSBhcyBLZXJuZWxGdW5jXG59O1xuIl19","/**\n * @license\n * Copyright 2020 Google LLC. All Rights Reserved.\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n * =============================================================================\n */\nimport { Equal } from '@tensorflow/tfjs-core';\nimport { binaryKernelFunc } from '../kernel_utils/kernel_funcs_utils';\nimport { equalImplCPU } from '../kernel_utils/shared';\nconst PACKED_EQUAL = `\n return vec4(equal(a, b));\n`;\nconst EQUAL = `return float(a == b);`;\nexport const equal = binaryKernelFunc({\n opSnippet: EQUAL,\n packedOpSnippet: PACKED_EQUAL,\n dtype: 'bool',\n cpuKernelImpl: equalImplCPU,\n});\nexport const equalConfig = {\n kernelName: Equal,\n backendName: 'webgl',\n kernelFunc: equal\n};\n//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiRXF1YWwuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi8uLi90ZmpzLWJhY2tlbmQtd2ViZ2wvc3JjL2tlcm5lbHMvRXF1YWwudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUE7Ozs7Ozs7Ozs7Ozs7OztHQWVHO0FBRUgsT0FBTyxFQUFDLEtBQUssRUFBMkIsTUFBTSx1QkFBdUIsQ0FBQztBQUN0RSxPQUFPLEVBQUMsZ0JBQWdCLEVBQUMsTUFBTSxvQ0FBb0MsQ0FBQztBQUNwRSxPQUFPLEVBQUMsWUFBWSxFQUFDLE1BQU0sd0JBQXdCLENBQUM7QUFDcEQsTUFBTSxZQUFZLEdBQUc7O0NBRXBCLENBQUM7QUFFRixNQUFNLEtBQUssR0FBRyx1QkFBdUIsQ0FBQztBQUV0QyxNQUFNLENBQUMsTUFBTSxLQUFLLEdBQUcsZ0JBQWdCLENBQUM7SUFDcEMsU0FBUyxFQUFFLEtBQUs7SUFDaEIsZUFBZSxFQUFFLFlBQVk7SUFDN0IsS0FBSyxFQUFFLE1BQU07SUFDYixhQUFhLEVBQUUsWUFBWTtDQUM1QixDQUFDLENBQUM7QUFFSCxNQUFNLENBQUMsTUFBTSxXQUFXLEdBQWlCO0lBQ3ZDLFVBQVUsRUFBRSxLQUFLO0lBQ2pCLFdBQVcsRUFBRSxPQUFPO0lBQ3BCLFVBQVUsRUFBRSxLQUF5QjtDQUN0QyxDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiLyoqXG4gKiBAbGljZW5zZVxuICogQ29weXJpZ2h0IDIwMjAgR29vZ2xlIExMQy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC5cbiAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSBcIkxpY2Vuc2VcIik7XG4gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuXG4gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXRcbiAqXG4gKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjBcbiAqXG4gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlXG4gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiBcIkFTIElTXCIgQkFTSVMsXG4gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC5cbiAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmRcbiAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLlxuICogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbiAqL1xuXG5pbXBvcnQge0VxdWFsLCBLZXJuZWxDb25maWcsIEtlcm5lbEZ1bmN9IGZyb20gJ0B0ZW5zb3JmbG93L3RmanMtY29yZSc7XG5pbXBvcnQge2JpbmFyeUtlcm5lbEZ1bmN9IGZyb20gJy4uL2tlcm5lbF91dGlscy9rZXJuZWxfZnVuY3NfdXRpbHMnO1xuaW1wb3J0IHtlcXVhbEltcGxDUFV9IGZyb20gJy4uL2tlcm5lbF91dGlscy9zaGFyZWQnO1xuY29uc3QgUEFDS0VEX0VRVUFMID0gYFxuICByZXR1cm4gdmVjNChlcXVhbChhLCBiKSk7XG5gO1xuXG5jb25zdCBFUVVBTCA9IGByZXR1cm4gZmxvYXQoYSA9PSBiKTtgO1xuXG5leHBvcnQgY29uc3QgZXF1YWwgPSBiaW5hcnlLZXJuZWxGdW5jKHtcbiAgb3BTbmlwcGV0OiBFUVVBTCxcbiAgcGFja2VkT3BTbmlwcGV0OiBQQUNLRURfRVFVQUwsXG4gIGR0eXBlOiAnYm9vbCcsXG4gIGNwdUtlcm5lbEltcGw6IGVxdWFsSW1wbENQVSxcbn0pO1xuXG5leHBvcnQgY29uc3QgZXF1YWxDb25maWc6IEtlcm5lbENvbmZpZyA9IHtcbiAga2VybmVsTmFtZTogRXF1YWwsXG4gIGJhY2tlbmROYW1lOiAnd2ViZ2wnLFxuICBrZXJuZWxGdW5jOiBlcXVhbCBhcyB7fSBhcyBLZXJuZWxGdW5jXG59O1xuIl19","/**\n * @license\n * Copyright 2020 Google LLC. All Rights Reserved.\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n * =============================================================================\n */\nimport { backend_util, Erf } from '@tensorflow/tfjs-core';\nimport { unaryKernelFunc } from '../kernel_utils/kernel_funcs_utils';\nconst ERF = `\n // Error function is calculated approximately with elementary function.\n // See \"Handbook of Mathematical Functions with Formulas,\n // Graphs, and Mathematical Tables\", Abramowitz and Stegun.\n float p = ${backend_util.ERF_P};\n float a1 = ${backend_util.ERF_A1};\n float a2 = ${backend_util.ERF_A2};\n float a3 = ${backend_util.ERF_A3};\n float a4 = ${backend_util.ERF_A4};\n float a5 = ${backend_util.ERF_A5};\n\n float sign = sign(x);\n x = abs(x);\n float t = 1.0 / (1.0 + p * x);\n return sign * (1.0 - (((((a5*t + a4)*t) + a3)*t + a2)*t + a1)*t*exp(-x*x));\n`;\nexport const erf = unaryKernelFunc({ opSnippet: ERF });\nexport const erfConfig = {\n kernelName: Erf,\n backendName: 'webgl',\n kernelFunc: erf,\n};\n//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiRXJmLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vLi4vdGZqcy1iYWNrZW5kLXdlYmdsL3NyYy9rZXJuZWxzL0VyZi50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQTs7Ozs7Ozs7Ozs7Ozs7O0dBZUc7QUFFSCxPQUFPLEVBQUMsWUFBWSxFQUFFLEdBQUcsRUFBZSxNQUFNLHVCQUF1QixDQUFDO0FBRXRFLE9BQU8sRUFBQyxlQUFlLEVBQUMsTUFBTSxvQ0FBb0MsQ0FBQztBQUVuRSxNQUFNLEdBQUcsR0FBRzs7OztjQUlFLFlBQVksQ0FBQyxLQUFLO2VBQ2pCLFlBQVksQ0FBQyxNQUFNO2VBQ25CLFlBQVksQ0FBQyxNQUFNO2VBQ25CLFlBQVksQ0FBQyxNQUFNO2VBQ25CLFlBQVksQ0FBQyxNQUFNO2VBQ25CLFlBQVksQ0FBQyxNQUFNOzs7Ozs7Q0FNakMsQ0FBQztBQUVGLE1BQU0sQ0FBQyxNQUFNLEdBQUcsR0FBRyxlQUFlLENBQUMsRUFBQyxTQUFTLEVBQUUsR0FBRyxFQUFDLENBQUMsQ0FBQztBQUVyRCxNQUFNLENBQUMsTUFBTSxTQUFTLEdBQWlCO0lBQ3JDLFVBQVUsRUFBRSxHQUFHO0lBQ2YsV0FBVyxFQUFFLE9BQU87SUFDcEIsVUFBVSxFQUFFLEdBQUc7Q0FDaEIsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbIi8qKlxuICogQGxpY2Vuc2VcbiAqIENvcHlyaWdodCAyMDIwIEdvb2dsZSBMTEMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuXG4gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgXCJMaWNlbnNlXCIpO1xuICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLlxuICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0XG4gKlxuICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wXG4gKlxuICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZVxuICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gXCJBUyBJU1wiIEJBU0lTLFxuICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuXG4gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kXG4gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS5cbiAqID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4gKi9cblxuaW1wb3J0IHtiYWNrZW5kX3V0aWwsIEVyZiwgS2VybmVsQ29uZmlnfSBmcm9tICdAdGVuc29yZmxvdy90ZmpzLWNvcmUnO1xuXG5pbXBvcnQge3VuYXJ5S2VybmVsRnVuY30gZnJvbSAnLi4va2VybmVsX3V0aWxzL2tlcm5lbF9mdW5jc191dGlscyc7XG5cbmNvbnN0IEVSRiA9IGBcbiAgLy8gRXJyb3IgZnVuY3Rpb24gaXMgY2FsY3VsYXRlZCBhcHByb3hpbWF0ZWx5IHdpdGggZWxlbWVudGFyeSBmdW5jdGlvbi5cbiAgLy8gU2VlIFwiSGFuZGJvb2sgb2YgTWF0aGVtYXRpY2FsIEZ1bmN0aW9ucyB3aXRoIEZvcm11bGFzLFxuICAvLyBHcmFwaHMsIGFuZCBNYXRoZW1hdGljYWwgVGFibGVzXCIsIEFicmFtb3dpdHogYW5kIFN0ZWd1bi5cbiAgZmxvYXQgcCA9ICR7YmFja2VuZF91dGlsLkVSRl9QfTtcbiAgZmxvYXQgYTEgPSAke2JhY2tlbmRfdXRpbC5FUkZfQTF9O1xuICBmbG9hdCBhMiA9ICR7YmFja2VuZF91dGlsLkVSRl9BMn07XG4gIGZsb2F0IGEzID0gJHtiYWNrZW5kX3V0aWwuRVJGX0EzfTtcbiAgZmxvYXQgYTQgPSAke2JhY2tlbmRfdXRpbC5FUkZfQTR9O1xuICBmbG9hdCBhNSA9ICR7YmFja2VuZF91dGlsLkVSRl9BNX07XG5cbiAgZmxvYXQgc2lnbiA9IHNpZ24oeCk7XG4gIHggPSBhYnMoeCk7XG4gIGZsb2F0IHQgPSAxLjAgLyAoMS4wICsgcCAqIHgpO1xuICByZXR1cm4gc2lnbiAqICgxLjAgLSAoKCgoKGE1KnQgKyBhNCkqdCkgKyBhMykqdCArIGEyKSp0ICsgYTEpKnQqZXhwKC14KngpKTtcbmA7XG5cbmV4cG9ydCBjb25zdCBlcmYgPSB1bmFyeUtlcm5lbEZ1bmMoe29wU25pcHBldDogRVJGfSk7XG5cbmV4cG9ydCBjb25zdCBlcmZDb25maWc6IEtlcm5lbENvbmZpZyA9IHtcbiAga2VybmVsTmFtZTogRXJmLFxuICBiYWNrZW5kTmFtZTogJ3dlYmdsJyxcbiAga2VybmVsRnVuYzogZXJmLFxufTtcbiJdfQ==","/**\n * @license\n * Copyright 2020 Google LLC. All Rights Reserved.\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n * =============================================================================\n */\nimport { Exp } from '@tensorflow/tfjs-core';\nimport { CHECK_NAN_SNIPPET_UNARY, unaryKernelFunc } from '../kernel_utils/kernel_funcs_utils';\nimport { expImplCPU } from '../kernel_utils/shared';\nexport const EXP = CHECK_NAN_SNIPPET_UNARY + `\n return exp(x);\n`;\nconst EXP_PACKED = `\n vec4 result = exp(x);\n bvec4 isNaN = isnan(x);\n result.r = isNaN.r ? x.r : result.r;\n result.g = isNaN.g ? x.g : result.g;\n result.b = isNaN.b ? x.b : result.b;\n result.a = isNaN.a ? x.a : result.a;\n\n return result;\n`;\nexport const exp = unaryKernelFunc({\n opSnippet: EXP,\n packedOpSnippet: EXP_PACKED,\n cpuKernelImpl: expImplCPU,\n dtype: 'float32',\n});\nexport const expConfig = {\n kernelName: Exp,\n backendName: 'webgl',\n kernelFunc: exp\n};\n//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiRXhwLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vLi4vdGZqcy1iYWNrZW5kLXdlYmdsL3NyYy9rZXJuZWxzL0V4cC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQTs7Ozs7Ozs7Ozs7Ozs7O0dBZUc7QUFFSCxPQUFPLEVBQUMsR0FBRyxFQUEyQixNQUFNLHVCQUF1QixDQUFDO0FBRXBFLE9BQU8sRUFBQyx1QkFBdUIsRUFBRSxlQUFlLEVBQUMsTUFBTSxvQ0FBb0MsQ0FBQztBQUM1RixPQUFPLEVBQUMsVUFBVSxFQUFDLE1BQU0sd0JBQXdCLENBQUM7QUFFbEQsTUFBTSxDQUFDLE1BQU0sR0FBRyxHQUFHLHVCQUF1QixHQUFHOztDQUU1QyxDQUFDO0FBRUYsTUFBTSxVQUFVLEdBQUc7Ozs7Ozs7OztDQVNsQixDQUFDO0FBRUYsTUFBTSxDQUFDLE1BQU0sR0FBRyxHQUFHLGVBQWUsQ0FBQztJQUNqQyxTQUFTLEVBQUUsR0FBRztJQUNkLGVBQWUsRUFBRSxVQUFVO0lBQzNCLGFBQWEsRUFBRSxVQUFVO0lBQ3pCLEtBQUssRUFBRSxTQUFTO0NBQ2pCLENBQUMsQ0FBQztBQUVILE1BQU0sQ0FBQyxNQUFNLFNBQVMsR0FBaUI7SUFDckMsVUFBVSxFQUFFLEdBQUc7SUFDZixXQUFXLEVBQUUsT0FBTztJQUNwQixVQUFVLEVBQUUsR0FBdUI7Q0FDcEMsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbIi8qKlxuICogQGxpY2Vuc2VcbiAqIENvcHlyaWdodCAyMDIwIEdvb2dsZSBMTEMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuXG4gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgXCJMaWNlbnNlXCIpO1xuICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLlxuICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0XG4gKlxuICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wXG4gKlxuICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZVxuICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gXCJBUyBJU1wiIEJBU0lTLFxuICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuXG4gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kXG4gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS5cbiAqID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4gKi9cblxuaW1wb3J0IHtFeHAsIEtlcm5lbENvbmZpZywgS2VybmVsRnVuY30gZnJvbSAnQHRlbnNvcmZsb3cvdGZqcy1jb3JlJztcblxuaW1wb3J0IHtDSEVDS19OQU5fU05JUFBFVF9VTkFSWSwgdW5hcnlLZXJuZWxGdW5jfSBmcm9tICcuLi9rZXJuZWxfdXRpbHMva2VybmVsX2Z1bmNzX3V0aWxzJztcbmltcG9ydCB7ZXhwSW1wbENQVX0gZnJvbSAnLi4va2VybmVsX3V0aWxzL3NoYXJlZCc7XG5cbmV4cG9ydCBjb25zdCBFWFAgPSBDSEVDS19OQU5fU05JUFBFVF9VTkFSWSArIGBcbiAgcmV0dXJuIGV4cCh4KTtcbmA7XG5cbmNvbnN0IEVYUF9QQUNLRUQgPSBgXG4gIHZlYzQgcmVzdWx0ID0gZXhwKHgpO1xuICBidmVjNCBpc05hTiA9IGlzbmFuKHgpO1xuICByZXN1bHQuciA9IGlzTmFOLnIgPyB4LnIgOiByZXN1bHQucjtcbiAgcmVzdWx0LmcgPSBpc05hTi5nID8geC5nIDogcmVzdWx0Lmc7XG4gIHJlc3VsdC5iID0gaXNOYU4uYiA/IHguYiA6IHJlc3VsdC5iO1xuICByZXN1bHQuYSA9IGlzTmFOLmEgPyB4LmEgOiByZXN1bHQuYTtcblxuICByZXR1cm4gcmVzdWx0O1xuYDtcblxuZXhwb3J0IGNvbnN0IGV4cCA9IHVuYXJ5S2VybmVsRnVuYyh7XG4gIG9wU25pcHBldDogRVhQLFxuICBwYWNrZWRPcFNuaXBwZXQ6IEVYUF9QQUNLRUQsXG4gIGNwdUtlcm5lbEltcGw6IGV4cEltcGxDUFUsXG4gIGR0eXBlOiAnZmxvYXQzMicsXG59KTtcblxuZXhwb3J0IGNvbnN0IGV4cENvbmZpZzogS2VybmVsQ29uZmlnID0ge1xuICBrZXJuZWxOYW1lOiBFeHAsXG4gIGJhY2tlbmROYW1lOiAnd2ViZ2wnLFxuICBrZXJuZWxGdW5jOiBleHAgYXMge30gYXMgS2VybmVsRnVuY1xufTtcbiJdfQ==","/**\n * @license\n * Copyright 2020 Google LLC. All Rights Reserved.\n * Licensed under the Apache License, Version 2.0 (the License);\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an AS IS BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n * =============================================================================\n */\nimport { ExpandDims, util } from '@tensorflow/tfjs-core';\nimport { reshape } from './Reshape';\nexport function expandDims(args) {\n const { inputs, attrs, backend } = args;\n const { dim } = attrs;\n const { input } = inputs;\n const inputRank = input.shape.length;\n const newShape = input.shape.slice();\n let $dim = dim;\n if (dim < 0) {\n // Negative value is counted from the tail of rank.\n util.assert(-(inputRank + 1) <= dim, () => `Axis must be in the interval [${-(inputRank + 1)}, ${inputRank}]`);\n $dim = inputRank + dim + 1;\n }\n newShape.splice($dim, 0, 1);\n return reshape({ inputs: { x: input }, backend, attrs: { shape: newShape } });\n}\nexport const expandDimsConfig = {\n kernelName: ExpandDims,\n backendName: 'webgl',\n kernelFunc: expandDims,\n};\n//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiRXhwYW5kRGltcy5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uLy4uL3RmanMtYmFja2VuZC13ZWJnbC9zcmMva2VybmVscy9FeHBhbmREaW1zLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBOzs7Ozs7Ozs7Ozs7Ozs7R0FlRztBQUVILE9BQU8sRUFBQyxVQUFVLEVBQTJFLElBQUksRUFBQyxNQUFNLHVCQUF1QixDQUFDO0FBR2hJLE9BQU8sRUFBQyxPQUFPLEVBQUMsTUFBTSxXQUFXLENBQUM7QUFFbEMsTUFBTSxVQUFVLFVBQVUsQ0FBQyxJQUkxQjtJQUNDLE1BQU0sRUFBQyxNQUFNLEVBQUUsS0FBSyxFQUFFLE9BQU8sRUFBQyxHQUFHLElBQUksQ0FBQztJQUN0QyxNQUFNLEVBQUMsR0FBRyxFQUFDLEdBQUcsS0FBSyxDQUFDO0lBQ3BCLE1BQU0sRUFBQyxLQUFLLEVBQUMsR0FBRyxNQUFNLENBQUM7SUFFdkIsTUFBTSxTQUFTLEdBQUcsS0FBSyxDQUFDLEtBQUssQ0FBQyxNQUFNLENBQUM7SUFDckMsTUFBTSxRQUFRLEdBQUcsS0FBSyxDQUFDLEtBQUssQ0FBQyxLQUFLLEVBQUUsQ0FBQztJQUNyQyxJQUFJLElBQUksR0FBRyxHQUFHLENBQUM7SUFDZixJQUFJLEdBQUcsR0FBRyxDQUFDLEVBQUU7UUFDWCxtREFBbUQ7UUFDbkQsSUFBSSxDQUFDLE1BQU0sQ0FDUCxDQUFDLENBQUMsU0FBUyxHQUFHLENBQUMsQ0FBQyxJQUFJLEdBQUcsRUFDdkIsR0FBRyxFQUFFLENBQUMsaUNBQWlDLENBQUUsQ0FBQyxTQUFTLEdBQUcsQ0FBQyxDQUFDLEtBQ3BELFNBQVMsR0FBRyxDQUFDLENBQUM7UUFDdEIsSUFBSSxHQUFHLFNBQVMsR0FBRyxHQUFHLEdBQUcsQ0FBQyxDQUFDO0tBQzVCO0lBQ0QsUUFBUSxDQUFDLE1BQU0sQ0FBQyxJQUFJLEVBQUUsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDO0lBRTVCLE9BQU8sT0FBTyxDQUFDLEVBQUMsTUFBTSxFQUFFLEVBQUMsQ0FBQyxFQUFFLEtBQUssRUFBQyxFQUFFLE9BQU8sRUFBRSxLQUFLLEVBQUUsRUFBQyxLQUFLLEVBQUUsUUFBUSxFQUFDLEVBQUMsQ0FBQyxDQUFDO0FBQzFFLENBQUM7QUFFRCxNQUFNLENBQUMsTUFBTSxnQkFBZ0IsR0FBaUI7SUFDNUMsVUFBVSxFQUFFLFVBQVU7SUFDdEIsV0FBVyxFQUFFLE9BQU87SUFDcEIsVUFBVSxFQUFFLFVBQThCO0NBQzNDLENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyIvKipcbiAqIEBsaWNlbnNlXG4gKiBDb3B5cmlnaHQgMjAyMCBHb29nbGUgTExDLiBBbGwgUmlnaHRzIFJlc2VydmVkLlxuICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlIExpY2Vuc2UpO1xuICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLlxuICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0XG4gKlxuICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wXG4gKlxuICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZVxuICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gQVMgSVMgQkFTSVMsXG4gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC5cbiAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmRcbiAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLlxuICogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbiAqL1xuXG5pbXBvcnQge0V4cGFuZERpbXMsIEV4cGFuZERpbXNBdHRycywgRXhwYW5kRGltc0lucHV0cywgS2VybmVsQ29uZmlnLCBLZXJuZWxGdW5jLCBUZW5zb3JJbmZvLCB1dGlsfSBmcm9tICdAdGVuc29yZmxvdy90ZmpzLWNvcmUnO1xuXG5pbXBvcnQge01hdGhCYWNrZW5kV2ViR0x9IGZyb20gJy4uL2JhY2tlbmRfd2ViZ2wnO1xuaW1wb3J0IHtyZXNoYXBlfSBmcm9tICcuL1Jlc2hhcGUnO1xuXG5leHBvcnQgZnVuY3Rpb24gZXhwYW5kRGltcyhhcmdzOiB7XG4gIGlucHV0czogRXhwYW5kRGltc0lucHV0cyxcbiAgYXR0cnM6IEV4cGFuZERpbXNBdHRycyxcbiAgYmFja2VuZDogTWF0aEJhY2tlbmRXZWJHTFxufSk6IFRlbnNvckluZm8ge1xuICBjb25zdCB7aW5wdXRzLCBhdHRycywgYmFja2VuZH0gPSBhcmdzO1xuICBjb25zdCB7ZGltfSA9IGF0dHJzO1xuICBjb25zdCB7aW5wdXR9ID0gaW5wdXRzO1xuXG4gIGNvbnN0IGlucHV0UmFuayA9IGlucHV0LnNoYXBlLmxlbmd0aDtcbiAgY29uc3QgbmV3U2hhcGUgPSBpbnB1dC5zaGFwZS5zbGljZSgpO1xuICBsZXQgJGRpbSA9IGRpbTtcbiAgaWYgKGRpbSA8IDApIHtcbiAgICAvLyBOZWdhdGl2ZSB2YWx1ZSBpcyBjb3VudGVkIGZyb20gdGhlIHRhaWwgb2YgcmFuay5cbiAgICB1dGlsLmFzc2VydChcbiAgICAgICAgLShpbnB1dFJhbmsgKyAxKSA8PSBkaW0sXG4gICAgICAgICgpID0+IGBBeGlzIG11c3QgYmUgaW4gdGhlIGludGVydmFsIFskey0gKGlucHV0UmFuayArIDEpfSwgJHtcbiAgICAgICAgICAgIGlucHV0UmFua31dYCk7XG4gICAgJGRpbSA9IGlucHV0UmFuayArIGRpbSArIDE7XG4gIH1cbiAgbmV3U2hhcGUuc3BsaWNlKCRkaW0sIDAsIDEpO1xuXG4gIHJldHVybiByZXNoYXBlKHtpbnB1dHM6IHt4OiBpbnB1dH0sIGJhY2tlbmQsIGF0dHJzOiB7c2hhcGU6IG5ld1NoYXBlfX0pO1xufVxuXG5leHBvcnQgY29uc3QgZXhwYW5kRGltc0NvbmZpZzogS2VybmVsQ29uZmlnID0ge1xuICBrZXJuZWxOYW1lOiBFeHBhbmREaW1zLFxuICBiYWNrZW5kTmFtZTogJ3dlYmdsJyxcbiAga2VybmVsRnVuYzogZXhwYW5kRGltcyBhcyB7fSBhcyBLZXJuZWxGdW5jLFxufTtcbiJdfQ==","/**\n * @license\n * Copyright 2020 Google LLC. All Rights Reserved.\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n * =============================================================================\n */\nimport { Expm1 } from '@tensorflow/tfjs-core';\nimport { unaryKernelFunc } from '../kernel_utils/kernel_funcs_utils';\nimport { expm1ImplCPU } from '../kernel_utils/shared';\nconst EXPM1 = `return exp(x) - 1.0;`;\nexport const expm1 = unaryKernelFunc({ opSnippet: EXPM1, packedOpSnippet: EXPM1, cpuKernelImpl: expm1ImplCPU });\nexport const expm1Config = {\n kernelName: Expm1,\n backendName: 'webgl',\n kernelFunc: expm1\n};\n//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiRXhwbTEuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi8uLi90ZmpzLWJhY2tlbmQtd2ViZ2wvc3JjL2tlcm5lbHMvRXhwbTEudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUE7Ozs7Ozs7Ozs7Ozs7OztHQWVHO0FBRUgsT0FBTyxFQUFDLEtBQUssRUFBMkIsTUFBTSx1QkFBdUIsQ0FBQztBQUN0RSxPQUFPLEVBQUMsZUFBZSxFQUFDLE1BQU0sb0NBQW9DLENBQUM7QUFDbkUsT0FBTyxFQUFDLFlBQVksRUFBQyxNQUFNLHdCQUF3QixDQUFDO0FBRXBELE1BQU0sS0FBSyxHQUFHLHNCQUFzQixDQUFDO0FBRXJDLE1BQU0sQ0FBQyxNQUFNLEtBQUssR0FBRyxlQUFlLENBQ2hDLEVBQUMsU0FBUyxFQUFFLEtBQUssRUFBRSxlQUFlLEVBQUUsS0FBSyxFQUFFLGFBQWEsRUFBRSxZQUFZLEVBQUMsQ0FBQyxDQUFDO0FBRTdFLE1BQU0sQ0FBQyxNQUFNLFdBQVcsR0FBaUI7SUFDdkMsVUFBVSxFQUFFLEtBQUs7SUFDakIsV0FBVyxFQUFFLE9BQU87SUFDcEIsVUFBVSxFQUFFLEtBQXlCO0NBQ3RDLENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyIvKipcbiAqIEBsaWNlbnNlXG4gKiBDb3B5cmlnaHQgMjAyMCBHb29nbGUgTExDLiBBbGwgUmlnaHRzIFJlc2VydmVkLlxuICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlIFwiTGljZW5zZVwiKTtcbiAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS5cbiAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdFxuICpcbiAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMFxuICpcbiAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmVcbiAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuIFwiQVMgSVNcIiBCQVNJUyxcbiAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLlxuICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZFxuICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuXG4gKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuICovXG5cbmltcG9ydCB7RXhwbTEsIEtlcm5lbENvbmZpZywgS2VybmVsRnVuY30gZnJvbSAnQHRlbnNvcmZsb3cvdGZqcy1jb3JlJztcbmltcG9ydCB7dW5hcnlLZXJuZWxGdW5jfSBmcm9tICcuLi9rZXJuZWxfdXRpbHMva2VybmVsX2Z1bmNzX3V0aWxzJztcbmltcG9ydCB7ZXhwbTFJbXBsQ1BVfSBmcm9tICcuLi9rZXJuZWxfdXRpbHMvc2hhcmVkJztcblxuY29uc3QgRVhQTTEgPSBgcmV0dXJuIGV4cCh4KSAtIDEuMDtgO1xuXG5leHBvcnQgY29uc3QgZXhwbTEgPSB1bmFyeUtlcm5lbEZ1bmMoXG4gICAge29wU25pcHBldDogRVhQTTEsIHBhY2tlZE9wU25pcHBldDogRVhQTTEsIGNwdUtlcm5lbEltcGw6IGV4cG0xSW1wbENQVX0pO1xuXG5leHBvcnQgY29uc3QgZXhwbTFDb25maWc6IEtlcm5lbENvbmZpZyA9IHtcbiAga2VybmVsTmFtZTogRXhwbTEsXG4gIGJhY2tlbmROYW1lOiAnd2ViZ2wnLFxuICBrZXJuZWxGdW5jOiBleHBtMSBhcyB7fSBhcyBLZXJuZWxGdW5jXG59O1xuIl19","/**\n * @license\n * Copyright 2018 Google LLC. All Rights Reserved.\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n * =============================================================================\n */\nexport class FFTProgram {\n constructor(component, inputShape, inverse) {\n this.variableNames = ['real', 'imag'];\n const innerDim = inputShape[1];\n this.outputShape = inputShape;\n const exponentMultiplierSnippet = inverse ? `2.0 * ${Math.PI}` : `-2.0 * ${Math.PI}`;\n const resultDenominator = inverse ? `${innerDim}.0` : '1.0';\n let opString;\n if (component === 'real') {\n opString = 'return real * expR - imag * expI;';\n }\n else if (component === 'imag') {\n opString = 'return real * expI + imag * expR;';\n }\n else {\n throw new Error(`FFT component must be either \"real\" or \"imag\", got ${component}.`);\n }\n this.userCode = `\n const float exponentMultiplier = ${exponentMultiplierSnippet};\n\n float unaryOpComplex(float real, float expR, float imag, float expI) {\n ${opString}\n }\n\n float mulMatDFT(int batch, int index) {\n float indexRatio = float(index) / float(${innerDim});\n float exponentMultiplierTimesIndexRatio =\n exponentMultiplier * indexRatio;\n\n float result = 0.0;\n\n for (int i = 0; i < ${innerDim}; i++) {\n // x = (-2|2 * PI / N) * index * i;\n float x = exponentMultiplierTimesIndexRatio * float(i);\n float expR = cos(x);\n float expI = sin(x);\n float real = getReal(batch, i);\n float imag = getImag(batch, i);\n\n result +=\n unaryOpComplex(real, expR, imag, expI) / ${resultDenominator};\n }\n\n return result;\n }\n\n void main() {\n ivec2 coords = getOutputCoords();\n setOutput(mulMatDFT(coords[0], coords[1]));\n }\n `;\n }\n}\n//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZmZ0X2dwdS5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uL3RmanMtYmFja2VuZC13ZWJnbC9zcmMvZmZ0X2dwdS50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQTs7Ozs7Ozs7Ozs7Ozs7O0dBZUc7QUFJSCxNQUFNLE9BQU8sVUFBVTtJQUtyQixZQUNJLFNBQXdCLEVBQUUsVUFBNEIsRUFDdEQsT0FBZ0I7UUFOcEIsa0JBQWEsR0FBRyxDQUFDLE1BQU0sRUFBRSxNQUFNLENBQUMsQ0FBQztRQU8vQixNQUFNLFFBQVEsR0FBRyxVQUFVLENBQUMsQ0FBQyxDQUFDLENBQUM7UUFDL0IsSUFBSSxDQUFDLFdBQVcsR0FBRyxVQUFVLENBQUM7UUFFOUIsTUFBTSx5QkFBeUIsR0FDM0IsT0FBTyxDQUFDLENBQUMsQ0FBQyxTQUFTLElBQUksQ0FBQyxFQUFFLEVBQUUsQ0FBQyxDQUFDLENBQUMsVUFBVSxJQUFJLENBQUMsRUFBRSxFQUFFLENBQUM7UUFDdkQsTUFBTSxpQkFBaUIsR0FBRyxPQUFPLENBQUMsQ0FBQyxDQUFDLEdBQUcsUUFBUSxJQUFJLENBQUMsQ0FBQyxDQUFDLEtBQUssQ0FBQztRQUU1RCxJQUFJLFFBQWdCLENBQUM7UUFDckIsSUFBSSxTQUFTLEtBQUssTUFBTSxFQUFFO1lBQ3hCLFFBQVEsR0FBRyxtQ0FBbUMsQ0FBQztTQUNoRDthQUFNLElBQUksU0FBUyxLQUFLLE1BQU0sRUFBRTtZQUMvQixRQUFRLEdBQUcsbUNBQW1DLENBQUM7U0FDaEQ7YUFBTTtZQUNMLE1BQU0sSUFBSSxLQUFLLENBQ1gsc0RBQXNELFNBQVMsR0FBRyxDQUFDLENBQUM7U0FDekU7UUFFRCxJQUFJLENBQUMsUUFBUSxHQUFHO3lDQUNxQix5QkFBeUI7OztVQUd4RCxRQUFROzs7O2tEQUlnQyxRQUFROzs7Ozs7OEJBTTVCLFFBQVE7Ozs7Ozs7Ozt5REFTbUIsaUJBQWlCOzs7Ozs7Ozs7O0tBVXJFLENBQUM7SUFDSixDQUFDO0NBQ0YiLCJzb3VyY2VzQ29udGVudCI6WyIvKipcbiAqIEBsaWNlbnNlXG4gKiBDb3B5cmlnaHQgMjAxOCBHb29nbGUgTExDLiBBbGwgUmlnaHRzIFJlc2VydmVkLlxuICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlIFwiTGljZW5zZVwiKTtcbiAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS5cbiAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdFxuICpcbiAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMFxuICpcbiAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmVcbiAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuIFwiQVMgSVNcIiBCQVNJUyxcbiAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLlxuICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZFxuICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuXG4gKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuICovXG5cbmltcG9ydCB7R1BHUFVQcm9ncmFtfSBmcm9tICcuL2dwZ3B1X21hdGgnO1xuXG5leHBvcnQgY2xhc3MgRkZUUHJvZ3JhbSBpbXBsZW1lbnRzIEdQR1BVUHJvZ3JhbSB7XG4gIHZhcmlhYmxlTmFtZXMgPSBbJ3JlYWwnLCAnaW1hZyddO1xuICBvdXRwdXRTaGFwZTogbnVtYmVyW107XG4gIHVzZXJDb2RlOiBzdHJpbmc7XG5cbiAgY29uc3RydWN0b3IoXG4gICAgICBjb21wb25lbnQ6ICdyZWFsJ3wnaW1hZycsIGlucHV0U2hhcGU6IFtudW1iZXIsIG51bWJlcl0sXG4gICAgICBpbnZlcnNlOiBib29sZWFuKSB7XG4gICAgY29uc3QgaW5uZXJEaW0gPSBpbnB1dFNoYXBlWzFdO1xuICAgIHRoaXMub3V0cHV0U2hhcGUgPSBpbnB1dFNoYXBlO1xuXG4gICAgY29uc3QgZXhwb25lbnRNdWx0aXBsaWVyU25pcHBldCA9XG4gICAgICAgIGludmVyc2UgPyBgMi4wICogJHtNYXRoLlBJfWAgOiBgLTIuMCAqICR7TWF0aC5QSX1gO1xuICAgIGNvbnN0IHJlc3VsdERlbm9taW5hdG9yID0gaW52ZXJzZSA/IGAke2lubmVyRGltfS4wYCA6ICcxLjAnO1xuXG4gICAgbGV0IG9wU3RyaW5nOiBzdHJpbmc7XG4gICAgaWYgKGNvbXBvbmVudCA9PT0gJ3JlYWwnKSB7XG4gICAgICBvcFN0cmluZyA9ICdyZXR1cm4gcmVhbCAqIGV4cFIgLSBpbWFnICogZXhwSTsnO1xuICAgIH0gZWxzZSBpZiAoY29tcG9uZW50ID09PSAnaW1hZycpIHtcbiAgICAgIG9wU3RyaW5nID0gJ3JldHVybiByZWFsICogZXhwSSArIGltYWcgKiBleHBSOyc7XG4gICAgfSBlbHNlIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcihcbiAgICAgICAgICBgRkZUIGNvbXBvbmVudCBtdXN0IGJlIGVpdGhlciBcInJlYWxcIiBvciBcImltYWdcIiwgZ290ICR7Y29tcG9uZW50fS5gKTtcbiAgICB9XG5cbiAgICB0aGlzLnVzZXJDb2RlID0gYFxuICAgICAgY29uc3QgZmxvYXQgZXhwb25lbnRNdWx0aXBsaWVyID0gJHtleHBvbmVudE11bHRpcGxpZXJTbmlwcGV0fTtcblxuICAgICAgZmxvYXQgdW5hcnlPcENvbXBsZXgoZmxvYXQgcmVhbCwgZmxvYXQgZXhwUiwgZmxvYXQgaW1hZywgZmxvYXQgZXhwSSkge1xuICAgICAgICAke29wU3RyaW5nfVxuICAgICAgfVxuXG4gICAgICBmbG9hdCBtdWxNYXRERlQoaW50IGJhdGNoLCBpbnQgaW5kZXgpIHtcbiAgICAgICAgZmxvYXQgaW5kZXhSYXRpbyA9IGZsb2F0KGluZGV4KSAvIGZsb2F0KCR7aW5uZXJEaW19KTtcbiAgICAgICAgZmxvYXQgZXhwb25lbnRNdWx0aXBsaWVyVGltZXNJbmRleFJhdGlvID1cbiAgICAgICAgICAgIGV4cG9uZW50TXVsdGlwbGllciAqIGluZGV4UmF0aW87XG5cbiAgICAgICAgZmxvYXQgcmVzdWx0ID0gMC4wO1xuXG4gICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgJHtpbm5lckRpbX07IGkrKykge1xuICAgICAgICAgIC8vIHggPSAoLTJ8MiAqIFBJIC8gTikgKiBpbmRleCAqIGk7XG4gICAgICAgICAgZmxvYXQgeCA9IGV4cG9uZW50TXVsdGlwbGllclRpbWVzSW5kZXhSYXRpbyAqIGZsb2F0KGkpO1xuICAgICAgICAgIGZsb2F0IGV4cFIgPSBjb3MoeCk7XG4gICAgICAgICAgZmxvYXQgZXhwSSA9IHNpbih4KTtcbiAgICAgICAgICBmbG9hdCByZWFsID0gZ2V0UmVhbChiYXRjaCwgaSk7XG4gICAgICAgICAgZmxvYXQgaW1hZyA9IGdldEltYWcoYmF0Y2gsIGkpO1xuXG4gICAgICAgICAgcmVzdWx0ICs9XG4gICAgICAgICAgICAgIHVuYXJ5T3BDb21wbGV4KHJlYWwsIGV4cFIsIGltYWcsIGV4cEkpIC8gJHtyZXN1bHREZW5vbWluYXRvcn07XG4gICAgICAgIH1cblxuICAgICAgICByZXR1cm4gcmVzdWx0O1xuICAgICAgfVxuXG4gICAgICB2b2lkIG1haW4oKSB7XG4gICAgICAgIGl2ZWMyIGNvb3JkcyA9IGdldE91dHB1dENvb3JkcygpO1xuICAgICAgICBzZXRPdXRwdXQobXVsTWF0REZUKGNvb3Jkc1swXSwgY29vcmRzWzFdKSk7XG4gICAgICB9XG4gICAgYDtcbiAgfVxufVxuIl19","/**\n * @license\n * Copyright 2020 Google LLC. All Rights Reserved.\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n * =============================================================================\n */\nimport { util } from '@tensorflow/tfjs-core';\nimport { FFTProgram } from '../fft_gpu';\nimport { complex } from './Complex';\nimport { reshape } from './Reshape';\nexport function fftImpl(x, inverse, backend) {\n const xData = backend.texData.get(x.dataId);\n const inputSize = util.sizeFromShape(x.shape);\n // Collapse all outer dimensions to a single batch dimension.\n const innerDimensionSize = x.shape[x.shape.length - 1];\n const batch = inputSize / innerDimensionSize;\n const input2D = reshape({ inputs: { x }, backend, attrs: { shape: [batch, innerDimensionSize] } });\n const xShape = input2D.shape;\n const realProgram = new FFTProgram('real', xShape, inverse);\n const imagProgram = new FFTProgram('imag', xShape, inverse);\n const inputs = [\n {\n dataId: xData.complexTensorInfos.real.dataId,\n dtype: xData.complexTensorInfos.real.dtype,\n shape: xShape\n },\n {\n dataId: xData.complexTensorInfos.imag.dataId,\n dtype: xData.complexTensorInfos.imag.dtype,\n shape: xShape\n }\n ];\n const realPart = backend.runWebGLProgram(realProgram, inputs, 'float32');\n const imagPart = backend.runWebGLProgram(imagProgram, inputs, 'float32');\n const complexOutput = complex({ inputs: { real: realPart, imag: imagPart }, backend });\n backend.disposeIntermediateTensorInfo(realPart);\n backend.disposeIntermediateTensorInfo(imagPart);\n const complexOutputReshaped = reshape({ inputs: { x: complexOutput }, backend, attrs: { shape: x.shape } });\n backend.disposeIntermediateTensorInfo(input2D);\n backend.disposeIntermediateTensorInfo(complexOutput);\n return complexOutputReshaped;\n}\n//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiRkZUX2ltcGwuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi8uLi90ZmpzLWJhY2tlbmQtd2ViZ2wvc3JjL2tlcm5lbHMvRkZUX2ltcGwudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUE7Ozs7Ozs7Ozs7Ozs7OztHQWVHO0FBRUgsT0FBTyxFQUFhLElBQUksRUFBQyxNQUFNLHVCQUF1QixDQUFDO0FBR3ZELE9BQU8sRUFBQyxVQUFVLEVBQUMsTUFBTSxZQUFZLENBQUM7QUFFdEMsT0FBTyxFQUFDLE9BQU8sRUFBQyxNQUFNLFdBQVcsQ0FBQztBQUNsQyxPQUFPLEVBQUMsT0FBTyxFQUFDLE1BQU0sV0FBVyxDQUFDO0FBRWxDLE1BQU0sVUFBVSxPQUFPLENBQ25CLENBQWEsRUFBRSxPQUFnQixFQUFFLE9BQXlCO0lBQzVELE1BQU0sS0FBSyxHQUFHLE9BQU8sQ0FBQyxPQUFPLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxNQUFNLENBQUMsQ0FBQztJQUU1QyxNQUFNLFNBQVMsR0FBRyxJQUFJLENBQUMsYUFBYSxDQUFDLENBQUMsQ0FBQyxLQUFLLENBQUMsQ0FBQztJQUM5Qyw2REFBNkQ7SUFDN0QsTUFBTSxrQkFBa0IsR0FBRyxDQUFDLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQyxLQUFLLENBQUMsTUFBTSxHQUFHLENBQUMsQ0FBQyxDQUFDO0lBQ3ZELE1BQU0sS0FBSyxHQUFHLFNBQVMsR0FBRyxrQkFBa0IsQ0FBQztJQUU3QyxNQUFNLE9BQU8sR0FBRyxPQUFPLENBQ25CLEVBQUMsTUFBTSxFQUFFLEVBQUMsQ0FBQyxFQUFDLEVBQUUsT0FBTyxFQUFFLEtBQUssRUFBRSxFQUFDLEtBQUssRUFBRSxDQUFDLEtBQUssRUFBRSxrQkFBa0IsQ0FBQyxFQUFDLEVBQUMsQ0FBQyxDQUFDO0lBRXpFLE1BQU0sTUFBTSxHQUFHLE9BQU8sQ0FBQyxLQUF5QixDQUFDO0lBQ2pELE1BQU0sV0FBVyxHQUFHLElBQUksVUFBVSxDQUFDLE1BQU0sRUFBRSxNQUFNLEVBQUUsT0FBTyxDQUFDLENBQUM7SUFDNUQsTUFBTSxXQUFXLEdBQUcsSUFBSSxVQUFVLENBQUMsTUFBTSxFQUFFLE1BQU0sRUFBRSxPQUFPLENBQUMsQ0FBQztJQUU1RCxNQUFNLE1BQU0sR0FBRztRQUNiO1lBQ0UsTUFBTSxFQUFFLEtBQUssQ0FBQyxrQkFBa0IsQ0FBQyxJQUFJLENBQUMsTUFBTTtZQUM1QyxLQUFLLEVBQUUsS0FBSyxDQUFDLGtCQUFrQixDQUFDLElBQUksQ0FBQyxLQUFLO1lBQzFDLEtBQUssRUFBRSxNQUFNO1NBQ2Q7UUFDRDtZQUNFLE1BQU0sRUFBRSxLQUFLLENBQUMsa0JBQWtCLENBQUMsSUFBSSxDQUFDLE1BQU07WUFDNUMsS0FBSyxFQUFFLEtBQUssQ0FBQyxrQkFBa0IsQ0FBQyxJQUFJLENBQUMsS0FBSztZQUMxQyxLQUFLLEVBQUUsTUFBTTtTQUNkO0tBQ0YsQ0FBQztJQUVGLE1BQU0sUUFBUSxHQUFHLE9BQU8sQ0FBQyxlQUFlLENBQUMsV0FBVyxFQUFFLE1BQU0sRUFBRSxTQUFTLENBQUMsQ0FBQztJQUN6RSxNQUFNLFFBQVEsR0FBRyxPQUFPLENBQUMsZUFBZSxDQUFDLFdBQVcsRUFBRSxNQUFNLEVBQUUsU0FBUyxDQUFDLENBQUM7SUFFekUsTUFBTSxhQUFhLEdBQ2YsT0FBTyxDQUFDLEVBQUMsTUFBTSxFQUFFLEVBQUMsSUFBSSxFQUFFLFFBQVEsRUFBRSxJQUFJLEVBQUUsUUFBUSxFQUFDLEVBQUUsT0FBTyxFQUFDLENBQUMsQ0FBQztJQUVqRSxPQUFPLENBQUMsNkJBQTZCLENBQUMsUUFBUSxDQUFDLENBQUM7SUFDaEQsT0FBTyxDQUFDLDZCQUE2QixDQUFDLFFBQVEsQ0FBQyxDQUFDO0lBRWhELE1BQU0scUJBQXFCLEdBQ3ZCLE9BQU8sQ0FBQyxFQUFDLE1BQU0sRUFBRSxFQUFDLENBQUMsRUFBRSxhQUFhLEVBQUMsRUFBRSxPQUFPLEVBQUUsS0FBSyxFQUFFLEVBQUMsS0FBSyxFQUFFLENBQUMsQ0FBQyxLQUFLLEVBQUMsRUFBQyxDQUFDLENBQUM7SUFFNUUsT0FBTyxDQUFDLDZCQUE2QixDQUFDLE9BQU8sQ0FBQyxDQUFDO0lBQy9DLE9BQU8sQ0FBQyw2QkFBNkIsQ0FBQyxhQUFhLENBQUMsQ0FBQztJQUNyRCxPQUFPLHFCQUFxQixDQUFDO0FBQy9CLENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyIvKipcbiAqIEBsaWNlbnNlXG4gKiBDb3B5cmlnaHQgMjAyMCBHb29nbGUgTExDLiBBbGwgUmlnaHRzIFJlc2VydmVkLlxuICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlIFwiTGljZW5zZVwiKTtcbiAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS5cbiAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdFxuICpcbiAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMFxuICpcbiAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmVcbiAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuIFwiQVMgSVNcIiBCQVNJUyxcbiAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLlxuICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZFxuICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuXG4gKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuICovXG5cbmltcG9ydCB7VGVuc29ySW5mbywgdXRpbH0gZnJvbSAnQHRlbnNvcmZsb3cvdGZqcy1jb3JlJztcblxuaW1wb3J0IHtNYXRoQmFja2VuZFdlYkdMfSBmcm9tICcuLi9iYWNrZW5kX3dlYmdsJztcbmltcG9ydCB7RkZUUHJvZ3JhbX0gZnJvbSAnLi4vZmZ0X2dwdSc7XG5cbmltcG9ydCB7Y29tcGxleH0gZnJvbSAnLi9Db21wbGV4JztcbmltcG9ydCB7cmVzaGFwZX0gZnJvbSAnLi9SZXNoYXBlJztcblxuZXhwb3J0IGZ1bmN0aW9uIGZmdEltcGwoXG4gICAgeDogVGVuc29ySW5mbywgaW52ZXJzZTogYm9vbGVhbiwgYmFja2VuZDogTWF0aEJhY2tlbmRXZWJHTCk6IFRlbnNvckluZm8ge1xuICBjb25zdCB4RGF0YSA9IGJhY2tlbmQudGV4RGF0YS5nZXQoeC5kYXRhSWQpO1xuXG4gIGNvbnN0IGlucHV0U2l6ZSA9IHV0aWwuc2l6ZUZyb21TaGFwZSh4LnNoYXBlKTtcbiAgLy8gQ29sbGFwc2UgYWxsIG91dGVyIGRpbWVuc2lvbnMgdG8gYSBzaW5nbGUgYmF0Y2ggZGltZW5zaW9uLlxuICBjb25zdCBpbm5lckRpbWVuc2lvblNpemUgPSB4LnNoYXBlW3guc2hhcGUubGVuZ3RoIC0gMV07XG4gIGNvbnN0IGJhdGNoID0gaW5wdXRTaXplIC8gaW5uZXJEaW1lbnNpb25TaXplO1xuXG4gIGNvbnN0IGlucHV0MkQgPSByZXNoYXBlKFxuICAgICAge2lucHV0czoge3h9LCBiYWNrZW5kLCBhdHRyczoge3NoYXBlOiBbYmF0Y2gsIGlubmVyRGltZW5zaW9uU2l6ZV19fSk7XG5cbiAgY29uc3QgeFNoYXBlID0gaW5wdXQyRC5zaGFwZSBhcyBbbnVtYmVyLCBudW1iZXJdO1xuICBjb25zdCByZWFsUHJvZ3JhbSA9IG5ldyBGRlRQcm9ncmFtKCdyZWFsJywgeFNoYXBlLCBpbnZlcnNlKTtcbiAgY29uc3QgaW1hZ1Byb2dyYW0gPSBuZXcgRkZUUHJvZ3JhbSgnaW1hZycsIHhTaGFwZSwgaW52ZXJzZSk7XG5cbiAgY29uc3QgaW5wdXRzID0gW1xuICAgIHtcbiAgICAgIGRhdGFJZDogeERhdGEuY29tcGxleFRlbnNvckluZm9zLnJlYWwuZGF0YUlkLFxuICAgICAgZHR5cGU6IHhEYXRhLmNvbXBsZXhUZW5zb3JJbmZvcy5yZWFsLmR0eXBlLFxuICAgICAgc2hhcGU6IHhTaGFwZVxuICAgIH0sXG4gICAge1xuICAgICAgZGF0YUlkOiB4RGF0YS5jb21wbGV4VGVuc29ySW5mb3MuaW1hZy5kYXRhSWQsXG4gICAgICBkdHlwZTogeERhdGEuY29tcGxleFRlbnNvckluZm9zLmltYWcuZHR5cGUsXG4gICAgICBzaGFwZTogeFNoYXBlXG4gICAgfVxuICBdO1xuXG4gIGNvbnN0IHJlYWxQYXJ0ID0gYmFja2VuZC5ydW5XZWJHTFByb2dyYW0ocmVhbFByb2dyYW0sIGlucHV0cywgJ2Zsb2F0MzInKTtcbiAgY29uc3QgaW1hZ1BhcnQgPSBiYWNrZW5kLnJ1bldlYkdMUHJvZ3JhbShpbWFnUHJvZ3JhbSwgaW5wdXRzLCAnZmxvYXQzMicpO1xuXG4gIGNvbnN0IGNvbXBsZXhPdXRwdXQgPVxuICAgICAgY29tcGxleCh7aW5wdXRzOiB7cmVhbDogcmVhbFBhcnQsIGltYWc6IGltYWdQYXJ0fSwgYmFja2VuZH0pO1xuXG4gIGJhY2tlbmQuZGlzcG9zZUludGVybWVkaWF0ZVRlbnNvckluZm8ocmVhbFBhcnQpO1xuICBiYWNrZW5kLmRpc3Bvc2VJbnRlcm1lZGlhdGVUZW5zb3JJbmZvKGltYWdQYXJ0KTtcblxuICBjb25zdCBjb21wbGV4T3V0cHV0UmVzaGFwZWQgPVxuICAgICAgcmVzaGFwZSh7aW5wdXRzOiB7eDogY29tcGxleE91dHB1dH0sIGJhY2tlbmQsIGF0dHJzOiB7c2hhcGU6IHguc2hhcGV9fSk7XG5cbiAgYmFja2VuZC5kaXNwb3NlSW50ZXJtZWRpYXRlVGVuc29ySW5mbyhpbnB1dDJEKTtcbiAgYmFja2VuZC5kaXNwb3NlSW50ZXJtZWRpYXRlVGVuc29ySW5mbyhjb21wbGV4T3V0cHV0KTtcbiAgcmV0dXJuIGNvbXBsZXhPdXRwdXRSZXNoYXBlZDtcbn1cbiJdfQ==","/**\n * @license\n * Copyright 2020 Google LLC. All Rights Reserved.\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n * =============================================================================\n */\nimport { FFT } from '@tensorflow/tfjs-core';\nimport { fftImpl } from './FFT_impl';\nexport function fft(args) {\n const { inputs, backend } = args;\n const { input } = inputs;\n return fftImpl(input, false /* inverse */, backend);\n}\nexport const fftConfig = {\n kernelName: FFT,\n backendName: 'webgl',\n kernelFunc: fft\n};\n//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiRkZULmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vLi4vdGZqcy1iYWNrZW5kLXdlYmdsL3NyYy9rZXJuZWxzL0ZGVC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQTs7Ozs7Ozs7Ozs7Ozs7O0dBZUc7QUFFSCxPQUFPLEVBQUMsR0FBRyxFQUFzQyxNQUFNLHVCQUF1QixDQUFDO0FBSS9FLE9BQU8sRUFBQyxPQUFPLEVBQUMsTUFBTSxZQUFZLENBQUM7QUFFbkMsTUFBTSxVQUFVLEdBQUcsQ0FBQyxJQUFvRDtJQUV0RSxNQUFNLEVBQUMsTUFBTSxFQUFFLE9BQU8sRUFBQyxHQUFHLElBQUksQ0FBQztJQUMvQixNQUFNLEVBQUMsS0FBSyxFQUFDLEdBQUcsTUFBTSxDQUFDO0lBRXZCLE9BQU8sT0FBTyxDQUFDLEtBQUssRUFBRSxLQUFLLENBQUMsYUFBYSxFQUFFLE9BQU8sQ0FBQyxDQUFDO0FBQ3RELENBQUM7QUFFRCxNQUFNLENBQUMsTUFBTSxTQUFTLEdBQWlCO0lBQ3JDLFVBQVUsRUFBRSxHQUFHO0lBQ2YsV0FBVyxFQUFFLE9BQU87SUFDcEIsVUFBVSxFQUFFLEdBQUc7Q0FDaEIsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbIi8qKlxuICogQGxpY2Vuc2VcbiAqIENvcHlyaWdodCAyMDIwIEdvb2dsZSBMTEMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuXG4gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgXCJMaWNlbnNlXCIpO1xuICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLlxuICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0XG4gKlxuICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wXG4gKlxuICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZVxuICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gXCJBUyBJU1wiIEJBU0lTLFxuICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuXG4gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kXG4gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS5cbiAqID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4gKi9cblxuaW1wb3J0IHtGRlQsIEZGVElucHV0cywgS2VybmVsQ29uZmlnLCBUZW5zb3JJbmZvfSBmcm9tICdAdGVuc29yZmxvdy90ZmpzLWNvcmUnO1xuXG5pbXBvcnQge01hdGhCYWNrZW5kV2ViR0x9IGZyb20gJy4uL2JhY2tlbmRfd2ViZ2wnO1xuXG5pbXBvcnQge2ZmdEltcGx9IGZyb20gJy4vRkZUX2ltcGwnO1xuXG5leHBvcnQgZnVuY3Rpb24gZmZ0KGFyZ3M6IHtpbnB1dHM6IEZGVElucHV0cywgYmFja2VuZDogTWF0aEJhY2tlbmRXZWJHTH0pOlxuICAgIFRlbnNvckluZm8ge1xuICBjb25zdCB7aW5wdXRzLCBiYWNrZW5kfSA9IGFyZ3M7XG4gIGNvbnN0IHtpbnB1dH0gPSBpbnB1dHM7XG5cbiAgcmV0dXJuIGZmdEltcGwoaW5wdXQsIGZhbHNlIC8qIGludmVyc2UgKi8sIGJhY2tlbmQpO1xufVxuXG5leHBvcnQgY29uc3QgZmZ0Q29uZmlnOiBLZXJuZWxDb25maWcgPSB7XG4gIGtlcm5lbE5hbWU6IEZGVCxcbiAgYmFja2VuZE5hbWU6ICd3ZWJnbCcsXG4gIGtlcm5lbEZ1bmM6IGZmdFxufTtcbiJdfQ==","/**\n * @license\n * Copyright 2019 Google LLC. All Rights Reserved.\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n * =============================================================================\n */\nexport class FillProgram {\n constructor(shape, value) {\n this.outputShape = [];\n this.customUniforms = [{ name: 'value', type: 'float' }];\n this.variableNames = ['x'];\n this.outputShape = shape;\n this.userCode = `\n void main() {\n // Input can be obtained from uniform value.\n setOutput(value);\n }\n `;\n }\n}\n//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZmlsbF9ncHUuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi90ZmpzLWJhY2tlbmQtd2ViZ2wvc3JjL2ZpbGxfZ3B1LnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBOzs7Ozs7Ozs7Ozs7Ozs7R0FlRztBQUtILE1BQU0sT0FBTyxXQUFXO0lBTXRCLFlBQVksS0FBZSxFQUFFLEtBQWE7UUFKMUMsZ0JBQVcsR0FBYSxFQUFFLENBQUM7UUFFM0IsbUJBQWMsR0FBRyxDQUFDLEVBQUMsSUFBSSxFQUFFLE9BQU8sRUFBRSxJQUFJLEVBQUUsT0FBc0IsRUFBQyxDQUFDLENBQUM7UUFHL0QsSUFBSSxDQUFDLGFBQWEsR0FBRyxDQUFDLEdBQUcsQ0FBQyxDQUFDO1FBQzNCLElBQUksQ0FBQyxXQUFXLEdBQUcsS0FBSyxDQUFDO1FBRXpCLElBQUksQ0FBQyxRQUFRLEdBQUc7Ozs7O0tBS2YsQ0FBQztJQUNKLENBQUM7Q0FDRiIsInNvdXJjZXNDb250ZW50IjpbIi8qKlxuICogQGxpY2Vuc2VcbiAqIENvcHlyaWdodCAyMDE5IEdvb2dsZSBMTEMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuXG4gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgXCJMaWNlbnNlXCIpO1xuICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLlxuICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0XG4gKlxuICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wXG4gKlxuICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZVxuICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gXCJBUyBJU1wiIEJBU0lTLFxuICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuXG4gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kXG4gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS5cbiAqID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4gKi9cblxuaW1wb3J0IHtHUEdQVVByb2dyYW19IGZyb20gJy4vZ3BncHVfbWF0aCc7XG5pbXBvcnQge1VuaWZvcm1UeXBlfSBmcm9tICcuL3NoYWRlcl9jb21waWxlcic7XG5cbmV4cG9ydCBjbGFzcyBGaWxsUHJvZ3JhbSBpbXBsZW1lbnRzIEdQR1BVUHJvZ3JhbSB7XG4gIHZhcmlhYmxlTmFtZXM6IHN0cmluZ1tdO1xuICBvdXRwdXRTaGFwZTogbnVtYmVyW10gPSBbXTtcbiAgdXNlckNvZGU6IHN0cmluZztcbiAgY3VzdG9tVW5pZm9ybXMgPSBbe25hbWU6ICd2YWx1ZScsIHR5cGU6ICdmbG9hdCcgYXMgVW5pZm9ybVR5cGV9XTtcblxuICBjb25zdHJ1Y3RvcihzaGFwZTogbnVtYmVyW10sIHZhbHVlOiBudW1iZXIpIHtcbiAgICB0aGlzLnZhcmlhYmxlTmFtZXMgPSBbJ3gnXTtcbiAgICB0aGlzLm91dHB1dFNoYXBlID0gc2hhcGU7XG5cbiAgICB0aGlzLnVzZXJDb2RlID0gYFxuICAgICAgdm9pZCBtYWluKCkge1xuICAgICAgICAvLyBJbnB1dCBjYW4gYmUgb2J0YWluZWQgZnJvbSB1bmlmb3JtIHZhbHVlLlxuICAgICAgICBzZXRPdXRwdXQodmFsdWUpO1xuICAgICAgfVxuICAgIGA7XG4gIH1cbn1cbiJdfQ==","/**\n * @license\n * Copyright 2020 Google LLC. All Rights Reserved.\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n * =============================================================================\n */\nimport { Fill, util } from '@tensorflow/tfjs-core';\nimport { FillProgram } from '../fill_gpu';\nexport function fill(args) {\n const { backend, attrs } = args;\n const { shape, value } = attrs;\n let { dtype } = attrs;\n dtype = dtype || util.inferDtype(value);\n if (dtype === 'string') {\n // String type should be handled in CPU memory.\n const values = util.getArrayFromDType(dtype, util.sizeFromShape(shape));\n values.fill(value);\n return backend.makeTensorInfo(shape, dtype, values);\n }\n else {\n const program = new FillProgram(shape, value);\n const customValues = [[value]];\n return backend.runWebGLProgram(program, [], dtype, customValues);\n }\n}\nexport const fillConfig = {\n kernelName: Fill,\n backendName: 'webgl',\n kernelFunc: fill\n};\n//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiRmlsbC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uLy4uL3RmanMtYmFja2VuZC13ZWJnbC9zcmMva2VybmVscy9GaWxsLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBOzs7Ozs7Ozs7Ozs7Ozs7R0FlRztBQUVILE9BQU8sRUFBQyxJQUFJLEVBQW1ELElBQUksRUFBQyxNQUFNLHVCQUF1QixDQUFDO0FBR2xHLE9BQU8sRUFBQyxXQUFXLEVBQUMsTUFBTSxhQUFhLENBQUM7QUFFeEMsTUFBTSxVQUFVLElBQUksQ0FBQyxJQUFtRDtJQUV0RSxNQUFNLEVBQUMsT0FBTyxFQUFFLEtBQUssRUFBQyxHQUFHLElBQUksQ0FBQztJQUM5QixNQUFNLEVBQUMsS0FBSyxFQUFFLEtBQUssRUFBQyxHQUFHLEtBQUssQ0FBQztJQUM3QixJQUFJLEVBQUMsS0FBSyxFQUFDLEdBQUcsS0FBSyxDQUFDO0lBRXBCLEtBQUssR0FBRyxLQUFLLElBQUksSUFBSSxDQUFDLFVBQVUsQ0FBQyxLQUFLLENBQUMsQ0FBQztJQUV4QyxJQUFJLEtBQUssS0FBSyxRQUFRLEVBQUU7UUFDdEIsK0NBQStDO1FBQy9DLE1BQU0sTUFBTSxHQUFHLElBQUksQ0FBQyxpQkFBaUIsQ0FBQyxLQUFLLEVBQUUsSUFBSSxDQUFDLGFBQWEsQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDO1FBQ3hFLE1BQU0sQ0FBQyxJQUFJLENBQUMsS0FBZSxDQUFDLENBQUM7UUFDN0IsT0FBTyxPQUFPLENBQUMsY0FBYyxDQUFDLEtBQUssRUFBRSxLQUFLLEVBQUUsTUFBTSxDQUFDLENBQUM7S0FDckQ7U0FBTTtRQUNMLE1BQU0sT0FBTyxHQUFHLElBQUksV0FBVyxDQUFDLEtBQUssRUFBRSxLQUFlLENBQUMsQ0FBQztRQUN4RCxNQUFNLFlBQVksR0FBRyxDQUFDLENBQUMsS0FBZSxDQUFDLENBQUMsQ0FBQztRQUN6QyxPQUFPLE9BQU8sQ0FBQyxlQUFlLENBQUMsT0FBTyxFQUFFLEVBQUUsRUFBRSxLQUFLLEVBQUUsWUFBWSxDQUFDLENBQUM7S0FDbEU7QUFDSCxDQUFDO0FBRUQsTUFBTSxDQUFDLE1BQU0sVUFBVSxHQUFpQjtJQUN0QyxVQUFVLEVBQUUsSUFBSTtJQUNoQixXQUFXLEVBQUUsT0FBTztJQUNwQixVQUFVLEVBQUUsSUFBd0I7Q0FDckMsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbIi8qKlxuICogQGxpY2Vuc2VcbiAqIENvcHlyaWdodCAyMDIwIEdvb2dsZSBMTEMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuXG4gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgXCJMaWNlbnNlXCIpO1xuICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLlxuICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0XG4gKlxuICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wXG4gKlxuICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZVxuICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gXCJBUyBJU1wiIEJBU0lTLFxuICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuXG4gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kXG4gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS5cbiAqID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4gKi9cblxuaW1wb3J0IHtGaWxsLCBGaWxsQXR0cnMsIEtlcm5lbENvbmZpZywgS2VybmVsRnVuYywgVGVuc29ySW5mbywgdXRpbH0gZnJvbSAnQHRlbnNvcmZsb3cvdGZqcy1jb3JlJztcblxuaW1wb3J0IHtNYXRoQmFja2VuZFdlYkdMfSBmcm9tICcuLi9iYWNrZW5kX3dlYmdsJztcbmltcG9ydCB7RmlsbFByb2dyYW19IGZyb20gJy4uL2ZpbGxfZ3B1JztcblxuZXhwb3J0IGZ1bmN0aW9uIGZpbGwoYXJnczoge2JhY2tlbmQ6IE1hdGhCYWNrZW5kV2ViR0wsIGF0dHJzOiBGaWxsQXR0cnN9KTpcbiAgICBUZW5zb3JJbmZvIHtcbiAgY29uc3Qge2JhY2tlbmQsIGF0dHJzfSA9IGFyZ3M7XG4gIGNvbnN0IHtzaGFwZSwgdmFsdWV9ID0gYXR0cnM7XG4gIGxldCB7ZHR5cGV9ID0gYXR0cnM7XG5cbiAgZHR5cGUgPSBkdHlwZSB8fCB1dGlsLmluZmVyRHR5cGUodmFsdWUpO1xuXG4gIGlmIChkdHlwZSA9PT0gJ3N0cmluZycpIHtcbiAgICAvLyBTdHJpbmcgdHlwZSBzaG91bGQgYmUgaGFuZGxlZCBpbiBDUFUgbWVtb3J5LlxuICAgIGNvbnN0IHZhbHVlcyA9IHV0aWwuZ2V0QXJyYXlGcm9tRFR5cGUoZHR5cGUsIHV0aWwuc2l6ZUZyb21TaGFwZShzaGFwZSkpO1xuICAgIHZhbHVlcy5maWxsKHZhbHVlIGFzIHN0cmluZyk7XG4gICAgcmV0dXJuIGJhY2tlbmQubWFrZVRlbnNvckluZm8oc2hhcGUsIGR0eXBlLCB2YWx1ZXMpO1xuICB9IGVsc2Uge1xuICAgIGNvbnN0IHByb2dyYW0gPSBuZXcgRmlsbFByb2dyYW0oc2hhcGUsIHZhbHVlIGFzIG51bWJlcik7XG4gICAgY29uc3QgY3VzdG9tVmFsdWVzID0gW1t2YWx1ZSBhcyBudW1iZXJdXTtcbiAgICByZXR1cm4gYmFja2VuZC5ydW5XZWJHTFByb2dyYW0ocHJvZ3JhbSwgW10sIGR0eXBlLCBjdXN0b21WYWx1ZXMpO1xuICB9XG59XG5cbmV4cG9ydCBjb25zdCBmaWxsQ29uZmlnOiBLZXJuZWxDb25maWcgPSB7XG4gIGtlcm5lbE5hbWU6IEZpbGwsXG4gIGJhY2tlbmROYW1lOiAnd2ViZ2wnLFxuICBrZXJuZWxGdW5jOiBmaWxsIGFzIHt9IGFzIEtlcm5lbEZ1bmNcbn07XG4iXX0=","/**\n * @license\n * Copyright 2020 Google LLC. All Rights Reserved.\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n * =============================================================================\n */\nexport class FlipLeftRightProgram {\n constructor(imageShape) {\n this.variableNames = ['Image'];\n this.outputShape = [];\n const imageWidth = imageShape[2];\n this.outputShape = imageShape;\n this.userCode = `\n void main() {\n ivec4 coords = getOutputCoords();\n int x = coords[2];\n\n int coordX = ${imageWidth} - x - 1;\n float outputValue;\n if(coordX >= 0 && coordX < ${imageWidth}) {\n outputValue = getImage(coords[0], coords[1], coordX, coords[3]);\n } else {\n outputValue = getImage(coords[0], coords[1], coords[2], coords[3]);\n }\n setOutput(outputValue);\n }\n `;\n }\n}\n//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZmxpcF9sZWZ0X3JpZ2h0X2dwdS5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uL3RmanMtYmFja2VuZC13ZWJnbC9zcmMvZmxpcF9sZWZ0X3JpZ2h0X2dwdS50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQTs7Ozs7Ozs7Ozs7Ozs7O0dBZUc7QUFJSCxNQUFNLE9BQU8sb0JBQW9CO0lBSy9CLFlBQVksVUFBNEM7UUFKeEQsa0JBQWEsR0FBRyxDQUFDLE9BQU8sQ0FBQyxDQUFDO1FBQzFCLGdCQUFXLEdBQWEsRUFBRSxDQUFDO1FBSXpCLE1BQU0sVUFBVSxHQUFHLFVBQVUsQ0FBQyxDQUFDLENBQUMsQ0FBQztRQUNqQyxJQUFJLENBQUMsV0FBVyxHQUFHLFVBQVUsQ0FBQztRQUU5QixJQUFJLENBQUMsUUFBUSxHQUFHOzs7Ozt5QkFLSyxVQUFVOzt1Q0FFSSxVQUFVOzs7Ozs7O0tBTzVDLENBQUM7SUFDSixDQUFDO0NBQ0YiLCJzb3VyY2VzQ29udGVudCI6WyIvKipcbiAqIEBsaWNlbnNlXG4gKiBDb3B5cmlnaHQgMjAyMCBHb29nbGUgTExDLiBBbGwgUmlnaHRzIFJlc2VydmVkLlxuICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlIFwiTGljZW5zZVwiKTtcbiAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS5cbiAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdFxuICpcbiAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMFxuICpcbiAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmVcbiAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuIFwiQVMgSVNcIiBCQVNJUyxcbiAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLlxuICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZFxuICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuXG4gKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuICovXG5cbmltcG9ydCB7R1BHUFVQcm9ncmFtfSBmcm9tICcuL2dwZ3B1X21hdGgnO1xuXG5leHBvcnQgY2xhc3MgRmxpcExlZnRSaWdodFByb2dyYW0gaW1wbGVtZW50cyBHUEdQVVByb2dyYW0ge1xuICB2YXJpYWJsZU5hbWVzID0gWydJbWFnZSddO1xuICBvdXRwdXRTaGFwZTogbnVtYmVyW10gPSBbXTtcbiAgdXNlckNvZGU6IHN0cmluZztcblxuICBjb25zdHJ1Y3RvcihpbWFnZVNoYXBlOiBbbnVtYmVyLCBudW1iZXIsIG51bWJlciwgbnVtYmVyXSkge1xuICAgIGNvbnN0IGltYWdlV2lkdGggPSBpbWFnZVNoYXBlWzJdO1xuICAgIHRoaXMub3V0cHV0U2hhcGUgPSBpbWFnZVNoYXBlO1xuXG4gICAgdGhpcy51c2VyQ29kZSA9IGBcbiAgICAgICAgdm9pZCBtYWluKCkge1xuICAgICAgICAgIGl2ZWM0IGNvb3JkcyA9IGdldE91dHB1dENvb3JkcygpO1xuICAgICAgICAgIGludCB4ID0gY29vcmRzWzJdO1xuXG4gICAgICAgICAgaW50IGNvb3JkWCA9ICR7aW1hZ2VXaWR0aH0gLSB4IC0gMTtcbiAgICAgICAgICBmbG9hdCBvdXRwdXRWYWx1ZTtcbiAgICAgICAgICBpZihjb29yZFggPj0gMCAmJiBjb29yZFggPCAke2ltYWdlV2lkdGh9KSB7XG4gICAgICAgICAgICBvdXRwdXRWYWx1ZSA9IGdldEltYWdlKGNvb3Jkc1swXSwgY29vcmRzWzFdLCBjb29yZFgsIGNvb3Jkc1szXSk7XG4gICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIG91dHB1dFZhbHVlID0gZ2V0SW1hZ2UoY29vcmRzWzBdLCBjb29yZHNbMV0sIGNvb3Jkc1syXSwgY29vcmRzWzNdKTtcbiAgICAgICAgICB9XG4gICAgICAgICAgc2V0T3V0cHV0KG91dHB1dFZhbHVlKTtcbiAgICAgICAgfVxuICAgIGA7XG4gIH1cbn1cbiJdfQ==","/**\n * @license\n * Copyright 2020 Google LLC. All Rights Reserved.\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n * =============================================================================\n */\nimport { FlipLeftRight } from '@tensorflow/tfjs-core';\nimport { FlipLeftRightProgram } from '../flip_left_right_gpu';\nexport const flipLeftRightConfig = {\n kernelName: FlipLeftRight,\n backendName: 'webgl',\n kernelFunc: ({ inputs, backend }) => {\n const { image } = inputs;\n const webglBackend = backend;\n const program = new FlipLeftRightProgram(image.shape);\n const output = webglBackend.runWebGLProgram(program, [image], image.dtype);\n return output;\n }\n};\n//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiRmxpcExlZnRSaWdodC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uLy4uL3RmanMtYmFja2VuZC13ZWJnbC9zcmMva2VybmVscy9GbGlwTGVmdFJpZ2h0LnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBOzs7Ozs7Ozs7Ozs7Ozs7R0FlRztBQUdILE9BQU8sRUFBQyxhQUFhLEVBQXNCLE1BQU0sdUJBQXVCLENBQUM7QUFHekUsT0FBTyxFQUFDLG9CQUFvQixFQUFDLE1BQU0sd0JBQXdCLENBQUM7QUFFNUQsTUFBTSxDQUFDLE1BQU0sbUJBQW1CLEdBQWlCO0lBQy9DLFVBQVUsRUFBRSxhQUFhO0lBQ3pCLFdBQVcsRUFBRSxPQUFPO0lBQ3BCLFVBQVUsRUFBRSxDQUFDLEVBQUMsTUFBTSxFQUFFLE9BQU8sRUFBQyxFQUFFLEVBQUU7UUFDaEMsTUFBTSxFQUFDLEtBQUssRUFBQyxHQUFHLE1BQTZCLENBQUM7UUFDOUMsTUFBTSxZQUFZLEdBQUcsT0FBMkIsQ0FBQztRQUVqRCxNQUFNLE9BQU8sR0FBRyxJQUFJLG9CQUFvQixDQUFFLEtBQWtCLENBQUMsS0FBSyxDQUFDLENBQUM7UUFDcEUsTUFBTSxNQUFNLEdBQUcsWUFBWSxDQUFDLGVBQWUsQ0FBQyxPQUFPLEVBQUUsQ0FBQyxLQUFLLENBQUMsRUFBRSxLQUFLLENBQUMsS0FBSyxDQUFDLENBQUM7UUFDM0UsT0FBTyxNQUFNLENBQUM7SUFDaEIsQ0FBQztDQUNGLENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyIvKipcbiAqIEBsaWNlbnNlXG4gKiBDb3B5cmlnaHQgMjAyMCBHb29nbGUgTExDLiBBbGwgUmlnaHRzIFJlc2VydmVkLlxuICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlIFwiTGljZW5zZVwiKTtcbiAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS5cbiAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdFxuICpcbiAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMFxuICpcbiAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmVcbiAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuIFwiQVMgSVNcIiBCQVNJUyxcbiAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLlxuICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZFxuICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuXG4gKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuICovXG5cbmltcG9ydCB7S2VybmVsQ29uZmlnLCBUZW5zb3I0RH0gZnJvbSAnQHRlbnNvcmZsb3cvdGZqcy1jb3JlJztcbmltcG9ydCB7RmxpcExlZnRSaWdodCwgRmxpcExlZnRSaWdodElucHV0c30gZnJvbSAnQHRlbnNvcmZsb3cvdGZqcy1jb3JlJztcblxuaW1wb3J0IHtNYXRoQmFja2VuZFdlYkdMfSBmcm9tICcuLi9iYWNrZW5kX3dlYmdsJztcbmltcG9ydCB7RmxpcExlZnRSaWdodFByb2dyYW19IGZyb20gJy4uL2ZsaXBfbGVmdF9yaWdodF9ncHUnO1xuXG5leHBvcnQgY29uc3QgZmxpcExlZnRSaWdodENvbmZpZzogS2VybmVsQ29uZmlnID0ge1xuICBrZXJuZWxOYW1lOiBGbGlwTGVmdFJpZ2h0LFxuICBiYWNrZW5kTmFtZTogJ3dlYmdsJyxcbiAga2VybmVsRnVuYzogKHtpbnB1dHMsIGJhY2tlbmR9KSA9PiB7XG4gICAgY29uc3Qge2ltYWdlfSA9IGlucHV0cyBhcyBGbGlwTGVmdFJpZ2h0SW5wdXRzO1xuICAgIGNvbnN0IHdlYmdsQmFja2VuZCA9IGJhY2tlbmQgYXMgTWF0aEJhY2tlbmRXZWJHTDtcblxuICAgIGNvbnN0IHByb2dyYW0gPSBuZXcgRmxpcExlZnRSaWdodFByb2dyYW0oKGltYWdlIGFzIFRlbnNvcjREKS5zaGFwZSk7XG4gICAgY29uc3Qgb3V0cHV0ID0gd2ViZ2xCYWNrZW5kLnJ1bldlYkdMUHJvZ3JhbShwcm9ncmFtLCBbaW1hZ2VdLCBpbWFnZS5kdHlwZSk7XG4gICAgcmV0dXJuIG91dHB1dDtcbiAgfVxufTtcbiJdfQ==","/**\n * @license\n * Copyright 2020 Google LLC. All Rights Reserved.\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n * =============================================================================\n */\nimport { Floor } from '@tensorflow/tfjs-core';\nimport { unaryKernelFunc } from '../kernel_utils/kernel_funcs_utils';\nimport { floorImplCPU } from '../kernel_utils/shared';\nconst FLOOR = `return floor(x);`;\nexport const floor = unaryKernelFunc({ opSnippet: FLOOR, packedOpSnippet: FLOOR, cpuKernelImpl: floorImplCPU });\nexport const floorConfig = {\n kernelName: Floor,\n backendName: 'webgl',\n kernelFunc: floor,\n};\n//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiRmxvb3IuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi8uLi90ZmpzLWJhY2tlbmQtd2ViZ2wvc3JjL2tlcm5lbHMvRmxvb3IudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQ0E7Ozs7Ozs7Ozs7Ozs7OztHQWVHO0FBRUgsT0FBTyxFQUFDLEtBQUssRUFBZSxNQUFNLHVCQUF1QixDQUFDO0FBQzFELE9BQU8sRUFBQyxlQUFlLEVBQUMsTUFBTSxvQ0FBb0MsQ0FBQztBQUNuRSxPQUFPLEVBQUMsWUFBWSxFQUFDLE1BQU0sd0JBQXdCLENBQUM7QUFFcEQsTUFBTSxLQUFLLEdBQUcsa0JBQWtCLENBQUM7QUFFakMsTUFBTSxDQUFDLE1BQU0sS0FBSyxHQUFHLGVBQWUsQ0FDaEMsRUFBQyxTQUFTLEVBQUUsS0FBSyxFQUFFLGVBQWUsRUFBRSxLQUFLLEVBQUUsYUFBYSxFQUFFLFlBQVksRUFBQyxDQUFDLENBQUM7QUFFN0UsTUFBTSxDQUFDLE1BQU0sV0FBVyxHQUFpQjtJQUN2QyxVQUFVLEVBQUUsS0FBSztJQUNqQixXQUFXLEVBQUUsT0FBTztJQUNwQixVQUFVLEVBQUUsS0FBSztDQUNsQixDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiXG4vKipcbiAqIEBsaWNlbnNlXG4gKiBDb3B5cmlnaHQgMjAyMCBHb29nbGUgTExDLiBBbGwgUmlnaHRzIFJlc2VydmVkLlxuICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlIFwiTGljZW5zZVwiKTtcbiAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS5cbiAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdFxuICpcbiAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMFxuICpcbiAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmVcbiAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuIFwiQVMgSVNcIiBCQVNJUyxcbiAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLlxuICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZFxuICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuXG4gKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuICovXG5cbmltcG9ydCB7Rmxvb3IsIEtlcm5lbENvbmZpZ30gZnJvbSAnQHRlbnNvcmZsb3cvdGZqcy1jb3JlJztcbmltcG9ydCB7dW5hcnlLZXJuZWxGdW5jfSBmcm9tICcuLi9rZXJuZWxfdXRpbHMva2VybmVsX2Z1bmNzX3V0aWxzJztcbmltcG9ydCB7Zmxvb3JJbXBsQ1BVfSBmcm9tICcuLi9rZXJuZWxfdXRpbHMvc2hhcmVkJztcblxuY29uc3QgRkxPT1IgPSBgcmV0dXJuIGZsb29yKHgpO2A7XG5cbmV4cG9ydCBjb25zdCBmbG9vciA9IHVuYXJ5S2VybmVsRnVuYyhcbiAgICB7b3BTbmlwcGV0OiBGTE9PUiwgcGFja2VkT3BTbmlwcGV0OiBGTE9PUiwgY3B1S2VybmVsSW1wbDogZmxvb3JJbXBsQ1BVfSk7XG5cbmV4cG9ydCBjb25zdCBmbG9vckNvbmZpZzogS2VybmVsQ29uZmlnID0ge1xuICBrZXJuZWxOYW1lOiBGbG9vcixcbiAgYmFja2VuZE5hbWU6ICd3ZWJnbCcsXG4gIGtlcm5lbEZ1bmM6IGZsb29yLFxufTtcbiJdfQ==","/**\n * @license\n * Copyright 2020 Google LLC. All Rights Reserved.\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n * =============================================================================\n */\nimport { FloorDiv } from '@tensorflow/tfjs-core';\nimport { binaryKernelFunc } from '../kernel_utils/kernel_funcs_utils';\n// We use native integer division to deal with floating point imprecision. Since\n// we implement floor division and glsl implements truncated division, we\n// correct for this by subtracting 1 from result when the result is negative and\n// there is a remainder.\nconst INT_DIV = `\n float s = sign(a) * sign(b);\n int ia = round(a);\n int ib = round(b);\n if (ib != 0) {\n // Windows (D3D) wants guaranteed non-zero int division at compile-time.\n return float(idiv(ia, ib, s));\n } else {\n return NAN;\n }\n`;\nconst INT_DIV_PACKED = `\n ivec4 ia = round(a);\n ivec4 ib = round(b);\n bvec4 cond = notEqual(ib, ivec4(0));\n ivec4 result = ivec4(0);\n vec4 s = sign(a) * sign(b);\n\n // Windows (D3D) wants guaranteed non-zero int division at compile-time.\n if (cond[0]) {\n result[0] = idiv(ia[0], ib[0], s[0]);\n }\n if (cond[1]) {\n result[1] = idiv(ia[1], ib[1], s[1]);\n }\n if (cond[2]) {\n result[2] = idiv(ia[2], ib[2], s[2]);\n }\n if (cond[3]) {\n result[3] = idiv(ia[3], ib[3], s[3]);\n }\n return vec4(result);\n`;\nexport const floorDiv = binaryKernelFunc({ opSnippet: INT_DIV, packedOpSnippet: INT_DIV_PACKED, dtype: 'int32' });\nexport const floorDivConfig = {\n kernelName: FloorDiv,\n backendName: 'webgl',\n kernelFunc: floorDiv\n};\n//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiRmxvb3JEaXYuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi8uLi90ZmpzLWJhY2tlbmQtd2ViZ2wvc3JjL2tlcm5lbHMvRmxvb3JEaXYudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUE7Ozs7Ozs7Ozs7Ozs7OztHQWVHO0FBRUgsT0FBTyxFQUFDLFFBQVEsRUFBMkIsTUFBTSx1QkFBdUIsQ0FBQztBQUV6RSxPQUFPLEVBQUMsZ0JBQWdCLEVBQUMsTUFBTSxvQ0FBb0MsQ0FBQztBQUVwRSxnRkFBZ0Y7QUFDaEYseUVBQXlFO0FBQ3pFLGdGQUFnRjtBQUNoRix3QkFBd0I7QUFDeEIsTUFBTSxPQUFPLEdBQUc7Ozs7Ozs7Ozs7Q0FVZixDQUFDO0FBRUYsTUFBTSxjQUFjLEdBQUc7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7OztDQXFCdEIsQ0FBQztBQUVGLE1BQU0sQ0FBQyxNQUFNLFFBQVEsR0FBRyxnQkFBZ0IsQ0FDcEMsRUFBQyxTQUFTLEVBQUUsT0FBTyxFQUFFLGVBQWUsRUFBRSxjQUFjLEVBQUUsS0FBSyxFQUFFLE9BQU8sRUFBQyxDQUFDLENBQUM7QUFFM0UsTUFBTSxDQUFDLE1BQU0sY0FBYyxHQUFpQjtJQUMxQyxVQUFVLEVBQUUsUUFBUTtJQUNwQixXQUFXLEVBQUUsT0FBTztJQUNwQixVQUFVLEVBQUUsUUFBNEI7Q0FDekMsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbIi8qKlxuICogQGxpY2Vuc2VcbiAqIENvcHlyaWdodCAyMDIwIEdvb2dsZSBMTEMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuXG4gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgXCJMaWNlbnNlXCIpO1xuICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLlxuICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0XG4gKlxuICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wXG4gKlxuICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZVxuICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gXCJBUyBJU1wiIEJBU0lTLFxuICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuXG4gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kXG4gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS5cbiAqID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4gKi9cblxuaW1wb3J0IHtGbG9vckRpdiwgS2VybmVsQ29uZmlnLCBLZXJuZWxGdW5jfSBmcm9tICdAdGVuc29yZmxvdy90ZmpzLWNvcmUnO1xuXG5pbXBvcnQge2JpbmFyeUtlcm5lbEZ1bmN9IGZyb20gJy4uL2tlcm5lbF91dGlscy9rZXJuZWxfZnVuY3NfdXRpbHMnO1xuXG4vLyBXZSB1c2UgbmF0aXZlIGludGVnZXIgZGl2aXNpb24gdG8gZGVhbCB3aXRoIGZsb2F0aW5nIHBvaW50IGltcHJlY2lzaW9uLiBTaW5jZVxuLy8gd2UgaW1wbGVtZW50IGZsb29yIGRpdmlzaW9uIGFuZCBnbHNsIGltcGxlbWVudHMgdHJ1bmNhdGVkIGRpdmlzaW9uLCB3ZVxuLy8gY29ycmVjdCBmb3IgdGhpcyBieSBzdWJ0cmFjdGluZyAxIGZyb20gcmVzdWx0IHdoZW4gdGhlIHJlc3VsdCBpcyBuZWdhdGl2ZSBhbmRcbi8vIHRoZXJlIGlzIGEgcmVtYWluZGVyLlxuY29uc3QgSU5UX0RJViA9IGBcbiAgZmxvYXQgcyA9IHNpZ24oYSkgKiBzaWduKGIpO1xuICBpbnQgaWEgPSByb3VuZChhKTtcbiAgaW50IGliID0gcm91bmQoYik7XG4gIGlmIChpYiAhPSAwKSB7XG4gICAgLy8gV2luZG93cyAoRDNEKSB3YW50cyBndWFyYW50ZWVkIG5vbi16ZXJvIGludCBkaXZpc2lvbiBhdCBjb21waWxlLXRpbWUuXG4gICAgcmV0dXJuIGZsb2F0KGlkaXYoaWEsIGliLCBzKSk7XG4gIH0gZWxzZSB7XG4gICAgcmV0dXJuIE5BTjtcbiAgfVxuYDtcblxuY29uc3QgSU5UX0RJVl9QQUNLRUQgPSBgXG4gIGl2ZWM0IGlhID0gcm91bmQoYSk7XG4gIGl2ZWM0IGliID0gcm91bmQoYik7XG4gIGJ2ZWM0IGNvbmQgPSBub3RFcXVhbChpYiwgaXZlYzQoMCkpO1xuICBpdmVjNCByZXN1bHQgPSBpdmVjNCgwKTtcbiAgdmVjNCBzID0gc2lnbihhKSAqIHNpZ24oYik7XG5cbiAgLy8gV2luZG93cyAoRDNEKSB3YW50cyBndWFyYW50ZWVkIG5vbi16ZXJvIGludCBkaXZpc2lvbiBhdCBjb21waWxlLXRpbWUuXG4gIGlmIChjb25kWzBdKSB7XG4gICAgcmVzdWx0WzBdID0gaWRpdihpYVswXSwgaWJbMF0sIHNbMF0pO1xuICB9XG4gIGlmIChjb25kWzFdKSB7XG4gICAgcmVzdWx0WzFdID0gaWRpdihpYVsxXSwgaWJbMV0sIHNbMV0pO1xuICB9XG4gIGlmIChjb25kWzJdKSB7XG4gICAgcmVzdWx0WzJdID0gaWRpdihpYVsyXSwgaWJbMl0sIHNbMl0pO1xuICB9XG4gIGlmIChjb25kWzNdKSB7XG4gICAgcmVzdWx0WzNdID0gaWRpdihpYVszXSwgaWJbM10sIHNbM10pO1xuICB9XG4gIHJldHVybiB2ZWM0KHJlc3VsdCk7XG5gO1xuXG5leHBvcnQgY29uc3QgZmxvb3JEaXYgPSBiaW5hcnlLZXJuZWxGdW5jKFxuICAgIHtvcFNuaXBwZXQ6IElOVF9ESVYsIHBhY2tlZE9wU25pcHBldDogSU5UX0RJVl9QQUNLRUQsIGR0eXBlOiAnaW50MzInfSk7XG5cbmV4cG9ydCBjb25zdCBmbG9vckRpdkNvbmZpZzogS2VybmVsQ29uZmlnID0ge1xuICBrZXJuZWxOYW1lOiBGbG9vckRpdixcbiAgYmFja2VuZE5hbWU6ICd3ZWJnbCcsXG4gIGtlcm5lbEZ1bmM6IGZsb29yRGl2IGFzIHt9IGFzIEtlcm5lbEZ1bmNcbn07XG4iXX0=","/**\n * @license\n * Copyright 2018 Google LLC. All Rights Reserved.\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n * =============================================================================\n */\nimport { getGlslDifferences } from '../../glsl_version';\nexport class FromPixelsProgram {\n constructor(outputShape) {\n this.variableNames = ['A'];\n const glsl = getGlslDifferences();\n const [height, width,] = outputShape;\n this.outputShape = outputShape;\n this.userCode = `\n void main() {\n ivec3 coords = getOutputCoords();\n int texR = coords[0];\n int texC = coords[1];\n int depth = coords[2];\n vec2 uv = (vec2(texC, texR) + halfCR) / vec2(${width}.0, ${height}.0);\n\n vec4 values = ${glsl.texture2D}(A, uv);\n float value;\n if (depth == 0) {\n value = values.r;\n } else if (depth == 1) {\n value = values.g;\n } else if (depth == 2) {\n value = values.b;\n } else if (depth == 3) {\n value = values.a;\n }\n\n setOutput(floor(value * 255.0 + 0.5));\n }\n `;\n }\n}\n//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZnJvbV9waXhlbHNfZ3B1LmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vLi4vLi4vdGZqcy1iYWNrZW5kLXdlYmdsL3NyYy9rZXJuZWxzL0Zyb21QaXhlbHNfdXRpbHMvZnJvbV9waXhlbHNfZ3B1LnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBOzs7Ozs7Ozs7Ozs7Ozs7R0FlRztBQUVILE9BQU8sRUFBQyxrQkFBa0IsRUFBQyxNQUFNLG9CQUFvQixDQUFDO0FBR3RELE1BQU0sT0FBTyxpQkFBaUI7SUFLNUIsWUFBWSxXQUFxQjtRQUpqQyxrQkFBYSxHQUFHLENBQUMsR0FBRyxDQUFDLENBQUM7UUFLcEIsTUFBTSxJQUFJLEdBQUcsa0JBQWtCLEVBQUUsQ0FBQztRQUNsQyxNQUFNLENBQUMsTUFBTSxFQUFFLEtBQUssRUFBRyxHQUFHLFdBQVcsQ0FBQztRQUN0QyxJQUFJLENBQUMsV0FBVyxHQUFHLFdBQVcsQ0FBQztRQUMvQixJQUFJLENBQUMsUUFBUSxHQUFHOzs7Ozs7dURBTW1DLEtBQUssT0FBTyxNQUFNOzt3QkFFakQsSUFBSSxDQUFDLFNBQVM7Ozs7Ozs7Ozs7Ozs7O0tBY2pDLENBQUM7SUFDSixDQUFDO0NBQ0YiLCJzb3VyY2VzQ29udGVudCI6WyIvKipcbiAqIEBsaWNlbnNlXG4gKiBDb3B5cmlnaHQgMjAxOCBHb29nbGUgTExDLiBBbGwgUmlnaHRzIFJlc2VydmVkLlxuICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlIFwiTGljZW5zZVwiKTtcbiAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS5cbiAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdFxuICpcbiAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMFxuICpcbiAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmVcbiAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuIFwiQVMgSVNcIiBCQVNJUyxcbiAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLlxuICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZFxuICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuXG4gKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuICovXG5cbmltcG9ydCB7Z2V0R2xzbERpZmZlcmVuY2VzfSBmcm9tICcuLi8uLi9nbHNsX3ZlcnNpb24nO1xuaW1wb3J0IHtHUEdQVVByb2dyYW19IGZyb20gJy4uLy4uL2dwZ3B1X21hdGgnO1xuXG5leHBvcnQgY2xhc3MgRnJvbVBpeGVsc1Byb2dyYW0gaW1wbGVtZW50cyBHUEdQVVByb2dyYW0ge1xuICB2YXJpYWJsZU5hbWVzID0gWydBJ107XG4gIHVzZXJDb2RlOiBzdHJpbmc7XG4gIG91dHB1dFNoYXBlOiBudW1iZXJbXTtcblxuICBjb25zdHJ1Y3RvcihvdXRwdXRTaGFwZTogbnVtYmVyW10pIHtcbiAgICBjb25zdCBnbHNsID0gZ2V0R2xzbERpZmZlcmVuY2VzKCk7XG4gICAgY29uc3QgW2hlaWdodCwgd2lkdGgsIF0gPSBvdXRwdXRTaGFwZTtcbiAgICB0aGlzLm91dHB1dFNoYXBlID0gb3V0cHV0U2hhcGU7XG4gICAgdGhpcy51c2VyQ29kZSA9IGBcbiAgICAgIHZvaWQgbWFpbigpIHtcbiAgICAgICAgaXZlYzMgY29vcmRzID0gZ2V0T3V0cHV0Q29vcmRzKCk7XG4gICAgICAgIGludCB0ZXhSID0gY29vcmRzWzBdO1xuICAgICAgICBpbnQgdGV4QyA9IGNvb3Jkc1sxXTtcbiAgICAgICAgaW50IGRlcHRoID0gY29vcmRzWzJdO1xuICAgICAgICB2ZWMyIHV2ID0gKHZlYzIodGV4QywgdGV4UikgKyBoYWxmQ1IpIC8gdmVjMigke3dpZHRofS4wLCAke2hlaWdodH0uMCk7XG5cbiAgICAgICAgdmVjNCB2YWx1ZXMgPSAke2dsc2wudGV4dHVyZTJEfShBLCB1dik7XG4gICAgICAgIGZsb2F0IHZhbHVlO1xuICAgICAgICBpZiAoZGVwdGggPT0gMCkge1xuICAgICAgICAgIHZhbHVlID0gdmFsdWVzLnI7XG4gICAgICAgIH0gZWxzZSBpZiAoZGVwdGggPT0gMSkge1xuICAgICAgICAgIHZhbHVlID0gdmFsdWVzLmc7XG4gICAgICAgIH0gZWxzZSBpZiAoZGVwdGggPT0gMikge1xuICAgICAgICAgIHZhbHVlID0gdmFsdWVzLmI7XG4gICAgICAgIH0gZWxzZSBpZiAoZGVwdGggPT0gMykge1xuICAgICAgICAgIHZhbHVlID0gdmFsdWVzLmE7XG4gICAgICAgIH1cblxuICAgICAgICBzZXRPdXRwdXQoZmxvb3IodmFsdWUgKiAyNTUuMCArIDAuNSkpO1xuICAgICAgfVxuICAgIGA7XG4gIH1cbn1cbiJdfQ==","/**\n * @license\n * Copyright 2018 Google LLC. All Rights Reserved.\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n * =============================================================================\n */\nimport { getGlslDifferences } from '../../glsl_version';\nexport class FromPixelsPackedProgram {\n constructor(outputShape) {\n this.variableNames = ['A'];\n this.packedInputs = false;\n this.packedOutput = true;\n const glsl = getGlslDifferences();\n const [height, width,] = outputShape;\n this.outputShape = outputShape;\n this.userCode = `\n void main() {\n ivec3 coords = getOutputCoords();\n int texR = coords[0];\n int texC = coords[1];\n int depth = coords[2];\n\n vec4 result = vec4(0.);\n\n for(int row=0; row<=1; row++) {\n for(int col=0; col<=1; col++) {\n texC = coords[1] + row;\n depth = coords[2] + col;\n\n vec2 uv = (vec2(texC, texR) + halfCR) /\n vec2(${width}.0, ${height}.0);\n vec4 values = ${glsl.texture2D}(A, uv);\n float value;\n if (depth == 0) {\n value = values.r;\n } else if (depth == 1) {\n value = values.g;\n } else if (depth == 2) {\n value = values.b;\n } else if (depth == 3) {\n value = values.a;\n }\n\n result[row * 2 + col] = floor(value * 255.0 + 0.5);\n }\n }\n\n ${glsl.output} = result;\n }\n `;\n }\n}\n//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZnJvbV9waXhlbHNfcGFja2VkX2dwdS5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uLy4uLy4uL3RmanMtYmFja2VuZC13ZWJnbC9zcmMva2VybmVscy9Gcm9tUGl4ZWxzX3V0aWxzL2Zyb21fcGl4ZWxzX3BhY2tlZF9ncHUudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUE7Ozs7Ozs7Ozs7Ozs7OztHQWVHO0FBRUgsT0FBTyxFQUFDLGtCQUFrQixFQUFDLE1BQU0sb0JBQW9CLENBQUM7QUFHdEQsTUFBTSxPQUFPLHVCQUF1QjtJQU9sQyxZQUFZLFdBQXFCO1FBTmpDLGtCQUFhLEdBQUcsQ0FBQyxHQUFHLENBQUMsQ0FBQztRQUd0QixpQkFBWSxHQUFHLEtBQUssQ0FBQztRQUNyQixpQkFBWSxHQUFHLElBQUksQ0FBQztRQUdsQixNQUFNLElBQUksR0FBRyxrQkFBa0IsRUFBRSxDQUFDO1FBQ2xDLE1BQU0sQ0FBQyxNQUFNLEVBQUUsS0FBSyxFQUFHLEdBQUcsV0FBVyxDQUFDO1FBQ3RDLElBQUksQ0FBQyxXQUFXLEdBQUcsV0FBVyxDQUFDO1FBQy9CLElBQUksQ0FBQyxRQUFRLEdBQUc7Ozs7Ozs7Ozs7Ozs7Ozs4QkFlVSxLQUFLLE9BQU8sTUFBTTs0QkFDcEIsSUFBSSxDQUFDLFNBQVM7Ozs7Ozs7Ozs7Ozs7Ozs7VUFnQmhDLElBQUksQ0FBQyxNQUFNOztLQUVoQixDQUFDO0lBQ0osQ0FBQztDQUNGIiwic291cmNlc0NvbnRlbnQiOlsiLyoqXG4gKiBAbGljZW5zZVxuICogQ29weXJpZ2h0IDIwMTggR29vZ2xlIExMQy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC5cbiAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSBcIkxpY2Vuc2VcIik7XG4gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuXG4gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXRcbiAqXG4gKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjBcbiAqXG4gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlXG4gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiBcIkFTIElTXCIgQkFTSVMsXG4gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC5cbiAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmRcbiAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLlxuICogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbiAqL1xuXG5pbXBvcnQge2dldEdsc2xEaWZmZXJlbmNlc30gZnJvbSAnLi4vLi4vZ2xzbF92ZXJzaW9uJztcbmltcG9ydCB7R1BHUFVQcm9ncmFtfSBmcm9tICcuLi8uLi9ncGdwdV9tYXRoJztcblxuZXhwb3J0IGNsYXNzIEZyb21QaXhlbHNQYWNrZWRQcm9ncmFtIGltcGxlbWVudHMgR1BHUFVQcm9ncmFtIHtcbiAgdmFyaWFibGVOYW1lcyA9IFsnQSddO1xuICB1c2VyQ29kZTogc3RyaW5nO1xuICBvdXRwdXRTaGFwZTogbnVtYmVyW107XG4gIHBhY2tlZElucHV0cyA9IGZhbHNlO1xuICBwYWNrZWRPdXRwdXQgPSB0cnVlO1xuXG4gIGNvbnN0cnVjdG9yKG91dHB1dFNoYXBlOiBudW1iZXJbXSkge1xuICAgIGNvbnN0IGdsc2wgPSBnZXRHbHNsRGlmZmVyZW5jZXMoKTtcbiAgICBjb25zdCBbaGVpZ2h0LCB3aWR0aCwgXSA9IG91dHB1dFNoYXBlO1xuICAgIHRoaXMub3V0cHV0U2hhcGUgPSBvdXRwdXRTaGFwZTtcbiAgICB0aGlzLnVzZXJDb2RlID0gYFxuICAgICAgdm9pZCBtYWluKCkge1xuICAgICAgICBpdmVjMyBjb29yZHMgPSBnZXRPdXRwdXRDb29yZHMoKTtcbiAgICAgICAgaW50IHRleFIgPSBjb29yZHNbMF07XG4gICAgICAgIGludCB0ZXhDID0gY29vcmRzWzFdO1xuICAgICAgICBpbnQgZGVwdGggPSBjb29yZHNbMl07XG5cbiAgICAgICAgdmVjNCByZXN1bHQgPSB2ZWM0KDAuKTtcblxuICAgICAgICBmb3IoaW50IHJvdz0wOyByb3c8PTE7IHJvdysrKSB7XG4gICAgICAgICAgZm9yKGludCBjb2w9MDsgY29sPD0xOyBjb2wrKykge1xuICAgICAgICAgICAgdGV4QyA9IGNvb3Jkc1sxXSArIHJvdztcbiAgICAgICAgICAgIGRlcHRoID0gY29vcmRzWzJdICsgY29sO1xuXG4gICAgICAgICAgICB2ZWMyIHV2ID0gKHZlYzIodGV4QywgdGV4UikgKyBoYWxmQ1IpIC9cbiAgICAgICAgICAgICAgICAgICAgICAgdmVjMigke3dpZHRofS4wLCAke2hlaWdodH0uMCk7XG4gICAgICAgICAgICB2ZWM0IHZhbHVlcyA9ICR7Z2xzbC50ZXh0dXJlMkR9KEEsIHV2KTtcbiAgICAgICAgICAgIGZsb2F0IHZhbHVlO1xuICAgICAgICAgICAgaWYgKGRlcHRoID09IDApIHtcbiAgICAgICAgICAgICAgdmFsdWUgPSB2YWx1ZXMucjtcbiAgICAgICAgICAgIH0gZWxzZSBpZiAoZGVwdGggPT0gMSkge1xuICAgICAgICAgICAgICB2YWx1ZSA9IHZhbHVlcy5nO1xuICAgICAgICAgICAgfSBlbHNlIGlmIChkZXB0aCA9PSAyKSB7XG4gICAgICAgICAgICAgIHZhbHVlID0gdmFsdWVzLmI7XG4gICAgICAgICAgICB9IGVsc2UgaWYgKGRlcHRoID09IDMpIHtcbiAgICAgICAgICAgICAgdmFsdWUgPSB2YWx1ZXMuYTtcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgcmVzdWx0W3JvdyAqIDIgKyBjb2xdID0gZmxvb3IodmFsdWUgKiAyNTUuMCArIDAuNSk7XG4gICAgICAgICAgfVxuICAgICAgICB9XG5cbiAgICAgICAgJHtnbHNsLm91dHB1dH0gPSByZXN1bHQ7XG4gICAgICB9XG4gICAgYDtcbiAgfVxufVxuIl19","/**\n * @license\n * Copyright 2019 Google LLC. All Rights Reserved.\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n * =============================================================================\n */\nimport { env } from '@tensorflow/tfjs-core';\nimport { FromPixels } from '@tensorflow/tfjs-core';\nimport { TextureUsage } from '../tex_util';\nimport { FromPixelsProgram } from './FromPixels_utils/from_pixels_gpu';\nimport { FromPixelsPackedProgram } from './FromPixels_utils/from_pixels_packed_gpu';\nexport const fromPixelsConfig = {\n kernelName: FromPixels,\n backendName: 'webgl',\n kernelFunc: fromPixels,\n};\nlet fromPixels2DContext;\nlet willReadFrequently = env().getBool('CANVAS2D_WILL_READ_FREQUENTLY_FOR_GPU');\nfunction fromPixels(args) {\n const { inputs, backend, attrs } = args;\n let { pixels } = inputs;\n const { numChannels } = attrs;\n const isVideo = typeof (HTMLVideoElement) !== 'undefined' &&\n pixels instanceof HTMLVideoElement;\n const isImage = typeof (HTMLImageElement) !== 'undefined' &&\n pixels instanceof HTMLImageElement;\n const [width, height] = isVideo ?\n [\n pixels.videoWidth,\n pixels.videoHeight\n ] :\n [pixels.width, pixels.height];\n const texShape = [height, width];\n const outShape = [height, width, numChannels];\n if (isImage || isVideo) {\n const newWillReadFrequently = env().getBool('CANVAS2D_WILL_READ_FREQUENTLY_FOR_GPU');\n if (fromPixels2DContext == null ||\n newWillReadFrequently !== willReadFrequently) {\n willReadFrequently = newWillReadFrequently;\n fromPixels2DContext =\n document.createElement('canvas').getContext('2d', { willReadFrequently });\n }\n fromPixels2DContext.canvas.width = width;\n fromPixels2DContext.canvas.height = height;\n fromPixels2DContext.drawImage(pixels, 0, 0, width, height);\n pixels = fromPixels2DContext.canvas;\n }\n const tempPixelHandle = backend.makeTensorInfo(texShape, 'int32');\n // This is a byte texture with pixels.\n backend.texData.get(tempPixelHandle.dataId).usage = TextureUsage.PIXELS;\n backend.gpgpu.uploadPixelDataToTexture(backend.getTexture(tempPixelHandle.dataId), pixels);\n const program = env().getBool('WEBGL_PACK') ?\n new FromPixelsPackedProgram(outShape) :\n new FromPixelsProgram(outShape);\n const res = backend.runWebGLProgram(program, [tempPixelHandle], 'int32');\n backend.disposeData(tempPixelHandle.dataId);\n return res;\n}\n//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiRnJvbVBpeGVscy5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uLy4uL3RmanMtYmFja2VuZC13ZWJnbC9zcmMva2VybmVscy9Gcm9tUGl4ZWxzLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBOzs7Ozs7Ozs7Ozs7Ozs7R0FlRztBQUVILE9BQU8sRUFBQyxHQUFHLEVBQXVDLE1BQU0sdUJBQXVCLENBQUM7QUFDaEYsT0FBTyxFQUFDLFVBQVUsRUFBb0MsTUFBTSx1QkFBdUIsQ0FBQztBQUdwRixPQUFPLEVBQUMsWUFBWSxFQUFDLE1BQU0sYUFBYSxDQUFDO0FBRXpDLE9BQU8sRUFBQyxpQkFBaUIsRUFBQyxNQUFNLG9DQUFvQyxDQUFDO0FBQ3JFLE9BQU8sRUFBQyx1QkFBdUIsRUFBQyxNQUFNLDJDQUEyQyxDQUFDO0FBRWxGLE1BQU0sQ0FBQyxNQUFNLGdCQUFnQixHQUFpQjtJQUM1QyxVQUFVLEVBQUUsVUFBVTtJQUN0QixXQUFXLEVBQUUsT0FBTztJQUNwQixVQUFVLEVBQUUsVUFBOEI7Q0FDM0MsQ0FBQztBQUVGLElBQUksbUJBQTZDLENBQUM7QUFDbEQsSUFBSSxrQkFBa0IsR0FBRyxHQUFHLEVBQUUsQ0FBQyxPQUFPLENBQUMsdUNBQXVDLENBQUMsQ0FBQztBQUVoRixTQUFTLFVBQVUsQ0FBQyxJQUluQjtJQUNDLE1BQU0sRUFBQyxNQUFNLEVBQUUsT0FBTyxFQUFFLEtBQUssRUFBQyxHQUFHLElBQUksQ0FBQztJQUN0QyxJQUFJLEVBQUMsTUFBTSxFQUFDLEdBQUcsTUFBTSxDQUFDO0lBQ3RCLE1BQU0sRUFBQyxXQUFXLEVBQUMsR0FBRyxLQUFLLENBQUM7SUFFNUIsTUFBTSxPQUFPLEdBQUcsT0FBTyxDQUFDLGdCQUFnQixDQUFDLEtBQUssV0FBVztRQUNyRCxNQUFNLFlBQVksZ0JBQWdCLENBQUM7SUFDdkMsTUFBTSxPQUFPLEdBQUcsT0FBTyxDQUFDLGdCQUFnQixDQUFDLEtBQUssV0FBVztRQUNyRCxNQUFNLFlBQVksZ0JBQWdCLENBQUM7SUFDdkMsTUFBTSxDQUFDLEtBQUssRUFBRSxNQUFNLENBQUMsR0FBRyxPQUFPLENBQUMsQ0FBQztRQUM3QjtZQUNHLE1BQTJCLENBQUMsVUFBVTtZQUN0QyxNQUEyQixDQUFDLFdBQVc7U0FDekMsQ0FBQyxDQUFDO1FBQ0gsQ0FBQyxNQUFNLENBQUMsS0FBSyxFQUFFLE1BQU0sQ0FBQyxNQUFNLENBQUMsQ0FBQztJQUVsQyxNQUFNLFFBQVEsR0FBcUIsQ0FBQyxNQUFNLEVBQUUsS0FBSyxDQUFDLENBQUM7SUFDbkQsTUFBTSxRQUFRLEdBQUcsQ0FBQyxNQUFNLEVBQUUsS0FBSyxFQUFFLFdBQVcsQ0FBQyxDQUFDO0lBRTlDLElBQUksT0FBTyxJQUFJLE9BQU8sRUFBRTtRQUN0QixNQUFNLHFCQUFxQixHQUN2QixHQUFHLEVBQUUsQ0FBQyxPQUFPLENBQUMsdUNBQXVDLENBQUMsQ0FBQztRQUMzRCxJQUFJLG1CQUFtQixJQUFJLElBQUk7WUFDM0IscUJBQXFCLEtBQUssa0JBQWtCLEVBQUU7WUFDaEQsa0JBQWtCLEdBQUcscUJBQXFCLENBQUM7WUFDM0MsbUJBQW1CO2dCQUNmLFFBQVEsQ0FBQyxhQUFhLENBQUMsUUFBUSxDQUFDLENBQUMsVUFBVSxDQUN2QyxJQUFJLEVBQUUsRUFBQyxrQkFBa0IsRUFBQyxDQUE2QixDQUFDO1NBQ2pFO1FBRUQsbUJBQW1CLENBQUMsTUFBTSxDQUFDLEtBQUssR0FBRyxLQUFLLENBQUM7UUFDekMsbUJBQW1CLENBQUMsTUFBTSxDQUFDLE1BQU0sR0FBRyxNQUFNLENBQUM7UUFDM0MsbUJBQW1CLENBQUMsU0FBUyxDQUN6QixNQUEyRCxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQ2pFLEtBQUssRUFBRSxNQUFNLENBQUMsQ0FBQztRQUNuQixNQUFNLEdBQUcsbUJBQW1CLENBQUMsTUFBTSxDQUFDO0tBQ3JDO0lBRUQsTUFBTSxlQUFlLEdBQUcsT0FBTyxDQUFDLGNBQWMsQ0FBQyxRQUFRLEVBQUUsT0FBTyxDQUFDLENBQUM7SUFDbEUsc0NBQXNDO0lBQ3RDLE9BQU8sQ0FBQyxPQUFPLENBQUMsR0FBRyxDQUFDLGVBQWUsQ0FBQyxNQUFNLENBQUMsQ0FBQyxLQUFLLEdBQUcsWUFBWSxDQUFDLE1BQU0sQ0FBQztJQUN4RSxPQUFPLENBQUMsS0FBSyxDQUFDLHdCQUF3QixDQUNsQyxPQUFPLENBQUMsVUFBVSxDQUFDLGVBQWUsQ0FBQyxNQUFNLENBQUMsRUFBRSxNQUFtQixDQUFDLENBQUM7SUFDckUsTUFBTSxPQUFPLEdBQUcsR0FBRyxFQUFFLENBQUMsT0FBTyxDQUFDLFlBQVksQ0FBQyxDQUFDLENBQUM7UUFDekMsSUFBSSx1QkFBdUIsQ0FBQyxRQUFRLENBQUMsQ0FBQyxDQUFDO1FBQ3ZDLElBQUksaUJBQWlCLENBQUMsUUFBUSxDQUFDLENBQUM7SUFDcEMsTUFBTSxHQUFHLEdBQUcsT0FBTyxDQUFDLGVBQWUsQ0FBQyxPQUFPLEVBQUUsQ0FBQyxlQUFlLENBQUMsRUFBRSxPQUFPLENBQUMsQ0FBQztJQUN6RSxPQUFPLENBQUMsV0FBVyxDQUFDLGVBQWUsQ0FBQyxNQUFNLENBQUMsQ0FBQztJQUM1QyxPQUFPLEdBQUcsQ0FBQztBQUNiLENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyIvKipcbiAqIEBsaWNlbnNlXG4gKiBDb3B5cmlnaHQgMjAxOSBHb29nbGUgTExDLiBBbGwgUmlnaHRzIFJlc2VydmVkLlxuICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlIFwiTGljZW5zZVwiKTtcbiAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS5cbiAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdFxuICpcbiAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMFxuICpcbiAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmVcbiAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuIFwiQVMgSVNcIiBCQVNJUyxcbiAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLlxuICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZFxuICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuXG4gKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuICovXG5cbmltcG9ydCB7ZW52LCBLZXJuZWxDb25maWcsIEtlcm5lbEZ1bmMsIFRlbnNvckluZm99IGZyb20gJ0B0ZW5zb3JmbG93L3RmanMtY29yZSc7XG5pbXBvcnQge0Zyb21QaXhlbHMsIEZyb21QaXhlbHNBdHRycywgRnJvbVBpeGVsc0lucHV0c30gZnJvbSAnQHRlbnNvcmZsb3cvdGZqcy1jb3JlJztcblxuaW1wb3J0IHtNYXRoQmFja2VuZFdlYkdMfSBmcm9tICcuLi9iYWNrZW5kX3dlYmdsJztcbmltcG9ydCB7VGV4dHVyZVVzYWdlfSBmcm9tICcuLi90ZXhfdXRpbCc7XG5cbmltcG9ydCB7RnJvbVBpeGVsc1Byb2dyYW19IGZyb20gJy4vRnJvbVBpeGVsc191dGlscy9mcm9tX3BpeGVsc19ncHUnO1xuaW1wb3J0IHtGcm9tUGl4ZWxzUGFja2VkUHJvZ3JhbX0gZnJvbSAnLi9Gcm9tUGl4ZWxzX3V0aWxzL2Zyb21fcGl4ZWxzX3BhY2tlZF9ncHUnO1xuXG5leHBvcnQgY29uc3QgZnJvbVBpeGVsc0NvbmZpZzogS2VybmVsQ29uZmlnID0ge1xuICBrZXJuZWxOYW1lOiBGcm9tUGl4ZWxzLFxuICBiYWNrZW5kTmFtZTogJ3dlYmdsJyxcbiAga2VybmVsRnVuYzogZnJvbVBpeGVscyBhcyB7fSBhcyBLZXJuZWxGdW5jLFxufTtcblxubGV0IGZyb21QaXhlbHMyRENvbnRleHQ6IENhbnZhc1JlbmRlcmluZ0NvbnRleHQyRDtcbmxldCB3aWxsUmVhZEZyZXF1ZW50bHkgPSBlbnYoKS5nZXRCb29sKCdDQU5WQVMyRF9XSUxMX1JFQURfRlJFUVVFTlRMWV9GT1JfR1BVJyk7XG5cbmZ1bmN0aW9uIGZyb21QaXhlbHMoYXJnczoge1xuICBpbnB1dHM6IEZyb21QaXhlbHNJbnB1dHMsXG4gIGJhY2tlbmQ6IE1hdGhCYWNrZW5kV2ViR0wsXG4gIGF0dHJzOiBGcm9tUGl4ZWxzQXR0cnNcbn0pOiBUZW5zb3JJbmZvIHtcbiAgY29uc3Qge2lucHV0cywgYmFja2VuZCwgYXR0cnN9ID0gYXJncztcbiAgbGV0IHtwaXhlbHN9ID0gaW5wdXRzO1xuICBjb25zdCB7bnVtQ2hhbm5lbHN9ID0gYXR0cnM7XG5cbiAgY29uc3QgaXNWaWRlbyA9IHR5cGVvZiAoSFRNTFZpZGVvRWxlbWVudCkgIT09ICd1bmRlZmluZWQnICYmXG4gICAgICBwaXhlbHMgaW5zdGFuY2VvZiBIVE1MVmlkZW9FbGVtZW50O1xuICBjb25zdCBpc0ltYWdlID0gdHlwZW9mIChIVE1MSW1hZ2VFbGVtZW50KSAhPT0gJ3VuZGVmaW5lZCcgJiZcbiAgICAgIHBpeGVscyBpbnN0YW5jZW9mIEhUTUxJbWFnZUVsZW1lbnQ7XG4gIGNvbnN0IFt3aWR0aCwgaGVpZ2h0XSA9IGlzVmlkZW8gP1xuICAgICAgW1xuICAgICAgICAocGl4ZWxzIGFzIEhUTUxWaWRlb0VsZW1lbnQpLnZpZGVvV2lkdGgsXG4gICAgICAgIChwaXhlbHMgYXMgSFRNTFZpZGVvRWxlbWVudCkudmlkZW9IZWlnaHRcbiAgICAgIF0gOlxuICAgICAgW3BpeGVscy53aWR0aCwgcGl4ZWxzLmhlaWdodF07XG5cbiAgY29uc3QgdGV4U2hhcGU6IFtudW1iZXIsIG51bWJlcl0gPSBbaGVpZ2h0LCB3aWR0aF07XG4gIGNvbnN0IG91dFNoYXBlID0gW2hlaWdodCwgd2lkdGgsIG51bUNoYW5uZWxzXTtcblxuICBpZiAoaXNJbWFnZSB8fCBpc1ZpZGVvKSB7XG4gICAgY29uc3QgbmV3V2lsbFJlYWRGcmVxdWVudGx5ID1cbiAgICAgICAgZW52KCkuZ2V0Qm9vbCgnQ0FOVkFTMkRfV0lMTF9SRUFEX0ZSRVFVRU5UTFlfRk9SX0dQVScpO1xuICAgIGlmIChmcm9tUGl4ZWxzMkRDb250ZXh0ID09IG51bGwgfHxcbiAgICAgICAgbmV3V2lsbFJlYWRGcmVxdWVudGx5ICE9PSB3aWxsUmVhZEZyZXF1ZW50bHkpIHtcbiAgICAgIHdpbGxSZWFkRnJlcXVlbnRseSA9IG5ld1dpbGxSZWFkRnJlcXVlbnRseTtcbiAgICAgIGZyb21QaXhlbHMyRENvbnRleHQgPVxuICAgICAgICAgIGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ2NhbnZhcycpLmdldENvbnRleHQoXG4gICAgICAgICAgICAgICcyZCcsIHt3aWxsUmVhZEZyZXF1ZW50bHl9KSBhcyBDYW52YXNSZW5kZXJpbmdDb250ZXh0MkQ7XG4gICAgfVxuXG4gICAgZnJvbVBpeGVsczJEQ29udGV4dC5jYW52YXMud2lkdGggPSB3aWR0aDtcbiAgICBmcm9tUGl4ZWxzMkRDb250ZXh0LmNhbnZhcy5oZWlnaHQgPSBoZWlnaHQ7XG4gICAgZnJvbVBpeGVsczJEQ29udGV4dC5kcmF3SW1hZ2UoXG4gICAgICAgIHBpeGVscyBhcyBIVE1MVmlkZW9FbGVtZW50IHwgSFRNTEltYWdlRWxlbWVudCB8IEltYWdlQml0bWFwLCAwLCAwLFxuICAgICAgICB3aWR0aCwgaGVpZ2h0KTtcbiAgICBwaXhlbHMgPSBmcm9tUGl4ZWxzMkRDb250ZXh0LmNhbnZhcztcbiAgfVxuXG4gIGNvbnN0IHRlbXBQaXhlbEhhbmRsZSA9IGJhY2tlbmQubWFrZVRlbnNvckluZm8odGV4U2hhcGUsICdpbnQzMicpO1xuICAvLyBUaGlzIGlzIGEgYnl0ZSB0ZXh0dXJlIHdpdGggcGl4ZWxzLlxuICBiYWNrZW5kLnRleERhdGEuZ2V0KHRlbXBQaXhlbEhhbmRsZS5kYXRhSWQpLnVzYWdlID0gVGV4dHVyZVVzYWdlLlBJWEVMUztcbiAgYmFja2VuZC5ncGdwdS51cGxvYWRQaXhlbERhdGFUb1RleHR1cmUoXG4gICAgICBiYWNrZW5kLmdldFRleHR1cmUodGVtcFBpeGVsSGFuZGxlLmRhdGFJZCksIHBpeGVscyBhcyBJbWFnZURhdGEpO1xuICBjb25zdCBwcm9ncmFtID0gZW52KCkuZ2V0Qm9vbCgnV0VCR0xfUEFDSycpID9cbiAgICAgIG5ldyBGcm9tUGl4ZWxzUGFja2VkUHJvZ3JhbShvdXRTaGFwZSkgOlxuICAgICAgbmV3IEZyb21QaXhlbHNQcm9ncmFtKG91dFNoYXBlKTtcbiAgY29uc3QgcmVzID0gYmFja2VuZC5ydW5XZWJHTFByb2dyYW0ocHJvZ3JhbSwgW3RlbXBQaXhlbEhhbmRsZV0sICdpbnQzMicpO1xuICBiYWNrZW5kLmRpc3Bvc2VEYXRhKHRlbXBQaXhlbEhhbmRsZS5kYXRhSWQpO1xuICByZXR1cm4gcmVzO1xufVxuIl19","/**\n * @license\n * Copyright 2020 Google LLC. All Rights Reserved.\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n * =============================================================================\n */\nimport { backend_util, env, FusedConv2D, util } from '@tensorflow/tfjs-core';\nimport { Conv2DProgram } from '../conv_gpu';\nimport { Conv2DPackedProgram } from '../conv_packed_gpu';\nimport { mapActivationToShaderProgram } from '../kernel_utils/kernel_funcs_utils';\nimport { conv2dByMatMul, conv2dWithIm2Row } from './Conv2D_impl';\nimport { reshape } from './Reshape';\nexport function fusedConv2d(args) {\n const { inputs, backend, attrs } = args;\n const { x, filter, bias, preluActivationWeights } = inputs;\n const { strides, pad, dataFormat, dilations, dimRoundingMode, activation, leakyreluAlpha } = attrs;\n const $dataFormat = backend_util.convertConv2DDataFormat(dataFormat);\n const convInfo = backend_util.computeConv2DInfo(x.shape, filter.shape, strides, dilations, pad, dimRoundingMode, false /* depthwise */, $dataFormat);\n let out;\n const intermediates = [];\n const hasBias = bias != null;\n const hasPreluActivationWeights = preluActivationWeights != null;\n const hasLeakyreluAlpha = activation === 'leakyrelu';\n const prepareInputs = () => {\n const inputs = [x, filter];\n // If the input is a 1-D tensor, align it with the channels.\n //\n // For fusedConv2d, the inputs (x, W, bias, preluActivationWeights) are\n // supposed to be aligned with the dataFormat. The 4-D tensor inputs or\n // scalar inputs are originally aligned, but the 1-D tensor inputs are\n // supposed to be aligned with the channels (only bias and PReLU activation\n // weights could be a 1-D tensor).\n const alignInputWithDataFormat = (input, dataFormat) => {\n if (dataFormat === 'NCHW' && input.shape.length === 1 &&\n input.shape[0] !== 1) {\n const alignedInput = reshape({\n inputs: { x: input },\n backend,\n attrs: { shape: [input.shape[0], 1, 1] }\n });\n intermediates.push(alignedInput);\n return alignedInput;\n }\n return input;\n };\n if (hasBias) {\n inputs.push(alignInputWithDataFormat(bias, dataFormat));\n }\n if (hasPreluActivationWeights) {\n inputs.push(alignInputWithDataFormat(preluActivationWeights, dataFormat));\n }\n if (hasLeakyreluAlpha) {\n const $leakyreluAlpha = backend.makeTensorInfo([], 'float32', util.createScalarValue(leakyreluAlpha, 'float32'));\n inputs.push($leakyreluAlpha);\n intermediates.push($leakyreluAlpha);\n }\n return inputs;\n };\n if (convInfo.filterHeight === 1 && convInfo.filterWidth === 1 &&\n convInfo.dilationHeight === 1 && convInfo.dilationWidth === 1 &&\n convInfo.strideHeight === 1 && convInfo.strideWidth === 1 &&\n (convInfo.padInfo.type === 'SAME' || convInfo.padInfo.type === 'VALID')) {\n out = conv2dByMatMul({\n x,\n filter,\n convInfo,\n backend,\n bias,\n activation,\n preluActivationWeights,\n leakyreluAlpha\n });\n }\n else if (convInfo.strideWidth <= 2 && $dataFormat === 'channelsLast'\n && env().getBool('WEBGL_EXP_CONV')) {\n const fusedActivation = activation ? mapActivationToShaderProgram(activation, true) : null;\n const program = new Conv2DPackedProgram(convInfo, hasBias, fusedActivation, hasPreluActivationWeights, hasLeakyreluAlpha);\n const customValues = [\n [convInfo.padInfo.top, convInfo.padInfo.left],\n [convInfo.strideHeight, convInfo.strideWidth],\n [convInfo.dilationHeight, convInfo.dilationWidth],\n [convInfo.inHeight, convInfo.inWidth]\n ];\n const inputs = prepareInputs();\n out = backend.runWebGLProgram(program, inputs, 'float32', customValues);\n }\n else if (env().getBool('WEBGL_CONV_IM2COL')) {\n out = conv2dWithIm2Row({\n x,\n filter,\n convInfo,\n backend,\n bias,\n activation,\n preluActivationWeights,\n leakyreluAlpha\n });\n }\n else {\n const fusedActivation = activation ? mapActivationToShaderProgram(activation, false) : null;\n const program = new Conv2DProgram(convInfo, hasBias, fusedActivation, hasPreluActivationWeights, hasLeakyreluAlpha);\n const inputs = prepareInputs();\n out = backend.runWebGLProgram(program, inputs, 'float32');\n }\n const outReshaped = reshape({ inputs: { x: out }, backend, attrs: { shape: convInfo.outShape } });\n intermediates.push(out);\n intermediates.forEach(t => backend.disposeIntermediateTensorInfo(t));\n return outReshaped;\n}\nexport const fusedConv2DConfig = {\n kernelName: FusedConv2D,\n backendName: 'webgl',\n kernelFunc: fusedConv2d,\n};\n//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiRnVzZWRDb252MkQuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi8uLi90ZmpzLWJhY2tlbmQtd2ViZ2wvc3JjL2tlcm5lbHMvRnVzZWRDb252MkQudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUE7Ozs7Ozs7Ozs7Ozs7OztHQWVHO0FBRUgsT0FBTyxFQUFDLFlBQVksRUFBRSxHQUFHLEVBQUUsV0FBVyxFQUE2RSxJQUFJLEVBQUMsTUFBTSx1QkFBdUIsQ0FBQztBQUd0SixPQUFPLEVBQUMsYUFBYSxFQUFDLE1BQU0sYUFBYSxDQUFDO0FBQzFDLE9BQU8sRUFBQyxtQkFBbUIsRUFBQyxNQUFNLG9CQUFvQixDQUFDO0FBQ3ZELE9BQU8sRUFBQyw0QkFBNEIsRUFBQyxNQUFNLG9DQUFvQyxDQUFDO0FBRWhGLE9BQU8sRUFBQyxjQUFjLEVBQUUsZ0JBQWdCLEVBQUMsTUFBTSxlQUFlLENBQUM7QUFDL0QsT0FBTyxFQUFDLE9BQU8sRUFBQyxNQUFNLFdBQVcsQ0FBQztBQUVsQyxNQUFNLFVBQVUsV0FBVyxDQUFDLElBSTNCO0lBQ0MsTUFBTSxFQUFDLE1BQU0sRUFBRSxPQUFPLEVBQUUsS0FBSyxFQUFDLEdBQUcsSUFBSSxDQUFDO0lBQ3RDLE1BQU0sRUFBQyxDQUFDLEVBQUUsTUFBTSxFQUFFLElBQUksRUFBRSxzQkFBc0IsRUFBQyxHQUFHLE1BQU0sQ0FBQztJQUN6RCxNQUFNLEVBQ0osT0FBTyxFQUNQLEdBQUcsRUFDSCxVQUFVLEVBQ1YsU0FBUyxFQUNULGVBQWUsRUFDZixVQUFVLEVBQ1YsY0FBYyxFQUNmLEdBQUcsS0FBSyxDQUFDO0lBRVYsTUFBTSxXQUFXLEdBQUcsWUFBWSxDQUFDLHVCQUF1QixDQUFDLFVBQVUsQ0FBQyxDQUFDO0lBQ3JFLE1BQU0sUUFBUSxHQUFHLFlBQVksQ0FBQyxpQkFBaUIsQ0FDM0MsQ0FBQyxDQUFDLEtBQXlDLEVBQzNDLE1BQU0sQ0FBQyxLQUF5QyxFQUFFLE9BQU8sRUFBRSxTQUFT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QUFDLENBQUMsQ0FBQyxJQUFJLENBQUM7UUFDeEUsTUFBTSxPQUFPLEdBQUcsSUFBSSxhQUFhLENBQzdCLFFBQVEsRUFBRSxPQUFPLEVBQUUsZUFBZSxFQUFFLHlCQUF5QixFQUM3RCxpQkFBaUIsQ0FBQyxDQUFDO1FBRXZCLE1BQU0sTUFBTSxHQUFHLGFBQWEsRUFBRSxDQUFDO1FBQy9CLEdBQUcsR0FBRyxPQUFPLENBQUMsZUFBZSxDQUFDLE9BQU8sRUFBRSxNQUFNLEVBQUUsU0FBUyxDQUFDLENBQUM7S0FDM0Q7SUFFRCxNQUFNLFdBQVcsR0FDYixPQUFPLENBQUMsRUFBQyxNQUFNLEVBQUUsRUFBQyxDQUFDLEVBQUUsR0FBRyxFQUFDLEVBQUUsT0FBTyxFQUFFLEtBQUssRUFBRSxFQUFDLEtBQUssRUFBRSxRQUFRLENBQUMsUUFBUSxFQUFDLEVBQUMsQ0FBQyxDQUFDO0lBRTVFLGFBQWEsQ0FBQyxJQUFJLENBQUMsR0FBRyxDQUFDLENBQUM7SUFDeEIsYUFBYSxDQUFDLE9BQU8sQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLE9BQU8sQ0FBQyw2QkFBNkIsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDO0lBRXJFLE9BQU8sV0FBVyxDQUFDO0FBQ3JCLENBQUM7QUFFRCxNQUFNLENBQUMsTUFBTSxpQkFBaUIsR0FBaUI7SUFDN0MsVUFBVSxFQUFFLFdBQVc7SUFDdkIsV0FBVyxFQUFFLE9BQU87SUFDcEIsVUFBVSxFQUFFLFdBQStCO0NBQzVDLENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyIvKipcbiAqIEBsaWNlbnNlXG4gKiBDb3B5cmlnaHQgMjAyMCBHb29nbGUgTExDLiBBbGwgUmlnaHRzIFJlc2VydmVkLlxuICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlIFwiTGljZW5zZVwiKTtcbiAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS5cbiAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdFxuICpcbiAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMFxuICpcbiAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmVcbiAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuIFwiQVMgSVNcIiBCQVNJUyxcbiAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLlxuICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZFxuICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuXG4gKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuICovXG5cbmltcG9ydCB7YmFja2VuZF91dGlsLCBlbnYsIEZ1c2VkQ29udjJELCBGdXNlZENvbnYyREF0dHJzLCBGdXNlZENvbnYyRElucHV0cywgS2VybmVsQ29uZmlnLCBLZXJuZWxGdW5jLCBUZW5zb3JJbmZvLCB1dGlsfSBmcm9tICdAdGVuc29yZmxvdy90ZmpzLWNvcmUnO1xuXG5pbXBvcnQge01hdGhCYWNrZW5kV2ViR0x9IGZyb20gJy4uL2JhY2tlbmRfd2ViZ2wnO1xuaW1wb3J0IHtDb252MkRQcm9ncmFtfSBmcm9tICcuLi9jb252X2dwdSc7XG5pbXBvcnQge0NvbnYyRFBhY2tlZFByb2dyYW19IGZyb20gJy4uL2NvbnZfcGFja2VkX2dwdSc7XG5pbXBvcnQge21hcEFjdGl2YXRpb25Ub1NoYWRlclByb2dyYW19IGZyb20gJy4uL2tlcm5lbF91dGlscy9rZXJuZWxfZnVuY3NfdXRpbHMnO1xuXG5pbXBvcnQge2NvbnYyZEJ5TWF0TXVsLCBjb252MmRXaXRoSW0yUm93fSBmcm9tICcuL0NvbnYyRF9pbXBsJztcbmltcG9ydCB7cmVzaGFwZX0gZnJvbSAnLi9SZXNoYXBlJztcblxuZXhwb3J0IGZ1bmN0aW9uIGZ1c2VkQ29udjJkKGFyZ3M6IHtcbiAgaW5wdXRzOiBGdXNlZENvbnYyRElucHV0cyxcbiAgYXR0cnM6IEZ1c2VkQ29udjJEQXR0cnMsXG4gIGJhY2tlbmQ6IE1hdGhCYWNrZW5kV2ViR0xcbn0pIHtcbiAgY29uc3Qge2lucHV0cywgYmFja2VuZCwgYXR0cnN9ID0gYXJncztcbiAgY29uc3Qge3gsIGZpbHRlciwgYmlhcywgcHJlbHVBY3RpdmF0aW9uV2VpZ2h0c30gPSBpbnB1dHM7XG4gIGNvbnN0IHtcbiAgICBzdHJpZGVzLFxuICAgIHBhZCxcbiAgICBkYXRhRm9ybWF0LFxuICAgIGRpbGF0aW9ucyxcbiAgICBkaW1Sb3VuZGluZ01vZGUsXG4gICAgYWN0aXZhdGlvbixcbiAgICBsZWFreXJlbHVBbHBoYVxuICB9ID0gYXR0cnM7XG5cbiAgY29uc3QgJGRhdGFGb3JtYXQgPSBiYWNrZW5kX3V0aWwuY29udmVydENvbnYyRERhdGFGb3JtYXQoZGF0YUZvcm1hdCk7XG4gIGNvbnN0IGNvbnZJbmZvID0gYmFja2VuZF91dGlsLmNvbXB1dGVDb252MkRJbmZvKFxuICAgICAgeC5zaGFwZSBhcyBbbnVtYmVyLCBudW1iZXIsIG51bWJlciwgbnVtYmVyXSxcbiAgICAgIGZpbHRlci5zaGFwZSBhcyBbbnVtYmVyLCBudW1iZXIsIG51bWJlciwgbnVtYmVyXSwgc3RyaWRlcywgZGlsYXRpb25zLCBwYWQsXG4gICAgICBkaW1Sb3VuZGluZ01vZGUsIGZhbHNlIC8qIGRlcHRod2lzZSAqLywgJGRhdGFGb3JtYXQpO1xuICBsZXQgb3V0OiBUZW5zb3JJbmZvO1xuICBjb25zdCBpbnRlcm1lZGlhdGVzOiBUZW5zb3JJbmZvW10gPSBbXTtcblxuICBjb25zdCBoYXNCaWFzID0gYmlhcyAhPSBudWxsO1xuICBjb25zdCBoYXNQcmVsdUFjdGl2YXRpb25XZWlnaHRzID0gcHJlbHVBY3RpdmF0aW9uV2VpZ2h0cyAhPSBudWxsO1xuICBjb25zdCBoYXNMZWFreXJlbHVBbHBoYSA9IGFjdGl2YXRpb24gPT09ICdsZWFreXJlbHUnO1xuXG4gIGNvbnN0IHByZXBhcmVJbnB1dHMgPSAoKTogVGVuc29ySW5mb1tdID0+IHtcbiAgICBjb25zdCBpbnB1dHM6IFRlbnNvckluZm9bXSA9IFt4LCBmaWx0ZXJdO1xuXG4gICAgLy8gSWYgdGhlIGlucHV0IGlzIGEgMS1EIHRlbnNvciwgYWxpZ24gaXQgd2l0aCB0aGUgY2hhbm5lbHMuXG4gICAgLy9cbiAgICAvLyBGb3IgZnVzZWRDb252MmQsIHRoZSBpbnB1dHMgKHgsIFcsIGJpYXMsIHByZWx1QWN0aXZhdGlvbldlaWdodHMpIGFyZVxuICAgIC8vIHN1cHBvc2VkIHRvIGJlIGFsaWduZWQgd2l0aCB0aGUgZGF0YUZvcm1hdC4gVGhlIDQtRCB0ZW5zb3IgaW5wdXRzIG9yXG4gICAgLy8gc2NhbGFyIGlucHV0cyBhcmUgb3JpZ2luYWxseSBhbGlnbmVkLCBidXQgdGhlIDEtRCB0ZW5zb3IgaW5wdXRzIGFyZVxuICAgIC8vIHN1cHBvc2VkIHRvIGJlIGFsaWduZWQgd2l0aCB0aGUgY2hhbm5lbHMgKG9ubHkgYmlhcyBhbmQgUFJlTFUgYWN0aXZhdGlvblxuICAgIC8vIHdlaWdodHMgY291bGQgYmUgYSAxLUQgdGVuc29yKS5cbiAgICBjb25zdCBhbGlnbklucHV0V2l0aERhdGFGb3JtYXQgPVxuICAgICAgICAoaW5wdXQ6IFRlbnNvckluZm8sIGRhdGFGb3JtYXQ6ICdOSFdDJ3wnTkNIVycpOiBUZW5zb3JJbmZvID0+IHtcbiAgICAgICAgICBpZiAoZGF0YUZvcm1hdCA9PT0gJ05DSFcnICYmIGlucHV0LnNoYXBlLmxlbmd0aCA9PT0gMSAmJlxuICAgICAgICAgICAgICBpbnB1dC5zaGFwZVswXSAhPT0gMSkge1xuICAgICAgICAgICAgY29uc3QgYWxpZ25lZElucHV0ID0gcmVzaGFwZSh7XG4gICAgICAgICAgICAgIGlucHV0czoge3g6IGlucHV0fSxcbiAgICAgICAgICAgICAgYmFja2VuZCxcbiAgICAgICAgICAgICAgYXR0cnM6IHtzaGFwZTogW2lucHV0LnNoYXBlWzBdLCAxLCAxXX1cbiAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgaW50ZXJtZWRpYXRlcy5wdXNoKGFsaWduZWRJbnB1dCk7XG4gICAgICAgICAgICByZXR1cm4gYWxpZ25lZElucHV0O1xuICAgICAgICAgIH1cbiAgICAgICAgICByZXR1cm4gaW5wdXQ7XG4gICAgICAgIH07XG5cbiAgICBpZiAoaGFzQmlhcykge1xuICAgICAgaW5wdXRzLnB1c2goYWxpZ25JbnB1dFdpdGhEYXRhRm9ybWF0KGJpYXMsIGRhdGFGb3JtYXQpKTtcbiAgICB9XG5cbiAgICBpZiAoaGFzUHJlbHVBY3RpdmF0aW9uV2VpZ2h0cykge1xuICAgICAgaW5wdXRzLnB1c2goYWxpZ25JbnB1dFdpdGhEYXRhRm9ybWF0KHByZWx1QWN0aXZhdGlvbldlaWdodHMsIGRhdGFGb3JtYXQpKTtcbiAgICB9XG5cbiAgICBpZiAoaGFzTGVha3lyZWx1QWxwaGEpIHtcbiAgICAgIGNvbnN0ICRsZWFreXJlbHVBbHBoYSA9IGJhY2tlbmQubWFrZVRlbnNvckluZm8oXG4gICAgICAgICAgW10sICdmbG9hdDMyJyxcbiAgICAgICAgICB1dGlsLmNyZWF0ZVNjYWxhclZhbHVlKGxlYWt5cmVsdUFscGhhIGFzIHt9IGFzICdmbG9hdDMyJywgJ2Zsb2F0MzInKSk7XG4gICAgICBpbnB1dHMucHVzaCgkbGVha3lyZWx1QWxwaGEpO1xuICAgICAgaW50ZXJtZWRpYXRlcy5wdXNoKCRsZWFreXJlbHVBbHBoYSk7XG4gICAgfVxuICAgIHJldHVybiBpbnB1dHM7XG4gIH07XG5cbiAgaWYgKGNvbnZJbmZvLmZpbHRlckhlaWdodCA9PT0gMSAmJiBjb252SW5mby5maWx0ZXJXaWR0aCA9PT0gMSAmJlxuICAgICAgY29udkluZm8uZGlsYXRpb25IZWlnaHQgPT09IDEgJiYgY29udkluZm8uZGlsYXRpb25XaWR0aCA9PT0gMSAmJlxuICAgICAgY29udkluZm8uc3RyaWRlSGVpZ2h0ID09PSAxICYmIGNvbnZJbmZvLnN0cmlkZVdpZHRoID09PSAxICYmXG4gICAgICAoY29udkluZm8ucGFkSW5mby50eXBlID09PSAnU0FNRScgfHwgY29udkluZm8ucGFkSW5mby50eXBlID09PSAnVkFMSUQnKSkge1xuICAgIG91dCA9IGNvbnYyZEJ5TWF0TXVsKHtcbiAgICAgIHgsXG4gICAgICBmaWx0ZXIsXG4gICAgICBjb252SW5mbyxcbiAgICAgIGJhY2tlbmQsXG4gICAgICBiaWFzLFxuICAgICAgYWN0aXZhdGlvbixcbiAgICAgIHByZWx1QWN0aXZhdGlvbldlaWdodHMsXG4gICAgICBsZWFreXJlbHVBbHBoYVxuICAgIH0pO1xuICB9IGVsc2UgaWYgKGNvbnZJbmZvLnN0cmlkZVdpZHRoIDw9IDIgJiYgJGRhdGFGb3JtYXQgPT09ICdjaGFubmVsc0xhc3QnXG4gICAgJiYgZW52KCkuZ2V0Qm9vbCgnV0VCR0xfRVhQX0NPTlYnKVxuICAgICkge1xuICAgICAgY29uc3QgZnVzZWRBY3RpdmF0aW9uID1cbiAgICAgICAgICBhY3RpdmF0aW9uID8gbWFwQWN0aXZhdGlvblRvU2hhZGVyUHJvZ3JhbShhY3RpdmF0aW9uLCB0cnVlKSA6IG51bGw7XG4gICAgY29uc3QgcHJvZ3JhbSA9IG5ldyBDb252MkRQYWNrZWRQcm9ncmFtKFxuICAgICAgY29udkluZm8sIGhhc0JpYXMsIGZ1c2VkQWN0aXZhdGlvbiwgaGFzUHJlbHVBY3RpdmF0aW9uV2VpZ2h0cyxcbiAgICAgIGhhc0xlYWt5cmVsdUFscGhhKTtcbiAgICBjb25zdCBjdXN0b21WYWx1ZXMgPSBbXG4gICAgICBbY29udkluZm8ucGFkSW5mby50b3AsIGNvbnZJbmZvLnBhZEluZm8ubGVmdF0sXG4gICAgICBbY29udkluZm8uc3RyaWRlSGVpZ2h0LCBjb252SW5mby5zdHJpZGVXaWR0aF0sXG4gICAgICBbY29udkluZm8uZGlsYXRpb25IZWlnaHQsIGNvbnZJbmZvLmRpbGF0aW9uV2lkdGhdLFxuICAgICAgW2NvbnZJbmZvLmluSGVpZ2h0LCBjb252SW5mby5pbldpZHRoXVxuICAgIF07XG4gICAgY29uc3QgaW5wdXRzID0gcHJlcGFyZUlucHV0cygpO1xuICAgIG91dCA9IGJhY2tlbmQucnVuV2ViR0xQcm9ncmFtKHByb2dyYW0sIGlucHV0cywgJ2Zsb2F0MzInLCBjdXN0b21WYWx1ZXMpO1xuICB9IGVsc2UgaWYgKGVudigpLmdldEJvb2woJ1dFQkdMX0NPTlZfSU0yQ09MJykpIHtcbiAgICBvdXQgPSBjb252MmRXaXRoSW0yUm93KHtcbiAgICAgIHgsXG4gICAgICBmaWx0ZXIsXG4gICAgICBjb252SW5mbyxcbiAgICAgIGJhY2tlbmQsXG4gICAgICBiaWFzLFxuICAgICAgYWN0aXZhdGlvbixcbiAgICAgIHByZWx1QWN0aXZhdGlvbldlaWdodHMsXG4gICAgICBsZWFreXJlbHVBbHBoYVxuICAgIH0pO1xuICB9IGVsc2Uge1xuICAgIGNvbnN0IGZ1c2VkQWN0aXZhdGlvbiA9XG4gICAgICAgIGFjdGl2YXRpb24gPyBtYXBBY3RpdmF0aW9uVG9TaGFkZXJQcm9ncmFtKGFjdGl2YXRpb24sIGZhbHNlKSA6IG51bGw7XG4gICAgY29uc3QgcHJvZ3JhbSA9IG5ldyBDb252MkRQcm9ncmFtKFxuICAgICAgICBjb252SW5mbywgaGFzQmlhcywgZnVzZWRBY3RpdmF0aW9uLCBoYXNQcmVsdUFjdGl2YXRpb25XZWlnaHRzLFxuICAgICAgICBoYXNMZWFreXJlbHVBbHBoYSk7XG5cbiAgICBjb25zdCBpbnB1dHMgPSBwcmVwYXJlSW5wdXRzKCk7XG4gICAgb3V0ID0gYmFja2VuZC5ydW5XZWJHTFByb2dyYW0ocHJvZ3JhbSwgaW5wdXRzLCAnZmxvYXQzMicpO1xuICB9XG5cbiAgY29uc3Qgb3V0UmVzaGFwZWQgPVxuICAgICAgcmVzaGFwZSh7aW5wdXRzOiB7eDogb3V0fSwgYmFja2VuZCwgYXR0cnM6IHtzaGFwZTogY29udkluZm8ub3V0U2hhcGV9fSk7XG5cbiAgaW50ZXJtZWRpYXRlcy5wdXNoKG91dCk7XG4gIGludGVybWVkaWF0ZXMuZm9yRWFjaCh0ID0+IGJhY2tlbmQuZGlzcG9zZUludGVybWVkaWF0ZVRlbnNvckluZm8odCkpO1xuXG4gIHJldHVybiBvdXRSZXNoYXBlZDtcbn1cblxuZXhwb3J0IGNvbnN0IGZ1c2VkQ29udjJEQ29uZmlnOiBLZXJuZWxDb25maWcgPSB7XG4gIGtlcm5lbE5hbWU6IEZ1c2VkQ29udjJELFxuICBiYWNrZW5kTmFtZTogJ3dlYmdsJyxcbiAga2VybmVsRnVuYzogZnVzZWRDb252MmQgYXMge30gYXMgS2VybmVsRnVuYyxcbn07XG4iXX0=","/**\n * @license\n * Copyright 2020 Google LLC. All Rights Reserved.\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n * =============================================================================\n */\nimport { backend_util, env, FusedDepthwiseConv2D, util } from '@tensorflow/tfjs-core';\nimport { DepthwiseConv2DProgram } from '../conv_gpu_depthwise';\nimport { DepthwiseConvPacked2DProgram } from '../conv_packed_gpu_depthwise';\nimport { mapActivationToShaderProgram } from '../kernel_utils/kernel_funcs_utils';\nexport function fusedDepthwiseConv2D(args) {\n const { inputs, backend, attrs } = args;\n const { x, filter, bias, preluActivationWeights } = inputs;\n const { strides, pad, dilations, dimRoundingMode, activation, leakyreluAlpha } = attrs;\n const intermediates = [];\n let $dilations = dilations;\n if ($dilations == null) {\n $dilations = [1, 1];\n }\n util.assert(backend_util.eitherStridesOrDilationsAreOne(strides, $dilations), () => 'Error in depthwiseConv2d: Either strides or dilations must be ' +\n `1. Got strides ${strides} and dilations '${$dilations}'`);\n const convInfo = backend_util.computeConv2DInfo(x.shape, filter.shape, strides, $dilations, pad, dimRoundingMode, true /* depthwise */);\n const shouldPackDepthwiseConv = env().getBool('WEBGL_PACK_DEPTHWISECONV') &&\n convInfo.strideWidth <= 2 &&\n convInfo.outChannels / convInfo.inChannels === 1;\n const fusedActivation = activation ?\n mapActivationToShaderProgram(activation, shouldPackDepthwiseConv) :\n null;\n const programInputs = [x, filter];\n const hasBias = bias != null;\n const hasPreluActivationWeights = preluActivationWeights != null;\n const hasLeakyreluAlpha = activation === 'leakyrelu';\n if (hasBias) {\n programInputs.push(bias);\n }\n if (hasPreluActivationWeights) {\n programInputs.push(preluActivationWeights);\n }\n if (hasLeakyreluAlpha) {\n const $leakyreluAlpha = backend.makeTensorInfo([], 'float32', util.createScalarValue(leakyreluAlpha, 'float32'));\n programInputs.push($leakyreluAlpha);\n intermediates.push($leakyreluAlpha);\n }\n let program;\n if (shouldPackDepthwiseConv) {\n program = new DepthwiseConvPacked2DProgram(convInfo, hasBias, fusedActivation, hasPreluActivationWeights, hasLeakyreluAlpha);\n }\n else {\n program = new DepthwiseConv2DProgram(convInfo, hasBias, fusedActivation, hasPreluActivationWeights, hasLeakyreluAlpha);\n }\n const customValues = [\n [convInfo.padInfo.top, convInfo.padInfo.left],\n [convInfo.strideHeight, convInfo.strideWidth],\n [convInfo.dilationHeight, convInfo.dilationWidth],\n [convInfo.inHeight, convInfo.inWidth]\n ];\n const result = backend.runWebGLProgram(program, programInputs, 'float32', customValues);\n intermediates.forEach(t => backend.disposeIntermediateTensorInfo(t));\n return result;\n}\nexport const fusedDepthwiseConv2DConfig = {\n kernelName: FusedDepthwiseConv2D,\n backendName: 'webgl',\n kernelFunc: fusedDepthwiseConv2D,\n};\n//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiRnVzZWREZXB0aHdpc2VDb252MkQuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi8uLi90ZmpzLWJhY2tlbmQtd2ViZ2wvc3JjL2tlcm5lbHMvRnVzZWREZXB0aHdpc2VDb252MkQudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUE7Ozs7Ozs7Ozs7Ozs7OztHQWVHO0FBRUgsT0FBTyxFQUFDLFlBQVksRUFBRSxHQUFHLEVBQUUsb0JBQW9CLEVBQStGLElBQUksRUFBQyxNQUFNLHVCQUF1QixDQUFDO0FBR2pMLE9BQU8sRUFBQyxzQkFBc0IsRUFBQyxNQUFNLHVCQUF1QixDQUFDO0FBQzdELE9BQU8sRUFBQyw0QkFBNEIsRUFBQyxNQUFNLDhCQUE4QixDQUFDO0FBQzFFLE9BQU8sRUFBQyw0QkFBNEIsRUFBQyxNQUFNLG9DQUFvQyxDQUFDO0FBRWhGLE1BQU0sVUFBVSxvQkFBb0IsQ0FBQyxJQUlwQztJQUNDLE1BQU0sRUFBQyxNQUFNLEVBQUUsT0FBTyxFQUFFLEtBQUssRUFBQyxHQUFHLElBQUksQ0FBQztJQUN0QyxNQUFNLEVBQUMsQ0FBQyxFQUFFLE1BQU0sRUFBRSxJQUFJLEVBQUUsc0JBQXNCLEVBQUMsR0FBRyxNQUFNLENBQUM7SUFDekQsTUFBTSxFQUFDLE9BQU8sRUFBRSxHQUFHLEVBQUUsU0FBUyxFQUFFLGVBQWUsRUFBRSxVQUFVLEVBQUUsY0FBYyxFQUFDLEdBQ3hFLEtBQUssQ0FBQztJQUVWLE1BQU0sYUFBYSxHQUFpQixFQUFFLENBQUM7SUFFdkMsSUFBSSxVQUFVLEdBQUcsU0FBUyxDQUFDO0lBQzNCLElBQUksVUFBVSxJQUFJLElBQUksRUFBRTtRQUN0QixVQUFVLEdBQUcsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUM7S0FDckI7SUFFRCxJQUFJLENBQUMsTUFBTSxDQUNQLFlBQVksQ0FBQyw4QkFBOEIsQ0FBQyxPQUFPLEVBQUUsVUFBVSxDQUFDLEVBQ2hFLEdBQUcsRUFBRSxDQUFDLGdF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d0M7Q0FDckQsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbIi8qKlxuICogQGxpY2Vuc2VcbiAqIENvcHlyaWdodCAyMDIwIEdvb2dsZSBMTEMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuXG4gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgXCJMaWNlbnNlXCIpO1xuICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLlxuICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0XG4gKlxuICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wXG4gKlxuICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZVxuICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gXCJBUyBJU1wiIEJBU0lTLFxuICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuXG4gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kXG4gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS5cbiAqID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4gKi9cblxuaW1wb3J0IHtiYWNrZW5kX3V0aWwsIGVudiwgRnVzZWREZXB0aHdpc2VDb252MkQsIEZ1c2VkRGVwdGh3aXNlQ29udjJEQXR0cnMsIEZ1c2VkRGVwdGh3aXNlQ29udjJESW5wdXRzLCBLZXJuZWxDb25maWcsIEtlcm5lbEZ1bmMsIFRlbnNvckluZm8sIHV0aWx9IGZyb20gJ0B0ZW5zb3JmbG93L3RmanMtY29yZSc7XG5cbmltcG9ydCB7TWF0aEJhY2tlbmRXZWJHTH0gZnJvbSAnLi4vYmFja2VuZF93ZWJnbCc7XG5pbXBvcnQge0RlcHRod2lzZUNvbnYyRFByb2dyYW19IGZyb20gJy4uL2NvbnZfZ3B1X2RlcHRod2lzZSc7XG5pbXBvcnQge0RlcHRod2lzZUNvbnZQYWNrZWQyRFByb2dyYW19IGZyb20gJy4uL2NvbnZfcGFja2VkX2dwdV9kZXB0aHdpc2UnO1xuaW1wb3J0IHttYXBBY3RpdmF0aW9uVG9TaGFkZXJQcm9ncmFtfSBmcm9tICcuLi9rZXJuZWxfdXRpbHMva2VybmVsX2Z1bmNzX3V0aWxzJztcblxuZXhwb3J0IGZ1bmN0aW9uIGZ1c2VkRGVwdGh3aXNlQ29udjJEKGFyZ3M6IHtcbiAgaW5wdXRzOiBGdXNlZERlcHRod2lzZUNvbnYyRElucHV0cyxcbiAgYXR0cnM6IEZ1c2VkRGVwdGh3aXNlQ29udjJEQXR0cnMsXG4gIGJhY2tlbmQ6IE1hdGhCYWNrZW5kV2ViR0xcbn0pIHtcbiAgY29uc3Qge2lucHV0cywgYmFja2VuZCwgYXR0cnN9ID0gYXJncztcbiAgY29uc3Qge3gsIGZpbHRlciwgYmlhcywgcHJlbHVBY3RpdmF0aW9uV2VpZ2h0c30gPSBpbnB1dHM7XG4gIGNvbnN0IHtzdHJpZGVzLCBwYWQsIGRpbGF0aW9ucywgZGltUm91bmRpbmdNb2RlLCBhY3RpdmF0aW9uLCBsZWFreXJlbHVBbHBoYX0gPVxuICAgICAgYXR0cnM7XG5cbiAgY29uc3QgaW50ZXJtZWRpYXRlczogVGVuc29ySW5mb1tdID0gW107XG5cbiAgbGV0ICRkaWxhdGlvbnMgPSBkaWxhdGlvbnM7XG4gIGlmICgkZGlsYXRpb25zID09IG51bGwpIHtcbiAgICAkZGlsYXRpb25zID0gWzEsIDFdO1xuICB9XG5cbiAgdXRpbC5hc3NlcnQoXG4gICAgICBiYWNrZW5kX3V0aWwuZWl0aGVyU3RyaWRlc09yRGlsYXRpb25zQXJlT25lKHN0cmlkZXMsICRkaWxhdGlvbnMpLFxuICAgICAgKCkgPT4gJ0Vycm9yIGluIGRlcHRod2lzZUNvbnYyZDogRWl0aGVyIHN0cmlkZXMgb3IgZGlsYXRpb25zIG11c3QgYmUgJyArXG4gICAgICAgICAgYDEuIEdvdCBzdHJpZGVzICR7c3RyaWRlc30gYW5kIGRpbGF0aW9ucyAnJHskZGlsYXRpb25zfSdgKTtcblxuICBjb25zdCBjb252SW5mbyA9IGJhY2tlbmRfdXRpbC5jb21wdXRlQ29udjJESW5mbyhcbiAgICAgIHguc2hhcGUgYXMgW251bWJlciwgbnVtYmVyLCBudW1iZXIsIG51bWJlcl0sXG4gICAgICBmaWx0ZXIuc2hhcGUgYXMgW251bWJlciwgbnVtYmVyLCBudW1iZXIsIG51bWJlcl0sIHN0cmlkZXMsICRkaWxhdGlvbnMsXG4gICAgICBwYWQsIGRpbVJvdW5kaW5nTW9kZSwgdHJ1ZSAvKiBkZXB0aHdpc2UgKi8pO1xuXG4gIGNvbnN0IHNob3VsZFBhY2tEZXB0aHdpc2VDb252ID0gZW52KCkuZ2V0Qm9vbCgnV0VCR0xfUEFDS19ERVBUSFdJU0VDT05WJykgJiZcbiAgICAgIGNvbnZJbmZvLnN0cmlkZVdpZHRoIDw9IDIgJiZcbiAgICAgIGNvbnZJbmZvLm91dENoYW5uZWxzIC8gY29udkluZm8uaW5DaGFubmVscyA9PT0gMTtcbiAgY29uc3QgZnVzZWRBY3RpdmF0aW9uID0gYWN0aXZhdGlvbiA/XG4gICAgICBtYXBBY3RpdmF0aW9uVG9TaGFkZXJQcm9ncmFtKGFjdGl2YXRpb24sIHNob3VsZFBhY2tEZXB0aHdpc2VDb252KSA6XG4gICAgICBudWxsO1xuICBjb25zdCBwcm9ncmFtSW5wdXRzOiBUZW5zb3JJbmZvW10gPSBbeCwgZmlsdGVyXTtcblxuICBjb25zdCBoYXNCaWFzID0gYmlhcyAhPSBudWxsO1xuICBjb25zdCBoYXNQcmVsdUFjdGl2YXRpb25XZWlnaHRzID0gcHJlbHVBY3RpdmF0aW9uV2VpZ2h0cyAhPSBudWxsO1xuICBjb25zdCBoYXNMZWFreXJlbHVBbHBoYSA9IGFjdGl2YXRpb24gPT09ICdsZWFreXJlbHUnO1xuXG4gIGlmIChoYXNCaWFzKSB7XG4gICAgcHJvZ3JhbUlucHV0cy5wdXNoKGJpYXMpO1xuICB9XG4gIGlmIChoYXNQcmVsdUFjdGl2YXRpb25XZWlnaHRzKSB7XG4gICAgcHJvZ3JhbUlucHV0cy5wdXNoKHByZWx1QWN0aXZhdGlvbldlaWdodHMpO1xuICB9XG4gIGlmIChoYXNMZWFreXJlbHVBbHBoYSkge1xuICAgIGNvbnN0ICRsZWFreXJlbHVBbHBoYSA9IGJhY2tlbmQubWFrZVRlbnNvckluZm8oXG4gICAgICAgIFtdLCAnZmxvYXQzMicsXG4gICAgICAgIHV0aWwuY3JlYXRlU2NhbGFyVmFsdWUobGVha3lyZWx1QWxwaGEgYXMge30gYXMgJ2Zsb2F0MzInLCAnZmxvYXQzMicpKTtcbiAgICBwcm9ncmFtSW5wdXRzLnB1c2goJGxlYWt5cmVsdUFscGhhKTtcbiAgICBpbnRlcm1lZGlhdGVzLnB1c2goJGxlYWt5cmVsdUFscGhhKTtcbiAgfVxuXG4gIGxldCBwcm9ncmFtOiBEZXB0aHdpc2VDb252MkRQcm9ncmFtfERlcHRod2lzZUNvbnZQYWNrZWQyRFByb2dyYW07XG4gIGlmIChzaG91bGRQYWNrRGVwdGh3aXNlQ29udikge1xuICAgIHByb2dyYW0gPSBuZXcgRGVwdGh3aXNlQ29udlBhY2tlZDJEUHJvZ3JhbShcbiAgICAgICAgY29udkluZm8sIGhhc0JpYXMsIGZ1c2VkQWN0aXZhdGlvbiwgaGFzUHJlbHVBY3RpdmF0aW9uV2VpZ2h0cyxcbiAgICAgICAgaGFzTGVha3lyZWx1QWxwaGEpO1xuICB9IGVsc2Uge1xuICAgIHByb2dyYW0gPSBuZXcgRGVwdGh3aXNlQ29udjJEUHJvZ3JhbShcbiAgICAgICAgY29udkluZm8sIGhhc0JpYXMsIGZ1c2VkQWN0aXZhdGlvbiwgaGFzUHJlbHVBY3RpdmF0aW9uV2VpZ2h0cyxcbiAgICAgICAgaGFzTGVha3lyZWx1QWxwaGEpO1xuICB9XG4gIGNvbnN0IGN1c3RvbVZhbHVlcyA9IFtcbiAgICBbY29udkluZm8ucGFkSW5mby50b3AsIGNvbnZJbmZvLnBhZEluZm8ubGVmdF0sXG4gICAgW2NvbnZJbmZvLnN0cmlkZUhlaWdodCwgY29udkluZm8uc3RyaWRlV2lkdGhdLFxuICAgIFtjb252SW5mby5kaWxhdGlvbkhlaWdodCwgY29udkluZm8uZGlsYXRpb25XaWR0aF0sXG4gICAgW2NvbnZJbmZvLmluSGVpZ2h0LCBjb252SW5mby5pbldpZHRoXVxuICBdO1xuICBjb25zdCByZXN1bHQgPVxuICAgICAgYmFja2VuZC5ydW5XZWJHTFByb2dyYW0ocHJvZ3JhbSwgcHJvZ3JhbUlucHV0cywgJ2Zsb2F0MzInLCBjdXN0b21WYWx1ZXMpO1xuXG4gIGludGVybWVkaWF0ZXMuZm9yRWFjaCh0ID0+IGJhY2tlbmQuZGlzcG9zZUludGVybWVkaWF0ZVRlbnNvckluZm8odCkpO1xuXG4gIHJldHVybiByZXN1bHQ7XG59XG5cbmV4cG9ydCBjb25zdCBmdXNlZERlcHRod2lzZUNvbnYyRENvbmZpZzogS2VybmVsQ29uZmlnID0ge1xuICBrZXJuZWxOYW1lOiBGdXNlZERlcHRod2lzZUNvbnYyRCxcbiAgYmFja2VuZE5hbWU6ICd3ZWJnbCcsXG4gIGtlcm5lbEZ1bmM6IGZ1c2VkRGVwdGh3aXNlQ29udjJEIGFzIHt9IGFzIEtlcm5lbEZ1bmMsXG59O1xuIl19","import { getCoordsDataType } from './shader_compiler';\nexport class GatherNDProgram {\n constructor(sliceDim, strides, shape, paramsShape) {\n this.sliceDim = sliceDim;\n this.strides = strides;\n this.paramsShape = paramsShape;\n this.variableNames = ['x', 'indices'];\n this.outputShape = shape;\n const dtype = getCoordsDataType(shape.length);\n let mainLoop = `\n int index;`;\n for (let j = 0; j < this.sliceDim; j++) {\n mainLoop += `\n index = round(getIndices(coords[0], ${j}));\n out_of_bounds = out_of_bounds || index < 0;\n out_of_bounds = out_of_bounds || index >= ${this.paramsShape[j]};\n flattenIndex += index * ${this.strides[j]};`;\n }\n this.userCode = `\n void main() {\n ${dtype} coords = getOutputCoords();\n int flattenIndex = 0;\n bool out_of_bounds = false;\n\n ${mainLoop}\n\n setOutput(out_of_bounds ? 0.0 : getX(flattenIndex, coords[1]));\n }\n `;\n }\n}\n//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZ2F0aGVyX25kX2dwdS5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uL3RmanMtYmFja2VuZC13ZWJnbC9zcmMvZ2F0aGVyX25kX2dwdS50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFpQkEsT0FBTyxFQUFDLGlCQUFpQixFQUFDLE1BQU0sbUJBQW1CLENBQUM7QUFFcEQsTUFBTSxPQUFPLGVBQWU7SUFJMUIsWUFDWSxRQUFnQixFQUFVLE9BQWlCLEVBQUUsS0FBZSxFQUM1RCxXQUFxQjtRQURyQixhQUFRLEdBQVIsUUFBUSxDQUFRO1FBQVUsWUFBTyxHQUFQLE9BQU8sQ0FBVTtRQUMzQyxnQkFBVyxHQUFYLFdBQVcsQ0FBVTtRQUxqQyxrQkFBYSxHQUFHLENBQUMsR0FBRyxFQUFFLFNBQVMsQ0FBQyxDQUFDO1FBTS9CLElBQUksQ0FBQyxXQUFXLEdBQUcsS0FBSyxDQUFDO1FBQ3pCLE1BQU0sS0FBSyxHQUFHLGlCQUFpQixDQUFDLEtBQUssQ0FBQyxNQUFNLENBQUMsQ0FBQztRQUU5QyxJQUFJLFFBQVEsR0FBRztlQUNKLENBQUM7UUFDWixLQUFLLElBQUksQ0FBQyxHQUFHLENBQUMsRUFBRSxDQUFDLEdBQUcsSUFBSSxDQUFDLFFBQVEsRUFBRSxDQUFDLEVBQUUsRUFBRTtZQUN0QyxRQUFRLElBQUk7Z0RBQzhCLENBQUM7O3NEQUVLLElBQUksQ0FBQyxXQUFXLENBQUMsQ0FBQyxDQUFDO29DQUNyQyxJQUFJLENBQUMsT0FBTyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUM7U0FDbEQ7UUFFRCxJQUFJLENBQUMsUUFBUSxHQUFHOztZQUVSLEtBQUs7Ozs7WUFJTCxRQUFROzs7O09BSWIsQ0FBQztJQUNOLENBQUM7Q0FDRiIsInNvdXJjZXNDb250ZW50IjpbIi8qKlxuICogQGxpY2Vuc2VcbiAqIENvcHlyaWdodCAyMDE4IEdvb2dsZSBMTEMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuXG4gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgXCJMaWNlbnNlXCIpO1xuICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLlxuICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0XG4gKlxuICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wXG4gKlxuICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZVxuICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gXCJBUyBJU1wiIEJBU0lTLFxuICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuXG4gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kXG4gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS5cbiAqID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4gKi9cbmltcG9ydCB7R1BHUFVQcm9ncmFtfSBmcm9tICcuL2dwZ3B1X21hdGgnO1xuaW1wb3J0IHtnZXRDb29yZHNEYXRhVHlwZX0gZnJvbSAnLi9zaGFkZXJfY29tcGlsZXInO1xuXG5leHBvcnQgY2xhc3MgR2F0aGVyTkRQcm9ncmFtIGltcGxlbWVudHMgR1BHUFVQcm9ncmFtIHtcbiAgdmFyaWFibGVOYW1lcyA9IFsneCcsICdpbmRpY2VzJ107XG4gIG91dHB1dFNoYXBlOiBudW1iZXJbXTtcbiAgdXNlckNvZGU6IHN0cmluZztcbiAgY29uc3RydWN0b3IoXG4gICAgICBwcml2YXRlIHNsaWNlRGltOiBudW1iZXIsIHByaXZhdGUgc3RyaWRlczogbnVtYmVyW10sIHNoYXBlOiBudW1iZXJbXSxcbiAgICAgIHByaXZhdGUgcGFyYW1zU2hhcGU6IG51bWJlcltdKSB7XG4gICAgdGhpcy5vdXRwdXRTaGFwZSA9IHNoYXBlO1xuICAgIGNvbnN0IGR0eXBlID0gZ2V0Q29vcmRzRGF0YVR5cGUoc2hhcGUubGVuZ3RoKTtcblxuICAgIGxldCBtYWluTG9vcCA9IGBcbiAgICBpbnQgaW5kZXg7YDtcbiAgICBmb3IgKGxldCBqID0gMDsgaiA8IHRoaXMuc2xpY2VEaW07IGorKykge1xuICAgICAgbWFpbkxvb3AgKz0gYFxuICAgICAgICAgIGluZGV4ID0gcm91bmQoZ2V0SW5kaWNlcyhjb29yZHNbMF0sICR7an0pKTtcbiAgICAgICAgICBvdXRfb2ZfYm91bmRzID0gb3V0X29mX2JvdW5kcyB8fCBpbmRleCA8IDA7XG4gICAgICAgICAgb3V0X29mX2JvdW5kcyA9IG91dF9vZl9ib3VuZHMgfHwgaW5kZXggPj0gJHt0aGlzLnBhcmFtc1NoYXBlW2pdfTtcbiAgICAgICAgICBmbGF0dGVuSW5kZXggKz0gaW5kZXggKiAke3RoaXMuc3RyaWRlc1tqXX07YDtcbiAgICB9XG5cbiAgICB0aGlzLnVzZXJDb2RlID0gYFxuICAgICAgICAgdm9pZCBtYWluKCkge1xuICAgICAgICAgICR7ZHR5cGV9IGNvb3JkcyA9IGdldE91dHB1dENvb3JkcygpO1xuICAgICAgICAgIGludCBmbGF0dGVuSW5kZXggPSAwO1xuICAgICAgICAgIGJvb2wgb3V0X29mX2JvdW5kcyA9IGZhbHNlO1xuXG4gICAgICAgICAgJHttYWluTG9vcH1cblxuICAgICAgICAgIHNldE91dHB1dChvdXRfb2ZfYm91bmRzID8gMC4wIDogZ2V0WChmbGF0dGVuSW5kZXgsIGNvb3Jkc1sxXSkpO1xuICAgICAgICB9XG4gICAgICBgO1xuICB9XG59XG4iXX0=","/**\n * @license\n * Copyright 2020 Google LLC. All Rights Reserved.\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n * =============================================================================\n */\nimport { backend_util, GatherNd, util } from '@tensorflow/tfjs-core';\nimport { GatherNDProgram } from '../gather_nd_gpu';\nimport { gatherNdImplCPU } from '../kernel_utils/shared';\nimport { reshape } from './Reshape';\nexport function gatherNd(args) {\n const { inputs, backend } = args;\n const { params, indices } = inputs;\n const indicesShape = indices.shape;\n const sliceRank = indicesShape[indicesShape.length - 1];\n const paramsSize = util.sizeFromShape(params.shape);\n const [resultShape, numSlices, sliceSize, strides] = backend_util.prepareAndValidate(params, indices);\n const flattenIndices = reshape({ inputs: { x: indices }, backend, attrs: { shape: [numSlices, sliceRank] } });\n const flattenX = reshape({\n inputs: { x: params },\n backend,\n attrs: { shape: [(util.sizeFromShape(params.shape) / sliceSize), sliceSize] }\n });\n if (backend.shouldExecuteOnCPU([params, indices]) ||\n params.dtype === 'string') {\n const indicesData = backend.readSync(indices.dataId);\n const paramsBuf = backend.bufferSync(params);\n const outValue = gatherNdImplCPU(indicesData, paramsBuf, params.dtype, numSlices, sliceRank, sliceSize, strides, params.shape, paramsSize);\n return backend.makeTensorInfo(resultShape, params.dtype, outValue.values);\n }\n const program = new GatherNDProgram(sliceRank, strides, [numSlices, sliceSize], params.shape);\n const res = backend.runWebGLProgram(program, [flattenX, flattenIndices], flattenX.dtype);\n const reshaped = reshape({ inputs: { x: res }, backend, attrs: { shape: resultShape } });\n backend.disposeIntermediateTensorInfo(flattenIndices);\n backend.disposeIntermediateTensorInfo(flattenX);\n backend.disposeIntermediateTensorInfo(res);\n return reshaped;\n}\nexport const gatherNdConfig = {\n kernelName: GatherNd,\n backendName: 'webgl',\n kernelFunc: gatherNd\n};\n//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiR2F0aGVyTmQuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi8uLi90ZmpzLWJhY2tlbmQtd2ViZ2wvc3JjL2tlcm5lbHMvR2F0aGVyTmQudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUE7Ozs7Ozs7Ozs7Ozs7OztHQWVHO0FBRUgsT0FBTyxFQUFDLFlBQVksRUFBRSxRQUFRLEVBQTBFLElBQUksRUFBQyxNQUFNLHVCQUF1QixDQUFDO0FBRzNJLE9BQU8sRUFBQyxlQUFlLEVBQUMsTUFBTSxrQkFBa0IsQ0FBQztBQUNqRCxPQUFPLEVBQUMsZUFBZSxFQUFDLE1BQU0sd0JBQXdCLENBQUM7QUFFdkQsT0FBTyxFQUFDLE9BQU8sRUFBQyxNQUFNLFdBQVcsQ0FBQztBQUVsQyxNQUFNLFVBQVUsUUFBUSxDQUNwQixJQUF5RDtJQUMzRCxNQUFNLEVBQUMsTUFBTSxFQUFFLE9BQU8sRUFBQyxHQUFHLElBQUksQ0FBQztJQUMvQixNQUFNLEVBQUMsTUFBTSxFQUFFLE9BQU8sRUFBQyxHQUFHLE1BQU0sQ0FBQztJQUVqQyxNQUFNLFlBQVksR0FBRyxPQUFPLENBQUMsS0FBSyxDQUFDO0lBQ25DLE1BQU0sU0FBUyxHQUFHLFlBQVksQ0FBQyxZQUFZLENBQUMsTUFBTSxHQUFHLENBQUMsQ0FBQyxDQUFDO0lBQ3hELE1BQU0sVUFBVSxHQUFHLElBQUksQ0FBQyxhQUFhLENBQUMsTUFBTSxDQUFDLEtBQUssQ0FBQyxDQUFDO0lBRXBELE1BQU0sQ0FBQyxXQUFXLEVBQUUsU0FBUyxFQUFFLFNBQVMsRUFBRSxPQUFPLENBQUMsR0FDOUMsWUFBWSxDQUFDLGtCQUFrQixDQUFDLE1BQU0sRUFBRSxPQUFPLENBQUMsQ0FBQztJQUVyRCxNQUFNLGNBQWMsR0FBRyxPQUFPLENBQzFCLEVBQUMsTUFBTSxFQUFFLEVBQUMsQ0FBQyxFQUFFLE9BQU8sRUFBQyxFQUFFLE9BQU8sRUFBRSxLQUFLLEVBQUUsRUFBQyxLQUFLLEVBQUUsQ0FBQyxTQUFTLEVBQUUsU0FBUyxDQUFDLEVBQUMsRUFBQyxDQUFDLENBQUM7SUFDN0UsTUFBTSxRQUFRLEdBQUcsT0FBTyxDQUFDO1FBQ3ZCLE1BQU0sRUFBRSxFQUFDLENBQUMsRUFBRSxNQUFNLEVBQUM7UUFDbkIsT0FBTztRQUNQLEtBQUssRUFBRSxFQUFDLEtBQUssRUFBRSxDQUFDLENBQUMsSUFBSSxDQUFDLGFBQWEsQ0FBQyxNQUFNLENBQUMsS0FBSyxDQUFDLEdBQUcsU0FBUyxDQUFDLEVBQUUsU0FBUyxDQUFDLEVBQUM7S0FDNUUsQ0FBQyxDQUFDO0lBRUgsSUFBSSxPQUFPLENBQUMsa0JBQWtCLENBQUMsQ0FBQyxNQUFNLEVBQUUsT0FBTyxDQUFDLENBQUM7UUFDN0MsTUFBTSxDQUFDLEtBQUssS0FBSyxRQUFRLEVBQUU7UUFDN0IsTUFBTSxXQUFXLEdBQUcsT0FBTyxDQUFDLFFBQVEsQ0FBQyxPQUFPLENBQUMsTUFBTSxDQUFlLENBQUM7UUFDbkUsTUFBTSxTQUFTLEdBQUcsT0FBTyxDQUFDLFVBQVUsQ0FBa0IsTUFBTSxDQUFDLENBQUM7UUFDOUQsTUFBTSxRQUFRLEdBQUcsZUFBZSxDQUM1QixXQUFXLEVBQUUsU0FBUyxFQUFFLE1BQU0sQ0FBQyxLQUFLLEVBQUUsU0FBUyxFQUFFLFNBQVMsRUFBRSxTQUFTLEVBQ3JFLE9BQU8sRUFBRSxNQUFNLENBQUMsS0FBSyxFQUFFLFVBQVUsQ0FBQyxDQUFDO1FBRXZDLE9BQU8sT0FBTyxDQUFDLGNBQWMsQ0FBQyxXQUFXLEVBQUUsTUFBTSxDQUFDLEtBQUssRUFBRSxRQUFRLENBQUMsTUFBTSxDQUFDLENBQUM7S0FDM0U7SUFDRCxNQUFNLE9BQU8sR0FDVCxJQUFJLGVBQWUsQ0FBQyxTQUFTLEVBQUUsT0FBTyxFQUFFLENBQUMsU0FBUyxFQUFFLFNBQVMsQ0FBQyxFQUM1RCxNQUFNLENBQUMsS0FBSyxDQUFDLENBQUM7SUFDcEIsTUFBTSxHQUFHLEdBQUcsT0FBTyxDQUFDLGVBQWUsQ0FDL0IsT0FBTyxFQUFFLENBQUMsUUFBUSxFQUFFLGNBQWMsQ0FBQyxFQUFFLFFBQVEsQ0FBQyxLQUFLLENBQUMsQ0FBQztJQUV6RCxNQUFNLFFBQVEsR0FDVixPQUFPLENBQUMsRUFBQyxNQUFNLEVBQUUsRUFBQyxDQUFDLEVBQUUsR0FBRyxFQUFDLEVBQUUsT0FBTyxFQUFFLEtBQUssRUFBRSxFQUFDLEtBQUssRUFBRSxXQUFXLEVBQUMsRUFBQyxDQUFDLENBQUM7SUFFdEUsT0FBTyxDQUFDLDZCQUE2QixDQUFDLGNBQWMsQ0FBQyxDQUFDO0lBQ3RELE9BQU8sQ0FBQyw2QkFBNkIsQ0FBQyxRQUFRLENBQUMsQ0FBQztJQUNoRCxPQUFPLENBQUMsNkJBQTZCLENBQUMsR0FBRyxDQUFDLENBQUM7SUFFM0MsT0FBTyxRQUFRLENBQUM7QUFDbEIsQ0FBQztBQUVELE1BQU0sQ0FBQyxNQUFNLGNBQWMsR0FBaUI7SUFDMUMsVUFBVSxFQUFFLFFBQVE7SUFDcEIsV0FBVyxFQUFFLE9BQU87SUFDcEIsVUFBVSxFQUFFLFFBQTRCO0NBQ3pDLENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyIvKipcbiAqIEBsaWNlbnNlXG4gKiBDb3B5cmlnaHQgMjAyMCBHb29nbGUgTExDLiBBbGwgUmlnaHRzIFJlc2VydmVkLlxuICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlIFwiTGljZW5zZVwiKTtcbiAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS5cbiAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdFxuICpcbiAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMFxuICpcbiAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmVcbiAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuIFwiQVMgSVNcIiBCQVNJUyxcbiAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLlxuICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZFxuICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuXG4gKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuICovXG5cbmltcG9ydCB7YmFja2VuZF91dGlsLCBHYXRoZXJOZCwgR2F0aGVyTmRJbnB1dHMsIEtlcm5lbENvbmZpZywgS2VybmVsRnVuYywgUmFuaywgVGVuc29ySW5mbywgVHlwZWRBcnJheSwgdXRpbH0gZnJvbSAnQHRlbnNvcmZsb3cvdGZqcy1jb3JlJztcblxuaW1wb3J0IHtNYXRoQmFja2VuZFdlYkdMfSBmcm9tICcuLi9iYWNrZW5kX3dlYmdsJztcbmltcG9ydCB7R2F0aGVyTkRQcm9ncmFtfSBmcm9tICcuLi9nYXRoZXJfbmRfZ3B1JztcbmltcG9ydCB7Z2F0aGVyTmRJbXBsQ1BVfSBmcm9tICcuLi9rZXJuZWxfdXRpbHMvc2hhcmVkJztcblxuaW1wb3J0IHtyZXNoYXBlfSBmcm9tICcuL1Jlc2hhcGUnO1xuXG5leHBvcnQgZnVuY3Rpb24gZ2F0aGVyTmQoXG4gICAgYXJnczoge2lucHV0czogR2F0aGVyTmRJbnB1dHMsIGJhY2tlbmQ6IE1hdGhCYWNrZW5kV2ViR0x9KTogVGVuc29ySW5mbyB7XG4gIGNvbnN0IHtpbnB1dHMsIGJhY2tlbmR9ID0gYXJncztcbiAgY29uc3Qge3BhcmFtcywgaW5kaWNlc30gPSBpbnB1dHM7XG5cbiAgY29uc3QgaW5kaWNlc1NoYXBlID0gaW5kaWNlcy5zaGFwZTtcbiAgY29uc3Qgc2xpY2VSYW5rID0gaW5kaWNlc1NoYXBlW2luZGljZXNTaGFwZS5sZW5ndGggLSAxXTtcbiAgY29uc3QgcGFyYW1zU2l6ZSA9IHV0aWwuc2l6ZUZyb21TaGFwZShwYXJhbXMuc2hhcGUpO1xuXG4gIGNvbnN0IFtyZXN1bHRTaGFwZSwgbnVtU2xpY2VzLCBzbGljZVNpemUsIHN0cmlkZXNdID1cbiAgICAgIGJhY2tlbmRfdXRpbC5wcmVwYXJlQW5kVmFsaWRhdGUocGFyYW1zLCBpbmRpY2VzKTtcblxuICBjb25zdCBmbGF0dGVuSW5kaWNlcyA9IHJlc2hhcGUoXG4gICAgICB7aW5wdXRzOiB7eDogaW5kaWNlc30sIGJhY2tlbmQsIGF0dHJzOiB7c2hhcGU6IFtudW1TbGljZXMsIHNsaWNlUmFua119fSk7XG4gIGNvbnN0IGZsYXR0ZW5YID0gcmVzaGFwZSh7XG4gICAgaW5wdXRzOiB7eDogcGFyYW1zfSxcbiAgICBiYWNrZW5kLFxuICAgIGF0dHJzOiB7c2hhcGU6IFsodXRpbC5zaXplRnJvbVNoYXBlKHBhcmFtcy5zaGFwZSkgLyBzbGljZVNpemUpLCBzbGljZVNpemVdfVxuICB9KTtcblxuICBpZiAoYmFja2VuZC5zaG91bGRFeGVjdXRlT25DUFUoW3BhcmFtcywgaW5kaWNlc10pIHx8XG4gICAgICBwYXJhbXMuZHR5cGUgPT09ICdzdHJpbmcnKSB7XG4gICAgY29uc3QgaW5kaWNlc0RhdGEgPSBiYWNrZW5kLnJlYWRTeW5jKGluZGljZXMuZGF0YUlkKSBhcyBUeXBlZEFycmF5O1xuICAgIGNvbnN0IHBhcmFtc0J1ZiA9IGJhY2tlbmQuYnVmZmVyU3luYzxSYW5rLCAnZmxvYXQzMic+KHBhcmFtcyk7XG4gICAgY29uc3Qgb3V0VmFsdWUgPSBnYXRoZXJOZEltcGxDUFUoXG4gICAgICAgIGluZGljZXNEYXRhLCBwYXJhbXNCdWYsIHBhcmFtcy5kdHlwZSwgbnVtU2xpY2VzLCBzbGljZVJhbmssIHNsaWNlU2l6ZSxcbiAgICAgICAgc3RyaWRlcywgcGFyYW1zLnNoYXBlLCBwYXJhbXNTaXplKTtcblxuICAgIHJldHVybiBiYWNrZW5kLm1ha2VUZW5zb3JJbmZvKHJlc3VsdFNoYXBlLCBwYXJhbXMuZHR5cGUsIG91dFZhbHVlLnZhbHVlcyk7XG4gIH1cbiAgY29uc3QgcHJvZ3JhbSA9XG4gICAgICBuZXcgR2F0aGVyTkRQcm9ncmFtKHNsaWNlUmFuaywgc3RyaWRlcywgW251bVNsaWNlcywgc2xpY2VTaXplXSwgXG4gICAgICAgIHBhcmFtcy5zaGFwZSk7XG4gIGNvbnN0IHJlcyA9IGJhY2tlbmQucnVuV2ViR0xQcm9ncmFtKFxuICAgICAgcHJvZ3JhbSwgW2ZsYXR0ZW5YLCBmbGF0dGVuSW5kaWNlc10sIGZsYXR0ZW5YLmR0eXBlKTtcblxuICBjb25zdCByZXNoYXBlZCA9XG4gICAgICByZXNoYXBlKHtpbnB1dHM6IHt4OiByZXN9LCBiYWNrZW5kLCBhdHRyczoge3NoYXBlOiByZXN1bHRTaGFwZX19KTtcblxuICBiYWNrZW5kLmRpc3Bvc2VJbnRlcm1lZGlhdGVUZW5zb3JJbmZvKGZsYXR0ZW5JbmRpY2VzKTtcbiAgYmFja2VuZC5kaXNwb3NlSW50ZXJtZWRpYXRlVGVuc29ySW5mbyhmbGF0dGVuWCk7XG4gIGJhY2tlbmQuZGlzcG9zZUludGVybWVkaWF0ZVRlbnNvckluZm8ocmVzKTtcblxuICByZXR1cm4gcmVzaGFwZWQ7XG59XG5cbmV4cG9ydCBjb25zdCBnYXRoZXJOZENvbmZpZzogS2VybmVsQ29uZmlnID0ge1xuICBrZXJuZWxOYW1lOiBHYXRoZXJOZCxcbiAgYmFja2VuZE5hbWU6ICd3ZWJnbCcsXG4gIGtlcm5lbEZ1bmM6IGdhdGhlck5kIGFzIHt9IGFzIEtlcm5lbEZ1bmNcbn07XG4iXX0=","/**\n * @license\n * Copyright 2017 Google LLC. All Rights Reserved.\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n * =============================================================================\n */\nimport { getCoordsDataType } from './shader_compiler';\nexport class GatherProgram {\n constructor(aShape, outputShape) {\n this.variableNames = ['A', 'indices'];\n this.outputShape = outputShape;\n this.rank = outputShape.length;\n const dtype = getCoordsDataType(this.rank);\n const sourceCoords = getSourceCoords(aShape, 2);\n this.userCode = `\n void main() {\n ${dtype} resRC = getOutputCoords();\n int index = int(getIndices(resRC.x, resRC.z));\n float inBounds = (index >= 0) && (index < ${aShape[2]}) ? 1.0 : 0.0;\n setOutput(inBounds * getA(${sourceCoords}));\n }\n `;\n }\n}\n// The input and output are always flattened into rank 4 tensors.\nfunction getSourceCoords(aShape, axis) {\n const currentCoords = ['resRC.x', 'resRC.y', 'resRC.z', 'resRC.w'];\n const sourceCoords = [];\n for (let i = 0; i < aShape.length; i++) {\n if (i === 2) {\n sourceCoords.push('index');\n }\n else {\n sourceCoords.push(`${currentCoords[i]}`);\n }\n }\n return sourceCoords.join();\n}\n//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZ2F0aGVyX2dwdS5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uL3RmanMtYmFja2VuZC13ZWJnbC9zcmMvZ2F0aGVyX2dwdS50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQTs7Ozs7Ozs7Ozs7Ozs7O0dBZUc7QUFHSCxPQUFPLEVBQUMsaUJBQWlCLEVBQUMsTUFBTSxtQkFBbUIsQ0FBQztBQUlwRCxNQUFNLE9BQU8sYUFBYTtJQU14QixZQUFZLE1BQW1CLEVBQUUsV0FBd0I7UUFMekQsa0JBQWEsR0FBRyxDQUFDLEdBQUcsRUFBRSxTQUFTLENBQUMsQ0FBQztRQU0vQixJQUFJLENBQUMsV0FBVyxHQUFHLFdBQVcsQ0FBQztRQUMvQixJQUFJLENBQUMsSUFBSSxHQUFHLFdBQVcsQ0FBQyxNQUFNLENBQUM7UUFDL0IsTUFBTSxLQUFLLEdBQUcsaUJBQWlCLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxDQUFDO1FBQzNDLE1BQU0sWUFBWSxHQUFHLGVBQWUsQ0FBQyxNQUFNLEVBQUUsQ0FBQyxDQUFDLENBQUM7UUFFaEQsSUFBSSxDQUFDLFFBQVEsR0FBRzs7VUFFVixLQUFLOztvREFFcUMsTUFBTSxDQUFDLENBQUMsQ0FBQztvQ0FDekIsWUFBWTs7S0FFM0MsQ0FBQztJQUNKLENBQUM7Q0FDRjtBQUVELGlFQUFpRTtBQUNqRSxTQUFTLGVBQWUsQ0FBQyxNQUFtQixFQUFFLElBQVk7SUFDeEQsTUFBTSxhQUFhLEdBQUcsQ0FBQyxTQUFTLEVBQUUsU0FBUyxFQUFFLFNBQVMsRUFBRSxTQUFTLENBQUMsQ0FBQztJQUVuRSxNQUFNLFlBQVksR0FBRyxFQUFFLENBQUM7SUFDeEIsS0FBSyxJQUFJLENBQUMsR0FBRyxDQUFDLEVBQUUsQ0FBQyxHQUFHLE1BQU0sQ0FBQyxNQUFNLEVBQUUsQ0FBQyxFQUFFLEVBQUU7UUFDdEMsSUFBSSxDQUFDLEtBQUssQ0FBQyxFQUFFO1lBQ1gsWUFBWSxDQUFDLElBQUksQ0FBQyxPQUFPLENBQUMsQ0FBQztTQUM1QjthQUFNO1lBQ0wsWUFBWSxDQUFDLElBQUksQ0FBQyxHQUFHLGFBQWEsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUM7U0FDMUM7S0FDRjtJQUNELE9BQU8sWUFBWSxDQUFDLElBQUksRUFBRSxDQUFDO0FBQzdCLENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyIvKipcbiAqIEBsaWNlbnNlXG4gKiBDb3B5cmlnaHQgMjAxNyBHb29nbGUgTExDLiBBbGwgUmlnaHRzIFJlc2VydmVkLlxuICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlIFwiTGljZW5zZVwiKTtcbiAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS5cbiAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdFxuICpcbiAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMFxuICpcbiAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmVcbiAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuIFwiQVMgSVNcIiBCQVNJUyxcbiAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLlxuICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZFxuICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuXG4gKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuICovXG5cbmltcG9ydCB7R1BHUFVQcm9ncmFtfSBmcm9tICcuL2dwZ3B1X21hdGgnO1xuaW1wb3J0IHtnZXRDb29yZHNEYXRhVHlwZX0gZnJvbSAnLi9zaGFkZXJfY29tcGlsZXInO1xuXG5leHBvcnQgdHlwZSBHYXRoZXJTaGFwZSA9IFtudW1iZXIsIG51bWJlciwgbnVtYmVyLCBudW1iZXJdO1xuXG5leHBvcnQgY2xhc3MgR2F0aGVyUHJvZ3JhbSBpbXBsZW1lbnRzIEdQR1BVUHJvZ3JhbSB7XG4gIHZhcmlhYmxlTmFtZXMgPSBbJ0EnLCAnaW5kaWNlcyddO1xuICBvdXRwdXRTaGFwZTogbnVtYmVyW107XG4gIHVzZXJDb2RlOiBzdHJpbmc7XG4gIHJhbms6IG51bWJlcjtcblxuICBjb25zdHJ1Y3RvcihhU2hhcGU6IEdhdGhlclNoYXBlLCBvdXRwdXRTaGFwZTogR2F0aGVyU2hhcGUpIHtcbiAgICB0aGlzLm91dHB1dFNoYXBlID0gb3V0cHV0U2hhcGU7XG4gICAgdGhpcy5yYW5rID0gb3V0cHV0U2hhcGUubGVuZ3RoO1xuICAgIGNvbnN0IGR0eXBlID0gZ2V0Q29vcmRzRGF0YVR5cGUodGhpcy5yYW5rKTtcbiAgICBjb25zdCBzb3VyY2VDb29yZHMgPSBnZXRTb3VyY2VDb29yZHMoYVNoYXBlLCAyKTtcblxuICAgIHRoaXMudXNlckNvZGUgPSBgXG4gICAgICB2b2lkIG1haW4oKSB7XG4gICAgICAgICR7ZHR5cGV9IHJlc1JDID0gZ2V0T3V0cHV0Q29vcmRzKCk7XG4gICAgICAgIGludCBpbmRleCA9IGludChnZXRJbmRpY2VzKHJlc1JDLngsIHJlc1JDLnopKTtcbiAgICAgICAgZmxvYXQgaW5Cb3VuZHMgPSAoaW5kZXggPj0gMCkgJiYgKGluZGV4IDwgJHthU2hhcGVbMl19KSA/IDEuMCA6IDAuMDtcbiAgICAgICAgc2V0T3V0cHV0KGluQm91bmRzICogZ2V0QSgke3NvdXJjZUNvb3Jkc30pKTtcbiAgICAgIH1cbiAgICBgO1xuICB9XG59XG5cbi8vIFRoZSBpbnB1dCBhbmQgb3V0cHV0IGFyZSBhbHdheXMgZmxhdHRlbmVkIGludG8gcmFuayA0IHRlbnNvcnMuXG5mdW5jdGlvbiBnZXRTb3VyY2VDb29yZHMoYVNoYXBlOiBHYXRoZXJTaGFwZSwgYXhpczogbnVtYmVyKTogc3RyaW5nIHtcbiAgY29uc3QgY3VycmVudENvb3JkcyA9IFsncmVzUkMueCcsICdyZXNSQy55JywgJ3Jlc1JDLnonLCAncmVzUkMudyddO1xuXG4gIGNvbnN0IHNvdXJjZUNvb3JkcyA9IFtdO1xuICBmb3IgKGxldCBpID0gMDsgaSA8IGFTaGFwZS5sZW5ndGg7IGkrKykge1xuICAgIGlmIChpID09PSAyKSB7XG4gICAgICBzb3VyY2VDb29yZHMucHVzaCgnaW5kZXgnKTtcbiAgICB9IGVsc2Uge1xuICAgICAgc291cmNlQ29vcmRzLnB1c2goYCR7Y3VycmVudENvb3Jkc1tpXX1gKTtcbiAgICB9XG4gIH1cbiAgcmV0dXJuIHNvdXJjZUNvb3Jkcy5qb2luKCk7XG59XG4iXX0=","/**\n * @license\n * Copyright 2020 Google LLC. All Rights Reserved.\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n * =============================================================================\n */\nimport { backend_util, GatherV2, util, env } from '@tensorflow/tfjs-core';\nimport { GatherProgram } from '../gather_gpu';\nimport { gatherV2ImplCPU } from '../kernel_utils/shared';\nimport { reshape } from './Reshape';\nexport function gatherV2(args) {\n const { inputs, backend, attrs } = args;\n const { x, indices } = inputs;\n const { axis, batchDims } = attrs;\n const parsedAxis = util.parseAxisParam(axis, x.shape)[0];\n if (env().get('DEBUG')) {\n // In debug mode, throw error when any index is out of bound.\n // Otherwise, just fill out of bounds with zeroes.\n const indicesVals = backend.readSync(indices.dataId);\n const axisDim = x.shape[parsedAxis];\n for (let i = 0; i < indicesVals.length; ++i) {\n const index = indicesVals[i];\n util.assert(index <= axisDim - 1 && index >= 0, () => `GatherV2: the index value ${index} is not in [0, ${axisDim - 1}]`);\n }\n }\n const shapeInfo = backend_util.segment_util.collectGatherOpShapeInfo(x, indices, parsedAxis, batchDims);\n const indicesSize = util.sizeFromShape(indices.shape);\n const toDispose = [];\n const flattenX = reshape({\n inputs: { x },\n backend,\n attrs: {\n shape: [\n shapeInfo.batchSize, shapeInfo.outerSize, shapeInfo.dimSize,\n shapeInfo.sliceSize\n ]\n }\n });\n const flattenIndex = reshape({\n inputs: { x: indices },\n backend,\n attrs: { shape: [shapeInfo.batchSize, indicesSize / shapeInfo.batchSize] }\n });\n toDispose.push(flattenX);\n toDispose.push(flattenIndex);\n const flattenOutputShape = [\n shapeInfo.batchSize, shapeInfo.outerSize, indicesSize / shapeInfo.batchSize,\n shapeInfo.sliceSize\n ];\n if (backend.shouldExecuteOnCPU([x, indices]) || x.dtype === 'string') {\n const indicesBuf = backend.bufferSync(flattenIndex);\n const xBuf = backend.bufferSync(flattenX);\n const outBuf = gatherV2ImplCPU(xBuf, indicesBuf, flattenOutputShape);\n toDispose.forEach(t => backend.disposeIntermediateTensorInfo(t));\n return backend.makeTensorInfo(shapeInfo.outputShape, outBuf.dtype, outBuf.values);\n }\n const program = new GatherProgram(flattenX.shape, flattenOutputShape);\n const res = backend.runWebGLProgram(program, [flattenX, flattenIndex], flattenX.dtype);\n toDispose.push(res);\n const reshaped = reshape({ inputs: { x: res }, backend, attrs: { shape: shapeInfo.outputShape } });\n toDispose.forEach(t => backend.disposeIntermediateTensorInfo(t));\n return reshaped;\n}\nexport const gatherV2Config = {\n kernelName: GatherV2,\n backendName: 'webgl',\n kernelFunc: gatherV2\n};\n//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiR2F0aGVyVjIuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi8uLi90ZmpzLWJhY2tlbmQtd2ViZ2wvc3JjL2tlcm5lbHMvR2F0aGVyVjIudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUE7Ozs7Ozs7Ozs7Ozs7OztHQWVHO0FBRUgsT0FBTyxFQUFDLFlBQVksRUFBRSxRQUFRLEVBQW1GLElBQUksRUFBRSxHQUFHLEVBQUMsTUFBTSx1QkFBdUIsQ0FBQztBQUd6SixPQUFPLEVBQUMsYUFBYSxFQUFjLE1BQU0sZUFBZSxDQUFDO0FBQ3pELE9BQU8sRUFBQyxlQUFlLEVBQUMsTUFBTSx3QkFBd0IsQ0FBQztBQUV2RCxPQUFPLEVBQUMsT0FBTyxFQUFDLE1BQU0sV0FBVyxDQUFDO0FBRWxDLE1BQU0sVUFBVSxRQUFRLENBQUMsSUFJeEI7SUFDQyxNQUFNLEVBQUMsTUFBTSxFQUFFLE9BQU8sRUFBRSxLQUFLLEVBQUMsR0FBRyxJQUFJLENBQUM7SUFDdEMsTUFBTSxFQUFDLENBQUMsRUFBRSxPQUFPLEVBQUMsR0FBRyxNQUFNLENBQUM7SUFDNUIsTUFBTSxFQUFDLElBQUksRUFBRSxTQUFTLEVBQUMsR0FBRyxLQUFLLENBQUM7SUFFaEMsTUFBTSxVQUFVLEdBQUcsSUFBSSxDQUFDLGNBQWMsQ0FBQyxJQUFJLEVBQUUsQ0FBQyxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDO0lBQ3pELElBQUksR0FBRyxFQUFFLENBQUMsR0FBRyxDQUFDLE9BQU8sQ0FBQyxFQUFFO1FBQ3RCLDZEQUE2RDtRQUM3RCxrREFBa0Q7UUFDbEQsTUFBTSxXQUFXLEdBQUcsT0FBTyxDQUFDLFFBQVEsQ0FBQyxPQUFPLENBQUMsTUFBTSxDQUFlLENBQUM7UUFDbkUsTUFBTSxPQUFPLEdBQUcsQ0FBQyxDQUFDLEtBQUssQ0FBQyxVQUFVLENBQUMsQ0FBQztRQUNwQyxLQUFLLElBQUksQ0FBQyxHQUFHLENBQUMsRUFBRSxDQUFDLEdBQUcs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RSxPQUFPLEVBQUUsS0FBSyxFQUFFLEVBQUMsS0FBSyxFQUFFLFNBQVMsQ0FBQyxXQUFXLEVBQUMsRUFBQyxDQUFDLENBQUM7SUFDeEUsU0FBUyxDQUFDLE9BQU8sQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLE9BQU8sQ0FBQyw2QkFBNkIsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDO0lBQ2pFLE9BQU8sUUFBUSxDQUFDO0FBQ2xCLENBQUM7QUFFRCxNQUFNLENBQUMsTUFBTSxjQUFjLEdBQWlCO0lBQzFDLFVBQVUsRUFBRSxRQUFRO0lBQ3BCLFdBQVcsRUFBRSxPQUFPO0lBQ3BCLFVBQVUsRUFBRSxRQUE0QjtDQUN6QyxDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiLyoqXG4gKiBAbGljZW5zZVxuICogQ29weXJpZ2h0IDIwMjAgR29vZ2xlIExMQy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC5cbiAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSBcIkxpY2Vuc2VcIik7XG4gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuXG4gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXRcbiAqXG4gKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjBcbiAqXG4gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlXG4gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiBcIkFTIElTXCIgQkFTSVMsXG4gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC5cbiAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmRcbiAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLlxuICogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbiAqL1xuXG5pbXBvcnQge2JhY2tlbmRfdXRpbCwgR2F0aGVyVjIsIEdhdGhlclYyQXR0cnMsIEdhdGhlclYySW5wdXRzLCBLZXJuZWxDb25maWcsIEtlcm5lbEZ1bmMsIFRlbnNvckluZm8sIFR5cGVkQXJyYXksIHV0aWwsIGVudn0gZnJvbSAnQHRlbnNvcmZsb3cvdGZqcy1jb3JlJztcblxuaW1wb3J0IHtNYXRoQmFja2VuZFdlYkdMfSBmcm9tICcuLi9iYWNrZW5kX3dlYmdsJztcbmltcG9ydCB7R2F0aGVyUHJvZ3JhbSwgR2F0aGVyU2hhcGV9IGZyb20gJy4uL2dhdGhlcl9ncHUnO1xuaW1wb3J0IHtnYXRoZXJWMkltcGxDUFV9IGZyb20gJy4uL2tlcm5lbF91dGlscy9zaGFyZWQnO1xuXG5pbXBvcnQge3Jlc2hhcGV9IGZyb20gJy4vUmVzaGFwZSc7XG5cbmV4cG9ydCBmdW5jdGlvbiBnYXRoZXJWMihhcmdzOiB7XG4gIGlucHV0czogR2F0aGVyVjJJbnB1dHMsXG4gIGJhY2tlbmQ6IE1hdGhCYWNrZW5kV2ViR0wsXG4gIGF0dHJzOiBHYXRoZXJWMkF0dHJzXG59KTogVGVuc29ySW5mbyB7XG4gIGNvbnN0IHtpbnB1dHMsIGJhY2tlbmQsIGF0dHJzfSA9IGFyZ3M7XG4gIGNvbnN0IHt4LCBpbmRpY2VzfSA9IGlucHV0cztcbiAgY29uc3Qge2F4aXMsIGJhdGNoRGltc30gPSBhdHRycztcblxuICBjb25zdCBwYXJzZWRBeGlzID0gdXRpbC5wYXJzZUF4aXNQYXJhbShheGlzLCB4LnNoYXBlKVswXTtcbiAgaWYgKGVudigpLmdldCgnREVCVUcnKSkge1xuICAgIC8vIEluIGRlYnVnIG1vZGUsIHRocm93IGVycm9yIHdoZW4gYW55IGluZGV4IGlzIG91dCBvZiBib3VuZC5cbiAgICAvLyBPdGhlcndpc2UsIGp1c3QgZmlsbCBvdXQgb2YgYm91bmRzIHdpdGggemVyb2VzLlxuICAgIGNvbnN0IGluZGljZXNWYWxzID0gYmFja2VuZC5yZWFkU3luYyhpbmRpY2VzLmRhdGFJZCkgYXMgVHlwZWRBcnJheTtcbiAgICBjb25zdCBheGlzRGltID0geC5zaGFwZVtwYXJzZWRBeGlzXTtcbiAgICBmb3IgKGxldCBpID0gMDsgaSA8IGluZGljZXNWYWxzLmxlbmd0aDsgKytpKSB7XG4gICAgICBjb25zdCBpbmRleCA9IGluZGljZXNWYWxzW2ldO1xuICAgICAgdXRpbC5hc3NlcnQoXG4gICAgICAgIGluZGV4IDw9IGF4aXNEaW0gLSAxICYmIGluZGV4ID49IDAsXG4gICAgICAgICgpID0+XG4gICAgICAgICAgYEdhdGhlclYyOiB0aGUgaW5kZXggdmFsdWUgJHtpbmRleH0gaXMgbm90IGluIFswLCAke2F4aXNEaW0gLSAxfV1gKTtcbiAgICB9XG4gIH1cblxuICBjb25zdCBzaGFwZUluZm8gPSBiYWNrZW5kX3V0aWwuc2VnbWVudF91dGlsLmNvbGxlY3RHYXRoZXJPcFNoYXBlSW5mbyhcbiAgICAgIHgsIGluZGljZXMsIHBhcnNlZEF4aXMsIGJhdGNoRGltcyk7XG5cbiAgY29uc3QgaW5kaWNlc1NpemUgPSB1dGlsLnNpemVGcm9tU2hhcGUoaW5kaWNlcy5zaGFwZSk7XG5cbiAgY29uc3QgdG9EaXNwb3NlID0gW107XG5cbiAgY29uc3QgZmxhdHRlblggPSByZXNoYXBlKHtcbiAgICBpbnB1dHM6IHt4fSxcbiAgICBiYWNrZW5kLFxuICAgIGF0dHJzOiB7XG4gICAgICBzaGFwZTogW1xuICAgICAgICBzaGFwZUluZm8uYmF0Y2hTaXplLCBzaGFwZUluZm8ub3V0ZXJTaXplLCBzaGFwZUluZm8uZGltU2l6ZSxcbiAgICAgICAgc2hhcGVJbmZvLnNsaWNlU2l6ZVxuICAgICAgXVxuICAgIH1cbiAgfSk7XG5cbiAgY29uc3QgZmxhdHRlbkluZGV4ID0gcmVzaGFwZSh7XG4gICAgaW5wdXRzOiB7eDogaW5kaWNlc30sXG4gICAgYmFja2VuZCxcbiAgICBhdHRyczoge3NoYXBlOiBbc2hhcGVJbmZvLmJhdGNoU2l6ZSwgaW5kaWNlc1NpemUgLyBzaGFwZUluZm8uYmF0Y2hTaXplXX1cbiAgfSk7XG5cbiAgdG9EaXNwb3NlLnB1c2goZmxhdHRlblgpO1xuICB0b0Rpc3Bvc2UucHVzaChmbGF0dGVuSW5kZXgpO1xuXG4gIGNvbnN0IGZsYXR0ZW5PdXRwdXRTaGFwZSA9IFtcbiAgICBzaGFwZUluZm8uYmF0Y2hTaXplLCBzaGFwZUluZm8ub3V0ZXJTaXplLCBpbmRpY2VzU2l6ZSAvIHNoYXBlSW5mby5iYXRjaFNpemUsXG4gICAgc2hhcGVJbmZvLnNsaWNlU2l6ZVxuICBdO1xuXG4gIGlmIChiYWNrZW5kLnNob3VsZEV4ZWN1dGVPbkNQVShbeCwgaW5kaWNlc10pIHx8IHguZHR5cGUgPT09ICdzdHJpbmcnKSB7XG4gICAgY29uc3QgaW5kaWNlc0J1ZiA9IGJhY2tlbmQuYnVmZmVyU3luYyhmbGF0dGVuSW5kZXgpO1xuICAgIGNvbnN0IHhCdWYgPSBiYWNrZW5kLmJ1ZmZlclN5bmMoZmxhdHRlblgpO1xuICAgIGNvbnN0IG91dEJ1ZiA9IGdhdGhlclYySW1wbENQVSh4QnVmLCBpbmRpY2VzQnVmLCBmbGF0dGVuT3V0cHV0U2hhcGUpO1xuXG4gICAgdG9EaXNwb3NlLmZvckVhY2godCA9PiBiYWNrZW5kLmRpc3Bvc2VJbnRlcm1lZGlhdGVUZW5zb3JJbmZvKHQpKTtcblxuICAgIHJldHVybiBiYWNrZW5kLm1ha2VUZW5zb3JJbmZvKFxuICAgICAgICBzaGFwZUluZm8ub3V0cHV0U2hhcGUsIG91dEJ1Zi5kdHlwZSwgb3V0QnVmLnZhbHVlcyBhcyBUeXBlZEFycmF5KTtcbiAgfVxuXG4gIGNvbnN0IHByb2dyYW0gPSBuZXcgR2F0aGVyUHJvZ3JhbShmbGF0dGVuWC5zaGFwZSBhcyBHYXRoZXJTaGFwZSxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZsYXR0ZW5PdXRwdXRTaGFwZSBhcyBHYXRoZXJTaGFwZSk7XG4gIGNvbnN0IHJlcyA9IGJhY2tlbmQucnVuV2ViR0xQcm9ncmFtKFxuICAgICAgcHJvZ3JhbSwgW2ZsYXR0ZW5YLCBmbGF0dGVuSW5kZXhdLCBmbGF0dGVuWC5kdHlwZSk7XG4gIHRvRGlzcG9zZS5wdXNoKHJlcyk7XG5cbiAgY29uc3QgcmVzaGFwZWQgPSByZXNoYXBlKFxuICAgICAge2lucHV0czoge3g6IHJlc30sIGJhY2tlbmQsIGF0dHJzOiB7c2hhcGU6IHNoYXBlSW5mby5vdXRwdXRTaGFwZX19KTtcbiAgdG9EaXNwb3NlLmZvckVhY2godCA9PiBiYWNrZW5kLmRpc3Bvc2VJbnRlcm1lZGlhdGVUZW5zb3JJbmZvKHQpKTtcbiAgcmV0dXJuIHJlc2hhcGVkO1xufVxuXG5leHBvcnQgY29uc3QgZ2F0aGVyVjJDb25maWc6IEtlcm5lbENvbmZpZyA9IHtcbiAga2VybmVsTmFtZTogR2F0aGVyVjIsXG4gIGJhY2tlbmROYW1lOiAnd2ViZ2wnLFxuICBrZXJuZWxGdW5jOiBnYXRoZXJWMiBhcyB7fSBhcyBLZXJuZWxGdW5jXG59O1xuIl19","/**\n * @license\n * Copyright 2020 Google LLC. All Rights Reserved.\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n * =============================================================================\n */\nimport { Greater } from '@tensorflow/tfjs-core';\nimport { binaryKernelFunc } from '../kernel_utils/kernel_funcs_utils';\nimport { greaterImplCPU } from '../kernel_utils/shared';\nconst GREATER = `return float(a > b);`;\nconst GREATER_PACKED = `\n return vec4(greaterThan(a, b));\n`;\nexport const greater = binaryKernelFunc({\n opSnippet: GREATER,\n packedOpSnippet: GREATER_PACKED,\n cpuKernelImpl: greaterImplCPU,\n dtype: 'bool'\n});\nexport const greaterConfig = {\n kernelName: Greater,\n backendName: 'webgl',\n kernelFunc: greater\n};\n//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiR3JlYXRlci5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uLy4uL3RmanMtYmFja2VuZC13ZWJnbC9zcmMva2VybmVscy9HcmVhdGVyLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBOzs7Ozs7Ozs7Ozs7Ozs7R0FlRztBQUVILE9BQU8sRUFBQyxPQUFPLEVBQTJCLE1BQU0sdUJBQXVCLENBQUM7QUFFeEUsT0FBTyxFQUFDLGdCQUFnQixFQUFDLE1BQU0sb0NBQW9DLENBQUM7QUFDcEUsT0FBTyxFQUFDLGNBQWMsRUFBQyxNQUFNLHdCQUF3QixDQUFDO0FBRXRELE1BQU0sT0FBTyxHQUFHLHNCQUFzQixDQUFDO0FBQ3ZDLE1BQU0sY0FBYyxHQUFHOztDQUV0QixDQUFDO0FBRUYsTUFBTSxDQUFDLE1BQU0sT0FBTyxHQUFHLGdCQUFnQixDQUFDO0lBQ3RDLFNBQVMsRUFBRSxPQUFPO0lBQ2xCLGVBQWUsRUFBRSxjQUFjO0lBQy9CLGFBQWEsRUFBRSxjQUFjO0lBQzdCLEtBQUssRUFBRSxNQUFNO0NBQ2QsQ0FBQyxDQUFDO0FBRUgsTUFBTSxDQUFDLE1BQU0sYUFBYSxHQUFpQjtJQUN6QyxVQUFVLEVBQUUsT0FBTztJQUNuQixXQUFXLEVBQUUsT0FBTztJQUNwQixVQUFVLEVBQUUsT0FBMkI7Q0FDeEMsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbIi8qKlxuICogQGxpY2Vuc2VcbiAqIENvcHlyaWdodCAyMDIwIEdvb2dsZSBMTEMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuXG4gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgXCJMaWNlbnNlXCIpO1xuICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLlxuICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0XG4gKlxuICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wXG4gKlxuICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZVxuICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gXCJBUyBJU1wiIEJBU0lTLFxuICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuXG4gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kXG4gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS5cbiAqID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4gKi9cblxuaW1wb3J0IHtHcmVhdGVyLCBLZXJuZWxDb25maWcsIEtlcm5lbEZ1bmN9IGZyb20gJ0B0ZW5zb3JmbG93L3RmanMtY29yZSc7XG5cbmltcG9ydCB7YmluYXJ5S2VybmVsRnVuY30gZnJvbSAnLi4va2VybmVsX3V0aWxzL2tlcm5lbF9mdW5jc191dGlscyc7XG5pbXBvcnQge2dyZWF0ZXJJbXBsQ1BVfSBmcm9tICcuLi9rZXJuZWxfdXRpbHMvc2hhcmVkJztcblxuY29uc3QgR1JFQVRFUiA9IGByZXR1cm4gZmxvYXQoYSA+IGIpO2A7XG5jb25zdCBHUkVBVEVSX1BBQ0tFRCA9IGBcbiAgcmV0dXJuIHZlYzQoZ3JlYXRlclRoYW4oYSwgYikpO1xuYDtcblxuZXhwb3J0IGNvbnN0IGdyZWF0ZXIgPSBiaW5hcnlLZXJuZWxGdW5jKHtcbiAgb3BTbmlwcGV0OiBHUkVBVEVSLFxuICBwYWNrZWRPcFNuaXBwZXQ6IEdSRUFURVJfUEFDS0VELFxuICBjcHVLZXJuZWxJbXBsOiBncmVhdGVySW1wbENQVSxcbiAgZHR5cGU6ICdib29sJ1xufSk7XG5cbmV4cG9ydCBjb25zdCBncmVhdGVyQ29uZmlnOiBLZXJuZWxDb25maWcgPSB7XG4gIGtlcm5lbE5hbWU6IEdyZWF0ZXIsXG4gIGJhY2tlbmROYW1lOiAnd2ViZ2wnLFxuICBrZXJuZWxGdW5jOiBncmVhdGVyIGFzIHt9IGFzIEtlcm5lbEZ1bmNcbn07XG4iXX0=","/**\n * @license\n * Copyright 2020 Google LLC. All Rights Reserved.\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n * =============================================================================\n */\nimport { GreaterEqual } from '@tensorflow/tfjs-core';\nimport { binaryKernelFunc } from '../kernel_utils/kernel_funcs_utils';\nimport { greaterEqualImplCPU } from '../kernel_utils/shared';\nconst GREATER_EQUAL = `return float(a >= b);`;\nconst GREATER_EQUAL_PACKED = `\n return vec4(greaterThanEqual(a, b));\n`;\nexport const greaterEqual = binaryKernelFunc({\n opSnippet: GREATER_EQUAL,\n packedOpSnippet: GREATER_EQUAL_PACKED,\n dtype: 'bool',\n cpuKernelImpl: greaterEqualImplCPU\n});\nexport const greaterEqualConfig = {\n kernelName: GreaterEqual,\n backendName: 'webgl',\n kernelFunc: greaterEqual\n};\n//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiR3JlYXRlckVxdWFsLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vLi4vdGZqcy1iYWNrZW5kLXdlYmdsL3NyYy9rZXJuZWxzL0dyZWF0ZXJFcXVhbC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQTs7Ozs7Ozs7Ozs7Ozs7O0dBZUc7QUFFSCxPQUFPLEVBQUMsWUFBWSxFQUEyQixNQUFNLHVCQUF1QixDQUFDO0FBQzdFLE9BQU8sRUFBQyxnQkFBZ0IsRUFBQyxNQUFNLG9DQUFvQyxDQUFDO0FBQ3BFLE9BQU8sRUFBQyxtQkFBbUIsRUFBQyxNQUFNLHdCQUF3QixDQUFDO0FBRTNELE1BQU0sYUFBYSxHQUFHLHVCQUF1QixDQUFDO0FBQzlDLE1BQU0sb0JBQW9CLEdBQUc7O0NBRTVCLENBQUM7QUFFRixNQUFNLENBQUMsTUFBTSxZQUFZLEdBQUcsZ0JBQWdCLENBQUM7SUFDM0MsU0FBUyxFQUFFLGFBQWE7SUFDeEIsZUFBZSxFQUFFLG9CQUFvQjtJQUNyQyxLQUFLLEVBQUUsTUFBTTtJQUNiLGFBQWEsRUFBRSxtQkFBbUI7Q0FDbkMsQ0FBQyxDQUFDO0FBRUgsTUFBTSxDQUFDLE1BQU0sa0JBQWtCLEdBQWlCO0lBQzlDLFVBQVUsRUFBRSxZQUFZO0lBQ3hCLFdBQVcsRUFBRSxPQUFPO0lBQ3BCLFVBQVUsRUFBRSxZQUFnQztDQUM3QyxDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiLyoqXG4gKiBAbGljZW5zZVxuICogQ29weXJpZ2h0IDIwMjAgR29vZ2xlIExMQy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC5cbiAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSBcIkxpY2Vuc2VcIik7XG4gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuXG4gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXRcbiAqXG4gKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjBcbiAqXG4gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlXG4gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiBcIkFTIElTXCIgQkFTSVMsXG4gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC5cbiAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmRcbiAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLlxuICogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbiAqL1xuXG5pbXBvcnQge0dyZWF0ZXJFcXVhbCwgS2VybmVsQ29uZmlnLCBLZXJuZWxGdW5jfSBmcm9tICdAdGVuc29yZmxvdy90ZmpzLWNvcmUnO1xuaW1wb3J0IHtiaW5hcnlLZXJuZWxGdW5jfSBmcm9tICcuLi9rZXJuZWxfdXRpbHMva2VybmVsX2Z1bmNzX3V0aWxzJztcbmltcG9ydCB7Z3JlYXRlckVxdWFsSW1wbENQVX0gZnJvbSAnLi4va2VybmVsX3V0aWxzL3NoYXJlZCc7XG5cbmNvbnN0IEdSRUFURVJfRVFVQUwgPSBgcmV0dXJuIGZsb2F0KGEgPj0gYik7YDtcbmNvbnN0IEdSRUFURVJfRVFVQUxfUEFDS0VEID0gYFxuICByZXR1cm4gdmVjNChncmVhdGVyVGhhbkVxdWFsKGEsIGIpKTtcbmA7XG5cbmV4cG9ydCBjb25zdCBncmVhdGVyRXF1YWwgPSBiaW5hcnlLZXJuZWxGdW5jKHtcbiAgb3BTbmlwcGV0OiBHUkVBVEVSX0VRVUFMLFxuICBwYWNrZWRPcFNuaXBwZXQ6IEdSRUFURVJfRVFVQUxfUEFDS0VELFxuICBkdHlwZTogJ2Jvb2wnLFxuICBjcHVLZXJuZWxJbXBsOiBncmVhdGVyRXF1YWxJbXBsQ1BVXG59KTtcblxuZXhwb3J0IGNvbnN0IGdyZWF0ZXJFcXVhbENvbmZpZzogS2VybmVsQ29uZmlnID0ge1xuICBrZXJuZWxOYW1lOiBHcmVhdGVyRXF1YWwsXG4gIGJhY2tlbmROYW1lOiAnd2ViZ2wnLFxuICBrZXJuZWxGdW5jOiBncmVhdGVyRXF1YWwgYXMge30gYXMgS2VybmVsRnVuY1xufTtcbiJdfQ==","/**\n * @license\n * Copyright 2020 Google LLC. All Rights Reserved.\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n * =============================================================================\n */\nimport { IFFT } from '@tensorflow/tfjs-core';\nimport { fftImpl } from './FFT_impl';\nexport function ifft(args) {\n const { inputs, backend } = args;\n const { input } = inputs;\n return fftImpl(input, true /* inverse */, backend);\n}\nexport const ifftConfig = {\n kernelName: IFFT,\n backendName: 'webgl',\n kernelFunc: ifft\n};\n//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiSUZGVC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uLy4uL3RmanMtYmFja2VuZC13ZWJnbC9zcmMva2VybmVscy9JRkZULnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBOzs7Ozs7Ozs7Ozs7Ozs7R0FlRztBQUVILE9BQU8sRUFBQyxJQUFJLEVBQXVDLE1BQU0sdUJBQXVCLENBQUM7QUFJakYsT0FBTyxFQUFDLE9BQU8sRUFBQyxNQUFNLFlBQVksQ0FBQztBQUVuQyxNQUFNLFVBQVUsSUFBSSxDQUFDLElBQXFEO0lBRXhFLE1BQU0sRUFBQyxNQUFNLEVBQUUsT0FBTyxFQUFDLEdBQUcsSUFBSSxDQUFDO0lBQy9CLE1BQU0sRUFBQyxLQUFLLEVBQUMsR0FBRyxNQUFNLENBQUM7SUFFdkIsT0FBTyxPQUFPLENBQUMsS0FBSyxFQUFFLElBQUksQ0FBQyxhQUFhLEVBQUUsT0FBTyxDQUFDLENBQUM7QUFDckQsQ0FBQztBQUVELE1BQU0sQ0FBQyxNQUFNLFVBQVUsR0FBaUI7SUFDdEMsVUFBVSxFQUFFLElBQUk7SUFDaEIsV0FBVyxFQUFFLE9BQU87SUFDcEIsVUFBVSxFQUFFLElBQUk7Q0FDakIsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbIi8qKlxuICogQGxpY2Vuc2VcbiAqIENvcHlyaWdodCAyMDIwIEdvb2dsZSBMTEMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuXG4gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgXCJMaWNlbnNlXCIpO1xuICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLlxuICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0XG4gKlxuICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wXG4gKlxuICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZVxuICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gXCJBUyBJU1wiIEJBU0lTLFxuICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuXG4gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kXG4gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS5cbiAqID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4gKi9cblxuaW1wb3J0IHtJRkZULCBJRkZUSW5wdXRzLCBLZXJuZWxDb25maWcsIFRlbnNvckluZm99IGZyb20gJ0B0ZW5zb3JmbG93L3RmanMtY29yZSc7XG5cbmltcG9ydCB7TWF0aEJhY2tlbmRXZWJHTH0gZnJvbSAnLi4vYmFja2VuZF93ZWJnbCc7XG5cbmltcG9ydCB7ZmZ0SW1wbH0gZnJvbSAnLi9GRlRfaW1wbCc7XG5cbmV4cG9ydCBmdW5jdGlvbiBpZmZ0KGFyZ3M6IHtpbnB1dHM6IElGRlRJbnB1dHMsIGJhY2tlbmQ6IE1hdGhCYWNrZW5kV2ViR0x9KTpcbiAgICBUZW5zb3JJbmZvIHtcbiAgY29uc3Qge2lucHV0cywgYmFja2VuZH0gPSBhcmdzO1xuICBjb25zdCB7aW5wdXR9ID0gaW5wdXRzO1xuXG4gIHJldHVybiBmZnRJbXBsKGlucHV0LCB0cnVlIC8qIGludmVyc2UgKi8sIGJhY2tlbmQpO1xufVxuXG5leHBvcnQgY29uc3QgaWZmdENvbmZpZzogS2VybmVsQ29uZmlnID0ge1xuICBrZXJuZWxOYW1lOiBJRkZULFxuICBiYWNrZW5kTmFtZTogJ3dlYmdsJyxcbiAga2VybmVsRnVuYzogaWZmdFxufTtcbiJdfQ==","/**\n * @license\n * Copyright 2020 Google LLC. All Rights Reserved.\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n * =============================================================================\n */\nimport { IsFinite } from '@tensorflow/tfjs-core';\nimport { unaryKernelFunc } from '../kernel_utils/kernel_funcs_utils';\nconst IS_FINITE = `return float(!isnan(x) && !isinf(x));`;\nexport const isFinite = unaryKernelFunc({ opSnippet: IS_FINITE, dtype: 'bool' });\nexport const isFiniteConfig = {\n kernelName: IsFinite,\n backendName: 'webgl',\n kernelFunc: isFinite,\n};\n//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiSXNGaW5pdGUuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi8uLi90ZmpzLWJhY2tlbmQtd2ViZ2wvc3JjL2tlcm5lbHMvSXNGaW5pdGUudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUE7Ozs7Ozs7Ozs7Ozs7OztHQWVHO0FBRUgsT0FBTyxFQUFDLFFBQVEsRUFBZSxNQUFNLHVCQUF1QixDQUFDO0FBQzdELE9BQU8sRUFBQyxlQUFlLEVBQUMsTUFBTSxvQ0FBb0MsQ0FBQztBQUVuRSxNQUFNLFNBQVMsR0FBRyx1Q0FBdUMsQ0FBQztBQUUxRCxNQUFNLENBQUMsTUFBTSxRQUFRLEdBQUcsZUFBZSxDQUFDLEVBQUMsU0FBUyxFQUFFLFNBQVMsRUFBRSxLQUFLLEVBQUUsTUFBTSxFQUFDLENBQUMsQ0FBQztBQUUvRSxNQUFNLENBQUMsTUFBTSxjQUFjLEdBQWlCO0lBQzFDLFVBQVUsRUFBRSxRQUFRO0lBQ3BCLFdBQVcsRUFBRSxPQUFPO0lBQ3BCLFVBQVUsRUFBRSxRQUFRO0NBQ3JCLENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyIvKipcbiAqIEBsaWNlbnNlXG4gKiBDb3B5cmlnaHQgMjAyMCBHb29nbGUgTExDLiBBbGwgUmlnaHRzIFJlc2VydmVkLlxuICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlIFwiTGljZW5zZVwiKTtcbiAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS5cbiAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdFxuICpcbiAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMFxuICpcbiAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmVcbiAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuIFwiQVMgSVNcIiBCQVNJUyxcbiAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLlxuICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZFxuICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuXG4gKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuICovXG5cbmltcG9ydCB7SXNGaW5pdGUsIEtlcm5lbENvbmZpZ30gZnJvbSAnQHRlbnNvcmZsb3cvdGZqcy1jb3JlJztcbmltcG9ydCB7dW5hcnlLZXJuZWxGdW5jfSBmcm9tICcuLi9rZXJuZWxfdXRpbHMva2VybmVsX2Z1bmNzX3V0aWxzJztcblxuY29uc3QgSVNfRklOSVRFID0gYHJldHVybiBmbG9hdCghaXNuYW4oeCkgJiYgIWlzaW5mKHgpKTtgO1xuXG5leHBvcnQgY29uc3QgaXNGaW5pdGUgPSB1bmFyeUtlcm5lbEZ1bmMoe29wU25pcHBldDogSVNfRklOSVRFLCBkdHlwZTogJ2Jvb2wnfSk7XG5cbmV4cG9ydCBjb25zdCBpc0Zpbml0ZUNvbmZpZzogS2VybmVsQ29uZmlnID0ge1xuICBrZXJuZWxOYW1lOiBJc0Zpbml0ZSxcbiAgYmFja2VuZE5hbWU6ICd3ZWJnbCcsXG4gIGtlcm5lbEZ1bmM6IGlzRmluaXRlLFxufTtcbiJdfQ==","/**\n * @license\n * Copyright 2020 Google LLC. All Rights Reserved.\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n * =============================================================================\n */\nimport { IsInf } from '@tensorflow/tfjs-core';\nimport { unaryKernelFunc } from '../kernel_utils/kernel_funcs_utils';\nconst IS_INF = `return float(isinf(x));`;\nexport const isInf = unaryKernelFunc({ opSnippet: IS_INF, dtype: 'bool' });\nexport const isInfConfig = {\n kernelName: IsInf,\n backendName: 'webgl',\n kernelFunc: isInf,\n};\n//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiSXNJbmYuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi8uLi90ZmpzLWJhY2tlbmQtd2ViZ2wvc3JjL2tlcm5lbHMvSXNJbmYudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUE7Ozs7Ozs7Ozs7Ozs7OztHQWVHO0FBRUgsT0FBTyxFQUFDLEtBQUssRUFBZSxNQUFNLHVCQUF1QixDQUFDO0FBQzFELE9BQU8sRUFBQyxlQUFlLEVBQUMsTUFBTSxvQ0FBb0MsQ0FBQztBQUVuRSxNQUFNLE1BQU0sR0FBRyx5QkFBeUIsQ0FBQztBQUV6QyxNQUFNLENBQUMsTUFBTSxLQUFLLEdBQUcsZUFBZSxDQUFDLEVBQUMsU0FBUyxFQUFFLE1BQU0sRUFBRSxLQUFLLEVBQUUsTUFBTSxFQUFDLENBQUMsQ0FBQztBQUV6RSxNQUFNLENBQUMsTUFBTSxXQUFXLEdBQWlCO0lBQ3ZDLFVBQVUsRUFBRSxLQUFLO0lBQ2pCLFdBQVcsRUFBRSxPQUFPO0lBQ3BCLFVBQVUsRUFBRSxLQUFLO0NBQ2xCLENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyIvKipcbiAqIEBsaWNlbnNlXG4gKiBDb3B5cmlnaHQgMjAyMCBHb29nbGUgTExDLiBBbGwgUmlnaHRzIFJlc2VydmVkLlxuICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlIFwiTGljZW5zZVwiKTtcbiAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS5cbiAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdFxuICpcbiAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMFxuICpcbiAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmVcbiAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuIFwiQVMgSVNcIiBCQVNJUyxcbiAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLlxuICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZFxuICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuXG4gKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuICovXG5cbmltcG9ydCB7SXNJbmYsIEtlcm5lbENvbmZpZ30gZnJvbSAnQHRlbnNvcmZsb3cvdGZqcy1jb3JlJztcbmltcG9ydCB7dW5hcnlLZXJuZWxGdW5jfSBmcm9tICcuLi9rZXJuZWxfdXRpbHMva2VybmVsX2Z1bmNzX3V0aWxzJztcblxuY29uc3QgSVNfSU5GID0gYHJldHVybiBmbG9hdChpc2luZih4KSk7YDtcblxuZXhwb3J0IGNvbnN0IGlzSW5mID0gdW5hcnlLZXJuZWxGdW5jKHtvcFNuaXBwZXQ6IElTX0lORiwgZHR5cGU6ICdib29sJ30pO1xuXG5leHBvcnQgY29uc3QgaXNJbmZDb25maWc6IEtlcm5lbENvbmZpZyA9IHtcbiAga2VybmVsTmFtZTogSXNJbmYsXG4gIGJhY2tlbmROYW1lOiAnd2ViZ2wnLFxuICBrZXJuZWxGdW5jOiBpc0luZixcbn07XG4iXX0=","/**\n * @license\n * Copyright 2020 Google LLC. All Rights Reserved.\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n * =============================================================================\n */\nimport { IsNan } from '@tensorflow/tfjs-core';\nimport { unaryKernelFunc } from '../kernel_utils/kernel_funcs_utils';\nconst IS_NAN = `return float(isnan(x));`;\nexport const isNaN = unaryKernelFunc({ opSnippet: IS_NAN, dtype: 'bool' });\nexport const isNaNConfig = {\n kernelName: IsNan,\n backendName: 'webgl',\n kernelFunc: isNaN,\n};\n//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiSXNOYU4uanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi8uLi90ZmpzLWJhY2tlbmQtd2ViZ2wvc3JjL2tlcm5lbHMvSXNOYU4udHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUE7Ozs7Ozs7Ozs7Ozs7OztHQWVHO0FBRUgsT0FBTyxFQUFDLEtBQUssRUFBZSxNQUFNLHVCQUF1QixDQUFDO0FBQzFELE9BQU8sRUFBQyxlQUFlLEVBQUMsTUFBTSxvQ0FBb0MsQ0FBQztBQUVuRSxNQUFNLE1BQU0sR0FBRyx5QkFBeUIsQ0FBQztBQUV6QyxNQUFNLENBQUMsTUFBTSxLQUFLLEdBQUcsZUFBZSxDQUFDLEVBQUMsU0FBUyxFQUFFLE1BQU0sRUFBRSxLQUFLLEVBQUUsTUFBTSxFQUFDLENBQUMsQ0FBQztBQUV6RSxNQUFNLENBQUMsTUFBTSxXQUFXLEdBQWlCO0lBQ3ZDLFVBQVUsRUFBRSxLQUFLO0lBQ2pCLFdBQVcsRUFBRSxPQUFPO0lBQ3BCLFVBQVUsRUFBRSxLQUFLO0NBQ2xCLENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyIvKipcbiAqIEBsaWNlbnNlXG4gKiBDb3B5cmlnaHQgMjAyMCBHb29nbGUgTExDLiBBbGwgUmlnaHRzIFJlc2VydmVkLlxuICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlIFwiTGljZW5zZVwiKTtcbiAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS5cbiAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdFxuICpcbiAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMFxuICpcbiAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmVcbiAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuIFwiQVMgSVNcIiBCQVNJUyxcbiAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLlxuICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZFxuICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuXG4gKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuICovXG5cbmltcG9ydCB7SXNOYW4sIEtlcm5lbENvbmZpZ30gZnJvbSAnQHRlbnNvcmZsb3cvdGZqcy1jb3JlJztcbmltcG9ydCB7dW5hcnlLZXJuZWxGdW5jfSBmcm9tICcuLi9rZXJuZWxfdXRpbHMva2VybmVsX2Z1bmNzX3V0aWxzJztcblxuY29uc3QgSVNfTkFOID0gYHJldHVybiBmbG9hdChpc25hbih4KSk7YDtcblxuZXhwb3J0IGNvbnN0IGlzTmFOID0gdW5hcnlLZXJuZWxGdW5jKHtvcFNuaXBwZXQ6IElTX05BTiwgZHR5cGU6ICdib29sJ30pO1xuXG5leHBvcnQgY29uc3QgaXNOYU5Db25maWc6IEtlcm5lbENvbmZpZyA9IHtcbiAga2VybmVsTmFtZTogSXNOYW4sXG4gIGJhY2tlbmROYW1lOiAnd2ViZ2wnLFxuICBrZXJuZWxGdW5jOiBpc05hTixcbn07XG4iXX0=","/**\n * @license\n * Copyright 2020 Google LLC. All Rights Reserved.\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n * =============================================================================\n */\nimport { Less } from '@tensorflow/tfjs-core';\nimport { binaryKernelFunc } from '../kernel_utils/kernel_funcs_utils';\nimport { lessImplCPU } from '../kernel_utils/shared';\nconst LESS = `return float(a < b);`;\nconst LESS_PACKED = `\n return vec4(lessThan(a, b));\n`;\nexport const less = binaryKernelFunc({\n opSnippet: LESS,\n packedOpSnippet: LESS_PACKED,\n cpuKernelImpl: lessImplCPU,\n dtype: 'bool'\n});\nexport const lessConfig = {\n kernelName: Less,\n backendName: 'webgl',\n kernelFunc: less\n};\n//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiTGVzcy5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uLy4uL3RmanMtYmFja2VuZC13ZWJnbC9zcmMva2VybmVscy9MZXNzLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBOzs7Ozs7Ozs7Ozs7Ozs7R0FlRztBQUVILE9BQU8sRUFBMkIsSUFBSSxFQUFDLE1BQU0sdUJBQXVCLENBQUM7QUFFckUsT0FBTyxFQUFDLGdCQUFnQixFQUFDLE1BQU0sb0NBQW9DLENBQUM7QUFDcEUsT0FBTyxFQUFDLFdBQVcsRUFBQyxNQUFNLHdCQUF3QixDQUFDO0FBRW5ELE1BQU0sSUFBSSxHQUFHLHNCQUFzQixDQUFDO0FBQ3BDLE1BQU0sV0FBVyxHQUFHOztDQUVuQixDQUFDO0FBRUYsTUFBTSxDQUFDLE1BQU0sSUFBSSxHQUFHLGdCQUFnQixDQUFDO0lBQ25DLFNBQVMsRUFBRSxJQUFJO0lBQ2YsZUFBZSxFQUFFLFdBQVc7SUFDNUIsYUFBYSxFQUFFLFdBQVc7SUFDMUIsS0FBSyxFQUFFLE1BQU07Q0FDZCxDQUFDLENBQUM7QUFFSCxNQUFNLENBQUMsTUFBTSxVQUFVLEdBQWlCO0lBQ3RDLFVBQVUsRUFBRSxJQUFJO0lBQ2hCLFdBQVcsRUFBRSxPQUFPO0lBQ3BCLFVBQVUsRUFBRSxJQUF3QjtDQUNyQyxDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiLyoqXG4gKiBAbGljZW5zZVxuICogQ29weXJpZ2h0IDIwMjAgR29vZ2xlIExMQy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC5cbiAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSBcIkxpY2Vuc2VcIik7XG4gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuXG4gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXRcbiAqXG4gKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjBcbiAqXG4gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlXG4gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiBcIkFTIElTXCIgQkFTSVMsXG4gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC5cbiAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmRcbiAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLlxuICogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbiAqL1xuXG5pbXBvcnQge0tlcm5lbENvbmZpZywgS2VybmVsRnVuYywgTGVzc30gZnJvbSAnQHRlbnNvcmZsb3cvdGZqcy1jb3JlJztcblxuaW1wb3J0IHtiaW5hcnlLZXJuZWxGdW5jfSBmcm9tICcuLi9rZXJuZWxfdXRpbHMva2VybmVsX2Z1bmNzX3V0aWxzJztcbmltcG9ydCB7bGVzc0ltcGxDUFV9IGZyb20gJy4uL2tlcm5lbF91dGlscy9zaGFyZWQnO1xuXG5jb25zdCBMRVNTID0gYHJldHVybiBmbG9hdChhIDwgYik7YDtcbmNvbnN0IExFU1NfUEFDS0VEID0gYFxuICByZXR1cm4gdmVjNChsZXNzVGhhbihhLCBiKSk7XG5gO1xuXG5leHBvcnQgY29uc3QgbGVzcyA9IGJpbmFyeUtlcm5lbEZ1bmMoe1xuICBvcFNuaXBwZXQ6IExFU1MsXG4gIHBhY2tlZE9wU25pcHBldDogTEVTU19QQUNLRUQsXG4gIGNwdUtlcm5lbEltcGw6IGxlc3NJbXBsQ1BVLFxuICBkdHlwZTogJ2Jvb2wnXG59KTtcblxuZXhwb3J0IGNvbnN0IGxlc3NDb25maWc6IEtlcm5lbENvbmZpZyA9IHtcbiAga2VybmVsTmFtZTogTGVzcyxcbiAgYmFja2VuZE5hbWU6ICd3ZWJnbCcsXG4gIGtlcm5lbEZ1bmM6IGxlc3MgYXMge30gYXMgS2VybmVsRnVuY1xufTtcbiJdfQ==","/**\n * @license\n * Copyright 2020 Google LLC. All Rights Reserved.\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n * =============================================================================\n */\nimport { LessEqual } from '@tensorflow/tfjs-core';\nimport { binaryKernelFunc } from '../kernel_utils/kernel_funcs_utils';\nimport { lessEqualImplCPU } from '../kernel_utils/shared';\nexport const LESS_EQUAL = `return float(a <= b);`;\nexport const LESS_EQUAL_PACKED = `\n return vec4(lessThanEqual(a, b));\n`;\nexport const lessEqual = binaryKernelFunc({\n opSnippet: LESS_EQUAL,\n packedOpSnippet: LESS_EQUAL_PACKED,\n cpuKernelImpl: lessEqualImplCPU,\n dtype: 'bool'\n});\nexport const lessEqualConfig = {\n kernelName: LessEqual,\n backendName: 'webgl',\n kernelFunc: lessEqual\n};\n//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiTGVzc0VxdWFsLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vLi4vdGZqcy1iYWNrZW5kLXdlYmdsL3NyYy9rZXJuZWxzL0xlc3NFcXVhbC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQTs7Ozs7Ozs7Ozs7Ozs7O0dBZUc7QUFFSCxPQUFPLEVBQTJCLFNBQVMsRUFBQyxNQUFNLHVCQUF1QixDQUFDO0FBRTFFLE9BQU8sRUFBQyxnQkFBZ0IsRUFBQyxNQUFNLG9DQUFvQyxDQUFDO0FBQ3BFLE9BQU8sRUFBQyxnQkFBZ0IsRUFBQyxNQUFNLHdCQUF3QixDQUFDO0FBRXhELE1BQU0sQ0FBQyxNQUFNLFVBQVUsR0FBRyx1QkFBdUIsQ0FBQztBQUNsRCxNQUFNLENBQUMsTUFBTSxpQkFBaUIsR0FBRzs7Q0FFaEMsQ0FBQztBQUVGLE1BQU0sQ0FBQyxNQUFNLFNBQVMsR0FBRyxnQkFBZ0IsQ0FBQztJQUN4QyxTQUFTLEVBQUUsVUFBVTtJQUNyQixlQUFlLEVBQUUsaUJBQWlCO0lBQ2xDLGFBQWEsRUFBRSxnQkFBZ0I7SUFDL0IsS0FBSyxFQUFFLE1BQU07Q0FDZCxDQUFDLENBQUM7QUFFSCxNQUFNLENBQUMsTUFBTSxlQUFlLEdBQWlCO0lBQzNDLFVBQVUsRUFBRSxTQUFTO0lBQ3JCLFdBQVcsRUFBRSxPQUFPO0lBQ3BCLFVBQVUsRUFBRSxTQUE2QjtDQUMxQyxDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiLyoqXG4gKiBAbGljZW5zZVxuICogQ29weXJpZ2h0IDIwMjAgR29vZ2xlIExMQy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC5cbiAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSBcIkxpY2Vuc2VcIik7XG4gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuXG4gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXRcbiAqXG4gKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjBcbiAqXG4gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlXG4gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiBcIkFTIElTXCIgQkFTSVMsXG4gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC5cbiAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmRcbiAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLlxuICogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbiAqL1xuXG5pbXBvcnQge0tlcm5lbENvbmZpZywgS2VybmVsRnVuYywgTGVzc0VxdWFsfSBmcm9tICdAdGVuc29yZmxvdy90ZmpzLWNvcmUnO1xuXG5pbXBvcnQge2JpbmFyeUtlcm5lbEZ1bmN9IGZyb20gJy4uL2tlcm5lbF91dGlscy9rZXJuZWxfZnVuY3NfdXRpbHMnO1xuaW1wb3J0IHtsZXNzRXF1YWxJbXBsQ1BVfSBmcm9tICcuLi9rZXJuZWxfdXRpbHMvc2hhcmVkJztcblxuZXhwb3J0IGNvbnN0IExFU1NfRVFVQUwgPSBgcmV0dXJuIGZsb2F0KGEgPD0gYik7YDtcbmV4cG9ydCBjb25zdCBMRVNTX0VRVUFMX1BBQ0tFRCA9IGBcbiAgcmV0dXJuIHZlYzQobGVzc1RoYW5FcXVhbChhLCBiKSk7XG5gO1xuXG5leHBvcnQgY29uc3QgbGVzc0VxdWFsID0gYmluYXJ5S2VybmVsRnVuYyh7XG4gIG9wU25pcHBldDogTEVTU19FUVVBTCxcbiAgcGFja2VkT3BTbmlwcGV0OiBMRVNTX0VRVUFMX1BBQ0tFRCxcbiAgY3B1S2VybmVsSW1wbDogbGVzc0VxdWFsSW1wbENQVSxcbiAgZHR5cGU6ICdib29sJ1xufSk7XG5cbmV4cG9ydCBjb25zdCBsZXNzRXF1YWxDb25maWc6IEtlcm5lbENvbmZpZyA9IHtcbiAga2VybmVsTmFtZTogTGVzc0VxdWFsLFxuICBiYWNrZW5kTmFtZTogJ3dlYmdsJyxcbiAga2VybmVsRnVuYzogbGVzc0VxdWFsIGFzIHt9IGFzIEtlcm5lbEZ1bmNcbn07XG4iXX0=","/**\n * @license\n * Copyright 2020 Google LLC. All Rights Reserved.\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n * =============================================================================\n */\nimport { LinSpace } from '@tensorflow/tfjs-core';\nimport { linSpaceImplCPU } from '../kernel_utils/shared';\nexport function linSpace(args) {\n const { backend, attrs } = args;\n const { start, stop, num } = attrs;\n // TODO: Use CPU implementation due to the precision problem in Safari.\n const outVals = linSpaceImplCPU(start, stop, num);\n return backend.makeTensorInfo([outVals.length], 'float32', outVals);\n}\nexport const linSpaceConfig = {\n kernelName: LinSpace,\n backendName: 'webgl',\n kernelFunc: linSpace\n};\n//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiTGluU3BhY2UuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi8uLi90ZmpzLWJhY2tlbmQtd2ViZ2wvc3JjL2tlcm5lbHMvTGluU3BhY2UudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUE7Ozs7Ozs7Ozs7Ozs7OztHQWVHO0FBRUgsT0FBTyxFQUEyQixRQUFRLEVBQTRCLE1BQU0sdUJBQXVCLENBQUM7QUFHcEcsT0FBTyxFQUFDLGVBQWUsRUFBQyxNQUFNLHdCQUF3QixDQUFDO0FBRXZELE1BQU0sVUFBVSxRQUFRLENBQ3BCLElBQXVEO0lBQ3pELE1BQU0sRUFBQyxPQUFPLEVBQUUsS0FBSyxFQUFDLEdBQUcsSUFBSSxDQUFDO0lBQzlCLE1BQU0sRUFBQyxLQUFLLEVBQUUsSUFBSSxFQUFFLEdBQUcsRUFBQyxHQUFHLEtBQUssQ0FBQztJQUVqQyx1RUFBdUU7SUFDdkUsTUFBTSxPQUFPLEdBQUcsZUFBZSxDQUFDLEtBQUssRUFBRSxJQUFJLEVBQUUsR0FBRyxDQUFDLENBQUM7SUFDbEQsT0FBTyxPQUFPLENBQUMsY0FBYyxDQUFDLENBQUMsT0FBTyxDQUFDLE1BQU0sQ0FBQyxFQUFFLFNBQVMsRUFBRSxPQUFPLENBQUMsQ0FBQztBQUN0RSxDQUFDO0FBRUQsTUFBTSxDQUFDLE1BQU0sY0FBYyxHQUFpQjtJQUMxQyxVQUFVLEVBQUUsUUFBUTtJQUNwQixXQUFXLEVBQUUsT0FBTztJQUNwQixVQUFVLEVBQUUsUUFBNEI7Q0FDekMsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbIi8qKlxuICogQGxpY2Vuc2VcbiAqIENvcHlyaWdodCAyMDIwIEdvb2dsZSBMTEMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuXG4gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgXCJMaWNlbnNlXCIpO1xuICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLlxuICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0XG4gKlxuICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wXG4gKlxuICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZVxuICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gXCJBUyBJU1wiIEJBU0lTLFxuICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuXG4gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kXG4gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS5cbiAqID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4gKi9cblxuaW1wb3J0IHtLZXJuZWxDb25maWcsIEtlcm5lbEZ1bmMsIExpblNwYWNlLCBMaW5TcGFjZUF0dHJzLCBUZW5zb3JJbmZvfSBmcm9tICdAdGVuc29yZmxvdy90ZmpzLWNvcmUnO1xuXG5pbXBvcnQge01hdGhCYWNrZW5kV2ViR0x9IGZyb20gJy4uL2JhY2tlbmRfd2ViZ2wnO1xuaW1wb3J0IHtsaW5TcGFjZUltcGxDUFV9IGZyb20gJy4uL2tlcm5lbF91dGlscy9zaGFyZWQnO1xuXG5leHBvcnQgZnVuY3Rpb24gbGluU3BhY2UoXG4gICAgYXJnczoge2JhY2tlbmQ6IE1hdGhCYWNrZW5kV2ViR0wsIGF0dHJzOiBMaW5TcGFjZUF0dHJzfSk6IFRlbnNvckluZm8ge1xuICBjb25zdCB7YmFja2VuZCwgYXR0cnN9ID0gYXJncztcbiAgY29uc3Qge3N0YXJ0LCBzdG9wLCBudW19ID0gYXR0cnM7XG5cbiAgLy8gVE9ETzogVXNlIENQVSBpbXBsZW1lbnRhdGlvbiBkdWUgdG8gdGhlIHByZWNpc2lvbiBwcm9ibGVtIGluIFNhZmFyaS5cbiAgY29uc3Qgb3V0VmFscyA9IGxpblNwYWNlSW1wbENQVShzdGFydCwgc3RvcCwgbnVtKTtcbiAgcmV0dXJuIGJhY2tlbmQubWFrZVRlbnNvckluZm8oW291dFZhbHMubGVuZ3RoXSwgJ2Zsb2F0MzInLCBvdXRWYWxzKTtcbn1cblxuZXhwb3J0IGNvbnN0IGxpblNwYWNlQ29uZmlnOiBLZXJuZWxDb25maWcgPSB7XG4gIGtlcm5lbE5hbWU6IExpblNwYWNlLFxuICBiYWNrZW5kTmFtZTogJ3dlYmdsJyxcbiAga2VybmVsRnVuYzogbGluU3BhY2UgYXMge30gYXMgS2VybmVsRnVuY1xufTtcbiJdfQ==","/**\n * @license\n * Copyright 2020 Google LLC. All Rights Reserved.\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n * =============================================================================\n */\nimport { Log } from '@tensorflow/tfjs-core';\nimport { CHECK_NAN_SNIPPET_UNARY, unaryKernelFunc } from '../kernel_utils/kernel_funcs_utils';\nimport { logImplCPU } from '../kernel_utils/shared';\n// Windows chrome return 0 if the input is negative value. We will specifically\n// return NaN if the input is 0 to solve compatiblity issue.\nconst LOG = CHECK_NAN_SNIPPET_UNARY + `\n return x < 0.0 ? 0./0. : log(x);\n`;\nconst LOG_PACKED = `\n vec4 result = log(x);\n bvec4 isNaN = isnan(x);\n result.r = isNaN.r ? x.r : (x.r < 0.0 ? 0./0. : result.r);\n result.g = isNaN.g ? x.g : (x.g < 0.0 ? 0./0. : result.g);\n result.b = isNaN.b ? x.b : (x.b < 0.0 ? 0./0. : result.b);\n result.a = isNaN.a ? x.a : (x.a < 0.0 ? 0./0. : result.a);\n return result;\n`;\nexport const log = unaryKernelFunc({ opSnippet: LOG, packedOpSnippet: LOG_PACKED, cpuKernelImpl: logImplCPU });\nexport const logConfig = {\n kernelName: Log,\n backendName: 'webgl',\n kernelFunc: log\n};\n//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiTG9nLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vLi4vdGZqcy1iYWNrZW5kLXdlYmdsL3NyYy9rZXJuZWxzL0xvZy50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQTs7Ozs7Ozs7Ozs7Ozs7O0dBZUc7QUFFSCxPQUFPLEVBQTJCLEdBQUcsRUFBQyxNQUFNLHVCQUF1QixDQUFDO0FBRXBFLE9BQU8sRUFBQyx1QkFBdUIsRUFBRSxlQUFlLEVBQUMsTUFBTSxvQ0FBb0MsQ0FBQztBQUM1RixPQUFPLEVBQUMsVUFBVSxFQUFDLE1BQU0sd0JBQXdCLENBQUM7QUFFbEQsK0VBQStFO0FBQy9FLDREQUE0RDtBQUM1RCxNQUFNLEdBQUcsR0FBRyx1QkFBdUIsR0FBRzs7Q0FFckMsQ0FBQztBQUVGLE1BQU0sVUFBVSxHQUFHOzs7Ozs7OztDQVFsQixDQUFDO0FBRUYsTUFBTSxDQUFDLE1BQU0sR0FBRyxHQUFHLGVBQWUsQ0FDOUIsRUFBQyxTQUFTLEVBQUUsR0FBRyxFQUFFLGVBQWUsRUFBRSxVQUFVLEVBQUUsYUFBYSxFQUFFLFVBQVUsRUFBQyxDQUFDLENBQUM7QUFFOUUsTUFBTSxDQUFDLE1BQU0sU0FBUyxHQUFpQjtJQUNyQyxVQUFVLEVBQUUsR0FBRztJQUNmLFdBQVcsRUFBRSxPQUFPO0lBQ3BCLFVBQVUsRUFBRSxHQUF1QjtDQUNwQyxDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiLyoqXG4gKiBAbGljZW5zZVxuICogQ29weXJpZ2h0IDIwMjAgR29vZ2xlIExMQy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC5cbiAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSBcIkxpY2Vuc2VcIik7XG4gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuXG4gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXRcbiAqXG4gKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjBcbiAqXG4gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlXG4gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiBcIkFTIElTXCIgQkFTSVMsXG4gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC5cbiAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmRcbiAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLlxuICogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbiAqL1xuXG5pbXBvcnQge0tlcm5lbENvbmZpZywgS2VybmVsRnVuYywgTG9nfSBmcm9tICdAdGVuc29yZmxvdy90ZmpzLWNvcmUnO1xuXG5pbXBvcnQge0NIRUNLX05BTl9TTklQUEVUX1VOQVJZLCB1bmFyeUtlcm5lbEZ1bmN9IGZyb20gJy4uL2tlcm5lbF91dGlscy9rZXJuZWxfZnVuY3NfdXRpbHMnO1xuaW1wb3J0IHtsb2dJbXBsQ1BVfSBmcm9tICcuLi9rZXJuZWxfdXRpbHMvc2hhcmVkJztcblxuLy8gV2luZG93cyBjaHJvbWUgcmV0dXJuIDAgaWYgdGhlIGlucHV0IGlzIG5lZ2F0aXZlIHZhbHVlLiBXZSB3aWxsIHNwZWNpZmljYWxseVxuLy8gcmV0dXJuIE5hTiBpZiB0aGUgaW5wdXQgaXMgMCB0byBzb2x2ZSBjb21wYXRpYmxpdHkgaXNzdWUuXG5jb25zdCBMT0cgPSBDSEVDS19OQU5fU05JUFBFVF9VTkFSWSArIGBcbiAgcmV0dXJuIHggPCAwLjAgPyAwLi8wLiA6IGxvZyh4KTtcbmA7XG5cbmNvbnN0IExPR19QQUNLRUQgPSBgXG4gIHZlYzQgcmVzdWx0ID0gbG9nKHgpO1xuICBidmVjNCBpc05hTiA9IGlzbmFuKHgpO1xuICByZXN1bHQuciA9IGlzTmFOLnIgPyB4LnIgOiAoeC5yIDwgMC4wID8gMC4vMC4gOiByZXN1bHQucik7XG4gIHJlc3VsdC5nID0gaXNOYU4uZyA/IHguZyA6ICh4LmcgPCAwLjAgPyAwLi8wLiA6IHJlc3VsdC5nKTtcbiAgcmVzdWx0LmIgPSBpc05hTi5iID8geC5iIDogKHguYiA8IDAuMCA/IDAuLzAuIDogcmVzdWx0LmIpO1xuICByZXN1bHQuYSA9IGlzTmFOLmEgPyB4LmEgOiAoeC5hIDwgMC4wID8gMC4vMC4gOiByZXN1bHQuYSk7XG4gIHJldHVybiByZXN1bHQ7XG5gO1xuXG5leHBvcnQgY29uc3QgbG9nID0gdW5hcnlLZXJuZWxGdW5jKFxuICAgIHtvcFNuaXBwZXQ6IExPRywgcGFja2VkT3BTbmlwcGV0OiBMT0dfUEFDS0VELCBjcHVLZXJuZWxJbXBsOiBsb2dJbXBsQ1BVfSk7XG5cbmV4cG9ydCBjb25zdCBsb2dDb25maWc6IEtlcm5lbENvbmZpZyA9IHtcbiAga2VybmVsTmFtZTogTG9nLFxuICBiYWNrZW5kTmFtZTogJ3dlYmdsJyxcbiAga2VybmVsRnVuYzogbG9nIGFzIHt9IGFzIEtlcm5lbEZ1bmNcbn07XG4iXX0=","/**\n * @license\n * Copyright 2020 Google LLC. All Rights Reserved.\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n * =============================================================================\n */\nimport { Log1p } from '@tensorflow/tfjs-core';\nimport { CHECK_NAN_SNIPPET_UNARY, unaryKernelFunc } from '../kernel_utils/kernel_funcs_utils';\nconst LOG1P = CHECK_NAN_SNIPPET_UNARY + `\n return log(1.0 + x);\n`;\nexport const log1p = unaryKernelFunc({ opSnippet: LOG1P });\nexport const log1pConfig = {\n kernelName: Log1p,\n backendName: 'webgl',\n kernelFunc: log1p,\n};\n//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiTG9nMXAuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi8uLi90ZmpzLWJhY2tlbmQtd2ViZ2wvc3JjL2tlcm5lbHMvTG9nMXAudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUE7Ozs7Ozs7Ozs7Ozs7OztHQWVHO0FBRUgsT0FBTyxFQUFlLEtBQUssRUFBQyxNQUFNLHVCQUF1QixDQUFDO0FBRTFELE9BQU8sRUFBQyx1QkFBdUIsRUFBRSxlQUFlLEVBQUMsTUFBTSxvQ0FBb0MsQ0FBQztBQUU1RixNQUFNLEtBQUssR0FBRyx1QkFBdUIsR0FBRzs7Q0FFdkMsQ0FBQztBQUVGLE1BQU0sQ0FBQyxNQUFNLEtBQUssR0FBRyxlQUFlLENBQUMsRUFBQyxTQUFTLEVBQUUsS0FBSyxFQUFDLENBQUMsQ0FBQztBQUV6RCxNQUFNLENBQUMsTUFBTSxXQUFXLEdBQWlCO0lBQ3ZDLFVBQVUsRUFBRSxLQUFLO0lBQ2pCLFdBQVcsRUFBRSxPQUFPO0lBQ3BCLFVBQVUsRUFBRSxLQUFLO0NBQ2xCLENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyIvKipcbiAqIEBsaWNlbnNlXG4gKiBDb3B5cmlnaHQgMjAyMCBHb29nbGUgTExDLiBBbGwgUmlnaHRzIFJlc2VydmVkLlxuICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlIFwiTGljZW5zZVwiKTtcbiAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS5cbiAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdFxuICpcbiAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMFxuICpcbiAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmVcbiAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuIFwiQVMgSVNcIiBCQVNJUyxcbiAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLlxuICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZFxuICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuXG4gKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuICovXG5cbmltcG9ydCB7S2VybmVsQ29uZmlnLCBMb2cxcH0gZnJvbSAnQHRlbnNvcmZsb3cvdGZqcy1jb3JlJztcblxuaW1wb3J0IHtDSEVDS19OQU5fU05JUFBFVF9VTkFSWSwgdW5hcnlLZXJuZWxGdW5jfSBmcm9tICcuLi9rZXJuZWxfdXRpbHMva2VybmVsX2Z1bmNzX3V0aWxzJztcblxuY29uc3QgTE9HMVAgPSBDSEVDS19OQU5fU05JUFBFVF9VTkFSWSArIGBcbiAgcmV0dXJuIGxvZygxLjAgKyB4KTtcbmA7XG5cbmV4cG9ydCBjb25zdCBsb2cxcCA9IHVuYXJ5S2VybmVsRnVuYyh7b3BTbmlwcGV0OiBMT0cxUH0pO1xuXG5leHBvcnQgY29uc3QgbG9nMXBDb25maWc6IEtlcm5lbENvbmZpZyA9IHtcbiAga2VybmVsTmFtZTogTG9nMXAsXG4gIGJhY2tlbmROYW1lOiAnd2ViZ2wnLFxuICBrZXJuZWxGdW5jOiBsb2cxcCxcbn07XG4iXX0=","/**\n * @license\n * Copyright 2020 Google LLC. All Rights Reserved.\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n * =============================================================================\n */\nimport { LogicalAnd } from '@tensorflow/tfjs-core';\nimport { binaryKernelFunc } from '../kernel_utils/kernel_funcs_utils';\nconst LOGICAL_AND = `return float(a >= 1.0 && b >= 1.0);`;\nconst LOGICAL_AND_PACKED = `\n return vec4(\n vec4(greaterThanEqual(a, vec4(1.0))) *\n vec4(greaterThanEqual(b, vec4(1.0))));\n`;\nexport const logicalAnd = binaryKernelFunc({\n opSnippet: LOGICAL_AND,\n packedOpSnippet: LOGICAL_AND_PACKED,\n dtype: 'bool'\n});\nexport const logicalAndConfig = {\n kernelName: LogicalAnd,\n backendName: 'webgl',\n kernelFunc: logicalAnd\n};\n//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiTG9naWNhbEFuZC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uLy4uL3RmanMtYmFja2VuZC13ZWJnbC9zcmMva2VybmVscy9Mb2dpY2FsQW5kLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBOzs7Ozs7Ozs7Ozs7Ozs7R0FlRztBQUVILE9BQU8sRUFBMkIsVUFBVSxFQUFDLE1BQU0sdUJBQXVCLENBQUM7QUFFM0UsT0FBTyxFQUFDLGdCQUFnQixFQUFDLE1BQU0sb0NBQW9DLENBQUM7QUFFcEUsTUFBTSxXQUFXLEdBQUcscUNBQXFDLENBQUM7QUFDMUQsTUFBTSxrQkFBa0IsR0FBRzs7OztDQUkxQixDQUFDO0FBRUYsTUFBTSxDQUFDLE1BQU0sVUFBVSxHQUFHLGdCQUFnQixDQUFDO0lBQ3pDLFNBQVMsRUFBRSxXQUFXO0lBQ3RCLGVBQWUsRUFBRSxrQkFBa0I7SUFDbkMsS0FBSyxFQUFFLE1BQU07Q0FDZCxDQUFDLENBQUM7QUFFSCxNQUFNLENBQUMsTUFBTSxnQkFBZ0IsR0FBaUI7SUFDNUMsVUFBVSxFQUFFLFVBQVU7SUFDdEIsV0FBVyxFQUFFLE9BQU87SUFDcEIsVUFBVSxFQUFFLFVBQThCO0NBQzNDLENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyIvKipcbiAqIEBsaWNlbnNlXG4gKiBDb3B5cmlnaHQgMjAyMCBHb29nbGUgTExDLiBBbGwgUmlnaHRzIFJlc2VydmVkLlxuICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlIFwiTGljZW5zZVwiKTtcbiAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS5cbiAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdFxuICpcbiAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMFxuICpcbiAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmVcbiAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuIFwiQVMgSVNcIiBCQVNJUyxcbiAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLlxuICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZFxuICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuXG4gKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuICovXG5cbmltcG9ydCB7S2VybmVsQ29uZmlnLCBLZXJuZWxGdW5jLCBMb2dpY2FsQW5kfSBmcm9tICdAdGVuc29yZmxvdy90ZmpzLWNvcmUnO1xuXG5pbXBvcnQge2JpbmFyeUtlcm5lbEZ1bmN9IGZyb20gJy4uL2tlcm5lbF91dGlscy9rZXJuZWxfZnVuY3NfdXRpbHMnO1xuXG5jb25zdCBMT0dJQ0FMX0FORCA9IGByZXR1cm4gZmxvYXQoYSA+PSAxLjAgJiYgYiA+PSAxLjApO2A7XG5jb25zdCBMT0dJQ0FMX0FORF9QQUNLRUQgPSBgXG4gIHJldHVybiB2ZWM0KFxuICAgIHZlYzQoZ3JlYXRlclRoYW5FcXVhbChhLCB2ZWM0KDEuMCkpKSAqXG4gICAgdmVjNChncmVhdGVyVGhhbkVxdWFsKGIsIHZlYzQoMS4wKSkpKTtcbmA7XG5cbmV4cG9ydCBjb25zdCBsb2dpY2FsQW5kID0gYmluYXJ5S2VybmVsRnVuYyh7XG4gIG9wU25pcHBldDogTE9HSUNBTF9BTkQsXG4gIHBhY2tlZE9wU25pcHBldDogTE9HSUNBTF9BTkRfUEFDS0VELFxuICBkdHlwZTogJ2Jvb2wnXG59KTtcblxuZXhwb3J0IGNvbnN0IGxvZ2ljYWxBbmRDb25maWc6IEtlcm5lbENvbmZpZyA9IHtcbiAga2VybmVsTmFtZTogTG9naWNhbEFuZCxcbiAgYmFja2VuZE5hbWU6ICd3ZWJnbCcsXG4gIGtlcm5lbEZ1bmM6IGxvZ2ljYWxBbmQgYXMge30gYXMgS2VybmVsRnVuY1xufTtcbiJdfQ==","/**\n * @license\n * Copyright 2020 Google LLC. All Rights Reserved.\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n * =============================================================================\n */\nimport { LogicalNot } from '@tensorflow/tfjs-core';\nimport { unaryKernelFunc } from '../kernel_utils/kernel_funcs_utils';\nconst LOGICAL_NOT = `return float(!(x >= 1.0));`;\nexport const logicalNot = unaryKernelFunc({ opSnippet: LOGICAL_NOT });\nexport const logicalNotConfig = {\n kernelName: LogicalNot,\n backendName: 'webgl',\n kernelFunc: logicalNot,\n};\n//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiTG9naWNhbE5vdC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uLy4uL3RmanMtYmFja2VuZC13ZWJnbC9zcmMva2VybmVscy9Mb2dpY2FsTm90LnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBOzs7Ozs7Ozs7Ozs7Ozs7R0FlRztBQUVILE9BQU8sRUFBZSxVQUFVLEVBQUMsTUFBTSx1QkFBdUIsQ0FBQztBQUMvRCxPQUFPLEVBQUMsZUFBZSxFQUFDLE1BQU0sb0NBQW9DLENBQUM7QUFFbkUsTUFBTSxXQUFXLEdBQUcsNEJBQTRCLENBQUM7QUFFakQsTUFBTSxDQUFDLE1BQU0sVUFBVSxHQUFHLGVBQWUsQ0FBQyxFQUFDLFNBQVMsRUFBRSxXQUFXLEVBQUMsQ0FBQyxDQUFDO0FBRXBFLE1BQU0sQ0FBQyxNQUFNLGdCQUFnQixHQUFpQjtJQUM1QyxVQUFVLEVBQUUsVUFBVTtJQUN0QixXQUFXLEVBQUUsT0FBTztJQUNwQixVQUFVLEVBQUUsVUFBVTtDQUN2QixDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiLyoqXG4gKiBAbGljZW5zZVxuICogQ29weXJpZ2h0IDIwMjAgR29vZ2xlIExMQy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC5cbiAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSBcIkxpY2Vuc2VcIik7XG4gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuXG4gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXRcbiAqXG4gKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjBcbiAqXG4gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlXG4gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiBcIkFTIElTXCIgQkFTSVMsXG4gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC5cbiAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmRcbiAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLlxuICogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbiAqL1xuXG5pbXBvcnQge0tlcm5lbENvbmZpZywgTG9naWNhbE5vdH0gZnJvbSAnQHRlbnNvcmZsb3cvdGZqcy1jb3JlJztcbmltcG9ydCB7dW5hcnlLZXJuZWxGdW5jfSBmcm9tICcuLi9rZXJuZWxfdXRpbHMva2VybmVsX2Z1bmNzX3V0aWxzJztcblxuY29uc3QgTE9HSUNBTF9OT1QgPSBgcmV0dXJuIGZsb2F0KCEoeCA+PSAxLjApKTtgO1xuXG5leHBvcnQgY29uc3QgbG9naWNhbE5vdCA9IHVuYXJ5S2VybmVsRnVuYyh7b3BTbmlwcGV0OiBMT0dJQ0FMX05PVH0pO1xuXG5leHBvcnQgY29uc3QgbG9naWNhbE5vdENvbmZpZzogS2VybmVsQ29uZmlnID0ge1xuICBrZXJuZWxOYW1lOiBMb2dpY2FsTm90LFxuICBiYWNrZW5kTmFtZTogJ3dlYmdsJyxcbiAga2VybmVsRnVuYzogbG9naWNhbE5vdCxcbn07XG4iXX0=","/**\n * @license\n * Copyright 2020 Google LLC. All Rights Reserved.\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n * =============================================================================\n */\nimport { LogicalOr } from '@tensorflow/tfjs-core';\nimport { binaryKernelFunc } from '../kernel_utils/kernel_funcs_utils';\nconst LOGICAL_OR = `return float(a >= 1.0 || b >= 1.0);`;\nconst LOGICAL_OR_PACKED = `\n return min(\n vec4(greaterThanEqual(a, vec4(1.0))) +\n vec4(greaterThanEqual(b, vec4(1.0))),\n vec4(1.0));\n`;\nexport const logicalOr = binaryKernelFunc({ opSnippet: LOGICAL_OR, packedOpSnippet: LOGICAL_OR_PACKED, dtype: 'bool' });\nexport const logicalOrConfig = {\n kernelName: LogicalOr,\n backendName: 'webgl',\n kernelFunc: logicalOr\n};\n//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiTG9naWNhbE9yLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vLi4vdGZqcy1iYWNrZW5kLXdlYmdsL3NyYy9rZXJuZWxzL0xvZ2ljYWxPci50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQTs7Ozs7Ozs7Ozs7Ozs7O0dBZUc7QUFFSCxPQUFPLEVBQTJCLFNBQVMsRUFBQyxNQUFNLHVCQUF1QixDQUFDO0FBRTFFLE9BQU8sRUFBQyxnQkFBZ0IsRUFBQyxNQUFNLG9DQUFvQyxDQUFDO0FBRXBFLE1BQU0sVUFBVSxHQUFHLHFDQUFxQyxDQUFDO0FBQ3pELE1BQU0saUJBQWlCLEdBQUc7Ozs7O0NBS3pCLENBQUM7QUFFRixNQUFNLENBQUMsTUFBTSxTQUFTLEdBQUcsZ0JBQWdCLENBQ3JDLEVBQUMsU0FBUyxFQUFFLFVBQVUsRUFBRSxlQUFlLEVBQUUsaUJBQWlCLEVBQUUsS0FBSyxFQUFFLE1BQU0sRUFBQyxDQUFDLENBQUM7QUFFaEYsTUFBTSxDQUFDLE1BQU0sZUFBZSxHQUFpQjtJQUMzQyxVQUFVLEVBQUUsU0FBUztJQUNyQixXQUFXLEVBQUUsT0FBTztJQUNwQixVQUFVLEVBQUUsU0FBNkI7Q0FDMUMsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbIi8qKlxuICogQGxpY2Vuc2VcbiAqIENvcHlyaWdodCAyMDIwIEdvb2dsZSBMTEMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuXG4gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgXCJMaWNlbnNlXCIpO1xuICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLlxuICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0XG4gKlxuICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wXG4gKlxuICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZVxuICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gXCJBUyBJU1wiIEJBU0lTLFxuICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuXG4gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kXG4gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS5cbiAqID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4gKi9cblxuaW1wb3J0IHtLZXJuZWxDb25maWcsIEtlcm5lbEZ1bmMsIExvZ2ljYWxPcn0gZnJvbSAnQHRlbnNvcmZsb3cvdGZqcy1jb3JlJztcblxuaW1wb3J0IHtiaW5hcnlLZXJuZWxGdW5jfSBmcm9tICcuLi9rZXJuZWxfdXRpbHMva2VybmVsX2Z1bmNzX3V0aWxzJztcblxuY29uc3QgTE9HSUNBTF9PUiA9IGByZXR1cm4gZmxvYXQoYSA+PSAxLjAgfHwgYiA+PSAxLjApO2A7XG5jb25zdCBMT0dJQ0FMX09SX1BBQ0tFRCA9IGBcbiAgcmV0dXJuIG1pbihcbiAgICB2ZWM0KGdyZWF0ZXJUaGFuRXF1YWwoYSwgdmVjNCgxLjApKSkgK1xuICAgIHZlYzQoZ3JlYXRlclRoYW5FcXVhbChiLCB2ZWM0KDEuMCkpKSxcbiAgICB2ZWM0KDEuMCkpO1xuYDtcblxuZXhwb3J0IGNvbnN0IGxvZ2ljYWxPciA9IGJpbmFyeUtlcm5lbEZ1bmMoXG4gICAge29wU25pcHBldDogTE9HSUNBTF9PUiwgcGFja2VkT3BTbmlwcGV0OiBMT0dJQ0FMX09SX1BBQ0tFRCwgZHR5cGU6ICdib29sJ30pO1xuXG5leHBvcnQgY29uc3QgbG9naWNhbE9yQ29uZmlnOiBLZXJuZWxDb25maWcgPSB7XG4gIGtlcm5lbE5hbWU6IExvZ2ljYWxPcixcbiAgYmFja2VuZE5hbWU6ICd3ZWJnbCcsXG4gIGtlcm5lbEZ1bmM6IGxvZ2ljYWxPciBhcyB7fSBhcyBLZXJuZWxGdW5jXG59O1xuIl19","/**\n * @license\n * Copyright 2017 Google LLC. All Rights Reserved.\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n * =============================================================================\n */\nexport class LRNProgram {\n constructor(xShape, radius, bias, alpha, beta) {\n this.variableNames = ['x'];\n this.outputShape = [];\n const rad = radius;\n const maxD = xShape[3] - 1;\n this.outputShape = xShape;\n // optimize pow(bias + alpha * sum, -beta)\n // src: https://github.com/tensorflow/tensorflow/..\n // blob/26033a1644a9c4a5fbe3170ab2e864b6a4ccd4ca/..\n // tensorflow/core/kernels/mkl_lrn_op.cc#L320\n let powOperator;\n const basis = `float(${bias}) + float(${alpha}) * sum`;\n if (beta === 0.5) {\n powOperator = `inversesqrt(${basis})`;\n }\n else if (beta === 1.0) {\n powOperator = `1.0/(${basis})`;\n }\n else {\n powOperator = `exp(log(${basis}) * float(-${beta}));`;\n }\n this.userCode = `\n void main() {\n ivec4 coords = getOutputCoords();\n int b = coords[0];\n int r = coords[1];\n int c = coords[2];\n int d = coords[3];\n float x = getX(b, r, c, d);\n float sum = 0.0;\n for (int j = -${rad}; j <= ${rad}; j++) {\n int idx = d + j;\n if (idx >= 0 && idx <= ${maxD}) {\n float z = getX(b, r, c, idx);\n sum += z * z;\n }\n }\n float val = x * ${powOperator};\n setOutput(val);\n }\n `;\n }\n}\n//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibHJuX2dwdS5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uL3RmanMtYmFja2VuZC13ZWJnbC9zcmMvbHJuX2dwdS50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQTs7Ozs7Ozs7Ozs7Ozs7O0dBZUc7QUFJSCxNQUFNLE9BQU8sVUFBVTtJQUtyQixZQUNJLE1BQWdCLEVBQUUsTUFBYyxFQUFFLElBQVksRUFBRSxLQUFhLEVBQzdELElBQVk7UUFOaEIsa0JBQWEsR0FBRyxDQUFDLEdBQUcsQ0FBQyxDQUFDO1FBQ3RCLGdCQUFXLEdBQWEsRUFBRSxDQUFDO1FBTXpCLE1BQU0sR0FBRyxHQUFHLE1BQU0sQ0FBQztRQUNuQixNQUFNLElBQUksR0FBRyxNQUFNLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDO1FBQzNCLElBQUksQ0FBQyxXQUFXLEdBQUcsTUFBTSxDQUFDO1FBRTFCLDBDQUEwQztRQUMxQyxtREFBbUQ7UUFDbkQsbURBQW1EO1FBQ25ELDZDQUE2QztRQUM3QyxJQUFJLFdBQVcsQ0FBQztRQUNoQixNQUFNLEtBQUssR0FBRyxTQUFTLElBQUksYUFBYSxLQUFLLFNBQVMsQ0FBQztRQUN2RCxJQUFJLElBQUksS0FBSyxHQUFHLEVBQUU7WUFDaEIsV0FBVyxHQUFHLGVBQWUsS0FBSyxHQUFHLENBQUM7U0FDdkM7YUFBTSxJQUFJLElBQUksS0FBSyxHQUFHLEVBQUU7WUFDdkIsV0FBVyxHQUFHLFFBQVEsS0FBSyxHQUFHLENBQUM7U0FDaEM7YUFBTTtZQUNMLFdBQVcsR0FBRyxXQUFXLEtBQUssY0FBYyxJQUFJLEtBQUssQ0FBQztTQUN2RDtRQUVELElBQUksQ0FBQyxRQUFRLEdBQUc7Ozs7Ozs7Ozt3QkFTSSxHQUFHLFVBQVUsR0FBRzs7b0NBRUosSUFBSTs7Ozs7MEJBS2QsV0FBVzs7O0tBR2hDLENBQUM7SUFDSixDQUFDO0NBQ0YiLCJzb3VyY2VzQ29udGVudCI6WyIvKipcbiAqIEBsaWNlbnNlXG4gKiBDb3B5cmlnaHQgMjAxNyBHb29nbGUgTExDLiBBbGwgUmlnaHRzIFJlc2VydmVkLlxuICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlIFwiTGljZW5zZVwiKTtcbiAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS5cbiAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdFxuICpcbiAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMFxuICpcbiAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmVcbiAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuIFwiQVMgSVNcIiBCQVNJUyxcbiAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLlxuICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZFxuICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuXG4gKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuICovXG5cbmltcG9ydCB7R1BHUFVQcm9ncmFtfSBmcm9tICcuL2dwZ3B1X21hdGgnO1xuXG5leHBvcnQgY2xhc3MgTFJOUHJvZ3JhbSBpbXBsZW1lbnRzIEdQR1BVUHJvZ3JhbSB7XG4gIHZhcmlhYmxlTmFtZXMgPSBbJ3gnXTtcbiAgb3V0cHV0U2hhcGU6IG51bWJlcltdID0gW107XG4gIHVzZXJDb2RlOiBzdHJpbmc7XG5cbiAgY29uc3RydWN0b3IoXG4gICAgICB4U2hhcGU6IG51bWJlcltdLCByYWRpdXM6IG51bWJlciwgYmlhczogbnVtYmVyLCBhbHBoYTogbnVtYmVyLFxuICAgICAgYmV0YTogbnVtYmVyKSB7XG4gICAgY29uc3QgcmFkID0gcmFkaXVzO1xuICAgIGNvbnN0IG1heEQgPSB4U2hhcGVbM10gLSAxO1xuICAgIHRoaXMub3V0cHV0U2hhcGUgPSB4U2hhcGU7XG5cbiAgICAvLyBvcHRpbWl6ZSBwb3coYmlhcyArIGFscGhhICogc3VtLCAtYmV0YSlcbiAgICAvLyBzcmM6IGh0dHBzOi8vZ2l0aHViLmNvbS90ZW5zb3JmbG93L3RlbnNvcmZsb3cvLi5cbiAgICAvLyBibG9iLzI2MDMzYTE2NDRhOWM0YTVmYmUzMTcwYWIyZTg2NGI2YTRjY2Q0Y2EvLi5cbiAgICAvLyB0ZW5zb3JmbG93L2NvcmUva2VybmVscy9ta2xfbHJuX29wLmNjI0wzMjBcbiAgICBsZXQgcG93T3BlcmF0b3I7XG4gICAgY29uc3QgYmFzaXMgPSBgZmxvYXQoJHtiaWFzfSkgKyBmbG9hdCgke2FscGhhfSkgKiBzdW1gO1xuICAgIGlmIChiZXRhID09PSAwLjUpIHtcbiAgICAgIHBvd09wZXJhdG9yID0gYGludmVyc2VzcXJ0KCR7YmFzaXN9KWA7XG4gICAgfSBlbHNlIGlmIChiZXRhID09PSAxLjApIHtcbiAgICAgIHBvd09wZXJhdG9yID0gYDEuMC8oJHtiYXNpc30pYDtcbiAgICB9IGVsc2Uge1xuICAgICAgcG93T3BlcmF0b3IgPSBgZXhwKGxvZygke2Jhc2lzfSkgKiBmbG9hdCgtJHtiZXRhfSkpO2A7XG4gICAgfVxuXG4gICAgdGhpcy51c2VyQ29kZSA9IGBcbiAgICAgIHZvaWQgbWFpbigpIHtcbiAgICAgICAgaXZlYzQgY29vcmRzID0gZ2V0T3V0cHV0Q29vcmRzKCk7XG4gICAgICAgIGludCBiID0gY29vcmRzWzBdO1xuICAgICAgICBpbnQgciA9IGNvb3Jkc1sxXTtcbiAgICAgICAgaW50IGMgPSBjb29yZHNbMl07XG4gICAgICAgIGludCBkID0gY29vcmRzWzNdO1xuICAgICAgICBmbG9hdCB4ID0gZ2V0WChiLCByLCBjLCBkKTtcbiAgICAgICAgZmxvYXQgc3VtID0gMC4wO1xuICAgICAgICBmb3IgKGludCBqID0gLSR7cmFkfTsgaiA8PSAke3JhZH07IGorKykge1xuICAgICAgICAgIGludCBpZHggPSBkICsgajtcbiAgICAgICAgICBpZiAoaWR4ID49IDAgJiYgaWR4IDw9ICAke21heER9KSB7XG4gICAgICAgICAgICBmbG9hdCB6ID0gZ2V0WChiLCByLCBjLCBpZHgpO1xuICAgICAgICAgICAgc3VtICs9IHogKiB6O1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICBmbG9hdCB2YWwgPSB4ICogJHtwb3dPcGVyYXRvcn07XG4gICAgICAgIHNldE91dHB1dCh2YWwpO1xuICAgICAgfVxuICAgIGA7XG4gIH1cbn1cbiJdfQ==","/**\n * @license\n * Copyright 2019 Google LLC. All Rights Reserved.\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n * =============================================================================\n */\nexport class LRNPackedProgram {\n constructor(xShape, radius, bias, alpha, beta) {\n this.variableNames = ['x'];\n this.outputShape = [];\n this.packedInputs = true;\n this.packedOutput = true;\n const rad = radius;\n const maxD = xShape[3] - 1;\n this.outputShape = xShape;\n // optimize pow(bias + alpha * sum, -beta)\n // src: https://github.com/tensorflow/tensorflow/..\n // blob/26033a1644a9c4a5fbe3170ab2e864b6a4ccd4ca/..\n // tensorflow/core/kernels/mkl_lrn_op.cc#L320\n let powOperator;\n const basis = `float(${bias}) + float(${alpha}) * sum`;\n if (beta === 0.5) {\n powOperator = `inversesqrt(${basis})`;\n }\n else if (beta === 1.0) {\n powOperator = `1.0/(${basis})`;\n }\n else {\n powOperator = `exp(log(${basis}) * float(-${beta}));`;\n }\n this.userCode = `\n void main() {\n ivec4 coords = getOutputCoords();\n int b = coords.x;\n int r = coords.y;\n int c = coords.z;\n int d = coords.w;\n\n bool hasNextCol = d < ${this.outputShape[3]};\n bool hasNextRow = c < ${this.outputShape[2]};\n\n vec4 sum = vec4(0.);\n vec4 xFragAtOutputCoords = getX(b, r, c, d);\n\n vec4 xAtOutputCoords = vec4(\n getChannel(xFragAtOutputCoords, vec2(c, d)),\n hasNextCol ?\n getChannel(xFragAtOutputCoords, vec2(c, d + 1)) : 0.0,\n hasNextRow ?\n getChannel(xFragAtOutputCoords , vec2(c + 1, d)) : 0.0,\n (hasNextRow && hasNextCol) ?\n getChannel(xFragAtOutputCoords, vec2(c + 1, d + 1)) : 0.0\n );\n\n int firstChannel = d - ${rad};\n vec2 cache = vec2(0.);\n if(firstChannel >= 0){\n vec4 firstChannelFrag = getX(b, r, c, firstChannel);\n cache.x = getChannel(firstChannelFrag, vec2(c, firstChannel));\n if(hasNextRow){\n cache.y = getChannel(firstChannelFrag, vec2(c + 1, firstChannel));\n }\n }\n\n ivec2 depth = ivec2(d, d + 1);\n for (int j = - ${rad}; j <= ${rad}; j++) {\n ivec2 idx = depth + j;\n bvec2 aboveLowerBound = greaterThanEqual(idx, ivec2(0));\n bvec2 belowUpperBound = lessThanEqual(idx, ivec2(${maxD}));\n\n bool depthInRange = aboveLowerBound.x && belowUpperBound.x;\n bool depthPlusOneInRange = aboveLowerBound.y && belowUpperBound.y;\n\n if(depthInRange || depthPlusOneInRange){\n vec4 z = vec4(0.);\n vec4 xFragAtCurrentDepth;\n z.xz = cache.xy;\n if(depthPlusOneInRange && hasNextCol){\n xFragAtCurrentDepth = idx.y != d ?\n getX(b, r, c, idx.y) : xFragAtOutputCoords;\n z.y = getChannel(xFragAtCurrentDepth, vec2(c, idx.y));\n if(hasNextRow){\n z.w = getChannel(xFragAtCurrentDepth, vec2(c + 1, idx.y));\n }\n }\n cache.xy = z.yw;\n sum += z * z;\n }\n }\n vec4 result = xAtOutputCoords * ${powOperator};\n setOutput(result);\n }\n `;\n }\n}\n//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibHJuX3BhY2tlZF9ncHUuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi90ZmpzLWJhY2tlbmQtd2ViZ2wvc3JjL2xybl9wYWNrZWRfZ3B1LnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBOzs7Ozs7Ozs7Ozs7Ozs7R0FlRztBQUlILE1BQU0sT0FBTyxnQkFBZ0I7SUFPM0IsWUFDSSxNQUFnQixFQUFFLE1BQWMsRUFBRSxJQUFZLEVBQUUsS0FBYSxFQUM3RCxJQUFZO1FBUmhCLGtCQUFhLEdBQUcsQ0FBQyxHQUFHLENBQUMsQ0FBQztRQUN0QixnQkFBVyxHQUFhLEVBQUUsQ0FBQztRQUUzQixpQkFBWSxHQUFHLElBQUksQ0FBQztRQUNwQixpQkFBWSxHQUFHLElBQUksQ0FBQztRQUtsQixNQUFNLEdBQUcsR0FBRyxNQUFNLENBQUM7UUFDbkIsTUFBTSxJQUFJLEdBQUcsTUFBTSxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQztRQUMzQixJQUFJLENBQUMsV0FBVyxHQUFHLE1BQU0sQ0FBQztRQUUxQiwwQ0FBMEM7UUFDMUMsbURBQW1EO1FBQ25ELG1EQUFtRDtRQUNuRCw2Q0FBNkM7UUFDN0MsSUFBSSxXQUFXLENBQUM7UUFDaEIsTUFBTSxLQUFLLEdBQUcsU0FBUyxJQUFJLGFBQWEsS0FBSyxTQUFTLENBQUM7UUFDdkQsSUFBSSxJQUFJLEtBQUssR0FBRyxFQUFFO1lBQ2hCLFdBQVcsR0FBRyxlQUFlLEtBQUssR0FBRyxDQUFDO1NBQ3ZDO2FBQU0sSUFBSSxJQUFJLEtBQUssR0FBRyxFQUFFO1lBQ3ZCLFdBQVcsR0FBRyxRQUFRLEtBQUssR0FBRyxDQUFDO1NBQ2hDO2FBQU07WUFDTCxXQUFXLEdBQUcsV0FBVyxLQUFLLGNBQWMsSUFBSSxLQUFLLENBQUM7U0FDdkQ7UUFFRCxJQUFJLENBQUMsUUFBUSxHQUFHOzs7Ozs7OztnQ0FRWSxJQUFJLENBQUMsV0FBVyxDQUFDLENBQUMsQ0FBQztnQ0FDbkIsSUFBSSxDQUFDLFdBQVcsQ0FBQyxDQUFDLENBQUM7Ozs7Ozs7Ozs7Ozs7OztpQ0FlbEIsR0FBRzs7Ozs7Ozs7Ozs7eUJBV1gsR0FBRyxVQUFVLEdBQUc7Ozs2REFHb0IsSUFBSTs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7OzBDQXFCdkIsV0FBVzs7O0tBR2hELENBQUM7SUFDSixDQUFDO0NBQ0YiLCJzb3VyY2VzQ29udGVudCI6WyIvKipcbiAqIEBsaWNlbnNlXG4gKiBDb3B5cmlnaHQgMjAxOSBHb29nbGUgTExDLiBBbGwgUmlnaHRzIFJlc2VydmVkLlxuICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlIFwiTGljZW5zZVwiKTtcbiAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS5cbiAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdFxuICpcbiAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMFxuICpcbiAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmVcbiAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuIFwiQVMgSVNcIiBCQVNJUyxcbiAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLlxuICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZFxuICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuXG4gKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuICovXG5cbmltcG9ydCB7R1BHUFVQcm9ncmFtfSBmcm9tICcuL2dwZ3B1X21hdGgnO1xuXG5leHBvcnQgY2xhc3MgTFJOUGFja2VkUHJvZ3JhbSBpbXBsZW1lbnRzIEdQR1BVUHJvZ3JhbSB7XG4gIHZhcmlhYmxlTmFtZXMgPSBbJ3gnXTtcbiAgb3V0cHV0U2hhcGU6IG51bWJlcltdID0gW107XG4gIHVzZXJDb2RlOiBzdHJpbmc7XG4gIHBhY2tlZElucHV0cyA9IHRydWU7XG4gIHBhY2tlZE91dHB1dCA9IHRydWU7XG5cbiAgY29uc3RydWN0b3IoXG4gICAgICB4U2hhcGU6IG51bWJlcltdLCByYWRpdXM6IG51bWJlciwgYmlhczogbnVtYmVyLCBhbHBoYTogbnVtYmVyLFxuICAgICAgYmV0YTogbnVtYmVyKSB7XG4gICAgY29uc3QgcmFkID0gcmFkaXVzO1xuICAgIGNvbnN0IG1heEQgPSB4U2hhcGVbM10gLSAxO1xuICAgIHRoaXMub3V0cHV0U2hhcGUgPSB4U2hhcGU7XG5cbiAgICAvLyBvcHRpbWl6ZSBwb3coYmlhcyArIGFscGhhICogc3VtLCAtYmV0YSlcbiAgICAvLyBzcmM6IGh0dHBzOi8vZ2l0aHViLmNvbS90ZW5zb3JmbG93L3RlbnNvcmZsb3cvLi5cbiAgICAvLyBibG9iLzI2MDMzYTE2NDRhOWM0YTVmYmUzMTcwYWIyZTg2NGI2YTRjY2Q0Y2EvLi5cbiAgICAvLyB0ZW5zb3JmbG93L2NvcmUva2VybmVscy9ta2xfbHJuX29wLmNjI0wzMjBcbiAgICBsZXQgcG93T3BlcmF0b3I7XG4gICAgY29uc3QgYmFzaXMgPSBgZmxvYXQoJHtiaWFzfSkgKyBmbG9hdCgke2FscGhhfSkgKiBzdW1gO1xuICAgIGlmIChiZXRhID09PSAwLjUpIHtcbiAgICAgIHBvd09wZXJhdG9yID0gYGludmVyc2VzcXJ0KCR7YmFzaXN9KWA7XG4gICAgfSBlbHNlIGlmIChiZXRhID09PSAxLjApIHtcbiAgICAgIHBvd09wZXJhdG9yID0gYDEuMC8oJHtiYXNpc30pYDtcbiAgICB9IGVsc2Uge1xuICAgICAgcG93T3BlcmF0b3IgPSBgZXhwKGxvZygke2Jhc2lzfSkgKiBmbG9hdCgtJHtiZXRhfSkpO2A7XG4gICAgfVxuXG4gICAgdGhpcy51c2VyQ29kZSA9IGBcbiAgICAgIHZvaWQgbWFpbigpIHtcbiAgICAgICAgaXZlYzQgY29vcmRzID0gZ2V0T3V0cHV0Q29vcmRzKCk7XG4gICAgICAgIGludCBiID0gY29vcmRzLng7XG4gICAgICAgIGludCByID0gY29vcmRzLnk7XG4gICAgICAgIGludCBjID0gY29vcmRzLno7XG4gICAgICAgIGludCBkID0gY29vcmRzLnc7XG5cbiAgICAgICAgYm9vbCBoYXNOZXh0Q29sID0gZCA8ICR7dGhpcy5vdXRwdXRTaGFwZVszXX07XG4gICAgICAgIGJvb2wgaGFzTmV4dFJvdyA9IGMgPCAke3RoaXMub3V0cHV0U2hhcGVbMl19O1xuXG4gICAgICAgIHZlYzQgc3VtID0gdmVjNCgwLik7XG4gICAgICAgIHZlYzQgeEZyYWdBdE91dHB1dENvb3JkcyA9IGdldFgoYiwgciwgYywgZCk7XG5cbiAgICAgICAgdmVjNCB4QXRPdXRwdXRDb29yZHMgPSB2ZWM0KFxuICAgICAgICAgIGdldENoYW5uZWwoeEZyYWdBdE91dHB1dENvb3JkcywgdmVjMihjLCBkKSksXG4gICAgICAgICAgaGFzTmV4dENvbCA/XG4gICAgICAgICAgICBnZXRDaGFubmVsKHhGcmFnQXRPdXRwdXRDb29yZHMsIHZlYzIoYywgZCArIDEpKSA6IDAuMCxcbiAgICAgICAgICBoYXNOZXh0Um93ID9cbiAgICAgICAgICAgIGdldENoYW5uZWwoeEZyYWdBdE91dHB1dENvb3JkcyAsIHZlYzIoYyArIDEsIGQpKSA6IDAuMCxcbiAgICAgICAgICAoaGFzTmV4dFJvdyAmJiBoYXNOZXh0Q29sKSA/XG4gICAgICAgICAgICBnZXRDaGFubmVsKHhGcmFnQXRPdXRwdXRDb29yZHMsIHZlYzIoYyArIDEsIGQgKyAxKSkgOiAwLjBcbiAgICAgICAgKTtcblxuICAgICAgICBpbnQgZmlyc3RDaGFubmVsID0gZCAtICR7cmFkfTtcbiAgICAgICAgdmVjMiBjYWNoZSA9IHZlYzIoMC4pO1xuICAgICAgICBpZihmaXJzdENoYW5uZWwgPj0gMCl7XG4gICAgICAgICAgdmVjNCBmaXJzdENoYW5uZWxGcmFnID0gZ2V0WChiLCByLCBjLCBmaXJzdENoYW5uZWwpO1xuICAgICAgICAgIGNhY2hlLnggPSBnZXRDaGFubmVsKGZpcnN0Q2hhbm5lbEZyYWcsIHZlYzIoYywgZmlyc3RDaGFubmVsKSk7XG4gICAgICAgICAgICBpZihoYXNOZXh0Um93KXtcbiAgICAgICAgICAgICAgY2FjaGUueSA9IGdldENoYW5uZWwoZmlyc3RDaGFubmVsRnJhZywgdmVjMihjICsgMSwgZmlyc3RDaGFubmVsKSk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cblxuICAgICAgICBpdmVjMiBkZXB0aCA9IGl2ZWMyKGQsIGQgKyAxKTtcbiAgICAgICAgZm9yIChpbnQgaiA9IC0gJHtyYWR9OyBqIDw9ICR7cmFkfTsgaisrKSB7XG4gICAgICAgICAgaXZlYzIgaWR4ID0gZGVwdGggKyBqO1xuICAgICAgICAgIGJ2ZWMyIGFib3ZlTG93ZXJCb3VuZCA9IGdyZWF0ZXJUaGFuRXF1YWwoaWR4LCBpdmVjMigwKSk7XG4gICAgICAgICAgYnZlYzIgYmVsb3dVcHBlckJvdW5kID0gbGVzc1RoYW5FcXVhbChpZHgsIGl2ZWMyKCR7bWF4RH0pKTtcblxuICAgICAgICAgIGJvb2wgZGVwdGhJblJhbmdlID0gYWJvdmVMb3dlckJvdW5kLnggJiYgYmVsb3dVcHBlckJvdW5kLng7XG4gICAgICAgICAgYm9vbCBkZXB0aFBsdXNPbmVJblJhbmdlID0gYWJvdmVMb3dlckJvdW5kLnkgJiYgYmVsb3dVcHBlckJvdW5kLnk7XG5cbiAgICAgICAgICBpZihkZXB0aEluUmFuZ2UgfHwgZGVwdGhQbHVzT25lSW5SYW5nZSl7XG4gICAgICAgICAgICB2ZWM0IHogPSB2ZWM0KDAuKTtcbiAgICAgICAgICAgIHZlYzQgeEZyYWdBdEN1cnJlbnREZXB0aDtcbiAgICAgICAgICAgIHoueHogPSBjYWNoZS54eTtcbiAgICAgICAgICAgIGlmKGRlcHRoUGx1c09uZUluUmFuZ2UgJiYgaGFzTmV4dENvbCl7XG4gICAgICAgICAgICAgIHhGcmFnQXRDdXJyZW50RGVwdGggPSBpZHgueSAhPSBkID9cbiAgICAgICAgICAgICAgICBnZXRYKGIsIHIsIGMsIGlkeC55KSA6IHhGcmFnQXRPdXRwdXRDb29yZHM7XG4gICAgICAgICAgICAgIHoueSA9IGdldENoYW5uZWwoeEZyYWdBdEN1cnJlbnREZXB0aCwgdmVjMihjLCBpZHgueSkpO1xuICAgICAgICAgICAgICBpZihoYXNOZXh0Um93KXtcbiAgICAgICAgICAgICAgICB6LncgPSBnZXRDaGFubmVsKHhGcmFnQXRDdXJyZW50RGVwdGgsIHZlYzIoYyArIDEsIGlkeC55KSk7XG4gICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGNhY2hlLnh5ID0gei55dztcbiAgICAgICAgICAgIHN1bSArPSB6ICogejtcbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgdmVjNCByZXN1bHQgPSB4QXRPdXRwdXRDb29yZHMgKiAke3Bvd09wZXJhdG9yfTtcbiAgICAgICAgc2V0T3V0cHV0KHJlc3VsdCk7XG4gICAgICB9XG4gICAgYDtcbiAgfVxufVxuIl19","/**\n * @license\n * Copyright 2020 Google LLC. All Rights Reserved.\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n * =============================================================================\n */\nimport { env, LRN } from '@tensorflow/tfjs-core';\nimport { LRNProgram } from '../lrn_gpu';\nimport { LRNPackedProgram } from '../lrn_packed_gpu';\nexport const lrn = (args) => {\n const { inputs, backend, attrs } = args;\n const { x } = inputs;\n const { depthRadius, bias, alpha, beta } = attrs;\n const program = env().getBool('WEBGL_PACK_NORMALIZATION') ?\n new LRNPackedProgram(x.shape, depthRadius, bias, alpha, beta) :\n new LRNProgram(x.shape, depthRadius, bias, alpha, beta);\n return backend.runWebGLProgram(program, [x], x.dtype);\n};\n// tslint:disable-next-line: variable-name\nexport const LRNConfig = {\n kernelName: LRN,\n backendName: 'webgl',\n kernelFunc: lrn\n};\n//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiTFJOLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vLi4vdGZqcy1iYWNrZW5kLXdlYmdsL3NyYy9rZXJuZWxzL0xSTi50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQTs7Ozs7Ozs7Ozs7Ozs7O0dBZUc7QUFFSCxPQUFPLEVBQUMsR0FBRyxFQUE0QixHQUFHLEVBQWtDLE1BQU0sdUJBQXVCLENBQUM7QUFHMUcsT0FBTyxFQUFDLFVBQVUsRUFBQyxNQUFNLFlBQVksQ0FBQztBQUN0QyxPQUFPLEVBQUMsZ0JBQWdCLEVBQUMsTUFBTSxtQkFBbUIsQ0FBQztBQUVuRCxNQUFNLENBQUMsTUFBTSxHQUFHLEdBQ1osQ0FBQyxJQUFxRSxFQUN2RCxFQUFFO0lBQ1gsTUFBTSxFQUFDLE1BQU0sRUFBRSxPQUFPLEVBQUUsS0FBSyxFQUFDLEdBQUcsSUFBSSxDQUFDO0lBQ3RDLE1BQU0sRUFBQyxDQUFDLEVBQUMsR0FBRyxNQUFNLENBQUM7SUFDbkIsTUFBTSxFQUFDLFdBQVcsRUFBRSxJQUFJLEVBQUUsS0FBSyxFQUFFLElBQUksRUFBQyxHQUFHLEtBQUssQ0FBQztJQUUvQyxNQUFNLE9BQU8sR0FBRyxHQUFHLEVBQUUsQ0FBQyxPQUFPLENBQUMsMEJBQTBCLENBQUMsQ0FBQyxDQUFDO1FBQ3ZELElBQUksZ0JBQWdCLENBQUMsQ0FBQyxDQUFDLEtBQUssRUFBRSxXQUFXLEVBQUUsSUFBSSxFQUFFLEtBQUssRUFBRSxJQUFJLENBQUMsQ0FBQyxDQUFDO1FBQy9ELElBQUksVUFBVSxDQUFDLENBQUMsQ0FBQyxLQUFLLEVBQUUsV0FBVyxFQUFFLElBQUksRUFBRSxLQUFLLEVBQUUsSUFBSSxDQUFDLENBQUM7SUFDNUQsT0FBTyxPQUFPLENBQUMsZUFBZSxDQUFDLE9BQU8sRUFBRSxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxLQUFLLENBQUMsQ0FBQztBQUN4RCxDQUFDLENBQUM7QUFFViwwQ0FBMEM7QUFDMUMsTUFBTSxDQUFDLE1BQU0sU0FBUyxHQUFpQjtJQUNyQyxVQUFVLEVBQUUsR0FBRztJQUNmLFdBQVcsRUFBRSxPQUFPO0lBQ3BCLFVBQVUsRUFBRSxHQUF1QjtDQUNwQyxDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiLyoqXG4gKiBAbGljZW5zZVxuICogQ29weXJpZ2h0IDIwMjAgR29vZ2xlIExMQy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC5cbiAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSBcIkxpY2Vuc2VcIik7XG4gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuXG4gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXRcbiAqXG4gKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjBcbiAqXG4gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlXG4gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiBcIkFTIElTXCIgQkFTSVMsXG4gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC5cbiAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmRcbiAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLlxuICogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbiAqL1xuXG5pbXBvcnQge2VudiwgS2VybmVsQ29uZmlnLCBLZXJuZWxGdW5jLCBMUk4sIExSTkF0dHJzLCBMUk5JbnB1dHMsIFRlbnNvckluZm99IGZyb20gJ0B0ZW5zb3JmbG93L3RmanMtY29yZSc7XG5cbmltcG9ydCB7TWF0aEJhY2tlbmRXZWJHTH0gZnJvbSAnLi4vYmFja2VuZF93ZWJnbCc7XG5pbXBvcnQge0xSTlByb2dyYW19IGZyb20gJy4uL2xybl9ncHUnO1xuaW1wb3J0IHtMUk5QYWNrZWRQcm9ncmFtfSBmcm9tICcuLi9scm5fcGFja2VkX2dwdSc7XG5cbmV4cG9ydCBjb25zdCBscm4gPVxuICAgIChhcmdzOiB7aW5wdXRzOiBMUk5JbnB1dHMsIGJhY2tlbmQ6IE1hdGhCYWNrZW5kV2ViR0wsIGF0dHJzOiBMUk5BdHRyc30pOlxuICAgICAgICBUZW5zb3JJbmZvID0+IHtcbiAgICAgICAgICBjb25zdCB7aW5wdXRzLCBiYWNrZW5kLCBhdHRyc30gPSBhcmdzO1xuICAgICAgICAgIGNvbnN0IHt4fSA9IGlucHV0cztcbiAgICAgICAgICBjb25zdCB7ZGVwdGhSYWRpdXMsIGJpYXMsIGFscGhhLCBiZXRhfSA9IGF0dHJzO1xuXG4gICAgICAgICAgY29uc3QgcHJvZ3JhbSA9IGVudigpLmdldEJvb2woJ1dFQkdMX1BBQ0tfTk9STUFMSVpBVElPTicpID9cbiAgICAgICAgICAgICAgbmV3IExSTlBhY2tlZFByb2dyYW0oeC5zaGFwZSwgZGVwdGhSYWRpdXMsIGJpYXMsIGFscGhhLCBiZXRhKSA6XG4gICAgICAgICAgICAgIG5ldyBMUk5Qcm9ncmFtKHguc2hhcGUsIGRlcHRoUmFkaXVzLCBiaWFzLCBhbHBoYSwgYmV0YSk7XG4gICAgICAgICAgcmV0dXJuIGJhY2tlbmQucnVuV2ViR0xQcm9ncmFtKHByb2dyYW0sIFt4XSwgeC5kdHlwZSk7XG4gICAgICAgIH07XG5cbi8vIHRzbGludDpkaXNhYmxlLW5leHQtbGluZTogdmFyaWFibGUtbmFtZVxuZXhwb3J0IGNvbnN0IExSTkNvbmZpZzogS2VybmVsQ29uZmlnID0ge1xuICBrZXJuZWxOYW1lOiBMUk4sXG4gIGJhY2tlbmROYW1lOiAnd2ViZ2wnLFxuICBrZXJuZWxGdW5jOiBscm4gYXMge30gYXMgS2VybmVsRnVuY1xufTtcbiJdfQ==","/**\n * @license\n * Copyright 2018 Google LLC. All Rights Reserved.\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n * =============================================================================\n */\nexport class LRNGradProgram {\n constructor(inputShape, depthRadius, bias, alpha, beta) {\n this.variableNames = ['inputImage', 'outputImage', 'dy'];\n this.outputShape = [];\n this.outputShape = inputShape;\n this.depth = inputShape[3];\n this.depthRadius = depthRadius;\n this.bias = bias;\n this.alpha = alpha;\n this.beta = beta;\n this.userCode = `\n void main() {\n ivec4 coords = getOutputCoords();\n int b = coords[0];\n int r = coords[1];\n int c = coords[2];\n\n float result = 0.0;\n for (int d = 0; d < ${this.depth}; ++d) {\n int depthBegin = int(max(0.0, float(d - ${depthRadius})));\n int depthEnd = int(min(float(${this.depth}),\n float(d + ${depthRadius} + 1)));\n\n const int MIN_DEPTH_BEGIN = 0;\n const int MAX_DEPTH_END = ${this.depth};\n\n float norm = 0.0;\n for (int k = MIN_DEPTH_BEGIN; k < MAX_DEPTH_END; ++k) {\n if (k < depthBegin){\n continue;\n }\n else if (k >= depthBegin && k < depthEnd) {\n norm += getInputImage(b, r, c, k) * getInputImage(b, r, c, k);\n }\n else {\n break;\n }\n }\n\n norm = float(${alpha}) * norm + float(${bias});\n\n for(int k = MIN_DEPTH_BEGIN; k < MAX_DEPTH_END; ++k){\n if (k < depthBegin){\n continue;\n }\n else if (k >= depthBegin && k < depthEnd){\n float dyi = -2.0 * float(${alpha})\n * float(${beta})\n * getInputImage(b ,r ,c, k) * getOutputImage(b, r, c, d)\n / norm;\n if (k == d) {\n dyi += pow(norm, -1.0 * ${beta});\n }\n if (k == coords[3]) {\n dyi *= getDy(b, r, c, d);\n result += dyi;\n }\n }\n else {\n break;\n }\n }\n }\n setOutput(result);\n }\n `;\n }\n}\n//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibHJuX2dyYWRfZ3B1LmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vdGZqcy1iYWNrZW5kLXdlYmdsL3NyYy9scm5fZ3JhZF9ncHUudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUE7Ozs7Ozs7Ozs7Ozs7OztHQWVHO0FBSUgsTUFBTSxPQUFPLGNBQWM7SUFVekIsWUFDSSxVQUFvQixFQUFFLFdBQW1CLEVBQUUsSUFBWSxFQUFFLEtBQWEsRUFDdEUsSUFBWTtRQVhoQixrQkFBYSxHQUFHLENBQUMsWUFBWSxFQUFFLGFBQWEsRUFBRSxJQUFJLENBQUMsQ0FBQztRQUNwRCxnQkFBVyxHQUFhLEVBQUUsQ0FBQztRQVd6QixJQUFJLENBQUMsV0FBVyxHQUFHLFVBQVUsQ0FBQztRQUM5QixJQUFJLENBQUMsS0FBSyxHQUFHLFVBQVUsQ0FBQyxDQUFDLENBQUMsQ0FBQztRQUMzQixJQUFJLENBQUMsV0FBVyxHQUFHLFdBQVcsQ0FBQztRQUMvQixJQUFJLENBQUMsSUFBSSxHQUFHLElBQUksQ0FBQztRQUNqQixJQUFJLENBQUMsS0FBSyxHQUFHLEtBQUssQ0FBQztRQUNuQixJQUFJLENBQUMsSUFBSSxHQUFHLElBQUksQ0FBQztRQUNqQixJQUFJLENBQUMsUUFBUSxHQUFHOzs7Ozs7Ozs4QkFRVSxJQUFJLENBQUMsS0FBSztvREFDWSxXQUFXO3lDQUN0QixJQUFJLENBQUMsS0FBSzswQkFDekIsV0FBVzs7O3NDQUdDLElBQUksQ0FBQyxLQUFLOzs7Ozs7Ozs7Ozs7Ozs7eUJBZXZCLEtBQUssb0JBQW9CLElBQUk7Ozs7Ozs7eUNBT2IsS0FBSzswQkFDcEIsSUFBSTs7OzswQ0FJWSxJQUFJOzs7Ozs7Ozs7Ozs7OztLQWN6QyxDQUFDO0lBQ0osQ0FBQztDQUNGIiwic291cmNlc0NvbnRlbnQiOlsiLyoqXG4gKiBAbGljZW5zZVxuICogQ29weXJpZ2h0IDIwMTggR29vZ2xlIExMQy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC5cbiAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSBcIkxpY2Vuc2VcIik7XG4gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuXG4gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXRcbiAqXG4gKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjBcbiAqXG4gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlXG4gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiBcIkFTIElTXCIgQkFTSVMsXG4gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC5cbiAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmRcbiAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLlxuICogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbiAqL1xuXG5pbXBvcnQge0dQR1BVUHJvZ3JhbX0gZnJvbSAnLi9ncGdwdV9tYXRoJztcblxuZXhwb3J0IGNsYXNzIExSTkdyYWRQcm9ncmFtIGltcGxlbWVudHMgR1BHUFVQcm9ncmFtIHtcbiAgdmFyaWFibGVOYW1lcyA9IFsnaW5wdXRJbWFnZScsICdvdXRwdXRJbWFnZScsICdkeSddO1xuICBvdXRwdXRTaGFwZTogbnVtYmVyW10gPSBbXTtcbiAgdXNlckNvZGU6IHN0cmluZztcbiAgZGVwdGhSYWRpdXM6IG51bWJlcjtcbiAgYmlhczogbnVtYmVyO1xuICBhbHBoYTogbnVtYmVyO1xuICBiZXRhOiBudW1iZXI7XG4gIGRlcHRoOiBudW1iZXI7XG5cbiAgY29uc3RydWN0b3IoXG4gICAgICBpbnB1dFNoYXBlOiBudW1iZXJbXSwgZGVwdGhSYWRpdXM6IG51bWJlciwgYmlhczogbnVtYmVyLCBhbHBoYTogbnVtYmVyLFxuICAgICAgYmV0YTogbnVtYmVyKSB7XG4gICAgdGhpcy5vdXRwdXRTaGFwZSA9IGlucHV0U2hhcGU7XG4gICAgdGhpcy5kZXB0aCA9IGlucHV0U2hhcGVbM107XG4gICAgdGhpcy5kZXB0aFJhZGl1cyA9IGRlcHRoUmFkaXVzO1xuICAgIHRoaXMuYmlhcyA9IGJpYXM7XG4gICAgdGhpcy5hbHBoYSA9IGFscGhhO1xuICAgIHRoaXMuYmV0YSA9IGJldGE7XG4gICAgdGhpcy51c2VyQ29kZSA9IGBcbiAgICAgIHZvaWQgbWFpbigpIHtcbiAgICAgICAgaXZlYzQgY29vcmRzID0gZ2V0T3V0cHV0Q29vcmRzKCk7XG4gICAgICAgIGludCBiID0gY29vcmRzWzBdO1xuICAgICAgICBpbnQgciA9IGNvb3Jkc1sxXTtcbiAgICAgICAgaW50IGMgPSBjb29yZHNbMl07XG5cbiAgICAgICAgZmxvYXQgcmVzdWx0ID0gMC4wO1xuICAgICAgICBmb3IgKGludCBkID0gMDsgZCA8ICR7dGhpcy5kZXB0aH07ICsrZCkge1xuICAgICAgICAgIGludCBkZXB0aEJlZ2luID0gaW50KG1heCgwLjAsIGZsb2F0KGQgLSAke2RlcHRoUmFkaXVzfSkpKTtcbiAgICAgICAgICBpbnQgZGVwdGhFbmQgPSBpbnQobWluKGZsb2F0KCR7dGhpcy5kZXB0aH0pLFxuICAgICAgICAgICAgICBmbG9hdChkICsgJHtkZXB0aFJhZGl1c30gKyAxKSkpO1xuXG4gICAgICAgICAgY29uc3QgaW50IE1JTl9ERVBUSF9CRUdJTiA9IDA7XG4gICAgICAgICAgY29uc3QgaW50IE1BWF9ERVBUSF9FTkQgPSAke3RoaXMuZGVwdGh9O1xuXG4gICAgICAgICAgZmxvYXQgbm9ybSA9IDAuMDtcbiAgICAgICAgICBmb3IgKGludCBrID0gTUlOX0RFUFRIX0JFR0lOOyBrIDwgTUFYX0RFUFRIX0VORDsgKytrKSB7XG4gICAgICAgICAgICBpZiAoayA8IGRlcHRoQmVnaW4pe1xuICAgICAgICAgICAgICBjb250aW51ZTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGVsc2UgaWYgKGsgPj0gZGVwdGhCZWdpbiAmJiBrIDwgZGVwdGhFbmQpIHtcbiAgICAgICAgICAgICAgbm9ybSArPSBnZXRJbnB1dEltYWdlKGIsIHIsIGMsIGspICogZ2V0SW5wdXRJbWFnZShiLCByLCBjLCBrKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9XG5cbiAgICAgICAgICBub3JtID0gZmxvYXQoJHthbHBoYX0pICogbm9ybSArIGZsb2F0KCR7Ymlhc30pO1xuXG4gICAgICAgICAgZm9yKGludCBrID0gTUlOX0RFUFRIX0JFR0lOOyBrIDwgTUFYX0RFUFRIX0VORDsgKytrKXtcbiAgICAgICAgICAgIGlmIChrIDwgZGVwdGhCZWdpbil7XG4gICAgICAgICAgICAgIGNvbnRpbnVlO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgZWxzZSBpZiAoayA+PSBkZXB0aEJlZ2luICYmIGsgPCBkZXB0aEVuZCl7XG4gICAgICAgICAgICAgIGZsb2F0IGR5aSA9IC0yLjAgKiBmbG9hdCgke2FscGhhfSlcbiAgICAgICAgICAgICAgICAqIGZsb2F0KCR7YmV0YX0pXG4gICAgICAgICAgICAgICAgKiBnZXRJbnB1dEltYWdlKGIgLHIgLGMsIGspICogZ2V0T3V0cHV0SW1hZ2UoYiwgciwgYywgZClcbiAgICAgICAgICAgICAgICAvIG5vcm07XG4gICAgICAgICAgICAgIGlmIChrID09IGQpIHtcbiAgICAgICAgICAgICAgICBkeWkgKz0gcG93KG5vcm0sIC0xLjAgKiAke2JldGF9KTtcbiAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICBpZiAoayA9PSBjb29yZHNbM10pIHtcbiAgICAgICAgICAgICAgICBkeWkgKj0gZ2V0RHkoYiwgciwgYywgZCk7XG4gICAgICAgICAgICAgICAgcmVzdWx0ICs9IGR5aTtcbiAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgfVxuICAgICAgICAgIH1cbiAgICAgIH1cbiAgICAgIHNldE91dHB1dChyZXN1bHQpO1xuICAgICAgfVxuICAgIGA7XG4gIH1cbn1cbiJdfQ==","/**\n * @license\n * Copyright 2020 Google LLC. All Rights Reserved.\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n * =============================================================================\n */\nimport { LRNGrad } from '@tensorflow/tfjs-core';\nimport { LRNGradProgram } from '../lrn_grad_gpu';\nexport const lrnGrad = (args) => {\n const { inputs, backend, attrs } = args;\n const { x, y, dy } = inputs;\n const { depthRadius, bias, alpha, beta } = attrs;\n const program = new LRNGradProgram(x.shape, depthRadius, bias, alpha, beta);\n return backend.runWebGLProgram(program, [x, y, dy], x.dtype);\n};\n// tslint:disable-next-line: variable-name\nexport const LRNGradConfig = {\n kernelName: LRNGrad,\n backendName: 'webgl',\n kernelFunc: lrnGrad\n};\n//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiTFJOR3JhZC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uLy4uL3RmanMtYmFja2VuZC13ZWJnbC9zcmMva2VybmVscy9MUk5HcmFkLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBOzs7Ozs7Ozs7Ozs7Ozs7R0FlRztBQUVILE9BQU8sRUFBMkIsT0FBTyxFQUEwQyxNQUFNLHVCQUF1QixDQUFDO0FBR2pILE9BQU8sRUFBQyxjQUFjLEVBQUMsTUFBTSxpQkFBaUIsQ0FBQztBQUUvQyxNQUFNLENBQUMsTUFBTSxPQUFPLEdBQUcsQ0FBQyxJQUl2QixFQUFjLEVBQUU7SUFDZixNQUFNLEVBQUMsTUFBTSxFQUFFLE9BQU8sRUFBRSxLQUFLLEVBQUMsR0FBRyxJQUFJLENBQUM7SUFDdEMsTUFBTSxFQUFDLENBQUMsRUFBRSxDQUFDLEVBQUUsRUFBRSxFQUFDLEdBQUcsTUFBTSxDQUFDO0lBQzFCLE1BQU0sRUFBQyxXQUFXLEVBQUUsSUFBSSxFQUFFLEtBQUssRUFBRSxJQUFJLEVBQUMsR0FBRyxLQUFLLENBQUM7SUFFL0MsTUFBTSxPQUFPLEdBQUcsSUFBSSxjQUFjLENBQUMsQ0FBQyxDQUFDLEtBQUssRUFBRSxXQUFXLEVBQUUsSUFBSSxFQUFFLEtBQUssRUFBRSxJQUFJLENBQUMsQ0FBQztJQUM1RSxPQUFPLE9BQU8sQ0FBQyxlQUFlLENBQUMsT0FBTyxFQUFFLENBQUMsQ0FBQyxFQUFFLENBQUMsRUFBRSxFQUFFLENBQUMsRUFBRSxDQUFDLENBQUMsS0FBSyxDQUFDLENBQUM7QUFDL0QsQ0FBQyxDQUFDO0FBRUYsMENBQTBDO0FBQzFDLE1BQU0sQ0FBQyxNQUFNLGFBQWEsR0FBaUI7SUFDekMsVUFBVSxFQUFFLE9BQU87SUFDbkIsV0FBVyxFQUFFLE9BQU87SUFDcEIsVUFBVSxFQUFFLE9BQTJCO0NBQ3hDLENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyIvKipcbiAqIEBsaWNlbnNlXG4gKiBDb3B5cmlnaHQgMjAyMCBHb29nbGUgTExDLiBBbGwgUmlnaHRzIFJlc2VydmVkLlxuICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlIFwiTGljZW5zZVwiKTtcbiAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS5cbiAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdFxuICpcbiAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMFxuICpcbiAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmVcbiAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuIFwiQVMgSVNcIiBCQVNJUyxcbiAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLlxuICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZFxuICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuXG4gKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuICovXG5cbmltcG9ydCB7S2VybmVsQ29uZmlnLCBLZXJuZWxGdW5jLCBMUk5HcmFkLCBMUk5HcmFkQXR0cnMsIExSTkdyYWRJbnB1dHMsIFRlbnNvckluZm99IGZyb20gJ0B0ZW5zb3JmbG93L3RmanMtY29yZSc7XG5cbmltcG9ydCB7TWF0aEJhY2tlbmRXZWJHTH0gZnJvbSAnLi4vYmFja2VuZF93ZWJnbCc7XG5pbXBvcnQge0xSTkdyYWRQcm9ncmFtfSBmcm9tICcuLi9scm5fZ3JhZF9ncHUnO1xuXG5leHBvcnQgY29uc3QgbHJuR3JhZCA9IChhcmdzOiB7XG4gIGlucHV0czogTFJOR3JhZElucHV0cyxcbiAgYmFja2VuZDogTWF0aEJhY2tlbmRXZWJHTCxcbiAgYXR0cnM6IExSTkdyYWRBdHRyc1xufSk6IFRlbnNvckluZm8gPT4ge1xuICBjb25zdCB7aW5wdXRzLCBiYWNrZW5kLCBhdHRyc30gPSBhcmdzO1xuICBjb25zdCB7eCwgeSwgZHl9ID0gaW5wdXRzO1xuICBjb25zdCB7ZGVwdGhSYWRpdXMsIGJpYXMsIGFscGhhLCBiZXRhfSA9IGF0dHJzO1xuXG4gIGNvbnN0IHByb2dyYW0gPSBuZXcgTFJOR3JhZFByb2dyYW0oeC5zaGFwZSwgZGVwdGhSYWRpdXMsIGJpYXMsIGFscGhhLCBiZXRhKTtcbiAgcmV0dXJuIGJhY2tlbmQucnVuV2ViR0xQcm9ncmFtKHByb2dyYW0sIFt4LCB5LCBkeV0sIHguZHR5cGUpO1xufTtcblxuLy8gdHNsaW50OmRpc2FibGUtbmV4dC1saW5lOiB2YXJpYWJsZS1uYW1lXG5leHBvcnQgY29uc3QgTFJOR3JhZENvbmZpZzogS2VybmVsQ29uZmlnID0ge1xuICBrZXJuZWxOYW1lOiBMUk5HcmFkLFxuICBiYWNrZW5kTmFtZTogJ3dlYmdsJyxcbiAga2VybmVsRnVuYzogbHJuR3JhZCBhcyB7fSBhcyBLZXJuZWxGdW5jXG59O1xuIl19","/**\n * @license\n * Copyright 2020 Google LLC. All Rights Reserved.\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n * =============================================================================\n */\nimport { Max } from '@tensorflow/tfjs-core';\nimport { backend_util, util } from '@tensorflow/tfjs-core';\nimport { maxImplCPU } from '../kernel_utils/shared';\nimport { maxImpl } from './Max_impl';\nimport { transposeImpl, transposeImplCPU } from './Transpose_impl';\nexport function max(args) {\n const { inputs, backend, attrs } = args;\n const { x } = inputs;\n const { reductionIndices, keepDims } = attrs;\n const xRank = x.shape.length;\n const origAxes = util.parseAxisParam(reductionIndices, x.shape);\n let axes = origAxes;\n const permutedAxes = backend_util.getAxesPermutation(axes, xRank);\n const maxInputIsTransposed = permutedAxes != null;\n const shouldExecuteOnCPU = backend.shouldExecuteOnCPU([x]);\n let maxInput = x;\n if (maxInputIsTransposed) {\n if (shouldExecuteOnCPU) {\n const xTexData = backend.texData.get(maxInput.dataId);\n const values = xTexData.values;\n const newShape = new Array(xRank);\n for (let i = 0; i < newShape.length; i++) {\n newShape[i] = x.shape[permutedAxes[i]];\n }\n const maxInputValues = transposeImplCPU(values, x.shape, x.dtype, permutedAxes, newShape);\n maxInput = backend.makeTensorInfo(newShape, x.dtype);\n const maxInputData = backend.texData.get(maxInput.dataId);\n maxInputData.values = maxInputValues;\n }\n else {\n maxInput = transposeImpl(x, permutedAxes, backend);\n }\n axes = backend_util.getInnerMostAxes(axes.length, xRank);\n }\n backend_util.assertAxesAreInnerMostDims('max', axes, xRank);\n const [maxOutShape, reduceShape] = backend_util.computeOutAndReduceShapes(maxInput.shape, axes);\n let outShape = maxOutShape;\n if (keepDims) {\n // rather than reshape at the end, set the target shape here.\n outShape = backend_util.expandShapeToKeepDim(maxOutShape, origAxes);\n }\n let out;\n if (shouldExecuteOnCPU) {\n const xTexData = backend.texData.get(maxInput.dataId);\n const values = xTexData.values;\n const outValues = maxImplCPU(values, util.sizeFromShape(reduceShape), outShape, x.dtype);\n out = backend.makeTensorInfo(outShape, x.dtype);\n const outData = backend.texData.get(out.dataId);\n outData.values = outValues;\n }\n else {\n out = maxImpl(maxInput, reduceShape, outShape, backend);\n }\n if (maxInputIsTransposed) {\n backend.disposeIntermediateTensorInfo(maxInput);\n }\n return out;\n}\nexport const maxConfig = {\n kernelName: Max,\n backendName: 'webgl',\n kernelFunc: max\n};\n//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiTWF4LmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vLi4vdGZqcy1iYWNrZW5kLXdlYmdsL3NyYy9rZXJuZWxzL01heC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQTs7Ozs7Ozs7Ozs7Ozs7O0dBZUc7QUFFSCxPQUFPLEVBQWEsR0FBRyxFQUFrQyxNQUFNLHVCQUF1QixDQUFDO0FBQ3ZGLE9BQU8sRUFBQyxZQUFZLEVBQTRCLElBQUksRUFBQyxNQUFNLHVCQUF1QixDQUFDO0FBR25GLE9BQU8sRUFBQyxVQUFVLEVBQUMsTUFBTSx3QkFBd0IsQ0FBQztBQUVsRCxPQUFPLEVBQUMsT0FBTyxFQUFDLE1BQU0sWUFBWSxDQUFDO0FBQ25DLE9BQU8sRUFBQyxhQUFhLEVBQUUsZ0JBQWdCLEVBQUMsTUFBTSxrQkFBa0IsQ0FBQztBQUVqRSxNQUFNLFVBQVUsR0FBRyxDQUNmLElBQXFFO0lBRXZFLE1BQU0sRUFBQyxNQUFNLEVBQUUsT0FBTyxFQUFFLEtBQUssRUFBQyxHQUFHLElBQUksQ0FBQztJQUN0QyxNQUFNLEVBQUMsQ0FBQyxFQUFDLEdBQUcsTUFBTSxDQUFDO0lBQ25CLE1BQU0sRUFBQyxnQkFBZ0IsRUFBRSxRQUFRLEVBQUMsR0FBRyxLQUFLLENBQUM7SUFFM0MsTUFBTSxLQUFLLEdBQUcsQ0FBQyxDQUFDLEtBQUssQ0FBQyxNQUFNLENBQUM7SUFFN0IsTUFBTSxRQUFRLEdBQUcsSUFBSSxDQUFDLGNBQWMsQ0FBQyxnQkFBZ0IsRUFBRSxDQUFDLENBQUMsS0FBSyxDQUFDLENBQUM7SUFDaEUsSUFBSSxJQUFJLEdBQUcsUUFBUSxDQUFDO0lBQ3BCLE1BQU0sWUFBWSxHQUFHLFlBQVksQ0FBQyxrQkFBa0IsQ0FBQyxJQUFJLEVBQUUsS0FBSyxDQUFDLENBQUM7SUFDbEUsTUFBTSxvQkFBb0IsR0FBRyxZQUFZLElBQUksSUFBSSxDQUFDO0lBQ2xELE1BQU0sa0JBQWtCLEdBQUcsT0FBTyxDQUFDLGtCQUFrQixDQUFD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QU8sR0FBRyxDQUFDO0FBQ2IsQ0FBQztBQUVELE1BQU0sQ0FBQyxNQUFNLFNBQVMsR0FBaUI7SUFDckMsVUFBVSxFQUFFLEdBQUc7SUFDZixXQUFXLEVBQUUsT0FBTztJQUNwQixVQUFVLEVBQUUsR0FBdUI7Q0FDcEMsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbIi8qKlxuICogQGxpY2Vuc2VcbiAqIENvcHlyaWdodCAyMDIwIEdvb2dsZSBMTEMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuXG4gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgXCJMaWNlbnNlXCIpO1xuICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLlxuICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0XG4gKlxuICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wXG4gKlxuICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZVxuICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gXCJBUyBJU1wiIEJBU0lTLFxuICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuXG4gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kXG4gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS5cbiAqID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4gKi9cblxuaW1wb3J0IHtLZXJuZWxGdW5jLCBNYXgsIE1heEF0dHJzLCBNYXhJbnB1dHMsIFRlbnNvckluZm99IGZyb20gJ0B0ZW5zb3JmbG93L3RmanMtY29yZSc7XG5pbXBvcnQge2JhY2tlbmRfdXRpbCwgS2VybmVsQ29uZmlnLCBUeXBlZEFycmF5LCB1dGlsfSBmcm9tICdAdGVuc29yZmxvdy90ZmpzLWNvcmUnO1xuXG5pbXBvcnQge01hdGhCYWNrZW5kV2ViR0x9IGZyb20gJy4uL2JhY2tlbmRfd2ViZ2wnO1xuaW1wb3J0IHttYXhJbXBsQ1BVfSBmcm9tICcuLi9rZXJuZWxfdXRpbHMvc2hhcmVkJztcblxuaW1wb3J0IHttYXhJbXBsfSBmcm9tICcuL01heF9pbXBsJztcbmltcG9ydCB7dHJhbnNwb3NlSW1wbCwgdHJhbnNwb3NlSW1wbENQVX0gZnJvbSAnLi9UcmFuc3Bvc2VfaW1wbCc7XG5cbmV4cG9ydCBmdW5jdGlvbiBtYXgoXG4gICAgYXJnczoge2lucHV0czogTWF4SW5wdXRzLCBiYWNrZW5kOiBNYXRoQmFja2VuZFdlYkdMLCBhdHRyczogTWF4QXR0cnN9KTpcbiAgICBUZW5zb3JJbmZvIHtcbiAgY29uc3Qge2lucHV0cywgYmFja2VuZCwgYXR0cnN9ID0gYXJncztcbiAgY29uc3Qge3h9ID0gaW5wdXRzO1xuICBjb25zdCB7cmVkdWN0aW9uSW5kaWNlcywga2VlcERpbXN9ID0gYXR0cnM7XG5cbiAgY29uc3QgeFJhbmsgPSB4LnNoYXBlLmxlbmd0aDtcblxuICBjb25zdCBvcmlnQXhlcyA9IHV0aWwucGFyc2VBeGlzUGFyYW0ocmVkdWN0aW9uSW5kaWNlcywgeC5zaGFwZSk7XG4gIGxldCBheGVzID0gb3JpZ0F4ZXM7XG4gIGNvbnN0IHBlcm11dGVkQXhlcyA9IGJhY2tlbmRfdXRpbC5nZXRBeGVzUGVybXV0YXRpb24oYXhlcywgeFJhbmspO1xuICBjb25zdCBtYXhJbnB1dElzVHJhbnNwb3NlZCA9IHBlcm11dGVkQXhlcyAhPSBudWxsO1xuICBjb25zdCBzaG91bGRFeGVjdXRlT25DUFUgPSBiYWNrZW5kLnNob3VsZEV4ZWN1dGVPbkNQVShbeF0pO1xuXG4gIGxldCBtYXhJbnB1dCA9IHg7XG4gIGlmIChtYXhJbnB1dElzVHJhbnNwb3NlZCkge1xuICAgIGlmIChzaG91bGRFeGVjdXRlT25DUFUpIHtcbiAgICAgIGNvbnN0IHhUZXhEYXRhID0gYmFja2VuZC50ZXhEYXRhLmdldChtYXhJbnB1dC5kYXRhSWQpO1xuICAgICAgY29uc3QgdmFsdWVzID0geFRleERhdGEudmFsdWVzIGFzIFR5cGVkQXJyYXk7XG5cbiAgICAgIGNvbnN0IG5ld1NoYXBlOiBudW1iZXJbXSA9IG5ldyBBcnJheSh4UmFuayk7XG4gICAgICBmb3IgKGxldCBpID0gMDsgaSA8IG5ld1NoYXBlLmxlbmd0aDsgaSsrKSB7XG4gICAgICAgIG5ld1NoYXBlW2ldID0geC5zaGFwZVtwZXJtdXRlZEF4ZXNbaV1dO1xuICAgICAgfVxuICAgICAgY29uc3QgbWF4SW5wdXRWYWx1ZXMgPVxuICAgICAgICAgIHRyYW5zcG9zZUltcGxDUFUodmFsdWVzLCB4LnNoYXBlLCB4LmR0eXBlLCBwZXJtdXRlZEF4ZXMsIG5ld1NoYXBlKTtcblxuICAgICAgbWF4SW5wdXQgPSBiYWNrZW5kLm1ha2VUZW5zb3JJbmZvKG5ld1NoYXBlLCB4LmR0eXBlKTtcbiAgICAgIGNvbnN0IG1heElucHV0RGF0YSA9IGJhY2tlbmQudGV4RGF0YS5nZXQobWF4SW5wdXQuZGF0YUlkKTtcbiAgICAgIG1heElucHV0RGF0YS52YWx1ZXMgPSBtYXhJbnB1dFZhbHVlcztcbiAgICB9IGVsc2Uge1xuICAgICAgbWF4SW5wdXQgPSB0cmFuc3Bvc2VJbXBsKHgsIHBlcm11dGVkQXhlcywgYmFja2VuZCk7XG4gICAgfVxuXG4gICAgYXhlcyA9IGJhY2tlbmRfdXRpbC5nZXRJbm5lck1vc3RBeGVzKGF4ZXMubGVuZ3RoLCB4UmFuayk7XG4gIH1cblxuICBiYWNrZW5kX3V0aWwuYXNzZXJ0QXhlc0FyZUlubmVyTW9zdERpbXMoJ21heCcsIGF4ZXMsIHhSYW5rKTtcbiAgY29uc3QgW21heE91dFNoYXBlLCByZWR1Y2VTaGFwZV0gPVxuICAgICAgYmFja2VuZF91dGlsLmNvbXB1dGVPdXRBbmRSZWR1Y2VTaGFwZXMobWF4SW5wdXQuc2hhcGUsIGF4ZXMpO1xuXG4gIGxldCBvdXRTaGFwZSA9IG1heE91dFNoYXBlO1xuICBpZiAoa2VlcERpbXMpIHtcbiAgICAvLyByYXRoZXIgdGhhbiByZXNoYXBlIGF0IHRoZSBlbmQsIHNldCB0aGUgdGFyZ2V0IHNoYXBlIGhlcmUuXG4gICAgb3V0U2hhcGUgPSBiYWNrZW5kX3V0aWwuZXhwYW5kU2hhcGVUb0tlZXBEaW0obWF4T3V0U2hhcGUsIG9yaWdBeGVzKTtcbiAgfVxuXG4gIGxldCBvdXQ7XG4gIGlmIChzaG91bGRFeGVjdXRlT25DUFUpIHtcbiAgICBjb25zdCB4VGV4RGF0YSA9IGJhY2tlbmQudGV4RGF0YS5nZXQobWF4SW5wdXQuZGF0YUlkKTtcbiAgICBjb25zdCB2YWx1ZXMgPSB4VGV4RGF0YS52YWx1ZXMgYXMgVHlwZWRBcnJheTtcblxuICAgIGNvbnN0IG91dFZhbHVlcyA9XG4gICAgICAgIG1heEltcGxDUFUodmFsdWVzLCB1dGlsLnNpemVGcm9tU2hhcGUocmVkdWNlU2hhcGUpLCBvdXRTaGFwZSwgeC5kdHlwZSk7XG5cbiAgICBvdXQgPSBiYWNrZW5kLm1ha2VUZW5zb3JJbmZvKG91dFNoYXBlLCB4LmR0eXBlKTtcbiAgICBjb25zdCBvdXREYXRhID0gYmFja2VuZC50ZXhEYXRhLmdldChvdXQuZGF0YUlkKTtcbiAgICBvdXREYXRhLnZhbHVlcyA9IG91dFZhbHVlcztcbiAgfSBlbHNlIHtcbiAgICBvdXQgPSBtYXhJbXBsKG1heElucHV0LCByZWR1Y2VTaGFwZSwgb3V0U2hhcGUsIGJhY2tlbmQpO1xuICB9XG5cbiAgaWYgKG1heElucHV0SXNUcmFuc3Bvc2VkKSB7XG4gICAgYmFja2VuZC5kaXNwb3NlSW50ZXJtZWRpYXRlVGVuc29ySW5mbyhtYXhJbnB1dCk7XG4gIH1cblxuICByZXR1cm4gb3V0O1xufVxuXG5leHBvcnQgY29uc3QgbWF4Q29uZmlnOiBLZXJuZWxDb25maWcgPSB7XG4gIGtlcm5lbE5hbWU6IE1heCxcbiAgYmFja2VuZE5hbWU6ICd3ZWJnbCcsXG4gIGtlcm5lbEZ1bmM6IG1heCBhcyB7fSBhcyBLZXJuZWxGdW5jXG59O1xuIl19","/**\n * @license\n * Copyright 2020 Google LLC. All Rights Reserved.\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n * =============================================================================\n */\nimport { util } from '@tensorflow/tfjs-core';\nimport { reduce } from '../kernel_utils/reduce';\nimport { reshape } from '../kernels/Reshape';\nexport function maxImpl(x, reduceShape, outShape, backend) {\n const inSize = util.sizeFromShape(reduceShape);\n const xSize = util.sizeFromShape(x.shape);\n const batchSize = xSize / inSize;\n const reshapedInput = reshape({ inputs: { x }, attrs: { shape: [batchSize, inSize] }, backend });\n const reduced = reduce(reshapedInput, x.dtype, 'max', backend);\n const reshapedOutput = reshape({ inputs: { x: reduced }, attrs: { shape: outShape }, backend });\n backend.disposeIntermediateTensorInfo(reshapedInput);\n backend.disposeIntermediateTensorInfo(reduced);\n return reshapedOutput;\n}\n//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiTWF4X2ltcGwuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi8uLi90ZmpzLWJhY2tlbmQtd2ViZ2wvc3JjL2tlcm5lbHMvTWF4X2ltcGwudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUE7Ozs7Ozs7Ozs7Ozs7OztHQWVHO0FBRUgsT0FBTyxFQUFhLElBQUksRUFBQyxNQUFNLHVCQUF1QixDQUFDO0FBR3ZELE9BQU8sRUFBQyxNQUFNLEVBQUMsTUFBTSx3QkFBd0IsQ0FBQztBQUM5QyxPQUFPLEVBQUMsT0FBTyxFQUFDLE1BQU0sb0JBQW9CLENBQUM7QUFFM0MsTUFBTSxVQUFVLE9BQU8sQ0FDbkIsQ0FBYSxFQUFFLFdBQXFCLEVBQUUsUUFBa0IsRUFDeEQsT0FBeUI7SUFDM0IsTUFBTSxNQUFNLEdBQUcsSUFBSSxDQUFDLGFBQWEsQ0FBQyxXQUFXLENBQUMsQ0FBQztJQUMvQyxNQUFNLEtBQUssR0FBRyxJQUFJLENBQUMsYUFBYSxDQUFDLENBQUMsQ0FBQyxLQUFLLENBQUMsQ0FBQztJQUMxQyxNQUFNLFNBQVMsR0FBRyxLQUFLLEdBQUcsTUFBTSxDQUFDO0lBQ2pDLE1BQU0sYUFBYSxHQUNmLE9BQU8sQ0FBQyxFQUFDLE1BQU0sRUFBRSxFQUFDLENBQUMsRUFBQyxFQUFFLEtBQUssRUFBRSxFQUFDLEtBQUssRUFBRSxDQUFDLFNBQVMsRUFBRSxNQUFNLENBQUMsRUFBQyxFQUFFLE9BQU8sRUFBQyxDQUFDLENBQUM7SUFFekUsTUFBTSxPQUFPLEdBQUcsTUFBTSxDQUFDLGFBQWEsRUFBRSxDQUFDLENBQUMsS0FBSyxFQUFFLEtBQUssRUFBRSxPQUFPLENBQUMsQ0FBQztJQUMvRCxNQUFNLGNBQWMsR0FDaEIsT0FBTyxDQUFDLEVBQUMsTUFBTSxFQUFFLEVBQUMsQ0FBQyxFQUFFLE9BQU8sRUFBQyxFQUFFLEtBQUssRUFBRSxFQUFDLEtBQUssRUFBRSxRQUFRLEVBQUMsRUFBRSxPQUFPLEVBQUMsQ0FBQyxDQUFDO0lBRXZFLE9BQU8sQ0FBQyw2QkFBNkIsQ0FBQyxhQUFhLENBQUMsQ0FBQztJQUNyRCxPQUFPLENBQUMsNkJBQTZCLENBQUMsT0FBTyxDQUFDLENBQUM7SUFFL0MsT0FBTyxjQUFjLENBQUM7QUFDeEIsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbIi8qKlxuICogQGxpY2Vuc2VcbiAqIENvcHlyaWdodCAyMDIwIEdvb2dsZSBMTEMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuXG4gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgXCJMaWNlbnNlXCIpO1xuICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLlxuICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0XG4gKlxuICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wXG4gKlxuICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZVxuICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gXCJBUyBJU1wiIEJBU0lTLFxuICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuXG4gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kXG4gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS5cbiAqID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4gKi9cblxuaW1wb3J0IHtUZW5zb3JJbmZvLCB1dGlsfSBmcm9tICdAdGVuc29yZmxvdy90ZmpzLWNvcmUnO1xuXG5pbXBvcnQge01hdGhCYWNrZW5kV2ViR0x9IGZyb20gJy4uL2JhY2tlbmRfd2ViZ2wnO1xuaW1wb3J0IHtyZWR1Y2V9IGZyb20gJy4uL2tlcm5lbF91dGlscy9yZWR1Y2UnO1xuaW1wb3J0IHtyZXNoYXBlfSBmcm9tICcuLi9rZXJuZWxzL1Jlc2hhcGUnO1xuXG5leHBvcnQgZnVuY3Rpb24gbWF4SW1wbChcbiAgICB4OiBUZW5zb3JJbmZvLCByZWR1Y2VTaGFwZTogbnVtYmVyW10sIG91dFNoYXBlOiBudW1iZXJbXSxcbiAgICBiYWNrZW5kOiBNYXRoQmFja2VuZFdlYkdMKTogVGVuc29ySW5mbyB7XG4gIGNvbnN0IGluU2l6ZSA9IHV0aWwuc2l6ZUZyb21TaGFwZShyZWR1Y2VTaGFwZSk7XG4gIGNvbnN0IHhTaXplID0gdXRpbC5zaXplRnJvbVNoYXBlKHguc2hhcGUpO1xuICBjb25zdCBiYXRjaFNpemUgPSB4U2l6ZSAvIGluU2l6ZTtcbiAgY29uc3QgcmVzaGFwZWRJbnB1dCA9XG4gICAgICByZXNoYXBlKHtpbnB1dHM6IHt4fSwgYXR0cnM6IHtzaGFwZTogW2JhdGNoU2l6ZSwgaW5TaXplXX0sIGJhY2tlbmR9KTtcblxuICBjb25zdCByZWR1Y2VkID0gcmVkdWNlKHJlc2hhcGVkSW5wdXQsIHguZHR5cGUsICdtYXgnLCBiYWNrZW5kKTtcbiAgY29uc3QgcmVzaGFwZWRPdXRwdXQgPVxuICAgICAgcmVzaGFwZSh7aW5wdXRzOiB7eDogcmVkdWNlZH0sIGF0dHJzOiB7c2hhcGU6IG91dFNoYXBlfSwgYmFja2VuZH0pO1xuXG4gIGJhY2tlbmQuZGlzcG9zZUludGVybWVkaWF0ZVRlbnNvckluZm8ocmVzaGFwZWRJbnB1dCk7XG4gIGJhY2tlbmQuZGlzcG9zZUludGVybWVkaWF0ZVRlbnNvckluZm8ocmVkdWNlZCk7XG5cbiAgcmV0dXJuIHJlc2hhcGVkT3V0cHV0O1xufVxuIl19","/**\n * @license\n * Copyright 2020 Google LLC. All Rights Reserved.\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n * =============================================================================\n */\nimport { Maximum } from '@tensorflow/tfjs-core';\nimport { CHECK_NAN_SNIPPET } from '../binaryop_gpu';\nimport { CHECK_NAN_SNIPPET_PACKED } from '../binaryop_packed_gpu';\nimport { binaryKernelFunc } from '../kernel_utils/kernel_funcs_utils';\nimport { maximumImplCPU } from '../kernel_utils/shared';\nconst MAXIMUM = CHECK_NAN_SNIPPET + `\n return max(a, b);\n`;\nconst MAXIMUM_PACKED = `\n vec4 result = vec4(max(a, b));\n bvec4 isNaNA = isnan(a);\n bvec4 isNaNB = isnan(b);\n bvec4 isNaN = bvec4(isNaNA.x || isNaNB.x, isNaNA.y || isNaNB.y, isNaNA.z || isNaNB.z, isNaNA.w || isNaNB.w);\n ` +\n CHECK_NAN_SNIPPET_PACKED + `\n return result;\n`;\nexport const maximum = binaryKernelFunc({\n opSnippet: MAXIMUM,\n packedOpSnippet: MAXIMUM_PACKED,\n cpuKernelImpl: maximumImplCPU\n});\nexport const maximumConfig = {\n kernelName: Maximum,\n backendName: 'webgl',\n kernelFunc: maximum\n};\n//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiTWF4aW11bS5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uLy4uL3RmanMtYmFja2VuZC13ZWJnbC9zcmMva2VybmVscy9NYXhpbXVtLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBOzs7Ozs7Ozs7Ozs7Ozs7R0FlRztBQUVILE9BQU8sRUFBMkIsT0FBTyxFQUFDLE1BQU0sdUJBQXVCLENBQUM7QUFFeEUsT0FBTyxFQUFDLGlCQUFpQixFQUFDLE1BQU0saUJBQWlCLENBQUM7QUFDbEQsT0FBTyxFQUFDLHdCQUF3QixFQUFDLE1BQU0sd0JBQXdCLENBQUM7QUFDaEUsT0FBTyxFQUFDLGdCQUFnQixFQUFDLE1BQU0sb0NBQW9DLENBQUM7QUFDcEUsT0FBTyxFQUFDLGNBQWMsRUFBQyxNQUFNLHdCQUF3QixDQUFDO0FBRXRELE1BQU0sT0FBTyxHQUFHLGlCQUFpQixHQUFHOztDQUVuQyxDQUFDO0FBRUYsTUFBTSxjQUFjLEdBQUc7Ozs7O0dBS3BCO0lBQ0Msd0JBQXdCLEdBQUc7O0NBRTlCLENBQUM7QUFFRixNQUFNLENBQUMsTUFBTSxPQUFPLEdBQUcsZ0JBQWdCLENBQUM7SUFDdEMsU0FBUyxFQUFFLE9BQU87SUFDbEIsZUFBZSxFQUFFLGNBQWM7SUFDL0IsYUFBYSxFQUFFLGNBQWM7Q0FDOUIsQ0FBQyxDQUFDO0FBRUgsTUFBTSxDQUFDLE1BQU0sYUFBYSxHQUFpQjtJQUN6QyxVQUFVLEVBQUUsT0FBTztJQUNuQixXQUFXLEVBQUUsT0FBTztJQUNwQixVQUFVLEVBQUUsT0FBMkI7Q0FDeEMsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbIi8qKlxuICogQGxpY2Vuc2VcbiAqIENvcHlyaWdodCAyMDIwIEdvb2dsZSBMTEMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuXG4gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgXCJMaWNlbnNlXCIpO1xuICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLlxuICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0XG4gKlxuICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wXG4gKlxuICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZVxuICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gXCJBUyBJU1wiIEJBU0lTLFxuICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuXG4gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kXG4gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS5cbiAqID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4gKi9cblxuaW1wb3J0IHtLZXJuZWxDb25maWcsIEtlcm5lbEZ1bmMsIE1heGltdW19IGZyb20gJ0B0ZW5zb3JmbG93L3RmanMtY29yZSc7XG5cbmltcG9ydCB7Q0hFQ0tfTkFOX1NOSVBQRVR9IGZyb20gJy4uL2JpbmFyeW9wX2dwdSc7XG5pbXBvcnQge0NIRUNLX05BTl9TTklQUEVUX1BBQ0tFRH0gZnJvbSAnLi4vYmluYXJ5b3BfcGFja2VkX2dwdSc7XG5pbXBvcnQge2JpbmFyeUtlcm5lbEZ1bmN9IGZyb20gJy4uL2tlcm5lbF91dGlscy9rZXJuZWxfZnVuY3NfdXRpbHMnO1xuaW1wb3J0IHttYXhpbXVtSW1wbENQVX0gZnJvbSAnLi4va2VybmVsX3V0aWxzL3NoYXJlZCc7XG5cbmNvbnN0IE1BWElNVU0gPSBDSEVDS19OQU5fU05JUFBFVCArIGBcbiAgcmV0dXJuIG1heChhLCBiKTtcbmA7XG5cbmNvbnN0IE1BWElNVU1fUEFDS0VEID0gYFxuICB2ZWM0IHJlc3VsdCA9IHZlYzQobWF4KGEsIGIpKTtcbiAgYnZlYzQgaXNOYU5BID0gaXNuYW4oYSk7XG4gIGJ2ZWM0IGlzTmFOQiA9IGlzbmFuKGIpO1xuICBidmVjNCBpc05hTiA9IGJ2ZWM0KGlzTmFOQS54IHx8IGlzTmFOQi54LCBpc05hTkEueSB8fCBpc05hTkIueSwgaXNOYU5BLnogfHwgaXNOYU5CLnosIGlzTmFOQS53IHx8IGlzTmFOQi53KTtcbiAgYCArXG4gICAgQ0hFQ0tfTkFOX1NOSVBQRVRfUEFDS0VEICsgYFxuICByZXR1cm4gcmVzdWx0O1xuYDtcblxuZXhwb3J0IGNvbnN0IG1heGltdW0gPSBiaW5hcnlLZXJuZWxGdW5jKHtcbiAgb3BTbmlwcGV0OiBNQVhJTVVNLFxuICBwYWNrZWRPcFNuaXBwZXQ6IE1BWElNVU1fUEFDS0VELFxuICBjcHVLZXJuZWxJbXBsOiBtYXhpbXVtSW1wbENQVVxufSk7XG5cbmV4cG9ydCBjb25zdCBtYXhpbXVtQ29uZmlnOiBLZXJuZWxDb25maWcgPSB7XG4gIGtlcm5lbE5hbWU6IE1heGltdW0sXG4gIGJhY2tlbmROYW1lOiAnd2ViZ2wnLFxuICBrZXJuZWxGdW5jOiBtYXhpbXVtIGFzIHt9IGFzIEtlcm5lbEZ1bmNcbn07XG4iXX0=","/**\n * @license\n * Copyright 2020 Google LLC. All Rights Reserved.\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n * =============================================================================\n */\nimport { backend_util, MaxPool, util } from '@tensorflow/tfjs-core';\nimport { Pool2DProgram } from '../pool_gpu';\nimport { assertNotComplex } from '../webgl_util';\nimport { identity } from './Identity';\nexport function maxPool(args) {\n const { inputs, backend, attrs } = args;\n const { x } = inputs;\n assertNotComplex(x, 'maxPool');\n const { filterSize, strides, pad, dimRoundingMode } = attrs;\n const dilations = 1;\n util.assert(backend_util.eitherStridesOrDilationsAreOne(strides, dilations), () => 'Error in maxPool: Either strides or dilations must be 1. ' +\n `Got strides ${strides} and dilations '${dilations}'`);\n const convInfo = backend_util.computePool2DInfo(x.shape, filterSize, strides, dilations, pad, dimRoundingMode);\n if (convInfo.filterWidth === 1 && convInfo.filterHeight === 1 &&\n util.arraysEqual(convInfo.inShape, convInfo.outShape)) {\n return identity({ inputs: { x }, backend });\n }\n const maxPoolProgram = new Pool2DProgram(convInfo, 'max', false);\n return backend.runWebGLProgram(maxPoolProgram, [x], x.dtype);\n}\nexport const maxPoolConfig = {\n kernelName: MaxPool,\n backendName: 'webgl',\n kernelFunc: maxPool\n};\n//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiTWF4UG9vbC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uLy4uL3RmanMtYmFja2VuZC13ZWJnbC9zcmMva2VybmVscy9NYXhQb29sLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBOzs7Ozs7Ozs7Ozs7Ozs7R0FlRztBQUNILE9BQU8sRUFBQyxZQUFZLEVBQTRCLE9BQU8sRUFBMkMsSUFBSSxFQUFDLE1BQU0sdUJBQXVCLENBQUM7QUFHckksT0FBTyxFQUFDLGFBQWEsRUFBQyxNQUFNLGFBQWEsQ0FBQztBQUMxQyxPQUFPLEVBQUMsZ0JBQWdCLEVBQUMsTUFBTSxlQUFlLENBQUM7QUFDL0MsT0FBTyxFQUFDLFFBQVEsRUFBQyxNQUFNLFlBQVksQ0FBQztBQUVwQyxNQUFNLFVBQVUsT0FBTyxDQUFDLElBSXZCO0lBQ0MsTUFBTSxFQUFDLE1BQU0sRUFBRSxPQUFPLEVBQUUsS0FBSyxFQUFDLEdBQUcsSUFBSSxDQUFDO0lBQ3RDLE1BQU0sRUFBQyxDQUFDLEVBQUMsR0FBRyxNQUFNLENBQUM7SUFDbkIsZ0JBQWdCLENBQUMsQ0FBQyxFQUFFLFNBQVMsQ0FBQyxDQUFDO0lBQy9CLE1BQU0sRUFBQyxVQUFVLEVBQUUsT0FBTyxFQUFFLEdBQUcsRUFBRSxlQUFlLEVBQUMsR0FBRyxLQUFLLENBQUM7SUFDMUQsTUFBTSxTQUFTLEdBQUcsQ0FBQyxDQUFDO0lBRXBCLElBQUksQ0FBQyxNQUFNLENBQ1AsWUFBWSxDQUFDLDhCQUE4QixDQUFDLE9BQU8sRUFBRSxTQUFTLENBQUMsRUFDL0QsR0FBRyxFQUFFLENBQUMsMkRBQTJEO1FBQzdELGVBQWUsT0FBTyxtQkFBbUIsU0FBUyxHQUFHLENBQUMsQ0FBQztJQUUvRCxNQUFNLFFBQVEsR0FBRyxZQUFZLENBQUMsaUJBQWlCLENBQzNDLENBQUMsQ0FBQyxLQUF5QyxFQUFFLFVBQVUsRUFBRSxPQUFPLEVBQ2hFLFNBQVMsRUFBRSxHQUFHLEVBQUUsZUFBZSxDQUFDLENBQUM7SUFDckMsSUFBSSxRQUFRLENBQUMsV0FBVyxLQUFLLENBQUMsSUFBSSxRQUFRLENBQUMsWUFBWSxLQUFLLENBQUM7UUFDekQsSUFBSSxDQUFDLFdBQVcsQ0FBQyxRQUFRLENBQUMsT0FBTyxFQUFFLFFBQVEsQ0FBQyxRQUFRLENBQUMsRUFBRTtRQUN6RCxPQUFPLFFBQVEsQ0FBQyxFQUFDLE1BQU0sRUFBRSxFQUFDLENBQUMsRUFBQyxFQUFFLE9BQU8sRUFBQyxDQUFDLENBQUM7S0FDekM7SUFDRCxNQUFNLGNBQWMsR0FBRyxJQUFJLGFBQWEsQ0FBQyxRQUFRLEVBQUUsS0FBSyxFQUFFLEtBQUssQ0FBQyxDQUFDO0lBQ2pFLE9BQU8sT0FBTyxDQUFDLGVBQWUsQ0FBQyxjQUFjLEVBQUUsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsS0FBSyxDQUFDLENBQUM7QUFDL0QsQ0FBQztBQUVELE1BQU0sQ0FBQyxNQUFNLGFBQWEsR0FBaUI7SUFDekMsVUFBVSxFQUFFLE9BQU87SUFDbkIsV0FBVyxFQUFFLE9BQU87SUFDcEIsVUFBVSxFQUFFLE9BQTJCO0NBQ3hDLENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyIvKipcbiAqIEBsaWNlbnNlXG4gKiBDb3B5cmlnaHQgMjAyMCBHb29nbGUgTExDLiBBbGwgUmlnaHRzIFJlc2VydmVkLlxuICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlIFwiTGljZW5zZVwiKTtcbiAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS5cbiAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdFxuICpcbiAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMFxuICpcbiAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmVcbiAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuIFwiQVMgSVNcIiBCQVNJUyxcbiAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLlxuICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZFxuICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuXG4gKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuICovXG5pbXBvcnQge2JhY2tlbmRfdXRpbCwgS2VybmVsQ29uZmlnLCBLZXJuZWxGdW5jLCBNYXhQb29sLCBNYXhQb29sQXR0cnMsIE1heFBvb2xJbnB1dHMsIFRlbnNvckluZm8sIHV0aWx9IGZyb20gJ0B0ZW5zb3JmbG93L3RmanMtY29yZSc7XG5cbmltcG9ydCB7TWF0aEJhY2tlbmRXZWJHTH0gZnJvbSAnLi4vYmFja2VuZF93ZWJnbCc7XG5pbXBvcnQge1Bvb2wyRFByb2dyYW19IGZyb20gJy4uL3Bvb2xfZ3B1JztcbmltcG9ydCB7YXNzZXJ0Tm90Q29tcGxleH0gZnJvbSAnLi4vd2ViZ2xfdXRpbCc7XG5pbXBvcnQge2lkZW50aXR5fSBmcm9tICcuL0lkZW50aXR5JztcblxuZXhwb3J0IGZ1bmN0aW9uIG1heFBvb2woYXJnczoge1xuICBpbnB1dHM6IE1heFBvb2xJbnB1dHMsXG4gIGJhY2tlbmQ6IE1hdGhCYWNrZW5kV2ViR0wsXG4gIGF0dHJzOiBNYXhQb29sQXR0cnNcbn0pOiBUZW5zb3JJbmZvIHtcbiAgY29uc3Qge2lucHV0cywgYmFja2VuZCwgYXR0cnN9ID0gYXJncztcbiAgY29uc3Qge3h9ID0gaW5wdXRzO1xuICBhc3NlcnROb3RDb21wbGV4KHgsICdtYXhQb29sJyk7XG4gIGNvbnN0IHtmaWx0ZXJTaXplLCBzdHJpZGVzLCBwYWQsIGRpbVJvdW5kaW5nTW9kZX0gPSBhdHRycztcbiAgY29uc3QgZGlsYXRpb25zID0gMTtcblxuICB1dGlsLmFzc2VydChcbiAgICAgIGJhY2tlbmRfdXRpbC5laXRoZXJTdHJpZGVzT3JEaWxhdGlvbnNBcmVPbmUoc3RyaWRlcywgZGlsYXRpb25zKSxcbiAgICAgICgpID0+ICdFcnJvciBpbiBtYXhQb29sOiBFaXRoZXIgc3RyaWRlcyBvciBkaWxhdGlvbnMgbXVzdCBiZSAxLiAnICtcbiAgICAgICAgICBgR290IHN0cmlkZXMgJHtzdHJpZGVzfSBhbmQgZGlsYXRpb25zICcke2RpbGF0aW9uc30nYCk7XG5cbiAgY29uc3QgY29udkluZm8gPSBiYWNrZW5kX3V0aWwuY29tcHV0ZVBvb2wyREluZm8oXG4gICAgICB4LnNoYXBlIGFzIFtudW1iZXIsIG51bWJlciwgbnVtYmVyLCBudW1iZXJdLCBmaWx0ZXJTaXplLCBzdHJpZGVzLFxuICAgICAgZGlsYXRpb25zLCBwYWQsIGRpbVJvdW5kaW5nTW9kZSk7XG4gIGlmIChjb252SW5mby5maWx0ZXJXaWR0aCA9PT0gMSAmJiBjb252SW5mby5maWx0ZXJIZWlnaHQgPT09IDEgJiZcbiAgICAgIHV0aWwuYXJyYXlzRXF1YWwoY29udkluZm8uaW5TaGFwZSwgY29udkluZm8ub3V0U2hhcGUpKSB7XG4gICAgcmV0dXJuIGlkZW50aXR5KHtpbnB1dHM6IHt4fSwgYmFja2VuZH0pO1xuICB9XG4gIGNvbnN0IG1heFBvb2xQcm9ncmFtID0gbmV3IFBvb2wyRFByb2dyYW0oY29udkluZm8sICdtYXgnLCBmYWxzZSk7XG4gIHJldHVybiBiYWNrZW5kLnJ1bldlYkdMUHJvZ3JhbShtYXhQb29sUHJvZ3JhbSwgW3hdLCB4LmR0eXBlKTtcbn1cblxuZXhwb3J0IGNvbnN0IG1heFBvb2xDb25maWc6IEtlcm5lbENvbmZpZyA9IHtcbiAga2VybmVsTmFtZTogTWF4UG9vbCxcbiAgYmFja2VuZE5hbWU6ICd3ZWJnbCcsXG4gIGtlcm5lbEZ1bmM6IG1heFBvb2wgYXMge30gYXMgS2VybmVsRnVuY1xufTtcbiJdfQ==","/**\n * @license\n * Copyright 2020 Google LLC. All Rights Reserved.\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n * =============================================================================\n */\nimport { backend_util, MaxPool3D } from '@tensorflow/tfjs-core';\nimport { Pool3DProgram } from '../pool_gpu';\nexport function maxPool3d(args) {\n const { inputs, backend, attrs } = args;\n const { x } = inputs;\n const { filterSize, strides, pad, dataFormat, dimRoundingMode } = attrs;\n const dilations = [1, 1, 1];\n const convInfo = backend_util.computePool3DInfo(x.shape, filterSize, strides, dilations, pad, dimRoundingMode, dataFormat);\n const maxPoolProgram = new Pool3DProgram(convInfo, 'max', false);\n return backend.runWebGLProgram(maxPoolProgram, [x], x.dtype);\n}\nexport const maxPool3DConfig = {\n kernelName: MaxPool3D,\n backendName: 'webgl',\n kernelFunc: maxPool3d\n};\n//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiTWF4UG9vbDNELmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vLi4vdGZqcy1iYWNrZW5kLXdlYmdsL3NyYy9rZXJuZWxzL01heFBvb2wzRC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQTs7Ozs7Ozs7Ozs7Ozs7O0dBZUc7QUFDSCxPQUFPLEVBQUMsWUFBWSxFQUE0QixTQUFTLEVBQThDLE1BQU0sdUJBQXVCLENBQUM7QUFHckksT0FBTyxFQUFDLGFBQWEsRUFBQyxNQUFNLGFBQWEsQ0FBQztBQUUxQyxNQUFNLFVBQVUsU0FBUyxDQUFDLElBSXpCO0lBQ0MsTUFBTSxFQUFDLE1BQU0sRUFBRSxPQUFPLEVBQUUsS0FBSyxFQUFDLEdBQUcsSUFBSSxDQUFDO0lBQ3RDLE1BQU0sRUFBQyxDQUFDLEVBQUMsR0FBRyxNQUFNLENBQUM7SUFDbkIsTUFBTSxFQUFDLFVBQVUsRUFBRSxPQUFPLEVBQUUsR0FBRyxFQUFFLFVBQVUsRUFBRSxlQUFlLEVBQUMsR0FBRyxLQUFLLENBQUM7SUFDdEUsTUFBTSxTQUFTLEdBQTZCLENBQUMsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQztJQUV0RCxNQUFNLFFBQVEsR0FBRyxZQUFZLENBQUMsaUJBQWlCLENBQzNDLENBQUMsQ0FBQyxLQUFpRCxFQUFFLFVBQVUsRUFBRSxPQUFPLEVBQ3hFLFNBQVMsRUFBRSxHQUFHLEVBQUUsZUFBZSxFQUFFLFVBQVUsQ0FBQyxDQUFDO0lBQ2pELE1BQU0sY0FBYyxHQUFHLElBQUksYUFBYSxDQUFDLFFBQVEsRUFBRSxLQUFLLEVBQUUsS0FBSyxDQUFDLENBQUM7SUFDakUsT0FBTyxPQUFPLENBQUMsZUFBZSxDQUFDLGNBQWMsRUFBRSxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxLQUFLLENBQUMsQ0FBQztBQUMvRCxDQUFDO0FBRUQsTUFBTSxDQUFDLE1BQU0sZUFBZSxHQUFpQjtJQUMzQyxVQUFVLEVBQUUsU0FBUztJQUNyQixXQUFXLEVBQUUsT0FBTztJQUNwQixVQUFVLEVBQUUsU0FBNkI7Q0FDMUMsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbIi8qKlxuICogQGxpY2Vuc2VcbiAqIENvcHlyaWdodCAyMDIwIEdvb2dsZSBMTEMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuXG4gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgXCJMaWNlbnNlXCIpO1xuICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLlxuICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0XG4gKlxuICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wXG4gKlxuICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZVxuICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gXCJBUyBJU1wiIEJBU0lTLFxuICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuXG4gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kXG4gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS5cbiAqID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4gKi9cbmltcG9ydCB7YmFja2VuZF91dGlsLCBLZXJuZWxDb25maWcsIEtlcm5lbEZ1bmMsIE1heFBvb2wzRCwgTWF4UG9vbDNEQXR0cnMsIE1heFBvb2wzRElucHV0cywgVGVuc29ySW5mb30gZnJvbSAnQHRlbnNvcmZsb3cvdGZqcy1jb3JlJztcblxuaW1wb3J0IHtNYXRoQmFja2VuZFdlYkdMfSBmcm9tICcuLi9iYWNrZW5kX3dlYmdsJztcbmltcG9ydCB7UG9vbDNEUHJvZ3JhbX0gZnJvbSAnLi4vcG9vbF9ncHUnO1xuXG5leHBvcnQgZnVuY3Rpb24gbWF4UG9vbDNkKGFyZ3M6IHtcbiAgaW5wdXRzOiBNYXhQb29sM0RJbnB1dHMsXG4gIGJhY2tlbmQ6IE1hdGhCYWNrZW5kV2ViR0wsXG4gIGF0dHJzOiBNYXhQb29sM0RBdHRyc1xufSk6IFRlbnNvckluZm8ge1xuICBjb25zdCB7aW5wdXRzLCBiYWNrZW5kLCBhdHRyc30gPSBhcmdzO1xuICBjb25zdCB7eH0gPSBpbnB1dHM7XG4gIGNvbnN0IHtmaWx0ZXJTaXplLCBzdHJpZGVzLCBwYWQsIGRhdGFGb3JtYXQsIGRpbVJvdW5kaW5nTW9kZX0gPSBhdHRycztcbiAgY29uc3QgZGlsYXRpb25zOiBbbnVtYmVyLCBudW1iZXIsIG51bWJlcl0gPSBbMSwgMSwgMV07XG5cbiAgY29uc3QgY29udkluZm8gPSBiYWNrZW5kX3V0aWwuY29tcHV0ZVBvb2wzREluZm8oXG4gICAgICB4LnNoYXBlIGFzIFtudW1iZXIsIG51bWJlciwgbnVtYmVyLCBudW1iZXIsIG51bWJlcl0sIGZpbHRlclNpemUsIHN0cmlkZXMsXG4gICAgICBkaWxhdGlvbnMsIHBhZCwgZGltUm91bmRpbmdNb2RlLCBkYXRhRm9ybWF0KTtcbiAgY29uc3QgbWF4UG9vbFByb2dyYW0gPSBuZXcgUG9vbDNEUHJvZ3JhbShjb252SW5mbywgJ21heCcsIGZhbHNlKTtcbiAgcmV0dXJuIGJhY2tlbmQucnVuV2ViR0xQcm9ncmFtKG1heFBvb2xQcm9ncmFtLCBbeF0sIHguZHR5cGUpO1xufVxuXG5leHBvcnQgY29uc3QgbWF4UG9vbDNEQ29uZmlnOiBLZXJuZWxDb25maWcgPSB7XG4gIGtlcm5lbE5hbWU6IE1heFBvb2wzRCxcbiAgYmFja2VuZE5hbWU6ICd3ZWJnbCcsXG4gIGtlcm5lbEZ1bmM6IG1heFBvb2wzZCBhcyB7fSBhcyBLZXJuZWxGdW5jXG59O1xuIl19","/**\n * @license\n * Copyright 2017 Google LLC. All Rights Reserved.\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n * =============================================================================\n */\nexport class MaxPool2DBackpropProgram {\n constructor(convInfo) {\n this.variableNames = ['dy', 'maxPos'];\n this.outputShape = convInfo.inShape;\n const strideHeight = convInfo.strideHeight;\n const strideWidth = convInfo.strideWidth;\n const dilationHeight = convInfo.dilationHeight;\n const effectiveFilterHeight = convInfo.effectiveFilterHeight;\n const effectiveFilterWidth = convInfo.effectiveFilterWidth;\n const padTop = effectiveFilterHeight - 1 - convInfo.padInfo.top;\n const padLeft = effectiveFilterWidth - 1 - convInfo.padInfo.left;\n const lastIndex = effectiveFilterHeight * effectiveFilterWidth - 1;\n this.userCode = `\n const ivec2 pads = ivec2(${padTop}, ${padLeft});\n\n void main() {\n ivec4 coords = getOutputCoords();\n int b = coords[0];\n int d = coords[3];\n\n ivec2 dyRCCorner = coords.yz - pads;\n int dyRCorner = dyRCCorner.x;\n int dyCCorner = dyRCCorner.y;\n\n // Convolve dy(?, ?, d) with pos mask(:, :, d) to get dx(xR, xC, d).\n // ? = to be determined. : = across all values in that axis.\n float dotProd = 0.0;\n for (int wR = 0; wR < ${effectiveFilterHeight};\n wR += ${dilationHeight}) {\n float dyR = float(dyRCorner + wR) / ${strideHeight}.0;\n\n if (dyR < 0.0 || dyR >= ${convInfo.outHeight}.0 || fract(dyR) > 0.0) {\n continue;\n }\n int idyR = int(dyR);\n\n for (int wC = 0; wC < ${effectiveFilterWidth}; wC++) {\n float dyC = float(dyCCorner + wC) / ${strideWidth}.0;\n\n if (dyC < 0.0 || dyC >= ${convInfo.outWidth}.0 ||\n fract(dyC) > 0.0) {\n continue;\n }\n int idyC = int(dyC);\n\n float dyValue = getDy(b, idyR, idyC, d);\n int maxPosValue = ${lastIndex} - int(getMaxPos(b, idyR, idyC, d));\n\n // Get the current value, check it against the value from the\n // position matrix.\n int curPosValue = wR * ${effectiveFilterWidth} + wC;\n float mask = float(maxPosValue == curPosValue ? 1.0 : 0.0);\n\n dotProd += dyValue * mask;\n }\n }\n setOutput(dotProd);\n }\n `;\n }\n}\nexport class MaxPool3DBackpropProgram {\n constructor(convInfo) {\n this.variableNames = ['dy', 'maxPos'];\n this.outputShape = convInfo.inShape;\n const strideDepth = convInfo.strideDepth;\n const strideHeight = convInfo.strideHeight;\n const strideWidth = convInfo.strideWidth;\n const dilationDepth = convInfo.dilationDepth;\n const dilationHeight = convInfo.dilationHeight;\n const dilationWidth = convInfo.dilationWidth;\n const effectiveFilterDepth = convInfo.effectiveFilterDepth;\n const effectiveFilterHeight = convInfo.effectiveFilterHeight;\n const effectiveFilterWidth = convInfo.effectiveFilterWidth;\n const padFront = effectiveFilterDepth - 1 - convInfo.padInfo.front;\n const padTop = effectiveFilterHeight - 1 - convInfo.padInfo.top;\n const padLeft = effectiveFilterWidth - 1 - convInfo.padInfo.left;\n const lastIndex = effectiveFilterDepth * effectiveFilterHeight * effectiveFilterWidth - 1;\n this.userCode = `\n const ivec3 pads = ivec3(${padFront}, ${padTop}, ${padLeft});\n\n void main() {\n ivec5 coords = getOutputCoords();\n int batch = coords.x;\n int ch = coords.u;\n\n ivec3 dyCorner = ivec3(coords.y, coords.z, coords.w) - pads;\n int dyDCorner = dyCorner.x;\n int dyRCorner = dyCorner.y;\n int dyCCorner = dyCorner.z;\n\n // Convolve dy(?, ?, ?, ch) with pos mask(:, :, :, d) to get\n // dx(xD, xR, xC, ch).\n // ? = to be determined. : = across all values in that axis.\n float dotProd = 0.0;\n\n for (int wD = 0; wD < ${effectiveFilterDepth};\n wD += ${dilationDepth}) {\n float dyD = float(dyDCorner + wD) / ${strideDepth}.0;\n\n if (dyD < 0.0 || dyD >= ${convInfo.outDepth}.0 || fract(dyD) > 0.0) {\n continue;\n }\n int idyD = int(dyD);\n\n for (int wR = 0; wR < ${effectiveFilterHeight};\n wR += ${dilationHeight}) {\n float dyR = float(dyRCorner + wR) / ${strideHeight}.0;\n\n if (dyR < 0.0 || dyR >= ${convInfo.outHeight}.0 ||\n fract(dyR) > 0.0) {\n continue;\n }\n int idyR = int(dyR);\n\n for (int wC = 0; wC < ${effectiveFilterWidth};\n wC += ${dilationWidth}) {\n float dyC = float(dyCCorner + wC) / ${strideWidth}.0;\n\n if (dyC < 0.0 || dyC >= ${convInfo.outWidth}.0 ||\n fract(dyC) > 0.0) {\n continue;\n }\n int idyC = int(dyC);\n\n float dyValue = getDy(batch, idyD, idyR, idyC, ch);\n int maxPosValue = ${lastIndex} -\n int(getMaxPos(batch, idyD, idyR, idyC, ch));\n\n // Get the current value, check it against the value from the\n // position matrix.\n int curPosValue =\n wD * ${effectiveFilterHeight} * ${effectiveFilterWidth} +\n wR * ${effectiveFilterWidth} + wC;\n float mask = float(maxPosValue == curPosValue ? 1.0 : 0.0);\n\n dotProd += dyValue * mask;\n }\n }\n }\n setOutput(dotProd);\n }\n `;\n }\n}\n//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibWF4X3Bvb2xfYmFja3Byb3BfZ3B1LmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vdGZqcy1iYWNrZW5kLXdlYmdsL3NyYy9tYXhfcG9vbF9iYWNrcHJvcF9ncHUudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUE7Ozs7Ozs7Ozs7Ozs7OztHQWVHO0FBS0gsTUFBTSxPQUFPLHdCQUF3QjtJQUtuQyxZQUFZLFFBQWlDO1FBSjdDLGtCQUFhLEdBQUcsQ0FBQyxJQUFJLEVBQUUsUUFBUSxDQUFDLENBQUM7UUFLL0IsSUFBSSxDQUFDLFdBQVcsR0FBRyxRQUFRLENBQUMsT0FBTyxDQUFDO1FBQ3BDLE1BQU0sWUFBWSxHQUFHLFFBQVEsQ0FBQyxZQUFZLENBQUM7UUFDM0MsTUFBTSxXQUFXLEdBQUcsUUFBUSxDQUFDLFdBQVcsQ0FBQztRQUN6QyxNQUFNLGNBQWMsR0FBRyxRQUFRLENBQUMsY0FBYyxDQUFDO1FBQy9DLE1BQU0scUJBQXFCLEdBQUcsUUFBUSxDQUFDLHFCQUFxQixDQUFDO1FBQzdELE1BQU0sb0JBQW9CLEdBQUcsUUFBUSxDQUFDLG9CQUFvQixDQUFDO1FBRTNELE1BQU0sTUFBTSxHQUFHLHFCQUFxQixHQUFHLENBQUMsR0FBRyxRQUFRLENBQUMsT0FBTyxDQUFDLEdBQUcsQ0FBQztRQUNoRSxNQUFNLE9BQU8sR0FBRyxvQkFBb0IsR0FBRyxDQUFDLEdBQUcsUUFBUSxDQUFDLE9BQU8sQ0FBQyxJQUFJLENBQUM7UUFFakUsTUFBTSxTQUFTLEdBQUcscUJBQXFCLEdBQUcsb0JBQW9CLEdBQUcsQ0FBQyxDQUFDO1FBQ25FLElBQUksQ0FBQyxRQUFRLEdBQUc7aUNBQ2EsTUFBTSxLQUFLLE9BQU87Ozs7Ozs7Ozs7Ozs7O2dDQWNuQixxQkFBcUI7a0JBQ25DLGNBQWM7Z0RBQ2dCLFlBQVk7O29DQUV4QixRQUFRLENBQUMsU0FBUzs7Ozs7a0NBS3BCLG9CQUFvQjtrREFDSixXQUFXOztzQ0FFdkIsUUFBUSxDQUFDLFFBQVE7Ozs7Ozs7Z0NBT3ZCLFNBQVM7Ozs7cUNBSUosb0JBQW9COzs7Ozs7OztLQVFwRCxDQUFDO0lBQ0osQ0FBQztDQUNGO0FBRUQsTUFBTSxPQUFPLHdCQUF3QjtJQUtuQyxZQUFZLFFBQWlDO1FBSjdDLGtCQUFhLEdBQUcsQ0FBQyxJQUFJLEVBQUUsUUFBUSxDQUFDLENBQUM7UUFLL0IsSUFBSSxDQUFDLFdBQVcsR0FBRyxRQUFRLENBQUMsT0FBTyxDQUFDO1FBQ3BDLE1BQU0sV0FBVyxHQUFHLFFBQVEsQ0FBQyxXQUFXLENBQUM7UUFDekMsTUFBTSxZQUFZLEdBQUcsUUFBUSxDQUFDLFlBQVksQ0FBQztRQUMzQyxNQUFNLFdBQVcsR0FBRyxRQUFRLENBQUMsV0FBVyxDQUFDO1FBQ3pDLE1BQU0sYUFBYSxHQUFHLFFBQVEsQ0FBQyxhQUFhLENBQUM7UUFDN0MsTUFBTSxjQUFjLEdBQUcsUUFBUSxDQUFDLGNBQWMsQ0FBQztRQUMvQyxNQUFNLGFBQWEsR0FBRyxRQUFRLENBQUMsYUFBYSxDQUFDO1FBQzdDLE1BQU0sb0JBQW9CLEdBQUcsUUFBUSxDQUFDLG9CQUFvQixDQUFDO1FBQzNELE1BQU0scUJBQXFCLEdBQUcsUUFBUSxDQUFDLHFCQUFxQixDQUFDO1FBQzdELE1BQU0sb0JBQW9CLEdBQUcsUUFBUSxDQUFDLG9CQUFvQixDQUFDO1FBRTNELE1BQU0sUUFBUSxHQUFHLG9CQUFvQixHQUFHLENBQUMsR0FBRyxRQUFRLENBQUMsT0FBTyxDQUFDLEtBQUssQ0FBQztRQUNuRSxNQUFNLE1BQU0sR0FBRyxxQkFBcUIsR0FBRyxDQUFDLEdBQUcsUUFBUSxDQUFDLE9BQU8sQ0FBQyxHQUFHLENBQUM7UUFDaEUsTUFBTSxPQUFPLEdBQUcsb0JBQW9CLEdBQUcsQ0FBQyxHQUFHLFFBQVEsQ0FBQyxPQUFPLENBQUMsSUFBSSxDQUFDO1FBRWpFLE1BQU0sU0FBUyxHQUNYLG9CQUFvQixHQUFHLHFCQUFxQixHQUFHLG9CQUFvQixHQUFHLENBQUMsQ0FBQztRQUM1RSxJQUFJLENBQUMsUUFBUSxHQUFHO2lDQUNhLFFBQVEsS0FBSyxNQUFNLEtBQUssT0FBTzs7Ozs7Ozs7Ozs7Ozs7Ozs7Z0NBaUJoQyxvQkFBb0I7bUJBQ2pDLGFBQWE7Z0RBQ2dCLFdBQVc7O29DQUV2QixRQUFRLENBQUMsUUFBUTs7Ozs7a0NBS25CLHFCQUFxQjtzQkFDakMsY0FBYztrREFDYyxZQUFZOztzQ0FFeEIsUUFBUSxDQUFDLFNBQVM7Ozs7OztvQ0FNcEIsb0JBQW9CO3dCQUNoQyxhQUFhO29EQUNlLFdBQVc7O3dDQUV2QixRQUFRLENBQUMsUUFBUTs7Ozs7OztrQ0FPdkIsU0FBUzs7Ozs7O3lCQU1sQixxQkFBcUIsTUFBTSxvQkFBb0I7eUJBQy9DLG9CQUFvQjs7Ozs7Ozs7O0tBU3hDLENBQUM7SUFDSixDQUFDO0NBQ0YiLCJzb3VyY2VzQ29udGVudCI6WyIvKipcbiAqIEBsaWNlbnNlXG4gKiBDb3B5cmlnaHQgMjAxNyBHb29nbGUgTExDLiBBbGwgUmlnaHRzIFJlc2VydmVkLlxuICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlIFwiTGljZW5zZVwiKTtcbiAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS5cbiAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdFxuICpcbiAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMFxuICpcbiAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmVcbiAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuIFwiQVMgSVNcIiBCQVNJUyxcbiAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLlxuICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZFxuICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuXG4gKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuICovXG5cbmltcG9ydCB7YmFja2VuZF91dGlsfSBmcm9tICdAdGVuc29yZmxvdy90ZmpzLWNvcmUnO1xuaW1wb3J0IHtHUEdQVVByb2dyYW19IGZyb20gJy4vZ3BncHVfbWF0aCc7XG5cbmV4cG9ydCBjbGFzcyBNYXhQb29sMkRCYWNrcHJvcFByb2dyYW0gaW1wbGVtZW50cyBHUEdQVVByb2dyYW0ge1xuICB2YXJpYWJsZU5hbWVzID0gWydkeScsICdtYXhQb3MnXTtcbiAgb3V0cHV0U2hhcGU6IG51bWJlcltdO1xuICB1c2VyQ29kZTogc3RyaW5nO1xuXG4gIGNvbnN0cnVjdG9yKGNvbnZJbmZvOiBiYWNrZW5kX3V0aWwuQ29udjJESW5mbykge1xuICAgIHRoaXMub3V0cHV0U2hhcGUgPSBjb252SW5mby5pblNoYXBlO1xuICAgIGNvbnN0IHN0cmlkZUhlaWdodCA9IGNvbnZJbmZvLnN0cmlkZUhlaWdodDtcbiAgICBjb25zdCBzdHJpZGVXaWR0aCA9IGNvbnZJbmZvLnN0cmlkZVdpZHRoO1xuICAgIGNvbnN0IGRpbGF0aW9uSGVpZ2h0ID0gY29udkluZm8uZGlsYXRpb25IZWlnaHQ7XG4gICAgY29uc3QgZWZmZWN0aXZlRmlsdGVySGVpZ2h0ID0gY29udkluZm8uZWZmZWN0aXZlRmlsdGVySGVpZ2h0O1xuICAgIGNvbnN0IGVmZmVjdGl2ZUZpbHRlcldpZHRoID0gY29udkluZm8uZWZmZWN0aXZlRmlsdGVyV2lkdGg7XG5cbiAgICBjb25zdCBwYWRUb3AgPSBlZmZlY3RpdmVGaWx0ZXJIZWlnaHQgLSAxIC0gY29udkluZm8ucGFkSW5mby50b3A7XG4gICAgY29uc3QgcGFkTGVmdCA9IGVmZmVjdGl2ZUZpbHRlcldpZHRoIC0gMSAtIGNvbnZJbmZvLnBhZEluZm8ubGVmdDtcblxuICAgIGNvbnN0IGxhc3RJbmRleCA9IGVmZmVjdGl2ZUZpbHRlckhlaWdodCAqIGVmZmVjdGl2ZUZpbHRlcldpZHRoIC0gMTtcbiAgICB0aGlzLnVzZXJDb2RlID0gYFxuICAgICAgY29uc3QgaXZlYzIgcGFkcyA9IGl2ZWMyKCR7cGFkVG9wfSwgJHtwYWRMZWZ0fSk7XG5cbiAgICAgIHZvaWQgbWFpbigpIHtcbiAgICAgICAgaXZlYzQgY29vcmRzID0gZ2V0T3V0cHV0Q29vcmRzKCk7XG4gICAgICAgIGludCBiID0gY29vcmRzWzBdO1xuICAgICAgICBpbnQgZCA9IGNvb3Jkc1szXTtcblxuICAgICAgICBpdmVjMiBkeVJDQ29ybmVyID0gY29vcmRzLnl6IC0gcGFkcztcbiAgICAgICAgaW50IGR5UkNvcm5lciA9IGR5UkNDb3JuZXIueDtcbiAgICAgICAgaW50IGR5Q0Nvcm5lciA9IGR5UkNDb3JuZXIueTtcblxuICAgICAgICAvLyBDb252b2x2ZSBkeSg/LCA/LCBkKSB3aXRoIHBvcyBtYXNrKDosIDosIGQpIHRvIGdldCBkeCh4UiwgeEMsIGQpLlxuICAgICAgICAvLyA/ID0gdG8gYmUgZGV0ZXJtaW5lZC4gOiA9IGFjcm9zcyBhbGwgdmFsdWVzIGluIHRoYXQgYXhpcy5cbiAgICAgICAgZmxvYXQgZG90UHJvZCA9IDAuMDtcbiAgICAgICAgZm9yIChpbnQgd1IgPSAwOyB3UiA8ICR7ZWZmZWN0aXZlRmlsdGVySGVpZ2h0fTtcbiAgICAgICAgICB3UiArPSAke2RpbGF0aW9uSGVpZ2h0fSkge1xuICAgICAgICAgIGZsb2F0IGR5UiA9IGZsb2F0KGR5UkNvcm5lciArIHdSKSAvICR7c3RyaWRlSGVpZ2h0fS4wO1xuXG4gICAgICAgICAgaWYgKGR5UiA8IDAuMCB8fCBkeVIgPj0gJHtjb252SW5mby5vdXRIZWlnaHR9LjAgfHwgZnJhY3QoZHlSKSA+IDAuMCkge1xuICAgICAgICAgICAgY29udGludWU7XG4gICAgICAgICAgfVxuICAgICAgICAgIGludCBpZHlSID0gaW50KGR5Uik7XG5cbiAgICAgICAgICBmb3IgKGludCB3QyA9IDA7IHdDIDwgJHtlZmZlY3RpdmVGaWx0ZXJXaWR0aH07IHdDKyspIHtcbiAgICAgICAgICAgIGZsb2F0IGR5QyA9IGZsb2F0KGR5Q0Nvcm5lciArIHdDKSAvICR7c3RyaWRlV2lkdGh9LjA7XG5cbiAgICAgICAgICAgIGlmIChkeUMgPCAwLjAgfHwgZHlDID49ICR7Y29udkluZm8ub3V0V2lkdGh9LjAgfHxcbiAgICAgICAgICAgICAgICBmcmFjdChkeUMpID4gMC4wKSB7XG4gICAgICAgICAgICAgIGNvbnRpbnVlO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgaW50IGlkeUMgPSBpbnQoZHlDKTtcblxuICAgICAgICAgICAgZmxvYXQgZHlWYWx1ZSA9IGdldER5KGIsIGlkeVIsIGlkeUMsIGQpO1xuICAgICAgICAgICAgaW50IG1heFBvc1ZhbHVlID0gJHtsYXN0SW5kZXh9IC0gaW50KGdldE1heFBvcyhiLCBpZHlSLCBpZHlDLCBkKSk7XG5cbiAgICAgICAgICAgIC8vIEdldCB0aGUgY3VycmVudCB2YWx1ZSwgY2hlY2sgaXQgYWdhaW5zdCB0aGUgdmFsdWUgZnJvbSB0aGVcbiAgICAgICAgICAgIC8vIHBvc2l0aW9uIG1hdHJpeC5cbiAgICAgICAgICAgIGludCBjdXJQb3NWYWx1ZSA9IHdSICogJHtlZmZlY3RpdmVGaWx0ZXJXaWR0aH0gKyB3QztcbiAgICAgICAgICAgIGZsb2F0IG1hc2sgPSBmbG9hdChtYXhQb3NWYWx1ZSA9PSBjdXJQb3NWYWx1ZSA/IDEuMCA6IDAuMCk7XG5cbiAgICAgICAgICAgIGRvdFByb2QgKz0gZHlWYWx1ZSAqIG1hc2s7XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIHNldE91dHB1dChkb3RQcm9kKTtcbiAgICAgIH1cbiAgICBgO1xuICB9XG59XG5cbmV4cG9ydCBjbGFzcyBNYXhQb29sM0RCYWNrcHJvcFByb2dyYW0gaW1wbGVtZW50cyBHUEdQVVByb2dyYW0ge1xuICB2YXJpYWJsZU5hbWVzID0gWydkeScsICdtYXhQb3MnXTtcbiAgb3V0cHV0U2hhcGU6IG51bWJlcltdO1xuICB1c2VyQ29kZTogc3RyaW5nO1xuXG4gIGNvbnN0cnVjdG9yKGNvbnZJbmZvOiBiYWNrZW5kX3V0aWwuQ29udjNESW5mbykge1xuICAgIHRoaXMub3V0cHV0U2hhcGUgPSBjb252SW5mby5pblNoYXBlO1xuICAgIGNvbnN0IHN0cmlkZURlcHRoID0gY29udkluZm8uc3RyaWRlRGVwdGg7XG4gICAgY29uc3Qgc3RyaWRlSGVpZ2h0ID0gY29udkluZm8uc3RyaWRlSGVpZ2h0O1xuICAgIGNvbnN0IHN0cmlkZVdpZHRoID0gY29udkluZm8uc3RyaWRlV2lkdGg7XG4gICAgY29uc3QgZGlsYXRpb25EZXB0aCA9IGNvbnZJbmZvLmRpbGF0aW9uRGVwdGg7XG4gICAgY29uc3QgZGlsYXRpb25IZWlnaHQgPSBjb252SW5mby5kaWxhdGlvbkhlaWdodDtcbiAgICBjb25zdCBkaWxhdGlvbldpZHRoID0gY29udkluZm8uZGlsYXRpb25XaWR0aDtcbiAgICBjb25zdCBlZmZlY3RpdmVGaWx0ZXJEZXB0aCA9IGNvbnZJbmZvLmVmZmVjdGl2ZUZpbHRlckRlcHRoO1xuICAgIGNvbnN0IGVmZmVjdGl2ZUZpbHRlckhlaWdodCA9IGNvbnZJbmZvLmVmZmVjdGl2ZUZpbHRlckhlaWdodDtcbiAgICBjb25zdCBlZmZlY3RpdmVGaWx0ZXJXaWR0aCA9IGNvbnZJbmZvLmVmZmVjdGl2ZUZpbHRlcldpZHRoO1xuXG4gICAgY29uc3QgcGFkRnJvbnQgPSBlZmZlY3RpdmVGaWx0ZXJEZXB0aCAtIDEgLSBjb252SW5mby5wYWRJbmZvLmZyb250O1xuICAgIGNvbnN0IHBhZFRvcCA9IGVmZmVjdGl2ZUZpbHRlckhlaWdodCAtIDEgLSBjb252SW5mby5wYWRJbmZvLnRvcDtcbiAgICBjb25zdCBwYWRMZWZ0ID0gZWZmZWN0aXZlRmlsdGVyV2lkdGggLSAxIC0gY29udkluZm8ucGFkSW5mby5sZWZ0O1xuXG4gICAgY29uc3QgbGFzdEluZGV4ID1cbiAgICAgICAgZWZmZWN0aXZlRmlsdGVyRGVwdGggKiBlZmZlY3RpdmVGaWx0ZXJIZWlnaHQgKiBlZmZlY3RpdmVGaWx0ZXJXaWR0aCAtIDE7XG4gICAgdGhpcy51c2VyQ29kZSA9IGBcbiAgICAgIGNvbnN0IGl2ZWMzIHBhZHMgPSBpdmVjMygke3BhZEZyb250fSwgJHtwYWRUb3B9LCAke3BhZExlZnR9KTtcblxuICAgICAgdm9pZCBtYWluKCkge1xuICAgICAgICBpdmVjNSBjb29yZHMgPSBnZXRPdXRwdXRDb29yZHMoKTtcbiAgICAgICAgaW50IGJhdGNoID0gY29vcmRzLng7XG4gICAgICAgIGludCBjaCA9IGNvb3Jkcy51O1xuXG4gICAgICAgIGl2ZWMzIGR5Q29ybmVyID0gaXZlYzMoY29vcmRzLnksIGNvb3Jkcy56LCBjb29yZHMudykgLSBwYWRzO1xuICAgICAgICBpbnQgZHlEQ29ybmVyID0gZHlDb3JuZXIueDtcbiAgICAgICAgaW50IGR5UkNvcm5lciA9IGR5Q29ybmVyLnk7XG4gICAgICAgIGludCBkeUNDb3JuZXIgPSBkeUNvcm5lci56O1xuXG4gICAgICAgIC8vIENvbnZvbHZlIGR5KD8sID8sID8sIGNoKSB3aXRoIHBvcyBtYXNrKDosIDosIDosIGQpIHRvIGdldFxuICAgICAgICAvLyBkeCh4RCwgeFIsIHhDLCBjaCkuXG4gICAgICAgIC8vID8gPSB0byBiZSBkZXRlcm1pbmVkLiA6ID0gYWNyb3NzIGFsbCB2YWx1ZXMgaW4gdGhhdCBheGlzLlxuICAgICAgICBmbG9hdCBkb3RQcm9kID0gMC4wO1xuXG4gICAgICAgIGZvciAoaW50IHdEID0gMDsgd0QgPCAke2VmZmVjdGl2ZUZpbHRlckRlcHRofTtcbiAgICAgICAgICAgd0QgKz0gJHtkaWxhdGlvbkRlcHRofSkge1xuICAgICAgICAgIGZsb2F0IGR5RCA9IGZsb2F0KGR5RENvcm5lciArIHdEKSAvICR7c3RyaWRlRGVwdGh9LjA7XG5cbiAgICAgICAgICBpZiAoZHlEIDwgMC4wIHx8IGR5RCA+PSAke2NvbnZJbmZvLm91dERlcHRofS4wIHx8IGZyYWN0KGR5RCkgPiAwLjApIHtcbiAgICAgICAgICAgIGNvbnRpbnVlO1xuICAgICAgICAgIH1cbiAgICAgICAgICBpbnQgaWR5RCA9IGludChkeUQpO1xuXG4gICAgICAgICAgZm9yIChpbnQgd1IgPSAwOyB3UiA8ICR7ZWZmZWN0aXZlRmlsdGVySGVpZ2h0fTtcbiAgICAgICAgICAgICAgd1IgKz0gJHtkaWxhdGlvbkhlaWdodH0pIHtcbiAgICAgICAgICAgIGZsb2F0IGR5UiA9IGZsb2F0KGR5UkNvcm5lciArIHdSKSAvICR7c3RyaWRlSGVpZ2h0fS4wO1xuXG4gICAgICAgICAgICBpZiAoZHlSIDwgMC4wIHx8IGR5UiA+PSAke2NvbnZJbmZvLm91dEhlaWdodH0uMCB8fFxuICAgICAgICAgICAgICAgIGZyYWN0KGR5UikgPiAwLjApIHtcbiAgICAgICAgICAgICAgY29udGludWU7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBpbnQgaWR5UiA9IGludChkeVIpO1xuXG4gICAgICAgICAgICBmb3IgKGludCB3QyA9IDA7IHdDIDwgJHtlZmZlY3RpdmVGaWx0ZXJXaWR0aH07XG4gICAgICAgICAgICAgICAgd0MgKz0gJHtkaWxhdGlvbldpZHRofSkge1xuICAgICAgICAgICAgICBmbG9hdCBkeUMgPSBmbG9hdChkeUNDb3JuZXIgKyB3QykgLyAke3N0cmlkZVdpZHRofS4wO1xuXG4gICAgICAgICAgICAgIGlmIChkeUMgPCAwLjAgfHwgZHlDID49ICR7Y29udkluZm8ub3V0V2lkdGh9LjAgfHxcbiAgICAgICAgICAgICAgICAgIGZyYWN0KGR5QykgPiAwLjApIHtcbiAgICAgICAgICAgICAgICBjb250aW51ZTtcbiAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICBpbnQgaWR5QyA9IGludChkeUMpO1xuXG4gICAgICAgICAgICAgIGZsb2F0IGR5VmFsdWUgPSBnZXREeShiYXRjaCwgaWR5RCwgaWR5UiwgaWR5QywgY2gpO1xuICAgICAgICAgICAgICBpbnQgbWF4UG9zVmFsdWUgPSAke2xhc3RJbmRleH0gLVxuICAgICAgICAgICAgICAgICAgaW50KGdldE1heFBvcyhiYXRjaCwgaWR5RCwgaWR5UiwgaWR5QywgY2gpKTtcblxuICAgICAgICAgICAgICAvLyBHZXQgdGhlIGN1cnJlbnQgdmFsdWUsIGNoZWNrIGl0IGFnYWluc3QgdGhlIHZhbHVlIGZyb20gdGhlXG4gICAgICAgICAgICAgIC8vIHBvc2l0aW9uIG1hdHJpeC5cbiAgICAgICAgICAgICAgaW50IGN1clBvc1ZhbHVlID1cbiAgICAgICAgICAgICAgICAgIHdEICogJHtlZmZlY3RpdmVGaWx0ZXJIZWlnaHR9ICogJHtlZmZlY3RpdmVGaWx0ZXJXaWR0aH0gK1xuICAgICAgICAgICAgICAgICAgd1IgKiAke2VmZmVjdGl2ZUZpbHRlcldpZHRofSArIHdDO1xuICAgICAgICAgICAgICBmbG9hdCBtYXNrID0gZmxvYXQobWF4UG9zVmFsdWUgPT0gY3VyUG9zVmFsdWUgPyAxLjAgOiAwLjApO1xuXG4gICAgICAgICAgICAgIGRvdFByb2QgKz0gZHlWYWx1ZSAqIG1hc2s7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIHNldE91dHB1dChkb3RQcm9kKTtcbiAgICAgIH1cbiAgICBgO1xuICB9XG59XG4iXX0=","/**\n * @license\n * Copyright 2020 Google LLC. All Rights Reserved.\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n * =============================================================================\n */\nimport { backend_util, MaxPool3DGrad } from '@tensorflow/tfjs-core';\nimport { MaxPool3DBackpropProgram } from '../max_pool_backprop_gpu';\nimport { Pool3DProgram } from '../pool_gpu';\nexport function maxPool3DGrad(args) {\n const { inputs, backend, attrs } = args;\n const { dy, input } = inputs;\n const x = input;\n const { filterSize, strides, pad, dimRoundingMode } = attrs;\n const dilations = [1, 1, 1];\n const convInfo = backend_util.computePool3DInfo(x.shape, filterSize, strides, dilations, pad, dimRoundingMode);\n const maxPool3dPositionsProgram = new Pool3DProgram(convInfo, 'max', true /* get positions */);\n const maxPool3dPositions = backend.runWebGLProgram(maxPool3dPositionsProgram, [x], x.dtype);\n const maxPoolBackpropProgram = new MaxPool3DBackpropProgram(convInfo);\n const result = backend.runWebGLProgram(maxPoolBackpropProgram, [dy, maxPool3dPositions], x.dtype);\n backend.disposeIntermediateTensorInfo(maxPool3dPositions);\n return result;\n}\nexport const maxPool3DGradConfig = {\n kernelName: MaxPool3DGrad,\n backendName: 'webgl',\n kernelFunc: maxPool3DGrad\n};\n//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiTWF4UG9vbDNER3JhZC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uLy4uL3RmanMtYmFja2VuZC13ZWJnbC9zcmMva2VybmVscy9NYXhQb29sM0RHcmFkLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBOzs7Ozs7Ozs7Ozs7Ozs7R0FlRztBQUNILE9BQU8sRUFBQyxZQUFZLEVBQTRCLGFBQWEsRUFBc0QsTUFBTSx1QkFBdUIsQ0FBQztBQUdqSixPQUFPLEVBQUMsd0JBQXdCLEVBQUMsTUFBTSwwQkFBMEIsQ0FBQztBQUNsRSxPQUFPLEVBQUMsYUFBYSxFQUFDLE1BQU0sYUFBYSxDQUFDO0FBRTFDLE1BQU0sVUFBVSxhQUFhLENBQUMsSUFJN0I7SUFDQyxNQUFNLEVBQUMsTUFBTSxFQUFFLE9BQU8sRUFBRSxLQUFLLEVBQUMsR0FBRyxJQUFJLENBQUM7SUFDdEMsTUFBTSxFQUFDLEVBQUUsRUFBRSxLQUFLLEVBQUMsR0FBRyxNQUFNLENBQUM7SUFDM0IsTUFBTSxDQUFDLEdBQUcsS0FBSyxDQUFDO0lBQ2hCLE1BQU0sRUFBQyxVQUFVLEVBQUUsT0FBTyxFQUFFLEdBQUcsRUFBRSxlQUFlLEVBQUMsR0FBRyxLQUFLLENBQUM7SUFDMUQsTUFBTSxTQUFTLEdBQTZCLENBQUMsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQztJQUV0RCxNQUFNLFFBQVEsR0FBRyxZQUFZLENBQUMsaUJBQWlCLENBQzNDLENBQUMsQ0FBQyxLQUFpRCxFQUFFLFVBQVUsRUFBRSxPQUFPLEVBQ3hFLFNBQVMsRUFBRSxHQUFHLEVBQUUsZUFBZSxDQUFDLENBQUM7SUFFckMsTUFBTSx5QkFBeUIsR0FDM0IsSUFBSSxhQUFhLENBQUMsUUFBUSxFQUFFLEtBQUssRUFBRSxJQUFJLENBQUMsbUJBQW1CLENBQUMsQ0FBQztJQUNqRSxNQUFNLGtCQUFrQixHQUNwQixPQUFPLENBQUMsZUFBZSxDQUFDLHlCQUF5QixFQUFFLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLEtBQUssQ0FBQyxDQUFDO0lBQ3JFLE1BQU0sc0JBQXNCLEdBQUcsSUFBSSx3QkFBd0IsQ0FBQyxRQUFRLENBQUMsQ0FBQztJQUN0RSxNQUFNLE1BQU0sR0FBRyxPQUFPLENBQUMsZUFBZSxDQUNsQyxzQkFBc0IsRUFBRSxDQUFDLEVBQUUsRUFBRSxrQkFBa0IsQ0FBQyxFQUFFLENBQUMsQ0FBQyxLQUFLLENBQUMsQ0FBQztJQUMvRCxPQUFPLENBQUMsNkJBQTZCLENBQUMsa0JBQWtCLENBQUMsQ0FBQztJQUMxRCxPQUFPLE1BQU0sQ0FBQztBQUNoQixDQUFDO0FBRUQsTUFBTSxDQUFDLE1BQU0sbUJBQW1CLEdBQWlCO0lBQy9DLFVBQVUsRUFBRSxhQUFhO0lBQ3pCLFdBQVcsRUFBRSxPQUFPO0lBQ3BCLFVBQVUsRUFBRSxhQUFpQztDQUM5QyxDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiLyoqXG4gKiBAbGljZW5zZVxuICogQ29weXJpZ2h0IDIwMjAgR29vZ2xlIExMQy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC5cbiAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSBcIkxpY2Vuc2VcIik7XG4gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuXG4gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXRcbiAqXG4gKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjBcbiAqXG4gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlXG4gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiBcIkFTIElTXCIgQkFTSVMsXG4gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC5cbiAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmRcbiAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLlxuICogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbiAqL1xuaW1wb3J0IHtiYWNrZW5kX3V0aWwsIEtlcm5lbENvbmZpZywgS2VybmVsRnVuYywgTWF4UG9vbDNER3JhZCwgTWF4UG9vbDNER3JhZEF0dHJzLCBNYXhQb29sM0RHcmFkSW5wdXRzLCBUZW5zb3JJbmZvfSBmcm9tICdAdGVuc29yZmxvdy90ZmpzLWNvcmUnO1xuXG5pbXBvcnQge01hdGhCYWNrZW5kV2ViR0x9IGZyb20gJy4uL2JhY2tlbmRfd2ViZ2wnO1xuaW1wb3J0IHtNYXhQb29sM0RCYWNrcHJvcFByb2dyYW19IGZyb20gJy4uL21heF9wb29sX2JhY2twcm9wX2dwdSc7XG5pbXBvcnQge1Bvb2wzRFByb2dyYW19IGZyb20gJy4uL3Bvb2xfZ3B1JztcblxuZXhwb3J0IGZ1bmN0aW9uIG1heFBvb2wzREdyYWQoYXJnczoge1xuICBpbnB1dHM6IE1heFBvb2wzREdyYWRJbnB1dHMsXG4gIGJhY2tlbmQ6IE1hdGhCYWNrZW5kV2ViR0wsXG4gIGF0dHJzOiBNYXhQb29sM0RHcmFkQXR0cnNcbn0pOiBUZW5zb3JJbmZvIHtcbiAgY29uc3Qge2lucHV0cywgYmFja2VuZCwgYXR0cnN9ID0gYXJncztcbiAgY29uc3Qge2R5LCBpbnB1dH0gPSBpbnB1dHM7XG4gIGNvbnN0IHggPSBpbnB1dDtcbiAgY29uc3Qge2ZpbHRlclNpemUsIHN0cmlkZXMsIHBhZCwgZGltUm91bmRpbmdNb2RlfSA9IGF0dHJzO1xuICBjb25zdCBkaWxhdGlvbnM6IFtudW1iZXIsIG51bWJlciwgbnVtYmVyXSA9IFsxLCAxLCAxXTtcblxuICBjb25zdCBjb252SW5mbyA9IGJhY2tlbmRfdXRpbC5jb21wdXRlUG9vbDNESW5mbyhcbiAgICAgIHguc2hhcGUgYXMgW251bWJlciwgbnVtYmVyLCBudW1iZXIsIG51bWJlciwgbnVtYmVyXSwgZmlsdGVyU2l6ZSwgc3RyaWRlcyxcbiAgICAgIGRpbGF0aW9ucywgcGFkLCBkaW1Sb3VuZGluZ01vZGUpO1xuXG4gIGNvbnN0IG1heFBvb2wzZFBvc2l0aW9uc1Byb2dyYW0gPVxuICAgICAgbmV3IFBvb2wzRFByb2dyYW0oY29udkluZm8sICdtYXgnLCB0cnVlIC8qIGdldCBwb3NpdGlvbnMgKi8pO1xuICBjb25zdCBtYXhQb29sM2RQb3NpdGlvbnMgPVxuICAgICAgYmFja2VuZC5ydW5XZWJHTFByb2dyYW0obWF4UG9vbDNkUG9zaXRpb25zUHJvZ3JhbSwgW3hdLCB4LmR0eXBlKTtcbiAgY29uc3QgbWF4UG9vbEJhY2twcm9wUHJvZ3JhbSA9IG5ldyBNYXhQb29sM0RCYWNrcHJvcFByb2dyYW0oY29udkluZm8pO1xuICBjb25zdCByZXN1bHQgPSBiYWNrZW5kLnJ1bldlYkdMUHJvZ3JhbShcbiAgICAgIG1heFBvb2xCYWNrcHJvcFByb2dyYW0sIFtkeSwgbWF4UG9vbDNkUG9zaXRpb25zXSwgeC5kdHlwZSk7XG4gIGJhY2tlbmQuZGlzcG9zZUludGVybWVkaWF0ZVRlbnNvckluZm8obWF4UG9vbDNkUG9zaXRpb25zKTtcbiAgcmV0dXJuIHJlc3VsdDtcbn1cblxuZXhwb3J0IGNvbnN0IG1heFBvb2wzREdyYWRDb25maWc6IEtlcm5lbENvbmZpZyA9IHtcbiAga2VybmVsTmFtZTogTWF4UG9vbDNER3JhZCxcbiAgYmFja2VuZE5hbWU6ICd3ZWJnbCcsXG4gIGtlcm5lbEZ1bmM6IG1heFBvb2wzREdyYWQgYXMge30gYXMgS2VybmVsRnVuY1xufTtcbiJdfQ==","/**\n * @license\n * Copyright 2020 Google LLC. All Rights Reserved.\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n * =============================================================================\n */\nimport { backend_util, MaxPoolGrad } from '@tensorflow/tfjs-core';\nimport { MaxPool2DBackpropProgram } from '../max_pool_backprop_gpu';\nimport { Pool2DProgram } from '../pool_gpu';\nimport { assertNotComplex } from '../webgl_util';\nexport function maxPoolGrad(args) {\n const { inputs, backend, attrs } = args;\n const { dy, input, output } = inputs;\n const x = input;\n assertNotComplex([input, output], 'maxPoolGrad');\n const { filterSize, strides, pad, dimRoundingMode } = attrs;\n const convInfo = backend_util.computePool2DInfo(x.shape, filterSize, strides, 1 /* dilations */, pad, dimRoundingMode);\n const getPositions = true;\n const maxPoolPositionsProgram = new Pool2DProgram(convInfo, 'max', getPositions);\n const maxPoolPositions = backend.runWebGLProgram(maxPoolPositionsProgram, [x], x.dtype);\n const maxPoolBackPropProgram = new MaxPool2DBackpropProgram(convInfo);\n const result = backend.runWebGLProgram(maxPoolBackPropProgram, [dy, maxPoolPositions], x.dtype);\n backend.disposeIntermediateTensorInfo(maxPoolPositions);\n return result;\n}\nexport const maxPoolGradConfig = {\n kernelName: MaxPoolGrad,\n backendName: 'webgl',\n kernelFunc: maxPoolGrad\n};\n//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiTWF4UG9vbEdyYWQuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi8uLi90ZmpzLWJhY2tlbmQtd2ViZ2wvc3JjL2tlcm5lbHMvTWF4UG9vbEdyYWQudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUE7Ozs7Ozs7Ozs7Ozs7OztHQWVHO0FBQ0gsT0FBTyxFQUFDLFlBQVksRUFBNEIsV0FBVyxFQUFrRCxNQUFNLHVCQUF1QixDQUFDO0FBRzNJLE9BQU8sRUFBQyx3QkFBd0IsRUFBQyxNQUFNLDBCQUEwQixDQUFDO0FBQ2xFLE9BQU8sRUFBQyxhQUFhLEVBQUMsTUFBTSxhQUFhLENBQUM7QUFDMUMsT0FBTyxFQUFDLGdCQUFnQixFQUFDLE1BQU0sZUFBZSxDQUFDO0FBRS9DLE1BQU0sVUFBVSxXQUFXLENBQUMsSUFJM0I7SUFDQyxNQUFNLEVBQUMsTUFBTSxFQUFFLE9BQU8sRUFBRSxLQUFLLEVBQUMsR0FBRyxJQUFJLENBQUM7SUFDdEMsTUFBTSxFQUFDLEVBQUUsRUFBRSxLQUFLLEVBQUUsTUFBTSxFQUFDLEdBQUcsTUFBTSxDQUFDO0lBQ25DLE1BQU0sQ0FBQyxHQUFHLEtBQUssQ0FBQztJQUNoQixnQkFBZ0IsQ0FBQyxDQUFDLEtBQUssRUFBRSxNQUFNLENBQUMsRUFBRSxhQUFhLENBQUMsQ0FBQztJQUNqRCxNQUFNLEVBQUMsVUFBVSxFQUFFLE9BQU8sRUFBRSxHQUFHLEVBQUUsZUFBZSxFQUFDLEdBQUcsS0FBSyxDQUFDO0lBRTFELE1BQU0sUUFBUSxHQUFHLFlBQVksQ0FBQyxpQkFBaUIsQ0FDM0MsQ0FBQyxDQUFDLEtBQXlDLEVBQUUsVUFBVSxFQUFFLE9BQU8sRUFDaEUsQ0FBQyxDQUFDLGVBQWUsRUFBRSxHQUFHLEVBQUUsZUFBZSxDQUFDLENBQUM7SUFDN0MsTUFBTSxZQUFZLEdBQUcsSUFBSSxDQUFDO0lBQzFCLE1BQU0sdUJBQXVCLEdBQ3pCLElBQUksYUFBYSxDQUFDLFFBQVEsRUFBRSxLQUFLLEVBQUUsWUFBWSxDQUFDLENBQUM7SUFDckQsTUFBTSxnQkFBZ0IsR0FDbEIsT0FBTyxDQUFDLGVBQWUsQ0FBQyx1QkFBdUIsRUFBRSxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxLQUFLLENBQUMsQ0FBQztJQUVuRSxNQUFNLHNCQUFzQixHQUFHLElBQUksd0JBQXdCLENBQUMsUUFBUSxDQUFDLENBQUM7SUFDdEUsTUFBTSxNQUFNLEdBQUcsT0FBTyxDQUFDLGVBQWUsQ0FDbEMsc0JBQXNCLEVBQUUsQ0FBQyxFQUFFLEVBQUUsZ0JBQWdCLENBQUMsRUFBRSxDQUFDLENBQUMsS0FBSyxDQUFDLENBQUM7SUFDN0QsT0FBTyxDQUFDLDZCQUE2QixDQUFDLGdCQUFnQixDQUFDLENBQUM7SUFDeEQsT0FBTyxNQUFNLENBQUM7QUFDaEIsQ0FBQztBQUVELE1BQU0sQ0FBQyxNQUFNLGlCQUFpQixHQUFpQjtJQUM3QyxVQUFVLEVBQUUsV0FBVztJQUN2QixXQUFXLEVBQUUsT0FBTztJQUNwQixVQUFVLEVBQUUsV0FBK0I7Q0FDNUMsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbIi8qKlxuICogQGxpY2Vuc2VcbiAqIENvcHlyaWdodCAyMDIwIEdvb2dsZSBMTEMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuXG4gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgXCJMaWNlbnNlXCIpO1xuICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLlxuICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0XG4gKlxuICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wXG4gKlxuICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZVxuICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gXCJBUyBJU1wiIEJBU0lTLFxuICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuXG4gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kXG4gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS5cbiAqID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4gKi9cbmltcG9ydCB7YmFja2VuZF91dGlsLCBLZXJuZWxDb25maWcsIEtlcm5lbEZ1bmMsIE1heFBvb2xHcmFkLCBNYXhQb29sR3JhZEF0dHJzLCBNYXhQb29sR3JhZElucHV0cywgVGVuc29ySW5mb30gZnJvbSAnQHRlbnNvcmZsb3cvdGZqcy1jb3JlJztcblxuaW1wb3J0IHtNYXRoQmFja2VuZFdlYkdMfSBmcm9tICcuLi9iYWNrZW5kX3dlYmdsJztcbmltcG9ydCB7TWF4UG9vbDJEQmFja3Byb3BQcm9ncmFtfSBmcm9tICcuLi9tYXhfcG9vbF9iYWNrcHJvcF9ncHUnO1xuaW1wb3J0IHtQb29sMkRQcm9ncmFtfSBmcm9tICcuLi9wb29sX2dwdSc7XG5pbXBvcnQge2Fzc2VydE5vdENvbXBsZXh9IGZyb20gJy4uL3dlYmdsX3V0aWwnO1xuXG5leHBvcnQgZnVuY3Rpb24gbWF4UG9vbEdyYWQoYXJnczoge1xuICBpbnB1dHM6IE1heFBvb2xHcmFkSW5wdXRzLFxuICBiYWNrZW5kOiBNYXRoQmFja2VuZFdlYkdMLFxuICBhdHRyczogTWF4UG9vbEdyYWRBdHRyc1xufSk6IFRlbnNvckluZm8ge1xuICBjb25zdCB7aW5wdXRzLCBiYWNrZW5kLCBhdHRyc30gPSBhcmdzO1xuICBjb25zdCB7ZHksIGlucHV0LCBvdXRwdXR9ID0gaW5wdXRzO1xuICBjb25zdCB4ID0gaW5wdXQ7XG4gIGFzc2VydE5vdENvbXBsZXgoW2lucHV0LCBvdXRwdXRdLCAnbWF4UG9vbEdyYWQnKTtcbiAgY29uc3Qge2ZpbHRlclNpemUsIHN0cmlkZXMsIHBhZCwgZGltUm91bmRpbmdNb2RlfSA9IGF0dHJzO1xuXG4gIGNvbnN0IGNvbnZJbmZvID0gYmFja2VuZF91dGlsLmNvbXB1dGVQb29sMkRJbmZvKFxuICAgICAgeC5zaGFwZSBhcyBbbnVtYmVyLCBudW1iZXIsIG51bWJlciwgbnVtYmVyXSwgZmlsdGVyU2l6ZSwgc3RyaWRlcyxcbiAgICAgIDEgLyogZGlsYXRpb25zICovLCBwYWQsIGRpbVJvdW5kaW5nTW9kZSk7XG4gIGNvbnN0IGdldFBvc2l0aW9ucyA9IHRydWU7XG4gIGNvbnN0IG1heFBvb2xQb3NpdGlvbnNQcm9ncmFtID1cbiAgICAgIG5ldyBQb29sMkRQcm9ncmFtKGNvbnZJbmZvLCAnbWF4JywgZ2V0UG9zaXRpb25zKTtcbiAgY29uc3QgbWF4UG9vbFBvc2l0aW9uczogVGVuc29ySW5mbyA9XG4gICAgICBiYWNrZW5kLnJ1bldlYkdMUHJvZ3JhbShtYXhQb29sUG9zaXRpb25zUHJvZ3JhbSwgW3hdLCB4LmR0eXBlKTtcblxuICBjb25zdCBtYXhQb29sQmFja1Byb3BQcm9ncmFtID0gbmV3IE1heFBvb2wyREJhY2twcm9wUHJvZ3JhbShjb252SW5mbyk7XG4gIGNvbnN0IHJlc3VsdCA9IGJhY2tlbmQucnVuV2ViR0xQcm9ncmFtKFxuICAgICAgbWF4UG9vbEJhY2tQcm9wUHJvZ3JhbSwgW2R5LCBtYXhQb29sUG9zaXRpb25zXSwgeC5kdHlwZSk7XG4gIGJhY2tlbmQuZGlzcG9zZUludGVybWVkaWF0ZVRlbnNvckluZm8obWF4UG9vbFBvc2l0aW9ucyk7XG4gIHJldHVybiByZXN1bHQ7XG59XG5cbmV4cG9ydCBjb25zdCBtYXhQb29sR3JhZENvbmZpZzogS2VybmVsQ29uZmlnID0ge1xuICBrZXJuZWxOYW1lOiBNYXhQb29sR3JhZCxcbiAgYmFja2VuZE5hbWU6ICd3ZWJnbCcsXG4gIGtlcm5lbEZ1bmM6IG1heFBvb2xHcmFkIGFzIHt9IGFzIEtlcm5lbEZ1bmNcbn07XG4iXX0=","/**\n * @license\n * Copyright 2020 Google LLC. All Rights Reserved.\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n * =============================================================================\n */\nimport { MaxPoolWithArgmax } from '@tensorflow/tfjs-core';\nimport { backend_util, util } from '@tensorflow/tfjs-core';\nimport { maxPoolWithArgmaxImpl } from './MaxPoolWithArgmax_impl';\nexport const maxPoolWithArgmaxConfig = {\n kernelName: MaxPoolWithArgmax,\n backendName: 'webgl',\n kernelFunc: ({ inputs, attrs, backend }) => {\n const { x } = inputs;\n const { filterSize, strides, pad, includeBatchInIndex } = attrs;\n const webglBackend = backend;\n util.assert(x.shape.length === 4, () => `Error in maxPool: input must be rank 4 but got rank ${x.shape.length}.`);\n const dilations = [1, 1];\n util.assert(backend_util.eitherStridesOrDilationsAreOne(strides, dilations), () => 'Error in maxPool: Either strides or dilations must be 1. ' +\n `Got strides ${strides} and dilations '${dilations}'`);\n const convInfo = backend_util.computePool2DInfo(x.shape, filterSize, strides, dilations, pad);\n const [result, indexes] = maxPoolWithArgmaxImpl(x, includeBatchInIndex, convInfo, webglBackend);\n return [result, indexes];\n }\n};\n//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiTWF4UG9vbFdpdGhBcmdtYXguanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi8uLi90ZmpzLWJhY2tlbmQtd2ViZ2wvc3JjL2tlcm5lbHMvTWF4UG9vbFdpdGhBcmdtYXgudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUE7Ozs7Ozs7Ozs7Ozs7OztHQWVHO0FBRUgsT0FBTyxFQUFDLGlCQUFpQixFQUFrRCxNQUFNLHVCQUF1QixDQUFDO0FBQ3pHLE9BQU8sRUFBQyxZQUFZLEVBQWdCLElBQUksRUFBQyxNQUFNLHVCQUF1QixDQUFDO0FBSXZFLE9BQU8sRUFBQyxxQkFBcUIsRUFBQyxNQUFNLDBCQUEwQixDQUFDO0FBRS9ELE1BQU0sQ0FBQyxNQUFNLHVCQUF1QixHQUFpQjtJQUNuRCxVQUFVLEVBQUUsaUJBQWlCO0lBQzdCLFdBQVcsRUFBRSxPQUFPO0lBQ3BCLFVBQVUsRUFBRSxDQUFDLEVBQUMsTUFBTSxFQUFFLEtBQUssRUFBRSxPQUFPLEVBQUMsRUFBRSxFQUFFO1FBQ3ZDLE1BQU0sRUFBQyxDQUFDLEVBQUMsR0FBRyxNQUFpQyxDQUFDO1FBQzlDLE1BQU0sRUFBQyxVQUFVLEVBQUUsT0FBTyxFQUFFLEdBQUcsRUFBRSxtQkFBbUIsRUFBQyxHQUNqRCxLQUFxQyxDQUFDO1FBQzFDLE1BQU0sWUFBWSxHQUFHLE9BQTJCLENBQUM7UUFFakQsSUFBSSxDQUFDLE1BQU0sQ0FDUCxDQUFDLENBQUMsS0FBSyxDQUFDLE1BQU0sS0FBSyxDQUFDLEVBQ3BCLEdBQUcsRUFBRSxDQUFDLHVEQUNGLENBQUMsQ0FBQyxLQUFLLENBQUMsTUFBTSxHQUFHLENBQUMsQ0FBQztRQUMzQixNQUFNLFNBQVMsR0FBcUIsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUM7UUFDM0MsSUFBSSxDQUFDLE1BQU0sQ0FDUCxZQUFZLENBQUMsOEJBQThCLENBQUMsT0FBTyxFQUFFLFNBQVMsQ0FBQyxFQUMvRCxHQUFHLEVBQUUsQ0FBQywyREFBMkQ7WUFDN0QsZUFBZSxPQUFPLG1CQUFtQixTQUFTLEdBQUcsQ0FBQyxDQUFDO1FBRS9ELE1BQU0sUUFBUSxHQUFHLFlBQVksQ0FBQyxpQkFBaUIsQ0FDM0MsQ0FBQyxDQUFDLEtBQXlDLEVBQUUsVUFBVSxFQUFFLE9BQU8sRUFDaEUsU0FBUyxFQUFFLEdBQUcsQ0FBQyxDQUFDO1FBRXBCLE1BQU0sQ0FBQyxNQUFNLEVBQUUsT0FBTyxDQUFDLEdBQ25CLHFCQUFxQixDQUFDLENBQUMsRUFBRSxtQkFBbUIsRUFBRSxRQUFRLEVBQUUsWUFBWSxDQUFDLENBQUM7UUFDMUUsT0FBTyxDQUFDLE1BQU0sRUFBRSxPQUFPLENBQUMsQ0FBQztJQUMzQixDQUFDO0NBQ0YsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbIi8qKlxuICogQGxpY2Vuc2VcbiAqIENvcHlyaWdodCAyMDIwIEdvb2dsZSBMTEMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuXG4gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgXCJMaWNlbnNlXCIpO1xuICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLlxuICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0XG4gKlxuICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wXG4gKlxuICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZVxuICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gXCJBUyBJU1wiIEJBU0lTLFxuICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuXG4gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kXG4gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS5cbiAqID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4gKi9cblxuaW1wb3J0IHtNYXhQb29sV2l0aEFyZ21heCwgTWF4UG9vbFdpdGhBcmdtYXhBdHRycywgTWF4UG9vbFdpdGhBcmdtYXhJbnB1dHN9IGZyb20gJ0B0ZW5zb3JmbG93L3RmanMtY29yZSc7XG5pbXBvcnQge2JhY2tlbmRfdXRpbCwgS2VybmVsQ29uZmlnLCB1dGlsfSBmcm9tICdAdGVuc29yZmxvdy90ZmpzLWNvcmUnO1xuXG5pbXBvcnQge01hdGhCYWNrZW5kV2ViR0x9IGZyb20gJy4uL2JhY2tlbmRfd2ViZ2wnO1xuXG5pbXBvcnQge21heFBvb2xXaXRoQXJnbWF4SW1wbH0gZnJvbSAnLi9NYXhQb29sV2l0aEFyZ21heF9pbXBsJztcblxuZXhwb3J0IGNvbnN0IG1heFBvb2xXaXRoQXJnbWF4Q29uZmlnOiBLZXJuZWxDb25maWcgPSB7XG4gIGtlcm5lbE5hbWU6IE1heFBvb2xXaXRoQXJnbWF4LFxuICBiYWNrZW5kTmFtZTogJ3dlYmdsJyxcbiAga2VybmVsRnVuYzogKHtpbnB1dHMsIGF0dHJzLCBiYWNrZW5kfSkgPT4ge1xuICAgIGNvbnN0IHt4fSA9IGlucHV0cyBhcyBNYXhQb29sV2l0aEFyZ21heElucHV0cztcbiAgICBjb25zdCB7ZmlsdGVyU2l6ZSwgc3RyaWRlcywgcGFkLCBpbmNsdWRlQmF0Y2hJbkluZGV4fSA9XG4gICAgICAgIGF0dHJzIGFzIHt9IGFzIE1heFBvb2xXaXRoQXJnbWF4QXR0cnM7XG4gICAgY29uc3Qgd2ViZ2xCYWNrZW5kID0gYmFja2VuZCBhcyBNYXRoQmFja2VuZFdlYkdMO1xuXG4gICAgdXRpbC5hc3NlcnQoXG4gICAgICAgIHguc2hhcGUubGVuZ3RoID09PSA0LFxuICAgICAgICAoKSA9PiBgRXJyb3IgaW4gbWF4UG9vbDogaW5wdXQgbXVzdCBiZSByYW5rIDQgYnV0IGdvdCByYW5rICR7XG4gICAgICAgICAgICB4LnNoYXBlLmxlbmd0aH0uYCk7XG4gICAgY29uc3QgZGlsYXRpb25zOiBbbnVtYmVyLCBudW1iZXJdID0gWzEsIDFdO1xuICAgIHV0aWwuYXNzZXJ0KFxuICAgICAgICBiYWNrZW5kX3V0aWwuZWl0aGVyU3RyaWRlc09yRGlsYXRpb25zQXJlT25lKHN0cmlkZXMsIGRpbGF0aW9ucyksXG4gICAgICAgICgpID0+ICdFcnJvciBpbiBtYXhQb29sOiBFaXRoZXIgc3RyaWRlcyBvciBkaWxhdGlvbnMgbXVzdCBiZSAxLiAnICtcbiAgICAgICAgICAgIGBHb3Qgc3RyaWRlcyAke3N0cmlkZXN9IGFuZCBkaWxhdGlvbnMgJyR7ZGlsYXRpb25zfSdgKTtcblxuICAgIGNvbnN0IGNvbnZJbmZvID0gYmFja2VuZF91dGlsLmNvbXB1dGVQb29sMkRJbmZvKFxuICAgICAgICB4LnNoYXBlIGFzIFtudW1iZXIsIG51bWJlciwgbnVtYmVyLCBudW1iZXJdLCBmaWx0ZXJTaXplLCBzdHJpZGVzLFxuICAgICAgICBkaWxhdGlvbnMsIHBhZCk7XG5cbiAgICBjb25zdCBbcmVzdWx0LCBpbmRleGVzXSA9XG4gICAgICAgIG1heFBvb2xXaXRoQXJnbWF4SW1wbCh4LCBpbmNsdWRlQmF0Y2hJbkluZGV4LCBjb252SW5mbywgd2ViZ2xCYWNrZW5kKTtcbiAgICByZXR1cm4gW3Jlc3VsdCwgaW5kZXhlc107XG4gIH1cbn07XG4iXX0=","/**\n * @license\n * Copyright 2020 Google LLC. All Rights Reserved.\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n * =============================================================================\n */\nimport { Pool2DProgram } from '../pool_gpu';\nexport function maxPoolWithArgmaxImpl(x, includeBatchInIndex, convInfo, backend) {\n let program = new Pool2DProgram(convInfo, 'max', false);\n const poolOutput = backend.runWebGLProgram(program, [x], 'float32');\n program = new Pool2DProgram(convInfo, 'max', true, true, includeBatchInIndex);\n const indexOutput = backend.runWebGLProgram(program, [x], 'float32');\n return [poolOutput, indexOutput];\n}\n//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiTWF4UG9vbFdpdGhBcmdtYXhfaW1wbC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uLy4uL3RmanMtYmFja2VuZC13ZWJnbC9zcmMva2VybmVscy9NYXhQb29sV2l0aEFyZ21heF9pbXBsLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBOzs7Ozs7Ozs7Ozs7Ozs7R0FlRztBQUtILE9BQU8sRUFBQyxhQUFhLEVBQUMsTUFBTSxhQUFhLENBQUM7QUFFMUMsTUFBTSxVQUFVLHFCQUFxQixDQUNqQyxDQUFhLEVBQUUsbUJBQTRCLEVBQzNDLFFBQWlDLEVBQ2pDLE9BQXlCO0lBQzNCLElBQUksT0FBTyxHQUFHLElBQUksYUFBYSxDQUFDLFFBQVEsRUFBRSxLQUFLLEVBQUUsS0FBSyxDQUFDLENBQUM7SUFDeEQsTUFBTSxVQUFVLEdBQUcsT0FBTyxDQUFDLGVBQWUsQ0FBQyxPQUFPLEVBQUUsQ0FBQyxDQUFDLENBQUMsRUFBRSxTQUFTLENBQUMsQ0FBQztJQUVwRSxPQUFPLEdBQUcsSUFBSSxhQUFhLENBQUMsUUFBUSxFQUFFLEtBQUssRUFBRSxJQUFJLEVBQUUsSUFBSSxFQUFFLG1CQUFtQixDQUFDLENBQUM7SUFDOUUsTUFBTSxXQUFXLEdBQUcsT0FBTyxDQUFDLGVBQWUsQ0FBQyxPQUFPLEVBQUUsQ0FBQyxDQUFDLENBQUMsRUFBRSxTQUFTLENBQUMsQ0FBQztJQUNyRSxPQUFPLENBQUMsVUFBVSxFQUFFLFdBQVcsQ0FBQyxDQUFDO0FBQ25DLENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyIvKipcbiAqIEBsaWNlbnNlXG4gKiBDb3B5cmlnaHQgMjAyMCBHb29nbGUgTExDLiBBbGwgUmlnaHRzIFJlc2VydmVkLlxuICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlIFwiTGljZW5zZVwiKTtcbiAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS5cbiAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdFxuICpcbiAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMFxuICpcbiAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmVcbiAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuIFwiQVMgSVNcIiBCQVNJUyxcbiAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLlxuICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZFxuICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuXG4gKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuICovXG5cbmltcG9ydCB7YmFja2VuZF91dGlsLCBUZW5zb3JJbmZvfSBmcm9tICdAdGVuc29yZmxvdy90ZmpzLWNvcmUnO1xuXG5pbXBvcnQge01hdGhCYWNrZW5kV2ViR0x9IGZyb20gJy4uL2JhY2tlbmRfd2ViZ2wnO1xuaW1wb3J0IHtQb29sMkRQcm9ncmFtfSBmcm9tICcuLi9wb29sX2dwdSc7XG5cbmV4cG9ydCBmdW5jdGlvbiBtYXhQb29sV2l0aEFyZ21heEltcGwoXG4gICAgeDogVGVuc29ySW5mbywgaW5jbHVkZUJhdGNoSW5JbmRleDogYm9vbGVhbixcbiAgICBjb252SW5mbzogYmFja2VuZF91dGlsLkNvbnYyREluZm8sXG4gICAgYmFja2VuZDogTWF0aEJhY2tlbmRXZWJHTCk6IFRlbnNvckluZm9bXSB7XG4gIGxldCBwcm9ncmFtID0gbmV3IFBvb2wyRFByb2dyYW0oY29udkluZm8sICdtYXgnLCBmYWxzZSk7XG4gIGNvbnN0IHBvb2xPdXRwdXQgPSBiYWNrZW5kLnJ1bldlYkdMUHJvZ3JhbShwcm9ncmFtLCBbeF0sICdmbG9hdDMyJyk7XG5cbiAgcHJvZ3JhbSA9IG5ldyBQb29sMkRQcm9ncmFtKGNvbnZJbmZvLCAnbWF4JywgdHJ1ZSwgdHJ1ZSwgaW5jbHVkZUJhdGNoSW5JbmRleCk7XG4gIGNvbnN0IGluZGV4T3V0cHV0ID0gYmFja2VuZC5ydW5XZWJHTFByb2dyYW0ocHJvZ3JhbSwgW3hdLCAnZmxvYXQzMicpO1xuICByZXR1cm4gW3Bvb2xPdXRwdXQsIGluZGV4T3V0cHV0XTtcbn1cbiJdfQ==","/**\n * @license\n * Copyright 2020 Google LLC. All Rights Reserved.\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n * =============================================================================\n */\nimport { backend_util, Mean, util } from '@tensorflow/tfjs-core';\nimport { meanImpl } from './Mean_impl';\nimport { transposeImpl, transposeImplCPU } from './Transpose_impl';\nexport const meanConfig = {\n kernelName: Mean,\n backendName: 'webgl',\n kernelFunc: ({ inputs, attrs, backend }) => {\n const { x } = inputs;\n const { keepDims, axis } = attrs;\n const webglBackend = backend;\n const xRank = x.shape.length;\n const origAxes = util.parseAxisParam(axis, x.shape);\n let axes = origAxes;\n const permutedAxes = backend_util.getAxesPermutation(axes, xRank);\n const meanInputIsTransposed = permutedAxes != null;\n const shouldExecuteOnCPU = webglBackend.shouldExecuteOnCPU([x]);\n const intermediates = [];\n let meanInput = x;\n if (meanInputIsTransposed) {\n if (shouldExecuteOnCPU) {\n const xTexData = webglBackend.texData.get(meanInput.dataId);\n const values = xTexData.values;\n const newShape = new Array(xRank);\n for (let i = 0; i < newShape.length; i++) {\n newShape[i] = x.shape[permutedAxes[i]];\n }\n const meanInputValues = transposeImplCPU(values, x.shape, x.dtype, permutedAxes, newShape);\n meanInput = webglBackend.makeTensorInfo(newShape, x.dtype);\n const meanInputData = webglBackend.texData.get(meanInput.dataId);\n meanInputData.values = meanInputValues;\n }\n else {\n meanInput = transposeImpl(x, permutedAxes, webglBackend);\n }\n intermediates.push(meanInput);\n axes = backend_util.getInnerMostAxes(axes.length, xRank);\n }\n backend_util.assertAxesAreInnerMostDims('sum', axes, xRank);\n const [meanOutShape, reduceShape] = backend_util.computeOutAndReduceShapes(meanInput.shape, axes);\n let outShape = meanOutShape;\n if (keepDims) {\n // rather than reshape at the end, set the target shape here.\n outShape = backend_util.expandShapeToKeepDim(meanOutShape, origAxes);\n }\n const out = meanImpl(meanInput, reduceShape, outShape, webglBackend);\n for (const i of intermediates) {\n webglBackend.disposeIntermediateTensorInfo(i);\n }\n return out;\n }\n};\n//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiTWVhbi5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uLy4uL3RmanMtYmFja2VuZC13ZWJnbC9zcmMva2VybmVscy9NZWFuLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBOzs7Ozs7Ozs7Ozs7Ozs7R0FlRztBQUVILE9BQU8sRUFBQyxZQUFZLEVBQWdCLElBQUksRUFBaUQsSUFBSSxFQUFDLE1BQU0sdUJBQXVCLENBQUM7QUFJNUgsT0FBTyxFQUFDLFFBQVEsRUFBQyxNQUFNLGFBQWEsQ0FBQztBQUNyQyxPQUFPLEVBQUMsYUFBYSxFQUFFLGdCQUFnQixFQUFDLE1BQU0sa0JBQWtCLENBQUM7QUFFakUsTUFBTSxDQUFDLE1BQU0sVUFBVSxHQUFpQjtJQUN0QyxVQUFVLEVBQUUsSUFBSTtJQUNoQixXQUFXLEVBQUUsT0FBTztJQUNwQixVQUFVLEVBQUUsQ0FBQyxFQUFDLE1BQU0sRUFBRSxLQUFLLEVBQUUsT0FBTyxFQUFDLEVBQUUsRUFBRTtRQUN2QyxNQUFNLEVBQUMsQ0FBQyxFQUFDLEdBQUcsTUFBb0IsQ0FBQztRQUNqQyxNQUFNLEVBQUMsUUFBUSxFQUFFLElBQUksRUFBQyxHQUFHLEtBQXdCLENBQUM7UUFDbEQsTUFBTSxZQUFZLEdBQUcsT0FBMkIsQ0FBQztRQUVqRCxNQUFNLEtBQUssR0FBRyxDQUFDLENBQUMsS0FBSyxDQUFDLE1BQU0sQ0FBQztRQUM3QixNQUFNLFFBQVEsR0FBRyxJQUFJLENBQUMsY0FBYyxDQUFDLElBQUksRUFBRSxDQUFDLENBQUMsS0FBSyxDQUFDLENBQUM7UUFFcEQsSUFBSSxJQUFJLEdBQUcsUUFBUSxDQUFDO1FBQ3BCLE1BQU0sWUFBWSxHQUFHLFlBQVksQ0FBQyxrQkFBa0IsQ0FBQyxJQUFJLEVBQUUsS0FBSyxDQUFDLENBQUM7UUFDbEUsTUFBTSxxQkFBcUIsR0FBRyxZQUFZLElBQUksSUFBSSxDQUFDO1FBQ25ELE1BQU0sa0JBQWtCLEdBQUcsWUFBWSxDQUFDLGtCQUFrQixDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQztRQUVoRSxNQUFNLGFBQWEsR0FBaUIsRUFBRSxDQUFDO1FBRXZDLElBQUksU0FBUyxHQUFHLENBQUMsQ0FBQztRQUNsQixJQUFJLHFCQUFxQixFQUFFO1lBQ3pCLElBQUksa0JBQWtCLEVBQUU7Z0JBQ3RCLE1BQU0sUUFBUSxHQUFHLFlBQVksQ0FBQyxPQUFPLENBQUMsR0FBRyxDQUFDLFNBQVMsQ0FBQyxNQUFNLENBQUMsQ0FBQztnQkFDNUQsTUFBTSxNQUFNLEdBQUcsUUFBUSxDQUFDLE1BQW9CLENBQUM7Z0JBRTdDLE1BQU0sUUFBUSxHQUFhLElBQUksS0FBSyxDQUFDLEtBQUssQ0FBQyxDQUFDO2dCQUM1QyxLQUFLLElBQUksQ0FBQyxHQUFHLENBQUMsRUFBRSxDQUFDLEdBQUcsUUFBUSxDQUFDLE1BQU0sRUFBRSxDQUFDLEVBQUUsRUFBRTtvQkFDeEMsUUFBUSxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxLQUFLLENBQUMsWUFBWSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUM7aUJBQ3hDO2dCQUNELE1BQU0sZUFBZSxHQUNqQixnQkFBZ0IsQ0FBQyxNQUFNLEVBQUUsQ0FBQyxDQUFDLEtBQUssRUFBRSxDQUFDLENBQUMsS0FBSyxFQUFFLFlBQVksRUFBRSxRQUFRLENBQUMsQ0FBQztnQkFFdkUsU0FBUyxHQUFHLFlBQVksQ0FBQyxjQUFjLENBQUMsUUFBUSxFQUFFLENBQUMsQ0FBQyxLQUFLLENBQUMsQ0FBQztnQkFDM0QsTUFBTSxhQUFhLEdBQUcsWUFBWSxDQUFDLE9BQU8sQ0FBQyxHQUFHLENBQUMsU0FBUyxDQUFDLE1BQU0sQ0FBQyxDQUFDO2dCQUNqRSxhQUFhLENBQUMsTUFBTSxHQUFHLGVBQWUsQ0FBQzthQUN4QztpQkFBTTtnQkFDTCxTQUFTLEdBQUcsYUFBYSxDQUFDLENBQUMsRUFBRSxZQUFZLEVBQUUsWUFBWSxDQUFDLENBQUM7YUFDMUQ7WUFFRCxhQUFhLENBQUMsSUFBSSxDQUFDLFNBQVMsQ0FBQyxDQUFDO1lBQzlCLElBQUksR0FBRyxZQUFZLENBQUMsZ0JBQWdCLENBQUMsSUFBSSxDQUFDLE1BQU0sRUFBRSxLQUFLLENBQUMsQ0FBQztTQUMxRDtRQUVELFlBQVksQ0FBQywwQkFBMEIsQ0FBQyxLQUFLLEVBQUUsSUFBSSxFQUFFLEtBQUssQ0FBQyxDQUFDO1FBQzVELE1BQU0sQ0FBQyxZQUFZLEVBQUUsV0FBVyxDQUFDLEdBQzdCLFlBQVksQ0FBQyx5QkFBeUIsQ0FBQyxTQUFTLENBQUMsS0FBSyxFQUFFLElBQUksQ0FBQyxDQUFDO1FBRWxFLElBQUksUUFBUSxHQUFHLFlBQVksQ0FBQztRQUM1QixJQUFJLFFBQVEsRUFBRTtZQUNaLDZEQUE2RDtZQUM3RCxRQUFRLEdBQUcsWUFBWSxDQUFDLG9CQUFvQixDQUFDLFlBQVksRUFBRSxRQUFRLENBQUMsQ0FBQztTQUN0RTtRQUVELE1BQU0sR0FBRyxHQUFHLFFBQVEsQ0FBQyxTQUFTLEVBQUUsV0FBVyxFQUFFLFFBQVEsRUFBRSxZQUFZLENBQUMsQ0FBQztRQUNyRSxLQUFLLE1BQU0sQ0FBQyxJQUFJLGFBQWEsRUFBRTtZQUM3QixZQUFZLENBQUMsNkJBQTZCLENBQUMsQ0FBQyxDQUFDLENBQUM7U0FDL0M7UUFFRCxPQUFPLEdBQUcsQ0FBQztJQUNiLENBQUM7Q0FDRixDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiLyoqXG4gKiBAbGljZW5zZVxuICogQ29weXJpZ2h0IDIwMjAgR29vZ2xlIExMQy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC5cbiAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSBcIkxpY2Vuc2VcIik7XG4gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuXG4gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXRcbiAqXG4gKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjBcbiAqXG4gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlXG4gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiBcIkFTIElTXCIgQkFTSVMsXG4gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC5cbiAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmRcbiAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLlxuICogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbiAqL1xuXG5pbXBvcnQge2JhY2tlbmRfdXRpbCwgS2VybmVsQ29uZmlnLCBNZWFuLCBNZWFuQXR0cnMsIE1lYW5JbnB1dHMsIFRlbnNvckluZm8sIFR5cGVkQXJyYXksIHV0aWx9IGZyb20gJ0B0ZW5zb3JmbG93L3RmanMtY29yZSc7XG5cbmltcG9ydCB7TWF0aEJhY2tlbmRXZWJHTH0gZnJvbSAnLi4vYmFja2VuZF93ZWJnbCc7XG5cbmltcG9ydCB7bWVhbkltcGx9IGZyb20gJy4vTWVhbl9pbXBsJztcbmltcG9ydCB7dHJhbnNwb3NlSW1wbCwgdHJhbnNwb3NlSW1wbENQVX0gZnJvbSAnLi9UcmFuc3Bvc2VfaW1wbCc7XG5cbmV4cG9ydCBjb25zdCBtZWFuQ29uZmlnOiBLZXJuZWxDb25maWcgPSB7XG4gIGtlcm5lbE5hbWU6IE1lYW4sXG4gIGJhY2tlbmROYW1lOiAnd2ViZ2wnLFxuICBrZXJuZWxGdW5jOiAoe2lucHV0cywgYXR0cnMsIGJhY2tlbmR9KSA9PiB7XG4gICAgY29uc3Qge3h9ID0gaW5wdXRzIGFzIE1lYW5JbnB1dHM7XG4gICAgY29uc3Qge2tlZXBEaW1zLCBheGlzfSA9IGF0dHJzIGFzIHt9IGFzIE1lYW5BdHRycztcbiAgICBjb25zdCB3ZWJnbEJhY2tlbmQgPSBiYWNrZW5kIGFzIE1hdGhCYWNrZW5kV2ViR0w7XG5cbiAgICBjb25zdCB4UmFuayA9IHguc2hhcGUubGVuZ3RoO1xuICAgIGNvbnN0IG9yaWdBeGVzID0gdXRpbC5wYXJzZUF4aXNQYXJhbShheGlzLCB4LnNoYXBlKTtcblxuICAgIGxldCBheGVzID0gb3JpZ0F4ZXM7XG4gICAgY29uc3QgcGVybXV0ZWRBeGVzID0gYmFja2VuZF91dGlsLmdldEF4ZXNQZXJtdXRhdGlvbihheGVzLCB4UmFuayk7XG4gICAgY29uc3QgbWVhbklucHV0SXNUcmFuc3Bvc2VkID0gcGVybXV0ZWRBeGVzICE9IG51bGw7XG4gICAgY29uc3Qgc2hvdWxkRXhlY3V0ZU9uQ1BVID0gd2ViZ2xCYWNrZW5kLnNob3VsZEV4ZWN1dGVPbkNQVShbeF0pO1xuXG4gICAgY29uc3QgaW50ZXJtZWRpYXRlczogVGVuc29ySW5mb1tdID0gW107XG5cbiAgICBsZXQgbWVhbklucHV0ID0geDtcbiAgICBpZiAobWVhbklucHV0SXNUcmFuc3Bvc2VkKSB7XG4gICAgICBpZiAoc2hvdWxkRXhlY3V0ZU9uQ1BVKSB7XG4gICAgICAgIGNvbnN0IHhUZXhEYXRhID0gd2ViZ2xCYWNrZW5kLnRleERhdGEuZ2V0KG1lYW5JbnB1dC5kYXRhSWQpO1xuICAgICAgICBjb25zdCB2YWx1ZXMgPSB4VGV4RGF0YS52YWx1ZXMgYXMgVHlwZWRBcnJheTtcblxuICAgICAgICBjb25zdCBuZXdTaGFwZTogbnVtYmVyW10gPSBuZXcgQXJyYXkoeFJhbmspO1xuICAgICAgICBmb3IgKGxldCBpID0gMDsgaSA8IG5ld1NoYXBlLmxlbmd0aDsgaSsrKSB7XG4gICAgICAgICAgbmV3U2hhcGVbaV0gPSB4LnNoYXBlW3Blcm11dGVkQXhlc1tpXV07XG4gICAgICAgIH1cbiAgICAgICAgY29uc3QgbWVhbklucHV0VmFsdWVzID1cbiAgICAgICAgICAgIHRyYW5zcG9zZUltcGxDUFUodmFsdWVzLCB4LnNoYXBlLCB4LmR0eXBlLCBwZXJtdXRlZEF4ZXMsIG5ld1NoYXBlKTtcblxuICAgICAgICBtZWFuSW5wdXQgPSB3ZWJnbEJhY2tlbmQubWFrZVRlbnNvckluZm8obmV3U2hhcGUsIHguZHR5cGUpO1xuICAgICAgICBjb25zdCBtZWFuSW5wdXREYXRhID0gd2ViZ2xCYWNrZW5kLnRleERhdGEuZ2V0KG1lYW5JbnB1dC5kYXRhSWQpO1xuICAgICAgICBtZWFuSW5wdXREYXRhLnZhbHVlcyA9IG1lYW5JbnB1dFZhbHVlcztcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIG1lYW5JbnB1dCA9IHRyYW5zcG9zZUltcGwoeCwgcGVybXV0ZWRBeGVzLCB3ZWJnbEJhY2tlbmQpO1xuICAgICAgfVxuXG4gICAgICBpbnRlcm1lZGlhdGVzLnB1c2gobWVhbklucHV0KTtcbiAgICAgIGF4ZXMgPSBiYWNrZW5kX3V0aWwuZ2V0SW5uZXJNb3N0QXhlcyhheGVzLmxlbmd0aCwgeFJhbmspO1xuICAgIH1cblxuICAgIGJhY2tlbmRfdXRpbC5hc3NlcnRBeGVzQXJlSW5uZXJNb3N0RGltcygnc3VtJywgYXhlcywgeFJhbmspO1xuICAgIGNvbnN0IFttZWFuT3V0U2hhcGUsIHJlZHVjZVNoYXBlXSA9XG4gICAgICAgIGJhY2tlbmRfdXRpbC5jb21wdXRlT3V0QW5kUmVkdWNlU2hhcGVzKG1lYW5JbnB1dC5zaGFwZSwgYXhlcyk7XG5cbiAgICBsZXQgb3V0U2hhcGUgPSBtZWFuT3V0U2hhcGU7XG4gICAgaWYgKGtlZXBEaW1zKSB7XG4gICAgICAvLyByYXRoZXIgdGhhbiByZXNoYXBlIGF0IHRoZSBlbmQsIHNldCB0aGUgdGFyZ2V0IHNoYXBlIGhlcmUuXG4gICAgICBvdXRTaGFwZSA9IGJhY2tlbmRfdXRpbC5leHBhbmRTaGFwZVRvS2VlcERpbShtZWFuT3V0U2hhcGUsIG9yaWdBeGVzKTtcbiAgICB9XG5cbiAgICBjb25zdCBvdXQgPSBtZWFuSW1wbChtZWFuSW5wdXQsIHJlZHVjZVNoYXBlLCBvdXRTaGFwZSwgd2ViZ2xCYWNrZW5kKTtcbiAgICBmb3IgKGNvbnN0IGkgb2YgaW50ZXJtZWRpYXRlcykge1xuICAgICAgd2ViZ2xCYWNrZW5kLmRpc3Bvc2VJbnRlcm1lZGlhdGVUZW5zb3JJbmZvKGkpO1xuICAgIH1cblxuICAgIHJldHVybiBvdXQ7XG4gIH1cbn07XG4iXX0=","/**\n * @license\n * Copyright 2020 Google LLC. All Rights Reserved.\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n * =============================================================================\n */\nimport { util } from '@tensorflow/tfjs-core';\nimport { reduce } from '../kernel_utils/reduce';\nimport { reshape } from '../kernels/Reshape';\nexport function meanImpl(x, reduceShape, outShape, backend) {\n const inSize = util.sizeFromShape(reduceShape);\n const xSize = util.sizeFromShape(x.shape);\n const batchSize = xSize / inSize;\n const reshapedInput = reshape({ inputs: { x }, attrs: { shape: [batchSize, inSize] }, backend });\n const reduced = reduce(reshapedInput, 'float32', 'mean', backend);\n const reshapedOutput = reshape({ inputs: { x: reduced }, attrs: { shape: outShape }, backend });\n backend.disposeIntermediateTensorInfo(reshapedInput);\n backend.disposeIntermediateTensorInfo(reduced);\n return reshapedOutput;\n}\n//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiTWVhbl9pbXBsLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vLi4vdGZqcy1iYWNrZW5kLXdlYmdsL3NyYy9rZXJuZWxzL01lYW5faW1wbC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQTs7Ozs7Ozs7Ozs7Ozs7O0dBZUc7QUFFSCxPQUFPLEVBQWEsSUFBSSxFQUFDLE1BQU0sdUJBQXVCLENBQUM7QUFHdkQsT0FBTyxFQUFDLE1BQU0sRUFBQyxNQUFNLHdCQUF3QixDQUFDO0FBQzlDLE9BQU8sRUFBQyxPQUFPLEVBQUMsTUFBTSxvQkFBb0IsQ0FBQztBQUUzQyxNQUFNLFVBQVUsUUFBUSxDQUNwQixDQUFhLEVBQUUsV0FBcUIsRUFBRSxRQUFrQixFQUN4RCxPQUF5QjtJQUMzQixNQUFNLE1BQU0sR0FBRyxJQUFJLENBQUMsYUFBYSxDQUFDLFdBQVcsQ0FBQyxDQUFDO0lBQy9DLE1BQU0sS0FBSyxHQUFHLElBQUksQ0FBQyxhQUFhLENBQUMsQ0FBQyxDQUFDLEtBQUssQ0FBQyxDQUFDO0lBQzFDLE1BQU0sU0FBUyxHQUFHLEtBQUssR0FBRyxNQUFNLENBQUM7SUFDakMsTUFBTSxhQUFhLEdBQ2YsT0FBTyxDQUFDLEVBQUMsTUFBTSxFQUFFLEVBQUMsQ0FBQyxFQUFDLEVBQUUsS0FBSyxFQUFFLEVBQUMsS0FBSyxFQUFFLENBQUMsU0FBUyxFQUFFLE1BQU0sQ0FBQyxFQUFDLEVBQUUsT0FBTyxFQUFDLENBQUMsQ0FBQztJQUV6RSxNQUFNLE9BQU8sR0FBRyxNQUFNLENBQUMsYUFBYSxFQUFFLFNBQVMsRUFBRSxNQUFNLEVBQUUsT0FBTyxDQUFDLENBQUM7SUFDbEUsTUFBTSxjQUFjLEdBQ2hCLE9BQU8sQ0FBQyxFQUFDLE1BQU0sRUFBRSxFQUFDLENBQUMsRUFBRSxPQUFPLEVBQUMsRUFBRSxLQUFLLEVBQUUsRUFBQyxLQUFLLEVBQUUsUUFBUSxFQUFDLEVBQUUsT0FBTyxFQUFDLENBQUMsQ0FBQztJQUV2RSxPQUFPLENBQUMsNkJBQTZCLENBQUMsYUFBYSxDQUFDLENBQUM7SUFDckQsT0FBTyxDQUFDLDZCQUE2QixDQUFDLE9BQU8sQ0FBQyxDQUFDO0lBRS9DLE9BQU8sY0FBYyxDQUFDO0FBQ3hCLENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyIvKipcbiAqIEBsaWNlbnNlXG4gKiBDb3B5cmlnaHQgMjAyMCBHb29nbGUgTExDLiBBbGwgUmlnaHRzIFJlc2VydmVkLlxuICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlIFwiTGljZW5zZVwiKTtcbiAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS5cbiAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdFxuICpcbiAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMFxuICpcbiAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmVcbiAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuIFwiQVMgSVNcIiBCQVNJUyxcbiAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLlxuICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZFxuICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuXG4gKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuICovXG5cbmltcG9ydCB7VGVuc29ySW5mbywgdXRpbH0gZnJvbSAnQHRlbnNvcmZsb3cvdGZqcy1jb3JlJztcblxuaW1wb3J0IHtNYXRoQmFja2VuZFdlYkdMfSBmcm9tICcuLi9iYWNrZW5kX3dlYmdsJztcbmltcG9ydCB7cmVkdWNlfSBmcm9tICcuLi9rZXJuZWxfdXRpbHMvcmVkdWNlJztcbmltcG9ydCB7cmVzaGFwZX0gZnJvbSAnLi4va2VybmVscy9SZXNoYXBlJztcblxuZXhwb3J0IGZ1bmN0aW9uIG1lYW5JbXBsKFxuICAgIHg6IFRlbnNvckluZm8sIHJlZHVjZVNoYXBlOiBudW1iZXJbXSwgb3V0U2hhcGU6IG51bWJlcltdLFxuICAgIGJhY2tlbmQ6IE1hdGhCYWNrZW5kV2ViR0wpOiBUZW5zb3JJbmZvIHtcbiAgY29uc3QgaW5TaXplID0gdXRpbC5zaXplRnJvbVNoYXBlKHJlZHVjZVNoYXBlKTtcbiAgY29uc3QgeFNpemUgPSB1dGlsLnNpemVGcm9tU2hhcGUoeC5zaGFwZSk7XG4gIGNvbnN0IGJhdGNoU2l6ZSA9IHhTaXplIC8gaW5TaXplO1xuICBjb25zdCByZXNoYXBlZElucHV0ID1cbiAgICAgIHJlc2hhcGUoe2lucHV0czoge3h9LCBhdHRyczoge3NoYXBlOiBbYmF0Y2hTaXplLCBpblNpemVdfSwgYmFja2VuZH0pO1xuXG4gIGNvbnN0IHJlZHVjZWQgPSByZWR1Y2UocmVzaGFwZWRJbnB1dCwgJ2Zsb2F0MzInLCAnbWVhbicsIGJhY2tlbmQpO1xuICBjb25zdCByZXNoYXBlZE91dHB1dCA9XG4gICAgICByZXNoYXBlKHtpbnB1dHM6IHt4OiByZWR1Y2VkfSwgYXR0cnM6IHtzaGFwZTogb3V0U2hhcGV9LCBiYWNrZW5kfSk7XG5cbiAgYmFja2VuZC5kaXNwb3NlSW50ZXJtZWRpYXRlVGVuc29ySW5mbyhyZXNoYXBlZElucHV0KTtcbiAgYmFja2VuZC5kaXNwb3NlSW50ZXJtZWRpYXRlVGVuc29ySW5mbyhyZWR1Y2VkKTtcblxuICByZXR1cm4gcmVzaGFwZWRPdXRwdXQ7XG59XG4iXX0=","/**\n * @license\n * Copyright 2020 Google LLC. All Rights Reserved.\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n * =============================================================================\n */\nimport { backend_util, Min, util } from '@tensorflow/tfjs-core';\nimport { reduce } from '../kernel_utils/reduce';\nimport { reshape } from './Reshape';\nimport { transpose } from './Transpose';\nexport function min(args) {\n const { inputs, backend, attrs } = args;\n const { x } = inputs;\n const { axis, keepDims } = attrs;\n const xRank = x.shape.length;\n const origAxes = util.parseAxisParam(axis, x.shape);\n let axes = origAxes;\n const permutedAxes = backend_util.getAxesPermutation(axes, xRank);\n let permutedX = x;\n if (permutedAxes != null) {\n permutedX = transpose({ inputs: { x }, backend, attrs: { perm: permutedAxes } });\n axes = backend_util.getInnerMostAxes(axes.length, x.shape.length);\n }\n backend_util.assertAxesAreInnerMostDims('min', axes, xRank);\n const [outShape, reduceShape] = backend_util.computeOutAndReduceShapes(permutedX.shape, axes);\n const inSize = util.sizeFromShape(reduceShape);\n const a2D = reshape({ inputs: { x: permutedX }, backend, attrs: { shape: [-1, inSize] } });\n const reduced = reduce(a2D, a2D.dtype, 'min', backend);\n let res;\n if (keepDims) {\n const newShape = backend_util.expandShapeToKeepDim(outShape, origAxes);\n res = reshape({ inputs: { x: reduced }, backend, attrs: { shape: newShape } });\n }\n else {\n res = reshape({ inputs: { x: reduced }, backend, attrs: { shape: outShape } });\n }\n backend.disposeIntermediateTensorInfo(a2D);\n backend.disposeIntermediateTensorInfo(reduced);\n if (permutedAxes != null) {\n backend.disposeIntermediateTensorInfo(permutedX);\n }\n return res;\n}\nexport const minConfig = {\n kernelName: Min,\n backendName: 'webgl',\n kernelFunc: min\n};\n//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiTWluLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vLi4vdGZqcy1iYWNrZW5kLXdlYmdsL3NyYy9rZXJuZWxzL01pbi50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQTs7Ozs7Ozs7Ozs7Ozs7O0dBZUc7QUFFSCxPQUFPLEVBQUMsWUFBWSxFQUE0QixHQUFHLEVBQW1DLElBQUksRUFBQyxNQUFNLHVCQUF1QixDQUFDO0FBR3pILE9BQU8sRUFBQyxNQUFNLEVBQUMsTUFBTSx3QkFBd0IsQ0FBQztBQUU5QyxPQUFPLEVBQUMsT0FBTyxFQUFDLE1BQU0sV0FBVyxDQUFDO0FBQ2xDLE9BQU8sRUFBQyxTQUFTLEVBQUMsTUFBTSxhQUFhLENBQUM7QUFFdEMsTUFBTSxVQUFVLEdBQUcsQ0FDZixJQUFxRTtJQUV2RSxNQUFNLEVBQUMsTUFBTSxFQUFFLE9BQU8sRUFBRSxLQUFLLEVBQUMsR0FBRyxJQUFJLENBQUM7SUFDdEMsTUFBTSxFQUFDLENBQUMsRUFBQyxHQUFHLE1BQU0sQ0FBQztJQUNuQixNQUFNLEVBQUMsSUFBSSxFQUFFLFFBQVEsRUFBQyxHQUFHLEtBQUssQ0FBQztJQUUvQixNQUFNLEtBQUssR0FBRyxDQUFDLENBQUMsS0FBSyxDQUFDLE1BQU0sQ0FBQztJQUU3QixNQUFNLFFBQVEsR0FBRyxJQUFJLENBQUMsY0FBYyxDQUFDLElBQUksRUFBRSxDQUFDLENBQUMsS0FBSyxDQUFDLENBQUM7SUFDcEQsSUFBSSxJQUFJLEdBQUcsUUFBUSxDQUFDO0lBQ3BCLE1BQU0sWUFBWSxHQUFHLFlBQVksQ0FBQyxrQkFBa0IsQ0FBQyxJQUFJLEVBQUUsS0FBSyxDQUFDLENBQUM7SUFDbEUsSUFBSSxTQUFTLEdBQUcsQ0FBQyxDQUFDO0lBQ2xCLElBQUksWUFBWSxJQUFJLElBQUksRUFBRTtRQUN4QixTQUFTLEdBQUcsU0FBUyxDQUFDLEVBQUMsTUFBTSxFQUFFLEVBQUMsQ0FBQyxFQUFDLEVBQUUsT0FBTyxFQUFFLEtBQUssRUFBRSxFQUFDLElBQUksRUFBRSxZQUFZLEVBQUMsRUFBQyxDQUFDLENBQUM7UUFDM0UsSUFBSSxHQUFHLFlBQVksQ0FBQyxnQkFBZ0IsQ0FBQyxJQUFJLENBQUMsTUFBTSxFQUFFLENBQUMsQ0FBQyxLQUFLLENBQUMsTUFBTSxDQUFDLENBQUM7S0FDbkU7SUFFRCxZQUFZLENBQUMsMEJBQTBCLENBQUMsS0FBSyxFQUFFLElBQUksRUFBRSxLQUFLLENBQUMsQ0FBQztJQUM1RCxNQUFNLENBQUMsUUFBUSxFQUFFLFdBQVcsQ0FBQyxHQUN6QixZQUFZLENBQUMseUJBQXlCLENBQUMsU0FBUyxDQUFDLEtBQUssRUFBRSxJQUFJLENBQUMsQ0FBQztJQUNsRSxNQUFNLE1BQU0sR0FBRyxJQUFJLENBQUMsYUFBYSxDQUFDLFdBQVcsQ0FBQyxDQUFDO0lBQy9DLE1BQU0sR0FBRyxHQUNMLE9BQU8sQ0FBQyxFQUFDLE1BQU0sRUFBRSxFQUFDLENBQUMsRUFBRSxTQUFTLEVBQUMsRUFBRSxPQUFPLEVBQUUsS0FBSyxFQUFFLEVBQUMsS0FBSyxFQUFFLENBQUMsQ0FBQyxDQUFDLEVBQUUsTUFBTSxDQUFDLEVBQUMsRUFBQyxDQUFDLENBQUM7SUFDN0UsTUFBTSxPQUFPLEdBQUcsTUFBTSxDQUFDLEdBQUcsRUFBRSxHQUFHLENBQUMsS0FBSyxFQUFFLEtBQUssRUFBRSxPQUFPLENBQUMsQ0FBQztJQUV2RCxJQUFJLEdBQUcsQ0FBQztJQUNSLElBQUksUUFBUSxFQUFFO1FBQ1osTUFBTSxRQUFRLEdBQUcsWUFBWSxDQUFDLG9CQUFvQixDQUFDLFFBQVEsRUFBRSxRQUFRLENBQUMsQ0FBQztRQUN2RSxHQUFHLEdBQUcsT0FBTyxDQUFDLEVBQUMsTUFBTSxFQUFFLEVBQUMsQ0FBQyxFQUFFLE9BQU8sRUFBQyxFQUFFLE9BQU8sRUFBRSxLQUFLLEVBQUUsRUFBQyxLQUFLLEVBQUUsUUFBUSxFQUFDLEVBQUMsQ0FBQyxDQUFDO0tBQzFFO1NBQU07UUFDTCxHQUFHLEdBQUcsT0FBTyxDQUFDLEVBQUMsTUFBTSxFQUFFLEVBQUMsQ0FBQyxFQUFFLE9BQU8sRUFBQyxFQUFFLE9BQU8sRUFBRSxLQUFLLEVBQUUsRUFBQyxLQUFLLEVBQUUsUUFBUSxFQUFDLEVBQUMsQ0FBQyxDQUFDO0tBQzFFO0lBRUQsT0FBTyxDQUFDLDZCQUE2QixDQUFDLEdBQUcsQ0FBQyxDQUFDO0lBQzNDLE9BQU8sQ0FBQyw2QkFBNkIsQ0FBQyxPQUFPLENBQUMsQ0FBQztJQUUvQyxJQUFJLFlBQVksSUFBSSxJQUFJLEVBQUU7UUFDeEIsT0FBTyxDQUFDLDZCQUE2QixDQUFDLFNBQVMsQ0FBQyxDQUFDO0tBQ2xEO0lBRUQsT0FBTyxHQUFHLENBQUM7QUFDYixDQUFDO0FBRUQsTUFBTSxDQUFDLE1BQU0sU0FBUyxHQUFpQjtJQUNyQyxVQUFVLEVBQUUsR0FBRztJQUNmLFdBQVcsRUFBRSxPQUFPO0lBQ3BCLFVBQVUsRUFBRSxHQUF1QjtDQUNwQyxDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiLyoqXG4gKiBAbGljZW5zZVxuICogQ29weXJpZ2h0IDIwMjAgR29vZ2xlIExMQy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC5cbiAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSBcIkxpY2Vuc2VcIik7XG4gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuXG4gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXRcbiAqXG4gKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjBcbiAqXG4gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlXG4gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiBcIkFTIElTXCIgQkFTSVMsXG4gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC5cbiAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmRcbiAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLlxuICogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbiAqL1xuXG5pbXBvcnQge2JhY2tlbmRfdXRpbCwgS2VybmVsQ29uZmlnLCBLZXJuZWxGdW5jLCBNaW4sIE1pbkF0dHJzLCBNaW5JbnB1dHMsIFRlbnNvckluZm8sIHV0aWx9IGZyb20gJ0B0ZW5zb3JmbG93L3RmanMtY29yZSc7XG5cbmltcG9ydCB7TWF0aEJhY2tlbmRXZWJHTH0gZnJvbSAnLi4vYmFja2VuZF93ZWJnbCc7XG5pbXBvcnQge3JlZHVjZX0gZnJvbSAnLi4va2VybmVsX3V0aWxzL3JlZHVjZSc7XG5cbmltcG9ydCB7cmVzaGFwZX0gZnJvbSAnLi9SZXNoYXBlJztcbmltcG9ydCB7dHJhbnNwb3NlfSBmcm9tICcuL1RyYW5zcG9zZSc7XG5cbmV4cG9ydCBmdW5jdGlvbiBtaW4oXG4gICAgYXJnczoge2lucHV0czogTWluSW5wdXRzLCBiYWNrZW5kOiBNYXRoQmFja2VuZFdlYkdMLCBhdHRyczogTWluQXR0cnN9KTpcbiAgICBUZW5zb3JJbmZvIHtcbiAgY29uc3Qge2lucHV0cywgYmFja2VuZCwgYXR0cnN9ID0gYXJncztcbiAgY29uc3Qge3h9ID0gaW5wdXRzO1xuICBjb25zdCB7YXhpcywga2VlcERpbXN9ID0gYXR0cnM7XG5cbiAgY29uc3QgeFJhbmsgPSB4LnNoYXBlLmxlbmd0aDtcblxuICBjb25zdCBvcmlnQXhlcyA9IHV0aWwucGFyc2VBeGlzUGFyYW0oYXhpcywgeC5zaGFwZSk7XG4gIGxldCBheGVzID0gb3JpZ0F4ZXM7XG4gIGNvbnN0IHBlcm11dGVkQXhlcyA9IGJhY2tlbmRfdXRpbC5nZXRBeGVzUGVybXV0YXRpb24oYXhlcywgeFJhbmspO1xuICBsZXQgcGVybXV0ZWRYID0geDtcbiAgaWYgKHBlcm11dGVkQXhlcyAhPSBudWxsKSB7XG4gICAgcGVybXV0ZWRYID0gdHJhbnNwb3NlKHtpbnB1dHM6IHt4fSwgYmFja2VuZCwgYXR0cnM6IHtwZXJtOiBwZXJtdXRlZEF4ZXN9fSk7XG4gICAgYXhlcyA9IGJhY2tlbmRfdXRpbC5nZXRJbm5lck1vc3RBeGVzKGF4ZXMubGVuZ3RoLCB4LnNoYXBlLmxlbmd0aCk7XG4gIH1cblxuICBiYWNrZW5kX3V0aWwuYXNzZXJ0QXhlc0FyZUlubmVyTW9zdERpbXMoJ21pbicsIGF4ZXMsIHhSYW5rKTtcbiAgY29uc3QgW291dFNoYXBlLCByZWR1Y2VTaGFwZV0gPVxuICAgICAgYmFja2VuZF91dGlsLmNvbXB1dGVPdXRBbmRSZWR1Y2VTaGFwZXMocGVybXV0ZWRYLnNoYXBlLCBheGVzKTtcbiAgY29uc3QgaW5TaXplID0gdXRpbC5zaXplRnJvbVNoYXBlKHJlZHVjZVNoYXBlKTtcbiAgY29uc3QgYTJEID1cbiAgICAgIHJlc2hhcGUoe2lucHV0czoge3g6IHBlcm11dGVkWH0sIGJhY2tlbmQsIGF0dHJzOiB7c2hhcGU6IFstMSwgaW5TaXplXX19KTtcbiAgY29uc3QgcmVkdWNlZCA9IHJlZHVjZShhMkQsIGEyRC5kdHlwZSwgJ21pbicsIGJhY2tlbmQpO1xuXG4gIGxldCByZXM7XG4gIGlmIChrZWVwRGltcykge1xuICAgIGNvbnN0IG5ld1NoYXBlID0gYmFja2VuZF91dGlsLmV4cGFuZFNoYXBlVG9LZWVwRGltKG91dFNoYXBlLCBvcmlnQXhlcyk7XG4gICAgcmVzID0gcmVzaGFwZSh7aW5wdXRzOiB7eDogcmVkdWNlZH0sIGJhY2tlbmQsIGF0dHJzOiB7c2hhcGU6IG5ld1NoYXBlfX0pO1xuICB9IGVsc2Uge1xuICAgIHJlcyA9IHJlc2hhcGUoe2lucHV0czoge3g6IHJlZHVjZWR9LCBiYWNrZW5kLCBhdHRyczoge3NoYXBlOiBvdXRTaGFwZX19KTtcbiAgfVxuXG4gIGJhY2tlbmQuZGlzcG9zZUludGVybWVkaWF0ZVRlbnNvckluZm8oYTJEKTtcbiAgYmFja2VuZC5kaXNwb3NlSW50ZXJtZWRpYXRlVGVuc29ySW5mbyhyZWR1Y2VkKTtcblxuICBpZiAocGVybXV0ZWRBeGVzICE9IG51bGwpIHtcbiAgICBiYWNrZW5kLmRpc3Bvc2VJbnRlcm1lZGlhdGVUZW5zb3JJbmZvKHBlcm11dGVkWCk7XG4gIH1cblxuICByZXR1cm4gcmVzO1xufVxuXG5leHBvcnQgY29uc3QgbWluQ29uZmlnOiBLZXJuZWxDb25maWcgPSB7XG4gIGtlcm5lbE5hbWU6IE1pbixcbiAgYmFja2VuZE5hbWU6ICd3ZWJnbCcsXG4gIGtlcm5lbEZ1bmM6IG1pbiBhcyB7fSBhcyBLZXJuZWxGdW5jXG59O1xuIl19","/**\n * @license\n * Copyright 2020 Google LLC. All Rights Reserved.\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n * =============================================================================\n */\nimport { Minimum } from '@tensorflow/tfjs-core';\nimport { CHECK_NAN_SNIPPET } from '../binaryop_gpu';\nimport { CHECK_NAN_SNIPPET_PACKED } from '../binaryop_packed_gpu';\nimport { binaryKernelFunc } from '../kernel_utils/kernel_funcs_utils';\nimport { minimumImplCPU } from '../kernel_utils/shared';\nconst MINIMUM = CHECK_NAN_SNIPPET + `\n return min(a, b);\n`;\nconst MINIMUM_PACKED = `\n vec4 result = vec4(min(a, b));\n bvec4 isNaNA = isnan(a);\n bvec4 isNaNB = isnan(b);\n bvec4 isNaN = bvec4(isNaNA.x || isNaNB.x, isNaNA.y || isNaNB.y, isNaNA.z || isNaNB.z, isNaNA.w || isNaNB.w);\n ` +\n CHECK_NAN_SNIPPET_PACKED + `\n return result;\n`;\nexport const minimum = binaryKernelFunc({\n opSnippet: MINIMUM,\n packedOpSnippet: MINIMUM_PACKED,\n cpuKernelImpl: minimumImplCPU\n});\nexport const minimumConfig = {\n kernelName: Minimum,\n backendName: 'webgl',\n kernelFunc: minimum\n};\n//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiTWluaW11bS5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uLy4uL3RmanMtYmFja2VuZC13ZWJnbC9zcmMva2VybmVscy9NaW5pbXVtLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBOzs7Ozs7Ozs7Ozs7Ozs7R0FlRztBQUVILE9BQU8sRUFBMkIsT0FBTyxFQUFDLE1BQU0sdUJBQXVCLENBQUM7QUFFeEUsT0FBTyxFQUFDLGlCQUFpQixFQUFDLE1BQU0saUJBQWlCLENBQUM7QUFDbEQsT0FBTyxFQUFDLHdCQUF3QixFQUFDLE1BQU0sd0JBQXdCLENBQUM7QUFDaEUsT0FBTyxFQUFDLGdCQUFnQixFQUFDLE1BQU0sb0NBQW9DLENBQUM7QUFDcEUsT0FBTyxFQUFDLGNBQWMsRUFBQyxNQUFNLHdCQUF3QixDQUFDO0FBRXRELE1BQU0sT0FBTyxHQUFHLGlCQUFpQixHQUFHOztDQUVuQyxDQUFDO0FBRUYsTUFBTSxjQUFjLEdBQUc7Ozs7O0dBS3BCO0lBQ0Msd0JBQXdCLEdBQUc7O0NBRTlCLENBQUM7QUFFRixNQUFNLENBQUMsTUFBTSxPQUFPLEdBQUcsZ0JBQWdCLENBQUM7SUFDdEMsU0FBUyxFQUFFLE9BQU87SUFDbEIsZUFBZSxFQUFFLGNBQWM7SUFDL0IsYUFBYSxFQUFFLGNBQWM7Q0FDOUIsQ0FBQyxDQUFDO0FBRUgsTUFBTSxDQUFDLE1BQU0sYUFBYSxHQUFpQjtJQUN6QyxVQUFVLEVBQUUsT0FBTztJQUNuQixXQUFXLEVBQUUsT0FBTztJQUNwQixVQUFVLEVBQUUsT0FBMkI7Q0FDeEMsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbIi8qKlxuICogQGxpY2Vuc2VcbiAqIENvcHlyaWdodCAyMDIwIEdvb2dsZSBMTEMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuXG4gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgXCJMaWNlbnNlXCIpO1xuICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLlxuICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0XG4gKlxuICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wXG4gKlxuICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZVxuICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gXCJBUyBJU1wiIEJBU0lTLFxuICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuXG4gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kXG4gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS5cbiAqID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4gKi9cblxuaW1wb3J0IHtLZXJuZWxDb25maWcsIEtlcm5lbEZ1bmMsIE1pbmltdW19IGZyb20gJ0B0ZW5zb3JmbG93L3RmanMtY29yZSc7XG5cbmltcG9ydCB7Q0hFQ0tfTkFOX1NOSVBQRVR9IGZyb20gJy4uL2JpbmFyeW9wX2dwdSc7XG5pbXBvcnQge0NIRUNLX05BTl9TTklQUEVUX1BBQ0tFRH0gZnJvbSAnLi4vYmluYXJ5b3BfcGFja2VkX2dwdSc7XG5pbXBvcnQge2JpbmFyeUtlcm5lbEZ1bmN9IGZyb20gJy4uL2tlcm5lbF91dGlscy9rZXJuZWxfZnVuY3NfdXRpbHMnO1xuaW1wb3J0IHttaW5pbXVtSW1wbENQVX0gZnJvbSAnLi4va2VybmVsX3V0aWxzL3NoYXJlZCc7XG5cbmNvbnN0IE1JTklNVU0gPSBDSEVDS19OQU5fU05JUFBFVCArIGBcbiAgcmV0dXJuIG1pbihhLCBiKTtcbmA7XG5cbmNvbnN0IE1JTklNVU1fUEFDS0VEID0gYFxuICB2ZWM0IHJlc3VsdCA9IHZlYzQobWluKGEsIGIpKTtcbiAgYnZlYzQgaXNOYU5BID0gaXNuYW4oYSk7XG4gIGJ2ZWM0IGlzTmFOQiA9IGlzbmFuKGIpO1xuICBidmVjNCBpc05hTiA9IGJ2ZWM0KGlzTmFOQS54IHx8IGlzTmFOQi54LCBpc05hTkEueSB8fCBpc05hTkIueSwgaXNOYU5BLnogfHwgaXNOYU5CLnosIGlzTmFOQS53IHx8IGlzTmFOQi53KTtcbiAgYCArXG4gICAgQ0hFQ0tfTkFOX1NOSVBQRVRfUEFDS0VEICsgYFxuICByZXR1cm4gcmVzdWx0O1xuYDtcblxuZXhwb3J0IGNvbnN0IG1pbmltdW0gPSBiaW5hcnlLZXJuZWxGdW5jKHtcbiAgb3BTbmlwcGV0OiBNSU5JTVVNLFxuICBwYWNrZWRPcFNuaXBwZXQ6IE1JTklNVU1fUEFDS0VELFxuICBjcHVLZXJuZWxJbXBsOiBtaW5pbXVtSW1wbENQVVxufSk7XG5cbmV4cG9ydCBjb25zdCBtaW5pbXVtQ29uZmlnOiBLZXJuZWxDb25maWcgPSB7XG4gIGtlcm5lbE5hbWU6IE1pbmltdW0sXG4gIGJhY2tlbmROYW1lOiAnd2ViZ2wnLFxuICBrZXJuZWxGdW5jOiBtaW5pbXVtIGFzIHt9IGFzIEtlcm5lbEZ1bmNcbn07XG4iXX0=","/**\n * @license\n * Copyright 2020 Google LLC. All Rights Reserved.\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n * =============================================================================\n */\nimport { getCoordsDataType } from './shader_compiler';\nexport class MirrorPadProgram {\n constructor(xShape, paddings, mode) {\n this.variableNames = ['x'];\n this.outputShape = paddings.map((p, i) => p[0] /* beforePad */ + xShape[i] + p[1] /* afterPad */);\n const rank = xShape.length;\n const dtype = getCoordsDataType(rank);\n const start = paddings.map(p => p[0]).join(',');\n const end = paddings.map((p, i) => p[0] + xShape[i]).join(',');\n const unpackedCoords = ['coords[0]', 'coords[1]', 'coords[2]', 'coords[3]'].slice(0, rank);\n const offset = mode === 'reflect' ? 0 : 1;\n if (rank === 1) {\n this.userCode = `\n int start = ${start};\n int end = ${end};\n\n void main() {\n int outC = getOutputCoords();\n if (outC < start) {\n outC = start * 2 - outC - ${offset};\n } else if(outC >= end) {\n outC = (end - 1) * 2 - outC + ${offset};\n }\n setOutput(getX(outC - start));\n }\n `;\n return;\n }\n this.userCode = `\n ${dtype} start = ${dtype}(${start});\n ${dtype} end = ${dtype}(${end});\n\n void main() {\n ${dtype} outC = getOutputCoords();\n for (int i = 0; i < ${rank}; i++) {\n if (outC[i] < start[i]) {\n outC[i] = start[i] * 2 - outC[i] - ${offset};\n } else if(outC[i] >= end[i]) {\n outC[i] = (end[i] - 1) * 2 - outC[i] + ${offset};\n }\n }\n ${dtype} coords = outC - start;\n setOutput(getX(${unpackedCoords}));\n }\n `;\n }\n}\n//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibWlycm9yX3BhZF9ncHUuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi90ZmpzLWJhY2tlbmQtd2ViZ2wvc3JjL21pcnJvcl9wYWRfZ3B1LnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBOzs7Ozs7Ozs7Ozs7Ozs7R0FlRztBQUdILE9BQU8sRUFBQyxpQkFBaUIsRUFBQyxNQUFNLG1CQUFtQixDQUFDO0FBRXBELE1BQU0sT0FBTyxnQkFBZ0I7SUFLM0IsWUFDSSxNQUFnQixFQUFFLFFBQWlDLEVBQ25ELElBQTJCO1FBTi9CLGtCQUFhLEdBQUcsQ0FBQyxHQUFHLENBQUMsQ0FBQztRQU9wQixJQUFJLENBQUMsV0FBVyxHQUFHLFFBQVEsQ0FBQyxHQUFHLENBQzNCLENBQUMsQ0FBQyxFQUFFLENBQUMsRUFBRSxFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLGVBQWUsR0FBRyxNQUFNLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLGNBQWMsQ0FBQyxDQUFDO1FBQ3RFLE1BQU0sSUFBSSxHQUFHLE1BQU0sQ0FBQyxNQUFNLENBQUM7UUFDM0IsTUFBTSxLQUFLLEdBQUcsaUJBQWlCLENBQUMsSUFBSSxDQUFDLENBQUM7UUFFdEMsTUFBTSxLQUFLLEdBQUcsUUFBUSxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxHQUFHLENBQUMsQ0FBQztRQUNoRCxNQUFNLEdBQUcsR0FBRyxRQUFRLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsRUFBRSxFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxHQUFHLE1BQU0sQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxHQUFHLENBQUMsQ0FBQztRQUMvRCxNQUFNLGNBQWMsR0FDaEIsQ0FBQyxXQUFXLEVBQUUsV0FBVyxFQUFFLFdBQVcsRUFBRSxXQUFXLENBQUMsQ0FBQyxLQUFLLENBQUMsQ0FBQyxFQUFFLElBQUksQ0FBQyxDQUFDO1FBQ3hFLE1BQU0sTUFBTSxHQUFHLElBQUksS0FBSyxTQUFTLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDO1FBRTFDLElBQUksSUFBSSxLQUFLLENBQUMsRUFBRTtZQUNkLElBQUksQ0FBQyxRQUFRLEdBQUc7c0JBQ0EsS0FBSztvQkFDUCxHQUFHOzs7Ozt3Q0FLaUIsTUFBTTs7NENBRUYsTUFBTTs7OztPQUkzQyxDQUFDO1lBQ0YsT0FBTztTQUNSO1FBQ0QsSUFBSSxDQUFDLFFBQVEsR0FBRztRQUNaLEtBQUssWUFBWSxLQUFLLElBQUksS0FBSztRQUMvQixLQUFLLFVBQVUsS0FBSyxJQUFJLEdBQUc7OztVQUd6QixLQUFLOzhCQUNlLElBQUk7O2lEQUVlLE1BQU07O3FEQUVGLE1BQU07OztVQUdqRCxLQUFLO3lCQUNVLGNBQWM7O0tBRWxDLENBQUM7SUFDSixDQUFDO0NBQ0YiLCJzb3VyY2VzQ29udGVudCI6WyIvKipcbiAqIEBsaWNlbnNlXG4gKiBDb3B5cmlnaHQgMjAyMCBHb29nbGUgTExDLiBBbGwgUmlnaHRzIFJlc2VydmVkLlxuICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlIFwiTGljZW5zZVwiKTtcbiAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS5cbiAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdFxuICpcbiAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMFxuICpcbiAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmVcbiAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuIFwiQVMgSVNcIiBCQVNJUyxcbiAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLlxuICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZFxuICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuXG4gKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuICovXG5cbmltcG9ydCB7R1BHUFVQcm9ncmFtfSBmcm9tICcuL2dwZ3B1X21hdGgnO1xuaW1wb3J0IHtnZXRDb29yZHNEYXRhVHlwZX0gZnJvbSAnLi9zaGFkZXJfY29tcGlsZXInO1xuXG5leHBvcnQgY2xhc3MgTWlycm9yUGFkUHJvZ3JhbSBpbXBsZW1lbnRzIEdQR1BVUHJvZ3JhbSB7XG4gIHZhcmlhYmxlTmFtZXMgPSBbJ3gnXTtcbiAgb3V0cHV0U2hhcGU6IG51bWJlcltdO1xuICB1c2VyQ29kZTogc3RyaW5nO1xuXG4gIGNvbnN0cnVjdG9yKFxuICAgICAgeFNoYXBlOiBudW1iZXJbXSwgcGFkZGluZ3M6IEFycmF5PFtudW1iZXIsIG51bWJlcl0+LFxuICAgICAgbW9kZTogJ3JlZmxlY3QnfCdzeW1tZXRyaWMnKSB7XG4gICAgdGhpcy5vdXRwdXRTaGFwZSA9IHBhZGRpbmdzLm1hcChcbiAgICAgICAgKHAsIGkpID0+IHBbMF0gLyogYmVmb3JlUGFkICovICsgeFNoYXBlW2ldICsgcFsxXSAvKiBhZnRlclBhZCAqLyk7XG4gICAgY29uc3QgcmFuayA9IHhTaGFwZS5sZW5ndGg7XG4gICAgY29uc3QgZHR5cGUgPSBnZXRDb29yZHNEYXRhVHlwZShyYW5rKTtcblxuICAgIGNvbnN0IHN0YXJ0ID0gcGFkZGluZ3MubWFwKHAgPT4gcFswXSkuam9pbignLCcpO1xuICAgIGNvbnN0IGVuZCA9IHBhZGRpbmdzLm1hcCgocCwgaSkgPT4gcFswXSArIHhTaGFwZVtpXSkuam9pbignLCcpO1xuICAgIGNvbnN0IHVucGFja2VkQ29vcmRzID1cbiAgICAgICAgWydjb29yZHNbMF0nLCAnY29vcmRzWzFdJywgJ2Nvb3Jkc1syXScsICdjb29yZHNbM10nXS5zbGljZSgwLCByYW5rKTtcbiAgICBjb25zdCBvZmZzZXQgPSBtb2RlID09PSAncmVmbGVjdCcgPyAwIDogMTtcblxuICAgIGlmIChyYW5rID09PSAxKSB7XG4gICAgICB0aGlzLnVzZXJDb2RlID0gYFxuICAgICAgICBpbnQgc3RhcnQgPSAke3N0YXJ0fTtcbiAgICAgICAgaW50IGVuZCA9ICR7ZW5kfTtcblxuICAgICAgICB2b2lkIG1haW4oKSB7XG4gICAgICAgICAgaW50IG91dEMgPSBnZXRPdXRwdXRDb29yZHMoKTtcbiAgICAgICAgICBpZiAob3V0QyA8IHN0YXJ0KSB7XG4gICAgICAgICAgICBvdXRDID0gc3RhcnQgKiAyIC0gb3V0QyAtICR7b2Zmc2V0fTtcbiAgICAgICAgICB9IGVsc2UgaWYob3V0QyA+PSBlbmQpIHtcbiAgICAgICAgICAgIG91dEMgPSAoZW5kIC0gMSkgKiAyIC0gb3V0QyArICR7b2Zmc2V0fTtcbiAgICAgICAgICB9XG4gICAgICAgICAgc2V0T3V0cHV0KGdldFgob3V0QyAtIHN0YXJ0KSk7XG4gICAgICAgIH1cbiAgICAgIGA7XG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIHRoaXMudXNlckNvZGUgPSBgXG4gICAgICAke2R0eXBlfSBzdGFydCA9ICR7ZHR5cGV9KCR7c3RhcnR9KTtcbiAgICAgICR7ZHR5cGV9IGVuZCA9ICR7ZHR5cGV9KCR7ZW5kfSk7XG5cbiAgICAgIHZvaWQgbWFpbigpIHtcbiAgICAgICAgJHtkdHlwZX0gb3V0QyA9IGdldE91dHB1dENvb3JkcygpO1xuICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8ICR7cmFua307IGkrKykge1xuICAgICAgICAgIGlmIChvdXRDW2ldIDwgc3RhcnRbaV0pIHtcbiAgICAgICAgICAgIG91dENbaV0gPSBzdGFydFtpXSAqIDIgLSBvdXRDW2ldIC0gJHtvZmZzZXR9O1xuICAgICAgICAgIH0gZWxzZSBpZihvdXRDW2ldID49IGVuZFtpXSkge1xuICAgICAgICAgICAgb3V0Q1tpXSA9IChlbmRbaV0gLSAxKSAqIDIgLSBvdXRDW2ldICsgJHtvZmZzZXR9O1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICAke2R0eXBlfSBjb29yZHMgPSBvdXRDIC0gc3RhcnQ7XG4gICAgICAgIHNldE91dHB1dChnZXRYKCR7dW5wYWNrZWRDb29yZHN9KSk7XG4gICAgICB9XG4gICAgYDtcbiAgfVxufVxuIl19","/**\n * @license\n * Copyright 2020 Google LLC. All Rights Reserved.\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n * =============================================================================\n */\nimport { getChannels } from './packing_util';\nimport { getCoordsDataType } from './shader_compiler';\n/**\n * Example shader code for\n * `mirrorPad(tf.tensor1d([1, 2, 3], 'int32'), [[2, 2]], 'reflect')`\n * ```\n * const int start = int(2);\n * const int end = int(5);\n *\n * void main() {\n * int outputLoc = getOutputCoords();\n * vec4 result = vec4(0.);\n *\n * int rc = outputLoc;\n *\n * int source = rc;\n * if (source < start) {\n * source = start * 2 - source - 0;\n * } else if (source >= end) {\n * source = (end - 1) * 2 - source + 0;\n * }\n * source -= start;\n *\n * result[0] = getChannel(getX(source), source);\n * rc += 1;\n * if(rc < 6) {\n * int source = rc;\n * if (source < start) {\n * source = start * 2 - source - 0;\n * } else if (source >= end) {\n * source = (end - 1) * 2 - source + 0;\n * }\n * source -= start;\n *\n * result[1] = getChannel(getX(source), source);\n * }\n *\n * setOutput(result);\n * }\n * ```\n */\nexport class MirrorPadPackedProgram {\n constructor(xShape, paddings, mode) {\n this.variableNames = ['x'];\n this.packedInputs = true;\n this.packedOutput = true;\n this.outputShape = paddings.map((p, i) => p[0] /* beforePad */ + xShape[i] + p[1] /* afterPad */);\n const rank = xShape.length;\n const dtype = getCoordsDataType(rank);\n const start = paddings.map(p => p[0]).join(',');\n const end = paddings.map((p, i) => p[0] + xShape[i]).join(',');\n const coords = getChannels('rc', rank);\n const source = getChannels('source', rank);\n const cLimit = `${coords[rank - 1]} < ${this.outputShape[rank - 1]}`;\n const innerDims = rank === 1 ? 'source' : `vec2(${source.slice(-2).join()})`;\n const offset = mode === 'reflect' ? 0 : 1;\n let mainLoop = '';\n if (rank === 1) {\n const padSetup = `\n ${dtype} source = rc;\n if (source < start) {\n source = start * 2 - source - ${offset};\n } else if (source >= end) {\n source = (end - 1) * 2 - source + ${offset};\n }\n source -= start;\n `;\n mainLoop = `\n ${dtype} rc = outputLoc;\n ${padSetup}\n result[0] = getChannel(getX(${source.join()}), ${innerDims});\n ${coords[rank - 1]} += 1;\n if(${cLimit}) {\n ${padSetup}\n result[1] = getChannel(getX(${source.join()}), ${innerDims});\n }\n `;\n }\n else {\n const padSetup = `\n ${dtype} source = rc;\n ${dtype} lt = ${dtype}(lessThan(source, start));\n ${dtype} gte = ${dtype}(greaterThanEqual(source, end));\n ${dtype} orig = 1 - (lt + gte);\n source = orig * source +\n lt * (start * 2 - source - ${offset}) +\n gte * ((end - 1) * 2 - source + ${offset});\n source -= start;\n `;\n mainLoop = `\n ${dtype} rc = outputLoc;\n ${padSetup}\n result[0] = getChannel(getX(${source.join()}), ${innerDims});\n ${coords[rank - 1]} += 1;\n if(${cLimit}) {\n ${padSetup}\n result[1] = getChannel(getX(${source.join()}), ${innerDims});\n }\n rc = outputLoc;\n ${coords[rank - 2]} += 1;\n if(${coords[rank - 2]} < ${this.outputShape[rank - 2]}) {\n ${padSetup}\n result[2] = getChannel(getX(${source.join()}), ${innerDims});\n ${coords[rank - 1]} += 1;\n if(${cLimit}) {\n ${padSetup}\n result[3] = getChannel(getX(${source.join()}), ${innerDims});\n }\n }\n `;\n }\n this.userCode = `\n const ${dtype} start = ${dtype}(${start});\n const ${dtype} end = ${dtype}(${end});\n\n void main() {\n ${dtype} outputLoc = getOutputCoords();\n vec4 result = vec4(0.);\n ${mainLoop}\n setOutput(result);\n }\n `;\n }\n}\n//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibWlycm9yX3BhZF9wYWNrZWRfZ3B1LmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vdGZqcy1iYWNrZW5kLXdlYmdsL3NyYy9taXJyb3JfcGFkX3BhY2tlZF9ncHUudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUE7Ozs7Ozs7Ozs7Ozs7OztHQWVHO0FBR0gsT0FBTyxFQUFDLFdBQVcsRUFBQyxNQUFNLGdCQUFnQixDQUFDO0FBQzNDLE9BQU8sRUFBQyxpQkFBaUIsRUFBQyxNQUFNLG1CQUFtQixDQUFDO0FBRXBEOzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7OztHQXNDRztBQUNILE1BQU0sT0FBTyxzQkFBc0I7SUFPakMsWUFDSSxNQUFnQixFQUFFLFFBQWlDLEVBQ25ELElBQTJCO1FBUi9CLGtCQUFhLEdBQUcsQ0FBQyxHQUFHLENBQUMsQ0FBQztRQUN0QixpQkFBWSxHQUFHLElBQUksQ0FBQztRQUNwQixpQkFBWSxHQUFHLElBQUksQ0FBQztRQU9sQixJQUFJLENBQUMsV0FBVyxHQUFHLFFBQVEsQ0FBQyxHQUFHLENBQzNCLENBQUMsQ0FBQyxFQUFFLENBQUMsRUFBRSxFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLGVBQWUsR0FBRyxNQUFNLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLGNBQWMsQ0FBQyxDQUFDO1FBQ3RFLE1BQU0sSUFBSSxHQUFHLE1BQU0sQ0FBQyxNQUFNLENBQUM7UUFDM0IsTUFBTSxLQUFLLEdBQUcsaUJBQWlCLENBQUMsSUFBSSxDQUFDLENBQUM7UUFFdEMsTUFBTSxLQUFLLEdBQUcsUUFBUSxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxHQUFHLENBQUMsQ0FBQztRQUNoRCxNQUFNLEdBQUcsR0FBRyxRQUFRLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsRUFBRSxFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxHQUFHLE1BQU0sQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxHQUFHLENBQUMsQ0FBQztRQUMvRCxNQUFNLE1BQU0sR0FBRyxXQUFXLENBQUMsSUFBSSxFQUFFLElBQUksQ0FBQyxDQUFDO1FBQ3ZDLE1BQU0sTUFBTSxHQUFHLFdBQVcsQ0FBQyxRQUFRLEVBQUUsSUFBSSxDQUFDLENBQUM7UUFDM0MsTUFBTSxNQUFNLEdBQUcsR0FBRyxNQUFNLENBQUMsSUFBSSxHQUFHLENBQUMsQ0FBQyxNQUFNLElBQUksQ0FBQyxXQUFXLENBQUMsSUFBSSxHQUFHLENBQUMsQ0FBQyxFQUFFLENBQUM7UUFDckUsTUFBTSxTQUFTLEdBQ1gsSUFBSSxLQUFLLENBQUMsQ0FBQyxDQUFDLENBQUMsUUFBUSxDQUFDLENBQUMsQ0FBQyxRQUFRLE1BQU0sQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLEVBQUUsR0FBRyxDQUFDO1FBQy9ELE1BQU0sTUFBTSxHQUFHLElBQUksS0FBSyxTQUFTLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDO1FBRTFDLElBQUksUUFBUSxHQUFHLEVBQUUsQ0FBQztRQUNsQixJQUFJLElBQUksS0FBSyxDQUFDLEVBQUU7WUFDZCxNQUFNLFFBQVEsR0FBRztVQUNiLEtBQUs7OzBDQUUyQixNQUFNOzs4Q0FFRixNQUFNOzs7T0FHN0MsQ0FBQztZQUNGLFFBQVEsR0FBRztVQUNQLEtBQUs7VUFDTCxRQUFRO3NDQUNvQixNQUFNLENBQUMsSUFBSSxFQUFFLE1BQU0sU0FBUztVQUN4RCxNQUFNLENBQUMsSUFBSSxHQUFHLENBQUMsQ0FBQzthQUNiLE1BQU07WUFDUCxRQUFRO3dDQUNvQixNQUFNLENBQUMsSUFBSSxFQUFFLE1BQU0sU0FBUzs7T0FFN0QsQ0FBQztTQUNIO2FBQU07WUFDTCxNQUFNLFFBQVEsR0FBRztVQUNiLEtBQUs7VUFDTCxLQUFLLFNBQVMsS0FBSztVQUNuQixLQUFLLFVBQVUsS0FBSztVQUNwQixLQUFLOzs2Q0FFOEIsTUFBTTtrREFDRCxNQUFNOztPQUVqRCxDQUFDO1lBRUYsUUFBUSxHQUFHO1VBQ1AsS0FBSztVQUNMLFFBQVE7c0NBQ29CLE1BQU0sQ0FBQyxJQUFJLEVBQUUsTUFBTSxTQUFTO1VBQ3hELE1BQU0sQ0FBQyxJQUFJLEdBQUcsQ0FBQyxDQUFDO2FBQ2IsTUFBTTtZQUNQLFFBQVE7d0NBQ29CLE1BQU0sQ0FBQyxJQUFJLEVBQUUsTUFBTSxTQUFTOzs7VUFHMUQsTUFBTSxDQUFDLElBQUksR0FBRyxDQUFDLENBQUM7YUFDYixNQUFNLENBQUMsSUFBSSxHQUFHLENBQUMsQ0FBQyxNQUFNLElBQUksQ0FBQyxXQUFXLENBQUMsSUFBSSxHQUFHLENBQUMsQ0FBQztZQUNqRCxRQUFRO3dDQUNvQixNQUFNLENBQUMsSUFBSSxFQUFFLE1BQU0sU0FBUztZQUN4RCxNQUFNLENBQUMsSUFBSSxHQUFHLENBQUMsQ0FBQztlQUNiLE1BQU07Y0FDUCxRQUFROzBDQUNvQixNQUFNLENBQUMsSUFBSSxFQUFFLE1BQU0sU0FBUzs7O09BRy9ELENBQUM7U0FDSDtRQUVELElBQUksQ0FBQyxRQUFRLEdBQUc7Y0FDTixLQUFLLFlBQVksS0FBSyxJQUFJLEtBQUs7Y0FDL0IsS0FBSyxVQUFVLEtBQUssSUFBSSxHQUFHOzs7VUFHL0IsS0FBSzs7VUFFTCxRQUFROzs7S0FHYixDQUFDO0lBQ0osQ0FBQztDQUNGIiwic291cmNlc0NvbnRlbnQiOlsiLyoqXG4gKiBAbGljZW5zZVxuICogQ29weXJpZ2h0IDIwMjAgR29vZ2xlIExMQy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC5cbiAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSBcIkxpY2Vuc2VcIik7XG4gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuXG4gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXRcbiAqXG4gKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjBcbiAqXG4gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlXG4gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiBcIkFTIElTXCIgQkFTSVMsXG4gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC5cbiAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmRcbiAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLlxuICogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbiAqL1xuXG5pbXBvcnQge0dQR1BVUHJvZ3JhbX0gZnJvbSAnLi9ncGdwdV9tYXRoJztcbmltcG9ydCB7Z2V0Q2hhbm5lbHN9IGZyb20gJy4vcGFja2luZ191dGlsJztcbmltcG9ydCB7Z2V0Q29vcmRzRGF0YVR5cGV9IGZyb20gJy4vc2hhZGVyX2NvbXBpbGVyJztcblxuLyoqXG4gKiBFeGFtcGxlIHNoYWRlciBjb2RlIGZvclxuICogYG1pcnJvclBhZCh0Zi50ZW5zb3IxZChbMSwgMiwgM10sICdpbnQzMicpLCBbWzIsIDJdXSwgJ3JlZmxlY3QnKWBcbiAqIGBgYFxuICogICAgY29uc3QgaW50IHN0YXJ0ID0gaW50KDIpO1xuICogICAgY29uc3QgaW50IGVuZCA9IGludCg1KTtcbiAqXG4gKiAgICB2b2lkIG1haW4oKSB7XG4gKiAgICAgICBpbnQgb3V0cHV0TG9jID0gZ2V0T3V0cHV0Q29vcmRzKCk7XG4gKiAgICAgICB2ZWM0IHJlc3VsdCA9IHZlYzQoMC4pO1xuICpcbiAqICAgICAgIGludCByYyA9IG91dHB1dExvYztcbiAqXG4gKiAgICAgICBpbnQgc291cmNlID0gcmM7XG4gKiAgICAgICBpZiAoc291cmNlIDwgc3RhcnQpIHtcbiAqICAgICAgICAgc291cmNlID0gc3RhcnQgKiAyIC0gc291cmNlIC0gMDtcbiAqICAgICAgIH0gZWxzZSBpZiAoc291cmNlID49IGVuZCkge1xuICogICAgICAgICBzb3VyY2UgPSAoZW5kIC0gMSkgKiAyIC0gc291cmNlICsgMDtcbiAqICAgICAgIH1cbiAqICAgICAgIHNvdXJjZSAtPSBzdGFydDtcbiAqXG4gKiAgICAgICByZXN1bHRbMF0gPSBnZXRDaGFubmVsKGdldFgoc291cmNlKSwgc291cmNlKTtcbiAqICAgICAgIHJjICs9IDE7XG4gKiAgICAgICBpZihyYyA8IDYpIHtcbiAqICAgICAgICAgIGludCBzb3VyY2UgPSByYztcbiAqICAgICAgICAgIGlmIChzb3VyY2UgPCBzdGFydCkge1xuICogICAgICAgICAgICBzb3VyY2UgPSBzdGFydCAqIDIgLSBzb3VyY2UgLSAwO1xuICogICAgICAgICAgfSBlbHNlIGlmIChzb3VyY2UgPj0gZW5kKSB7XG4gKiAgICAgICAgICAgIHNvdXJjZSA9IChlbmQgLSAxKSAqIDIgLSBzb3VyY2UgKyAwO1xuICogICAgICAgICAgfVxuICogICAgICAgICAgc291cmNlIC09IHN0YXJ0O1xuICpcbiAqICAgICAgICAgcmVzdWx0WzFdID0gZ2V0Q2hhbm5lbChnZXRYKHNvdXJjZSksIHNvdXJjZSk7XG4gKiAgICAgICB9XG4gKlxuICogICAgICAgc2V0T3V0cHV0KHJlc3VsdCk7XG4gKiAgICAgfVxuICogYGBgXG4gKi9cbmV4cG9ydCBjbGFzcyBNaXJyb3JQYWRQYWNrZWRQcm9ncmFtIGltcGxlbWVudHMgR1BHUFVQcm9ncmFtIHtcbiAgdmFyaWFibGVOYW1lcyA9IFsneCddO1xuICBwYWNrZWRJbnB1dHMgPSB0cnVlO1xuICBwYWNrZWRPdXRwdXQgPSB0cnVlO1xuICBvdXRwdXRTaGFwZTogbnVtYmVyW107XG4gIHVzZXJDb2RlOiBzdHJpbmc7XG5cbiAgY29uc3RydWN0b3IoXG4gICAgICB4U2hhcGU6IG51bWJlcltdLCBwYWRkaW5nczogQXJyYXk8W251bWJlciwgbnVtYmVyXT4sXG4gICAgICBtb2RlOiAncmVmbGVjdCd8J3N5bW1ldHJpYycpIHtcbiAgICB0aGlzLm91dHB1dFNoYXBlID0gcGFkZGluZ3MubWFwKFxuICAgICAgICAocCwgaSkgPT4gcFswXSAvKiBiZWZvcmVQYWQgKi8gKyB4U2hhcGVbaV0gKyBwWzFdIC8qIGFmdGVyUGFkICovKTtcbiAgICBjb25zdCByYW5rID0geFNoYXBlLmxlbmd0aDtcbiAgICBjb25zdCBkdHlwZSA9IGdldENvb3Jkc0RhdGFUeXBlKHJhbmspO1xuXG4gICAgY29uc3Qgc3RhcnQgPSBwYWRkaW5ncy5tYXAocCA9PiBwWzBdKS5qb2luKCcsJyk7XG4gICAgY29uc3QgZW5kID0gcGFkZGluZ3MubWFwKChwLCBpKSA9PiBwWzBdICsgeFNoYXBlW2ldKS5qb2luKCcsJyk7XG4gICAgY29uc3QgY29vcmRzID0gZ2V0Q2hhbm5lbHMoJ3JjJywgcmFuayk7XG4gICAgY29uc3Qgc291cmNlID0gZ2V0Q2hhbm5lbHMoJ3NvdXJjZScsIHJhbmspO1xuICAgIGNvbnN0IGNMaW1pdCA9IGAke2Nvb3Jkc1tyYW5rIC0gMV19IDwgJHt0aGlzLm91dHB1dFNoYXBlW3JhbmsgLSAxXX1gO1xuICAgIGNvbnN0IGlubmVyRGltcyA9XG4gICAgICAgIHJhbmsgPT09IDEgPyAnc291cmNlJyA6IGB2ZWMyKCR7c291cmNlLnNsaWNlKC0yKS5qb2luKCl9KWA7XG4gICAgY29uc3Qgb2Zmc2V0ID0gbW9kZSA9PT0gJ3JlZmxlY3QnID8gMCA6IDE7XG5cbiAgICBsZXQgbWFpbkxvb3AgPSAnJztcbiAgICBpZiAocmFuayA9PT0gMSkge1xuICAgICAgY29uc3QgcGFkU2V0dXAgPSBgXG4gICAgICAgICR7ZHR5cGV9IHNvdXJjZSA9IHJjO1xuICAgICAgICBpZiAoc291cmNlIDwgc3RhcnQpIHtcbiAgICAgICAgICBzb3VyY2UgPSBzdGFydCAqIDIgLSBzb3VyY2UgLSAke29mZnNldH07XG4gICAgICAgIH0gZWxzZSBpZiAoc291cmNlID49IGVuZCkge1xuICAgICAgICAgIHNvdXJjZSA9IChlbmQgLSAxKSAqIDIgLSBzb3VyY2UgKyAke29mZnNldH07XG4gICAgICAgIH1cbiAgICAgICAgc291cmNlIC09IHN0YXJ0O1xuICAgICAgYDtcbiAgICAgIG1haW5Mb29wID0gYFxuICAgICAgICAke2R0eXBlfSByYyA9IG91dHB1dExvYztcbiAgICAgICAgJHtwYWRTZXR1cH1cbiAgICAgICAgcmVzdWx0WzBdID0gZ2V0Q2hhbm5lbChnZXRYKCR7c291cmNlLmpvaW4oKX0pLCAke2lubmVyRGltc30pO1xuICAgICAgICAke2Nvb3Jkc1tyYW5rIC0gMV19ICs9IDE7XG4gICAgICAgIGlmKCR7Y0xpbWl0fSkge1xuICAgICAgICAgICR7cGFkU2V0dXB9XG4gICAgICAgICAgcmVzdWx0WzFdID0gZ2V0Q2hhbm5lbChnZXRYKCR7c291cmNlLmpvaW4oKX0pLCAke2lubmVyRGltc30pO1xuICAgICAgICB9XG4gICAgICBgO1xuICAgIH0gZWxzZSB7XG4gICAgICBjb25zdCBwYWRTZXR1cCA9IGBcbiAgICAgICAgJHtkdHlwZX0gc291cmNlID0gcmM7XG4gICAgICAgICR7ZHR5cGV9IGx0ID0gJHtkdHlwZX0obGVzc1RoYW4oc291cmNlLCBzdGFydCkpO1xuICAgICAgICAke2R0eXBlfSBndGUgPSAke2R0eXBlfShncmVhdGVyVGhhbkVxdWFsKHNvdXJjZSwgZW5kKSk7XG4gICAgICAgICR7ZHR5cGV9IG9yaWcgPSAxIC0gKGx0ICsgZ3RlKTtcbiAgICAgICAgc291cmNlID0gb3JpZyAqIHNvdXJjZSArXG4gICAgICAgICAgICAgICAgbHQgKiAoc3RhcnQgKiAyIC0gc291cmNlIC0gJHtvZmZzZXR9KSArXG4gICAgICAgICAgICAgICAgZ3RlICogKChlbmQgLSAxKSAqIDIgLSBzb3VyY2UgKyAke29mZnNldH0pO1xuICAgICAgICBzb3VyY2UgLT0gc3RhcnQ7XG4gICAgICBgO1xuXG4gICAgICBtYWluTG9vcCA9IGBcbiAgICAgICAgJHtkdHlwZX0gcmMgPSBvdXRwdXRMb2M7XG4gICAgICAgICR7cGFkU2V0dXB9XG4gICAgICAgIHJlc3VsdFswXSA9IGdldENoYW5uZWwoZ2V0WCgke3NvdXJjZS5qb2luKCl9KSwgJHtpbm5lckRpbXN9KTtcbiAgICAgICAgJHtjb29yZHNbcmFuayAtIDFdfSArPSAxO1xuICAgICAgICBpZigke2NMaW1pdH0pIHtcbiAgICAgICAgICAke3BhZFNldHVwfVxuICAgICAgICAgIHJlc3VsdFsxXSA9IGdldENoYW5uZWwoZ2V0WCgke3NvdXJjZS5qb2luKCl9KSwgJHtpbm5lckRpbXN9KTtcbiAgICAgICAgfVxuICAgICAgICByYyA9IG91dHB1dExvYztcbiAgICAgICAgJHtjb29yZHNbcmFuayAtIDJdfSArPSAxO1xuICAgICAgICBpZigke2Nvb3Jkc1tyYW5rIC0gMl19IDwgJHt0aGlzLm91dHB1dFNoYXBlW3JhbmsgLSAyXX0pIHtcbiAgICAgICAgICAke3BhZFNldHVwfVxuICAgICAgICAgIHJlc3VsdFsyXSA9IGdldENoYW5uZWwoZ2V0WCgke3NvdXJjZS5qb2luKCl9KSwgJHtpbm5lckRpbXN9KTtcbiAgICAgICAgICAke2Nvb3Jkc1tyYW5rIC0gMV19ICs9IDE7XG4gICAgICAgICAgaWYoJHtjTGltaXR9KSB7XG4gICAgICAgICAgICAke3BhZFNldHVwfVxuICAgICAgICAgICAgcmVzdWx0WzNdID0gZ2V0Q2hhbm5lbChnZXRYKCR7c291cmNlLmpvaW4oKX0pLCAke2lubmVyRGltc30pO1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgYDtcbiAgICB9XG5cbiAgICB0aGlzLnVzZXJDb2RlID0gYFxuICAgICAgY29uc3QgJHtkdHlwZX0gc3RhcnQgPSAke2R0eXBlfSgke3N0YXJ0fSk7XG4gICAgICBjb25zdCAke2R0eXBlfSBlbmQgPSAke2R0eXBlfSgke2VuZH0pO1xuXG4gICAgICB2b2lkIG1haW4oKSB7XG4gICAgICAgICR7ZHR5cGV9IG91dHB1dExvYyA9IGdldE91dHB1dENvb3JkcygpO1xuICAgICAgICB2ZWM0IHJlc3VsdCA9IHZlYzQoMC4pO1xuICAgICAgICAke21haW5Mb29wfVxuICAgICAgICBzZXRPdXRwdXQocmVzdWx0KTtcbiAgICAgIH1cbiAgICBgO1xuICB9XG59XG4iXX0=","/**\n * @license\n * Copyright 2020 Google LLC. All Rights Reserved.\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n * =============================================================================\n */\nimport { env, MirrorPad } from '@tensorflow/tfjs-core';\nimport { MirrorPadProgram } from '../mirror_pad_gpu';\nimport { MirrorPadPackedProgram } from '../mirror_pad_packed_gpu';\nexport const mirrorPadKernelFunc = ({ inputs, backend, attrs }) => {\n const { x } = inputs;\n const { paddings, mode } = attrs;\n const program = env().getBool('WEBGL_PACK_ARRAY_OPERATIONS') ?\n new MirrorPadPackedProgram(x.shape, paddings, mode) :\n new MirrorPadProgram(x.shape, paddings, mode);\n const output = backend.runWebGLProgram(program, [x], x.dtype);\n return output;\n};\nexport const mirrorPadConfig = {\n kernelName: MirrorPad,\n backendName: 'webgl',\n kernelFunc: mirrorPadKernelFunc,\n};\n//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiTWlycm9yUGFkLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vLi4vdGZqcy1iYWNrZW5kLXdlYmdsL3NyYy9rZXJuZWxzL01pcnJvclBhZC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQTs7Ozs7Ozs7Ozs7Ozs7O0dBZUc7QUFFSCxPQUFPLEVBQUMsR0FBRyxFQUE0QixTQUFTLEVBQThDLE1BQU0sdUJBQXVCLENBQUM7QUFHNUgsT0FBTyxFQUFDLGdCQUFnQixFQUFDLE1BQU0sbUJBQW1CLENBQUM7QUFDbkQsT0FBTyxFQUFDLHNCQUFzQixFQUFDLE1BQU0sMEJBQTBCLENBQUM7QUFFaEUsTUFBTSxDQUFDLE1BQU0sbUJBQW1CLEdBSWIsQ0FBQyxFQUFDLE1BQU0sRUFBRSxPQUFPLEVBQUUsS0FBSyxFQUFDLEVBQUUsRUFBRTtJQUM5QyxNQUFNLEVBQUMsQ0FBQyxFQUFDLEdBQUcsTUFBTSxDQUFDO0lBQ25CLE1BQU0sRUFBQyxRQUFRLEVBQUUsSUFBSSxFQUFDLEdBQUcsS0FBSyxDQUFDO0lBRS9CLE1BQU0sT0FBTyxHQUFHLEdBQUcsRUFBRSxDQUFDLE9BQU8sQ0FBQyw2QkFBNkIsQ0FBQyxDQUFDLENBQUM7UUFDMUQsSUFBSSxzQkFBc0IsQ0FBQyxDQUFDLENBQUMsS0FBSyxFQUFFLFFBQVEsRUFBRSxJQUFJLENBQUMsQ0FBQyxDQUFDO1FBQ3JELElBQUksZ0JBQWdCLENBQUMsQ0FBQyxDQUFDLEtBQUssRUFBRSxRQUFRLEVBQUUsSUFBSSxDQUFDLENBQUM7SUFFbEQsTUFBTSxNQUFNLEdBQUcsT0FBTyxDQUFDLGVBQWUsQ0FBQyxPQUFPLEVBQUUsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsS0FBSyxDQUFDLENBQUM7SUFFOUQsT0FBTyxNQUFNLENBQUM7QUFDaEIsQ0FBQyxDQUFDO0FBRUYsTUFBTSxDQUFDLE1BQU0sZUFBZSxHQUFpQjtJQUMzQyxVQUFVLEVBQUUsU0FBUztJQUNyQixXQUFXLEVBQUUsT0FBTztJQUNwQixVQUFVLEVBQUUsbUJBQXVDO0NBQ3BELENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyIvKipcbiAqIEBsaWNlbnNlXG4gKiBDb3B5cmlnaHQgMjAyMCBHb29nbGUgTExDLiBBbGwgUmlnaHRzIFJlc2VydmVkLlxuICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlIFwiTGljZW5zZVwiKTtcbiAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS5cbiAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdFxuICpcbiAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMFxuICpcbiAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmVcbiAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuIFwiQVMgSVNcIiBCQVNJUyxcbiAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLlxuICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZFxuICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuXG4gKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuICovXG5cbmltcG9ydCB7ZW52LCBLZXJuZWxDb25maWcsIEtlcm5lbEZ1bmMsIE1pcnJvclBhZCwgTWlycm9yUGFkQXR0cnMsIE1pcnJvclBhZElucHV0cywgVGVuc29ySW5mb30gZnJvbSAnQHRlbnNvcmZsb3cvdGZqcy1jb3JlJztcblxuaW1wb3J0IHtNYXRoQmFja2VuZFdlYkdMfSBmcm9tICcuLi9iYWNrZW5kX3dlYmdsJztcbmltcG9ydCB7TWlycm9yUGFkUHJvZ3JhbX0gZnJvbSAnLi4vbWlycm9yX3BhZF9ncHUnO1xuaW1wb3J0IHtNaXJyb3JQYWRQYWNrZWRQcm9ncmFtfSBmcm9tICcuLi9taXJyb3JfcGFkX3BhY2tlZF9ncHUnO1xuXG5leHBvcnQgY29uc3QgbWlycm9yUGFkS2VybmVsRnVuYzogKHBhcmFtczoge1xuICBpbnB1dHM6IE1pcnJvclBhZElucHV0cyxcbiAgYmFja2VuZDogTWF0aEJhY2tlbmRXZWJHTCxcbiAgYXR0cnM6IE1pcnJvclBhZEF0dHJzXG59KSA9PiBUZW5zb3JJbmZvID0gKHtpbnB1dHMsIGJhY2tlbmQsIGF0dHJzfSkgPT4ge1xuICBjb25zdCB7eH0gPSBpbnB1dHM7XG4gIGNvbnN0IHtwYWRkaW5ncywgbW9kZX0gPSBhdHRycztcblxuICBjb25zdCBwcm9ncmFtID0gZW52KCkuZ2V0Qm9vbCgnV0VCR0xfUEFDS19BUlJBWV9PUEVSQVRJT05TJykgP1xuICAgICAgbmV3IE1pcnJvclBhZFBhY2tlZFByb2dyYW0oeC5zaGFwZSwgcGFkZGluZ3MsIG1vZGUpIDpcbiAgICAgIG5ldyBNaXJyb3JQYWRQcm9ncmFtKHguc2hhcGUsIHBhZGRpbmdzLCBtb2RlKTtcblxuICBjb25zdCBvdXRwdXQgPSBiYWNrZW5kLnJ1bldlYkdMUHJvZ3JhbShwcm9ncmFtLCBbeF0sIHguZHR5cGUpO1xuXG4gIHJldHVybiBvdXRwdXQ7XG59O1xuXG5leHBvcnQgY29uc3QgbWlycm9yUGFkQ29uZmlnOiBLZXJuZWxDb25maWcgPSB7XG4gIGtlcm5lbE5hbWU6IE1pcnJvclBhZCxcbiAgYmFja2VuZE5hbWU6ICd3ZWJnbCcsXG4gIGtlcm5lbEZ1bmM6IG1pcnJvclBhZEtlcm5lbEZ1bmMgYXMge30gYXMgS2VybmVsRnVuYyxcbn07XG4iXX0=","/**\n * @license\n * Copyright 2020 Google LLC. All Rights Reserved.\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n * =============================================================================\n */\nimport { Mod } from '@tensorflow/tfjs-core';\nimport { CHECK_NAN_SNIPPET_PACKED } from '../binaryop_packed_gpu';\nimport { binaryKernelFunc } from '../kernel_utils/kernel_funcs_utils';\nconst MOD = `if (b == 0.0) return NAN;\n return mod(a, b);`;\nconst MOD_PACKED = `\n vec4 result = mod(a, b);\n bvec4 isNaN = equal(b, vec4(0.0));\n ` +\n CHECK_NAN_SNIPPET_PACKED + `\n return result;\n`;\nexport const mod = binaryKernelFunc({\n opSnippet: MOD,\n packedOpSnippet: MOD_PACKED,\n});\nexport const modConfig = {\n kernelName: Mod,\n backendName: 'webgl',\n kernelFunc: mod\n};\n//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiTW9kLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vLi4vdGZqcy1iYWNrZW5kLXdlYmdsL3NyYy9rZXJuZWxzL01vZC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQTs7Ozs7Ozs7Ozs7Ozs7O0dBZUc7QUFFSCxPQUFPLEVBQTJCLEdBQUcsRUFBQyxNQUFNLHVCQUF1QixDQUFDO0FBRXBFLE9BQU8sRUFBQyx3QkFBd0IsRUFBQyxNQUFNLHdCQUF3QixDQUFDO0FBQ2hFLE9BQU8sRUFBQyxnQkFBZ0IsRUFBQyxNQUFNLG9DQUFvQyxDQUFDO0FBRXBFLE1BQU0sR0FBRyxHQUFHO29CQUNRLENBQUM7QUFFckIsTUFBTSxVQUFVLEdBQUc7OztHQUdoQjtJQUNDLHdCQUF3QixHQUFHOztDQUU5QixDQUFDO0FBRUYsTUFBTSxDQUFDLE1BQU0sR0FBRyxHQUFHLGdCQUFnQixDQUFDO0lBQ2xDLFNBQVMsRUFBRSxHQUFHO0lBQ2QsZUFBZSxFQUFFLFVBQVU7Q0FDNUIsQ0FBQyxDQUFDO0FBRUgsTUFBTSxDQUFDLE1BQU0sU0FBUyxHQUFpQjtJQUNyQyxVQUFVLEVBQUUsR0FBRztJQUNmLFdBQVcsRUFBRSxPQUFPO0lBQ3BCLFVBQVUsRUFBRSxHQUF1QjtDQUNwQyxDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiLyoqXG4gKiBAbGljZW5zZVxuICogQ29weXJpZ2h0IDIwMjAgR29vZ2xlIExMQy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC5cbiAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSBcIkxpY2Vuc2VcIik7XG4gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuXG4gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXRcbiAqXG4gKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjBcbiAqXG4gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlXG4gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiBcIkFTIElTXCIgQkFTSVMsXG4gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC5cbiAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmRcbiAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLlxuICogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbiAqL1xuXG5pbXBvcnQge0tlcm5lbENvbmZpZywgS2VybmVsRnVuYywgTW9kfSBmcm9tICdAdGVuc29yZmxvdy90ZmpzLWNvcmUnO1xuXG5pbXBvcnQge0NIRUNLX05BTl9TTklQUEVUX1BBQ0tFRH0gZnJvbSAnLi4vYmluYXJ5b3BfcGFja2VkX2dwdSc7XG5pbXBvcnQge2JpbmFyeUtlcm5lbEZ1bmN9IGZyb20gJy4uL2tlcm5lbF91dGlscy9rZXJuZWxfZnVuY3NfdXRpbHMnO1xuXG5jb25zdCBNT0QgPSBgaWYgKGIgPT0gMC4wKSByZXR1cm4gTkFOO1xuICByZXR1cm4gbW9kKGEsIGIpO2A7XG5cbmNvbnN0IE1PRF9QQUNLRUQgPSBgXG4gIHZlYzQgcmVzdWx0ID0gbW9kKGEsIGIpO1xuICBidmVjNCBpc05hTiA9IGVxdWFsKGIsIHZlYzQoMC4wKSk7XG4gIGAgK1xuICAgIENIRUNLX05BTl9TTklQUEVUX1BBQ0tFRCArIGBcbiAgcmV0dXJuIHJlc3VsdDtcbmA7XG5cbmV4cG9ydCBjb25zdCBtb2QgPSBiaW5hcnlLZXJuZWxGdW5jKHtcbiAgb3BTbmlwcGV0OiBNT0QsXG4gIHBhY2tlZE9wU25pcHBldDogTU9EX1BBQ0tFRCxcbn0pO1xuXG5leHBvcnQgY29uc3QgbW9kQ29uZmlnOiBLZXJuZWxDb25maWcgPSB7XG4gIGtlcm5lbE5hbWU6IE1vZCxcbiAgYmFja2VuZE5hbWU6ICd3ZWJnbCcsXG4gIGtlcm5lbEZ1bmM6IG1vZCBhcyB7fSBhcyBLZXJuZWxGdW5jXG59O1xuIl19","/**\n * @license\n * Copyright 2017 Google LLC. All Rights Reserved.\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n * =============================================================================\n */\nexport class MultinomialProgram {\n constructor(batchSize, numOutcomes, numSamples) {\n this.variableNames = ['probs'];\n this.customUniforms = [{ name: 'seed', type: 'float' }];\n this.outputShape = [batchSize, numSamples];\n this.userCode = `\n void main() {\n ivec2 coords = getOutputCoords();\n int batch = coords[0];\n\n float r = random(seed);\n float cdf = 0.0;\n\n for (int i = 0; i < ${numOutcomes - 1}; i++) {\n cdf += getProbs(batch, i);\n\n if (r < cdf) {\n setOutput(float(i));\n return;\n }\n }\n\n // If no other event happened, last event happened.\n setOutput(float(${numOutcomes - 1}));\n }\n `;\n }\n}\n//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibXVsdGlub21pYWxfZ3B1LmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vdGZqcy1iYWNrZW5kLXdlYmdsL3NyYy9tdWx0aW5vbWlhbF9ncHUudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUE7Ozs7Ozs7Ozs7Ozs7OztHQWVHO0FBS0gsTUFBTSxPQUFPLGtCQUFrQjtJQU03QixZQUFZLFNBQWlCLEVBQUUsV0FBbUIsRUFBRSxVQUFrQjtRQUx0RSxrQkFBYSxHQUFHLENBQUMsT0FBTyxDQUFDLENBQUM7UUFHMUIsbUJBQWMsR0FBRyxDQUFDLEVBQUMsSUFBSSxFQUFFLE1BQU0sRUFBRSxJQUFJLEVBQUUsT0FBc0IsRUFBQyxDQUFDLENBQUM7UUFHOUQsSUFBSSxDQUFDLFdBQVcsR0FBRyxDQUFDLFNBQVMsRUFBRSxVQUFVLENBQUMsQ0FBQztRQUUzQyxJQUFJLENBQUMsUUFBUSxHQUFHOzs7Ozs7Ozs4QkFRVSxXQUFXLEdBQUcsQ0FBQzs7Ozs7Ozs7OzswQkFVbkIsV0FBVyxHQUFHLENBQUM7O0tBRXBDLENBQUM7SUFDSixDQUFDO0NBQ0YiLCJzb3VyY2VzQ29udGVudCI6WyIvKipcbiAqIEBsaWNlbnNlXG4gKiBDb3B5cmlnaHQgMjAxNyBHb29nbGUgTExDLiBBbGwgUmlnaHRzIFJlc2VydmVkLlxuICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlIFwiTGljZW5zZVwiKTtcbiAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS5cbiAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdFxuICpcbiAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMFxuICpcbiAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmVcbiAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuIFwiQVMgSVNcIiBCQVNJUyxcbiAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLlxuICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZFxuICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuXG4gKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuICovXG5cbmltcG9ydCB7R1BHUFVQcm9ncmFtfSBmcm9tICcuL2dwZ3B1X21hdGgnO1xuaW1wb3J0IHtVbmlmb3JtVHlwZX0gZnJvbSAnLi9zaGFkZXJfY29tcGlsZXInO1xuXG5leHBvcnQgY2xhc3MgTXVsdGlub21pYWxQcm9ncmFtIGltcGxlbWVudHMgR1BHUFVQcm9ncmFtIHtcbiAgdmFyaWFibGVOYW1lcyA9IFsncHJvYnMnXTtcbiAgb3V0cHV0U2hhcGU6IG51bWJlcltdO1xuICB1c2VyQ29kZTogc3RyaW5nO1xuICBjdXN0b21Vbmlmb3JtcyA9IFt7bmFtZTogJ3NlZWQnLCB0eXBlOiAnZmxvYXQnIGFzIFVuaWZvcm1UeXBlfV07XG5cbiAgY29uc3RydWN0b3IoYmF0Y2hTaXplOiBudW1iZXIsIG51bU91dGNvbWVzOiBudW1iZXIsIG51bVNhbXBsZXM6IG51bWJlcikge1xuICAgIHRoaXMub3V0cHV0U2hhcGUgPSBbYmF0Y2hTaXplLCBudW1TYW1wbGVzXTtcblxuICAgIHRoaXMudXNlckNvZGUgPSBgXG4gICAgICB2b2lkIG1haW4oKSB7XG4gICAgICAgIGl2ZWMyIGNvb3JkcyA9IGdldE91dHB1dENvb3JkcygpO1xuICAgICAgICBpbnQgYmF0Y2ggPSBjb29yZHNbMF07XG5cbiAgICAgICAgZmxvYXQgciA9IHJhbmRvbShzZWVkKTtcbiAgICAgICAgZmxvYXQgY2RmID0gMC4wO1xuXG4gICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgJHtudW1PdXRjb21lcyAtIDF9OyBpKyspIHtcbiAgICAgICAgICBjZGYgKz0gZ2V0UHJvYnMoYmF0Y2gsIGkpO1xuXG4gICAgICAgICAgaWYgKHIgPCBjZGYpIHtcbiAgICAgICAgICAgIHNldE91dHB1dChmbG9hdChpKSk7XG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgICAgfVxuICAgICAgICB9XG5cbiAgICAgICAgLy8gSWYgbm8gb3RoZXIgZXZlbnQgaGFwcGVuZWQsIGxhc3QgZXZlbnQgaGFwcGVuZWQuXG4gICAgICAgIHNldE91dHB1dChmbG9hdCgke251bU91dGNvbWVzIC0gMX0pKTtcbiAgICAgIH1cbiAgICBgO1xuICB9XG59XG4iXX0=","/**\n * @license\n * Copyright 2020 Google LLC. All Rights Reserved.\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n * =============================================================================\n */\nimport { RealDiv } from '@tensorflow/tfjs-core';\nimport { binaryKernelFunc } from '../kernel_utils/kernel_funcs_utils';\n// Without the equality check div produces 0.9999 for a = b, which when\n// floored can cause errors.\nconst DIV = `\nif (a == b) {\n return 1.0;\n};\nreturn a / b;`;\n// We do the same as in ./binaryop_gpu, with vec4 and ivec4.\n// On Linux, the vectorized implementation produces NaNs when a and b are 0.\nconst DIV_PACKED = `\n // vec4 one = vec4(equal(a, b));\n // return one + (vec4(1.0) - one) * a / b;\n vec4 result = a / b;\n if(a.x == b.x) {\n result.x = 1.;\n }\n if(a.y == b.y) {\n result.y = 1.;\n }\n if(a.z == b.z) {\n result.z = 1.;\n }\n if(a.w == b.w) {\n result.w = 1.;\n }\n\n return result;\n`;\nexport const realDiv = binaryKernelFunc({ opSnippet: DIV, packedOpSnippet: DIV_PACKED, checkOutOfBounds: true });\nexport const realDivConfig = {\n kernelName: RealDiv,\n backendName: 'webgl',\n kernelFunc: realDiv,\n};\n//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiUmVhbERpdi5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uLy4uL3RmanMtYmFja2VuZC13ZWJnbC9zcmMva2VybmVscy9SZWFsRGl2LnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBOzs7Ozs7Ozs7Ozs7Ozs7R0FlRztBQUVILE9BQU8sRUFBQyxPQUFPLEVBQUMsTUFBTSx1QkFBdUIsQ0FBQztBQUU5QyxPQUFPLEVBQUMsZ0JBQWdCLEVBQUMsTUFBTSxvQ0FBb0MsQ0FBQztBQUVwRSx1RUFBdUU7QUFDdkUsNEJBQTRCO0FBQzVCLE1BQU0sR0FBRyxHQUFHOzs7O2NBSUUsQ0FBQztBQUVmLDREQUE0RDtBQUM1RCw0RUFBNEU7QUFDNUUsTUFBTSxVQUFVLEdBQUc7Ozs7Ozs7Ozs7Ozs7Ozs7OztDQWtCbEIsQ0FBQztBQUVGLE1BQU0sQ0FBQyxNQUFNLE9BQU8sR0FBRyxnQkFBZ0IsQ0FDbkMsRUFBQyxTQUFTLEVBQUUsR0FBRyxFQUFFLGVBQWUsRUFBRSxVQUFVLEVBQUUsZ0JBQWdCLEVBQUUsSUFBSSxFQUFDLENBQUMsQ0FBQztBQUUzRSxNQUFNLENBQUMsTUFBTSxhQUFhLEdBQWlCO0lBQ3pDLFVBQVUsRUFBRSxPQUFPO0lBQ25CLFdBQVcsRUFBRSxPQUFPO0lBQ3BCLFVBQVUsRUFBRSxPQUFPO0NBQ3BCLENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyIvKipcbiAqIEBsaWNlbnNlXG4gKiBDb3B5cmlnaHQgMjAyMCBHb29nbGUgTExDLiBBbGwgUmlnaHRzIFJlc2VydmVkLlxuICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlIFwiTGljZW5zZVwiKTtcbiAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS5cbiAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdFxuICpcbiAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMFxuICpcbiAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmVcbiAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuIFwiQVMgSVNcIiBCQVNJUyxcbiAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLlxuICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZFxuICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuXG4gKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuICovXG5cbmltcG9ydCB7UmVhbERpdn0gZnJvbSAnQHRlbnNvcmZsb3cvdGZqcy1jb3JlJztcbmltcG9ydCB7S2VybmVsQ29uZmlnfSBmcm9tICdAdGVuc29yZmxvdy90ZmpzLWNvcmUnO1xuaW1wb3J0IHtiaW5hcnlLZXJuZWxGdW5jfSBmcm9tICcuLi9rZXJuZWxfdXRpbHMva2VybmVsX2Z1bmNzX3V0aWxzJztcblxuLy8gV2l0aG91dCB0aGUgZXF1YWxpdHkgY2hlY2sgZGl2IHByb2R1Y2VzIDAuOTk5OSBmb3IgYSA9IGIsIHdoaWNoIHdoZW5cbi8vIGZsb29yZWQgY2FuIGNhdXNlIGVycm9ycy5cbmNvbnN0IERJViA9IGBcbmlmIChhID09IGIpIHtcbiAgcmV0dXJuIDEuMDtcbn07XG5yZXR1cm4gYSAvIGI7YDtcblxuLy8gV2UgZG8gdGhlIHNhbWUgYXMgaW4gLi9iaW5hcnlvcF9ncHUsIHdpdGggdmVjNCBhbmQgaXZlYzQuXG4vLyBPbiBMaW51eCwgdGhlIHZlY3Rvcml6ZWQgaW1wbGVtZW50YXRpb24gcHJvZHVjZXMgTmFOcyB3aGVuIGEgYW5kIGIgYXJlIDAuXG5jb25zdCBESVZfUEFDS0VEID0gYFxuICAvLyB2ZWM0IG9uZSA9IHZlYzQoZXF1YWwoYSwgYikpO1xuICAvLyByZXR1cm4gb25lICsgKHZlYzQoMS4wKSAtIG9uZSkgKiBhIC8gYjtcbiAgdmVjNCByZXN1bHQgPSBhIC8gYjtcbiAgaWYoYS54ID09IGIueCkge1xuICAgIHJlc3VsdC54ID0gMS47XG4gIH1cbiAgaWYoYS55ID09IGIueSkge1xuICAgIHJlc3VsdC55ID0gMS47XG4gIH1cbiAgaWYoYS56ID09IGIueikge1xuICAgIHJlc3VsdC56ID0gMS47XG4gIH1cbiAgaWYoYS53ID09IGIudykge1xuICAgIHJlc3VsdC53ID0gMS47XG4gIH1cblxuICByZXR1cm4gcmVzdWx0O1xuYDtcblxuZXhwb3J0IGNvbnN0IHJlYWxEaXYgPSBiaW5hcnlLZXJuZWxGdW5jKFxuICAgIHtvcFNuaXBwZXQ6IERJViwgcGFja2VkT3BTbmlwcGV0OiBESVZfUEFDS0VELCBjaGVja091dE9mQm91bmRzOiB0cnVlfSk7XG5cbmV4cG9ydCBjb25zdCByZWFsRGl2Q29uZmlnOiBLZXJuZWxDb25maWcgPSB7XG4gIGtlcm5lbE5hbWU6IFJlYWxEaXYsXG4gIGJhY2tlbmROYW1lOiAnd2ViZ2wnLFxuICBrZXJuZWxGdW5jOiByZWFsRGl2LFxufTtcbiJdfQ==","/**\n * @license\n * Copyright 2020 Google LLC. All Rights Reserved.\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n * =============================================================================\n */\nimport { Sub } from '@tensorflow/tfjs-core';\nimport { binaryKernelFunc } from '../kernel_utils/kernel_funcs_utils';\nimport { subImplCPU as cpuSub } from '../kernel_utils/shared';\nconst SUB = 'return a - b;';\nexport const sub = binaryKernelFunc({\n opSnippet: SUB,\n packedOpSnippet: SUB,\n supportsComplex: true,\n cpuKernelImpl: cpuSub\n});\nexport const subConfig = {\n kernelName: Sub,\n backendName: 'webgl',\n kernelFunc: sub\n};\n//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiU3ViLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vLi4vdGZqcy1iYWNrZW5kLXdlYmdsL3NyYy9rZXJuZWxzL1N1Yi50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQTs7Ozs7Ozs7Ozs7Ozs7O0dBZUc7QUFFSCxPQUFPLEVBQWUsR0FBRyxFQUFDLE1BQU0sdUJBQXVCLENBQUM7QUFFeEQsT0FBTyxFQUFDLGdCQUFnQixFQUFDLE1BQU0sb0NBQW9DLENBQUM7QUFDcEUsT0FBTyxFQUFDLFVBQVUsSUFBSSxNQUFNLEVBQUMsTUFBTSx3QkFBd0IsQ0FBQztBQUU1RCxNQUFNLEdBQUcsR0FBRyxlQUFlLENBQUM7QUFFNUIsTUFBTSxDQUFDLE1BQU0sR0FBRyxHQUFHLGdCQUFnQixDQUFDO0lBQ2xDLFNBQVMsRUFBRSxHQUFHO0lBQ2QsZUFBZSxFQUFFLEdBQUc7SUFDcEIsZUFBZSxFQUFFLElBQUk7SUFDckIsYUFBYSxFQUFFLE1BQU07Q0FDdEIsQ0FBQyxDQUFDO0FBRUgsTUFBTSxDQUFDLE1BQU0sU0FBUyxHQUFpQjtJQUNyQyxVQUFVLEVBQUUsR0FBRztJQUNmLFdBQVcsRUFBRSxPQUFPO0lBQ3BCLFVBQVUsRUFBRSxHQUFHO0NBQ2hCLENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyIvKipcbiAqIEBsaWNlbnNlXG4gKiBDb3B5cmlnaHQgMjAyMCBHb29nbGUgTExDLiBBbGwgUmlnaHRzIFJlc2VydmVkLlxuICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlIFwiTGljZW5zZVwiKTtcbiAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS5cbiAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdFxuICpcbiAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMFxuICpcbiAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmVcbiAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuIFwiQVMgSVNcIiBCQVNJUyxcbiAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLlxuICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZFxuICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuXG4gKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuICovXG5cbmltcG9ydCB7S2VybmVsQ29uZmlnLCBTdWJ9IGZyb20gJ0B0ZW5zb3JmbG93L3RmanMtY29yZSc7XG5cbmltcG9ydCB7YmluYXJ5S2VybmVsRnVuY30gZnJvbSAnLi4va2VybmVsX3V0aWxzL2tlcm5lbF9mdW5jc191dGlscyc7XG5pbXBvcnQge3N1YkltcGxDUFUgYXMgY3B1U3VifSBmcm9tICcuLi9rZXJuZWxfdXRpbHMvc2hhcmVkJztcblxuY29uc3QgU1VCID0gJ3JldHVybiBhIC0gYjsnO1xuXG5leHBvcnQgY29uc3Qgc3ViID0gYmluYXJ5S2VybmVsRnVuYyh7XG4gIG9wU25pcHBldDogU1VCLFxuICBwYWNrZWRPcFNuaXBwZXQ6IFNVQixcbiAgc3VwcG9ydHNDb21wbGV4OiB0cnVlLFxuICBjcHVLZXJuZWxJbXBsOiBjcHVTdWJcbn0pO1xuXG5leHBvcnQgY29uc3Qgc3ViQ29uZmlnOiBLZXJuZWxDb25maWcgPSB7XG4gIGtlcm5lbE5hbWU6IFN1YixcbiAgYmFja2VuZE5hbWU6ICd3ZWJnbCcsXG4gIGtlcm5lbEZ1bmM6IHN1YlxufTtcbiJdfQ==","/**\n * @license\n * Copyright 2020 Google LLC. All Rights Reserved.\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n * =============================================================================\n */\nimport { backend_util, Softmax, util } from '@tensorflow/tfjs-core';\nimport { exp } from './Exp';\nimport { max } from './Max';\nimport { realDiv } from './RealDiv';\nimport { reshape } from './Reshape';\nimport { sub } from './Sub';\nimport { sum } from './Sum';\nexport function softmax(args) {\n const { inputs, backend, attrs } = args;\n const { logits } = inputs;\n const { dim } = attrs;\n const axes = util.parseAxisParam([dim], logits.shape);\n const maxLogit = max({\n inputs: { x: logits },\n backend,\n attrs: { reductionIndices: axes, keepDims: false }\n });\n const expandedShape = backend_util.expandShapeToKeepDim(maxLogit.shape, axes);\n const maxLogitsReshaped = reshape({ inputs: { x: maxLogit }, backend, attrs: { shape: expandedShape } });\n const a = sub({ inputs: { a: logits, b: maxLogitsReshaped }, backend });\n const b = exp({ inputs: { x: a }, backend });\n const sumExp = sum({ inputs: { x: b }, backend, attrs: { axis: axes, keepDims: false } });\n const sumExpReshaped = reshape({ inputs: { x: sumExp }, backend, attrs: { shape: expandedShape } });\n const res = realDiv({ inputs: { a: b, b: sumExpReshaped }, backend });\n backend.disposeIntermediateTensorInfo(maxLogit);\n backend.disposeIntermediateTensorInfo(maxLogitsReshaped);\n backend.disposeIntermediateTensorInfo(a);\n backend.disposeIntermediateTensorInfo(b);\n backend.disposeIntermediateTensorInfo(sumExp);\n backend.disposeIntermediateTensorInfo(sumExpReshaped);\n return res;\n}\nexport const softmaxConfig = {\n kernelName: Softmax,\n backendName: 'webgl',\n kernelFunc: softmax\n};\n//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiU29mdG1heC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uLy4uL3RmanMtYmFja2VuZC13ZWJnbC9zcmMva2VybmVscy9Tb2Z0bWF4LnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBOzs7Ozs7Ozs7Ozs7Ozs7R0FlRztBQUVILE9BQU8sRUFBQyxZQUFZLEVBQTRCLE9BQU8sRUFBMkMsSUFBSSxFQUFDLE1BQU0sdUJBQXVCLENBQUM7QUFJckksT0FBTyxFQUFDLEdBQUcsRUFBQyxNQUFNLE9BQU8sQ0FBQztBQUMxQixPQUFPLEVBQUMsR0FBRyxFQUFDLE1BQU0sT0FBTyxDQUFDO0FBQzFCLE9BQU8sRUFBQyxPQUFPLEVBQUMsTUFBTSxXQUFXLENBQUM7QUFDbEMsT0FBTyxFQUFDLE9BQU8sRUFBQyxNQUFNLFdBQVcsQ0FBQztBQUNsQyxPQUFPLEVBQUMsR0FBRyxFQUFDLE1BQU0sT0FBTyxDQUFDO0FBQzFCLE9BQU8sRUFBQyxHQUFHLEVBQUMsTUFBTSxPQUFPLENBQUM7QUFFMUIsTUFBTSxVQUFVLE9BQU8sQ0FBQyxJQUl2QjtJQUNDLE1BQU0sRUFBQyxNQUFNLEVBQUUsT0FBTyxFQUFFLEtBQUssRUFBQyxHQUFHLElBQUksQ0FBQztJQUN0QyxNQUFNLEVBQUMsTUFBTSxFQUFDLEdBQUcsTUFBTSxDQUFDO0lBQ3hCLE1BQU0sRUFBQyxHQUFHLEVBQUMsR0FBRyxLQUFLLENBQUM7SUFFcEIsTUFBTSxJQUFJLEdBQUcsSUFBSSxDQUFDLGNBQWMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxFQUFFLE1BQU0sQ0FBQyxLQUFLLENBQUMsQ0FBQztJQUV0RCxNQUFNLFFBQVEsR0FBRyxHQUFHLENBQUM7UUFDbkIsTUFBTSxFQUFFLEVBQUMsQ0FBQyxFQUFFLE1BQU0sRUFBQztRQUNuQixPQUFPO1FBQ1AsS0FBSyxFQUFFLEVBQUMsZ0JBQWdCLEVBQUUsSUFBSSxFQUFFLFFBQVEsRUFBRSxLQUFLLEVBQUM7S0FDakQsQ0FBQyxDQUFDO0lBRUgsTUFBTSxhQUFhLEdBQUcsWUFBWSxDQUFDLG9CQUFvQixDQUFDLFFBQVEsQ0FBQyxLQUFLLEVBQUUsSUFBSSxDQUFDLENBQUM7SUFFOUUsTUFBTSxpQkFBaUIsR0FDbkIsT0FBTyxDQUFDLEVBQUMsTUFBTSxFQUFFLEVBQUMsQ0FBQyxFQUFFLFFBQVEsRUFBQyxFQUFFLE9BQU8sRUFBRSxLQUFLLEVBQUUsRUFBQyxLQUFLLEVBQUUsYUFBYSxFQUFDLEVBQUMsQ0FBQyxDQUFDO0lBQzdFLE1BQU0sQ0FBQyxHQUNILEdBQUcsQ0FBQyxFQUFDLE1BQU0sRUFBRSxFQUFDLENBQUMsRUFBRSxNQUFNLEVBQUUsQ0FBQyxFQUFFLGlCQUFpQixFQUFDLEVBQUUsT0FBTyxFQUFDLENBQWUsQ0FBQztJQUM1RSxNQUFNLENBQUMsR0FBRyxHQUFHLENBQUMsRUFBQyxNQUFNLEVBQUUsRUFBQyxDQUFDLEVBQUUsQ0FBQyxFQUFDLEVBQUUsT0FBTyxFQUFDLENBQWUsQ0FBQztJQUN2RCxNQUFNLE1BQU0sR0FDUixHQUFHLENBQUMsRUFBQyxNQUFNLEVBQUUsRUFBQyxDQUFDLEVBQUUsQ0FBQyxFQUFDLEVBQUUsT0FBTyxFQUFFLEtBQUssRUFBRSxFQUFDLElBQUksRUFBRSxJQUFJLEVBQUUsUUFBUSxFQUFFLEtBQUssRUFBQyxFQUFDLENBQUMsQ0FBQztJQUN6RSxNQUFNLGNBQWMsR0FDaEIsT0FBTyxDQUFDLEVBQUMsTUFBTSxFQUFFLEVBQUMsQ0FBQyxFQUFFLE1BQU0sRUFBQyxFQUFFLE9BQU8sRUFBRSxLQUFLLEVBQUUsRUFBQyxLQUFLLEVBQUUsYUFBYSxFQUFDLEVBQUMsQ0FBQyxDQUFDO0lBRTNFLE1BQU0sR0FBRyxHQUNMLE9BQU8sQ0FBQyxFQUFDLE1BQU0sRUFBRSxFQUFDLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLGNBQWMsRUFBQyxFQUFFLE9BQU8sRUFBQyxDQUFlLENBQUM7SUFFeEUsT0FBTyxDQUFDLDZCQUE2QixDQUFDLFFBQVEsQ0FBQyxDQUFDO0lBQ2hELE9BQU8sQ0FBQyw2QkFBNkIsQ0FBQyxpQkFBaUIsQ0FBQyxDQUFDO0lBQ3pELE9BQU8sQ0FBQyw2QkFBNkIsQ0FBQyxDQUFDLENBQUMsQ0FBQztJQUN6QyxPQUFPLENBQUMsNkJBQTZCLENBQUMsQ0FBQyxDQUFDLENBQUM7SUFDekMsT0FBTyxDQUFDLDZCQUE2QixDQUFDLE1BQU0sQ0FBQyxDQUFDO0lBQzlDLE9BQU8sQ0FBQyw2QkFBNkIsQ0FBQyxjQUFjLENBQUMsQ0FBQztJQUV0RCxPQUFPLEdBQUcsQ0FBQztBQUNiLENBQUM7QUFFRCxNQUFNLENBQUMsTUFBTSxhQUFhLEdBQWlCO0lBQ3pDLFVBQVUsRUFBRSxPQUFPO0lBQ25CLFdBQVcsRUFBRSxPQUFPO0lBQ3BCLFVBQVUsRUFBRSxPQUEyQjtDQUN4QyxDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiLyoqXG4gKiBAbGljZW5zZVxuICogQ29weXJpZ2h0IDIwMjAgR29vZ2xlIExMQy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC5cbiAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSBcIkxpY2Vuc2VcIik7XG4gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuXG4gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXRcbiAqXG4gKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjBcbiAqXG4gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlXG4gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiBcIkFTIElTXCIgQkFTSVMsXG4gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC5cbiAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmRcbiAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLlxuICogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbiAqL1xuXG5pbXBvcnQge2JhY2tlbmRfdXRpbCwgS2VybmVsQ29uZmlnLCBLZXJuZWxGdW5jLCBTb2Z0bWF4LCBTb2Z0bWF4QXR0cnMsIFNvZnRtYXhJbnB1dHMsIFRlbnNvckluZm8sIHV0aWx9IGZyb20gJ0B0ZW5zb3JmbG93L3RmanMtY29yZSc7XG5cbmltcG9ydCB7TWF0aEJhY2tlbmRXZWJHTH0gZnJvbSAnLi4vYmFja2VuZF93ZWJnbCc7XG5cbmltcG9ydCB7ZXhwfSBmcm9tICcuL0V4cCc7XG5pbXBvcnQge21heH0gZnJvbSAnLi9NYXgnO1xuaW1wb3J0IHtyZWFsRGl2fSBmcm9tICcuL1JlYWxEaXYnO1xuaW1wb3J0IHtyZXNoYXBlfSBmcm9tICcuL1Jlc2hhcGUnO1xuaW1wb3J0IHtzdWJ9IGZyb20gJy4vU3ViJztcbmltcG9ydCB7c3VtfSBmcm9tICcuL1N1bSc7XG5cbmV4cG9ydCBmdW5jdGlvbiBzb2Z0bWF4KGFyZ3M6IHtcbiAgaW5wdXRzOiBTb2Z0bWF4SW5wdXRzLFxuICBiYWNrZW5kOiBNYXRoQmFja2VuZFdlYkdMLFxuICBhdHRyczogU29mdG1heEF0dHJzXG59KTogVGVuc29ySW5mbyB7XG4gIGNvbnN0IHtpbnB1dHMsIGJhY2tlbmQsIGF0dHJzfSA9IGFyZ3M7XG4gIGNvbnN0IHtsb2dpdHN9ID0gaW5wdXRzO1xuICBjb25zdCB7ZGltfSA9IGF0dHJzO1xuXG4gIGNvbnN0IGF4ZXMgPSB1dGlsLnBhcnNlQXhpc1BhcmFtKFtkaW1dLCBsb2dpdHMuc2hhcGUpO1xuXG4gIGNvbnN0IG1heExvZ2l0ID0gbWF4KHtcbiAgICBpbnB1dHM6IHt4OiBsb2dpdHN9LFxuICAgIGJhY2tlbmQsXG4gICAgYXR0cnM6IHtyZWR1Y3Rpb25JbmRpY2VzOiBheGVzLCBrZWVwRGltczogZmFsc2V9XG4gIH0pO1xuXG4gIGNvbnN0IGV4cGFuZGVkU2hhcGUgPSBiYWNrZW5kX3V0aWwuZXhwYW5kU2hhcGVUb0tlZXBEaW0obWF4TG9naXQuc2hhcGUsIGF4ZXMpO1xuXG4gIGNvbnN0IG1heExvZ2l0c1Jlc2hhcGVkID1cbiAgICAgIHJlc2hhcGUoe2lucHV0czoge3g6IG1heExvZ2l0fSwgYmFja2VuZCwgYXR0cnM6IHtzaGFwZTogZXhwYW5kZWRTaGFwZX19KTtcbiAgY29uc3QgYSA9XG4gICAgICBzdWIoe2lucHV0czoge2E6IGxvZ2l0cywgYjogbWF4TG9naXRzUmVzaGFwZWR9LCBiYWNrZW5kfSkgYXMgVGVuc29ySW5mbztcbiAgY29uc3QgYiA9IGV4cCh7aW5wdXRzOiB7eDogYX0sIGJhY2tlbmR9KSBhcyBUZW5zb3JJbmZvO1xuICBjb25zdCBzdW1FeHAgPVxuICAgICAgc3VtKHtpbnB1dHM6IHt4OiBifSwgYmFja2VuZCwgYXR0cnM6IHtheGlzOiBheGVzLCBrZWVwRGltczogZmFsc2V9fSk7XG4gIGNvbnN0IHN1bUV4cFJlc2hhcGVkID1cbiAgICAgIHJlc2hhcGUoe2lucHV0czoge3g6IHN1bUV4cH0sIGJhY2tlbmQsIGF0dHJzOiB7c2hhcGU6IGV4cGFuZGVkU2hhcGV9fSk7XG5cbiAgY29uc3QgcmVzID1cbiAgICAgIHJlYWxEaXYoe2lucHV0czoge2E6IGIsIGI6IHN1bUV4cFJlc2hhcGVkfSwgYmFja2VuZH0pIGFzIFRlbnNvckluZm87XG5cbiAgYmFja2VuZC5kaXNwb3NlSW50ZXJtZWRpYXRlVGVuc29ySW5mbyhtYXhMb2dpdCk7XG4gIGJhY2tlbmQuZGlzcG9zZUludGVybWVkaWF0ZVRlbnNvckluZm8obWF4TG9naXRzUmVzaGFwZWQpO1xuICBiYWNrZW5kLmRpc3Bvc2VJbnRlcm1lZGlhdGVUZW5zb3JJbmZvKGEpO1xuICBiYWNrZW5kLmRpc3Bvc2VJbnRlcm1lZGlhdGVUZW5zb3JJbmZvKGIpO1xuICBiYWNrZW5kLmRpc3Bvc2VJbnRlcm1lZGlhdGVUZW5zb3JJbmZvKHN1bUV4cCk7XG4gIGJhY2tlbmQuZGlzcG9zZUludGVybWVkaWF0ZVRlbnNvckluZm8oc3VtRXhwUmVzaGFwZWQpO1xuXG4gIHJldHVybiByZXM7XG59XG5cbmV4cG9ydCBjb25zdCBzb2Z0bWF4Q29uZmlnOiBLZXJuZWxDb25maWcgPSB7XG4gIGtlcm5lbE5hbWU6IFNvZnRtYXgsXG4gIGJhY2tlbmROYW1lOiAnd2ViZ2wnLFxuICBrZXJuZWxGdW5jOiBzb2Z0bWF4IGFzIHt9IGFzIEtlcm5lbEZ1bmNcbn07XG4iXX0=","/**\n * @license\n * Copyright 2020 Google LLC. All Rights Reserved.\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n * =============================================================================\n */\nimport { Multinomial } from '@tensorflow/tfjs-core';\nimport { MultinomialProgram } from '../multinomial_gpu';\nimport { softmax } from './Softmax';\nexport function multinomial(args) {\n const { inputs, backend, attrs } = args;\n const { logits } = inputs;\n const { numSamples, seed, normalized } = attrs;\n const probs = normalized ?\n logits :\n softmax({ inputs: { logits }, backend, attrs: { dim: logits.shape.length - 1 } });\n const batchSize = probs.shape[0];\n const numOutcomes = probs.shape[1];\n const program = new MultinomialProgram(batchSize, numOutcomes, numSamples);\n const customValues = [[seed]];\n const res = backend.runWebGLProgram(program, [probs], 'int32', customValues);\n if (!normalized) {\n backend.disposeIntermediateTensorInfo(probs);\n }\n return res;\n}\nexport const multinomialConfig = {\n kernelName: Multinomial,\n backendName: 'webgl',\n kernelFunc: multinomial\n};\n//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiTXVsdGlub21pYWwuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi8uLi90ZmpzLWJhY2tlbmQtd2ViZ2wvc3JjL2tlcm5lbHMvTXVsdGlub21pYWwudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUE7Ozs7Ozs7Ozs7Ozs7OztHQWVHO0FBRUgsT0FBTyxFQUEyQixXQUFXLEVBQWtELE1BQU0sdUJBQXVCLENBQUM7QUFHN0gsT0FBTyxFQUFDLGtCQUFrQixFQUFDLE1BQU0sb0JBQW9CLENBQUM7QUFFdEQsT0FBTyxFQUFDLE9BQU8sRUFBQyxNQUFNLFdBQVcsQ0FBQztBQUVsQyxNQUFNLFVBQVUsV0FBVyxDQUFDLElBSTNCO0lBQ0MsTUFBTSxFQUFDLE1BQU0sRUFBRSxPQUFPLEVBQUUsS0FBSyxFQUFDLEdBQUcsSUFBSSxDQUFDO0lBQ3RDLE1BQU0sRUFBQyxNQUFNLEVBQUMsR0FBRyxNQUFNLENBQUM7SUFDeEIsTUFBTSxFQUFDLFVBQVUsRUFBRSxJQUFJLEVBQUUsVUFBVSxFQUFDLEdBQUcsS0FBSyxDQUFDO0lBRTdDLE1BQU0sS0FBSyxHQUFHLFVBQVUsQ0FBQyxDQUFDO1FBQ3RCLE1BQU0sQ0FBQyxDQUFDO1FBQ1IsT0FBTyxDQUNILEVBQUMsTUFBTSxFQUFFLEVBQUMsTUFBTSxFQUFDLEVBQUUsT0FBTyxFQUFFLEtBQUssRUFBRSxFQUFDLEdBQUcsRUFBRSxNQUFNLENBQUMsS0FBSyxDQUFDLE1BQU0sR0FBRyxDQUFDLEVBQUMsRUFBQyxDQUFDLENBQUM7SUFDNUUsTUFBTSxTQUFTLEdBQUcsS0FBSyxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUMsQ0FBQztJQUNqQyxNQUFNLFdBQVcsR0FBRyxLQUFLLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQyxDQUFDO0lBQ25DLE1BQU0sT0FBTyxHQUFHLElBQUksa0JBQWtCLENBQUMsU0FBUyxFQUFFLFdBQVcsRUFBRSxVQUFVLENBQUMsQ0FBQztJQUMzRSxNQUFNLFlBQVksR0FBRyxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQztJQUM5QixNQUFNLEdBQUcsR0FBRyxPQUFPLENBQUMsZUFBZSxDQUFDLE9BQU8sRUFBRSxDQUFDLEtBQUssQ0FBQyxFQUFFLE9BQU8sRUFBRSxZQUFZLENBQUMsQ0FBQztJQUM3RSxJQUFJLENBQUMsVUFBVSxFQUFFO1FBQ2YsT0FBTyxDQUFDLDZCQUE2QixDQUFDLEtBQUssQ0FBQyxDQUFDO0tBQzlDO0lBQ0QsT0FBTyxHQUFHLENBQUM7QUFDYixDQUFDO0FBRUQsTUFBTSxDQUFDLE1BQU0saUJBQWlCLEdBQWlCO0lBQzdDLFVBQVUsRUFBRSxXQUFXO0lBQ3ZCLFdBQVcsRUFBRSxPQUFPO0lBQ3BCLFVBQVUsRUFBRSxXQUErQjtDQUM1QyxDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiLyoqXG4gKiBAbGljZW5zZVxuICogQ29weXJpZ2h0IDIwMjAgR29vZ2xlIExMQy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC5cbiAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSBcIkxpY2Vuc2VcIik7XG4gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuXG4gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXRcbiAqXG4gKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjBcbiAqXG4gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlXG4gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiBcIkFTIElTXCIgQkFTSVMsXG4gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC5cbiAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmRcbiAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLlxuICogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbiAqL1xuXG5pbXBvcnQge0tlcm5lbENvbmZpZywgS2VybmVsRnVuYywgTXVsdGlub21pYWwsIE11bHRpbm9taWFsQXR0cnMsIE11bHRpbm9taWFsSW5wdXRzLCBUZW5zb3JJbmZvfSBmcm9tICdAdGVuc29yZmxvdy90ZmpzLWNvcmUnO1xuXG5pbXBvcnQge01hdGhCYWNrZW5kV2ViR0x9IGZyb20gJy4uL2JhY2tlbmRfd2ViZ2wnO1xuaW1wb3J0IHtNdWx0aW5vbWlhbFByb2dyYW19IGZyb20gJy4uL211bHRpbm9taWFsX2dwdSc7XG5cbmltcG9ydCB7c29mdG1heH0gZnJvbSAnLi9Tb2Z0bWF4JztcblxuZXhwb3J0IGZ1bmN0aW9uIG11bHRpbm9taWFsKGFyZ3M6IHtcbiAgaW5wdXRzOiBNdWx0aW5vbWlhbElucHV0cyxcbiAgYmFja2VuZDogTWF0aEJhY2tlbmRXZWJHTCxcbiAgYXR0cnM6IE11bHRpbm9taWFsQXR0cnNcbn0pOiBUZW5zb3JJbmZvIHtcbiAgY29uc3Qge2lucHV0cywgYmFja2VuZCwgYXR0cnN9ID0gYXJncztcbiAgY29uc3Qge2xvZ2l0c30gPSBpbnB1dHM7XG4gIGNvbnN0IHtudW1TYW1wbGVzLCBzZWVkLCBub3JtYWxpemVkfSA9IGF0dHJzO1xuXG4gIGNvbnN0IHByb2JzID0gbm9ybWFsaXplZCA/XG4gICAgICBsb2dpdHMgOlxuICAgICAgc29mdG1heChcbiAgICAgICAgICB7aW5wdXRzOiB7bG9naXRzfSwgYmFja2VuZCwgYXR0cnM6IHtkaW06IGxvZ2l0cy5zaGFwZS5sZW5ndGggLSAxfX0pO1xuICBjb25zdCBiYXRjaFNpemUgPSBwcm9icy5zaGFwZVswXTtcbiAgY29uc3QgbnVtT3V0Y29tZXMgPSBwcm9icy5zaGFwZVsxXTtcbiAgY29uc3QgcHJvZ3JhbSA9IG5ldyBNdWx0aW5vbWlhbFByb2dyYW0oYmF0Y2hTaXplLCBudW1PdXRjb21lcywgbnVtU2FtcGxlcyk7XG4gIGNvbnN0IGN1c3RvbVZhbHVlcyA9IFtbc2VlZF1dO1xuICBjb25zdCByZXMgPSBiYWNrZW5kLnJ1bldlYkdMUHJvZ3JhbShwcm9ncmFtLCBbcHJvYnNdLCAnaW50MzInLCBjdXN0b21WYWx1ZXMpO1xuICBpZiAoIW5vcm1hbGl6ZWQpIHtcbiAgICBiYWNrZW5kLmRpc3Bvc2VJbnRlcm1lZGlhdGVUZW5zb3JJbmZvKHByb2JzKTtcbiAgfVxuICByZXR1cm4gcmVzO1xufVxuXG5leHBvcnQgY29uc3QgbXVsdGlub21pYWxDb25maWc6IEtlcm5lbENvbmZpZyA9IHtcbiAga2VybmVsTmFtZTogTXVsdGlub21pYWwsXG4gIGJhY2tlbmROYW1lOiAnd2ViZ2wnLFxuICBrZXJuZWxGdW5jOiBtdWx0aW5vbWlhbCBhcyB7fSBhcyBLZXJuZWxGdW5jXG59O1xuIl19","/**\n * @license\n * Copyright 2020 Google LLC. All Rights Reserved.\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n * =============================================================================\n */\nimport { env, Neg } from '@tensorflow/tfjs-core';\nimport { negImplCPU } from '../kernel_utils/shared';\nimport { CHECK_NAN_SNIPPET, UnaryOpProgram } from '../unaryop_gpu';\nimport { UnaryOpPackedProgram } from '../unaryop_packed_gpu';\nconst NEG = CHECK_NAN_SNIPPET + `\n return -x;\n`;\nconst NEG_PACKED = `\n vec4 result = -x;\n bvec4 isNaN = isnan(x);\n\n result.r = isNaN.r ? x.r : result.r;\n result.g = isNaN.g ? x.g : result.g;\n result.b = isNaN.b ? x.b : result.b;\n result.a = isNaN.a ? x.a : result.a;\n\n return result;\n`;\n// This doesn't use unaryKernelFunc because negImplCPU is not of type\n// SimpleUnaryKernelImplCPU.\nexport function neg(args) {\n const { inputs, backend } = args;\n const { x } = inputs;\n if (backend.shouldExecuteOnCPU([x])) {\n const xData = backend.texData.get(x.dataId);\n const [outValues, newShape] = negImplCPU(xData.values, x.shape, x.dtype);\n return backend.makeTensorInfo(newShape, x.dtype, outValues);\n }\n let program;\n if (env().getBool('WEBGL_PACK_UNARY_OPERATIONS')) {\n program = new UnaryOpPackedProgram(x.shape, NEG_PACKED);\n }\n else {\n program = new UnaryOpProgram(x.shape, NEG);\n }\n return backend.runWebGLProgram(program, [x], x.dtype);\n}\nexport const negConfig = {\n kernelName: Neg,\n backendName: 'webgl',\n kernelFunc: neg\n};\n//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiTmVnLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vLi4vdGZqcy1iYWNrZW5kLXdlYmdsL3NyYy9rZXJuZWxzL05lZy50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQTs7Ozs7Ozs7Ozs7Ozs7O0dBZUc7QUFFSCxPQUFPLEVBQUMsR0FBRyxFQUE0QixHQUFHLEVBQW9DLE1BQU0sdUJBQXVCLENBQUM7QUFHNUcsT0FBTyxFQUFDLFVBQVUsRUFBQyxNQUFNLHdCQUF3QixDQUFDO0FBQ2xELE9BQU8sRUFBQyxpQkFBaUIsRUFBRSxjQUFjLEVBQUMsTUFBTSxnQkFBZ0IsQ0FBQztBQUNqRSxPQUFPLEVBQUMsb0JBQW9CLEVBQUMsTUFBTSx1QkFBdUIsQ0FBQztBQUUzRCxNQUFNLEdBQUcsR0FBRyxpQkFBaUIsR0FBRzs7Q0FFL0IsQ0FBQztBQUVGLE1BQU0sVUFBVSxHQUFHOzs7Ozs7Ozs7O0NBVWxCLENBQUM7QUFFRixxRUFBcUU7QUFDckUsNEJBQTRCO0FBQzVCLE1BQU0sVUFBVSxHQUFHLENBQUMsSUFBb0Q7SUFFdEUsTUFBTSxFQUFDLE1BQU0sRUFBRSxPQUFPLEVBQUMsR0FBRyxJQUFJLENBQUM7SUFDL0IsTUFBTSxFQUFDLENBQUMsRUFBQyxHQUFHLE1BQU0sQ0FBQztJQUVuQixJQUFJLE9BQU8sQ0FBQyxrQkFBa0IsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLEVBQUU7UUFDbkMsTUFBTSxLQUFLLEdBQUcsT0FBTyxDQUFDLE9BQU8sQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLE1BQU0sQ0FBQyxDQUFDO1FBQzVDLE1BQU0sQ0FBQyxTQUFTLEVBQUUsUUFBUSxDQUFDLEdBQ3ZCLFVBQVUsQ0FBQyxLQUFLLENBQUMsTUFBb0IsRUFBRSxDQUFDLENBQUMsS0FBSyxFQUFFLENBQUMsQ0FBQyxLQUFLLENBQUMsQ0FBQztRQUM3RCxPQUFPLE9BQU8sQ0FBQyxjQUFjLENBQUMsUUFBUSxFQUFFLENBQUMsQ0FBQyxLQUFLLEVBQUUsU0FBUyxDQUFDLENBQUM7S0FDN0Q7SUFFRCxJQUFJLE9BQTRDLENBQUM7SUFDakQsSUFBSSxHQUFHLEVBQUUsQ0FBQyxPQUFPLENBQUMsNkJBQTZCLENBQUMsRUFBRTtRQUNoRCxPQUFPLEdBQUcsSUFBSSxvQkFBb0IsQ0FBQyxDQUFDLENBQUMsS0FBSyxFQUFFLFVBQVUsQ0FBQyxDQUFDO0tBQ3pEO1NBQU07UUFDTCxPQUFPLEdBQUcsSUFBSSxjQUFjLENBQUMsQ0FBQyxDQUFDLEtBQUssRUFBRSxHQUFHLENBQUMsQ0FBQztLQUM1QztJQUVELE9BQU8sT0FBTyxDQUFDLGVBQWUsQ0FBQyxPQUFPLEVBQUUsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsS0FBSyxDQUFDLENBQUM7QUFDeEQsQ0FBQztBQUVELE1BQU0sQ0FBQyxNQUFNLFNBQVMsR0FBaUI7SUFDckMsVUFBVSxFQUFFLEdBQUc7SUFDZixXQUFXLEVBQUUsT0FBTztJQUNwQixVQUFVLEVBQUUsR0FBdUI7Q0FDcEMsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbIi8qKlxuICogQGxpY2Vuc2VcbiAqIENvcHlyaWdodCAyMDIwIEdvb2dsZSBMTEMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuXG4gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgXCJMaWNlbnNlXCIpO1xuICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLlxuICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0XG4gKlxuICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wXG4gKlxuICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZVxuICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gXCJBUyBJU1wiIEJBU0lTLFxuICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuXG4gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kXG4gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS5cbiAqID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4gKi9cblxuaW1wb3J0IHtlbnYsIEtlcm5lbENvbmZpZywgS2VybmVsRnVuYywgTmVnLCBOZWdJbnB1dHMsIFRlbnNvckluZm8sIFR5cGVkQXJyYXl9IGZyb20gJ0B0ZW5zb3JmbG93L3RmanMtY29yZSc7XG5cbmltcG9ydCB7TWF0aEJhY2tlbmRXZWJHTH0gZnJvbSAnLi4vYmFja2VuZF93ZWJnbCc7XG5pbXBvcnQge25lZ0ltcGxDUFV9IGZyb20gJy4uL2tlcm5lbF91dGlscy9zaGFyZWQnO1xuaW1wb3J0IHtDSEVDS19OQU5fU05JUFBFVCwgVW5hcnlPcFByb2dyYW19IGZyb20gJy4uL3VuYXJ5b3BfZ3B1JztcbmltcG9ydCB7VW5hcnlPcFBhY2tlZFByb2dyYW19IGZyb20gJy4uL3VuYXJ5b3BfcGFja2VkX2dwdSc7XG5cbmNvbnN0IE5FRyA9IENIRUNLX05BTl9TTklQUEVUICsgYFxuICByZXR1cm4gLXg7XG5gO1xuXG5jb25zdCBORUdfUEFDS0VEID0gYFxuICB2ZWM0IHJlc3VsdCA9IC14O1xuICBidmVjNCBpc05hTiA9IGlzbmFuKHgpO1xuXG4gIHJlc3VsdC5yID0gaXNOYU4uciA/IHguciA6IHJlc3VsdC5yO1xuICByZXN1bHQuZyA9IGlzTmFOLmcgPyB4LmcgOiByZXN1bHQuZztcbiAgcmVzdWx0LmIgPSBpc05hTi5iID8geC5iIDogcmVzdWx0LmI7XG4gIHJlc3VsdC5hID0gaXNOYU4uYSA/IHguYSA6IHJlc3VsdC5hO1xuXG4gIHJldHVybiByZXN1bHQ7XG5gO1xuXG4vLyBUaGlzIGRvZXNuJ3QgdXNlIHVuYXJ5S2VybmVsRnVuYyBiZWNhdXNlIG5lZ0ltcGxDUFUgaXMgbm90IG9mIHR5cGVcbi8vIFNpbXBsZVVuYXJ5S2VybmVsSW1wbENQVS5cbmV4cG9ydCBmdW5jdGlvbiBuZWcoYXJnczoge2lucHV0czogTmVnSW5wdXRzLCBiYWNrZW5kOiBNYXRoQmFja2VuZFdlYkdMfSk6XG4gICAgVGVuc29ySW5mbyB7XG4gIGNvbnN0IHtpbnB1dHMsIGJhY2tlbmR9ID0gYXJncztcbiAgY29uc3Qge3h9ID0gaW5wdXRzO1xuXG4gIGlmIChiYWNrZW5kLnNob3VsZEV4ZWN1dGVPbkNQVShbeF0pKSB7XG4gICAgY29uc3QgeERhdGEgPSBiYWNrZW5kLnRleERhdGEuZ2V0KHguZGF0YUlkKTtcbiAgICBjb25zdCBbb3V0VmFsdWVzLCBuZXdTaGFwZV0gPVxuICAgICAgICBuZWdJbXBsQ1BVKHhEYXRhLnZhbHVlcyBhcyBUeXBlZEFycmF5LCB4LnNoYXBlLCB4LmR0eXBlKTtcbiAgICByZXR1cm4gYmFja2VuZC5tYWtlVGVuc29ySW5mbyhuZXdTaGFwZSwgeC5kdHlwZSwgb3V0VmFsdWVzKTtcbiAgfVxuXG4gIGxldCBwcm9ncmFtOiBVbmFyeU9wUHJvZ3JhbXxVbmFyeU9wUGFja2VkUHJvZ3JhbTtcbiAgaWYgKGVudigpLmdldEJvb2woJ1dFQkdMX1BBQ0tfVU5BUllfT1BFUkFUSU9OUycpKSB7XG4gICAgcHJvZ3JhbSA9IG5ldyBVbmFyeU9wUGFja2VkUHJvZ3JhbSh4LnNoYXBlLCBORUdfUEFDS0VEKTtcbiAgfSBlbHNlIHtcbiAgICBwcm9ncmFtID0gbmV3IFVuYXJ5T3BQcm9ncmFtKHguc2hhcGUsIE5FRyk7XG4gIH1cblxuICByZXR1cm4gYmFja2VuZC5ydW5XZWJHTFByb2dyYW0ocHJvZ3JhbSwgW3hdLCB4LmR0eXBlKTtcbn1cblxuZXhwb3J0IGNvbnN0IG5lZ0NvbmZpZzogS2VybmVsQ29uZmlnID0ge1xuICBrZXJuZWxOYW1lOiBOZWcsXG4gIGJhY2tlbmROYW1lOiAnd2ViZ2wnLFxuICBrZXJuZWxGdW5jOiBuZWcgYXMge30gYXMgS2VybmVsRnVuY1xufTtcbiJdfQ==","/**\n * @license\n * Copyright 2020 Google LLC. All Rights Reserved.\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n * =============================================================================\n */\nimport { backend_util, kernel_impls, NonMaxSuppressionV3 } from '@tensorflow/tfjs-core';\nconst nonMaxSuppressionV3Impl = kernel_impls.nonMaxSuppressionV3Impl;\nexport function nonMaxSuppressionV3(args) {\n backend_util.warn('tf.nonMaxSuppression() in webgl locks the UI thread. ' +\n 'Call tf.nonMaxSuppressionAsync() instead');\n const { inputs, backend, attrs } = args;\n const { boxes, scores } = inputs;\n const { maxOutputSize, iouThreshold, scoreThreshold } = attrs;\n const boxesVals = backend.readSync(boxes.dataId);\n const scoresVals = backend.readSync(scores.dataId);\n const { selectedIndices } = nonMaxSuppressionV3Impl(boxesVals, scoresVals, maxOutputSize, iouThreshold, scoreThreshold);\n return backend.makeTensorInfo([selectedIndices.length], 'int32', new Int32Array(selectedIndices));\n}\nexport const nonMaxSuppressionV3Config = {\n kernelName: NonMaxSuppressionV3,\n backendName: 'webgl',\n kernelFunc: nonMaxSuppressionV3\n};\n//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiTm9uTWF4U3VwcHJlc3Npb25WMy5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uLy4uL3RmanMtYmFja2VuZC13ZWJnbC9zcmMva2VybmVscy9Ob25NYXhTdXBwcmVzc2lvblYzLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBOzs7Ozs7Ozs7Ozs7Ozs7R0FlRztBQUVILE9BQU8sRUFBQyxZQUFZLEVBQUUsWUFBWSxFQUE0QixtQkFBbUIsRUFBa0UsTUFBTSx1QkFBdUIsQ0FBQztBQUVqTCxNQUFNLHVCQUF1QixHQUFHLFlBQVksQ0FBQyx1QkFBdUIsQ0FBQztBQUdyRSxNQUFNLFVBQVUsbUJBQW1CLENBQUMsSUFJbkM7SUFDQyxZQUFZLENBQUMsSUFBSSxDQUNiLHVEQUF1RDtRQUN2RCwwQ0FBMEMsQ0FBQyxDQUFDO0lBRWhELE1BQU0sRUFBQyxNQUFNLEVBQUUsT0FBTyxFQUFFLEtBQUssRUFBQyxHQUFHLElBQUksQ0FBQztJQUN0QyxNQUFNLEVBQUMsS0FBSyxFQUFFLE1BQU0sRUFBQyxHQUFHLE1BQU0sQ0FBQztJQUMvQixNQUFNLEVBQUMsYUFBYSxFQUFFLFlBQVksRUFBRSxjQUFjLEVBQUMsR0FBRyxLQUFLLENBQUM7SUFFNUQsTUFBTSxTQUFTLEdBQUcsT0FBTyxDQUFDLFFBQVEsQ0FBQyxLQUFLLENBQUMsTUFBTSxDQUFlLENBQUM7SUFDL0QsTUFBTSxVQUFVLEdBQUcsT0FBTyxDQUFDLFFBQVEsQ0FBQyxNQUFNLENBQUMsTUFBTSxDQUFlLENBQUM7SUFFakUsTUFBTSxFQUFDLGVBQWUsRUFBQyxHQUFHLHVCQUF1QixDQUM3QyxTQUFTLEVBQUUsVUFBVSxFQUFFLGFBQWEsRUFBRSxZQUFZLEVBQUUsY0FBYyxDQUFDLENBQUM7SUFFeEUsT0FBTyxPQUFPLENBQUMsY0FBYyxDQUN6QixDQUFDLGVBQWUsQ0FBQyxNQUFNLENBQUMsRUFBRSxPQUFPLEVBQUUsSUFBSSxVQUFVLENBQUMsZUFBZSxDQUFDLENBQUMsQ0FBQztBQUMxRSxDQUFDO0FBRUQsTUFBTSxDQUFDLE1BQU0seUJBQXlCLEdBQWlCO0lBQ3JELFVBQVUsRUFBRSxtQkFBbUI7SUFDL0IsV0FBVyxFQUFFLE9BQU87SUFDcEIsVUFBVSxFQUFFLG1CQUF1QztDQUNwRCxDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiLyoqXG4gKiBAbGljZW5zZVxuICogQ29weXJpZ2h0IDIwMjAgR29vZ2xlIExMQy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC5cbiAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSBcIkxpY2Vuc2VcIik7XG4gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuXG4gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXRcbiAqXG4gKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjBcbiAqXG4gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlXG4gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiBcIkFTIElTXCIgQkFTSVMsXG4gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC5cbiAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmRcbiAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLlxuICogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbiAqL1xuXG5pbXBvcnQge2JhY2tlbmRfdXRpbCwga2VybmVsX2ltcGxzLCBLZXJuZWxDb25maWcsIEtlcm5lbEZ1bmMsIE5vbk1heFN1cHByZXNzaW9uVjMsIE5vbk1heFN1cHByZXNzaW9uVjNBdHRycywgTm9uTWF4U3VwcHJlc3Npb25WM0lucHV0cywgVHlwZWRBcnJheX0gZnJvbSAnQHRlbnNvcmZsb3cvdGZqcy1jb3JlJztcblxuY29uc3Qgbm9uTWF4U3VwcHJlc3Npb25WM0ltcGwgPSBrZXJuZWxfaW1wbHMubm9uTWF4U3VwcHJlc3Npb25WM0ltcGw7XG5pbXBvcnQge01hdGhCYWNrZW5kV2ViR0x9IGZyb20gJy4uL2JhY2tlbmRfd2ViZ2wnO1xuXG5leHBvcnQgZnVuY3Rpb24gbm9uTWF4U3VwcHJlc3Npb25WMyhhcmdzOiB7XG4gIGlucHV0czogTm9uTWF4U3VwcHJlc3Npb25WM0lucHV0cyxcbiAgYmFja2VuZDogTWF0aEJhY2tlbmRXZWJHTCxcbiAgYXR0cnM6IE5vbk1heFN1cHByZXNzaW9uVjNBdHRyc1xufSkge1xuICBiYWNrZW5kX3V0aWwud2FybihcbiAgICAgICd0Zi5ub25NYXhTdXBwcmVzc2lvbigpIGluIHdlYmdsIGxvY2tzIHRoZSBVSSB0aHJlYWQuICcgK1xuICAgICAgJ0NhbGwgdGYubm9uTWF4U3VwcHJlc3Npb25Bc3luYygpIGluc3RlYWQnKTtcblxuICBjb25zdCB7aW5wdXRzLCBiYWNrZW5kLCBhdHRyc30gPSBhcmdzO1xuICBjb25zdCB7Ym94ZXMsIHNjb3Jlc30gPSBpbnB1dHM7XG4gIGNvbnN0IHttYXhPdXRwdXRTaXplLCBpb3VUaHJlc2hvbGQsIHNjb3JlVGhyZXNob2xkfSA9IGF0dHJzO1xuXG4gIGNvbnN0IGJveGVzVmFscyA9IGJhY2tlbmQucmVhZFN5bmMoYm94ZXMuZGF0YUlkKSBhcyBUeXBlZEFycmF5O1xuICBjb25zdCBzY29yZXNWYWxzID0gYmFja2VuZC5yZWFkU3luYyhzY29yZXMuZGF0YUlkKSBhcyBUeXBlZEFycmF5O1xuXG4gIGNvbnN0IHtzZWxlY3RlZEluZGljZXN9ID0gbm9uTWF4U3VwcHJlc3Npb25WM0ltcGwoXG4gICAgICBib3hlc1ZhbHMsIHNjb3Jlc1ZhbHMsIG1heE91dHB1dFNpemUsIGlvdVRocmVzaG9sZCwgc2NvcmVUaHJlc2hvbGQpO1xuXG4gIHJldHVybiBiYWNrZW5kLm1ha2VUZW5zb3JJbmZvKFxuICAgICAgW3NlbGVjdGVkSW5kaWNlcy5sZW5ndGhdLCAnaW50MzInLCBuZXcgSW50MzJBcnJheShzZWxlY3RlZEluZGljZXMpKTtcbn1cblxuZXhwb3J0IGNvbnN0IG5vbk1heFN1cHByZXNzaW9uVjNDb25maWc6IEtlcm5lbENvbmZpZyA9IHtcbiAga2VybmVsTmFtZTogTm9uTWF4U3VwcHJlc3Npb25WMyxcbiAgYmFja2VuZE5hbWU6ICd3ZWJnbCcsXG4gIGtlcm5lbEZ1bmM6IG5vbk1heFN1cHByZXNzaW9uVjMgYXMge30gYXMgS2VybmVsRnVuY1xufTtcbiJdfQ==","/**\n * @license\n * Copyright 2020 Google LLC. All Rights Reserved.\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n * =============================================================================\n */\nimport { backend_util, kernel_impls, NonMaxSuppressionV4 } from '@tensorflow/tfjs-core';\nconst nonMaxSuppressionV4Impl = kernel_impls.nonMaxSuppressionV4Impl;\nexport function nonMaxSuppressionV4(args) {\n backend_util.warn('tf.nonMaxSuppression() in webgl locks the UI thread. ' +\n 'Call tf.nonMaxSuppressionAsync() instead');\n const { inputs, backend, attrs } = args;\n const { boxes, scores } = inputs;\n const { maxOutputSize, iouThreshold, scoreThreshold, padToMaxOutputSize } = attrs;\n const boxesVals = backend.readSync(boxes.dataId);\n const scoresVals = backend.readSync(scores.dataId);\n const { selectedIndices, validOutputs } = nonMaxSuppressionV4Impl(boxesVals, scoresVals, maxOutputSize, iouThreshold, scoreThreshold, padToMaxOutputSize);\n return [\n backend.makeTensorInfo([selectedIndices.length], 'int32', new Int32Array(selectedIndices)),\n backend.makeTensorInfo([], 'int32', new Int32Array([validOutputs]))\n ];\n}\nexport const nonMaxSuppressionV4Config = {\n kernelName: NonMaxSuppressionV4,\n backendName: 'webgl',\n kernelFunc: nonMaxSuppressionV4\n};\n//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiTm9uTWF4U3VwcHJlc3Npb25WNC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uLy4uL3RmanMtYmFja2VuZC13ZWJnbC9zcmMva2VybmVscy9Ob25NYXhTdXBwcmVzc2lvblY0LnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBOzs7Ozs7Ozs7Ozs7Ozs7R0FlRztBQUVILE9BQU8sRUFBQyxZQUFZLEVBQUUsWUFBWSxFQUE0QixtQkFBbUIsRUFBOEUsTUFBTSx1QkFBdUIsQ0FBQztBQUM3TCxNQUFNLHVCQUF1QixHQUFHLFlBQVksQ0FBQyx1QkFBdUIsQ0FBQztBQUlyRSxNQUFNLFVBQVUsbUJBQW1CLENBQUMsSUFJbkM7SUFDQyxZQUFZLENBQUMsSUFBSSxDQUNiLHVEQUF1RDtRQUN2RCwwQ0FBMEMsQ0FBQyxDQUFDO0lBRWhELE1BQU0sRUFBQyxNQUFNLEVBQUUsT0FBTyxFQUFFLEtBQUssRUFBQyxHQUFHLElBQUksQ0FBQztJQUN0QyxNQUFNLEVBQUMsS0FBSyxFQUFFLE1BQU0sRUFBQyxHQUFHLE1BQU0sQ0FBQztJQUMvQixNQUFNLEVBQUMsYUFBYSxFQUFFLFlBQVksRUFBRSxjQUFjLEVBQUUsa0JBQWtCLEVBQUMsR0FDbkUsS0FBSyxDQUFDO0lBRVYsTUFBTSxTQUFTLEdBQUcsT0FBTyxDQUFDLFFBQVEsQ0FBQyxLQUFLLENBQUMsTUFBTSxDQUFlLENBQUM7SUFDL0QsTUFBTSxVQUFVLEdBQUcsT0FBTyxDQUFDLFFBQVEsQ0FBQyxNQUFNLENBQUMsTUFBTSxDQUFlLENBQUM7SUFFakUsTUFBTSxFQUFDLGVBQWUsRUFBRSxZQUFZLEVBQUMsR0FBRyx1QkFBdUIsQ0FDM0QsU0FBUyxFQUFFLFVBQVUsRUFBRSxhQUFhLEVBQUUsWUFBWSxFQUFFLGNBQWMsRUFDbEUsa0JBQWtCLENBQUMsQ0FBQztJQUV4QixPQUFPO1FBQ0wsT0FBTyxDQUFDLGNBQWMsQ0FDbEIsQ0FBQyxlQUFlLENBQUMsTUFBTSxDQUFDLEVBQUUsT0FBTyxFQUFFLElBQUksVUFBVSxDQUFDLGVBQWUsQ0FBQyxDQUFDO1FBQ3ZFLE9BQU8sQ0FBQyxjQUFjLENBQUMsRUFBRSxFQUFFLE9BQU8sRUFBRSxJQUFJLFVBQVUsQ0FBQyxDQUFDLFlBQVksQ0FBQyxDQUFDLENBQUM7S0FDcEUsQ0FBQztBQUNKLENBQUM7QUFFRCxNQUFNLENBQUMsTUFBTSx5QkFBeUIsR0FBaUI7SUFDckQsVUFBVSxFQUFFLG1CQUFtQjtJQUMvQixXQUFXLEVBQUUsT0FBTztJQUNwQixVQUFVLEVBQUUsbUJBQXVDO0NBQ3BELENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyIvKipcbiAqIEBsaWNlbnNlXG4gKiBDb3B5cmlnaHQgMjAyMCBHb29nbGUgTExDLiBBbGwgUmlnaHRzIFJlc2VydmVkLlxuICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlIFwiTGljZW5zZVwiKTtcbiAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS5cbiAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdFxuICpcbiAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMFxuICpcbiAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmVcbiAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuIFwiQVMgSVNcIiBCQVNJUyxcbiAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLlxuICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZFxuICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuXG4gKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuICovXG5cbmltcG9ydCB7YmFja2VuZF91dGlsLCBrZXJuZWxfaW1wbHMsIEtlcm5lbENvbmZpZywgS2VybmVsRnVuYywgTm9uTWF4U3VwcHJlc3Npb25WNCwgTm9uTWF4U3VwcHJlc3Npb25WNEF0dHJzLCBOb25NYXhTdXBwcmVzc2lvblY0SW5wdXRzLCBUZW5zb3JJbmZvLCBUeXBlZEFycmF5fSBmcm9tICdAdGVuc29yZmxvdy90ZmpzLWNvcmUnO1xuY29uc3Qgbm9uTWF4U3VwcHJlc3Npb25WNEltcGwgPSBrZXJuZWxfaW1wbHMubm9uTWF4U3VwcHJlc3Npb25WNEltcGw7XG5cbmltcG9ydCB7TWF0aEJhY2tlbmRXZWJHTH0gZnJvbSAnLi4vYmFja2VuZF93ZWJnbCc7XG5cbmV4cG9ydCBmdW5jdGlvbiBub25NYXhTdXBwcmVzc2lvblY0KGFyZ3M6IHtcbiAgaW5wdXRzOiBOb25NYXhTdXBwcmVzc2lvblY0SW5wdXRzLFxuICBiYWNrZW5kOiBNYXRoQmFja2VuZFdlYkdMLFxuICBhdHRyczogTm9uTWF4U3VwcHJlc3Npb25WNEF0dHJzXG59KTogW1RlbnNvckluZm8sIFRlbnNvckluZm9dIHtcbiAgYmFja2VuZF91dGlsLndhcm4oXG4gICAgICAndGYubm9uTWF4U3VwcHJlc3Npb24oKSBpbiB3ZWJnbCBsb2NrcyB0aGUgVUkgdGhyZWFkLiAnICtcbiAgICAgICdDYWxsIHRmLm5vbk1heFN1cHByZXNzaW9uQXN5bmMoKSBpbnN0ZWFkJyk7XG5cbiAgY29uc3Qge2lucHV0cywgYmFja2VuZCwgYXR0cnN9ID0gYXJncztcbiAgY29uc3Qge2JveGVzLCBzY29yZXN9ID0gaW5wdXRzO1xuICBjb25zdCB7bWF4T3V0cHV0U2l6ZSwgaW91VGhyZXNob2xkLCBzY29yZVRocmVzaG9sZCwgcGFkVG9NYXhPdXRwdXRTaXplfSA9XG4gICAgICBhdHRycztcblxuICBjb25zdCBib3hlc1ZhbHMgPSBiYWNrZW5kLnJlYWRTeW5jKGJveGVzLmRhdGFJZCkgYXMgVHlwZWRBcnJheTtcbiAgY29uc3Qgc2NvcmVzVmFscyA9IGJhY2tlbmQucmVhZFN5bmMoc2NvcmVzLmRhdGFJZCkgYXMgVHlwZWRBcnJheTtcblxuICBjb25zdCB7c2VsZWN0ZWRJbmRpY2VzLCB2YWxpZE91dHB1dHN9ID0gbm9uTWF4U3VwcHJlc3Npb25WNEltcGwoXG4gICAgICBib3hlc1ZhbHMsIHNjb3Jlc1ZhbHMsIG1heE91dHB1dFNpemUsIGlvdVRocmVzaG9sZCwgc2NvcmVUaHJlc2hvbGQsXG4gICAgICBwYWRUb01heE91dHB1dFNpemUpO1xuXG4gIHJldHVybiBbXG4gICAgYmFja2VuZC5tYWtlVGVuc29ySW5mbyhcbiAgICAgICAgW3NlbGVjdGVkSW5kaWNlcy5sZW5ndGhdLCAnaW50MzInLCBuZXcgSW50MzJBcnJheShzZWxlY3RlZEluZGljZXMpKSxcbiAgICBiYWNrZW5kLm1ha2VUZW5zb3JJbmZvKFtdLCAnaW50MzInLCBuZXcgSW50MzJBcnJheShbdmFsaWRPdXRwdXRzXSkpXG4gIF07XG59XG5cbmV4cG9ydCBjb25zdCBub25NYXhTdXBwcmVzc2lvblY0Q29uZmlnOiBLZXJuZWxDb25maWcgPSB7XG4gIGtlcm5lbE5hbWU6IE5vbk1heFN1cHByZXNzaW9uVjQsXG4gIGJhY2tlbmROYW1lOiAnd2ViZ2wnLFxuICBrZXJuZWxGdW5jOiBub25NYXhTdXBwcmVzc2lvblY0IGFzIHt9IGFzIEtlcm5lbEZ1bmNcbn07XG4iXX0=","/**\n * @license\n * Copyright 2020 Google LLC. All Rights Reserved.\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n * =============================================================================\n */\nimport { backend_util, kernel_impls, NonMaxSuppressionV5 } from '@tensorflow/tfjs-core';\nconst nonMaxSuppressionV5Impl = kernel_impls.nonMaxSuppressionV5Impl;\nexport function nonMaxSuppressionV5(args) {\n backend_util.warn('tf.nonMaxSuppression() in webgl locks the UI thread. ' +\n 'Call tf.nonMaxSuppressionAsync() instead');\n const { inputs, backend, attrs } = args;\n const { boxes, scores } = inputs;\n const { maxOutputSize, iouThreshold, scoreThreshold, softNmsSigma } = attrs;\n const boxesVals = backend.readSync(boxes.dataId);\n const scoresVals = backend.readSync(scores.dataId);\n const maxOutputSizeVal = maxOutputSize;\n const iouThresholdVal = iouThreshold;\n const scoreThresholdVal = scoreThreshold;\n const softNmsSigmaVal = softNmsSigma;\n const { selectedIndices, selectedScores } = nonMaxSuppressionV5Impl(boxesVals, scoresVals, maxOutputSizeVal, iouThresholdVal, scoreThresholdVal, softNmsSigmaVal);\n return [\n backend.makeTensorInfo([selectedIndices.length], 'int32', new Int32Array(selectedIndices)),\n backend.makeTensorInfo([selectedScores.length], 'float32', new Float32Array(selectedScores))\n ];\n}\nexport const nonMaxSuppressionV5Config = {\n kernelName: NonMaxSuppressionV5,\n backendName: 'webgl',\n kernelFunc: nonMaxSuppressionV5\n};\n//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiTm9uTWF4U3VwcHJlc3Npb25WNS5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uLy4uL3RmanMtYmFja2VuZC13ZWJnbC9zcmMva2VybmVscy9Ob25NYXhTdXBwcmVzc2lvblY1LnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBOzs7Ozs7Ozs7Ozs7Ozs7R0FlRztBQUVILE9BQU8sRUFBQyxZQUFZLEVBQUUsWUFBWSxFQUE0QixtQkFBbUIsRUFBOEUsTUFBTSx1QkFBdUIsQ0FBQztBQUU3TCxNQUFNLHVCQUF1QixHQUFHLFlBQVksQ0FBQyx1QkFBdUIsQ0FBQztBQUdyRSxNQUFNLFVBQVUsbUJBQW1CLENBQUMsSUFJbkM7SUFDQyxZQUFZLENBQUMsSUFBSSxDQUNiLHVEQUF1RDtRQUN2RCwwQ0FBMEMsQ0FBQyxDQUFDO0lBRWhELE1BQU0sRUFBQyxNQUFNLEVBQUUsT0FBTyxFQUFFLEtBQUssRUFBQyxHQUFHLElBQUksQ0FBQztJQUN0QyxNQUFNLEVBQUMsS0FBSyxFQUFFLE1BQU0sRUFBQyxHQUFHLE1BQU0sQ0FBQztJQUMvQixNQUFNLEVBQUMsYUFBYSxFQUFFLFlBQVksRUFBRSxjQUFjLEVBQUUsWUFBWSxFQUFDLEdBQUcsS0FBSyxDQUFDO0lBRTFFLE1BQU0sU0FBUyxHQUFHLE9BQU8sQ0FBQyxRQUFRLENBQUMsS0FBSyxDQUFDLE1BQU0sQ0FBZSxDQUFDO0lBQy9ELE1BQU0sVUFBVSxHQUFHLE9BQU8sQ0FBQyxRQUFRLENBQUMsTUFBTSxDQUFDLE1BQU0sQ0FBZSxDQUFDO0lBRWpFLE1BQU0sZ0JBQWdCLEdBQUcsYUFBYSxDQUFDO0lBQ3ZDLE1BQU0sZUFBZSxHQUFHLFlBQVksQ0FBQztJQUNyQyxNQUFNLGlCQUFpQixHQUFHLGNBQWMsQ0FBQztJQUN6QyxNQUFNLGVBQWUsR0FBRyxZQUFZLENBQUM7SUFFckMsTUFBTSxFQUFDLGVBQWUsRUFBRSxjQUFjLEVBQUMsR0FBRyx1QkFBdUIsQ0FDN0QsU0FBUyxFQUFFLFVBQVUsRUFBRSxnQkFBZ0IsRUFBRSxlQUFlLEVBQ3hELGlCQUFpQixFQUFFLGVBQWUsQ0FBQyxDQUFDO0lBRXhDLE9BQU87UUFDTCxPQUFPLENBQUMsY0FBYyxDQUNsQixDQUFDLGVBQWUsQ0FBQyxNQUFNLENBQUMsRUFBRSxPQUFPLEVBQUUsSUFBSSxVQUFVLENBQUMsZUFBZSxDQUFDLENBQUM7UUFDdkUsT0FBTyxDQUFDLGNBQWMsQ0FDbEIsQ0FBQyxjQUFjLENBQUMsTUFBTSxDQUFDLEVBQUUsU0FBUyxFQUFFLElBQUksWUFBWSxDQUFDLGNBQWMsQ0FBQyxDQUFDO0tBQzFFLENBQUM7QUFDSixDQUFDO0FBRUQsTUFBTSxDQUFDLE1BQU0seUJBQXlCLEdBQWlCO0lBQ3JELFVBQVUsRUFBRSxtQkFBbUI7SUFDL0IsV0FBVyxFQUFFLE9BQU87SUFDcEIsVUFBVSxFQUFFLG1CQUF1QztDQUNwRCxDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiLyoqXG4gKiBAbGljZW5zZVxuICogQ29weXJpZ2h0IDIwMjAgR29vZ2xlIExMQy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC5cbiAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSBcIkxpY2Vuc2VcIik7XG4gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuXG4gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXRcbiAqXG4gKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjBcbiAqXG4gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlXG4gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiBcIkFTIElTXCIgQkFTSVMsXG4gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC5cbiAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmRcbiAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLlxuICogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbiAqL1xuXG5pbXBvcnQge2JhY2tlbmRfdXRpbCwga2VybmVsX2ltcGxzLCBLZXJuZWxDb25maWcsIEtlcm5lbEZ1bmMsIE5vbk1heFN1cHByZXNzaW9uVjUsIE5vbk1heFN1cHByZXNzaW9uVjVBdHRycywgTm9uTWF4U3VwcHJlc3Npb25WNUlucHV0cywgVGVuc29ySW5mbywgVHlwZWRBcnJheX0gZnJvbSAnQHRlbnNvcmZsb3cvdGZqcy1jb3JlJztcblxuY29uc3Qgbm9uTWF4U3VwcHJlc3Npb25WNUltcGwgPSBrZXJuZWxfaW1wbHMubm9uTWF4U3VwcHJlc3Npb25WNUltcGw7XG5pbXBvcnQge01hdGhCYWNrZW5kV2ViR0x9IGZyb20gJy4uL2JhY2tlbmRfd2ViZ2wnO1xuXG5leHBvcnQgZnVuY3Rpb24gbm9uTWF4U3VwcHJlc3Npb25WNShhcmdzOiB7XG4gIGlucHV0czogTm9uTWF4U3VwcHJlc3Npb25WNUlucHV0cyxcbiAgYmFja2VuZDogTWF0aEJhY2tlbmRXZWJHTCxcbiAgYXR0cnM6IE5vbk1heFN1cHByZXNzaW9uVjVBdHRyc1xufSk6IFtUZW5zb3JJbmZvLCBUZW5zb3JJbmZvXSB7XG4gIGJhY2tlbmRfdXRpbC53YXJuKFxuICAgICAgJ3RmLm5vbk1heFN1cHByZXNzaW9uKCkgaW4gd2ViZ2wgbG9ja3MgdGhlIFVJIHRocmVhZC4gJyArXG4gICAgICAnQ2FsbCB0Zi5ub25NYXhTdXBwcmVzc2lvbkFzeW5jKCkgaW5zdGVhZCcpO1xuXG4gIGNvbnN0IHtpbnB1dHMsIGJhY2tlbmQsIGF0dHJzfSA9IGFyZ3M7XG4gIGNvbnN0IHtib3hlcywgc2NvcmVzfSA9IGlucHV0cztcbiAgY29uc3Qge21heE91dHB1dFNpemUsIGlvdVRocmVzaG9sZCwgc2NvcmVUaHJlc2hvbGQsIHNvZnRObXNTaWdtYX0gPSBhdHRycztcblxuICBjb25zdCBib3hlc1ZhbHMgPSBiYWNrZW5kLnJlYWRTeW5jKGJveGVzLmRhdGFJZCkgYXMgVHlwZWRBcnJheTtcbiAgY29uc3Qgc2NvcmVzVmFscyA9IGJhY2tlbmQucmVhZFN5bmMoc2NvcmVzLmRhdGFJZCkgYXMgVHlwZWRBcnJheTtcblxuICBjb25zdCBtYXhPdXRwdXRTaXplVmFsID0gbWF4T3V0cHV0U2l6ZTtcbiAgY29uc3QgaW91VGhyZXNob2xkVmFsID0gaW91VGhyZXNob2xkO1xuICBjb25zdCBzY29yZVRocmVzaG9sZFZhbCA9IHNjb3JlVGhyZXNob2xkO1xuICBjb25zdCBzb2Z0Tm1zU2lnbWFWYWwgPSBzb2Z0Tm1zU2lnbWE7XG5cbiAgY29uc3Qge3NlbGVjdGVkSW5kaWNlcywgc2VsZWN0ZWRTY29yZXN9ID0gbm9uTWF4U3VwcHJlc3Npb25WNUltcGwoXG4gICAgICBib3hlc1ZhbHMsIHNjb3Jlc1ZhbHMsIG1heE91dHB1dFNpemVWYWwsIGlvdVRocmVzaG9sZFZhbCxcbiAgICAgIHNjb3JlVGhyZXNob2xkVmFsLCBzb2Z0Tm1zU2lnbWFWYWwpO1xuXG4gIHJldHVybiBbXG4gICAgYmFja2VuZC5tYWtlVGVuc29ySW5mbyhcbiAgICAgICAgW3NlbGVjdGVkSW5kaWNlcy5sZW5ndGhdLCAnaW50MzInLCBuZXcgSW50MzJBcnJheShzZWxlY3RlZEluZGljZXMpKSxcbiAgICBiYWNrZW5kLm1ha2VUZW5zb3JJbmZvKFxuICAgICAgICBbc2VsZWN0ZWRTY29yZXMubGVuZ3RoXSwgJ2Zsb2F0MzInLCBuZXcgRmxvYXQzMkFycmF5KHNlbGVjdGVkU2NvcmVzKSlcbiAgXTtcbn1cblxuZXhwb3J0IGNvbnN0IG5vbk1heFN1cHByZXNzaW9uVjVDb25maWc6IEtlcm5lbENvbmZpZyA9IHtcbiAga2VybmVsTmFtZTogTm9uTWF4U3VwcHJlc3Npb25WNSxcbiAgYmFja2VuZE5hbWU6ICd3ZWJnbCcsXG4gIGtlcm5lbEZ1bmM6IG5vbk1heFN1cHByZXNzaW9uVjUgYXMge30gYXMgS2VybmVsRnVuY1xufTtcbiJdfQ==","/**\n * @license\n * Copyright 2017 Google LLC. All Rights Reserved.\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n * =============================================================================\n */\nexport class OneHotProgram {\n constructor(numIndices, depth, onValue, offValue) {\n this.variableNames = ['indices'];\n this.outputShape = [numIndices, depth];\n this.userCode = `\n void main() {\n ivec2 coords = getOutputCoords();\n int index = round(getIndices(coords.x));\n setOutput(mix(float(${offValue}), float(${onValue}),\n float(index == coords.y)));\n }\n `;\n }\n}\n//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoib25laG90X2dwdS5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uL3RmanMtYmFja2VuZC13ZWJnbC9zcmMvb25laG90X2dwdS50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQTs7Ozs7Ozs7Ozs7Ozs7O0dBZUc7QUFJSCxNQUFNLE9BQU8sYUFBYTtJQVF4QixZQUNJLFVBQWtCLEVBQUUsS0FBYSxFQUFFLE9BQWUsRUFBRSxRQUFnQjtRQVJ4RSxrQkFBYSxHQUFHLENBQUMsU0FBUyxDQUFDLENBQUM7UUFTMUIsSUFBSSxDQUFDLFdBQVcsR0FBRyxDQUFDLFVBQVUsRUFBRSxLQUFLLENBQUMsQ0FBQztRQUV2QyxJQUFJLENBQUMsUUFBUSxHQUFHOzs7OzhCQUlVLFFBQVEsWUFBWSxPQUFPOzs7S0FHcEQsQ0FBQztJQUNKLENBQUM7Q0FDRiIsInNvdXJjZXNDb250ZW50IjpbIi8qKlxuICogQGxpY2Vuc2VcbiAqIENvcHlyaWdodCAyMDE3IEdvb2dsZSBMTEMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuXG4gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgXCJMaWNlbnNlXCIpO1xuICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLlxuICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0XG4gKlxuICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wXG4gKlxuICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZVxuICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gXCJBUyBJU1wiIEJBU0lTLFxuICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuXG4gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kXG4gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS5cbiAqID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4gKi9cblxuaW1wb3J0IHtHUEdQVVByb2dyYW19IGZyb20gJy4vZ3BncHVfbWF0aCc7XG5cbmV4cG9ydCBjbGFzcyBPbmVIb3RQcm9ncmFtIGltcGxlbWVudHMgR1BHUFVQcm9ncmFtIHtcbiAgdmFyaWFibGVOYW1lcyA9IFsnaW5kaWNlcyddO1xuICBvdXRwdXRTaGFwZTogbnVtYmVyW107XG4gIHVzZXJDb2RlOiBzdHJpbmc7XG5cbiAgLy8gQ2FjaGluZyB1bmlmb3JtIGxvY2F0aW9uIGZvciBzcGVlZC5cbiAgc2VlZExvYzogV2ViR0xVbmlmb3JtTG9jYXRpb247XG5cbiAgY29uc3RydWN0b3IoXG4gICAgICBudW1JbmRpY2VzOiBudW1iZXIsIGRlcHRoOiBudW1iZXIsIG9uVmFsdWU6IG51bWJlciwgb2ZmVmFsdWU6IG51bWJlcikge1xuICAgIHRoaXMub3V0cHV0U2hhcGUgPSBbbnVtSW5kaWNlcywgZGVwdGhdO1xuXG4gICAgdGhpcy51c2VyQ29kZSA9IGBcbiAgICAgIHZvaWQgbWFpbigpIHtcbiAgICAgICAgaXZlYzIgY29vcmRzID0gZ2V0T3V0cHV0Q29vcmRzKCk7XG4gICAgICAgIGludCBpbmRleCA9IHJvdW5kKGdldEluZGljZXMoY29vcmRzLngpKTtcbiAgICAgICAgc2V0T3V0cHV0KG1peChmbG9hdCgke29mZlZhbHVlfSksIGZsb2F0KCR7b25WYWx1ZX0pLFxuICAgICAgICAgICAgICAgICAgICAgIGZsb2F0KGluZGV4ID09IGNvb3Jkcy55KSkpO1xuICAgICAgfVxuICAgIGA7XG4gIH1cbn1cbiJdfQ==","/**\n * @license\n * Copyright 2020 Google LLC. All Rights Reserved.\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n * =============================================================================\n */\nimport { OneHot, util } from '@tensorflow/tfjs-core';\nimport { OneHotProgram } from '../onehot_gpu';\nimport { reshape } from './Reshape';\nexport const oneHot = (args) => {\n const { inputs, backend, attrs } = args;\n const { indices } = inputs;\n const { dtype, depth, onValue, offValue } = attrs;\n const indicesSize = util.sizeFromShape(indices.shape);\n const program = new OneHotProgram(indicesSize, depth, onValue, offValue);\n const reshaped = reshape({ inputs: { x: indices }, backend, attrs: { shape: [indicesSize] } });\n const result = backend.runWebGLProgram(program, [reshaped], dtype);\n backend.disposeIntermediateTensorInfo(reshaped);\n const outShape = [...indices.shape, depth];\n const out = reshape({ inputs: { x: result }, backend, attrs: { shape: outShape } });\n backend.disposeIntermediateTensorInfo(result);\n return out;\n};\nexport const oneHotConfig = {\n kernelName: OneHot,\n backendName: 'webgl',\n kernelFunc: oneHot\n};\n//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiT25lSG90LmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vLi4vdGZqcy1iYWNrZW5kLXdlYmdsL3NyYy9rZXJuZWxzL09uZUhvdC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQTs7Ozs7Ozs7Ozs7Ozs7O0dBZUc7QUFFSCxPQUFPLEVBQTJCLE1BQU0sRUFBeUMsSUFBSSxFQUFDLE1BQU0sdUJBQXVCLENBQUM7QUFHcEgsT0FBTyxFQUFDLGFBQWEsRUFBQyxNQUFNLGVBQWUsQ0FBQztBQUM1QyxPQUFPLEVBQUMsT0FBTyxFQUFDLE1BQU0sV0FBVyxDQUFDO0FBRWxDLE1BQU0sQ0FBQyxNQUFNLE1BQU0sR0FBRyxDQUFDLElBSXRCLEVBQWMsRUFBRTtJQUNmLE1BQU0sRUFBQyxNQUFNLEVBQUUsT0FBTyxFQUFFLEtBQUssRUFBQyxHQUFHLElBQUksQ0FBQztJQUN0QyxNQUFNLEVBQUMsT0FBTyxFQUFDLEdBQUcsTUFBTSxDQUFDO0lBQ3pCLE1BQU0sRUFBQyxLQUFLLEVBQUUsS0FBSyxFQUFFLE9BQU8sRUFBRSxRQUFRLEVBQUMsR0FBRyxLQUFLLENBQUM7SUFFaEQsTUFBTSxXQUFXLEdBQUcsSUFBSSxDQUFDLGFBQWEsQ0FBQyxPQUFPLENBQUMsS0FBSyxDQUFDLENBQUM7SUFDdEQsTUFBTSxPQUFPLEdBQUcsSUFBSSxhQUFhLENBQUMsV0FBVyxFQUFFLEtBQUssRUFBRSxPQUFPLEVBQUUsUUFBUSxDQUFDLENBQUM7SUFDekUsTUFBTSxRQUFRLEdBQ1YsT0FBTyxDQUFDLEVBQUMsTUFBTSxFQUFFLEVBQUMsQ0FBQyxFQUFFLE9BQU8sRUFBQyxFQUFFLE9BQU8sRUFBRSxLQUFLLEVBQUUsRUFBQyxLQUFLLEVBQUUsQ0FBQyxXQUFXLENBQUMsRUFBQyxFQUFDLENBQUMsQ0FBQztJQUM1RSxNQUFNLE1BQU0sR0FBRyxPQUFPLENBQUMsZUFBZSxDQUFDLE9BQU8sRUFBRSxDQUFDLFFBQVEsQ0FBQyxFQUFFLEtBQUssQ0FBQyxDQUFDO0lBQ25FLE9BQU8sQ0FBQyw2QkFBNkIsQ0FBQyxRQUFRLENBQUMsQ0FBQztJQUVoRCxNQUFNLFFBQVEsR0FBRyxDQUFDLEdBQUcsT0FBTyxDQUFDLEtBQUssRUFBRSxLQUFLLENBQUMsQ0FBQztJQUMzQyxNQUFNLEdBQUcsR0FBRyxPQUFPLENBQUMsRUFBQyxNQUFNLEVBQUUsRUFBQyxDQUFDLEVBQUUsTUFBTSxFQUFDLEVBQUUsT0FBTyxFQUFFLEtBQUssRUFBRSxFQUFDLEtBQUssRUFBRSxRQUFRLEVBQUMsRUFBQyxDQUFDLENBQUM7SUFDOUUsT0FBTyxDQUFDLDZCQUE2QixDQUFDLE1BQU0sQ0FBQyxDQUFDO0lBQzlDLE9BQU8sR0FBRyxDQUFDO0FBQ2IsQ0FBQyxDQUFDO0FBRUYsTUFBTSxDQUFDLE1BQU0sWUFBWSxHQUFpQjtJQUN4QyxVQUFVLEVBQUUsTUFBTTtJQUNsQixXQUFXLEVBQUUsT0FBTztJQUNwQixVQUFVLEVBQUUsTUFBMEI7Q0FDdkMsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbIi8qKlxuICogQGxpY2Vuc2VcbiAqIENvcHlyaWdodCAyMDIwIEdvb2dsZSBMTEMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuXG4gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgXCJMaWNlbnNlXCIpO1xuICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLlxuICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0XG4gKlxuICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wXG4gKlxuICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZVxuICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gXCJBUyBJU1wiIEJBU0lTLFxuICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuXG4gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kXG4gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS5cbiAqID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4gKi9cblxuaW1wb3J0IHtLZXJuZWxDb25maWcsIEtlcm5lbEZ1bmMsIE9uZUhvdCwgT25lSG90QXR0cnMsIE9uZUhvdElucHV0cywgVGVuc29ySW5mbywgdXRpbH0gZnJvbSAnQHRlbnNvcmZsb3cvdGZqcy1jb3JlJztcblxuaW1wb3J0IHtNYXRoQmFja2VuZFdlYkdMfSBmcm9tICcuLi9iYWNrZW5kX3dlYmdsJztcbmltcG9ydCB7T25lSG90UHJvZ3JhbX0gZnJvbSAnLi4vb25laG90X2dwdSc7XG5pbXBvcnQge3Jlc2hhcGV9IGZyb20gJy4vUmVzaGFwZSc7XG5cbmV4cG9ydCBjb25zdCBvbmVIb3QgPSAoYXJnczoge1xuICBpbnB1dHM6IE9uZUhvdElucHV0cyxcbiAgYmFja2VuZDogTWF0aEJhY2tlbmRXZWJHTCxcbiAgYXR0cnM6IE9uZUhvdEF0dHJzXG59KTogVGVuc29ySW5mbyA9PiB7XG4gIGNvbnN0IHtpbnB1dHMsIGJhY2tlbmQsIGF0dHJzfSA9IGFyZ3M7XG4gIGNvbnN0IHtpbmRpY2VzfSA9IGlucHV0cztcbiAgY29uc3Qge2R0eXBlLCBkZXB0aCwgb25WYWx1ZSwgb2ZmVmFsdWV9ID0gYXR0cnM7XG5cbiAgY29uc3QgaW5kaWNlc1NpemUgPSB1dGlsLnNpemVGcm9tU2hhcGUoaW5kaWNlcy5zaGFwZSk7XG4gIGNvbnN0IHByb2dyYW0gPSBuZXcgT25lSG90UHJvZ3JhbShpbmRpY2VzU2l6ZSwgZGVwdGgsIG9uVmFsdWUsIG9mZlZhbHVlKTtcbiAgY29uc3QgcmVzaGFwZWQgPVxuICAgICAgcmVzaGFwZSh7aW5wdXRzOiB7eDogaW5kaWNlc30sIGJhY2tlbmQsIGF0dHJzOiB7c2hhcGU6IFtpbmRpY2VzU2l6ZV19fSk7XG4gIGNvbnN0IHJlc3VsdCA9IGJhY2tlbmQucnVuV2ViR0xQcm9ncmFtKHByb2dyYW0sIFtyZXNoYXBlZF0sIGR0eXBlKTtcbiAgYmFja2VuZC5kaXNwb3NlSW50ZXJtZWRpYXRlVGVuc29ySW5mbyhyZXNoYXBlZCk7XG5cbiAgY29uc3Qgb3V0U2hhcGUgPSBbLi4uaW5kaWNlcy5zaGFwZSwgZGVwdGhdO1xuICBjb25zdCBvdXQgPSByZXNoYXBlKHtpbnB1dHM6IHt4OiByZXN1bHR9LCBiYWNrZW5kLCBhdHRyczoge3NoYXBlOiBvdXRTaGFwZX19KTtcbiAgYmFja2VuZC5kaXNwb3NlSW50ZXJtZWRpYXRlVGVuc29ySW5mbyhyZXN1bHQpO1xuICByZXR1cm4gb3V0O1xufTtcblxuZXhwb3J0IGNvbnN0IG9uZUhvdENvbmZpZzogS2VybmVsQ29uZmlnID0ge1xuICBrZXJuZWxOYW1lOiBPbmVIb3QsXG4gIGJhY2tlbmROYW1lOiAnd2ViZ2wnLFxuICBrZXJuZWxGdW5jOiBvbmVIb3QgYXMge30gYXMgS2VybmVsRnVuY1xufTtcbiJdfQ==","/**\n * @license\n * Copyright 2020 Google LLC. All Rights Reserved.\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n * =============================================================================\n */\nimport { ZerosLike } from '@tensorflow/tfjs-core';\nimport { complex } from './Complex';\nimport { fill } from './Fill';\nimport { imag } from './Imag';\nimport { real } from './Real';\nexport function zerosLike(args) {\n const { inputs, backend } = args;\n const { x } = inputs;\n if (x.dtype === 'complex64') {\n const realPart = real({ inputs: { input: x }, backend });\n const r = zerosLike({ inputs: { x: realPart }, backend });\n const imagPart = imag({ inputs: { input: x }, backend });\n const i = zerosLike({ inputs: { x: imagPart }, backend });\n const result = complex({ inputs: { real: r, imag: i }, backend });\n backend.disposeIntermediateTensorInfo(realPart);\n backend.disposeIntermediateTensorInfo(r);\n backend.disposeIntermediateTensorInfo(imagPart);\n backend.disposeIntermediateTensorInfo(i);\n return result;\n }\n else {\n return fill({\n attrs: {\n shape: x.shape,\n dtype: x.dtype,\n value: x.dtype === 'string' ? '' : 0\n },\n backend\n });\n }\n}\nexport const zerosLikeConfig = {\n kernelName: ZerosLike,\n backendName: 'webgl',\n kernelFunc: zerosLike\n};\n//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiWmVyb3NMaWtlLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vLi4vdGZqcy1iYWNrZW5kLXdlYmdsL3NyYy9rZXJuZWxzL1plcm9zTGlrZS50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQTs7Ozs7Ozs7Ozs7Ozs7O0dBZUc7QUFFSCxPQUFPLEVBQXVDLFNBQVMsRUFBa0IsTUFBTSx1QkFBdUIsQ0FBQztBQUl2RyxPQUFPLEVBQUMsT0FBTyxFQUFDLE1BQU0sV0FBVyxDQUFDO0FBQ2xDLE9BQU8sRUFBQyxJQUFJLEVBQUMsTUFBTSxRQUFRLENBQUM7QUFDNUIsT0FBTyxFQUFDLElBQUksRUFBQyxNQUFNLFFBQVEsQ0FBQztBQUM1QixPQUFPLEVBQUMsSUFBSSxFQUFDLE1BQU0sUUFBUSxDQUFDO0FBRTVCLE1BQU0sVUFBVSxTQUFTLENBQ3JCLElBQTBEO0lBQzVELE1BQU0sRUFBQyxNQUFNLEVBQUUsT0FBTyxFQUFDLEdBQUcsSUFBSSxDQUFDO0lBQy9CLE1BQU0sRUFBQyxDQUFDLEVBQUMsR0FBRyxNQUFNLENBQUM7SUFFbkIsSUFBSSxDQUFDLENBQUMsS0FBSyxLQUFLLFdBQVcsRUFBRTtRQUMzQixNQUFNLFFBQVEsR0FBRyxJQUFJLENBQUMsRUFBQyxNQUFNLEVBQUUsRUFBQyxLQUFLLEVBQUUsQ0FBQyxFQUFDLEVBQUUsT0FBTyxFQUFDLENBQUMsQ0FBQztRQUNyRCxNQUFNLENBQUMsR0FBRyxTQUFTLENBQUMsRUFBQyxNQUFNLEVBQUUsRUFBQyxDQUFDLEVBQUUsUUFBUSxFQUFDLEVBQUUsT0FBTyxFQUFDLENBQUMsQ0FBQztRQUN0RCxNQUFNLFFBQVEsR0FBRyxJQUFJLENBQUMsRUFBQyxNQUFNLEVBQUUsRUFBQyxLQUFLLEVBQUUsQ0FBQyxFQUFDLEVBQUUsT0FBTyxFQUFDLENBQUMsQ0FBQztRQUNyRCxNQUFNLENBQUMsR0FBRyxTQUFTLENBQUMsRUFBQyxNQUFNLEVBQUUsRUFBQyxDQUFDLEVBQUUsUUFBUSxFQUFDLEVBQUUsT0FBTyxFQUFDLENBQUMsQ0FBQztRQUV0RCxNQUFNLE1BQU0sR0FBRyxPQUFPLENBQUMsRUFBQyxNQUFNLEVBQUUsRUFBQyxJQUFJLEVBQUUsQ0FBQyxFQUFFLElBQUksRUFBRSxDQUFDLEVBQUMsRUFBRSxPQUFPLEVBQUMsQ0FBQyxDQUFDO1FBRTlELE9BQU8sQ0FBQyw2QkFBNkIsQ0FBQyxRQUFRLENBQUMsQ0FBQztRQUNoRCxPQUFPLENBQUMsNkJBQTZCLENBQUMsQ0FBQyxDQUFDLENBQUM7UUFDekMsT0FBTyxDQUFDLDZCQUE2QixDQUFDLFFBQVEsQ0FBQyxDQUFDO1FBQ2hELE9BQU8sQ0FBQyw2QkFBNkIsQ0FBQyxDQUFDLENBQUMsQ0FBQztRQUV6QyxPQUFPLE1BQU0sQ0FBQztLQUNmO1NBQU07UUFDTCxPQUFPLElBQUksQ0FBQztZQUNWLEtBQUssRUFBRTtnQkFDTCxLQUFLLEVBQUUsQ0FBQyxDQUFDLEtBQUs7Z0JBQ2QsS0FBSyxFQUFFLENBQUMsQ0FBQyxLQUFLO2dCQUNkLEtBQUssRUFBRSxDQUFDLENBQUMsS0FBSyxLQUFLLFFBQVEsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxDQUFDO2FBQ3JDO1lBQ0QsT0FBTztTQUNSLENBQUMsQ0FBQztLQUNKO0FBQ0gsQ0FBQztBQUVELE1BQU0sQ0FBQyxNQUFNLGVBQWUsR0FBaUI7SUFDM0MsVUFBVSxFQUFFLFNBQVM7SUFDckIsV0FBVyxFQUFFLE9BQU87SUFDcEIsVUFBVSxFQUFFLFNBQTZCO0NBQzFDLENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyIvKipcbiAqIEBsaWNlbnNlXG4gKiBDb3B5cmlnaHQgMjAyMCBHb29nbGUgTExDLiBBbGwgUmlnaHRzIFJlc2VydmVkLlxuICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlIFwiTGljZW5zZVwiKTtcbiAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS5cbiAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdFxuICpcbiAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMFxuICpcbiAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmVcbiAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuIFwiQVMgSVNcIiBCQVNJUyxcbiAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLlxuICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZFxuICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuXG4gKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuICovXG5cbmltcG9ydCB7S2VybmVsQ29uZmlnLCBLZXJuZWxGdW5jLCBUZW5zb3JJbmZvLCBaZXJvc0xpa2UsIFplcm9zTGlrZUlucHV0c30gZnJvbSAnQHRlbnNvcmZsb3cvdGZqcy1jb3JlJztcblxuaW1wb3J0IHtNYXRoQmFja2VuZFdlYkdMfSBmcm9tICcuLi9iYWNrZW5kX3dlYmdsJztcblxuaW1wb3J0IHtjb21wbGV4fSBmcm9tICcuL0NvbXBsZXgnO1xuaW1wb3J0IHtmaWxsfSBmcm9tICcuL0ZpbGwnO1xuaW1wb3J0IHtpbWFnfSBmcm9tICcuL0ltYWcnO1xuaW1wb3J0IHtyZWFsfSBmcm9tICcuL1JlYWwnO1xuXG5leHBvcnQgZnVuY3Rpb24gemVyb3NMaWtlKFxuICAgIGFyZ3M6IHtpbnB1dHM6IFplcm9zTGlrZUlucHV0cywgYmFja2VuZDogTWF0aEJhY2tlbmRXZWJHTH0pOiBUZW5zb3JJbmZvIHtcbiAgY29uc3Qge2lucHV0cywgYmFja2VuZH0gPSBhcmdzO1xuICBjb25zdCB7eH0gPSBpbnB1dHM7XG5cbiAgaWYgKHguZHR5cGUgPT09ICdjb21wbGV4NjQnKSB7XG4gICAgY29uc3QgcmVhbFBhcnQgPSByZWFsKHtpbnB1dHM6IHtpbnB1dDogeH0sIGJhY2tlbmR9KTtcbiAgICBjb25zdCByID0gemVyb3NMaWtlKHtpbnB1dHM6IHt4OiByZWFsUGFydH0sIGJhY2tlbmR9KTtcbiAgICBjb25zdCBpbWFnUGFydCA9IGltYWcoe2lucHV0czoge2lucHV0OiB4fSwgYmFja2VuZH0pO1xuICAgIGNvbnN0IGkgPSB6ZXJvc0xpa2Uoe2lucHV0czoge3g6IGltYWdQYXJ0fSwgYmFja2VuZH0pO1xuXG4gICAgY29uc3QgcmVzdWx0ID0gY29tcGxleCh7aW5wdXRzOiB7cmVhbDogciwgaW1hZzogaX0sIGJhY2tlbmR9KTtcblxuICAgIGJhY2tlbmQuZGlzcG9zZUludGVybWVkaWF0ZVRlbnNvckluZm8ocmVhbFBhcnQpO1xuICAgIGJhY2tlbmQuZGlzcG9zZUludGVybWVkaWF0ZVRlbnNvckluZm8ocik7XG4gICAgYmFja2VuZC5kaXNwb3NlSW50ZXJtZWRpYXRlVGVuc29ySW5mbyhpbWFnUGFydCk7XG4gICAgYmFja2VuZC5kaXNwb3NlSW50ZXJtZWRpYXRlVGVuc29ySW5mbyhpKTtcblxuICAgIHJldHVybiByZXN1bHQ7XG4gIH0gZWxzZSB7XG4gICAgcmV0dXJuIGZpbGwoe1xuICAgICAgYXR0cnM6IHtcbiAgICAgICAgc2hhcGU6IHguc2hhcGUsXG4gICAgICAgIGR0eXBlOiB4LmR0eXBlLFxuICAgICAgICB2YWx1ZTogeC5kdHlwZSA9PT0gJ3N0cmluZycgPyAnJyA6IDBcbiAgICAgIH0sXG4gICAgICBiYWNrZW5kXG4gICAgfSk7XG4gIH1cbn1cblxuZXhwb3J0IGNvbnN0IHplcm9zTGlrZUNvbmZpZzogS2VybmVsQ29uZmlnID0ge1xuICBrZXJuZWxOYW1lOiBaZXJvc0xpa2UsXG4gIGJhY2tlbmROYW1lOiAnd2ViZ2wnLFxuICBrZXJuZWxGdW5jOiB6ZXJvc0xpa2UgYXMge30gYXMgS2VybmVsRnVuY1xufTtcbiJdfQ==","/**\n * @license\n * Copyright 2020 Google LLC. All Rights Reserved.\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n * =============================================================================\n */\nimport { OnesLike } from '@tensorflow/tfjs-core';\nimport { complex } from './Complex';\nimport { fill } from './Fill';\nimport { imag } from './Imag';\nimport { real } from './Real';\nimport { zerosLike } from './ZerosLike';\nexport function onesLike(args) {\n const { inputs, backend } = args;\n const { x } = inputs;\n if (x.dtype === 'string') {\n throw new Error('onesLike is not supported under string dtype');\n }\n else if (x.dtype === 'complex64') {\n const realPart = real({ inputs: { input: x }, backend });\n const r = onesLike({ inputs: { x: realPart }, backend });\n const imagPart = imag({ inputs: { input: x }, backend });\n const i = zerosLike({ inputs: { x: imagPart }, backend });\n const result = complex({ inputs: { real: r, imag: i }, backend });\n backend.disposeIntermediateTensorInfo(realPart);\n backend.disposeIntermediateTensorInfo(r);\n backend.disposeIntermediateTensorInfo(imagPart);\n backend.disposeIntermediateTensorInfo(i);\n return result;\n }\n else {\n // TODO(cais, smilkov): Add WebGL shader for onesLike:\n // https://github.com/tensorflow/tfjs/issues/1293\n return fill({ attrs: { shape: x.shape, dtype: x.dtype, value: 1 }, backend });\n }\n}\nexport const onesLikeConfig = {\n kernelName: OnesLike,\n backendName: 'webgl',\n kernelFunc: onesLike\n};\n//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiT25lc0xpa2UuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi8uLi90ZmpzLWJhY2tlbmQtd2ViZ2wvc3JjL2tlcm5lbHMvT25lc0xpa2UudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUE7Ozs7Ozs7Ozs7Ozs7OztHQWVHO0FBRUgsT0FBTyxFQUEyQixRQUFRLEVBQTZCLE1BQU0sdUJBQXVCLENBQUM7QUFJckcsT0FBTyxFQUFDLE9BQU8sRUFBQyxNQUFNLFdBQVcsQ0FBQztBQUNsQyxPQUFPLEVBQUMsSUFBSSxFQUFDLE1BQU0sUUFBUSxDQUFDO0FBQzVCLE9BQU8sRUFBQyxJQUFJLEVBQUMsTUFBTSxRQUFRLENBQUM7QUFDNUIsT0FBTyxFQUFDLElBQUksRUFBQyxNQUFNLFFBQVEsQ0FBQztBQUM1QixPQUFPLEVBQUMsU0FBUyxFQUFDLE1BQU0sYUFBYSxDQUFDO0FBRXRDLE1BQU0sVUFBVSxRQUFRLENBQ3BCLElBQXlEO0lBQzNELE1BQU0sRUFBQyxNQUFNLEVBQUUsT0FBTyxFQUFDLEdBQUcsSUFBSSxDQUFDO0lBQy9CLE1BQU0sRUFBQyxDQUFDLEVBQUMsR0FBRyxNQUFNLENBQUM7SUFFbkIsSUFBSSxDQUFDLENBQUMsS0FBSyxLQUFLLFFBQVEsRUFBRTtRQUN4QixNQUFNLElBQUksS0FBSyxDQUFDLDhDQUE4QyxDQUFDLENBQUM7S0FDakU7U0FBTSxJQUFJLENBQUMsQ0FBQyxLQUFLLEtBQUssV0FBVyxFQUFFO1FBQ2xDLE1BQU0sUUFBUSxHQUFHLElBQUksQ0FBQyxFQUFDLE1BQU0sRUFBRSxFQUFDLEtBQUssRUFBRSxDQUFDLEVBQUMsRUFBRSxPQUFPLEVBQUMsQ0FBQyxDQUFDO1FBQ3JELE1BQU0sQ0FBQyxHQUFHLFFBQVEsQ0FBQyxFQUFDLE1BQU0sRUFBRSxFQUFDLENBQUMsRUFBRSxRQUFRLEVBQUMsRUFBRSxPQUFPLEVBQUMsQ0FBQyxDQUFDO1FBQ3JELE1BQU0sUUFBUSxHQUFHLElBQUksQ0FBQyxFQUFDLE1BQU0sRUFBRSxFQUFDLEtBQUssRUFBRSxDQUFDLEVBQUMsRUFBRSxPQUFPLEVBQUMsQ0FBQyxDQUFDO1FBQ3JELE1BQU0sQ0FBQyxHQUFHLFNBQVMsQ0FBQyxFQUFDLE1BQU0sRUFBRSxFQUFDLENBQUMsRUFBRSxRQUFRLEVBQUMsRUFBRSxPQUFPLEVBQUMsQ0FBQyxDQUFDO1FBRXRELE1BQU0sTUFBTSxHQUFHLE9BQU8sQ0FBQyxFQUFDLE1BQU0sRUFBRSxFQUFDLElBQUksRUFBRSxDQUFDLEVBQUUsSUFBSSxFQUFFLENBQUMsRUFBQyxFQUFFLE9BQU8sRUFBQyxDQUFDLENBQUM7UUFFOUQsT0FBTyxDQUFDLDZCQUE2QixDQUFDLFFBQVEsQ0FBQyxDQUFDO1FBQ2hELE9BQU8sQ0FBQyw2QkFBNkIsQ0FBQyxDQUFDLENBQUMsQ0FBQztRQUN6QyxPQUFPLENBQUMsNkJBQTZCLENBQUMsUUFBUSxDQUFDLENBQUM7UUFDaEQsT0FBTyxDQUFDLDZCQUE2QixDQUFDLENBQUMsQ0FBQyxDQUFDO1FBRXpDLE9BQU8sTUFBTSxDQUFDO0tBQ2Y7U0FBTTtRQUNMLHNEQUFzRDtRQUN0RCxtREFBbUQ7UUFDbkQsT0FBTyxJQUFJLENBQUMsRUFBQyxLQUFLLEVBQUUsRUFBQyxLQUFLLEVBQUUsQ0FBQyxDQUFDLEtBQUssRUFBRSxLQUFLLEVBQUUsQ0FBQyxDQUFDLEtBQUssRUFBRSxLQUFLLEVBQUUsQ0FBQyxFQUFDLEVBQUUsT0FBTyxFQUFDLENBQUMsQ0FBQztLQUMzRTtBQUNILENBQUM7QUFFRCxNQUFNLENBQUMsTUFBTSxjQUFjLEdBQWlCO0lBQzFDLFVBQVUsRUFBRSxRQUFRO0lBQ3BCLFdBQVcsRUFBRSxPQUFPO0lBQ3BCLFVBQVUsRUFBRSxRQUE0QjtDQUN6QyxDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiLyoqXG4gKiBAbGljZW5zZVxuICogQ29weXJpZ2h0IDIwMjAgR29vZ2xlIExMQy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC5cbiAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSBcIkxpY2Vuc2VcIik7XG4gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuXG4gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXRcbiAqXG4gKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjBcbiAqXG4gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlXG4gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiBcIkFTIElTXCIgQkFTSVMsXG4gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC5cbiAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmRcbiAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLlxuICogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbiAqL1xuXG5pbXBvcnQge0tlcm5lbENvbmZpZywgS2VybmVsRnVuYywgT25lc0xpa2UsIE9uZXNMaWtlSW5wdXRzLCBUZW5zb3JJbmZvfSBmcm9tICdAdGVuc29yZmxvdy90ZmpzLWNvcmUnO1xuXG5pbXBvcnQge01hdGhCYWNrZW5kV2ViR0x9IGZyb20gJy4uL2JhY2tlbmRfd2ViZ2wnO1xuXG5pbXBvcnQge2NvbXBsZXh9IGZyb20gJy4vQ29tcGxleCc7XG5pbXBvcnQge2ZpbGx9IGZyb20gJy4vRmlsbCc7XG5pbXBvcnQge2ltYWd9IGZyb20gJy4vSW1hZyc7XG5pbXBvcnQge3JlYWx9IGZyb20gJy4vUmVhbCc7XG5pbXBvcnQge3plcm9zTGlrZX0gZnJvbSAnLi9aZXJvc0xpa2UnO1xuXG5leHBvcnQgZnVuY3Rpb24gb25lc0xpa2UoXG4gICAgYXJnczoge2lucHV0czogT25lc0xpa2VJbnB1dHMsIGJhY2tlbmQ6IE1hdGhCYWNrZW5kV2ViR0x9KTogVGVuc29ySW5mbyB7XG4gIGNvbnN0IHtpbnB1dHMsIGJhY2tlbmR9ID0gYXJncztcbiAgY29uc3Qge3h9ID0gaW5wdXRzO1xuXG4gIGlmICh4LmR0eXBlID09PSAnc3RyaW5nJykge1xuICAgIHRocm93IG5ldyBFcnJvcignb25lc0xpa2UgaXMgbm90IHN1cHBvcnRlZCB1bmRlciBzdHJpbmcgZHR5cGUnKTtcbiAgfSBlbHNlIGlmICh4LmR0eXBlID09PSAnY29tcGxleDY0Jykge1xuICAgIGNvbnN0IHJlYWxQYXJ0ID0gcmVhbCh7aW5wdXRzOiB7aW5wdXQ6IHh9LCBiYWNrZW5kfSk7XG4gICAgY29uc3QgciA9IG9uZXNMaWtlKHtpbnB1dHM6IHt4OiByZWFsUGFydH0sIGJhY2tlbmR9KTtcbiAgICBjb25zdCBpbWFnUGFydCA9IGltYWcoe2lucHV0czoge2lucHV0OiB4fSwgYmFja2VuZH0pO1xuICAgIGNvbnN0IGkgPSB6ZXJvc0xpa2Uoe2lucHV0czoge3g6IGltYWdQYXJ0fSwgYmFja2VuZH0pO1xuXG4gICAgY29uc3QgcmVzdWx0ID0gY29tcGxleCh7aW5wdXRzOiB7cmVhbDogciwgaW1hZzogaX0sIGJhY2tlbmR9KTtcblxuICAgIGJhY2tlbmQuZGlzcG9zZUludGVybWVkaWF0ZVRlbnNvckluZm8ocmVhbFBhcnQpO1xuICAgIGJhY2tlbmQuZGlzcG9zZUludGVybWVkaWF0ZVRlbnNvckluZm8ocik7XG4gICAgYmFja2VuZC5kaXNwb3NlSW50ZXJtZWRpYXRlVGVuc29ySW5mbyhpbWFnUGFydCk7XG4gICAgYmFja2VuZC5kaXNwb3NlSW50ZXJtZWRpYXRlVGVuc29ySW5mbyhpKTtcblxuICAgIHJldHVybiByZXN1bHQ7XG4gIH0gZWxzZSB7XG4gICAgLy8gVE9ETyhjYWlzLCBzbWlsa292KTogQWRkIFdlYkdMIHNoYWRlciBmb3Igb25lc0xpa2U6XG4gICAgLy8gICBodHRwczovL2dpdGh1Yi5jb20vdGVuc29yZmxvdy90ZmpzL2lzc3Vlcy8xMjkzXG4gICAgcmV0dXJuIGZpbGwoe2F0dHJzOiB7c2hhcGU6IHguc2hhcGUsIGR0eXBlOiB4LmR0eXBlLCB2YWx1ZTogMX0sIGJhY2tlbmR9KTtcbiAgfVxufVxuXG5leHBvcnQgY29uc3Qgb25lc0xpa2VDb25maWc6IEtlcm5lbENvbmZpZyA9IHtcbiAga2VybmVsTmFtZTogT25lc0xpa2UsXG4gIGJhY2tlbmROYW1lOiAnd2ViZ2wnLFxuICBrZXJuZWxGdW5jOiBvbmVzTGlrZSBhcyB7fSBhcyBLZXJuZWxGdW5jXG59O1xuIl19","/**\n * @license\n * Copyright 2020 Google LLC. All Rights Reserved.\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n * =============================================================================\n */\nimport { Pack, util } from '@tensorflow/tfjs-core';\nimport { concat } from './Concat';\nimport { expandDims } from './ExpandDims';\nexport function pack(args) {\n const { inputs, backend, attrs } = args;\n const { axis } = attrs;\n if (inputs.length === 1) {\n return expandDims({ inputs: { input: inputs[0] }, backend, attrs: { dim: axis } });\n }\n const shape = inputs[0].shape;\n const dtype = inputs[0].dtype;\n inputs.forEach(t => {\n util.assertShapesMatch(shape, t.shape, 'All tensors passed to stack must have matching shapes');\n util.assert(dtype === t.dtype, () => 'All tensors passed to stack must have matching dtypes');\n });\n const intermediateTensorInfos = [];\n const expandedTensors = inputs.map(t => {\n const expandedT = expandDims({ inputs: { input: t }, backend, attrs: { dim: axis } });\n intermediateTensorInfos.push(expandedT);\n return expandedT;\n });\n const result = concat({ inputs: expandedTensors, backend, attrs: { axis } });\n intermediateTensorInfos.forEach(t => backend.disposeIntermediateTensorInfo(t));\n return result;\n}\nexport const packConfig = {\n kernelName: Pack,\n backendName: 'webgl',\n kernelFunc: pack\n};\n//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiUGFjay5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uLy4uL3RmanMtYmFja2VuZC13ZWJnbC9zcmMva2VybmVscy9QYWNrLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBOzs7Ozs7Ozs7Ozs7Ozs7R0FlRztBQUVILE9BQU8sRUFBMkIsSUFBSSxFQUFxQyxJQUFJLEVBQUMsTUFBTSx1QkFBdUIsQ0FBQztBQUc5RyxPQUFPLEVBQUMsTUFBTSxFQUFDLE1BQU0sVUFBVSxDQUFDO0FBQ2hDLE9BQU8sRUFBQyxVQUFVLEVBQUMsTUFBTSxjQUFjLENBQUM7QUFFeEMsTUFBTSxVQUFVLElBQUksQ0FDaEIsSUFBdUU7SUFFekUsTUFBTSxFQUFDLE1BQU0sRUFBRSxPQUFPLEVBQUUsS0FBSyxFQUFDLEdBQUcsSUFBSSxDQUFDO0lBQ3RDLE1BQU0sRUFBQyxJQUFJLEVBQUMsR0FBRyxLQUFLLENBQUM7SUFFckIsSUFBSSxNQUFNLENBQUMsTUFBTSxLQUFLLENBQUMsRUFBRTtRQUN2QixPQUFPLFVBQVUsQ0FDYixFQUFDLE1BQU0sRUFBRSxFQUFDLEtBQUssRUFBRSxNQUFNLENBQUMsQ0FBQyxDQUFDLEVBQUMsRUFBRSxPQUFPLEVBQUUsS0FBSyxFQUFFLEVBQUMsR0FBRyxFQUFFLElBQUksRUFBQyxFQUFDLENBQUMsQ0FBQztLQUNoRTtJQUVELE1BQU0sS0FBSyxHQUFHLE1BQU0sQ0FBQyxDQUFDLENBQUMsQ0FBQyxLQUFLLENBQUM7SUFDOUIsTUFBTSxLQUFLLEdBQUcsTUFBTSxDQUFDLENBQUMsQ0FBQyxDQUFDLEtBQUssQ0FBQztJQUU5QixNQUFNLENBQUMsT0FBTyxDQUFDLENBQUMsQ0FBQyxFQUFFO1FBQ2pCLElBQUksQ0FBQyxpQkFBaUIsQ0FDbEIsS0FBSyxFQUFFLENBQUMsQ0FBQyxLQUFLLEVBQ2QsdURBQXVELENBQUMsQ0FBQztRQUM3RCxJQUFJLENBQUMsTUFBTSxDQUNQLEtBQUssS0FBSyxDQUFDLENBQUMsS0FBSyxFQUNqQixHQUFHLEVBQUUsQ0FBQyx1REFBdUQsQ0FBQyxDQUFDO0lBQ3JFLENBQUMsQ0FBQyxDQUFDO0lBRUgsTUFBTSx1QkFBdUIsR0FBaUIsRUFBRSxDQUFDO0lBQ2pELE1BQU0sZUFBZSxHQUFHLE1BQU0sQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLEVBQUU7UUFDckMsTUFBTSxTQUFTLEdBQ1gsVUFBVSxDQUFDLEVBQUMsTUFBTSxFQUFFLEVBQUMsS0FBSyxFQUFFLENBQUMsRUFBQyxFQUFFLE9BQU8sRUFBRSxLQUFLLEVBQUUsRUFBQyxHQUFHLEVBQUUsSUFBSSxFQUFDLEVBQUMsQ0FBQyxDQUFDO1FBQ2xFLHVCQUF1QixDQUFDLElBQUksQ0FBQyxTQUFTLENBQUMsQ0FBQztRQUN4QyxPQUFPLFNBQVMsQ0FBQztJQUNuQixDQUFDLENBQUMsQ0FBQztJQUVILE1BQU0sTUFBTSxHQUFHLE1BQU0sQ0FBQyxFQUFDLE1BQU0sRUFBRSxlQUFlLEVBQUUsT0FBTyxFQUFFLEtBQUssRUFBRSxFQUFDLElBQUksRUFBQyxFQUFDLENBQUMsQ0FBQztJQUV6RSx1QkFBdUIsQ0FBQyxPQUFPLENBQzNCLENBQUMsQ0FBQyxFQUFFLENBQUMsT0FBTyxDQUFDLDZCQUE2QixDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUM7SUFFbkQsT0FBTyxNQUFNLENBQUM7QUFDaEIsQ0FBQztBQUVELE1BQU0sQ0FBQyxNQUFNLFVBQVUsR0FBaUI7SUFDdEMsVUFBVSxFQUFFLElBQUk7SUFDaEIsV0FBVyxFQUFFLE9BQU87SUFDcEIsVUFBVSxFQUFFLElBQXdCO0NBQ3JDLENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyIvKipcbiAqIEBsaWNlbnNlXG4gKiBDb3B5cmlnaHQgMjAyMCBHb29nbGUgTExDLiBBbGwgUmlnaHRzIFJlc2VydmVkLlxuICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlIFwiTGljZW5zZVwiKTtcbiAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS5cbiAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdFxuICpcbiAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMFxuICpcbiAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmVcbiAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuIFwiQVMgSVNcIiBCQVNJUyxcbiAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLlxuICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZFxuICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuXG4gKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuICovXG5cbmltcG9ydCB7S2VybmVsQ29uZmlnLCBLZXJuZWxGdW5jLCBQYWNrLCBQYWNrQXR0cnMsIFBhY2tJbnB1dHMsIFRlbnNvckluZm8sIHV0aWx9IGZyb20gJ0B0ZW5zb3JmbG93L3RmanMtY29yZSc7XG5cbmltcG9ydCB7TWF0aEJhY2tlbmRXZWJHTH0gZnJvbSAnLi4vYmFja2VuZF93ZWJnbCc7XG5pbXBvcnQge2NvbmNhdH0gZnJvbSAnLi9Db25jYXQnO1xuaW1wb3J0IHtleHBhbmREaW1zfSBmcm9tICcuL0V4cGFuZERpbXMnO1xuXG5leHBvcnQgZnVuY3Rpb24gcGFjayhcbiAgICBhcmdzOiB7aW5wdXRzOiBQYWNrSW5wdXRzLCBiYWNrZW5kOiBNYXRoQmFja2VuZFdlYkdMLCBhdHRyczogUGFja0F0dHJzfSk6XG4gICAgVGVuc29ySW5mbyB7XG4gIGNvbnN0IHtpbnB1dHMsIGJhY2tlbmQsIGF0dHJzfSA9IGFyZ3M7XG4gIGNvbnN0IHtheGlzfSA9IGF0dHJzO1xuXG4gIGlmIChpbnB1dHMubGVuZ3RoID09PSAxKSB7XG4gICAgcmV0dXJuIGV4cGFuZERpbXMoXG4gICAgICAgIHtpbnB1dHM6IHtpbnB1dDogaW5wdXRzWzBdfSwgYmFja2VuZCwgYXR0cnM6IHtkaW06IGF4aXN9fSk7XG4gIH1cblxuICBjb25zdCBzaGFwZSA9IGlucHV0c1swXS5zaGFwZTtcbiAgY29uc3QgZHR5cGUgPSBpbnB1dHNbMF0uZHR5cGU7XG5cbiAgaW5wdXRzLmZvckVhY2godCA9PiB7XG4gICAgdXRpbC5hc3NlcnRTaGFwZXNNYXRjaChcbiAgICAgICAgc2hhcGUsIHQuc2hhcGUsXG4gICAgICAgICdBbGwgdGVuc29ycyBwYXNzZWQgdG8gc3RhY2sgbXVzdCBoYXZlIG1hdGNoaW5nIHNoYXBlcycpO1xuICAgIHV0aWwuYXNzZXJ0KFxuICAgICAgICBkdHlwZSA9PT0gdC5kdHlwZSxcbiAgICAgICAgKCkgPT4gJ0FsbCB0ZW5zb3JzIHBhc3NlZCB0byBzdGFjayBtdXN0IGhhdmUgbWF0Y2hpbmcgZHR5cGVzJyk7XG4gIH0pO1xuXG4gIGNvbnN0IGludGVybWVkaWF0ZVRlbnNvckluZm9zOiBUZW5zb3JJbmZvW10gPSBbXTtcbiAgY29uc3QgZXhwYW5kZWRUZW5zb3JzID0gaW5wdXRzLm1hcCh0ID0+IHtcbiAgICBjb25zdCBleHBhbmRlZFQgPVxuICAgICAgICBleHBhbmREaW1zKHtpbnB1dHM6IHtpbnB1dDogdH0sIGJhY2tlbmQsIGF0dHJzOiB7ZGltOiBheGlzfX0pO1xuICAgIGludGVybWVkaWF0ZVRlbnNvckluZm9zLnB1c2goZXhwYW5kZWRUKTtcbiAgICByZXR1cm4gZXhwYW5kZWRUO1xuICB9KTtcblxuICBjb25zdCByZXN1bHQgPSBjb25jYXQoe2lucHV0czogZXhwYW5kZWRUZW5zb3JzLCBiYWNrZW5kLCBhdHRyczoge2F4aXN9fSk7XG5cbiAgaW50ZXJtZWRpYXRlVGVuc29ySW5mb3MuZm9yRWFjaChcbiAgICAgIHQgPT4gYmFja2VuZC5kaXNwb3NlSW50ZXJtZWRpYXRlVGVuc29ySW5mbyh0KSk7XG5cbiAgcmV0dXJuIHJlc3VsdDtcbn1cblxuZXhwb3J0IGNvbnN0IHBhY2tDb25maWc6IEtlcm5lbENvbmZpZyA9IHtcbiAga2VybmVsTmFtZTogUGFjayxcbiAgYmFja2VuZE5hbWU6ICd3ZWJnbCcsXG4gIGtlcm5lbEZ1bmM6IHBhY2sgYXMge30gYXMgS2VybmVsRnVuY1xufTtcbiJdfQ==","/**\n * @license\n * Copyright 2017 Google LLC. All Rights Reserved.\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n * =============================================================================\n */\nimport { getCoordsDataType } from './shader_compiler';\nexport class PadProgram {\n constructor(xShape, paddings, constantValue) {\n this.variableNames = ['x'];\n this.customUniforms = [{ name: 'value', type: 'float' }];\n this.outputShape = paddings.map((p, i) => p[0] /* beforePad */ + xShape[i] + p[1] /* afterPad */);\n const rank = xShape.length;\n const type = getCoordsDataType(rank);\n const start = paddings.map(p => p[0]).join(',');\n const end = paddings.map((p, i) => p[0] + xShape[i]).join(',');\n const unpackedCoords = ['coords[0]', 'coords[1]', 'coords[2]', 'coords[3]'].slice(0, rank);\n if (rank === 1) {\n this.userCode = `\n int start = ${start};\n int end = ${end};\n\n void main() {\n int outC = getOutputCoords();\n if (outC < start || outC >= end) {\n setOutput(value);\n } else {\n setOutput(getX(outC - start));\n }\n }\n `;\n return;\n }\n this.userCode = `\n ${type} start = ${type}(${start});\n ${type} end = ${type}(${end});\n\n void main() {\n ${type} outC = getOutputCoords();\n if (any(lessThan(outC, start)) || any(greaterThanEqual(outC, end))) {\n setOutput(value);\n } else {\n ${type} coords = outC - start;\n setOutput(getX(${unpackedCoords}));\n }\n }\n `;\n }\n}\n//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicGFkX2dwdS5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uL3RmanMtYmFja2VuZC13ZWJnbC9zcmMvcGFkX2dwdS50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQTs7Ozs7Ozs7Ozs7Ozs7O0dBZUc7QUFHSCxPQUFPLEVBQUMsaUJBQWlCLEVBQWMsTUFBTSxtQkFBbUIsQ0FBQztBQUVqRSxNQUFNLE9BQU8sVUFBVTtJQU1yQixZQUNJLE1BQWdCLEVBQUUsUUFBaUMsRUFDbkQsYUFBcUI7UUFQekIsa0JBQWEsR0FBRyxDQUFDLEdBQUcsQ0FBQyxDQUFDO1FBR3RCLG1CQUFjLEdBQUcsQ0FBQyxFQUFDLElBQUksRUFBRSxPQUFPLEVBQUUsSUFBSSxFQUFFLE9BQXNCLEVBQUMsQ0FBQyxDQUFDO1FBSy9ELElBQUksQ0FBQyxXQUFXLEdBQUcsUUFBUSxDQUFDLEdBQUcsQ0FDM0IsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxFQUFFLEVBQUUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsZUFBZSxHQUFHLE1BQU0sQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsY0FBYyxDQUFDLENBQUM7UUFDdEUsTUFBTSxJQUFJLEdBQUcsTUFBTSxDQUFDLE1BQU0sQ0FBQztRQUMzQixNQUFNLElBQUksR0FBRyxpQkFBaUIsQ0FBQyxJQUFJLENBQUMsQ0FBQztRQUVyQyxNQUFNLEtBQUssR0FBRyxRQUFRLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLEdBQUcsQ0FBQyxDQUFDO1FBQ2hELE1BQU0sR0FBRyxHQUFHLFFBQVEsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxFQUFFLEVBQUUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLEdBQUcsTUFBTSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLEdBQUcsQ0FBQyxDQUFDO1FBQy9ELE1BQU0sY0FBYyxHQUNoQixDQUFDLFdBQVcsRUFBRSxXQUFXLEVBQUUsV0FBVyxFQUFFLFdBQVcsQ0FBQyxDQUFDLEtBQUssQ0FBQyxDQUFDLEVBQUUsSUFBSSxDQUFDLENBQUM7UUFFeEUsSUFBSSxJQUFJLEtBQUssQ0FBQyxFQUFFO1lBQ2QsSUFBSSxDQUFDLFFBQVEsR0FBRztzQkFDQSxLQUFLO29CQUNQLEdBQUc7Ozs7Ozs7Ozs7T0FVaEIsQ0FBQztZQUNGLE9BQU87U0FDUjtRQUNELElBQUksQ0FBQyxRQUFRLEdBQUc7UUFDWixJQUFJLFlBQVksSUFBSSxJQUFJLEtBQUs7UUFDN0IsSUFBSSxVQUFVLElBQUksSUFBSSxHQUFHOzs7VUFHdkIsSUFBSTs7OztZQUlGLElBQUk7MkJBQ1csY0FBYzs7O0tBR3BDLENBQUM7SUFDSixDQUFDO0NBQ0YiLCJzb3VyY2VzQ29udGVudCI6WyIvKipcbiAqIEBsaWNlbnNlXG4gKiBDb3B5cmlnaHQgMjAxNyBHb29nbGUgTExDLiBBbGwgUmlnaHRzIFJlc2VydmVkLlxuICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlIFwiTGljZW5zZVwiKTtcbiAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS5cbiAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdFxuICpcbiAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMFxuICpcbiAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmVcbiAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuIFwiQVMgSVNcIiBCQVNJUyxcbiAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLlxuICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZFxuICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuXG4gKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuICovXG5cbmltcG9ydCB7R1BHUFVQcm9ncmFtfSBmcm9tICcuL2dwZ3B1X21hdGgnO1xuaW1wb3J0IHtnZXRDb29yZHNEYXRhVHlwZSwgVW5pZm9ybVR5cGV9IGZyb20gJy4vc2hhZGVyX2NvbXBpbGVyJztcblxuZXhwb3J0IGNsYXNzIFBhZFByb2dyYW0gaW1wbGVtZW50cyBHUEdQVVByb2dyYW0ge1xuICB2YXJpYWJsZU5hbWVzID0gWyd4J107XG4gIG91dHB1dFNoYXBlOiBudW1iZXJbXTtcbiAgdXNlckNvZGU6IHN0cmluZztcbiAgY3VzdG9tVW5pZm9ybXMgPSBbe25hbWU6ICd2YWx1ZScsIHR5cGU6ICdmbG9hdCcgYXMgVW5pZm9ybVR5cGV9XTtcblxuICBjb25zdHJ1Y3RvcihcbiAgICAgIHhTaGFwZTogbnVtYmVyW10sIHBhZGRpbmdzOiBBcnJheTxbbnVtYmVyLCBudW1iZXJdPixcbiAgICAgIGNvbnN0YW50VmFsdWU6IG51bWJlcikge1xuICAgIHRoaXMub3V0cHV0U2hhcGUgPSBwYWRkaW5ncy5tYXAoXG4gICAgICAgIChwLCBpKSA9PiBwWzBdIC8qIGJlZm9yZVBhZCAqLyArIHhTaGFwZVtpXSArIHBbMV0gLyogYWZ0ZXJQYWQgKi8pO1xuICAgIGNvbnN0IHJhbmsgPSB4U2hhcGUubGVuZ3RoO1xuICAgIGNvbnN0IHR5cGUgPSBnZXRDb29yZHNEYXRhVHlwZShyYW5rKTtcblxuICAgIGNvbnN0IHN0YXJ0ID0gcGFkZGluZ3MubWFwKHAgPT4gcFswXSkuam9pbignLCcpO1xuICAgIGNvbnN0IGVuZCA9IHBhZGRpbmdzLm1hcCgocCwgaSkgPT4gcFswXSArIHhTaGFwZVtpXSkuam9pbignLCcpO1xuICAgIGNvbnN0IHVucGFja2VkQ29vcmRzID1cbiAgICAgICAgWydjb29yZHNbMF0nLCAnY29vcmRzWzFdJywgJ2Nvb3Jkc1syXScsICdjb29yZHNbM10nXS5zbGljZSgwLCByYW5rKTtcblxuICAgIGlmIChyYW5rID09PSAxKSB7XG4gICAgICB0aGlzLnVzZXJDb2RlID0gYFxuICAgICAgICBpbnQgc3RhcnQgPSAke3N0YXJ0fTtcbiAgICAgICAgaW50IGVuZCA9ICR7ZW5kfTtcblxuICAgICAgICB2b2lkIG1haW4oKSB7XG4gICAgICAgICAgaW50IG91dEMgPSBnZXRPdXRwdXRDb29yZHMoKTtcbiAgICAgICAgICBpZiAob3V0QyA8IHN0YXJ0IHx8IG91dEMgPj0gZW5kKSB7XG4gICAgICAgICAgICBzZXRPdXRwdXQodmFsdWUpO1xuICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICBzZXRPdXRwdXQoZ2V0WChvdXRDIC0gc3RhcnQpKTtcbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgIGA7XG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIHRoaXMudXNlckNvZGUgPSBgXG4gICAgICAke3R5cGV9IHN0YXJ0ID0gJHt0eXBlfSgke3N0YXJ0fSk7XG4gICAgICAke3R5cGV9IGVuZCA9ICR7dHlwZX0oJHtlbmR9KTtcblxuICAgICAgdm9pZCBtYWluKCkge1xuICAgICAgICAke3R5cGV9IG91dEMgPSBnZXRPdXRwdXRDb29yZHMoKTtcbiAgICAgICAgaWYgKGFueShsZXNzVGhhbihvdXRDLCBzdGFydCkpIHx8IGFueShncmVhdGVyVGhhbkVxdWFsKG91dEMsIGVuZCkpKSB7XG4gICAgICAgICAgc2V0T3V0cHV0KHZhbHVlKTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAke3R5cGV9IGNvb3JkcyA9IG91dEMgLSBzdGFydDtcbiAgICAgICAgICBzZXRPdXRwdXQoZ2V0WCgke3VucGFja2VkQ29vcmRzfSkpO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgYDtcbiAgfVxufVxuIl19","/**\n * @license\n * Copyright 2019 Google LLC. All Rights Reserved.\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n * =============================================================================\n */\nimport { getChannels } from './packing_util';\nimport { getCoordsDataType } from './shader_compiler';\nexport class PadPackedProgram {\n constructor(xShape, paddings, constantValue) {\n this.variableNames = ['x'];\n this.packedInputs = true;\n this.packedOutput = true;\n this.customUniforms = [{ name: 'value', type: 'float' }];\n this.outputShape = paddings.map((p, i) => p[0] /* beforePad */ + xShape[i] + p[1] /* afterPad */);\n const rank = xShape.length;\n const dtype = getCoordsDataType(rank);\n const start = paddings.map(p => p[0]).join(',');\n const end = paddings.map((p, i) => p[0] + xShape[i]).join(',');\n const coords = getChannels('rc', rank);\n const source = getChannels('source', rank);\n const cLimit = `${coords[rank - 1]} < ${this.outputShape[rank - 1]}`;\n const innerDims = rank === 1 ? 'source' : `vec2(${source.slice(-2).join()})`;\n const componentSetup = [\n `${dtype} rc = outputLoc;`, `${coords[rank - 1]} += 1;\n if(${cLimit}) {\n `,\n rank === 1 ? '' : `}\n rc = outputLoc;\n ${coords[rank - 2]} += 1;\n if(${coords[rank - 2]} < ${this.outputShape[rank - 2]}) {`,\n rank === 1 ? '' : ` ${coords[rank - 1]} += 1;\n if(${cLimit}) {`\n ];\n const paddingArea = rank === 1 ?\n 'rc < start || rc >= end' :\n 'any(lessThan(rc, start)) || any(greaterThanEqual(rc, end))';\n let mainLoop = '';\n for (let i = 0, j = rank === 1 ? 2 : 4; i < j; i++) {\n mainLoop += `\n ${componentSetup[i]}\n if (${paddingArea}) {\n result[${i}] = float(value);\n } else {\n ${dtype} source = rc - start;\n result[${i}] = getChannel(getX(${source.join()}), ${innerDims});\n }\n `;\n }\n mainLoop += (rank === 1 ? `} ` : `}}`);\n this.userCode = `\n const ${dtype} start = ${dtype}(${start});\n const ${dtype} end = ${dtype}(${end});\n\n void main() {\n ${dtype} outputLoc = getOutputCoords();\n vec4 result = vec4(0.);\n ${mainLoop}\n setOutput(result);\n }\n `;\n }\n}\n//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicGFkX3BhY2tlZF9ncHUuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi90ZmpzLWJhY2tlbmQtd2ViZ2wvc3JjL3BhZF9wYWNrZWRfZ3B1LnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBOzs7Ozs7Ozs7Ozs7Ozs7R0FlRztBQUdILE9BQU8sRUFBQyxXQUFXLEVBQUMsTUFBTSxnQkFBZ0IsQ0FBQztBQUMzQyxPQUFPLEVBQUMsaUJBQWlCLEVBQWMsTUFBTSxtQkFBbUIsQ0FBQztBQUVqRSxNQUFNLE9BQU8sZ0JBQWdCO0lBUTNCLFlBQ0ksTUFBZ0IsRUFBRSxRQUFpQyxFQUNuRCxhQUFxQjtRQVR6QixrQkFBYSxHQUFHLENBQUMsR0FBRyxDQUFDLENBQUM7UUFDdEIsaUJBQVksR0FBRyxJQUFJLENBQUM7UUFDcEIsaUJBQVksR0FBRyxJQUFJLENBQUM7UUFHcEIsbUJBQWMsR0FBRyxDQUFDLEVBQUMsSUFBSSxFQUFFLE9BQU8sRUFBRSxJQUFJLEVBQUUsT0FBc0IsRUFBQyxDQUFDLENBQUM7UUFLL0QsSUFBSSxDQUFDLFdBQVcsR0FBRyxRQUFRLENBQUMsR0FBRyxDQUMzQixDQUFDLENBQUMsRUFBRSxDQUFDLEVBQUUsRUFBRSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxlQUFlLEdBQUcsTUFBTSxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxjQUFjLENBQUMsQ0FBQztRQUN0RSxNQUFNLElBQUksR0FBRyxNQUFNLENBQUMsTUFBTSxDQUFDO1FBQzNCLE1BQU0sS0FBSyxHQUFHLGlCQUFpQixDQUFDLElBQUksQ0FBQyxDQUFDO1FBRXRDLE1BQU0sS0FBSyxHQUFHLFFBQVEsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsR0FBRyxDQUFDLENBQUM7UUFDaEQsTUFBTSxHQUFHLEdBQUcsUUFBUSxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLEVBQUUsRUFBRSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsR0FBRyxNQUFNLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsR0FBRyxDQUFDLENBQUM7UUFDL0QsTUFBTSxNQUFNLEdBQUcsV0FBVyxDQUFDLElBQUksRUFBRSxJQUFJLENBQUMsQ0FBQztRQUN2QyxNQUFNLE1BQU0sR0FBRyxXQUFXLENBQUMsUUFBUSxFQUFFLElBQUksQ0FBQyxDQUFDO1FBQzNDLE1BQU0sTUFBTSxHQUFHLEdBQUcsTUFBTSxDQUFDLElBQUksR0FBRyxDQUFDLENBQUMsTUFBTSxJQUFJLENBQUMsV0FBVyxDQUFDLElBQUksR0FBRyxDQUFDLENBQUMsRUFBRSxDQUFDO1FBQ3JFLE1BQU0sU0FBUyxHQUNYLElBQUksS0FBSyxDQUFDLENBQUMsQ0FBQyxDQUFDLFFBQVEsQ0FBQyxDQUFDLENBQUMsUUFBUSxNQUFNLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxFQUFFLEdBQUcsQ0FBQztRQUUvRCxNQUFNLGNBQWMsR0FBRztZQUNyQixHQUFHLEtBQUssa0JBQWtCLEVBQUUsR0FBRyxNQUFNLENBQUMsSUFBSSxHQUFHLENBQUMsQ0FBQztZQUN6QyxNQUFNO09BQ1g7WUFDRCxJQUFJLEtBQUssQ0FBQyxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDOztTQUVmLE1BQU0sQ0FBQyxJQUFJLEdBQUcsQ0FBQyxDQUFDO1lBQ2IsTUFBTSxDQUFDLElBQUksR0FBRyxDQUFDLENBQUMsTUFBTSxJQUFJLENBQUMsV0FBVyxDQUFDLElBQUksR0FBRyxDQUFDLENBQUMsS0FBSztZQUMzRCxJQUFJLEtBQUssQ0FBQyxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLEtBQUssTUFBTSxDQUFDLElBQUksR0FBRyxDQUFDLENBQUM7Y0FDL0IsTUFBTSxLQUFLO1NBQ3BCLENBQUM7UUFFRixNQUFNLFdBQVcsR0FBRyxJQUFJLEtBQUssQ0FBQyxDQUFDLENBQUM7WUFDNUIseUJBQXlCLENBQUMsQ0FBQztZQUMzQiw0REFBNEQsQ0FBQztRQUNqRSxJQUFJLFFBQVEsR0FBRyxFQUFFLENBQUM7UUFDbEIsS0FBSyxJQUFJLENBQUMsR0FBRyxDQUFDLEVBQUUsQ0FBQyxHQUFHLElBQUksS0FBSyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsR0FBRyxDQUFDLEVBQUUsQ0FBQyxFQUFFLEVBQUU7WUFDbEQsUUFBUSxJQUFJO1VBQ1IsY0FBYyxDQUFDLENBQUMsQ0FBQztjQUNiLFdBQVc7bUJBQ04sQ0FBQzs7WUFFUixLQUFLO21CQUNFLENBQUMsdUJBQXVCLE1BQU0sQ0FBQyxJQUFJLEVBQUUsTUFBTSxTQUFTOztPQUVoRSxDQUFDO1NBQ0g7UUFDRCxRQUFRLElBQUksQ0FBQyxJQUFJLEtBQUssQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDO1FBRXZDLElBQUksQ0FBQyxRQUFRLEdBQUc7Y0FDTixLQUFLLFlBQVksS0FBSyxJQUFJLEtBQUs7Y0FDL0IsS0FBSyxVQUFVLEtBQUssSUFBSSxHQUFHOzs7VUFHL0IsS0FBSzs7VUFFTCxRQUFROzs7S0FHYixDQUFDO0lBQ0osQ0FBQztDQUNGIiwic291cmNlc0NvbnRlbnQiOlsiLyoqXG4gKiBAbGljZW5zZVxuICogQ29weXJpZ2h0IDIwMTkgR29vZ2xlIExMQy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC5cbiAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSBcIkxpY2Vuc2VcIik7XG4gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuXG4gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXRcbiAqXG4gKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjBcbiAqXG4gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlXG4gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiBcIkFTIElTXCIgQkFTSVMsXG4gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC5cbiAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmRcbiAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLlxuICogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbiAqL1xuXG5pbXBvcnQge0dQR1BVUHJvZ3JhbX0gZnJvbSAnLi9ncGdwdV9tYXRoJztcbmltcG9ydCB7Z2V0Q2hhbm5lbHN9IGZyb20gJy4vcGFja2luZ191dGlsJztcbmltcG9ydCB7Z2V0Q29vcmRzRGF0YVR5cGUsIFVuaWZvcm1UeXBlfSBmcm9tICcuL3NoYWRlcl9jb21waWxlcic7XG5cbmV4cG9ydCBjbGFzcyBQYWRQYWNrZWRQcm9ncmFtIGltcGxlbWVudHMgR1BHUFVQcm9ncmFtIHtcbiAgdmFyaWFibGVOYW1lcyA9IFsneCddO1xuICBwYWNrZWRJbnB1dHMgPSB0cnVlO1xuICBwYWNrZWRPdXRwdXQgPSB0cnVlO1xuICBvdXRwdXRTaGFwZTogbnVtYmVyW107XG4gIHVzZXJDb2RlOiBzdHJpbmc7XG4gIGN1c3RvbVVuaWZvcm1zID0gW3tuYW1lOiAndmFsdWUnLCB0eXBlOiAnZmxvYXQnIGFzIFVuaWZvcm1UeXBlfV07XG5cbiAgY29uc3RydWN0b3IoXG4gICAgICB4U2hhcGU6IG51bWJlcltdLCBwYWRkaW5nczogQXJyYXk8W251bWJlciwgbnVtYmVyXT4sXG4gICAgICBjb25zdGFudFZhbHVlOiBudW1iZXIpIHtcbiAgICB0aGlzLm91dHB1dFNoYXBlID0gcGFkZGluZ3MubWFwKFxuICAgICAgICAocCwgaSkgPT4gcFswXSAvKiBiZWZvcmVQYWQgKi8gKyB4U2hhcGVbaV0gKyBwWzFdIC8qIGFmdGVyUGFkICovKTtcbiAgICBjb25zdCByYW5rID0geFNoYXBlLmxlbmd0aDtcbiAgICBjb25zdCBkdHlwZSA9IGdldENvb3Jkc0RhdGFUeXBlKHJhbmspO1xuXG4gICAgY29uc3Qgc3RhcnQgPSBwYWRkaW5ncy5tYXAocCA9PiBwWzBdKS5qb2luKCcsJyk7XG4gICAgY29uc3QgZW5kID0gcGFkZGluZ3MubWFwKChwLCBpKSA9PiBwWzBdICsgeFNoYXBlW2ldKS5qb2luKCcsJyk7XG4gICAgY29uc3QgY29vcmRzID0gZ2V0Q2hhbm5lbHMoJ3JjJywgcmFuayk7XG4gICAgY29uc3Qgc291cmNlID0gZ2V0Q2hhbm5lbHMoJ3NvdXJjZScsIHJhbmspO1xuICAgIGNvbnN0IGNMaW1pdCA9IGAke2Nvb3Jkc1tyYW5rIC0gMV19IDwgJHt0aGlzLm91dHB1dFNoYXBlW3JhbmsgLSAxXX1gO1xuICAgIGNvbnN0IGlubmVyRGltcyA9XG4gICAgICAgIHJhbmsgPT09IDEgPyAnc291cmNlJyA6IGB2ZWMyKCR7c291cmNlLnNsaWNlKC0yKS5qb2luKCl9KWA7XG5cbiAgICBjb25zdCBjb21wb25lbnRTZXR1cCA9IFtcbiAgICAgIGAke2R0eXBlfSByYyA9IG91dHB1dExvYztgLCBgJHtjb29yZHNbcmFuayAtIDFdfSArPSAxO1xuICAgICAgIGlmKCR7Y0xpbWl0fSkge1xuICAgICAgYCxcbiAgICAgIHJhbmsgPT09IDEgPyAnJyA6IGB9XG4gICAgICAgcmMgPSBvdXRwdXRMb2M7XG4gICAgICAgJHtjb29yZHNbcmFuayAtIDJdfSArPSAxO1xuICAgICAgIGlmKCR7Y29vcmRzW3JhbmsgLSAyXX0gPCAke3RoaXMub3V0cHV0U2hhcGVbcmFuayAtIDJdfSkge2AsXG4gICAgICByYW5rID09PSAxID8gJycgOiBgICAke2Nvb3Jkc1tyYW5rIC0gMV19ICs9IDE7XG4gICAgICAgICBpZigke2NMaW1pdH0pIHtgXG4gICAgXTtcblxuICAgIGNvbnN0IHBhZGRpbmdBcmVhID0gcmFuayA9PT0gMSA/XG4gICAgICAgICdyYyA8IHN0YXJ0IHx8IHJjID49IGVuZCcgOlxuICAgICAgICAnYW55KGxlc3NUaGFuKHJjLCBzdGFydCkpIHx8IGFueShncmVhdGVyVGhhbkVxdWFsKHJjLCBlbmQpKSc7XG4gICAgbGV0IG1haW5Mb29wID0gJyc7XG4gICAgZm9yIChsZXQgaSA9IDAsIGogPSByYW5rID09PSAxID8gMiA6IDQ7IGkgPCBqOyBpKyspIHtcbiAgICAgIG1haW5Mb29wICs9IGBcbiAgICAgICAgJHtjb21wb25lbnRTZXR1cFtpXX1cbiAgICAgICAgaWYgKCR7cGFkZGluZ0FyZWF9KSB7XG4gICAgICAgICAgcmVzdWx0WyR7aX1dID0gZmxvYXQodmFsdWUpO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICR7ZHR5cGV9IHNvdXJjZSA9IHJjIC0gc3RhcnQ7XG4gICAgICAgICAgcmVzdWx0WyR7aX1dID0gZ2V0Q2hhbm5lbChnZXRYKCR7c291cmNlLmpvaW4oKX0pLCAke2lubmVyRGltc30pO1xuICAgICAgICB9XG4gICAgICBgO1xuICAgIH1cbiAgICBtYWluTG9vcCArPSAocmFuayA9PT0gMSA/IGB9IGAgOiBgfX1gKTtcblxuICAgIHRoaXMudXNlckNvZGUgPSBgXG4gICAgICBjb25zdCAke2R0eXBlfSBzdGFydCA9ICR7ZHR5cGV9KCR7c3RhcnR9KTtcbiAgICAgIGNvbnN0ICR7ZHR5cGV9IGVuZCA9ICR7ZHR5cGV9KCR7ZW5kfSk7XG5cbiAgICAgIHZvaWQgbWFpbigpIHtcbiAgICAgICAgJHtkdHlwZX0gb3V0cHV0TG9jID0gZ2V0T3V0cHV0Q29vcmRzKCk7XG4gICAgICAgIHZlYzQgcmVzdWx0ID0gdmVjNCgwLik7XG4gICAgICAgICR7bWFpbkxvb3B9XG4gICAgICAgIHNldE91dHB1dChyZXN1bHQpO1xuICAgICAgfVxuICAgIGA7XG4gIH1cbn1cbiJdfQ==","/**\n * @license\n * Copyright 2020 Google LLC. All Rights Reserved.\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n * =============================================================================\n */\nimport { env, PadV2, util } from '@tensorflow/tfjs-core';\nimport { PadProgram } from '../pad_gpu';\nimport { PadPackedProgram } from '../pad_packed_gpu';\nimport { fill } from './Fill';\nexport const padV2 = (args) => {\n const { inputs, backend, attrs } = args;\n const { x } = inputs;\n const { paddings, constantValue } = attrs;\n if (util.sizeFromShape(x.shape) === 0) {\n // Short-circuit the computation, since x doesn't have value, only\n // the shape is used to compute output shape to pad.\n const outputShape = paddings.map((p, i) => p[0] /* beforePad */ + x.shape[i] + p[1] /* afterPad */);\n return fill({\n backend,\n attrs: { shape: outputShape, value: constantValue, dtype: x.dtype }\n });\n }\n const program = env().getBool('WEBGL_PACK_ARRAY_OPERATIONS') ?\n new PadPackedProgram(x.shape, paddings, constantValue) :\n new PadProgram(x.shape, paddings, constantValue);\n const customValues = [[constantValue]];\n return backend.runWebGLProgram(program, [x], x.dtype, customValues);\n};\nexport const padV2Config = {\n kernelName: PadV2,\n backendName: 'webgl',\n kernelFunc: padV2\n};\n//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiUGFkVjIuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi8uLi90ZmpzLWJhY2tlbmQtd2ViZ2wvc3JjL2tlcm5lbHMvUGFkVjIudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUE7Ozs7Ozs7Ozs7Ozs7OztHQWVHO0FBRUgsT0FBTyxFQUFDLEdBQUcsRUFBNEIsS0FBSyxFQUF1QyxJQUFJLEVBQUMsTUFBTSx1QkFBdUIsQ0FBQztBQUd0SCxPQUFPLEVBQUMsVUFBVSxFQUFDLE1BQU0sWUFBWSxDQUFDO0FBQ3RDLE9BQU8sRUFBQyxnQkFBZ0IsRUFBQyxNQUFNLG1CQUFtQixDQUFDO0FBQ25ELE9BQU8sRUFBQyxJQUFJLEVBQUMsTUFBTSxRQUFRLENBQUM7QUFFNUIsTUFBTSxDQUFDLE1BQU0sS0FBSyxHQUNkLENBQUMsSUFBeUUsRUFDM0QsRUFBRTtJQUNYLE1BQU0sRUFBQyxNQUFNLEVBQUUsT0FBTyxFQUFFLEtBQUssRUFBQyxHQUFHLElBQUksQ0FBQztJQUN0QyxNQUFNLEVBQUMsQ0FBQyxFQUFDLEdBQUcsTUFBTSxDQUFDO0lBQ25CLE1BQU0sRUFBQyxRQUFRLEVBQUUsYUFBYSxFQUFDLEdBQUcsS0FBSyxDQUFDO0lBRXhDLElBQUksSUFBSSxDQUFDLGFBQWEsQ0FBQyxDQUFDLENBQUMsS0FBSyxDQUFDLEtBQUssQ0FBQyxFQUFFO1FBQ3JDLGtFQUFrRTtRQUNsRSxvREFBb0Q7UUFDcEQsTUFBTSxXQUFXLEdBQUcsUUFBUSxDQUFDLEdBQUcsQ0FDNUIsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxFQUFFLEVBQUUsQ0FDTCxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsZUFBZSxHQUFHLENBQUMsQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLGNBQWMsQ0FBQyxDQUFDO1FBQ2pFLE9BQU8sSUFBSSxDQUFDO1lBQ1YsT0FBTztZQUNQLEtBQUssRUFBRSxFQUFDLEtBQUssRUFBRSxXQUFXLEVBQUUsS0FBSyxFQUFFLGFBQWEsRUFBRSxLQUFLLEVBQUUsQ0FBQyxDQUFDLEtBQUssRUFBQztTQUNsRSxDQUFDLENBQUM7S0FDSjtJQUVELE1BQU0sT0FBTyxHQUFHLEdBQUcsRUFBRSxDQUFDLE9BQU8sQ0FBQyw2QkFBNkIsQ0FBQyxDQUFDLENBQUM7UUFDMUQsSUFBSSxnQkFBZ0IsQ0FBQyxDQUFDLENBQUMsS0FBSyxFQUFFLFFBQVEsRUFBRSxhQUFhLENBQUMsQ0FBQyxDQUFDO1FBQ3hELElBQUksVUFBVSxDQUFDLENBQUMsQ0FBQyxLQUFLLEVBQUUsUUFBUSxFQUFFLGFBQWEsQ0FBQyxDQUFDO0lBQ3JELE1BQU0sWUFBWSxHQUFHLENBQUMsQ0FBQyxhQUFhLENBQUMsQ0FBQyxDQUFDO0lBQ3ZDLE9BQU8sT0FBTyxDQUFDLGVBQWUsQ0FBQyxPQUFPLEVBQUUsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsS0FBSyxFQUFFLFlBQVksQ0FBQyxDQUFDO0FBQ3RFLENBQUMsQ0FBQztBQUVWLE1BQU0sQ0FBQyxNQUFNLFdBQVcsR0FBaUI7SUFDdkMsVUFBVSxFQUFFLEtBQUs7SUFDakIsV0FBVyxFQUFFLE9BQU87SUFDcEIsVUFBVSxFQUFFLEtBQXlCO0NBQ3RDLENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyIvKipcbiAqIEBsaWNlbnNlXG4gKiBDb3B5cmlnaHQgMjAyMCBHb29nbGUgTExDLiBBbGwgUmlnaHRzIFJlc2VydmVkLlxuICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlIFwiTGljZW5zZVwiKTtcbiAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS5cbiAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdFxuICpcbiAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMFxuICpcbiAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmVcbiAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuIFwiQVMgSVNcIiBCQVNJUyxcbiAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLlxuICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZFxuICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuXG4gKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuICovXG5cbmltcG9ydCB7ZW52LCBLZXJuZWxDb25maWcsIEtlcm5lbEZ1bmMsIFBhZFYyLCBQYWRWMkF0dHJzLCBQYWRWMklucHV0cywgVGVuc29ySW5mbywgdXRpbH0gZnJvbSAnQHRlbnNvcmZsb3cvdGZqcy1jb3JlJztcblxuaW1wb3J0IHtNYXRoQmFja2VuZFdlYkdMfSBmcm9tICcuLi9iYWNrZW5kX3dlYmdsJztcbmltcG9ydCB7UGFkUHJvZ3JhbX0gZnJvbSAnLi4vcGFkX2dwdSc7XG5pbXBvcnQge1BhZFBhY2tlZFByb2dyYW19IGZyb20gJy4uL3BhZF9wYWNrZWRfZ3B1JztcbmltcG9ydCB7ZmlsbH0gZnJvbSAnLi9GaWxsJztcblxuZXhwb3J0IGNvbnN0IHBhZFYyID1cbiAgICAoYXJnczoge2lucHV0czogUGFkVjJJbnB1dHMsIGJhY2tlbmQ6IE1hdGhCYWNrZW5kV2ViR0wsIGF0dHJzOiBQYWRWMkF0dHJzfSk6XG4gICAgICAgIFRlbnNvckluZm8gPT4ge1xuICAgICAgICAgIGNvbnN0IHtpbnB1dHMsIGJhY2tlbmQsIGF0dHJzfSA9IGFyZ3M7XG4gICAgICAgICAgY29uc3Qge3h9ID0gaW5wdXRzO1xuICAgICAgICAgIGNvbnN0IHtwYWRkaW5ncywgY29uc3RhbnRWYWx1ZX0gPSBhdHRycztcblxuICAgICAgICAgIGlmICh1dGlsLnNpemVGcm9tU2hhcGUoeC5zaGFwZSkgPT09IDApIHtcbiAgICAgICAgICAgIC8vIFNob3J0LWNpcmN1aXQgdGhlIGNvbXB1dGF0aW9uLCBzaW5jZSB4IGRvZXNuJ3QgaGF2ZSB2YWx1ZSwgb25seVxuICAgICAgICAgICAgLy8gdGhlIHNoYXBlIGlzIHVzZWQgdG8gY29tcHV0ZSBvdXRwdXQgc2hhcGUgdG8gcGFkLlxuICAgICAgICAgICAgY29uc3Qgb3V0cHV0U2hhcGUgPSBwYWRkaW5ncy5tYXAoXG4gICAgICAgICAgICAgICAgKHAsIGkpID0+XG4gICAgICAgICAgICAgICAgICAgIHBbMF0gLyogYmVmb3JlUGFkICovICsgeC5zaGFwZVtpXSArIHBbMV0gLyogYWZ0ZXJQYWQgKi8pO1xuICAgICAgICAgICAgcmV0dXJuIGZpbGwoe1xuICAgICAgICAgICAgICBiYWNrZW5kLFxuICAgICAgICAgICAgICBhdHRyczoge3NoYXBlOiBvdXRwdXRTaGFwZSwgdmFsdWU6IGNvbnN0YW50VmFsdWUsIGR0eXBlOiB4LmR0eXBlfVxuICAgICAgICAgICAgfSk7XG4gICAgICAgICAgfVxuXG4gICAgICAgICAgY29uc3QgcHJvZ3JhbSA9IGVudigpLmdldEJvb2woJ1dFQkdMX1BBQ0tfQVJSQVlfT1BFUkFUSU9OUycpID9cbiAgICAgICAgICAgICAgbmV3IFBhZFBhY2tlZFByb2dyYW0oeC5zaGFwZSwgcGFkZGluZ3MsIGNvbnN0YW50VmFsdWUpIDpcbiAgICAgICAgICAgICAgbmV3IFBhZFByb2dyYW0oeC5zaGFwZSwgcGFkZGluZ3MsIGNvbnN0YW50VmFsdWUpO1xuICAgICAgICAgIGNvbnN0IGN1c3RvbVZhbHVlcyA9IFtbY29uc3RhbnRWYWx1ZV1dO1xuICAgICAgICAgIHJldHVybiBiYWNrZW5kLnJ1bldlYkdMUHJvZ3JhbShwcm9ncmFtLCBbeF0sIHguZHR5cGUsIGN1c3RvbVZhbHVlcyk7XG4gICAgICAgIH07XG5cbmV4cG9ydCBjb25zdCBwYWRWMkNvbmZpZzogS2VybmVsQ29uZmlnID0ge1xuICBrZXJuZWxOYW1lOiBQYWRWMixcbiAgYmFja2VuZE5hbWU6ICd3ZWJnbCcsXG4gIGtlcm5lbEZ1bmM6IHBhZFYyIGFzIHt9IGFzIEtlcm5lbEZ1bmNcbn07XG4iXX0=","/**\n * @license\n * Copyright 2020 Google LLC. All Rights Reserved.\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n * =============================================================================\n */\nimport { Pow } from '@tensorflow/tfjs-core';\nimport { CHECK_NAN_SNIPPET_PACKED } from '../binaryop_packed_gpu';\nimport { binaryKernelFunc } from '../kernel_utils/kernel_funcs_utils';\nconst POW = `\n if(a < 0.0 && floor(b) < b){\n return NAN;\n }\n if (b == 0.0) {\n return 1.0;\n }\n return (round(mod(b, 2.0)) != 1) ?\n pow(abs(a), b) : sign(a) * pow(abs(a), b);\n`;\nconst POW_PACKED = `\n // isModRound1 has 1 for components with round(mod(b, 2.0)) == 1, 0 otherwise.\n vec4 isModRound1 = vec4(equal(round(mod(b, 2.0)), ivec4(1)));\n vec4 multiplier = sign(a) * isModRound1 + (vec4(1.0) - isModRound1);\n vec4 result = multiplier * pow(abs(a), b);\n\n // Ensure that a^0 = 1, including 0^0 = 1 as this correspond to TF and JS\n bvec4 isExpZero = equal(b, vec4(0.0));\n result.r = isExpZero.r ? 1.0 : result.r;\n result.g = isExpZero.g ? 1.0 : result.g;\n result.b = isExpZero.b ? 1.0 : result.b;\n result.a = isExpZero.a ? 1.0 : result.a;\n\n bvec4 isNaN1 = lessThan(a, vec4(0.0));\n bvec4 isNaN2 = lessThan(floor(b), b);\n bvec4 isNaN = bvec4(isNaN1.x && isNaN2.x, isNaN1.y && isNaN2.y, isNaN1.z && isNaN2.z, isNaN1.w && isNaN2.w);\n ` +\n CHECK_NAN_SNIPPET_PACKED + `\n return result;\n`;\nexport const pow = binaryKernelFunc({ opSnippet: POW, packedOpSnippet: POW_PACKED });\nexport const powConfig = {\n kernelName: Pow,\n backendName: 'webgl',\n kernelFunc: pow\n};\n//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiUG93LmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vLi4vdGZqcy1iYWNrZW5kLXdlYmdsL3NyYy9rZXJuZWxzL1Bvdy50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQTs7Ozs7Ozs7Ozs7Ozs7O0dBZUc7QUFFSCxPQUFPLEVBQTJCLEdBQUcsRUFBQyxNQUFNLHVCQUF1QixDQUFDO0FBRXBFLE9BQU8sRUFBQyx3QkFBd0IsRUFBQyxNQUFNLHdCQUF3QixDQUFDO0FBQ2hFLE9BQU8sRUFBQyxnQkFBZ0IsRUFBQyxNQUFNLG9DQUFvQyxDQUFDO0FBRXBFLE1BQU0sR0FBRyxHQUFHOzs7Ozs7Ozs7Q0FTWCxDQUFDO0FBRUYsTUFBTSxVQUFVLEdBQUc7Ozs7Ozs7Ozs7Ozs7Ozs7R0FnQmhCO0lBQ0Msd0JBQXdCLEdBQUc7O0NBRTlCLENBQUM7QUFFRixNQUFNLENBQUMsTUFBTSxHQUFHLEdBQ1osZ0JBQWdCLENBQUMsRUFBQyxTQUFTLEVBQUUsR0FBRyxFQUFFLGVBQWUsRUFBRSxVQUFVLEVBQUMsQ0FBQyxDQUFDO0FBRXBFLE1BQU0sQ0FBQyxNQUFNLFNBQVMsR0FBaUI7SUFDckMsVUFBVSxFQUFFLEdBQUc7SUFDZixXQUFXLEVBQUUsT0FBTztJQUNwQixVQUFVLEVBQUUsR0FBdUI7Q0FDcEMsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbIi8qKlxuICogQGxpY2Vuc2VcbiAqIENvcHlyaWdodCAyMDIwIEdvb2dsZSBMTEMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuXG4gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgXCJMaWNlbnNlXCIpO1xuICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLlxuICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0XG4gKlxuICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wXG4gKlxuICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZVxuICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gXCJBUyBJU1wiIEJBU0lTLFxuICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuXG4gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kXG4gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS5cbiAqID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4gKi9cblxuaW1wb3J0IHtLZXJuZWxDb25maWcsIEtlcm5lbEZ1bmMsIFBvd30gZnJvbSAnQHRlbnNvcmZsb3cvdGZqcy1jb3JlJztcblxuaW1wb3J0IHtDSEVDS19OQU5fU05JUFBFVF9QQUNLRUR9IGZyb20gJy4uL2JpbmFyeW9wX3BhY2tlZF9ncHUnO1xuaW1wb3J0IHtiaW5hcnlLZXJuZWxGdW5jfSBmcm9tICcuLi9rZXJuZWxfdXRpbHMva2VybmVsX2Z1bmNzX3V0aWxzJztcblxuY29uc3QgUE9XID0gYFxuICBpZihhIDwgMC4wICYmIGZsb29yKGIpIDwgYil7XG4gICAgcmV0dXJuIE5BTjtcbiAgfVxuICBpZiAoYiA9PSAwLjApIHtcbiAgICByZXR1cm4gMS4wO1xuICB9XG4gIHJldHVybiAocm91bmQobW9kKGIsIDIuMCkpICE9IDEpID9cbiAgICAgIHBvdyhhYnMoYSksIGIpIDogc2lnbihhKSAqIHBvdyhhYnMoYSksIGIpO1xuYDtcblxuY29uc3QgUE9XX1BBQ0tFRCA9IGBcbiAgLy8gaXNNb2RSb3VuZDEgaGFzIDEgZm9yIGNvbXBvbmVudHMgd2l0aCByb3VuZChtb2QoYiwgMi4wKSkgPT0gMSwgMCBvdGhlcndpc2UuXG4gIHZlYzQgaXNNb2RSb3VuZDEgPSB2ZWM0KGVxdWFsKHJvdW5kKG1vZChiLCAyLjApKSwgaXZlYzQoMSkpKTtcbiAgdmVjNCBtdWx0aXBsaWVyID0gc2lnbihhKSAqIGlzTW9kUm91bmQxICsgKHZlYzQoMS4wKSAtIGlzTW9kUm91bmQxKTtcbiAgdmVjNCByZXN1bHQgPSBtdWx0aXBsaWVyICogcG93KGFicyhhKSwgYik7XG5cbiAgLy8gRW5zdXJlIHRoYXQgYV4wID0gMSwgaW5jbHVkaW5nIDBeMCA9IDEgYXMgdGhpcyBjb3JyZXNwb25kIHRvIFRGIGFuZCBKU1xuICBidmVjNCBpc0V4cFplcm8gPSBlcXVhbChiLCB2ZWM0KDAuMCkpO1xuICByZXN1bHQuciA9IGlzRXhwWmVyby5yID8gMS4wIDogcmVzdWx0LnI7XG4gIHJlc3VsdC5nID0gaXNFeHBaZXJvLmcgPyAxLjAgOiByZXN1bHQuZztcbiAgcmVzdWx0LmIgPSBpc0V4cFplcm8uYiA/IDEuMCA6IHJlc3VsdC5iO1xuICByZXN1bHQuYSA9IGlzRXhwWmVyby5hID8gMS4wIDogcmVzdWx0LmE7XG5cbiAgYnZlYzQgaXNOYU4xID0gbGVzc1RoYW4oYSwgdmVjNCgwLjApKTtcbiAgYnZlYzQgaXNOYU4yID0gbGVzc1RoYW4oZmxvb3IoYiksIGIpO1xuICBidmVjNCBpc05hTiA9IGJ2ZWM0KGlzTmFOMS54ICYmIGlzTmFOMi54LCBpc05hTjEueSAmJiBpc05hTjIueSwgaXNOYU4xLnogJiYgaXNOYU4yLnosIGlzTmFOMS53ICYmIGlzTmFOMi53KTtcbiAgYCArXG4gICAgQ0hFQ0tfTkFOX1NOSVBQRVRfUEFDS0VEICsgYFxuICByZXR1cm4gcmVzdWx0O1xuYDtcblxuZXhwb3J0IGNvbnN0IHBvdyA9XG4gICAgYmluYXJ5S2VybmVsRnVuYyh7b3BTbmlwcGV0OiBQT1csIHBhY2tlZE9wU25pcHBldDogUE9XX1BBQ0tFRH0pO1xuXG5leHBvcnQgY29uc3QgcG93Q29uZmlnOiBLZXJuZWxDb25maWcgPSB7XG4gIGtlcm5lbE5hbWU6IFBvdyxcbiAgYmFja2VuZE5hbWU6ICd3ZWJnbCcsXG4gIGtlcm5lbEZ1bmM6IHBvdyBhcyB7fSBhcyBLZXJuZWxGdW5jXG59O1xuIl19","/**\n * @license\n * Copyright 2020 Google LLC. All Rights Reserved.\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n * =============================================================================\n */\nimport { backend_util, Prod, sumOutType, util } from '@tensorflow/tfjs-core';\nimport { reduce } from '../kernel_utils/reduce';\nimport { prodImplCPU } from '../kernel_utils/shared';\nimport { reshape } from './Reshape';\nimport { transpose } from './Transpose';\nexport function prod(args) {\n const { inputs, backend, attrs } = args;\n const { x } = inputs;\n const { axis, keepDims } = attrs;\n const xRank = x.shape.length;\n const toDispose = [];\n const origAxes = util.parseAxisParam(axis, x.shape);\n let axes = origAxes;\n const permutedAxes = backend_util.getAxesPermutation(axes, xRank);\n let permutedX = x;\n if (permutedAxes != null) {\n permutedX = transpose({ inputs: { x }, backend, attrs: { perm: permutedAxes } });\n axes = backend_util.getInnerMostAxes(axes.length, xRank);\n toDispose.push(permutedX);\n }\n backend_util.assertAxesAreInnerMostDims('prod', axes, xRank);\n let res;\n if (backend.shouldExecuteOnCPU([permutedX])) {\n const xVals = backend.texData.get(permutedX.dataId).values;\n const { outVals, outShape, outDtype } = prodImplCPU(permutedX.shape, permutedX.dtype, xVals, axes);\n res = backend.makeTensorInfo(outShape, outDtype, outVals);\n }\n else {\n const [outShape, reduceShape] = backend_util.computeOutAndReduceShapes(permutedX.shape, axes);\n const inSize = util.sizeFromShape(reduceShape);\n const a2D = reshape({ inputs: { x: permutedX }, backend, attrs: { shape: [-1, inSize] } });\n const outputDType = sumOutType(x.dtype);\n const reduced = reduce(a2D, outputDType, 'prod', backend);\n res = reshape({ inputs: { x: reduced }, backend, attrs: { shape: outShape } });\n toDispose.push(a2D);\n toDispose.push(reduced);\n }\n if (keepDims) {\n toDispose.push(res);\n const newShape = backend_util.expandShapeToKeepDim(res.shape, origAxes);\n res = reshape({ inputs: { x: res }, backend, attrs: { shape: newShape } });\n }\n toDispose.forEach(t => backend.disposeIntermediateTensorInfo(t));\n return res;\n}\nexport const prodConfig = {\n kernelName: Prod,\n backendName: 'webgl',\n kernelFunc: prod\n};\n//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiUHJvZC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uLy4uL3RmanMtYmFja2VuZC13ZWJnbC9zcmMva2VybmVscy9Qcm9kLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBOzs7Ozs7Ozs7Ozs7Ozs7R0FlRztBQUVILE9BQU8sRUFBQyxZQUFZLEVBQTRCLElBQUksRUFBeUIsVUFBVSxFQUEwQixJQUFJLEVBQUMsTUFBTSx1QkFBdUIsQ0FBQztBQUdwSixPQUFPLEVBQUMsTUFBTSxFQUFDLE1BQU0sd0JBQXdCLENBQUM7QUFDOUMsT0FBTyxFQUFDLFdBQVcsRUFBQyxNQUFNLHdCQUF3QixDQUFDO0FBRW5ELE9BQU8sRUFBQyxPQUFPLEVBQUMsTUFBTSxXQUFXLENBQUM7QUFDbEMsT0FBTyxFQUFDLFNBQVMsRUFBQyxNQUFNLGFBQWEsQ0FBQztBQUV0QyxNQUFNLFVBQVUsSUFBSSxDQUNoQixJQUF1RTtJQUV6RSxNQUFNLEVBQUMsTUFBTSxFQUFFLE9BQU8sRUFBRSxLQUFLLEVBQUMsR0FBRyxJQUFJLENBQUM7SUFDdEMsTUFBTSxFQUFDLENBQUMsRUFBQyxHQUFHLE1BQU0sQ0FBQztJQUNuQixNQUFNLEVBQUMsSUFBSSxFQUFFLFFBQVEsRUFBQyxHQUFHLEtBQUssQ0FBQztJQUUvQixNQUFNLEtBQUssR0FBRyxDQUFDLENBQUMsS0FBSyxDQUFDLE1BQU0sQ0FBQztJQUM3QixNQUFNLFNBQVMsR0FBRyxFQUFFLENBQUM7SUFFckIsTUFBTSxRQUFRLEdBQUcsSUFBSSxDQUFDLGNBQWMsQ0FBQyxJQUFJLEVBQUUsQ0FBQyxDQUFDLEtBQUssQ0FBQyxDQUFDO0lBQ3BELElBQUksSUFBSSxHQUFHLFFBQVEsQ0FBQztJQUNwQixNQUFNLFlBQVksR0FBRyxZQUFZLENBQUMsa0JBQWtCLENBQUMsSUFBSSxFQUFFLEtBQUssQ0FBQyxDQUFDO0lBQ2xFLElBQUksU0FBUyxHQUFHLENBQUMsQ0FBQztJQUNsQixJQUFJLFlBQVksSUFB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SUFDaEIsV0FBVyxFQUFFLE9BQU87SUFDcEIsVUFBVSxFQUFFLElBQXdCO0NBQ3JDLENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyIvKipcbiAqIEBsaWNlbnNlXG4gKiBDb3B5cmlnaHQgMjAyMCBHb29nbGUgTExDLiBBbGwgUmlnaHRzIFJlc2VydmVkLlxuICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlIFwiTGljZW5zZVwiKTtcbiAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS5cbiAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdFxuICpcbiAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMFxuICpcbiAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmVcbiAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuIFwiQVMgSVNcIiBCQVNJUyxcbiAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLlxuICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZFxuICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuXG4gKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuICovXG5cbmltcG9ydCB7YmFja2VuZF91dGlsLCBLZXJuZWxDb25maWcsIEtlcm5lbEZ1bmMsIFByb2QsIFByb2RBdHRycywgUHJvZElucHV0cywgc3VtT3V0VHlwZSwgVGVuc29ySW5mbywgVHlwZWRBcnJheSwgdXRpbH0gZnJvbSAnQHRlbnNvcmZsb3cvdGZqcy1jb3JlJztcblxuaW1wb3J0IHtNYXRoQmFja2VuZFdlYkdMfSBmcm9tICcuLi9iYWNrZW5kX3dlYmdsJztcbmltcG9ydCB7cmVkdWNlfSBmcm9tICcuLi9rZXJuZWxfdXRpbHMvcmVkdWNlJztcbmltcG9ydCB7cHJvZEltcGxDUFV9IGZyb20gJy4uL2tlcm5lbF91dGlscy9zaGFyZWQnO1xuXG5pbXBvcnQge3Jlc2hhcGV9IGZyb20gJy4vUmVzaGFwZSc7XG5pbXBvcnQge3RyYW5zcG9zZX0gZnJvbSAnLi9UcmFuc3Bvc2UnO1xuXG5leHBvcnQgZnVuY3Rpb24gcHJvZChcbiAgICBhcmdzOiB7aW5wdXRzOiBQcm9kSW5wdXRzLCBiYWNrZW5kOiBNYXRoQmFja2VuZFdlYkdMLCBhdHRyczogUHJvZEF0dHJzfSk6XG4gICAgVGVuc29ySW5mbyB7XG4gIGNvbnN0IHtpbnB1dHMsIGJhY2tlbmQsIGF0dHJzfSA9IGFyZ3M7XG4gIGNvbnN0IHt4fSA9IGlucHV0cztcbiAgY29uc3Qge2F4aXMsIGtlZXBEaW1zfSA9IGF0dHJzO1xuXG4gIGNvbnN0IHhSYW5rID0geC5zaGFwZS5sZW5ndGg7XG4gIGNvbnN0IHRvRGlzcG9zZSA9IFtdO1xuXG4gIGNvbnN0IG9yaWdBeGVzID0gdXRpbC5wYXJzZUF4aXNQYXJhbShheGlzLCB4LnNoYXBlKTtcbiAgbGV0IGF4ZXMgPSBvcmlnQXhlcztcbiAgY29uc3QgcGVybXV0ZWRBeGVzID0gYmFja2VuZF91dGlsLmdldEF4ZXNQZXJtdXRhdGlvbihheGVzLCB4UmFuayk7XG4gIGxldCBwZXJtdXRlZFggPSB4O1xuICBpZiAocGVybXV0ZWRBeGVzICE9IG51bGwpIHtcbiAgICBwZXJtdXRlZFggPSB0cmFuc3Bvc2Uoe2lucHV0czoge3h9LCBiYWNrZW5kLCBhdHRyczoge3Blcm06IHBlcm11dGVkQXhlc319KTtcbiAgICBheGVzID0gYmFja2VuZF91dGlsLmdldElubmVyTW9zdEF4ZXMoYXhlcy5sZW5ndGgsIHhSYW5rKTtcbiAgICB0b0Rpc3Bvc2UucHVzaChwZXJtdXRlZFgpO1xuICB9XG5cbiAgYmFja2VuZF91dGlsLmFzc2VydEF4ZXNBcmVJbm5lck1vc3REaW1zKCdwcm9kJywgYXhlcywgeFJhbmspO1xuXG4gIGxldCByZXM7XG4gIGlmIChiYWNrZW5kLnNob3VsZEV4ZWN1dGVPbkNQVShbcGVybXV0ZWRYXSkpIHtcbiAgICBjb25zdCB4VmFscyA9IGJhY2tlbmQudGV4RGF0YS5nZXQocGVybXV0ZWRYLmRhdGFJZCkudmFsdWVzIGFzIFR5cGVkQXJyYXk7XG4gICAgY29uc3Qge291dFZhbHMsIG91dFNoYXBlLCBvdXREdHlwZX0gPVxuICAgICAgICBwcm9kSW1wbENQVShwZXJtdXRlZFguc2hhcGUsIHBlcm11dGVkWC5kdHlwZSwgeFZhbHMsIGF4ZXMpO1xuICAgIHJlcyA9IGJhY2tlbmQubWFrZVRlbnNvckluZm8ob3V0U2hhcGUsIG91dER0eXBlLCBvdXRWYWxzKTtcbiAgfSBlbHNlIHtcbiAgICBjb25zdCBbb3V0U2hhcGUsIHJlZHVjZVNoYXBlXSA9XG4gICAgICAgIGJhY2tlbmRfdXRpbC5jb21wdXRlT3V0QW5kUmVkdWNlU2hhcGVzKHBlcm11dGVkWC5zaGFwZSwgYXhlcyk7XG4gICAgY29uc3QgaW5TaXplID0gdXRpbC5zaXplRnJvbVNoYXBlKHJlZHVjZVNoYXBlKTtcbiAgICBjb25zdCBhMkQgPSByZXNoYXBlKFxuICAgICAgICB7aW5wdXRzOiB7eDogcGVybXV0ZWRYfSwgYmFja2VuZCwgYXR0cnM6IHtzaGFwZTogWy0xLCBpblNpemVdfX0pO1xuICAgIGNvbnN0IG91dHB1dERUeXBlID0gc3VtT3V0VHlwZSh4LmR0eXBlKTtcbiAgICBjb25zdCByZWR1Y2VkID0gcmVkdWNlKGEyRCwgb3V0cHV0RFR5cGUsICdwcm9kJywgYmFja2VuZCk7XG4gICAgcmVzID0gcmVzaGFwZSh7aW5wdXRzOiB7eDogcmVkdWNlZH0sIGJhY2tlbmQsIGF0dHJzOiB7c2hhcGU6IG91dFNoYXBlfX0pO1xuXG4gICAgdG9EaXNwb3NlLnB1c2goYTJEKTtcbiAgICB0b0Rpc3Bvc2UucHVzaChyZWR1Y2VkKTtcbiAgfVxuXG4gIGlmIChrZWVwRGltcykge1xuICAgIHRvRGlzcG9zZS5wdXNoKHJlcyk7XG4gICAgY29uc3QgbmV3U2hhcGUgPSBiYWNrZW5kX3V0aWwuZXhwYW5kU2hhcGVUb0tlZXBEaW0ocmVzLnNoYXBlLCBvcmlnQXhlcyk7XG4gICAgcmVzID0gcmVzaGFwZSh7aW5wdXRzOiB7eDogcmVzfSwgYmFja2VuZCwgYXR0cnM6IHtzaGFwZTogbmV3U2hhcGV9fSk7XG4gIH1cblxuICB0b0Rpc3Bvc2UuZm9yRWFjaCh0ID0+IGJhY2tlbmQuZGlzcG9zZUludGVybWVkaWF0ZVRlbnNvckluZm8odCkpO1xuXG4gIHJldHVybiByZXM7XG59XG5cbmV4cG9ydCBjb25zdCBwcm9kQ29uZmlnOiBLZXJuZWxDb25maWcgPSB7XG4gIGtlcm5lbE5hbWU6IFByb2QsXG4gIGJhY2tlbmROYW1lOiAnd2ViZ2wnLFxuICBrZXJuZWxGdW5jOiBwcm9kIGFzIHt9IGFzIEtlcm5lbEZ1bmNcbn07XG4iXX0=","/**\n * @license\n * Copyright 2022 Google LLC. All Rights Reserved.\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n * =============================================================================\n */\nimport { RaggedGather } from '@tensorflow/tfjs-core';\nimport { raggedGatherImplCPU } from '../kernel_utils/shared';\nexport function raggedGather(args) {\n const { inputs, backend, attrs } = args;\n const { paramsNestedSplits, paramsDenseValues, indices } = inputs;\n const { outputRaggedRank } = attrs;\n const $paramsNestedSplits = paramsNestedSplits.map(t => backend.readSync(t.dataId));\n const $paramsNestedSplitsShapes = paramsNestedSplits.map(t => t.shape);\n const $paramsDenseValues = backend.readSync(paramsDenseValues.dataId);\n const $indices = backend.readSync(indices.dataId);\n const [outputNestedSplits, outputDenseValues, outputDenseValuesShape] = raggedGatherImplCPU($paramsNestedSplits, $paramsNestedSplitsShapes, $paramsDenseValues, paramsDenseValues.shape, paramsDenseValues.dtype, $indices, indices.shape, outputRaggedRank);\n const outputNestedSplitsTensors = outputNestedSplits.map((splits) => backend.makeTensorInfo([splits.length], 'int32', splits));\n const outputDenseValuesTensor = backend.makeTensorInfo(outputDenseValuesShape, paramsDenseValues.dtype, outputDenseValues);\n return outputNestedSplitsTensors.concat([outputDenseValuesTensor]);\n}\nexport const raggedGatherConfig = {\n kernelName: RaggedGather,\n backendName: 'webgl',\n kernelFunc: raggedGather,\n};\n//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiUmFnZ2VkR2F0aGVyLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vLi4vdGZqcy1iYWNrZW5kLXdlYmdsL3NyYy9rZXJuZWxzL1JhZ2dlZEdhdGhlci50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQTs7Ozs7Ozs7Ozs7Ozs7O0dBZUc7QUFFSCxPQUFPLEVBQTJCLFlBQVksRUFBZ0UsTUFBTSx1QkFBdUIsQ0FBQztBQUc1SSxPQUFPLEVBQUMsbUJBQW1CLEVBQUMsTUFBTSx3QkFBd0IsQ0FBQztBQUUzRCxNQUFNLFVBQVUsWUFBWSxDQUFDLElBSTVCO0lBQ0MsTUFBTSxFQUFDLE1BQU0sRUFBRSxPQUFPLEVBQUUsS0FBSyxFQUFDLEdBQUcsSUFBSSxDQUFDO0lBQ3RDLE1BQU0sRUFBQyxrQkFBa0IsRUFBRSxpQkFBaUIsRUFBRSxPQUFPLEVBQUMsR0FBRyxNQUFNLENBQUM7SUFDaEUsTUFBTSxFQUFDLGdCQUFnQixFQUFDLEdBQUcsS0FBSyxDQUFDO0lBRWpDLE1BQU0sbUJBQW1CLEdBQ3JCLGtCQUFrQixDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLE9BQU8sQ0FBQyxRQUFRLENBQUMsQ0FBQyxDQUFDLE1BQU0sQ0FBZSxDQUFDLENBQUM7SUFDMUUsTUFBTSx5QkFBeUIsR0FBRyxrQkFBa0IsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsS0FBSyxDQUFDLENBQUM7SUFDdkUsTUFBTSxrQkFBa0IsR0FDcEIsT0FBTyxDQUFDLFFBQVEsQ0FBQyxpQkFBaUIsQ0FBQyxNQUFNLENBQWUsQ0FBQztJQUM3RCxNQUFNLFFBQVEsR0FBRyxPQUFPLENBQUMsUUFBUSxDQUFDLE9BQU8sQ0FBQyxNQUFNLENBQWUsQ0FBQztJQUVoRSxNQUFNLENBQUMsa0JBQWtCLEVBQUUsaUJBQWlCLEVBQUUsc0JBQXNCLENBQUMsR0FDakUsbUJBQW1CLENBQ2YsbUJBQW1CLEVBQUUseUJBQXlCLEVBQUUsa0JBQWtCLEVBQ2xFLGlCQUFpQixDQUFDLEtBQUssRUFBRSxpQkFBaUIsQ0FBQyxLQUFLLEVBQUUsUUFBUSxFQUMxRCxPQUFPLENBQUMsS0FBSyxFQUFFLGdCQUFnQixDQUFDLENBQUM7SUFFekMsTUFBTSx5QkFBeUIsR0FBRyxrQkFBa0IsQ0FBQyxHQUFHLENBQ3BELENBQUMsTUFBTSxFQUFFLEVBQUUsQ0FBQyxPQUFPLENBQUMsY0FBYyxDQUFDLENBQUMsTUFBTSxDQUFDLE1BQU0sQ0FBQyxFQUFFLE9BQU8sRUFBRSxNQUFNLENBQUMsQ0FBQyxDQUFDO0lBRTFFLE1BQU0sdUJBQXVCLEdBQUcsT0FBTyxDQUFDLGNBQWMsQ0FDbEQsc0JBQXNCLEVBQUUsaUJBQWlCLENBQUMsS0FBSyxFQUFFLGlCQUFpQixDQUFDLENBQUM7SUFFeEUsT0FBTyx5QkFBeUIsQ0FBQyxNQUFNLENBQUMsQ0FBQyx1QkFBdUIsQ0FBQyxDQUFDLENBQUM7QUFDckUsQ0FBQztBQUVELE1BQU0sQ0FBQyxNQUFNLGtCQUFrQixHQUFpQjtJQUM5QyxVQUFVLEVBQUUsWUFBWTtJQUN4QixXQUFXLEVBQUUsT0FBTztJQUNwQixVQUFVLEVBQUUsWUFBZ0M7Q0FDN0MsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbIi8qKlxuICogQGxpY2Vuc2VcbiAqIENvcHlyaWdodCAyMDIyIEdvb2dsZSBMTEMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuXG4gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgXCJMaWNlbnNlXCIpO1xuICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLlxuICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0XG4gKlxuICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wXG4gKlxuICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZVxuICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gXCJBUyBJU1wiIEJBU0lTLFxuICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuXG4gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kXG4gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS5cbiAqID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4gKi9cblxuaW1wb3J0IHtLZXJuZWxDb25maWcsIEtlcm5lbEZ1bmMsIFJhZ2dlZEdhdGhlciwgUmFnZ2VkR2F0aGVyQXR0cnMsIFJhZ2dlZEdhdGhlcklucHV0cywgVGVuc29ySW5mbywgVHlwZWRBcnJheX0gZnJvbSAnQHRlbnNvcmZsb3cvdGZqcy1jb3JlJztcblxuaW1wb3J0IHtNYXRoQmFja2VuZFdlYkdMfSBmcm9tICcuLi9iYWNrZW5kX3dlYmdsJztcbmltcG9ydCB7cmFnZ2VkR2F0aGVySW1wbENQVX0gZnJvbSAnLi4va2VybmVsX3V0aWxzL3NoYXJlZCc7XG5cbmV4cG9ydCBmdW5jdGlvbiByYWdnZWRHYXRoZXIoYXJnczoge1xuICBpbnB1dHM6IFJhZ2dlZEdhdGhlcklucHV0cyxcbiAgYmFja2VuZDogTWF0aEJhY2tlbmRXZWJHTCxcbiAgYXR0cnM6IFJhZ2dlZEdhdGhlckF0dHJzXG59KTogVGVuc29ySW5mb1tdIHtcbiAgY29uc3Qge2lucHV0cywgYmFja2VuZCwgYXR0cnN9ID0gYXJncztcbiAgY29uc3Qge3BhcmFtc05lc3RlZFNwbGl0cywgcGFyYW1zRGVuc2VWYWx1ZXMsIGluZGljZXN9ID0gaW5wdXRzO1xuICBjb25zdCB7b3V0cHV0UmFnZ2VkUmFua30gPSBhdHRycztcblxuICBjb25zdCAkcGFyYW1zTmVzdGVkU3BsaXRzID1cbiAgICAgIHBhcmFtc05lc3RlZFNwbGl0cy5tYXAodCA9PiBiYWNrZW5kLnJlYWRTeW5jKHQuZGF0YUlkKSBhcyBUeXBlZEFycmF5KTtcbiAgY29uc3QgJHBhcmFtc05lc3RlZFNwbGl0c1NoYXBlcyA9IHBhcmFtc05lc3RlZFNwbGl0cy5tYXAodCA9PiB0LnNoYXBlKTtcbiAgY29uc3QgJHBhcmFtc0RlbnNlVmFsdWVzID1cbiAgICAgIGJhY2tlbmQucmVhZFN5bmMocGFyYW1zRGVuc2VWYWx1ZXMuZGF0YUlkKSBhcyBUeXBlZEFycmF5O1xuICBjb25zdCAkaW5kaWNlcyA9IGJhY2tlbmQucmVhZFN5bmMoaW5kaWNlcy5kYXRhSWQpIGFzIFR5cGVkQXJyYXk7XG5cbiAgY29uc3QgW291dHB1dE5lc3RlZFNwbGl0cywgb3V0cHV0RGVuc2VWYWx1ZXMsIG91dHB1dERlbnNlVmFsdWVzU2hhcGVdID1cbiAgICAgIHJhZ2dlZEdhdGhlckltcGxDUFUoXG4gICAgICAgICAgJHBhcmFtc05lc3RlZFNwbGl0cywgJHBhcmFtc05lc3RlZFNwbGl0c1NoYXBlcywgJHBhcmFtc0RlbnNlVmFsdWVzLFxuICAgICAgICAgIHBhcmFtc0RlbnNlVmFsdWVzLnNoYXBlLCBwYXJhbXNEZW5zZVZhbHVlcy5kdHlwZSwgJGluZGljZXMsXG4gICAgICAgICAgaW5kaWNlcy5zaGFwZSwgb3V0cHV0UmFnZ2VkUmFuayk7XG5cbiAgY29uc3Qgb3V0cHV0TmVzdGVkU3BsaXRzVGVuc29ycyA9IG91dHB1dE5lc3RlZFNwbGl0cy5tYXAoXG4gICAgICAoc3BsaXRzKSA9PiBiYWNrZW5kLm1ha2VUZW5zb3JJbmZvKFtzcGxpdHMubGVuZ3RoXSwgJ2ludDMyJywgc3BsaXRzKSk7XG5cbiAgY29uc3Qgb3V0cHV0RGVuc2VWYWx1ZXNUZW5zb3IgPSBiYWNrZW5kLm1ha2VUZW5zb3JJbmZvKFxuICAgICAgb3V0cHV0RGVuc2VWYWx1ZXNTaGFwZSwgcGFyYW1zRGVuc2VWYWx1ZXMuZHR5cGUsIG91dHB1dERlbnNlVmFsdWVzKTtcblxuICByZXR1cm4gb3V0cHV0TmVzdGVkU3BsaXRzVGVuc29ycy5jb25jYXQoW291dHB1dERlbnNlVmFsdWVzVGVuc29yXSk7XG59XG5cbmV4cG9ydCBjb25zdCByYWdnZWRHYXRoZXJDb25maWc6IEtlcm5lbENvbmZpZyA9IHtcbiAga2VybmVsTmFtZTogUmFnZ2VkR2F0aGVyLFxuICBiYWNrZW5kTmFtZTogJ3dlYmdsJyxcbiAga2VybmVsRnVuYzogcmFnZ2VkR2F0aGVyIGFzIHt9IGFzIEtlcm5lbEZ1bmMsXG59O1xuIl19","/**\n * @license\n * Copyright 2022 Google LLC. All Rights Reserved.\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n * =============================================================================\n */\nimport { RaggedTensorToTensor } from '@tensorflow/tfjs-core';\nimport { raggedTensorToTensorImplCPU } from '../kernel_utils/shared';\nexport function raggedTensorToTensor(args) {\n const { inputs, backend, attrs } = args;\n const { shape, values, defaultValue, rowPartitionTensors } = inputs;\n const { rowPartitionTypes } = attrs;\n const $shape = backend.readSync(shape.dataId);\n const $values = backend.readSync(values.dataId);\n const $defaultValue = backend.readSync(defaultValue.dataId);\n const $rowPartitionValues = rowPartitionTensors.map(t => backend.readSync(t.dataId));\n const rowPartitionValuesShapes = rowPartitionTensors.map(t => t.shape);\n const [outputShape, output] = raggedTensorToTensorImplCPU($shape, shape.shape, $values, values.shape, values.dtype, $defaultValue, defaultValue.shape, $rowPartitionValues, rowPartitionValuesShapes, rowPartitionTypes);\n return backend.makeTensorInfo(outputShape, values.dtype, output);\n}\nexport const raggedTensorToTensorConfig = {\n kernelName: RaggedTensorToTensor,\n backendName: 'webgl',\n kernelFunc: raggedTensorToTensor,\n};\n//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiUmFnZ2VkVGVuc29yVG9UZW5zb3IuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi8uLi90ZmpzLWJhY2tlbmQtd2ViZ2wvc3JjL2tlcm5lbHMvUmFnZ2VkVGVuc29yVG9UZW5zb3IudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUE7Ozs7Ozs7Ozs7Ozs7OztHQWVHO0FBRUgsT0FBTyxFQUEyQixvQkFBb0IsRUFBZ0YsTUFBTSx1QkFBdUIsQ0FBQztBQUdwSyxPQUFPLEVBQUMsMkJBQTJCLEVBQUMsTUFBTSx3QkFBd0IsQ0FBQztBQUVuRSxNQUFNLFVBQVUsb0JBQW9CLENBQUMsSUFJcEM7SUFDQyxNQUFNLEVBQUMsTUFBTSxFQUFFLE9BQU8sRUFBRSxLQUFLLEVBQUMsR0FBRyxJQUFJLENBQUM7SUFDdEMsTUFBTSxFQUFDLEtBQUssRUFBRSxNQUFNLEVBQUUsWUFBWSxFQUFFLG1CQUFtQixFQUFDLEdBQUcsTUFBTSxDQUFDO0lBQ2xFLE1BQU0sRUFBQyxpQkFBaUIsRUFBQyxHQUFHLEtBQUssQ0FBQztJQUVsQyxNQUFNLE1BQU0sR0FBRyxPQUFPLENBQUMsUUFBUSxDQUFDLEtBQUssQ0FBQyxNQUFNLENBQWUsQ0FBQztJQUM1RCxNQUFNLE9BQU8sR0FBRyxPQUFPLENBQUMsUUFBUSxDQUFDLE1BQU0sQ0FBQyxNQUFNLENBQWUsQ0FBQztJQUM5RCxNQUFNLGFBQWEsR0FBRyxPQUFPLENBQUMsUUFBUSxDQUFDLFlBQVksQ0FBQyxNQUFNLENBQWUsQ0FBQztJQUMxRSxNQUFNLG1CQUFtQixHQUNyQixtQkFBbUIsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxPQUFPLENBQUMsUUFBUSxDQUFDLENBQUMsQ0FBQyxNQUFNLENBQWUsQ0FBQyxDQUFDO0lBQzNFLE1BQU0sd0JBQXdCLEdBQUcsbUJBQW1CLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLEtBQUssQ0FBQyxDQUFDO0lBRXZFLE1BQU0sQ0FBQyxXQUFXLEVBQUUsTUFBTSxDQUFDLEdBQUcsMkJBQTJCLENBQ3JELE1BQU0sRUFBRSxLQUFLLENBQUMsS0FBSyxFQUFFLE9BQU8sRUFBRSxNQUFNLENBQUMsS0FBSyxFQUFFLE1BQU0sQ0FBQyxLQUFLLEVBQUUsYUFBYSxFQUN2RSxZQUFZLENBQUMsS0FBSyxFQUFFLG1CQUFtQixFQUFFLHdCQUF3QixFQUNqRSxpQkFBaUIsQ0FBQyxDQUFDO0lBQ3ZCLE9BQU8sT0FBTyxDQUFDLGNBQWMsQ0FBQyxXQUFXLEVBQUUsTUFBTSxDQUFDLEtBQUssRUFBRSxNQUFNLENBQUMsQ0FBQztBQUNuRSxDQUFDO0FBRUQsTUFBTSxDQUFDLE1BQU0sMEJBQTBCLEdBQWlCO0lBQ3RELFVBQVUsRUFBRSxvQkFBb0I7SUFDaEMsV0FBVyxFQUFFLE9BQU87SUFDcEIsVUFBVSxFQUFFLG9CQUF3QztDQUNyRCxDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiLyoqXG4gKiBAbGljZW5zZVxuICogQ29weXJpZ2h0IDIwMjIgR29vZ2xlIExMQy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC5cbiAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSBcIkxpY2Vuc2VcIik7XG4gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuXG4gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXRcbiAqXG4gKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjBcbiAqXG4gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlXG4gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiBcIkFTIElTXCIgQkFTSVMsXG4gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC5cbiAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmRcbiAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLlxuICogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbiAqL1xuXG5pbXBvcnQge0tlcm5lbENvbmZpZywgS2VybmVsRnVuYywgUmFnZ2VkVGVuc29yVG9UZW5zb3IsIFJhZ2dlZFRlbnNvclRvVGVuc29yQXR0cnMsIFJhZ2dlZFRlbnNvclRvVGVuc29ySW5wdXRzLCBUZW5zb3JJbmZvLCBUeXBlZEFycmF5fSBmcm9tICdAdGVuc29yZmxvdy90ZmpzLWNvcmUnO1xuXG5pbXBvcnQge01hdGhCYWNrZW5kV2ViR0x9IGZyb20gJy4uL2JhY2tlbmRfd2ViZ2wnO1xuaW1wb3J0IHtyYWdnZWRUZW5zb3JUb1RlbnNvckltcGxDUFV9IGZyb20gJy4uL2tlcm5lbF91dGlscy9zaGFyZWQnO1xuXG5leHBvcnQgZnVuY3Rpb24gcmFnZ2VkVGVuc29yVG9UZW5zb3IoYXJnczoge1xuICBpbnB1dHM6IFJhZ2dlZFRlbnNvclRvVGVuc29ySW5wdXRzLFxuICBiYWNrZW5kOiBNYXRoQmFja2VuZFdlYkdMLFxuICBhdHRyczogUmFnZ2VkVGVuc29yVG9UZW5zb3JBdHRyc1xufSk6IFRlbnNvckluZm8ge1xuICBjb25zdCB7aW5wdXRzLCBiYWNrZW5kLCBhdHRyc30gPSBhcmdzO1xuICBjb25zdCB7c2hhcGUsIHZhbHVlcywgZGVmYXVsdFZhbHVlLCByb3dQYXJ0aXRpb25UZW5zb3JzfSA9IGlucHV0cztcbiAgY29uc3Qge3Jvd1BhcnRpdGlvblR5cGVzfSA9IGF0dHJzO1xuXG4gIGNvbnN0ICRzaGFwZSA9IGJhY2tlbmQucmVhZFN5bmMoc2hhcGUuZGF0YUlkKSBhcyBUeXBlZEFycmF5O1xuICBjb25zdCAkdmFsdWVzID0gYmFja2VuZC5yZWFkU3luYyh2YWx1ZXMuZGF0YUlkKSBhcyBUeXBlZEFycmF5O1xuICBjb25zdCAkZGVmYXVsdFZhbHVlID0gYmFja2VuZC5yZWFkU3luYyhkZWZhdWx0VmFsdWUuZGF0YUlkKSBhcyBUeXBlZEFycmF5O1xuICBjb25zdCAkcm93UGFydGl0aW9uVmFsdWVzID1cbiAgICAgIHJvd1BhcnRpdGlvblRlbnNvcnMubWFwKHQgPT4gYmFja2VuZC5yZWFkU3luYyh0LmRhdGFJZCkgYXMgVHlwZWRBcnJheSk7XG4gIGNvbnN0IHJvd1BhcnRpdGlvblZhbHVlc1NoYXBlcyA9IHJvd1BhcnRpdGlvblRlbnNvcnMubWFwKHQgPT4gdC5zaGFwZSk7XG5cbiAgY29uc3QgW291dHB1dFNoYXBlLCBvdXRwdXRdID0gcmFnZ2VkVGVuc29yVG9UZW5zb3JJbXBsQ1BVKFxuICAgICAgJHNoYXBlLCBzaGFwZS5zaGFwZSwgJHZhbHVlcywgdmFsdWVzLnNoYXBlLCB2YWx1ZXMuZHR5cGUsICRkZWZhdWx0VmFsdWUsXG4gICAgICBkZWZhdWx0VmFsdWUuc2hhcGUsICRyb3dQYXJ0aXRpb25WYWx1ZXMsIHJvd1BhcnRpdGlvblZhbHVlc1NoYXBlcyxcbiAgICAgIHJvd1BhcnRpdGlvblR5cGVzKTtcbiAgcmV0dXJuIGJhY2tlbmQubWFrZVRlbnNvckluZm8ob3V0cHV0U2hhcGUsIHZhbHVlcy5kdHlwZSwgb3V0cHV0KTtcbn1cblxuZXhwb3J0IGNvbnN0IHJhZ2dlZFRlbnNvclRvVGVuc29yQ29uZmlnOiBLZXJuZWxDb25maWcgPSB7XG4gIGtlcm5lbE5hbWU6IFJhZ2dlZFRlbnNvclRvVGVuc29yLFxuICBiYWNrZW5kTmFtZTogJ3dlYmdsJyxcbiAga2VybmVsRnVuYzogcmFnZ2VkVGVuc29yVG9UZW5zb3IgYXMge30gYXMgS2VybmVsRnVuYyxcbn07XG4iXX0=","/**\n * @license\n * Copyright 2020 Google LLC. All Rights Reserved.\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n * =============================================================================\n */\nimport { Range } from '@tensorflow/tfjs-core';\nimport { rangeImplCPU } from '../kernel_utils/shared';\nexport const range = (args) => {\n const { backend, attrs } = args;\n const { start, stop, step, dtype } = attrs;\n const values = rangeImplCPU(start, stop, step, dtype);\n return backend.makeTensorInfo([values.length], dtype, values);\n};\nexport const rangeConfig = {\n kernelName: Range,\n backendName: 'webgl',\n kernelFunc: range\n};\n//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiUmFuZ2UuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi8uLi90ZmpzLWJhY2tlbmQtd2ViZ2wvc3JjL2tlcm5lbHMvUmFuZ2UudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUE7Ozs7Ozs7Ozs7Ozs7OztHQWVHO0FBRUgsT0FBTyxFQUEyQixLQUFLLEVBQXlCLE1BQU0sdUJBQXVCLENBQUM7QUFHOUYsT0FBTyxFQUFDLFlBQVksRUFBQyxNQUFNLHdCQUF3QixDQUFDO0FBRXBELE1BQU0sQ0FBQyxNQUFNLEtBQUssR0FDZCxDQUFDLElBQW9ELEVBQWMsRUFBRTtJQUNuRSxNQUFNLEVBQUMsT0FBTyxFQUFFLEtBQUssRUFBQyxHQUFHLElBQUksQ0FBQztJQUM5QixNQUFNLEVBQUMsS0FBSyxFQUFFLElBQUksRUFBRSxJQUFJLEVBQUUsS0FBSyxFQUFDLEdBQUcsS0FBSyxDQUFDO0lBQ3pDLE1BQU0sTUFBTSxHQUFHLFlBQVksQ0FBQyxLQUFLLEVBQUUsSUFBSSxFQUFFLElBQUksRUFBRSxLQUFLLENBQUMsQ0FBQztJQUN0RCxPQUFPLE9BQU8sQ0FBQyxjQUFjLENBQUMsQ0FBQyxNQUFNLENBQUMsTUFBTSxDQUFDLEVBQUUsS0FBSyxFQUFFLE1BQU0sQ0FBQyxDQUFDO0FBQ2hFLENBQUMsQ0FBQztBQUVOLE1BQU0sQ0FBQyxNQUFNLFdBQVcsR0FBaUI7SUFDdkMsVUFBVSxFQUFFLEtBQUs7SUFDakIsV0FBVyxFQUFFLE9BQU87SUFDcEIsVUFBVSxFQUFFLEtBQXlCO0NBQ3RDLENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyIvKipcbiAqIEBsaWNlbnNlXG4gKiBDb3B5cmlnaHQgMjAyMCBHb29nbGUgTExDLiBBbGwgUmlnaHRzIFJlc2VydmVkLlxuICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlIFwiTGljZW5zZVwiKTtcbiAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS5cbiAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdFxuICpcbiAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMFxuICpcbiAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmVcbiAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuIFwiQVMgSVNcIiBCQVNJUyxcbiAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLlxuICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZFxuICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuXG4gKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuICovXG5cbmltcG9ydCB7S2VybmVsQ29uZmlnLCBLZXJuZWxGdW5jLCBSYW5nZSwgUmFuZ2VBdHRycywgVGVuc29ySW5mb30gZnJvbSAnQHRlbnNvcmZsb3cvdGZqcy1jb3JlJztcblxuaW1wb3J0IHtNYXRoQmFja2VuZFdlYkdMfSBmcm9tICcuLi9iYWNrZW5kX3dlYmdsJztcbmltcG9ydCB7cmFuZ2VJbXBsQ1BVfSBmcm9tICcuLi9rZXJuZWxfdXRpbHMvc2hhcmVkJztcblxuZXhwb3J0IGNvbnN0IHJhbmdlID1cbiAgICAoYXJnczoge2JhY2tlbmQ6IE1hdGhCYWNrZW5kV2ViR0wsIGF0dHJzOiBSYW5nZUF0dHJzfSk6IFRlbnNvckluZm8gPT4ge1xuICAgICAgY29uc3Qge2JhY2tlbmQsIGF0dHJzfSA9IGFyZ3M7XG4gICAgICBjb25zdCB7c3RhcnQsIHN0b3AsIHN0ZXAsIGR0eXBlfSA9IGF0dHJzO1xuICAgICAgY29uc3QgdmFsdWVzID0gcmFuZ2VJbXBsQ1BVKHN0YXJ0LCBzdG9wLCBzdGVwLCBkdHlwZSk7XG4gICAgICByZXR1cm4gYmFja2VuZC5tYWtlVGVuc29ySW5mbyhbdmFsdWVzLmxlbmd0aF0sIGR0eXBlLCB2YWx1ZXMpO1xuICAgIH07XG5cbmV4cG9ydCBjb25zdCByYW5nZUNvbmZpZzogS2VybmVsQ29uZmlnID0ge1xuICBrZXJuZWxOYW1lOiBSYW5nZSxcbiAgYmFja2VuZE5hbWU6ICd3ZWJnbCcsXG4gIGtlcm5lbEZ1bmM6IHJhbmdlIGFzIHt9IGFzIEtlcm5lbEZ1bmNcbn07XG4iXX0=","/**\n * @license\n * Copyright 2020 Google LLC. All Rights Reserved.\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n * =============================================================================\n */\nimport { Reciprocal } from '@tensorflow/tfjs-core';\nimport { unaryKernelFunc } from '../kernel_utils/kernel_funcs_utils';\nconst RECIPROCAL = `return 1.0 / x;`;\nexport const reciprocal = unaryKernelFunc({ opSnippet: RECIPROCAL });\nexport const reciprocalConfig = {\n kernelName: Reciprocal,\n backendName: 'webgl',\n kernelFunc: reciprocal,\n};\n//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiUmVjaXByb2NhbC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uLy4uL3RmanMtYmFja2VuZC13ZWJnbC9zcmMva2VybmVscy9SZWNpcHJvY2FsLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBOzs7Ozs7Ozs7Ozs7Ozs7R0FlRztBQUVILE9BQU8sRUFBZSxVQUFVLEVBQUMsTUFBTSx1QkFBdUIsQ0FBQztBQUMvRCxPQUFPLEVBQUMsZUFBZSxFQUFDLE1BQU0sb0NBQW9DLENBQUM7QUFFbkUsTUFBTSxVQUFVLEdBQUcsaUJBQWlCLENBQUM7QUFFckMsTUFBTSxDQUFDLE1BQU0sVUFBVSxHQUFHLGVBQWUsQ0FBQyxFQUFDLFNBQVMsRUFBRSxVQUFVLEVBQUMsQ0FBQyxDQUFDO0FBRW5FLE1BQU0sQ0FBQyxNQUFNLGdCQUFnQixHQUFpQjtJQUM1QyxVQUFVLEVBQUUsVUFBVTtJQUN0QixXQUFXLEVBQUUsT0FBTztJQUNwQixVQUFVLEVBQUUsVUFBVTtDQUN2QixDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiLyoqXG4gKiBAbGljZW5zZVxuICogQ29weXJpZ2h0IDIwMjAgR29vZ2xlIExMQy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC5cbiAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSBcIkxpY2Vuc2VcIik7XG4gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuXG4gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXRcbiAqXG4gKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjBcbiAqXG4gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlXG4gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiBcIkFTIElTXCIgQkFTSVMsXG4gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC5cbiAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmRcbiAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLlxuICogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbiAqL1xuXG5pbXBvcnQge0tlcm5lbENvbmZpZywgUmVjaXByb2NhbH0gZnJvbSAnQHRlbnNvcmZsb3cvdGZqcy1jb3JlJztcbmltcG9ydCB7dW5hcnlLZXJuZWxGdW5jfSBmcm9tICcuLi9rZXJuZWxfdXRpbHMva2VybmVsX2Z1bmNzX3V0aWxzJztcblxuY29uc3QgUkVDSVBST0NBTCA9IGByZXR1cm4gMS4wIC8geDtgO1xuXG5leHBvcnQgY29uc3QgcmVjaXByb2NhbCA9IHVuYXJ5S2VybmVsRnVuYyh7b3BTbmlwcGV0OiBSRUNJUFJPQ0FMfSk7XG5cbmV4cG9ydCBjb25zdCByZWNpcHJvY2FsQ29uZmlnOiBLZXJuZWxDb25maWcgPSB7XG4gIGtlcm5lbE5hbWU6IFJlY2lwcm9jYWwsXG4gIGJhY2tlbmROYW1lOiAnd2ViZ2wnLFxuICBrZXJuZWxGdW5jOiByZWNpcHJvY2FsLFxufTtcbiJdfQ==","/**\n * @license\n * Copyright 2020 Google LLC. All Rights Reserved.\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n * =============================================================================\n */\nimport { Relu } from '@tensorflow/tfjs-core';\nimport { unaryKernelFunc } from '../kernel_utils/kernel_funcs_utils';\nimport { CHECK_NAN_SNIPPET } from '../unaryop_gpu';\nconst RELU = CHECK_NAN_SNIPPET + `\n return (x < 0.0) ? 0.0 : x;\n`;\nconst RELU_PACKED = `\n vec4 result = x * vec4(greaterThanEqual(x, vec4(0.0)));\n bvec4 isNaN = isnan(x);\n\n result.r = isNaN.r ? x.r : result.r;\n result.g = isNaN.g ? x.g : result.g;\n result.b = isNaN.b ? x.b : result.b;\n result.a = isNaN.a ? x.a : result.a;\n\n return result;\n`;\nexport const relu = unaryKernelFunc({ opSnippet: RELU, packedOpSnippet: RELU_PACKED });\nexport const reluConfig = {\n kernelName: Relu,\n backendName: 'webgl',\n kernelFunc: relu\n};\n//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiUmVsdS5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uLy4uL3RmanMtYmFja2VuZC13ZWJnbC9zcmMva2VybmVscy9SZWx1LnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBOzs7Ozs7Ozs7Ozs7Ozs7R0FlRztBQUVILE9BQU8sRUFBMkIsSUFBSSxFQUFDLE1BQU0sdUJBQXVCLENBQUM7QUFDckUsT0FBTyxFQUFDLGVBQWUsRUFBQyxNQUFNLG9DQUFvQyxDQUFDO0FBQ25FLE9BQU8sRUFBQyxpQkFBaUIsRUFBQyxNQUFNLGdCQUFnQixDQUFDO0FBRWpELE1BQU0sSUFBSSxHQUFHLGlCQUFpQixHQUFHOztDQUVoQyxDQUFDO0FBRUYsTUFBTSxXQUFXLEdBQUc7Ozs7Ozs7Ozs7Q0FVbkIsQ0FBQztBQUVGLE1BQU0sQ0FBQyxNQUFNLElBQUksR0FDYixlQUFlLENBQUMsRUFBQyxTQUFTLEVBQUUsSUFBSSxFQUFFLGVBQWUsRUFBRSxXQUFXLEVBQUMsQ0FBQyxDQUFDO0FBRXJFLE1BQU0sQ0FBQyxNQUFNLFVBQVUsR0FBaUI7SUFDdEMsVUFBVSxFQUFFLElBQUk7SUFDaEIsV0FBVyxFQUFFLE9BQU87SUFDcEIsVUFBVSxFQUFFLElBQXdCO0NBQ3JDLENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyIvKipcbiAqIEBsaWNlbnNlXG4gKiBDb3B5cmlnaHQgMjAyMCBHb29nbGUgTExDLiBBbGwgUmlnaHRzIFJlc2VydmVkLlxuICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlIFwiTGljZW5zZVwiKTtcbiAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS5cbiAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdFxuICpcbiAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMFxuICpcbiAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmVcbiAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuIFwiQVMgSVNcIiBCQVNJUyxcbiAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLlxuICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZFxuICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuXG4gKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuICovXG5cbmltcG9ydCB7S2VybmVsQ29uZmlnLCBLZXJuZWxGdW5jLCBSZWx1fSBmcm9tICdAdGVuc29yZmxvdy90ZmpzLWNvcmUnO1xuaW1wb3J0IHt1bmFyeUtlcm5lbEZ1bmN9IGZyb20gJy4uL2tlcm5lbF91dGlscy9rZXJuZWxfZnVuY3NfdXRpbHMnO1xuaW1wb3J0IHtDSEVDS19OQU5fU05JUFBFVH0gZnJvbSAnLi4vdW5hcnlvcF9ncHUnO1xuXG5jb25zdCBSRUxVID0gQ0hFQ0tfTkFOX1NOSVBQRVQgKyBgXG4gIHJldHVybiAoeCA8IDAuMCkgPyAwLjAgOiB4O1xuYDtcblxuY29uc3QgUkVMVV9QQUNLRUQgPSBgXG4gIHZlYzQgcmVzdWx0ID0geCAqIHZlYzQoZ3JlYXRlclRoYW5FcXVhbCh4LCB2ZWM0KDAuMCkpKTtcbiAgYnZlYzQgaXNOYU4gPSBpc25hbih4KTtcblxuICByZXN1bHQuciA9IGlzTmFOLnIgPyB4LnIgOiByZXN1bHQucjtcbiAgcmVzdWx0LmcgPSBpc05hTi5nID8geC5nIDogcmVzdWx0Lmc7XG4gIHJlc3VsdC5iID0gaXNOYU4uYiA/IHguYiA6IHJlc3VsdC5iO1xuICByZXN1bHQuYSA9IGlzTmFOLmEgPyB4LmEgOiByZXN1bHQuYTtcblxuICByZXR1cm4gcmVzdWx0O1xuYDtcblxuZXhwb3J0IGNvbnN0IHJlbHUgPVxuICAgIHVuYXJ5S2VybmVsRnVuYyh7b3BTbmlwcGV0OiBSRUxVLCBwYWNrZWRPcFNuaXBwZXQ6IFJFTFVfUEFDS0VEfSk7XG5cbmV4cG9ydCBjb25zdCByZWx1Q29uZmlnOiBLZXJuZWxDb25maWcgPSB7XG4gIGtlcm5lbE5hbWU6IFJlbHUsXG4gIGJhY2tlbmROYW1lOiAnd2ViZ2wnLFxuICBrZXJuZWxGdW5jOiByZWx1IGFzIHt9IGFzIEtlcm5lbEZ1bmNcbn07XG4iXX0=","/**\n * @license\n * Copyright 2020 Google LLC. All Rights Reserved.\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n * =============================================================================\n */\nimport { Relu6 } from '@tensorflow/tfjs-core';\nimport { unaryKernelFunc } from '../kernel_utils/kernel_funcs_utils';\nimport { CHECK_NAN_SNIPPET } from '../unaryop_gpu';\nconst RELU6 = CHECK_NAN_SNIPPET + `\n return (x < 0.0) ? 0.0 : min(6.0, x);\n`;\nconst RELU6_PACKED = `\n vec4 result = min(x, vec4(6.)) * vec4(greaterThanEqual(x, vec4(0.0)));\n bvec4 isNaN = isnan(x);\n\n result.r = isNaN.r ? x.r : result.r;\n result.g = isNaN.g ? x.g : result.g;\n result.b = isNaN.b ? x.b : result.b;\n result.a = isNaN.a ? x.a : result.a;\n\n return result;\n`;\nexport const relu6 = unaryKernelFunc({ opSnippet: RELU6, packedOpSnippet: RELU6_PACKED });\nexport const relu6Config = {\n kernelName: Relu6,\n backendName: 'webgl',\n kernelFunc: relu6\n};\n//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiUmVsdTYuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi8uLi90ZmpzLWJhY2tlbmQtd2ViZ2wvc3JjL2tlcm5lbHMvUmVsdTYudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUE7Ozs7Ozs7Ozs7Ozs7OztHQWVHO0FBRUgsT0FBTyxFQUEyQixLQUFLLEVBQUMsTUFBTSx1QkFBdUIsQ0FBQztBQUN0RSxPQUFPLEVBQUMsZUFBZSxFQUFDLE1BQU0sb0NBQW9DLENBQUM7QUFDbkUsT0FBTyxFQUFDLGlCQUFpQixFQUFDLE1BQU0sZ0JBQWdCLENBQUM7QUFFakQsTUFBTSxLQUFLLEdBQUcsaUJBQWlCLEdBQUc7O0NBRWpDLENBQUM7QUFFRixNQUFNLFlBQVksR0FBRzs7Ozs7Ozs7OztDQVVwQixDQUFDO0FBRUYsTUFBTSxDQUFDLE1BQU0sS0FBSyxHQUNkLGVBQWUsQ0FBQyxFQUFDLFNBQVMsRUFBRSxLQUFLLEVBQUUsZUFBZSxFQUFFLFlBQVksRUFBQyxDQUFDLENBQUM7QUFFdkUsTUFBTSxDQUFDLE1BQU0sV0FBVyxHQUFpQjtJQUN2QyxVQUFVLEVBQUUsS0FBSztJQUNqQixXQUFXLEVBQUUsT0FBTztJQUNwQixVQUFVLEVBQUUsS0FBeUI7Q0FDdEMsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbIi8qKlxuICogQGxpY2Vuc2VcbiAqIENvcHlyaWdodCAyMDIwIEdvb2dsZSBMTEMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuXG4gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgXCJMaWNlbnNlXCIpO1xuICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLlxuICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0XG4gKlxuICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wXG4gKlxuICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZVxuICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gXCJBUyBJU1wiIEJBU0lTLFxuICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuXG4gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kXG4gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS5cbiAqID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4gKi9cblxuaW1wb3J0IHtLZXJuZWxDb25maWcsIEtlcm5lbEZ1bmMsIFJlbHU2fSBmcm9tICdAdGVuc29yZmxvdy90ZmpzLWNvcmUnO1xuaW1wb3J0IHt1bmFyeUtlcm5lbEZ1bmN9IGZyb20gJy4uL2tlcm5lbF91dGlscy9rZXJuZWxfZnVuY3NfdXRpbHMnO1xuaW1wb3J0IHtDSEVDS19OQU5fU05JUFBFVH0gZnJvbSAnLi4vdW5hcnlvcF9ncHUnO1xuXG5jb25zdCBSRUxVNiA9IENIRUNLX05BTl9TTklQUEVUICsgYFxuICByZXR1cm4gKHggPCAwLjApID8gMC4wIDogbWluKDYuMCwgeCk7XG5gO1xuXG5jb25zdCBSRUxVNl9QQUNLRUQgPSBgXG4gIHZlYzQgcmVzdWx0ID0gbWluKHgsIHZlYzQoNi4pKSAqIHZlYzQoZ3JlYXRlclRoYW5FcXVhbCh4LCB2ZWM0KDAuMCkpKTtcbiAgYnZlYzQgaXNOYU4gPSBpc25hbih4KTtcblxuICByZXN1bHQuciA9IGlzTmFOLnIgPyB4LnIgOiByZXN1bHQucjtcbiAgcmVzdWx0LmcgPSBpc05hTi5nID8geC5nIDogcmVzdWx0Lmc7XG4gIHJlc3VsdC5iID0gaXNOYU4uYiA/IHguYiA6IHJlc3VsdC5iO1xuICByZXN1bHQuYSA9IGlzTmFOLmEgPyB4LmEgOiByZXN1bHQuYTtcblxuICByZXR1cm4gcmVzdWx0O1xuYDtcblxuZXhwb3J0IGNvbnN0IHJlbHU2ID1cbiAgICB1bmFyeUtlcm5lbEZ1bmMoe29wU25pcHBldDogUkVMVTYsIHBhY2tlZE9wU25pcHBldDogUkVMVTZfUEFDS0VEfSk7XG5cbmV4cG9ydCBjb25zdCByZWx1NkNvbmZpZzogS2VybmVsQ29uZmlnID0ge1xuICBrZXJuZWxOYW1lOiBSZWx1NixcbiAgYmFja2VuZE5hbWU6ICd3ZWJnbCcsXG4gIGtlcm5lbEZ1bmM6IHJlbHU2IGFzIHt9IGFzIEtlcm5lbEZ1bmNcbn07XG4iXX0=","/**\n * @license\n * Copyright 2017 Google LLC. All Rights Reserved.\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n * =============================================================================\n */\nexport class ResizeBilinearProgram {\n constructor(inputShape, newHeight, newWidth, alignCorners, halfPixelCenters) {\n this.variableNames = ['A'];\n this.outputShape = [];\n const [batch, oldHeight, oldWidth, depth] = inputShape;\n this.outputShape = [batch, newHeight, newWidth, depth];\n const effectiveInSize = [\n (alignCorners && newHeight > 1) ? oldHeight - 1 : oldHeight,\n (alignCorners && newWidth > 1) ? oldWidth - 1 : oldWidth\n ];\n const effectiveOutSize = [\n (alignCorners && newHeight > 1) ? newHeight - 1 : newHeight,\n (alignCorners && newWidth > 1) ? newWidth - 1 : newWidth\n ];\n let sourceFracIndexRC;\n if (halfPixelCenters) {\n sourceFracIndexRC =\n `(vec2(yRC) + vec2(0.5)) * effectiveInputOverOutputRatioRC` +\n ` - vec2(0.5)`;\n }\n else {\n sourceFracIndexRC = `vec2(yRC) * effectiveInputOverOutputRatioRC`;\n }\n this.userCode = `\n const vec2 effectiveInputOverOutputRatioRC = vec2(\n ${effectiveInSize[0] / effectiveOutSize[0]},\n ${effectiveInSize[1] / effectiveOutSize[1]});\n const vec2 inputShapeRC = vec2(${oldHeight}.0, ${oldWidth}.0);\n\n void main() {\n ivec4 coords = getOutputCoords();\n int b = coords[0];\n int d = coords[3];\n ivec2 yRC = coords.yz;\n\n // Fractional source index.\n vec2 sourceFracIndexRC = ${sourceFracIndexRC};\n\n // Compute the four integer indices.\n ivec2 sourceFloorRC = ivec2(max(sourceFracIndexRC, vec2(0.0)));\n ivec2 sourceCeilRC = ivec2(\n min(inputShapeRC - 1.0, ceil(sourceFracIndexRC)));\n\n float topLeft = getA(b, sourceFloorRC.x, sourceFloorRC.y, d);\n float bottomLeft = getA(b, sourceCeilRC.x, sourceFloorRC.y, d);\n float topRight = getA(b, sourceFloorRC.x, sourceCeilRC.y, d);\n float bottomRight = getA(b, sourceCeilRC.x, sourceCeilRC.y, d);\n\n vec2 fracRC = sourceFracIndexRC - vec2(sourceFloorRC);\n\n float top = topLeft + (topRight - topLeft) * fracRC.y;\n float bottom = bottomLeft + (bottomRight - bottomLeft) * fracRC.y;\n float newValue = top + (bottom - top) * fracRC.x;\n\n setOutput(newValue);\n }\n `;\n }\n}\n//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicmVzaXplX2JpbGluZWFyX2dwdS5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uL3RmanMtYmFja2VuZC13ZWJnbC9zcmMvcmVzaXplX2JpbGluZWFyX2dwdS50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQTs7Ozs7Ozs7Ozs7Ozs7O0dBZUc7QUFJSCxNQUFNLE9BQU8scUJBQXFCO0lBS2hDLFlBQ0ksVUFBNEMsRUFBRSxTQUFpQixFQUMvRCxRQUFnQixFQUFFLFlBQXFCLEVBQUUsZ0JBQXlCO1FBTnRFLGtCQUFhLEdBQUcsQ0FBQyxHQUFHLENBQUMsQ0FBQztRQUN0QixnQkFBVyxHQUFhLEVBQUUsQ0FBQztRQU16QixNQUFNLENBQUMsS0FBSyxFQUFFLFNBQVMsRUFBRSxRQUFRLEVBQUUsS0FBSyxDQUFDLEdBQUcsVUFBVSxDQUFDO1FBQ3ZELElBQUksQ0FBQyxXQUFXLEdBQUcsQ0FBQyxLQUFLLEVBQUUsU0FBUyxFQUFFLFFBQVEsRUFBRSxLQUFLLENBQUMsQ0FBQztRQUV2RCxNQUFNLGVBQWUsR0FBcUI7WUFDeEMsQ0FBQyxZQUFZLElBQUksU0FBUyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxTQUFTLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxTQUFTO1lBQzNELENBQUMsWUFBWSxJQUFJLFFBQVEsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsUUFBUSxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsUUFBUTtTQUN6RCxDQUFDO1FBRUYsTUFBTSxnQkFBZ0IsR0FBcUI7WUFDekMsQ0FBQyxZQUFZLElBQUksU0FBUyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxTQUFTLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxTQUFTO1lBQzNELENBQUMsWUFBWSxJQUFJLFFBQVEsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsUUFBUSxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsUUFBUTtTQUN6RCxDQUFDO1FBRUYsSUFBSSxpQkFBeUIsQ0FBQztRQUM5QixJQUFJLGdCQUFnQixFQUFFO1lBQ3BCLGlCQUFpQjtnQkFDYiwyREFBMkQ7b0JBQzNELGNBQWMsQ0FBQztTQUNwQjthQUFNO1lBQ0wsaUJBQWlCLEdBQUcsNkNBQTZDLENBQUM7U0FDbkU7UUFFRCxJQUFJLENBQUMsUUFBUSxHQUFHOztZQUVSLGVBQWUsQ0FBQyxDQUFDLENBQUMsR0FBRyxnQkFBZ0IsQ0FBQyxDQUFDLENBQUM7WUFDeEMsZUFBZSxDQUFDLENBQUMsQ0FBQyxHQUFHLGdCQUFnQixDQUFDLENBQUMsQ0FBQzt1Q0FDYixTQUFTLE9BQU8sUUFBUTs7Ozs7Ozs7O21DQVM1QixpQkFBaUI7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7O0tBb0IvQyxDQUFDO0lBQ0osQ0FBQztDQUNGIiwic291cmNlc0NvbnRlbnQiOlsiLyoqXG4gKiBAbGljZW5zZVxuICogQ29weXJpZ2h0IDIwMTcgR29vZ2xlIExMQy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC5cbiAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSBcIkxpY2Vuc2VcIik7XG4gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuXG4gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXRcbiAqXG4gKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjBcbiAqXG4gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlXG4gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiBcIkFTIElTXCIgQkFTSVMsXG4gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC5cbiAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmRcbiAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLlxuICogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbiAqL1xuXG5pbXBvcnQge0dQR1BVUHJvZ3JhbX0gZnJvbSAnLi9ncGdwdV9tYXRoJztcblxuZXhwb3J0IGNsYXNzIFJlc2l6ZUJpbGluZWFyUHJvZ3JhbSBpbXBsZW1lbnRzIEdQR1BVUHJvZ3JhbSB7XG4gIHZhcmlhYmxlTmFtZXMgPSBbJ0EnXTtcbiAgb3V0cHV0U2hhcGU6IG51bWJlcltdID0gW107XG4gIHVzZXJDb2RlOiBzdHJpbmc7XG5cbiAgY29uc3RydWN0b3IoXG4gICAgICBpbnB1dFNoYXBlOiBbbnVtYmVyLCBudW1iZXIsIG51bWJlciwgbnVtYmVyXSwgbmV3SGVpZ2h0OiBudW1iZXIsXG4gICAgICBuZXdXaWR0aDogbnVtYmVyLCBhbGlnbkNvcm5lcnM6IGJvb2xlYW4sIGhhbGZQaXhlbENlbnRlcnM6IGJvb2xlYW4pIHtcbiAgICBjb25zdCBbYmF0Y2gsIG9sZEhlaWdodCwgb2xkV2lkdGgsIGRlcHRoXSA9IGlucHV0U2hhcGU7XG4gICAgdGhpcy5vdXRwdXRTaGFwZSA9IFtiYXRjaCwgbmV3SGVpZ2h0LCBuZXdXaWR0aCwgZGVwdGhdO1xuXG4gICAgY29uc3QgZWZmZWN0aXZlSW5TaXplOiBbbnVtYmVyLCBudW1iZXJdID0gW1xuICAgICAgKGFsaWduQ29ybmVycyAmJiBuZXdIZWlnaHQgPiAxKSA/IG9sZEhlaWdodCAtIDEgOiBvbGRIZWlnaHQsXG4gICAgICAoYWxpZ25Db3JuZXJzICYmIG5ld1dpZHRoID4gMSkgPyBvbGRXaWR0aCAtIDEgOiBvbGRXaWR0aFxuICAgIF07XG5cbiAgICBjb25zdCBlZmZlY3RpdmVPdXRTaXplOiBbbnVtYmVyLCBudW1iZXJdID0gW1xuICAgICAgKGFsaWduQ29ybmVycyAmJiBuZXdIZWlnaHQgPiAxKSA/IG5ld0hlaWdodCAtIDEgOiBuZXdIZWlnaHQsXG4gICAgICAoYWxpZ25Db3JuZXJzICYmIG5ld1dpZHRoID4gMSkgPyBuZXdXaWR0aCAtIDEgOiBuZXdXaWR0aFxuICAgIF07XG5cbiAgICBsZXQgc291cmNlRnJhY0luZGV4UkM6IHN0cmluZztcbiAgICBpZiAoaGFsZlBpeGVsQ2VudGVycykge1xuICAgICAgc291cmNlRnJhY0luZGV4UkMgPVxuICAgICAgICAgIGAodmVjMih5UkMpICsgdmVjMigwLjUpKSAqIGVmZmVjdGl2ZUlucHV0T3Zlck91dHB1dFJhdGlvUkNgICtcbiAgICAgICAgICBgIC0gdmVjMigwLjUpYDtcbiAgICB9IGVsc2Uge1xuICAgICAgc291cmNlRnJhY0luZGV4UkMgPSBgdmVjMih5UkMpICogZWZmZWN0aXZlSW5wdXRPdmVyT3V0cHV0UmF0aW9SQ2A7XG4gICAgfVxuXG4gICAgdGhpcy51c2VyQ29kZSA9IGBcbiAgICAgIGNvbnN0IHZlYzIgZWZmZWN0aXZlSW5wdXRPdmVyT3V0cHV0UmF0aW9SQyA9IHZlYzIoXG4gICAgICAgICAgJHtlZmZlY3RpdmVJblNpemVbMF0gLyBlZmZlY3RpdmVPdXRTaXplWzBdfSxcbiAgICAgICAgICAke2VmZmVjdGl2ZUluU2l6ZVsxXSAvIGVmZmVjdGl2ZU91dFNpemVbMV19KTtcbiAgICAgIGNvbnN0IHZlYzIgaW5wdXRTaGFwZVJDID0gdmVjMigke29sZEhlaWdodH0uMCwgJHtvbGRXaWR0aH0uMCk7XG5cbiAgICAgIHZvaWQgbWFpbigpIHtcbiAgICAgICAgaXZlYzQgY29vcmRzID0gZ2V0T3V0cHV0Q29vcmRzKCk7XG4gICAgICAgIGludCBiID0gY29vcmRzWzBdO1xuICAgICAgICBpbnQgZCA9IGNvb3Jkc1szXTtcbiAgICAgICAgaXZlYzIgeVJDID0gY29vcmRzLnl6O1xuXG4gICAgICAgIC8vIEZyYWN0aW9uYWwgc291cmNlIGluZGV4LlxuICAgICAgICB2ZWMyIHNvdXJjZUZyYWNJbmRleFJDID0gJHtzb3VyY2VGcmFjSW5kZXhSQ307XG5cbiAgICAgICAgLy8gQ29tcHV0ZSB0aGUgZm91ciBpbnRlZ2VyIGluZGljZXMuXG4gICAgICAgIGl2ZWMyIHNvdXJjZUZsb29yUkMgPSBpdmVjMihtYXgoc291cmNlRnJhY0luZGV4UkMsIHZlYzIoMC4wKSkpO1xuICAgICAgICBpdmVjMiBzb3VyY2VDZWlsUkMgPSBpdmVjMihcbiAgICAgICAgICBtaW4oaW5wdXRTaGFwZVJDIC0gMS4wLCBjZWlsKHNvdXJjZUZyYWNJbmRleFJDKSkpO1xuXG4gICAgICAgIGZsb2F0IHRvcExlZnQgPSBnZXRBKGIsIHNvdXJjZUZsb29yUkMueCwgc291cmNlRmxvb3JSQy55LCBkKTtcbiAgICAgICAgZmxvYXQgYm90dG9tTGVmdCA9IGdldEEoYiwgc291cmNlQ2VpbFJDLngsIHNvdXJjZUZsb29yUkMueSwgZCk7XG4gICAgICAgIGZsb2F0IHRvcFJpZ2h0ID0gZ2V0QShiLCBzb3VyY2VGbG9vclJDLngsIHNvdXJjZUNlaWxSQy55LCBkKTtcbiAgICAgICAgZmxvYXQgYm90dG9tUmlnaHQgPSBnZXRBKGIsIHNvdXJjZUNlaWxSQy54LCBzb3VyY2VDZWlsUkMueSwgZCk7XG5cbiAgICAgICAgdmVjMiBmcmFjUkMgPSBzb3VyY2VGcmFjSW5kZXhSQyAtIHZlYzIoc291cmNlRmxvb3JSQyk7XG5cbiAgICAgICAgZmxvYXQgdG9wID0gdG9wTGVmdCArICh0b3BSaWdodCAtIHRvcExlZnQpICogZnJhY1JDLnk7XG4gICAgICAgIGZsb2F0IGJvdHRvbSA9IGJvdHRvbUxlZnQgKyAoYm90dG9tUmlnaHQgLSBib3R0b21MZWZ0KSAqIGZyYWNSQy55O1xuICAgICAgICBmbG9hdCBuZXdWYWx1ZSA9IHRvcCArIChib3R0b20gLSB0b3ApICogZnJhY1JDLng7XG5cbiAgICAgICAgc2V0T3V0cHV0KG5ld1ZhbHVlKTtcbiAgICAgIH1cbiAgICBgO1xuICB9XG59XG4iXX0=","/**\n * @license\n * Copyright 2019 Google LLC. All Rights Reserved.\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n * =============================================================================\n */\nexport class ResizeBilinearPackedProgram {\n constructor(inputShape, newHeight, newWidth, alignCorners, halfPixelCenters) {\n this.variableNames = ['A'];\n this.packedInputs = true;\n this.packedOutput = true;\n this.outputShape = [];\n const [batch, oldHeight, oldWidth, depth] = inputShape;\n this.outputShape = [batch, newHeight, newWidth, depth];\n const effectiveInSize = [\n (alignCorners && newHeight > 1) ? oldHeight - 1 : oldHeight,\n (alignCorners && newWidth > 1) ? oldWidth - 1 : oldWidth\n ];\n const effectiveOutSize = [\n (alignCorners && newHeight > 1) ? newHeight - 1 : newHeight,\n (alignCorners && newWidth > 1) ? newWidth - 1 : newWidth\n ];\n let sourceFracIndexRC;\n if (halfPixelCenters) {\n sourceFracIndexRC = `(vec3(yRC) + vec3(0.5)) * ` +\n `effectiveInputOverOutputRatioRC - vec3(0.5)`;\n }\n else {\n sourceFracIndexRC = `vec3(yRC) * effectiveInputOverOutputRatioRC`;\n }\n this.userCode = `\n const vec3 effectiveInputOverOutputRatioRC = vec3(\n ${effectiveInSize[0] / effectiveOutSize[0]},\n ${effectiveInSize[1] / effectiveOutSize[1]},\n ${effectiveInSize[1] / effectiveOutSize[1]});\n const vec3 inputShapeRC = vec3(${oldHeight}.0, ${oldWidth}.0,\n ${oldWidth}.0);\n\n float getAValue(int b, int r, int c, int d) {\n return getChannel(getA(b, r, c, d), vec2(c, d));\n }\n\n void main() {\n ivec4 coords = getOutputCoords();\n int b = coords[0];\n int d = coords[3];\n // Calculate values for next column in yRC.z.\n ivec3 yRC = coords.yzz + ivec3(0, 0, 1);\n\n // Fractional source index.\n vec3 sourceFracIndexRC = ${sourceFracIndexRC};\n\n // Compute the four integer indices.\n ivec3 sourceFloorRC = ivec3(max(sourceFracIndexRC, vec3(0.0)));\n ivec3 sourceCeilRC = ivec3(\n min(inputShapeRC - 1.0, ceil(sourceFracIndexRC)));\n\n // Should we calculate next column and row elements in 2x2 packed cell.\n bool hasNextCol = d < ${depth - 1};\n bool hasNextRow = coords.z < ${newWidth - 1};\n\n // In parallel, construct four corners for all four components in\n // packed 2x2 cell.\n vec4 topLeft = vec4(\n getAValue(b, sourceFloorRC.x, sourceFloorRC.y, d),\n hasNextCol ? getAValue(b, sourceFloorRC.x, sourceFloorRC.y, d + 1)\n : 0.0,\n hasNextRow ? getAValue(b, sourceFloorRC.x, sourceFloorRC.z, d)\n : 0.0,\n (hasNextRow && hasNextCol) ?\n getAValue(b, sourceFloorRC.x, sourceFloorRC.z, d + 1) : 0.0);\n\n vec4 bottomLeft = vec4(\n getAValue(b, sourceCeilRC.x, sourceFloorRC.y, d),\n hasNextCol ? getAValue(b, sourceCeilRC.x, sourceFloorRC.y, d + 1)\n : 0.0,\n hasNextRow ? getAValue(b, sourceCeilRC.x, sourceFloorRC.z, d)\n : 0.0,\n (hasNextRow && hasNextCol) ?\n getAValue(b, sourceCeilRC.x, sourceFloorRC.z, d + 1) : 0.0);\n\n vec4 topRight = vec4(\n getAValue(b, sourceFloorRC.x, sourceCeilRC.y, d),\n hasNextCol ? getAValue(b, sourceFloorRC.x, sourceCeilRC.y, d + 1)\n : 0.0,\n hasNextRow ? getAValue(b, sourceFloorRC.x, sourceCeilRC.z, d)\n : 0.0,\n (hasNextRow && hasNextCol) ?\n getAValue(b, sourceFloorRC.x, sourceCeilRC.z, d + 1) : 0.0);\n\n vec4 bottomRight = vec4(\n getAValue(b, sourceCeilRC.x, sourceCeilRC.y, d),\n hasNextCol ? getAValue(b, sourceCeilRC.x, sourceCeilRC.y, d + 1)\n : 0.0,\n hasNextRow ? getAValue(b, sourceCeilRC.x, sourceCeilRC.z, d)\n : 0.0,\n (hasNextRow && hasNextCol) ?\n getAValue(b, sourceCeilRC.x, sourceCeilRC.z, d + 1) : 0.0);\n\n vec3 fracRC = sourceFracIndexRC - vec3(sourceFloorRC);\n\n vec4 top = mix(topLeft, topRight, fracRC.yyzz);\n vec4 bottom = mix(bottomLeft, bottomRight, fracRC.yyzz);\n vec4 newValue = mix(top, bottom, fracRC.x);\n\n setOutput(newValue);\n }\n `;\n }\n}\n//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicmVzaXplX2JpbGluZWFyX3BhY2tlZF9ncHUuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi90ZmpzLWJhY2tlbmQtd2ViZ2wvc3JjL3Jlc2l6ZV9iaWxpbmVhcl9wYWNrZWRfZ3B1LnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBOzs7Ozs7Ozs7Ozs7Ozs7R0FlRztBQUlILE1BQU0sT0FBTywyQkFBMkI7SUFPdEMsWUFDSSxVQUE0QyxFQUFFLFNBQWlCLEVBQy9ELFFBQWdCLEVBQUUsWUFBcUIsRUFBRSxnQkFBeUI7UUFSdEUsa0JBQWEsR0FBRyxDQUFDLEdBQUcsQ0FBQyxDQUFDO1FBQ3RCLGlCQUFZLEdBQUcsSUFBSSxDQUFDO1FBQ3BCLGlCQUFZLEdBQUcsSUFBSSxDQUFDO1FBQ3BCLGdCQUFXLEdBQWEsRUFBRSxDQUFDO1FBTXpCLE1BQU0sQ0FBQyxLQUFLLEVBQUUsU0FBUyxFQUFFLFFBQVEsRUFBRSxLQUFLLENBQUMsR0FBRyxVQUFVLENBQUM7UUFDdkQsSUFBSSxDQUFDLFdBQVcsR0FBRyxDQUFDLEtBQUssRUFBRSxTQUFTLEVBQUUsUUFBUSxFQUFFLEtBQUssQ0FBQyxDQUFDO1FBRXZELE1BQU0sZUFBZSxHQUFxQjtZQUN4QyxDQUFDLFlBQVksSUFBSSxTQUFTLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLFNBQVMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLFNBQVM7WUFDM0QsQ0FBQyxZQUFZLElBQUksUUFBUSxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxRQUFRLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxRQUFRO1NBQ3pELENBQUM7UUFFRixNQUFNLGdCQUFnQixHQUFxQjtZQUN6QyxDQUFDLFlBQVksSUFBSSxTQUFTLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLFNBQVMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLFNBQVM7WUFDM0QsQ0FBQyxZQUFZLElBQUksUUFBUSxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxRQUFRLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxRQUFRO1NBQ3pELENBQUM7UUFFRixJQUFJLGlCQUF5QixDQUFDO1FBQzlCLElBQUksZ0JBQWdCLEVBQUU7WUFDcEIsaUJBQWlCLEdBQUcsNEJBQTRCO2dCQUM1Qyw2Q0FBNkMsQ0FBQztTQUNuRDthQUFNO1lBQ0wsaUJBQWlCLEdBQUcsNkNBQTZDLENBQUM7U0FDbkU7UUFFRCxJQUFJLENBQUMsUUFBUSxHQUFHOztZQUVSLGVBQWUsQ0FBQyxDQUFDLENBQUMsR0FBRyxnQkFBZ0IsQ0FBQyxDQUFDLENBQUM7WUFDeEMsZUFBZSxDQUFDLENBQUMsQ0FBQyxHQUFHLGdCQUFnQixDQUFDLENBQUMsQ0FBQztZQUN4QyxlQUFlLENBQUMsQ0FBQyxDQUFDLEdBQUcsZ0JBQWdCLENBQUMsQ0FBQyxDQUFDO3VDQUNiLFNBQVMsT0FBTyxRQUFRO3VDQUN4QixRQUFROzs7Ozs7Ozs7Ozs7OzttQ0FjWixpQkFBaUI7Ozs7Ozs7O2dDQVFwQixLQUFLLEdBQUcsQ0FBQzt1Q0FDRixRQUFRLEdBQUcsQ0FBQzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7O0tBZ0Q5QyxDQUFDO0lBQ0osQ0FBQztDQUNGIiwic291cmNlc0NvbnRlbnQiOlsiLyoqXG4gKiBAbGljZW5zZVxuICogQ29weXJpZ2h0IDIwMTkgR29vZ2xlIExMQy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC5cbiAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSBcIkxpY2Vuc2VcIik7XG4gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuXG4gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXRcbiAqXG4gKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjBcbiAqXG4gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlXG4gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiBcIkFTIElTXCIgQkFTSVMsXG4gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC5cbiAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmRcbiAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLlxuICogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbiAqL1xuXG5pbXBvcnQge0dQR1BVUHJvZ3JhbX0gZnJvbSAnLi9ncGdwdV9tYXRoJztcblxuZXhwb3J0IGNsYXNzIFJlc2l6ZUJpbGluZWFyUGFja2VkUHJvZ3JhbSBpbXBsZW1lbnRzIEdQR1BVUHJvZ3JhbSB7XG4gIHZhcmlhYmxlTmFtZXMgPSBbJ0EnXTtcbiAgcGFja2VkSW5wdXRzID0gdHJ1ZTtcbiAgcGFja2VkT3V0cHV0ID0gdHJ1ZTtcbiAgb3V0cHV0U2hhcGU6IG51bWJlcltdID0gW107XG4gIHVzZXJDb2RlOiBzdHJpbmc7XG5cbiAgY29uc3RydWN0b3IoXG4gICAgICBpbnB1dFNoYXBlOiBbbnVtYmVyLCBudW1iZXIsIG51bWJlciwgbnVtYmVyXSwgbmV3SGVpZ2h0OiBudW1iZXIsXG4gICAgICBuZXdXaWR0aDogbnVtYmVyLCBhbGlnbkNvcm5lcnM6IGJvb2xlYW4sIGhhbGZQaXhlbENlbnRlcnM6IGJvb2xlYW4pIHtcbiAgICBjb25zdCBbYmF0Y2gsIG9sZEhlaWdodCwgb2xkV2lkdGgsIGRlcHRoXSA9IGlucHV0U2hhcGU7XG4gICAgdGhpcy5vdXRwdXRTaGFwZSA9IFtiYXRjaCwgbmV3SGVpZ2h0LCBuZXdXaWR0aCwgZGVwdGhdO1xuXG4gICAgY29uc3QgZWZmZWN0aXZlSW5TaXplOiBbbnVtYmVyLCBudW1iZXJdID0gW1xuICAgICAgKGFsaWduQ29ybmVycyAmJiBuZXdIZWlnaHQgPiAxKSA/IG9sZEhlaWdodCAtIDEgOiBvbGRIZWlnaHQsXG4gICAgICAoYWxpZ25Db3JuZXJzICYmIG5ld1dpZHRoID4gMSkgPyBvbGRXaWR0aCAtIDEgOiBvbGRXaWR0aFxuICAgIF07XG5cbiAgICBjb25zdCBlZmZlY3RpdmVPdXRTaXplOiBbbnVtYmVyLCBudW1iZXJdID0gW1xuICAgICAgKGFsaWduQ29ybmVycyAmJiBuZXdIZWlnaHQgPiAxKSA/IG5ld0hlaWdodCAtIDEgOiBuZXdIZWlnaHQsXG4gICAgICAoYWxpZ25Db3JuZXJzICYmIG5ld1dpZHRoID4gMSkgPyBuZXdXaWR0aCAtIDEgOiBuZXdXaWR0aFxuICAgIF07XG5cbiAgICBsZXQgc291cmNlRnJhY0luZGV4UkM6IHN0cmluZztcbiAgICBpZiAoaGFsZlBpeGVsQ2VudGVycykge1xuICAgICAgc291cmNlRnJhY0luZGV4UkMgPSBgKHZlYzMoeVJDKSArIHZlYzMoMC41KSkgKiBgICtcbiAgICAgICAgICBgZWZmZWN0aXZlSW5wdXRPdmVyT3V0cHV0UmF0aW9SQyAtIHZlYzMoMC41KWA7XG4gICAgfSBlbHNlIHtcbiAgICAgIHNvdXJjZUZyYWNJbmRleFJDID0gYHZlYzMoeVJDKSAqIGVmZmVjdGl2ZUlucHV0T3Zlck91dHB1dFJhdGlvUkNgO1xuICAgIH1cblxuICAgIHRoaXMudXNlckNvZGUgPSBgXG4gICAgICBjb25zdCB2ZWMzIGVmZmVjdGl2ZUlucHV0T3Zlck91dHB1dFJhdGlvUkMgPSB2ZWMzKFxuICAgICAgICAgICR7ZWZmZWN0aXZlSW5TaXplWzBdIC8gZWZmZWN0aXZlT3V0U2l6ZVswXX0sXG4gICAgICAgICAgJHtlZmZlY3RpdmVJblNpemVbMV0gLyBlZmZlY3RpdmVPdXRTaXplWzFdfSxcbiAgICAgICAgICAke2VmZmVjdGl2ZUluU2l6ZVsxXSAvIGVmZmVjdGl2ZU91dFNpemVbMV19KTtcbiAgICAgIGNvbnN0IHZlYzMgaW5wdXRTaGFwZVJDID0gdmVjMygke29sZEhlaWdodH0uMCwgJHtvbGRXaWR0aH0uMCxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAke29sZFdpZHRofS4wKTtcblxuICAgICAgZmxvYXQgZ2V0QVZhbHVlKGludCBiLCBpbnQgciwgaW50IGMsIGludCBkKSB7XG4gICAgICAgIHJldHVybiBnZXRDaGFubmVsKGdldEEoYiwgciwgYywgZCksIHZlYzIoYywgZCkpO1xuICAgICAgfVxuXG4gICAgICB2b2lkIG1haW4oKSB7XG4gICAgICAgIGl2ZWM0IGNvb3JkcyA9IGdldE91dHB1dENvb3JkcygpO1xuICAgICAgICBpbnQgYiA9IGNvb3Jkc1swXTtcbiAgICAgICAgaW50IGQgPSBjb29yZHNbM107XG4gICAgICAgIC8vIENhbGN1bGF0ZSB2YWx1ZXMgZm9yIG5leHQgY29sdW1uIGluIHlSQy56LlxuICAgICAgICBpdmVjMyB5UkMgPSBjb29yZHMueXp6ICsgaXZlYzMoMCwgMCwgMSk7XG5cbiAgICAgICAgLy8gRnJhY3Rpb25hbCBzb3VyY2UgaW5kZXguXG4gICAgICAgIHZlYzMgc291cmNlRnJhY0luZGV4UkMgPSAke3NvdXJjZUZyYWNJbmRleFJDfTtcblxuICAgICAgICAvLyBDb21wdXRlIHRoZSBmb3VyIGludGVnZXIgaW5kaWNlcy5cbiAgICAgICAgaXZlYzMgc291cmNlRmxvb3JSQyA9IGl2ZWMzKG1heChzb3VyY2VGcmFjSW5kZXhSQywgdmVjMygwLjApKSk7XG4gICAgICAgIGl2ZWMzIHNvdXJjZUNlaWxSQyA9IGl2ZWMzKFxuICAgICAgICAgIG1pbihpbnB1dFNoYXBlUkMgLSAxLjAsIGNlaWwoc291cmNlRnJhY0luZGV4UkMpKSk7XG5cbiAgICAgICAgLy8gU2hvdWxkIHdlIGNhbGN1bGF0ZSBuZXh0IGNvbHVtbiBhbmQgcm93IGVsZW1lbnRzIGluIDJ4MiBwYWNrZWQgY2VsbC5cbiAgICAgICAgYm9vbCBoYXNOZXh0Q29sID0gZCA8ICR7ZGVwdGggLSAxfTtcbiAgICAgICAgYm9vbCBoYXNOZXh0Um93ID0gY29vcmRzLnogPCAke25ld1dpZHRoIC0gMX07XG5cbiAgICAgICAgLy8gSW4gcGFyYWxsZWwsIGNvbnN0cnVjdCBmb3VyIGNvcm5lcnMgZm9yIGFsbCBmb3VyIGNvbXBvbmVudHMgaW5cbiAgICAgICAgLy8gcGFja2VkIDJ4MiBjZWxsLlxuICAgICAgICB2ZWM0IHRvcExlZnQgPSB2ZWM0KFxuICAgICAgICAgIGdldEFWYWx1ZShiLCBzb3VyY2VGbG9vclJDLngsIHNvdXJjZUZsb29yUkMueSwgZCksXG4gICAgICAgICAgaGFzTmV4dENvbCA/IGdldEFWYWx1ZShiLCBzb3VyY2VGbG9vclJDLngsIHNvdXJjZUZsb29yUkMueSwgZCArIDEpXG4gICAgICAgICAgICAgICAgICAgICA6IDAuMCxcbiAgICAgICAgICBoYXNOZXh0Um93ID8gZ2V0QVZhbHVlKGIsIHNvdXJjZUZsb29yUkMueCwgc291cmNlRmxvb3JSQy56LCBkKVxuICAgICAgICAgICAgICAgICAgICAgOiAwLjAsXG4gICAgICAgICAgKGhhc05leHRSb3cgJiYgaGFzTmV4dENvbCkgP1xuICAgICAgICAgICAgZ2V0QVZhbHVlKGIsIHNvdXJjZUZsb29yUkMueCwgc291cmNlRmxvb3JSQy56LCBkICsgMSkgOiAwLjApO1xuXG4gICAgICAgIHZlYzQgYm90dG9tTGVmdCA9IHZlYzQoXG4gICAgICAgICAgZ2V0QVZhbHVlKGIsIHNvdXJjZUNlaWxSQy54LCBzb3VyY2VGbG9vclJDLnksIGQpLFxuICAgICAgICAgIGhhc05leHRDb2wgPyBnZXRBVmFsdWUoYiwgc291cmNlQ2VpbFJDLngsIHNvdXJjZUZsb29yUkMueSwgZCArIDEpXG4gICAgICAgICAgICAgICAgICAgICA6IDAuMCxcbiAgICAgICAgICBoYXNOZXh0Um93ID8gZ2V0QVZhbHVlKGIsIHNvdXJjZUNlaWxSQy54LCBzb3VyY2VGbG9vclJDLnosIGQpXG4gICAgICAgICAgICAgICAgICAgICA6IDAuMCxcbiAgICAgICAgICAoaGFzTmV4dFJvdyAmJiBoYXNOZXh0Q29sKSA/XG4gICAgICAgICAgICBnZXRBVmFsdWUoYiwgc291cmNlQ2VpbFJDLngsIHNvdXJjZUZsb29yUkMueiwgZCArIDEpIDogMC4wKTtcblxuICAgICAgICB2ZWM0IHRvcFJpZ2h0ID0gdmVjNChcbiAgICAgICAgICBnZXRBVmFsdWUoYiwgc291cmNlRmxvb3JSQy54LCBzb3VyY2VDZWlsUkMueSwgZCksXG4gICAgICAgICAgaGFzTmV4dENvbCA/IGdldEFWYWx1ZShiLCBzb3VyY2VGbG9vclJDLngsIHNvdXJjZUNlaWxSQy55LCBkICsgMSlcbiAgICAgICAgICAgICAgICAgICAgIDogMC4wLFxuICAgICAgICAgIGhhc05leHRSb3cgPyBnZXRBVmFsdWUoYiwgc291cmNlRmxvb3JSQy54LCBzb3VyY2VDZWlsUkMueiwgZClcbiAgICAgICAgICAgICAgICAgICAgIDogMC4wLFxuICAgICAgICAgIChoYXNOZXh0Um93ICYmIGhhc05leHRDb2wpID9cbiAgICAgICAgICAgIGdldEFWYWx1ZShiLCBzb3VyY2VGbG9vclJDLngsIHNvdXJjZUNlaWxSQy56LCBkICsgMSkgOiAwLjApO1xuXG4gICAgICAgIHZlYzQgYm90dG9tUmlnaHQgPSB2ZWM0KFxuICAgICAgICAgIGdldEFWYWx1ZShiLCBzb3VyY2VDZWlsUkMueCwgc291cmNlQ2VpbFJDLnksIGQpLFxuICAgICAgICAgIGhhc05leHRDb2wgPyBnZXRBVmFsdWUoYiwgc291cmNlQ2VpbFJDLngsIHNvdXJjZUNlaWxSQy55LCBkICsgMSlcbiAgICAgICAgICAgICAgICAgICAgIDogMC4wLFxuICAgICAgICAgIGhhc05leHRSb3cgPyBnZXRBVmFsdWUoYiwgc291cmNlQ2VpbFJDLngsIHNvdXJjZUNlaWxSQy56LCBkKVxuICAgICAgICAgICAgICAgICAgICAgOiAwLjAsXG4gICAgICAgICAgKGhhc05leHRSb3cgJiYgaGFzTmV4dENvbCkgP1xuICAgICAgICAgICAgZ2V0QVZhbHVlKGIsIHNvdXJjZUNlaWxSQy54LCBzb3VyY2VDZWlsUkMueiwgZCArIDEpIDogMC4wKTtcblxuICAgICAgICB2ZWMzIGZyYWNSQyA9IHNvdXJjZUZyYWNJbmRleFJDIC0gdmVjMyhzb3VyY2VGbG9vclJDKTtcblxuICAgICAgICB2ZWM0IHRvcCA9IG1peCh0b3BMZWZ0LCB0b3BSaWdodCwgZnJhY1JDLnl5enopO1xuICAgICAgICB2ZWM0IGJvdHRvbSA9IG1peChib3R0b21MZWZ0LCBib3R0b21SaWdodCwgZnJhY1JDLnl5enopO1xuICAgICAgICB2ZWM0IG5ld1ZhbHVlID0gbWl4KHRvcCwgYm90dG9tLCBmcmFjUkMueCk7XG5cbiAgICAgICAgc2V0T3V0cHV0KG5ld1ZhbHVlKTtcbiAgICAgIH1cbiAgICBgO1xuICB9XG59XG4iXX0=","/**\n * @license\n * Copyright 2020 Google LLC. All Rights Reserved.\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n * =============================================================================\n */\nimport { env, ResizeBilinear } from '@tensorflow/tfjs-core';\nimport { ResizeBilinearProgram } from '../resize_bilinear_gpu';\nimport { ResizeBilinearPackedProgram } from '../resize_bilinear_packed_gpu';\nexport function resizeBilinear(args) {\n const { inputs, backend, attrs } = args;\n const { images } = inputs;\n const { alignCorners, halfPixelCenters, size } = attrs;\n const [newHeight, newWidth] = size;\n const program = env().getBool('WEBGL_PACK_IMAGE_OPERATIONS') ?\n new ResizeBilinearPackedProgram(images.shape, newHeight, newWidth, alignCorners, halfPixelCenters) :\n new ResizeBilinearProgram(images.shape, newHeight, newWidth, alignCorners, halfPixelCenters);\n return backend.runWebGLProgram(program, [images], 'float32');\n}\nexport const resizeBilinearConfig = {\n kernelName: ResizeBilinear,\n backendName: 'webgl',\n kernelFunc: resizeBilinear\n};\n//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiUmVzaXplQmlsaW5lYXIuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi8uLi90ZmpzLWJhY2tlbmQtd2ViZ2wvc3JjL2tlcm5lbHMvUmVzaXplQmlsaW5lYXIudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUE7Ozs7Ozs7Ozs7Ozs7OztHQWVHO0FBRUgsT0FBTyxFQUFDLEdBQUcsRUFBNEIsY0FBYyxFQUF3RCxNQUFNLHVCQUF1QixDQUFDO0FBRzNJLE9BQU8sRUFBQyxxQkFBcUIsRUFBQyxNQUFNLHdCQUF3QixDQUFDO0FBQzdELE9BQU8sRUFBQywyQkFBMkIsRUFBQyxNQUFNLCtCQUErQixDQUFDO0FBRTFFLE1BQU0sVUFBVSxjQUFjLENBQUMsSUFJOUI7SUFDQyxNQUFNLEVBQUMsTUFBTSxFQUFFLE9BQU8sRUFBRSxLQUFLLEVBQUMsR0FBRyxJQUFJLENBQUM7SUFDdEMsTUFBTSxFQUFDLE1BQU0sRUFBQyxHQUFHLE1BQU0sQ0FBQztJQUN4QixNQUFNLEVBQUMsWUFBWSxFQUFFLGdCQUFnQixFQUFFLElBQUksRUFBQyxHQUFHLEtBQUssQ0FBQztJQUVyRCxNQUFNLENBQUMsU0FBUyxFQUFFLFFBQVEsQ0FBQyxHQUFHLElBQUksQ0FBQztJQUVuQyxNQUFNLE9BQU8sR0FBRyxHQUFHLEVBQUUsQ0FBQyxPQUFPLENBQUMsNkJBQTZCLENBQUMsQ0FBQyxDQUFDO1FBQzFELElBQUksMkJBQTJCLENBQzNCLE1BQU0sQ0FBQyxLQUF5QyxFQUFFLFNBQVMsRUFBRSxRQUFRLEVBQ3JFLFlBQVksRUFBRSxnQkFBZ0IsQ0FBQyxDQUFDLENBQUM7UUFDckMsSUFBSSxxQkFBcUIsQ0FDckIsTUFBTSxDQUFDLEtBQXlDLEVBQUUsU0FBUyxFQUFFLFFBQVEsRUFDckUsWUFBWSxFQUFFLGdCQUFnQixDQUFDLENBQUM7SUFDeEMsT0FBTyxPQUFPLENBQUMsZUFBZSxDQUFDLE9BQU8sRUFBRSxDQUFDLE1BQU0sQ0FBQyxFQUFFLFNBQVMsQ0FBQyxDQUFDO0FBQy9ELENBQUM7QUFFRCxNQUFNLENBQUMsTUFBTSxvQkFBb0IsR0FBaUI7SUFDaEQsVUFBVSxFQUFFLGNBQWM7SUFDMUIsV0FBVyxFQUFFLE9BQU87SUFDcEIsVUFBVSxFQUFFLGNBQWtDO0NBQy9DLENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyIvKipcbiAqIEBsaWNlbnNlXG4gKiBDb3B5cmlnaHQgMjAyMCBHb29nbGUgTExDLiBBbGwgUmlnaHRzIFJlc2VydmVkLlxuICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlIFwiTGljZW5zZVwiKTtcbiAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS5cbiAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdFxuICpcbiAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMFxuICpcbiAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmVcbiAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuIFwiQVMgSVNcIiBCQVNJUyxcbiAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLlxuICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZFxuICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuXG4gKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuICovXG5cbmltcG9ydCB7ZW52LCBLZXJuZWxDb25maWcsIEtlcm5lbEZ1bmMsIFJlc2l6ZUJpbGluZWFyLCBSZXNpemVCaWxpbmVhckF0dHJzLCBSZXNpemVCaWxpbmVhcklucHV0cywgVGVuc29ySW5mb30gZnJvbSAnQHRlbnNvcmZsb3cvdGZqcy1jb3JlJztcblxuaW1wb3J0IHtNYXRoQmFja2VuZFdlYkdMfSBmcm9tICcuLi9iYWNrZW5kX3dlYmdsJztcbmltcG9ydCB7UmVzaXplQmlsaW5lYXJQcm9ncmFtfSBmcm9tICcuLi9yZXNpemVfYmlsaW5lYXJfZ3B1JztcbmltcG9ydCB7UmVzaXplQmlsaW5lYXJQYWNrZWRQcm9ncmFtfSBmcm9tICcuLi9yZXNpemVfYmlsaW5lYXJfcGFja2VkX2dwdSc7XG5cbmV4cG9ydCBmdW5jdGlvbiByZXNpemVCaWxpbmVhcihhcmdzOiB7XG4gIGlucHV0czogUmVzaXplQmlsaW5lYXJJbnB1dHMsXG4gIGJhY2tlbmQ6IE1hdGhCYWNrZW5kV2ViR0wsXG4gIGF0dHJzOiBSZXNpemVCaWxpbmVhckF0dHJzXG59KTogVGVuc29ySW5mbyB7XG4gIGNvbnN0IHtpbnB1dHMsIGJhY2tlbmQsIGF0dHJzfSA9IGFyZ3M7XG4gIGNvbnN0IHtpbWFnZXN9ID0gaW5wdXRzO1xuICBjb25zdCB7YWxpZ25Db3JuZXJzLCBoYWxmUGl4ZWxDZW50ZXJzLCBzaXplfSA9IGF0dHJzO1xuXG4gIGNvbnN0IFtuZXdIZWlnaHQsIG5ld1dpZHRoXSA9IHNpemU7XG5cbiAgY29uc3QgcHJvZ3JhbSA9IGVudigpLmdldEJvb2woJ1dFQkdMX1BBQ0tfSU1BR0VfT1BFUkFUSU9OUycpID9cbiAgICAgIG5ldyBSZXNpemVCaWxpbmVhclBhY2tlZFByb2dyYW0oXG4gICAgICAgICAgaW1hZ2VzLnNoYXBlIGFzIFtudW1iZXIsIG51bWJlciwgbnVtYmVyLCBudW1iZXJdLCBuZXdIZWlnaHQsIG5ld1dpZHRoLFxuICAgICAgICAgIGFsaWduQ29ybmVycywgaGFsZlBpeGVsQ2VudGVycykgOlxuICAgICAgbmV3IFJlc2l6ZUJpbGluZWFyUHJvZ3JhbShcbiAgICAgICAgICBpbWFnZXMuc2hhcGUgYXMgW251bWJlciwgbnVtYmVyLCBudW1iZXIsIG51bWJlcl0sIG5ld0hlaWdodCwgbmV3V2lkdGgsXG4gICAgICAgICAgYWxpZ25Db3JuZXJzLCBoYWxmUGl4ZWxDZW50ZXJzKTtcbiAgcmV0dXJuIGJhY2tlbmQucnVuV2ViR0xQcm9ncmFtKHByb2dyYW0sIFtpbWFnZXNdLCAnZmxvYXQzMicpO1xufVxuXG5leHBvcnQgY29uc3QgcmVzaXplQmlsaW5lYXJDb25maWc6IEtlcm5lbENvbmZpZyA9IHtcbiAga2VybmVsTmFtZTogUmVzaXplQmlsaW5lYXIsXG4gIGJhY2tlbmROYW1lOiAnd2ViZ2wnLFxuICBrZXJuZWxGdW5jOiByZXNpemVCaWxpbmVhciBhcyB7fSBhcyBLZXJuZWxGdW5jXG59O1xuIl19","/**\n * @license\n * Copyright 2018 Google LLC. All Rights Reserved.\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n * =============================================================================\n */\nexport class ResizeBilinearBackpropProgram {\n constructor(dyShape, inputShape, alignCorners) {\n this.variableNames = ['dy'];\n this.outputShape = [];\n this.outputShape = inputShape;\n const [, xHeight, xWidth,] = inputShape;\n const [, yHeight, yWidth] = dyShape;\n // In the backwards pass, we want to find the pixels that were generated for\n // each pixel in the input image the forward pass and add the corresponding\n // coefficient from dy to the gradient (with some interpolation).\n const effectiveXSize = [\n (alignCorners && yHeight > 1) ? xHeight - 1 : xHeight,\n (alignCorners && yWidth > 1) ? xWidth - 1 : xWidth\n ];\n const effectiveYSize = [\n (alignCorners && yHeight > 1) ? yHeight - 1 : yHeight,\n (alignCorners && yWidth > 1) ? yWidth - 1 : yWidth\n ];\n const heightScale = effectiveXSize[0] / effectiveYSize[0];\n const widthScale = effectiveXSize[1] / effectiveYSize[1];\n const invHeightScale = 1 / heightScale;\n const invWidthScale = 1 / widthScale;\n // This defines the size of the window of values around a particular\n // index in dy that we want to search for contributions to dx.\n const winHeight = (Math.ceil(invHeightScale) * 2) + 2;\n const winWidth = (Math.ceil(invWidthScale) * 2) + 2;\n this.userCode = `\n void main() {\n ivec4 coords = getOutputCoords();\n int b = coords[0];\n int d = coords[3];\n int r = coords[1];\n int c = coords[2];\n\n float accumulator = 0.0;\n\n const float heightScale = float(${heightScale});\n const float widthScale = float(${widthScale});\n\n const float invHeightScale = float(${invHeightScale});\n const float invWidthScale = float(${invWidthScale});\n\n const int winHeight = int(${winHeight});\n const int winWidth = int(${winWidth});\n\n // Compute bounds for where in dy we will look\n float startRLerp = floor(float(r) * invHeightScale);\n int startDyR = int(startRLerp - float(winHeight / 2));\n\n float startCLerp = floor(float(c) * invWidthScale);\n int startDyC = int(startCLerp - float(winWidth / 2));\n\n // Loop over dy\n for (int dyROffset = 0; dyROffset < winHeight; dyROffset++) {\n int dyR = dyROffset + startDyR;\n\n // Guard against the window exceeding the bounds of dy\n if (dyR < 0 || dyR >= ${yHeight}) {\n continue;\n }\n\n for (int dyCOffset = 0; dyCOffset < winWidth; dyCOffset++) {\n int dyC = dyCOffset + startDyC;\n\n // Guard against the window exceeding the bounds of dy\n if (dyC < 0 || dyC >= ${yWidth}) {\n continue;\n }\n\n float dxR = float(dyR) * heightScale;\n int topDxRIndex = int(floor(dxR));\n int bottomDxRIndex = int(min(ceil(dxR), ${xHeight - 1}.0));\n float dxRLerp = dxR - float(topDxRIndex);\n float inverseDxRLerp = 1.0 - dxRLerp;\n\n float dxC = float(dyC) * widthScale;\n int leftDxCIndex = int(floor(dxC));\n int rightDxCIndex = int(min(ceil(dxC), ${xWidth - 1}.0));\n float dxCLerp = dxC - float(leftDxCIndex);\n float inverseDxCLerp = 1.0 - dxCLerp;\n\n if (r == topDxRIndex && c == leftDxCIndex) {\n // topLeft\n accumulator +=\n getDy(b, dyR, dyC, d) * inverseDxRLerp * inverseDxCLerp;\n }\n\n if (r == topDxRIndex && c == rightDxCIndex) {\n // topRight\n accumulator += getDy(b, dyR, dyC, d) * inverseDxRLerp * dxCLerp;\n }\n\n if (r == bottomDxRIndex && c == leftDxCIndex) {\n // bottomLeft\n accumulator += getDy(b, dyR, dyC, d) * dxRLerp * inverseDxCLerp;\n }\n\n if (r == bottomDxRIndex && c == rightDxCIndex) {\n // bottomRight\n accumulator += getDy(b, dyR, dyC, d) * dxRLerp * dxCLerp;\n }\n }\n }\n // End loop over dy\n\n setOutput(accumulator);\n }\n `;\n }\n}\n//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicmVzaXplX2JpbGluZWFyX2JhY2twcm9wX2dwdS5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uL3RmanMtYmFja2VuZC13ZWJnbC9zcmMvcmVzaXplX2JpbGluZWFyX2JhY2twcm9wX2dwdS50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQTs7Ozs7Ozs7Ozs7Ozs7O0dBZUc7QUFJSCxNQUFNLE9BQU8sNkJBQTZCO0lBS3hDLFlBQ0ksT0FBeUMsRUFDekMsVUFBNEMsRUFBRSxZQUFxQjtRQU52RSxrQkFBYSxHQUFHLENBQUMsSUFBSSxDQUFDLENBQUM7UUFDdkIsZ0JBQVcsR0FBYSxFQUFFLENBQUM7UUFNekIsSUFBSSxDQUFDLFdBQVcsR0FBRyxVQUFVLENBQUM7UUFDOUIsTUFBTSxDQUFDLEVBQUUsT0FBTyxFQUFFLE1BQU0sRUFBRyxHQUFHLFVBQVUsQ0FBQztRQUN6QyxNQUFNLENBQUMsRUFBRSxPQUFPLEVBQUUsTUFBTSxDQUFDLEdBQUcsT0FBTyxDQUFDO1FBRXBDLDRFQUE0RTtRQUM1RSwyRUFBMkU7UUFDM0UsaUVBQWlFO1FBRWpFLE1BQU0sY0FBYyxHQUFxQjtZQUN2QyxDQUFDLFlBQVksSUFBSSxPQUFPLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLE9BQU8sR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLE9BQU87WUFDckQsQ0FBQyxZQUFZLElBQUksTUFBTSxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxNQUFNLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxNQUFNO1NBQ25ELENBQUM7UUFFRixNQUFNLGNBQWMsR0FBcUI7WUFDdkMsQ0FBQyxZQUFZLElBQUksT0FBTyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxPQUFPLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxPQUFPO1lBQ3JELENBQUMsWUFBWSxJQUFJLE1BQU0sR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsTUFBTSxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsTUFBTTtTQUNuRCxDQUFDO1FBRUYsTUFBTSxXQUFXLEdBQUcsY0FBYyxDQUFDLENBQUMsQ0FBQyxHQUFHLGNBQWMsQ0FBQyxDQUFDLENBQUMsQ0FBQztRQUMxRCxNQUFNLFVBQVUsR0FBRyxjQUFjLENBQUMsQ0FBQyxDQUFDLEdBQUcsY0FBYyxDQUFDLENBQUMsQ0FBQyxDQUFDO1FBRXpELE1BQU0sY0FBYyxHQUFHLENBQUMsR0FBRyxXQUFXLENBQUM7UUFDdkMsTUFBTSxhQUFhLEdBQUcsQ0FBQyxHQUFHLFVBQVUsQ0FBQztRQUVyQyxvRUFBb0U7UUFDcEUsOERBQThEO1FBQzlELE1BQU0sU0FBUyxHQUFHLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxjQUFjLENBQUMsR0FBRyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUM7UUFDdEQsTUFBTSxRQUFRLEdBQUcsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLGFBQWEsQ0FBQyxHQUFHLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQztRQUVwRCxJQUFJLENBQUMsUUFBUSxHQUFHOzs7Ozs7Ozs7OzBDQVVzQixXQUFXO3lDQUNaLFVBQVU7OzZDQUVOLGNBQWM7NENBQ2YsYUFBYTs7b0NBRXJCLFNBQVM7bUNBQ1YsUUFBUTs7Ozs7Ozs7Ozs7Ozs7a0NBY1QsT0FBTzs7Ozs7Ozs7b0NBUUwsTUFBTTs7Ozs7O3NEQU1ZLE9BQU8sR0FBRyxDQUFDOzs7Ozs7cURBTVosTUFBTSxHQUFHLENBQUM7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7OztLQThCMUQsQ0FBQztJQUNKLENBQUM7Q0FDRiIsInNvdXJjZXNDb250ZW50IjpbIi8qKlxuICogQGxpY2Vuc2VcbiAqIENvcHlyaWdodCAyMDE4IEdvb2dsZSBMTEMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuXG4gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgXCJMaWNlbnNlXCIpO1xuICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLlxuICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0XG4gKlxuICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wXG4gKlxuICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZVxuICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gXCJBUyBJU1wiIEJBU0lTLFxuICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuXG4gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kXG4gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS5cbiAqID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4gKi9cblxuaW1wb3J0IHtHUEdQVVByb2dyYW19IGZyb20gJy4vZ3BncHVfbWF0aCc7XG5cbmV4cG9ydCBjbGFzcyBSZXNpemVCaWxpbmVhckJhY2twcm9wUHJvZ3JhbSBpbXBsZW1lbnRzIEdQR1BVUHJvZ3JhbSB7XG4gIHZhcmlhYmxlTmFtZXMgPSBbJ2R5J107XG4gIG91dHB1dFNoYXBlOiBudW1iZXJbXSA9IFtdO1xuICB1c2VyQ29kZTogc3RyaW5nO1xuXG4gIGNvbnN0cnVjdG9yKFxuICAgICAgZHlTaGFwZTogW251bWJlciwgbnVtYmVyLCBudW1iZXIsIG51bWJlcl0sXG4gICAgICBpbnB1dFNoYXBlOiBbbnVtYmVyLCBudW1iZXIsIG51bWJlciwgbnVtYmVyXSwgYWxpZ25Db3JuZXJzOiBib29sZWFuKSB7XG4gICAgdGhpcy5vdXRwdXRTaGFwZSA9IGlucHV0U2hhcGU7XG4gICAgY29uc3QgWywgeEhlaWdodCwgeFdpZHRoLCBdID0gaW5wdXRTaGFwZTtcbiAgICBjb25zdCBbLCB5SGVpZ2h0LCB5V2lkdGhdID0gZHlTaGFwZTtcblxuICAgIC8vIEluIHRoZSBiYWNrd2FyZHMgcGFzcywgd2Ugd2FudCB0byBmaW5kIHRoZSBwaXhlbHMgdGhhdCB3ZXJlIGdlbmVyYXRlZCBmb3JcbiAgICAvLyBlYWNoIHBpeGVsIGluIHRoZSBpbnB1dCBpbWFnZSB0aGUgZm9yd2FyZCBwYXNzIGFuZCBhZGQgdGhlIGNvcnJlc3BvbmRpbmdcbiAgICAvLyBjb2VmZmljaWVudCBmcm9tIGR5IHRvIHRoZSBncmFkaWVudCAod2l0aCBzb21lIGludGVycG9sYXRpb24pLlxuXG4gICAgY29uc3QgZWZmZWN0aXZlWFNpemU6IFtudW1iZXIsIG51bWJlcl0gPSBbXG4gICAgICAoYWxpZ25Db3JuZXJzICYmIHlIZWlnaHQgPiAxKSA/IHhIZWlnaHQgLSAxIDogeEhlaWdodCxcbiAgICAgIChhbGlnbkNvcm5lcnMgJiYgeVdpZHRoID4gMSkgPyB4V2lkdGggLSAxIDogeFdpZHRoXG4gICAgXTtcblxuICAgIGNvbnN0IGVmZmVjdGl2ZVlTaXplOiBbbnVtYmVyLCBudW1iZXJdID0gW1xuICAgICAgKGFsaWduQ29ybmVycyAmJiB5SGVpZ2h0ID4gMSkgPyB5SGVpZ2h0IC0gMSA6IHlIZWlnaHQsXG4gICAgICAoYWxpZ25Db3JuZXJzICYmIHlXaWR0aCA+IDEpID8geVdpZHRoIC0gMSA6IHlXaWR0aFxuICAgIF07XG5cbiAgICBjb25zdCBoZWlnaHRTY2FsZSA9IGVmZmVjdGl2ZVhTaXplWzBdIC8gZWZmZWN0aXZlWVNpemVbMF07XG4gICAgY29uc3Qgd2lkdGhTY2FsZSA9IGVmZmVjdGl2ZVhTaXplWzFdIC8gZWZmZWN0aXZlWVNpemVbMV07XG5cbiAgICBjb25zdCBpbnZIZWlnaHRTY2FsZSA9IDEgLyBoZWlnaHRTY2FsZTtcbiAgICBjb25zdCBpbnZXaWR0aFNjYWxlID0gMSAvIHdpZHRoU2NhbGU7XG5cbiAgICAvLyBUaGlzIGRlZmluZXMgdGhlIHNpemUgb2YgdGhlIHdpbmRvdyBvZiB2YWx1ZXMgYXJvdW5kIGEgcGFydGljdWxhclxuICAgIC8vIGluZGV4IGluIGR5IHRoYXQgd2Ugd2FudCB0byBzZWFyY2ggZm9yIGNvbnRyaWJ1dGlvbnMgdG8gZHguXG4gICAgY29uc3Qgd2luSGVpZ2h0ID0gKE1hdGguY2VpbChpbnZIZWlnaHRTY2FsZSkgKiAyKSArIDI7XG4gICAgY29uc3Qgd2luV2lkdGggPSAoTWF0aC5jZWlsKGludldpZHRoU2NhbGUpICogMikgKyAyO1xuXG4gICAgdGhpcy51c2VyQ29kZSA9IGBcbiAgICAgIHZvaWQgbWFpbigpIHtcbiAgICAgICAgaXZlYzQgY29vcmRzID0gZ2V0T3V0cHV0Q29vcmRzKCk7XG4gICAgICAgIGludCBiID0gY29vcmRzWzBdO1xuICAgICAgICBpbnQgZCA9IGNvb3Jkc1szXTtcbiAgICAgICAgaW50IHIgPSBjb29yZHNbMV07XG4gICAgICAgIGludCBjID0gY29vcmRzWzJdO1xuXG4gICAgICAgIGZsb2F0IGFjY3VtdWxhdG9yID0gMC4wO1xuXG4gICAgICAgIGNvbnN0IGZsb2F0IGhlaWdodFNjYWxlID0gZmxvYXQoJHtoZWlnaHRTY2FsZX0pO1xuICAgICAgICBjb25zdCBmbG9hdCB3aWR0aFNjYWxlID0gZmxvYXQoJHt3aWR0aFNjYWxlfSk7XG5cbiAgICAgICAgY29uc3QgZmxvYXQgaW52SGVpZ2h0U2NhbGUgPSBmbG9hdCgke2ludkhlaWdodFNjYWxlfSk7XG4gICAgICAgIGNvbnN0IGZsb2F0IGludldpZHRoU2NhbGUgPSBmbG9hdCgke2ludldpZHRoU2NhbGV9KTtcblxuICAgICAgICBjb25zdCBpbnQgd2luSGVpZ2h0ID0gaW50KCR7d2luSGVpZ2h0fSk7XG4gICAgICAgIGNvbnN0IGludCB3aW5XaWR0aCA9IGludCgke3dpbldpZHRofSk7XG5cbiAgICAgICAgLy8gQ29tcHV0ZSBib3VuZHMgZm9yIHdoZXJlIGluIGR5IHdlIHdpbGwgbG9va1xuICAgICAgICBmbG9hdCBzdGFydFJMZXJwID0gZmxvb3IoZmxvYXQocikgKiBpbnZIZWlnaHRTY2FsZSk7XG4gICAgICAgIGludCBzdGFydER5UiA9IGludChzdGFydFJMZXJwIC0gZmxvYXQod2luSGVpZ2h0IC8gMikpO1xuXG4gICAgICAgIGZsb2F0IHN0YXJ0Q0xlcnAgPSBmbG9vcihmbG9hdChjKSAqIGludldpZHRoU2NhbGUpO1xuICAgICAgICBpbnQgc3RhcnREeUMgPSBpbnQoc3RhcnRDTGVycCAtIGZsb2F0KHdpbldpZHRoIC8gMikpO1xuXG4gICAgICAgIC8vIExvb3Agb3ZlciBkeVxuICAgICAgICBmb3IgKGludCBkeVJPZmZzZXQgPSAwOyBkeVJPZmZzZXQgPCB3aW5IZWlnaHQ7IGR5Uk9mZnNldCsrKSB7XG4gICAgICAgICAgaW50IGR5UiA9IGR5Uk9mZnNldCArIHN0YXJ0RHlSO1xuXG4gICAgICAgICAgLy8gR3VhcmQgYWdhaW5zdCB0aGUgd2luZG93IGV4Y2VlZGluZyB0aGUgYm91bmRzIG9mIGR5XG4gICAgICAgICAgaWYgKGR5UiA8IDAgfHwgZHlSID49ICR7eUhlaWdodH0pIHtcbiAgICAgICAgICAgIGNvbnRpbnVlO1xuICAgICAgICAgIH1cblxuICAgICAgICAgIGZvciAoaW50IGR5Q09mZnNldCA9IDA7IGR5Q09mZnNldCA8IHdpbldpZHRoOyBkeUNPZmZzZXQrKykge1xuICAgICAgICAgICAgaW50IGR5QyA9IGR5Q09mZnNldCArIHN0YXJ0RHlDO1xuXG4gICAgICAgICAgICAvLyBHdWFyZCBhZ2FpbnN0IHRoZSB3aW5kb3cgZXhjZWVkaW5nIHRoZSBib3VuZHMgb2YgZHlcbiAgICAgICAgICAgIGlmIChkeUMgPCAwIHx8IGR5QyA+PSAke3lXaWR0aH0pIHtcbiAgICAgICAgICAgICAgY29udGludWU7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIGZsb2F0IGR4UiA9IGZsb2F0KGR5UikgKiBoZWlnaHRTY2FsZTtcbiAgICAgICAgICAgIGludCB0b3BEeFJJbmRleCA9IGludChmbG9vcihkeFIpKTtcbiAgICAgICAgICAgIGludCBib3R0b21EeFJJbmRleCA9IGludChtaW4oY2VpbChkeFIpLCAke3hIZWlnaHQgLSAxfS4wKSk7XG4gICAgICAgICAgICBmbG9hdCBkeFJMZXJwID0gZHhSIC0gZmxvYXQodG9wRHhSSW5kZXgpO1xuICAgICAgICAgICAgZmxvYXQgaW52ZXJzZUR4UkxlcnAgPSAxLjAgLSBkeFJMZXJwO1xuXG4gICAgICAgICAgICBmbG9hdCBkeEMgPSBmbG9hdChkeUMpICogd2lkdGhTY2FsZTtcbiAgICAgICAgICAgIGludCBsZWZ0RHhDSW5kZXggPSBpbnQoZmxvb3IoZHhDKSk7XG4gICAgICAgICAgICBpbnQgcmlnaHREeENJbmRleCA9IGludChtaW4oY2VpbChkeEMpLCAke3hXaWR0aCAtIDF9LjApKTtcbiAgICAgICAgICAgIGZsb2F0IGR4Q0xlcnAgPSBkeEMgLSBmbG9hdChsZWZ0RHhDSW5kZXgpO1xuICAgICAgICAgICAgZmxvYXQgaW52ZXJzZUR4Q0xlcnAgPSAxLjAgLSBkeENMZXJwO1xuXG4gICAgICAgICAgICBpZiAociA9PSB0b3BEeFJJbmRleCAmJiBjID09IGxlZnREeENJbmRleCkge1xuICAgICAgICAgICAgICAvLyB0b3BMZWZ0XG4gICAgICAgICAgICAgIGFjY3VtdWxhdG9yICs9XG4gICAgICAgICAgICAgICAgZ2V0RHkoYiwgZHlSLCBkeUMsIGQpICogaW52ZXJzZUR4UkxlcnAgKiBpbnZlcnNlRHhDTGVycDtcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgaWYgKHIgPT0gdG9wRHhSSW5kZXggJiYgYyA9PSByaWdodER4Q0luZGV4KSB7XG4gICAgICAgICAgICAgIC8vIHRvcFJpZ2h0XG4gICAgICAgICAgICAgIGFjY3VtdWxhdG9yICs9IGdldER5KGIsIGR5UiwgZHlDLCBkKSAqIGludmVyc2VEeFJMZXJwICogZHhDTGVycDtcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgaWYgKHIgPT0gYm90dG9tRHhSSW5kZXggJiYgYyA9PSBsZWZ0RHhDSW5kZXgpIHtcbiAgICAgICAgICAgICAgLy8gYm90dG9tTGVmdFxuICAgICAgICAgICAgICBhY2N1bXVsYXRvciArPSBnZXREeShiLCBkeVIsIGR5QywgZCkgKiBkeFJMZXJwICogaW52ZXJzZUR4Q0xlcnA7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIGlmIChyID09IGJvdHRvbUR4UkluZGV4ICYmIGMgPT0gcmlnaHREeENJbmRleCkge1xuICAgICAgICAgICAgICAvLyBib3R0b21SaWdodFxuICAgICAgICAgICAgICBhY2N1bXVsYXRvciArPSBnZXREeShiLCBkeVIsIGR5QywgZCkgKiBkeFJMZXJwICogZHhDTGVycDtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgLy8gRW5kIGxvb3Agb3ZlciBkeVxuXG4gICAgICAgIHNldE91dHB1dChhY2N1bXVsYXRvcik7XG4gICAgICB9XG4gICAgYDtcbiAgfVxufVxuIl19","/**\n * @license\n * Copyright 2020 Google LLC. All Rights Reserved.\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n * =============================================================================\n */\nimport { ResizeBilinearGrad } from '@tensorflow/tfjs-core';\nimport { ResizeBilinearBackpropProgram } from '../resize_bilinear_backprop_gpu';\nexport function resizeBilinearGrad(args) {\n const { inputs, backend, attrs } = args;\n const { images, dy } = inputs;\n const { alignCorners } = attrs;\n const program = new ResizeBilinearBackpropProgram(dy.shape, images.shape, alignCorners);\n return backend.runWebGLProgram(program, [dy], dy.dtype);\n}\nexport const resizeBilinearGradConfig = {\n kernelName: ResizeBilinearGrad,\n backendName: 'webgl',\n kernelFunc: resizeBilinearGrad\n};\n//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiUmVzaXplQmlsaW5lYXJHcmFkLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vLi4vdGZqcy1iYWNrZW5kLXdlYmdsL3NyYy9rZXJuZWxzL1Jlc2l6ZUJpbGluZWFyR3JhZC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQTs7Ozs7Ozs7Ozs7Ozs7O0dBZUc7QUFFSCxPQUFPLEVBQTJCLGtCQUFrQixFQUFnRSxNQUFNLHVCQUF1QixDQUFDO0FBR2xKLE9BQU8sRUFBQyw2QkFBNkIsRUFBQyxNQUFNLGlDQUFpQyxDQUFDO0FBRTlFLE1BQU0sVUFBVSxrQkFBa0IsQ0FBQyxJQUlsQztJQUNDLE1BQU0sRUFBQyxNQUFNLEVBQUUsT0FBTyxFQUFFLEtBQUssRUFBQyxHQUFHLElBQUksQ0FBQztJQUN0QyxNQUFNLEVBQUMsTUFBTSxFQUFFLEVBQUUsRUFBQyxHQUFHLE1BQU0sQ0FBQztJQUM1QixNQUFNLEVBQUMsWUFBWSxFQUFDLEdBQUcsS0FBSyxDQUFDO0lBRTdCLE1BQU0sT0FBTyxHQUFHLElBQUksNkJBQTZCLENBQzdDLEVBQUUsQ0FBQyxLQUF5QyxFQUM1QyxNQUFNLENBQUMsS0FBeUMsRUFBRSxZQUFZLENBQUMsQ0FBQztJQUVwRSxPQUFPLE9BQU8sQ0FBQyxlQUFlLENBQUMsT0FBTyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsRUFBRSxDQUFDLEtBQUssQ0FBQyxDQUFDO0FBQzFELENBQUM7QUFFRCxNQUFNLENBQUMsTUFBTSx3QkFBd0IsR0FBaUI7SUFDcEQsVUFBVSxFQUFFLGtCQUFrQjtJQUM5QixXQUFXLEVBQUUsT0FBTztJQUNwQixVQUFVLEVBQUUsa0JBQXNDO0NBQ25ELENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyIvKipcbiAqIEBsaWNlbnNlXG4gKiBDb3B5cmlnaHQgMjAyMCBHb29nbGUgTExDLiBBbGwgUmlnaHRzIFJlc2VydmVkLlxuICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlIFwiTGljZW5zZVwiKTtcbiAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS5cbiAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdFxuICpcbiAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMFxuICpcbiAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmVcbiAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuIFwiQVMgSVNcIiBCQVNJUyxcbiAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLlxuICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZFxuICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuXG4gKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuICovXG5cbmltcG9ydCB7S2VybmVsQ29uZmlnLCBLZXJuZWxGdW5jLCBSZXNpemVCaWxpbmVhckdyYWQsIFJlc2l6ZUJpbGluZWFyR3JhZEF0dHJzLCBSZXNpemVCaWxpbmVhckdyYWRJbnB1dHMsIFRlbnNvckluZm99IGZyb20gJ0B0ZW5zb3JmbG93L3RmanMtY29yZSc7XG5cbmltcG9ydCB7TWF0aEJhY2tlbmRXZWJHTH0gZnJvbSAnLi4vYmFja2VuZF93ZWJnbCc7XG5pbXBvcnQge1Jlc2l6ZUJpbGluZWFyQmFja3Byb3BQcm9ncmFtfSBmcm9tICcuLi9yZXNpemVfYmlsaW5lYXJfYmFja3Byb3BfZ3B1JztcblxuZXhwb3J0IGZ1bmN0aW9uIHJlc2l6ZUJpbGluZWFyR3JhZChhcmdzOiB7XG4gIGlucHV0czogUmVzaXplQmlsaW5lYXJHcmFkSW5wdXRzLFxuICBiYWNrZW5kOiBNYXRoQmFja2VuZFdlYkdMLFxuICBhdHRyczogUmVzaXplQmlsaW5lYXJHcmFkQXR0cnNcbn0pOiBUZW5zb3JJbmZvIHtcbiAgY29uc3Qge2lucHV0cywgYmFja2VuZCwgYXR0cnN9ID0gYXJncztcbiAgY29uc3Qge2ltYWdlcywgZHl9ID0gaW5wdXRzO1xuICBjb25zdCB7YWxpZ25Db3JuZXJzfSA9IGF0dHJzO1xuXG4gIGNvbnN0IHByb2dyYW0gPSBuZXcgUmVzaXplQmlsaW5lYXJCYWNrcHJvcFByb2dyYW0oXG4gICAgICBkeS5zaGFwZSBhcyBbbnVtYmVyLCBudW1iZXIsIG51bWJlciwgbnVtYmVyXSxcbiAgICAgIGltYWdlcy5zaGFwZSBhcyBbbnVtYmVyLCBudW1iZXIsIG51bWJlciwgbnVtYmVyXSwgYWxpZ25Db3JuZXJzKTtcblxuICByZXR1cm4gYmFja2VuZC5ydW5XZWJHTFByb2dyYW0ocHJvZ3JhbSwgW2R5XSwgZHkuZHR5cGUpO1xufVxuXG5leHBvcnQgY29uc3QgcmVzaXplQmlsaW5lYXJHcmFkQ29uZmlnOiBLZXJuZWxDb25maWcgPSB7XG4gIGtlcm5lbE5hbWU6IFJlc2l6ZUJpbGluZWFyR3JhZCxcbiAgYmFja2VuZE5hbWU6ICd3ZWJnbCcsXG4gIGtlcm5lbEZ1bmM6IHJlc2l6ZUJpbGluZWFyR3JhZCBhcyB7fSBhcyBLZXJuZWxGdW5jXG59O1xuIl19","/**\n * @license\n * Copyright 2018 Google LLC. All Rights Reserved.\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n * =============================================================================\n */\nexport class ResizeNearestNeighborProgram {\n constructor(inputShape, newHeight, newWidth, alignCorners, halfPixelCenters) {\n this.variableNames = ['A'];\n this.outputShape = [];\n const [batch, oldHeight, oldWidth, depth] = inputShape;\n this.outputShape = [batch, newHeight, newWidth, depth];\n const effectiveInSize = [\n (alignCorners && newHeight > 1) ? oldHeight - 1 : oldHeight,\n (alignCorners && newWidth > 1) ? oldWidth - 1 : oldWidth\n ];\n const effectiveOutSize = [\n (alignCorners && newHeight > 1) ? newHeight - 1 : newHeight,\n (alignCorners && newWidth > 1) ? newWidth - 1 : newWidth\n ];\n // When align corners is false, we rounds the value with floor.\n const roundBase = alignCorners ? '0.5' : '0.0';\n let sourceFracIndexRC;\n if (halfPixelCenters) {\n sourceFracIndexRC =\n `max((vec2(yRC) + vec2(0.5)) * effectiveInputOverOutputRatioRC` +\n `, vec2(0.0))`;\n }\n else {\n sourceFracIndexRC = `vec2(yRC) * effectiveInputOverOutputRatioRC`;\n }\n this.userCode = `\n const vec2 effectiveInputOverOutputRatioRC = vec2(\n ${effectiveInSize[0] / effectiveOutSize[0]},\n ${effectiveInSize[1] / effectiveOutSize[1]});\n const vec2 inputShapeRC = vec2(${oldHeight}.0, ${oldWidth}.0);\n\n void main() {\n ivec4 coords = getOutputCoords();\n int b = coords[0];\n int d = coords[3];\n ivec2 yRC = coords.yz;\n\n // Fractional source index.\n vec2 sourceFracIndexRC = ${sourceFracIndexRC};\n\n // Compute the coordinators of nearest neighbor point.\n ivec2 sourceNearestRC = ivec2(\n min(inputShapeRC - 1.0, floor(sourceFracIndexRC + ${roundBase})));\n float newValue = getA(b, sourceNearestRC.x, sourceNearestRC.y, d);\n\n setOutput(newValue);\n }\n `;\n }\n}\n//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicmVzaXplX25lYXJlc3RfbmVpZ2hib3JfZ3B1LmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vdGZqcy1iYWNrZW5kLXdlYmdsL3NyYy9yZXNpemVfbmVhcmVzdF9uZWlnaGJvcl9ncHUudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUE7Ozs7Ozs7Ozs7Ozs7OztHQWVHO0FBSUgsTUFBTSxPQUFPLDRCQUE0QjtJQUt2QyxZQUNJLFVBQTRDLEVBQUUsU0FBaUIsRUFDL0QsUUFBZ0IsRUFBRSxZQUFxQixFQUFFLGdCQUF5QjtRQU50RSxrQkFBYSxHQUFHLENBQUMsR0FBRyxDQUFDLENBQUM7UUFDdEIsZ0JBQVcsR0FBYSxFQUFFLENBQUM7UUFNekIsTUFBTSxDQUFDLEtBQUssRUFBRSxTQUFTLEVBQUUsUUFBUSxFQUFFLEtBQUssQ0FBQyxHQUFHLFVBQVUsQ0FBQztRQUN2RCxJQUFJLENBQUMsV0FBVyxHQUFHLENBQUMsS0FBSyxFQUFFLFNBQVMsRUFBRSxRQUFRLEVBQUUsS0FBSyxDQUFDLENBQUM7UUFFdkQsTUFBTSxlQUFlLEdBQXFCO1lBQ3hDLENBQUMsWUFBWSxJQUFJLFNBQVMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsU0FBUyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsU0FBUztZQUMzRCxDQUFDLFlBQVksSUFBSSxRQUFRLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLFFBQVEsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLFFBQVE7U0FDekQsQ0FBQztRQUVGLE1BQU0sZ0JBQWdCLEdBQXFCO1lBQ3pDLENBQUMsWUFBWSxJQUFJLFNBQVMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsU0FBUyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsU0FBUztZQUMzRCxDQUFDLFlBQVksSUFBSSxRQUFRLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLFFBQVEsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLFFBQVE7U0FDekQsQ0FBQztRQUVGLCtEQUErRDtRQUMvRCxNQUFNLFNBQVMsR0FBRyxZQUFZLENBQUMsQ0FBQyxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUMsS0FBSyxDQUFDO1FBRS9DLElBQUksaUJBQXlCLENBQUM7UUFDOUIsSUFBSSxnQkFBZ0IsRUFBRTtZQUNwQixpQkFBaUI7Z0JBQ2IsK0RBQStEO29CQUMvRCxjQUFjLENBQUM7U0FDcEI7YUFBTTtZQUNMLGlCQUFpQixHQUFHLDZDQUE2QyxDQUFDO1NBQ25FO1FBQ0QsSUFBSSxDQUFDLFFBQVEsR0FBRzs7WUFFUixlQUFlLENBQUMsQ0FBQyxDQUFDLEdBQUcsZ0JBQWdCLENBQUMsQ0FBQyxDQUFDO1lBQ3hDLGVBQWUsQ0FBQyxDQUFDLENBQUMsR0FBRyxnQkFBZ0IsQ0FBQyxDQUFDLENBQUM7dUNBQ2IsU0FBUyxPQUFPLFFBQVE7Ozs7Ozs7OzttQ0FTNUIsaUJBQWlCOzs7OzhEQUlVLFNBQVM7Ozs7O0tBS2xFLENBQUM7SUFDSixDQUFDO0NBQ0YiLCJzb3VyY2VzQ29udGVudCI6WyIvKipcbiAqIEBsaWNlbnNlXG4gKiBDb3B5cmlnaHQgMjAxOCBHb29nbGUgTExDLiBBbGwgUmlnaHRzIFJlc2VydmVkLlxuICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlIFwiTGljZW5zZVwiKTtcbiAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS5cbiAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdFxuICpcbiAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMFxuICpcbiAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmVcbiAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuIFwiQVMgSVNcIiBCQVNJUyxcbiAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLlxuICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZFxuICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuXG4gKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuICovXG5cbmltcG9ydCB7R1BHUFVQcm9ncmFtfSBmcm9tICcuL2dwZ3B1X21hdGgnO1xuXG5leHBvcnQgY2xhc3MgUmVzaXplTmVhcmVzdE5laWdoYm9yUHJvZ3JhbSBpbXBsZW1lbnRzIEdQR1BVUHJvZ3JhbSB7XG4gIHZhcmlhYmxlTmFtZXMgPSBbJ0EnXTtcbiAgb3V0cHV0U2hhcGU6IG51bWJlcltdID0gW107XG4gIHVzZXJDb2RlOiBzdHJpbmc7XG5cbiAgY29uc3RydWN0b3IoXG4gICAgICBpbnB1dFNoYXBlOiBbbnVtYmVyLCBudW1iZXIsIG51bWJlciwgbnVtYmVyXSwgbmV3SGVpZ2h0OiBudW1iZXIsXG4gICAgICBuZXdXaWR0aDogbnVtYmVyLCBhbGlnbkNvcm5lcnM6IGJvb2xlYW4sIGhhbGZQaXhlbENlbnRlcnM6IGJvb2xlYW4pIHtcbiAgICBjb25zdCBbYmF0Y2gsIG9sZEhlaWdodCwgb2xkV2lkdGgsIGRlcHRoXSA9IGlucHV0U2hhcGU7XG4gICAgdGhpcy5vdXRwdXRTaGFwZSA9IFtiYXRjaCwgbmV3SGVpZ2h0LCBuZXdXaWR0aCwgZGVwdGhdO1xuXG4gICAgY29uc3QgZWZmZWN0aXZlSW5TaXplOiBbbnVtYmVyLCBudW1iZXJdID0gW1xuICAgICAgKGFsaWduQ29ybmVycyAmJiBuZXdIZWlnaHQgPiAxKSA/IG9sZEhlaWdodCAtIDEgOiBvbGRIZWlnaHQsXG4gICAgICAoYWxpZ25Db3JuZXJzICYmIG5ld1dpZHRoID4gMSkgPyBvbGRXaWR0aCAtIDEgOiBvbGRXaWR0aFxuICAgIF07XG5cbiAgICBjb25zdCBlZmZlY3RpdmVPdXRTaXplOiBbbnVtYmVyLCBudW1iZXJdID0gW1xuICAgICAgKGFsaWduQ29ybmVycyAmJiBuZXdIZWlnaHQgPiAxKSA/IG5ld0hlaWdodCAtIDEgOiBuZXdIZWlnaHQsXG4gICAgICAoYWxpZ25Db3JuZXJzICYmIG5ld1dpZHRoID4gMSkgPyBuZXdXaWR0aCAtIDEgOiBuZXdXaWR0aFxuICAgIF07XG5cbiAgICAvLyBXaGVuIGFsaWduIGNvcm5lcnMgaXMgZmFsc2UsIHdlIHJvdW5kcyB0aGUgdmFsdWUgd2l0aCBmbG9vci5cbiAgICBjb25zdCByb3VuZEJhc2UgPSBhbGlnbkNvcm5lcnMgPyAnMC41JyA6ICcwLjAnO1xuXG4gICAgbGV0IHNvdXJjZUZyYWNJbmRleFJDOiBzdHJpbmc7XG4gICAgaWYgKGhhbGZQaXhlbENlbnRlcnMpIHtcbiAgICAgIHNvdXJjZUZyYWNJbmRleFJDID1cbiAgICAgICAgICBgbWF4KCh2ZWMyKHlSQykgKyB2ZWMyKDAuNSkpICogZWZmZWN0aXZlSW5wdXRPdmVyT3V0cHV0UmF0aW9SQ2AgK1xuICAgICAgICAgIGAsIHZlYzIoMC4wKSlgO1xuICAgIH0gZWxzZSB7XG4gICAgICBzb3VyY2VGcmFjSW5kZXhSQyA9IGB2ZWMyKHlSQykgKiBlZmZlY3RpdmVJbnB1dE92ZXJPdXRwdXRSYXRpb1JDYDtcbiAgICB9XG4gICAgdGhpcy51c2VyQ29kZSA9IGBcbiAgICAgIGNvbnN0IHZlYzIgZWZmZWN0aXZlSW5wdXRPdmVyT3V0cHV0UmF0aW9SQyA9IHZlYzIoXG4gICAgICAgICAgJHtlZmZlY3RpdmVJblNpemVbMF0gLyBlZmZlY3RpdmVPdXRTaXplWzBdfSxcbiAgICAgICAgICAke2VmZmVjdGl2ZUluU2l6ZVsxXSAvIGVmZmVjdGl2ZU91dFNpemVbMV19KTtcbiAgICAgIGNvbnN0IHZlYzIgaW5wdXRTaGFwZVJDID0gdmVjMigke29sZEhlaWdodH0uMCwgJHtvbGRXaWR0aH0uMCk7XG5cbiAgICAgIHZvaWQgbWFpbigpIHtcbiAgICAgICAgaXZlYzQgY29vcmRzID0gZ2V0T3V0cHV0Q29vcmRzKCk7XG4gICAgICAgIGludCBiID0gY29vcmRzWzBdO1xuICAgICAgICBpbnQgZCA9IGNvb3Jkc1szXTtcbiAgICAgICAgaXZlYzIgeVJDID0gY29vcmRzLnl6O1xuXG4gICAgICAgIC8vIEZyYWN0aW9uYWwgc291cmNlIGluZGV4LlxuICAgICAgICB2ZWMyIHNvdXJjZUZyYWNJbmRleFJDID0gJHtzb3VyY2VGcmFjSW5kZXhSQ307XG5cbiAgICAgICAgLy8gQ29tcHV0ZSB0aGUgY29vcmRpbmF0b3JzIG9mIG5lYXJlc3QgbmVpZ2hib3IgcG9pbnQuXG4gICAgICAgIGl2ZWMyIHNvdXJjZU5lYXJlc3RSQyA9IGl2ZWMyKFxuICAgICAgICAgIG1pbihpbnB1dFNoYXBlUkMgLSAxLjAsIGZsb29yKHNvdXJjZUZyYWNJbmRleFJDICsgJHtyb3VuZEJhc2V9KSkpO1xuICAgICAgICBmbG9hdCBuZXdWYWx1ZSA9IGdldEEoYiwgc291cmNlTmVhcmVzdFJDLngsIHNvdXJjZU5lYXJlc3RSQy55LCBkKTtcblxuICAgICAgICBzZXRPdXRwdXQobmV3VmFsdWUpO1xuICAgICAgfVxuICAgIGA7XG4gIH1cbn1cbiJdfQ==","/**\n * @license\n * Copyright 2019 Google LLC. All Rights Reserved.\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n * =============================================================================\n */\nexport class ResizeNearestNeighborPackedProgram {\n constructor(inputShape, newHeight, newWidth, alignCorners, halfPixelCenters) {\n this.variableNames = ['A'];\n this.packedInputs = true;\n this.packedOutput = true;\n this.outputShape = [];\n const [batch, oldHeight, oldWidth, depth] = inputShape;\n this.outputShape = [batch, newHeight, newWidth, depth];\n const effectiveInSize = [\n (alignCorners && newHeight > 1) ? oldHeight - 1 : oldHeight,\n (alignCorners && newWidth > 1) ? oldWidth - 1 : oldWidth\n ];\n const effectiveOutSize = [\n (alignCorners && newHeight > 1) ? newHeight - 1 : newHeight,\n (alignCorners && newWidth > 1) ? newWidth - 1 : newWidth\n ];\n // When align corners is false, we rounds the value with floor.\n const roundBase = alignCorners ? '0.5' : '0.0';\n let sourceFracIndexRC;\n if (halfPixelCenters) {\n sourceFracIndexRC = `max((vec3(yRC) + vec3(0.5)) * ` +\n `effectiveInputOverOutputRatioRC, vec3(0.0))`;\n }\n else {\n sourceFracIndexRC = `vec3(yRC) * effectiveInputOverOutputRatioRC`;\n }\n this.userCode = `\n const vec3 effectiveInputOverOutputRatioRC = vec3(\n ${effectiveInSize[0] / effectiveOutSize[0]},\n ${effectiveInSize[1] / effectiveOutSize[1]},\n ${effectiveInSize[1] / effectiveOutSize[1]});\n const vec3 inputShapeRC = vec3(${oldHeight}.0, ${oldWidth}.0,\n ${oldWidth}.0);\n\n float getAValue(int b, int r, int c, int d) {\n return getChannel(getA(b, r, c, d), vec2(c, d));\n }\n\n void main() {\n ivec4 coords = getOutputCoords();\n int b = coords[0];\n int d = coords[3];\n // Calculate values for next column in yRC.z.\n ivec3 yRC = coords.yzz + ivec3(0, 0, 1);\n\n // Fractional source index.\n vec3 sourceFracIndexRC = ${sourceFracIndexRC};\n\n // Compute the coordinators of nearest neighbor point.\n ivec3 sourceNearestRC = ivec3(\n min(inputShapeRC - 1.0, floor(sourceFracIndexRC + ${roundBase})));\n\n // Should we calculate next column and row elements in 2x2 packed cell.\n bool hasNextCol = d < ${depth - 1};\n bool hasNextRow = coords.z < ${newWidth - 1};\n\n vec4 newValue = vec4(\n getAValue(b, sourceNearestRC.x, sourceNearestRC.y, d),\n hasNextCol ? getAValue(b, sourceNearestRC.x, sourceNearestRC.y, d + 1)\n : 0.0,\n hasNextRow ? getAValue(b, sourceNearestRC.x, sourceNearestRC.z, d)\n : 0.0,\n (hasNextRow && hasNextCol) ?\n getAValue(b, sourceNearestRC.x, sourceNearestRC.z, d + 1) : 0.0);\n\n setOutput(newValue);\n }\n `;\n }\n}\n//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicmVzaXplX25lYXJlc3RfbmVpZ2hib3JfcGFja2VkX2dwdS5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uL3RmanMtYmFja2VuZC13ZWJnbC9zcmMvcmVzaXplX25lYXJlc3RfbmVpZ2hib3JfcGFja2VkX2dwdS50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQTs7Ozs7Ozs7Ozs7Ozs7O0dBZUc7QUFJSCxNQUFNLE9BQU8sa0NBQWtDO0lBTzdDLFlBQ0ksVUFBNEMsRUFBRSxTQUFpQixFQUMvRCxRQUFnQixFQUFFLFlBQXFCLEVBQUUsZ0JBQXlCO1FBUnRFLGtCQUFhLEdBQUcsQ0FBQyxHQUFHLENBQUMsQ0FBQztRQUN0QixpQkFBWSxHQUFHLElBQUksQ0FBQztRQUNwQixpQkFBWSxHQUFHLElBQUksQ0FBQztRQUNwQixnQkFBVyxHQUFhLEVBQUUsQ0FBQztRQU16QixNQUFNLENBQUMsS0FBSyxFQUFFLFNBQVMsRUFBRSxRQUFRLEVBQUUsS0FBSyxDQUFDLEdBQUcsVUFBVSxDQUFDO1FBQ3ZELElBQUksQ0FBQyxXQUFXLEdBQUcsQ0FBQyxLQUFLLEVBQUUsU0FBUyxFQUFFLFFBQVEsRUFBRSxLQUFLLENBQUMsQ0FBQztRQUV2RCxNQUFNLGVBQWUsR0FBcUI7WUFDeEMsQ0FBQyxZQUFZLElBQUksU0FBUyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxTQUFTLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxTQUFTO1lBQzNELENBQUMsWUFBWSxJQUFJLFFBQVEsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsUUFBUSxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsUUFBUTtTQUN6RCxDQUFDO1FBRUYsTUFBTSxnQkFBZ0IsR0FBcUI7WUFDekMsQ0FBQyxZQUFZLElBQUksU0FBUyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxTQUFTLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxTQUFTO1lBQzNELENBQUMsWUFBWSxJQUFJLFFBQVEsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsUUFBUSxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsUUFBUTtTQUN6RCxDQUFDO1FBRUYsK0RBQStEO1FBQy9ELE1BQU0sU0FBUyxHQUFHLFlBQVksQ0FBQyxDQUFDLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQyxLQUFLLENBQUM7UUFDL0MsSUFBSSxpQkFBeUIsQ0FBQztRQUM5QixJQUFJLGdCQUFnQixFQUFFO1lBQ3BCLGlCQUFpQixHQUFHLGdDQUFnQztnQkFDaEQsNkNBQTZDLENBQUM7U0FDbkQ7YUFBTTtZQUNMLGlCQUFpQixHQUFHLDZDQUE2QyxDQUFDO1NBQ25FO1FBRUQsSUFBSSxDQUFDLFFBQVEsR0FBRzs7WUFFUixlQUFlLENBQUMsQ0FBQyxDQUFDLEdBQUcsZ0JBQWdCLENBQUMsQ0FBQyxDQUFDO1lBQ3hDLGVBQWUsQ0FBQyxDQUFDLENBQUMsR0FBRyxnQkFBZ0IsQ0FBQyxDQUFDLENBQUM7WUFDeEMsZUFBZSxDQUFDLENBQUMsQ0FBQyxHQUFHLGdCQUFnQixDQUFDLENBQUMsQ0FBQzt1Q0FDYixTQUFTLE9BQU8sUUFBUTt1Q0FDeEIsUUFBUTs7Ozs7Ozs7Ozs7Ozs7bUNBY1osaUJBQWlCOzs7OzhEQUlVLFNBQVM7OztnQ0FHdkMsS0FBSyxHQUFHLENBQUM7dUNBQ0YsUUFBUSxHQUFHLENBQUM7Ozs7Ozs7Ozs7Ozs7S0FhOUMsQ0FBQztJQUNKLENBQUM7Q0FDRiIsInNvdXJjZXNDb250ZW50IjpbIi8qKlxuICogQGxpY2Vuc2VcbiAqIENvcHlyaWdodCAyMDE5IEdvb2dsZSBMTEMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuXG4gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgXCJMaWNlbnNlXCIpO1xuICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLlxuICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0XG4gKlxuICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wXG4gKlxuICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZVxuICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gXCJBUyBJU1wiIEJBU0lTLFxuICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuXG4gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kXG4gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS5cbiAqID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4gKi9cblxuaW1wb3J0IHtHUEdQVVByb2dyYW19IGZyb20gJy4vZ3BncHVfbWF0aCc7XG5cbmV4cG9ydCBjbGFzcyBSZXNpemVOZWFyZXN0TmVpZ2hib3JQYWNrZWRQcm9ncmFtIGltcGxlbWVudHMgR1BHUFVQcm9ncmFtIHtcbiAgdmFyaWFibGVOYW1lcyA9IFsnQSddO1xuICBwYWNrZWRJbnB1dHMgPSB0cnVlO1xuICBwYWNrZWRPdXRwdXQgPSB0cnVlO1xuICBvdXRwdXRTaGFwZTogbnVtYmVyW10gPSBbXTtcbiAgdXNlckNvZGU6IHN0cmluZztcblxuICBjb25zdHJ1Y3RvcihcbiAgICAgIGlucHV0U2hhcGU6IFtudW1iZXIsIG51bWJlciwgbnVtYmVyLCBudW1iZXJdLCBuZXdIZWlnaHQ6IG51bWJlcixcbiAgICAgIG5ld1dpZHRoOiBudW1iZXIsIGFsaWduQ29ybmVyczogYm9vbGVhbiwgaGFsZlBpeGVsQ2VudGVyczogYm9vbGVhbikge1xuICAgIGNvbnN0IFtiYXRjaCwgb2xkSGVpZ2h0LCBvbGRXaWR0aCwgZGVwdGhdID0gaW5wdXRTaGFwZTtcbiAgICB0aGlzLm91dHB1dFNoYXBlID0gW2JhdGNoLCBuZXdIZWlnaHQsIG5ld1dpZHRoLCBkZXB0aF07XG5cbiAgICBjb25zdCBlZmZlY3RpdmVJblNpemU6IFtudW1iZXIsIG51bWJlcl0gPSBbXG4gICAgICAoYWxpZ25Db3JuZXJzICYmIG5ld0hlaWdodCA+IDEpID8gb2xkSGVpZ2h0IC0gMSA6IG9sZEhlaWdodCxcbiAgICAgIChhbGlnbkNvcm5lcnMgJiYgbmV3V2lkdGggPiAxKSA/IG9sZFdpZHRoIC0gMSA6IG9sZFdpZHRoXG4gICAgXTtcblxuICAgIGNvbnN0IGVmZmVjdGl2ZU91dFNpemU6IFtudW1iZXIsIG51bWJlcl0gPSBbXG4gICAgICAoYWxpZ25Db3JuZXJzICYmIG5ld0hlaWdodCA+IDEpID8gbmV3SGVpZ2h0IC0gMSA6IG5ld0hlaWdodCxcbiAgICAgIChhbGlnbkNvcm5lcnMgJiYgbmV3V2lkdGggPiAxKSA/IG5ld1dpZHRoIC0gMSA6IG5ld1dpZHRoXG4gICAgXTtcblxuICAgIC8vIFdoZW4gYWxpZ24gY29ybmVycyBpcyBmYWxzZSwgd2Ugcm91bmRzIHRoZSB2YWx1ZSB3aXRoIGZsb29yLlxuICAgIGNvbnN0IHJvdW5kQmFzZSA9IGFsaWduQ29ybmVycyA/ICcwLjUnIDogJzAuMCc7XG4gICAgbGV0IHNvdXJjZUZyYWNJbmRleFJDOiBzdHJpbmc7XG4gICAgaWYgKGhhbGZQaXhlbENlbnRlcnMpIHtcbiAgICAgIHNvdXJjZUZyYWNJbmRleFJDID0gYG1heCgodmVjMyh5UkMpICsgdmVjMygwLjUpKSAqIGAgK1xuICAgICAgICAgIGBlZmZlY3RpdmVJbnB1dE92ZXJPdXRwdXRSYXRpb1JDLCB2ZWMzKDAuMCkpYDtcbiAgICB9IGVsc2Uge1xuICAgICAgc291cmNlRnJhY0luZGV4UkMgPSBgdmVjMyh5UkMpICogZWZmZWN0aXZlSW5wdXRPdmVyT3V0cHV0UmF0aW9SQ2A7XG4gICAgfVxuXG4gICAgdGhpcy51c2VyQ29kZSA9IGBcbiAgICAgIGNvbnN0IHZlYzMgZWZmZWN0aXZlSW5wdXRPdmVyT3V0cHV0UmF0aW9SQyA9IHZlYzMoXG4gICAgICAgICAgJHtlZmZlY3RpdmVJblNpemVbMF0gLyBlZmZlY3RpdmVPdXRTaXplWzBdfSxcbiAgICAgICAgICAke2VmZmVjdGl2ZUluU2l6ZVsxXSAvIGVmZmVjdGl2ZU91dFNpemVbMV19LFxuICAgICAgICAgICR7ZWZmZWN0aXZlSW5TaXplWzFdIC8gZWZmZWN0aXZlT3V0U2l6ZVsxXX0pO1xuICAgICAgY29uc3QgdmVjMyBpbnB1dFNoYXBlUkMgPSB2ZWMzKCR7b2xkSGVpZ2h0fS4wLCAke29sZFdpZHRofS4wLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICR7b2xkV2lkdGh9LjApO1xuXG4gICAgICBmbG9hdCBnZXRBVmFsdWUoaW50IGIsIGludCByLCBpbnQgYywgaW50IGQpIHtcbiAgICAgICAgcmV0dXJuIGdldENoYW5uZWwoZ2V0QShiLCByLCBjLCBkKSwgdmVjMihjLCBkKSk7XG4gICAgICB9XG5cbiAgICAgIHZvaWQgbWFpbigpIHtcbiAgICAgICAgaXZlYzQgY29vcmRzID0gZ2V0T3V0cHV0Q29vcmRzKCk7XG4gICAgICAgIGludCBiID0gY29vcmRzWzBdO1xuICAgICAgICBpbnQgZCA9IGNvb3Jkc1szXTtcbiAgICAgICAgLy8gQ2FsY3VsYXRlIHZhbHVlcyBmb3IgbmV4dCBjb2x1bW4gaW4geVJDLnouXG4gICAgICAgIGl2ZWMzIHlSQyA9IGNvb3Jkcy55enogKyBpdmVjMygwLCAwLCAxKTtcblxuICAgICAgICAvLyBGcmFjdGlvbmFsIHNvdXJjZSBpbmRleC5cbiAgICAgICAgdmVjMyBzb3VyY2VGcmFjSW5kZXhSQyA9ICR7c291cmNlRnJhY0luZGV4UkN9O1xuXG4gICAgICAgIC8vIENvbXB1dGUgdGhlIGNvb3JkaW5hdG9ycyBvZiBuZWFyZXN0IG5laWdoYm9yIHBvaW50LlxuICAgICAgICBpdmVjMyBzb3VyY2VOZWFyZXN0UkMgPSBpdmVjMyhcbiAgICAgICAgICBtaW4oaW5wdXRTaGFwZVJDIC0gMS4wLCBmbG9vcihzb3VyY2VGcmFjSW5kZXhSQyArICR7cm91bmRCYXNlfSkpKTtcblxuICAgICAgICAvLyBTaG91bGQgd2UgY2FsY3VsYXRlIG5leHQgY29sdW1uIGFuZCByb3cgZWxlbWVudHMgaW4gMngyIHBhY2tlZCBjZWxsLlxuICAgICAgICBib29sIGhhc05leHRDb2wgPSBkIDwgJHtkZXB0aCAtIDF9O1xuICAgICAgICBib29sIGhhc05leHRSb3cgPSBjb29yZHMueiA8ICR7bmV3V2lkdGggLSAxfTtcblxuICAgICAgICB2ZWM0IG5ld1ZhbHVlID0gdmVjNChcbiAgICAgICAgICBnZXRBVmFsdWUoYiwgc291cmNlTmVhcmVzdFJDLngsIHNvdXJjZU5lYXJlc3RSQy55LCBkKSxcbiAgICAgICAgICBoYXNOZXh0Q29sID8gZ2V0QVZhbHVlKGIsIHNvdXJjZU5lYXJlc3RSQy54LCBzb3VyY2VOZWFyZXN0UkMueSwgZCArIDEpXG4gICAgICAgICAgICAgICAgICAgICA6IDAuMCxcbiAgICAgICAgICBoYXNOZXh0Um93ID8gZ2V0QVZhbHVlKGIsIHNvdXJjZU5lYXJlc3RSQy54LCBzb3VyY2VOZWFyZXN0UkMueiwgZClcbiAgICAgICAgICAgICAgICAgICAgIDogMC4wLFxuICAgICAgICAgIChoYXNOZXh0Um93ICYmIGhhc05leHRDb2wpID9cbiAgICAgICAgICAgIGdldEFWYWx1ZShiLCBzb3VyY2VOZWFyZXN0UkMueCwgc291cmNlTmVhcmVzdFJDLnosIGQgKyAxKSA6IDAuMCk7XG5cbiAgICAgICAgc2V0T3V0cHV0KG5ld1ZhbHVlKTtcbiAgICAgIH1cbiAgICBgO1xuICB9XG59XG4iXX0=","/**\n * @license\n * Copyright 2020 Google LLC. All Rights Reserved.\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n * =============================================================================\n */\nimport { env, ResizeNearestNeighbor } from '@tensorflow/tfjs-core';\nimport { ResizeNearestNeighborProgram } from '../resize_nearest_neighbor_gpu';\nimport { ResizeNearestNeighborPackedProgram } from '../resize_nearest_neighbor_packed_gpu';\nexport function resizeNearestNeighbor(args) {\n const { inputs, backend, attrs } = args;\n const { images } = inputs;\n const { alignCorners, halfPixelCenters, size } = attrs;\n const [newHeight, newWidth] = size;\n const program = env().getBool('WEBGL_PACK_IMAGE_OPERATIONS') ?\n new ResizeNearestNeighborPackedProgram(images.shape, newHeight, newWidth, alignCorners, halfPixelCenters) :\n new ResizeNearestNeighborProgram(images.shape, newHeight, newWidth, alignCorners, halfPixelCenters);\n return backend.runWebGLProgram(program, [images], images.dtype);\n}\nexport const resizeNearestNeighborConfig = {\n kernelName: ResizeNearestNeighbor,\n backendName: 'webgl',\n kernelFunc: resizeNearestNeighbor\n};\n//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiUmVzaXplTmVhcmVzdE5laWdoYm9yLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vLi4vdGZqcy1iYWNrZW5kLXdlYmdsL3NyYy9rZXJuZWxzL1Jlc2l6ZU5lYXJlc3ROZWlnaGJvci50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQTs7Ozs7Ozs7Ozs7Ozs7O0dBZUc7QUFFSCxPQUFPLEVBQUMsR0FBRyxFQUE0QixxQkFBcUIsRUFBc0UsTUFBTSx1QkFBdUIsQ0FBQztBQUdoSyxPQUFPLEVBQUMsNEJBQTRCLEVBQUMsTUFBTSxnQ0FBZ0MsQ0FBQztBQUM1RSxPQUFPLEVBQUMsa0NBQWtDLEVBQUMsTUFBTSx1Q0FBdUMsQ0FBQztBQUV6RixNQUFNLFVBQVUscUJBQXFCLENBQUMsSUFJckM7SUFDQyxNQUFNLEVBQUMsTUFBTSxFQUFFLE9BQU8sRUFBRSxLQUFLLEVBQUMsR0FBRyxJQUFJLENBQUM7SUFDdEMsTUFBTSxFQUFDLE1BQU0sRUFBQyxHQUFHLE1BQU0sQ0FBQztJQUN4QixNQUFNLEVBQUMsWUFBWSxFQUFFLGdCQUFnQixFQUFFLElBQUksRUFBQyxHQUFHLEtBQUssQ0FBQztJQUVyRCxNQUFNLENBQUMsU0FBUyxFQUFFLFFBQVEsQ0FBQyxHQUFHLElBQUksQ0FBQztJQUVuQyxNQUFNLE9BQU8sR0FBRyxHQUFHLEVBQUUsQ0FBQyxPQUFPLENBQUMsNkJBQTZCLENBQUMsQ0FBQyxDQUFDO1FBQzFELElBQUksa0NBQWtDLENBQ2xDLE1BQU0sQ0FBQyxLQUF5QyxFQUFFLFNBQVMsRUFBRSxRQUFRLEVBQ3JFLFlBQVksRUFBRSxnQkFBZ0IsQ0FBQyxDQUFDLENBQUM7UUFDckMsSUFBSSw0QkFBNEIsQ0FDNUIsTUFBTSxDQUFDLEtBQXlDLEVBQUUsU0FBUyxFQUFFLFFBQVEsRUFDckUsWUFBWSxFQUFFLGdCQUFnQixDQUFDLENBQUM7SUFDeEMsT0FBTyxPQUFPLENBQUMsZUFBZSxDQUFDLE9BQU8sRUFBRSxDQUFDLE1BQU0sQ0FBQyxFQUFFLE1BQU0sQ0FBQyxLQUFLLENBQUMsQ0FBQztBQUNsRSxDQUFDO0FBRUQsTUFBTSxDQUFDLE1BQU0sMkJBQTJCLEdBQWlCO0lBQ3ZELFVBQVUsRUFBRSxxQkFBcUI7SUFDakMsV0FBVyxFQUFFLE9BQU87SUFDcEIsVUFBVSxFQUFFLHFCQUF5QztDQUN0RCxDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiLyoqXG4gKiBAbGljZW5zZVxuICogQ29weXJpZ2h0IDIwMjAgR29vZ2xlIExMQy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC5cbiAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSBcIkxpY2Vuc2VcIik7XG4gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuXG4gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXRcbiAqXG4gKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjBcbiAqXG4gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlXG4gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiBcIkFTIElTXCIgQkFTSVMsXG4gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC5cbiAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmRcbiAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLlxuICogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbiAqL1xuXG5pbXBvcnQge2VudiwgS2VybmVsQ29uZmlnLCBLZXJuZWxGdW5jLCBSZXNpemVOZWFyZXN0TmVpZ2hib3IsIFJlc2l6ZU5lYXJlc3ROZWlnaGJvckF0dHJzLCBSZXNpemVOZWFyZXN0TmVpZ2hib3JJbnB1dHMsIFRlbnNvckluZm99IGZyb20gJ0B0ZW5zb3JmbG93L3RmanMtY29yZSc7XG5cbmltcG9ydCB7TWF0aEJhY2tlbmRXZWJHTH0gZnJvbSAnLi4vYmFja2VuZF93ZWJnbCc7XG5pbXBvcnQge1Jlc2l6ZU5lYXJlc3ROZWlnaGJvclByb2dyYW19IGZyb20gJy4uL3Jlc2l6ZV9uZWFyZXN0X25laWdoYm9yX2dwdSc7XG5pbXBvcnQge1Jlc2l6ZU5lYXJlc3ROZWlnaGJvclBhY2tlZFByb2dyYW19IGZyb20gJy4uL3Jlc2l6ZV9uZWFyZXN0X25laWdoYm9yX3BhY2tlZF9ncHUnO1xuXG5leHBvcnQgZnVuY3Rpb24gcmVzaXplTmVhcmVzdE5laWdoYm9yKGFyZ3M6IHtcbiAgaW5wdXRzOiBSZXNpemVOZWFyZXN0TmVpZ2hib3JJbnB1dHMsXG4gIGJhY2tlbmQ6IE1hdGhCYWNrZW5kV2ViR0wsXG4gIGF0dHJzOiBSZXNpemVOZWFyZXN0TmVpZ2hib3JBdHRyc1xufSk6IFRlbnNvckluZm8ge1xuICBjb25zdCB7aW5wdXRzLCBiYWNrZW5kLCBhdHRyc30gPSBhcmdzO1xuICBjb25zdCB7aW1hZ2VzfSA9IGlucHV0cztcbiAgY29uc3Qge2FsaWduQ29ybmVycywgaGFsZlBpeGVsQ2VudGVycywgc2l6ZX0gPSBhdHRycztcblxuICBjb25zdCBbbmV3SGVpZ2h0LCBuZXdXaWR0aF0gPSBzaXplO1xuXG4gIGNvbnN0IHByb2dyYW0gPSBlbnYoKS5nZXRCb29sKCdXRUJHTF9QQUNLX0lNQUdFX09QRVJBVElPTlMnKSA/XG4gICAgICBuZXcgUmVzaXplTmVhcmVzdE5laWdoYm9yUGFja2VkUHJvZ3JhbShcbiAgICAgICAgICBpbWFnZXMuc2hhcGUgYXMgW251bWJlciwgbnVtYmVyLCBudW1iZXIsIG51bWJlcl0sIG5ld0hlaWdodCwgbmV3V2lkdGgsXG4gICAgICAgICAgYWxpZ25Db3JuZXJzLCBoYWxmUGl4ZWxDZW50ZXJzKSA6XG4gICAgICBuZXcgUmVzaXplTmVhcmVzdE5laWdoYm9yUHJvZ3JhbShcbiAgICAgICAgICBpbWFnZXMuc2hhcGUgYXMgW251bWJlciwgbnVtYmVyLCBudW1iZXIsIG51bWJlcl0sIG5ld0hlaWdodCwgbmV3V2lkdGgsXG4gICAgICAgICAgYWxpZ25Db3JuZXJzLCBoYWxmUGl4ZWxDZW50ZXJzKTtcbiAgcmV0dXJuIGJhY2tlbmQucnVuV2ViR0xQcm9ncmFtKHByb2dyYW0sIFtpbWFnZXNdLCBpbWFnZXMuZHR5cGUpO1xufVxuXG5leHBvcnQgY29uc3QgcmVzaXplTmVhcmVzdE5laWdoYm9yQ29uZmlnOiBLZXJuZWxDb25maWcgPSB7XG4gIGtlcm5lbE5hbWU6IFJlc2l6ZU5lYXJlc3ROZWlnaGJvcixcbiAgYmFja2VuZE5hbWU6ICd3ZWJnbCcsXG4gIGtlcm5lbEZ1bmM6IHJlc2l6ZU5lYXJlc3ROZWlnaGJvciBhcyB7fSBhcyBLZXJuZWxGdW5jXG59O1xuIl19","/**\n * @license\n * Copyright 2018 Google LLC. All Rights Reserved.\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n * =============================================================================\n */\nexport class ResizeNearestNeigborBackpropProgram {\n constructor(dyShape, inputShape, alignCorners) {\n this.variableNames = ['dy'];\n this.outputShape = [];\n this.outputShape = inputShape;\n const [, xHeight, xWidth,] = inputShape;\n const [, yHeight, yWidth] = dyShape;\n // In the backwards pass, we want to find the pixels that were generated for\n // each pixel in the input image the forward pass and add the corresponding\n // coefficient from dy to the gradient (with some interpolation).\n const effectiveXSize = [\n (alignCorners && yHeight > 1) ? xHeight - 1 : xHeight,\n (alignCorners && yWidth > 1) ? xWidth - 1 : xWidth\n ];\n const effectiveYSize = [\n (alignCorners && yHeight > 1) ? yHeight - 1 : yHeight,\n (alignCorners && yWidth > 1) ? yWidth - 1 : yWidth\n ];\n const heightScale = effectiveXSize[0] / effectiveYSize[0];\n const widthScale = effectiveXSize[1] / effectiveYSize[1];\n const invHeightScale = 1 / heightScale;\n const invWidthScale = 1 / widthScale;\n // This defines the size of the window of values around a particular\n // index in dy that we want to search for contributions to dx.\n const winHeight = (Math.ceil(invHeightScale) * 2) + 2;\n const winWidth = (Math.ceil(invWidthScale) * 2) + 2;\n this.userCode = `\n void main() {\n ivec4 coords = getOutputCoords();\n int b = coords[0];\n int d = coords[3];\n int r = coords[1];\n int c = coords[2];\n\n float accumulator = 0.0;\n\n const float heightScale = float(${heightScale});\n const float widthScale = float(${widthScale});\n\n const float invHeightScale = float(${invHeightScale});\n const float invWidthScale = float(${invWidthScale});\n\n const int winHeight = int(${winHeight});\n const int winWidth = int(${winWidth});\n\n // Compute bounds for where in dy we will look\n float startRLerp = floor(float(r) * invHeightScale);\n int startDyR = int(floor(startRLerp - float(winHeight / 2)));\n\n float startCLerp = floor(float(c) * invWidthScale);\n int startDyC = int(floor(startCLerp - float(winWidth / 2)));\n\n // Loop over dy\n for (int dyROffset = 0; dyROffset < winHeight; dyROffset++) {\n int dyR = dyROffset + startDyR;\n\n // Guard against the window exceeding the bounds of dy\n if (dyR < 0 || dyR >= ${yHeight}) {\n continue;\n }\n\n for (int dyCOffset = 0; dyCOffset < winWidth; dyCOffset++) {\n int dyC = dyCOffset + startDyC;\n\n // Guard against the window exceeding the bounds of dy\n if (dyC < 0 || dyC >= ${yWidth}) {\n continue;\n }\n\n float sourceFracRow =\n float(${effectiveXSize[0]}) *\n (float(dyR) / float(${effectiveYSize[0]}));\n\n float sourceFracCol =\n float(${effectiveXSize[1]}) *\n (float(dyC) / float(${effectiveYSize[1]}));\n\n int sourceNearestRow = int(min(\n float(int(${xHeight}) - 1),\n ${alignCorners} ? float(round(sourceFracRow)) :\n float(floor(sourceFracRow))));\n\n int sourceNearestCol = int(min(\n float(int(${xWidth}) - 1),\n ${alignCorners} ? float(round(sourceFracCol)) :\n float(floor(sourceFracCol))));\n\n if (r == sourceNearestRow && c == sourceNearestCol) {\n accumulator += getDy(b, dyR, dyC, d);\n }\n }\n }\n // End loop over dy\n\n setOutput(accumulator);\n }\n `;\n }\n}\n//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicmVzaXplX25lYXJlc3RfbmVpZ2hib3JfYmFja3Byb3BfZ3B1LmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vdGZqcy1iYWNrZW5kLXdlYmdsL3NyYy9yZXNpemVfbmVhcmVzdF9uZWlnaGJvcl9iYWNrcHJvcF9ncHUudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUE7Ozs7Ozs7Ozs7Ozs7OztHQWVHO0FBSUgsTUFBTSxPQUFPLG1DQUFtQztJQUs5QyxZQUNJLE9BQXlDLEVBQ3pDLFVBQTRDLEVBQUUsWUFBcUI7UUFOdkUsa0JBQWEsR0FBRyxDQUFDLElBQUksQ0FBQyxDQUFDO1FBQ3ZCLGdCQUFXLEdBQWEsRUFBRSxDQUFDO1FBTXpCLElBQUksQ0FBQyxXQUFXLEdBQUcsVUFBVSxDQUFDO1FBQzlCLE1BQU0sQ0FBQyxFQUFFLE9BQU8sRUFBRSxNQUFNLEVBQUcsR0FBRyxVQUFVLENBQUM7UUFDekMsTUFBTSxDQUFDLEVBQUUsT0FBTyxFQUFFLE1BQU0sQ0FBQyxHQUFHLE9BQU8sQ0FBQztRQUVwQyw0RUFBNEU7UUFDNUUsMkVBQTJFO1FBQzNFLGlFQUFpRTtRQUVqRSxNQUFNLGNBQWMsR0FBcUI7WUFDdkMsQ0FBQyxZQUFZLElBQUksT0FBTyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxPQUFPLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxPQUFPO1lBQ3JELENBQUMsWUFBWSxJQUFJLE1BQU0sR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsTUFBTSxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsTUFBTTtTQUNuRCxDQUFDO1FBRUYsTUFBTSxjQUFjLEdBQXFCO1lBQ3ZDLENBQUMsWUFBWSxJQUFJLE9BQU8sR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsT0FBTyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsT0FBTztZQUNyRCxDQUFDLFlBQVksSUFBSSxNQUFNLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLE1BQU0sR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLE1BQU07U0FDbkQsQ0FBQztRQUVGLE1BQU0sV0FBVyxHQUFHLGNBQWMsQ0FBQyxDQUFDLENBQUMsR0FBRyxjQUFjLENBQUMsQ0FBQyxDQUFDLENBQUM7UUFDMUQsTUFBTSxVQUFVLEdBQUcsY0FBYyxDQUFDLENBQUMsQ0FBQyxHQUFHLGNBQWMsQ0FBQyxDQUFDLENBQUMsQ0FBQztRQUV6RCxNQUFNLGNBQWMsR0FBRyxDQUFDLEdBQUcsV0FBVyxDQUFDO1FBQ3ZDLE1BQU0sYUFBYSxHQUFHLENBQUMsR0FBRyxVQUFVLENBQUM7UUFFckMsb0VBQW9FO1FBQ3BFLDhEQUE4RDtRQUM5RCxNQUFNLFNBQVMsR0FBRyxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsY0FBYyxDQUFDLEdBQUcsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDO1FBQ3RELE1BQU0sUUFBUSxHQUFHLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxhQUFhLENBQUMsR0FBRyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUM7UUFFcEQsSUFBSSxDQUFDLFFBQVEsR0FBRzs7Ozs7Ozs7OzswQ0FVc0IsV0FBVzt5Q0FDWixVQUFVOzs2Q0FFTixjQUFjOzRDQUNmLGFBQWE7O29DQUVyQixTQUFTO21DQUNWLFFBQVE7Ozs7Ozs7Ozs7Ozs7O2tDQWNULE9BQU87Ozs7Ozs7O29DQVFMLE1BQU07Ozs7O3NCQUtwQixjQUFjLENBQUMsQ0FBQyxDQUFDO3NDQUNELGNBQWMsQ0FBQyxDQUFDLENBQUM7Ozt3QkFHL0IsY0FBYyxDQUFDLENBQUMsQ0FBQzt3Q0FDRCxjQUFjLENBQUMsQ0FBQyxDQUFDOzs7NEJBRzdCLE9BQU87a0JBQ2pCLFlBQVk7Ozs7NEJBSUYsTUFBTTtrQkFDaEIsWUFBWTs7Ozs7Ozs7Ozs7O0tBWXpCLENBQUM7SUFDSixDQUFDO0NBQ0YiLCJzb3VyY2VzQ29udGVudCI6WyIvKipcbiAqIEBsaWNlbnNlXG4gKiBDb3B5cmlnaHQgMjAxOCBHb29nbGUgTExDLiBBbGwgUmlnaHRzIFJlc2VydmVkLlxuICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlIFwiTGljZW5zZVwiKTtcbiAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS5cbiAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdFxuICpcbiAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMFxuICpcbiAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmVcbiAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuIFwiQVMgSVNcIiBCQVNJUyxcbiAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLlxuICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZFxuICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuXG4gKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuICovXG5cbmltcG9ydCB7R1BHUFVQcm9ncmFtfSBmcm9tICcuL2dwZ3B1X21hdGgnO1xuXG5leHBvcnQgY2xhc3MgUmVzaXplTmVhcmVzdE5laWdib3JCYWNrcHJvcFByb2dyYW0gaW1wbGVtZW50cyBHUEdQVVByb2dyYW0ge1xuICB2YXJpYWJsZU5hbWVzID0gWydkeSddO1xuICBvdXRwdXRTaGFwZTogbnVtYmVyW10gPSBbXTtcbiAgdXNlckNvZGU6IHN0cmluZztcblxuICBjb25zdHJ1Y3RvcihcbiAgICAgIGR5U2hhcGU6IFtudW1iZXIsIG51bWJlciwgbnVtYmVyLCBudW1iZXJdLFxuICAgICAgaW5wdXRTaGFwZTogW251bWJlciwgbnVtYmVyLCBudW1iZXIsIG51bWJlcl0sIGFsaWduQ29ybmVyczogYm9vbGVhbikge1xuICAgIHRoaXMub3V0cHV0U2hhcGUgPSBpbnB1dFNoYXBlO1xuICAgIGNvbnN0IFssIHhIZWlnaHQsIHhXaWR0aCwgXSA9IGlucHV0U2hhcGU7XG4gICAgY29uc3QgWywgeUhlaWdodCwgeVdpZHRoXSA9IGR5U2hhcGU7XG5cbiAgICAvLyBJbiB0aGUgYmFja3dhcmRzIHBhc3MsIHdlIHdhbnQgdG8gZmluZCB0aGUgcGl4ZWxzIHRoYXQgd2VyZSBnZW5lcmF0ZWQgZm9yXG4gICAgLy8gZWFjaCBwaXhlbCBpbiB0aGUgaW5wdXQgaW1hZ2UgdGhlIGZvcndhcmQgcGFzcyBhbmQgYWRkIHRoZSBjb3JyZXNwb25kaW5nXG4gICAgLy8gY29lZmZpY2llbnQgZnJvbSBkeSB0byB0aGUgZ3JhZGllbnQgKHdpdGggc29tZSBpbnRlcnBvbGF0aW9uKS5cblxuICAgIGNvbnN0IGVmZmVjdGl2ZVhTaXplOiBbbnVtYmVyLCBudW1iZXJdID0gW1xuICAgICAgKGFsaWduQ29ybmVycyAmJiB5SGVpZ2h0ID4gMSkgPyB4SGVpZ2h0IC0gMSA6IHhIZWlnaHQsXG4gICAgICAoYWxpZ25Db3JuZXJzICYmIHlXaWR0aCA+IDEpID8geFdpZHRoIC0gMSA6IHhXaWR0aFxuICAgIF07XG5cbiAgICBjb25zdCBlZmZlY3RpdmVZU2l6ZTogW251bWJlciwgbnVtYmVyXSA9IFtcbiAgICAgIChhbGlnbkNvcm5lcnMgJiYgeUhlaWdodCA+IDEpID8geUhlaWdodCAtIDEgOiB5SGVpZ2h0LFxuICAgICAgKGFsaWduQ29ybmVycyAmJiB5V2lkdGggPiAxKSA/IHlXaWR0aCAtIDEgOiB5V2lkdGhcbiAgICBdO1xuXG4gICAgY29uc3QgaGVpZ2h0U2NhbGUgPSBlZmZlY3RpdmVYU2l6ZVswXSAvIGVmZmVjdGl2ZVlTaXplWzBdO1xuICAgIGNvbnN0IHdpZHRoU2NhbGUgPSBlZmZlY3RpdmVYU2l6ZVsxXSAvIGVmZmVjdGl2ZVlTaXplWzFdO1xuXG4gICAgY29uc3QgaW52SGVpZ2h0U2NhbGUgPSAxIC8gaGVpZ2h0U2NhbGU7XG4gICAgY29uc3QgaW52V2lkdGhTY2FsZSA9IDEgLyB3aWR0aFNjYWxlO1xuXG4gICAgLy8gVGhpcyBkZWZpbmVzIHRoZSBzaXplIG9mIHRoZSB3aW5kb3cgb2YgdmFsdWVzIGFyb3VuZCBhIHBhcnRpY3VsYXJcbiAgICAvLyBpbmRleCBpbiBkeSB0aGF0IHdlIHdhbnQgdG8gc2VhcmNoIGZvciBjb250cmlidXRpb25zIHRvIGR4LlxuICAgIGNvbnN0IHdpbkhlaWdodCA9IChNYXRoLmNlaWwoaW52SGVpZ2h0U2NhbGUpICogMikgKyAyO1xuICAgIGNvbnN0IHdpbldpZHRoID0gKE1hdGguY2VpbChpbnZXaWR0aFNjYWxlKSAqIDIpICsgMjtcblxuICAgIHRoaXMudXNlckNvZGUgPSBgXG4gICAgICB2b2lkIG1haW4oKSB7XG4gICAgICAgIGl2ZWM0IGNvb3JkcyA9IGdldE91dHB1dENvb3JkcygpO1xuICAgICAgICBpbnQgYiA9IGNvb3Jkc1swXTtcbiAgICAgICAgaW50IGQgPSBjb29yZHNbM107XG4gICAgICAgIGludCByID0gY29vcmRzWzFdO1xuICAgICAgICBpbnQgYyA9IGNvb3Jkc1syXTtcblxuICAgICAgICBmbG9hdCBhY2N1bXVsYXRvciA9IDAuMDtcblxuICAgICAgICBjb25zdCBmbG9hdCBoZWlnaHRTY2FsZSA9IGZsb2F0KCR7aGVpZ2h0U2NhbGV9KTtcbiAgICAgICAgY29uc3QgZmxvYXQgd2lkdGhTY2FsZSA9IGZsb2F0KCR7d2lkdGhTY2FsZX0pO1xuXG4gICAgICAgIGNvbnN0IGZsb2F0IGludkhlaWdodFNjYWxlID0gZmxvYXQoJHtpbnZIZWlnaHRTY2FsZX0pO1xuICAgICAgICBjb25zdCBmbG9hdCBpbnZXaWR0aFNjYWxlID0gZmxvYXQoJHtpbnZXaWR0aFNjYWxlfSk7XG5cbiAgICAgICAgY29uc3QgaW50IHdpbkhlaWdodCA9IGludCgke3dpbkhlaWdodH0pO1xuICAgICAgICBjb25zdCBpbnQgd2luV2lkdGggPSBpbnQoJHt3aW5XaWR0aH0pO1xuXG4gICAgICAgIC8vIENvbXB1dGUgYm91bmRzIGZvciB3aGVyZSBpbiBkeSB3ZSB3aWxsIGxvb2tcbiAgICAgICAgZmxvYXQgc3RhcnRSTGVycCA9IGZsb29yKGZsb2F0KHIpICogaW52SGVpZ2h0U2NhbGUpO1xuICAgICAgICBpbnQgc3RhcnREeVIgPSBpbnQoZmxvb3Ioc3RhcnRSTGVycCAtIGZsb2F0KHdpbkhlaWdodCAvIDIpKSk7XG5cbiAgICAgICAgZmxvYXQgc3RhcnRDTGVycCA9IGZsb29yKGZsb2F0KGMpICogaW52V2lkdGhTY2FsZSk7XG4gICAgICAgIGludCBzdGFydER5QyA9IGludChmbG9vcihzdGFydENMZXJwIC0gZmxvYXQod2luV2lkdGggLyAyKSkpO1xuXG4gICAgICAgIC8vIExvb3Agb3ZlciBkeVxuICAgICAgICBmb3IgKGludCBkeVJPZmZzZXQgPSAwOyBkeVJPZmZzZXQgPCB3aW5IZWlnaHQ7IGR5Uk9mZnNldCsrKSB7XG4gICAgICAgICAgaW50IGR5UiA9IGR5Uk9mZnNldCArIHN0YXJ0RHlSO1xuXG4gICAgICAgICAgLy8gR3VhcmQgYWdhaW5zdCB0aGUgd2luZG93IGV4Y2VlZGluZyB0aGUgYm91bmRzIG9mIGR5XG4gICAgICAgICAgaWYgKGR5UiA8IDAgfHwgZHlSID49ICR7eUhlaWdodH0pIHtcbiAgICAgICAgICAgIGNvbnRpbnVlO1xuICAgICAgICAgIH1cblxuICAgICAgICAgIGZvciAoaW50IGR5Q09mZnNldCA9IDA7IGR5Q09mZnNldCA8IHdpbldpZHRoOyBkeUNPZmZzZXQrKykge1xuICAgICAgICAgICAgaW50IGR5QyA9IGR5Q09mZnNldCArIHN0YXJ0RHlDO1xuXG4gICAgICAgICAgICAvLyBHdWFyZCBhZ2FpbnN0IHRoZSB3aW5kb3cgZXhjZWVkaW5nIHRoZSBib3VuZHMgb2YgZHlcbiAgICAgICAgICAgIGlmIChkeUMgPCAwIHx8IGR5QyA+PSAke3lXaWR0aH0pIHtcbiAgICAgICAgICAgICAgY29udGludWU7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIGZsb2F0IHNvdXJjZUZyYWNSb3cgPVxuICAgICAgICAgICAgICBmbG9hdCgke2VmZmVjdGl2ZVhTaXplWzBdfSkgKlxuICAgICAgICAgICAgICAgIChmbG9hdChkeVIpIC8gZmxvYXQoJHtlZmZlY3RpdmVZU2l6ZVswXX0pKTtcblxuICAgICAgICAgICAgZmxvYXQgc291cmNlRnJhY0NvbCA9XG4gICAgICAgICAgICAgICAgZmxvYXQoJHtlZmZlY3RpdmVYU2l6ZVsxXX0pICpcbiAgICAgICAgICAgICAgICAgIChmbG9hdChkeUMpIC8gZmxvYXQoJHtlZmZlY3RpdmVZU2l6ZVsxXX0pKTtcblxuICAgICAgICAgICAgaW50IHNvdXJjZU5lYXJlc3RSb3cgPSBpbnQobWluKFxuICAgICAgICAgICAgICAgIGZsb2F0KGludCgke3hIZWlnaHR9KSAtIDEpLFxuICAgICAgICAgICAgICAgICR7YWxpZ25Db3JuZXJzfSA/IGZsb2F0KHJvdW5kKHNvdXJjZUZyYWNSb3cpKSA6XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmxvYXQoZmxvb3Ioc291cmNlRnJhY1JvdykpKSk7XG5cbiAgICAgICAgICAgIGludCBzb3VyY2VOZWFyZXN0Q29sID0gaW50KG1pbihcbiAgICAgICAgICAgICAgICBmbG9hdChpbnQoJHt4V2lkdGh9KSAtIDEpLFxuICAgICAgICAgICAgICAgICR7YWxpZ25Db3JuZXJzfSA/IGZsb2F0KHJvdW5kKHNvdXJjZUZyYWNDb2wpKSA6XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmxvYXQoZmxvb3Ioc291cmNlRnJhY0NvbCkpKSk7XG5cbiAgICAgICAgICAgIGlmIChyID09IHNvdXJjZU5lYXJlc3RSb3cgJiYgYyA9PSBzb3VyY2VOZWFyZXN0Q29sKSB7XG4gICAgICAgICAgICAgIGFjY3VtdWxhdG9yICs9IGdldER5KGIsIGR5UiwgZHlDLCBkKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgLy8gRW5kIGxvb3Agb3ZlciBkeVxuXG4gICAgICAgIHNldE91dHB1dChhY2N1bXVsYXRvcik7XG4gICAgICB9XG4gICAgYDtcbiAgfVxufVxuIl19","/**\n * @license\n * Copyright 2020 Google LLC. All Rights Reserved.\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n * =============================================================================\n */\nimport { ResizeNearestNeighborGrad } from '@tensorflow/tfjs-core';\nimport { ResizeNearestNeigborBackpropProgram } from '../resize_nearest_neighbor_backprop_gpu';\nexport function resizeNearestNeighborGrad(args) {\n const { inputs, backend, attrs } = args;\n const { images, dy } = inputs;\n const { alignCorners } = attrs;\n const program = new ResizeNearestNeigborBackpropProgram(dy.shape, images.shape, alignCorners);\n return backend.runWebGLProgram(program, [dy], dy.dtype);\n}\nexport const resizeNearestNeighborGradConfig = {\n kernelName: ResizeNearestNeighborGrad,\n backendName: 'webgl',\n kernelFunc: resizeNearestNeighborGrad\n};\n//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiUmVzaXplTmVhcmVzdE5laWdoYm9yR3JhZC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uLy4uL3RmanMtYmFja2VuZC13ZWJnbC9zcmMva2VybmVscy9SZXNpemVOZWFyZXN0TmVpZ2hib3JHcmFkLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBOzs7Ozs7Ozs7Ozs7Ozs7R0FlRztBQUVILE9BQU8sRUFBMkIseUJBQXlCLEVBQThFLE1BQU0sdUJBQXVCLENBQUM7QUFHdkssT0FBTyxFQUFDLG1DQUFtQyxFQUFDLE1BQU0seUNBQXlDLENBQUM7QUFFNUYsTUFBTSxVQUFVLHlCQUF5QixDQUFDLElBSXpDO0lBQ0MsTUFBTSxFQUFDLE1BQU0sRUFBRSxPQUFPLEVBQUUsS0FBSyxFQUFDLEdBQUcsSUFBSSxDQUFDO0lBQ3RDLE1BQU0sRUFBQyxNQUFNLEVBQUUsRUFBRSxFQUFDLEdBQUcsTUFBTSxDQUFDO0lBQzVCLE1BQU0sRUFBQyxZQUFZLEVBQUMsR0FBRyxLQUFLLENBQUM7SUFFN0IsTUFBTSxPQUFPLEdBQUcsSUFBSSxtQ0FBbUMsQ0FDbkQsRUFBRSxDQUFDLEtBQXlDLEVBQzVDLE1BQU0sQ0FBQyxLQUF5QyxFQUFFLFlBQVksQ0FBQyxDQUFDO0lBQ3BFLE9BQU8sT0FBTyxDQUFDLGVBQWUsQ0FBQyxPQUFPLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxFQUFFLENBQUMsS0FBSyxDQUFDLENBQUM7QUFDMUQsQ0FBQztBQUVELE1BQU0sQ0FBQyxNQUFNLCtCQUErQixHQUFpQjtJQUMzRCxVQUFVLEVBQUUseUJBQXlCO0lBQ3JDLFdBQVcsRUFBRSxPQUFPO0lBQ3BCLFVBQVUsRUFBRSx5QkFBNkM7Q0FDMUQsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbIi8qKlxuICogQGxpY2Vuc2VcbiAqIENvcHlyaWdodCAyMDIwIEdvb2dsZSBMTEMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuXG4gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgXCJMaWNlbnNlXCIpO1xuICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLlxuICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0XG4gKlxuICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wXG4gKlxuICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZVxuICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gXCJBUyBJU1wiIEJBU0lTLFxuICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuXG4gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kXG4gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS5cbiAqID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4gKi9cblxuaW1wb3J0IHtLZXJuZWxDb25maWcsIEtlcm5lbEZ1bmMsIFJlc2l6ZU5lYXJlc3ROZWlnaGJvckdyYWQsIFJlc2l6ZU5lYXJlc3ROZWlnaGJvckdyYWRBdHRycywgUmVzaXplTmVhcmVzdE5laWdoYm9yR3JhZElucHV0cywgVGVuc29ySW5mb30gZnJvbSAnQHRlbnNvcmZsb3cvdGZqcy1jb3JlJztcblxuaW1wb3J0IHtNYXRoQmFja2VuZFdlYkdMfSBmcm9tICcuLi9iYWNrZW5kX3dlYmdsJztcbmltcG9ydCB7UmVzaXplTmVhcmVzdE5laWdib3JCYWNrcHJvcFByb2dyYW19IGZyb20gJy4uL3Jlc2l6ZV9uZWFyZXN0X25laWdoYm9yX2JhY2twcm9wX2dwdSc7XG5cbmV4cG9ydCBmdW5jdGlvbiByZXNpemVOZWFyZXN0TmVpZ2hib3JHcmFkKGFyZ3M6IHtcbiAgaW5wdXRzOiBSZXNpemVOZWFyZXN0TmVpZ2hib3JHcmFkSW5wdXRzLFxuICBiYWNrZW5kOiBNYXRoQmFja2VuZFdlYkdMLFxuICBhdHRyczogUmVzaXplTmVhcmVzdE5laWdoYm9yR3JhZEF0dHJzXG59KTogVGVuc29ySW5mbyB7XG4gIGNvbnN0IHtpbnB1dHMsIGJhY2tlbmQsIGF0dHJzfSA9IGFyZ3M7XG4gIGNvbnN0IHtpbWFnZXMsIGR5fSA9IGlucHV0cztcbiAgY29uc3Qge2FsaWduQ29ybmVyc30gPSBhdHRycztcblxuICBjb25zdCBwcm9ncmFtID0gbmV3IFJlc2l6ZU5lYXJlc3ROZWlnYm9yQmFja3Byb3BQcm9ncmFtKFxuICAgICAgZHkuc2hhcGUgYXMgW251bWJlciwgbnVtYmVyLCBudW1iZXIsIG51bWJlcl0sXG4gICAgICBpbWFnZXMuc2hhcGUgYXMgW251bWJlciwgbnVtYmVyLCBudW1iZXIsIG51bWJlcl0sIGFsaWduQ29ybmVycyk7XG4gIHJldHVybiBiYWNrZW5kLnJ1bldlYkdMUHJvZ3JhbShwcm9ncmFtLCBbZHldLCBkeS5kdHlwZSk7XG59XG5cbmV4cG9ydCBjb25zdCByZXNpemVOZWFyZXN0TmVpZ2hib3JHcmFkQ29uZmlnOiBLZXJuZWxDb25maWcgPSB7XG4gIGtlcm5lbE5hbWU6IFJlc2l6ZU5lYXJlc3ROZWlnaGJvckdyYWQsXG4gIGJhY2tlbmROYW1lOiAnd2ViZ2wnLFxuICBrZXJuZWxGdW5jOiByZXNpemVOZWFyZXN0TmVpZ2hib3JHcmFkIGFzIHt9IGFzIEtlcm5lbEZ1bmNcbn07XG4iXX0=","/**\n * @license\n * Copyright 2017 Google LLC. All Rights Reserved.\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n * =============================================================================\n */\nimport { getCoordsDataType } from './shader_compiler';\nexport class ReverseProgram {\n constructor(xShape, axis) {\n this.variableNames = ['x'];\n const rank = xShape.length;\n if (rank > 4) {\n throw new Error(`WebGL backend: Reverse of rank-${rank} tensor is not yet supported`);\n }\n this.outputShape = xShape;\n if (rank === 1) {\n this.userCode = `\n void main() {\n int coord = getOutputCoords();\n setOutput(getX(${xShape[0]} - coord - 1));\n }\n `;\n return;\n }\n const getInCoord = (i) => {\n if (axis.indexOf(i) !== -1 && xShape[i] !== 1) {\n return `${xShape[i]} - coords[${i}] - 1`;\n }\n return `coords[${i}]`;\n };\n const inCoords = xShape.map((_, i) => getInCoord(i)).join(',');\n const type = getCoordsDataType(rank);\n this.userCode = `\n void main() {\n ${type} coords = getOutputCoords();\n setOutput(getX(${inCoords}));\n }\n `;\n }\n}\n//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicmV2ZXJzZV9ncHUuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi90ZmpzLWJhY2tlbmQtd2ViZ2wvc3JjL3JldmVyc2VfZ3B1LnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBOzs7Ozs7Ozs7Ozs7Ozs7R0FlRztBQUdILE9BQU8sRUFBQyxpQkFBaUIsRUFBQyxNQUFNLG1CQUFtQixDQUFDO0FBRXBELE1BQU0sT0FBTyxjQUFjO0lBS3pCLFlBQVksTUFBZ0IsRUFBRSxJQUFjO1FBSjVDLGtCQUFhLEdBQUcsQ0FBQyxHQUFHLENBQUMsQ0FBQztRQUtwQixNQUFNLElBQUksR0FBRyxNQUFNLENBQUMsTUFBTSxDQUFDO1FBQzNCLElBQUksSUFBSSxHQUFHLENBQUMsRUFBRTtZQUNaLE1BQU0sSUFBSSxLQUFLLENBQ1gsa0NBQWtDLElBQUksOEJBQThCLENBQUMsQ0FBQztTQUMzRTtRQUNELElBQUksQ0FBQyxXQUFXLEdBQUcsTUFBTSxDQUFDO1FBRTFCLElBQUksSUFBSSxLQUFLLENBQUMsRUFBRTtZQUNkLElBQUksQ0FBQyxRQUFRLEdBQUc7OzsyQkFHSyxNQUFNLENBQUMsQ0FBQyxDQUFDOztPQUU3QixDQUFDO1lBQ0YsT0FBTztTQUNSO1FBQ0QsTUFBTSxVQUFVLEdBQUcsQ0FBQyxDQUFTLEVBQUUsRUFBRTtZQUMvQixJQUFJLElBQUksQ0FBQyxPQUFPLENBQUMsQ0FBQyxDQUFDLEtBQUssQ0FBQyxDQUFDLElBQUksTUFBTSxDQUFDLENBQUMsQ0FBQyxLQUFLLENBQUMsRUFBRTtnQkFDN0MsT0FBTyxHQUFHLE1BQU0sQ0FBQyxDQUFDLENBQUMsYUFBYSxDQUFDLE9BQU8sQ0FBQzthQUMxQztZQUNELE9BQU8sVUFBVSxDQUFDLEdBQUcsQ0FBQztRQUN4QixDQUFDLENBQUM7UUFDRixNQUFNLFFBQVEsR0FBRyxNQUFNLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsRUFBRSxFQUFFLENBQUMsVUFBVSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLEdBQUcsQ0FBQyxDQUFDO1FBQy9ELE1BQU0sSUFBSSxHQUFHLGlCQUFpQixDQUFDLElBQUksQ0FBQyxDQUFDO1FBRXJDLElBQUksQ0FBQyxRQUFRLEdBQUc7O1VBRVYsSUFBSTt5QkFDVyxRQUFROztLQUU1QixDQUFDO0lBQ0osQ0FBQztDQUNGIiwic291cmNlc0NvbnRlbnQiOlsiLyoqXG4gKiBAbGljZW5zZVxuICogQ29weXJpZ2h0IDIwMTcgR29vZ2xlIExMQy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC5cbiAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSBcIkxpY2Vuc2VcIik7XG4gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuXG4gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXRcbiAqXG4gKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjBcbiAqXG4gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlXG4gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiBcIkFTIElTXCIgQkFTSVMsXG4gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC5cbiAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmRcbiAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLlxuICogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbiAqL1xuXG5pbXBvcnQge0dQR1BVUHJvZ3JhbX0gZnJvbSAnLi9ncGdwdV9tYXRoJztcbmltcG9ydCB7Z2V0Q29vcmRzRGF0YVR5cGV9IGZyb20gJy4vc2hhZGVyX2NvbXBpbGVyJztcblxuZXhwb3J0IGNsYXNzIFJldmVyc2VQcm9ncmFtIGltcGxlbWVudHMgR1BHUFVQcm9ncmFtIHtcbiAgdmFyaWFibGVOYW1lcyA9IFsneCddO1xuICBvdXRwdXRTaGFwZTogbnVtYmVyW107XG4gIHVzZXJDb2RlOiBzdHJpbmc7XG5cbiAgY29uc3RydWN0b3IoeFNoYXBlOiBudW1iZXJbXSwgYXhpczogbnVtYmVyW10pIHtcbiAgICBjb25zdCByYW5rID0geFNoYXBlLmxlbmd0aDtcbiAgICBpZiAocmFuayA+IDQpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcihcbiAgICAgICAgICBgV2ViR0wgYmFja2VuZDogUmV2ZXJzZSBvZiByYW5rLSR7cmFua30gdGVuc29yIGlzIG5vdCB5ZXQgc3VwcG9ydGVkYCk7XG4gICAgfVxuICAgIHRoaXMub3V0cHV0U2hhcGUgPSB4U2hhcGU7XG5cbiAgICBpZiAocmFuayA9PT0gMSkge1xuICAgICAgdGhpcy51c2VyQ29kZSA9IGBcbiAgICAgICAgdm9pZCBtYWluKCkge1xuICAgICAgICAgIGludCBjb29yZCA9IGdldE91dHB1dENvb3JkcygpO1xuICAgICAgICAgIHNldE91dHB1dChnZXRYKCR7eFNoYXBlWzBdfSAtIGNvb3JkIC0gMSkpO1xuICAgICAgICB9XG4gICAgICBgO1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICBjb25zdCBnZXRJbkNvb3JkID0gKGk6IG51bWJlcikgPT4ge1xuICAgICAgaWYgKGF4aXMuaW5kZXhPZihpKSAhPT0gLTEgJiYgeFNoYXBlW2ldICE9PSAxKSB7XG4gICAgICAgIHJldHVybiBgJHt4U2hhcGVbaV19IC0gY29vcmRzWyR7aX1dIC0gMWA7XG4gICAgICB9XG4gICAgICByZXR1cm4gYGNvb3Jkc1ske2l9XWA7XG4gICAgfTtcbiAgICBjb25zdCBpbkNvb3JkcyA9IHhTaGFwZS5tYXAoKF8sIGkpID0+IGdldEluQ29vcmQoaSkpLmpvaW4oJywnKTtcbiAgICBjb25zdCB0eXBlID0gZ2V0Q29vcmRzRGF0YVR5cGUocmFuayk7XG5cbiAgICB0aGlzLnVzZXJDb2RlID0gYFxuICAgICAgdm9pZCBtYWluKCkge1xuICAgICAgICAke3R5cGV9IGNvb3JkcyA9IGdldE91dHB1dENvb3JkcygpO1xuICAgICAgICBzZXRPdXRwdXQoZ2V0WCgke2luQ29vcmRzfSkpO1xuICAgICAgfVxuICAgIGA7XG4gIH1cbn1cbiJdfQ==","/**\n * @license\n * Copyright 2019 Google LLC. All Rights Reserved.\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n * =============================================================================\n */\nimport { getChannels } from './packing_util';\nimport { getCoordsDataType } from './shader_compiler';\nexport class ReversePackedProgram {\n constructor(xShape, axis) {\n this.variableNames = ['x'];\n this.packedInputs = true;\n this.packedOutput = true;\n const rank = xShape.length;\n if (rank > 4) {\n throw new Error(`WebGL backend: Reverse of rank-${rank} tensor is not yet supported`);\n }\n this.outputShape = xShape;\n const channels = getChannels('rc', rank);\n const nextColumn = `${channels[rank - 1]} + 1 < ${this.outputShape[rank - 1]}`;\n const nextRow = `${channels[rank - 2]} + 1 < ${this.outputShape[rank - 2]}`;\n const type = getCoordsDataType(rank);\n if (rank === 1) {\n this.userCode = `\n void main(){\n int rc = getOutputCoords();\n vec4 result = vec4(0.);\n result.r = getChannel(getX(${xShape[0]} - rc - 1),\n ${xShape[0]} - rc - 1);\n if(${nextColumn}){\n result.g = getChannel(getX(${xShape[0]} - (rc + 1) - 1),\n ${xShape[0]} - (rc + 1) - 1);\n }\n setOutput(result);\n }\n `;\n }\n else {\n this.userCode = `\n void main() {\n ${type} rc = getOutputCoords();\n vec4 result = vec4(0.);\n result.r = ${getR(channels.slice())};\n if(${nextColumn}){\n result.g = ${getG(channels.slice())};\n }\n if(${nextRow}) {\n result.b = ${getB(channels.slice())};\n if(${nextColumn}) {\n result.a = ${getA(channels.slice())};\n }\n }\n setOutput(result);\n }\n `;\n }\n function getR(channels) {\n return getChannel(channels);\n }\n function getG(channels) {\n channels[rank - 1] = '(' + channels[rank - 1] + ` + 1)`;\n return getChannel(channels);\n }\n function getB(channels) {\n channels[rank - 2] = '(' + channels[rank - 2] + ` + 1)`;\n return getChannel(channels);\n }\n function getA(channels) {\n channels[rank - 1] = '(' + channels[rank - 1] + ` + 1)`;\n channels[rank - 2] = '(' + channels[rank - 2] + ` + 1)`;\n return getChannel(channels);\n }\n function getChannel(channels) {\n const inCoordsArray = xShape.map((_, i) => getInCoord(i, channels));\n const inCoords = inCoordsArray.join(',');\n const innerDims = inCoordsArray.slice(-2).join(',');\n return `getChannel(getX(${inCoords}), vec2(${innerDims}))`;\n }\n function getInCoord(i, channels1) {\n if (axis.indexOf(i) !== -1 && xShape[i] !== 1) {\n return `${xShape[i]} - ${channels1[i]} - 1`;\n }\n else {\n return `${channels1[i]}`;\n }\n }\n }\n}\n//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicmV2ZXJzZV9wYWNrZWRfZ3B1LmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vdGZqcy1iYWNrZW5kLXdlYmdsL3NyYy9yZXZlcnNlX3BhY2tlZF9ncHUudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUE7Ozs7Ozs7Ozs7Ozs7OztHQWVHO0FBR0gsT0FBTyxFQUFDLFdBQVcsRUFBQyxNQUFNLGdCQUFnQixDQUFDO0FBQzNDLE9BQU8sRUFBQyxpQkFBaUIsRUFBQyxNQUFNLG1CQUFtQixDQUFDO0FBRXBELE1BQU0sT0FBTyxvQkFBb0I7SUFPL0IsWUFBWSxNQUFnQixFQUFFLElBQWM7UUFONUMsa0JBQWEsR0FBRyxDQUFDLEdBQUcsQ0FBQyxDQUFDO1FBR3RCLGlCQUFZLEdBQUcsSUFBSSxDQUFDO1FBQ3BCLGlCQUFZLEdBQUcsSUFBSSxDQUFDO1FBR2xCLE1BQU0sSUFBSSxHQUFHLE1BQU0sQ0FBQyxNQUFNLENBQUM7UUFDM0IsSUFBSSxJQUFJLEdBQUcsQ0FBQyxFQUFFO1lBQ1osTUFBTSxJQUFJLEtBQUssQ0FDWCxrQ0FBa0MsSUFBSSw4QkFBOEIsQ0FBQyxDQUFDO1NBQzNFO1FBQ0QsSUFBSSxDQUFDLFdBQVcsR0FBRyxNQUFNLENBQUM7UUFDMUIsTUFBTSxRQUFRLEdBQUcsV0FBVyxDQUFDLElBQUksRUFBRSxJQUFJLENBQUMsQ0FBQztRQUN6QyxNQUFNLFVBQVUsR0FDWixHQUFHLFFBQVEsQ0FBQyxJQUFJLEdBQUcsQ0FBQyxDQUFDLFVBQVUsSUFBSSxDQUFDLFdBQVcsQ0FBQyxJQUFJLEdBQUcsQ0FBQyxDQUFDLEVBQUUsQ0FBQztRQUNoRSxNQUFNLE9BQU8sR0FBRyxHQUFHLFFBQVEsQ0FBQyxJQUFJLEdBQUcsQ0FBQyxDQUFDLFVBQVUsSUFBSSxDQUFDLFdBQVcsQ0FBQyxJQUFJLEdBQUcsQ0FBQyxDQUFDLEVBQUUsQ0FBQztRQUM1RSxNQUFNLElBQUksR0FBRyxpQkFBaUIsQ0FBQyxJQUFJLENBQUMsQ0FB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ZVxuICogQ29weXJpZ2h0IDIwMTkgR29vZ2xlIExMQy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC5cbiAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSBcIkxpY2Vuc2VcIik7XG4gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuXG4gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXRcbiAqXG4gKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjBcbiAqXG4gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlXG4gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiBcIkFTIElTXCIgQkFTSVMsXG4gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC5cbiAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmRcbiAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLlxuICogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbiAqL1xuXG5pbXBvcnQge0dQR1BVUHJvZ3JhbX0gZnJvbSAnLi9ncGdwdV9tYXRoJztcbmltcG9ydCB7Z2V0Q2hhbm5lbHN9IGZyb20gJy4vcGFja2luZ191dGlsJztcbmltcG9ydCB7Z2V0Q29vcmRzRGF0YVR5cGV9IGZyb20gJy4vc2hhZGVyX2NvbXBpbGVyJztcblxuZXhwb3J0IGNsYXNzIFJldmVyc2VQYWNrZWRQcm9ncmFtIGltcGxlbWVudHMgR1BHUFVQcm9ncmFtIHtcbiAgdmFyaWFibGVOYW1lcyA9IFsneCddO1xuICBvdXRwdXRTaGFwZTogbnVtYmVyW107XG4gIHVzZXJDb2RlOiBzdHJpbmc7XG4gIHBhY2tlZElucHV0cyA9IHRydWU7XG4gIHBhY2tlZE91dHB1dCA9IHRydWU7XG5cbiAgY29uc3RydWN0b3IoeFNoYXBlOiBudW1iZXJbXSwgYXhpczogbnVtYmVyW10pIHtcbiAgICBjb25zdCByYW5rID0geFNoYXBlLmxlbmd0aDtcbiAgICBpZiAocmFuayA+IDQpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcihcbiAgICAgICAgICBgV2ViR0wgYmFja2VuZDogUmV2ZXJzZSBvZiByYW5rLSR7cmFua30gdGVuc29yIGlzIG5vdCB5ZXQgc3VwcG9ydGVkYCk7XG4gICAgfVxuICAgIHRoaXMub3V0cHV0U2hhcGUgPSB4U2hhcGU7XG4gICAgY29uc3QgY2hhbm5lbHMgPSBnZXRDaGFubmVscygncmMnLCByYW5rKTtcbiAgICBjb25zdCBuZXh0Q29sdW1uID1cbiAgICAgICAgYCR7Y2hhbm5lbHNbcmFuayAtIDFdfSArIDEgPCAke3RoaXMub3V0cHV0U2hhcGVbcmFuayAtIDFdfWA7XG4gICAgY29uc3QgbmV4dFJvdyA9IGAke2NoYW5uZWxzW3JhbmsgLSAyXX0gKyAxIDwgJHt0aGlzLm91dHB1dFNoYXBlW3JhbmsgLSAyXX1gO1xuICAgIGNvbnN0IHR5cGUgPSBnZXRDb29yZHNEYXRhVHlwZShyYW5rKTtcbiAgICBpZiAocmFuayA9PT0gMSkge1xuICAgICAgdGhpcy51c2VyQ29kZSA9IGBcbiAgICAgICAgdm9pZCBtYWluKCl7XG4gICAgICAgICAgaW50IHJjID0gZ2V0T3V0cHV0Q29vcmRzKCk7XG4gICAgICAgICAgdmVjNCByZXN1bHQgPSB2ZWM0KDAuKTtcbiAgICAgICAgICByZXN1bHQuciA9IGdldENoYW5uZWwoZ2V0WCgke3hTaGFwZVswXX0gLSByYyAtIDEpLFxuICAgICAgICAgICAgJHt4U2hhcGVbMF19IC0gcmMgLSAxKTtcbiAgICAgICAgICBpZigke25leHRDb2x1bW59KXtcbiAgICAgICAgICAgICAgcmVzdWx0LmcgPSBnZXRDaGFubmVsKGdldFgoJHt4U2hhcGVbMF19IC0gKHJjICArIDEpIC0gMSksXG4gICAgICAgICAgICAgICAgJHt4U2hhcGVbMF19IC0gKHJjICArIDEpIC0gMSk7XG4gICAgICAgICAgfVxuICAgICAgICAgIHNldE91dHB1dChyZXN1bHQpO1xuICAgICAgICB9XG4gICAgICBgO1xuICAgIH0gZWxzZSB7XG4gICAgICB0aGlzLnVzZXJDb2RlID0gYFxuICAgICAgICB2b2lkIG1haW4oKSB7XG4gICAgICAgICAgJHt0eXBlfSByYyA9IGdldE91dHB1dENvb3JkcygpO1xuICAgICAgICAgIHZlYzQgcmVzdWx0ID0gdmVjNCgwLik7XG4gICAgICAgICAgcmVzdWx0LnIgPSAke2dldFIoY2hhbm5lbHMuc2xpY2UoKSl9O1xuICAgICAgICAgIGlmKCR7bmV4dENvbHVtbn0pe1xuICAgICAgICAgICAgcmVzdWx0LmcgPSAke2dldEcoY2hhbm5lbHMuc2xpY2UoKSl9O1xuICAgICAgICAgIH1cbiAgICAgICAgICBpZigke25leHRSb3d9KSB7XG4gICAgICAgICAgICByZXN1bHQuYiA9ICR7Z2V0QihjaGFubmVscy5zbGljZSgpKX07XG4gICAgICAgICAgICBpZigke25leHRDb2x1bW59KSB7XG4gICAgICAgICAgICAgIHJlc3VsdC5hID0gJHtnZXRBKGNoYW5uZWxzLnNsaWNlKCkpfTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9XG4gICAgICAgICAgc2V0T3V0cHV0KHJlc3VsdCk7XG4gICAgICAgIH1cbiAgICBgO1xuICAgIH1cblxuICAgIGZ1bmN0aW9uIGdldFIoY2hhbm5lbHM6IHN0cmluZ1tdKTogc3RyaW5nIHtcbiAgICAgIHJldHVybiBnZXRDaGFubmVsKGNoYW5uZWxzKTtcbiAgICB9XG5cbiAgICBmdW5jdGlvbiBnZXRHKGNoYW5uZWxzOiBzdHJpbmdbXSk6IHN0cmluZyB7XG4gICAgICBjaGFubmVsc1tyYW5rIC0gMV0gPSAnKCcgKyBjaGFubmVsc1tyYW5rIC0gMV0gKyBgICsgMSlgO1xuICAgICAgcmV0dXJuIGdldENoYW5uZWwoY2hhbm5lbHMpO1xuICAgIH1cblxuICAgIGZ1bmN0aW9uIGdldEIoY2hhbm5lbHM6IHN0cmluZ1tdKTogc3RyaW5nIHtcbiAgICAgIGNoYW5uZWxzW3JhbmsgLSAyXSA9ICcoJyArIGNoYW5uZWxzW3JhbmsgLSAyXSArIGAgKyAxKWA7XG4gICAgICByZXR1cm4gZ2V0Q2hhbm5lbChjaGFubmVscyk7XG4gICAgfVxuXG4gICAgZnVuY3Rpb24gZ2V0QShjaGFubmVsczogc3RyaW5nW10pOiBzdHJpbmcge1xuICAgICAgY2hhbm5lbHNbcmFuayAtIDFdID0gJygnICsgY2hhbm5lbHNbcmFuayAtIDFdICsgYCArIDEpYDtcbiAgICAgIGNoYW5uZWxzW3JhbmsgLSAyXSA9ICcoJyArIGNoYW5uZWxzW3JhbmsgLSAyXSArIGAgKyAxKWA7XG4gICAgICByZXR1cm4gZ2V0Q2hhbm5lbChjaGFubmVscyk7XG4gICAgfVxuXG4gICAgZnVuY3Rpb24gZ2V0Q2hhbm5lbChjaGFubmVsczogc3RyaW5nW10pOiBzdHJpbmcge1xuICAgICAgY29uc3QgaW5Db29yZHNBcnJheSA9IHhTaGFwZS5tYXAoKF8sIGkpID0+IGdldEluQ29vcmQoaSwgY2hhbm5lbHMpKTtcbiAgICAgIGNvbnN0IGluQ29vcmRzID0gaW5Db29yZHNBcnJheS5qb2luKCcsJyk7XG4gICAgICBjb25zdCBpbm5lckRpbXMgPSBpbkNvb3Jkc0FycmF5LnNsaWNlKC0yKS5qb2luKCcsJyk7XG4gICAgICByZXR1cm4gYGdldENoYW5uZWwoZ2V0WCgke2luQ29vcmRzfSksIHZlYzIoJHtpbm5lckRpbXN9KSlgO1xuICAgIH1cblxuICAgIGZ1bmN0aW9uIGdldEluQ29vcmQoaTogbnVtYmVyLCBjaGFubmVsczE6IHN0cmluZ1tdKTogc3RyaW5nIHtcbiAgICAgIGlmIChheGlzLmluZGV4T2YoaSkgIT09IC0xICYmIHhTaGFwZVtpXSAhPT0gMSkge1xuICAgICAgICByZXR1cm4gYCR7eFNoYXBlW2ldfSAtICR7Y2hhbm5lbHMxW2ldfSAtIDFgO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgcmV0dXJuIGAke2NoYW5uZWxzMVtpXX1gO1xuICAgICAgfVxuICAgIH1cbiAgfVxufVxuIl19","/**\n * @license\n * Copyright 2020 Google LLC. All Rights Reserved.\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n * =============================================================================\n */\nimport { env, Reverse, util } from '@tensorflow/tfjs-core';\nimport { ReverseProgram } from '../reverse_gpu';\nimport { ReversePackedProgram } from '../reverse_packed_gpu';\nimport { identity } from './Identity';\nexport function reverse(args) {\n const { inputs, backend, attrs } = args;\n const { x } = inputs;\n const { dims } = attrs;\n const xRank = x.shape.length;\n const $dims = util.parseAxisParam(dims, x.shape);\n if (xRank === 0) {\n return identity({ inputs: { x }, backend });\n }\n const program = env().getBool('WEBGL_PACK_ARRAY_OPERATIONS') ?\n new ReversePackedProgram(x.shape, $dims) :\n new ReverseProgram(x.shape, $dims);\n return backend.runWebGLProgram(program, [x], x.dtype);\n}\nexport const reverseConfig = {\n kernelName: Reverse,\n backendName: 'webgl',\n kernelFunc: reverse\n};\n//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiUmV2ZXJzZS5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uLy4uL3RmanMtYmFja2VuZC13ZWJnbC9zcmMva2VybmVscy9SZXZlcnNlLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBOzs7Ozs7Ozs7Ozs7Ozs7R0FlRztBQUVILE9BQU8sRUFBQyxHQUFHLEVBQTRCLE9BQU8sRUFBMkMsSUFBSSxFQUFDLE1BQU0sdUJBQXVCLENBQUM7QUFHNUgsT0FBTyxFQUFDLGNBQWMsRUFBQyxNQUFNLGdCQUFnQixDQUFDO0FBQzlDLE9BQU8sRUFBQyxvQkFBb0IsRUFBQyxNQUFNLHVCQUF1QixDQUFDO0FBRTNELE9BQU8sRUFBQyxRQUFRLEVBQUMsTUFBTSxZQUFZLENBQUM7QUFFcEMsTUFBTSxVQUFVLE9BQU8sQ0FBQyxJQUl2QjtJQUNDLE1BQU0sRUFBQyxNQUFNLEVBQUUsT0FBTyxFQUFFLEtBQUssRUFBQyxHQUFHLElBQUksQ0FBQztJQUN0QyxNQUFNLEVBQUMsQ0FBQyxFQUFDLEdBQUcsTUFBTSxDQUFDO0lBQ25CLE1BQU0sRUFBQyxJQUFJLEVBQUMsR0FBRyxLQUFLLENBQUM7SUFFckIsTUFBTSxLQUFLLEdBQUcsQ0FBQyxDQUFDLEtBQUssQ0FBQyxNQUFNLENBQUM7SUFFN0IsTUFBTSxLQUFLLEdBQUcsSUFBSSxDQUFDLGNBQWMsQ0FBQyxJQUFJLEVBQUUsQ0FBQyxDQUFDLEtBQUssQ0FBQyxDQUFDO0lBQ2pELElBQUksS0FBSyxLQUFLLENBQUMsRUFBRTtRQUNmLE9BQU8sUUFBUSxDQUFDLEVBQUMsTUFBTSxFQUFFLEVBQUMsQ0FBQyxFQUFDLEVBQUUsT0FBTyxFQUFDLENBQUMsQ0FBQztLQUN6QztJQUVELE1BQU0sT0FBTyxHQUFHLEdBQUcsRUFBRSxDQUFDLE9BQU8sQ0FBQyw2QkFBNkIsQ0FBQyxDQUFDLENBQUM7UUFDMUQsSUFBSSxvQkFBb0IsQ0FBQyxDQUFDLENBQUMsS0FBSyxFQUFFLEtBQUssQ0FBQyxDQUFDLENBQUM7UUFDMUMsSUFBSSxjQUFjLENBQUMsQ0FBQyxDQUFDLEtBQUssRUFBRSxLQUFLLENBQUMsQ0FBQztJQUV2QyxPQUFPLE9BQU8sQ0FBQyxlQUFlLENBQUMsT0FBTyxFQUFFLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLEtBQUssQ0FBQyxDQUFDO0FBQ3hELENBQUM7QUFFRCxNQUFNLENBQUMsTUFBTSxhQUFhLEdBQWlCO0lBQ3pDLFVBQVUsRUFBRSxPQUFPO0lBQ25CLFdBQVcsRUFBRSxPQUFPO0lBQ3BCLFVBQVUsRUFBRSxPQUEyQjtDQUN4QyxDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiLyoqXG4gKiBAbGljZW5zZVxuICogQ29weXJpZ2h0IDIwMjAgR29vZ2xlIExMQy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC5cbiAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSBcIkxpY2Vuc2VcIik7XG4gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuXG4gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXRcbiAqXG4gKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjBcbiAqXG4gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlXG4gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiBcIkFTIElTXCIgQkFTSVMsXG4gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC5cbiAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmRcbiAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLlxuICogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbiAqL1xuXG5pbXBvcnQge2VudiwgS2VybmVsQ29uZmlnLCBLZXJuZWxGdW5jLCBSZXZlcnNlLCBSZXZlcnNlQXR0cnMsIFJldmVyc2VJbnB1dHMsIFRlbnNvckluZm8sIHV0aWx9IGZyb20gJ0B0ZW5zb3JmbG93L3RmanMtY29yZSc7XG5cbmltcG9ydCB7TWF0aEJhY2tlbmRXZWJHTH0gZnJvbSAnLi4vYmFja2VuZF93ZWJnbCc7XG5pbXBvcnQge1JldmVyc2VQcm9ncmFtfSBmcm9tICcuLi9yZXZlcnNlX2dwdSc7XG5pbXBvcnQge1JldmVyc2VQYWNrZWRQcm9ncmFtfSBmcm9tICcuLi9yZXZlcnNlX3BhY2tlZF9ncHUnO1xuXG5pbXBvcnQge2lkZW50aXR5fSBmcm9tICcuL0lkZW50aXR5JztcblxuZXhwb3J0IGZ1bmN0aW9uIHJldmVyc2UoYXJnczoge1xuICBpbnB1dHM6IFJldmVyc2VJbnB1dHMsXG4gIGJhY2tlbmQ6IE1hdGhCYWNrZW5kV2ViR0wsXG4gIGF0dHJzOiBSZXZlcnNlQXR0cnNcbn0pOiBUZW5zb3JJbmZvIHtcbiAgY29uc3Qge2lucHV0cywgYmFja2VuZCwgYXR0cnN9ID0gYXJncztcbiAgY29uc3Qge3h9ID0gaW5wdXRzO1xuICBjb25zdCB7ZGltc30gPSBhdHRycztcblxuICBjb25zdCB4UmFuayA9IHguc2hhcGUubGVuZ3RoO1xuXG4gIGNvbnN0ICRkaW1zID0gdXRpbC5wYXJzZUF4aXNQYXJhbShkaW1zLCB4LnNoYXBlKTtcbiAgaWYgKHhSYW5rID09PSAwKSB7XG4gICAgcmV0dXJuIGlkZW50aXR5KHtpbnB1dHM6IHt4fSwgYmFja2VuZH0pO1xuICB9XG5cbiAgY29uc3QgcHJvZ3JhbSA9IGVudigpLmdldEJvb2woJ1dFQkdMX1BBQ0tfQVJSQVlfT1BFUkFUSU9OUycpID9cbiAgICAgIG5ldyBSZXZlcnNlUGFja2VkUHJvZ3JhbSh4LnNoYXBlLCAkZGltcykgOlxuICAgICAgbmV3IFJldmVyc2VQcm9ncmFtKHguc2hhcGUsICRkaW1zKTtcblxuICByZXR1cm4gYmFja2VuZC5ydW5XZWJHTFByb2dyYW0ocHJvZ3JhbSwgW3hdLCB4LmR0eXBlKTtcbn1cblxuZXhwb3J0IGNvbnN0IHJldmVyc2VDb25maWc6IEtlcm5lbENvbmZpZyA9IHtcbiAga2VybmVsTmFtZTogUmV2ZXJzZSxcbiAgYmFja2VuZE5hbWU6ICd3ZWJnbCcsXG4gIGtlcm5lbEZ1bmM6IHJldmVyc2UgYXMge30gYXMgS2VybmVsRnVuY1xufTtcbiJdfQ==","/**\n * @license\n * Copyright 2020 Google LLC. All Rights Reserved.\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n * =============================================================================\n */\nexport class RotateProgram {\n constructor(imageShape, fillValue) {\n this.variableNames = ['Image'];\n this.outputShape = [];\n this.customUniforms = [{ name: 'params', type: 'vec4' }];\n const imageHeight = imageShape[1];\n const imageWidth = imageShape[2];\n this.outputShape = imageShape;\n let fillSnippet = '';\n if (typeof fillValue === 'number') {\n fillSnippet = `float outputValue = ${fillValue.toFixed(2)};`;\n }\n else {\n fillSnippet = `\n vec3 fill = vec3(${fillValue.join(',')});\n float outputValue = fill[coords[3]];`;\n }\n this.userCode = `\n void main() {\n ivec4 coords = getOutputCoords();\n int x = coords[2];\n int y = coords[1];\n float coordXFloat = (float(x) - params[0]) * params[3] -\n (float(y) - params[1]) * params[2];\n float coordYFloat = (float(x) - params[0]) * params[2] +\n (float(y) - params[1]) * params[3];\n int coordX = int(round(coordXFloat + params[0]));\n int coordY = int(round(coordYFloat + params[1]));\n ${fillSnippet}\n if(coordX >= 0 && coordX < ${imageWidth} && coordY >= 0 && coordY < ${imageHeight}) {\n outputValue = getImage(coords[0], coordY, coordX, coords[3]);\n }\n setOutput(outputValue);\n }\n `;\n }\n}\n//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicm90YXRlX2dwdS5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uL3RmanMtYmFja2VuZC13ZWJnbC9zcmMvcm90YXRlX2dwdS50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQTs7Ozs7Ozs7Ozs7Ozs7O0dBZUc7QUFLSCxNQUFNLE9BQU8sYUFBYTtJQUt4QixZQUNJLFVBQTRDLEVBQzVDLFNBQTBDO1FBTjlDLGtCQUFhLEdBQUcsQ0FBQyxPQUFPLENBQUMsQ0FBQztRQUMxQixnQkFBVyxHQUFhLEVBQUUsQ0FBQztRQUUzQixtQkFBYyxHQUFHLENBQUMsRUFBQyxJQUFJLEVBQUUsUUFBUSxFQUFFLElBQUksRUFBRSxNQUFxQixFQUFDLENBQUMsQ0FBQztRQUkvRCxNQUFNLFdBQVcsR0FBRyxVQUFVLENBQUMsQ0FBQyxDQUFDLENBQUM7UUFDbEMsTUFBTSxVQUFVLEdBQUcsVUFBVSxDQUFDLENBQUMsQ0FBQyxDQUFDO1FBQ2pDLElBQUksQ0FBQyxXQUFXLEdBQUcsVUFBVSxDQUFDO1FBRTlCLElBQUksV0FBVyxHQUFHLEVBQUUsQ0FBQztRQUNyQixJQUFJLE9BQU8sU0FBUyxLQUFLLFFBQVEsRUFBRTtZQUNqQyxXQUFXLEdBQUcsdUJBQXVCLFNBQVMsQ0FBQyxPQUFPLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQztTQUM5RDthQUFNO1lBQ0wsV0FBVyxHQUFHOzJCQUNPLFNBQVMsQ0FBQyxJQUFJLENBQUMsR0FBRyxDQUFDOzZDQUNELENBQUM7U0FDekM7UUFFRCxJQUFJLENBQUMsUUFBUSxHQUFHOzs7Ozs7Ozs7OztZQVdSLFdBQVc7dUNBQ2dCLFVBQVUsK0JBQ3pDLFdBQVc7Ozs7O0tBS2QsQ0FBQztJQUNKLENBQUM7Q0FDRiIsInNvdXJjZXNDb250ZW50IjpbIi8qKlxuICogQGxpY2Vuc2VcbiAqIENvcHlyaWdodCAyMDIwIEdvb2dsZSBMTEMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuXG4gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgXCJMaWNlbnNlXCIpO1xuICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLlxuICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0XG4gKlxuICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wXG4gKlxuICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZVxuICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gXCJBUyBJU1wiIEJBU0lTLFxuICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuXG4gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kXG4gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS5cbiAqID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4gKi9cblxuaW1wb3J0IHtHUEdQVVByb2dyYW19IGZyb20gJy4vZ3BncHVfbWF0aCc7XG5pbXBvcnQge1VuaWZvcm1UeXBlfSBmcm9tICcuL3NoYWRlcl9jb21waWxlcic7XG5cbmV4cG9ydCBjbGFzcyBSb3RhdGVQcm9ncmFtIGltcGxlbWVudHMgR1BHUFVQcm9ncmFtIHtcbiAgdmFyaWFibGVOYW1lcyA9IFsnSW1hZ2UnXTtcbiAgb3V0cHV0U2hhcGU6IG51bWJlcltdID0gW107XG4gIHVzZXJDb2RlOiBzdHJpbmc7XG4gIGN1c3RvbVVuaWZvcm1zID0gW3tuYW1lOiAncGFyYW1zJywgdHlwZTogJ3ZlYzQnIGFzIFVuaWZvcm1UeXBlfV07XG4gIGNvbnN0cnVjdG9yKFxuICAgICAgaW1hZ2VTaGFwZTogW251bWJlciwgbnVtYmVyLCBudW1iZXIsIG51bWJlcl0sXG4gICAgICBmaWxsVmFsdWU6IG51bWJlcnxbbnVtYmVyLCBudW1iZXIsIG51bWJlcl0pIHtcbiAgICBjb25zdCBpbWFnZUhlaWdodCA9IGltYWdlU2hhcGVbMV07XG4gICAgY29uc3QgaW1hZ2VXaWR0aCA9IGltYWdlU2hhcGVbMl07XG4gICAgdGhpcy5vdXRwdXRTaGFwZSA9IGltYWdlU2hhcGU7XG5cbiAgICBsZXQgZmlsbFNuaXBwZXQgPSAnJztcbiAgICBpZiAodHlwZW9mIGZpbGxWYWx1ZSA9PT0gJ251bWJlcicpIHtcbiAgICAgIGZpbGxTbmlwcGV0ID0gYGZsb2F0IG91dHB1dFZhbHVlID0gJHtmaWxsVmFsdWUudG9GaXhlZCgyKX07YDtcbiAgICB9IGVsc2Uge1xuICAgICAgZmlsbFNuaXBwZXQgPSBgXG4gICAgICAgIHZlYzMgZmlsbCA9IHZlYzMoJHtmaWxsVmFsdWUuam9pbignLCcpfSk7XG4gICAgICAgIGZsb2F0IG91dHB1dFZhbHVlID0gZmlsbFtjb29yZHNbM11dO2A7XG4gICAgfVxuXG4gICAgdGhpcy51c2VyQ29kZSA9IGBcbiAgICAgICAgdm9pZCBtYWluKCkge1xuICAgICAgICAgIGl2ZWM0IGNvb3JkcyA9IGdldE91dHB1dENvb3JkcygpO1xuICAgICAgICAgIGludCB4ID0gY29vcmRzWzJdO1xuICAgICAgICAgIGludCB5ID0gY29vcmRzWzFdO1xuICAgICAgICAgIGZsb2F0IGNvb3JkWEZsb2F0ID0gKGZsb2F0KHgpIC0gcGFyYW1zWzBdKSAqIHBhcmFtc1szXSAtXG4gICAgICAgICAgICAoZmxvYXQoeSkgLSBwYXJhbXNbMV0pICogcGFyYW1zWzJdO1xuICAgICAgICAgIGZsb2F0IGNvb3JkWUZsb2F0ID0gKGZsb2F0KHgpIC0gcGFyYW1zWzBdKSAqIHBhcmFtc1syXSArXG4gICAgICAgICAgICAoZmxvYXQoeSkgLSBwYXJhbXNbMV0pICogcGFyYW1zWzNdO1xuICAgICAgICAgIGludCBjb29yZFggPSBpbnQocm91bmQoY29vcmRYRmxvYXQgKyBwYXJhbXNbMF0pKTtcbiAgICAgICAgICBpbnQgY29vcmRZID0gaW50KHJvdW5kKGNvb3JkWUZsb2F0ICsgcGFyYW1zWzFdKSk7XG4gICAgICAgICAgJHtmaWxsU25pcHBldH1cbiAgICAgICAgICBpZihjb29yZFggPj0gMCAmJiBjb29yZFggPCAke2ltYWdlV2lkdGh9ICYmIGNvb3JkWSA+PSAwICYmIGNvb3JkWSA8ICR7XG4gICAgICAgIGltYWdlSGVpZ2h0fSkge1xuICAgICAgICAgICAgb3V0cHV0VmFsdWUgPSBnZXRJbWFnZShjb29yZHNbMF0sIGNvb3JkWSwgY29vcmRYLCBjb29yZHNbM10pO1xuICAgICAgICAgIH1cbiAgICAgICAgICBzZXRPdXRwdXQob3V0cHV0VmFsdWUpO1xuICAgICAgICB9XG4gICAgYDtcbiAgfVxufVxuIl19","/**\n * @license\n * Copyright 2020 Google LLC. All Rights Reserved.\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n * =============================================================================\n */\nimport { backend_util } from '@tensorflow/tfjs-core';\nimport { RotateWithOffset } from '@tensorflow/tfjs-core';\nimport { RotateProgram } from '../rotate_gpu';\nexport const rotateWithOffsetConfig = {\n kernelName: RotateWithOffset,\n backendName: 'webgl',\n kernelFunc: ({ inputs, attrs, backend }) => {\n const { image } = inputs;\n const { radians, fillValue, center } = attrs;\n const webglBackend = backend;\n const program = new RotateProgram(image.shape, fillValue);\n const [centerX, centerY] = backend_util.getImageCenter(center, image.shape[1], image.shape[2]);\n const customValues = [[centerX, centerY, Math.sin(radians), Math.cos(radians)]];\n const output = webglBackend.runWebGLProgram(program, [image], image.dtype, customValues);\n return output;\n }\n};\n//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiUm90YXRlV2l0aE9mZnNldC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uLy4uL3RmanMtYmFja2VuZC13ZWJnbC9zcmMva2VybmVscy9Sb3RhdGVXaXRoT2Zmc2V0LnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBOzs7Ozs7Ozs7Ozs7Ozs7R0FlRztBQUVILE9BQU8sRUFBQyxZQUFZLEVBQXlCLE1BQU0sdUJBQXVCLENBQUM7QUFDM0UsT0FBTyxFQUFDLGdCQUFnQixFQUFnRCxNQUFNLHVCQUF1QixDQUFDO0FBR3RHLE9BQU8sRUFBQyxhQUFhLEVBQUMsTUFBTSxlQUFlLENBQUM7QUFFNUMsTUFBTSxDQUFDLE1BQU0sc0JBQXNCLEdBQWlCO0lBQ2xELFVBQVUsRUFBRSxnQkFBZ0I7SUFDNUIsV0FBVyxFQUFFLE9BQU87SUFDcEIsVUFBVSxFQUFFLENBQUMsRUFBQyxNQUFNLEVBQUUsS0FBSyxFQUFFLE9BQU8sRUFBQyxFQUFFLEVBQUU7UUFDdkMsTUFBTSxFQUFDLEtBQUssRUFBQyxHQUFHLE1BQWdDLENBQUM7UUFDakQsTUFBTSxFQUFDLE9BQU8sRUFBRSxTQUFTLEVBQUUsTUFBTSxFQUFDLEdBQUcsS0FBb0MsQ0FBQztRQUMxRSxNQUFNLFlBQVksR0FBRyxPQUEyQixDQUFDO1FBRWpELE1BQU0sT0FBTyxHQUFHLElBQUksYUFBYSxDQUFFLEtBQWtCLENBQUMsS0FBSyxFQUFFLFNBQVMsQ0FBQyxDQUFDO1FBQ3hFLE1BQU0sQ0FBQyxPQUFPLEVBQUUsT0FBTyxDQUFDLEdBQ3BCLFlBQVksQ0FBQyxjQUFjLENBQUMsTUFBTSxFQUFFLEtBQUssQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDLEVBQUUsS0FBSyxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDO1FBQ3hFLE1BQU0sWUFBWSxHQUNkLENBQUMsQ0FBQyxPQUFPLEVBQUUsT0FBTyxFQUFFLElBQUksQ0FBQyxHQUFHLENBQUMsT0FBTyxDQUFDLEVBQUUsSUFBSSxDQUFDLEdBQUcsQ0FBQyxPQUFPLENBQUMsQ0FBQyxDQUFDLENBQUM7UUFDL0QsTUFBTSxNQUFNLEdBQUcsWUFBWSxDQUFDLGVBQWUsQ0FDdkMsT0FBTyxFQUFFLENBQUMsS0FBSyxDQUFDLEVBQUUsS0FBSyxDQUFDLEtBQUssRUFBRSxZQUFZLENBQUMsQ0FBQztRQUNqRCxPQUFPLE1BQU0sQ0FBQztJQUNoQixDQUFDO0NBQ0YsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbIi8qKlxuICogQGxpY2Vuc2VcbiAqIENvcHlyaWdodCAyMDIwIEdvb2dsZSBMTEMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuXG4gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgXCJMaWNlbnNlXCIpO1xuICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLlxuICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0XG4gKlxuICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wXG4gKlxuICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZVxuICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gXCJBUyBJU1wiIEJBU0lTLFxuICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuXG4gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kXG4gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS5cbiAqID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4gKi9cblxuaW1wb3J0IHtiYWNrZW5kX3V0aWwsIEtlcm5lbENvbmZpZywgVGVuc29yNER9IGZyb20gJ0B0ZW5zb3JmbG93L3RmanMtY29yZSc7XG5pbXBvcnQge1JvdGF0ZVdpdGhPZmZzZXQsIFJvdGF0ZVdpdGhPZmZzZXRBdHRycywgUm90YXRlV2l0aE9mZnNldElucHV0c30gZnJvbSAnQHRlbnNvcmZsb3cvdGZqcy1jb3JlJztcblxuaW1wb3J0IHtNYXRoQmFja2VuZFdlYkdMfSBmcm9tICcuLi9iYWNrZW5kX3dlYmdsJztcbmltcG9ydCB7Um90YXRlUHJvZ3JhbX0gZnJvbSAnLi4vcm90YXRlX2dwdSc7XG5cbmV4cG9ydCBjb25zdCByb3RhdGVXaXRoT2Zmc2V0Q29uZmlnOiBLZXJuZWxDb25maWcgPSB7XG4gIGtlcm5lbE5hbWU6IFJvdGF0ZVdpdGhPZmZzZXQsXG4gIGJhY2tlbmROYW1lOiAnd2ViZ2wnLFxuICBrZXJuZWxGdW5jOiAoe2lucHV0cywgYXR0cnMsIGJhY2tlbmR9KSA9PiB7XG4gICAgY29uc3Qge2ltYWdlfSA9IGlucHV0cyBhcyBSb3RhdGVXaXRoT2Zmc2V0SW5wdXRzO1xuICAgIGNvbnN0IHtyYWRpYW5zLCBmaWxsVmFsdWUsIGNlbnRlcn0gPSBhdHRycyBhcyB7fSBhcyBSb3RhdGVXaXRoT2Zmc2V0QXR0cnM7XG4gICAgY29uc3Qgd2ViZ2xCYWNrZW5kID0gYmFja2VuZCBhcyBNYXRoQmFja2VuZFdlYkdMO1xuXG4gICAgY29uc3QgcHJvZ3JhbSA9IG5ldyBSb3RhdGVQcm9ncmFtKChpbWFnZSBhcyBUZW5zb3I0RCkuc2hhcGUsIGZpbGxWYWx1ZSk7XG4gICAgY29uc3QgW2NlbnRlclgsIGNlbnRlclldID1cbiAgICAgICAgYmFja2VuZF91dGlsLmdldEltYWdlQ2VudGVyKGNlbnRlciwgaW1hZ2Uuc2hhcGVbMV0sIGltYWdlLnNoYXBlWzJdKTtcbiAgICBjb25zdCBjdXN0b21WYWx1ZXMgPVxuICAgICAgICBbW2NlbnRlclgsIGNlbnRlclksIE1hdGguc2luKHJhZGlhbnMpLCBNYXRoLmNvcyhyYWRpYW5zKV1dO1xuICAgIGNvbnN0IG91dHB1dCA9IHdlYmdsQmFja2VuZC5ydW5XZWJHTFByb2dyYW0oXG4gICAgICAgIHByb2dyYW0sIFtpbWFnZV0sIGltYWdlLmR0eXBlLCBjdXN0b21WYWx1ZXMpO1xuICAgIHJldHVybiBvdXRwdXQ7XG4gIH1cbn07XG4iXX0=","/**\n * @license\n * Copyright 2020 Google LLC. All Rights Reserved.\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n * =============================================================================\n */\nimport { Round } from '@tensorflow/tfjs-core';\nimport { unaryKernelFunc } from '../kernel_utils/kernel_funcs_utils';\nconst ROUND = `\n // OpenGL ES does not support round function.\n // The algorithm is based on banker's rounding.\n float base = floor(x);\n if ((x - base) < 0.5) {\n return floor(x);\n } else if ((x - base) > 0.5) {\n return ceil(x);\n } else {\n if (mod(base, 2.0) == 0.0) {\n return base;\n } else {\n return base + 1.0;\n }\n }\n`;\nexport const round = unaryKernelFunc({ opSnippet: ROUND });\nexport const roundConfig = {\n kernelName: Round,\n backendName: 'webgl',\n kernelFunc: round,\n};\n//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiUm91bmQuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi8uLi90ZmpzLWJhY2tlbmQtd2ViZ2wvc3JjL2tlcm5lbHMvUm91bmQudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUE7Ozs7Ozs7Ozs7Ozs7OztHQWVHO0FBRUgsT0FBTyxFQUFlLEtBQUssRUFBQyxNQUFNLHVCQUF1QixDQUFDO0FBQzFELE9BQU8sRUFBQyxlQUFlLEVBQUMsTUFBTSxvQ0FBb0MsQ0FBQztBQUVuRSxNQUFNLEtBQUssR0FBRzs7Ozs7Ozs7Ozs7Ozs7O0NBZWIsQ0FBQztBQUVGLE1BQU0sQ0FBQyxNQUFNLEtBQUssR0FBRyxlQUFlLENBQUMsRUFBQyxTQUFTLEVBQUUsS0FBSyxFQUFDLENBQUMsQ0FBQztBQUV6RCxNQUFNLENBQUMsTUFBTSxXQUFXLEdBQWlCO0lBQ3ZDLFVBQVUsRUFBRSxLQUFLO0lBQ2pCLFdBQVcsRUFBRSxPQUFPO0lBQ3BCLFVBQVUsRUFBRSxLQUFLO0NBQ2xCLENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyIvKipcbiAqIEBsaWNlbnNlXG4gKiBDb3B5cmlnaHQgMjAyMCBHb29nbGUgTExDLiBBbGwgUmlnaHRzIFJlc2VydmVkLlxuICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlIFwiTGljZW5zZVwiKTtcbiAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS5cbiAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdFxuICpcbiAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMFxuICpcbiAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmVcbiAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuIFwiQVMgSVNcIiBCQVNJUyxcbiAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLlxuICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZFxuICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuXG4gKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuICovXG5cbmltcG9ydCB7S2VybmVsQ29uZmlnLCBSb3VuZH0gZnJvbSAnQHRlbnNvcmZsb3cvdGZqcy1jb3JlJztcbmltcG9ydCB7dW5hcnlLZXJuZWxGdW5jfSBmcm9tICcuLi9rZXJuZWxfdXRpbHMva2VybmVsX2Z1bmNzX3V0aWxzJztcblxuY29uc3QgUk9VTkQgPSBgXG4gIC8vIE9wZW5HTCBFUyBkb2VzIG5vdCBzdXBwb3J0IHJvdW5kIGZ1bmN0aW9uLlxuICAvLyBUaGUgYWxnb3JpdGhtIGlzIGJhc2VkIG9uIGJhbmtlcidzIHJvdW5kaW5nLlxuICBmbG9hdCBiYXNlID0gZmxvb3IoeCk7XG4gIGlmICgoeCAtIGJhc2UpIDwgMC41KSB7XG4gICAgcmV0dXJuIGZsb29yKHgpO1xuICB9IGVsc2UgaWYgKCh4IC0gYmFzZSkgPiAwLjUpIHtcbiAgICByZXR1cm4gY2VpbCh4KTtcbiAgfSBlbHNlIHtcbiAgICBpZiAobW9kKGJhc2UsIDIuMCkgPT0gMC4wKSB7XG4gICAgICByZXR1cm4gYmFzZTtcbiAgICB9IGVsc2Uge1xuICAgICAgcmV0dXJuIGJhc2UgKyAxLjA7XG4gICAgfVxuICB9XG5gO1xuXG5leHBvcnQgY29uc3Qgcm91bmQgPSB1bmFyeUtlcm5lbEZ1bmMoe29wU25pcHBldDogUk9VTkR9KTtcblxuZXhwb3J0IGNvbnN0IHJvdW5kQ29uZmlnOiBLZXJuZWxDb25maWcgPSB7XG4gIGtlcm5lbE5hbWU6IFJvdW5kLFxuICBiYWNrZW5kTmFtZTogJ3dlYmdsJyxcbiAga2VybmVsRnVuYzogcm91bmQsXG59O1xuIl19","/**\n * @license\n * Copyright 2020 Google LLC. All Rights Reserved.\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n * =============================================================================\n */\nimport { Rsqrt } from '@tensorflow/tfjs-core';\nimport { unaryKernelFunc } from '../kernel_utils/kernel_funcs_utils';\nimport { rsqrtImplCPU } from '../kernel_utils/shared';\nconst RSQRT = `return inversesqrt(x);`;\nexport const rsqrt = unaryKernelFunc({ opSnippet: RSQRT, cpuKernelImpl: rsqrtImplCPU });\nexport const rsqrtConfig = {\n kernelName: Rsqrt,\n backendName: 'webgl',\n kernelFunc: rsqrt\n};\n//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiUnNxcnQuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi8uLi90ZmpzLWJhY2tlbmQtd2ViZ2wvc3JjL2tlcm5lbHMvUnNxcnQudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUE7Ozs7Ozs7Ozs7Ozs7OztHQWVHO0FBRUgsT0FBTyxFQUEyQixLQUFLLEVBQUMsTUFBTSx1QkFBdUIsQ0FBQztBQUN0RSxPQUFPLEVBQUMsZUFBZSxFQUFDLE1BQU0sb0NBQW9DLENBQUM7QUFDbkUsT0FBTyxFQUFDLFlBQVksRUFBQyxNQUFNLHdCQUF3QixDQUFDO0FBRXBELE1BQU0sS0FBSyxHQUFHLHdCQUF3QixDQUFDO0FBRXZDLE1BQU0sQ0FBQyxNQUFNLEtBQUssR0FDZCxlQUFlLENBQUMsRUFBQyxTQUFTLEVBQUUsS0FBSyxFQUFFLGFBQWEsRUFBRSxZQUFZLEVBQUMsQ0FBQyxDQUFDO0FBRXJFLE1BQU0sQ0FBQyxNQUFNLFdBQVcsR0FBaUI7SUFDdkMsVUFBVSxFQUFFLEtBQUs7SUFDakIsV0FBVyxFQUFFLE9BQU87SUFDcEIsVUFBVSxFQUFFLEtBQXlCO0NBQ3RDLENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyIvKipcbiAqIEBsaWNlbnNlXG4gKiBDb3B5cmlnaHQgMjAyMCBHb29nbGUgTExDLiBBbGwgUmlnaHRzIFJlc2VydmVkLlxuICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlIFwiTGljZW5zZVwiKTtcbiAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS5cbiAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdFxuICpcbiAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMFxuICpcbiAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmVcbiAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuIFwiQVMgSVNcIiBCQVNJUyxcbiAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLlxuICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZFxuICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuXG4gKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuICovXG5cbmltcG9ydCB7S2VybmVsQ29uZmlnLCBLZXJuZWxGdW5jLCBSc3FydH0gZnJvbSAnQHRlbnNvcmZsb3cvdGZqcy1jb3JlJztcbmltcG9ydCB7dW5hcnlLZXJuZWxGdW5jfSBmcm9tICcuLi9rZXJuZWxfdXRpbHMva2VybmVsX2Z1bmNzX3V0aWxzJztcbmltcG9ydCB7cnNxcnRJbXBsQ1BVfSBmcm9tICcuLi9rZXJuZWxfdXRpbHMvc2hhcmVkJztcblxuY29uc3QgUlNRUlQgPSBgcmV0dXJuIGludmVyc2VzcXJ0KHgpO2A7XG5cbmV4cG9ydCBjb25zdCByc3FydCA9XG4gICAgdW5hcnlLZXJuZWxGdW5jKHtvcFNuaXBwZXQ6IFJTUVJULCBjcHVLZXJuZWxJbXBsOiByc3FydEltcGxDUFV9KTtcblxuZXhwb3J0IGNvbnN0IHJzcXJ0Q29uZmlnOiBLZXJuZWxDb25maWcgPSB7XG4gIGtlcm5lbE5hbWU6IFJzcXJ0LFxuICBiYWNrZW5kTmFtZTogJ3dlYmdsJyxcbiAga2VybmVsRnVuYzogcnNxcnQgYXMge30gYXMgS2VybmVsRnVuY1xufTtcbiJdfQ==","/**\n * @license\n * Copyright 2018 Google LLC. All Rights Reserved.\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n * =============================================================================\n */\nimport { getCoordsDataType } from './shader_compiler';\nexport class ScatterProgram {\n constructor(updateSize, sliceDim, indicesRank, updatesRank, strides, shape, summingDupeIndex = true) {\n this.variableNames = ['updates', 'indices', 'defaultValue'];\n this.outputShape = shape;\n const stridesType = getCoordsDataType(strides.length);\n const dtype = getCoordsDataType(shape.length);\n let indicesString = '';\n if (indicesRank === 1) {\n indicesString = 'i';\n }\n else if (indicesRank === 2) {\n indicesString = 'i, j';\n }\n const indicesSnippet = `getIndices(${indicesString})`;\n let updatesString = '';\n if (updatesRank === 1) {\n updatesString = 'i';\n }\n else if (updatesRank === 2) {\n updatesString = 'i, coords[1]';\n }\n const updatesSnippet = `getUpdates(${updatesString})`;\n const strideString = sliceDim > 1 ? 'strides[j]' : 'strides';\n this.userCode = `\n ${stridesType} strides = ${stridesType}(${strides});\n\n void main() {\n ${dtype} coords = getOutputCoords();\n float sum = 0.0;\n bool found = false;\n for (int i = 0; i < ${updateSize}; i++) {\n int flattenedIndex = 0;\n for (int j = 0; j < ${sliceDim}; j++) {\n int index = round(${indicesSnippet});\n flattenedIndex += index * ${strideString};\n }\n if (flattenedIndex == coords[0]) {\n sum += ${updatesSnippet};\n found = true;\n }\n }\n setOutput(mix(getDefaultValue(), sum, float(found)));\n }\n `;\n }\n}\n//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic2NhdHRlcl9ncHUuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi90ZmpzLWJhY2tlbmQtd2ViZ2wvc3JjL3NjYXR0ZXJfZ3B1LnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBOzs7Ozs7Ozs7Ozs7Ozs7R0FlRztBQUdILE9BQU8sRUFBQyxpQkFBaUIsRUFBQyxNQUFNLG1CQUFtQixDQUFDO0FBRXBELE1BQU0sT0FBTyxjQUFjO0lBS3pCLFlBQ0ksVUFBa0IsRUFBRSxRQUFnQixFQUFFLFdBQW1CLEVBQ3pELFdBQW1CLEVBQUUsT0FBaUIsRUFBRSxLQUFlLEVBQ3ZELGdCQUFnQixHQUFHLElBQUk7UUFQM0Isa0JBQWEsR0FBRyxDQUFDLFNBQVMsRUFBRSxTQUFTLEVBQUUsY0FBYyxDQUFDLENBQUM7UUFRckQsSUFBSSxDQUFDLFdBQVcsR0FBRyxLQUFLLENBQUM7UUFDekIsTUFBTSxXQUFXLEdBQUcsaUJBQWlCLENBQUMsT0FBTyxDQUFDLE1BQU0sQ0FBQyxDQUFDO1FBQ3RELE1BQU0sS0FBSyxHQUFHLGlCQUFpQixDQUFDLEtBQUssQ0FBQyxNQUFNLENBQUMsQ0FBQztRQUM5QyxJQUFJLGFBQWEsR0FBRyxFQUFFLENBQUM7UUFDdkIsSUFBSSxXQUFXLEtBQUssQ0FBQyxFQUFFO1lBQ3JCLGFBQWEsR0FBRyxHQUFHLENBQUM7U0FDckI7YUFBTSxJQUFJLFdBQVcsS0FBSyxDQUFDLEVBQUU7WUFDNUIsYUFBYSxHQUFHLE1BQU0sQ0FBQztTQUN4QjtRQUNELE1BQU0sY0FBYyxHQUFHLGNBQWMsYUFBYSxHQUFHLENBQUM7UUFFdEQsSUFBSSxhQUFhLEdBQUcsRUFBRSxDQUFDO1FBQ3ZCLElBQUksV0FBVyxLQUFLLENBQUMsRUFBRTtZQUNyQixhQUFhLEdBQUcsR0FBRyxDQUFDO1NBQ3JCO2FBQU0sSUFBSSxXQUFXLEtBQUssQ0FBQyxFQUFFO1lBQzVCLGFBQWEsR0FBRyxjQUFjLENBQUM7U0FDaEM7UUFDRCxNQUFNLGNBQWMsR0FBRyxjQUFjLGFBQWEsR0FBRyxDQUFDO1FBRXRELE1BQU0sWUFBWSxHQUFHLFFBQVEsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLFlBQVksQ0FBQyxDQUFDLENBQUMsU0FBUyxDQUFDO1FBQzdELElBQUksQ0FBQyxRQUFRLEdBQUc7VUFDVixXQUFXLGNBQWMsV0FBVyxJQUFJLE9BQU87OztZQUc3QyxLQUFLOzs7Z0NBR2UsVUFBVTs7a0NBRVIsUUFBUTtrQ0FDUixjQUFjOzBDQUNOLFlBQVk7Ozt1QkFHL0IsY0FBYzs7Ozs7O09BTTlCLENBQUM7SUFDTixDQUFDO0NBQ0YiLCJzb3VyY2VzQ29udGVudCI6WyIvKipcbiAqIEBsaWNlbnNlXG4gKiBDb3B5cmlnaHQgMjAxOCBHb29nbGUgTExDLiBBbGwgUmlnaHRzIFJlc2VydmVkLlxuICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlIFwiTGljZW5zZVwiKTtcbiAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS5cbiAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdFxuICpcbiAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMFxuICpcbiAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmVcbiAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuIFwiQVMgSVNcIiBCQVNJUyxcbiAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLlxuICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZFxuICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuXG4gKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuICovXG5cbmltcG9ydCB7R1BHUFVQcm9ncmFtfSBmcm9tICcuL2dwZ3B1X21hdGgnO1xuaW1wb3J0IHtnZXRDb29yZHNEYXRhVHlwZX0gZnJvbSAnLi9zaGFkZXJfY29tcGlsZXInO1xuXG5leHBvcnQgY2xhc3MgU2NhdHRlclByb2dyYW0gaW1wbGVtZW50cyBHUEdQVVByb2dyYW0ge1xuICB2YXJpYWJsZU5hbWVzID0gWyd1cGRhdGVzJywgJ2luZGljZXMnLCAnZGVmYXVsdFZhbHVlJ107XG4gIG91dHB1dFNoYXBlOiBudW1iZXJbXTtcbiAgdXNlckNvZGU6IHN0cmluZztcblxuICBjb25zdHJ1Y3RvcihcbiAgICAgIHVwZGF0ZVNpemU6IG51bWJlciwgc2xpY2VEaW06IG51bWJlciwgaW5kaWNlc1Jhbms6IG51bWJlcixcbiAgICAgIHVwZGF0ZXNSYW5rOiBudW1iZXIsIHN0cmlkZXM6IG51bWJlcltdLCBzaGFwZTogbnVtYmVyW10sXG4gICAgICBzdW1taW5nRHVwZUluZGV4ID0gdHJ1ZSkge1xuICAgIHRoaXMub3V0cHV0U2hhcGUgPSBzaGFwZTtcbiAgICBjb25zdCBzdHJpZGVzVHlwZSA9IGdldENvb3Jkc0RhdGFUeXBlKHN0cmlkZXMubGVuZ3RoKTtcbiAgICBjb25zdCBkdHlwZSA9IGdldENvb3Jkc0RhdGFUeXBlKHNoYXBlLmxlbmd0aCk7XG4gICAgbGV0IGluZGljZXNTdHJpbmcgPSAnJztcbiAgICBpZiAoaW5kaWNlc1JhbmsgPT09IDEpIHtcbiAgICAgIGluZGljZXNTdHJpbmcgPSAnaSc7XG4gICAgfSBlbHNlIGlmIChpbmRpY2VzUmFuayA9PT0gMikge1xuICAgICAgaW5kaWNlc1N0cmluZyA9ICdpLCBqJztcbiAgICB9XG4gICAgY29uc3QgaW5kaWNlc1NuaXBwZXQgPSBgZ2V0SW5kaWNlcygke2luZGljZXNTdHJpbmd9KWA7XG5cbiAgICBsZXQgdXBkYXRlc1N0cmluZyA9ICcnO1xuICAgIGlmICh1cGRhdGVzUmFuayA9PT0gMSkge1xuICAgICAgdXBkYXRlc1N0cmluZyA9ICdpJztcbiAgICB9IGVsc2UgaWYgKHVwZGF0ZXNSYW5rID09PSAyKSB7XG4gICAgICB1cGRhdGVzU3RyaW5nID0gJ2ksIGNvb3Jkc1sxXSc7XG4gICAgfVxuICAgIGNvbnN0IHVwZGF0ZXNTbmlwcGV0ID0gYGdldFVwZGF0ZXMoJHt1cGRhdGVzU3RyaW5nfSlgO1xuXG4gICAgY29uc3Qgc3RyaWRlU3RyaW5nID0gc2xpY2VEaW0gPiAxID8gJ3N0cmlkZXNbal0nIDogJ3N0cmlkZXMnO1xuICAgIHRoaXMudXNlckNvZGUgPSBgXG4gICAgICAgICR7c3RyaWRlc1R5cGV9IHN0cmlkZXMgPSAke3N0cmlkZXNUeXBlfSgke3N0cmlkZXN9KTtcblxuICAgICAgICB2b2lkIG1haW4oKSB7XG4gICAgICAgICAgJHtkdHlwZX0gY29vcmRzID0gZ2V0T3V0cHV0Q29vcmRzKCk7XG4gICAgICAgICAgZmxvYXQgc3VtID0gMC4wO1xuICAgICAgICAgIGJvb2wgZm91bmQgPSBmYWxzZTtcbiAgICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8ICR7dXBkYXRlU2l6ZX07IGkrKykge1xuICAgICAgICAgICAgaW50IGZsYXR0ZW5lZEluZGV4ID0gMDtcbiAgICAgICAgICAgIGZvciAoaW50IGogPSAwOyBqIDwgJHtzbGljZURpbX07IGorKykge1xuICAgICAgICAgICAgICBpbnQgaW5kZXggPSByb3VuZCgke2luZGljZXNTbmlwcGV0fSk7XG4gICAgICAgICAgICAgIGZsYXR0ZW5lZEluZGV4ICs9IGluZGV4ICogJHtzdHJpZGVTdHJpbmd9O1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgaWYgKGZsYXR0ZW5lZEluZGV4ID09IGNvb3Jkc1swXSkge1xuICAgICAgICAgICAgICBzdW0gKz0gJHt1cGRhdGVzU25pcHBldH07XG4gICAgICAgICAgICAgIGZvdW5kID0gdHJ1ZTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9XG4gICAgICAgICAgc2V0T3V0cHV0KG1peChnZXREZWZhdWx0VmFsdWUoKSwgc3VtLCBmbG9hdChmb3VuZCkpKTtcbiAgICAgICAgfVxuICAgICAgYDtcbiAgfVxufVxuIl19","/**\n * @license\n * Copyright 2020 Google LLC. All Rights Reserved.\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n * =============================================================================\n */\nimport { backend_util, ScatterNd } from '@tensorflow/tfjs-core';\nimport { ScatterProgram } from '../scatter_gpu';\nimport { reshape } from './Reshape';\nexport function scatterNd(args) {\n const { inputs, backend, attrs } = args;\n const { indices, updates } = inputs;\n const { shape } = attrs;\n const { sliceRank, numUpdates, sliceSize, strides, outputSize } = backend_util.calculateShapes(updates, indices, shape);\n const flattenShape = [outputSize / sliceSize, sliceSize];\n if (outputSize === 0) {\n return backend.makeTensorInfo(shape, indices.dtype);\n }\n const flattenIndices = reshape({ inputs: { x: indices }, backend, attrs: { shape: [numUpdates, sliceRank] } });\n const flattenX = reshape({ inputs: { x: updates }, backend, attrs: { shape: [numUpdates, sliceSize] } });\n const defaultValue = backend.makeTensorInfo([], 'float32', new Float32Array([0])); // scalar(0)\n const program = new ScatterProgram(numUpdates, sliceRank, flattenIndices.shape.length, flattenX.shape.length, strides, flattenShape);\n const res = backend.runWebGLProgram(program, [flattenX, flattenIndices, defaultValue], flattenX.dtype);\n const reshaped = reshape({ inputs: { x: res }, backend, attrs: { shape } });\n backend.disposeIntermediateTensorInfo(flattenIndices);\n backend.disposeIntermediateTensorInfo(flattenX);\n backend.disposeIntermediateTensorInfo(res);\n backend.disposeIntermediateTensorInfo(defaultValue);\n return reshaped;\n}\nexport const scatterNdConfig = {\n kernelName: ScatterNd,\n backendName: 'webgl',\n kernelFunc: scatterNd\n};\n//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiU2NhdHRlck5kLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vLi4vdGZqcy1iYWNrZW5kLXdlYmdsL3NyYy9rZXJuZWxzL1NjYXR0ZXJOZC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQTs7Ozs7Ozs7Ozs7Ozs7O0dBZUc7QUFFSCxPQUFPLEVBQUMsWUFBWSxFQUE0QixTQUFTLEVBQThDLE1BQU0sdUJBQXVCLENBQUM7QUFHckksT0FBTyxFQUFDLGNBQWMsRUFBQyxNQUFNLGdCQUFnQixDQUFDO0FBQzlDLE9BQU8sRUFBQyxPQUFPLEVBQUMsTUFBTSxXQUFXLENBQUM7QUFFbEMsTUFBTSxVQUFVLFNBQVMsQ0FBQyxJQUl6QjtJQUNDLE1BQU0sRUFBQyxNQUFNLEVBQUUsT0FBTyxFQUFFLEtBQUssRUFBQyxHQUFHLElBQUksQ0FBQztJQUN0QyxNQUFNLEVBQUMsT0FBTyxFQUFFLE9BQU8sRUFBQyxHQUFHLE1BQU0sQ0FBQztJQUNsQyxNQUFNLEVBQUMsS0FBSyxFQUFDLEdBQUcsS0FBSyxDQUFDO0lBRXRCLE1BQU0sRUFBQyxTQUFTLEVBQUUsVUFBVSxFQUFFLFNBQVMsRUFBRSxPQUFPLEVBQUUsVUFBVSxFQUFDLEdBQ3pELFlBQVksQ0FBQyxlQUFlLENBQUMsT0FBTyxFQUFFLE9BQU8sRUFBRSxLQUFLLENBQUMsQ0FBQztJQUUxRCxNQUFNLFlBQVksR0FBRyxDQUFDLFVBQVUsR0FBRyxTQUFTLEVBQUUsU0FBUyxDQUFDLENBQUM7SUFFekQsSUFBSSxVQUFVLEtBQUssQ0FBQyxFQUFFO1FBQ3BCLE9BQU8sT0FBTyxDQUFDLGNBQWMsQ0FBQyxLQUFLLEVBQUUsT0FBTyxDQUFDLEtBQUssQ0FBQyxDQUFDO0tBQ3JEO0lBRUQsTUFBTSxjQUFjLEdBQUcsT0FBTyxDQUMxQixFQUFDLE1BQU0sRUFBRSxFQUFDLENBQUMsRUFBRSxPQUFPLEVBQUMsRUFBRSxPQUFPLEVBQUUsS0FBSyxFQUFFLEVBQUMsS0FBSyxFQUFFLENBQUMsVUFBVSxFQUFFLFNBQVMsQ0FBQyxFQUFDLEVBQUMsQ0FBQyxDQUFDO0lBQzlFLE1BQU0sUUFBUSxHQUFHLE9BQU8sQ0FDcEIsRUFBQyxNQUFNLEVBQUUsRUFBQyxDQUFDLEVBQUUsT0FBTyxFQUFDLEVBQUUsT0FBTyxFQUFFLEtBQUssRUFBRSxFQUFDLEtBQUssRUFBRSxDQUFDLFVBQVUsRUFBRSxTQUFTLENBQUMsRUFBQyxFQUFDLENBQUMsQ0FBQztJQUU5RSxNQUFNLFlBQVksR0FBRyxPQUFPLENBQUMsY0FBYyxDQUN2QyxFQUFFLEVBQUUsU0FBUyxFQUFFLElBQUksWUFBWSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUUsWUFBWTtJQUN4RCxNQUFNLE9BQU8sR0FBRyxJQUFJLGNBQWMsQ0FDOUIsVUFBVSxFQUFFLFNBQVMsRUFBRSxjQUFjLENBQUMsS0FBSyxDQUFDLE1BQU0sRUFBRSxRQUFRLENBQUMsS0FBSyxDQUFDLE1BQU0sRUFDekUsT0FBTyxFQUFFLFlBQVksQ0FBQyxDQUFDO0lBQzNCLE1BQU0sR0FBRyxHQUFHLE9BQU8sQ0FBQyxlQUFlLENBQy9CLE9BQU8sRUFBRSxDQUFDLFFBQVEsRUFBRSxjQUFjLEVBQUUsWUFBWSxDQUFDLEVBQUUsUUFBUSxDQUFDLEtBQUssQ0FBQyxDQUFDO0lBRXZFLE1BQU0sUUFBUSxHQUFHLE9BQU8sQ0FBQyxFQUFDLE1BQU0sRUFBRSxFQUFDLENBQUMsRUFBRSxHQUFHLEVBQUMsRUFBRSxPQUFPLEVBQUUsS0FBSyxFQUFFLEVBQUMsS0FBSyxFQUFDLEVBQUMsQ0FBQyxDQUFDO0lBRXRFLE9BQU8sQ0FBQyw2QkFBNkIsQ0FBQyxjQUFjLENBQUMsQ0FBQztJQUN0RCxPQUFPLENBQUMsNkJBQTZCLENBQUMsUUFBUSxDQUFDLENBQUM7SUFDaEQsT0FBTyxDQUFDLDZCQUE2QixDQUFDLEdBQUcsQ0FBQyxDQUFDO0lBQzNDLE9BQU8sQ0FBQyw2QkFBNkIsQ0FBQyxZQUFZLENBQUMsQ0FBQztJQUVwRCxPQUFPLFFBQVEsQ0FBQztBQUNsQixDQUFDO0FBRUQsTUFBTSxDQUFDLE1BQU0sZUFBZSxHQUFpQjtJQUMzQyxVQUFVLEVBQUUsU0FBUztJQUNyQixXQUFXLEVBQUUsT0FBTztJQUNwQixVQUFVLEVBQUUsU0FBNkI7Q0FDMUMsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbIi8qKlxuICogQGxpY2Vuc2VcbiAqIENvcHlyaWdodCAyMDIwIEdvb2dsZSBMTEMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuXG4gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgXCJMaWNlbnNlXCIpO1xuICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLlxuICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0XG4gKlxuICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wXG4gKlxuICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZVxuICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gXCJBUyBJU1wiIEJBU0lTLFxuICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuXG4gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kXG4gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS5cbiAqID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4gKi9cblxuaW1wb3J0IHtiYWNrZW5kX3V0aWwsIEtlcm5lbENvbmZpZywgS2VybmVsRnVuYywgU2NhdHRlck5kLCBTY2F0dGVyTmRBdHRycywgU2NhdHRlck5kSW5wdXRzLCBUZW5zb3JJbmZvfSBmcm9tICdAdGVuc29yZmxvdy90ZmpzLWNvcmUnO1xuXG5pbXBvcnQge01hdGhCYWNrZW5kV2ViR0x9IGZyb20gJy4uL2JhY2tlbmRfd2ViZ2wnO1xuaW1wb3J0IHtTY2F0dGVyUHJvZ3JhbX0gZnJvbSAnLi4vc2NhdHRlcl9ncHUnO1xuaW1wb3J0IHtyZXNoYXBlfSBmcm9tICcuL1Jlc2hhcGUnO1xuXG5leHBvcnQgZnVuY3Rpb24gc2NhdHRlck5kKGFyZ3M6IHtcbiAgaW5wdXRzOiBTY2F0dGVyTmRJbnB1dHMsXG4gIGJhY2tlbmQ6IE1hdGhCYWNrZW5kV2ViR0wsXG4gIGF0dHJzOiBTY2F0dGVyTmRBdHRyc1xufSk6IFRlbnNvckluZm8ge1xuICBjb25zdCB7aW5wdXRzLCBiYWNrZW5kLCBhdHRyc30gPSBhcmdzO1xuICBjb25zdCB7aW5kaWNlcywgdXBkYXRlc30gPSBpbnB1dHM7XG4gIGNvbnN0IHtzaGFwZX0gPSBhdHRycztcblxuICBjb25zdCB7c2xpY2VSYW5rLCBudW1VcGRhdGVzLCBzbGljZVNpemUsIHN0cmlkZXMsIG91dHB1dFNpemV9ID1cbiAgICAgIGJhY2tlbmRfdXRpbC5jYWxjdWxhdGVTaGFwZXModXBkYXRlcywgaW5kaWNlcywgc2hhcGUpO1xuXG4gIGNvbnN0IGZsYXR0ZW5TaGFwZSA9IFtvdXRwdXRTaXplIC8gc2xpY2VTaXplLCBzbGljZVNpemVdO1xuXG4gIGlmIChvdXRwdXRTaXplID09PSAwKSB7XG4gICAgcmV0dXJuIGJhY2tlbmQubWFrZVRlbnNvckluZm8oc2hhcGUsIGluZGljZXMuZHR5cGUpO1xuICB9XG5cbiAgY29uc3QgZmxhdHRlbkluZGljZXMgPSByZXNoYXBlKFxuICAgICAge2lucHV0czoge3g6IGluZGljZXN9LCBiYWNrZW5kLCBhdHRyczoge3NoYXBlOiBbbnVtVXBkYXRlcywgc2xpY2VSYW5rXX19KTtcbiAgY29uc3QgZmxhdHRlblggPSByZXNoYXBlKFxuICAgICAge2lucHV0czoge3g6IHVwZGF0ZXN9LCBiYWNrZW5kLCBhdHRyczoge3NoYXBlOiBbbnVtVXBkYXRlcywgc2xpY2VTaXplXX19KTtcblxuICBjb25zdCBkZWZhdWx0VmFsdWUgPSBiYWNrZW5kLm1ha2VUZW5zb3JJbmZvKFxuICAgICAgW10sICdmbG9hdDMyJywgbmV3IEZsb2F0MzJBcnJheShbMF0pKTsgIC8vIHNjYWxhcigwKVxuICBjb25zdCBwcm9ncmFtID0gbmV3IFNjYXR0ZXJQcm9ncmFtKFxuICAgICAgbnVtVXBkYXRlcywgc2xpY2VSYW5rLCBmbGF0dGVuSW5kaWNlcy5zaGFwZS5sZW5ndGgsIGZsYXR0ZW5YLnNoYXBlLmxlbmd0aCxcbiAgICAgIHN0cmlkZXMsIGZsYXR0ZW5TaGFwZSk7XG4gIGNvbnN0IHJlcyA9IGJhY2tlbmQucnVuV2ViR0xQcm9ncmFtKFxuICAgICAgcHJvZ3JhbSwgW2ZsYXR0ZW5YLCBmbGF0dGVuSW5kaWNlcywgZGVmYXVsdFZhbHVlXSwgZmxhdHRlblguZHR5cGUpO1xuXG4gIGNvbnN0IHJlc2hhcGVkID0gcmVzaGFwZSh7aW5wdXRzOiB7eDogcmVzfSwgYmFja2VuZCwgYXR0cnM6IHtzaGFwZX19KTtcblxuICBiYWNrZW5kLmRpc3Bvc2VJbnRlcm1lZGlhdGVUZW5zb3JJbmZvKGZsYXR0ZW5JbmRpY2VzKTtcbiAgYmFja2VuZC5kaXNwb3NlSW50ZXJtZWRpYXRlVGVuc29ySW5mbyhmbGF0dGVuWCk7XG4gIGJhY2tlbmQuZGlzcG9zZUludGVybWVkaWF0ZVRlbnNvckluZm8ocmVzKTtcbiAgYmFja2VuZC5kaXNwb3NlSW50ZXJtZWRpYXRlVGVuc29ySW5mbyhkZWZhdWx0VmFsdWUpO1xuXG4gIHJldHVybiByZXNoYXBlZDtcbn1cblxuZXhwb3J0IGNvbnN0IHNjYXR0ZXJOZENvbmZpZzogS2VybmVsQ29uZmlnID0ge1xuICBrZXJuZWxOYW1lOiBTY2F0dGVyTmQsXG4gIGJhY2tlbmROYW1lOiAnd2ViZ2wnLFxuICBrZXJuZWxGdW5jOiBzY2F0dGVyTmQgYXMge30gYXMgS2VybmVsRnVuY1xufTtcbiJdfQ==","/**\n * @license\n * Copyright 2022 Google LLC. All Rights Reserved.\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n * =============================================================================\n */\nimport { env } from '@tensorflow/tfjs-core';\nexport class SearchSortedProgram {\n constructor(batchSize, numInputs, numValues, side) {\n this.variableNames = ['sortedSequence', 'values'];\n this.customUniforms = [{ name: 'numInputs', type: 'int' }];\n this.outputShape = [batchSize, numValues];\n const webGL2LoopHead = 'while (left < right) {';\n // WebGL1 doesn't accept non constant loop conditions, so upper bound loop\n // iterations.\n const webGL1LoopHead = `for (int i = 0; i < ${Math.ceil(Math.log2(numInputs + 1))}; ++i) { if (left >= right) break;`;\n const loopHead = env().getNumber('WEBGL_VERSION') === 2 ? webGL2LoopHead :\n webGL1LoopHead;\n // left corresponds to lower bound and right to upper bound.\n const boundComparator = side === 'left' ? '<' : '<=';\n this.userCode = `\n int findBound(int batch, float value) {\n int left = 0;\n int right = numInputs;\n int mid;\n ${loopHead}\n mid = (left + right) / 2;\n if (getSortedSequence(batch, mid) ${boundComparator} value) {\n left = mid + 1;\n } else {\n right = mid;\n }\n }\n return right;\n }\n\n void main() {\n ivec2 coords = getOutputCoords();\n int batch = coords[0];\n int valueIndex = coords[1];\n\n float value = getValues(batch, valueIndex);\n\n setOutput(float(findBound(batch, value)));\n }\n `;\n }\n}\n//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic2VhcmNoX3NvcnRlZF9ncHUuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi90ZmpzLWJhY2tlbmQtd2ViZ2wvc3JjL3NlYXJjaF9zb3J0ZWRfZ3B1LnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBOzs7Ozs7Ozs7Ozs7Ozs7R0FlRztBQUVILE9BQU8sRUFBQyxHQUFHLEVBQUMsTUFBTSx1QkFBdUIsQ0FBQztBQUkxQyxNQUFNLE9BQU8sbUJBQW1CO0lBTTlCLFlBQ0ksU0FBaUIsRUFBRSxTQUFpQixFQUFFLFNBQWlCLEVBQ3ZELElBQW9CO1FBUHhCLGtCQUFhLEdBQUcsQ0FBQyxnQkFBZ0IsRUFBRSxRQUFRLENBQUMsQ0FBQztRQUc3QyxtQkFBYyxHQUFHLENBQUMsRUFBQyxJQUFJLEVBQUUsV0FBVyxFQUFFLElBQUksRUFBRSxLQUFvQixFQUFDLENBQUMsQ0FBQztRQUtqRSxJQUFJLENBQUMsV0FBVyxHQUFHLENBQUMsU0FBUyxFQUFFLFNBQVMsQ0FBQyxDQUFDO1FBRTFDLE1BQU0sY0FBYyxHQUFHLHdCQUF3QixDQUFDO1FBQ2hELDBFQUEwRTtRQUMxRSxjQUFjO1FBQ2QsTUFBTSxjQUFjLEdBQUcsdUJBQ25CLElBQUksQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxTQUFTLEdBQUcsQ0FBQyxDQUFDLENBQUMsb0NBQW9DLENBQUM7UUFDNUUsTUFBTSxRQUFRLEdBQUcsR0FBRyxFQUFFLENBQUMsU0FBUyxDQUFDLGVBQWUsQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDLENBQUMsY0FBYyxDQUFDLENBQUM7WUFDaEIsY0FBYyxDQUFDO1FBRXpFLDREQUE0RDtRQUM1RCxNQUFNLGVBQWUsR0FBRyxJQUFJLEtBQUssTUFBTSxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQztRQUNyRCxJQUFJLENBQUMsUUFBUSxHQUFHOzs7OztXQUtULFFBQVE7OytDQUU0QixlQUFlOzs7Ozs7Ozs7Ozs7Ozs7Ozs7TUFrQnhELENBQUM7SUFDTCxDQUFDO0NBQ0YiLCJzb3VyY2VzQ29udGVudCI6WyIvKipcbiAqIEBsaWNlbnNlXG4gKiBDb3B5cmlnaHQgMjAyMiBHb29nbGUgTExDLiBBbGwgUmlnaHRzIFJlc2VydmVkLlxuICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlIFwiTGljZW5zZVwiKTtcbiAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS5cbiAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdFxuICpcbiAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMFxuICpcbiAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmVcbiAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuIFwiQVMgSVNcIiBCQVNJUyxcbiAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLlxuICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZFxuICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuXG4gKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuICovXG5cbmltcG9ydCB7ZW52fSBmcm9tICdAdGVuc29yZmxvdy90ZmpzLWNvcmUnO1xuaW1wb3J0IHtHUEdQVVByb2dyYW19IGZyb20gJy4vZ3BncHVfbWF0aCc7XG5pbXBvcnQge1VuaWZvcm1UeXBlfSBmcm9tICcuL3NoYWRlcl9jb21waWxlcic7XG5cbmV4cG9ydCBjbGFzcyBTZWFyY2hTb3J0ZWRQcm9ncmFtIGltcGxlbWVudHMgR1BHUFVQcm9ncmFtIHtcbiAgdmFyaWFibGVOYW1lcyA9IFsnc29ydGVkU2VxdWVuY2UnLCAndmFsdWVzJ107XG4gIG91dHB1dFNoYXBlOiBudW1iZXJbXTtcbiAgdXNlckNvZGU6IHN0cmluZztcbiAgY3VzdG9tVW5pZm9ybXMgPSBbe25hbWU6ICdudW1JbnB1dHMnLCB0eXBlOiAnaW50JyBhcyBVbmlmb3JtVHlwZX1dO1xuXG4gIGNvbnN0cnVjdG9yKFxuICAgICAgYmF0Y2hTaXplOiBudW1iZXIsIG51bUlucHV0czogbnVtYmVyLCBudW1WYWx1ZXM6IG51bWJlcixcbiAgICAgIHNpZGU6ICdsZWZ0J3wncmlnaHQnKSB7XG4gICAgdGhpcy5vdXRwdXRTaGFwZSA9IFtiYXRjaFNpemUsIG51bVZhbHVlc107XG5cbiAgICBjb25zdCB3ZWJHTDJMb29wSGVhZCA9ICd3aGlsZSAobGVmdCA8IHJpZ2h0KSB7JztcbiAgICAvLyBXZWJHTDEgZG9lc24ndCBhY2NlcHQgbm9uIGNvbnN0YW50IGxvb3AgY29uZGl0aW9ucywgc28gdXBwZXIgYm91bmQgbG9vcFxuICAgIC8vIGl0ZXJhdGlvbnMuXG4gICAgY29uc3Qgd2ViR0wxTG9vcEhlYWQgPSBgZm9yIChpbnQgaSA9IDA7IGkgPCAke1xuICAgICAgICBNYXRoLmNlaWwoTWF0aC5sb2cyKG51bUlucHV0cyArIDEpKX07ICsraSkgeyBpZiAobGVmdCA+PSByaWdodCkgYnJlYWs7YDtcbiAgICBjb25zdCBsb29wSGVhZCA9IGVudigpLmdldE51bWJlcignV0VCR0xfVkVSU0lPTicpID09PSAyID8gd2ViR0wyTG9vcEhlYWQgOlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB3ZWJHTDFMb29wSGVhZDtcblxuICAgIC8vIGxlZnQgY29ycmVzcG9uZHMgdG8gbG93ZXIgYm91bmQgYW5kIHJpZ2h0IHRvIHVwcGVyIGJvdW5kLlxuICAgIGNvbnN0IGJvdW5kQ29tcGFyYXRvciA9IHNpZGUgPT09ICdsZWZ0JyA/ICc8JyA6ICc8PSc7XG4gICAgdGhpcy51c2VyQ29kZSA9IGBcbiAgICAgICBpbnQgZmluZEJvdW5kKGludCBiYXRjaCwgZmxvYXQgdmFsdWUpIHtcbiAgICAgICAgIGludCBsZWZ0ID0gMDtcbiAgICAgICAgIGludCByaWdodCA9IG51bUlucHV0cztcbiAgICAgICAgIGludCBtaWQ7XG4gICAgICAgICAke2xvb3BIZWFkfVxuICAgICAgICAgICBtaWQgPSAobGVmdCArIHJpZ2h0KSAvIDI7XG4gICAgICAgICAgIGlmIChnZXRTb3J0ZWRTZXF1ZW5jZShiYXRjaCwgbWlkKSAke2JvdW5kQ29tcGFyYXRvcn0gdmFsdWUpIHtcbiAgICAgICAgICAgICBsZWZ0ID0gbWlkICsgMTtcbiAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICByaWdodCA9IG1pZDtcbiAgICAgICAgICAgfVxuICAgICAgICAgfVxuICAgICAgICAgcmV0dXJuIHJpZ2h0O1xuICAgICAgIH1cblxuICAgICAgIHZvaWQgbWFpbigpIHtcbiAgICAgICAgIGl2ZWMyIGNvb3JkcyA9IGdldE91dHB1dENvb3JkcygpO1xuICAgICAgICAgaW50IGJhdGNoID0gY29vcmRzWzBdO1xuICAgICAgICAgaW50IHZhbHVlSW5kZXggPSBjb29yZHNbMV07XG5cbiAgICAgICAgIGZsb2F0IHZhbHVlID0gZ2V0VmFsdWVzKGJhdGNoLCB2YWx1ZUluZGV4KTtcblxuICAgICAgICAgc2V0T3V0cHV0KGZsb2F0KGZpbmRCb3VuZChiYXRjaCwgdmFsdWUpKSk7XG4gICAgICAgfVxuICAgICBgO1xuICB9XG59XG4iXX0=","/**\n * @license\n * Copyright 2022 Google LLC. All Rights Reserved.\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n * =============================================================================\n */\nimport { SearchSorted } from '@tensorflow/tfjs-core';\nimport { SearchSortedProgram } from '../search_sorted_gpu';\nexport function searchSorted(args) {\n const { inputs, backend, attrs } = args;\n const { sortedSequence, values } = inputs;\n const { side } = attrs;\n const program = new SearchSortedProgram(sortedSequence.shape[0], sortedSequence.shape[1], values.shape[1], side);\n const customValues = [[sortedSequence.shape[1]]];\n return backend.runWebGLProgram(program, [sortedSequence, values], 'int32', customValues);\n}\nexport const searchSortedConfig = {\n kernelName: SearchSorted,\n backendName: 'webgl',\n kernelFunc: searchSorted,\n};\n//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiU2VhcmNoU29ydGVkLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vLi4vdGZqcy1iYWNrZW5kLXdlYmdsL3NyYy9rZXJuZWxzL1NlYXJjaFNvcnRlZC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQTs7Ozs7Ozs7Ozs7Ozs7O0dBZUc7QUFFSCxPQUFPLEVBQTJCLFlBQVksRUFBb0QsTUFBTSx1QkFBdUIsQ0FBQztBQUdoSSxPQUFPLEVBQUMsbUJBQW1CLEVBQUMsTUFBTSxzQkFBc0IsQ0FBQztBQUV6RCxNQUFNLFVBQVUsWUFBWSxDQUFDLElBSTVCO0lBQ0MsTUFBTSxFQUFDLE1BQU0sRUFBRSxPQUFPLEVBQUUsS0FBSyxFQUFDLEdBQUcsSUFBSSxDQUFDO0lBQ3RDLE1BQU0sRUFBQyxjQUFjLEVBQUUsTUFBTSxFQUFDLEdBQUcsTUFBTSxDQUFDO0lBQ3hDLE1BQU0sRUFBQyxJQUFJLEVBQUMsR0FBRyxLQUFLLENBQUM7SUFFckIsTUFBTSxPQUFPLEdBQUcsSUFBSSxtQkFBbUIsQ0FDbkMsY0FBYyxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUMsRUFBRSxjQUFjLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQyxFQUFFLE1BQU0sQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDLEVBQUUsSUFBSSxDQUFDLENBQUM7SUFDN0UsTUFBTSxZQUFZLEdBQUcsQ0FBQyxDQUFDLGNBQWMsQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDO0lBQ2pELE9BQU8sT0FBTyxDQUFDLGVBQWUsQ0FDMUIsT0FBTyxFQUFFLENBQUMsY0FBYyxFQUFFLE1BQU0sQ0FBQyxFQUFFLE9BQU8sRUFBRSxZQUFZLENBQUMsQ0FBQztBQUNoRSxDQUFDO0FBRUQsTUFBTSxDQUFDLE1BQU0sa0JBQWtCLEdBQWlCO0lBQzlDLFVBQVUsRUFBRSxZQUFZO0lBQ3hCLFdBQVcsRUFBRSxPQUFPO0lBQ3BCLFVBQVUsRUFBRSxZQUFnQztDQUM3QyxDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiLyoqXG4gKiBAbGljZW5zZVxuICogQ29weXJpZ2h0IDIwMjIgR29vZ2xlIExMQy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC5cbiAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSBcIkxpY2Vuc2VcIik7XG4gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuXG4gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXRcbiAqXG4gKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjBcbiAqXG4gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlXG4gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiBcIkFTIElTXCIgQkFTSVMsXG4gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC5cbiAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmRcbiAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLlxuICogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbiAqL1xuXG5pbXBvcnQge0tlcm5lbENvbmZpZywgS2VybmVsRnVuYywgU2VhcmNoU29ydGVkLCBTZWFyY2hTb3J0ZWRBdHRycywgU2VhcmNoU29ydGVkSW5wdXRzLCBUZW5zb3JJbmZvfSBmcm9tICdAdGVuc29yZmxvdy90ZmpzLWNvcmUnO1xuXG5pbXBvcnQge01hdGhCYWNrZW5kV2ViR0x9IGZyb20gJy4uL2JhY2tlbmRfd2ViZ2wnO1xuaW1wb3J0IHtTZWFyY2hTb3J0ZWRQcm9ncmFtfSBmcm9tICcuLi9zZWFyY2hfc29ydGVkX2dwdSc7XG5cbmV4cG9ydCBmdW5jdGlvbiBzZWFyY2hTb3J0ZWQoYXJnczoge1xuICBpbnB1dHM6IFNlYXJjaFNvcnRlZElucHV0cyxcbiAgYmFja2VuZDogTWF0aEJhY2tlbmRXZWJHTCxcbiAgYXR0cnM6IFNlYXJjaFNvcnRlZEF0dHJzXG59KTogVGVuc29ySW5mbyB7XG4gIGNvbnN0IHtpbnB1dHMsIGJhY2tlbmQsIGF0dHJzfSA9IGFyZ3M7XG4gIGNvbnN0IHtzb3J0ZWRTZXF1ZW5jZSwgdmFsdWVzfSA9IGlucHV0cztcbiAgY29uc3Qge3NpZGV9ID0gYXR0cnM7XG5cbiAgY29uc3QgcHJvZ3JhbSA9IG5ldyBTZWFyY2hTb3J0ZWRQcm9ncmFtKFxuICAgICAgc29ydGVkU2VxdWVuY2Uuc2hhcGVbMF0sIHNvcnRlZFNlcXVlbmNlLnNoYXBlWzFdLCB2YWx1ZXMuc2hhcGVbMV0sIHNpZGUpO1xuICBjb25zdCBjdXN0b21WYWx1ZXMgPSBbW3NvcnRlZFNlcXVlbmNlLnNoYXBlWzFdXV07XG4gIHJldHVybiBiYWNrZW5kLnJ1bldlYkdMUHJvZ3JhbShcbiAgICAgIHByb2dyYW0sIFtzb3J0ZWRTZXF1ZW5jZSwgdmFsdWVzXSwgJ2ludDMyJywgY3VzdG9tVmFsdWVzKTtcbn1cblxuZXhwb3J0IGNvbnN0IHNlYXJjaFNvcnRlZENvbmZpZzogS2VybmVsQ29uZmlnID0ge1xuICBrZXJuZWxOYW1lOiBTZWFyY2hTb3J0ZWQsXG4gIGJhY2tlbmROYW1lOiAnd2ViZ2wnLFxuICBrZXJuZWxGdW5jOiBzZWFyY2hTb3J0ZWQgYXMge30gYXMgS2VybmVsRnVuYyxcbn07XG4iXX0=","/**\n * @license\n * Copyright 2017 Google LLC. All Rights Reserved.\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n * =============================================================================\n */\nimport { getCoordsDataType } from './shader_compiler';\nexport class SelectProgram {\n constructor(cRank, shape, rank) {\n this.variableNames = ['c', 'a', 'b'];\n this.outputShape = shape;\n let cCoords;\n let abCoords;\n if (rank > 4) {\n throw Error(`Where for rank ${rank} is not yet supported`);\n }\n if (rank === 1) {\n abCoords = `resRC`;\n cCoords = `resRC`;\n }\n else {\n const currentCoords = ['resRC.x', 'resRC.y', 'resRC.z', 'resRC.w'];\n const cCoordVars = [];\n const abCoordVars = [];\n for (let i = 0; i < shape.length; i++) {\n abCoordVars.push(`${currentCoords[i]}`);\n if (i < cRank) {\n cCoordVars.push(`${currentCoords[i]}`);\n }\n }\n cCoords = cCoordVars.join();\n abCoords = abCoordVars.join();\n }\n const dtype = getCoordsDataType(rank);\n this.userCode = `\n void main() {\n ${dtype} resRC = getOutputCoords();\n float cVal = getC(${cCoords});\n if (cVal >= 1.0) {\n setOutput(getA(${abCoords}));\n } else {\n setOutput(getB(${abCoords}));\n }\n }\n `;\n }\n}\n//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic2VsZWN0X2dwdS5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uL3RmanMtYmFja2VuZC13ZWJnbC9zcmMvc2VsZWN0X2dwdS50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQTs7Ozs7Ozs7Ozs7Ozs7O0dBZUc7QUFHSCxPQUFPLEVBQUMsaUJBQWlCLEVBQUMsTUFBTSxtQkFBbUIsQ0FBQztBQUVwRCxNQUFNLE9BQU8sYUFBYTtJQUt4QixZQUFZLEtBQWEsRUFBRSxLQUFlLEVBQUUsSUFBWTtRQUp4RCxrQkFBYSxHQUFHLENBQUMsR0FBRyxFQUFFLEdBQUcsRUFBRSxHQUFHLENBQUMsQ0FBQztRQUs5QixJQUFJLENBQUMsV0FBVyxHQUFHLEtBQUssQ0FBQztRQUV6QixJQUFJLE9BQU8sQ0FBQztRQUNaLElBQUksUUFBUSxDQUFDO1FBQ2IsSUFBSSxJQUFJLEdBQUcsQ0FBQyxFQUFFO1lBQ1osTUFBTSxLQUFLLENBQUMsa0JBQWtCLElBQUksdUJBQXVCLENBQUMsQ0FBQztTQUM1RDtRQUVELElBQUksSUFBSSxLQUFLLENBQUMsRUFBRTtZQUNkLFFBQVEsR0FBRyxPQUFPLENBQUM7WUFDbkIsT0FBTyxHQUFHLE9BQU8sQ0FBQztTQUNuQjthQUFNO1lBQ0wsTUFBTSxhQUFhLEdBQUcsQ0FBQyxTQUFTLEVBQUUsU0FBUyxFQUFFLFNBQVMsRUFBRSxTQUFTLENBQUMsQ0FBQztZQUNuRSxNQUFNLFVBQVUsR0FBRyxFQUFFLENBQUM7WUFDdEIsTUFBTSxXQUFXLEdBQUcsRUFBRSxDQUFDO1lBQ3ZCLEtBQUssSUFBSSxDQUFDLEdBQUcsQ0FBQyxFQUFFLENBQUMsR0FBRyxLQUFLLENBQUMsTUFBTSxFQUFFLENBQUMsRUFBRSxFQUFFO2dCQUNyQyxXQUFXLENBQUMsSUFBSSxDQUFDLEdBQUcsYUFBYSxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQztnQkFDeEMsSUFBSSxDQUFDLEdBQUcsS0FBSyxFQUFFO29CQUNiLFVBQVUsQ0FBQyxJQUFJLENBQUMsR0FBRyxhQUFhLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDO2lCQUN4QzthQUNGO1lBQ0QsT0FBTyxHQUFHLFVBQVUsQ0FBQyxJQUFJLEVBQUUsQ0FBQztZQUM1QixRQUFRLEdBQUcsV0FBVyxDQUFDLElBQUksRUFBRSxDQUFDO1NBQy9CO1FBRUQsTUFBTSxLQUFLLEdBQUcsaUJBQWlCLENBQUMsSUFBSSxDQUFDLENBQUM7UUFFdEMsSUFBSSxDQUFDLFFBQVEsR0FBRzs7VUFFVixLQUFLOzRCQUNhLE9BQU87OzJCQUVSLFFBQVE7OzJCQUVSLFFBQVE7OztLQUc5QixDQUFDO0lBQ0osQ0FBQztDQUNGIiwic291cmNlc0NvbnRlbnQiOlsiLyoqXG4gKiBAbGljZW5zZVxuICogQ29weXJpZ2h0IDIwMTcgR29vZ2xlIExMQy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC5cbiAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSBcIkxpY2Vuc2VcIik7XG4gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuXG4gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXRcbiAqXG4gKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjBcbiAqXG4gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlXG4gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiBcIkFTIElTXCIgQkFTSVMsXG4gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC5cbiAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmRcbiAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLlxuICogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbiAqL1xuXG5pbXBvcnQge0dQR1BVUHJvZ3JhbX0gZnJvbSAnLi9ncGdwdV9tYXRoJztcbmltcG9ydCB7Z2V0Q29vcmRzRGF0YVR5cGV9IGZyb20gJy4vc2hhZGVyX2NvbXBpbGVyJztcblxuZXhwb3J0IGNsYXNzIFNlbGVjdFByb2dyYW0gaW1wbGVtZW50cyBHUEdQVVByb2dyYW0ge1xuICB2YXJpYWJsZU5hbWVzID0gWydjJywgJ2EnLCAnYiddO1xuICBvdXRwdXRTaGFwZTogbnVtYmVyW107XG4gIHVzZXJDb2RlOiBzdHJpbmc7XG5cbiAgY29uc3RydWN0b3IoY1Jhbms6IG51bWJlciwgc2hhcGU6IG51bWJlcltdLCByYW5rOiBudW1iZXIpIHtcbiAgICB0aGlzLm91dHB1dFNoYXBlID0gc2hhcGU7XG5cbiAgICBsZXQgY0Nvb3JkcztcbiAgICBsZXQgYWJDb29yZHM7XG4gICAgaWYgKHJhbmsgPiA0KSB7XG4gICAgICB0aHJvdyBFcnJvcihgV2hlcmUgZm9yIHJhbmsgJHtyYW5rfSBpcyBub3QgeWV0IHN1cHBvcnRlZGApO1xuICAgIH1cblxuICAgIGlmIChyYW5rID09PSAxKSB7XG4gICAgICBhYkNvb3JkcyA9IGByZXNSQ2A7XG4gICAgICBjQ29vcmRzID0gYHJlc1JDYDtcbiAgICB9IGVsc2Uge1xuICAgICAgY29uc3QgY3VycmVudENvb3JkcyA9IFsncmVzUkMueCcsICdyZXNSQy55JywgJ3Jlc1JDLnonLCAncmVzUkMudyddO1xuICAgICAgY29uc3QgY0Nvb3JkVmFycyA9IFtdO1xuICAgICAgY29uc3QgYWJDb29yZFZhcnMgPSBbXTtcbiAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgc2hhcGUubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgYWJDb29yZFZhcnMucHVzaChgJHtjdXJyZW50Q29vcmRzW2ldfWApO1xuICAgICAgICBpZiAoaSA8IGNSYW5rKSB7XG4gICAgICAgICAgY0Nvb3JkVmFycy5wdXNoKGAke2N1cnJlbnRDb29yZHNbaV19YCk7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICAgIGNDb29yZHMgPSBjQ29vcmRWYXJzLmpvaW4oKTtcbiAgICAgIGFiQ29vcmRzID0gYWJDb29yZFZhcnMuam9pbigpO1xuICAgIH1cblxuICAgIGNvbnN0IGR0eXBlID0gZ2V0Q29vcmRzRGF0YVR5cGUocmFuayk7XG5cbiAgICB0aGlzLnVzZXJDb2RlID0gYFxuICAgICAgdm9pZCBtYWluKCkge1xuICAgICAgICAke2R0eXBlfSByZXNSQyA9IGdldE91dHB1dENvb3JkcygpO1xuICAgICAgICBmbG9hdCBjVmFsID0gZ2V0Qygke2NDb29yZHN9KTtcbiAgICAgICAgaWYgKGNWYWwgPj0gMS4wKSB7XG4gICAgICAgICAgc2V0T3V0cHV0KGdldEEoJHthYkNvb3Jkc30pKTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICBzZXRPdXRwdXQoZ2V0Qigke2FiQ29vcmRzfSkpO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgYDtcbiAgfVxufVxuIl19","/**\n * @license\n * Copyright 2020 Google LLC. All Rights Reserved.\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n * =============================================================================\n */\nimport { Select, upcastType } from '@tensorflow/tfjs-core';\nimport { SelectProgram } from '../select_gpu';\nexport function select(args) {\n const { inputs, backend } = args;\n const { condition, t, e } = inputs;\n const program = new SelectProgram(condition.shape.length, t.shape, t.shape.length);\n return backend.runWebGLProgram(program, [condition, t, e], upcastType(t.dtype, e.dtype));\n}\nexport const selectConfig = {\n kernelName: Select,\n backendName: 'webgl',\n kernelFunc: select\n};\n//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiU2VsZWN0LmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vLi4vdGZqcy1iYWNrZW5kLXdlYmdsL3NyYy9rZXJuZWxzL1NlbGVjdC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQTs7Ozs7Ozs7Ozs7Ozs7O0dBZUc7QUFFSCxPQUFPLEVBQTJCLE1BQU0sRUFBNEIsVUFBVSxFQUFDLE1BQU0sdUJBQXVCLENBQUM7QUFHN0csT0FBTyxFQUFDLGFBQWEsRUFBQyxNQUFNLGVBQWUsQ0FBQztBQUU1QyxNQUFNLFVBQVUsTUFBTSxDQUFDLElBQXVEO0lBRTVFLE1BQU0sRUFBQyxNQUFNLEVBQUUsT0FBTyxFQUFDLEdBQUcsSUFBSSxDQUFDO0lBQy9CLE1BQU0sRUFBQyxTQUFTLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBQyxHQUFHLE1BQU0sQ0FBQztJQUVqQyxNQUFNLE9BQU8sR0FDVCxJQUFJLGFBQWEsQ0FBQyxTQUFTLENBQUMsS0FBSyxDQUFDLE1BQU0sRUFBRSxDQUFDLENBQUMsS0FBSyxFQUFFLENBQUMsQ0FBQyxLQUFLLENBQUMsTUFBTSxDQUFDLENBQUM7SUFDdkUsT0FBTyxPQUFPLENBQUMsZUFBZSxDQUMxQixPQUFPLEVBQUUsQ0FBQyxTQUFTLEVBQUUsQ0FBQyxFQUFFLENBQUMsQ0FBQyxFQUFFLFVBQVUsQ0FBQyxDQUFDLENBQUMsS0FBSyxFQUFFLENBQUMsQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDO0FBQ2hFLENBQUM7QUFFRCxNQUFNLENBQUMsTUFBTSxZQUFZLEdBQWlCO0lBQ3hDLFVBQVUsRUFBRSxNQUFNO0lBQ2xCLFdBQVcsRUFBRSxPQUFPO0lBQ3BCLFVBQVUsRUFBRSxNQUEwQjtDQUN2QyxDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiLyoqXG4gKiBAbGljZW5zZVxuICogQ29weXJpZ2h0IDIwMjAgR29vZ2xlIExMQy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC5cbiAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSBcIkxpY2Vuc2VcIik7XG4gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuXG4gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXRcbiAqXG4gKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjBcbiAqXG4gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlXG4gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiBcIkFTIElTXCIgQkFTSVMsXG4gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC5cbiAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmRcbiAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLlxuICogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbiAqL1xuXG5pbXBvcnQge0tlcm5lbENvbmZpZywgS2VybmVsRnVuYywgU2VsZWN0LCBTZWxlY3RJbnB1dHMsIFRlbnNvckluZm8sIHVwY2FzdFR5cGV9IGZyb20gJ0B0ZW5zb3JmbG93L3RmanMtY29yZSc7XG5cbmltcG9ydCB7TWF0aEJhY2tlbmRXZWJHTH0gZnJvbSAnLi4vYmFja2VuZF93ZWJnbCc7XG5pbXBvcnQge1NlbGVjdFByb2dyYW19IGZyb20gJy4uL3NlbGVjdF9ncHUnO1xuXG5leHBvcnQgZnVuY3Rpb24gc2VsZWN0KGFyZ3M6IHtpbnB1dHM6IFNlbGVjdElucHV0cywgYmFja2VuZDogTWF0aEJhY2tlbmRXZWJHTH0pOlxuICAgIFRlbnNvckluZm8ge1xuICBjb25zdCB7aW5wdXRzLCBiYWNrZW5kfSA9IGFyZ3M7XG4gIGNvbnN0IHtjb25kaXRpb24sIHQsIGV9ID0gaW5wdXRzO1xuXG4gIGNvbnN0IHByb2dyYW0gPVxuICAgICAgbmV3IFNlbGVjdFByb2dyYW0oY29uZGl0aW9uLnNoYXBlLmxlbmd0aCwgdC5zaGFwZSwgdC5zaGFwZS5sZW5ndGgpO1xuICByZXR1cm4gYmFja2VuZC5ydW5XZWJHTFByb2dyYW0oXG4gICAgICBwcm9ncmFtLCBbY29uZGl0aW9uLCB0LCBlXSwgdXBjYXN0VHlwZSh0LmR0eXBlLCBlLmR0eXBlKSk7XG59XG5cbmV4cG9ydCBjb25zdCBzZWxlY3RDb25maWc6IEtlcm5lbENvbmZpZyA9IHtcbiAga2VybmVsTmFtZTogU2VsZWN0LFxuICBiYWNrZW5kTmFtZTogJ3dlYmdsJyxcbiAga2VybmVsRnVuYzogc2VsZWN0IGFzIHt9IGFzIEtlcm5lbEZ1bmNcbn07XG4iXX0=","/**\n * @license\n * Copyright 2020 Google LLC. All Rights Reserved.\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n * =============================================================================\n */\nimport { backend_util, Selu } from '@tensorflow/tfjs-core';\nimport { unaryKernelFunc } from '../kernel_utils/kernel_funcs_utils';\nconst SELU = `\n // Stable and Attracting Fixed Point (0, 1) for Normalized Weights.\n // see: https://arxiv.org/abs/1706.02515\n float scaleAlpha = ${backend_util.SELU_SCALEALPHA};\n float scale = ${backend_util.SELU_SCALE};\n return (x >= 0.0) ? scale * x : scaleAlpha * (exp(x) - 1.0);\n`;\nexport const selu = unaryKernelFunc({ opSnippet: SELU });\nexport const seluConfig = {\n kernelName: Selu,\n backendName: 'webgl',\n kernelFunc: selu,\n};\n//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiU2VsdS5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uLy4uL3RmanMtYmFja2VuZC13ZWJnbC9zcmMva2VybmVscy9TZWx1LnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBOzs7Ozs7Ozs7Ozs7Ozs7R0FlRztBQUVILE9BQU8sRUFBQyxZQUFZLEVBQWdCLElBQUksRUFBQyxNQUFNLHVCQUF1QixDQUFDO0FBRXZFLE9BQU8sRUFBQyxlQUFlLEVBQUMsTUFBTSxvQ0FBb0MsQ0FBQztBQUVuRSxNQUFNLElBQUksR0FBRzs7O3VCQUdVLFlBQVksQ0FBQyxlQUFlO2tCQUNqQyxZQUFZLENBQUMsVUFBVTs7Q0FFeEMsQ0FBQztBQUVGLE1BQU0sQ0FBQyxNQUFNLElBQUksR0FBRyxlQUFlLENBQUMsRUFBQyxTQUFTLEVBQUUsSUFBSSxFQUFDLENBQUMsQ0FBQztBQUV2RCxNQUFNLENBQUMsTUFBTSxVQUFVLEdBQWlCO0lBQ3RDLFVBQVUsRUFBRSxJQUFJO0lBQ2hCLFdBQVcsRUFBRSxPQUFPO0lBQ3BCLFVBQVUsRUFBRSxJQUFJO0NBQ2pCLENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyIvKipcbiAqIEBsaWNlbnNlXG4gKiBDb3B5cmlnaHQgMjAyMCBHb29nbGUgTExDLiBBbGwgUmlnaHRzIFJlc2VydmVkLlxuICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlIFwiTGljZW5zZVwiKTtcbiAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS5cbiAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdFxuICpcbiAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMFxuICpcbiAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmVcbiAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuIFwiQVMgSVNcIiBCQVNJUyxcbiAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLlxuICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZFxuICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuXG4gKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuICovXG5cbmltcG9ydCB7YmFja2VuZF91dGlsLCBLZXJuZWxDb25maWcsIFNlbHV9IGZyb20gJ0B0ZW5zb3JmbG93L3RmanMtY29yZSc7XG5cbmltcG9ydCB7dW5hcnlLZXJuZWxGdW5jfSBmcm9tICcuLi9rZXJuZWxfdXRpbHMva2VybmVsX2Z1bmNzX3V0aWxzJztcblxuY29uc3QgU0VMVSA9IGBcbiAgLy8gU3RhYmxlIGFuZCBBdHRyYWN0aW5nIEZpeGVkIFBvaW50ICgwLCAxKSBmb3IgTm9ybWFsaXplZCBXZWlnaHRzLlxuICAvLyBzZWU6IGh0dHBzOi8vYXJ4aXYub3JnL2Ficy8xNzA2LjAyNTE1XG4gIGZsb2F0IHNjYWxlQWxwaGEgPSAke2JhY2tlbmRfdXRpbC5TRUxVX1NDQUxFQUxQSEF9O1xuICBmbG9hdCBzY2FsZSA9ICR7YmFja2VuZF91dGlsLlNFTFVfU0NBTEV9O1xuICByZXR1cm4gKHggPj0gMC4wKSA/IHNjYWxlICogeCA6IHNjYWxlQWxwaGEgKiAoZXhwKHgpIC0gMS4wKTtcbmA7XG5cbmV4cG9ydCBjb25zdCBzZWx1ID0gdW5hcnlLZXJuZWxGdW5jKHtvcFNuaXBwZXQ6IFNFTFV9KTtcblxuZXhwb3J0IGNvbnN0IHNlbHVDb25maWc6IEtlcm5lbENvbmZpZyA9IHtcbiAga2VybmVsTmFtZTogU2VsdSxcbiAgYmFja2VuZE5hbWU6ICd3ZWJnbCcsXG4gIGtlcm5lbEZ1bmM6IHNlbHUsXG59O1xuIl19","/**\n * @license\n * Copyright 2020 Google LLC. All Rights Reserved.\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n * =============================================================================\n */\nimport { Sigmoid } from '@tensorflow/tfjs-core';\nimport { CHECK_NAN_SNIPPET_UNARY, unaryKernelFunc } from '../kernel_utils/kernel_funcs_utils';\nimport { sigmoidImplCPU } from '../kernel_utils/shared';\nconst SIGMOID = CHECK_NAN_SNIPPET_UNARY + `\n return 1.0 / (1.0 + exp(-1.0 * x));\n`;\nconst SIGMOID_PACKED = `\n vec4 result = 1.0 / (1.0 + exp(-1.0 * x));\n bvec4 isNaN = isnan(x);\n\n result.r = isNaN.r ? x.r : result.r;\n result.g = isNaN.g ? x.g : result.g;\n result.b = isNaN.b ? x.b : result.b;\n result.a = isNaN.a ? x.a : result.a;\n\n return result;\n`;\nexport const sigmoid = unaryKernelFunc({\n opSnippet: SIGMOID,\n packedOpSnippet: SIGMOID_PACKED,\n cpuKernelImpl: sigmoidImplCPU\n});\nexport const sigmoidConfig = {\n kernelName: Sigmoid,\n backendName: 'webgl',\n kernelFunc: sigmoid,\n};\n//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiU2lnbW9pZC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uLy4uL3RmanMtYmFja2VuZC13ZWJnbC9zcmMva2VybmVscy9TaWdtb2lkLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBOzs7Ozs7Ozs7Ozs7Ozs7R0FlRztBQUVILE9BQU8sRUFBZSxPQUFPLEVBQUMsTUFBTSx1QkFBdUIsQ0FBQztBQUU1RCxPQUFPLEVBQUMsdUJBQXVCLEVBQUUsZUFBZSxFQUFDLE1BQU0sb0NBQW9DLENBQUM7QUFDNUYsT0FBTyxFQUFDLGNBQWMsRUFBQyxNQUFNLHdCQUF3QixDQUFDO0FBRXRELE1BQU0sT0FBTyxHQUFHLHVCQUF1QixHQUFHOztDQUV6QyxDQUFDO0FBRUYsTUFBTSxjQUFjLEdBQUc7Ozs7Ozs7Ozs7Q0FVdEIsQ0FBQztBQUNGLE1BQU0sQ0FBQyxNQUFNLE9BQU8sR0FBRyxlQUFlLENBQUM7SUFDckMsU0FBUyxFQUFFLE9BQU87SUFDbEIsZUFBZSxFQUFFLGNBQWM7SUFDL0IsYUFBYSxFQUFFLGNBQWM7Q0FDOUIsQ0FBQyxDQUFDO0FBRUgsTUFBTSxDQUFDLE1BQU0sYUFBYSxHQUFpQjtJQUN6QyxVQUFVLEVBQUUsT0FBTztJQUNuQixXQUFXLEVBQUUsT0FBTztJQUNwQixVQUFVLEVBQUUsT0FBTztDQUNwQixDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiLyoqXG4gKiBAbGljZW5zZVxuICogQ29weXJpZ2h0IDIwMjAgR29vZ2xlIExMQy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC5cbiAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSBcIkxpY2Vuc2VcIik7XG4gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuXG4gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXRcbiAqXG4gKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjBcbiAqXG4gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlXG4gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiBcIkFTIElTXCIgQkFTSVMsXG4gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC5cbiAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmRcbiAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLlxuICogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbiAqL1xuXG5pbXBvcnQge0tlcm5lbENvbmZpZywgU2lnbW9pZH0gZnJvbSAnQHRlbnNvcmZsb3cvdGZqcy1jb3JlJztcblxuaW1wb3J0IHtDSEVDS19OQU5fU05JUFBFVF9VTkFSWSwgdW5hcnlLZXJuZWxGdW5jfSBmcm9tICcuLi9rZXJuZWxfdXRpbHMva2VybmVsX2Z1bmNzX3V0aWxzJztcbmltcG9ydCB7c2lnbW9pZEltcGxDUFV9IGZyb20gJy4uL2tlcm5lbF91dGlscy9zaGFyZWQnO1xuXG5jb25zdCBTSUdNT0lEID0gQ0hFQ0tfTkFOX1NOSVBQRVRfVU5BUlkgKyBgXG4gIHJldHVybiAxLjAgLyAoMS4wICsgZXhwKC0xLjAgKiB4KSk7XG5gO1xuXG5jb25zdCBTSUdNT0lEX1BBQ0tFRCA9IGBcbiAgdmVjNCByZXN1bHQgPSAxLjAgLyAoMS4wICsgZXhwKC0xLjAgKiB4KSk7XG4gIGJ2ZWM0IGlzTmFOID0gaXNuYW4oeCk7XG5cbiAgcmVzdWx0LnIgPSBpc05hTi5yID8geC5yIDogcmVzdWx0LnI7XG4gIHJlc3VsdC5nID0gaXNOYU4uZyA/IHguZyA6IHJlc3VsdC5nO1xuICByZXN1bHQuYiA9IGlzTmFOLmIgPyB4LmIgOiByZXN1bHQuYjtcbiAgcmVzdWx0LmEgPSBpc05hTi5hID8geC5hIDogcmVzdWx0LmE7XG5cbiAgcmV0dXJuIHJlc3VsdDtcbmA7XG5leHBvcnQgY29uc3Qgc2lnbW9pZCA9IHVuYXJ5S2VybmVsRnVuYyh7XG4gIG9wU25pcHBldDogU0lHTU9JRCxcbiAgcGFja2VkT3BTbmlwcGV0OiBTSUdNT0lEX1BBQ0tFRCxcbiAgY3B1S2VybmVsSW1wbDogc2lnbW9pZEltcGxDUFVcbn0pO1xuXG5leHBvcnQgY29uc3Qgc2lnbW9pZENvbmZpZzogS2VybmVsQ29uZmlnID0ge1xuICBrZXJuZWxOYW1lOiBTaWdtb2lkLFxuICBiYWNrZW5kTmFtZTogJ3dlYmdsJyxcbiAga2VybmVsRnVuYzogc2lnbW9pZCxcbn07XG4iXX0=","/**\n * @license\n * Copyright 2020 Google LLC. All Rights Reserved.\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n * =============================================================================\n */\nimport { Sign } from '@tensorflow/tfjs-core';\nimport { unaryKernelFunc } from '../kernel_utils/kernel_funcs_utils';\n// Sign does not propagate NANs.\nconst SIGN = `\n if (isnan(x)) { return 0.0; }\n return sign(x);\n`;\nexport const sign = unaryKernelFunc({ opSnippet: SIGN });\nexport const signConfig = {\n kernelName: Sign,\n backendName: 'webgl',\n kernelFunc: sign,\n};\n//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiU2lnbi5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uLy4uL3RmanMtYmFja2VuZC13ZWJnbC9zcmMva2VybmVscy9TaWduLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBOzs7Ozs7Ozs7Ozs7Ozs7R0FlRztBQUVILE9BQU8sRUFBZSxJQUFJLEVBQUMsTUFBTSx1QkFBdUIsQ0FBQztBQUV6RCxPQUFPLEVBQUMsZUFBZSxFQUFDLE1BQU0sb0NBQW9DLENBQUM7QUFFbkUsZ0NBQWdDO0FBQ2hDLE1BQU0sSUFBSSxHQUFHOzs7Q0FHWixDQUFDO0FBRUYsTUFBTSxDQUFDLE1BQU0sSUFBSSxHQUFHLGVBQWUsQ0FBQyxFQUFDLFNBQVMsRUFBRSxJQUFJLEVBQUMsQ0FBQyxDQUFDO0FBRXZELE1BQU0sQ0FBQyxNQUFNLFVBQVUsR0FBaUI7SUFDdEMsVUFBVSxFQUFFLElBQUk7SUFDaEIsV0FBVyxFQUFFLE9BQU87SUFDcEIsVUFBVSxFQUFFLElBQUk7Q0FDakIsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbIi8qKlxuICogQGxpY2Vuc2VcbiAqIENvcHlyaWdodCAyMDIwIEdvb2dsZSBMTEMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuXG4gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgXCJMaWNlbnNlXCIpO1xuICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLlxuICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0XG4gKlxuICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wXG4gKlxuICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZVxuICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gXCJBUyBJU1wiIEJBU0lTLFxuICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuXG4gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kXG4gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS5cbiAqID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4gKi9cblxuaW1wb3J0IHtLZXJuZWxDb25maWcsIFNpZ259IGZyb20gJ0B0ZW5zb3JmbG93L3RmanMtY29yZSc7XG5cbmltcG9ydCB7dW5hcnlLZXJuZWxGdW5jfSBmcm9tICcuLi9rZXJuZWxfdXRpbHMva2VybmVsX2Z1bmNzX3V0aWxzJztcblxuLy8gU2lnbiBkb2VzIG5vdCBwcm9wYWdhdGUgTkFOcy5cbmNvbnN0IFNJR04gPSBgXG4gIGlmIChpc25hbih4KSkgeyByZXR1cm4gMC4wOyB9XG4gIHJldHVybiBzaWduKHgpO1xuYDtcblxuZXhwb3J0IGNvbnN0IHNpZ24gPSB1bmFyeUtlcm5lbEZ1bmMoe29wU25pcHBldDogU0lHTn0pO1xuXG5leHBvcnQgY29uc3Qgc2lnbkNvbmZpZzogS2VybmVsQ29uZmlnID0ge1xuICBrZXJuZWxOYW1lOiBTaWduLFxuICBiYWNrZW5kTmFtZTogJ3dlYmdsJyxcbiAga2VybmVsRnVuYzogc2lnbixcbn07XG4iXX0=","/**\n * @license\n * Copyright 2020 Google LLC. All Rights Reserved.\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n * =============================================================================\n */\nimport { Sin } from '@tensorflow/tfjs-core';\nimport { CHECK_NAN_SNIPPET_UNARY, unaryKernelFunc } from '../kernel_utils/kernel_funcs_utils';\nconst SIN = CHECK_NAN_SNIPPET_UNARY + `\n return sin(x);\n`;\nexport const sin = unaryKernelFunc({ opSnippet: SIN });\nexport const sinConfig = {\n kernelName: Sin,\n backendName: 'webgl',\n kernelFunc: sin,\n};\n//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiU2luLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vLi4vdGZqcy1iYWNrZW5kLXdlYmdsL3NyYy9rZXJuZWxzL1Npbi50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQTs7Ozs7Ozs7Ozs7Ozs7O0dBZUc7QUFFSCxPQUFPLEVBQWUsR0FBRyxFQUFDLE1BQU0sdUJBQXVCLENBQUM7QUFFeEQsT0FBTyxFQUFDLHVCQUF1QixFQUFFLGVBQWUsRUFBQyxNQUFNLG9DQUFvQyxDQUFDO0FBRTVGLE1BQU0sR0FBRyxHQUFHLHVCQUF1QixHQUFHOztDQUVyQyxDQUFDO0FBRUYsTUFBTSxDQUFDLE1BQU0sR0FBRyxHQUFHLGVBQWUsQ0FBQyxFQUFDLFNBQVMsRUFBRSxHQUFHLEVBQUMsQ0FBQyxDQUFDO0FBRXJELE1BQU0sQ0FBQyxNQUFNLFNBQVMsR0FBaUI7SUFDckMsVUFBVSxFQUFFLEdBQUc7SUFDZixXQUFXLEVBQUUsT0FBTztJQUNwQixVQUFVLEVBQUUsR0FBRztDQUNoQixDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiLyoqXG4gKiBAbGljZW5zZVxuICogQ29weXJpZ2h0IDIwMjAgR29vZ2xlIExMQy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC5cbiAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSBcIkxpY2Vuc2VcIik7XG4gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuXG4gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXRcbiAqXG4gKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjBcbiAqXG4gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlXG4gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiBcIkFTIElTXCIgQkFTSVMsXG4gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC5cbiAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmRcbiAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLlxuICogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbiAqL1xuXG5pbXBvcnQge0tlcm5lbENvbmZpZywgU2lufSBmcm9tICdAdGVuc29yZmxvdy90ZmpzLWNvcmUnO1xuXG5pbXBvcnQge0NIRUNLX05BTl9TTklQUEVUX1VOQVJZLCB1bmFyeUtlcm5lbEZ1bmN9IGZyb20gJy4uL2tlcm5lbF91dGlscy9rZXJuZWxfZnVuY3NfdXRpbHMnO1xuXG5jb25zdCBTSU4gPSBDSEVDS19OQU5fU05JUFBFVF9VTkFSWSArIGBcbiAgcmV0dXJuIHNpbih4KTtcbmA7XG5cbmV4cG9ydCBjb25zdCBzaW4gPSB1bmFyeUtlcm5lbEZ1bmMoe29wU25pcHBldDogU0lOfSk7XG5cbmV4cG9ydCBjb25zdCBzaW5Db25maWc6IEtlcm5lbENvbmZpZyA9IHtcbiAga2VybmVsTmFtZTogU2luLFxuICBiYWNrZW5kTmFtZTogJ3dlYmdsJyxcbiAga2VybmVsRnVuYzogc2luLFxufTtcbiJdfQ==","/**\n * @license\n * Copyright 2020 Google LLC. All Rights Reserved.\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n * =============================================================================\n */\nimport { Sinh } from '@tensorflow/tfjs-core';\nimport { unaryKernelFunc } from '../kernel_utils/kernel_funcs_utils';\nconst SINH = `\n float e2x = exp(x);\n return (e2x - 1.0 / e2x) / 2.0;\n`;\nexport const sinh = unaryKernelFunc({ opSnippet: SINH });\nexport const sinhConfig = {\n kernelName: Sinh,\n backendName: 'webgl',\n kernelFunc: sinh,\n};\n//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiU2luaC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uLy4uL3RmanMtYmFja2VuZC13ZWJnbC9zcmMva2VybmVscy9TaW5oLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBOzs7Ozs7Ozs7Ozs7Ozs7R0FlRztBQUVILE9BQU8sRUFBZSxJQUFJLEVBQUMsTUFBTSx1QkFBdUIsQ0FBQztBQUN6RCxPQUFPLEVBQUMsZUFBZSxFQUFDLE1BQU0sb0NBQW9DLENBQUM7QUFFbkUsTUFBTSxJQUFJLEdBQUc7OztDQUdaLENBQUM7QUFFRixNQUFNLENBQUMsTUFBTSxJQUFJLEdBQUcsZUFBZSxDQUFDLEVBQUMsU0FBUyxFQUFFLElBQUksRUFBQyxDQUFDLENBQUM7QUFFdkQsTUFBTSxDQUFDLE1BQU0sVUFBVSxHQUFpQjtJQUN0QyxVQUFVLEVBQUUsSUFBSTtJQUNoQixXQUFXLEVBQUUsT0FBTztJQUNwQixVQUFVLEVBQUUsSUFBSTtDQUNqQixDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiLyoqXG4gKiBAbGljZW5zZVxuICogQ29weXJpZ2h0IDIwMjAgR29vZ2xlIExMQy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC5cbiAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSBcIkxpY2Vuc2VcIik7XG4gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuXG4gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXRcbiAqXG4gKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjBcbiAqXG4gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlXG4gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiBcIkFTIElTXCIgQkFTSVMsXG4gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC5cbiAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmRcbiAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLlxuICogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbiAqL1xuXG5pbXBvcnQge0tlcm5lbENvbmZpZywgU2luaH0gZnJvbSAnQHRlbnNvcmZsb3cvdGZqcy1jb3JlJztcbmltcG9ydCB7dW5hcnlLZXJuZWxGdW5jfSBmcm9tICcuLi9rZXJuZWxfdXRpbHMva2VybmVsX2Z1bmNzX3V0aWxzJztcblxuY29uc3QgU0lOSCA9IGBcbiAgZmxvYXQgZTJ4ID0gZXhwKHgpO1xuICByZXR1cm4gKGUyeCAtIDEuMCAvIGUyeCkgLyAyLjA7XG5gO1xuXG5leHBvcnQgY29uc3Qgc2luaCA9IHVuYXJ5S2VybmVsRnVuYyh7b3BTbmlwcGV0OiBTSU5IfSk7XG5cbmV4cG9ydCBjb25zdCBzaW5oQ29uZmlnOiBLZXJuZWxDb25maWcgPSB7XG4gIGtlcm5lbE5hbWU6IFNpbmgsXG4gIGJhY2tlbmROYW1lOiAnd2ViZ2wnLFxuICBrZXJuZWxGdW5jOiBzaW5oLFxufTtcbiJdfQ==","/**\n * @license\n * Copyright 2020 Google LLC. All Rights Reserved.\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n * =============================================================================\n */\nimport { Softplus } from '@tensorflow/tfjs-core';\nimport { unaryKernelFunc } from '../kernel_utils/kernel_funcs_utils';\nconst SOFTPLUS = `\n float epsilon = 1.1920928955078125e-7;\n float threshold = log(epsilon) + 2.0;\n\n bool too_large = x > -threshold;\n bool too_small = x < threshold;\n\n float result;\n float exp_x = exp(x);\n\n if (too_large){\n result = x;\n }\n else if (too_small){\n result = exp_x;\n }\n else{\n result = log(exp_x + 1.0);\n }\n return result;\n`;\nexport const softplus = unaryKernelFunc({ opSnippet: SOFTPLUS });\nexport const softplusConfig = {\n kernelName: Softplus,\n backendName: 'webgl',\n kernelFunc: softplus,\n};\n//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiU29mdHBsdXMuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi8uLi90ZmpzLWJhY2tlbmQtd2ViZ2wvc3JjL2tlcm5lbHMvU29mdHBsdXMudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUE7Ozs7Ozs7Ozs7Ozs7OztHQWVHO0FBRUgsT0FBTyxFQUFlLFFBQVEsRUFBQyxNQUFNLHVCQUF1QixDQUFDO0FBQzdELE9BQU8sRUFBQyxlQUFlLEVBQUMsTUFBTSxvQ0FBb0MsQ0FBQztBQUVuRSxNQUFNLFFBQVEsR0FBRzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Q0FvQmhCLENBQUM7QUFFRixNQUFNLENBQUMsTUFBTSxRQUFRLEdBQUcsZUFBZSxDQUFDLEVBQUMsU0FBUyxFQUFFLFFBQVEsRUFBQyxDQUFDLENBQUM7QUFFL0QsTUFBTSxDQUFDLE1BQU0sY0FBYyxHQUFpQjtJQUMxQyxVQUFVLEVBQUUsUUFBUTtJQUNwQixXQUFXLEVBQUUsT0FBTztJQUNwQixVQUFVLEVBQUUsUUFBUTtDQUNyQixDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiLyoqXG4gKiBAbGljZW5zZVxuICogQ29weXJpZ2h0IDIwMjAgR29vZ2xlIExMQy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC5cbiAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSBcIkxpY2Vuc2VcIik7XG4gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuXG4gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXRcbiAqXG4gKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjBcbiAqXG4gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlXG4gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiBcIkFTIElTXCIgQkFTSVMsXG4gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC5cbiAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmRcbiAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLlxuICogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbiAqL1xuXG5pbXBvcnQge0tlcm5lbENvbmZpZywgU29mdHBsdXN9IGZyb20gJ0B0ZW5zb3JmbG93L3RmanMtY29yZSc7XG5pbXBvcnQge3VuYXJ5S2VybmVsRnVuY30gZnJvbSAnLi4va2VybmVsX3V0aWxzL2tlcm5lbF9mdW5jc191dGlscyc7XG5cbmNvbnN0IFNPRlRQTFVTID0gYFxuICBmbG9hdCBlcHNpbG9uID0gMS4xOTIwOTI4OTU1MDc4MTI1ZS03O1xuICBmbG9hdCB0aHJlc2hvbGQgPSBsb2coZXBzaWxvbikgKyAyLjA7XG5cbiAgYm9vbCB0b29fbGFyZ2UgPSB4ID4gLXRocmVzaG9sZDtcbiAgYm9vbCB0b29fc21hbGwgPSB4IDwgdGhyZXNob2xkO1xuXG4gIGZsb2F0IHJlc3VsdDtcbiAgZmxvYXQgZXhwX3ggPSBleHAoeCk7XG5cbiAgaWYgKHRvb19sYXJnZSl7XG4gICAgcmVzdWx0ID0geDtcbiAgfVxuICBlbHNlIGlmICh0b29fc21hbGwpe1xuICAgIHJlc3VsdCA9IGV4cF94O1xuICB9XG4gIGVsc2V7XG4gICAgcmVzdWx0ID0gbG9nKGV4cF94ICsgMS4wKTtcbiAgfVxuICByZXR1cm4gcmVzdWx0O1xuYDtcblxuZXhwb3J0IGNvbnN0IHNvZnRwbHVzID0gdW5hcnlLZXJuZWxGdW5jKHtvcFNuaXBwZXQ6IFNPRlRQTFVTfSk7XG5cbmV4cG9ydCBjb25zdCBzb2Z0cGx1c0NvbmZpZzogS2VybmVsQ29uZmlnID0ge1xuICBrZXJuZWxOYW1lOiBTb2Z0cGx1cyxcbiAgYmFja2VuZE5hbWU6ICd3ZWJnbCcsXG4gIGtlcm5lbEZ1bmM6IHNvZnRwbHVzLFxufTtcbiJdfQ==","/**\n * @license\n * Copyright 2020 Google LLC. All Rights Reserved.\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n * =============================================================================\n */\nimport { backend_util, SpaceToBatchND, util } from '@tensorflow/tfjs-core';\nimport { padV2 } from './PadV2';\nimport { reshape } from './Reshape';\nimport { transpose } from './Transpose';\nexport const spaceToBatchND = (args) => {\n const { inputs, backend, attrs } = args;\n const { x } = inputs;\n const { blockShape, paddings } = attrs;\n util.assert(x.shape.length <= 4, () => 'spaceToBatchND for rank > 4 with a WebGL backend not ' +\n 'implemented yet');\n const prod = blockShape.reduce((a, b) => a * b);\n const completePaddings = [[0, 0]];\n completePaddings.push(...paddings);\n for (let i = 1 + blockShape.length; i < x.shape.length; ++i) {\n completePaddings.push([0, 0]);\n }\n const toDispose = [];\n const paddedX = padV2({\n inputs: { x },\n backend,\n attrs: { paddings: completePaddings, constantValue: 0 }\n });\n const reshapedPaddedShape = backend_util.getReshaped(paddedX.shape, blockShape, prod, false);\n const permutedReshapedPaddedPermutation = backend_util.getPermuted(reshapedPaddedShape.length, blockShape.length, false);\n const flattenShape = backend_util.getReshapedPermuted(paddedX.shape, blockShape, prod, false);\n const reshapedPaddedX = reshape({ inputs: { x: paddedX }, backend, attrs: { shape: reshapedPaddedShape } });\n const paddedXT = transpose({\n inputs: { x: reshapedPaddedX },\n backend,\n attrs: { perm: permutedReshapedPaddedPermutation }\n });\n const result = reshape({ inputs: { x: paddedXT }, backend, attrs: { shape: flattenShape } });\n toDispose.push(paddedX);\n toDispose.push(reshapedPaddedX);\n toDispose.push(paddedXT);\n toDispose.forEach(t => backend.disposeIntermediateTensorInfo(t));\n return result;\n};\nexport const spaceToBatchNDConfig = {\n kernelName: SpaceToBatchND,\n backendName: 'webgl',\n kernelFunc: spaceToBatchND\n};\n//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiU3BhY2VUb0JhdGNoTkQuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi8uLi90ZmpzLWJhY2tlbmQtd2ViZ2wvc3JjL2tlcm5lbHMvU3BhY2VUb0JhdGNoTkQudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUE7Ozs7Ozs7Ozs7Ozs7OztHQWVHO0FBRUgsT0FBTyxFQUFDLFlBQVksRUFBNEIsY0FBYyxFQUF5RCxJQUFJLEVBQUMsTUFBTSx1QkFBdUIsQ0FBQztBQUkxSixPQUFPLEVBQUMsS0FBSyxFQUFDLE1BQU0sU0FBUyxDQUFDO0FBQzlCLE9BQU8sRUFBQyxPQUFPLEVBQUMsTUFBTSxXQUFXLENBQUM7QUFDbEMsT0FBTyxFQUFDLFNBQVMsRUFBQyxNQUFNLGFBQWEsQ0FBQztBQUV0QyxNQUFNLENBQUMsTUFBTSxjQUFjLEdBQUcsQ0FBQyxJQUk5QixFQUFjLEVBQUU7SUFDZixNQUFNLEVBQUMsTUFBTSxFQUFFLE9BQU8sRUFBRSxLQUFLLEVBQUMsR0FBRyxJQUFJLENBQUM7SUFDdEMsTUFBTSxFQUFDLENBQUMsRUFBQyxHQUFHLE1BQU0sQ0FBQztJQUNuQixNQUFNLEVBQUMsVUFBVSxFQUFFLFFBQVEsRUFBQyxHQUFHLEtBQUssQ0FBQztJQUVyQyxJQUFJLENBQUMsTUFBTSxDQUNQLENBQUMsQ0FBQyxLQUFLLENBQUMsTUFBTSxJQUFJLENBQUMsRUFDbkIsR0FBRyxFQUFFLENBQUMsdURBQXVEO1FBQ3pELGlCQUFpQixDQUFDLENBQUM7SUFFM0IsTUFBTSxJQUFJLEdBQUcsVUFBVSxDQUFDLE1BQU0sQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLEVBQUUsRUFBRSxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQztJQUVoRCxNQUFNLGdCQUFnQixHQUE0QixDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUM7SUFDM0QsZ0JBQWdCLENBQUMsSUFBSSxDQUFDLEdBQUcsUUFBbUMsQ0FBQyxDQUFDO0lBQzlELEtBQUssSUFBSSxDQUFDLEdBQUcsQ0FBQyxHQUFHLFVBQVUsQ0FBQyxNQUFNLEVBQUUsQ0FBQyxHQUFHLENBQUMsQ0FBQyxLQUFLLENBQUMsTUFBTSxFQUFFLEVBQUUsQ0FBQyxFQUFFO1FBQzNELGdCQUFnQixDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxDQUFDO0tBQy9CO0lBRUQsTUFBTSxTQUFTLEdBQUcsRUFBRSxDQUFDO0lBRXJCLE1BQU0sT0FBTyxHQUFHLEtBQUssQ0FBQztRQUNwQixNQUFNLEVBQUUsRUFBQyxDQUFDLEVBQUM7UUFDWCxPQUFPO1FBQ1AsS0FBSyxFQUFFLEVBQUMsUUFBUSxFQUFFLGdCQUFnQixFQUFFLGFBQWEsRUFBRSxDQUFDLEVBQUM7S0FDdEQsQ0FBQyxDQUFDO0lBRUgsTUFBTSxtQkFBbUIsR0FDckIsWUFBWSxDQUFDLFdBQVcsQ0FBQyxPQUFPLENBQUMsS0FBSyxFQUFFLFVBQVUsRUFBRSxJQUFJLEVBQUUsS0FBSyxDQUFDLENBQUM7SUFFckUsTUFBTSxpQ0FBaUMsR0FBRyxZQUFZLENBQUMsV0FBVyxDQUM5RCxtQkFBbUIsQ0FBQyxNQUFNLEVBQUUsVUFBVSxDQUFDLE1BQU0sRUFBRSxLQUFLLENBQUMsQ0FBQztJQUUxRCxNQUFNLFlBQVksR0FDZCxZQUFZLENBQUMsbUJBQW1CLENBQUMsT0FBTyxDQUFDLEtBQUssRUFBRSxVQUFVLEVBQUUsSUFBSSxFQUFFLEtBQUssQ0FBQyxDQUFDO0lBRTdFLE1BQU0sZUFBZSxHQUFHLE9BQU8sQ0FDM0IsRUFBQyxNQUFNLEVBQUUsRUFBQyxDQUFDLEVBQUUsT0FBTyxFQUFDLEVBQUUsT0FBTyxFQUFFLEtBQUssRUFBRSxFQUFDLEtBQUssRUFBRSxtQkFBbUIsRUFBQyxFQUFDLENBQUMsQ0FBQztJQUUxRSxNQUFNLFFBQVEsR0FBRyxTQUFTLENBQUM7UUFDekIsTUFBTSxFQUFFLEVBQUMsQ0FBQyxFQUFFLGVBQWUsRUFBQztRQUM1QixPQUFPO1FBQ1AsS0FBSyxFQUFFLEVBQUMsSUFBSSxFQUFFLGlDQUFpQyxFQUFDO0tBQ2pELENBQUMsQ0FBQztJQUVILE1BQU0sTUFBTSxHQUNSLE9BQU8sQ0FBQyxFQUFDLE1BQU0sRUFBRSxFQUFDLENBQUMsRUFBRSxRQUFRLEVBQUMsRUFBRSxPQUFPLEVBQUUsS0FBSyxFQUFFLEVBQUMsS0FBSyxFQUFFLFlBQVksRUFBQyxFQUFDLENBQUMsQ0FBQztJQUU1RSxTQUFTLENBQUMsSUFBSSxDQUFDLE9BQU8sQ0FBQyxDQUFDO0lBQ3hCLFNBQVMsQ0FBQyxJQUFJLENBQUMsZUFBZSxDQUFDLENBQUM7SUFDaEMsU0FBUyxDQUFDLElBQUksQ0FBQyxRQUFRLENBQUMsQ0FBQztJQUV6QixTQUFTLENBQUMsT0FBTyxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsT0FBTyxDQUFDLDZCQUE2QixDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUM7SUFFakUsT0FBTyxNQUFNLENBQUM7QUFDaEIsQ0FBQyxDQUFDO0FBRUYsTUFBTSxDQUFDLE1BQU0sb0JBQW9CLEdBQWlCO0lBQ2hELFVBQVUsRUFBRSxjQUFjO0lBQzFCLFdBQVcsRUFBRSxPQUFPO0lBQ3BCLFVBQVUsRUFBRSxjQUFrQztDQUMvQyxDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiLyoqXG4gKiBAbGljZW5zZVxuICogQ29weXJpZ2h0IDIwMjAgR29vZ2xlIExMQy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC5cbiAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSBcIkxpY2Vuc2VcIik7XG4gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuXG4gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXRcbiAqXG4gKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjBcbiAqXG4gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlXG4gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiBcIkFTIElTXCIgQkFTSVMsXG4gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC5cbiAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmRcbiAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLlxuICogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbiAqL1xuXG5pbXBvcnQge2JhY2tlbmRfdXRpbCwgS2VybmVsQ29uZmlnLCBLZXJuZWxGdW5jLCBTcGFjZVRvQmF0Y2hORCwgU3BhY2VUb0JhdGNoTkRBdHRycywgU3BhY2VUb0JhdGNoTkRJbnB1dHMsIFRlbnNvckluZm8sIHV0aWx9IGZyb20gJ0B0ZW5zb3JmbG93L3RmanMtY29yZSc7XG5cbmltcG9ydCB7TWF0aEJhY2tlbmRXZWJHTH0gZnJvbSAnLi4vYmFja2VuZF93ZWJnbCc7XG5cbmltcG9ydCB7cGFkVjJ9IGZyb20gJy4vUGFkVjInO1xuaW1wb3J0IHtyZXNoYXBlfSBmcm9tICcuL1Jlc2hhcGUnO1xuaW1wb3J0IHt0cmFuc3Bvc2V9IGZyb20gJy4vVHJhbnNwb3NlJztcblxuZXhwb3J0IGNvbnN0IHNwYWNlVG9CYXRjaE5EID0gKGFyZ3M6IHtcbiAgaW5wdXRzOiBTcGFjZVRvQmF0Y2hORElucHV0cyxcbiAgYmFja2VuZDogTWF0aEJhY2tlbmRXZWJHTCxcbiAgYXR0cnM6IFNwYWNlVG9CYXRjaE5EQXR0cnNcbn0pOiBUZW5zb3JJbmZvID0+IHtcbiAgY29uc3Qge2lucHV0cywgYmFja2VuZCwgYXR0cnN9ID0gYXJncztcbiAgY29uc3Qge3h9ID0gaW5wdXRzO1xuICBjb25zdCB7YmxvY2tTaGFwZSwgcGFkZGluZ3N9ID0gYXR0cnM7XG5cbiAgdXRpbC5hc3NlcnQoXG4gICAgICB4LnNoYXBlLmxlbmd0aCA8PSA0LFxuICAgICAgKCkgPT4gJ3NwYWNlVG9CYXRjaE5EIGZvciByYW5rID4gNCB3aXRoIGEgV2ViR0wgYmFja2VuZCBub3QgJyArXG4gICAgICAgICAgJ2ltcGxlbWVudGVkIHlldCcpO1xuXG4gIGNvbnN0IHByb2QgPSBibG9ja1NoYXBlLnJlZHVjZSgoYSwgYikgPT4gYSAqIGIpO1xuXG4gIGNvbnN0IGNvbXBsZXRlUGFkZGluZ3M6IEFycmF5PFtudW1iZXIsIG51bWJlcl0+ID0gW1swLCAwXV07XG4gIGNvbXBsZXRlUGFkZGluZ3MucHVzaCguLi5wYWRkaW5ncyBhcyBBcnJheTxbbnVtYmVyLCBudW1iZXJdPik7XG4gIGZvciAobGV0IGkgPSAxICsgYmxvY2tTaGFwZS5sZW5ndGg7IGkgPCB4LnNoYXBlLmxlbmd0aDsgKytpKSB7XG4gICAgY29tcGxldGVQYWRkaW5ncy5wdXNoKFswLCAwXSk7XG4gIH1cblxuICBjb25zdCB0b0Rpc3Bvc2UgPSBbXTtcblxuICBjb25zdCBwYWRkZWRYID0gcGFkVjIoe1xuICAgIGlucHV0czoge3h9LFxuICAgIGJhY2tlbmQsXG4gICAgYXR0cnM6IHtwYWRkaW5nczogY29tcGxldGVQYWRkaW5ncywgY29uc3RhbnRWYWx1ZTogMH1cbiAgfSk7XG5cbiAgY29uc3QgcmVzaGFwZWRQYWRkZWRTaGFwZSA9XG4gICAgICBiYWNrZW5kX3V0aWwuZ2V0UmVzaGFwZWQocGFkZGVkWC5zaGFwZSwgYmxvY2tTaGFwZSwgcHJvZCwgZmFsc2UpO1xuXG4gIGNvbnN0IHBlcm11dGVkUmVzaGFwZWRQYWRkZWRQZXJtdXRhdGlvbiA9IGJhY2tlbmRfdXRpbC5nZXRQZXJtdXRlZChcbiAgICAgIHJlc2hhcGVkUGFkZGVkU2hhcGUubGVuZ3RoLCBibG9ja1NoYXBlLmxlbmd0aCwgZmFsc2UpO1xuXG4gIGNvbnN0IGZsYXR0ZW5TaGFwZSA9XG4gICAgICBiYWNrZW5kX3V0aWwuZ2V0UmVzaGFwZWRQZXJtdXRlZChwYWRkZWRYLnNoYXBlLCBibG9ja1NoYXBlLCBwcm9kLCBmYWxzZSk7XG5cbiAgY29uc3QgcmVzaGFwZWRQYWRkZWRYID0gcmVzaGFwZShcbiAgICAgIHtpbnB1dHM6IHt4OiBwYWRkZWRYfSwgYmFja2VuZCwgYXR0cnM6IHtzaGFwZTogcmVzaGFwZWRQYWRkZWRTaGFwZX19KTtcblxuICBjb25zdCBwYWRkZWRYVCA9IHRyYW5zcG9zZSh7XG4gICAgaW5wdXRzOiB7eDogcmVzaGFwZWRQYWRkZWRYfSxcbiAgICBiYWNrZW5kLFxuICAgIGF0dHJzOiB7cGVybTogcGVybXV0ZWRSZXNoYXBlZFBhZGRlZFBlcm11dGF0aW9ufVxuICB9KTtcblxuICBjb25zdCByZXN1bHQgPVxuICAgICAgcmVzaGFwZSh7aW5wdXRzOiB7eDogcGFkZGVkWFR9LCBiYWNrZW5kLCBhdHRyczoge3NoYXBlOiBmbGF0dGVuU2hhcGV9fSk7XG5cbiAgdG9EaXNwb3NlLnB1c2gocGFkZGVkWCk7XG4gIHRvRGlzcG9zZS5wdXNoKHJlc2hhcGVkUGFkZGVkWCk7XG4gIHRvRGlzcG9zZS5wdXNoKHBhZGRlZFhUKTtcblxuICB0b0Rpc3Bvc2UuZm9yRWFjaCh0ID0+IGJhY2tlbmQuZGlzcG9zZUludGVybWVkaWF0ZVRlbnNvckluZm8odCkpO1xuXG4gIHJldHVybiByZXN1bHQ7XG59O1xuXG5leHBvcnQgY29uc3Qgc3BhY2VUb0JhdGNoTkRDb25maWc6IEtlcm5lbENvbmZpZyA9IHtcbiAga2VybmVsTmFtZTogU3BhY2VUb0JhdGNoTkQsXG4gIGJhY2tlbmROYW1lOiAnd2ViZ2wnLFxuICBrZXJuZWxGdW5jOiBzcGFjZVRvQmF0Y2hORCBhcyB7fSBhcyBLZXJuZWxGdW5jXG59O1xuIl19","/**\n * @license\n * Copyright 2021 Google LLC. All Rights Reserved.\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n * =============================================================================\n */\nimport { SparseFillEmptyRows } from '@tensorflow/tfjs-core';\nimport { sparseFillEmptyRowsImplCPU } from '../kernel_utils/shared';\nexport function sparseFillEmptyRows(args) {\n const { inputs, backend } = args;\n const { indices, values, denseShape, defaultValue } = inputs;\n if (denseShape.shape.length !== 1) {\n throw new Error(`Dense shape must be a vector, saw:\n ${denseShape.shape}`);\n }\n if (indices.shape.length !== 2) {\n throw new Error(`Indices must be a matrix, saw:\n ${indices.shape}`);\n }\n if (values.shape.length !== 1) {\n throw new Error(`Values must be a vector, saw:\n ${values.shape}`);\n }\n if (defaultValue.shape.length !== 0) {\n throw new Error(`Default value must be a scalar, saw:\n ${defaultValue.shape}`);\n }\n const $indices = backend.readSync(indices.dataId);\n const $values = backend.readSync(values.dataId);\n const $denseShape = backend.readSync(denseShape.dataId);\n const $defaultValue = backend.readSync(defaultValue.dataId)[0];\n const [outputIndices, outputIndicesShape, outputValues, emptyRowIndicator, reverseIndexMap] = sparseFillEmptyRowsImplCPU($indices, indices.shape, indices.dtype, $values, values.dtype, $denseShape, $defaultValue);\n return [\n backend.makeTensorInfo(outputIndicesShape, indices.dtype, outputIndices),\n backend.makeTensorInfo([outputIndicesShape[0]], values.dtype, outputValues),\n backend.makeTensorInfo([emptyRowIndicator.length], 'bool', new Uint8Array(emptyRowIndicator.map((value) => Number(value)))),\n backend.makeTensorInfo([reverseIndexMap.length], indices.dtype, new Int32Array(reverseIndexMap)),\n ];\n}\nexport const sparseFillEmptyRowsConfig = {\n kernelName: SparseFillEmptyRows,\n backendName: 'webgl',\n kernelFunc: sparseFillEmptyRows,\n};\n//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiU3BhcnNlRmlsbEVtcHR5Um93cy5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uLy4uL3RmanMtYmFja2VuZC13ZWJnbC9zcmMva2VybmVscy9TcGFyc2VGaWxsRW1wdHlSb3dzLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBOzs7Ozs7Ozs7Ozs7Ozs7R0FlRztBQUVILE9BQU8sRUFBMkIsbUJBQW1CLEVBQW9ELE1BQU0sdUJBQXVCLENBQUM7QUFHdkksT0FBTyxFQUFDLDBCQUEwQixFQUFDLE1BQU0sd0JBQXdCLENBQUM7QUFFbEUsTUFBTSxVQUFVLG1CQUFtQixDQUFDLElBR25DO0lBQ0MsTUFBTSxFQUFDLE1BQU0sRUFBRSxPQUFPLEVBQUMsR0FBRyxJQUFJLENBQUM7SUFDL0IsTUFBTSxFQUFDLE9BQU8sRUFBRSxNQUFNLEVBQUUsVUFBVSxFQUFFLFlBQVksRUFBQyxHQUFHLE1BQU0sQ0FBQztJQUMzRCxJQUFJLFVBQVUsQ0FBQyxLQUFLLENBQUMsTUFBTSxLQUFLLENBQUMsRUFBRTtRQUNqQyxNQUFNLElBQUksS0FBSyxDQUFDO1dBQ1QsVUFBVSxDQUFDLEtBQUssRUFBRSxDQUFDLENBQUM7S0FDNUI7SUFDRCxJQUFJLE9BQU8sQ0FBQyxLQUFLLENBQUMsTUFBTSxLQUFLLENBQUMsRUFBRTtRQUM5QixNQUFNLElBQUksS0FBSyxDQUFDO1dBQ1QsT0FBTyxDQUFDLEtBQUssRUFBRSxDQUFDLENBQUM7S0FDekI7SUFDRCxJQUFJLE1BQU0sQ0FBQyxLQUFLLENBQUMsTUFBTSxLQUFLLENBQUMsRUFBRTtRQUM3QixNQUFNLElBQUksS0FBSyxDQUFDO1dBQ1QsTUFBTSxDQUFDLEtBQUssRUFBRSxDQUFDLENBQUM7S0FDeEI7SUFDRCxJQUFJLFlBQVksQ0FBQyxLQUFLLENBQUMsTUFBTSxLQUFLLENBQUMsRUFBRTtRQUNuQyxNQUFNLElBQUksS0FBSyxDQUFDO1VBQ1YsWUFBWSxDQUFDLEtBQUssRUFBRSxDQUFDLENBQUM7S0FDN0I7SUFFRCxNQUFNLFFBQVEsR0FBRyxPQUFPLENBQUMsUUFBUSxDQUFDLE9BQU8sQ0FBQyxNQUFNLENBQWUsQ0FBQztJQUNoRSxNQUFNLE9BQU8sR0FBRyxPQUFPLENBQUMsUUFBUSxDQUFDLE1BQU0sQ0FBQyxNQUFNLENBQWUsQ0FBQztJQUM5RCxNQUFNLFdBQVcsR0FBRyxPQUFPLENBQUMsUUFBUSxDQUFDLFVBQVUsQ0FBQyxNQUFNLENBQWUsQ0FBQztJQUN0RSxNQUFNLGFBQWEsR0FDZixPQUFPLENBQUMsUUFBUSxDQUFDLFlBQVksQ0FBQyxNQUFNLENBQUMsQ0FBQyxDQUFDLENBQVcsQ0FBQztJQUV2RCxNQUFNLENBQUMsYUFBYSxFQUFFLGtCQUFrQixFQUFFLFlBQVksRUFDL0MsaUJBQWlCLEVBQUUsZUFBZSxDQUFDLEdBQ3RDLDBCQUEwQixDQUN0QixRQUFRLEVBQUUsT0FBTyxDQUFDLEtBQUssRUFBRSxPQUFPLENBQUMsS0FBSyxFQUFFLE9BQU8sRUFBRSxNQUFNLENBQUMsS0FBSyxFQUM3RCxXQUFXLEVBQUUsYUFBYSxDQUFDLENBQUM7SUFDcEMsT0FBTztRQUNMLE9BQU8sQ0FBQyxjQUFjLENBQUMsa0JBQWtCLEVBQUUsT0FBTyxDQUFDLEtBQUssRUFBRSxhQUFhLENBQUM7UUFDeEUsT0FBTyxDQUFDLGNBQWMsQ0FDbEIsQ0FBQyxrQkFBa0IsQ0FBQyxDQUFDLENBQUMsQ0FBQyxFQUFFLE1BQU0sQ0FBQyxLQUFLLEVBQUUsWUFBWSxDQUFDO1FBQ3hELE9BQU8sQ0FBQyxjQUFjLENBQ2xCLENBQUMsaUJBQWlCLENBQUMsTUFBTSxDQUFDLEVBQUUsTUFBTSxFQUNsQyxJQUFJLFVBQVUsQ0FDVixpQkFBaUIsQ0FBQyxHQUFHLENBQUMsQ0FBQyxLQUFjLEVBQUUsRUFBRSxDQUFDLE1BQU0sQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDLENBQUM7UUFDbEUsT0FBTyxDQUFDLGNBQWMsQ0FDbEIsQ0FBQyxlQUFlLENBQUMsTUFBTSxDQUFDLEVBQUUsT0FBTyxDQUFDLEtBQUssRUFDdkMsSUFBSSxVQUFVLENBQUMsZUFBZSxDQUFDLENBQUM7S0FDckMsQ0FBQztBQUNKLENBQUM7QUFFRCxNQUFNLENBQUMsTUFBTSx5QkFBeUIsR0FBaUI7SUFDckQsVUFBVSxFQUFFLG1CQUFtQjtJQUMvQixXQUFXLEVBQUUsT0FBTztJQUNwQixVQUFVLEVBQUUsbUJBQXVDO0NBQ3BELENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyIvKipcbiAqIEBsaWNlbnNlXG4gKiBDb3B5cmlnaHQgMjAyMSBHb29nbGUgTExDLiBBbGwgUmlnaHRzIFJlc2VydmVkLlxuICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlIFwiTGljZW5zZVwiKTtcbiAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS5cbiAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdFxuICpcbiAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMFxuICpcbiAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmVcbiAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuIFwiQVMgSVNcIiBCQVNJUyxcbiAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLlxuICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZFxuICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuXG4gKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuICovXG5cbmltcG9ydCB7S2VybmVsQ29uZmlnLCBLZXJuZWxGdW5jLCBTcGFyc2VGaWxsRW1wdHlSb3dzLCBTcGFyc2VGaWxsRW1wdHlSb3dzSW5wdXRzLCBUZW5zb3JJbmZvLCBUeXBlZEFycmF5fSBmcm9tICdAdGVuc29yZmxvdy90ZmpzLWNvcmUnO1xuXG5pbXBvcnQge01hdGhCYWNrZW5kV2ViR0x9IGZyb20gJy4uL2JhY2tlbmRfd2ViZ2wnO1xuaW1wb3J0IHtzcGFyc2VGaWxsRW1wdHlSb3dzSW1wbENQVX0gZnJvbSAnLi4va2VybmVsX3V0aWxzL3NoYXJlZCc7XG5cbmV4cG9ydCBmdW5jdGlvbiBzcGFyc2VGaWxsRW1wdHlSb3dzKGFyZ3M6IHtcbiAgaW5wdXRzOiBTcGFyc2VGaWxsRW1wdHlSb3dzSW5wdXRzLFxuICBiYWNrZW5kOiBNYXRoQmFja2VuZFdlYkdMXG59KTogW1RlbnNvckluZm8sIFRlbnNvckluZm8sIFRlbnNvckluZm8sIFRlbnNvckluZm9dIHtcbiAgY29uc3Qge2lucHV0cywgYmFja2VuZH0gPSBhcmdzO1xuICBjb25zdCB7aW5kaWNlcywgdmFsdWVzLCBkZW5zZVNoYXBlLCBkZWZhdWx0VmFsdWV9ID0gaW5wdXRzO1xuICBpZiAoZGVuc2VTaGFwZS5zaGFwZS5sZW5ndGggIT09IDEpIHtcbiAgICB0aHJvdyBuZXcgRXJyb3IoYERlbnNlIHNoYXBlIG11c3QgYmUgYSB2ZWN0b3IsIHNhdzpcbiAgICAgICAgICR7ZGVuc2VTaGFwZS5zaGFwZX1gKTtcbiAgfVxuICBpZiAoaW5kaWNlcy5zaGFwZS5sZW5ndGggIT09IDIpIHtcbiAgICB0aHJvdyBuZXcgRXJyb3IoYEluZGljZXMgbXVzdCBiZSBhIG1hdHJpeCwgc2F3OlxuICAgICAgICAgJHtpbmRpY2VzLnNoYXBlfWApO1xuICB9XG4gIGlmICh2YWx1ZXMuc2hhcGUubGVuZ3RoICE9PSAxKSB7XG4gICAgdGhyb3cgbmV3IEVycm9yKGBWYWx1ZXMgbXVzdCBiZSBhIHZlY3Rvciwgc2F3OlxuICAgICAgICAgJHt2YWx1ZXMuc2hhcGV9YCk7XG4gIH1cbiAgaWYgKGRlZmF1bHRWYWx1ZS5zaGFwZS5sZW5ndGggIT09IDApIHtcbiAgICB0aHJvdyBuZXcgRXJyb3IoYERlZmF1bHQgdmFsdWUgbXVzdCBiZSBhIHNjYWxhciwgc2F3OlxuICAgICAgICAke2RlZmF1bHRWYWx1ZS5zaGFwZX1gKTtcbiAgfVxuXG4gIGNvbnN0ICRpbmRpY2VzID0gYmFja2VuZC5yZWFkU3luYyhpbmRpY2VzLmRhdGFJZCkgYXMgVHlwZWRBcnJheTtcbiAgY29uc3QgJHZhbHVlcyA9IGJhY2tlbmQucmVhZFN5bmModmFsdWVzLmRhdGFJZCkgYXMgVHlwZWRBcnJheTtcbiAgY29uc3QgJGRlbnNlU2hhcGUgPSBiYWNrZW5kLnJlYWRTeW5jKGRlbnNlU2hhcGUuZGF0YUlkKSBhcyBUeXBlZEFycmF5O1xuICBjb25zdCAkZGVmYXVsdFZhbHVlID1cbiAgICAgIGJhY2tlbmQucmVhZFN5bmMoZGVmYXVsdFZhbHVlLmRhdGFJZClbMF0gYXMgbnVtYmVyO1xuXG4gIGNvbnN0IFtvdXRwdXRJbmRpY2VzLCBvdXRwdXRJbmRpY2VzU2hhcGUsIG91dHB1dFZhbHVlcyxcbiAgICAgICAgIGVtcHR5Um93SW5kaWNhdG9yLCByZXZlcnNlSW5kZXhNYXBdID1cbiAgICAgIHNwYXJzZUZpbGxFbXB0eVJvd3NJbXBsQ1BVKFxuICAgICAgICAgICRpbmRpY2VzLCBpbmRpY2VzLnNoYXBlLCBpbmRpY2VzLmR0eXBlLCAkdmFsdWVzLCB2YWx1ZXMuZHR5cGUsXG4gICAgICAgICAgJGRlbnNlU2hhcGUsICRkZWZhdWx0VmFsdWUpO1xuICByZXR1cm4gW1xuICAgIGJhY2tlbmQubWFrZVRlbnNvckluZm8ob3V0cHV0SW5kaWNlc1NoYXBlLCBpbmRpY2VzLmR0eXBlLCBvdXRwdXRJbmRpY2VzKSxcbiAgICBiYWNrZW5kLm1ha2VUZW5zb3JJbmZvKFxuICAgICAgICBbb3V0cHV0SW5kaWNlc1NoYXBlWzBdXSwgdmFsdWVzLmR0eXBlLCBvdXRwdXRWYWx1ZXMpLFxuICAgIGJhY2tlbmQubWFrZVRlbnNvckluZm8oXG4gICAgICAgIFtlbXB0eVJvd0luZGljYXRvci5sZW5ndGhdLCAnYm9vbCcsXG4gICAgICAgIG5ldyBVaW50OEFycmF5KFxuICAgICAgICAgICAgZW1wdHlSb3dJbmRpY2F0b3IubWFwKCh2YWx1ZTogYm9vbGVhbikgPT4gTnVtYmVyKHZhbHVlKSkpKSxcbiAgICBiYWNrZW5kLm1ha2VUZW5zb3JJbmZvKFxuICAgICAgICBbcmV2ZXJzZUluZGV4TWFwLmxlbmd0aF0sIGluZGljZXMuZHR5cGUsXG4gICAgICAgIG5ldyBJbnQzMkFycmF5KHJldmVyc2VJbmRleE1hcCkpLFxuICBdO1xufVxuXG5leHBvcnQgY29uc3Qgc3BhcnNlRmlsbEVtcHR5Um93c0NvbmZpZzogS2VybmVsQ29uZmlnID0ge1xuICBrZXJuZWxOYW1lOiBTcGFyc2VGaWxsRW1wdHlSb3dzLFxuICBiYWNrZW5kTmFtZTogJ3dlYmdsJyxcbiAga2VybmVsRnVuYzogc3BhcnNlRmlsbEVtcHR5Um93cyBhcyB7fSBhcyBLZXJuZWxGdW5jLFxufTtcbiJdfQ==","/**\n * @license\n * Copyright 2021 Google LLC. All Rights Reserved.\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n * =============================================================================\n */\nimport { SparseReshape } from '@tensorflow/tfjs-core';\nimport { sparseReshapeImplCPU } from '../kernel_utils/shared';\nexport function sparseReshape(args) {\n const { inputs, backend } = args;\n const { inputIndices, inputShape, newShape } = inputs;\n if (inputIndices.shape.length !== 2) {\n throw new Error(`Input indices should be a matrix but received shape ${inputIndices.shape}`);\n }\n if (inputShape.shape.length !== 1) {\n throw new Error(`Input shape should be a vector but received shape ${inputShape.shape}`);\n }\n if (newShape.shape.length !== 1) {\n throw new Error(`Target shape should be a vector but received shape ${newShape.shape}`);\n }\n const $inputShape = Array.from(backend.readSync(inputShape.dataId));\n const $inputIndices = backend.readSync(inputIndices.dataId);\n const targetShape = Array.from(backend.readSync(newShape.dataId));\n const [newIndices, indicesShape, outputShape] = sparseReshapeImplCPU($inputIndices, inputIndices.shape, inputIndices.dtype, $inputShape, targetShape);\n return [\n backend.makeTensorInfo(indicesShape, inputIndices.dtype, newIndices),\n backend.makeTensorInfo([outputShape.length], newShape.dtype, new Int32Array(outputShape)),\n ];\n}\nexport const sparseReshapeConfig = {\n kernelName: SparseReshape,\n backendName: 'webgl',\n kernelFunc: sparseReshape,\n};\n//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiU3BhcnNlUmVzaGFwZS5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uLy4uL3RmanMtYmFja2VuZC13ZWJnbC9zcmMva2VybmVscy9TcGFyc2VSZXNoYXBlLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBOzs7Ozs7Ozs7Ozs7Ozs7R0FlRztBQUVILE9BQU8sRUFBZSxhQUFhLEVBQThDLE1BQU0sdUJBQXVCLENBQUM7QUFHL0csT0FBTyxFQUFDLG9CQUFvQixFQUFDLE1BQU0sd0JBQXdCLENBQUM7QUFFNUQsTUFBTSxVQUFVLGFBQWEsQ0FDekIsSUFBOEQ7SUFFaEUsTUFBTSxFQUFDLE1BQU0sRUFBRSxPQUFPLEVBQUMsR0FBRyxJQUFJLENBQUM7SUFDL0IsTUFBTSxFQUFDLFlBQVksRUFBRSxVQUFVLEVBQUUsUUFBUSxFQUFDLEdBQUcsTUFBTSxDQUFDO0lBQ3BELElBQUksWUFBWSxDQUFDLEtBQUssQ0FBQyxNQUFNLEtBQUssQ0FBQyxFQUFFO1FBQ25DLE1BQU0sSUFBSSxLQUFLLENBQUMsdURBQ1osWUFBWSxDQUFDLEtBQUssRUFBRSxDQUFDLENBQUM7S0FDM0I7SUFDRCxJQUFJLFVBQVUsQ0FBQyxLQUFLLENBQUMsTUFBTSxLQUFLLENBQUMsRUFBRTtRQUNqQyxNQUFNLElBQUksS0FBSyxDQUFDLHFEQUNaLFVBQVUsQ0FBQyxLQUFLLEVBQUUsQ0FBQyxDQUFDO0tBQ3pCO0lBRUQsSUFBSSxRQUFRLENBQUMsS0FBSyxDQUFDLE1BQU0sS0FBSyxDQUFDLEVBQUU7UUFDL0IsTUFBTSxJQUFJLEtBQUssQ0FDWCxzREFBc0QsUUFBUSxDQUFDLEtBQUssRUFBRSxDQUFDLENBQUM7S0FDN0U7SUFFRCxNQUFNLFdBQVcsR0FDYixLQUFLLENBQUMsSUFBSSxDQUFDLE9BQU8sQ0FBQyxRQUFRLENBQUMsVUFBVSxDQUFDLE1BQU0sQ0FBZSxDQUFDLENBQUM7SUFDbEUsTUFBTSxhQUFhLEdBQUcsT0FBTyxDQUFDLFFBQVEsQ0FBQyxZQUFZLENBQUMsTUFBTSxDQUFlLENBQUM7SUFDMUUsTUFBTSxXQUFXLEdBQ2IsS0FBSyxDQUFDLElBQUksQ0FBQyxPQUFPLENBQUMsUUFBUSxDQUFDLFFBQVEsQ0FBQyxNQUFNLENBQWUsQ0FBQyxDQUFDO0lBRWhFLE1BQU0sQ0FBQyxVQUFVLEVBQUUsWUFBWSxFQUFFLFdBQVcsQ0FBQyxHQUFHLG9CQUFvQixDQUNoRSxhQUFhLEVBQUUsWUFBWSxDQUFDLEtBQUssRUFBRSxZQUFZLENBQUMsS0FBSyxFQUFFLFdBQVcsRUFDbEUsV0FBVyxDQUFDLENBQUM7SUFDakIsT0FBTztRQUNMLE9BQU8sQ0FBQyxjQUFjLENBQUMsWUFBWSxFQUFFLFlBQVksQ0FBQyxLQUFLLEVBQUUsVUFBVSxDQUFDO1FBQ3BFLE9BQU8sQ0FBQyxjQUFjLENBQ2xCLENBQUMsV0FBVyxDQUFDLE1BQU0sQ0FBQyxFQUFFLFFBQVEsQ0FBQyxLQUFLLEVBQUUsSUFBSSxVQUFVLENBQUMsV0FBVyxDQUFDLENBQUM7S0FDdkUsQ0FBQztBQUNKLENBQUM7QUFFRCxNQUFNLENBQUMsTUFBTSxtQkFBbUIsR0FBaUI7SUFDL0MsVUFBVSxFQUFFLGFBQWE7SUFDekIsV0FBVyxFQUFFLE9BQU87SUFDcEIsVUFBVSxFQUFFLGFBQWE7Q0FDMUIsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbIi8qKlxuICogQGxpY2Vuc2VcbiAqIENvcHlyaWdodCAyMDIxIEdvb2dsZSBMTEMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuXG4gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgXCJMaWNlbnNlXCIpO1xuICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLlxuICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0XG4gKlxuICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wXG4gKlxuICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZVxuICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gXCJBUyBJU1wiIEJBU0lTLFxuICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuXG4gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kXG4gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS5cbiAqID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4gKi9cblxuaW1wb3J0IHtLZXJuZWxDb25maWcsIFNwYXJzZVJlc2hhcGUsIFNwYXJzZVJlc2hhcGVJbnB1dHMsIFRlbnNvckluZm8sIFR5cGVkQXJyYXl9IGZyb20gJ0B0ZW5zb3JmbG93L3RmanMtY29yZSc7XG5cbmltcG9ydCB7TWF0aEJhY2tlbmRXZWJHTH0gZnJvbSAnLi4vYmFja2VuZF93ZWJnbCc7XG5pbXBvcnQge3NwYXJzZVJlc2hhcGVJbXBsQ1BVfSBmcm9tICcuLi9rZXJuZWxfdXRpbHMvc2hhcmVkJztcblxuZXhwb3J0IGZ1bmN0aW9uIHNwYXJzZVJlc2hhcGUoXG4gICAgYXJnczoge2lucHV0czogU3BhcnNlUmVzaGFwZUlucHV0cywgYmFja2VuZDogTWF0aEJhY2tlbmRXZWJHTH0pOlxuICAgIFtUZW5zb3JJbmZvLCBUZW5zb3JJbmZvXSB7XG4gIGNvbnN0IHtpbnB1dHMsIGJhY2tlbmR9ID0gYXJncztcbiAgY29uc3Qge2lucHV0SW5kaWNlcywgaW5wdXRTaGFwZSwgbmV3U2hhcGV9ID0gaW5wdXRzO1xuICBpZiAoaW5wdXRJbmRpY2VzLnNoYXBlLmxlbmd0aCAhPT0gMikge1xuICAgIHRocm93IG5ldyBFcnJvcihgSW5wdXQgaW5kaWNlcyBzaG91bGQgYmUgYSBtYXRyaXggYnV0IHJlY2VpdmVkIHNoYXBlICR7XG4gICAgICAgIGlucHV0SW5kaWNlcy5zaGFwZX1gKTtcbiAgfVxuICBpZiAoaW5wdXRTaGFwZS5zaGFwZS5sZW5ndGggIT09IDEpIHtcbiAgICB0aHJvdyBuZXcgRXJyb3IoYElucHV0IHNoYXBlIHNob3VsZCBiZSBhIHZlY3RvciBidXQgcmVjZWl2ZWQgc2hhcGUgJHtcbiAgICAgICAgaW5wdXRTaGFwZS5zaGFwZX1gKTtcbiAgfVxuXG4gIGlmIChuZXdTaGFwZS5zaGFwZS5sZW5ndGggIT09IDEpIHtcbiAgICB0aHJvdyBuZXcgRXJyb3IoXG4gICAgICAgIGBUYXJnZXQgc2hhcGUgc2hvdWxkIGJlIGEgdmVjdG9yIGJ1dCByZWNlaXZlZCBzaGFwZSAke25ld1NoYXBlLnNoYXBlfWApO1xuICB9XG5cbiAgY29uc3QgJGlucHV0U2hhcGUgPVxuICAgICAgQXJyYXkuZnJvbShiYWNrZW5kLnJlYWRTeW5jKGlucHV0U2hhcGUuZGF0YUlkKSBhcyBUeXBlZEFycmF5KTtcbiAgY29uc3QgJGlucHV0SW5kaWNlcyA9IGJhY2tlbmQucmVhZFN5bmMoaW5wdXRJbmRpY2VzLmRhdGFJZCkgYXMgVHlwZWRBcnJheTtcbiAgY29uc3QgdGFyZ2V0U2hhcGUgPVxuICAgICAgQXJyYXkuZnJvbShiYWNrZW5kLnJlYWRTeW5jKG5ld1NoYXBlLmRhdGFJZCkgYXMgVHlwZWRBcnJheSk7XG5cbiAgY29uc3QgW25ld0luZGljZXMsIGluZGljZXNTaGFwZSwgb3V0cHV0U2hhcGVdID0gc3BhcnNlUmVzaGFwZUltcGxDUFUoXG4gICAgICAkaW5wdXRJbmRpY2VzLCBpbnB1dEluZGljZXMuc2hhcGUsIGlucHV0SW5kaWNlcy5kdHlwZSwgJGlucHV0U2hhcGUsXG4gICAgICB0YXJnZXRTaGFwZSk7XG4gIHJldHVybiBbXG4gICAgYmFja2VuZC5tYWtlVGVuc29ySW5mbyhpbmRpY2VzU2hhcGUsIGlucHV0SW5kaWNlcy5kdHlwZSwgbmV3SW5kaWNlcyksXG4gICAgYmFja2VuZC5tYWtlVGVuc29ySW5mbyhcbiAgICAgICAgW291dHB1dFNoYXBlLmxlbmd0aF0sIG5ld1NoYXBlLmR0eXBlLCBuZXcgSW50MzJBcnJheShvdXRwdXRTaGFwZSkpLFxuICBdO1xufVxuXG5leHBvcnQgY29uc3Qgc3BhcnNlUmVzaGFwZUNvbmZpZzogS2VybmVsQ29uZmlnID0ge1xuICBrZXJuZWxOYW1lOiBTcGFyc2VSZXNoYXBlLFxuICBiYWNrZW5kTmFtZTogJ3dlYmdsJyxcbiAga2VybmVsRnVuYzogc3BhcnNlUmVzaGFwZSxcbn07XG4iXX0=","/**\n * @license\n * Copyright 2021 Google LLC. All Rights Reserved.\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n * =============================================================================\n */\nimport { SparseSegmentMean } from '@tensorflow/tfjs-core';\nimport { sparseSegmentReductionImplCPU } from '../kernel_utils/shared';\nexport function sparseSegmentMean(args) {\n const { inputs, backend } = args;\n const { data, indices, segmentIds } = inputs;\n if (data.shape.length < 1) {\n throw new Error(`Data should be at least 1 dimensional but received scalar`);\n }\n if (indices.shape.length !== 1) {\n throw new Error(`Indices should be a vector but received shape\n ${indices.shape}`);\n }\n if (segmentIds.shape.length !== 1) {\n throw new Error(`Segment ids should be a vector but received shape\n ${segmentIds.shape}`);\n }\n const $data = backend.readSync(data.dataId);\n const $indices = backend.readSync(indices.dataId);\n const $segmentIds = backend.readSync(segmentIds.dataId);\n const [outputData, outputDataShape] = sparseSegmentReductionImplCPU($data, data.shape, data.dtype, $indices, $segmentIds, true);\n return backend.makeTensorInfo(outputDataShape, data.dtype, outputData);\n}\nexport const sparseSegmentMeanConfig = {\n kernelName: SparseSegmentMean,\n backendName: 'webgl',\n kernelFunc: sparseSegmentMean,\n};\n//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiU3BhcnNlU2VnbWVudE1lYW4uanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi8uLi90ZmpzLWJhY2tlbmQtd2ViZ2wvc3JjL2tlcm5lbHMvU3BhcnNlU2VnbWVudE1lYW4udHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUE7Ozs7Ozs7Ozs7Ozs7OztHQWVHO0FBRUgsT0FBTyxFQUEyQixpQkFBaUIsRUFBa0QsTUFBTSx1QkFBdUIsQ0FBQztBQUduSSxPQUFPLEVBQUMsNkJBQTZCLEVBQUMsTUFBTSx3QkFBd0IsQ0FBQztBQUVyRSxNQUFNLFVBQVUsaUJBQWlCLENBQzdCLElBQWtFO0lBRXBFLE1BQU0sRUFBQyxNQUFNLEVBQUUsT0FBTyxFQUFDLEdBQUcsSUFBSSxDQUFDO0lBQy9CLE1BQU0sRUFBQyxJQUFJLEVBQUUsT0FBTyxFQUFFLFVBQVUsRUFBQyxHQUFHLE1BQU0sQ0FBQztJQUMzQyxJQUFJLElBQUksQ0FBQyxLQUFLLENBQUMsTUFBTSxHQUFHLENBQUMsRUFBRTtRQUN6QixNQUFNLElBQUksS0FBSyxDQUNYLDJEQUEyRCxDQUFDLENBQUM7S0FDbEU7SUFDRCxJQUFJLE9BQU8sQ0FBQyxLQUFLLENBQUMsTUFBTSxLQUFLLENBQUMsRUFBRTtRQUM5QixNQUFNLElBQUksS0FBSyxDQUFDO2dCQUNKLE9BQU8sQ0FBQyxLQUFLLEVBQUUsQ0FBQyxDQUFDO0tBQzlCO0lBQ0QsSUFBSSxVQUFVLENBQUMsS0FBSyxDQUFDLE1BQU0sS0FBSyxDQUFDLEVBQUU7UUFDakMsTUFBTSxJQUFJLEtBQUssQ0FBQztnQkFDSixVQUFVLENBQUMsS0FBSyxFQUFFLENBQUMsQ0FBQztLQUNqQztJQUVELE1BQU0sS0FBSyxHQUFHLE9BQU8sQ0FBQyxRQUFRLENBQUMsSUFBSSxDQUFDLE1BQU0sQ0FBZSxDQUFDO0lBQzFELE1BQU0sUUFBUSxHQUFHLE9BQU8sQ0FBQyxRQUFRLENBQUMsT0FBTyxDQUFDLE1BQU0sQ0FBZSxDQUFDO0lBQ2hFLE1BQU0sV0FBVyxHQUFHLE9BQU8sQ0FBQyxRQUFRLENBQUMsVUFBVSxDQUFDLE1BQU0sQ0FBZSxDQUFDO0lBRXRFLE1BQU0sQ0FBQyxVQUFVLEVBQUUsZUFBZSxDQUFDLEdBQUcsNkJBQTZCLENBQy9ELEtBQUssRUFBRSxJQUFJLENBQUMsS0FBSyxFQUFFLElBQUksQ0FBQyxLQUFLLEVBQUUsUUFBUSxFQUFFLFdBQVcsRUFBRSxJQUFJLENBQUMsQ0FBQztJQUNoRSxPQUFPLE9BQU8sQ0FBQyxjQUFjLENBQUMsZUFBZSxFQUFFLElBQUksQ0FBQyxLQUFLLEVBQUUsVUFBVSxDQUFDLENBQUM7QUFDekUsQ0FBQztBQUVELE1BQU0sQ0FBQyxNQUFNLHVCQUF1QixHQUFpQjtJQUNuRCxVQUFVLEVBQUUsaUJBQWlCO0lBQzdCLFdBQVcsRUFBRSxPQUFPO0lBQ3BCLFVBQVUsRUFBRSxpQkFBcUM7Q0FDbEQsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbIi8qKlxuICogQGxpY2Vuc2VcbiAqIENvcHlyaWdodCAyMDIxIEdvb2dsZSBMTEMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuXG4gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgXCJMaWNlbnNlXCIpO1xuICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLlxuICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0XG4gKlxuICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wXG4gKlxuICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZVxuICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gXCJBUyBJU1wiIEJBU0lTLFxuICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuXG4gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kXG4gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS5cbiAqID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4gKi9cblxuaW1wb3J0IHtLZXJuZWxDb25maWcsIEtlcm5lbEZ1bmMsIFNwYXJzZVNlZ21lbnRNZWFuLCBTcGFyc2VTZWdtZW50TWVhbklucHV0cywgVGVuc29ySW5mbywgVHlwZWRBcnJheX0gZnJvbSAnQHRlbnNvcmZsb3cvdGZqcy1jb3JlJztcblxuaW1wb3J0IHtNYXRoQmFja2VuZFdlYkdMfSBmcm9tICcuLi9iYWNrZW5kX3dlYmdsJztcbmltcG9ydCB7c3BhcnNlU2VnbWVudFJlZHVjdGlvbkltcGxDUFV9IGZyb20gJy4uL2tlcm5lbF91dGlscy9zaGFyZWQnO1xuXG5leHBvcnQgZnVuY3Rpb24gc3BhcnNlU2VnbWVudE1lYW4oXG4gICAgYXJnczoge2lucHV0czogU3BhcnNlU2VnbWVudE1lYW5JbnB1dHMsIGJhY2tlbmQ6IE1hdGhCYWNrZW5kV2ViR0x9KTpcbiAgICBUZW5zb3JJbmZvIHtcbiAgY29uc3Qge2lucHV0cywgYmFja2VuZH0gPSBhcmdzO1xuICBjb25zdCB7ZGF0YSwgaW5kaWNlcywgc2VnbWVudElkc30gPSBpbnB1dHM7XG4gIGlmIChkYXRhLnNoYXBlLmxlbmd0aCA8IDEpIHtcbiAgICB0aHJvdyBuZXcgRXJyb3IoXG4gICAgICAgIGBEYXRhIHNob3VsZCBiZSBhdCBsZWFzdCAxIGRpbWVuc2lvbmFsIGJ1dCByZWNlaXZlZCBzY2FsYXJgKTtcbiAgfVxuICBpZiAoaW5kaWNlcy5zaGFwZS5sZW5ndGggIT09IDEpIHtcbiAgICB0aHJvdyBuZXcgRXJyb3IoYEluZGljZXMgc2hvdWxkIGJlIGEgdmVjdG9yIGJ1dCByZWNlaXZlZCBzaGFwZVxuICAgICAgICAgICAgICAke2luZGljZXMuc2hhcGV9YCk7XG4gIH1cbiAgaWYgKHNlZ21lbnRJZHMuc2hhcGUubGVuZ3RoICE9PSAxKSB7XG4gICAgdGhyb3cgbmV3IEVycm9yKGBTZWdtZW50IGlkcyBzaG91bGQgYmUgYSB2ZWN0b3IgYnV0IHJlY2VpdmVkIHNoYXBlXG4gICAgICAgICAgICAgICR7c2VnbWVudElkcy5zaGFwZX1gKTtcbiAgfVxuXG4gIGNvbnN0ICRkYXRhID0gYmFja2VuZC5yZWFkU3luYyhkYXRhLmRhdGFJZCkgYXMgVHlwZWRBcnJheTtcbiAgY29uc3QgJGluZGljZXMgPSBiYWNrZW5kLnJlYWRTeW5jKGluZGljZXMuZGF0YUlkKSBhcyBUeXBlZEFycmF5O1xuICBjb25zdCAkc2VnbWVudElkcyA9IGJhY2tlbmQucmVhZFN5bmMoc2VnbWVudElkcy5kYXRhSWQpIGFzIFR5cGVkQXJyYXk7XG5cbiAgY29uc3QgW291dHB1dERhdGEsIG91dHB1dERhdGFTaGFwZV0gPSBzcGFyc2VTZWdtZW50UmVkdWN0aW9uSW1wbENQVShcbiAgICAgICRkYXRhLCBkYXRhLnNoYXBlLCBkYXRhLmR0eXBlLCAkaW5kaWNlcywgJHNlZ21lbnRJZHMsIHRydWUpO1xuICByZXR1cm4gYmFja2VuZC5tYWtlVGVuc29ySW5mbyhvdXRwdXREYXRhU2hhcGUsIGRhdGEuZHR5cGUsIG91dHB1dERhdGEpO1xufVxuXG5leHBvcnQgY29uc3Qgc3BhcnNlU2VnbWVudE1lYW5Db25maWc6IEtlcm5lbENvbmZpZyA9IHtcbiAga2VybmVsTmFtZTogU3BhcnNlU2VnbWVudE1lYW4sXG4gIGJhY2tlbmROYW1lOiAnd2ViZ2wnLFxuICBrZXJuZWxGdW5jOiBzcGFyc2VTZWdtZW50TWVhbiBhcyB7fSBhcyBLZXJuZWxGdW5jLFxufTtcbiJdfQ==","/**\n * @license\n * Copyright 2021 Google LLC. All Rights Reserved.\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n * =============================================================================\n */\nimport { SparseSegmentSum } from '@tensorflow/tfjs-core';\nimport { sparseSegmentReductionImplCPU } from '../kernel_utils/shared';\nexport function sparseSegmentSum(args) {\n const { inputs, backend } = args;\n const { data, indices, segmentIds } = inputs;\n if (data.shape.length < 1) {\n throw new Error(`Data should be at least 1 dimensional but received scalar`);\n }\n if (indices.shape.length !== 1) {\n throw new Error(`Indices should be a vector but received shape\n ${indices.shape}`);\n }\n if (segmentIds.shape.length !== 1) {\n throw new Error(`Segment ids should be a vector but received shape\n ${segmentIds.shape}`);\n }\n const $data = backend.readSync(data.dataId);\n const $indices = backend.readSync(indices.dataId);\n const $segmentIds = backend.readSync(segmentIds.dataId);\n const [outputData, outputDataShape] = sparseSegmentReductionImplCPU($data, data.shape, data.dtype, $indices, $segmentIds);\n return backend.makeTensorInfo(outputDataShape, data.dtype, outputData);\n}\nexport const sparseSegmentSumConfig = {\n kernelName: SparseSegmentSum,\n backendName: 'webgl',\n kernelFunc: sparseSegmentSum,\n};\n//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiU3BhcnNlU2VnbWVudFN1bS5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uLy4uL3RmanMtYmFja2VuZC13ZWJnbC9zcmMva2VybmVscy9TcGFyc2VTZWdtZW50U3VtLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBOzs7Ozs7Ozs7Ozs7Ozs7R0FlRztBQUVILE9BQU8sRUFBMkIsZ0JBQWdCLEVBQWlELE1BQU0sdUJBQXVCLENBQUM7QUFHakksT0FBTyxFQUFDLDZCQUE2QixFQUFDLE1BQU0sd0JBQXdCLENBQUM7QUFFckUsTUFBTSxVQUFVLGdCQUFnQixDQUM1QixJQUFpRTtJQUVuRSxNQUFNLEVBQUMsTUFBTSxFQUFFLE9BQU8sRUFBQyxHQUFHLElBQUksQ0FBQztJQUMvQixNQUFNLEVBQUMsSUFBSSxFQUFFLE9BQU8sRUFBRSxVQUFVLEVBQUMsR0FBRyxNQUFNLENBQUM7SUFDM0MsSUFBSSxJQUFJLENBQUMsS0FBSyxDQUFDLE1BQU0sR0FBRyxDQUFDLEVBQUU7UUFDekIsTUFBTSxJQUFJLEtBQUssQ0FDWCwyREFBMkQsQ0FBQyxDQUFDO0tBQ2xFO0lBQ0QsSUFBSSxPQUFPLENBQUMsS0FBSyxDQUFDLE1BQU0sS0FBSyxDQUFDLEVBQUU7UUFDOUIsTUFBTSxJQUFJLEtBQUssQ0FBQztlQUNMLE9BQU8sQ0FBQyxLQUFLLEVBQUUsQ0FBQyxDQUFDO0tBQzdCO0lBQ0QsSUFBSSxVQUFVLENBQUMsS0FBSyxDQUFDLE1BQU0sS0FBSyxDQUFDLEVBQUU7UUFDakMsTUFBTSxJQUFJLEtBQUssQ0FBQztlQUNMLFVBQVUsQ0FBQyxLQUFLLEVBQUUsQ0FBQyxDQUFDO0tBQ2hDO0lBRUQsTUFBTSxLQUFLLEdBQUcsT0FBTyxDQUFDLFFBQVEsQ0FBQyxJQUFJLENBQUMsTUFBTSxDQUFlLENBQUM7SUFDMUQsTUFBTSxRQUFRLEdBQUcsT0FBTyxDQUFDLFFBQVEsQ0FBQyxPQUFPLENBQUMsTUFBTSxDQUFlLENBQUM7SUFDaEUsTUFBTSxXQUFXLEdBQUcsT0FBTyxDQUFDLFFBQVEsQ0FBQyxVQUFVLENBQUMsTUFBTSxDQUFlLENBQUM7SUFFdEUsTUFBTSxDQUFDLFVBQVUsRUFBRSxlQUFlLENBQUMsR0FBRyw2QkFBNkIsQ0FDL0QsS0FBSyxFQUFFLElBQUksQ0FBQyxLQUFLLEVBQUUsSUFBSSxDQUFDLEtBQUssRUFBRSxRQUFRLEVBQUUsV0FBVyxDQUFDLENBQUM7SUFDMUQsT0FBTyxPQUFPLENBQUMsY0FBYyxDQUFDLGVBQWUsRUFBRSxJQUFJLENBQUMsS0FBSyxFQUFFLFVBQVUsQ0FBQyxDQUFDO0FBQ3pFLENBQUM7QUFFRCxNQUFNLENBQUMsTUFBTSxzQkFBc0IsR0FBaUI7SUFDbEQsVUFBVSxFQUFFLGdCQUFnQjtJQUM1QixXQUFXLEVBQUUsT0FBTztJQUNwQixVQUFVLEVBQUUsZ0JBQW9DO0NBQ2pELENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyIvKipcbiAqIEBsaWNlbnNlXG4gKiBDb3B5cmlnaHQgMjAyMSBHb29nbGUgTExDLiBBbGwgUmlnaHRzIFJlc2VydmVkLlxuICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlIFwiTGljZW5zZVwiKTtcbiAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS5cbiAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdFxuICpcbiAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMFxuICpcbiAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmVcbiAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuIFwiQVMgSVNcIiBCQVNJUyxcbiAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLlxuICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZFxuICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuXG4gKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuICovXG5cbmltcG9ydCB7S2VybmVsQ29uZmlnLCBLZXJuZWxGdW5jLCBTcGFyc2VTZWdtZW50U3VtLCBTcGFyc2VTZWdtZW50U3VtSW5wdXRzLCBUZW5zb3JJbmZvLCBUeXBlZEFycmF5fSBmcm9tICdAdGVuc29yZmxvdy90ZmpzLWNvcmUnO1xuXG5pbXBvcnQge01hdGhCYWNrZW5kV2ViR0x9IGZyb20gJy4uL2JhY2tlbmRfd2ViZ2wnO1xuaW1wb3J0IHtzcGFyc2VTZWdtZW50UmVkdWN0aW9uSW1wbENQVX0gZnJvbSAnLi4va2VybmVsX3V0aWxzL3NoYXJlZCc7XG5cbmV4cG9ydCBmdW5jdGlvbiBzcGFyc2VTZWdtZW50U3VtKFxuICAgIGFyZ3M6IHtpbnB1dHM6IFNwYXJzZVNlZ21lbnRTdW1JbnB1dHMsIGJhY2tlbmQ6IE1hdGhCYWNrZW5kV2ViR0x9KTpcbiAgICBUZW5zb3JJbmZvIHtcbiAgY29uc3Qge2lucHV0cywgYmFja2VuZH0gPSBhcmdzO1xuICBjb25zdCB7ZGF0YSwgaW5kaWNlcywgc2VnbWVudElkc30gPSBpbnB1dHM7XG4gIGlmIChkYXRhLnNoYXBlLmxlbmd0aCA8IDEpIHtcbiAgICB0aHJvdyBuZXcgRXJyb3IoXG4gICAgICAgIGBEYXRhIHNob3VsZCBiZSBhdCBsZWFzdCAxIGRpbWVuc2lvbmFsIGJ1dCByZWNlaXZlZCBzY2FsYXJgKTtcbiAgfVxuICBpZiAoaW5kaWNlcy5zaGFwZS5sZW5ndGggIT09IDEpIHtcbiAgICB0aHJvdyBuZXcgRXJyb3IoYEluZGljZXMgc2hvdWxkIGJlIGEgdmVjdG9yIGJ1dCByZWNlaXZlZCBzaGFwZVxuICAgICAgICAgICAgICR7aW5kaWNlcy5zaGFwZX1gKTtcbiAgfVxuICBpZiAoc2VnbWVudElkcy5zaGFwZS5sZW5ndGggIT09IDEpIHtcbiAgICB0aHJvdyBuZXcgRXJyb3IoYFNlZ21lbnQgaWRzIHNob3VsZCBiZSBhIHZlY3RvciBidXQgcmVjZWl2ZWQgc2hhcGVcbiAgICAgICAgICAgICAke3NlZ21lbnRJZHMuc2hhcGV9YCk7XG4gIH1cblxuICBjb25zdCAkZGF0YSA9IGJhY2tlbmQucmVhZFN5bmMoZGF0YS5kYXRhSWQpIGFzIFR5cGVkQXJyYXk7XG4gIGNvbnN0ICRpbmRpY2VzID0gYmFja2VuZC5yZWFkU3luYyhpbmRpY2VzLmRhdGFJZCkgYXMgVHlwZWRBcnJheTtcbiAgY29uc3QgJHNlZ21lbnRJZHMgPSBiYWNrZW5kLnJlYWRTeW5jKHNlZ21lbnRJZHMuZGF0YUlkKSBhcyBUeXBlZEFycmF5O1xuXG4gIGNvbnN0IFtvdXRwdXREYXRhLCBvdXRwdXREYXRhU2hhcGVdID0gc3BhcnNlU2VnbWVudFJlZHVjdGlvbkltcGxDUFUoXG4gICAgICAkZGF0YSwgZGF0YS5zaGFwZSwgZGF0YS5kdHlwZSwgJGluZGljZXMsICRzZWdtZW50SWRzKTtcbiAgcmV0dXJuIGJhY2tlbmQubWFrZVRlbnNvckluZm8ob3V0cHV0RGF0YVNoYXBlLCBkYXRhLmR0eXBlLCBvdXRwdXREYXRhKTtcbn1cblxuZXhwb3J0IGNvbnN0IHNwYXJzZVNlZ21lbnRTdW1Db25maWc6IEtlcm5lbENvbmZpZyA9IHtcbiAga2VybmVsTmFtZTogU3BhcnNlU2VnbWVudFN1bSxcbiAgYmFja2VuZE5hbWU6ICd3ZWJnbCcsXG4gIGtlcm5lbEZ1bmM6IHNwYXJzZVNlZ21lbnRTdW0gYXMge30gYXMgS2VybmVsRnVuYyxcbn07XG4iXX0=","/**\n * @license\n * Copyright 2020 Google LLC. All Rights Reserved.\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n * =============================================================================\n */\nimport { backend_util, SparseToDense, util } from '@tensorflow/tfjs-core';\nimport { scatterImplCPU } from '../kernel_utils/shared';\nimport { ScatterProgram } from '../scatter_gpu';\nimport { reshape } from './Reshape';\nexport function sparseToDense(args) {\n const { inputs, backend, attrs } = args;\n const { sparseIndices, sparseValues, defaultValue } = inputs;\n const { outputShape } = attrs;\n const { sliceRank, numUpdates, sliceSize, strides, outputSize } = backend_util.calculateShapes(sparseValues, sparseIndices, outputShape);\n const sumDupeIndices = false;\n if (sparseValues.dtype === 'string') {\n const indicesBuf = backend.bufferSync(sparseIndices);\n const updatesBuf = backend.bufferSync(sparseValues);\n const $defaultValue = util.decodeString(backend.readSync(defaultValue.dataId)[0]);\n const outBuf = scatterImplCPU(indicesBuf, updatesBuf, outputShape, outputSize, sliceSize, numUpdates, sliceRank, strides, $defaultValue, sumDupeIndices);\n return backend.makeTensorInfo(outputShape, outBuf.dtype, outBuf.values);\n }\n const program = new ScatterProgram(numUpdates, sliceRank, sparseIndices.shape.length, sparseValues.shape.length, strides, [outputSize, 1], sumDupeIndices);\n const res = backend.runWebGLProgram(program, [sparseValues, sparseIndices, defaultValue], sparseValues.dtype);\n const reshaped = reshape({ inputs: { x: res }, backend, attrs: { shape: outputShape } });\n backend.disposeIntermediateTensorInfo(res);\n return reshaped;\n}\nexport const sparseToDenseConfig = {\n kernelName: SparseToDense,\n backendName: 'webgl',\n kernelFunc: sparseToDense\n};\n//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiU3BhcnNlVG9EZW5zZS5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uLy4uL3RmanMtYmFja2VuZC13ZWJnbC9zcmMva2VybmVscy9TcGFyc2VUb0RlbnNlLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBOzs7Ozs7Ozs7Ozs7Ozs7R0FlRztBQUVILE9BQU8sRUFBQyxZQUFZLEVBQWtDLGFBQWEsRUFBdUQsSUFBSSxFQUFDLE1BQU0sdUJBQXVCLENBQUM7QUFHN0osT0FBTyxFQUFDLGNBQWMsRUFBQyxNQUFNLHdCQUF3QixDQUFDO0FBQ3RELE9BQU8sRUFBQyxjQUFjLEVBQUMsTUFBTSxnQkFBZ0IsQ0FBQztBQUU5QyxPQUFPLEVBQUMsT0FBTyxFQUFDLE1BQU0sV0FBVyxDQUFDO0FBRWxDLE1BQU0sVUFBVSxhQUFhLENBQUMsSUFJN0I7SUFDQyxNQUFNLEVBQUMsTUFBTSxFQUFFLE9BQU8sRUFBRSxLQUFLLEVBQUMsR0FBRyxJQUFJLENBQUM7SUFDdEMsTUFBTSxFQUFDLGFBQWEsRUFBRSxZQUFZLEVBQUUsWUFBWSxFQUFDLEdBQUcsTUFBTSxDQUFDO0lBQzNELE1BQU0sRUFBQyxXQUFXLEVBQUMsR0FBRyxLQUFLLENBQUM7SUFFNUIsTUFBTSxFQUFDLFNBQVMsRUFBRSxVQUFVLEVBQUUsU0FBUyxFQUFFLE9BQU8sRUFBRSxVQUFVLEVBQUMsR0FDekQsWUFBWSxDQUFDLGVBQWUsQ0FBQyxZQUFZLEVBQUUsYUFBYSxFQUFFLFdBQVcsQ0FBQyxDQUFDO0lBQzNFLE1BQU0sY0FBYyxHQUFHLEtBQUssQ0FBQztJQUU3QixJQUFJLFlBQVksQ0FBQyxLQUFLLEtBQUssUUFBUSxFQUFFO1FBQ25DLE1BQU0sVUFBVSxHQUFHLE9BQU8sQ0FBQyxVQUFVLENBQWdCLGFBQWEsQ0FBQyxDQUFDO1FBQ3BFLE1BQU0sVUFBVSxHQUFHLE9BQU8sQ0FBQyxVQUFVLENBQWlCLFlBQVksQ0FBQyxDQUFDO1FBQ3BFLE1BQU0sYUFBYSxHQUFHLElBQUksQ0FBQyxZQUFZLENBQ25DLE9BQU8sQ0FBQyxRQUFRLENBQUMsWUFBWSxDQUFDLE1BQU0sQ0FBQyxDQUFDLENBQUMsQ0FBZSxDQUFDLENBQUM7UUFDNUQsTUFBTSxNQUFNLEdBQUcsY0FBYyxDQUN6QixVQUFVLEVBQUUsVUFBVSxFQUFFLFdBQVcsRUFBRSxVQUFVLEVBQUUsU0FBUyxFQUFFLFVBQVUsRUFDdEUsU0FBUyxFQUFFLE9BQU8sRUFBRSxhQUFhLEVBQUUsY0FBYyxDQUFDLENBQUM7UUFDdkQsT0FBTyxPQUFPLENBQUMsY0FBYyxDQUFDLFdBQVcsRUFBRSxNQUFNLENBQUMsS0FBSyxFQUFFLE1BQU0sQ0FBQyxNQUFNLENBQUMsQ0FBQztLQUN6RTtJQUNELE1BQU0sT0FBTyxHQUFHLElBQUksY0FBYyxDQUM5QixVQUFVLEVBQUUsU0FBUyxFQUFFLGFBQWEsQ0FBQyxLQUFLLENBQUMsTUFBTSxFQUNqRCxZQUFZLENBQUMsS0FBSyxDQUFDLE1BQU0sRUFBRSxPQUFPLEVBQUUsQ0FBQyxVQUFVLEVBQUUsQ0FBQyxDQUFDLEVBQUUsY0FBYyxDQUFDLENBQUM7SUFFekUsTUFBTSxHQUFHLEdBQUcsT0FBTyxDQUFDLGVBQWUsQ0FDL0IsT0FBTyxFQUFFLENBQUMsWUFBWSxFQUFFLGFBQWEsRUFBRSxZQUFZLENBQUMsRUFBRSxZQUFZLENBQUMsS0FBSyxDQUFDLENBQUM7SUFFOUUsTUFBTSxRQUFRLEdBQ1YsT0FBTyxDQUFDLEVBQUMsTUFBTSxFQUFFLEVBQUMsQ0FBQyxFQUFFLEdBQUcsRUFBQyxFQUFFLE9BQU8sRUFBRSxLQUFLLEVBQUUsRUFBQyxLQUFLLEVBQUUsV0FBVyxFQUFDLEVBQUMsQ0FBQyxDQUFDO0lBRXRFLE9BQU8sQ0FBQyw2QkFBNkIsQ0FBQyxHQUFHLENBQUMsQ0FBQztJQUMzQyxPQUFPLFFBQVEsQ0FBQztBQUNsQixDQUFDO0FBRUQsTUFBTSxDQUFDLE1BQU0sbUJBQW1CLEdBQWlCO0lBQy9DLFVBQVUsRUFBRSxhQUFhO0lBQ3pCLFdBQVcsRUFBRSxPQUFPO0lBQ3BCLFVBQVUsRUFBRSxhQUFpQztDQUM5QyxDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiLyoqXG4gKiBAbGljZW5zZVxuICogQ29weXJpZ2h0IDIwMjAgR29vZ2xlIExMQy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC5cbiAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSBcIkxpY2Vuc2VcIik7XG4gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuXG4gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXRcbiAqXG4gKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjBcbiAqXG4gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlXG4gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiBcIkFTIElTXCIgQkFTSVMsXG4gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC5cbiAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmRcbiAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLlxuICogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbiAqL1xuXG5pbXBvcnQge2JhY2tlbmRfdXRpbCwgS2VybmVsQ29uZmlnLCBLZXJuZWxGdW5jLCBSYW5rLCBTcGFyc2VUb0RlbnNlLCBTcGFyc2VUb0RlbnNlQXR0cnMsIFNwYXJzZVRvRGVuc2VJbnB1dHMsIFRlbnNvckluZm8sIHV0aWx9IGZyb20gJ0B0ZW5zb3JmbG93L3RmanMtY29yZSc7XG5cbmltcG9ydCB7TWF0aEJhY2tlbmRXZWJHTH0gZnJvbSAnLi4vYmFja2VuZF93ZWJnbCc7XG5pbXBvcnQge3NjYXR0ZXJJbXBsQ1BVfSBmcm9tICcuLi9rZXJuZWxfdXRpbHMvc2hhcmVkJztcbmltcG9ydCB7U2NhdHRlclByb2dyYW19IGZyb20gJy4uL3NjYXR0ZXJfZ3B1JztcblxuaW1wb3J0IHtyZXNoYXBlfSBmcm9tICcuL1Jlc2hhcGUnO1xuXG5leHBvcnQgZnVuY3Rpb24gc3BhcnNlVG9EZW5zZShhcmdzOiB7XG4gIGlucHV0czogU3BhcnNlVG9EZW5zZUlucHV0cyxcbiAgYmFja2VuZDogTWF0aEJhY2tlbmRXZWJHTCxcbiAgYXR0cnM6IFNwYXJzZVRvRGVuc2VBdHRyc1xufSk6IFRlbnNvckluZm8ge1xuICBjb25zdCB7aW5wdXRzLCBiYWNrZW5kLCBhdHRyc30gPSBhcmdzO1xuICBjb25zdCB7c3BhcnNlSW5kaWNlcywgc3BhcnNlVmFsdWVzLCBkZWZhdWx0VmFsdWV9ID0gaW5wdXRzO1xuICBjb25zdCB7b3V0cHV0U2hhcGV9ID0gYXR0cnM7XG5cbiAgY29uc3Qge3NsaWNlUmFuaywgbnVtVXBkYXRlcywgc2xpY2VTaXplLCBzdHJpZGVzLCBvdXRwdXRTaXplfSA9XG4gICAgICBiYWNrZW5kX3V0aWwuY2FsY3VsYXRlU2hhcGVzKHNwYXJzZVZhbHVlcywgc3BhcnNlSW5kaWNlcywgb3V0cHV0U2hhcGUpO1xuICBjb25zdCBzdW1EdXBlSW5kaWNlcyA9IGZhbHNlO1xuXG4gIGlmIChzcGFyc2VWYWx1ZXMuZHR5cGUgPT09ICdzdHJpbmcnKSB7XG4gICAgY29uc3QgaW5kaWNlc0J1ZiA9IGJhY2tlbmQuYnVmZmVyU3luYzxSYW5rLCAnaW50MzInPihzcGFyc2VJbmRpY2VzKTtcbiAgICBjb25zdCB1cGRhdGVzQnVmID0gYmFja2VuZC5idWZmZXJTeW5jPFJhbmssICdzdHJpbmcnPihzcGFyc2VWYWx1ZXMpO1xuICAgIGNvbnN0ICRkZWZhdWx0VmFsdWUgPSB1dGlsLmRlY29kZVN0cmluZyhcbiAgICAgICAgYmFja2VuZC5yZWFkU3luYyhkZWZhdWx0VmFsdWUuZGF0YUlkKVswXSBhcyBVaW50OEFycmF5KTtcbiAgICBjb25zdCBvdXRCdWYgPSBzY2F0dGVySW1wbENQVShcbiAgICAgICAgaW5kaWNlc0J1ZiwgdXBkYXRlc0J1Ziwgb3V0cHV0U2hhcGUsIG91dHB1dFNpemUsIHNsaWNlU2l6ZSwgbnVtVXBkYXRlcyxcbiAgICAgICAgc2xpY2VSYW5rLCBzdHJpZGVzLCAkZGVmYXVsdFZhbHVlLCBzdW1EdXBlSW5kaWNlcyk7XG4gICAgcmV0dXJuIGJhY2tlbmQubWFrZVRlbnNvckluZm8ob3V0cHV0U2hhcGUsIG91dEJ1Zi5kdHlwZSwgb3V0QnVmLnZhbHVlcyk7XG4gIH1cbiAgY29uc3QgcHJvZ3JhbSA9IG5ldyBTY2F0dGVyUHJvZ3JhbShcbiAgICAgIG51bVVwZGF0ZXMsIHNsaWNlUmFuaywgc3BhcnNlSW5kaWNlcy5zaGFwZS5sZW5ndGgsXG4gICAgICBzcGFyc2VWYWx1ZXMuc2hhcGUubGVuZ3RoLCBzdHJpZGVzLCBbb3V0cHV0U2l6ZSwgMV0sIHN1bUR1cGVJbmRpY2VzKTtcblxuICBjb25zdCByZXMgPSBiYWNrZW5kLnJ1bldlYkdMUHJvZ3JhbShcbiAgICAgIHByb2dyYW0sIFtzcGFyc2VWYWx1ZXMsIHNwYXJzZUluZGljZXMsIGRlZmF1bHRWYWx1ZV0sIHNwYXJzZVZhbHVlcy5kdHlwZSk7XG5cbiAgY29uc3QgcmVzaGFwZWQgPVxuICAgICAgcmVzaGFwZSh7aW5wdXRzOiB7eDogcmVzfSwgYmFja2VuZCwgYXR0cnM6IHtzaGFwZTogb3V0cHV0U2hhcGV9fSk7XG5cbiAgYmFja2VuZC5kaXNwb3NlSW50ZXJtZWRpYXRlVGVuc29ySW5mbyhyZXMpO1xuICByZXR1cm4gcmVzaGFwZWQ7XG59XG5cbmV4cG9ydCBjb25zdCBzcGFyc2VUb0RlbnNlQ29uZmlnOiBLZXJuZWxDb25maWcgPSB7XG4gIGtlcm5lbE5hbWU6IFNwYXJzZVRvRGVuc2UsXG4gIGJhY2tlbmROYW1lOiAnd2ViZ2wnLFxuICBrZXJuZWxGdW5jOiBzcGFyc2VUb0RlbnNlIGFzIHt9IGFzIEtlcm5lbEZ1bmNcbn07XG4iXX0=","/**\n * @license\n * Copyright 2020 Google LLC. All Rights Reserved.\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n * =============================================================================\n */\nimport { backend_util, SplitV, util } from '@tensorflow/tfjs-core';\nimport { slice } from './Slice';\nexport function splitV(args) {\n const { inputs, backend, attrs } = args;\n const { x } = inputs;\n const { numOrSizeSplits, axis } = attrs;\n const $axis = util.parseAxisParam(axis, x.shape)[0];\n const splitSizes = backend_util.prepareSplitSize(x, numOrSizeSplits, $axis);\n const xRank = x.shape.length;\n const begin = new Array(xRank).fill(0);\n const size = x.shape.slice();\n return splitSizes.map(s => {\n const sliceSize = [...size];\n sliceSize[$axis] = s;\n const sliceT = slice({ inputs: { x }, backend, attrs: { begin, size: sliceSize } });\n begin[$axis] += s;\n return sliceT;\n });\n}\nexport const splitVConfig = {\n kernelName: SplitV,\n backendName: 'webgl',\n kernelFunc: splitV\n};\n//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiU3BsaXRWLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vLi4vdGZqcy1iYWNrZW5kLXdlYmdsL3NyYy9rZXJuZWxzL1NwbGl0Vi50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQTs7Ozs7Ozs7Ozs7Ozs7O0dBZUc7QUFFSCxPQUFPLEVBQUMsWUFBWSxFQUE0QixNQUFNLEVBQXlDLElBQUksRUFBQyxNQUFNLHVCQUF1QixDQUFDO0FBR2xJLE9BQU8sRUFBQyxLQUFLLEVBQUMsTUFBTSxTQUFTLENBQUM7QUFFOUIsTUFBTSxVQUFVLE1BQU0sQ0FDbEIsSUFDeUU7SUFFM0UsTUFBTSxFQUFDLE1BQU0sRUFBRSxPQUFPLEVBQUUsS0FBSyxFQUFDLEdBQUcsSUFBSSxDQUFDO0lBQ3RDLE1BQU0sRUFBQyxDQUFDLEVBQUMsR0FBRyxNQUFNLENBQUM7SUFDbkIsTUFBTSxFQUFDLGVBQWUsRUFBRSxJQUFJLEVBQUMsR0FBRyxLQUFLLENBQUM7SUFFdEMsTUFBTSxLQUFLLEdBQUcsSUFBSSxDQUFDLGNBQWMsQ0FBQyxJQUFJLEVBQUUsQ0FBQyxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDO0lBQ3BELE1BQU0sVUFBVSxHQUFHLFlBQVksQ0FBQyxnQkFBZ0IsQ0FBQyxDQUFDLEVBQUUsZUFBZSxFQUFFLEtBQUssQ0FBQyxDQUFDO0lBRTVFLE1BQU0sS0FBSyxHQUFHLENBQUMsQ0FBQyxLQUFLLENBQUMsTUFBTSxDQUFDO0lBQzdCLE1BQU0sS0FBSyxHQUFHLElBQUksS0FBSyxDQUFDLEtBQUssQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsQ0FBQztJQUN2QyxNQUFNLElBQUksR0FBRyxDQUFDLENBQUMsS0FBSyxDQUFDLEtBQUssRUFBRSxDQUFDO0lBRTdCLE9BQU8sVUFBVSxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsRUFBRTtRQUN4QixNQUFNLFNBQVMsR0FBRyxDQUFDLEdBQUcsSUFBSSxDQUFDLENBQUM7UUFDNUIsU0FBUyxDQUFDLEtBQUssQ0FBQyxHQUFHLENBQUMsQ0FBQztRQUNyQixNQUFNLE1BQU0sR0FDUixLQUFLLENBQUMsRUFBQyxNQUFNLEVBQUUsRUFBQyxDQUFDLEVBQUMsRUFBRSxPQUFPLEVBQUUsS0FBSyxFQUFFLEVBQUMsS0FBSyxFQUFFLElBQUksRUFBRSxTQUFTLEVBQUMsRUFBQyxDQUFDLENBQUM7UUFDbkUsS0FBSyxDQUFDLEtBQUssQ0FBQyxJQUFJLENBQUMsQ0FBQztRQUNsQixPQUFPLE1BQU0sQ0FBQztJQUNoQixDQUFDLENBQUMsQ0FBQztBQUNMLENBQUM7QUFFRCxNQUFNLENBQUMsTUFBTSxZQUFZLEdBQWlCO0lBQ3hDLFVBQVUsRUFBRSxNQUFNO0lBQ2xCLFdBQVcsRUFBRSxPQUFPO0lBQ3BCLFVBQVUsRUFBRSxNQUEwQjtDQUN2QyxDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiLyoqXG4gKiBAbGljZW5zZVxuICogQ29weXJpZ2h0IDIwMjAgR29vZ2xlIExMQy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC5cbiAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSBcIkxpY2Vuc2VcIik7XG4gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuXG4gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXRcbiAqXG4gKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjBcbiAqXG4gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlXG4gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiBcIkFTIElTXCIgQkFTSVMsXG4gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC5cbiAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmRcbiAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLlxuICogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbiAqL1xuXG5pbXBvcnQge2JhY2tlbmRfdXRpbCwgS2VybmVsQ29uZmlnLCBLZXJuZWxGdW5jLCBTcGxpdFYsIFNwbGl0VkF0dHJzLCBTcGxpdFZJbnB1dHMsIFRlbnNvckluZm8sIHV0aWx9IGZyb20gJ0B0ZW5zb3JmbG93L3RmanMtY29yZSc7XG5cbmltcG9ydCB7TWF0aEJhY2tlbmRXZWJHTH0gZnJvbSAnLi4vYmFja2VuZF93ZWJnbCc7XG5pbXBvcnQge3NsaWNlfSBmcm9tICcuL1NsaWNlJztcblxuZXhwb3J0IGZ1bmN0aW9uIHNwbGl0VihcbiAgICBhcmdzOlxuICAgICAgICB7aW5wdXRzOiBTcGxpdFZJbnB1dHMsIGJhY2tlbmQ6IE1hdGhCYWNrZW5kV2ViR0wsIGF0dHJzOiBTcGxpdFZBdHRyc30pOlxuICAgIFRlbnNvckluZm9bXSB7XG4gIGNvbnN0IHtpbnB1dHMsIGJhY2tlbmQsIGF0dHJzfSA9IGFyZ3M7XG4gIGNvbnN0IHt4fSA9IGlucHV0cztcbiAgY29uc3Qge251bU9yU2l6ZVNwbGl0cywgYXhpc30gPSBhdHRycztcblxuICBjb25zdCAkYXhpcyA9IHV0aWwucGFyc2VBeGlzUGFyYW0oYXhpcywgeC5zaGFwZSlbMF07XG4gIGNvbnN0IHNwbGl0U2l6ZXMgPSBiYWNrZW5kX3V0aWwucHJlcGFyZVNwbGl0U2l6ZSh4LCBudW1PclNpemVTcGxpdHMsICRheGlzKTtcblxuICBjb25zdCB4UmFuayA9IHguc2hhcGUubGVuZ3RoO1xuICBjb25zdCBiZWdpbiA9IG5ldyBBcnJheSh4UmFuaykuZmlsbCgwKTtcbiAgY29uc3Qgc2l6ZSA9IHguc2hhcGUuc2xpY2UoKTtcblxuICByZXR1cm4gc3BsaXRTaXplcy5tYXAocyA9PiB7XG4gICAgY29uc3Qgc2xpY2VTaXplID0gWy4uLnNpemVdO1xuICAgIHNsaWNlU2l6ZVskYXhpc10gPSBzO1xuICAgIGNvbnN0IHNsaWNlVCA9XG4gICAgICAgIHNsaWNlKHtpbnB1dHM6IHt4fSwgYmFja2VuZCwgYXR0cnM6IHtiZWdpbiwgc2l6ZTogc2xpY2VTaXplfX0pO1xuICAgIGJlZ2luWyRheGlzXSArPSBzO1xuICAgIHJldHVybiBzbGljZVQ7XG4gIH0pO1xufVxuXG5leHBvcnQgY29uc3Qgc3BsaXRWQ29uZmlnOiBLZXJuZWxDb25maWcgPSB7XG4gIGtlcm5lbE5hbWU6IFNwbGl0VixcbiAgYmFja2VuZE5hbWU6ICd3ZWJnbCcsXG4gIGtlcm5lbEZ1bmM6IHNwbGl0ViBhcyB7fSBhcyBLZXJuZWxGdW5jXG59O1xuIl19","/**\n * @license\n * Copyright 2020 Google LLC. All Rights Reserved.\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n * =============================================================================\n */\nimport { Sqrt } from '@tensorflow/tfjs-core';\nimport { unaryKernelFunc } from '../kernel_utils/kernel_funcs_utils';\nimport { sqrtImplCPU } from '../kernel_utils/shared';\nconst SQRT = `return sqrt(x);`;\nexport const sqrt = unaryKernelFunc({ opSnippet: SQRT, packedOpSnippet: SQRT, cpuKernelImpl: sqrtImplCPU });\nexport const sqrtConfig = {\n kernelName: Sqrt,\n backendName: 'webgl',\n kernelFunc: sqrt\n};\n//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiU3FydC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uLy4uL3RmanMtYmFja2VuZC13ZWJnbC9zcmMva2VybmVscy9TcXJ0LnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBOzs7Ozs7Ozs7Ozs7Ozs7R0FlRztBQUVILE9BQU8sRUFBMkIsSUFBSSxFQUFDLE1BQU0sdUJBQXVCLENBQUM7QUFFckUsT0FBTyxFQUFDLGVBQWUsRUFBQyxNQUFNLG9DQUFvQyxDQUFDO0FBQ25FLE9BQU8sRUFBQyxXQUFXLEVBQUMsTUFBTSx3QkFBd0IsQ0FBQztBQUVuRCxNQUFNLElBQUksR0FBRyxpQkFBaUIsQ0FBQztBQUUvQixNQUFNLENBQUMsTUFBTSxJQUFJLEdBQUcsZUFBZSxDQUMvQixFQUFDLFNBQVMsRUFBRSxJQUFJLEVBQUUsZUFBZSxFQUFFLElBQUksRUFBRSxhQUFhLEVBQUUsV0FBVyxFQUFDLENBQUMsQ0FBQztBQUUxRSxNQUFNLENBQUMsTUFBTSxVQUFVLEdBQWlCO0lBQ3RDLFVBQVUsRUFBRSxJQUFJO0lBQ2hCLFdBQVcsRUFBRSxPQUFPO0lBQ3BCLFVBQVUsRUFBRSxJQUF3QjtDQUNyQyxDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiLyoqXG4gKiBAbGljZW5zZVxuICogQ29weXJpZ2h0IDIwMjAgR29vZ2xlIExMQy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC5cbiAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSBcIkxpY2Vuc2VcIik7XG4gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuXG4gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXRcbiAqXG4gKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjBcbiAqXG4gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlXG4gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiBcIkFTIElTXCIgQkFTSVMsXG4gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC5cbiAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmRcbiAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLlxuICogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbiAqL1xuXG5pbXBvcnQge0tlcm5lbENvbmZpZywgS2VybmVsRnVuYywgU3FydH0gZnJvbSAnQHRlbnNvcmZsb3cvdGZqcy1jb3JlJztcblxuaW1wb3J0IHt1bmFyeUtlcm5lbEZ1bmN9IGZyb20gJy4uL2tlcm5lbF91dGlscy9rZXJuZWxfZnVuY3NfdXRpbHMnO1xuaW1wb3J0IHtzcXJ0SW1wbENQVX0gZnJvbSAnLi4va2VybmVsX3V0aWxzL3NoYXJlZCc7XG5cbmNvbnN0IFNRUlQgPSBgcmV0dXJuIHNxcnQoeCk7YDtcblxuZXhwb3J0IGNvbnN0IHNxcnQgPSB1bmFyeUtlcm5lbEZ1bmMoXG4gICAge29wU25pcHBldDogU1FSVCwgcGFja2VkT3BTbmlwcGV0OiBTUVJULCBjcHVLZXJuZWxJbXBsOiBzcXJ0SW1wbENQVX0pO1xuXG5leHBvcnQgY29uc3Qgc3FydENvbmZpZzogS2VybmVsQ29uZmlnID0ge1xuICBrZXJuZWxOYW1lOiBTcXJ0LFxuICBiYWNrZW5kTmFtZTogJ3dlYmdsJyxcbiAga2VybmVsRnVuYzogc3FydCBhcyB7fSBhcyBLZXJuZWxGdW5jXG59O1xuIl19","/**\n * @license\n * Copyright 2019 Google LLC. All Rights Reserved.\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n * =============================================================================\n */\nimport { Square } from '@tensorflow/tfjs-core';\nimport { unaryKernelFunc } from '../kernel_utils/kernel_funcs_utils';\nconst SQUARE = `return x * x;`;\nexport const square = unaryKernelFunc({ opSnippet: SQUARE });\nexport const squareConfig = {\n kernelName: Square,\n backendName: 'webgl',\n kernelFunc: square,\n};\n//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiU3F1YXJlLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vLi4vdGZqcy1iYWNrZW5kLXdlYmdsL3NyYy9rZXJuZWxzL1NxdWFyZS50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQTs7Ozs7Ozs7Ozs7Ozs7O0dBZUc7QUFFSCxPQUFPLEVBQWUsTUFBTSxFQUFDLE1BQU0sdUJBQXVCLENBQUM7QUFFM0QsT0FBTyxFQUFDLGVBQWUsRUFBQyxNQUFNLG9DQUFvQyxDQUFDO0FBRW5FLE1BQU0sTUFBTSxHQUFHLGVBQWUsQ0FBQztBQUUvQixNQUFNLENBQUMsTUFBTSxNQUFNLEdBQUcsZUFBZSxDQUFDLEVBQUMsU0FBUyxFQUFFLE1BQU0sRUFBQyxDQUFDLENBQUM7QUFFM0QsTUFBTSxDQUFDLE1BQU0sWUFBWSxHQUFpQjtJQUN4QyxVQUFVLEVBQUUsTUFBTTtJQUNsQixXQUFXLEVBQUUsT0FBTztJQUNwQixVQUFVLEVBQUUsTUFBTTtDQUNuQixDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiLyoqXG4gKiBAbGljZW5zZVxuICogQ29weXJpZ2h0IDIwMTkgR29vZ2xlIExMQy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC5cbiAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSBcIkxpY2Vuc2VcIik7XG4gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuXG4gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXRcbiAqXG4gKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjBcbiAqXG4gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlXG4gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiBcIkFTIElTXCIgQkFTSVMsXG4gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC5cbiAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmRcbiAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLlxuICogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbiAqL1xuXG5pbXBvcnQge0tlcm5lbENvbmZpZywgU3F1YXJlfSBmcm9tICdAdGVuc29yZmxvdy90ZmpzLWNvcmUnO1xuXG5pbXBvcnQge3VuYXJ5S2VybmVsRnVuY30gZnJvbSAnLi4va2VybmVsX3V0aWxzL2tlcm5lbF9mdW5jc191dGlscyc7XG5cbmNvbnN0IFNRVUFSRSA9IGByZXR1cm4geCAqIHg7YDtcblxuZXhwb3J0IGNvbnN0IHNxdWFyZSA9IHVuYXJ5S2VybmVsRnVuYyh7b3BTbmlwcGV0OiBTUVVBUkV9KTtcblxuZXhwb3J0IGNvbnN0IHNxdWFyZUNvbmZpZzogS2VybmVsQ29uZmlnID0ge1xuICBrZXJuZWxOYW1lOiBTcXVhcmUsXG4gIGJhY2tlbmROYW1lOiAnd2ViZ2wnLFxuICBrZXJuZWxGdW5jOiBzcXVhcmUsXG59O1xuIl19","/**\n * @license\n * Copyright 2020 Google LLC. All Rights Reserved.\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n * =============================================================================\n */\nimport { SquaredDifference } from '@tensorflow/tfjs-core';\nimport { binaryKernelFunc } from '../kernel_utils/kernel_funcs_utils';\nconst SQUARED_DIFFERENCE = 'return (a - b) * (a - b);';\nexport const squaredDifference = binaryKernelFunc({ opSnippet: SQUARED_DIFFERENCE, packedOpSnippet: SQUARED_DIFFERENCE });\nexport const squaredDifferenceConfig = {\n kernelName: SquaredDifference,\n backendName: 'webgl',\n kernelFunc: squaredDifference,\n};\n//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiU3F1YXJlZERpZmZlcmVuY2UuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi8uLi90ZmpzLWJhY2tlbmQtd2ViZ2wvc3JjL2tlcm5lbHMvU3F1YXJlZERpZmZlcmVuY2UudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUE7Ozs7Ozs7Ozs7Ozs7OztHQWVHO0FBRUgsT0FBTyxFQUFlLGlCQUFpQixFQUFDLE1BQU0sdUJBQXVCLENBQUM7QUFFdEUsT0FBTyxFQUFDLGdCQUFnQixFQUFDLE1BQU0sb0NBQW9DLENBQUM7QUFFcEUsTUFBTSxrQkFBa0IsR0FBRywyQkFBMkIsQ0FBQztBQUV2RCxNQUFNLENBQUMsTUFBTSxpQkFBaUIsR0FBRyxnQkFBZ0IsQ0FDN0MsRUFBQyxTQUFTLEVBQUUsa0JBQWtCLEVBQUUsZUFBZSxFQUFFLGtCQUFrQixFQUFDLENBQUMsQ0FBQztBQUUxRSxNQUFNLENBQUMsTUFBTSx1QkFBdUIsR0FBaUI7SUFDbkQsVUFBVSxFQUFFLGlCQUFpQjtJQUM3QixXQUFXLEVBQUUsT0FBTztJQUNwQixVQUFVLEVBQUUsaUJBQWlCO0NBQzlCLENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyIvKipcbiAqIEBsaWNlbnNlXG4gKiBDb3B5cmlnaHQgMjAyMCBHb29nbGUgTExDLiBBbGwgUmlnaHRzIFJlc2VydmVkLlxuICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlIFwiTGljZW5zZVwiKTtcbiAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS5cbiAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdFxuICpcbiAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMFxuICpcbiAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmVcbiAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuIFwiQVMgSVNcIiBCQVNJUyxcbiAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLlxuICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZFxuICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuXG4gKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuICovXG5cbmltcG9ydCB7S2VybmVsQ29uZmlnLCBTcXVhcmVkRGlmZmVyZW5jZX0gZnJvbSAnQHRlbnNvcmZsb3cvdGZqcy1jb3JlJztcblxuaW1wb3J0IHtiaW5hcnlLZXJuZWxGdW5jfSBmcm9tICcuLi9rZXJuZWxfdXRpbHMva2VybmVsX2Z1bmNzX3V0aWxzJztcblxuY29uc3QgU1FVQVJFRF9ESUZGRVJFTkNFID0gJ3JldHVybiAoYSAtIGIpICogKGEgLSBiKTsnO1xuXG5leHBvcnQgY29uc3Qgc3F1YXJlZERpZmZlcmVuY2UgPSBiaW5hcnlLZXJuZWxGdW5jKFxuICAgIHtvcFNuaXBwZXQ6IFNRVUFSRURfRElGRkVSRU5DRSwgcGFja2VkT3BTbmlwcGV0OiBTUVVBUkVEX0RJRkZFUkVOQ0V9KTtcblxuZXhwb3J0IGNvbnN0IHNxdWFyZWREaWZmZXJlbmNlQ29uZmlnOiBLZXJuZWxDb25maWcgPSB7XG4gIGtlcm5lbE5hbWU6IFNxdWFyZWREaWZmZXJlbmNlLFxuICBiYWNrZW5kTmFtZTogJ3dlYmdsJyxcbiAga2VybmVsRnVuYzogc3F1YXJlZERpZmZlcmVuY2UsXG59O1xuIl19","/**\n * @license\n * Copyright 2020 Google LLC. All Rights Reserved.\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n * =============================================================================\n */\nimport { Step } from '@tensorflow/tfjs-core';\nimport { CHECK_NAN_SNIPPET, UnaryOpProgram } from '../unaryop_gpu';\nexport function step({ inputs, attrs, backend }) {\n const { x } = inputs;\n const opSnippet = CHECK_NAN_SNIPPET + `\n return x > 0.0 ? 1.0 : float(${attrs.alpha});\n `;\n const program = new UnaryOpProgram(x.shape, opSnippet);\n return backend.runWebGLProgram(program, [x], x.dtype);\n}\nexport const stepConfig = {\n kernelName: Step,\n backendName: 'webgl',\n kernelFunc: step,\n};\n//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiU3RlcC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uLy4uL3RmanMtYmFja2VuZC13ZWJnbC9zcmMva2VybmVscy9TdGVwLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBOzs7Ozs7Ozs7Ozs7Ozs7R0FlRztBQUVILE9BQU8sRUFBMkIsSUFBSSxFQUFxQyxNQUFNLHVCQUF1QixDQUFDO0FBR3pHLE9BQU8sRUFBQyxpQkFBaUIsRUFBRSxjQUFjLEVBQUMsTUFBTSxnQkFBZ0IsQ0FBQztBQUVqRSxNQUFNLFVBQVUsSUFBSSxDQUNoQixFQUFDLE1BQU0sRUFBRSxLQUFLLEVBQUUsT0FBTyxFQUMrQztJQUV4RSxNQUFNLEVBQUMsQ0FBQyxFQUFDLEdBQUcsTUFBTSxDQUFDO0lBQ25CLE1BQU0sU0FBUyxHQUFHLGlCQUFpQixHQUFHO21DQUNMLEtBQUssQ0FBQyxLQUFLO0dBQzNDLENBQUM7SUFFRixNQUFNLE9BQU8sR0FBRyxJQUFJLGNBQWMsQ0FBQyxDQUFDLENBQUMsS0FBSyxFQUFFLFNBQVMsQ0FBQyxDQUFDO0lBRXZELE9BQU8sT0FBTyxDQUFDLGVBQWUsQ0FBQyxPQUFPLEVBQUUsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsS0FBSyxDQUFDLENBQUM7QUFDeEQsQ0FBQztBQUVELE1BQU0sQ0FBQyxNQUFNLFVBQVUsR0FBaUI7SUFDdEMsVUFBVSxFQUFFLElBQUk7SUFDaEIsV0FBVyxFQUFFLE9BQU87SUFDcEIsVUFBVSxFQUFFLElBQXdCO0NBQ3JDLENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyIvKipcbiAqIEBsaWNlbnNlXG4gKiBDb3B5cmlnaHQgMjAyMCBHb29nbGUgTExDLiBBbGwgUmlnaHRzIFJlc2VydmVkLlxuICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlIFwiTGljZW5zZVwiKTtcbiAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS5cbiAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdFxuICpcbiAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMFxuICpcbiAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmVcbiAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuIFwiQVMgSVNcIiBCQVNJUyxcbiAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLlxuICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZFxuICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuXG4gKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuICovXG5cbmltcG9ydCB7S2VybmVsQ29uZmlnLCBLZXJuZWxGdW5jLCBTdGVwLCBTdGVwQXR0cnMsIFRlbnNvckluZm8sIFVuYXJ5SW5wdXRzfSBmcm9tICdAdGVuc29yZmxvdy90ZmpzLWNvcmUnO1xuXG5pbXBvcnQge01hdGhCYWNrZW5kV2ViR0x9IGZyb20gJy4uL2JhY2tlbmRfd2ViZ2wnO1xuaW1wb3J0IHtDSEVDS19OQU5fU05JUFBFVCwgVW5hcnlPcFByb2dyYW19IGZyb20gJy4uL3VuYXJ5b3BfZ3B1JztcblxuZXhwb3J0IGZ1bmN0aW9uIHN0ZXAoXG4gICAge2lucHV0cywgYXR0cnMsIGJhY2tlbmR9OlxuICAgICAgICB7aW5wdXRzOiBVbmFyeUlucHV0cywgYXR0cnM6IFN0ZXBBdHRycywgYmFja2VuZDogTWF0aEJhY2tlbmRXZWJHTH0pOlxuICAgIFRlbnNvckluZm8ge1xuICBjb25zdCB7eH0gPSBpbnB1dHM7XG4gIGNvbnN0IG9wU25pcHBldCA9IENIRUNLX05BTl9TTklQUEVUICsgYFxuICAgIHJldHVybiB4ID4gMC4wID8gMS4wIDogZmxvYXQoJHthdHRycy5hbHBoYX0pO1xuICBgO1xuXG4gIGNvbnN0IHByb2dyYW0gPSBuZXcgVW5hcnlPcFByb2dyYW0oeC5zaGFwZSwgb3BTbmlwcGV0KTtcblxuICByZXR1cm4gYmFja2VuZC5ydW5XZWJHTFByb2dyYW0ocHJvZ3JhbSwgW3hdLCB4LmR0eXBlKTtcbn1cblxuZXhwb3J0IGNvbnN0IHN0ZXBDb25maWc6IEtlcm5lbENvbmZpZyA9IHtcbiAga2VybmVsTmFtZTogU3RlcCxcbiAgYmFja2VuZE5hbWU6ICd3ZWJnbCcsXG4gIGtlcm5lbEZ1bmM6IHN0ZXAgYXMge30gYXMgS2VybmVsRnVuYyxcbn07XG4iXX0=","/**\n * @license\n * Copyright 2017 Google LLC. All Rights Reserved.\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n * =============================================================================\n */\nimport { getCoordsDataType } from './shader_compiler';\nexport class StridedSliceProgram {\n constructor(begin, strides, size) {\n this.variableNames = ['x'];\n this.outputShape = size;\n const rank = size.length;\n const inputDtype = getCoordsDataType(size.length);\n const dtype = getCoordsDataType(size.length);\n let newCoords = '';\n if (rank === 1) {\n newCoords = 'coords * strides + begin';\n }\n else {\n let outputAxis = 0;\n newCoords =\n size.map((_, i) => {\n outputAxis++;\n return size.length === 1 ?\n `coords * strides[${i}] + begin[${i}]` :\n `coords[${outputAxis - 1}] * strides[${i}] + begin[${i}]`;\n })\n .join(',');\n }\n this.userCode = `\n ${inputDtype} begin = ${inputDtype}(${begin});\n ${inputDtype} strides = ${inputDtype}(${strides});\n\n void main() {\n ${dtype} coords = getOutputCoords();\n setOutput(getX(${newCoords}));\n }\n `;\n }\n}\n//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic3RyaWRlZF9zbGljZV9ncHUuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi90ZmpzLWJhY2tlbmQtd2ViZ2wvc3JjL3N0cmlkZWRfc2xpY2VfZ3B1LnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBOzs7Ozs7Ozs7Ozs7Ozs7R0FlRztBQUdILE9BQU8sRUFBQyxpQkFBaUIsRUFBQyxNQUFNLG1CQUFtQixDQUFDO0FBRXBELE1BQU0sT0FBTyxtQkFBbUI7SUFLOUIsWUFBWSxLQUFlLEVBQUUsT0FBaUIsRUFBRSxJQUFjO1FBSjlELGtCQUFhLEdBQUcsQ0FBQyxHQUFHLENBQUMsQ0FBQztRQUtwQixJQUFJLENBQUMsV0FBVyxHQUFHLElBQUksQ0FBQztRQUN4QixNQUFNLElBQUksR0FBRyxJQUFJLENBQUMsTUFBTSxDQUFDO1FBQ3pCLE1BQU0sVUFBVSxHQUFHLGlCQUFpQixDQUFDLElBQUksQ0FBQyxNQUFNLENBQUMsQ0FBQztRQUNsRCxNQUFNLEtBQUssR0FBRyxpQkFBaUIsQ0FBQyxJQUFJLENBQUMsTUFBTSxDQUFDLENBQUM7UUFFN0MsSUFBSSxTQUFTLEdBQUcsRUFBRSxDQUFDO1FBQ25CLElBQUksSUFBSSxLQUFLLENBQUMsRUFBRTtZQUNkLFNBQVMsR0FBRywwQkFBMEIsQ0FBQztTQUN4QzthQUFNO1lBQ0wsSUFBSSxVQUFVLEdBQUcsQ0FBQyxDQUFDO1lBQ25CLFNBQVM7Z0JBQ0wsSUFBSSxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLEVBQUUsRUFBRTtvQkFDWixVQUFVLEVBQUUsQ0FBQztvQkFDYixPQUFPLElBQUksQ0FBQyxNQUFNLEtBQUssQ0FBQyxDQUFDLENBQUM7d0JBQ3RCLG9CQUFvQixDQUFDLGFBQWEsQ0FBQyxHQUFHLENBQUMsQ0FBQzt3QkFDeEMsVUFBVSxVQUFVLEdBQUcsQ0FBQyxlQUFlLENBQUMsYUFBYSxDQUFDLEdBQUcsQ0FBQztnQkFDaEUsQ0FBQyxDQUFDO3FCQUNELElBQUksQ0FBQyxHQUFHLENBQUMsQ0FBQztTQUNwQjtRQUVELElBQUksQ0FBQyxRQUFRLEdBQUc7UUFDWixVQUFVLFlBQVksVUFBVSxJQUFJLEtBQUs7UUFDekMsVUFBVSxjQUFjLFVBQVUsSUFBSSxPQUFPOzs7VUFHM0MsS0FBSzt5QkFDVSxTQUFTOztLQUU3QixDQUFDO0lBQ0osQ0FBQztDQUNGIiwic291cmNlc0NvbnRlbnQiOlsiLyoqXG4gKiBAbGljZW5zZVxuICogQ29weXJpZ2h0IDIwMTcgR29vZ2xlIExMQy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC5cbiAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSBcIkxpY2Vuc2VcIik7XG4gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuXG4gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXRcbiAqXG4gKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjBcbiAqXG4gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlXG4gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiBcIkFTIElTXCIgQkFTSVMsXG4gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC5cbiAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmRcbiAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLlxuICogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbiAqL1xuXG5pbXBvcnQge0dQR1BVUHJvZ3JhbX0gZnJvbSAnLi9ncGdwdV9tYXRoJztcbmltcG9ydCB7Z2V0Q29vcmRzRGF0YVR5cGV9IGZyb20gJy4vc2hhZGVyX2NvbXBpbGVyJztcblxuZXhwb3J0IGNsYXNzIFN0cmlkZWRTbGljZVByb2dyYW0gaW1wbGVtZW50cyBHUEdQVVByb2dyYW0ge1xuICB2YXJpYWJsZU5hbWVzID0gWyd4J107XG4gIG91dHB1dFNoYXBlOiBudW1iZXJbXTtcbiAgdXNlckNvZGU6IHN0cmluZztcblxuICBjb25zdHJ1Y3RvcihiZWdpbjogbnVtYmVyW10sIHN0cmlkZXM6IG51bWJlcltdLCBzaXplOiBudW1iZXJbXSkge1xuICAgIHRoaXMub3V0cHV0U2hhcGUgPSBzaXplO1xuICAgIGNvbnN0IHJhbmsgPSBzaXplLmxlbmd0aDtcbiAgICBjb25zdCBpbnB1dER0eXBlID0gZ2V0Q29vcmRzRGF0YVR5cGUoc2l6ZS5sZW5ndGgpO1xuICAgIGNvbnN0IGR0eXBlID0gZ2V0Q29vcmRzRGF0YVR5cGUoc2l6ZS5sZW5ndGgpO1xuXG4gICAgbGV0IG5ld0Nvb3JkcyA9ICcnO1xuICAgIGlmIChyYW5rID09PSAxKSB7XG4gICAgICBuZXdDb29yZHMgPSAnY29vcmRzICogc3RyaWRlcyArIGJlZ2luJztcbiAgICB9IGVsc2Uge1xuICAgICAgbGV0IG91dHB1dEF4aXMgPSAwO1xuICAgICAgbmV3Q29vcmRzID1cbiAgICAgICAgICBzaXplLm1hcCgoXywgaSkgPT4ge1xuICAgICAgICAgICAgICAgIG91dHB1dEF4aXMrKztcbiAgICAgICAgICAgICAgICByZXR1cm4gc2l6ZS5sZW5ndGggPT09IDEgP1xuICAgICAgICAgICAgICAgICAgICBgY29vcmRzICogc3RyaWRlc1ske2l9XSArIGJlZ2luWyR7aX1dYCA6XG4gICAgICAgICAgICAgICAgICAgIGBjb29yZHNbJHtvdXRwdXRBeGlzIC0gMX1dICogc3RyaWRlc1ske2l9XSArIGJlZ2luWyR7aX1dYDtcbiAgICAgICAgICAgICAgfSlcbiAgICAgICAgICAgICAgLmpvaW4oJywnKTtcbiAgICB9XG5cbiAgICB0aGlzLnVzZXJDb2RlID0gYFxuICAgICAgJHtpbnB1dER0eXBlfSBiZWdpbiA9ICR7aW5wdXREdHlwZX0oJHtiZWdpbn0pO1xuICAgICAgJHtpbnB1dER0eXBlfSBzdHJpZGVzID0gJHtpbnB1dER0eXBlfSgke3N0cmlkZXN9KTtcblxuICAgICAgdm9pZCBtYWluKCkge1xuICAgICAgICAke2R0eXBlfSBjb29yZHMgPSBnZXRPdXRwdXRDb29yZHMoKTtcbiAgICAgICAgc2V0T3V0cHV0KGdldFgoJHtuZXdDb29yZHN9KSk7XG4gICAgICB9XG4gICAgYDtcbiAgfVxufVxuIl19","/**\n * @license\n * Copyright 2020 Google LLC. All Rights Reserved.\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n * =============================================================================\n */\nimport { buffer, slice_util, StridedSlice, util } from '@tensorflow/tfjs-core';\nimport { stridedSliceImplCPU } from '../kernel_utils/shared';\nimport { StridedSliceProgram } from '../strided_slice_gpu';\nimport { reshape } from './Reshape';\nimport { slice } from './Slice';\nexport function stridedSlice(args) {\n const { inputs, backend, attrs } = args;\n const { x } = inputs;\n const { begin, end, strides, beginMask, endMask, ellipsisMask, newAxisMask, shrinkAxisMask } = attrs;\n const { finalShapeSparse, finalShape, isIdentity, sliceDim0, isSimpleSlice, begin: $begin, end: $end, strides: $strides } = slice_util.sliceInfo(x.shape, begin, end, strides, beginMask, endMask, ellipsisMask, newAxisMask, shrinkAxisMask);\n let result;\n if (isIdentity) {\n // Optimization #1, slice is a no-op plus reshape\n result = reshape({ inputs: { x }, backend, attrs: { shape: finalShape } });\n }\n else if (sliceDim0 || isSimpleSlice) {\n // Optimization #2, slice is memory contiguous (only occurs in dim 0)\n util.assert(x.shape.length >= 1, () => `Input must have rank at least 1, got: ${x.shape.length}`);\n const size = slice_util.computeOutShape($begin, $end, $strides);\n // To tolerate begin[0] > end[0] (a 0-output slice), we min(begin, end).\n const sliced = slice({ inputs: { x }, backend, attrs: { begin: $begin, size } });\n result =\n reshape({ inputs: { x: sliced }, backend, attrs: { shape: finalShape } });\n backend.disposeIntermediateTensorInfo(sliced);\n }\n else {\n const shouldExecuteOnCPU = backend.shouldExecuteOnCPU([x]);\n if (shouldExecuteOnCPU) {\n // tslint:disable-next-line: no-unnecessary-type-assertion\n const values = backend.readSync(x.dataId);\n // tslint:disable-next-line: no-unnecessary-type-assertion\n const xBuf = buffer(x.shape, x.dtype, values);\n const resultValues = stridedSliceImplCPU(finalShapeSparse, xBuf, $strides, $begin);\n result = backend.makeTensorInfo(finalShape, x.dtype, resultValues.values);\n }\n else {\n const program = new StridedSliceProgram($begin, $strides, finalShapeSparse);\n result = backend.runWebGLProgram(program, [x], x.dtype);\n }\n }\n const resultReshaped = reshape({ inputs: { x: result }, backend, attrs: { shape: finalShape } });\n backend.disposeIntermediateTensorInfo(result);\n return resultReshaped;\n}\nexport const stridedSliceConfig = {\n kernelName: StridedSlice,\n backendName: 'webgl',\n kernelFunc: stridedSlice\n};\n//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiU3RyaWRlZFNsaWNlLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vLi4vdGZqcy1iYWNrZW5kLXdlYmdsL3NyYy9rZXJuZWxzL1N0cmlkZWRTbGljZS50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQTs7Ozs7Ozs7Ozs7Ozs7O0dBZUc7QUFFSCxPQUFPLEVBQUMsTUFBTSxFQUFrQyxVQUFVLEVBQUUsWUFBWSxFQUErRSxJQUFJLEVBQUMsTUFBTSx1QkFBdUIsQ0FBQztBQUcxTCxPQUFPLEVBQUMsbUJBQW1CLEVBQUMsTUFBTSx3QkFBd0IsQ0FBQztBQUMzRCxPQUFPLEVBQUMsbUJBQW1CLEVBQUMsTUFBTSxzQkFBc0IsQ0FBQztBQUV6RCxPQUFPLEVBQUMsT0FBTyxFQUFDLE1BQU0sV0FBVyxDQUFDO0FBQ2xDLE9BQU8sRUFBQyxLQUFLLEVBQUMsTUFBTSxTQUFTLENBQUM7QUFFOUIsTUFBTSxVQUFVLFlBQVksQ0FBQyxJQUk1QjtJQUNDLE1BQU0sRUFBQyxNQUFNLEVBQUUsT0FBTyxFQUFFLEtBQUssRUFBQyxHQUFHLElBQUksQ0FBQztJQUN0QyxNQUFNLEVBQUMsQ0FBQyxFQUFDLEdBQUcsTUFBTSxDQUFDO0lBQ25CLE1BQU0sRUFDSixLQUFLLEVBQ0wsR0FBRyxFQUNILE9BQU8sRUFDUCxTQUFTLEVBQ1QsT0FBTyxFQUNQLFlBQVksRUFDWixXQUFXLEVBQ1gsY0FBYyxFQUNmLEdBQUcsS0FBSyxDQUFDO0lBRVYsTUFBTSxFQUNKLGdCQUFnQixFQUNoQixVQUFVLEVBQ1YsVUFBVSxFQUNWLFNBQVMsRUFDVCxhQUFhLEVBQ2IsS0FBSyxFQUFFLE1BQU0sRUFDYixHQUFHLEVBQUUsSUFBSSxFQUNULE9BQU8sRUFBRSxRQUFRLEVBQ2xCLEdBQ0csVUFBVSxDQUFDLFNBQVMsQ0FDaEIsQ0FBQyxDQUFDLEtBQUssRUFBRSxLQUFLLEVBQUUsR0FBRyxFQUFFLE9BQU8sRUFBRSxTQUFTLEVBQUUsT0FBTyxFQUFFLFlBQVksRUFDOUQsV0FBVyxFQUFFLGNBQWMsQ0FBQyxDQUFDO0lBRXJDLElBQUksTUFBTSxDQUFDO0lBRVgsSUFBSSxVQUFVLEVBQUU7UUFDZCxpREFBaUQ7UUFDakQsTUFBTSxHQUFHLE9BQU8sQ0FBQyxFQUFDLE1BQU0sRUFBRSxFQUFDLENBQUMsRUFBQyxFQUFFLE9BQU8sRUFBRSxLQUFLLEVBQUUsRUFBQyxLQUFLLEVBQUUsVUFBVSxFQUFDLEVBQUMsQ0FBQyxDQUFDO0tBQ3RFO1NBQU0sSUFBSSxTQUFTLElBQUksYUFBYSxFQUFFO1FBQ3JDLHFFQUFxRTtRQUNyRSxJQUFJLENBQUMsTUFBTSxDQUNQLENBQUMsQ0FBQyxLQUFLLENBQUMsTUFBTSxJQUFJLENBQUMsRUFDbkIsR0FBRyxFQUFFLENBQUMseUNBQXlDLENBQUMsQ0FBQyxLQUFLLENBQUMsTUFBTSxFQUFFLENBQUMsQ0FBQztRQUVyRSxNQUFNLElBQUksR0FBRyxVQUFVLENBQUMsZUFBZSxDQUFDLE1BQU0sRUFBRSxJQUFJLEVBQUUsUUFBUSxDQUFDLENBQUM7UUFDaEUsd0VBQXdFO1FBQ3hFLE1BQU0sTUFBTSxHQUFHLEtBQUssQ0FBQyxFQUFDLE1BQU0sRUFBRSxFQUFDLENBQUMsRUFBQyxFQUFFLE9BQU8sRUFBRSxLQUFLLEVBQUUsRUFBQyxLQUFLLEVBQUUsTUFBTSxFQUFFLElBQUksRUFBQyxFQUFDLENBQUMsQ0FBQztRQUMzRSxNQUFNO1lBQ0YsT0FBTyxDQUFDLEVBQUMsTUFBTSxFQUFFLEVBQUMsQ0FBQyxFQUFFLE1BQU0sRUFBQyxFQUFFLE9BQU8sRUFBRSxLQUFLLEVBQUUsRUFBQyxLQUFLLEVBQUUsVUFBVSxFQUFDLEVBQUMsQ0FBQyxDQUFDO1FBQ3hFLE9BQU8sQ0FBQyw2QkFBNkIsQ0FBQyxNQUFNLENBQUMsQ0FBQztLQUMvQztTQUFNO1FBQ0wsTUFBTSxrQkFBa0IsR0FBRyxPQUFPLENBQUMsa0JBQWtCLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDO1FBQzNELElBQUksa0JBQWtCLEVBQUU7WUFDdEIsMERBQTBEO1lBQzFELE1BQU0sTUFBTSxHQUFHLE9BQU8sQ0FBQyxRQUFRLENBQUMsQ0FBQyxDQUFDLE1BQU0sQ0FBZSxDQUFDO1lBQ3hELDBEQUEwRDtZQUMxRCxNQUFNLElBQUksR0FBRyxNQUFNLENBQUMsQ0FBQyxDQUFDLEtBQUssRUFBRSxDQUFDLENBQUMsS0FBSyxFQUFFLE1BQU0sQ0FBdUIsQ0FBQztZQUNwRSxNQUFNLFlBQVksR0FDZCxtQkFBbUIsQ0FBQyxnQkFBZ0IsRUFBRSxJQUFJLEVBQUUsUUFBUSxFQUFFLE1BQU0sQ0FBQyxDQUFDO1lBQ2xFLE1BQU0sR0FBRyxPQUFPLENBQUMsY0FBYyxDQUFDLFVBQVUsRUFBRSxDQUFDLENBQUMsS0FBSyxFQUFFLFlBQVksQ0FBQyxNQUFNLENBQUMsQ0FBQztTQUMzRTthQUFNO1lBQ0wsTUFBTSxPQUFPLEdBQ1QsSUFBSSxtQkFBbUIsQ0FBQyxNQUFNLEVBQUUsUUFBUSxFQUFFLGdCQUFnQixDQUFDLENBQUM7WUFDaEUsTUFBTSxHQUFHLE9BQU8sQ0FBQyxlQUFlLENBQUMsT0FBTyxFQUFFLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLEtBQUssQ0FBQyxDQUFDO1NBQ3pEO0tBQ0Y7SUFFRCxNQUFNLGNBQWMsR0FDaEIsT0FBTyxDQUFDLEVBQUMsTUFBTSxFQUFFLEVBQUMsQ0FBQyxFQUFFLE1BQU0sRUFBQyxFQUFFLE9BQU8sRUFBRSxLQUFLLEVBQUUsRUFBQyxLQUFLLEVBQUUsVUFBVSxFQUFDLEVBQUMsQ0FBQyxDQUFDO0lBRXhFLE9BQU8sQ0FBQyw2QkFBNkIsQ0FBQyxNQUFNLENBQUMsQ0FBQztJQUU5QyxPQUFPLGNBQWMsQ0FBQztBQUN4QixDQUFDO0FBRUQsTUFBTSxDQUFDLE1BQU0sa0JBQWtCLEdBQWlCO0lBQzlDLFVBQVUsRUFBRSxZQUFZO0lBQ3hCLFdBQVcsRUFBRSxPQUFPO0lBQ3BCLFVBQVUsRUFBRSxZQUFnQztDQUM3QyxDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiLyoqXG4gKiBAbGljZW5zZVxuICogQ29weXJpZ2h0IDIwMjAgR29vZ2xlIExMQy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC5cbiAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSBcIkxpY2Vuc2VcIik7XG4gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuXG4gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXRcbiAqXG4gKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjBcbiAqXG4gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlXG4gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiBcIkFTIElTXCIgQkFTSVMsXG4gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC5cbiAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmRcbiAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLlxuICogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbiAqL1xuXG5pbXBvcnQge2J1ZmZlciwgS2VybmVsQ29uZmlnLCBLZXJuZWxGdW5jLCBSYW5rLCBzbGljZV91dGlsLCBTdHJpZGVkU2xpY2UsIFN0cmlkZWRTbGljZUF0dHJzLCBTdHJpZGVkU2xpY2VJbnB1dHMsIFRlbnNvckJ1ZmZlciwgVGVuc29ySW5mbywgVHlwZWRBcnJheSwgdXRpbH0gZnJvbSAnQHRlbnNvcmZsb3cvdGZqcy1jb3JlJztcblxuaW1wb3J0IHtNYXRoQmFja2VuZFdlYkdMfSBmcm9tICcuLi9iYWNrZW5kX3dlYmdsJztcbmltcG9ydCB7c3RyaWRlZFNsaWNlSW1wbENQVX0gZnJvbSAnLi4va2VybmVsX3V0aWxzL3NoYXJlZCc7XG5pbXBvcnQge1N0cmlkZWRTbGljZVByb2dyYW19IGZyb20gJy4uL3N0cmlkZWRfc2xpY2VfZ3B1JztcblxuaW1wb3J0IHtyZXNoYXBlfSBmcm9tICcuL1Jlc2hhcGUnO1xuaW1wb3J0IHtzbGljZX0gZnJvbSAnLi9TbGljZSc7XG5cbmV4cG9ydCBmdW5jdGlvbiBzdHJpZGVkU2xpY2UoYXJnczoge1xuICBpbnB1dHM6IFN0cmlkZWRTbGljZUlucHV0cyxcbiAgYmFja2VuZDogTWF0aEJhY2tlbmRXZWJHTCxcbiAgYXR0cnM6IFN0cmlkZWRTbGljZUF0dHJzXG59KTogVGVuc29ySW5mbyB7XG4gIGNvbnN0IHtpbnB1dHMsIGJhY2tlbmQsIGF0dHJzfSA9IGFyZ3M7XG4gIGNvbnN0IHt4fSA9IGlucHV0cztcbiAgY29uc3Qge1xuICAgIGJlZ2luLFxuICAgIGVuZCxcbiAgICBzdHJpZGVzLFxuICAgIGJlZ2luTWFzayxcbiAgICBlbmRNYXNrLFxuICAgIGVsbGlwc2lzTWFzayxcbiAgICBuZXdBeGlzTWFzayxcbiAgICBzaHJpbmtBeGlzTWFza1xuICB9ID0gYXR0cnM7XG5cbiAgY29uc3Qge1xuICAgIGZpbmFsU2hhcGVTcGFyc2UsXG4gICAgZmluYWxTaGFwZSxcbiAgICBpc0lkZW50aXR5LFxuICAgIHNsaWNlRGltMCxcbiAgICBpc1NpbXBsZVNsaWNlLFxuICAgIGJlZ2luOiAkYmVnaW4sXG4gICAgZW5kOiAkZW5kLFxuICAgIHN0cmlkZXM6ICRzdHJpZGVzXG4gIH0gPVxuICAgICAgc2xpY2VfdXRpbC5zbGljZUluZm8oXG4gICAgICAgICAgeC5zaGFwZSwgYmVnaW4sIGVuZCwgc3RyaWRlcywgYmVnaW5NYXNrLCBlbmRNYXNrLCBlbGxpcHNpc01hc2ssXG4gICAgICAgICAgbmV3QXhpc01hc2ssIHNocmlua0F4aXNNYXNrKTtcblxuICBsZXQgcmVzdWx0O1xuXG4gIGlmIChpc0lkZW50aXR5KSB7XG4gICAgLy8gT3B0aW1pemF0aW9uICMxLCBzbGljZSBpcyBhIG5vLW9wIHBsdXMgcmVzaGFwZVxuICAgIHJlc3VsdCA9IHJlc2hhcGUoe2lucHV0czoge3h9LCBiYWNrZW5kLCBhdHRyczoge3NoYXBlOiBmaW5hbFNoYXBlfX0pO1xuICB9IGVsc2UgaWYgKHNsaWNlRGltMCB8fCBpc1NpbXBsZVNsaWNlKSB7XG4gICAgLy8gT3B0aW1pemF0aW9uICMyLCBzbGljZSBpcyBtZW1vcnkgY29udGlndW91cyAob25seSBvY2N1cnMgaW4gZGltIDApXG4gICAgdXRpbC5hc3NlcnQoXG4gICAgICAgIHguc2hhcGUubGVuZ3RoID49IDEsXG4gICAgICAgICgpID0+IGBJbnB1dCBtdXN0IGhhdmUgcmFuayBhdCBsZWFzdCAxLCBnb3Q6ICR7eC5zaGFwZS5sZW5ndGh9YCk7XG5cbiAgICBjb25zdCBzaXplID0gc2xpY2VfdXRpbC5jb21wdXRlT3V0U2hhcGUoJGJlZ2luLCAkZW5kLCAkc3RyaWRlcyk7XG4gICAgLy8gVG8gdG9sZXJhdGUgYmVnaW5bMF0gPiBlbmRbMF0gKGEgMC1vdXRwdXQgc2xpY2UpLCB3ZSBtaW4oYmVnaW4sIGVuZCkuXG4gICAgY29uc3Qgc2xpY2VkID0gc2xpY2Uoe2lucHV0czoge3h9LCBiYWNrZW5kLCBhdHRyczoge2JlZ2luOiAkYmVnaW4sIHNpemV9fSk7XG4gICAgcmVzdWx0ID1cbiAgICAgICAgcmVzaGFwZSh7aW5wdXRzOiB7eDogc2xpY2VkfSwgYmFja2VuZCwgYXR0cnM6IHtzaGFwZTogZmluYWxTaGFwZX19KTtcbiAgICBiYWNrZW5kLmRpc3Bvc2VJbnRlcm1lZGlhdGVUZW5zb3JJbmZvKHNsaWNlZCk7XG4gIH0gZWxzZSB7XG4gICAgY29uc3Qgc2hvdWxkRXhlY3V0ZU9uQ1BVID0gYmFja2VuZC5zaG91bGRFeGVjdXRlT25DUFUoW3hdKTtcbiAgICBpZiAoc2hvdWxkRXhlY3V0ZU9uQ1BVKSB7XG4gICAgICAvLyB0c2xpbnQ6ZGlzYWJsZS1uZXh0LWxpbmU6IG5vLXVubmVjZXNzYXJ5LXR5cGUtYXNzZXJ0aW9uXG4gICAgICBjb25zdCB2YWx1ZXMgPSBiYWNrZW5kLnJlYWRTeW5jKHguZGF0YUlkKSBhcyBUeXBlZEFycmF5O1xuICAgICAgLy8gdHNsaW50OmRpc2FibGUtbmV4dC1saW5lOiBuby11bm5lY2Vzc2FyeS10eXBlLWFzc2VydGlvblxuICAgICAgY29uc3QgeEJ1ZiA9IGJ1ZmZlcih4LnNoYXBlLCB4LmR0eXBlLCB2YWx1ZXMpIGFzIFRlbnNvckJ1ZmZlcjxSYW5rPjtcbiAgICAgIGNvbnN0IHJlc3VsdFZhbHVlcyA9XG4gICAgICAgICAgc3RyaWRlZFNsaWNlSW1wbENQVShmaW5hbFNoYXBlU3BhcnNlLCB4QnVmLCAkc3RyaWRlcywgJGJlZ2luKTtcbiAgICAgIHJlc3VsdCA9IGJhY2tlbmQubWFrZVRlbnNvckluZm8oZmluYWxTaGFwZSwgeC5kdHlwZSwgcmVzdWx0VmFsdWVzLnZhbHVlcyk7XG4gICAgfSBlbHNlIHtcbiAgICAgIGNvbnN0IHByb2dyYW0gPVxuICAgICAgICAgIG5ldyBTdHJpZGVkU2xpY2VQcm9ncmFtKCRiZWdpbiwgJHN0cmlkZXMsIGZpbmFsU2hhcGVTcGFyc2UpO1xuICAgICAgcmVzdWx0ID0gYmFja2VuZC5ydW5XZWJHTFByb2dyYW0ocHJvZ3JhbSwgW3hdLCB4LmR0eXBlKTtcbiAgICB9XG4gIH1cblxuICBjb25zdCByZXN1bHRSZXNoYXBlZCA9XG4gICAgICByZXNoYXBlKHtpbnB1dHM6IHt4OiByZXN1bHR9LCBiYWNrZW5kLCBhdHRyczoge3NoYXBlOiBmaW5hbFNoYXBlfX0pO1xuXG4gIGJhY2tlbmQuZGlzcG9zZUludGVybWVkaWF0ZVRlbnNvckluZm8ocmVzdWx0KTtcblxuICByZXR1cm4gcmVzdWx0UmVzaGFwZWQ7XG59XG5cbmV4cG9ydCBjb25zdCBzdHJpZGVkU2xpY2VDb25maWc6IEtlcm5lbENvbmZpZyA9IHtcbiAga2VybmVsTmFtZTogU3RyaWRlZFNsaWNlLFxuICBiYWNrZW5kTmFtZTogJ3dlYmdsJyxcbiAga2VybmVsRnVuYzogc3RyaWRlZFNsaWNlIGFzIHt9IGFzIEtlcm5lbEZ1bmNcbn07XG4iXX0=","/**\n * @license\n * Copyright 2021 Google LLC. All Rights Reserved.\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n * =============================================================================\n */\nimport { StringNGrams } from '@tensorflow/tfjs-core';\nimport { stringNGramsImplCPU } from '../kernel_utils/shared';\nexport function stringNGrams(args) {\n const { inputs, backend, attrs } = args;\n const { separator, nGramWidths, leftPad, rightPad, padWidth, preserveShortSequences } = attrs;\n const { data, dataSplits } = inputs;\n const $data = backend.readSync(data.dataId);\n const $dataSplits = backend.readSync(dataSplits.dataId);\n const [nGrams, nGramsSplits] = stringNGramsImplCPU($data, $dataSplits, separator, nGramWidths, leftPad, rightPad, padWidth, preserveShortSequences);\n return [\n backend.makeTensorInfo([nGrams.length], 'string', nGrams),\n backend.makeTensorInfo(dataSplits.shape, 'int32', nGramsSplits),\n ];\n}\nexport const stringNGramsConfig = {\n kernelName: StringNGrams,\n backendName: 'webgl',\n kernelFunc: stringNGrams,\n};\n//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiU3RyaW5nTkdyYW1zLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vLi4vdGZqcy1iYWNrZW5kLXdlYmdsL3NyYy9rZXJuZWxzL1N0cmluZ05HcmFtcy50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQTs7Ozs7Ozs7Ozs7Ozs7O0dBZUc7QUFFSCxPQUFPLEVBQTJCLFlBQVksRUFBb0QsTUFBTSx1QkFBdUIsQ0FBQztBQUdoSSxPQUFPLEVBQUMsbUJBQW1CLEVBQUMsTUFBTSx3QkFBd0IsQ0FBQztBQUUzRCxNQUFNLFVBQVUsWUFBWSxDQUFDLElBSTVCO0lBQ0MsTUFBTSxFQUFDLE1BQU0sRUFBRSxPQUFPLEVBQUUsS0FBSyxFQUFDLEdBQUcsSUFBSSxDQUFDO0lBQ3RDLE1BQU0sRUFDSixTQUFTLEVBQ1QsV0FBVyxFQUNYLE9BQU8sRUFDUCxRQUFRLEVBQ1IsUUFBUSxFQUNSLHNCQUFzQixFQUN2QixHQUFHLEtBQUssQ0FBQztJQUNWLE1BQU0sRUFBQyxJQUFJLEVBQUUsVUFBVSxFQUFDLEdBQUcsTUFBTSxDQUFDO0lBQ2xDLE1BQU0sS0FBSyxHQUFHLE9BQU8sQ0FBQyxRQUFRLENBQUMsSUFBSSxDQUFDLE1BQU0sQ0FBaUIsQ0FBQztJQUM1RCxNQUFNLFdBQVcsR0FBRyxPQUFPLENBQUMsUUFBUSxDQUFDLFVBQVUsQ0FBQyxNQUFNLENBQWUsQ0FBQztJQUV0RSxNQUFNLENBQUMsTUFBTSxFQUFFLFlBQVksQ0FBQyxHQUFHLG1CQUFtQixDQUM5QyxLQUFLLEVBQUUsV0FBVyxFQUFFLFNBQVMsRUFBRSxXQUFXLEVBQUUsT0FBTyxFQUFFLFFBQVEsRUFBRSxRQUFRLEVBQ3ZFLHNCQUFzQixDQUFDLENBQUM7SUFDNUIsT0FBTztRQUNMLE9BQU8sQ0FBQyxjQUFjLENBQUMsQ0FBQyxNQUFNLENBQUMsTUFBTSxDQUFDLEVBQUUsUUFBUSxFQUFFLE1BQU0sQ0FBQztRQUN6RCxPQUFPLENBQUMsY0FBYyxDQUFDLFVBQVUsQ0FBQyxLQUFLLEVBQUUsT0FBTyxFQUFFLFlBQVksQ0FBQztLQUNoRSxDQUFDO0FBQ0osQ0FBQztBQUVELE1BQU0sQ0FBQyxNQUFNLGtCQUFrQixHQUFpQjtJQUM5QyxVQUFVLEVBQUUsWUFBWTtJQUN4QixXQUFXLEVBQUUsT0FBTztJQUNwQixVQUFVLEVBQUUsWUFBZ0M7Q0FDN0MsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbIi8qKlxuICogQGxpY2Vuc2VcbiAqIENvcHlyaWdodCAyMDIxIEdvb2dsZSBMTEMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuXG4gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgXCJMaWNlbnNlXCIpO1xuICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLlxuICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0XG4gKlxuICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wXG4gKlxuICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZVxuICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gXCJBUyBJU1wiIEJBU0lTLFxuICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuXG4gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kXG4gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS5cbiAqID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4gKi9cblxuaW1wb3J0IHtLZXJuZWxDb25maWcsIEtlcm5lbEZ1bmMsIFN0cmluZ05HcmFtcywgU3RyaW5nTkdyYW1zQXR0cnMsIFN0cmluZ05HcmFtc0lucHV0cywgVGVuc29ySW5mb30gZnJvbSAnQHRlbnNvcmZsb3cvdGZqcy1jb3JlJztcblxuaW1wb3J0IHtNYXRoQmFja2VuZFdlYkdMfSBmcm9tICcuLi9iYWNrZW5kX3dlYmdsJztcbmltcG9ydCB7c3RyaW5nTkdyYW1zSW1wbENQVX0gZnJvbSAnLi4va2VybmVsX3V0aWxzL3NoYXJlZCc7XG5cbmV4cG9ydCBmdW5jdGlvbiBzdHJpbmdOR3JhbXMoYXJnczoge1xuICBpbnB1dHM6IFN0cmluZ05HcmFtc0lucHV0cyxcbiAgYmFja2VuZDogTWF0aEJhY2tlbmRXZWJHTCxcbiAgYXR0cnM6IFN0cmluZ05HcmFtc0F0dHJzXG59KTogW1RlbnNvckluZm8sIFRlbnNvckluZm9dIHtcbiAgY29uc3Qge2lucHV0cywgYmFja2VuZCwgYXR0cnN9ID0gYXJncztcbiAgY29uc3Qge1xuICAgIHNlcGFyYXRvcixcbiAgICBuR3JhbVdpZHRocyxcbiAgICBsZWZ0UGFkLFxuICAgIHJpZ2h0UGFkLFxuICAgIHBhZFdpZHRoLFxuICAgIHByZXNlcnZlU2hvcnRTZXF1ZW5jZXNcbiAgfSA9IGF0dHJzO1xuICBjb25zdCB7ZGF0YSwgZGF0YVNwbGl0c30gPSBpbnB1dHM7XG4gIGNvbnN0ICRkYXRhID0gYmFja2VuZC5yZWFkU3luYyhkYXRhLmRhdGFJZCkgYXMgVWludDhBcnJheVtdO1xuICBjb25zdCAkZGF0YVNwbGl0cyA9IGJhY2tlbmQucmVhZFN5bmMoZGF0YVNwbGl0cy5kYXRhSWQpIGFzIEludDMyQXJyYXk7XG5cbiAgY29uc3QgW25HcmFtcywgbkdyYW1zU3BsaXRzXSA9IHN0cmluZ05HcmFtc0ltcGxDUFUoXG4gICAgICAkZGF0YSwgJGRhdGFTcGxpdHMsIHNlcGFyYXRvciwgbkdyYW1XaWR0aHMsIGxlZnRQYWQsIHJpZ2h0UGFkLCBwYWRXaWR0aCxcbiAgICAgIHByZXNlcnZlU2hvcnRTZXF1ZW5jZXMpO1xuICByZXR1cm4gW1xuICAgIGJhY2tlbmQubWFrZVRlbnNvckluZm8oW25HcmFtcy5sZW5ndGhdLCAnc3RyaW5nJywgbkdyYW1zKSxcbiAgICBiYWNrZW5kLm1ha2VUZW5zb3JJbmZvKGRhdGFTcGxpdHMuc2hhcGUsICdpbnQzMicsIG5HcmFtc1NwbGl0cyksXG4gIF07XG59XG5cbmV4cG9ydCBjb25zdCBzdHJpbmdOR3JhbXNDb25maWc6IEtlcm5lbENvbmZpZyA9IHtcbiAga2VybmVsTmFtZTogU3RyaW5nTkdyYW1zLFxuICBiYWNrZW5kTmFtZTogJ3dlYmdsJyxcbiAga2VybmVsRnVuYzogc3RyaW5nTkdyYW1zIGFzIHt9IGFzIEtlcm5lbEZ1bmMsXG59O1xuIl19","/**\n * @license\n * Copyright 2021 Google LLC. All Rights Reserved.\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n * =============================================================================\n */\nimport { StringSplit } from '@tensorflow/tfjs-core';\nimport { stringSplitImplCPU } from '../kernel_utils/shared';\nexport function stringSplit(args) {\n const { inputs, backend, attrs } = args;\n const { skipEmpty } = attrs;\n const { input, delimiter } = inputs;\n if (input.dtype !== 'string') {\n throw new Error('Input must be of datatype string');\n }\n if (input.shape.length !== 1) {\n throw new Error(`Input must be a vector, got shape: ${input.shape}`);\n }\n if (delimiter.shape.length !== 0) {\n throw new Error(`Delimiter must be a scalar, got shape: ${delimiter.shape}`);\n }\n const $input = backend.readSync(input.dataId);\n const $delimiter = backend.readSync(delimiter.dataId)[0];\n const [indices, values, shape] = stringSplitImplCPU($input, $delimiter, skipEmpty);\n const outputSize = values.length;\n return [\n backend.makeTensorInfo([outputSize, 2], 'int32', indices),\n backend.makeTensorInfo([outputSize], 'string', values),\n backend.makeTensorInfo([2], 'int32', new Int32Array(shape))\n ];\n}\nexport const stringSplitConfig = {\n kernelName: StringSplit,\n backendName: 'webgl',\n kernelFunc: stringSplit,\n};\n//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiU3RyaW5nU3BsaXQuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi8uLi90ZmpzLWJhY2tlbmQtd2ViZ2wvc3JjL2tlcm5lbHMvU3RyaW5nU3BsaXQudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUE7Ozs7Ozs7Ozs7Ozs7OztHQWVHO0FBRUgsT0FBTyxFQUEyQixXQUFXLEVBQWtELE1BQU0sdUJBQXVCLENBQUM7QUFHN0gsT0FBTyxFQUFDLGtCQUFrQixFQUFDLE1BQU0sd0JBQXdCLENBQUM7QUFFMUQsTUFBTSxVQUFVLFdBQVcsQ0FBQyxJQUkzQjtJQUNDLE1BQU0sRUFBQyxNQUFNLEVBQUUsT0FBTyxFQUFFLEtBQUssRUFBQyxHQUFHLElBQUksQ0FBQztJQUN0QyxNQUFNLEVBQUMsU0FBUyxFQUFDLEdBQUcsS0FBSyxDQUFDO0lBQzFCLE1BQU0sRUFBQyxLQUFLLEVBQUUsU0FBUyxFQUFDLEdBQUcsTUFBTSxDQUFDO0lBRWxDLElBQUksS0FBSyxDQUFDLEtBQUssS0FBSyxRQUFRLEVBQUU7UUFDNUIsTUFBTSxJQUFJLEtBQUssQ0FBQyxrQ0FBa0MsQ0FBQyxDQUFDO0tBQ3JEO0lBQ0QsSUFBSSxLQUFLLENBQUMsS0FBSyxDQUFDLE1BQU0sS0FBSyxDQUFDLEVBQUU7UUFDNUIsTUFBTSxJQUFJLEtBQUssQ0FBQyxzQ0FBc0MsS0FBSyxDQUFDLEtBQUssRUFBRSxDQUFDLENBQUM7S0FDdEU7SUFDRCxJQUFJLFNBQVMsQ0FBQyxLQUFLLENBQUMsTUFBTSxLQUFLLENBQUMsRUFBRTtRQUNoQyxNQUFNLElBQUksS0FBSyxDQUNYLDBDQUEwQyxTQUFTLENBQUMsS0FBSyxFQUFFLENBQUMsQ0FBQztLQUNsRTtJQUVELE1BQU0sTUFBTSxHQUFHLE9BQU8sQ0FBQyxRQUFRLENBQUMsS0FBSyxDQUFDLE1BQU0sQ0FBaUIsQ0FBQztJQUM5RCxNQUFNLFVBQVUsR0FBRyxPQUFPLENBQUMsUUFBUSxDQUFDLFNBQVMsQ0FBQyxNQUFNLENBQUMsQ0FBQyxDQUFDLENBQWUsQ0FBQztJQUV2RSxNQUFNLENBQUMsT0FBTyxFQUFFLE1BQU0sRUFBRSxLQUFLLENBQUMsR0FDMUIsa0JBQWtCLENBQUMsTUFBTSxFQUFFLFVBQVUsRUFBRSxTQUFTLENBQUMsQ0FBQztJQUN0RCxNQUFNLFVBQVUsR0FBRyxNQUFNLENBQUMsTUFBTSxDQUFDO0lBQ2pDLE9BQU87UUFDTCxPQUFPLENBQUMsY0FBYyxDQUFDLENBQUMsVUFBVSxFQUFFLENBQUMsQ0FBQyxFQUFFLE9BQU8sRUFBRSxPQUFPLENBQUM7UUFDekQsT0FBTyxDQUFDLGNBQWMsQ0FBQyxDQUFDLFVBQVUsQ0FBQyxFQUFFLFFBQVEsRUFBRSxNQUFNLENBQUM7UUFDdEQsT0FBTyxDQUFDLGNBQWMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxFQUFFLE9BQU8sRUFBRSxJQUFJLFVBQVUsQ0FBQyxLQUFLLENBQUMsQ0FBQztLQUM1RCxDQUFDO0FBQ0osQ0FBQztBQUVELE1BQU0sQ0FBQyxNQUFNLGlCQUFpQixHQUFpQjtJQUM3QyxVQUFVLEVBQUUsV0FBVztJQUN2QixXQUFXLEVBQUUsT0FBTztJQUNwQixVQUFVLEVBQUUsV0FBK0I7Q0FDNUMsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbIi8qKlxuICogQGxpY2Vuc2VcbiAqIENvcHlyaWdodCAyMDIxIEdvb2dsZSBMTEMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuXG4gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgXCJMaWNlbnNlXCIpO1xuICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLlxuICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0XG4gKlxuICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wXG4gKlxuICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZVxuICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gXCJBUyBJU1wiIEJBU0lTLFxuICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuXG4gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kXG4gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS5cbiAqID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4gKi9cblxuaW1wb3J0IHtLZXJuZWxDb25maWcsIEtlcm5lbEZ1bmMsIFN0cmluZ1NwbGl0LCBTdHJpbmdTcGxpdEF0dHJzLCBTdHJpbmdTcGxpdElucHV0cywgVGVuc29ySW5mb30gZnJvbSAnQHRlbnNvcmZsb3cvdGZqcy1jb3JlJztcblxuaW1wb3J0IHtNYXRoQmFja2VuZFdlYkdMfSBmcm9tICcuLi9iYWNrZW5kX3dlYmdsJztcbmltcG9ydCB7c3RyaW5nU3BsaXRJbXBsQ1BVfSBmcm9tICcuLi9rZXJuZWxfdXRpbHMvc2hhcmVkJztcblxuZXhwb3J0IGZ1bmN0aW9uIHN0cmluZ1NwbGl0KGFyZ3M6IHtcbiAgaW5wdXRzOiBTdHJpbmdTcGxpdElucHV0cyxcbiAgYmFja2VuZDogTWF0aEJhY2tlbmRXZWJHTCxcbiAgYXR0cnM6IFN0cmluZ1NwbGl0QXR0cnNcbn0pOiBbVGVuc29ySW5mbywgVGVuc29ySW5mbywgVGVuc29ySW5mb10ge1xuICBjb25zdCB7aW5wdXRzLCBiYWNrZW5kLCBhdHRyc30gPSBhcmdzO1xuICBjb25zdCB7c2tpcEVtcHR5fSA9IGF0dHJzO1xuICBjb25zdCB7aW5wdXQsIGRlbGltaXRlcn0gPSBpbnB1dHM7XG5cbiAgaWYgKGlucHV0LmR0eXBlICE9PSAnc3RyaW5nJykge1xuICAgIHRocm93IG5ldyBFcnJvcignSW5wdXQgbXVzdCBiZSBvZiBkYXRhdHlwZSBzdHJpbmcnKTtcbiAgfVxuICBpZiAoaW5wdXQuc2hhcGUubGVuZ3RoICE9PSAxKSB7XG4gICAgdGhyb3cgbmV3IEVycm9yKGBJbnB1dCBtdXN0IGJlIGEgdmVjdG9yLCBnb3Qgc2hhcGU6ICR7aW5wdXQuc2hhcGV9YCk7XG4gIH1cbiAgaWYgKGRlbGltaXRlci5zaGFwZS5sZW5ndGggIT09IDApIHtcbiAgICB0aHJvdyBuZXcgRXJyb3IoXG4gICAgICAgIGBEZWxpbWl0ZXIgbXVzdCBiZSBhIHNjYWxhciwgZ290IHNoYXBlOiAke2RlbGltaXRlci5zaGFwZX1gKTtcbiAgfVxuXG4gIGNvbnN0ICRpbnB1dCA9IGJhY2tlbmQucmVhZFN5bmMoaW5wdXQuZGF0YUlkKSBhcyBVaW50OEFycmF5W107XG4gIGNvbnN0ICRkZWxpbWl0ZXIgPSBiYWNrZW5kLnJlYWRTeW5jKGRlbGltaXRlci5kYXRhSWQpWzBdIGFzIFVpbnQ4QXJyYXk7XG5cbiAgY29uc3QgW2luZGljZXMsIHZhbHVlcywgc2hhcGVdID1cbiAgICAgIHN0cmluZ1NwbGl0SW1wbENQVSgkaW5wdXQsICRkZWxpbWl0ZXIsIHNraXBFbXB0eSk7XG4gIGNvbnN0IG91dHB1dFNpemUgPSB2YWx1ZXMubGVuZ3RoO1xuICByZXR1cm4gW1xuICAgIGJhY2tlbmQubWFrZVRlbnNvckluZm8oW291dHB1dFNpemUsIDJdLCAnaW50MzInLCBpbmRpY2VzKSxcbiAgICBiYWNrZW5kLm1ha2VUZW5zb3JJbmZvKFtvdXRwdXRTaXplXSwgJ3N0cmluZycsIHZhbHVlcyksXG4gICAgYmFja2VuZC5tYWtlVGVuc29ySW5mbyhbMl0sICdpbnQzMicsIG5ldyBJbnQzMkFycmF5KHNoYXBlKSlcbiAgXTtcbn1cblxuZXhwb3J0IGNvbnN0IHN0cmluZ1NwbGl0Q29uZmlnOiBLZXJuZWxDb25maWcgPSB7XG4gIGtlcm5lbE5hbWU6IFN0cmluZ1NwbGl0LFxuICBiYWNrZW5kTmFtZTogJ3dlYmdsJyxcbiAga2VybmVsRnVuYzogc3RyaW5nU3BsaXQgYXMge30gYXMgS2VybmVsRnVuYyxcbn07XG4iXX0=","/**\n * @license\n * Copyright 2021 Google LLC. All Rights Reserved.\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n * =============================================================================\n */\nimport { StringToHashBucketFast } from '@tensorflow/tfjs-core';\nimport { stringToHashBucketFastImplCPU } from '../kernel_utils/shared';\nexport function stringToHashBucketFast(args) {\n const { inputs, backend, attrs } = args;\n const { numBuckets } = attrs;\n const { input } = inputs;\n if (input.dtype !== 'string') {\n throw new Error('Input must be of datatype string');\n }\n if (numBuckets <= 0) {\n throw new Error(`Number of buckets must be at least 1`);\n }\n const $input = backend.readSync(input.dataId);\n const output = stringToHashBucketFastImplCPU($input, numBuckets);\n return backend.makeTensorInfo(input.shape, 'int32', output);\n}\nexport const stringToHashBucketFastConfig = {\n kernelName: StringToHashBucketFast,\n backendName: 'webgl',\n kernelFunc: stringToHashBucketFast,\n};\n//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiU3RyaW5nVG9IYXNoQnVja2V0RmFzdC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uLy4uL3RmanMtYmFja2VuZC13ZWJnbC9zcmMva2VybmVscy9TdHJpbmdUb0hhc2hCdWNrZXRGYXN0LnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBOzs7Ozs7Ozs7Ozs7Ozs7R0FlRztBQUVILE9BQU8sRUFBMkIsc0JBQXNCLEVBQXdFLE1BQU0sdUJBQXVCLENBQUM7QUFHOUosT0FBTyxFQUFDLDZCQUE2QixFQUFDLE1BQU0sd0JBQXdCLENBQUM7QUFFckUsTUFBTSxVQUFVLHNCQUFzQixDQUFDLElBSXRDO0lBQ0MsTUFBTSxFQUFDLE1BQU0sRUFBRSxPQUFPLEVBQUUsS0FBSyxFQUFDLEdBQUcsSUFBSSxDQUFDO0lBQ3RDLE1BQU0sRUFBQyxVQUFVLEVBQUMsR0FBRyxLQUFLLENBQUM7SUFDM0IsTUFBTSxFQUFDLEtBQUssRUFBQyxHQUFHLE1BQU0sQ0FBQztJQUV2QixJQUFJLEtBQUssQ0FBQyxLQUFLLEtBQUssUUFBUSxFQUFFO1FBQzVCLE1BQU0sSUFBSSxLQUFLLENBQUMsa0NBQWtDLENBQUMsQ0FBQztLQUNyRDtJQUNELElBQUksVUFBVSxJQUFJLENBQUMsRUFBRTtRQUNuQixNQUFNLElBQUksS0FBSyxDQUFDLHNDQUFzQyxDQUFDLENBQUM7S0FDekQ7SUFFRCxNQUFNLE1BQU0sR0FBRyxPQUFPLENBQUMsUUFBUSxDQUFDLEtBQUssQ0FBQyxNQUFNLENBQWlCLENBQUM7SUFFOUQsTUFBTSxNQUFNLEdBQUcsNkJBQTZCLENBQUMsTUFBTSxFQUFFLFVBQVUsQ0FBQyxDQUFDO0lBQ2pFLE9BQU8sT0FBTyxDQUFDLGNBQWMsQ0FBQyxLQUFLLENBQUMsS0FBSyxFQUFFLE9BQU8sRUFBRSxNQUFNLENBQUMsQ0FBQztBQUM5RCxDQUFDO0FBRUQsTUFBTSxDQUFDLE1BQU0sNEJBQTRCLEdBQWlCO0lBQ3hELFVBQVUsRUFBRSxzQkFBc0I7SUFDbEMsV0FBVyxFQUFFLE9BQU87SUFDcEIsVUFBVSxFQUFFLHNCQUEwQztDQUN2RCxDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiLyoqXG4gKiBAbGljZW5zZVxuICogQ29weXJpZ2h0IDIwMjEgR29vZ2xlIExMQy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC5cbiAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSBcIkxpY2Vuc2VcIik7XG4gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuXG4gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXRcbiAqXG4gKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjBcbiAqXG4gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlXG4gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiBcIkFTIElTXCIgQkFTSVMsXG4gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC5cbiAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmRcbiAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLlxuICogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbiAqL1xuXG5pbXBvcnQge0tlcm5lbENvbmZpZywgS2VybmVsRnVuYywgU3RyaW5nVG9IYXNoQnVja2V0RmFzdCwgU3RyaW5nVG9IYXNoQnVja2V0RmFzdEF0dHJzLCBTdHJpbmdUb0hhc2hCdWNrZXRGYXN0SW5wdXRzLCBUZW5zb3JJbmZvfSBmcm9tICdAdGVuc29yZmxvdy90ZmpzLWNvcmUnO1xuXG5pbXBvcnQge01hdGhCYWNrZW5kV2ViR0x9IGZyb20gJy4uL2JhY2tlbmRfd2ViZ2wnO1xuaW1wb3J0IHtzdHJpbmdUb0hhc2hCdWNrZXRGYXN0SW1wbENQVX0gZnJvbSAnLi4va2VybmVsX3V0aWxzL3NoYXJlZCc7XG5cbmV4cG9ydCBmdW5jdGlvbiBzdHJpbmdUb0hhc2hCdWNrZXRGYXN0KGFyZ3M6IHtcbiAgaW5wdXRzOiBTdHJpbmdUb0hhc2hCdWNrZXRGYXN0SW5wdXRzLFxuICBiYWNrZW5kOiBNYXRoQmFja2VuZFdlYkdMLFxuICBhdHRyczogU3RyaW5nVG9IYXNoQnVja2V0RmFzdEF0dHJzXG59KTogVGVuc29ySW5mbyB7XG4gIGNvbnN0IHtpbnB1dHMsIGJhY2tlbmQsIGF0dHJzfSA9IGFyZ3M7XG4gIGNvbnN0IHtudW1CdWNrZXRzfSA9IGF0dHJzO1xuICBjb25zdCB7aW5wdXR9ID0gaW5wdXRzO1xuXG4gIGlmIChpbnB1dC5kdHlwZSAhPT0gJ3N0cmluZycpIHtcbiAgICB0aHJvdyBuZXcgRXJyb3IoJ0lucHV0IG11c3QgYmUgb2YgZGF0YXR5cGUgc3RyaW5nJyk7XG4gIH1cbiAgaWYgKG51bUJ1Y2tldHMgPD0gMCkge1xuICAgIHRocm93IG5ldyBFcnJvcihgTnVtYmVyIG9mIGJ1Y2tldHMgbXVzdCBiZSBhdCBsZWFzdCAxYCk7XG4gIH1cblxuICBjb25zdCAkaW5wdXQgPSBiYWNrZW5kLnJlYWRTeW5jKGlucHV0LmRhdGFJZCkgYXMgVWludDhBcnJheVtdO1xuXG4gIGNvbnN0IG91dHB1dCA9IHN0cmluZ1RvSGFzaEJ1Y2tldEZhc3RJbXBsQ1BVKCRpbnB1dCwgbnVtQnVja2V0cyk7XG4gIHJldHVybiBiYWNrZW5kLm1ha2VUZW5zb3JJbmZvKGlucHV0LnNoYXBlLCAnaW50MzInLCBvdXRwdXQpO1xufVxuXG5leHBvcnQgY29uc3Qgc3RyaW5nVG9IYXNoQnVja2V0RmFzdENvbmZpZzogS2VybmVsQ29uZmlnID0ge1xuICBrZXJuZWxOYW1lOiBTdHJpbmdUb0hhc2hCdWNrZXRGYXN0LFxuICBiYWNrZW5kTmFtZTogJ3dlYmdsJyxcbiAga2VybmVsRnVuYzogc3RyaW5nVG9IYXNoQnVja2V0RmFzdCBhcyB7fSBhcyBLZXJuZWxGdW5jLFxufTtcbiJdfQ==","/**\n * @license\n * Copyright 2020 Google LLC. All Rights Reserved.\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n * =============================================================================\n */\nimport { Tan } from '@tensorflow/tfjs-core';\nimport { unaryKernelFunc } from '../kernel_utils/kernel_funcs_utils';\nconst TAN = `return tan(x);`;\nexport const tan = unaryKernelFunc({ opSnippet: TAN });\nexport const tanConfig = {\n kernelName: Tan,\n backendName: 'webgl',\n kernelFunc: tan,\n};\n//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiVGFuLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vLi4vdGZqcy1iYWNrZW5kLXdlYmdsL3NyYy9rZXJuZWxzL1Rhbi50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQTs7Ozs7Ozs7Ozs7Ozs7O0dBZUc7QUFFSCxPQUFPLEVBQWUsR0FBRyxFQUFDLE1BQU0sdUJBQXVCLENBQUM7QUFFeEQsT0FBTyxFQUFDLGVBQWUsRUFBQyxNQUFNLG9DQUFvQyxDQUFDO0FBRW5FLE1BQU0sR0FBRyxHQUFHLGdCQUFnQixDQUFDO0FBRTdCLE1BQU0sQ0FBQyxNQUFNLEdBQUcsR0FBRyxlQUFlLENBQUMsRUFBQyxTQUFTLEVBQUUsR0FBRyxFQUFDLENBQUMsQ0FBQztBQUVyRCxNQUFNLENBQUMsTUFBTSxTQUFTLEdBQWlCO0lBQ3JDLFVBQVUsRUFBRSxHQUFHO0lBQ2YsV0FBVyxFQUFFLE9BQU87SUFDcEIsVUFBVSxFQUFFLEdBQUc7Q0FDaEIsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbIi8qKlxuICogQGxpY2Vuc2VcbiAqIENvcHlyaWdodCAyMDIwIEdvb2dsZSBMTEMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuXG4gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgXCJMaWNlbnNlXCIpO1xuICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLlxuICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0XG4gKlxuICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wXG4gKlxuICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZVxuICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gXCJBUyBJU1wiIEJBU0lTLFxuICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuXG4gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kXG4gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS5cbiAqID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4gKi9cblxuaW1wb3J0IHtLZXJuZWxDb25maWcsIFRhbn0gZnJvbSAnQHRlbnNvcmZsb3cvdGZqcy1jb3JlJztcblxuaW1wb3J0IHt1bmFyeUtlcm5lbEZ1bmN9IGZyb20gJy4uL2tlcm5lbF91dGlscy9rZXJuZWxfZnVuY3NfdXRpbHMnO1xuXG5jb25zdCBUQU4gPSBgcmV0dXJuIHRhbih4KTtgO1xuXG5leHBvcnQgY29uc3QgdGFuID0gdW5hcnlLZXJuZWxGdW5jKHtvcFNuaXBwZXQ6IFRBTn0pO1xuXG5leHBvcnQgY29uc3QgdGFuQ29uZmlnOiBLZXJuZWxDb25maWcgPSB7XG4gIGtlcm5lbE5hbWU6IFRhbixcbiAgYmFja2VuZE5hbWU6ICd3ZWJnbCcsXG4gIGtlcm5lbEZ1bmM6IHRhbixcbn07XG4iXX0=","/**\n * @license\n * Copyright 2020 Google LLC. All Rights Reserved.\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n * =============================================================================\n */\nimport { Tanh } from '@tensorflow/tfjs-core';\nimport { unaryKernelFunc } from '../kernel_utils/kernel_funcs_utils';\nconst TANH = `\n float e2x = exp(-2.0 * abs(x));\n return sign(x) * (1.0 - e2x) / (1.0 + e2x);\n`;\nexport const tanh = unaryKernelFunc({ opSnippet: TANH });\nexport const tanhConfig = {\n kernelName: Tanh,\n backendName: 'webgl',\n kernelFunc: tanh,\n};\n//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiVGFuaC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uLy4uL3RmanMtYmFja2VuZC13ZWJnbC9zcmMva2VybmVscy9UYW5oLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBOzs7Ozs7Ozs7Ozs7Ozs7R0FlRztBQUVILE9BQU8sRUFBZSxJQUFJLEVBQUMsTUFBTSx1QkFBdUIsQ0FBQztBQUN6RCxPQUFPLEVBQUMsZUFBZSxFQUFDLE1BQU0sb0NBQW9DLENBQUM7QUFFbkUsTUFBTSxJQUFJLEdBQUc7OztDQUdaLENBQUM7QUFFRixNQUFNLENBQUMsTUFBTSxJQUFJLEdBQUcsZUFBZSxDQUFDLEVBQUMsU0FBUyxFQUFFLElBQUksRUFBQyxDQUFDLENBQUM7QUFFdkQsTUFBTSxDQUFDLE1BQU0sVUFBVSxHQUFpQjtJQUN0QyxVQUFVLEVBQUUsSUFBSTtJQUNoQixXQUFXLEVBQUUsT0FBTztJQUNwQixVQUFVLEVBQUUsSUFBSTtDQUNqQixDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiLyoqXG4gKiBAbGljZW5zZVxuICogQ29weXJpZ2h0IDIwMjAgR29vZ2xlIExMQy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC5cbiAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSBcIkxpY2Vuc2VcIik7XG4gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuXG4gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXRcbiAqXG4gKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjBcbiAqXG4gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlXG4gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiBcIkFTIElTXCIgQkFTSVMsXG4gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC5cbiAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmRcbiAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLlxuICogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbiAqL1xuXG5pbXBvcnQge0tlcm5lbENvbmZpZywgVGFuaH0gZnJvbSAnQHRlbnNvcmZsb3cvdGZqcy1jb3JlJztcbmltcG9ydCB7dW5hcnlLZXJuZWxGdW5jfSBmcm9tICcuLi9rZXJuZWxfdXRpbHMva2VybmVsX2Z1bmNzX3V0aWxzJztcblxuY29uc3QgVEFOSCA9IGBcbiAgZmxvYXQgZTJ4ID0gZXhwKC0yLjAgKiBhYnMoeCkpO1xuICByZXR1cm4gc2lnbih4KSAqICgxLjAgLSBlMngpIC8gKDEuMCArIGUyeCk7XG5gO1xuXG5leHBvcnQgY29uc3QgdGFuaCA9IHVuYXJ5S2VybmVsRnVuYyh7b3BTbmlwcGV0OiBUQU5IfSk7XG5cbmV4cG9ydCBjb25zdCB0YW5oQ29uZmlnOiBLZXJuZWxDb25maWcgPSB7XG4gIGtlcm5lbE5hbWU6IFRhbmgsXG4gIGJhY2tlbmROYW1lOiAnd2ViZ2wnLFxuICBrZXJuZWxGdW5jOiB0YW5oLFxufTtcbiJdfQ==","/**\n * @license\n * Copyright 2017 Google LLC. All Rights Reserved.\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n * =============================================================================\n */\nimport { getCoordsDataType } from './shader_compiler';\nexport class TileProgram {\n constructor(aShape, reps) {\n this.variableNames = ['A'];\n const outputShape = new Array(aShape.length);\n for (let i = 0; i < outputShape.length; i++) {\n outputShape[i] = aShape[i] * reps[i];\n }\n this.outputShape = outputShape;\n this.rank = outputShape.length;\n const dtype = getCoordsDataType(this.rank);\n const sourceCoords = getSourceCoords(aShape);\n this.userCode = `\n void main() {\n ${dtype} resRC = getOutputCoords();\n setOutput(getA(${sourceCoords}));\n }\n `;\n }\n}\nfunction getSourceCoords(aShape) {\n const rank = aShape.length;\n if (rank > 5) {\n throw Error(`Tile for rank ${rank} is not yet supported`);\n }\n if (rank === 1) {\n return `imod(resRC, ${aShape[0]})`;\n }\n const currentCoords = ['resRC.x', 'resRC.y', 'resRC.z', 'resRC.w', 'resRC.u'];\n const sourceCoords = [];\n for (let i = 0; i < aShape.length; i++) {\n sourceCoords.push(`imod(${currentCoords[i]}, ${aShape[i]})`);\n }\n return sourceCoords.join();\n}\n//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidGlsZV9ncHUuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi90ZmpzLWJhY2tlbmQtd2ViZ2wvc3JjL3RpbGVfZ3B1LnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBOzs7Ozs7Ozs7Ozs7Ozs7R0FlRztBQUdILE9BQU8sRUFBQyxpQkFBaUIsRUFBQyxNQUFNLG1CQUFtQixDQUFDO0FBRXBELE1BQU0sT0FBTyxXQUFXO0lBTXRCLFlBQVksTUFBZ0IsRUFBRSxJQUFjO1FBTDVDLGtCQUFhLEdBQUcsQ0FBQyxHQUFHLENBQUMsQ0FBQztRQU1wQixNQUFNLFdBQVcsR0FBYSxJQUFJLEtBQUssQ0FBQyxNQUFNLENBQUMsTUFBTSxDQUFDLENBQUM7UUFDdkQsS0FBSyxJQUFJLENBQUMsR0FBRyxDQUFDLEVBQUUsQ0FBQyxHQUFHLFdBQVcsQ0FBQyxNQUFNLEVBQUUsQ0FBQyxFQUFFLEVBQUU7WUFDM0MsV0FBVyxDQUFDLENBQUMsQ0FBQyxHQUFHLE1BQU0sQ0FBQyxDQUFDLENBQUMsR0FBRyxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUM7U0FDdEM7UUFDRCxJQUFJLENBQUMsV0FBVyxHQUFHLFdBQVcsQ0FBQztRQUMvQixJQUFJLENBQUMsSUFBSSxHQUFHLFdBQVcsQ0FBQyxNQUFNLENBQUM7UUFDL0IsTUFBTSxLQUFLLEdBQUcsaUJBQWlCLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxDQUFDO1FBQzNDLE1BQU0sWUFBWSxHQUFHLGVBQWUsQ0FBQyxNQUFNLENBQUMsQ0FBQztRQUU3QyxJQUFJLENBQUMsUUFBUSxHQUFHOztVQUVWLEtBQUs7eUJBQ1UsWUFBWTs7S0FFaEMsQ0FBQztJQUNKLENBQUM7Q0FDRjtBQUVELFNBQVMsZUFBZSxDQUFDLE1BQWdCO0lBQ3ZDLE1BQU0sSUFBSSxHQUFHLE1BQU0sQ0FBQyxNQUFNLENBQUM7SUFDM0IsSUFBSSxJQUFJLEdBQUcsQ0FBQyxFQUFFO1FBQ1osTUFBTSxLQUFLLENBQUMsaUJBQWlCLElBQUksdUJBQXVCLENBQUMsQ0FBQztLQUMzRDtJQUNELElBQUksSUFBSSxLQUFLLENBQUMsRUFBRTtRQUNkLE9BQU8sZUFBZSxNQUFNLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQztLQUNwQztJQUVELE1BQU0sYUFBYSxHQUFHLENBQUMsU0FBUyxFQUFFLFNBQVMsRUFBRSxTQUFTLEVBQUUsU0FBUyxFQUFFLFNBQVMsQ0FBQyxDQUFDO0lBRTlFLE1BQU0sWUFBWSxHQUFHLEVBQUUsQ0FBQztJQUN4QixLQUFLLElBQUksQ0FBQyxHQUFHLENBQUMsRUFBRSxDQUFDLEdBQUcsTUFBTSxDQUFDLE1BQU0sRUFBRSxDQUFDLEVBQUUsRUFBRTtRQUN0QyxZQUFZLENBQUMsSUFBSSxDQUFDLFFBQVEsYUFBYSxDQUFDLENBQUMsQ0FBQyxLQUFLLE1BQU0sQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUM7S0FDOUQ7SUFDRCxPQUFPLFlBQVksQ0FBQyxJQUFJLEVBQUUsQ0FBQztBQUM3QixDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiLyoqXG4gKiBAbGljZW5zZVxuICogQ29weXJpZ2h0IDIwMTcgR29vZ2xlIExMQy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC5cbiAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSBcIkxpY2Vuc2VcIik7XG4gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuXG4gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXRcbiAqXG4gKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjBcbiAqXG4gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlXG4gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiBcIkFTIElTXCIgQkFTSVMsXG4gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC5cbiAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmRcbiAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLlxuICogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbiAqL1xuXG5pbXBvcnQge0dQR1BVUHJvZ3JhbX0gZnJvbSAnLi9ncGdwdV9tYXRoJztcbmltcG9ydCB7Z2V0Q29vcmRzRGF0YVR5cGV9IGZyb20gJy4vc2hhZGVyX2NvbXBpbGVyJztcblxuZXhwb3J0IGNsYXNzIFRpbGVQcm9ncmFtIGltcGxlbWVudHMgR1BHUFVQcm9ncmFtIHtcbiAgdmFyaWFibGVOYW1lcyA9IFsnQSddO1xuICBvdXRwdXRTaGFwZTogbnVtYmVyW107XG4gIHVzZXJDb2RlOiBzdHJpbmc7XG4gIHJhbms6IG51bWJlcjtcblxuICBjb25zdHJ1Y3RvcihhU2hhcGU6IG51bWJlcltdLCByZXBzOiBudW1iZXJbXSkge1xuICAgIGNvbnN0IG91dHB1dFNoYXBlOiBudW1iZXJbXSA9IG5ldyBBcnJheShhU2hhcGUubGVuZ3RoKTtcbiAgICBmb3IgKGxldCBpID0gMDsgaSA8IG91dHB1dFNoYXBlLmxlbmd0aDsgaSsrKSB7XG4gICAgICBvdXRwdXRTaGFwZVtpXSA9IGFTaGFwZVtpXSAqIHJlcHNbaV07XG4gICAgfVxuICAgIHRoaXMub3V0cHV0U2hhcGUgPSBvdXRwdXRTaGFwZTtcbiAgICB0aGlzLnJhbmsgPSBvdXRwdXRTaGFwZS5sZW5ndGg7XG4gICAgY29uc3QgZHR5cGUgPSBnZXRDb29yZHNEYXRhVHlwZSh0aGlzLnJhbmspO1xuICAgIGNvbnN0IHNvdXJjZUNvb3JkcyA9IGdldFNvdXJjZUNvb3JkcyhhU2hhcGUpO1xuXG4gICAgdGhpcy51c2VyQ29kZSA9IGBcbiAgICAgIHZvaWQgbWFpbigpIHtcbiAgICAgICAgJHtkdHlwZX0gcmVzUkMgPSBnZXRPdXRwdXRDb29yZHMoKTtcbiAgICAgICAgc2V0T3V0cHV0KGdldEEoJHtzb3VyY2VDb29yZHN9KSk7XG4gICAgICB9XG4gICAgYDtcbiAgfVxufVxuXG5mdW5jdGlvbiBnZXRTb3VyY2VDb29yZHMoYVNoYXBlOiBudW1iZXJbXSk6IHN0cmluZyB7XG4gIGNvbnN0IHJhbmsgPSBhU2hhcGUubGVuZ3RoO1xuICBpZiAocmFuayA+IDUpIHtcbiAgICB0aHJvdyBFcnJvcihgVGlsZSBmb3IgcmFuayAke3Jhbmt9IGlzIG5vdCB5ZXQgc3VwcG9ydGVkYCk7XG4gIH1cbiAgaWYgKHJhbmsgPT09IDEpIHtcbiAgICByZXR1cm4gYGltb2QocmVzUkMsICR7YVNoYXBlWzBdfSlgO1xuICB9XG5cbiAgY29uc3QgY3VycmVudENvb3JkcyA9IFsncmVzUkMueCcsICdyZXNSQy55JywgJ3Jlc1JDLnonLCAncmVzUkMudycsICdyZXNSQy51J107XG5cbiAgY29uc3Qgc291cmNlQ29vcmRzID0gW107XG4gIGZvciAobGV0IGkgPSAwOyBpIDwgYVNoYXBlLmxlbmd0aDsgaSsrKSB7XG4gICAgc291cmNlQ29vcmRzLnB1c2goYGltb2QoJHtjdXJyZW50Q29vcmRzW2ldfSwgJHthU2hhcGVbaV19KWApO1xuICB9XG4gIHJldHVybiBzb3VyY2VDb29yZHMuam9pbigpO1xufVxuIl19","/**\n * @license\n * Copyright 2020 Google LLC. All Rights Reserved.\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n * =============================================================================\n */\nimport { buffer, Tile, util } from '@tensorflow/tfjs-core';\nimport { tileImplCPU } from '../kernel_utils/shared';\nimport { TileProgram } from '../tile_gpu';\nexport function tile(params) {\n const { inputs, backend, attrs } = params;\n const { x } = inputs;\n const { reps } = attrs;\n // tile gpu program cannot handle rank > 5 case.\n if (x.dtype === 'string' || x.shape.length > 5) {\n // Even thought string tensor is always on CPU, just to be consistent on how\n // to access tensor data.\n const data = backend.readSync(x.dataId);\n const value = x.dtype === 'string' ?\n data.map(d => util.decodeString(d)) :\n data;\n const buf = buffer(x.shape, x.dtype, value);\n const outBuf = tileImplCPU(buf, reps);\n return backend.makeTensorInfo(outBuf.shape, outBuf.dtype, outBuf.values);\n }\n const program = new TileProgram(x.shape, reps);\n const output = backend.runWebGLProgram(program, [x], x.dtype);\n return output;\n}\nexport const tileConfig = {\n kernelName: Tile,\n backendName: 'webgl',\n kernelFunc: tile,\n};\n//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiVGlsZS5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uLy4uL3RmanMtYmFja2VuZC13ZWJnbC9zcmMva2VybmVscy9UaWxlLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBOzs7Ozs7Ozs7Ozs7Ozs7R0FlRztBQUVILE9BQU8sRUFBQyxNQUFNLEVBQXdDLElBQUksRUFBcUMsSUFBSSxFQUFDLE1BQU0sdUJBQXVCLENBQUM7QUFHbEksT0FBTyxFQUFDLFdBQVcsRUFBQyxNQUFNLHdCQUF3QixDQUFDO0FBQ25ELE9BQU8sRUFBQyxXQUFXLEVBQUMsTUFBTSxhQUFhLENBQUM7QUFFeEMsTUFBTSxVQUFVLElBQUksQ0FDaEIsTUFBeUU7SUFFM0UsTUFBTSxFQUFDLE1BQU0sRUFBRSxPQUFPLEVBQUUsS0FBSyxFQUFDLEdBQUcsTUFBTSxDQUFDO0lBQ3hDLE1BQU0sRUFBQyxDQUFDLEVBQUMsR0FBRyxNQUFNLENBQUM7SUFDbkIsTUFBTSxFQUFDLElBQUksRUFBQyxHQUFHLEtBQUssQ0FBQztJQUVyQixnREFBZ0Q7SUFDaEQsSUFBSSxDQUFDLENBQUMsS0FBSyxLQUFLLFFBQVEsSUFBSSxDQUFDLENBQUMsS0FBSyxDQUFDLE1BQU0sR0FBRyxDQUFDLEVBQUU7UUFDOUMsNEVBQTRFO1FBQzVFLHlCQUF5QjtRQUN6QixNQUFNLElBQUksR0FBRyxPQUFPLENBQUMsUUFBUSxDQUFDLENBQUMsQ0FBQyxNQUFNLENBQUMsQ0FBQztRQUN4QyxNQUFNLEtBQUssR0FBRyxDQUFDLENBQUMsS0FBSyxLQUFLLFFBQVEsQ0FBQyxDQUFDO1lBQy9CLElBQXFCLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsSUFBSSxDQUFDLFlBQVksQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUM7WUFDdkQsSUFBa0IsQ0FBQztRQUN2QixNQUFNLEdBQUcsR0FBRyxNQUFNLENBQUMsQ0FBQyxDQUFDLEtBQUssRUFBRSxDQUFDLENBQUMsS0FBSyxFQUFFLEtBQUssQ0FBQyxDQUFDO1FBQzVDLE1BQU0sTUFBTSxHQUFHLFdBQVcsQ0FBQyxHQUFHLEVBQUUsSUFBSSxDQUFDLENBQUM7UUFDdEMsT0FBTyxPQUFPLENBQUMsY0FBYyxDQUFDLE1BQU0sQ0FBQyxLQUFLLEVBQUUsTUFBTSxDQUFDLEtBQUssRUFBRSxNQUFNLENBQUMsTUFBTSxDQUFDLENBQUM7S0FDMUU7SUFFRCxNQUFNLE9BQU8sR0FBRyxJQUFJLFdBQVcsQ0FBQyxDQUFDLENBQUMsS0FBSyxFQUFFLElBQUksQ0FBQyxDQUFDO0lBQy9DLE1BQU0sTUFBTSxHQUFHLE9BQU8sQ0FBQyxlQUFlLENBQUMsT0FBTyxFQUFFLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLEtBQUssQ0FBQyxDQUFDO0lBRTlELE9BQU8sTUFBTSxDQUFDO0FBQ2hCLENBQUM7QUFFRCxNQUFNLENBQUMsTUFBTSxVQUFVLEdBQWlCO0lBQ3RDLFVBQVUsRUFBRSxJQUFJO0lBQ2hCLFdBQVcsRUFBRSxPQUFPO0lBQ3BCLFVBQVUsRUFBRSxJQUF3QjtDQUNyQyxDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiLyoqXG4gKiBAbGljZW5zZVxuICogQ29weXJpZ2h0IDIwMjAgR29vZ2xlIExMQy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC5cbiAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSBcIkxpY2Vuc2VcIik7XG4gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuXG4gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXRcbiAqXG4gKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjBcbiAqXG4gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlXG4gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiBcIkFTIElTXCIgQkFTSVMsXG4gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC5cbiAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmRcbiAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLlxuICogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbiAqL1xuXG5pbXBvcnQge2J1ZmZlciwgS2VybmVsQ29uZmlnLCBLZXJuZWxGdW5jLCBUZW5zb3JJbmZvLCBUaWxlLCBUaWxlQXR0cnMsIFRpbGVJbnB1dHMsIFR5cGVkQXJyYXksIHV0aWx9IGZyb20gJ0B0ZW5zb3JmbG93L3RmanMtY29yZSc7XG5cbmltcG9ydCB7TWF0aEJhY2tlbmRXZWJHTH0gZnJvbSAnLi4vYmFja2VuZF93ZWJnbCc7XG5pbXBvcnQge3RpbGVJbXBsQ1BVfSBmcm9tICcuLi9rZXJuZWxfdXRpbHMvc2hhcmVkJztcbmltcG9ydCB7VGlsZVByb2dyYW19IGZyb20gJy4uL3RpbGVfZ3B1JztcblxuZXhwb3J0IGZ1bmN0aW9uIHRpbGUoXG4gICAgcGFyYW1zOiB7aW5wdXRzOiBUaWxlSW5wdXRzLCBiYWNrZW5kOiBNYXRoQmFja2VuZFdlYkdMLCBhdHRyczogVGlsZUF0dHJzfSk6XG4gICAgVGVuc29ySW5mbyB7XG4gIGNvbnN0IHtpbnB1dHMsIGJhY2tlbmQsIGF0dHJzfSA9IHBhcmFtcztcbiAgY29uc3Qge3h9ID0gaW5wdXRzO1xuICBjb25zdCB7cmVwc30gPSBhdHRycztcblxuICAvLyB0aWxlIGdwdSBwcm9ncmFtIGNhbm5vdCBoYW5kbGUgcmFuayA+IDUgY2FzZS5cbiAgaWYgKHguZHR5cGUgPT09ICdzdHJpbmcnIHx8IHguc2hhcGUubGVuZ3RoID4gNSkge1xuICAgIC8vIEV2ZW4gdGhvdWdodCBzdHJpbmcgdGVuc29yIGlzIGFsd2F5cyBvbiBDUFUsIGp1c3QgdG8gYmUgY29uc2lzdGVudCBvbiBob3dcbiAgICAvLyB0byBhY2Nlc3MgdGVuc29yIGRhdGEuXG4gICAgY29uc3QgZGF0YSA9IGJhY2tlbmQucmVhZFN5bmMoeC5kYXRhSWQpO1xuICAgIGNvbnN0IHZhbHVlID0geC5kdHlwZSA9PT0gJ3N0cmluZycgP1xuICAgICAgICAoZGF0YSBhcyBVaW50OEFycmF5W10pLm1hcChkID0+IHV0aWwuZGVjb2RlU3RyaW5nKGQpKSA6XG4gICAgICAgIGRhdGEgYXMgVHlwZWRBcnJheTtcbiAgICBjb25zdCBidWYgPSBidWZmZXIoeC5zaGFwZSwgeC5kdHlwZSwgdmFsdWUpO1xuICAgIGNvbnN0IG91dEJ1ZiA9IHRpbGVJbXBsQ1BVKGJ1ZiwgcmVwcyk7XG4gICAgcmV0dXJuIGJhY2tlbmQubWFrZVRlbnNvckluZm8ob3V0QnVmLnNoYXBlLCBvdXRCdWYuZHR5cGUsIG91dEJ1Zi52YWx1ZXMpO1xuICB9XG5cbiAgY29uc3QgcHJvZ3JhbSA9IG5ldyBUaWxlUHJvZ3JhbSh4LnNoYXBlLCByZXBzKTtcbiAgY29uc3Qgb3V0cHV0ID0gYmFja2VuZC5ydW5XZWJHTFByb2dyYW0ocHJvZ3JhbSwgW3hdLCB4LmR0eXBlKTtcblxuICByZXR1cm4gb3V0cHV0O1xufVxuXG5leHBvcnQgY29uc3QgdGlsZUNvbmZpZzogS2VybmVsQ29uZmlnID0ge1xuICBrZXJuZWxOYW1lOiBUaWxlLFxuICBiYWNrZW5kTmFtZTogJ3dlYmdsJyxcbiAga2VybmVsRnVuYzogdGlsZSBhcyB7fSBhcyBLZXJuZWxGdW5jLFxufTtcbiJdfQ==","// Based on Algorithm 2 of Bitonic Top K, ref:\n// https://anilshanbhag.in/static/papers/gputopk_sigmod18.pdf\n// The original algorithm is based on computing the top K only, however\n// since for TFJS we require the indices of the top K values as well then the\n// algorithm found here is a bit modified. Rather than producing the values\n// at each step, the indices containing the top K are generated instead.\n// The output values are not generated to reduce the number of outputs in the\n// GPU, the values can easily be retrieved from the indices using a gather\n// op.\nexport class SwapProgram {\n /**\n * @param shape desired output shape (can be larger than input shape, output\n * will be padded with -Infinity)\n */\n constructor(shape) {\n this.variableNames = ['x', 'indices'];\n // |n| Size of the original input of TopK.\n // |firstPass|indicates if this is the first time swap is being used which\n // means no indices input containing the top K is present yet.\n // |inc| Swaps pairs of indices (0, inc), (1, inc + 1), (2, inc + 2) ...\n this.customUniforms = [\n { name: 'n', type: 'int' },\n { name: 'firstPass', type: 'int' },\n { name: 'negativeInf', type: 'float' },\n { name: 'dir', type: 'int' },\n { name: 'inc', type: 'int' }\n ];\n this.outputShape = shape;\n this.userCode = `\n void main() {\n ivec2 coords = getOutputCoords();\n int batch = coords[0];\n int elemIdx = coords[1];\n\n // We compare elements pair-wise within a group of size 2 * inc.\n // The comparing rule for each group alternates between ascending\n // and descending. Within each group, we compare each pair at\n // positions i and i+inc. To decide whether an element at position i\n // is x0 or x1, we mod it by 2 * inc, if the result is smaller than\n // inc, it is in the first half of the group, we denote it as x0,\n // otherwise we denote it as x1.\n // For example, as shown in the Bitonic top K paper referenced above,\n // Figure5(a) shows that element[1] is in the\n // second half of the group when group size is 2, but it is in the\n // first half of the group when group size is 4.\n\n bool isFirstInPair = imod(elemIdx, 2 * inc) < inc;\n int i = isFirstInPair ? elemIdx : elemIdx - inc;\n\n int i0 = firstPass == 1 ? i : int(getIndices(batch, i));\n int i1 = firstPass == 1 ? i + inc : int(getIndices(batch, i + inc));\n float x0 = i0 < n ? getX(batch, i0) : negativeInf;\n float x1 = i1 < n ? getX(batch, i1) : negativeInf;\n\n // Denotes which direction indices are in (ascending or descending).\n bool reverse = imod(elemIdx, 2 * dir) >= dir;\n bool isGreater = x0 > x1 || (x0 == x1 && i1 > i0);\n if (reverse == isGreater) { // Elements in opposite order of direction\n int iTemp = i0;\n i0 = i1;\n i1 = iTemp;\n }\n if (isFirstInPair) {\n setOutput(float(i0));\n } else {\n setOutput(float(i1));\n }\n }\n `;\n }\n}\nexport class MergeProgram {\n /**\n * @param shape desired output shape (must be half of the input size)\n */\n constructor(shape) {\n this.variableNames = ['x', 'indices'];\n // |n| Size of the original input of TopK\n // |firstPass| indicates if this is the first time swap is being used which\n // means no indices input containing the top K is present yet.\n // |k| Top k elements desired\n this.customUniforms = [\n { name: 'n', type: 'int' },\n { name: 'firstPass', type: 'int' },\n { name: 'k', type: 'int' }\n ];\n this.outputShape = shape;\n this.userCode = `\n void main() {\n // Takes max of indices (0, k), (1, k + 1), (2, k + 2) ...\n ivec2 coords = getOutputCoords();\n int batch = coords[0];\n int elemIdx = coords[1];\n\n // The output size is half of the previous size.\n // If the previous sequence is | | | | _ _ _ _ | | | | _ _ _ _ (k=4),\n // we only need to output the indices at positions |, the indices at\n // positions _ can be thrown away, see Figure5(b) After Phase 2\n // (Merge phase) in the Bitonic Top K paper referenced above.\n // For example, the paper shows we only need to output the orange bars.\n // The output sequence should look like this | | | | | | | |.\n // Because the sequence is halved, to map the output index back\n // to the previous sequence to find the corresponding value,\n // we need to double the index. When we double the index,\n // we basically interpolate a position, so 2i looks like\n // | _ | _ | _ | _ | _ | _ | _. We move the | to the first k position\n // of each 2k positions by - elemIdx % k. E.g. for output at\n // index 4,5,6,7, we want to get the corresponding element at\n // original index 8,9,10,11, for output at index 8,9,10,11,\n // we want to get the corresponding element at original index\n // 16,17,18,19, so on and so forth.\n\n int i = elemIdx < k ? elemIdx : (elemIdx * 2 - imod(elemIdx, k));\n int i0 = firstPass == 1 ? i : int(getIndices(batch, i));\n int i1 = firstPass == 1 ? i + k : int(getIndices(batch, i + k));\n\n float x0 = getX(batch, i0);\n float x1 = i1 < n ? getX(batch, i1) : x0;\n\n setOutput(x0 >= x1 ? float(i0) : float(i1));\n }\n `;\n }\n}\n//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidG9wX2tfZ3B1LmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vdGZqcy1iYWNrZW5kLXdlYmdsL3NyYy90b3Bfa19ncHUudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBbUJBLDhDQUE4QztBQUM5Qyw2REFBNkQ7QUFDN0QsdUVBQXVFO0FBQ3ZFLDZFQUE2RTtBQUM3RSwyRUFBMkU7QUFDM0Usd0VBQXdFO0FBQ3hFLDZFQUE2RTtBQUM3RSwwRUFBMEU7QUFDMUUsTUFBTTtBQUNOLE1BQU0sT0FBTyxXQUFXO0lBZ0J0Qjs7O09BR0c7SUFDSCxZQUFZLEtBQWU7UUFuQjNCLGtCQUFhLEdBQUcsQ0FBQyxHQUFHLEVBQUUsU0FBUyxDQUFDLENBQUM7UUFHakMsMENBQTBDO1FBQzFDLDBFQUEwRTtRQUMxRSw4REFBOEQ7UUFDOUQsd0VBQXdFO1FBQ3hFLG1CQUFjLEdBQUc7WUFDZixFQUFDLElBQUksRUFBRSxHQUFHLEVBQUUsSUFBSSxFQUFFLEtBQW9CLEVBQUM7WUFDdkMsRUFBQyxJQUFJLEVBQUUsV0FBVyxFQUFFLElBQUksRUFBRSxLQUFvQixFQUFDO1lBQy9DLEVBQUMsSUFBSSxFQUFFLGFBQWEsRUFBRSxJQUFJLEVBQUUsT0FBc0IsRUFBQztZQUNuRCxFQUFDLElBQUksRUFBRSxLQUFLLEVBQUUsSUFBSSxFQUFFLEtBQW9CLEVBQUM7WUFDekMsRUFBQyxJQUFJLEVBQUUsS0FBSyxFQUFFLElBQUksRUFBRSxLQUFvQixFQUFDO1NBQzFDLENBQUM7UUFPQSxJQUFJLENBQUMsV0FBVyxHQUFHLEtBQUssQ0FBQztRQUV6QixJQUFJLENBQUMsUUFBUSxHQUFHOzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7O01Bd0NkLENBQUM7SUFDTCxDQUFDO0NBQ0Y7QUFFRCxNQUFNLE9BQU8sWUFBWTtJQWN2Qjs7T0FFRztJQUNILFlBQVksS0FBZTtRQWhCM0Isa0JBQWEsR0FBRyxDQUFDLEdBQUcsRUFBRSxTQUFTLENBQUMsQ0FBQztRQUdqQyx5Q0FBeUM7UUFDekMsMkVBQTJFO1FBQzNFLDhEQUE4RDtRQUM5RCw2QkFBNkI7UUFDN0IsbUJBQWMsR0FBRztZQUNmLEVBQUMsSUFBSSxFQUFFLEdBQUcsRUFBRSxJQUFJLEVBQUUsS0FBb0IsRUFBQztZQUN2QyxFQUFDLElBQUksRUFBRSxXQUFXLEVBQUUsSUFBSSxFQUFFLEtBQW9CLEVBQUM7WUFDL0MsRUFBQyxJQUFJLEVBQUUsR0FBRyxFQUFFLElBQUksRUFBRSxLQUFvQixFQUFDO1NBQ3hDLENBQUM7UUFNQSxJQUFJLENBQUMsV0FBVyxHQUFHLEtBQUssQ0FBQztRQUV6QixJQUFJLENBQUMsUUFBUSxHQUFHOzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7O01Ba0NkLENBQUM7SUFDTCxDQUFDO0NBQ0YiLCJzb3VyY2VzQ29udGVudCI6WyIvKipcbiAqIEBsaWNlbnNlXG4gKiBDb3B5cmlnaHQgMjAyMSBHb29nbGUgTExDLiBBbGwgUmlnaHRzIFJlc2VydmVkLlxuICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlIFwiTGljZW5zZVwiKTtcbiAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS5cbiAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdFxuICpcbiAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMFxuICpcbiAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmVcbiAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuIFwiQVMgSVNcIiBCQVNJUyxcbiAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLlxuICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZFxuICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuXG4gKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuICovXG5pbXBvcnQge0dQR1BVUHJvZ3JhbX0gZnJvbSAnLi9ncGdwdV9tYXRoJztcbmltcG9ydCB7VW5pZm9ybVR5cGV9IGZyb20gJy4vc2hhZGVyX2NvbXBpbGVyJztcblxuLy8gQmFzZWQgb24gQWxnb3JpdGhtIDIgb2YgQml0b25pYyBUb3AgSywgcmVmOlxuLy8gaHR0cHM6Ly9hbmlsc2hhbmJoYWcuaW4vc3RhdGljL3BhcGVycy9ncHV0b3BrX3NpZ21vZDE4LnBkZlxuLy8gVGhlIG9yaWdpbmFsIGFsZ29yaXRobSBpcyBiYXNlZCBvbiBjb21wdXRpbmcgdGhlIHRvcCBLIG9ubHksIGhvd2V2ZXJcbi8vIHNpbmNlIGZvciBURkpTIHdlIHJlcXVpcmUgdGhlIGluZGljZXMgb2YgdGhlIHRvcCBLIHZhbHVlcyBhcyB3ZWxsIHRoZW4gdGhlXG4vLyBhbGdvcml0aG0gZm91bmQgaGVyZSBpcyBhIGJpdCBtb2RpZmllZC4gUmF0aGVyIHRoYW4gcHJvZHVjaW5nIHRoZSB2YWx1ZXNcbi8vIGF0IGVhY2ggc3RlcCwgdGhlIGluZGljZXMgY29udGFpbmluZyB0aGUgdG9wIEsgYXJlIGdlbmVyYXRlZCBpbnN0ZWFkLlxuLy8gVGhlIG91dHB1dCB2YWx1ZXMgYXJlIG5vdCBnZW5lcmF0ZWQgdG8gcmVkdWNlIHRoZSBudW1iZXIgb2Ygb3V0cHV0cyBpbiB0aGVcbi8vIEdQVSwgdGhlIHZhbHVlcyBjYW4gZWFzaWx5IGJlIHJldHJpZXZlZCBmcm9tIHRoZSBpbmRpY2VzIHVzaW5nIGEgZ2F0aGVyXG4vLyBvcC5cbmV4cG9ydCBjbGFzcyBTd2FwUHJvZ3JhbSBpbXBsZW1lbnRzIEdQR1BVUHJvZ3JhbSB7XG4gIHZhcmlhYmxlTmFtZXMgPSBbJ3gnLCAnaW5kaWNlcyddO1xuICBvdXRwdXRTaGFwZTogbnVtYmVyW107XG4gIHVzZXJDb2RlOiBzdHJpbmc7XG4gIC8vIHxufCBTaXplIG9mIHRoZSBvcmlnaW5hbCBpbnB1dCBvZiBUb3BLLlxuICAvLyB8Zmlyc3RQYXNzfGluZGljYXRlcyBpZiB0aGlzIGlzIHRoZSBmaXJzdCB0aW1lIHN3YXAgaXMgYmVpbmcgdXNlZCB3aGljaFxuICAvLyBtZWFucyBubyBpbmRpY2VzIGlucHV0IGNvbnRhaW5pbmcgdGhlIHRvcCBLIGlzIHByZXNlbnQgeWV0LlxuICAvLyB8aW5jfCBTd2FwcyBwYWlycyBvZiBpbmRpY2VzICgwLCBpbmMpLCAoMSwgaW5jICsgMSksICgyLCBpbmMgKyAyKSAuLi5cbiAgY3VzdG9tVW5pZm9ybXMgPSBbXG4gICAge25hbWU6ICduJywgdHlwZTogJ2ludCcgYXMgVW5pZm9ybVR5cGV9LFxuICAgIHtuYW1lOiAnZmlyc3RQYXNzJywgdHlwZTogJ2ludCcgYXMgVW5pZm9ybVR5cGV9LFxuICAgIHtuYW1lOiAnbmVnYXRpdmVJbmYnLCB0eXBlOiAnZmxvYXQnIGFzIFVuaWZvcm1UeXBlfSxcbiAgICB7bmFtZTogJ2RpcicsIHR5cGU6ICdpbnQnIGFzIFVuaWZvcm1UeXBlfSxcbiAgICB7bmFtZTogJ2luYycsIHR5cGU6ICdpbnQnIGFzIFVuaWZvcm1UeXBlfVxuICBdO1xuXG4gIC8qKlxuICAgKiBAcGFyYW0gc2hhcGUgZGVzaXJlZCBvdXRwdXQgc2hhcGUgKGNhbiBiZSBsYXJnZXIgdGhhbiBpbnB1dCBzaGFwZSwgb3V0cHV0XG4gICAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgd2lsbCBiZSBwYWRkZWQgd2l0aCAtSW5maW5pdHkpXG4gICAqL1xuICBjb25zdHJ1Y3RvcihzaGFwZTogbnVtYmVyW10pIHtcbiAgICB0aGlzLm91dHB1dFNoYXBlID0gc2hhcGU7XG5cbiAgICB0aGlzLnVzZXJDb2RlID0gYFxuICAgICAgIHZvaWQgbWFpbigpIHtcbiAgICAgICAgIGl2ZWMyIGNvb3JkcyA9IGdldE91dHB1dENvb3JkcygpO1xuICAgICAgICAgaW50IGJhdGNoID0gY29vcmRzWzBdO1xuICAgICAgICAgaW50IGVsZW1JZHggPSBjb29yZHNbMV07XG5cbiAgICAgICAgIC8vIFdlIGNvbXBhcmUgZWxlbWVudHMgcGFpci13aXNlIHdpdGhpbiBhIGdyb3VwIG9mIHNpemUgMiAqIGluYy5cbiAgICAgICAgIC8vIFRoZSBjb21wYXJpbmcgcnVsZSBmb3IgZWFjaCBncm91cCBhbHRlcm5hdGVzIGJldHdlZW4gYXNjZW5kaW5nXG4gICAgICAgICAvLyBhbmQgZGVzY2VuZGluZy4gV2l0aGluIGVhY2ggZ3JvdXAsIHdlIGNvbXBhcmUgZWFjaCBwYWlyIGF0XG4gICAgICAgICAvLyBwb3NpdGlvbnMgaSBhbmQgaStpbmMuIFRvIGRlY2lkZSB3aGV0aGVyIGFuIGVsZW1lbnQgYXQgcG9zaXRpb24gaVxuICAgICAgICAgLy8gaXMgeDAgb3IgeDEsIHdlIG1vZCBpdCBieSAyICogaW5jLCBpZiB0aGUgcmVzdWx0IGlzIHNtYWxsZXIgdGhhblxuICAgICAgICAgLy8gaW5jLCBpdCBpcyBpbiB0aGUgZmlyc3QgaGFsZiBvZiB0aGUgZ3JvdXAsIHdlIGRlbm90ZSBpdCBhcyB4MCxcbiAgICAgICAgIC8vIG90aGVyd2lzZSB3ZSBkZW5vdGUgaXQgYXMgeDEuXG4gICAgICAgICAvLyBGb3IgZXhhbXBsZSwgYXMgc2hvd24gaW4gdGhlIEJpdG9uaWMgdG9wIEsgcGFwZXIgcmVmZXJlbmNlZCBhYm92ZSxcbiAgICAgICAgIC8vIEZpZ3VyZTUoYSkgc2hvd3MgdGhhdCBlbGVtZW50WzFdIGlzIGluIHRoZVxuICAgICAgICAgLy8gc2Vjb25kIGhhbGYgb2YgdGhlIGdyb3VwIHdoZW4gZ3JvdXAgc2l6ZSBpcyAyLCBidXQgaXQgaXMgaW4gdGhlXG4gICAgICAgICAvLyBmaXJzdCBoYWxmIG9mIHRoZSBncm91cCB3aGVuIGdyb3VwIHNpemUgaXMgNC5cblxuICAgICAgICAgYm9vbCBpc0ZpcnN0SW5QYWlyID0gaW1vZChlbGVtSWR4LCAyICogaW5jKSA8IGluYztcbiAgICAgICAgIGludCBpID0gaXNGaXJzdEluUGFpciA/IGVsZW1JZHggOiBlbGVtSWR4IC0gaW5jO1xuXG4gICAgICAgICBpbnQgaTAgPSBmaXJzdFBhc3MgPT0gMSA/IGkgOiBpbnQoZ2V0SW5kaWNlcyhiYXRjaCwgaSkpO1xuICAgICAgICAgaW50IGkxID0gZmlyc3RQYXNzID09IDEgPyBpICsgaW5jIDogaW50KGdldEluZGljZXMoYmF0Y2gsIGkgKyBpbmMpKTtcbiAgICAgICAgIGZsb2F0IHgwID0gaTAgPCBuID8gZ2V0WChiYXRjaCwgaTApIDogbmVnYXRpdmVJbmY7XG4gICAgICAgICBmbG9hdCB4MSA9IGkxIDwgbiA/IGdldFgoYmF0Y2gsIGkxKSA6IG5lZ2F0aXZlSW5mO1xuXG4gICAgICAgICAvLyBEZW5vdGVzIHdoaWNoIGRpcmVjdGlvbiBpbmRpY2VzIGFyZSBpbiAoYXNjZW5kaW5nIG9yIGRlc2NlbmRpbmcpLlxuICAgICAgICAgYm9vbCByZXZlcnNlID0gaW1vZChlbGVtSWR4LCAyICogZGlyKSA+PSBkaXI7XG4gICAgICAgICBib29sIGlzR3JlYXRlciA9IHgwID4geDEgfHwgKHgwID09IHgxICYmIGkxID4gaTApO1xuICAgICAgICAgaWYgKHJldmVyc2UgPT0gaXNHcmVhdGVyKSB7IC8vIEVsZW1lbnRzIGluIG9wcG9zaXRlIG9yZGVyIG9mIGRpcmVjdGlvblxuICAgICAgICAgICBpbnQgaVRlbXAgPSBpMDtcbiAgICAgICAgICAgaTAgPSBpMTtcbiAgICAgICAgICAgaTEgPSBpVGVtcDtcbiAgICAgICAgIH1cbiAgICAgICAgIGlmIChpc0ZpcnN0SW5QYWlyKSB7XG4gICAgICAgICAgICBzZXRPdXRwdXQoZmxvYXQoaTApKTtcbiAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICBzZXRPdXRwdXQoZmxvYXQoaTEpKTtcbiAgICAgICAgIH1cbiAgICAgICB9XG4gICAgIGA7XG4gIH1cbn1cblxuZXhwb3J0IGNsYXNzIE1lcmdlUHJvZ3JhbSBpbXBsZW1lbnRzIEdQR1BVUHJvZ3JhbSB7XG4gIHZhcmlhYmxlTmFtZXMgPSBbJ3gnLCAnaW5kaWNlcyddO1xuICBvdXRwdXRTaGFwZTogbnVtYmVyW107XG4gIHVzZXJDb2RlOiBzdHJpbmc7XG4gIC8vIHxufCBTaXplIG9mIHRoZSBvcmlnaW5hbCBpbnB1dCBvZiBUb3BLXG4gIC8vIHxmaXJzdFBhc3N8IGluZGljYXRlcyBpZiB0aGlzIGlzIHRoZSBmaXJzdCB0aW1lIHN3YXAgaXMgYmVpbmcgdXNlZCB3aGljaFxuICAvLyBtZWFucyBubyBpbmRpY2VzIGlucHV0IGNvbnRhaW5pbmcgdGhlIHRvcCBLIGlzIHByZXNlbnQgeWV0LlxuICAvLyB8a3wgVG9wIGsgZWxlbWVudHMgZGVzaXJlZFxuICBjdXN0b21Vbmlmb3JtcyA9IFtcbiAgICB7bmFtZTogJ24nLCB0eXBlOiAnaW50JyBhcyBVbmlmb3JtVHlwZX0sXG4gICAge25hbWU6ICdmaXJzdFBhc3MnLCB0eXBlOiAnaW50JyBhcyBVbmlmb3JtVHlwZX0sXG4gICAge25hbWU6ICdrJywgdHlwZTogJ2ludCcgYXMgVW5pZm9ybVR5cGV9XG4gIF07XG5cbiAgLyoqXG4gICAqIEBwYXJhbSBzaGFwZSBkZXNpcmVkIG91dHB1dCBzaGFwZSAobXVzdCBiZSBoYWxmIG9mIHRoZSBpbnB1dCBzaXplKVxuICAgKi9cbiAgY29uc3RydWN0b3Ioc2hhcGU6IG51bWJlcltdKSB7XG4gICAgdGhpcy5vdXRwdXRTaGFwZSA9IHNoYXBlO1xuXG4gICAgdGhpcy51c2VyQ29kZSA9IGBcbiAgICB2b2lkIG1haW4oKSB7XG4gICAgICAgICAvLyBUYWtlcyBtYXggb2YgaW5kaWNlcyAoMCwgayksICgxLCBrICsgMSksICgyLCBrICsgMikgLi4uXG4gICAgICAgICBpdmVjMiBjb29yZHMgPSBnZXRPdXRwdXRDb29yZHMoKTtcbiAgICAgICAgIGludCBiYXRjaCA9IGNvb3Jkc1swXTtcbiAgICAgICAgIGludCBlbGVtSWR4ID0gY29vcmRzWzFdO1xuXG4gICAgICAgICAvLyBUaGUgb3V0cHV0IHNpemUgaXMgaGFsZiBvZiB0aGUgcHJldmlvdXMgc2l6ZS5cbiAgICAgICAgIC8vIElmIHRoZSBwcmV2aW91cyBzZXF1ZW5jZSBpcyB8IHwgfCB8IF8gXyBfIF8gIHwgfCB8IHwgIF8gXyBfIF8gKGs9NCksXG4gICAgICAgICAvLyB3ZSBvbmx5IG5lZWQgdG8gb3V0cHV0IHRoZSBpbmRpY2VzIGF0IHBvc2l0aW9ucyB8LCB0aGUgaW5kaWNlcyBhdFxuICAgICAgICAgLy8gcG9zaXRpb25zIF8gY2FuIGJlIHRocm93biBhd2F5LCBzZWUgRmlndXJlNShiKSBBZnRlciBQaGFzZSAyXG4gICAgICAgICAvLyAoTWVyZ2UgcGhhc2UpIGluIHRoZSBCaXRvbmljIFRvcCBLIHBhcGVyIHJlZmVyZW5jZWQgYWJvdmUuXG4gICAgICAgICAvLyBGb3IgZXhhbXBsZSwgdGhlIHBhcGVyIHNob3dzIHdlIG9ubHkgbmVlZCB0byBvdXRwdXQgdGhlIG9yYW5nZSBiYXJzLlxuICAgICAgICAgLy8gVGhlIG91dHB1dCBzZXF1ZW5jZSBzaG91bGQgbG9vayBsaWtlIHRoaXMgfCB8IHwgfCB8IHwgfCB8LlxuICAgICAgICAgLy8gQmVjYXVzZSB0aGUgc2VxdWVuY2UgaXMgaGFsdmVkLCB0byBtYXAgdGhlIG91dHB1dCBpbmRleCBiYWNrXG4gICAgICAgICAvLyB0byB0aGUgcHJldmlvdXMgc2VxdWVuY2UgdG8gZmluZCB0aGUgY29ycmVzcG9uZGluZyB2YWx1ZSxcbiAgICAgICAgIC8vIHdlIG5lZWQgdG8gZG91YmxlIHRoZSBpbmRleC4gV2hlbiB3ZSBkb3VibGUgdGhlIGluZGV4LFxuICAgICAgICAgLy8gd2UgYmFzaWNhbGx5IGludGVycG9sYXRlIGEgcG9zaXRpb24sIHNvIDJpIGxvb2tzIGxpa2VcbiAgICAgICAgIC8vIHwgXyB8IF8gfCBfIHwgXyB8IF8gfCBfIHwgXy4gV2UgbW92ZSB0aGUgfCB0byB0aGUgZmlyc3QgayBwb3NpdGlvblxuICAgICAgICAgLy8gb2YgZWFjaCAyayBwb3NpdGlvbnMgYnkgLSBlbGVtSWR4ICUgay4gRS5nLiBmb3Igb3V0cHV0IGF0XG4gICAgICAgICAvLyBpbmRleCA0LDUsNiw3LCB3ZSB3YW50IHRvIGdldCB0aGUgY29ycmVzcG9uZGluZyBlbGVtZW50IGF0XG4gICAgICAgICAvLyBvcmlnaW5hbCBpbmRleCA4LDksMTAsMTEsIGZvciBvdXRwdXQgYXQgaW5kZXggOCw5LDEwLDExLFxuICAgICAgICAgLy8gd2Ugd2FudCB0byBnZXQgdGhlIGNvcnJlc3BvbmRpbmcgZWxlbWVudCBhdCBvcmlnaW5hbCBpbmRleFxuICAgICAgICAgLy8gMTYsMTcsMTgsMTksIHNvIG9uIGFuZCBzbyBmb3J0aC5cblxuICAgICAgICAgaW50IGkgPSBlbGVtSWR4IDwgayA/IGVsZW1JZHggOiAoZWxlbUlkeCAqIDIgLSBpbW9kKGVsZW1JZHgsIGspKTtcbiAgICAgICAgIGludCBpMCA9IGZpcnN0UGFzcyA9PSAxID8gaSA6IGludChnZXRJbmRpY2VzKGJhdGNoLCBpKSk7XG4gICAgICAgICBpbnQgaTEgPSBmaXJzdFBhc3MgPT0gMSA/IGkgKyBrIDogaW50KGdldEluZGljZXMoYmF0Y2gsIGkgKyBrKSk7XG5cbiAgICAgICAgIGZsb2F0IHgwID0gZ2V0WChiYXRjaCwgaTApO1xuICAgICAgICAgZmxvYXQgeDEgPSBpMSA8IG4gPyBnZXRYKGJhdGNoLCBpMSkgOiB4MDtcblxuICAgICAgICAgc2V0T3V0cHV0KHgwID49IHgxID8gZmxvYXQoaTApIDogZmxvYXQoaTEpKTtcbiAgICAgICB9XG4gICAgIGA7XG4gIH1cbn1cbiJdfQ==","/**\n * @license\n * Copyright 2020 Google LLC. All Rights Reserved.\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n * =============================================================================\n */\nimport { env, TopK, util } from '@tensorflow/tfjs-core';\nimport { topKImplCPU } from '../kernel_utils/shared';\nimport { MergeProgram, SwapProgram } from '../top_k_gpu';\nimport { fill } from './Fill';\nimport { gatherV2 } from './GatherV2';\nimport { reshape } from './Reshape';\nimport { slice } from './Slice';\nfunction disposeIntermediateTensorInfoOrNull(backend, tensorInfo) {\n if (tensorInfo !== null) {\n backend.disposeIntermediateTensorInfo(tensorInfo);\n }\n}\nfunction roundUpToPow2(num) {\n let pow2 = 1;\n while (pow2 < num) {\n pow2 *= 2;\n }\n return pow2;\n}\n// Based on Algorithm 2 of Bitonic Top K, ref:\n// https://anilshanbhag.in/static/papers/gputopk_sigmod18.pdf\nexport function topK(args) {\n const { inputs, backend, attrs } = args;\n const { x } = inputs;\n const { k, sorted } = attrs;\n // Empirically determined constant used to determine last dim threshold for\n // handing off execution to the CPU.\n const TOPK_LAST_DIM_CPU_HANDOFF_SIZE_THRESHOLD = env().getNumber('TOPK_LAST_DIM_CPU_HANDOFF_SIZE_THRESHOLD');\n // Empirically determined constant used to determine k threshold for handing\n // off execution to the CPU.\n const TOPK_K_CPU_HANDOFF_THRESHOLD = env().getNumber('TOPK_K_CPU_HANDOFF_THRESHOLD');\n const xShape = x.shape;\n const lastDim = xShape[xShape.length - 1];\n if (backend.shouldExecuteOnCPU([x]) ||\n lastDim < TOPK_LAST_DIM_CPU_HANDOFF_SIZE_THRESHOLD ||\n k > TOPK_K_CPU_HANDOFF_THRESHOLD) {\n const xVals = backend.readSync(x.dataId);\n const [allTopKVals, allTopKIndices] = topKImplCPU(xVals, xShape, x.dtype, k, sorted);\n return [\n backend.makeTensorInfo(allTopKVals.shape, allTopKVals.dtype, allTopKVals.values),\n backend.makeTensorInfo(allTopKIndices.shape, allTopKIndices.dtype, allTopKIndices.values)\n ];\n }\n if (k === 0) {\n xShape[xShape.length - 1] = 0;\n return [\n backend.makeTensorInfo(xShape, x.dtype, []),\n backend.makeTensorInfo(xShape, 'int32', [])\n ];\n }\n if (lastDim === 1 /* firstPass */) {\n return [\n x, fill({ attrs: { shape: xShape, dtype: 'int32', value: 0 }, backend })\n ];\n }\n // Eagerly unpack x input since it is passed in to all the shaders which\n // require unpacked inputs.\n const xtexData = backend.texData.get(x.dataId);\n const xIsPacked = xtexData !== null && xtexData.isPacked;\n const xUnPacked = xIsPacked ? backend.unpackTensor(x) : x;\n // Reshape into a 2d tensor [batch, lastDim] and compute topk along lastDim.\n const xSize = util.sizeFromShape(xShape);\n const batch = xSize / lastDim;\n const x2D = reshape({ inputs: { x: xUnPacked }, attrs: { shape: [batch, lastDim] }, backend });\n if (xIsPacked) {\n disposeIntermediateTensorInfoOrNull(backend, xUnPacked);\n }\n const kPow2 = roundUpToPow2(k);\n const lastDimPow2 = roundUpToPow2(lastDim);\n // Only the indices containing the top K are kept at every step to reduce\n // number of outputs in the GPU algorithms, so once the final set of indices\n // is computed then gather is used to grab the corresponding values\n // from the original input.\n let indices = null;\n // GPU algorithm always takes in an indices input but this input is not used\n // on the first run of a GPU algorithm, therefore if indices is null we simply\n // pass in x2D instead of it but the value will not actually be used\n const getInputs = () => indices === null ? [x2D, x2D] : [x2D, indices];\n const runSwap = (dir, inc, shape) => {\n const inputs = getInputs();\n const program = new SwapProgram(shape);\n const fistPass = indices === null ? 1 : 0;\n const customValues = [[lastDim], [fistPass], [Number.NEGATIVE_INFINITY], [dir], [inc]];\n const prevIndices = indices;\n indices = backend.runWebGLProgram(program, inputs, 'int32', customValues);\n disposeIntermediateTensorInfoOrNull(backend, prevIndices);\n };\n // Step 1: local sort\n for (let len = 1; len < kPow2; len *= 2) {\n const dir = len * 2;\n for (let inc = len; inc >= 1; inc /= 2) {\n runSwap(dir, inc, [batch, lastDimPow2]);\n }\n }\n // Step 2: merge\n for (let indicesSize = lastDimPow2; indicesSize > kPow2; indicesSize /= 2) {\n const inputs = getInputs();\n const mergeProgram = new MergeProgram([batch, indicesSize / 2]);\n const firstPass = indices === null ? 1 : 0;\n const customValues = [[lastDim], [firstPass], [kPow2]];\n const prevIndices = indices;\n indices =\n backend.runWebGLProgram(mergeProgram, inputs, 'int32', customValues);\n disposeIntermediateTensorInfoOrNull(backend, prevIndices);\n // Step 3: rebuild\n const len = kPow2 / 2;\n const dir = len * 2;\n for (let inc = len; inc >= 1; inc /= 2) {\n runSwap(dir, inc, indices.shape);\n }\n }\n // Keep only the requested top K results instead of kPow2\n let prevIndices = indices;\n indices = slice({ inputs: { x: indices }, backend, attrs: { begin: 0, size: [batch, k] } });\n disposeIntermediateTensorInfoOrNull(backend, prevIndices);\n // Gather values on last dimension\n let values = gatherV2({ inputs: { x: x2D, indices }, backend, attrs: { axis: 1, batchDims: 1 } });\n disposeIntermediateTensorInfoOrNull(backend, x2D);\n // Reshape back to the original input shape, except that the last\n // dimension is k.\n const newShape = xShape.slice(0, -1);\n newShape.push(k);\n prevIndices = indices;\n indices = reshape({ inputs: { x: indices }, attrs: { shape: newShape }, backend });\n disposeIntermediateTensorInfoOrNull(backend, prevIndices);\n const prevValues = values;\n values = reshape({ inputs: { x: values }, attrs: { shape: newShape }, backend });\n disposeIntermediateTensorInfoOrNull(backend, prevValues);\n return [values, indices];\n}\nexport const topKConfig = {\n kernelName: TopK,\n backendName: 'webgl',\n kernelFunc: topK\n};\n//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiVG9wSy5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uLy4uL3RmanMtYmFja2VuZC13ZWJnbC9zcmMva2VybmVscy9Ub3BLLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBOzs7Ozs7Ozs7Ozs7Ozs7R0FlRztBQUVILE9BQU8sRUFBQyxHQUFHLEVBQXlELElBQUksRUFBcUMsSUFBSSxFQUFDLE1BQU0sdUJBQXVCLENBQUM7QUFHaEosT0FBTyxFQUFDLFdBQVcsRUFBQyxNQUFNLHdCQUF3QixDQUFDO0FBQ25ELE9BQU8sRUFBQyxZQUFZLEVBQUUsV0FBVyxFQUFDLE1BQU0sY0FBYyxDQUFDO0FBQ3ZELE9BQU8sRUFBQyxJQUFJLEVBQUMsTUFBTSxRQUFRLENBQUM7QUFDNUIsT0FBTyxFQUFDLFFBQVEsRUFBQyxNQUFNLFlBQVksQ0FBQztBQUNwQyxPQUFPLEVBQUMsT0FBTyxFQUFDLE1BQU0sV0FBVyxDQUFDO0FBQ2xDLE9BQU8sRUFBQyxLQUFLLEVBQUMsTUFBTSxTQUFTLENBQUM7QUFFOUIsU0FBUyxtQ0FBbUMsQ0FDeEMsT0FBeUIsRUFBRSxVQUFzQjtJQUNuRCxJQUFJLFVBQVUsS0FBSyxJQUFJLEVBQUU7UUFDdkIsT0FBTyxDQUFDLDZCQUE2QixDQUFDLFVBQVUsQ0FBQyxDQUFDO0tBQ25EO0FBQ0gsQ0FBQztBQUVELFNBQVMsYUFBYSxDQUFDLEdBQVc7SUFDaEMsSUFBSSxJQUFJLEdBQUcsQ0FBQyxDQUFDO0lBQ2IsT0FBTyxJQUFJLEdBQUcsR0FBRyxFQUFFO1FBQ2pCLElBQUksSUFBSSxDQUFDLENBQUM7S0FDWDtJQUNELE9BQU8sSUFBSSxDQUFDO0FBQ2QsQ0FBQztBQUVELDhDQUE4QztBQUM5Qyw2REFBNkQ7QUFDN0QsTUFBTSxVQUFVLElBQUksQ0FDaEIsSUFBdUU7SUFFekUsTUFBTSxFQUFDLE1BQU0sRUFBRSxPQUFPLEVBQUUsS0FBSyxFQUFDLEdBQUcsSUFBSSxDQUFDO0lBQ3RDLE1BQU0sRUFBQyxD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LEVBQUMsTUFBTSxFQUFFLEVBQUMsQ0FBQyxFQUFFLE9BQU8sRUFBQyxFQUFFLEtBQUssRUFBRSxFQUFDLEtBQUssRUFBRSxRQUFRLEVBQUMsRUFBRSxPQUFPLEVBQUMsQ0FBQyxDQUFDO0lBQzdFLG1DQUFtQyxDQUFDLE9BQU8sRUFBRSxXQUFXLENBQUMsQ0FBQztJQUUxRCxNQUFNLFVBQVUsR0FBRyxNQUFNLENBQUM7SUFDMUIsTUFBTSxHQUFHLE9BQU8sQ0FBQyxFQUFDLE1BQU0sRUFBRSxFQUFDLENBQUMsRUFBRSxNQUFNLEVBQUMsRUFBRSxLQUFLLEVBQUUsRUFBQyxLQUFLLEVBQUUsUUFBUSxFQUFDLEVBQUUsT0FBTyxFQUFDLENBQUMsQ0FBQztJQUMzRSxtQ0FBbUMsQ0FBQyxPQUFPLEVBQUUsVUFBVSxDQUFDLENBQUM7SUFFekQsT0FBTyxDQUFDLE1BQU0sRUFBRSxPQUFPLENBQUMsQ0FBQztBQUMzQixDQUFDO0FBRUQsTUFBTSxDQUFDLE1BQU0sVUFBVSxHQUFpQjtJQUN0QyxVQUFVLEVBQUUsSUFBSTtJQUNoQixXQUFXLEVBQUUsT0FBTztJQUNwQixVQUFVLEVBQUUsSUFBd0I7Q0FDckMsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbIi8qKlxuICogQGxpY2Vuc2VcbiAqIENvcHlyaWdodCAyMDIwIEdvb2dsZSBMTEMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuXG4gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgXCJMaWNlbnNlXCIpO1xuICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLlxuICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0XG4gKlxuICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wXG4gKlxuICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZVxuICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gXCJBUyBJU1wiIEJBU0lTLFxuICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuXG4gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kXG4gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS5cbiAqID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4gKi9cblxuaW1wb3J0IHtlbnYsIEtlcm5lbENvbmZpZywgS2VybmVsRnVuYywgTnVtZXJpY0RhdGFUeXBlLCBUZW5zb3JJbmZvLCBUb3BLLCBUb3BLQXR0cnMsIFRvcEtJbnB1dHMsIFR5cGVkQXJyYXksIHV0aWx9IGZyb20gJ0B0ZW5zb3JmbG93L3RmanMtY29yZSc7XG5cbmltcG9ydCB7TWF0aEJhY2tlbmRXZWJHTH0gZnJvbSAnLi4vYmFja2VuZF93ZWJnbCc7XG5pbXBvcnQge3RvcEtJbXBsQ1BVfSBmcm9tICcuLi9rZXJuZWxfdXRpbHMvc2hhcmVkJztcbmltcG9ydCB7TWVyZ2VQcm9ncmFtLCBTd2FwUHJvZ3JhbX0gZnJvbSAnLi4vdG9wX2tfZ3B1JztcbmltcG9ydCB7ZmlsbH0gZnJvbSAnLi9GaWxsJztcbmltcG9ydCB7Z2F0aGVyVjJ9IGZyb20gJy4vR2F0aGVyVjInO1xuaW1wb3J0IHtyZXNoYXBlfSBmcm9tICcuL1Jlc2hhcGUnO1xuaW1wb3J0IHtzbGljZX0gZnJvbSAnLi9TbGljZSc7XG5cbmZ1bmN0aW9uIGRpc3Bvc2VJbnRlcm1lZGlhdGVUZW5zb3JJbmZvT3JOdWxsKFxuICAgIGJhY2tlbmQ6IE1hdGhCYWNrZW5kV2ViR0wsIHRlbnNvckluZm86IFRlbnNvckluZm8pIHtcbiAgaWYgKHRlbnNvckluZm8gIT09IG51bGwpIHtcbiAgICBiYWNrZW5kLmRpc3Bvc2VJbnRlcm1lZGlhdGVUZW5zb3JJbmZvKHRlbnNvckluZm8pO1xuICB9XG59XG5cbmZ1bmN0aW9uIHJvdW5kVXBUb1BvdzIobnVtOiBudW1iZXIpIHtcbiAgbGV0IHBvdzIgPSAxO1xuICB3aGlsZSAocG93MiA8IG51bSkge1xuICAgIHBvdzIgKj0gMjtcbiAgfVxuICByZXR1cm4gcG93Mjtcbn1cblxuLy8gQmFzZWQgb24gQWxnb3JpdGhtIDIgb2YgQml0b25pYyBUb3AgSywgcmVmOlxuLy8gaHR0cHM6Ly9hbmlsc2hhbmJoYWcuaW4vc3RhdGljL3BhcGVycy9ncHV0b3BrX3NpZ21vZDE4LnBkZlxuZXhwb3J0IGZ1bmN0aW9uIHRvcEsoXG4gICAgYXJnczoge2lucHV0czogVG9wS0lucHV0cywgYmFja2VuZDogTWF0aEJhY2tlbmRXZWJHTCwgYXR0cnM6IFRvcEtBdHRyc30pOlxuICAgIFRlbnNvckluZm9bXSB7XG4gIGNvbnN0IHtpbnB1dHMsIGJhY2tlbmQsIGF0dHJzfSA9IGFyZ3M7XG4gIGNvbnN0IHt4fSA9IGlucHV0cztcbiAgY29uc3Qge2ssIHNvcnRlZH0gPSBhdHRycztcblxuICAvLyBFbXBpcmljYWxseSBkZXRlcm1pbmVkIGNvbnN0YW50IHVzZWQgdG8gZGV0ZXJtaW5lIGxhc3QgZGltIHRocmVzaG9sZCBmb3JcbiAgLy8gaGFuZGluZyBvZmYgZXhlY3V0aW9uIHRvIHRoZSBDUFUuXG4gIGNvbnN0IFRPUEtfTEFTVF9ESU1fQ1BVX0hBTkRPRkZfU0laRV9USFJFU0hPTEQgPVxuICAgICAgZW52KCkuZ2V0TnVtYmVyKCdUT1BLX0xBU1RfRElNX0NQVV9IQU5ET0ZGX1NJWkVfVEhSRVNIT0xEJyk7XG5cbiAgLy8gRW1waXJpY2FsbHkgZGV0ZXJtaW5lZCBjb25zdGFudCB1c2VkIHRvIGRldGVybWluZSBrIHRocmVzaG9sZCBmb3IgaGFuZGluZ1xuICAvLyBvZmYgZXhlY3V0aW9uIHRvIHRoZSBDUFUuXG4gIGNvbnN0IFRPUEtfS19DUFVfSEFORE9GRl9USFJFU0hPTEQgPVxuICAgICAgZW52KCkuZ2V0TnVtYmVyKCdUT1BLX0tfQ1BVX0hBTkRPRkZfVEhSRVNIT0xEJyk7XG5cbiAgY29uc3QgeFNoYXBlID0geC5zaGFwZTtcbiAgY29uc3QgbGFzdERpbSA9IHhTaGFwZVt4U2hhcGUubGVuZ3RoIC0gMV07XG5cbiAgaWYgKGJhY2tlbmQuc2hvdWxkRXhlY3V0ZU9uQ1BVKFt4XSkgfHxcbiAgICAgIGxhc3REaW0gPCBUT1BLX0xBU1RfRElNX0NQVV9IQU5ET0ZGX1NJWkVfVEhSRVNIT0xEIHx8XG4gICAgICBrID4gVE9QS19LX0NQVV9IQU5ET0ZGX1RIUkVTSE9MRCkge1xuICAgIGNvbnN0IHhWYWxzID0gYmFja2VuZC5yZWFkU3luYyh4LmRhdGFJZCkgYXMgVHlwZWRBcnJheTtcbiAgICBjb25zdCBbYWxsVG9wS1ZhbHMsIGFsbFRvcEtJbmRpY2VzXSA9XG4gICAgICAgIHRvcEtJbXBsQ1BVKHhWYWxzLCB4U2hhcGUsIHguZHR5cGUgYXMgTnVtZXJpY0RhdGFUeXBlLCBrLCBzb3J0ZWQpO1xuXG4gICAgcmV0dXJuIFtcbiAgICAgIGJhY2tlbmQubWFrZVRlbnNvckluZm8oXG4gICAgICAgICAgYWxsVG9wS1ZhbHMuc2hhcGUsIGFsbFRvcEtWYWxzLmR0eXBlLCBhbGxUb3BLVmFscy52YWx1ZXMpLFxuICAgICAgYmFja2VuZC5tYWtlVGVuc29ySW5mbyhcbiAgICAgICAgICBhbGxUb3BLSW5kaWNlcy5zaGFwZSwgYWxsVG9wS0luZGljZXMuZHR5cGUsIGFsbFRvcEtJbmRpY2VzLnZhbHVlcylcbiAgICBdO1xuICB9XG5cbiAgaWYgKGsgPT09IDApIHtcbiAgICB4U2hhcGVbeFNoYXBlLmxlbmd0aCAtIDFdID0gMDtcbiAgICByZXR1cm4gW1xuICAgICAgYmFja2VuZC5tYWtlVGVuc29ySW5mbyh4U2hhcGUsIHguZHR5cGUsIFtdKSxcbiAgICAgIGJhY2tlbmQubWFrZVRlbnNvckluZm8oeFNoYXBlLCAnaW50MzInLCBbXSlcbiAgICBdO1xuICB9XG5cbiAgaWYgKGxhc3REaW0gPT09IDEgLyogZmlyc3RQYXNzICovKSB7XG4gICAgcmV0dXJuIFtcbiAgICAgIHgsIGZpbGwoe2F0dHJzOiB7c2hhcGU6IHhTaGFwZSwgZHR5cGU6ICdpbnQzMicsIHZhbHVlOiAwfSwgYmFja2VuZH0pXG4gICAgXTtcbiAgfVxuXG4gIC8vIEVhZ2VybHkgdW5wYWNrIHggaW5wdXQgc2luY2UgaXQgaXMgcGFzc2VkIGluIHRvIGFsbCB0aGUgc2hhZGVycyB3aGljaFxuICAvLyByZXF1aXJlIHVucGFja2VkIGlucHV0cy5cbiAgY29uc3QgeHRleERhdGEgPSBiYWNrZW5kLnRleERhdGEuZ2V0KHguZGF0YUlkKTtcbiAgY29uc3QgeElzUGFja2VkID0geHRleERhdGEgIT09IG51bGwgJiYgeHRleERhdGEuaXNQYWNrZWQ7XG4gIGNvbnN0IHhVblBhY2tlZCA9IHhJc1BhY2tlZCA/IGJhY2tlbmQudW5wYWNrVGVuc29yKHgpIDogeDtcblxuICAvLyBSZXNoYXBlIGludG8gYSAyZCB0ZW5zb3IgW2JhdGNoLCBsYXN0RGltXSBhbmQgY29tcHV0ZSB0b3BrIGFsb25nIGxhc3REaW0uXG4gIGNvbnN0IHhTaXplID0gdXRpbC5zaXplRnJvbVNoYXBlKHhTaGFwZSk7XG4gIGNvbnN0IGJhdGNoID0geFNpemUgLyBsYXN0RGltO1xuICBjb25zdCB4MkQgPSByZXNoYXBlKFxuICAgICAge2lucHV0czoge3g6IHhVblBhY2tlZH0sIGF0dHJzOiB7c2hhcGU6IFtiYXRjaCwgbGFzdERpbV19LCBiYWNrZW5kfSk7XG5cbiAgaWYgKHhJc1BhY2tlZCkge1xuICAgIGRpc3Bvc2VJbnRlcm1lZGlhdGVUZW5zb3JJbmZvT3JOdWxsKGJhY2tlbmQsIHhVblBhY2tlZCk7XG4gIH1cblxuICBjb25zdCBrUG93MiA9IHJvdW5kVXBUb1BvdzIoayk7XG4gIGNvbnN0IGxhc3REaW1Qb3cyID0gcm91bmRVcFRvUG93MihsYXN0RGltKTtcblxuICAvLyBPbmx5IHRoZSBpbmRpY2VzIGNvbnRhaW5pbmcgdGhlIHRvcCBLIGFyZSBrZXB0IGF0IGV2ZXJ5IHN0ZXAgdG8gcmVkdWNlXG4gIC8vIG51bWJlciBvZiBvdXRwdXRzIGluIHRoZSBHUFUgYWxnb3JpdGhtcywgc28gb25jZSB0aGUgZmluYWwgc2V0IG9mIGluZGljZXNcbiAgLy8gaXMgY29tcHV0ZWQgdGhlbiBnYXRoZXIgaXMgdXNlZCB0byBncmFiIHRoZSBjb3JyZXNwb25kaW5nIHZhbHVlc1xuICAvLyBmcm9tIHRoZSBvcmlnaW5hbCBpbnB1dC5cbiAgbGV0IGluZGljZXM6IFRlbnNvckluZm8gPSBudWxsO1xuXG4gIC8vIEdQVSBhbGdvcml0aG0gYWx3YXlzIHRha2VzIGluIGFuIGluZGljZXMgaW5wdXQgYnV0IHRoaXMgaW5wdXQgaXMgbm90IHVzZWRcbiAgLy8gb24gdGhlIGZpcnN0IHJ1biBvZiBhIEdQVSBhbGdvcml0aG0sIHRoZXJlZm9yZSBpZiBpbmRpY2VzIGlzIG51bGwgd2Ugc2ltcGx5XG4gIC8vIHBhc3MgaW4geDJEIGluc3RlYWQgb2YgaXQgYnV0IHRoZSB2YWx1ZSB3aWxsIG5vdCBhY3R1YWxseSBiZSB1c2VkXG4gIGNvbnN0IGdldElucHV0cyA9ICgpID0+IGluZGljZXMgPT09IG51bGwgPyBbeDJELCB4MkRdIDogW3gyRCwgaW5kaWNlc107XG5cbiAgY29uc3QgcnVuU3dhcCA9IChkaXI6IG51bWJlciwgaW5jOiBudW1iZXIsIHNoYXBlOiBudW1iZXJbXSkgPT4ge1xuICAgIGNvbnN0IGlucHV0cyA9IGdldElucHV0cygpO1xuICAgIGNvbnN0IHByb2dyYW0gPSBuZXcgU3dhcFByb2dyYW0oc2hhcGUpO1xuICAgIGNvbnN0IGZpc3RQYXNzID0gaW5kaWNlcyA9PT0gbnVsbCA/IDEgOiAwO1xuICAgIGNvbnN0IGN1c3RvbVZhbHVlcyA9XG4gICAgICAgIFtbbGFzdERpbV0sIFtmaXN0UGFzc10sIFtOdW1iZXIuTkVHQVRJVkVfSU5GSU5JVFldLCBbZGlyXSwgW2luY11dO1xuICAgIGNvbnN0IHByZXZJbmRpY2VzID0gaW5kaWNlcztcbiAgICBpbmRpY2VzID0gYmFja2VuZC5ydW5XZWJHTFByb2dyYW0ocHJvZ3JhbSwgaW5wdXRzLCAnaW50MzInLCBjdXN0b21WYWx1ZXMpO1xuICAgIGRpc3Bvc2VJbnRlcm1lZGlhdGVUZW5zb3JJbmZvT3JOdWxsKGJhY2tlbmQsIHByZXZJbmRpY2VzKTtcbiAgfTtcblxuICAvLyBTdGVwIDE6IGxvY2FsIHNvcnRcbiAgZm9yIChsZXQgbGVuID0gMTsgbGVuIDwga1BvdzI7IGxlbiAqPSAyKSB7XG4gICAgY29uc3QgZGlyID0gbGVuICogMjtcbiAgICBmb3IgKGxldCBpbmMgPSBsZW47IGluYyA+PSAxOyBpbmMgLz0gMikge1xuICAgICAgcnVuU3dhcChkaXIsIGluYywgW2JhdGNoLCBsYXN0RGltUG93Ml0pO1xuICAgIH1cbiAgfVxuXG4gIC8vIFN0ZXAgMjogbWVyZ2VcbiAgZm9yIChsZXQgaW5kaWNlc1NpemUgPSBsYXN0RGltUG93MjsgaW5kaWNlc1NpemUgPiBrUG93MjsgaW5kaWNlc1NpemUgLz0gMikge1xuICAgIGNvbnN0IGlucHV0cyA9IGdldElucHV0cygpO1xuICAgIGNvbnN0IG1lcmdlUHJvZ3JhbSA9IG5ldyBNZXJnZVByb2dyYW0oW2JhdGNoLCBpbmRpY2VzU2l6ZSAvIDJdKTtcbiAgICBjb25zdCBmaXJzdFBhc3MgPSBpbmRpY2VzID09PSBudWxsID8gMSA6IDA7XG4gICAgY29uc3QgY3VzdG9tVmFsdWVzID0gW1tsYXN0RGltXSwgW2ZpcnN0UGFzc10sIFtrUG93Ml1dO1xuICAgIGNvbnN0IHByZXZJbmRpY2VzID0gaW5kaWNlcztcbiAgICBpbmRpY2VzID1cbiAgICAgICAgYmFja2VuZC5ydW5XZWJHTFByb2dyYW0obWVyZ2VQcm9ncmFtLCBpbnB1dHMsICdpbnQzMicsIGN1c3RvbVZhbHVlcyk7XG4gICAgZGlzcG9zZUludGVybWVkaWF0ZVRlbnNvckluZm9Pck51bGwoYmFja2VuZCwgcHJldkluZGljZXMpO1xuXG4gICAgLy8gU3RlcCAzOiByZWJ1aWxkXG4gICAgY29uc3QgbGVuID0ga1BvdzIgLyAyO1xuICAgIGNvbnN0IGRpciA9IGxlbiAqIDI7XG4gICAgZm9yIChsZXQgaW5jID0gbGVuOyBpbmMgPj0gMTsgaW5jIC89IDIpIHtcbiAgICAgIHJ1blN3YXAoZGlyLCBpbmMsIGluZGljZXMuc2hhcGUpO1xuICAgIH1cbiAgfVxuXG4gIC8vIEtlZXAgb25seSB0aGUgcmVxdWVzdGVkIHRvcCBLIHJlc3VsdHMgaW5zdGVhZCBvZiBrUG93MlxuICBsZXQgcHJldkluZGljZXMgPSBpbmRpY2VzO1xuICBpbmRpY2VzID0gc2xpY2UoXG4gICAgICB7aW5wdXRzOiB7eDogaW5kaWNlc30sIGJhY2tlbmQsIGF0dHJzOiB7YmVnaW46IDAsIHNpemU6IFtiYXRjaCwga119fSk7XG4gIGRpc3Bvc2VJbnRlcm1lZGlhdGVUZW5zb3JJbmZvT3JOdWxsKGJhY2tlbmQsIHByZXZJbmRpY2VzKTtcblxuICAvLyBHYXRoZXIgdmFsdWVzIG9uIGxhc3QgZGltZW5zaW9uXG4gIGxldCB2YWx1ZXMgPSBnYXRoZXJWMihcbiAgICAgIHtpbnB1dHM6IHt4OiB4MkQsIGluZGljZXN9LCBiYWNrZW5kLCBhdHRyczoge2F4aXM6IDEsIGJhdGNoRGltczogMX19KTtcbiAgZGlzcG9zZUludGVybWVkaWF0ZVRlbnNvckluZm9Pck51bGwoYmFja2VuZCwgeDJEKTtcblxuICAvLyBSZXNoYXBlIGJhY2sgdG8gdGhlIG9yaWdpbmFsIGlucHV0IHNoYXBlLCBleGNlcHQgdGhhdCB0aGUgbGFzdFxuICAvLyBkaW1lbnNpb24gaXMgay5cbiAgY29uc3QgbmV3U2hhcGUgPSB4U2hhcGUuc2xpY2UoMCwgLTEpO1xuICBuZXdTaGFwZS5wdXNoKGspO1xuXG4gIHByZXZJbmRpY2VzID0gaW5kaWNlcztcbiAgaW5kaWNlcyA9IHJlc2hhcGUoe2lucHV0czoge3g6IGluZGljZXN9LCBhdHRyczoge3NoYXBlOiBuZXdTaGFwZX0sIGJhY2tlbmR9KTtcbiAgZGlzcG9zZUludGVybWVkaWF0ZVRlbnNvckluZm9Pck51bGwoYmFja2VuZCwgcHJldkluZGljZXMpO1xuXG4gIGNvbnN0IHByZXZWYWx1ZXMgPSB2YWx1ZXM7XG4gIHZhbHVlcyA9IHJlc2hhcGUoe2lucHV0czoge3g6IHZhbHVlc30sIGF0dHJzOiB7c2hhcGU6IG5ld1NoYXBlfSwgYmFja2VuZH0pO1xuICBkaXNwb3NlSW50ZXJtZWRpYXRlVGVuc29ySW5mb09yTnVsbChiYWNrZW5kLCBwcmV2VmFsdWVzKTtcblxuICByZXR1cm4gW3ZhbHVlcywgaW5kaWNlc107XG59XG5cbmV4cG9ydCBjb25zdCB0b3BLQ29uZmlnOiBLZXJuZWxDb25maWcgPSB7XG4gIGtlcm5lbE5hbWU6IFRvcEssXG4gIGJhY2tlbmROYW1lOiAnd2ViZ2wnLFxuICBrZXJuZWxGdW5jOiB0b3BLIGFzIHt9IGFzIEtlcm5lbEZ1bmNcbn07XG4iXX0=","/**\n * @license\n * Copyright 2021 Google LLC. All Rights Reserved.\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n * =============================================================================\n */\nexport class TransformProgram {\n constructor(imageHeight, imageWidth, interpolation, fillMode, fillValue, outShape) {\n this.variableNames = ['Image', 'Transforms'];\n this.outputShape = outShape;\n const interpolationModeId = interpolation === 'nearest' ? 1 : 2;\n let fillModeId;\n switch (fillMode) {\n case 'constant':\n fillModeId = 1;\n break;\n case 'reflect':\n fillModeId = 2;\n break;\n case 'wrap':\n fillModeId = 3;\n break;\n case 'nearest':\n fillModeId = 4;\n break;\n default:\n fillModeId = 1;\n break;\n }\n this.userCode = `\n float mapCoord(float outCoord, float len) {\n float inCoord = outCoord;\n if(${fillModeId} == 2) {\n if (inCoord < 0.0) {\n if (len <= 1.0) {\n inCoord = 0.0;\n } else {\n float sz2 = 2.0 * len;\n if (inCoord < sz2) {\n inCoord = sz2 * float(int(float(-inCoord / sz2))) +\n inCoord;\n }\n inCoord = inCoord < -len ? inCoord + sz2 : -inCoord - 1.0;\n }\n } else if (inCoord > len - 1.0) {\n if (len <= 1.0) {\n inCoord = 0.0;\n } else {\n float sz2 = 2.0 * len;\n inCoord -= sz2 * float(int(float(inCoord / sz2)));\n if (inCoord >= len) {\n inCoord = sz2 - inCoord - 1.0;\n }\n }\n }\n return clamp(inCoord, 0.0, len - 1.0);\n } else if (${fillModeId} == 3) {\n if (inCoord < 0.0) {\n if (len <= 1.0) {\n inCoord = 0.0;\n } else {\n float sz = len - 1.0;\n inCoord += len * (float(int(float(-inCoord / sz))) + 1.0);\n }\n } else if (inCoord > len - 1.0) {\n if (len <= 1.0) {\n inCoord = 0.0;\n } else {\n float sz = len - 1.0;\n inCoord -= len * float(int(float(inCoord / sz)));\n }\n }\n return clamp(inCoord, 0.0, len - 1.0);\n } else if (${fillModeId} == 4) {\n return clamp(outCoord, 0.0, len - 1.0);\n } else {\n return outCoord;\n }\n }\n\n float readWithFillValue(int batch, int coordY, int coordX,\n int channel) {\n float outputValue;\n if (0 <= coordY && coordY < ${imageHeight} && 0 <= coordX && coordX < ${imageWidth}) {\n outputValue = getImage(batch, coordY, coordX, channel);\n } else {\n outputValue = float(${fillValue});\n }\n return outputValue;\n }\n\n void main() {\n ivec4 coords = getOutputCoords();\n float outputValue;\n int batch = coords[0];\n int x = coords[2];\n int y = coords[1];\n int channel = coords[3];\n float xf = float(x);\n float yf = float(y);\n float a1 = getTransforms(batch, 0);\n float a2 = getTransforms(batch, 1);\n float a3 = getTransforms(batch, 2);\n float b1 = getTransforms(batch, 3);\n float b2 = getTransforms(batch, 4);\n float b3 = getTransforms(batch, 5);\n float c1 = getTransforms(batch, 6);\n float c2 = getTransforms(batch, 7);\n float projection = c1 * xf + c2 * yf + 1.0;\n if (projection == 0.0) {\n outputValue = float(${fillValue});\n } else {\n float inX = (a1 * xf + a2 * yf + a3) / projection;\n float inY = (b1 * xf + b2 * yf + b3) / projection;\n float mapX = mapCoord(inX, float(${imageWidth}));\n float mapY = mapCoord(inY, float(${imageHeight}));\n\n if (${interpolationModeId} == 1) {\n int coordY = int(round(mapY));\n int coordX = int(round(mapX));\n outputValue = readWithFillValue(batch, coordY, coordX,\n channel);\n } else {\n float yFloor = floor(mapY);\n float xFloor = floor(mapX);\n float yCeil = yFloor + 1.0;\n float xCeil = xFloor + 1.0;\n float valueYFloor = (xCeil - mapX) *\n readWithFillValue(batch, int(yFloor), int(xFloor), channel) +\n (mapX - xFloor) *\n readWithFillValue(batch, int(yFloor), int(xCeil), channel);\n float valueYCeil = (xCeil - mapX) *\n readWithFillValue(batch, int(yCeil), int(xFloor), channel) +\n (mapX - xFloor) *\n readWithFillValue(batch, int(yCeil), int(xCeil), channel);\n outputValue = (yCeil - mapY) * valueYFloor +\n (mapY - yFloor) * valueYCeil;\n }\n }\n setOutput(outputValue);\n }\n `;\n }\n}\n//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidHJhbnNmb3JtX2dwdS5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uL3RmanMtYmFja2VuZC13ZWJnbC9zcmMvdHJhbnNmb3JtX2dwdS50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQTs7Ozs7Ozs7Ozs7Ozs7O0dBZUc7QUFJSCxNQUFNLE9BQU8sZ0JBQWdCO0lBSzNCLFlBQ0ksV0FBbUIsRUFBRSxVQUFrQixFQUN2QyxhQUFtQyxFQUNuQyxRQUErQyxFQUFFLFNBQWlCLEVBQ2xFLFFBQTBDO1FBUjlDLGtCQUFhLEdBQUcsQ0FBQyxPQUFPLEVBQUUsWUFBWSxDQUFDLENBQUM7UUFTdEMsSUFBSSxDQUFDLFdBQVcsR0FBRyxRQUFRLENBQUM7UUFDNUIsTUFBTSxtQkFBbUIsR0FBRyxhQUFhLEtBQUssU0FBUyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQztRQUNoRSxJQUFJLFVBQVUsQ0FBQztRQUNmLFFBQVEsUUFBUSxFQUFFO1lBQ2hCLEtBQUssVUFBVTtnQkFDYixVQUFVLEdBQUcsQ0FBQyxDQUFDO2dCQUNmLE1BQU07WUFDUixLQUFLLFNBQVM7Z0JBQ1osVUFBVSxHQUFHLENBQUMsQ0FBQztnQkFDZixNQUFNO1lBQ1IsS0FBSyxNQUFNO2dCQUNULFVBQVUsR0FBRyxDQUFDLENBQUM7Z0JBQ2YsTUFBTTtZQUNSLEtBQUssU0FBUztnQkFDWixVQUFVLEdBQUcsQ0FBQyxDQUFDO2dCQUNmLE1BQU07WUFDUjtnQkFDRSxVQUFVLEdBQUcsQ0FBQyxDQUFDO2dCQUNmLE1BQU07U0FDVDtRQUNELElBQUksQ0FBQyxRQUFRLEdBQUc7OzttQkFHRCxVQUFVOzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7MkJBd0JGLFVBQVU7Ozs7Ozs7Ozs7Ozs7Ozs7OzJCQWlCVixVQUFVOzs7Ozs7Ozs7OzRDQVc3QixXQUFXLCtCQUErQixVQUFVOzs7c0NBR3RCLFNBQVM7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7OztzQ0F3QlQsU0FBUzs7OzttREFJSSxVQUFVO21EQUNWLFdBQVc7O3NCQUV4QyxtQkFBbUI7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7OztTQXdCaEMsQ0FBQztJQUNSLENBQUM7Q0FDRiIsInNvdXJjZXNDb250ZW50IjpbIi8qKlxuICogQGxpY2Vuc2VcbiAqIENvcHlyaWdodCAyMDIxIEdvb2dsZSBMTEMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuXG4gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgXCJMaWNlbnNlXCIpO1xuICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLlxuICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0XG4gKlxuICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wXG4gKlxuICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZVxuICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gXCJBUyBJU1wiIEJBU0lTLFxuICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuXG4gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kXG4gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS5cbiAqID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4gKi9cblxuaW1wb3J0IHtHUEdQVVByb2dyYW19IGZyb20gJy4vZ3BncHVfbWF0aCc7XG5cbmV4cG9ydCBjbGFzcyBUcmFuc2Zvcm1Qcm9ncmFtIGltcGxlbWVudHMgR1BHUFVQcm9ncmFtIHtcbiAgdmFyaWFibGVOYW1lcyA9IFsnSW1hZ2UnLCAnVHJhbnNmb3JtcyddO1xuICBvdXRwdXRTaGFwZTogbnVtYmVyW107XG4gIHVzZXJDb2RlOiBzdHJpbmc7XG5cbiAgY29uc3RydWN0b3IoXG4gICAgICBpbWFnZUhlaWdodDogbnVtYmVyLCBpbWFnZVdpZHRoOiBudW1iZXIsXG4gICAgICBpbnRlcnBvbGF0aW9uOiAnbmVhcmVzdCd8J2JpbGluZWFyJyxcbiAgICAgIGZpbGxNb2RlOiAnY29uc3RhbnQnfCdyZWZsZWN0J3wnd3JhcCd8J25lYXJlc3QnLCBmaWxsVmFsdWU6IG51bWJlcixcbiAgICAgIG91dFNoYXBlOiBbbnVtYmVyLCBudW1iZXIsIG51bWJlciwgbnVtYmVyXSkge1xuICAgIHRoaXMub3V0cHV0U2hhcGUgPSBvdXRTaGFwZTtcbiAgICBjb25zdCBpbnRlcnBvbGF0aW9uTW9kZUlkID0gaW50ZXJwb2xhdGlvbiA9PT0gJ25lYXJlc3QnID8gMSA6IDI7XG4gICAgbGV0IGZpbGxNb2RlSWQ7XG4gICAgc3dpdGNoIChmaWxsTW9kZSkge1xuICAgICAgY2FzZSAnY29uc3RhbnQnOlxuICAgICAgICBmaWxsTW9kZUlkID0gMTtcbiAgICAgICAgYnJlYWs7XG4gICAgICBjYXNlICdyZWZsZWN0JzpcbiAgICAgICAgZmlsbE1vZGVJZCA9IDI7XG4gICAgICAgIGJyZWFrO1xuICAgICAgY2FzZSAnd3JhcCc6XG4gICAgICAgIGZpbGxNb2RlSWQgPSAzO1xuICAgICAgICBicmVhaztcbiAgICAgIGNhc2UgJ25lYXJlc3QnOlxuICAgICAgICBmaWxsTW9kZUlkID0gNDtcbiAgICAgICAgYnJlYWs7XG4gICAgICBkZWZhdWx0OlxuICAgICAgICBmaWxsTW9kZUlkID0gMTtcbiAgICAgICAgYnJlYWs7XG4gICAgfVxuICAgIHRoaXMudXNlckNvZGUgPSBgXG4gICAgICAgICAgICBmbG9hdCBtYXBDb29yZChmbG9hdCBvdXRDb29yZCwgZmxvYXQgbGVuKSB7XG4gICAgICAgICAgICAgIGZsb2F0IGluQ29vcmQgPSBvdXRDb29yZDtcbiAgICAgICAgICAgICAgaWYoJHtmaWxsTW9kZUlkfSA9PSAyKSB7XG4gICAgICAgICAgICAgICAgaWYgKGluQ29vcmQgPCAwLjApIHtcbiAgICAgICAgICAgICAgICAgIGlmIChsZW4gPD0gMS4wKSB7XG4gICAgICAgICAgICAgICAgICAgIGluQ29vcmQgPSAwLjA7XG4gICAgICAgICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICBmbG9hdCBzejIgPSAyLjAgKiBsZW47XG4gICAgICAgICAgICAgICAgICAgIGlmIChpbkNvb3JkIDwgc3oyKSB7XG4gICAgICAgICAgICAgICAgICAgICAgaW5Db29yZCA9IHN6MiAqIGZsb2F0KGludChmbG9hdCgtaW5Db29yZCAvIHN6MikpKSArXG4gICAgICAgICAgICAgICAgICAgICAgaW5Db29yZDtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICBpbkNvb3JkID0gaW5Db29yZCA8IC1sZW4gPyBpbkNvb3JkICsgc3oyIDogLWluQ29vcmQgLSAxLjA7XG4gICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfSBlbHNlIGlmIChpbkNvb3JkID4gbGVuIC0gMS4wKSB7XG4gICAgICAgICAgICAgICAgICBpZiAobGVuIDw9IDEuMCkge1xuICAgICAgICAgICAgICAgICAgICBpbkNvb3JkID0gMC4wO1xuICAgICAgICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgZmxvYXQgc3oyID0gMi4wICogbGVuO1xuICAgICAgICAgICAgICAgICAgICBpbkNvb3JkIC09IHN6MiAqIGZsb2F0KGludChmbG9hdChpbkNvb3JkIC8gc3oyKSkpO1xuICAgICAgICAgICAgICAgICAgICBpZiAoaW5Db29yZCA+PSBsZW4pIHtcbiAgICAgICAgICAgICAgICAgICAgICBpbkNvb3JkID0gc3oyIC0gaW5Db29yZCAtIDEuMDtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICByZXR1cm4gY2xhbXAoaW5Db29yZCwgMC4wLCBsZW4gLSAxLjApO1xuICAgICAgICAgICAgICB9IGVsc2UgaWYgKCR7ZmlsbE1vZGVJZH0gPT0gMykge1xuICAgICAgICAgICAgICAgIGlmIChpbkNvb3JkIDwgMC4wKSB7XG4gICAgICAgICAgICAgICAgICBpZiAobGVuIDw9IDEuMCkge1xuICAgICAgICAgICAgICAgICAgICBpbkNvb3JkID0gMC4wO1xuICAgICAgICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgZmxvYXQgc3ogPSBsZW4gLSAxLjA7XG4gICAgICAgICAgICAgICAgICAgIGluQ29vcmQgKz0gbGVuICogKGZsb2F0KGludChmbG9hdCgtaW5Db29yZCAvIHN6KSkpICsgMS4wKTtcbiAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKGluQ29vcmQgPiBsZW4gLSAxLjApIHtcbiAgICAgICAgICAgICAgICAgIGlmIChsZW4gPD0gMS4wKSB7XG4gICAgICAgICAgICAgICAgICAgIGluQ29vcmQgPSAwLjA7XG4gICAgICAgICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICBmbG9hdCBzeiA9IGxlbiAtIDEuMDtcbiAgICAgICAgICAgICAgICAgICAgaW5Db29yZCAtPSBsZW4gKiBmbG9hdChpbnQoZmxvYXQoaW5Db29yZCAvIHN6KSkpO1xuICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICByZXR1cm4gY2xhbXAoaW5Db29yZCwgMC4wLCBsZW4gLSAxLjApO1xuICAgICAgICAgICAgICB9IGVsc2UgaWYgKCR7ZmlsbE1vZGVJZH0gPT0gNCkge1xuICAgICAgICAgICAgICAgIHJldHVybiBjbGFtcChvdXRDb29yZCwgMC4wLCBsZW4gLSAxLjApO1xuICAgICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgIHJldHVybiBvdXRDb29yZDtcbiAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBmbG9hdCByZWFkV2l0aEZpbGxWYWx1ZShpbnQgYmF0Y2gsIGludCBjb29yZFksIGludCBjb29yZFgsXG4gICAgICAgICAgICAgIGludCBjaGFubmVsKSB7XG4gICAgICAgICAgICAgIGZsb2F0IG91dHB1dFZhbHVlO1xuICAgICAgICAgICAgICBpZiAoMCA8PSBjb29yZFkgJiYgY29vcmRZIDwgJHtcbiAgICAgICAgaW1hZ2VIZWlnaHR9ICYmIDAgPD0gY29vcmRYICYmIGNvb3JkWCA8ICR7aW1hZ2VXaWR0aH0pIHtcbiAgICAgICAgICAgICAgICAgIG91dHB1dFZhbHVlID0gZ2V0SW1hZ2UoYmF0Y2gsIGNvb3JkWSwgY29vcmRYLCBjaGFubmVsKTtcbiAgICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICBvdXRwdXRWYWx1ZSA9IGZsb2F0KCR7ZmlsbFZhbHVlfSk7XG4gICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgcmV0dXJuIG91dHB1dFZhbHVlO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICB2b2lkIG1haW4oKSB7XG4gICAgICAgICAgICAgIGl2ZWM0IGNvb3JkcyA9IGdldE91dHB1dENvb3JkcygpO1xuICAgICAgICAgICAgICBmbG9hdCBvdXRwdXRWYWx1ZTtcbiAgICAgICAgICAgICAgaW50IGJhdGNoID0gY29vcmRzWzBdO1xuICAgICAgICAgICAgICBpbnQgeCA9IGNvb3Jkc1syXTtcbiAgICAgICAgICAgICAgaW50IHkgPSBjb29yZHNbMV07XG4gICAgICAgICAgICAgIGludCBjaGFubmVsID0gY29vcmRzWzNdO1xuICAgICAgICAgICAgICBmbG9hdCB4ZiA9IGZsb2F0KHgpO1xuICAgICAgICAgICAgICBmbG9hdCB5ZiA9IGZsb2F0KHkpO1xuICAgICAgICAgICAgICBmbG9hdCBhMSA9IGdldFRyYW5zZm9ybXMoYmF0Y2gsIDApO1xuICAgICAgICAgICAgICBmbG9hdCBhMiA9IGdldFRyYW5zZm9ybXMoYmF0Y2gsIDEpO1xuICAgICAgICAgICAgICBmbG9hdCBhMyA9IGdldFRyYW5zZm9ybXMoYmF0Y2gsIDIpO1xuICAgICAgICAgICAgICBmbG9hdCBiMSA9IGdldFRyYW5zZm9ybXMoYmF0Y2gsIDMpO1xuICAgICAgICAgICAgICBmbG9hdCBiMiA9IGdldFRyYW5zZm9ybXMoYmF0Y2gsIDQpO1xuICAgICAgICAgICAgICBmbG9hdCBiMyA9IGdldFRyYW5zZm9ybXMoYmF0Y2gsIDUpO1xuICAgICAgICAgICAgICBmbG9hdCBjMSA9IGdldFRyYW5zZm9ybXMoYmF0Y2gsIDYpO1xuICAgICAgICAgICAgICBmbG9hdCBjMiA9IGdldFRyYW5zZm9ybXMoYmF0Y2gsIDcpO1xuICAgICAgICAgICAgICBmbG9hdCBwcm9qZWN0aW9uID0gYzEgKiB4ZiArIGMyICogeWYgKyAxLjA7XG4gICAgICAgICAgICAgIGlmIChwcm9qZWN0aW9uID09IDAuMCkge1xuICAgICAgICAgICAgICAgIG91dHB1dFZhbHVlID0gZmxvYXQoJHtmaWxsVmFsdWV9KTtcbiAgICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICBmbG9hdCBpblggPSAoYTEgKiB4ZiArIGEyICogeWYgKyBhMykgLyBwcm9qZWN0aW9uO1xuICAgICAgICAgICAgICAgIGZsb2F0IGluWSA9IChiMSAqIHhmICsgYjIgKiB5ZiArIGIzKSAvIHByb2plY3Rpb247XG4gICAgICAgICAgICAgICAgZmxvYXQgbWFwWCA9IG1hcENvb3JkKGluWCwgZmxvYXQoJHtpbWFnZVdpZHRofSkpO1xuICAgICAgICAgICAgICAgIGZsb2F0IG1hcFkgPSBtYXBDb29yZChpblksIGZsb2F0KCR7aW1hZ2VIZWlnaHR9KSk7XG5cbiAgICAgICAgICAgICAgICBpZiAoJHtpbnRlcnBvbGF0aW9uTW9kZUlkfSA9PSAxKSB7XG4gICAgICAgICAgICAgICAgICBpbnQgY29vcmRZID0gaW50KHJvdW5kKG1hcFkpKTtcbiAgICAgICAgICAgICAgICAgIGludCBjb29yZFggPSBpbnQocm91bmQobWFwWCkpO1xuICAgICAgICAgICAgICAgICAgb3V0cHV0VmFsdWUgPSByZWFkV2l0aEZpbGxWYWx1ZShiYXRjaCwgY29vcmRZLCBjb29yZFgsXG4gICAgICAgICAgICAgICAgICAgIGNoYW5uZWwpO1xuICAgICAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgICBmbG9hdCB5Rmxvb3IgPSBmbG9vcihtYXBZKTtcbiAgICAgICAgICAgICAgICAgIGZsb2F0IHhGbG9vciA9IGZsb29yKG1hcFgpO1xuICAgICAgICAgICAgICAgICAgZmxvYXQgeUNlaWwgPSB5Rmxvb3IgKyAxLjA7XG4gICAgICAgICAgICAgICAgICBmbG9hdCB4Q2VpbCA9IHhGbG9vciArIDEuMDtcbiAgICAgICAgICAgICAgICAgIGZsb2F0IHZhbHVlWUZsb29yID0gKHhDZWlsIC0gbWFwWCkgKlxuICAgICAgICAgICAgICAgICAgcmVhZFdpdGhGaWxsVmFsdWUoYmF0Y2gsIGludCh5Rmxvb3IpLCBpbnQoeEZsb29yKSwgY2hhbm5lbCkgK1xuICAgICAgICAgICAgICAgICAgKG1hcFggLSB4Rmxvb3IpICpcbiAgICAgICAgICAgICAgICAgIHJlYWRXaXRoRmlsbFZhbHVlKGJhdGNoLCBpbnQoeUZsb29yKSwgaW50KHhDZWlsKSwgY2hhbm5lbCk7XG4gICAgICAgICAgICAgICAgICBmbG9hdCB2YWx1ZVlDZWlsID0gKHhDZWlsIC0gbWFwWCkgKlxuICAgICAgICAgICAgICAgICAgcmVhZFdpdGhGaWxsVmFsdWUoYmF0Y2gsIGludCh5Q2VpbCksIGludCh4Rmxvb3IpLCBjaGFubmVsKSArXG4gICAgICAgICAgICAgICAgICAobWFwWCAtIHhGbG9vcikgKlxuICAgICAgICAgICAgICAgICAgcmVhZFdpdGhGaWxsVmFsdWUoYmF0Y2gsIGludCh5Q2VpbCksIGludCh4Q2VpbCksIGNoYW5uZWwpO1xuICAgICAgICAgICAgICAgICAgb3V0cHV0VmFsdWUgPSAoeUNlaWwgLSBtYXBZKSAqIHZhbHVlWUZsb29yICtcbiAgICAgICAgICAgICAgICAgIChtYXBZIC0geUZsb29yKSAqIHZhbHVlWUNlaWw7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgIHNldE91dHB1dChvdXRwdXRWYWx1ZSk7XG4gICAgICAgICAgICB9XG4gICAgICAgIGA7XG4gIH1cbn1cbiJdfQ==","/**\n * @license\n * Copyright 2021 Google LLC. All Rights Reserved.\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n * =============================================================================\n */\nimport { Transform } from '@tensorflow/tfjs-core';\nimport { TransformProgram } from '../transform_gpu';\nexport function transform(args) {\n const { inputs, backend, attrs } = args;\n const { image, transforms } = inputs;\n const { interpolation, fillMode, fillValue, outputShape } = attrs;\n const [batch, imageHeight, imageWidth, numChannels] = image.shape;\n const [outHeight, outWidth] = outputShape != null ? outputShape : [imageHeight, imageWidth];\n const outShape = [batch, outHeight, outWidth,\n numChannels];\n const program = new TransformProgram(imageHeight, imageWidth, interpolation, fillMode, fillValue, outShape);\n return backend.runWebGLProgram(program, [image, transforms], 'float32');\n}\nexport const transformConfig = {\n kernelName: Transform,\n backendName: 'webgl',\n kernelFunc: transform\n};\n//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiVHJhbnNmb3JtLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vLi4vdGZqcy1iYWNrZW5kLXdlYmdsL3NyYy9rZXJuZWxzL1RyYW5zZm9ybS50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQTs7Ozs7Ozs7Ozs7Ozs7O0dBZUc7QUFFSCxPQUFPLEVBQXVDLFNBQVMsRUFBa0MsTUFBTSx1QkFBdUIsQ0FBQztBQUd2SCxPQUFPLEVBQUMsZ0JBQWdCLEVBQUMsTUFBTSxrQkFBa0IsQ0FBQztBQUVsRCxNQUFNLFVBQVUsU0FBUyxDQUFDLElBSXpCO0lBQ0MsTUFBTSxFQUFDLE1BQU0sRUFBRSxPQUFPLEVBQUUsS0FBSyxFQUFDLEdBQUcsSUFBSSxDQUFDO0lBQ3RDLE1BQU0sRUFBQyxLQUFLLEVBQUUsVUFBVSxFQUFDLEdBQUcsTUFBTSxDQUFDO0lBQ25DLE1BQU0sRUFBQyxhQUFhLEVBQUUsUUFBUSxFQUFFLFNBQVMsRUFBRSxXQUFXLEVBQUMsR0FBRyxLQUFLLENBQUM7SUFFaEUsTUFBTSxDQUFDLEtBQUssRUFBRSxXQUFXLEVBQUUsVUFBVSxFQUFFLFdBQVcsQ0FBQyxHQUFHLEtBQUssQ0FBQyxLQUFLLENBQUM7SUFDbEUsTUFBTSxDQUFDLFNBQVMsRUFBRSxRQUFRLENBQUMsR0FDdkIsV0FBVyxJQUFJLElBQUksQ0FBQyxDQUFDLENBQUMsV0FBVyxDQUFDLENBQUMsQ0FBQyxDQUFDLFdBQVcsRUFBRSxVQUFVLENBQUMsQ0FBQztJQUNsRSxNQUFNLFFBQVEsR0FDVixDQUFDLEtBQUssRUFBRSxTQUFTLEVBQUUsUUFBUTtRQUMxQixXQUFXLENBQXFDLENBQUM7SUFFdEQsTUFBTSxPQUFPLEdBQUcsSUFBSSxnQkFBZ0IsQ0FDaEMsV0FBVyxFQUFFLFVBQVUsRUFBRSxhQUFhLEVBQUUsUUFBUSxFQUFFLFNBQVMsRUFBRSxRQUFRLENBQUMsQ0FBQztJQUMzRSxPQUFPLE9BQU8sQ0FBQyxlQUFlLENBQUMsT0FBTyxFQUFFLENBQUMsS0FBSyxFQUFFLFVBQVUsQ0FBQyxFQUFFLFNBQVMsQ0FBQyxDQUFDO0FBQzFFLENBQUM7QUFFRCxNQUFNLENBQUMsTUFBTSxlQUFlLEdBQWlCO0lBQzNDLFVBQVUsRUFBRSxTQUFTO0lBQ3JCLFdBQVcsRUFBRSxPQUFPO0lBQ3BCLFVBQVUsRUFBRSxTQUE2QjtDQUMxQyxDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiLyoqXG4gKiBAbGljZW5zZVxuICogQ29weXJpZ2h0IDIwMjEgR29vZ2xlIExMQy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC5cbiAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSBcIkxpY2Vuc2VcIik7XG4gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuXG4gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXRcbiAqXG4gKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjBcbiAqXG4gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlXG4gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiBcIkFTIElTXCIgQkFTSVMsXG4gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC5cbiAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmRcbiAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLlxuICogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbiAqL1xuXG5pbXBvcnQge0tlcm5lbENvbmZpZywgS2VybmVsRnVuYywgVGVuc29ySW5mbywgVHJhbnNmb3JtLCBUcmFuc2Zvcm1BdHRycywgVHJhbnNmb3JtSW5wdXRzfSBmcm9tICdAdGVuc29yZmxvdy90ZmpzLWNvcmUnO1xuXG5pbXBvcnQge01hdGhCYWNrZW5kV2ViR0x9IGZyb20gJy4uL2JhY2tlbmRfd2ViZ2wnO1xuaW1wb3J0IHtUcmFuc2Zvcm1Qcm9ncmFtfSBmcm9tICcuLi90cmFuc2Zvcm1fZ3B1JztcblxuZXhwb3J0IGZ1bmN0aW9uIHRyYW5zZm9ybShhcmdzOiB7XG4gIGlucHV0czogVHJhbnNmb3JtSW5wdXRzLFxuICBiYWNrZW5kOiBNYXRoQmFja2VuZFdlYkdMLFxuICBhdHRyczogVHJhbnNmb3JtQXR0cnNcbn0pOiBUZW5zb3JJbmZvIHtcbiAgY29uc3Qge2lucHV0cywgYmFja2VuZCwgYXR0cnN9ID0gYXJncztcbiAgY29uc3Qge2ltYWdlLCB0cmFuc2Zvcm1zfSA9IGlucHV0cztcbiAgY29uc3Qge2ludGVycG9sYXRpb24sIGZpbGxNb2RlLCBmaWxsVmFsdWUsIG91dHB1dFNoYXBlfSA9IGF0dHJzO1xuXG4gIGNvbnN0IFtiYXRjaCwgaW1hZ2VIZWlnaHQsIGltYWdlV2lkdGgsIG51bUNoYW5uZWxzXSA9IGltYWdlLnNoYXBlO1xuICBjb25zdCBbb3V0SGVpZ2h0LCBvdXRXaWR0aF0gPVxuICAgICAgb3V0cHV0U2hhcGUgIT0gbnVsbCA/IG91dHB1dFNoYXBlIDogW2ltYWdlSGVpZ2h0LCBpbWFnZVdpZHRoXTtcbiAgY29uc3Qgb3V0U2hhcGUgPVxuICAgICAgW2JhdGNoLCBvdXRIZWlnaHQsIG91dFdpZHRoLFxuICAgICAgIG51bUNoYW5uZWxzXSBhcyBbbnVtYmVyLCBudW1iZXIsIG51bWJlciwgbnVtYmVyXTtcblxuICBjb25zdCBwcm9ncmFtID0gbmV3IFRyYW5zZm9ybVByb2dyYW0oXG4gICAgICBpbWFnZUhlaWdodCwgaW1hZ2VXaWR0aCwgaW50ZXJwb2xhdGlvbiwgZmlsbE1vZGUsIGZpbGxWYWx1ZSwgb3V0U2hhcGUpO1xuICByZXR1cm4gYmFja2VuZC5ydW5XZWJHTFByb2dyYW0ocHJvZ3JhbSwgW2ltYWdlLCB0cmFuc2Zvcm1zXSwgJ2Zsb2F0MzInKTtcbn1cblxuZXhwb3J0IGNvbnN0IHRyYW5zZm9ybUNvbmZpZzogS2VybmVsQ29uZmlnID0ge1xuICBrZXJuZWxOYW1lOiBUcmFuc2Zvcm0sXG4gIGJhY2tlbmROYW1lOiAnd2ViZ2wnLFxuICBrZXJuZWxGdW5jOiB0cmFuc2Zvcm0gYXMge30gYXMgS2VybmVsRnVuY1xufTtcbiJdfQ==","/**\n * @license\n * Copyright 2020 Google LLC. All Rights Reserved.\n * Licensed under the Apache License, Version 2.0 (the License);\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an AS IS BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n * =============================================================================\n */\nimport { Unique } from '@tensorflow/tfjs-core';\nimport { uniqueImplCPU } from '../kernel_utils/shared';\nimport { assertNotComplex } from '../webgl_util';\nexport function unique(args) {\n const { inputs, attrs, backend } = args;\n const { axis } = attrs;\n const { x } = inputs;\n assertNotComplex(x, 'unique');\n // For now, always forward calculation to the CPU backend.\n console.warn('WARNING: ', 'UI might be locked temporarily as data is being downloaded');\n const values = backend.readSync(x.dataId);\n const { outputValues, outputShape, indices } = uniqueImplCPU(values, axis, x.shape, x.dtype);\n return [\n backend.makeTensorInfo(outputShape, x.dtype, outputValues),\n backend.makeTensorInfo([indices.length], 'int32', indices),\n ];\n}\nexport const uniqueConfig = {\n kernelName: Unique,\n backendName: 'webgl',\n kernelFunc: unique,\n};\n//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiVW5pcXVlLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vLi4vdGZqcy1iYWNrZW5kLXdlYmdsL3NyYy9rZXJuZWxzL1VuaXF1ZS50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQTs7Ozs7Ozs7Ozs7Ozs7O0dBZUc7QUFFSCxPQUFPLEVBQXVDLE1BQU0sRUFBNEIsTUFBTSx1QkFBdUIsQ0FBQztBQUc5RyxPQUFPLEVBQUMsYUFBYSxFQUFDLE1BQU0sd0JBQXdCLENBQUM7QUFDckQsT0FBTyxFQUFDLGdCQUFnQixFQUFDLE1BQU0sZUFBZSxDQUFDO0FBRS9DLE1BQU0sVUFBVSxNQUFNLENBQ2xCLElBQ3lFO0lBRTNFLE1BQU0sRUFBQyxNQUFNLEVBQUUsS0FBSyxFQUFFLE9BQU8sRUFBQyxHQUFHLElBQUksQ0FBQztJQUN0QyxNQUFNLEVBQUMsSUFBSSxFQUFDLEdBQUcsS0FBSyxDQUFDO0lBQ3JCLE1BQU0sRUFBQyxDQUFDLEVBQUMsR0FBRyxNQUFNLENBQUM7SUFDbkIsZ0JBQWdCLENBQUMsQ0FBQyxFQUFFLFFBQVEsQ0FBQyxDQUFDO0lBRTlCLDBEQUEwRDtJQUMxRCxPQUFPLENBQUMsSUFBSSxDQUNSLFdBQVcsRUFDWCw0REFBNEQsQ0FBQyxDQUFDO0lBQ2xFLE1BQU0sTUFBTSxHQUFHLE9BQU8sQ0FBQyxRQUFRLENBQUMsQ0FBQyxDQUFDLE1BQU0sQ0FBQyxDQUFDO0lBQzFDLE1BQU0sRUFBQyxZQUFZLEVBQUUsV0FBVyxFQUFFLE9BQU8sRUFBQyxHQUN0QyxhQUFhLENBQUMsTUFBTSxFQUFFLElBQUksRUFBRSxDQUFDLENBQUMsS0FBSyxFQUFFLENBQUMsQ0FBQyxLQUFLLENBQUMsQ0FBQztJQUNsRCxPQUFPO1FBQ0wsT0FBTyxDQUFDLGNBQWMsQ0FBQyxXQUFXLEVBQUUsQ0FBQyxDQUFDLEtBQUssRUFBRSxZQUFZLENBQUM7UUFDMUQsT0FBTyxDQUFDLGNBQWMsQ0FBQyxDQUFDLE9BQU8sQ0FBQyxNQUFNLENBQUMsRUFBRSxPQUFPLEVBQUUsT0FBTyxDQUFDO0tBQzNELENBQUM7QUFDSixDQUFDO0FBRUQsTUFBTSxDQUFDLE1BQU0sWUFBWSxHQUFpQjtJQUN4QyxVQUFVLEVBQUUsTUFBTTtJQUNsQixXQUFXLEVBQUUsT0FBTztJQUNwQixVQUFVLEVBQUUsTUFBMEI7Q0FDdkMsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbIi8qKlxuICogQGxpY2Vuc2VcbiAqIENvcHlyaWdodCAyMDIwIEdvb2dsZSBMTEMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuXG4gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgTGljZW5zZSk7XG4gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuXG4gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXRcbiAqXG4gKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjBcbiAqXG4gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlXG4gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiBBUyBJUyBCQVNJUyxcbiAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLlxuICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZFxuICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuXG4gKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuICovXG5cbmltcG9ydCB7S2VybmVsQ29uZmlnLCBLZXJuZWxGdW5jLCBUZW5zb3JJbmZvLCBVbmlxdWUsIFVuaXF1ZUF0dHJzLCBVbmlxdWVJbnB1dHN9IGZyb20gJ0B0ZW5zb3JmbG93L3RmanMtY29yZSc7XG5cbmltcG9ydCB7TWF0aEJhY2tlbmRXZWJHTH0gZnJvbSAnLi4vYmFja2VuZF93ZWJnbCc7XG5pbXBvcnQge3VuaXF1ZUltcGxDUFV9IGZyb20gJy4uL2tlcm5lbF91dGlscy9zaGFyZWQnO1xuaW1wb3J0IHthc3NlcnROb3RDb21wbGV4fSBmcm9tICcuLi93ZWJnbF91dGlsJztcblxuZXhwb3J0IGZ1bmN0aW9uIHVuaXF1ZShcbiAgICBhcmdzOlxuICAgICAgICB7aW5wdXRzOiBVbmlxdWVJbnB1dHMsIGF0dHJzOiBVbmlxdWVBdHRycywgYmFja2VuZDogTWF0aEJhY2tlbmRXZWJHTH0pOlxuICAgIFRlbnNvckluZm9bXSB7XG4gIGNvbnN0IHtpbnB1dHMsIGF0dHJzLCBiYWNrZW5kfSA9IGFyZ3M7XG4gIGNvbnN0IHtheGlzfSA9IGF0dHJzO1xuICBjb25zdCB7eH0gPSBpbnB1dHM7XG4gIGFzc2VydE5vdENvbXBsZXgoeCwgJ3VuaXF1ZScpO1xuXG4gIC8vIEZvciBub3csIGFsd2F5cyBmb3J3YXJkIGNhbGN1bGF0aW9uIHRvIHRoZSBDUFUgYmFja2VuZC5cbiAgY29uc29sZS53YXJuKFxuICAgICAgJ1dBUk5JTkc6ICcsXG4gICAgICAnVUkgbWlnaHQgYmUgbG9ja2VkIHRlbXBvcmFyaWx5IGFzIGRhdGEgaXMgYmVpbmcgZG93bmxvYWRlZCcpO1xuICBjb25zdCB2YWx1ZXMgPSBiYWNrZW5kLnJlYWRTeW5jKHguZGF0YUlkKTtcbiAgY29uc3Qge291dHB1dFZhbHVlcywgb3V0cHV0U2hhcGUsIGluZGljZXN9ID1cbiAgICAgIHVuaXF1ZUltcGxDUFUodmFsdWVzLCBheGlzLCB4LnNoYXBlLCB4LmR0eXBlKTtcbiAgcmV0dXJuIFtcbiAgICBiYWNrZW5kLm1ha2VUZW5zb3JJbmZvKG91dHB1dFNoYXBlLCB4LmR0eXBlLCBvdXRwdXRWYWx1ZXMpLFxuICAgIGJhY2tlbmQubWFrZVRlbnNvckluZm8oW2luZGljZXMubGVuZ3RoXSwgJ2ludDMyJywgaW5kaWNlcyksXG4gIF07XG59XG5cbmV4cG9ydCBjb25zdCB1bmlxdWVDb25maWc6IEtlcm5lbENvbmZpZyA9IHtcbiAga2VybmVsTmFtZTogVW5pcXVlLFxuICBiYWNrZW5kTmFtZTogJ3dlYmdsJyxcbiAga2VybmVsRnVuYzogdW5pcXVlIGFzIHt9IGFzIEtlcm5lbEZ1bmMsXG59O1xuIl19","/**\n * @license\n * Copyright 2020 Google LLC. All Rights Reserved.\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n * =============================================================================\n */\nimport { Unpack } from '@tensorflow/tfjs-core';\nimport { reshape } from './Reshape';\nimport { slice } from './Slice';\nexport function unpack(args) {\n const { inputs, backend, attrs } = args;\n const { value } = inputs;\n let { axis } = attrs;\n if (axis < 0) {\n axis += value.shape.length;\n }\n const x = value;\n const xRank = x.shape.length;\n const num = value.shape[axis];\n const outShape = new Array(xRank - 1);\n let outIndex = 0;\n for (let i = 0; i < xRank; i++) {\n if (i !== axis) {\n outShape[outIndex++] = x.shape[i];\n }\n }\n const toDispose = [];\n const begin = new Array(xRank).fill(0);\n const size = x.shape.slice();\n size[axis] = 1;\n const res = new Array(num);\n for (let i = 0; i < res.length; i++) {\n begin[axis] = i;\n const sliced = slice({ inputs: { x }, backend, attrs: { begin, size } });\n const reshaped = reshape({ inputs: { x: sliced }, backend, attrs: { shape: outShape } });\n res[i] = reshaped;\n toDispose.push(sliced);\n }\n toDispose.forEach(t => backend.disposeIntermediateTensorInfo(t));\n return res;\n}\nexport const unpackConfig = {\n kernelName: Unpack,\n backendName: 'webgl',\n kernelFunc: unpack\n};\n//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiVW5wYWNrLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vLi4vdGZqcy1iYWNrZW5kLXdlYmdsL3NyYy9rZXJuZWxzL1VucGFjay50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQTs7Ozs7Ozs7Ozs7Ozs7O0dBZUc7QUFFSCxPQUFPLEVBQXVDLE1BQU0sRUFBNEIsTUFBTSx1QkFBdUIsQ0FBQztBQUk5RyxPQUFPLEVBQUMsT0FBTyxFQUFDLE1BQU0sV0FBVyxDQUFDO0FBQ2xDLE9BQU8sRUFBQyxLQUFLLEVBQUMsTUFBTSxTQUFTLENBQUM7QUFFOUIsTUFBTSxVQUFVLE1BQU0sQ0FDbEIsSUFDeUU7SUFFM0UsTUFBTSxFQUFDLE1BQU0sRUFBRSxPQUFPLEVBQUUsS0FBSyxFQUFDLEdBQUcsSUFBSSxDQUFDO0lBQ3RDLE1BQU0sRUFBQyxLQUFLLEVBQUMsR0FBRyxNQUFNLENBQUM7SUFDdkIsSUFBSSxFQUFDLElBQUksRUFBQyxHQUFHLEtBQUssQ0FBQztJQUVuQixJQUFJLElBQUksR0FBRyxDQUFDLEVBQUU7UUFDWixJQUFJLElBQUksS0FBSyxDQUFDLEtBQUssQ0FBQyxNQUFNLENBQUM7S0FDNUI7SUFFRCxNQUFNLENBQUMsR0FBRyxLQUFLLENBQUM7SUFDaEIsTUFBTSxLQUFLLEdBQUcsQ0FBQyxDQUFDLEtBQUssQ0FBQyxNQUFNLENBQUM7SUFFN0IsTUFBTSxHQUFHLEdBQUcsS0FBSyxDQUFDLEtBQUssQ0FBQyxJQUFJLENBQUMsQ0FBQztJQUM5QixNQUFNLFFBQVEsR0FBYSxJQUFJLEtBQUssQ0FBQyxLQUFLLEdBQUcsQ0FBQyxDQUFDLENBQUM7SUFDaEQsSUFBSSxRQUFRLEdBQUcsQ0FBQyxDQUFDO0lBQ2pCLEtBQUssSUFBSSxDQUFDLEdBQUcsQ0FBQyxFQUFFLENBQUMsR0FBRyxLQUFLLEVBQUUsQ0FBQyxFQUFFLEVBQUU7UUFDOUIsSUFBSSxDQUFDLEtBQUssSUFBSSxFQUFFO1lBQ2QsUUFBUSxDQUFDLFFBQVEsRUFBRSxDQUFDLEdBQUcsQ0FBQyxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUMsQ0FBQztTQUNuQztLQUNGO0lBRUQsTUFBTSxTQUFTLEdBQUcsRUFBRSxDQUFDO0lBRXJCLE1BQU0sS0FBSyxHQUFHLElBQUksS0FBSyxDQUFDLEtBQUssQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsQ0FBQztJQUN2QyxNQUFNLElBQUksR0FBRyxDQUFDLENBQUMsS0FBSyxDQUFDLEtBQUssRUFBRSxDQUFDO0lBQzdCLElBQUksQ0FBQyxJQUFJLENBQUMsR0FBRyxDQUFDLENBQUM7SUFDZixNQUFNLEdBQUcsR0FBaUIsSUFBSSxLQUFLLENBQUMsR0FBRyxDQUFDLENBQUM7SUFDekMsS0FBSyxJQUFJLENBQUMsR0FBRyxDQUFDLEVBQUUsQ0FBQyxHQUFHLEdBQUcsQ0FBQyxNQUFNLEVBQUUsQ0FBQyxFQUFFLEVBQUU7UUFDbkMsS0FBSyxDQUFDLElBQUksQ0FBQyxHQUFHLENBQUMsQ0FBQztRQUNoQixNQUFNLE1BQU0sR0FBRyxLQUFLLENBQUMsRUFBQyxNQUFNLEVBQUUsRUFBQyxDQUFDLEVBQUMsRUFBRSxPQUFPLEVBQUUsS0FBSyxFQUFFLEVBQUMsS0FBSyxFQUFFLElBQUksRUFBQyxFQUFDLENBQUMsQ0FBQztRQUNuRSxNQUFNLFFBQVEsR0FDVixPQUFPLENBQUMsRUFBQyxNQUFNLEVBQUUsRUFBQyxDQUFDLEVBQUUsTUFBTSxFQUFDLEVBQUUsT0FBTyxFQUFFLEtBQUssRUFBRSxFQUFDLEtBQUssRUFBRSxRQUFRLEVBQUMsRUFBQyxDQUFDLENBQUM7UUFDdEUsR0FBRyxDQUFDLENBQUMsQ0FBQyxHQUFHLFFBQVEsQ0FBQztRQUVsQixTQUFTLENBQUMsSUFBSSxDQUFDLE1BQU0sQ0FBQyxDQUFDO0tBQ3hCO0lBRUQsU0FBUyxDQUFDLE9BQU8sQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLE9BQU8sQ0FBQyw2QkFBNkIsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDO0lBQ2pFLE9BQU8sR0FBRyxDQUFDO0FBQ2IsQ0FBQztBQUVELE1BQU0sQ0FBQyxNQUFNLFlBQVksR0FBaUI7SUFDeEMsVUFBVSxFQUFFLE1BQU07SUFDbEIsV0FBVyxFQUFFLE9BQU87SUFDcEIsVUFBVSxFQUFFLE1BQTBCO0NBQ3ZDLENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyIvKipcbiAqIEBsaWNlbnNlXG4gKiBDb3B5cmlnaHQgMjAyMCBHb29nbGUgTExDLiBBbGwgUmlnaHRzIFJlc2VydmVkLlxuICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlIFwiTGljZW5zZVwiKTtcbiAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS5cbiAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdFxuICpcbiAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMFxuICpcbiAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmVcbiAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuIFwiQVMgSVNcIiBCQVNJUyxcbiAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLlxuICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZFxuICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuXG4gKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuICovXG5cbmltcG9ydCB7S2VybmVsQ29uZmlnLCBLZXJuZWxGdW5jLCBUZW5zb3JJbmZvLCBVbnBhY2ssIFVucGFja0F0dHJzLCBVbnBhY2tJbnB1dHN9IGZyb20gJ0B0ZW5zb3JmbG93L3RmanMtY29yZSc7XG5cbmltcG9ydCB7TWF0aEJhY2tlbmRXZWJHTH0gZnJvbSAnLi4vYmFja2VuZF93ZWJnbCc7XG5cbmltcG9ydCB7cmVzaGFwZX0gZnJvbSAnLi9SZXNoYXBlJztcbmltcG9ydCB7c2xpY2V9IGZyb20gJy4vU2xpY2UnO1xuXG5leHBvcnQgZnVuY3Rpb24gdW5wYWNrKFxuICAgIGFyZ3M6XG4gICAgICAgIHtpbnB1dHM6IFVucGFja0lucHV0cywgYmFja2VuZDogTWF0aEJhY2tlbmRXZWJHTCwgYXR0cnM6IFVucGFja0F0dHJzfSk6XG4gICAgVGVuc29ySW5mb1tdIHtcbiAgY29uc3Qge2lucHV0cywgYmFja2VuZCwgYXR0cnN9ID0gYXJncztcbiAgY29uc3Qge3ZhbHVlfSA9IGlucHV0cztcbiAgbGV0IHtheGlzfSA9IGF0dHJzO1xuXG4gIGlmIChheGlzIDwgMCkge1xuICAgIGF4aXMgKz0gdmFsdWUuc2hhcGUubGVuZ3RoO1xuICB9XG5cbiAgY29uc3QgeCA9IHZhbHVlO1xuICBjb25zdCB4UmFuayA9IHguc2hhcGUubGVuZ3RoO1xuXG4gIGNvbnN0IG51bSA9IHZhbHVlLnNoYXBlW2F4aXNdO1xuICBjb25zdCBvdXRTaGFwZTogbnVtYmVyW10gPSBuZXcgQXJyYXkoeFJhbmsgLSAxKTtcbiAgbGV0IG91dEluZGV4ID0gMDtcbiAgZm9yIChsZXQgaSA9IDA7IGkgPCB4UmFuazsgaSsrKSB7XG4gICAgaWYgKGkgIT09IGF4aXMpIHtcbiAgICAgIG91dFNoYXBlW291dEluZGV4KytdID0geC5zaGFwZVtpXTtcbiAgICB9XG4gIH1cblxuICBjb25zdCB0b0Rpc3Bvc2UgPSBbXTtcblxuICBjb25zdCBiZWdpbiA9IG5ldyBBcnJheSh4UmFuaykuZmlsbCgwKTtcbiAgY29uc3Qgc2l6ZSA9IHguc2hhcGUuc2xpY2UoKTtcbiAgc2l6ZVtheGlzXSA9IDE7XG4gIGNvbnN0IHJlczogVGVuc29ySW5mb1tdID0gbmV3IEFycmF5KG51bSk7XG4gIGZvciAobGV0IGkgPSAwOyBpIDwgcmVzLmxlbmd0aDsgaSsrKSB7XG4gICAgYmVnaW5bYXhpc10gPSBpO1xuICAgIGNvbnN0IHNsaWNlZCA9IHNsaWNlKHtpbnB1dHM6IHt4fSwgYmFja2VuZCwgYXR0cnM6IHtiZWdpbiwgc2l6ZX19KTtcbiAgICBjb25zdCByZXNoYXBlZCA9XG4gICAgICAgIHJlc2hhcGUoe2lucHV0czoge3g6IHNsaWNlZH0sIGJhY2tlbmQsIGF0dHJzOiB7c2hhcGU6IG91dFNoYXBlfX0pO1xuICAgIHJlc1tpXSA9IHJlc2hhcGVkO1xuXG4gICAgdG9EaXNwb3NlLnB1c2goc2xpY2VkKTtcbiAgfVxuXG4gIHRvRGlzcG9zZS5mb3JFYWNoKHQgPT4gYmFja2VuZC5kaXNwb3NlSW50ZXJtZWRpYXRlVGVuc29ySW5mbyh0KSk7XG4gIHJldHVybiByZXM7XG59XG5cbmV4cG9ydCBjb25zdCB1bnBhY2tDb25maWc6IEtlcm5lbENvbmZpZyA9IHtcbiAga2VybmVsTmFtZTogVW5wYWNrLFxuICBiYWNrZW5kTmFtZTogJ3dlYmdsJyxcbiAga2VybmVsRnVuYzogdW5wYWNrIGFzIHt9IGFzIEtlcm5lbEZ1bmNcbn07XG4iXX0=","/**\n * @license\n * Copyright 2018 Google LLC. All Rights Reserved.\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n * =============================================================================\n */\nexport class SegmentOpProgram {\n constructor(segOpInfo, segOpType) {\n this.variableNames = ['x', 'segmentIds'];\n const windowSize = segOpInfo.windowSize;\n const batchSize = segOpInfo.batchSize;\n const inSize = segOpInfo.inSize;\n const numSegments = segOpInfo.numSegments;\n const outSize = numSegments * Math.ceil(inSize / windowSize);\n this.outputShape = [batchSize, outSize];\n const initializationValue = '0.0';\n const returnValue = `sumValue`;\n const windowSizeNearestVec4 = Math.floor(windowSize / 4) * 4;\n const windowSizeVec4Remainder = windowSize % 4;\n const updateSnippet = `\n sumValue += dot(values, segFilter);\n `;\n let checkValueOutOfBounds = '';\n if (inSize % windowSize > 0) {\n checkValueOutOfBounds = `\n if (inIdx < 0 || inIdx >= ${inSize}) {\n return initializationValue;\n }\n `;\n }\n let checkSegmentIdOutOfBounds = '';\n if (inSize % windowSize > 0) {\n checkSegmentIdOutOfBounds = `\n if (inIdx < 0 || inIdx >= ${inSize}) {\n return -1.0;\n }\n `;\n }\n this.userCode = `\n const float initializationValue = ${initializationValue};\n\n float getValue(int batch, int inIdx) {\n ${checkValueOutOfBounds}\n return getX(batch, inIdx);\n }\n\n float getSegmentIdAtIndex(int inIdx) {\n ${checkSegmentIdOutOfBounds}\n return getSegmentIds(inIdx);\n }\n\n void main() {\n ivec2 coords = getOutputCoords();\n int batch = coords[0];\n int outIdx = coords[1];\n int inOffset = int(floor(float(outIdx) / float(\n ${numSegments})) * float(${windowSize}));\n int currentSeg = int(mod(float(outIdx), float(${numSegments})));\n\n float sumValue = 0.0;\n\n for (int i = 0; i < ${windowSizeNearestVec4}; i += 4) {\n int inIdx = inOffset + i;\n vec4 values = vec4(\n getValue(batch, inIdx),\n getValue(batch, inIdx + 1),\n getValue(batch, inIdx + 2),\n getValue(batch, inIdx + 3)\n );\n\n vec4 segFilter = vec4(\n int(getSegmentIdAtIndex(inIdx)) == currentSeg ? 1 : 0,\n int(getSegmentIdAtIndex(inIdx + 1)) == currentSeg ? 1 : 0,\n int(getSegmentIdAtIndex(inIdx + 2)) == currentSeg ? 1 : 0,\n int(getSegmentIdAtIndex(inIdx + 3)) == currentSeg ? 1 : 0\n );\n\n ${updateSnippet}\n }\n\n int inIdx = inOffset + ${windowSizeNearestVec4};\n if (${windowSizeVec4Remainder === 1}) {\n vec4 values = vec4(\n getValue(batch, inIdx),\n initializationValue,\n initializationValue,\n initializationValue\n );\n\n int inIdxSeg = int(getSegmentIdAtIndex(inIdx));\n\n vec4 segFilter = vec4(\n int(getSegmentIdAtIndex(inIdx)) == currentSeg ? 1 : 0,\n 0,\n 0,\n 0\n );\n\n ${updateSnippet}\n } else if (${windowSizeVec4Remainder === 2}) {\n vec4 values = vec4(\n getValue(batch, inIdx),\n getValue(batch, inIdx + 1),\n initializationValue,\n initializationValue\n );\n\n vec4 segFilter = vec4(\n int(getSegmentIdAtIndex(inIdx)) == currentSeg ? 1 : 0,\n int(getSegmentIdAtIndex(inIdx + 1)) == currentSeg ? 1 : 0,\n 0,\n 0\n );\n\n ${updateSnippet}\n } else if (${windowSizeVec4Remainder === 3}) {\n vec4 values = vec4(\n getValue(batch, inIdx),\n getValue(batch, inIdx + 1),\n getValue(batch, inIdx + 2),\n initializationValue\n );\n\n vec4 segFilter = vec4(\n int(getSegmentIdAtIndex(inIdx)) == currentSeg ? 1 : 0,\n int(getSegmentIdAtIndex(inIdx + 1)) == currentSeg ? 1 : 0,\n int(getSegmentIdAtIndex(inIdx + 2)) == currentSeg ? 1 : 0,\n 0\n );\n\n ${updateSnippet}\n }\n setOutput(${returnValue});\n }\n `;\n }\n}\n//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic2VnbWVudF9ncHUuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi90ZmpzLWJhY2tlbmQtd2ViZ2wvc3JjL3NlZ21lbnRfZ3B1LnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBOzs7Ozs7Ozs7Ozs7Ozs7R0FlRztBQUtILE1BQU0sT0FBTyxnQkFBZ0I7SUFLM0IsWUFDSSxTQUE4QyxFQUM5QyxTQUErQjtRQU5uQyxrQkFBYSxHQUFHLENBQUMsR0FBRyxFQUFFLFlBQVksQ0FBQyxDQUFDO1FBT2xDLE1BQU0sVUFBVSxHQUFHLFNBQVMsQ0FBQyxVQUFVLENBQUM7UUFDeEMsTUFBTSxTQUFTLEdBQUcsU0FBUyxDQUFDLFNBQVMsQ0FBQztRQUN0QyxNQUFNLE1BQU0sR0FBRyxTQUFTLENBQUMsTUFBTSxDQUFDO1FBQ2hDLE1BQU0sV0FBVyxHQUFHLFNBQVMsQ0FBQyxXQUFXLENBQUM7UUFDMUMsTUFBTSxPQUFPLEdBQUcsV0FBVyxHQUFHLElBQUksQ0FBQyxJQUFJLENBQUMsTUFBTSxHQUFHLFVBQVUsQ0FBQyxDQUFDO1FBQzdELElBQUksQ0FBQyxXQUFXLEdBQUcsQ0FBQyxTQUFTLEVBQUUsT0FBTyxDQUFDLENBQUM7UUFFeEMsTUFBTSxtQkFBbUIsR0FBRyxLQUFLLENBQUM7UUFDbEMsTUFBTSxXQUFXLEdBQUcsVUFBVSxDQUFDO1FBRS9CLE1BQU0scUJBQXFCLEdBQUcsSUFBSSxDQUFDLEtBQUssQ0FBQyxVQUFVLEdBQUcsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDO1FBQzdELE1BQU0sdUJBQXVCLEdBQUcsVUFBVSxHQUFHLENBQUMsQ0FBQztRQUUvQyxNQUFNLGFBQWEsR0FBRzs7S0FFckIsQ0FBQztRQUVGLElBQUkscUJBQXFCLEdBQUcsRUFBRSxDQUFDO1FBQy9CLElBQUksTUFBTSxHQUFHLFVBQVUsR0FBRyxDQUFDLEVBQUU7WUFDM0IscUJBQXFCLEdBQUc7b0NBQ00sTUFBTTs7O09BR25DLENBQUM7U0FDSDtRQUVELElBQUkseUJBQXlCLEdBQUcsRUFBRSxDQUFDO1FBQ25DLElBQUksTUFBTSxHQUFHLFVBQVUsR0FBRyxDQUFDLEVBQUU7WUFDM0IseUJBQXlCLEdBQUc7b0NBQ0UsTUFBTTs7O09BR25DLENBQUM7U0FDSDtRQUVELElBQUksQ0FBQyxRQUFRLEdBQUc7MENBQ3NCLG1CQUFtQjs7O1VBR25ELHFCQUFxQjs7Ozs7VUFLckIseUJBQXlCOzs7Ozs7Ozs7WUFTdkIsV0FBVyxjQUFjLFVBQVU7d0RBQ1MsV0FBVzs7Ozs4QkFJckMscUJBQXFCOzs7Ozs7Ozs7Ozs7Ozs7O1lBZ0J2QyxhQUFhOzs7aUNBR1EscUJBQXFCO2NBQ3hDLHVCQUF1QixLQUFLLENBQUM7Ozs7Ozs7Ozs7Ozs7Ozs7O1lBaUIvQixhQUFhO3FCQUNKLHVCQUF1QixLQUFLLENBQUM7Ozs7Ozs7Ozs7Ozs7OztZQWV0QyxhQUFhO3FCQUNKLHVCQUF1QixLQUFLLENBQUM7Ozs7Ozs7Ozs7Ozs7OztZQWV0QyxhQUFhOztvQkFFTCxXQUFXOztLQUUxQixDQUFDO0lBQ0osQ0FBQztDQUNGIiwic291cmNlc0NvbnRlbnQiOlsiLyoqXG4gKiBAbGljZW5zZVxuICogQ29weXJpZ2h0IDIwMTggR29vZ2xlIExMQy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC5cbiAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSBcIkxpY2Vuc2VcIik7XG4gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuXG4gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXRcbiAqXG4gKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjBcbiAqXG4gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlXG4gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiBcIkFTIElTXCIgQkFTSVMsXG4gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC5cbiAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmRcbiAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLlxuICogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbiAqL1xuXG5pbXBvcnQge2JhY2tlbmRfdXRpbH0gZnJvbSAnQHRlbnNvcmZsb3cvdGZqcy1jb3JlJztcbmltcG9ydCB7R1BHUFVQcm9ncmFtfSBmcm9tICcuL2dwZ3B1X21hdGgnO1xuXG5leHBvcnQgY2xhc3MgU2VnbWVudE9wUHJvZ3JhbSBpbXBsZW1lbnRzIEdQR1BVUHJvZ3JhbSB7XG4gIHZhcmlhYmxlTmFtZXMgPSBbJ3gnLCAnc2VnbWVudElkcyddO1xuICBvdXRwdXRTaGFwZTogbnVtYmVyW107XG4gIHVzZXJDb2RlOiBzdHJpbmc7XG5cbiAgY29uc3RydWN0b3IoXG4gICAgICBzZWdPcEluZm86IGJhY2tlbmRfdXRpbC5zZWdtZW50X3V0aWwuU2VnT3BJbmZvLFxuICAgICAgc2VnT3BUeXBlOiAndW5zb3J0ZWRTZWdtZW50U3VtJykge1xuICAgIGNvbnN0IHdpbmRvd1NpemUgPSBzZWdPcEluZm8ud2luZG93U2l6ZTtcbiAgICBjb25zdCBiYXRjaFNpemUgPSBzZWdPcEluZm8uYmF0Y2hTaXplO1xuICAgIGNvbnN0IGluU2l6ZSA9IHNlZ09wSW5mby5pblNpemU7XG4gICAgY29uc3QgbnVtU2VnbWVudHMgPSBzZWdPcEluZm8ubnVtU2VnbWVudHM7XG4gICAgY29uc3Qgb3V0U2l6ZSA9IG51bVNlZ21lbnRzICogTWF0aC5jZWlsKGluU2l6ZSAvIHdpbmRvd1NpemUpO1xuICAgIHRoaXMub3V0cHV0U2hhcGUgPSBbYmF0Y2hTaXplLCBvdXRTaXplXTtcblxuICAgIGNvbnN0IGluaXRpYWxpemF0aW9uVmFsdWUgPSAnMC4wJztcbiAgICBjb25zdCByZXR1cm5WYWx1ZSA9IGBzdW1WYWx1ZWA7XG5cbiAgICBjb25zdCB3aW5kb3dTaXplTmVhcmVzdFZlYzQgPSBNYXRoLmZsb29yKHdpbmRvd1NpemUgLyA0KSAqIDQ7XG4gICAgY29uc3Qgd2luZG93U2l6ZVZlYzRSZW1haW5kZXIgPSB3aW5kb3dTaXplICUgNDtcblxuICAgIGNvbnN0IHVwZGF0ZVNuaXBwZXQgPSBgXG4gICAgICAgIHN1bVZhbHVlICs9IGRvdCh2YWx1ZXMsIHNlZ0ZpbHRlcik7XG4gICAgYDtcblxuICAgIGxldCBjaGVja1ZhbHVlT3V0T2ZCb3VuZHMgPSAnJztcbiAgICBpZiAoaW5TaXplICUgd2luZG93U2l6ZSA+IDApIHtcbiAgICAgIGNoZWNrVmFsdWVPdXRPZkJvdW5kcyA9IGBcbiAgICAgICAgaWYgKGluSWR4IDwgMCB8fCBpbklkeCA+PSAke2luU2l6ZX0pIHtcbiAgICAgICAgICByZXR1cm4gaW5pdGlhbGl6YXRpb25WYWx1ZTtcbiAgICAgICAgfVxuICAgICAgYDtcbiAgICB9XG5cbiAgICBsZXQgY2hlY2tTZWdtZW50SWRPdXRPZkJvdW5kcyA9ICcnO1xuICAgIGlmIChpblNpemUgJSB3aW5kb3dTaXplID4gMCkge1xuICAgICAgY2hlY2tTZWdtZW50SWRPdXRPZkJvdW5kcyA9IGBcbiAgICAgICAgaWYgKGluSWR4IDwgMCB8fCBpbklkeCA+PSAke2luU2l6ZX0pIHtcbiAgICAgICAgICByZXR1cm4gLTEuMDtcbiAgICAgICAgfVxuICAgICAgYDtcbiAgICB9XG5cbiAgICB0aGlzLnVzZXJDb2RlID0gYFxuICAgICAgY29uc3QgZmxvYXQgaW5pdGlhbGl6YXRpb25WYWx1ZSA9ICR7aW5pdGlhbGl6YXRpb25WYWx1ZX07XG5cbiAgICAgIGZsb2F0IGdldFZhbHVlKGludCBiYXRjaCwgaW50IGluSWR4KSB7XG4gICAgICAgICR7Y2hlY2tWYWx1ZU91dE9mQm91bmRzfVxuICAgICAgICByZXR1cm4gZ2V0WChiYXRjaCwgaW5JZHgpO1xuICAgICAgfVxuXG4gICAgICBmbG9hdCBnZXRTZWdtZW50SWRBdEluZGV4KGludCBpbklkeCkge1xuICAgICAgICAke2NoZWNrU2VnbWVudElkT3V0T2ZCb3VuZHN9XG4gICAgICAgIHJldHVybiBnZXRTZWdtZW50SWRzKGluSWR4KTtcbiAgICAgIH1cblxuICAgICAgdm9pZCBtYWluKCkge1xuICAgICAgICBpdmVjMiBjb29yZHMgPSBnZXRPdXRwdXRDb29yZHMoKTtcbiAgICAgICAgaW50IGJhdGNoID0gY29vcmRzWzBdO1xuICAgICAgICBpbnQgb3V0SWR4ID0gY29vcmRzWzFdO1xuICAgICAgICBpbnQgaW5PZmZzZXQgPSBpbnQoZmxvb3IoZmxvYXQob3V0SWR4KSAvIGZsb2F0KFxuICAgICAgICAgICR7bnVtU2VnbWVudHN9KSkgKiBmbG9hdCgke3dpbmRvd1NpemV9KSk7XG4gICAgICAgIGludCBjdXJyZW50U2VnID0gaW50KG1vZChmbG9hdChvdXRJZHgpLCBmbG9hdCgke251bVNlZ21lbnRzfSkpKTtcblxuICAgICAgICBmbG9hdCBzdW1WYWx1ZSA9IDAuMDtcblxuICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8ICR7d2luZG93U2l6ZU5lYXJlc3RWZWM0fTsgaSArPSA0KSB7XG4gICAgICAgICAgaW50IGluSWR4ID0gaW5PZmZzZXQgKyBpO1xuICAgICAgICAgIHZlYzQgdmFsdWVzID0gdmVjNChcbiAgICAgICAgICAgIGdldFZhbHVlKGJhdGNoLCBpbklkeCksXG4gICAgICAgICAgICBnZXRWYWx1ZShiYXRjaCwgaW5JZHggKyAxKSxcbiAgICAgICAgICAgIGdldFZhbHVlKGJhdGNoLCBpbklkeCArIDIpLFxuICAgICAgICAgICAgZ2V0VmFsdWUoYmF0Y2gsIGluSWR4ICsgMylcbiAgICAgICAgICApO1xuXG4gICAgICAgICAgdmVjNCBzZWdGaWx0ZXIgPSB2ZWM0KFxuICAgICAgICAgICAgaW50KGdldFNlZ21lbnRJZEF0SW5kZXgoaW5JZHgpKSA9PSBjdXJyZW50U2VnID8gMSA6IDAsXG4gICAgICAgICAgICBpbnQoZ2V0U2VnbWVudElkQXRJbmRleChpbklkeCArIDEpKSA9PSBjdXJyZW50U2VnID8gMSA6IDAsXG4gICAgICAgICAgICBpbnQoZ2V0U2VnbWVudElkQXRJbmRleChpbklkeCArIDIpKSA9PSBjdXJyZW50U2VnID8gMSA6IDAsXG4gICAgICAgICAgICBpbnQoZ2V0U2VnbWVudElkQXRJbmRleChpbklkeCArIDMpKSA9PSBjdXJyZW50U2VnID8gMSA6IDBcbiAgICAgICAgICApO1xuXG4gICAgICAgICAgJHt1cGRhdGVTbmlwcGV0fVxuICAgICAgICB9XG5cbiAgICAgICAgaW50IGluSWR4ID0gaW5PZmZzZXQgKyAke3dpbmRvd1NpemVOZWFyZXN0VmVjNH07XG4gICAgICAgIGlmICgke3dpbmRvd1NpemVWZWM0UmVtYWluZGVyID09PSAxfSkge1xuICAgICAgICAgIHZlYzQgdmFsdWVzID0gdmVjNChcbiAgICAgICAgICAgIGdldFZhbHVlKGJhdGNoLCBpbklkeCksXG4gICAgICAgICAgICBpbml0aWFsaXphdGlvblZhbHVlLFxuICAgICAgICAgICAgaW5pdGlhbGl6YXRpb25WYWx1ZSxcbiAgICAgICAgICAgIGluaXRpYWxpemF0aW9uVmFsdWVcbiAgICAgICAgICApO1xuXG4gICAgICAgICAgaW50IGluSWR4U2VnID0gaW50KGdldFNlZ21lbnRJZEF0SW5kZXgoaW5JZHgpKTtcblxuICAgICAgICAgIHZlYzQgc2VnRmlsdGVyID0gdmVjNChcbiAgICAgICAgICAgIGludChnZXRTZWdtZW50SWRBdEluZGV4KGluSWR4KSkgPT0gY3VycmVudFNlZyA/IDEgOiAwLFxuICAgICAgICAgICAgMCxcbiAgICAgICAgICAgIDAsXG4gICAgICAgICAgICAwXG4gICAgICAgICAgKTtcblxuICAgICAgICAgICR7dXBkYXRlU25pcHBldH1cbiAgICAgICAgfSBlbHNlIGlmICgke3dpbmRvd1NpemVWZWM0UmVtYWluZGVyID09PSAyfSkge1xuICAgICAgICAgIHZlYzQgdmFsdWVzID0gdmVjNChcbiAgICAgICAgICAgIGdldFZhbHVlKGJhdGNoLCBpbklkeCksXG4gICAgICAgICAgICBnZXRWYWx1ZShiYXRjaCwgaW5JZHggKyAxKSxcbiAgICAgICAgICAgIGluaXRpYWxpemF0aW9uVmFsdWUsXG4gICAgICAgICAgICBpbml0aWFsaXphdGlvblZhbHVlXG4gICAgICAgICAgKTtcblxuICAgICAgICAgIHZlYzQgc2VnRmlsdGVyID0gdmVjNChcbiAgICAgICAgICAgIGludChnZXRTZWdtZW50SWRBdEluZGV4KGluSWR4KSkgPT0gY3VycmVudFNlZyA/IDEgOiAwLFxuICAgICAgICAgICAgaW50KGdldFNlZ21lbnRJZEF0SW5kZXgoaW5JZHggKyAxKSkgPT0gY3VycmVudFNlZyA/IDEgOiAwLFxuICAgICAgICAgICAgICAwLFxuICAgICAgICAgICAgICAwXG4gICAgICAgICAgKTtcblxuICAgICAgICAgICR7dXBkYXRlU25pcHBldH1cbiAgICAgICAgfSBlbHNlIGlmICgke3dpbmRvd1NpemVWZWM0UmVtYWluZGVyID09PSAzfSkge1xuICAgICAgICAgIHZlYzQgdmFsdWVzID0gdmVjNChcbiAgICAgICAgICAgIGdldFZhbHVlKGJhdGNoLCBpbklkeCksXG4gICAgICAgICAgICBnZXRWYWx1ZShiYXRjaCwgaW5JZHggKyAxKSxcbiAgICAgICAgICAgIGdldFZhbHVlKGJhdGNoLCBpbklkeCArIDIpLFxuICAgICAgICAgICAgaW5pdGlhbGl6YXRpb25WYWx1ZVxuICAgICAgICAgICk7XG5cbiAgICAgICAgICB2ZWM0IHNlZ0ZpbHRlciA9IHZlYzQoXG4gICAgICAgICAgICBpbnQoZ2V0U2VnbWVudElkQXRJbmRleChpbklkeCkpID09IGN1cnJlbnRTZWcgPyAxIDogMCxcbiAgICAgICAgICAgIGludChnZXRTZWdtZW50SWRBdEluZGV4KGluSWR4ICsgMSkpID09IGN1cnJlbnRTZWcgPyAxIDogMCxcbiAgICAgICAgICAgIGludChnZXRTZWdtZW50SWRBdEluZGV4KGluSWR4ICsgMikpID09IGN1cnJlbnRTZWcgPyAxIDogMCxcbiAgICAgICAgICAgIDBcbiAgICAgICAgICApO1xuXG4gICAgICAgICAgJHt1cGRhdGVTbmlwcGV0fVxuICAgICAgICB9XG4gICAgICAgIHNldE91dHB1dCgke3JldHVyblZhbHVlfSk7XG4gICAgICB9XG4gICAgYDtcbiAgfVxufVxuIl19","/**\n * @license\n * Copyright 2020 Google LLC. All Rights Reserved.\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n * =============================================================================\n */\nimport { backend_util, sumOutType, UnsortedSegmentSum, util } from '@tensorflow/tfjs-core';\nimport { SegmentOpProgram } from '../segment_gpu';\nimport { range } from './Range';\nimport { reshape } from './Reshape';\nimport { tile } from './Tile';\nimport { transpose } from './Transpose';\nexport function unsortedSegmentSum(args) {\n const { inputs, backend, attrs } = args;\n const { x, segmentIds } = inputs;\n const { numSegments } = attrs;\n const xRank = x.shape.length;\n const toDispose = [];\n let axis = 0;\n const permutation = backend_util.getAxesPermutation([axis], xRank);\n let permutedX = x;\n if (permutation != null) {\n permutedX = transpose({ inputs: { x }, backend, attrs: { perm: permutation } });\n toDispose.push(permutedX);\n axis = backend_util.getInnerMostAxes(1, xRank)[0];\n }\n const outShape = backend_util.segment_util.computeOutShape(permutedX.shape, axis, numSegments);\n const inSize = util.sizeFromShape([permutedX.shape[axis]]);\n const a2D = reshape({ inputs: { x: permutedX }, backend, attrs: { shape: [-1, inSize] } });\n toDispose.push(a2D);\n const outputDType = sumOutType(x.dtype);\n const segOpCompute = (x, segOpType, segmentIds, dtype, numSegments) => {\n const batchSize = x.shape[0];\n const inSize = x.shape[1];\n const windowSize = backend_util.segment_util.segOpComputeOptimalWindowSize(inSize, numSegments);\n const segOpInfo = { windowSize, inSize, batchSize, numSegments };\n const program = new SegmentOpProgram(segOpInfo, segOpType);\n const output = backend.compileAndRun(program, [x, segmentIds], dtype);\n toDispose.push(output);\n // No need to run another GPGPU program.\n if (output.shape[1] === numSegments) {\n return output;\n }\n const rangeInfo = range({\n backend,\n attrs: { start: 0, stop: numSegments, step: 1, dtype: 'float32' }\n });\n const tileInfo = tile({\n inputs: { x: rangeInfo },\n backend,\n attrs: { reps: [inSize / windowSize] }\n });\n toDispose.push(rangeInfo);\n toDispose.push(tileInfo);\n const result = segOpCompute(output, segOpType, tileInfo, dtype, numSegments);\n return result;\n };\n const segOpResult = segOpCompute(a2D, 'unsortedSegmentSum', segmentIds, outputDType, numSegments);\n const reshaped = reshape({ inputs: { x: segOpResult }, backend, attrs: { shape: outShape } });\n let result = reshaped;\n if (permutation != null) {\n toDispose.push(reshaped);\n const perm = backend_util.getUndoAxesPermutation(permutation);\n result = transpose({ inputs: { x: result }, backend, attrs: { perm } });\n }\n toDispose.forEach(t => backend.disposeIntermediateTensorInfo(t));\n return result;\n}\nexport const unsortedSegmentSumConfig = {\n kernelName: UnsortedSegmentSum,\n backendName: 'webgl',\n kernelFunc: unsortedSegmentSum\n};\n//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiVW5zb3J0ZWRTZWdtZW50U3VtLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vLi4vdGZqcy1iYWNrZW5kLXdlYmdsL3NyYy9rZXJuZWxzL1Vuc29ydGVkU2VnbWVudFN1bS50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQTs7Ozs7Ozs7Ozs7Ozs7O0dBZUc7QUFFSCxPQUFPLEVBQUMsWUFBWSxFQUFzQyxVQUFVLEVBQWMsa0JBQWtCLEVBQXFELElBQUksRUFBQyxNQUFNLHVCQUF1QixDQUFDO0FBRzVMLE9BQU8sRUFBQyxnQkFBZ0IsRUFBQyxNQUFNLGdCQUFnQixDQUFDO0FBRWhELE9BQU8sRUFBQyxLQUFLLEVBQUMsTUFBTSxTQUFTLENBQUM7QUFDOUIsT0FBTyxFQUFDLE9BQU8sRUFBQyxNQUFNLFdBQVcsQ0FBQztBQUNsQyxPQUFPLEVBQUMsSUFBSSxFQUFDLE1BQU0sUUFBUSxDQUFDO0FBQzVCLE9BQU8sRUFBQyxTQUFTLEVBQUMsTUFBTSxhQUFhLENBQUM7QUFFdEMsTUFBTSxVQUFVLGtCQUFrQixDQUFDLElBSWxDO0lBQ0MsTUFBTSxFQUFDLE1BQU0sRUFBRSxPQUFPLEVBQUUsS0FBSyxFQUFDLEdBQUcsSUFBSSxDQUFDO0lBQ3RDLE1BQU0sRUFBQyxDQUFDLEVBQUUsVUFBVSxFQUFDLEdBQUcsTUFBTSxDQUFDO0lBQy9CLE1BQU0sRUFBQyxXQUFXLEVBQUMsR0FBRyxLQUFLLENBQUM7SUFFNUIsTUFBTSxLQUFLLEdBQUcsQ0FBQyxDQUFDLEtBQUssQ0FBQyxNQUFNLENBQUM7SUFFN0IsTUFBTSxTQUFTLEdBQUcsRUFBRSxDQUFDO0lBRXJCLElBQUksSUFBSSxHQUFHLENBQUMsQ0FBQztJQUNiLE1BQU0sV0FBVyxHQUFHLFlBQVksQ0FBQyxrQkFBa0IsQ0FBQyxDQUFDLElBQUksQ0FBQyxFQUFFLEtBQUssQ0FBQyxDQUFDO0lBQ25FLElBQUksU0FBUyxHQUFHLENBQUMsQ0FBQztJQUNsQixJQUFJLFdBQVcs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RUFBRSxLQUFLLEVBQUUsV0FBVyxDQUFDLENBQUM7UUFDbEUsT0FBTyxNQUFNLENBQUM7SUFDaEIsQ0FBQyxDQUFDO0lBRU4sTUFBTSxXQUFXLEdBQUcsWUFBWSxDQUM1QixHQUFHLEVBQUUsb0JBQW9CLEVBQUUsVUFBVSxFQUFFLFdBQVcsRUFBRSxXQUFXLENBQUMsQ0FBQztJQUVyRSxNQUFNLFFBQVEsR0FDVixPQUFPLENBQUMsRUFBQyxNQUFNLEVBQUUsRUFBQyxDQUFDLEVBQUUsV0FBVyxFQUFDLEVBQUUsT0FBTyxFQUFFLEtBQUssRUFBRSxFQUFDLEtBQUssRUFBRSxRQUFRLEVBQUMsRUFBQyxDQUFDLENBQUM7SUFFM0UsSUFBSSxNQUFNLEdBQUcsUUFBUSxDQUFDO0lBQ3RCLElBQUksV0FBVyxJQUFJLElBQUksRUFBRTtRQUN2QixTQUFTLENBQUMsSUFBSSxDQUFDLFFBQVEsQ0FBQyxDQUFDO1FBQ3pCLE1BQU0sSUFBSSxHQUFHLFlBQVksQ0FBQyxzQkFBc0IsQ0FBQyxXQUFXLENBQUMsQ0FBQztRQUM5RCxNQUFNLEdBQUcsU0FBUyxDQUFDLEVBQUMsTUFBTSxFQUFFLEVBQUMsQ0FBQyxFQUFFLE1BQU0sRUFBQyxFQUFFLE9BQU8sRUFBRSxLQUFLLEVBQUUsRUFBQyxJQUFJLEVBQUMsRUFBQyxDQUFDLENBQUM7S0FDbkU7SUFFRCxTQUFTLENBQUMsT0FBTyxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsT0FBTyxDQUFDLDZCQUE2QixDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUM7SUFDakUsT0FBTyxNQUFNLENBQUM7QUFDaEIsQ0FBQztBQUVELE1BQU0sQ0FBQyxNQUFNLHdCQUF3QixHQUFpQjtJQUNwRCxVQUFVLEVBQUUsa0JBQWtCO0lBQzlCLFdBQVcsRUFBRSxPQUFPO0lBQ3BCLFVBQVUsRUFBRSxrQkFBc0M7Q0FDbkQsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbIi8qKlxuICogQGxpY2Vuc2VcbiAqIENvcHlyaWdodCAyMDIwIEdvb2dsZSBMTEMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuXG4gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgXCJMaWNlbnNlXCIpO1xuICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLlxuICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0XG4gKlxuICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wXG4gKlxuICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZVxuICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gXCJBUyBJU1wiIEJBU0lTLFxuICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuXG4gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kXG4gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS5cbiAqID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4gKi9cblxuaW1wb3J0IHtiYWNrZW5kX3V0aWwsIERhdGFUeXBlLCBLZXJuZWxDb25maWcsIEtlcm5lbEZ1bmMsIHN1bU91dFR5cGUsIFRlbnNvckluZm8sIFVuc29ydGVkU2VnbWVudFN1bSwgVW5zb3J0ZWRTZWdtZW50U3VtQXR0cnMsIFVuc29ydGVkU2VnbWVudFN1bUlucHV0cywgdXRpbH0gZnJvbSAnQHRlbnNvcmZsb3cvdGZqcy1jb3JlJztcblxuaW1wb3J0IHtNYXRoQmFja2VuZFdlYkdMfSBmcm9tICcuLi9iYWNrZW5kX3dlYmdsJztcbmltcG9ydCB7U2VnbWVudE9wUHJvZ3JhbX0gZnJvbSAnLi4vc2VnbWVudF9ncHUnO1xuXG5pbXBvcnQge3JhbmdlfSBmcm9tICcuL1JhbmdlJztcbmltcG9ydCB7cmVzaGFwZX0gZnJvbSAnLi9SZXNoYXBlJztcbmltcG9ydCB7dGlsZX0gZnJvbSAnLi9UaWxlJztcbmltcG9ydCB7dHJhbnNwb3NlfSBmcm9tICcuL1RyYW5zcG9zZSc7XG5cbmV4cG9ydCBmdW5jdGlvbiB1bnNvcnRlZFNlZ21lbnRTdW0oYXJnczoge1xuICBpbnB1dHM6IFVuc29ydGVkU2VnbWVudFN1bUlucHV0cyxcbiAgYmFja2VuZDogTWF0aEJhY2tlbmRXZWJHTCxcbiAgYXR0cnM6IFVuc29ydGVkU2VnbWVudFN1bUF0dHJzXG59KTogVGVuc29ySW5mbyB7XG4gIGNvbnN0IHtpbnB1dHMsIGJhY2tlbmQsIGF0dHJzfSA9IGFyZ3M7XG4gIGNvbnN0IHt4LCBzZWdtZW50SWRzfSA9IGlucHV0cztcbiAgY29uc3Qge251bVNlZ21lbnRzfSA9IGF0dHJzO1xuXG4gIGNvbnN0IHhSYW5rID0geC5zaGFwZS5sZW5ndGg7XG5cbiAgY29uc3QgdG9EaXNwb3NlID0gW107XG5cbiAgbGV0IGF4aXMgPSAwO1xuICBjb25zdCBwZXJtdXRhdGlvbiA9IGJhY2tlbmRfdXRpbC5nZXRBeGVzUGVybXV0YXRpb24oW2F4aXNdLCB4UmFuayk7XG4gIGxldCBwZXJtdXRlZFggPSB4O1xuICBpZiAocGVybXV0YXRpb24gIT0gbnVsbCkge1xuICAgIHBlcm11dGVkWCA9IHRyYW5zcG9zZSh7aW5wdXRzOiB7eH0sIGJhY2tlbmQsIGF0dHJzOiB7cGVybTogcGVybXV0YXRpb259fSk7XG4gICAgdG9EaXNwb3NlLnB1c2gocGVybXV0ZWRYKTtcbiAgICBheGlzID0gYmFja2VuZF91dGlsLmdldElubmVyTW9zdEF4ZXMoMSwgeFJhbmspWzBdO1xuICB9XG5cbiAgY29uc3Qgb3V0U2hhcGUgPSBiYWNrZW5kX3V0aWwuc2VnbWVudF91dGlsLmNvbXB1dGVPdXRTaGFwZShcbiAgICAgIHBlcm11dGVkWC5zaGFwZSwgYXhpcywgbnVtU2VnbWVudHMpO1xuICBjb25zdCBpblNpemUgPSB1dGlsLnNpemVGcm9tU2hhcGUoW3Blcm11dGVkWC5zaGFwZVtheGlzXV0pO1xuICBjb25zdCBhMkQgPVxuICAgICAgcmVzaGFwZSh7aW5wdXRzOiB7eDogcGVybXV0ZWRYfSwgYmFja2VuZCwgYXR0cnM6IHtzaGFwZTogWy0xLCBpblNpemVdfX0pO1xuICB0b0Rpc3Bvc2UucHVzaChhMkQpO1xuXG4gIGNvbnN0IG91dHB1dERUeXBlID0gc3VtT3V0VHlwZSh4LmR0eXBlKTtcblxuICBjb25zdCBzZWdPcENvbXB1dGUgPVxuICAgICAgKHg6IFRlbnNvckluZm8sIHNlZ09wVHlwZTogJ3Vuc29ydGVkU2VnbWVudFN1bScsIHNlZ21lbnRJZHM6IFRlbnNvckluZm8sXG4gICAgICAgZHR5cGU6IERhdGFUeXBlLCBudW1TZWdtZW50czogbnVtYmVyKTogVGVuc29ySW5mbyA9PiB7XG4gICAgICAgIGNvbnN0IGJhdGNoU2l6ZSA9IHguc2hhcGVbMF07XG4gICAgICAgIGNvbnN0IGluU2l6ZSA9IHguc2hhcGVbMV07XG4gICAgICAgIGNvbnN0IHdpbmRvd1NpemUgPVxuICAgICAgICAgICAgYmFja2VuZF91dGlsLnNlZ21lbnRfdXRpbC5zZWdPcENvbXB1dGVPcHRpbWFsV2luZG93U2l6ZShcbiAgICAgICAgICAgICAgICBpblNpemUsIG51bVNlZ21lbnRzKTtcbiAgICAgICAgY29uc3Qgc2VnT3BJbmZvID0ge3dpbmRvd1NpemUsIGluU2l6ZSwgYmF0Y2hTaXplLCBudW1TZWdtZW50c307XG4gICAgICAgIGNvbnN0IHByb2dyYW0gPSBuZXcgU2VnbWVudE9wUHJvZ3JhbShzZWdPcEluZm8sIHNlZ09wVHlwZSk7XG4gICAgICAgIGNvbnN0IG91dHB1dCA9IGJhY2tlbmQuY29tcGlsZUFuZFJ1bihwcm9ncmFtLCBbeCwgc2VnbWVudElkc10sIGR0eXBlKTtcbiAgICAgICAgdG9EaXNwb3NlLnB1c2gob3V0cHV0KTtcbiAgICAgICAgLy8gTm8gbmVlZCB0byBydW4gYW5vdGhlciBHUEdQVSBwcm9ncmFtLlxuICAgICAgICBpZiAob3V0cHV0LnNoYXBlWzFdID09PSBudW1TZWdtZW50cykge1xuICAgICAgICAgIHJldHVybiBvdXRwdXQ7XG4gICAgICAgIH1cbiAgICAgICAgY29uc3QgcmFuZ2VJbmZvID0gcmFuZ2Uoe1xuICAgICAgICAgIGJhY2tlbmQsXG4gICAgICAgICAgYXR0cnM6IHtzdGFydDogMCwgc3RvcDogbnVtU2VnbWVudHMsIHN0ZXA6IDEsIGR0eXBlOiAnZmxvYXQzMid9XG4gICAgICAgIH0pO1xuICAgICAgICBjb25zdCB0aWxlSW5mbyA9IHRpbGUoe1xuICAgICAgICAgIGlucHV0czoge3g6IHJhbmdlSW5mb30sXG4gICAgICAgICAgYmFja2VuZCxcbiAgICAgICAgICBhdHRyczoge3JlcHM6IFtpblNpemUgLyB3aW5kb3dTaXplXX1cbiAgICAgICAgfSk7XG5cbiAgICAgICAgdG9EaXNwb3NlLnB1c2gocmFuZ2VJbmZvKTtcbiAgICAgICAgdG9EaXNwb3NlLnB1c2godGlsZUluZm8pO1xuXG4gICAgICAgIGNvbnN0IHJlc3VsdCA9XG4gICAgICAgICAgICBzZWdPcENvbXB1dGUob3V0cHV0LCBzZWdPcFR5cGUsIHRpbGVJbmZvLCBkdHlwZSwgbnVtU2VnbWVudHMpO1xuICAgICAgICByZXR1cm4gcmVzdWx0O1xuICAgICAgfTtcblxuICBjb25zdCBzZWdPcFJlc3VsdCA9IHNlZ09wQ29tcHV0ZShcbiAgICAgIGEyRCwgJ3Vuc29ydGVkU2VnbWVudFN1bScsIHNlZ21lbnRJZHMsIG91dHB1dERUeXBlLCBudW1TZWdtZW50cyk7XG5cbiAgY29uc3QgcmVzaGFwZWQgPVxuICAgICAgcmVzaGFwZSh7aW5wdXRzOiB7eDogc2VnT3BSZXN1bHR9LCBiYWNrZW5kLCBhdHRyczoge3NoYXBlOiBvdXRTaGFwZX19KTtcblxuICBsZXQgcmVzdWx0ID0gcmVzaGFwZWQ7XG4gIGlmIChwZXJtdXRhdGlvbiAhPSBudWxsKSB7XG4gICAgdG9EaXNwb3NlLnB1c2gocmVzaGFwZWQpO1xuICAgIGNvbnN0IHBlcm0gPSBiYWNrZW5kX3V0aWwuZ2V0VW5kb0F4ZXNQZXJtdXRhdGlvbihwZXJtdXRhdGlvbik7XG4gICAgcmVzdWx0ID0gdHJhbnNwb3NlKHtpbnB1dHM6IHt4OiByZXN1bHR9LCBiYWNrZW5kLCBhdHRyczoge3Blcm19fSk7XG4gIH1cblxuICB0b0Rpc3Bvc2UuZm9yRWFjaCh0ID0+IGJhY2tlbmQuZGlzcG9zZUludGVybWVkaWF0ZVRlbnNvckluZm8odCkpO1xuICByZXR1cm4gcmVzdWx0O1xufVxuXG5leHBvcnQgY29uc3QgdW5zb3J0ZWRTZWdtZW50U3VtQ29uZmlnOiBLZXJuZWxDb25maWcgPSB7XG4gIGtlcm5lbE5hbWU6IFVuc29ydGVkU2VnbWVudFN1bSxcbiAgYmFja2VuZE5hbWU6ICd3ZWJnbCcsXG4gIGtlcm5lbEZ1bmM6IHVuc29ydGVkU2VnbWVudFN1bSBhcyB7fSBhcyBLZXJuZWxGdW5jXG59O1xuIl19","/**\n * @license\n * Copyright 2020 Google LLC. All Rights Reserved.\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n * =============================================================================\n */\nimport { registerKernel } from '@tensorflow/tfjs-core';\nimport { _fusedMatMulConfig } from './kernels/_FusedMatMul';\nimport { absConfig } from './kernels/Abs';\nimport { acosConfig } from './kernels/Acos';\nimport { acoshConfig } from './kernels/Acosh';\nimport { addConfig } from './kernels/Add';\nimport { addNConfig } from './kernels/AddN';\nimport { allConfig } from './kernels/All';\nimport { anyConfig } from './kernels/Any';\nimport { argMaxConfig } from './kernels/ArgMax';\nimport { argMinConfig } from './kernels/ArgMin';\nimport { asinConfig } from './kernels/Asin';\nimport { asinhConfig } from './kernels/Asinh';\nimport { atanConfig } from './kernels/Atan';\nimport { atan2Config } from './kernels/Atan2';\nimport { atanhConfig } from './kernels/Atanh';\nimport { avgPoolConfig } from './kernels/AvgPool';\nimport { avgPool3DConfig } from './kernels/AvgPool3D';\nimport { avgPool3DGradConfig } from './kernels/AvgPool3DGrad';\nimport { avgPoolGradConfig } from './kernels/AvgPoolGrad';\nimport { batchMatMulConfig } from './kernels/BatchMatMul';\nimport { batchNormConfig } from './kernels/BatchNorm';\nimport { batchToSpaceNDConfig } from './kernels/BatchToSpaceND';\nimport { bincountConfig } from './kernels/Bincount';\nimport { broadcastArgsConfig } from './kernels/BroadcastArgs';\nimport { castConfig } from './kernels/Cast';\nimport { ceilConfig } from './kernels/Ceil';\nimport { clipByValueConfig } from './kernels/ClipByValue';\nimport { complexConfig } from './kernels/Complex';\nimport { complexAbsConfig } from './kernels/ComplexAbs';\nimport { concatConfig } from './kernels/Concat';\nimport { conv2DConfig } from './kernels/Conv2D';\nimport { conv2DBackpropFilterConfig } from './kernels/Conv2DBackpropFilter';\nimport { conv2DBackpropInputConfig } from './kernels/Conv2DBackpropInput';\nimport { conv3DConfig } from './kernels/Conv3D';\nimport { conv3DBackpropFilterV2Config } from './kernels/Conv3DBackpropFilterV2';\nimport { conv3DBackpropInputConfig } from './kernels/Conv3DBackpropInputV2';\nimport { cosConfig } from './kernels/Cos';\nimport { coshConfig } from './kernels/Cosh';\nimport { cropAndResizeConfig } from './kernels/CropAndResize';\nimport { cumprodConfig } from './kernels/Cumprod';\nimport { cumsumConfig } from './kernels/Cumsum';\nimport { denseBincountConfig } from './kernels/DenseBincount';\nimport { depthToSpaceConfig } from './kernels/DepthToSpace';\nimport { depthwiseConv2dNativeConfig } from './kernels/DepthwiseConv2dNative';\nimport { depthwiseConv2dNativeBackpropFilterConfig } from './kernels/DepthwiseConv2dNativeBackpropFilter';\nimport { depthwiseConv2dNativeBackpropInputConfig } from './kernels/DepthwiseConv2dNativeBackpropInput';\nimport { diagConfig } from './kernels/Diag';\nimport { dilation2DConfig } from './kernels/Dilation2D';\nimport { einsumConfig } from './kernels/Einsum';\nimport { eluConfig } from './kernels/Elu';\nimport { eluGradConfig } from './kernels/EluGrad';\nimport { equalConfig } from './kernels/Equal';\nimport { erfConfig } from './kernels/Erf';\nimport { expConfig } from './kernels/Exp';\nimport { expandDimsConfig } from './kernels/ExpandDims';\nimport { expm1Config } from './kernels/Expm1';\nimport { fftConfig } from './kernels/FFT';\nimport { fillConfig } from './kernels/Fill';\nimport { flipLeftRightConfig } from './kernels/FlipLeftRight';\nimport { floorConfig } from './kernels/Floor';\nimport { floorDivConfig } from './kernels/FloorDiv';\nimport { fromPixelsConfig } from './kernels/FromPixels';\nimport { fusedConv2DConfig } from './kernels/FusedConv2D';\nimport { fusedDepthwiseConv2DConfig } from './kernels/FusedDepthwiseConv2D';\nimport { gatherNdConfig } from './kernels/GatherNd';\nimport { gatherV2Config } from './kernels/GatherV2';\nimport { greaterConfig } from './kernels/Greater';\nimport { greaterEqualConfig } from './kernels/GreaterEqual';\nimport { identityConfig } from './kernels/Identity';\nimport { ifftConfig } from './kernels/IFFT';\nimport { imagConfig } from './kernels/Imag';\nimport { isFiniteConfig } from './kernels/IsFinite';\nimport { isInfConfig } from './kernels/IsInf';\nimport { isNaNConfig } from './kernels/IsNaN';\nimport { leakyReluConfig } from './kernels/LeakyRelu';\nimport { lessConfig } from './kernels/Less';\nimport { lessEqualConfig } from './kernels/LessEqual';\nimport { linSpaceConfig } from './kernels/LinSpace';\nimport { logConfig } from './kernels/Log';\nimport { log1pConfig } from './kernels/Log1p';\nimport { logicalAndConfig } from './kernels/LogicalAnd';\nimport { logicalNotConfig } from './kernels/LogicalNot';\nimport { logicalOrConfig } from './kernels/LogicalOr';\nimport { LRNConfig } from './kernels/LRN';\nimport { LRNGradConfig } from './kernels/LRNGrad';\nimport { maxConfig } from './kernels/Max';\nimport { maximumConfig } from './kernels/Maximum';\nimport { maxPoolConfig } from './kernels/MaxPool';\nimport { maxPool3DConfig } from './kernels/MaxPool3D';\nimport { maxPool3DGradConfig } from './kernels/MaxPool3DGrad';\nimport { maxPoolGradConfig } from './kernels/MaxPoolGrad';\nimport { maxPoolWithArgmaxConfig } from './kernels/MaxPoolWithArgmax';\nimport { meanConfig } from './kernels/Mean';\nimport { minConfig } from './kernels/Min';\nimport { minimumConfig } from './kernels/Minimum';\nimport { mirrorPadConfig } from './kernels/MirrorPad';\nimport { modConfig } from './kernels/Mod';\nimport { multinomialConfig } from './kernels/Multinomial';\nimport { multiplyConfig } from './kernels/Multiply';\nimport { negConfig } from './kernels/Neg';\nimport { nonMaxSuppressionV3Config } from './kernels/NonMaxSuppressionV3';\nimport { nonMaxSuppressionV4Config } from './kernels/NonMaxSuppressionV4';\nimport { nonMaxSuppressionV5Config } from './kernels/NonMaxSuppressionV5';\nimport { notEqualConfig } from './kernels/NotEqual';\nimport { oneHotConfig } from './kernels/OneHot';\nimport { onesLikeConfig } from './kernels/OnesLike';\nimport { packConfig } from './kernels/Pack';\nimport { padV2Config } from './kernels/PadV2';\nimport { powConfig } from './kernels/Pow';\nimport { preluConfig } from './kernels/Prelu';\nimport { prodConfig } from './kernels/Prod';\nimport { raggedGatherConfig } from './kernels/RaggedGather';\nimport { raggedTensorToTensorConfig } from './kernels/RaggedTensorToTensor';\nimport { rangeConfig } from './kernels/Range';\nimport { realConfig } from './kernels/Real';\nimport { realDivConfig } from './kernels/RealDiv';\nimport { reciprocalConfig } from './kernels/Reciprocal';\nimport { reluConfig } from './kernels/Relu';\nimport { relu6Config } from './kernels/Relu6';\nimport { reshapeConfig } from './kernels/Reshape';\nimport { resizeBilinearConfig } from './kernels/ResizeBilinear';\nimport { resizeBilinearGradConfig } from './kernels/ResizeBilinearGrad';\nimport { resizeNearestNeighborConfig } from './kernels/ResizeNearestNeighbor';\nimport { resizeNearestNeighborGradConfig } from './kernels/ResizeNearestNeighborGrad';\nimport { reverseConfig } from './kernels/Reverse';\nimport { rotateWithOffsetConfig } from './kernels/RotateWithOffset';\nimport { roundConfig } from './kernels/Round';\nimport { rsqrtConfig } from './kernels/Rsqrt';\nimport { scatterNdConfig } from './kernels/ScatterNd';\nimport { searchSortedConfig } from './kernels/SearchSorted';\nimport { selectConfig } from './kernels/Select';\nimport { seluConfig } from './kernels/Selu';\nimport { sigmoidConfig } from './kernels/Sigmoid';\nimport { signConfig } from './kernels/Sign';\nimport { sinConfig } from './kernels/Sin';\nimport { sinhConfig } from './kernels/Sinh';\nimport { sliceConfig } from './kernels/Slice';\nimport { softmaxConfig } from './kernels/Softmax';\nimport { softplusConfig } from './kernels/Softplus';\nimport { spaceToBatchNDConfig } from './kernels/SpaceToBatchND';\nimport { sparseFillEmptyRowsConfig } from './kernels/SparseFillEmptyRows';\nimport { sparseReshapeConfig } from './kernels/SparseReshape';\nimport { sparseSegmentMeanConfig } from './kernels/SparseSegmentMean';\nimport { sparseSegmentSumConfig } from './kernels/SparseSegmentSum';\nimport { sparseToDenseConfig } from './kernels/SparseToDense';\nimport { splitVConfig } from './kernels/SplitV';\nimport { sqrtConfig } from './kernels/Sqrt';\nimport { squareConfig } from './kernels/Square';\nimport { squaredDifferenceConfig } from './kernels/SquaredDifference';\nimport { stepConfig } from './kernels/Step';\nimport { stridedSliceConfig } from './kernels/StridedSlice';\nimport { stringNGramsConfig } from './kernels/StringNGrams';\nimport { stringSplitConfig } from './kernels/StringSplit';\nimport { stringToHashBucketFastConfig } from './kernels/StringToHashBucketFast';\nimport { subConfig } from './kernels/Sub';\nimport { sumConfig } from './kernels/Sum';\nimport { tanConfig } from './kernels/Tan';\nimport { tanhConfig } from './kernels/Tanh';\nimport { tileConfig } from './kernels/Tile';\nimport { topKConfig } from './kernels/TopK';\nimport { transformConfig } from './kernels/Transform';\nimport { transposeConfig } from './kernels/Transpose';\nimport { uniqueConfig } from './kernels/Unique';\nimport { unpackConfig } from './kernels/Unpack';\nimport { unsortedSegmentSumConfig } from './kernels/UnsortedSegmentSum';\nimport { zerosLikeConfig } from './kernels/ZerosLike';\n// List all kernel configs here\nconst kernelConfigs = [\n _fusedMatMulConfig,\n absConfig,\n acosConfig,\n acoshConfig,\n addConfig,\n addNConfig,\n allConfig,\n anyConfig,\n argMaxConfig,\n argMinConfig,\n asinConfig,\n asinhConfig,\n atanConfig,\n atan2Config,\n atanhConfig,\n avgPoolConfig,\n avgPool3DConfig,\n avgPool3DGradConfig,\n avgPoolGradConfig,\n batchMatMulConfig,\n batchNormConfig,\n batchToSpaceNDConfig,\n bincountConfig,\n broadcastArgsConfig,\n castConfig,\n ceilConfig,\n clipByValueConfig,\n complexConfig,\n complexAbsConfig,\n concatConfig,\n conv2DConfig,\n conv2DBackpropFilterConfig,\n conv2DBackpropInputConfig,\n conv3DConfig,\n conv3DBackpropFilterV2Config,\n conv3DBackpropInputConfig,\n cosConfig,\n coshConfig,\n cropAndResizeConfig,\n cumprodConfig,\n cumsumConfig,\n denseBincountConfig,\n depthToSpaceConfig,\n depthwiseConv2dNativeConfig,\n depthwiseConv2dNativeBackpropFilterConfig,\n depthwiseConv2dNativeBackpropInputConfig,\n diagConfig,\n dilation2DConfig,\n einsumConfig,\n eluConfig,\n eluGradConfig,\n equalConfig,\n erfConfig,\n expConfig,\n expandDimsConfig,\n expm1Config,\n fftConfig,\n fillConfig,\n flipLeftRightConfig,\n floorConfig,\n floorDivConfig,\n fromPixelsConfig,\n fusedConv2DConfig,\n fusedDepthwiseConv2DConfig,\n gatherNdConfig,\n gatherV2Config,\n greaterConfig,\n greaterEqualConfig,\n identityConfig,\n ifftConfig,\n imagConfig,\n isFiniteConfig,\n isInfConfig,\n isNaNConfig,\n leakyReluConfig,\n lessConfig,\n lessEqualConfig,\n linSpaceConfig,\n logConfig,\n log1pConfig,\n logicalAndConfig,\n logicalNotConfig,\n logicalOrConfig,\n LRNConfig,\n LRNGradConfig,\n maxConfig,\n maximumConfig,\n maxPoolConfig,\n maxPool3DConfig,\n maxPool3DGradConfig,\n maxPoolGradConfig,\n maxPoolWithArgmaxConfig,\n meanConfig,\n minConfig,\n minimumConfig,\n mirrorPadConfig,\n modConfig,\n multinomialConfig,\n multiplyConfig,\n negConfig,\n nonMaxSuppressionV3Config,\n nonMaxSuppressionV4Config,\n nonMaxSuppressionV5Config,\n notEqualConfig,\n oneHotConfig,\n onesLikeConfig,\n packConfig,\n padV2Config,\n powConfig,\n preluConfig,\n prodConfig,\n raggedGatherConfig,\n raggedTensorToTensorConfig,\n rangeConfig,\n realConfig,\n realDivConfig,\n reciprocalConfig,\n reluConfig,\n relu6Config,\n reshapeConfig,\n resizeBilinearConfig,\n resizeBilinearGradConfig,\n resizeNearestNeighborConfig,\n resizeNearestNeighborGradConfig,\n reverseConfig,\n rotateWithOffsetConfig,\n roundConfig,\n rsqrtConfig,\n scatterNdConfig,\n searchSortedConfig,\n selectConfig,\n seluConfig,\n sigmoidConfig,\n signConfig,\n sinConfig,\n sinhConfig,\n sliceConfig,\n softmaxConfig,\n softplusConfig,\n spaceToBatchNDConfig,\n sparseFillEmptyRowsConfig,\n sparseReshapeConfig,\n sparseSegmentMeanConfig,\n sparseSegmentSumConfig,\n sparseToDenseConfig,\n splitVConfig,\n sqrtConfig,\n squareConfig,\n squaredDifferenceConfig,\n stepConfig,\n stridedSliceConfig,\n stringNGramsConfig,\n stringSplitConfig,\n stringToHashBucketFastConfig,\n subConfig,\n sumConfig,\n tanConfig,\n tanhConfig,\n tileConfig,\n topKConfig,\n transformConfig,\n transposeConfig,\n uniqueConfig,\n unpackConfig,\n unsortedSegmentSumConfig,\n zerosLikeConfig\n];\nfor (const kernelConfig of kernelConfigs) {\n registerKernel(kernelConfig);\n}\n//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicmVnaXN0ZXJfYWxsX2tlcm5lbHMuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi90ZmpzLWJhY2tlbmQtd2ViZ2wvc3JjL3JlZ2lzdGVyX2FsbF9rZXJuZWxzLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBOzs7Ozs7Ozs7Ozs7Ozs7R0FlRztBQUNILE9BQU8sRUFBZSxjQUFjLEVBQUMsTUFBTSx1QkFBdUIsQ0FBQztBQUVuRSxPQUFPLEVBQUMsa0JBQWtCLEVBQUMsTUFBTSx3QkFBd0IsQ0FBQztBQUMxRCxPQUFPLEVBQUMsU0FBUyxFQUFDLE1BQU0sZUFBZSxDQUFDO0FBQ3hDLE9BQU8sRUFBQyxVQUFVLEVBQUMsTUFBTSxnQkFBZ0IsQ0FBQztBQUMxQyxPQUFPLEVBQUMsV0FBVyxFQUFDLE1BQU0saUJBQWlCLENBQUM7QUFDNUMsT0FBTyxFQUFDLFNBQVMsRUFBQyxNQUFNLGVBQWUsQ0FBQztBQUN4QyxPQUFPLEVBQUMsVUFBVSxFQUFDLE1BQU0sZ0JBQWdCLENBQUM7QUFDMUMsT0FBTyxFQUFDLFNBQVMsRUFBQyxNQUFNLGVBQWUsQ0FBQztBQUN4QyxPQUFPLEVBQUMsU0FBUyxFQUFDLE1BQU0sZUFBZSxDQUFDO0FBQ3hDLE9BQU8sRUFBQyxZQUFZLEVBQUMsTUFBTSxrQkFBa0IsQ0FBQztBQUM5QyxPQUFPLEVBQUMsWUFBWSxFQUFDLE1BQU0sa0JBQWtCLENBQUM7QUFDOUMsT0FBTyxFQUFDLFVBQVUsRUFBQyxNQUFNLGdCQUFnQixDQUFDO0FBQzFDLE9BQU8sRUFBQyxXQUFXLEVBQUMsTUFBTSxpQkFBaUIsQ0FBQztBQUM1QyxPQUFPLEVBQUMsVUFBVSxFQUFDLE1BQU0sZ0JBQWdCLENBQUM7QUFDMUMsT0FBTyxFQUFDLFdBQVcsRUFBQyxNQUFNLGlCQUFpQixDQUFDO0FBQzVDLE9BQU8sRUFBQyxXQUFXLEVBQUMsTUFBTSxpQkFBaUIsQ0FBQztBQUM1QyxPQUFPLEVBQUMsYUFBYSxFQUFDLE1BQU0sbUJBQW1CLENBQUM7QUFDaEQsT0FBTyxFQUFDLGVBQWUsRUFBQyxNQUFNLHFCQUFxQixDQUFDO0FBQ3BELE9BQU8sRUFBQyxtQkFBbUIsRUFBQyxNQUFNLHlCQUF5QixDQUFDO0FBQzVELE9BQU8sRUFBQyxpQkFBaUIsRUFBQyxNQUFNLHVCQUF1QixDQUFDO0FBQ3hELE9BQU8sRUFBQyxpQkFBaUIsRUFBQyxNQUFNLHVCQUF1QixDQUFDO0FBQ3hELE9BQU8sRUFBQyxlQUFlLEVBQUMsTUFBTSxxQkFBcUIsQ0FBQztBQUNwRCxPQUFPLEVBQUMsb0JBQW9CLEVBQUMsTUFBTSwwQkFBMEIsQ0FBQztBQUM5RCxPQUFPLEVBQUMsY0FBYyxFQUFDLE1BQU0sb0JBQW9CLENBQUM7QUFDbEQsT0FBTyxFQUFDLG1CQUFtQixFQUFDLE1BQU0seUJBQXlCLENBQUM7QUFDNUQsT0FBTyxFQUFDLFVBQVUsRUFBQyxNQUFNLGdCQUFnQixDQUFDO0FBQzFDLE9BQU8sRUFBQyxVQUFVLEVBQUMsTUFBTSxnQkFBZ0IsQ0FBQztBQUMxQyxPQUFPLEVBQUMsaUJBQWlCLEVBQUMsTUFBTSx1QkFBdUIsQ0FBQztBQUN4RCxPQUFPLEVBQUMsYUFBYSxFQUFDLE1BQU0sbUJBQW1CLENBQUM7QUFDaEQsT0FBTyxFQUFDLGdCQUFnQixFQUFDLE1BQU0sc0JBQXNCLENBQUM7QUFDdEQsT0FBTyxFQUFDLFlBQVksRUFBQyxNQUFNLGtCQUFrQixDQUFDO0FBQzlDLE9BQU8sRUFBQyxZQUFZLEVBQUMsTUFBTSxrQkFBa0IsQ0FBQztBQUM5QyxPQUFPLEVBQUMsMEJBQTBCLEVBQUMsTUFBTSxnQ0FBZ0MsQ0FBQztBQUMxRSxPQUFPLEVBQUMseUJBQXlCLEVBQUMsTUFBTSwrQkFBK0IsQ0FBQztBQUN4RSxPQUFPLEVBQUMsWUFBWSxFQUFDLE1BQU0sa0JBQWtCLENBQUM7QUFDOUMsT0FBTyxFQUFDLDRCQUE0QixFQUFDLE1BQU0sa0NBQWtDLENBQUM7QUFDOUUsT0FBTyxFQUFDLHlCQUF5QixFQUFDLE1BQU0saUNBQWlDLENBQUM7QUFDMUUsT0FBTyxFQUFDLFNBQVMsRUFBQyxNQUFNLGVBQWUsQ0FBQztBQUN4QyxPQUFPLEVBQUMsVUFBVSxFQUFDLE1BQU0sZ0JBQWdCLENBQUM7QUFDMUMsT0FBTyxFQUFDLG1CQUFtQixFQUFDLE1BQU0seUJBQXlCLENBQUM7QUFDNUQsT0FBTyxFQUFDLGFBQWEsRUFBQyxNQUFNLG1CQUFtQixDQUFDO0FBQ2hELE9BQU8sRUFBQyxZQUFZLEVBQUMsTUFBTSxrQkFBa0IsQ0FBQztBQUM5QyxPQUFPLEVBQUMsbUJBQW1CLEVBQUMsTUFBTSx5QkFBeUIsQ0FBQztBQUM1RCxPQUFPLEVBQUMsa0JBQWtCLEVBQUMsTUFBTSx3QkFBd0IsQ0FBQztBQUMxRCxPQUFPLEVBQUMsMkJBQTJCLEVBQUMsTUFBTSxpQ0FBaUMsQ0FBQztBQUM1RSxPQUFPLEVBQUMseUNBQXlDLEVBQUMsTUFBTSwrQ0FBK0MsQ0FBQztBQUN4RyxPQUFPLEVBQUMsd0NBQXdDLEVBQUMsTUFBTSw4Q0FBOEMsQ0FBQztBQUN0RyxPQUFPLEVBQUMsVUFBVSxFQUFDLE1BQU0sZ0JBQWdCLENBQUM7QUFDMUMsT0FBTyxFQUFDLGdCQUFnQixFQUFDLE1BQU0sc0JBQXNCLENBQUM7QUFDdEQsT0FBTyxFQUFDLFlBQVksRUFBQyxNQUFNLGtCQUFrQixDQUFDO0FBQzlDLE9BQU8sRUFBQyxTQUFTLEVBQUMsTUFBTSxlQUFlLENBQUM7QUFDeEMsT0FBTyxFQUFDLGFBQWEsRUFBQyxNQUFNLG1CQUFtQixDQUFDO0FBQ2hELE9BQU8sRUFBQyxXQUFXLEVBQUMsTUFBTSxpQkFBaUIsQ0FBQztBQUM1QyxPQUFPLEVBQUMsU0FBUyxFQUFDLE1BQU0sZUFBZSxDQUFDO0FBQ3hDLE9BQU8sRUFBQyxTQUFTLEVBQUMsTUFBTSxlQUFlLENBQUM7QUFDeEMsT0FBTyxFQUFDLGdCQUFnQixFQUFDLE1BQU0sc0JBQXNCLENBQUM7QUFDdEQsT0FBTyxFQUFDLFdBQVcsRUFBQyxNQUFNLGlCQUFpQixDQUFDO0FBQzVDLE9BQU8sRUFBQyxTQUFTLEVBQUMsTUFBTSxlQUFlLENBQUM7QUFDeEMsT0FBTyxFQUFDLFVBQVUsRUFBQyxNQUFNLGdCQUFnQixDQUFDO0FBQzFDLE9BQU8sRUFBQyxtQkFBbUIsRUFBQyxNQUFNLHlCQUF5QixDQUFDO0FBQzVELE9BQU8sRUFBQyxXQUFXLEVBQUMsTUFBTSxpQkFBaUIsQ0FBQztBQUM1QyxPQUFPLEVBQUMsY0FBYyxFQUFDLE1BQU0sb0JBQW9CLENBQUM7QUFDbEQsT0FBTyxFQUFDLGdCQUFnQixFQUFDLE1BQU0sc0JBQXNCLENBQUM7QUFDdEQsT0FBTyxFQUFDLGlCQUFpQixFQUFDLE1BQU0sdUJBQXVCLENBQUM7QUFDeEQsT0FBTyxFQUFDLDBCQUEwQixFQUFDLE1BQU0sZ0NBQWdDLENBQUM7QUFDMUUsT0FBTyxFQUFDLGNBQWMsRUFBQyxNQUFNLG9CQUFvQixDQUFDO0FBQ2xELE9BQU8sRUFBQyxjQUFjLEVBQUMsTUFBTSxvQkFBb0IsQ0FBQztBQUNsRCxPQUFPLEVBQUMsYUFBYSxFQUFDLE1BQU0sbUJBQW1CLENBQUM7QUFDaEQsT0FBTyxFQUFDLGtCQUFrQixFQUFDLE1BQU0sd0JBQXdCLENBQUM7QUFDMUQsT0FBTyxFQUFDLGNBQWMsRUFBQyxNQUFNLG9CQUFvQixDQUFDO0FBQ2xELE9BQU8sRUFBQyxVQUFVLEVBQUMsTUFBTSxnQkFBZ0IsQ0FBQztBQUMxQyxPQUFPLEVBQUMsVUFBVSxFQUFDLE1BQU0sZ0JBQWdCLENBQUM7QUFDMUMsT0FBTyxFQUFDLGNBQWMsRUFBQyxNQUFNLG9CQUFvQixDQUFDO0FBQ2xELE9BQU8sRUFBQyxXQUFXLEVBQUMsTUFBTSxpQkFBaUIsQ0FBQztBQUM1QyxPQUFPLEVBQUMsV0FBVyxFQUFDLE1BQU0saUJBQWlCLENBQUM7QUFDNUMsT0FBTyxFQUFDLGVBQWUsRUFBQyxNQUFNLHFCQUFxQixDQUFDO0FBQ3BELE9BQU8sRUFBQyxVQUFVLEVBQUMsTUFBTSxnQkFBZ0IsQ0FBQztBQUMxQyxPQUFPLEVBQUMsZUFBZSxFQUFDLE1BQU0scUJBQXFCLENBQUM7QUFDcEQsT0FBTyxFQUFDLGNBQWMsRUFBQyxNQUFNLG9CQUFvQixDQUFDO0FBQ2xELE9BQU8sRUFBQyxTQUFTLEVBQUMsTUFBTSxlQUFlLENBQUM7QUFDeEMsT0FBTyxFQUFDLFdBQVcsRUFBQyxNQUFNLGlCQUFpQixDQUFDO0FBQzVDLE9BQU8sRUFBQyxnQkFBZ0IsRUFBQyxNQUFNLHNCQUFzQixDQUFDO0FBQ3RELE9BQU8sRUFBQyxnQkFBZ0IsRUFBQyxNQUFNLHNCQUFzQixDQUFDO0FBQ3RELE9BQU8sRUFBQyxlQUFlLEVBQUMsTUFBTSxxQkFBcUIsQ0FBQztBQUNwRCxPQUFPLEVBQUMsU0FBUyxFQUFDLE1BQU0sZUFBZSxDQUFDO0FBQ3hDLE9BQU8sRUFBQyxhQUFhLEVBQUMsTUFBTSxtQkFBbUIsQ0FBQztBQUNoRCxPQUFPLEVBQUMsU0FBUyxFQUFDLE1BQU0sZUFBZSxDQUFDO0FBQ3hDLE9BQU8sRUFBQyxhQUFhLEVBQUMsTUFBTSxtQkFBbUIsQ0FBQztBQUNoRCxPQUFPLEVBQUMsYUFBYSxFQUFDLE1BQU0sbUJBQW1CLENBQUM7QUFDaEQsT0FBTyxFQUFDLGVBQWUsRUFBQyxNQUFNLHFCQUFxQixDQUFDO0FBQ3BELE9BQU8sRUFBQyxtQkFBbUIsRUFBQyxNQUFNLHlCQUF5QixDQUFDO0FBQzVELE9BQU8sRUFBQyxpQkFBaUIsRUFBQyxNQUFNLHVCQUF1QixDQUFDO0FBQ3hELE9BQU8sRUFBQyx1QkFBdUIsRUFBQyxNQUFNLDZCQUE2QixDQUFDO0FBQ3BFLE9BQU8sRUFBQyxVQUFVLEVBQUMsTUFBTSxnQkFBZ0IsQ0FBQztBQUMxQyxPQUFPLEVBQUMsU0FBUyxFQUFDLE1BQU0sZUFBZSxDQUFDO0FBQ3hDLE9BQU8sRUFBQyxhQUFhLEVBQUMsTUFBTSxtQkFBbUIsQ0FBQztBQUNoRCxPQUFPLEVBQUMsZUFBZSxFQUFDLE1BQU0scUJBQXFCLENBQUM7QUFDcEQsT0FBTyxFQUFDLFNBQVMsRUFBQyxNQUFNLGVBQWUsQ0FBQztBQUN4QyxPQUFPLEVBQUMsaUJBQWlCLEVBQUMsTUFBTSx1QkFBdUIsQ0FBQztBQUN4RCxPQUFPLEVBQUMsY0FBYyxFQUFDLE1BQU0sb0JBQW9CLENBQUM7QUFDbEQsT0FBTyxFQUFDLFNBQVMsRUFBQyxNQUFNLGVBQWUsQ0FBQztBQUN4QyxPQUFPLEVBQUMseUJBQXlCLEVBQUMsTUFBTSwrQkFBK0IsQ0FBQztBQUN4RSxPQUFPLEVBQUMseUJBQXlCLEVBQUMsTUFBTSwrQkFBK0IsQ0FBQztBQUN4RSxPQUFPLEVBQUMseUJBQXlCLEVBQUMsTUFBTSwrQkFBK0IsQ0FBQztBQUN4RSxPQUFPLEVBQUMsY0FBYyxFQUFDLE1BQU0sb0JBQW9CLENBQUM7QUFDbEQsT0FBTyxFQUFDLFlBQVksRUFBQyxNQUFNLGtCQUFrQixDQUFDO0FBQzlDLE9BQU8sRUFBQyxjQUFjLEVBQUMsTUFBTSxvQkFBb0IsQ0FBQztBQUNsRCxPQUFPLEVBQUMsVUFBVSxFQUFDLE1BQU0sZ0JBQWdCLENBQUM7QUFDMUMsT0FBTyxFQUFDLFdBQVcsRUFBQyxNQUFNLGlCQUFpQixDQUFDO0FBQzVDLE9BQU8sRUFBQyxTQUFTLEVBQUMsTUFBTSxlQUFlLENBQUM7QUFDeEMsT0FBTyxFQUFDLFdBQVcsRUFBQyxNQUFNLGlCQUFpQixDQUFDO0FBQzVDLE9BQU8sRUFBQyxVQUFVLEVBQUMsTUFBTSxnQkFBZ0IsQ0FBQztBQUMxQyxPQUFPLEVBQUMsa0JBQWtCLEVBQUMsTUFBTSx3QkFBd0IsQ0FBQztBQUMxRCxPQUFPLEVBQUMsMEJBQTBCLEVBQUMsTUFBTSxnQ0FBZ0MsQ0FBQztBQUMxRSxPQUFPLEVBQUMsV0FBVyxFQUFDLE1BQU0saUJBQWlCLENBQUM7QUFDNUMsT0FBTyxFQUFDLFVBQVUsRUFBQyxNQUFNLGdCQUFnQixDQUFDO0FBQzFDLE9BQU8sRUFBQyxhQUFhLEVBQUMsTUFBTSxtQkFBbUIsQ0FBQztBQUNoRCxPQUFPLEVBQUMsZ0JBQWdCLEVBQUMsTUFBTSxzQkFBc0IsQ0FBQztBQUN0RCxPQUFPLEVBQUMsVUFBVSxFQUFDLE1BQU0sZ0JBQWdCLENBQUM7QUFDMUMsT0FBTyxFQUFDLFdBQVcsRUFBQyxNQUFNLGlCQUFpQixDQUFDO0FBQzVDLE9BQU8sRUFBQyxhQUFhLEVBQUMsTUFBTSxtQkFBbUIsQ0FBQztBQUNoRCxPQUFPLEVBQUMsb0JBQW9CLEVBQUMsTUFBTSwwQkFBMEIsQ0FBQztBQUM5RCxPQUFPLEVBQUMsd0JBQXdCLEVBQUMsTUFBTSw4QkFBOEIsQ0FBQztBQUN0RSxPQUFPLEVBQUMsMkJBQTJCLEVBQUMsTUFBTSxpQ0FBaUMsQ0FBQztBQUM1RSxPQUFPLEVBQUMsK0JBQStCLEVBQUMsTUFBTSxxQ0FBcUMsQ0FBQztBQUNwRixPQUFPLEVBQUMsYUFBYSxFQUFDLE1BQU0sbUJBQW1CLENBQUM7QUFDaEQsT0FBTyxFQUFDLHNCQUFzQixFQUFDLE1BQU0sNEJBQTRCLENBQUM7QUFDbEUsT0FBTyxFQUFDLFdBQVcsRUFBQyxNQUFNLGlCQUFpQixDQUFDO0FBQzVDLE9BQU8sRUFBQyxXQUFXLEVBQUMsTUFBTSxpQkFBaUIsQ0FBQztBQUM1QyxPQUFPLEVBQUMsZUFBZSxFQUFDLE1BQU0scUJBQXFCLENBQUM7QUFDcEQsT0FBTyxFQUFDLGtCQUFrQixFQUFDLE1BQU0sd0JBQXdCLENBQUM7QUFDMUQsT0FBTyxFQUFDLFlBQVksRUFBQyxNQUFNLGtCQUFrQixDQUFDO0FBQzlDLE9BQU8sRUFBQyxVQUFVLEVBQUMsTUFBTSxnQkFBZ0IsQ0FBQztBQUMxQyxPQUFPLEVBQUMsYUFBYSxFQUFDLE1BQU0sbUJBQW1CLENBQUM7QUFDaEQsT0FBTyxFQUFDLFVBQVUsRUFBQyxNQUFNLGdCQUFnQixDQUFDO0FBQzFDLE9BQU8sRUFBQyxTQUFTLEVBQUMsTUFBTSxlQUFlLENBQUM7QUFDeEMsT0FBTyxFQUFDLFVBQVUsRUFBQyxNQUFNLGdCQUFnQixDQUFDO0FBQzFDLE9BQU8sRUFBQyxXQUFXLEVBQUMsTUFBTSxpQkFBaUIsQ0FBQztBQUM1QyxPQUFPLEVBQUMsYUFBYSxFQUFDLE1BQU0sbUJBQW1CLENBQUM7QUFDaEQsT0FBTyxFQUFDLGNBQWMsRUFBQyxNQUFNLG9CQUFvQixDQUFDO0FBQ2xELE9BQU8sRUFBQyxvQkFBb0IsRUFBQyxNQUFNLDBCQUEwQixDQUFDO0FBQzlELE9BQU8sRUFBQyx5QkFBeUIsRUFBQyxNQUFNLCtCQUErQixDQUFDO0FBQ3hFLE9BQU8sRUFBQyxtQkFBbUIsRUFBQyxNQUFNLHlCQUF5QixDQUFDO0FBQzVELE9BQU8sRUFBQyx1QkFBdUIsRUFBQyxNQUFNLDZCQUE2QixDQUFDO0FBQ3BFLE9BQU8sRUFBQyxzQkFBc0IsRUFBQyxNQUFNLDRCQUE0QixDQUFDO0FBQ2xFLE9BQU8sRUFBQyxtQkFBbUIsRUFBQyxNQUFNLHlCQUF5QixDQUFDO0FBQzVELE9BQU8sRUFBQyxZQUFZLEVBQUMsTUFBTSxrQkFBa0IsQ0FBQztBQUM5QyxPQUFPLEVBQUMsVUFBVSxFQUFDLE1BQU0sZ0JBQWdCLENBQUM7QUFDMUMsT0FBTyxFQUFDLFlBQVksRUFBQyxNQUFNLGtCQUFrQixDQUFDO0FBQzlDLE9BQU8sRUFBQyx1QkFBdUIsRUFBQyxNQUFNLDZCQUE2QixDQUFDO0FBQ3BFLE9BQU8sRUFBQyxVQUFVLEVBQUMsTUFBTSxnQkFBZ0IsQ0FBQztBQUMxQyxPQUFPLEVBQUMsa0JBQWtCLEVBQUMsTUFBTSx3QkFBd0IsQ0FBQztBQUMxRCxPQUFPLEVBQUMsa0JBQWtCLEVBQUMsTUFBTSx3QkFBd0IsQ0FBQztBQUMxRCxPQUFPLEVBQUMsaUJBQWlCLEVBQUMsTUFBTSx1QkFBdUIsQ0FBQztBQUN4RCxPQUFPLEVBQUMsNEJBQTRCLEVBQUMsTUFBTSxrQ0FBa0MsQ0FBQztBQUM5RSxPQUFPLEVBQUMsU0FBUyxFQUFDLE1BQU0sZUFBZSxDQUFDO0FBQ3hDLE9BQU8sRUFBQyxTQUFTLEVBQUMsTUFBTSxlQUFlLENBQUM7QUFDeEMsT0FBTyxFQUFDLFNBQVMsRUFBQyxNQUFNLGVBQWUsQ0FBQztBQUN4QyxPQUFPLEVBQUMsVUFBVSxFQUFDLE1BQU0sZ0JBQWdCLENBQUM7QUFDMUMsT0FBTyxFQUFDLFVBQVUsRUFBQyxNQUFNLGdCQUFnQixDQUFDO0FBQzFDLE9BQU8sRUFBQyxVQUFVLEVBQUMsTUFBTSxnQkFBZ0IsQ0FBQztBQUMxQyxPQUFPLEVBQUMsZUFBZSxFQUFDLE1BQU0scUJBQXFCLENBQUM7QUFDcEQsT0FBTyxFQUFDLGVBQWUsRUFBQyxNQUFNLHFCQUFxQixDQUFDO0FBQ3BELE9BQU8sRUFBQyxZQUFZLEVBQUMsTUFBTSxrQkFBa0IsQ0FBQztBQUM5QyxPQUFPLEVBQUMsWUFBWSxFQUFDLE1BQU0sa0JBQWtCLENBQUM7QUFDOUMsT0FBTyxFQUFDLHdCQUF3QixFQUFDLE1BQU0sOEJBQThCLENBQUM7QUFDdEUsT0FBTyxFQUFDLGVBQWUsRUFBQyxNQUFNLHFCQUFxQixDQUFDO0FBRXBELCtCQUErQjtBQUMvQixNQUFNLGFBQWEsR0FBbUI7SUFDcEMsa0JBQWtCO0lBQ2xCLFNBQVM7SUFDVCxVQUFVO0lBQ1YsV0FBVztJQUNYLFNBQVM7SUFDVCxVQUFVO0lBQ1YsU0FBUztJQUNULFNBQVM7SUFDVCxZQUFZO0lBQ1osWUFBWTtJQUNaLFVBQVU7SUFDVixXQUFXO0lBQ1gsVUFBVTtJQUNWLFdBQVc7SUFDWCxXQUFXO0lBQ1gsYUFBYTtJQUNiLGVBQWU7SUFDZixtQkFBbUI7SUFDbkIsaUJBQWlCO0lBQ2pCLGlCQUFpQjtJQUNqQixlQUFlO0lBQ2Ysb0JBQW9CO0lBQ3BCLGNBQWM7SUFDZCxtQkFBbUI7SUFDbkIsVUFBVTtJQUNWLFVBQVU7SUFDVixpQkFBaUI7SUFDakIsYUFBYTtJQUNiLGdCQUFnQjtJQUNoQixZQUFZO0lBQ1osWUFBWTtJQUNaLDBCQUEwQjtJQUMxQix5QkFBeUI7SUFDekIsWUFBWTtJQUNaLDRCQUE0QjtJQUM1Qix5QkFBeUI7SUFDekIsU0FBUztJQUNULFVBQVU7SUFDVixtQkFBbUI7SUFDbkIsYUFBYTtJQUNiLFlBQVk7SUFDWixtQkFBbUI7SUFDbkIsa0JBQWtCO0lBQ2xCLDJCQUEyQjtJQUMzQix5Q0FBeUM7SUFDekMsd0NBQXdDO0lBQ3hDLFVBQVU7SUFDVixnQkFBZ0I7SUFDaEIsWUFBWTtJQUNaLFNBQVM7SUFDVCxhQUFhO0lBQ2IsV0FBVztJQUNYLFNBQVM7SUFDVCxTQUFTO0lBQ1QsZ0JBQWdCO0lBQ2hCLFdBQVc7SUFDWCxTQUFTO0lBQ1QsVUFBVTtJQUNWLG1CQUFtQjtJQUNuQixXQUFXO0lBQ1gsY0FBYztJQUNkLGdCQUFnQjtJQUNoQixpQkFBaUI7SUFDakIsMEJBQTBCO0lBQzFCLGNBQWM7SUFDZCxjQUFjO0lBQ2QsYUFBYTtJQUNiLGtCQUFrQjtJQUNsQixjQUFjO0lBQ2QsVUFBVTtJQUNWLFVBQVU7SUFDVixjQUFjO0lBQ2QsV0FBVztJQUNYLFdBQVc7SUFDWCxlQUFlO0lBQ2YsVUFBVTtJQUNWLGVBQWU7SUFDZixjQUFjO0lBQ2QsU0FBUztJQUNULFdBQVc7SUFDWCxnQkFBZ0I7SUFDaEIsZ0JBQWdCO0lBQ2hCLGVBQWU7SUFDZixTQUFTO0lBQ1QsYUFBYTtJQUNiLFNBQVM7SUFDVCxhQUFhO0lBQ2IsYUFBYTtJQUNiLGVBQWU7SUFDZixtQkFBbUI7SUFDbkIsaUJBQWlCO0lBQ2pCLHVCQUF1QjtJQUN2QixVQUFVO0lBQ1YsU0FBUztJQUNULGFBQWE7SUFDYixlQUFlO0lBQ2YsU0FBUztJQUNULGlCQUFpQjtJQUNqQixjQUFjO0lBQ2QsU0FBUztJQUNULHlCQUF5QjtJQUN6Qix5QkFBeUI7SUFDekIseUJBQXlCO0lBQ3pCLGNBQWM7SUFDZCxZQUFZO0lBQ1osY0FBYztJQUNkLFVBQVU7SUFDVixXQUFXO0lBQ1gsU0FBUztJQUNULFdBQVc7SUFDWCxVQUFVO0lBQ1Ysa0JBQWtCO0lBQ2xCLDBCQUEwQjtJQUMxQixXQUFXO0lBQ1gsVUFBVTtJQUNWLGFBQWE7SUFDYixnQkFBZ0I7SUFDaEIsVUFBVTtJQUNWLFdBQVc7SUFDWCxhQUFhO0lBQ2Isb0JBQW9CO0lBQ3BCLHdCQUF3QjtJQUN4QiwyQkFBMkI7SUFDM0IsK0JBQStCO0lBQy9CLGFBQWE7SUFDYixzQkFBc0I7SUFDdEIsV0FBVztJQUNYLFdBQVc7SUFDWCxlQUFlO0lBQ2Ysa0JBQWtCO0lBQ2xCLFlBQVk7SUFDWixVQUFVO0lBQ1YsYUFBYTtJQUNiLFVBQVU7SUFDVixTQUFTO0lBQ1QsVUFBVTtJQUNWLFdBQVc7SUFDWCxhQUFhO0lBQ2IsY0FBYztJQUNkLG9CQUFvQjtJQUNwQix5QkFBeUI7SUFDekIsbUJBQW1CO0lBQ25CLHVCQUF1QjtJQUN2QixzQkFBc0I7SUFDdEIsbUJBQW1CO0lBQ25CLFlBQVk7SUFDWixVQUFVO0lBQ1YsWUFBWTtJQUNaLHVCQUF1QjtJQUN2QixVQUFVO0lBQ1Ysa0JBQWtCO0lBQ2xCLGtCQUFrQjtJQUNsQixpQkFBaUI7SUFDakIsNEJBQTRCO0lBQzVCLFNBQVM7SUFDVCxTQUFTO0lBQ1QsU0FBUztJQUNULFVBQVU7SUFDVixVQUFVO0lBQ1YsVUFBVTtJQUNWLGVBQWU7SUFDZixlQUFlO0lBQ2YsWUFBWTtJQUNaLFlBQVk7SUFDWix3QkFBd0I7SUFDeEIsZUFBZTtDQUNoQixDQUFDO0FBRUYsS0FBSyxNQUFNLFlBQVksSUFBSSxhQUFhLEVBQUU7SUFDeEMsY0FBYyxDQUFDLFlBQVksQ0FBQyxDQUFDO0NBQzlCIiwic291cmNlc0NvbnRlbnQiOlsiLyoqXG4gKiBAbGljZW5zZVxuICogQ29weXJpZ2h0IDIwMjAgR29vZ2xlIExMQy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC5cbiAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSBcIkxpY2Vuc2VcIik7XG4gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuXG4gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXRcbiAqXG4gKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjBcbiAqXG4gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlXG4gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiBcIkFTIElTXCIgQkFTSVMsXG4gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC5cbiAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmRcbiAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLlxuICogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbiAqL1xuaW1wb3J0IHtLZXJuZWxDb25maWcsIHJlZ2lzdGVyS2VybmVsfSBmcm9tICdAdGVuc29yZmxvdy90ZmpzLWNvcmUnO1xuXG5pbXBvcnQge19mdXNlZE1hdE11bENvbmZpZ30gZnJvbSAnLi9rZXJuZWxzL19GdXNlZE1hdE11bCc7XG5pbXBvcnQge2Fic0NvbmZpZ30gZnJvbSAnLi9rZXJuZWxzL0Ficyc7XG5pbXBvcnQge2Fjb3NDb25maWd9IGZyb20gJy4va2VybmVscy9BY29zJztcbmltcG9ydCB7YWNvc2hDb25maWd9IGZyb20gJy4va2VybmVscy9BY29zaCc7XG5pbXBvcnQge2FkZENvbmZpZ30gZnJvbSAnLi9rZXJuZWxzL0FkZCc7XG5pbXBvcnQge2FkZE5Db25maWd9IGZyb20gJy4va2VybmVscy9BZGROJztcbmltcG9ydCB7YWxsQ29uZmlnfSBmcm9tICcuL2tlcm5lbHMvQWxsJztcbmltcG9ydCB7YW55Q29uZmlnfSBmcm9tICcuL2tlcm5lbHMvQW55JztcbmltcG9ydCB7YXJnTWF4Q29uZmlnfSBmcm9tICcuL2tlcm5lbHMvQXJnTWF4JztcbmltcG9ydCB7YXJnTWluQ29uZmlnfSBmcm9tICcuL2tlcm5lbHMvQXJnTWluJztcbmltcG9ydCB7YXNpbkNvbmZpZ30gZnJvbSAnLi9rZXJuZWxzL0FzaW4nO1xuaW1wb3J0IHthc2luaENvbmZpZ30gZnJvbSAnLi9rZXJuZWxzL0FzaW5oJztcbmltcG9ydCB7YXRhbkNvbmZpZ30gZnJvbSAnLi9rZXJuZWxzL0F0YW4nO1xuaW1wb3J0IHthdGFuMkNvbmZpZ30gZnJvbSAnLi9rZXJuZWxzL0F0YW4yJztcbmltcG9ydCB7YXRhbmhDb25maWd9IGZyb20gJy4va2VybmVscy9BdGFuaCc7XG5pbXBvcnQge2F2Z1Bvb2xDb25maWd9IGZyb20gJy4va2VybmVscy9BdmdQb29sJztcbmltcG9ydCB7YXZnUG9vbDNEQ29uZmlnfSBmcm9tICcuL2tlcm5lbHMvQXZnUG9vbDNEJztcbmltcG9ydCB7YXZnUG9vbDNER3JhZENvbmZpZ30gZnJvbSAnLi9rZXJuZWxzL0F2Z1Bvb2wzREdyYWQnO1xuaW1wb3J0IHthdmdQb29sR3JhZENvbmZpZ30gZnJvbSAnLi9rZXJuZWxzL0F2Z1Bvb2xHcmFkJztcbmltcG9ydCB7YmF0Y2hNYXRNdWxDb25maWd9IGZyb20gJy4va2VybmVscy9CYXRjaE1hdE11bCc7XG5pbXBvcnQge2JhdGNoTm9ybUNvbmZpZ30gZnJvbSAnLi9rZXJuZWxzL0JhdGNoTm9ybSc7XG5pbXBvcnQge2JhdGNoVG9TcGFjZU5EQ29uZmlnfSBmcm9tICcuL2tlcm5lbHMvQmF0Y2hUb1NwYWNlTkQnO1xuaW1wb3J0IHtiaW5jb3VudENvbmZpZ30gZnJvbSAnLi9rZXJuZWxzL0JpbmNvdW50JztcbmltcG9ydCB7YnJvYWRjYXN0QXJnc0NvbmZpZ30gZnJvbSAnLi9rZXJuZWxzL0Jyb2FkY2FzdEFyZ3MnO1xuaW1wb3J0IHtjYXN0Q29uZmlnfSBmcm9tICcuL2tlcm5lbHMvQ2FzdCc7XG5pbXBvcnQge2NlaWxDb25maWd9IGZyb20gJy4va2VybmVscy9DZWlsJztcbmltcG9ydCB7Y2xpcEJ5VmFsdWVDb25maWd9IGZyb20gJy4va2VybmVscy9DbGlwQnlWYWx1ZSc7XG5pbXBvcnQge2NvbXBsZXhDb25maWd9IGZyb20gJy4va2VybmVscy9Db21wbGV4JztcbmltcG9ydCB7Y29tcGxleEFic0NvbmZpZ30gZnJvbSAnLi9rZXJuZWxzL0NvbXBsZXhBYnMnO1xuaW1wb3J0IHtjb25jYXRDb25maWd9IGZyb20gJy4va2VybmVscy9Db25jYXQnO1xuaW1wb3J0IHtjb252MkRDb25maWd9IGZyb20gJy4va2VybmVscy9Db252MkQnO1xuaW1wb3J0IHtjb252MkRCYWNrcHJvcEZpbHRlckNvbmZpZ30gZnJvbSAnLi9rZXJuZWxzL0NvbnYyREJhY2twcm9wRmlsdGVyJztcbmltcG9ydCB7Y29udjJEQmFja3Byb3BJbnB1dENvbmZpZ30gZnJvbSAnLi9rZXJuZWxzL0NvbnYyREJhY2twcm9wSW5wdXQnO1xuaW1wb3J0IHtjb252M0RDb25maWd9IGZyb20gJy4va2VybmVscy9Db252M0QnO1xuaW1wb3J0IHtjb252M0RCYWNrcHJvcEZpbHRlclYyQ29uZmlnfSBmcm9tICcuL2tlcm5lbHMvQ29udjNEQmFja3Byb3BGaWx0ZXJWMic7XG5pbXBvcnQge2NvbnYzREJhY2twcm9wSW5wdXRDb25maWd9IGZyb20gJy4va2VybmVscy9Db252M0RCYWNrcHJvcElucHV0VjInO1xuaW1wb3J0IHtjb3NDb25maWd9IGZyb20gJy4va2VybmVscy9Db3MnO1xuaW1wb3J0IHtjb3NoQ29uZmlnfSBmcm9tICcuL2tlcm5lbHMvQ29zaCc7XG5pbXBvcnQge2Nyb3BBbmRSZXNpemVDb25maWd9IGZyb20gJy4va2VybmVscy9Dcm9wQW5kUmVzaXplJztcbmltcG9ydCB7Y3VtcHJvZENvbmZpZ30gZnJvbSAnLi9rZXJuZWxzL0N1bXByb2QnO1xuaW1wb3J0IHtjdW1zdW1Db25maWd9IGZyb20gJy4va2VybmVscy9DdW1zdW0nO1xuaW1wb3J0IHtkZW5zZUJpbmNvdW50Q29uZmlnfSBmcm9tICcuL2tlcm5lbHMvRGVuc2VCaW5jb3VudCc7XG5pbXBvcnQge2RlcHRoVG9TcGFjZUNvbmZpZ30gZnJvbSAnLi9rZXJuZWxzL0RlcHRoVG9TcGFjZSc7XG5pbXBvcnQge2RlcHRod2lzZUNvbnYyZE5hdGl2ZUNvbmZpZ30gZnJvbSAnLi9rZXJuZWxzL0RlcHRod2lzZUNvbnYyZE5hdGl2ZSc7XG5pbXBvcnQge2RlcHRod2lzZUNvbnYyZE5hdGl2ZUJhY2twcm9wRmlsdGVyQ29uZmlnfSBmcm9tICcuL2tlcm5lbHMvRGVwdGh3aXNlQ29udjJkTmF0aXZlQmFja3Byb3BGaWx0ZXInO1xuaW1wb3J0IHtkZXB0aHdpc2VDb252MmROYXRpdmVCYWNrcHJvcElucHV0Q29uZmlnfSBmcm9tICcuL2tlcm5lbHMvRGVwdGh3aXNlQ29udjJkTmF0aXZlQmFja3Byb3BJbnB1dCc7XG5pbXBvcnQge2RpYWdDb25maWd9IGZyb20gJy4va2VybmVscy9EaWFnJztcbmltcG9ydCB7ZGlsYXRpb24yRENvbmZpZ30gZnJvbSAnLi9rZXJuZWxzL0RpbGF0aW9uMkQnO1xuaW1wb3J0IHtlaW5zdW1Db25maWd9IGZyb20gJy4va2VybmVscy9FaW5zdW0nO1xuaW1wb3J0IHtlbHVDb25maWd9IGZyb20gJy4va2VybmVscy9FbHUnO1xuaW1wb3J0IHtlbHVHcmFkQ29uZmlnfSBmcm9tICcuL2tlcm5lbHMvRWx1R3JhZCc7XG5pbXBvcnQge2VxdWFsQ29uZmlnfSBmcm9tICcuL2tlcm5lbHMvRXF1YWwnO1xuaW1wb3J0IHtlcmZDb25maWd9IGZyb20gJy4va2VybmVscy9FcmYnO1xuaW1wb3J0IHtleHBDb25maWd9IGZyb20gJy4va2VybmVscy9FeHAnO1xuaW1wb3J0IHtleHBhbmREaW1zQ29uZmlnfSBmcm9tICcuL2tlcm5lbHMvRXhwYW5kRGltcyc7XG5pbXBvcnQge2V4cG0xQ29uZmlnfSBmcm9tICcuL2tlcm5lbHMvRXhwbTEnO1xuaW1wb3J0IHtmZnRDb25maWd9IGZyb20gJy4va2VybmVscy9GRlQnO1xuaW1wb3J0IHtmaWxsQ29uZmlnfSBmcm9tICcuL2tlcm5lbHMvRmlsbCc7XG5pbXBvcnQge2ZsaXBMZWZ0UmlnaHRDb25maWd9IGZyb20gJy4va2VybmVscy9GbGlwTGVmdFJpZ2h0JztcbmltcG9ydCB7Zmxvb3JDb25maWd9IGZyb20gJy4va2VybmVscy9GbG9vcic7XG5pbXBvcnQge2Zsb29yRGl2Q29uZmlnfSBmcm9tICcuL2tlcm5lbHMvRmxvb3JEaXYnO1xuaW1wb3J0IHtmcm9tUGl4ZWxzQ29uZmlnfSBmcm9tICcuL2tlcm5lbHMvRnJvbVBpeGVscyc7XG5pbXBvcnQge2Z1c2VkQ29udjJEQ29uZmlnfSBmcm9tICcuL2tlcm5lbHMvRnVzZWRDb252MkQnO1xuaW1wb3J0IHtmdXNlZERlcHRod2lzZUNvbnYyRENvbmZpZ30gZnJvbSAnLi9rZXJuZWxzL0Z1c2VkRGVwdGh3aXNlQ29udjJEJztcbmltcG9ydCB7Z2F0aGVyTmRDb25maWd9IGZyb20gJy4va2VybmVscy9HYXRoZXJOZCc7XG5pbXBvcnQge2dhdGhlclYyQ29uZmlnfSBmcm9tICcuL2tlcm5lbHMvR2F0aGVyVjInO1xuaW1wb3J0IHtncmVhdGVyQ29uZmlnfSBmcm9tICcuL2tlcm5lbHMvR3JlYXRlcic7XG5pbXBvcnQge2dyZWF0ZXJFcXVhbENvbmZpZ30gZnJvbSAnLi9rZXJuZWxzL0dyZWF0ZXJFcXVhbCc7XG5pbXBvcnQge2lkZW50aXR5Q29uZmlnfSBmcm9tICcuL2tlcm5lbHMvSWRlbnRpdHknO1xuaW1wb3J0IHtpZmZ0Q29uZmlnfSBmcm9tICcuL2tlcm5lbHMvSUZGVCc7XG5pbXBvcnQge2ltYWdDb25maWd9IGZyb20gJy4va2VybmVscy9JbWFnJztcbmltcG9ydCB7aXNGaW5pdGVDb25maWd9IGZyb20gJy4va2VybmVscy9Jc0Zpbml0ZSc7XG5pbXBvcnQge2lzSW5mQ29uZmlnfSBmcm9tICcuL2tlcm5lbHMvSXNJbmYnO1xuaW1wb3J0IHtpc05hTkNvbmZpZ30gZnJvbSAnLi9rZXJuZWxzL0lzTmFOJztcbmltcG9ydCB7bGVha3lSZWx1Q29uZmlnfSBmcm9tICcuL2tlcm5lbHMvTGVha3lSZWx1JztcbmltcG9ydCB7bGVzc0NvbmZpZ30gZnJvbSAnLi9rZXJuZWxzL0xlc3MnO1xuaW1wb3J0IHtsZXNzRXF1YWxDb25maWd9IGZyb20gJy4va2VybmVscy9MZXNzRXF1YWwnO1xuaW1wb3J0IHtsaW5TcGFjZUNvbmZpZ30gZnJvbSAnLi9rZXJuZWxzL0xpblNwYWNlJztcbmltcG9ydCB7bG9nQ29uZmlnfSBmcm9tICcuL2tlcm5lbHMvTG9nJztcbmltcG9ydCB7bG9nMXBDb25maWd9IGZyb20gJy4va2VybmVscy9Mb2cxcCc7XG5pbXBvcnQge2xvZ2ljYWxBbmRDb25maWd9IGZyb20gJy4va2VybmVscy9Mb2dpY2FsQW5kJztcbmltcG9ydCB7bG9naWNhbE5vdENvbmZpZ30gZnJvbSAnLi9rZXJuZWxzL0xvZ2ljYWxOb3QnO1xuaW1wb3J0IHtsb2dpY2FsT3JDb25maWd9IGZyb20gJy4va2VybmVscy9Mb2dpY2FsT3InO1xuaW1wb3J0IHtMUk5Db25maWd9IGZyb20gJy4va2VybmVscy9MUk4nO1xuaW1wb3J0IHtMUk5HcmFkQ29uZmlnfSBmcm9tICcuL2tlcm5lbHMvTFJOR3JhZCc7XG5pbXBvcnQge21heENvbmZpZ30gZnJvbSAnLi9rZXJuZWxzL01heCc7XG5pbXBvcnQge21heGltdW1Db25maWd9IGZyb20gJy4va2VybmVscy9NYXhpbXVtJztcbmltcG9ydCB7bWF4UG9vbENvbmZpZ30gZnJvbSAnLi9rZXJuZWxzL01heFBvb2wnO1xuaW1wb3J0IHttYXhQb29sM0RDb25maWd9IGZyb20gJy4va2VybmVscy9NYXhQb29sM0QnO1xuaW1wb3J0IHttYXhQb29sM0RHcmFkQ29uZmlnfSBmcm9tICcuL2tlcm5lbHMvTWF4UG9vbDNER3JhZCc7XG5pbXBvcnQge21heFBvb2xHcmFkQ29uZmlnfSBmcm9tICcuL2tlcm5lbHMvTWF4UG9vbEdyYWQnO1xuaW1wb3J0IHttYXhQb29sV2l0aEFyZ21heENvbmZpZ30gZnJvbSAnLi9rZXJuZWxzL01heFBvb2xXaXRoQXJnbWF4JztcbmltcG9ydCB7bWVhbkNvbmZpZ30gZnJvbSAnLi9rZXJuZWxzL01lYW4nO1xuaW1wb3J0IHttaW5Db25maWd9IGZyb20gJy4va2VybmVscy9NaW4nO1xuaW1wb3J0IHttaW5pbXVtQ29uZmlnfSBmcm9tICcuL2tlcm5lbHMvTWluaW11bSc7XG5pbXBvcnQge21pcnJvclBhZENvbmZpZ30gZnJvbSAnLi9rZXJuZWxzL01pcnJvclBhZCc7XG5pbXBvcnQge21vZENvbmZpZ30gZnJvbSAnLi9rZXJuZWxzL01vZCc7XG5pbXBvcnQge211bHRpbm9taWFsQ29uZmlnfSBmcm9tICcuL2tlcm5lbHMvTXVsdGlub21pYWwnO1xuaW1wb3J0IHttdWx0aXBseUNvbmZpZ30gZnJvbSAnLi9rZXJuZWxzL011bHRpcGx5JztcbmltcG9ydCB7bmVnQ29uZmlnfSBmcm9tICcuL2tlcm5lbHMvTmVnJztcbmltcG9ydCB7bm9uTWF4U3VwcHJlc3Npb25WM0NvbmZpZ30gZnJvbSAnLi9rZXJuZWxzL05vbk1heFN1cHByZXNzaW9uVjMnO1xuaW1wb3J0IHtub25NYXhTdXBwcmVzc2lvblY0Q29uZmlnfSBmcm9tICcuL2tlcm5lbHMvTm9uTWF4U3VwcHJlc3Npb25WNCc7XG5pbXBvcnQge25vbk1heFN1cHByZXNzaW9uVjVDb25maWd9IGZyb20gJy4va2VybmVscy9Ob25NYXhTdXBwcmVzc2lvblY1JztcbmltcG9ydCB7bm90RXF1YWxDb25maWd9IGZyb20gJy4va2VybmVscy9Ob3RFcXVhbCc7XG5pbXBvcnQge29uZUhvdENvbmZpZ30gZnJvbSAnLi9rZXJuZWxzL09uZUhvdCc7XG5pbXBvcnQge29uZXNMaWtlQ29uZmlnfSBmcm9tICcuL2tlcm5lbHMvT25lc0xpa2UnO1xuaW1wb3J0IHtwYWNrQ29uZmlnfSBmcm9tICcuL2tlcm5lbHMvUGFjayc7XG5pbXBvcnQge3BhZFYyQ29uZmlnfSBmcm9tICcuL2tlcm5lbHMvUGFkVjInO1xuaW1wb3J0IHtwb3dDb25maWd9IGZyb20gJy4va2VybmVscy9Qb3cnO1xuaW1wb3J0IHtwcmVsdUNvbmZpZ30gZnJvbSAnLi9rZXJuZWxzL1ByZWx1JztcbmltcG9ydCB7cHJvZENvbmZpZ30gZnJvbSAnLi9rZXJuZWxzL1Byb2QnO1xuaW1wb3J0IHtyYWdnZWRHYXRoZXJDb25maWd9IGZyb20gJy4va2VybmVscy9SYWdnZWRHYXRoZXInO1xuaW1wb3J0IHtyYWdnZWRUZW5zb3JUb1RlbnNvckNvbmZpZ30gZnJvbSAnLi9rZXJuZWxzL1JhZ2dlZFRlbnNvclRvVGVuc29yJztcbmltcG9ydCB7cmFuZ2VDb25maWd9IGZyb20gJy4va2VybmVscy9SYW5nZSc7XG5pbXBvcnQge3JlYWxDb25maWd9IGZyb20gJy4va2VybmVscy9SZWFsJztcbmltcG9ydCB7cmVhbERpdkNvbmZpZ30gZnJvbSAnLi9rZXJuZWxzL1JlYWxEaXYnO1xuaW1wb3J0IHtyZWNpcHJvY2FsQ29uZmlnfSBmcm9tICcuL2tlcm5lbHMvUmVjaXByb2NhbCc7XG5pbXBvcnQge3JlbHVDb25maWd9IGZyb20gJy4va2VybmVscy9SZWx1JztcbmltcG9ydCB7cmVsdTZDb25maWd9IGZyb20gJy4va2VybmVscy9SZWx1Nic7XG5pbXBvcnQge3Jlc2hhcGVDb25maWd9IGZyb20gJy4va2VybmVscy9SZXNoYXBlJztcbmltcG9ydCB7cmVzaXplQmlsaW5lYXJDb25maWd9IGZyb20gJy4va2VybmVscy9SZXNpemVCaWxpbmVhcic7XG5pbXBvcnQge3Jlc2l6ZUJpbGluZWFyR3JhZENvbmZpZ30gZnJvbSAnLi9rZXJuZWxzL1Jlc2l6ZUJpbGluZWFyR3JhZCc7XG5pbXBvcnQge3Jlc2l6ZU5lYXJlc3ROZWlnaGJvckNvbmZpZ30gZnJvbSAnLi9rZXJuZWxzL1Jlc2l6ZU5lYXJlc3ROZWlnaGJvcic7XG5pbXBvcnQge3Jlc2l6ZU5lYXJlc3ROZWlnaGJvckdyYWRDb25maWd9IGZyb20gJy4va2VybmVscy9SZXNpemVOZWFyZXN0TmVpZ2hib3JHcmFkJztcbmltcG9ydCB7cmV2ZXJzZUNvbmZpZ30gZnJvbSAnLi9rZXJuZWxzL1JldmVyc2UnO1xuaW1wb3J0IHtyb3RhdGVXaXRoT2Zmc2V0Q29uZmlnfSBmcm9tICcuL2tlcm5lbHMvUm90YXRlV2l0aE9mZnNldCc7XG5pbXBvcnQge3JvdW5kQ29uZmlnfSBmcm9tICcuL2tlcm5lbHMvUm91bmQnO1xuaW1wb3J0IHtyc3FydENvbmZpZ30gZnJvbSAnLi9rZXJuZWxzL1JzcXJ0JztcbmltcG9ydCB7c2NhdHRlck5kQ29uZmlnfSBmcm9tICcuL2tlcm5lbHMvU2NhdHRlck5kJztcbmltcG9ydCB7c2VhcmNoU29ydGVkQ29uZmlnfSBmcm9tICcuL2tlcm5lbHMvU2VhcmNoU29ydGVkJztcbmltcG9ydCB7c2VsZWN0Q29uZmlnfSBmcm9tICcuL2tlcm5lbHMvU2VsZWN0JztcbmltcG9ydCB7c2VsdUNvbmZpZ30gZnJvbSAnLi9rZXJuZWxzL1NlbHUnO1xuaW1wb3J0IHtzaWdtb2lkQ29uZmlnfSBmcm9tICcuL2tlcm5lbHMvU2lnbW9pZCc7XG5pbXBvcnQge3NpZ25Db25maWd9IGZyb20gJy4va2VybmVscy9TaWduJztcbmltcG9ydCB7c2luQ29uZmlnfSBmcm9tICcuL2tlcm5lbHMvU2luJztcbmltcG9ydCB7c2luaENvbmZpZ30gZnJvbSAnLi9rZXJuZWxzL1NpbmgnO1xuaW1wb3J0IHtzbGljZUNvbmZpZ30gZnJvbSAnLi9rZXJuZWxzL1NsaWNlJztcbmltcG9ydCB7c29mdG1heENvbmZpZ30gZnJvbSAnLi9rZXJuZWxzL1NvZnRtYXgnO1xuaW1wb3J0IHtzb2Z0cGx1c0NvbmZpZ30gZnJvbSAnLi9rZXJuZWxzL1NvZnRwbHVzJztcbmltcG9ydCB7c3BhY2VUb0JhdGNoTkRDb25maWd9IGZyb20gJy4va2VybmVscy9TcGFjZVRvQmF0Y2hORCc7XG5pbXBvcnQge3NwYXJzZUZpbGxFbXB0eVJvd3NDb25maWd9IGZyb20gJy4va2VybmVscy9TcGFyc2VGaWxsRW1wdHlSb3dzJztcbmltcG9ydCB7c3BhcnNlUmVzaGFwZUNvbmZpZ30gZnJvbSAnLi9rZXJuZWxzL1NwYXJzZVJlc2hhcGUnO1xuaW1wb3J0IHtzcGFyc2VTZWdtZW50TWVhbkNvbmZpZ30gZnJvbSAnLi9rZXJuZWxzL1NwYXJzZVNlZ21lbnRNZWFuJztcbmltcG9ydCB7c3BhcnNlU2VnbWVudFN1bUNvbmZpZ30gZnJvbSAnLi9rZXJuZWxzL1NwYXJzZVNlZ21lbnRTdW0nO1xuaW1wb3J0IHtzcGFyc2VUb0RlbnNlQ29uZmlnfSBmcm9tICcuL2tlcm5lbHMvU3BhcnNlVG9EZW5zZSc7XG5pbXBvcnQge3NwbGl0VkNvbmZpZ30gZnJvbSAnLi9rZXJuZWxzL1NwbGl0Vic7XG5pbXBvcnQge3NxcnRDb25maWd9IGZyb20gJy4va2VybmVscy9TcXJ0JztcbmltcG9ydCB7c3F1YXJlQ29uZmlnfSBmcm9tICcuL2tlcm5lbHMvU3F1YXJlJztcbmltcG9ydCB7c3F1YXJlZERpZmZlcmVuY2VDb25maWd9IGZyb20gJy4va2VybmVscy9TcXVhcmVkRGlmZmVyZW5jZSc7XG5pbXBvcnQge3N0ZXBDb25maWd9IGZyb20gJy4va2VybmVscy9TdGVwJztcbmltcG9ydCB7c3RyaWRlZFNsaWNlQ29uZmlnfSBmcm9tICcuL2tlcm5lbHMvU3RyaWRlZFNsaWNlJztcbmltcG9ydCB7c3RyaW5nTkdyYW1zQ29uZmlnfSBmcm9tICcuL2tlcm5lbHMvU3RyaW5nTkdyYW1zJztcbmltcG9ydCB7c3RyaW5nU3BsaXRDb25maWd9IGZyb20gJy4va2VybmVscy9TdHJpbmdTcGxpdCc7XG5pbXBvcnQge3N0cmluZ1RvSGFzaEJ1Y2tldEZhc3RDb25maWd9IGZyb20gJy4va2VybmVscy9TdHJpbmdUb0hhc2hCdWNrZXRGYXN0JztcbmltcG9ydCB7c3ViQ29uZmlnfSBmcm9tICcuL2tlcm5lbHMvU3ViJztcbmltcG9ydCB7c3VtQ29uZmlnfSBmcm9tICcuL2tlcm5lbHMvU3VtJztcbmltcG9ydCB7dGFuQ29uZmlnfSBmcm9tICcuL2tlcm5lbHMvVGFuJztcbmltcG9ydCB7dGFuaENvbmZpZ30gZnJvbSAnLi9rZXJuZWxzL1RhbmgnO1xuaW1wb3J0IHt0aWxlQ29uZmlnfSBmcm9tICcuL2tlcm5lbHMvVGlsZSc7XG5pbXBvcnQge3RvcEtDb25maWd9IGZyb20gJy4va2VybmVscy9Ub3BLJztcbmltcG9ydCB7dHJhbnNmb3JtQ29uZmlnfSBmcm9tICcuL2tlcm5lbHMvVHJhbnNmb3JtJztcbmltcG9ydCB7dHJhbnNwb3NlQ29uZmlnfSBmcm9tICcuL2tlcm5lbHMvVHJhbnNwb3NlJztcbmltcG9ydCB7dW5pcXVlQ29uZmlnfSBmcm9tICcuL2tlcm5lbHMvVW5pcXVlJztcbmltcG9ydCB7dW5wYWNrQ29uZmlnfSBmcm9tICcuL2tlcm5lbHMvVW5wYWNrJztcbmltcG9ydCB7dW5zb3J0ZWRTZWdtZW50U3VtQ29uZmlnfSBmcm9tICcuL2tlcm5lbHMvVW5zb3J0ZWRTZWdtZW50U3VtJztcbmltcG9ydCB7emVyb3NMaWtlQ29uZmlnfSBmcm9tICcuL2tlcm5lbHMvWmVyb3NMaWtlJztcblxuLy8gTGlzdCBhbGwga2VybmVsIGNvbmZpZ3MgaGVyZVxuY29uc3Qga2VybmVsQ29uZmlnczogS2VybmVsQ29uZmlnW10gPSBbXG4gIF9mdXNlZE1hdE11bENvbmZpZyxcbiAgYWJzQ29uZmlnLFxuICBhY29zQ29uZmlnLFxuICBhY29zaENvbmZpZyxcbiAgYWRkQ29uZmlnLFxuICBhZGROQ29uZmlnLFxuICBhbGxDb25maWcsXG4gIGFueUNvbmZpZyxcbiAgYXJnTWF4Q29uZmlnLFxuICBhcmdNaW5Db25maWcsXG4gIGFzaW5Db25maWcsXG4gIGFzaW5oQ29uZmlnLFxuICBhdGFuQ29uZmlnLFxuICBhdGFuMkNvbmZpZyxcbiAgYXRhbmhDb25maWcsXG4gIGF2Z1Bvb2xDb25maWcsXG4gIGF2Z1Bvb2wzRENvbmZpZyxcbiAgYXZnUG9vbDNER3JhZENvbmZpZyxcbiAgYXZnUG9vbEdyYWRDb25maWcsXG4gIGJhdGNoTWF0TXVsQ29uZmlnLFxuICBiYXRjaE5vcm1Db25maWcsXG4gIGJhdGNoVG9TcGFjZU5EQ29uZmlnLFxuICBiaW5jb3VudENvbmZpZyxcbiAgYnJvYWRjYXN0QXJnc0NvbmZpZyxcbiAgY2FzdENvbmZpZyxcbiAgY2VpbENvbmZpZyxcbiAgY2xpcEJ5VmFsdWVDb25maWcsXG4gIGNvbXBsZXhDb25maWcsXG4gIGNvbXBsZXhBYnNDb25maWcsXG4gIGNvbmNhdENvbmZpZyxcbiAgY29udjJEQ29uZmlnLFxuICBjb252MkRCYWNrcHJvcEZpbHRlckNvbmZpZyxcbiAgY29udjJEQmFja3Byb3BJbnB1dENvbmZpZyxcbiAgY29udjNEQ29uZmlnLFxuICBjb252M0RCYWNrcHJvcEZpbHRlclYyQ29uZmlnLFxuICBjb252M0RCYWNrcHJvcElucHV0Q29uZmlnLFxuICBjb3NDb25maWcsXG4gIGNvc2hDb25maWcsXG4gIGNyb3BBbmRSZXNpemVDb25maWcsXG4gIGN1bXByb2RDb25maWcsXG4gIGN1bXN1bUNvbmZpZyxcbiAgZGVuc2VCaW5jb3VudENvbmZpZyxcbiAgZGVwdGhUb1NwYWNlQ29uZmlnLFxuICBkZXB0aHdpc2VDb252MmROYXRpdmVDb25maWcsXG4gIGRlcHRod2lzZUNvbnYyZE5hdGl2ZUJhY2twcm9wRmlsdGVyQ29uZmlnLFxuICBkZXB0aHdpc2VDb252MmROYXRpdmVCYWNrcHJvcElucHV0Q29uZmlnLFxuICBkaWFnQ29uZmlnLFxuICBkaWxhdGlvbjJEQ29uZmlnLFxuICBlaW5zdW1Db25maWcsXG4gIGVsdUNvbmZpZyxcbiAgZWx1R3JhZENvbmZpZyxcbiAgZXF1YWxDb25maWcsXG4gIGVyZkNvbmZpZyxcbiAgZXhwQ29uZmlnLFxuICBleHBhbmREaW1zQ29uZmlnLFxuICBleHBtMUNvbmZpZyxcbiAgZmZ0Q29uZmlnLFxuICBmaWxsQ29uZmlnLFxuICBmbGlwTGVmdFJpZ2h0Q29uZmlnLFxuICBmbG9vckNvbmZpZyxcbiAgZmxvb3JEaXZDb25maWcsXG4gIGZyb21QaXhlbHNDb25maWcsXG4gIGZ1c2VkQ29udjJEQ29uZmlnLFxuICBmdXNlZERlcHRod2lzZUNvbnYyRENvbmZpZyxcbiAgZ2F0aGVyTmRDb25maWcsXG4gIGdhdGhlclYyQ29uZmlnLFxuICBncmVhdGVyQ29uZmlnLFxuICBncmVhdGVyRXF1YWxDb25maWcsXG4gIGlkZW50aXR5Q29uZmlnLFxuICBpZmZ0Q29uZmlnLFxuICBpbWFnQ29uZmlnLFxuICBpc0Zpbml0ZUNvbmZpZyxcbiAgaXNJbmZDb25maWcsXG4gIGlzTmFOQ29uZmlnLFxuICBsZWFreVJlbHVDb25maWcsXG4gIGxlc3NDb25maWcsXG4gIGxlc3NFcXVhbENvbmZpZyxcbiAgbGluU3BhY2VDb25maWcsXG4gIGxvZ0NvbmZpZyxcbiAgbG9nMXBDb25maWcsXG4gIGxvZ2ljYWxBbmRDb25maWcsXG4gIGxvZ2ljYWxOb3RDb25maWcsXG4gIGxvZ2ljYWxPckNvbmZpZyxcbiAgTFJOQ29uZmlnLFxuICBMUk5HcmFkQ29uZmlnLFxuICBtYXhDb25maWcsXG4gIG1heGltdW1Db25maWcsXG4gIG1heFBvb2xDb25maWcsXG4gIG1heFBvb2wzRENvbmZpZyxcbiAgbWF4UG9vbDNER3JhZENvbmZpZyxcbiAgbWF4UG9vbEdyYWRDb25maWcsXG4gIG1heFBvb2xXaXRoQXJnbWF4Q29uZmlnLFxuICBtZWFuQ29uZmlnLFxuICBtaW5Db25maWcsXG4gIG1pbmltdW1Db25maWcsXG4gIG1pcnJvclBhZENvbmZpZyxcbiAgbW9kQ29uZmlnLFxuICBtdWx0aW5vbWlhbENvbmZpZyxcbiAgbXVsdGlwbHlDb25maWcsXG4gIG5lZ0NvbmZpZyxcbiAgbm9uTWF4U3VwcHJlc3Npb25WM0NvbmZpZyxcbiAgbm9uTWF4U3VwcHJlc3Npb25WNENvbmZpZyxcbiAgbm9uTWF4U3VwcHJlc3Npb25WNUNvbmZpZyxcbiAgbm90RXF1YWxDb25maWcsXG4gIG9uZUhvdENvbmZpZyxcbiAgb25lc0xpa2VDb25maWcsXG4gIHBhY2tDb25maWcsXG4gIHBhZFYyQ29uZmlnLFxuICBwb3dDb25maWcsXG4gIHByZWx1Q29uZmlnLFxuICBwcm9kQ29uZmlnLFxuICByYWdnZWRHYXRoZXJDb25maWcsXG4gIHJhZ2dlZFRlbnNvclRvVGVuc29yQ29uZmlnLFxuICByYW5nZUNvbmZpZyxcbiAgcmVhbENvbmZpZyxcbiAgcmVhbERpdkNvbmZpZyxcbiAgcmVjaXByb2NhbENvbmZpZyxcbiAgcmVsdUNvbmZpZyxcbiAgcmVsdTZDb25maWcsXG4gIHJlc2hhcGVDb25maWcsXG4gIHJlc2l6ZUJpbGluZWFyQ29uZmlnLFxuICByZXNpemVCaWxpbmVhckdyYWRDb25maWcsXG4gIHJlc2l6ZU5lYXJlc3ROZWlnaGJvckNvbmZpZyxcbiAgcmVzaXplTmVhcmVzdE5laWdoYm9yR3JhZENvbmZpZyxcbiAgcmV2ZXJzZUNvbmZpZyxcbiAgcm90YXRlV2l0aE9mZnNldENvbmZpZyxcbiAgcm91bmRDb25maWcsXG4gIHJzcXJ0Q29uZmlnLFxuICBzY2F0dGVyTmRDb25maWcsXG4gIHNlYXJjaFNvcnRlZENvbmZpZyxcbiAgc2VsZWN0Q29uZmlnLFxuICBzZWx1Q29uZmlnLFxuICBzaWdtb2lkQ29uZmlnLFxuICBzaWduQ29uZmlnLFxuICBzaW5Db25maWcsXG4gIHNpbmhDb25maWcsXG4gIHNsaWNlQ29uZmlnLFxuICBzb2Z0bWF4Q29uZmlnLFxuICBzb2Z0cGx1c0NvbmZpZyxcbiAgc3BhY2VUb0JhdGNoTkRDb25maWcsXG4gIHNwYXJzZUZpbGxFbXB0eVJvd3NDb25maWcsXG4gIHNwYXJzZVJlc2hhcGVDb25maWcsXG4gIHNwYXJzZVNlZ21lbnRNZWFuQ29uZmlnLFxuICBzcGFyc2VTZWdtZW50U3VtQ29uZmlnLFxuICBzcGFyc2VUb0RlbnNlQ29uZmlnLFxuICBzcGxpdFZDb25maWcsXG4gIHNxcnRDb25maWcsXG4gIHNxdWFyZUNvbmZpZyxcbiAgc3F1YXJlZERpZmZlcmVuY2VDb25maWcsXG4gIHN0ZXBDb25maWcsXG4gIHN0cmlkZWRTbGljZUNvbmZpZyxcbiAgc3RyaW5nTkdyYW1zQ29uZmlnLFxuICBzdHJpbmdTcGxpdENvbmZpZyxcbiAgc3RyaW5nVG9IYXNoQnVja2V0RmFzdENvbmZpZyxcbiAgc3ViQ29uZmlnLFxuICBzdW1Db25maWcsXG4gIHRhbkNvbmZpZyxcbiAgdGFuaENvbmZpZyxcbiAgdGlsZUNvbmZpZyxcbiAgdG9wS0NvbmZpZyxcbiAgdHJhbnNmb3JtQ29uZmlnLFxuICB0cmFuc3Bvc2VDb25maWcsXG4gIHVuaXF1ZUNvbmZpZyxcbiAgdW5wYWNrQ29uZmlnLFxuICB1bnNvcnRlZFNlZ21lbnRTdW1Db25maWcsXG4gIHplcm9zTGlrZUNvbmZpZ1xuXTtcblxuZm9yIChjb25zdCBrZXJuZWxDb25maWcgb2Yga2VybmVsQ29uZmlncykge1xuICByZWdpc3Rlcktlcm5lbChrZXJuZWxDb25maWcpO1xufVxuIl19","/** @license See the LICENSE file. */\n// This code is auto-generated, do not modify this file!\nconst version = '3.21.0';\nexport { version };\n//# sourceMappingURL=version.js.map","/**\n * @license\n * Copyright 2018 Google LLC. All Rights Reserved.\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n * =============================================================================\n */\nimport '@tensorflow/tfjs-core';\n// tslint:disable-next-line: no-imports-from-dist\nimport '@tensorflow/tfjs-core/dist/register_all_gradients';\n// tslint:disable-next-line: no-imports-from-dist\nimport '@tensorflow/tfjs-core/dist/public/chained_ops/register_all_chained_ops';\nexport * from '@tensorflow/tfjs-core';\nexport * from '@tensorflow/tfjs-layers';\nexport * from '@tensorflow/tfjs-converter';\n// Export data api as tf.data\nimport * as data from '@tensorflow/tfjs-data';\nexport { data };\n// Import and register backends.\nimport '@tensorflow/tfjs-backend-cpu';\nimport '@tensorflow/tfjs-backend-webgl';\n// Import versions of all sub-packages.\nimport { version_core } from '@tensorflow/tfjs-core';\nimport { version_cpu } from '@tensorflow/tfjs-backend-cpu';\nimport { version_webgl } from '@tensorflow/tfjs-backend-webgl';\nimport { version_data } from '@tensorflow/tfjs-data';\nimport { version_layers } from '@tensorflow/tfjs-layers';\nimport { version_converter } from '@tensorflow/tfjs-converter';\nimport { version as version_union } from './version';\nexport const version = {\n 'tfjs-core': version_core,\n 'tfjs-backend-cpu': version_cpu,\n 'tfjs-backend-webgl': version_webgl,\n 'tfjs-data': version_data,\n 'tfjs-layers': version_layers,\n 'tfjs-converter': version_converter,\n 'tfjs': version_union\n};\n//# sourceMappingURL=index.js.map","/** @license See the LICENSE file. */\n// This code is auto-generated, do not modify this file!\nconst version = '3.21.0';\nexport { version };\n//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidmVyc2lvbi5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uL3RmanMtYmFja2VuZC1jcHUvc3JjL3ZlcnNpb24udHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEscUNBQXFDO0FBRXJDLHdEQUF3RDtBQUN4RCxNQUFNLE9BQU8sR0FBRyxRQUFRLENBQUM7QUFDekIsT0FBTyxFQUFDLE9BQU8sRUFBQyxDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiLyoqIEBsaWNlbnNlIFNlZSB0aGUgTElDRU5TRSBmaWxlLiAqL1xuXG4vLyBUaGlzIGNvZGUgaXMgYXV0by1nZW5lcmF0ZWQsIGRvIG5vdCBtb2RpZnkgdGhpcyBmaWxlIVxuY29uc3QgdmVyc2lvbiA9ICczLjIxLjAnO1xuZXhwb3J0IHt2ZXJzaW9ufTtcbiJdfQ==","/** @license See the LICENSE file. */\n// This code is auto-generated, do not modify this file!\nconst version = '3.21.0';\nexport { version };\n//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidmVyc2lvbi5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uL3RmanMtYmFja2VuZC13ZWJnbC9zcmMvdmVyc2lvbi50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxxQ0FBcUM7QUFFckMsd0RBQXdEO0FBQ3hELE1BQU0sT0FBTyxHQUFHLFFBQVEsQ0FBQztBQUN6QixPQUFPLEVBQUMsT0FBTyxFQUFDLENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyIvKiogQGxpY2Vuc2UgU2VlIHRoZSBMSUNFTlNFIGZpbGUuICovXG5cbi8vIFRoaXMgY29kZSBpcyBhdXRvLWdlbmVyYXRlZCwgZG8gbm90IG1vZGlmeSB0aGlzIGZpbGUhXG5jb25zdCB2ZXJzaW9uID0gJzMuMjEuMCc7XG5leHBvcnQge3ZlcnNpb259O1xuIl19","(function() {\n var context = this;\n\n (function() {\n (function() {\n var slice = [].slice;\n\n this.ActionCable = {\n INTERNAL: {\n \"message_types\": {\n \"welcome\": \"welcome\",\n \"ping\": \"ping\",\n \"confirmation\": \"confirm_subscription\",\n \"rejection\": \"reject_subscription\"\n },\n \"default_mount_path\": \"/cable\",\n \"protocols\": [\"actioncable-v1-json\", \"actioncable-unsupported\"]\n },\n WebSocket: window.WebSocket,\n logger: window.console,\n createConsumer: function(url) {\n var ref;\n if (url == null) {\n url = (ref = this.getConfig(\"url\")) != null ? ref : this.INTERNAL.default_mount_path;\n }\n return new ActionCable.Consumer(this.createWebSocketURL(url));\n },\n getConfig: function(name) {\n var element;\n element = document.head.querySelector(\"meta[name='action-cable-\" + name + \"']\");\n return element != null ? element.getAttribute(\"content\") : void 0;\n },\n createWebSocketURL: function(url) {\n var a;\n if (url && !/^wss?:/i.test(url)) {\n a = document.createElement(\"a\");\n a.href = url;\n a.href = a.href;\n a.protocol = a.protocol.replace(\"http\", \"ws\");\n return a.href;\n } else {\n return url;\n }\n },\n startDebugging: function() {\n return this.debugging = true;\n },\n stopDebugging: function() {\n return this.debugging = null;\n },\n log: function() {\n var messages, ref;\n messages = 1 <= arguments.length ? slice.call(arguments, 0) : [];\n if (this.debugging) {\n messages.push(Date.now());\n return (ref = this.logger).log.apply(ref, [\"[ActionCable]\"].concat(slice.call(messages)));\n }\n }\n };\n\n }).call(this);\n }).call(context);\n\n var ActionCable = context.ActionCable;\n\n (function() {\n (function() {\n var bind = function(fn, me){ return function(){ return fn.apply(me, arguments); }; };\n\n ActionCable.ConnectionMonitor = (function() {\n var clamp, now, secondsSince;\n\n ConnectionMonitor.pollInterval = {\n min: 3,\n max: 30\n };\n\n ConnectionMonitor.staleThreshold = 6;\n\n function ConnectionMonitor(connection) {\n this.connection = connection;\n this.visibilityDidChange = bind(this.visibilityDidChange, this);\n this.reconnectAttempts = 0;\n }\n\n ConnectionMonitor.prototype.start = function() {\n if (!this.isRunning()) {\n this.startedAt = now();\n delete this.stoppedAt;\n this.startPolling();\n document.addEventListener(\"visibilitychange\", this.visibilityDidChange);\n return ActionCable.log(\"ConnectionMonitor started. pollInterval = \" + (this.getPollInterval()) + \" ms\");\n }\n };\n\n ConnectionMonitor.prototype.stop = function() {\n if (this.isRunning()) {\n this.stoppedAt = now();\n this.stopPolling();\n document.removeEventListener(\"visibilitychange\", this.visibilityDidChange);\n return ActionCable.log(\"ConnectionMonitor stopped\");\n }\n };\n\n ConnectionMonitor.prototype.isRunning = function() {\n return (this.startedAt != null) && (this.stoppedAt == null);\n };\n\n ConnectionMonitor.prototype.recordPing = function() {\n return this.pingedAt = now();\n };\n\n ConnectionMonitor.prototype.recordConnect = function() {\n this.reconnectAttempts = 0;\n this.recordPing();\n delete this.disconnectedAt;\n return ActionCable.log(\"ConnectionMonitor recorded connect\");\n };\n\n ConnectionMonitor.prototype.recordDisconnect = function() {\n this.disconnectedAt = now();\n return ActionCable.log(\"ConnectionMonitor recorded disconnect\");\n };\n\n ConnectionMonitor.prototype.startPolling = function() {\n this.stopPolling();\n return this.poll();\n };\n\n ConnectionMonitor.prototype.stopPolling = function() {\n return clearTimeout(this.pollTimeout);\n };\n\n ConnectionMonitor.prototype.poll = function() {\n return this.pollTimeout = setTimeout((function(_this) {\n return function() {\n _this.reconnectIfStale();\n return _this.poll();\n };\n })(this), this.getPollInterval());\n };\n\n ConnectionMonitor.prototype.getPollInterval = function() {\n var interval, max, min, ref;\n ref = this.constructor.pollInterval, min = ref.min, max = ref.max;\n interval = 5 * Math.log(this.reconnectAttempts + 1);\n return Math.round(clamp(interval, min, max) * 1000);\n };\n\n ConnectionMonitor.prototype.reconnectIfStale = function() {\n if (this.connectionIsStale()) {\n ActionCable.log(\"ConnectionMonitor detected stale connection. reconnectAttempts = \" + this.reconnectAttempts + \", pollInterval = \" + (this.getPollInterval()) + \" ms, time disconnected = \" + (secondsSince(this.disconnectedAt)) + \" s, stale threshold = \" + this.constructor.staleThreshold + \" s\");\n this.reconnectAttempts++;\n if (this.disconnectedRecently()) {\n return ActionCable.log(\"ConnectionMonitor skipping reopening recent disconnect\");\n } else {\n ActionCable.log(\"ConnectionMonitor reopening\");\n return this.connection.reopen();\n }\n }\n };\n\n ConnectionMonitor.prototype.connectionIsStale = function() {\n var ref;\n return secondsSince((ref = this.pingedAt) != null ? ref : this.startedAt) > this.constructor.staleThreshold;\n };\n\n ConnectionMonitor.prototype.disconnectedRecently = function() {\n return this.disconnectedAt && secondsSince(this.disconnectedAt) < this.constructor.staleThreshold;\n };\n\n ConnectionMonitor.prototype.visibilityDidChange = function() {\n if (document.visibilityState === \"visible\") {\n return setTimeout((function(_this) {\n return function() {\n if (_this.connectionIsStale() || !_this.connection.isOpen()) {\n ActionCable.log(\"ConnectionMonitor reopening stale connection on visibilitychange. visbilityState = \" + document.visibilityState);\n return _this.connection.reopen();\n }\n };\n })(this), 200);\n }\n };\n\n now = function() {\n return new Date().getTime();\n };\n\n secondsSince = function(time) {\n return (now() - time) / 1000;\n };\n\n clamp = function(number, min, max) {\n return Math.max(min, Math.min(max, number));\n };\n\n return ConnectionMonitor;\n\n })();\n\n }).call(this);\n (function() {\n var i, message_types, protocols, ref, supportedProtocols, unsupportedProtocol,\n slice = [].slice,\n bind = function(fn, me){ return function(){ return fn.apply(me, arguments); }; },\n indexOf = [].indexOf || function(item) { for (var i = 0, l = this.length; i < l; i++) { if (i in this && this[i] === item) return i; } return -1; };\n\n ref = ActionCable.INTERNAL, message_types = ref.message_types, protocols = ref.protocols;\n\n supportedProtocols = 2 <= protocols.length ? slice.call(protocols, 0, i = protocols.length - 1) : (i = 0, []), unsupportedProtocol = protocols[i++];\n\n ActionCable.Connection = (function() {\n Connection.reopenDelay = 500;\n\n function Connection(consumer) {\n this.consumer = consumer;\n this.open = bind(this.open, this);\n this.subscriptions = this.consumer.subscriptions;\n this.monitor = new ActionCable.ConnectionMonitor(this);\n this.disconnected = true;\n }\n\n Connection.prototype.send = function(data) {\n if (this.isOpen()) {\n this.webSocket.send(JSON.stringify(data));\n return true;\n } else {\n return false;\n }\n };\n\n Connection.prototype.open = function() {\n if (this.isActive()) {\n ActionCable.log(\"Attempted to open WebSocket, but existing socket is \" + (this.getState()));\n return false;\n } else {\n ActionCable.log(\"Opening WebSocket, current state is \" + (this.getState()) + \", subprotocols: \" + protocols);\n if (this.webSocket != null) {\n this.uninstallEventHandlers();\n }\n this.webSocket = new ActionCable.WebSocket(this.consumer.url, protocols);\n this.installEventHandlers();\n this.monitor.start();\n return true;\n }\n };\n\n Connection.prototype.close = function(arg) {\n var allowReconnect, ref1;\n allowReconnect = (arg != null ? arg : {\n allowReconnect: true\n }).allowReconnect;\n if (!allowReconnect) {\n this.monitor.stop();\n }\n if (this.isActive()) {\n return (ref1 = this.webSocket) != null ? ref1.close() : void 0;\n }\n };\n\n Connection.prototype.reopen = function() {\n var error;\n ActionCable.log(\"Reopening WebSocket, current state is \" + (this.getState()));\n if (this.isActive()) {\n try {\n return this.close();\n } catch (error1) {\n error = error1;\n return ActionCable.log(\"Failed to reopen WebSocket\", error);\n } finally {\n ActionCable.log(\"Reopening WebSocket in \" + this.constructor.reopenDelay + \"ms\");\n setTimeout(this.open, this.constructor.reopenDelay);\n }\n } else {\n return this.open();\n }\n };\n\n Connection.prototype.getProtocol = function() {\n var ref1;\n return (ref1 = this.webSocket) != null ? ref1.protocol : void 0;\n };\n\n Connection.prototype.isOpen = function() {\n return this.isState(\"open\");\n };\n\n Connection.prototype.isActive = function() {\n return this.isState(\"open\", \"connecting\");\n };\n\n Connection.prototype.isProtocolSupported = function() {\n var ref1;\n return ref1 = this.getProtocol(), indexOf.call(supportedProtocols, ref1) >= 0;\n };\n\n Connection.prototype.isState = function() {\n var ref1, states;\n states = 1 <= arguments.length ? slice.call(arguments, 0) : [];\n return ref1 = this.getState(), indexOf.call(states, ref1) >= 0;\n };\n\n Connection.prototype.getState = function() {\n var ref1, state, value;\n for (state in WebSocket) {\n value = WebSocket[state];\n if (value === ((ref1 = this.webSocket) != null ? ref1.readyState : void 0)) {\n return state.toLowerCase();\n }\n }\n return null;\n };\n\n Connection.prototype.installEventHandlers = function() {\n var eventName, handler;\n for (eventName in this.events) {\n handler = this.events[eventName].bind(this);\n this.webSocket[\"on\" + eventName] = handler;\n }\n };\n\n Connection.prototype.uninstallEventHandlers = function() {\n var eventName;\n for (eventName in this.events) {\n this.webSocket[\"on\" + eventName] = function() {};\n }\n };\n\n Connection.prototype.events = {\n message: function(event) {\n var identifier, message, ref1, type;\n if (!this.isProtocolSupported()) {\n return;\n }\n ref1 = JSON.parse(event.data), identifier = ref1.identifier, message = ref1.message, type = ref1.type;\n switch (type) {\n case message_types.welcome:\n this.monitor.recordConnect();\n return this.subscriptions.reload();\n case message_types.ping:\n return this.monitor.recordPing();\n case message_types.confirmation:\n return this.subscriptions.notify(identifier, \"connected\");\n case message_types.rejection:\n return this.subscriptions.reject(identifier);\n default:\n return this.subscriptions.notify(identifier, \"received\", message);\n }\n },\n open: function() {\n ActionCable.log(\"WebSocket onopen event, using '\" + (this.getProtocol()) + \"' subprotocol\");\n this.disconnected = false;\n if (!this.isProtocolSupported()) {\n ActionCable.log(\"Protocol is unsupported. Stopping monitor and disconnecting.\");\n return this.close({\n allowReconnect: false\n });\n }\n },\n close: function(event) {\n ActionCable.log(\"WebSocket onclose event\");\n if (this.disconnected) {\n return;\n }\n this.disconnected = true;\n this.monitor.recordDisconnect();\n return this.subscriptions.notifyAll(\"disconnected\", {\n willAttemptReconnect: this.monitor.isRunning()\n });\n },\n error: function() {\n return ActionCable.log(\"WebSocket onerror event\");\n }\n };\n\n return Connection;\n\n })();\n\n }).call(this);\n (function() {\n var slice = [].slice;\n\n ActionCable.Subscriptions = (function() {\n function Subscriptions(consumer) {\n this.consumer = consumer;\n this.subscriptions = [];\n }\n\n Subscriptions.prototype.create = function(channelName, mixin) {\n var channel, params, subscription;\n channel = channelName;\n params = typeof channel === \"object\" ? channel : {\n channel: channel\n };\n subscription = new ActionCable.Subscription(this.consumer, params, mixin);\n return this.add(subscription);\n };\n\n Subscriptions.prototype.add = function(subscription) {\n this.subscriptions.push(subscription);\n this.consumer.ensureActiveConnection();\n this.notify(subscription, \"initialized\");\n this.sendCommand(subscription, \"subscribe\");\n return subscription;\n };\n\n Subscriptions.prototype.remove = function(subscription) {\n this.forget(subscription);\n if (!this.findAll(subscription.identifier).length) {\n this.sendCommand(subscription, \"unsubscribe\");\n }\n return subscription;\n };\n\n Subscriptions.prototype.reject = function(identifier) {\n var i, len, ref, results, subscription;\n ref = this.findAll(identifier);\n results = [];\n for (i = 0, len = ref.length; i < len; i++) {\n subscription = ref[i];\n this.forget(subscription);\n this.notify(subscription, \"rejected\");\n results.push(subscription);\n }\n return results;\n };\n\n Subscriptions.prototype.forget = function(subscription) {\n var s;\n this.subscriptions = (function() {\n var i, len, ref, results;\n ref = this.subscriptions;\n results = [];\n for (i = 0, len = ref.length; i < len; i++) {\n s = ref[i];\n if (s !== subscription) {\n results.push(s);\n }\n }\n return results;\n }).call(this);\n return subscription;\n };\n\n Subscriptions.prototype.findAll = function(identifier) {\n var i, len, ref, results, s;\n ref = this.subscriptions;\n results = [];\n for (i = 0, len = ref.length; i < len; i++) {\n s = ref[i];\n if (s.identifier === identifier) {\n results.push(s);\n }\n }\n return results;\n };\n\n Subscriptions.prototype.reload = function() {\n var i, len, ref, results, subscription;\n ref = this.subscriptions;\n results = [];\n for (i = 0, len = ref.length; i < len; i++) {\n subscription = ref[i];\n results.push(this.sendCommand(subscription, \"subscribe\"));\n }\n return results;\n };\n\n Subscriptions.prototype.notifyAll = function() {\n var args, callbackName, i, len, ref, results, subscription;\n callbackName = arguments[0], args = 2 <= arguments.length ? slice.call(arguments, 1) : [];\n ref = this.subscriptions;\n results = [];\n for (i = 0, len = ref.length; i < len; i++) {\n subscription = ref[i];\n results.push(this.notify.apply(this, [subscription, callbackName].concat(slice.call(args))));\n }\n return results;\n };\n\n Subscriptions.prototype.notify = function() {\n var args, callbackName, i, len, results, subscription, subscriptions;\n subscription = arguments[0], callbackName = arguments[1], args = 3 <= arguments.length ? slice.call(arguments, 2) : [];\n if (typeof subscription === \"string\") {\n subscriptions = this.findAll(subscription);\n } else {\n subscriptions = [subscription];\n }\n results = [];\n for (i = 0, len = subscriptions.length; i < len; i++) {\n subscription = subscriptions[i];\n results.push(typeof subscription[callbackName] === \"function\" ? subscription[callbackName].apply(subscription, args) : void 0);\n }\n return results;\n };\n\n Subscriptions.prototype.sendCommand = function(subscription, command) {\n var identifier;\n identifier = subscription.identifier;\n return this.consumer.send({\n command: command,\n identifier: identifier\n });\n };\n\n return Subscriptions;\n\n })();\n\n }).call(this);\n (function() {\n ActionCable.Subscription = (function() {\n var extend;\n\n function Subscription(consumer, params, mixin) {\n this.consumer = consumer;\n if (params == null) {\n params = {};\n }\n this.identifier = JSON.stringify(params);\n extend(this, mixin);\n }\n\n Subscription.prototype.perform = function(action, data) {\n if (data == null) {\n data = {};\n }\n data.action = action;\n return this.send(data);\n };\n\n Subscription.prototype.send = function(data) {\n return this.consumer.send({\n command: \"message\",\n identifier: this.identifier,\n data: JSON.stringify(data)\n });\n };\n\n Subscription.prototype.unsubscribe = function() {\n return this.consumer.subscriptions.remove(this);\n };\n\n extend = function(object, properties) {\n var key, value;\n if (properties != null) {\n for (key in properties) {\n value = properties[key];\n object[key] = value;\n }\n }\n return object;\n };\n\n return Subscription;\n\n })();\n\n }).call(this);\n (function() {\n ActionCable.Consumer = (function() {\n function Consumer(url) {\n this.url = url;\n this.subscriptions = new ActionCable.Subscriptions(this);\n this.connection = new ActionCable.Connection(this);\n }\n\n Consumer.prototype.send = function(data) {\n return this.connection.send(data);\n };\n\n Consumer.prototype.connect = function() {\n return this.connection.open();\n };\n\n Consumer.prototype.disconnect = function() {\n return this.connection.close({\n allowReconnect: false\n });\n };\n\n Consumer.prototype.ensureActiveConnection = function() {\n if (!this.connection.isActive()) {\n return this.connection.open();\n }\n };\n\n return Consumer;\n\n })();\n\n }).call(this);\n }).call(this);\n\n if (typeof module === \"object\" && module.exports) {\n module.exports = ActionCable;\n } else if (typeof define === \"function\" && define.amd) {\n define(ActionCable);\n }\n}).call(this);\n","/**\n * ag-grid-community - Advanced Data Grid / Data Table supporting Javascript / React / AngularJS / Web Components * @version v25.1.0\n * @link http://www.ag-grid.com/\n' * @license MIT\n */\n\n'use strict';\n\nObject.defineProperty(exports, '__esModule', { value: true });\n\n/**\n * @ag-grid-community/core - Advanced Data Grid / Data Table supporting Javascript / React / AngularJS / Web Components\n * @version v25.1.0\n * @link http://www.ag-grid.com/\n * @license MIT\n */\n/**\n * If value is undefined, null or blank, returns null, otherwise returns the value\n * @param {T} value\n * @returns {T | null}\n */\nfunction makeNull(value) {\n if (value == null || value === '') {\n return null;\n }\n return value;\n}\nfunction exists(value, allowEmptyString) {\n if (allowEmptyString === void 0) { allowEmptyString = false; }\n return value != null && (value !== '' || allowEmptyString);\n}\nfunction missing(value) {\n return !exists(value);\n}\nfunction missingOrEmpty(value) {\n return value == null || value.length === 0;\n}\nfunction toStringOrNull(value) {\n return value != null && typeof value.toString === 'function' ? value.toString() : null;\n}\n// for parsing html attributes, where we want empty strings and missing attributes to be undefined\nfunction attrToNumber(value) {\n if (value === undefined) {\n // undefined or empty means ignore the value\n return;\n }\n if (value === null || value === '') {\n // null or blank means clear\n return null;\n }\n if (typeof value === 'number') {\n return isNaN(value) ? undefined : value;\n }\n var valueParsed = parseInt(value, 10);\n return isNaN(valueParsed) ? undefined : valueParsed;\n}\n// for parsing html attributes, where we want empty strings and missing attributes to be undefined\nfunction attrToBoolean(value) {\n if (value === undefined) {\n // undefined or empty means ignore the value\n return;\n }\n if (value === null || value === '') {\n // null means clear\n return false;\n }\n if (typeof value === 'boolean') {\n // if simple boolean, return the boolean\n return value;\n }\n // if equal to the string 'true' (ignoring case) then return true\n return (/true/i).test(value);\n}\n// for parsing html attributes, where we want empty strings and missing attributes to be undefined\nfunction attrToString(value) {\n if (value == null || value === '') {\n return;\n }\n return value;\n}\n/** @deprecated */\nfunction referenceCompare(left, right) {\n if (left == null && right == null) {\n return true;\n }\n if (left == null && right != null) {\n return false;\n }\n if (left != null && right == null) {\n return false;\n }\n return left === right;\n}\nfunction jsonEquals(val1, val2) {\n var val1Json = val1 ? JSON.stringify(val1) : null;\n var val2Json = val2 ? JSON.stringify(val2) : null;\n return val1Json === val2Json;\n}\nfunction defaultComparator(valueA, valueB, accentedCompare) {\n if (accentedCompare === void 0) { accentedCompare = false; }\n var valueAMissing = valueA == null;\n var valueBMissing = valueB == null;\n // this is for aggregations sum and avg, where the result can be a number that is wrapped.\n // if we didn't do this, then the toString() value would be used, which would result in\n // the strings getting used instead of the numbers.\n if (valueA && valueA.toNumber) {\n valueA = valueA.toNumber();\n }\n if (valueB && valueB.toNumber) {\n valueB = valueB.toNumber();\n }\n if (valueAMissing && valueBMissing) {\n return 0;\n }\n if (valueAMissing) {\n return -1;\n }\n if (valueBMissing) {\n return 1;\n }\n function doQuickCompare(a, b) {\n return (a > b ? 1 : (a < b ? -1 : 0));\n }\n if (typeof valueA !== 'string') {\n return doQuickCompare(valueA, valueB);\n }\n if (!accentedCompare) {\n return doQuickCompare(valueA, valueB);\n }\n try {\n // using local compare also allows chinese comparisons\n return valueA.localeCompare(valueB);\n }\n catch (e) {\n // if something wrong with localeCompare, eg not supported\n // by browser, then just continue with the quick one\n return doQuickCompare(valueA, valueB);\n }\n}\nfunction find(collection, predicate, value) {\n if (collection === null || collection === undefined) {\n return null;\n }\n if (!Array.isArray(collection)) {\n var objToArray = values(collection);\n return find(objToArray, predicate, value);\n }\n var collectionAsArray = collection;\n var firstMatchingItem = null;\n for (var i = 0; i < collectionAsArray.length; i++) {\n var item = collectionAsArray[i];\n if (typeof predicate === 'string') {\n if (item[predicate] === value) {\n firstMatchingItem = item;\n break;\n }\n }\n else {\n var callback = predicate;\n if (callback(item)) {\n firstMatchingItem = item;\n break;\n }\n }\n }\n return firstMatchingItem;\n}\nfunction values(object) {\n if (object instanceof Set || object instanceof Map) {\n var arr_1 = [];\n object.forEach(function (value) { return arr_1.push(value); });\n return arr_1;\n }\n return Object.keys(object).map(function (key) { return object[key]; });\n}\n\nvar GenericUtils = /*#__PURE__*/Object.freeze({\n __proto__: null,\n makeNull: makeNull,\n exists: exists,\n missing: missing,\n missingOrEmpty: missingOrEmpty,\n toStringOrNull: toStringOrNull,\n attrToNumber: attrToNumber,\n attrToBoolean: attrToBoolean,\n attrToString: attrToString,\n referenceCompare: referenceCompare,\n jsonEquals: jsonEquals,\n defaultComparator: defaultComparator,\n find: find,\n values: values\n});\n\n/**\n * @ag-grid-community/core - Advanced Data Grid / Data Table supporting Javascript / React / AngularJS / Web Components\n * @version v25.1.0\n * @link http://www.ag-grid.com/\n * @license MIT\n */\nvar ColumnKeyCreator = /** @class */ (function () {\n function ColumnKeyCreator() {\n this.existingKeys = {};\n }\n ColumnKeyCreator.prototype.addExistingKeys = function (keys) {\n for (var i = 0; i < keys.length; i++) {\n this.existingKeys[keys[i]] = true;\n }\n };\n ColumnKeyCreator.prototype.getUniqueKey = function (colId, colField) {\n // in case user passed in number for colId, convert to string\n colId = toStringOrNull(colId);\n var count = 0;\n while (true) {\n var idToTry = void 0;\n if (colId) {\n idToTry = colId;\n if (count !== 0) {\n idToTry += '_' + count;\n }\n }\n else if (colField) {\n idToTry = colField;\n if (count !== 0) {\n idToTry += '_' + count;\n }\n }\n else {\n idToTry = '' + count;\n }\n if (!this.existingKeys[idToTry]) {\n this.existingKeys[idToTry] = true;\n return idToTry;\n }\n count++;\n }\n };\n return ColumnKeyCreator;\n}());\n\n/**\n * @ag-grid-community/core - Advanced Data Grid / Data Table supporting Javascript / React / AngularJS / Web Components\n * @version v25.1.0\n * @link http://www.ag-grid.com/\n * @license MIT\n */\nfunction firstExistingValue() {\n var values = [];\n for (var _i = 0; _i < arguments.length; _i++) {\n values[_i] = arguments[_i];\n }\n for (var i = 0; i < values.length; i++) {\n var value = values[i];\n if (exists(value)) {\n return value;\n }\n }\n return null;\n}\n/** @deprecated */\nfunction anyExists(values) {\n return values && firstExistingValue(values) != null;\n}\nfunction existsAndNotEmpty(value) {\n return value != null && value.length > 0;\n}\nfunction last(arr) {\n if (!arr || !arr.length) {\n return;\n }\n return arr[arr.length - 1];\n}\nfunction areEqual(a, b, comparator) {\n if (a == null && b == null) {\n return true;\n }\n return a != null &&\n b != null &&\n a.length === b.length &&\n every(a, function (value, index) { return comparator ? comparator(value, b[index]) : b[index] === value; });\n}\n/** @deprecated */\nfunction compareArrays(array1, array2) {\n return areEqual(array1, array2);\n}\n/** @deprecated */\nfunction shallowCompare(arr1, arr2) {\n return areEqual(arr1, arr2);\n}\nfunction sortNumerically(array) {\n return array.sort(function (a, b) { return a - b; });\n}\nfunction removeRepeatsFromArray(array, object) {\n if (!array) {\n return;\n }\n for (var index = array.length - 2; index >= 0; index--) {\n var thisOneMatches = array[index] === object;\n var nextOneMatches = array[index + 1] === object;\n if (thisOneMatches && nextOneMatches) {\n array.splice(index + 1, 1);\n }\n }\n}\nfunction removeFromArray(array, object) {\n var index = array.indexOf(object);\n if (index >= 0) {\n array.splice(index, 1);\n }\n}\nfunction removeAllFromArray(array, toRemove) {\n forEach(toRemove, function (item) { return removeFromArray(array, item); });\n}\nfunction insertIntoArray(array, object, toIndex) {\n array.splice(toIndex, 0, object);\n}\nfunction insertArrayIntoArray(dest, src, toIndex) {\n if (dest == null || src == null) {\n return;\n }\n // put items in backwards, otherwise inserted items end up in reverse order\n for (var i = src.length - 1; i >= 0; i--) {\n var item = src[i];\n insertIntoArray(dest, item, toIndex);\n }\n}\nfunction moveInArray(array, objectsToMove, toIndex) {\n // first take out items from the array\n removeAllFromArray(array, objectsToMove);\n // now add the objects, in same order as provided to us, that means we start at the end\n // as the objects will be pushed to the right as they are inserted\n forEach(objectsToMove.slice().reverse(), function (obj) { return insertIntoArray(array, obj, toIndex); });\n}\nfunction includes(array, value) {\n return array.indexOf(value) > -1;\n}\nfunction flatten(arrayOfArrays) {\n return [].concat.apply([], arrayOfArrays);\n}\nfunction pushAll(target, source) {\n if (source == null || target == null) {\n return;\n }\n forEach(source, function (value) { return target.push(value); });\n}\nfunction toStrings(array) {\n return map(array, toStringOrNull);\n}\nfunction findIndex(collection, predicate) {\n for (var i = 0; i < collection.length; i++) {\n if (predicate(collection[i], i, collection)) {\n return i;\n }\n }\n return -1;\n}\n/**\n * The implementation of Array.prototype.every in browsers is always slower than just using a simple for loop, so\n * use this for improved performance.\n * https://jsbench.me/bek91dtit8/\n */\nfunction every(list, predicate) {\n if (list == null) {\n return true;\n }\n for (var i = 0; i < list.length; i++) {\n if (!predicate(list[i], i)) {\n return false;\n }\n }\n return true;\n}\n/**\n * The implementation of Array.prototype.some in browsers is always slower than just using a simple for loop, so\n * use this for improved performance.\n * https://jsbench.me/5dk91e4tmt/\n */\nfunction some(list, predicate) {\n if (list == null) {\n return false;\n }\n for (var i = 0; i < list.length; i++) {\n if (predicate(list[i], i)) {\n return true;\n }\n }\n return false;\n}\n/**\n * The implementation of Array.prototype.forEach in browsers is often slower than just using a simple for loop, so\n * use this for improved performance.\n * https://jsbench.me/apk91elt8a/\n */\nfunction forEach(list, action) {\n if (list == null) {\n return;\n }\n for (var i = 0; i < list.length; i++) {\n action(list[i], i);\n }\n}\nfunction forEachReverse(list, action) {\n if (list == null) {\n return;\n }\n for (var i = list.length - 1; i >= 0; i--) {\n action(list[i], i);\n }\n}\n/**\n * The implementation of Array.prototype.map in browsers is generally the same as just using a simple for loop. However,\n * Firefox does exhibit some difference, and this performs no worse in other browsers, so use this if you want improved\n * performance.\n * https://jsbench.me/njk91ez8pc/\n */\nfunction map(list, process) {\n if (list == null) {\n return null;\n }\n var mapped = [];\n for (var i = 0; i < list.length; i++) {\n mapped.push(process(list[i], i));\n }\n return mapped;\n}\n/**\n * The implementation of Array.prototype.filter in browsers is always slower than just using a simple for loop, so\n * use this for improved performance.\n * https://jsbench.me/7bk91fk08c/\n */\nfunction filter(list, predicate) {\n if (list == null) {\n return null;\n }\n var filtered = [];\n for (var i = 0; i < list.length; i++) {\n if (predicate(list[i], i)) {\n filtered.push(list[i]);\n }\n }\n return filtered;\n}\n/**\n * The implementation of Array.prototype.reduce in browsers is generally the same as just using a simple for loop. However,\n * Chrome does exhibit some difference, and this performs no worse in other browsers, so use this if you want improved\n * performance.\n * https://jsbench.me/7vk92n6u1f/\n */\nfunction reduce(list, step, initial) {\n if (list == null || initial == null) {\n return null;\n }\n var result = initial;\n for (var i = 0; i < list.length; i++) {\n result = step(result, list[i], i);\n }\n return result;\n}\n/** @deprecated */\nfunction forEachSnapshotFirst(list, callback) {\n if (!list) {\n return;\n }\n var arrayCopy = list.slice(0);\n arrayCopy.forEach(callback);\n}\n\nvar ArrayUtils = /*#__PURE__*/Object.freeze({\n __proto__: null,\n firstExistingValue: firstExistingValue,\n anyExists: anyExists,\n existsAndNotEmpty: existsAndNotEmpty,\n last: last,\n areEqual: areEqual,\n compareArrays: compareArrays,\n shallowCompare: shallowCompare,\n sortNumerically: sortNumerically,\n removeRepeatsFromArray: removeRepeatsFromArray,\n removeFromArray: removeFromArray,\n removeAllFromArray: removeAllFromArray,\n insertIntoArray: insertIntoArray,\n insertArrayIntoArray: insertArrayIntoArray,\n moveInArray: moveInArray,\n includes: includes,\n flatten: flatten,\n pushAll: pushAll,\n toStrings: toStrings,\n findIndex: findIndex,\n every: every,\n some: some,\n forEach: forEach,\n forEachReverse: forEachReverse,\n map: map,\n filter: filter,\n reduce: reduce,\n forEachSnapshotFirst: forEachSnapshotFirst\n});\n\n/**\n * @ag-grid-community/core - Advanced Data Grid / Data Table supporting Javascript / React / AngularJS / Web Components\n * @version v25.1.0\n * @link http://www.ag-grid.com/\n * @license MIT\n */\nfunction iterateObject(object, callback) {\n if (object == null) {\n return;\n }\n if (Array.isArray(object)) {\n forEach(object, function (value, index) { return callback(\"\" + index, value); });\n }\n else {\n forEach(Object.keys(object), function (key) { return callback(key, object[key]); });\n }\n}\nfunction cloneObject(object) {\n var copy = {};\n var keys = Object.keys(object);\n for (var i = 0; i < keys.length; i++) {\n var key = keys[i];\n var value = object[key];\n copy[key] = value;\n }\n return copy;\n}\nfunction deepCloneObject(object) {\n return JSON.parse(JSON.stringify(object));\n}\n// returns copy of an object, doing a deep clone of any objects with that object.\n// this is used for eg creating copies of Column Definitions, where we want to\n// deep copy all objects, but do not want to deep copy functions (eg when user provides\n// a function or class for colDef.cellRenderer)\nfunction deepCloneDefinition(object, keysToSkip) {\n if (!object) {\n return;\n }\n var obj = object;\n var res = {};\n Object.keys(obj).forEach(function (key) {\n if (keysToSkip && keysToSkip.indexOf(key) >= 0) {\n return;\n }\n var value = obj[key];\n // 'simple object' means a bunch of key/value pairs, eg {filter: 'myFilter'}. it does\n // NOT include the following:\n // 1) arrays\n // 2) functions or classes (eg ColumnAPI instance)\n var sourceIsSimpleObject = isNonNullObject(value) && value.constructor === Object;\n if (sourceIsSimpleObject) {\n res[key] = deepCloneDefinition(value);\n }\n else {\n res[key] = value;\n }\n });\n return res;\n}\nfunction getProperty(object, key) {\n return object[key];\n}\nfunction setProperty(object, key, value) {\n object[key] = value;\n}\n/**\n * Will copy the specified properties from `source` into the equivalent properties on `target`, ignoring properties with\n * a value of `undefined`.\n */\nfunction copyPropertiesIfPresent(source, target) {\n var properties = [];\n for (var _i = 2; _i < arguments.length; _i++) {\n properties[_i - 2] = arguments[_i];\n }\n forEach(properties, function (p) { return copyPropertyIfPresent(source, target, p); });\n}\n/**\n * Will copy the specified property from `source` into the equivalent property on `target`, unless the property has a\n * value of `undefined`. If a transformation is provided, it will be applied to the value before being set on `target`.\n */\nfunction copyPropertyIfPresent(source, target, property, transform) {\n var value = getProperty(source, property);\n if (value !== undefined) {\n setProperty(target, property, transform ? transform(value) : value);\n }\n}\nfunction getAllKeysInObjects(objects) {\n var allValues = {};\n objects.filter(function (obj) { return obj != null; }).forEach(function (obj) {\n forEach(Object.keys(obj), function (key) { return allValues[key] = null; });\n });\n return Object.keys(allValues);\n}\nfunction getAllValuesInObject(obj) {\n if (!obj) {\n return [];\n }\n if (typeof Object.values === 'function') {\n return Object.values(obj);\n }\n var ret = [];\n for (var key in obj) {\n if (obj.hasOwnProperty(key) && obj.propertyIsEnumerable(key)) {\n ret.push(obj[key]);\n }\n }\n return ret;\n}\nfunction mergeDeep(dest, source, copyUndefined, makeCopyOfSimpleObjects) {\n if (copyUndefined === void 0) { copyUndefined = true; }\n if (makeCopyOfSimpleObjects === void 0) { makeCopyOfSimpleObjects = false; }\n if (!exists(source)) {\n return;\n }\n iterateObject(source, function (key, sourceValue) {\n var destValue = dest[key];\n if (destValue === sourceValue) {\n return;\n }\n // when creating params, we don't want to just copy objects over. otherwise merging ColDefs (eg DefaultColDef\n // and Column Types) would result in params getting shared between objects.\n // by putting an empty value into destValue first, it means we end up copying over values from\n // the source object, rather than just copying in the source object in it's entirety.\n if (makeCopyOfSimpleObjects) {\n var objectIsDueToBeCopied = destValue == null && sourceValue != null;\n if (objectIsDueToBeCopied) {\n // 'simple object' means a bunch of key/value pairs, eg {filter: 'myFilter'}, as opposed\n // to a Class instance (such as ColumnAPI instance).\n var sourceIsSimpleObject = typeof sourceValue === 'object' && sourceValue.constructor === Object;\n var dontCopy = sourceIsSimpleObject;\n if (dontCopy) {\n destValue = {};\n dest[key] = destValue;\n }\n }\n }\n if (isNonNullObject(sourceValue) && isNonNullObject(destValue) && !Array.isArray(destValue)) {\n mergeDeep(destValue, sourceValue, copyUndefined, makeCopyOfSimpleObjects);\n }\n else if (copyUndefined || sourceValue !== undefined) {\n dest[key] = sourceValue;\n }\n });\n}\nfunction assign(object) {\n var sources = [];\n for (var _i = 1; _i < arguments.length; _i++) {\n sources[_i - 1] = arguments[_i];\n }\n forEach(sources, function (source) { return iterateObject(source, function (key, value) { return object[key] = value; }); });\n return object;\n}\nfunction missingOrEmptyObject(value) {\n return missing(value) || Object.keys(value).length === 0;\n}\nfunction get(source, expression, defaultValue) {\n if (source == null) {\n return defaultValue;\n }\n var keys = expression.split('.');\n var objectToRead = source;\n while (keys.length > 1) {\n objectToRead = objectToRead[keys.shift()];\n if (objectToRead == null) {\n return defaultValue;\n }\n }\n var value = objectToRead[keys[0]];\n return value != null ? value : defaultValue;\n}\nfunction set(target, expression, value) {\n if (target == null) {\n return;\n }\n var keys = expression.split('.');\n var objectToUpdate = target;\n while (keys.length > 1) {\n objectToUpdate = objectToUpdate[keys.shift()];\n if (objectToUpdate == null) {\n return;\n }\n }\n objectToUpdate[keys[0]] = value;\n}\nfunction deepFreeze(object) {\n Object.freeze(object);\n forEach(values(object), function (v) {\n if (isNonNullObject(v) || typeof v === 'function') {\n deepFreeze(v);\n }\n });\n return object;\n}\nfunction getValueUsingField(data, field, fieldContainsDots) {\n if (!field || !data) {\n return;\n }\n // if no '.', then it's not a deep value\n if (!fieldContainsDots) {\n return data[field];\n }\n // otherwise it is a deep value, so need to dig for it\n var fields = field.split('.');\n var currentObject = data;\n for (var i = 0; i < fields.length; i++) {\n if (currentObject == null) {\n return undefined;\n }\n currentObject = currentObject[fields[i]];\n }\n return currentObject;\n}\n// used by ColumnAPI and GridAPI to remove all references, so keeping grid in memory resulting in a\n// memory leak if user is not disposing of the GridAPI or ColumnApi references\nfunction removeAllReferences(obj, objectName) {\n Object.keys(obj).forEach(function (key) {\n var value = obj[key];\n // we want to replace all the @autowired services, which are objects. any simple types (boolean, string etc)\n // we don't care about\n if (typeof value === 'object') {\n obj[key] = undefined;\n }\n });\n var proto = Object.getPrototypeOf(obj);\n var properties = {};\n Object.keys(proto).forEach(function (key) {\n var value = proto[key];\n // leave all basic types - this is needed for GridAPI to leave the \"destroyed: boolean\" attribute alone\n if (typeof value === 'function') {\n var func = function () {\n console.warn(\"AG Grid: \" + objectName + \" function \" + key + \"() cannot be called as the grid has been destroyed.\\n Please don't call grid API functions on destroyed grids - as a matter of fact you shouldn't\\n be keeping the API reference, your application has a memory leak! Remove the API reference\\n when the grid is destroyed.\");\n };\n properties[key] = { value: func, writable: true };\n }\n });\n Object.defineProperties(obj, properties);\n}\nfunction isNonNullObject(value) {\n return typeof value === 'object' && value !== null;\n}\n\nvar ObjectUtils = /*#__PURE__*/Object.freeze({\n __proto__: null,\n iterateObject: iterateObject,\n cloneObject: cloneObject,\n deepCloneObject: deepCloneObject,\n deepCloneDefinition: deepCloneDefinition,\n getProperty: getProperty,\n setProperty: setProperty,\n copyPropertiesIfPresent: copyPropertiesIfPresent,\n copyPropertyIfPresent: copyPropertyIfPresent,\n getAllKeysInObjects: getAllKeysInObjects,\n getAllValuesInObject: getAllValuesInObject,\n mergeDeep: mergeDeep,\n assign: assign,\n missingOrEmptyObject: missingOrEmptyObject,\n get: get,\n set: set,\n deepFreeze: deepFreeze,\n getValueUsingField: getValueUsingField,\n removeAllReferences: removeAllReferences,\n isNonNullObject: isNonNullObject\n});\n\n/**\n * @ag-grid-community/core - Advanced Data Grid / Data Table supporting Javascript / React / AngularJS / Web Components\n * @version v25.1.0\n * @link http://www.ag-grid.com/\n * @license MIT\n */\nvar FUNCTION_STRIP_COMMENTS = /((\\/\\/.*$)|(\\/\\*[\\s\\S]*?\\*\\/))/mg;\nvar FUNCTION_ARGUMENT_NAMES = /([^\\s,]+)/g;\nvar doOnceFlags = {};\n/**\n * If the key was passed before, then doesn't execute the func\n * @param {Function} func\n * @param {string} key\n */\nfunction doOnce(func, key) {\n if (doOnceFlags[key]) {\n return;\n }\n func();\n doOnceFlags[key] = true;\n}\nfunction getFunctionName(funcConstructor) {\n // for every other browser in the world\n if (funcConstructor.name) {\n return funcConstructor.name;\n }\n // for the pestilence that is ie11\n var matches = /function\\s+([^\\(]+)/.exec(funcConstructor.toString());\n return matches && matches.length === 2 ? matches[1].trim() : null;\n}\n/** @deprecated */\nfunction getFunctionParameters(func) {\n var fnStr = func.toString().replace(FUNCTION_STRIP_COMMENTS, '');\n return fnStr.slice(fnStr.indexOf('(') + 1, fnStr.indexOf(')')).match(FUNCTION_ARGUMENT_NAMES) || [];\n}\nfunction isFunction(val) {\n return !!(val && val.constructor && val.call && val.apply);\n}\nfunction executeInAWhile(funcs) {\n executeAfter(funcs, 400);\n}\nfunction executeNextVMTurn(funcs) {\n executeAfter(funcs, 0);\n}\nfunction executeAfter(funcs, milliseconds) {\n if (milliseconds === void 0) { milliseconds = 0; }\n if (funcs.length > 0) {\n window.setTimeout(function () { return funcs.forEach(function (func) { return func(); }); }, milliseconds);\n }\n}\n/**\n * from https://stackoverflow.com/questions/24004791/can-someone-explain-the-debounce-function-in-javascript\n * @param {Function} func The function to be debounced\n * @param {number} wait The time in ms to debounce\n * @param {boolean} immediate If it should run immediately or wait for the initial debounce delay\n * @return {Function} The debounced function\n */\nfunction debounce(func, wait, immediate) {\n if (immediate === void 0) { immediate = false; }\n // 'private' variable for instance\n // The returned function will be able to reference this due to closure.\n // Each call to the returned function will share this common timer.\n var timeout;\n // Calling debounce returns a new anonymous function\n return function () {\n var args = [];\n for (var _i = 0; _i < arguments.length; _i++) {\n args[_i] = arguments[_i];\n }\n // reference the context and args for the setTimeout function\n var context = this;\n // Should the function be called now? If immediate is true\n // and not already in a timeout then the answer is: Yes\n var callNow = immediate && !timeout;\n // This is the basic debounce behaviour where you can call this\n // function several times, but it will only execute once\n // [before or after imposing a delay].\n // Each time the returned function is called, the timer starts over.\n window.clearTimeout(timeout);\n // Set the new timeout\n timeout = window.setTimeout(function () {\n // Inside the timeout function, clear the timeout variable\n // which will let the next execution run when in 'immediate' mode\n timeout = null;\n // Check if the function already ran with the immediate flag\n if (!immediate) {\n // Call the original function with apply\n // apply lets you define the 'this' object as well as the arguments\n // (both captured before setTimeout)\n func.apply(context, args);\n }\n }, wait);\n // Immediate mode and no wait timer? Execute the function..\n if (callNow) {\n func.apply(context, args);\n }\n };\n}\nfunction compose() {\n var fns = [];\n for (var _i = 0; _i < arguments.length; _i++) {\n fns[_i] = arguments[_i];\n }\n return function (arg) { return fns.reduce(function (composed, f) { return f(composed); }, arg); };\n}\nfunction callIfPresent(func) {\n if (func) {\n func();\n }\n}\n\nvar FunctionUtils = /*#__PURE__*/Object.freeze({\n __proto__: null,\n doOnce: doOnce,\n getFunctionName: getFunctionName,\n getFunctionParameters: getFunctionParameters,\n isFunction: isFunction,\n executeInAWhile: executeInAWhile,\n executeNextVMTurn: executeNextVMTurn,\n executeAfter: executeAfter,\n debounce: debounce,\n compose: compose,\n callIfPresent: callIfPresent\n});\n\n/**\n * @ag-grid-community/core - Advanced Data Grid / Data Table supporting Javascript / React / AngularJS / Web Components\n * @version v25.1.0\n * @link http://www.ag-grid.com/\n * @license MIT\n */\nvar Context = /** @class */ (function () {\n function Context(params, logger) {\n this.beanWrappers = {};\n this.destroyed = false;\n if (!params || !params.beanClasses) {\n return;\n }\n this.contextParams = params;\n this.logger = logger;\n this.logger.log(\">> creating ag-Application Context\");\n this.createBeans();\n var beanInstances = this.getBeanInstances();\n this.wireBeans(beanInstances);\n this.logger.log(\">> ag-Application Context ready - component is alive\");\n }\n Context.prototype.getBeanInstances = function () {\n return values(this.beanWrappers).map(function (beanEntry) { return beanEntry.beanInstance; });\n };\n Context.prototype.createBean = function (bean, afterPreCreateCallback) {\n if (!bean) {\n throw Error(\"Can't wire to bean since it is null\");\n }\n this.wireBeans([bean], afterPreCreateCallback);\n return bean;\n };\n Context.prototype.wireBeans = function (beanInstances, afterPreCreateCallback) {\n this.autoWireBeans(beanInstances);\n this.methodWireBeans(beanInstances);\n this.callLifeCycleMethods(beanInstances, 'preConstructMethods');\n // the callback sets the attributes, so the component has access to attributes\n // before postConstruct methods in the component are executed\n if (exists(afterPreCreateCallback)) {\n beanInstances.forEach(afterPreCreateCallback);\n }\n this.callLifeCycleMethods(beanInstances, 'postConstructMethods');\n };\n Context.prototype.createBeans = function () {\n var _this = this;\n // register all normal beans\n this.contextParams.beanClasses.forEach(this.createBeanWrapper.bind(this));\n // register override beans, these will overwrite beans above of same name\n // instantiate all beans - overridden beans will be left out\n iterateObject(this.beanWrappers, function (key, beanEntry) {\n var constructorParamsMeta;\n if (beanEntry.bean.__agBeanMetaData && beanEntry.bean.__agBeanMetaData.autowireMethods && beanEntry.bean.__agBeanMetaData.autowireMethods.agConstructor) {\n constructorParamsMeta = beanEntry.bean.__agBeanMetaData.autowireMethods.agConstructor;\n }\n var constructorParams = _this.getBeansForParameters(constructorParamsMeta, beanEntry.bean.name);\n var newInstance = applyToConstructor(beanEntry.bean, constructorParams);\n beanEntry.beanInstance = newInstance;\n });\n var createdBeanNames = Object.keys(this.beanWrappers).join(', ');\n this.logger.log(\"created beans: \" + createdBeanNames);\n };\n // tslint:disable-next-line\n Context.prototype.createBeanWrapper = function (BeanClass) {\n var metaData = BeanClass.__agBeanMetaData;\n if (!metaData) {\n var beanName = void 0;\n if (BeanClass.prototype.constructor) {\n beanName = getFunctionName(BeanClass.prototype.constructor);\n }\n else {\n beanName = \"\" + BeanClass;\n }\n console.error(\"Context item \" + beanName + \" is not a bean\");\n return;\n }\n var beanEntry = {\n bean: BeanClass,\n beanInstance: null,\n beanName: metaData.beanName\n };\n this.beanWrappers[metaData.beanName] = beanEntry;\n };\n Context.prototype.autoWireBeans = function (beanInstances) {\n var _this = this;\n beanInstances.forEach(function (beanInstance) {\n _this.forEachMetaDataInHierarchy(beanInstance, function (metaData, beanName) {\n var attributes = metaData.agClassAttributes;\n if (!attributes) {\n return;\n }\n attributes.forEach(function (attribute) {\n var otherBean = _this.lookupBeanInstance(beanName, attribute.beanName, attribute.optional);\n beanInstance[attribute.attributeName] = otherBean;\n });\n });\n });\n };\n Context.prototype.methodWireBeans = function (beanInstances) {\n var _this = this;\n beanInstances.forEach(function (beanInstance) {\n _this.forEachMetaDataInHierarchy(beanInstance, function (metaData, beanName) {\n iterateObject(metaData.autowireMethods, function (methodName, wireParams) {\n // skip constructor, as this is dealt with elsewhere\n if (methodName === \"agConstructor\") {\n return;\n }\n var initParams = _this.getBeansForParameters(wireParams, beanName);\n beanInstance[methodName].apply(beanInstance, initParams);\n });\n });\n });\n };\n Context.prototype.forEachMetaDataInHierarchy = function (beanInstance, callback) {\n var prototype = Object.getPrototypeOf(beanInstance);\n while (prototype != null) {\n var constructor = prototype.constructor;\n if (constructor.hasOwnProperty('__agBeanMetaData')) {\n var metaData = constructor.__agBeanMetaData;\n var beanName = this.getBeanName(constructor);\n callback(metaData, beanName);\n }\n prototype = Object.getPrototypeOf(prototype);\n }\n };\n Context.prototype.getBeanName = function (constructor) {\n if (constructor.__agBeanMetaData && constructor.__agBeanMetaData.beanName) {\n return constructor.__agBeanMetaData.beanName;\n }\n var constructorString = constructor.toString();\n var beanName = constructorString.substring(9, constructorString.indexOf(\"(\"));\n return beanName;\n };\n Context.prototype.getBeansForParameters = function (parameters, beanName) {\n var _this = this;\n var beansList = [];\n if (parameters) {\n iterateObject(parameters, function (paramIndex, otherBeanName) {\n var otherBean = _this.lookupBeanInstance(beanName, otherBeanName);\n beansList[Number(paramIndex)] = otherBean;\n });\n }\n return beansList;\n };\n Context.prototype.lookupBeanInstance = function (wiringBean, beanName, optional) {\n if (optional === void 0) { optional = false; }\n if (beanName === \"context\") {\n return this;\n }\n if (this.contextParams.providedBeanInstances && this.contextParams.providedBeanInstances.hasOwnProperty(beanName)) {\n return this.contextParams.providedBeanInstances[beanName];\n }\n var beanEntry = this.beanWrappers[beanName];\n if (beanEntry) {\n return beanEntry.beanInstance;\n }\n if (!optional) {\n console.error(\"AG Grid: unable to find bean reference \" + beanName + \" while initialising \" + wiringBean);\n }\n return null;\n };\n Context.prototype.callLifeCycleMethods = function (beanInstances, lifeCycleMethod) {\n var _this = this;\n beanInstances.forEach(function (beanInstance) { return _this.callLifeCycleMethodsOnBean(beanInstance, lifeCycleMethod); });\n };\n Context.prototype.callLifeCycleMethodsOnBean = function (beanInstance, lifeCycleMethod, methodToIgnore) {\n // putting all methods into a map removes duplicates\n var allMethods = {};\n // dump methods from each level of the metadata hierarchy\n this.forEachMetaDataInHierarchy(beanInstance, function (metaData) {\n var methods = metaData[lifeCycleMethod];\n if (methods) {\n methods.forEach(function (methodName) {\n if (methodName != methodToIgnore) {\n allMethods[methodName] = true;\n }\n });\n }\n });\n var allMethodsList = Object.keys(allMethods);\n allMethodsList.forEach(function (methodName) { return beanInstance[methodName](); });\n };\n Context.prototype.getBean = function (name) {\n return this.lookupBeanInstance(\"getBean\", name, true);\n };\n Context.prototype.destroy = function () {\n if (this.destroyed) {\n return;\n }\n this.logger.log(\">> Shutting down ag-Application Context\");\n var beanInstances = this.getBeanInstances();\n this.destroyBeans(beanInstances);\n this.contextParams.providedBeanInstances = null;\n this.destroyed = true;\n this.logger.log(\">> ag-Application Context shut down - component is dead\");\n };\n Context.prototype.destroyBean = function (bean) {\n if (!bean) {\n return;\n }\n this.destroyBeans([bean]);\n };\n Context.prototype.destroyBeans = function (beans) {\n var _this = this;\n if (!beans) {\n return [];\n }\n beans.forEach(function (bean) {\n _this.callLifeCycleMethodsOnBean(bean, 'preDestroyMethods', 'destroy');\n // call destroy() explicitly if it exists\n var beanAny = bean;\n if (typeof beanAny.destroy === 'function') {\n beanAny.destroy();\n }\n });\n return [];\n };\n return Context;\n}());\n// taken from: http://stackoverflow.com/questions/3362471/how-can-i-call-a-javascript-constructor-using-call-or-apply\n// allows calling 'apply' on a constructor\nfunction applyToConstructor(constructor, argArray) {\n var args = [null].concat(argArray);\n var factoryFunction = constructor.bind.apply(constructor, args);\n return new factoryFunction();\n}\nfunction PreConstruct(target, methodName, descriptor) {\n var props = getOrCreateProps(target.constructor);\n if (!props.preConstructMethods) {\n props.preConstructMethods = [];\n }\n props.preConstructMethods.push(methodName);\n}\nfunction PostConstruct(target, methodName, descriptor) {\n var props = getOrCreateProps(target.constructor);\n if (!props.postConstructMethods) {\n props.postConstructMethods = [];\n }\n props.postConstructMethods.push(methodName);\n}\nfunction PreDestroy(target, methodName, descriptor) {\n var props = getOrCreateProps(target.constructor);\n if (!props.preDestroyMethods) {\n props.preDestroyMethods = [];\n }\n props.preDestroyMethods.push(methodName);\n}\nfunction Bean(beanName) {\n return function (classConstructor) {\n var props = getOrCreateProps(classConstructor);\n props.beanName = beanName;\n };\n}\nfunction Autowired(name) {\n return function (target, propertyKey, descriptor) {\n autowiredFunc(target, name, false, target, propertyKey, null);\n };\n}\nfunction Optional(name) {\n return function (target, propertyKey, descriptor) {\n autowiredFunc(target, name, true, target, propertyKey, null);\n };\n}\nfunction autowiredFunc(target, name, optional, classPrototype, methodOrAttributeName, index) {\n if (name === null) {\n console.error(\"AG Grid: Autowired name should not be null\");\n return;\n }\n if (typeof index === \"number\") {\n console.error(\"AG Grid: Autowired should be on an attribute\");\n return;\n }\n // it's an attribute on the class\n var props = getOrCreateProps(target.constructor);\n if (!props.agClassAttributes) {\n props.agClassAttributes = [];\n }\n props.agClassAttributes.push({\n attributeName: methodOrAttributeName,\n beanName: name,\n optional: optional\n });\n}\nfunction Qualifier(name) {\n return function (classPrototype, methodOrAttributeName, index) {\n var constructor = typeof classPrototype == \"function\" ? classPrototype : classPrototype.constructor;\n var props;\n if (typeof index === \"number\") {\n // it's a parameter on a method\n var methodName = void 0;\n if (methodOrAttributeName) {\n props = getOrCreateProps(constructor);\n methodName = methodOrAttributeName;\n }\n else {\n props = getOrCreateProps(constructor);\n methodName = \"agConstructor\";\n }\n if (!props.autowireMethods) {\n props.autowireMethods = {};\n }\n if (!props.autowireMethods[methodName]) {\n props.autowireMethods[methodName] = {};\n }\n props.autowireMethods[methodName][index] = name;\n }\n };\n}\nfunction getOrCreateProps(target) {\n if (!target.hasOwnProperty(\"__agBeanMetaData\")) {\n target.__agBeanMetaData = {};\n }\n return target.__agBeanMetaData;\n}\n\n/**\n * @ag-grid-community/core - Advanced Data Grid / Data Table supporting Javascript / React / AngularJS / Web Components\n * @version v25.1.0\n * @link http://www.ag-grid.com/\n * @license MIT\n */\nvar __decorate = (undefined && undefined.__decorate) || function (decorators, target, key, desc) {\n var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d;\n if (typeof Reflect === \"object\" && typeof Reflect.decorate === \"function\") r = Reflect.decorate(decorators, target, key, desc);\n else for (var i = decorators.length - 1; i >= 0; i--) if (d = decorators[i]) r = (c < 3 ? d(r) : c > 3 ? d(target, key, r) : d(target, key)) || r;\n return c > 3 && r && Object.defineProperty(target, key, r), r;\n};\nvar __param = (undefined && undefined.__param) || function (paramIndex, decorator) {\n return function (target, key) { decorator(target, key, paramIndex); }\n};\nvar EventService = /** @class */ (function () {\n function EventService() {\n this.allSyncListeners = new Map();\n this.allAsyncListeners = new Map();\n this.globalSyncListeners = new Set();\n this.globalAsyncListeners = new Set();\n this.asyncFunctionsQueue = [];\n this.scheduled = false;\n // using an object performs better than a Set for the number of different events we have\n this.firedEvents = {};\n }\n // because this class is used both inside the context and outside the context, we do not\n // use autowired attributes, as that would be confusing, as sometimes the attributes\n // would be wired, and sometimes not.\n //\n // the global event servers used by AG Grid is autowired by the context once, and this\n // setBeans method gets called once.\n //\n // the times when this class is used outside of the context (eg RowNode has an instance of this\n // class) then it is not a bean, and this setBeans method is not called.\n EventService.prototype.setBeans = function (loggerFactory, gridOptionsWrapper, frameworkOverrides, globalEventListener) {\n if (globalEventListener === void 0) { globalEventListener = null; }\n this.logger = loggerFactory.create('EventService');\n this.frameworkOverrides = frameworkOverrides;\n if (globalEventListener) {\n var async = gridOptionsWrapper.useAsyncEvents();\n this.addGlobalListener(globalEventListener, async);\n }\n };\n EventService.prototype.getListeners = function (eventType, async) {\n var listenerMap = async ? this.allAsyncListeners : this.allSyncListeners;\n var listeners = listenerMap.get(eventType);\n if (!listeners) {\n listeners = new Set();\n listenerMap.set(eventType, listeners);\n }\n return listeners;\n };\n EventService.prototype.addEventListener = function (eventType, listener, async) {\n if (async === void 0) { async = false; }\n this.getListeners(eventType, async).add(listener);\n };\n EventService.prototype.removeEventListener = function (eventType, listener, async) {\n if (async === void 0) { async = false; }\n this.getListeners(eventType, async).delete(listener);\n };\n EventService.prototype.addGlobalListener = function (listener, async) {\n if (async === void 0) { async = false; }\n (async ? this.globalAsyncListeners : this.globalSyncListeners).add(listener);\n };\n EventService.prototype.removeGlobalListener = function (listener, async) {\n if (async === void 0) { async = false; }\n (async ? this.globalAsyncListeners : this.globalSyncListeners).delete(listener);\n };\n EventService.prototype.dispatchEvent = function (event) {\n this.dispatchToListeners(event, true);\n this.dispatchToListeners(event, false);\n this.firedEvents[event.type] = true;\n };\n EventService.prototype.dispatchEventOnce = function (event) {\n if (!this.firedEvents[event.type]) {\n this.dispatchEvent(event);\n }\n };\n EventService.prototype.dispatchToListeners = function (event, async) {\n var _this = this;\n var eventType = event.type;\n var processEventListeners = function (listeners) { return listeners.forEach(function (listener) {\n if (async) {\n _this.dispatchAsync(function () { return listener(event); });\n }\n else {\n listener(event);\n }\n }); };\n processEventListeners(this.getListeners(eventType, async));\n var globalListeners = async ? this.globalAsyncListeners : this.globalSyncListeners;\n globalListeners.forEach(function (listener) {\n if (async) {\n _this.dispatchAsync(function () { return _this.frameworkOverrides.dispatchEvent(eventType, function () { return listener(eventType, event); }); });\n }\n else {\n _this.frameworkOverrides.dispatchEvent(eventType, function () { return listener(eventType, event); });\n }\n });\n };\n // this gets called inside the grid's thread, for each event that it\n // wants to set async. the grid then batches the events into one setTimeout()\n // because setTimeout() is an expensive operation. ideally we would have\n // each event in it's own setTimeout(), but we batch for performance.\n EventService.prototype.dispatchAsync = function (func) {\n // add to the queue for executing later in the next VM turn\n this.asyncFunctionsQueue.push(func);\n // check if timeout is already scheduled. the first time the grid calls\n // this within it's thread turn, this should be false, so it will schedule\n // the 'flush queue' method the first time it comes here. then the flag is\n // set to 'true' so it will know it's already scheduled for subsequent calls.\n if (!this.scheduled) {\n // if not scheduled, schedule one\n window.setTimeout(this.flushAsyncQueue.bind(this), 0);\n // mark that it is scheduled\n this.scheduled = true;\n }\n };\n // this happens in the next VM turn only, and empties the queue of events\n EventService.prototype.flushAsyncQueue = function () {\n this.scheduled = false;\n // we take a copy, because the event listener could be using\n // the grid, which would cause more events, which would be potentially\n // added to the queue, so safe to take a copy, the new events will\n // get executed in a later VM turn rather than risk updating the\n // queue as we are flushing it.\n var queueCopy = this.asyncFunctionsQueue.slice();\n this.asyncFunctionsQueue = [];\n // execute the queue\n queueCopy.forEach(function (func) { return func(); });\n };\n __decorate([\n __param(0, Qualifier('loggerFactory')),\n __param(1, Qualifier('gridOptionsWrapper')),\n __param(2, Qualifier('frameworkOverrides')),\n __param(3, Qualifier('globalEventListener'))\n ], EventService.prototype, \"setBeans\", null);\n EventService = __decorate([\n Bean('eventService')\n ], EventService);\n return EventService;\n}());\n\n/**\n * @ag-grid-community/core - Advanced Data Grid / Data Table supporting Javascript / React / AngularJS / Web Components\n * @version v25.1.0\n * @link http://www.ag-grid.com/\n * @license MIT\n */\nvar Constants = /** @class */ (function () {\n function Constants() {\n }\n Constants.ROW_BUFFER_SIZE = 10;\n Constants.LAYOUT_INTERVAL = 500;\n Constants.BATCH_WAIT_MILLIS = 50;\n Constants.EXPORT_TYPE_DRAG_COPY = 'dragCopy';\n Constants.EXPORT_TYPE_CLIPBOARD = 'clipboard';\n Constants.EXPORT_TYPE_EXCEL = 'excel';\n Constants.EXPORT_TYPE_CSV = 'csv';\n Constants.ROW_MODEL_TYPE_INFINITE = 'infinite';\n Constants.ROW_MODEL_TYPE_VIEWPORT = 'viewport';\n Constants.ROW_MODEL_TYPE_CLIENT_SIDE = 'clientSide';\n Constants.ROW_MODEL_TYPE_SERVER_SIDE = 'serverSide';\n Constants.ALWAYS = 'always';\n Constants.ONLY_WHEN_GROUPING = 'onlyWhenGrouping';\n Constants.PINNED_TOP = 'top';\n Constants.PINNED_BOTTOM = 'bottom';\n Constants.DOM_LAYOUT_NORMAL = 'normal';\n Constants.DOM_LAYOUT_PRINT = 'print';\n Constants.DOM_LAYOUT_AUTO_HEIGHT = 'autoHeight';\n Constants.GROUP_AUTO_COLUMN_ID = 'ag-Grid-AutoColumn';\n Constants.SOURCE_PASTE = 'paste';\n Constants.PINNED_RIGHT = 'right';\n Constants.PINNED_LEFT = 'left';\n Constants.SORT_ASC = 'asc';\n Constants.SORT_DESC = 'desc';\n Constants.INPUT_SELECTOR = 'input, select, button, textarea';\n Constants.FOCUSABLE_SELECTOR = '[tabindex], input, select, button, textarea';\n Constants.FOCUSABLE_EXCLUDE = '.ag-hidden, .ag-hidden *, [disabled], .ag-disabled, .ag-disabled *';\n return Constants;\n}());\n\n/**\n * @ag-grid-community/core - Advanced Data Grid / Data Table supporting Javascript / React / AngularJS / Web Components\n * @version v25.1.0\n * @link http://www.ag-grid.com/\n * @license MIT\n */\n(function (ModuleNames) {\n // when using modules, user references this\n ModuleNames[\"CommunityCoreModule\"] = \"@ag-grid-community/core\";\n // when not using modules, user references this\n ModuleNames[\"CommunityAllModules\"] = \"@ag-grid-community/all\";\n // community modules\n ModuleNames[\"InfiniteRowModelModule\"] = \"@ag-grid-community/infinite-row-model\";\n ModuleNames[\"ClientSideRowModelModule\"] = \"@ag-grid-community/client-side-row-model\";\n ModuleNames[\"CsvExportModule\"] = \"@ag-grid-community/csv-export\";\n // enterprise core - users never import on this, but other enterprise modules do\n ModuleNames[\"EnterpriseCoreModule\"] = \"@ag-grid-enterprise/core\";\n // when not using modules, user references this\n ModuleNames[\"EnterpriseAllModules\"] = \"@ag-grid-enterprise/all\";\n // enterprise modules\n ModuleNames[\"RowGroupingModule\"] = \"@ag-grid-enterprise/row-grouping\";\n ModuleNames[\"ColumnToolPanelModule\"] = \"@ag-grid-enterprise/column-tool-panel\";\n ModuleNames[\"FiltersToolPanelModule\"] = \"@ag-grid-enterprise/filter-tool-panel\";\n ModuleNames[\"MenuModule\"] = \"@ag-grid-enterprise/menu\";\n ModuleNames[\"SetFilterModule\"] = \"@ag-grid-enterprise/set-filter\";\n ModuleNames[\"MultiFilterModule\"] = \"@ag-grid-enterprise/multi-filter\";\n ModuleNames[\"StatusBarModule\"] = \"@ag-grid-enterprise/status-bar\";\n ModuleNames[\"SideBarModule\"] = \"@ag-grid-enterprise/side-bar\";\n ModuleNames[\"RangeSelectionModule\"] = \"@ag-grid-enterprise/range-selection\";\n ModuleNames[\"MasterDetailModule\"] = \"@ag-grid-enterprise/master-detail\";\n ModuleNames[\"RichSelectModule\"] = \"@ag-grid-enterprise/rich-select\";\n ModuleNames[\"GridChartsModule\"] = \"@ag-grid-enterprise/charts\";\n ModuleNames[\"ViewportRowModelModule\"] = \"@ag-grid-enterprise/viewport-row-model\";\n ModuleNames[\"ServerSideRowModelModule\"] = \"@ag-grid-enterprise/server-side-row-model\";\n ModuleNames[\"ExcelExportModule\"] = \"@ag-grid-enterprise/excel-export\";\n ModuleNames[\"ClipboardModule\"] = \"@ag-grid-enterprise/clipboard\";\n ModuleNames[\"DateTimeCellEditorModule\"] = \"@ag-grid-enterprise/date-time-cell-editor\";\n // framework wrappers currently don't provide beans, comps etc, so no need to be modules,\n // however i argue they should be as in theory they 'could' provide beans etc\n ModuleNames[\"AngularModule\"] = \"@ag-grid-community/angular\";\n ModuleNames[\"ReactModule\"] = \"@ag-grid-community/react\";\n ModuleNames[\"VueModule\"] = \"@ag-grid-community/vue\";\n ModuleNames[\"PolymerModule\"] = \"@ag-grid-community/polymer\";\n // and then this, which is definitely not a grid module, as it should not have any dependency\n // on the grid (ie shouldn't even reference the Module interface)\n // ChartsModule = \"@ag-grid-community/charts-core\",\n})(exports.ModuleNames || (exports.ModuleNames = {}));\n\n/**\n * @ag-grid-community/core - Advanced Data Grid / Data Table supporting Javascript / React / AngularJS / Web Components\n * @version v25.1.0\n * @link http://www.ag-grid.com/\n * @license MIT\n */\nvar ModuleRegistry = /** @class */ (function () {\n function ModuleRegistry() {\n }\n ModuleRegistry.register = function (module, moduleBased) {\n if (moduleBased === void 0) { moduleBased = true; }\n ModuleRegistry.modulesMap[module.moduleName] = module;\n if (ModuleRegistry.moduleBased === undefined) {\n ModuleRegistry.moduleBased = moduleBased;\n }\n else {\n if (ModuleRegistry.moduleBased !== moduleBased) {\n doOnce(function () {\n console.warn(\"AG Grid: You are mixing modules (i.e. @ag-grid-community/core) and packages (ag-grid-community) - you can only use one or the other of these mechanisms.\");\n console.warn('Please see https://www.ag-grid.com/documentation/javascript/packages-modules/ for more information.');\n }, 'ModulePackageCheck');\n }\n }\n };\n // noinspection JSUnusedGlobalSymbols\n ModuleRegistry.registerModules = function (modules, moduleBased) {\n if (moduleBased === void 0) { moduleBased = true; }\n if (!modules) {\n return;\n }\n modules.forEach(function (module) { return ModuleRegistry.register(module, moduleBased); });\n };\n ModuleRegistry.assertRegistered = function (moduleName, reason) {\n if (this.isRegistered(moduleName)) {\n return true;\n }\n var warningKey = reason + moduleName;\n var warningMessage = \"AG Grid: unable to use \" + reason + \" as module \" + moduleName + \" is not present. Please see: https://www.ag-grid.com/documentation/javascript/modules/\";\n doOnce(function () {\n console.warn(warningMessage);\n }, warningKey);\n return false;\n };\n ModuleRegistry.isRegistered = function (moduleName) {\n return !!ModuleRegistry.modulesMap[moduleName];\n };\n ModuleRegistry.getRegisteredModules = function () {\n return values(ModuleRegistry.modulesMap);\n };\n ModuleRegistry.isPackageBased = function () {\n return !ModuleRegistry.moduleBased;\n };\n // having in a map a) removes duplicates and b) allows fast lookup\n ModuleRegistry.modulesMap = {};\n return ModuleRegistry;\n}());\n\n/**\n * @ag-grid-community/core - Advanced Data Grid / Data Table supporting Javascript / React / AngularJS / Web Components\n * @version v25.1.0\n * @link http://www.ag-grid.com/\n * @license MIT\n */\nvar __decorate$1 = (undefined && undefined.__decorate) || function (decorators, target, key, desc) {\n var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d;\n if (typeof Reflect === \"object\" && typeof Reflect.decorate === \"function\") r = Reflect.decorate(decorators, target, key, desc);\n else for (var i = decorators.length - 1; i >= 0; i--) if (d = decorators[i]) r = (c < 3 ? d(r) : c > 3 ? d(target, key, r) : d(target, key)) || r;\n return c > 3 && r && Object.defineProperty(target, key, r), r;\n};\n// Wrapper around a user provide column definition. The grid treats the column definition as ready only.\n// This class contains all the runtime information about a column, plus some logic (the definition has no logic).\n// This class implements both interfaces ColumnGroupChild and OriginalColumnGroupChild as the class can\n// appear as a child of either the original tree or the displayed tree. However the relevant group classes\n// for each type only implements one, as each group can only appear in it's associated tree (eg OriginalColumnGroup\n// can only appear in OriginalColumn tree).\nvar Column = /** @class */ (function () {\n function Column(colDef, userProvidedColDef, colId, primary) {\n this.moving = false;\n this.menuVisible = false;\n this.filterActive = false;\n this.eventService = new EventService();\n this.rowGroupActive = false;\n this.pivotActive = false;\n this.aggregationActive = false;\n this.colDef = colDef;\n this.userProvidedColDef = userProvidedColDef;\n this.colId = colId;\n this.primary = primary;\n this.setState(colDef);\n }\n Column.prototype.setState = function (colDef) {\n // sort\n if (colDef.sort !== undefined) {\n if (colDef.sort === Constants.SORT_ASC || colDef.sort === Constants.SORT_DESC) {\n this.sort = colDef.sort;\n }\n }\n else {\n if (colDef.initialSort === Constants.SORT_ASC || colDef.initialSort === Constants.SORT_DESC) {\n this.sort = colDef.initialSort;\n }\n }\n // sortIndex\n var sortIndex = attrToNumber(colDef.sortIndex);\n var initialSortIndex = attrToNumber(colDef.initialSortIndex);\n if (sortIndex !== undefined) {\n if (sortIndex !== null) {\n this.sortIndex = sortIndex;\n }\n }\n else {\n if (initialSortIndex !== null) {\n this.sortIndex = initialSortIndex;\n }\n }\n // hide\n var hide = attrToBoolean(colDef.hide);\n var initialHide = attrToBoolean(colDef.initialHide);\n if (hide !== undefined) {\n this.visible = !hide;\n }\n else {\n this.visible = !initialHide;\n }\n // pinned\n if (colDef.pinned !== undefined) {\n this.setPinned(colDef.pinned);\n }\n else {\n this.setPinned(colDef.initialPinned);\n }\n // flex\n var flex = attrToNumber(colDef.flex);\n var initialFlex = attrToNumber(colDef.initialFlex);\n if (flex !== undefined) {\n this.flex = flex;\n }\n else if (initialFlex !== undefined) {\n this.flex = initialFlex;\n }\n };\n // gets called when user provides an alternative colDef, eg\n Column.prototype.setColDef = function (colDef, userProvidedColDef) {\n this.colDef = colDef;\n this.userProvidedColDef = userProvidedColDef;\n };\n Column.prototype.getUserProvidedColDef = function () {\n return this.userProvidedColDef;\n };\n Column.prototype.setParent = function (parent) {\n this.parent = parent;\n };\n Column.prototype.getParent = function () {\n return this.parent;\n };\n Column.prototype.setOriginalParent = function (originalParent) {\n this.originalParent = originalParent;\n };\n Column.prototype.getOriginalParent = function () {\n return this.originalParent;\n };\n // this is done after constructor as it uses gridOptionsWrapper\n Column.prototype.initialise = function () {\n var minColWidth = this.gridOptionsWrapper.getMinColWidth();\n var maxColWidth = this.gridOptionsWrapper.getMaxColWidth();\n if (this.colDef.minWidth != null) {\n // we force min width to be at least one pixel, otherwise column will disappear\n this.minWidth = Math.max(this.colDef.minWidth, 1);\n }\n else {\n this.minWidth = minColWidth;\n }\n if (this.colDef.maxWidth != null) {\n this.maxWidth = this.colDef.maxWidth;\n }\n else {\n this.maxWidth = maxColWidth;\n }\n this.resetActualWidth('gridInitializing');\n var suppressDotNotation = this.gridOptionsWrapper.isSuppressFieldDotNotation();\n this.fieldContainsDots = exists(this.colDef.field) && this.colDef.field.indexOf('.') >= 0 && !suppressDotNotation;\n this.tooltipFieldContainsDots = exists(this.colDef.tooltipField) && this.colDef.tooltipField.indexOf('.') >= 0 && !suppressDotNotation;\n this.validate();\n };\n Column.prototype.resetActualWidth = function (source) {\n if (source === void 0) { source = 'api'; }\n var initialWidth = this.columnUtils.calculateColInitialWidth(this.colDef);\n this.setActualWidth(initialWidth, source, true);\n };\n Column.prototype.isEmptyGroup = function () {\n return false;\n };\n Column.prototype.isRowGroupDisplayed = function (colId) {\n if (missing(this.colDef) || missing(this.colDef.showRowGroup)) {\n return false;\n }\n var showingAllGroups = this.colDef.showRowGroup === true;\n var showingThisGroup = this.colDef.showRowGroup === colId;\n return showingAllGroups || showingThisGroup;\n };\n Column.prototype.getUniqueId = function () {\n return this.getId();\n };\n Column.prototype.isPrimary = function () {\n return this.primary;\n };\n Column.prototype.isFilterAllowed = function () {\n // filter defined means it's a string, class or true.\n // if its false, null or undefined then it's false.\n var filterDefined = !!this.colDef.filter || !!this.colDef.filterFramework;\n return this.primary && filterDefined;\n };\n Column.prototype.isFieldContainsDots = function () {\n return this.fieldContainsDots;\n };\n Column.prototype.isTooltipFieldContainsDots = function () {\n return this.tooltipFieldContainsDots;\n };\n Column.prototype.validate = function () {\n var colDefAny = this.colDef;\n function warnOnce(msg, key, obj) {\n doOnce(function () {\n if (obj) {\n console.warn(msg, obj);\n }\n else {\n doOnce(function () { return console.warn(msg); }, key);\n }\n }, key);\n }\n if (!ModuleRegistry.isRegistered(exports.ModuleNames.RowGroupingModule)) {\n var rowGroupingItems = ['enableRowGroup', 'rowGroup', 'rowGroupIndex', 'enablePivot', 'enableValue', 'pivot', 'pivotIndex', 'aggFunc'];\n rowGroupingItems.forEach(function (item) {\n if (exists(colDefAny[item])) {\n if (ModuleRegistry.isPackageBased()) {\n warnOnce(\"AG Grid: \" + item + \" is only valid in ag-grid-enterprise, your column definition should not have \" + item, 'ColumnRowGroupingMissing' + item);\n }\n else {\n warnOnce(\"AG Grid: \" + item + \" is only valid with AG Grid Enterprise Module \" + exports.ModuleNames.RowGroupingModule + \" - your column definition should not have \" + item, 'ColumnRowGroupingMissing' + item);\n }\n }\n });\n }\n if (!ModuleRegistry.isRegistered(exports.ModuleNames.RichSelectModule)) {\n if (this.colDef.cellEditor === 'agRichSelect' || this.colDef.cellEditor === 'agRichSelectCellEditor') {\n if (ModuleRegistry.isPackageBased()) {\n warnOnce(\"AG Grid: \" + this.colDef.cellEditor + \" can only be used with ag-grid-enterprise\", 'ColumnRichSelectMissing');\n }\n else {\n warnOnce(\"AG Grid: \" + this.colDef.cellEditor + \" can only be used with AG Grid Enterprise Module \" + exports.ModuleNames.RichSelectModule, 'ColumnRichSelectMissing');\n }\n }\n }\n if (!ModuleRegistry.isRegistered(exports.ModuleNames.DateTimeCellEditorModule)) {\n if (this.colDef.cellEditor === 'agRichSelect' || this.colDef.cellEditor === 'agDateTimeCellEditor') {\n if (ModuleRegistry.isPackageBased()) {\n warnOnce(\"AG Grid: \" + this.colDef.cellEditor + \" can only be used with ag-grid-enterprise\", 'ColumnDateTimeMissing');\n }\n else {\n warnOnce(\"AG Grid: \" + this.colDef.cellEditor + \" can only be used with AG Grid Enterprise Module \" + exports.ModuleNames.DateTimeCellEditorModule, 'ColumnDateTimeMissing');\n }\n }\n }\n if (this.gridOptionsWrapper.isTreeData()) {\n var itemsNotAllowedWithTreeData = ['rowGroup', 'rowGroupIndex', 'pivot', 'pivotIndex'];\n itemsNotAllowedWithTreeData.forEach(function (item) {\n if (exists(colDefAny[item])) {\n warnOnce(\"AG Grid: \" + item + \" is not possible when doing tree data, your column definition should not have \" + item, 'TreeDataCannotRowGroup');\n }\n });\n }\n if (exists(this.colDef.width) && typeof this.colDef.width !== 'number') {\n warnOnce('AG Grid: colDef.width should be a number, not ' + typeof this.colDef.width, 'ColumnCheck_asdfawef');\n }\n };\n Column.prototype.addEventListener = function (eventType, listener) {\n this.eventService.addEventListener(eventType, listener);\n };\n Column.prototype.removeEventListener = function (eventType, listener) {\n this.eventService.removeEventListener(eventType, listener);\n };\n Column.prototype.createColumnFunctionCallbackParams = function (rowNode) {\n return {\n node: rowNode,\n data: rowNode.data,\n column: this,\n colDef: this.colDef,\n context: this.gridOptionsWrapper.getContext(),\n api: this.gridOptionsWrapper.getApi(),\n columnApi: this.gridOptionsWrapper.getColumnApi()\n };\n };\n Column.prototype.isSuppressNavigable = function (rowNode) {\n // if boolean set, then just use it\n if (typeof this.colDef.suppressNavigable === 'boolean') {\n return this.colDef.suppressNavigable;\n }\n // if function, then call the function to find out\n if (typeof this.colDef.suppressNavigable === 'function') {\n var params = this.createColumnFunctionCallbackParams(rowNode);\n var userFunc = this.colDef.suppressNavigable;\n return userFunc(params);\n }\n return false;\n };\n Column.prototype.isCellEditable = function (rowNode) {\n // only allow editing of groups if the user has this option enabled\n if (rowNode.group && !this.gridOptionsWrapper.isEnableGroupEdit()) {\n return false;\n }\n return this.isColumnFunc(rowNode, this.colDef.editable);\n };\n Column.prototype.isRowDrag = function (rowNode) {\n return this.isColumnFunc(rowNode, this.colDef.rowDrag);\n };\n Column.prototype.isDndSource = function (rowNode) {\n return this.isColumnFunc(rowNode, this.colDef.dndSource);\n };\n Column.prototype.isCellCheckboxSelection = function (rowNode) {\n return this.isColumnFunc(rowNode, this.colDef.checkboxSelection);\n };\n Column.prototype.isSuppressPaste = function (rowNode) {\n return this.isColumnFunc(rowNode, this.colDef ? this.colDef.suppressPaste : null);\n };\n Column.prototype.isResizable = function () {\n return this.colDef.resizable === true;\n };\n Column.prototype.isColumnFunc = function (rowNode, value) {\n // if boolean set, then just use it\n if (typeof value === 'boolean') {\n return value;\n }\n // if function, then call the function to find out\n if (typeof value === 'function') {\n var params = this.createColumnFunctionCallbackParams(rowNode);\n var editableFunc = value;\n return editableFunc(params);\n }\n return false;\n };\n Column.prototype.setMoving = function (moving, source) {\n if (source === void 0) { source = \"api\"; }\n this.moving = moving;\n this.eventService.dispatchEvent(this.createColumnEvent(Column.EVENT_MOVING_CHANGED, source));\n };\n Column.prototype.createColumnEvent = function (type, source) {\n return {\n api: this.gridApi,\n columnApi: this.columnApi,\n type: type,\n column: this,\n columns: [this],\n source: source\n };\n };\n Column.prototype.isMoving = function () {\n return this.moving;\n };\n Column.prototype.getSort = function () {\n return this.sort;\n };\n Column.prototype.setSort = function (sort, source) {\n if (source === void 0) { source = \"api\"; }\n if (this.sort !== sort) {\n this.sort = sort;\n this.eventService.dispatchEvent(this.createColumnEvent(Column.EVENT_SORT_CHANGED, source));\n }\n };\n Column.prototype.setMenuVisible = function (visible, source) {\n if (source === void 0) { source = \"api\"; }\n if (this.menuVisible !== visible) {\n this.menuVisible = visible;\n this.eventService.dispatchEvent(this.createColumnEvent(Column.EVENT_MENU_VISIBLE_CHANGED, source));\n }\n };\n Column.prototype.isMenuVisible = function () {\n return this.menuVisible;\n };\n Column.prototype.isSortAscending = function () {\n return this.sort === Constants.SORT_ASC;\n };\n Column.prototype.isSortDescending = function () {\n return this.sort === Constants.SORT_DESC;\n };\n Column.prototype.isSortNone = function () {\n return missing(this.sort);\n };\n Column.prototype.isSorting = function () {\n return exists(this.sort);\n };\n Column.prototype.getSortIndex = function () {\n return this.sortIndex;\n };\n Column.prototype.setSortIndex = function (sortOrder) {\n this.sortIndex = sortOrder;\n };\n Column.prototype.setAggFunc = function (aggFunc) {\n this.aggFunc = aggFunc;\n };\n Column.prototype.getAggFunc = function () {\n return this.aggFunc;\n };\n Column.prototype.getLeft = function () {\n return this.left;\n };\n Column.prototype.getOldLeft = function () {\n return this.oldLeft;\n };\n Column.prototype.getRight = function () {\n return this.left + this.actualWidth;\n };\n Column.prototype.setLeft = function (left, source) {\n if (source === void 0) { source = \"api\"; }\n this.oldLeft = this.left;\n if (this.left !== left) {\n this.left = left;\n this.eventService.dispatchEvent(this.createColumnEvent(Column.EVENT_LEFT_CHANGED, source));\n }\n };\n Column.prototype.isFilterActive = function () {\n return this.filterActive;\n };\n // additionalEventAttributes is used by provided simple floating filter, so it can add 'floatingFilter=true' to the event\n Column.prototype.setFilterActive = function (active, source, additionalEventAttributes) {\n if (source === void 0) { source = \"api\"; }\n if (this.filterActive !== active) {\n this.filterActive = active;\n this.eventService.dispatchEvent(this.createColumnEvent(Column.EVENT_FILTER_ACTIVE_CHANGED, source));\n }\n var filterChangedEvent = this.createColumnEvent(Column.EVENT_FILTER_CHANGED, source);\n if (additionalEventAttributes) {\n mergeDeep(filterChangedEvent, additionalEventAttributes);\n }\n this.eventService.dispatchEvent(filterChangedEvent);\n };\n Column.prototype.setPinned = function (pinned) {\n if (pinned === true || pinned === Constants.PINNED_LEFT) {\n this.pinned = Constants.PINNED_LEFT;\n }\n else if (pinned === Constants.PINNED_RIGHT) {\n this.pinned = Constants.PINNED_RIGHT;\n }\n else {\n this.pinned = null;\n }\n };\n Column.prototype.setFirstRightPinned = function (firstRightPinned, source) {\n if (source === void 0) { source = \"api\"; }\n if (this.firstRightPinned !== firstRightPinned) {\n this.firstRightPinned = firstRightPinned;\n this.eventService.dispatchEvent(this.createColumnEvent(Column.EVENT_FIRST_RIGHT_PINNED_CHANGED, source));\n }\n };\n Column.prototype.setLastLeftPinned = function (lastLeftPinned, source) {\n if (source === void 0) { source = \"api\"; }\n if (this.lastLeftPinned !== lastLeftPinned) {\n this.lastLeftPinned = lastLeftPinned;\n this.eventService.dispatchEvent(this.createColumnEvent(Column.EVENT_LAST_LEFT_PINNED_CHANGED, source));\n }\n };\n Column.prototype.isFirstRightPinned = function () {\n return this.firstRightPinned;\n };\n Column.prototype.isLastLeftPinned = function () {\n return this.lastLeftPinned;\n };\n Column.prototype.isPinned = function () {\n return this.pinned === Constants.PINNED_LEFT || this.pinned === Constants.PINNED_RIGHT;\n };\n Column.prototype.isPinnedLeft = function () {\n return this.pinned === Constants.PINNED_LEFT;\n };\n Column.prototype.isPinnedRight = function () {\n return this.pinned === Constants.PINNED_RIGHT;\n };\n Column.prototype.getPinned = function () {\n return this.pinned;\n };\n Column.prototype.setVisible = function (visible, source) {\n if (source === void 0) { source = \"api\"; }\n var newValue = visible === true;\n if (this.visible !== newValue) {\n this.visible = newValue;\n this.eventService.dispatchEvent(this.createColumnEvent(Column.EVENT_VISIBLE_CHANGED, source));\n }\n };\n Column.prototype.isVisible = function () {\n return this.visible;\n };\n Column.prototype.getColDef = function () {\n return this.colDef;\n };\n Column.prototype.getColumnGroupShow = function () {\n return this.colDef.columnGroupShow;\n };\n Column.prototype.getColId = function () {\n return this.colId;\n };\n Column.prototype.getId = function () {\n return this.getColId();\n };\n Column.prototype.getDefinition = function () {\n return this.colDef;\n };\n Column.prototype.getActualWidth = function () {\n return this.actualWidth;\n };\n Column.prototype.createBaseColDefParams = function (rowNode) {\n var params = {\n node: rowNode,\n data: rowNode.data,\n colDef: this.colDef,\n column: this,\n api: this.gridOptionsWrapper.getApi(),\n columnApi: this.gridOptionsWrapper.getColumnApi(),\n context: this.gridOptionsWrapper.getContext()\n };\n return params;\n };\n Column.prototype.getColSpan = function (rowNode) {\n if (missing(this.colDef.colSpan)) {\n return 1;\n }\n var params = this.createBaseColDefParams(rowNode);\n var colSpan = this.colDef.colSpan(params);\n // colSpan must be number equal to or greater than 1\n return Math.max(colSpan, 1);\n };\n Column.prototype.getRowSpan = function (rowNode) {\n if (missing(this.colDef.rowSpan)) {\n return 1;\n }\n var params = this.createBaseColDefParams(rowNode);\n var rowSpan = this.colDef.rowSpan(params);\n // rowSpan must be number equal to or greater than 1\n return Math.max(rowSpan, 1);\n };\n Column.prototype.setActualWidth = function (actualWidth, source, silent) {\n if (source === void 0) { source = \"api\"; }\n if (silent === void 0) { silent = false; }\n if (this.minWidth != null) {\n actualWidth = Math.max(actualWidth, this.minWidth);\n }\n if (this.maxWidth != null) {\n actualWidth = Math.min(actualWidth, this.maxWidth);\n }\n if (this.actualWidth !== actualWidth) {\n // disable flex for this column if it was manually resized.\n this.actualWidth = actualWidth;\n if (this.flex && source !== 'flex' && source !== 'gridInitializing') {\n this.flex = null;\n }\n if (!silent) {\n this.fireColumnWidthChangedEvent(source);\n }\n }\n };\n Column.prototype.fireColumnWidthChangedEvent = function (source) {\n this.eventService.dispatchEvent(this.createColumnEvent(Column.EVENT_WIDTH_CHANGED, source));\n };\n Column.prototype.isGreaterThanMax = function (width) {\n if (this.maxWidth != null) {\n return width > this.maxWidth;\n }\n return false;\n };\n Column.prototype.getMinWidth = function () {\n return this.minWidth;\n };\n Column.prototype.getMaxWidth = function () {\n return this.maxWidth;\n };\n Column.prototype.getFlex = function () {\n return this.flex || 0;\n };\n // this method should only be used by the columnController to\n // change flex when required by the setColumnState method.\n Column.prototype.setFlex = function (flex) {\n if (this.flex !== flex) {\n this.flex = flex;\n }\n };\n Column.prototype.setMinimum = function (source) {\n if (source === void 0) { source = \"api\"; }\n if (exists(this.minWidth)) {\n this.setActualWidth(this.minWidth, source);\n }\n };\n Column.prototype.setRowGroupActive = function (rowGroup, source) {\n if (source === void 0) { source = \"api\"; }\n if (this.rowGroupActive !== rowGroup) {\n this.rowGroupActive = rowGroup;\n this.eventService.dispatchEvent(this.createColumnEvent(Column.EVENT_ROW_GROUP_CHANGED, source));\n }\n };\n Column.prototype.isRowGroupActive = function () {\n return this.rowGroupActive;\n };\n Column.prototype.setPivotActive = function (pivot, source) {\n if (source === void 0) { source = \"api\"; }\n if (this.pivotActive !== pivot) {\n this.pivotActive = pivot;\n this.eventService.dispatchEvent(this.createColumnEvent(Column.EVENT_PIVOT_CHANGED, source));\n }\n };\n Column.prototype.isPivotActive = function () {\n return this.pivotActive;\n };\n Column.prototype.isAnyFunctionActive = function () {\n return this.isPivotActive() || this.isRowGroupActive() || this.isValueActive();\n };\n Column.prototype.isAnyFunctionAllowed = function () {\n return this.isAllowPivot() || this.isAllowRowGroup() || this.isAllowValue();\n };\n Column.prototype.setValueActive = function (value, source) {\n if (source === void 0) { source = \"api\"; }\n if (this.aggregationActive !== value) {\n this.aggregationActive = value;\n this.eventService.dispatchEvent(this.createColumnEvent(Column.EVENT_VALUE_CHANGED, source));\n }\n };\n Column.prototype.isValueActive = function () {\n return this.aggregationActive;\n };\n Column.prototype.isAllowPivot = function () {\n return this.colDef.enablePivot === true;\n };\n Column.prototype.isAllowValue = function () {\n return this.colDef.enableValue === true;\n };\n Column.prototype.isAllowRowGroup = function () {\n return this.colDef.enableRowGroup === true;\n };\n Column.prototype.getMenuTabs = function (defaultValues) {\n var menuTabs = this.getColDef().menuTabs;\n if (menuTabs == null) {\n menuTabs = defaultValues;\n }\n return menuTabs;\n };\n // this used to be needed, as previous version of ag-grid had lockPosition as column state,\n // so couldn't depend on colDef version.\n Column.prototype.isLockPosition = function () {\n console.warn('AG Grid: since v21, col.isLockPosition() should not be used, please use col.getColDef().lockPosition instead.');\n return this.colDef ? !!this.colDef.lockPosition : false;\n };\n // this used to be needed, as previous version of ag-grid had lockVisible as column state,\n // so couldn't depend on colDef version.\n Column.prototype.isLockVisible = function () {\n console.warn('AG Grid: since v21, col.isLockVisible() should not be used, please use col.getColDef().lockVisible instead.');\n return this.colDef ? !!this.colDef.lockVisible : false;\n };\n // this used to be needed, as previous version of ag-grid had lockPinned as column state,\n // so couldn't depend on colDef version.\n Column.prototype.isLockPinned = function () {\n console.warn('AG Grid: since v21, col.isLockPinned() should not be used, please use col.getColDef().lockPinned instead.');\n return this.colDef ? !!this.colDef.lockPinned : false;\n };\n // + renderedHeaderCell - for making header cell transparent when moving\n Column.EVENT_MOVING_CHANGED = 'movingChanged';\n // + renderedCell - changing left position\n Column.EVENT_LEFT_CHANGED = 'leftChanged';\n // + renderedCell - changing width\n Column.EVENT_WIDTH_CHANGED = 'widthChanged';\n // + renderedCell - for changing pinned classes\n Column.EVENT_LAST_LEFT_PINNED_CHANGED = 'lastLeftPinnedChanged';\n Column.EVENT_FIRST_RIGHT_PINNED_CHANGED = 'firstRightPinnedChanged';\n // + renderedColumn - for changing visibility icon\n Column.EVENT_VISIBLE_CHANGED = 'visibleChanged';\n // + every time the filter changes, used in the floating filters\n Column.EVENT_FILTER_CHANGED = 'filterChanged';\n // + renderedHeaderCell - marks the header with filter icon\n Column.EVENT_FILTER_ACTIVE_CHANGED = 'filterActiveChanged';\n // + renderedHeaderCell - marks the header with sort icon\n Column.EVENT_SORT_CHANGED = 'sortChanged';\n Column.EVENT_MENU_VISIBLE_CHANGED = 'menuVisibleChanged';\n // + toolpanel, for gui updates\n Column.EVENT_ROW_GROUP_CHANGED = 'columnRowGroupChanged';\n // + toolpanel, for gui updates\n Column.EVENT_PIVOT_CHANGED = 'columnPivotChanged';\n // + toolpanel, for gui updates\n Column.EVENT_VALUE_CHANGED = 'columnValueChanged';\n __decorate$1([\n Autowired('gridOptionsWrapper')\n ], Column.prototype, \"gridOptionsWrapper\", void 0);\n __decorate$1([\n Autowired('columnUtils')\n ], Column.prototype, \"columnUtils\", void 0);\n __decorate$1([\n Autowired('columnApi')\n ], Column.prototype, \"columnApi\", void 0);\n __decorate$1([\n Autowired('gridApi')\n ], Column.prototype, \"gridApi\", void 0);\n __decorate$1([\n Autowired('context')\n ], Column.prototype, \"context\", void 0);\n __decorate$1([\n PostConstruct\n ], Column.prototype, \"initialise\", null);\n return Column;\n}());\n\n/**\n * @ag-grid-community/core - Advanced Data Grid / Data Table supporting Javascript / React / AngularJS / Web Components\n * @version v25.1.0\n * @link http://www.ag-grid.com/\n * @license MIT\n */\nvar __decorate$2 = (undefined && undefined.__decorate) || function (decorators, target, key, desc) {\n var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d;\n if (typeof Reflect === \"object\" && typeof Reflect.decorate === \"function\") r = Reflect.decorate(decorators, target, key, desc);\n else for (var i = decorators.length - 1; i >= 0; i--) if (d = decorators[i]) r = (c < 3 ? d(r) : c > 3 ? d(target, key, r) : d(target, key)) || r;\n return c > 3 && r && Object.defineProperty(target, key, r), r;\n};\nvar ColumnGroup = /** @class */ (function () {\n function ColumnGroup(originalColumnGroup, groupId, instanceId, pinned) {\n // depends on the open/closed state of the group, only displaying columns are stored here\n this.displayedChildren = [];\n this.localEventService = new EventService();\n this.groupId = groupId;\n this.instanceId = instanceId;\n this.originalColumnGroup = originalColumnGroup;\n this.pinned = pinned;\n }\n // this is static, a it is used outside of this class\n ColumnGroup.createUniqueId = function (groupId, instanceId) {\n return groupId + '_' + instanceId;\n };\n // as the user is adding and removing columns, the groups are recalculated.\n // this reset clears out all children, ready for children to be added again\n ColumnGroup.prototype.reset = function () {\n this.parent = null;\n this.children = null;\n this.displayedChildren = null;\n };\n ColumnGroup.prototype.getParent = function () {\n return this.parent;\n };\n ColumnGroup.prototype.setParent = function (parent) {\n this.parent = parent;\n };\n ColumnGroup.prototype.getUniqueId = function () {\n return ColumnGroup.createUniqueId(this.groupId, this.instanceId);\n };\n ColumnGroup.prototype.isEmptyGroup = function () {\n return this.displayedChildren.length === 0;\n };\n ColumnGroup.prototype.isMoving = function () {\n var allLeafColumns = this.getOriginalColumnGroup().getLeafColumns();\n if (!allLeafColumns || allLeafColumns.length === 0) {\n return false;\n }\n return allLeafColumns.every(function (col) { return col.isMoving(); });\n };\n ColumnGroup.prototype.checkLeft = function () {\n // first get all children to setLeft, as it impacts our decision below\n this.displayedChildren.forEach(function (child) {\n if (child instanceof ColumnGroup) {\n child.checkLeft();\n }\n });\n // set our left based on first displayed column\n if (this.displayedChildren.length > 0) {\n if (this.gridOptionsWrapper.isEnableRtl()) {\n var lastChild = last(this.displayedChildren);\n var lastChildLeft = lastChild.getLeft();\n this.setLeft(lastChildLeft);\n }\n else {\n var firstChildLeft = this.displayedChildren[0].getLeft();\n this.setLeft(firstChildLeft);\n }\n }\n else {\n // this should never happen, as if we have no displayed columns, then\n // this groups should not even exist.\n this.setLeft(null);\n }\n };\n ColumnGroup.prototype.getLeft = function () {\n return this.left;\n };\n ColumnGroup.prototype.getOldLeft = function () {\n return this.oldLeft;\n };\n ColumnGroup.prototype.setLeft = function (left) {\n this.oldLeft = left;\n if (this.left !== left) {\n this.left = left;\n this.localEventService.dispatchEvent(this.createAgEvent(ColumnGroup.EVENT_LEFT_CHANGED));\n }\n };\n ColumnGroup.prototype.getPinned = function () {\n return this.pinned;\n };\n ColumnGroup.prototype.createAgEvent = function (type) {\n return { type: type };\n };\n ColumnGroup.prototype.addEventListener = function (eventType, listener) {\n this.localEventService.addEventListener(eventType, listener);\n };\n ColumnGroup.prototype.removeEventListener = function (eventType, listener) {\n this.localEventService.removeEventListener(eventType, listener);\n };\n ColumnGroup.prototype.getGroupId = function () {\n return this.groupId;\n };\n ColumnGroup.prototype.getInstanceId = function () {\n return this.instanceId;\n };\n ColumnGroup.prototype.isChildInThisGroupDeepSearch = function (wantedChild) {\n var result = false;\n this.children.forEach(function (foundChild) {\n if (wantedChild === foundChild) {\n result = true;\n }\n if (foundChild instanceof ColumnGroup) {\n if (foundChild.isChildInThisGroupDeepSearch(wantedChild)) {\n result = true;\n }\n }\n });\n return result;\n };\n ColumnGroup.prototype.getActualWidth = function () {\n var groupActualWidth = 0;\n if (this.displayedChildren) {\n this.displayedChildren.forEach(function (child) {\n groupActualWidth += child.getActualWidth();\n });\n }\n return groupActualWidth;\n };\n ColumnGroup.prototype.isResizable = function () {\n if (!this.displayedChildren) {\n return false;\n }\n // if at least one child is resizable, then the group is resizable\n var result = false;\n this.displayedChildren.forEach(function (child) {\n if (child.isResizable()) {\n result = true;\n }\n });\n return result;\n };\n ColumnGroup.prototype.getMinWidth = function () {\n var result = 0;\n this.displayedChildren.forEach(function (groupChild) {\n result += groupChild.getMinWidth() || 0;\n });\n return result;\n };\n ColumnGroup.prototype.addChild = function (child) {\n if (!this.children) {\n this.children = [];\n }\n this.children.push(child);\n };\n ColumnGroup.prototype.getDisplayedChildren = function () {\n return this.displayedChildren;\n };\n ColumnGroup.prototype.getLeafColumns = function () {\n var result = [];\n this.addLeafColumns(result);\n return result;\n };\n ColumnGroup.prototype.getDisplayedLeafColumns = function () {\n var result = [];\n this.addDisplayedLeafColumns(result);\n return result;\n };\n // why two methods here doing the same thing?\n ColumnGroup.prototype.getDefinition = function () {\n return this.originalColumnGroup.getColGroupDef();\n };\n ColumnGroup.prototype.getColGroupDef = function () {\n return this.originalColumnGroup.getColGroupDef();\n };\n ColumnGroup.prototype.isPadding = function () {\n return this.originalColumnGroup.isPadding();\n };\n ColumnGroup.prototype.isExpandable = function () {\n return this.originalColumnGroup.isExpandable();\n };\n ColumnGroup.prototype.isExpanded = function () {\n return this.originalColumnGroup.isExpanded();\n };\n ColumnGroup.prototype.setExpanded = function (expanded) {\n this.originalColumnGroup.setExpanded(expanded);\n };\n ColumnGroup.prototype.addDisplayedLeafColumns = function (leafColumns) {\n this.displayedChildren.forEach(function (child) {\n if (child instanceof Column) {\n leafColumns.push(child);\n }\n else if (child instanceof ColumnGroup) {\n child.addDisplayedLeafColumns(leafColumns);\n }\n });\n };\n ColumnGroup.prototype.addLeafColumns = function (leafColumns) {\n this.children.forEach(function (child) {\n if (child instanceof Column) {\n leafColumns.push(child);\n }\n else if (child instanceof ColumnGroup) {\n child.addLeafColumns(leafColumns);\n }\n });\n };\n ColumnGroup.prototype.getChildren = function () {\n return this.children;\n };\n ColumnGroup.prototype.getColumnGroupShow = function () {\n return this.originalColumnGroup.getColumnGroupShow();\n };\n ColumnGroup.prototype.getOriginalColumnGroup = function () {\n return this.originalColumnGroup;\n };\n ColumnGroup.prototype.getPaddingLevel = function () {\n var parent = this.getParent();\n if (!this.isPadding() || !parent || !parent.isPadding()) {\n return 0;\n }\n return 1 + parent.getPaddingLevel();\n };\n ColumnGroup.prototype.calculateDisplayedColumns = function () {\n var _this = this;\n // clear out last time we calculated\n this.displayedChildren = [];\n // find the column group that is controlling expandable. this is relevant when we have padding (empty)\n // groups, where the expandable is actually the first parent that is not a padding group.\n var parentWithExpansion = this;\n while (parentWithExpansion != null && parentWithExpansion.isPadding()) {\n parentWithExpansion = parentWithExpansion.getParent();\n }\n var isExpandable = parentWithExpansion ? parentWithExpansion.originalColumnGroup.isExpandable() : false;\n // it not expandable, everything is visible\n if (!isExpandable) {\n this.displayedChildren = this.children;\n return;\n }\n // Add cols based on columnGroupShow\n // Note - the below also adds padding groups, these are always added because they never have\n // colDef.columnGroupShow set.\n this.children.forEach(function (child) {\n // never add empty groups\n var emptyGroup = child instanceof ColumnGroup && (!child.displayedChildren || !child.displayedChildren.length);\n if (emptyGroup) {\n return;\n }\n var headerGroupShow = child.getColumnGroupShow();\n switch (headerGroupShow) {\n case ColumnGroup.HEADER_GROUP_SHOW_OPEN:\n // when set to open, only show col if group is open\n if (parentWithExpansion.originalColumnGroup.isExpanded()) {\n _this.displayedChildren.push(child);\n }\n break;\n case ColumnGroup.HEADER_GROUP_SHOW_CLOSED:\n // when set to open, only show col if group is open\n if (!parentWithExpansion.originalColumnGroup.isExpanded()) {\n _this.displayedChildren.push(child);\n }\n break;\n default:\n _this.displayedChildren.push(child);\n break;\n }\n });\n this.localEventService.dispatchEvent(this.createAgEvent(ColumnGroup.EVENT_DISPLAYED_CHILDREN_CHANGED));\n };\n ColumnGroup.HEADER_GROUP_SHOW_OPEN = 'open';\n ColumnGroup.HEADER_GROUP_SHOW_CLOSED = 'closed';\n ColumnGroup.EVENT_LEFT_CHANGED = 'leftChanged';\n ColumnGroup.EVENT_DISPLAYED_CHILDREN_CHANGED = 'displayedChildrenChanged';\n __decorate$2([\n Autowired('gridOptionsWrapper')\n ], ColumnGroup.prototype, \"gridOptionsWrapper\", void 0);\n return ColumnGroup;\n}());\n\n/**\n * @ag-grid-community/core - Advanced Data Grid / Data Table supporting Javascript / React / AngularJS / Web Components\n * @version v25.1.0\n * @link http://www.ag-grid.com/\n * @license MIT\n */\nvar OriginalColumnGroup = /** @class */ (function () {\n function OriginalColumnGroup(colGroupDef, groupId, padding, level) {\n this.localEventService = new EventService();\n this.expandable = false;\n this.colGroupDef = colGroupDef;\n this.groupId = groupId;\n this.expanded = !!colGroupDef && !!colGroupDef.openByDefault;\n this.padding = padding;\n this.level = level;\n }\n OriginalColumnGroup.prototype.setOriginalParent = function (originalParent) {\n this.originalParent = originalParent;\n };\n OriginalColumnGroup.prototype.getOriginalParent = function () {\n return this.originalParent;\n };\n OriginalColumnGroup.prototype.getLevel = function () {\n return this.level;\n };\n OriginalColumnGroup.prototype.isVisible = function () {\n // return true if at least one child is visible\n if (this.children) {\n return this.children.some(function (child) { return child.isVisible(); });\n }\n return false;\n };\n OriginalColumnGroup.prototype.isPadding = function () {\n return this.padding;\n };\n OriginalColumnGroup.prototype.setExpanded = function (expanded) {\n this.expanded = expanded === undefined ? false : expanded;\n var event = {\n type: OriginalColumnGroup.EVENT_EXPANDED_CHANGED\n };\n this.localEventService.dispatchEvent(event);\n };\n OriginalColumnGroup.prototype.isExpandable = function () {\n return this.expandable;\n };\n OriginalColumnGroup.prototype.isExpanded = function () {\n return this.expanded;\n };\n OriginalColumnGroup.prototype.getGroupId = function () {\n return this.groupId;\n };\n OriginalColumnGroup.prototype.getId = function () {\n return this.getGroupId();\n };\n OriginalColumnGroup.prototype.setChildren = function (children) {\n this.children = children;\n };\n OriginalColumnGroup.prototype.getChildren = function () {\n return this.children;\n };\n OriginalColumnGroup.prototype.getColGroupDef = function () {\n return this.colGroupDef;\n };\n OriginalColumnGroup.prototype.getLeafColumns = function () {\n var result = [];\n this.addLeafColumns(result);\n return result;\n };\n OriginalColumnGroup.prototype.addLeafColumns = function (leafColumns) {\n if (!this.children) {\n return;\n }\n this.children.forEach(function (child) {\n if (child instanceof Column) {\n leafColumns.push(child);\n }\n else if (child instanceof OriginalColumnGroup) {\n child.addLeafColumns(leafColumns);\n }\n });\n };\n OriginalColumnGroup.prototype.getColumnGroupShow = function () {\n var colGroupDef = this.colGroupDef;\n if (!colGroupDef) {\n return;\n }\n return colGroupDef.columnGroupShow;\n };\n // need to check that this group has at least one col showing when both expanded and contracted.\n // if not, then we don't allow expanding and contracting on this group\n OriginalColumnGroup.prototype.setupExpandable = function () {\n var _this = this;\n this.setExpandable();\n // note - we should be removing this event listener\n this.getLeafColumns().forEach(function (col) { return col.addEventListener(Column.EVENT_VISIBLE_CHANGED, _this.onColumnVisibilityChanged.bind(_this)); });\n };\n OriginalColumnGroup.prototype.setExpandable = function () {\n if (this.isPadding()) {\n return;\n }\n // want to make sure the group doesn't disappear when it's open\n var atLeastOneShowingWhenOpen = false;\n // want to make sure the group doesn't disappear when it's closed\n var atLeastOneShowingWhenClosed = false;\n // want to make sure the group has something to show / hide\n var atLeastOneChangeable = false;\n var children = this.findChildrenRemovingPadding();\n for (var i = 0, j = children.length; i < j; i++) {\n var abstractColumn = children[i];\n if (!abstractColumn.isVisible()) {\n continue;\n }\n // if the abstractColumn is a grid generated group, there will be no colDef\n var headerGroupShow = abstractColumn.getColumnGroupShow();\n if (headerGroupShow === ColumnGroup.HEADER_GROUP_SHOW_OPEN) {\n atLeastOneShowingWhenOpen = true;\n atLeastOneChangeable = true;\n }\n else if (headerGroupShow === ColumnGroup.HEADER_GROUP_SHOW_CLOSED) {\n atLeastOneShowingWhenClosed = true;\n atLeastOneChangeable = true;\n }\n else {\n atLeastOneShowingWhenOpen = true;\n atLeastOneShowingWhenClosed = true;\n }\n }\n var expandable = atLeastOneShowingWhenOpen && atLeastOneShowingWhenClosed && atLeastOneChangeable;\n if (this.expandable !== expandable) {\n this.expandable = expandable;\n var event_1 = {\n type: OriginalColumnGroup.EVENT_EXPANDABLE_CHANGED\n };\n this.localEventService.dispatchEvent(event_1);\n }\n };\n OriginalColumnGroup.prototype.findChildrenRemovingPadding = function () {\n var res = [];\n var process = function (items) {\n items.forEach(function (item) {\n // if padding, we add this children instead of the padding\n var skipBecausePadding = item instanceof OriginalColumnGroup && item.isPadding();\n if (skipBecausePadding) {\n process(item.children);\n }\n else {\n res.push(item);\n }\n });\n };\n process(this.children);\n return res;\n };\n OriginalColumnGroup.prototype.onColumnVisibilityChanged = function () {\n this.setExpandable();\n };\n OriginalColumnGroup.prototype.addEventListener = function (eventType, listener) {\n this.localEventService.addEventListener(eventType, listener);\n };\n OriginalColumnGroup.prototype.removeEventListener = function (eventType, listener) {\n this.localEventService.removeEventListener(eventType, listener);\n };\n OriginalColumnGroup.EVENT_EXPANDED_CHANGED = 'expandedChanged';\n OriginalColumnGroup.EVENT_EXPANDABLE_CHANGED = 'expandableChanged';\n return OriginalColumnGroup;\n}());\n\n/**\n * @ag-grid-community/core - Advanced Data Grid / Data Table supporting Javascript / React / AngularJS / Web Components\n * @version v25.1.0\n * @link http://www.ag-grid.com/\n * @license MIT\n */\nvar DefaultColumnTypes = {\n numericColumn: {\n headerClass: 'ag-right-aligned-header',\n cellClass: 'ag-right-aligned-cell'\n },\n rightAligned: {\n headerClass: 'ag-right-aligned-header',\n cellClass: 'ag-right-aligned-cell'\n }\n};\n\n/**\n * @ag-grid-community/core - Advanced Data Grid / Data Table supporting Javascript / React / AngularJS / Web Components\n * @version v25.1.0\n * @link http://www.ag-grid.com/\n * @license MIT\n */\nvar AG_GRID_STOP_PROPAGATION = '__ag_Grid_Stop_Propagation';\nvar PASSIVE_EVENTS = ['touchstart', 'touchend', 'touchmove', 'touchcancel'];\nvar supports = {};\n/**\n * a user once raised an issue - they said that when you opened a popup (eg context menu)\n * and then clicked on a selection checkbox, the popup wasn't closed. this is because the\n * popup listens for clicks on the body, however ag-grid WAS stopping propagation on the\n * checkbox clicks (so the rows didn't pick them up as row selection selection clicks).\n * to get around this, we have a pattern to stop propagation for the purposes of AG Grid,\n * but we still let the event pass back to the body.\n * @param {Event} event\n */\nfunction stopPropagationForAgGrid(event) {\n event[AG_GRID_STOP_PROPAGATION] = true;\n}\nfunction isStopPropagationForAgGrid(event) {\n return event[AG_GRID_STOP_PROPAGATION] === true;\n}\nvar isEventSupported = (function () {\n var tags = {\n select: 'input',\n change: 'input',\n submit: 'form',\n reset: 'form',\n error: 'img',\n load: 'img',\n abort: 'img'\n };\n var eventChecker = function (eventName) {\n if (typeof supports[eventName] === 'boolean') {\n return supports[eventName];\n }\n var el = document.createElement(tags[eventName] || 'div');\n eventName = 'on' + eventName;\n var isSupported = (eventName in el);\n if (!isSupported) {\n el.setAttribute(eventName, 'return;');\n isSupported = typeof el[eventName] == 'function';\n }\n return supports[eventName] = isSupported;\n };\n return eventChecker;\n})();\nfunction getComponentForEvent(gridOptionsWrapper, event, type) {\n var sourceElement = getTarget(event);\n while (sourceElement) {\n var renderedComp = gridOptionsWrapper.getDomData(sourceElement, type);\n if (renderedComp) {\n return renderedComp;\n }\n sourceElement = sourceElement.parentElement;\n }\n return null;\n}\n/**\n * @deprecated\n * Adds all type of change listeners to an element, intended to be a text field\n * @param {HTMLElement} element\n * @param {EventListener} listener\n */\nfunction addChangeListener(element, listener) {\n element.addEventListener('changed', listener);\n element.addEventListener('paste', listener);\n element.addEventListener('input', listener);\n // IE doesn't fire changed for special keys (eg delete, backspace), so need to\n // listen for this further ones\n element.addEventListener('keydown', listener);\n element.addEventListener('keyup', listener);\n}\n/**\n * srcElement is only available in IE. In all other browsers it is target\n * http://stackoverflow.com/questions/5301643/how-can-i-make-event-srcelement-work-in-firefox-and-what-does-it-mean\n * @param {Event} event\n * @returns {Element}\n */\nfunction getTarget(event) {\n var eventNoType = event;\n return eventNoType.target || eventNoType.srcElement;\n}\nfunction isElementInEventPath(element, event) {\n if (!event || !element) {\n return false;\n }\n return getEventPath(event).indexOf(element) >= 0;\n}\nfunction createEventPath(event) {\n var res = [];\n var pointer = getTarget(event);\n while (pointer) {\n res.push(pointer);\n pointer = pointer.parentElement;\n }\n return res;\n}\n/**\n * firefox doesn't have event.path set, or any alternative to it, so we hack\n * it in. this is needed as it's to late to work out the path when the item is\n * removed from the dom. used by MouseEventService, where it works out if a click\n * was from the current grid, or a detail grid (master / detail).\n * @param {Event} event\n */\nfunction addAgGridEventPath(event) {\n event.__agGridEventPath = getEventPath(event);\n}\n/**\n * Gets the path for an Event.\n * https://stackoverflow.com/questions/39245488/event-path-undefined-with-firefox-and-vue-js\n * https://developer.mozilla.org/en-US/docs/Web/API/Event\n * @param {Event} event\n * @returns {EventTarget[]}\n */\nfunction getEventPath(event) {\n var eventNoType = event;\n if (eventNoType.deepPath) {\n // IE supports deep path\n return eventNoType.deepPath();\n }\n if (eventNoType.path) {\n // Chrome supports path\n return eventNoType.path;\n }\n if (eventNoType.composedPath) {\n // Firefox supports composePath\n return eventNoType.composedPath();\n }\n if (eventNoType.__agGridEventPath) {\n // Firefox supports composePath\n return eventNoType.__agGridEventPath;\n }\n // and finally, if none of the above worked,\n // we create the path ourselves\n return createEventPath(event);\n}\nfunction addSafePassiveEventListener(frameworkOverrides, eElement, event, listener) {\n var isPassive = includes(PASSIVE_EVENTS, event);\n var options = isPassive ? { passive: true } : undefined;\n // this check is here for certain scenarios where I believe the user must be destroying\n // the grid somehow but continuing for it to be used\n if (frameworkOverrides && frameworkOverrides.addEventListener) {\n frameworkOverrides.addEventListener(eElement, event, listener, options);\n }\n}\n\nvar EventUtils = /*#__PURE__*/Object.freeze({\n __proto__: null,\n stopPropagationForAgGrid: stopPropagationForAgGrid,\n isStopPropagationForAgGrid: isStopPropagationForAgGrid,\n isEventSupported: isEventSupported,\n getComponentForEvent: getComponentForEvent,\n addChangeListener: addChangeListener,\n getTarget: getTarget,\n isElementInEventPath: isElementInEventPath,\n createEventPath: createEventPath,\n addAgGridEventPath: addAgGridEventPath,\n getEventPath: getEventPath,\n addSafePassiveEventListener: addSafePassiveEventListener\n});\n\n/**\n * @ag-grid-community/core - Advanced Data Grid / Data Table supporting Javascript / React / AngularJS / Web Components\n * @version v25.1.0\n * @link http://www.ag-grid.com/\n * @license MIT\n */\nvar __decorate$3 = (undefined && undefined.__decorate) || function (decorators, target, key, desc) {\n var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d;\n if (typeof Reflect === \"object\" && typeof Reflect.decorate === \"function\") r = Reflect.decorate(decorators, target, key, desc);\n else for (var i = decorators.length - 1; i >= 0; i--) if (d = decorators[i]) r = (c < 3 ? d(r) : c > 3 ? d(target, key, r) : d(target, key)) || r;\n return c > 3 && r && Object.defineProperty(target, key, r), r;\n};\nvar BeanStub = /** @class */ (function () {\n function BeanStub() {\n var _this = this;\n this.destroyFunctions = [];\n this.destroyed = false;\n // for vue 3 - prevents Vue from trying to make this (and obviously any sub classes) from being reactive\n // prevents vue from creating proxies for created objects and prevents identity related issues\n this.__v_skip = true;\n this.getContext = function () { return _this.context; };\n this.isAlive = function () { return !_this.destroyed; };\n }\n // this was a test constructor niall built, when active, it prints after 5 seconds all beans/components that are\n // not destroyed. to use, create a new grid, then api.destroy() before 5 seconds. then anything that gets printed\n // points to a bean or component that was not properly disposed of.\n // constructor() {\n // setTimeout(()=> {\n // if (this.isAlive()) {\n // let prototype: any = Object.getPrototypeOf(this);\n // const constructor: any = prototype.constructor;\n // const constructorString = constructor.toString();\n // const beanName = constructorString.substring(9, constructorString.indexOf(\"(\"));\n // console.log('is alive ' + beanName);\n // }\n // }, 5000);\n // }\n // CellComp and GridComp and override this because they get the FrameworkOverrides from the Beans bean\n BeanStub.prototype.getFrameworkOverrides = function () {\n return this.frameworkOverrides;\n };\n BeanStub.prototype.destroy = function () {\n // let prototype: any = Object.getPrototypeOf(this);\n // const constructor: any = prototype.constructor;\n // const constructorString = constructor.toString();\n // const beanName = constructorString.substring(9, constructorString.indexOf(\"(\"));\n this.destroyFunctions.forEach(function (func) { return func(); });\n this.destroyFunctions.length = 0;\n this.destroyed = true;\n this.dispatchEvent({ type: BeanStub.EVENT_DESTROYED });\n };\n BeanStub.prototype.addEventListener = function (eventType, listener) {\n if (!this.localEventService) {\n this.localEventService = new EventService();\n }\n this.localEventService.addEventListener(eventType, listener);\n };\n BeanStub.prototype.removeEventListener = function (eventType, listener) {\n if (this.localEventService) {\n this.localEventService.removeEventListener(eventType, listener);\n }\n };\n BeanStub.prototype.dispatchEventAsync = function (event) {\n var _this = this;\n window.setTimeout(function () { return _this.dispatchEvent(event); }, 0);\n };\n BeanStub.prototype.dispatchEvent = function (event) {\n if (this.localEventService) {\n this.localEventService.dispatchEvent(event);\n }\n };\n BeanStub.prototype.addManagedListener = function (object, event, listener) {\n var _this = this;\n if (this.destroyed) {\n return;\n }\n if (object instanceof HTMLElement) {\n addSafePassiveEventListener(this.getFrameworkOverrides(), object, event, listener);\n }\n else {\n object.addEventListener(event, listener);\n }\n var destroyFunc = function () {\n object.removeEventListener(event, listener);\n _this.destroyFunctions = _this.destroyFunctions.filter(function (fn) { return fn !== destroyFunc; });\n return null;\n };\n this.destroyFunctions.push(destroyFunc);\n return destroyFunc;\n };\n BeanStub.prototype.addDestroyFunc = function (func) {\n // if we are already destroyed, we execute the func now\n if (this.isAlive()) {\n this.destroyFunctions.push(func);\n }\n else {\n func();\n }\n };\n BeanStub.prototype.createManagedBean = function (bean, context) {\n var res = this.createBean(bean, context);\n this.addDestroyFunc(this.destroyBean.bind(this, bean, context));\n return res;\n };\n BeanStub.prototype.createBean = function (bean, context, afterPreCreateCallback) {\n return (context || this.getContext()).createBean(bean, afterPreCreateCallback);\n };\n BeanStub.prototype.destroyBean = function (bean, context) {\n return (context || this.getContext()).destroyBean(bean);\n };\n BeanStub.prototype.destroyBeans = function (beans, context) {\n var _this = this;\n if (beans) {\n forEach(beans, function (bean) { return _this.destroyBean(bean, context); });\n }\n return [];\n };\n BeanStub.EVENT_DESTROYED = 'destroyed';\n __decorate$3([\n Autowired('frameworkOverrides')\n ], BeanStub.prototype, \"frameworkOverrides\", void 0);\n __decorate$3([\n Autowired('context')\n ], BeanStub.prototype, \"context\", void 0);\n __decorate$3([\n Autowired('eventService')\n ], BeanStub.prototype, \"eventService\", void 0);\n __decorate$3([\n Autowired('gridOptionsWrapper')\n ], BeanStub.prototype, \"gridOptionsWrapper\", void 0);\n __decorate$3([\n PreDestroy\n ], BeanStub.prototype, \"destroy\", null);\n return BeanStub;\n}());\n\n/**\n * @ag-grid-community/core - Advanced Data Grid / Data Table supporting Javascript / React / AngularJS / Web Components\n * @version v25.1.0\n * @link http://www.ag-grid.com/\n * @license MIT\n */\nvar __extends = (undefined && undefined.__extends) || (function () {\n var extendStatics = function (d, b) {\n extendStatics = Object.setPrototypeOf ||\n ({ __proto__: [] } instanceof Array && function (d, b) { d.__proto__ = b; }) ||\n function (d, b) { for (var p in b) if (b.hasOwnProperty(p)) d[p] = b[p]; };\n return extendStatics(d, b);\n };\n return function (d, b) {\n extendStatics(d, b);\n function __() { this.constructor = d; }\n d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __());\n };\n})();\nvar __decorate$4 = (undefined && undefined.__decorate) || function (decorators, target, key, desc) {\n var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d;\n if (typeof Reflect === \"object\" && typeof Reflect.decorate === \"function\") r = Reflect.decorate(decorators, target, key, desc);\n else for (var i = decorators.length - 1; i >= 0; i--) if (d = decorators[i]) r = (c < 3 ? d(r) : c > 3 ? d(target, key, r) : d(target, key)) || r;\n return c > 3 && r && Object.defineProperty(target, key, r), r;\n};\nvar __param$1 = (undefined && undefined.__param) || function (paramIndex, decorator) {\n return function (target, key) { decorator(target, key, paramIndex); }\n};\n// takes ColDefs and ColGroupDefs and turns them into Columns and OriginalGroups\nvar ColumnFactory = /** @class */ (function (_super) {\n __extends(ColumnFactory, _super);\n function ColumnFactory() {\n return _super !== null && _super.apply(this, arguments) || this;\n }\n ColumnFactory.prototype.setBeans = function (loggerFactory) {\n this.logger = loggerFactory.create('ColumnFactory');\n };\n ColumnFactory.prototype.createColumnTree = function (defs, primaryColumns, existingTree) {\n // column key creator dishes out unique column id's in a deterministic way,\n // so if we have two grids (that could be master/slave) with same column definitions,\n // then this ensures the two grids use identical id's.\n var columnKeyCreator = new ColumnKeyCreator();\n var _a = this.extractExistingTreeData(existingTree), existingCols = _a.existingCols, existingGroups = _a.existingGroups, existingColKeys = _a.existingColKeys;\n columnKeyCreator.addExistingKeys(existingColKeys);\n // create am unbalanced tree that maps the provided definitions\n var unbalancedTree = this.recursivelyCreateColumns(defs, 0, primaryColumns, existingCols, columnKeyCreator, existingGroups);\n var treeDept = this.findMaxDept(unbalancedTree, 0);\n this.logger.log('Number of levels for grouped columns is ' + treeDept);\n var columnTree = this.balanceColumnTree(unbalancedTree, 0, treeDept, columnKeyCreator);\n var deptFirstCallback = function (child, parent) {\n if (child instanceof OriginalColumnGroup) {\n child.setupExpandable();\n }\n // we set the original parents at the end, rather than when we go along, as balancing the tree\n // adds extra levels into the tree. so we can only set parents when balancing is done.\n child.setOriginalParent(parent);\n };\n this.columnUtils.depthFirstOriginalTreeSearch(null, columnTree, deptFirstCallback);\n return {\n columnTree: columnTree,\n treeDept: treeDept\n };\n };\n ColumnFactory.prototype.extractExistingTreeData = function (existingTree) {\n var existingCols = [];\n var existingGroups = [];\n var existingColKeys = [];\n if (existingTree) {\n this.columnUtils.depthFirstOriginalTreeSearch(null, existingTree, function (item) {\n if (item instanceof OriginalColumnGroup) {\n var group = item;\n existingGroups.push(group);\n }\n else {\n var col = item;\n existingColKeys.push(col.getId());\n existingCols.push(col);\n }\n });\n }\n return { existingCols: existingCols, existingGroups: existingGroups, existingColKeys: existingColKeys };\n };\n ColumnFactory.prototype.createForAutoGroups = function (autoGroupCols, gridBalancedTree) {\n var _this = this;\n var autoColBalancedTree = [];\n autoGroupCols.forEach(function (col) {\n var fakeTreeItem = _this.createAutoGroupTreeItem(gridBalancedTree, col);\n autoColBalancedTree.push(fakeTreeItem);\n });\n return autoColBalancedTree;\n };\n ColumnFactory.prototype.createAutoGroupTreeItem = function (balancedColumnTree, column) {\n var dept = this.findDepth(balancedColumnTree);\n // at the end, this will be the top of the tree item.\n var nextChild = column;\n for (var i = dept - 1; i >= 0; i--) {\n var autoGroup = new OriginalColumnGroup(null, \"FAKE_PATH_\" + column.getId() + \"}_\" + i, true, i);\n this.context.createBean(autoGroup);\n autoGroup.setChildren([nextChild]);\n nextChild.setOriginalParent(autoGroup);\n nextChild = autoGroup;\n }\n // at this point, the nextChild is the top most item in the tree\n return nextChild;\n };\n ColumnFactory.prototype.findDepth = function (balancedColumnTree) {\n var dept = 0;\n var pointer = balancedColumnTree;\n while (pointer && pointer[0] && pointer[0] instanceof OriginalColumnGroup) {\n dept++;\n pointer = pointer[0].getChildren();\n }\n return dept;\n };\n ColumnFactory.prototype.balanceColumnTree = function (unbalancedTree, currentDept, columnDept, columnKeyCreator) {\n var result = [];\n // go through each child, for groups, recurse a level deeper,\n // for columns we need to pad\n for (var i = 0; i < unbalancedTree.length; i++) {\n var child = unbalancedTree[i];\n if (child instanceof OriginalColumnGroup) {\n // child is a group, all we do is go to the next level of recursion\n var originalGroup = child;\n var newChildren = this.balanceColumnTree(originalGroup.getChildren(), currentDept + 1, columnDept, columnKeyCreator);\n originalGroup.setChildren(newChildren);\n result.push(originalGroup);\n }\n else {\n // child is a column - so here we add in the padded column groups if needed\n var firstPaddedGroup = void 0;\n var currentPaddedGroup = void 0;\n // this for loop will NOT run any loops if no padded column groups are needed\n for (var j = columnDept - 1; j >= currentDept; j--) {\n var newColId = columnKeyCreator.getUniqueKey(null, null);\n var colGroupDefMerged = this.createMergedColGroupDef(null);\n var paddedGroup = new OriginalColumnGroup(colGroupDefMerged, newColId, true, currentDept);\n this.context.createBean(paddedGroup);\n if (currentPaddedGroup) {\n currentPaddedGroup.setChildren([paddedGroup]);\n }\n currentPaddedGroup = paddedGroup;\n if (!firstPaddedGroup) {\n firstPaddedGroup = currentPaddedGroup;\n }\n }\n // likewise this if statement will not run if no padded groups\n if (firstPaddedGroup && currentPaddedGroup) {\n result.push(firstPaddedGroup);\n var hasGroups = unbalancedTree.some(function (leaf) { return leaf instanceof OriginalColumnGroup; });\n if (hasGroups) {\n currentPaddedGroup.setChildren([child]);\n continue;\n }\n else {\n currentPaddedGroup.setChildren(unbalancedTree);\n break;\n }\n }\n result.push(child);\n }\n }\n return result;\n };\n ColumnFactory.prototype.findMaxDept = function (treeChildren, dept) {\n var maxDeptThisLevel = dept;\n for (var i = 0; i < treeChildren.length; i++) {\n var abstractColumn = treeChildren[i];\n if (abstractColumn instanceof OriginalColumnGroup) {\n var originalGroup = abstractColumn;\n var newDept = this.findMaxDept(originalGroup.getChildren(), dept + 1);\n if (maxDeptThisLevel < newDept) {\n maxDeptThisLevel = newDept;\n }\n }\n }\n return maxDeptThisLevel;\n };\n ColumnFactory.prototype.recursivelyCreateColumns = function (defs, level, primaryColumns, existingColsCopy, columnKeyCreator, existingGroups) {\n var _this = this;\n var result = [];\n if (!defs) {\n return result;\n }\n defs.forEach(function (def) {\n var newGroupOrColumn;\n if (_this.isColumnGroup(def)) {\n newGroupOrColumn = _this.createColumnGroup(primaryColumns, def, level, existingColsCopy, columnKeyCreator, existingGroups);\n }\n else {\n newGroupOrColumn = _this.createColumn(primaryColumns, def, existingColsCopy, columnKeyCreator);\n }\n result.push(newGroupOrColumn);\n });\n return result;\n };\n ColumnFactory.prototype.createColumnGroup = function (primaryColumns, colGroupDef, level, existingColumns, columnKeyCreator, existingGroups) {\n var colGroupDefMerged = this.createMergedColGroupDef(colGroupDef);\n var groupId = columnKeyCreator.getUniqueKey(colGroupDefMerged.groupId || null, null);\n var originalGroup = new OriginalColumnGroup(colGroupDefMerged, groupId, false, level);\n this.context.createBean(originalGroup);\n var existingGroup = this.findExistingGroup(colGroupDef, existingGroups);\n if (existingGroup && existingGroup.isExpanded()) {\n originalGroup.setExpanded(true);\n }\n var children = this.recursivelyCreateColumns(colGroupDefMerged.children, level + 1, primaryColumns, existingColumns, columnKeyCreator, existingGroups);\n originalGroup.setChildren(children);\n return originalGroup;\n };\n ColumnFactory.prototype.createMergedColGroupDef = function (colGroupDef) {\n var colGroupDefMerged = {};\n assign(colGroupDefMerged, this.gridOptionsWrapper.getDefaultColGroupDef());\n assign(colGroupDefMerged, colGroupDef);\n this.checkForDeprecatedItems(colGroupDefMerged);\n return colGroupDefMerged;\n };\n ColumnFactory.prototype.createColumn = function (primaryColumns, colDef, existingColsCopy, columnKeyCreator) {\n var colDefMerged = this.mergeColDefs(colDef);\n this.checkForDeprecatedItems(colDefMerged);\n // see if column already exists\n var column = this.findExistingColumn(colDef, existingColsCopy);\n if (!column) {\n // no existing column, need to create one\n var colId = columnKeyCreator.getUniqueKey(colDefMerged.colId, colDefMerged.field);\n column = new Column(colDefMerged, colDef, colId, primaryColumns);\n this.context.createBean(column);\n }\n else {\n column.setColDef(colDefMerged, colDef);\n this.applyColumnState(column, colDefMerged);\n }\n return column;\n };\n ColumnFactory.prototype.applyColumnState = function (column, colDef) {\n // flex\n var flex = attrToNumber(colDef.flex);\n if (flex !== undefined) {\n column.setFlex(flex);\n }\n // width - we only set width if column is not flexing\n var noFlexThisCol = column.getFlex() <= 0;\n if (noFlexThisCol) {\n // both null and undefined means we skip, as it's not possible to 'clear' width (a column must have a width)\n var width = attrToNumber(colDef.width);\n if (width != null) {\n column.setActualWidth(width);\n }\n }\n // sort - anything but undefined will set sort, thus null or empty string will clear the sort\n if (colDef.sort !== undefined) {\n if (colDef.sort == Constants.SORT_ASC || colDef.sort == Constants.SORT_DESC) {\n column.setSort(colDef.sort);\n }\n else {\n column.setSort(undefined);\n }\n }\n // sorted at - anything but undefined, thus null will clear the sortIndex\n var sortIndex = attrToNumber(colDef.sortIndex);\n if (sortIndex !== undefined) {\n column.setSortIndex(sortIndex);\n }\n // hide - anything but undefined, thus null will clear the hide\n var hide = attrToBoolean(colDef.hide);\n if (hide !== undefined) {\n column.setVisible(!hide);\n }\n // pinned - anything but undefined, thus null or empty string will remove pinned\n if (colDef.pinned !== undefined) {\n column.setPinned(colDef.pinned);\n }\n };\n ColumnFactory.prototype.findExistingColumn = function (newColDef, existingColsCopy) {\n var res = find(existingColsCopy, function (existingCol) {\n var existingColDef = existingCol.getUserProvidedColDef();\n if (!existingColDef) {\n return false;\n }\n var newHasId = newColDef.colId != null;\n var newHasField = newColDef.field != null;\n if (newHasId) {\n return existingCol.getId() === newColDef.colId;\n }\n if (newHasField) {\n return existingColDef.field === newColDef.field;\n }\n // if no id or field present, then try object equivalence.\n if (existingColDef === newColDef) {\n return true;\n }\n return false;\n });\n // make sure we remove, so if user provided duplicate id, then we don't have more than\n // one column instance for colDef with common id\n if (existingColsCopy && res) {\n removeFromArray(existingColsCopy, res);\n }\n return res;\n };\n ColumnFactory.prototype.findExistingGroup = function (newGroupDef, existingGroups) {\n var res = find(existingGroups, function (existingGroup) {\n var existingDef = existingGroup.getColGroupDef();\n if (!existingDef) {\n return false;\n }\n var newHasId = newGroupDef.groupId != null;\n if (newHasId) {\n return existingGroup.getId() === newGroupDef.groupId;\n }\n return false;\n });\n // make sure we remove, so if user provided duplicate id, then we don't have more than\n // one column instance for colDef with common id\n if (res) {\n removeFromArray(existingGroups, res);\n }\n return res;\n };\n ColumnFactory.prototype.mergeColDefs = function (colDef) {\n // start with empty merged definition\n var colDefMerged = {};\n // merge properties from default column definitions\n var defaultColDef = this.gridOptionsWrapper.getDefaultColDef();\n mergeDeep(colDefMerged, defaultColDef, true, true);\n // merge properties from column type properties\n var columnType = colDef.type;\n if (!columnType) {\n columnType = defaultColDef && defaultColDef.type;\n }\n // if type of both colDef and defaultColDef, then colDef gets preference\n if (columnType) {\n this.assignColumnTypes(columnType, colDefMerged);\n }\n // merge properties from column definitions\n mergeDeep(colDefMerged, colDef, true, true);\n return colDefMerged;\n };\n ColumnFactory.prototype.assignColumnTypes = function (type, colDefMerged) {\n var typeKeys = [];\n if (type instanceof Array) {\n var invalidArray = type.some(function (a) { return typeof a !== 'string'; });\n if (invalidArray) {\n console.warn(\"ag-grid: if colDef.type is supplied an array it should be of type 'string[]'\");\n }\n else {\n typeKeys = type;\n }\n }\n else if (typeof type === 'string') {\n typeKeys = type.split(',');\n }\n else {\n console.warn(\"ag-grid: colDef.type should be of type 'string' | 'string[]'\");\n return;\n }\n // merge user defined with default column types\n var allColumnTypes = assign({}, DefaultColumnTypes);\n var userTypes = this.gridOptionsWrapper.getColumnTypes() || {};\n iterateObject(userTypes, function (key, value) {\n if (key in allColumnTypes) {\n console.warn(\"AG Grid: the column type '\" + key + \"' is a default column type and cannot be overridden.\");\n }\n else {\n allColumnTypes[key] = value;\n }\n });\n typeKeys.forEach(function (t) {\n var typeColDef = allColumnTypes[t.trim()];\n if (typeColDef) {\n mergeDeep(colDefMerged, typeColDef, true, true);\n }\n else {\n console.warn(\"ag-grid: colDef.type '\" + t + \"' does not correspond to defined gridOptions.columnTypes\");\n }\n });\n };\n ColumnFactory.prototype.checkForDeprecatedItems = function (colDef) {\n if (colDef) {\n var colDefNoType = colDef; // take out the type, so we can access attributes not defined in the type\n if (colDefNoType.group !== undefined) {\n console.warn('ag-grid: colDef.group is invalid, please check documentation on how to do grouping as it changed in version 3');\n }\n if (colDefNoType.headerGroup !== undefined) {\n console.warn('ag-grid: colDef.headerGroup is invalid, please check documentation on how to do grouping as it changed in version 3');\n }\n if (colDefNoType.headerGroupShow !== undefined) {\n console.warn('ag-grid: colDef.headerGroupShow is invalid, should be columnGroupShow, please check documentation on how to do grouping as it changed in version 3');\n }\n if (colDefNoType.suppressRowGroup !== undefined) {\n console.warn('ag-grid: colDef.suppressRowGroup is deprecated, please use colDef.type instead');\n }\n if (colDefNoType.suppressAggregation !== undefined) {\n console.warn('ag-grid: colDef.suppressAggregation is deprecated, please use colDef.type instead');\n }\n if (colDefNoType.suppressRowGroup || colDefNoType.suppressAggregation) {\n console.warn('ag-grid: colDef.suppressAggregation and colDef.suppressRowGroup are deprecated, use allowRowGroup, allowPivot and allowValue instead');\n }\n if (colDefNoType.displayName) {\n console.warn(\"ag-grid: Found displayName \" + colDefNoType.displayName + \", please use headerName instead, displayName is deprecated.\");\n colDefNoType.headerName = colDefNoType.displayName;\n }\n }\n };\n // if object has children, we assume it's a group\n ColumnFactory.prototype.isColumnGroup = function (abstractColDef) {\n return abstractColDef.children !== undefined;\n };\n __decorate$4([\n Autowired('columnUtils')\n ], ColumnFactory.prototype, \"columnUtils\", void 0);\n __decorate$4([\n __param$1(0, Qualifier('loggerFactory'))\n ], ColumnFactory.prototype, \"setBeans\", null);\n ColumnFactory = __decorate$4([\n Bean('columnFactory')\n ], ColumnFactory);\n return ColumnFactory;\n}(BeanStub));\n\n/**\n * @ag-grid-community/core - Advanced Data Grid / Data Table supporting Javascript / React / AngularJS / Web Components\n * @version v25.1.0\n * @link http://www.ag-grid.com/\n * @license MIT\n */\nvar Events = /** @class */ (function () {\n function Events() {\n }\n /** Everything has changed with the columns. Either complete new set of columns set, or user called setState() */\n /** @deprecated - grid no longer uses this, and setSate() also fires individual events */\n Events.EVENT_COLUMN_EVERYTHING_CHANGED = 'columnEverythingChanged';\n /** User has set in new columns. */\n Events.EVENT_NEW_COLUMNS_LOADED = 'newColumnsLoaded';\n /** The pivot mode flag was changed */\n Events.EVENT_COLUMN_PIVOT_MODE_CHANGED = 'columnPivotModeChanged';\n /** A row group column was added, removed or order changed. */\n Events.EVENT_COLUMN_ROW_GROUP_CHANGED = 'columnRowGroupChanged';\n /** expandAll / collapseAll was called from the api. */\n Events.EVENT_EXPAND_COLLAPSE_ALL = 'expandOrCollapseAll';\n /** A pivot column was added, removed or order changed. */\n Events.EVENT_COLUMN_PIVOT_CHANGED = 'columnPivotChanged';\n /** The list of grid columns has changed. */\n Events.EVENT_GRID_COLUMNS_CHANGED = 'gridColumnsChanged';\n /** A value column was added, removed or agg function was changed. */\n Events.EVENT_COLUMN_VALUE_CHANGED = 'columnValueChanged';\n /** A column was moved */\n Events.EVENT_COLUMN_MOVED = 'columnMoved';\n /** One or more columns was shown / hidden */\n Events.EVENT_COLUMN_VISIBLE = 'columnVisible';\n /** One or more columns was pinned / unpinned*/\n Events.EVENT_COLUMN_PINNED = 'columnPinned';\n /** A column group was opened / closed */\n Events.EVENT_COLUMN_GROUP_OPENED = 'columnGroupOpened';\n /** One or more columns was resized. If just one, the column in the event is set. */\n Events.EVENT_COLUMN_RESIZED = 'columnResized';\n /** The list of displayed columns has changed, can result from columns open / close, column move, pivot, group, etc */\n Events.EVENT_DISPLAYED_COLUMNS_CHANGED = 'displayedColumnsChanged';\n /** The list of virtual columns has changed, results from viewport changing */\n Events.EVENT_VIRTUAL_COLUMNS_CHANGED = 'virtualColumnsChanged';\n /** Async Transactions Executed */\n Events.EVENT_ASYNC_TRANSACTIONS_FLUSHED = 'asyncTransactionsFlushed';\n /** A row group was opened / closed */\n Events.EVENT_ROW_GROUP_OPENED = 'rowGroupOpened';\n /** The client has set new data into the grid */\n Events.EVENT_ROW_DATA_CHANGED = 'rowDataChanged';\n /** The client has updated data for the grid */\n Events.EVENT_ROW_DATA_UPDATED = 'rowDataUpdated';\n /** The client has set new floating data into the grid */\n Events.EVENT_PINNED_ROW_DATA_CHANGED = 'pinnedRowDataChanged';\n /** Range selection has changed */\n Events.EVENT_RANGE_SELECTION_CHANGED = 'rangeSelectionChanged';\n /** Chart was created */\n Events.EVENT_CHART_CREATED = 'chartCreated';\n /** Chart Range selection has changed */\n Events.EVENT_CHART_RANGE_SELECTION_CHANGED = 'chartRangeSelectionChanged';\n /** Chart Options have changed */\n Events.EVENT_CHART_OPTIONS_CHANGED = 'chartOptionsChanged';\n /** Chart was destroyed */\n Events.EVENT_CHART_DESTROYED = 'chartDestroyed';\n /** For when the tool panel is shown / hidden */\n Events.EVENT_TOOL_PANEL_VISIBLE_CHANGED = 'toolPanelVisibleChanged';\n /** Model was updated - grid updates the drawn rows when this happens */\n Events.EVENT_MODEL_UPDATED = 'modelUpdated';\n Events.EVENT_PASTE_START = 'pasteStart';\n Events.EVENT_PASTE_END = 'pasteEnd';\n Events.EVENT_FILL_START = 'fillStart';\n Events.EVENT_FILL_END = 'fillEnd';\n Events.EVENT_CELL_CLICKED = 'cellClicked';\n Events.EVENT_CELL_DOUBLE_CLICKED = 'cellDoubleClicked';\n Events.EVENT_CELL_MOUSE_DOWN = 'cellMouseDown';\n Events.EVENT_CELL_CONTEXT_MENU = 'cellContextMenu';\n Events.EVENT_CELL_VALUE_CHANGED = 'cellValueChanged';\n Events.EVENT_ROW_VALUE_CHANGED = 'rowValueChanged';\n Events.EVENT_CELL_FOCUSED = 'cellFocused';\n Events.EVENT_ROW_SELECTED = 'rowSelected';\n Events.EVENT_SELECTION_CHANGED = 'selectionChanged';\n Events.EVENT_CELL_KEY_DOWN = 'cellKeyDown';\n Events.EVENT_CELL_KEY_PRESS = 'cellKeyPress';\n Events.EVENT_CELL_MOUSE_OVER = 'cellMouseOver';\n Events.EVENT_CELL_MOUSE_OUT = 'cellMouseOut';\n /** 2 events for filtering. The grid LISTENS for filterChanged and afterFilterChanged */\n Events.EVENT_FILTER_CHANGED = 'filterChanged';\n /** Filter was change but not applied. Only useful if apply buttons are used in filters. */\n Events.EVENT_FILTER_MODIFIED = 'filterModified';\n Events.EVENT_FILTER_OPENED = 'filterOpened';\n Events.EVENT_SORT_CHANGED = 'sortChanged';\n /** A row was removed from the dom, for any reason. Use to clean up resources (if any) used by the row. */\n Events.EVENT_VIRTUAL_ROW_REMOVED = 'virtualRowRemoved';\n Events.EVENT_ROW_CLICKED = 'rowClicked';\n Events.EVENT_ROW_DOUBLE_CLICKED = 'rowDoubleClicked';\n /** Gets called once after the grid has finished initialising. */\n Events.EVENT_GRID_READY = 'gridReady';\n /** Width of height of the main grid div has changed. Grid listens for this and does layout of grid if it's\n * changed, so always filling the space it was given. */\n Events.EVENT_GRID_SIZE_CHANGED = 'gridSizeChanged';\n /** The indexes of the rows rendered has changed, eg user has scrolled to a new vertical position. */\n Events.EVENT_VIEWPORT_CHANGED = 'viewportChanged';\n /* The width of the scrollbar has been calculated */\n Events.EVENT_SCROLLBAR_WIDTH_CHANGED = 'scrollbarWidthChanged';\n /** Rows were rendered for the first time (ie on async data load). */\n Events.EVENT_FIRST_DATA_RENDERED = 'firstDataRendered';\n /** A column drag has started, either resizing a column or moving a column. */\n Events.EVENT_DRAG_STARTED = 'dragStarted';\n /** A column drag has stopped */\n Events.EVENT_DRAG_STOPPED = 'dragStopped';\n Events.EVENT_CHECKBOX_CHANGED = 'checkboxChanged';\n Events.EVENT_ROW_EDITING_STARTED = 'rowEditingStarted';\n Events.EVENT_ROW_EDITING_STOPPED = 'rowEditingStopped';\n Events.EVENT_CELL_EDITING_STARTED = 'cellEditingStarted';\n Events.EVENT_CELL_EDITING_STOPPED = 'cellEditingStopped';\n /** Main body of grid has scrolled, either horizontally or vertically */\n Events.EVENT_BODY_SCROLL = 'bodyScroll';\n Events.EVENT_ANIMATION_QUEUE_EMPTY = 'animationQueueEmpty';\n Events.EVENT_HEIGHT_SCALE_CHANGED = 'heightScaleChanged';\n /** The displayed page for pagination has changed. For example the data was filtered or sorted,\n * or the user has moved to a different page. */\n Events.EVENT_PAGINATION_CHANGED = 'paginationChanged';\n /** Only used by React, Angular 2+, Web Components and VueJS AG Grid components\n * (not used if doing plain JavaScript or Angular 1.x). If the grid receives changes due\n * to bound properties, this event fires after the grid has finished processing the change. */\n Events.EVENT_COMPONENT_STATE_CHANGED = 'componentStateChanged';\n /** All items from here down are used internally by the grid, not intended for external use. */\n // not documented, either experimental, or we just don't want users using an depending on them\n Events.EVENT_BODY_HEIGHT_CHANGED = 'bodyHeightChanged';\n Events.EVENT_DISPLAYED_COLUMNS_WIDTH_CHANGED = 'displayedColumnsWidthChanged';\n Events.EVENT_SCROLL_VISIBILITY_CHANGED = 'scrollVisibilityChanged';\n Events.EVENT_COLUMN_HOVER_CHANGED = 'columnHoverChanged';\n Events.EVENT_FLASH_CELLS = 'flashCells';\n Events.EVENT_PAGINATION_PIXEL_OFFSET_CHANGED = 'paginationPixelOffsetChanged';\n Events.EVENT_ROW_DRAG_ENTER = 'rowDragEnter';\n Events.EVENT_ROW_DRAG_MOVE = 'rowDragMove';\n Events.EVENT_ROW_DRAG_LEAVE = 'rowDragLeave';\n Events.EVENT_ROW_DRAG_END = 'rowDragEnd';\n // primarily for charts\n Events.EVENT_POPUP_TO_FRONT = 'popupToFront';\n // these are used for server side group and agg - only used by CS with Viewport Row Model - intention is\n // to design these better around server side functions and then release to general public when fully working with\n // all the row models.\n Events.EVENT_COLUMN_ROW_GROUP_CHANGE_REQUEST = 'columnRowGroupChangeRequest';\n Events.EVENT_COLUMN_PIVOT_CHANGE_REQUEST = 'columnPivotChangeRequest';\n Events.EVENT_COLUMN_VALUE_CHANGE_REQUEST = 'columnValueChangeRequest';\n Events.EVENT_COLUMN_AGG_FUNC_CHANGE_REQUEST = 'columnAggFuncChangeRequest';\n Events.EVENT_KEYBOARD_FOCUS = 'keyboardFocus';\n Events.EVENT_MOUSE_FOCUS = 'mouseFocus';\n Events.EVENT_STORE_UPDATED = 'storeUpdated';\n return Events;\n}());\n\n/**\n * @ag-grid-community/core - Advanced Data Grid / Data Table supporting Javascript / React / AngularJS / Web Components\n * @version v25.1.0\n * @link http://www.ag-grid.com/\n * @license MIT\n */\n// class returns unique instance id's for columns.\n// eg, the following calls (in this order) will result in:\n//\n// getInstanceIdForKey('country') => 0\n// getInstanceIdForKey('country') => 1\n// getInstanceIdForKey('country') => 2\n// getInstanceIdForKey('country') => 3\n// getInstanceIdForKey('age') => 0\n// getInstanceIdForKey('age') => 1\n// getInstanceIdForKey('country') => 4\nvar GroupInstanceIdCreator = /** @class */ (function () {\n function GroupInstanceIdCreator() {\n // this map contains keys to numbers, so we remember what the last call was\n this.existingIds = {};\n }\n GroupInstanceIdCreator.prototype.getInstanceIdForKey = function (key) {\n var lastResult = this.existingIds[key];\n var result;\n if (typeof lastResult !== 'number') {\n // first time this key\n result = 0;\n }\n else {\n result = lastResult + 1;\n }\n this.existingIds[key] = result;\n return result;\n };\n return GroupInstanceIdCreator;\n}());\n\n/**\n * @ag-grid-community/core - Advanced Data Grid / Data Table supporting Javascript / React / AngularJS / Web Components\n * @version v25.1.0\n * @link http://www.ag-grid.com/\n * @license MIT\n */\nvar reUnescapedHtml = /[&<>\"']/g;\n/**\n * HTML Escapes.\n */\nvar HTML_ESCAPES = {\n '&': '&',\n '<': '<',\n '>': '>',\n '\"': '"',\n \"'\": '''\n};\n/**\n * It encodes any string in UTF-8 format\n * taken from https://github.com/mathiasbynens/utf8.js\n * @param {string} s\n * @returns {string}\n */\nfunction utf8_encode(s) {\n var stringFromCharCode = String.fromCharCode;\n function ucs2decode(string) {\n var output = [];\n if (!string) {\n return [];\n }\n var len = string.length;\n var counter = 0;\n var value;\n var extra;\n while (counter < len) {\n value = string.charCodeAt(counter++);\n if (value >= 0xD800 && value <= 0xDBFF && counter < len) {\n // high surrogate, and there is a next character\n extra = string.charCodeAt(counter++);\n if ((extra & 0xFC00) == 0xDC00) { // low surrogate\n output.push(((value & 0x3FF) << 10) + (extra & 0x3FF) + 0x10000);\n }\n else {\n // unmatched surrogate; only append this code unit, in case the next\n // code unit is the high surrogate of a surrogate pair\n output.push(value);\n counter--;\n }\n }\n else {\n output.push(value);\n }\n }\n return output;\n }\n function checkScalarValue(point) {\n if (point >= 0xD800 && point <= 0xDFFF) {\n throw Error('Lone surrogate U+' + point.toString(16).toUpperCase() +\n ' is not a scalar value');\n }\n }\n function createByte(point, shift) {\n return stringFromCharCode(((point >> shift) & 0x3F) | 0x80);\n }\n function encodeCodePoint(point) {\n if ((point & 0xFFFFFF80) == 0) { // 1-byte sequence\n return stringFromCharCode(point);\n }\n var symbol = '';\n if ((point & 0xFFFFF800) == 0) { // 2-byte sequence\n symbol = stringFromCharCode(((point >> 6) & 0x1F) | 0xC0);\n }\n else if ((point & 0xFFFF0000) == 0) { // 3-byte sequence\n checkScalarValue(point);\n symbol = stringFromCharCode(((point >> 12) & 0x0F) | 0xE0);\n symbol += createByte(point, 6);\n }\n else if ((point & 0xFFE00000) == 0) { // 4-byte sequence\n symbol = stringFromCharCode(((point >> 18) & 0x07) | 0xF0);\n symbol += createByte(point, 12);\n symbol += createByte(point, 6);\n }\n symbol += stringFromCharCode((point & 0x3F) | 0x80);\n return symbol;\n }\n var codePoints = ucs2decode(s);\n var length = codePoints.length;\n var index = -1;\n var codePoint;\n var byteString = '';\n while (++index < length) {\n codePoint = codePoints[index];\n byteString += encodeCodePoint(codePoint);\n }\n return byteString;\n}\n/**\n * Converts a camelCase string into hyphenated string\n * from https://gist.github.com/youssman/745578062609e8acac9f\n * @param {string} str\n * @return {string}\n */\nfunction camelCaseToHyphen(str) {\n if (str === null || str === undefined) {\n return null;\n }\n return str.replace(/([A-Z])/g, function (g) { return '-' + g[0].toLowerCase(); });\n}\n/**\n * Converts a hyphenated string into camelCase string\n * from https://stackoverflow.com/questions/6660977/convert-hyphens-to-camel-case-camelcase\n * @param {string} str\n * @return {string}\n */\nfunction hyphenToCamelCase(str) {\n if (str === null || str === undefined) {\n return null;\n }\n return str.replace(/-([a-z])/g, function (g) { return g[1].toUpperCase(); });\n}\nfunction capitalise(str) {\n return str[0].toUpperCase() + str.substr(1).toLowerCase();\n}\nfunction escapeString(toEscape) {\n return toEscape == null || !toEscape.replace ? toEscape : toEscape.replace(reUnescapedHtml, function (chr) { return HTML_ESCAPES[chr]; });\n}\n/**\n * Converts a camelCase string into regular text\n * from: https://stackoverflow.com/questions/15369566/putting-space-in-camel-case-string-using-regular-expression\n * @param {string} camelCase\n * @return {string}\n */\nfunction camelCaseToHumanText(camelCase) {\n if (!camelCase || camelCase == null) {\n return null;\n }\n var rex = /([A-Z])([A-Z])([a-z])|([a-z])([A-Z])/g;\n var words = camelCase.replace(rex, '$1$4 $2$3$5').replace('.', ' ').split(' ');\n return words.map(function (word) { return word.substring(0, 1).toUpperCase() + ((word.length > 1) ? word.substring(1, word.length) : ''); }).join(' ');\n}\nfunction startsWith(str, matchStart) {\n if (str === matchStart) {\n return true;\n }\n return str != null && str.slice(0, matchStart.length) === matchStart;\n}\n\nvar StringUtils = /*#__PURE__*/Object.freeze({\n __proto__: null,\n utf8_encode: utf8_encode,\n camelCaseToHyphen: camelCaseToHyphen,\n hyphenToCamelCase: hyphenToCamelCase,\n capitalise: capitalise,\n escapeString: escapeString,\n camelCaseToHumanText: camelCaseToHumanText,\n startsWith: startsWith\n});\n\n/**\n * @ag-grid-community/core - Advanced Data Grid / Data Table supporting Javascript / React / AngularJS / Web Components\n * @version v25.1.0\n * @link http://www.ag-grid.com/\n * @license MIT\n */\nvar __extends$1 = (undefined && undefined.__extends) || (function () {\n var extendStatics = function (d, b) {\n extendStatics = Object.setPrototypeOf ||\n ({ __proto__: [] } instanceof Array && function (d, b) { d.__proto__ = b; }) ||\n function (d, b) { for (var p in b) if (b.hasOwnProperty(p)) d[p] = b[p]; };\n return extendStatics(d, b);\n };\n return function (d, b) {\n extendStatics(d, b);\n function __() { this.constructor = d; }\n d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __());\n };\n})();\nvar __decorate$5 = (undefined && undefined.__decorate) || function (decorators, target, key, desc) {\n var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d;\n if (typeof Reflect === \"object\" && typeof Reflect.decorate === \"function\") r = Reflect.decorate(decorators, target, key, desc);\n else for (var i = decorators.length - 1; i >= 0; i--) if (d = decorators[i]) r = (c < 3 ? d(r) : c > 3 ? d(target, key, r) : d(target, key)) || r;\n return c > 3 && r && Object.defineProperty(target, key, r), r;\n};\nvar __param$2 = (undefined && undefined.__param) || function (paramIndex, decorator) {\n return function (target, key) { decorator(target, key, paramIndex); }\n};\nvar ColumnController = /** @class */ (function (_super) {\n __extends$1(ColumnController, _super);\n function ColumnController() {\n var _this = _super !== null && _super.apply(this, arguments) || this;\n // header row count, based on user provided columns\n _this.primaryHeaderRowCount = 0;\n _this.secondaryHeaderRowCount = 0;\n _this.secondaryColumnsPresent = false;\n // header row count, either above, or based on pivoting if we are pivoting\n _this.gridHeaderRowCount = 0;\n // leave level columns of the displayed trees\n _this.displayedColumnsLeft = [];\n _this.displayedColumnsRight = [];\n _this.displayedColumnsCenter = [];\n // all three lists above combined\n _this.displayedColumns = [];\n // for fast lookup, to see if a column or group is still displayed\n _this.displayedColumnsAndGroupsMap = {};\n // all columns to be rendered\n _this.viewportColumns = [];\n // all columns to be rendered in the centre\n _this.viewportColumnsCenter = [];\n _this.rowGroupColumns = [];\n _this.valueColumns = [];\n _this.pivotColumns = [];\n _this.ready = false;\n _this.autoGroupsNeedBuilding = false;\n _this.forceRecreateAutoGroups = false;\n _this.pivotMode = false;\n _this.bodyWidth = 0;\n _this.leftWidth = 0;\n _this.rightWidth = 0;\n _this.bodyWidthDirty = true;\n _this.colDefVersion = 0;\n _this.flexColsCalculatedAtLestOnce = false;\n return _this;\n }\n ColumnController.prototype.init = function () {\n this.suppressColumnVirtualisation = this.gridOptionsWrapper.isSuppressColumnVirtualisation();\n var pivotMode = this.gridOptionsWrapper.isPivotMode();\n if (this.isPivotSettingAllowed(pivotMode)) {\n this.pivotMode = pivotMode;\n }\n this.usingTreeData = this.gridOptionsWrapper.isTreeData();\n this.addManagedListener(this.gridOptionsWrapper, 'autoGroupColumnDef', this.onAutoGroupColumnDefChanged.bind(this));\n };\n ColumnController.prototype.onAutoGroupColumnDefChanged = function () {\n this.autoGroupsNeedBuilding = true;\n this.forceRecreateAutoGroups = true;\n this.updateGridColumns();\n this.updateDisplayedColumns('gridOptionsChanged');\n };\n ColumnController.prototype.getColDefVersion = function () {\n return this.colDefVersion;\n };\n ColumnController.prototype.setColumnDefs = function (columnDefs, source) {\n var _this = this;\n if (source === void 0) { source = 'api'; }\n var colsPreviouslyExisted = !!this.columnDefs;\n this.colDefVersion++;\n var raiseEventsFunc = this.compareColumnStatesAndRaiseEvents(source);\n this.columnDefs = columnDefs;\n // always invalidate cache on changing columns, as the column id's for the new columns\n // could overlap with the old id's, so the cache would return old values for new columns.\n this.valueCache.expire();\n // NOTE ==================\n // we should be destroying the existing columns and groups if they exist, for example, the original column\n // group adds a listener to the columns, it should be also removing the listeners\n this.autoGroupsNeedBuilding = true;\n var oldPrimaryColumns = this.primaryColumns;\n var oldPrimaryTree = this.primaryColumnTree;\n var balancedTreeResult = this.columnFactory.createColumnTree(columnDefs, true, oldPrimaryTree);\n this.primaryColumnTree = balancedTreeResult.columnTree;\n this.primaryHeaderRowCount = balancedTreeResult.treeDept + 1;\n this.primaryColumns = this.getColumnsFromTree(this.primaryColumnTree);\n this.primaryColumnsMap = {};\n this.primaryColumns.forEach(function (col) { return _this.primaryColumnsMap[col.getId()] = col; });\n this.extractRowGroupColumns(source, oldPrimaryColumns);\n this.extractPivotColumns(source, oldPrimaryColumns);\n this.extractValueColumns(source, oldPrimaryColumns);\n this.ready = true;\n this.updateGridColumns();\n if (colsPreviouslyExisted && this.gridColsArePrimary && this.gridOptionsWrapper.isApplyColumnDefOrder()) {\n this.orderGridColumnsLikePrimary();\n }\n this.updateDisplayedColumns(source);\n this.checkViewportColumns();\n // this event is not used by AG Grid, but left here for backwards compatibility,\n // in case applications use it\n this.dispatchEverythingChanged(source);\n raiseEventsFunc();\n this.dispatchNewColumnsLoaded();\n };\n ColumnController.prototype.dispatchNewColumnsLoaded = function () {\n var newColumnsLoadedEvent = {\n type: Events.EVENT_NEW_COLUMNS_LOADED,\n api: this.gridApi,\n columnApi: this.columnApi\n };\n this.eventService.dispatchEvent(newColumnsLoadedEvent);\n };\n // this event is legacy, no grid code listens to it. instead the grid listens to New Columns Loaded\n ColumnController.prototype.dispatchEverythingChanged = function (source) {\n if (source === void 0) { source = 'api'; }\n var eventEverythingChanged = {\n type: Events.EVENT_COLUMN_EVERYTHING_CHANGED,\n api: this.gridApi,\n columnApi: this.columnApi,\n source: source\n };\n this.eventService.dispatchEvent(eventEverythingChanged);\n };\n ColumnController.prototype.orderGridColumnsLikePrimary = function () {\n var _this = this;\n this.gridColumns.sort(function (colA, colB) {\n var primaryIndexA = _this.primaryColumns.indexOf(colA);\n var primaryIndexB = _this.primaryColumns.indexOf(colB);\n // if both cols are present in primary, then we just return the position,\n // so position is maintained.\n var indexAPresent = primaryIndexA >= 0;\n var indexBPresent = primaryIndexB >= 0;\n if (indexAPresent && indexBPresent) {\n return primaryIndexA - primaryIndexB;\n }\n if (indexAPresent) {\n // B is auto group column, so put B first\n return 1;\n }\n if (indexBPresent) {\n // A is auto group column, so put A first\n return -1;\n }\n // otherwise both A and B are auto-group columns. so we just keep the order\n // as they were already in.\n var gridIndexA = _this.gridColumns.indexOf(colA);\n var gridIndexB = _this.gridColumns.indexOf(colB);\n return gridIndexA - gridIndexB;\n });\n };\n ColumnController.prototype.isAutoRowHeightActive = function () {\n return this.autoRowHeightColumns && this.autoRowHeightColumns.length > 0;\n };\n ColumnController.prototype.getAllAutoRowHeightCols = function () {\n return this.autoRowHeightColumns;\n };\n ColumnController.prototype.setViewport = function () {\n if (this.gridOptionsWrapper.isEnableRtl()) {\n this.viewportLeft = this.bodyWidth - this.scrollPosition - this.scrollWidth;\n this.viewportRight = this.bodyWidth - this.scrollPosition;\n }\n else {\n this.viewportLeft = this.scrollPosition;\n this.viewportRight = this.scrollWidth + this.scrollPosition;\n }\n };\n // used by clipboard service, to know what columns to paste into\n ColumnController.prototype.getDisplayedColumnsStartingAt = function (column) {\n var currentColumn = column;\n var columns = [];\n while (currentColumn != null) {\n columns.push(currentColumn);\n currentColumn = this.getDisplayedColAfter(currentColumn);\n }\n return columns;\n };\n // checks what columns are currently displayed due to column virtualisation. fires an event\n // if the list of columns has changed.\n // + setColumnWidth(), setViewportPosition(), setColumnDefs(), sizeColumnsToFit()\n ColumnController.prototype.checkViewportColumns = function () {\n // check displayCenterColumnTree exists first, as it won't exist when grid is initialising\n if (this.displayedColumnsCenter == null) {\n return;\n }\n var hashBefore = this.viewportColumns.map(function (column) { return column.getId(); }).join('#');\n this.extractViewport();\n var hashAfter = this.viewportColumns.map(function (column) { return column.getId(); }).join('#');\n if (hashBefore !== hashAfter) {\n var event_1 = {\n type: Events.EVENT_VIRTUAL_COLUMNS_CHANGED,\n api: this.gridApi,\n columnApi: this.columnApi\n };\n this.eventService.dispatchEvent(event_1);\n }\n };\n ColumnController.prototype.setViewportPosition = function (scrollWidth, scrollPosition) {\n if (scrollWidth !== this.scrollWidth || scrollPosition !== this.scrollPosition || this.bodyWidthDirty) {\n this.scrollWidth = scrollWidth;\n this.scrollPosition = scrollPosition;\n // we need to call setVirtualViewportLeftAndRight() at least once after the body width changes,\n // as the viewport can stay the same, but in RTL, if body width changes, we need to work out the\n // virtual columns again\n this.bodyWidthDirty = true;\n this.setViewport();\n if (this.ready) {\n this.checkViewportColumns();\n }\n }\n };\n ColumnController.prototype.isPivotMode = function () {\n return this.pivotMode;\n };\n ColumnController.prototype.isPivotSettingAllowed = function (pivot) {\n if (pivot && this.gridOptionsWrapper.isTreeData()) {\n console.warn(\"AG Grid: Pivot mode not available in conjunction Tree Data i.e. 'gridOptions.treeData: true'\");\n return false;\n }\n return true;\n };\n ColumnController.prototype.setPivotMode = function (pivotMode, source) {\n if (source === void 0) { source = 'api'; }\n if (pivotMode === this.pivotMode || !this.isPivotSettingAllowed(this.pivotMode)) {\n return;\n }\n this.pivotMode = pivotMode;\n // we need to update grid columns to cover the scenario where user has groupSuppressAutoColumn=true, as\n // this means we don't use auto group column UNLESS we are in pivot mode (it's mandatory in pivot mode),\n // so need to updateGridColumn() to check it autoGroupCol needs to be added / removed\n this.autoGroupsNeedBuilding = true;\n this.updateGridColumns();\n this.updateDisplayedColumns(source);\n var event = {\n type: Events.EVENT_COLUMN_PIVOT_MODE_CHANGED,\n api: this.gridApi,\n columnApi: this.columnApi\n };\n this.eventService.dispatchEvent(event);\n };\n ColumnController.prototype.getSecondaryPivotColumn = function (pivotKeys, valueColKey) {\n if (!this.secondaryColumnsPresent || !this.secondaryColumns) {\n return null;\n }\n var valueColumnToFind = this.getPrimaryColumn(valueColKey);\n var foundColumn = null;\n this.secondaryColumns.forEach(function (column) {\n var thisPivotKeys = column.getColDef().pivotKeys;\n var pivotValueColumn = column.getColDef().pivotValueColumn;\n var pivotKeyMatches = areEqual(thisPivotKeys, pivotKeys);\n var pivotValueMatches = pivotValueColumn === valueColumnToFind;\n if (pivotKeyMatches && pivotValueMatches) {\n foundColumn = column;\n }\n });\n return foundColumn;\n };\n ColumnController.prototype.setBeans = function (loggerFactory) {\n this.logger = loggerFactory.create('ColumnController');\n };\n ColumnController.prototype.setFirstRightAndLastLeftPinned = function (source) {\n var lastLeft;\n var firstRight;\n if (this.gridOptionsWrapper.isEnableRtl()) {\n lastLeft = this.displayedColumnsLeft ? this.displayedColumnsLeft[0] : null;\n firstRight = this.displayedColumnsRight ? last(this.displayedColumnsRight) : null;\n }\n else {\n lastLeft = this.displayedColumnsLeft ? last(this.displayedColumnsLeft) : null;\n firstRight = this.displayedColumnsRight ? this.displayedColumnsRight[0] : null;\n }\n this.gridColumns.forEach(function (column) {\n column.setLastLeftPinned(column === lastLeft, source);\n column.setFirstRightPinned(column === firstRight, source);\n });\n };\n ColumnController.prototype.autoSizeColumns = function (keys, skipHeader, source) {\n // because of column virtualisation, we can only do this function on columns that are\n // actually rendered, as non-rendered columns (outside the viewport and not rendered\n // due to column virtualisation) are not present. this can result in all rendered columns\n // getting narrowed, which in turn introduces more rendered columns on the RHS which\n // did not get autosized in the original run, leaving the visible grid with columns on\n // the LHS sized, but RHS no. so we keep looping through the visible columns until\n // no more cols are available (rendered) to be resized\n var _this = this;\n if (source === void 0) { source = \"api\"; }\n // we autosize after animation frames finish in case any cell renderers need to complete first. this can\n // happen eg if client code is calling api.autoSizeAllColumns() straight after grid is initialised, but grid\n // hasn't fully drawn out all the cells yet (due to cell renderers in animation frames).\n this.animationFrameService.flushAllFrames();\n // keep track of which cols we have resized in here\n var columnsAutosized = [];\n // initialise with anything except 0 so that while loop executes at least once\n var changesThisTimeAround = -1;\n if (skipHeader == null) {\n skipHeader = this.gridOptionsWrapper.isSkipHeaderOnAutoSize();\n }\n while (changesThisTimeAround !== 0) {\n changesThisTimeAround = 0;\n this.actionOnGridColumns(keys, function (column) {\n // if already autosized, skip it\n if (columnsAutosized.indexOf(column) >= 0) {\n return false;\n }\n // get how wide this col should be\n var preferredWidth = _this.autoWidthCalculator.getPreferredWidthForColumn(column, skipHeader);\n // preferredWidth = -1 if this col is not on the screen\n if (preferredWidth > 0) {\n var newWidth = _this.normaliseColumnWidth(column, preferredWidth);\n column.setActualWidth(newWidth, source);\n columnsAutosized.push(column);\n changesThisTimeAround++;\n }\n return true;\n }, source);\n }\n this.fireColumnResizedEvent(columnsAutosized, true, 'autosizeColumns');\n };\n ColumnController.prototype.fireColumnResizedEvent = function (columns, finished, source, flexColumns) {\n if (flexColumns === void 0) { flexColumns = null; }\n if (columns && columns.length) {\n var event_2 = {\n type: Events.EVENT_COLUMN_RESIZED,\n columns: columns,\n column: columns.length === 1 ? columns[0] : null,\n flexColumns: flexColumns,\n finished: finished,\n api: this.gridApi,\n columnApi: this.columnApi,\n source: source\n };\n this.eventService.dispatchEvent(event_2);\n }\n };\n ColumnController.prototype.autoSizeColumn = function (key, skipHeader, source) {\n if (source === void 0) { source = \"api\"; }\n if (key) {\n this.autoSizeColumns([key], skipHeader, source);\n }\n };\n ColumnController.prototype.autoSizeAllColumns = function (skipHeader, source) {\n if (source === void 0) { source = \"api\"; }\n var allDisplayedColumns = this.getAllDisplayedColumns();\n this.autoSizeColumns(allDisplayedColumns, skipHeader, source);\n };\n ColumnController.prototype.getColumnsFromTree = function (rootColumns) {\n var result = [];\n var recursiveFindColumns = function (childColumns) {\n for (var i = 0; i < childColumns.length; i++) {\n var child = childColumns[i];\n if (child instanceof Column) {\n result.push(child);\n }\n else if (child instanceof OriginalColumnGroup) {\n recursiveFindColumns(child.getChildren());\n }\n }\n };\n recursiveFindColumns(rootColumns);\n return result;\n };\n ColumnController.prototype.getAllDisplayedTrees = function () {\n if (this.displayedTreeLeft && this.displayedTreeRight && this.displayedTreeCentre) {\n return this.displayedTreeLeft\n .concat(this.displayedTreeCentre)\n .concat(this.displayedTreeRight);\n }\n return null;\n };\n // + columnSelectPanel\n ColumnController.prototype.getPrimaryColumnTree = function () {\n return this.primaryColumnTree;\n };\n // + gridPanel -> for resizing the body and setting top margin\n ColumnController.prototype.getHeaderRowCount = function () {\n return this.gridHeaderRowCount;\n };\n // + headerRenderer -> setting pinned body width\n ColumnController.prototype.getDisplayedTreeLeft = function () {\n return this.displayedTreeLeft;\n };\n // + headerRenderer -> setting pinned body width\n ColumnController.prototype.getDisplayedTreeRight = function () {\n return this.displayedTreeRight;\n };\n // + headerRenderer -> setting pinned body width\n ColumnController.prototype.getDisplayedTreeCentre = function () {\n return this.displayedTreeCentre;\n };\n // gridPanel -> ensureColumnVisible\n ColumnController.prototype.isColumnDisplayed = function (column) {\n return this.getAllDisplayedColumns().indexOf(column) >= 0;\n };\n // + csvCreator\n ColumnController.prototype.getAllDisplayedColumns = function () {\n return this.displayedColumns;\n };\n ColumnController.prototype.getViewportColumns = function () {\n return this.viewportColumns;\n };\n ColumnController.prototype.getDisplayedLeftColumnsForRow = function (rowNode) {\n if (!this.colSpanActive) {\n return this.displayedColumnsLeft;\n }\n return this.getDisplayedColumnsForRow(rowNode, this.displayedColumnsLeft);\n };\n ColumnController.prototype.getDisplayedRightColumnsForRow = function (rowNode) {\n if (!this.colSpanActive) {\n return this.displayedColumnsRight;\n }\n return this.getDisplayedColumnsForRow(rowNode, this.displayedColumnsRight);\n };\n ColumnController.prototype.getDisplayedColumnsForRow = function (rowNode, displayedColumns, filterCallback, emptySpaceBeforeColumn) {\n var result = [];\n var lastConsideredCol = null;\n var _loop_1 = function (i) {\n var col = displayedColumns[i];\n var maxAllowedColSpan = displayedColumns.length - i;\n var colSpan = Math.min(col.getColSpan(rowNode), maxAllowedColSpan);\n var columnsToCheckFilter = [col];\n if (colSpan > 1) {\n var colsToRemove = colSpan - 1;\n for (var j = 1; j <= colsToRemove; j++) {\n columnsToCheckFilter.push(displayedColumns[i + j]);\n }\n i += colsToRemove;\n }\n // see which cols we should take out for column virtualisation\n var filterPasses;\n if (filterCallback) {\n // if user provided a callback, means some columns may not be in the viewport.\n // the user will NOT provide a callback if we are talking about pinned areas,\n // as pinned areas have no horizontal scroll and do not virtualise the columns.\n // if lots of columns, that means column spanning, and we set filterPasses = true\n // if one or more of the columns spanned pass the filter.\n filterPasses = false;\n columnsToCheckFilter.forEach(function (colForFilter) {\n if (filterCallback(colForFilter)) {\n filterPasses = true;\n }\n });\n }\n else {\n filterPasses = true;\n }\n if (filterPasses) {\n if (result.length === 0 && lastConsideredCol) {\n var gapBeforeColumn = emptySpaceBeforeColumn ? emptySpaceBeforeColumn(col) : false;\n if (gapBeforeColumn) {\n result.push(lastConsideredCol);\n }\n }\n result.push(col);\n }\n lastConsideredCol = col;\n out_i_1 = i;\n };\n var out_i_1;\n for (var i = 0; i < displayedColumns.length; i++) {\n _loop_1(i);\n i = out_i_1;\n }\n return result;\n };\n // + rowRenderer\n // if we are not column spanning, this just returns back the virtual centre columns,\n // however if we are column spanning, then different rows can have different virtual\n // columns, so we have to work out the list for each individual row.\n ColumnController.prototype.getViewportCenterColumnsForRow = function (rowNode) {\n var _this = this;\n if (!this.colSpanActive) {\n return this.viewportColumnsCenter;\n }\n var emptySpaceBeforeColumn = function (col) {\n var left = col.getLeft();\n return exists(left) && left > _this.viewportLeft;\n };\n // if doing column virtualisation, then we filter based on the viewport.\n var filterCallback = this.suppressColumnVirtualisation ? null : this.isColumnInViewport.bind(this);\n return this.getDisplayedColumnsForRow(rowNode, this.displayedColumnsCenter, filterCallback, emptySpaceBeforeColumn);\n };\n ColumnController.prototype.getAriaColumnIndex = function (col) {\n return this.getAllGridColumns().indexOf(col) + 1;\n };\n ColumnController.prototype.isColumnInViewport = function (col) {\n var columnLeft = col.getLeft() || 0;\n var columnRight = columnLeft + col.getActualWidth();\n // adding 200 for buffer size, so some cols off viewport are rendered.\n // this helps horizontal scrolling so user rarely sees white space (unless\n // they scroll horizontally fast). however we are conservative, as the more\n // buffer the slower the vertical redraw speed\n var leftBounds = this.viewportLeft - 200;\n var rightBounds = this.viewportRight + 200;\n var columnToMuchLeft = columnLeft < leftBounds && columnRight < leftBounds;\n var columnToMuchRight = columnLeft > rightBounds && columnRight > rightBounds;\n return !columnToMuchLeft && !columnToMuchRight;\n };\n // used by:\n // + angularGrid -> setting pinned body width\n // note: this should be cached\n ColumnController.prototype.getDisplayedColumnsLeftWidth = function () {\n return this.getWidthOfColsInList(this.displayedColumnsLeft);\n };\n // note: this should be cached\n ColumnController.prototype.getDisplayedColumnsRightWidth = function () {\n return this.getWidthOfColsInList(this.displayedColumnsRight);\n };\n ColumnController.prototype.updatePrimaryColumnList = function (keys, masterList, actionIsAdd, columnCallback, eventType, source) {\n var _this = this;\n if (source === void 0) { source = \"api\"; }\n if (!keys || missingOrEmpty(keys)) {\n return;\n }\n var atLeastOne = false;\n keys.forEach(function (key) {\n var columnToAdd = _this.getPrimaryColumn(key);\n if (!columnToAdd) {\n return;\n }\n if (actionIsAdd) {\n if (masterList.indexOf(columnToAdd) >= 0) {\n return;\n }\n masterList.push(columnToAdd);\n }\n else {\n if (masterList.indexOf(columnToAdd) < 0) {\n return;\n }\n removeFromArray(masterList, columnToAdd);\n }\n columnCallback(columnToAdd);\n atLeastOne = true;\n });\n if (!atLeastOne) {\n return;\n }\n if (this.autoGroupsNeedBuilding) {\n this.updateGridColumns();\n }\n this.updateDisplayedColumns(source);\n var event = {\n type: eventType,\n columns: masterList,\n column: masterList.length === 1 ? masterList[0] : null,\n api: this.gridApi,\n columnApi: this.columnApi,\n source: source\n };\n this.eventService.dispatchEvent(event);\n };\n ColumnController.prototype.setRowGroupColumns = function (colKeys, source) {\n if (source === void 0) { source = \"api\"; }\n this.autoGroupsNeedBuilding = true;\n this.setPrimaryColumnList(colKeys, this.rowGroupColumns, Events.EVENT_COLUMN_ROW_GROUP_CHANGED, this.setRowGroupActive.bind(this), source);\n };\n ColumnController.prototype.setRowGroupActive = function (active, column, source) {\n if (active === column.isRowGroupActive()) {\n return;\n }\n column.setRowGroupActive(active, source);\n if (!active && !this.gridOptionsWrapper.isSuppressMakeColumnVisibleAfterUnGroup()) {\n column.setVisible(true, source);\n }\n };\n ColumnController.prototype.addRowGroupColumn = function (key, source) {\n if (source === void 0) { source = \"api\"; }\n if (key) {\n this.addRowGroupColumns([key], source);\n }\n };\n ColumnController.prototype.addRowGroupColumns = function (keys, source) {\n if (source === void 0) { source = \"api\"; }\n this.autoGroupsNeedBuilding = true;\n this.updatePrimaryColumnList(keys, this.rowGroupColumns, true, this.setRowGroupActive.bind(this, true), Events.EVENT_COLUMN_ROW_GROUP_CHANGED, source);\n };\n ColumnController.prototype.removeRowGroupColumns = function (keys, source) {\n if (source === void 0) { source = \"api\"; }\n this.autoGroupsNeedBuilding = true;\n this.updatePrimaryColumnList(keys, this.rowGroupColumns, false, this.setRowGroupActive.bind(this, false), Events.EVENT_COLUMN_ROW_GROUP_CHANGED, source);\n };\n ColumnController.prototype.removeRowGroupColumn = function (key, source) {\n if (source === void 0) { source = \"api\"; }\n if (key) {\n this.removeRowGroupColumns([key], source);\n }\n };\n ColumnController.prototype.addPivotColumns = function (keys, source) {\n if (source === void 0) { source = \"api\"; }\n this.updatePrimaryColumnList(keys, this.pivotColumns, true, function (column) { return column.setPivotActive(true, source); }, Events.EVENT_COLUMN_PIVOT_CHANGED, source);\n };\n ColumnController.prototype.setPivotColumns = function (colKeys, source) {\n if (source === void 0) { source = \"api\"; }\n this.setPrimaryColumnList(colKeys, this.pivotColumns, Events.EVENT_COLUMN_PIVOT_CHANGED, function (added, column) {\n column.setPivotActive(added, source);\n }, source);\n };\n ColumnController.prototype.addPivotColumn = function (key, source) {\n if (source === void 0) { source = \"api\"; }\n this.addPivotColumns([key], source);\n };\n ColumnController.prototype.removePivotColumns = function (keys, source) {\n if (source === void 0) { source = \"api\"; }\n this.updatePrimaryColumnList(keys, this.pivotColumns, false, function (column) { return column.setPivotActive(false, source); }, Events.EVENT_COLUMN_PIVOT_CHANGED, source);\n };\n ColumnController.prototype.removePivotColumn = function (key, source) {\n if (source === void 0) { source = \"api\"; }\n this.removePivotColumns([key], source);\n };\n ColumnController.prototype.setPrimaryColumnList = function (colKeys, masterList, eventName, columnCallback, source) {\n var _this = this;\n masterList.length = 0;\n if (exists(colKeys)) {\n colKeys.forEach(function (key) {\n var column = _this.getPrimaryColumn(key);\n if (column) {\n masterList.push(column);\n }\n });\n }\n this.primaryColumns.forEach(function (column) {\n var added = masterList.indexOf(column) >= 0;\n columnCallback(added, column);\n });\n if (this.autoGroupsNeedBuilding) {\n this.updateGridColumns();\n }\n this.updateDisplayedColumns(source);\n var event = {\n type: eventName,\n columns: masterList,\n column: masterList.length === 1 ? masterList[0] : null,\n api: this.gridApi,\n columnApi: this.columnApi,\n source: source\n };\n this.eventService.dispatchEvent(event);\n };\n ColumnController.prototype.setValueColumns = function (colKeys, source) {\n if (source === void 0) { source = \"api\"; }\n this.setPrimaryColumnList(colKeys, this.valueColumns, Events.EVENT_COLUMN_VALUE_CHANGED, this.setValueActive.bind(this), source);\n };\n ColumnController.prototype.setValueActive = function (active, column, source) {\n if (active === column.isValueActive()) {\n return;\n }\n column.setValueActive(active, source);\n if (active && !column.getAggFunc()) {\n var initialAggFunc = this.aggFuncService.getDefaultAggFunc(column);\n column.setAggFunc(initialAggFunc);\n }\n };\n ColumnController.prototype.addValueColumns = function (keys, source) {\n if (source === void 0) { source = \"api\"; }\n this.updatePrimaryColumnList(keys, this.valueColumns, true, this.setValueActive.bind(this, true), Events.EVENT_COLUMN_VALUE_CHANGED, source);\n };\n ColumnController.prototype.addValueColumn = function (colKey, source) {\n if (source === void 0) { source = \"api\"; }\n if (colKey) {\n this.addValueColumns([colKey], source);\n }\n };\n ColumnController.prototype.removeValueColumn = function (colKey, source) {\n if (source === void 0) { source = \"api\"; }\n this.removeValueColumns([colKey], source);\n };\n ColumnController.prototype.removeValueColumns = function (keys, source) {\n if (source === void 0) { source = \"api\"; }\n this.updatePrimaryColumnList(keys, this.valueColumns, false, this.setValueActive.bind(this, false), Events.EVENT_COLUMN_VALUE_CHANGED, source);\n };\n // returns the width we can set to this col, taking into consideration min and max widths\n ColumnController.prototype.normaliseColumnWidth = function (column, newWidth) {\n var minWidth = column.getMinWidth();\n if (exists(minWidth) && newWidth < minWidth) {\n newWidth = minWidth;\n }\n var maxWidth = column.getMaxWidth();\n if (exists(maxWidth) && column.isGreaterThanMax(newWidth)) {\n newWidth = maxWidth;\n }\n return newWidth;\n };\n ColumnController.prototype.getPrimaryOrGridColumn = function (key) {\n var column = this.getPrimaryColumn(key);\n return column || this.getGridColumn(key);\n };\n ColumnController.prototype.setColumnWidths = function (columnWidths, shiftKey, // @takeFromAdjacent - if user has 'shift' pressed, then pixels are taken from adjacent column\n finished, // @finished - ends up in the event, tells the user if more events are to come\n source) {\n var _this = this;\n if (source === void 0) { source = \"api\"; }\n var sets = [];\n columnWidths.forEach(function (columnWidth) {\n var col = _this.getPrimaryOrGridColumn(columnWidth.key);\n if (!col) {\n return;\n }\n sets.push({\n width: columnWidth.newWidth,\n ratios: [1],\n columns: [col]\n });\n // if user wants to do shift resize by default, then we invert the shift operation\n var defaultIsShift = _this.gridOptionsWrapper.getColResizeDefault() === 'shift';\n if (defaultIsShift) {\n shiftKey = !shiftKey;\n }\n if (shiftKey) {\n var otherCol = _this.getDisplayedColAfter(col);\n if (!otherCol) {\n return;\n }\n var widthDiff = col.getActualWidth() - columnWidth.newWidth;\n var otherColWidth = otherCol.getActualWidth() + widthDiff;\n sets.push({\n width: otherColWidth,\n ratios: [1],\n columns: [otherCol]\n });\n }\n });\n if (sets.length === 0) {\n return;\n }\n this.resizeColumnSets(sets, finished, source);\n };\n ColumnController.prototype.checkMinAndMaxWidthsForSet = function (columnResizeSet) {\n var columns = columnResizeSet.columns, width = columnResizeSet.width;\n // every col has a min width, so sum them all up and see if we have enough room\n // for all the min widths\n var minWidthAccumulated = 0;\n var maxWidthAccumulated = 0;\n var maxWidthActive = true;\n columns.forEach(function (col) {\n var minWidth = col.getMinWidth();\n minWidthAccumulated += minWidth || 0;\n var maxWidth = col.getMaxWidth();\n if (exists(maxWidth) && maxWidth > 0) {\n maxWidthAccumulated += maxWidth;\n }\n else {\n // if at least one columns has no max width, it means the group of columns\n // then has no max width, as at least one column can take as much width as possible\n maxWidthActive = false;\n }\n });\n var minWidthPasses = width >= minWidthAccumulated;\n var maxWidthPasses = !maxWidthActive || (width <= maxWidthAccumulated);\n return minWidthPasses && maxWidthPasses;\n };\n // method takes sets of columns and resizes them. either all sets will be resized, or nothing\n // be resized. this is used for example when user tries to resize a group and holds shift key,\n // then both the current group (grows), and the adjacent group (shrinks), will get resized,\n // so that's two sets for this method.\n ColumnController.prototype.resizeColumnSets = function (resizeSets, finished, source) {\n var passMinMaxCheck = !resizeSets || resizeSets.every(this.checkMinAndMaxWidthsForSet.bind(this));\n if (!passMinMaxCheck) {\n // even though we are not going to resize beyond min/max size, we still need to raise event when finished\n if (finished) {\n var columns = resizeSets && resizeSets.length > 0 ? resizeSets[0].columns : null;\n this.fireColumnResizedEvent(columns, finished, source);\n }\n return; // don't resize!\n }\n var changedCols = [];\n var allResizedCols = [];\n resizeSets.forEach(function (set) {\n var width = set.width, columns = set.columns, ratios = set.ratios;\n // keep track of pixels used, and last column gets the remaining,\n // to cater for rounding errors, and min width adjustments\n var newWidths = {};\n var finishedCols = {};\n columns.forEach(function (col) { return allResizedCols.push(col); });\n // the loop below goes through each col. if a col exceeds it's min/max width,\n // it then gets set to its min/max width and the column is removed marked as 'finished'\n // and the calculation is done again leaving this column out. take for example columns\n // {A, width: 50, maxWidth: 100}\n // {B, width: 50}\n // {C, width: 50}\n // and then the set is set to width 600 - on the first pass the grid tries to set each column\n // to 200. it checks A and sees 200 > 100 and so sets the width to 100. col A is then marked\n // as 'finished' and the calculation is done again with the remaining cols B and C, which end up\n // splitting the remaining 500 pixels.\n var finishedColsGrew = true;\n var loopCount = 0;\n var _loop_2 = function () {\n loopCount++;\n if (loopCount > 1000) {\n // this should never happen, but in the future, someone might introduce a bug here,\n // so we stop the browser from hanging and report bug properly\n console.error('AG Grid: infinite loop in resizeColumnSets');\n return \"break\";\n }\n finishedColsGrew = false;\n var subsetCols = [];\n var subsetRatioTotal = 0;\n var pixelsToDistribute = width;\n columns.forEach(function (col, index) {\n var thisColFinished = finishedCols[col.getId()];\n if (thisColFinished) {\n pixelsToDistribute -= newWidths[col.getId()];\n }\n else {\n subsetCols.push(col);\n var ratioThisCol = ratios[index];\n subsetRatioTotal += ratioThisCol;\n }\n });\n // because we are not using all of the ratios (cols can be missing),\n // we scale the ratio. if all columns are included, then subsetRatioTotal=1,\n // and so the ratioScale will be 1.\n var ratioScale = 1 / subsetRatioTotal;\n subsetCols.forEach(function (col, index) {\n var lastCol = index === (subsetCols.length - 1);\n var colNewWidth;\n if (lastCol) {\n colNewWidth = pixelsToDistribute;\n }\n else {\n colNewWidth = Math.round(ratios[index] * width * ratioScale);\n pixelsToDistribute -= colNewWidth;\n }\n var minWidth = col.getMinWidth();\n var maxWidth = col.getMaxWidth();\n if (exists(minWidth) && colNewWidth < minWidth) {\n colNewWidth = minWidth;\n finishedCols[col.getId()] = true;\n finishedColsGrew = true;\n }\n else if (exists(maxWidth) && maxWidth > 0 && colNewWidth > maxWidth) {\n colNewWidth = maxWidth;\n finishedCols[col.getId()] = true;\n finishedColsGrew = true;\n }\n newWidths[col.getId()] = colNewWidth;\n });\n };\n while (finishedColsGrew) {\n var state_1 = _loop_2();\n if (state_1 === \"break\")\n break;\n }\n columns.forEach(function (col) {\n var newWidth = newWidths[col.getId()];\n if (col.getActualWidth() !== newWidth) {\n col.setActualWidth(newWidth, source);\n changedCols.push(col);\n }\n });\n });\n // if no cols changed, then no need to update more or send event.\n var atLeastOneColChanged = changedCols.length > 0;\n var flexedCols = this.refreshFlexedColumns({ resizingCols: allResizedCols, skipSetLeft: true });\n if (atLeastOneColChanged) {\n this.setLeftValues(source);\n this.updateBodyWidths();\n this.checkViewportColumns();\n }\n // check for change first, to avoid unnecessary firing of events\n // however we always fire 'finished' events. this is important\n // when groups are resized, as if the group is changing slowly,\n // eg 1 pixel at a time, then each change will fire change events\n // in all the columns in the group, but only one with get the pixel.\n var colsForEvent = allResizedCols.concat(flexedCols);\n if (atLeastOneColChanged || finished) {\n this.fireColumnResizedEvent(colsForEvent, finished, source, flexedCols);\n }\n };\n ColumnController.prototype.setColumnAggFunc = function (key, aggFunc, source) {\n if (source === void 0) { source = \"api\"; }\n if (!key) {\n return;\n }\n var column = this.getPrimaryColumn(key);\n if (!column) {\n return;\n }\n column.setAggFunc(aggFunc);\n var event = {\n type: Events.EVENT_COLUMN_VALUE_CHANGED,\n columns: [column],\n column: column,\n api: this.gridApi,\n columnApi: this.columnApi,\n source: source\n };\n this.eventService.dispatchEvent(event);\n };\n ColumnController.prototype.moveRowGroupColumn = function (fromIndex, toIndex, source) {\n if (source === void 0) { source = \"api\"; }\n var column = this.rowGroupColumns[fromIndex];\n this.rowGroupColumns.splice(fromIndex, 1);\n this.rowGroupColumns.splice(toIndex, 0, column);\n var event = {\n type: Events.EVENT_COLUMN_ROW_GROUP_CHANGED,\n columns: this.rowGroupColumns,\n column: this.rowGroupColumns.length === 1 ? this.rowGroupColumns[0] : null,\n api: this.gridApi,\n columnApi: this.columnApi,\n source: source\n };\n this.eventService.dispatchEvent(event);\n };\n ColumnController.prototype.moveColumns = function (columnsToMoveKeys, toIndex, source) {\n if (source === void 0) { source = \"api\"; }\n this.columnAnimationService.start();\n if (toIndex > this.gridColumns.length - columnsToMoveKeys.length) {\n console.warn('AG Grid: tried to insert columns in invalid location, toIndex = ' + toIndex);\n console.warn('AG Grid: remember that you should not count the moving columns when calculating the new index');\n return;\n }\n // we want to pull all the columns out first and put them into an ordered list\n var columnsToMove = this.getGridColumns(columnsToMoveKeys);\n var failedRules = !this.doesMovePassRules(columnsToMove, toIndex);\n if (failedRules) {\n return;\n }\n moveInArray(this.gridColumns, columnsToMove, toIndex);\n this.updateDisplayedColumns(source);\n var event = {\n type: Events.EVENT_COLUMN_MOVED,\n columns: columnsToMove,\n column: columnsToMove.length === 1 ? columnsToMove[0] : null,\n toIndex: toIndex,\n api: this.gridApi,\n columnApi: this.columnApi,\n source: source\n };\n this.eventService.dispatchEvent(event);\n this.columnAnimationService.finish();\n };\n ColumnController.prototype.doesMovePassRules = function (columnsToMove, toIndex) {\n // make a copy of what the grid columns would look like after the move\n var proposedColumnOrder = this.gridColumns.slice();\n moveInArray(proposedColumnOrder, columnsToMove, toIndex);\n // then check that the new proposed order of the columns passes all rules\n if (!this.doesMovePassMarryChildren(proposedColumnOrder)) {\n return false;\n }\n if (!this.doesMovePassLockedPositions(proposedColumnOrder)) {\n return false;\n }\n return true;\n };\n // returns the provided cols sorted in same order as they appear in grid columns. eg if grid columns\n // contains [a,b,c,d,e] and col passed is [e,a] then the passed cols are sorted into [a,e]\n ColumnController.prototype.sortColumnsLikeGridColumns = function (cols) {\n var _this = this;\n if (!cols || cols.length <= 1) {\n return;\n }\n var notAllColsInGridColumns = cols.filter(function (c) { return _this.gridColumns.indexOf(c) < 0; }).length > 0;\n if (notAllColsInGridColumns) {\n return;\n }\n cols.sort(function (a, b) {\n var indexA = _this.gridColumns.indexOf(a);\n var indexB = _this.gridColumns.indexOf(b);\n return indexA - indexB;\n });\n };\n ColumnController.prototype.doesMovePassLockedPositions = function (proposedColumnOrder) {\n var foundNonLocked = false;\n var rulePassed = true;\n // go though the cols, see if any non-locked appear before any locked\n proposedColumnOrder.forEach(function (col) {\n if (col.getColDef().lockPosition) {\n if (foundNonLocked) {\n rulePassed = false;\n }\n }\n else {\n foundNonLocked = true;\n }\n });\n return rulePassed;\n };\n ColumnController.prototype.doesMovePassMarryChildren = function (allColumnsCopy) {\n var rulePassed = true;\n this.columnUtils.depthFirstOriginalTreeSearch(null, this.gridBalancedTree, function (child) {\n if (!(child instanceof OriginalColumnGroup)) {\n return;\n }\n var columnGroup = child;\n var colGroupDef = columnGroup.getColGroupDef();\n var marryChildren = colGroupDef && colGroupDef.marryChildren;\n if (!marryChildren) {\n return;\n }\n var newIndexes = [];\n columnGroup.getLeafColumns().forEach(function (col) {\n var newColIndex = allColumnsCopy.indexOf(col);\n newIndexes.push(newColIndex);\n });\n var maxIndex = Math.max.apply(Math, newIndexes);\n var minIndex = Math.min.apply(Math, newIndexes);\n // spread is how far the first column in this group is away from the last column\n var spread = maxIndex - minIndex;\n var maxSpread = columnGroup.getLeafColumns().length - 1;\n // if the columns\n if (spread > maxSpread) {\n rulePassed = false;\n }\n // console.log(`maxIndex = ${maxIndex}, minIndex = ${minIndex}, spread = ${spread}, maxSpread = ${maxSpread}, fail = ${spread > (count-1)}`)\n // console.log(allColumnsCopy.map( col => col.getColDef().field).join(','));\n });\n return rulePassed;\n };\n ColumnController.prototype.moveColumn = function (key, toIndex, source) {\n if (source === void 0) { source = \"api\"; }\n this.moveColumns([key], toIndex, source);\n };\n ColumnController.prototype.moveColumnByIndex = function (fromIndex, toIndex, source) {\n if (source === void 0) { source = \"api\"; }\n var column = this.gridColumns[fromIndex];\n this.moveColumn(column, toIndex, source);\n };\n ColumnController.prototype.getColumnDefs = function () {\n var _this = this;\n var cols = this.primaryColumns.slice();\n if (this.gridColsArePrimary) {\n cols.sort(function (a, b) { return _this.gridColumns.indexOf(a) - _this.gridColumns.indexOf(b); });\n }\n else if (this.lastPrimaryOrder) {\n cols.sort(function (a, b) { return _this.lastPrimaryOrder.indexOf(a) - _this.lastPrimaryOrder.indexOf(b); });\n }\n return this.columnDefFactory.buildColumnDefs(cols, this.rowGroupColumns, this.pivotColumns);\n };\n // used by:\n // + angularGrid -> for setting body width\n // + rowController -> setting main row widths (when inserting and resizing)\n // need to cache this\n ColumnController.prototype.getBodyContainerWidth = function () {\n return this.bodyWidth;\n };\n ColumnController.prototype.getContainerWidth = function (pinned) {\n switch (pinned) {\n case Constants.PINNED_LEFT:\n return this.leftWidth;\n case Constants.PINNED_RIGHT:\n return this.rightWidth;\n default:\n return this.bodyWidth;\n }\n };\n // after setColumnWidth or updateGroupsAndDisplayedColumns\n ColumnController.prototype.updateBodyWidths = function () {\n var newBodyWidth = this.getWidthOfColsInList(this.displayedColumnsCenter);\n var newLeftWidth = this.getWidthOfColsInList(this.displayedColumnsLeft);\n var newRightWidth = this.getWidthOfColsInList(this.displayedColumnsRight);\n // this is used by virtual col calculation, for RTL only, as a change to body width can impact displayed\n // columns, due to RTL inverting the y coordinates\n this.bodyWidthDirty = this.bodyWidth !== newBodyWidth;\n var atLeastOneChanged = this.bodyWidth !== newBodyWidth || this.leftWidth !== newLeftWidth || this.rightWidth !== newRightWidth;\n if (atLeastOneChanged) {\n this.bodyWidth = newBodyWidth;\n this.leftWidth = newLeftWidth;\n this.rightWidth = newRightWidth;\n // when this fires, it is picked up by the gridPanel, which ends up in\n // gridPanel calling setWidthAndScrollPosition(), which in turn calls setViewportPosition()\n var event_3 = {\n type: Events.EVENT_DISPLAYED_COLUMNS_WIDTH_CHANGED,\n api: this.gridApi,\n columnApi: this.columnApi\n };\n this.eventService.dispatchEvent(event_3);\n }\n };\n // + rowController\n ColumnController.prototype.getValueColumns = function () {\n return this.valueColumns ? this.valueColumns : [];\n };\n // + rowController\n ColumnController.prototype.getPivotColumns = function () {\n return this.pivotColumns ? this.pivotColumns : [];\n };\n // + clientSideRowModel\n ColumnController.prototype.isPivotActive = function () {\n return this.pivotColumns && this.pivotColumns.length > 0 && this.pivotMode;\n };\n // + toolPanel\n ColumnController.prototype.getRowGroupColumns = function () {\n return this.rowGroupColumns ? this.rowGroupColumns : [];\n };\n // + rowController -> while inserting rows\n ColumnController.prototype.getDisplayedCenterColumns = function () {\n return this.displayedColumnsCenter;\n };\n // + rowController -> while inserting rows\n ColumnController.prototype.getDisplayedLeftColumns = function () {\n return this.displayedColumnsLeft;\n };\n ColumnController.prototype.getDisplayedRightColumns = function () {\n return this.displayedColumnsRight;\n };\n ColumnController.prototype.getDisplayedColumns = function (type) {\n switch (type) {\n case Constants.PINNED_LEFT:\n return this.getDisplayedLeftColumns();\n case Constants.PINNED_RIGHT:\n return this.getDisplayedRightColumns();\n default:\n return this.getDisplayedCenterColumns();\n }\n };\n // used by:\n // + clientSideRowController -> sorting, building quick filter text\n // + headerRenderer -> sorting (clearing icon)\n ColumnController.prototype.getAllPrimaryColumns = function () {\n return this.primaryColumns ? this.primaryColumns.slice() : null;\n };\n ColumnController.prototype.getSecondaryColumns = function () {\n return this.secondaryColumns ? this.secondaryColumns.slice() : null;\n };\n ColumnController.prototype.getAllColumnsForQuickFilter = function () {\n return this.columnsForQuickFilter;\n };\n // + moveColumnController\n ColumnController.prototype.getAllGridColumns = function () {\n return this.gridColumns;\n };\n ColumnController.prototype.isEmpty = function () {\n return missingOrEmpty(this.gridColumns);\n };\n ColumnController.prototype.isRowGroupEmpty = function () {\n return missingOrEmpty(this.rowGroupColumns);\n };\n ColumnController.prototype.setColumnVisible = function (key, visible, source) {\n if (source === void 0) { source = \"api\"; }\n this.setColumnsVisible([key], visible, source);\n };\n ColumnController.prototype.setColumnsVisible = function (keys, visible, source) {\n var _this = this;\n if (visible === void 0) { visible = false; }\n if (source === void 0) { source = \"api\"; }\n this.columnAnimationService.start();\n this.actionOnGridColumns(keys, function (column) {\n if (column.isVisible() !== visible) {\n column.setVisible(visible, source);\n return true;\n }\n return false;\n }, source, function () {\n var event = {\n type: Events.EVENT_COLUMN_VISIBLE,\n visible: visible,\n column: null,\n columns: null,\n api: _this.gridApi,\n columnApi: _this.columnApi,\n source: source\n };\n return event;\n });\n this.columnAnimationService.finish();\n };\n ColumnController.prototype.setColumnPinned = function (key, pinned, source) {\n if (source === void 0) { source = \"api\"; }\n if (key) {\n this.setColumnsPinned([key], pinned, source);\n }\n };\n ColumnController.prototype.setColumnsPinned = function (keys, pinned, source) {\n var _this = this;\n if (source === void 0) { source = \"api\"; }\n if (this.gridOptionsWrapper.getDomLayout() === 'print') {\n console.warn(\"Changing the column pinning status is not allowed with domLayout='print'\");\n return;\n }\n this.columnAnimationService.start();\n var actualPinned;\n if (pinned === true || pinned === Constants.PINNED_LEFT) {\n actualPinned = Constants.PINNED_LEFT;\n }\n else if (pinned === Constants.PINNED_RIGHT) {\n actualPinned = Constants.PINNED_RIGHT;\n }\n else {\n actualPinned = null;\n }\n this.actionOnGridColumns(keys, function (col) {\n if (col.getPinned() !== actualPinned) {\n col.setPinned(actualPinned);\n return true;\n }\n return false;\n }, source, function () {\n var event = {\n type: Events.EVENT_COLUMN_PINNED,\n pinned: actualPinned,\n column: null,\n columns: null,\n api: _this.gridApi,\n columnApi: _this.columnApi,\n source: source\n };\n return event;\n });\n this.columnAnimationService.finish();\n };\n // does an action on a set of columns. provides common functionality for looking up the\n // columns based on key, getting a list of effected columns, and then updated the event\n // with either one column (if it was just one col) or a list of columns\n // used by: autoResize, setVisible, setPinned\n ColumnController.prototype.actionOnGridColumns = function (// the column keys this action will be on\n keys, \n // the action to do - if this returns false, the column was skipped\n // and won't be included in the event\n action, \n // should return back a column event of the right type\n source, createEvent) {\n var _this = this;\n if (missingOrEmpty(keys)) {\n return;\n }\n var updatedColumns = [];\n keys.forEach(function (key) {\n var column = _this.getGridColumn(key);\n if (!column) {\n return;\n }\n // need to check for false with type (ie !== instead of !=)\n // as not returning anything (undefined) would also be false\n var resultOfAction = action(column);\n if (resultOfAction !== false) {\n updatedColumns.push(column);\n }\n });\n if (!updatedColumns.length) {\n return;\n }\n this.updateDisplayedColumns(source);\n if (exists(createEvent) && createEvent) {\n var event_4 = createEvent();\n event_4.columns = updatedColumns;\n event_4.column = updatedColumns.length === 1 ? updatedColumns[0] : null;\n this.eventService.dispatchEvent(event_4);\n }\n };\n ColumnController.prototype.getDisplayedColBefore = function (col) {\n var allDisplayedColumns = this.getAllDisplayedColumns();\n var oldIndex = allDisplayedColumns.indexOf(col);\n if (oldIndex > 0) {\n return allDisplayedColumns[oldIndex - 1];\n }\n return null;\n };\n // used by:\n // + rowRenderer -> for navigation\n ColumnController.prototype.getDisplayedColAfter = function (col) {\n var allDisplayedColumns = this.getAllDisplayedColumns();\n var oldIndex = allDisplayedColumns.indexOf(col);\n if (oldIndex < (allDisplayedColumns.length - 1)) {\n return allDisplayedColumns[oldIndex + 1];\n }\n return null;\n };\n ColumnController.prototype.getDisplayedGroupAfter = function (columnGroup) {\n return this.getDisplayedGroupAtDirection(columnGroup, 'After');\n };\n ColumnController.prototype.getDisplayedGroupBefore = function (columnGroup) {\n return this.getDisplayedGroupAtDirection(columnGroup, 'Before');\n };\n ColumnController.prototype.getDisplayedGroupAtDirection = function (columnGroup, direction) {\n // pick the last displayed column in this group\n var requiredLevel = columnGroup.getOriginalColumnGroup().getLevel() + columnGroup.getPaddingLevel();\n var colGroupLeafColumns = columnGroup.getDisplayedLeafColumns();\n var col = direction === 'After' ? last(colGroupLeafColumns) : colGroupLeafColumns[0];\n var getDisplayColMethod = \"getDisplayedCol\" + direction;\n while (true) {\n // keep moving to the next col, until we get to another group\n var column = this[getDisplayColMethod](col);\n if (!column) {\n return null;\n }\n var groupPointer = this.getColumnGroupAtLevel(column, requiredLevel);\n if (groupPointer !== columnGroup) {\n return groupPointer;\n }\n }\n };\n ColumnController.prototype.getColumnGroupAtLevel = function (column, level) {\n // get group at same level as the one we are looking for\n var groupPointer = column.getParent();\n var originalGroupLevel;\n var groupPointerLevel;\n while (true) {\n var groupPointerOriginalColumnGroup = groupPointer.getOriginalColumnGroup();\n originalGroupLevel = groupPointerOriginalColumnGroup.getLevel();\n groupPointerLevel = groupPointer.getPaddingLevel();\n if (originalGroupLevel + groupPointerLevel <= level) {\n break;\n }\n groupPointer = groupPointer.getParent();\n }\n return groupPointer;\n };\n ColumnController.prototype.isPinningLeft = function () {\n return this.displayedColumnsLeft.length > 0;\n };\n ColumnController.prototype.isPinningRight = function () {\n return this.displayedColumnsRight.length > 0;\n };\n ColumnController.prototype.getPrimaryAndSecondaryAndAutoColumns = function () {\n var result = this.primaryColumns ? this.primaryColumns.slice(0) : [];\n if (this.groupAutoColumns && exists(this.groupAutoColumns)) {\n this.groupAutoColumns.forEach(function (col) { return result.push(col); });\n }\n if (this.secondaryColumnsPresent && this.secondaryColumns) {\n this.secondaryColumns.forEach(function (column) { return result.push(column); });\n }\n return result;\n };\n ColumnController.prototype.createStateItemFromColumn = function (column) {\n var rowGroupIndex = column.isRowGroupActive() ? this.rowGroupColumns.indexOf(column) : null;\n var pivotIndex = column.isPivotActive() ? this.pivotColumns.indexOf(column) : null;\n var aggFunc = column.isValueActive() ? column.getAggFunc() : null;\n var sort = column.getSort() != null ? column.getSort() : null;\n var sortIndex = column.getSortIndex() != null ? column.getSortIndex() : null;\n var flex = column.getFlex() != null && column.getFlex() > 0 ? column.getFlex() : null;\n var res = {\n colId: column.getColId(),\n width: column.getActualWidth(),\n hide: !column.isVisible(),\n pinned: column.getPinned(),\n sort: sort,\n sortIndex: sortIndex,\n aggFunc: aggFunc,\n rowGroup: column.isRowGroupActive(),\n rowGroupIndex: rowGroupIndex,\n pivot: column.isPivotActive(),\n pivotIndex: pivotIndex,\n flex: flex\n };\n return res;\n };\n ColumnController.prototype.getColumnState = function () {\n if (missing(this.primaryColumns) || !this.isAlive()) {\n return [];\n }\n var primaryColumnState = this.primaryColumns.map(this.createStateItemFromColumn.bind(this));\n var groupAutoColumnState = this.groupAutoColumns\n // if groupAutoCols, then include them\n ? this.groupAutoColumns.map(this.createStateItemFromColumn.bind(this))\n // otherwise no\n : [];\n var columnStateList = groupAutoColumnState.concat(primaryColumnState);\n if (!this.pivotMode) {\n this.orderColumnStateList(columnStateList);\n }\n return columnStateList;\n };\n ColumnController.prototype.orderColumnStateList = function (columnStateList) {\n // for fast looking, store the index of each column\n var gridColumnIdMap = new Map(this.gridColumns.map(function (col, index) { return [col.getColId(), index]; }));\n columnStateList.sort(function (itemA, itemB) {\n var posA = gridColumnIdMap.has(itemA.colId) ? gridColumnIdMap.get(itemA.colId) : -1;\n var posB = gridColumnIdMap.has(itemB.colId) ? gridColumnIdMap.get(itemB.colId) : -1;\n return posA - posB;\n });\n };\n ColumnController.prototype.resetColumnState = function (source) {\n // NOTE = there is one bug here that no customer has noticed - if a column has colDef.lockPosition,\n // this is ignored below when ordering the cols. to work, we should always put lockPosition cols first.\n // As a work around, developers should just put lockPosition columns first in their colDef list.\n if (source === void 0) { source = \"api\"; }\n // we can't use 'allColumns' as the order might of messed up, so get the primary ordered list\n var primaryColumns = this.getColumnsFromTree(this.primaryColumnTree);\n var columnStates = [];\n // we start at 1000, so if user has mix of rowGroup and group specified, it will work with both.\n // eg IF user has ColA.rowGroupIndex=0, ColB.rowGroupIndex=1, ColC.rowGroup=true,\n // THEN result will be ColA.rowGroupIndex=0, ColB.rowGroupIndex=1, ColC.rowGroup=1000\n var letRowGroupIndex = 1000;\n var letPivotIndex = 1000;\n var colsToProcess = [];\n if (this.groupAutoColumns) {\n colsToProcess = colsToProcess.concat(this.groupAutoColumns);\n }\n if (primaryColumns) {\n colsToProcess = colsToProcess.concat(primaryColumns);\n }\n colsToProcess.forEach(function (column) {\n var colDef = column.getColDef();\n var sort = colDef.sort != null ? colDef.sort : null;\n var sortIndex = colDef.sortIndex;\n var hide = colDef.hide ? true : false;\n var pinned = colDef.pinned ? colDef.pinned : null;\n var width = colDef.width;\n var flex = colDef.flex != null ? colDef.flex : null;\n var rowGroupIndex = colDef.rowGroupIndex;\n var rowGroup = colDef.rowGroup;\n if (rowGroupIndex == null && (rowGroup == null || rowGroup == false)) {\n rowGroupIndex = null;\n rowGroup = null;\n }\n var pivotIndex = colDef.pivotIndex;\n var pivot = colDef.pivot;\n if (pivotIndex == null && (pivot == null || pivot == false)) {\n pivotIndex = null;\n pivot = null;\n }\n var aggFunc = colDef.aggFunc != null ? colDef.aggFunc : null;\n var stateItem = {\n colId: column.getColId(),\n sort: sort,\n sortIndex: sortIndex,\n hide: hide,\n pinned: pinned,\n width: width,\n flex: flex,\n rowGroup: rowGroup,\n rowGroupIndex: rowGroupIndex,\n pivot: pivot,\n pivotIndex: pivotIndex,\n aggFunc: aggFunc,\n };\n if (missing(rowGroupIndex) && rowGroup) {\n stateItem.rowGroupIndex = letRowGroupIndex++;\n }\n if (missing(pivotIndex) && pivot) {\n stateItem.pivotIndex = letPivotIndex++;\n }\n columnStates.push(stateItem);\n });\n this.applyColumnState({ state: columnStates, applyOrder: true }, source);\n };\n ColumnController.prototype.applyColumnState = function (params, source) {\n var _this = this;\n if (source === void 0) { source = \"api\"; }\n if (missingOrEmpty(this.primaryColumns)) {\n return false;\n }\n if (params && params.state && !params.state.forEach) {\n console.warn('AG Grid: applyColumnState() - the state attribute should be an array, however an array was not found. Please provide an array of items (one for each col you want to change) for state.');\n return false;\n }\n this.columnAnimationService.start();\n var raiseEventsFunc = this.compareColumnStatesAndRaiseEvents(source);\n this.autoGroupsNeedBuilding = true;\n // at the end below, this list will have all columns we got no state for\n var columnsWithNoState = this.primaryColumns.slice();\n var success = true;\n var rowGroupIndexes = {};\n var pivotIndexes = {};\n var autoGroupColumnStates = [];\n var previousRowGroupCols = this.rowGroupColumns.slice();\n var previousPivotCols = this.pivotColumns.slice();\n if (params.state) {\n params.state.forEach(function (state) {\n var groupAutoColumnId = Constants.GROUP_AUTO_COLUMN_ID;\n var colId = state.colId || '';\n // auto group columns are re-created so deferring syncing with ColumnState\n var isAutoGroupColumn = startsWith(colId, groupAutoColumnId);\n if (isAutoGroupColumn) {\n autoGroupColumnStates.push(state);\n return;\n }\n var column = _this.getPrimaryColumn(colId);\n if (!column) {\n // we don't log the failure, as it's possible the user is applying that has extra\n // cols in it. for example they could of save while row-grouping (so state includes\n // auto-group column) and then applied state when not grouping (so the auto-group\n // column would be in the state but no used).\n success = false;\n }\n else {\n _this.syncColumnWithStateItem(column, state, params.defaultState, rowGroupIndexes, pivotIndexes, false, source);\n removeFromArray(columnsWithNoState, column);\n }\n });\n }\n // anything left over, we got no data for, so add in the column as non-value, non-rowGroup and hidden\n columnsWithNoState.forEach(function (col) {\n _this.syncColumnWithStateItem(col, null, params.defaultState, rowGroupIndexes, pivotIndexes, false, source);\n });\n // sort the lists according to the indexes that were provided\n var comparator = function (indexes, oldList, colA, colB) {\n var indexA = indexes[colA.getId()];\n var indexB = indexes[colB.getId()];\n var aHasIndex = indexA != null;\n var bHasIndex = indexB != null;\n if (aHasIndex && bHasIndex) {\n // both a and b are new cols with index, so sort on index\n return indexA - indexB;\n }\n if (aHasIndex) {\n // a has an index, so it should be before a\n return -1;\n }\n if (bHasIndex) {\n // b has an index, so it should be before a\n return 1;\n }\n var oldIndexA = oldList.indexOf(colA);\n var oldIndexB = oldList.indexOf(colB);\n var aHasOldIndex = oldIndexA >= 0;\n var bHasOldIndex = oldIndexB >= 0;\n if (aHasOldIndex && bHasOldIndex) {\n // both a and b are old cols, so sort based on last order\n return oldIndexA - oldIndexB;\n }\n if (aHasOldIndex) {\n // a is old, b is new, so b is first\n return -1;\n }\n // this bit does matter, means both are new cols\n // but without index or that b is old and a is new\n return 1;\n };\n this.rowGroupColumns.sort(comparator.bind(this, rowGroupIndexes, previousRowGroupCols));\n this.pivotColumns.sort(comparator.bind(this, pivotIndexes, previousPivotCols));\n this.updateGridColumns();\n // sync newly created auto group columns with ColumnState\n autoGroupColumnStates.forEach(function (stateItem) {\n var autoCol = _this.getAutoColumn(stateItem.colId);\n _this.syncColumnWithStateItem(autoCol, stateItem, params.defaultState, null, null, true, source);\n });\n this.applyOrderAfterApplyState(params);\n this.updateDisplayedColumns(source);\n this.dispatchEverythingChanged(source);\n raiseEventsFunc();\n this.columnAnimationService.finish();\n return success;\n };\n ColumnController.prototype.applyOrderAfterApplyState = function (params) {\n var _this = this;\n if (!this.gridColsArePrimary || !params.applyOrder || !params.state) {\n return;\n }\n var newOrder = [];\n var processedColIds = {};\n params.state.forEach(function (item) {\n if (!item.colId || processedColIds[item.colId]) {\n return;\n }\n var col = _this.primaryColumnsMap[item.colId];\n if (col) {\n newOrder.push(col);\n processedColIds[item.colId] = true;\n }\n });\n // add in all other columns\n this.gridColumns.forEach(function (col) {\n if (!processedColIds[col.getColId()]) {\n newOrder.push(col);\n }\n });\n // this is already done in updateGridColumns, however we changed the order above (to match the order of the state\n // columns) so we need to do it again. we could of put logic into the order above to take into account fixed\n // columns, however if we did then we would have logic for updating fixed columns twice. reusing the logic here\n // is less sexy for the code here, but it keeps consistency.\n newOrder = this.putFixedColumnsFirst(newOrder);\n if (!this.doesMovePassMarryChildren(newOrder)) {\n console.warn('AG Grid: Applying column order broke a group where columns should be married together. Applying new order has been discarded.');\n return;\n }\n this.gridColumns = newOrder;\n };\n ColumnController.prototype.compareColumnStatesAndRaiseEvents = function (source) {\n var _this = this;\n // if no columns to begin with, then it means we are setting columns for the first time, so\n // there should be no events fired to show differences in columns.\n var colsPreviouslyExisted = !!this.columnDefs;\n if (!colsPreviouslyExisted) {\n return function () { };\n }\n var startState = {\n rowGroupColumns: this.rowGroupColumns.slice(),\n pivotColumns: this.pivotColumns.slice(),\n valueColumns: this.valueColumns.slice()\n };\n var columnStateBefore = this.getColumnState();\n var columnStateBeforeMap = {};\n columnStateBefore.forEach(function (col) {\n columnStateBeforeMap[col.colId] = col;\n });\n return function () {\n if (_this.gridOptionsWrapper.isSuppressColumnStateEvents()) {\n return;\n }\n // raises generic ColumnEvents where all columns are returned rather than what has changed\n var raiseWhenListsDifferent = function (eventType, colsBefore, colsAfter, idMapper) {\n var beforeList = colsBefore.map(idMapper).sort();\n var afterList = colsAfter.map(idMapper).sort();\n var unchanged = areEqual(beforeList, afterList);\n if (unchanged) {\n return;\n }\n // returning all columns rather than what has changed!\n var event = {\n type: eventType,\n columns: colsAfter,\n column: colsAfter.length === 1 ? colsAfter[0] : null,\n api: _this.gridApi,\n columnApi: _this.columnApi,\n source: source\n };\n _this.eventService.dispatchEvent(event);\n };\n // determines which columns have changed according to supplied predicate\n var getChangedColumns = function (changedPredicate) {\n var changedColumns = [];\n _this.gridColumns.forEach(function (column) {\n var colStateBefore = columnStateBeforeMap[column.getColId()];\n if (colStateBefore && changedPredicate(colStateBefore, column)) {\n changedColumns.push(column);\n }\n });\n return changedColumns;\n };\n var columnIdMapper = function (c) { return c.getColId(); };\n raiseWhenListsDifferent(Events.EVENT_COLUMN_ROW_GROUP_CHANGED, startState.rowGroupColumns, _this.rowGroupColumns, columnIdMapper);\n raiseWhenListsDifferent(Events.EVENT_COLUMN_PIVOT_CHANGED, startState.pivotColumns, _this.pivotColumns, columnIdMapper);\n raiseWhenListsDifferent(Events.EVENT_COLUMN_VALUE_CHANGED, startState.valueColumns, _this.valueColumns, columnIdMapper);\n var resizeChangePredicate = function (cs, c) { return cs.width != c.getActualWidth(); };\n _this.fireColumnResizedEvent(getChangedColumns(resizeChangePredicate), true, source);\n var pinnedChangePredicate = function (cs, c) { return cs.pinned != c.getPinned(); };\n _this.raiseColumnPinnedEvent(getChangedColumns(pinnedChangePredicate), source);\n var visibilityChangePredicate = function (cs, c) { return cs.hide == c.isVisible(); };\n _this.raiseColumnVisibleEvent(getChangedColumns(visibilityChangePredicate), source);\n var sortChangePredicate = function (cs, c) { return cs.sort != c.getSort() || cs.sortIndex != c.getSortIndex(); };\n if (getChangedColumns(sortChangePredicate).length > 0) {\n _this.sortController.dispatchSortChangedEvents();\n }\n // special handling for moved column events\n _this.raiseColumnMovedEvent(columnStateBefore, source);\n };\n };\n ColumnController.prototype.raiseColumnPinnedEvent = function (changedColumns, source) {\n if (!changedColumns.length) {\n return;\n }\n var event = {\n type: Events.EVENT_COLUMN_PINNED,\n pinned: null,\n columns: changedColumns,\n column: null,\n api: this.gridApi,\n columnApi: this.columnApi,\n source: source\n };\n this.eventService.dispatchEvent(event);\n };\n ColumnController.prototype.raiseColumnVisibleEvent = function (changedColumns, source) {\n if (!changedColumns.length) {\n return;\n }\n var event = {\n type: Events.EVENT_COLUMN_VISIBLE,\n visible: undefined,\n columns: changedColumns,\n column: null,\n api: this.gridApi,\n columnApi: this.columnApi,\n source: source\n };\n this.eventService.dispatchEvent(event);\n };\n ColumnController.prototype.raiseColumnMovedEvent = function (colStateBefore, source) {\n // we are only interested in columns that were both present and visible before and after\n var _this = this;\n var colStateAfter = this.getColumnState();\n var colStateAfterMapped = {};\n colStateAfter.forEach(function (s) { return colStateAfterMapped[s.colId] = s; });\n // get id's of cols in both before and after lists\n var colsIntersectIds = {};\n colStateBefore.forEach(function (s) {\n if (colStateAfterMapped[s.colId]) {\n colsIntersectIds[s.colId] = true;\n }\n });\n // filter state lists, so we only have cols that were present before and after\n var beforeFiltered = filter(colStateBefore, function (c) { return colsIntersectIds[c.colId]; });\n var afterFiltered = filter(colStateAfter, function (c) { return colsIntersectIds[c.colId]; });\n // see if any cols are in a different location\n var movedColumns = [];\n afterFiltered.forEach(function (csAfter, index) {\n var csBefore = beforeFiltered && beforeFiltered[index];\n if (csBefore && csBefore.colId !== csAfter.colId) {\n var gridCol = _this.getGridColumn(csBefore.colId);\n if (gridCol) {\n movedColumns.push(gridCol);\n }\n }\n });\n if (!movedColumns.length) {\n return;\n }\n var event = {\n type: Events.EVENT_COLUMN_MOVED,\n columns: movedColumns,\n column: null,\n api: this.gridApi,\n columnApi: this.columnApi,\n source: source\n };\n this.eventService.dispatchEvent(event);\n };\n ColumnController.prototype.syncColumnWithStateItem = function (column, stateItem, defaultState, rowGroupIndexes, pivotIndexes, autoCol, source) {\n if (!column) {\n return;\n }\n var getValue = function (key1, key2) {\n var stateAny = stateItem;\n var defaultAny = defaultState;\n var obj = { value1: undefined, value2: undefined };\n var calculated = false;\n if (stateAny) {\n if (stateAny[key1] !== undefined) {\n obj.value1 = stateAny[key1];\n calculated = true;\n }\n if (exists(key2) && stateAny[key2] !== undefined) {\n obj.value2 = stateAny[key2];\n calculated = true;\n }\n }\n if (!calculated && defaultAny) {\n if (defaultAny[key1] !== undefined) {\n obj.value1 = defaultAny[key1];\n }\n if (exists(key2) && defaultAny[key2] !== undefined) {\n obj.value2 = defaultAny[key2];\n }\n }\n return obj;\n };\n // following ensures we are left with boolean true or false, eg converts (null, undefined, 0) all to true\n var hide = getValue('hide').value1;\n if (hide !== undefined) {\n column.setVisible(!hide, source);\n }\n // sets pinned to 'left' or 'right'\n var pinned = getValue('pinned').value1;\n if (pinned !== undefined) {\n column.setPinned(pinned);\n }\n // if width provided and valid, use it, otherwise stick with the old width\n var minColWidth = this.gridOptionsWrapper.getMinColWidth();\n // flex\n var flex = getValue('flex').value1;\n if (flex !== undefined) {\n column.setFlex(flex);\n }\n // width - we only set width if column is not flexing\n var noFlexThisCol = column.getFlex() <= 0;\n if (noFlexThisCol) {\n // both null and undefined means we skip, as it's not possible to 'clear' width (a column must have a width)\n var width = getValue('width').value1;\n if (width != null) {\n if (minColWidth &&\n (width >= minColWidth)) {\n column.setActualWidth(width, source);\n }\n }\n }\n var sort = getValue('sort').value1;\n if (sort !== undefined) {\n if (sort === Constants.SORT_DESC || sort === Constants.SORT_ASC) {\n column.setSort(sort);\n }\n else {\n column.setSort(undefined);\n }\n }\n var sortIndex = getValue('sortIndex').value1;\n if (sortIndex !== undefined) {\n column.setSortIndex(sortIndex);\n }\n // we do not do aggFunc, rowGroup or pivot for auto cols, as you can't do these with auto col\n if (autoCol) {\n return;\n }\n var aggFunc = getValue('aggFunc').value1;\n if (aggFunc !== undefined) {\n if (typeof aggFunc === 'string') {\n column.setAggFunc(aggFunc);\n if (!column.isValueActive()) {\n column.setValueActive(true, source);\n this.valueColumns.push(column);\n }\n }\n else {\n if (exists(aggFunc)) {\n console.warn('AG Grid: stateItem.aggFunc must be a string. if using your own aggregation ' +\n 'functions, register the functions first before using them in get/set state. This is because it is ' +\n 'intended for the column state to be stored and retrieved as simple JSON.');\n }\n column.setAggFunc(null);\n if (column.isValueActive()) {\n column.setValueActive(false, source);\n removeFromArray(this.valueColumns, column);\n }\n }\n }\n var _a = getValue('rowGroup', 'rowGroupIndex'), rowGroup = _a.value1, rowGroupIndex = _a.value2;\n if (rowGroup !== undefined || rowGroupIndex !== undefined) {\n if (typeof rowGroupIndex === 'number' || rowGroup) {\n if (!column.isRowGroupActive()) {\n column.setRowGroupActive(true, source);\n this.rowGroupColumns.push(column);\n }\n if (rowGroupIndexes && typeof rowGroupIndex === 'number') {\n rowGroupIndexes[column.getId()] = rowGroupIndex;\n }\n }\n else {\n if (column.isRowGroupActive()) {\n column.setRowGroupActive(false, source);\n removeFromArray(this.rowGroupColumns, column);\n }\n }\n }\n var _b = getValue('pivot', 'pivotIndex'), pivot = _b.value1, pivotIndex = _b.value2;\n if (pivot !== undefined || pivotIndex !== undefined) {\n if (typeof pivotIndex === 'number' || pivot) {\n if (!column.isPivotActive()) {\n column.setPivotActive(true, source);\n this.pivotColumns.push(column);\n }\n if (pivotIndexes && typeof pivotIndex === 'number') {\n pivotIndexes[column.getId()] = pivotIndex;\n }\n }\n else {\n if (column.isPivotActive()) {\n column.setPivotActive(false, source);\n removeFromArray(this.pivotColumns, column);\n }\n }\n }\n };\n ColumnController.prototype.getGridColumns = function (keys) {\n return this.getColumns(keys, this.getGridColumn.bind(this));\n };\n ColumnController.prototype.getColumns = function (keys, columnLookupCallback) {\n var foundColumns = [];\n if (keys) {\n keys.forEach(function (key) {\n var column = columnLookupCallback(key);\n if (column) {\n foundColumns.push(column);\n }\n });\n }\n return foundColumns;\n };\n // used by growGroupPanel\n ColumnController.prototype.getColumnWithValidation = function (key) {\n if (key == null) {\n return null;\n }\n var column = this.getGridColumn(key);\n if (!column) {\n console.warn('AG Grid: could not find column ' + key);\n }\n return column;\n };\n ColumnController.prototype.getPrimaryColumn = function (key) {\n return this.getColumn(key, this.primaryColumns, this.primaryColumnsMap);\n };\n ColumnController.prototype.getGridColumn = function (key) {\n return this.getColumn(key, this.gridColumns, this.gridColumnsMap);\n };\n ColumnController.prototype.getColumn = function (key, columnList, columnMap) {\n if (!key) {\n return null;\n }\n // most of the time this method gets called the key is a string, so we put this shortcut in\n // for performance reasons, to see if we can match for ID (it doesn't do auto columns, that's done below)\n if (typeof key == 'string' && columnMap[key]) {\n return columnMap[key];\n }\n for (var i = 0; i < columnList.length; i++) {\n if (this.columnsMatch(columnList[i], key)) {\n return columnList[i];\n }\n }\n return this.getAutoColumn(key);\n };\n ColumnController.prototype.getAutoColumn = function (key) {\n var _this = this;\n if (!this.groupAutoColumns ||\n !exists(this.groupAutoColumns) ||\n missing(this.groupAutoColumns)) {\n return null;\n }\n return find(this.groupAutoColumns, function (groupCol) { return _this.columnsMatch(groupCol, key); });\n };\n ColumnController.prototype.columnsMatch = function (column, key) {\n var columnMatches = column === key;\n var colDefMatches = column.getColDef() === key;\n var idMatches = column.getColId() == key;\n return columnMatches || colDefMatches || idMatches;\n };\n ColumnController.prototype.getDisplayNameForColumn = function (column, location, includeAggFunc) {\n if (includeAggFunc === void 0) { includeAggFunc = false; }\n if (!column) {\n return null;\n }\n var headerName = this.getHeaderName(column.getColDef(), column, null, null, location);\n if (includeAggFunc) {\n return this.wrapHeaderNameWithAggFunc(column, headerName);\n }\n return headerName;\n };\n ColumnController.prototype.getDisplayNameForOriginalColumnGroup = function (columnGroup, originalColumnGroup, location) {\n var colGroupDef = originalColumnGroup ? originalColumnGroup.getColGroupDef() : null;\n if (colGroupDef) {\n return this.getHeaderName(colGroupDef, null, columnGroup, originalColumnGroup, location);\n }\n return null;\n };\n ColumnController.prototype.getDisplayNameForColumnGroup = function (columnGroup, location) {\n return this.getDisplayNameForOriginalColumnGroup(columnGroup, columnGroup.getOriginalColumnGroup(), location);\n };\n // location is where the column is going to appear, ie who is calling us\n ColumnController.prototype.getHeaderName = function (colDef, column, columnGroup, originalColumnGroup, location) {\n var headerValueGetter = colDef.headerValueGetter;\n if (headerValueGetter) {\n var params = {\n colDef: colDef,\n column: column,\n columnGroup: columnGroup,\n originalColumnGroup: originalColumnGroup,\n location: location,\n api: this.gridOptionsWrapper.getApi(),\n context: this.gridOptionsWrapper.getContext()\n };\n if (typeof headerValueGetter === 'function') {\n // valueGetter is a function, so just call it\n return headerValueGetter(params);\n }\n else if (typeof headerValueGetter === 'string') {\n // valueGetter is an expression, so execute the expression\n return this.expressionService.evaluate(headerValueGetter, params);\n }\n console.warn('ag-grid: headerValueGetter must be a function or a string');\n return '';\n }\n else if (colDef.headerName != null) {\n return colDef.headerName;\n }\n else if (colDef.field) {\n return camelCaseToHumanText(colDef.field);\n }\n return '';\n };\n /*\n private getHeaderGroupName(columnGroup: ColumnGroup): string {\n let colGroupDef = columnGroup.getOriginalColumnGroup().getColGroupDef();\n let headerValueGetter = colGroupDef.headerValueGetter;\n\n if (headerValueGetter) {\n let params = {\n columnGroup: columnGroup,\n colDef: colGroupDef,\n api: this.gridOptionsWrapper.getApi(),\n context: this.gridOptionsWrapper.getContext()\n };\n\n if (typeof headerValueGetter === 'function') {\n // valueGetter is a function, so just call it\n return headerValueGetter(params);\n } else if (typeof headerValueGetter === 'string') {\n // valueGetter is an expression, so execute the expression\n return this.expressionService.evaluate(headerValueGetter, params);\n } else {\n console.warn('ag-grid: headerValueGetter must be a function or a string');\n return '';\n }\n } else {\n return colGroupDef.headerName;\n }\n }\n */\n ColumnController.prototype.wrapHeaderNameWithAggFunc = function (column, headerName) {\n if (this.gridOptionsWrapper.isSuppressAggFuncInHeader()) {\n return headerName;\n }\n // only columns with aggregation active can have aggregations\n var pivotValueColumn = column.getColDef().pivotValueColumn;\n var pivotActiveOnThisColumn = exists(pivotValueColumn);\n var aggFunc = null;\n var aggFuncFound;\n // otherwise we have a measure that is active, and we are doing aggregation on it\n if (pivotActiveOnThisColumn) {\n aggFunc = pivotValueColumn ? pivotValueColumn.getAggFunc() : null;\n aggFuncFound = true;\n }\n else {\n var measureActive = column.isValueActive();\n var aggregationPresent = this.pivotMode || !this.isRowGroupEmpty();\n if (measureActive && aggregationPresent) {\n aggFunc = column.getAggFunc();\n aggFuncFound = true;\n }\n else {\n aggFuncFound = false;\n }\n }\n if (aggFuncFound) {\n var aggFuncString = (typeof aggFunc === 'string') ? aggFunc : 'func';\n var localeTextFunc = this.gridOptionsWrapper.getLocaleTextFunc();\n var aggFuncStringTranslated = localeTextFunc(aggFuncString, aggFuncString);\n return aggFuncStringTranslated + \"(\" + headerName + \")\";\n }\n return headerName;\n };\n // returns the group with matching colId and instanceId. If instanceId is missing,\n // matches only on the colId.\n ColumnController.prototype.getColumnGroup = function (colId, instanceId) {\n if (!colId) {\n return null;\n }\n if (colId instanceof ColumnGroup) {\n return colId;\n }\n var allColumnGroups = this.getAllDisplayedTrees();\n var checkInstanceId = typeof instanceId === 'number';\n var result = null;\n this.columnUtils.depthFirstAllColumnTreeSearch(allColumnGroups, function (child) {\n if (child instanceof ColumnGroup) {\n var columnGroup = child;\n var matched = void 0;\n if (checkInstanceId) {\n matched = colId === columnGroup.getGroupId() && instanceId === columnGroup.getInstanceId();\n }\n else {\n matched = colId === columnGroup.getGroupId();\n }\n if (matched) {\n result = columnGroup;\n }\n }\n });\n return result;\n };\n ColumnController.prototype.isReady = function () {\n return this.ready;\n };\n ColumnController.prototype.extractValueColumns = function (source, oldPrimaryColumns) {\n this.valueColumns = this.extractColumns(oldPrimaryColumns, this.valueColumns, function (col, flag) { return col.setValueActive(flag, source); }, \n // aggFunc doesn't have index variant, cos order of value cols doesn't matter, so always return null\n function () { return undefined; }, function () { return undefined; }, \n // aggFunc is a string, so return it's existence\n function (colDef) {\n var aggFunc = colDef.aggFunc;\n // null or empty string means clear\n if (aggFunc === null || aggFunc === '') {\n return null;\n }\n if (aggFunc === undefined) {\n return;\n }\n return !!aggFunc;\n }, function (colDef) {\n // return false if any of the following: null, undefined, empty string\n return colDef.initialAggFunc != null && colDef.initialAggFunc != '';\n });\n // all new columns added will have aggFunc missing, so set it to what is in the colDef\n this.valueColumns.forEach(function (col) {\n var colDef = col.getColDef();\n // if aggFunc provided, we always override, as reactive property\n if (colDef.aggFunc != null && colDef.aggFunc != '') {\n col.setAggFunc(colDef.aggFunc);\n }\n else {\n // otherwise we use initialAggFunc only if no agg func set - which happens when new column only\n if (!col.getAggFunc()) {\n col.setAggFunc(colDef.initialAggFunc);\n }\n }\n });\n };\n ColumnController.prototype.extractRowGroupColumns = function (source, oldPrimaryColumns) {\n this.rowGroupColumns = this.extractColumns(oldPrimaryColumns, this.rowGroupColumns, function (col, flag) { return col.setRowGroupActive(flag, source); }, function (colDef) { return colDef.rowGroupIndex; }, function (colDef) { return colDef.initialRowGroupIndex; }, function (colDef) { return colDef.rowGroup; }, function (colDef) { return colDef.initialRowGroup; });\n };\n ColumnController.prototype.extractColumns = function (oldPrimaryColumns, previousCols, setFlagFunc, getIndexFunc, getInitialIndexFunc, getValueFunc, getInitialValueFunc) {\n if (oldPrimaryColumns === void 0) { oldPrimaryColumns = []; }\n if (previousCols === void 0) { previousCols = []; }\n var colsWithIndex = [];\n var colsWithValue = [];\n // go though all cols.\n // if value, change\n // if default only, change only if new\n this.primaryColumns.forEach(function (col) {\n var colIsNew = oldPrimaryColumns.indexOf(col) < 0;\n var colDef = col.getColDef();\n var value = attrToBoolean(getValueFunc(colDef));\n var initialValue = attrToBoolean(getInitialValueFunc(colDef));\n var index = attrToNumber(getIndexFunc(colDef));\n var initialIndex = attrToNumber(getInitialIndexFunc(colDef));\n var include;\n if (colIsNew) {\n // col is new, use values if present, otherwise use default values if present\n var valuePresent = value !== undefined || index !== undefined;\n if (valuePresent) {\n if (value !== undefined) {\n // if boolean value present, we take it's value, even if 'false'\n include = value;\n }\n else {\n // otherwise we based on number value. note that 'null' resets, however 'undefined' doesn't\n // go through this code path (undefined means 'ignore').\n include = index >= 0;\n }\n }\n else {\n include = initialValue || initialIndex >= 0;\n }\n }\n else {\n // col is not new, we ignore the default values, just use the values if provided\n if (value !== undefined) { // value is never null, as attrToBoolean converts null to false\n include = value;\n }\n else if (index !== undefined) {\n if (index === null) {\n include = false;\n }\n else {\n include = index >= 0;\n }\n }\n else {\n // no values provided, we include if it was included last time\n include = previousCols.indexOf(col) >= 0;\n }\n }\n if (include) {\n var useIndex = colIsNew ? (index != null || initialIndex != null) : index != null;\n if (useIndex) {\n colsWithIndex.push(col);\n }\n else {\n colsWithValue.push(col);\n }\n }\n });\n var getIndexForCol = function (col) {\n var index = getIndexFunc(col.getColDef());\n var defaultIndex = getInitialIndexFunc(col.getColDef());\n return index != null ? index : defaultIndex;\n };\n // sort cols with index, and add these first\n colsWithIndex.sort(function (colA, colB) {\n var indexA = getIndexForCol(colA);\n var indexB = getIndexForCol(colB);\n if (indexA === indexB) {\n return 0;\n }\n if (indexA < indexB) {\n return -1;\n }\n return 1;\n });\n var res = [].concat(colsWithIndex);\n // second add columns that were there before and in the same order as they were before,\n // so we are preserving order of current grouping of columns that simply have rowGroup=true\n previousCols.forEach(function (col) {\n if (colsWithValue.indexOf(col) >= 0) {\n res.push(col);\n }\n });\n // lastly put in all remaining cols\n colsWithValue.forEach(function (col) {\n if (res.indexOf(col) < 0) {\n res.push(col);\n }\n });\n // set flag=false for removed cols\n previousCols.forEach(function (col) {\n if (res.indexOf(col) < 0) {\n setFlagFunc(col, false);\n }\n });\n // set flag=true for newly added cols\n res.forEach(function (col) {\n if (previousCols.indexOf(col) < 0) {\n setFlagFunc(col, true);\n }\n });\n return res;\n };\n ColumnController.prototype.extractPivotColumns = function (source, oldPrimaryColumns) {\n this.pivotColumns = this.extractColumns(oldPrimaryColumns, this.pivotColumns, function (col, flag) { return col.setPivotActive(flag, source); }, function (colDef) { return colDef.pivotIndex; }, function (colDef) { return colDef.initialPivotIndex; }, function (colDef) { return colDef.pivot; }, function (colDef) { return colDef.initialPivot; });\n };\n ColumnController.prototype.resetColumnGroupState = function (source) {\n if (source === void 0) { source = \"api\"; }\n var stateItems = [];\n this.columnUtils.depthFirstOriginalTreeSearch(null, this.primaryColumnTree, function (child) {\n if (child instanceof OriginalColumnGroup) {\n var colGroupDef = child.getColGroupDef();\n var groupState = {\n groupId: child.getGroupId(),\n open: !colGroupDef ? undefined : colGroupDef.openByDefault\n };\n stateItems.push(groupState);\n }\n });\n this.setColumnGroupState(stateItems, source);\n };\n ColumnController.prototype.getColumnGroupState = function () {\n var columnGroupState = [];\n this.columnUtils.depthFirstOriginalTreeSearch(null, this.gridBalancedTree, function (node) {\n if (node instanceof OriginalColumnGroup) {\n var originalColumnGroup = node;\n columnGroupState.push({\n groupId: originalColumnGroup.getGroupId(),\n open: originalColumnGroup.isExpanded()\n });\n }\n });\n return columnGroupState;\n };\n ColumnController.prototype.setColumnGroupState = function (stateItems, source) {\n var _this = this;\n if (source === void 0) { source = \"api\"; }\n this.columnAnimationService.start();\n var impactedGroups = [];\n stateItems.forEach(function (stateItem) {\n var groupKey = stateItem.groupId;\n var newValue = stateItem.open;\n var originalColumnGroup = _this.getOriginalColumnGroup(groupKey);\n if (!originalColumnGroup) {\n return;\n }\n if (originalColumnGroup.isExpanded() === newValue) {\n return;\n }\n _this.logger.log('columnGroupOpened(' + originalColumnGroup.getGroupId() + ',' + newValue + ')');\n originalColumnGroup.setExpanded(newValue);\n impactedGroups.push(originalColumnGroup);\n });\n this.updateGroupsAndDisplayedColumns(source);\n this.setFirstRightAndLastLeftPinned(source);\n impactedGroups.forEach(function (originalColumnGroup) {\n var event = {\n type: Events.EVENT_COLUMN_GROUP_OPENED,\n columnGroup: originalColumnGroup,\n api: _this.gridApi,\n columnApi: _this.columnApi\n };\n _this.eventService.dispatchEvent(event);\n });\n this.columnAnimationService.finish();\n };\n // called by headerRenderer - when a header is opened or closed\n ColumnController.prototype.setColumnGroupOpened = function (key, newValue, source) {\n if (source === void 0) { source = \"api\"; }\n var keyAsString;\n if (key instanceof OriginalColumnGroup) {\n keyAsString = key.getId();\n }\n else {\n keyAsString = key || '';\n }\n this.setColumnGroupState([{ groupId: keyAsString, open: newValue }], source);\n };\n ColumnController.prototype.getOriginalColumnGroup = function (key) {\n if (key instanceof OriginalColumnGroup) {\n return key;\n }\n if (typeof key !== 'string') {\n console.error('AG Grid: group key must be a string');\n }\n // otherwise, search for the column group by id\n var res = null;\n this.columnUtils.depthFirstOriginalTreeSearch(null, this.gridBalancedTree, function (node) {\n if (node instanceof OriginalColumnGroup) {\n var originalColumnGroup = node;\n if (originalColumnGroup.getId() === key) {\n res = originalColumnGroup;\n }\n }\n });\n return res;\n };\n ColumnController.prototype.calculateColumnsForDisplay = function () {\n var _this = this;\n var columnsForDisplay;\n if (this.pivotMode && !this.secondaryColumnsPresent) {\n // pivot mode is on, but we are not pivoting, so we only\n // show columns we are aggregating on\n columnsForDisplay = this.gridColumns.filter(function (column) {\n var isAutoGroupCol = _this.groupAutoColumns && includes(_this.groupAutoColumns, column);\n var isValueCol = _this.valueColumns && includes(_this.valueColumns, column);\n return isAutoGroupCol || isValueCol;\n });\n }\n else {\n // otherwise continue as normal. this can be working on the primary\n // or secondary columns, whatever the gridColumns are set to\n columnsForDisplay = this.gridColumns.filter(function (column) {\n // keep col if a) it's auto-group or b) it's visible\n var isAutoGroupCol = _this.groupAutoColumns && includes(_this.groupAutoColumns, column);\n return isAutoGroupCol || column.isVisible();\n });\n }\n return columnsForDisplay;\n };\n ColumnController.prototype.checkColSpanActiveInCols = function (columns) {\n var result = false;\n columns.forEach(function (col) {\n if (exists(col.getColDef().colSpan)) {\n result = true;\n }\n });\n return result;\n };\n ColumnController.prototype.calculateColumnsForGroupDisplay = function () {\n var _this = this;\n this.groupDisplayColumns = [];\n var checkFunc = function (col) {\n var colDef = col.getColDef();\n if (colDef && exists(colDef.showRowGroup)) {\n _this.groupDisplayColumns.push(col);\n }\n };\n this.gridColumns.forEach(checkFunc);\n if (this.groupAutoColumns) {\n this.groupAutoColumns.forEach(checkFunc);\n }\n };\n ColumnController.prototype.getGroupDisplayColumns = function () {\n return this.groupDisplayColumns;\n };\n ColumnController.prototype.updateDisplayedColumns = function (source) {\n var columnsForDisplay = this.calculateColumnsForDisplay();\n this.buildDisplayedTrees(columnsForDisplay);\n this.calculateColumnsForGroupDisplay();\n // also called when group opened/closed\n this.updateGroupsAndDisplayedColumns(source);\n // also called when group opened/closed\n this.setFirstRightAndLastLeftPinned(source);\n };\n ColumnController.prototype.isSecondaryColumnsPresent = function () {\n return this.secondaryColumnsPresent;\n };\n ColumnController.prototype.setSecondaryColumns = function (colDefs, source) {\n if (source === void 0) { source = \"api\"; }\n var newColsPresent = colDefs && colDefs.length > 0;\n // if not cols passed, and we had to cols anyway, then do nothing\n if (!newColsPresent && !this.secondaryColumnsPresent) {\n return;\n }\n if (newColsPresent) {\n this.processSecondaryColumnDefinitions(colDefs);\n var balancedTreeResult = this.columnFactory.createColumnTree(colDefs, false);\n this.secondaryBalancedTree = balancedTreeResult.columnTree;\n this.secondaryHeaderRowCount = balancedTreeResult.treeDept + 1;\n this.secondaryColumns = this.getColumnsFromTree(this.secondaryBalancedTree);\n this.secondaryColumnsPresent = true;\n }\n else {\n this.secondaryBalancedTree = null;\n this.secondaryHeaderRowCount = -1;\n this.secondaryColumns = null;\n this.secondaryColumnsPresent = false;\n }\n this.updateGridColumns();\n this.updateDisplayedColumns(source);\n };\n ColumnController.prototype.processSecondaryColumnDefinitions = function (colDefs) {\n var columnCallback = this.gridOptionsWrapper.getProcessSecondaryColDefFunc();\n var groupCallback = this.gridOptionsWrapper.getProcessSecondaryColGroupDefFunc();\n if (!columnCallback && !groupCallback) {\n return undefined;\n }\n var searchForColDefs = function (colDefs2) {\n colDefs2.forEach(function (abstractColDef) {\n var isGroup = exists(abstractColDef.children);\n if (isGroup) {\n var colGroupDef = abstractColDef;\n if (groupCallback) {\n groupCallback(colGroupDef);\n }\n searchForColDefs(colGroupDef.children);\n }\n else {\n var colDef = abstractColDef;\n if (columnCallback) {\n columnCallback(colDef);\n }\n }\n });\n };\n if (colDefs) {\n searchForColDefs(colDefs);\n }\n };\n // called from: setColumnState, setColumnDefs, setSecondaryColumns\n ColumnController.prototype.updateGridColumns = function () {\n var _this = this;\n if (this.gridColsArePrimary) {\n this.lastPrimaryOrder = this.gridColumns;\n }\n if (this.secondaryColumns && this.secondaryBalancedTree) {\n this.gridBalancedTree = this.secondaryBalancedTree.slice();\n this.gridHeaderRowCount = this.secondaryHeaderRowCount;\n this.gridColumns = this.secondaryColumns.slice();\n this.gridColsArePrimary = false;\n }\n else {\n this.gridBalancedTree = this.primaryColumnTree.slice();\n this.gridHeaderRowCount = this.primaryHeaderRowCount;\n this.gridColumns = this.primaryColumns.slice();\n this.gridColsArePrimary = true;\n // updateGridColumns gets called after user adds a row group. we want to maintain the order of the columns\n // when this happens (eg if user moved a column) rather than revert back to the original column order.\n // likewise if changing in/out of pivot mode, we want to maintain the order of the primary cols\n this.orderGridColsLikeLastPrimary();\n }\n this.addAutoGroupToGridColumns();\n this.autoRowHeightColumns = this.gridColumns.filter(function (col) { return col.getColDef().autoHeight; });\n this.gridColumns = this.putFixedColumnsFirst(this.gridColumns);\n this.setupQuickFilterColumns();\n this.clearDisplayedAndViewportColumns();\n this.colSpanActive = this.checkColSpanActiveInCols(this.gridColumns);\n this.gridColumnsMap = {};\n this.gridColumns.forEach(function (col) { return _this.gridColumnsMap[col.getId()] = col; });\n var event = {\n type: Events.EVENT_GRID_COLUMNS_CHANGED,\n api: this.gridApi,\n columnApi: this.columnApi\n };\n this.eventService.dispatchEvent(event);\n };\n ColumnController.prototype.orderGridColsLikeLastPrimary = function () {\n if (missing(this.lastPrimaryOrder)) {\n return;\n }\n var lastPrimaryOrderMapped = new Map(this.lastPrimaryOrder.map(function (col, index) { return [col, index]; }));\n // only do the sort if at least one column is accounted for. columns will be not accounted for\n // if changing from secondary to primary columns\n var noColsFound = true;\n this.gridColumns.forEach(function (col) {\n if (lastPrimaryOrderMapped.has(col)) {\n noColsFound = false;\n }\n });\n if (noColsFound) {\n return;\n }\n // order cols in the same order as before. we need to make sure that all\n // cols still exists, so filter out any that no longer exist.\n var gridColsMap = new Map(this.gridColumns.map(function (col) { return [col, true]; }));\n var oldColsOrdered = this.lastPrimaryOrder.filter(function (col) { return gridColsMap.has(col); });\n var oldColsMap = new Map(oldColsOrdered.map(function (col) { return [col, true]; }));\n var newColsOrdered = this.gridColumns.filter(function (col) { return !oldColsMap.has(col); });\n // add in the new columns, at the end (if no group), or at the end of the group (if a group)\n var newGridColumns = oldColsOrdered.slice();\n newColsOrdered.forEach(function (newCol) {\n var parent = newCol.getOriginalParent();\n // if no parent, means we are not grouping, so just add the column to the end\n if (!parent) {\n newGridColumns.push(newCol);\n return;\n }\n // find the group the column belongs to. if no siblings at the current level (eg col in group on it's\n // own) then go up one level and look for siblings there.\n var siblings = [];\n while (!siblings.length && parent) {\n var leafCols = parent.getLeafColumns();\n leafCols.forEach(function (leafCol) {\n var presentInNewGriColumns = newGridColumns.indexOf(leafCol) >= 0;\n var noYetInSiblings = siblings.indexOf(leafCol) < 0;\n if (presentInNewGriColumns && noYetInSiblings) {\n siblings.push(leafCol);\n }\n });\n parent = parent.getOriginalParent();\n }\n // if no siblings exist at any level, this means the col is in a group (or parent groups) on it's own\n if (!siblings.length) {\n newGridColumns.push(newCol);\n return;\n }\n // find index of last column in the group\n var indexes = siblings.map(function (col) { return newGridColumns.indexOf(col); });\n var lastIndex = Math.max.apply(Math, indexes);\n insertIntoArray(newGridColumns, newCol, lastIndex + 1);\n });\n this.gridColumns = newGridColumns;\n };\n ColumnController.prototype.isPrimaryColumnGroupsPresent = function () {\n return this.primaryHeaderRowCount > 1;\n };\n // if we are using autoGroupCols, then they should be included for quick filter. this covers the\n // following scenarios:\n // a) user provides 'field' into autoGroupCol of normal grid, so now because a valid col to filter leafs on\n // b) using tree data and user depends on autoGroupCol for first col, and we also want to filter on this\n // (tree data is a bit different, as parent rows can be filtered on, unlike row grouping)\n ColumnController.prototype.setupQuickFilterColumns = function () {\n if (this.groupAutoColumns) {\n this.columnsForQuickFilter = this.primaryColumns.concat(this.groupAutoColumns);\n }\n else {\n this.columnsForQuickFilter = this.primaryColumns;\n }\n };\n ColumnController.prototype.putFixedColumnsFirst = function (cols) {\n var locked = cols.filter(function (c) { return c.getColDef().lockPosition; });\n var unlocked = cols.filter(function (c) { return !c.getColDef().lockPosition; });\n return locked.concat(unlocked);\n };\n ColumnController.prototype.addAutoGroupToGridColumns = function () {\n // add in auto-group here\n this.createGroupAutoColumnsIfNeeded();\n if (missing(this.groupAutoColumns)) {\n return;\n }\n this.gridColumns = this.groupAutoColumns ? this.groupAutoColumns.concat(this.gridColumns) : this.gridColumns;\n var autoColBalancedTree = this.columnFactory.createForAutoGroups(this.groupAutoColumns, this.gridBalancedTree);\n this.gridBalancedTree = autoColBalancedTree.concat(this.gridBalancedTree);\n };\n // gets called after we copy down grid columns, to make sure any part of the gui\n // that tries to draw, eg the header, it will get empty lists of columns rather\n // than stale columns. for example, the header will received gridColumnsChanged\n // event, so will try and draw, but it will draw successfully when it acts on the\n // virtualColumnsChanged event\n ColumnController.prototype.clearDisplayedAndViewportColumns = function () {\n this.displayedTreeLeft = [];\n this.displayedTreeRight = [];\n this.displayedTreeCentre = [];\n this.viewportRowLeft = {};\n this.viewportRowRight = {};\n this.viewportRowCenter = {};\n this.displayedColumnsLeft = [];\n this.displayedColumnsRight = [];\n this.displayedColumnsCenter = [];\n this.displayedColumns = [];\n this.viewportColumns = [];\n };\n ColumnController.prototype.updateGroupsAndDisplayedColumns = function (source) {\n this.updateOpenClosedVisibilityInColumnGroups();\n this.deriveDisplayedColumns(source);\n this.refreshFlexedColumns();\n this.extractViewport();\n this.updateBodyWidths();\n // this event is picked up by the gui, headerRenderer and rowRenderer, to recalculate what columns to display\n var event = {\n type: Events.EVENT_DISPLAYED_COLUMNS_CHANGED,\n api: this.gridApi,\n columnApi: this.columnApi\n };\n this.eventService.dispatchEvent(event);\n };\n ColumnController.prototype.deriveDisplayedColumns = function (source) {\n this.derivedDisplayedColumnsFromDisplayedTree(this.displayedTreeLeft, this.displayedColumnsLeft);\n this.derivedDisplayedColumnsFromDisplayedTree(this.displayedTreeCentre, this.displayedColumnsCenter);\n this.derivedDisplayedColumnsFromDisplayedTree(this.displayedTreeRight, this.displayedColumnsRight);\n this.joinDisplayedColumns();\n this.setLeftValues(source);\n };\n ColumnController.prototype.joinDisplayedColumns = function () {\n if (this.gridOptionsWrapper.isEnableRtl()) {\n this.displayedColumns = this.displayedColumnsRight\n .concat(this.displayedColumnsCenter)\n .concat(this.displayedColumnsLeft);\n }\n else {\n this.displayedColumns = this.displayedColumnsLeft\n .concat(this.displayedColumnsCenter)\n .concat(this.displayedColumnsRight);\n }\n };\n // sets the left pixel position of each column\n ColumnController.prototype.setLeftValues = function (source) {\n this.setLeftValuesOfColumns(source);\n this.setLeftValuesOfGroups();\n };\n ColumnController.prototype.setLeftValuesOfColumns = function (source) {\n var _this = this;\n // go through each list of displayed columns\n var allColumns = this.primaryColumns.slice(0);\n // let totalColumnWidth = this.getWidthOfColsInList()\n var doingRtl = this.gridOptionsWrapper.isEnableRtl();\n [\n this.displayedColumnsLeft,\n this.displayedColumnsRight,\n this.displayedColumnsCenter\n ].forEach(function (columns) {\n if (doingRtl) {\n // when doing RTL, we start at the top most pixel (ie RHS) and work backwards\n var left_1 = _this.getWidthOfColsInList(columns);\n columns.forEach(function (column) {\n left_1 -= column.getActualWidth();\n column.setLeft(left_1, source);\n });\n }\n else {\n // otherwise normal LTR, we start at zero\n var left_2 = 0;\n columns.forEach(function (column) {\n column.setLeft(left_2, source);\n left_2 += column.getActualWidth();\n });\n }\n removeAllFromArray(allColumns, columns);\n });\n // items left in allColumns are columns not displayed, so remove the left position. this is\n // important for the rows, as if a col is made visible, then taken out, then made visible again,\n // we don't want the animation of the cell floating in from the old position, whatever that was.\n allColumns.forEach(function (column) {\n column.setLeft(null, source);\n });\n };\n ColumnController.prototype.setLeftValuesOfGroups = function () {\n // a groups left value is the lest left value of it's children\n [\n this.displayedTreeLeft,\n this.displayedTreeRight,\n this.displayedTreeCentre\n ].forEach(function (columns) {\n columns.forEach(function (column) {\n if (column instanceof ColumnGroup) {\n var columnGroup = column;\n columnGroup.checkLeft();\n }\n });\n });\n };\n ColumnController.prototype.derivedDisplayedColumnsFromDisplayedTree = function (tree, columns) {\n columns.length = 0;\n this.columnUtils.depthFirstDisplayedColumnTreeSearch(tree, function (child) {\n if (child instanceof Column) {\n columns.push(child);\n }\n });\n };\n ColumnController.prototype.extractViewportColumns = function () {\n if (this.suppressColumnVirtualisation) {\n // no virtualisation, so don't filter\n this.viewportColumnsCenter = this.displayedColumnsCenter;\n }\n else {\n // filter out what should be visible\n this.viewportColumnsCenter = this.filterOutColumnsWithinViewport();\n }\n this.viewportColumns = this.viewportColumnsCenter\n .concat(this.displayedColumnsLeft)\n .concat(this.displayedColumnsRight);\n };\n ColumnController.prototype.getVirtualHeaderGroupRow = function (type, dept) {\n var result;\n switch (type) {\n case Constants.PINNED_LEFT:\n result = this.viewportRowLeft[dept];\n break;\n case Constants.PINNED_RIGHT:\n result = this.viewportRowRight[dept];\n break;\n default:\n result = this.viewportRowCenter[dept];\n break;\n }\n if (missing(result)) {\n result = [];\n }\n return result;\n };\n ColumnController.prototype.extractViewportRows = function () {\n // go through each group, see if any of it's cols are displayed, and if yes,\n // then this group is included\n this.viewportRowLeft = {};\n this.viewportRowRight = {};\n this.viewportRowCenter = {};\n // for easy lookup when building the groups.\n var virtualColIds = {};\n this.viewportColumns.forEach(function (col) { return virtualColIds[col.getId()] = true; });\n var testGroup = function (children, result, dept) {\n var returnValue = false;\n for (var i = 0; i < children.length; i++) {\n // see if this item is within viewport\n var child = children[i];\n var addThisItem = false;\n if (child instanceof Column) {\n // for column, test if column is included\n addThisItem = virtualColIds[child.getId()] === true;\n }\n else {\n // if group, base decision on children\n var columnGroup = child;\n var displayedChildren = columnGroup.getDisplayedChildren();\n if (displayedChildren) {\n addThisItem = testGroup(displayedChildren, result, dept + 1);\n }\n }\n if (addThisItem) {\n returnValue = true;\n if (!result[dept]) {\n result[dept] = [];\n }\n result[dept].push(child);\n }\n }\n return returnValue;\n };\n testGroup(this.displayedTreeLeft, this.viewportRowLeft, 0);\n testGroup(this.displayedTreeRight, this.viewportRowRight, 0);\n testGroup(this.displayedTreeCentre, this.viewportRowCenter, 0);\n };\n ColumnController.prototype.extractViewport = function () {\n this.extractViewportColumns();\n this.extractViewportRows();\n };\n ColumnController.prototype.filterOutColumnsWithinViewport = function () {\n return this.displayedColumnsCenter.filter(this.isColumnInViewport.bind(this));\n };\n ColumnController.prototype.refreshFlexedColumns = function (params) {\n var _this = this;\n if (params === void 0) { params = {}; }\n var source = params.source ? params.source : 'flex';\n if (params.viewportWidth != null) {\n this.flexViewportWidth = params.viewportWidth;\n }\n if (!this.flexViewportWidth) {\n return [];\n }\n // If the grid has left-over space, divide it between flexing columns in proportion to their flex value.\n // A \"flexing column\" is one that has a 'flex' value set and is not currently being constrained by its\n // minWidth or maxWidth rules.\n var flexAfterDisplayIndex = -1;\n if (params.resizingCols) {\n params.resizingCols.forEach(function (col) {\n var indexOfCol = _this.displayedColumnsCenter.indexOf(col);\n if (flexAfterDisplayIndex < indexOfCol) {\n flexAfterDisplayIndex = indexOfCol;\n }\n });\n }\n var isColFlex = function (col) {\n var afterResizingCols = _this.displayedColumnsCenter.indexOf(col) > flexAfterDisplayIndex;\n return col.getFlex() && afterResizingCols;\n };\n var knownWidthColumns = this.displayedColumnsCenter.filter(function (col) { return !isColFlex(col); });\n var flexingColumns = this.displayedColumnsCenter.filter(function (col) { return isColFlex(col); });\n var changedColumns = [];\n if (!flexingColumns.length) {\n return [];\n }\n var flexingColumnSizes = [];\n var spaceForFlexingColumns;\n outer: while (true) {\n var totalFlex = flexingColumns.reduce(function (count, col) { return count + col.getFlex(); }, 0);\n spaceForFlexingColumns = this.flexViewportWidth - this.getWidthOfColsInList(knownWidthColumns);\n for (var i = 0; i < flexingColumns.length; i++) {\n var col = flexingColumns[i];\n var widthByFlexRule = spaceForFlexingColumns * col.getFlex() / totalFlex;\n var constrainedWidth = 0;\n var minWidth = col.getMinWidth();\n var maxWidth = col.getMaxWidth();\n if (exists(minWidth) && widthByFlexRule < minWidth) {\n constrainedWidth = minWidth;\n }\n else if (exists(maxWidth) && widthByFlexRule > maxWidth) {\n constrainedWidth = maxWidth;\n }\n if (constrainedWidth) {\n // This column is not in fact flexing as it is being constrained to a specific size\n // so remove it from the list of flexing columns and start again\n col.setActualWidth(constrainedWidth, source);\n removeFromArray(flexingColumns, col);\n changedColumns.push(col);\n knownWidthColumns.push(col);\n continue outer;\n }\n flexingColumnSizes[i] = Math.round(widthByFlexRule);\n }\n break;\n }\n var remainingSpace = spaceForFlexingColumns;\n flexingColumns.forEach(function (col, i) {\n col.setActualWidth(Math.min(flexingColumnSizes[i], remainingSpace), source);\n changedColumns.push(col);\n remainingSpace -= flexingColumnSizes[i];\n });\n if (!params.skipSetLeft) {\n this.setLeftValues(source);\n }\n if (params.updateBodyWidths) {\n this.updateBodyWidths();\n }\n if (params.fireResizedEvent) {\n this.fireColumnResizedEvent(changedColumns, true, source, flexingColumns);\n }\n // if the user sets rowData directly into GridOptions, then the row data is set before\n // grid is attached to the DOM. this means the columns are not flexed, and then the rows\n // have the wrong height (as they depend on column widths). so once the columns have\n // been flexed for the first time (only happens once grid is attached to DOM, as dependency\n // on getting the grid width, which only happens after attached after ResizeObserver fires)\n // we get get rows to re-calc their heights.\n if (!this.flexColsCalculatedAtLestOnce) {\n if (this.gridOptionsWrapper.isRowModelDefault()) {\n this.rowModel.resetRowHeights();\n }\n this.flexColsCalculatedAtLestOnce = true;\n }\n return flexingColumns;\n };\n // called from api\n ColumnController.prototype.sizeColumnsToFit = function (gridWidth, source, silent) {\n if (source === void 0) { source = \"sizeColumnsToFit\"; }\n // avoid divide by zero\n var allDisplayedColumns = this.getAllDisplayedColumns();\n if (gridWidth <= 0 || !allDisplayedColumns.length) {\n return;\n }\n var colsToSpread = [];\n var colsToNotSpread = [];\n allDisplayedColumns.forEach(function (column) {\n if (column.getColDef().suppressSizeToFit === true) {\n colsToNotSpread.push(column);\n }\n else {\n colsToSpread.push(column);\n }\n });\n // make a copy of the cols that are going to be resized\n var colsToFireEventFor = colsToSpread.slice(0);\n var finishedResizing = false;\n var moveToNotSpread = function (column) {\n removeFromArray(colsToSpread, column);\n colsToNotSpread.push(column);\n };\n // resetting cols to their original width makes the sizeColumnsToFit more deterministic,\n // rather than depending on the current size of the columns. most users call sizeColumnsToFit\n // immediately after grid is created, so will make no difference. however if application is calling\n // sizeColumnsToFit repeatedly (eg after column group is opened / closed repeatedly) we don't want\n // the columns to start shrinking / growing over time.\n //\n // NOTE: the process below will assign values to `this.actualWidth` of each column without firing events\n // for this reason we need to manually fire resize events after the resize has been done for each column.\n colsToSpread.forEach(function (column) { return column.resetActualWidth(source); });\n while (!finishedResizing) {\n finishedResizing = true;\n var availablePixels = gridWidth - this.getWidthOfColsInList(colsToNotSpread);\n if (availablePixels <= 0) {\n // no width, set everything to minimum\n colsToSpread.forEach(function (column) {\n column.setMinimum(source);\n });\n }\n else {\n var scale = availablePixels / this.getWidthOfColsInList(colsToSpread);\n // we set the pixels for the last col based on what's left, as otherwise\n // we could be a pixel or two short or extra because of rounding errors.\n var pixelsForLastCol = availablePixels;\n // backwards through loop, as we are removing items as we go\n for (var i = colsToSpread.length - 1; i >= 0; i--) {\n var column = colsToSpread[i];\n var minWidth = column.getMinWidth();\n var maxWidth = column.getMaxWidth();\n var newWidth = Math.round(column.getActualWidth() * scale);\n if (exists(minWidth) && newWidth < minWidth) {\n newWidth = minWidth;\n moveToNotSpread(column);\n finishedResizing = false;\n }\n else if (exists(maxWidth) && column.isGreaterThanMax(newWidth)) {\n newWidth = maxWidth;\n moveToNotSpread(column);\n finishedResizing = false;\n }\n else if (i === 0) { // if this is the last column\n newWidth = pixelsForLastCol;\n }\n column.setActualWidth(newWidth, source, true);\n pixelsForLastCol -= newWidth;\n }\n }\n }\n // see notes above\n colsToFireEventFor.forEach(function (col) {\n col.fireColumnWidthChangedEvent(source);\n });\n this.setLeftValues(source);\n this.updateBodyWidths();\n if (silent) {\n return;\n }\n this.fireColumnResizedEvent(colsToFireEventFor, true, source);\n };\n ColumnController.prototype.buildDisplayedTrees = function (visibleColumns) {\n var leftVisibleColumns = [];\n var rightVisibleColumns = [];\n var centerVisibleColumns = [];\n visibleColumns.forEach(function (column) {\n switch (column.getPinned()) {\n case \"left\":\n leftVisibleColumns.push(column);\n break;\n case \"right\":\n rightVisibleColumns.push(column);\n break;\n default:\n centerVisibleColumns.push(column);\n break;\n }\n });\n var groupInstanceIdCreator = new GroupInstanceIdCreator();\n this.displayedTreeLeft = this.displayedGroupCreator.createDisplayedGroups(leftVisibleColumns, this.gridBalancedTree, groupInstanceIdCreator, Constants.PINNED_LEFT, this.displayedTreeLeft);\n this.displayedTreeRight = this.displayedGroupCreator.createDisplayedGroups(rightVisibleColumns, this.gridBalancedTree, groupInstanceIdCreator, Constants.PINNED_RIGHT, this.displayedTreeRight);\n this.displayedTreeCentre = this.displayedGroupCreator.createDisplayedGroups(centerVisibleColumns, this.gridBalancedTree, groupInstanceIdCreator, null, this.displayedTreeCentre);\n this.updateDisplayedMap();\n };\n ColumnController.prototype.updateDisplayedMap = function () {\n var _this = this;\n this.displayedColumnsAndGroupsMap = {};\n var func = function (child) {\n _this.displayedColumnsAndGroupsMap[child.getUniqueId()] = child;\n };\n this.columnUtils.depthFirstAllColumnTreeSearch(this.displayedTreeCentre, func);\n this.columnUtils.depthFirstAllColumnTreeSearch(this.displayedTreeLeft, func);\n this.columnUtils.depthFirstAllColumnTreeSearch(this.displayedTreeRight, func);\n };\n ColumnController.prototype.isDisplayed = function (item) {\n var fromMap = this.displayedColumnsAndGroupsMap[item.getUniqueId()];\n // check for reference, in case new column / group with same id is now present\n return fromMap === item;\n };\n ColumnController.prototype.updateOpenClosedVisibilityInColumnGroups = function () {\n var allColumnGroups = this.getAllDisplayedTrees();\n this.columnUtils.depthFirstAllColumnTreeSearch(allColumnGroups, function (child) {\n if (child instanceof ColumnGroup) {\n var columnGroup = child;\n columnGroup.calculateDisplayedColumns();\n }\n });\n };\n ColumnController.prototype.getGroupAutoColumns = function () {\n return this.groupAutoColumns;\n };\n ColumnController.prototype.createGroupAutoColumnsIfNeeded = function () {\n if (!this.autoGroupsNeedBuilding) {\n return;\n }\n this.autoGroupsNeedBuilding = false;\n var groupFullWidthRow = this.gridOptionsWrapper.isGroupUseEntireRow(this.pivotMode);\n // we need to allow suppressing auto-column separately for group and pivot as the normal situation\n // is CSRM and user provides group column themselves for normal view, but when they go into pivot the\n // columns are generated by the grid so no opportunity for user to provide group column. so need a way\n // to suppress auto-col for grouping only, and not pivot.\n // however if using Viewport RM or SSRM and user is providing the columns, the user may wish full control\n // of the group column in this instance.\n var suppressAutoColumn = this.pivotMode ?\n this.gridOptionsWrapper.isPivotSuppressAutoColumn() : this.gridOptionsWrapper.isGroupSuppressAutoColumn();\n var groupingActive = this.rowGroupColumns.length > 0 || this.usingTreeData;\n var needAutoColumns = groupingActive && !suppressAutoColumn && !groupFullWidthRow;\n if (needAutoColumns) {\n var newAutoGroupCols = this.autoGroupColService.createAutoGroupColumns(this.rowGroupColumns);\n var autoColsDifferent = !this.autoColsEqual(newAutoGroupCols, this.groupAutoColumns);\n // we force recreate when suppressColumnStateEvents changes, so new group cols pick up the new\n // definitions. otherwise we could ignore the new cols because they appear to be the same.\n if (autoColsDifferent || this.forceRecreateAutoGroups) {\n this.groupAutoColumns = newAutoGroupCols;\n }\n }\n else {\n this.groupAutoColumns = null;\n }\n };\n ColumnController.prototype.autoColsEqual = function (colsA, colsB) {\n return areEqual(colsA, colsB, function (a, b) { return a.getColId() === b.getColId(); });\n };\n ColumnController.prototype.getWidthOfColsInList = function (columnList) {\n return columnList.reduce(function (width, col) { return width + col.getActualWidth(); }, 0);\n };\n ColumnController.prototype.getGridBalancedTree = function () {\n return this.gridBalancedTree;\n };\n ColumnController.prototype.hasFloatingFilters = function () {\n var defaultColDef = this.gridOptionsWrapper.getDefaultColDef();\n return (defaultColDef != null && defaultColDef.floatingFilter === true) ||\n (this.columnDefs != null && this.columnDefs.some(function (c) { return c.floatingFilter === true; }));\n };\n ColumnController.prototype.getFirstDisplayedColumn = function () {\n var isRtl = this.gridOptionsWrapper.isEnableRtl();\n var queryOrder = [\n 'getDisplayedLeftColumns',\n 'getDisplayedCenterColumns',\n 'getDisplayedRightColumns'\n ];\n if (isRtl) {\n queryOrder.reverse();\n }\n for (var i = 0; i < queryOrder.length; i++) {\n var container = this[queryOrder[i]]();\n if (container.length) {\n return isRtl ? last(container) : container[0];\n }\n }\n return null;\n };\n __decorate$5([\n Autowired('expressionService')\n ], ColumnController.prototype, \"expressionService\", void 0);\n __decorate$5([\n Autowired('columnFactory')\n ], ColumnController.prototype, \"columnFactory\", void 0);\n __decorate$5([\n Autowired('displayedGroupCreator')\n ], ColumnController.prototype, \"displayedGroupCreator\", void 0);\n __decorate$5([\n Autowired('autoWidthCalculator')\n ], ColumnController.prototype, \"autoWidthCalculator\", void 0);\n __decorate$5([\n Autowired('columnUtils')\n ], ColumnController.prototype, \"columnUtils\", void 0);\n __decorate$5([\n Autowired('columnAnimationService')\n ], ColumnController.prototype, \"columnAnimationService\", void 0);\n __decorate$5([\n Autowired('autoGroupColService')\n ], ColumnController.prototype, \"autoGroupColService\", void 0);\n __decorate$5([\n Optional('aggFuncService')\n ], ColumnController.prototype, \"aggFuncService\", void 0);\n __decorate$5([\n Optional('valueCache')\n ], ColumnController.prototype, \"valueCache\", void 0);\n __decorate$5([\n Optional('animationFrameService')\n ], ColumnController.prototype, \"animationFrameService\", void 0);\n __decorate$5([\n Autowired('rowModel')\n ], ColumnController.prototype, \"rowModel\", void 0);\n __decorate$5([\n Autowired('columnApi')\n ], ColumnController.prototype, \"columnApi\", void 0);\n __decorate$5([\n Autowired('gridApi')\n ], ColumnController.prototype, \"gridApi\", void 0);\n __decorate$5([\n Autowired('sortController')\n ], ColumnController.prototype, \"sortController\", void 0);\n __decorate$5([\n Autowired('columnDefFactory')\n ], ColumnController.prototype, \"columnDefFactory\", void 0);\n __decorate$5([\n PostConstruct\n ], ColumnController.prototype, \"init\", null);\n __decorate$5([\n __param$2(0, Qualifier('loggerFactory'))\n ], ColumnController.prototype, \"setBeans\", null);\n ColumnController = __decorate$5([\n Bean('columnController')\n ], ColumnController);\n return ColumnController;\n}(BeanStub));\n\n/**\n * @ag-grid-community/core - Advanced Data Grid / Data Table supporting Javascript / React / AngularJS / Web Components\n * @version v25.1.0\n * @link http://www.ag-grid.com/\n * @license MIT\n */\nfunction padStart(value, totalStringSize) {\n var asString = \"\" + value;\n while (asString.length < totalStringSize) {\n asString = \"0\" + asString;\n }\n return asString;\n}\nfunction createArrayOfNumbers(first, last) {\n var result = [];\n for (var i = first; i <= last; i++) {\n result.push(i);\n }\n return result;\n}\n/**\n * Check if a value is numeric\n * from http://stackoverflow.com/questions/9716468/is-there-any-function-like-isnumeric-in-javascript-to-validate-numbers\n * @param {any} value\n * @return {boolean}\n */\nfunction isNumeric(value) {\n return value !== '' && !isNaN(parseFloat(value)) && isFinite(value);\n}\nfunction getMaxSafeInteger() {\n // eslint-disable-next-line\n return Number.MAX_SAFE_INTEGER || 9007199254740991;\n}\nfunction cleanNumber(value) {\n if (typeof value === 'string') {\n value = parseInt(value, 10);\n }\n if (typeof value === 'number') {\n return Math.floor(value);\n }\n return null;\n}\nfunction decToHex(number, bytes) {\n var hex = '';\n for (var i = 0; i < bytes; i++) {\n hex += String.fromCharCode(number & 0xff);\n number >>>= 8;\n }\n return hex;\n}\nfunction formatNumberTwoDecimalPlacesAndCommas(value) {\n if (typeof value !== 'number') {\n return '';\n }\n return formatNumberCommas(Math.round(value * 100) / 100);\n}\n/**\n * the native method number.toLocaleString(undefined, {minimumFractionDigits: 0})\n * puts in decimal places in IE, so we use this method instead\n * from: http://blog.tompawlak.org/number-currency-formatting-javascript\n * @param {number} value\n * @returns {string}\n */\nfunction formatNumberCommas(value) {\n if (typeof value !== 'number') {\n return '';\n }\n return value.toString().replace(/(\\d)(?=(\\d{3})+(?!\\d))/g, \"$1,\");\n}\nfunction sum(values) {\n return values == null ? null : values.reduce(function (total, value) { return total + value; }, 0);\n}\n\nvar NumberUtils = /*#__PURE__*/Object.freeze({\n __proto__: null,\n padStart: padStart,\n createArrayOfNumbers: createArrayOfNumbers,\n isNumeric: isNumeric,\n getMaxSafeInteger: getMaxSafeInteger,\n cleanNumber: cleanNumber,\n decToHex: decToHex,\n formatNumberTwoDecimalPlacesAndCommas: formatNumberTwoDecimalPlacesAndCommas,\n formatNumberCommas: formatNumberCommas,\n sum: sum\n});\n\n/**\n * @ag-grid-community/core - Advanced Data Grid / Data Table supporting Javascript / React / AngularJS / Web Components\n * @version v25.1.0\n * @link http://www.ag-grid.com/\n * @license MIT\n */\nvar __extends$2 = (undefined && undefined.__extends) || (function () {\n var extendStatics = function (d, b) {\n extendStatics = Object.setPrototypeOf ||\n ({ __proto__: [] } instanceof Array && function (d, b) { d.__proto__ = b; }) ||\n function (d, b) { for (var p in b) if (b.hasOwnProperty(p)) d[p] = b[p]; };\n return extendStatics(d, b);\n };\n return function (d, b) {\n extendStatics(d, b);\n function __() { this.constructor = d; }\n d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __());\n };\n})();\nvar __decorate$6 = (undefined && undefined.__decorate) || function (decorators, target, key, desc) {\n var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d;\n if (typeof Reflect === \"object\" && typeof Reflect.decorate === \"function\") r = Reflect.decorate(decorators, target, key, desc);\n else for (var i = decorators.length - 1; i >= 0; i--) if (d = decorators[i]) r = (c < 3 ? d(r) : c > 3 ? d(target, key, r) : d(target, key)) || r;\n return c > 3 && r && Object.defineProperty(target, key, r), r;\n};\n// takes in a list of columns, as specified by the column definitions, and returns column groups\nvar ColumnUtils = /** @class */ (function (_super) {\n __extends$2(ColumnUtils, _super);\n function ColumnUtils() {\n return _super !== null && _super.apply(this, arguments) || this;\n }\n ColumnUtils.prototype.calculateColInitialWidth = function (colDef) {\n var optionsWrapper = this.gridOptionsWrapper;\n var minColWidth = colDef.minWidth != null ? colDef.minWidth : optionsWrapper.getMinColWidth();\n var maxColWidth = colDef.maxWidth != null ? colDef.maxWidth : (optionsWrapper.getMaxColWidth() || getMaxSafeInteger());\n var width;\n var colDefWidth = attrToNumber(colDef.width);\n var colDefInitialWidth = attrToNumber(colDef.initialWidth);\n if (colDefWidth != null) {\n width = colDefWidth;\n }\n else if (colDefInitialWidth != null) {\n width = colDefInitialWidth;\n }\n else {\n width = optionsWrapper.getColWidth();\n }\n return Math.max(Math.min(width, maxColWidth), minColWidth);\n };\n ColumnUtils.prototype.getOriginalPathForColumn = function (column, originalBalancedTree) {\n var result = [];\n var found = false;\n var recursePath = function (balancedColumnTree, dept) {\n for (var i = 0; i < balancedColumnTree.length; i++) {\n if (found) {\n return;\n }\n // quit the search, so 'result' is kept with the found result\n var node = balancedColumnTree[i];\n if (node instanceof OriginalColumnGroup) {\n var nextNode = node;\n recursePath(nextNode.getChildren(), dept + 1);\n result[dept] = node;\n }\n else if (node === column) {\n found = true;\n }\n }\n };\n recursePath(originalBalancedTree, 0);\n // we should always find the path, but in case there is a bug somewhere, returning null\n // will make it fail rather than provide a 'hard to track down' bug\n return found ? result : null;\n };\n ColumnUtils.prototype.depthFirstOriginalTreeSearch = function (parent, tree, callback) {\n var _this = this;\n if (!tree) {\n return;\n }\n tree.forEach(function (child) {\n if (child instanceof OriginalColumnGroup) {\n _this.depthFirstOriginalTreeSearch(child, child.getChildren(), callback);\n }\n callback(child, parent);\n });\n };\n ColumnUtils.prototype.depthFirstAllColumnTreeSearch = function (tree, callback) {\n var _this = this;\n if (!tree) {\n return;\n }\n tree.forEach(function (child) {\n if (child instanceof ColumnGroup) {\n _this.depthFirstAllColumnTreeSearch(child.getChildren(), callback);\n }\n callback(child);\n });\n };\n ColumnUtils.prototype.depthFirstDisplayedColumnTreeSearch = function (tree, callback) {\n var _this = this;\n if (!tree) {\n return;\n }\n tree.forEach(function (child) {\n if (child instanceof ColumnGroup) {\n _this.depthFirstDisplayedColumnTreeSearch(child.getDisplayedChildren(), callback);\n }\n callback(child);\n });\n };\n ColumnUtils = __decorate$6([\n Bean('columnUtils')\n ], ColumnUtils);\n return ColumnUtils;\n}(BeanStub));\n\n/**\n * @ag-grid-community/core - Advanced Data Grid / Data Table supporting Javascript / React / AngularJS / Web Components\n * @version v25.1.0\n * @link http://www.ag-grid.com/\n * @license MIT\n */\nvar __extends$3 = (undefined && undefined.__extends) || (function () {\n var extendStatics = function (d, b) {\n extendStatics = Object.setPrototypeOf ||\n ({ __proto__: [] } instanceof Array && function (d, b) { d.__proto__ = b; }) ||\n function (d, b) { for (var p in b) if (b.hasOwnProperty(p)) d[p] = b[p]; };\n return extendStatics(d, b);\n };\n return function (d, b) {\n extendStatics(d, b);\n function __() { this.constructor = d; }\n d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __());\n };\n})();\nvar __decorate$7 = (undefined && undefined.__decorate) || function (decorators, target, key, desc) {\n var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d;\n if (typeof Reflect === \"object\" && typeof Reflect.decorate === \"function\") r = Reflect.decorate(decorators, target, key, desc);\n else for (var i = decorators.length - 1; i >= 0; i--) if (d = decorators[i]) r = (c < 3 ? d(r) : c > 3 ? d(target, key, r) : d(target, key)) || r;\n return c > 3 && r && Object.defineProperty(target, key, r), r;\n};\n// takes in a list of columns, as specified by the column definitions, and returns column groups\nvar DisplayedGroupCreator = /** @class */ (function (_super) {\n __extends$3(DisplayedGroupCreator, _super);\n function DisplayedGroupCreator() {\n return _super !== null && _super.apply(this, arguments) || this;\n }\n DisplayedGroupCreator.prototype.createDisplayedGroups = function (\n // all displayed columns sorted - this is the columns the grid should show\n sortedVisibleColumns, \n // the tree of columns, as provided by the users, used to know what groups columns roll up into\n balancedColumnTree, \n // creates unique id's for the group\n groupInstanceIdCreator, \n // whether it's left, right or center col\n pinned, \n // we try to reuse old groups if we can, to allow gui to do animation\n oldDisplayedGroups) {\n var _this = this;\n var result = [];\n var previousRealPath;\n var previousOriginalPath;\n var oldColumnsMapped = this.mapOldGroupsById(oldDisplayedGroups);\n // go through each column, then do a bottom up comparison to the previous column, and start\n // to share groups if they converge at any point.\n sortedVisibleColumns.forEach(function (currentColumn) {\n var currentOriginalPath = _this.getOriginalPathForColumn(balancedColumnTree, currentColumn);\n var currentRealPath = [];\n var firstColumn = !previousOriginalPath;\n for (var i = 0; i < currentOriginalPath.length; i++) {\n if (firstColumn || currentOriginalPath[i] !== previousOriginalPath[i]) {\n // new group needed\n var newGroup = _this.createColumnGroup(currentOriginalPath[i], groupInstanceIdCreator, oldColumnsMapped, pinned);\n currentRealPath[i] = newGroup;\n // if top level, add to result, otherwise add to parent\n if (i == 0) {\n result.push(newGroup);\n }\n else {\n currentRealPath[i - 1].addChild(newGroup);\n }\n }\n else {\n // reuse old group\n currentRealPath[i] = previousRealPath[i];\n }\n }\n var noColumnGroups = currentRealPath.length === 0;\n if (noColumnGroups) {\n // if we are not grouping, then the result of the above is an empty\n // path (no groups), and we just add the column to the root list.\n result.push(currentColumn);\n }\n else {\n var leafGroup = last(currentRealPath);\n leafGroup.addChild(currentColumn);\n }\n previousRealPath = currentRealPath;\n previousOriginalPath = currentOriginalPath;\n });\n this.setupParentsIntoColumns(result, null);\n return result;\n };\n DisplayedGroupCreator.prototype.createColumnGroup = function (originalGroup, groupInstanceIdCreator, oldColumnsMapped, pinned) {\n var groupId = originalGroup.getGroupId();\n var instanceId = groupInstanceIdCreator.getInstanceIdForKey(groupId);\n var uniqueId = ColumnGroup.createUniqueId(groupId, instanceId);\n var columnGroup = oldColumnsMapped[uniqueId];\n // if the user is setting new colDefs, it is possible that the id's overlap, and we\n // would have a false match from above. so we double check we are talking about the\n // same original column group.\n if (columnGroup && columnGroup.getOriginalColumnGroup() !== originalGroup) {\n columnGroup = null;\n }\n if (exists(columnGroup)) {\n // clean out the old column group here, as we will be adding children into it again\n columnGroup.reset();\n }\n else {\n columnGroup = new ColumnGroup(originalGroup, groupId, instanceId, pinned);\n this.context.createBean(columnGroup);\n }\n return columnGroup;\n };\n // returns back a 2d map of ColumnGroup as follows: groupId -> instanceId -> ColumnGroup\n DisplayedGroupCreator.prototype.mapOldGroupsById = function (displayedGroups) {\n var result = {};\n var recursive = function (columnsOrGroups) {\n columnsOrGroups.forEach(function (columnOrGroup) {\n if (columnOrGroup instanceof ColumnGroup) {\n var columnGroup = columnOrGroup;\n result[columnOrGroup.getUniqueId()] = columnGroup;\n recursive(columnGroup.getChildren());\n }\n });\n };\n if (displayedGroups) {\n recursive(displayedGroups);\n }\n return result;\n };\n DisplayedGroupCreator.prototype.setupParentsIntoColumns = function (columnsOrGroups, parent) {\n var _this = this;\n columnsOrGroups.forEach(function (columnsOrGroup) {\n columnsOrGroup.setParent(parent);\n if (columnsOrGroup instanceof ColumnGroup) {\n var columnGroup = columnsOrGroup;\n _this.setupParentsIntoColumns(columnGroup.getChildren(), columnGroup);\n }\n });\n };\n DisplayedGroupCreator.prototype.getOriginalPathForColumn = function (balancedColumnTree, column) {\n var result = [];\n var found = false;\n var recursePath = function (columnTree, dept) {\n for (var i = 0; i < columnTree.length; i++) {\n // quit the search, so 'result' is kept with the found result\n if (found) {\n return;\n }\n var node = columnTree[i];\n if (node instanceof OriginalColumnGroup) {\n var nextNode = node;\n recursePath(nextNode.getChildren(), dept + 1);\n result[dept] = node;\n }\n else if (node === column) {\n found = true;\n }\n }\n };\n recursePath(balancedColumnTree, 0);\n // it's possible we didn't find a path. this happens if the column is generated\n // by the grid (auto-group), in that the definition didn't come from the client. in this case,\n // we create a fake original path.\n if (found) {\n return result;\n }\n console.warn('could not get path');\n return null;\n };\n __decorate$7([\n Autowired('columnUtils')\n ], DisplayedGroupCreator.prototype, \"columnUtils\", void 0);\n DisplayedGroupCreator = __decorate$7([\n Bean('displayedGroupCreator')\n ], DisplayedGroupCreator);\n return DisplayedGroupCreator;\n}(BeanStub));\n\n/**\n * @ag-grid-community/core - Advanced Data Grid / Data Table supporting Javascript / React / AngularJS / Web Components\n * @version v25.1.0\n * @link http://www.ag-grid.com/\n * @license MIT\n */\nvar __spreadArrays = (undefined && undefined.__spreadArrays) || function () {\n for (var s = 0, i = 0, il = arguments.length; i < il; i++) s += arguments[i].length;\n for (var r = Array(s), k = 0, i = 0; i < il; i++)\n for (var a = arguments[i], j = 0, jl = a.length; j < jl; j++, k++)\n r[k] = a[j];\n return r;\n};\n/**\n * These keys are used for validating properties supplied on a gridOptions object, and for code generation.\n * If you change the properties on the gridOptions interface, you *must* update this file as well to be consistent.\n */\nvar PropertyKeys = /** @class */ (function () {\n function PropertyKeys() {\n }\n PropertyKeys.STRING_PROPERTIES = [\n 'sortingOrder', 'rowClass', 'rowSelection', 'overlayLoadingTemplate', 'overlayNoRowsTemplate',\n 'quickFilterText', 'rowModelType', 'editType', 'domLayout', 'clipboardDeliminator', 'rowGroupPanelShow',\n 'multiSortKey', 'pivotColumnGroupTotals', 'pivotRowTotals', 'pivotPanelShow', 'fillHandleDirection',\n 'serverSideStoreType'\n ];\n PropertyKeys.OBJECT_PROPERTIES = [\n 'components', 'frameworkComponents', 'rowStyle', 'context', 'autoGroupColumnDef', 'localeText', 'icons',\n 'datasource', 'serverSideDatasource', 'viewportDatasource', 'groupRowRendererParams', 'aggFuncs',\n 'fullWidthCellRendererParams', 'defaultColGroupDef', 'defaultColDef', 'defaultExportParams', 'columnTypes',\n 'rowClassRules', 'detailGridOptions', 'detailCellRendererParams', 'loadingCellRendererParams',\n 'loadingOverlayComponentParams', 'noRowsOverlayComponentParams', 'popupParent', 'colResizeDefault',\n 'reduxStore', 'statusBar', 'sideBar', 'chartThemeOverrides', 'customChartThemes'\n ];\n PropertyKeys.ARRAY_PROPERTIES = [\n 'alignedGrids', 'rowData', 'columnDefs', 'excelStyles', 'pinnedTopRowData', 'pinnedBottomRowData', 'chartThemes'\n ];\n PropertyKeys.NUMBER_PROPERTIES = [\n 'rowHeight', 'detailRowHeight', 'rowBuffer', 'colWidth', 'headerHeight', 'groupHeaderHeight', 'floatingFiltersHeight',\n 'pivotHeaderHeight', 'pivotGroupHeaderHeight', 'groupDefaultExpanded', 'minColWidth', 'maxColWidth', 'viewportRowModelPageSize',\n 'viewportRowModelBufferSize', 'autoSizePadding', 'maxBlocksInCache', 'maxConcurrentDatasourceRequests', 'tooltipShowDelay',\n 'cacheOverflowSize', 'paginationPageSize', 'cacheBlockSize', 'infiniteInitialRowCount', 'scrollbarWidth',\n 'batchUpdateWaitMillis', 'asyncTransactionWaitMillis', 'blockLoadDebounceMillis', 'keepDetailRowsCount',\n 'undoRedoCellEditingLimit', 'cellFlashDelay', 'cellFadeDelay'\n ];\n PropertyKeys.BOOLEAN_PROPERTIES = [\n 'suppressMakeColumnVisibleAfterUnGroup', 'suppressRowClickSelection', 'suppressCellSelection', 'suppressHorizontalScroll',\n 'alwaysShowHorizontalScroll', 'alwaysShowVerticalScroll', 'debug', 'enableBrowserTooltips', 'enableCellExpressions',\n 'angularCompileRows', 'angularCompileFilters', 'groupSuppressAutoColumn', 'groupSelectsChildren', 'groupIncludeFooter',\n 'groupIncludeTotalFooter', 'groupUseEntireRow', 'groupSuppressBlankHeader', 'suppressMenuHide', 'suppressRowDeselection',\n 'unSortIcon', 'suppressMultiSort', 'singleClickEdit', 'suppressLoadingOverlay', 'suppressNoRowsOverlay', 'suppressAutoSize',\n 'skipHeaderOnAutoSize', 'suppressParentsInRowNodes', 'suppressColumnMoveAnimation', 'suppressMovableColumns',\n 'suppressFieldDotNotation', 'enableRangeSelection', 'enableRangeHandle', 'enableFillHandle', 'suppressClearOnFillReduction',\n 'deltaSort', 'suppressTouch', 'suppressAsyncEvents', 'allowContextMenuWithControlKey', 'suppressContextMenu',\n 'rememberGroupStateWhenNewData', 'enableCellChangeFlash', 'suppressDragLeaveHidesColumns', 'suppressMiddleClickScrolls',\n 'suppressPreventDefaultOnMouseWheel', 'suppressCopyRowsToClipboard', 'copyHeadersToClipboard', 'pivotMode',\n 'suppressAggFuncInHeader', 'suppressColumnVirtualisation', 'suppressAggAtRootLevel', 'suppressFocusAfterRefresh',\n 'functionsPassive', 'functionsReadOnly', 'animateRows', 'groupSelectsFiltered', 'groupRemoveSingleChildren',\n 'groupRemoveLowestSingleChildren', 'enableRtl', 'suppressClickEdit', 'rowDragManaged', 'suppressRowDrag',\n 'suppressMoveWhenRowDragging', 'enableMultiRowDragging', 'enableGroupEdit', 'embedFullWidthRows', 'deprecatedEmbedFullWidthRows',\n 'suppressPaginationPanel', 'floatingFilter', 'groupHideOpenParents', 'groupMultiAutoColumn', 'pagination',\n 'stopEditingWhenGridLosesFocus', 'paginationAutoPageSize', 'suppressScrollOnNewData', 'purgeClosedRowNodes', 'cacheQuickFilter',\n 'deltaRowDataMode', 'ensureDomOrder', 'accentedSort', 'suppressChangeDetection', 'valueCache', 'valueCacheNeverExpires',\n 'aggregateOnlyChangedColumns', 'suppressAnimationFrame', 'suppressExcelExport', 'suppressCsvExport', 'treeData',\n 'masterDetail', 'suppressMultiRangeSelection', 'enterMovesDownAfterEdit', 'enterMovesDown', 'suppressPropertyNamesCheck',\n 'rowMultiSelectWithClick', 'suppressEnterpriseResetOnNewColumns', 'enableOldSetFilterModel', 'suppressRowHoverHighlight',\n 'suppressRowTransform', 'suppressClipboardPaste', 'suppressLastEmptyLineOnPaste', 'serverSideSortingAlwaysResets',\n 'reactNext', 'suppressSetColumnStateEvents', 'suppressColumnStateEvents', 'enableCharts', 'deltaColumnMode', 'suppressMaintainUnsortedOrder',\n 'enableCellTextSelection', 'suppressBrowserResizeObserver', 'suppressMaxRenderedRowRestriction',\n 'excludeChildrenWhenTreeDataFiltering', 'tooltipMouseTrack', 'keepDetailRows', 'paginateChildRows', 'preventDefaultOnContextMenu',\n 'undoRedoCellEditing', 'allowDragFromColumnsToolPanel', 'immutableData', 'immutableColumns', 'pivotSuppressAutoColumn',\n 'suppressExpandablePivotGroups', 'applyColumnDefOrder', 'debounceVerticalScrollbar', 'detailRowAutoHeight',\n 'serverSideFilteringAlwaysResets', 'suppressAggFilteredOnly', 'showOpenedGroup', 'suppressClipboardApi',\n 'suppressModelUpdateAfterUpdateTransaction'\n ];\n /** You do not need to include event callbacks in this list, as they are generated automatically. */\n PropertyKeys.FUNCTION_PROPERTIES = [\n 'localeTextFunc', 'groupRowInnerRenderer', 'groupRowInnerRendererFramework', 'dateComponent', 'dateComponentFramework', 'groupRowRenderer',\n 'groupRowRendererFramework', 'isExternalFilterPresent', 'getRowHeight', 'doesExternalFilterPass', 'getRowClass', 'getRowStyle',\n 'getRowClassRules', 'traverseNode', 'getContextMenuItems', 'getMainMenuItems', 'processRowPostCreate', 'processCellForClipboard',\n 'groupRowAggNodes', 'getRowNodeId', 'isFullWidthCell', 'fullWidthCellRenderer', 'fullWidthCellRendererFramework', 'processSecondaryColDef',\n 'processSecondaryColGroupDef', 'getBusinessKeyForNode', 'sendToClipboard', 'navigateToNextHeader', 'tabToNextHeader', 'navigateToNextCell',\n 'tabToNextCell', 'getDetailRowData', 'processCellFromClipboard', 'getDocument', 'postProcessPopup', 'getChildCount', 'getDataPath',\n 'loadingCellRenderer', 'loadingCellRendererFramework', 'loadingOverlayComponent', 'loadingOverlayComponentFramework', 'noRowsOverlayComponent',\n 'noRowsOverlayComponentFramework', 'detailCellRenderer', 'detailCellRendererFramework', 'defaultGroupSortComparator', 'isRowMaster',\n 'isRowSelectable', 'postSort', 'processHeaderForClipboard', 'paginationNumberFormatter', 'processDataFromClipboard', 'getServerSideGroupKey',\n 'isServerSideGroup', 'suppressKeyboardEvent', 'createChartContainer', 'processChartOptions', 'getChartToolbarItems', 'fillOperation',\n 'isApplyServerSideTransaction', 'getServerSideStoreParams', 'isServerSideGroupOpenByDefault'\n ];\n PropertyKeys.ALL_PROPERTIES = __spreadArrays(PropertyKeys.ARRAY_PROPERTIES, PropertyKeys.OBJECT_PROPERTIES, PropertyKeys.STRING_PROPERTIES, PropertyKeys.NUMBER_PROPERTIES, PropertyKeys.FUNCTION_PROPERTIES, PropertyKeys.BOOLEAN_PROPERTIES);\n /**\n * Used when performing property checks. This avoids noise caused when using frameworks, which can add their own\n * framework-specific properties to colDefs, gridOptions etc.\n */\n PropertyKeys.FRAMEWORK_PROPERTIES = [\n '__ob__', '__v_skip', '__metadata__', 'mappedColumnProperties', 'hasChildColumns', 'toColDef', 'createColDefFromGridColumn'\n ];\n return PropertyKeys;\n}());\n\n/**\n * @ag-grid-community/core - Advanced Data Grid / Data Table supporting Javascript / React / AngularJS / Web Components\n * @version v25.1.0\n * @link http://www.ag-grid.com/\n * @license MIT\n */\nvar __spreadArrays$1 = (undefined && undefined.__spreadArrays) || function () {\n for (var s = 0, i = 0, il = arguments.length; i < il; i++) s += arguments[i].length;\n for (var r = Array(s), k = 0, i = 0; i < il; i++)\n for (var a = arguments[i], j = 0, jl = a.length; j < jl; j++, k++)\n r[k] = a[j];\n return r;\n};\nvar ComponentUtil = /** @class */ (function () {\n function ComponentUtil() {\n }\n ComponentUtil.getEventCallbacks = function () {\n if (!ComponentUtil.EVENT_CALLBACKS) {\n ComponentUtil.EVENT_CALLBACKS = ComponentUtil.EVENTS.map(function (event) { return ComponentUtil.getCallbackForEvent(event); });\n }\n return ComponentUtil.EVENT_CALLBACKS;\n };\n ComponentUtil.copyAttributesToGridOptions = function (gridOptions, component, skipEventDeprecationCheck) {\n // create empty grid options if none were passed\n if (typeof gridOptions !== 'object') {\n gridOptions = {};\n }\n // to allow array style lookup in TypeScript, take type away from 'this' and 'gridOptions'\n var pGridOptions = gridOptions;\n var keyExists = function (key) { return typeof component[key] !== 'undefined'; };\n // add in all the simple properties\n __spreadArrays$1(ComponentUtil.ARRAY_PROPERTIES, ComponentUtil.STRING_PROPERTIES, ComponentUtil.OBJECT_PROPERTIES, ComponentUtil.FUNCTION_PROPERTIES, ComponentUtil.getEventCallbacks()).filter(keyExists)\n .forEach(function (key) { return pGridOptions[key] = component[key]; });\n ComponentUtil.BOOLEAN_PROPERTIES\n .filter(keyExists)\n .forEach(function (key) { return pGridOptions[key] = ComponentUtil.toBoolean(component[key]); });\n ComponentUtil.NUMBER_PROPERTIES\n .filter(keyExists)\n .forEach(function (key) { return pGridOptions[key] = ComponentUtil.toNumber(component[key]); });\n return gridOptions;\n };\n ComponentUtil.getCallbackForEvent = function (eventName) {\n if (!eventName || eventName.length < 2) {\n return eventName;\n }\n return 'on' + eventName[0].toUpperCase() + eventName.substr(1);\n };\n ComponentUtil.processOnChange = function (changes, gridOptions, api, columnApi) {\n if (!changes) {\n return;\n }\n // to allow array style lookup in TypeScript, take type away from 'this' and 'gridOptions'\n var pGridOptions = gridOptions;\n var keyExists = function (key) { return changes[key]; };\n // check if any change for the simple types, and if so, then just copy in the new value\n __spreadArrays$1(ComponentUtil.ARRAY_PROPERTIES, ComponentUtil.OBJECT_PROPERTIES, ComponentUtil.STRING_PROPERTIES, ComponentUtil.getEventCallbacks()).filter(keyExists)\n .forEach(function (key) { return pGridOptions[key] = changes[key].currentValue; });\n ComponentUtil.BOOLEAN_PROPERTIES\n .filter(keyExists)\n .forEach(function (key) { return pGridOptions[key] = ComponentUtil.toBoolean(changes[key].currentValue); });\n ComponentUtil.NUMBER_PROPERTIES\n .filter(keyExists)\n .forEach(function (key) { return pGridOptions[key] = ComponentUtil.toNumber(changes[key].currentValue); });\n if (changes.enableCellTextSelection) {\n api.setEnableCellTextSelection(ComponentUtil.toBoolean(changes.enableCellTextSelection.currentValue));\n }\n if (changes.quickFilterText) {\n api.setQuickFilter(changes.quickFilterText.currentValue);\n }\n if (changes.rowData) {\n api.setRowData(changes.rowData.currentValue);\n }\n if (changes.pinnedTopRowData) {\n api.setPinnedTopRowData(changes.pinnedTopRowData.currentValue);\n }\n if (changes.pinnedBottomRowData) {\n api.setPinnedBottomRowData(changes.pinnedBottomRowData.currentValue);\n }\n if (changes.autoGroupColumnDef) {\n api.setAutoGroupColumnDef(changes.autoGroupColumnDef.currentValue, \"gridOptionsChanged\");\n }\n if (changes.columnDefs) {\n api.setColumnDefs(changes.columnDefs.currentValue, \"gridOptionsChanged\");\n }\n if (changes.datasource) {\n api.setDatasource(changes.datasource.currentValue);\n }\n if (changes.headerHeight) {\n api.setHeaderHeight(ComponentUtil.toNumber(changes.headerHeight.currentValue));\n }\n if (changes.paginationPageSize) {\n api.paginationSetPageSize(ComponentUtil.toNumber(changes.paginationPageSize.currentValue));\n }\n if (changes.pivotMode) {\n columnApi.setPivotMode(ComponentUtil.toBoolean(changes.pivotMode.currentValue));\n }\n if (changes.groupRemoveSingleChildren) {\n api.setGroupRemoveSingleChildren(ComponentUtil.toBoolean(changes.groupRemoveSingleChildren.currentValue));\n }\n if (changes.suppressRowDrag) {\n api.setSuppressRowDrag(ComponentUtil.toBoolean(changes.suppressRowDrag.currentValue));\n }\n if (changes.suppressMoveWhenRowDragging) {\n api.setSuppressMoveWhenRowDragging(ComponentUtil.toBoolean(changes.suppressMoveWhenRowDragging.currentValue));\n }\n if (changes.suppressRowClickSelection) {\n api.setSuppressRowClickSelection(ComponentUtil.toBoolean(changes.suppressRowClickSelection.currentValue));\n }\n if (changes.suppressClipboardPaste) {\n api.setSuppressClipboardPaste(ComponentUtil.toBoolean(changes.suppressClipboardPaste.currentValue));\n }\n if (changes.sideBar) {\n api.setSideBar(changes.sideBar.currentValue);\n }\n // copy changes into an event for dispatch\n var event = {\n type: Events.EVENT_COMPONENT_STATE_CHANGED,\n api: gridOptions.api,\n columnApi: gridOptions.columnApi\n };\n iterateObject(changes, function (key, value) {\n event[key] = value;\n });\n api.dispatchEvent(event);\n };\n ComponentUtil.toBoolean = function (value) {\n if (typeof value === 'boolean') {\n return value;\n }\n if (typeof value === 'string') {\n // for boolean, compare to empty String to allow attributes appearing with\n // no value to be treated as 'true'\n return value.toUpperCase() === 'TRUE' || value == '';\n }\n return false;\n };\n ComponentUtil.toNumber = function (value) {\n if (typeof value === 'number') {\n return value;\n }\n if (typeof value === 'string') {\n return Number(value);\n }\n };\n // all the events are populated in here AFTER this class (at the bottom of the file).\n ComponentUtil.EVENTS = [];\n ComponentUtil.STRING_PROPERTIES = PropertyKeys.STRING_PROPERTIES;\n ComponentUtil.OBJECT_PROPERTIES = PropertyKeys.OBJECT_PROPERTIES;\n ComponentUtil.ARRAY_PROPERTIES = PropertyKeys.ARRAY_PROPERTIES;\n ComponentUtil.NUMBER_PROPERTIES = PropertyKeys.NUMBER_PROPERTIES;\n ComponentUtil.BOOLEAN_PROPERTIES = PropertyKeys.BOOLEAN_PROPERTIES;\n ComponentUtil.FUNCTION_PROPERTIES = PropertyKeys.FUNCTION_PROPERTIES;\n ComponentUtil.ALL_PROPERTIES = PropertyKeys.ALL_PROPERTIES;\n return ComponentUtil;\n}());\nComponentUtil.EVENTS = values(Events);\n\n/**\n * @ag-grid-community/core - Advanced Data Grid / Data Table supporting Javascript / React / AngularJS / Web Components\n * @version v25.1.0\n * @link http://www.ag-grid.com/\n * @license MIT\n */\nvar __spreadArrays$2 = (undefined && undefined.__spreadArrays) || function () {\n for (var s = 0, i = 0, il = arguments.length; i < il; i++) s += arguments[i].length;\n for (var r = Array(s), k = 0, i = 0; i < il; i++)\n for (var a = arguments[i], j = 0, jl = a.length; j < jl; j++, k++)\n r[k] = a[j];\n return r;\n};\nvar ColDefUtil = /** @class */ (function () {\n function ColDefUtil() {\n }\n ColDefUtil.STRING_PROPERTIES = [\n 'headerName',\n 'columnGroupShow',\n 'headerClass',\n 'toolPanelClass',\n 'headerValueGetter',\n 'pivotKeys',\n 'groupId',\n 'colId',\n 'sort',\n 'initialSort',\n 'field',\n 'type',\n 'tooltipComponent',\n 'tooltipField',\n 'headerTooltip',\n 'cellClass',\n 'showRowGroup',\n 'template',\n 'templateUrl',\n 'filter',\n 'initialAggFunc',\n 'aggFunc',\n 'cellRenderer',\n 'cellEditor',\n 'pinned',\n 'initialPinned',\n 'chartDataType'\n ];\n ColDefUtil.OBJECT_PROPERTIES = [\n 'headerGroupComponent',\n 'headerGroupComponentFramework',\n 'headerGroupComponentParams',\n 'cellStyle',\n 'cellRendererParams',\n 'cellEditorFramework',\n 'cellEditorParams',\n 'pinnedRowCellRendererFramework',\n 'pinnedRowCellRendererParams',\n 'filterFramework',\n 'filterParams',\n 'pivotValueColumn',\n 'headerComponent',\n 'headerComponentFramework',\n 'headerComponentParams',\n 'floatingFilterComponent',\n 'floatingFilterComponentParams',\n 'floatingFilterComponentFramework',\n 'tooltipComponent',\n 'tooltipComponentParams',\n 'tooltipComponentFramework',\n 'refData',\n 'columnsMenuParams'\n ];\n ColDefUtil.ARRAY_PROPERTIES = [\n 'children',\n 'sortingOrder',\n 'allowedAggFuncs',\n 'menuTabs',\n 'pivotTotalColumnIds',\n 'cellClassRules',\n 'icons'\n ];\n ColDefUtil.NUMBER_PROPERTIES = [\n 'sortedAt',\n 'sortIndex',\n 'initialSortIndex',\n 'flex',\n 'initialFlex',\n 'width',\n 'initialWidth',\n 'minWidth',\n 'maxWidth',\n 'rowGroupIndex',\n 'initialRowGroupIndex',\n 'pivotIndex',\n 'initialPivotIndex'\n ];\n ColDefUtil.BOOLEAN_PROPERTIES = [\n 'suppressCellFlash',\n 'suppressColumnsToolPanel',\n 'suppressFiltersToolPanel',\n 'openByDefault',\n 'marryChildren',\n 'hide',\n 'initialHide',\n 'rowGroup',\n 'initialRowGroup',\n 'pivot',\n 'initialPivot',\n 'checkboxSelection',\n 'headerCheckboxSelection',\n 'headerCheckboxSelectionFilteredOnly',\n 'suppressMenu',\n 'suppressMovable',\n 'lockPosition',\n 'lockVisible',\n 'lockPinned',\n 'unSortIcon',\n 'suppressSizeToFit',\n 'suppressAutoSize',\n 'enableRowGroup',\n 'enablePivot',\n 'enableValue',\n 'editable',\n 'suppressPaste',\n 'suppressNavigable',\n 'enableCellChangeFlash',\n 'rowDrag',\n 'dndSource',\n 'autoHeight',\n 'wrapText',\n 'sortable',\n 'resizable',\n 'singleClickEdit',\n 'floatingFilter',\n ];\n ColDefUtil.FUNCTION_PROPERTIES = [\n 'dndSourceOnRowDrag',\n 'valueGetter',\n 'valueSetter',\n 'filterValueGetter',\n 'keyCreator',\n 'cellRenderer',\n 'cellRendererFramework',\n 'pinnedRowCellRenderer',\n 'valueFormatter',\n 'pinnedRowValueFormatter',\n 'valueParser',\n 'comparator',\n 'equals',\n 'pivotComparator',\n 'suppressKeyboardEvent',\n 'suppressHeaderKeyboardEvent',\n 'colSpan',\n 'rowSpan',\n 'getQuickFilterText',\n 'newValueHandler',\n 'onCellValueChanged',\n 'onCellClicked',\n 'onCellDoubleClicked',\n 'onCellContextMenu',\n 'rowDragText',\n 'tooltipValueGetter',\n 'tooltipComponent',\n 'tooltipComponentFramework',\n 'cellRendererSelector',\n 'cellEditorSelector'\n ];\n ColDefUtil.ALL_PROPERTIES = __spreadArrays$2(ColDefUtil.ARRAY_PROPERTIES, ColDefUtil.OBJECT_PROPERTIES, ColDefUtil.STRING_PROPERTIES, ColDefUtil.NUMBER_PROPERTIES, ColDefUtil.FUNCTION_PROPERTIES, ColDefUtil.BOOLEAN_PROPERTIES);\n // used when doing property checks - this causes noise when using frameworks which can add their own fw specific\n // properties to colDefs, gridOptions etc\n ColDefUtil.FRAMEWORK_PROPERTIES = ['__ob__', '__v_skip', '__metadata__', 'mappedColumnProperties', 'hasChildColumns',\n 'toColDef', 'createColDefFromGridColumn'];\n return ColDefUtil;\n}());\n\n/**\n * @ag-grid-community/core - Advanced Data Grid / Data Table supporting Javascript / React / AngularJS / Web Components\n * @version v25.1.0\n * @link http://www.ag-grid.com/\n * @license MIT\n */\nvar Color = /** @class */ (function () {\n /**\n * Every color component should be in the [0, 1] range.\n * Some easing functions (such as elastic easing) can overshoot the target value by some amount.\n * So, when animating colors, if the source or target color components are already near\n * or at the edge of the allowed [0, 1] range, it is possible for the intermediate color\n * component value to end up outside of that range mid-animation. For this reason the constructor\n * performs range checking/constraining.\n * @param r Red component.\n * @param g Green component.\n * @param b Blue component.\n * @param a Alpha (opacity) component.\n */\n function Color(r, g, b, a) {\n if (a === void 0) { a = 1; }\n // NaN is treated as 0.\n this.r = Math.min(1, Math.max(0, r || 0));\n this.g = Math.min(1, Math.max(0, g || 0));\n this.b = Math.min(1, Math.max(0, b || 0));\n this.a = Math.min(1, Math.max(0, a || 0));\n }\n /**\n * The given string can be in one of the following formats:\n * - #rgb\n * - #rrggbb\n * - rgb(r, g, b)\n * - rgba(r, g, b, a)\n * - CSS color name such as 'white', 'orange', 'cyan', etc.\n * @param str\n */\n Color.fromString = function (str) {\n // hexadecimal notation\n if (str.indexOf('#') >= 0) { // there can be some leading whitespace\n return Color.fromHexString(str);\n }\n // color name\n var hex = Color.nameToHex[str];\n if (hex) {\n return Color.fromHexString(hex);\n }\n // rgb(a) notation\n if (str.indexOf('rgb') >= 0) {\n return Color.fromRgbaString(str);\n }\n throw new Error(\"Invalid color string: '\" + str + \"'\");\n };\n // Using separate RegExp for the short hex notation because strings like `#abcd`\n // are matched as ['#abcd', 'ab', 'c', 'd', undefined] when the `{1,2}` quantifier is used.\n Color.fromHexString = function (str) {\n var values = str.match(Color.hexRe);\n if (values) {\n var r = parseInt(values[1], 16);\n var g = parseInt(values[2], 16);\n var b = parseInt(values[3], 16);\n var a = values[4] !== undefined ? parseInt(values[4], 16) : 255;\n return new Color(r / 255, g / 255, b / 255, a / 255);\n }\n values = str.match(Color.shortHexRe);\n if (values) {\n var r = parseInt(values[1], 16);\n var g = parseInt(values[2], 16);\n var b = parseInt(values[3], 16);\n var a = values[4] !== undefined ? parseInt(values[4], 16) : 15;\n r += r * 16;\n g += g * 16;\n b += b * 16;\n a += a * 16;\n return new Color(r / 255, g / 255, b / 255, a / 255);\n }\n throw new Error(\"Malformed hexadecimal color string: '\" + str + \"'\");\n };\n Color.fromRgbaString = function (str) {\n var values = str.match(Color.rgbRe);\n if (values) {\n return new Color(+values[1] / 255, +values[2] / 255, +values[3] / 255);\n }\n values = str.match(Color.rgbaRe);\n if (values) {\n return new Color(+values[1] / 255, +values[2] / 255, +values[3] / 255, +values[4]);\n }\n throw new Error(\"Malformed rgb/rgba color string: '\" + str + \"'\");\n };\n Color.fromArray = function (arr) {\n if (arr.length === 4) {\n return new Color(arr[0], arr[1], arr[2], arr[3]);\n }\n if (arr.length === 3) {\n return new Color(arr[0], arr[1], arr[2]);\n }\n throw new Error('The given array should contain 3 or 4 color components (numbers).');\n };\n /**\n * Creates an instance of the Color class from the given HSB(A) components.\n * @param h Hue in the [0, 360) range.\n * @param s Saturation in the [0, 1] range.\n * @param b Brightness in the [0, 1] range.\n * @param alpha Opacity in the [0, 1] range. Defaults to 1 (completely opaque).\n */\n Color.fromHSB = function (h, s, b, alpha) {\n if (alpha === void 0) { alpha = 1; }\n var rgb = Color.HSBtoRGB(h, s, b);\n return new Color(rgb[0], rgb[1], rgb[2], alpha);\n };\n Color.padHex = function (str) {\n // Can't use `padStart(2, '0')` here because of IE.\n return str.length === 1 ? '0' + str : str;\n };\n Color.prototype.toHexString = function () {\n var hex = '#'\n + Color.padHex(Math.round(this.r * 255).toString(16))\n + Color.padHex(Math.round(this.g * 255).toString(16))\n + Color.padHex(Math.round(this.b * 255).toString(16));\n if (this.a < 1) {\n hex += Color.padHex(Math.round(this.a * 255).toString(16));\n }\n return hex;\n };\n Color.prototype.toRgbaString = function (fractionDigits) {\n if (fractionDigits === void 0) { fractionDigits = 3; }\n var components = [\n Math.round(this.r * 255),\n Math.round(this.g * 255),\n Math.round(this.b * 255)\n ];\n var k = Math.pow(10, fractionDigits);\n if (this.a !== 1) {\n components.push(Math.round(this.a * k) / k);\n return \"rgba(\" + components.join(', ') + \")\";\n }\n return \"rgb(\" + components.join(', ') + \")\";\n };\n Color.prototype.toString = function () {\n if (this.a === 1) {\n return this.toHexString();\n }\n return this.toRgbaString();\n };\n Color.prototype.toHSB = function () {\n return Color.RGBtoHSB(this.r, this.g, this.b);\n };\n /**\n * Converts the given RGB triple to an array of HSB (HSV) components.\n * The hue component will be `NaN` for achromatic colors.\n */\n Color.RGBtoHSB = function (r, g, b) {\n var min = Math.min(r, g, b);\n var max = Math.max(r, g, b);\n var S = max !== 0 ? (max - min) / max : 0;\n var H = NaN;\n // min == max, means all components are the same\n // and the color is a shade of gray with no hue (H is NaN)\n if (min !== max) {\n var delta = max - min;\n var rc = (max - r) / delta;\n var gc = (max - g) / delta;\n var bc = (max - b) / delta;\n if (r === max) {\n H = bc - gc;\n }\n else if (g === max) {\n H = 2.0 + rc - bc;\n }\n else {\n H = 4.0 + gc - rc;\n }\n H /= 6.0;\n if (H < 0) {\n H = H + 1.0;\n }\n }\n return [H * 360, S, max];\n };\n /**\n * Converts the given HSB (HSV) triple to an array of RGB components.\n */\n Color.HSBtoRGB = function (H, S, B) {\n if (isNaN(H)) {\n H = 0;\n }\n H = (((H % 360) + 360) % 360) / 360; // normalize hue to [0, 360] interval, then scale to [0, 1]\n var r = 0;\n var g = 0;\n var b = 0;\n if (S === 0) {\n r = g = b = B;\n }\n else {\n var h = (H - Math.floor(H)) * 6;\n var f = h - Math.floor(h);\n var p = B * (1 - S);\n var q = B * (1 - S * f);\n var t = B * (1 - (S * (1 - f)));\n switch (h >> 0) { // discard the floating point part of the number\n case 0:\n r = B;\n g = t;\n b = p;\n break;\n case 1:\n r = q;\n g = B;\n b = p;\n break;\n case 2:\n r = p;\n g = B;\n b = t;\n break;\n case 3:\n r = p;\n g = q;\n b = B;\n break;\n case 4:\n r = t;\n g = p;\n b = B;\n break;\n case 5:\n r = B;\n g = p;\n b = q;\n break;\n }\n }\n return [r, g, b];\n };\n Color.prototype.derive = function (hueShift, saturationFactor, brightnessFactor, opacityFactor) {\n var hsb = Color.RGBtoHSB(this.r, this.g, this.b);\n var b = hsb[2];\n if (b == 0 && brightnessFactor > 1.0) {\n b = 0.05;\n }\n var h = (((hsb[0] + hueShift) % 360) + 360) % 360;\n var s = Math.max(Math.min(hsb[1] * saturationFactor, 1.0), 0.0);\n b = Math.max(Math.min(b * brightnessFactor, 1.0), 0.0);\n var a = Math.max(Math.min(this.a * opacityFactor, 1.0), 0.0);\n var rgba = Color.HSBtoRGB(h, s, b);\n rgba.push(a);\n return Color.fromArray(rgba);\n };\n Color.prototype.brighter = function () {\n return this.derive(0, 1.0, 1.0 / 0.7, 1.0);\n };\n Color.prototype.darker = function () {\n return this.derive(0, 1.0, 0.7, 1.0);\n };\n // See https://drafts.csswg.org/css-color/#hex-notation\n Color.hexRe = /\\s*#([0-9a-fA-F]{2})([0-9a-fA-F]{2})([0-9a-fA-F]{2})([0-9a-fA-F]{2})?\\s*$/;\n Color.shortHexRe = /\\s*#([0-9a-fA-F])([0-9a-fA-F])([0-9a-fA-F])([0-9a-fA-F])?\\s*$/;\n Color.rgbRe = /\\s*rgb\\((\\d+),\\s*(\\d+),\\s*(\\d+)\\)\\s*/;\n Color.rgbaRe = /\\s*rgba\\((\\d+),\\s*(\\d+),\\s*(\\d+),\\s*([.\\d]+)\\)\\s*/;\n /**\n * CSS Color Module Level 4:\n * https://drafts.csswg.org/css-color/#named-colors\n */\n Color.nameToHex = Object.freeze({\n aliceblue: '#F0F8FF',\n antiquewhite: '#FAEBD7',\n aqua: '#00FFFF',\n aquamarine: '#7FFFD4',\n azure: '#F0FFFF',\n beige: '#F5F5DC',\n bisque: '#FFE4C4',\n black: '#000000',\n blanchedalmond: '#FFEBCD',\n blue: '#0000FF',\n blueviolet: '#8A2BE2',\n brown: '#A52A2A',\n burlywood: '#DEB887',\n cadetblue: '#5F9EA0',\n chartreuse: '#7FFF00',\n chocolate: '#D2691E',\n coral: '#FF7F50',\n cornflowerblue: '#6495ED',\n cornsilk: '#FFF8DC',\n crimson: '#DC143C',\n cyan: '#00FFFF',\n darkblue: '#00008B',\n darkcyan: '#008B8B',\n darkgoldenrod: '#B8860B',\n darkgray: '#A9A9A9',\n darkgreen: '#006400',\n darkgrey: '#A9A9A9',\n darkkhaki: '#BDB76B',\n darkmagenta: '#8B008B',\n darkolivegreen: '#556B2F',\n darkorange: '#FF8C00',\n darkorchid: '#9932CC',\n darkred: '#8B0000',\n darksalmon: '#E9967A',\n darkseagreen: '#8FBC8F',\n darkslateblue: '#483D8B',\n darkslategray: '#2F4F4F',\n darkslategrey: '#2F4F4F',\n darkturquoise: '#00CED1',\n darkviolet: '#9400D3',\n deeppink: '#FF1493',\n deepskyblue: '#00BFFF',\n dimgray: '#696969',\n dimgrey: '#696969',\n dodgerblue: '#1E90FF',\n firebrick: '#B22222',\n floralwhite: '#FFFAF0',\n forestgreen: '#228B22',\n fuchsia: '#FF00FF',\n gainsboro: '#DCDCDC',\n ghostwhite: '#F8F8FF',\n gold: '#FFD700',\n goldenrod: '#DAA520',\n gray: '#808080',\n green: '#008000',\n greenyellow: '#ADFF2F',\n grey: '#808080',\n honeydew: '#F0FFF0',\n hotpink: '#FF69B4',\n indianred: '#CD5C5C',\n indigo: '#4B0082',\n ivory: '#FFFFF0',\n khaki: '#F0E68C',\n lavender: '#E6E6FA',\n lavenderblush: '#FFF0F5',\n lawngreen: '#7CFC00',\n lemonchiffon: '#FFFACD',\n lightblue: '#ADD8E6',\n lightcoral: '#F08080',\n lightcyan: '#E0FFFF',\n lightgoldenrodyellow: '#FAFAD2',\n lightgray: '#D3D3D3',\n lightgreen: '#90EE90',\n lightgrey: '#D3D3D3',\n lightpink: '#FFB6C1',\n lightsalmon: '#FFA07A',\n lightseagreen: '#20B2AA',\n lightskyblue: '#87CEFA',\n lightslategray: '#778899',\n lightslategrey: '#778899',\n lightsteelblue: '#B0C4DE',\n lightyellow: '#FFFFE0',\n lime: '#00FF00',\n limegreen: '#32CD32',\n linen: '#FAF0E6',\n magenta: '#FF00FF',\n maroon: '#800000',\n mediumaquamarine: '#66CDAA',\n mediumblue: '#0000CD',\n mediumorchid: '#BA55D3',\n mediumpurple: '#9370DB',\n mediumseagreen: '#3CB371',\n mediumslateblue: '#7B68EE',\n mediumspringgreen: '#00FA9A',\n mediumturquoise: '#48D1CC',\n mediumvioletred: '#C71585',\n midnightblue: '#191970',\n mintcream: '#F5FFFA',\n mistyrose: '#FFE4E1',\n moccasin: '#FFE4B5',\n navajowhite: '#FFDEAD',\n navy: '#000080',\n oldlace: '#FDF5E6',\n olive: '#808000',\n olivedrab: '#6B8E23',\n orange: '#FFA500',\n orangered: '#FF4500',\n orchid: '#DA70D6',\n palegoldenrod: '#EEE8AA',\n palegreen: '#98FB98',\n paleturquoise: '#AFEEEE',\n palevioletred: '#DB7093',\n papayawhip: '#FFEFD5',\n peachpuff: '#FFDAB9',\n peru: '#CD853F',\n pink: '#FFC0CB',\n plum: '#DDA0DD',\n powderblue: '#B0E0E6',\n purple: '#800080',\n rebeccapurple: '#663399',\n red: '#FF0000',\n rosybrown: '#BC8F8F',\n royalblue: '#4169E1',\n saddlebrown: '#8B4513',\n salmon: '#FA8072',\n sandybrown: '#F4A460',\n seagreen: '#2E8B57',\n seashell: '#FFF5EE',\n sienna: '#A0522D',\n silver: '#C0C0C0',\n skyblue: '#87CEEB',\n slateblue: '#6A5ACD',\n slategray: '#708090',\n slategrey: '#708090',\n snow: '#FFFAFA',\n springgreen: '#00FF7F',\n steelblue: '#4682B4',\n tan: '#D2B48C',\n teal: '#008080',\n thistle: '#D8BFD8',\n tomato: '#FF6347',\n turquoise: '#40E0D0',\n violet: '#EE82EE',\n wheat: '#F5DEB3',\n white: '#FFFFFF',\n whitesmoke: '#F5F5F5',\n yellow: '#FFFF00',\n yellowgreen: '#9ACD32'\n });\n return Color;\n}());\n\n/**\n * @ag-grid-community/core - Advanced Data Grid / Data Table supporting Javascript / React / AngularJS / Web Components\n * @version v25.1.0\n * @link http://www.ag-grid.com/\n * @license MIT\n */\n// Based on https://stackoverflow.com/a/14991797\n// This will parse a delimited string into an array of arrays.\nfunction stringToArray(strData, delimiter) {\n if (delimiter === void 0) { delimiter = ','; }\n var data = [];\n var isNewline = function (char) { return char === '\\r' || char === '\\n'; };\n var insideQuotedField = false;\n if (strData === '') {\n return [['']];\n }\n var _loop_1 = function (row, column, position) {\n var previousChar = strData[position - 1];\n var currentChar = strData[position];\n var nextChar = strData[position + 1];\n var ensureDataExists = function () {\n if (!data[row]) {\n // create row if it doesn't exist\n data[row] = [];\n }\n if (!data[row][column]) {\n // create column if it doesn't exist\n data[row][column] = '';\n }\n };\n ensureDataExists();\n if (currentChar === '\"') {\n if (insideQuotedField) {\n if (nextChar === '\"') {\n // unescape double quote\n data[row][column] += '\"';\n position++;\n }\n else {\n // exit quoted field\n insideQuotedField = false;\n }\n return out_row_1 = row, out_column_1 = column, out_position_1 = position, \"continue\";\n }\n else if (previousChar === undefined || previousChar === delimiter || isNewline(previousChar)) {\n // enter quoted field\n insideQuotedField = true;\n return out_row_1 = row, out_column_1 = column, out_position_1 = position, \"continue\";\n }\n }\n if (!insideQuotedField) {\n if (currentChar === delimiter) {\n // move to next column\n column++;\n ensureDataExists();\n return out_row_1 = row, out_column_1 = column, out_position_1 = position, \"continue\";\n }\n else if (isNewline(currentChar)) {\n // move to next row\n column = 0;\n row++;\n ensureDataExists();\n if (currentChar === '\\r' && nextChar === '\\n') {\n // skip over second newline character if it exists\n position++;\n }\n return out_row_1 = row, out_column_1 = column, out_position_1 = position, \"continue\";\n }\n }\n // add current character to current column\n data[row][column] += currentChar;\n out_row_1 = row;\n out_column_1 = column;\n out_position_1 = position;\n };\n var out_row_1, out_column_1, out_position_1;\n // iterate over each character, keep track of current row and column (of the returned array)\n for (var row = 0, column = 0, position = 0; position < strData.length; position++) {\n _loop_1(row, column, position);\n row = out_row_1;\n column = out_column_1;\n position = out_position_1;\n }\n return data;\n}\n\nvar CsvUtils = /*#__PURE__*/Object.freeze({\n __proto__: null,\n stringToArray: stringToArray\n});\n\n/**\n * @ag-grid-community/core - Advanced Data Grid / Data Table supporting Javascript / React / AngularJS / Web Components\n * @version v25.1.0\n * @link http://www.ag-grid.com/\n * @license MIT\n */\n/**\n * These variables are lazy loaded, as otherwise they try and get initialised when we are loading\n * unit tests and we don't have references to window or document in the unit tests\n * from http://stackoverflow.com/questions/9847580/how-to-detect-safari-chrome-ie-firefox-and-opera-browser\n */\nvar isSafari;\nvar isIE;\nvar isEdge;\nvar isChrome;\nvar isFirefox;\nvar isIOS;\nfunction isBrowserIE() {\n if (isIE === undefined) {\n isIE = /*@cc_on!@*/ !!document.documentMode; // At least IE6\n }\n return isIE;\n}\nfunction isBrowserEdge() {\n if (isEdge === undefined) {\n isEdge = !isBrowserIE() && !!window.StyleMedia;\n }\n return isEdge;\n}\nfunction isBrowserSafari() {\n if (isSafari === undefined) {\n // taken from https://stackoverflow.com/a/23522755/1388233\n isSafari = /^((?!chrome|android).)*safari/i.test(navigator.userAgent);\n }\n return isSafari;\n}\nfunction isBrowserChrome() {\n if (isChrome === undefined) {\n var win = window;\n isChrome = (!!win.chrome && (!!win.chrome.webstore || !!win.chrome.runtime)) ||\n (/Chrome/.test(navigator.userAgent) && /Google Inc/.test(navigator.vendor));\n }\n return isChrome;\n}\nfunction isBrowserFirefox() {\n if (isFirefox === undefined) {\n var win = window;\n isFirefox = typeof win.InstallTrigger !== 'undefined';\n }\n return isFirefox;\n}\nfunction isIOSUserAgent() {\n if (isIOS === undefined) {\n // taken from https://stackoverflow.com/a/58064481/1388233\n isIOS = (/iPad|iPhone|iPod/.test(navigator.platform) ||\n // eslint-disable-next-line\n (navigator.platform === 'MacIntel' && navigator.maxTouchPoints > 1)) &&\n !window.MSStream;\n }\n return isIOS;\n}\nfunction getTabIndex(el) {\n if (!el) {\n return null;\n }\n var numberTabIndex = el.tabIndex;\n var tabIndex = el.getAttribute('tabIndex');\n if (isBrowserIE() && numberTabIndex === 0 && tabIndex === null) {\n var map = {\n a: true,\n body: true,\n button: true,\n frame: true,\n iframe: true,\n img: true,\n input: true,\n isindex: true,\n object: true,\n select: true,\n textarea: true\n };\n return map[el.nodeName.toLowerCase()] === true ? '0' : null;\n }\n if (numberTabIndex === -1 && (tabIndex === null || (tabIndex === '' && !isBrowserFirefox()))) {\n return null;\n }\n return numberTabIndex.toString();\n}\nfunction getMaxDivHeight() {\n if (!document.body) {\n return -1;\n }\n var res = 1000000;\n // FF reports the height back but still renders blank after ~6M px\n var testUpTo = navigator.userAgent.toLowerCase().match(/firefox/) ? 6000000 : 1000000000;\n var div = document.createElement('div');\n document.body.appendChild(div);\n while (true) {\n var test_1 = res * 2;\n div.style.height = test_1 + 'px';\n if (test_1 > testUpTo || div.clientHeight !== test_1) {\n break;\n }\n else {\n res = test_1;\n }\n }\n document.body.removeChild(div);\n return res;\n}\nfunction getScrollbarWidth() {\n var body = document.body;\n var div = document.createElement('div');\n div.style.width = div.style.height = '100px';\n div.style.opacity = '0';\n div.style.overflow = 'scroll';\n div.style.msOverflowStyle = 'scrollbar'; // needed for WinJS apps\n div.style.position = 'absolute';\n body.appendChild(div);\n var width = div.offsetWidth - div.clientWidth;\n // if width is 0 and client width is 0, means the DOM isn't ready\n if (width === 0 && div.clientWidth === 0) {\n return null;\n }\n // remove divs\n if (div.parentNode) {\n div.parentNode.removeChild(div);\n }\n return width;\n}\n/** @deprecated */\nfunction hasOverflowScrolling() {\n var prefixes = ['webkit', 'moz', 'o', 'ms'];\n var div = document.createElement('div');\n var body = document.getElementsByTagName('body')[0];\n var found = false;\n var p;\n body.appendChild(div);\n div.setAttribute('style', prefixes.map(function (prefix) { return \"-\" + prefix + \"-overflow-scrolling: touch\"; }).concat('overflow-scrolling: touch').join(';'));\n var computedStyle = window.getComputedStyle(div);\n if (computedStyle.overflowScrolling === 'touch') {\n found = true;\n }\n if (!found) {\n for (var _i = 0, prefixes_1 = prefixes; _i < prefixes_1.length; _i++) {\n p = prefixes_1[_i];\n if (computedStyle[p + \"OverflowScrolling\"] === 'touch') {\n found = true;\n break;\n }\n }\n }\n if (div.parentNode) {\n div.parentNode.removeChild(div);\n }\n return found;\n}\n/**\n * Gets the document body width\n * from: http://stackoverflow.com/questions/1038727/how-to-get-browser-width-using-javascript-code\n * @returns {number}\n */\nfunction getBodyWidth() {\n if (document.body) {\n return document.body.clientWidth;\n }\n if (window.innerHeight) {\n return window.innerWidth;\n }\n if (document.documentElement && document.documentElement.clientWidth) {\n return document.documentElement.clientWidth;\n }\n return -1;\n}\n/**\n * Gets the body height\n * from: http://stackoverflow.com/questions/1038727/how-to-get-browser-width-using-javascript-code\n * @returns {number}\n */\nfunction getBodyHeight() {\n if (document.body) {\n return document.body.clientHeight;\n }\n if (window.innerHeight) {\n return window.innerHeight;\n }\n if (document.documentElement && document.documentElement.clientHeight) {\n return document.documentElement.clientHeight;\n }\n return -1;\n}\n\nvar BrowserUtils = /*#__PURE__*/Object.freeze({\n __proto__: null,\n isBrowserIE: isBrowserIE,\n isBrowserEdge: isBrowserEdge,\n isBrowserSafari: isBrowserSafari,\n isBrowserChrome: isBrowserChrome,\n isBrowserFirefox: isBrowserFirefox,\n isIOSUserAgent: isIOSUserAgent,\n getTabIndex: getTabIndex,\n getMaxDivHeight: getMaxDivHeight,\n getScrollbarWidth: getScrollbarWidth,\n hasOverflowScrolling: hasOverflowScrolling,\n getBodyWidth: getBodyWidth,\n getBodyHeight: getBodyHeight\n});\n\n/**\n * @ag-grid-community/core - Advanced Data Grid / Data Table supporting Javascript / React / AngularJS / Web Components\n * @version v25.1.0\n * @link http://www.ag-grid.com/\n * @license MIT\n */\nvar rtlNegativeScroll;\nfunction addCssClass(element, className) {\n if (!element || !className || className.length === 0) {\n return;\n }\n if (className.indexOf(' ') >= 0) {\n className.split(' ').forEach(function (value) { return addCssClass(element, value); });\n return;\n }\n if (element.classList) {\n element.classList.add(className);\n }\n else if (element.className && element.className.length > 0) {\n var cssClasses = element.className.split(' ');\n if (cssClasses.indexOf(className) < 0) {\n cssClasses.push(className);\n element.setAttribute('class', cssClasses.join(' '));\n }\n }\n else {\n // do not use element.classList = className here, it will cause\n // a read-only assignment error on some browsers (IE/Edge).\n element.setAttribute('class', className);\n }\n return element;\n}\nfunction removeCssClass(element, className) {\n if (!element || !className || className.length === 0) {\n return;\n }\n if (className.indexOf(' ') >= 0) {\n className.split(' ').forEach(function (value) { return removeCssClass(element, value); });\n return;\n }\n if (element.classList) {\n element.classList.remove(className);\n }\n else if (element.className && element.className.length > 0) {\n var newClassName = element.className.split(' ').filter(function (c) { return c !== className; }).join(' ');\n element.setAttribute('class', newClassName);\n }\n}\nfunction addOrRemoveCssClass(element, className, addOrRemove) {\n if (addOrRemove) {\n addCssClass(element, className);\n }\n else {\n removeCssClass(element, className);\n }\n}\n/**\n * This method adds a class to an element and remove that class from all siblings.\n * Useful for toggling state.\n * @param {HTMLElement} element The element to receive the class\n * @param {string} elementClass The class to be assigned to the element\n * @param {boolean} otherElementClass The class to be assigned to siblings of the element, but not the element itself\n */\nfunction radioCssClass(element, elementClass, otherElementClass) {\n var parent = element.parentElement;\n var sibling = parent && parent.firstChild;\n while (sibling) {\n if (elementClass) {\n addOrRemoveCssClass(sibling, elementClass, sibling === element);\n }\n if (otherElementClass) {\n addOrRemoveCssClass(sibling, otherElementClass, sibling !== element);\n }\n sibling = sibling.nextSibling;\n }\n}\nfunction containsClass(element, className) {\n if (element.classList) {\n // for modern browsers\n return element.classList.contains(className);\n }\n if (element.className) {\n // for older browsers, check against the string of class names\n // if only one class, can check for exact match\n var onlyClass = element.className === className;\n // if many classes, check for class name, we have to pad with ' ' to stop other\n // class names that are a substring of this class\n var contains = element.className.indexOf(' ' + className + ' ') >= 0;\n // the padding above then breaks when it's the first or last class names\n var startsWithClass = element.className.indexOf(className + ' ') === 0;\n var endsWithClass = element.className.lastIndexOf(' ' + className) === (element.className.length - className.length - 1);\n return onlyClass || contains || startsWithClass || endsWithClass;\n }\n // if item is not a node\n return false;\n}\nfunction isFocusableFormField(element) {\n var matches = Element.prototype.matches || Element.prototype.msMatchesSelector;\n var isFocusable = matches.call(element, Constants.INPUT_SELECTOR);\n var isNotFocusable = matches.call(element, Constants.FOCUSABLE_EXCLUDE);\n var isElementVisible = isVisible(element);\n var focusable = isFocusable && !isNotFocusable && isElementVisible;\n return focusable;\n}\nfunction setDisplayed(element, displayed) {\n addOrRemoveCssClass(element, 'ag-hidden', !displayed);\n}\nfunction setVisible(element, visible) {\n addOrRemoveCssClass(element, 'ag-invisible', !visible);\n}\nfunction setDisabled(element, disabled) {\n var attributeName = 'disabled';\n var addOrRemoveDisabledAttribute = disabled ?\n function (e) { return e.setAttribute(attributeName, ''); } :\n function (e) { return e.removeAttribute(attributeName); };\n addOrRemoveDisabledAttribute(element);\n nodeListForEach(element.querySelectorAll('input'), function (input) { return addOrRemoveDisabledAttribute(input); });\n}\nfunction isElementChildOfClass(element, cls, maxNest) {\n var counter = 0;\n while (element) {\n if (containsClass(element, cls)) {\n return true;\n }\n element = element.parentElement;\n if (maxNest && ++counter > maxNest) {\n break;\n }\n }\n return false;\n}\n// returns back sizes as doubles instead of strings. similar to\n// getBoundingClientRect, however getBoundingClientRect does not:\n// a) work with fractions (eg browser is zooming)\n// b) has CSS transitions applied (eg CSS scale, browser zoom), which we don't want, we want the un-transitioned values\nfunction getElementSize(el) {\n var _a = window.getComputedStyle(el), height = _a.height, width = _a.width, paddingTop = _a.paddingTop, paddingRight = _a.paddingRight, paddingBottom = _a.paddingBottom, paddingLeft = _a.paddingLeft, marginTop = _a.marginTop, marginRight = _a.marginRight, marginBottom = _a.marginBottom, marginLeft = _a.marginLeft, boxSizing = _a.boxSizing;\n return {\n height: parseFloat(height),\n width: parseFloat(width),\n paddingTop: parseFloat(paddingTop),\n paddingRight: parseFloat(paddingRight),\n paddingBottom: parseFloat(paddingBottom),\n paddingLeft: parseFloat(paddingLeft),\n marginTop: parseFloat(marginTop),\n marginRight: parseFloat(marginRight),\n marginBottom: parseFloat(marginBottom),\n marginLeft: parseFloat(marginLeft),\n boxSizing: boxSizing\n };\n}\nfunction getInnerHeight(el) {\n var size = getElementSize(el);\n if (size.boxSizing === 'border-box') {\n return size.height - size.paddingTop - size.paddingBottom;\n }\n return size.height;\n}\nfunction getInnerWidth(el) {\n var size = getElementSize(el);\n if (size.boxSizing === 'border-box') {\n return size.width - size.paddingLeft - size.paddingRight;\n }\n return size.width;\n}\nfunction getAbsoluteHeight(el) {\n var size = getElementSize(el);\n var marginRight = size.marginBottom + size.marginTop;\n return Math.ceil(el.offsetHeight + marginRight);\n}\nfunction getAbsoluteWidth(el) {\n var size = getElementSize(el);\n var marginWidth = size.marginLeft + size.marginRight;\n return Math.ceil(el.offsetWidth + marginWidth);\n}\nfunction isRtlNegativeScroll() {\n if (typeof rtlNegativeScroll === \"boolean\") {\n return rtlNegativeScroll;\n }\n var template = document.createElement('div');\n template.style.direction = 'rtl';\n template.style.width = '1px';\n template.style.height = '1px';\n template.style.position = 'fixed';\n template.style.top = '0px';\n template.style.overflow = 'hidden';\n template.dir = 'rtl';\n template.innerHTML = /* html */\n \"
\\n \\n \\n
\";\n document.body.appendChild(template);\n template.scrollLeft = 1;\n rtlNegativeScroll = Math.floor(template.scrollLeft) === 0;\n document.body.removeChild(template);\n return rtlNegativeScroll;\n}\nfunction getScrollLeft(element, rtl) {\n var scrollLeft = element.scrollLeft;\n if (rtl) {\n // Absolute value - for FF that reports RTL scrolls in negative numbers\n scrollLeft = Math.abs(scrollLeft);\n if (isBrowserChrome() && !isRtlNegativeScroll()) {\n scrollLeft = element.scrollWidth - element.clientWidth - scrollLeft;\n }\n }\n return scrollLeft;\n}\nfunction setScrollLeft(element, value, rtl) {\n if (rtl) {\n // Chrome and Safari when doing RTL have the END position of the scroll as zero, not the start\n if (isRtlNegativeScroll()) {\n value *= -1;\n }\n else if (isBrowserSafari() || isBrowserChrome()) {\n value = element.scrollWidth - element.clientWidth - value;\n }\n }\n element.scrollLeft = value;\n}\nfunction clearElement(el) {\n while (el && el.firstChild) {\n el.removeChild(el.firstChild);\n }\n}\n/** @deprecated */\nfunction removeElement(parent, cssSelector) {\n removeFromParent(parent.querySelector(cssSelector));\n}\nfunction removeFromParent(node) {\n if (node && node.parentNode) {\n node.parentNode.removeChild(node);\n }\n}\nfunction isVisible(element) {\n return element.offsetParent !== null;\n}\n/**\n * Loads the template and returns it as an element. makes up for no simple way in\n * the dom api to load html directly, eg we cannot do this: document.createElement(template)\n * @param {string} template\n * @returns {HTMLElement}\n */\nfunction loadTemplate(template) {\n var tempDiv = document.createElement('div');\n tempDiv.innerHTML = (template || '').trim();\n return tempDiv.firstChild;\n}\nfunction appendHtml(eContainer, htmlTemplate) {\n if (eContainer.lastChild) {\n // https://developer.mozilla.org/en-US/docs/Web/API/Element/insertAdjacentHTML\n // we put the items at the start, so new items appear underneath old items,\n // so when expanding/collapsing groups, the new rows don't go on top of the\n // rows below that are moving our of the way\n eContainer.insertAdjacentHTML('afterbegin', htmlTemplate);\n }\n else {\n eContainer.innerHTML = htmlTemplate;\n }\n}\n/** @deprecated */\nfunction getElementAttribute(element, attributeName) {\n if (element.attributes && element.attributes[attributeName]) {\n var attribute = element.attributes[attributeName];\n return attribute.value;\n }\n return null;\n}\nfunction offsetHeight(element) {\n return element && element.clientHeight ? element.clientHeight : 0;\n}\nfunction offsetWidth(element) {\n return element && element.clientWidth ? element.clientWidth : 0;\n}\nfunction ensureDomOrder(eContainer, eChild, eChildBefore) {\n // if already in right order, do nothing\n if (eChildBefore && eChildBefore.nextSibling === eChild) {\n return;\n }\n if (eChildBefore) {\n if (eChildBefore.nextSibling) {\n // insert between the eRowBefore and the row after it\n eContainer.insertBefore(eChild, eChildBefore.nextSibling);\n }\n else {\n // if nextSibling is missing, means other row is at end, so just append new row at the end\n eContainer.appendChild(eChild);\n }\n }\n else {\n // otherwise put at start\n if (eContainer.firstChild && eContainer.firstChild !== eChild) {\n // insert it at the first location\n eContainer.insertAdjacentElement('afterbegin', eChild);\n }\n }\n}\nfunction setDomChildOrder(eContainer, orderedChildren) {\n for (var i = 0; i < orderedChildren.length; i++) {\n var correctCellAtIndex = orderedChildren[i];\n var actualCellAtIndex = eContainer.children[i];\n if (actualCellAtIndex !== correctCellAtIndex) {\n eContainer.insertBefore(correctCellAtIndex, actualCellAtIndex);\n }\n }\n}\nfunction insertTemplateWithDomOrder(eContainer, htmlTemplate, eChildBefore) {\n var res;\n if (eChildBefore) {\n // if previous element exists, just slot in after the previous element\n eChildBefore.insertAdjacentHTML('afterend', htmlTemplate);\n res = eChildBefore.nextSibling;\n }\n else {\n if (eContainer.firstChild) {\n // insert it at the first location\n eContainer.insertAdjacentHTML('afterbegin', htmlTemplate);\n }\n else {\n // otherwise eContainer is empty, so just append it\n eContainer.innerHTML = htmlTemplate;\n }\n res = eContainer.firstChild;\n }\n return res;\n}\n/** @deprecated */\nfunction prependDC(parent, documentFragment) {\n if (exists(parent.firstChild)) {\n parent.insertBefore(documentFragment, parent.firstChild);\n }\n else {\n parent.appendChild(documentFragment);\n }\n}\nfunction addStylesToElement(eElement, styles) {\n if (!styles) {\n return;\n }\n Object.keys(styles).forEach(function (key) {\n var keyCamelCase = hyphenToCamelCase(key);\n if (keyCamelCase) {\n eElement.style[keyCamelCase] = styles[key];\n }\n });\n}\nfunction isHorizontalScrollShowing(element) {\n return element.clientWidth < element.scrollWidth;\n}\nfunction isVerticalScrollShowing(element) {\n return element.clientHeight < element.scrollHeight;\n}\nfunction setElementWidth(element, width) {\n if (width === 'flex') {\n element.style.removeProperty('width');\n element.style.removeProperty('minWidth');\n element.style.removeProperty('maxWidth');\n element.style.flex = '1 1 auto';\n }\n else {\n setFixedWidth(element, width);\n }\n}\nfunction setFixedWidth(element, width) {\n width = formatSize(width);\n element.style.width = width.toString();\n element.style.maxWidth = width.toString();\n element.style.minWidth = width.toString();\n}\nfunction setElementHeight(element, height) {\n if (height === 'flex') {\n element.style.removeProperty('height');\n element.style.removeProperty('minHeight');\n element.style.removeProperty('maxHeight');\n element.style.flex = '1 1 auto';\n }\n else {\n setFixedHeight(element, height);\n }\n}\nfunction setFixedHeight(element, height) {\n height = formatSize(height);\n element.style.height = height.toString();\n element.style.maxHeight = height.toString();\n element.style.minHeight = height.toString();\n}\nfunction formatSize(size) {\n if (typeof size === 'number') {\n return size + \"px\";\n }\n return size;\n}\n/**\n * Returns true if it is a DOM node\n * taken from: http://stackoverflow.com/questions/384286/javascript-isdom-how-do-you-check-if-a-javascript-object-is-a-dom-object\n * @param {any} o\n * @return {boolean}\n */\nfunction isNode(o) {\n return (typeof Node === 'function'\n ? o instanceof Node\n : o && typeof o === 'object' && typeof o.nodeType === 'number' && typeof o.nodeName === 'string');\n}\n//\n/**\n * Returns true if it is a DOM element\n * taken from: http://stackoverflow.com/questions/384286/javascript-isdom-how-do-you-check-if-a-javascript-object-is-a-dom-object\n * @param {any} o\n * @returns {boolean}\n */\nfunction isElement(o) {\n return (typeof HTMLElement === 'function'\n ? o instanceof HTMLElement //DOM2\n : o && isNonNullObject(o) && o.nodeType === 1 && typeof o.nodeName === 'string');\n}\nfunction isNodeOrElement(o) {\n return isNode(o) || isElement(o);\n}\n/**\n * Makes a copy of a node list into a list\n * @param {NodeList} nodeList\n * @returns {Node[]}\n */\nfunction copyNodeList(nodeList) {\n if (nodeList == null) {\n return [];\n }\n var result = [];\n nodeListForEach(nodeList, function (node) { return result.push(node); });\n return result;\n}\nfunction iterateNamedNodeMap(map, callback) {\n if (!map) {\n return;\n }\n for (var i = 0; i < map.length; i++) {\n var attr = map[i];\n callback(attr.name, attr.value);\n }\n}\n/** @deprecated */\nfunction setCheckboxState(eCheckbox, state) {\n if (typeof state === 'boolean') {\n eCheckbox.checked = state;\n eCheckbox.indeterminate = false;\n }\n else {\n // isNodeSelected returns back undefined if it's a group and the children\n // are a mix of selected and unselected\n eCheckbox.indeterminate = true;\n }\n}\nfunction addOrRemoveAttribute(element, name, value) {\n if (value == null) {\n element.removeAttribute(name);\n }\n else {\n element.setAttribute(name, value.toString());\n }\n}\nfunction nodeListForEach(nodeList, action) {\n if (nodeList == null) {\n return;\n }\n for (var i = 0; i < nodeList.length; i++) {\n action(nodeList[i]);\n }\n}\n\nvar DomUtils = /*#__PURE__*/Object.freeze({\n __proto__: null,\n addCssClass: addCssClass,\n removeCssClass: removeCssClass,\n addOrRemoveCssClass: addOrRemoveCssClass,\n radioCssClass: radioCssClass,\n containsClass: containsClass,\n isFocusableFormField: isFocusableFormField,\n setDisplayed: setDisplayed,\n setVisible: setVisible,\n setDisabled: setDisabled,\n isElementChildOfClass: isElementChildOfClass,\n getElementSize: getElementSize,\n getInnerHeight: getInnerHeight,\n getInnerWidth: getInnerWidth,\n getAbsoluteHeight: getAbsoluteHeight,\n getAbsoluteWidth: getAbsoluteWidth,\n isRtlNegativeScroll: isRtlNegativeScroll,\n getScrollLeft: getScrollLeft,\n setScrollLeft: setScrollLeft,\n clearElement: clearElement,\n removeElement: removeElement,\n removeFromParent: removeFromParent,\n isVisible: isVisible,\n loadTemplate: loadTemplate,\n appendHtml: appendHtml,\n getElementAttribute: getElementAttribute,\n offsetHeight: offsetHeight,\n offsetWidth: offsetWidth,\n ensureDomOrder: ensureDomOrder,\n setDomChildOrder: setDomChildOrder,\n insertTemplateWithDomOrder: insertTemplateWithDomOrder,\n prependDC: prependDC,\n addStylesToElement: addStylesToElement,\n isHorizontalScrollShowing: isHorizontalScrollShowing,\n isVerticalScrollShowing: isVerticalScrollShowing,\n setElementWidth: setElementWidth,\n setFixedWidth: setFixedWidth,\n setElementHeight: setElementHeight,\n setFixedHeight: setFixedHeight,\n formatSize: formatSize,\n isNode: isNode,\n isElement: isElement,\n isNodeOrElement: isNodeOrElement,\n copyNodeList: copyNodeList,\n iterateNamedNodeMap: iterateNamedNodeMap,\n setCheckboxState: setCheckboxState,\n addOrRemoveAttribute: addOrRemoveAttribute,\n nodeListForEach: nodeListForEach\n});\n\n/**\n * @ag-grid-community/core - Advanced Data Grid / Data Table supporting Javascript / React / AngularJS / Web Components\n * @version v25.1.0\n * @link http://www.ag-grid.com/\n * @license MIT\n */\n/** @deprecated */\nfunction getNameOfClass(theClass) {\n var funcNameRegex = /function (.{1,})\\(/;\n var funcAsString = theClass.toString();\n var results = funcNameRegex.exec(funcAsString);\n return results && results.length > 1 ? results[1] : \"\";\n}\nfunction findLineByLeastSquares(values) {\n var len = values.length;\n var maxDecimals = 0;\n if (len <= 1) {\n return values;\n }\n for (var i = 0; i < values.length; i++) {\n var value = values[i];\n if (Math.floor(value) === value) {\n continue;\n }\n maxDecimals = Math.max(maxDecimals, value.toString().split('.')[1].length);\n }\n var sum_x = 0;\n var sum_y = 0;\n var sum_xy = 0;\n var sum_xx = 0;\n var y = 0;\n for (var x = 0; x < len; x++) {\n y = values[x];\n sum_x += x;\n sum_y += y;\n sum_xx += x * x;\n sum_xy += x * y;\n }\n var m = (len * sum_xy - sum_x * sum_y) / (len * sum_xx - sum_x * sum_x);\n var b = (sum_y / len) - (m * sum_x) / len;\n var result = [];\n for (var x = 0; x <= len; x++) {\n result.push(parseFloat((x * m + b).toFixed(maxDecimals)));\n }\n return result;\n}\n/**\n * Converts a CSS object into string\n * @param {Object} stylesToUse an object eg: {color: 'black', top: '25px'}\n * @return {string} A string like \"color: black; top: 25px;\" for html\n */\nfunction cssStyleObjectToMarkup(stylesToUse) {\n if (!stylesToUse) {\n return '';\n }\n var resParts = [];\n iterateObject(stylesToUse, function (styleKey, styleValue) {\n var styleKeyDashed = camelCaseToHyphen(styleKey);\n resParts.push(styleKeyDashed + \": \" + styleValue + \";\");\n });\n return resParts.join(' ');\n}\n/**\n * Displays a message to the browser. this is useful in iPad, where you can't easily see the console.\n * so the javascript code can use this to give feedback. this is NOT intended to be called in production.\n * it is intended the AG Grid developer calls this to troubleshoot, but then takes out the calls before\n * checking in.\n * @param {string} msg\n */\nfunction message(msg) {\n var eMessage = document.createElement('div');\n var eBox = document.querySelector('#__ag__message');\n eMessage.innerHTML = msg;\n if (!eBox) {\n var template = \"
\";\n eBox = loadTemplate(template);\n if (document.body) {\n document.body.appendChild(eBox);\n }\n }\n eBox.insertBefore(eMessage, eBox.children[0]);\n}\n/**\n * cell renderers are used in a few places. they bind to dom slightly differently to other cell renderes as they\n * can return back strings (instead of html elemnt) in the getGui() method. common code placed here to handle that.\n * @param {AgPromise} cellRendererPromise\n * @param {HTMLElement} eTarget\n */\nfunction bindCellRendererToHtmlElement(cellRendererPromise, eTarget) {\n cellRendererPromise.then(function (cellRenderer) {\n var gui = cellRenderer.getGui();\n if (gui != null) {\n if (typeof gui === 'object') {\n eTarget.appendChild(gui);\n }\n else {\n eTarget.innerHTML = gui;\n }\n }\n });\n}\n\nvar GeneralUtils = /*#__PURE__*/Object.freeze({\n __proto__: null,\n getNameOfClass: getNameOfClass,\n findLineByLeastSquares: findLineByLeastSquares,\n cssStyleObjectToMarkup: cssStyleObjectToMarkup,\n message: message,\n bindCellRendererToHtmlElement: bindCellRendererToHtmlElement\n});\n\n/**\n * @ag-grid-community/core - Advanced Data Grid / Data Table supporting Javascript / React / AngularJS / Web Components\n * @version v25.1.0\n * @link http://www.ag-grid.com/\n * @license MIT\n */\n// ARIA HELPER FUNCTIONS\nfunction setAriaAttribute(element, attribute, value) {\n element.setAttribute(ariaAttributeName(attribute), value.toString());\n}\nfunction removeAriaAttribute(element, attribute) {\n element.removeAttribute(ariaAttributeName(attribute));\n}\nfunction ariaAttributeName(attribute) {\n return \"aria-\" + attribute;\n}\nfunction getAriaSortState(column) {\n var sort;\n if (column.isSortAscending()) {\n sort = 'ascending';\n }\n else if (column.isSortDescending()) {\n sort = 'descending';\n }\n else {\n sort = 'none';\n }\n return sort;\n}\n// ARIA ATTRIBUTE GETTERS\nfunction getAriaLevel(element) {\n return parseInt(element.getAttribute('aria-level'), 10);\n}\nfunction getAriaPosInSet(element) {\n return parseInt(element.getAttribute('aria-posinset'), 10);\n}\nfunction getAriaDescribedBy(element) {\n return element.getAttribute('aria-describedby') || '';\n}\n// ARIA ATTRIBUTE SETTERS\nfunction setAriaLabel(element, label) {\n setAriaAttribute(element, 'label', label);\n}\nfunction setAriaLabelledBy(element, labelledBy) {\n setAriaAttribute(element, 'labelledby', labelledBy);\n}\nfunction setAriaDescribedBy(element, describedby) {\n setAriaAttribute(element, 'describedby', describedby);\n}\nfunction setAriaLevel(element, level) {\n setAriaAttribute(element, 'level', level);\n}\nfunction setAriaDisabled(element, disabled) {\n setAriaAttribute(element, 'disabled', disabled);\n}\nfunction setAriaExpanded(element, expanded) {\n setAriaAttribute(element, 'expanded', expanded);\n}\nfunction removeAriaExpanded(element) {\n removeAriaAttribute(element, 'expanded');\n}\nfunction setAriaSetSize(element, setsize) {\n setAriaAttribute(element, 'setsize', setsize);\n}\nfunction setAriaPosInSet(element, position) {\n setAriaAttribute(element, 'posinset', position);\n}\nfunction setAriaMultiSelectable(element, multiSelectable) {\n setAriaAttribute(element, 'multiselectable', multiSelectable);\n}\nfunction setAriaRowCount(element, rowCount) {\n setAriaAttribute(element, 'rowcount', rowCount);\n}\nfunction setAriaRowIndex(element, rowIndex) {\n setAriaAttribute(element, 'rowindex', rowIndex);\n}\nfunction setAriaColCount(element, colCount) {\n setAriaAttribute(element, 'colcount', colCount);\n}\nfunction setAriaColIndex(element, colIndex) {\n setAriaAttribute(element, 'colindex', colIndex);\n}\nfunction setAriaColSpan(element, colSpan) {\n setAriaAttribute(element, 'colspan', colSpan);\n}\nfunction setAriaSort(element, sort) {\n setAriaAttribute(element, 'sort', sort);\n}\nfunction removeAriaSort(element) {\n removeAriaAttribute(element, 'sort');\n}\nfunction setAriaSelected(element, selected) {\n var attributeName = 'selected';\n if (selected) {\n setAriaAttribute(element, attributeName, selected);\n }\n else {\n removeAriaAttribute(element, attributeName);\n }\n}\nfunction setAriaChecked(element, checked) {\n setAriaAttribute(element, 'checked', checked === undefined ? 'mixed' : checked);\n}\n\nvar AriaUtils = /*#__PURE__*/Object.freeze({\n __proto__: null,\n getAriaSortState: getAriaSortState,\n getAriaLevel: getAriaLevel,\n getAriaPosInSet: getAriaPosInSet,\n getAriaDescribedBy: getAriaDescribedBy,\n setAriaLabel: setAriaLabel,\n setAriaLabelledBy: setAriaLabelledBy,\n setAriaDescribedBy: setAriaDescribedBy,\n setAriaLevel: setAriaLevel,\n setAriaDisabled: setAriaDisabled,\n setAriaExpanded: setAriaExpanded,\n removeAriaExpanded: removeAriaExpanded,\n setAriaSetSize: setAriaSetSize,\n setAriaPosInSet: setAriaPosInSet,\n setAriaMultiSelectable: setAriaMultiSelectable,\n setAriaRowCount: setAriaRowCount,\n setAriaRowIndex: setAriaRowIndex,\n setAriaColCount: setAriaColCount,\n setAriaColIndex: setAriaColIndex,\n setAriaColSpan: setAriaColSpan,\n setAriaSort: setAriaSort,\n removeAriaSort: removeAriaSort,\n setAriaSelected: setAriaSelected,\n setAriaChecked: setAriaChecked\n});\n\n/**\n * @ag-grid-community/core - Advanced Data Grid / Data Table supporting Javascript / React / AngularJS / Web Components\n * @version v25.1.0\n * @link http://www.ag-grid.com/\n * @license MIT\n */\n/**\n * Serialises a Date to a string of format `yyyy-MM-dd HH:mm:ss`.\n * An alternative separator can be provided to be used instead of hyphens.\n * @param date The date to serialise\n * @param includeTime Whether to include the time in the serialised string\n * @param separator The separator to use between date parts\n */\nfunction serialiseDate(date, includeTime, separator) {\n if (includeTime === void 0) { includeTime = true; }\n if (separator === void 0) { separator = '-'; }\n if (!date) {\n return null;\n }\n var serialised = [date.getFullYear(), date.getMonth() + 1, date.getDate()].map(function (part) { return padStart(part, 2); }).join(separator);\n if (includeTime) {\n serialised += ' ' + [date.getHours(), date.getMinutes(), date.getSeconds()].map(function (part) { return padStart(part, 2); }).join(':');\n }\n return serialised;\n}\n/**\n * Parses a date and time from a string in the format `yyyy-MM-dd HH:mm:ss`\n */\nfunction parseDateTimeFromString(value) {\n if (!value) {\n return null;\n }\n var _a = value.split(' '), dateStr = _a[0], timeStr = _a[1];\n if (!dateStr) {\n return null;\n }\n var fields = dateStr.split('-').map(function (f) { return parseInt(f, 10); });\n if (fields.filter(function (f) { return !isNaN(f); }).length !== 3) {\n return null;\n }\n var year = fields[0], month = fields[1], day = fields[2];\n var date = new Date(year, month - 1, day);\n if (date.getFullYear() !== year ||\n date.getMonth() !== month - 1 ||\n date.getDate() !== day) {\n // date was not parsed as expected so must have been invalid\n return null;\n }\n if (!timeStr || timeStr === '00:00:00') {\n return date;\n }\n var _b = timeStr.split(':').map(function (part) { return parseInt(part, 10); }), hours = _b[0], minutes = _b[1], seconds = _b[2];\n if (hours >= 0 && hours < 24) {\n date.setHours(hours);\n }\n if (minutes >= 0 && minutes < 60) {\n date.setMinutes(minutes);\n }\n if (seconds >= 0 && seconds < 60) {\n date.setSeconds(seconds);\n }\n return date;\n}\n\nvar DateUtils = /*#__PURE__*/Object.freeze({\n __proto__: null,\n serialiseDate: serialiseDate,\n parseDateTimeFromString: parseDateTimeFromString\n});\n\n/**\n * @ag-grid-community/core - Advanced Data Grid / Data Table supporting Javascript / React / AngularJS / Web Components\n * @version v25.1.0\n * @link http://www.ag-grid.com/\n * @license MIT\n */\nfunction fuzzyCheckStrings(inputValues, validValues, allSuggestions) {\n var fuzzyMatches = {};\n var invalidInputs = inputValues.filter(function (inputValue) {\n return !validValues.some(function (validValue) { return validValue === inputValue; });\n });\n if (invalidInputs.length > 0) {\n invalidInputs.forEach(function (invalidInput) {\n return fuzzyMatches[invalidInput] = fuzzySuggestions(invalidInput, allSuggestions);\n });\n }\n return fuzzyMatches;\n}\n/**\n *\n * @param {String} inputValue The value to be compared against a list of strings\n * @param allSuggestions The list of strings to be compared against\n * @param hideIrrelevant By default, fuzzy suggestions will just sort the allSuggestions list, set this to true\n * to filter out the irrelevant values\n * @param weighted Set this to true, to make letters matched in the order they were typed have priority in the results.\n */\nfunction fuzzySuggestions(inputValue, allSuggestions, hideIrrelevant, weighted) {\n var search = weighted ? string_weighted_distances : string_distances;\n var thisSuggestions = allSuggestions.map(function (text) { return ({\n value: text,\n relevance: search(inputValue.toLowerCase(), text.toLocaleLowerCase())\n }); });\n thisSuggestions.sort(function (a, b) { return b.relevance - a.relevance; });\n if (hideIrrelevant) {\n thisSuggestions = thisSuggestions.filter(function (suggestion) { return suggestion.relevance !== 0; });\n }\n return thisSuggestions.map(function (suggestion) { return suggestion.value; });\n}\n/**\n * Algorithm to do fuzzy search\n * from https://stackoverflow.com/questions/23305000/javascript-fuzzy-search-that-makes-sense\n * @param {string} from\n * @return {[]}\n */\nfunction get_bigrams(from) {\n var s = from.toLowerCase();\n var v = new Array(s.length - 1);\n var i;\n var j;\n var ref;\n for (i = j = 0, ref = v.length; j <= ref; i = j += 1) {\n v[i] = s.slice(i, i + 2);\n }\n return v;\n}\nfunction string_distances(str1, str2) {\n if (str1.length === 0 && str2.length === 0) {\n return 0;\n }\n var pairs1 = get_bigrams(str1);\n var pairs2 = get_bigrams(str2);\n var union = pairs1.length + pairs2.length;\n var hit_count = 0;\n var j;\n var len;\n for (j = 0, len = pairs1.length; j < len; j++) {\n var x = pairs1[j];\n var k = void 0;\n var len1 = void 0;\n for (k = 0, len1 = pairs2.length; k < len1; k++) {\n var y = pairs2[k];\n if (x === y) {\n hit_count++;\n }\n }\n }\n return hit_count > 0 ? (2 * hit_count) / union : 0;\n}\nfunction string_weighted_distances(str1, str2) {\n var a = str1.replace(/\\s/g, '');\n var b = str2.replace(/\\s/g, '');\n var weight = 0;\n var lastIndex = 0;\n for (var i = 0; i < a.length; i++) {\n var idx = b.indexOf(a[i]);\n if (idx === -1) {\n continue;\n }\n lastIndex = idx;\n weight += ((b.length - lastIndex) * 100) / b.length;\n weight *= weight;\n }\n return weight;\n}\n\nvar FuzzyMatchUtils = /*#__PURE__*/Object.freeze({\n __proto__: null,\n fuzzyCheckStrings: fuzzyCheckStrings,\n fuzzySuggestions: fuzzySuggestions,\n get_bigrams: get_bigrams,\n string_distances: string_distances,\n string_weighted_distances: string_weighted_distances\n});\n\n/**\n * @ag-grid-community/core - Advanced Data Grid / Data Table supporting Javascript / React / AngularJS / Web Components\n * @version v25.1.0\n * @link http://www.ag-grid.com/\n * @license MIT\n */\n//\n// IMPORTANT NOTE!\n//\n// If you change the list below, copy/paste the new content into the docs page javascript-grid-icons\n//\nvar iconNameClassMap = {\n // header column group shown when expanded (click to contract)\n columnGroupOpened: 'expanded',\n // header column group shown when contracted (click to expand)\n columnGroupClosed: 'contracted',\n // tool panel column group contracted (click to expand)\n columnSelectClosed: 'tree-closed',\n // tool panel column group expanded (click to contract)\n columnSelectOpen: 'tree-open',\n // column tool panel header expand/collapse all button, shown when some children are expanded and\n // others are collapsed\n columnSelectIndeterminate: 'tree-indeterminate',\n // shown on ghost icon while dragging column to the side of the grid to pin\n columnMovePin: 'pin',\n // shown on ghost icon while dragging over part of the page that is not a drop zone\n columnMoveHide: 'eye-slash',\n // shown on ghost icon while dragging columns to reorder\n columnMoveMove: 'arrows',\n // animating icon shown when dragging a column to the right of the grid causes horizontal scrolling\n columnMoveLeft: 'left',\n // animating icon shown when dragging a column to the left of the grid causes horizontal scrolling\n columnMoveRight: 'right',\n // shown on ghost icon while dragging over Row Groups drop zone\n columnMoveGroup: 'group',\n // shown on ghost icon while dragging over Values drop zone\n columnMoveValue: 'aggregation',\n // shown on ghost icon while dragging over pivot drop zone\n columnMovePivot: 'pivot',\n // shown on ghost icon while dragging over drop zone that doesn't support it, e.g.\n // string column over aggregation drop zone\n dropNotAllowed: 'not-allowed',\n // shown on row group when contracted (click to expand)\n groupContracted: 'tree-closed',\n // shown on row group when expanded (click to contract)\n groupExpanded: 'tree-open',\n // context menu chart item\n chart: 'chart',\n // chart window title bar\n close: 'cross',\n // X (remove) on column 'pill' after adding it to a drop zone list\n cancel: 'cancel',\n // indicates the currently active pin state in the \"Pin column\" sub-menu of the column menu\n check: 'tick',\n // \"go to first\" button in pagination controls\n first: 'first',\n // \"go to previous\" button in pagination controls\n previous: 'previous',\n // \"go to next\" button in pagination controls\n next: 'next',\n // \"go to last\" button in pagination controls\n last: 'last',\n // shown on top right of chart when chart is linked to range data (click to unlink)\n linked: 'linked',\n // shown on top right of chart when chart is not linked to range data (click to link)\n unlinked: 'unlinked',\n // \"Choose colour\" button on chart settings tab\n colorPicker: 'color-picker',\n // rotating spinner shown by the loading cell renderer\n groupLoading: 'loading',\n // button to launch enterprise column menu\n menu: 'menu',\n // filter tool panel tab\n filter: 'filter',\n // column tool panel tab\n columns: 'columns',\n // button in chart regular size window title bar (click to maximise)\n maximize: 'maximize',\n // button in chart maximised window title bar (click to make regular size)\n minimize: 'minimize',\n // \"Pin column\" item in column header menu\n menuPin: 'pin',\n // \"Value aggregation\" column menu item (shown on numeric columns when grouping is active)\"\n menuValue: 'aggregation',\n // \"Group by {column-name}\" item in column header menu\n menuAddRowGroup: 'group',\n // \"Un-Group by {column-name}\" item in column header menu\n menuRemoveRowGroup: 'group',\n // context menu copy item\n clipboardCopy: 'copy',\n // context menu paste item\n clipboardPaste: 'paste',\n // identifies the pivot drop zone\n pivotPanel: 'pivot',\n // \"Row groups\" drop zone in column tool panel\n rowGroupPanel: 'group',\n // columns tool panel Values drop zone\n valuePanel: 'aggregation',\n // drag handle used to pick up draggable columns\n columnDrag: 'grip',\n // drag handle used to pick up draggable rows\n rowDrag: 'grip',\n // context menu export item\n save: 'save',\n // icon on dropdown editors\n smallDown: 'small-down',\n // version of small-right used in RTL mode\n smallLeft: 'small-left',\n // separater between column 'pills' when you add multiple columns to the header drop zone\n smallRight: 'small-right',\n smallUp: 'small-up',\n // show on column header when column is sorted ascending\n sortAscending: 'asc',\n // show on column header when column is sorted descending\n sortDescending: 'desc',\n // show on column header when column has no sort, only when enabled with gridOptions.unSortIcon=true\n sortUnSort: 'none'\n};\n/**\n * If icon provided, use this (either a string, or a function callback).\n * if not, then use the default icon from the theme\n * @param {string} iconName\n * @param {GridOptionsWrapper} gridOptionsWrapper\n * @param {Column | null} [column]\n * @returns {HTMLElement}\n */\nfunction createIcon(iconName, gridOptionsWrapper, column) {\n var iconContents = createIconNoSpan(iconName, gridOptionsWrapper, column);\n if (iconContents && iconContents.className.indexOf('ag-icon') > -1) {\n return iconContents;\n }\n var eResult = document.createElement('span');\n eResult.appendChild(iconContents);\n return eResult;\n}\nfunction createIconNoSpan(iconName, gridOptionsWrapper, column, forceCreate) {\n var userProvidedIcon = null;\n // check col for icon first\n var icons = column && column.getColDef().icons;\n if (icons) {\n userProvidedIcon = icons[iconName];\n }\n // if not in col, try grid options\n if (gridOptionsWrapper && !userProvidedIcon) {\n var optionsIcons = gridOptionsWrapper.getIcons();\n if (optionsIcons) {\n userProvidedIcon = optionsIcons[iconName];\n }\n }\n // now if user provided, use it\n if (userProvidedIcon) {\n var rendererResult = void 0;\n if (typeof userProvidedIcon === 'function') {\n rendererResult = userProvidedIcon();\n }\n else if (typeof userProvidedIcon === 'string') {\n rendererResult = userProvidedIcon;\n }\n else {\n throw new Error('icon from grid options needs to be a string or a function');\n }\n if (typeof rendererResult === 'string') {\n return loadTemplate(rendererResult);\n }\n if (isNodeOrElement(rendererResult)) {\n return rendererResult;\n }\n console.warn('AG Grid: iconRenderer should return back a string or a dom object');\n }\n else {\n var span = document.createElement('span');\n var cssClass = iconNameClassMap[iconName];\n if (!cssClass) {\n if (!forceCreate) {\n console.warn(\"AG Grid: Did not find icon \" + iconName);\n cssClass = '';\n }\n else {\n cssClass = iconName;\n }\n }\n span.setAttribute('class', \"ag-icon ag-icon-\" + cssClass);\n span.setAttribute('unselectable', 'on');\n span.setAttribute('role', 'presentation');\n return span;\n }\n}\n\nvar IconUtils = /*#__PURE__*/Object.freeze({\n __proto__: null,\n iconNameClassMap: iconNameClassMap,\n createIcon: createIcon,\n createIconNoSpan: createIconNoSpan\n});\n\n/**\n * @ag-grid-community/core - Advanced Data Grid / Data Table supporting Javascript / React / AngularJS / Web Components\n * @version v25.1.0\n * @link http://www.ag-grid.com/\n * @license MIT\n */\nvar NUMPAD_DEL_NUMLOCK_ON_KEY = 'Del';\nvar NUMPAD_DEL_NUMLOCK_ON_CHARCODE = 46;\nfunction isKeyPressed(event, keyToCheck) {\n return (event.which || event.keyCode) === keyToCheck;\n}\nfunction isEventFromPrintableCharacter(event) {\n // no allowed printable chars have alt or ctrl key combinations\n if (event.altKey || event.ctrlKey || event.metaKey) {\n return false;\n }\n // if key is length 1, eg if it is 'a' for the a key, or '2' for the '2' key.\n // non-printable characters have names, eg 'Enter' or 'Backspace'.\n var printableCharacter = event.key.length === 1;\n // IE11 & Edge treat the numpad del key differently - with numlock on we get \"Del\" for key,\n // so this addition checks if its IE11/Edge and handles that specific case the same was as all other browsers\n var numpadDelWithNumlockOnForEdgeOrIe = isNumpadDelWithNumlockOnForEdgeOrIe(event);\n return printableCharacter || numpadDelWithNumlockOnForEdgeOrIe;\n}\n/**\n * Allows user to tell the grid to skip specific keyboard events\n * @param {GridOptionsWrapper} gridOptionsWrapper\n * @param {KeyboardEvent} keyboardEvent\n * @param {RowNode} rowNode\n * @param {Column} column\n * @param {boolean} editing\n * @returns {boolean}\n */\nfunction isUserSuppressingKeyboardEvent(gridOptionsWrapper, keyboardEvent, rowNode, column, editing) {\n var gridOptionsFunc = gridOptionsWrapper.getSuppressKeyboardEventFunc();\n var colDefFunc = column ? column.getColDef().suppressKeyboardEvent : undefined;\n // if no callbacks provided by user, then do nothing\n if (!gridOptionsFunc && !colDefFunc) {\n return false;\n }\n var params = {\n event: keyboardEvent,\n editing: editing,\n column: column,\n api: gridOptionsWrapper.getApi(),\n node: rowNode,\n data: rowNode.data,\n colDef: column.getColDef(),\n context: gridOptionsWrapper.getContext(),\n columnApi: gridOptionsWrapper.getColumnApi()\n };\n // colDef get first preference on suppressing events\n if (colDefFunc) {\n var colDefFuncResult = colDefFunc(params);\n // if colDef func suppressed, then return now, no need to call gridOption func\n if (colDefFuncResult) {\n return true;\n }\n }\n if (gridOptionsFunc) {\n // if gridOption func, return the result\n return gridOptionsFunc(params);\n }\n // otherwise return false, don't suppress, as colDef didn't suppress and no func on gridOptions\n return false;\n}\nfunction isUserSuppressingHeaderKeyboardEvent(gridOptionsWrapper, keyboardEvent, headerRowIndex, column) {\n var colDef = column.getDefinition();\n var colDefFunc = colDef && colDef.suppressHeaderKeyboardEvent;\n if (!exists(colDefFunc)) {\n return false;\n }\n var params = {\n api: gridOptionsWrapper.getApi(),\n columnApi: gridOptionsWrapper.getColumnApi(),\n context: gridOptionsWrapper.getContext(),\n colDef: colDef,\n column: column,\n headerRowIndex: headerRowIndex,\n event: keyboardEvent\n };\n return !!colDefFunc(params);\n}\nfunction isNumpadDelWithNumlockOnForEdgeOrIe(event) {\n return (isBrowserEdge() || isBrowserIE()) &&\n event.key === NUMPAD_DEL_NUMLOCK_ON_KEY &&\n event.charCode === NUMPAD_DEL_NUMLOCK_ON_CHARCODE;\n}\n\nvar KeyboardUtils = /*#__PURE__*/Object.freeze({\n __proto__: null,\n isKeyPressed: isKeyPressed,\n isEventFromPrintableCharacter: isEventFromPrintableCharacter,\n isUserSuppressingKeyboardEvent: isUserSuppressingKeyboardEvent,\n isUserSuppressingHeaderKeyboardEvent: isUserSuppressingHeaderKeyboardEvent\n});\n\n/**\n * @ag-grid-community/core - Advanced Data Grid / Data Table supporting Javascript / React / AngularJS / Web Components\n * @version v25.1.0\n * @link http://www.ag-grid.com/\n * @license MIT\n */\nfunction keys(map) {\n var arr = [];\n map.forEach(function (_, key) { return arr.push(key); });\n return arr;\n}\n\nvar MapUtils = /*#__PURE__*/Object.freeze({\n __proto__: null,\n keys: keys\n});\n\n/**\n * @ag-grid-community/core - Advanced Data Grid / Data Table supporting Javascript / React / AngularJS / Web Components\n * @version v25.1.0\n * @link http://www.ag-grid.com/\n * @license MIT\n */\n/**\n * @deprecated\n * Mouse wheel (and 2-finger trackpad) support on the web sucks. It is\n * complicated, thus this doc is long and (hopefully) detailed enough to answer\n * your questions.\n *\n * If you need to react to the mouse wheel in a predictable way, this code is\n * like your bestest friend. * hugs *\n *\n * As of today, there are 4 DOM event types you can listen to:\n *\n * 'wheel' -- Chrome(31+), FF(17+), IE(9+)\n * 'mousewheel' -- Chrome, IE(6+), Opera, Safari\n * 'MozMousePixelScroll' -- FF(3.5 only!) (2010-2013) -- don't bother!\n * 'DOMMouseScroll' -- FF(0.9.7+) since 2003\n *\n * So what to do? The is the best:\n *\n * normalizeWheel.getEventType();\n *\n * In your event callback, use this code to get sane interpretation of the\n * deltas. This code will return an object with properties:\n *\n * spinX -- normalized spin speed (use for zoom) - x plane\n * spinY -- \" - y plane\n * pixelX -- normalized distance (to pixels) - x plane\n * pixelY -- \" - y plane\n *\n * Wheel values are provided by the browser assuming you are using the wheel to\n * scroll a web page by a number of lines or pixels (or pages). Values can vary\n * significantly on different platforms and browsers, forgetting that you can\n * scroll at different speeds. Some devices (like trackpads) emit more events\n * at smaller increments with fine granularity, and some emit massive jumps with\n * linear speed or acceleration.\n *\n * This code does its best to normalize the deltas for you:\n *\n * - spin is trying to normalize how far the wheel was spun (or trackpad\n * dragged). This is super useful for zoom support where you want to\n * throw away the chunky scroll steps on the PC and make those equal to\n * the slow and smooth tiny steps on the Mac. Key data: This code tries to\n * resolve a single slow step on a wheel to 1.\n *\n * - pixel is normalizing the desired scroll delta in pixel units. You'll\n * get the crazy differences between browsers, but at least it'll be in\n * pixels!\n *\n * - positive value indicates scrolling DOWN/RIGHT, negative UP/LEFT. This\n * should translate to positive value zooming IN, negative zooming OUT.\n * This matches the newer 'wheel' event.\n *\n * Why are there spinX, spinY (or pixels)?\n *\n * - spinX is a 2-finger side drag on the trackpad, and a shift + wheel turn\n * with a mouse. It results in side-scrolling in the browser by default.\n *\n * - spinY is what you expect -- it's the classic axis of a mouse wheel.\n *\n * - I dropped spinZ/pixelZ. It is supported by the DOM 3 'wheel' event and\n * probably is by browsers in conjunction with fancy 3D controllers .. but\n * you know.\n *\n * Implementation info:\n *\n * Examples of 'wheel' event if you scroll slowly (down) by one step with an\n * average mouse:\n *\n * OS X + Chrome (mouse) - 4 pixel delta (wheelDelta -120)\n * OS X + Safari (mouse) - N/A pixel delta (wheelDelta -12)\n * OS X + Firefox (mouse) - 0.1 line delta (wheelDelta N/A)\n * Win8 + Chrome (mouse) - 100 pixel delta (wheelDelta -120)\n * Win8 + Firefox (mouse) - 3 line delta (wheelDelta -120)\n *\n * On the trackpad:\n *\n * OS X + Chrome (trackpad) - 2 pixel delta (wheelDelta -6)\n * OS X + Firefox (trackpad) - 1 pixel delta (wheelDelta N/A)\n *\n * On other/older browsers.. it's more complicated as there can be multiple and\n * also missing delta values.\n *\n * The 'wheel' event is more standard:\n *\n * http://www.w3.org/TR/DOM-Level-3-Events/#events-wheelevents\n *\n * The basics is that it includes a unit, deltaMode (pixels, lines, pages), and\n * deltaX, deltaY and deltaZ. Some browsers provide other values to maintain\n * backward compatibility with older events. Those other values help us\n * better normalize spin speed. Example of what the browsers provide:\n *\n * | event.wheelDelta | event.detail\n * ------------------+------------------+--------------\n * Safari v5/OS X | -120 | 0\n * Safari v5/Win7 | -120 | 0\n * Chrome v17/OS X | -120 | 0\n * Chrome v17/Win7 | -120 | 0\n * IE9/Win7 | -120 | undefined\n * Firefox v4/OS X | undefined | 1\n * Firefox v4/Win7 | undefined | 3\n *\n * from: https://github.com/facebook/fixed-data-table/blob/master/src/vendor_upstream/dom/normalizeWheel.js\n * @param {any} event\n * @return {any}\n */\nfunction normalizeWheel(event) {\n var PIXEL_STEP = 10;\n var LINE_HEIGHT = 40;\n var PAGE_HEIGHT = 800;\n // spinX, spinY\n var sX = 0;\n var sY = 0;\n // pixelX, pixelY\n var pX = 0;\n var pY = 0;\n // Legacy\n if ('detail' in event) {\n sY = event.detail;\n }\n if ('wheelDelta' in event) {\n sY = -event.wheelDelta / 120;\n }\n if ('wheelDeltaY' in event) {\n sY = -event.wheelDeltaY / 120;\n }\n if ('wheelDeltaX' in event) {\n sX = -event.wheelDeltaX / 120;\n }\n // side scrolling on FF with DOMMouseScroll\n if ('axis' in event && event.axis === event.HORIZONTAL_AXIS) {\n sX = sY;\n sY = 0;\n }\n pX = sX * PIXEL_STEP;\n pY = sY * PIXEL_STEP;\n if ('deltaY' in event) {\n pY = event.deltaY;\n }\n if ('deltaX' in event) {\n pX = event.deltaX;\n }\n if ((pX || pY) && event.deltaMode) {\n if (event.deltaMode == 1) { // delta in LINE units\n pX *= LINE_HEIGHT;\n pY *= LINE_HEIGHT;\n }\n else { // delta in PAGE units\n pX *= PAGE_HEIGHT;\n pY *= PAGE_HEIGHT;\n }\n }\n // Fall-back if spin cannot be determined\n if (pX && !sX) {\n sX = (pX < 1) ? -1 : 1;\n }\n if (pY && !sY) {\n sY = (pY < 1) ? -1 : 1;\n }\n return {\n spinX: sX,\n spinY: sY,\n pixelX: pX,\n pixelY: pY\n };\n}\n/**\n * @deprecated\n * Checks if event was issued by a left click\n * from https://stackoverflow.com/questions/3944122/detect-left-mouse-button-press\n * @param {MouseEvent} mouseEvent\n * @returns {boolean}\n */\nfunction isLeftClick(mouseEvent) {\n if ('buttons' in mouseEvent) {\n return mouseEvent.buttons == 1;\n }\n var button = mouseEvent.which || mouseEvent.button;\n return button == 1;\n}\n/**\n * `True` if the event is close to the original event by X pixels either vertically or horizontally.\n * we only start dragging after X pixels so this allows us to know if we should start dragging yet.\n * @param {MouseEvent | TouchEvent} e1\n * @param {MouseEvent | TouchEvent} e2\n * @param {number} pixelCount\n * @returns {boolean}\n */\nfunction areEventsNear(e1, e2, pixelCount) {\n // by default, we wait 4 pixels before starting the drag\n if (pixelCount === 0) {\n return false;\n }\n var diffX = Math.abs(e1.clientX - e2.clientX);\n var diffY = Math.abs(e1.clientY - e2.clientY);\n return Math.max(diffX, diffY) <= pixelCount;\n}\n\nvar MouseUtils = /*#__PURE__*/Object.freeze({\n __proto__: null,\n normalizeWheel: normalizeWheel,\n isLeftClick: isLeftClick,\n areEventsNear: areEventsNear\n});\n\n/**\n * @ag-grid-community/core - Advanced Data Grid / Data Table supporting Javascript / React / AngularJS / Web Components\n * @version v25.1.0\n * @link http://www.ag-grid.com/\n * @license MIT\n */\n/**\n * Gets called by: a) ClientSideNodeManager and b) GroupStage to do sorting.\n * when in ClientSideNodeManager we always have indexes (as this sorts the items the\n * user provided) but when in GroupStage, the nodes can contain filler nodes that\n * don't have order id's\n * @param {RowNode[]} rowNodes\n * @param {Object} rowNodeOrder\n */\nfunction sortRowNodesByOrder(rowNodes, rowNodeOrder) {\n if (!rowNodes) {\n return;\n }\n var comparator = function (nodeA, nodeB) {\n var positionA = rowNodeOrder[nodeA.id];\n var positionB = rowNodeOrder[nodeB.id];\n var aHasIndex = positionA !== undefined;\n var bHasIndex = positionB !== undefined;\n var bothNodesAreUserNodes = aHasIndex && bHasIndex;\n var bothNodesAreFillerNodes = !aHasIndex && !bHasIndex;\n if (bothNodesAreUserNodes) {\n // when comparing two nodes the user has provided, they always\n // have indexes\n return positionA - positionB;\n }\n if (bothNodesAreFillerNodes) {\n // when comparing two filler nodes, we have no index to compare them\n // against, however we want this sorting to be deterministic, so that\n // the rows don't jump around as the user does delta updates. so we\n // want the same sort result. so we use the __objectId - which doesn't make sense\n // from a sorting point of view, but does give consistent behaviour between\n // calls. otherwise groups jump around as delta updates are done.\n // note: previously here we used nodeId, however this gave a strange order\n // as string ordering of numbers is wrong, so using id based on creation order\n // as least gives better looking order.\n return nodeA.__objectId - nodeB.__objectId;\n }\n if (aHasIndex) {\n return 1;\n }\n return -1;\n };\n // check if the list first needs sorting\n var rowNodeA;\n var rowNodeB;\n var atLeastOneOutOfOrder = false;\n for (var i = 0; i < rowNodes.length - 1; i++) {\n rowNodeA = rowNodes[i];\n rowNodeB = rowNodes[i + 1];\n if (comparator(rowNodeA, rowNodeB) > 0) {\n atLeastOneOutOfOrder = true;\n break;\n }\n }\n if (atLeastOneOutOfOrder) {\n rowNodes.sort(comparator);\n }\n}\nfunction traverseNodesWithKey(nodes, callback) {\n var keyParts = [];\n recursiveSearchNodes(nodes);\n function recursiveSearchNodes(currentNodes) {\n if (!currentNodes) {\n return;\n }\n currentNodes.forEach(function (node) {\n // also checking for children for tree data\n if (node.group || node.hasChildren()) {\n keyParts.push(node.key);\n var key = keyParts.join('|');\n callback(node, key);\n recursiveSearchNodes(node.childrenAfterGroup);\n keyParts.pop();\n }\n });\n }\n}\n\nvar RowNodeUtils = /*#__PURE__*/Object.freeze({\n __proto__: null,\n sortRowNodesByOrder: sortRowNodesByOrder,\n traverseNodesWithKey: traverseNodesWithKey\n});\n\n/**\n * @ag-grid-community/core - Advanced Data Grid / Data Table supporting Javascript / React / AngularJS / Web Components\n * @version v25.1.0\n * @link http://www.ag-grid.com/\n * @license MIT\n */\nfunction convertToSet(list) {\n var set = new Set();\n list.forEach(function (x) { return set.add(x); });\n return set;\n}\n\nvar SetUtils = /*#__PURE__*/Object.freeze({\n __proto__: null,\n convertToSet: convertToSet\n});\n\n/**\n * @ag-grid-community/core - Advanced Data Grid / Data Table supporting Javascript / React / AngularJS / Web Components\n * @version v25.1.0\n * @link http://www.ag-grid.com/\n * @license MIT\n */\nvar __assign = (undefined && undefined.__assign) || function () {\n __assign = Object.assign || function(t) {\n for (var s, i = 1, n = arguments.length; i < n; i++) {\n s = arguments[i];\n for (var p in s) if (Object.prototype.hasOwnProperty.call(s, p))\n t[p] = s[p];\n }\n return t;\n };\n return __assign.apply(this, arguments);\n};\nvar utils = __assign(__assign(__assign(__assign(__assign(__assign(__assign(__assign(__assign(__assign(__assign(__assign(__assign(__assign(__assign(__assign(__assign(__assign(__assign(__assign({}, GeneralUtils), AriaUtils), ArrayUtils), BrowserUtils), CsvUtils), DateUtils), DomUtils), EventUtils), FunctionUtils), FuzzyMatchUtils), GenericUtils), IconUtils), KeyboardUtils), MapUtils), MouseUtils), NumberUtils), ObjectUtils), RowNodeUtils), SetUtils), StringUtils);\nvar _ = utils;\n\n/**\n * @ag-grid-community/core - Advanced Data Grid / Data Table supporting Javascript / React / AngularJS / Web Components\n * @version v25.1.0\n * @link http://www.ag-grid.com/\n * @license MIT\n */\nvar NumberSequence = /** @class */ (function () {\n function NumberSequence(initValue, step) {\n if (initValue === void 0) { initValue = 0; }\n if (step === void 0) { step = 1; }\n this.nextValue = initValue;\n this.step = step;\n }\n NumberSequence.prototype.next = function () {\n var valToReturn = this.nextValue;\n this.nextValue += this.step;\n return valToReturn;\n };\n NumberSequence.prototype.peek = function () {\n return this.nextValue;\n };\n NumberSequence.prototype.skip = function (count) {\n this.nextValue += count;\n };\n return NumberSequence;\n}());\n\n/**\n * @ag-grid-community/core - Advanced Data Grid / Data Table supporting Javascript / React / AngularJS / Web Components\n * @version v25.1.0\n * @link http://www.ag-grid.com/\n * @license MIT\n */\n(function (AgPromiseStatus) {\n AgPromiseStatus[AgPromiseStatus[\"IN_PROGRESS\"] = 0] = \"IN_PROGRESS\";\n AgPromiseStatus[AgPromiseStatus[\"RESOLVED\"] = 1] = \"RESOLVED\";\n})(exports.AgPromiseStatus || (exports.AgPromiseStatus = {}));\nvar AgPromise = /** @class */ (function () {\n function AgPromise(callback) {\n var _this = this;\n this.status = exports.AgPromiseStatus.IN_PROGRESS;\n this.resolution = null;\n this.waiters = [];\n callback(function (value) { return _this.onDone(value); }, function (params) { return _this.onReject(params); });\n }\n AgPromise.all = function (promises) {\n return new AgPromise(function (resolve) {\n var remainingToResolve = promises.length;\n var combinedValues = new Array(remainingToResolve);\n forEach(promises, function (promise, index) {\n promise.then(function (value) {\n combinedValues[index] = value;\n remainingToResolve--;\n if (remainingToResolve === 0) {\n resolve(combinedValues);\n }\n });\n });\n });\n };\n AgPromise.resolve = function (value) {\n if (value === void 0) { value = null; }\n return new AgPromise(function (resolve) { return resolve(value); });\n };\n AgPromise.prototype.then = function (func) {\n var _this = this;\n return new AgPromise(function (resolve) {\n if (_this.status === exports.AgPromiseStatus.RESOLVED) {\n resolve(func(_this.resolution));\n }\n else {\n _this.waiters.push(function (value) { return resolve(func(value)); });\n }\n });\n };\n AgPromise.prototype.resolveNow = function (ifNotResolvedValue, ifResolved) {\n return this.status === exports.AgPromiseStatus.RESOLVED ? ifResolved(this.resolution) : ifNotResolvedValue;\n };\n AgPromise.prototype.onDone = function (value) {\n this.status = exports.AgPromiseStatus.RESOLVED;\n this.resolution = value;\n forEach(this.waiters, function (waiter) { return waiter(value); });\n };\n AgPromise.prototype.onReject = function (params) {\n console.warn('TBI');\n };\n return AgPromise;\n}());\n\n/**\n * @ag-grid-community/core - Advanced Data Grid / Data Table supporting Javascript / React / AngularJS / Web Components\n * @version v25.1.0\n * @link http://www.ag-grid.com/\n * @license MIT\n */\n/**\n * A Util Class only used when debugging for printing time to console\n */\nvar Timer = /** @class */ (function () {\n function Timer() {\n this.timestamp = new Date().getTime();\n }\n Timer.prototype.print = function (msg) {\n var duration = (new Date().getTime()) - this.timestamp;\n console.info(msg + \" = \" + duration);\n this.timestamp = new Date().getTime();\n };\n return Timer;\n}());\n\n/**\n * @ag-grid-community/core - Advanced Data Grid / Data Table supporting Javascript / React / AngularJS / Web Components\n * @version v25.1.0\n * @link http://www.ag-grid.com/\n * @license MIT\n */\nvar __extends$4 = (undefined && undefined.__extends) || (function () {\n var extendStatics = function (d, b) {\n extendStatics = Object.setPrototypeOf ||\n ({ __proto__: [] } instanceof Array && function (d, b) { d.__proto__ = b; }) ||\n function (d, b) { for (var p in b) if (b.hasOwnProperty(p)) d[p] = b[p]; };\n return extendStatics(d, b);\n };\n return function (d, b) {\n extendStatics(d, b);\n function __() { this.constructor = d; }\n d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __());\n };\n})();\nvar __assign$1 = (undefined && undefined.__assign) || function () {\n __assign$1 = Object.assign || function(t) {\n for (var s, i = 1, n = arguments.length; i < n; i++) {\n s = arguments[i];\n for (var p in s) if (Object.prototype.hasOwnProperty.call(s, p))\n t[p] = s[p];\n }\n return t;\n };\n return __assign$1.apply(this, arguments);\n};\nvar __decorate$8 = (undefined && undefined.__decorate) || function (decorators, target, key, desc) {\n var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d;\n if (typeof Reflect === \"object\" && typeof Reflect.decorate === \"function\") r = Reflect.decorate(decorators, target, key, desc);\n else for (var i = decorators.length - 1; i >= 0; i--) if (d = decorators[i]) r = (c < 3 ? d(r) : c > 3 ? d(target, key, r) : d(target, key)) || r;\n return c > 3 && r && Object.defineProperty(target, key, r), r;\n};\nvar TooltipStates;\n(function (TooltipStates) {\n TooltipStates[TooltipStates[\"NOTHING\"] = 0] = \"NOTHING\";\n TooltipStates[TooltipStates[\"WAITING_TO_SHOW\"] = 1] = \"WAITING_TO_SHOW\";\n TooltipStates[TooltipStates[\"SHOWING\"] = 2] = \"SHOWING\";\n})(TooltipStates || (TooltipStates = {}));\nvar TooltipFeature = /** @class */ (function (_super) {\n __extends$4(TooltipFeature, _super);\n function TooltipFeature(parentComp) {\n var _this = _super.call(this) || this;\n _this.DEFAULT_HIDE_TOOLTIP_TIMEOUT = 10000;\n _this.SHOW_QUICK_TOOLTIP_DIFF = 1000;\n _this.FADE_OUT_TOOLTIP_TIMEOUT = 1000;\n _this.state = TooltipStates.NOTHING;\n // when showing the tooltip, we need to make sure it's the most recent instance we request, as due to\n // async we could request two tooltips before the first instance returns, in which case we should\n // disregard the second instance.\n _this.tooltipInstanceCount = 0;\n _this.tooltipMouseTrack = false;\n _this.parentComp = parentComp;\n return _this;\n }\n TooltipFeature.prototype.postConstruct = function () {\n this.tooltipShowDelay = this.gridOptionsWrapper.getTooltipShowDelay() || 2000;\n this.tooltipMouseTrack = this.gridOptionsWrapper.isTooltipMouseTrack();\n var el = this.parentComp.getGui();\n this.addManagedListener(el, 'mouseenter', this.onMouseEnter.bind(this));\n this.addManagedListener(el, 'mouseleave', this.onMouseLeave.bind(this));\n this.addManagedListener(el, 'mousemove', this.onMouseMove.bind(this));\n this.addManagedListener(el, 'mousedown', this.onMouseDown.bind(this));\n this.addManagedListener(el, 'keydown', this.onKeyDown.bind(this));\n };\n TooltipFeature.prototype.destroy = function () {\n // if this component gets destroyed while tooltip is showing, need to make sure\n // we don't end with no mouseLeave event resulting in zombie tooltip\n this.setToDoNothing();\n _super.prototype.destroy.call(this);\n };\n TooltipFeature.prototype.onMouseEnter = function (e) {\n // every mouseenter should be following by a mouseleave, however for some unkonwn, it's possible for\n // mouseenter to be called twice in a row, which can happen if editing the cell. this was reported\n // in https://ag-grid.atlassian.net/browse/AG-4422. to get around this, we check the state, and if\n // state is !=nothing, then we know mouseenter was already received.\n if (this.state != TooltipStates.NOTHING) {\n return;\n }\n // if another tooltip was hidden very recently, we only wait 200ms to show, not the normal waiting time\n var delay = this.isLastTooltipHiddenRecently() ? 200 : this.tooltipShowDelay;\n this.showTooltipTimeoutId = window.setTimeout(this.showTooltip.bind(this), delay);\n this.lastMouseEvent = e;\n this.state = TooltipStates.WAITING_TO_SHOW;\n };\n TooltipFeature.prototype.onMouseLeave = function () {\n this.setToDoNothing();\n };\n TooltipFeature.prototype.onKeyDown = function () {\n this.setToDoNothing();\n };\n TooltipFeature.prototype.setToDoNothing = function () {\n if (this.state === TooltipStates.SHOWING) {\n this.hideTooltip();\n }\n this.clearTimeouts();\n this.state = TooltipStates.NOTHING;\n };\n TooltipFeature.prototype.onMouseMove = function (e) {\n // there is a delay from the time we mouseOver a component and the time the\n // tooltip is displayed, so we need to track mousemove to be able to correctly\n // position the tooltip when showTooltip is called.\n this.lastMouseEvent = e;\n if (this.tooltipMouseTrack &&\n this.state === TooltipStates.SHOWING &&\n this.tooltipComp) {\n this.positionTooltipUnderLastMouseEvent();\n }\n };\n TooltipFeature.prototype.onMouseDown = function () {\n this.setToDoNothing();\n };\n TooltipFeature.prototype.hideTooltip = function () {\n // check if comp exists - due to async, although we asked for\n // one, the instance may not be back yet\n if (this.tooltipComp) {\n this.destroyTooltipComp();\n TooltipFeature.lastTooltipHideTime = new Date().getTime();\n }\n this.state = TooltipStates.NOTHING;\n };\n TooltipFeature.prototype.destroyTooltipComp = function () {\n var _this = this;\n // add class to fade out the tooltip\n addCssClass(this.tooltipComp.getGui(), 'ag-tooltip-hiding');\n // make local copies of these variables, as we use them in the async function below,\n // and we clear then to 'undefined' later, so need to take a copy before they are undefined.\n var tooltipPopupDestroyFunc = this.tooltipPopupDestroyFunc;\n var tooltipComp = this.tooltipComp;\n window.setTimeout(function () {\n tooltipPopupDestroyFunc();\n _this.getContext().destroyBean(tooltipComp);\n }, this.FADE_OUT_TOOLTIP_TIMEOUT);\n this.tooltipPopupDestroyFunc = undefined;\n this.tooltipComp = undefined;\n };\n TooltipFeature.prototype.isLastTooltipHiddenRecently = function () {\n // return true if <1000ms since last time we hid a tooltip\n var now = new Date().getTime();\n var then = TooltipFeature.lastTooltipHideTime;\n return (now - then) < this.SHOW_QUICK_TOOLTIP_DIFF;\n };\n TooltipFeature.prototype.showTooltip = function () {\n var params = __assign$1({ api: this.gridApi, columnApi: this.columnApi, context: this.gridOptionsWrapper.getContext() }, this.parentComp.getTooltipParams());\n if (!exists(params.value)) {\n this.setToDoNothing();\n return;\n }\n this.state = TooltipStates.SHOWING;\n this.tooltipInstanceCount++;\n // we pass in tooltipInstanceCount so the callback knows what the count was when\n // we requested the tooltip, so if another tooltip was requested in the mean time\n // we disregard it\n var callback = this.newTooltipComponentCallback.bind(this, this.tooltipInstanceCount);\n this.userComponentFactory.newTooltipComponent(params).then(callback);\n };\n TooltipFeature.prototype.newTooltipComponentCallback = function (tooltipInstanceCopy, tooltipComp) {\n var compNoLongerNeeded = this.state !== TooltipStates.SHOWING || this.tooltipInstanceCount !== tooltipInstanceCopy;\n if (compNoLongerNeeded) {\n this.getContext().destroyBean(tooltipComp);\n return;\n }\n var eGui = tooltipComp.getGui();\n this.tooltipComp = tooltipComp;\n if (!containsClass(eGui, 'ag-tooltip')) {\n addCssClass(eGui, 'ag-tooltip-custom');\n }\n var addPopupRes = this.popupService.addPopup({\n eChild: eGui\n });\n if (addPopupRes) {\n this.tooltipPopupDestroyFunc = addPopupRes.hideFunc;\n }\n // this.tooltipPopupDestroyFunc = this.popupService.addPopup(false, eGui, false);\n this.positionTooltipUnderLastMouseEvent();\n this.hideTooltipTimeoutId = window.setTimeout(this.hideTooltip.bind(this), this.DEFAULT_HIDE_TOOLTIP_TIMEOUT);\n };\n TooltipFeature.prototype.positionTooltipUnderLastMouseEvent = function () {\n this.popupService.positionPopupUnderMouseEvent({\n type: 'tooltip',\n mouseEvent: this.lastMouseEvent,\n ePopup: this.tooltipComp.getGui(),\n nudgeY: 18\n });\n };\n TooltipFeature.prototype.clearTimeouts = function () {\n if (this.showTooltipTimeoutId) {\n window.clearTimeout(this.showTooltipTimeoutId);\n this.showTooltipTimeoutId = undefined;\n }\n if (this.hideTooltipTimeoutId) {\n window.clearTimeout(this.hideTooltipTimeoutId);\n this.hideTooltipTimeoutId = undefined;\n }\n };\n __decorate$8([\n Autowired('popupService')\n ], TooltipFeature.prototype, \"popupService\", void 0);\n __decorate$8([\n Autowired('userComponentFactory')\n ], TooltipFeature.prototype, \"userComponentFactory\", void 0);\n __decorate$8([\n Autowired('columnApi')\n ], TooltipFeature.prototype, \"columnApi\", void 0);\n __decorate$8([\n Autowired('gridApi')\n ], TooltipFeature.prototype, \"gridApi\", void 0);\n __decorate$8([\n PostConstruct\n ], TooltipFeature.prototype, \"postConstruct\", null);\n return TooltipFeature;\n}(BeanStub));\n\n/**\n * @ag-grid-community/core - Advanced Data Grid / Data Table supporting Javascript / React / AngularJS / Web Components\n * @version v25.1.0\n * @link http://www.ag-grid.com/\n * @license MIT\n */\nvar __extends$5 = (undefined && undefined.__extends) || (function () {\n var extendStatics = function (d, b) {\n extendStatics = Object.setPrototypeOf ||\n ({ __proto__: [] } instanceof Array && function (d, b) { d.__proto__ = b; }) ||\n function (d, b) { for (var p in b) if (b.hasOwnProperty(p)) d[p] = b[p]; };\n return extendStatics(d, b);\n };\n return function (d, b) {\n extendStatics(d, b);\n function __() { this.constructor = d; }\n d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __());\n };\n})();\nvar __decorate$9 = (undefined && undefined.__decorate) || function (decorators, target, key, desc) {\n var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d;\n if (typeof Reflect === \"object\" && typeof Reflect.decorate === \"function\") r = Reflect.decorate(decorators, target, key, desc);\n else for (var i = decorators.length - 1; i >= 0; i--) if (d = decorators[i]) r = (c < 3 ? d(r) : c > 3 ? d(target, key, r) : d(target, key)) || r;\n return c > 3 && r && Object.defineProperty(target, key, r), r;\n};\nvar compIdSequence = new NumberSequence();\nvar Component = /** @class */ (function (_super) {\n __extends$5(Component, _super);\n function Component(template) {\n var _this = _super.call(this) || this;\n _this.annotatedGuiListeners = [];\n // if false, then CSS class \"ag-hidden\" is applied, which sets \"display: none\"\n _this.displayed = true;\n // if false, then CSS class \"ag-invisible\" is applied, which sets \"visibility: hidden\"\n _this.visible = true;\n // unique id for this row component. this is used for getting a reference to the HTML dom.\n // we cannot use the RowNode id as this is not unique (due to animation, old rows can be lying\n // around as we create a new rowComp instance for the same row node).\n _this.compId = compIdSequence.next();\n // to minimise DOM hits, we only apply CSS classes if they have changed. as addding a CSS class that is already\n // there, or removing one that wasn't present, all takes CPU.\n _this.cssClassStates = {};\n if (template) {\n _this.setTemplate(template);\n }\n return _this;\n }\n Component.prototype.preConstructOnComponent = function () {\n this.usingBrowserTooltips = this.gridOptionsWrapper.isEnableBrowserTooltips();\n };\n Component.prototype.getCompId = function () {\n return this.compId;\n };\n Component.prototype.getTooltipParams = function () {\n return {\n value: this.tooltipText,\n location: 'UNKNOWN'\n };\n };\n Component.prototype.setTooltip = function (newTooltipText) {\n var _this = this;\n var removeTooltip = function () {\n if (_this.usingBrowserTooltips) {\n _this.getGui().removeAttribute('title');\n }\n else {\n _this.tooltipFeature = _this.destroyBean(_this.tooltipFeature);\n }\n };\n var addTooltip = function () {\n if (_this.usingBrowserTooltips) {\n _this.getGui().setAttribute('title', _this.tooltipText);\n }\n else {\n _this.tooltipFeature = _this.createBean(new TooltipFeature(_this));\n }\n };\n if (this.tooltipText != newTooltipText) {\n if (this.tooltipText) {\n removeTooltip();\n }\n this.tooltipText = newTooltipText;\n if (this.tooltipText) {\n addTooltip();\n }\n }\n };\n // for registered components only, eg creates AgCheckbox instance from ag-checkbox HTML tag\n Component.prototype.createChildComponentsFromTags = function (parentNode, paramsMap) {\n var _this = this;\n // we MUST take a copy of the list first, as the 'swapComponentForNode' adds comments into the DOM\n // which messes up the traversal order of the children.\n var childNodeList = copyNodeList(parentNode.childNodes);\n forEach(childNodeList, function (childNode) {\n if (!(childNode instanceof HTMLElement)) {\n return;\n }\n var childComp = _this.createComponentFromElement(childNode, function (comp) {\n // copy over all attributes, including css classes, so any attributes user put on the tag\n // wll be carried across\n _this.copyAttributesFromNode(childNode, comp.getGui());\n }, paramsMap);\n if (childComp) {\n if (childComp.addItems && childNode.children.length) {\n _this.createChildComponentsFromTags(childNode, paramsMap);\n // converting from HTMLCollection to Array\n var items = Array.prototype.slice.call(childNode.children);\n childComp.addItems(items);\n }\n // replace the tag (eg ag-checkbox) with the proper HTMLElement (eg 'div') in the dom\n _this.swapComponentForNode(childComp, parentNode, childNode);\n }\n else if (childNode.childNodes) {\n _this.createChildComponentsFromTags(childNode, paramsMap);\n }\n });\n };\n Component.prototype.createComponentFromElement = function (element, afterPreCreateCallback, paramsMap) {\n var key = element.nodeName;\n var componentParams = paramsMap ? paramsMap[element.getAttribute('ref')] : undefined;\n var ComponentClass = this.agStackComponentsRegistry.getComponentClass(key);\n if (ComponentClass) {\n var newComponent = new ComponentClass(componentParams);\n this.createBean(newComponent, null, afterPreCreateCallback);\n return newComponent;\n }\n return null;\n };\n Component.prototype.copyAttributesFromNode = function (source, dest) {\n iterateNamedNodeMap(source.attributes, function (name, value) { return dest.setAttribute(name, value); });\n };\n Component.prototype.swapComponentForNode = function (newComponent, parentNode, childNode) {\n var eComponent = newComponent.getGui();\n parentNode.replaceChild(eComponent, childNode);\n parentNode.insertBefore(document.createComment(childNode.nodeName), eComponent);\n this.addDestroyFunc(this.destroyBean.bind(this, newComponent));\n this.swapInComponentForQuerySelectors(newComponent, childNode);\n };\n Component.prototype.swapInComponentForQuerySelectors = function (newComponent, childNode) {\n var thisNoType = this;\n this.iterateOverQuerySelectors(function (querySelector) {\n if (thisNoType[querySelector.attributeName] === childNode) {\n thisNoType[querySelector.attributeName] = newComponent;\n }\n });\n };\n Component.prototype.iterateOverQuerySelectors = function (action) {\n var thisPrototype = Object.getPrototypeOf(this);\n while (thisPrototype != null) {\n var metaData = thisPrototype.__agComponentMetaData;\n var currentProtoName = getFunctionName(thisPrototype.constructor);\n if (metaData && metaData[currentProtoName] && metaData[currentProtoName].querySelectors) {\n forEach(metaData[currentProtoName].querySelectors, function (querySelector) { return action(querySelector); });\n }\n thisPrototype = Object.getPrototypeOf(thisPrototype);\n }\n };\n Component.prototype.setTemplate = function (template, paramsMap) {\n var eGui = loadTemplate(template);\n this.setTemplateFromElement(eGui, paramsMap);\n };\n Component.prototype.setTemplateFromElement = function (element, paramsMap) {\n this.eGui = element;\n this.eGui.__agComponent = this;\n this.addAnnotatedGuiEventListeners();\n this.wireQuerySelectors();\n // context will not be available when user sets template in constructor\n if (!!this.getContext()) {\n this.createChildComponentsFromTags(this.getGui(), paramsMap);\n }\n };\n Component.prototype.createChildComponentsPreConstruct = function () {\n // ui exists if user sets template in constructor. when this happens, we have to wait for the context\n // to be autoWired first before we can create child components.\n if (!!this.getGui()) {\n this.createChildComponentsFromTags(this.getGui());\n }\n };\n Component.prototype.wireQuerySelectors = function () {\n var _this = this;\n if (!this.eGui) {\n return;\n }\n var thisNoType = this;\n this.iterateOverQuerySelectors(function (querySelector) {\n var resultOfQuery = _this.eGui.querySelector(querySelector.querySelector);\n if (resultOfQuery) {\n thisNoType[querySelector.attributeName] = resultOfQuery.__agComponent || resultOfQuery;\n }\n });\n };\n Component.prototype.addAnnotatedGuiEventListeners = function () {\n var _this = this;\n this.removeAnnotatedGuiEventListeners();\n if (!this.eGui) {\n return;\n }\n var listenerMethods = this.getAgComponentMetaData('guiListenerMethods');\n if (!listenerMethods) {\n return;\n }\n if (!this.annotatedGuiListeners) {\n this.annotatedGuiListeners = [];\n }\n listenerMethods.forEach(function (meta) {\n var element = _this.getRefElement(meta.ref);\n if (!element) {\n return;\n }\n var listener = _this[meta.methodName].bind(_this);\n element.addEventListener(meta.eventName, listener);\n _this.annotatedGuiListeners.push({ eventName: meta.eventName, listener: listener, element: element });\n });\n };\n Component.prototype.addAnnotatedGridEventListeners = function () {\n var _this = this;\n var listenerMetas = this.getAgComponentMetaData('gridListenerMethods');\n if (!listenerMetas) {\n return;\n }\n listenerMetas.forEach(function (meta) {\n var listener = _this[meta.methodName].bind(_this);\n _this.addManagedListener(_this.eventService, meta.eventName, listener);\n });\n };\n Component.prototype.getAgComponentMetaData = function (key) {\n var res = [];\n var thisProto = Object.getPrototypeOf(this);\n while (thisProto != null) {\n var metaData = thisProto.__agComponentMetaData;\n var currentProtoName = getFunctionName(thisProto.constructor);\n if (metaData && metaData[currentProtoName] && metaData[currentProtoName][key]) {\n res = res.concat(metaData[currentProtoName][key]);\n }\n thisProto = Object.getPrototypeOf(thisProto);\n }\n return res;\n };\n Component.prototype.removeAnnotatedGuiEventListeners = function () {\n if (!this.annotatedGuiListeners) {\n return;\n }\n forEach(this.annotatedGuiListeners, function (e) {\n e.element.removeEventListener(e.eventName, e.listener);\n });\n this.annotatedGuiListeners = [];\n };\n Component.prototype.getGui = function () {\n return this.eGui;\n };\n Component.prototype.getFocusableElement = function () {\n return this.eGui;\n };\n Component.prototype.setParentComponent = function (component) {\n this.parentComponent = component;\n };\n Component.prototype.getParentComponent = function () {\n return this.parentComponent;\n };\n // this method is for older code, that wants to provide the gui element,\n // it is not intended for this to be in ag-Stack\n Component.prototype.setGui = function (eGui) {\n this.eGui = eGui;\n };\n Component.prototype.queryForHtmlElement = function (cssSelector) {\n return this.eGui.querySelector(cssSelector);\n };\n Component.prototype.queryForHtmlInputElement = function (cssSelector) {\n return this.eGui.querySelector(cssSelector);\n };\n Component.prototype.appendChild = function (newChild, container) {\n if (!container) {\n container = this.eGui;\n }\n if (newChild == null) {\n return;\n }\n if (isNodeOrElement(newChild)) {\n container.appendChild(newChild);\n }\n else {\n var childComponent = newChild;\n container.appendChild(childComponent.getGui());\n this.addDestroyFunc(this.destroyBean.bind(this, childComponent));\n }\n };\n Component.prototype.isDisplayed = function () {\n return this.displayed;\n };\n Component.prototype.setVisible = function (visible) {\n if (visible !== this.visible) {\n this.visible = visible;\n setVisible(this.eGui, visible);\n }\n };\n Component.prototype.setDisplayed = function (displayed) {\n if (displayed !== this.displayed) {\n this.displayed = displayed;\n setDisplayed(this.eGui, displayed);\n var event_1 = {\n type: Component.EVENT_DISPLAYED_CHANGED,\n visible: this.displayed\n };\n this.dispatchEvent(event_1);\n }\n };\n Component.prototype.destroy = function () {\n this.removeAnnotatedGuiEventListeners();\n if (this.tooltipFeature) {\n this.tooltipFeature = this.destroyBean(this.tooltipFeature);\n }\n _super.prototype.destroy.call(this);\n };\n Component.prototype.addGuiEventListener = function (event, listener) {\n var _this = this;\n this.eGui.addEventListener(event, listener);\n this.addDestroyFunc(function () { return _this.eGui.removeEventListener(event, listener); });\n };\n Component.prototype.addCssClass = function (className) {\n var updateNeeded = this.cssClassStates[className] !== true;\n if (updateNeeded) {\n addCssClass(this.eGui, className);\n this.cssClassStates[className] = true;\n }\n };\n Component.prototype.removeCssClass = function (className) {\n var updateNeeded = this.cssClassStates[className] !== false;\n if (updateNeeded) {\n removeCssClass(this.eGui, className);\n this.cssClassStates[className] = false;\n }\n };\n Component.prototype.addOrRemoveCssClass = function (className, addOrRemove) {\n var updateNeeded = this.cssClassStates[className] !== addOrRemove;\n if (updateNeeded) {\n addOrRemoveCssClass(this.eGui, className, addOrRemove);\n this.cssClassStates[className] = addOrRemove;\n }\n };\n Component.prototype.getAttribute = function (key) {\n var eGui = this.eGui;\n return eGui ? eGui.getAttribute(key) : null;\n };\n Component.prototype.getRefElement = function (refName) {\n return this.queryForHtmlElement(\"[ref=\\\"\" + refName + \"\\\"]\");\n };\n Component.EVENT_DISPLAYED_CHANGED = 'displayedChanged';\n __decorate$9([\n Autowired('agStackComponentsRegistry')\n ], Component.prototype, \"agStackComponentsRegistry\", void 0);\n __decorate$9([\n PreConstruct\n ], Component.prototype, \"preConstructOnComponent\", null);\n __decorate$9([\n PreConstruct\n ], Component.prototype, \"createChildComponentsPreConstruct\", null);\n __decorate$9([\n PostConstruct\n ], Component.prototype, \"addAnnotatedGridEventListeners\", null);\n return Component;\n}(BeanStub));\n\n/**\n * @ag-grid-community/core - Advanced Data Grid / Data Table supporting Javascript / React / AngularJS / Web Components\n * @version v25.1.0\n * @link http://www.ag-grid.com/\n * @license MIT\n */\nvar __extends$6 = (undefined && undefined.__extends) || (function () {\n var extendStatics = function (d, b) {\n extendStatics = Object.setPrototypeOf ||\n ({ __proto__: [] } instanceof Array && function (d, b) { d.__proto__ = b; }) ||\n function (d, b) { for (var p in b) if (b.hasOwnProperty(p)) d[p] = b[p]; };\n return extendStatics(d, b);\n };\n return function (d, b) {\n extendStatics(d, b);\n function __() { this.constructor = d; }\n d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __());\n };\n})();\nvar PopupComponent = /** @class */ (function (_super) {\n __extends$6(PopupComponent, _super);\n function PopupComponent() {\n return _super !== null && _super.apply(this, arguments) || this;\n }\n PopupComponent.prototype.isPopup = function () {\n return true;\n };\n PopupComponent.prototype.setParentComponent = function (container) {\n addCssClass(container.getGui(), 'ag-has-popup');\n _super.prototype.setParentComponent.call(this, container);\n };\n PopupComponent.prototype.destroy = function () {\n var parentComp = this.parentComponent;\n var hasParent = parentComp && parentComp.isAlive();\n if (hasParent) {\n removeCssClass(parentComp.getGui(), 'ag-has-popup');\n }\n _super.prototype.destroy.call(this);\n };\n return PopupComponent;\n}(Component));\n\n/**\n * @ag-grid-community/core - Advanced Data Grid / Data Table supporting Javascript / React / AngularJS / Web Components\n * @version v25.1.0\n * @link http://www.ag-grid.com/\n * @license MIT\n */\nfunction QuerySelector(selector) {\n return querySelectorFunc.bind(this, selector);\n}\nfunction RefSelector(ref) {\n return querySelectorFunc.bind(this, \"[ref=\" + ref + \"]\");\n}\nfunction querySelectorFunc(selector, classPrototype, methodOrAttributeName, index) {\n if (selector === null) {\n console.error('AG Grid: QuerySelector selector should not be null');\n return;\n }\n if (typeof index === 'number') {\n console.error('AG Grid: QuerySelector should be on an attribute');\n return;\n }\n addToObjectProps(classPrototype, 'querySelectors', {\n attributeName: methodOrAttributeName,\n querySelector: selector\n });\n}\n// think we should take this out, put property bindings on the\nfunction GridListener(eventName) {\n return gridListenerFunc.bind(this, eventName);\n}\nfunction gridListenerFunc(eventName, target, methodName) {\n if (eventName == null) {\n console.error('AG Grid: GridListener eventName is missing');\n return;\n }\n addToObjectProps(target, 'gridListenerMethods', {\n methodName: methodName,\n eventName: eventName\n });\n}\n// think we should take this out, put property bindings on the\nfunction GuiListener(ref, eventName) {\n return guiListenerFunc.bind(this, ref, eventName);\n}\nfunction guiListenerFunc(ref, eventName, target, methodName) {\n if (eventName == null) {\n console.error('AG Grid: GuiListener eventName is missing');\n return;\n }\n addToObjectProps(target, 'guiListenerMethods', {\n methodName: methodName,\n eventName: eventName,\n ref: ref\n });\n}\n// // think we should take this out, put property bindings on the\n// export function Method(eventName?: string): Function {\n// return methodFunc.bind(this, eventName);\n// }\n//\n// function methodFunc(alias: string, target: Object, methodName: string) {\n// if (alias === null) {\n// console.error(\"AG Grid: EventListener eventName should not be null\");\n// return;\n// }\n//\n// addToObjectProps(target, 'methods', {\n// methodName: methodName,\n// alias: alias\n// });\n// }\nfunction addToObjectProps(target, key, value) {\n // it's an attribute on the class\n var props = getOrCreateProps$1(target, getFunctionName(target.constructor));\n if (!props[key]) {\n props[key] = [];\n }\n props[key].push(value);\n}\nfunction getOrCreateProps$1(target, instanceName) {\n if (!target.__agComponentMetaData) {\n target.__agComponentMetaData = {};\n }\n if (!target.__agComponentMetaData[instanceName]) {\n target.__agComponentMetaData[instanceName] = {};\n }\n return target.__agComponentMetaData[instanceName];\n}\n\n/**\n * @ag-grid-community/core - Advanced Data Grid / Data Table supporting Javascript / React / AngularJS / Web Components\n * @version v25.1.0\n * @link http://www.ag-grid.com/\n * @license MIT\n */\nvar KeyCode = /** @class */ (function () {\n function KeyCode() {\n }\n KeyCode.BACKSPACE = 8;\n KeyCode.TAB = 9;\n KeyCode.ENTER = 13;\n KeyCode.SHIFT = 16;\n KeyCode.ESCAPE = 27;\n KeyCode.SPACE = 32;\n KeyCode.LEFT = 37;\n KeyCode.UP = 38;\n KeyCode.RIGHT = 39;\n KeyCode.DOWN = 40;\n KeyCode.DELETE = 46;\n KeyCode.A = 65;\n KeyCode.C = 67;\n KeyCode.V = 86;\n KeyCode.D = 68;\n KeyCode.Z = 90;\n KeyCode.Y = 89;\n KeyCode.F2 = 113;\n KeyCode.PAGE_UP = 33;\n KeyCode.PAGE_DOWN = 34;\n KeyCode.PAGE_HOME = 36;\n KeyCode.PAGE_END = 35;\n return KeyCode;\n}());\n\n/**\n * @ag-grid-community/core - Advanced Data Grid / Data Table supporting Javascript / React / AngularJS / Web Components\n * @version v25.1.0\n * @link http://www.ag-grid.com/\n * @license MIT\n */\nvar __extends$7 = (undefined && undefined.__extends) || (function () {\n var extendStatics = function (d, b) {\n extendStatics = Object.setPrototypeOf ||\n ({ __proto__: [] } instanceof Array && function (d, b) { d.__proto__ = b; }) ||\n function (d, b) { for (var p in b) if (b.hasOwnProperty(p)) d[p] = b[p]; };\n return extendStatics(d, b);\n };\n return function (d, b) {\n extendStatics(d, b);\n function __() { this.constructor = d; }\n d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __());\n };\n})();\nvar __decorate$a = (undefined && undefined.__decorate) || function (decorators, target, key, desc) {\n var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d;\n if (typeof Reflect === \"object\" && typeof Reflect.decorate === \"function\") r = Reflect.decorate(decorators, target, key, desc);\n else for (var i = decorators.length - 1; i >= 0; i--) if (d = decorators[i]) r = (c < 3 ? d(r) : c > 3 ? d(target, key, r) : d(target, key)) || r;\n return c > 3 && r && Object.defineProperty(target, key, r), r;\n};\nvar TextCellEditor = /** @class */ (function (_super) {\n __extends$7(TextCellEditor, _super);\n function TextCellEditor() {\n return _super.call(this, TextCellEditor.TEMPLATE) || this;\n }\n TextCellEditor.prototype.init = function (params) {\n this.params = params;\n var eInput = this.eInput;\n var startValue;\n // cellStartedEdit is only false if we are doing fullRow editing\n if (params.cellStartedEdit) {\n this.focusAfterAttached = true;\n if (params.keyPress === KeyCode.BACKSPACE || params.keyPress === KeyCode.DELETE) {\n startValue = '';\n }\n else if (params.charPress) {\n startValue = params.charPress;\n }\n else {\n startValue = this.getStartValue(params);\n if (params.keyPress !== KeyCode.F2) {\n this.highlightAllOnFocus = true;\n }\n }\n }\n else {\n this.focusAfterAttached = false;\n startValue = this.getStartValue(params);\n }\n if (exists(startValue)) {\n eInput.setValue(startValue, true);\n }\n this.addManagedListener(eInput.getGui(), 'keydown', function (event) {\n var keyCode = event.keyCode;\n if (keyCode === KeyCode.PAGE_UP || keyCode === KeyCode.PAGE_DOWN) {\n event.preventDefault();\n }\n });\n };\n TextCellEditor.prototype.afterGuiAttached = function () {\n var translate = this.gridOptionsWrapper.getLocaleTextFunc();\n var eInput = this.eInput;\n eInput.setInputAriaLabel(translate('ariaInputEditor', 'Input Editor'));\n if (!this.focusAfterAttached) {\n return;\n }\n // Added for AG-3238. We can't remove this explicit focus() because Chrome requires an input\n // to be focused before setSelectionRange will work. But it triggers a bug in Safari where\n // explicitly focusing then blurring an empty field will cause the parent container to scroll.\n if (!isBrowserSafari()) {\n eInput.getFocusableElement().focus();\n }\n var inputEl = eInput.getInputElement();\n if (this.highlightAllOnFocus) {\n inputEl.select();\n }\n else {\n // when we started editing, we want the caret at the end, not the start.\n // this comes into play in two scenarios: a) when user hits F2 and b)\n // when user hits a printable character, then on IE (and only IE) the caret\n // was placed after the first character, thus 'apply' would end up as 'pplea'\n var value = eInput.getValue();\n var len = (exists(value) && value.length) || 0;\n if (len) {\n inputEl.setSelectionRange(len, len);\n }\n }\n };\n // gets called when tabbing trough cells and in full row edit mode\n TextCellEditor.prototype.focusIn = function () {\n var eInput = this.eInput;\n var focusEl = eInput.getFocusableElement();\n var inputEl = eInput.getInputElement();\n focusEl.focus();\n inputEl.select();\n };\n TextCellEditor.prototype.focusOut = function () {\n var inputEl = this.eInput.getInputElement();\n if (isBrowserIE()) {\n inputEl.setSelectionRange(0, 0);\n }\n };\n TextCellEditor.prototype.getValue = function () {\n var eInput = this.eInput;\n return this.params.parseValue(eInput.getValue());\n };\n TextCellEditor.prototype.getStartValue = function (params) {\n var formatValue = params.useFormatter || params.column.getColDef().refData;\n return formatValue ? params.formatValue(params.value) : params.value;\n };\n TextCellEditor.prototype.isPopup = function () {\n return false;\n };\n TextCellEditor.TEMPLATE = '
';\n __decorate$a([\n RefSelector('eInput')\n ], TextCellEditor.prototype, \"eInput\", void 0);\n return TextCellEditor;\n}(PopupComponent));\n\n/**\n * @ag-grid-community/core - Advanced Data Grid / Data Table supporting Javascript / React / AngularJS / Web Components\n * @version v25.1.0\n * @link http://www.ag-grid.com/\n * @license MIT\n */\n/** Provides sync access to async component. Date component can be lazy created - this class encapsulates\n * this by keeping value locally until DateComp has loaded, then passing DateComp the value. */\nvar DateCompWrapper = /** @class */ (function () {\n function DateCompWrapper(context, userComponentFactory, dateComponentParams, eParent) {\n var _this = this;\n this.alive = true;\n this.context = context;\n userComponentFactory.newDateComponent(dateComponentParams).then(function (dateComp) {\n // because async, check the filter still exists after component comes back\n if (!_this.alive) {\n context.destroyBean(dateComp);\n return;\n }\n _this.dateComp = dateComp;\n if (!dateComp) {\n return;\n }\n eParent.appendChild(dateComp.getGui());\n if (dateComp.afterGuiAttached) {\n dateComp.afterGuiAttached();\n }\n if (_this.tempValue) {\n dateComp.setDate(_this.tempValue);\n }\n });\n }\n DateCompWrapper.prototype.destroy = function () {\n this.alive = false;\n this.dateComp = this.context.destroyBean(this.dateComp);\n };\n DateCompWrapper.prototype.getDate = function () {\n return this.dateComp ? this.dateComp.getDate() : this.tempValue;\n };\n DateCompWrapper.prototype.setDate = function (value) {\n if (this.dateComp) {\n this.dateComp.setDate(value);\n }\n else {\n this.tempValue = value;\n }\n };\n DateCompWrapper.prototype.setInputPlaceholder = function (placeholder) {\n if (this.dateComp && this.dateComp.setInputPlaceholder) {\n this.dateComp.setInputPlaceholder(placeholder);\n }\n };\n DateCompWrapper.prototype.setInputAriaLabel = function (label) {\n if (this.dateComp && this.dateComp.setInputAriaLabel) {\n this.dateComp.setInputAriaLabel(label);\n }\n };\n DateCompWrapper.prototype.afterGuiAttached = function (params) {\n if (this.dateComp && typeof this.dateComp.afterGuiAttached === 'function') {\n this.dateComp.afterGuiAttached(params);\n }\n };\n return DateCompWrapper;\n}());\n\n/**\n * @ag-grid-community/core - Advanced Data Grid / Data Table supporting Javascript / React / AngularJS / Web Components\n * @version v25.1.0\n * @link http://www.ag-grid.com/\n * @license MIT\n */\n/* Common logic for options, used by both filters and floating filters. */\nvar OptionsFactory = /** @class */ (function () {\n function OptionsFactory() {\n this.customFilterOptions = {};\n }\n OptionsFactory.prototype.init = function (params, defaultOptions) {\n this.filterOptions = params.filterOptions || defaultOptions;\n this.mapCustomOptions();\n this.selectDefaultItem(params);\n };\n OptionsFactory.prototype.getFilterOptions = function () {\n return this.filterOptions;\n };\n OptionsFactory.prototype.mapCustomOptions = function () {\n var _this = this;\n if (!this.filterOptions) {\n return;\n }\n this.filterOptions.forEach(function (filterOption) {\n if (typeof filterOption === 'string') {\n return;\n }\n var requiredProperties = ['displayKey', 'displayName', 'test'];\n if (every(requiredProperties, function (key) {\n if (!filterOption[key]) {\n console.warn(\"AG Grid: ignoring FilterOptionDef as it doesn't contain a '\" + key + \"'\");\n return false;\n }\n return true;\n })) {\n _this.customFilterOptions[filterOption.displayKey] = filterOption;\n }\n });\n };\n OptionsFactory.prototype.selectDefaultItem = function (params) {\n if (params.defaultOption) {\n this.defaultOption = params.defaultOption;\n }\n else if (this.filterOptions.length >= 1) {\n var firstFilterOption = this.filterOptions[0];\n if (typeof firstFilterOption === 'string') {\n this.defaultOption = firstFilterOption;\n }\n else if (firstFilterOption.displayKey) {\n this.defaultOption = firstFilterOption.displayKey;\n }\n else {\n console.warn(\"AG Grid: invalid FilterOptionDef supplied as it doesn't contain a 'displayKey'\");\n }\n }\n else {\n console.warn('AG Grid: no filter options for filter');\n }\n };\n OptionsFactory.prototype.getDefaultOption = function () {\n return this.defaultOption;\n };\n OptionsFactory.prototype.getCustomOption = function (name) {\n return this.customFilterOptions[name];\n };\n return OptionsFactory;\n}());\n\n/**\n * @ag-grid-community/core - Advanced Data Grid / Data Table supporting Javascript / React / AngularJS / Web Components\n * @version v25.1.0\n * @link http://www.ag-grid.com/\n * @license MIT\n */\nvar DEFAULT_FILTER_LOCALE_TEXT = {\n applyFilter: 'Apply',\n clearFilter: 'Clear',\n resetFilter: 'Reset',\n cancelFilter: 'Cancel',\n textFilter: 'Text Filter',\n numberFilter: 'Number Filter',\n dateFilter: 'Date Filter',\n setFilter: 'Set Filter',\n filterOoo: 'Filter...',\n empty: 'Choose One',\n equals: 'Equals',\n notEqual: 'Not equal',\n lessThan: 'Less than',\n greaterThan: 'Greater than',\n inRange: 'In range',\n inRangeStart: 'From',\n inRangeEnd: 'To',\n lessThanOrEqual: 'Less than or equals',\n greaterThanOrEqual: 'Greater than or equals',\n contains: 'Contains',\n notContains: 'Not contains',\n startsWith: 'Starts with',\n endsWith: 'Ends with',\n andCondition: 'AND',\n orCondition: 'OR',\n dateFormatOoo: 'yyyy-mm-dd',\n};\n\n/**\n * @ag-grid-community/core - Advanced Data Grid / Data Table supporting Javascript / React / AngularJS / Web Components\n * @version v25.1.0\n * @link http://www.ag-grid.com/\n * @license MIT\n */\nvar __extends$8 = (undefined && undefined.__extends) || (function () {\n var extendStatics = function (d, b) {\n extendStatics = Object.setPrototypeOf ||\n ({ __proto__: [] } instanceof Array && function (d, b) { d.__proto__ = b; }) ||\n function (d, b) { for (var p in b) if (b.hasOwnProperty(p)) d[p] = b[p]; };\n return extendStatics(d, b);\n };\n return function (d, b) {\n extendStatics(d, b);\n function __() { this.constructor = d; }\n d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __());\n };\n})();\nvar __decorate$b = (undefined && undefined.__decorate) || function (decorators, target, key, desc) {\n var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d;\n if (typeof Reflect === \"object\" && typeof Reflect.decorate === \"function\") r = Reflect.decorate(decorators, target, key, desc);\n else for (var i = decorators.length - 1; i >= 0; i--) if (d = decorators[i]) r = (c < 3 ? d(r) : c > 3 ? d(target, key, r) : d(target, key)) || r;\n return c > 3 && r && Object.defineProperty(target, key, r), r;\n};\n/**\n * This provides logic to override the default browser focus logic.\n *\n * When the component gets focus, it uses the grid logic to find out what should be focused,\n * and then focuses that instead.\n *\n * This is how we ensure when user tabs into the relevant section, we focus the correct item.\n * For example GridCore extends ManagedFocusComponent, and it ensures when it receives focus\n * that focus goes to the first cell of the first header row.\n */\nvar ManagedFocusComponent = /** @class */ (function (_super) {\n __extends$8(ManagedFocusComponent, _super);\n /*\n * Set isFocusableContainer to true if this component will contain multiple focus-managed\n * elements within. When set to true, this component will add tabGuards that will be responsible\n * for receiving focus from outside and focusing an internal element using the focusInnerElementMethod\n */\n function ManagedFocusComponent(template, isFocusableContainer) {\n if (isFocusableContainer === void 0) { isFocusableContainer = false; }\n var _this = _super.call(this, template) || this;\n _this.isFocusableContainer = isFocusableContainer;\n _this.skipTabGuardFocus = false;\n return _this;\n }\n ManagedFocusComponent.prototype.postConstruct = function () {\n var _this = this;\n var focusableElement = this.getFocusableElement();\n if (!focusableElement) {\n return;\n }\n addCssClass(focusableElement, ManagedFocusComponent.FOCUS_MANAGED_CLASS);\n if (this.isFocusableContainer) {\n this.topTabGuard = this.createTabGuard('top');\n this.bottomTabGuard = this.createTabGuard('bottom');\n this.addTabGuards();\n this.activateTabGuards();\n this.forEachTabGuard(function (guard) { return _this.addManagedListener(guard, 'focus', _this.onFocus.bind(_this)); });\n }\n this.addKeyDownListeners(focusableElement);\n this.addManagedListener(focusableElement, 'focusin', this.onFocusIn.bind(this));\n this.addManagedListener(focusableElement, 'focusout', this.onFocusOut.bind(this));\n };\n /*\n * Override this method if focusing the default element requires special logic.\n */\n ManagedFocusComponent.prototype.focusInnerElement = function (fromBottom) {\n if (fromBottom === void 0) { fromBottom = false; }\n var focusable = this.focusController.findFocusableElements(this.getFocusableElement());\n if (this.isFocusableContainer && this.tabGuardsAreActive()) {\n // remove tab guards from this component from list of focusable elements\n focusable.splice(0, 1);\n focusable.splice(focusable.length - 1, 1);\n }\n if (!focusable.length) {\n return;\n }\n focusable[fromBottom ? focusable.length - 1 : 0].focus();\n };\n /**\n * By default this will tab though the elements in the default order. Override if you require special logic.\n */\n ManagedFocusComponent.prototype.onTabKeyDown = function (e) {\n var _this = this;\n if (e.defaultPrevented) {\n return;\n }\n var tabGuardsAreActive = this.tabGuardsAreActive();\n if (this.isFocusableContainer && tabGuardsAreActive) {\n this.deactivateTabGuards();\n }\n var nextRoot = this.focusController.findNextFocusableElement(this.getFocusableElement(), false, e.shiftKey);\n if (this.isFocusableContainer && tabGuardsAreActive) {\n // ensure the tab guards are only re-instated once the event has finished processing, to avoid the browser\n // tabbing to the tab guard from inside the component\n setTimeout(function () { return _this.activateTabGuards(); }, 0);\n }\n if (!nextRoot) {\n return;\n }\n nextRoot.focus();\n e.preventDefault();\n };\n ManagedFocusComponent.prototype.onFocusIn = function (e) {\n if (this.isFocusableContainer) {\n this.deactivateTabGuards();\n }\n };\n ManagedFocusComponent.prototype.onFocusOut = function (e) {\n if (this.isFocusableContainer && !this.getFocusableElement().contains(e.relatedTarget)) {\n this.activateTabGuards();\n }\n };\n ManagedFocusComponent.prototype.forceFocusOutOfContainer = function (up) {\n if (up === void 0) { up = false; }\n if (!this.isFocusableContainer) {\n return;\n }\n this.activateTabGuards();\n this.skipTabGuardFocus = true;\n var tabGuardToFocus = up ? this.topTabGuard : this.bottomTabGuard;\n if (tabGuardToFocus) {\n tabGuardToFocus.focus();\n }\n };\n ManagedFocusComponent.prototype.appendChild = function (newChild, container) {\n if (this.isFocusableContainer) {\n if (!isNodeOrElement(newChild)) {\n newChild = newChild.getGui();\n }\n var bottomTabGuard = this.bottomTabGuard;\n if (bottomTabGuard) {\n bottomTabGuard.insertAdjacentElement('beforebegin', newChild);\n }\n else {\n _super.prototype.appendChild.call(this, newChild, container);\n }\n }\n else {\n _super.prototype.appendChild.call(this, newChild, container);\n }\n };\n ManagedFocusComponent.prototype.createTabGuard = function (side) {\n var tabGuard = document.createElement('div');\n tabGuard.classList.add('ag-tab-guard');\n tabGuard.classList.add(\"ag-tab-guard-\" + side);\n tabGuard.setAttribute('role', 'presentation');\n return tabGuard;\n };\n ManagedFocusComponent.prototype.addTabGuards = function () {\n var focusableEl = this.getFocusableElement();\n focusableEl.insertAdjacentElement('afterbegin', this.topTabGuard);\n focusableEl.insertAdjacentElement('beforeend', this.bottomTabGuard);\n };\n ManagedFocusComponent.prototype.forEachTabGuard = function (callback) {\n if (this.topTabGuard) {\n callback(this.topTabGuard);\n }\n if (this.bottomTabGuard) {\n callback(this.bottomTabGuard);\n }\n };\n ManagedFocusComponent.prototype.addKeyDownListeners = function (eGui) {\n var _this = this;\n this.addManagedListener(eGui, 'keydown', function (e) {\n if (e.defaultPrevented || isStopPropagationForAgGrid(e)) {\n return;\n }\n if (_this.shouldStopEventPropagation(e)) {\n stopPropagationForAgGrid(e);\n return;\n }\n if (e.keyCode === KeyCode.TAB) {\n _this.onTabKeyDown(e);\n }\n else if (_this.handleKeyDown) {\n _this.handleKeyDown(e);\n }\n });\n };\n ManagedFocusComponent.prototype.shouldStopEventPropagation = function (e) {\n return false;\n };\n ManagedFocusComponent.prototype.onFocus = function (e) {\n if (this.skipTabGuardFocus) {\n this.skipTabGuardFocus = false;\n return;\n }\n this.focusInnerElement(e.target === this.bottomTabGuard);\n };\n ManagedFocusComponent.prototype.activateTabGuards = function () {\n this.forEachTabGuard(function (guard) { return guard.setAttribute('tabIndex', '0'); });\n };\n ManagedFocusComponent.prototype.deactivateTabGuards = function () {\n this.forEachTabGuard(function (guard) { return guard.removeAttribute('tabIndex'); });\n };\n ManagedFocusComponent.prototype.tabGuardsAreActive = function () {\n return !!this.topTabGuard && this.topTabGuard.hasAttribute('tabIndex');\n };\n ManagedFocusComponent.prototype.clearGui = function () {\n var tabGuardsAreActive = this.tabGuardsAreActive();\n clearElement(this.getFocusableElement());\n if (this.isFocusableContainer) {\n this.addTabGuards();\n if (tabGuardsAreActive) {\n this.activateTabGuards();\n }\n }\n };\n ManagedFocusComponent.FOCUS_MANAGED_CLASS = 'ag-focus-managed';\n __decorate$b([\n Autowired('focusController')\n ], ManagedFocusComponent.prototype, \"focusController\", void 0);\n __decorate$b([\n PostConstruct\n ], ManagedFocusComponent.prototype, \"postConstruct\", null);\n return ManagedFocusComponent;\n}(Component));\n\n/**\n * @ag-grid-community/core - Advanced Data Grid / Data Table supporting Javascript / React / AngularJS / Web Components\n * @version v25.1.0\n * @link http://www.ag-grid.com/\n * @license MIT\n */\nvar __extends$9 = (undefined && undefined.__extends) || (function () {\n var extendStatics = function (d, b) {\n extendStatics = Object.setPrototypeOf ||\n ({ __proto__: [] } instanceof Array && function (d, b) { d.__proto__ = b; }) ||\n function (d, b) { for (var p in b) if (b.hasOwnProperty(p)) d[p] = b[p]; };\n return extendStatics(d, b);\n };\n return function (d, b) {\n extendStatics(d, b);\n function __() { this.constructor = d; }\n d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __());\n };\n})();\nvar __decorate$c = (undefined && undefined.__decorate) || function (decorators, target, key, desc) {\n var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d;\n if (typeof Reflect === \"object\" && typeof Reflect.decorate === \"function\") r = Reflect.decorate(decorators, target, key, desc);\n else for (var i = decorators.length - 1; i >= 0; i--) if (d = decorators[i]) r = (c < 3 ? d(r) : c > 3 ? d(target, key, r) : d(target, key)) || r;\n return c > 3 && r && Object.defineProperty(target, key, r), r;\n};\n/**\n * Contains common logic to all provided filters (apply button, clear button, etc).\n * All the filters that come with AG Grid extend this class. User filters do not\n * extend this class.\n */\nvar ProvidedFilter = /** @class */ (function (_super) {\n __extends$9(ProvidedFilter, _super);\n function ProvidedFilter(filterNameKey) {\n var _this = _super.call(this) || this;\n _this.filterNameKey = filterNameKey;\n _this.applyActive = false;\n _this.hidePopup = null;\n // after the user hits 'apply' the model gets copied to here. this is then the model that we use for\n // all filtering. so if user changes UI but doesn't hit apply, then the UI will be out of sync with this model.\n // this is what we want, as the UI should only become the 'active' filter once it's applied. when apply is\n // inactive, this model will be in sync (following the debounce ms). if the UI is not a valid filter\n // (eg the value is missing so nothing to filter on, or for set filter all checkboxes are checked so filter\n // not active) then this appliedModel will be null/undefined.\n _this.appliedModel = null;\n return _this;\n }\n ProvidedFilter.prototype.getFilterTitle = function () {\n return this.translate(this.filterNameKey);\n };\n /** @deprecated */\n ProvidedFilter.prototype.onFilterChanged = function () {\n console.warn(\"AG Grid: you should not call onFilterChanged() directly on the filter, please call\\n gridApi.onFilterChanged() instead. onFilterChanged is not part of the exposed filter interface (it was\\n a method that existed on an old version of the filters that was not intended for public use.\");\n this.providedFilterParams.filterChangedCallback();\n };\n ProvidedFilter.prototype.isFilterActive = function () {\n // filter is active if we have a valid applied model\n return !!this.appliedModel;\n };\n ProvidedFilter.prototype.postConstruct = function () {\n this.resetTemplate(); // do this first to create the DOM\n _super.prototype.postConstruct.call(this);\n };\n ProvidedFilter.prototype.resetTemplate = function (paramsMap) {\n var templateString = /* html */ \"\\n
\\n
\\n \" + this.createBodyTemplate() + \"\\n
\\n
\";\n this.setTemplate(templateString, paramsMap);\n };\n ProvidedFilter.prototype.init = function (params) {\n var _this = this;\n this.setParams(params);\n this.resetUiToDefaults(true).then(function () {\n _this.updateUiVisibility();\n _this.setupOnBtApplyDebounce();\n });\n };\n ProvidedFilter.prototype.setParams = function (params) {\n ProvidedFilter.checkForDeprecatedParams(params);\n this.providedFilterParams = params;\n if (params.newRowsAction === 'keep') {\n this.newRowsActionKeep = true;\n }\n else if (params.newRowsAction === 'clear') {\n this.newRowsActionKeep = false;\n }\n else {\n // the default for SSRM and IRM is 'keep', for CSRM and VRM the default is 'clear'\n var modelsForKeep = [Constants.ROW_MODEL_TYPE_SERVER_SIDE, Constants.ROW_MODEL_TYPE_INFINITE];\n this.newRowsActionKeep = modelsForKeep.indexOf(this.rowModel.getType()) >= 0;\n }\n this.applyActive = ProvidedFilter.isUseApplyButton(params);\n this.createButtonPanel();\n };\n ProvidedFilter.prototype.createButtonPanel = function () {\n var _this = this;\n var buttons = this.providedFilterParams.buttons;\n if (!buttons || buttons.length < 1) {\n return;\n }\n var eButtonsPanel = document.createElement('div');\n addCssClass(eButtonsPanel, 'ag-filter-apply-panel');\n var addButton = function (type) {\n var text;\n var clickListener;\n switch (type) {\n case 'apply':\n text = _this.translate('applyFilter');\n clickListener = function (e) { return _this.onBtApply(false, false, e); };\n break;\n case 'clear':\n text = _this.translate('clearFilter');\n clickListener = function () { return _this.onBtClear(); };\n break;\n case 'reset':\n text = _this.translate('resetFilter');\n clickListener = function () { return _this.onBtReset(); };\n break;\n case 'cancel':\n text = _this.translate('cancelFilter');\n clickListener = function (e) { _this.onBtCancel(e); };\n break;\n default:\n console.warn('Unknown button type specified');\n return;\n }\n var button = loadTemplate(\n /* html */\n \"\" + text + \"\\n \");\n eButtonsPanel.appendChild(button);\n _this.addManagedListener(button, 'click', clickListener);\n };\n convertToSet(buttons).forEach(function (type) { return addButton(type); });\n this.getGui().appendChild(eButtonsPanel);\n };\n ProvidedFilter.checkForDeprecatedParams = function (params) {\n var buttons = params.buttons || [];\n if (buttons.length > 0) {\n return;\n }\n var applyButton = params.applyButton, resetButton = params.resetButton, clearButton = params.clearButton;\n if (clearButton) {\n console.warn('AG Grid: as of AG Grid v23.2, filterParams.clearButton is deprecated. Please use filterParams.buttons instead');\n buttons.push('clear');\n }\n if (resetButton) {\n console.warn('AG Grid: as of AG Grid v23.2, filterParams.resetButton is deprecated. Please use filterParams.buttons instead');\n buttons.push('reset');\n }\n if (applyButton) {\n console.warn('AG Grid: as of AG Grid v23.2, filterParams.applyButton is deprecated. Please use filterParams.buttons instead');\n buttons.push('apply');\n }\n if (params.apply) {\n console.warn('AG Grid: as of AG Grid v21, filterParams.apply is deprecated. Please use filterParams.buttons instead');\n buttons.push('apply');\n }\n params.buttons = buttons;\n };\n // subclasses can override this to provide alternative debounce defaults\n ProvidedFilter.prototype.getDefaultDebounceMs = function () {\n return 0;\n };\n ProvidedFilter.prototype.setupOnBtApplyDebounce = function () {\n var debounceMs = ProvidedFilter.getDebounceMs(this.providedFilterParams, this.getDefaultDebounceMs());\n this.onBtApplyDebounce = debounce(this.onBtApply.bind(this), debounceMs);\n };\n ProvidedFilter.prototype.getModel = function () {\n return this.appliedModel;\n };\n ProvidedFilter.prototype.setModel = function (model) {\n var _this = this;\n var promise = model ? this.setModelIntoUi(model) : this.resetUiToDefaults();\n return promise.then(function () {\n _this.updateUiVisibility();\n // we set the model from the GUI, rather than the provided model,\n // so the model is consistent, e.g. handling of null/undefined will be the same,\n // or if model is case insensitive, then casing is removed.\n _this.applyModel();\n });\n };\n ProvidedFilter.prototype.onBtCancel = function (e) {\n var _this = this;\n this.setModelIntoUi(this.getModel()).then(function () {\n _this.onUiChanged(false, 'prevent');\n if (_this.providedFilterParams.closeOnApply) {\n _this.close(e);\n }\n });\n };\n ProvidedFilter.prototype.onBtClear = function () {\n var _this = this;\n this.resetUiToDefaults().then(function () { return _this.onUiChanged(); });\n };\n ProvidedFilter.prototype.onBtReset = function () {\n this.onBtClear();\n this.onBtApply();\n };\n /**\n * Applies changes made in the UI to the filter, and returns true if the model has changed.\n */\n ProvidedFilter.prototype.applyModel = function () {\n var newModel = this.getModelFromUi();\n if (!this.isModelValid(newModel)) {\n return false;\n }\n var previousModel = this.appliedModel;\n this.appliedModel = newModel;\n // models can be same if user pasted same content into text field, or maybe just changed the case\n // and it's a case insensitive filter\n return !this.areModelsEqual(previousModel, newModel);\n };\n ProvidedFilter.prototype.isModelValid = function (model) {\n return true;\n };\n ProvidedFilter.prototype.onBtApply = function (afterFloatingFilter, afterDataChange, e) {\n if (afterFloatingFilter === void 0) { afterFloatingFilter = false; }\n if (afterDataChange === void 0) { afterDataChange = false; }\n if (this.applyModel()) {\n // the floating filter uses 'afterFloatingFilter' info, so it doesn't refresh after filter changed if change\n // came from floating filter\n this.providedFilterParams.filterChangedCallback({ afterFloatingFilter: afterFloatingFilter, afterDataChange: afterDataChange });\n }\n var closeOnApply = this.providedFilterParams.closeOnApply;\n // only close if an apply button is visible, otherwise we'd be closing every time a change was made!\n if (closeOnApply && this.applyActive && !afterFloatingFilter && !afterDataChange) {\n this.close(e);\n }\n };\n ProvidedFilter.prototype.onNewRowsLoaded = function () {\n var _this = this;\n if (!this.newRowsActionKeep) {\n this.resetUiToDefaults().then(function () { return _this.appliedModel = null; });\n }\n };\n ProvidedFilter.prototype.close = function (e) {\n if (!this.hidePopup) {\n return;\n }\n var keyboardEvent = e;\n var key = keyboardEvent && keyboardEvent.key;\n var params;\n if (key === 'Enter' || key === 'Space') {\n params = { keyboardEvent: keyboardEvent };\n }\n this.hidePopup(params);\n this.hidePopup = null;\n };\n // called by set filter\n ProvidedFilter.prototype.isNewRowsActionKeep = function () {\n return this.newRowsActionKeep;\n };\n /**\n * By default, if the change came from a floating filter it will be applied immediately, otherwise if there is no\n * apply button it will be applied after a debounce, otherwise it will not be applied at all. This behaviour can\n * be adjusted by using the apply parameter.\n */\n ProvidedFilter.prototype.onUiChanged = function (fromFloatingFilter, apply) {\n if (fromFloatingFilter === void 0) { fromFloatingFilter = false; }\n this.updateUiVisibility();\n this.providedFilterParams.filterModifiedCallback();\n if (this.applyActive) {\n var isValid = this.isModelValid(this.getModelFromUi());\n setDisabled(this.getRefElement('applyFilterButton'), !isValid);\n }\n if ((fromFloatingFilter && !apply) || apply === 'immediately') {\n this.onBtApply(fromFloatingFilter);\n }\n else if ((!this.applyActive && !apply) || apply === 'debounce') {\n this.onBtApplyDebounce();\n }\n };\n ProvidedFilter.prototype.afterGuiAttached = function (params) {\n if (params == null) {\n return;\n }\n this.hidePopup = params.hidePopup;\n };\n // static, as used by floating filter also\n ProvidedFilter.getDebounceMs = function (params, debounceDefault) {\n if (ProvidedFilter.isUseApplyButton(params)) {\n if (params.debounceMs != null) {\n console.warn('AG Grid: debounceMs is ignored when apply button is present');\n }\n return 0;\n }\n return params.debounceMs != null ? params.debounceMs : debounceDefault;\n };\n // static, as used by floating filter also\n ProvidedFilter.isUseApplyButton = function (params) {\n ProvidedFilter.checkForDeprecatedParams(params);\n return !!params.buttons && params.buttons.indexOf('apply') >= 0;\n };\n ProvidedFilter.prototype.destroy = function () {\n this.hidePopup = null;\n _super.prototype.destroy.call(this);\n };\n ProvidedFilter.prototype.translate = function (key) {\n var translate = this.gridOptionsWrapper.getLocaleTextFunc();\n return translate(key, DEFAULT_FILTER_LOCALE_TEXT[key]);\n };\n __decorate$c([\n Autowired('rowModel')\n ], ProvidedFilter.prototype, \"rowModel\", void 0);\n __decorate$c([\n PostConstruct\n ], ProvidedFilter.prototype, \"postConstruct\", null);\n return ProvidedFilter;\n}(ManagedFocusComponent));\n\n/**\n * @ag-grid-community/core - Advanced Data Grid / Data Table supporting Javascript / React / AngularJS / Web Components\n * @version v25.1.0\n * @link http://www.ag-grid.com/\n * @license MIT\n */\nvar __extends$a = (undefined && undefined.__extends) || (function () {\n var extendStatics = function (d, b) {\n extendStatics = Object.setPrototypeOf ||\n ({ __proto__: [] } instanceof Array && function (d, b) { d.__proto__ = b; }) ||\n function (d, b) { for (var p in b) if (b.hasOwnProperty(p)) d[p] = b[p]; };\n return extendStatics(d, b);\n };\n return function (d, b) {\n extendStatics(d, b);\n function __() { this.constructor = d; }\n d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __());\n };\n})();\nvar __decorate$d = (undefined && undefined.__decorate) || function (decorators, target, key, desc) {\n var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d;\n if (typeof Reflect === \"object\" && typeof Reflect.decorate === \"function\") r = Reflect.decorate(decorators, target, key, desc);\n else for (var i = decorators.length - 1; i >= 0; i--) if (d = decorators[i]) r = (c < 3 ? d(r) : c > 3 ? d(target, key, r) : d(target, key)) || r;\n return c > 3 && r && Object.defineProperty(target, key, r), r;\n};\nvar ConditionPosition;\n(function (ConditionPosition) {\n ConditionPosition[ConditionPosition[\"One\"] = 0] = \"One\";\n ConditionPosition[ConditionPosition[\"Two\"] = 1] = \"Two\";\n})(ConditionPosition || (ConditionPosition = {}));\n/**\n * Every filter with a dropdown where the user can specify a comparing type against the filter values\n */\nvar SimpleFilter = /** @class */ (function (_super) {\n __extends$a(SimpleFilter, _super);\n function SimpleFilter() {\n return _super !== null && _super.apply(this, arguments) || this;\n }\n // returns true if this type requires a 'from' field, eg any filter that requires at least one text value\n SimpleFilter.prototype.showValueFrom = function (type) {\n return !this.doesFilterHaveHiddenInput(type) && type !== SimpleFilter.EMPTY;\n };\n // returns true if this type requires a 'to' field, currently only 'range' returns true\n SimpleFilter.prototype.showValueTo = function (type) {\n return type === SimpleFilter.IN_RANGE;\n };\n // floating filter calls this when user applies filter from floating filter\n SimpleFilter.prototype.onFloatingFilterChanged = function (type, value) {\n this.setTypeFromFloatingFilter(type);\n this.setValueFromFloatingFilter(value);\n this.onUiChanged(true);\n };\n SimpleFilter.prototype.setTypeFromFloatingFilter = function (type) {\n this.eType1.setValue(type);\n this.eType2.setValue(this.optionsFactory.getDefaultOption());\n (this.isDefaultOperator('AND') ? this.eJoinOperatorAnd : this.eJoinOperatorOr).setValue(true);\n };\n SimpleFilter.prototype.getModelFromUi = function () {\n if (!this.isConditionUiComplete(ConditionPosition.One)) {\n return null;\n }\n if (this.isAllowTwoConditions() && this.isConditionUiComplete(ConditionPosition.Two)) {\n return {\n filterType: this.getFilterType(),\n operator: this.getJoinOperator(),\n condition1: this.createCondition(ConditionPosition.One),\n condition2: this.createCondition(ConditionPosition.Two)\n };\n }\n return this.createCondition(ConditionPosition.One);\n };\n SimpleFilter.prototype.getCondition1Type = function () {\n return this.eType1.getValue();\n };\n SimpleFilter.prototype.getCondition2Type = function () {\n return this.eType2.getValue();\n };\n SimpleFilter.prototype.getJoinOperator = function () {\n return this.eJoinOperatorOr.getValue() === true ? 'OR' : 'AND';\n };\n SimpleFilter.prototype.areModelsEqual = function (a, b) {\n // both are missing\n if (!a && !b) {\n return true;\n }\n // one is missing, other present\n if ((!a && b) || (a && !b)) {\n return false;\n }\n // one is combined, the other is not\n var aIsSimple = !a.operator;\n var bIsSimple = !b.operator;\n var oneSimpleOneCombined = (!aIsSimple && bIsSimple) || (aIsSimple && !bIsSimple);\n if (oneSimpleOneCombined) {\n return false;\n }\n var res;\n // otherwise both present, so compare\n if (aIsSimple) {\n var aSimple = a;\n var bSimple = b;\n res = this.areSimpleModelsEqual(aSimple, bSimple);\n }\n else {\n var aCombined = a;\n var bCombined = b;\n res = aCombined.operator === bCombined.operator\n && this.areSimpleModelsEqual(aCombined.condition1, bCombined.condition1)\n && this.areSimpleModelsEqual(aCombined.condition2, bCombined.condition2);\n }\n return res;\n };\n SimpleFilter.prototype.setModelIntoUi = function (model) {\n var isCombined = model.operator;\n if (isCombined) {\n var combinedModel = model;\n var orChecked = combinedModel.operator === 'OR';\n this.eJoinOperatorAnd.setValue(!orChecked);\n this.eJoinOperatorOr.setValue(orChecked);\n this.eType1.setValue(combinedModel.condition1.type);\n this.eType2.setValue(combinedModel.condition2.type);\n this.setConditionIntoUi(combinedModel.condition1, ConditionPosition.One);\n this.setConditionIntoUi(combinedModel.condition2, ConditionPosition.Two);\n }\n else {\n var simpleModel = model;\n this.eJoinOperatorAnd.setValue(this.isDefaultOperator('AND'));\n this.eJoinOperatorOr.setValue(this.isDefaultOperator('OR'));\n this.eType1.setValue(simpleModel.type);\n this.eType2.setValue(this.optionsFactory.getDefaultOption());\n this.setConditionIntoUi(simpleModel, ConditionPosition.One);\n this.setConditionIntoUi(null, ConditionPosition.Two);\n }\n return AgPromise.resolve();\n };\n SimpleFilter.prototype.doesFilterPass = function (params) {\n var _this = this;\n var model = this.getModel();\n if (model == null) {\n return true;\n }\n var operator = model.operator;\n var models = [];\n if (operator) {\n var combinedModel = model;\n models.push(combinedModel.condition1, combinedModel.condition2);\n }\n else {\n models.push(model);\n }\n var combineFunction = operator && operator === 'OR' ? some : every;\n return combineFunction(models, function (m) { return _this.individualConditionPasses(params, m); });\n };\n SimpleFilter.prototype.setParams = function (params) {\n _super.prototype.setParams.call(this, params);\n this.optionsFactory = new OptionsFactory();\n this.optionsFactory.init(params, this.getDefaultFilterOptions());\n this.allowTwoConditions = !params.suppressAndOrCondition;\n this.alwaysShowBothConditions = !!params.alwaysShowBothConditions;\n this.defaultJoinOperator = this.getDefaultJoinOperator(params.defaultJoinOperator);\n this.putOptionsIntoDropdown();\n this.addChangedListeners();\n };\n SimpleFilter.prototype.getDefaultJoinOperator = function (defaultJoinOperator) {\n return includes(['AND', 'OR'], defaultJoinOperator) ? defaultJoinOperator : 'AND';\n };\n SimpleFilter.prototype.putOptionsIntoDropdown = function () {\n var _this = this;\n var filterOptions = this.optionsFactory.getFilterOptions();\n forEach(filterOptions, function (option) {\n var value;\n var text;\n if (typeof option === 'string') {\n value = option;\n text = _this.translate(value);\n }\n else {\n value = option.displayKey;\n var customOption = _this.optionsFactory.getCustomOption(value);\n text = customOption ?\n _this.gridOptionsWrapper.getLocaleTextFunc()(customOption.displayKey, customOption.displayName) :\n _this.translate(value);\n }\n var createOption = function () { return ({ value: value, text: text }); };\n _this.eType1.addOption(createOption());\n _this.eType2.addOption(createOption());\n });\n var readOnly = filterOptions.length <= 1;\n this.eType1.setDisabled(readOnly);\n this.eType2.setDisabled(readOnly);\n };\n SimpleFilter.prototype.isAllowTwoConditions = function () {\n return this.allowTwoConditions;\n };\n SimpleFilter.prototype.createBodyTemplate = function () {\n return /* html */ \"\\n \\n \" + this.createValueTemplate(ConditionPosition.One) + \"\\n
\\n \\n \\n
\\n \\n \" + this.createValueTemplate(ConditionPosition.Two);\n };\n SimpleFilter.prototype.getCssIdentifier = function () {\n return 'simple-filter';\n };\n SimpleFilter.prototype.updateUiVisibility = function () {\n var isCondition2Enabled = this.isCondition2Enabled();\n if (this.alwaysShowBothConditions) {\n this.eJoinOperatorAnd.setDisabled(!isCondition2Enabled);\n this.eJoinOperatorOr.setDisabled(!isCondition2Enabled);\n this.eType2.setDisabled(!isCondition2Enabled);\n setDisabled(this.eCondition2Body, !isCondition2Enabled);\n }\n else {\n setDisplayed(this.eJoinOperatorPanel, isCondition2Enabled);\n setDisplayed(this.eType2.getGui(), isCondition2Enabled);\n setDisplayed(this.eCondition2Body, isCondition2Enabled);\n }\n };\n SimpleFilter.prototype.isCondition2Enabled = function () {\n return this.allowTwoConditions && this.isConditionUiComplete(ConditionPosition.One);\n };\n SimpleFilter.prototype.resetUiToDefaults = function (silent) {\n var translate = this.gridOptionsWrapper.getLocaleTextFunc();\n var filteringLabel = translate('ariaFilteringOperator', 'Filtering operator');\n var uniqueGroupId = 'ag-simple-filter-and-or-' + this.getCompId();\n var defaultOption = this.optionsFactory.getDefaultOption();\n this.eType1.setValue(defaultOption, silent).setAriaLabel(filteringLabel);\n this.eType2.setValue(defaultOption, silent).setAriaLabel(filteringLabel);\n this.eJoinOperatorAnd\n .setValue(this.isDefaultOperator('AND'), silent)\n .setName(uniqueGroupId)\n .setLabel(this.translate('andCondition'));\n this.eJoinOperatorOr\n .setValue(this.isDefaultOperator('OR'), silent)\n .setName(uniqueGroupId)\n .setLabel(this.translate('orCondition'));\n return AgPromise.resolve();\n };\n SimpleFilter.prototype.isDefaultOperator = function (operator) {\n return operator === this.defaultJoinOperator;\n };\n SimpleFilter.prototype.addChangedListeners = function () {\n var _this = this;\n var listener = function () { return _this.onUiChanged(); };\n this.eType1.onValueChange(listener);\n this.eType2.onValueChange(listener);\n this.eJoinOperatorOr.onValueChange(listener);\n this.eJoinOperatorAnd.onValueChange(listener);\n };\n SimpleFilter.prototype.doesFilterHaveHiddenInput = function (filterType) {\n var customFilterOption = this.optionsFactory.getCustomOption(filterType);\n return customFilterOption && customFilterOption.hideFilterInput;\n };\n SimpleFilter.EMPTY = 'empty';\n SimpleFilter.EQUALS = 'equals';\n SimpleFilter.NOT_EQUAL = 'notEqual';\n SimpleFilter.LESS_THAN = 'lessThan';\n SimpleFilter.LESS_THAN_OR_EQUAL = 'lessThanOrEqual';\n SimpleFilter.GREATER_THAN = 'greaterThan';\n SimpleFilter.GREATER_THAN_OR_EQUAL = 'greaterThanOrEqual';\n SimpleFilter.IN_RANGE = 'inRange';\n SimpleFilter.CONTAINS = 'contains';\n SimpleFilter.NOT_CONTAINS = 'notContains';\n SimpleFilter.STARTS_WITH = 'startsWith';\n SimpleFilter.ENDS_WITH = 'endsWith';\n __decorate$d([\n RefSelector('eOptions1')\n ], SimpleFilter.prototype, \"eType1\", void 0);\n __decorate$d([\n RefSelector('eOptions2')\n ], SimpleFilter.prototype, \"eType2\", void 0);\n __decorate$d([\n RefSelector('eJoinOperatorPanel')\n ], SimpleFilter.prototype, \"eJoinOperatorPanel\", void 0);\n __decorate$d([\n RefSelector('eJoinOperatorAnd')\n ], SimpleFilter.prototype, \"eJoinOperatorAnd\", void 0);\n __decorate$d([\n RefSelector('eJoinOperatorOr')\n ], SimpleFilter.prototype, \"eJoinOperatorOr\", void 0);\n __decorate$d([\n RefSelector('eCondition1Body')\n ], SimpleFilter.prototype, \"eCondition1Body\", void 0);\n __decorate$d([\n RefSelector('eCondition2Body')\n ], SimpleFilter.prototype, \"eCondition2Body\", void 0);\n return SimpleFilter;\n}(ProvidedFilter));\n\n/**\n * @ag-grid-community/core - Advanced Data Grid / Data Table supporting Javascript / React / AngularJS / Web Components\n * @version v25.1.0\n * @link http://www.ag-grid.com/\n * @license MIT\n */\nvar __extends$b = (undefined && undefined.__extends) || (function () {\n var extendStatics = function (d, b) {\n extendStatics = Object.setPrototypeOf ||\n ({ __proto__: [] } instanceof Array && function (d, b) { d.__proto__ = b; }) ||\n function (d, b) { for (var p in b) if (b.hasOwnProperty(p)) d[p] = b[p]; };\n return extendStatics(d, b);\n };\n return function (d, b) {\n extendStatics(d, b);\n function __() { this.constructor = d; }\n d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __());\n };\n})();\nvar ScalarFilter = /** @class */ (function (_super) {\n __extends$b(ScalarFilter, _super);\n function ScalarFilter() {\n return _super !== null && _super.apply(this, arguments) || this;\n }\n ScalarFilter.prototype.setParams = function (params) {\n _super.prototype.setParams.call(this, params);\n this.scalarFilterParams = params;\n this.checkDeprecatedParams();\n };\n ScalarFilter.prototype.checkDeprecatedParams = function () {\n if (this.scalarFilterParams.nullComparator) {\n console.warn('AG Grid: Since v21.0, the property filterParams.nullComparator is deprecated. ' +\n 'Please use filterParams.includeBlanksInEquals, filterParams.includeBlanksInLessThan and ' +\n 'filterParams.includeBlanksInGreaterThan instead.');\n this.scalarFilterParams.includeBlanksInEquals = this.scalarFilterParams.nullComparator.equals;\n this.scalarFilterParams.includeBlanksInLessThan = this.scalarFilterParams.nullComparator.lessThan;\n this.scalarFilterParams.includeBlanksInGreaterThan = this.scalarFilterParams.nullComparator.greaterThan;\n }\n };\n ScalarFilter.prototype.individualConditionPasses = function (params, filterModel) {\n var cellValue = this.scalarFilterParams.valueGetter(params.node);\n var range = this.mapRangeFromModel(filterModel);\n var filterValue = range.from;\n var filterValueTo = range.to;\n var filterType = filterModel.type;\n var customFilterOption = this.optionsFactory.getCustomOption(filterType);\n if (customFilterOption) {\n // only execute the custom filter if a value exists or a value isn't required, i.e. input is hidden\n if (filterValue != null || customFilterOption.hideFilterInput) {\n return customFilterOption.test(filterValue, cellValue);\n }\n }\n if (cellValue == null) {\n switch (filterType) {\n case ScalarFilter.EQUALS:\n case ScalarFilter.NOT_EQUAL:\n if (this.scalarFilterParams.includeBlanksInEquals) {\n return true;\n }\n break;\n case ScalarFilter.GREATER_THAN:\n case ScalarFilter.GREATER_THAN_OR_EQUAL:\n if (this.scalarFilterParams.includeBlanksInGreaterThan) {\n return true;\n }\n break;\n case ScalarFilter.LESS_THAN:\n case ScalarFilter.LESS_THAN_OR_EQUAL:\n if (this.scalarFilterParams.includeBlanksInLessThan) {\n return true;\n }\n break;\n case ScalarFilter.IN_RANGE:\n if (this.scalarFilterParams.includeBlanksInRange) {\n return true;\n }\n break;\n }\n return false;\n }\n var comparator = this.comparator();\n var compareResult = comparator(filterValue, cellValue);\n switch (filterType) {\n case ScalarFilter.EQUALS:\n return compareResult === 0;\n case ScalarFilter.NOT_EQUAL:\n return compareResult !== 0;\n case ScalarFilter.GREATER_THAN:\n return compareResult > 0;\n case ScalarFilter.GREATER_THAN_OR_EQUAL:\n return compareResult >= 0;\n case ScalarFilter.LESS_THAN:\n return compareResult < 0;\n case ScalarFilter.LESS_THAN_OR_EQUAL:\n return compareResult <= 0;\n case ScalarFilter.IN_RANGE: {\n var compareToResult = comparator(filterValueTo, cellValue);\n return this.scalarFilterParams.inRangeInclusive ?\n compareResult >= 0 && compareToResult <= 0 :\n compareResult > 0 && compareToResult < 0;\n }\n default:\n throw new Error('Unexpected type of filter: ' + filterType);\n }\n };\n return ScalarFilter;\n}(SimpleFilter));\n\n/**\n * @ag-grid-community/core - Advanced Data Grid / Data Table supporting Javascript / React / AngularJS / Web Components\n * @version v25.1.0\n * @link http://www.ag-grid.com/\n * @license MIT\n */\nvar __extends$c = (undefined && undefined.__extends) || (function () {\n var extendStatics = function (d, b) {\n extendStatics = Object.setPrototypeOf ||\n ({ __proto__: [] } instanceof Array && function (d, b) { d.__proto__ = b; }) ||\n function (d, b) { for (var p in b) if (b.hasOwnProperty(p)) d[p] = b[p]; };\n return extendStatics(d, b);\n };\n return function (d, b) {\n extendStatics(d, b);\n function __() { this.constructor = d; }\n d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __());\n };\n})();\nvar __decorate$e = (undefined && undefined.__decorate) || function (decorators, target, key, desc) {\n var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d;\n if (typeof Reflect === \"object\" && typeof Reflect.decorate === \"function\") r = Reflect.decorate(decorators, target, key, desc);\n else for (var i = decorators.length - 1; i >= 0; i--) if (d = decorators[i]) r = (c < 3 ? d(r) : c > 3 ? d(target, key, r) : d(target, key)) || r;\n return c > 3 && r && Object.defineProperty(target, key, r), r;\n};\nvar DateFilter = /** @class */ (function (_super) {\n __extends$c(DateFilter, _super);\n function DateFilter() {\n return _super.call(this, 'dateFilter') || this;\n }\n DateFilter.prototype.afterGuiAttached = function (params) {\n _super.prototype.afterGuiAttached.call(this, params);\n this.dateCondition1FromComp.afterGuiAttached(params);\n };\n DateFilter.prototype.mapRangeFromModel = function (filterModel) {\n // unlike the other filters, we do two things here:\n // 1) allow for different attribute names (same as done for other filters) (eg the 'from' and 'to'\n // are in different locations in Date and Number filter models)\n // 2) convert the type (because Date filter uses Dates, however model is 'string')\n //\n // NOTE: The conversion of string to date also removes the timezone - i.e. when user picks\n // a date from the UI, it will have timezone info in it. This is lost when creating\n // the model. When we recreate the date again here, it's without a timezone.\n return {\n from: parseDateTimeFromString(filterModel.dateFrom),\n to: parseDateTimeFromString(filterModel.dateTo)\n };\n };\n DateFilter.prototype.setValueFromFloatingFilter = function (value) {\n this.dateCondition1FromComp.setDate(value == null ? null : parseDateTimeFromString(value));\n this.dateCondition1ToComp.setDate(null);\n this.dateCondition2FromComp.setDate(null);\n this.dateCondition2ToComp.setDate(null);\n };\n DateFilter.prototype.setConditionIntoUi = function (model, position) {\n var _a = model ?\n [parseDateTimeFromString(model.dateFrom), parseDateTimeFromString(model.dateTo)] :\n [null, null], dateFrom = _a[0], dateTo = _a[1];\n var _b = this.getFromToComponents(position), compFrom = _b[0], compTo = _b[1];\n compFrom.setDate(dateFrom);\n compTo.setDate(dateTo);\n };\n DateFilter.prototype.resetUiToDefaults = function (silent) {\n var _this = this;\n return _super.prototype.resetUiToDefaults.call(this, silent).then(function () {\n _this.dateCondition1FromComp.setDate(null);\n _this.dateCondition1ToComp.setDate(null);\n _this.dateCondition2FromComp.setDate(null);\n _this.dateCondition2ToComp.setDate(null);\n });\n };\n DateFilter.prototype.comparator = function () {\n return this.dateFilterParams.comparator ? this.dateFilterParams.comparator : this.defaultComparator.bind(this);\n };\n DateFilter.prototype.defaultComparator = function (filterDate, cellValue) {\n // The default comparator assumes that the cellValue is a date\n var cellAsDate = cellValue;\n if (cellValue == null || cellAsDate < filterDate) {\n return -1;\n }\n if (cellAsDate > filterDate) {\n return 1;\n }\n return 0;\n };\n DateFilter.prototype.setParams = function (params) {\n _super.prototype.setParams.call(this, params);\n this.dateFilterParams = params;\n this.createDateComponents();\n };\n DateFilter.prototype.createDateComponents = function () {\n var _this = this;\n var createDateCompWrapper = function (element) {\n return new DateCompWrapper(_this.getContext(), _this.userComponentFactory, {\n onDateChanged: function () { return _this.onUiChanged(); },\n filterParams: _this.dateFilterParams\n }, element);\n };\n this.dateCondition1FromComp = createDateCompWrapper(this.eCondition1PanelFrom);\n this.dateCondition1ToComp = createDateCompWrapper(this.eCondition1PanelTo);\n this.dateCondition2FromComp = createDateCompWrapper(this.eCondition2PanelFrom);\n this.dateCondition2ToComp = createDateCompWrapper(this.eCondition2PanelTo);\n this.addDestroyFunc(function () {\n _this.dateCondition1FromComp.destroy();\n _this.dateCondition1ToComp.destroy();\n _this.dateCondition2FromComp.destroy();\n _this.dateCondition2ToComp.destroy();\n });\n };\n DateFilter.prototype.getDefaultFilterOptions = function () {\n return DateFilter.DEFAULT_FILTER_OPTIONS;\n };\n DateFilter.prototype.createValueTemplate = function (position) {\n var pos = position === ConditionPosition.One ? '1' : '2';\n return /* html */ \"\\n
\\n
\\n
\\n
\";\n };\n DateFilter.prototype.isConditionUiComplete = function (position) {\n var positionOne = position === ConditionPosition.One;\n var option = positionOne ? this.getCondition1Type() : this.getCondition2Type();\n if (option === SimpleFilter.EMPTY) {\n return false;\n }\n if (this.doesFilterHaveHiddenInput(option)) {\n return true;\n }\n var _a = this.getFromToComponents(position), compFrom = _a[0], compTo = _a[1];\n var minValidYear = this.dateFilterParams.minValidYear == null ? 1000 : this.dateFilterParams.minValidYear;\n var isValidDate = function (value) { return value != null && value.getUTCFullYear() > minValidYear; };\n return isValidDate(compFrom.getDate()) && (!this.showValueTo(option) || isValidDate(compTo.getDate()));\n };\n DateFilter.prototype.areSimpleModelsEqual = function (aSimple, bSimple) {\n return aSimple.dateFrom === bSimple.dateFrom\n && aSimple.dateTo === bSimple.dateTo\n && aSimple.type === bSimple.type;\n };\n DateFilter.prototype.getFilterType = function () {\n return 'date';\n };\n DateFilter.prototype.createCondition = function (position) {\n var positionOne = position === ConditionPosition.One;\n var type = positionOne ? this.getCondition1Type() : this.getCondition2Type();\n var _a = this.getFromToComponents(position), compFrom = _a[0], compTo = _a[1];\n return {\n dateFrom: serialiseDate(compFrom.getDate()),\n dateTo: serialiseDate(compTo.getDate()),\n type: type,\n filterType: this.getFilterType()\n };\n };\n DateFilter.prototype.resetPlaceholder = function () {\n var globalTranslate = this.gridOptionsWrapper.getLocaleTextFunc();\n var placeholder = this.translate('dateFormatOoo');\n var ariaLabel = globalTranslate('ariaFilterValue', 'Filter Value');\n this.dateCondition1FromComp.setInputPlaceholder(placeholder);\n this.dateCondition1FromComp.setInputAriaLabel(ariaLabel);\n this.dateCondition1ToComp.setInputPlaceholder(placeholder);\n this.dateCondition1ToComp.setInputAriaLabel(ariaLabel);\n this.dateCondition2FromComp.setInputPlaceholder(placeholder);\n this.dateCondition2FromComp.setInputAriaLabel(ariaLabel);\n this.dateCondition2ToComp.setInputPlaceholder(placeholder);\n this.dateCondition2ToComp.setInputAriaLabel(ariaLabel);\n };\n DateFilter.prototype.updateUiVisibility = function () {\n _super.prototype.updateUiVisibility.call(this);\n this.resetPlaceholder();\n var condition1Type = this.getCondition1Type();\n setDisplayed(this.eCondition1PanelFrom, this.showValueFrom(condition1Type));\n setDisplayed(this.eCondition1PanelTo, this.showValueTo(condition1Type));\n var condition2Type = this.getCondition2Type();\n setDisplayed(this.eCondition2PanelFrom, this.showValueFrom(condition2Type));\n setDisplayed(this.eCondition2PanelTo, this.showValueTo(condition2Type));\n };\n DateFilter.prototype.getFromToComponents = function (position) {\n return position === ConditionPosition.One ?\n [this.dateCondition1FromComp, this.dateCondition1ToComp] :\n [this.dateCondition2FromComp, this.dateCondition2ToComp];\n };\n DateFilter.DEFAULT_FILTER_OPTIONS = [\n ScalarFilter.EQUALS,\n ScalarFilter.GREATER_THAN,\n ScalarFilter.LESS_THAN,\n ScalarFilter.NOT_EQUAL,\n ScalarFilter.IN_RANGE\n ];\n __decorate$e([\n RefSelector('eCondition1PanelFrom')\n ], DateFilter.prototype, \"eCondition1PanelFrom\", void 0);\n __decorate$e([\n RefSelector('eCondition1PanelTo')\n ], DateFilter.prototype, \"eCondition1PanelTo\", void 0);\n __decorate$e([\n RefSelector('eCondition2PanelFrom')\n ], DateFilter.prototype, \"eCondition2PanelFrom\", void 0);\n __decorate$e([\n RefSelector('eCondition2PanelTo')\n ], DateFilter.prototype, \"eCondition2PanelTo\", void 0);\n __decorate$e([\n Autowired('userComponentFactory')\n ], DateFilter.prototype, \"userComponentFactory\", void 0);\n return DateFilter;\n}(ScalarFilter));\n\n/**\n * @ag-grid-community/core - Advanced Data Grid / Data Table supporting Javascript / React / AngularJS / Web Components\n * @version v25.1.0\n * @link http://www.ag-grid.com/\n * @license MIT\n */\nvar TouchListener = /** @class */ (function () {\n function TouchListener(eElement, preventMouseClick) {\n var _this = this;\n if (preventMouseClick === void 0) { preventMouseClick = false; }\n this.destroyFuncs = [];\n this.touching = false;\n this.eventService = new EventService();\n this.eElement = eElement;\n this.preventMouseClick = preventMouseClick;\n var startListener = this.onTouchStart.bind(this);\n var moveListener = this.onTouchMove.bind(this);\n var endListener = this.onTouchEnd.bind(this);\n this.eElement.addEventListener(\"touchstart\", startListener, { passive: true });\n this.eElement.addEventListener(\"touchmove\", moveListener, { passive: true });\n // we set passive=false, as we want to prevent default on this event\n this.eElement.addEventListener(\"touchend\", endListener, { passive: false });\n this.destroyFuncs.push(function () {\n _this.eElement.removeEventListener(\"touchstart\", startListener, { passive: true });\n _this.eElement.removeEventListener(\"touchmove\", moveListener, { passive: true });\n _this.eElement.removeEventListener(\"touchend\", endListener, { passive: false });\n });\n }\n TouchListener.prototype.getActiveTouch = function (touchList) {\n for (var i = 0; i < touchList.length; i++) {\n var matches = touchList[i].identifier === this.touchStart.identifier;\n if (matches) {\n return touchList[i];\n }\n }\n return null;\n };\n TouchListener.prototype.addEventListener = function (eventType, listener) {\n this.eventService.addEventListener(eventType, listener);\n };\n TouchListener.prototype.removeEventListener = function (eventType, listener) {\n this.eventService.removeEventListener(eventType, listener);\n };\n TouchListener.prototype.onTouchStart = function (touchEvent) {\n var _this = this;\n // only looking at one touch point at any time\n if (this.touching) {\n return;\n }\n this.touchStart = touchEvent.touches[0];\n this.touching = true;\n this.moved = false;\n var touchStartCopy = this.touchStart;\n window.setTimeout(function () {\n var touchesMatch = _this.touchStart === touchStartCopy;\n if (_this.touching && touchesMatch && !_this.moved) {\n _this.moved = true;\n var event_1 = {\n type: TouchListener.EVENT_LONG_TAP,\n touchStart: _this.touchStart,\n touchEvent: touchEvent\n };\n _this.eventService.dispatchEvent(event_1);\n }\n }, 500);\n };\n TouchListener.prototype.onTouchMove = function (touchEvent) {\n if (!this.touching) {\n return;\n }\n var touch = this.getActiveTouch(touchEvent.touches);\n if (!touch) {\n return;\n }\n var eventIsFarAway = !areEventsNear(touch, this.touchStart, 4);\n if (eventIsFarAway) {\n this.moved = true;\n }\n };\n TouchListener.prototype.onTouchEnd = function (touchEvent) {\n if (!this.touching) {\n return;\n }\n if (!this.moved) {\n var event_2 = {\n type: TouchListener.EVENT_TAP,\n touchStart: this.touchStart\n };\n this.eventService.dispatchEvent(event_2);\n this.checkForDoubleTap();\n }\n // stops the tap from also been processed as a mouse click\n if (this.preventMouseClick) {\n touchEvent.preventDefault();\n }\n this.touching = false;\n };\n TouchListener.prototype.checkForDoubleTap = function () {\n var now = new Date().getTime();\n if (this.lastTapTime && this.lastTapTime > 0) {\n // if previous tap, see if duration is short enough to be considered double tap\n var interval = now - this.lastTapTime;\n if (interval > TouchListener.DOUBLE_TAP_MILLIS) {\n // dispatch double tap event\n var event_3 = {\n type: TouchListener.EVENT_DOUBLE_TAP,\n touchStart: this.touchStart\n };\n this.eventService.dispatchEvent(event_3);\n // this stops a tripple tap ending up as two double taps\n this.lastTapTime = null;\n }\n else {\n this.lastTapTime = now;\n }\n }\n else {\n this.lastTapTime = now;\n }\n };\n TouchListener.prototype.destroy = function () {\n this.destroyFuncs.forEach(function (func) { return func(); });\n };\n TouchListener.EVENT_TAP = \"tap\";\n TouchListener.EVENT_DOUBLE_TAP = \"doubleTap\";\n TouchListener.EVENT_LONG_TAP = \"longTap\";\n TouchListener.DOUBLE_TAP_MILLIS = 500;\n return TouchListener;\n}());\n\n/**\n * @ag-grid-community/core - Advanced Data Grid / Data Table supporting Javascript / React / AngularJS / Web Components\n * @version v25.1.0\n * @link http://www.ag-grid.com/\n * @license MIT\n */\nvar __extends$d = (undefined && undefined.__extends) || (function () {\n var extendStatics = function (d, b) {\n extendStatics = Object.setPrototypeOf ||\n ({ __proto__: [] } instanceof Array && function (d, b) { d.__proto__ = b; }) ||\n function (d, b) { for (var p in b) if (b.hasOwnProperty(p)) d[p] = b[p]; };\n return extendStatics(d, b);\n };\n return function (d, b) {\n extendStatics(d, b);\n function __() { this.constructor = d; }\n d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __());\n };\n})();\nvar __decorate$f = (undefined && undefined.__decorate) || function (decorators, target, key, desc) {\n var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d;\n if (typeof Reflect === \"object\" && typeof Reflect.decorate === \"function\") r = Reflect.decorate(decorators, target, key, desc);\n else for (var i = decorators.length - 1; i >= 0; i--) if (d = decorators[i]) r = (c < 3 ? d(r) : c > 3 ? d(target, key, r) : d(target, key)) || r;\n return c > 3 && r && Object.defineProperty(target, key, r), r;\n};\nvar HeaderComp = /** @class */ (function (_super) {\n __extends$d(HeaderComp, _super);\n function HeaderComp() {\n var _this = _super !== null && _super.apply(this, arguments) || this;\n _this.lastMovingChanged = 0;\n return _this;\n }\n // this is a user component, and IComponent has \"public destroy()\" as part of the interface.\n // so we need to override destroy() just to make the method public.\n HeaderComp.prototype.destroy = function () {\n _super.prototype.destroy.call(this);\n };\n HeaderComp.prototype.refresh = function (params) {\n this.params = params;\n // if template changed, then recreate the whole comp, the code required to manage\n // a changing template is to difficult for what it's worth.\n if (this.workOutTemplate() != this.currentTemplate) {\n return false;\n }\n if (this.workOutShowMenu() != this.currentShowMenu) {\n return false;\n }\n if (this.workOutSort() != this.currentSort) {\n return false;\n }\n this.setDisplayName(params);\n return true;\n };\n HeaderComp.prototype.workOutTemplate = function () {\n var template = firstExistingValue(this.params.template, HeaderComp.TEMPLATE);\n // take account of any newlines & whitespace before/after the actual template\n template = template && template.trim ? template.trim() : template;\n return template;\n };\n HeaderComp.prototype.init = function (params) {\n this.params = params;\n this.currentTemplate = this.workOutTemplate();\n this.setTemplate(this.currentTemplate);\n this.setupTap();\n this.setupIcons(params.column);\n this.setMenu();\n this.setupSort();\n this.setupFilterIcon();\n this.setDisplayName(params);\n };\n HeaderComp.prototype.setDisplayName = function (params) {\n if (this.currentDisplayName != params.displayName) {\n this.currentDisplayName = params.displayName;\n var displayNameSanitised = escapeString(this.currentDisplayName);\n if (this.eText) {\n this.eText.innerHTML = displayNameSanitised;\n }\n }\n };\n HeaderComp.prototype.setupIcons = function (column) {\n this.addInIcon('sortAscending', this.eSortAsc, column);\n this.addInIcon('sortDescending', this.eSortDesc, column);\n this.addInIcon('sortUnSort', this.eSortNone, column);\n this.addInIcon('menu', this.eMenu, column);\n this.addInIcon('filter', this.eFilter, column);\n };\n HeaderComp.prototype.addInIcon = function (iconName, eParent, column) {\n if (eParent == null) {\n return;\n }\n var eIcon = createIconNoSpan(iconName, this.gridOptionsWrapper, column);\n if (eIcon) {\n eParent.appendChild(eIcon);\n }\n };\n HeaderComp.prototype.setupTap = function () {\n var _this = this;\n var options = this.gridOptionsWrapper;\n if (options.isSuppressTouch()) {\n return;\n }\n var touchListener = new TouchListener(this.getGui(), true);\n var suppressMenuHide = options.isSuppressMenuHide();\n var tapMenuButton = suppressMenuHide && exists(this.eMenu);\n var menuTouchListener = tapMenuButton ? new TouchListener(this.eMenu, true) : touchListener;\n if (this.params.enableMenu) {\n var eventType = tapMenuButton ? 'EVENT_TAP' : 'EVENT_LONG_TAP';\n var showMenuFn = function (event) {\n options.getApi().showColumnMenuAfterMouseClick(_this.params.column, event.touchStart);\n };\n this.addManagedListener(menuTouchListener, TouchListener[eventType], showMenuFn);\n }\n if (this.params.enableSorting) {\n var tapListener = function (event) {\n var target = event.touchStart.target;\n // When suppressMenuHide is true, a tap on the menu icon will bubble up\n // to the header container, in that case we should not sort\n if (suppressMenuHide && _this.eMenu.contains(target)) {\n return;\n }\n _this.sortController.progressSort(_this.params.column, false, \"uiColumnSorted\");\n };\n this.addManagedListener(touchListener, TouchListener.EVENT_TAP, tapListener);\n }\n // if tapMenuButton is true `touchListener` and `menuTouchListener` are different\n // so we need to make sure to destroy both listeners here\n this.addDestroyFunc(function () { return touchListener.destroy(); });\n if (tapMenuButton) {\n this.addDestroyFunc(function () { return menuTouchListener.destroy(); });\n }\n };\n HeaderComp.prototype.workOutShowMenu = function () {\n // we don't show the menu if on an iPad/iPhone, as the user cannot have a pointer device/\n // However if suppressMenuHide is set to true the menu will be displayed alwasys, so it's ok\n // to show it on iPad in this case (as hover isn't needed). If suppressMenuHide\n // is false (default) user will need to use longpress to display the menu.\n var menuHides = !this.gridOptionsWrapper.isSuppressMenuHide();\n var onIpadAndMenuHides = isIOSUserAgent() && menuHides;\n var showMenu = this.params.enableMenu && !onIpadAndMenuHides;\n return showMenu;\n };\n HeaderComp.prototype.setMenu = function () {\n var _this = this;\n // if no menu provided in template, do nothing\n if (!this.eMenu) {\n return;\n }\n this.currentShowMenu = this.workOutShowMenu();\n if (!this.currentShowMenu) {\n removeFromParent(this.eMenu);\n return;\n }\n var suppressMenuHide = this.gridOptionsWrapper.isSuppressMenuHide();\n this.addManagedListener(this.eMenu, 'click', function () { return _this.showMenu(_this.eMenu); });\n addOrRemoveCssClass(this.eMenu, 'ag-header-menu-always-show', suppressMenuHide);\n };\n HeaderComp.prototype.showMenu = function (eventSource) {\n if (!eventSource) {\n eventSource = this.eMenu;\n }\n this.menuFactory.showMenuAfterButtonClick(this.params.column, eventSource);\n };\n HeaderComp.prototype.removeSortIcons = function () {\n removeFromParent(this.eSortAsc);\n removeFromParent(this.eSortDesc);\n removeFromParent(this.eSortNone);\n removeFromParent(this.eSortOrder);\n };\n HeaderComp.prototype.workOutSort = function () {\n return this.params.enableSorting;\n };\n HeaderComp.prototype.setupSort = function () {\n var _this = this;\n this.currentSort = this.params.enableSorting;\n if (!this.currentSort) {\n this.removeSortIcons();\n return;\n }\n var sortUsingCtrl = this.gridOptionsWrapper.isMultiSortKeyCtrl();\n // keep track of last time the moving changed flag was set\n this.addManagedListener(this.params.column, Column.EVENT_MOVING_CHANGED, function () {\n _this.lastMovingChanged = new Date().getTime();\n });\n // add the event on the header, so when clicked, we do sorting\n if (this.eLabel) {\n this.addManagedListener(this.eLabel, 'click', function (event) {\n // sometimes when moving a column via dragging, this was also firing a clicked event.\n // here is issue raised by user: https://ag-grid.zendesk.com/agent/tickets/1076\n // this check stops sort if a) column is moving or b) column moved less than 200ms ago (so caters for race condition)\n var moving = _this.params.column.isMoving();\n var nowTime = new Date().getTime();\n // typically there is <2ms if moving flag was set recently, as it would be done in same VM turn\n var movedRecently = (nowTime - _this.lastMovingChanged) < 50;\n var columnMoving = moving || movedRecently;\n if (!columnMoving) {\n var multiSort = sortUsingCtrl ? (event.ctrlKey || event.metaKey) : event.shiftKey;\n _this.params.progressSort(multiSort);\n }\n });\n }\n this.addManagedListener(this.params.column, Column.EVENT_SORT_CHANGED, this.onSortChanged.bind(this));\n this.onSortChanged();\n this.addManagedListener(this.eventService, Events.EVENT_SORT_CHANGED, this.setMultiSortOrder.bind(this));\n this.setMultiSortOrder();\n };\n HeaderComp.prototype.onSortChanged = function () {\n addOrRemoveCssClass(this.getGui(), 'ag-header-cell-sorted-asc', this.params.column.isSortAscending());\n addOrRemoveCssClass(this.getGui(), 'ag-header-cell-sorted-desc', this.params.column.isSortDescending());\n addOrRemoveCssClass(this.getGui(), 'ag-header-cell-sorted-none', this.params.column.isSortNone());\n if (this.eSortAsc) {\n addOrRemoveCssClass(this.eSortAsc, 'ag-hidden', !this.params.column.isSortAscending());\n }\n if (this.eSortDesc) {\n addOrRemoveCssClass(this.eSortDesc, 'ag-hidden', !this.params.column.isSortDescending());\n }\n if (this.eSortNone) {\n var alwaysHideNoSort = !this.params.column.getColDef().unSortIcon && !this.gridOptionsWrapper.isUnSortIcon();\n addOrRemoveCssClass(this.eSortNone, 'ag-hidden', alwaysHideNoSort || !this.params.column.isSortNone());\n }\n };\n // we listen here for global sort events, NOT column sort events, as we want to do this\n // when sorting has been set on all column (if we listened just for our col (where we\n // set the asc / desc icons) then it's possible other cols are yet to get their sorting state.\n HeaderComp.prototype.setMultiSortOrder = function () {\n if (!this.eSortOrder) {\n return;\n }\n var col = this.params.column;\n var allColumnsWithSorting = this.sortController.getColumnsWithSortingOrdered();\n var indexThisCol = allColumnsWithSorting.indexOf(col);\n var moreThanOneColSorting = allColumnsWithSorting.length > 1;\n var showIndex = col.isSorting() && moreThanOneColSorting;\n setDisplayed(this.eSortOrder, showIndex);\n if (indexThisCol >= 0) {\n this.eSortOrder.innerHTML = (indexThisCol + 1).toString();\n }\n else {\n clearElement(this.eSortOrder);\n }\n };\n HeaderComp.prototype.setupFilterIcon = function () {\n if (!this.eFilter) {\n return;\n }\n this.addManagedListener(this.params.column, Column.EVENT_FILTER_CHANGED, this.onFilterChanged.bind(this));\n this.onFilterChanged();\n };\n HeaderComp.prototype.onFilterChanged = function () {\n var filterPresent = this.params.column.isFilterActive();\n addOrRemoveCssClass(this.eFilter, 'ag-hidden', !filterPresent);\n };\n HeaderComp.TEMPLATE = \"
\\n \\n
\\n \\n \\n \\n \\n \\n \\n
\\n
\";\n __decorate$f([\n Autowired('sortController')\n ], HeaderComp.prototype, \"sortController\", void 0);\n __decorate$f([\n Autowired('menuFactory')\n ], HeaderComp.prototype, \"menuFactory\", void 0);\n __decorate$f([\n RefSelector('eFilter')\n ], HeaderComp.prototype, \"eFilter\", void 0);\n __decorate$f([\n RefSelector('eSortAsc')\n ], HeaderComp.prototype, \"eSortAsc\", void 0);\n __decorate$f([\n RefSelector('eSortDesc')\n ], HeaderComp.prototype, \"eSortDesc\", void 0);\n __decorate$f([\n RefSelector('eSortNone')\n ], HeaderComp.prototype, \"eSortNone\", void 0);\n __decorate$f([\n RefSelector('eSortOrder')\n ], HeaderComp.prototype, \"eSortOrder\", void 0);\n __decorate$f([\n RefSelector('eMenu')\n ], HeaderComp.prototype, \"eMenu\", void 0);\n __decorate$f([\n RefSelector('eLabel')\n ], HeaderComp.prototype, \"eLabel\", void 0);\n __decorate$f([\n RefSelector('eText')\n ], HeaderComp.prototype, \"eText\", void 0);\n return HeaderComp;\n}(Component));\n\n/**\n * @ag-grid-community/core - Advanced Data Grid / Data Table supporting Javascript / React / AngularJS / Web Components\n * @version v25.1.0\n * @link http://www.ag-grid.com/\n * @license MIT\n */\nvar __extends$e = (undefined && undefined.__extends) || (function () {\n var extendStatics = function (d, b) {\n extendStatics = Object.setPrototypeOf ||\n ({ __proto__: [] } instanceof Array && function (d, b) { d.__proto__ = b; }) ||\n function (d, b) { for (var p in b) if (b.hasOwnProperty(p)) d[p] = b[p]; };\n return extendStatics(d, b);\n };\n return function (d, b) {\n extendStatics(d, b);\n function __() { this.constructor = d; }\n d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __());\n };\n})();\nvar __decorate$g = (undefined && undefined.__decorate) || function (decorators, target, key, desc) {\n var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d;\n if (typeof Reflect === \"object\" && typeof Reflect.decorate === \"function\") r = Reflect.decorate(decorators, target, key, desc);\n else for (var i = decorators.length - 1; i >= 0; i--) if (d = decorators[i]) r = (c < 3 ? d(r) : c > 3 ? d(target, key, r) : d(target, key)) || r;\n return c > 3 && r && Object.defineProperty(target, key, r), r;\n};\nvar HeaderGroupComp = /** @class */ (function (_super) {\n __extends$e(HeaderGroupComp, _super);\n function HeaderGroupComp() {\n return _super.call(this, HeaderGroupComp.TEMPLATE) || this;\n }\n // this is a user component, and IComponent has \"public destroy()\" as part of the interface.\n // so we need to override destroy() just to make the method public.\n HeaderGroupComp.prototype.destroy = function () {\n _super.prototype.destroy.call(this);\n };\n HeaderGroupComp.prototype.init = function (params) {\n this.params = params;\n this.setupLabel();\n this.addGroupExpandIcon();\n this.setupExpandIcons();\n };\n HeaderGroupComp.prototype.setupExpandIcons = function () {\n var _this = this;\n this.addInIcon(\"columnGroupOpened\", \"agOpened\");\n this.addInIcon(\"columnGroupClosed\", \"agClosed\");\n var expandAction = function (event) {\n if (isStopPropagationForAgGrid(event)) {\n return;\n }\n var newExpandedValue = !_this.params.columnGroup.isExpanded();\n _this.columnController.setColumnGroupOpened(_this.params.columnGroup.getOriginalColumnGroup(), newExpandedValue, \"uiColumnExpanded\");\n };\n this.addTouchAndClickListeners(this.eCloseIcon, expandAction);\n this.addTouchAndClickListeners(this.eOpenIcon, expandAction);\n var stopPropagationAction = function (event) {\n stopPropagationForAgGrid(event);\n };\n // adding stopPropagation to the double click for the icons prevents double click action happening\n // when the icons are clicked. if the icons are double clicked, then the groups should open and\n // then close again straight away. if we also listened to double click, then the group would open,\n // close, then open, which is not what we want. double click should only action if the user double\n // clicks outside of the icons.\n this.addManagedListener(this.eCloseIcon, \"dblclick\", stopPropagationAction);\n this.addManagedListener(this.eOpenIcon, \"dblclick\", stopPropagationAction);\n this.addManagedListener(this.getGui(), \"dblclick\", expandAction);\n this.updateIconVisibility();\n var originalColumnGroup = this.params.columnGroup.getOriginalColumnGroup();\n this.addManagedListener(originalColumnGroup, OriginalColumnGroup.EVENT_EXPANDED_CHANGED, this.updateIconVisibility.bind(this));\n this.addManagedListener(originalColumnGroup, OriginalColumnGroup.EVENT_EXPANDABLE_CHANGED, this.updateIconVisibility.bind(this));\n };\n HeaderGroupComp.prototype.addTouchAndClickListeners = function (eElement, action) {\n var touchListener = new TouchListener(eElement, true);\n this.addManagedListener(touchListener, TouchListener.EVENT_TAP, action);\n this.addDestroyFunc(function () { return touchListener.destroy(); });\n this.addManagedListener(eElement, \"click\", action);\n };\n HeaderGroupComp.prototype.updateIconVisibility = function () {\n var columnGroup = this.params.columnGroup;\n if (columnGroup.isExpandable()) {\n var expanded = this.params.columnGroup.isExpanded();\n setDisplayed(this.eOpenIcon, expanded);\n setDisplayed(this.eCloseIcon, !expanded);\n }\n else {\n setDisplayed(this.eOpenIcon, false);\n setDisplayed(this.eCloseIcon, false);\n }\n };\n HeaderGroupComp.prototype.addInIcon = function (iconName, refName) {\n var eIcon = createIconNoSpan(iconName, this.gridOptionsWrapper, null);\n if (eIcon) {\n this.getRefElement(refName).appendChild(eIcon);\n }\n };\n HeaderGroupComp.prototype.addGroupExpandIcon = function () {\n if (!this.params.columnGroup.isExpandable()) {\n setDisplayed(this.eOpenIcon, false);\n setDisplayed(this.eCloseIcon, false);\n return;\n }\n };\n HeaderGroupComp.prototype.setupLabel = function () {\n // no renderer, default text render\n var displayName = this.params.displayName;\n if (exists(displayName)) {\n var displayNameSanitised = escapeString(displayName);\n this.getRefElement('agLabel').innerHTML = displayNameSanitised;\n }\n };\n HeaderGroupComp.TEMPLATE = \"
\\n \\n \\n \\n
\";\n __decorate$g([\n Autowired(\"columnController\")\n ], HeaderGroupComp.prototype, \"columnController\", void 0);\n __decorate$g([\n RefSelector(\"agOpened\")\n ], HeaderGroupComp.prototype, \"eOpenIcon\", void 0);\n __decorate$g([\n RefSelector(\"agClosed\")\n ], HeaderGroupComp.prototype, \"eCloseIcon\", void 0);\n return HeaderGroupComp;\n}(Component));\n\n/**\n * @ag-grid-community/core - Advanced Data Grid / Data Table supporting Javascript / React / AngularJS / Web Components\n * @version v25.1.0\n * @link http://www.ag-grid.com/\n * @license MIT\n */\nvar __decorate$h = (undefined && undefined.__decorate) || function (decorators, target, key, desc) {\n var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d;\n if (typeof Reflect === \"object\" && typeof Reflect.decorate === \"function\") r = Reflect.decorate(decorators, target, key, desc);\n else for (var i = decorators.length - 1; i >= 0; i--) if (d = decorators[i]) r = (c < 3 ? d(r) : c > 3 ? d(target, key, r) : d(target, key)) || r;\n return c > 3 && r && Object.defineProperty(target, key, r), r;\n};\nvar RowNode = /** @class */ (function () {\n function RowNode() {\n /** The index of this node in the grid, only valid if node is displayed in the grid, otherwise it should be ignored as old index may be present */\n this.rowIndex = null;\n /** Children mapped by the pivot columns */\n this.childrenMapped = {};\n /**\n * True if the RowNode is not filtered, or in a collapsed group.\n */\n this.displayed = false;\n /** The top pixel for this row */\n this.rowTop = null;\n /** The top pixel for this row last time, makes sense if data set was ordered or filtered,\n * it is used so new rows can animate in from their old position. */\n this.oldRowTop = null;\n /** True by default - can be overridden via gridOptions.isRowSelectable(rowNode) */\n this.selectable = true;\n /** Used by sorting service - to give deterministic sort to groups. Previously we\n * just id for this, however id is a string and had slower sorting compared to numbers. */\n this.__objectId = RowNode.OBJECT_ID_SEQUENCE++;\n /** True when nodes with the same id are being removed and added as part of the same batch transaction */\n this.alreadyRendered = false;\n this.highlighted = null;\n this.selected = false;\n }\n RowNode.prototype.setData = function (data) {\n this.setDataCommon(data, false);\n };\n // similar to setRowData, however it is expected that the data is the same data item. this\n // is intended to be used with Redux type stores, where the whole data can be changed. we are\n // guaranteed that the data is the same entity (so grid doesn't need to worry about the id of the\n // underlying data changing, hence doesn't need to worry about selection). the grid, upon receiving\n // dataChanged event, will refresh the cells rather than rip them all out (so user can show transitions).\n RowNode.prototype.updateData = function (data) {\n this.setDataCommon(data, true);\n };\n RowNode.prototype.setDataCommon = function (data, update) {\n var oldData = this.data;\n this.data = data;\n this.valueCache.onDataChanged();\n this.updateDataOnDetailNode();\n this.checkRowSelectable();\n var event = this.createDataChangedEvent(data, oldData, update);\n this.dispatchLocalEvent(event);\n };\n // when we are doing master / detail, the detail node is lazy created, but then kept around.\n // so if we show / hide the detail, the same detail rowNode is used. so we need to keep the data\n // in sync, otherwise expand/collapse of the detail would still show the old values.\n RowNode.prototype.updateDataOnDetailNode = function () {\n if (this.detailNode) {\n this.detailNode.data = this.data;\n }\n };\n RowNode.prototype.createDataChangedEvent = function (newData, oldData, update) {\n return {\n type: RowNode.EVENT_DATA_CHANGED,\n node: this,\n oldData: oldData,\n newData: newData,\n update: update\n };\n };\n RowNode.prototype.createLocalRowEvent = function (type) {\n return {\n type: type,\n node: this\n };\n };\n RowNode.prototype.getRowIndexString = function () {\n if (this.rowPinned === Constants.PINNED_TOP) {\n return 't-' + this.rowIndex;\n }\n if (this.rowPinned === Constants.PINNED_BOTTOM) {\n return 'b-' + this.rowIndex;\n }\n return this.rowIndex.toString();\n };\n RowNode.prototype.createDaemonNode = function () {\n var oldNode = new RowNode();\n this.context.createBean(oldNode);\n // just copy the id and data, this is enough for the node to be used\n // in the selection controller (the selection controller is the only\n // place where daemon nodes can live).\n oldNode.id = this.id;\n oldNode.data = this.data;\n oldNode.daemon = true;\n oldNode.selected = this.selected;\n oldNode.level = this.level;\n return oldNode;\n };\n RowNode.prototype.setDataAndId = function (data, id) {\n var oldNode = exists(this.id) ? this.createDaemonNode() : null;\n var oldData = this.data;\n this.data = data;\n this.updateDataOnDetailNode();\n this.setId(id);\n this.selectionController.syncInRowNode(this, oldNode);\n this.checkRowSelectable();\n var event = this.createDataChangedEvent(data, oldData, false);\n this.dispatchLocalEvent(event);\n };\n RowNode.prototype.checkRowSelectable = function () {\n var isRowSelectableFunc = this.gridOptionsWrapper.getIsRowSelectableFunc();\n var shouldInvokeIsRowSelectable = isRowSelectableFunc && exists(this);\n this.setRowSelectable(shouldInvokeIsRowSelectable ? isRowSelectableFunc(this) : true);\n };\n RowNode.prototype.setRowSelectable = function (newVal) {\n if (this.selectable !== newVal) {\n this.selectable = newVal;\n if (this.eventService) {\n this.eventService.dispatchEvent(this.createLocalRowEvent(RowNode.EVENT_SELECTABLE_CHANGED));\n }\n }\n };\n RowNode.prototype.setId = function (id) {\n // see if user is providing the id's\n var getRowNodeId = this.gridOptionsWrapper.getRowNodeIdFunc();\n if (getRowNodeId) {\n // if user is providing the id's, then we set the id only after the data has been set.\n // this is important for virtual pagination and viewport, where empty rows exist.\n if (this.data) {\n this.id = getRowNodeId(this.data);\n // make sure id provided doesn't start with 'row-group-' as this is reserved. also check that\n // it has 'startsWith' in case the user provided a number.\n if (this.id && this.id.startsWith && this.id.startsWith(RowNode.ID_PREFIX_ROW_GROUP)) {\n console.error(\"AG Grid: Row ID's cannot start with \" + RowNode.ID_PREFIX_ROW_GROUP + \", this is a reserved prefix for AG Grid's row grouping feature.\");\n }\n }\n else {\n // this can happen if user has set blank into the rowNode after the row previously\n // having data. this happens in virtual page row model, when data is delete and\n // the page is refreshed.\n this.id = undefined;\n }\n }\n else {\n this.id = id;\n }\n };\n RowNode.prototype.isPixelInRange = function (pixel) {\n if (!exists(this.rowTop) || !exists(this.rowHeight)) {\n return false;\n }\n return pixel >= this.rowTop && pixel < (this.rowTop + this.rowHeight);\n };\n RowNode.prototype.setFirstChild = function (firstChild) {\n if (this.firstChild === firstChild) {\n return;\n }\n this.firstChild = firstChild;\n if (this.eventService) {\n this.eventService.dispatchEvent(this.createLocalRowEvent(RowNode.EVENT_FIRST_CHILD_CHANGED));\n }\n };\n RowNode.prototype.setLastChild = function (lastChild) {\n if (this.lastChild === lastChild) {\n return;\n }\n this.lastChild = lastChild;\n if (this.eventService) {\n this.eventService.dispatchEvent(this.createLocalRowEvent(RowNode.EVENT_LAST_CHILD_CHANGED));\n }\n };\n RowNode.prototype.setChildIndex = function (childIndex) {\n if (this.childIndex === childIndex) {\n return;\n }\n this.childIndex = childIndex;\n if (this.eventService) {\n this.eventService.dispatchEvent(this.createLocalRowEvent(RowNode.EVENT_CHILD_INDEX_CHANGED));\n }\n };\n RowNode.prototype.setRowTop = function (rowTop) {\n if (this.rowTop === rowTop) {\n return;\n }\n this.rowTop = rowTop;\n if (this.eventService) {\n this.eventService.dispatchEvent(this.createLocalRowEvent(RowNode.EVENT_TOP_CHANGED));\n }\n this.setDisplayed(rowTop !== null);\n };\n RowNode.prototype.clearRowTopAndRowIndex = function () {\n this.oldRowTop = this.rowTop;\n this.setRowTop(null);\n this.setRowIndex(null);\n };\n RowNode.prototype.setDisplayed = function (displayed) {\n if (this.displayed === displayed) {\n return;\n }\n this.displayed = displayed;\n if (this.eventService) {\n this.eventService.dispatchEvent(this.createLocalRowEvent(RowNode.EVENT_DISPLAYED_CHANGED));\n }\n };\n RowNode.prototype.setDragging = function (dragging) {\n if (this.dragging === dragging) {\n return;\n }\n this.dragging = dragging;\n if (this.eventService) {\n this.eventService.dispatchEvent(this.createLocalRowEvent(RowNode.EVENT_DRAGGING_CHANGED));\n }\n };\n RowNode.prototype.setHighlighted = function (highlighted) {\n if (highlighted === this.highlighted) {\n return;\n }\n this.highlighted = highlighted;\n if (this.eventService) {\n this.eventService.dispatchEvent(this.createLocalRowEvent(RowNode.EVENT_HIGHLIGHT_CHANGED));\n }\n };\n RowNode.prototype.setAllChildrenCount = function (allChildrenCount) {\n if (this.allChildrenCount === allChildrenCount) {\n return;\n }\n this.allChildrenCount = allChildrenCount;\n if (this.eventService) {\n this.eventService.dispatchEvent(this.createLocalRowEvent(RowNode.EVENT_ALL_CHILDREN_COUNT_CHANGED));\n }\n };\n RowNode.prototype.setMaster = function (master) {\n if (this.master === master) {\n return;\n }\n // if changing AWAY from master, then unexpand, otherwise\n // next time it's shown it is expanded again\n if (this.master && !master) {\n this.expanded = false;\n }\n this.master = master;\n if (this.eventService) {\n this.eventService.dispatchEvent(this.createLocalRowEvent(RowNode.EVENT_MASTER_CHANGED));\n }\n };\n RowNode.prototype.setRowHeight = function (rowHeight, estimated) {\n if (estimated === void 0) { estimated = false; }\n this.rowHeight = rowHeight;\n this.rowHeightEstimated = estimated;\n if (this.eventService) {\n this.eventService.dispatchEvent(this.createLocalRowEvent(RowNode.EVENT_HEIGHT_CHANGED));\n }\n };\n RowNode.prototype.setRowIndex = function (rowIndex) {\n this.rowIndex = rowIndex;\n if (this.eventService) {\n this.eventService.dispatchEvent(this.createLocalRowEvent(RowNode.EVENT_ROW_INDEX_CHANGED));\n }\n };\n RowNode.prototype.setUiLevel = function (uiLevel) {\n if (this.uiLevel === uiLevel) {\n return;\n }\n this.uiLevel = uiLevel;\n if (this.eventService) {\n this.eventService.dispatchEvent(this.createLocalRowEvent(RowNode.EVENT_UI_LEVEL_CHANGED));\n }\n };\n RowNode.prototype.setExpanded = function (expanded) {\n if (this.expanded === expanded) {\n return;\n }\n this.expanded = expanded;\n if (this.eventService) {\n this.eventService.dispatchEvent(this.createLocalRowEvent(RowNode.EVENT_EXPANDED_CHANGED));\n }\n var event = assign({}, this.createGlobalRowEvent(Events.EVENT_ROW_GROUP_OPENED), {\n expanded: expanded\n });\n this.mainEventService.dispatchEvent(event);\n // when using footers we need to refresh the group row, as the aggregation\n // values jump between group and footer\n if (this.gridOptionsWrapper.isGroupIncludeFooter()) {\n this.rowRenderer.refreshCells({ rowNodes: [this] });\n }\n };\n RowNode.prototype.createGlobalRowEvent = function (type) {\n return {\n type: type,\n node: this,\n data: this.data,\n rowIndex: this.rowIndex,\n rowPinned: this.rowPinned,\n context: this.gridOptionsWrapper.getContext(),\n api: this.gridOptionsWrapper.getApi(),\n columnApi: this.gridOptionsWrapper.getColumnApi()\n };\n };\n RowNode.prototype.dispatchLocalEvent = function (event) {\n if (this.eventService) {\n this.eventService.dispatchEvent(event);\n }\n };\n // we also allow editing the value via the editors. when it is done via\n // the editors, no 'cell changed' event gets fired, as it's assumed that\n // the cell knows about the change given it's in charge of the editing.\n // this method is for the client to call, so the cell listens for the change\n // event, and also flashes the cell when the change occurs.\n RowNode.prototype.setDataValue = function (colKey, newValue) {\n var column = this.columnController.getPrimaryColumn(colKey);\n var oldValue = this.valueService.getValue(column, this);\n this.valueService.setValue(this, column, newValue);\n this.dispatchCellChangedEvent(column, newValue, oldValue);\n };\n RowNode.prototype.setGroupValue = function (colKey, newValue) {\n var column = this.columnController.getGridColumn(colKey);\n if (missing(this.groupData)) {\n this.groupData = {};\n }\n var columnId = column.getColId();\n var oldValue = this.groupData[columnId];\n if (oldValue === newValue) {\n return;\n }\n this.groupData[columnId] = newValue;\n this.dispatchCellChangedEvent(column, newValue, oldValue);\n };\n // sets the data for an aggregation\n RowNode.prototype.setAggData = function (newAggData) {\n var _this = this;\n // find out all keys that could potentially change\n var colIds = getAllKeysInObjects([this.aggData, newAggData]);\n var oldAggData = this.aggData;\n this.aggData = newAggData;\n // if no event service, nobody has registered for events, so no need fire event\n if (this.eventService) {\n colIds.forEach(function (colId) {\n var column = _this.columnController.getGridColumn(colId);\n var value = _this.aggData ? _this.aggData[colId] : undefined;\n var oldValue = oldAggData ? oldAggData[colId] : undefined;\n _this.dispatchCellChangedEvent(column, value, oldValue);\n });\n }\n };\n RowNode.prototype.updateHasChildren = function () {\n // we need to return true when this.group=true, as this is used by server side row model\n // (as children are lazy loaded and stored in a cache anyway). otherwise we return true\n // if children exist.\n var newValue = (this.group && !this.footer) || (this.childrenAfterGroup && this.childrenAfterGroup.length > 0);\n if (newValue !== this.__hasChildren) {\n this.__hasChildren = !!newValue;\n if (this.eventService) {\n this.eventService.dispatchEvent(this.createLocalRowEvent(RowNode.EVENT_HAS_CHILDREN_CHANGED));\n }\n }\n };\n RowNode.prototype.hasChildren = function () {\n if (this.__hasChildren == null) {\n this.updateHasChildren();\n }\n return this.__hasChildren;\n };\n RowNode.prototype.isEmptyRowGroupNode = function () {\n return this.group && missingOrEmpty(this.childrenAfterGroup);\n };\n RowNode.prototype.dispatchCellChangedEvent = function (column, newValue, oldValue) {\n var cellChangedEvent = {\n type: RowNode.EVENT_CELL_CHANGED,\n node: this,\n column: column,\n newValue: newValue,\n oldValue: oldValue\n };\n this.dispatchLocalEvent(cellChangedEvent);\n };\n RowNode.prototype.resetQuickFilterAggregateText = function () {\n this.quickFilterAggregateText = null;\n };\n RowNode.prototype.isExpandable = function () {\n return this.hasChildren() || this.master ? true : false;\n };\n RowNode.prototype.isSelected = function () {\n // for footers, we just return what our sibling selected state is, as cannot select a footer\n if (this.footer) {\n return this.sibling.isSelected();\n }\n return this.selected;\n };\n RowNode.prototype.depthFirstSearch = function (callback) {\n if (this.childrenAfterGroup) {\n this.childrenAfterGroup.forEach(function (child) { return child.depthFirstSearch(callback); });\n }\n callback(this);\n };\n // + rowController.updateGroupsInSelection()\n // + selectionController.calculatedSelectedForAllGroupNodes()\n RowNode.prototype.calculateSelectedFromChildren = function () {\n var atLeastOneSelected = false;\n var atLeastOneDeSelected = false;\n var atLeastOneMixed = false;\n var newSelectedValue;\n if (this.childrenAfterGroup) {\n for (var i = 0; i < this.childrenAfterGroup.length; i++) {\n var child = this.childrenAfterGroup[i];\n // skip non-selectable nodes to prevent inconsistent selection values\n if (!child.selectable) {\n continue;\n }\n var childState = child.isSelected();\n switch (childState) {\n case true:\n atLeastOneSelected = true;\n break;\n case false:\n atLeastOneDeSelected = true;\n break;\n default:\n atLeastOneMixed = true;\n break;\n }\n }\n }\n if (atLeastOneMixed) {\n newSelectedValue = undefined;\n }\n else if (atLeastOneSelected && !atLeastOneDeSelected) {\n newSelectedValue = true;\n }\n else if (!atLeastOneSelected && atLeastOneDeSelected) {\n newSelectedValue = false;\n }\n else {\n newSelectedValue = undefined;\n }\n this.selectThisNode(newSelectedValue);\n };\n RowNode.prototype.setSelectedInitialValue = function (selected) {\n this.selected = selected;\n };\n RowNode.prototype.setSelected = function (newValue, clearSelection, suppressFinishActions) {\n if (clearSelection === void 0) { clearSelection = false; }\n if (suppressFinishActions === void 0) { suppressFinishActions = false; }\n this.setSelectedParams({\n newValue: newValue,\n clearSelection: clearSelection,\n suppressFinishActions: suppressFinishActions,\n rangeSelect: false\n });\n };\n RowNode.prototype.isRowPinned = function () {\n return this.rowPinned === Constants.PINNED_TOP || this.rowPinned === Constants.PINNED_BOTTOM;\n };\n // to make calling code more readable, this is the same method as setSelected except it takes names parameters\n RowNode.prototype.setSelectedParams = function (params) {\n var groupSelectsChildren = this.gridOptionsWrapper.isGroupSelectsChildren();\n var newValue = params.newValue === true;\n var clearSelection = params.clearSelection === true;\n var suppressFinishActions = params.suppressFinishActions === true;\n var rangeSelect = params.rangeSelect === true;\n // groupSelectsFiltered only makes sense when group selects children\n var groupSelectsFiltered = groupSelectsChildren && (params.groupSelectsFiltered === true);\n if (this.id === undefined) {\n console.warn('AG Grid: cannot select node until id for node is known');\n return 0;\n }\n if (this.rowPinned) {\n console.warn('AG Grid: cannot select pinned rows');\n return 0;\n }\n // if we are a footer, we don't do selection, just pass the info\n // to the sibling (the parent of the group)\n if (this.footer) {\n return this.sibling.setSelectedParams(params);\n }\n if (rangeSelect && this.selectionController.getLastSelectedNode()) {\n var newRowClicked = this.selectionController.getLastSelectedNode() !== this;\n var allowMultiSelect = this.gridOptionsWrapper.isRowSelectionMulti();\n if (newRowClicked && allowMultiSelect) {\n var nodesChanged = this.doRowRangeSelection(params.newValue);\n this.selectionController.setLastSelectedNode(this);\n return nodesChanged;\n }\n }\n var updatedCount = 0;\n // when groupSelectsFiltered, then this node may end up intermediate despite\n // trying to set it to true / false. this group will be calculated further on\n // down when we call calculatedSelectedForAllGroupNodes(). we need to skip it\n // here, otherwise the updatedCount would include it.\n var skipThisNode = groupSelectsFiltered && this.group;\n if (!skipThisNode) {\n var thisNodeWasSelected = this.selectThisNode(newValue);\n if (thisNodeWasSelected) {\n updatedCount++;\n }\n }\n if (groupSelectsChildren && this.group) {\n updatedCount += this.selectChildNodes(newValue, groupSelectsFiltered);\n }\n // clear other nodes if not doing multi select\n if (!suppressFinishActions) {\n var clearOtherNodes = newValue && (clearSelection || !this.gridOptionsWrapper.isRowSelectionMulti());\n if (clearOtherNodes) {\n updatedCount += this.selectionController.clearOtherNodes(this);\n }\n // only if we selected something, then update groups and fire events\n if (updatedCount > 0) {\n this.selectionController.updateGroupsFromChildrenSelections();\n // this is the very end of the 'action node', so we are finished all the updates,\n // include any parent / child changes that this method caused\n var event_1 = {\n type: Events.EVENT_SELECTION_CHANGED,\n api: this.gridApi,\n columnApi: this.columnApi\n };\n this.mainEventService.dispatchEvent(event_1);\n }\n // so if user next does shift-select, we know where to start the selection from\n if (newValue) {\n this.selectionController.setLastSelectedNode(this);\n }\n }\n return updatedCount;\n };\n // selects all rows between this node and the last selected node (or the top if this is the first selection).\n // not to be mixed up with 'cell range selection' where you drag the mouse, this is row range selection, by\n // holding down 'shift'.\n RowNode.prototype.doRowRangeSelection = function (value) {\n var _this = this;\n if (value === void 0) { value = true; }\n var groupsSelectChildren = this.gridOptionsWrapper.isGroupSelectsChildren();\n var lastSelectedNode = this.selectionController.getLastSelectedNode();\n var nodesToSelect = this.rowModel.getNodesInRangeForSelection(this, lastSelectedNode);\n var updatedCount = 0;\n nodesToSelect.forEach(function (rowNode) {\n if (rowNode.group && groupsSelectChildren || (value === false && _this === rowNode)) {\n return;\n }\n var nodeWasSelected = rowNode.selectThisNode(value);\n if (nodeWasSelected) {\n updatedCount++;\n }\n });\n this.selectionController.updateGroupsFromChildrenSelections();\n var event = {\n type: Events.EVENT_SELECTION_CHANGED,\n api: this.gridApi,\n columnApi: this.columnApi\n };\n this.mainEventService.dispatchEvent(event);\n return updatedCount;\n };\n RowNode.prototype.isParentOfNode = function (potentialParent) {\n var parentNode = this.parent;\n while (parentNode) {\n if (parentNode === potentialParent) {\n return true;\n }\n parentNode = parentNode.parent;\n }\n return false;\n };\n RowNode.prototype.selectThisNode = function (newValue) {\n // we only check selectable when newValue=true (ie selecting) to allow unselecting values,\n // as selectable is dynamic, need a way to unselect rows when selectable becomes false.\n var selectionNotAllowed = !this.selectable && newValue;\n var selectionNotChanged = this.selected === newValue;\n if (selectionNotAllowed || selectionNotChanged) {\n return false;\n }\n this.selected = newValue;\n if (this.eventService) {\n this.dispatchLocalEvent(this.createLocalRowEvent(RowNode.EVENT_ROW_SELECTED));\n }\n var event = this.createGlobalRowEvent(Events.EVENT_ROW_SELECTED);\n this.mainEventService.dispatchEvent(event);\n return true;\n };\n RowNode.prototype.selectChildNodes = function (newValue, groupSelectsFiltered) {\n var children = groupSelectsFiltered ? this.childrenAfterFilter : this.childrenAfterGroup;\n if (missing(children)) {\n return 0;\n }\n var updatedCount = 0;\n for (var i = 0; i < children.length; i++) {\n updatedCount += children[i].setSelectedParams({\n newValue: newValue,\n clearSelection: false,\n suppressFinishActions: true,\n groupSelectsFiltered: groupSelectsFiltered\n });\n }\n return updatedCount;\n };\n RowNode.prototype.addEventListener = function (eventType, listener) {\n if (!this.eventService) {\n this.eventService = new EventService();\n }\n this.eventService.addEventListener(eventType, listener);\n };\n RowNode.prototype.removeEventListener = function (eventType, listener) {\n this.eventService.removeEventListener(eventType, listener);\n };\n RowNode.prototype.onMouseEnter = function () {\n this.dispatchLocalEvent(this.createLocalRowEvent(RowNode.EVENT_MOUSE_ENTER));\n };\n RowNode.prototype.onMouseLeave = function () {\n this.dispatchLocalEvent(this.createLocalRowEvent(RowNode.EVENT_MOUSE_LEAVE));\n };\n RowNode.prototype.getFirstChildOfFirstChild = function (rowGroupColumn) {\n var currentRowNode = this;\n var isCandidate = true;\n var foundFirstChildPath = false;\n var nodeToSwapIn = null;\n // if we are hiding groups, then if we are the first child, of the first child,\n // all the way up to the column we are interested in, then we show the group cell.\n while (isCandidate && !foundFirstChildPath) {\n var parentRowNode = currentRowNode.parent;\n var firstChild = exists(parentRowNode) && currentRowNode.firstChild;\n if (firstChild) {\n if (parentRowNode.rowGroupColumn === rowGroupColumn) {\n foundFirstChildPath = true;\n nodeToSwapIn = parentRowNode;\n }\n }\n else {\n isCandidate = false;\n }\n currentRowNode = parentRowNode;\n }\n return foundFirstChildPath ? nodeToSwapIn : null;\n };\n RowNode.prototype.isFullWidthCell = function () {\n var isFullWidthCellFunc = this.gridOptionsWrapper.getIsFullWidthCellFunc();\n return isFullWidthCellFunc ? isFullWidthCellFunc(this) : false;\n };\n RowNode.prototype.getRoute = function () {\n if (this.key == null) {\n return;\n }\n var res = [];\n var pointer = this;\n while (pointer.key != null) {\n res.push(pointer.key);\n pointer = pointer.parent;\n }\n return res.reverse();\n };\n RowNode.ID_PREFIX_ROW_GROUP = 'row-group-';\n RowNode.ID_PREFIX_TOP_PINNED = 't-';\n RowNode.ID_PREFIX_BOTTOM_PINNED = 'b-';\n RowNode.OBJECT_ID_SEQUENCE = 0;\n RowNode.EVENT_ROW_SELECTED = 'rowSelected';\n RowNode.EVENT_DATA_CHANGED = 'dataChanged';\n RowNode.EVENT_CELL_CHANGED = 'cellChanged';\n RowNode.EVENT_ALL_CHILDREN_COUNT_CHANGED = 'allChildrenCountChanged';\n RowNode.EVENT_MASTER_CHANGED = 'masterChanged';\n RowNode.EVENT_MOUSE_ENTER = 'mouseEnter';\n RowNode.EVENT_MOUSE_LEAVE = 'mouseLeave';\n RowNode.EVENT_HEIGHT_CHANGED = 'heightChanged';\n RowNode.EVENT_TOP_CHANGED = 'topChanged';\n RowNode.EVENT_DISPLAYED_CHANGED = 'displayedChanged';\n RowNode.EVENT_FIRST_CHILD_CHANGED = 'firstChildChanged';\n RowNode.EVENT_LAST_CHILD_CHANGED = 'lastChildChanged';\n RowNode.EVENT_CHILD_INDEX_CHANGED = 'childIndexChanged';\n RowNode.EVENT_ROW_INDEX_CHANGED = 'rowIndexChanged';\n RowNode.EVENT_EXPANDED_CHANGED = 'expandedChanged';\n RowNode.EVENT_HAS_CHILDREN_CHANGED = 'hasChildrenChanged';\n RowNode.EVENT_SELECTABLE_CHANGED = 'selectableChanged';\n RowNode.EVENT_UI_LEVEL_CHANGED = 'uiLevelChanged';\n RowNode.EVENT_HIGHLIGHT_CHANGED = 'rowHighlightChanged';\n RowNode.EVENT_DRAGGING_CHANGED = 'draggingChanged';\n __decorate$h([\n Autowired('eventService')\n ], RowNode.prototype, \"mainEventService\", void 0);\n __decorate$h([\n Autowired('rowRenderer')\n ], RowNode.prototype, \"rowRenderer\", void 0);\n __decorate$h([\n Autowired('gridOptionsWrapper')\n ], RowNode.prototype, \"gridOptionsWrapper\", void 0);\n __decorate$h([\n Autowired('selectionController')\n ], RowNode.prototype, \"selectionController\", void 0);\n __decorate$h([\n Autowired('columnController')\n ], RowNode.prototype, \"columnController\", void 0);\n __decorate$h([\n Autowired('valueService')\n ], RowNode.prototype, \"valueService\", void 0);\n __decorate$h([\n Autowired('rowModel')\n ], RowNode.prototype, \"rowModel\", void 0);\n __decorate$h([\n Autowired('context')\n ], RowNode.prototype, \"context\", void 0);\n __decorate$h([\n Autowired('valueCache')\n ], RowNode.prototype, \"valueCache\", void 0);\n __decorate$h([\n Autowired('columnApi')\n ], RowNode.prototype, \"columnApi\", void 0);\n __decorate$h([\n Autowired('gridApi')\n ], RowNode.prototype, \"gridApi\", void 0);\n return RowNode;\n}());\n\n/**\n * @ag-grid-community/core - Advanced Data Grid / Data Table supporting Javascript / React / AngularJS / Web Components\n * @version v25.1.0\n * @link http://www.ag-grid.com/\n * @license MIT\n */\nvar __extends$f = (undefined && undefined.__extends) || (function () {\n var extendStatics = function (d, b) {\n extendStatics = Object.setPrototypeOf ||\n ({ __proto__: [] } instanceof Array && function (d, b) { d.__proto__ = b; }) ||\n function (d, b) { for (var p in b) if (b.hasOwnProperty(p)) d[p] = b[p]; };\n return extendStatics(d, b);\n };\n return function (d, b) {\n extendStatics(d, b);\n function __() { this.constructor = d; }\n d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __());\n };\n})();\nvar __decorate$i = (undefined && undefined.__decorate) || function (decorators, target, key, desc) {\n var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d;\n if (typeof Reflect === \"object\" && typeof Reflect.decorate === \"function\") r = Reflect.decorate(decorators, target, key, desc);\n else for (var i = decorators.length - 1; i >= 0; i--) if (d = decorators[i]) r = (c < 3 ? d(r) : c > 3 ? d(target, key, r) : d(target, key)) || r;\n return c > 3 && r && Object.defineProperty(target, key, r), r;\n};\nvar CheckboxSelectionComponent = /** @class */ (function (_super) {\n __extends$f(CheckboxSelectionComponent, _super);\n function CheckboxSelectionComponent() {\n return _super.call(this, /* html*/ \"\\n
\\n \\n
\") || this;\n }\n CheckboxSelectionComponent.prototype.postConstruct = function () {\n this.eCheckbox.setPassive(true);\n };\n CheckboxSelectionComponent.prototype.getCheckboxId = function () {\n return this.eCheckbox.getInputElement().id;\n };\n CheckboxSelectionComponent.prototype.onDataChanged = function () {\n // when rows are loaded for the second time, this can impact the selection, as a row\n // could be loaded as already selected (if user scrolls down, and then up again).\n this.onSelectionChanged();\n };\n CheckboxSelectionComponent.prototype.onSelectableChanged = function () {\n this.showOrHideSelect();\n };\n CheckboxSelectionComponent.prototype.onSelectionChanged = function () {\n var translate = this.gridOptionsWrapper.getLocaleTextFunc();\n var state = this.rowNode.isSelected();\n var stateName = state === undefined\n ? translate('ariaIndeterminate', 'indeterminate')\n : (state === true\n ? translate('ariaChecked', 'checked')\n : translate('ariaUnchecked', 'unchecked'));\n var ariaLabel = translate('ariaRowToggleSelection', 'Press Space to toggle row selection');\n this.eCheckbox.setValue(state, true);\n this.eCheckbox.setInputAriaLabel(ariaLabel + \" (\" + stateName + \")\");\n };\n CheckboxSelectionComponent.prototype.onCheckedClicked = function (event) {\n var groupSelectsFiltered = this.gridOptionsWrapper.isGroupSelectsFiltered();\n var updatedCount = this.rowNode.setSelectedParams({ newValue: false, rangeSelect: event.shiftKey, groupSelectsFiltered: groupSelectsFiltered });\n return updatedCount;\n };\n CheckboxSelectionComponent.prototype.onUncheckedClicked = function (event) {\n var groupSelectsFiltered = this.gridOptionsWrapper.isGroupSelectsFiltered();\n var updatedCount = this.rowNode.setSelectedParams({ newValue: true, rangeSelect: event.shiftKey, groupSelectsFiltered: groupSelectsFiltered });\n return updatedCount;\n };\n CheckboxSelectionComponent.prototype.init = function (params) {\n var _this = this;\n this.rowNode = params.rowNode;\n this.column = params.column;\n this.onSelectionChanged();\n // we don't want the row clicked event to fire when selecting the checkbox, otherwise the row\n // would possibly get selected twice\n this.addGuiEventListener('click', function (event) { return stopPropagationForAgGrid(event); });\n // likewise we don't want double click on this icon to open a group\n this.addGuiEventListener('dblclick', function (event) { return stopPropagationForAgGrid(event); });\n this.addManagedListener(this.eCheckbox.getInputElement(), 'click', function (event) {\n var isSelected = _this.eCheckbox.getValue();\n var previousValue = _this.eCheckbox.getPreviousValue();\n if (previousValue === undefined) { // indeterminate\n var result = _this.onUncheckedClicked(event || {});\n if (result === 0) {\n _this.onCheckedClicked(event);\n }\n }\n else if (isSelected) {\n _this.onCheckedClicked(event);\n }\n else {\n _this.onUncheckedClicked(event || {});\n }\n });\n this.addManagedListener(this.rowNode, RowNode.EVENT_ROW_SELECTED, this.onSelectionChanged.bind(this));\n this.addManagedListener(this.rowNode, RowNode.EVENT_DATA_CHANGED, this.onDataChanged.bind(this));\n this.addManagedListener(this.rowNode, RowNode.EVENT_SELECTABLE_CHANGED, this.onSelectableChanged.bind(this));\n this.isRowSelectableFunc = this.gridOptionsWrapper.getIsRowSelectableFunc();\n var checkboxVisibleIsDynamic = this.isRowSelectableFunc || this.checkboxCallbackExists();\n if (checkboxVisibleIsDynamic) {\n this.addManagedListener(this.eventService, Events.EVENT_DISPLAYED_COLUMNS_CHANGED, this.showOrHideSelect.bind(this));\n this.showOrHideSelect();\n }\n this.eCheckbox.getInputElement().setAttribute('tabindex', '-1');\n };\n CheckboxSelectionComponent.prototype.showOrHideSelect = function () {\n // if the isRowSelectable() is not provided the row node is selectable by default\n var selectable = this.rowNode.selectable;\n // checkboxSelection callback is deemed a legacy solution however we will still consider it's result.\n // If selectable, then also check the colDef callback. if not selectable, this it short circuits - no need\n // to call the colDef callback.\n if (selectable && this.checkboxCallbackExists()) {\n selectable = this.column.isCellCheckboxSelection(this.rowNode);\n }\n // show checkbox if both conditions are true\n this.setDisplayed(selectable);\n };\n CheckboxSelectionComponent.prototype.checkboxCallbackExists = function () {\n // column will be missing if groupUseEntireRow=true\n var colDef = this.column ? this.column.getColDef() : null;\n return !!colDef && typeof colDef.checkboxSelection === 'function';\n };\n __decorate$i([\n RefSelector('eCheckbox')\n ], CheckboxSelectionComponent.prototype, \"eCheckbox\", void 0);\n __decorate$i([\n PostConstruct\n ], CheckboxSelectionComponent.prototype, \"postConstruct\", null);\n return CheckboxSelectionComponent;\n}(Component));\n\n/**\n * @ag-grid-community/core - Advanced Data Grid / Data Table supporting Javascript / React / AngularJS / Web Components\n * @version v25.1.0\n * @link http://www.ag-grid.com/\n * @license MIT\n */\nvar DateComponent = {\n propertyName: 'dateComponent',\n isCellRenderer: function () { return false; }\n};\nvar HeaderComponent = {\n propertyName: 'headerComponent',\n isCellRenderer: function () { return false; },\n};\nvar HeaderGroupComponent = {\n propertyName: 'headerGroupComponent',\n isCellRenderer: function () { return false; },\n};\nvar CellRendererComponent = {\n propertyName: 'cellRenderer',\n isCellRenderer: function () { return true; },\n};\nvar PinnedRowCellRendererComponent = {\n propertyName: 'pinnedRowCellRenderer',\n isCellRenderer: function () { return true; },\n};\nvar CellEditorComponent = {\n propertyName: 'cellEditor',\n isCellRenderer: function () { return false; },\n};\nvar InnerRendererComponent = {\n propertyName: 'innerRenderer',\n isCellRenderer: function () { return true; },\n};\nvar LoadingOverlayComponent = {\n propertyName: 'loadingOverlayComponent',\n isCellRenderer: function () { return false; },\n};\nvar NoRowsOverlayComponent = {\n propertyName: 'noRowsOverlayComponent',\n isCellRenderer: function () { return false; },\n};\nvar TooltipComponent = {\n propertyName: 'tooltipComponent',\n isCellRenderer: function () { return false; },\n};\nvar FilterComponent = {\n propertyName: 'filter',\n isCellRenderer: function () { return false; },\n};\nvar FloatingFilterComponent = {\n propertyName: 'floatingFilterComponent',\n isCellRenderer: function () { return false; },\n};\nvar ToolPanelComponent = {\n propertyName: 'toolPanel',\n isCellRenderer: function () { return false; },\n};\nvar StatusPanelComponent = {\n propertyName: 'statusPanel',\n isCellRenderer: function () { return false; },\n};\n\n/**\n * @ag-grid-community/core - Advanced Data Grid / Data Table supporting Javascript / React / AngularJS / Web Components\n * @version v25.1.0\n * @link http://www.ag-grid.com/\n * @license MIT\n */\nvar __extends$g = (undefined && undefined.__extends) || (function () {\n var extendStatics = function (d, b) {\n extendStatics = Object.setPrototypeOf ||\n ({ __proto__: [] } instanceof Array && function (d, b) { d.__proto__ = b; }) ||\n function (d, b) { for (var p in b) if (b.hasOwnProperty(p)) d[p] = b[p]; };\n return extendStatics(d, b);\n };\n return function (d, b) {\n extendStatics(d, b);\n function __() { this.constructor = d; }\n d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __());\n };\n})();\nvar __decorate$j = (undefined && undefined.__decorate) || function (decorators, target, key, desc) {\n var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d;\n if (typeof Reflect === \"object\" && typeof Reflect.decorate === \"function\") r = Reflect.decorate(decorators, target, key, desc);\n else for (var i = decorators.length - 1; i >= 0; i--) if (d = decorators[i]) r = (c < 3 ? d(r) : c > 3 ? d(target, key, r) : d(target, key)) || r;\n return c > 3 && r && Object.defineProperty(target, key, r), r;\n};\nvar ComponentSource;\n(function (ComponentSource) {\n ComponentSource[ComponentSource[\"DEFAULT\"] = 0] = \"DEFAULT\";\n ComponentSource[ComponentSource[\"REGISTERED_BY_NAME\"] = 1] = \"REGISTERED_BY_NAME\";\n ComponentSource[ComponentSource[\"HARDCODED\"] = 2] = \"HARDCODED\";\n})(ComponentSource || (ComponentSource = {}));\nvar UserComponentFactory = /** @class */ (function (_super) {\n __extends$g(UserComponentFactory, _super);\n function UserComponentFactory() {\n return _super !== null && _super.apply(this, arguments) || this;\n }\n UserComponentFactory.prototype.newDateComponent = function (params) {\n return this.createAndInitUserComponent(this.gridOptions, params, DateComponent, 'agDateInput');\n };\n UserComponentFactory.prototype.newHeaderComponent = function (params) {\n return this.createAndInitUserComponent(params.column.getColDef(), params, HeaderComponent, 'agColumnHeader');\n };\n UserComponentFactory.prototype.newHeaderGroupComponent = function (params) {\n return this.createAndInitUserComponent(params.columnGroup.getColGroupDef(), params, HeaderGroupComponent, 'agColumnGroupHeader');\n };\n UserComponentFactory.prototype.newFullWidthGroupRowInnerCellRenderer = function (params) {\n return this.createAndInitUserComponent(this.gridOptions.groupRowRendererParams, params, InnerRendererComponent, null, true);\n };\n // this one is unusual, as it can be LoadingCellRenderer, DetailCellRenderer, FullWidthCellRenderer or GroupRowRenderer.\n // so we have to pass the type in.\n UserComponentFactory.prototype.newFullWidthCellRenderer = function (params, cellRendererType, cellRendererName) {\n return this.createAndInitUserComponent(null, params, { propertyName: cellRendererType, isCellRenderer: function () { return true; } }, cellRendererName);\n };\n UserComponentFactory.prototype.newCellRenderer = function (target, params, isPinned) {\n if (isPinned === void 0) { isPinned = false; }\n return this.createAndInitUserComponent(target, params, isPinned ? PinnedRowCellRendererComponent : CellRendererComponent, null, true);\n };\n UserComponentFactory.prototype.newCellEditor = function (colDef, params) {\n return this.createAndInitUserComponent(colDef, params, CellEditorComponent, 'agCellEditor');\n };\n UserComponentFactory.prototype.newInnerCellRenderer = function (target, params) {\n return this.createAndInitUserComponent(target, params, InnerRendererComponent, null);\n };\n UserComponentFactory.prototype.newLoadingOverlayComponent = function (params) {\n return this.createAndInitUserComponent(this.gridOptions, params, LoadingOverlayComponent, 'agLoadingOverlay');\n };\n UserComponentFactory.prototype.newNoRowsOverlayComponent = function (params) {\n return this.createAndInitUserComponent(this.gridOptions, params, NoRowsOverlayComponent, 'agNoRowsOverlay');\n };\n UserComponentFactory.prototype.newTooltipComponent = function (params) {\n return this.createAndInitUserComponent(params.colDef, params, TooltipComponent, 'agTooltipComponent');\n };\n UserComponentFactory.prototype.newFilterComponent = function (def, params, defaultFilter) {\n return this.createAndInitUserComponent(def, params, FilterComponent, defaultFilter, false);\n };\n UserComponentFactory.prototype.newSetFilterCellRenderer = function (target, params) {\n return this.createAndInitUserComponent(target, params, CellRendererComponent, null, true);\n };\n UserComponentFactory.prototype.newFloatingFilterComponent = function (def, params, defaultFloatingFilter) {\n return this.createAndInitUserComponent(def, params, FloatingFilterComponent, defaultFloatingFilter, true);\n };\n UserComponentFactory.prototype.newToolPanelComponent = function (toolPanelDef, params) {\n return this.createAndInitUserComponent(toolPanelDef, params, ToolPanelComponent);\n };\n UserComponentFactory.prototype.newStatusPanelComponent = function (def, params) {\n return this.createAndInitUserComponent(def, params, StatusPanelComponent);\n };\n /**\n * This method creates a component given everything needed to guess what sort of component needs to be instantiated\n * It takes\n * @param definitionObject: This is the context for which this component needs to be created, it can be gridOptions\n * (global) or columnDef mostly.\n * @param paramsFromGrid: Params to be passed to the component and passed by AG Grid. This will get merged with any params\n * specified by the user in the configuration\n * @param propertyName: The name of the property used in ag-grid as a convention to refer to the component, it can be:\n * 'floatingFilter', 'cellRenderer', is used to find if the user is specifying a custom component\n * @param defaultComponentName: The actual name of the component to instantiate, this is usually the same as propertyName, but in\n * some cases is not, like floatingFilter, if it is the same is not necessary to specify\n * @param optional: Handy method to tell if this should return a component ALWAYS. if that is the case, but there is no\n * component found, it throws an error, by default all components are MANDATORY\n */\n UserComponentFactory.prototype.createAndInitUserComponent = function (definitionObject, paramsFromGrid, componentType, defaultComponentName, \n // optional items are: FloatingFilter, CellComp (for cellRenderer)\n optional) {\n if (optional === void 0) { optional = false; }\n if (!definitionObject) {\n definitionObject = this.gridOptions;\n }\n // Create the component instance\n var componentAndParams = this.createComponentInstance(definitionObject, componentType, paramsFromGrid, defaultComponentName, optional);\n if (!componentAndParams) {\n return null;\n }\n var componentInstance = componentAndParams.componentInstance;\n // Wire the component and call the init method with the correct params\n var params = this.createFinalParams(definitionObject, componentType.propertyName, paramsFromGrid, componentAndParams.paramsFromSelector);\n this.addReactHacks(params);\n var deferredInit = this.initComponent(componentInstance, params);\n if (deferredInit == null) {\n return AgPromise.resolve(componentInstance);\n }\n return deferredInit.then(function () { return componentInstance; });\n };\n UserComponentFactory.prototype.addReactHacks = function (params) {\n // a temporary fix for AG-1574\n // AG-1715 raised to do a wider ranging refactor to improve this\n var agGridReact = this.context.getBean('agGridReact');\n if (agGridReact) {\n params.agGridReact = cloneObject(agGridReact);\n }\n // AG-1716 - directly related to AG-1574 and AG-1715\n var frameworkComponentWrapper = this.context.getBean('frameworkComponentWrapper');\n if (frameworkComponentWrapper) {\n params.frameworkComponentWrapper = frameworkComponentWrapper;\n }\n };\n /**\n * This method creates a component given everything needed to guess what sort of component needs to be instantiated\n * It takes\n * @param clazz: The class to instantiate,\n * @param agGridParams: Params to be passed to the component and passed by AG Grid. This will get merged with any params\n * specified by the user in the configuration\n * @param modifyParamsCallback: A chance to customise the params passed to the init method. It receives what the current\n * params are and the component that init is about to get called for\n */\n UserComponentFactory.prototype.createUserComponentFromConcreteClass = function (clazz, agGridParams) {\n var internalComponent = new clazz();\n this.initComponent(internalComponent, agGridParams);\n return internalComponent;\n };\n /**\n * This method returns the underlying representation of the component to be created. ie for Javascript the\n * underlying function where we should be calling new into. In case of the frameworks, the framework class\n * object that represents the component to be created.\n *\n * This method is handy for different reasons, for example if you want to check if a component has a particular\n * method implemented without having to create the component, just by inspecting the source component\n *\n * It takes\n * @param definitionObject: This is the context for which this component needs to be created, it can be gridOptions\n * (global) or columnDef mostly.\n * @param propertyName: The name of the property used in ag-grid as a convention to refer to the component, it can be:\n * 'floatingFilter', 'cellRenderer', is used to find if the user is specifying a custom component\n * @param params: Params to be passed to the dynamic component function in case it needs to be\n * invoked\n * @param defaultComponentName: The name of the component to load if there is no component specified\n */\n UserComponentFactory.prototype.lookupComponentClassDef = function (definitionObject, propertyName, params, defaultComponentName) {\n if (params === void 0) { params = null; }\n /**\n * There are five things that can happen when resolving a component.\n * a) HardcodedFwComponent: That holder[propertyName]Framework has associated a Framework native component\n * b) HardcodedJsComponent: That holder[propertyName] has associate a JS component\n * c) hardcodedJsFunction: That holder[propertyName] has associate a JS function\n * d) hardcodedNameComponent: That holder[propertyName] has associate a string that represents a component to load\n * e) That none of the three previous are specified, then we need to use the DefaultRegisteredComponent\n */\n var hardcodedNameComponent = null;\n var HardcodedJsComponent = null;\n var hardcodedJsFunction = null;\n var HardcodedFwComponent = null;\n var componentSelectorFunc = null;\n if (definitionObject != null) {\n var componentPropertyValue = definitionObject[propertyName];\n // for filters only, we allow 'true' for the component, which means default filter to be used\n var usingDefaultComponent = componentPropertyValue === true;\n if (componentPropertyValue != null && !usingDefaultComponent) {\n if (typeof componentPropertyValue === 'string') {\n hardcodedNameComponent = componentPropertyValue;\n }\n else if (typeof componentPropertyValue === 'boolean') ;\n else if (this.agComponentUtils.doesImplementIComponent(componentPropertyValue)) {\n HardcodedJsComponent = componentPropertyValue;\n }\n else {\n hardcodedJsFunction = componentPropertyValue;\n }\n }\n HardcodedFwComponent = definitionObject[propertyName + \"Framework\"];\n componentSelectorFunc = definitionObject[propertyName + \"Selector\"];\n }\n /**\n * Since we allow many types of flavors for specifying the components, let's make sure this is not an illegal\n * combination\n */\n if ((HardcodedJsComponent && HardcodedFwComponent) ||\n (hardcodedNameComponent && HardcodedFwComponent) ||\n (hardcodedJsFunction && HardcodedFwComponent)) {\n throw Error(\"ag-grid: you are trying to specify: \" + propertyName + \" twice as a component.\");\n }\n if (HardcodedFwComponent && !this.frameworkComponentWrapper) {\n throw Error(\"ag-grid: you are specifying a framework component but you are not using a framework version of ag-grid for : \" + propertyName);\n }\n if (componentSelectorFunc && (hardcodedNameComponent || HardcodedJsComponent || hardcodedJsFunction || HardcodedFwComponent)) {\n throw Error(\"ag-grid: you can't specify both, the selector and the component of ag-grid for : \" + propertyName);\n }\n /**\n * At this stage we are guaranteed to either have,\n * DEPRECATED\n * - A unique HardcodedFwComponent\n * - A unique HardcodedJsComponent\n * - A unique hardcodedJsFunction\n * BY NAME- FAVOURED APPROACH\n * - A unique hardcodedNameComponent\n * - None of the previous, hence we revert to: RegisteredComponent\n */\n if (HardcodedFwComponent) {\n // console.warn(`ag-grid: Since version 12.1.0 specifying a component directly is deprecated, you should register the component by name`);\n // console.warn(`${HardcodedFwComponent}`);\n return {\n componentFromFramework: true,\n component: HardcodedFwComponent,\n source: ComponentSource.HARDCODED,\n paramsFromSelector: null\n };\n }\n if (HardcodedJsComponent) {\n // console.warn(`ag-grid: Since version 12.1.0 specifying a component directly is deprecated, you should register the component by name`);\n // console.warn(`${HardcodedJsComponent}`);\n return {\n componentFromFramework: false,\n component: HardcodedJsComponent,\n source: ComponentSource.HARDCODED,\n paramsFromSelector: null\n };\n }\n if (hardcodedJsFunction) {\n // console.warn(`ag-grid: Since version 12.1.0 specifying a function directly is deprecated, you should register the component by name`);\n // console.warn(`${hardcodedJsFunction}`);\n return this.agComponentUtils.adaptFunction(propertyName, hardcodedJsFunction, false, ComponentSource.HARDCODED);\n }\n var selectorResult = componentSelectorFunc ? componentSelectorFunc(params) : null;\n var componentNameToUse;\n if (selectorResult && selectorResult.component) {\n componentNameToUse = selectorResult.component;\n }\n else if (hardcodedNameComponent) {\n componentNameToUse = hardcodedNameComponent;\n }\n else {\n componentNameToUse = defaultComponentName;\n }\n if (!componentNameToUse) {\n return null;\n }\n var registeredCompClassDef = this.lookupFromRegisteredComponents(propertyName, componentNameToUse);\n if (!registeredCompClassDef) {\n return null;\n }\n return {\n componentFromFramework: registeredCompClassDef.componentFromFramework,\n component: registeredCompClassDef.component,\n source: registeredCompClassDef.source,\n paramsFromSelector: selectorResult ? selectorResult.params : null\n };\n };\n UserComponentFactory.prototype.lookupFromRegisteredComponents = function (propertyName, componentNameOpt) {\n var componentName = componentNameOpt != null ? componentNameOpt : propertyName;\n var registeredComponent = this.userComponentRegistry.retrieve(componentName);\n if (registeredComponent == null) {\n return null;\n }\n //If it is a FW it has to be registered as a component\n if (registeredComponent.componentFromFramework) {\n return {\n component: registeredComponent.component,\n componentFromFramework: true,\n source: ComponentSource.REGISTERED_BY_NAME,\n paramsFromSelector: null\n };\n }\n //If it is JS it may be a function or a component\n if (this.agComponentUtils.doesImplementIComponent(registeredComponent.component)) {\n return {\n component: registeredComponent.component,\n componentFromFramework: false,\n source: (registeredComponent.source == RegisteredComponentSource.REGISTERED) ? ComponentSource.REGISTERED_BY_NAME : ComponentSource.DEFAULT,\n paramsFromSelector: null\n };\n }\n // This is a function\n return this.agComponentUtils.adaptFunction(propertyName, registeredComponent.component, registeredComponent.componentFromFramework, (registeredComponent.source == RegisteredComponentSource.REGISTERED) ? ComponentSource.REGISTERED_BY_NAME : ComponentSource.DEFAULT);\n };\n /**\n * Useful to check what would be the resultant params for a given object\n * @param definitionObject: This is the context for which this component needs to be created, it can be gridOptions\n * (global) or columnDef mostly.\n * @param propertyName: The name of the property used in ag-grid as a convention to refer to the component, it can be:\n * 'floatingFilter', 'cellRenderer', is used to find if the user is specifying a custom component\n * @param paramsFromGrid: Params to be passed to the component and passed by AG Grid. This will get merged with any params\n * specified by the user in the configuration\n * @returns {TParams} It merges the user agGridParams with the actual params specified by the user.\n */\n UserComponentFactory.prototype.createFinalParams = function (definitionObject, propertyName, paramsFromGrid, paramsFromSelector) {\n if (paramsFromSelector === void 0) { paramsFromSelector = null; }\n var params = {};\n mergeDeep(params, paramsFromGrid);\n var userParams = definitionObject ? definitionObject[propertyName + \"Params\"] : null;\n if (userParams != null) {\n if (typeof userParams === 'function') {\n var userParamsFromFunc = userParams(paramsFromGrid);\n mergeDeep(params, userParamsFromFunc);\n }\n else if (typeof userParams === 'object') {\n mergeDeep(params, userParams);\n }\n }\n mergeDeep(params, paramsFromSelector);\n return params;\n };\n UserComponentFactory.prototype.createComponentInstance = function (holder, componentType, paramsForSelector, defaultComponentName, optional) {\n var propertyName = componentType.propertyName;\n var componentToUse = this.lookupComponentClassDef(holder, propertyName, paramsForSelector, defaultComponentName);\n var missing = !componentToUse || !componentToUse.component;\n if (missing) {\n // to help the user, we print out the name they are looking for, rather than the default name.\n // i don't know why the default name was originally printed out (that doesn't help the user)\n var overrideName = holder ? holder[propertyName] : defaultComponentName;\n var nameToReport = overrideName ? overrideName : defaultComponentName;\n if (!optional) {\n console.error(\"Could not find component \" + nameToReport + \", did you forget to configure this component?\");\n }\n return null;\n }\n var componentInstance;\n if (componentToUse.componentFromFramework) {\n // Using framework component\n var FrameworkComponentRaw = componentToUse.component;\n var thisComponentConfig = this.componentMetadataProvider.retrieve(propertyName);\n componentInstance = this.frameworkComponentWrapper.wrap(FrameworkComponentRaw, thisComponentConfig.mandatoryMethodList, thisComponentConfig.optionalMethodList, componentType, defaultComponentName);\n }\n else {\n // Using plain JavaScript component\n componentInstance = new componentToUse.component();\n }\n return { componentInstance: componentInstance, paramsFromSelector: componentToUse.paramsFromSelector };\n };\n UserComponentFactory.prototype.initComponent = function (component, params) {\n this.context.createBean(component);\n if (component.init == null) {\n return;\n }\n return component.init(params);\n };\n __decorate$j([\n Autowired('gridOptions')\n ], UserComponentFactory.prototype, \"gridOptions\", void 0);\n __decorate$j([\n Autowired('agComponentUtils')\n ], UserComponentFactory.prototype, \"agComponentUtils\", void 0);\n __decorate$j([\n Autowired('componentMetadataProvider')\n ], UserComponentFactory.prototype, \"componentMetadataProvider\", void 0);\n __decorate$j([\n Autowired('userComponentRegistry')\n ], UserComponentFactory.prototype, \"userComponentRegistry\", void 0);\n __decorate$j([\n Optional('frameworkComponentWrapper')\n ], UserComponentFactory.prototype, \"frameworkComponentWrapper\", void 0);\n UserComponentFactory = __decorate$j([\n Bean('userComponentFactory')\n ], UserComponentFactory);\n return UserComponentFactory;\n}(BeanStub));\n\n/**\n * @ag-grid-community/core - Advanced Data Grid / Data Table supporting Javascript / React / AngularJS / Web Components\n * @version v25.1.0\n * @link http://www.ag-grid.com/\n * @license MIT\n */\nvar __extends$h = (undefined && undefined.__extends) || (function () {\n var extendStatics = function (d, b) {\n extendStatics = Object.setPrototypeOf ||\n ({ __proto__: [] } instanceof Array && function (d, b) { d.__proto__ = b; }) ||\n function (d, b) { for (var p in b) if (b.hasOwnProperty(p)) d[p] = b[p]; };\n return extendStatics(d, b);\n };\n return function (d, b) {\n extendStatics(d, b);\n function __() { this.constructor = d; }\n d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __());\n };\n})();\nvar __decorate$k = (undefined && undefined.__decorate) || function (decorators, target, key, desc) {\n var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d;\n if (typeof Reflect === \"object\" && typeof Reflect.decorate === \"function\") r = Reflect.decorate(decorators, target, key, desc);\n else for (var i = decorators.length - 1; i >= 0; i--) if (d = decorators[i]) r = (c < 3 ? d(r) : c > 3 ? d(target, key, r) : d(target, key)) || r;\n return c > 3 && r && Object.defineProperty(target, key, r), r;\n};\nvar GroupCellRenderer = /** @class */ (function (_super) {\n __extends$h(GroupCellRenderer, _super);\n function GroupCellRenderer() {\n return _super.call(this, GroupCellRenderer.TEMPLATE) || this;\n }\n GroupCellRenderer.prototype.init = function (params) {\n this.params = params;\n if (this.gridOptionsWrapper.isGroupIncludeTotalFooter()) {\n this.assignBlankValueToGroupFooterCell(params);\n }\n var embeddedRowMismatch = this.isEmbeddedRowMismatch();\n // This allows for empty strings to appear as groups since\n // it will only return for null or undefined.\n var nullValue = params.value == null;\n var skipCell = false;\n // if the groupCellRenderer is inside of a footer and groupHideOpenParents is true\n // we should only display the groupCellRenderer if the current column is the rowGroupedColumn\n if (this.gridOptionsWrapper.isGroupIncludeFooter() && this.gridOptionsWrapper.isGroupHideOpenParents()) {\n var node = params.node;\n if (node.footer) {\n var showRowGroup = params.colDef && params.colDef.showRowGroup;\n var rowGroupColumnId = node.rowGroupColumn && node.rowGroupColumn.getColId();\n skipCell = showRowGroup !== rowGroupColumnId;\n }\n }\n this.cellIsBlank = embeddedRowMismatch || nullValue || skipCell;\n if (this.cellIsBlank) {\n return;\n }\n this.setupDragOpenParents();\n this.addExpandAndContract();\n this.addCheckboxIfNeeded();\n this.addValueElement();\n this.setupIndent();\n };\n GroupCellRenderer.prototype.assignBlankValueToGroupFooterCell = function (params) {\n // this is not ideal, but it was the only way we could get footer working for the root node\n if (!params.value && params.node.level == -1) {\n params.value = '';\n }\n };\n // if we are doing embedded full width rows, we only show the renderer when\n // in the body, or if pinning in the pinned section, or if pinning and RTL,\n // in the right section. otherwise we would have the cell repeated in each section.\n GroupCellRenderer.prototype.isEmbeddedRowMismatch = function () {\n if (!this.params.fullWidth || !this.gridOptionsWrapper.isEmbedFullWidthRows()) {\n return false;\n }\n var pinnedLeftCell = this.params.pinned === Constants.PINNED_LEFT;\n var pinnedRightCell = this.params.pinned === Constants.PINNED_RIGHT;\n var bodyCell = !pinnedLeftCell && !pinnedRightCell;\n if (this.gridOptionsWrapper.isEnableRtl()) {\n if (this.columnController.isPinningLeft()) {\n return !pinnedRightCell;\n }\n return !bodyCell;\n }\n if (this.columnController.isPinningLeft()) {\n return !pinnedLeftCell;\n }\n return !bodyCell;\n };\n GroupCellRenderer.prototype.setIndent = function () {\n if (this.gridOptionsWrapper.isGroupHideOpenParents()) {\n return;\n }\n var params = this.params;\n var rowNode = params.node;\n // if we are only showing one group column, we don't want to be indenting based on level\n var fullWithRow = !!params.colDef;\n var manyDimensionThisColumn = !fullWithRow || params.colDef.showRowGroup === true;\n var paddingCount = manyDimensionThisColumn ? rowNode.uiLevel : 0;\n var userProvidedPaddingPixelsTheDeprecatedWay = params.padding >= 0;\n if (userProvidedPaddingPixelsTheDeprecatedWay) {\n this.setPaddingDeprecatedWay(paddingCount, params.padding);\n return;\n }\n if (this.indentClass) {\n this.removeCssClass(this.indentClass);\n }\n this.indentClass = 'ag-row-group-indent-' + paddingCount;\n this.addCssClass(this.indentClass);\n };\n GroupCellRenderer.prototype.setPaddingDeprecatedWay = function (paddingCount, padding) {\n doOnce(function () { return console.warn('AG Grid: since v14.2, configuring padding for groupCellRenderer should be done with Sass variables and themes. Please see the AG Grid documentation page for Themes, in particular the property $row-group-indent-size.'); }, 'groupCellRenderer->doDeprecatedWay');\n var paddingPx = paddingCount * padding;\n var eGui = this.getGui();\n var paddingSide = this.gridOptionsWrapper.isEnableRtl() ? 'paddingRight' : 'paddingLeft';\n eGui.style[paddingSide] = paddingPx + \"px\";\n };\n GroupCellRenderer.prototype.setupIndent = function () {\n // only do this if an indent - as this overwrites the padding that\n // the theme set, which will make things look 'not aligned' for the\n // first group level.\n var node = this.params.node;\n var suppressPadding = this.params.suppressPadding;\n if (!suppressPadding) {\n this.addManagedListener(node, RowNode.EVENT_UI_LEVEL_CHANGED, this.setIndent.bind(this));\n this.setIndent();\n }\n };\n GroupCellRenderer.prototype.addValueElement = function () {\n if (this.displayedGroup.footer) {\n this.addFooterValue();\n }\n else {\n this.addGroupValue();\n this.addChildCount();\n }\n };\n GroupCellRenderer.prototype.addFooterValue = function () {\n var footerValueGetter = this.params.footerValueGetter;\n var footerValue;\n if (footerValueGetter) {\n // params is same as we were given, except we set the value as the item to display\n var paramsClone = cloneObject(this.params);\n paramsClone.value = this.params.value;\n if (typeof footerValueGetter === 'function') {\n footerValue = footerValueGetter(paramsClone);\n }\n else if (typeof footerValueGetter === 'string') {\n footerValue = this.expressionService.evaluate(footerValueGetter, paramsClone);\n }\n else {\n console.warn('AG Grid: footerValueGetter should be either a function or a string (expression)');\n }\n }\n else {\n footerValue = 'Total ' + this.params.value;\n }\n this.eValue.innerHTML = footerValue;\n };\n GroupCellRenderer.prototype.addGroupValue = function () {\n var _this = this;\n var params = this.params;\n var rowGroupColumn = this.displayedGroup.rowGroupColumn;\n // we try and use the cellRenderer of the column used for the grouping if we can\n var columnToUse = rowGroupColumn ? rowGroupColumn : params.column;\n var groupName = this.params.value;\n var valueFormatted = columnToUse ?\n this.valueFormatterService.formatValue(columnToUse, params.node, params.scope, groupName) : null;\n params.valueFormatted = valueFormatted;\n var rendererPromise;\n rendererPromise = params.fullWidth\n ? this.useFullWidth(params)\n : this.useInnerRenderer(this.params.colDef.cellRendererParams, columnToUse.getColDef(), params);\n // retain a reference to the created renderer - we'll use this later for cleanup (in destroy)\n if (rendererPromise) {\n rendererPromise.then(function (value) {\n _this.innerCellRenderer = value;\n });\n }\n };\n GroupCellRenderer.prototype.useInnerRenderer = function (groupCellRendererParams, groupedColumnDef, // the column this group row is for, eg 'Country'\n params) {\n var _this = this;\n // when grouping, the normal case is we use the cell renderer of the grouped column. eg if grouping by country\n // and then rating, we will use the country cell renderer for each country group row and likewise the rating\n // cell renderer for each rating group row.\n //\n // however if the user has innerCellRenderer defined, this gets preference and we don't use cell renderers\n // of the grouped columns.\n //\n // so we check and use in the following order:\n //\n // 1) thisColDef.cellRendererParams.innerRenderer of the column showing the groups (eg auto group column)\n // 2) groupedColDef.cellRenderer of the grouped column\n // 3) groupedColDef.cellRendererParams.innerRenderer\n var cellRendererPromise = null;\n // we check if cell renderer provided for the group cell renderer, eg colDef.cellRendererParams.innerRenderer\n var groupInnerRendererClass = this.userComponentFactory\n .lookupComponentClassDef(groupCellRendererParams, \"innerRenderer\");\n if (groupInnerRendererClass && groupInnerRendererClass.component != null\n && groupInnerRendererClass.source != ComponentSource.DEFAULT) {\n // use the renderer defined in cellRendererParams.innerRenderer\n cellRendererPromise = this.userComponentFactory.newInnerCellRenderer(groupCellRendererParams, params);\n }\n else {\n // otherwise see if we can use the cellRenderer of the column we are grouping by\n var groupColumnRendererClass = this.userComponentFactory\n .lookupComponentClassDef(groupedColumnDef, \"cellRenderer\");\n if (groupColumnRendererClass &&\n groupColumnRendererClass.source != ComponentSource.DEFAULT) {\n // Only if the original column is using a specific renderer, it it is a using a DEFAULT one ignore it\n cellRendererPromise = this.userComponentFactory.newCellRenderer(groupedColumnDef, params);\n }\n else if (groupColumnRendererClass &&\n groupColumnRendererClass.source == ComponentSource.DEFAULT &&\n (get(groupedColumnDef, 'cellRendererParams.innerRenderer', null))) {\n // EDGE CASE - THIS COMES FROM A COLUMN WHICH HAS BEEN GROUPED DYNAMICALLY, THAT HAS AS RENDERER 'group'\n // AND HAS A INNER CELL RENDERER\n cellRendererPromise = this.userComponentFactory.newInnerCellRenderer(groupedColumnDef.cellRendererParams, params);\n }\n else {\n // This forces the retrieval of the default plain cellRenderer that just renders the values.\n cellRendererPromise = this.userComponentFactory.newCellRenderer({}, params);\n }\n }\n if (cellRendererPromise != null) {\n cellRendererPromise.then(function (rendererToUse) {\n if (rendererToUse == null) {\n _this.eValue.innerText = params.valueFormatted != null ? params.valueFormatted : params.value;\n return;\n }\n bindCellRendererToHtmlElement(cellRendererPromise, _this.eValue);\n });\n }\n else {\n this.eValue.innerText = params.valueFormatted != null ? params.valueFormatted : params.value;\n }\n return cellRendererPromise;\n };\n GroupCellRenderer.prototype.useFullWidth = function (params) {\n var cellRendererPromise = this.userComponentFactory.newFullWidthGroupRowInnerCellRenderer(params);\n if (cellRendererPromise != null) {\n bindCellRendererToHtmlElement(cellRendererPromise, this.eValue);\n }\n else {\n this.eValue.innerText = params.valueFormatted != null ? params.valueFormatted : params.value;\n }\n return cellRendererPromise;\n };\n GroupCellRenderer.prototype.addChildCount = function () {\n // only include the child count if it's included, eg if user doing custom aggregation,\n // then this could be left out, or set to -1, ie no child count\n if (this.params.suppressCount) {\n return;\n }\n this.addManagedListener(this.displayedGroup, RowNode.EVENT_ALL_CHILDREN_COUNT_CHANGED, this.updateChildCount.bind(this));\n // filtering changes the child count, so need to cater for it\n this.updateChildCount();\n };\n GroupCellRenderer.prototype.updateChildCount = function () {\n var allChildrenCount = this.displayedGroup.allChildrenCount;\n var showingGroupForThisNode = this.isShowRowGroupForThisRow();\n var showCount = showingGroupForThisNode && allChildrenCount != null && allChildrenCount >= 0;\n var countString = showCount ? \"(\" + allChildrenCount + \")\" : \"\";\n this.eChildCount.innerHTML = countString;\n };\n GroupCellRenderer.prototype.isUserWantsSelected = function () {\n var paramsCheckbox = this.params.checkbox;\n if (typeof paramsCheckbox === 'function') {\n return paramsCheckbox(this.params);\n }\n return paramsCheckbox === true;\n };\n GroupCellRenderer.prototype.addCheckboxIfNeeded = function () {\n var _this = this;\n var rowNode = this.displayedGroup;\n var checkboxNeeded = this.isUserWantsSelected() &&\n // footers cannot be selected\n !rowNode.footer &&\n // pinned rows cannot be selected\n !rowNode.rowPinned &&\n // details cannot be selected\n !rowNode.detail;\n if (checkboxNeeded) {\n var cbSelectionComponent_1 = new CheckboxSelectionComponent();\n this.getContext().createBean(cbSelectionComponent_1);\n cbSelectionComponent_1.init({ rowNode: rowNode, column: this.params.column });\n this.eCheckbox.appendChild(cbSelectionComponent_1.getGui());\n this.addDestroyFunc(function () { return _this.getContext().destroyBean(cbSelectionComponent_1); });\n }\n addOrRemoveCssClass(this.eCheckbox, 'ag-invisible', !checkboxNeeded);\n };\n GroupCellRenderer.prototype.addExpandAndContract = function () {\n var params = this.params;\n var eGroupCell = params.eGridCell;\n var eExpandedIcon = createIconNoSpan('groupExpanded', this.gridOptionsWrapper, null);\n var eContractedIcon = createIconNoSpan('groupContracted', this.gridOptionsWrapper, null);\n setAriaExpanded(eGroupCell, !!params.node.expanded);\n if (eExpandedIcon) {\n this.eExpanded.appendChild(eExpandedIcon);\n }\n if (eContractedIcon) {\n this.eContracted.appendChild(eContractedIcon);\n }\n this.addManagedListener(this.eExpanded, 'click', this.onExpandClicked.bind(this));\n this.addManagedListener(this.eContracted, 'click', this.onExpandClicked.bind(this));\n // expand / contract as the user hits enter\n this.addManagedListener(eGroupCell, 'keydown', this.onKeyDown.bind(this));\n this.addManagedListener(params.node, RowNode.EVENT_EXPANDED_CHANGED, this.showExpandAndContractIcons.bind(this));\n this.showExpandAndContractIcons();\n // because we don't show the expand / contract when there are no children, we need to check every time\n // the number of children change.\n var expandableChangedListener = this.onRowNodeIsExpandableChanged.bind(this);\n this.addManagedListener(this.displayedGroup, RowNode.EVENT_ALL_CHILDREN_COUNT_CHANGED, expandableChangedListener);\n this.addManagedListener(this.displayedGroup, RowNode.EVENT_MASTER_CHANGED, expandableChangedListener);\n this.addManagedListener(this.displayedGroup, RowNode.EVENT_HAS_CHILDREN_CHANGED, expandableChangedListener);\n // if editing groups, then double click is to start editing\n if (!this.gridOptionsWrapper.isEnableGroupEdit() && this.isExpandable() && !params.suppressDoubleClickExpand) {\n this.addManagedListener(eGroupCell, 'dblclick', this.onCellDblClicked.bind(this));\n }\n };\n GroupCellRenderer.prototype.onRowNodeIsExpandableChanged = function () {\n // maybe if no children now, we should hide the expand / contract icons\n this.showExpandAndContractIcons();\n // if we have no children, this impacts the indent\n this.setIndent();\n };\n GroupCellRenderer.prototype.onKeyDown = function (event) {\n var enterKeyPressed = isKeyPressed(event, KeyCode.ENTER);\n if (!enterKeyPressed || this.params.suppressEnterExpand) {\n return;\n }\n var cellEditable = this.params.column && this.params.column.isCellEditable(this.params.node);\n if (cellEditable) {\n return;\n }\n this.onExpandOrContract();\n };\n GroupCellRenderer.prototype.setupDragOpenParents = function () {\n var column = this.params.column;\n var rowNode = this.params.node;\n if (!this.gridOptionsWrapper.isGroupHideOpenParents()) {\n this.draggedFromHideOpenParents = false;\n }\n else if (!rowNode.hasChildren()) {\n // if we are here, and we are not a group, then we must of been dragged down,\n // as otherwise the cell would be blank, and if cell is blank, this method is never called.\n this.draggedFromHideOpenParents = true;\n }\n else {\n var rowGroupColumn = rowNode.rowGroupColumn;\n if (rowGroupColumn) {\n // if the displayGroup column for this col matches the rowGroupColumn we grouped by for this node,\n // then nothing was dragged down\n this.draggedFromHideOpenParents = !column.isRowGroupDisplayed(rowGroupColumn.getId());\n }\n else {\n // the only way we can end up here (no column, but a group) is if we are at the root node,\n // which only happens when 'groupIncludeTotalFooter' is true. here, we are never dragging\n this.draggedFromHideOpenParents = false;\n }\n }\n if (this.draggedFromHideOpenParents) {\n var pointer = rowNode.parent;\n while (true) {\n if (missing(pointer)) {\n break;\n }\n if (pointer.rowGroupColumn && column.isRowGroupDisplayed(pointer.rowGroupColumn.getId())) {\n this.displayedGroup = pointer;\n break;\n }\n pointer = pointer.parent;\n }\n }\n // if we didn't find a displayed group, set it to the row node\n if (missing(this.displayedGroup)) {\n this.displayedGroup = rowNode;\n }\n };\n GroupCellRenderer.prototype.onExpandClicked = function (mouseEvent) {\n if (isStopPropagationForAgGrid(mouseEvent)) {\n return;\n }\n // so if we expand a node, it does not also get selected.\n stopPropagationForAgGrid(mouseEvent);\n this.onExpandOrContract();\n };\n GroupCellRenderer.prototype.onCellDblClicked = function (mouseEvent) {\n if (isStopPropagationForAgGrid(mouseEvent)) {\n return;\n }\n // we want to avoid acting on double click events on the expand / contract icon,\n // as that icons already has expand / collapse functionality on it. otherwise if\n // the icon was double clicked, we would get 'click', 'click', 'dblclick' which\n // is open->close->open, however double click should be open->close only.\n var targetIsExpandIcon = isElementInEventPath(this.eExpanded, mouseEvent)\n || isElementInEventPath(this.eContracted, mouseEvent);\n if (!targetIsExpandIcon) {\n this.onExpandOrContract();\n }\n };\n GroupCellRenderer.prototype.onExpandOrContract = function () {\n // must use the displayedGroup, so if data was dragged down, we expand the parent, not this row\n var rowNode = this.displayedGroup;\n var params = this.params;\n var nextExpandState = !rowNode.expanded;\n rowNode.setExpanded(nextExpandState);\n setAriaExpanded(params.eGridCell, nextExpandState);\n };\n GroupCellRenderer.prototype.isShowRowGroupForThisRow = function () {\n if (this.gridOptionsWrapper.isTreeData()) {\n return true;\n }\n var rowGroupColumn = this.displayedGroup.rowGroupColumn;\n if (!rowGroupColumn) {\n return false;\n }\n // column is null for fullWidthRows\n var column = this.params.column;\n var thisColumnIsInterested = column == null || column.isRowGroupDisplayed(rowGroupColumn.getId());\n return thisColumnIsInterested;\n };\n GroupCellRenderer.prototype.isExpandable = function () {\n if (this.draggedFromHideOpenParents) {\n return true;\n }\n var rowNode = this.displayedGroup;\n var reducedLeafNode = this.columnController.isPivotMode() && rowNode.leafGroup;\n var expandableGroup = rowNode.isExpandable() && !rowNode.footer && !reducedLeafNode;\n if (!expandableGroup) {\n return false;\n }\n // column is null for fullWidthRows\n var column = this.params.column;\n var displayingForOneColumnOnly = column != null && typeof column.getColDef().showRowGroup === 'string';\n if (displayingForOneColumnOnly) {\n var showing = this.isShowRowGroupForThisRow();\n return showing;\n }\n return true;\n };\n GroupCellRenderer.prototype.showExpandAndContractIcons = function () {\n var _a = this, eContracted = _a.eContracted, eExpanded = _a.eExpanded, params = _a.params, displayedGroup = _a.displayedGroup, columnController = _a.columnController;\n var eGridCell = params.eGridCell, node = params.node;\n var isExpandable = this.isExpandable();\n if (isExpandable) {\n // if expandable, show one based on expand state.\n // if we were dragged down, means our parent is always expanded\n var expanded = this.draggedFromHideOpenParents ? true : node.expanded;\n setDisplayed(eContracted, !expanded);\n setDisplayed(eExpanded, expanded);\n }\n else {\n // it not expandable, show neither\n removeAriaExpanded(eGridCell);\n setDisplayed(eExpanded, false);\n setDisplayed(eContracted, false);\n }\n // compensation padding for leaf nodes, so there is blank space instead of the expand icon\n var pivotMode = columnController.isPivotMode();\n var pivotModeAndLeafGroup = pivotMode && displayedGroup.leafGroup;\n var addExpandableCss = isExpandable && !pivotModeAndLeafGroup;\n var isTotalFooterNode = node.footer && node.level === -1;\n this.addOrRemoveCssClass('ag-cell-expandable', addExpandableCss);\n this.addOrRemoveCssClass('ag-row-group', addExpandableCss);\n if (pivotMode) {\n this.addOrRemoveCssClass('ag-pivot-leaf-group', pivotModeAndLeafGroup);\n }\n else if (!isTotalFooterNode) {\n this.addOrRemoveCssClass('ag-row-group-leaf-indent', !addExpandableCss);\n }\n };\n // this is a user component, and IComponent has \"public destroy()\" as part of the interface.\n // so we need to have public here instead of private or protected\n GroupCellRenderer.prototype.destroy = function () {\n this.getContext().destroyBean(this.innerCellRenderer);\n _super.prototype.destroy.call(this);\n };\n GroupCellRenderer.prototype.refresh = function () {\n return false;\n };\n GroupCellRenderer.TEMPLATE = \"\\n \\n \\n \\n \\n \\n \";\n __decorate$k([\n Autowired('expressionService')\n ], GroupCellRenderer.prototype, \"expressionService\", void 0);\n __decorate$k([\n Autowired('valueFormatterService')\n ], GroupCellRenderer.prototype, \"valueFormatterService\", void 0);\n __decorate$k([\n Autowired('columnController')\n ], GroupCellRenderer.prototype, \"columnController\", void 0);\n __decorate$k([\n Autowired('userComponentFactory')\n ], GroupCellRenderer.prototype, \"userComponentFactory\", void 0);\n __decorate$k([\n RefSelector('eExpanded')\n ], GroupCellRenderer.prototype, \"eExpanded\", void 0);\n __decorate$k([\n RefSelector('eContracted')\n ], GroupCellRenderer.prototype, \"eContracted\", void 0);\n __decorate$k([\n RefSelector('eCheckbox')\n ], GroupCellRenderer.prototype, \"eCheckbox\", void 0);\n __decorate$k([\n RefSelector('eValue')\n ], GroupCellRenderer.prototype, \"eValue\", void 0);\n __decorate$k([\n RefSelector('eChildCount')\n ], GroupCellRenderer.prototype, \"eChildCount\", void 0);\n return GroupCellRenderer;\n}(Component));\n\n/**\n * @ag-grid-community/core - Advanced Data Grid / Data Table supporting Javascript / React / AngularJS / Web Components\n * @version v25.1.0\n * @link http://www.ag-grid.com/\n * @license MIT\n */\nvar __extends$i = (undefined && undefined.__extends) || (function () {\n var extendStatics = function (d, b) {\n extendStatics = Object.setPrototypeOf ||\n ({ __proto__: [] } instanceof Array && function (d, b) { d.__proto__ = b; }) ||\n function (d, b) { for (var p in b) if (b.hasOwnProperty(p)) d[p] = b[p]; };\n return extendStatics(d, b);\n };\n return function (d, b) {\n extendStatics(d, b);\n function __() { this.constructor = d; }\n d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __());\n };\n})();\nvar __decorate$l = (undefined && undefined.__decorate) || function (decorators, target, key, desc) {\n var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d;\n if (typeof Reflect === \"object\" && typeof Reflect.decorate === \"function\") r = Reflect.decorate(decorators, target, key, desc);\n else for (var i = decorators.length - 1; i >= 0; i--) if (d = decorators[i]) r = (c < 3 ? d(r) : c > 3 ? d(target, key, r) : d(target, key)) || r;\n return c > 3 && r && Object.defineProperty(target, key, r), r;\n};\nvar ARROW_UP = '\\u2191';\nvar ARROW_DOWN = '\\u2193';\nvar AnimateShowChangeCellRenderer = /** @class */ (function (_super) {\n __extends$i(AnimateShowChangeCellRenderer, _super);\n function AnimateShowChangeCellRenderer() {\n var _this = _super.call(this, AnimateShowChangeCellRenderer.TEMPLATE) || this;\n _this.refreshCount = 0;\n return _this;\n }\n AnimateShowChangeCellRenderer.prototype.init = function (params) {\n // this.params = params;\n this.eValue = this.queryForHtmlElement('.ag-value-change-value');\n this.eDelta = this.queryForHtmlElement('.ag-value-change-delta');\n this.refresh(params);\n };\n AnimateShowChangeCellRenderer.prototype.showDelta = function (params, delta) {\n var absDelta = Math.abs(delta);\n var valueFormatted = params.formatValue(absDelta);\n var valueToUse = exists(valueFormatted) ? valueFormatted : absDelta;\n var deltaUp = (delta >= 0);\n if (deltaUp) {\n this.eDelta.innerHTML = ARROW_UP + valueToUse;\n }\n else {\n // because negative, use ABS to remove sign\n this.eDelta.innerHTML = ARROW_DOWN + valueToUse;\n }\n addOrRemoveCssClass(this.eDelta, 'ag-value-change-delta-up', deltaUp);\n addOrRemoveCssClass(this.eDelta, 'ag-value-change-delta-down', !deltaUp);\n };\n AnimateShowChangeCellRenderer.prototype.setTimerToRemoveDelta = function () {\n var _this = this;\n // the refreshCount makes sure that if the value updates again while\n // the below timer is waiting, then the below timer will realise it\n // is not the most recent and will not try to remove the delta value.\n this.refreshCount++;\n var refreshCountCopy = this.refreshCount;\n window.setTimeout(function () {\n if (refreshCountCopy === _this.refreshCount) {\n _this.hideDeltaValue();\n }\n }, 2000);\n };\n AnimateShowChangeCellRenderer.prototype.hideDeltaValue = function () {\n removeCssClass(this.eValue, 'ag-value-change-value-highlight');\n clearElement(this.eDelta);\n };\n AnimateShowChangeCellRenderer.prototype.refresh = function (params) {\n var value = params.value;\n if (value === this.lastValue) {\n return false;\n }\n if (exists(params.valueFormatted)) {\n this.eValue.innerHTML = params.valueFormatted;\n }\n else if (exists(params.value)) {\n this.eValue.innerHTML = value;\n }\n else {\n clearElement(this.eValue);\n }\n // we don't show the delta if we are in the middle of a filter. see comment on FilterManager\n // with regards processingFilterChange\n if (this.filterManager.isSuppressFlashingCellsBecauseFiltering()) {\n return false;\n }\n if (typeof value === 'number' && typeof this.lastValue === 'number') {\n var delta = value - this.lastValue;\n this.showDelta(params, delta);\n }\n // highlight the current value, but only if it's not new, otherwise it\n // would get highlighted first time the value is shown\n if (this.lastValue) {\n addCssClass(this.eValue, 'ag-value-change-value-highlight');\n }\n this.setTimerToRemoveDelta();\n this.lastValue = value;\n return true;\n };\n AnimateShowChangeCellRenderer.TEMPLATE = '' +\n '' +\n '' +\n '';\n __decorate$l([\n Autowired('filterManager')\n ], AnimateShowChangeCellRenderer.prototype, \"filterManager\", void 0);\n return AnimateShowChangeCellRenderer;\n}(Component));\n\n/**\n * @ag-grid-community/core - Advanced Data Grid / Data Table supporting Javascript / React / AngularJS / Web Components\n * @version v25.1.0\n * @link http://www.ag-grid.com/\n * @license MIT\n */\nvar __extends$j = (undefined && undefined.__extends) || (function () {\n var extendStatics = function (d, b) {\n extendStatics = Object.setPrototypeOf ||\n ({ __proto__: [] } instanceof Array && function (d, b) { d.__proto__ = b; }) ||\n function (d, b) { for (var p in b) if (b.hasOwnProperty(p)) d[p] = b[p]; };\n return extendStatics(d, b);\n };\n return function (d, b) {\n extendStatics(d, b);\n function __() { this.constructor = d; }\n d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __());\n };\n})();\nvar __decorate$m = (undefined && undefined.__decorate) || function (decorators, target, key, desc) {\n var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d;\n if (typeof Reflect === \"object\" && typeof Reflect.decorate === \"function\") r = Reflect.decorate(decorators, target, key, desc);\n else for (var i = decorators.length - 1; i >= 0; i--) if (d = decorators[i]) r = (c < 3 ? d(r) : c > 3 ? d(target, key, r) : d(target, key)) || r;\n return c > 3 && r && Object.defineProperty(target, key, r), r;\n};\nvar AnimateSlideCellRenderer = /** @class */ (function (_super) {\n __extends$j(AnimateSlideCellRenderer, _super);\n function AnimateSlideCellRenderer() {\n var _this = _super.call(this, AnimateSlideCellRenderer.TEMPLATE) || this;\n _this.refreshCount = 0;\n _this.eCurrent = _this.queryForHtmlElement('.ag-value-slide-current');\n return _this;\n }\n AnimateSlideCellRenderer.prototype.init = function (params) {\n this.params = params;\n this.refresh(params);\n };\n AnimateSlideCellRenderer.prototype.addSlideAnimation = function () {\n var _this = this;\n this.refreshCount++;\n // below we keep checking this, and stop working on the animation\n // if it no longer matches - this means another animation has started\n // and this one is stale.\n var refreshCountCopy = this.refreshCount;\n // if old animation, remove it\n if (this.ePrevious) {\n this.getGui().removeChild(this.ePrevious);\n }\n this.ePrevious = loadTemplate('');\n this.ePrevious.innerHTML = this.eCurrent.innerHTML;\n this.getGui().insertBefore(this.ePrevious, this.eCurrent);\n // having timeout of 0 allows use to skip to the next css turn,\n // so we know the previous css classes have been applied. so the\n // complex set of setTimeout below creates the animation\n window.setTimeout(function () {\n if (refreshCountCopy !== _this.refreshCount) {\n return;\n }\n addCssClass(_this.ePrevious, 'ag-value-slide-out-end');\n }, 50);\n window.setTimeout(function () {\n if (refreshCountCopy !== _this.refreshCount) {\n return;\n }\n _this.getGui().removeChild(_this.ePrevious);\n _this.ePrevious = null;\n }, 3000);\n };\n AnimateSlideCellRenderer.prototype.refresh = function (params) {\n var value = params.value;\n if (missing(value)) {\n value = '';\n }\n if (value === this.lastValue) {\n return false;\n }\n // we don't show the delta if we are in the middle of a filter. see comment on FilterManager\n // with regards processingFilterChange\n if (this.filterManager.isSuppressFlashingCellsBecauseFiltering()) {\n return false;\n }\n this.addSlideAnimation();\n this.lastValue = value;\n if (exists(params.valueFormatted)) {\n this.eCurrent.innerHTML = params.valueFormatted;\n }\n else if (exists(params.value)) {\n this.eCurrent.innerHTML = value;\n }\n else {\n clearElement(this.eCurrent);\n }\n return true;\n };\n AnimateSlideCellRenderer.TEMPLATE = '' +\n '' +\n '';\n __decorate$m([\n Autowired('filterManager')\n ], AnimateSlideCellRenderer.prototype, \"filterManager\", void 0);\n return AnimateSlideCellRenderer;\n}(Component));\n\n/**\n * @ag-grid-community/core - Advanced Data Grid / Data Table supporting Javascript / React / AngularJS / Web Components\n * @version v25.1.0\n * @link http://www.ag-grid.com/\n * @license MIT\n */\nvar __extends$k = (undefined && undefined.__extends) || (function () {\n var extendStatics = function (d, b) {\n extendStatics = Object.setPrototypeOf ||\n ({ __proto__: [] } instanceof Array && function (d, b) { d.__proto__ = b; }) ||\n function (d, b) { for (var p in b) if (b.hasOwnProperty(p)) d[p] = b[p]; };\n return extendStatics(d, b);\n };\n return function (d, b) {\n extendStatics(d, b);\n function __() { this.constructor = d; }\n d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __());\n };\n})();\nvar __decorate$n = (undefined && undefined.__decorate) || function (decorators, target, key, desc) {\n var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d;\n if (typeof Reflect === \"object\" && typeof Reflect.decorate === \"function\") r = Reflect.decorate(decorators, target, key, desc);\n else for (var i = decorators.length - 1; i >= 0; i--) if (d = decorators[i]) r = (c < 3 ? d(r) : c > 3 ? d(target, key, r) : d(target, key)) || r;\n return c > 3 && r && Object.defineProperty(target, key, r), r;\n};\nvar LoadingCellRenderer = /** @class */ (function (_super) {\n __extends$k(LoadingCellRenderer, _super);\n function LoadingCellRenderer() {\n return _super.call(this, LoadingCellRenderer.TEMPLATE) || this;\n }\n LoadingCellRenderer.prototype.init = function (params) {\n params.node.failedLoad ? this.setupFailed() : this.setupLoading();\n };\n LoadingCellRenderer.prototype.setupFailed = function () {\n this.eLoadingText.innerText = 'ERR';\n };\n LoadingCellRenderer.prototype.setupLoading = function () {\n var eLoadingIcon = createIconNoSpan('groupLoading', this.gridOptionsWrapper, null);\n if (eLoadingIcon) {\n this.eLoadingIcon.appendChild(eLoadingIcon);\n }\n var localeTextFunc = this.gridOptionsWrapper.getLocaleTextFunc();\n this.eLoadingText.innerText = localeTextFunc('loadingOoo', 'Loading');\n };\n LoadingCellRenderer.prototype.refresh = function (params) {\n return false;\n };\n LoadingCellRenderer.TEMPLATE = \"
\\n \\n \\n
\";\n __decorate$n([\n RefSelector('eLoadingIcon')\n ], LoadingCellRenderer.prototype, \"eLoadingIcon\", void 0);\n __decorate$n([\n RefSelector('eLoadingText')\n ], LoadingCellRenderer.prototype, \"eLoadingText\", void 0);\n return LoadingCellRenderer;\n}(Component));\n\n/**\n * @ag-grid-community/core - Advanced Data Grid / Data Table supporting Javascript / React / AngularJS / Web Components\n * @version v25.1.0\n * @link http://www.ag-grid.com/\n * @license MIT\n */\nvar __extends$l = (undefined && undefined.__extends) || (function () {\n var extendStatics = function (d, b) {\n extendStatics = Object.setPrototypeOf ||\n ({ __proto__: [] } instanceof Array && function (d, b) { d.__proto__ = b; }) ||\n function (d, b) { for (var p in b) if (b.hasOwnProperty(p)) d[p] = b[p]; };\n return extendStatics(d, b);\n };\n return function (d, b) {\n extendStatics(d, b);\n function __() { this.constructor = d; }\n d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __());\n };\n})();\nvar __decorate$o = (undefined && undefined.__decorate) || function (decorators, target, key, desc) {\n var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d;\n if (typeof Reflect === \"object\" && typeof Reflect.decorate === \"function\") r = Reflect.decorate(decorators, target, key, desc);\n else for (var i = decorators.length - 1; i >= 0; i--) if (d = decorators[i]) r = (c < 3 ? d(r) : c > 3 ? d(target, key, r) : d(target, key)) || r;\n return c > 3 && r && Object.defineProperty(target, key, r), r;\n};\nvar SelectCellEditor = /** @class */ (function (_super) {\n __extends$l(SelectCellEditor, _super);\n function SelectCellEditor() {\n var _this = _super.call(this, '
') || this;\n _this.startedByEnter = false;\n return _this;\n }\n SelectCellEditor.prototype.init = function (params) {\n var _this = this;\n this.focusAfterAttached = params.cellStartedEdit;\n if (missing(params.values)) {\n console.warn('AG Grid: no values found for select cellEditor');\n return;\n }\n this.startedByEnter = params.keyPress === KeyCode.ENTER;\n var hasValue = false;\n params.values.forEach(function (value) {\n var option = { value: value };\n var valueFormatted = _this.valueFormatterService.formatValue(params.column, null, null, value);\n var valueFormattedExits = valueFormatted !== null && valueFormatted !== undefined;\n option.text = valueFormattedExits ? valueFormatted : value;\n _this.eSelect.addOption(option);\n hasValue = hasValue || params.value === value;\n });\n if (hasValue) {\n this.eSelect.setValue(params.value, true);\n }\n else if (params.values.length) {\n this.eSelect.setValue(params.values[0], true);\n }\n // we don't want to add this if full row editing, otherwise selecting will stop the\n // full row editing.\n if (!this.gridOptionsWrapper.isFullRowEdit()) {\n this.eSelect.onValueChange(function () { return params.stopEditing(); });\n }\n };\n SelectCellEditor.prototype.afterGuiAttached = function () {\n if (this.focusAfterAttached) {\n this.eSelect.getFocusableElement().focus();\n }\n if (this.startedByEnter) {\n this.eSelect.showPicker();\n }\n };\n SelectCellEditor.prototype.focusIn = function () {\n this.eSelect.getFocusableElement().focus();\n };\n SelectCellEditor.prototype.getValue = function () {\n return this.eSelect.getValue();\n };\n SelectCellEditor.prototype.isPopup = function () {\n return false;\n };\n __decorate$o([\n Autowired('valueFormatterService')\n ], SelectCellEditor.prototype, \"valueFormatterService\", void 0);\n __decorate$o([\n RefSelector('eSelect')\n ], SelectCellEditor.prototype, \"eSelect\", void 0);\n return SelectCellEditor;\n}(PopupComponent));\n\n/**\n * @ag-grid-community/core - Advanced Data Grid / Data Table supporting Javascript / React / AngularJS / Web Components\n * @version v25.1.0\n * @link http://www.ag-grid.com/\n * @license MIT\n */\nvar __extends$m = (undefined && undefined.__extends) || (function () {\n var extendStatics = function (d, b) {\n extendStatics = Object.setPrototypeOf ||\n ({ __proto__: [] } instanceof Array && function (d, b) { d.__proto__ = b; }) ||\n function (d, b) { for (var p in b) if (b.hasOwnProperty(p)) d[p] = b[p]; };\n return extendStatics(d, b);\n };\n return function (d, b) {\n extendStatics(d, b);\n function __() { this.constructor = d; }\n d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __());\n };\n})();\nvar PopupTextCellEditor = /** @class */ (function (_super) {\n __extends$m(PopupTextCellEditor, _super);\n function PopupTextCellEditor() {\n return _super !== null && _super.apply(this, arguments) || this;\n }\n PopupTextCellEditor.prototype.isPopup = function () {\n return true;\n };\n return PopupTextCellEditor;\n}(TextCellEditor));\n\n/**\n * @ag-grid-community/core - Advanced Data Grid / Data Table supporting Javascript / React / AngularJS / Web Components\n * @version v25.1.0\n * @link http://www.ag-grid.com/\n * @license MIT\n */\nvar __extends$n = (undefined && undefined.__extends) || (function () {\n var extendStatics = function (d, b) {\n extendStatics = Object.setPrototypeOf ||\n ({ __proto__: [] } instanceof Array && function (d, b) { d.__proto__ = b; }) ||\n function (d, b) { for (var p in b) if (b.hasOwnProperty(p)) d[p] = b[p]; };\n return extendStatics(d, b);\n };\n return function (d, b) {\n extendStatics(d, b);\n function __() { this.constructor = d; }\n d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __());\n };\n})();\nvar PopupSelectCellEditor = /** @class */ (function (_super) {\n __extends$n(PopupSelectCellEditor, _super);\n function PopupSelectCellEditor() {\n return _super !== null && _super.apply(this, arguments) || this;\n }\n PopupSelectCellEditor.prototype.isPopup = function () {\n return true;\n };\n return PopupSelectCellEditor;\n}(SelectCellEditor));\n\n/**\n * @ag-grid-community/core - Advanced Data Grid / Data Table supporting Javascript / React / AngularJS / Web Components\n * @version v25.1.0\n * @link http://www.ag-grid.com/\n * @license MIT\n */\nvar __extends$o = (undefined && undefined.__extends) || (function () {\n var extendStatics = function (d, b) {\n extendStatics = Object.setPrototypeOf ||\n ({ __proto__: [] } instanceof Array && function (d, b) { d.__proto__ = b; }) ||\n function (d, b) { for (var p in b) if (b.hasOwnProperty(p)) d[p] = b[p]; };\n return extendStatics(d, b);\n };\n return function (d, b) {\n extendStatics(d, b);\n function __() { this.constructor = d; }\n d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __());\n };\n})();\nvar __decorate$p = (undefined && undefined.__decorate) || function (decorators, target, key, desc) {\n var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d;\n if (typeof Reflect === \"object\" && typeof Reflect.decorate === \"function\") r = Reflect.decorate(decorators, target, key, desc);\n else for (var i = decorators.length - 1; i >= 0; i--) if (d = decorators[i]) r = (c < 3 ? d(r) : c > 3 ? d(target, key, r) : d(target, key)) || r;\n return c > 3 && r && Object.defineProperty(target, key, r), r;\n};\nvar LargeTextCellEditor = /** @class */ (function (_super) {\n __extends$o(LargeTextCellEditor, _super);\n function LargeTextCellEditor() {\n return _super.call(this, LargeTextCellEditor.TEMPLATE) || this;\n }\n LargeTextCellEditor.prototype.init = function (params) {\n this.params = params;\n this.focusAfterAttached = params.cellStartedEdit;\n this.eTextArea\n .setMaxLength(params.maxLength || 200)\n .setCols(params.cols || 60)\n .setRows(params.rows || 10);\n if (exists(params.value)) {\n this.eTextArea.setValue(params.value.toString(), true);\n }\n this.addGuiEventListener('keydown', this.onKeyDown.bind(this));\n };\n LargeTextCellEditor.prototype.onKeyDown = function (event) {\n var key = event.which || event.keyCode;\n if (key === KeyCode.LEFT ||\n key === KeyCode.UP ||\n key === KeyCode.RIGHT ||\n key === KeyCode.DOWN ||\n (event.shiftKey && key === KeyCode.ENTER)) { // shift+enter allows for newlines\n event.stopPropagation();\n }\n };\n LargeTextCellEditor.prototype.afterGuiAttached = function () {\n var translate = this.gridOptionsWrapper.getLocaleTextFunc();\n this.eTextArea.setInputAriaLabel(translate('ariaInputEditor', 'Input Editor'));\n if (this.focusAfterAttached) {\n this.eTextArea.getFocusableElement().focus();\n }\n };\n LargeTextCellEditor.prototype.getValue = function () {\n return this.params.parseValue(this.eTextArea.getValue());\n };\n LargeTextCellEditor.TEMPLATE = \"
\\n \\n
\";\n __decorate$p([\n RefSelector(\"eTextArea\")\n ], LargeTextCellEditor.prototype, \"eTextArea\", void 0);\n return LargeTextCellEditor;\n}(PopupComponent));\n\n/**\n * @ag-grid-community/core - Advanced Data Grid / Data Table supporting Javascript / React / AngularJS / Web Components\n * @version v25.1.0\n * @link http://www.ag-grid.com/\n * @license MIT\n */\nvar __extends$p = (undefined && undefined.__extends) || (function () {\n var extendStatics = function (d, b) {\n extendStatics = Object.setPrototypeOf ||\n ({ __proto__: [] } instanceof Array && function (d, b) { d.__proto__ = b; }) ||\n function (d, b) { for (var p in b) if (b.hasOwnProperty(p)) d[p] = b[p]; };\n return extendStatics(d, b);\n };\n return function (d, b) {\n extendStatics(d, b);\n function __() { this.constructor = d; }\n d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __());\n };\n})();\nvar __decorate$q = (undefined && undefined.__decorate) || function (decorators, target, key, desc) {\n var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d;\n if (typeof Reflect === \"object\" && typeof Reflect.decorate === \"function\") r = Reflect.decorate(decorators, target, key, desc);\n else for (var i = decorators.length - 1; i >= 0; i--) if (d = decorators[i]) r = (c < 3 ? d(r) : c > 3 ? d(target, key, r) : d(target, key)) || r;\n return c > 3 && r && Object.defineProperty(target, key, r), r;\n};\nvar NumberFilter = /** @class */ (function (_super) {\n __extends$p(NumberFilter, _super);\n function NumberFilter() {\n return _super.call(this, 'numberFilter') || this;\n }\n NumberFilter.prototype.mapRangeFromModel = function (filterModel) {\n return {\n from: filterModel.filter,\n to: filterModel.filterTo\n };\n };\n NumberFilter.prototype.getDefaultDebounceMs = function () {\n return 500;\n };\n NumberFilter.prototype.resetUiToDefaults = function (silent) {\n var _this = this;\n return _super.prototype.resetUiToDefaults.call(this, silent).then(function () {\n var fields = [_this.eValueFrom1, _this.eValueFrom2, _this.eValueTo1, _this.eValueTo2];\n fields.forEach(function (field) { return field.setValue(null, silent); });\n _this.resetPlaceholder();\n });\n };\n NumberFilter.prototype.setConditionIntoUi = function (model, position) {\n var positionOne = position === ConditionPosition.One;\n var eValueFrom = positionOne ? this.eValueFrom1 : this.eValueFrom2;\n var eValueTo = positionOne ? this.eValueTo1 : this.eValueTo2;\n eValueFrom.setValue(model ? ('' + model.filter) : null);\n eValueTo.setValue(model ? ('' + model.filterTo) : null);\n };\n NumberFilter.prototype.setValueFromFloatingFilter = function (value) {\n this.eValueFrom1.setValue(value);\n this.eValueTo1.setValue(null);\n this.eValueFrom2.setValue(null);\n this.eValueTo2.setValue(null);\n };\n NumberFilter.prototype.comparator = function () {\n return function (left, right) {\n if (left === right) {\n return 0;\n }\n return left < right ? 1 : -1;\n };\n };\n NumberFilter.prototype.setParams = function (params) {\n this.numberFilterParams = params;\n var allowedCharPattern = this.getAllowedCharPattern();\n if (allowedCharPattern) {\n var config = { allowedCharPattern: allowedCharPattern };\n this.resetTemplate({\n eValueFrom1: config,\n eValueTo1: config,\n eValueFrom2: config,\n eValueTo2: config,\n });\n }\n _super.prototype.setParams.call(this, params);\n this.addValueChangedListeners();\n };\n NumberFilter.prototype.addValueChangedListeners = function () {\n var _this = this;\n var listener = function () { return _this.onUiChanged(); };\n this.eValueFrom1.onValueChange(listener);\n this.eValueTo1.onValueChange(listener);\n this.eValueFrom2.onValueChange(listener);\n this.eValueTo2.onValueChange(listener);\n };\n NumberFilter.prototype.resetPlaceholder = function () {\n var globalTranslate = this.gridOptionsWrapper.getLocaleTextFunc();\n var isRange1 = this.showValueTo(this.getCondition1Type());\n var isRange2 = this.showValueTo(this.getCondition2Type());\n this.eValueFrom1.setInputPlaceholder(this.translate(isRange1 ? 'inRangeStart' : 'filterOoo'));\n this.eValueFrom1.setInputAriaLabel(isRange1\n ? globalTranslate('ariaFilterFromValue', 'Filter from value')\n : globalTranslate('ariaFilterValue', 'Filter Value'));\n this.eValueTo1.setInputPlaceholder(this.translate('inRangeEnd'));\n this.eValueTo1.setInputAriaLabel(globalTranslate('ariaFilterToValue', 'Filter to Value'));\n this.eValueFrom2.setInputPlaceholder(this.translate(isRange2 ? 'inRangeStart' : 'filterOoo'));\n this.eValueFrom2.setInputAriaLabel(isRange2\n ? globalTranslate('ariaFilterFromValue', 'Filter from value')\n : globalTranslate('ariaFilterValue', 'Filter Value'));\n this.eValueTo2.setInputPlaceholder(this.translate('inRangeEnd'));\n this.eValueTo2.setInputAriaLabel(globalTranslate('ariaFilterToValue', 'Filter to Value'));\n };\n NumberFilter.prototype.afterGuiAttached = function (params) {\n _super.prototype.afterGuiAttached.call(this, params);\n this.resetPlaceholder();\n if (!params || !params.suppressFocus) {\n this.eValueFrom1.getInputElement().focus();\n }\n };\n NumberFilter.prototype.getDefaultFilterOptions = function () {\n return NumberFilter.DEFAULT_FILTER_OPTIONS;\n };\n NumberFilter.prototype.createValueTemplate = function (position) {\n var pos = position === ConditionPosition.One ? '1' : '2';\n var allowedCharPattern = this.getAllowedCharPattern();\n var agElementTag = allowedCharPattern ? 'ag-input-text-field' : 'ag-input-number-field';\n return /* html */ \"\\n
\\n <\" + agElementTag + \" class=\\\"ag-filter-from ag-filter-filter\\\" ref=\\\"eValueFrom\" + pos + \"\\\">\\n <\" + agElementTag + \" class=\\\"ag-filter-to ag-filter-filter\\\" ref=\\\"eValueTo\" + pos + \"\\\">\\n
\";\n };\n NumberFilter.prototype.isConditionUiComplete = function (position) {\n var positionOne = position === ConditionPosition.One;\n var option = positionOne ? this.getCondition1Type() : this.getCondition2Type();\n if (option === SimpleFilter.EMPTY) {\n return false;\n }\n if (this.doesFilterHaveHiddenInput(option)) {\n return true;\n }\n var eValue = positionOne ? this.eValueFrom1 : this.eValueFrom2;\n var eValueTo = positionOne ? this.eValueTo1 : this.eValueTo2;\n var value = this.stringToFloat(eValue.getValue());\n return value != null && (!this.showValueTo(option) || this.stringToFloat(eValueTo.getValue()) != null);\n };\n NumberFilter.prototype.areSimpleModelsEqual = function (aSimple, bSimple) {\n return aSimple.filter === bSimple.filter\n && aSimple.filterTo === bSimple.filterTo\n && aSimple.type === bSimple.type;\n };\n NumberFilter.prototype.getFilterType = function () {\n return 'number';\n };\n NumberFilter.prototype.stringToFloat = function (value) {\n if (typeof value === 'number') {\n return value;\n }\n var filterText = makeNull(value);\n if (filterText != null && filterText.trim() === '') {\n filterText = null;\n }\n if (this.numberFilterParams.numberParser) {\n return this.numberFilterParams.numberParser(filterText);\n }\n return filterText == null || filterText.trim() === '-' ? null : parseFloat(filterText);\n };\n NumberFilter.prototype.createCondition = function (position) {\n var positionOne = position === ConditionPosition.One;\n var type = positionOne ? this.getCondition1Type() : this.getCondition2Type();\n var eValue = positionOne ? this.eValueFrom1 : this.eValueFrom2;\n var value = this.stringToFloat(eValue.getValue());\n var model = {\n filterType: this.getFilterType(),\n type: type\n };\n if (!this.doesFilterHaveHiddenInput(type)) {\n model.filter = value;\n if (this.showValueTo(type)) {\n var eValueTo = positionOne ? this.eValueTo1 : this.eValueTo2;\n var valueTo = this.stringToFloat(eValueTo.getValue());\n model.filterTo = valueTo;\n }\n }\n return model;\n };\n NumberFilter.prototype.updateUiVisibility = function () {\n _super.prototype.updateUiVisibility.call(this);\n this.resetPlaceholder();\n var condition1Type = this.getCondition1Type();\n var condition2Type = this.getCondition2Type();\n setDisplayed(this.eValueFrom1.getGui(), this.showValueFrom(condition1Type));\n setDisplayed(this.eValueTo1.getGui(), this.showValueTo(condition1Type));\n setDisplayed(this.eValueFrom2.getGui(), this.showValueFrom(condition2Type));\n setDisplayed(this.eValueTo2.getGui(), this.showValueTo(condition2Type));\n };\n NumberFilter.prototype.getAllowedCharPattern = function () {\n var allowedCharPattern = (this.numberFilterParams || {}).allowedCharPattern;\n if (allowedCharPattern) {\n return allowedCharPattern;\n }\n if (!isBrowserChrome() && !isBrowserEdge()) {\n // only Chrome and Edge support the HTML5 number field, so for other browsers we provide an equivalent\n // constraint instead\n return '\\\\d\\\\-\\\\.';\n }\n return null;\n };\n NumberFilter.DEFAULT_FILTER_OPTIONS = [\n ScalarFilter.EQUALS,\n ScalarFilter.NOT_EQUAL,\n ScalarFilter.LESS_THAN,\n ScalarFilter.LESS_THAN_OR_EQUAL,\n ScalarFilter.GREATER_THAN,\n ScalarFilter.GREATER_THAN_OR_EQUAL,\n ScalarFilter.IN_RANGE\n ];\n __decorate$q([\n RefSelector('eValueFrom1')\n ], NumberFilter.prototype, \"eValueFrom1\", void 0);\n __decorate$q([\n RefSelector('eValueTo1')\n ], NumberFilter.prototype, \"eValueTo1\", void 0);\n __decorate$q([\n RefSelector('eValueFrom2')\n ], NumberFilter.prototype, \"eValueFrom2\", void 0);\n __decorate$q([\n RefSelector('eValueTo2')\n ], NumberFilter.prototype, \"eValueTo2\", void 0);\n return NumberFilter;\n}(ScalarFilter));\n\n/**\n * @ag-grid-community/core - Advanced Data Grid / Data Table supporting Javascript / React / AngularJS / Web Components\n * @version v25.1.0\n * @link http://www.ag-grid.com/\n * @license MIT\n */\nvar __extends$q = (undefined && undefined.__extends) || (function () {\n var extendStatics = function (d, b) {\n extendStatics = Object.setPrototypeOf ||\n ({ __proto__: [] } instanceof Array && function (d, b) { d.__proto__ = b; }) ||\n function (d, b) { for (var p in b) if (b.hasOwnProperty(p)) d[p] = b[p]; };\n return extendStatics(d, b);\n };\n return function (d, b) {\n extendStatics(d, b);\n function __() { this.constructor = d; }\n d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __());\n };\n})();\nvar LoadingOverlayComponent$1 = /** @class */ (function (_super) {\n __extends$q(LoadingOverlayComponent, _super);\n function LoadingOverlayComponent() {\n return _super.call(this) || this;\n }\n // this is a user component, and IComponent has \"public destroy()\" as part of the interface.\n // so we need to override destroy() just to make the method public.\n LoadingOverlayComponent.prototype.destroy = function () {\n _super.prototype.destroy.call(this);\n };\n LoadingOverlayComponent.prototype.init = function (params) {\n var template = this.gridOptionsWrapper.getOverlayLoadingTemplate() ?\n this.gridOptionsWrapper.getOverlayLoadingTemplate() : LoadingOverlayComponent.DEFAULT_LOADING_OVERLAY_TEMPLATE;\n var localeTextFunc = this.gridOptionsWrapper.getLocaleTextFunc();\n var localisedTemplate = template.replace('[LOADING...]', localeTextFunc('loadingOoo', 'Loading...'));\n this.setTemplate(localisedTemplate);\n };\n LoadingOverlayComponent.DEFAULT_LOADING_OVERLAY_TEMPLATE = '[LOADING...]';\n return LoadingOverlayComponent;\n}(Component));\n\n/**\n * @ag-grid-community/core - Advanced Data Grid / Data Table supporting Javascript / React / AngularJS / Web Components\n * @version v25.1.0\n * @link http://www.ag-grid.com/\n * @license MIT\n */\nvar __extends$r = (undefined && undefined.__extends) || (function () {\n var extendStatics = function (d, b) {\n extendStatics = Object.setPrototypeOf ||\n ({ __proto__: [] } instanceof Array && function (d, b) { d.__proto__ = b; }) ||\n function (d, b) { for (var p in b) if (b.hasOwnProperty(p)) d[p] = b[p]; };\n return extendStatics(d, b);\n };\n return function (d, b) {\n extendStatics(d, b);\n function __() { this.constructor = d; }\n d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __());\n };\n})();\nvar NoRowsOverlayComponent$1 = /** @class */ (function (_super) {\n __extends$r(NoRowsOverlayComponent, _super);\n function NoRowsOverlayComponent() {\n return _super.call(this) || this;\n }\n // this is a user component, and IComponent has \"public destroy()\" as part of the interface.\n // so we need to override destroy() just to make the method public.\n NoRowsOverlayComponent.prototype.destroy = function () {\n _super.prototype.destroy.call(this);\n };\n NoRowsOverlayComponent.prototype.init = function (params) {\n var template = this.gridOptionsWrapper.getOverlayNoRowsTemplate() ?\n this.gridOptionsWrapper.getOverlayNoRowsTemplate() : NoRowsOverlayComponent.DEFAULT_NO_ROWS_TEMPLATE;\n var localeTextFunc = this.gridOptionsWrapper.getLocaleTextFunc();\n var localisedTemplate = template.replace('[NO_ROWS_TO_SHOW]', localeTextFunc('noRowsToShow', 'No Rows To Show'));\n this.setTemplate(localisedTemplate);\n };\n NoRowsOverlayComponent.DEFAULT_NO_ROWS_TEMPLATE = '[NO_ROWS_TO_SHOW]';\n return NoRowsOverlayComponent;\n}(Component));\n\n/**\n * @ag-grid-community/core - Advanced Data Grid / Data Table supporting Javascript / React / AngularJS / Web Components\n * @version v25.1.0\n * @link http://www.ag-grid.com/\n * @license MIT\n */\nvar __extends$s = (undefined && undefined.__extends) || (function () {\n var extendStatics = function (d, b) {\n extendStatics = Object.setPrototypeOf ||\n ({ __proto__: [] } instanceof Array && function (d, b) { d.__proto__ = b; }) ||\n function (d, b) { for (var p in b) if (b.hasOwnProperty(p)) d[p] = b[p]; };\n return extendStatics(d, b);\n };\n return function (d, b) {\n extendStatics(d, b);\n function __() { this.constructor = d; }\n d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __());\n };\n})();\nvar TooltipComponent$1 = /** @class */ (function (_super) {\n __extends$s(TooltipComponent, _super);\n function TooltipComponent() {\n return _super.call(this, /* html */ \"
\") || this;\n }\n // will need to type params\n TooltipComponent.prototype.init = function (params) {\n var value = params.value;\n this.getGui().innerHTML = value;\n };\n return TooltipComponent;\n}(PopupComponent));\n\n/**\n * @ag-grid-community/core - Advanced Data Grid / Data Table supporting Javascript / React / AngularJS / Web Components\n * @version v25.1.0\n * @link http://www.ag-grid.com/\n * @license MIT\n */\nvar __extends$t = (undefined && undefined.__extends) || (function () {\n var extendStatics = function (d, b) {\n extendStatics = Object.setPrototypeOf ||\n ({ __proto__: [] } instanceof Array && function (d, b) { d.__proto__ = b; }) ||\n function (d, b) { for (var p in b) if (b.hasOwnProperty(p)) d[p] = b[p]; };\n return extendStatics(d, b);\n };\n return function (d, b) {\n extendStatics(d, b);\n function __() { this.constructor = d; }\n d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __());\n };\n})();\nvar __decorate$r = (undefined && undefined.__decorate) || function (decorators, target, key, desc) {\n var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d;\n if (typeof Reflect === \"object\" && typeof Reflect.decorate === \"function\") r = Reflect.decorate(decorators, target, key, desc);\n else for (var i = decorators.length - 1; i >= 0; i--) if (d = decorators[i]) r = (c < 3 ? d(r) : c > 3 ? d(target, key, r) : d(target, key)) || r;\n return c > 3 && r && Object.defineProperty(target, key, r), r;\n};\nvar DefaultDateComponent = /** @class */ (function (_super) {\n __extends$t(DefaultDateComponent, _super);\n function DefaultDateComponent() {\n return _super.call(this, /* html */ \"\\n
\\n \\n
\") || this;\n }\n // this is a user component, and IComponent has \"public destroy()\" as part of the interface.\n // so we need to override destroy() just to make the method public.\n DefaultDateComponent.prototype.destroy = function () {\n _super.prototype.destroy.call(this);\n };\n DefaultDateComponent.prototype.init = function (params) {\n var inputElement = this.eDateInput.getInputElement();\n if (this.shouldUseBrowserDatePicker(params)) {\n if (isBrowserIE()) {\n console.warn('ag-grid: browserDatePicker is specified to true, but it is not supported in IE 11; reverting to text date picker');\n }\n else {\n inputElement.type = 'date';\n }\n }\n // ensures that the input element is focussed when a clear button is clicked\n this.addManagedListener(inputElement, 'mousedown', function () { return inputElement.focus(); });\n this.addManagedListener(this.eDateInput.getInputElement(), 'input', function (e) {\n if (e.target !== document.activeElement) {\n return;\n }\n params.onDateChanged();\n });\n };\n DefaultDateComponent.prototype.getDate = function () {\n return parseDateTimeFromString(this.eDateInput.getValue());\n };\n DefaultDateComponent.prototype.setDate = function (date) {\n this.eDateInput.setValue(serialiseDate(date, false));\n };\n DefaultDateComponent.prototype.setInputPlaceholder = function (placeholder) {\n this.eDateInput.setInputPlaceholder(placeholder);\n };\n DefaultDateComponent.prototype.afterGuiAttached = function (params) {\n if (!params || !params.suppressFocus) {\n this.eDateInput.getInputElement().focus();\n }\n };\n DefaultDateComponent.prototype.shouldUseBrowserDatePicker = function (params) {\n if (params.filterParams && params.filterParams.browserDatePicker != null) {\n return params.filterParams.browserDatePicker;\n }\n return isBrowserChrome() || isBrowserFirefox();\n };\n __decorate$r([\n RefSelector('eDateInput')\n ], DefaultDateComponent.prototype, \"eDateInput\", void 0);\n return DefaultDateComponent;\n}(Component));\n\n/**\n * @ag-grid-community/core - Advanced Data Grid / Data Table supporting Javascript / React / AngularJS / Web Components\n * @version v25.1.0\n * @link http://www.ag-grid.com/\n * @license MIT\n */\nvar __extends$u = (undefined && undefined.__extends) || (function () {\n var extendStatics = function (d, b) {\n extendStatics = Object.setPrototypeOf ||\n ({ __proto__: [] } instanceof Array && function (d, b) { d.__proto__ = b; }) ||\n function (d, b) { for (var p in b) if (b.hasOwnProperty(p)) d[p] = b[p]; };\n return extendStatics(d, b);\n };\n return function (d, b) {\n extendStatics(d, b);\n function __() { this.constructor = d; }\n d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __());\n };\n})();\nvar SimpleFloatingFilter = /** @class */ (function (_super) {\n __extends$u(SimpleFloatingFilter, _super);\n function SimpleFloatingFilter() {\n return _super !== null && _super.apply(this, arguments) || this;\n }\n SimpleFloatingFilter.prototype.getDefaultDebounceMs = function () {\n return 0;\n };\n // this is a user component, and IComponent has \"public destroy()\" as part of the interface.\n // so we need to override destroy() just to make the method public.\n SimpleFloatingFilter.prototype.destroy = function () {\n _super.prototype.destroy.call(this);\n };\n // used by:\n // 1) NumberFloatingFilter & TextFloatingFilter: Always, for both when editable and read only.\n // 2) DateFloatingFilter: Only when read only (as we show text rather than a date picker when read only)\n SimpleFloatingFilter.prototype.getTextFromModel = function (model) {\n if (!model) {\n return null;\n }\n var isCombined = model.operator;\n if (isCombined) {\n var combinedModel = model;\n var con1Str = this.conditionToString(combinedModel.condition1);\n var con2Str = this.conditionToString(combinedModel.condition2);\n return con1Str + \" \" + combinedModel.operator + \" \" + con2Str;\n }\n else {\n var condition = model;\n var customOption = this.optionsFactory.getCustomOption(condition.type);\n // For custom filter options we display the Name of the filter instead\n // of displaying the `from` value, as it wouldn't be relevant\n if (customOption) {\n this.gridOptionsWrapper.getLocaleTextFunc()(customOption.displayKey, customOption.displayName);\n return customOption.displayName;\n }\n return this.conditionToString(condition);\n }\n };\n SimpleFloatingFilter.prototype.isEventFromFloatingFilter = function (event) {\n return event && event.afterFloatingFilter;\n };\n SimpleFloatingFilter.prototype.getLastType = function () {\n return this.lastType;\n };\n SimpleFloatingFilter.prototype.setLastTypeFromModel = function (model) {\n // if no model provided by the parent filter use default\n if (!model) {\n this.lastType = this.optionsFactory.getDefaultOption();\n return;\n }\n var isCombined = model.operator;\n var condition;\n if (isCombined) {\n var combinedModel = model;\n condition = combinedModel.condition1;\n }\n else {\n condition = model;\n }\n this.lastType = condition.type;\n };\n SimpleFloatingFilter.prototype.canWeEditAfterModelFromParentFilter = function (model) {\n if (!model) {\n // if no model, then we can edit as long as the lastType is something we can edit, as this\n // is the type we will provide to the parent filter if the user decides to use the floating filter.\n return this.isTypeEditable(this.lastType);\n }\n // never allow editing if the filter is combined (ie has two parts)\n var isCombined = model.operator;\n if (isCombined) {\n return false;\n }\n var simpleModel = model;\n return this.isTypeEditable(simpleModel.type);\n };\n SimpleFloatingFilter.prototype.init = function (params) {\n this.optionsFactory = new OptionsFactory();\n this.optionsFactory.init(params.filterParams, this.getDefaultFilterOptions());\n this.lastType = this.optionsFactory.getDefaultOption();\n // we are editable if:\n // 1) there is a type (user has configured filter wrong if not type)\n // AND\n // 2) the default type is not 'in range'\n var editable = this.isTypeEditable(this.lastType);\n this.setEditable(editable);\n };\n SimpleFloatingFilter.prototype.doesFilterHaveHiddenInput = function (filterType) {\n var customFilterOption = this.optionsFactory.getCustomOption(filterType);\n return customFilterOption && customFilterOption.hideFilterInput;\n };\n SimpleFloatingFilter.prototype.isTypeEditable = function (type) {\n return !!type && !this.doesFilterHaveHiddenInput(type) &&\n type !== SimpleFilter.IN_RANGE\n && type !== SimpleFilter.EMPTY;\n };\n return SimpleFloatingFilter;\n}(Component));\n\n/**\n * @ag-grid-community/core - Advanced Data Grid / Data Table supporting Javascript / React / AngularJS / Web Components\n * @version v25.1.0\n * @link http://www.ag-grid.com/\n * @license MIT\n */\nvar __extends$v = (undefined && undefined.__extends) || (function () {\n var extendStatics = function (d, b) {\n extendStatics = Object.setPrototypeOf ||\n ({ __proto__: [] } instanceof Array && function (d, b) { d.__proto__ = b; }) ||\n function (d, b) { for (var p in b) if (b.hasOwnProperty(p)) d[p] = b[p]; };\n return extendStatics(d, b);\n };\n return function (d, b) {\n extendStatics(d, b);\n function __() { this.constructor = d; }\n d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __());\n };\n})();\nvar __decorate$s = (undefined && undefined.__decorate) || function (decorators, target, key, desc) {\n var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d;\n if (typeof Reflect === \"object\" && typeof Reflect.decorate === \"function\") r = Reflect.decorate(decorators, target, key, desc);\n else for (var i = decorators.length - 1; i >= 0; i--) if (d = decorators[i]) r = (c < 3 ? d(r) : c > 3 ? d(target, key, r) : d(target, key)) || r;\n return c > 3 && r && Object.defineProperty(target, key, r), r;\n};\nvar DateFloatingFilter = /** @class */ (function (_super) {\n __extends$v(DateFloatingFilter, _super);\n function DateFloatingFilter() {\n return _super.call(this, /* html */ \"\\n
\\n \\n
\\n
\") || this;\n }\n DateFloatingFilter.prototype.getDefaultFilterOptions = function () {\n return DateFilter.DEFAULT_FILTER_OPTIONS;\n };\n DateFloatingFilter.prototype.conditionToString = function (condition) {\n var type = condition.type;\n var dateFrom = parseDateTimeFromString(condition.dateFrom);\n if (type === SimpleFilter.IN_RANGE) {\n var dateTo = parseDateTimeFromString(condition.dateTo);\n return serialiseDate(dateFrom, false) + \"-\" + serialiseDate(dateTo, false);\n }\n // cater for when the type doesn't need a value\n return dateFrom == null ? \"\" + type : \"\" + serialiseDate(dateFrom, false);\n };\n DateFloatingFilter.prototype.init = function (params) {\n _super.prototype.init.call(this, params);\n this.params = params;\n this.createDateComponent();\n var translate = this.gridOptionsWrapper.getLocaleTextFunc();\n this.eReadOnlyText\n .setDisabled(true)\n .setInputAriaLabel(translate('ariaDateFilterInput', 'Date Filter Input'));\n };\n DateFloatingFilter.prototype.setEditable = function (editable) {\n setDisplayed(this.eDateWrapper, editable);\n setDisplayed(this.eReadOnlyText.getGui(), !editable);\n };\n DateFloatingFilter.prototype.onParentModelChanged = function (model, event) {\n // We don't want to update the floating filter if the floating filter caused the change,\n // because the UI is already in sync. if we didn't do this, the UI would behave strangely\n // as it would be updating as the user is typing\n if (this.isEventFromFloatingFilter(event)) {\n return;\n }\n _super.prototype.setLastTypeFromModel.call(this, model);\n var allowEditing = this.canWeEditAfterModelFromParentFilter(model);\n this.setEditable(allowEditing);\n if (allowEditing) {\n if (model) {\n var dateModel = model;\n this.dateComp.setDate(parseDateTimeFromString(dateModel.dateFrom));\n }\n else {\n this.dateComp.setDate(null);\n }\n this.eReadOnlyText.setValue('');\n }\n else {\n this.eReadOnlyText.setValue(this.getTextFromModel(model));\n this.dateComp.setDate(null);\n }\n };\n DateFloatingFilter.prototype.onDateChanged = function () {\n var _this = this;\n var filterValueDate = this.dateComp.getDate();\n var filterValueText = serialiseDate(filterValueDate);\n this.params.parentFilterInstance(function (filterInstance) {\n if (filterInstance) {\n var simpleFilter = filterInstance;\n simpleFilter.onFloatingFilterChanged(_this.getLastType(), filterValueText);\n }\n });\n };\n DateFloatingFilter.prototype.createDateComponent = function () {\n var _this = this;\n var debounceMs = ProvidedFilter.getDebounceMs(this.params.filterParams, this.getDefaultDebounceMs());\n var dateComponentParams = {\n onDateChanged: debounce(this.onDateChanged.bind(this), debounceMs),\n filterParams: this.params.column.getColDef().filterParams\n };\n this.dateComp = new DateCompWrapper(this.getContext(), this.userComponentFactory, dateComponentParams, this.eDateWrapper);\n this.addDestroyFunc(function () { return _this.dateComp.destroy(); });\n };\n __decorate$s([\n Autowired('userComponentFactory')\n ], DateFloatingFilter.prototype, \"userComponentFactory\", void 0);\n __decorate$s([\n RefSelector('eReadOnlyText')\n ], DateFloatingFilter.prototype, \"eReadOnlyText\", void 0);\n __decorate$s([\n RefSelector('eDateWrapper')\n ], DateFloatingFilter.prototype, \"eDateWrapper\", void 0);\n return DateFloatingFilter;\n}(SimpleFloatingFilter));\n\n/**\n * @ag-grid-community/core - Advanced Data Grid / Data Table supporting Javascript / React / AngularJS / Web Components\n * @version v25.1.0\n * @link http://www.ag-grid.com/\n * @license MIT\n */\nvar __extends$w = (undefined && undefined.__extends) || (function () {\n var extendStatics = function (d, b) {\n extendStatics = Object.setPrototypeOf ||\n ({ __proto__: [] } instanceof Array && function (d, b) { d.__proto__ = b; }) ||\n function (d, b) { for (var p in b) if (b.hasOwnProperty(p)) d[p] = b[p]; };\n return extendStatics(d, b);\n };\n return function (d, b) {\n extendStatics(d, b);\n function __() { this.constructor = d; }\n d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __());\n };\n})();\nvar __decorate$t = (undefined && undefined.__decorate) || function (decorators, target, key, desc) {\n var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d;\n if (typeof Reflect === \"object\" && typeof Reflect.decorate === \"function\") r = Reflect.decorate(decorators, target, key, desc);\n else for (var i = decorators.length - 1; i >= 0; i--) if (d = decorators[i]) r = (c < 3 ? d(r) : c > 3 ? d(target, key, r) : d(target, key)) || r;\n return c > 3 && r && Object.defineProperty(target, key, r), r;\n};\nvar TextFilter = /** @class */ (function (_super) {\n __extends$w(TextFilter, _super);\n function TextFilter() {\n return _super.call(this, 'textFilter') || this;\n }\n TextFilter.trimInput = function (value) {\n var trimmedInput = value && value.trim();\n // trim the input, unless it is all whitespace (this is consistent with Excel behaviour)\n return trimmedInput === '' ? value : trimmedInput;\n };\n TextFilter.prototype.getDefaultDebounceMs = function () {\n return 500;\n };\n TextFilter.prototype.getCleanValue = function (inputField) {\n var value = makeNull(inputField.getValue());\n return this.textFilterParams.trimInput ? TextFilter.trimInput(value) : value;\n };\n TextFilter.prototype.addValueChangedListeners = function () {\n var _this = this;\n var listener = function () { return _this.onUiChanged(); };\n this.eValue1.onValueChange(listener);\n this.eValue2.onValueChange(listener);\n };\n TextFilter.prototype.setParams = function (params) {\n _super.prototype.setParams.call(this, params);\n this.textFilterParams = params;\n this.comparator = this.textFilterParams.textCustomComparator || TextFilter.DEFAULT_COMPARATOR;\n this.formatter = this.textFilterParams.textFormatter ||\n (this.textFilterParams.caseSensitive ? TextFilter.DEFAULT_FORMATTER : TextFilter.DEFAULT_LOWERCASE_FORMATTER);\n this.addValueChangedListeners();\n };\n TextFilter.prototype.setConditionIntoUi = function (model, position) {\n var positionOne = position === ConditionPosition.One;\n var eValue = positionOne ? this.eValue1 : this.eValue2;\n eValue.setValue(model ? model.filter : null);\n };\n TextFilter.prototype.createCondition = function (position) {\n var positionOne = position === ConditionPosition.One;\n var type = positionOne ? this.getCondition1Type() : this.getCondition2Type();\n var eValue = positionOne ? this.eValue1 : this.eValue2;\n var value = this.getCleanValue(eValue);\n eValue.setValue(value, true); // ensure clean value is visible\n var model = {\n filterType: this.getFilterType(),\n type: type\n };\n if (!this.doesFilterHaveHiddenInput(type)) {\n model.filter = value;\n }\n return model;\n };\n TextFilter.prototype.getFilterType = function () {\n return 'text';\n };\n TextFilter.prototype.areSimpleModelsEqual = function (aSimple, bSimple) {\n return aSimple.filter === bSimple.filter && aSimple.type === bSimple.type;\n };\n TextFilter.prototype.resetUiToDefaults = function (silent) {\n var _this = this;\n return _super.prototype.resetUiToDefaults.call(this, silent).then(function () {\n _this.forEachInput(function (field) { return field.setValue(null, silent); });\n _this.resetPlaceholder();\n });\n };\n TextFilter.prototype.resetPlaceholder = function () {\n var globalTranslate = this.gridOptionsWrapper.getLocaleTextFunc();\n var placeholder = this.translate('filterOoo');\n this.forEachInput(function (field) {\n field.setInputPlaceholder(placeholder);\n field.setInputAriaLabel(globalTranslate('ariaFilterValue', 'Filter Value'));\n });\n };\n TextFilter.prototype.forEachInput = function (action) {\n forEach([this.eValue1, this.eValue2], action);\n };\n TextFilter.prototype.setValueFromFloatingFilter = function (value) {\n this.eValue1.setValue(value);\n this.eValue2.setValue(null);\n };\n TextFilter.prototype.getDefaultFilterOptions = function () {\n return TextFilter.DEFAULT_FILTER_OPTIONS;\n };\n TextFilter.prototype.createValueTemplate = function (position) {\n var pos = position === ConditionPosition.One ? '1' : '2';\n return /* html */ \"\\n
\\n \\n
\";\n };\n TextFilter.prototype.updateUiVisibility = function () {\n _super.prototype.updateUiVisibility.call(this);\n setDisplayed(this.eCondition1Body, this.showValueFrom(this.getCondition1Type()));\n setDisplayed(this.eCondition2Body, this.isCondition2Enabled() && this.showValueFrom(this.getCondition2Type()));\n };\n TextFilter.prototype.afterGuiAttached = function (params) {\n _super.prototype.afterGuiAttached.call(this, params);\n this.resetPlaceholder();\n if (!params || !params.suppressFocus) {\n this.eValue1.getInputElement().focus();\n }\n };\n TextFilter.prototype.isConditionUiComplete = function (position) {\n var positionOne = position === ConditionPosition.One;\n var option = positionOne ? this.getCondition1Type() : this.getCondition2Type();\n if (option === SimpleFilter.EMPTY) {\n return false;\n }\n if (this.doesFilterHaveHiddenInput(option)) {\n return true;\n }\n return this.getCleanValue(positionOne ? this.eValue1 : this.eValue2) != null;\n };\n TextFilter.prototype.individualConditionPasses = function (params, filterModel) {\n var filterText = filterModel.filter;\n var filterOption = filterModel.type;\n var cellValue = this.textFilterParams.valueGetter(params.node);\n var cellValueFormatted = this.formatter(cellValue);\n var customFilterOption = this.optionsFactory.getCustomOption(filterOption);\n if (customFilterOption) {\n // only execute the custom filter if a value exists or a value isn't required, i.e. input is hidden\n if (filterText != null || customFilterOption.hideFilterInput) {\n return customFilterOption.test(filterText, cellValueFormatted);\n }\n }\n if (cellValue == null) {\n return filterOption === SimpleFilter.NOT_EQUAL || filterOption === SimpleFilter.NOT_CONTAINS;\n }\n var filterTextFormatted = this.formatter(filterText);\n return this.comparator(filterOption, cellValueFormatted, filterTextFormatted);\n };\n TextFilter.DEFAULT_FILTER_OPTIONS = [\n SimpleFilter.CONTAINS,\n SimpleFilter.NOT_CONTAINS,\n SimpleFilter.EQUALS,\n SimpleFilter.NOT_EQUAL,\n SimpleFilter.STARTS_WITH,\n SimpleFilter.ENDS_WITH\n ];\n TextFilter.DEFAULT_FORMATTER = function (from) { return from; };\n TextFilter.DEFAULT_LOWERCASE_FORMATTER = function (from) { return from == null ? null : from.toString().toLowerCase(); };\n TextFilter.DEFAULT_COMPARATOR = function (filter, value, filterText) {\n switch (filter) {\n case TextFilter.CONTAINS:\n return value.indexOf(filterText) >= 0;\n case TextFilter.NOT_CONTAINS:\n return value.indexOf(filterText) < 0;\n case TextFilter.EQUALS:\n return value === filterText;\n case TextFilter.NOT_EQUAL:\n return value != filterText;\n case TextFilter.STARTS_WITH:\n return value.indexOf(filterText) === 0;\n case TextFilter.ENDS_WITH:\n var index = value.lastIndexOf(filterText);\n return index >= 0 && index === (value.length - filterText.length);\n default:\n // should never happen\n console.warn('invalid filter type ' + filter);\n return false;\n }\n };\n __decorate$t([\n RefSelector('eValue1')\n ], TextFilter.prototype, \"eValue1\", void 0);\n __decorate$t([\n RefSelector('eValue2')\n ], TextFilter.prototype, \"eValue2\", void 0);\n return TextFilter;\n}(SimpleFilter));\n\n/**\n * @ag-grid-community/core - Advanced Data Grid / Data Table supporting Javascript / React / AngularJS / Web Components\n * @version v25.1.0\n * @link http://www.ag-grid.com/\n * @license MIT\n */\nvar __extends$x = (undefined && undefined.__extends) || (function () {\n var extendStatics = function (d, b) {\n extendStatics = Object.setPrototypeOf ||\n ({ __proto__: [] } instanceof Array && function (d, b) { d.__proto__ = b; }) ||\n function (d, b) { for (var p in b) if (b.hasOwnProperty(p)) d[p] = b[p]; };\n return extendStatics(d, b);\n };\n return function (d, b) {\n extendStatics(d, b);\n function __() { this.constructor = d; }\n d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __());\n };\n})();\nvar __decorate$u = (undefined && undefined.__decorate) || function (decorators, target, key, desc) {\n var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d;\n if (typeof Reflect === \"object\" && typeof Reflect.decorate === \"function\") r = Reflect.decorate(decorators, target, key, desc);\n else for (var i = decorators.length - 1; i >= 0; i--) if (d = decorators[i]) r = (c < 3 ? d(r) : c > 3 ? d(target, key, r) : d(target, key)) || r;\n return c > 3 && r && Object.defineProperty(target, key, r), r;\n};\nvar TextInputFloatingFilter = /** @class */ (function (_super) {\n __extends$x(TextInputFloatingFilter, _super);\n function TextInputFloatingFilter() {\n return _super !== null && _super.apply(this, arguments) || this;\n }\n TextInputFloatingFilter.prototype.postConstruct = function () {\n this.setTemplate(/* html */ \"\\n
\\n \\n
\");\n };\n TextInputFloatingFilter.prototype.getDefaultDebounceMs = function () {\n return 500;\n };\n TextInputFloatingFilter.prototype.onParentModelChanged = function (model, event) {\n if (this.isEventFromFloatingFilter(event)) {\n // if the floating filter triggered the change, it is already in sync\n return;\n }\n this.setLastTypeFromModel(model);\n this.eFloatingFilterInput.setValue(this.getTextFromModel(model));\n this.setEditable(this.canWeEditAfterModelFromParentFilter(model));\n };\n TextInputFloatingFilter.prototype.init = function (params) {\n _super.prototype.init.call(this, params);\n this.params = params;\n this.applyActive = ProvidedFilter.isUseApplyButton(this.params.filterParams);\n var debounceMs = ProvidedFilter.getDebounceMs(this.params.filterParams, this.getDefaultDebounceMs());\n var toDebounce = debounce(this.syncUpWithParentFilter.bind(this), debounceMs);\n var filterGui = this.eFloatingFilterInput.getGui();\n this.addManagedListener(filterGui, 'input', toDebounce);\n this.addManagedListener(filterGui, 'keypress', toDebounce);\n this.addManagedListener(filterGui, 'keydown', toDebounce);\n var columnDef = params.column.getDefinition();\n if (columnDef.filterParams &&\n columnDef.filterParams.filterOptions &&\n columnDef.filterParams.filterOptions.length === 1 &&\n columnDef.filterParams.filterOptions[0] === 'inRange') {\n this.eFloatingFilterInput.setDisabled(true);\n }\n var displayName = this.columnController.getDisplayNameForColumn(params.column, 'header', true);\n var translate = this.gridOptionsWrapper.getLocaleTextFunc();\n this.eFloatingFilterInput.setInputAriaLabel(displayName + \" \" + translate('ariaFilterInput', 'Filter Input'));\n };\n TextInputFloatingFilter.prototype.syncUpWithParentFilter = function (e) {\n var _this = this;\n var enterKeyPressed = isKeyPressed(e, KeyCode.ENTER);\n if (this.applyActive && !enterKeyPressed) {\n return;\n }\n var value = this.eFloatingFilterInput.getValue();\n if (this.params.filterParams.trimInput) {\n value = TextFilter.trimInput(value);\n this.eFloatingFilterInput.setValue(value, true); // ensure visible value is trimmed\n }\n this.params.parentFilterInstance(function (filterInstance) {\n if (filterInstance) {\n var simpleFilter = filterInstance;\n simpleFilter.onFloatingFilterChanged(_this.getLastType(), value);\n }\n });\n };\n TextInputFloatingFilter.prototype.setEditable = function (editable) {\n this.eFloatingFilterInput.setDisabled(!editable);\n };\n __decorate$u([\n Autowired('columnController')\n ], TextInputFloatingFilter.prototype, \"columnController\", void 0);\n __decorate$u([\n RefSelector('eFloatingFilterInput')\n ], TextInputFloatingFilter.prototype, \"eFloatingFilterInput\", void 0);\n __decorate$u([\n PostConstruct\n ], TextInputFloatingFilter.prototype, \"postConstruct\", null);\n return TextInputFloatingFilter;\n}(SimpleFloatingFilter));\n\n/**\n * @ag-grid-community/core - Advanced Data Grid / Data Table supporting Javascript / React / AngularJS / Web Components\n * @version v25.1.0\n * @link http://www.ag-grid.com/\n * @license MIT\n */\nvar __extends$y = (undefined && undefined.__extends) || (function () {\n var extendStatics = function (d, b) {\n extendStatics = Object.setPrototypeOf ||\n ({ __proto__: [] } instanceof Array && function (d, b) { d.__proto__ = b; }) ||\n function (d, b) { for (var p in b) if (b.hasOwnProperty(p)) d[p] = b[p]; };\n return extendStatics(d, b);\n };\n return function (d, b) {\n extendStatics(d, b);\n function __() { this.constructor = d; }\n d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __());\n };\n})();\nvar NumberFloatingFilter = /** @class */ (function (_super) {\n __extends$y(NumberFloatingFilter, _super);\n function NumberFloatingFilter() {\n return _super !== null && _super.apply(this, arguments) || this;\n }\n NumberFloatingFilter.prototype.getDefaultFilterOptions = function () {\n return NumberFilter.DEFAULT_FILTER_OPTIONS;\n };\n NumberFloatingFilter.prototype.conditionToString = function (condition) {\n var isRange = condition.type == SimpleFilter.IN_RANGE;\n if (isRange) {\n return condition.filter + \"-\" + condition.filterTo;\n }\n // cater for when the type doesn't need a value\n if (condition.filter != null) {\n return \"\" + condition.filter;\n }\n return \"\" + condition.type;\n };\n return NumberFloatingFilter;\n}(TextInputFloatingFilter));\n\n/**\n * @ag-grid-community/core - Advanced Data Grid / Data Table supporting Javascript / React / AngularJS / Web Components\n * @version v25.1.0\n * @link http://www.ag-grid.com/\n * @license MIT\n */\nvar __extends$z = (undefined && undefined.__extends) || (function () {\n var extendStatics = function (d, b) {\n extendStatics = Object.setPrototypeOf ||\n ({ __proto__: [] } instanceof Array && function (d, b) { d.__proto__ = b; }) ||\n function (d, b) { for (var p in b) if (b.hasOwnProperty(p)) d[p] = b[p]; };\n return extendStatics(d, b);\n };\n return function (d, b) {\n extendStatics(d, b);\n function __() { this.constructor = d; }\n d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __());\n };\n})();\nvar TextFloatingFilter = /** @class */ (function (_super) {\n __extends$z(TextFloatingFilter, _super);\n function TextFloatingFilter() {\n return _super !== null && _super.apply(this, arguments) || this;\n }\n TextFloatingFilter.prototype.conditionToString = function (condition) {\n // it's not possible to have 'in range' for string, so no need to check for it.\n // also cater for when the type doesn't need a value\n if (condition.filter != null) {\n return \"\" + condition.filter;\n }\n else {\n return \"\" + condition.type;\n }\n };\n TextFloatingFilter.prototype.getDefaultFilterOptions = function () {\n return TextFilter.DEFAULT_FILTER_OPTIONS;\n };\n return TextFloatingFilter;\n}(TextInputFloatingFilter));\n\n/**\n * @ag-grid-community/core - Advanced Data Grid / Data Table supporting Javascript / React / AngularJS / Web Components\n * @version v25.1.0\n * @link http://www.ag-grid.com/\n * @license MIT\n */\nvar __extends$A = (undefined && undefined.__extends) || (function () {\n var extendStatics = function (d, b) {\n extendStatics = Object.setPrototypeOf ||\n ({ __proto__: [] } instanceof Array && function (d, b) { d.__proto__ = b; }) ||\n function (d, b) { for (var p in b) if (b.hasOwnProperty(p)) d[p] = b[p]; };\n return extendStatics(d, b);\n };\n return function (d, b) {\n extendStatics(d, b);\n function __() { this.constructor = d; }\n d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __());\n };\n})();\nvar __decorate$v = (undefined && undefined.__decorate) || function (decorators, target, key, desc) {\n var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d;\n if (typeof Reflect === \"object\" && typeof Reflect.decorate === \"function\") r = Reflect.decorate(decorators, target, key, desc);\n else for (var i = decorators.length - 1; i >= 0; i--) if (d = decorators[i]) r = (c < 3 ? d(r) : c > 3 ? d(target, key, r) : d(target, key)) || r;\n return c > 3 && r && Object.defineProperty(target, key, r), r;\n};\nvar RegisteredComponentSource;\n(function (RegisteredComponentSource) {\n RegisteredComponentSource[RegisteredComponentSource[\"DEFAULT\"] = 0] = \"DEFAULT\";\n RegisteredComponentSource[RegisteredComponentSource[\"REGISTERED\"] = 1] = \"REGISTERED\";\n})(RegisteredComponentSource || (RegisteredComponentSource = {}));\nvar UserComponentRegistry = /** @class */ (function (_super) {\n __extends$A(UserComponentRegistry, _super);\n function UserComponentRegistry() {\n var _this = _super !== null && _super.apply(this, arguments) || this;\n _this.agGridDefaults = {\n //date\n agDateInput: DefaultDateComponent,\n //header\n agColumnHeader: HeaderComp,\n agColumnGroupHeader: HeaderGroupComp,\n //floating filters\n agTextColumnFloatingFilter: TextFloatingFilter,\n agNumberColumnFloatingFilter: NumberFloatingFilter,\n agDateColumnFloatingFilter: DateFloatingFilter,\n // renderers\n agAnimateShowChangeCellRenderer: AnimateShowChangeCellRenderer,\n agAnimateSlideCellRenderer: AnimateSlideCellRenderer,\n agGroupCellRenderer: GroupCellRenderer,\n agGroupRowRenderer: GroupCellRenderer,\n agLoadingCellRenderer: LoadingCellRenderer,\n //editors\n agCellEditor: TextCellEditor,\n agTextCellEditor: TextCellEditor,\n agSelectCellEditor: SelectCellEditor,\n agPopupTextCellEditor: PopupTextCellEditor,\n agPopupSelectCellEditor: PopupSelectCellEditor,\n agLargeTextCellEditor: LargeTextCellEditor,\n //filter\n agTextColumnFilter: TextFilter,\n agNumberColumnFilter: NumberFilter,\n agDateColumnFilter: DateFilter,\n //overlays\n agLoadingOverlay: LoadingOverlayComponent$1,\n agNoRowsOverlay: NoRowsOverlayComponent$1,\n // tooltips\n agTooltipComponent: TooltipComponent$1\n };\n _this.agDeprecatedNames = {\n set: {\n newComponentName: 'agSetColumnFilter',\n propertyHolder: 'filter'\n },\n text: {\n newComponentName: 'agTextColumnFilter',\n propertyHolder: 'filter'\n },\n number: {\n newComponentName: 'agNumberColumnFilter',\n propertyHolder: 'filter'\n },\n date: {\n newComponentName: 'agDateColumnFilter',\n propertyHolder: 'filter'\n },\n group: {\n newComponentName: 'agGroupCellRenderer',\n propertyHolder: 'cellRenderer'\n },\n animateShowChange: {\n newComponentName: 'agAnimateShowChangeCellRenderer',\n propertyHolder: 'cellRenderer'\n },\n animateSlide: {\n newComponentName: 'agAnimateSlideCellRenderer',\n propertyHolder: 'cellRenderer'\n },\n select: {\n newComponentName: 'agSelectCellEditor',\n propertyHolder: 'cellEditor'\n },\n largeText: {\n newComponentName: 'agLargeTextCellEditor',\n propertyHolder: 'cellEditor'\n },\n popupSelect: {\n newComponentName: 'agPopupSelectCellEditor',\n propertyHolder: 'cellEditor'\n },\n popupText: {\n newComponentName: 'agPopupTextCellEditor',\n propertyHolder: 'cellEditor'\n },\n richSelect: {\n newComponentName: 'agRichSelectCellEditor',\n propertyHolder: 'cellEditor'\n },\n headerComponent: {\n newComponentName: 'agColumnHeader',\n propertyHolder: 'headerComponent'\n }\n };\n _this.jsComponents = {};\n _this.frameworkComponents = {};\n return _this;\n }\n UserComponentRegistry.prototype.init = function () {\n var _this = this;\n if (this.gridOptions.components != null) {\n iterateObject(this.gridOptions.components, function (key, component) { return _this.registerComponent(key, component); });\n }\n if (this.gridOptions.frameworkComponents != null) {\n iterateObject(this.gridOptions.frameworkComponents, function (key, component) { return _this.registerFwComponent(key, component); });\n }\n };\n UserComponentRegistry.prototype.registerDefaultComponent = function (rawName, component) {\n var name = this.translateIfDeprecated(rawName);\n if (this.agGridDefaults[name]) {\n console.error(\"Trying to overwrite a default component. You should call registerComponent\");\n return;\n }\n this.agGridDefaults[name] = component;\n };\n UserComponentRegistry.prototype.registerComponent = function (rawName, component) {\n var name = this.translateIfDeprecated(rawName);\n if (this.frameworkComponents[name]) {\n console.error(\"Trying to register a component that you have already registered for frameworks: \" + name);\n return;\n }\n this.jsComponents[name] = component;\n };\n /**\n * B the business interface (ie IHeader)\n * A the agGridComponent interface (ie IHeaderComp). The final object acceptable by ag-grid\n */\n UserComponentRegistry.prototype.registerFwComponent = function (rawName, component) {\n var name = this.translateIfDeprecated(rawName);\n if (this.jsComponents[name]) {\n console.error(\"Trying to register a component that you have already registered for plain javascript: \" + name);\n return;\n }\n this.frameworkComponents[name] = component;\n };\n /**\n * B the business interface (ie IHeader)\n * A the agGridComponent interface (ie IHeaderComp). The final object acceptable by ag-grid\n */\n UserComponentRegistry.prototype.retrieve = function (rawName) {\n var name = this.translateIfDeprecated(rawName);\n var frameworkComponent = this.frameworkComponents[name];\n if (frameworkComponent) {\n return {\n componentFromFramework: true,\n component: frameworkComponent,\n source: RegisteredComponentSource.REGISTERED\n };\n }\n var jsComponent = this.jsComponents[name];\n if (jsComponent) {\n return {\n componentFromFramework: false,\n component: jsComponent,\n source: RegisteredComponentSource.REGISTERED\n };\n }\n var defaultComponent = this.agGridDefaults[name];\n if (defaultComponent) {\n return {\n componentFromFramework: false,\n component: defaultComponent,\n source: RegisteredComponentSource.DEFAULT\n };\n }\n if (Object.keys(this.agGridDefaults).indexOf(name) < 0) {\n console.warn(\"AG Grid: Looking for component [\" + name + \"] but it wasn't found.\");\n }\n return null;\n };\n UserComponentRegistry.prototype.translateIfDeprecated = function (raw) {\n var deprecatedInfo = this.agDeprecatedNames[raw];\n if (deprecatedInfo != null) {\n doOnce(function () {\n console.warn(\"ag-grid. Since v15.0 component names have been renamed to be namespaced. You should rename \" + deprecatedInfo.propertyHolder + \":\" + raw + \" to \" + deprecatedInfo.propertyHolder + \":\" + deprecatedInfo.newComponentName);\n }, 'DEPRECATE_COMPONENT_' + raw);\n return deprecatedInfo.newComponentName;\n }\n return raw;\n };\n __decorate$v([\n Autowired('gridOptions')\n ], UserComponentRegistry.prototype, \"gridOptions\", void 0);\n __decorate$v([\n PostConstruct\n ], UserComponentRegistry.prototype, \"init\", null);\n UserComponentRegistry = __decorate$v([\n Bean('userComponentRegistry')\n ], UserComponentRegistry);\n return UserComponentRegistry;\n}(BeanStub));\n\n/**\n * @ag-grid-community/core - Advanced Data Grid / Data Table supporting Javascript / React / AngularJS / Web Components\n * @version v25.1.0\n * @link http://www.ag-grid.com/\n * @license MIT\n */\nvar SideBarDefParser = /** @class */ (function () {\n function SideBarDefParser() {\n }\n SideBarDefParser.parse = function (toParse) {\n if (!toParse) {\n return null;\n }\n if (toParse === true) {\n return {\n toolPanels: [\n SideBarDefParser.DEFAULT_COLUMN_COMP,\n SideBarDefParser.DEFAULT_FILTER_COMP,\n ],\n defaultToolPanel: 'columns'\n };\n }\n if (typeof toParse === 'string') {\n return SideBarDefParser.parse([toParse]);\n }\n if (Array.isArray(toParse)) {\n var comps_1 = [];\n toParse.forEach(function (key) {\n var lookupResult = SideBarDefParser.DEFAULT_BY_KEY[key];\n if (!lookupResult) {\n console.warn(\"ag-grid: the key \" + key + \" is not a valid key for specifying a tool panel, valid keys are: \" + Object.keys(SideBarDefParser.DEFAULT_BY_KEY).join(','));\n return;\n }\n comps_1.push(lookupResult);\n });\n if (comps_1.length === 0) {\n return null;\n }\n return {\n toolPanels: comps_1,\n defaultToolPanel: comps_1[0].id\n };\n }\n var result = {\n toolPanels: SideBarDefParser.parseComponents(toParse.toolPanels),\n defaultToolPanel: toParse.defaultToolPanel,\n hiddenByDefault: toParse.hiddenByDefault,\n position: toParse.position\n };\n return result;\n };\n SideBarDefParser.parseComponents = function (from) {\n var result = [];\n if (!from) {\n return result;\n }\n from.forEach(function (it) {\n var toAdd = null;\n if (typeof it === 'string') {\n var lookupResult = SideBarDefParser.DEFAULT_BY_KEY[it];\n if (!lookupResult) {\n console.warn(\"ag-grid: the key \" + it + \" is not a valid key for specifying a tool panel, valid keys are: \" + Object.keys(SideBarDefParser.DEFAULT_BY_KEY).join(','));\n return;\n }\n toAdd = lookupResult;\n }\n else {\n toAdd = it;\n }\n result.push(toAdd);\n });\n return result;\n };\n SideBarDefParser.DEFAULT_COLUMN_COMP = {\n id: 'columns',\n labelDefault: 'Columns',\n labelKey: 'columns',\n iconKey: 'columns',\n toolPanel: 'agColumnsToolPanel',\n };\n SideBarDefParser.DEFAULT_FILTER_COMP = {\n id: 'filters',\n labelDefault: 'Filters',\n labelKey: 'filters',\n iconKey: 'filter',\n toolPanel: 'agFiltersToolPanel',\n };\n SideBarDefParser.DEFAULT_BY_KEY = {\n columns: SideBarDefParser.DEFAULT_COLUMN_COMP,\n filters: SideBarDefParser.DEFAULT_FILTER_COMP\n };\n return SideBarDefParser;\n}());\n\n/**\n * @ag-grid-community/core - Advanced Data Grid / Data Table supporting Javascript / React / AngularJS / Web Components\n * @version v25.1.0\n * @link http://www.ag-grid.com/\n * @license MIT\n */\nvar __decorate$w = (undefined && undefined.__decorate) || function (decorators, target, key, desc) {\n var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d;\n if (typeof Reflect === \"object\" && typeof Reflect.decorate === \"function\") r = Reflect.decorate(decorators, target, key, desc);\n else for (var i = decorators.length - 1; i >= 0; i--) if (d = decorators[i]) r = (c < 3 ? d(r) : c > 3 ? d(target, key, r) : d(target, key)) || r;\n return c > 3 && r && Object.defineProperty(target, key, r), r;\n};\nvar __param$3 = (undefined && undefined.__param) || function (paramIndex, decorator) {\n return function (target, key) { decorator(target, key, paramIndex); }\n};\nvar __spreadArrays$3 = (undefined && undefined.__spreadArrays) || function () {\n for (var s = 0, i = 0, il = arguments.length; i < il; i++) s += arguments[i].length;\n for (var r = Array(s), k = 0, i = 0; i < il; i++)\n for (var a = arguments[i], j = 0, jl = a.length; j < jl; j++, k++)\n r[k] = a[j];\n return r;\n};\nvar DEFAULT_ROW_HEIGHT = 25;\nvar DEFAULT_DETAIL_ROW_HEIGHT = 300;\nvar DEFAULT_VIEWPORT_ROW_MODEL_PAGE_SIZE = 5;\nvar DEFAULT_VIEWPORT_ROW_MODEL_BUFFER_SIZE = 5;\nvar DEFAULT_KEEP_DETAIL_ROW_COUNT = 10;\nfunction isTrue(value) {\n return value === true || value === 'true';\n}\nfunction toNumber(value) {\n if (typeof value == 'number') {\n return value;\n }\n if (typeof value == 'string') {\n return parseInt(value, 10);\n }\n}\nfunction zeroOrGreater(value, defaultValue) {\n if (value >= 0) {\n return value;\n }\n // zero gets returned if number is missing or the wrong type\n return defaultValue;\n}\nfunction oneOrGreater(value, defaultValue) {\n var valueNumber = parseInt(value, 10);\n if (isNumeric(valueNumber) && valueNumber > 0) {\n return valueNumber;\n }\n return defaultValue;\n}\nvar GridOptionsWrapper = /** @class */ (function () {\n function GridOptionsWrapper() {\n this.propertyEventService = new EventService();\n this.domDataKey = '__AG_' + Math.random().toString();\n this.layoutElements = [];\n this.destroyed = false;\n }\n GridOptionsWrapper_1 = GridOptionsWrapper;\n GridOptionsWrapper.prototype.agWire = function (gridApi, columnApi) {\n this.gridOptions.api = gridApi;\n this.gridOptions.columnApi = columnApi;\n this.checkForDeprecated();\n this.checkForViolations();\n };\n GridOptionsWrapper.prototype.destroy = function () {\n // need to remove these, as we don't own the lifecycle of the gridOptions, we need to\n // remove the references in case the user keeps the grid options, we want the rest\n // of the grid to be picked up by the garbage collector\n this.gridOptions.api = null;\n this.gridOptions.columnApi = null;\n this.removeEventListener(GridOptionsWrapper_1.PROP_DOM_LAYOUT, this.updateLayoutClassesListener);\n this.destroyed = true;\n };\n GridOptionsWrapper.prototype.init = function () {\n var _this = this;\n if (this.gridOptions.suppressPropertyNamesCheck !== true) {\n this.checkGridOptionsProperties();\n this.checkColumnDefProperties();\n }\n // parse side bar options into correct format\n if (this.gridOptions.sideBar != null) {\n this.gridOptions.sideBar = SideBarDefParser.parse(this.gridOptions.sideBar);\n }\n var async = this.useAsyncEvents();\n this.eventService.addGlobalListener(this.globalEventHandler.bind(this), async);\n if (this.isGroupSelectsChildren() && this.isSuppressParentsInRowNodes()) {\n console.warn(\"AG Grid: 'groupSelectsChildren' does not work with 'suppressParentsInRowNodes', this selection method needs the part in rowNode to work\");\n }\n if (this.isGroupSelectsChildren()) {\n if (!this.isRowSelectionMulti()) {\n console.warn(\"AG Grid: rowSelection must be 'multiple' for groupSelectsChildren to make sense\");\n }\n if (this.isRowModelServerSide()) {\n console.warn('AG Grid: group selects children is NOT support for Server Side Row Model. ' +\n 'This is because the rows are lazy loaded, so selecting a group is not possible as' +\n 'the grid has no way of knowing what the children are.');\n }\n }\n if (this.isGroupRemoveSingleChildren() && this.isGroupHideOpenParents()) {\n console.warn(\"AG Grid: groupRemoveSingleChildren and groupHideOpenParents do not work with each other, you need to pick one. And don't ask us how to us these together on our support forum either you will get the same answer!\");\n }\n if (this.isRowModelServerSide()) {\n var msg = function (prop) { return \"AG Grid: '\" + prop + \"' is not supported on the Server-Side Row Model\"; };\n if (exists(this.gridOptions.groupDefaultExpanded)) {\n console.warn(msg('groupDefaultExpanded'));\n }\n if (exists(this.gridOptions.groupDefaultExpanded)) {\n console.warn(msg('groupIncludeFooter'));\n }\n if (exists(this.gridOptions.groupDefaultExpanded)) {\n console.warn(msg('groupIncludeTotalFooter'));\n }\n }\n if (this.isEnableRangeSelection()) {\n ModuleRegistry.assertRegistered(exports.ModuleNames.RangeSelectionModule, 'enableRangeSelection');\n }\n if (!this.isEnableRangeSelection() && (this.isEnableRangeHandle() || this.isEnableFillHandle())) {\n console.warn(\"AG Grid: 'enableRangeHandle' and 'enableFillHandle' will not work unless 'enableRangeSelection' is set to true\");\n }\n var warnOfDeprecaredIcon = function (name) {\n if (_this.gridOptions.icons && _this.gridOptions.icons[name]) {\n console.warn(\"gridOptions.icons.\" + name + \" is no longer supported. For information on how to style checkboxes and radio buttons, see https://www.ag-grid.com/javascript-grid-icons/\");\n }\n };\n warnOfDeprecaredIcon('radioButtonOff');\n warnOfDeprecaredIcon('radioButtonOn');\n warnOfDeprecaredIcon('checkboxChecked');\n warnOfDeprecaredIcon('checkboxUnchecked');\n warnOfDeprecaredIcon('checkboxIndeterminate');\n this.updateLayoutClassesListener = this.updateLayoutClasses.bind(this);\n this.addEventListener(GridOptionsWrapper_1.PROP_DOM_LAYOUT, this.updateLayoutClassesListener);\n // sets an initial calculation for the scrollbar width\n this.getScrollbarWidth();\n };\n GridOptionsWrapper.prototype.checkColumnDefProperties = function () {\n var _this = this;\n if (this.gridOptions.columnDefs == null) {\n return;\n }\n this.gridOptions.columnDefs.forEach(function (colDef) {\n var userProperties = Object.getOwnPropertyNames(colDef);\n var validProperties = __spreadArrays$3(ColDefUtil.ALL_PROPERTIES, ColDefUtil.FRAMEWORK_PROPERTIES);\n _this.checkProperties(userProperties, validProperties, validProperties, 'colDef', 'https://www.ag-grid.com/javascript-grid-column-properties/');\n });\n };\n GridOptionsWrapper.prototype.checkGridOptionsProperties = function () {\n var userProperties = Object.getOwnPropertyNames(this.gridOptions);\n var validProperties = __spreadArrays$3(PropertyKeys.ALL_PROPERTIES, PropertyKeys.FRAMEWORK_PROPERTIES, values(Events).map(function (event) { return ComponentUtil.getCallbackForEvent(event); }));\n var validPropertiesAndExceptions = __spreadArrays$3(validProperties, ['api', 'columnApi']);\n this.checkProperties(userProperties, validPropertiesAndExceptions, validProperties, 'gridOptions', 'https://www.ag-grid.com/javascript-grid-properties/');\n };\n GridOptionsWrapper.prototype.checkProperties = function (userProperties, validPropertiesAndExceptions, validProperties, containerName, docsUrl) {\n var invalidProperties = fuzzyCheckStrings(userProperties, validPropertiesAndExceptions, validProperties);\n iterateObject(invalidProperties, function (key, value) {\n console.warn(\"ag-grid: invalid \" + containerName + \" property '\" + key + \"' did you mean any of these: \" + value.slice(0, 8).join(\", \"));\n });\n if (Object.keys(invalidProperties).length > 0) {\n console.warn(\"ag-grid: to see all the valid \" + containerName + \" properties please check: \" + docsUrl);\n }\n };\n GridOptionsWrapper.prototype.getDomDataKey = function () {\n return this.domDataKey;\n };\n // returns the dom data, or undefined if not found\n GridOptionsWrapper.prototype.getDomData = function (element, key) {\n var domData = element[this.getDomDataKey()];\n return domData ? domData[key] : undefined;\n };\n GridOptionsWrapper.prototype.setDomData = function (element, key, value) {\n var domDataKey = this.getDomDataKey();\n var domData = element[domDataKey];\n if (missing(domData)) {\n domData = {};\n element[domDataKey] = domData;\n }\n domData[key] = value;\n };\n GridOptionsWrapper.prototype.isRowSelection = function () {\n return this.gridOptions.rowSelection === 'single' || this.gridOptions.rowSelection === 'multiple';\n };\n GridOptionsWrapper.prototype.isSuppressRowDeselection = function () {\n return isTrue(this.gridOptions.suppressRowDeselection);\n };\n GridOptionsWrapper.prototype.isRowSelectionMulti = function () {\n return this.gridOptions.rowSelection === 'multiple';\n };\n GridOptionsWrapper.prototype.isRowMultiSelectWithClick = function () {\n return isTrue(this.gridOptions.rowMultiSelectWithClick);\n };\n GridOptionsWrapper.prototype.getContext = function () {\n return this.gridOptions.context;\n };\n GridOptionsWrapper.prototype.isPivotMode = function () {\n return isTrue(this.gridOptions.pivotMode);\n };\n GridOptionsWrapper.prototype.isSuppressExpandablePivotGroups = function () {\n return isTrue(this.gridOptions.suppressExpandablePivotGroups);\n };\n GridOptionsWrapper.prototype.getPivotColumnGroupTotals = function () {\n return this.gridOptions.pivotColumnGroupTotals;\n };\n GridOptionsWrapper.prototype.getPivotRowTotals = function () {\n return this.gridOptions.pivotRowTotals;\n };\n GridOptionsWrapper.prototype.isRowModelInfinite = function () {\n return this.gridOptions.rowModelType === Constants.ROW_MODEL_TYPE_INFINITE;\n };\n GridOptionsWrapper.prototype.isRowModelViewport = function () {\n return this.gridOptions.rowModelType === Constants.ROW_MODEL_TYPE_VIEWPORT;\n };\n GridOptionsWrapper.prototype.isRowModelServerSide = function () {\n return this.gridOptions.rowModelType === Constants.ROW_MODEL_TYPE_SERVER_SIDE;\n };\n GridOptionsWrapper.prototype.isRowModelDefault = function () {\n return (missing(this.gridOptions.rowModelType) ||\n this.gridOptions.rowModelType === Constants.ROW_MODEL_TYPE_CLIENT_SIDE);\n };\n GridOptionsWrapper.prototype.isFullRowEdit = function () {\n return this.gridOptions.editType === 'fullRow';\n };\n GridOptionsWrapper.prototype.isSuppressFocusAfterRefresh = function () {\n return isTrue(this.gridOptions.suppressFocusAfterRefresh);\n };\n GridOptionsWrapper.prototype.isSuppressBrowserResizeObserver = function () {\n return isTrue(this.gridOptions.suppressBrowserResizeObserver);\n };\n GridOptionsWrapper.prototype.isSuppressMaintainUnsortedOrder = function () {\n return isTrue(this.gridOptions.suppressMaintainUnsortedOrder);\n };\n GridOptionsWrapper.prototype.isSuppressClearOnFillReduction = function () {\n return isTrue(this.gridOptions.suppressClearOnFillReduction);\n };\n GridOptionsWrapper.prototype.isShowToolPanel = function () {\n return isTrue(this.gridOptions.sideBar && Array.isArray(this.getSideBar().toolPanels));\n };\n GridOptionsWrapper.prototype.getSideBar = function () {\n return this.gridOptions.sideBar;\n };\n GridOptionsWrapper.prototype.isSuppressTouch = function () {\n return isTrue(this.gridOptions.suppressTouch);\n };\n GridOptionsWrapper.prototype.isApplyColumnDefOrder = function () {\n return isTrue(this.gridOptions.applyColumnDefOrder);\n };\n GridOptionsWrapper.prototype.isSuppressRowTransform = function () {\n return isTrue(this.gridOptions.suppressRowTransform);\n };\n GridOptionsWrapper.prototype.isSuppressColumnStateEvents = function () {\n return isTrue(this.gridOptions.suppressColumnStateEvents);\n };\n GridOptionsWrapper.prototype.isAllowDragFromColumnsToolPanel = function () {\n return isTrue(this.gridOptions.allowDragFromColumnsToolPanel);\n };\n GridOptionsWrapper.prototype.useAsyncEvents = function () {\n return !isTrue(this.gridOptions.suppressAsyncEvents);\n };\n GridOptionsWrapper.prototype.isEnableCellChangeFlash = function () {\n return isTrue(this.gridOptions.enableCellChangeFlash);\n };\n GridOptionsWrapper.prototype.getCellFlashDelay = function () {\n return this.gridOptions.cellFlashDelay || 500;\n };\n GridOptionsWrapper.prototype.getCellFadeDelay = function () {\n return this.gridOptions.cellFadeDelay || 1000;\n };\n GridOptionsWrapper.prototype.isGroupSelectsChildren = function () {\n var result = isTrue(this.gridOptions.groupSelectsChildren);\n if (result && this.isTreeData()) {\n console.warn('AG Grid: groupSelectsChildren does not work with tree data');\n return false;\n }\n return result;\n };\n GridOptionsWrapper.prototype.isSuppressRowHoverHighlight = function () {\n return isTrue(this.gridOptions.suppressRowHoverHighlight);\n };\n GridOptionsWrapper.prototype.isGroupSelectsFiltered = function () {\n return isTrue(this.gridOptions.groupSelectsFiltered);\n };\n GridOptionsWrapper.prototype.isGroupHideOpenParents = function () {\n return isTrue(this.gridOptions.groupHideOpenParents);\n };\n // if we are doing hideOpenParents, then we always have groupMultiAutoColumn, otherwise hideOpenParents would not work\n GridOptionsWrapper.prototype.isGroupMultiAutoColumn = function () {\n return isTrue(this.gridOptions.groupMultiAutoColumn) || isTrue(this.gridOptions.groupHideOpenParents);\n };\n GridOptionsWrapper.prototype.isGroupRemoveSingleChildren = function () {\n return isTrue(this.gridOptions.groupRemoveSingleChildren);\n };\n GridOptionsWrapper.prototype.isGroupRemoveLowestSingleChildren = function () {\n return isTrue(this.gridOptions.groupRemoveLowestSingleChildren);\n };\n GridOptionsWrapper.prototype.isGroupIncludeFooter = function () {\n return isTrue(this.gridOptions.groupIncludeFooter);\n };\n GridOptionsWrapper.prototype.isGroupIncludeTotalFooter = function () {\n return isTrue(this.gridOptions.groupIncludeTotalFooter);\n };\n GridOptionsWrapper.prototype.isGroupSuppressBlankHeader = function () {\n return isTrue(this.gridOptions.groupSuppressBlankHeader);\n };\n GridOptionsWrapper.prototype.isSuppressRowClickSelection = function () {\n return isTrue(this.gridOptions.suppressRowClickSelection);\n };\n GridOptionsWrapper.prototype.isSuppressCellSelection = function () {\n return isTrue(this.gridOptions.suppressCellSelection);\n };\n GridOptionsWrapper.prototype.isSuppressMultiSort = function () {\n return isTrue(this.gridOptions.suppressMultiSort);\n };\n GridOptionsWrapper.prototype.isMultiSortKeyCtrl = function () {\n return this.gridOptions.multiSortKey === 'ctrl';\n };\n GridOptionsWrapper.prototype.isGroupSuppressAutoColumn = function () {\n return isTrue(this.gridOptions.groupSuppressAutoColumn);\n };\n GridOptionsWrapper.prototype.isPivotSuppressAutoColumn = function () {\n return isTrue(this.gridOptions.pivotSuppressAutoColumn);\n };\n GridOptionsWrapper.prototype.isSuppressDragLeaveHidesColumns = function () {\n return isTrue(this.gridOptions.suppressDragLeaveHidesColumns);\n };\n GridOptionsWrapper.prototype.isSuppressScrollOnNewData = function () {\n return isTrue(this.gridOptions.suppressScrollOnNewData);\n };\n GridOptionsWrapper.prototype.isRowDragManaged = function () {\n return isTrue(this.gridOptions.rowDragManaged);\n };\n GridOptionsWrapper.prototype.isSuppressRowDrag = function () {\n return isTrue(this.gridOptions.suppressRowDrag);\n };\n GridOptionsWrapper.prototype.isSuppressMoveWhenRowDragging = function () {\n return isTrue(this.gridOptions.suppressMoveWhenRowDragging);\n };\n GridOptionsWrapper.prototype.isEnableMultiRowDragging = function () {\n return isTrue(this.gridOptions.enableMultiRowDragging);\n };\n // returns either 'print', 'autoHeight' or 'normal' (normal is the default)\n GridOptionsWrapper.prototype.getDomLayout = function () {\n var domLayout = this.gridOptions.domLayout || Constants.DOM_LAYOUT_NORMAL;\n var validLayouts = [\n Constants.DOM_LAYOUT_PRINT,\n Constants.DOM_LAYOUT_AUTO_HEIGHT,\n Constants.DOM_LAYOUT_NORMAL\n ];\n if (validLayouts.indexOf(domLayout) === -1) {\n doOnce(function () {\n return console.warn(\"AG Grid: \" + domLayout + \" is not valid for DOM Layout, valid values are \" + Constants.DOM_LAYOUT_NORMAL + \", \" + Constants.DOM_LAYOUT_AUTO_HEIGHT + \" and \" + Constants.DOM_LAYOUT_PRINT);\n }, 'warn about dom layout values');\n return Constants.DOM_LAYOUT_NORMAL;\n }\n return domLayout;\n };\n GridOptionsWrapper.prototype.isSuppressHorizontalScroll = function () {\n return isTrue(this.gridOptions.suppressHorizontalScroll);\n };\n GridOptionsWrapper.prototype.isSuppressMaxRenderedRowRestriction = function () {\n return isTrue(this.gridOptions.suppressMaxRenderedRowRestriction);\n };\n GridOptionsWrapper.prototype.isExcludeChildrenWhenTreeDataFiltering = function () {\n return isTrue(this.gridOptions.excludeChildrenWhenTreeDataFiltering);\n };\n GridOptionsWrapper.prototype.isAlwaysShowHorizontalScroll = function () {\n return isTrue(this.gridOptions.alwaysShowHorizontalScroll);\n };\n GridOptionsWrapper.prototype.isAlwaysShowVerticalScroll = function () {\n return isTrue(this.gridOptions.alwaysShowVerticalScroll);\n };\n GridOptionsWrapper.prototype.isDebounceVerticalScrollbar = function () {\n return isTrue(this.gridOptions.debounceVerticalScrollbar);\n };\n GridOptionsWrapper.prototype.isSuppressLoadingOverlay = function () {\n return isTrue(this.gridOptions.suppressLoadingOverlay);\n };\n GridOptionsWrapper.prototype.isSuppressNoRowsOverlay = function () {\n return isTrue(this.gridOptions.suppressNoRowsOverlay);\n };\n GridOptionsWrapper.prototype.isSuppressFieldDotNotation = function () {\n return isTrue(this.gridOptions.suppressFieldDotNotation);\n };\n GridOptionsWrapper.prototype.getPinnedTopRowData = function () {\n return this.gridOptions.pinnedTopRowData;\n };\n GridOptionsWrapper.prototype.getPinnedBottomRowData = function () {\n return this.gridOptions.pinnedBottomRowData;\n };\n GridOptionsWrapper.prototype.isFunctionsPassive = function () {\n return isTrue(this.gridOptions.functionsPassive);\n };\n GridOptionsWrapper.prototype.isSuppressChangeDetection = function () {\n return isTrue(this.gridOptions.suppressChangeDetection);\n };\n GridOptionsWrapper.prototype.isSuppressAnimationFrame = function () {\n return isTrue(this.gridOptions.suppressAnimationFrame);\n };\n GridOptionsWrapper.prototype.getQuickFilterText = function () {\n return this.gridOptions.quickFilterText;\n };\n GridOptionsWrapper.prototype.isCacheQuickFilter = function () {\n return isTrue(this.gridOptions.cacheQuickFilter);\n };\n GridOptionsWrapper.prototype.isUnSortIcon = function () {\n return isTrue(this.gridOptions.unSortIcon);\n };\n GridOptionsWrapper.prototype.isSuppressMenuHide = function () {\n return isTrue(this.gridOptions.suppressMenuHide);\n };\n GridOptionsWrapper.prototype.isEnterMovesDownAfterEdit = function () {\n return isTrue(this.gridOptions.enterMovesDownAfterEdit);\n };\n GridOptionsWrapper.prototype.isEnterMovesDown = function () {\n return isTrue(this.gridOptions.enterMovesDown);\n };\n GridOptionsWrapper.prototype.isUndoRedoCellEditing = function () {\n return isTrue(this.gridOptions.undoRedoCellEditing);\n };\n GridOptionsWrapper.prototype.getUndoRedoCellEditingLimit = function () {\n return this.gridOptions.undoRedoCellEditingLimit;\n };\n GridOptionsWrapper.prototype.getRowStyle = function () {\n return this.gridOptions.rowStyle;\n };\n GridOptionsWrapper.prototype.getRowClass = function () {\n return this.gridOptions.rowClass;\n };\n GridOptionsWrapper.prototype.getRowStyleFunc = function () {\n return this.gridOptions.getRowStyle;\n };\n GridOptionsWrapper.prototype.getRowClassFunc = function () {\n return this.gridOptions.getRowClass;\n };\n GridOptionsWrapper.prototype.rowClassRules = function () {\n return this.gridOptions.rowClassRules;\n };\n GridOptionsWrapper.prototype.getServerSideStoreType = function () {\n return this.gridOptions.serverSideStoreType;\n };\n GridOptionsWrapper.prototype.getServerSideStoreParamsFunc = function () {\n return this.gridOptions.getServerSideStoreParams;\n };\n GridOptionsWrapper.prototype.getCreateChartContainerFunc = function () {\n return this.gridOptions.createChartContainer;\n };\n GridOptionsWrapper.prototype.getPopupParent = function () {\n return this.gridOptions.popupParent;\n };\n GridOptionsWrapper.prototype.getBlockLoadDebounceMillis = function () {\n return this.gridOptions.blockLoadDebounceMillis;\n };\n GridOptionsWrapper.prototype.getPostProcessPopupFunc = function () {\n return this.gridOptions.postProcessPopup;\n };\n GridOptionsWrapper.prototype.getPaginationNumberFormatterFunc = function () {\n return this.gridOptions.paginationNumberFormatter;\n };\n GridOptionsWrapper.prototype.getChildCountFunc = function () {\n return this.gridOptions.getChildCount;\n };\n GridOptionsWrapper.prototype.getIsApplyServerSideTransactionFunc = function () {\n return this.gridOptions.isApplyServerSideTransaction;\n };\n GridOptionsWrapper.prototype.getDefaultGroupSortComparator = function () {\n return this.gridOptions.defaultGroupSortComparator;\n };\n GridOptionsWrapper.prototype.getIsFullWidthCellFunc = function () {\n return this.gridOptions.isFullWidthCell;\n };\n GridOptionsWrapper.prototype.getFullWidthCellRendererParams = function () {\n return this.gridOptions.fullWidthCellRendererParams;\n };\n GridOptionsWrapper.prototype.isEmbedFullWidthRows = function () {\n return isTrue(this.gridOptions.embedFullWidthRows) || isTrue(this.gridOptions.deprecatedEmbedFullWidthRows);\n };\n GridOptionsWrapper.prototype.isDetailRowAutoHeight = function () {\n return isTrue(this.gridOptions.detailRowAutoHeight);\n };\n GridOptionsWrapper.prototype.getSuppressKeyboardEventFunc = function () {\n return this.gridOptions.suppressKeyboardEvent;\n };\n GridOptionsWrapper.prototype.getBusinessKeyForNodeFunc = function () {\n return this.gridOptions.getBusinessKeyForNode;\n };\n GridOptionsWrapper.prototype.getApi = function () {\n return this.gridOptions.api;\n };\n GridOptionsWrapper.prototype.getColumnApi = function () {\n return this.gridOptions.columnApi;\n };\n GridOptionsWrapper.prototype.isImmutableData = function () {\n return isTrue(this.gridOptions.immutableData);\n };\n GridOptionsWrapper.prototype.isEnsureDomOrder = function () {\n return isTrue(this.gridOptions.ensureDomOrder);\n };\n GridOptionsWrapper.prototype.isEnableCharts = function () {\n if (isTrue(this.gridOptions.enableCharts)) {\n return ModuleRegistry.assertRegistered(exports.ModuleNames.GridChartsModule, 'enableCharts');\n }\n return false;\n };\n GridOptionsWrapper.prototype.getColResizeDefault = function () {\n return this.gridOptions.colResizeDefault;\n };\n GridOptionsWrapper.prototype.isSingleClickEdit = function () {\n return isTrue(this.gridOptions.singleClickEdit);\n };\n GridOptionsWrapper.prototype.isSuppressClickEdit = function () {\n return isTrue(this.gridOptions.suppressClickEdit);\n };\n GridOptionsWrapper.prototype.isStopEditingWhenGridLosesFocus = function () {\n return isTrue(this.gridOptions.stopEditingWhenGridLosesFocus);\n };\n GridOptionsWrapper.prototype.getGroupDefaultExpanded = function () {\n return this.gridOptions.groupDefaultExpanded;\n };\n GridOptionsWrapper.prototype.getMaxConcurrentDatasourceRequests = function () {\n return this.gridOptions.maxConcurrentDatasourceRequests;\n };\n GridOptionsWrapper.prototype.getMaxBlocksInCache = function () {\n return this.gridOptions.maxBlocksInCache;\n };\n GridOptionsWrapper.prototype.getCacheOverflowSize = function () {\n return this.gridOptions.cacheOverflowSize;\n };\n GridOptionsWrapper.prototype.getPaginationPageSize = function () {\n return toNumber(this.gridOptions.paginationPageSize);\n };\n GridOptionsWrapper.prototype.isPaginateChildRows = function () {\n var shouldPaginate = this.isGroupRemoveSingleChildren() || this.isGroupRemoveLowestSingleChildren();\n if (shouldPaginate) {\n return true;\n }\n return isTrue(this.gridOptions.paginateChildRows);\n };\n GridOptionsWrapper.prototype.getCacheBlockSize = function () {\n return oneOrGreater(this.gridOptions.cacheBlockSize);\n };\n GridOptionsWrapper.prototype.getInfiniteInitialRowCount = function () {\n return this.gridOptions.infiniteInitialRowCount;\n };\n GridOptionsWrapper.prototype.isPurgeClosedRowNodes = function () {\n return isTrue(this.gridOptions.purgeClosedRowNodes);\n };\n GridOptionsWrapper.prototype.isSuppressPaginationPanel = function () {\n return isTrue(this.gridOptions.suppressPaginationPanel);\n };\n GridOptionsWrapper.prototype.getRowData = function () {\n return this.gridOptions.rowData;\n };\n // this property is different - we never allow groupUseEntireRow if in pivot mode,\n // as otherwise we don't see the pivot values.\n GridOptionsWrapper.prototype.isGroupUseEntireRow = function (pivotMode) {\n return pivotMode ? false : isTrue(this.gridOptions.groupUseEntireRow);\n };\n GridOptionsWrapper.prototype.isEnableRtl = function () {\n return isTrue(this.gridOptions.enableRtl);\n };\n GridOptionsWrapper.prototype.getAutoGroupColumnDef = function () {\n return this.gridOptions.autoGroupColumnDef;\n };\n GridOptionsWrapper.prototype.getRowGroupPanelShow = function () {\n return this.gridOptions.rowGroupPanelShow;\n };\n GridOptionsWrapper.prototype.getPivotPanelShow = function () {\n return this.gridOptions.pivotPanelShow;\n };\n GridOptionsWrapper.prototype.isAngularCompileRows = function () {\n return isTrue(this.gridOptions.angularCompileRows);\n };\n GridOptionsWrapper.prototype.isAngularCompileFilters = function () {\n return isTrue(this.gridOptions.angularCompileFilters);\n };\n GridOptionsWrapper.prototype.isDebug = function () {\n return isTrue(this.gridOptions.debug);\n };\n GridOptionsWrapper.prototype.getColumnDefs = function () {\n return this.gridOptions.columnDefs;\n };\n GridOptionsWrapper.prototype.getColumnTypes = function () {\n return this.gridOptions.columnTypes;\n };\n GridOptionsWrapper.prototype.getDatasource = function () {\n return this.gridOptions.datasource;\n };\n GridOptionsWrapper.prototype.getViewportDatasource = function () {\n return this.gridOptions.viewportDatasource;\n };\n GridOptionsWrapper.prototype.getServerSideDatasource = function () {\n return this.gridOptions.serverSideDatasource;\n };\n GridOptionsWrapper.prototype.isAccentedSort = function () {\n return isTrue(this.gridOptions.accentedSort);\n };\n GridOptionsWrapper.prototype.isEnableBrowserTooltips = function () {\n return isTrue(this.gridOptions.enableBrowserTooltips);\n };\n GridOptionsWrapper.prototype.isEnableCellExpressions = function () {\n return isTrue(this.gridOptions.enableCellExpressions);\n };\n GridOptionsWrapper.prototype.isEnableGroupEdit = function () {\n return isTrue(this.gridOptions.enableGroupEdit);\n };\n GridOptionsWrapper.prototype.isSuppressMiddleClickScrolls = function () {\n return isTrue(this.gridOptions.suppressMiddleClickScrolls);\n };\n GridOptionsWrapper.prototype.isPreventDefaultOnContextMenu = function () {\n return isTrue(this.gridOptions.preventDefaultOnContextMenu);\n };\n GridOptionsWrapper.prototype.isSuppressPreventDefaultOnMouseWheel = function () {\n return isTrue(this.gridOptions.suppressPreventDefaultOnMouseWheel);\n };\n GridOptionsWrapper.prototype.isSuppressColumnVirtualisation = function () {\n return isTrue(this.gridOptions.suppressColumnVirtualisation);\n };\n GridOptionsWrapper.prototype.isSuppressContextMenu = function () {\n return isTrue(this.gridOptions.suppressContextMenu);\n };\n GridOptionsWrapper.prototype.isAllowContextMenuWithControlKey = function () {\n return isTrue(this.gridOptions.allowContextMenuWithControlKey);\n };\n GridOptionsWrapper.prototype.isSuppressCopyRowsToClipboard = function () {\n return isTrue(this.gridOptions.suppressCopyRowsToClipboard);\n };\n GridOptionsWrapper.prototype.isCopyHeadersToClipboard = function () {\n return isTrue(this.gridOptions.copyHeadersToClipboard);\n };\n GridOptionsWrapper.prototype.isSuppressClipboardPaste = function () {\n return isTrue(this.gridOptions.suppressClipboardPaste);\n };\n GridOptionsWrapper.prototype.isSuppressLastEmptyLineOnPaste = function () {\n return isTrue(this.gridOptions.suppressLastEmptyLineOnPaste);\n };\n GridOptionsWrapper.prototype.isPagination = function () {\n return isTrue(this.gridOptions.pagination);\n };\n GridOptionsWrapper.prototype.isSuppressEnterpriseResetOnNewColumns = function () {\n return isTrue(this.gridOptions.suppressEnterpriseResetOnNewColumns);\n };\n GridOptionsWrapper.prototype.getProcessDataFromClipboardFunc = function () {\n return this.gridOptions.processDataFromClipboard;\n };\n GridOptionsWrapper.prototype.getAsyncTransactionWaitMillis = function () {\n return exists(this.gridOptions.asyncTransactionWaitMillis) ? this.gridOptions.asyncTransactionWaitMillis : Constants.BATCH_WAIT_MILLIS;\n };\n GridOptionsWrapper.prototype.isSuppressMovableColumns = function () {\n return isTrue(this.gridOptions.suppressMovableColumns);\n };\n GridOptionsWrapper.prototype.isAnimateRows = function () {\n // never allow animating if enforcing the row order\n if (this.isEnsureDomOrder()) {\n return false;\n }\n return isTrue(this.gridOptions.animateRows);\n };\n GridOptionsWrapper.prototype.isSuppressColumnMoveAnimation = function () {\n return isTrue(this.gridOptions.suppressColumnMoveAnimation);\n };\n GridOptionsWrapper.prototype.isSuppressAggFuncInHeader = function () {\n return isTrue(this.gridOptions.suppressAggFuncInHeader);\n };\n GridOptionsWrapper.prototype.isSuppressAggAtRootLevel = function () {\n return isTrue(this.gridOptions.suppressAggAtRootLevel);\n };\n GridOptionsWrapper.prototype.isSuppressAggFilteredOnly = function () {\n return isTrue(this.gridOptions.suppressAggFilteredOnly);\n };\n GridOptionsWrapper.prototype.isShowOpenedGroup = function () {\n return isTrue(this.gridOptions.showOpenedGroup);\n };\n GridOptionsWrapper.prototype.isEnableRangeSelection = function () {\n return ModuleRegistry.isRegistered(exports.ModuleNames.RangeSelectionModule) && isTrue(this.gridOptions.enableRangeSelection);\n };\n GridOptionsWrapper.prototype.isEnableRangeHandle = function () {\n return isTrue(this.gridOptions.enableRangeHandle);\n };\n GridOptionsWrapper.prototype.isEnableFillHandle = function () {\n return isTrue(this.gridOptions.enableFillHandle);\n };\n GridOptionsWrapper.prototype.getFillHandleDirection = function () {\n var direction = this.gridOptions.fillHandleDirection;\n if (!direction) {\n return 'xy';\n }\n if (direction !== 'x' && direction !== 'y' && direction !== 'xy') {\n doOnce(function () { return console.warn(\"AG Grid: valid values for fillHandleDirection are 'x', 'y' and 'xy'. Default to 'xy'.\"); }, 'warn invalid fill direction');\n return 'xy';\n }\n return direction;\n };\n GridOptionsWrapper.prototype.getFillOperation = function () {\n return this.gridOptions.fillOperation;\n };\n GridOptionsWrapper.prototype.isSuppressMultiRangeSelection = function () {\n return isTrue(this.gridOptions.suppressMultiRangeSelection);\n };\n GridOptionsWrapper.prototype.isPaginationAutoPageSize = function () {\n return isTrue(this.gridOptions.paginationAutoPageSize);\n };\n GridOptionsWrapper.prototype.isRememberGroupStateWhenNewData = function () {\n return isTrue(this.gridOptions.rememberGroupStateWhenNewData);\n };\n GridOptionsWrapper.prototype.getIcons = function () {\n return this.gridOptions.icons;\n };\n GridOptionsWrapper.prototype.getAggFuncs = function () {\n return this.gridOptions.aggFuncs;\n };\n GridOptionsWrapper.prototype.getSortingOrder = function () {\n return this.gridOptions.sortingOrder;\n };\n GridOptionsWrapper.prototype.getAlignedGrids = function () {\n return this.gridOptions.alignedGrids;\n };\n GridOptionsWrapper.prototype.isMasterDetail = function () {\n var masterDetail = isTrue(this.gridOptions.masterDetail);\n if (masterDetail) {\n return ModuleRegistry.assertRegistered(exports.ModuleNames.MasterDetailModule, 'masterDetail');\n }\n else {\n return false;\n }\n };\n GridOptionsWrapper.prototype.isKeepDetailRows = function () {\n return isTrue(this.gridOptions.keepDetailRows);\n };\n GridOptionsWrapper.prototype.getKeepDetailRowsCount = function () {\n var keepDetailRowsCount = this.gridOptions.keepDetailRowsCount;\n if (exists(keepDetailRowsCount) && keepDetailRowsCount > 0) {\n return this.gridOptions.keepDetailRowsCount;\n }\n return DEFAULT_KEEP_DETAIL_ROW_COUNT;\n };\n GridOptionsWrapper.prototype.getIsRowMasterFunc = function () {\n return this.gridOptions.isRowMaster;\n };\n GridOptionsWrapper.prototype.getIsRowSelectableFunc = function () {\n return this.gridOptions.isRowSelectable;\n };\n GridOptionsWrapper.prototype.getGroupRowRendererParams = function () {\n return this.gridOptions.groupRowRendererParams;\n };\n GridOptionsWrapper.prototype.getOverlayLoadingTemplate = function () {\n return this.gridOptions.overlayLoadingTemplate;\n };\n GridOptionsWrapper.prototype.getOverlayNoRowsTemplate = function () {\n return this.gridOptions.overlayNoRowsTemplate;\n };\n GridOptionsWrapper.prototype.isSuppressAutoSize = function () {\n return isTrue(this.gridOptions.suppressAutoSize);\n };\n GridOptionsWrapper.prototype.isEnableCellTextSelection = function () {\n return isTrue(this.gridOptions.enableCellTextSelection);\n };\n GridOptionsWrapper.prototype.isSuppressParentsInRowNodes = function () {\n return isTrue(this.gridOptions.suppressParentsInRowNodes);\n };\n GridOptionsWrapper.prototype.isSuppressClipboardApi = function () {\n return isTrue(this.gridOptions.suppressClipboardApi);\n };\n GridOptionsWrapper.prototype.isFunctionsReadOnly = function () {\n return isTrue(this.gridOptions.functionsReadOnly);\n };\n GridOptionsWrapper.prototype.isFloatingFilter = function () {\n return this.gridOptions.floatingFilter;\n };\n GridOptionsWrapper.prototype.isEnableCellTextSelect = function () {\n return isTrue(this.gridOptions.enableCellTextSelection);\n };\n GridOptionsWrapper.prototype.isEnableOldSetFilterModel = function () {\n return isTrue(this.gridOptions.enableOldSetFilterModel);\n };\n GridOptionsWrapper.prototype.getDefaultColDef = function () {\n return this.gridOptions.defaultColDef;\n };\n GridOptionsWrapper.prototype.getDefaultColGroupDef = function () {\n return this.gridOptions.defaultColGroupDef;\n };\n GridOptionsWrapper.prototype.getDefaultExportParams = function () {\n return this.gridOptions.defaultExportParams;\n };\n GridOptionsWrapper.prototype.isSuppressCsvExport = function () {\n return isTrue(this.gridOptions.suppressCsvExport);\n };\n GridOptionsWrapper.prototype.isAllowShowChangeAfterFilter = function () {\n return isTrue(this.gridOptions.allowShowChangeAfterFilter);\n };\n GridOptionsWrapper.prototype.isSuppressExcelExport = function () {\n return isTrue(this.gridOptions.suppressExcelExport);\n };\n GridOptionsWrapper.prototype.isSuppressMakeColumnVisibleAfterUnGroup = function () {\n return isTrue(this.gridOptions.suppressMakeColumnVisibleAfterUnGroup);\n };\n GridOptionsWrapper.prototype.getDataPathFunc = function () {\n return this.gridOptions.getDataPath;\n };\n GridOptionsWrapper.prototype.getIsServerSideGroupFunc = function () {\n return this.gridOptions.isServerSideGroup;\n };\n GridOptionsWrapper.prototype.getIsServerSideGroupOpenByDefaultFunc = function () {\n return this.gridOptions.isServerSideGroupOpenByDefault;\n };\n GridOptionsWrapper.prototype.getServerSideGroupKeyFunc = function () {\n return this.gridOptions.getServerSideGroupKey;\n };\n GridOptionsWrapper.prototype.getGroupRowAggNodesFunc = function () {\n return this.gridOptions.groupRowAggNodes;\n };\n GridOptionsWrapper.prototype.getContextMenuItemsFunc = function () {\n return this.gridOptions.getContextMenuItems;\n };\n GridOptionsWrapper.prototype.getMainMenuItemsFunc = function () {\n return this.gridOptions.getMainMenuItems;\n };\n GridOptionsWrapper.prototype.getRowNodeIdFunc = function () {\n return this.gridOptions.getRowNodeId;\n };\n GridOptionsWrapper.prototype.getNavigateToNextHeaderFunc = function () {\n return this.gridOptions.navigateToNextHeader;\n };\n GridOptionsWrapper.prototype.getTabToNextHeaderFunc = function () {\n return this.gridOptions.tabToNextHeader;\n };\n GridOptionsWrapper.prototype.getNavigateToNextCellFunc = function () {\n return this.gridOptions.navigateToNextCell;\n };\n GridOptionsWrapper.prototype.getTabToNextCellFunc = function () {\n return this.gridOptions.tabToNextCell;\n };\n GridOptionsWrapper.prototype.isTreeData = function () {\n var usingTreeData = isTrue(this.gridOptions.treeData);\n if (usingTreeData) {\n return ModuleRegistry.assertRegistered(exports.ModuleNames.RowGroupingModule, 'Tree Data');\n }\n else {\n return false;\n }\n };\n GridOptionsWrapper.prototype.isValueCache = function () {\n return isTrue(this.gridOptions.valueCache);\n };\n GridOptionsWrapper.prototype.isValueCacheNeverExpires = function () {\n return isTrue(this.gridOptions.valueCacheNeverExpires);\n };\n GridOptionsWrapper.prototype.isDeltaSort = function () {\n return isTrue(this.gridOptions.deltaSort);\n };\n GridOptionsWrapper.prototype.isAggregateOnlyChangedColumns = function () {\n return isTrue(this.gridOptions.aggregateOnlyChangedColumns);\n };\n GridOptionsWrapper.prototype.getProcessSecondaryColDefFunc = function () {\n return this.gridOptions.processSecondaryColDef;\n };\n GridOptionsWrapper.prototype.getProcessSecondaryColGroupDefFunc = function () {\n return this.gridOptions.processSecondaryColGroupDef;\n };\n GridOptionsWrapper.prototype.getSendToClipboardFunc = function () {\n return this.gridOptions.sendToClipboard;\n };\n GridOptionsWrapper.prototype.getProcessRowPostCreateFunc = function () {\n return this.gridOptions.processRowPostCreate;\n };\n GridOptionsWrapper.prototype.getProcessCellForClipboardFunc = function () {\n return this.gridOptions.processCellForClipboard;\n };\n GridOptionsWrapper.prototype.getProcessHeaderForClipboardFunc = function () {\n return this.gridOptions.processHeaderForClipboard;\n };\n GridOptionsWrapper.prototype.getProcessCellFromClipboardFunc = function () {\n return this.gridOptions.processCellFromClipboard;\n };\n GridOptionsWrapper.prototype.getViewportRowModelPageSize = function () {\n return oneOrGreater(this.gridOptions.viewportRowModelPageSize, DEFAULT_VIEWPORT_ROW_MODEL_PAGE_SIZE);\n };\n GridOptionsWrapper.prototype.getViewportRowModelBufferSize = function () {\n return zeroOrGreater(this.gridOptions.viewportRowModelBufferSize, DEFAULT_VIEWPORT_ROW_MODEL_BUFFER_SIZE);\n };\n GridOptionsWrapper.prototype.isServerSideSortingAlwaysResets = function () {\n return isTrue(this.gridOptions.serverSideSortingAlwaysResets);\n };\n GridOptionsWrapper.prototype.isServerSideFilteringAlwaysResets = function () {\n return isTrue(this.gridOptions.serverSideFilteringAlwaysResets);\n };\n GridOptionsWrapper.prototype.getPostSortFunc = function () {\n return this.gridOptions.postSort;\n };\n GridOptionsWrapper.prototype.getChartToolbarItemsFunc = function () {\n return this.gridOptions.getChartToolbarItems;\n };\n GridOptionsWrapper.prototype.getChartThemeOverrides = function () {\n return this.gridOptions.chartThemeOverrides;\n };\n GridOptionsWrapper.prototype.getCustomChartThemes = function () {\n return this.gridOptions.customChartThemes;\n };\n GridOptionsWrapper.prototype.getChartThemes = function () {\n // return default themes if user hasn't supplied any\n return this.gridOptions.chartThemes || ['ag-default', 'ag-material', 'ag-pastel', 'ag-vivid', 'ag-solar'];\n };\n GridOptionsWrapper.prototype.getProcessChartOptionsFunc = function () {\n return this.gridOptions.processChartOptions;\n };\n GridOptionsWrapper.prototype.getClipboardDeliminator = function () {\n return exists(this.gridOptions.clipboardDeliminator) ? this.gridOptions.clipboardDeliminator : '\\t';\n };\n GridOptionsWrapper.prototype.setProperty = function (key, value, force) {\n if (force === void 0) { force = false; }\n var gridOptionsNoType = this.gridOptions;\n var previousValue = gridOptionsNoType[key];\n if (force || previousValue !== value) {\n gridOptionsNoType[key] = value;\n var event_1 = {\n type: key,\n currentValue: value,\n previousValue: previousValue\n };\n this.propertyEventService.dispatchEvent(event_1);\n }\n };\n // this logic is repeated in lots of places. any element that had different CSS\n // dependent on the layout needs to have the layout class added ot it.\n GridOptionsWrapper.prototype.addLayoutElement = function (element) {\n this.layoutElements.push(element);\n this.updateLayoutClasses();\n };\n GridOptionsWrapper.prototype.updateLayoutClasses = function () {\n var domLayout = this.getDomLayout();\n var domLayoutAutoHeight = domLayout === Constants.DOM_LAYOUT_AUTO_HEIGHT;\n var domLayoutPrint = domLayout === Constants.DOM_LAYOUT_PRINT;\n var domLayoutNormal = domLayout === Constants.DOM_LAYOUT_NORMAL;\n this.layoutElements.forEach(function (e) {\n addOrRemoveCssClass(e, 'ag-layout-auto-height', domLayoutAutoHeight);\n addOrRemoveCssClass(e, 'ag-layout-normal', domLayoutNormal);\n addOrRemoveCssClass(e, 'ag-layout-print', domLayoutPrint);\n });\n };\n GridOptionsWrapper.prototype.addEventListener = function (key, listener) {\n this.propertyEventService.addEventListener(key, listener);\n };\n GridOptionsWrapper.prototype.removeEventListener = function (key, listener) {\n this.propertyEventService.removeEventListener(key, listener);\n };\n GridOptionsWrapper.prototype.isSkipHeaderOnAutoSize = function () {\n return !!this.gridOptions.skipHeaderOnAutoSize;\n };\n GridOptionsWrapper.prototype.getAutoSizePadding = function () {\n var value = this.gridOptions.autoSizePadding;\n return value != null && value >= 0 ? value : 20;\n };\n // properties\n GridOptionsWrapper.prototype.getHeaderHeight = function () {\n if (typeof this.gridOptions.headerHeight === 'number') {\n return this.gridOptions.headerHeight;\n }\n return this.getFromTheme(25, 'headerHeight');\n };\n GridOptionsWrapper.prototype.getFloatingFiltersHeight = function () {\n if (typeof this.gridOptions.floatingFiltersHeight === 'number') {\n return this.gridOptions.floatingFiltersHeight;\n }\n return this.getFromTheme(25, 'headerHeight');\n };\n GridOptionsWrapper.prototype.getGroupHeaderHeight = function () {\n if (typeof this.gridOptions.groupHeaderHeight === 'number') {\n return this.gridOptions.groupHeaderHeight;\n }\n return this.getHeaderHeight();\n };\n GridOptionsWrapper.prototype.getPivotHeaderHeight = function () {\n if (typeof this.gridOptions.pivotHeaderHeight === 'number') {\n return this.gridOptions.pivotHeaderHeight;\n }\n return this.getHeaderHeight();\n };\n GridOptionsWrapper.prototype.getPivotGroupHeaderHeight = function () {\n if (typeof this.gridOptions.pivotGroupHeaderHeight === 'number') {\n return this.gridOptions.pivotGroupHeaderHeight;\n }\n return this.getGroupHeaderHeight();\n };\n GridOptionsWrapper.prototype.isExternalFilterPresent = function () {\n if (typeof this.gridOptions.isExternalFilterPresent === 'function') {\n return this.gridOptions.isExternalFilterPresent();\n }\n return false;\n };\n GridOptionsWrapper.prototype.doesExternalFilterPass = function (node) {\n if (typeof this.gridOptions.doesExternalFilterPass === 'function') {\n return this.gridOptions.doesExternalFilterPass(node);\n }\n return false;\n };\n GridOptionsWrapper.prototype.getTooltipShowDelay = function () {\n var tooltipShowDelay = this.gridOptions.tooltipShowDelay;\n if (exists(tooltipShowDelay)) {\n if (tooltipShowDelay < 0) {\n console.warn('ag-grid: tooltipShowDelay should not be lower than 0');\n }\n return Math.max(200, tooltipShowDelay);\n }\n return null;\n };\n GridOptionsWrapper.prototype.isTooltipMouseTrack = function () {\n return isTrue(this.gridOptions.tooltipMouseTrack);\n };\n GridOptionsWrapper.prototype.isSuppressModelUpdateAfterUpdateTransaction = function () {\n return isTrue(this.gridOptions.suppressModelUpdateAfterUpdateTransaction);\n };\n GridOptionsWrapper.prototype.getDocument = function () {\n // if user is providing document, we use the users one,\n // otherwise we use the document on the global namespace.\n var result = null;\n if (this.gridOptions.getDocument && exists(this.gridOptions.getDocument)) {\n result = this.gridOptions.getDocument();\n }\n if (result && exists(result)) {\n return result;\n }\n return document;\n };\n GridOptionsWrapper.prototype.getMinColWidth = function () {\n var minColWidth = this.gridOptions.minColWidth;\n if (exists(minColWidth) && minColWidth > GridOptionsWrapper_1.MIN_COL_WIDTH) {\n return this.gridOptions.minColWidth;\n }\n var measuredMin = this.getFromTheme(null, 'headerCellMinWidth');\n return exists(measuredMin) ? Math.max(measuredMin, GridOptionsWrapper_1.MIN_COL_WIDTH) : GridOptionsWrapper_1.MIN_COL_WIDTH;\n };\n GridOptionsWrapper.prototype.getMaxColWidth = function () {\n if (this.gridOptions.maxColWidth && this.gridOptions.maxColWidth > GridOptionsWrapper_1.MIN_COL_WIDTH) {\n return this.gridOptions.maxColWidth;\n }\n return null;\n };\n GridOptionsWrapper.prototype.getColWidth = function () {\n if (typeof this.gridOptions.colWidth !== 'number' || this.gridOptions.colWidth < GridOptionsWrapper_1.MIN_COL_WIDTH) {\n return 200;\n }\n return this.gridOptions.colWidth;\n };\n GridOptionsWrapper.prototype.getRowBuffer = function () {\n var rowBuffer = this.gridOptions.rowBuffer;\n if (typeof rowBuffer === 'number') {\n if (rowBuffer < 0) {\n doOnce(function () { return console.warn(\"AG Grid: rowBuffer should not be negative\"); }, 'warn rowBuffer negative');\n this.gridOptions.rowBuffer = rowBuffer = 0;\n }\n }\n else {\n rowBuffer = Constants.ROW_BUFFER_SIZE;\n }\n return rowBuffer;\n };\n GridOptionsWrapper.prototype.getRowBufferInPixels = function () {\n var rowsToBuffer = this.getRowBuffer();\n var defaultRowHeight = this.getRowHeightAsNumber();\n return rowsToBuffer * defaultRowHeight;\n };\n // the user might be using some non-standard scrollbar, eg a scrollbar that has zero\n // width and overlays (like the Safari scrollbar, but presented in Chrome). so we\n // allow the user to provide the scroll width before we work it out.\n GridOptionsWrapper.prototype.getScrollbarWidth = function () {\n if (this.scrollbarWidth == null) {\n var useGridOptions = typeof this.gridOptions.scrollbarWidth === 'number' && this.gridOptions.scrollbarWidth >= 0;\n var scrollbarWidth = useGridOptions ? this.gridOptions.scrollbarWidth : getScrollbarWidth();\n if (scrollbarWidth != null) {\n this.scrollbarWidth = scrollbarWidth;\n this.eventService.dispatchEvent({\n type: Events.EVENT_SCROLLBAR_WIDTH_CHANGED\n });\n }\n }\n return this.scrollbarWidth;\n };\n GridOptionsWrapper.prototype.checkForDeprecated = function () {\n // casting to generic object, so typescript compiles even though\n // we are looking for attributes that don't exist\n var options = this.gridOptions;\n if (options.deprecatedEmbedFullWidthRows) {\n console.warn(\"AG Grid: since v21.2, deprecatedEmbedFullWidthRows has been replaced with embedFullWidthRows.\");\n }\n if (options.enableOldSetFilterModel) {\n console.warn('AG Grid: since v22.x, enableOldSetFilterModel is deprecated. Please move to the new Set Filter Model as the old one may not be supported in v23 onwards.');\n }\n if (options.floatingFilter) {\n console.warn('AG Grid: since v23.1, floatingFilter on the gridOptions is deprecated. Please use floatingFilter on the colDef instead.');\n if (!options.defaultColDef) {\n options.defaultColDef = {};\n }\n if (options.defaultColDef.floatingFilter == null) {\n options.defaultColDef.floatingFilter = true;\n }\n }\n if (options.rowDeselection) {\n console.warn('AG Grid: since v24.x, rowDeselection is deprecated and the behaviour is true by default. Please use `suppressRowDeselection` to prevent rows from being deselected.');\n }\n var checkRenamedProperty = function (oldProp, newProp, version) {\n if (options[oldProp] != null) {\n console.warn(\"ag-grid: since version \" + version + \", '\" + oldProp + \"' is deprecated / renamed, please use the new property name '\" + newProp + \"' instead.\");\n if (options[newProp] == null) {\n options[newProp] = options[oldProp];\n }\n }\n };\n checkRenamedProperty('batchUpdateWaitMillis', 'asyncTransactionWaitMillis', '23.1.x');\n checkRenamedProperty('deltaRowDataMode', 'immutableData', '23.1.x');\n if (options.immutableColumns || options.deltaColumnMode) {\n console.warn('AG Grid: since v24.0, immutableColumns and deltaColumnMode properties are gone. The grid now works like this as default. To keep column order maintained, set grid property applyColumnDefOrder=true');\n }\n checkRenamedProperty('suppressSetColumnStateEvents', 'suppressColumnStateEvents', '24.0.x');\n if (options.groupRowInnerRenderer || options.groupRowInnerRendererParams || options.groupRowInnerRendererFramework) {\n console.warn('AG Grid: since v24.0, grid properties groupRowInnerRenderer, groupRowInnerRendererFramework and groupRowInnerRendererParams are no longer used.');\n console.warn(' Instead use the grid properties groupRowRendererParams.innerRenderer, groupRowRendererParams.innerRendererFramework and groupRowRendererParams.innerRendererParams.');\n console.warn(' For example instead of this:');\n console.warn(' groupRowInnerRenderer: \"myRenderer\"');\n console.warn(' groupRowInnerRendererParams: {x: a}');\n console.warn(' Replace with this:');\n console.warn(' groupRowRendererParams: {');\n console.warn(' innerRenderer: \"myRenderer\",');\n console.warn(' innerRendererParams: {x: a}');\n console.warn(' }');\n console.warn(' We have copied the properties over for you. However to stop this error message, please change your application code.');\n if (!options.groupRowRendererParams) {\n options.groupRowRendererParams = {};\n }\n var params = options.groupRowRendererParams;\n if (options.groupRowInnerRenderer) {\n params.innerRenderer = options.groupRowInnerRenderer;\n }\n if (options.groupRowInnerRendererParams) {\n params.innerRendererParams = options.groupRowInnerRendererParams;\n }\n if (options.groupRowInnerRendererFramework) {\n params.innerRendererFramework = options.groupRowInnerRendererFramework;\n }\n }\n if (options.rememberGroupStateWhenNewData) {\n console.warn('AG Grid: since v24.0, grid property rememberGroupStateWhenNewData is deprecated. This feature was provided before Transaction Updates worked (which keep group state). Now that transaction updates are possible and they keep group state, this feature is no longer needed.');\n }\n if (options.detailCellRendererParams && options.detailCellRendererParams.autoHeight) {\n console.warn('AG Grid: since v24.1, grid property detailCellRendererParams.autoHeight is replaced with grid property detailRowAutoHeight. This allows this feature to work when you provide a custom DetailCellRenderer');\n options.detailRowAutoHeight = true;\n }\n if (options.suppressKeyboardEvent) {\n console.warn(\"AG Grid: since v24.1 suppressKeyboardEvent in the gridOptions has been deprecated and will be removed in\\n future versions of AG Grid. If you need this to be set for every column use the defaultColDef property.\");\n }\n if (options.suppressEnterpriseResetOnNewColumns) {\n console.warn('AG Grid: since v25, grid property suppressEnterpriseResetOnNewColumns is deprecated. This was a temporary property to allow changing columns in Server Side Row Model without triggering a reload. Now that it is possible to dynamically change columns in the grid, this is no longer needed.');\n options.detailRowAutoHeight = true;\n }\n };\n GridOptionsWrapper.prototype.checkForViolations = function () {\n if (this.isTreeData()) {\n this.treeDataViolations();\n }\n };\n GridOptionsWrapper.prototype.treeDataViolations = function () {\n if (this.isRowModelDefault()) {\n if (missing(this.getDataPathFunc())) {\n console.warn('AG Grid: property usingTreeData=true with rowModel=clientSide, but you did not ' +\n 'provide getDataPath function, please provide getDataPath function if using tree data.');\n }\n }\n if (this.isRowModelServerSide()) {\n if (missing(this.getIsServerSideGroupFunc())) {\n console.warn('AG Grid: property usingTreeData=true with rowModel=serverSide, but you did not ' +\n 'provide isServerSideGroup function, please provide isServerSideGroup function if using tree data.');\n }\n if (missing(this.getServerSideGroupKeyFunc())) {\n console.warn('AG Grid: property usingTreeData=true with rowModel=serverSide, but you did not ' +\n 'provide getServerSideGroupKey function, please provide getServerSideGroupKey function if using tree data.');\n }\n }\n };\n GridOptionsWrapper.prototype.getLocaleTextFunc = function () {\n if (this.gridOptions.localeTextFunc) {\n return this.gridOptions.localeTextFunc;\n }\n var localeText = this.gridOptions.localeText;\n return function (key, defaultValue) {\n return localeText && localeText[key] ? localeText[key] : defaultValue;\n };\n };\n // responsible for calling the onXXX functions on gridOptions\n GridOptionsWrapper.prototype.globalEventHandler = function (eventName, event) {\n // prevent events from being fired _after_ the grid has been destroyed\n if (this.destroyed) {\n return;\n }\n var callbackMethodName = ComponentUtil.getCallbackForEvent(eventName);\n if (typeof this.gridOptions[callbackMethodName] === 'function') {\n this.gridOptions[callbackMethodName](event);\n }\n };\n // we don't allow dynamic row height for virtual paging\n GridOptionsWrapper.prototype.getRowHeightAsNumber = function () {\n if (!this.gridOptions.rowHeight || missing(this.gridOptions.rowHeight)) {\n return this.getDefaultRowHeight();\n }\n if (this.gridOptions.rowHeight && this.isNumeric(this.gridOptions.rowHeight)) {\n return this.gridOptions.rowHeight;\n }\n console.warn('AG Grid row height must be a number if not using standard row model');\n return this.getDefaultRowHeight();\n };\n GridOptionsWrapper.prototype.getRowHeightForNode = function (rowNode, allowEstimate) {\n // check the function first, in case use set both function and\n // number, when using virtual pagination then function can be\n // used for pinned rows and the number for the body rows.\n if (allowEstimate === void 0) { allowEstimate = false; }\n if (typeof this.gridOptions.getRowHeight === 'function') {\n if (allowEstimate) {\n return { height: this.getDefaultRowHeight(), estimated: true };\n }\n var params = {\n node: rowNode,\n data: rowNode.data,\n api: this.gridOptions.api,\n context: this.gridOptions.context\n };\n var height = this.gridOptions.getRowHeight(params);\n if (this.isNumeric(height)) {\n if (height === 0) {\n doOnce(function () { return console.warn('AG Grid: The return of `getRowHeight` cannot be zero. If the intention is to hide rows, use a filter instead.'); }, 'invalidRowHeight');\n }\n return { height: Math.max(1, height), estimated: false };\n }\n }\n if (rowNode.detail && this.isMasterDetail()) {\n if (this.isNumeric(this.gridOptions.detailRowHeight)) {\n return { height: this.gridOptions.detailRowHeight, estimated: false };\n }\n return { height: DEFAULT_DETAIL_ROW_HEIGHT, estimated: false };\n }\n var defaultRowHeight = this.getDefaultRowHeight();\n var rowHeight = this.gridOptions.rowHeight && this.isNumeric(this.gridOptions.rowHeight) ? this.gridOptions.rowHeight : defaultRowHeight;\n var minRowHeight = exists(rowHeight) ? Math.min(defaultRowHeight, rowHeight) : defaultRowHeight;\n if (this.columnController.isAutoRowHeightActive()) {\n if (allowEstimate) {\n return { height: rowHeight, estimated: true };\n }\n var autoHeight = this.autoHeightCalculator.getPreferredHeightForRow(rowNode);\n // never return less than the default row height - covers when auto height\n // cells are blank.\n return { height: Math.max(autoHeight, minRowHeight), estimated: false };\n }\n return { height: rowHeight, estimated: false };\n };\n GridOptionsWrapper.prototype.isDynamicRowHeight = function () {\n return typeof this.gridOptions.getRowHeight === 'function';\n };\n GridOptionsWrapper.prototype.getListItemHeight = function () {\n return this.getFromTheme(20, 'listItemHeight');\n };\n GridOptionsWrapper.prototype.chartMenuPanelWidth = function () {\n return this.environment.chartMenuPanelWidth();\n };\n GridOptionsWrapper.prototype.isNumeric = function (value) {\n return !isNaN(value) && typeof value === 'number' && isFinite(value);\n };\n GridOptionsWrapper.prototype.getFromTheme = function (defaultValue, sassVariableName) {\n var theme = this.environment.getTheme().theme;\n if (theme && theme.indexOf('ag-theme') === 0) {\n return this.environment.getSassVariable(theme, sassVariableName);\n }\n return defaultValue;\n };\n GridOptionsWrapper.prototype.getDefaultRowHeight = function () {\n return this.getFromTheme(DEFAULT_ROW_HEIGHT, 'rowHeight');\n };\n var GridOptionsWrapper_1;\n GridOptionsWrapper.MIN_COL_WIDTH = 10;\n GridOptionsWrapper.PROP_HEADER_HEIGHT = 'headerHeight';\n GridOptionsWrapper.PROP_GROUP_REMOVE_SINGLE_CHILDREN = 'groupRemoveSingleChildren';\n GridOptionsWrapper.PROP_GROUP_REMOVE_LOWEST_SINGLE_CHILDREN = 'groupRemoveLowestSingleChildren';\n GridOptionsWrapper.PROP_PIVOT_HEADER_HEIGHT = 'pivotHeaderHeight';\n GridOptionsWrapper.PROP_SUPPRESS_CLIPBOARD_PASTE = 'suppressClipboardPaste';\n GridOptionsWrapper.PROP_GROUP_HEADER_HEIGHT = 'groupHeaderHeight';\n GridOptionsWrapper.PROP_PIVOT_GROUP_HEADER_HEIGHT = 'pivotGroupHeaderHeight';\n GridOptionsWrapper.PROP_FLOATING_FILTERS_HEIGHT = 'floatingFiltersHeight';\n GridOptionsWrapper.PROP_SUPPRESS_ROW_CLICK_SELECTION = 'suppressRowClickSelection';\n GridOptionsWrapper.PROP_SUPPRESS_ROW_DRAG = 'suppressRowDrag';\n GridOptionsWrapper.PROP_SUPPRESS_MOVE_WHEN_ROW_DRAG = 'suppressMoveWhenRowDragging';\n GridOptionsWrapper.PROP_POPUP_PARENT = 'popupParent';\n GridOptionsWrapper.PROP_DOM_LAYOUT = 'domLayout';\n GridOptionsWrapper.PROP_FILL_HANDLE_DIRECTION = 'fillHandleDirection';\n __decorate$w([\n Autowired('gridOptions')\n ], GridOptionsWrapper.prototype, \"gridOptions\", void 0);\n __decorate$w([\n Autowired('columnController')\n ], GridOptionsWrapper.prototype, \"columnController\", void 0);\n __decorate$w([\n Autowired('eventService')\n ], GridOptionsWrapper.prototype, \"eventService\", void 0);\n __decorate$w([\n Autowired('environment')\n ], GridOptionsWrapper.prototype, \"environment\", void 0);\n __decorate$w([\n Autowired('autoHeightCalculator')\n ], GridOptionsWrapper.prototype, \"autoHeightCalculator\", void 0);\n __decorate$w([\n __param$3(0, Qualifier('gridApi')), __param$3(1, Qualifier('columnApi'))\n ], GridOptionsWrapper.prototype, \"agWire\", null);\n __decorate$w([\n PreDestroy\n ], GridOptionsWrapper.prototype, \"destroy\", null);\n __decorate$w([\n PostConstruct\n ], GridOptionsWrapper.prototype, \"init\", null);\n GridOptionsWrapper = GridOptionsWrapper_1 = __decorate$w([\n Bean('gridOptionsWrapper')\n ], GridOptionsWrapper);\n return GridOptionsWrapper;\n}());\n\n/**\n * @ag-grid-community/core - Advanced Data Grid / Data Table supporting Javascript / React / AngularJS / Web Components\n * @version v25.1.0\n * @link http://www.ag-grid.com/\n * @license MIT\n */\n// when doing transactions, or change detection, and grouping is present\n// in the data, there is no need for the ClientSideRowModel to update each\n// group after an update, ony parts that were impacted by the change.\n// this class keeps track of all groups that were impacted by a transaction.\n// the the different CSRM operations (filter, sort etc) use the forEach method\n// to visit each group that was changed.\nvar ChangedPath = /** @class */ (function () {\n function ChangedPath(keepingColumns, rootNode) {\n // whether changed path is active of not. it is active when a) doing\n // a transaction update or b) doing change detection. if we are doing\n // a CSRM refresh for other reasons (after sort or filter, or user calling\n // setRowData() without delta mode) then we are not active. we are also\n // marked as not active if secondary columns change in pivot (as this impacts\n // aggregations)\n this.active = true;\n // for each node in the change path, we also store which columns need\n // to be re-aggregated.\n this.nodeIdsToColumns = {};\n // for quick lookup, all items in the change path are mapped by nodeId\n this.mapToItems = {};\n this.keepingColumns = keepingColumns;\n this.pathRoot = {\n rowNode: rootNode,\n children: null\n };\n this.mapToItems[rootNode.id] = this.pathRoot;\n }\n // can be set inactive by:\n // a) ClientSideRowModel, if no transactions or\n // b) PivotService, if secondary columns changed\n ChangedPath.prototype.setInactive = function () {\n this.active = false;\n };\n ChangedPath.prototype.isActive = function () {\n return this.active;\n };\n ChangedPath.prototype.depthFirstSearchChangedPath = function (pathItem, callback) {\n if (pathItem.children) {\n for (var i = 0; i < pathItem.children.length; i++) {\n this.depthFirstSearchChangedPath(pathItem.children[i], callback);\n }\n }\n callback(pathItem.rowNode);\n };\n ChangedPath.prototype.depthFirstSearchEverything = function (rowNode, callback, traverseEverything) {\n if (rowNode.childrenAfterGroup) {\n for (var i = 0; i < rowNode.childrenAfterGroup.length; i++) {\n var childNode = rowNode.childrenAfterGroup[i];\n if (childNode.childrenAfterGroup) {\n this.depthFirstSearchEverything(rowNode.childrenAfterGroup[i], callback, traverseEverything);\n }\n else if (traverseEverything) {\n callback(childNode);\n }\n }\n }\n callback(rowNode);\n };\n // traverseLeafNodes -> used when NOT doing changed path, ie traversing everything. the callback\n // will be called for child nodes in addition to parent nodes.\n ChangedPath.prototype.forEachChangedNodeDepthFirst = function (callback, traverseLeafNodes) {\n if (traverseLeafNodes === void 0) { traverseLeafNodes = false; }\n if (this.active) {\n // if we are active, then use the change path to callback\n // only for updated groups\n this.depthFirstSearchChangedPath(this.pathRoot, callback);\n }\n else {\n // we are not active, so callback for everything, walk the entire path\n this.depthFirstSearchEverything(this.pathRoot.rowNode, callback, traverseLeafNodes);\n }\n };\n ChangedPath.prototype.executeFromRootNode = function (callback) {\n callback(this.pathRoot.rowNode);\n };\n ChangedPath.prototype.createPathItems = function (rowNode) {\n var pointer = rowNode;\n var newEntryCount = 0;\n while (!this.mapToItems[pointer.id]) {\n var newEntry = {\n rowNode: pointer,\n children: null\n };\n this.mapToItems[pointer.id] = newEntry;\n newEntryCount++;\n pointer = pointer.parent;\n }\n return newEntryCount;\n };\n ChangedPath.prototype.populateColumnsMap = function (rowNode, columns) {\n var _this = this;\n if (!this.keepingColumns || !columns) {\n return;\n }\n var pointer = rowNode;\n while (pointer) {\n // if columns, add the columns in all the way to parent, merging\n // in any other columns that might be there already\n if (!this.nodeIdsToColumns[pointer.id]) {\n this.nodeIdsToColumns[pointer.id] = {};\n }\n columns.forEach(function (col) { return _this.nodeIdsToColumns[pointer.id][col.getId()] = true; });\n pointer = pointer.parent;\n }\n };\n ChangedPath.prototype.linkPathItems = function (rowNode, newEntryCount) {\n var pointer = rowNode;\n for (var i = 0; i < newEntryCount; i++) {\n var thisItem = this.mapToItems[pointer.id];\n var parentItem = this.mapToItems[pointer.parent.id];\n if (!parentItem.children) {\n parentItem.children = [];\n }\n parentItem.children.push(thisItem);\n pointer = pointer.parent;\n }\n };\n // called by\n // 1) change detection (provides cols) and\n // 2) groupStage if doing transaction update (doesn't provide cols)\n ChangedPath.prototype.addParentNode = function (rowNode, columns) {\n if (!rowNode || rowNode.isRowPinned()) {\n return;\n }\n // we cannot do both steps below in the same loop as\n // the second loop has a dependency on the first loop.\n // ie the hierarchy cannot be stitched up yet because\n // we don't have it built yet\n // create the new PathItem objects.\n var newEntryCount = this.createPathItems(rowNode);\n // link in the node items\n this.linkPathItems(rowNode, newEntryCount);\n // update columns\n this.populateColumnsMap(rowNode, columns);\n };\n ChangedPath.prototype.canSkip = function (rowNode) {\n return this.active && !this.mapToItems[rowNode.id];\n };\n ChangedPath.prototype.getValueColumnsForNode = function (rowNode, valueColumns) {\n if (!this.keepingColumns) {\n return valueColumns;\n }\n var colsForThisNode = this.nodeIdsToColumns[rowNode.id];\n var result = valueColumns.filter(function (col) { return colsForThisNode[col.getId()]; });\n return result;\n };\n ChangedPath.prototype.getNotValueColumnsForNode = function (rowNode, valueColumns) {\n if (!this.keepingColumns) {\n return null;\n }\n var colsForThisNode = this.nodeIdsToColumns[rowNode.id];\n var result = valueColumns.filter(function (col) { return !colsForThisNode[col.getId()]; });\n return result;\n };\n return ChangedPath;\n}());\n\n/**\n * @ag-grid-community/core - Advanced Data Grid / Data Table supporting Javascript / React / AngularJS / Web Components\n * @version v25.1.0\n * @link http://www.ag-grid.com/\n * @license MIT\n */\nvar __extends$B = (undefined && undefined.__extends) || (function () {\n var extendStatics = function (d, b) {\n extendStatics = Object.setPrototypeOf ||\n ({ __proto__: [] } instanceof Array && function (d, b) { d.__proto__ = b; }) ||\n function (d, b) { for (var p in b) if (b.hasOwnProperty(p)) d[p] = b[p]; };\n return extendStatics(d, b);\n };\n return function (d, b) {\n extendStatics(d, b);\n function __() { this.constructor = d; }\n d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __());\n };\n})();\nvar __decorate$x = (undefined && undefined.__decorate) || function (decorators, target, key, desc) {\n var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d;\n if (typeof Reflect === \"object\" && typeof Reflect.decorate === \"function\") r = Reflect.decorate(decorators, target, key, desc);\n else for (var i = decorators.length - 1; i >= 0; i--) if (d = decorators[i]) r = (c < 3 ? d(r) : c > 3 ? d(target, key, r) : d(target, key)) || r;\n return c > 3 && r && Object.defineProperty(target, key, r), r;\n};\nvar __param$4 = (undefined && undefined.__param) || function (paramIndex, decorator) {\n return function (target, key) { decorator(target, key, paramIndex); }\n};\nvar SelectionController = /** @class */ (function (_super) {\n __extends$B(SelectionController, _super);\n function SelectionController() {\n return _super !== null && _super.apply(this, arguments) || this;\n }\n SelectionController.prototype.setBeans = function (loggerFactory) {\n this.logger = loggerFactory.create('SelectionController');\n this.reset();\n if (this.gridOptionsWrapper.isRowModelDefault()) {\n this.addManagedListener(this.eventService, Events.EVENT_ROW_DATA_CHANGED, this.reset.bind(this));\n }\n };\n SelectionController.prototype.init = function () {\n this.groupSelectsChildren = this.gridOptionsWrapper.isGroupSelectsChildren();\n this.addManagedListener(this.eventService, Events.EVENT_ROW_SELECTED, this.onRowSelected.bind(this));\n };\n SelectionController.prototype.setLastSelectedNode = function (rowNode) {\n this.lastSelectedNode = rowNode;\n };\n SelectionController.prototype.getLastSelectedNode = function () {\n return this.lastSelectedNode;\n };\n SelectionController.prototype.getSelectedNodes = function () {\n var selectedNodes = [];\n iterateObject(this.selectedNodes, function (key, rowNode) {\n if (rowNode) {\n selectedNodes.push(rowNode);\n }\n });\n return selectedNodes;\n };\n SelectionController.prototype.getSelectedRows = function () {\n var selectedRows = [];\n iterateObject(this.selectedNodes, function (key, rowNode) {\n if (rowNode && rowNode.data) {\n selectedRows.push(rowNode.data);\n }\n });\n return selectedRows;\n };\n SelectionController.prototype.removeGroupsFromSelection = function () {\n var _this = this;\n iterateObject(this.selectedNodes, function (key, rowNode) {\n if (rowNode && rowNode.group) {\n _this.selectedNodes[rowNode.id] = undefined;\n }\n });\n };\n // should only be called if groupSelectsChildren=true\n SelectionController.prototype.updateGroupsFromChildrenSelections = function (changedPath) {\n // we only do this when group selection state depends on selected children\n if (!this.gridOptionsWrapper.isGroupSelectsChildren()) {\n return;\n }\n // also only do it if CSRM (code should never allow this anyway)\n if (this.rowModel.getType() !== Constants.ROW_MODEL_TYPE_CLIENT_SIDE) {\n return;\n }\n var clientSideRowModel = this.rowModel;\n var rootNode = clientSideRowModel.getRootNode();\n if (!changedPath) {\n changedPath = new ChangedPath(true, rootNode);\n changedPath.setInactive();\n }\n changedPath.forEachChangedNodeDepthFirst(function (rowNode) {\n if (rowNode !== rootNode) {\n rowNode.calculateSelectedFromChildren();\n }\n });\n // clientSideRowModel.getTopLevelNodes()!.forEach((rowNode: RowNode) => {\n // rowNode.depthFirstSearch((node) => {\n // if (node.group) {\n // }\n // });\n // });\n };\n SelectionController.prototype.getNodeForIdIfSelected = function (id) {\n return this.selectedNodes[id];\n };\n SelectionController.prototype.clearOtherNodes = function (rowNodeToKeepSelected) {\n var _this = this;\n var groupsToRefresh = {};\n var updatedCount = 0;\n iterateObject(this.selectedNodes, function (key, otherRowNode) {\n if (otherRowNode && otherRowNode.id !== rowNodeToKeepSelected.id) {\n var rowNode = _this.selectedNodes[otherRowNode.id];\n updatedCount += rowNode.setSelectedParams({\n newValue: false,\n clearSelection: false,\n suppressFinishActions: true\n });\n if (_this.groupSelectsChildren && otherRowNode.parent) {\n groupsToRefresh[otherRowNode.parent.id] = otherRowNode.parent;\n }\n }\n });\n iterateObject(groupsToRefresh, function (key, group) {\n group.calculateSelectedFromChildren();\n });\n return updatedCount;\n };\n SelectionController.prototype.onRowSelected = function (event) {\n var rowNode = event.node;\n // we do not store the group rows when the groups select children\n if (this.groupSelectsChildren && rowNode.group) {\n return;\n }\n if (rowNode.isSelected()) {\n this.selectedNodes[rowNode.id] = rowNode;\n }\n else {\n this.selectedNodes[rowNode.id] = undefined;\n }\n };\n SelectionController.prototype.syncInRowNode = function (rowNode, oldNode) {\n this.syncInOldRowNode(rowNode, oldNode);\n this.syncInNewRowNode(rowNode);\n };\n // if the id has changed for the node, then this means the rowNode\n // is getting used for a different data item, which breaks\n // our selectedNodes, as the node now is mapped by the old id\n // which is inconsistent. so to keep the old node as selected,\n // we swap in the clone (with the old id and old data). this means\n // the oldNode is effectively a daemon we keep a reference to,\n // so if client calls api.getSelectedNodes(), it gets the daemon\n // in the result. when the client un-selects, the reference to the\n // daemon is removed. the daemon, because it's an oldNode, is not\n // used by the grid for rendering, it's a copy of what the node used\n // to be like before the id was changed.\n SelectionController.prototype.syncInOldRowNode = function (rowNode, oldNode) {\n var oldNodeHasDifferentId = exists(oldNode) && (rowNode.id !== oldNode.id);\n if (oldNodeHasDifferentId && oldNode) {\n var oldNodeSelected = exists(this.selectedNodes[oldNode.id]);\n if (oldNodeSelected) {\n this.selectedNodes[oldNode.id] = oldNode;\n }\n }\n };\n SelectionController.prototype.syncInNewRowNode = function (rowNode) {\n if (exists(this.selectedNodes[rowNode.id])) {\n rowNode.setSelectedInitialValue(true);\n this.selectedNodes[rowNode.id] = rowNode;\n }\n else {\n rowNode.setSelectedInitialValue(false);\n }\n };\n SelectionController.prototype.reset = function () {\n this.logger.log('reset');\n this.selectedNodes = {};\n this.lastSelectedNode = null;\n };\n // returns a list of all nodes at 'best cost' - a feature to be used\n // with groups / trees. if a group has all it's children selected,\n // then the group appears in the result, but not the children.\n // Designed for use with 'children' as the group selection type,\n // where groups don't actually appear in the selection normally.\n SelectionController.prototype.getBestCostNodeSelection = function () {\n if (this.rowModel.getType() !== Constants.ROW_MODEL_TYPE_CLIENT_SIDE) {\n console.warn('getBestCostNodeSelection is only available when using normal row model');\n return;\n }\n var clientSideRowModel = this.rowModel;\n var topLevelNodes = clientSideRowModel.getTopLevelNodes();\n if (topLevelNodes === null) {\n console.warn('selectAll not available doing rowModel=virtual');\n return;\n }\n var result = [];\n // recursive function, to find the selected nodes\n function traverse(nodes) {\n for (var i = 0, l = nodes.length; i < l; i++) {\n var node = nodes[i];\n if (node.isSelected()) {\n result.push(node);\n }\n else {\n // if not selected, then if it's a group, and the group\n // has children, continue to search for selections\n if (node.group && node.children) {\n traverse(node.children);\n }\n }\n }\n }\n traverse(topLevelNodes);\n return result;\n };\n SelectionController.prototype.setRowModel = function (rowModel) {\n this.rowModel = rowModel;\n };\n SelectionController.prototype.isEmpty = function () {\n var count = 0;\n iterateObject(this.selectedNodes, function (nodeId, rowNode) {\n if (rowNode) {\n count++;\n }\n });\n return count === 0;\n };\n SelectionController.prototype.deselectAllRowNodes = function (justFiltered) {\n if (justFiltered === void 0) { justFiltered = false; }\n var callback = function (rowNode) { return rowNode.selectThisNode(false); };\n var rowModelClientSide = this.rowModel.getType() === Constants.ROW_MODEL_TYPE_CLIENT_SIDE;\n if (justFiltered) {\n if (!rowModelClientSide) {\n console.error('AG Grid: selecting just filtered only works with In Memory Row Model');\n return;\n }\n var clientSideRowModel = this.rowModel;\n clientSideRowModel.forEachNodeAfterFilter(callback);\n }\n else {\n iterateObject(this.selectedNodes, function (id, rowNode) {\n // remember the reference can be to null, as we never 'delete' from the map\n if (rowNode) {\n callback(rowNode);\n }\n });\n // this clears down the map (whereas above only sets the items in map to 'undefined')\n this.reset();\n }\n // the above does not clean up the parent rows if they are selected\n if (rowModelClientSide && this.groupSelectsChildren) {\n this.updateGroupsFromChildrenSelections();\n }\n var event = {\n type: Events.EVENT_SELECTION_CHANGED,\n api: this.gridApi,\n columnApi: this.columnApi\n };\n this.eventService.dispatchEvent(event);\n };\n SelectionController.prototype.selectAllRowNodes = function (justFiltered) {\n if (justFiltered === void 0) { justFiltered = false; }\n if (this.rowModel.getType() !== Constants.ROW_MODEL_TYPE_CLIENT_SIDE) {\n throw new Error(\"selectAll only available with normal row model, ie not \" + this.rowModel.getType());\n }\n var clientSideRowModel = this.rowModel;\n var callback = function (rowNode) { return rowNode.selectThisNode(true); };\n if (justFiltered) {\n clientSideRowModel.forEachNodeAfterFilter(callback);\n }\n else {\n clientSideRowModel.forEachNode(callback);\n }\n // the above does not clean up the parent rows if they are selected\n if (this.rowModel.getType() === Constants.ROW_MODEL_TYPE_CLIENT_SIDE && this.groupSelectsChildren) {\n this.updateGroupsFromChildrenSelections();\n }\n var event = {\n type: Events.EVENT_SELECTION_CHANGED,\n api: this.gridApi,\n columnApi: this.columnApi\n };\n this.eventService.dispatchEvent(event);\n };\n /**\n * @method\n * @deprecated\n */\n SelectionController.prototype.selectNode = function (rowNode, tryMulti) {\n if (rowNode) {\n rowNode.setSelectedParams({ newValue: true, clearSelection: !tryMulti });\n }\n };\n /**\n * @method\n * @deprecated\n */\n SelectionController.prototype.deselectIndex = function (rowIndex) {\n var node = this.rowModel.getRow(rowIndex);\n this.deselectNode(node);\n };\n /**\n * @method\n * @deprecated\n */\n SelectionController.prototype.deselectNode = function (rowNode) {\n if (rowNode) {\n rowNode.setSelectedParams({ newValue: false, clearSelection: false });\n }\n };\n /**\n * @method\n * @deprecated\n */\n SelectionController.prototype.selectIndex = function (index, tryMulti) {\n var node = this.rowModel.getRow(index);\n this.selectNode(node, tryMulti);\n };\n __decorate$x([\n Autowired('rowModel')\n ], SelectionController.prototype, \"rowModel\", void 0);\n __decorate$x([\n Autowired('columnApi')\n ], SelectionController.prototype, \"columnApi\", void 0);\n __decorate$x([\n Autowired('gridApi')\n ], SelectionController.prototype, \"gridApi\", void 0);\n __decorate$x([\n __param$4(0, Qualifier('loggerFactory'))\n ], SelectionController.prototype, \"setBeans\", null);\n __decorate$x([\n PostConstruct\n ], SelectionController.prototype, \"init\", null);\n SelectionController = __decorate$x([\n Bean('selectionController')\n ], SelectionController);\n return SelectionController;\n}(BeanStub));\n\n/**\n * @ag-grid-community/core - Advanced Data Grid / Data Table supporting Javascript / React / AngularJS / Web Components\n * @version v25.1.0\n * @link http://www.ag-grid.com/\n * @license MIT\n */\nvar __decorate$y = (undefined && undefined.__decorate) || function (decorators, target, key, desc) {\n var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d;\n if (typeof Reflect === \"object\" && typeof Reflect.decorate === \"function\") r = Reflect.decorate(decorators, target, key, desc);\n else for (var i = decorators.length - 1; i >= 0; i--) if (d = decorators[i]) r = (c < 3 ? d(r) : c > 3 ? d(target, key, r) : d(target, key)) || r;\n return c > 3 && r && Object.defineProperty(target, key, r), r;\n};\nvar ColumnApi = /** @class */ (function () {\n function ColumnApi() {\n }\n ColumnApi.prototype.sizeColumnsToFit = function (gridWidth) {\n // AG-3403 validate that gridWidth is provided because this method has the same name as\n // a method on the grid API that takes no arguments, and it's easy to confuse the two\n if (typeof gridWidth === \"undefined\") {\n console.error('AG Grid: missing parameter to columnApi.sizeColumnsToFit(gridWidth)');\n }\n this.columnController.sizeColumnsToFit(gridWidth, 'api');\n };\n ColumnApi.prototype.setColumnGroupOpened = function (group, newValue) { this.columnController.setColumnGroupOpened(group, newValue, 'api'); };\n ColumnApi.prototype.getColumnGroup = function (name, instanceId) { return this.columnController.getColumnGroup(name, instanceId); };\n ColumnApi.prototype.getOriginalColumnGroup = function (name) { return this.columnController.getOriginalColumnGroup(name); };\n ColumnApi.prototype.getDisplayNameForColumn = function (column, location) { return this.columnController.getDisplayNameForColumn(column, location) || ''; };\n ColumnApi.prototype.getDisplayNameForColumnGroup = function (columnGroup, location) { return this.columnController.getDisplayNameForColumnGroup(columnGroup, location) || ''; };\n ColumnApi.prototype.getColumn = function (key) { return this.columnController.getPrimaryColumn(key); };\n ColumnApi.prototype.applyColumnState = function (params) { return this.columnController.applyColumnState(params, 'api'); };\n ColumnApi.prototype.getColumnState = function () { return this.columnController.getColumnState(); };\n ColumnApi.prototype.resetColumnState = function () { this.columnController.resetColumnState('api'); };\n ColumnApi.prototype.getColumnGroupState = function () { return this.columnController.getColumnGroupState(); };\n ColumnApi.prototype.setColumnGroupState = function (stateItems) { this.columnController.setColumnGroupState(stateItems, 'api'); };\n ColumnApi.prototype.resetColumnGroupState = function () { this.columnController.resetColumnGroupState('api'); };\n ColumnApi.prototype.isPinning = function () { return this.columnController.isPinningLeft() || this.columnController.isPinningRight(); };\n ColumnApi.prototype.isPinningLeft = function () { return this.columnController.isPinningLeft(); };\n ColumnApi.prototype.isPinningRight = function () { return this.columnController.isPinningRight(); };\n ColumnApi.prototype.getDisplayedColAfter = function (col) { return this.columnController.getDisplayedColAfter(col); };\n ColumnApi.prototype.getDisplayedColBefore = function (col) { return this.columnController.getDisplayedColBefore(col); };\n ColumnApi.prototype.setColumnVisible = function (key, visible) { this.columnController.setColumnVisible(key, visible, 'api'); };\n ColumnApi.prototype.setColumnsVisible = function (keys, visible) { this.columnController.setColumnsVisible(keys, visible, 'api'); };\n ColumnApi.prototype.setColumnPinned = function (key, pinned) { this.columnController.setColumnPinned(key, pinned, 'api'); };\n ColumnApi.prototype.setColumnsPinned = function (keys, pinned) { this.columnController.setColumnsPinned(keys, pinned, 'api'); };\n ColumnApi.prototype.getAllColumns = function () { return this.columnController.getAllPrimaryColumns(); };\n ColumnApi.prototype.getAllGridColumns = function () { return this.columnController.getAllGridColumns(); };\n ColumnApi.prototype.getDisplayedLeftColumns = function () { return this.columnController.getDisplayedLeftColumns(); };\n ColumnApi.prototype.getDisplayedCenterColumns = function () { return this.columnController.getDisplayedCenterColumns(); };\n ColumnApi.prototype.getDisplayedRightColumns = function () { return this.columnController.getDisplayedRightColumns(); };\n ColumnApi.prototype.getAllDisplayedColumns = function () { return this.columnController.getAllDisplayedColumns(); };\n ColumnApi.prototype.getAllDisplayedVirtualColumns = function () { return this.columnController.getViewportColumns(); };\n ColumnApi.prototype.moveColumn = function (key, toIndex) {\n if (typeof key === 'number') {\n // moveColumn used to take indexes, so this is advising user who hasn't moved to new method name\n console.warn('AG Grid: you are using moveColumn(fromIndex, toIndex) - moveColumn takes a column key and a destination index, not two indexes, to move with indexes use moveColumnByIndex(from,to) instead');\n this.columnController.moveColumnByIndex(key, toIndex, 'api');\n }\n else {\n this.columnController.moveColumn(key, toIndex, 'api');\n }\n };\n ColumnApi.prototype.moveColumnByIndex = function (fromIndex, toIndex) { this.columnController.moveColumnByIndex(fromIndex, toIndex, 'api'); };\n ColumnApi.prototype.moveColumns = function (columnsToMoveKeys, toIndex) { this.columnController.moveColumns(columnsToMoveKeys, toIndex, 'api'); };\n ColumnApi.prototype.moveRowGroupColumn = function (fromIndex, toIndex) { this.columnController.moveRowGroupColumn(fromIndex, toIndex); };\n ColumnApi.prototype.setColumnAggFunc = function (key, aggFunc) { this.columnController.setColumnAggFunc(key, aggFunc); };\n ColumnApi.prototype.setColumnWidth = function (key, newWidth, finished) {\n if (finished === void 0) { finished = true; }\n this.columnController.setColumnWidths([{ key: key, newWidth: newWidth }], false, finished);\n };\n ColumnApi.prototype.setColumnWidths = function (columnWidths, finished) {\n if (finished === void 0) { finished = true; }\n this.columnController.setColumnWidths(columnWidths, false, finished);\n };\n ColumnApi.prototype.setPivotMode = function (pivotMode) { this.columnController.setPivotMode(pivotMode); };\n ColumnApi.prototype.isPivotMode = function () { return this.columnController.isPivotMode(); };\n ColumnApi.prototype.getSecondaryPivotColumn = function (pivotKeys, valueColKey) { return this.columnController.getSecondaryPivotColumn(pivotKeys, valueColKey); };\n ColumnApi.prototype.setValueColumns = function (colKeys) { this.columnController.setValueColumns(colKeys, 'api'); };\n ColumnApi.prototype.getValueColumns = function () { return this.columnController.getValueColumns(); };\n ColumnApi.prototype.removeValueColumn = function (colKey) { this.columnController.removeValueColumn(colKey, 'api'); };\n ColumnApi.prototype.removeValueColumns = function (colKeys) { this.columnController.removeValueColumns(colKeys, 'api'); };\n ColumnApi.prototype.addValueColumn = function (colKey) { this.columnController.addValueColumn(colKey, 'api'); };\n ColumnApi.prototype.addValueColumns = function (colKeys) { this.columnController.addValueColumns(colKeys, 'api'); };\n ColumnApi.prototype.setRowGroupColumns = function (colKeys) { this.columnController.setRowGroupColumns(colKeys, 'api'); };\n ColumnApi.prototype.removeRowGroupColumn = function (colKey) { this.columnController.removeRowGroupColumn(colKey, 'api'); };\n ColumnApi.prototype.removeRowGroupColumns = function (colKeys) { this.columnController.removeRowGroupColumns(colKeys, 'api'); };\n ColumnApi.prototype.addRowGroupColumn = function (colKey) { this.columnController.addRowGroupColumn(colKey, 'api'); };\n ColumnApi.prototype.addRowGroupColumns = function (colKeys) { this.columnController.addRowGroupColumns(colKeys, 'api'); };\n ColumnApi.prototype.getRowGroupColumns = function () { return this.columnController.getRowGroupColumns(); };\n ColumnApi.prototype.setPivotColumns = function (colKeys) { this.columnController.setPivotColumns(colKeys, 'api'); };\n ColumnApi.prototype.removePivotColumn = function (colKey) { this.columnController.removePivotColumn(colKey, 'api'); };\n ColumnApi.prototype.removePivotColumns = function (colKeys) { this.columnController.removePivotColumns(colKeys, 'api'); };\n ColumnApi.prototype.addPivotColumn = function (colKey) { this.columnController.addPivotColumn(colKey, 'api'); };\n ColumnApi.prototype.addPivotColumns = function (colKeys) { this.columnController.addPivotColumns(colKeys, 'api'); };\n ColumnApi.prototype.getPivotColumns = function () { return this.columnController.getPivotColumns(); };\n ColumnApi.prototype.getLeftDisplayedColumnGroups = function () { return this.columnController.getDisplayedTreeLeft(); };\n ColumnApi.prototype.getCenterDisplayedColumnGroups = function () { return this.columnController.getDisplayedTreeCentre(); };\n ColumnApi.prototype.getRightDisplayedColumnGroups = function () { return this.columnController.getDisplayedTreeRight(); };\n ColumnApi.prototype.getAllDisplayedColumnGroups = function () { return this.columnController.getAllDisplayedTrees(); };\n ColumnApi.prototype.autoSizeColumn = function (key, skipHeader) { return this.columnController.autoSizeColumn(key, skipHeader, 'api'); };\n ColumnApi.prototype.autoSizeColumns = function (keys, skipHeader) { return this.columnController.autoSizeColumns(keys, skipHeader, 'api'); };\n ColumnApi.prototype.autoSizeAllColumns = function (skipHeader) { this.columnController.autoSizeAllColumns(skipHeader, 'api'); };\n ColumnApi.prototype.setSecondaryColumns = function (colDefs) { this.columnController.setSecondaryColumns(colDefs, 'api'); };\n ColumnApi.prototype.getSecondaryColumns = function () { return this.columnController.getSecondaryColumns(); };\n ColumnApi.prototype.getPrimaryColumns = function () { return this.columnController.getAllPrimaryColumns(); };\n ColumnApi.prototype.cleanDownReferencesToAvoidMemoryLeakInCaseApplicationIsKeepingReferenceToDestroyedGrid = function () {\n // some users were raising support issues with regards memory leaks. the problem was the customers applications\n // were keeping references to the API. trying to educate them all would be difficult, easier to just remove\n // all references in teh API so at least the core grid can be garbage collected.\n //\n // wait about 100ms before clearing down the references, in case user has some cleanup to do,\n // and needs to deference the API first\n setTimeout(_.removeAllReferences.bind(window, this, 'Column API'), 100);\n };\n // below goes through deprecated items, prints message to user, then calls the new version of the same method\n // public getColumnDefs(): (ColDef | ColGroupDef)[] {\n // this.setColumnGroupOpened(group, newValue);\n // return null;\n // }\n ColumnApi.prototype.columnGroupOpened = function (group, newValue) {\n console.error('AG Grid: columnGroupOpened no longer exists, use setColumnGroupOpened');\n this.setColumnGroupOpened(group, newValue);\n };\n ColumnApi.prototype.hideColumns = function (colIds, hide) {\n console.error('AG Grid: hideColumns is deprecated, use setColumnsVisible');\n this.columnController.setColumnsVisible(colIds, !hide, 'api');\n };\n ColumnApi.prototype.hideColumn = function (colId, hide) {\n console.error('AG Grid: hideColumn is deprecated, use setColumnVisible');\n this.columnController.setColumnVisible(colId, !hide, 'api');\n };\n ColumnApi.prototype.setState = function (columnState) {\n console.error('AG Grid: setState is deprecated, use setColumnState');\n return this.setColumnState(columnState);\n };\n ColumnApi.prototype.getState = function () {\n console.error('AG Grid: getState is deprecated, use getColumnState');\n return this.getColumnState();\n };\n ColumnApi.prototype.resetState = function () {\n console.error('AG Grid: resetState is deprecated, use resetColumnState');\n this.resetColumnState();\n };\n ColumnApi.prototype.getAggregationColumns = function () {\n console.error('AG Grid: getAggregationColumns is deprecated, use getValueColumns');\n return this.columnController.getValueColumns();\n };\n ColumnApi.prototype.removeAggregationColumn = function (colKey) {\n console.error('AG Grid: removeAggregationColumn is deprecated, use removeValueColumn');\n this.columnController.removeValueColumn(colKey, 'api');\n };\n ColumnApi.prototype.removeAggregationColumns = function (colKeys) {\n console.error('AG Grid: removeAggregationColumns is deprecated, use removeValueColumns');\n this.columnController.removeValueColumns(colKeys, 'api');\n };\n ColumnApi.prototype.addAggregationColumn = function (colKey) {\n console.error('AG Grid: addAggregationColumn is deprecated, use addValueColumn');\n this.columnController.addValueColumn(colKey, 'api');\n };\n ColumnApi.prototype.addAggregationColumns = function (colKeys) {\n console.error('AG Grid: addAggregationColumns is deprecated, use addValueColumns');\n this.columnController.addValueColumns(colKeys, 'api');\n };\n ColumnApi.prototype.setColumnAggFunction = function (column, aggFunc) {\n console.error('AG Grid: setColumnAggFunction is deprecated, use setColumnAggFunc');\n this.columnController.setColumnAggFunc(column, aggFunc, 'api');\n };\n ColumnApi.prototype.getDisplayNameForCol = function (column) {\n console.error('AG Grid: getDisplayNameForCol is deprecated, use getDisplayNameForColumn');\n return this.getDisplayNameForColumn(column, null);\n };\n ColumnApi.prototype.setColumnState = function (columnState) {\n return this.columnController.applyColumnState({ state: columnState, applyOrder: true }, 'api');\n };\n __decorate$y([\n Autowired('columnController')\n ], ColumnApi.prototype, \"columnController\", void 0);\n __decorate$y([\n PreDestroy\n ], ColumnApi.prototype, \"cleanDownReferencesToAvoidMemoryLeakInCaseApplicationIsKeepingReferenceToDestroyedGrid\", null);\n ColumnApi = __decorate$y([\n Bean('columnApi')\n ], ColumnApi);\n return ColumnApi;\n}());\n\n/**\n * @ag-grid-community/core - Advanced Data Grid / Data Table supporting Javascript / React / AngularJS / Web Components\n * @version v25.1.0\n * @link http://www.ag-grid.com/\n * @license MIT\n */\n(function (SelectionHandleType) {\n SelectionHandleType[SelectionHandleType[\"FILL\"] = 0] = \"FILL\";\n SelectionHandleType[SelectionHandleType[\"RANGE\"] = 1] = \"RANGE\";\n})(exports.SelectionHandleType || (exports.SelectionHandleType = {}));\n(function (CellRangeType) {\n CellRangeType[CellRangeType[\"VALUE\"] = 0] = \"VALUE\";\n CellRangeType[CellRangeType[\"DIMENSION\"] = 1] = \"DIMENSION\";\n})(exports.CellRangeType || (exports.CellRangeType = {}));\n\n/**\n * @ag-grid-community/core - Advanced Data Grid / Data Table supporting Javascript / React / AngularJS / Web Components\n * @version v25.1.0\n * @link http://www.ag-grid.com/\n * @license MIT\n */\nvar __extends$C = (undefined && undefined.__extends) || (function () {\n var extendStatics = function (d, b) {\n extendStatics = Object.setPrototypeOf ||\n ({ __proto__: [] } instanceof Array && function (d, b) { d.__proto__ = b; }) ||\n function (d, b) { for (var p in b) if (b.hasOwnProperty(p)) d[p] = b[p]; };\n return extendStatics(d, b);\n };\n return function (d, b) {\n extendStatics(d, b);\n function __() { this.constructor = d; }\n d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __());\n };\n})();\nvar __decorate$z = (undefined && undefined.__decorate) || function (decorators, target, key, desc) {\n var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d;\n if (typeof Reflect === \"object\" && typeof Reflect.decorate === \"function\") r = Reflect.decorate(decorators, target, key, desc);\n else for (var i = decorators.length - 1; i >= 0; i--) if (d = decorators[i]) r = (c < 3 ? d(r) : c > 3 ? d(target, key, r) : d(target, key)) || r;\n return c > 3 && r && Object.defineProperty(target, key, r), r;\n};\n(function (DragSourceType) {\n DragSourceType[DragSourceType[\"ToolPanel\"] = 0] = \"ToolPanel\";\n DragSourceType[DragSourceType[\"HeaderCell\"] = 1] = \"HeaderCell\";\n DragSourceType[DragSourceType[\"RowDrag\"] = 2] = \"RowDrag\";\n DragSourceType[DragSourceType[\"ChartPanel\"] = 3] = \"ChartPanel\";\n})(exports.DragSourceType || (exports.DragSourceType = {}));\n(function (VerticalDirection) {\n VerticalDirection[VerticalDirection[\"Up\"] = 0] = \"Up\";\n VerticalDirection[VerticalDirection[\"Down\"] = 1] = \"Down\";\n})(exports.VerticalDirection || (exports.VerticalDirection = {}));\n(function (HorizontalDirection) {\n HorizontalDirection[HorizontalDirection[\"Left\"] = 0] = \"Left\";\n HorizontalDirection[HorizontalDirection[\"Right\"] = 1] = \"Right\";\n})(exports.HorizontalDirection || (exports.HorizontalDirection = {}));\nvar DragAndDropService = /** @class */ (function (_super) {\n __extends$C(DragAndDropService, _super);\n function DragAndDropService() {\n var _this = _super !== null && _super.apply(this, arguments) || this;\n _this.dragSourceAndParamsList = [];\n _this.dropTargets = [];\n return _this;\n }\n DragAndDropService_1 = DragAndDropService;\n DragAndDropService.prototype.init = function () {\n this.ePinnedIcon = createIcon('columnMovePin', this.gridOptionsWrapper, null);\n this.eHideIcon = createIcon('columnMoveHide', this.gridOptionsWrapper, null);\n this.eMoveIcon = createIcon('columnMoveMove', this.gridOptionsWrapper, null);\n this.eLeftIcon = createIcon('columnMoveLeft', this.gridOptionsWrapper, null);\n this.eRightIcon = createIcon('columnMoveRight', this.gridOptionsWrapper, null);\n this.eGroupIcon = createIcon('columnMoveGroup', this.gridOptionsWrapper, null);\n this.eAggregateIcon = createIcon('columnMoveValue', this.gridOptionsWrapper, null);\n this.ePivotIcon = createIcon('columnMovePivot', this.gridOptionsWrapper, null);\n this.eDropNotAllowedIcon = createIcon('dropNotAllowed', this.gridOptionsWrapper, null);\n };\n DragAndDropService.prototype.addDragSource = function (dragSource, allowTouch) {\n if (allowTouch === void 0) { allowTouch = false; }\n var params = {\n eElement: dragSource.eElement,\n dragStartPixels: dragSource.dragStartPixels,\n onDragStart: this.onDragStart.bind(this, dragSource),\n onDragStop: this.onDragStop.bind(this),\n onDragging: this.onDragging.bind(this)\n };\n this.dragSourceAndParamsList.push({ params: params, dragSource: dragSource });\n this.dragService.addDragSource(params, allowTouch);\n };\n DragAndDropService.prototype.removeDragSource = function (dragSource) {\n var sourceAndParams = find(this.dragSourceAndParamsList, function (item) { return item.dragSource === dragSource; });\n if (sourceAndParams) {\n this.dragService.removeDragSource(sourceAndParams.params);\n removeFromArray(this.dragSourceAndParamsList, sourceAndParams);\n }\n };\n DragAndDropService.prototype.clearDragSourceParamsList = function () {\n var _this = this;\n this.dragSourceAndParamsList.forEach(function (sourceAndParams) { return _this.dragService.removeDragSource(sourceAndParams.params); });\n this.dragSourceAndParamsList.length = 0;\n };\n DragAndDropService.prototype.nudge = function () {\n if (this.dragging) {\n this.onDragging(this.eventLastTime, true);\n }\n };\n DragAndDropService.prototype.onDragStart = function (dragSource, mouseEvent) {\n this.dragging = true;\n this.dragSource = dragSource;\n this.eventLastTime = mouseEvent;\n this.dragItem = this.dragSource.getDragItem();\n this.lastDropTarget = this.dragSource.dragSourceDropTarget;\n if (this.dragSource.onDragStarted) {\n this.dragSource.onDragStarted();\n }\n this.createGhost();\n };\n DragAndDropService.prototype.onDragStop = function (mouseEvent) {\n this.eventLastTime = null;\n this.dragging = false;\n if (this.dragSource.onDragStopped) {\n this.dragSource.onDragStopped();\n }\n if (this.lastDropTarget && this.lastDropTarget.onDragStop) {\n var draggingEvent = this.createDropTargetEvent(this.lastDropTarget, mouseEvent, null, null, false);\n this.lastDropTarget.onDragStop(draggingEvent);\n }\n this.lastDropTarget = null;\n this.dragItem = null;\n this.removeGhost();\n };\n DragAndDropService.prototype.onDragging = function (mouseEvent, fromNudge) {\n var _this = this;\n var hDirection = this.getHorizontalDirection(mouseEvent);\n var vDirection = this.getVerticalDirection(mouseEvent);\n this.eventLastTime = mouseEvent;\n this.positionGhost(mouseEvent);\n // check if mouseEvent intersects with any of the drop targets\n var validDropTargets = this.dropTargets.filter(function (target) { return _this.isMouseOnDropTarget(mouseEvent, target); });\n var len = validDropTargets.length;\n var dropTarget = null;\n if (len > 0) {\n dropTarget = len === 1\n ? validDropTargets[0]\n // the current mouse position could intersect with more than 1 element\n // if they are nested. In that case we need to get the most specific\n // container, which is the one that does not contain any other targets.\n : validDropTargets.reduce(function (prevTarget, currTarget) {\n if (!prevTarget) {\n return currTarget;\n }\n var prevContainer = prevTarget.getContainer();\n var currContainer = currTarget.getContainer();\n if (prevContainer.contains(currContainer)) {\n return currTarget;\n }\n return prevTarget;\n });\n }\n if (dropTarget !== this.lastDropTarget) {\n this.leaveLastTargetIfExists(mouseEvent, hDirection, vDirection, fromNudge);\n this.enterDragTargetIfExists(dropTarget, mouseEvent, hDirection, vDirection, fromNudge);\n this.lastDropTarget = dropTarget;\n }\n else if (dropTarget && dropTarget.onDragging) {\n var draggingEvent = this.createDropTargetEvent(dropTarget, mouseEvent, hDirection, vDirection, fromNudge);\n dropTarget.onDragging(draggingEvent);\n }\n };\n DragAndDropService.prototype.enterDragTargetIfExists = function (dropTarget, mouseEvent, hDirection, vDirection, fromNudge) {\n if (!dropTarget) {\n return;\n }\n if (dropTarget.onDragEnter) {\n var dragEnterEvent = this.createDropTargetEvent(dropTarget, mouseEvent, hDirection, vDirection, fromNudge);\n dropTarget.onDragEnter(dragEnterEvent);\n }\n this.setGhostIcon(dropTarget.getIconName ? dropTarget.getIconName() : null);\n };\n DragAndDropService.prototype.leaveLastTargetIfExists = function (mouseEvent, hDirection, vDirection, fromNudge) {\n if (!this.lastDropTarget) {\n return;\n }\n if (this.lastDropTarget.onDragLeave) {\n var dragLeaveEvent = this.createDropTargetEvent(this.lastDropTarget, mouseEvent, hDirection, vDirection, fromNudge);\n this.lastDropTarget.onDragLeave(dragLeaveEvent);\n }\n this.setGhostIcon(null);\n };\n DragAndDropService.prototype.getAllContainersFromDropTarget = function (dropTarget) {\n var containers = [dropTarget.getContainer()];\n var secondaryContainers = dropTarget.getSecondaryContainers ? dropTarget.getSecondaryContainers() : null;\n if (secondaryContainers) {\n containers = containers.concat(secondaryContainers);\n }\n return containers;\n };\n // checks if the mouse is on the drop target. it checks eContainer and eSecondaryContainers\n DragAndDropService.prototype.isMouseOnDropTarget = function (mouseEvent, dropTarget) {\n var mouseOverTarget = false;\n this.getAllContainersFromDropTarget(dropTarget)\n .filter(function (eContainer) { return eContainer; }) // secondary can be missing\n .forEach(function (eContainer) {\n var rect = eContainer.getBoundingClientRect();\n // if element is not visible, then width and height are zero\n if (rect.width === 0 || rect.height === 0) {\n return;\n }\n var horizontalFit = mouseEvent.clientX >= rect.left && mouseEvent.clientX < rect.right;\n var verticalFit = mouseEvent.clientY >= rect.top && mouseEvent.clientY < rect.bottom;\n if (horizontalFit && verticalFit) {\n mouseOverTarget = true;\n }\n });\n return mouseOverTarget && dropTarget.isInterestedIn(this.dragSource.type);\n };\n DragAndDropService.prototype.addDropTarget = function (dropTarget) {\n this.dropTargets.push(dropTarget);\n };\n DragAndDropService.prototype.removeDropTarget = function (dropTarget) {\n this.dropTargets = this.dropTargets.filter(function (target) { return target.getContainer() !== dropTarget.getContainer(); });\n };\n DragAndDropService.prototype.hasExternalDropZones = function () {\n return this.dropTargets.some(function (zones) { return zones.external; });\n };\n DragAndDropService.prototype.findExternalZone = function (params) {\n var externalTargets = this.dropTargets.filter(function (target) { return target.external; });\n return find(externalTargets, function (zone) { return zone.getContainer() === params.getContainer(); });\n };\n DragAndDropService.prototype.getHorizontalDirection = function (event) {\n var clientX = this.eventLastTime && this.eventLastTime.clientX;\n var eClientX = event.clientX;\n if (clientX === eClientX) {\n return null;\n }\n return clientX > eClientX ? exports.HorizontalDirection.Left : exports.HorizontalDirection.Right;\n };\n DragAndDropService.prototype.getVerticalDirection = function (event) {\n var clientY = this.eventLastTime && this.eventLastTime.clientY;\n var eClientY = event.clientY;\n if (clientY === eClientY) {\n return null;\n }\n return clientY > eClientY ? exports.VerticalDirection.Up : exports.VerticalDirection.Down;\n };\n DragAndDropService.prototype.createDropTargetEvent = function (dropTarget, event, hDirection, vDirection, fromNudge) {\n // localise x and y to the target\n var dropZoneTarget = dropTarget.getContainer();\n var rect = dropZoneTarget.getBoundingClientRect();\n var _a = this, api = _a.gridApi, columnApi = _a.columnApi, dragItem = _a.dragItem, dragSource = _a.dragSource;\n var x = event.clientX - rect.left;\n var y = event.clientY - rect.top;\n return { event: event, x: x, y: y, vDirection: vDirection, hDirection: hDirection, dragSource: dragSource, fromNudge: fromNudge, dragItem: dragItem, api: api, columnApi: columnApi, dropZoneTarget: dropZoneTarget };\n };\n DragAndDropService.prototype.positionGhost = function (event) {\n var ghost = this.eGhost;\n if (!ghost) {\n return;\n }\n var ghostRect = ghost.getBoundingClientRect();\n var ghostHeight = ghostRect.height;\n // for some reason, without the '-2', it still overlapped by 1 or 2 pixels, which\n // then brought in scrollbars to the browser. no idea why, but putting in -2 here\n // works around it which is good enough for me.\n var browserWidth = getBodyWidth() - 2;\n var browserHeight = getBodyHeight() - 2;\n var top = event.pageY - (ghostHeight / 2);\n var left = event.pageX - 10;\n var usrDocument = this.gridOptionsWrapper.getDocument();\n var windowScrollY = window.pageYOffset || usrDocument.documentElement.scrollTop;\n var windowScrollX = window.pageXOffset || usrDocument.documentElement.scrollLeft;\n // check ghost is not positioned outside of the browser\n if (browserWidth > 0 && ((left + ghost.clientWidth) > (browserWidth + windowScrollX))) {\n left = browserWidth + windowScrollX - ghost.clientWidth;\n }\n if (left < 0) {\n left = 0;\n }\n if (browserHeight > 0 && ((top + ghost.clientHeight) > (browserHeight + windowScrollY))) {\n top = browserHeight + windowScrollY - ghost.clientHeight;\n }\n if (top < 0) {\n top = 0;\n }\n ghost.style.left = left + \"px\";\n ghost.style.top = top + \"px\";\n };\n DragAndDropService.prototype.removeGhost = function () {\n if (this.eGhost && this.eGhostParent) {\n this.eGhostParent.removeChild(this.eGhost);\n }\n this.eGhost = null;\n };\n DragAndDropService.prototype.createGhost = function () {\n this.eGhost = loadTemplate(DragAndDropService_1.GHOST_TEMPLATE);\n var theme = this.environment.getTheme().theme;\n if (theme) {\n addCssClass(this.eGhost, theme);\n }\n this.eGhostIcon = this.eGhost.querySelector('.ag-dnd-ghost-icon');\n this.setGhostIcon(null);\n var eText = this.eGhost.querySelector('.ag-dnd-ghost-label');\n var dragItemName = this.dragSource.dragItemName;\n if (isFunction(dragItemName)) {\n dragItemName = dragItemName();\n }\n eText.innerHTML = escapeString(dragItemName) || '';\n this.eGhost.style.height = '25px';\n this.eGhost.style.top = '20px';\n this.eGhost.style.left = '20px';\n var usrDocument = this.gridOptionsWrapper.getDocument();\n var targetEl = usrDocument.fullscreenElement || usrDocument.querySelector('body');\n this.eGhostParent = targetEl;\n if (!this.eGhostParent) {\n console.warn('AG Grid: could not find document body, it is needed for dragging columns');\n }\n else {\n this.eGhostParent.appendChild(this.eGhost);\n }\n };\n DragAndDropService.prototype.setGhostIcon = function (iconName, shake) {\n if (shake === void 0) { shake = false; }\n clearElement(this.eGhostIcon);\n var eIcon = null;\n if (!iconName) {\n iconName = this.dragSource.defaultIconName || DragAndDropService_1.ICON_NOT_ALLOWED;\n }\n switch (iconName) {\n case DragAndDropService_1.ICON_PINNED:\n eIcon = this.ePinnedIcon;\n break;\n case DragAndDropService_1.ICON_MOVE:\n eIcon = this.eMoveIcon;\n break;\n case DragAndDropService_1.ICON_LEFT:\n eIcon = this.eLeftIcon;\n break;\n case DragAndDropService_1.ICON_RIGHT:\n eIcon = this.eRightIcon;\n break;\n case DragAndDropService_1.ICON_GROUP:\n eIcon = this.eGroupIcon;\n break;\n case DragAndDropService_1.ICON_AGGREGATE:\n eIcon = this.eAggregateIcon;\n break;\n case DragAndDropService_1.ICON_PIVOT:\n eIcon = this.ePivotIcon;\n break;\n case DragAndDropService_1.ICON_NOT_ALLOWED:\n eIcon = this.eDropNotAllowedIcon;\n break;\n case DragAndDropService_1.ICON_HIDE:\n eIcon = this.eHideIcon;\n break;\n }\n addOrRemoveCssClass(this.eGhostIcon, 'ag-shake-left-to-right', shake);\n if (eIcon === this.eHideIcon && this.gridOptionsWrapper.isSuppressDragLeaveHidesColumns()) {\n return;\n }\n if (eIcon) {\n this.eGhostIcon.appendChild(eIcon);\n }\n };\n var DragAndDropService_1;\n DragAndDropService.ICON_PINNED = 'pinned';\n DragAndDropService.ICON_MOVE = 'move';\n DragAndDropService.ICON_LEFT = 'left';\n DragAndDropService.ICON_RIGHT = 'right';\n DragAndDropService.ICON_GROUP = 'group';\n DragAndDropService.ICON_AGGREGATE = 'aggregate';\n DragAndDropService.ICON_PIVOT = 'pivot';\n DragAndDropService.ICON_NOT_ALLOWED = 'notAllowed';\n DragAndDropService.ICON_HIDE = 'hide';\n DragAndDropService.GHOST_TEMPLATE = \"
\\n \\n
\\n
\";\n __decorate$z([\n Autowired('dragService')\n ], DragAndDropService.prototype, \"dragService\", void 0);\n __decorate$z([\n Autowired('environment')\n ], DragAndDropService.prototype, \"environment\", void 0);\n __decorate$z([\n Autowired('columnApi')\n ], DragAndDropService.prototype, \"columnApi\", void 0);\n __decorate$z([\n Autowired('gridApi')\n ], DragAndDropService.prototype, \"gridApi\", void 0);\n __decorate$z([\n PostConstruct\n ], DragAndDropService.prototype, \"init\", null);\n __decorate$z([\n PreDestroy\n ], DragAndDropService.prototype, \"clearDragSourceParamsList\", null);\n DragAndDropService = DragAndDropService_1 = __decorate$z([\n Bean('dragAndDropService')\n ], DragAndDropService);\n return DragAndDropService;\n}(BeanStub));\n\n/**\n * @ag-grid-community/core - Advanced Data Grid / Data Table supporting Javascript / React / AngularJS / Web Components\n * @version v25.1.0\n * @link http://www.ag-grid.com/\n * @license MIT\n */\nvar __extends$D = (undefined && undefined.__extends) || (function () {\n var extendStatics = function (d, b) {\n extendStatics = Object.setPrototypeOf ||\n ({ __proto__: [] } instanceof Array && function (d, b) { d.__proto__ = b; }) ||\n function (d, b) { for (var p in b) if (b.hasOwnProperty(p)) d[p] = b[p]; };\n return extendStatics(d, b);\n };\n return function (d, b) {\n extendStatics(d, b);\n function __() { this.constructor = d; }\n d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __());\n };\n})();\nvar __decorate$A = (undefined && undefined.__decorate) || function (decorators, target, key, desc) {\n var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d;\n if (typeof Reflect === \"object\" && typeof Reflect.decorate === \"function\") r = Reflect.decorate(decorators, target, key, desc);\n else for (var i = decorators.length - 1; i >= 0; i--) if (d = decorators[i]) r = (c < 3 ? d(r) : c > 3 ? d(target, key, r) : d(target, key)) || r;\n return c > 3 && r && Object.defineProperty(target, key, r), r;\n};\nvar RowDragComp = /** @class */ (function (_super) {\n __extends$D(RowDragComp, _super);\n function RowDragComp(rowNode, column, cellValueFn, beans, customGui) {\n var _this = _super.call(this) || this;\n _this.rowNode = rowNode;\n _this.column = column;\n _this.cellValueFn = cellValueFn;\n _this.beans = beans;\n _this.customGui = customGui;\n _this.isCustomGui = false;\n _this.dragSource = null;\n return _this;\n }\n RowDragComp.prototype.postConstruct = function () {\n if (!this.customGui) {\n this.setTemplate(/* html */ \"
\");\n var eGui = this.getGui();\n eGui.appendChild(createIconNoSpan('rowDrag', this.beans.gridOptionsWrapper, null));\n this.addDragSource();\n }\n else {\n this.isCustomGui = true;\n this.setDragElement(this.customGui);\n }\n this.checkCompatibility();\n var strategy = this.beans.gridOptionsWrapper.isRowDragManaged() ?\n new ManagedVisibilityStrategy(this, this.beans, this.rowNode, this.column) :\n new NonManagedVisibilityStrategy(this, this.beans, this.rowNode, this.column);\n this.createManagedBean(strategy, this.beans.context);\n };\n RowDragComp.prototype.setDragElement = function (dragElement) {\n this.setTemplateFromElement(dragElement);\n this.addDragSource();\n };\n RowDragComp.prototype.getSelectedCount = function () {\n var multiRowEnabled = this.beans.gridOptionsWrapper.isEnableMultiRowDragging();\n if (!multiRowEnabled) {\n return 1;\n }\n var selection = this.beans.selectionController.getSelectedNodes();\n return selection.indexOf(this.rowNode) !== -1 ? selection.length : 1;\n };\n // returns true if all compatibility items work out\n RowDragComp.prototype.checkCompatibility = function () {\n var managed = this.beans.gridOptionsWrapper.isRowDragManaged();\n var treeData = this.beans.gridOptionsWrapper.isTreeData();\n if (treeData && managed) {\n doOnce(function () {\n return console.warn('AG Grid: If using row drag with tree data, you cannot have rowDragManaged=true');\n }, 'RowDragComp.managedAndTreeData');\n }\n };\n RowDragComp.prototype.addDragSource = function () {\n var _this = this;\n // if this is changing the drag element, delete the previous dragSource\n if (this.dragSource) {\n this.removeDragSource();\n }\n var dragItem = {\n rowNode: this.rowNode,\n columns: [this.column],\n defaultTextValue: this.cellValueFn(),\n };\n var rowDragText = this.column.getColDef().rowDragText;\n this.dragSource = {\n type: exports.DragSourceType.RowDrag,\n eElement: this.getGui(),\n dragItemName: function () {\n var dragItemCount = _this.getSelectedCount();\n if (rowDragText) {\n return rowDragText(dragItem, dragItemCount);\n }\n return dragItemCount === 1 ? _this.cellValueFn() : dragItemCount + \" rows\";\n },\n getDragItem: function () { return dragItem; },\n dragStartPixels: 0,\n dragSourceDomDataKey: this.beans.gridOptionsWrapper.getDomDataKey()\n };\n this.beans.dragAndDropService.addDragSource(this.dragSource, true);\n };\n RowDragComp.prototype.removeDragSource = function () {\n if (this.dragSource) {\n this.beans.dragAndDropService.removeDragSource(this.dragSource);\n }\n this.dragSource = null;\n };\n __decorate$A([\n PostConstruct\n ], RowDragComp.prototype, \"postConstruct\", null);\n __decorate$A([\n PreDestroy\n ], RowDragComp.prototype, \"removeDragSource\", null);\n return RowDragComp;\n}(Component));\nvar VisibilityStrategy = /** @class */ (function (_super) {\n __extends$D(VisibilityStrategy, _super);\n function VisibilityStrategy(parent, rowNode, column) {\n var _this = _super.call(this) || this;\n _this.parent = parent;\n _this.column = column;\n _this.rowNode = rowNode;\n return _this;\n }\n VisibilityStrategy.prototype.setDisplayedOrVisible = function (neverDisplayed) {\n if (neverDisplayed) {\n this.parent.setDisplayed(false);\n }\n else {\n var shown = this.column.isRowDrag(this.rowNode) || this.parent.isCustomGui;\n var isShownSometimes = isFunction(this.column.getColDef().rowDrag);\n // if shown sometimes, them some rows can have drag handle while other don't,\n // so we use setVisible to keep the handles horizontally aligned (as setVisible\n // keeps the empty space, whereas setDisplayed looses the space)\n if (isShownSometimes) {\n this.parent.setDisplayed(true);\n this.parent.setVisible(shown);\n }\n else {\n this.parent.setDisplayed(shown);\n }\n }\n };\n return VisibilityStrategy;\n}(BeanStub));\n// when non managed, the visibility depends on suppressRowDrag property only\nvar NonManagedVisibilityStrategy = /** @class */ (function (_super) {\n __extends$D(NonManagedVisibilityStrategy, _super);\n function NonManagedVisibilityStrategy(parent, beans, rowNode, column) {\n var _this = _super.call(this, parent, rowNode, column) || this;\n _this.beans = beans;\n return _this;\n }\n NonManagedVisibilityStrategy.prototype.postConstruct = function () {\n this.addManagedListener(this.beans.gridOptionsWrapper, 'suppressRowDrag', this.onSuppressRowDrag.bind(this));\n // in case data changes, then we need to update visibility of drag item\n this.addManagedListener(this.rowNode, RowNode.EVENT_DATA_CHANGED, this.workOutVisibility.bind(this));\n this.addManagedListener(this.rowNode, RowNode.EVENT_CELL_CHANGED, this.workOutVisibility.bind(this));\n this.workOutVisibility();\n };\n NonManagedVisibilityStrategy.prototype.onSuppressRowDrag = function () {\n this.workOutVisibility();\n };\n NonManagedVisibilityStrategy.prototype.workOutVisibility = function () {\n // only show the drag if both sort and filter are not present\n var neverDisplayed = this.beans.gridOptionsWrapper.isSuppressRowDrag();\n this.setDisplayedOrVisible(neverDisplayed);\n };\n __decorate$A([\n PostConstruct\n ], NonManagedVisibilityStrategy.prototype, \"postConstruct\", null);\n return NonManagedVisibilityStrategy;\n}(VisibilityStrategy));\n// when managed, the visibility depends on sort, filter and row group, as well as suppressRowDrag property\nvar ManagedVisibilityStrategy = /** @class */ (function (_super) {\n __extends$D(ManagedVisibilityStrategy, _super);\n function ManagedVisibilityStrategy(parent, beans, rowNode, column) {\n var _this = _super.call(this, parent, rowNode, column) || this;\n _this.beans = beans;\n return _this;\n }\n ManagedVisibilityStrategy.prototype.postConstruct = function () {\n // we do not show the component if sort, filter or grouping is active\n this.addManagedListener(this.beans.eventService, Events.EVENT_SORT_CHANGED, this.workOutVisibility.bind(this));\n this.addManagedListener(this.beans.eventService, Events.EVENT_FILTER_CHANGED, this.workOutVisibility.bind(this));\n this.addManagedListener(this.beans.eventService, Events.EVENT_COLUMN_ROW_GROUP_CHANGED, this.workOutVisibility.bind(this));\n // in case data changes, then we need to update visibility of drag item\n this.addManagedListener(this.rowNode, RowNode.EVENT_DATA_CHANGED, this.workOutVisibility.bind(this));\n this.addManagedListener(this.rowNode, RowNode.EVENT_CELL_CHANGED, this.workOutVisibility.bind(this));\n this.addManagedListener(this.beans.gridOptionsWrapper, 'suppressRowDrag', this.onSuppressRowDrag.bind(this));\n this.workOutVisibility();\n };\n ManagedVisibilityStrategy.prototype.onSuppressRowDrag = function () {\n this.workOutVisibility();\n };\n ManagedVisibilityStrategy.prototype.workOutVisibility = function () {\n // only show the drag if both sort and filter are not present\n var rowDragFeature = this.beans.gridPanel.getRowDragFeature();\n var shouldPreventRowMove = rowDragFeature && rowDragFeature.shouldPreventRowMove();\n var suppressRowDrag = this.beans.gridOptionsWrapper.isSuppressRowDrag();\n var hasExternalDropZones = this.beans.dragAndDropService.hasExternalDropZones();\n var neverDisplayed = (shouldPreventRowMove && !hasExternalDropZones) || suppressRowDrag;\n this.setDisplayedOrVisible(neverDisplayed);\n };\n __decorate$A([\n PostConstruct\n ], ManagedVisibilityStrategy.prototype, \"postConstruct\", null);\n return ManagedVisibilityStrategy;\n}(VisibilityStrategy));\n\n/**\n * @ag-grid-community/core - Advanced Data Grid / Data Table supporting Javascript / React / AngularJS / Web Components\n * @version v25.1.0\n * @link http://www.ag-grid.com/\n * @license MIT\n */\nvar __extends$E = (undefined && undefined.__extends) || (function () {\n var extendStatics = function (d, b) {\n extendStatics = Object.setPrototypeOf ||\n ({ __proto__: [] } instanceof Array && function (d, b) { d.__proto__ = b; }) ||\n function (d, b) { for (var p in b) if (b.hasOwnProperty(p)) d[p] = b[p]; };\n return extendStatics(d, b);\n };\n return function (d, b) {\n extendStatics(d, b);\n function __() { this.constructor = d; }\n d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __());\n };\n})();\nvar PopupEditorWrapper = /** @class */ (function (_super) {\n __extends$E(PopupEditorWrapper, _super);\n function PopupEditorWrapper(cellEditor) {\n var _this = _super.call(this, \"
\") || this;\n _this.getGuiCalledOnChild = false;\n _this.cellEditor = cellEditor;\n return _this;\n }\n PopupEditorWrapper.prototype.onKeyDown = function (event) {\n if (!isUserSuppressingKeyboardEvent(this.gridOptionsWrapper, event, this.params.node, this.params.column, true)) {\n this.params.onKeyDown(event);\n }\n };\n PopupEditorWrapper.prototype.getGui = function () {\n // we call getGui() on child here (rather than in the constructor)\n // as we should wait for 'init' to be called on child first.\n if (!this.getGuiCalledOnChild) {\n this.appendChild(this.cellEditor.getGui());\n this.getGuiCalledOnChild = true;\n }\n return _super.prototype.getGui.call(this);\n };\n PopupEditorWrapper.prototype.init = function (params) {\n var _this = this;\n this.params = params;\n this.gridOptionsWrapper.setDomData(this.getGui(), PopupEditorWrapper.DOM_KEY_POPUP_EDITOR_WRAPPER, true);\n this.addDestroyFunc(function () { return _this.destroyBean(_this.cellEditor); });\n this.addManagedListener(\n // this needs to be 'super' and not 'this' as if we call 'this',\n // it ends up called 'getGui()' on the child before 'init' was called,\n // which is not good\n _super.prototype.getGui.call(this), 'keydown', this.onKeyDown.bind(this));\n };\n PopupEditorWrapper.prototype.afterGuiAttached = function () {\n if (this.cellEditor.afterGuiAttached) {\n this.cellEditor.afterGuiAttached();\n }\n };\n PopupEditorWrapper.prototype.getValue = function () {\n return this.cellEditor.getValue();\n };\n PopupEditorWrapper.prototype.isCancelBeforeStart = function () {\n if (this.cellEditor.isCancelBeforeStart) {\n return this.cellEditor.isCancelBeforeStart();\n }\n return false;\n };\n PopupEditorWrapper.prototype.isCancelAfterEnd = function () {\n if (this.cellEditor.isCancelAfterEnd) {\n return this.cellEditor.isCancelAfterEnd();\n }\n return false;\n };\n PopupEditorWrapper.prototype.getPopupPosition = function () {\n if (this.cellEditor.getPopupPosition) {\n return this.cellEditor.getPopupPosition();\n }\n };\n PopupEditorWrapper.prototype.focusIn = function () {\n if (this.cellEditor.focusIn) {\n this.cellEditor.focusIn();\n }\n };\n PopupEditorWrapper.prototype.focusOut = function () {\n if (this.cellEditor.focusOut) {\n this.cellEditor.focusOut();\n }\n };\n PopupEditorWrapper.DOM_KEY_POPUP_EDITOR_WRAPPER = 'popupEditorWrapper';\n return PopupEditorWrapper;\n}(PopupComponent));\n\n/**\n * @ag-grid-community/core - Advanced Data Grid / Data Table supporting Javascript / React / AngularJS / Web Components\n * @version v25.1.0\n * @link http://www.ag-grid.com/\n * @license MIT\n */\nvar __extends$F = (undefined && undefined.__extends) || (function () {\n var extendStatics = function (d, b) {\n extendStatics = Object.setPrototypeOf ||\n ({ __proto__: [] } instanceof Array && function (d, b) { d.__proto__ = b; }) ||\n function (d, b) { for (var p in b) if (b.hasOwnProperty(p)) d[p] = b[p]; };\n return extendStatics(d, b);\n };\n return function (d, b) {\n extendStatics(d, b);\n function __() { this.constructor = d; }\n d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __());\n };\n})();\nvar __decorate$B = (undefined && undefined.__decorate) || function (decorators, target, key, desc) {\n var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d;\n if (typeof Reflect === \"object\" && typeof Reflect.decorate === \"function\") r = Reflect.decorate(decorators, target, key, desc);\n else for (var i = decorators.length - 1; i >= 0; i--) if (d = decorators[i]) r = (c < 3 ? d(r) : c > 3 ? d(target, key, r) : d(target, key)) || r;\n return c > 3 && r && Object.defineProperty(target, key, r), r;\n};\nvar DndSourceComp = /** @class */ (function (_super) {\n __extends$F(DndSourceComp, _super);\n function DndSourceComp(rowNode, column, cellValue, beans, eCell) {\n var _this = _super.call(this, \"
\") || this;\n _this.rowNode = rowNode;\n _this.column = column;\n _this.cellValue = cellValue;\n _this.beans = beans;\n _this.eCell = eCell;\n return _this;\n }\n DndSourceComp.prototype.postConstruct = function () {\n var eGui = this.getGui();\n eGui.appendChild(createIconNoSpan('rowDrag', this.beans.gridOptionsWrapper, null));\n // we need to stop the event propagation here to avoid starting a range selection while dragging\n this.addGuiEventListener('mousedown', function (e) {\n e.stopPropagation();\n });\n this.addDragSource();\n this.checkVisibility();\n };\n DndSourceComp.prototype.addDragSource = function () {\n this.addGuiEventListener('dragstart', this.onDragStart.bind(this));\n };\n DndSourceComp.prototype.onDragStart = function (dragEvent) {\n var _this = this;\n var providedOnRowDrag = this.column.getColDef().dndSourceOnRowDrag;\n var isIE = isBrowserIE();\n if (!isIE) {\n dragEvent.dataTransfer.setDragImage(this.eCell, 0, 0);\n }\n // default behaviour is to convert data to json and set into drag component\n var defaultOnRowDrag = function () {\n try {\n var jsonData = JSON.stringify(_this.rowNode.data);\n if (isIE) {\n dragEvent.dataTransfer.setData('text', jsonData);\n }\n else {\n dragEvent.dataTransfer.setData('application/json', jsonData);\n dragEvent.dataTransfer.setData('text/plain', jsonData);\n }\n }\n catch (e) {\n // if we cannot convert the data to json, then we do not set the type\n }\n };\n if (providedOnRowDrag) {\n providedOnRowDrag({ rowNode: this.rowNode, dragEvent: dragEvent });\n }\n else {\n defaultOnRowDrag();\n }\n };\n DndSourceComp.prototype.checkVisibility = function () {\n var visible = this.column.isDndSource(this.rowNode);\n this.setDisplayed(visible);\n };\n __decorate$B([\n PostConstruct\n ], DndSourceComp.prototype, \"postConstruct\", null);\n return DndSourceComp;\n}(Component));\n\n/**\n * @ag-grid-community/core - Advanced Data Grid / Data Table supporting Javascript / React / AngularJS / Web Components\n * @version v25.1.0\n * @link http://www.ag-grid.com/\n * @license MIT\n */\nvar __extends$G = (undefined && undefined.__extends) || (function () {\n var extendStatics = function (d, b) {\n extendStatics = Object.setPrototypeOf ||\n ({ __proto__: [] } instanceof Array && function (d, b) { d.__proto__ = b; }) ||\n function (d, b) { for (var p in b) if (b.hasOwnProperty(p)) d[p] = b[p]; };\n return extendStatics(d, b);\n };\n return function (d, b) {\n extendStatics(d, b);\n function __() { this.constructor = d; }\n d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __());\n };\n})();\nvar __assign$2 = (undefined && undefined.__assign) || function () {\n __assign$2 = Object.assign || function(t) {\n for (var s, i = 1, n = arguments.length; i < n; i++) {\n s = arguments[i];\n for (var p in s) if (Object.prototype.hasOwnProperty.call(s, p))\n t[p] = s[p];\n }\n return t;\n };\n return __assign$2.apply(this, arguments);\n};\nvar CSS_CELL = 'ag-cell';\nvar CSS_CELL_VALUE = 'ag-cell-value';\nvar CSS_AUTO_HEIGHT = 'ag-cell-auto-height';\nvar CSS_RANGE_TOP = 'ag-cell-range-top';\nvar CSS_RANGE_RIGHT = 'ag-cell-range-right';\nvar CSS_RANGE_BOTTOM = 'ag-cell-range-bottom';\nvar CSS_RANGE_LEFT = 'ag-cell-range-left';\nvar CSS_CELL_FOCUS = 'ag-cell-focus';\nvar CSS_FIRST_RIGHT_PINNED = 'ag-cell-first-right-pinned';\nvar CSS_LAST_LEFT_PINNED = 'ag-cell-last-left-pinned';\nvar CSS_NOT_INLINE_EDITING = 'ag-cell-not-inline-editing';\nvar CSS_INLINE_EDITING = 'ag-cell-inline-editing';\nvar CSS_POPUP_EDITING = 'ag-cell-popup-editing';\nvar CSS_RANGE_SELECTED = 'ag-cell-range-selected';\nvar CSS_COLUMN_HOVER = 'ag-column-hover';\nvar CSS_CELL_WRAP_TEXT = 'ag-cell-wrap-text';\nvar CSS_RANGE_CHART = 'ag-cell-range-chart';\nvar CSS_RANGE_SINGLE_CELL = 'ag-cell-range-single-cell';\nvar CSS_RANGE_CHART_CATEGORY = 'ag-cell-range-chart-category';\nvar CSS_RANGE_HANDLE = 'ag-cell-range-handle';\nvar CellComp = /** @class */ (function (_super) {\n __extends$G(CellComp, _super);\n function CellComp(scope, beans, column, rowNode, rowComp, autoHeightCell, printLayout) {\n var _this = _super.call(this) || this;\n _this.hasChartRange = false;\n _this.editingCell = false;\n _this.suppressRefreshCell = false;\n _this.tooltipFeatureEnabled = false;\n _this.scope = null;\n // every time we go into edit mode, or back again, this gets incremented.\n // it's the components way of dealing with the async nature of framework components,\n // so if a framework component takes a while to be created, we know if the object\n // is still relevant when creating is finished. eg we could click edit / un-edit 20\n // times before the first React edit component comes back - we should discard\n // the first 19.\n _this.cellEditorVersion = 0;\n _this.cellRendererVersion = 0;\n _this.scope = scope;\n _this.beans = beans;\n _this.column = column;\n _this.rowNode = rowNode;\n _this.rowComp = rowComp;\n _this.autoHeightCell = autoHeightCell;\n _this.printLayout = printLayout;\n _this.createGridCellVo();\n _this.rangeSelectionEnabled = _this.beans.rangeController && beans.gridOptionsWrapper.isEnableRangeSelection();\n _this.cellFocused = _this.beans.focusController.isCellFocused(_this.cellPosition);\n _this.firstRightPinned = _this.column.isFirstRightPinned();\n _this.lastLeftPinned = _this.column.isLastLeftPinned();\n if (_this.rangeSelectionEnabled && _this.beans.rangeController) {\n var rangeController = _this.beans.rangeController;\n _this.rangeCount = rangeController.getCellRangeCount(_this.cellPosition);\n _this.hasChartRange = _this.getHasChartRange();\n }\n _this.getValueAndFormat();\n _this.setUsingWrapper();\n _this.chooseCellRenderer();\n _this.setupColSpan();\n _this.rowSpan = _this.column.getRowSpan(_this.rowNode);\n return _this;\n }\n CellComp.prototype.getCreateTemplate = function () {\n var unselectable = !this.beans.gridOptionsWrapper.isEnableCellTextSelection() ? ' unselectable=\"on\"' : '';\n var templateParts = [];\n var col = this.column;\n var width = this.getCellWidth();\n var left = this.modifyLeftForPrintLayout(this.getCellLeft());\n var valueToRender = this.getInitialValueToRender();\n var valueSanitised = get(this.column, 'colDef.template', null) ? valueToRender : escapeString(valueToRender);\n this.tooltip = this.getToolTip();\n var tooltipSanitised = escapeString(this.tooltip);\n var colIdSanitised = escapeString(col.getId());\n var stylesFromColDef = this.preProcessStylesFromColDef();\n var cssClasses = this.getInitialCssClasses();\n var stylesForRowSpanning = this.getStylesForRowSpanning();\n var colIdxSanitised = escapeString(this.beans.columnController.getAriaColumnIndex(this.column).toString());\n templateParts.push(\"\");\n if (this.usingWrapper) {\n templateParts.push(this.getCellWrapperString(valueSanitised));\n }\n else if (valueSanitised != null) {\n templateParts.push(valueSanitised);\n }\n templateParts.push(\"
\");\n return templateParts.join('');\n };\n CellComp.prototype.getCellWrapperString = function (value) {\n if (value === void 0) { value = ''; }\n var unselectable = !this.beans.gridOptionsWrapper.isEnableCellTextSelection() ? ' unselectable=\"on\"' : '';\n var wrapper = /* html */ \"
\\n \\n \" + (value != null ? value : '') + \"\\n \\n
\";\n return wrapper;\n };\n CellComp.prototype.getStylesForRowSpanning = function () {\n if (this.rowSpan === 1) {\n return '';\n }\n var singleRowHeight = this.beans.gridOptionsWrapper.getRowHeightAsNumber();\n var totalRowHeight = singleRowHeight * this.rowSpan;\n return \"height: \" + totalRowHeight + \"px; z-index: 1;\";\n };\n CellComp.prototype.afterAttached = function () {\n var querySelector = \"[comp-id=\\\"\" + this.getCompId() + \"\\\"]\";\n var eGui = this.eParentRow.querySelector(querySelector);\n this.setGui(eGui);\n // all of these have dependencies on the eGui, so only do them after eGui is set\n this.addDomData();\n this.populateTemplate();\n this.createCellRendererInstance(true);\n this.angular1Compile();\n this.refreshHandle();\n if (exists(this.tooltip)) {\n this.createTooltipFeatureIfNeeded();\n }\n };\n CellComp.prototype.createTooltipFeatureIfNeeded = function () {\n if (this.beans.gridOptionsWrapper.isEnableBrowserTooltips() ||\n this.tooltipFeatureEnabled) {\n return;\n }\n this.createManagedBean(new TooltipFeature(this), this.beans.context);\n this.tooltipFeatureEnabled = true;\n };\n CellComp.prototype.onColumnHover = function () {\n var isHovered = this.beans.columnHoverService.isHovered(this.column);\n this.addOrRemoveCssClass(CSS_COLUMN_HOVER, isHovered);\n };\n CellComp.prototype.onCellChanged = function (event) {\n var eventImpactsThisCell = event.column === this.column;\n if (eventImpactsThisCell) {\n this.refreshCell({});\n }\n };\n CellComp.prototype.getCellLeft = function () {\n var mostLeftCol;\n if (this.beans.gridOptionsWrapper.isEnableRtl() && this.colsSpanning) {\n mostLeftCol = last(this.colsSpanning);\n }\n else {\n mostLeftCol = this.column;\n }\n return mostLeftCol.getLeft();\n };\n CellComp.prototype.getCellWidth = function () {\n if (!this.colsSpanning) {\n return this.column.getActualWidth();\n }\n return this.colsSpanning.reduce(function (width, col) { return width + col.getActualWidth(); }, 0);\n };\n CellComp.prototype.onFlashCells = function (event) {\n var cellId = this.beans.cellPositionUtils.createId(this.cellPosition);\n var shouldFlash = event.cells[cellId];\n if (shouldFlash) {\n this.animateCell('highlight');\n }\n };\n CellComp.prototype.setupColSpan = function () {\n // if no col span is active, then we don't set it up, as it would be wasteful of CPU\n if (missing(this.getComponentHolder().colSpan)) {\n return;\n }\n // because we are col spanning, a reorder of the cols can change what cols we are spanning over\n this.addManagedListener(this.beans.eventService, Events.EVENT_DISPLAYED_COLUMNS_CHANGED, this.onDisplayColumnsChanged.bind(this));\n // because we are spanning over multiple cols, we check for width any time any cols width changes.\n // this is expensive - really we should be explicitly checking only the cols we are spanning over\n // instead of every col, however it would be tricky code to track the cols we are spanning over, so\n // because hardly anyone will be using colSpan, am favouring this easier way for more maintainable code.\n this.addManagedListener(this.beans.eventService, Events.EVENT_DISPLAYED_COLUMNS_WIDTH_CHANGED, this.onWidthChanged.bind(this));\n this.colsSpanning = this.getColSpanningList();\n };\n CellComp.prototype.getColSpanningList = function () {\n var colSpan = this.column.getColSpan(this.rowNode);\n var colsSpanning = [];\n // if just one col, the col span is just the column we are in\n if (colSpan === 1) {\n colsSpanning.push(this.column);\n }\n else {\n var pointer = this.column;\n var pinned = this.column.getPinned();\n for (var i = 0; pointer && i < colSpan; i++) {\n colsSpanning.push(pointer);\n pointer = this.beans.columnController.getDisplayedColAfter(pointer);\n if (!pointer || missing(pointer)) {\n break;\n }\n // we do not allow col spanning to span outside of pinned areas\n if (pinned !== pointer.getPinned()) {\n break;\n }\n }\n }\n return colsSpanning;\n };\n CellComp.prototype.onDisplayColumnsChanged = function () {\n var colsSpanning = this.getColSpanningList();\n if (!areEqual(this.colsSpanning, colsSpanning)) {\n this.colsSpanning = colsSpanning;\n this.onWidthChanged();\n this.onLeftChanged(); // left changes when doing RTL\n }\n };\n CellComp.prototype.refreshAriaIndex = function () {\n var colIdx = this.beans.columnController.getAriaColumnIndex(this.column);\n setAriaColIndex(this.getGui(), colIdx);\n };\n CellComp.prototype.getInitialCssClasses = function () {\n var cssClasses = [CSS_CELL, CSS_NOT_INLINE_EDITING];\n // if we are putting the cell into a dummy container, to work out it's height,\n // then we don't put the height css in, as we want cell to fit height in that case.\n if (!this.autoHeightCell) {\n cssClasses.push(CSS_AUTO_HEIGHT);\n }\n var doingFocusCss = !this.beans.gridOptionsWrapper.isSuppressCellSelection();\n if (doingFocusCss && this.cellFocused) {\n // otherwise the class depends on the focus state\n cssClasses.push(CSS_CELL_FOCUS);\n }\n if (this.firstRightPinned) {\n cssClasses.push(CSS_FIRST_RIGHT_PINNED);\n }\n if (this.lastLeftPinned) {\n cssClasses.push(CSS_LAST_LEFT_PINNED);\n }\n if (this.beans.columnHoverService.isHovered(this.column)) {\n cssClasses.push(CSS_COLUMN_HOVER);\n }\n pushAll(cssClasses, this.preProcessClassesFromColDef());\n pushAll(cssClasses, this.preProcessCellClassRules());\n pushAll(cssClasses, this.getInitialRangeClasses());\n // if using the wrapper, this class goes on the wrapper instead\n if (!this.usingWrapper) {\n cssClasses.push(CSS_CELL_VALUE);\n }\n this.wrapText = this.column.getColDef().wrapText == true;\n if (this.wrapText) {\n cssClasses.push(CSS_CELL_WRAP_TEXT);\n }\n return cssClasses;\n };\n CellComp.prototype.getInitialValueToRender = function () {\n // if using a cellRenderer, then render the html from the cell renderer if it exists\n if (this.usingCellRenderer) {\n if (typeof this.cellRendererGui === 'string') {\n return this.cellRendererGui;\n }\n return '';\n }\n var colDef = this.getComponentHolder();\n if (colDef.template) {\n // template is really only used for angular 1 - as people using ng1 are used to providing templates with\n // bindings in it. in ng2, people will hopefully want to provide components, not templates.\n return colDef.template;\n }\n if (colDef.templateUrl) {\n // likewise for templateUrl - it's for ng1 really - when we move away from ng1, we can take these out.\n // niall was pro angular 1 when writing template and templateUrl, if writing from scratch now, would\n // not do these, but would follow a pattern that was friendly towards components, not templates.\n var template = this.beans.templateService.getTemplate(colDef.templateUrl, this.refreshCell.bind(this, true));\n return template || '';\n }\n return this.getValueToUse();\n };\n CellComp.prototype.getRenderedRow = function () {\n return this.rowComp;\n };\n CellComp.prototype.isSuppressNavigable = function () {\n return this.column.isSuppressNavigable(this.rowNode);\n };\n CellComp.prototype.getCellRenderer = function () {\n return this.cellRenderer;\n };\n CellComp.prototype.getCellEditor = function () {\n return this.cellEditor;\n };\n CellComp.prototype.onNewColumnsLoaded = function () {\n this.postProcessWrapText();\n this.postProcessCellClassRules();\n };\n CellComp.prototype.postProcessWrapText = function () {\n var newValue = this.column.getColDef().wrapText == true;\n if (newValue !== this.wrapText) {\n this.wrapText = newValue;\n this.addOrRemoveCssClass(CSS_CELL_WRAP_TEXT, this.wrapText);\n }\n };\n // + stop editing {forceRefresh: true, suppressFlash: true}\n // + event cellChanged {}\n // + cellRenderer.params.refresh() {} -> method passes 'as is' to the cellRenderer, so params could be anything\n // + rowComp: event dataChanged {animate: update, newData: !update}\n // + rowComp: api refreshCells() {animate: true/false}\n // + rowRenderer: api softRefreshView() {}\n CellComp.prototype.refreshCell = function (params) {\n // if we are in the middle of 'stopEditing', then we don't refresh here, as refresh gets called explicitly\n if (this.suppressRefreshCell || this.editingCell) {\n return;\n }\n var colDef = this.getComponentHolder();\n var newData = params && params.newData;\n var suppressFlash = (params && params.suppressFlash) || colDef.suppressCellFlash;\n var forceRefresh = params && params.forceRefresh;\n var oldValue = this.value;\n // get latest value without invoking the value formatter as we may not be updating the cell\n this.value = this.getValue();\n // for simple values only (not objects), see if the value is the same, and if it is, skip the refresh.\n // when never allow skipping after an edit, as after editing, we need to put the GUI back to the way\n // if was before the edit.\n var valuesDifferent = !this.valuesAreEqual(oldValue, this.value);\n var dataNeedsUpdating = forceRefresh || valuesDifferent;\n if (dataNeedsUpdating) {\n // now invoke the value formatter as we are going to update cell\n this.valueFormatted = this.beans.valueFormatterService.formatValue(this.column, this.rowNode, this.scope, this.value);\n // if it's 'new data', then we don't refresh the cellRenderer, even if refresh method is available.\n // this is because if the whole data is new (ie we are showing stock price 'BBA' now and not 'SSD')\n // then we are not showing a movement in the stock price, rather we are showing different stock.\n var cellRendererRefreshed = newData ? false : this.attemptCellRendererRefresh();\n // we do the replace if not doing refresh, or if refresh was unsuccessful.\n // the refresh can be unsuccessful if we are using a framework (eg ng2 or react) and the framework\n // wrapper has the refresh method, but the underlying component doesn't\n if (!cellRendererRefreshed) {\n this.replaceContentsAfterRefresh();\n }\n // we don't want to flash the cells when processing a filter change, as otherwise the UI would\n // be to busy. see comment in FilterManager with regards processingFilterChange\n var processingFilterChange = this.beans.filterManager.isSuppressFlashingCellsBecauseFiltering();\n var flashCell = !suppressFlash && !processingFilterChange &&\n (this.beans.gridOptionsWrapper.isEnableCellChangeFlash() || colDef.enableCellChangeFlash);\n if (flashCell) {\n this.flashCell();\n }\n // need to check rules. note, we ignore colDef classes and styles, these are assumed to be static\n this.postProcessStylesFromColDef();\n this.postProcessClassesFromColDef();\n }\n // we can't readily determine if the data in an angularjs template has changed, so here we just update\n // and recompile (if applicable)\n this.updateAngular1ScopeAndCompile();\n this.refreshToolTip();\n // we do cellClassRules even if the value has not changed, so that users who have rules that\n // look at other parts of the row (where the other part of the row might of changed) will work.\n this.postProcessCellClassRules();\n };\n // user can also call this via API\n CellComp.prototype.flashCell = function (delays) {\n var flashDelay = delays && delays.flashDelay;\n var fadeDelay = delays && delays.fadeDelay;\n this.animateCell('data-changed', flashDelay, fadeDelay);\n };\n CellComp.prototype.animateCell = function (cssName, flashDelay, fadeDelay) {\n var _this = this;\n var fullName = \"ag-cell-\" + cssName;\n var animationFullName = \"ag-cell-\" + cssName + \"-animation\";\n var element = this.getGui();\n var gridOptionsWrapper = this.beans.gridOptionsWrapper;\n if (!flashDelay) {\n flashDelay = gridOptionsWrapper.getCellFlashDelay();\n }\n if (!exists(fadeDelay)) {\n fadeDelay = gridOptionsWrapper.getCellFadeDelay();\n }\n // we want to highlight the cells, without any animation\n this.addCssClass(fullName);\n this.removeCssClass(animationFullName);\n // then once that is applied, we remove the highlight with animation\n window.setTimeout(function () {\n _this.removeCssClass(fullName);\n _this.addCssClass(animationFullName);\n element.style.transition = \"background-color \" + fadeDelay + \"ms\";\n window.setTimeout(function () {\n // and then to leave things as we got them, we remove the animation\n _this.removeCssClass(animationFullName);\n element.style.removeProperty('transition');\n }, fadeDelay);\n }, flashDelay);\n };\n CellComp.prototype.replaceContentsAfterRefresh = function () {\n this.setUsingWrapper();\n clearElement(this.eCellValue);\n // remove old renderer component if it exists\n this.cellRenderer = this.beans.context.destroyBean(this.cellRenderer);\n this.cellRendererGui = null;\n // populate\n this.putDataIntoCellAfterRefresh();\n this.updateAngular1ScopeAndCompile();\n };\n CellComp.prototype.updateAngular1ScopeAndCompile = function () {\n if (this.beans.gridOptionsWrapper.isAngularCompileRows() && this.scope) {\n this.scope.data = __assign$2({}, this.rowNode.data);\n this.angular1Compile();\n }\n };\n CellComp.prototype.angular1Compile = function () {\n // if angular compiling, then need to also compile the cell again (angular compiling sucks, please wait...)\n if (this.beans.gridOptionsWrapper.isAngularCompileRows()) {\n var eGui = this.getGui();\n // only compile the node if it hasn't already been done\n // this prevents \"orphaned\" node leaks\n if (!eGui.classList.contains('ng-scope') || eGui.childElementCount === 0) {\n var compiledElement_1 = this.beans.$compile(eGui)(this.scope);\n this.addDestroyFunc(function () { return compiledElement_1.remove(); });\n }\n }\n };\n CellComp.prototype.postProcessStylesFromColDef = function () {\n var stylesToUse = this.processStylesFromColDef();\n if (stylesToUse) {\n addStylesToElement(this.getGui(), stylesToUse);\n }\n };\n CellComp.prototype.preProcessStylesFromColDef = function () {\n return cssStyleObjectToMarkup(this.processStylesFromColDef());\n };\n CellComp.prototype.processStylesFromColDef = function () {\n var colDef = this.getComponentHolder();\n if (colDef.cellStyle) {\n var cssToUse = void 0;\n if (typeof colDef.cellStyle === 'function') {\n var cellStyleParams = {\n column: this.column,\n value: this.value,\n colDef: colDef,\n data: this.rowNode.data,\n node: this.rowNode,\n rowIndex: this.rowNode.rowIndex,\n $scope: this.scope,\n api: this.beans.gridOptionsWrapper.getApi(),\n columnApi: this.beans.gridOptionsWrapper.getColumnApi(),\n context: this.beans.gridOptionsWrapper.getContext(),\n };\n var cellStyleFunc = colDef.cellStyle;\n cssToUse = cellStyleFunc(cellStyleParams);\n }\n else {\n cssToUse = colDef.cellStyle;\n }\n return cssToUse;\n }\n };\n CellComp.prototype.postProcessClassesFromColDef = function () {\n var _this = this;\n this.processClassesFromColDef(function (className) { return _this.addCssClass(className); });\n };\n CellComp.prototype.preProcessClassesFromColDef = function () {\n var res = [];\n this.processClassesFromColDef(function (className) { return res.push(className); });\n return res;\n };\n CellComp.prototype.processClassesFromColDef = function (onApplicableClass) {\n var colDef = this.getComponentHolder();\n var cellClassParams = {\n value: this.value,\n data: this.rowNode.data,\n node: this.rowNode,\n colDef: colDef,\n rowIndex: this.rowNode.rowIndex,\n $scope: this.scope,\n api: this.beans.gridOptionsWrapper.getApi(),\n columnApi: this.beans.gridOptionsWrapper.getColumnApi(),\n context: this.beans.gridOptionsWrapper.getContext()\n };\n this.beans.stylingService.processStaticCellClasses(colDef, cellClassParams, onApplicableClass);\n };\n CellComp.prototype.putDataIntoCellAfterRefresh = function () {\n // template gets preference, then cellRenderer, then do it ourselves\n var colDef = this.getComponentHolder();\n if (colDef.template) {\n // template is really only used for angular 1 - as people using ng1 are used to providing templates with\n // bindings in it. in ng2, people will hopefully want to provide components, not templates.\n this.eCellValue.innerHTML = colDef.template;\n }\n else if (colDef.templateUrl) {\n // likewise for templateUrl - it's for ng1 really - when we move away from ng1, we can take these out.\n // niall was pro angular 1 when writing template and templateUrl, if writing from scratch now, would\n // not do these, but would follow a pattern that was friendly towards components, not templates.\n var template = this.beans.templateService.getTemplate(colDef.templateUrl, this.refreshCell.bind(this, true));\n if (template) {\n this.eCellValue.innerHTML = template;\n }\n }\n else {\n // we can switch from using a cell renderer back to the default if a user\n // is using cellRendererSelect\n this.chooseCellRenderer();\n if (this.usingCellRenderer) {\n this.createCellRendererInstance();\n }\n else {\n var valueToUse = this.getValueToUse();\n if (valueToUse != null) {\n this.eCellValue.innerHTML = escapeString(valueToUse) || '';\n }\n }\n }\n };\n CellComp.prototype.attemptCellRendererRefresh = function () {\n if (missing(this.cellRenderer) || !this.cellRenderer || missing(this.cellRenderer.refresh)) {\n return false;\n }\n // if the cell renderer has a refresh method, we call this instead of doing a refresh\n var params = this.createCellRendererParams();\n // take any custom params off of the user\n var finalParams = this.beans.userComponentFactory.createFinalParams(this.getComponentHolder(), this.cellRendererType, params);\n var result = this.cellRenderer.refresh(finalParams);\n // NOTE on undefined: previous version of the cellRenderer.refresh() interface\n // returned nothing, if the method existed, we assumed it refreshed. so for\n // backwards compatibility, we assume if method exists and returns nothing,\n // that it was successful.\n return result === true || result === undefined;\n };\n CellComp.prototype.refreshToolTip = function () {\n var newTooltip = this.getToolTip();\n if (this.tooltip === newTooltip) {\n return;\n }\n this.createTooltipFeatureIfNeeded();\n var hasNewTooltip = exists(newTooltip);\n if (hasNewTooltip && this.tooltip === newTooltip.toString()) {\n return;\n }\n this.tooltip = newTooltip;\n if (this.beans.gridOptionsWrapper.isEnableBrowserTooltips()) {\n if (hasNewTooltip) {\n this.eCellValue.setAttribute('title', this.tooltip);\n }\n else {\n this.eCellValue.removeAttribute('title');\n }\n }\n };\n CellComp.prototype.valuesAreEqual = function (val1, val2) {\n // if the user provided an equals method, use that, otherwise do simple comparison\n var colDef = this.getComponentHolder();\n var equalsMethod = colDef ? colDef.equals : null;\n return equalsMethod ? equalsMethod(val1, val2) : val1 === val2;\n };\n CellComp.prototype.getToolTip = function () {\n var colDef = this.getComponentHolder();\n var data = this.rowNode.data;\n if (colDef.tooltipField && exists(data)) {\n return getValueUsingField(data, colDef.tooltipField, this.column.isTooltipFieldContainsDots());\n }\n var valueGetter = colDef.tooltipValueGetter;\n if (valueGetter) {\n return valueGetter(__assign$2(__assign$2({ api: this.beans.gridOptionsWrapper.getApi(), columnApi: this.beans.gridOptionsWrapper.getColumnApi(), context: this.beans.gridOptionsWrapper.getContext() }, this.getTooltipParams()), { value: this.value }));\n }\n return null;\n };\n CellComp.prototype.getTooltipParams = function () {\n return {\n location: 'cell',\n colDef: this.getComponentHolder(),\n column: this.getColumn(),\n rowIndex: this.cellPosition.rowIndex,\n node: this.rowNode,\n data: this.rowNode.data,\n value: this.getTooltipText(),\n valueFormatted: this.valueFormatted,\n };\n };\n CellComp.prototype.getTooltipText = function (escape) {\n if (escape === void 0) { escape = true; }\n return escape ? escapeString(this.tooltip) : this.tooltip;\n };\n CellComp.prototype.processCellClassRules = function (onApplicableClass, onNotApplicableClass) {\n var colDef = this.getComponentHolder();\n var cellClassParams = {\n value: this.value,\n data: this.rowNode.data,\n node: this.rowNode,\n colDef: colDef,\n rowIndex: this.cellPosition.rowIndex,\n api: this.beans.gridOptionsWrapper.getApi(),\n columnApi: this.beans.gridOptionsWrapper.getColumnApi(),\n $scope: this.scope,\n context: this.beans.gridOptionsWrapper.getContext()\n };\n this.beans.stylingService.processClassRules(colDef.cellClassRules, cellClassParams, onApplicableClass, onNotApplicableClass);\n };\n CellComp.prototype.postProcessCellClassRules = function () {\n var _this = this;\n this.processCellClassRules(function (className) { return _this.addCssClass(className); }, function (className) { return _this.removeCssClass(className); });\n };\n CellComp.prototype.preProcessCellClassRules = function () {\n var res = [];\n this.processCellClassRules(function (className) { return res.push(className); }, function (_) {\n // not catered for, if creating, no need\n // to remove class as it was never there\n });\n return res;\n };\n // a wrapper is used when we are putting a selection checkbox in the cell with the value\n CellComp.prototype.setUsingWrapper = function () {\n var colDef = this.getComponentHolder();\n // never allow selection or dragging on pinned rows\n if (this.rowNode.rowPinned) {\n this.usingWrapper = false;\n this.includeSelectionComponent = false;\n this.includeRowDraggingComponent = false;\n this.includeDndSourceComponent = false;\n return;\n }\n var cbSelectionIsFunc = typeof colDef.checkboxSelection === 'function';\n var rowDraggableIsFunc = typeof colDef.rowDrag === 'function';\n var dndSourceIsFunc = typeof colDef.dndSource === 'function';\n this.includeSelectionComponent = cbSelectionIsFunc || colDef.checkboxSelection === true;\n this.includeRowDraggingComponent = rowDraggableIsFunc || colDef.rowDrag === true;\n this.includeDndSourceComponent = dndSourceIsFunc || colDef.dndSource === true;\n var enableTextSelection = this.beans.gridOptionsWrapper.isEnableCellTextSelection();\n this.usingWrapper = enableTextSelection || this.includeRowDraggingComponent || this.includeSelectionComponent || this.includeDndSourceComponent;\n };\n CellComp.prototype.chooseCellRenderer = function () {\n // template gets preference, then cellRenderer, then do it ourselves\n var colDef = this.getComponentHolder();\n // templates are for ng1, ideally we wouldn't have these, they are ng1 support\n // inside the core which is bad\n if (colDef.template || colDef.templateUrl) {\n this.usingCellRenderer = false;\n return;\n }\n var params = this.createCellRendererParams();\n if (this.rowNode.rowPinned &&\n this.beans.userComponentFactory.lookupComponentClassDef(colDef, 'pinnedRowCellRenderer', params)) {\n this.cellRendererType = CellComp.CELL_RENDERER_TYPE_PINNED;\n this.usingCellRenderer = true;\n }\n else if (this.beans.userComponentFactory.lookupComponentClassDef(colDef, 'cellRenderer', params)) {\n this.cellRendererType = CellComp.CELL_RENDERER_TYPE_NORMAL;\n this.usingCellRenderer = true;\n }\n else {\n this.usingCellRenderer = false;\n }\n };\n CellComp.prototype.createCellRendererInstance = function (useTaskService) {\n var _this = this;\n if (useTaskService === void 0) { useTaskService = false; }\n if (!this.usingCellRenderer) {\n return;\n }\n // never use task service if angularCompileRows=true, as that assume the cell renderers\n // are finished when the row is created. also we never use it if animation frame service\n // is turned off.\n // and lastly we never use it if doing auto-height, as the auto-height service checks the\n // row height directly after the cell is created, it doesn't wait around for the tasks to complete\n var angularCompileRows = this.beans.gridOptionsWrapper.isAngularCompileRows();\n var suppressAnimationFrame = this.beans.gridOptionsWrapper.isSuppressAnimationFrame();\n if (angularCompileRows || suppressAnimationFrame || this.autoHeightCell) {\n useTaskService = false;\n }\n var params = this.createCellRendererParams();\n this.cellRendererVersion++;\n var callback = this.afterCellRendererCreated.bind(this, this.cellRendererVersion);\n var cellRendererTypeNormal = this.cellRendererType === CellComp.CELL_RENDERER_TYPE_NORMAL;\n this.createCellRendererFunc = function () {\n _this.createCellRendererFunc = null;\n // this can return null in the event that the user has switched from a renderer component to nothing, for example\n // when using a cellRendererSelect to return a component or null depending on row data etc\n var componentPromise = _this.beans.userComponentFactory.newCellRenderer(_this.getComponentHolder(), params, !cellRendererTypeNormal);\n if (componentPromise) {\n componentPromise.then(callback);\n }\n };\n if (useTaskService) {\n this.beans.taskQueue.createTask(this.createCellRendererFunc, this.rowNode.rowIndex, 'createTasksP2');\n }\n else {\n this.createCellRendererFunc();\n }\n };\n CellComp.prototype.afterCellRendererCreated = function (cellRendererVersion, cellRenderer) {\n var cellRendererNotRequired = !this.isAlive() || cellRendererVersion !== this.cellRendererVersion;\n if (cellRendererNotRequired) {\n this.beans.context.destroyBean(cellRenderer);\n return;\n }\n this.cellRenderer = cellRenderer;\n this.cellRendererGui = this.cellRenderer.getGui();\n if (missing(this.cellRendererGui)) {\n return;\n }\n // if async components, then it's possible the user started editing since this call was made\n if (!this.editingCell) {\n this.eCellValue.appendChild(this.cellRendererGui);\n }\n };\n CellComp.prototype.createCellRendererParams = function () {\n var _this = this;\n return {\n value: this.value,\n valueFormatted: this.valueFormatted,\n getValue: this.getValue.bind(this),\n setValue: function (value) { return _this.beans.valueService.setValue(_this.rowNode, _this.column, value); },\n formatValue: this.formatValue.bind(this),\n data: this.rowNode.data,\n node: this.rowNode,\n colDef: this.getComponentHolder(),\n column: this.column,\n $scope: this.scope,\n rowIndex: this.cellPosition.rowIndex,\n api: this.beans.gridOptionsWrapper.getApi(),\n columnApi: this.beans.gridOptionsWrapper.getColumnApi(),\n context: this.beans.gridOptionsWrapper.getContext(),\n refreshCell: this.refreshCell.bind(this),\n eGridCell: this.getGui(),\n eParentOfValue: this.eCellValue,\n registerRowDragger: function (element) { return _this.addRowDragging(element); },\n // these bits are not documented anywhere, so we could drop them?\n // it was in the olden days to allow user to register for when rendered\n // row was removed (the row comp was removed), however now that the user\n // can provide components for cells, the destroy method gets call when this\n // happens so no longer need to fire event.\n addRowCompListener: this.rowComp ? this.rowComp.addEventListener.bind(this.rowComp) : null,\n addRenderedRowListener: function (eventType, listener) {\n console.warn('AG Grid: since AG Grid .v11, params.addRenderedRowListener() is now params.addRowCompListener()');\n if (_this.rowComp) {\n _this.rowComp.addEventListener(eventType, listener);\n }\n }\n };\n };\n CellComp.prototype.formatValue = function (value) {\n var valueFormatted = this.beans.valueFormatterService.formatValue(this.column, this.rowNode, this.scope, value);\n return valueFormatted != null ? valueFormatted : value;\n };\n CellComp.prototype.getValueToUse = function () {\n return this.valueFormatted != null ? this.valueFormatted : this.value;\n };\n CellComp.prototype.getValueAndFormat = function () {\n this.value = this.getValue();\n this.valueFormatted = this.beans.valueFormatterService.formatValue(this.column, this.rowNode, this.scope, this.value);\n };\n CellComp.prototype.getValue = function () {\n // if we don't check this, then the grid will render leaf groups as open even if we are not\n // allowing the user to open leaf groups. confused? remember for pivot mode we don't allow\n // opening leaf groups, so we have to force leafGroups to be closed in case the user expanded\n // them via the API, or user user expanded them in the UI before turning on pivot mode\n var lockedClosedGroup = this.rowNode.leafGroup && this.beans.columnController.isPivotMode();\n var isOpenGroup = this.rowNode.group && this.rowNode.expanded && !this.rowNode.footer && !lockedClosedGroup;\n // are we showing group footers\n var groupFootersEnabled = this.beans.gridOptionsWrapper.isGroupIncludeFooter();\n // if doing footers, we normally don't show agg data at group level when group is open\n var groupAlwaysShowAggData = this.beans.gridOptionsWrapper.isGroupSuppressBlankHeader();\n // if doing grouping and footers, we don't want to include the agg value\n // in the header when the group is open\n var ignoreAggData = (isOpenGroup && groupFootersEnabled) && !groupAlwaysShowAggData;\n var value = this.beans.valueService.getValue(this.column, this.rowNode, false, ignoreAggData);\n return value;\n };\n CellComp.prototype.onMouseEvent = function (eventName, mouseEvent) {\n if (isStopPropagationForAgGrid(mouseEvent)) {\n return;\n }\n switch (eventName) {\n case 'click':\n this.onCellClicked(mouseEvent);\n break;\n case 'mousedown':\n this.onMouseDown(mouseEvent);\n break;\n case 'dblclick':\n this.onCellDoubleClicked(mouseEvent);\n break;\n case 'mouseout':\n this.onMouseOut(mouseEvent);\n break;\n case 'mouseover':\n this.onMouseOver(mouseEvent);\n break;\n }\n };\n CellComp.prototype.dispatchCellContextMenuEvent = function (event) {\n var colDef = this.getComponentHolder();\n var cellContextMenuEvent = this.createEvent(event, Events.EVENT_CELL_CONTEXT_MENU);\n this.beans.eventService.dispatchEvent(cellContextMenuEvent);\n if (colDef.onCellContextMenu) {\n // to make the callback async, do in a timeout\n window.setTimeout(function () { return colDef.onCellContextMenu(cellContextMenuEvent); }, 0);\n }\n };\n CellComp.prototype.createEvent = function (domEvent, eventType) {\n var event = {\n node: this.rowNode,\n data: this.rowNode.data,\n value: this.value,\n column: this.column,\n colDef: this.getComponentHolder(),\n context: this.beans.gridOptionsWrapper.getContext(),\n api: this.beans.gridApi,\n columnApi: this.beans.columnApi,\n rowPinned: this.rowNode.rowPinned,\n event: domEvent,\n type: eventType,\n rowIndex: this.rowNode.rowIndex\n };\n // because we are hacking in $scope for angular 1, we have to de-reference\n if (this.scope) {\n event.$scope = this.scope;\n }\n return event;\n };\n CellComp.prototype.onMouseOut = function (mouseEvent) {\n var cellMouseOutEvent = this.createEvent(mouseEvent, Events.EVENT_CELL_MOUSE_OUT);\n this.beans.eventService.dispatchEvent(cellMouseOutEvent);\n this.beans.columnHoverService.clearMouseOver();\n };\n CellComp.prototype.onMouseOver = function (mouseEvent) {\n var cellMouseOverEvent = this.createEvent(mouseEvent, Events.EVENT_CELL_MOUSE_OVER);\n this.beans.eventService.dispatchEvent(cellMouseOverEvent);\n this.beans.columnHoverService.setMouseOver([this.column]);\n };\n CellComp.prototype.onCellDoubleClicked = function (mouseEvent) {\n var colDef = this.getComponentHolder();\n // always dispatch event to eventService\n var cellDoubleClickedEvent = this.createEvent(mouseEvent, Events.EVENT_CELL_DOUBLE_CLICKED);\n this.beans.eventService.dispatchEvent(cellDoubleClickedEvent);\n // check if colDef also wants to handle event\n if (typeof colDef.onCellDoubleClicked === 'function') {\n // to make the callback async, do in a timeout\n window.setTimeout(function () { return colDef.onCellDoubleClicked(cellDoubleClickedEvent); }, 0);\n }\n var editOnDoubleClick = !this.beans.gridOptionsWrapper.isSingleClickEdit()\n && !this.beans.gridOptionsWrapper.isSuppressClickEdit();\n if (editOnDoubleClick) {\n this.startRowOrCellEdit();\n }\n };\n // called by rowRenderer when user navigates via tab key\n CellComp.prototype.startRowOrCellEdit = function (keyPress, charPress) {\n if (this.beans.gridOptionsWrapper.isFullRowEdit()) {\n this.rowComp.startRowEditing(keyPress, charPress, this);\n }\n else {\n this.startEditingIfEnabled(keyPress, charPress, true);\n }\n };\n CellComp.prototype.isCellEditable = function () {\n return this.column.isCellEditable(this.rowNode);\n };\n // either called internally if single cell editing, or called by rowRenderer if row editing\n CellComp.prototype.startEditingIfEnabled = function (keyPress, charPress, cellStartedEdit) {\n if (keyPress === void 0) { keyPress = null; }\n if (charPress === void 0) { charPress = null; }\n if (cellStartedEdit === void 0) { cellStartedEdit = false; }\n // don't do it if not editable\n if (!this.isCellEditable()) {\n return;\n }\n // don't do it if already editing\n if (this.editingCell) {\n return;\n }\n this.editingCell = true;\n this.cellEditorVersion++;\n var callback = this.afterCellEditorCreated.bind(this, this.cellEditorVersion);\n var params = this.createCellEditorParams(keyPress, charPress, cellStartedEdit);\n this.createCellEditor(params).then(callback);\n // if we don't do this, and editor component is async, then there will be a period\n // when the component isn't present and keyboard navigation won't work - so example\n // of user hitting tab quickly (more quickly than renderers getting created) won't work\n var cellEditorAsync = missing(this.cellEditor);\n if (cellEditorAsync && cellStartedEdit) {\n this.focusCell(true);\n }\n };\n CellComp.prototype.createCellEditor = function (params) {\n var _this = this;\n var cellEditorPromise = this.beans.userComponentFactory.newCellEditor(this.column.getColDef(), params);\n return cellEditorPromise.then(function (cellEditor) {\n var cellEditorComp = cellEditor;\n var isPopup = cellEditorComp.isPopup && cellEditorComp.isPopup();\n if (!isPopup) {\n return cellEditorComp;\n }\n if (_this.beans.gridOptionsWrapper.isFullRowEdit()) {\n console.warn('AG Grid: popup cellEditor does not work with fullRowEdit - you cannot use them both ' +\n '- either turn off fullRowEdit, or stop using popup editors.');\n }\n // if a popup, then we wrap in a popup editor and return the popup\n var popupEditorWrapper = new PopupEditorWrapper(cellEditorComp);\n _this.beans.context.createBean(popupEditorWrapper);\n popupEditorWrapper.init(params);\n return popupEditorWrapper;\n });\n };\n CellComp.prototype.afterCellEditorCreated = function (cellEditorVersion, cellEditor) {\n // if editingCell=false, means user cancelled the editor before component was ready.\n // if versionMismatch, then user cancelled the edit, then started the edit again, and this\n // is the first editor which is now stale.\n var versionMismatch = cellEditorVersion !== this.cellEditorVersion;\n var cellEditorNotNeeded = versionMismatch || !this.editingCell;\n if (cellEditorNotNeeded) {\n this.beans.context.destroyBean(cellEditor);\n return;\n }\n var editingCancelledByUserComp = cellEditor.isCancelBeforeStart && cellEditor.isCancelBeforeStart();\n if (editingCancelledByUserComp) {\n this.beans.context.destroyBean(cellEditor);\n this.editingCell = false;\n return;\n }\n if (!cellEditor.getGui) {\n console.warn(\"AG Grid: cellEditor for column \" + this.column.getId() + \" is missing getGui() method\");\n // no getGui, for React guys, see if they attached a react component directly\n if (cellEditor.render) {\n console.warn(\"AG Grid: we found 'render' on the component, are you trying to set a React renderer but added it as colDef.cellEditor instead of colDef.cellEditorFmk?\");\n }\n this.beans.context.destroyBean(cellEditor);\n this.editingCell = false;\n return;\n }\n this.cellEditor = cellEditor;\n this.cellEditorInPopup = cellEditor.isPopup !== undefined && cellEditor.isPopup();\n this.setInlineEditingClass();\n if (this.cellEditorInPopup) {\n this.addPopupCellEditor();\n }\n else {\n this.addInCellEditor();\n }\n if (cellEditor.afterGuiAttached) {\n cellEditor.afterGuiAttached();\n }\n var event = this.createEvent(null, Events.EVENT_CELL_EDITING_STARTED);\n this.beans.eventService.dispatchEvent(event);\n };\n CellComp.prototype.addInCellEditor = function () {\n var eGui = this.getGui();\n // if focus is inside the cell, we move focus to the cell itself\n // before removing it's contents, otherwise errors could be thrown.\n if (eGui.contains(document.activeElement)) {\n eGui.focus();\n }\n this.clearCellElement();\n if (this.cellEditor) {\n eGui.appendChild(this.cellEditor.getGui());\n }\n this.angular1Compile();\n };\n CellComp.prototype.addPopupCellEditor = function () {\n var _this = this;\n var ePopupGui = this.cellEditor && this.cellEditor.getGui();\n if (!ePopupGui) {\n return;\n }\n var popupService = this.beans.popupService;\n var useModelPopup = this.beans.gridOptionsWrapper.isStopEditingWhenGridLosesFocus();\n var position = this.cellEditor && this.cellEditor.getPopupPosition ? this.cellEditor.getPopupPosition() : 'over';\n var params = {\n column: this.column,\n rowNode: this.rowNode,\n type: 'popupCellEditor',\n eventSource: this.getGui(),\n ePopup: ePopupGui,\n keepWithinBounds: true\n };\n var positionCallback = position === 'under' ?\n popupService.positionPopupUnderComponent.bind(popupService, params)\n : popupService.positionPopupOverComponent.bind(popupService, params);\n var addPopupRes = popupService.addPopup({\n modal: useModelPopup,\n eChild: ePopupGui,\n closeOnEsc: true,\n closedCallback: function () { _this.onPopupEditorClosed(); },\n anchorToElement: this.getGui(),\n positionCallback: positionCallback\n });\n if (addPopupRes) {\n this.hideEditorPopup = addPopupRes.hideFunc;\n }\n this.angular1Compile();\n };\n CellComp.prototype.onPopupEditorClosed = function () {\n // we only call stopEditing if we are editing, as\n // it's possible the popup called 'stop editing'\n // before this, eg if 'enter key' was pressed on\n // the editor.\n if (!this.editingCell) {\n return;\n }\n // note: this only happens when use clicks outside of the grid. if use clicks on another\n // cell, then the editing will have already stopped on this cell\n this.stopRowOrCellEdit();\n };\n // if we are editing inline, then we don't have the padding in the cell (set in the themes)\n // to allow the text editor full access to the entire cell\n CellComp.prototype.setInlineEditingClass = function () {\n if (!this.isAlive()) {\n return;\n }\n // ag-cell-inline-editing - appears when user is inline editing\n // ag-cell-not-inline-editing - appears when user is no inline editing\n // ag-cell-popup-editing - appears when user is editing cell in popup (appears on the cell, not on the popup)\n // note: one of {ag-cell-inline-editing, ag-cell-not-inline-editing} is always present, they toggle.\n // however {ag-cell-popup-editing} shows when popup, so you have both {ag-cell-popup-editing}\n // and {ag-cell-not-inline-editing} showing at the same time.\n var editingInline = this.editingCell && !this.cellEditorInPopup;\n var popupEditorShowing = this.editingCell && this.cellEditorInPopup;\n this.addOrRemoveCssClass(CSS_INLINE_EDITING, editingInline);\n this.addOrRemoveCssClass(CSS_NOT_INLINE_EDITING, !editingInline);\n this.addOrRemoveCssClass(CSS_POPUP_EDITING, popupEditorShowing);\n addOrRemoveCssClass(this.getGui().parentNode, \"ag-row-inline-editing\", editingInline);\n addOrRemoveCssClass(this.getGui().parentNode, \"ag-row-not-inline-editing\", !editingInline);\n };\n CellComp.prototype.createCellEditorParams = function (keyPress, charPress, cellStartedEdit) {\n return {\n value: this.getValue(),\n keyPress: keyPress,\n charPress: charPress,\n column: this.column,\n colDef: this.column.getColDef(),\n rowIndex: this.cellPosition.rowIndex,\n node: this.rowNode,\n data: this.rowNode.data,\n api: this.beans.gridOptionsWrapper.getApi(),\n cellStartedEdit: cellStartedEdit,\n columnApi: this.beans.gridOptionsWrapper.getColumnApi(),\n context: this.beans.gridOptionsWrapper.getContext(),\n $scope: this.scope,\n onKeyDown: this.onKeyDown.bind(this),\n stopEditing: this.stopEditingAndFocus.bind(this),\n eGridCell: this.getGui(),\n parseValue: this.parseValue.bind(this),\n formatValue: this.formatValue.bind(this)\n };\n };\n // cell editors call this, when they want to stop for reasons other\n // than what we pick up on. eg selecting from a dropdown ends editing.\n CellComp.prototype.stopEditingAndFocus = function (suppressNavigateAfterEdit) {\n if (suppressNavigateAfterEdit === void 0) { suppressNavigateAfterEdit = false; }\n this.stopRowOrCellEdit();\n this.focusCell(true);\n if (!suppressNavigateAfterEdit) {\n this.navigateAfterEdit();\n }\n };\n CellComp.prototype.parseValue = function (newValue) {\n var colDef = this.getComponentHolder();\n var params = {\n node: this.rowNode,\n data: this.rowNode.data,\n oldValue: this.value,\n newValue: newValue,\n colDef: colDef,\n column: this.column,\n api: this.beans.gridOptionsWrapper.getApi(),\n columnApi: this.beans.gridOptionsWrapper.getColumnApi(),\n context: this.beans.gridOptionsWrapper.getContext()\n };\n var valueParser = colDef.valueParser;\n return exists(valueParser) ? this.beans.expressionService.evaluate(valueParser, params) : newValue;\n };\n CellComp.prototype.focusCell = function (forceBrowserFocus) {\n if (forceBrowserFocus === void 0) { forceBrowserFocus = false; }\n this.beans.focusController.setFocusedCell(this.cellPosition.rowIndex, this.column, this.rowNode.rowPinned, forceBrowserFocus);\n };\n CellComp.prototype.setFocusInOnEditor = function () {\n if (this.editingCell) {\n if (this.cellEditor && this.cellEditor.focusIn) {\n // if the editor is present, then we just focus it\n this.cellEditor.focusIn();\n }\n else {\n // if the editor is not present, it means async cell editor (eg React fibre)\n // and we are trying to set focus before the cell editor is present, so we\n // focus the cell instead\n this.focusCell(true);\n }\n }\n };\n CellComp.prototype.isEditing = function () {\n return this.editingCell;\n };\n CellComp.prototype.onKeyDown = function (event) {\n var key = event.which || event.keyCode;\n switch (key) {\n case KeyCode.ENTER:\n this.onEnterKeyDown(event);\n break;\n case KeyCode.F2:\n this.onF2KeyDown();\n break;\n case KeyCode.ESCAPE:\n this.onEscapeKeyDown();\n break;\n case KeyCode.TAB:\n this.onTabKeyDown(event);\n break;\n case KeyCode.BACKSPACE:\n case KeyCode.DELETE:\n this.onBackspaceOrDeleteKeyPressed(key);\n break;\n case KeyCode.DOWN:\n case KeyCode.UP:\n case KeyCode.RIGHT:\n case KeyCode.LEFT:\n this.onNavigationKeyPressed(event, key);\n break;\n }\n };\n CellComp.prototype.setFocusOutOnEditor = function () {\n if (this.editingCell && this.cellEditor && this.cellEditor.focusOut) {\n this.cellEditor.focusOut();\n }\n };\n CellComp.prototype.onNavigationKeyPressed = function (event, key) {\n if (this.editingCell) {\n return;\n }\n if (event.shiftKey && this.rangeSelectionEnabled) {\n this.onShiftRangeSelect(key);\n }\n else {\n this.beans.rowRenderer.navigateToNextCell(event, key, this.cellPosition, true);\n }\n // if we don't prevent default, the grid will scroll with the navigation keys\n event.preventDefault();\n };\n CellComp.prototype.onShiftRangeSelect = function (key) {\n if (!this.beans.rangeController) {\n return;\n }\n var endCell = this.beans.rangeController.extendLatestRangeInDirection(key);\n if (endCell) {\n this.beans.rowRenderer.ensureCellVisible(endCell);\n }\n };\n CellComp.prototype.onTabKeyDown = function (event) {\n this.beans.rowRenderer.onTabKeyDown(this, event);\n };\n CellComp.prototype.onBackspaceOrDeleteKeyPressed = function (key) {\n if (!this.editingCell) {\n this.startRowOrCellEdit(key);\n }\n };\n CellComp.prototype.onEnterKeyDown = function (e) {\n if (this.editingCell || this.rowComp.isEditing()) {\n this.stopEditingAndFocus();\n }\n else {\n if (this.beans.gridOptionsWrapper.isEnterMovesDown()) {\n this.beans.rowRenderer.navigateToNextCell(null, KeyCode.DOWN, this.cellPosition, false);\n }\n else {\n this.startRowOrCellEdit(KeyCode.ENTER);\n if (this.editingCell) {\n // if we started editing, then we need to prevent default, otherwise the Enter action can get\n // applied to the cell editor. this happened, for example, with largeTextCellEditor where not\n // preventing default results in a 'new line' character getting inserted in the text area\n // when the editing was started\n e.preventDefault();\n }\n }\n }\n };\n CellComp.prototype.navigateAfterEdit = function () {\n var fullRowEdit = this.beans.gridOptionsWrapper.isFullRowEdit();\n if (fullRowEdit) {\n return;\n }\n var enterMovesDownAfterEdit = this.beans.gridOptionsWrapper.isEnterMovesDownAfterEdit();\n if (enterMovesDownAfterEdit) {\n this.beans.rowRenderer.navigateToNextCell(null, KeyCode.DOWN, this.cellPosition, false);\n }\n };\n CellComp.prototype.onF2KeyDown = function () {\n if (!this.editingCell) {\n this.startRowOrCellEdit(KeyCode.F2);\n }\n };\n CellComp.prototype.onEscapeKeyDown = function () {\n if (this.editingCell) {\n this.stopRowOrCellEdit(true);\n this.focusCell(true);\n }\n };\n CellComp.prototype.onKeyPress = function (event) {\n // check this, in case focus is on a (for example) a text field inside the cell,\n // in which cse we should not be listening for these key pressed\n var eventTarget = getTarget(event);\n var eventOnChildComponent = eventTarget !== this.getGui();\n if (eventOnChildComponent || this.editingCell) {\n return;\n }\n var pressedChar = String.fromCharCode(event.charCode);\n if (pressedChar === ' ') {\n this.onSpaceKeyPressed(event);\n }\n else if (isEventFromPrintableCharacter(event)) {\n this.startRowOrCellEdit(null, pressedChar);\n // if we don't prevent default, then the keypress also gets applied to the text field\n // (at least when doing the default editor), but we need to allow the editor to decide\n // what it wants to do. we only do this IF editing was started - otherwise it messes\n // up when the use is not doing editing, but using rendering with text fields in cellRenderer\n // (as it would block the the user from typing into text fields).\n event.preventDefault();\n }\n };\n CellComp.prototype.onSpaceKeyPressed = function (event) {\n var gridOptionsWrapper = this.beans.gridOptionsWrapper;\n if (!this.editingCell && gridOptionsWrapper.isRowSelection()) {\n var currentSelection = this.rowNode.isSelected();\n var newSelection = !currentSelection;\n if (newSelection || !gridOptionsWrapper.isSuppressRowDeselection()) {\n var groupSelectsFiltered = this.beans.gridOptionsWrapper.isGroupSelectsFiltered();\n var updatedCount = this.rowNode.setSelectedParams({\n newValue: newSelection,\n rangeSelect: event.shiftKey,\n groupSelectsFiltered: groupSelectsFiltered\n });\n if (currentSelection === undefined && updatedCount === 0) {\n this.rowNode.setSelectedParams({\n newValue: false,\n rangeSelect: event.shiftKey,\n groupSelectsFiltered: groupSelectsFiltered\n });\n }\n }\n }\n // prevent default as space key, by default, moves browser scroll down\n event.preventDefault();\n };\n CellComp.prototype.onMouseDown = function (mouseEvent) {\n var ctrlKey = mouseEvent.ctrlKey, metaKey = mouseEvent.metaKey, shiftKey = mouseEvent.shiftKey;\n var target = mouseEvent.target;\n var _a = this.beans, eventService = _a.eventService, rangeController = _a.rangeController;\n // do not change the range for right-clicks inside an existing range\n if (this.isRightClickInExistingRange(mouseEvent)) {\n return;\n }\n if (!shiftKey || (rangeController && !rangeController.getCellRanges().length)) {\n // We only need to pass true to focusCell when the browser is IE/Edge and we are trying\n // to focus the cell itself. This should never be true if the mousedown was triggered\n // due to a click on a cell editor for example.\n var forceBrowserFocus = (isBrowserIE() || isBrowserEdge()) && !this.editingCell && !isFocusableFormField(target);\n this.focusCell(forceBrowserFocus);\n }\n else if (rangeController) {\n // if a range is being changed, we need to make sure the focused cell does not change.\n mouseEvent.preventDefault();\n }\n // if we are clicking on a checkbox, we need to make sure the cell wrapping that checkbox\n // is focused but we don't want to change the range selection, so return here.\n if (this.containsWidget(target)) {\n return;\n }\n if (rangeController) {\n var thisCell = this.cellPosition;\n if (shiftKey) {\n rangeController.extendLatestRangeToCell(thisCell);\n }\n else {\n var ctrlKeyPressed = ctrlKey || metaKey;\n rangeController.setRangeToCell(thisCell, ctrlKeyPressed);\n }\n }\n eventService.dispatchEvent(this.createEvent(mouseEvent, Events.EVENT_CELL_MOUSE_DOWN));\n };\n CellComp.prototype.isRightClickInExistingRange = function (mouseEvent) {\n var rangeController = this.beans.rangeController;\n if (rangeController) {\n var cellInRange = rangeController.isCellInAnyRange(this.getCellPosition());\n if (cellInRange && mouseEvent.button === 2) {\n return true;\n }\n }\n return false;\n };\n CellComp.prototype.containsWidget = function (target) {\n return isElementChildOfClass(target, 'ag-selection-checkbox', 3);\n };\n // returns true if on iPad and this is second 'click' event in 200ms\n CellComp.prototype.isDoubleClickOnIPad = function () {\n if (!isIOSUserAgent() || isEventSupported('dblclick')) {\n return false;\n }\n var nowMillis = new Date().getTime();\n var res = nowMillis - this.lastIPadMouseClickEvent < 200;\n this.lastIPadMouseClickEvent = nowMillis;\n return res;\n };\n CellComp.prototype.onCellClicked = function (mouseEvent) {\n // iPad doesn't have double click - so we need to mimic it to enable editing for iPad.\n if (this.isDoubleClickOnIPad()) {\n this.onCellDoubleClicked(mouseEvent);\n mouseEvent.preventDefault(); // if we don't do this, then iPad zooms in\n return;\n }\n var _a = this.beans, eventService = _a.eventService, gridOptionsWrapper = _a.gridOptionsWrapper;\n var cellClickedEvent = this.createEvent(mouseEvent, Events.EVENT_CELL_CLICKED);\n eventService.dispatchEvent(cellClickedEvent);\n var colDef = this.getComponentHolder();\n if (colDef.onCellClicked) {\n // to make callback async, do in a timeout\n window.setTimeout(function () { return colDef.onCellClicked(cellClickedEvent); }, 0);\n }\n var editOnSingleClick = (gridOptionsWrapper.isSingleClickEdit() || colDef.singleClickEdit)\n && !gridOptionsWrapper.isSuppressClickEdit();\n if (editOnSingleClick) {\n this.startRowOrCellEdit();\n }\n };\n CellComp.prototype.createGridCellVo = function () {\n this.cellPosition = {\n rowIndex: this.rowNode.rowIndex,\n rowPinned: this.rowNode.rowPinned,\n column: this.column\n };\n };\n CellComp.prototype.getRowPosition = function () {\n return {\n rowIndex: this.cellPosition.rowIndex,\n rowPinned: this.cellPosition.rowPinned\n };\n };\n CellComp.prototype.getCellPosition = function () {\n return this.cellPosition;\n };\n CellComp.prototype.getParentRow = function () {\n return this.eParentRow;\n };\n CellComp.prototype.setParentRow = function (eParentRow) {\n this.eParentRow = eParentRow;\n };\n CellComp.prototype.getColumn = function () {\n return this.column;\n };\n CellComp.prototype.getComponentHolder = function () {\n return this.column.getColDef();\n };\n CellComp.prototype.detach = function () {\n this.eParentRow.removeChild(this.getGui());\n };\n // if the row is also getting destroyed, then we don't need to remove from dom,\n // as the row will also get removed, so no need to take out the cells from the row\n // if the row is going (removing is an expensive operation, so only need to remove\n // the top part)\n //\n // note - this is NOT called by context, as we don't wire / unwire the CellComp for performance reasons.\n CellComp.prototype.destroy = function () {\n if (this.createCellRendererFunc) {\n this.beans.taskQueue.cancelTask(this.createCellRendererFunc);\n }\n this.stopEditing();\n this.cellRenderer = this.beans.context.destroyBean(this.cellRenderer);\n this.beans.context.destroyBean(this.selectionHandle);\n _super.prototype.destroy.call(this);\n };\n CellComp.prototype.onLeftChanged = function () {\n var left = this.modifyLeftForPrintLayout(this.getCellLeft());\n this.getGui().style.left = left + 'px';\n this.refreshAriaIndex();\n };\n CellComp.prototype.modifyLeftForPrintLayout = function (leftPosition) {\n if (!this.printLayout || this.column.getPinned() === Constants.PINNED_LEFT) {\n return leftPosition;\n }\n var leftWidth = this.beans.columnController.getDisplayedColumnsLeftWidth();\n if (this.column.getPinned() === Constants.PINNED_RIGHT) {\n var bodyWidth = this.beans.columnController.getBodyContainerWidth();\n return leftWidth + bodyWidth + (leftPosition || 0);\n }\n // is in body\n return leftWidth + (leftPosition || 0);\n };\n CellComp.prototype.onWidthChanged = function () {\n var width = this.getCellWidth();\n this.getGui().style.width = width + 'px';\n };\n CellComp.prototype.getRangeBorders = function () {\n var _this = this;\n var isRtl = this.beans.gridOptionsWrapper.isEnableRtl();\n var top = false;\n var right = false;\n var bottom = false;\n var left = false;\n var thisCol = this.cellPosition.column;\n var _a = this.beans, rangeController = _a.rangeController, columnController = _a.columnController;\n var leftCol;\n var rightCol;\n if (isRtl) {\n leftCol = columnController.getDisplayedColAfter(thisCol);\n rightCol = columnController.getDisplayedColBefore(thisCol);\n }\n else {\n leftCol = columnController.getDisplayedColBefore(thisCol);\n rightCol = columnController.getDisplayedColAfter(thisCol);\n }\n var ranges = rangeController.getCellRanges().filter(function (range) { return rangeController.isCellInSpecificRange(_this.cellPosition, range); });\n // this means we are the first column in the grid\n if (!leftCol) {\n left = true;\n }\n // this means we are the last column in the grid\n if (!rightCol) {\n right = true;\n }\n for (var i = 0; i < ranges.length; i++) {\n if (top && right && bottom && left) {\n break;\n }\n var range = ranges[i];\n var startRow = rangeController.getRangeStartRow(range);\n var endRow = rangeController.getRangeEndRow(range);\n if (!top && this.beans.rowPositionUtils.sameRow(startRow, this.cellPosition)) {\n top = true;\n }\n if (!bottom && this.beans.rowPositionUtils.sameRow(endRow, this.cellPosition)) {\n bottom = true;\n }\n if (!left && leftCol && range.columns.indexOf(leftCol) < 0) {\n left = true;\n }\n if (!right && rightCol && range.columns.indexOf(rightCol) < 0) {\n right = true;\n }\n }\n return { top: top, right: right, bottom: bottom, left: left };\n };\n CellComp.prototype.getInitialRangeClasses = function () {\n var classes = [];\n if (!this.rangeSelectionEnabled || !this.rangeCount) {\n return classes;\n }\n classes.push(CSS_RANGE_SELECTED);\n if (this.hasChartRange) {\n classes.push(CSS_RANGE_CHART);\n }\n var count = Math.min(this.rangeCount, 4);\n classes.push(CSS_RANGE_SELECTED + \"-\" + count);\n if (this.isSingleCell()) {\n classes.push(CSS_RANGE_SINGLE_CELL);\n }\n if (this.rangeCount > 0) {\n var borders = this.getRangeBorders();\n if (borders.top) {\n classes.push(CSS_RANGE_TOP);\n }\n if (borders.right) {\n classes.push(CSS_RANGE_RIGHT);\n }\n if (borders.bottom) {\n classes.push(CSS_RANGE_BOTTOM);\n }\n if (borders.left) {\n classes.push(CSS_RANGE_LEFT);\n }\n }\n if (!!this.selectionHandle) {\n classes.push(CSS_RANGE_HANDLE);\n }\n return classes;\n };\n CellComp.prototype.onRowIndexChanged = function () {\n // when index changes, this influences items that need the index, so we update the\n // grid cell so they are working off the new index.\n this.createGridCellVo();\n // when the index of the row changes, ie means the cell may have lost or gained focus\n this.onCellFocused();\n // check range selection\n this.onRangeSelectionChanged();\n };\n CellComp.prototype.onRangeSelectionChanged = function () {\n var rangeController = this.beans.rangeController;\n if (!rangeController) {\n return;\n }\n var _a = this, cellPosition = _a.cellPosition, rangeCount = _a.rangeCount;\n var newRangeCount = rangeController.getCellRangeCount(cellPosition);\n var element = this.getGui();\n if (rangeCount !== newRangeCount) {\n this.addOrRemoveCssClass(CSS_RANGE_SELECTED, newRangeCount !== 0);\n this.addOrRemoveCssClass(CSS_RANGE_SELECTED + \"-1\", newRangeCount === 1);\n this.addOrRemoveCssClass(CSS_RANGE_SELECTED + \"-2\", newRangeCount === 2);\n this.addOrRemoveCssClass(CSS_RANGE_SELECTED + \"-3\", newRangeCount === 3);\n this.addOrRemoveCssClass(CSS_RANGE_SELECTED + \"-4\", newRangeCount >= 4);\n this.rangeCount = newRangeCount;\n }\n setAriaSelected(element, this.rangeCount > 0);\n var hasChartRange = this.getHasChartRange();\n if (hasChartRange !== this.hasChartRange) {\n this.hasChartRange = hasChartRange;\n this.addOrRemoveCssClass(CSS_RANGE_CHART, this.hasChartRange);\n }\n this.updateRangeBorders();\n this.addOrRemoveCssClass(CSS_RANGE_SINGLE_CELL, this.isSingleCell());\n this.refreshHandle();\n };\n CellComp.prototype.getHasChartRange = function () {\n var rangeController = this.beans.rangeController;\n if (!this.rangeCount || !rangeController) {\n return false;\n }\n var cellRanges = rangeController.getCellRanges();\n return cellRanges.length > 0 && cellRanges.every(function (range) { return includes([exports.CellRangeType.DIMENSION, exports.CellRangeType.VALUE], range.type); });\n };\n CellComp.prototype.shouldHaveSelectionHandle = function () {\n var _a = this.beans, gridOptionsWrapper = _a.gridOptionsWrapper, rangeController = _a.rangeController;\n var cellRanges = rangeController.getCellRanges();\n var rangesLen = cellRanges.length;\n if (this.rangeCount < 1 || rangesLen < 1) {\n return false;\n }\n var cellRange = last(cellRanges);\n var cellPosition = this.getCellPosition();\n var fillHandleIsAvailable = rangesLen === 1 &&\n (gridOptionsWrapper.isEnableFillHandle() || gridOptionsWrapper.isEnableRangeHandle()) &&\n !this.editingCell;\n if (this.hasChartRange) {\n var hasCategoryRange = cellRanges[0].type === exports.CellRangeType.DIMENSION;\n var isCategoryCell = hasCategoryRange && rangeController.isCellInSpecificRange(cellPosition, cellRanges[0]);\n this.addOrRemoveCssClass(CSS_RANGE_CHART_CATEGORY, isCategoryCell);\n fillHandleIsAvailable = cellRange.type === exports.CellRangeType.VALUE;\n }\n return fillHandleIsAvailable &&\n cellRange.endRow != null &&\n rangeController.isContiguousRange(cellRange) &&\n rangeController.isBottomRightCell(cellRange, cellPosition);\n };\n CellComp.prototype.addSelectionHandle = function () {\n var _a = this.beans, gridOptionsWrapper = _a.gridOptionsWrapper, rangeController = _a.rangeController;\n var cellRangeType = last(rangeController.getCellRanges()).type;\n var selectionHandleFill = gridOptionsWrapper.isEnableFillHandle() && missing(cellRangeType);\n var type = selectionHandleFill ? exports.SelectionHandleType.FILL : exports.SelectionHandleType.RANGE;\n if (this.selectionHandle && this.selectionHandle.getType() !== type) {\n this.selectionHandle = this.beans.context.destroyBean(this.selectionHandle);\n }\n if (!this.selectionHandle) {\n this.selectionHandle = this.beans.selectionHandleFactory.createSelectionHandle(type);\n }\n this.selectionHandle.refresh(this);\n };\n CellComp.prototype.updateRangeBordersIfRangeCount = function () {\n // we only need to update range borders if we are in a range\n if (this.rangeCount > 0) {\n this.updateRangeBorders();\n this.refreshHandle();\n }\n };\n CellComp.prototype.refreshHandle = function () {\n if (!this.beans.rangeController) {\n return;\n }\n var shouldHaveSelectionHandle = this.shouldHaveSelectionHandle();\n if (this.selectionHandle && !shouldHaveSelectionHandle) {\n this.selectionHandle = this.beans.context.destroyBean(this.selectionHandle);\n }\n if (shouldHaveSelectionHandle) {\n this.addSelectionHandle();\n }\n this.addOrRemoveCssClass(CSS_RANGE_HANDLE, !!this.selectionHandle);\n };\n CellComp.prototype.updateRangeBorders = function () {\n var rangeBorders = this.getRangeBorders();\n var isSingleCell = this.isSingleCell();\n var isTop = !isSingleCell && rangeBorders.top;\n var isRight = !isSingleCell && rangeBorders.right;\n var isBottom = !isSingleCell && rangeBorders.bottom;\n var isLeft = !isSingleCell && rangeBorders.left;\n this.addOrRemoveCssClass(CSS_RANGE_TOP, isTop);\n this.addOrRemoveCssClass(CSS_RANGE_RIGHT, isRight);\n this.addOrRemoveCssClass(CSS_RANGE_BOTTOM, isBottom);\n this.addOrRemoveCssClass(CSS_RANGE_LEFT, isLeft);\n };\n CellComp.prototype.onFirstRightPinnedChanged = function () {\n var firstRightPinned = this.column.isFirstRightPinned();\n if (this.firstRightPinned !== firstRightPinned) {\n this.firstRightPinned = firstRightPinned;\n this.addOrRemoveCssClass(CSS_FIRST_RIGHT_PINNED, firstRightPinned);\n }\n };\n CellComp.prototype.onLastLeftPinnedChanged = function () {\n var lastLeftPinned = this.column.isLastLeftPinned();\n if (this.lastLeftPinned !== lastLeftPinned) {\n this.lastLeftPinned = lastLeftPinned;\n this.addOrRemoveCssClass(CSS_LAST_LEFT_PINNED, lastLeftPinned);\n }\n };\n CellComp.prototype.refreshShouldDestroy = function () {\n var isUsingWrapper = this.usingWrapper;\n var isIncludingRowDragging = this.includeRowDraggingComponent;\n var isIncludingDndSource = this.includeDndSourceComponent;\n var isIncludingSelection = this.includeSelectionComponent;\n this.setUsingWrapper();\n return isUsingWrapper !== this.usingWrapper ||\n isIncludingRowDragging !== this.includeRowDraggingComponent ||\n isIncludingDndSource !== this.includeDndSourceComponent ||\n isIncludingSelection !== this.includeSelectionComponent;\n };\n CellComp.prototype.populateTemplate = function () {\n if (this.usingWrapper) {\n this.eCellValue = this.getRefElement('eCellValue');\n this.eCellWrapper = this.getRefElement('eCellWrapper');\n this.eCellValue.id = \"cell-\" + this.getCompId();\n var describedByIds = '';\n if (this.includeRowDraggingComponent) {\n this.addRowDragging();\n }\n if (this.includeDndSourceComponent) {\n this.addDndSource();\n }\n if (this.includeSelectionComponent) {\n describedByIds += this.addSelectionCheckbox().getCheckboxId();\n }\n setAriaDescribedBy(this.getGui(), describedByIds + \" \" + this.eCellValue.id);\n }\n else {\n this.eCellValue = this.getGui();\n this.eCellWrapper = this.eCellValue;\n }\n };\n CellComp.prototype.getFrameworkOverrides = function () {\n return this.beans.frameworkOverrides;\n };\n CellComp.prototype.addRowDragging = function (customElement) {\n var _this = this;\n var pagination = this.beans.gridOptionsWrapper.isPagination();\n var rowDragManaged = this.beans.gridOptionsWrapper.isRowDragManaged();\n var clientSideRowModelActive = this.beans.gridOptionsWrapper.isRowModelDefault();\n if (rowDragManaged) {\n // row dragging only available in default row model\n if (!clientSideRowModelActive) {\n doOnce(function () { return console.warn('AG Grid: managed row dragging is only allowed in the Client Side Row Model'); }, 'CellComp.addRowDragging');\n return;\n }\n if (pagination) {\n doOnce(function () { return console.warn('AG Grid: managed row dragging is not possible when doing pagination'); }, 'CellComp.addRowDragging');\n return;\n }\n }\n if (!this.rowDraggingComp) {\n this.rowDraggingComp = new RowDragComp(this.rowNode, this.column, function () { return _this.value; }, this.beans, customElement);\n this.createManagedBean(this.rowDraggingComp, this.beans.context);\n }\n else if (customElement) {\n // if the rowDraggingComp is already present, means we should only set the drag element\n this.rowDraggingComp.setDragElement(customElement);\n }\n // If there is a custom element, the Cell Renderer is responsible for displaying it.\n if (!customElement) {\n // put the checkbox in before the value\n this.eCellWrapper.insertBefore(this.rowDraggingComp.getGui(), this.eCellValue);\n }\n };\n CellComp.prototype.addDndSource = function () {\n var dndSourceComp = new DndSourceComp(this.rowNode, this.column, this.getValueToUse(), this.beans, this.getGui());\n this.createManagedBean(dndSourceComp, this.beans.context);\n // put the checkbox in before the value\n this.eCellWrapper.insertBefore(dndSourceComp.getGui(), this.eCellValue);\n };\n CellComp.prototype.addSelectionCheckbox = function () {\n var _this = this;\n var cbSelectionComponent = new CheckboxSelectionComponent();\n this.beans.context.createBean(cbSelectionComponent);\n var visibleFunc = this.getComponentHolder().checkboxSelection;\n if (typeof visibleFunc !== 'function') {\n visibleFunc = undefined;\n }\n cbSelectionComponent.init({ rowNode: this.rowNode, column: this.column, visibleFunc: visibleFunc });\n this.addDestroyFunc(function () { return _this.beans.context.destroyBean(cbSelectionComponent); });\n // put the checkbox in before the value\n this.eCellWrapper.insertBefore(cbSelectionComponent.getGui(), this.eCellValue);\n return cbSelectionComponent;\n };\n CellComp.prototype.addDomData = function () {\n var _this = this;\n var element = this.getGui();\n this.beans.gridOptionsWrapper.setDomData(element, CellComp.DOM_DATA_KEY_CELL_COMP, this);\n this.addDestroyFunc(function () { return _this.beans.gridOptionsWrapper.setDomData(element, CellComp.DOM_DATA_KEY_CELL_COMP, null); });\n };\n CellComp.prototype.isSingleCell = function () {\n var rangeController = this.beans.rangeController;\n return this.rangeCount === 1 && rangeController && !rangeController.isMoreThanOneCell();\n };\n CellComp.prototype.onCellFocused = function (event) {\n var cellFocused = this.beans.focusController.isCellFocused(this.cellPosition);\n // see if we need to change the classes on this cell\n if (cellFocused !== this.cellFocused) {\n // if we are not doing cell selection, then the focus class does not change\n var doingFocusCss = !this.beans.gridOptionsWrapper.isSuppressCellSelection();\n if (doingFocusCss) {\n this.addOrRemoveCssClass(CSS_CELL_FOCUS, cellFocused);\n }\n this.cellFocused = cellFocused;\n }\n // see if we need to force browser focus - this can happen if focus is programmatically set\n if (cellFocused && event && event.forceBrowserFocus) {\n var focusEl = this.getFocusableElement();\n focusEl.focus();\n // Fix for AG-3465 \"IE11 - After editing cell's content, selection doesn't go one cell below on enter\"\n // IE can fail to focus the cell after the first call to focus(), and needs a second call\n if (!document.activeElement || document.activeElement === document.body) {\n focusEl.focus();\n }\n }\n // if another cell was focused, and we are editing, then stop editing\n var fullRowEdit = this.beans.gridOptionsWrapper.isFullRowEdit();\n if (!cellFocused && !fullRowEdit && this.editingCell) {\n this.stopRowOrCellEdit();\n }\n };\n // pass in 'true' to cancel the editing.\n CellComp.prototype.stopRowOrCellEdit = function (cancel) {\n if (cancel === void 0) { cancel = false; }\n if (this.beans.gridOptionsWrapper.isFullRowEdit()) {\n this.rowComp.stopRowEditing(cancel);\n }\n else {\n this.stopEditing(cancel);\n }\n };\n CellComp.prototype.stopEditing = function (cancel) {\n if (cancel === void 0) { cancel = false; }\n if (!this.editingCell) {\n return;\n }\n // if no cell editor, this means due to async, that the cell editor never got initialised,\n // so we just carry on regardless as if the editing was never started.\n if (!this.cellEditor) {\n this.editingCell = false;\n return;\n }\n var oldValue = this.getValue();\n var newValueExists = false;\n var newValue;\n if (!cancel) {\n // also have another option here to cancel after editing, so for example user could have a popup editor and\n // it is closed by user clicking outside the editor. then the editor will close automatically (with false\n // passed above) and we need to see if the editor wants to accept the new value.\n var userWantsToCancel = this.cellEditor.isCancelAfterEnd && this.cellEditor.isCancelAfterEnd();\n if (!userWantsToCancel) {\n newValue = this.cellEditor.getValue();\n newValueExists = true;\n }\n }\n // it is important we set this after setValue() above, as otherwise the cell will flash\n // when editing stops. the 'refresh' method checks editing, and doesn't refresh editing cells.\n // thus it will skip the refresh on this cell until the end of this method where we call\n // refresh directly and we suppress the flash.\n this.editingCell = false;\n // important to clear this out - as parts of the code will check for\n // this to see if an async cellEditor has yet to be created\n this.beans.context.destroyBean(this.cellEditor);\n this.cellEditor = null;\n if (this.cellEditorInPopup && this.hideEditorPopup) {\n this.hideEditorPopup();\n this.hideEditorPopup = null;\n }\n else {\n this.clearCellElement();\n var eGui = this.getGui();\n // put the cell back the way it was before editing\n if (this.usingWrapper) {\n // if wrapper, then put the wrapper back\n eGui.appendChild(this.eCellWrapper);\n }\n else if (this.cellRenderer) {\n // if cellRenderer, then put the gui back in. if the renderer has\n // a refresh, it will be called. however if it doesn't, then later\n // the renderer will be destroyed and a new one will be created.\n // we know it's a dom element (not a string) because we converted\n // it after the gui was attached if it was a string.\n var eCell = this.cellRendererGui;\n // can be null if cell was previously null / contained empty string,\n // this will result in new value not being rendered.\n if (eCell) {\n eGui.appendChild(eCell);\n }\n }\n }\n this.setInlineEditingClass();\n this.refreshHandle();\n if (newValueExists && newValue !== oldValue) {\n // we suppressRefreshCell because the call to rowNode.setDataValue() results in change detection\n // getting triggered, which results in all cells getting refreshed. we do not want this refresh\n // to happen on this call as we want to call it explicitly below. otherwise refresh gets called twice.\n // if we only did this refresh (and not the one below) then the cell would flash and not be forced.\n this.suppressRefreshCell = true;\n this.rowNode.setDataValue(this.column, newValue);\n this.suppressRefreshCell = false;\n }\n // we suppress the flash, as it is not correct to flash the cell the user has finished editing,\n // the user doesn't need to flash as they were the one who did the edit, the flash is pointless\n // (as the flash is meant to draw the user to a change that they didn't manually do themselves).\n this.refreshCell({ forceRefresh: true, suppressFlash: true });\n var editingStoppedEvent = __assign$2(__assign$2({}, this.createEvent(null, Events.EVENT_CELL_EDITING_STOPPED)), { oldValue: oldValue,\n newValue: newValue });\n this.beans.eventService.dispatchEvent(editingStoppedEvent);\n };\n CellComp.prototype.clearCellElement = function () {\n var eGui = this.getGui();\n // if focus is inside the cell, we move focus to the cell itself\n // before removing it's contents, otherwise errors could be thrown.\n if (eGui.contains(document.activeElement) && !isBrowserIE()) {\n eGui.focus({\n preventScroll: true\n });\n }\n clearElement(eGui);\n };\n CellComp.DOM_DATA_KEY_CELL_COMP = 'cellComp';\n CellComp.CELL_RENDERER_TYPE_NORMAL = 'cellRenderer';\n CellComp.CELL_RENDERER_TYPE_PINNED = 'pinnedRowCellRenderer';\n return CellComp;\n}(Component));\n\n/**\n * @ag-grid-community/core - Advanced Data Grid / Data Table supporting Javascript / React / AngularJS / Web Components\n * @version v25.1.0\n * @link http://www.ag-grid.com/\n * @license MIT\n */\nvar __assign$3 = (undefined && undefined.__assign) || function () {\n __assign$3 = Object.assign || function(t) {\n for (var s, i = 1, n = arguments.length; i < n; i++) {\n s = arguments[i];\n for (var p in s) if (Object.prototype.hasOwnProperty.call(s, p))\n t[p] = s[p];\n }\n return t;\n };\n return __assign$3.apply(this, arguments);\n};\nvar AngularRowUtils = /** @class */ (function () {\n function AngularRowUtils() {\n }\n AngularRowUtils.createChildScopeOrNull = function (rowNode, parentScope, gridOptionsWrapper) {\n var isAngularCompileRows = gridOptionsWrapper.isAngularCompileRows();\n if (!isAngularCompileRows) {\n return null;\n }\n var newChildScope = parentScope.$new();\n newChildScope.data = __assign$3({}, rowNode.data);\n newChildScope.rowNode = rowNode;\n newChildScope.context = gridOptionsWrapper.getContext();\n var destroyFunc = function () {\n newChildScope.$destroy();\n newChildScope.data = null;\n newChildScope.rowNode = null;\n newChildScope.context = null;\n };\n return {\n scope: newChildScope,\n scopeDestroyFunc: destroyFunc\n };\n };\n return AngularRowUtils;\n}());\n\n/**\n * @ag-grid-community/core - Advanced Data Grid / Data Table supporting Javascript / React / AngularJS / Web Components\n * @version v25.1.0\n * @link http://www.ag-grid.com/\n * @license MIT\n */\nvar __extends$H = (undefined && undefined.__extends) || (function () {\n var extendStatics = function (d, b) {\n extendStatics = Object.setPrototypeOf ||\n ({ __proto__: [] } instanceof Array && function (d, b) { d.__proto__ = b; }) ||\n function (d, b) { for (var p in b) if (b.hasOwnProperty(p)) d[p] = b[p]; };\n return extendStatics(d, b);\n };\n return function (d, b) {\n extendStatics(d, b);\n function __() { this.constructor = d; }\n d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __());\n };\n})();\nvar RowComp = /** @class */ (function (_super) {\n __extends$H(RowComp, _super);\n function RowComp(parentScope, bodyContainerComp, pinnedLeftContainerComp, pinnedRightContainerComp, fullWidthContainerComp, rowNode, beans, animateIn, useAnimationFrameForCreate, printLayout, embedFullWidth) {\n var _this = _super.call(this) || this;\n _this.eAllRowContainers = [];\n _this.fullWidthRowDestroyFuncs = [];\n _this.active = true;\n _this.rowContainerReadyCount = 0;\n _this.refreshNeeded = false;\n _this.columnRefreshPending = false;\n _this.cellComps = {};\n // for animations, there are bits we want done in the next VM turn, to all DOM to update first.\n // instead of each row doing a setTimeout(func,0), we put the functions here and the rowRenderer\n // executes them all in one timeout\n _this.createSecondPassFuncs = [];\n // these get called before the row is destroyed - they set up the DOM for the remove animation (ie they\n // set the DOM up for the animation), then the delayedDestroyFunctions get called when the animation is\n // complete (ie removes from the dom).\n _this.removeFirstPassFuncs = [];\n // for animations, these functions get called 400ms after the row is cleared, called by the rowRenderer\n // so each row isn't setting up it's own timeout\n _this.removeSecondPassFuncs = [];\n _this.initialised = false;\n _this.elementOrderChanged = false;\n _this.lastMouseDownOnDragger = false;\n _this.parentScope = parentScope;\n _this.beans = beans;\n _this.bodyContainerComp = bodyContainerComp;\n _this.pinnedLeftContainerComp = pinnedLeftContainerComp;\n _this.pinnedRightContainerComp = pinnedRightContainerComp;\n _this.fullWidthContainerComp = fullWidthContainerComp;\n _this.rowNode = rowNode;\n _this.rowIsEven = _this.rowNode.rowIndex % 2 === 0;\n _this.paginationPage = _this.beans.paginationProxy.getCurrentPage();\n _this.useAnimationFrameForCreate = useAnimationFrameForCreate;\n _this.printLayout = printLayout;\n _this.embedFullWidth = embedFullWidth;\n _this.setAnimateFlags(animateIn);\n return _this;\n }\n RowComp.prototype.init = function () {\n var _this = this;\n this.rowFocused = this.beans.focusController.isRowFocused(this.rowNode.rowIndex, this.rowNode.rowPinned);\n this.setupAngular1Scope();\n this.rowLevel = this.beans.rowCssClassCalculator.calculateRowLevel(this.rowNode);\n this.setupRowContainers();\n this.addListeners();\n if (this.slideRowIn) {\n this.createSecondPassFuncs.push(function () {\n _this.onTopChanged();\n });\n }\n if (this.fadeRowIn) {\n this.createSecondPassFuncs.push(function () {\n _this.eAllRowContainers.forEach(function (eRow) { return removeCssClass(eRow, 'ag-opacity-zero'); });\n });\n }\n };\n RowComp.prototype.setupAngular1Scope = function () {\n var scopeResult = AngularRowUtils.createChildScopeOrNull(this.rowNode, this.parentScope, this.beans.gridOptionsWrapper);\n if (scopeResult) {\n this.scope = scopeResult.scope;\n this.addDestroyFunc(scopeResult.scopeDestroyFunc);\n }\n };\n RowComp.prototype.createTemplate = function (contents, extraCssClass) {\n if (extraCssClass === void 0) { extraCssClass = null; }\n var templateParts = [];\n var rowHeight = this.rowNode.rowHeight;\n var rowClasses = this.getInitialRowClasses(extraCssClass).join(' ');\n var rowIdSanitised = escapeString(this.rowNode.id);\n var userRowStyles = this.preProcessStylesFromGridOptions();\n var businessKey = this.getRowBusinessKey();\n var businessKeySanitised = escapeString(businessKey);\n var rowTopStyle = this.getInitialRowTopStyle();\n var rowIdx = this.rowNode.getRowIndexString();\n var headerRowCount = this.beans.headerNavigationService.getHeaderRowCount();\n templateParts.push(\"\");\n // add in the template for the cells\n templateParts.push(contents);\n templateParts.push(\"\");\n return templateParts.join('');\n };\n RowComp.prototype.getCellForCol = function (column) {\n var cellComp = this.cellComps[column.getColId()];\n return cellComp ? cellComp.getGui() : null;\n };\n RowComp.prototype.afterFlush = function () {\n if (this.initialised) {\n return;\n }\n this.initialised = true;\n this.executeProcessRowPostCreateFunc();\n };\n RowComp.prototype.executeProcessRowPostCreateFunc = function () {\n var func = this.beans.gridOptionsWrapper.getProcessRowPostCreateFunc();\n if (!func) {\n return;\n }\n var params = {\n eRow: this.eBodyRow,\n ePinnedLeftRow: this.ePinnedLeftRow,\n ePinnedRightRow: this.ePinnedRightRow,\n node: this.rowNode,\n api: this.beans.gridOptionsWrapper.getApi(),\n rowIndex: this.rowNode.rowIndex,\n addRenderedRowListener: this.addEventListener.bind(this),\n columnApi: this.beans.gridOptionsWrapper.getColumnApi(),\n context: this.beans.gridOptionsWrapper.getContext()\n };\n func(params);\n };\n RowComp.prototype.getInitialRowTopStyle = function () {\n // print layout uses normal flow layout for row positioning\n if (this.printLayout) {\n return '';\n }\n // if sliding in, we take the old row top. otherwise we just set the current row top.\n var pixels = this.slideRowIn ? this.roundRowTopToBounds(this.rowNode.oldRowTop) : this.rowNode.rowTop;\n var afterPaginationPixels = this.applyPaginationOffset(pixels);\n // we don't apply scaling if row is pinned\n var afterScalingPixels = this.rowNode.isRowPinned() ? afterPaginationPixels : this.beans.maxDivHeightScaler.getRealPixelPosition(afterPaginationPixels);\n var isSuppressRowTransform = this.beans.gridOptionsWrapper.isSuppressRowTransform();\n return isSuppressRowTransform ? \"top: \" + afterScalingPixels + \"px; \" : \"transform: translateY(\" + afterScalingPixels + \"px);\";\n };\n RowComp.prototype.getRowBusinessKey = function () {\n var businessKeyForNodeFunc = this.beans.gridOptionsWrapper.getBusinessKeyForNodeFunc();\n if (typeof businessKeyForNodeFunc !== 'function') {\n return;\n }\n return businessKeyForNodeFunc(this.rowNode);\n };\n RowComp.prototype.areAllContainersReady = function () {\n return this.rowContainerReadyCount === 3;\n };\n RowComp.prototype.lazyCreateCells = function (cols, eRow) {\n if (!this.active) {\n return;\n }\n var cellTemplatesAndComps = this.createCells(cols);\n eRow.innerHTML = cellTemplatesAndComps.template;\n this.callAfterRowAttachedOnCells(cellTemplatesAndComps.cellComps, eRow);\n this.rowContainerReadyCount++;\n if (this.areAllContainersReady() && this.refreshNeeded) {\n this.refreshCells();\n }\n };\n RowComp.prototype.createRowContainer = function (rowContainerComp, cols, callback) {\n var _this = this;\n var useAnimationsFrameForCreate = this.useAnimationFrameForCreate;\n var cellTemplatesAndComps = useAnimationsFrameForCreate ? { cellComps: [], template: '' } : this.createCells(cols);\n var rowTemplate = this.createTemplate(cellTemplatesAndComps.template);\n // the RowRenderer is probably inserting many rows. rather than inserting each template one\n // at a time, the grid inserts all rows together - so the callback here is called by the\n // rowRenderer when all RowComps are created, then all the HTML is inserted in one go,\n // and then all the callbacks are called. this is NOT done in an animation frame.\n rowContainerComp.appendRowTemplate(rowTemplate, function () {\n var eRow = rowContainerComp.getRowElement(_this.getCompId());\n _this.refreshAriaLabel(eRow, !!_this.rowNode.isSelected());\n _this.afterRowAttached(rowContainerComp, eRow);\n callback(eRow);\n if (useAnimationsFrameForCreate) {\n _this.beans.taskQueue.createTask(_this.lazyCreateCells.bind(_this, cols, eRow), _this.rowNode.rowIndex, 'createTasksP1');\n }\n else {\n _this.callAfterRowAttachedOnCells(cellTemplatesAndComps.cellComps, eRow);\n _this.rowContainerReadyCount = 3;\n }\n });\n };\n RowComp.prototype.setupRowContainers = function () {\n var isFullWidthCell = this.rowNode.isFullWidthCell();\n var isDetailCell = this.beans.doingMasterDetail && this.rowNode.detail;\n var pivotMode = this.beans.columnController.isPivotMode();\n // we only use full width for groups, not footers. it wouldn't make sense to include footers if not looking\n // for totals. if users complain about this, then we should introduce a new property 'footerUseEntireRow'\n // so each can be set independently (as a customer complained about footers getting full width, hence\n // introducing this logic)\n var isGroupRow = this.rowNode.group && !this.rowNode.footer;\n var isFullWidthGroup = isGroupRow && this.beans.gridOptionsWrapper.isGroupUseEntireRow(pivotMode);\n if (this.rowNode.stub) {\n this.createFullWidthRows(RowComp.LOADING_CELL_RENDERER, RowComp.LOADING_CELL_RENDERER_COMP_NAME, false);\n }\n else if (isDetailCell) {\n this.createFullWidthRows(RowComp.DETAIL_CELL_RENDERER, RowComp.DETAIL_CELL_RENDERER_COMP_NAME, true);\n }\n else if (isFullWidthCell) {\n this.createFullWidthRows(RowComp.FULL_WIDTH_CELL_RENDERER, null, false);\n }\n else if (isFullWidthGroup) {\n this.createFullWidthRows(RowComp.GROUP_ROW_RENDERER, RowComp.GROUP_ROW_RENDERER_COMP_NAME, false);\n }\n else {\n this.setupNormalRowContainers();\n }\n };\n RowComp.prototype.setupNormalRowContainers = function () {\n var _this = this;\n var centerCols;\n var leftCols = [];\n var rightCols = [];\n if (this.printLayout) {\n centerCols = this.beans.columnController.getAllDisplayedColumns();\n }\n else {\n centerCols = this.beans.columnController.getViewportCenterColumnsForRow(this.rowNode);\n leftCols = this.beans.columnController.getDisplayedLeftColumnsForRow(this.rowNode);\n rightCols = this.beans.columnController.getDisplayedRightColumnsForRow(this.rowNode);\n }\n this.createRowContainer(this.bodyContainerComp, centerCols, function (eRow) { return _this.eBodyRow = eRow; });\n this.createRowContainer(this.pinnedRightContainerComp, rightCols, function (eRow) { return _this.ePinnedRightRow = eRow; });\n this.createRowContainer(this.pinnedLeftContainerComp, leftCols, function (eRow) { return _this.ePinnedLeftRow = eRow; });\n };\n RowComp.prototype.createFullWidthRows = function (type, name, detailRow) {\n var _this = this;\n this.fullWidthRow = true;\n if (this.embedFullWidth) {\n this.createFullWidthRowContainer(this.bodyContainerComp, null, null, type, name, function (eRow) {\n _this.eFullWidthRowBody = eRow;\n }, function (cellRenderer) {\n _this.fullWidthRowComponentBody = cellRenderer;\n }, detailRow);\n // printLayout doesn't put components into the pinned sections\n if (this.printLayout) {\n return;\n }\n this.createFullWidthRowContainer(this.pinnedLeftContainerComp, Constants.PINNED_LEFT, 'ag-cell-last-left-pinned', type, name, function (eRow) {\n _this.eFullWidthRowLeft = eRow;\n }, function (cellRenderer) {\n _this.fullWidthRowComponentLeft = cellRenderer;\n }, detailRow);\n this.createFullWidthRowContainer(this.pinnedRightContainerComp, Constants.PINNED_RIGHT, 'ag-cell-first-right-pinned', type, name, function (eRow) {\n _this.eFullWidthRowRight = eRow;\n }, function (cellRenderer) {\n _this.fullWidthRowComponentRight = cellRenderer;\n }, detailRow);\n }\n else {\n // otherwise we add to the fullWidth container as normal\n // let previousFullWidth = ensureDomOrder ? this.lastPlacedElements.eFullWidth : null;\n this.createFullWidthRowContainer(this.fullWidthContainerComp, null, null, type, name, function (eRow) {\n _this.eFullWidthRow = eRow;\n }, function (cellRenderer) {\n _this.fullWidthRowComponent = cellRenderer;\n }, detailRow);\n }\n };\n RowComp.prototype.setAnimateFlags = function (animateIn) {\n if (animateIn) {\n var oldRowTopExists = exists(this.rowNode.oldRowTop);\n // if the row had a previous position, we slide it in (animate row top)\n this.slideRowIn = oldRowTopExists;\n // if the row had no previous position, we fade it in (animate\n this.fadeRowIn = !oldRowTopExists;\n }\n else {\n this.slideRowIn = false;\n this.fadeRowIn = false;\n }\n };\n RowComp.prototype.isEditing = function () {\n return this.editingRow;\n };\n RowComp.prototype.stopRowEditing = function (cancel) {\n this.stopEditing(cancel);\n };\n RowComp.prototype.isFullWidth = function () {\n return this.fullWidthRow;\n };\n RowComp.prototype.refreshFullWidth = function () {\n var _this = this;\n // returns 'true' if refresh succeeded\n var tryRefresh = function (eRow, cellComp, pinned) {\n if (!eRow || !cellComp) {\n return true;\n } // no refresh needed\n // no refresh method present, so can't refresh, hard refresh needed\n if (!cellComp.refresh) {\n return false;\n }\n var params = _this.createFullWidthParams(eRow, pinned);\n var refreshSucceeded = cellComp.refresh(params);\n return refreshSucceeded;\n };\n var normalSuccess = tryRefresh(this.eFullWidthRow, this.fullWidthRowComponent, null);\n var bodySuccess = tryRefresh(this.eFullWidthRowBody, this.fullWidthRowComponentBody, null);\n var leftSuccess = tryRefresh(this.eFullWidthRowLeft, this.fullWidthRowComponentLeft, Constants.PINNED_LEFT);\n var rightSuccess = tryRefresh(this.eFullWidthRowRight, this.fullWidthRowComponentRight, Constants.PINNED_RIGHT);\n var allFullWidthRowsRefreshed = normalSuccess && bodySuccess && leftSuccess && rightSuccess;\n return allFullWidthRowsRefreshed;\n };\n RowComp.prototype.addListeners = function () {\n this.addManagedListener(this.rowNode, RowNode.EVENT_HEIGHT_CHANGED, this.onRowHeightChanged.bind(this));\n this.addManagedListener(this.rowNode, RowNode.EVENT_ROW_SELECTED, this.onRowSelected.bind(this));\n this.addManagedListener(this.rowNode, RowNode.EVENT_ROW_INDEX_CHANGED, this.onRowIndexChanged.bind(this));\n this.addManagedListener(this.rowNode, RowNode.EVENT_TOP_CHANGED, this.onTopChanged.bind(this));\n this.addManagedListener(this.rowNode, RowNode.EVENT_EXPANDED_CHANGED, this.updateExpandedCss.bind(this));\n this.addManagedListener(this.rowNode, RowNode.EVENT_HAS_CHILDREN_CHANGED, this.updateExpandedCss.bind(this));\n this.addManagedListener(this.rowNode, RowNode.EVENT_DATA_CHANGED, this.onRowNodeDataChanged.bind(this));\n this.addManagedListener(this.rowNode, RowNode.EVENT_CELL_CHANGED, this.onRowNodeCellChanged.bind(this));\n this.addManagedListener(this.rowNode, RowNode.EVENT_HIGHLIGHT_CHANGED, this.onRowNodeHighlightChanged.bind(this));\n this.addManagedListener(this.rowNode, RowNode.EVENT_DRAGGING_CHANGED, this.onRowNodeDraggingChanged.bind(this));\n this.addManagedListener(this.rowNode, RowNode.EVENT_UI_LEVEL_CHANGED, this.onUiLevelChanged.bind(this));\n var eventService = this.beans.eventService;\n this.addManagedListener(eventService, Events.EVENT_PAGINATION_PIXEL_OFFSET_CHANGED, this.onPaginationPixelOffsetChanged.bind(this));\n this.addManagedListener(eventService, Events.EVENT_HEIGHT_SCALE_CHANGED, this.onTopChanged.bind(this));\n this.addManagedListener(eventService, Events.EVENT_DISPLAYED_COLUMNS_CHANGED, this.onDisplayedColumnsChanged.bind(this));\n this.addManagedListener(eventService, Events.EVENT_VIRTUAL_COLUMNS_CHANGED, this.onVirtualColumnsChanged.bind(this));\n this.addManagedListener(eventService, Events.EVENT_COLUMN_RESIZED, this.onColumnResized.bind(this));\n this.addManagedListener(eventService, Events.EVENT_CELL_FOCUSED, this.onCellFocusChanged.bind(this));\n this.addManagedListener(eventService, Events.EVENT_PAGINATION_CHANGED, this.onPaginationChanged.bind(this));\n this.addManagedListener(eventService, Events.EVENT_MODEL_UPDATED, this.onModelUpdated.bind(this));\n this.addManagedListener(eventService, Events.EVENT_COLUMN_MOVED, this.onColumnMoved.bind(this));\n this.addListenersForCellComps();\n };\n RowComp.prototype.addListenersForCellComps = function () {\n var _this = this;\n this.addManagedListener(this.rowNode, RowNode.EVENT_ROW_INDEX_CHANGED, function () {\n _this.forEachCellComp(function (cellComp) { return cellComp.onRowIndexChanged(); });\n });\n this.addManagedListener(this.rowNode, RowNode.EVENT_CELL_CHANGED, function (event) {\n _this.forEachCellComp(function (cellComp) { return cellComp.onCellChanged(event); });\n });\n };\n RowComp.prototype.onRowNodeDataChanged = function (event) {\n // if this is an update, we want to refresh, as this will allow the user to put in a transition\n // into the cellRenderer refresh method. otherwise this might be completely new data, in which case\n // we will want to completely replace the cells\n this.forEachCellComp(function (cellComp) {\n return cellComp.refreshCell({\n suppressFlash: !event.update,\n newData: !event.update\n });\n });\n // check for selected also, as this could be after lazy loading of the row data, in which case\n // the id might of just gotten set inside the row and the row selected state may of changed\n // as a result. this is what happens when selected rows are loaded in virtual pagination.\n // - niall note - since moving to the stub component, this may no longer be true, as replacing\n // the stub component now replaces the entire row\n this.onRowSelected();\n // as data has changed, then the style and class needs to be recomputed\n this.postProcessCss();\n };\n RowComp.prototype.onRowNodeCellChanged = function () {\n // as data has changed, then the style and class needs to be recomputed\n this.postProcessCss();\n };\n RowComp.prototype.postProcessCss = function () {\n this.postProcessStylesFromGridOptions();\n this.postProcessClassesFromGridOptions();\n this.postProcessRowClassRules();\n this.postProcessRowDragging();\n };\n RowComp.prototype.onRowNodeHighlightChanged = function () {\n var highlighted = this.rowNode.highlighted;\n this.eAllRowContainers.forEach(function (row) {\n removeCssClass(row, 'ag-row-highlight-above');\n removeCssClass(row, 'ag-row-highlight-below');\n if (highlighted) {\n addCssClass(row, 'ag-row-highlight-' + highlighted);\n }\n });\n };\n RowComp.prototype.onRowNodeDraggingChanged = function () {\n this.postProcessRowDragging();\n };\n RowComp.prototype.postProcessRowDragging = function () {\n var dragging = this.rowNode.dragging;\n this.eAllRowContainers.forEach(function (row) { return addOrRemoveCssClass(row, 'ag-row-dragging', dragging); });\n };\n RowComp.prototype.updateExpandedCss = function () {\n var expandable = this.rowNode.isExpandable();\n var expanded = this.rowNode.expanded == true;\n this.eAllRowContainers.forEach(function (eRow) {\n addOrRemoveCssClass(eRow, 'ag-row-group', expandable);\n addOrRemoveCssClass(eRow, 'ag-row-group-expanded', expandable && expanded);\n addOrRemoveCssClass(eRow, 'ag-row-group-contracted', expandable && !expanded);\n setAriaExpanded(eRow, expandable && expanded);\n });\n };\n RowComp.prototype.onDisplayedColumnsChanged = function () {\n if (this.fullWidthRow) {\n return;\n }\n this.refreshCells();\n };\n RowComp.prototype.destroyFullWidthComponents = function () {\n this.fullWidthRowDestroyFuncs.forEach(function (f) { return f(); });\n this.fullWidthRowDestroyFuncs = [];\n if (this.fullWidthRowComponent) {\n this.beans.detailRowCompCache.addOrDestroy(this.rowNode, null, this.fullWidthRowComponent);\n this.fullWidthRowComponent = null;\n }\n if (this.fullWidthRowComponentBody) {\n this.beans.detailRowCompCache.addOrDestroy(this.rowNode, null, this.fullWidthRowComponentBody);\n this.fullWidthRowComponentBody = null;\n }\n if (this.fullWidthRowComponentLeft) {\n this.beans.detailRowCompCache.addOrDestroy(this.rowNode, Constants.PINNED_LEFT, this.fullWidthRowComponentLeft);\n this.fullWidthRowComponentLeft = null;\n }\n if (this.fullWidthRowComponentRight) {\n this.beans.detailRowCompCache.addOrDestroy(this.rowNode, Constants.PINNED_RIGHT, this.fullWidthRowComponentRight);\n this.fullWidthRowComponentRight = null;\n }\n };\n RowComp.prototype.getContainerForCell = function (pinnedType) {\n switch (pinnedType) {\n case Constants.PINNED_LEFT: return this.ePinnedLeftRow;\n case Constants.PINNED_RIGHT: return this.ePinnedRightRow;\n default: return this.eBodyRow;\n }\n };\n RowComp.prototype.onVirtualColumnsChanged = function () {\n if (this.fullWidthRow) {\n return;\n }\n this.refreshCells();\n };\n RowComp.prototype.onColumnResized = function () {\n if (this.fullWidthRow) {\n return;\n }\n this.refreshCells();\n };\n RowComp.prototype.getRowPosition = function () {\n return {\n rowPinned: this.rowNode.rowPinned,\n rowIndex: this.rowNode.rowIndex\n };\n };\n RowComp.prototype.onKeyboardNavigate = function (keyboardEvent) {\n var node = this.rowNode;\n var lastFocusedCell = this.beans.focusController.getFocusedCell();\n var cellPosition = {\n rowIndex: node.rowIndex,\n rowPinned: node.rowPinned,\n column: (lastFocusedCell && lastFocusedCell.column)\n };\n this.beans.rowRenderer.navigateToNextCell(keyboardEvent, keyboardEvent.keyCode, cellPosition, true);\n keyboardEvent.preventDefault();\n };\n RowComp.prototype.onTabKeyDown = function (keyboardEvent) {\n if (this.isFullWidth()) {\n this.beans.rowRenderer.onTabKeyDown(this, keyboardEvent);\n }\n };\n RowComp.prototype.onFullWidthRowFocused = function (event) {\n var node = this.rowNode;\n var isFocused = this.fullWidthRow && event.rowIndex === node.rowIndex && event.rowPinned == node.rowPinned;\n addOrRemoveCssClass(this.eFullWidthRow, 'ag-full-width-focus', isFocused);\n if (isFocused) {\n var focusEl = this.embedFullWidth ? this.eFullWidthRowBody : this.eFullWidthRow;\n focusEl.focus();\n }\n };\n RowComp.prototype.refreshCell = function (cellComp) {\n if (!this.areAllContainersReady()) {\n return;\n }\n this.destroyCells([cellComp.getColumn().getId()]);\n this.refreshCells();\n };\n RowComp.prototype.refreshCells = function () {\n if (!this.areAllContainersReady()) {\n this.refreshNeeded = true;\n return;\n }\n var suppressAnimationFrame = this.beans.gridOptionsWrapper.isSuppressAnimationFrame();\n var skipAnimationFrame = suppressAnimationFrame || this.printLayout;\n if (skipAnimationFrame) {\n this.refreshCellsInAnimationFrame();\n }\n else {\n if (this.columnRefreshPending) {\n return;\n }\n this.beans.taskQueue.createTask(this.refreshCellsInAnimationFrame.bind(this), this.rowNode.rowIndex, 'createTasksP1');\n }\n };\n RowComp.prototype.refreshCellsInAnimationFrame = function () {\n if (!this.active) {\n return;\n }\n this.columnRefreshPending = false;\n var centerCols;\n var leftCols;\n var rightCols;\n if (this.printLayout) {\n centerCols = this.beans.columnController.getAllDisplayedColumns();\n leftCols = [];\n rightCols = [];\n }\n else {\n centerCols = this.beans.columnController.getViewportCenterColumnsForRow(this.rowNode);\n leftCols = this.beans.columnController.getDisplayedLeftColumnsForRow(this.rowNode);\n rightCols = this.beans.columnController.getDisplayedRightColumnsForRow(this.rowNode);\n }\n this.insertCellsIntoContainer(this.eBodyRow, centerCols);\n this.insertCellsIntoContainer(this.ePinnedLeftRow, leftCols);\n this.insertCellsIntoContainer(this.ePinnedRightRow, rightCols);\n this.elementOrderChanged = false;\n var colIdsToRemove = Object.keys(this.cellComps);\n centerCols.forEach(function (col) { return removeFromArray(colIdsToRemove, col.getId()); });\n leftCols.forEach(function (col) { return removeFromArray(colIdsToRemove, col.getId()); });\n rightCols.forEach(function (col) { return removeFromArray(colIdsToRemove, col.getId()); });\n // we never remove editing cells, as this would cause the cells to loose their values while editing\n // as the grid is scrolling horizontally.\n var eligibleToBeRemoved = colIdsToRemove.filter(this.isCellEligibleToBeRemoved.bind(this));\n // remove old cells from gui, but we don't destroy them, we might use them again\n this.destroyCells(eligibleToBeRemoved);\n };\n RowComp.prototype.onColumnMoved = function () {\n this.elementOrderChanged = true;\n };\n RowComp.prototype.destroyCells = function (colIds) {\n var _this = this;\n colIds.forEach(function (key) {\n var cellComp = _this.cellComps[key];\n // could be old reference, ie removed cell\n if (missing(cellComp)) {\n return;\n }\n cellComp.detach();\n cellComp.destroy();\n _this.cellComps[key] = null;\n });\n };\n RowComp.prototype.isCellEligibleToBeRemoved = function (indexStr) {\n var displayedColumns = this.beans.columnController.getAllDisplayedColumns();\n var REMOVE_CELL = true;\n var KEEP_CELL = false;\n var renderedCell = this.cellComps[indexStr];\n // always remove the cell if it's not rendered or if it's in the wrong pinned location\n if (!renderedCell || this.isCellInWrongRow(renderedCell)) {\n return REMOVE_CELL;\n }\n // we want to try and keep editing and focused cells\n var editing = renderedCell.isEditing();\n var focused = this.beans.focusController.isCellFocused(renderedCell.getCellPosition());\n var mightWantToKeepCell = editing || focused;\n if (mightWantToKeepCell) {\n var column = renderedCell.getColumn();\n var cellStillDisplayed = displayedColumns.indexOf(column) >= 0;\n return cellStillDisplayed ? KEEP_CELL : REMOVE_CELL;\n }\n return REMOVE_CELL;\n };\n RowComp.prototype.ensureCellInCorrectContainer = function (cellComp) {\n // for print layout, we always put cells into centre, otherwise we put in correct pinned section\n if (this.printLayout) {\n return;\n }\n var element = cellComp.getGui();\n var column = cellComp.getColumn();\n var pinnedType = column.getPinned();\n var eContainer = this.getContainerForCell(pinnedType);\n // if in wrong container, remove it\n var eOldContainer = cellComp.getParentRow();\n var inWrongRow = eOldContainer !== eContainer;\n if (inWrongRow) {\n // take out from old row\n if (eOldContainer) {\n eOldContainer.removeChild(element);\n }\n eContainer.appendChild(element);\n cellComp.setParentRow(eContainer);\n this.elementOrderChanged = true;\n }\n };\n RowComp.prototype.isCellInWrongRow = function (cellComp) {\n var column = cellComp.getColumn();\n var rowWeWant = this.getContainerForCell(column.getPinned());\n var oldRow = cellComp.getParentRow(); // if in wrong container, remove it\n return oldRow !== rowWeWant;\n };\n RowComp.prototype.insertCellsIntoContainer = function (eRow, cols) {\n var _this = this;\n if (!eRow) {\n return;\n }\n var cellTemplates = [];\n var newCellComps = [];\n cols.forEach(function (col) {\n var colId = col.getId();\n var existingCell = _this.cellComps[colId];\n // need to check the column is the same one, not a new column with the same ID\n if (existingCell && existingCell.getColumn() == col) {\n _this.ensureCellInCorrectContainer(existingCell);\n }\n else {\n if (existingCell) {\n // here there is a col with the same id, so need to destroy the old cell first,\n // as the old column no longer exists. this happens often with pivoting, where\n // id's are pivot_1, pivot_2 etc, so common for new cols with same ID's\n _this.destroyCells([colId]);\n }\n _this.createNewCell(col, eRow, cellTemplates, newCellComps);\n }\n });\n if (cellTemplates.length > 0) {\n appendHtml(eRow, cellTemplates.join(''));\n this.callAfterRowAttachedOnCells(newCellComps, eRow);\n }\n if (this.elementOrderChanged && this.beans.gridOptionsWrapper.isEnsureDomOrder()) {\n var correctChildOrder = cols.map(function (col) { return _this.getCellForCol(col); });\n setDomChildOrder(eRow, correctChildOrder);\n }\n };\n RowComp.prototype.addDomData = function (eRowContainer) {\n var gow = this.beans.gridOptionsWrapper;\n gow.setDomData(eRowContainer, RowComp.DOM_DATA_KEY_RENDERED_ROW, this);\n this.addDestroyFunc(function () {\n gow.setDomData(eRowContainer, RowComp.DOM_DATA_KEY_RENDERED_ROW, null);\n });\n };\n RowComp.prototype.createNewCell = function (col, eContainer, cellTemplates, newCellComps) {\n var newCellComp = new CellComp(this.scope, this.beans, col, this.rowNode, this, false, this.printLayout);\n var cellTemplate = newCellComp.getCreateTemplate();\n cellTemplates.push(cellTemplate);\n newCellComps.push(newCellComp);\n this.cellComps[col.getId()] = newCellComp;\n newCellComp.setParentRow(eContainer);\n this.elementOrderChanged = true;\n };\n RowComp.prototype.onMouseEvent = function (eventName, mouseEvent) {\n switch (eventName) {\n case 'dblclick':\n this.onRowDblClick(mouseEvent);\n break;\n case 'click':\n this.onRowClick(mouseEvent);\n break;\n case 'mousedown':\n this.onRowMouseDown(mouseEvent);\n break;\n }\n };\n RowComp.prototype.createRowEvent = function (type, domEvent) {\n return {\n type: type,\n node: this.rowNode,\n data: this.rowNode.data,\n rowIndex: this.rowNode.rowIndex,\n rowPinned: this.rowNode.rowPinned,\n context: this.beans.gridOptionsWrapper.getContext(),\n api: this.beans.gridOptionsWrapper.getApi(),\n columnApi: this.beans.gridOptionsWrapper.getColumnApi(),\n event: domEvent\n };\n };\n RowComp.prototype.createRowEventWithSource = function (type, domEvent) {\n var event = this.createRowEvent(type, domEvent);\n // when first developing this, we included the rowComp in the event.\n // this seems very weird. so when introducing the event types, i left the 'source'\n // out of the type, and just include the source in the two places where this event\n // was fired (rowClicked and rowDoubleClicked). it doesn't make sense for any\n // users to be using this, as the rowComp isn't an object we expose, so would be\n // very surprising if a user was using it.\n event.source = this;\n return event;\n };\n RowComp.prototype.onRowDblClick = function (mouseEvent) {\n if (isStopPropagationForAgGrid(mouseEvent)) {\n return;\n }\n var agEvent = this.createRowEventWithSource(Events.EVENT_ROW_DOUBLE_CLICKED, mouseEvent);\n this.beans.eventService.dispatchEvent(agEvent);\n };\n RowComp.prototype.onRowMouseDown = function (mouseEvent) {\n this.lastMouseDownOnDragger = isElementChildOfClass(mouseEvent.target, 'ag-row-drag', 3);\n if (!this.isFullWidth()) {\n return;\n }\n var node = this.rowNode;\n var columnController = this.beans.columnController;\n this.beans.focusController.setFocusedCell(node.rowIndex, columnController.getAllDisplayedColumns()[0], node.rowPinned, true);\n };\n RowComp.prototype.onRowClick = function (mouseEvent) {\n var stop = isStopPropagationForAgGrid(mouseEvent) || this.lastMouseDownOnDragger;\n if (stop) {\n return;\n }\n var agEvent = this.createRowEventWithSource(Events.EVENT_ROW_CLICKED, mouseEvent);\n this.beans.eventService.dispatchEvent(agEvent);\n // ctrlKey for windows, metaKey for Apple\n var multiSelectKeyPressed = mouseEvent.ctrlKey || mouseEvent.metaKey;\n var shiftKeyPressed = mouseEvent.shiftKey;\n // we do not allow selecting the group by clicking, when groupSelectChildren, as the logic to\n // handle this is broken. to observe, change the logic below and allow groups to be selected.\n // you will see the group gets selected, then all children get selected, then the grid unselects\n // the children (as the default behaviour when clicking is to unselect other rows) which results\n // in the group getting unselected (as all children are unselected). the correct thing would be\n // to change this, so that children of the selected group are not then subsequenly un-selected.\n var groupSelectsChildren = this.beans.gridOptionsWrapper.isGroupSelectsChildren();\n if (\n // we do not allow selecting groups by clicking (as the click here expands the group), or if it's a detail row,\n // so return if it's a group row\n (groupSelectsChildren && this.rowNode.group) ||\n // this is needed so we don't unselect other rows when we click this row, eg if this row is not selectable,\n // and we click it, the selection should not change (ie any currently selected row should stay selected)\n !this.rowNode.selectable ||\n // we also don't allow selection of pinned rows\n this.rowNode.rowPinned ||\n // if no selection method enabled, do nothing\n !this.beans.gridOptionsWrapper.isRowSelection() ||\n // if click selection suppressed, do nothing\n this.beans.gridOptionsWrapper.isSuppressRowClickSelection()) {\n return;\n }\n var multiSelectOnClick = this.beans.gridOptionsWrapper.isRowMultiSelectWithClick();\n var rowDeselectionWithCtrl = !this.beans.gridOptionsWrapper.isSuppressRowDeselection();\n if (this.rowNode.isSelected()) {\n if (multiSelectOnClick) {\n this.rowNode.setSelectedParams({ newValue: false });\n }\n else if (multiSelectKeyPressed) {\n if (rowDeselectionWithCtrl) {\n this.rowNode.setSelectedParams({ newValue: false });\n }\n }\n else {\n // selected with no multi key, must make sure anything else is unselected\n this.rowNode.setSelectedParams({ newValue: !shiftKeyPressed, clearSelection: !shiftKeyPressed, rangeSelect: shiftKeyPressed });\n }\n }\n else {\n var clearSelection = multiSelectOnClick ? false : !multiSelectKeyPressed;\n this.rowNode.setSelectedParams({ newValue: true, clearSelection: clearSelection, rangeSelect: shiftKeyPressed });\n }\n };\n RowComp.prototype.createFullWidthRowContainer = function (rowContainerComp, pinned, extraCssClass, cellRendererType, cellRendererName, eRowCallback, cellRendererCallback, detailRow) {\n var _this = this;\n var rowTemplate = this.createTemplate('', extraCssClass);\n rowContainerComp.appendRowTemplate(rowTemplate, function () {\n var eRow = rowContainerComp.getRowElement(_this.getCompId());\n var params = _this.createFullWidthParams(eRow, pinned);\n var callback = function (cellRenderer) {\n if (_this.isAlive()) {\n var eGui = cellRenderer.getGui();\n eRow.appendChild(eGui);\n if (detailRow) {\n _this.setupDetailRowAutoHeight(eGui);\n }\n cellRendererCallback(cellRenderer);\n }\n else {\n _this.beans.context.destroyBean(cellRenderer);\n }\n };\n // if doing master detail, it's possible we have a cached row comp from last time detail was displayed\n var cachedRowComp = _this.beans.detailRowCompCache.get(_this.rowNode, pinned);\n if (cachedRowComp) {\n callback(cachedRowComp);\n }\n else {\n var res = _this.beans.userComponentFactory.newFullWidthCellRenderer(params, cellRendererType, cellRendererName);\n if (!res) {\n var masterDetailModuleLoaded = ModuleRegistry.isRegistered(exports.ModuleNames.MasterDetailModule);\n if (cellRendererName === 'agDetailCellRenderer' && !masterDetailModuleLoaded) {\n console.warn(\"AG Grid: cell renderer agDetailCellRenderer (for master detail) not found. Did you forget to include the master detail module?\");\n }\n else {\n console.error(\"AG Grid: fullWidthCellRenderer \" + cellRendererName + \" not found\");\n }\n return;\n }\n res.then(callback);\n }\n _this.afterRowAttached(rowContainerComp, eRow);\n eRowCallback(eRow);\n _this.angular1Compile(eRow);\n });\n };\n RowComp.prototype.setupDetailRowAutoHeight = function (eDetailGui) {\n var _this = this;\n if (!this.beans.gridOptionsWrapper.isDetailRowAutoHeight()) {\n return;\n }\n var checkRowSizeFunc = function () {\n var clientHeight = eDetailGui.clientHeight;\n // if the UI is not ready, the height can be 0, which we ignore, as otherwise a flicker will occur\n // as UI goes from the default height, to 0, then to the real height as UI becomes ready. this means\n // it's not possible for have 0 as auto-height, however this is an improbable use case, as even an\n // empty detail grid would still have some styling around it giving at least a few pixels.\n if (clientHeight != null && clientHeight > 0) {\n // we do the update in a timeout, to make sure we are not calling from inside the grid\n // doing another update\n var updateRowHeightFunc = function () {\n _this.rowNode.setRowHeight(clientHeight);\n if (_this.beans.clientSideRowModel) {\n _this.beans.clientSideRowModel.onRowHeightChanged();\n }\n else if (_this.beans.serverSideRowModel) {\n _this.beans.serverSideRowModel.onRowHeightChanged();\n }\n };\n _this.beans.frameworkOverrides.setTimeout(updateRowHeightFunc, 0);\n }\n };\n var resizeObserverDestroyFunc = this.beans.resizeObserverService.observeResize(eDetailGui, checkRowSizeFunc);\n this.fullWidthRowDestroyFuncs.push(resizeObserverDestroyFunc);\n checkRowSizeFunc();\n };\n RowComp.prototype.angular1Compile = function (element) {\n if (!this.scope) {\n return;\n }\n this.beans.$compile(element)(this.scope);\n };\n RowComp.prototype.createFullWidthParams = function (eRow, pinned) {\n var params = {\n fullWidth: true,\n data: this.rowNode.data,\n node: this.rowNode,\n value: this.rowNode.key,\n $scope: this.scope ? this.scope : this.parentScope,\n $compile: this.beans.$compile,\n rowIndex: this.rowNode.rowIndex,\n api: this.beans.gridOptionsWrapper.getApi(),\n columnApi: this.beans.gridOptionsWrapper.getColumnApi(),\n context: this.beans.gridOptionsWrapper.getContext(),\n // these need to be taken out, as part of 'afterAttached' now\n eGridCell: eRow,\n eParentOfValue: eRow,\n pinned: pinned,\n addRenderedRowListener: this.addEventListener.bind(this)\n };\n return params;\n };\n RowComp.prototype.getInitialRowClasses = function (extraCssClass) {\n var params = {\n rowNode: this.rowNode,\n extraCssClass: extraCssClass,\n rowFocused: this.rowFocused,\n fadeRowIn: this.fadeRowIn,\n rowIsEven: this.rowIsEven,\n rowLevel: this.rowLevel,\n fullWidthRow: this.fullWidthRow,\n firstRowOnPage: this.isFirstRowOnPage(),\n lastRowOnPage: this.isLastRowOnPage(),\n printLayout: this.printLayout,\n expandable: this.rowNode.isExpandable(),\n scope: this.scope\n };\n return this.beans.rowCssClassCalculator.getInitialRowClasses(params);\n };\n RowComp.prototype.onUiLevelChanged = function () {\n var newLevel = this.beans.rowCssClassCalculator.calculateRowLevel(this.rowNode);\n if (this.rowLevel != newLevel) {\n var classToAdd_1 = 'ag-row-level-' + newLevel;\n var classToRemove_1 = 'ag-row-level-' + this.rowLevel;\n this.eAllRowContainers.forEach(function (row) {\n addCssClass(row, classToAdd_1);\n removeCssClass(row, classToRemove_1);\n });\n }\n this.rowLevel = newLevel;\n };\n RowComp.prototype.isFirstRowOnPage = function () {\n return this.rowNode.rowIndex === this.beans.paginationProxy.getPageFirstRow();\n };\n RowComp.prototype.isLastRowOnPage = function () {\n return this.rowNode.rowIndex === this.beans.paginationProxy.getPageLastRow();\n };\n RowComp.prototype.onModelUpdated = function () {\n var newFirst = this.isFirstRowOnPage();\n var newLast = this.isLastRowOnPage();\n if (this.firstRowOnPage !== newFirst) {\n this.firstRowOnPage = newFirst;\n this.eAllRowContainers.forEach(function (row) { return addOrRemoveCssClass(row, 'ag-row-first', newFirst); });\n }\n if (this.lastRowOnPage !== newLast) {\n this.lastRowOnPage = newLast;\n this.eAllRowContainers.forEach(function (row) { return addOrRemoveCssClass(row, 'ag-row-last', newLast); });\n }\n };\n RowComp.prototype.stopEditing = function (cancel) {\n if (cancel === void 0) { cancel = false; }\n this.forEachCellComp(function (renderedCell) {\n renderedCell.stopEditing(cancel);\n });\n if (!this.editingRow) {\n return;\n }\n if (!cancel) {\n var event_1 = this.createRowEvent(Events.EVENT_ROW_VALUE_CHANGED);\n this.beans.eventService.dispatchEvent(event_1);\n }\n this.setEditingRow(false);\n };\n RowComp.prototype.setEditingRow = function (value) {\n this.editingRow = value;\n this.eAllRowContainers.forEach(function (row) { return addOrRemoveCssClass(row, 'ag-row-editing', value); });\n var event = value ?\n this.createRowEvent(Events.EVENT_ROW_EDITING_STARTED)\n : this.createRowEvent(Events.EVENT_ROW_EDITING_STOPPED);\n this.beans.eventService.dispatchEvent(event);\n };\n RowComp.prototype.startRowEditing = function (keyPress, charPress, sourceRenderedCell) {\n if (keyPress === void 0) { keyPress = null; }\n if (charPress === void 0) { charPress = null; }\n if (sourceRenderedCell === void 0) { sourceRenderedCell = null; }\n // don't do it if already editing\n if (this.editingRow) {\n return;\n }\n this.forEachCellComp(function (renderedCell) {\n var cellStartedEdit = renderedCell === sourceRenderedCell;\n if (cellStartedEdit) {\n renderedCell.startEditingIfEnabled(keyPress, charPress, cellStartedEdit);\n }\n else {\n renderedCell.startEditingIfEnabled(null, null, cellStartedEdit);\n }\n });\n this.setEditingRow(true);\n };\n RowComp.prototype.forEachCellComp = function (callback) {\n iterateObject(this.cellComps, function (key, cellComp) {\n if (!cellComp) {\n return;\n }\n callback(cellComp);\n });\n };\n RowComp.prototype.postProcessClassesFromGridOptions = function () {\n var _this = this;\n var cssClasses = this.beans.rowCssClassCalculator.processClassesFromGridOptions(this.rowNode, this.scope);\n if (!cssClasses || !cssClasses.length) {\n return;\n }\n cssClasses.forEach(function (classStr) {\n _this.eAllRowContainers.forEach(function (row) { return addCssClass(row, classStr); });\n });\n };\n RowComp.prototype.postProcessRowClassRules = function () {\n var _this = this;\n this.beans.rowCssClassCalculator.processRowClassRules(this.rowNode, this.scope, function (className) {\n _this.eAllRowContainers.forEach(function (row) { return addCssClass(row, className); });\n }, function (className) {\n _this.eAllRowContainers.forEach(function (row) { return removeCssClass(row, className); });\n });\n };\n RowComp.prototype.preProcessStylesFromGridOptions = function () {\n var rowStyles = this.processStylesFromGridOptions();\n return cssStyleObjectToMarkup(rowStyles);\n };\n RowComp.prototype.postProcessStylesFromGridOptions = function () {\n var rowStyles = this.processStylesFromGridOptions();\n this.eAllRowContainers.forEach(function (row) { return addStylesToElement(row, rowStyles); });\n };\n RowComp.prototype.processStylesFromGridOptions = function () {\n // part 1 - rowStyle\n var rowStyle = this.beans.gridOptionsWrapper.getRowStyle();\n if (rowStyle && typeof rowStyle === 'function') {\n console.warn('AG Grid: rowStyle should be an object of key/value styles, not be a function, use getRowStyle() instead');\n return;\n }\n // part 1 - rowStyleFunc\n var rowStyleFunc = this.beans.gridOptionsWrapper.getRowStyleFunc();\n var rowStyleFuncResult;\n if (rowStyleFunc) {\n var params = {\n data: this.rowNode.data,\n node: this.rowNode,\n rowIndex: this.rowNode.rowIndex,\n $scope: this.scope,\n api: this.beans.gridOptionsWrapper.getApi(),\n columnApi: this.beans.gridOptionsWrapper.getColumnApi(),\n context: this.beans.gridOptionsWrapper.getContext()\n };\n rowStyleFuncResult = rowStyleFunc(params);\n }\n return assign({}, rowStyle, rowStyleFuncResult);\n };\n RowComp.prototype.createCells = function (cols) {\n var _this = this;\n var templateParts = [];\n var newCellComps = [];\n cols.forEach(function (col) {\n var newCellComp = new CellComp(_this.scope, _this.beans, col, _this.rowNode, _this, false, _this.printLayout);\n var cellTemplate = newCellComp.getCreateTemplate();\n templateParts.push(cellTemplate);\n newCellComps.push(newCellComp);\n _this.cellComps[col.getId()] = newCellComp;\n });\n var templateAndComps = {\n template: templateParts.join(''),\n cellComps: newCellComps\n };\n return templateAndComps;\n };\n RowComp.prototype.onRowSelected = function () {\n var _this = this;\n var selected = this.rowNode.isSelected();\n this.eAllRowContainers.forEach(function (row) {\n setAriaSelected(row, selected);\n addOrRemoveCssClass(row, 'ag-row-selected', selected);\n _this.refreshAriaLabel(row, selected);\n });\n };\n RowComp.prototype.refreshAriaLabel = function (node, selected) {\n if (selected && this.beans.gridOptionsWrapper.isSuppressRowDeselection()) {\n node.removeAttribute('aria-label');\n return;\n }\n var translate = this.beans.gridOptionsWrapper.getLocaleTextFunc();\n var label = translate(selected ? 'ariaRowDeselect' : 'ariaRowSelect', \"Press SPACE to \" + (selected ? 'deselect' : 'select') + \" this row.\");\n setAriaLabel(node, label);\n };\n // called:\n // + after row created for first time\n // + after horizontal scroll, so new cells due to column virtualisation\n RowComp.prototype.callAfterRowAttachedOnCells = function (newCellComps, eRow) {\n var _this = this;\n newCellComps.forEach(function (cellComp) {\n cellComp.setParentRow(eRow);\n cellComp.afterAttached();\n // if we are editing the row, then the cell needs to turn\n // into edit mode\n if (_this.editingRow) {\n cellComp.startEditingIfEnabled();\n }\n });\n };\n RowComp.prototype.afterRowAttached = function (rowContainerComp, eRow) {\n var _this = this;\n this.addDomData(eRow);\n this.removeSecondPassFuncs.push(function () {\n rowContainerComp.removeRowElement(eRow);\n });\n this.removeFirstPassFuncs.push(function () {\n if (exists(_this.rowNode.rowTop)) {\n // the row top is updated anyway, however we set it here again\n // to something more reasonable for the animation - ie if the\n // row top is 10000px away, the row will flash out, so this\n // gives it a rounded value, so row animates out more slowly\n var rowTop = _this.roundRowTopToBounds(_this.rowNode.rowTop);\n _this.setRowTop(rowTop);\n }\n else {\n addCssClass(eRow, 'ag-opacity-zero');\n }\n });\n this.eAllRowContainers.push(eRow);\n // adding hover functionality adds listener to this row, so we\n // do it lazily in an animation frame\n if (this.useAnimationFrameForCreate) {\n this.beans.taskQueue.createTask(this.addHoverFunctionality.bind(this, eRow), this.rowNode.rowIndex, 'createTasksP2');\n }\n else {\n this.addHoverFunctionality(eRow);\n }\n };\n RowComp.prototype.addHoverFunctionality = function (eRow) {\n var _this = this;\n // because we use animation frames to do this, it's possible the row no longer exists\n // by the time we get to add it\n if (!this.active) {\n return;\n }\n // because mouseenter and mouseleave do not propagate, we cannot listen on the gridPanel\n // like we do for all the other mouse events.\n // because of the pinning, we cannot simply add / remove the class based on the eRow. we\n // have to check all eRow's (body & pinned). so the trick is if any of the rows gets a\n // mouse hover, it sets such in the rowNode, and then all three reflect the change as\n // all are listening for event on the row node.\n // step 1 - add listener, to set flag on row node\n this.addManagedListener(eRow, 'mouseenter', function () { return _this.rowNode.onMouseEnter(); });\n this.addManagedListener(eRow, 'mouseleave', function () { return _this.rowNode.onMouseLeave(); });\n // step 2 - listen for changes on row node (which any eRow can trigger)\n this.addManagedListener(this.rowNode, RowNode.EVENT_MOUSE_ENTER, function () {\n // if hover turned off, we don't add the class. we do this here so that if the application\n // toggles this property mid way, we remove the hover form the last row, but we stop\n // adding hovers from that point onwards.\n if (!_this.beans.gridOptionsWrapper.isSuppressRowHoverHighlight()) {\n addCssClass(eRow, 'ag-row-hover');\n }\n });\n this.addManagedListener(this.rowNode, RowNode.EVENT_MOUSE_LEAVE, function () {\n removeCssClass(eRow, 'ag-row-hover');\n });\n };\n // for animation, we don't want to animate entry or exit to a very far away pixel,\n // otherwise the row would move so fast, it would appear to disappear. so this method\n // moves the row closer to the viewport if it is far away, so the row slide in / out\n // at a speed the user can see.\n RowComp.prototype.roundRowTopToBounds = function (rowTop) {\n var range = this.beans.gridPanel.getVScrollPosition();\n var minPixel = this.applyPaginationOffset(range.top, true) - 100;\n var maxPixel = this.applyPaginationOffset(range.bottom, true) + 100;\n return Math.min(Math.max(minPixel, rowTop), maxPixel);\n };\n RowComp.prototype.getFrameworkOverrides = function () {\n return this.beans.frameworkOverrides;\n };\n RowComp.prototype.onRowHeightChanged = function () {\n // check for exists first - if the user is resetting the row height, then\n // it will be null (or undefined) momentarily until the next time the flatten\n // stage is called where the row will then update again with a new height\n if (exists(this.rowNode.rowHeight)) {\n var heightPx_1 = this.rowNode.rowHeight + \"px\";\n this.eAllRowContainers.forEach(function (row) { return row.style.height = heightPx_1; });\n }\n };\n RowComp.prototype.addEventListener = function (eventType, listener) {\n if (eventType === 'renderedRowRemoved' || eventType === 'rowRemoved') {\n eventType = Events.EVENT_VIRTUAL_ROW_REMOVED;\n console.warn('AG Grid: Since version 11, event renderedRowRemoved is now called ' + Events.EVENT_VIRTUAL_ROW_REMOVED);\n }\n _super.prototype.addEventListener.call(this, eventType, listener);\n };\n RowComp.prototype.removeEventListener = function (eventType, listener) {\n if (eventType === 'renderedRowRemoved' || eventType === 'rowRemoved') {\n eventType = Events.EVENT_VIRTUAL_ROW_REMOVED;\n console.warn('AG Grid: Since version 11, event renderedRowRemoved and rowRemoved is now called ' + Events.EVENT_VIRTUAL_ROW_REMOVED);\n }\n _super.prototype.removeEventListener.call(this, eventType, listener);\n };\n // note - this is NOT called by context, as we don't wire / unwire the CellComp for performance reasons.\n RowComp.prototype.destroy = function (animate) {\n if (animate === void 0) { animate = false; }\n this.active = false;\n // why do we have this method? shouldn't everything below be added as a destroy func beside\n // the corresponding create logic?\n this.destroyFullWidthComponents();\n if (animate) {\n this.removeFirstPassFuncs.forEach(function (func) { return func(); });\n this.removeSecondPassFuncs.push(this.destroyContainingCells.bind(this));\n }\n else {\n this.destroyContainingCells();\n // we are not animating, so execute the second stage of removal now.\n // we call getAndClear, so that they are only called once\n var delayedDestroyFunctions = this.getAndClearDelayedDestroyFunctions();\n delayedDestroyFunctions.forEach(function (func) { return func(); });\n }\n var event = this.createRowEvent(Events.EVENT_VIRTUAL_ROW_REMOVED);\n this.dispatchEvent(event);\n this.beans.eventService.dispatchEvent(event);\n _super.prototype.destroy.call(this);\n };\n RowComp.prototype.destroyContainingCells = function () {\n var cellsToDestroy = Object.keys(this.cellComps);\n this.destroyCells(cellsToDestroy);\n };\n // we clear so that the functions are never executed twice\n RowComp.prototype.getAndClearDelayedDestroyFunctions = function () {\n var result = this.removeSecondPassFuncs;\n this.removeSecondPassFuncs = [];\n return result;\n };\n RowComp.prototype.onCellFocusChanged = function () {\n var rowFocused = this.beans.focusController.isRowFocused(this.rowNode.rowIndex, this.rowNode.rowPinned);\n if (rowFocused !== this.rowFocused) {\n this.eAllRowContainers.forEach(function (row) { return addOrRemoveCssClass(row, 'ag-row-focus', rowFocused); });\n this.eAllRowContainers.forEach(function (row) { return addOrRemoveCssClass(row, 'ag-row-no-focus', !rowFocused); });\n this.rowFocused = rowFocused;\n }\n // if we are editing, then moving the focus out of a row will stop editing\n if (!rowFocused && this.editingRow) {\n this.stopEditing(false);\n }\n };\n RowComp.prototype.onPaginationChanged = function () {\n var currentPage = this.beans.paginationProxy.getCurrentPage();\n // it is possible this row is in the new page, but the page number has changed, which means\n // it needs to reposition itself relative to the new page\n if (this.paginationPage !== currentPage) {\n this.paginationPage = currentPage;\n this.onTopChanged();\n }\n };\n RowComp.prototype.onTopChanged = function () {\n this.setRowTop(this.rowNode.rowTop);\n };\n RowComp.prototype.onPaginationPixelOffsetChanged = function () {\n // the pixel offset is used when calculating rowTop to set on the row DIV\n this.onTopChanged();\n };\n // applies pagination offset, eg if on second page, and page height is 500px, then removes\n // 500px from the top position, so a row with rowTop 600px is displayed at location 100px.\n // reverse will take the offset away rather than add.\n RowComp.prototype.applyPaginationOffset = function (topPx, reverse) {\n if (reverse === void 0) { reverse = false; }\n if (this.rowNode.isRowPinned()) {\n return topPx;\n }\n var pixelOffset = this.beans.paginationProxy.getPixelOffset();\n var multiplier = reverse ? 1 : -1;\n return topPx + (pixelOffset * multiplier);\n };\n RowComp.prototype.setRowTop = function (pixels) {\n // print layout uses normal flow layout for row positioning\n if (this.printLayout) {\n return;\n }\n // need to make sure rowTop is not null, as this can happen if the node was once\n // visible (ie parent group was expanded) but is now not visible\n if (exists(pixels)) {\n var afterPaginationPixels = this.applyPaginationOffset(pixels);\n var afterScalingPixels = this.rowNode.isRowPinned() ? afterPaginationPixels : this.beans.maxDivHeightScaler.getRealPixelPosition(afterPaginationPixels);\n var topPx_1 = afterScalingPixels + \"px\";\n if (this.beans.gridOptionsWrapper.isSuppressRowTransform()) {\n this.eAllRowContainers.forEach(function (row) { return row.style.top = topPx_1; });\n }\n else {\n this.eAllRowContainers.forEach(function (row) { return row.style.transform = \"translateY(\" + topPx_1 + \")\"; });\n }\n }\n };\n // we clear so that the functions are never executed twice\n RowComp.prototype.getAndClearNextVMTurnFunctions = function () {\n var result = this.createSecondPassFuncs;\n this.createSecondPassFuncs = [];\n return result;\n };\n RowComp.prototype.getRowNode = function () {\n return this.rowNode;\n };\n RowComp.prototype.getRenderedCellForColumn = function (column) {\n var _this = this;\n var cellComp = this.cellComps[column.getColId()];\n if (cellComp) {\n return cellComp;\n }\n var spanList = Object.keys(this.cellComps)\n .map(function (name) { return _this.cellComps[name]; })\n .filter(function (cmp) { return cmp && cmp.getColSpanningList().indexOf(column) !== -1; });\n return spanList.length ? spanList[0] : null;\n };\n RowComp.prototype.onRowIndexChanged = function () {\n // we only bother updating if the rowIndex is present. if it is not present, it means this row\n // is child of a group node, and the group node was closed, it's the only way to have no row index.\n // when this happens, row is about to be de-rendered, so we don't care, rowComp is about to die!\n if (this.rowNode.rowIndex != null) {\n this.onCellFocusChanged();\n this.updateRowIndexes();\n }\n };\n RowComp.prototype.updateRowIndexes = function () {\n var _this = this;\n var rowIndexStr = this.rowNode.getRowIndexString();\n var rowIsEven = this.rowNode.rowIndex % 2 === 0;\n var rowIsEvenChanged = this.rowIsEven !== rowIsEven;\n var headerRowCount = this.beans.headerNavigationService.getHeaderRowCount();\n if (rowIsEvenChanged) {\n this.rowIsEven = rowIsEven;\n }\n this.eAllRowContainers.forEach(function (eRow) {\n eRow.setAttribute('row-index', rowIndexStr);\n setAriaRowIndex(eRow, headerRowCount + _this.rowNode.rowIndex + 1);\n if (!rowIsEvenChanged) {\n return;\n }\n addOrRemoveCssClass(eRow, 'ag-row-even', rowIsEven);\n addOrRemoveCssClass(eRow, 'ag-row-odd', !rowIsEven);\n });\n };\n RowComp.prototype.ensureDomOrder = function () {\n var sides = [\n {\n el: this.getBodyRowElement(),\n ct: this.bodyContainerComp\n },\n {\n el: this.getPinnedLeftRowElement(),\n ct: this.pinnedLeftContainerComp\n }, {\n el: this.getPinnedRightRowElement(),\n ct: this.pinnedRightContainerComp\n }, {\n el: this.getFullWidthRowElement(),\n ct: this.fullWidthContainerComp\n }\n ];\n sides.forEach(function (side) {\n if (!side.el) {\n return;\n }\n side.ct.ensureDomOrder(side.el);\n });\n };\n // returns the pinned left container, either the normal one, or the embedded full with one if exists\n RowComp.prototype.getPinnedLeftRowElement = function () {\n return this.ePinnedLeftRow ? this.ePinnedLeftRow : this.eFullWidthRowLeft;\n };\n // returns the pinned right container, either the normal one, or the embedded full with one if exists\n RowComp.prototype.getPinnedRightRowElement = function () {\n return this.ePinnedRightRow ? this.ePinnedRightRow : this.eFullWidthRowRight;\n };\n // returns the body container, either the normal one, or the embedded full with one if exists\n RowComp.prototype.getBodyRowElement = function () {\n return this.eBodyRow ? this.eBodyRow : this.eFullWidthRowBody;\n };\n // returns the full width container\n RowComp.prototype.getFullWidthRowElement = function () {\n return this.eFullWidthRow;\n };\n RowComp.DOM_DATA_KEY_RENDERED_ROW = 'renderedRow';\n RowComp.FULL_WIDTH_CELL_RENDERER = 'fullWidthCellRenderer';\n RowComp.GROUP_ROW_RENDERER = 'groupRowRenderer';\n RowComp.GROUP_ROW_RENDERER_COMP_NAME = 'agGroupRowRenderer';\n RowComp.LOADING_CELL_RENDERER = 'loadingCellRenderer';\n RowComp.LOADING_CELL_RENDERER_COMP_NAME = 'agLoadingCellRenderer';\n RowComp.DETAIL_CELL_RENDERER = 'detailCellRenderer';\n RowComp.DETAIL_CELL_RENDERER_COMP_NAME = 'agDetailCellRenderer';\n return RowComp;\n}(Component));\n\n/**\n * @ag-grid-community/core - Advanced Data Grid / Data Table supporting Javascript / React / AngularJS / Web Components\n * @version v25.1.0\n * @link http://www.ag-grid.com/\n * @license MIT\n */\nvar __extends$I = (undefined && undefined.__extends) || (function () {\n var extendStatics = function (d, b) {\n extendStatics = Object.setPrototypeOf ||\n ({ __proto__: [] } instanceof Array && function (d, b) { d.__proto__ = b; }) ||\n function (d, b) { for (var p in b) if (b.hasOwnProperty(p)) d[p] = b[p]; };\n return extendStatics(d, b);\n };\n return function (d, b) {\n extendStatics(d, b);\n function __() { this.constructor = d; }\n d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __());\n };\n})();\nvar __assign$4 = (undefined && undefined.__assign) || function () {\n __assign$4 = Object.assign || function(t) {\n for (var s, i = 1, n = arguments.length; i < n; i++) {\n s = arguments[i];\n for (var p in s) if (Object.prototype.hasOwnProperty.call(s, p))\n t[p] = s[p];\n }\n return t;\n };\n return __assign$4.apply(this, arguments);\n};\nvar __decorate$C = (undefined && undefined.__decorate) || function (decorators, target, key, desc) {\n var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d;\n if (typeof Reflect === \"object\" && typeof Reflect.decorate === \"function\") r = Reflect.decorate(decorators, target, key, desc);\n else for (var i = decorators.length - 1; i >= 0; i--) if (d = decorators[i]) r = (c < 3 ? d(r) : c > 3 ? d(target, key, r) : d(target, key)) || r;\n return c > 3 && r && Object.defineProperty(target, key, r), r;\n};\nvar __param$5 = (undefined && undefined.__param) || function (paramIndex, decorator) {\n return function (target, key) { decorator(target, key, paramIndex); }\n};\nvar RowRenderer = /** @class */ (function (_super) {\n __extends$I(RowRenderer, _super);\n function RowRenderer() {\n var _this = _super !== null && _super.apply(this, arguments) || this;\n _this.destroyFuncsForColumnListeners = [];\n // map of row ids to row objects. keeps track of which elements\n // are rendered for which rows in the dom.\n _this.rowCompsByIndex = {};\n _this.floatingTopRowComps = [];\n _this.floatingBottomRowComps = [];\n // we only allow one refresh at a time, otherwise the internal memory structure here\n // will get messed up. this can happen if the user has a cellRenderer, and inside the\n // renderer they call an API method that results in another pass of the refresh,\n // then it will be trying to draw rows in the middle of a refresh.\n _this.refreshInProgress = false;\n return _this;\n }\n RowRenderer.prototype.registerGridCore = function (gridCore) {\n this.gridCore = gridCore;\n };\n RowRenderer.prototype.getGridCore = function () {\n return this.gridCore;\n };\n RowRenderer.prototype.agWire = function (loggerFactory) {\n this.logger = loggerFactory.create(\"RowRenderer\");\n };\n RowRenderer.prototype.registerGridComp = function (gridPanel) {\n this.gridPanel = gridPanel;\n this.rowContainers = this.gridPanel.getRowContainers();\n this.addManagedListener(this.eventService, Events.EVENT_PAGINATION_CHANGED, this.onPageLoaded.bind(this));\n this.addManagedListener(this.eventService, Events.EVENT_PINNED_ROW_DATA_CHANGED, this.onPinnedRowDataChanged.bind(this));\n this.addManagedListener(this.eventService, Events.EVENT_DISPLAYED_COLUMNS_CHANGED, this.onDisplayedColumnsChanged.bind(this));\n this.addManagedListener(this.eventService, Events.EVENT_BODY_SCROLL, this.redrawAfterScroll.bind(this));\n this.addManagedListener(this.eventService, Events.EVENT_BODY_HEIGHT_CHANGED, this.redrawAfterScroll.bind(this));\n this.addManagedListener(this.gridOptionsWrapper, GridOptionsWrapper.PROP_DOM_LAYOUT, this.onDomLayoutChanged.bind(this));\n this.registerCellEventListeners();\n this.printLayout = this.gridOptionsWrapper.getDomLayout() === Constants.DOM_LAYOUT_PRINT;\n this.embedFullWidthRows = this.printLayout || this.gridOptionsWrapper.isEmbedFullWidthRows();\n this.redrawAfterModelUpdate();\n };\n // in a clean design, each cell would register for each of these events. however when scrolling, all the cells\n // registering and de-registering for events is a performance bottleneck. so we register here once and inform\n // all active cells.\n RowRenderer.prototype.registerCellEventListeners = function () {\n var _this = this;\n this.addManagedListener(this.eventService, Events.EVENT_CELL_FOCUSED, function (event) {\n _this.forEachCellComp(function (cellComp) { return cellComp.onCellFocused(event); });\n _this.forEachRowComp(function (key, rowComp) {\n if (rowComp.isFullWidth()) {\n rowComp.onFullWidthRowFocused(event);\n }\n });\n });\n this.addManagedListener(this.eventService, Events.EVENT_FLASH_CELLS, function (event) {\n _this.forEachCellComp(function (cellComp) { return cellComp.onFlashCells(event); });\n });\n this.addManagedListener(this.eventService, Events.EVENT_COLUMN_HOVER_CHANGED, function () {\n _this.forEachCellComp(function (cellComp) { return cellComp.onColumnHover(); });\n });\n // only for printLayout - because we are rendering all the cells in the same row, regardless of pinned state,\n // then changing the width of the containers will impact left position. eg the center cols all have their\n // left position adjusted by the width of the left pinned column, so if the pinned left column width changes,\n // all the center cols need to be shifted to accommodate this. when in normal layout, the pinned cols are\n // in different containers so doesn't impact.\n this.addManagedListener(this.eventService, Events.EVENT_DISPLAYED_COLUMNS_WIDTH_CHANGED, function () {\n if (_this.printLayout) {\n _this.forEachCellComp(function (cellComp) { return cellComp.onLeftChanged(); });\n }\n });\n var rangeSelectionEnabled = this.gridOptionsWrapper.isEnableRangeSelection();\n if (rangeSelectionEnabled) {\n this.addManagedListener(this.eventService, Events.EVENT_RANGE_SELECTION_CHANGED, function () {\n _this.forEachCellComp(function (cellComp) { return cellComp.onRangeSelectionChanged(); });\n });\n this.addManagedListener(this.eventService, Events.EVENT_COLUMN_MOVED, function () {\n _this.forEachCellComp(function (cellComp) { return cellComp.updateRangeBordersIfRangeCount(); });\n });\n this.addManagedListener(this.eventService, Events.EVENT_COLUMN_PINNED, function () {\n _this.forEachCellComp(function (cellComp) { return cellComp.updateRangeBordersIfRangeCount(); });\n });\n this.addManagedListener(this.eventService, Events.EVENT_COLUMN_VISIBLE, function () {\n _this.forEachCellComp(function (cellComp) { return cellComp.updateRangeBordersIfRangeCount(); });\n });\n }\n // add listeners to the grid columns\n this.refreshListenersToColumnsForCellComps();\n // if the grid columns change, then refresh the listeners again\n this.addManagedListener(this.eventService, Events.EVENT_GRID_COLUMNS_CHANGED, this.refreshListenersToColumnsForCellComps.bind(this));\n this.addDestroyFunc(this.removeGridColumnListeners.bind(this));\n };\n // executes all functions in destroyFuncsForColumnListeners and then clears the list\n RowRenderer.prototype.removeGridColumnListeners = function () {\n this.destroyFuncsForColumnListeners.forEach(function (func) { return func(); });\n this.destroyFuncsForColumnListeners.length = 0;\n };\n // this function adds listeners onto all the grid columns, which are the column that we could have cellComps for.\n // when the grid columns change, we add listeners again. in an ideal design, each CellComp would just register to\n // the column it belongs to on creation, however this was a bottleneck with the number of cells, so do it here\n // once instead.\n RowRenderer.prototype.refreshListenersToColumnsForCellComps = function () {\n var _this = this;\n this.removeGridColumnListeners();\n var cols = this.columnController.getAllGridColumns();\n if (!cols) {\n return;\n }\n cols.forEach(function (col) {\n var forEachCellWithThisCol = function (callback) {\n _this.forEachCellComp(function (cellComp) {\n if (cellComp.getColumn() === col) {\n callback(cellComp);\n }\n });\n };\n var leftChangedListener = function () {\n forEachCellWithThisCol(function (cellComp) { return cellComp.onLeftChanged(); });\n };\n var widthChangedListener = function () {\n forEachCellWithThisCol(function (cellComp) { return cellComp.onWidthChanged(); });\n };\n var firstRightPinnedChangedListener = function () {\n forEachCellWithThisCol(function (cellComp) { return cellComp.onFirstRightPinnedChanged(); });\n };\n var lastLeftPinnedChangedListener = function () {\n forEachCellWithThisCol(function (cellComp) { return cellComp.onLastLeftPinnedChanged(); });\n };\n col.addEventListener(Column.EVENT_LEFT_CHANGED, leftChangedListener);\n col.addEventListener(Column.EVENT_WIDTH_CHANGED, widthChangedListener);\n col.addEventListener(Column.EVENT_FIRST_RIGHT_PINNED_CHANGED, firstRightPinnedChangedListener);\n col.addEventListener(Column.EVENT_LAST_LEFT_PINNED_CHANGED, lastLeftPinnedChangedListener);\n _this.destroyFuncsForColumnListeners.push(function () {\n col.removeEventListener(Column.EVENT_LEFT_CHANGED, leftChangedListener);\n col.removeEventListener(Column.EVENT_WIDTH_CHANGED, widthChangedListener);\n col.removeEventListener(Column.EVENT_FIRST_RIGHT_PINNED_CHANGED, firstRightPinnedChangedListener);\n col.removeEventListener(Column.EVENT_LAST_LEFT_PINNED_CHANGED, lastLeftPinnedChangedListener);\n });\n });\n };\n RowRenderer.prototype.onDomLayoutChanged = function () {\n var printLayout = this.gridOptionsWrapper.getDomLayout() === Constants.DOM_LAYOUT_PRINT;\n var embedFullWidthRows = printLayout || this.gridOptionsWrapper.isEmbedFullWidthRows();\n // if moving towards or away from print layout, means we need to destroy all rows, as rows are not laid\n // out using absolute positioning when doing print layout\n var destroyRows = embedFullWidthRows !== this.embedFullWidthRows || this.printLayout !== printLayout;\n this.printLayout = printLayout;\n this.embedFullWidthRows = embedFullWidthRows;\n if (destroyRows) {\n this.redrawAfterModelUpdate();\n }\n };\n // for row models that have datasources, when we update the datasource, we need to force the rowRenderer\n // to redraw all rows. otherwise the old rows from the old datasource will stay displayed.\n RowRenderer.prototype.datasourceChanged = function () {\n this.firstRenderedRow = 0;\n this.lastRenderedRow = -1;\n var rowIndexesToRemove = Object.keys(this.rowCompsByIndex);\n this.removeRowComps(rowIndexesToRemove);\n };\n RowRenderer.prototype.onPageLoaded = function (refreshEvent) {\n if (missing(refreshEvent)) {\n refreshEvent = {\n type: Events.EVENT_MODEL_UPDATED,\n api: this.gridApi,\n columnApi: this.columnApi,\n animate: false,\n keepRenderedRows: false,\n newData: false,\n newPage: false\n };\n }\n this.onModelUpdated(refreshEvent);\n };\n RowRenderer.prototype.getAllCellsForColumn = function (column) {\n var eCells = [];\n function callback(key, rowComp) {\n var eCell = rowComp.getCellForCol(column);\n if (eCell) {\n eCells.push(eCell);\n }\n }\n iterateObject(this.rowCompsByIndex, callback);\n iterateObject(this.floatingBottomRowComps, callback);\n iterateObject(this.floatingTopRowComps, callback);\n return eCells;\n };\n RowRenderer.prototype.refreshFloatingRowComps = function () {\n this.refreshFloatingRows(this.floatingTopRowComps, this.pinnedRowModel.getPinnedTopRowData(), this.rowContainers.floatingTopPinnedLeft, this.rowContainers.floatingTopPinnedRight, this.rowContainers.floatingTop, this.rowContainers.floatingTopFullWidth);\n this.refreshFloatingRows(this.floatingBottomRowComps, this.pinnedRowModel.getPinnedBottomRowData(), this.rowContainers.floatingBottomPinnedLeft, this.rowContainers.floatingBottomPinnedRight, this.rowContainers.floatingBottom, this.rowContainers.floatingBottomFullWidth);\n };\n RowRenderer.prototype.refreshFloatingRows = function (rowComps, rowNodes, pinnedLeftContainerComp, pinnedRightContainerComp, bodyContainerComp, fullWidthContainerComp) {\n var _this = this;\n rowComps.forEach(function (row) {\n row.destroy();\n });\n rowComps.length = 0;\n if (rowNodes) {\n rowNodes.forEach(function (node) {\n var rowComp = new RowComp(_this.$scope, bodyContainerComp, pinnedLeftContainerComp, pinnedRightContainerComp, fullWidthContainerComp, node, _this.beans, false, false, _this.printLayout, _this.embedFullWidthRows);\n rowComp.init();\n rowComps.push(rowComp);\n });\n }\n this.flushContainers(rowComps);\n };\n RowRenderer.prototype.onPinnedRowDataChanged = function () {\n // recycling rows in order to ensure cell editing is not cancelled\n var params = {\n recycleRows: true\n };\n this.redrawAfterModelUpdate(params);\n };\n RowRenderer.prototype.onModelUpdated = function (refreshEvent) {\n var params = {\n recycleRows: refreshEvent.keepRenderedRows,\n animate: refreshEvent.animate,\n newData: refreshEvent.newData,\n newPage: refreshEvent.newPage,\n // because this is a model updated event (not pinned rows), we\n // can skip updating the pinned rows. this is needed so that if user\n // is doing transaction updates, the pinned rows are not getting constantly\n // trashed - or editing cells in pinned rows are not refreshed and put into read mode\n onlyBody: true\n };\n this.redrawAfterModelUpdate(params);\n };\n // if the row nodes are not rendered, no index is returned\n RowRenderer.prototype.getRenderedIndexesForRowNodes = function (rowNodes) {\n var result = [];\n if (missing(rowNodes)) {\n return result;\n }\n iterateObject(this.rowCompsByIndex, function (index, renderedRow) {\n var rowNode = renderedRow.getRowNode();\n if (rowNodes.indexOf(rowNode) >= 0) {\n result.push(index);\n }\n });\n return result;\n };\n RowRenderer.prototype.redrawRows = function (rowNodes) {\n if (!rowNodes || rowNodes.length == 0) {\n return;\n }\n var indexesToRemove = this.getRenderedIndexesForRowNodes(rowNodes);\n // remove the rows\n this.removeRowComps(indexesToRemove);\n // add draw them again\n this.redrawAfterModelUpdate({\n recycleRows: true\n });\n };\n RowRenderer.prototype.getCellToRestoreFocusToAfterRefresh = function (params) {\n var focusedCell = params.suppressKeepFocus ? null : this.focusController.getFocusCellToUseAfterRefresh();\n if (missing(focusedCell)) {\n return null;\n }\n // if the dom is not actually focused on a cell, then we don't try to refocus. the problem this\n // solves is with editing - if the user is editing, eg focus is on a text field, and not on the\n // cell itself, then the cell can be registered as having focus, however it's the text field that\n // has the focus and not the cell div. therefore, when the refresh is finished, the grid will focus\n // the cell, and not the textfield. that means if the user is in a text field, and the grid refreshes,\n // the focus is lost from the text field. we do not want this.\n var activeElement = document.activeElement;\n var domData = this.gridOptionsWrapper.getDomData(activeElement, CellComp.DOM_DATA_KEY_CELL_COMP);\n var elementIsNotACellDev = missing(domData);\n return elementIsNotACellDev ? null : focusedCell;\n };\n // gets called after changes to the model.\n RowRenderer.prototype.redrawAfterModelUpdate = function (params) {\n if (params === void 0) { params = {}; }\n this.getLockOnRefresh();\n var focusedCell = this.getCellToRestoreFocusToAfterRefresh(params);\n this.sizeContainerToPageHeight();\n this.scrollToTopIfNewData(params);\n // never recycle rows when print layout, we draw each row again from scratch. this is because print layout\n // uses normal dom layout to put cells into dom - it doesn't allow reordering rows.\n var recycleRows = !this.printLayout && !!params.recycleRows;\n var animate = params.animate && this.gridOptionsWrapper.isAnimateRows();\n var rowsToRecycle = this.binRowComps(recycleRows);\n var isFocusedCellGettingRecycled = function () {\n if (focusedCell == null || rowsToRecycle == null) {\n return false;\n }\n var res = false;\n iterateObject(rowsToRecycle, function (key, rowComp) {\n var rowNode = rowComp.getRowNode();\n var rowIndexEqual = rowNode.rowIndex == focusedCell.rowIndex;\n var pinnedEqual = rowNode.rowPinned == focusedCell.rowPinned;\n if (rowIndexEqual && pinnedEqual) {\n res = true;\n }\n });\n return res;\n };\n var focusedCellRecycled = isFocusedCellGettingRecycled();\n this.redraw(rowsToRecycle, animate);\n if (!params.onlyBody) {\n this.refreshFloatingRowComps();\n }\n // if we focus a cell that's already focused, then we get an unnecessary 'cellFocused' event fired.\n // this was happening when user clicked 'expand' on a rowGroup, then cellFocused was getting fired twice.\n if (!focusedCellRecycled) {\n this.restoreFocusedCell(focusedCell);\n }\n this.releaseLockOnRefresh();\n };\n RowRenderer.prototype.scrollToTopIfNewData = function (params) {\n var scrollToTop = params.newData || params.newPage;\n var suppressScrollToTop = this.gridOptionsWrapper.isSuppressScrollOnNewData();\n if (scrollToTop && !suppressScrollToTop) {\n this.gridPanel.scrollToTop();\n }\n };\n RowRenderer.prototype.sizeContainerToPageHeight = function () {\n var containers = [\n this.rowContainers.body,\n this.rowContainers.fullWidth,\n this.rowContainers.pinnedLeft,\n this.rowContainers.pinnedRight\n ];\n if (this.printLayout) {\n containers.forEach(function (container) { return container.setHeight(null); });\n return;\n }\n var containerHeight = this.paginationProxy.getCurrentPageHeight();\n // we need at least 1 pixel for the horizontal scroll to work. so if there are now rows,\n // we still want the scroll to be present, otherwise there would be no way to scroll the header\n // which might be needed us user wants to access columns\n // on the RHS - and if that was where the filter was that cause no rows to be presented, there\n // is no way to remove the filter.\n if (containerHeight === 0) {\n containerHeight = 1;\n }\n this.maxDivHeightScaler.setModelHeight(containerHeight);\n var realHeight = this.maxDivHeightScaler.getUiContainerHeight();\n containers.forEach(function (container) { return container.setHeight(realHeight); });\n };\n RowRenderer.prototype.getLockOnRefresh = function () {\n if (this.refreshInProgress) {\n throw new Error(\"AG Grid: cannot get grid to draw rows when it is in the middle of drawing rows. \" +\n \"Your code probably called a grid API method while the grid was in the render stage. To overcome \" +\n \"this, put the API call into a timeout, e.g. instead of api.refreshView(), \" +\n \"call setTimeout(function() { api.refreshView(); }, 0). To see what part of your code \" +\n \"that caused the refresh check this stacktrace.\");\n }\n this.refreshInProgress = true;\n };\n RowRenderer.prototype.releaseLockOnRefresh = function () {\n this.refreshInProgress = false;\n };\n // sets the focus to the provided cell, if the cell is provided. this way, the user can call refresh without\n // worry about the focus been lost. this is important when the user is using keyboard navigation to do edits\n // and the cellEditor is calling 'refresh' to get other cells to update (as other cells might depend on the\n // edited cell).\n RowRenderer.prototype.restoreFocusedCell = function (cellPosition) {\n if (cellPosition) {\n this.focusController.setFocusedCell(cellPosition.rowIndex, cellPosition.column, cellPosition.rowPinned, true);\n }\n };\n RowRenderer.prototype.stopEditing = function (cancel) {\n if (cancel === void 0) { cancel = false; }\n this.forEachRowComp(function (key, rowComp) {\n rowComp.stopEditing(cancel);\n });\n };\n RowRenderer.prototype.forEachCellComp = function (callback) {\n this.forEachRowComp(function (key, rowComp) { return rowComp.forEachCellComp(callback); });\n };\n RowRenderer.prototype.forEachRowComp = function (callback) {\n iterateObject(this.rowCompsByIndex, callback);\n iterateObject(this.floatingTopRowComps, callback);\n iterateObject(this.floatingBottomRowComps, callback);\n };\n RowRenderer.prototype.addRenderedRowListener = function (eventName, rowIndex, callback) {\n var rowComp = this.rowCompsByIndex[rowIndex];\n if (rowComp) {\n rowComp.addEventListener(eventName, callback);\n }\n };\n RowRenderer.prototype.flashCells = function (params) {\n if (params === void 0) { params = {}; }\n var flashDelay = params.flashDelay, fadeDelay = params.fadeDelay;\n this.forEachCellCompFiltered(params.rowNodes, params.columns, function (cellComp) { return cellComp.flashCell({ flashDelay: flashDelay, fadeDelay: fadeDelay }); });\n };\n RowRenderer.prototype.refreshCells = function (params) {\n if (params === void 0) { params = {}; }\n var refreshCellParams = {\n forceRefresh: params.force,\n newData: false,\n suppressFlash: params.suppressFlash\n };\n this.forEachCellCompFiltered(params.rowNodes, params.columns, function (cellComp) {\n if (cellComp.refreshShouldDestroy()) {\n var rowComp = cellComp.getRenderedRow();\n if (rowComp) {\n rowComp.refreshCell(cellComp);\n }\n }\n else {\n cellComp.refreshCell(refreshCellParams);\n }\n });\n };\n RowRenderer.prototype.getCellRendererInstances = function (params) {\n var res = [];\n this.forEachCellCompFiltered(params.rowNodes, params.columns, function (cellComp) {\n var cellRenderer = cellComp.getCellRenderer();\n if (cellRenderer) {\n res.push(cellRenderer);\n }\n });\n return res;\n };\n RowRenderer.prototype.getCellEditorInstances = function (params) {\n var res = [];\n this.forEachCellCompFiltered(params.rowNodes, params.columns, function (cellComp) {\n var cellEditor = cellComp.getCellEditor();\n if (cellEditor) {\n res.push(cellEditor);\n }\n });\n return res;\n };\n RowRenderer.prototype.getEditingCells = function () {\n var res = [];\n this.forEachCellComp(function (cellComp) {\n if (cellComp.isEditing()) {\n var cellPosition = cellComp.getCellPosition();\n res.push(cellPosition);\n }\n });\n return res;\n };\n // calls the callback for each cellComp that match the provided rowNodes and columns. eg if one row node\n // and two columns provided, that identifies 4 cells, so callback gets called 4 times, once for each cell.\n RowRenderer.prototype.forEachCellCompFiltered = function (rowNodes, columns, callback) {\n var _this = this;\n var rowIdsMap;\n if (exists(rowNodes)) {\n rowIdsMap = {\n top: {},\n bottom: {},\n normal: {}\n };\n rowNodes.forEach(function (rowNode) {\n var id = rowNode.id;\n if (rowNode.rowPinned === Constants.PINNED_TOP) {\n rowIdsMap.top[id] = true;\n }\n else if (rowNode.rowPinned === Constants.PINNED_BOTTOM) {\n rowIdsMap.bottom[id] = true;\n }\n else {\n rowIdsMap.normal[id] = true;\n }\n });\n }\n var colIdsMap;\n if (exists(columns)) {\n colIdsMap = {};\n columns.forEach(function (colKey) {\n var column = _this.columnController.getGridColumn(colKey);\n if (exists(column)) {\n colIdsMap[column.getId()] = true;\n }\n });\n }\n var processRow = function (rowComp) {\n var rowNode = rowComp.getRowNode();\n var id = rowNode.id;\n var floating = rowNode.rowPinned;\n // skip this row if it is missing from the provided list\n if (exists(rowIdsMap)) {\n if (floating === Constants.PINNED_BOTTOM) {\n if (!rowIdsMap.bottom[id]) {\n return;\n }\n }\n else if (floating === Constants.PINNED_TOP) {\n if (!rowIdsMap.top[id]) {\n return;\n }\n }\n else {\n if (!rowIdsMap.normal[id]) {\n return;\n }\n }\n }\n rowComp.forEachCellComp(function (cellComp) {\n var colId = cellComp.getColumn().getId();\n var excludeColFromRefresh = colIdsMap && !colIdsMap[colId];\n if (excludeColFromRefresh) {\n return;\n }\n if (callback) {\n callback(cellComp);\n }\n });\n };\n iterateObject(this.rowCompsByIndex, function (index, rowComp) {\n processRow(rowComp);\n });\n if (this.floatingTopRowComps) {\n this.floatingTopRowComps.forEach(processRow);\n }\n if (this.floatingBottomRowComps) {\n this.floatingBottomRowComps.forEach(processRow);\n }\n };\n RowRenderer.prototype.destroy = function () {\n var rowIndexesToRemove = Object.keys(this.rowCompsByIndex);\n this.removeRowComps(rowIndexesToRemove);\n _super.prototype.destroy.call(this);\n };\n RowRenderer.prototype.binRowComps = function (recycleRows) {\n var _this = this;\n var rowsToRecycle = {};\n var indexesToRemove;\n if (recycleRows) {\n indexesToRemove = [];\n iterateObject(this.rowCompsByIndex, function (index, rowComp) {\n var rowNode = rowComp.getRowNode();\n if (exists(rowNode.id)) {\n rowsToRecycle[rowNode.id] = rowComp;\n delete _this.rowCompsByIndex[index];\n }\n else {\n indexesToRemove.push(index);\n }\n });\n }\n else {\n indexesToRemove = Object.keys(this.rowCompsByIndex);\n }\n this.removeRowComps(indexesToRemove);\n return rowsToRecycle;\n };\n // takes array of row indexes\n RowRenderer.prototype.removeRowComps = function (rowsToRemove) {\n var _this = this;\n // if no fromIndex then set to -1, which will refresh everything\n // let realFromIndex = -1;\n rowsToRemove.forEach(function (indexToRemove) {\n var renderedRow = _this.rowCompsByIndex[indexToRemove];\n if (renderedRow) {\n renderedRow.destroy();\n }\n delete _this.rowCompsByIndex[indexToRemove];\n });\n };\n // gets called when rows don't change, but viewport does, so after:\n // 1) height of grid body changes, ie number of displayed rows has changed\n // 2) grid scrolled to new position\n // 3) ensure index visible (which is a scroll)\n RowRenderer.prototype.redrawAfterScroll = function () {\n this.getLockOnRefresh();\n this.redraw(null, false, true);\n this.releaseLockOnRefresh();\n };\n RowRenderer.prototype.removeRowCompsNotToDraw = function (indexesToDraw) {\n // for speedy lookup, dump into map\n var indexesToDrawMap = {};\n indexesToDraw.forEach(function (index) { return (indexesToDrawMap[index] = true); });\n var existingIndexes = Object.keys(this.rowCompsByIndex);\n var indexesNotToDraw = existingIndexes.filter(function (index) { return !indexesToDrawMap[index]; });\n this.removeRowComps(indexesNotToDraw);\n };\n RowRenderer.prototype.calculateIndexesToDraw = function (rowsToRecycle) {\n var _this = this;\n // all in all indexes in the viewport\n var indexesToDraw = createArrayOfNumbers(this.firstRenderedRow, this.lastRenderedRow);\n var checkRowToDraw = function (indexStr, rowComp) {\n var index = rowComp.getRowNode().rowIndex;\n if (index == null) {\n return;\n }\n if (index < _this.firstRenderedRow || index > _this.lastRenderedRow) {\n if (_this.doNotUnVirtualiseRow(rowComp)) {\n indexesToDraw.push(index);\n }\n }\n };\n // if we are redrawing due to scrolling change, then old rows are in this.rowCompsByIndex\n iterateObject(this.rowCompsByIndex, checkRowToDraw);\n // if we are redrawing due to model update, then old rows are in rowsToRecycle\n iterateObject(rowsToRecycle, checkRowToDraw);\n indexesToDraw.sort(function (a, b) { return a - b; });\n return indexesToDraw;\n };\n RowRenderer.prototype.redraw = function (rowsToRecycle, animate, afterScroll) {\n var _this = this;\n if (animate === void 0) { animate = false; }\n if (afterScroll === void 0) { afterScroll = false; }\n this.maxDivHeightScaler.updateOffset();\n this.workOutFirstAndLastRowsToRender();\n // the row can already exist and be in the following:\n // rowsToRecycle -> if model change, then the index may be different, however row may\n // exist here from previous time (mapped by id).\n // this.rowCompsByIndex -> if just a scroll, then this will contain what is currently in the viewport\n // this is all the indexes we want, including those that already exist, so this method\n // will end up going through each index and drawing only if the row doesn't already exist\n var indexesToDraw = this.calculateIndexesToDraw(rowsToRecycle);\n this.removeRowCompsNotToDraw(indexesToDraw);\n // never animate when doing print layout - as we want to get things ready to print as quickly as possible,\n // otherwise we risk the printer printing a row that's half faded (half way through fading in)\n if (this.printLayout) {\n animate = false;\n }\n // add in new rows\n var nextVmTurnFunctions = [];\n var rowComps = [];\n indexesToDraw.forEach(function (rowIndex) {\n var rowComp = _this.createOrUpdateRowComp(rowIndex, rowsToRecycle, animate, afterScroll);\n if (exists(rowComp)) {\n rowComps.push(rowComp);\n pushAll(nextVmTurnFunctions, rowComp.getAndClearNextVMTurnFunctions());\n }\n });\n this.flushContainers(rowComps);\n executeNextVMTurn(nextVmTurnFunctions);\n var useAnimationFrame = afterScroll && !this.gridOptionsWrapper.isSuppressAnimationFrame() && !this.printLayout;\n if (useAnimationFrame) {\n this.beans.taskQueue.addDestroyTask(this.destroyRowComps.bind(this, rowsToRecycle, animate));\n }\n else {\n this.destroyRowComps(rowsToRecycle, animate);\n }\n this.checkAngularCompile();\n this.gridPanel.updateRowCount();\n };\n RowRenderer.prototype.flushContainers = function (rowComps) {\n iterateObject(this.rowContainers, function (key, rowContainerComp) {\n if (rowContainerComp) {\n rowContainerComp.flushRowTemplates();\n }\n });\n rowComps.forEach(function (rowComp) { return rowComp.afterFlush(); });\n };\n RowRenderer.prototype.onDisplayedColumnsChanged = function () {\n var pinningLeft = this.columnController.isPinningLeft();\n var pinningRight = this.columnController.isPinningRight();\n var atLeastOneChanged = this.pinningLeft !== pinningLeft || pinningRight !== this.pinningRight;\n if (atLeastOneChanged) {\n this.pinningLeft = pinningLeft;\n this.pinningRight = pinningRight;\n if (this.embedFullWidthRows) {\n this.redrawFullWidthEmbeddedRows();\n }\n }\n };\n // when embedding, what gets showed in each section depends on what is pinned. eg if embedding group expand / collapse,\n // then it should go into the pinned left area if pinning left, or the center area if not pinning.\n RowRenderer.prototype.redrawFullWidthEmbeddedRows = function () {\n // if either of the pinned panels has shown / hidden, then need to redraw the fullWidth bits when\n // embedded, as what appears in each section depends on whether we are pinned or not\n var rowsToRemove = [];\n iterateObject(this.rowCompsByIndex, function (id, rowComp) {\n if (rowComp.isFullWidth()) {\n var rowIndex = rowComp.getRowNode().rowIndex;\n rowsToRemove.push(rowIndex.toString());\n }\n });\n this.refreshFloatingRowComps();\n this.removeRowComps(rowsToRemove);\n this.redrawAfterScroll();\n };\n RowRenderer.prototype.refreshFullWidthRows = function (rowNodesToRefresh) {\n var rowsToRemove = [];\n var selectivelyRefreshing = !!rowNodesToRefresh;\n var idsToRefresh = selectivelyRefreshing ? {} : undefined;\n if (selectivelyRefreshing && idsToRefresh) {\n rowNodesToRefresh.forEach(function (r) { return idsToRefresh[r.id] = true; });\n }\n iterateObject(this.rowCompsByIndex, function (id, rowComp) {\n if (!rowComp.isFullWidth()) {\n return;\n }\n var rowNode = rowComp.getRowNode();\n if (selectivelyRefreshing && idsToRefresh) {\n // we refresh if a) this node is present or b) this parents nodes is present. checking parent\n // node is important for master/detail, as we want detail to refresh on changes to parent node.\n // it's also possible, if user is provider their own fullWidth, that details panels contain\n // some info on the parent, eg if in tree data and child row shows some data from parent row also.\n var parentId = (rowNode.level > 0 && rowNode.parent) ? rowNode.parent.id : undefined;\n var skipThisNode = !idsToRefresh[rowNode.id] && !idsToRefresh[parentId];\n if (skipThisNode) {\n return;\n }\n }\n var fullWidthRowsRefreshed = rowComp.refreshFullWidth();\n if (!fullWidthRowsRefreshed) {\n var rowIndex = rowComp.getRowNode().rowIndex;\n rowsToRemove.push(rowIndex.toString());\n }\n });\n this.removeRowComps(rowsToRemove);\n this.redrawAfterScroll();\n };\n RowRenderer.prototype.createOrUpdateRowComp = function (rowIndex, rowsToRecycle, animate, afterScroll) {\n var rowNode = null;\n var rowComp = this.rowCompsByIndex[rowIndex];\n // if no row comp, see if we can get it from the previous rowComps\n if (!rowComp) {\n rowNode = this.paginationProxy.getRow(rowIndex);\n if (exists(rowNode) && exists(rowsToRecycle) && rowsToRecycle[rowNode.id] && rowNode.alreadyRendered) {\n rowComp = rowsToRecycle[rowNode.id];\n rowsToRecycle[rowNode.id] = null;\n }\n }\n var creatingNewRowComp = !rowComp;\n if (creatingNewRowComp) {\n // create a new one\n if (!rowNode) {\n rowNode = this.paginationProxy.getRow(rowIndex);\n }\n if (exists(rowNode)) {\n rowComp = this.createRowComp(rowNode, animate, afterScroll);\n }\n else {\n // this should never happen - if somehow we are trying to create\n // a row for a rowNode that does not exist.\n return;\n }\n }\n else if (rowComp) {\n // ensure row comp is in right position in DOM\n rowComp.ensureDomOrder();\n }\n if (rowNode) {\n // set node as 'alreadyRendered' to ensure we only recycle rowComps that have been rendered, this ensures\n // we don't reuse rowComps that have been removed and then re-added in the same batch transaction.\n rowNode.alreadyRendered = true;\n }\n this.rowCompsByIndex[rowIndex] = rowComp;\n return rowComp;\n };\n RowRenderer.prototype.destroyRowComps = function (rowCompsMap, animate) {\n var delayedFuncs = [];\n iterateObject(rowCompsMap, function (nodeId, rowComp) {\n // if row was used, then it's null\n if (!rowComp) {\n return;\n }\n rowComp.destroy(animate);\n pushAll(delayedFuncs, rowComp.getAndClearDelayedDestroyFunctions());\n });\n executeInAWhile(delayedFuncs);\n };\n RowRenderer.prototype.checkAngularCompile = function () {\n var _this = this;\n // if we are doing angular compiling, then do digest the scope here\n if (this.gridOptionsWrapper.isAngularCompileRows()) {\n // we do it in a timeout, in case we are already in an apply\n window.setTimeout(function () {\n _this.$scope.$apply();\n }, 0);\n }\n };\n RowRenderer.prototype.workOutFirstAndLastRowsToRender = function () {\n var _this = this;\n var newFirst;\n var newLast;\n if (!this.paginationProxy.isRowsToRender()) {\n newFirst = 0;\n newLast = -1; // setting to -1 means nothing in range\n }\n else if (this.printLayout) {\n newFirst = this.paginationProxy.getPageFirstRow();\n newLast = this.paginationProxy.getPageLastRow();\n }\n else {\n var paginationOffset = this.paginationProxy.getPixelOffset();\n var _a = this.paginationProxy.getCurrentPagePixelRange(), pageFirstPixel = _a.pageFirstPixel, pageLastPixel = _a.pageLastPixel;\n var maxDivHeightScaler = this.maxDivHeightScaler.getOffset();\n var bodyVRange = this.gridPanel.getVScrollPosition();\n var bodyTopPixel = bodyVRange.top;\n var bodyBottomPixel = bodyVRange.bottom;\n var bufferPixels = this.gridOptionsWrapper.getRowBufferInPixels();\n var firstPixel = Math.max(bodyTopPixel + paginationOffset - bufferPixels, pageFirstPixel) + maxDivHeightScaler;\n var lastPixel = Math.min(bodyBottomPixel + paginationOffset + bufferPixels, pageLastPixel) + maxDivHeightScaler;\n this.ensureAllRowsInRangeHaveHeightsCalculated(firstPixel, lastPixel);\n var firstRowIndex = this.paginationProxy.getRowIndexAtPixel(firstPixel);\n var lastRowIndex = this.paginationProxy.getRowIndexAtPixel(lastPixel);\n var pageFirstRow = this.paginationProxy.getPageFirstRow();\n var pageLastRow = this.paginationProxy.getPageLastRow();\n // adjust, in case buffer extended actual size\n if (firstRowIndex < pageFirstRow) {\n firstRowIndex = pageFirstRow;\n }\n if (lastRowIndex > pageLastRow) {\n lastRowIndex = pageLastRow;\n }\n newFirst = firstRowIndex;\n newLast = lastRowIndex;\n }\n // sometimes user doesn't set CSS right and ends up with grid with no height and grid ends up\n // trying to render all the rows, eg 10,000+ rows. this will kill the browser. so instead of\n // killing the browser, we limit the number of rows. just in case some use case we didn't think\n // of, we also have a property to not do this operation.\n var rowLayoutNormal = this.gridOptionsWrapper.getDomLayout() === Constants.DOM_LAYOUT_NORMAL;\n var suppressRowCountRestriction = this.gridOptionsWrapper.isSuppressMaxRenderedRowRestriction();\n var rowBufferMaxSize = Math.max(this.gridOptionsWrapper.getRowBuffer(), 500);\n if (rowLayoutNormal && !suppressRowCountRestriction) {\n if (newLast - newFirst > rowBufferMaxSize) {\n newLast = newFirst + rowBufferMaxSize;\n }\n }\n var firstDiffers = newFirst !== this.firstRenderedRow;\n var lastDiffers = newLast !== this.lastRenderedRow;\n if (firstDiffers || lastDiffers) {\n this.firstRenderedRow = newFirst;\n this.lastRenderedRow = newLast;\n var event_1 = {\n type: Events.EVENT_VIEWPORT_CHANGED,\n firstRow: newFirst,\n lastRow: newLast,\n api: this.gridApi,\n columnApi: this.columnApi\n };\n this.eventService.dispatchEvent(event_1);\n }\n // only dispatch firstDataRendered if we have actually rendered some data\n if (this.paginationProxy.isRowsToRender()) {\n var event_2 = {\n type: Events.EVENT_FIRST_DATA_RENDERED,\n firstRow: newFirst,\n lastRow: newLast,\n api: this.gridApi,\n columnApi: this.columnApi\n };\n // added a small delay here because in some scenarios this can be fired\n // before the grid is actually rendered, causing component creation\n // on EVENT_FIRST_DATA_RENDERED to fail.\n window.setTimeout(function () { return _this.eventService.dispatchEventOnce(event_2); }, 50);\n }\n };\n RowRenderer.prototype.ensureAllRowsInRangeHaveHeightsCalculated = function (topPixel, bottomPixel) {\n // ensureRowHeightsVisible only works with CSRM, as it's the only row model that allows lazy row height calcs.\n // all the other row models just hard code so the method just returns back false\n var rowHeightsChanged = this.paginationProxy.ensureRowHeightsValid(topPixel, bottomPixel, -1, -1);\n if (rowHeightsChanged) {\n // if row heights have changed, we need to resize the containers the rows sit it\n this.sizeContainerToPageHeight();\n // we also need to update heightScaler as this has dependency of row container height\n this.maxDivHeightScaler.updateOffset();\n }\n };\n RowRenderer.prototype.getFirstVirtualRenderedRow = function () {\n return this.firstRenderedRow;\n };\n RowRenderer.prototype.getLastVirtualRenderedRow = function () {\n return this.lastRenderedRow;\n };\n // check that none of the rows to remove are editing or focused as:\n // a) if editing, we want to keep them, otherwise the user will loose the context of the edit,\n // eg user starts editing, enters some text, then scrolls down and then up, next time row rendered\n // the edit is reset - so we want to keep it rendered.\n // b) if focused, we want ot keep keyboard focus, so if user ctrl+c, it goes to clipboard,\n // otherwise the user can range select and drag (with focus cell going out of the viewport)\n // and then ctrl+c, nothing will happen if cell is removed from dom.\n // c) if detail record of master detail, as users complained that the context of detail rows\n // was getting lost when detail row out of view. eg user expands to show detail row,\n // then manipulates the detail panel (eg sorts the detail grid), then context is lost\n // after detail panel is scrolled out of / into view.\n RowRenderer.prototype.doNotUnVirtualiseRow = function (rowComp) {\n var REMOVE_ROW = false;\n var KEEP_ROW = true;\n var rowNode = rowComp.getRowNode();\n var rowHasFocus = this.focusController.isRowNodeFocused(rowNode);\n var rowIsEditing = rowComp.isEditing();\n var rowIsDetail = rowNode.detail;\n var mightWantToKeepRow = rowHasFocus || rowIsEditing || rowIsDetail;\n // if we deffo don't want to keep it,\n if (!mightWantToKeepRow) {\n return REMOVE_ROW;\n }\n // editing row, only remove if it is no longer rendered, eg filtered out or new data set.\n // the reason we want to keep is if user is scrolling up and down, we don't want to loose\n // the context of the editing in process.\n var rowNodePresent = this.paginationProxy.isRowPresent(rowNode);\n return rowNodePresent ? KEEP_ROW : REMOVE_ROW;\n };\n RowRenderer.prototype.createRowComp = function (rowNode, animate, afterScroll) {\n var suppressAnimationFrame = this.gridOptionsWrapper.isSuppressAnimationFrame();\n // we don't use animations frames for printing, so the user can put the grid into print mode\n // and immediately print - otherwise the user would have to wait for the rows to draw in the background\n // (via the animation frames) which is awkward to do from code.\n // we only do the animation frames after scrolling, as this is where we want the smooth user experience.\n // having animation frames for other times makes the grid look 'jumpy'.\n var useAnimationFrameForCreate = afterScroll && !suppressAnimationFrame && !this.printLayout;\n var rowComp = new RowComp(this.$scope, this.rowContainers.body, this.rowContainers.pinnedLeft, this.rowContainers.pinnedRight, this.rowContainers.fullWidth, rowNode, this.beans, animate, useAnimationFrameForCreate, this.printLayout, this.embedFullWidthRows);\n rowComp.init();\n return rowComp;\n };\n RowRenderer.prototype.getRenderedNodes = function () {\n var renderedRows = this.rowCompsByIndex;\n return Object.keys(renderedRows).map(function (key) { return renderedRows[key].getRowNode(); });\n };\n // we use index for rows, but column object for columns, as the next column (by index) might not\n // be visible (header grouping) so it's not reliable, so using the column object instead.\n RowRenderer.prototype.navigateToNextCell = function (event, key, currentCell, allowUserOverride) {\n // we keep searching for a next cell until we find one. this is how the group rows get skipped\n var nextCell = currentCell;\n var hitEdgeOfGrid = false;\n while (nextCell && (nextCell === currentCell || !this.isValidNavigateCell(nextCell))) {\n // if the current cell is spanning across multiple columns, we need to move\n // our current position to be the last cell on the right before finding the\n // the next target.\n if (this.gridOptionsWrapper.isEnableRtl()) {\n if (key === KeyCode.LEFT) {\n nextCell = this.getLastCellOfColSpan(nextCell);\n }\n }\n else if (key === KeyCode.RIGHT) {\n nextCell = this.getLastCellOfColSpan(nextCell);\n }\n nextCell = this.cellNavigationService.getNextCellToFocus(key, nextCell);\n // eg if going down, and nextCell=undefined, means we are gone past the last row\n hitEdgeOfGrid = missing(nextCell);\n }\n if (hitEdgeOfGrid && event && event.keyCode === KeyCode.UP) {\n nextCell = {\n rowIndex: -1,\n rowPinned: null,\n column: currentCell.column\n };\n }\n // allow user to override what cell to go to next. when doing normal cell navigation (with keys)\n // we allow this, however if processing 'enter after edit' we don't allow override\n if (allowUserOverride) {\n var userFunc = this.gridOptionsWrapper.getNavigateToNextCellFunc();\n if (exists(userFunc)) {\n var params = {\n key: key,\n previousCellPosition: currentCell,\n nextCellPosition: nextCell ? nextCell : null,\n event: event\n };\n var userCell = userFunc(params);\n if (exists(userCell)) {\n if (userCell.floating) {\n doOnce(function () { console.warn(\"AG Grid: tabToNextCellFunc return type should have attributes: rowIndex, rowPinned, column. However you had 'floating', maybe you meant 'rowPinned'?\"); }, 'no floating in userCell');\n userCell.rowPinned = userCell.floating;\n }\n nextCell = {\n rowPinned: userCell.rowPinned,\n rowIndex: userCell.rowIndex,\n column: userCell.column\n };\n }\n else {\n nextCell = null;\n }\n }\n }\n // no next cell means we have reached a grid boundary, eg left, right, top or bottom of grid\n if (!nextCell) {\n return;\n }\n if (nextCell.rowIndex < 0) {\n var headerLen = this.beans.headerNavigationService.getHeaderRowCount();\n this.focusController.focusHeaderPosition({ headerRowIndex: headerLen + (nextCell.rowIndex), column: currentCell.column });\n return;\n }\n // in case we have col spanning we get the cellComp and use it to get the \n // position. This was we always focus the first cell inside the spanning.\n var normalisedPosition = this.getNormalisedPosition(nextCell);\n if (normalisedPosition) {\n this.focusPosition(normalisedPosition);\n }\n else {\n this.tryToFocusFullWidthRow(nextCell);\n }\n };\n RowRenderer.prototype.getNormalisedPosition = function (cellPosition) {\n // ensureCellVisible first, to make sure cell at position is rendered.\n this.ensureCellVisible(cellPosition);\n var cellComp = this.getComponentForCell(cellPosition);\n // not guaranteed to have a cellComp when using the SSRM as blocks are loading.\n if (!cellComp) {\n return null;\n }\n cellPosition = cellComp.getCellPosition();\n // we call this again, as nextCell can be different to it's previous value due to Column Spanning\n // (ie if cursor moving from right to left, and cell is spanning columns, then nextCell was the\n // last column in the group, however now it's the first column in the group). if we didn't do\n // ensureCellVisible again, then we could only be showing the last portion (last column) of the\n // merged cells.\n this.ensureCellVisible(cellPosition);\n return cellPosition;\n };\n RowRenderer.prototype.tryToFocusFullWidthRow = function (position, backwards) {\n if (backwards === void 0) { backwards = false; }\n var displayedColumns = this.columnController.getAllDisplayedColumns();\n var rowComp = this.getRowCompByPosition(position);\n if (!rowComp || !rowComp.isFullWidth()) {\n return false;\n }\n var cellPosition = {\n rowIndex: position.rowIndex,\n rowPinned: position.rowPinned,\n column: position.column || (backwards ? last(displayedColumns) : displayedColumns[0])\n };\n this.focusPosition(cellPosition);\n return true;\n };\n RowRenderer.prototype.focusPosition = function (cellPosition) {\n this.focusController.setFocusedCell(cellPosition.rowIndex, cellPosition.column, cellPosition.rowPinned, true);\n if (this.rangeController) {\n this.rangeController.setRangeToCell(cellPosition);\n }\n };\n RowRenderer.prototype.isValidNavigateCell = function (cell) {\n var rowNode = this.rowPositionUtils.getRowNode(cell);\n // we do not allow focusing on detail rows and full width rows\n return !!rowNode;\n };\n RowRenderer.prototype.getLastCellOfColSpan = function (cell) {\n var cellComp = this.getComponentForCell(cell);\n if (!cellComp) {\n return cell;\n }\n var colSpanningList = cellComp.getColSpanningList();\n if (colSpanningList.length === 1) {\n return cell;\n }\n return {\n rowIndex: cell.rowIndex,\n column: last(colSpanningList),\n rowPinned: cell.rowPinned\n };\n };\n RowRenderer.prototype.ensureCellVisible = function (gridCell) {\n // this scrolls the row into view\n if (missing(gridCell.rowPinned)) {\n this.gridPanel.ensureIndexVisible(gridCell.rowIndex);\n }\n if (!gridCell.column.isPinned()) {\n this.gridPanel.ensureColumnVisible(gridCell.column);\n }\n // need to nudge the scrolls for the floating items. otherwise when we set focus on a non-visible\n // floating cell, the scrolls get out of sync\n this.gridPanel.horizontallyScrollHeaderCenterAndFloatingCenter();\n // need to flush frames, to make sure the correct cells are rendered\n this.animationFrameService.flushAllFrames();\n };\n RowRenderer.prototype.startEditingCell = function (gridCell, keyPress, charPress) {\n var cell = this.getComponentForCell(gridCell);\n if (cell) {\n cell.startRowOrCellEdit(keyPress, charPress);\n }\n };\n RowRenderer.prototype.getRowCompByPosition = function (rowPosition) {\n var rowComponent;\n switch (rowPosition.rowPinned) {\n case Constants.PINNED_TOP:\n rowComponent = this.floatingTopRowComps[rowPosition.rowIndex];\n break;\n case Constants.PINNED_BOTTOM:\n rowComponent = this.floatingBottomRowComps[rowPosition.rowIndex];\n break;\n default:\n rowComponent = this.rowCompsByIndex[rowPosition.rowIndex];\n break;\n }\n return rowComponent;\n };\n RowRenderer.prototype.getComponentForCell = function (cellPosition) {\n var rowComponent = this.getRowCompByPosition(cellPosition);\n if (!rowComponent) {\n return null;\n }\n var cellComponent = rowComponent.getRenderedCellForColumn(cellPosition.column);\n return cellComponent;\n };\n RowRenderer.prototype.getRowNode = function (gridRow) {\n switch (gridRow.rowPinned) {\n case Constants.PINNED_TOP:\n return this.pinnedRowModel.getPinnedTopRowData()[gridRow.rowIndex];\n case Constants.PINNED_BOTTOM:\n return this.pinnedRowModel.getPinnedBottomRowData()[gridRow.rowIndex];\n default:\n return this.rowModel.getRow(gridRow.rowIndex);\n }\n };\n RowRenderer.prototype.onTabKeyDown = function (previousRenderedCell, keyboardEvent) {\n var backwards = keyboardEvent.shiftKey;\n var success = this.moveToCellAfter(previousRenderedCell, backwards);\n if (success) {\n keyboardEvent.preventDefault();\n }\n else if (backwards) {\n var _a = previousRenderedCell.getRowPosition(), rowIndex = _a.rowIndex, rowPinned = _a.rowPinned;\n var firstRow = rowPinned ? rowIndex === 0 : rowIndex === this.paginationProxy.getPageFirstRow();\n if (firstRow) {\n keyboardEvent.preventDefault();\n var headerRowIndex = this.beans.headerNavigationService.getHeaderRowCount() - 1;\n var column = last(this.columnController.getAllDisplayedColumns());\n this.focusController.focusHeaderPosition({ headerRowIndex: headerRowIndex, column: column });\n }\n }\n else {\n // if the case it's a popup editor, the focus is on the editor and not the previous cell.\n // in order for the tab navigation to work, we need to focus the browser back onto the\n // previous cell.\n if (previousRenderedCell instanceof CellComp) {\n previousRenderedCell.focusCell(true);\n }\n if (this.focusController.focusNextGridCoreContainer(false)) {\n keyboardEvent.preventDefault();\n }\n }\n };\n RowRenderer.prototype.tabToNextCell = function (backwards) {\n var focusedCell = this.focusController.getFocusedCell();\n // if no focus, then cannot navigate\n if (missing(focusedCell)) {\n return false;\n }\n var renderedComp = this.getComponentForCell(focusedCell);\n // if cell is not rendered, means user has scrolled away from the cell\n // or that the focusedCell is a Full Width Row\n if (missing(renderedComp)) {\n renderedComp = this.getRowCompByPosition(focusedCell);\n if (!renderedComp || !renderedComp.isFullWidth()) {\n return false;\n }\n }\n return this.moveToCellAfter(renderedComp, backwards);\n };\n RowRenderer.prototype.moveToCellAfter = function (previousRenderedCell, backwards) {\n var editing = previousRenderedCell.isEditing();\n var res;\n if (editing) {\n // if we are editing, we know it's not a Full Width Row (RowComp)\n if (this.gridOptionsWrapper.isFullRowEdit()) {\n res = this.moveToNextEditingRow(previousRenderedCell, backwards);\n }\n else {\n res = this.moveToNextEditingCell(previousRenderedCell, backwards);\n }\n }\n else {\n res = this.moveToNextCellNotEditing(previousRenderedCell, backwards);\n }\n // if a cell wasn't found, it's possible that focus was moved to the header\n return res || !!this.focusController.getFocusedHeader();\n };\n RowRenderer.prototype.moveToNextEditingCell = function (previousRenderedCell, backwards) {\n var gridCell = previousRenderedCell.getCellPosition();\n // need to do this before getting next cell to edit, in case the next cell\n // has editable function (eg colDef.editable=func() ) and it depends on the\n // result of this cell, so need to save updates from the first edit, in case\n // the value is referenced in the function.\n previousRenderedCell.stopEditing();\n // find the next cell to start editing\n var nextRenderedCell = this.findNextCellToFocusOn(gridCell, backwards, true);\n var foundCell = exists(nextRenderedCell);\n // only prevent default if we found a cell. so if user is on last cell and hits tab, then we default\n // to the normal tabbing so user can exit the grid.\n if (foundCell && nextRenderedCell) {\n nextRenderedCell.startEditingIfEnabled(null, null, true);\n nextRenderedCell.focusCell(false);\n }\n return foundCell;\n };\n RowRenderer.prototype.moveToNextEditingRow = function (previousRenderedCell, backwards) {\n var gridCell = previousRenderedCell.getCellPosition();\n // find the next cell to start editing\n var nextRenderedCell = this.findNextCellToFocusOn(gridCell, backwards, true);\n var foundCell = exists(nextRenderedCell);\n // only prevent default if we found a cell. so if user is on last cell and hits tab, then we default\n // to the normal tabbing so user can exit the grid.\n if (foundCell && nextRenderedCell) {\n this.moveEditToNextCellOrRow(previousRenderedCell, nextRenderedCell);\n }\n return foundCell;\n };\n RowRenderer.prototype.moveToNextCellNotEditing = function (previousRenderedCell, backwards) {\n var displayedColumns = this.columnController.getAllDisplayedColumns();\n var gridCell;\n if (previousRenderedCell instanceof RowComp) {\n gridCell = __assign$4(__assign$4({}, previousRenderedCell.getRowPosition()), { column: backwards ? displayedColumns[0] : last(displayedColumns) });\n }\n else {\n gridCell = previousRenderedCell.getCellPosition();\n }\n // find the next cell to start editing\n var nextRenderedCell = this.findNextCellToFocusOn(gridCell, backwards, false);\n // only prevent default if we found a cell. so if user is on last cell and hits tab, then we default\n // to the normal tabbing so user can exit the grid.\n if (nextRenderedCell instanceof CellComp) {\n nextRenderedCell.focusCell(true);\n }\n else if (nextRenderedCell) {\n return this.tryToFocusFullWidthRow(nextRenderedCell.getRowPosition(), backwards);\n }\n return exists(nextRenderedCell);\n };\n RowRenderer.prototype.moveEditToNextCellOrRow = function (previousRenderedCell, nextRenderedCell) {\n var pGridCell = previousRenderedCell.getCellPosition();\n var nGridCell = nextRenderedCell.getCellPosition();\n var rowsMatch = nGridCell && pGridCell.rowIndex === nGridCell.rowIndex && pGridCell.rowPinned === nGridCell.rowPinned;\n if (rowsMatch) {\n // same row, so we don't start / stop editing, we just move the focus along\n previousRenderedCell.setFocusOutOnEditor();\n nextRenderedCell.setFocusInOnEditor();\n }\n else {\n var pRow = previousRenderedCell.getRenderedRow();\n var nRow = nextRenderedCell.getRenderedRow();\n previousRenderedCell.setFocusOutOnEditor();\n pRow.stopEditing();\n nRow.startRowEditing();\n nextRenderedCell.setFocusInOnEditor();\n }\n nextRenderedCell.focusCell();\n };\n // called by the cell, when tab is pressed while editing.\n // @return: RenderedCell when navigation successful, otherwise null\n RowRenderer.prototype.findNextCellToFocusOn = function (gridCell, backwards, startEditing) {\n var nextCell = gridCell;\n while (true) {\n if (!backwards) {\n nextCell = this.getLastCellOfColSpan(nextCell);\n }\n nextCell = this.cellNavigationService.getNextTabbedCell(nextCell, backwards);\n // allow user to override what cell to go to next\n var userFunc = this.gridOptionsWrapper.getTabToNextCellFunc();\n if (exists(userFunc)) {\n var params = {\n backwards: backwards,\n editing: startEditing,\n previousCellPosition: gridCell,\n nextCellPosition: nextCell ? nextCell : null\n };\n var userCell = userFunc(params);\n if (exists(userCell)) {\n if (userCell.floating) {\n doOnce(function () { console.warn(\"AG Grid: tabToNextCellFunc return type should have attributes: rowIndex, rowPinned, column. However you had 'floating', maybe you meant 'rowPinned'?\"); }, 'no floating in userCell');\n userCell.rowPinned = userCell.floating;\n }\n nextCell = {\n rowIndex: userCell.rowIndex,\n column: userCell.column,\n rowPinned: userCell.rowPinned\n };\n }\n else {\n nextCell = null;\n }\n }\n // if no 'next cell', means we have got to last cell of grid, so nothing to move to,\n // so bottom right cell going forwards, or top left going backwards\n if (!nextCell) {\n return null;\n }\n if (nextCell.rowIndex < 0) {\n var headerLen = this.beans.headerNavigationService.getHeaderRowCount();\n this.focusController.focusHeaderPosition({ headerRowIndex: headerLen + (nextCell.rowIndex), column: nextCell.column });\n return null;\n }\n // if editing, but cell not editable, skip cell. we do this before we do all of\n // the 'ensure index visible' and 'flush all frames', otherwise if we are skipping\n // a bunch of cells (eg 10 rows) then all the work on ensuring cell visible is useless\n // (except for the last one) which causes grid to stall for a while.\n if (startEditing) {\n var rowNode = this.lookupRowNodeForCell(nextCell);\n var cellIsEditable = rowNode && nextCell.column.isCellEditable(rowNode);\n if (!cellIsEditable) {\n continue;\n }\n }\n this.ensureCellVisible(nextCell);\n // we have to call this after ensureColumnVisible - otherwise it could be a virtual column\n // or row that is not currently in view, hence the renderedCell would not exist\n var nextCellComp = this.getComponentForCell(nextCell);\n // if next cell is fullWidth row, then no rendered cell,\n // as fullWidth rows have no cells, so we skip it\n if (!nextCellComp) {\n var rowComp = this.getRowCompByPosition(nextCell);\n if (!rowComp || !rowComp.isFullWidth()) {\n continue;\n }\n else {\n return rowComp;\n }\n }\n if (nextCellComp.isSuppressNavigable()) {\n continue;\n }\n // by default, when we click a cell, it gets selected into a range, so to keep keyboard navigation\n // consistent, we set into range here also.\n if (this.rangeController) {\n this.rangeController.setRangeToCell(nextCell);\n }\n // we successfully tabbed onto a grid cell, so return true\n return nextCellComp;\n }\n };\n RowRenderer.prototype.lookupRowNodeForCell = function (cell) {\n if (cell.rowPinned === Constants.PINNED_TOP) {\n return this.pinnedRowModel.getPinnedTopRow(cell.rowIndex);\n }\n if (cell.rowPinned === Constants.PINNED_BOTTOM) {\n return this.pinnedRowModel.getPinnedBottomRow(cell.rowIndex);\n }\n return this.paginationProxy.getRow(cell.rowIndex);\n };\n // returns true if any row between startIndex and endIndex is rendered. used by\n // SSRM or IRM, as they don't want to purge visible blocks from cache.\n RowRenderer.prototype.isRangeInRenderedViewport = function (startIndex, endIndex) {\n // parent closed means the parent node is not expanded, thus these blocks are not visible\n var parentClosed = startIndex == null || endIndex == null;\n if (parentClosed) {\n return false;\n }\n var blockAfterViewport = startIndex > this.lastRenderedRow;\n var blockBeforeViewport = endIndex < this.firstRenderedRow;\n var blockInsideViewport = !blockBeforeViewport && !blockAfterViewport;\n return blockInsideViewport;\n };\n __decorate$C([\n Autowired(\"paginationProxy\")\n ], RowRenderer.prototype, \"paginationProxy\", void 0);\n __decorate$C([\n Autowired(\"columnController\")\n ], RowRenderer.prototype, \"columnController\", void 0);\n __decorate$C([\n Autowired(\"$scope\")\n ], RowRenderer.prototype, \"$scope\", void 0);\n __decorate$C([\n Autowired(\"pinnedRowModel\")\n ], RowRenderer.prototype, \"pinnedRowModel\", void 0);\n __decorate$C([\n Autowired(\"rowModel\")\n ], RowRenderer.prototype, \"rowModel\", void 0);\n __decorate$C([\n Autowired(\"focusController\")\n ], RowRenderer.prototype, \"focusController\", void 0);\n __decorate$C([\n Autowired(\"cellNavigationService\")\n ], RowRenderer.prototype, \"cellNavigationService\", void 0);\n __decorate$C([\n Autowired(\"columnApi\")\n ], RowRenderer.prototype, \"columnApi\", void 0);\n __decorate$C([\n Autowired(\"gridApi\")\n ], RowRenderer.prototype, \"gridApi\", void 0);\n __decorate$C([\n Autowired(\"beans\")\n ], RowRenderer.prototype, \"beans\", void 0);\n __decorate$C([\n Autowired(\"maxDivHeightScaler\")\n ], RowRenderer.prototype, \"maxDivHeightScaler\", void 0);\n __decorate$C([\n Autowired(\"animationFrameService\")\n ], RowRenderer.prototype, \"animationFrameService\", void 0);\n __decorate$C([\n Autowired(\"rowPositionUtils\")\n ], RowRenderer.prototype, \"rowPositionUtils\", void 0);\n __decorate$C([\n Optional(\"rangeController\")\n ], RowRenderer.prototype, \"rangeController\", void 0);\n __decorate$C([\n __param$5(0, Qualifier(\"loggerFactory\"))\n ], RowRenderer.prototype, \"agWire\", null);\n RowRenderer = __decorate$C([\n Bean(\"rowRenderer\")\n ], RowRenderer);\n return RowRenderer;\n}(BeanStub));\n\n/**\n * @ag-grid-community/core - Advanced Data Grid / Data Table supporting Javascript / React / AngularJS / Web Components\n * @version v25.1.0\n * @link http://www.ag-grid.com/\n * @license MIT\n */\nvar CssClassApplier = /** @class */ (function () {\n function CssClassApplier() {\n }\n CssClassApplier.addHeaderClassesFromColDef = function (abstractColDef, eHeaderCell, gridOptionsWrapper, column, columnGroup) {\n if (missing(abstractColDef)) {\n return;\n }\n this.addColumnClassesFromCollDef(abstractColDef.headerClass, abstractColDef, eHeaderCell, gridOptionsWrapper, column, columnGroup);\n };\n CssClassApplier.addToolPanelClassesFromColDef = function (abstractColDef, eHeaderCell, gridOptionsWrapper, column, columnGroup) {\n if (missing(abstractColDef)) {\n return;\n }\n this.addColumnClassesFromCollDef(abstractColDef.toolPanelClass, abstractColDef, eHeaderCell, gridOptionsWrapper, column, columnGroup);\n };\n CssClassApplier.addColumnClassesFromCollDef = function (classesOrFunc, abstractColDef, eHeaderCell, gridOptionsWrapper, column, columnGroup) {\n if (missing(classesOrFunc)) {\n return;\n }\n var classToUse;\n if (typeof classesOrFunc === 'function') {\n var params = {\n // bad naming, as colDef here can be a group or a column,\n // however most people won't appreciate the difference,\n // so keeping it as colDef to avoid confusion.\n colDef: abstractColDef,\n column: column,\n columnGroup: columnGroup,\n context: gridOptionsWrapper.getContext(),\n api: gridOptionsWrapper.getApi()\n };\n var headerClassFunc = classesOrFunc;\n classToUse = headerClassFunc(params);\n }\n else {\n classToUse = classesOrFunc;\n }\n if (typeof classToUse === 'string') {\n addCssClass(eHeaderCell, classToUse);\n }\n else if (Array.isArray(classToUse)) {\n classToUse.forEach(function (cssClassItem) {\n addCssClass(eHeaderCell, cssClassItem);\n });\n }\n };\n return CssClassApplier;\n}());\n\n/**\n * @ag-grid-community/core - Advanced Data Grid / Data Table supporting Javascript / React / AngularJS / Web Components\n * @version v25.1.0\n * @link http://www.ag-grid.com/\n * @license MIT\n */\nvar __extends$J = (undefined && undefined.__extends) || (function () {\n var extendStatics = function (d, b) {\n extendStatics = Object.setPrototypeOf ||\n ({ __proto__: [] } instanceof Array && function (d, b) { d.__proto__ = b; }) ||\n function (d, b) { for (var p in b) if (b.hasOwnProperty(p)) d[p] = b[p]; };\n return extendStatics(d, b);\n };\n return function (d, b) {\n extendStatics(d, b);\n function __() { this.constructor = d; }\n d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __());\n };\n})();\nvar __decorate$D = (undefined && undefined.__decorate) || function (decorators, target, key, desc) {\n var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d;\n if (typeof Reflect === \"object\" && typeof Reflect.decorate === \"function\") r = Reflect.decorate(decorators, target, key, desc);\n else for (var i = decorators.length - 1; i >= 0; i--) if (d = decorators[i]) r = (c < 3 ? d(r) : c > 3 ? d(target, key, r) : d(target, key)) || r;\n return c > 3 && r && Object.defineProperty(target, key, r), r;\n};\nvar HoverFeature = /** @class */ (function (_super) {\n __extends$J(HoverFeature, _super);\n function HoverFeature(columns, element) {\n var _this = _super.call(this) || this;\n _this.columns = columns;\n _this.element = element;\n return _this;\n }\n HoverFeature.prototype.postConstruct = function () {\n this.addMouseHoverListeners();\n };\n HoverFeature.prototype.addMouseHoverListeners = function () {\n this.addManagedListener(this.element, 'mouseout', this.onMouseOut.bind(this));\n this.addManagedListener(this.element, 'mouseover', this.onMouseOver.bind(this));\n };\n HoverFeature.prototype.onMouseOut = function () {\n this.columnHoverService.clearMouseOver();\n };\n HoverFeature.prototype.onMouseOver = function () {\n this.columnHoverService.setMouseOver(this.columns);\n };\n __decorate$D([\n Autowired('columnHoverService')\n ], HoverFeature.prototype, \"columnHoverService\", void 0);\n __decorate$D([\n PostConstruct\n ], HoverFeature.prototype, \"postConstruct\", null);\n return HoverFeature;\n}(BeanStub));\n\n/**\n * @ag-grid-community/core - Advanced Data Grid / Data Table supporting Javascript / React / AngularJS / Web Components\n * @version v25.1.0\n * @link http://www.ag-grid.com/\n * @license MIT\n */\nvar __extends$K = (undefined && undefined.__extends) || (function () {\n var extendStatics = function (d, b) {\n extendStatics = Object.setPrototypeOf ||\n ({ __proto__: [] } instanceof Array && function (d, b) { d.__proto__ = b; }) ||\n function (d, b) { for (var p in b) if (b.hasOwnProperty(p)) d[p] = b[p]; };\n return extendStatics(d, b);\n };\n return function (d, b) {\n extendStatics(d, b);\n function __() { this.constructor = d; }\n d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __());\n };\n})();\nvar __decorate$E = (undefined && undefined.__decorate) || function (decorators, target, key, desc) {\n var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d;\n if (typeof Reflect === \"object\" && typeof Reflect.decorate === \"function\") r = Reflect.decorate(decorators, target, key, desc);\n else for (var i = decorators.length - 1; i >= 0; i--) if (d = decorators[i]) r = (c < 3 ? d(r) : c > 3 ? d(target, key, r) : d(target, key)) || r;\n return c > 3 && r && Object.defineProperty(target, key, r), r;\n};\nvar SetLeftFeature = /** @class */ (function (_super) {\n __extends$K(SetLeftFeature, _super);\n function SetLeftFeature(columnOrGroup, eCell, beans, colsSpanning) {\n var _this = _super.call(this) || this;\n _this.columnOrGroup = columnOrGroup;\n _this.eCell = eCell;\n _this.ariaEl = _this.eCell.querySelector('[role=columnheader]') || _this.eCell;\n _this.colsSpanning = colsSpanning;\n _this.beans = beans;\n _this.printLayout = beans.gridOptionsWrapper.getDomLayout() === Constants.DOM_LAYOUT_PRINT;\n return _this;\n }\n SetLeftFeature.prototype.setColsSpanning = function (colsSpanning) {\n this.colsSpanning = colsSpanning;\n this.onLeftChanged();\n };\n SetLeftFeature.prototype.getColumnOrGroup = function () {\n if (this.beans.gridOptionsWrapper.isEnableRtl() && this.colsSpanning) {\n return last(this.colsSpanning);\n }\n return this.columnOrGroup;\n };\n SetLeftFeature.prototype.postConstruct = function () {\n this.addManagedListener(this.columnOrGroup, Column.EVENT_LEFT_CHANGED, this.onLeftChanged.bind(this));\n this.setLeftFirstTime();\n // when in print layout, the left position is also dependent on the width of the pinned sections.\n // so additionally update left if any column width changes.\n if (this.printLayout) {\n this.addManagedListener(this.eventService, Events.EVENT_DISPLAYED_COLUMNS_WIDTH_CHANGED, this.onLeftChanged.bind(this));\n }\n };\n SetLeftFeature.prototype.setLeftFirstTime = function () {\n var suppressMoveAnimation = this.beans.gridOptionsWrapper.isSuppressColumnMoveAnimation();\n var oldLeftExists = exists(this.columnOrGroup.getOldLeft());\n var animateColumnMove = this.beans.columnAnimationService.isActive() && oldLeftExists && !suppressMoveAnimation;\n if (animateColumnMove) {\n this.animateInLeft();\n }\n else {\n this.onLeftChanged();\n }\n };\n SetLeftFeature.prototype.animateInLeft = function () {\n var _this = this;\n var left = this.getColumnOrGroup().getLeft();\n var oldLeft = this.getColumnOrGroup().getOldLeft();\n this.setLeft(oldLeft);\n // we must keep track of the left we want to set to, as this would otherwise lead to a race\n // condition, if the user changed the left value many times in one VM turn, then we want to make\n // make sure the actualLeft we set in the timeout below (in the next VM turn) is the correct left\n // position. eg if user changes column position twice, then setLeft() below executes twice in next\n // VM turn, but only one (the correct one) should get applied.\n this.actualLeft = left;\n this.beans.columnAnimationService.executeNextVMTurn(function () {\n // test this left value is the latest one to be applied, and if not, do nothing\n if (_this.actualLeft === left) {\n _this.setLeft(left);\n }\n });\n };\n SetLeftFeature.prototype.onLeftChanged = function () {\n var colOrGroup = this.getColumnOrGroup();\n var left = colOrGroup.getLeft();\n this.actualLeft = this.modifyLeftForPrintLayout(colOrGroup, left);\n this.setLeft(this.actualLeft);\n };\n SetLeftFeature.prototype.modifyLeftForPrintLayout = function (colOrGroup, leftPosition) {\n if (!this.printLayout) {\n return leftPosition;\n }\n if (colOrGroup.getPinned() === Constants.PINNED_LEFT) {\n return leftPosition;\n }\n var leftWidth = this.beans.columnController.getDisplayedColumnsLeftWidth();\n if (colOrGroup.getPinned() === Constants.PINNED_RIGHT) {\n var bodyWidth = this.beans.columnController.getBodyContainerWidth();\n return leftWidth + bodyWidth + leftPosition;\n }\n // is in body\n return leftWidth + leftPosition;\n };\n SetLeftFeature.prototype.setLeft = function (value) {\n // if the value is null, then that means the column is no longer\n // displayed. there is logic in the rendering to fade these columns\n // out, so we don't try and change their left positions.\n if (exists(value)) {\n this.eCell.style.left = value + \"px\";\n }\n var indexColumn;\n if (this.columnOrGroup instanceof Column) {\n indexColumn = this.columnOrGroup;\n }\n else {\n var columnGroup = this.columnOrGroup;\n var children = columnGroup.getLeafColumns();\n if (!children.length) {\n return;\n }\n if (children.length > 1) {\n setAriaColSpan(this.ariaEl, children.length);\n }\n indexColumn = children[0];\n }\n var index = this.beans.columnController.getAriaColumnIndex(indexColumn);\n setAriaColIndex(this.ariaEl, index);\n };\n __decorate$E([\n PostConstruct\n ], SetLeftFeature.prototype, \"postConstruct\", null);\n return SetLeftFeature;\n}(BeanStub));\n\n/**\n * @ag-grid-community/core - Advanced Data Grid / Data Table supporting Javascript / React / AngularJS / Web Components\n * @version v25.1.0\n * @link http://www.ag-grid.com/\n * @license MIT\n */\nvar __extends$L = (undefined && undefined.__extends) || (function () {\n var extendStatics = function (d, b) {\n extendStatics = Object.setPrototypeOf ||\n ({ __proto__: [] } instanceof Array && function (d, b) { d.__proto__ = b; }) ||\n function (d, b) { for (var p in b) if (b.hasOwnProperty(p)) d[p] = b[p]; };\n return extendStatics(d, b);\n };\n return function (d, b) {\n extendStatics(d, b);\n function __() { this.constructor = d; }\n d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __());\n };\n})();\nvar __decorate$F = (undefined && undefined.__decorate) || function (decorators, target, key, desc) {\n var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d;\n if (typeof Reflect === \"object\" && typeof Reflect.decorate === \"function\") r = Reflect.decorate(decorators, target, key, desc);\n else for (var i = decorators.length - 1; i >= 0; i--) if (d = decorators[i]) r = (c < 3 ? d(r) : c > 3 ? d(target, key, r) : d(target, key)) || r;\n return c > 3 && r && Object.defineProperty(target, key, r), r;\n};\nvar AgAbstractLabel = /** @class */ (function (_super) {\n __extends$L(AgAbstractLabel, _super);\n function AgAbstractLabel(config, template) {\n var _this = _super.call(this, template) || this;\n _this.labelSeparator = '';\n _this.labelAlignment = 'left';\n _this.label = '';\n _this.config = config || {};\n return _this;\n }\n AgAbstractLabel.prototype.postConstruct = function () {\n addCssClass(this.getGui(), 'ag-labeled');\n addCssClass(this.eLabel, 'ag-label');\n var _a = this.config, labelSeparator = _a.labelSeparator, label = _a.label, labelWidth = _a.labelWidth, labelAlignment = _a.labelAlignment;\n if (labelSeparator != null) {\n this.setLabelSeparator(labelSeparator);\n }\n if (label != null) {\n this.setLabel(label);\n }\n if (labelWidth != null) {\n this.setLabelWidth(labelWidth);\n }\n this.setLabelAlignment(labelAlignment || this.labelAlignment);\n this.refreshLabel();\n };\n AgAbstractLabel.prototype.refreshLabel = function () {\n clearElement(this.eLabel);\n if (typeof this.label === 'string') {\n this.eLabel.innerText = this.label + this.labelSeparator;\n }\n else if (this.label) {\n this.eLabel.appendChild(this.label);\n }\n if (this.label === '') {\n addCssClass(this.eLabel, 'ag-hidden');\n this.eLabel.setAttribute('role', 'presentation');\n }\n else {\n removeCssClass(this.eLabel, 'ag-hidden');\n this.eLabel.removeAttribute('role');\n }\n };\n AgAbstractLabel.prototype.setLabelSeparator = function (labelSeparator) {\n if (this.labelSeparator === labelSeparator) {\n return this;\n }\n this.labelSeparator = labelSeparator;\n if (this.label != null) {\n this.refreshLabel();\n }\n return this;\n };\n AgAbstractLabel.prototype.getLabelId = function () {\n this.eLabel.id = this.eLabel.id || \"ag-\" + this.getCompId() + \"-label\";\n return this.eLabel.id;\n };\n AgAbstractLabel.prototype.getLabel = function () {\n return this.label;\n };\n AgAbstractLabel.prototype.setLabel = function (label) {\n if (this.label === label) {\n return this;\n }\n this.label = label;\n this.refreshLabel();\n return this;\n };\n AgAbstractLabel.prototype.setLabelAlignment = function (alignment) {\n var eGui = this.getGui();\n addOrRemoveCssClass(eGui, 'ag-label-align-left', alignment === 'left');\n addOrRemoveCssClass(eGui, 'ag-label-align-right', alignment === 'right');\n addOrRemoveCssClass(eGui, 'ag-label-align-top', alignment === 'top');\n return this;\n };\n AgAbstractLabel.prototype.setLabelWidth = function (width) {\n if (this.label == null) {\n return this;\n }\n setElementWidth(this.eLabel, width);\n return this;\n };\n __decorate$F([\n PostConstruct\n ], AgAbstractLabel.prototype, \"postConstruct\", null);\n return AgAbstractLabel;\n}(Component));\n\n/**\n * @ag-grid-community/core - Advanced Data Grid / Data Table supporting Javascript / React / AngularJS / Web Components\n * @version v25.1.0\n * @link http://www.ag-grid.com/\n * @license MIT\n */\nvar __extends$M = (undefined && undefined.__extends) || (function () {\n var extendStatics = function (d, b) {\n extendStatics = Object.setPrototypeOf ||\n ({ __proto__: [] } instanceof Array && function (d, b) { d.__proto__ = b; }) ||\n function (d, b) { for (var p in b) if (b.hasOwnProperty(p)) d[p] = b[p]; };\n return extendStatics(d, b);\n };\n return function (d, b) {\n extendStatics(d, b);\n function __() { this.constructor = d; }\n d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __());\n };\n})();\nvar AgAbstractField = /** @class */ (function (_super) {\n __extends$M(AgAbstractField, _super);\n function AgAbstractField(config, template, className) {\n var _this = _super.call(this, config, template) || this;\n _this.className = className;\n _this.disabled = false;\n return _this;\n }\n AgAbstractField.prototype.postConstruct = function () {\n _super.prototype.postConstruct.call(this);\n if (this.className) {\n addCssClass(this.getGui(), this.className);\n }\n };\n AgAbstractField.prototype.onValueChange = function (callbackFn) {\n var _this = this;\n this.addManagedListener(this, AgAbstractField.EVENT_CHANGED, function () { return callbackFn(_this.getValue()); });\n return this;\n };\n AgAbstractField.prototype.getWidth = function () {\n return this.getGui().clientWidth;\n };\n AgAbstractField.prototype.setWidth = function (width) {\n setFixedWidth(this.getGui(), width);\n return this;\n };\n AgAbstractField.prototype.getPreviousValue = function () {\n return this.previousValue;\n };\n AgAbstractField.prototype.getValue = function () {\n return this.value;\n };\n AgAbstractField.prototype.setValue = function (value, silent) {\n if (this.value === value) {\n return this;\n }\n this.previousValue = this.value;\n this.value = value;\n if (!silent) {\n this.dispatchEvent({ type: AgAbstractField.EVENT_CHANGED });\n }\n return this;\n };\n AgAbstractField.prototype.setDisabled = function (disabled) {\n disabled = !!disabled;\n var element = this.getGui();\n setDisabled(element, disabled);\n addOrRemoveCssClass(element, 'ag-disabled', disabled);\n this.disabled = disabled;\n return this;\n };\n AgAbstractField.prototype.isDisabled = function () {\n return !!this.disabled;\n };\n AgAbstractField.EVENT_CHANGED = 'valueChange';\n return AgAbstractField;\n}(AgAbstractLabel));\n\n/**\n * @ag-grid-community/core - Advanced Data Grid / Data Table supporting Javascript / React / AngularJS / Web Components\n * @version v25.1.0\n * @link http://www.ag-grid.com/\n * @license MIT\n */\nvar __extends$N = (undefined && undefined.__extends) || (function () {\n var extendStatics = function (d, b) {\n extendStatics = Object.setPrototypeOf ||\n ({ __proto__: [] } instanceof Array && function (d, b) { d.__proto__ = b; }) ||\n function (d, b) { for (var p in b) if (b.hasOwnProperty(p)) d[p] = b[p]; };\n return extendStatics(d, b);\n };\n return function (d, b) {\n extendStatics(d, b);\n function __() { this.constructor = d; }\n d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __());\n };\n})();\nvar __decorate$G = (undefined && undefined.__decorate) || function (decorators, target, key, desc) {\n var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d;\n if (typeof Reflect === \"object\" && typeof Reflect.decorate === \"function\") r = Reflect.decorate(decorators, target, key, desc);\n else for (var i = decorators.length - 1; i >= 0; i--) if (d = decorators[i]) r = (c < 3 ? d(r) : c > 3 ? d(target, key, r) : d(target, key)) || r;\n return c > 3 && r && Object.defineProperty(target, key, r), r;\n};\nvar AgAbstractInputField = /** @class */ (function (_super) {\n __extends$N(AgAbstractInputField, _super);\n function AgAbstractInputField(config, className, inputType, displayFieldTag) {\n if (inputType === void 0) { inputType = 'text'; }\n if (displayFieldTag === void 0) { displayFieldTag = 'input'; }\n var _this = _super.call(this, config, /* html */ \"\\n
\\n
\\n
\\n <\" + displayFieldTag + \" ref=\\\"eInput\\\" class=\\\"ag-input-field-input\\\">\\n
\\n
\", className) || this;\n _this.inputType = inputType;\n _this.displayFieldTag = displayFieldTag;\n return _this;\n }\n AgAbstractInputField.prototype.postConstruct = function () {\n _super.prototype.postConstruct.call(this);\n this.setInputType();\n addCssClass(this.eLabel, this.className + \"-label\");\n addCssClass(this.eWrapper, this.className + \"-input-wrapper\");\n addCssClass(this.eInput, this.className + \"-input\");\n addCssClass(this.getGui(), 'ag-input-field');\n this.eInput.id = this.eInput.id || \"ag-\" + this.getCompId() + \"-input\";\n var _a = this.config, width = _a.width, value = _a.value;\n if (width != null) {\n this.setWidth(width);\n }\n if (value != null) {\n this.setValue(value);\n }\n this.addInputListeners();\n };\n AgAbstractInputField.prototype.refreshLabel = function () {\n if (exists(this.getLabel())) {\n setAriaLabelledBy(this.eInput, this.getLabelId());\n }\n else {\n this.eInput.removeAttribute('aria-labelledby');\n }\n _super.prototype.refreshLabel.call(this);\n };\n AgAbstractInputField.prototype.addInputListeners = function () {\n var _this = this;\n this.addManagedListener(this.eInput, 'input', function (e) { return _this.setValue(e.target.value); });\n };\n AgAbstractInputField.prototype.setInputType = function () {\n if (this.displayFieldTag === 'input') {\n this.eInput.setAttribute('type', this.inputType);\n }\n };\n AgAbstractInputField.prototype.getInputElement = function () {\n return this.eInput;\n };\n AgAbstractInputField.prototype.setInputWidth = function (width) {\n setElementWidth(this.eWrapper, width);\n return this;\n };\n AgAbstractInputField.prototype.setInputName = function (name) {\n this.getInputElement().setAttribute('name', name);\n return this;\n };\n AgAbstractInputField.prototype.getFocusableElement = function () {\n return this.eInput;\n };\n AgAbstractInputField.prototype.setMaxLength = function (length) {\n var eInput = this.eInput;\n eInput.maxLength = length;\n return this;\n };\n AgAbstractInputField.prototype.setInputPlaceholder = function (placeholder) {\n addOrRemoveAttribute(this.eInput, 'placeholder', placeholder);\n return this;\n };\n AgAbstractInputField.prototype.setInputAriaLabel = function (label) {\n setAriaLabel(this.eInput, label);\n return this;\n };\n AgAbstractInputField.prototype.setDisabled = function (disabled) {\n setDisabled(this.eInput, disabled);\n return _super.prototype.setDisabled.call(this, disabled);\n };\n __decorate$G([\n RefSelector('eLabel')\n ], AgAbstractInputField.prototype, \"eLabel\", void 0);\n __decorate$G([\n RefSelector('eWrapper')\n ], AgAbstractInputField.prototype, \"eWrapper\", void 0);\n __decorate$G([\n RefSelector('eInput')\n ], AgAbstractInputField.prototype, \"eInput\", void 0);\n return AgAbstractInputField;\n}(AgAbstractField));\n\n/**\n * @ag-grid-community/core - Advanced Data Grid / Data Table supporting Javascript / React / AngularJS / Web Components\n * @version v25.1.0\n * @link http://www.ag-grid.com/\n * @license MIT\n */\nvar __extends$O = (undefined && undefined.__extends) || (function () {\n var extendStatics = function (d, b) {\n extendStatics = Object.setPrototypeOf ||\n ({ __proto__: [] } instanceof Array && function (d, b) { d.__proto__ = b; }) ||\n function (d, b) { for (var p in b) if (b.hasOwnProperty(p)) d[p] = b[p]; };\n return extendStatics(d, b);\n };\n return function (d, b) {\n extendStatics(d, b);\n function __() { this.constructor = d; }\n d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __());\n };\n})();\nvar AgCheckbox = /** @class */ (function (_super) {\n __extends$O(AgCheckbox, _super);\n function AgCheckbox(config, className, inputType) {\n if (className === void 0) { className = 'ag-checkbox'; }\n if (inputType === void 0) { inputType = 'checkbox'; }\n var _this = _super.call(this, config, className, inputType) || this;\n _this.labelAlignment = 'right';\n _this.selected = false;\n _this.readOnly = false;\n _this.passive = false;\n return _this;\n }\n AgCheckbox.prototype.addInputListeners = function () {\n this.addManagedListener(this.eInput, 'click', this.onCheckboxClick.bind(this));\n this.addManagedListener(this.eLabel, 'click', this.toggle.bind(this));\n };\n AgCheckbox.prototype.getNextValue = function () {\n return this.selected === undefined ? true : !this.selected;\n };\n AgCheckbox.prototype.setPassive = function (passive) {\n this.passive = passive;\n };\n AgCheckbox.prototype.isReadOnly = function () {\n return this.readOnly;\n };\n AgCheckbox.prototype.setReadOnly = function (readOnly) {\n addOrRemoveCssClass(this.eWrapper, 'ag-disabled', readOnly);\n this.eInput.disabled = readOnly;\n this.readOnly = readOnly;\n };\n AgCheckbox.prototype.setDisabled = function (disabled) {\n addOrRemoveCssClass(this.eWrapper, 'ag-disabled', disabled);\n return _super.prototype.setDisabled.call(this, disabled);\n };\n AgCheckbox.prototype.toggle = function () {\n var previousValue = this.isSelected();\n var nextValue = this.getNextValue();\n if (this.passive) {\n this.dispatchChange(nextValue, previousValue);\n }\n else {\n this.setValue(nextValue);\n }\n };\n AgCheckbox.prototype.getValue = function () {\n return this.isSelected();\n };\n AgCheckbox.prototype.setValue = function (value, silent) {\n this.refreshSelectedClass(value);\n this.setSelected(value, silent);\n return this;\n };\n AgCheckbox.prototype.setName = function (name) {\n var input = this.getInputElement();\n input.name = name;\n return this;\n };\n AgCheckbox.prototype.isSelected = function () {\n return this.selected;\n };\n AgCheckbox.prototype.setSelected = function (selected, silent) {\n if (this.isSelected() === selected) {\n return;\n }\n this.previousValue = this.isSelected();\n selected = this.selected = typeof selected === 'boolean' ? selected : undefined;\n this.eInput.checked = selected;\n this.eInput.indeterminate = selected === undefined;\n if (!silent) {\n this.dispatchChange(this.selected, this.previousValue);\n }\n };\n AgCheckbox.prototype.dispatchChange = function (selected, previousValue, event) {\n this.dispatchEvent({ type: AgCheckbox.EVENT_CHANGED, selected: selected, previousValue: previousValue, event: event });\n var input = this.getInputElement();\n var checkboxChangedEvent = {\n type: Events.EVENT_CHECKBOX_CHANGED,\n id: input.id,\n name: input.name,\n selected: selected,\n previousValue: previousValue\n };\n this.eventService.dispatchEvent(checkboxChangedEvent);\n };\n AgCheckbox.prototype.onCheckboxClick = function (e) {\n if (this.passive) {\n return;\n }\n var previousValue = this.isSelected();\n var selected = this.selected = e.target.checked;\n this.refreshSelectedClass(selected);\n this.dispatchChange(selected, previousValue, e);\n };\n AgCheckbox.prototype.refreshSelectedClass = function (value) {\n addOrRemoveCssClass(this.eWrapper, 'ag-checked', value === true);\n addOrRemoveCssClass(this.eWrapper, 'ag-indeterminate', value == null);\n };\n return AgCheckbox;\n}(AgAbstractInputField));\n\n/**\n * @ag-grid-community/core - Advanced Data Grid / Data Table supporting Javascript / React / AngularJS / Web Components\n * @version v25.1.0\n * @link http://www.ag-grid.com/\n * @license MIT\n */\nvar __extends$P = (undefined && undefined.__extends) || (function () {\n var extendStatics = function (d, b) {\n extendStatics = Object.setPrototypeOf ||\n ({ __proto__: [] } instanceof Array && function (d, b) { d.__proto__ = b; }) ||\n function (d, b) { for (var p in b) if (b.hasOwnProperty(p)) d[p] = b[p]; };\n return extendStatics(d, b);\n };\n return function (d, b) {\n extendStatics(d, b);\n function __() { this.constructor = d; }\n d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __());\n };\n})();\nvar __decorate$H = (undefined && undefined.__decorate) || function (decorators, target, key, desc) {\n var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d;\n if (typeof Reflect === \"object\" && typeof Reflect.decorate === \"function\") r = Reflect.decorate(decorators, target, key, desc);\n else for (var i = decorators.length - 1; i >= 0; i--) if (d = decorators[i]) r = (c < 3 ? d(r) : c > 3 ? d(target, key, r) : d(target, key)) || r;\n return c > 3 && r && Object.defineProperty(target, key, r), r;\n};\nvar SelectAllFeature = /** @class */ (function (_super) {\n __extends$P(SelectAllFeature, _super);\n function SelectAllFeature(cbSelectAll, column) {\n var _this = _super.call(this) || this;\n _this.cbSelectAllVisible = false;\n _this.processingEventFromCheckbox = false;\n _this.cbSelectAll = cbSelectAll;\n _this.column = column;\n var colDef = column.getColDef();\n _this.filteredOnly = colDef ? !!colDef.headerCheckboxSelectionFilteredOnly : false;\n return _this;\n }\n SelectAllFeature.prototype.postConstruct = function () {\n this.showOrHideSelectAll();\n this.addManagedListener(this.eventService, Events.EVENT_NEW_COLUMNS_LOADED, this.showOrHideSelectAll.bind(this));\n this.addManagedListener(this.eventService, Events.EVENT_DISPLAYED_COLUMNS_CHANGED, this.showOrHideSelectAll.bind(this));\n this.addManagedListener(this.eventService, Events.EVENT_SELECTION_CHANGED, this.onSelectionChanged.bind(this));\n this.addManagedListener(this.eventService, Events.EVENT_MODEL_UPDATED, this.onModelChanged.bind(this));\n this.addManagedListener(this.cbSelectAll, AgCheckbox.EVENT_CHANGED, this.onCbSelectAll.bind(this));\n this.cbSelectAll.getInputElement().setAttribute('tabindex', '-1');\n this.refreshSelectAllLabel();\n };\n SelectAllFeature.prototype.showOrHideSelectAll = function () {\n this.cbSelectAllVisible = this.isCheckboxSelection();\n this.cbSelectAll.setDisplayed(this.cbSelectAllVisible);\n if (this.cbSelectAllVisible) {\n // in case user is trying this feature with the wrong model type\n this.checkRightRowModelType();\n // make sure checkbox is showing the right state\n this.updateStateOfCheckbox();\n }\n this.refreshHeaderAriaDescribedBy(this.cbSelectAllVisible);\n };\n SelectAllFeature.prototype.refreshHeaderAriaDescribedBy = function (isSelectAllVisible) {\n var parentHeader = this.cbSelectAll.getParentComponent();\n var parentHeaderGui = parentHeader && parentHeader.getGui();\n if (!parentHeaderGui || !isVisible(parentHeaderGui)) {\n return;\n }\n var describedByIds = '';\n if (parentHeaderGui) {\n describedByIds = getAriaDescribedBy(parentHeaderGui);\n }\n var cbSelectAllId = this.cbSelectAll.getInputElement().id;\n var describedByIdsHasSelectAllFeature = describedByIds.indexOf(cbSelectAllId) !== -1;\n if (isSelectAllVisible) {\n if (!describedByIdsHasSelectAllFeature) {\n setAriaDescribedBy(parentHeaderGui, cbSelectAllId + \" \" + describedByIds.trim());\n }\n }\n else if (describedByIdsHasSelectAllFeature) {\n setAriaDescribedBy(parentHeaderGui, describedByIds.trim().split(' ').filter(function (id) { return id === cbSelectAllId; }).join(' '));\n }\n };\n SelectAllFeature.prototype.onModelChanged = function () {\n if (!this.cbSelectAllVisible) {\n return;\n }\n this.updateStateOfCheckbox();\n };\n SelectAllFeature.prototype.onSelectionChanged = function () {\n if (!this.cbSelectAllVisible) {\n return;\n }\n this.updateStateOfCheckbox();\n };\n SelectAllFeature.prototype.getNextCheckboxState = function (selectionCount) {\n // if no rows, always have it unselected\n if (selectionCount.selected === 0 && selectionCount.notSelected === 0) {\n return false;\n }\n // if mix of selected and unselected, this is the tri-state\n if (selectionCount.selected > 0 && selectionCount.notSelected > 0) {\n return null;\n }\n // only selected\n if (selectionCount.selected > 0) {\n return true;\n }\n // nothing selected\n return false;\n };\n SelectAllFeature.prototype.updateStateOfCheckbox = function () {\n if (this.processingEventFromCheckbox) {\n return;\n }\n this.processingEventFromCheckbox = true;\n var selectionCount = this.getSelectionCount();\n var allSelected = this.getNextCheckboxState(selectionCount);\n this.cbSelectAll.setValue(allSelected);\n this.refreshSelectAllLabel();\n this.processingEventFromCheckbox = false;\n };\n SelectAllFeature.prototype.refreshSelectAllLabel = function () {\n var translate = this.gridOptionsWrapper.getLocaleTextFunc();\n var checked = this.cbSelectAll.getValue();\n var ariaStatus = checked ? translate('ariaChecked', 'checked') : translate('ariaUnchecked', 'unchecked');\n var ariaLabel = translate('ariaRowSelectAll', 'Press Space to toggle all rows selection');\n this.cbSelectAll.setInputAriaLabel(ariaLabel + \" (\" + ariaStatus + \")\");\n };\n SelectAllFeature.prototype.getSelectionCount = function () {\n var _this = this;\n var selectedCount = 0;\n var notSelectedCount = 0;\n var callback = function (node) {\n if (_this.gridOptionsWrapper.isGroupSelectsChildren() && node.group) {\n return;\n }\n if (node.isSelected()) {\n selectedCount++;\n }\n else if (!node.selectable) ;\n else {\n notSelectedCount++;\n }\n };\n if (this.filteredOnly) {\n this.gridApi.forEachNodeAfterFilter(callback);\n }\n else {\n this.gridApi.forEachNode(callback);\n }\n return {\n notSelected: notSelectedCount,\n selected: selectedCount\n };\n };\n SelectAllFeature.prototype.checkRightRowModelType = function () {\n var rowModelType = this.rowModel.getType();\n var rowModelMatches = rowModelType === Constants.ROW_MODEL_TYPE_CLIENT_SIDE;\n if (!rowModelMatches) {\n console.warn(\"AG Grid: selectAllCheckbox is only available if using normal row model, you are using \" + rowModelType);\n }\n };\n SelectAllFeature.prototype.onCbSelectAll = function () {\n if (this.processingEventFromCheckbox) {\n return;\n }\n if (!this.cbSelectAllVisible) {\n return;\n }\n var value = this.cbSelectAll.getValue();\n if (value) {\n this.selectionController.selectAllRowNodes(this.filteredOnly);\n }\n else {\n this.selectionController.deselectAllRowNodes(this.filteredOnly);\n }\n };\n SelectAllFeature.prototype.isCheckboxSelection = function () {\n var result = this.column.getColDef().headerCheckboxSelection;\n if (typeof result === 'function') {\n var func = result;\n result = func({\n column: this.column,\n colDef: this.column.getColDef(),\n columnApi: this.columnApi,\n api: this.gridApi\n });\n }\n if (result) {\n if (this.gridOptionsWrapper.isRowModelServerSide()) {\n console.warn('headerCheckboxSelection is not supported for Server Side Row Model');\n return false;\n }\n if (this.gridOptionsWrapper.isRowModelInfinite()) {\n console.warn('headerCheckboxSelection is not supported for Infinite Row Model');\n return false;\n }\n if (this.gridOptionsWrapper.isRowModelViewport()) {\n console.warn('headerCheckboxSelection is not supported for Viewport Row Model');\n return false;\n }\n // otherwise the row model is compatible, so return true\n return true;\n }\n return false;\n };\n __decorate$H([\n Autowired('gridApi')\n ], SelectAllFeature.prototype, \"gridApi\", void 0);\n __decorate$H([\n Autowired('columnApi')\n ], SelectAllFeature.prototype, \"columnApi\", void 0);\n __decorate$H([\n Autowired('rowModel')\n ], SelectAllFeature.prototype, \"rowModel\", void 0);\n __decorate$H([\n Autowired('selectionController')\n ], SelectAllFeature.prototype, \"selectionController\", void 0);\n __decorate$H([\n PostConstruct\n ], SelectAllFeature.prototype, \"postConstruct\", null);\n return SelectAllFeature;\n}(BeanStub));\n\n/**\n * @ag-grid-community/core - Advanced Data Grid / Data Table supporting Javascript / React / AngularJS / Web Components\n * @version v25.1.0\n * @link http://www.ag-grid.com/\n * @license MIT\n */\nvar __extends$Q = (undefined && undefined.__extends) || (function () {\n var extendStatics = function (d, b) {\n extendStatics = Object.setPrototypeOf ||\n ({ __proto__: [] } instanceof Array && function (d, b) { d.__proto__ = b; }) ||\n function (d, b) { for (var p in b) if (b.hasOwnProperty(p)) d[p] = b[p]; };\n return extendStatics(d, b);\n };\n return function (d, b) {\n extendStatics(d, b);\n function __() { this.constructor = d; }\n d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __());\n };\n})();\nvar AbstractHeaderWrapper = /** @class */ (function (_super) {\n __extends$Q(AbstractHeaderWrapper, _super);\n function AbstractHeaderWrapper() {\n return _super !== null && _super.apply(this, arguments) || this;\n }\n AbstractHeaderWrapper.prototype.shouldStopEventPropagation = function (e) {\n var _a = this.focusController.getFocusedHeader(), headerRowIndex = _a.headerRowIndex, column = _a.column;\n return isUserSuppressingHeaderKeyboardEvent(this.gridOptionsWrapper, e, headerRowIndex, column);\n };\n AbstractHeaderWrapper.prototype.getColumn = function () {\n return this.column;\n };\n AbstractHeaderWrapper.prototype.getPinned = function () {\n return this.pinned;\n };\n return AbstractHeaderWrapper;\n}(ManagedFocusComponent));\n\n/**\n * @ag-grid-community/core - Advanced Data Grid / Data Table supporting Javascript / React / AngularJS / Web Components\n * @version v25.1.0\n * @link http://www.ag-grid.com/\n * @license MIT\n */\nvar __extends$R = (undefined && undefined.__extends) || (function () {\n var extendStatics = function (d, b) {\n extendStatics = Object.setPrototypeOf ||\n ({ __proto__: [] } instanceof Array && function (d, b) { d.__proto__ = b; }) ||\n function (d, b) { for (var p in b) if (b.hasOwnProperty(p)) d[p] = b[p]; };\n return extendStatics(d, b);\n };\n return function (d, b) {\n extendStatics(d, b);\n function __() { this.constructor = d; }\n d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __());\n };\n})();\nvar __decorate$I = (undefined && undefined.__decorate) || function (decorators, target, key, desc) {\n var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d;\n if (typeof Reflect === \"object\" && typeof Reflect.decorate === \"function\") r = Reflect.decorate(decorators, target, key, desc);\n else for (var i = decorators.length - 1; i >= 0; i--) if (d = decorators[i]) r = (c < 3 ? d(r) : c > 3 ? d(target, key, r) : d(target, key)) || r;\n return c > 3 && r && Object.defineProperty(target, key, r), r;\n};\nvar HeaderWrapperComp = /** @class */ (function (_super) {\n __extends$R(HeaderWrapperComp, _super);\n function HeaderWrapperComp(column, pinned) {\n var _this = _super.call(this, HeaderWrapperComp.TEMPLATE) || this;\n _this.headerCompVersion = 0;\n _this.refreshFunctions = [];\n _this.column = column;\n _this.pinned = pinned;\n return _this;\n }\n HeaderWrapperComp.prototype.postConstruct = function () {\n _super.prototype.postConstruct.call(this);\n this.colDefVersion = this.columnController.getColDefVersion();\n this.updateState();\n this.setupWidth();\n this.setupMovingCss();\n this.setupTooltip();\n this.setupResize();\n this.setupMenuClass();\n this.setupSortableClass();\n this.addColumnHoverListener();\n this.addActiveHeaderMouseListeners();\n this.createManagedBean(new HoverFeature([this.column], this.getGui()));\n this.addManagedListener(this.column, Column.EVENT_FILTER_ACTIVE_CHANGED, this.onFilterChanged.bind(this));\n this.onFilterChanged();\n this.createManagedBean(new SelectAllFeature(this.cbSelectAll, this.column));\n this.cbSelectAll.setParentComponent(this);\n this.createManagedBean(new SetLeftFeature(this.column, this.getGui(), this.beans));\n this.addAttributes();\n CssClassApplier.addHeaderClassesFromColDef(this.column.getColDef(), this.getGui(), this.gridOptionsWrapper, this.column, null);\n this.addManagedListener(this.eventService, Events.EVENT_NEW_COLUMNS_LOADED, this.onNewColumnsLoaded.bind(this));\n this.addManagedListener(this.eventService, Events.EVENT_COLUMN_VALUE_CHANGED, this.onColumnValueChanged.bind(this));\n this.addManagedListener(this.eventService, Events.EVENT_COLUMN_ROW_GROUP_CHANGED, this.onColumnRowGroupChanged.bind(this));\n this.addManagedListener(this.eventService, Events.EVENT_COLUMN_PIVOT_CHANGED, this.onColumnPivotChanged.bind(this));\n this.appendHeaderComp();\n };\n HeaderWrapperComp.prototype.onColumnRowGroupChanged = function () {\n this.checkDisplayName();\n };\n HeaderWrapperComp.prototype.onColumnPivotChanged = function () {\n this.checkDisplayName();\n };\n HeaderWrapperComp.prototype.onColumnValueChanged = function () {\n this.checkDisplayName();\n };\n HeaderWrapperComp.prototype.checkDisplayName = function () {\n // display name can change if aggFunc different, eg sum(Gold) is now max(Gold)\n if (this.displayName !== this.calculateDisplayName()) {\n this.refresh();\n }\n };\n HeaderWrapperComp.prototype.updateState = function () {\n var colDef = this.column.getColDef();\n this.sortable = colDef.sortable;\n this.displayName = this.calculateDisplayName();\n this.draggable = this.workOutDraggable();\n };\n HeaderWrapperComp.prototype.calculateDisplayName = function () {\n return this.columnController.getDisplayNameForColumn(this.column, 'header', true);\n };\n HeaderWrapperComp.prototype.onNewColumnsLoaded = function () {\n var colDefVersionNow = this.columnController.getColDefVersion();\n if (colDefVersionNow != this.colDefVersion) {\n this.colDefVersion = colDefVersionNow;\n this.refresh();\n }\n };\n HeaderWrapperComp.prototype.refresh = function () {\n this.updateState();\n var colDef = this.column.getColDef();\n var newHeaderCompConfigured = this.colDefHeaderComponent != colDef.headerComponent\n || this.colDefHeaderComponentFramework != colDef.headerComponentFramework;\n var headerCompRefreshed = newHeaderCompConfigured ? false : this.attemptHeaderCompRefresh();\n if (headerCompRefreshed) {\n var dragSourceIsMissing = this.draggable && !this.moveDragSource;\n var dragSourceNeedsRemoving = !this.draggable && this.moveDragSource;\n if (dragSourceIsMissing || dragSourceNeedsRemoving) {\n this.attachDraggingToHeaderComp();\n }\n }\n else {\n this.appendHeaderComp();\n }\n this.refreshFunctions.forEach(function (f) { return f(); });\n };\n HeaderWrapperComp.prototype.destroyHeaderComp = function () {\n if (this.headerComp) {\n this.getGui().removeChild(this.headerCompGui);\n this.headerComp = this.destroyBean(this.headerComp);\n this.headerCompGui = undefined;\n }\n this.removeMoveDragSource();\n };\n HeaderWrapperComp.prototype.removeMoveDragSource = function () {\n if (this.moveDragSource) {\n this.dragAndDropService.removeDragSource(this.moveDragSource);\n this.moveDragSource = undefined;\n }\n };\n HeaderWrapperComp.prototype.attemptHeaderCompRefresh = function () {\n // if no header comp created yet, it's cos of async creation, so first version is yet\n // to get here, in which case we return true to say 'no need to refresh'.\n if (!this.headerComp) {\n return true;\n }\n // if no refresh method, then we want to replace the headerComp\n if (!this.headerComp.refresh) {\n return false;\n }\n // if the cell renderer has a refresh method, we call this instead of doing a refresh\n var params = this.createParams();\n // take any custom params off of the user\n var finalParams = this.userComponentFactory.createFinalParams(this.getComponentHolder(), 'headerComponent', params);\n var res = this.headerComp.refresh(finalParams);\n return res;\n };\n HeaderWrapperComp.prototype.addActiveHeaderMouseListeners = function () {\n var _this = this;\n var listener = function (e) { return _this.setActiveHeader(e.type === 'mouseenter'); };\n this.addManagedListener(this.getGui(), 'mouseenter', listener);\n this.addManagedListener(this.getGui(), 'mouseleave', listener);\n };\n HeaderWrapperComp.prototype.setActiveHeader = function (active) {\n addOrRemoveCssClass(this.getGui(), 'ag-header-active', active);\n };\n HeaderWrapperComp.prototype.onFocusIn = function (e) {\n if (!this.getGui().contains(e.relatedTarget)) {\n var headerRow = this.getParentComponent();\n this.focusController.setFocusedHeader(headerRow.getRowIndex(), this.getColumn());\n }\n this.setActiveHeader(true);\n };\n HeaderWrapperComp.prototype.onFocusOut = function (e) {\n if (this.getGui().contains(e.relatedTarget)) {\n return;\n }\n this.setActiveHeader(false);\n };\n HeaderWrapperComp.prototype.handleKeyDown = function (e) {\n var headerComp = this.headerComp;\n if (!headerComp) {\n return;\n }\n if (e.keyCode === KeyCode.SPACE) {\n var checkbox = this.cbSelectAll;\n if (checkbox.isDisplayed() && !checkbox.getGui().contains(document.activeElement)) {\n e.preventDefault();\n checkbox.setValue(!checkbox.getValue());\n }\n }\n if (e.keyCode === KeyCode.ENTER) {\n if (e.ctrlKey || e.metaKey) {\n if (this.menuEnabled && headerComp.showMenu) {\n e.preventDefault();\n headerComp.showMenu();\n }\n }\n else if (this.sortable) {\n var multiSort = e.shiftKey;\n this.sortController.progressSort(this.column, multiSort, \"uiColumnSorted\");\n }\n }\n };\n HeaderWrapperComp.prototype.onTabKeyDown = function () { };\n HeaderWrapperComp.prototype.getComponentHolder = function () {\n return this.column.getColDef();\n };\n HeaderWrapperComp.prototype.addColumnHoverListener = function () {\n this.addManagedListener(this.eventService, Events.EVENT_COLUMN_HOVER_CHANGED, this.onColumnHover.bind(this));\n this.onColumnHover();\n };\n HeaderWrapperComp.prototype.onColumnHover = function () {\n var isHovered = this.columnHoverService.isHovered(this.column);\n addOrRemoveCssClass(this.getGui(), 'ag-column-hover', isHovered);\n };\n HeaderWrapperComp.prototype.setupSortableClass = function () {\n var _this = this;\n var eGui = this.getGui();\n var updateSortableCssClass = function () {\n addOrRemoveCssClass(eGui, 'ag-header-cell-sortable', !!_this.sortable);\n };\n var updateAriaSort = function () {\n if (_this.sortable) {\n setAriaSort(eGui, getAriaSortState(_this.column));\n }\n else {\n removeAriaSort(eGui);\n }\n };\n updateSortableCssClass();\n updateAriaSort();\n this.refreshFunctions.push(updateSortableCssClass);\n this.refreshFunctions.push(updateAriaSort);\n this.addManagedListener(this.column, Column.EVENT_SORT_CHANGED, updateAriaSort.bind(this));\n };\n HeaderWrapperComp.prototype.onFilterChanged = function () {\n var filterPresent = this.column.isFilterActive();\n addOrRemoveCssClass(this.getGui(), 'ag-header-cell-filtered', filterPresent);\n };\n HeaderWrapperComp.prototype.appendHeaderComp = function () {\n this.headerCompVersion++;\n var colDef = this.column.getColDef();\n this.colDefHeaderComponent = colDef.headerComponent;\n this.colDefHeaderComponentFramework = colDef.headerComponentFramework;\n var params = this.createParams();\n var callback = this.afterHeaderCompCreated.bind(this, this.headerCompVersion);\n this.userComponentFactory.newHeaderComponent(params).then(callback);\n };\n HeaderWrapperComp.prototype.createParams = function () {\n var _this = this;\n var colDef = this.column.getColDef();\n this.menuEnabled = this.menuFactory.isMenuEnabled(this.column) && !colDef.suppressMenu;\n var params = {\n column: this.column,\n displayName: this.displayName,\n enableSorting: colDef.sortable,\n enableMenu: this.menuEnabled,\n showColumnMenu: function (source) {\n _this.gridApi.showColumnMenuAfterButtonClick(_this.column, source);\n },\n progressSort: function (multiSort) {\n _this.sortController.progressSort(_this.column, !!multiSort, \"uiColumnSorted\");\n },\n setSort: function (sort, multiSort) {\n _this.sortController.setSortForColumn(_this.column, sort, !!multiSort, \"uiColumnSorted\");\n },\n api: this.gridApi,\n columnApi: this.columnApi,\n context: this.gridOptionsWrapper.getContext(),\n eGridHeader: this.getGui()\n };\n return params;\n };\n HeaderWrapperComp.prototype.afterHeaderCompCreated = function (version, headerComp) {\n if (version != this.headerCompVersion || !this.isAlive()) {\n this.destroyBean(headerComp);\n return;\n }\n this.destroyHeaderComp();\n this.headerComp = headerComp;\n this.headerCompGui = headerComp.getGui();\n this.getGui().appendChild(this.headerCompGui);\n this.attachDraggingToHeaderComp();\n };\n HeaderWrapperComp.prototype.onColumnMovingChanged = function () {\n // this function adds or removes the moving css, based on if the col is moving.\n // this is what makes the header go dark when it is been moved (gives impression to\n // user that the column was picked up).\n if (this.column.isMoving()) {\n addCssClass(this.getGui(), 'ag-header-cell-moving');\n }\n else {\n removeCssClass(this.getGui(), 'ag-header-cell-moving');\n }\n };\n HeaderWrapperComp.prototype.workOutDraggable = function () {\n var colDef = this.column.getColDef();\n var isSuppressMovableColumns = this.gridOptionsWrapper.isSuppressMovableColumns();\n var colCanMove = !isSuppressMovableColumns && !colDef.suppressMovable && !colDef.lockPosition;\n // we should still be allowed drag the column, even if it can't be moved, if the column\n // can be dragged to a rowGroup or pivot drop zone\n return !!colCanMove || !!colDef.enableRowGroup || !!colDef.enablePivot;\n };\n HeaderWrapperComp.prototype.attachDraggingToHeaderComp = function () {\n var _this = this;\n this.removeMoveDragSource();\n if (!this.draggable) {\n return;\n }\n this.moveDragSource = {\n type: exports.DragSourceType.HeaderCell,\n eElement: this.headerCompGui,\n defaultIconName: DragAndDropService.ICON_HIDE,\n getDragItem: function () { return _this.createDragItem(); },\n dragItemName: this.displayName,\n onDragStarted: function () { return _this.column.setMoving(true, \"uiColumnMoved\"); },\n onDragStopped: function () { return _this.column.setMoving(false, \"uiColumnMoved\"); }\n };\n this.dragAndDropService.addDragSource(this.moveDragSource, true);\n };\n HeaderWrapperComp.prototype.createDragItem = function () {\n var visibleState = {};\n visibleState[this.column.getId()] = this.column.isVisible();\n return {\n columns: [this.column],\n visibleState: visibleState\n };\n };\n HeaderWrapperComp.prototype.setupResize = function () {\n var _this = this;\n var colDef = this.getComponentHolder();\n var destroyResizeFuncs = [];\n var canResize;\n var canAutosize;\n var addResize = function () {\n setDisplayed(_this.eResize, canResize);\n if (!canResize) {\n return;\n }\n var finishedWithResizeFunc = _this.horizontalResizeService.addResizeBar({\n eResizeBar: _this.eResize,\n onResizeStart: _this.onResizeStart.bind(_this),\n onResizing: _this.onResizing.bind(_this, false),\n onResizeEnd: _this.onResizing.bind(_this, true)\n });\n destroyResizeFuncs.push(finishedWithResizeFunc);\n if (canAutosize) {\n var skipHeaderOnAutoSize_1 = _this.gridOptionsWrapper.isSkipHeaderOnAutoSize();\n var autoSizeColListener_1 = function () {\n _this.columnController.autoSizeColumn(_this.column, skipHeaderOnAutoSize_1, \"uiColumnResized\");\n };\n _this.eResize.addEventListener('dblclick', autoSizeColListener_1);\n var touchListener_1 = new TouchListener(_this.eResize);\n touchListener_1.addEventListener(TouchListener.EVENT_DOUBLE_TAP, autoSizeColListener_1);\n _this.addDestroyFunc(function () {\n _this.eResize.removeEventListener('dblclick', autoSizeColListener_1);\n touchListener_1.removeEventListener(TouchListener.EVENT_DOUBLE_TAP, autoSizeColListener_1);\n touchListener_1.destroy();\n });\n }\n };\n var removeResize = function () {\n destroyResizeFuncs.forEach(function (f) { return f(); });\n destroyResizeFuncs.length = 0;\n };\n var refresh = function () {\n var resize = _this.column.isResizable();\n var autoSize = !_this.gridOptionsWrapper.isSuppressAutoSize() && !colDef.suppressAutoSize;\n var propertyChange = resize !== canResize || autoSize !== canAutosize;\n if (propertyChange) {\n canResize = resize;\n canAutosize = autoSize;\n removeResize();\n addResize();\n }\n };\n refresh();\n this.addDestroyFunc(removeResize);\n this.refreshFunctions.push(refresh);\n };\n HeaderWrapperComp.prototype.onResizing = function (finished, resizeAmount) {\n var resizeAmountNormalised = this.normaliseResizeAmount(resizeAmount);\n var columnWidths = [{ key: this.column, newWidth: this.resizeStartWidth + resizeAmountNormalised }];\n this.columnController.setColumnWidths(columnWidths, this.resizeWithShiftKey, finished, \"uiColumnDragged\");\n if (finished) {\n removeCssClass(this.getGui(), 'ag-column-resizing');\n }\n };\n HeaderWrapperComp.prototype.onResizeStart = function (shiftKey) {\n this.resizeStartWidth = this.column.getActualWidth();\n this.resizeWithShiftKey = shiftKey;\n addCssClass(this.getGui(), 'ag-column-resizing');\n };\n HeaderWrapperComp.prototype.getTooltipParams = function () {\n var res = _super.prototype.getTooltipParams.call(this);\n res.location = 'header';\n res.colDef = this.column.getColDef();\n return res;\n };\n HeaderWrapperComp.prototype.setupTooltip = function () {\n var _this = this;\n var refresh = function () {\n var newTooltipText = _this.column.getColDef().headerTooltip;\n _this.setTooltip(newTooltipText);\n };\n refresh();\n this.refreshFunctions.push(refresh);\n };\n HeaderWrapperComp.prototype.setupMovingCss = function () {\n this.addManagedListener(this.column, Column.EVENT_MOVING_CHANGED, this.onColumnMovingChanged.bind(this));\n this.onColumnMovingChanged();\n };\n HeaderWrapperComp.prototype.addAttributes = function () {\n this.getGui().setAttribute(\"col-id\", this.column.getColId());\n };\n HeaderWrapperComp.prototype.setupWidth = function () {\n this.addManagedListener(this.column, Column.EVENT_WIDTH_CHANGED, this.onColumnWidthChanged.bind(this));\n this.onColumnWidthChanged();\n };\n HeaderWrapperComp.prototype.setupMenuClass = function () {\n this.addManagedListener(this.column, Column.EVENT_MENU_VISIBLE_CHANGED, this.onMenuVisible.bind(this));\n };\n HeaderWrapperComp.prototype.onMenuVisible = function () {\n this.addOrRemoveCssClass('ag-column-menu-visible', this.column.isMenuVisible());\n };\n HeaderWrapperComp.prototype.onColumnWidthChanged = function () {\n this.getGui().style.width = this.column.getActualWidth() + 'px';\n };\n // optionally inverts the drag, depending on pinned and RTL\n // note - this method is duplicated in RenderedHeaderGroupCell - should refactor out?\n HeaderWrapperComp.prototype.normaliseResizeAmount = function (dragChange) {\n var result = dragChange;\n if (this.gridOptionsWrapper.isEnableRtl()) {\n // for RTL, dragging left makes the col bigger, except when pinning left\n if (this.pinned !== Constants.PINNED_LEFT) {\n result *= -1;\n }\n }\n else {\n // for LTR (ie normal), dragging left makes the col smaller, except when pinning right\n if (this.pinned === Constants.PINNED_RIGHT) {\n result *= -1;\n }\n }\n return result;\n };\n HeaderWrapperComp.TEMPLATE = \"
\\n
\\n \\n
\";\n __decorate$I([\n Autowired('dragAndDropService')\n ], HeaderWrapperComp.prototype, \"dragAndDropService\", void 0);\n __decorate$I([\n Autowired('columnController')\n ], HeaderWrapperComp.prototype, \"columnController\", void 0);\n __decorate$I([\n Autowired('horizontalResizeService')\n ], HeaderWrapperComp.prototype, \"horizontalResizeService\", void 0);\n __decorate$I([\n Autowired('menuFactory')\n ], HeaderWrapperComp.prototype, \"menuFactory\", void 0);\n __decorate$I([\n Autowired('gridApi')\n ], HeaderWrapperComp.prototype, \"gridApi\", void 0);\n __decorate$I([\n Autowired('columnApi')\n ], HeaderWrapperComp.prototype, \"columnApi\", void 0);\n __decorate$I([\n Autowired('sortController')\n ], HeaderWrapperComp.prototype, \"sortController\", void 0);\n __decorate$I([\n Autowired('userComponentFactory')\n ], HeaderWrapperComp.prototype, \"userComponentFactory\", void 0);\n __decorate$I([\n Autowired('columnHoverService')\n ], HeaderWrapperComp.prototype, \"columnHoverService\", void 0);\n __decorate$I([\n Autowired('beans')\n ], HeaderWrapperComp.prototype, \"beans\", void 0);\n __decorate$I([\n RefSelector('eResize')\n ], HeaderWrapperComp.prototype, \"eResize\", void 0);\n __decorate$I([\n RefSelector('cbSelectAll')\n ], HeaderWrapperComp.prototype, \"cbSelectAll\", void 0);\n __decorate$I([\n PreDestroy\n ], HeaderWrapperComp.prototype, \"destroyHeaderComp\", null);\n return HeaderWrapperComp;\n}(AbstractHeaderWrapper));\n\n/**\n * @ag-grid-community/core - Advanced Data Grid / Data Table supporting Javascript / React / AngularJS / Web Components\n * @version v25.1.0\n * @link http://www.ag-grid.com/\n * @license MIT\n */\nvar __extends$S = (undefined && undefined.__extends) || (function () {\n var extendStatics = function (d, b) {\n extendStatics = Object.setPrototypeOf ||\n ({ __proto__: [] } instanceof Array && function (d, b) { d.__proto__ = b; }) ||\n function (d, b) { for (var p in b) if (b.hasOwnProperty(p)) d[p] = b[p]; };\n return extendStatics(d, b);\n };\n return function (d, b) {\n extendStatics(d, b);\n function __() { this.constructor = d; }\n d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __());\n };\n})();\nvar __decorate$J = (undefined && undefined.__decorate) || function (decorators, target, key, desc) {\n var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d;\n if (typeof Reflect === \"object\" && typeof Reflect.decorate === \"function\") r = Reflect.decorate(decorators, target, key, desc);\n else for (var i = decorators.length - 1; i >= 0; i--) if (d = decorators[i]) r = (c < 3 ? d(r) : c > 3 ? d(target, key, r) : d(target, key)) || r;\n return c > 3 && r && Object.defineProperty(target, key, r), r;\n};\nvar HeaderGroupWrapperComp = /** @class */ (function (_super) {\n __extends$S(HeaderGroupWrapperComp, _super);\n function HeaderGroupWrapperComp(columnGroup, pinned) {\n var _this = _super.call(this, HeaderGroupWrapperComp.TEMPLATE) || this;\n // the children can change, we keep destroy functions related to listening to the children here\n _this.removeChildListenersFuncs = [];\n _this.column = columnGroup;\n _this.pinned = pinned;\n return _this;\n }\n HeaderGroupWrapperComp.prototype.postConstruct = function () {\n _super.prototype.postConstruct.call(this);\n CssClassApplier.addHeaderClassesFromColDef(this.getComponentHolder(), this.getGui(), this.gridOptionsWrapper, null, this.column);\n var displayName = this.columnController.getDisplayNameForColumnGroup(this.column, 'header');\n this.appendHeaderGroupComp(displayName);\n this.setupResize();\n this.addClasses();\n this.setupWidth();\n this.addAttributes();\n this.setupMovingCss();\n this.setupTooltip();\n this.setupExpandable();\n this.createManagedBean(new HoverFeature(this.column.getOriginalColumnGroup().getLeafColumns(), this.getGui()));\n this.createManagedBean(new SetLeftFeature(this.column, this.getGui(), this.beans));\n };\n HeaderGroupWrapperComp.prototype.onFocusIn = function (e) {\n if (!this.getGui().contains(e.relatedTarget)) {\n var headerRow = this.getParentComponent();\n this.beans.focusController.setFocusedHeader(headerRow.getRowIndex(), this.getColumn());\n }\n };\n HeaderGroupWrapperComp.prototype.handleKeyDown = function (e) {\n var activeEl = document.activeElement;\n var eGui = this.getGui();\n var wrapperHasFocus = activeEl === eGui;\n if (!this.expandable || !wrapperHasFocus) {\n return;\n }\n if (e.keyCode === KeyCode.ENTER) {\n var column = this.getColumn();\n var newExpandedValue = !column.isExpanded();\n this.columnController.setColumnGroupOpened(column.getOriginalColumnGroup(), newExpandedValue, \"uiColumnExpanded\");\n }\n };\n HeaderGroupWrapperComp.prototype.onTabKeyDown = function () { };\n HeaderGroupWrapperComp.prototype.setupExpandable = function () {\n var column = this.getColumn();\n var originalColumnGroup = column.getOriginalColumnGroup();\n this.refreshExpanded();\n this.addManagedListener(originalColumnGroup, OriginalColumnGroup.EVENT_EXPANDABLE_CHANGED, this.refreshExpanded.bind(this));\n this.addManagedListener(originalColumnGroup, OriginalColumnGroup.EVENT_EXPANDED_CHANGED, this.refreshExpanded.bind(this));\n };\n HeaderGroupWrapperComp.prototype.refreshExpanded = function () {\n var column = this.getColumn();\n var eGui = this.getGui();\n var expandable = column.isExpandable();\n var expanded = column.isExpanded();\n this.expandable = expandable;\n if (!expandable) {\n eGui.removeAttribute('aria-expanded');\n }\n else {\n setAriaExpanded(eGui, expanded);\n }\n };\n HeaderGroupWrapperComp.prototype.setupMovingCss = function () {\n var _this = this;\n var originalColumnGroup = this.column.getOriginalColumnGroup();\n var leafColumns = originalColumnGroup.getLeafColumns();\n leafColumns.forEach(function (col) {\n _this.addManagedListener(col, Column.EVENT_MOVING_CHANGED, _this.onColumnMovingChanged.bind(_this));\n });\n this.onColumnMovingChanged();\n };\n HeaderGroupWrapperComp.prototype.getComponentHolder = function () {\n return this.column.getColGroupDef();\n };\n HeaderGroupWrapperComp.prototype.getTooltipParams = function () {\n var res = _super.prototype.getTooltipParams.call(this);\n res.location = 'headerGroup';\n // this is wrong, but leaving it as i don't want to change code,\n // but the ColumnGroup does not have a ColDef or a Column (although it does have GroupDef and ColumnGroup)\n res.colDef = this.getComponentHolder();\n res.column = this.getColumn();\n return res;\n };\n HeaderGroupWrapperComp.prototype.setupTooltip = function () {\n var colGroupDef = this.getComponentHolder();\n var tooltipText = colGroupDef && colGroupDef.headerTooltip;\n if (tooltipText != null) {\n this.setTooltip(tooltipText);\n }\n };\n HeaderGroupWrapperComp.prototype.onColumnMovingChanged = function () {\n // this function adds or removes the moving css, based on if the col is moving.\n // this is what makes the header go dark when it is been moved (gives impression to\n // user that the column was picked up).\n addOrRemoveCssClass(this.getGui(), 'ag-header-cell-moving', this.column.isMoving());\n };\n HeaderGroupWrapperComp.prototype.addAttributes = function () {\n this.getGui().setAttribute(\"col-id\", this.column.getUniqueId());\n };\n HeaderGroupWrapperComp.prototype.appendHeaderGroupComp = function (displayName) {\n var _this = this;\n var params = {\n displayName: displayName,\n columnGroup: this.column,\n setExpanded: function (expanded) {\n _this.columnController.setColumnGroupOpened(_this.column.getOriginalColumnGroup(), expanded, \"gridInitializing\");\n },\n api: this.gridApi,\n columnApi: this.columnApi,\n context: this.gridOptionsWrapper.getContext()\n };\n if (!displayName) {\n var columnGroup = this.column;\n var leafCols = columnGroup.getLeafColumns();\n // find the top most column group that represents the same columns. so if we are dragging a group, we also\n // want to visually show the parent groups dragging for the same column set. for example imaging 5 levels\n // of grouping, with each group only containing the next group, and the last group containing three columns,\n // then when you move any group (even the lowest level group) you are in-fact moving all the groups, as all\n // the groups represent the same column set.\n while (columnGroup.getParent() && columnGroup.getParent().getLeafColumns().length === leafCols.length) {\n columnGroup = columnGroup.getParent();\n }\n var colGroupDef = columnGroup.getColGroupDef();\n if (colGroupDef) {\n displayName = colGroupDef.headerName;\n }\n if (!displayName) {\n displayName = leafCols ? this.columnController.getDisplayNameForColumn(leafCols[0], 'header', true) : '';\n }\n }\n var callback = this.afterHeaderCompCreated.bind(this, displayName);\n this.userComponentFactory.newHeaderGroupComponent(params).then(callback);\n };\n HeaderGroupWrapperComp.prototype.afterHeaderCompCreated = function (displayName, headerGroupComp) {\n var _this = this;\n this.getGui().appendChild(headerGroupComp.getGui());\n this.addDestroyFunc(function () {\n _this.getContext().destroyBean(headerGroupComp);\n });\n this.setupMove(headerGroupComp.getGui(), displayName);\n };\n HeaderGroupWrapperComp.prototype.addClasses = function () {\n // having different classes below allows the style to not have a bottom border\n // on the group header, if no group is specified\n // columnGroup.getColGroupDef\n var style = this.column.isPadding() ? 'no' : 'with';\n this.addCssClass(\"ag-header-group-cell-\" + style + \"-group\");\n };\n HeaderGroupWrapperComp.prototype.setupMove = function (eHeaderGroup, displayName) {\n var _this = this;\n if (!eHeaderGroup) {\n return;\n }\n if (this.isSuppressMoving()) {\n return;\n }\n var allLeafColumns = this.column.getOriginalColumnGroup().getLeafColumns();\n var dragSource = {\n type: exports.DragSourceType.HeaderCell,\n eElement: eHeaderGroup,\n defaultIconName: DragAndDropService.ICON_HIDE,\n dragItemName: displayName,\n // we add in the original group leaf columns, so we move both visible and non-visible items\n getDragItem: this.getDragItemForGroup.bind(this),\n onDragStarted: function () { return allLeafColumns.forEach(function (col) { return col.setMoving(true, \"uiColumnDragged\"); }); },\n onDragStopped: function () { return allLeafColumns.forEach(function (col) { return col.setMoving(false, \"uiColumnDragged\"); }); }\n };\n this.dragAndDropService.addDragSource(dragSource, true);\n this.addDestroyFunc(function () { return _this.dragAndDropService.removeDragSource(dragSource); });\n };\n // when moving the columns, we want to move all the columns (contained within the DragItem) in this group in one go,\n // and in the order they are currently in the screen.\n HeaderGroupWrapperComp.prototype.getDragItemForGroup = function () {\n var allColumnsOriginalOrder = this.column.getOriginalColumnGroup().getLeafColumns();\n // capture visible state, used when re-entering grid to dictate which columns should be visible\n var visibleState = {};\n allColumnsOriginalOrder.forEach(function (column) { return visibleState[column.getId()] = column.isVisible(); });\n var allColumnsCurrentOrder = [];\n this.columnController.getAllDisplayedColumns().forEach(function (column) {\n if (allColumnsOriginalOrder.indexOf(column) >= 0) {\n allColumnsCurrentOrder.push(column);\n removeFromArray(allColumnsOriginalOrder, column);\n }\n });\n // we are left with non-visible columns, stick these in at the end\n allColumnsOriginalOrder.forEach(function (column) { return allColumnsCurrentOrder.push(column); });\n // create and return dragItem\n return {\n columns: allColumnsCurrentOrder,\n visibleState: visibleState\n };\n };\n HeaderGroupWrapperComp.prototype.isSuppressMoving = function () {\n // if any child is fixed, then don't allow moving\n var childSuppressesMoving = false;\n this.column.getLeafColumns().forEach(function (column) {\n if (column.getColDef().suppressMovable || column.getColDef().lockPosition) {\n childSuppressesMoving = true;\n }\n });\n var result = childSuppressesMoving || this.gridOptionsWrapper.isSuppressMovableColumns();\n return result;\n };\n HeaderGroupWrapperComp.prototype.setupWidth = function () {\n // we need to listen to changes in child columns, as they impact our width\n this.addListenersToChildrenColumns();\n // the children belonging to this group can change, so we need to add and remove listeners as they change\n this.addManagedListener(this.column, ColumnGroup.EVENT_DISPLAYED_CHILDREN_CHANGED, this.onDisplayedChildrenChanged.bind(this));\n this.onWidthChanged();\n // the child listeners are not tied to this components life-cycle, as children can get added and removed\n // to the group - hence they are on a different life-cycle. so we must make sure the existing children\n // listeners are removed when we finally get destroyed\n this.addDestroyFunc(this.removeListenersOnChildrenColumns.bind(this));\n };\n HeaderGroupWrapperComp.prototype.onDisplayedChildrenChanged = function () {\n this.addListenersToChildrenColumns();\n this.onWidthChanged();\n };\n HeaderGroupWrapperComp.prototype.addListenersToChildrenColumns = function () {\n var _this = this;\n // first destroy any old listeners\n this.removeListenersOnChildrenColumns();\n // now add new listeners to the new set of children\n var widthChangedListener = this.onWidthChanged.bind(this);\n this.column.getLeafColumns().forEach(function (column) {\n column.addEventListener(Column.EVENT_WIDTH_CHANGED, widthChangedListener);\n column.addEventListener(Column.EVENT_VISIBLE_CHANGED, widthChangedListener);\n _this.removeChildListenersFuncs.push(function () {\n column.removeEventListener(Column.EVENT_WIDTH_CHANGED, widthChangedListener);\n column.removeEventListener(Column.EVENT_VISIBLE_CHANGED, widthChangedListener);\n });\n });\n };\n HeaderGroupWrapperComp.prototype.removeListenersOnChildrenColumns = function () {\n this.removeChildListenersFuncs.forEach(function (func) { return func(); });\n this.removeChildListenersFuncs = [];\n };\n HeaderGroupWrapperComp.prototype.onWidthChanged = function () {\n this.getGui().style.width = this.column.getActualWidth() + 'px';\n };\n HeaderGroupWrapperComp.prototype.setupResize = function () {\n var _this = this;\n this.eHeaderCellResize = this.getRefElement('agResize');\n if (!this.column.isResizable()) {\n removeFromParent(this.eHeaderCellResize);\n return;\n }\n var finishedWithResizeFunc = this.horizontalResizeService.addResizeBar({\n eResizeBar: this.eHeaderCellResize,\n onResizeStart: this.onResizeStart.bind(this),\n onResizing: this.onResizing.bind(this, false),\n onResizeEnd: this.onResizing.bind(this, true)\n });\n this.addDestroyFunc(finishedWithResizeFunc);\n if (!this.gridOptionsWrapper.isSuppressAutoSize()) {\n var skipHeaderOnAutoSize_1 = this.gridOptionsWrapper.isSkipHeaderOnAutoSize();\n this.eHeaderCellResize.addEventListener('dblclick', function (event) {\n // get list of all the column keys we are responsible for\n var keys = [];\n _this.column.getDisplayedLeafColumns().forEach(function (column) {\n // not all cols in the group may be participating with auto-resize\n if (!column.getColDef().suppressAutoSize) {\n keys.push(column.getColId());\n }\n });\n if (keys.length > 0) {\n _this.columnController.autoSizeColumns(keys, skipHeaderOnAutoSize_1, \"uiColumnResized\");\n }\n });\n }\n };\n HeaderGroupWrapperComp.prototype.onResizeStart = function (shiftKey) {\n var _this = this;\n var leafCols = this.column.getDisplayedLeafColumns();\n this.resizeCols = leafCols.filter(function (col) { return col.isResizable(); });\n this.resizeStartWidth = 0;\n this.resizeCols.forEach(function (col) { return _this.resizeStartWidth += col.getActualWidth(); });\n this.resizeRatios = [];\n this.resizeCols.forEach(function (col) { return _this.resizeRatios.push(col.getActualWidth() / _this.resizeStartWidth); });\n var takeFromGroup = null;\n if (shiftKey) {\n takeFromGroup = this.columnController.getDisplayedGroupAfter(this.column);\n }\n if (takeFromGroup) {\n var takeFromLeafCols = takeFromGroup.getDisplayedLeafColumns();\n this.resizeTakeFromCols = takeFromLeafCols.filter(function (col) { return col.isResizable(); });\n this.resizeTakeFromStartWidth = 0;\n this.resizeTakeFromCols.forEach(function (col) { return _this.resizeTakeFromStartWidth += col.getActualWidth(); });\n this.resizeTakeFromRatios = [];\n this.resizeTakeFromCols.forEach(function (col) { return _this.resizeTakeFromRatios.push(col.getActualWidth() / _this.resizeTakeFromStartWidth); });\n }\n else {\n this.resizeTakeFromCols = null;\n this.resizeTakeFromStartWidth = null;\n this.resizeTakeFromRatios = null;\n }\n addCssClass(this.getGui(), 'ag-column-resizing');\n };\n HeaderGroupWrapperComp.prototype.onResizing = function (finished, resizeAmount) {\n var resizeSets = [];\n var resizeAmountNormalised = this.normaliseDragChange(resizeAmount);\n resizeSets.push({\n columns: this.resizeCols,\n ratios: this.resizeRatios,\n width: this.resizeStartWidth + resizeAmountNormalised\n });\n if (this.resizeTakeFromCols) {\n resizeSets.push({\n columns: this.resizeTakeFromCols,\n ratios: this.resizeTakeFromRatios,\n width: this.resizeTakeFromStartWidth - resizeAmountNormalised\n });\n }\n this.columnController.resizeColumnSets(resizeSets, finished, 'uiColumnDragged');\n if (finished) {\n removeCssClass(this.getGui(), 'ag-column-resizing');\n }\n };\n // optionally inverts the drag, depending on pinned and RTL\n // note - this method is duplicated in RenderedHeaderCell - should refactor out?\n HeaderGroupWrapperComp.prototype.normaliseDragChange = function (dragChange) {\n var result = dragChange;\n if (this.gridOptionsWrapper.isEnableRtl()) {\n // for RTL, dragging left makes the col bigger, except when pinning left\n if (this.pinned !== Constants.PINNED_LEFT) {\n result *= -1;\n }\n }\n else if (this.pinned === Constants.PINNED_RIGHT) {\n // for LTR (ie normal), dragging left makes the col smaller, except when pinning right\n result *= -1;\n }\n return result;\n };\n HeaderGroupWrapperComp.TEMPLATE = \"
\\n
\\n
\";\n __decorate$J([\n Autowired('columnController')\n ], HeaderGroupWrapperComp.prototype, \"columnController\", void 0);\n __decorate$J([\n Autowired('horizontalResizeService')\n ], HeaderGroupWrapperComp.prototype, \"horizontalResizeService\", void 0);\n __decorate$J([\n Autowired('dragAndDropService')\n ], HeaderGroupWrapperComp.prototype, \"dragAndDropService\", void 0);\n __decorate$J([\n Autowired('userComponentFactory')\n ], HeaderGroupWrapperComp.prototype, \"userComponentFactory\", void 0);\n __decorate$J([\n Autowired('beans')\n ], HeaderGroupWrapperComp.prototype, \"beans\", void 0);\n __decorate$J([\n Autowired('gridApi')\n ], HeaderGroupWrapperComp.prototype, \"gridApi\", void 0);\n __decorate$J([\n Autowired('columnApi')\n ], HeaderGroupWrapperComp.prototype, \"columnApi\", void 0);\n return HeaderGroupWrapperComp;\n}(AbstractHeaderWrapper));\n\n/**\n * @ag-grid-community/core - Advanced Data Grid / Data Table supporting Javascript / React / AngularJS / Web Components\n * @version v25.1.0\n * @link http://www.ag-grid.com/\n * @license MIT\n */\nvar __extends$T = (undefined && undefined.__extends) || (function () {\n var extendStatics = function (d, b) {\n extendStatics = Object.setPrototypeOf ||\n ({ __proto__: [] } instanceof Array && function (d, b) { d.__proto__ = b; }) ||\n function (d, b) { for (var p in b) if (b.hasOwnProperty(p)) d[p] = b[p]; };\n return extendStatics(d, b);\n };\n return function (d, b) {\n extendStatics(d, b);\n function __() { this.constructor = d; }\n d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __());\n };\n})();\nvar __decorate$K = (undefined && undefined.__decorate) || function (decorators, target, key, desc) {\n var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d;\n if (typeof Reflect === \"object\" && typeof Reflect.decorate === \"function\") r = Reflect.decorate(decorators, target, key, desc);\n else for (var i = decorators.length - 1; i >= 0; i--) if (d = decorators[i]) r = (c < 3 ? d(r) : c > 3 ? d(target, key, r) : d(target, key)) || r;\n return c > 3 && r && Object.defineProperty(target, key, r), r;\n};\n// optional floating filter for user provided filters - instead of providing a floating filter,\n// they can provide a getModelAsString() method on the filter instead. this class just displays\n// the string returned from getModelAsString()\nvar ReadOnlyFloatingFilter = /** @class */ (function (_super) {\n __extends$T(ReadOnlyFloatingFilter, _super);\n function ReadOnlyFloatingFilter() {\n return _super.call(this, /* html */ \"\\n
\\n \\n
\") || this;\n }\n // this is a user component, and IComponent has \"public destroy()\" as part of the interface.\n // so we need to override destroy() just to make the method public.\n ReadOnlyFloatingFilter.prototype.destroy = function () {\n _super.prototype.destroy.call(this);\n };\n ReadOnlyFloatingFilter.prototype.init = function (params) {\n this.params = params;\n var displayName = this.columnController.getDisplayNameForColumn(params.column, 'header', true);\n var translate = this.gridOptionsWrapper.getLocaleTextFunc();\n this.eFloatingFilterText\n .setDisabled(true)\n .setInputAriaLabel(displayName + \" \" + translate('ariaFilterInput', 'Filter Input'));\n };\n ReadOnlyFloatingFilter.prototype.onParentModelChanged = function (parentModel) {\n var _this = this;\n if (!parentModel) {\n this.eFloatingFilterText.setValue('');\n return;\n }\n this.params.parentFilterInstance(function (filterInstance) {\n // getModelAsString should be present, as we check this\n // in floatingFilterWrapper\n if (filterInstance.getModelAsString) {\n var modelAsString = filterInstance.getModelAsString(parentModel);\n _this.eFloatingFilterText.setValue(modelAsString);\n }\n });\n };\n __decorate$K([\n RefSelector('eFloatingFilterText')\n ], ReadOnlyFloatingFilter.prototype, \"eFloatingFilterText\", void 0);\n __decorate$K([\n Autowired('columnController')\n ], ReadOnlyFloatingFilter.prototype, \"columnController\", void 0);\n return ReadOnlyFloatingFilter;\n}(Component));\n\n/**\n * @ag-grid-community/core - Advanced Data Grid / Data Table supporting Javascript / React / AngularJS / Web Components\n * @version v25.1.0\n * @link http://www.ag-grid.com/\n * @license MIT\n */\nvar FloatingFilterMapper = /** @class */ (function () {\n function FloatingFilterMapper() {\n }\n FloatingFilterMapper.getFloatingFilterType = function (filterType) {\n return this.filterToFloatingFilterMapping[filterType];\n };\n FloatingFilterMapper.filterToFloatingFilterMapping = {\n set: 'agSetColumnFloatingFilter',\n agSetColumnFilter: 'agSetColumnFloatingFilter',\n multi: 'agMultiColumnFloatingFilter',\n agMultiColumnFilter: 'agMultiColumnFloatingFilter',\n number: 'agNumberColumnFloatingFilter',\n agNumberColumnFilter: 'agNumberColumnFloatingFilter',\n date: 'agDateColumnFloatingFilter',\n agDateColumnFilter: 'agDateColumnFloatingFilter',\n text: 'agTextColumnFloatingFilter',\n agTextColumnFilter: 'agTextColumnFloatingFilter'\n };\n return FloatingFilterMapper;\n}());\n\n/**\n * @ag-grid-community/core - Advanced Data Grid / Data Table supporting Javascript / React / AngularJS / Web Components\n * @version v25.1.0\n * @link http://www.ag-grid.com/\n * @license MIT\n */\nvar __extends$U = (undefined && undefined.__extends) || (function () {\n var extendStatics = function (d, b) {\n extendStatics = Object.setPrototypeOf ||\n ({ __proto__: [] } instanceof Array && function (d, b) { d.__proto__ = b; }) ||\n function (d, b) { for (var p in b) if (b.hasOwnProperty(p)) d[p] = b[p]; };\n return extendStatics(d, b);\n };\n return function (d, b) {\n extendStatics(d, b);\n function __() { this.constructor = d; }\n d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __());\n };\n})();\nvar __decorate$L = (undefined && undefined.__decorate) || function (decorators, target, key, desc) {\n var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d;\n if (typeof Reflect === \"object\" && typeof Reflect.decorate === \"function\") r = Reflect.decorate(decorators, target, key, desc);\n else for (var i = decorators.length - 1; i >= 0; i--) if (d = decorators[i]) r = (c < 3 ? d(r) : c > 3 ? d(target, key, r) : d(target, key)) || r;\n return c > 3 && r && Object.defineProperty(target, key, r), r;\n};\nvar FloatingFilterWrapper = /** @class */ (function (_super) {\n __extends$U(FloatingFilterWrapper, _super);\n function FloatingFilterWrapper(column, pinned) {\n var _this = _super.call(this, FloatingFilterWrapper.TEMPLATE) || this;\n _this.column = column;\n _this.pinned = pinned;\n return _this;\n }\n FloatingFilterWrapper.prototype.postConstruct = function () {\n _super.prototype.postConstruct.call(this);\n this.setupFloatingFilter();\n this.setupWidth();\n this.setupLeftPositioning();\n this.setupColumnHover();\n this.createManagedBean(new HoverFeature([this.column], this.getGui()));\n this.addManagedListener(this.eButtonShowMainFilter, 'click', this.showParentFilter.bind(this));\n };\n FloatingFilterWrapper.prototype.onTabKeyDown = function (e) {\n var activeEl = document.activeElement;\n var eGui = this.getGui();\n var wrapperHasFocus = activeEl === eGui;\n if (wrapperHasFocus) {\n return;\n }\n e.preventDefault();\n var nextFocusableEl = this.focusController.findNextFocusableElement(eGui, null, e.shiftKey);\n if (nextFocusableEl) {\n nextFocusableEl.focus();\n }\n else {\n eGui.focus();\n }\n };\n FloatingFilterWrapper.prototype.handleKeyDown = function (e) {\n var activeEl = document.activeElement;\n var eGui = this.getGui();\n var wrapperHasFocus = activeEl === eGui;\n switch (e.keyCode) {\n case KeyCode.UP:\n case KeyCode.DOWN:\n if (!wrapperHasFocus) {\n e.preventDefault();\n }\n case KeyCode.LEFT:\n case KeyCode.RIGHT:\n if (wrapperHasFocus) {\n return;\n }\n e.stopPropagation();\n case KeyCode.ENTER:\n if (wrapperHasFocus) {\n if (this.focusController.focusInto(eGui)) {\n e.preventDefault();\n }\n }\n break;\n case KeyCode.ESCAPE:\n if (!wrapperHasFocus) {\n this.getGui().focus();\n }\n }\n };\n FloatingFilterWrapper.prototype.onFocusIn = function (e) {\n var eGui = this.getGui();\n if (!eGui.contains(e.relatedTarget)) {\n var headerRow = this.getParentComponent();\n this.beans.focusController.setFocusedHeader(headerRow.getRowIndex(), this.getColumn());\n }\n };\n FloatingFilterWrapper.prototype.setupFloatingFilter = function () {\n var _this = this;\n var colDef = this.column.getColDef();\n if (!colDef.filter || !colDef.floatingFilter) {\n return;\n }\n this.floatingFilterCompPromise = this.getFloatingFilterInstance();\n if (!this.floatingFilterCompPromise) {\n return;\n }\n this.floatingFilterCompPromise.then(function (compInstance) {\n if (compInstance) {\n _this.setupWithFloatingFilter(compInstance);\n _this.setupSyncWithFilter();\n }\n });\n };\n FloatingFilterWrapper.prototype.setupLeftPositioning = function () {\n var setLeftFeature = new SetLeftFeature(this.column, this.getGui(), this.beans);\n this.createManagedBean(setLeftFeature);\n };\n FloatingFilterWrapper.prototype.setupSyncWithFilter = function () {\n var _this = this;\n var syncWithFilter = function (filterChangedEvent) {\n _this.onParentModelChanged(_this.currentParentModel(), filterChangedEvent);\n };\n this.addManagedListener(this.column, Column.EVENT_FILTER_CHANGED, syncWithFilter);\n if (this.filterManager.isFilterActive(this.column)) {\n syncWithFilter(null);\n }\n };\n // linked to event listener in template\n FloatingFilterWrapper.prototype.showParentFilter = function () {\n var eventSource = this.suppressFilterButton ? this.eFloatingFilterBody : this.eButtonShowMainFilter;\n this.menuFactory.showMenuAfterButtonClick(this.column, eventSource, 'filterMenuTab', ['filterMenuTab']);\n };\n FloatingFilterWrapper.prototype.setupColumnHover = function () {\n this.addManagedListener(this.eventService, Events.EVENT_COLUMN_HOVER_CHANGED, this.onColumnHover.bind(this));\n this.onColumnHover();\n };\n FloatingFilterWrapper.prototype.onColumnHover = function () {\n addOrRemoveCssClass(this.getGui(), 'ag-column-hover', this.columnHoverService.isHovered(this.column));\n };\n FloatingFilterWrapper.prototype.setupWidth = function () {\n this.addManagedListener(this.column, Column.EVENT_WIDTH_CHANGED, this.onColumnWidthChanged.bind(this));\n this.onColumnWidthChanged();\n };\n FloatingFilterWrapper.prototype.onColumnWidthChanged = function () {\n this.getGui().style.width = this.column.getActualWidth() + \"px\";\n };\n FloatingFilterWrapper.prototype.setupWithFloatingFilter = function (floatingFilterComp) {\n var _this = this;\n var disposeFunc = function () {\n _this.getContext().destroyBean(floatingFilterComp);\n };\n if (!this.isAlive()) {\n disposeFunc();\n return;\n }\n this.addDestroyFunc(disposeFunc);\n var floatingFilterCompUi = floatingFilterComp.getGui();\n addOrRemoveCssClass(this.eFloatingFilterBody, 'ag-floating-filter-full-body', this.suppressFilterButton);\n addOrRemoveCssClass(this.eFloatingFilterBody, 'ag-floating-filter-body', !this.suppressFilterButton);\n setDisplayed(this.eButtonWrapper, !this.suppressFilterButton);\n var eIcon = createIconNoSpan('filter', this.gridOptionsWrapper, this.column);\n this.eButtonShowMainFilter.appendChild(eIcon);\n this.eFloatingFilterBody.appendChild(floatingFilterCompUi);\n if (floatingFilterComp.afterGuiAttached) {\n floatingFilterComp.afterGuiAttached();\n }\n };\n FloatingFilterWrapper.prototype.parentFilterInstance = function (callback) {\n var filterComponent = this.getFilterComponent();\n if (filterComponent) {\n filterComponent.then(callback);\n }\n };\n FloatingFilterWrapper.prototype.getFilterComponent = function (createIfDoesNotExist) {\n if (createIfDoesNotExist === void 0) { createIfDoesNotExist = true; }\n return this.filterManager.getFilterComponent(this.column, 'NO_UI', createIfDoesNotExist);\n };\n FloatingFilterWrapper.getDefaultFloatingFilterType = function (def) {\n if (def == null) {\n return null;\n }\n var defaultFloatingFilterType = null;\n if (typeof def.filter === 'string') {\n // will be undefined if not in the map\n defaultFloatingFilterType = FloatingFilterMapper.getFloatingFilterType(def.filter);\n }\n else if (def.filterFramework) ;\n else if (def.filter === true) {\n var setFilterModuleLoaded = ModuleRegistry.isRegistered(exports.ModuleNames.SetFilterModule);\n defaultFloatingFilterType = setFilterModuleLoaded ? 'agSetColumnFloatingFilter' : 'agTextColumnFloatingFilter';\n }\n return defaultFloatingFilterType;\n };\n FloatingFilterWrapper.prototype.getFloatingFilterInstance = function () {\n var colDef = this.column.getColDef();\n var defaultFloatingFilterType = FloatingFilterWrapper.getDefaultFloatingFilterType(colDef);\n var filterParams = this.filterManager.createFilterParams(this.column, colDef);\n var finalFilterParams = this.userComponentFactory.createFinalParams(colDef, 'filter', filterParams);\n var params = {\n api: this.gridApi,\n column: this.column,\n filterParams: finalFilterParams,\n currentParentModel: this.currentParentModel.bind(this),\n parentFilterInstance: this.parentFilterInstance.bind(this),\n showParentFilter: this.showParentFilter.bind(this),\n onFloatingFilterChanged: this.onFloatingFilterChanged.bind(this),\n suppressFilterButton: false // This one might be overridden from the colDef\n };\n // this is unusual - we need a params value OUTSIDE the component the params are for.\n // the params are for the floating filter component, but this property is actually for the wrapper.\n this.suppressFilterButton = colDef.floatingFilterComponentParams ? !!colDef.floatingFilterComponentParams.suppressFilterButton : false;\n var promise = this.userComponentFactory.newFloatingFilterComponent(colDef, params, defaultFloatingFilterType);\n if (!promise) {\n var filterComponent = this.getFilterComponentPrototype(colDef);\n var getModelAsStringExists = filterComponent && filterComponent.prototype && filterComponent.prototype.getModelAsString;\n if (getModelAsStringExists) {\n var compInstance = this.userComponentFactory.createUserComponentFromConcreteClass(ReadOnlyFloatingFilter, params);\n promise = AgPromise.resolve(compInstance);\n }\n }\n return promise;\n };\n FloatingFilterWrapper.prototype.createDynamicParams = function () {\n return {\n column: this.column,\n colDef: this.column.getColDef(),\n api: this.gridApi,\n columnApi: this.columnApi\n };\n };\n FloatingFilterWrapper.prototype.getFilterComponentPrototype = function (colDef) {\n var resolvedComponent = this.userComponentFactory.lookupComponentClassDef(colDef, 'filter', this.createDynamicParams());\n return resolvedComponent ? resolvedComponent.component : null;\n };\n FloatingFilterWrapper.prototype.currentParentModel = function () {\n var filterComponent = this.getFilterComponent(false);\n return filterComponent ? filterComponent.resolveNow(null, function (filter) { return filter && filter.getModel(); }) : null;\n };\n FloatingFilterWrapper.prototype.onParentModelChanged = function (model, filterChangedEvent) {\n if (!this.floatingFilterCompPromise) {\n return;\n }\n this.floatingFilterCompPromise.then(function (comp) { return comp && comp.onParentModelChanged(model, filterChangedEvent); });\n };\n FloatingFilterWrapper.prototype.onFloatingFilterChanged = function () {\n console.warn('AG Grid: since version 21.x, how floating filters are implemented has changed. ' +\n 'Instead of calling params.onFloatingFilterChanged(), get a reference to the main filter via ' +\n 'params.parentFilterInstance() and then set a value on the parent filter directly.');\n };\n FloatingFilterWrapper.TEMPLATE = \"
\\n
\\n
\\n \\n
\\n
\";\n __decorate$L([\n Autowired('columnHoverService')\n ], FloatingFilterWrapper.prototype, \"columnHoverService\", void 0);\n __decorate$L([\n Autowired('userComponentFactory')\n ], FloatingFilterWrapper.prototype, \"userComponentFactory\", void 0);\n __decorate$L([\n Autowired('gridApi')\n ], FloatingFilterWrapper.prototype, \"gridApi\", void 0);\n __decorate$L([\n Autowired('columnApi')\n ], FloatingFilterWrapper.prototype, \"columnApi\", void 0);\n __decorate$L([\n Autowired('filterManager')\n ], FloatingFilterWrapper.prototype, \"filterManager\", void 0);\n __decorate$L([\n Autowired('menuFactory')\n ], FloatingFilterWrapper.prototype, \"menuFactory\", void 0);\n __decorate$L([\n Autowired('beans')\n ], FloatingFilterWrapper.prototype, \"beans\", void 0);\n __decorate$L([\n RefSelector('eFloatingFilterBody')\n ], FloatingFilterWrapper.prototype, \"eFloatingFilterBody\", void 0);\n __decorate$L([\n RefSelector('eButtonWrapper')\n ], FloatingFilterWrapper.prototype, \"eButtonWrapper\", void 0);\n __decorate$L([\n RefSelector('eButtonShowMainFilter')\n ], FloatingFilterWrapper.prototype, \"eButtonShowMainFilter\", void 0);\n return FloatingFilterWrapper;\n}(AbstractHeaderWrapper));\n\n/**\n * @ag-grid-community/core - Advanced Data Grid / Data Table supporting Javascript / React / AngularJS / Web Components\n * @version v25.1.0\n * @link http://www.ag-grid.com/\n * @license MIT\n */\nvar __extends$V = (undefined && undefined.__extends) || (function () {\n var extendStatics = function (d, b) {\n extendStatics = Object.setPrototypeOf ||\n ({ __proto__: [] } instanceof Array && function (d, b) { d.__proto__ = b; }) ||\n function (d, b) { for (var p in b) if (b.hasOwnProperty(p)) d[p] = b[p]; };\n return extendStatics(d, b);\n };\n return function (d, b) {\n extendStatics(d, b);\n function __() { this.constructor = d; }\n d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __());\n };\n})();\nvar __decorate$M = (undefined && undefined.__decorate) || function (decorators, target, key, desc) {\n var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d;\n if (typeof Reflect === \"object\" && typeof Reflect.decorate === \"function\") r = Reflect.decorate(decorators, target, key, desc);\n else for (var i = decorators.length - 1; i >= 0; i--) if (d = decorators[i]) r = (c < 3 ? d(r) : c > 3 ? d(target, key, r) : d(target, key)) || r;\n return c > 3 && r && Object.defineProperty(target, key, r), r;\n};\nvar HeaderRowType;\n(function (HeaderRowType) {\n HeaderRowType[HeaderRowType[\"COLUMN_GROUP\"] = 0] = \"COLUMN_GROUP\";\n HeaderRowType[HeaderRowType[\"COLUMN\"] = 1] = \"COLUMN\";\n HeaderRowType[HeaderRowType[\"FLOATING_FILTER\"] = 2] = \"FLOATING_FILTER\";\n})(HeaderRowType || (HeaderRowType = {}));\nvar HeaderRowComp = /** @class */ (function (_super) {\n __extends$V(HeaderRowComp, _super);\n function HeaderRowComp(dept, type, pinned) {\n var _this = _super.call(this, /* html */ \"
\") || this;\n _this.headerComps = {};\n _this.setRowIndex(dept);\n _this.type = type;\n _this.pinned = pinned;\n var niceClassName = HeaderRowType[type].toLowerCase().replace(/_/g, '-');\n _this.addCssClass(\"ag-header-row-\" + niceClassName);\n if (isBrowserSafari()) {\n // fix for a Safari rendering bug that caused the header to flicker above chart panels\n // as you move the mouse over the header\n _this.getGui().style.transform = 'translateZ(0)';\n }\n return _this;\n }\n HeaderRowComp.prototype.forEachHeaderElement = function (callback) {\n var _this = this;\n Object.keys(this.headerComps).forEach(function (key) {\n callback(_this.headerComps[key]);\n });\n };\n HeaderRowComp.prototype.setRowIndex = function (rowIndex) {\n this.dept = rowIndex;\n setAriaRowIndex(this.getGui(), rowIndex + 1);\n };\n HeaderRowComp.prototype.getRowIndex = function () {\n return this.dept;\n };\n HeaderRowComp.prototype.getType = function () {\n return this.type;\n };\n HeaderRowComp.prototype.destroyAllChildComponents = function () {\n var idsOfAllChildren = Object.keys(this.headerComps);\n this.destroyChildComponents(idsOfAllChildren);\n };\n HeaderRowComp.prototype.destroyChildComponents = function (idsToDestroy) {\n var _this = this;\n idsToDestroy.forEach(function (id) {\n var childHeaderWrapper = _this.headerComps[id];\n _this.getGui().removeChild(childHeaderWrapper.getGui());\n _this.destroyBean(childHeaderWrapper);\n delete _this.headerComps[id];\n });\n };\n HeaderRowComp.prototype.onRowHeightChanged = function () {\n var headerRowCount = this.columnController.getHeaderRowCount();\n var sizes = [];\n var numberOfFloating = 0;\n var groupHeight;\n var headerHeight;\n if (this.columnController.isPivotMode()) {\n groupHeight = this.gridOptionsWrapper.getPivotGroupHeaderHeight();\n headerHeight = this.gridOptionsWrapper.getPivotHeaderHeight();\n }\n else {\n if (this.columnController.hasFloatingFilters()) {\n headerRowCount++;\n numberOfFloating = 1;\n }\n groupHeight = this.gridOptionsWrapper.getGroupHeaderHeight();\n headerHeight = this.gridOptionsWrapper.getHeaderHeight();\n }\n var numberOfNonGroups = 1 + numberOfFloating;\n var numberOfGroups = headerRowCount - numberOfNonGroups;\n for (var i = 0; i < numberOfGroups; i++) {\n sizes.push(groupHeight);\n }\n sizes.push(headerHeight);\n for (var i = 0; i < numberOfFloating; i++) {\n sizes.push(this.gridOptionsWrapper.getFloatingFiltersHeight());\n }\n var rowHeight = 0;\n for (var i = 0; i < this.dept; i++) {\n rowHeight += sizes[i];\n }\n this.getGui().style.top = rowHeight + 'px';\n this.getGui().style.height = sizes[this.dept] + 'px';\n };\n //noinspection JSUnusedLocalSymbols\n HeaderRowComp.prototype.init = function () {\n this.onRowHeightChanged();\n this.onVirtualColumnsChanged();\n this.setWidth();\n this.addManagedListener(this.gridOptionsWrapper, GridOptionsWrapper.PROP_HEADER_HEIGHT, this.onRowHeightChanged.bind(this));\n this.addManagedListener(this.gridOptionsWrapper, GridOptionsWrapper.PROP_PIVOT_HEADER_HEIGHT, this.onRowHeightChanged.bind(this));\n this.addManagedListener(this.gridOptionsWrapper, GridOptionsWrapper.PROP_GROUP_HEADER_HEIGHT, this.onRowHeightChanged.bind(this));\n this.addManagedListener(this.gridOptionsWrapper, GridOptionsWrapper.PROP_PIVOT_GROUP_HEADER_HEIGHT, this.onRowHeightChanged.bind(this));\n this.addManagedListener(this.gridOptionsWrapper, GridOptionsWrapper.PROP_FLOATING_FILTERS_HEIGHT, this.onRowHeightChanged.bind(this));\n this.addManagedListener(this.eventService, Events.EVENT_VIRTUAL_COLUMNS_CHANGED, this.onVirtualColumnsChanged.bind(this));\n this.addManagedListener(this.eventService, Events.EVENT_DISPLAYED_COLUMNS_CHANGED, this.onDisplayedColumnsChanged.bind(this));\n this.addManagedListener(this.eventService, Events.EVENT_COLUMN_RESIZED, this.onColumnResized.bind(this));\n // this.addManagedListener(this.eventService, Events.EVENT_GRID_COLUMNS_CHANGED, this.onGridColumnsChanged.bind(this));\n };\n HeaderRowComp.prototype.onColumnResized = function () {\n this.setWidth();\n };\n HeaderRowComp.prototype.setWidth = function () {\n var width = this.getWidthForRow();\n this.getGui().style.width = width + 'px';\n };\n HeaderRowComp.prototype.getWidthForRow = function () {\n var printLayout = this.gridOptionsWrapper.getDomLayout() === Constants.DOM_LAYOUT_PRINT;\n if (printLayout) {\n var centerRow = missing(this.pinned);\n if (centerRow) {\n return this.columnController.getContainerWidth(Constants.PINNED_RIGHT)\n + this.columnController.getContainerWidth(Constants.PINNED_LEFT)\n + this.columnController.getContainerWidth(null);\n }\n return 0;\n }\n // if not printing, just return the width as normal\n return this.columnController.getContainerWidth(this.pinned);\n };\n HeaderRowComp.prototype.onDisplayedColumnsChanged = function () {\n this.onVirtualColumnsChanged();\n this.setWidth();\n };\n HeaderRowComp.prototype.getColumnsInViewport = function () {\n var printLayout = this.gridOptionsWrapper.getDomLayout() === Constants.DOM_LAYOUT_PRINT;\n return printLayout ? this.getColumnsInViewportPrintLayout() : this.getColumnsInViewportNormalLayout();\n };\n HeaderRowComp.prototype.getColumnsInViewportPrintLayout = function () {\n var _this = this;\n // for print layout, we add all columns into the center\n if (this.pinned != null) {\n return [];\n }\n var viewportColumns = [];\n var actualDepth = this.getActualDepth();\n [Constants.PINNED_LEFT, null, Constants.PINNED_RIGHT].forEach(function (pinned) {\n var items = _this.columnController.getVirtualHeaderGroupRow(pinned, actualDepth);\n viewportColumns = viewportColumns.concat(items);\n });\n return viewportColumns;\n };\n HeaderRowComp.prototype.getActualDepth = function () {\n return this.type == HeaderRowType.FLOATING_FILTER ? this.dept - 1 : this.dept;\n };\n HeaderRowComp.prototype.getColumnsInViewportNormalLayout = function () {\n // when in normal layout, we add the columns for that container only\n return this.columnController.getVirtualHeaderGroupRow(this.pinned, this.getActualDepth());\n };\n HeaderRowComp.prototype.onVirtualColumnsChanged = function () {\n var _this = this;\n var compIdsToRemove = Object.keys(this.headerComps);\n var compIdsWanted = [];\n var columns = this.getColumnsInViewport();\n columns.forEach(function (child) {\n // skip groups that have no displayed children. this can happen when the group is broken,\n // and this section happens to have nothing to display for the open / closed state.\n // (a broken group is one that is split, ie columns in the group have a non-group column\n // in between them)\n if (child.isEmptyGroup()) {\n return;\n }\n var idOfChild = child.getUniqueId();\n var eParentContainer = _this.getGui();\n // if we already have this cell rendered, do nothing\n var previousComp = _this.headerComps[idOfChild];\n // it's possible there is a new Column with the same ID, but it's for a different Column.\n // this is common with pivoting, where the pivot cols change, but the id's are still pivot_0,\n // pivot_1 etc. so if new col but same ID, need to remove the old col here first as we are\n // about to replace it in the this.headerComps map.\n var previousCompForOldColumn = previousComp && previousComp.getColumn() != child;\n if (previousCompForOldColumn) {\n _this.destroyChildComponents([idOfChild]);\n removeFromArray(compIdsToRemove, idOfChild);\n previousComp = undefined;\n }\n if (previousComp) {\n // already have comp for this column, so do nothing\n removeFromArray(compIdsToRemove, idOfChild);\n }\n else {\n // don't have comp, need to create one\n var headerComp = _this.createHeaderComp(child);\n _this.headerComps[idOfChild] = headerComp;\n eParentContainer.appendChild(headerComp.getGui());\n }\n compIdsWanted.push(idOfChild);\n });\n // we want to keep columns that are focused, otherwise keyboard navigation breaks\n var isFocusedAndDisplayed = function (colId) {\n var wrapper = _this.headerComps[colId];\n var isFocused = _this.focusController.isHeaderWrapperFocused(wrapper);\n if (!isFocused) {\n return false;\n }\n var isDisplayed = _this.columnController.isDisplayed(wrapper.getColumn());\n return isDisplayed;\n };\n var focusedAndDisplayedComps = compIdsToRemove.filter(isFocusedAndDisplayed);\n focusedAndDisplayedComps.forEach(function (colId) {\n removeFromArray(compIdsToRemove, colId);\n compIdsWanted.push(colId);\n });\n // at this point, anything left in currentChildIds is an element that is no longer in the viewport\n this.destroyChildComponents(compIdsToRemove);\n var ensureDomOrder = this.gridOptionsWrapper.isEnsureDomOrder();\n if (ensureDomOrder) {\n var correctChildOrder = compIdsWanted.map(function (id) { return _this.headerComps[id].getGui(); });\n setDomChildOrder(this.getGui(), correctChildOrder);\n }\n };\n HeaderRowComp.prototype.createHeaderComp = function (columnGroupChild) {\n var result;\n switch (this.type) {\n case HeaderRowType.COLUMN_GROUP:\n result = new HeaderGroupWrapperComp(columnGroupChild, this.pinned);\n break;\n case HeaderRowType.FLOATING_FILTER:\n result = new FloatingFilterWrapper(columnGroupChild, this.pinned);\n break;\n default:\n result = new HeaderWrapperComp(columnGroupChild, this.pinned);\n break;\n }\n this.createBean(result);\n result.setParentComponent(this);\n return result;\n };\n HeaderRowComp.prototype.getHeaderComps = function () {\n return this.headerComps;\n };\n __decorate$M([\n Autowired('columnController')\n ], HeaderRowComp.prototype, \"columnController\", void 0);\n __decorate$M([\n Autowired('focusController')\n ], HeaderRowComp.prototype, \"focusController\", void 0);\n __decorate$M([\n PreDestroy\n ], HeaderRowComp.prototype, \"destroyAllChildComponents\", null);\n __decorate$M([\n PostConstruct\n ], HeaderRowComp.prototype, \"init\", null);\n return HeaderRowComp;\n}(Component));\n\n/**\n * @ag-grid-community/core - Advanced Data Grid / Data Table supporting Javascript / React / AngularJS / Web Components\n * @version v25.1.0\n * @link http://www.ag-grid.com/\n * @license MIT\n */\nvar __decorate$N = (undefined && undefined.__decorate) || function (decorators, target, key, desc) {\n var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d;\n if (typeof Reflect === \"object\" && typeof Reflect.decorate === \"function\") r = Reflect.decorate(decorators, target, key, desc);\n else for (var i = decorators.length - 1; i >= 0; i--) if (d = decorators[i]) r = (c < 3 ? d(r) : c > 3 ? d(target, key, r) : d(target, key)) || r;\n return c > 3 && r && Object.defineProperty(target, key, r), r;\n};\nvar MoveColumnController = /** @class */ (function () {\n function MoveColumnController(pinned, eContainer) {\n this.needToMoveLeft = false;\n this.needToMoveRight = false;\n this.pinned = pinned;\n this.eContainer = eContainer;\n this.centerContainer = !exists(pinned);\n }\n MoveColumnController.prototype.registerGridComp = function (gridPanel) {\n this.gridPanel = gridPanel;\n };\n MoveColumnController.prototype.init = function () {\n this.logger = this.loggerFactory.create('MoveColumnController');\n };\n MoveColumnController.prototype.getIconName = function () {\n return this.pinned ? DragAndDropService.ICON_PINNED : DragAndDropService.ICON_MOVE;\n };\n MoveColumnController.prototype.onDragEnter = function (draggingEvent) {\n // we do dummy drag, so make sure column appears in the right location when first placed\n var columns = draggingEvent.dragItem.columns;\n var dragCameFromToolPanel = draggingEvent.dragSource.type === exports.DragSourceType.ToolPanel;\n if (dragCameFromToolPanel) {\n // the if statement doesn't work if drag leaves grid, then enters again\n this.setColumnsVisible(columns, true, \"uiColumnDragged\");\n }\n else {\n // restore previous state of visible columns upon re-entering. this means if the user drags\n // a group out, and then drags the group back in, only columns that were originally visible\n // will be visible again. otherwise a group with three columns (but only two visible) could\n // be dragged out, then when it's dragged in again, all three are visible. this stops that.\n var visibleState_1 = draggingEvent.dragItem.visibleState;\n var visibleColumns = (columns || []).filter(function (column) { return visibleState_1[column.getId()]; });\n this.setColumnsVisible(visibleColumns, true, \"uiColumnDragged\");\n }\n this.setColumnsPinned(columns, this.pinned, \"uiColumnDragged\");\n this.onDragging(draggingEvent, true);\n };\n MoveColumnController.prototype.onDragLeave = function (draggingEvent) {\n var hideColumnOnExit = !this.gridOptionsWrapper.isSuppressDragLeaveHidesColumns() && !draggingEvent.fromNudge;\n if (hideColumnOnExit) {\n var dragItem = draggingEvent.dragSource.getDragItem();\n var columns = dragItem.columns;\n this.setColumnsVisible(columns, false, \"uiColumnDragged\");\n }\n this.ensureIntervalCleared();\n };\n MoveColumnController.prototype.setColumnsVisible = function (columns, visible, source) {\n if (source === void 0) { source = \"api\"; }\n if (columns) {\n var allowedCols = columns.filter(function (c) { return !c.getColDef().lockVisible; });\n this.columnController.setColumnsVisible(allowedCols, visible, source);\n }\n };\n MoveColumnController.prototype.setColumnsPinned = function (columns, pinned, source) {\n if (source === void 0) { source = \"api\"; }\n if (columns) {\n var allowedCols = columns.filter(function (c) { return !c.getColDef().lockPinned; });\n this.columnController.setColumnsPinned(allowedCols, pinned, source);\n }\n };\n MoveColumnController.prototype.onDragStop = function () {\n this.ensureIntervalCleared();\n };\n MoveColumnController.prototype.normaliseX = function (x) {\n // flip the coordinate if doing RTL\n if (this.gridOptionsWrapper.isEnableRtl()) {\n var clientWidth = this.eContainer.clientWidth;\n x = clientWidth - x;\n }\n // adjust for scroll only if centre container (the pinned containers don't scroll)\n if (this.centerContainer) {\n x += this.gridPanel.getCenterViewportScrollLeft();\n }\n return x;\n };\n MoveColumnController.prototype.checkCenterForScrolling = function (xAdjustedForScroll) {\n if (this.centerContainer) {\n // scroll if the mouse has gone outside the grid (or just outside the scrollable part if pinning)\n // putting in 50 buffer, so even if user gets to edge of grid, a scroll will happen\n var firstVisiblePixel = this.gridPanel.getCenterViewportScrollLeft();\n var lastVisiblePixel = firstVisiblePixel + this.gridPanel.getCenterWidth();\n if (this.gridOptionsWrapper.isEnableRtl()) {\n this.needToMoveRight = xAdjustedForScroll < (firstVisiblePixel + 50);\n this.needToMoveLeft = xAdjustedForScroll > (lastVisiblePixel - 50);\n }\n else {\n this.needToMoveLeft = xAdjustedForScroll < (firstVisiblePixel + 50);\n this.needToMoveRight = xAdjustedForScroll > (lastVisiblePixel - 50);\n }\n if (this.needToMoveLeft || this.needToMoveRight) {\n this.ensureIntervalStarted();\n }\n else {\n this.ensureIntervalCleared();\n }\n }\n };\n MoveColumnController.prototype.onDragging = function (draggingEvent, fromEnter) {\n var _this = this;\n if (fromEnter === void 0) { fromEnter = false; }\n this.lastDraggingEvent = draggingEvent;\n // if moving up or down (ie not left or right) then do nothing\n if (missing(draggingEvent.hDirection)) {\n return;\n }\n var mouseXNormalised = this.normaliseX(draggingEvent.x);\n // if the user is dragging into the panel, ie coming from the side panel into the main grid,\n // we don't want to scroll the grid this time, it would appear like the table is jumping\n // each time a column is dragged in.\n if (!fromEnter) {\n this.checkCenterForScrolling(mouseXNormalised);\n }\n var hDirectionNormalised = this.normaliseDirection(draggingEvent.hDirection);\n var dragSourceType = draggingEvent.dragSource.type;\n var columnsToMove = draggingEvent.dragSource.getDragItem().columns;\n columnsToMove = columnsToMove.filter(function (col) {\n if (col.getColDef().lockPinned) {\n // if locked return true only if both col and container are same pin type.\n // double equals (==) here on purpose so that null==undefined is true (for not pinned options)\n return col.getPinned() == _this.pinned;\n }\n // if not pin locked, then always allowed to be in this container\n return true;\n });\n this.attemptMoveColumns(dragSourceType, columnsToMove, hDirectionNormalised, mouseXNormalised, fromEnter);\n };\n MoveColumnController.prototype.normaliseDirection = function (hDirection) {\n if (this.gridOptionsWrapper.isEnableRtl()) {\n switch (hDirection) {\n case exports.HorizontalDirection.Left: return exports.HorizontalDirection.Right;\n case exports.HorizontalDirection.Right: return exports.HorizontalDirection.Left;\n default: console.error(\"AG Grid: Unknown direction \" + hDirection);\n }\n }\n else {\n return hDirection;\n }\n };\n // returns the index of the first column in the list ONLY if the cols are all beside\n // each other. if the cols are not beside each other, then returns null\n MoveColumnController.prototype.calculateOldIndex = function (movingCols) {\n var gridCols = this.columnController.getAllGridColumns();\n var indexes = sortNumerically(movingCols.map(function (col) { return gridCols.indexOf(col); }));\n var firstIndex = indexes[0];\n var lastIndex = last(indexes);\n var spread = lastIndex - firstIndex;\n var gapsExist = spread !== indexes.length - 1;\n return gapsExist ? null : firstIndex;\n };\n MoveColumnController.prototype.attemptMoveColumns = function (dragSourceType, allMovingColumns, hDirection, mouseX, fromEnter) {\n var draggingLeft = hDirection === exports.HorizontalDirection.Left;\n var draggingRight = hDirection === exports.HorizontalDirection.Right;\n // it is important to sort the moving columns as they are in grid columns, as the list of moving columns\n // could themselves be part of 'married children' groups, which means we need to maintain the order within\n // the moving list.\n var allMovingColumnsOrdered = allMovingColumns.slice();\n this.columnController.sortColumnsLikeGridColumns(allMovingColumnsOrdered);\n var validMoves = this.calculateValidMoves(allMovingColumnsOrdered, draggingRight, mouseX);\n // if cols are not adjacent, then this returns null. when moving, we constrain the direction of the move\n // (ie left or right) to the mouse direction. however\n var oldIndex = this.calculateOldIndex(allMovingColumnsOrdered);\n if (validMoves.length === 0) {\n return;\n }\n var firstValidMove = validMoves[0];\n // the two check below stop an error when the user grabs a group my a middle column, then\n // it is possible the mouse pointer is to the right of a column while been dragged left.\n // so we need to make sure that the mouse pointer is actually left of the left most column\n // if moving left, and right of the right most column if moving right\n // we check 'fromEnter' below so we move the column to the new spot if the mouse is coming from\n // outside the grid, eg if the column is moving from side panel, mouse is moving left, then we should\n // place the column to the RHS even if the mouse is moving left and the column is already on\n // the LHS. otherwise we stick to the rule described above.\n var constrainDirection = oldIndex !== null && !fromEnter;\n // don't consider 'fromEnter' when dragging header cells, otherwise group can jump to opposite direction of drag\n if (dragSourceType == exports.DragSourceType.HeaderCell) {\n constrainDirection = oldIndex !== null;\n }\n if (constrainDirection) {\n // only allow left drag if this column is moving left\n if (draggingLeft && firstValidMove >= oldIndex) {\n return;\n }\n // only allow right drag if this column is moving right\n if (draggingRight && firstValidMove <= oldIndex) {\n return;\n }\n }\n for (var i = 0; i < validMoves.length; i++) {\n var move = validMoves[i];\n if (!this.columnController.doesMovePassRules(allMovingColumnsOrdered, move)) {\n continue;\n }\n this.columnController.moveColumns(allMovingColumnsOrdered, move, \"uiColumnDragged\");\n // important to return here, so once we do the first valid move, we don't try do any more\n return;\n }\n };\n MoveColumnController.prototype.calculateValidMoves = function (movingCols, draggingRight, mouseX) {\n var isMoveBlocked = this.gridOptionsWrapper.isSuppressMovableColumns() || movingCols.some(function (col) { return col.getColDef().suppressMovable; });\n if (isMoveBlocked) {\n return [];\n }\n // this is the list of cols on the screen, so it's these we use when comparing the x mouse position\n var allDisplayedCols = this.columnController.getDisplayedColumns(this.pinned);\n // but this list is the list of all cols, when we move a col it's the index within this list that gets used,\n // so the result we return has to be and index location for this list\n var allGridCols = this.columnController.getAllGridColumns();\n var movingDisplayedCols = allDisplayedCols.filter(function (col) { return includes(movingCols, col); });\n var otherDisplayedCols = allDisplayedCols.filter(function (col) { return !includes(movingCols, col); });\n var otherGridCols = allGridCols.filter(function (col) { return !includes(movingCols, col); });\n // work out how many DISPLAYED columns fit before the 'x' position. this gives us the displayIndex.\n // for example, if cols are a,b,c,d and we find a,b fit before 'x', then we want to place the moving\n // col between b and c (so that it is under the mouse position).\n var displayIndex = 0;\n var availableWidth = mouseX;\n // if we are dragging right, then the columns will be to the left of the mouse, so we also want to\n // include the width of the moving columns\n if (draggingRight) {\n var widthOfMovingDisplayedCols_1 = 0;\n movingDisplayedCols.forEach(function (col) { return widthOfMovingDisplayedCols_1 += col.getActualWidth(); });\n availableWidth -= widthOfMovingDisplayedCols_1;\n }\n if (availableWidth > 0) {\n // now count how many of the displayed columns will fit to the left\n for (var i = 0; i < otherDisplayedCols.length; i++) {\n var col = otherDisplayedCols[i];\n availableWidth -= col.getActualWidth();\n if (availableWidth < 0) {\n break;\n }\n displayIndex++;\n }\n // trial and error, if going right, we adjust by one, i didn't manage to quantify why, but it works\n if (draggingRight) {\n displayIndex++;\n }\n }\n // the display index is with respect to all the showing columns, however when we move, it's with\n // respect to all grid columns, so we need to translate from display index to grid index\n var firstValidMove;\n if (displayIndex > 0) {\n var leftColumn = otherDisplayedCols[displayIndex - 1];\n firstValidMove = otherGridCols.indexOf(leftColumn) + 1;\n }\n else {\n firstValidMove = otherGridCols.indexOf(otherDisplayedCols[0]);\n if (firstValidMove === -1) {\n firstValidMove = 0;\n }\n }\n var validMoves = [firstValidMove];\n var numberComparator = function (a, b) { return a - b; };\n // add in other valid moves due to hidden columns and married children. for example, a particular\n // move might break a group that has married children (so move isn't valid), however there could\n // be hidden columns (not displayed) that we could jump over to make the move valid. because\n // they are hidden, user doesn't see any different, however it allows moves that would otherwise\n // not work. for example imagine a group with 9 columns and all columns are hidden except the\n // middle one (so 4 hidden to left, 4 hidden to right), then when moving 'firstValidMove' will\n // be relative to the not-shown column, however we need to consider the move jumping over all the\n // hidden children. if we didn't do this, then if the group just described was at the end (RHS) of the\n // grid, there would be no way to put a column after it (as the grid would only consider beside the\n // visible column, which would fail valid move rules).\n if (draggingRight) {\n // if dragging right, then we add all the additional moves to the right. so in other words\n // if the next move is not valid, find the next move to the right that is valid.\n var pointer = firstValidMove + 1;\n var lastIndex = allGridCols.length - 1;\n while (pointer <= lastIndex) {\n validMoves.push(pointer);\n pointer++;\n }\n // adding columns here means the order is now messed up\n validMoves.sort(numberComparator);\n }\n else {\n // if dragging left we do the reverse of dragging right, we add in all the valid moves to the\n // left. however we also have to consider moves to the right for all hidden columns first.\n // (this logic is hard to reason with, it was worked out with trial and error,\n // more observation rather than science).\n // add moves to the right\n var pointer = firstValidMove;\n var lastIndex = allGridCols.length - 1;\n var displacedCol = allGridCols[pointer];\n while (pointer <= lastIndex && this.isColumnHidden(allDisplayedCols, displacedCol)) {\n pointer++;\n validMoves.push(pointer);\n displacedCol = allGridCols[pointer];\n }\n // add moves to the left\n pointer = firstValidMove - 1;\n var firstDisplayIndex = 0;\n while (pointer >= firstDisplayIndex) {\n validMoves.push(pointer);\n pointer--;\n }\n // adding columns here means the order is now messed up\n validMoves.sort(numberComparator).reverse();\n }\n return validMoves;\n };\n // isHidden takes into account visible=false and group=closed, ie it is not displayed\n MoveColumnController.prototype.isColumnHidden = function (displayedColumns, col) {\n return displayedColumns.indexOf(col) < 0;\n };\n MoveColumnController.prototype.ensureIntervalStarted = function () {\n if (!this.movingIntervalId) {\n this.intervalCount = 0;\n this.failedMoveAttempts = 0;\n this.movingIntervalId = window.setInterval(this.moveInterval.bind(this), 100);\n if (this.needToMoveLeft) {\n this.dragAndDropService.setGhostIcon(DragAndDropService.ICON_LEFT, true);\n }\n else {\n this.dragAndDropService.setGhostIcon(DragAndDropService.ICON_RIGHT, true);\n }\n }\n };\n MoveColumnController.prototype.ensureIntervalCleared = function () {\n if (this.movingIntervalId) {\n window.clearInterval(this.movingIntervalId);\n this.movingIntervalId = null;\n this.dragAndDropService.setGhostIcon(DragAndDropService.ICON_MOVE);\n }\n };\n MoveColumnController.prototype.moveInterval = function () {\n // the amounts we move get bigger at each interval, so the speed accelerates, starting a bit slow\n // and getting faster. this is to give smoother user experience. we max at 100px to limit the speed.\n var pixelsToMove;\n this.intervalCount++;\n pixelsToMove = 10 + (this.intervalCount * 5);\n if (pixelsToMove > 100) {\n pixelsToMove = 100;\n }\n var pixelsMoved = null;\n if (this.needToMoveLeft) {\n pixelsMoved = this.gridPanel.scrollHorizontally(-pixelsToMove);\n }\n else if (this.needToMoveRight) {\n pixelsMoved = this.gridPanel.scrollHorizontally(pixelsToMove);\n }\n if (pixelsMoved !== 0) {\n this.onDragging(this.lastDraggingEvent);\n this.failedMoveAttempts = 0;\n }\n else {\n // we count the failed move attempts. if we fail to move 7 times, then we pin the column.\n // this is how we achieve pining by dragging the column to the edge of the grid.\n this.failedMoveAttempts++;\n var columns = this.lastDraggingEvent.dragItem.columns;\n var columnsThatCanPin = columns.filter(function (c) { return !c.getColDef().lockPinned; });\n if (columnsThatCanPin.length > 0) {\n this.dragAndDropService.setGhostIcon(DragAndDropService.ICON_PINNED);\n if (this.failedMoveAttempts > 7) {\n var pinType = this.needToMoveLeft ? Constants.PINNED_LEFT : Constants.PINNED_RIGHT;\n this.setColumnsPinned(columnsThatCanPin, pinType, \"uiColumnDragged\");\n this.dragAndDropService.nudge();\n }\n }\n }\n };\n __decorate$N([\n Autowired('loggerFactory')\n ], MoveColumnController.prototype, \"loggerFactory\", void 0);\n __decorate$N([\n Autowired('columnController')\n ], MoveColumnController.prototype, \"columnController\", void 0);\n __decorate$N([\n Autowired('dragAndDropService')\n ], MoveColumnController.prototype, \"dragAndDropService\", void 0);\n __decorate$N([\n Autowired('gridOptionsWrapper')\n ], MoveColumnController.prototype, \"gridOptionsWrapper\", void 0);\n __decorate$N([\n PostConstruct\n ], MoveColumnController.prototype, \"init\", null);\n return MoveColumnController;\n}());\n\n/**\n * @ag-grid-community/core - Advanced Data Grid / Data Table supporting Javascript / React / AngularJS / Web Components\n * @version v25.1.0\n * @link http://www.ag-grid.com/\n * @license MIT\n */\nvar __decorate$O = (undefined && undefined.__decorate) || function (decorators, target, key, desc) {\n var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d;\n if (typeof Reflect === \"object\" && typeof Reflect.decorate === \"function\") r = Reflect.decorate(decorators, target, key, desc);\n else for (var i = decorators.length - 1; i >= 0; i--) if (d = decorators[i]) r = (c < 3 ? d(r) : c > 3 ? d(target, key, r) : d(target, key)) || r;\n return c > 3 && r && Object.defineProperty(target, key, r), r;\n};\nvar BodyDropPivotTarget = /** @class */ (function () {\n function BodyDropPivotTarget(pinned) {\n this.columnsToAggregate = [];\n this.columnsToGroup = [];\n this.columnsToPivot = [];\n this.pinned = pinned;\n }\n /** Callback for when drag enters */\n BodyDropPivotTarget.prototype.onDragEnter = function (draggingEvent) {\n var _this = this;\n this.clearColumnsList();\n // in pivot mode, we don't accept any drops if functions are read only\n if (this.gridOptionsWrapper.isFunctionsReadOnly()) {\n return;\n }\n var dragColumns = draggingEvent.dragItem.columns;\n if (!dragColumns) {\n return;\n }\n dragColumns.forEach(function (column) {\n // we don't allow adding secondary columns\n if (!column.isPrimary()) {\n return;\n }\n if (column.isAnyFunctionActive()) {\n return;\n }\n if (column.isAllowValue()) {\n _this.columnsToAggregate.push(column);\n }\n else if (column.isAllowRowGroup()) {\n _this.columnsToGroup.push(column);\n }\n else if (column.isAllowPivot()) {\n _this.columnsToPivot.push(column);\n }\n });\n };\n BodyDropPivotTarget.prototype.getIconName = function () {\n var totalColumns = this.columnsToAggregate.length + this.columnsToGroup.length + this.columnsToPivot.length;\n if (totalColumns > 0) {\n return this.pinned ? DragAndDropService.ICON_PINNED : DragAndDropService.ICON_MOVE;\n }\n return null;\n };\n /** Callback for when drag leaves */\n BodyDropPivotTarget.prototype.onDragLeave = function (draggingEvent) {\n // if we are taking columns out of the center, then we remove them from the report\n this.clearColumnsList();\n };\n BodyDropPivotTarget.prototype.clearColumnsList = function () {\n this.columnsToAggregate.length = 0;\n this.columnsToGroup.length = 0;\n this.columnsToPivot.length = 0;\n };\n /** Callback for when dragging */\n BodyDropPivotTarget.prototype.onDragging = function (draggingEvent) {\n };\n /** Callback for when drag stops */\n BodyDropPivotTarget.prototype.onDragStop = function (draggingEvent) {\n if (this.columnsToAggregate.length > 0) {\n this.columnController.addValueColumns(this.columnsToAggregate, \"toolPanelDragAndDrop\");\n }\n if (this.columnsToGroup.length > 0) {\n this.columnController.addRowGroupColumns(this.columnsToGroup, \"toolPanelDragAndDrop\");\n }\n if (this.columnsToPivot.length > 0) {\n this.columnController.addPivotColumns(this.columnsToPivot, \"toolPanelDragAndDrop\");\n }\n };\n __decorate$O([\n Autowired('columnController')\n ], BodyDropPivotTarget.prototype, \"columnController\", void 0);\n __decorate$O([\n Autowired('gridOptionsWrapper')\n ], BodyDropPivotTarget.prototype, \"gridOptionsWrapper\", void 0);\n return BodyDropPivotTarget;\n}());\n\n/**\n * @ag-grid-community/core - Advanced Data Grid / Data Table supporting Javascript / React / AngularJS / Web Components\n * @version v25.1.0\n * @link http://www.ag-grid.com/\n * @license MIT\n */\nvar __extends$W = (undefined && undefined.__extends) || (function () {\n var extendStatics = function (d, b) {\n extendStatics = Object.setPrototypeOf ||\n ({ __proto__: [] } instanceof Array && function (d, b) { d.__proto__ = b; }) ||\n function (d, b) { for (var p in b) if (b.hasOwnProperty(p)) d[p] = b[p]; };\n return extendStatics(d, b);\n };\n return function (d, b) {\n extendStatics(d, b);\n function __() { this.constructor = d; }\n d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __());\n };\n})();\nvar __decorate$P = (undefined && undefined.__decorate) || function (decorators, target, key, desc) {\n var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d;\n if (typeof Reflect === \"object\" && typeof Reflect.decorate === \"function\") r = Reflect.decorate(decorators, target, key, desc);\n else for (var i = decorators.length - 1; i >= 0; i--) if (d = decorators[i]) r = (c < 3 ? d(r) : c > 3 ? d(target, key, r) : d(target, key)) || r;\n return c > 3 && r && Object.defineProperty(target, key, r), r;\n};\nvar DropType;\n(function (DropType) {\n DropType[DropType[\"ColumnMove\"] = 0] = \"ColumnMove\";\n DropType[DropType[\"Pivot\"] = 1] = \"Pivot\";\n})(DropType || (DropType = {}));\nvar BodyDropTarget = /** @class */ (function (_super) {\n __extends$W(BodyDropTarget, _super);\n function BodyDropTarget(pinned, eContainer) {\n var _this = _super.call(this) || this;\n _this.dropListeners = {};\n _this.pinned = pinned;\n _this.eContainer = eContainer;\n return _this;\n }\n BodyDropTarget.prototype.registerGridComp = function (gridPanel) {\n this.gridPanel = gridPanel;\n this.moveColumnController.registerGridComp(gridPanel);\n switch (this.pinned) {\n case Constants.PINNED_LEFT:\n this.eSecondaryContainers = this.gridPanel.getDropTargetLeftContainers();\n break;\n case Constants.PINNED_RIGHT:\n this.eSecondaryContainers = this.gridPanel.getDropTargetRightContainers();\n break;\n default:\n this.eSecondaryContainers = this.gridPanel.getDropTargetBodyContainers();\n break;\n }\n };\n BodyDropTarget.prototype.isInterestedIn = function (type) {\n return type === exports.DragSourceType.HeaderCell ||\n (type === exports.DragSourceType.ToolPanel && this.gridOptionsWrapper.isAllowDragFromColumnsToolPanel());\n };\n BodyDropTarget.prototype.getSecondaryContainers = function () {\n return this.eSecondaryContainers;\n };\n BodyDropTarget.prototype.getContainer = function () {\n return this.eContainer;\n };\n BodyDropTarget.prototype.init = function () {\n this.moveColumnController = this.createBean(new MoveColumnController(this.pinned, this.eContainer));\n var bodyDropPivotTarget = new BodyDropPivotTarget(this.pinned);\n this.createBean(bodyDropPivotTarget);\n this.dropListeners[DropType.ColumnMove] = this.moveColumnController;\n this.dropListeners[DropType.Pivot] = bodyDropPivotTarget;\n this.dragAndDropService.addDropTarget(this);\n };\n BodyDropTarget.prototype.getIconName = function () {\n return this.currentDropListener.getIconName();\n };\n // we want to use the bodyPivotTarget if the user is dragging columns in from the toolPanel\n // and we are in pivot mode, as it has to logic to set pivot/value/group on the columns when\n // dropped into the grid's body.\n BodyDropTarget.prototype.getDropType = function (draggingEvent) {\n if (this.columnController.isPivotMode()) {\n // in pivot mode, then if moving a column (ie didn't come from toolpanel) then it's\n // a standard column move, however if it came from the toolpanel, then we are introducing\n // dimensions or values to the grid\n if (draggingEvent.dragSource.type === exports.DragSourceType.ToolPanel) {\n return DropType.Pivot;\n }\n return DropType.ColumnMove;\n }\n // it's a column, and not pivot mode, so always moving\n return DropType.ColumnMove;\n };\n BodyDropTarget.prototype.onDragEnter = function (draggingEvent) {\n // we pick the drop listener depending on whether we are in pivot mode are not. if we are\n // in pivot mode, then dropping cols changes the row group, pivot, value stats. otherwise\n // we change visibility state and position.\n // if (this.columnController.isPivotMode()) {\n var dropType = this.getDropType(draggingEvent);\n this.currentDropListener = this.dropListeners[dropType];\n this.currentDropListener.onDragEnter(draggingEvent);\n };\n BodyDropTarget.prototype.onDragLeave = function (params) {\n this.currentDropListener.onDragLeave(params);\n };\n BodyDropTarget.prototype.onDragging = function (params) {\n this.currentDropListener.onDragging(params);\n };\n BodyDropTarget.prototype.onDragStop = function (params) {\n this.currentDropListener.onDragStop(params);\n };\n __decorate$P([\n Autowired('dragAndDropService')\n ], BodyDropTarget.prototype, \"dragAndDropService\", void 0);\n __decorate$P([\n Autowired('columnController')\n ], BodyDropTarget.prototype, \"columnController\", void 0);\n __decorate$P([\n PostConstruct\n ], BodyDropTarget.prototype, \"init\", null);\n return BodyDropTarget;\n}(BeanStub));\n\n/**\n * @ag-grid-community/core - Advanced Data Grid / Data Table supporting Javascript / React / AngularJS / Web Components\n * @version v25.1.0\n * @link http://www.ag-grid.com/\n * @license MIT\n */\nvar __extends$X = (undefined && undefined.__extends) || (function () {\n var extendStatics = function (d, b) {\n extendStatics = Object.setPrototypeOf ||\n ({ __proto__: [] } instanceof Array && function (d, b) { d.__proto__ = b; }) ||\n function (d, b) { for (var p in b) if (b.hasOwnProperty(p)) d[p] = b[p]; };\n return extendStatics(d, b);\n };\n return function (d, b) {\n extendStatics(d, b);\n function __() { this.constructor = d; }\n d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __());\n };\n})();\nvar __decorate$Q = (undefined && undefined.__decorate) || function (decorators, target, key, desc) {\n var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d;\n if (typeof Reflect === \"object\" && typeof Reflect.decorate === \"function\") r = Reflect.decorate(decorators, target, key, desc);\n else for (var i = decorators.length - 1; i >= 0; i--) if (d = decorators[i]) r = (c < 3 ? d(r) : c > 3 ? d(target, key, r) : d(target, key)) || r;\n return c > 3 && r && Object.defineProperty(target, key, r), r;\n};\nvar HeaderContainer = /** @class */ (function (_super) {\n __extends$X(HeaderContainer, _super);\n function HeaderContainer(eContainer, eViewport, pinned) {\n var _this = _super.call(this) || this;\n _this.groupsRowComps = [];\n _this.eContainer = eContainer;\n _this.pinned = pinned;\n _this.eViewport = eViewport;\n return _this;\n }\n HeaderContainer.prototype.forEachHeaderElement = function (callback) {\n if (this.groupsRowComps) {\n this.groupsRowComps.forEach(function (c) { return c.forEachHeaderElement(callback); });\n }\n if (this.columnsRowComp) {\n this.columnsRowComp.forEachHeaderElement(callback);\n }\n if (this.filtersRowComp) {\n this.filtersRowComp.forEachHeaderElement(callback);\n }\n };\n HeaderContainer.prototype.init = function () {\n // if value changes, then if not pivoting, we at least need to change the label eg from sum() to avg(),\n // if pivoting, then the columns have changed\n this.addManagedListener(this.eventService, Events.EVENT_GRID_COLUMNS_CHANGED, this.onGridColumnsChanged.bind(this));\n this.addManagedListener(this.eventService, Events.EVENT_SCROLL_VISIBILITY_CHANGED, this.onScrollVisibilityChanged.bind(this));\n this.addManagedListener(this.eventService, Events.EVENT_COLUMN_RESIZED, this.onColumnResized.bind(this));\n this.addManagedListener(this.eventService, Events.EVENT_DISPLAYED_COLUMNS_CHANGED, this.onDisplayedColumnsChanged.bind(this));\n this.addManagedListener(this.eventService, Events.EVENT_SCROLLBAR_WIDTH_CHANGED, this.onScrollbarWidthChanged.bind(this));\n };\n HeaderContainer.prototype.onColumnResized = function () {\n this.setWidthOfPinnedContainer();\n };\n HeaderContainer.prototype.onDisplayedColumnsChanged = function () {\n this.setWidthOfPinnedContainer();\n };\n HeaderContainer.prototype.onScrollVisibilityChanged = function () {\n this.setWidthOfPinnedContainer();\n };\n HeaderContainer.prototype.onScrollbarWidthChanged = function () {\n this.setWidthOfPinnedContainer();\n };\n HeaderContainer.prototype.setWidthOfPinnedContainer = function () {\n var pinningLeft = this.pinned === Constants.PINNED_LEFT;\n var pinningRight = this.pinned === Constants.PINNED_RIGHT;\n var controller = this.columnController;\n var isRtl = this.gridOptionsWrapper.isEnableRtl();\n var scrollbarWidth = this.gridOptionsWrapper.getScrollbarWidth();\n if (pinningLeft || pinningRight) {\n // size to fit all columns\n var width = controller[pinningLeft ? 'getDisplayedColumnsLeftWidth' : 'getDisplayedColumnsRightWidth']();\n // if there is a scroll showing (and taking up space, so Windows, and not iOS)\n // in the body, then we add extra space to keep header aligned with the body,\n // as body width fits the cols and the scrollbar\n var addPaddingForScrollbar = this.scrollVisibleService.isVerticalScrollShowing() && ((isRtl && pinningLeft) || (!isRtl && pinningRight));\n if (addPaddingForScrollbar) {\n width += scrollbarWidth;\n }\n setFixedWidth(this.eContainer, width);\n }\n };\n HeaderContainer.prototype.getRowComps = function () {\n var res = [];\n if (this.groupsRowComps) {\n res = res.concat(this.groupsRowComps);\n }\n if (this.columnsRowComp) {\n res.push(this.columnsRowComp);\n }\n if (this.filtersRowComp) {\n res.push(this.filtersRowComp);\n }\n return res;\n };\n // grid cols have changed - this also means the number of rows in the header can have\n // changed. so we remove all the old rows and insert new ones for a complete refresh\n HeaderContainer.prototype.onGridColumnsChanged = function () {\n this.refresh(true);\n };\n // we expose this for gridOptions.api.refreshHeader() to call\n HeaderContainer.prototype.refresh = function (keepColumns) {\n if (keepColumns === void 0) { keepColumns = false; }\n this.refreshRowComps(keepColumns);\n };\n HeaderContainer.prototype.setupDragAndDrop = function (gridComp) {\n // center section has viewport, but pinned sections do not\n var dropContainer = this.eViewport ? this.eViewport : this.eContainer;\n var bodyDropTarget = new BodyDropTarget(this.pinned, dropContainer);\n this.createManagedBean(bodyDropTarget);\n bodyDropTarget.registerGridComp(gridComp);\n };\n HeaderContainer.prototype.destroyRowComps = function (keepColumns) {\n if (keepColumns === void 0) { keepColumns = false; }\n this.groupsRowComps.forEach(this.destroyRowComp.bind(this));\n this.groupsRowComps = [];\n this.destroyRowComp(this.filtersRowComp);\n this.filtersRowComp = undefined;\n if (!keepColumns) {\n this.destroyRowComp(this.columnsRowComp);\n this.columnsRowComp = undefined;\n }\n };\n HeaderContainer.prototype.destroyRowComp = function (rowComp) {\n if (rowComp) {\n this.destroyBean(rowComp);\n this.eContainer.removeChild(rowComp.getGui());\n }\n };\n HeaderContainer.prototype.refreshRowComps = function (keepColumns) {\n var _this = this;\n if (keepColumns === void 0) { keepColumns = false; }\n var sequence = new NumberSequence();\n var refreshColumnGroups = function () {\n var groupRowCount = _this.columnController.getHeaderRowCount() - 1;\n _this.groupsRowComps.forEach(_this.destroyRowComp.bind(_this));\n _this.groupsRowComps = [];\n for (var i = 0; i < groupRowCount; i++) {\n var rowComp = _this.createBean(new HeaderRowComp(sequence.next(), HeaderRowType.COLUMN_GROUP, _this.pinned));\n _this.groupsRowComps.push(rowComp);\n }\n };\n var refreshColumns = function () {\n var rowIndex = sequence.next();\n if (_this.columnsRowComp) {\n var rowIndexMismatch = _this.columnsRowComp.getRowIndex() !== rowIndex;\n if (!keepColumns || rowIndexMismatch) {\n _this.destroyRowComp(_this.columnsRowComp);\n _this.columnsRowComp = undefined;\n }\n }\n if (!_this.columnsRowComp) {\n _this.columnsRowComp = _this.createBean(new HeaderRowComp(rowIndex, HeaderRowType.COLUMN, _this.pinned));\n }\n };\n var refreshFilters = function () {\n var includeFloatingFilter = !_this.columnController.isPivotMode() && _this.columnController.hasFloatingFilters();\n var destroyPreviousComp = function () {\n _this.destroyRowComp(_this.filtersRowComp);\n _this.filtersRowComp = undefined;\n };\n if (!includeFloatingFilter) {\n destroyPreviousComp();\n return;\n }\n var rowIndex = sequence.next();\n if (_this.filtersRowComp) {\n var rowIndexMismatch = _this.filtersRowComp.getRowIndex() !== rowIndex;\n if (!keepColumns || rowIndexMismatch) {\n destroyPreviousComp();\n }\n }\n if (!_this.filtersRowComp) {\n _this.filtersRowComp = _this.createBean(new HeaderRowComp(rowIndex, HeaderRowType.FLOATING_FILTER, _this.pinned));\n }\n };\n refreshColumnGroups();\n refreshColumns();\n refreshFilters();\n // this re-adds the this.columnsRowComp, which is fine, it just means the DOM will rearrange then,\n // taking it out of the last position and re-inserting relative to the other rows.\n this.getRowComps().forEach(function (rowComp) { return _this.eContainer.appendChild(rowComp.getGui()); });\n };\n __decorate$Q([\n Autowired('columnController')\n ], HeaderContainer.prototype, \"columnController\", void 0);\n __decorate$Q([\n Autowired('scrollVisibleService')\n ], HeaderContainer.prototype, \"scrollVisibleService\", void 0);\n __decorate$Q([\n PostConstruct\n ], HeaderContainer.prototype, \"init\", null);\n __decorate$Q([\n PreDestroy\n ], HeaderContainer.prototype, \"destroyRowComps\", null);\n return HeaderContainer;\n}(BeanStub));\n\n/**\n * @ag-grid-community/core - Advanced Data Grid / Data Table supporting Javascript / React / AngularJS / Web Components\n * @version v25.1.0\n * @link http://www.ag-grid.com/\n * @license MIT\n */\nvar __extends$Y = (undefined && undefined.__extends) || (function () {\n var extendStatics = function (d, b) {\n extendStatics = Object.setPrototypeOf ||\n ({ __proto__: [] } instanceof Array && function (d, b) { d.__proto__ = b; }) ||\n function (d, b) { for (var p in b) if (b.hasOwnProperty(p)) d[p] = b[p]; };\n return extendStatics(d, b);\n };\n return function (d, b) {\n extendStatics(d, b);\n function __() { this.constructor = d; }\n d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __());\n };\n})();\nvar __decorate$R = (undefined && undefined.__decorate) || function (decorators, target, key, desc) {\n var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d;\n if (typeof Reflect === \"object\" && typeof Reflect.decorate === \"function\") r = Reflect.decorate(decorators, target, key, desc);\n else for (var i = decorators.length - 1; i >= 0; i--) if (d = decorators[i]) r = (c < 3 ? d(r) : c > 3 ? d(target, key, r) : d(target, key)) || r;\n return c > 3 && r && Object.defineProperty(target, key, r), r;\n};\n(function (HeaderNavigationDirection) {\n HeaderNavigationDirection[HeaderNavigationDirection[\"UP\"] = 0] = \"UP\";\n HeaderNavigationDirection[HeaderNavigationDirection[\"DOWN\"] = 1] = \"DOWN\";\n HeaderNavigationDirection[HeaderNavigationDirection[\"LEFT\"] = 2] = \"LEFT\";\n HeaderNavigationDirection[HeaderNavigationDirection[\"RIGHT\"] = 3] = \"RIGHT\";\n})(exports.HeaderNavigationDirection || (exports.HeaderNavigationDirection = {}));\nvar HeaderNavigationService = /** @class */ (function (_super) {\n __extends$Y(HeaderNavigationService, _super);\n function HeaderNavigationService() {\n return _super !== null && _super.apply(this, arguments) || this;\n }\n HeaderNavigationService.prototype.registerGridComp = function (gridPanel) {\n this.gridPanel = gridPanel;\n };\n HeaderNavigationService.prototype.registerHeaderRoot = function (headerRoot) {\n this.headerRoot = headerRoot;\n };\n HeaderNavigationService.prototype.getHeaderRowCount = function () {\n var headerContainers = this.headerRoot.getHeaderContainers();\n return headerContainers.size === 0 ? 0 : this.getHeaderContainer().getRowComps().length;\n };\n HeaderNavigationService.prototype.getHeaderRowType = function (idx) {\n if (this.getHeaderRowCount()) {\n return this.getHeaderContainer().getRowComps()[idx].getType();\n }\n };\n HeaderNavigationService.prototype.getHeaderContainer = function (position) {\n if (position === void 0) { position = 'center'; }\n if (position === null) {\n position = 'center';\n }\n return this.headerRoot.getHeaderContainers().get(position);\n };\n /*\n * This method navigates grid header vertically\n * @return {boolean} true to preventDefault on the event that caused this navigation.\n */\n HeaderNavigationService.prototype.navigateVertically = function (direction, fromHeader, event) {\n if (!fromHeader) {\n fromHeader = this.focusController.getFocusedHeader();\n }\n if (!fromHeader) {\n return false;\n }\n var headerRowIndex = fromHeader.headerRowIndex, column = fromHeader.column;\n var rowLen = this.getHeaderRowCount();\n var isUp = direction === exports.HeaderNavigationDirection.UP;\n var nextRow = isUp ? headerRowIndex - 1 : headerRowIndex + 1;\n var nextFocusColumn = null;\n var skipColumn = false;\n if (nextRow < 0) {\n nextRow = 0;\n nextFocusColumn = column;\n skipColumn = true;\n }\n if (nextRow >= rowLen) {\n nextRow = -1; // -1 indicates the focus should move to grid rows.\n }\n var currentRowType = this.getHeaderRowType(headerRowIndex);\n if (!skipColumn) {\n if (currentRowType === HeaderRowType.COLUMN_GROUP) {\n var currentColumn = column;\n nextFocusColumn = isUp ? column.getParent() : currentColumn.getDisplayedChildren()[0];\n }\n else if (currentRowType === HeaderRowType.FLOATING_FILTER) {\n nextFocusColumn = column;\n }\n else {\n var currentColumn = column;\n nextFocusColumn = isUp ? currentColumn.getParent() : currentColumn;\n }\n if (!nextFocusColumn) {\n return false;\n }\n }\n return this.focusController.focusHeaderPosition({ headerRowIndex: nextRow, column: nextFocusColumn }, undefined, false, true, event);\n };\n /*\n * This method navigates grid header horizontally\n * @return {boolean} true to preventDefault on the event that caused this navigation.\n */\n HeaderNavigationService.prototype.navigateHorizontally = function (direction, fromTab, event) {\n if (fromTab === void 0) { fromTab = false; }\n var focusedHeader = this.focusController.getFocusedHeader();\n var isLeft = direction === exports.HeaderNavigationDirection.LEFT;\n var isRtl = this.gridOptionsWrapper.isEnableRtl();\n var nextHeader;\n var normalisedDirection;\n // either navigating to the left or isRtl (cannot be both)\n if (isLeft !== isRtl) {\n normalisedDirection = 'Before';\n nextHeader = this.headerPositionUtils.findHeader(focusedHeader, normalisedDirection);\n }\n else {\n normalisedDirection = 'After';\n nextHeader = this.headerPositionUtils.findHeader(focusedHeader, normalisedDirection);\n }\n if (nextHeader) {\n return this.focusController.focusHeaderPosition(nextHeader, normalisedDirection, fromTab, true, event);\n }\n if (!fromTab) {\n return true;\n }\n return this.focusNextHeaderRow(focusedHeader, normalisedDirection, event);\n };\n HeaderNavigationService.prototype.focusNextHeaderRow = function (focusedHeader, direction, event) {\n var currentIndex = focusedHeader.headerRowIndex;\n var nextPosition = null;\n var nextRowIndex;\n if (direction === 'Before') {\n if (currentIndex > 0) {\n nextRowIndex = currentIndex - 1;\n nextPosition = this.headerPositionUtils.findColAtEdgeForHeaderRow(nextRowIndex, 'end');\n }\n }\n else {\n nextRowIndex = currentIndex + 1;\n nextPosition = this.headerPositionUtils.findColAtEdgeForHeaderRow(nextRowIndex, 'start');\n }\n return this.focusController.focusHeaderPosition(nextPosition, direction, true, true, event);\n };\n HeaderNavigationService.prototype.scrollToColumn = function (column, direction) {\n if (direction === void 0) { direction = 'After'; }\n if (column.getPinned()) {\n return;\n }\n var columnToScrollTo;\n if (column instanceof ColumnGroup) {\n var columns = column.getDisplayedLeafColumns();\n columnToScrollTo = direction === 'Before' ? last(columns) : columns[0];\n }\n else {\n columnToScrollTo = column;\n }\n this.gridPanel.ensureColumnVisible(columnToScrollTo);\n // need to nudge the scrolls for the floating items. otherwise when we set focus on a non-visible\n // floating cell, the scrolls get out of sync\n this.gridPanel.horizontallyScrollHeaderCenterAndFloatingCenter();\n // need to flush frames, to make sure the correct cells are rendered\n this.animationFrameService.flushAllFrames();\n };\n __decorate$R([\n Autowired('focusController')\n ], HeaderNavigationService.prototype, \"focusController\", void 0);\n __decorate$R([\n Autowired('headerPositionUtils')\n ], HeaderNavigationService.prototype, \"headerPositionUtils\", void 0);\n __decorate$R([\n Autowired('animationFrameService')\n ], HeaderNavigationService.prototype, \"animationFrameService\", void 0);\n HeaderNavigationService = __decorate$R([\n Bean('headerNavigationService')\n ], HeaderNavigationService);\n return HeaderNavigationService;\n}(BeanStub));\n\n/**\n * @ag-grid-community/core - Advanced Data Grid / Data Table supporting Javascript / React / AngularJS / Web Components\n * @version v25.1.0\n * @link http://www.ag-grid.com/\n * @license MIT\n */\nvar KeyName = /** @class */ (function () {\n function KeyName() {\n }\n KeyName.BACKSPACE = 'Backspace';\n KeyName.TAB = 'Tab';\n KeyName.ENTER = 'Enter';\n KeyName.SHIFT = 'Shift';\n KeyName.ESCAPE = 'Escape';\n KeyName.SPACE = ' ';\n KeyName.LEFT = 'ArrowLeft';\n KeyName.UP = 'ArrowUp';\n KeyName.RIGHT = 'ArrowRight';\n KeyName.DOWN = 'ArrowDown';\n KeyName.DELETE = 'Delete';\n // IE11 & Edge treat the numpad del key differently - with numlock on we get \"Del\" for key\n KeyName.NUM_PAD_DELETE = 'Del';\n KeyName.A = 'a';\n KeyName.C = 'c';\n KeyName.V = 'v';\n KeyName.D = 'd';\n KeyName.Z = 'z';\n KeyName.Y = 'y';\n KeyName.F2 = 'F2';\n KeyName.PAGE_UP = 'PageUp';\n KeyName.PAGE_DOWN = 'PageDown';\n KeyName.PAGE_HOME = 'Home';\n KeyName.PAGE_END = 'End';\n return KeyName;\n}());\n\n/**\n * @ag-grid-community/core - Advanced Data Grid / Data Table supporting Javascript / React / AngularJS / Web Components\n * @version v25.1.0\n * @link http://www.ag-grid.com/\n * @license MIT\n */\nvar __extends$Z = (undefined && undefined.__extends) || (function () {\n var extendStatics = function (d, b) {\n extendStatics = Object.setPrototypeOf ||\n ({ __proto__: [] } instanceof Array && function (d, b) { d.__proto__ = b; }) ||\n function (d, b) { for (var p in b) if (b.hasOwnProperty(p)) d[p] = b[p]; };\n return extendStatics(d, b);\n };\n return function (d, b) {\n extendStatics(d, b);\n function __() { this.constructor = d; }\n d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __());\n };\n})();\nvar __decorate$S = (undefined && undefined.__decorate) || function (decorators, target, key, desc) {\n var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d;\n if (typeof Reflect === \"object\" && typeof Reflect.decorate === \"function\") r = Reflect.decorate(decorators, target, key, desc);\n else for (var i = decorators.length - 1; i >= 0; i--) if (d = decorators[i]) r = (c < 3 ? d(r) : c > 3 ? d(target, key, r) : d(target, key)) || r;\n return c > 3 && r && Object.defineProperty(target, key, r), r;\n};\nvar HeaderRootComp = /** @class */ (function (_super) {\n __extends$Z(HeaderRootComp, _super);\n function HeaderRootComp() {\n var _this = _super.call(this, HeaderRootComp.TEMPLATE) || this;\n _this.headerContainers = new Map();\n return _this;\n }\n HeaderRootComp.prototype.postConstruct = function () {\n var _this = this;\n _super.prototype.postConstruct.call(this);\n this.printLayout = this.gridOptionsWrapper.getDomLayout() === Constants.DOM_LAYOUT_PRINT;\n this.gridApi.registerHeaderRootComp(this);\n this.autoWidthCalculator.registerHeaderRootComp(this);\n this.registerHeaderContainer(new HeaderContainer(this.eHeaderContainer, this.eHeaderViewport, null), 'center');\n this.registerHeaderContainer(new HeaderContainer(this.ePinnedLeftHeader, null, Constants.PINNED_LEFT), 'left');\n this.registerHeaderContainer(new HeaderContainer(this.ePinnedRightHeader, null, Constants.PINNED_RIGHT), 'right');\n this.headerContainers.forEach(function (container) { return _this.createManagedBean(container); });\n this.headerNavigationService.registerHeaderRoot(this);\n // shotgun way to get labels to change, eg from sum(amount) to avg(amount)\n this.addManagedListener(this.gridOptionsWrapper, GridOptionsWrapper.PROP_DOM_LAYOUT, this.onDomLayoutChanged.bind(this));\n // for setting ag-pivot-on / ag-pivot-off CSS classes\n this.addManagedListener(this.eventService, Events.EVENT_COLUMN_PIVOT_MODE_CHANGED, this.onPivotModeChanged.bind(this));\n this.onPivotModeChanged();\n this.addPreventHeaderScroll();\n if (this.columnController.isReady()) {\n this.refreshHeader();\n }\n };\n HeaderRootComp.prototype.registerGridComp = function (gridPanel) {\n this.gridPanel = gridPanel;\n this.headerContainers.forEach(function (c) { return c.setupDragAndDrop(gridPanel); });\n };\n HeaderRootComp.prototype.registerHeaderContainer = function (headerContainer, type) {\n this.headerContainers.set(type, headerContainer);\n };\n HeaderRootComp.prototype.onTabKeyDown = function (e) {\n var isRtl = this.gridOptionsWrapper.isEnableRtl();\n var direction = e.shiftKey !== isRtl\n ? exports.HeaderNavigationDirection.LEFT\n : exports.HeaderNavigationDirection.RIGHT;\n if (this.headerNavigationService.navigateHorizontally(direction, true, e) ||\n this.focusController.focusNextGridCoreContainer(e.shiftKey)) {\n e.preventDefault();\n }\n };\n HeaderRootComp.prototype.handleKeyDown = function (e) {\n var direction = null;\n switch (e.key) {\n case KeyName.LEFT:\n direction = exports.HeaderNavigationDirection.LEFT;\n case KeyName.RIGHT:\n if (!exists(direction)) {\n direction = exports.HeaderNavigationDirection.RIGHT;\n }\n this.headerNavigationService.navigateHorizontally(direction, false, e);\n break;\n case KeyName.UP:\n direction = exports.HeaderNavigationDirection.UP;\n case KeyName.DOWN:\n if (!exists(direction)) {\n direction = exports.HeaderNavigationDirection.DOWN;\n }\n if (this.headerNavigationService.navigateVertically(direction, null, e)) {\n e.preventDefault();\n }\n break;\n default:\n return;\n }\n };\n HeaderRootComp.prototype.onFocusOut = function (e) {\n var relatedTarget = e.relatedTarget;\n var eGui = this.getGui();\n if (!relatedTarget && eGui.contains(document.activeElement)) {\n return;\n }\n if (!eGui.contains(relatedTarget)) {\n this.focusController.clearFocusedHeader();\n }\n };\n HeaderRootComp.prototype.onDomLayoutChanged = function () {\n var newValue = this.gridOptionsWrapper.getDomLayout() === Constants.DOM_LAYOUT_PRINT;\n if (this.printLayout !== newValue) {\n this.printLayout = newValue;\n this.refreshHeader();\n }\n };\n HeaderRootComp.prototype.setHorizontalScroll = function (offset) {\n this.eHeaderContainer.style.transform = \"translateX(\" + offset + \"px)\";\n };\n HeaderRootComp.prototype.forEachHeaderElement = function (callback) {\n this.headerContainers.forEach(function (childContainer) { return childContainer.forEachHeaderElement(callback); });\n };\n HeaderRootComp.prototype.refreshHeader = function () {\n this.headerContainers.forEach(function (container) { return container.refresh(); });\n };\n HeaderRootComp.prototype.onPivotModeChanged = function () {\n var pivotMode = this.columnController.isPivotMode();\n addOrRemoveCssClass(this.getGui(), 'ag-pivot-on', pivotMode);\n addOrRemoveCssClass(this.getGui(), 'ag-pivot-off', !pivotMode);\n };\n HeaderRootComp.prototype.setHeight = function (height) {\n // one extra pixel is needed here to account for the\n // height of the border\n var px = height + 1 + \"px\";\n this.getGui().style.height = px;\n this.getGui().style.minHeight = px;\n };\n // if the user is in floating filter and hits tab a few times, the header can\n // end up scrolling to show items off the screen, leaving the grid and header\n // and the grid columns no longer in sync.\n HeaderRootComp.prototype.addPreventHeaderScroll = function () {\n var _this = this;\n this.addManagedListener(this.eHeaderViewport, 'scroll', function () {\n // if the header scrolls, the header will be out of sync. so we reset the\n // header scroll, and then scroll the body, which will in turn set the offset\n // on the header, giving the impression that the header scrolled as expected.\n var scrollLeft = _this.eHeaderViewport.scrollLeft;\n if (scrollLeft !== 0) {\n _this.gridPanel.scrollHorizontally(scrollLeft);\n _this.eHeaderViewport.scrollLeft = 0;\n }\n });\n };\n HeaderRootComp.prototype.getHeaderContainers = function () {\n return this.headerContainers;\n };\n HeaderRootComp.prototype.setHeaderContainerWidth = function (width) {\n this.eHeaderContainer.style.width = width + \"px\";\n };\n HeaderRootComp.prototype.setLeftVisible = function (visible) {\n setDisplayed(this.ePinnedLeftHeader, visible);\n };\n HeaderRootComp.prototype.setRightVisible = function (visible) {\n setDisplayed(this.ePinnedRightHeader, visible);\n };\n HeaderRootComp.TEMPLATE = \"
\\n
\\n
\\n
\\n
\\n
\\n
\";\n __decorate$S([\n RefSelector('ePinnedLeftHeader')\n ], HeaderRootComp.prototype, \"ePinnedLeftHeader\", void 0);\n __decorate$S([\n RefSelector('ePinnedRightHeader')\n ], HeaderRootComp.prototype, \"ePinnedRightHeader\", void 0);\n __decorate$S([\n RefSelector('eHeaderContainer')\n ], HeaderRootComp.prototype, \"eHeaderContainer\", void 0);\n __decorate$S([\n RefSelector('eHeaderViewport')\n ], HeaderRootComp.prototype, \"eHeaderViewport\", void 0);\n __decorate$S([\n Autowired('columnController')\n ], HeaderRootComp.prototype, \"columnController\", void 0);\n __decorate$S([\n Autowired('gridApi')\n ], HeaderRootComp.prototype, \"gridApi\", void 0);\n __decorate$S([\n Autowired('autoWidthCalculator')\n ], HeaderRootComp.prototype, \"autoWidthCalculator\", void 0);\n __decorate$S([\n Autowired('headerNavigationService')\n ], HeaderRootComp.prototype, \"headerNavigationService\", void 0);\n return HeaderRootComp;\n}(ManagedFocusComponent));\n\n/**\n * @ag-grid-community/core - Advanced Data Grid / Data Table supporting Javascript / React / AngularJS / Web Components\n * @version v25.1.0\n * @link http://www.ag-grid.com/\n * @license MIT\n */\nvar __extends$_ = (undefined && undefined.__extends) || (function () {\n var extendStatics = function (d, b) {\n extendStatics = Object.setPrototypeOf ||\n ({ __proto__: [] } instanceof Array && function (d, b) { d.__proto__ = b; }) ||\n function (d, b) { for (var p in b) if (b.hasOwnProperty(p)) d[p] = b[p]; };\n return extendStatics(d, b);\n };\n return function (d, b) {\n extendStatics(d, b);\n function __() { this.constructor = d; }\n d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __());\n };\n})();\nvar __assign$5 = (undefined && undefined.__assign) || function () {\n __assign$5 = Object.assign || function(t) {\n for (var s, i = 1, n = arguments.length; i < n; i++) {\n s = arguments[i];\n for (var p in s) if (Object.prototype.hasOwnProperty.call(s, p))\n t[p] = s[p];\n }\n return t;\n };\n return __assign$5.apply(this, arguments);\n};\nvar __decorate$T = (undefined && undefined.__decorate) || function (decorators, target, key, desc) {\n var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d;\n if (typeof Reflect === \"object\" && typeof Reflect.decorate === \"function\") r = Reflect.decorate(decorators, target, key, desc);\n else for (var i = decorators.length - 1; i >= 0; i--) if (d = decorators[i]) r = (c < 3 ? d(r) : c > 3 ? d(target, key, r) : d(target, key)) || r;\n return c > 3 && r && Object.defineProperty(target, key, r), r;\n};\nvar FilterManager = /** @class */ (function (_super) {\n __extends$_(FilterManager, _super);\n function FilterManager() {\n var _this = _super !== null && _super.apply(this, arguments) || this;\n _this.allAdvancedFilters = new Map();\n _this.activeAdvancedFilters = [];\n _this.quickFilter = null;\n _this.quickFilterParts = null;\n // this is true when the grid is processing the filter change. this is used by the cell comps, so that they\n // don't flash when data changes due to filter changes. there is no need to flash when filter changes as the\n // user is in control, so doesn't make sense to show flashing changes. for example, go to main demo where\n // this feature is turned off (hack code to always return false for isSuppressFlashingCellsBecauseFiltering(), put in)\n // 100,000 rows and group by country. then do some filtering. all the cells flash, which is silly.\n _this.processingFilterChange = false;\n return _this;\n }\n FilterManager_1 = FilterManager;\n FilterManager.prototype.init = function () {\n this.addManagedListener(this.eventService, Events.EVENT_ROW_DATA_CHANGED, this.onNewRowsLoaded.bind(this));\n this.addManagedListener(this.eventService, Events.EVENT_NEW_COLUMNS_LOADED, this.onNewColumnsLoaded.bind(this));\n this.quickFilter = this.parseQuickFilter(this.gridOptionsWrapper.getQuickFilterText());\n this.setQuickFilterParts();\n this.allowShowChangeAfterFilter = this.gridOptionsWrapper.isAllowShowChangeAfterFilter();\n // check this here, in case there is a filter from the start\n this.checkExternalFilter();\n };\n FilterManager.prototype.setQuickFilterParts = function () {\n this.quickFilterParts = this.quickFilter ? this.quickFilter.split(' ') : null;\n };\n FilterManager.prototype.setFilterModel = function (model) {\n var _this = this;\n var allPromises = [];\n if (model) {\n // mark the filters as we set them, so any active filters left over we stop\n var modelKeys_1 = convertToSet(Object.keys(model));\n this.allAdvancedFilters.forEach(function (filterWrapper, colId) {\n var newModel = model[colId];\n allPromises.push(_this.setModelOnFilterWrapper(filterWrapper.filterPromise, newModel));\n modelKeys_1.delete(colId);\n });\n // at this point, processedFields contains data for which we don't have a filter working yet\n modelKeys_1.forEach(function (colId) {\n var column = _this.columnController.getPrimaryColumn(colId);\n if (!column) {\n console.warn('Warning ag-grid setFilterModel - no column found for colId ' + colId);\n return;\n }\n var filterWrapper = _this.getOrCreateFilterWrapper(column, 'NO_UI');\n allPromises.push(_this.setModelOnFilterWrapper(filterWrapper.filterPromise, model[colId]));\n });\n }\n else {\n this.allAdvancedFilters.forEach(function (filterWrapper) {\n allPromises.push(_this.setModelOnFilterWrapper(filterWrapper.filterPromise, null));\n });\n }\n AgPromise.all(allPromises).then(function () { return _this.onFilterChanged(); });\n };\n FilterManager.prototype.setModelOnFilterWrapper = function (filterPromise, newModel) {\n return new AgPromise(function (resolve) {\n filterPromise.then(function (filter) {\n if (typeof filter.setModel !== 'function') {\n console.warn('Warning ag-grid - filter missing setModel method, which is needed for setFilterModel');\n resolve();\n }\n (filter.setModel(newModel) || AgPromise.resolve()).then(function () { return resolve(); });\n });\n });\n };\n FilterManager.prototype.getFilterModel = function () {\n var result = {};\n this.allAdvancedFilters.forEach(function (filterWrapper, key) {\n // because user can provide filters, we provide useful error checking and messages\n var filterPromise = filterWrapper.filterPromise;\n var filter = filterPromise.resolveNow(null, function (promiseFilter) { return promiseFilter; });\n if (filter == null) {\n return null;\n }\n if (typeof filter.getModel !== 'function') {\n console.warn('Warning ag-grid - filter API missing getModel method, which is needed for getFilterModel');\n return;\n }\n var model = filter.getModel();\n if (exists(model)) {\n result[key] = model;\n }\n });\n return result;\n };\n // returns true if any advanced filter (ie not quick filter) active\n FilterManager.prototype.isAdvancedFilterPresent = function () {\n return this.activeAdvancedFilters.length > 0;\n };\n // called by:\n // 1) onFilterChanged()\n // 2) onNewRowsLoaded()\n FilterManager.prototype.updateActiveFilters = function () {\n var _this = this;\n this.activeAdvancedFilters.length = 0;\n this.allAdvancedFilters.forEach(function (filterWrapper) {\n if (filterWrapper.filterPromise.resolveNow(false, function (filter) { return filter.isFilterActive(); })) {\n var resolvedPromise = filterWrapper.filterPromise.resolveNow(null, function (filter) { return filter; });\n _this.activeAdvancedFilters.push(resolvedPromise);\n }\n });\n };\n FilterManager.prototype.updateFilterFlagInColumns = function (source, additionalEventAttributes) {\n this.allAdvancedFilters.forEach(function (filterWrapper) {\n var isFilterActive = filterWrapper.filterPromise.resolveNow(false, function (filter) { return filter.isFilterActive(); });\n filterWrapper.column.setFilterActive(isFilterActive, source, additionalEventAttributes);\n });\n };\n FilterManager.prototype.isAnyFilterPresent = function () {\n return this.isQuickFilterPresent() || this.isAdvancedFilterPresent() || this.externalFilterPresent;\n };\n FilterManager.prototype.doAdvancedFiltersPass = function (node, filterToSkip) {\n var data = node.data;\n for (var i = 0; i < this.activeAdvancedFilters.length; i++) {\n var filter = this.activeAdvancedFilters[i];\n if (filter == null || filter === filterToSkip) {\n continue;\n }\n if (typeof filter.doesFilterPass !== 'function') {\n // because users can do custom filters, give nice error message\n throw new Error('Filter is missing method doesFilterPass');\n }\n if (!filter.doesFilterPass({ node: node, data: data })) {\n return false;\n }\n }\n return true;\n };\n FilterManager.prototype.parseQuickFilter = function (newFilter) {\n if (!exists(newFilter)) {\n return null;\n }\n if (!this.gridOptionsWrapper.isRowModelDefault()) {\n console.warn('ag-grid: quick filtering only works with the Client-Side Row Model');\n return null;\n }\n return newFilter.toUpperCase();\n };\n FilterManager.prototype.setQuickFilter = function (newFilter) {\n var parsedFilter = this.parseQuickFilter(newFilter);\n if (this.quickFilter !== parsedFilter) {\n this.quickFilter = parsedFilter;\n this.setQuickFilterParts();\n this.onFilterChanged();\n }\n };\n FilterManager.prototype.checkExternalFilter = function () {\n this.externalFilterPresent = this.gridOptionsWrapper.isExternalFilterPresent();\n };\n FilterManager.prototype.onFilterChanged = function (filterInstance, additionalEventAttributes) {\n this.updateActiveFilters();\n this.updateFilterFlagInColumns('filterChanged', additionalEventAttributes);\n this.checkExternalFilter();\n this.allAdvancedFilters.forEach(function (filterWrapper) {\n filterWrapper.filterPromise.then(function (filter) {\n if (filter !== filterInstance && filter.onAnyFilterChanged) {\n filter.onAnyFilterChanged();\n }\n });\n });\n var filterChangedEvent = {\n type: Events.EVENT_FILTER_CHANGED,\n api: this.gridApi,\n columnApi: this.columnApi\n };\n if (additionalEventAttributes) {\n mergeDeep(filterChangedEvent, additionalEventAttributes);\n }\n // because internal events are not async in ag-grid, when the dispatchEvent\n // method comes back, we know all listeners have finished executing.\n this.processingFilterChange = true;\n this.eventService.dispatchEvent(filterChangedEvent);\n this.processingFilterChange = false;\n };\n FilterManager.prototype.isSuppressFlashingCellsBecauseFiltering = function () {\n // if user has elected to always flash cell changes, then always return false, otherwise we suppress flashing\n // changes when filtering\n return !this.allowShowChangeAfterFilter && this.processingFilterChange;\n };\n FilterManager.prototype.isQuickFilterPresent = function () {\n return this.quickFilter !== null;\n };\n FilterManager.prototype.doesRowPassOtherFilters = function (filterToSkip, node) {\n return this.doesRowPassFilter({ rowNode: node, filterInstanceToSkip: filterToSkip });\n };\n FilterManager.prototype.doesRowPassQuickFilterNoCache = function (node, filterPart) {\n var _this = this;\n var columns = this.columnController.getAllColumnsForQuickFilter();\n return some(columns, function (column) {\n var part = _this.getQuickFilterTextForColumn(column, node);\n return exists(part) && part.indexOf(filterPart) >= 0;\n });\n };\n FilterManager.prototype.doesRowPassQuickFilterCache = function (node, filterPart) {\n if (!node.quickFilterAggregateText) {\n this.aggregateRowForQuickFilter(node);\n }\n return node.quickFilterAggregateText.indexOf(filterPart) >= 0;\n };\n FilterManager.prototype.doesRowPassQuickFilter = function (node) {\n var _this = this;\n var usingCache = this.gridOptionsWrapper.isCacheQuickFilter();\n // each part must pass, if any fails, then the whole filter fails\n return every(this.quickFilterParts, function (part) {\n return usingCache ? _this.doesRowPassQuickFilterCache(node, part) : _this.doesRowPassQuickFilterNoCache(node, part);\n });\n };\n FilterManager.prototype.doesRowPassFilter = function (params) {\n // the row must pass ALL of the filters, so if any of them fail,\n // we return true. that means if a row passes the quick filter,\n // but fails the column filter, it fails overall\n // first up, check quick filter\n if (this.isQuickFilterPresent() && !this.doesRowPassQuickFilter(params.rowNode)) {\n return false;\n }\n // secondly, give the client a chance to reject this row\n if (this.externalFilterPresent && !this.gridOptionsWrapper.doesExternalFilterPass(params.rowNode)) {\n return false;\n }\n // lastly, check our internal advanced filter\n if (this.isAdvancedFilterPresent() && !this.doAdvancedFiltersPass(params.rowNode, params.filterInstanceToSkip)) {\n return false;\n }\n // got this far, all filters pass\n return true;\n };\n FilterManager.prototype.getQuickFilterTextForColumn = function (column, node) {\n var value = this.valueService.getValue(column, node, true);\n var colDef = column.getColDef();\n if (colDef.getQuickFilterText) {\n var params = {\n value: value,\n node: node,\n data: node.data,\n column: column,\n colDef: colDef,\n context: this.gridOptionsWrapper.getContext()\n };\n value = colDef.getQuickFilterText(params);\n }\n return exists(value) ? value.toString().toUpperCase() : null;\n };\n FilterManager.prototype.aggregateRowForQuickFilter = function (node) {\n var _this = this;\n var stringParts = [];\n var columns = this.columnController.getAllColumnsForQuickFilter();\n forEach(columns, function (column) {\n var part = _this.getQuickFilterTextForColumn(column, node);\n if (exists(part)) {\n stringParts.push(part);\n }\n });\n node.quickFilterAggregateText = stringParts.join(FilterManager_1.QUICK_FILTER_SEPARATOR);\n };\n FilterManager.prototype.onNewRowsLoaded = function (source) {\n this.allAdvancedFilters.forEach(function (filterWrapper) {\n filterWrapper.filterPromise.then(function (filter) {\n if (filter.onNewRowsLoaded) {\n filter.onNewRowsLoaded();\n }\n });\n });\n this.updateFilterFlagInColumns(source);\n this.updateActiveFilters();\n };\n FilterManager.prototype.createValueGetter = function (column) {\n var _this = this;\n return function (node) { return _this.valueService.getValue(column, node, true); };\n };\n FilterManager.prototype.getFilterComponent = function (column, source, createIfDoesNotExist) {\n if (createIfDoesNotExist === void 0) { createIfDoesNotExist = true; }\n if (createIfDoesNotExist) {\n return this.getOrCreateFilterWrapper(column, source).filterPromise;\n }\n var filterWrapper = this.cachedFilter(column);\n return filterWrapper ? filterWrapper.filterPromise : null;\n };\n FilterManager.prototype.isFilterActive = function (column) {\n var filterWrapper = this.cachedFilter(column);\n return !!filterWrapper && filterWrapper.filterPromise.resolveNow(false, function (filter) { return filter.isFilterActive(); });\n };\n FilterManager.prototype.getOrCreateFilterWrapper = function (column, source) {\n var filterWrapper = this.cachedFilter(column);\n if (!filterWrapper) {\n filterWrapper = this.createFilterWrapper(column, source);\n this.allAdvancedFilters.set(column.getColId(), filterWrapper);\n }\n else if (source !== 'NO_UI') {\n this.putIntoGui(filterWrapper, source);\n }\n return filterWrapper;\n };\n FilterManager.prototype.cachedFilter = function (column) {\n return this.allAdvancedFilters.get(column.getColId());\n };\n FilterManager.prototype.createFilterInstance = function (column, $scope) {\n var _this = this;\n var defaultFilter = ModuleRegistry.isRegistered(exports.ModuleNames.SetFilterModule) ? 'agSetColumnFilter' : 'agTextColumnFilter';\n var colDef = column.getColDef();\n var filterInstance;\n var params = __assign$5(__assign$5({}, this.createFilterParams(column, colDef, $scope)), { filterModifiedCallback: function () {\n var event = {\n type: Events.EVENT_FILTER_MODIFIED,\n api: _this.gridApi,\n columnApi: _this.columnApi,\n column: column,\n filterInstance: filterInstance\n };\n _this.eventService.dispatchEvent(event);\n }, filterChangedCallback: function (additionalEventAttributes) {\n return _this.onFilterChanged(filterInstance, additionalEventAttributes);\n }, doesRowPassOtherFilter: function (node) { return _this.doesRowPassOtherFilters(filterInstance, node); } });\n var res = this.userComponentFactory.newFilterComponent(colDef, params, defaultFilter);\n if (res) {\n res.then(function (r) { return filterInstance = r; });\n }\n return res;\n };\n FilterManager.prototype.createFilterParams = function (column, colDef, $scope) {\n if ($scope === void 0) { $scope = null; }\n var params = {\n api: this.gridOptionsWrapper.getApi(),\n column: column,\n colDef: cloneObject(colDef),\n rowModel: this.rowModel,\n filterChangedCallback: function () { },\n filterModifiedCallback: function () { },\n valueGetter: this.createValueGetter(column),\n context: this.gridOptionsWrapper.getContext(),\n doesRowPassOtherFilter: function () { return true; },\n };\n // hack in scope if using AngularJS\n if ($scope) {\n params.$scope = $scope;\n }\n return params;\n };\n FilterManager.prototype.createFilterWrapper = function (column, source) {\n var filterWrapper = {\n column: column,\n filterPromise: null,\n scope: null,\n compiledElement: null,\n guiPromise: AgPromise.resolve(null)\n };\n filterWrapper.scope = this.gridOptionsWrapper.isAngularCompileFilters() ? this.$scope.$new() : null;\n filterWrapper.filterPromise = this.createFilterInstance(column, filterWrapper.scope);\n if (filterWrapper.filterPromise) {\n this.putIntoGui(filterWrapper, source);\n }\n return filterWrapper;\n };\n FilterManager.prototype.putIntoGui = function (filterWrapper, source) {\n var _this = this;\n var eFilterGui = document.createElement('div');\n eFilterGui.className = 'ag-filter';\n filterWrapper.guiPromise = new AgPromise(function (resolve) {\n filterWrapper.filterPromise.then(function (filter) {\n var guiFromFilter = filter.getGui();\n if (!exists(guiFromFilter)) {\n console.warn(\"getGui method from filter returned \" + guiFromFilter + \", it should be a DOM element or an HTML template string.\");\n }\n // for backwards compatibility with Angular 1 - we\n // used to allow providing back HTML from getGui().\n // once we move away from supporting Angular 1\n // directly, we can change this.\n if (typeof guiFromFilter === 'string') {\n guiFromFilter = loadTemplate(guiFromFilter);\n }\n eFilterGui.appendChild(guiFromFilter);\n if (filterWrapper.scope) {\n var compiledElement = _this.$compile(eFilterGui)(filterWrapper.scope);\n filterWrapper.compiledElement = compiledElement;\n window.setTimeout(function () { return filterWrapper.scope.$apply(); }, 0);\n }\n resolve(eFilterGui);\n _this.eventService.dispatchEvent({\n type: Events.EVENT_FILTER_OPENED,\n column: filterWrapper.column,\n source: source,\n eGui: eFilterGui,\n api: _this.gridApi,\n columnApi: _this.columnApi\n });\n });\n });\n };\n FilterManager.prototype.onNewColumnsLoaded = function () {\n var _this = this;\n var atLeastOneFilterGone = false;\n this.allAdvancedFilters.forEach(function (filterWrapper) {\n var oldColumn = !_this.columnController.getPrimaryColumn(filterWrapper.column);\n if (oldColumn) {\n atLeastOneFilterGone = true;\n _this.disposeFilterWrapper(filterWrapper, 'filterDestroyed');\n }\n });\n if (atLeastOneFilterGone) {\n this.onFilterChanged();\n }\n };\n // destroys the filter, so it not longer takes part\n FilterManager.prototype.destroyFilter = function (column, source) {\n if (source === void 0) { source = 'api'; }\n var filterWrapper = this.allAdvancedFilters.get(column.getColId());\n if (filterWrapper) {\n this.disposeFilterWrapper(filterWrapper, source);\n this.onFilterChanged();\n }\n };\n FilterManager.prototype.disposeFilterWrapper = function (filterWrapper, source) {\n var _this = this;\n filterWrapper.filterPromise.then(function (filter) {\n (filter.setModel(null) || AgPromise.resolve()).then(function () {\n _this.getContext().destroyBean(filter);\n filterWrapper.column.setFilterActive(false, source);\n if (filterWrapper.scope) {\n if (filterWrapper.compiledElement) {\n filterWrapper.compiledElement.remove();\n }\n filterWrapper.scope.$destroy();\n }\n _this.allAdvancedFilters.delete(filterWrapper.column.getColId());\n });\n });\n };\n FilterManager.prototype.destroy = function () {\n var _this = this;\n _super.prototype.destroy.call(this);\n this.allAdvancedFilters.forEach(function (filterWrapper) { return _this.disposeFilterWrapper(filterWrapper, 'filterDestroyed'); });\n };\n var FilterManager_1;\n FilterManager.QUICK_FILTER_SEPARATOR = '\\n';\n __decorate$T([\n Autowired('$compile')\n ], FilterManager.prototype, \"$compile\", void 0);\n __decorate$T([\n Autowired('$scope')\n ], FilterManager.prototype, \"$scope\", void 0);\n __decorate$T([\n Autowired('valueService')\n ], FilterManager.prototype, \"valueService\", void 0);\n __decorate$T([\n Autowired('columnController')\n ], FilterManager.prototype, \"columnController\", void 0);\n __decorate$T([\n Autowired('rowModel')\n ], FilterManager.prototype, \"rowModel\", void 0);\n __decorate$T([\n Autowired('columnApi')\n ], FilterManager.prototype, \"columnApi\", void 0);\n __decorate$T([\n Autowired('gridApi')\n ], FilterManager.prototype, \"gridApi\", void 0);\n __decorate$T([\n Autowired('userComponentFactory')\n ], FilterManager.prototype, \"userComponentFactory\", void 0);\n __decorate$T([\n PostConstruct\n ], FilterManager.prototype, \"init\", null);\n __decorate$T([\n PreDestroy\n ], FilterManager.prototype, \"destroy\", null);\n FilterManager = FilterManager_1 = __decorate$T([\n Bean('filterManager')\n ], FilterManager);\n return FilterManager;\n}(BeanStub));\n\n/**\n * @ag-grid-community/core - Advanced Data Grid / Data Table supporting Javascript / React / AngularJS / Web Components\n * @version v25.1.0\n * @link http://www.ag-grid.com/\n * @license MIT\n */\nvar __extends$$ = (undefined && undefined.__extends) || (function () {\n var extendStatics = function (d, b) {\n extendStatics = Object.setPrototypeOf ||\n ({ __proto__: [] } instanceof Array && function (d, b) { d.__proto__ = b; }) ||\n function (d, b) { for (var p in b) if (b.hasOwnProperty(p)) d[p] = b[p]; };\n return extendStatics(d, b);\n };\n return function (d, b) {\n extendStatics(d, b);\n function __() { this.constructor = d; }\n d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __());\n };\n})();\nvar __decorate$U = (undefined && undefined.__decorate) || function (decorators, target, key, desc) {\n var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d;\n if (typeof Reflect === \"object\" && typeof Reflect.decorate === \"function\") r = Reflect.decorate(decorators, target, key, desc);\n else for (var i = decorators.length - 1; i >= 0; i--) if (d = decorators[i]) r = (c < 3 ? d(r) : c > 3 ? d(target, key, r) : d(target, key)) || r;\n return c > 3 && r && Object.defineProperty(target, key, r), r;\n};\nvar ValueService = /** @class */ (function (_super) {\n __extends$$(ValueService, _super);\n function ValueService() {\n var _this = _super !== null && _super.apply(this, arguments) || this;\n _this.initialised = false;\n return _this;\n }\n ValueService.prototype.init = function () {\n this.cellExpressions = this.gridOptionsWrapper.isEnableCellExpressions();\n this.initialised = true;\n };\n ValueService.prototype.getValue = function (column, rowNode, forFilter, ignoreAggData) {\n if (forFilter === void 0) { forFilter = false; }\n if (ignoreAggData === void 0) { ignoreAggData = false; }\n // hack - the grid is getting refreshed before this bean gets initialised, race condition.\n // really should have a way so they get initialised in the right order???\n if (!this.initialised) {\n this.init();\n }\n if (!rowNode) {\n return;\n }\n // pull these out to make code below easier to read\n var colDef = column.getColDef();\n var field = colDef.field;\n var colId = column.getId();\n var data = rowNode.data;\n var result;\n // if there is a value getter, this gets precedence over a field\n var groupDataExists = rowNode.groupData && rowNode.groupData[colId] !== undefined;\n var aggDataExists = !ignoreAggData && rowNode.aggData && rowNode.aggData[colId] !== undefined;\n if (forFilter && colDef.filterValueGetter) {\n result = this.executeFilterValueGetter(colDef.filterValueGetter, data, column, rowNode);\n }\n else if (this.gridOptionsWrapper.isTreeData() && aggDataExists) {\n result = rowNode.aggData[colId];\n }\n else if (this.gridOptionsWrapper.isTreeData() && colDef.valueGetter) {\n result = this.executeValueGetter(colDef.valueGetter, data, column, rowNode);\n }\n else if (this.gridOptionsWrapper.isTreeData() && (field && data)) {\n result = getValueUsingField(data, field, column.isFieldContainsDots());\n }\n else if (groupDataExists) {\n result = rowNode.groupData[colId];\n }\n else if (aggDataExists) {\n result = rowNode.aggData[colId];\n }\n else if (colDef.valueGetter) {\n result = this.executeValueGetter(colDef.valueGetter, data, column, rowNode);\n }\n else if (field && data) {\n result = getValueUsingField(data, field, column.isFieldContainsDots());\n }\n // the result could be an expression itself, if we are allowing cell values to be expressions\n if (this.cellExpressions && (typeof result === 'string') && result.indexOf('=') === 0) {\n var cellValueGetter = result.substring(1);\n result = this.executeValueGetter(cellValueGetter, data, column, rowNode);\n }\n if (result == null) {\n var openedGroup = this.getOpenedGroup(rowNode, column);\n if (openedGroup != null) {\n return openedGroup;\n }\n }\n return result;\n };\n ValueService.prototype.getOpenedGroup = function (rowNode, column) {\n if (!this.gridOptionsWrapper.isShowOpenedGroup()) {\n return;\n }\n var colDef = column.getColDef();\n if (!colDef.showRowGroup) {\n return;\n }\n var showRowGroup = column.getColDef().showRowGroup;\n var pointer = rowNode.parent;\n while (pointer != null) {\n if (pointer.rowGroupColumn && (showRowGroup === true || showRowGroup === pointer.rowGroupColumn.getId())) {\n return pointer.key;\n }\n pointer = pointer.parent;\n }\n return undefined;\n };\n ValueService.prototype.setValue = function (rowNode, colKey, newValue, eventSource) {\n var column = this.columnController.getPrimaryColumn(colKey);\n if (!rowNode || !column) {\n return;\n }\n // this will only happen if user is trying to paste into a group row, which doesn't make sense\n // the user should not be trying to paste into group rows\n if (missing(rowNode.data)) {\n rowNode.data = {};\n }\n // for backwards compatibility we are also retrieving the newValueHandler as well as the valueSetter\n var _a = column.getColDef(), field = _a.field, newValueHandler = _a.newValueHandler, valueSetter = _a.valueSetter;\n // need either a field or a newValueHandler for this to work\n if (missing(field) && missing(newValueHandler) && missing(valueSetter)) {\n // we don't tell user about newValueHandler, as that is deprecated\n console.warn(\"AG Grid: you need either field or valueSetter set on colDef for editing to work\");\n return;\n }\n var params = {\n node: rowNode,\n data: rowNode.data,\n oldValue: this.getValue(column, rowNode),\n newValue: newValue,\n colDef: column.getColDef(),\n column: column,\n api: this.gridOptionsWrapper.getApi(),\n columnApi: this.gridOptionsWrapper.getColumnApi(),\n context: this.gridOptionsWrapper.getContext()\n };\n params.newValue = newValue;\n var valueWasDifferent;\n if (newValueHandler && exists(newValueHandler)) {\n valueWasDifferent = newValueHandler(params);\n }\n else if (exists(valueSetter)) {\n valueWasDifferent = this.expressionService.evaluate(valueSetter, params);\n }\n else {\n valueWasDifferent = this.setValueUsingField(rowNode.data, field, newValue, column.isFieldContainsDots());\n }\n // in case user forgot to return something (possible if they are not using TypeScript\n // and just forgot, or using an old newValueHandler we didn't always expect a return\n // value here), we default the return value to true, so we always refresh.\n if (valueWasDifferent === undefined) {\n valueWasDifferent = true;\n }\n // if no change to the value, then no need to do the updating, or notifying via events.\n // otherwise the user could be tabbing around the grid, and cellValueChange would get called\n // all the time.\n if (!valueWasDifferent) {\n return;\n }\n // reset quick filter on this row\n rowNode.resetQuickFilterAggregateText();\n this.valueCache.onDataChanged();\n params.newValue = this.getValue(column, rowNode);\n var onCellValueChanged = column.getColDef().onCellValueChanged;\n if (typeof onCellValueChanged === 'function') {\n // to make callback async, do in a timeout\n setTimeout(function () { return onCellValueChanged(params); }, 0);\n }\n var event = {\n type: Events.EVENT_CELL_VALUE_CHANGED,\n event: null,\n rowIndex: rowNode.rowIndex,\n rowPinned: rowNode.rowPinned,\n column: params.column,\n api: params.api,\n columnApi: params.columnApi,\n colDef: params.colDef,\n context: params.context,\n data: rowNode.data,\n node: rowNode,\n oldValue: params.oldValue,\n newValue: params.newValue,\n value: params.newValue,\n source: eventSource\n };\n this.eventService.dispatchEvent(event);\n };\n ValueService.prototype.setValueUsingField = function (data, field, newValue, isFieldContainsDots) {\n if (!field) {\n return false;\n }\n // if no '.', then it's not a deep value\n var valuesAreSame = false;\n if (!isFieldContainsDots) {\n data[field] = newValue;\n }\n else {\n // otherwise it is a deep value, so need to dig for it\n var fieldPieces = field.split('.');\n var currentObject = data;\n while (fieldPieces.length > 0 && currentObject) {\n var fieldPiece = fieldPieces.shift();\n if (fieldPieces.length === 0) {\n currentObject[fieldPiece] = newValue;\n }\n else {\n currentObject = currentObject[fieldPiece];\n }\n }\n }\n return !valuesAreSame;\n };\n ValueService.prototype.executeFilterValueGetter = function (valueGetter, data, column, rowNode) {\n var params = {\n data: data,\n node: rowNode,\n column: column,\n colDef: column.getColDef(),\n api: this.gridOptionsWrapper.getApi(),\n columnApi: this.gridOptionsWrapper.getColumnApi(),\n context: this.gridOptionsWrapper.getContext(),\n getValue: this.getValueCallback.bind(this, rowNode)\n };\n return this.expressionService.evaluate(valueGetter, params);\n };\n ValueService.prototype.executeValueGetter = function (valueGetter, data, column, rowNode) {\n var colId = column.getId();\n // if inside the same turn, just return back the value we got last time\n var valueFromCache = this.valueCache.getValue(rowNode, colId);\n if (valueFromCache !== undefined) {\n return valueFromCache;\n }\n var params = {\n data: data,\n node: rowNode,\n column: column,\n colDef: column.getColDef(),\n api: this.gridOptionsWrapper.getApi(),\n columnApi: this.gridOptionsWrapper.getColumnApi(),\n context: this.gridOptionsWrapper.getContext(),\n getValue: this.getValueCallback.bind(this, rowNode)\n };\n var result = this.expressionService.evaluate(valueGetter, params);\n // if a turn is active, store the value in case the grid asks for it again\n this.valueCache.setValue(rowNode, colId, result);\n return result;\n };\n ValueService.prototype.getValueCallback = function (node, field) {\n var otherColumn = this.columnController.getPrimaryColumn(field);\n if (otherColumn) {\n return this.getValue(otherColumn, node);\n }\n return null;\n };\n // used by row grouping and pivot, to get key for a row. col can be a pivot col or a row grouping col\n ValueService.prototype.getKeyForNode = function (col, rowNode) {\n var value = this.getValue(col, rowNode);\n var keyCreator = col.getColDef().keyCreator;\n var result = keyCreator ? keyCreator({ value: value }) : value;\n // if already a string, or missing, just return it\n if (typeof result === 'string' || result == null) {\n return result;\n }\n result = String(result);\n if (result === '[object Object]') {\n doOnce(function () {\n console.warn('AG Grid: a column you are grouping or pivoting by has objects as values. If you want to group by complex objects then either a) use a colDef.keyCreator (se AG Grid docs) or b) to toString() on the object to return a key');\n }, 'getKeyForNode - warn about [object,object]');\n }\n return result;\n };\n __decorate$U([\n Autowired('expressionService')\n ], ValueService.prototype, \"expressionService\", void 0);\n __decorate$U([\n Autowired('columnController')\n ], ValueService.prototype, \"columnController\", void 0);\n __decorate$U([\n Autowired('valueCache')\n ], ValueService.prototype, \"valueCache\", void 0);\n __decorate$U([\n PostConstruct\n ], ValueService.prototype, \"init\", null);\n ValueService = __decorate$U([\n Bean('valueService')\n ], ValueService);\n return ValueService;\n}(BeanStub));\n\n/**\n * @ag-grid-community/core - Advanced Data Grid / Data Table supporting Javascript / React / AngularJS / Web Components\n * @version v25.1.0\n * @link http://www.ag-grid.com/\n * @license MIT\n */\nvar __decorate$V = (undefined && undefined.__decorate) || function (decorators, target, key, desc) {\n var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d;\n if (typeof Reflect === \"object\" && typeof Reflect.decorate === \"function\") r = Reflect.decorate(decorators, target, key, desc);\n else for (var i = decorators.length - 1; i >= 0; i--) if (d = decorators[i]) r = (c < 3 ? d(r) : c > 3 ? d(target, key, r) : d(target, key)) || r;\n return c > 3 && r && Object.defineProperty(target, key, r), r;\n};\n/**\n * There are many instances of this component covering each of the areas a row can be entered\n * eg body, pinned left, fullWidth. The component differs from others in that it's given the\n * elements, there is no template. All of the elements are part of the GridPanel.\n */\nvar RowContainerComponent = /** @class */ (function () {\n function RowContainerComponent(params) {\n this.childCount = 0;\n this.rowTemplatesToAdd = [];\n this.afterGuiAttachedCallbacks = [];\n // this is to cater for a 'strange behaviour' where when a panel is made visible, it is firing a scroll\n // event which we want to ignore. see gridPanel.onAnyBodyScroll()\n this.lastMadeVisibleTime = 0;\n this.eContainer = params.eContainer;\n this.eViewport = params.eViewport;\n if (params.eWrapper) {\n this.eWrapper = params.eWrapper;\n }\n this.hideWhenNoChildren = !!params.hideWhenNoChildren;\n }\n RowContainerComponent.prototype.setVerticalScrollPosition = function (verticalScrollPosition) {\n this.scrollTop = verticalScrollPosition;\n };\n RowContainerComponent.prototype.postConstruct = function () {\n this.checkDomOrder();\n this.checkVisibility();\n this.gridOptionsWrapper.addEventListener(GridOptionsWrapper.PROP_DOM_LAYOUT, this.checkDomOrder.bind(this));\n };\n RowContainerComponent.prototype.checkDomOrder = function () {\n this.domOrder = this.gridOptionsWrapper.isEnsureDomOrder();\n };\n RowContainerComponent.prototype.getRowElement = function (compId) {\n return this.eContainer.querySelector(\"[comp-id=\\\"\" + compId + \"\\\"]\");\n };\n RowContainerComponent.prototype.setHeight = function (height) {\n if (height == null) {\n this.eContainer.style.height = '';\n return;\n }\n this.eContainer.style.height = height + \"px\";\n if (this.eWrapper) {\n this.eWrapper.style.height = height + \"px\";\n }\n };\n RowContainerComponent.prototype.flushRowTemplates = function () {\n // if doing dom order, then rowTemplates will be empty,\n // or if no rows added since last time also empty.\n if (this.rowTemplatesToAdd.length !== 0) {\n var htmlToAdd = this.rowTemplatesToAdd.join('');\n appendHtml(this.eContainer, htmlToAdd);\n this.rowTemplatesToAdd.length = 0;\n }\n // this only empty if no rows since last time, as when\n // doing dom order, we still have callbacks to process\n this.afterGuiAttachedCallbacks.forEach(function (func) { return func(); });\n this.afterGuiAttachedCallbacks.length = 0;\n this.lastPlacedElement = null;\n };\n RowContainerComponent.prototype.appendRowTemplate = function (rowTemplate, callback) {\n if (this.domOrder) {\n this.lastPlacedElement = insertTemplateWithDomOrder(this.eContainer, rowTemplate, this.lastPlacedElement);\n }\n else {\n this.rowTemplatesToAdd.push(rowTemplate);\n }\n this.afterGuiAttachedCallbacks.push(callback);\n // it is important we put items in in order, so that when we open a row group,\n // the new rows are inserted after the opened group, but before the rows below.\n // that way, the rows below are over the new rows (as dom renders last in dom over\n // items previous in dom), otherwise the child rows would cover the row below and\n // that meant the user doesn't see the rows below slide away.\n this.childCount++;\n this.checkVisibility();\n };\n RowContainerComponent.prototype.ensureDomOrder = function (eRow) {\n if (this.domOrder) {\n ensureDomOrder(this.eContainer, eRow, this.lastPlacedElement);\n this.lastPlacedElement = eRow;\n }\n };\n RowContainerComponent.prototype.removeRowElement = function (eRow) {\n this.eContainer.removeChild(eRow);\n this.childCount--;\n this.checkVisibility();\n };\n RowContainerComponent.prototype.checkVisibility = function () {\n if (!this.hideWhenNoChildren) {\n return;\n }\n var eGui = this.eViewport ? this.eViewport : this.eContainer;\n var visible = this.childCount > 0;\n if (this.visible !== visible) {\n this.visible = visible;\n this.lastMadeVisibleTime = new Date().getTime();\n setDisplayed(eGui, visible);\n // if we are showing the viewport, then the scroll is always zero,\n // so we need to align with the other sections (ie if this is full\n // width container, and first time showing a full width row, we need to\n // scroll it so full width rows are show in right place alongside the\n // body rows). without this, there was an issue with 'loading rows' for\n // server side row model, as loading rows are full width, and they were\n // not getting displayed in the right location when rows were expanded.\n if (visible && this.eViewport) {\n this.eViewport.scrollTop = this.scrollTop;\n }\n }\n };\n RowContainerComponent.prototype.isMadeVisibleRecently = function () {\n var now = new Date().getTime();\n var millisSinceVisible = now - this.lastMadeVisibleTime;\n return millisSinceVisible < 500;\n };\n __decorate$V([\n Autowired('gridOptionsWrapper')\n ], RowContainerComponent.prototype, \"gridOptionsWrapper\", void 0);\n __decorate$V([\n PostConstruct\n ], RowContainerComponent.prototype, \"postConstruct\", null);\n return RowContainerComponent;\n}());\n\n/**\n * @ag-grid-community/core - Advanced Data Grid / Data Table supporting Javascript / React / AngularJS / Web Components\n * @version v25.1.0\n * @link http://www.ag-grid.com/\n * @license MIT\n */\nvar __extends$10 = (undefined && undefined.__extends) || (function () {\n var extendStatics = function (d, b) {\n extendStatics = Object.setPrototypeOf ||\n ({ __proto__: [] } instanceof Array && function (d, b) { d.__proto__ = b; }) ||\n function (d, b) { for (var p in b) if (b.hasOwnProperty(p)) d[p] = b[p]; };\n return extendStatics(d, b);\n };\n return function (d, b) {\n extendStatics(d, b);\n function __() { this.constructor = d; }\n d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __());\n };\n})();\nvar __assign$6 = (undefined && undefined.__assign) || function () {\n __assign$6 = Object.assign || function(t) {\n for (var s, i = 1, n = arguments.length; i < n; i++) {\n s = arguments[i];\n for (var p in s) if (Object.prototype.hasOwnProperty.call(s, p))\n t[p] = s[p];\n }\n return t;\n };\n return __assign$6.apply(this, arguments);\n};\nvar __decorate$W = (undefined && undefined.__decorate) || function (decorators, target, key, desc) {\n var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d;\n if (typeof Reflect === \"object\" && typeof Reflect.decorate === \"function\") r = Reflect.decorate(decorators, target, key, desc);\n else for (var i = decorators.length - 1; i >= 0; i--) if (d = decorators[i]) r = (c < 3 ? d(r) : c > 3 ? d(target, key, r) : d(target, key)) || r;\n return c > 3 && r && Object.defineProperty(target, key, r), r;\n};\nvar __spreadArrays$4 = (undefined && undefined.__spreadArrays) || function () {\n for (var s = 0, i = 0, il = arguments.length; i < il; i++) s += arguments[i].length;\n for (var r = Array(s), k = 0, i = 0; i < il; i++)\n for (var a = arguments[i], j = 0, jl = a.length; j < jl; j++, k++)\n r[k] = a[j];\n return r;\n};\nvar RowDragFeature = /** @class */ (function (_super) {\n __extends$10(RowDragFeature, _super);\n function RowDragFeature(eContainer, gridPanel) {\n var _this = _super.call(this) || this;\n _this.isMultiRowDrag = false;\n _this.isGridSorted = false;\n _this.isGridFiltered = false;\n _this.isRowGroupActive = false;\n _this.eContainer = eContainer;\n _this.gridPanel = gridPanel;\n return _this;\n }\n RowDragFeature.prototype.postConstruct = function () {\n if (this.gridOptionsWrapper.isRowModelDefault()) {\n this.clientSideRowModel = this.rowModel;\n }\n this.addManagedListener(this.eventService, Events.EVENT_SORT_CHANGED, this.onSortChanged.bind(this));\n this.addManagedListener(this.eventService, Events.EVENT_FILTER_CHANGED, this.onFilterChanged.bind(this));\n this.addManagedListener(this.eventService, Events.EVENT_COLUMN_ROW_GROUP_CHANGED, this.onRowGroupChanged.bind(this));\n this.onSortChanged();\n this.onFilterChanged();\n this.onRowGroupChanged();\n };\n RowDragFeature.prototype.onSortChanged = function () {\n this.isGridSorted = this.sortController.isSortActive();\n };\n RowDragFeature.prototype.onFilterChanged = function () {\n this.isGridFiltered = this.filterManager.isAnyFilterPresent();\n };\n RowDragFeature.prototype.onRowGroupChanged = function () {\n var rowGroups = this.columnController.getRowGroupColumns();\n this.isRowGroupActive = !missingOrEmpty(rowGroups);\n };\n RowDragFeature.prototype.getContainer = function () {\n return this.eContainer;\n };\n RowDragFeature.prototype.isInterestedIn = function (type) {\n return type === exports.DragSourceType.RowDrag;\n };\n RowDragFeature.prototype.getIconName = function () {\n var managedDrag = this.gridOptionsWrapper.isRowDragManaged();\n if (managedDrag && this.shouldPreventRowMove()) {\n return DragAndDropService.ICON_NOT_ALLOWED;\n }\n return DragAndDropService.ICON_MOVE;\n };\n RowDragFeature.prototype.shouldPreventRowMove = function () {\n return this.isGridSorted || this.isGridFiltered || this.isRowGroupActive;\n };\n RowDragFeature.prototype.getRowNodes = function (draggingEvent) {\n if (!this.isFromThisGrid(draggingEvent)) {\n return draggingEvent.dragItem.rowNodes || [];\n }\n var enableMultiRowDragging = this.gridOptionsWrapper.isEnableMultiRowDragging();\n var selectedNodes = this.selectionController.getSelectedNodes();\n var currentNode = draggingEvent.dragItem.rowNode;\n if (enableMultiRowDragging && selectedNodes.indexOf(currentNode) !== -1) {\n this.isMultiRowDrag = true;\n return __spreadArrays$4(selectedNodes);\n }\n this.isMultiRowDrag = false;\n return [currentNode];\n };\n RowDragFeature.prototype.onDragEnter = function (draggingEvent) {\n // when entering, we fire the enter event, then in onEnterOrDragging,\n // we also fire the move event. so we get both events when entering.\n this.dispatchGridEvent(Events.EVENT_ROW_DRAG_ENTER, draggingEvent);\n this.getRowNodes(draggingEvent).forEach(function (rowNode) {\n rowNode.setDragging(true);\n });\n this.onEnterOrDragging(draggingEvent);\n };\n RowDragFeature.prototype.onDragging = function (draggingEvent) {\n this.onEnterOrDragging(draggingEvent);\n };\n RowDragFeature.prototype.isFromThisGrid = function (draggingEvent) {\n var dragSourceDomDataKey = draggingEvent.dragSource.dragSourceDomDataKey;\n return dragSourceDomDataKey === this.gridOptionsWrapper.getDomDataKey();\n };\n RowDragFeature.prototype.isDropZoneWithinThisGrid = function (draggingEvent) {\n var gridGui = this.gridPanel.getGui();\n var dropZoneTarget = draggingEvent.dropZoneTarget;\n return !gridGui.contains(dropZoneTarget);\n };\n RowDragFeature.prototype.onEnterOrDragging = function (draggingEvent) {\n // this event is fired for enter and move\n this.dispatchGridEvent(Events.EVENT_ROW_DRAG_MOVE, draggingEvent);\n this.lastDraggingEvent = draggingEvent;\n var pixel = this.mouseEventService.getNormalisedPosition(draggingEvent).y;\n var managedDrag = this.gridOptionsWrapper.isRowDragManaged();\n if (managedDrag) {\n this.doManagedDrag(draggingEvent, pixel);\n }\n this.checkCenterForScrolling(pixel);\n };\n RowDragFeature.prototype.doManagedDrag = function (draggingEvent, pixel) {\n var _this = this;\n var rowNodes;\n var isFromThisGrid = this.isFromThisGrid(draggingEvent);\n if (isFromThisGrid) {\n rowNodes = [draggingEvent.dragItem.rowNode];\n if (this.isMultiRowDrag) {\n rowNodes = __spreadArrays$4(this.selectionController.getSelectedNodes()).sort(function (a, b) { return _this.getRowIndexNumber(a) - _this.getRowIndexNumber(b); });\n }\n draggingEvent.dragItem.rowNodes = rowNodes;\n }\n else {\n rowNodes = draggingEvent.dragItem.rowNodes;\n }\n var managedDrag = this.gridOptionsWrapper.isRowDragManaged();\n if (managedDrag && this.shouldPreventRowMove()) {\n return;\n }\n if (this.gridOptionsWrapper.isSuppressMoveWhenRowDragging() || !isFromThisGrid) {\n if (!this.isDropZoneWithinThisGrid(draggingEvent)) {\n this.clientSideRowModel.highlightRowAtPixel(rowNodes[0], pixel);\n }\n }\n else {\n this.moveRows(rowNodes, pixel);\n }\n };\n RowDragFeature.prototype.getRowIndexNumber = function (rowNode) {\n return parseInt(last(rowNode.getRowIndexString().split('-')), 10);\n };\n RowDragFeature.prototype.moveRowAndClearHighlight = function (draggingEvent) {\n var _this = this;\n var lastHighlightedRowNode = this.clientSideRowModel.getLastHighlightedRowNode();\n var isBelow = lastHighlightedRowNode && lastHighlightedRowNode.highlighted === 'below';\n var pixel = this.mouseEventService.getNormalisedPosition(draggingEvent).y;\n var rowNodes = draggingEvent.dragItem.rowNodes;\n var increment = isBelow ? 1 : 0;\n if (this.isFromThisGrid(draggingEvent)) {\n rowNodes.forEach(function (rowNode) {\n if (rowNode.rowTop < pixel) {\n increment -= 1;\n }\n });\n this.moveRows(rowNodes, pixel, increment);\n }\n else {\n var getRowNodeId_1 = this.gridOptionsWrapper.getRowNodeIdFunc();\n var addIndex = this.clientSideRowModel.getRowIndexAtPixel(pixel) + 1;\n if (this.clientSideRowModel.getHighlightPosition(pixel) === 'above') {\n addIndex--;\n }\n this.clientSideRowModel.updateRowData({\n add: rowNodes\n .map(function (node) { return node.data; })\n .filter(function (data) { return !_this.clientSideRowModel.getRowNode(getRowNodeId_1 ? getRowNodeId_1(data) : data.id); }),\n addIndex: addIndex\n });\n }\n this.clearRowHighlight();\n };\n RowDragFeature.prototype.clearRowHighlight = function () {\n this.clientSideRowModel.highlightRowAtPixel(null);\n };\n RowDragFeature.prototype.moveRows = function (rowNodes, pixel, increment) {\n if (increment === void 0) { increment = 0; }\n var rowWasMoved = this.clientSideRowModel.ensureRowsAtPixel(rowNodes, pixel, increment);\n if (rowWasMoved) {\n this.focusController.clearFocusedCell();\n if (this.rangeController) {\n this.rangeController.removeAllCellRanges();\n }\n }\n };\n RowDragFeature.prototype.checkCenterForScrolling = function (pixel) {\n // scroll if the mouse is within 50px of the grid edge\n var pixelRange = this.gridPanel.getVScrollPosition();\n // console.log(`pixelRange = (${pixelRange.top}, ${pixelRange.bottom})`);\n this.needToMoveUp = pixel < (pixelRange.top + 50);\n this.needToMoveDown = pixel > (pixelRange.bottom - 50);\n // console.log(`needToMoveUp = ${this.needToMoveUp} = pixel < (pixelRange.top + 50) = ${pixel} < (${pixelRange.top} + 50)`);\n // console.log(`needToMoveDown = ${this.needToMoveDown} = pixel < (pixelRange.top + 50) = ${pixel} < (${pixelRange.top} + 50)`);\n if (this.needToMoveUp || this.needToMoveDown) {\n this.ensureIntervalStarted();\n }\n else {\n this.ensureIntervalCleared();\n }\n };\n RowDragFeature.prototype.ensureIntervalStarted = function () {\n if (this.movingIntervalId) {\n return;\n }\n this.intervalCount = 0;\n this.movingIntervalId = window.setInterval(this.moveInterval.bind(this), 100);\n };\n RowDragFeature.prototype.ensureIntervalCleared = function () {\n if (!exists(this.movingIntervalId)) {\n return;\n }\n window.clearInterval(this.movingIntervalId);\n this.movingIntervalId = null;\n };\n RowDragFeature.prototype.moveInterval = function () {\n // the amounts we move get bigger at each interval, so the speed accelerates, starting a bit slow\n // and getting faster. this is to give smoother user experience. we max at 100px to limit the speed.\n var pixelsToMove;\n this.intervalCount++;\n pixelsToMove = 10 + (this.intervalCount * 5);\n if (pixelsToMove > 100) {\n pixelsToMove = 100;\n }\n var pixelsMoved = null;\n if (this.needToMoveDown) {\n pixelsMoved = this.gridPanel.scrollVertically(pixelsToMove);\n }\n else if (this.needToMoveUp) {\n pixelsMoved = this.gridPanel.scrollVertically(-pixelsToMove);\n }\n if (pixelsMoved !== 0) {\n this.onDragging(this.lastDraggingEvent);\n }\n };\n RowDragFeature.prototype.addRowDropZone = function (params) {\n var _this = this;\n if (!params.getContainer()) {\n doOnce(function () { return console.warn('AG Grid: addRowDropZone - A container target needs to be provided'); }, 'add-drop-zone-empty-target');\n return;\n }\n if (this.dragAndDropService.findExternalZone(params)) {\n console.warn('AG Grid: addRowDropZone - target already exists in the list of DropZones. Use `removeRowDropZone` before adding it again.');\n return;\n }\n var processedParams = {\n getContainer: params.getContainer\n };\n if (params.fromGrid) {\n params.fromGrid = undefined;\n processedParams = params;\n }\n else {\n if (params.onDragEnter) {\n processedParams.onDragEnter = function (e) {\n params.onDragEnter(_this.draggingToRowDragEvent(Events.EVENT_ROW_DRAG_ENTER, e));\n };\n }\n if (params.onDragLeave) {\n processedParams.onDragLeave = function (e) {\n params.onDragLeave(_this.draggingToRowDragEvent(Events.EVENT_ROW_DRAG_LEAVE, e));\n };\n }\n if (params.onDragging) {\n processedParams.onDragging = function (e) {\n params.onDragging(_this.draggingToRowDragEvent(Events.EVENT_ROW_DRAG_MOVE, e));\n };\n }\n if (params.onDragStop) {\n processedParams.onDragStop = function (e) {\n params.onDragStop(_this.draggingToRowDragEvent(Events.EVENT_ROW_DRAG_END, e));\n };\n }\n }\n this.dragAndDropService.addDropTarget(__assign$6({ isInterestedIn: function (type) { return type === exports.DragSourceType.RowDrag; }, getIconName: function () { return DragAndDropService.ICON_MOVE; }, external: true }, processedParams));\n };\n RowDragFeature.prototype.getRowDropZone = function (events) {\n var _this = this;\n var getContainer = this.getContainer.bind(this);\n var onDragEnter = this.onDragEnter.bind(this);\n var onDragLeave = this.onDragLeave.bind(this);\n var onDragging = this.onDragging.bind(this);\n var onDragStop = this.onDragStop.bind(this);\n if (!events) {\n return { getContainer: getContainer, onDragEnter: onDragEnter, onDragLeave: onDragLeave, onDragging: onDragging, onDragStop: onDragStop, /* @private */ fromGrid: true };\n }\n return {\n getContainer: getContainer,\n onDragEnter: events.onDragEnter\n ? (function (e) {\n onDragEnter(e);\n events.onDragEnter(_this.draggingToRowDragEvent(Events.EVENT_ROW_DRAG_ENTER, e));\n })\n : onDragEnter,\n onDragLeave: events.onDragLeave\n ? (function (e) {\n onDragLeave(e);\n events.onDragLeave(_this.draggingToRowDragEvent(Events.EVENT_ROW_DRAG_LEAVE, e));\n })\n : onDragLeave,\n onDragging: events.onDragging\n ? (function (e) {\n onDragging(e);\n events.onDragging(_this.draggingToRowDragEvent(Events.EVENT_ROW_DRAG_MOVE, e));\n })\n : onDragging,\n onDragStop: events.onDragStop\n ? (function (e) {\n onDragStop(e);\n events.onDragStop(_this.draggingToRowDragEvent(Events.EVENT_ROW_DRAG_END, e));\n })\n : onDragStop,\n fromGrid: true /* @private */\n };\n };\n RowDragFeature.prototype.draggingToRowDragEvent = function (type, draggingEvent) {\n var yNormalised = this.mouseEventService.getNormalisedPosition(draggingEvent).y;\n var mouseIsPastLastRow = yNormalised > this.paginationProxy.getCurrentPageHeight();\n var overIndex = -1;\n var overNode = null;\n if (!mouseIsPastLastRow) {\n overIndex = this.rowModel.getRowIndexAtPixel(yNormalised);\n overNode = this.rowModel.getRow(overIndex);\n }\n var vDirectionString;\n switch (draggingEvent.vDirection) {\n case exports.VerticalDirection.Down:\n vDirectionString = 'down';\n break;\n case exports.VerticalDirection.Up:\n vDirectionString = 'up';\n break;\n default:\n vDirectionString = null;\n break;\n }\n var event = {\n type: type,\n api: this.gridOptionsWrapper.getApi(),\n columnApi: this.gridOptionsWrapper.getColumnApi(),\n event: draggingEvent.event,\n node: draggingEvent.dragItem.rowNode,\n nodes: draggingEvent.dragItem.rowNodes,\n overIndex: overIndex,\n overNode: overNode,\n y: yNormalised,\n vDirection: vDirectionString\n };\n return event;\n };\n RowDragFeature.prototype.dispatchGridEvent = function (type, draggingEvent) {\n var event = this.draggingToRowDragEvent(type, draggingEvent);\n this.eventService.dispatchEvent(event);\n };\n RowDragFeature.prototype.onDragLeave = function (draggingEvent) {\n this.dispatchGridEvent(Events.EVENT_ROW_DRAG_LEAVE, draggingEvent);\n this.stopDragging(draggingEvent);\n if (this.gridOptionsWrapper.isRowDragManaged()) {\n this.clearRowHighlight();\n }\n if (this.isFromThisGrid(draggingEvent)) {\n this.isMultiRowDrag = false;\n }\n };\n RowDragFeature.prototype.onDragStop = function (draggingEvent) {\n this.dispatchGridEvent(Events.EVENT_ROW_DRAG_END, draggingEvent);\n this.stopDragging(draggingEvent);\n if (this.gridOptionsWrapper.isRowDragManaged() &&\n (this.gridOptionsWrapper.isSuppressMoveWhenRowDragging() || !this.isFromThisGrid(draggingEvent)) &&\n !this.isDropZoneWithinThisGrid(draggingEvent)) {\n this.moveRowAndClearHighlight(draggingEvent);\n }\n };\n RowDragFeature.prototype.stopDragging = function (draggingEvent) {\n this.ensureIntervalCleared();\n this.getRowNodes(draggingEvent).forEach(function (rowNode) {\n rowNode.setDragging(false);\n });\n };\n __decorate$W([\n Autowired('dragAndDropService')\n ], RowDragFeature.prototype, \"dragAndDropService\", void 0);\n __decorate$W([\n Autowired('rowModel')\n ], RowDragFeature.prototype, \"rowModel\", void 0);\n __decorate$W([\n Autowired('paginationProxy')\n ], RowDragFeature.prototype, \"paginationProxy\", void 0);\n __decorate$W([\n Autowired('columnController')\n ], RowDragFeature.prototype, \"columnController\", void 0);\n __decorate$W([\n Autowired('focusController')\n ], RowDragFeature.prototype, \"focusController\", void 0);\n __decorate$W([\n Autowired('sortController')\n ], RowDragFeature.prototype, \"sortController\", void 0);\n __decorate$W([\n Autowired('filterManager')\n ], RowDragFeature.prototype, \"filterManager\", void 0);\n __decorate$W([\n Autowired('selectionController')\n ], RowDragFeature.prototype, \"selectionController\", void 0);\n __decorate$W([\n Optional('rangeController')\n ], RowDragFeature.prototype, \"rangeController\", void 0);\n __decorate$W([\n Autowired('mouseEventService')\n ], RowDragFeature.prototype, \"mouseEventService\", void 0);\n __decorate$W([\n PostConstruct\n ], RowDragFeature.prototype, \"postConstruct\", null);\n return RowDragFeature;\n}(BeanStub));\n\n/**\n * @ag-grid-community/core - Advanced Data Grid / Data Table supporting Javascript / React / AngularJS / Web Components\n * @version v25.1.0\n * @link http://www.ag-grid.com/\n * @license MIT\n */\nvar __extends$11 = (undefined && undefined.__extends) || (function () {\n var extendStatics = function (d, b) {\n extendStatics = Object.setPrototypeOf ||\n ({ __proto__: [] } instanceof Array && function (d, b) { d.__proto__ = b; }) ||\n function (d, b) { for (var p in b) if (b.hasOwnProperty(p)) d[p] = b[p]; };\n return extendStatics(d, b);\n };\n return function (d, b) {\n extendStatics(d, b);\n function __() { this.constructor = d; }\n d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __());\n };\n})();\nvar __decorate$X = (undefined && undefined.__decorate) || function (decorators, target, key, desc) {\n var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d;\n if (typeof Reflect === \"object\" && typeof Reflect.decorate === \"function\") r = Reflect.decorate(decorators, target, key, desc);\n else for (var i = decorators.length - 1; i >= 0; i--) if (d = decorators[i]) r = (c < 3 ? d(r) : c > 3 ? d(target, key, r) : d(target, key)) || r;\n return c > 3 && r && Object.defineProperty(target, key, r), r;\n};\n// in the html below, it is important that there are no white space between some of the divs, as if there is white space,\n// it won't render correctly in safari, as safari renders white space as a gap\nvar GRID_PANEL_NORMAL_TEMPLATE = /* html */ \"
\\n \\n
\\n
\\n
\\n
\\n
\\n
\\n
\\n
\\n
\\n
\\n
\\n
\\n
\\n
\\n
\\n
\\n
\\n
\\n
\\n
\\n
\\n
\\n
\\n
\\n
\\n
\\n
\\n
\\n
\\n
\\n
\\n
\\n
\\n \\n
\";\nvar GridPanel = /** @class */ (function (_super) {\n __extends$11(GridPanel, _super);\n function GridPanel() {\n var _this = _super.call(this, GRID_PANEL_NORMAL_TEMPLATE) || this;\n _this.scrollLeft = -1;\n _this.scrollTop = -1;\n _this.nextScrollTop = -1;\n _this.resetLastHorizontalScrollElementDebounced = debounce(_this.resetLastHorizontalScrollElement.bind(_this), 500);\n return _this;\n }\n GridPanel.prototype.getVScrollPosition = function () {\n var result = {\n top: this.eBodyViewport.scrollTop,\n bottom: this.eBodyViewport.scrollTop + this.eBodyViewport.offsetHeight\n };\n return result;\n };\n GridPanel.prototype.getHScrollPosition = function () {\n var result = {\n left: this.eCenterViewport.scrollLeft,\n right: this.eCenterViewport.scrollLeft + this.eCenterViewport.offsetWidth\n };\n return result;\n };\n GridPanel.prototype.onRowDataChanged = function () {\n this.showOrHideOverlay();\n };\n GridPanel.prototype.showOrHideOverlay = function () {\n var isEmpty = this.paginationProxy.isEmpty();\n var isSuppressNoRowsOverlay = this.gridOptionsWrapper.isSuppressNoRowsOverlay();\n var method = isEmpty && !isSuppressNoRowsOverlay ? 'showNoRowsOverlay' : 'hideOverlay';\n this[method]();\n };\n GridPanel.prototype.onNewColumnsLoaded = function () {\n // hide overlay if columns and rows exist, this can happen if columns are loaded after data.\n // this problem exists before of the race condition between the services (column controller in this case)\n // and the view (grid panel). if the model beans were all initialised first, and then the view beans second,\n // this race condition would not happen.\n if (this.columnController.isReady() && !this.paginationProxy.isEmpty()) {\n this.hideOverlay();\n }\n // we don't want each cellComp to register for events, as would increase rendering time.\n // so for newColumnsLoaded, we register once here (in rowRenderer) and then inform\n // each cell if / when event was fired.\n this.rowRenderer.forEachCellComp(function (cellComp) { return cellComp.onNewColumnsLoaded(); });\n };\n GridPanel.prototype.init = function () {\n var _this = this;\n this.enableRtl = this.gridOptionsWrapper.isEnableRtl();\n this.printLayout = this.gridOptionsWrapper.getDomLayout() === Constants.DOM_LAYOUT_PRINT;\n // these elements have different CSS when layout changes\n this.gridOptionsWrapper.addLayoutElement(this.getGui());\n this.gridOptionsWrapper.addLayoutElement(this.eBodyViewport);\n this.suppressScrollOnFloatingRow();\n this.setupRowAnimationCssClass();\n this.buildRowContainerComponents();\n this.addEventListeners();\n this.addDragListeners();\n this.addScrollListener();\n if (this.gridOptionsWrapper.isRowModelDefault() && !this.gridOptionsWrapper.getRowData()) {\n this.showLoadingOverlay();\n }\n this.setCellTextSelection(this.gridOptionsWrapper.isEnableCellTextSelect());\n this.setPinnedContainerSize();\n this.setHeaderAndFloatingHeights();\n this.disableBrowserDragging();\n this.addMouseListeners();\n this.addPreventScrollWhileDragging();\n this.addKeyboardEvents();\n this.addBodyViewportListener();\n this.addStopEditingWhenGridLosesFocus();\n this.mockContextMenuForIPad();\n this.addRowDragListener();\n if (this.$scope) {\n this.addAngularApplyCheck();\n }\n this.onDisplayedColumnsWidthChanged();\n this.gridApi.registerGridComp(this);\n this.alignedGridsService.registerGridComp(this);\n this.headerRootComp.registerGridComp(this);\n this.navigationService.registerGridComp(this);\n this.headerNavigationService.registerGridComp(this);\n this.heightScaler.registerGridComp(this);\n this.autoHeightCalculator.registerGridComp(this);\n this.columnAnimationService.registerGridComp(this);\n this.autoWidthCalculator.registerGridComp(this);\n this.paginationAutoPageSizeService.registerGridComp(this);\n this.mouseEventService.registerGridComp(this);\n this.beans.registerGridComp(this);\n this.rowRenderer.registerGridComp(this);\n this.animationFrameService.registerGridComp(this);\n if (this.contextMenuFactory) {\n this.contextMenuFactory.registerGridComp(this);\n }\n if (this.menuFactory) {\n this.menuFactory.registerGridComp(this);\n }\n if (this.rangeController || this.gridOptionsWrapper.isRowSelectionMulti()) {\n setAriaMultiSelectable(this.getGui(), true);\n if (this.rangeController) {\n this.rangeController.registerGridComp(this);\n }\n }\n [this.eCenterViewport, this.eBodyViewport].forEach(function (viewport) {\n var unsubscribeFromResize = _this.resizeObserverService.observeResize(viewport, _this.onCenterViewportResized.bind(_this));\n _this.addDestroyFunc(function () { return unsubscribeFromResize(); });\n });\n [this.eTop, this.eBodyViewport, this.eBottom].forEach(function (element) {\n _this.addManagedListener(element, 'focusin', function () {\n addCssClass(element, 'ag-has-focus');\n });\n _this.addManagedListener(element, 'focusout', function (e) {\n if (!element.contains(e.relatedTarget)) {\n removeCssClass(element, 'ag-has-focus');\n }\n });\n });\n };\n GridPanel.prototype.onDomLayoutChanged = function () {\n var newPrintLayout = this.gridOptionsWrapper.getDomLayout() === Constants.DOM_LAYOUT_PRINT;\n if (this.printLayout !== newPrintLayout) {\n this.printLayout = newPrintLayout;\n this.setWidthsOfContainers();\n // pinned containers are always hidden for print layout\n this.setPinnedContainerSize();\n }\n };\n GridPanel.prototype.onCenterViewportResized = function () {\n if (isVisible(this.eCenterViewport)) {\n this.checkViewportAndScrolls();\n var newWidth = this.getCenterWidth();\n if (newWidth !== this.centerWidth) {\n this.centerWidth = newWidth;\n this.columnController.refreshFlexedColumns({ viewportWidth: this.centerWidth, updateBodyWidths: true, fireResizedEvent: true });\n }\n }\n else {\n this.bodyHeight = 0;\n }\n };\n // used by ColumnAnimationService\n GridPanel.prototype.setColumnMovingCss = function (moving) {\n this.addOrRemoveCssClass('ag-column-moving', moving);\n };\n GridPanel.prototype.setCellTextSelection = function (selectable) {\n if (selectable === void 0) { selectable = false; }\n [this.eTop, this.eBodyViewport, this.eBottom]\n .forEach(function (ct) { return addOrRemoveCssClass(ct, 'ag-selectable', selectable); });\n };\n GridPanel.prototype.addRowDragListener = function () {\n this.rowDragFeature = this.createManagedBean(new RowDragFeature(this.eBodyViewport, this));\n this.dragAndDropService.addDropTarget(this.rowDragFeature);\n };\n GridPanel.prototype.getRowDragFeature = function () {\n return this.rowDragFeature;\n };\n GridPanel.prototype.addStopEditingWhenGridLosesFocus = function () {\n var _this = this;\n if (!this.gridOptionsWrapper.isStopEditingWhenGridLosesFocus()) {\n return;\n }\n var viewports = [this.eBodyViewport, this.eBottom, this.eTop];\n var focusOutListener = function (event) {\n // this is the element the focus is moving to\n var elementWithFocus = event.relatedTarget;\n if (getTabIndex(elementWithFocus) === null) {\n _this.rowRenderer.stopEditing();\n return;\n }\n var clickInsideGrid = viewports.some(function (viewport) { return viewport.contains(elementWithFocus); });\n if (!clickInsideGrid) {\n var popupService = _this.popupService;\n clickInsideGrid =\n popupService.getActivePopups().some(function (popup) { return popup.contains(elementWithFocus); }) ||\n popupService.isElementWithinCustomPopup(elementWithFocus);\n }\n if (!clickInsideGrid) {\n _this.rowRenderer.stopEditing();\n }\n };\n viewports.forEach(function (viewport) { return _this.addManagedListener(viewport, 'focusout', focusOutListener); });\n };\n GridPanel.prototype.addAngularApplyCheck = function () {\n var _this = this;\n // this makes sure if we queue up requests, we only execute oe\n var applyTriggered = false;\n var listener = function () {\n // only need to do one apply at a time\n if (applyTriggered) {\n return;\n }\n applyTriggered = true; // mark 'need apply' to true\n window.setTimeout(function () {\n applyTriggered = false;\n _this.$scope.$apply();\n }, 0);\n };\n // these are the events we need to do an apply after - these are the ones that can end up\n // with columns added or removed\n this.addManagedListener(this.eventService, Events.EVENT_DISPLAYED_COLUMNS_CHANGED, listener);\n this.addManagedListener(this.eventService, Events.EVENT_VIRTUAL_COLUMNS_CHANGED, listener);\n };\n // if we do not do this, then the user can select a pic in the grid (eg an image in a custom cell renderer)\n // and then that will start the browser native drag n' drop, which messes up with our own drag and drop.\n GridPanel.prototype.disableBrowserDragging = function () {\n this.addGuiEventListener('dragstart', function (event) {\n if (event.target instanceof HTMLImageElement) {\n event.preventDefault();\n return false;\n }\n });\n };\n GridPanel.prototype.addEventListeners = function () {\n this.addManagedListener(this.eventService, Events.EVENT_DISPLAYED_COLUMNS_CHANGED, this.onDisplayedColumnsChanged.bind(this));\n this.addManagedListener(this.eventService, Events.EVENT_DISPLAYED_COLUMNS_WIDTH_CHANGED, this.onDisplayedColumnsWidthChanged.bind(this));\n this.addManagedListener(this.eventService, Events.EVENT_PINNED_ROW_DATA_CHANGED, this.setHeaderAndFloatingHeights.bind(this));\n this.addManagedListener(this.eventService, Events.EVENT_ROW_DATA_CHANGED, this.onRowDataChanged.bind(this));\n this.addManagedListener(this.eventService, Events.EVENT_ROW_DATA_UPDATED, this.onRowDataChanged.bind(this));\n this.addManagedListener(this.eventService, Events.EVENT_NEW_COLUMNS_LOADED, this.onNewColumnsLoaded.bind(this));\n this.addManagedListener(this.eventService, Events.EVENT_SCROLLBAR_WIDTH_CHANGED, this.onScrollbarWidthChanged.bind(this));\n this.addManagedListener(this.gridOptionsWrapper, GridOptionsWrapper.PROP_HEADER_HEIGHT, this.setHeaderAndFloatingHeights.bind(this));\n this.addManagedListener(this.gridOptionsWrapper, GridOptionsWrapper.PROP_PIVOT_HEADER_HEIGHT, this.setHeaderAndFloatingHeights.bind(this));\n this.addManagedListener(this.gridOptionsWrapper, GridOptionsWrapper.PROP_GROUP_HEADER_HEIGHT, this.setHeaderAndFloatingHeights.bind(this));\n this.addManagedListener(this.gridOptionsWrapper, GridOptionsWrapper.PROP_PIVOT_GROUP_HEADER_HEIGHT, this.setHeaderAndFloatingHeights.bind(this));\n this.addManagedListener(this.gridOptionsWrapper, GridOptionsWrapper.PROP_FLOATING_FILTERS_HEIGHT, this.setHeaderAndFloatingHeights.bind(this));\n this.addManagedListener(this.gridOptionsWrapper, GridOptionsWrapper.PROP_DOM_LAYOUT, this.onDomLayoutChanged.bind(this));\n };\n GridPanel.prototype.addDragListeners = function () {\n var _this = this;\n if (!this.gridOptionsWrapper.isEnableRangeSelection() || // no range selection if no property\n missing(this.rangeController) // no range selection if not enterprise version\n ) {\n return;\n }\n var containers = [\n this.eLeftContainer,\n this.eRightContainer,\n this.eCenterContainer,\n this.eTop,\n this.eBottom\n ];\n containers.forEach(function (container) {\n var params = {\n eElement: container,\n onDragStart: _this.rangeController.onDragStart.bind(_this.rangeController),\n onDragStop: _this.rangeController.onDragStop.bind(_this.rangeController),\n onDragging: _this.rangeController.onDragging.bind(_this.rangeController)\n };\n _this.dragService.addDragSource(params);\n _this.addDestroyFunc(function () { return _this.dragService.removeDragSource(params); });\n });\n };\n GridPanel.prototype.addMouseListeners = function () {\n var _this = this;\n var eventNames = ['dblclick', 'contextmenu', 'mouseover', 'mouseout', 'click', 'mousedown'];\n eventNames.forEach(function (eventName) {\n var listener = _this.processMouseEvent.bind(_this, eventName);\n _this.eAllCellContainers.forEach(function (container) {\n return _this.addManagedListener(container, eventName, listener);\n });\n });\n };\n // this methods prevents the grid views from being scrolled while the dragService is being used\n // eg. the view should not scroll up and down while dragging rows using the rowDragComp.\n GridPanel.prototype.addPreventScrollWhileDragging = function () {\n var _this = this;\n var preventScroll = function (e) {\n if (_this.dragService.isDragging()) {\n if (e.cancelable) {\n e.preventDefault();\n }\n }\n };\n this.eAllCellContainers.forEach(function (container) {\n container.addEventListener('touchmove', preventScroll, { passive: false });\n });\n this.addDestroyFunc(function () {\n _this.eAllCellContainers.forEach(function (container) {\n container.removeEventListener('touchmove', preventScroll);\n });\n });\n };\n GridPanel.prototype.addKeyboardEvents = function () {\n var _this = this;\n var eventNames = ['keydown', 'keypress'];\n eventNames.forEach(function (eventName) {\n var listener = _this.processKeyboardEvent.bind(_this, eventName);\n _this.eAllCellContainers.forEach(function (container) {\n _this.addManagedListener(container, eventName, listener);\n });\n });\n };\n GridPanel.prototype.addBodyViewportListener = function () {\n var _this = this;\n // we want to listen for clicks directly on the eBodyViewport, so the user has a way of showing\n // the context menu if no rows or columns are displayed, or user simply clicks outside of a cell\n var listener = function (mouseEvent) {\n var target = getTarget(mouseEvent);\n if (target === _this.eBodyViewport || target === _this.eCenterViewport) {\n // show it\n _this.onContextMenu(mouseEvent, null, null, null, null, _this.getGui());\n _this.preventDefaultOnContextMenu(mouseEvent);\n }\n };\n this.addManagedListener(this.eBodyViewport, 'contextmenu', listener);\n };\n // + rangeController - used to know when to scroll when user is dragging outside the\n // main viewport while doing a range selection\n GridPanel.prototype.getBodyClientRect = function () {\n if (!this.eBodyViewport) {\n return;\n }\n return this.eBodyViewport.getBoundingClientRect();\n };\n GridPanel.prototype.getRowForEvent = function (event) {\n var sourceElement = getTarget(event);\n while (sourceElement) {\n var renderedRow = this.gridOptionsWrapper.getDomData(sourceElement, RowComp.DOM_DATA_KEY_RENDERED_ROW);\n if (renderedRow) {\n return renderedRow;\n }\n sourceElement = sourceElement.parentElement;\n }\n return null;\n };\n GridPanel.prototype.processKeyboardEvent = function (eventName, keyboardEvent) {\n var cellComp = getComponentForEvent(this.gridOptionsWrapper, keyboardEvent, 'cellComp');\n var rowComp = getComponentForEvent(this.gridOptionsWrapper, keyboardEvent, 'renderedRow');\n if (keyboardEvent.defaultPrevented) {\n return;\n }\n if (cellComp) {\n this.processCellKeyboardEvent(cellComp, eventName, keyboardEvent);\n }\n else if (rowComp && rowComp.isFullWidth()) {\n this.processFullWidthRowKeyboardEvent(rowComp, eventName, keyboardEvent);\n }\n };\n GridPanel.prototype.processCellKeyboardEvent = function (cellComp, eventName, keyboardEvent) {\n var rowNode = cellComp.getRenderedRow().getRowNode();\n var column = cellComp.getColumn();\n var editing = cellComp.isEditing();\n var gridProcessingAllowed = !isUserSuppressingKeyboardEvent(this.gridOptionsWrapper, keyboardEvent, rowNode, column, editing);\n if (gridProcessingAllowed) {\n switch (eventName) {\n case 'keydown':\n // first see if it's a scroll key, page up / down, home / end etc\n var wasScrollKey = !editing && this.navigationService.handlePageScrollingKey(keyboardEvent);\n // if not a scroll key, then we pass onto cell\n if (!wasScrollKey) {\n cellComp.onKeyDown(keyboardEvent);\n }\n // perform clipboard and undo / redo operations\n this.doGridOperations(keyboardEvent, cellComp);\n break;\n case 'keypress':\n cellComp.onKeyPress(keyboardEvent);\n break;\n }\n }\n if (eventName === 'keydown') {\n var cellKeyDownEvent = cellComp.createEvent(keyboardEvent, Events.EVENT_CELL_KEY_DOWN);\n this.eventService.dispatchEvent(cellKeyDownEvent);\n }\n if (eventName === 'keypress') {\n var cellKeyPressEvent = cellComp.createEvent(keyboardEvent, Events.EVENT_CELL_KEY_PRESS);\n this.eventService.dispatchEvent(cellKeyPressEvent);\n }\n };\n GridPanel.prototype.processFullWidthRowKeyboardEvent = function (rowComp, eventName, keyboardEvent) {\n var rowNode = rowComp.getRowNode();\n var focusedCell = this.beans.focusController.getFocusedCell();\n var column = (focusedCell && focusedCell.column);\n var gridProcessingAllowed = !isUserSuppressingKeyboardEvent(this.gridOptionsWrapper, keyboardEvent, rowNode, column, false);\n if (gridProcessingAllowed) {\n var key = keyboardEvent.key;\n if (eventName === 'keydown') {\n switch (key) {\n case KeyName.UP:\n case KeyName.DOWN:\n rowComp.onKeyboardNavigate(keyboardEvent);\n break;\n case KeyName.TAB:\n rowComp.onTabKeyDown(keyboardEvent);\n }\n }\n }\n };\n GridPanel.prototype.doGridOperations = function (keyboardEvent, cellComp) {\n // check if ctrl or meta key pressed\n if (!keyboardEvent.ctrlKey && !keyboardEvent.metaKey) {\n return;\n }\n // if the cell the event came from is editing, then we do not\n // want to do the default shortcut keys, otherwise the editor\n // (eg a text field) would not be able to do the normal cut/copy/paste\n if (cellComp.isEditing()) {\n return;\n }\n // for copy / paste, we don't want to execute when the event\n // was from a child grid (happens in master detail)\n if (!this.mouseEventService.isEventFromThisGrid(keyboardEvent)) {\n return;\n }\n switch (keyboardEvent.which) {\n case KeyCode.A:\n return this.onCtrlAndA(keyboardEvent);\n case KeyCode.C:\n return this.onCtrlAndC(keyboardEvent);\n case KeyCode.V:\n return this.onCtrlAndV();\n case KeyCode.D:\n return this.onCtrlAndD(keyboardEvent);\n case KeyCode.Z:\n return keyboardEvent.shiftKey ? this.undoRedoService.redo() : this.undoRedoService.undo();\n case KeyCode.Y:\n return this.undoRedoService.redo();\n }\n };\n // gets called by rowRenderer when new data loaded, as it will want to scroll to the top\n GridPanel.prototype.scrollToTop = function () {\n this.eBodyViewport.scrollTop = 0;\n };\n GridPanel.prototype.processMouseEvent = function (eventName, mouseEvent) {\n if (!this.mouseEventService.isEventFromThisGrid(mouseEvent) ||\n isStopPropagationForAgGrid(mouseEvent)) {\n return;\n }\n var rowComp = this.getRowForEvent(mouseEvent);\n var cellComp = this.mouseEventService.getRenderedCellForEvent(mouseEvent);\n if (eventName === \"contextmenu\") {\n this.preventDefaultOnContextMenu(mouseEvent);\n this.handleContextMenuMouseEvent(mouseEvent, null, rowComp, cellComp);\n }\n else {\n if (cellComp) {\n cellComp.onMouseEvent(eventName, mouseEvent);\n }\n if (rowComp) {\n rowComp.onMouseEvent(eventName, mouseEvent);\n }\n }\n };\n GridPanel.prototype.mockContextMenuForIPad = function () {\n var _this = this;\n // we do NOT want this when not in iPad, otherwise we will be doing\n if (!isIOSUserAgent()) {\n return;\n }\n this.eAllCellContainers.forEach(function (container) {\n var touchListener = new TouchListener(container);\n var longTapListener = function (event) {\n var rowComp = _this.getRowForEvent(event.touchEvent);\n var cellComp = _this.mouseEventService.getRenderedCellForEvent(event.touchEvent);\n _this.handleContextMenuMouseEvent(null, event.touchEvent, rowComp, cellComp);\n };\n _this.addManagedListener(touchListener, TouchListener.EVENT_LONG_TAP, longTapListener);\n _this.addDestroyFunc(function () { return touchListener.destroy(); });\n });\n };\n GridPanel.prototype.handleContextMenuMouseEvent = function (mouseEvent, touchEvent, rowComp, cellComp) {\n var rowNode = rowComp ? rowComp.getRowNode() : null;\n var column = cellComp ? cellComp.getColumn() : null;\n var value = null;\n if (column) {\n var event_1 = mouseEvent ? mouseEvent : touchEvent;\n cellComp.dispatchCellContextMenuEvent(event_1);\n value = this.valueService.getValue(column, rowNode);\n }\n // if user clicked on a cell, anchor to that cell, otherwise anchor to the grid panel\n var anchorToElement = cellComp ? cellComp.getGui() : this.getGui();\n this.onContextMenu(mouseEvent, touchEvent, rowNode, column, value, anchorToElement);\n };\n GridPanel.prototype.onContextMenu = function (mouseEvent, touchEvent, rowNode, column, value, anchorToElement) {\n // to allow us to debug in chrome, we ignore the event if ctrl is pressed.\n // not everyone wants this, so first 'if' below allows to turn this hack off.\n if (!this.gridOptionsWrapper.isAllowContextMenuWithControlKey()) {\n // then do the check\n if (mouseEvent && (mouseEvent.ctrlKey || mouseEvent.metaKey)) {\n return;\n }\n }\n if (this.contextMenuFactory && !this.gridOptionsWrapper.isSuppressContextMenu()) {\n var eventOrTouch = mouseEvent ? mouseEvent : touchEvent.touches[0];\n if (this.contextMenuFactory.showMenu(rowNode, column, value, eventOrTouch, anchorToElement)) {\n var event_2 = mouseEvent ? mouseEvent : touchEvent;\n event_2.preventDefault();\n }\n }\n };\n GridPanel.prototype.preventDefaultOnContextMenu = function (mouseEvent) {\n // if we don't do this, then middle click will never result in a 'click' event, as 'mousedown'\n // will be consumed by the browser to mean 'scroll' (as you can scroll with the middle mouse\n // button in the browser). so this property allows the user to receive middle button clicks if\n // they want.\n var gridOptionsWrapper = this.gridOptionsWrapper;\n var which = mouseEvent.which;\n if (gridOptionsWrapper.isPreventDefaultOnContextMenu() ||\n (gridOptionsWrapper.isSuppressMiddleClickScrolls() && which === 2)) {\n mouseEvent.preventDefault();\n }\n };\n GridPanel.prototype.onCtrlAndA = function (event) {\n var _a = this, pinnedRowModel = _a.pinnedRowModel, paginationProxy = _a.paginationProxy, rangeController = _a.rangeController;\n var PINNED_BOTTOM = Constants.PINNED_BOTTOM, PINNED_TOP = Constants.PINNED_TOP;\n if (rangeController && paginationProxy.isRowsToRender()) {\n var _b = [\n pinnedRowModel.isEmpty(PINNED_TOP),\n pinnedRowModel.isEmpty(PINNED_BOTTOM)\n ], isEmptyPinnedTop = _b[0], isEmptyPinnedBottom = _b[1];\n var floatingStart = isEmptyPinnedTop ? null : PINNED_TOP;\n var floatingEnd = void 0;\n var rowEnd = void 0;\n if (isEmptyPinnedBottom) {\n floatingEnd = null;\n rowEnd = this.paginationProxy.getRowCount() - 1;\n }\n else {\n floatingEnd = PINNED_BOTTOM;\n rowEnd = pinnedRowModel.getPinnedBottomRowData().length - 1;\n }\n var allDisplayedColumns = this.columnController.getAllDisplayedColumns();\n if (missingOrEmpty(allDisplayedColumns)) {\n return;\n }\n rangeController.setCellRange({\n rowStartIndex: 0,\n rowStartPinned: floatingStart,\n rowEndIndex: rowEnd,\n rowEndPinned: floatingEnd,\n columnStart: allDisplayedColumns[0],\n columnEnd: last(allDisplayedColumns)\n });\n }\n event.preventDefault();\n };\n GridPanel.prototype.onCtrlAndC = function (event) {\n if (!this.clipboardService || this.gridOptionsWrapper.isEnableCellTextSelection()) {\n return;\n }\n this.clipboardService.copyToClipboard();\n event.preventDefault();\n };\n GridPanel.prototype.onCtrlAndV = function () {\n if (ModuleRegistry.isRegistered(exports.ModuleNames.ClipboardModule) && !this.gridOptionsWrapper.isSuppressClipboardPaste()) {\n this.clipboardService.pasteFromClipboard();\n }\n };\n GridPanel.prototype.onCtrlAndD = function (event) {\n if (ModuleRegistry.isRegistered(exports.ModuleNames.ClipboardModule) && !this.gridOptionsWrapper.isSuppressClipboardPaste()) {\n this.clipboardService.copyRangeDown();\n }\n event.preventDefault();\n };\n // Valid values for position are bottom, middle and top\n // position should be {'top','middle','bottom', or undefined/null}.\n // if undefined/null, then the grid will to the minimal amount of scrolling,\n // eg if grid needs to scroll up, it scrolls until row is on top,\n // if grid needs to scroll down, it scrolls until row is on bottom,\n // if row is already in view, grid does not scroll\n GridPanel.prototype.ensureIndexVisible = function (index, position) {\n // if for print or auto height, everything is always visible\n if (this.printLayout) {\n return;\n }\n var rowCount = this.paginationProxy.getRowCount();\n if (typeof index !== 'number' || index < 0 || index >= rowCount) {\n console.warn('invalid row index for ensureIndexVisible: ' + index);\n return;\n }\n var isPaging = this.gridOptionsWrapper.isPagination();\n var paginationPanelEnabled = isPaging && !this.gridOptionsWrapper.isSuppressPaginationPanel();\n if (!paginationPanelEnabled) {\n this.paginationProxy.goToPageWithIndex(index);\n }\n var rowNode = this.paginationProxy.getRow(index);\n var rowGotShiftedDuringOperation;\n do {\n var startingRowTop = rowNode.rowTop;\n var startingRowHeight = rowNode.rowHeight;\n var paginationOffset = this.paginationProxy.getPixelOffset();\n var rowTopPixel = rowNode.rowTop - paginationOffset;\n var rowBottomPixel = rowTopPixel + rowNode.rowHeight;\n var scrollPosition = this.getVScrollPosition();\n var heightOffset = this.heightScaler.getOffset();\n var vScrollTop = scrollPosition.top + heightOffset;\n var vScrollBottom = scrollPosition.bottom + heightOffset;\n var viewportHeight = vScrollBottom - vScrollTop;\n // work out the pixels for top, middle and bottom up front,\n // make the if/else below easier to read\n var pxTop = this.heightScaler.getScrollPositionForPixel(rowTopPixel);\n var pxBottom = this.heightScaler.getScrollPositionForPixel(rowBottomPixel - viewportHeight);\n // make sure if middle, the row is not outside the top of the grid\n var pxMiddle = Math.min((pxTop + pxBottom) / 2, rowTopPixel);\n var rowBelowViewport = vScrollTop > rowTopPixel;\n var rowAboveViewport = vScrollBottom < rowBottomPixel;\n var newScrollPosition = null;\n if (position === 'top') {\n newScrollPosition = pxTop;\n }\n else if (position === 'bottom') {\n newScrollPosition = pxBottom;\n }\n else if (position === 'middle') {\n newScrollPosition = pxMiddle;\n }\n else if (rowBelowViewport) {\n // if row is before, scroll up with row at top\n newScrollPosition = pxTop;\n }\n else if (rowAboveViewport) {\n // if row is below, scroll down with row at bottom\n newScrollPosition = pxBottom;\n }\n if (newScrollPosition !== null) {\n this.eBodyViewport.scrollTop = newScrollPosition;\n this.rowRenderer.redrawAfterScroll();\n }\n // the row can get shifted if during the rendering (during rowRenderer.redrawAfterScroll()),\n // the height of a row changes due to lazy calculation of row heights when using\n // colDef.autoHeight or gridOptions.getRowHeight.\n // if row was shifted, then the position we scrolled to is incorrect.\n rowGotShiftedDuringOperation = (startingRowTop !== rowNode.rowTop)\n || (startingRowHeight !== rowNode.rowHeight);\n } while (rowGotShiftedDuringOperation);\n // so when we return back to user, the cells have rendered\n this.animationFrameService.flushAllFrames();\n };\n // + moveColumnController\n GridPanel.prototype.getCenterWidth = function () {\n return getInnerWidth(this.eCenterViewport);\n };\n GridPanel.prototype.isHorizontalScrollShowing = function () {\n var isAlwaysShowHorizontalScroll = this.gridOptionsWrapper.isAlwaysShowHorizontalScroll();\n return isAlwaysShowHorizontalScroll || isHorizontalScrollShowing(this.eCenterViewport);\n };\n GridPanel.prototype.isVerticalScrollShowing = function () {\n var isAlwaysShowVerticalScroll = this.gridOptionsWrapper.isAlwaysShowVerticalScroll();\n addOrRemoveCssClass(this.eBodyViewport, 'ag-force-vertical-scroll', isAlwaysShowVerticalScroll);\n return isAlwaysShowVerticalScroll || isVerticalScrollShowing(this.eBodyViewport);\n };\n GridPanel.prototype.onScrollbarWidthChanged = function () {\n this.checkViewportAndScrolls();\n };\n // gets called every time the viewport size changes. we use this to check visibility of scrollbars\n // in the grid panel, and also to check size and position of viewport for row and column virtualisation.\n GridPanel.prototype.checkViewportAndScrolls = function () {\n // results in updating anything that depends on scroll showing\n this.updateScrollVisibleService();\n // fires event if height changes, used by PaginationService, HeightScalerService, RowRenderer\n this.checkBodyHeight();\n // check for virtual columns for ColumnController\n this.onHorizontalViewportChanged();\n this.setPinnedContainerSize();\n // this is to cater for AG-3274, where grid is removed from the dom and then inserted back in again.\n // (which happens with some implementations of tabbing). this can result in horizontal scroll getting\n // reset back to the left, however no scroll event is fired. so we need to get header to also scroll\n // back to the left to be kept in sync.\n // adding and removing the grid from the DOM both resets the scroll position and\n // triggers a resize event, so notify listeners if the scroll position has changed\n if (this.scrollLeft !== this.getCenterViewportScrollLeft()) {\n this.onBodyHorizontalScroll(this.eCenterViewport);\n }\n };\n GridPanel.prototype.updateScrollVisibleService = function () {\n // because of column animation (which takes 200ms), we have to do this twice.\n // eg if user removes cols anywhere except at the RHS, then the cols on the RHS\n // will animate to the left to fill the gap. this animation means just after\n // the cols are removed, the remaining cols are still in the original location\n // at the start of the animation, so pre animation the H scrollbar is still needed,\n // but post animation it is not.\n this.updateScrollVisibleServiceImpl();\n setTimeout(this.updateScrollVisibleServiceImpl.bind(this), 500);\n };\n GridPanel.prototype.updateScrollVisibleServiceImpl = function () {\n var params = {\n horizontalScrollShowing: false,\n verticalScrollShowing: false\n };\n params.verticalScrollShowing = this.isVerticalScrollShowing();\n params.horizontalScrollShowing = this.isHorizontalScrollShowing();\n this.scrollVisibleService.setScrollsVisible(params);\n this.setHorizontalScrollVisible(params.horizontalScrollShowing);\n this.setVerticalScrollPaddingVisible(params.verticalScrollShowing);\n };\n GridPanel.prototype.setHorizontalScrollVisible = function (visible) {\n var isSuppressHorizontalScroll = this.gridOptionsWrapper.isSuppressHorizontalScroll();\n var scrollbarWidth = visible ? (this.gridOptionsWrapper.getScrollbarWidth() || 0) : 0;\n var scrollContainerSize = !isSuppressHorizontalScroll ? scrollbarWidth : 0;\n var addIEPadding = isBrowserIE() && visible;\n this.eCenterViewport.style.height = \"calc(100% + \" + scrollbarWidth + \"px)\";\n setFixedHeight(this.eHorizontalScrollBody, scrollContainerSize);\n // we have to add an extra pixel to the scroller viewport on IE because\n // if the container has the same size as the scrollbar, the scroll button won't work\n setFixedHeight(this.eBodyHorizontalScrollViewport, scrollContainerSize + (addIEPadding ? 1 : 0));\n setFixedHeight(this.eBodyHorizontalScrollContainer, scrollContainerSize);\n };\n GridPanel.prototype.setVerticalScrollPaddingVisible = function (show) {\n var scroller = show ? 'scroll' : 'hidden';\n this.eTop.style.overflowY = this.eBottom.style.overflowY = scroller;\n this.setFakeHScrollSpacerWidths();\n };\n GridPanel.prototype.updateRowCount = function () {\n var headerCount = this.headerNavigationService.getHeaderRowCount();\n var modelType = this.paginationProxy.getType();\n var rowCount = -1;\n if (modelType === Constants.ROW_MODEL_TYPE_CLIENT_SIDE) {\n rowCount = 0;\n this.paginationProxy.forEachNode(function (node) {\n if (!node.group) {\n rowCount++;\n }\n });\n }\n var total = rowCount === -1 ? -1 : (headerCount + rowCount);\n setAriaRowCount(this.getGui(), total);\n };\n GridPanel.prototype.updateColumnCount = function () {\n var columns = this.columnController.getAllGridColumns();\n setAriaColCount(this.getGui(), columns.length);\n };\n GridPanel.prototype.ensureColumnVisible = function (key) {\n var column = this.columnController.getGridColumn(key);\n if (!column) {\n return;\n }\n if (column.isPinned()) {\n console.warn('calling ensureIndexVisible on a ' + column.getPinned() + ' pinned column doesn\\'t make sense for column ' + column.getColId());\n return;\n }\n if (!this.columnController.isColumnDisplayed(column)) {\n console.warn('column is not currently visible');\n return;\n }\n var colLeftPixel = column.getLeft();\n var colRightPixel = colLeftPixel + column.getActualWidth();\n var viewportWidth = this.getCenterWidth();\n var scrollPosition = this.getCenterViewportScrollLeft();\n var bodyWidth = this.columnController.getBodyContainerWidth();\n var viewportLeftPixel;\n var viewportRightPixel;\n // the logic of working out left and right viewport px is both here and in the ColumnController,\n // need to refactor it out to one place\n if (this.enableRtl) {\n viewportLeftPixel = bodyWidth - scrollPosition - viewportWidth;\n viewportRightPixel = bodyWidth - scrollPosition;\n }\n else {\n viewportLeftPixel = scrollPosition;\n viewportRightPixel = viewportWidth + scrollPosition;\n }\n var viewportScrolledPastCol = viewportLeftPixel > colLeftPixel;\n var viewportScrolledBeforeCol = viewportRightPixel < colRightPixel;\n var colToSmallForViewport = viewportWidth < column.getActualWidth();\n var alignColToLeft = viewportScrolledPastCol || colToSmallForViewport;\n var alignColToRight = viewportScrolledBeforeCol;\n if (alignColToLeft || alignColToRight) {\n var newScrollPosition = void 0;\n if (this.enableRtl) {\n newScrollPosition = alignColToLeft ? (bodyWidth - viewportWidth - colLeftPixel) : (bodyWidth - colRightPixel);\n }\n else {\n newScrollPosition = alignColToLeft ? colLeftPixel : (colRightPixel - viewportWidth);\n }\n this.setCenterViewportScrollLeft(newScrollPosition);\n }\n // this will happen anyway, as the move will cause a 'scroll' event on the body, however\n // it is possible that the ensureColumnVisible method is called from within AG Grid and\n // the caller will need to have the columns rendered to continue, which will be before\n // the event has been worked on (which is the case for cell navigation).\n this.onHorizontalViewportChanged();\n // so when we return back to user, the cells have rendered\n this.animationFrameService.flushAllFrames();\n };\n GridPanel.prototype.showLoadingOverlay = function () {\n if (!this.gridOptionsWrapper.isSuppressLoadingOverlay()) {\n this.overlayWrapper.showLoadingOverlay();\n }\n };\n GridPanel.prototype.showNoRowsOverlay = function () {\n if (!this.gridOptionsWrapper.isSuppressNoRowsOverlay()) {\n this.overlayWrapper.showNoRowsOverlay();\n }\n };\n GridPanel.prototype.hideOverlay = function () {\n this.overlayWrapper.hideOverlay();\n };\n // method will call itself if no available width. this covers if the grid\n // isn't visible, but is just about to be visible.\n GridPanel.prototype.sizeColumnsToFit = function (nextTimeout) {\n var _this = this;\n var hasVerticalScroll = this.isVerticalScrollShowing();\n var diff = 0;\n if (hasVerticalScroll) {\n diff = this.gridOptionsWrapper.getScrollbarWidth();\n }\n var availableWidth = getInnerWidth(this.eBodyViewport) - diff;\n if (availableWidth > 0) {\n this.columnController.sizeColumnsToFit(availableWidth, \"sizeColumnsToFit\");\n return;\n }\n if (nextTimeout === undefined) {\n window.setTimeout(function () {\n _this.sizeColumnsToFit(100);\n }, 0);\n }\n else if (nextTimeout === 100) {\n window.setTimeout(function () {\n _this.sizeColumnsToFit(500);\n }, 100);\n }\n else if (nextTimeout === 500) {\n window.setTimeout(function () {\n _this.sizeColumnsToFit(-1);\n }, 500);\n }\n else {\n console.warn('AG Grid: tried to call sizeColumnsToFit() but the grid is coming back with ' +\n 'zero width, maybe the grid is not visible yet on the screen?');\n }\n };\n // used by autoWidthCalculator and autoHeightCalculator\n GridPanel.prototype.getCenterContainer = function () {\n return this.eCenterContainer;\n };\n GridPanel.prototype.getDropTargetBodyContainers = function () {\n return [this.eBodyViewport, this.eTopViewport, this.eBottomViewport];\n };\n GridPanel.prototype.getDropTargetLeftContainers = function () {\n return [this.eLeftContainer, this.eLeftBottom, this.eLeftTop];\n };\n GridPanel.prototype.getDropTargetRightContainers = function () {\n return [this.eRightContainer, this.eRightBottom, this.eRightTop];\n };\n GridPanel.prototype.buildRowContainerComponents = function () {\n var _this = this;\n this.eAllCellContainers = [\n this.eLeftContainer, this.eRightContainer, this.eCenterContainer,\n this.eTop, this.eBottom, this.eFullWidthContainer\n ];\n this.rowContainerComponents = {\n body: new RowContainerComponent({\n eContainer: this.eCenterContainer,\n eWrapper: this.eCenterColsClipper,\n eViewport: this.eBodyViewport\n }),\n fullWidth: new RowContainerComponent({\n eContainer: this.eFullWidthContainer\n }),\n pinnedLeft: new RowContainerComponent({ eContainer: this.eLeftContainer }),\n pinnedRight: new RowContainerComponent({ eContainer: this.eRightContainer }),\n floatingTop: new RowContainerComponent({ eContainer: this.eTopContainer }),\n floatingTopPinnedLeft: new RowContainerComponent({ eContainer: this.eLeftTop }),\n floatingTopPinnedRight: new RowContainerComponent({ eContainer: this.eRightTop }),\n floatingTopFullWidth: new RowContainerComponent({\n eContainer: this.eTopFullWidthContainer,\n hideWhenNoChildren: true\n }),\n floatingBottom: new RowContainerComponent({ eContainer: this.eBottomContainer }),\n floatingBottomPinnedLeft: new RowContainerComponent({ eContainer: this.eLeftBottom }),\n floatingBottomPinnedRight: new RowContainerComponent({ eContainer: this.eRightBottom }),\n floatingBottomFullWidth: new RowContainerComponent({\n eContainer: this.eBottomFullWidthContainer,\n hideWhenNoChildren: true\n }),\n };\n iterateObject(this.rowContainerComponents, function (key, container) {\n if (container) {\n _this.getContext().createBean(container);\n }\n });\n };\n GridPanel.prototype.setupRowAnimationCssClass = function () {\n var _this = this;\n var listener = function () {\n // we don't want to use row animation if scaling, as rows jump strangely as you scroll,\n // when scaling and doing row animation.\n var animateRows = _this.gridOptionsWrapper.isAnimateRows() && !_this.heightScaler.isScaling();\n addOrRemoveCssClass(_this.eBodyViewport, 'ag-row-animation', animateRows);\n addOrRemoveCssClass(_this.eBodyViewport, 'ag-row-no-animation', !animateRows);\n };\n listener();\n this.addManagedListener(this.eventService, Events.EVENT_HEIGHT_SCALE_CHANGED, listener);\n };\n // when editing a pinned row, if the cell is half outside the scrollable area, the browser can\n // scroll the column into view. we do not want this, the pinned sections should never scroll.\n // so we listen to scrolls on these containers and reset the scroll if we find one.\n GridPanel.prototype.suppressScrollOnFloatingRow = function () {\n var _this = this;\n var resetTopScroll = function () { return _this.eTopViewport.scrollLeft = 0; };\n var resetBottomScroll = function () { return _this.eTopViewport.scrollLeft = 0; };\n this.addManagedListener(this.eTopViewport, 'scroll', resetTopScroll);\n this.addManagedListener(this.eBottomViewport, 'scroll', resetBottomScroll);\n };\n GridPanel.prototype.getRowContainers = function () {\n return this.rowContainerComponents;\n };\n GridPanel.prototype.getFloatingTopBottom = function () {\n return [this.eTop, this.eBottom];\n };\n GridPanel.prototype.onDisplayedColumnsChanged = function () {\n this.setPinnedContainerSize();\n this.setHeaderAndFloatingHeights();\n this.onHorizontalViewportChanged();\n this.updateScrollVisibleService();\n this.updateColumnCount();\n };\n GridPanel.prototype.onDisplayedColumnsWidthChanged = function () {\n this.setWidthsOfContainers();\n this.onHorizontalViewportChanged();\n this.updateScrollVisibleService();\n if (this.enableRtl) {\n // because RTL is all backwards, a change in the width of the row\n // can cause a change in the scroll position, without a scroll event,\n // because the scroll position in RTL is a function that depends on\n // the width. to be convinced of this, take out this line, enable RTL,\n // scroll all the way to the left and then resize a column\n this.horizontallyScrollHeaderCenterAndFloatingCenter();\n }\n };\n GridPanel.prototype.setWidthsOfContainers = function () {\n this.setCenterWidth();\n this.setPinnedContainerSize();\n };\n GridPanel.prototype.setCenterWidth = function () {\n var _a = this, headerRootComp = _a.headerRootComp, columnController = _a.columnController;\n var width = columnController.getBodyContainerWidth();\n if (this.printLayout) {\n var pinnedContainerWidths = columnController.getDisplayedColumnsLeftWidth()\n + columnController.getDisplayedColumnsRightWidth();\n width += pinnedContainerWidths;\n }\n headerRootComp.setHeaderContainerWidth(width);\n var widthPx = width + \"px\";\n this.eCenterContainer.style.width = widthPx;\n this.eBottomContainer.style.width = widthPx;\n this.eTopContainer.style.width = widthPx;\n if (!this.printLayout) {\n this.eBodyHorizontalScrollContainer.style.width = widthPx;\n }\n };\n GridPanel.prototype.setPinnedLeftWidth = function () {\n var _this = this;\n var oldPinning = this.pinningLeft;\n var widthOfCols = this.columnController.getDisplayedColumnsLeftWidth();\n var newPinning = this.pinningLeft = !this.printLayout && widthOfCols > 0;\n var containers = [this.eLeftContainer, this.eLeftTop, this.eLeftBottom];\n if (oldPinning !== newPinning) {\n this.headerRootComp.setLeftVisible(newPinning);\n }\n containers.forEach(function (e) { return setDisplayed(e, _this.pinningLeft); });\n if (newPinning) {\n containers.forEach(function (ct) { return setFixedWidth(ct, widthOfCols); });\n }\n };\n GridPanel.prototype.setPinnedRightWidth = function () {\n var oldPinning = this.pinningRight;\n var widthOfCols = this.columnController.getDisplayedColumnsRightWidth();\n var newPinning = this.pinningRight = !this.printLayout && widthOfCols > 0;\n var containers = [this.eRightContainer, this.eRightTop, this.eRightBottom];\n if (oldPinning !== newPinning) {\n this.headerRootComp.setRightVisible(newPinning);\n }\n containers.forEach(function (ct) { return setDisplayed(ct, newPinning); });\n if (newPinning) {\n containers.forEach(function (ct) { return setFixedWidth(ct, widthOfCols); });\n }\n };\n GridPanel.prototype.setPinnedContainerSize = function () {\n this.setPinnedLeftWidth();\n this.setPinnedRightWidth();\n this.setFakeHScrollSpacerWidths();\n };\n GridPanel.prototype.setFakeHScrollSpacerWidths = function () {\n // we pad the right based on a) if cols are pinned to the right and\n // b) if v scroll is showing on the right (normal position of scroll)\n var rightSpacing = this.columnController.getDisplayedColumnsRightWidth();\n var scrollOnRight = !this.enableRtl && this.isVerticalScrollShowing();\n var scrollbarWidth = this.gridOptionsWrapper.getScrollbarWidth();\n if (scrollOnRight) {\n rightSpacing += scrollbarWidth;\n }\n setFixedWidth(this.eHorizontalRightSpacer, rightSpacing);\n addOrRemoveCssClass(this.eHorizontalRightSpacer, 'ag-scroller-corner', rightSpacing <= scrollbarWidth);\n // we pad the left based on a) if cols are pinned to the left and\n // b) if v scroll is showing on the left (happens in LTR layout only)\n var leftSpacing = this.columnController.getDisplayedColumnsLeftWidth();\n var scrollOnLeft = this.enableRtl && this.isVerticalScrollShowing();\n if (scrollOnLeft) {\n leftSpacing += scrollbarWidth;\n }\n setFixedWidth(this.eHorizontalLeftSpacer, leftSpacing);\n addOrRemoveCssClass(this.eHorizontalLeftSpacer, 'ag-scroller-corner', leftSpacing <= scrollbarWidth);\n };\n GridPanel.prototype.checkBodyHeight = function () {\n var bodyHeight = getInnerHeight(this.eBodyViewport);\n if (this.bodyHeight !== bodyHeight) {\n this.bodyHeight = bodyHeight;\n var event_3 = {\n type: Events.EVENT_BODY_HEIGHT_CHANGED,\n api: this.gridApi,\n columnApi: this.columnApi\n };\n this.eventService.dispatchEvent(event_3);\n }\n };\n GridPanel.prototype.setHeaderAndFloatingHeights = function () {\n var _a = this, columnController = _a.columnController, gridOptionsWrapper = _a.gridOptionsWrapper, pinnedRowModel = _a.pinnedRowModel, eTop = _a.eTop, eBottom = _a.eBottom;\n var numberOfFloating = 0;\n var headerRowCount = columnController.getHeaderRowCount();\n var totalHeaderHeight;\n var groupHeight;\n var headerHeight;\n if (columnController.isPivotMode()) {\n groupHeight = gridOptionsWrapper.getPivotGroupHeaderHeight();\n headerHeight = gridOptionsWrapper.getPivotHeaderHeight();\n }\n else {\n var hasFloatingFilters = columnController.hasFloatingFilters();\n if (hasFloatingFilters) {\n headerRowCount++;\n numberOfFloating = 1;\n }\n groupHeight = gridOptionsWrapper.getGroupHeaderHeight();\n headerHeight = gridOptionsWrapper.getHeaderHeight();\n }\n var numberOfNonGroups = 1 + numberOfFloating;\n var numberOfGroups = headerRowCount - numberOfNonGroups;\n totalHeaderHeight = numberOfFloating * gridOptionsWrapper.getFloatingFiltersHeight();\n totalHeaderHeight += numberOfGroups * groupHeight;\n totalHeaderHeight += headerHeight;\n this.headerRootComp.setHeight(totalHeaderHeight);\n var floatingTopHeight = pinnedRowModel.getPinnedTopTotalHeight();\n if (floatingTopHeight) {\n // adding 1px for cell bottom border\n floatingTopHeight += 1;\n }\n var floatingBottomHeight = pinnedRowModel.getPinnedBottomTotalHeight();\n if (floatingBottomHeight) {\n // adding 1px for cell bottom border\n floatingBottomHeight += 1;\n }\n var floatingTopHeightString = floatingTopHeight + \"px\";\n var floatingBottomHeightString = floatingBottomHeight + \"px\";\n eTop.style.minHeight = floatingTopHeightString;\n eTop.style.height = floatingTopHeightString;\n eTop.style.display = floatingTopHeight ? 'inherit' : 'none';\n eBottom.style.minHeight = floatingBottomHeightString;\n eBottom.style.height = floatingBottomHeightString;\n eBottom.style.display = floatingBottomHeight ? 'inherit' : 'none';\n this.checkBodyHeight();\n };\n GridPanel.prototype.getBodyHeight = function () {\n return this.bodyHeight;\n };\n // called by scrollHorizontally method and alignedGridsService\n GridPanel.prototype.setHorizontalScrollPosition = function (hScrollPosition) {\n var minScrollLeft = 0;\n var maxScrollLeft = this.eCenterViewport.scrollWidth - this.getCenterWidth();\n if (this.shouldBlockScrollUpdate('horizontal', hScrollPosition)) {\n hScrollPosition = Math.min(Math.max(hScrollPosition, minScrollLeft), maxScrollLeft);\n }\n this.eCenterViewport.scrollLeft = hScrollPosition;\n // we need to manually do the event handling (rather than wait for the event)\n // for the alignedGridsService, as if we don't, the aligned grid service gets\n // notified async, and then it's 'consuming' flag doesn't get used right, and\n // we can end up with an infinite loop\n this.doHorizontalScroll(hScrollPosition);\n };\n GridPanel.prototype.setVerticalScrollPosition = function (vScrollPosition) {\n this.eBodyViewport.scrollTop = vScrollPosition;\n };\n // called by the headerRootComp and moveColumnController\n GridPanel.prototype.scrollHorizontally = function (pixels) {\n var oldScrollPosition = this.eCenterViewport.scrollLeft;\n this.setHorizontalScrollPosition(oldScrollPosition + pixels);\n return this.eCenterViewport.scrollLeft - oldScrollPosition;\n };\n // called by rowDragFeature\n GridPanel.prototype.scrollVertically = function (pixels) {\n var oldScrollPosition = this.eBodyViewport.scrollTop;\n this.setVerticalScrollPosition(oldScrollPosition + pixels);\n return this.eBodyViewport.scrollTop - oldScrollPosition;\n };\n GridPanel.prototype.addScrollListener = function () {\n this.addManagedListener(this.eCenterViewport, 'scroll', this.onCenterViewportScroll.bind(this));\n this.addManagedListener(this.eBodyHorizontalScrollViewport, 'scroll', this.onFakeHorizontalScroll.bind(this));\n var onVerticalScroll = this.gridOptionsWrapper.isDebounceVerticalScrollbar() ?\n debounce(this.onVerticalScroll.bind(this), 100)\n : this.onVerticalScroll.bind(this);\n this.addManagedListener(this.eBodyViewport, 'scroll', onVerticalScroll);\n };\n GridPanel.prototype.onVerticalScroll = function () {\n var scrollTop = this.eBodyViewport.scrollTop;\n if (this.shouldBlockScrollUpdate('vertical', scrollTop, true)) {\n return;\n }\n this.animationFrameService.setScrollTop(scrollTop);\n this.nextScrollTop = scrollTop;\n if (this.gridOptionsWrapper.isSuppressAnimationFrame()) {\n this.scrollTop = this.nextScrollTop;\n this.redrawRowsAfterScroll();\n }\n else {\n this.animationFrameService.schedule();\n }\n };\n GridPanel.prototype.executeAnimationFrameScroll = function () {\n var frameNeeded = this.scrollTop != this.nextScrollTop;\n if (frameNeeded) {\n this.scrollTop = this.nextScrollTop;\n this.redrawRowsAfterScroll();\n }\n return frameNeeded;\n };\n GridPanel.prototype.shouldBlockScrollUpdate = function (direction, scrollTo, touchOnly) {\n // touch devices allow elastic scroll - which temporally scrolls the panel outside of the viewport\n // (eg user uses touch to go to the left of the grid, but drags past the left, the rows will actually\n // scroll past the left until the user releases the mouse). when this happens, we want ignore the scroll,\n // as otherwise it was causing the rows and header to flicker.\n if (touchOnly === void 0) { touchOnly = false; }\n // sometimes when scrolling, we got values that extended the maximum scroll allowed. we used to\n // ignore these scrolls. problem is the max scroll position could be skipped (eg the previous scroll event\n // could be 10px before the max position, and then current scroll event could be 20px after the max position).\n // if we just ignored the last event, we would be setting the scroll to 10px before the max position, when in\n // actual fact the user has exceeded the max scroll and thus scroll should be set to the max.\n if (touchOnly && !isIOSUserAgent()) {\n return false;\n }\n if (direction === 'vertical') {\n var clientHeight = getInnerHeight(this.eBodyViewport);\n var scrollHeight = this.eBodyViewport.scrollHeight;\n if (scrollTo < 0 || (scrollTo + clientHeight > scrollHeight)) {\n return true;\n }\n }\n if (direction === 'horizontal') {\n var clientWidth = this.getCenterWidth();\n var scrollWidth = this.eCenterViewport.scrollWidth;\n if (this.enableRtl && isRtlNegativeScroll()) {\n if (scrollTo > 0) {\n return true;\n }\n }\n else if (scrollTo < 0) {\n return true;\n }\n if (Math.abs(scrollTo) + clientWidth > scrollWidth) {\n return true;\n }\n }\n return false;\n };\n GridPanel.prototype.isControllingScroll = function (eDiv) {\n if (!this.lastHorizontalScrollElement) {\n this.lastHorizontalScrollElement = eDiv;\n return true;\n }\n return eDiv === this.lastHorizontalScrollElement;\n };\n GridPanel.prototype.onFakeHorizontalScroll = function () {\n if (!this.isControllingScroll(this.eBodyHorizontalScrollViewport)) {\n return;\n }\n this.onBodyHorizontalScroll(this.eBodyHorizontalScrollViewport);\n };\n GridPanel.prototype.onCenterViewportScroll = function () {\n if (!this.isControllingScroll(this.eCenterViewport)) {\n return;\n }\n this.onBodyHorizontalScroll(this.eCenterViewport);\n };\n GridPanel.prototype.onBodyHorizontalScroll = function (eSource) {\n var scrollLeft = this.eCenterViewport.scrollLeft;\n if (this.shouldBlockScrollUpdate('horizontal', scrollLeft, true)) {\n return;\n }\n this.doHorizontalScroll(Math.floor(getScrollLeft(eSource, this.enableRtl)));\n this.resetLastHorizontalScrollElementDebounced();\n };\n GridPanel.prototype.resetLastHorizontalScrollElement = function () {\n this.lastHorizontalScrollElement = null;\n };\n GridPanel.prototype.doHorizontalScroll = function (scrollLeft) {\n this.scrollLeft = scrollLeft;\n var event = {\n type: Events.EVENT_BODY_SCROLL,\n api: this.gridApi,\n columnApi: this.columnApi,\n direction: 'horizontal',\n left: this.scrollLeft,\n top: this.scrollTop\n };\n this.eventService.dispatchEvent(event);\n this.horizontallyScrollHeaderCenterAndFloatingCenter(scrollLeft);\n this.onHorizontalViewportChanged();\n };\n GridPanel.prototype.redrawRowsAfterScroll = function () {\n var event = {\n type: Events.EVENT_BODY_SCROLL,\n direction: 'vertical',\n api: this.gridApi,\n columnApi: this.columnApi,\n left: this.scrollLeft,\n top: this.scrollTop\n };\n this.eventService.dispatchEvent(event);\n };\n // this gets called whenever a change in the viewport, so we can inform column controller it has to work\n // out the virtual columns again. gets called from following locations:\n // + ensureColVisible, scroll, init, layoutChanged, displayedColumnsChanged, API (doLayout)\n GridPanel.prototype.onHorizontalViewportChanged = function () {\n var scrollWidth = this.getCenterWidth();\n var scrollPosition = this.getCenterViewportScrollLeft();\n this.columnController.setViewportPosition(scrollWidth, scrollPosition);\n };\n GridPanel.prototype.getCenterViewportScrollLeft = function () {\n // we defer to a util, as how you calculated scrollLeft when doing RTL depends on the browser\n return getScrollLeft(this.eCenterViewport, this.enableRtl);\n };\n GridPanel.prototype.setCenterViewportScrollLeft = function (value) {\n // we defer to a util, as how you calculated scrollLeft when doing RTL depends on the browser\n setScrollLeft(this.eCenterViewport, value, this.enableRtl);\n };\n GridPanel.prototype.horizontallyScrollHeaderCenterAndFloatingCenter = function (scrollLeft) {\n if (scrollLeft === undefined) {\n scrollLeft = this.getCenterViewportScrollLeft();\n }\n var offset = this.enableRtl ? scrollLeft : -scrollLeft;\n this.headerRootComp.setHorizontalScroll(offset);\n this.eBottomContainer.style.transform = \"translateX(\" + offset + \"px)\";\n this.eTopContainer.style.transform = \"translateX(\" + offset + \"px)\";\n var partner = this.lastHorizontalScrollElement === this.eCenterViewport ? this.eBodyHorizontalScrollViewport : this.eCenterViewport;\n setScrollLeft(partner, scrollLeft, this.enableRtl);\n };\n // + rangeController\n GridPanel.prototype.addScrollEventListener = function (listener) {\n this.eBodyViewport.addEventListener('scroll', listener);\n };\n // + rangeController\n GridPanel.prototype.removeScrollEventListener = function (listener) {\n this.eBodyViewport.removeEventListener('scroll', listener);\n };\n __decorate$X([\n Autowired('alignedGridsService')\n ], GridPanel.prototype, \"alignedGridsService\", void 0);\n __decorate$X([\n Autowired('rowRenderer')\n ], GridPanel.prototype, \"rowRenderer\", void 0);\n __decorate$X([\n Autowired('pinnedRowModel')\n ], GridPanel.prototype, \"pinnedRowModel\", void 0);\n __decorate$X([\n Autowired('animationFrameService')\n ], GridPanel.prototype, \"animationFrameService\", void 0);\n __decorate$X([\n Autowired('navigationService')\n ], GridPanel.prototype, \"navigationService\", void 0);\n __decorate$X([\n Autowired('autoHeightCalculator')\n ], GridPanel.prototype, \"autoHeightCalculator\", void 0);\n __decorate$X([\n Autowired('columnAnimationService')\n ], GridPanel.prototype, \"columnAnimationService\", void 0);\n __decorate$X([\n Autowired('autoWidthCalculator')\n ], GridPanel.prototype, \"autoWidthCalculator\", void 0);\n __decorate$X([\n Autowired('paginationAutoPageSizeService')\n ], GridPanel.prototype, \"paginationAutoPageSizeService\", void 0);\n __decorate$X([\n Autowired('beans')\n ], GridPanel.prototype, \"beans\", void 0);\n __decorate$X([\n Autowired('paginationProxy')\n ], GridPanel.prototype, \"paginationProxy\", void 0);\n __decorate$X([\n Autowired('columnApi')\n ], GridPanel.prototype, \"columnApi\", void 0);\n __decorate$X([\n Autowired('gridApi')\n ], GridPanel.prototype, \"gridApi\", void 0);\n __decorate$X([\n Autowired('dragService')\n ], GridPanel.prototype, \"dragService\", void 0);\n __decorate$X([\n Autowired('mouseEventService')\n ], GridPanel.prototype, \"mouseEventService\", void 0);\n __decorate$X([\n Autowired('$scope')\n ], GridPanel.prototype, \"$scope\", void 0);\n __decorate$X([\n Autowired('scrollVisibleService')\n ], GridPanel.prototype, \"scrollVisibleService\", void 0);\n __decorate$X([\n Autowired('valueService')\n ], GridPanel.prototype, \"valueService\", void 0);\n __decorate$X([\n Autowired('dragAndDropService')\n ], GridPanel.prototype, \"dragAndDropService\", void 0);\n __decorate$X([\n Autowired('maxDivHeightScaler')\n ], GridPanel.prototype, \"heightScaler\", void 0);\n __decorate$X([\n Autowired('resizeObserverService')\n ], GridPanel.prototype, \"resizeObserverService\", void 0);\n __decorate$X([\n Autowired('undoRedoService')\n ], GridPanel.prototype, \"undoRedoService\", void 0);\n __decorate$X([\n Autowired('columnController')\n ], GridPanel.prototype, \"columnController\", void 0);\n __decorate$X([\n Autowired('headerNavigationService')\n ], GridPanel.prototype, \"headerNavigationService\", void 0);\n __decorate$X([\n Autowired('popupService')\n ], GridPanel.prototype, \"popupService\", void 0);\n __decorate$X([\n Optional('rangeController')\n ], GridPanel.prototype, \"rangeController\", void 0);\n __decorate$X([\n Optional('contextMenuFactory')\n ], GridPanel.prototype, \"contextMenuFactory\", void 0);\n __decorate$X([\n Optional('menuFactory')\n ], GridPanel.prototype, \"menuFactory\", void 0);\n __decorate$X([\n Optional('clipboardService')\n ], GridPanel.prototype, \"clipboardService\", void 0);\n __decorate$X([\n RefSelector('eBodyViewport')\n ], GridPanel.prototype, \"eBodyViewport\", void 0);\n __decorate$X([\n RefSelector('eCenterContainer')\n ], GridPanel.prototype, \"eCenterContainer\", void 0);\n __decorate$X([\n RefSelector('eCenterViewport')\n ], GridPanel.prototype, \"eCenterViewport\", void 0);\n __decorate$X([\n RefSelector('eLeftContainer')\n ], GridPanel.prototype, \"eLeftContainer\", void 0);\n __decorate$X([\n RefSelector('eRightContainer')\n ], GridPanel.prototype, \"eRightContainer\", void 0);\n __decorate$X([\n RefSelector('eCenterColsClipper')\n ], GridPanel.prototype, \"eCenterColsClipper\", void 0);\n __decorate$X([\n RefSelector('eHorizontalScrollBody')\n ], GridPanel.prototype, \"eHorizontalScrollBody\", void 0);\n __decorate$X([\n RefSelector('eHorizontalLeftSpacer')\n ], GridPanel.prototype, \"eHorizontalLeftSpacer\", void 0);\n __decorate$X([\n RefSelector('eHorizontalRightSpacer')\n ], GridPanel.prototype, \"eHorizontalRightSpacer\", void 0);\n __decorate$X([\n RefSelector('eBodyHorizontalScrollViewport')\n ], GridPanel.prototype, \"eBodyHorizontalScrollViewport\", void 0);\n __decorate$X([\n RefSelector('eBodyHorizontalScrollContainer')\n ], GridPanel.prototype, \"eBodyHorizontalScrollContainer\", void 0);\n __decorate$X([\n RefSelector('eFullWidthContainer')\n ], GridPanel.prototype, \"eFullWidthContainer\", void 0);\n __decorate$X([\n RefSelector('eTop')\n ], GridPanel.prototype, \"eTop\", void 0);\n __decorate$X([\n RefSelector('eLeftTop')\n ], GridPanel.prototype, \"eLeftTop\", void 0);\n __decorate$X([\n RefSelector('eRightTop')\n ], GridPanel.prototype, \"eRightTop\", void 0);\n __decorate$X([\n RefSelector('eTopContainer')\n ], GridPanel.prototype, \"eTopContainer\", void 0);\n __decorate$X([\n RefSelector('eTopViewport')\n ], GridPanel.prototype, \"eTopViewport\", void 0);\n __decorate$X([\n RefSelector('eTopFullWidthContainer')\n ], GridPanel.prototype, \"eTopFullWidthContainer\", void 0);\n __decorate$X([\n RefSelector('eBottom')\n ], GridPanel.prototype, \"eBottom\", void 0);\n __decorate$X([\n RefSelector('eLeftBottom')\n ], GridPanel.prototype, \"eLeftBottom\", void 0);\n __decorate$X([\n RefSelector('eRightBottom')\n ], GridPanel.prototype, \"eRightBottom\", void 0);\n __decorate$X([\n RefSelector('eBottomContainer')\n ], GridPanel.prototype, \"eBottomContainer\", void 0);\n __decorate$X([\n RefSelector('eBottomViewport')\n ], GridPanel.prototype, \"eBottomViewport\", void 0);\n __decorate$X([\n RefSelector('eBottomFullWidthContainer')\n ], GridPanel.prototype, \"eBottomFullWidthContainer\", void 0);\n __decorate$X([\n RefSelector('headerRoot')\n ], GridPanel.prototype, \"headerRootComp\", void 0);\n __decorate$X([\n RefSelector('overlayWrapper')\n ], GridPanel.prototype, \"overlayWrapper\", void 0);\n __decorate$X([\n PostConstruct\n ], GridPanel.prototype, \"init\", null);\n return GridPanel;\n}(Component));\n\n/**\n * @ag-grid-community/core - Advanced Data Grid / Data Table supporting Javascript / React / AngularJS / Web Components\n * @version v25.1.0\n * @link http://www.ag-grid.com/\n * @license MIT\n */\n(function (ClientSideRowModelSteps) {\n ClientSideRowModelSteps[\"EVERYTHING\"] = \"group\";\n ClientSideRowModelSteps[\"FILTER\"] = \"filter\";\n ClientSideRowModelSteps[\"SORT\"] = \"sort\";\n ClientSideRowModelSteps[\"MAP\"] = \"map\";\n ClientSideRowModelSteps[\"AGGREGATE\"] = \"aggregate\";\n ClientSideRowModelSteps[\"PIVOT\"] = \"pivot\";\n ClientSideRowModelSteps[\"NOTHING\"] = \"nothing\";\n})(exports.ClientSideRowModelSteps || (exports.ClientSideRowModelSteps = {}));\n\n/**\n * @ag-grid-community/core - Advanced Data Grid / Data Table supporting Javascript / React / AngularJS / Web Components\n * @version v25.1.0\n * @link http://www.ag-grid.com/\n * @license MIT\n */\nvar __decorate$Y = (undefined && undefined.__decorate) || function (decorators, target, key, desc) {\n var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d;\n if (typeof Reflect === \"object\" && typeof Reflect.decorate === \"function\") r = Reflect.decorate(decorators, target, key, desc);\n else for (var i = decorators.length - 1; i >= 0; i--) if (d = decorators[i]) r = (c < 3 ? d(r) : c > 3 ? d(target, key, r) : d(target, key)) || r;\n return c > 3 && r && Object.defineProperty(target, key, r), r;\n};\nvar GridApi = /** @class */ (function () {\n function GridApi() {\n this.detailGridInfoMap = {};\n this.destroyCalled = false;\n }\n GridApi.prototype.registerGridComp = function (gridPanel) {\n this.gridPanel = gridPanel;\n };\n GridApi.prototype.registerGridCore = function (gridCore) {\n this.gridCore = gridCore;\n };\n GridApi.prototype.registerHeaderRootComp = function (headerRootComp) {\n this.headerRootComp = headerRootComp;\n };\n GridApi.prototype.init = function () {\n switch (this.rowModel.getType()) {\n case Constants.ROW_MODEL_TYPE_CLIENT_SIDE:\n this.clientSideRowModel = this.rowModel;\n break;\n case Constants.ROW_MODEL_TYPE_INFINITE:\n this.infiniteRowModel = this.rowModel;\n break;\n case Constants.ROW_MODEL_TYPE_SERVER_SIDE:\n this.serverSideRowModel = this.rowModel;\n break;\n }\n };\n /** Used internally by grid. Not intended to be used by the client. Interface may change between releases. */\n GridApi.prototype.__getAlignedGridService = function () {\n return this.alignedGridsService;\n };\n GridApi.prototype.addDetailGridInfo = function (id, gridInfo) {\n this.detailGridInfoMap[id] = gridInfo;\n };\n GridApi.prototype.removeDetailGridInfo = function (id) {\n this.detailGridInfoMap[id] = undefined;\n };\n GridApi.prototype.getDetailGridInfo = function (id) {\n return this.detailGridInfoMap[id];\n };\n GridApi.prototype.forEachDetailGridInfo = function (callback) {\n var index = 0;\n iterateObject(this.detailGridInfoMap, function (id, gridInfo) {\n // check for undefined, as old references will still be lying around\n if (exists(gridInfo)) {\n callback(gridInfo, index);\n index++;\n }\n });\n };\n GridApi.prototype.getDataAsCsv = function (params) {\n if (ModuleRegistry.assertRegistered(exports.ModuleNames.CsvExportModule, 'api.getDataAsCsv')) {\n return this.csvCreator.getDataAsCsv(params);\n }\n };\n GridApi.prototype.exportDataAsCsv = function (params) {\n if (ModuleRegistry.assertRegistered(exports.ModuleNames.CsvExportModule, 'api.exportDataAsCSv')) {\n this.csvCreator.exportDataAsCsv(params);\n }\n };\n GridApi.prototype.getDataAsExcel = function (params) {\n if (ModuleRegistry.assertRegistered(exports.ModuleNames.ExcelExportModule, 'api.getDataAsExcel')) {\n return this.excelCreator.getDataAsExcel(params);\n }\n };\n GridApi.prototype.exportDataAsExcel = function (params) {\n if (ModuleRegistry.assertRegistered(exports.ModuleNames.ExcelExportModule, 'api.exportDataAsExcel')) {\n this.excelCreator.exportDataAsExcel(params);\n }\n };\n /** @deprecated */\n GridApi.prototype.setEnterpriseDatasource = function (datasource) {\n console.warn(\"ag-grid: since version 18.x, api.setEnterpriseDatasource() should be replaced with api.setServerSideDatasource()\");\n this.setServerSideDatasource(datasource);\n };\n GridApi.prototype.setGridAriaProperty = function (property, value) {\n if (!property) {\n return;\n }\n var eGrid = this.gridPanel.getGui();\n var ariaProperty = \"aria-\" + property;\n if (value === null) {\n eGrid.removeAttribute(ariaProperty);\n }\n else {\n eGrid.setAttribute(ariaProperty, value);\n }\n };\n GridApi.prototype.setServerSideDatasource = function (datasource) {\n if (this.serverSideRowModel) {\n // should really have an IEnterpriseRowModel interface, so we are not casting to any\n this.serverSideRowModel.setDatasource(datasource);\n }\n else {\n console.warn(\"AG Grid: you can only use an enterprise datasource when gridOptions.rowModelType is '\" + Constants.ROW_MODEL_TYPE_SERVER_SIDE + \"'\");\n }\n };\n GridApi.prototype.setDatasource = function (datasource) {\n if (this.gridOptionsWrapper.isRowModelInfinite()) {\n this.rowModel.setDatasource(datasource);\n }\n else {\n console.warn(\"AG Grid: you can only use a datasource when gridOptions.rowModelType is '\" + Constants.ROW_MODEL_TYPE_INFINITE + \"'\");\n }\n };\n GridApi.prototype.setViewportDatasource = function (viewportDatasource) {\n if (this.gridOptionsWrapper.isRowModelViewport()) {\n // this is bad coding, because it's using an interface that's exposed in the enterprise.\n // really we should create an interface in the core for viewportDatasource and let\n // the enterprise implement it, rather than casting to 'any' here\n this.rowModel.setViewportDatasource(viewportDatasource);\n }\n else {\n console.warn(\"AG Grid: you can only use a viewport datasource when gridOptions.rowModelType is '\" + Constants.ROW_MODEL_TYPE_VIEWPORT + \"'\");\n }\n };\n GridApi.prototype.setRowData = function (rowData) {\n if (this.gridOptionsWrapper.isRowModelDefault()) {\n if (this.gridOptionsWrapper.isImmutableData()) {\n var transactionAndMap = this.immutableService.createTransactionForRowData(rowData);\n if (!transactionAndMap) {\n return;\n }\n var transaction = transactionAndMap[0], orderIdMap = transactionAndMap[1];\n var nodeTransaction = this.clientSideRowModel.updateRowData(transaction, orderIdMap);\n // need to force updating of full width rows - note this wouldn't be necessary the full width cell comp listened\n // to the data change event on the row node and refreshed itself.\n if (nodeTransaction) {\n this.rowRenderer.refreshFullWidthRows(nodeTransaction.update);\n }\n }\n else {\n this.selectionController.reset();\n this.clientSideRowModel.setRowData(rowData);\n }\n }\n else {\n console.warn('cannot call setRowData unless using normal row model');\n }\n };\n /** @deprecated */\n GridApi.prototype.setFloatingTopRowData = function (rows) {\n console.warn('AG Grid: since v12, api.setFloatingTopRowData() is now api.setPinnedTopRowData()');\n this.setPinnedTopRowData(rows);\n };\n /** @deprecated */\n GridApi.prototype.setFloatingBottomRowData = function (rows) {\n console.warn('AG Grid: since v12, api.setFloatingBottomRowData() is now api.setPinnedBottomRowData()');\n this.setPinnedBottomRowData(rows);\n };\n /** @deprecated */\n GridApi.prototype.getFloatingTopRowCount = function () {\n console.warn('AG Grid: since v12, api.getFloatingTopRowCount() is now api.getPinnedTopRowCount()');\n return this.getPinnedTopRowCount();\n };\n /** @deprecated */\n GridApi.prototype.getFloatingBottomRowCount = function () {\n console.warn('AG Grid: since v12, api.getFloatingBottomRowCount() is now api.getPinnedBottomRowCount()');\n return this.getPinnedBottomRowCount();\n };\n /** @deprecated */\n GridApi.prototype.getFloatingTopRow = function (index) {\n console.warn('AG Grid: since v12, api.getFloatingTopRow() is now api.getPinnedTopRow()');\n return this.getPinnedTopRow(index);\n };\n /** @deprecated */\n GridApi.prototype.getFloatingBottomRow = function (index) {\n console.warn('AG Grid: since v12, api.getFloatingBottomRow() is now api.getPinnedBottomRow()');\n return this.getPinnedBottomRow(index);\n };\n GridApi.prototype.setPinnedTopRowData = function (rows) {\n this.pinnedRowModel.setPinnedTopRowData(rows);\n };\n GridApi.prototype.setPinnedBottomRowData = function (rows) {\n this.pinnedRowModel.setPinnedBottomRowData(rows);\n };\n GridApi.prototype.getPinnedTopRowCount = function () {\n return this.pinnedRowModel.getPinnedTopRowCount();\n };\n GridApi.prototype.getPinnedBottomRowCount = function () {\n return this.pinnedRowModel.getPinnedBottomRowCount();\n };\n GridApi.prototype.getPinnedTopRow = function (index) {\n return this.pinnedRowModel.getPinnedTopRow(index);\n };\n GridApi.prototype.getPinnedBottomRow = function (index) {\n return this.pinnedRowModel.getPinnedBottomRow(index);\n };\n GridApi.prototype.setColumnDefs = function (colDefs, source) {\n if (source === void 0) { source = \"api\"; }\n this.columnController.setColumnDefs(colDefs, source);\n };\n GridApi.prototype.setAutoGroupColumnDef = function (colDef, source) {\n this.gridOptionsWrapper.setProperty('autoGroupColumnDef', colDef, true);\n };\n GridApi.prototype.expireValueCache = function () {\n this.valueCache.expire();\n };\n GridApi.prototype.getVerticalPixelRange = function () {\n return this.gridPanel.getVScrollPosition();\n };\n GridApi.prototype.getHorizontalPixelRange = function () {\n return this.gridPanel.getHScrollPosition();\n };\n GridApi.prototype.setAlwaysShowHorizontalScroll = function (show) {\n this.gridOptionsWrapper.setProperty('alwaysShowHorizontalScroll', show);\n };\n GridApi.prototype.setAlwaysShowVerticalScroll = function (show) {\n this.gridOptionsWrapper.setProperty('alwaysShowVerticalScroll', show);\n };\n GridApi.prototype.refreshToolPanel = function () {\n this.gridCore.refreshSideBar();\n };\n GridApi.prototype.refreshCells = function (params) {\n if (params === void 0) { params = {}; }\n if (Array.isArray(params)) {\n // the old version of refreshCells() took an array of rowNodes for the first argument\n console.warn('since AG Grid v11.1, refreshCells() now takes parameters, please see the documentation.');\n return;\n }\n this.rowRenderer.refreshCells(params);\n };\n GridApi.prototype.flashCells = function (params) {\n if (params === void 0) { params = {}; }\n this.rowRenderer.flashCells(params);\n };\n GridApi.prototype.redrawRows = function (params) {\n if (params === void 0) { params = {}; }\n if (params && params.rowNodes) {\n this.rowRenderer.redrawRows(params.rowNodes);\n }\n else {\n this.rowRenderer.redrawAfterModelUpdate();\n }\n };\n GridApi.prototype.timeFullRedraw = function (count) {\n if (count === void 0) { count = 1; }\n var iterationCount = 0;\n var totalProcessing = 0;\n var totalReflow = 0;\n var that = this;\n doOneIteration();\n function doOneIteration() {\n var start = (new Date()).getTime();\n that.rowRenderer.redrawAfterModelUpdate();\n var endProcessing = (new Date()).getTime();\n window.setTimeout(function () {\n var endReflow = (new Date()).getTime();\n var durationProcessing = endProcessing - start;\n var durationReflow = endReflow - endProcessing;\n // tslint:disable-next-line\n console.log('duration: processing = ' + durationProcessing + 'ms, reflow = ' + durationReflow + 'ms');\n iterationCount++;\n totalProcessing += durationProcessing;\n totalReflow += durationReflow;\n if (iterationCount < count) {\n // wait for 1s between tests\n window.setTimeout(doOneIteration, 1000);\n }\n else {\n finish();\n }\n }, 0);\n }\n function finish() {\n // tslint:disable-next-line\n console.log('tests complete. iteration count = ' + iterationCount);\n // tslint:disable-next-line\n console.log('average processing = ' + (totalProcessing / iterationCount) + 'ms');\n // tslint:disable-next-line\n console.log('average reflow = ' + (totalReflow / iterationCount) + 'ms');\n }\n };\n /** @deprecated */\n GridApi.prototype.refreshView = function () {\n console.warn('AG Grid: since v11.1, refreshView() is deprecated, please call refreshCells() or redrawRows() instead');\n this.redrawRows();\n };\n /** @deprecated */\n GridApi.prototype.refreshRows = function (rowNodes) {\n console.warn('since AG Grid v11.1, refreshRows() is deprecated, please use refreshCells({rowNodes: rows}) or redrawRows({rowNodes: rows}) instead');\n this.refreshCells({ rowNodes: rowNodes });\n };\n /** @deprecated */\n GridApi.prototype.rowDataChanged = function (rows) {\n console.warn('AG Grid: rowDataChanged is deprecated, either call refreshView() to refresh everything, or call rowNode.setRowData(newData) to set value on a particular node');\n this.redrawRows();\n };\n /** @deprecated */\n GridApi.prototype.softRefreshView = function () {\n console.error('AG Grid: since v16, softRefreshView() is no longer supported. Please check the documentation on how to refresh.');\n };\n /** @deprecated */\n GridApi.prototype.refreshGroupRows = function () {\n console.warn('AG Grid: since v11.1, refreshGroupRows() is no longer supported, call refreshCells() instead. ' +\n 'Because refreshCells() now does dirty checking, it will only refresh cells that have changed, so it should ' +\n 'not be necessary to only refresh the group rows.');\n this.refreshCells();\n };\n GridApi.prototype.setFunctionsReadOnly = function (readOnly) {\n this.gridOptionsWrapper.setProperty('functionsReadOnly', readOnly);\n };\n GridApi.prototype.refreshHeader = function () {\n this.headerRootComp.refreshHeader();\n this.gridPanel.setHeaderAndFloatingHeights();\n };\n GridApi.prototype.isAnyFilterPresent = function () {\n return this.filterManager.isAnyFilterPresent();\n };\n /** @deprecated */\n GridApi.prototype.isAdvancedFilterPresent = function () {\n console.warn('AG Grid: isAdvancedFilterPresent() is deprecated, please use isColumnFilterPresent()');\n return this.isColumnFilterPresent();\n };\n GridApi.prototype.isColumnFilterPresent = function () {\n return this.filterManager.isAdvancedFilterPresent();\n };\n GridApi.prototype.isQuickFilterPresent = function () {\n return this.filterManager.isQuickFilterPresent();\n };\n GridApi.prototype.getModel = function () {\n return this.rowModel;\n };\n GridApi.prototype.setRowNodeExpanded = function (rowNode, expanded) {\n if (rowNode) {\n rowNode.setExpanded(expanded);\n }\n };\n GridApi.prototype.onGroupExpandedOrCollapsed = function (deprecated_refreshFromIndex) {\n if (missing(this.clientSideRowModel)) {\n console.warn('AG Grid: cannot call onGroupExpandedOrCollapsed unless using normal row model');\n }\n if (exists(deprecated_refreshFromIndex)) {\n console.warn('AG Grid: api.onGroupExpandedOrCollapsed - refreshFromIndex parameter is no longer used, the grid will refresh all rows');\n }\n // we don't really want the user calling this if only one rowNode was expanded, instead they should be\n // calling rowNode.setExpanded(boolean) - this way we do a 'keepRenderedRows=false' so that the whole\n // grid gets refreshed again - otherwise the row with the rowNodes that were changed won't get updated,\n // and thus the expand icon in the group cell won't get 'opened' or 'closed'.\n this.clientSideRowModel.refreshModel({ step: exports.ClientSideRowModelSteps.MAP });\n };\n GridApi.prototype.refreshInMemoryRowModel = function (step) {\n console.warn(\"ag-grid: since version 18.x, api.refreshInMemoryRowModel() should be replaced with api.refreshClientSideRowModel()\");\n this.refreshClientSideRowModel(step);\n };\n GridApi.prototype.refreshClientSideRowModel = function (step) {\n if (missing(this.clientSideRowModel)) {\n console.warn('cannot call refreshClientSideRowModel unless using normal row model');\n }\n var paramsStep = exports.ClientSideRowModelSteps.EVERYTHING;\n var stepsMapped = {\n group: exports.ClientSideRowModelSteps.EVERYTHING,\n filter: exports.ClientSideRowModelSteps.FILTER,\n map: exports.ClientSideRowModelSteps.MAP,\n aggregate: exports.ClientSideRowModelSteps.AGGREGATE,\n sort: exports.ClientSideRowModelSteps.SORT,\n pivot: exports.ClientSideRowModelSteps.PIVOT\n };\n if (exists(step)) {\n paramsStep = stepsMapped[step];\n }\n if (missing(paramsStep)) {\n console.error(\"AG Grid: invalid step \" + step + \", available steps are \" + Object.keys(stepsMapped).join(', '));\n return;\n }\n var modelParams = {\n step: paramsStep,\n keepRenderedRows: true,\n animate: true,\n keepEditingRows: true\n };\n this.clientSideRowModel.refreshModel(modelParams);\n };\n GridApi.prototype.isAnimationFrameQueueEmpty = function () {\n return this.animationFrameService.isQueueEmpty();\n };\n GridApi.prototype.getRowNode = function (id) {\n return this.rowModel.getRowNode(id);\n };\n GridApi.prototype.getSizesForCurrentTheme = function () {\n return {\n rowHeight: this.gridOptionsWrapper.getRowHeightAsNumber(),\n headerHeight: this.gridOptionsWrapper.getHeaderHeight()\n };\n };\n GridApi.prototype.expandAll = function () {\n if (this.clientSideRowModel) {\n this.clientSideRowModel.expandOrCollapseAll(true);\n }\n else if (this.serverSideRowModel) {\n this.serverSideRowModel.expandAll(true);\n }\n else {\n console.warn('AG Grid: expandAll only works with Client Side Row Model and Server Side Row Model');\n }\n };\n GridApi.prototype.collapseAll = function () {\n if (this.clientSideRowModel) {\n this.clientSideRowModel.expandOrCollapseAll(false);\n }\n else if (this.serverSideRowModel) {\n this.serverSideRowModel.expandAll(false);\n }\n else {\n console.warn('AG Grid: collapseAll only works with Client Side Row Model and Server Side Row Model');\n }\n };\n GridApi.prototype.getToolPanelInstance = function (id) {\n return this.gridCore.getToolPanelInstance(id);\n };\n GridApi.prototype.addVirtualRowListener = function (eventName, rowIndex, callback) {\n if (typeof eventName !== 'string') {\n console.warn('AG Grid: addVirtualRowListener is deprecated, please use addRenderedRowListener.');\n }\n this.addRenderedRowListener(eventName, rowIndex, callback);\n };\n GridApi.prototype.addRenderedRowListener = function (eventName, rowIndex, callback) {\n if (eventName === 'virtualRowSelected') {\n console.warn(\"AG Grid: event virtualRowSelected is deprecated, to register for individual row\\n selection events, add a listener directly to the row node.\");\n }\n this.rowRenderer.addRenderedRowListener(eventName, rowIndex, callback);\n };\n GridApi.prototype.setQuickFilter = function (newFilter) {\n this.filterManager.setQuickFilter(newFilter);\n };\n GridApi.prototype.selectIndex = function (index, tryMulti, suppressEvents) {\n console.warn('AG Grid: do not use api for selection, call node.setSelected(value) instead');\n if (suppressEvents) {\n console.warn('AG Grid: suppressEvents is no longer supported, stop listening for the event if you no longer want it');\n }\n this.selectionController.selectIndex(index, tryMulti);\n };\n GridApi.prototype.deselectIndex = function (index, suppressEvents) {\n if (suppressEvents === void 0) { suppressEvents = false; }\n console.warn('AG Grid: do not use api for selection, call node.setSelected(value) instead');\n if (suppressEvents) {\n console.warn('AG Grid: suppressEvents is no longer supported, stop listening for the event if you no longer want it');\n }\n this.selectionController.deselectIndex(index);\n };\n GridApi.prototype.selectNode = function (node, tryMulti, suppressEvents) {\n if (tryMulti === void 0) { tryMulti = false; }\n if (suppressEvents === void 0) { suppressEvents = false; }\n console.warn('AG Grid: API for selection is deprecated, call node.setSelected(value) instead');\n if (suppressEvents) {\n console.warn('AG Grid: suppressEvents is no longer supported, stop listening for the event if you no longer want it');\n }\n node.setSelectedParams({ newValue: true, clearSelection: !tryMulti });\n };\n GridApi.prototype.deselectNode = function (node, suppressEvents) {\n if (suppressEvents === void 0) { suppressEvents = false; }\n console.warn('AG Grid: API for selection is deprecated, call node.setSelected(value) instead');\n if (suppressEvents) {\n console.warn('AG Grid: suppressEvents is no longer supported, stop listening for the event if you no longer want it');\n }\n node.setSelectedParams({ newValue: false });\n };\n GridApi.prototype.selectAll = function () {\n this.selectionController.selectAllRowNodes();\n };\n GridApi.prototype.deselectAll = function () {\n this.selectionController.deselectAllRowNodes();\n };\n GridApi.prototype.selectAllFiltered = function () {\n this.selectionController.selectAllRowNodes(true);\n };\n GridApi.prototype.deselectAllFiltered = function () {\n this.selectionController.deselectAllRowNodes(true);\n };\n GridApi.prototype.recomputeAggregates = function () {\n if (missing(this.clientSideRowModel)) {\n console.warn('cannot call recomputeAggregates unless using normal row model');\n }\n console.warn(\"recomputeAggregates is deprecated, please call api.refreshClientSideRowModel('aggregate') instead\");\n this.clientSideRowModel.refreshModel({ step: exports.ClientSideRowModelSteps.AGGREGATE });\n };\n GridApi.prototype.sizeColumnsToFit = function () {\n this.gridPanel.sizeColumnsToFit();\n };\n GridApi.prototype.showLoadingOverlay = function () {\n this.gridPanel.showLoadingOverlay();\n };\n GridApi.prototype.showNoRowsOverlay = function () {\n this.gridPanel.showNoRowsOverlay();\n };\n GridApi.prototype.hideOverlay = function () {\n this.gridPanel.hideOverlay();\n };\n GridApi.prototype.isNodeSelected = function (node) {\n console.warn('AG Grid: no need to call api.isNodeSelected(), just call node.isSelected() instead');\n return node.isSelected();\n };\n GridApi.prototype.getSelectedNodesById = function () {\n console.error('AG Grid: since version 3.4, getSelectedNodesById no longer exists, use getSelectedNodes() instead');\n return null;\n };\n GridApi.prototype.getSelectedNodes = function () {\n return this.selectionController.getSelectedNodes();\n };\n GridApi.prototype.getSelectedRows = function () {\n return this.selectionController.getSelectedRows();\n };\n GridApi.prototype.getBestCostNodeSelection = function () {\n return this.selectionController.getBestCostNodeSelection();\n };\n GridApi.prototype.getRenderedNodes = function () {\n return this.rowRenderer.getRenderedNodes();\n };\n GridApi.prototype.ensureColIndexVisible = function (index) {\n console.warn('AG Grid: ensureColIndexVisible(index) no longer supported, use ensureColumnVisible(colKey) instead.');\n };\n GridApi.prototype.ensureColumnVisible = function (key) {\n this.gridPanel.ensureColumnVisible(key);\n };\n // Valid values for position are bottom, middle and top\n GridApi.prototype.ensureIndexVisible = function (index, position) {\n this.gridPanel.ensureIndexVisible(index, position);\n };\n // Valid values for position are bottom, middle and top\n GridApi.prototype.ensureNodeVisible = function (comparator, position) {\n this.gridCore.ensureNodeVisible(comparator, position);\n };\n GridApi.prototype.forEachLeafNode = function (callback) {\n if (missing(this.clientSideRowModel)) {\n console.warn('cannot call forEachNode unless using normal row model');\n }\n this.clientSideRowModel.forEachLeafNode(callback);\n };\n GridApi.prototype.forEachNode = function (callback) {\n this.rowModel.forEachNode(callback);\n };\n GridApi.prototype.forEachNodeAfterFilter = function (callback) {\n if (missing(this.clientSideRowModel)) {\n console.warn('cannot call forEachNodeAfterFilter unless using normal row model');\n }\n this.clientSideRowModel.forEachNodeAfterFilter(callback);\n };\n GridApi.prototype.forEachNodeAfterFilterAndSort = function (callback) {\n if (missing(this.clientSideRowModel)) {\n console.warn('cannot call forEachNodeAfterFilterAndSort unless using normal row model');\n }\n this.clientSideRowModel.forEachNodeAfterFilterAndSort(callback);\n };\n GridApi.prototype.getFilterApiForColDef = function (colDef) {\n console.warn('ag-grid API method getFilterApiForColDef deprecated, use getFilterInstance instead');\n return this.getFilterInstance(colDef);\n };\n GridApi.prototype.getFilterInstance = function (key, callback) {\n var column = this.columnController.getPrimaryColumn(key);\n if (column) {\n var filterPromise = this.filterManager.getFilterComponent(column, 'NO_UI');\n var currentValue = filterPromise && filterPromise.resolveNow(null, function (filterComp) { return filterComp; });\n if (callback) {\n if (currentValue) {\n setTimeout(callback, 0, currentValue);\n }\n else if (filterPromise) {\n filterPromise.then(callback);\n }\n }\n return currentValue;\n }\n };\n GridApi.prototype.getFilterApi = function (key) {\n console.warn('AG Grid: getFilterApi is deprecated, use getFilterInstance instead');\n return this.getFilterInstance(key);\n };\n GridApi.prototype.destroyFilter = function (key) {\n var column = this.columnController.getPrimaryColumn(key);\n if (column) {\n return this.filterManager.destroyFilter(column, \"filterDestroyed\");\n }\n };\n GridApi.prototype.getStatusPanel = function (key) {\n if (this.statusBarService) {\n return this.statusBarService.getStatusPanel(key);\n }\n };\n GridApi.prototype.getColumnDef = function (key) {\n var column = this.columnController.getPrimaryColumn(key);\n if (column) {\n return column.getColDef();\n }\n return null;\n };\n GridApi.prototype.getColumnDefs = function () { return this.columnController.getColumnDefs(); };\n GridApi.prototype.onFilterChanged = function () {\n this.filterManager.onFilterChanged();\n };\n GridApi.prototype.onSortChanged = function () {\n this.sortController.onSortChanged();\n };\n GridApi.prototype.setSortModel = function (sortModel, source) {\n console.warn('AG Grid: as of version 24.0.0, setSortModel() is deprecated, sort information is now part of Column State. Please use columnApi.applyColumnState() instead.');\n var columnState = [];\n if (sortModel) {\n sortModel.forEach(function (item, index) {\n columnState.push({\n colId: item.colId,\n sort: item.sort,\n sortIndex: index\n });\n });\n }\n this.columnController.applyColumnState({ state: columnState, defaultState: { sort: null } });\n };\n GridApi.prototype.getSortModel = function () {\n console.warn('AG Grid: as of version 24.0.0, getSortModel() is deprecated, sort information is now part of Column State. Please use columnApi.getColumnState() instead.');\n var columnState = this.columnController.getColumnState();\n var filteredStates = columnState.filter(function (item) { return item.sort != null; });\n var indexes = {};\n filteredStates.forEach(function (state) {\n var id = state.colId;\n var sortIndex = state.sortIndex;\n indexes[id] = sortIndex;\n });\n var res = filteredStates.map(function (s) {\n return { colId: s.colId, sort: s.sort };\n });\n res.sort(function (a, b) { return indexes[a.colId] - indexes[b.colId]; });\n return res;\n };\n GridApi.prototype.setFilterModel = function (model) {\n this.filterManager.setFilterModel(model);\n };\n GridApi.prototype.getFilterModel = function () {\n return this.filterManager.getFilterModel();\n };\n GridApi.prototype.getFocusedCell = function () {\n return this.focusController.getFocusedCell();\n };\n GridApi.prototype.clearFocusedCell = function () {\n return this.focusController.clearFocusedCell();\n };\n GridApi.prototype.setFocusedCell = function (rowIndex, colKey, floating) {\n this.focusController.setFocusedCell(rowIndex, colKey, floating, true);\n };\n GridApi.prototype.setSuppressRowDrag = function (value) {\n this.gridOptionsWrapper.setProperty(GridOptionsWrapper.PROP_SUPPRESS_ROW_DRAG, value);\n };\n GridApi.prototype.setSuppressMoveWhenRowDragging = function (value) {\n this.gridOptionsWrapper.setProperty(GridOptionsWrapper.PROP_SUPPRESS_MOVE_WHEN_ROW_DRAG, value);\n };\n GridApi.prototype.setSuppressRowClickSelection = function (value) {\n this.gridOptionsWrapper.setProperty(GridOptionsWrapper.PROP_SUPPRESS_ROW_CLICK_SELECTION, value);\n };\n GridApi.prototype.addRowDropZone = function (params) {\n this.gridPanel.getRowDragFeature().addRowDropZone(params);\n };\n GridApi.prototype.removeRowDropZone = function (params) {\n var activeDropTarget = this.dragAndDropService.findExternalZone(params);\n if (activeDropTarget) {\n this.dragAndDropService.removeDropTarget(activeDropTarget);\n }\n };\n GridApi.prototype.getRowDropZoneParams = function (events) {\n return this.gridPanel.getRowDragFeature().getRowDropZone(events);\n };\n GridApi.prototype.setHeaderHeight = function (headerHeight) {\n this.gridOptionsWrapper.setProperty(GridOptionsWrapper.PROP_HEADER_HEIGHT, headerHeight);\n this.doLayout();\n };\n GridApi.prototype.setDomLayout = function (domLayout) {\n this.gridOptionsWrapper.setProperty(GridOptionsWrapper.PROP_DOM_LAYOUT, domLayout);\n };\n GridApi.prototype.setEnableCellTextSelection = function (selectable) {\n this.gridPanel.setCellTextSelection(selectable);\n };\n GridApi.prototype.setFillHandleDirection = function (direction) {\n this.gridOptionsWrapper.setProperty(GridOptionsWrapper.PROP_FILL_HANDLE_DIRECTION, direction);\n };\n GridApi.prototype.setGroupHeaderHeight = function (headerHeight) {\n this.gridOptionsWrapper.setProperty(GridOptionsWrapper.PROP_GROUP_HEADER_HEIGHT, headerHeight);\n this.doLayout();\n };\n GridApi.prototype.setFloatingFiltersHeight = function (headerHeight) {\n this.gridOptionsWrapper.setProperty(GridOptionsWrapper.PROP_FLOATING_FILTERS_HEIGHT, headerHeight);\n this.doLayout();\n };\n GridApi.prototype.setPivotGroupHeaderHeight = function (headerHeight) {\n this.gridOptionsWrapper.setProperty(GridOptionsWrapper.PROP_PIVOT_GROUP_HEADER_HEIGHT, headerHeight);\n this.doLayout();\n };\n GridApi.prototype.setPivotHeaderHeight = function (headerHeight) {\n this.gridOptionsWrapper.setProperty(GridOptionsWrapper.PROP_PIVOT_HEADER_HEIGHT, headerHeight);\n this.doLayout();\n };\n GridApi.prototype.isSideBarVisible = function () {\n return this.gridCore.isSideBarVisible();\n };\n GridApi.prototype.setSideBarVisible = function (show) {\n this.gridCore.setSideBarVisible(show);\n };\n GridApi.prototype.setSideBarPosition = function (position) {\n this.gridCore.setSideBarPosition(position);\n };\n GridApi.prototype.openToolPanel = function (key) {\n this.gridCore.openToolPanel(key);\n };\n GridApi.prototype.closeToolPanel = function () {\n this.gridCore.closeToolPanel();\n };\n GridApi.prototype.getOpenedToolPanel = function () {\n return this.gridCore.getOpenedToolPanel();\n };\n GridApi.prototype.getSideBar = function () {\n return this.gridCore.getSideBar();\n };\n GridApi.prototype.setSideBar = function (def) {\n return this.gridCore.setSideBar(def);\n };\n GridApi.prototype.setSuppressClipboardPaste = function (value) {\n this.gridOptionsWrapper.setProperty(GridOptionsWrapper.PROP_SUPPRESS_CLIPBOARD_PASTE, value);\n };\n GridApi.prototype.isToolPanelShowing = function () {\n return this.gridCore.isToolPanelShowing();\n };\n GridApi.prototype.doLayout = function () {\n this.gridPanel.checkViewportAndScrolls();\n };\n GridApi.prototype.resetRowHeights = function () {\n if (exists(this.clientSideRowModel)) {\n this.clientSideRowModel.resetRowHeights();\n }\n };\n GridApi.prototype.setGroupRemoveSingleChildren = function (value) {\n this.gridOptionsWrapper.setProperty(GridOptionsWrapper.PROP_GROUP_REMOVE_SINGLE_CHILDREN, value);\n };\n GridApi.prototype.setGroupRemoveLowestSingleChildren = function (value) {\n this.gridOptionsWrapper.setProperty(GridOptionsWrapper.PROP_GROUP_REMOVE_LOWEST_SINGLE_CHILDREN, value);\n };\n GridApi.prototype.onRowHeightChanged = function () {\n if (this.clientSideRowModel) {\n this.clientSideRowModel.onRowHeightChanged();\n }\n else if (this.serverSideRowModel) {\n this.serverSideRowModel.onRowHeightChanged();\n }\n };\n GridApi.prototype.getValue = function (colKey, rowNode) {\n var column = this.columnController.getPrimaryColumn(colKey);\n if (missing(column)) {\n column = this.columnController.getGridColumn(colKey);\n }\n if (missing(column)) {\n return null;\n }\n return this.valueService.getValue(column, rowNode);\n };\n GridApi.prototype.addEventListener = function (eventType, listener) {\n var async = this.gridOptionsWrapper.useAsyncEvents();\n this.eventService.addEventListener(eventType, listener, async);\n };\n GridApi.prototype.addGlobalListener = function (listener) {\n var async = this.gridOptionsWrapper.useAsyncEvents();\n this.eventService.addGlobalListener(listener, async);\n };\n GridApi.prototype.removeEventListener = function (eventType, listener) {\n var async = this.gridOptionsWrapper.useAsyncEvents();\n this.eventService.removeEventListener(eventType, listener, async);\n };\n GridApi.prototype.removeGlobalListener = function (listener) {\n var async = this.gridOptionsWrapper.useAsyncEvents();\n this.eventService.removeGlobalListener(listener, async);\n };\n GridApi.prototype.dispatchEvent = function (event) {\n this.eventService.dispatchEvent(event);\n };\n GridApi.prototype.destroy = function () {\n // this is needed as GridAPI is a bean, and GridAPI.destroy() is called as part\n // of context.destroy(). so we need to stop the infinite loop.\n if (this.destroyCalled) {\n return;\n }\n this.destroyCalled = true;\n // destroy the UI first (as they use the services)\n this.context.destroyBean(this.gridCore);\n // destroy the services\n this.context.destroy();\n };\n GridApi.prototype.cleanDownReferencesToAvoidMemoryLeakInCaseApplicationIsKeepingReferenceToDestroyedGrid = function () {\n // some users were raising support issues with regards memory leaks. the problem was the customers applications\n // were keeping references to the API. trying to educate them all would be difficult, easier to just remove\n // all references in teh API so at least the core grid can be garbage collected.\n //\n // wait about 100ms before clearing down the references, in case user has some cleanup to do,\n // and needs to deference the API first\n setTimeout(removeAllReferences.bind(window, this, 'Grid API'), 100);\n };\n GridApi.prototype.warnIfDestroyed = function (methodName) {\n if (this.destroyCalled) {\n console.warn(\"AG Grid: Grid API method \" + methodName + \" was called on a grid that was destroyed.\");\n }\n return this.destroyCalled;\n };\n GridApi.prototype.resetQuickFilter = function () {\n if (this.warnIfDestroyed('resetQuickFilter')) {\n return;\n }\n this.rowModel.forEachNode(function (node) { return node.quickFilterAggregateText = null; });\n };\n GridApi.prototype.getRangeSelections = function () {\n console.warn(\"AG Grid: in v20.1.x, api.getRangeSelections() is gone, please use getCellRanges() instead.\\n We had to change how cell selections works a small bit to allow charting to integrate. The return type of\\n getCellRanges() is a bit different, please check the AG Grid documentation.\");\n return null;\n };\n GridApi.prototype.getCellRanges = function () {\n if (this.rangeController) {\n return this.rangeController.getCellRanges();\n }\n console.warn('AG Grid: cell range selection is only available in AG Grid Enterprise');\n return null;\n };\n GridApi.prototype.camelCaseToHumanReadable = function (camelCase) {\n return camelCaseToHumanText(camelCase);\n };\n GridApi.prototype.addRangeSelection = function (deprecatedNoLongerUsed) {\n console.warn('AG Grid: As of version 21.x, range selection changed slightly to allow charting integration. Please call api.addCellRange() instead of api.addRangeSelection()');\n };\n GridApi.prototype.addCellRange = function (params) {\n if (!this.rangeController) {\n console.warn('AG Grid: cell range selection is only available in AG Grid Enterprise');\n }\n this.rangeController.addCellRange(params);\n };\n GridApi.prototype.clearRangeSelection = function () {\n if (!this.rangeController) {\n console.warn('AG Grid: cell range selection is only available in AG Grid Enterprise');\n }\n this.rangeController.removeAllCellRanges();\n };\n GridApi.prototype.undoCellEditing = function () {\n this.undoRedoService.undo();\n };\n GridApi.prototype.redoCellEditing = function () {\n this.undoRedoService.redo();\n };\n GridApi.prototype.getCurrentUndoSize = function () {\n return this.undoRedoService.getCurrentUndoStackSize();\n };\n GridApi.prototype.getCurrentRedoSize = function () {\n return this.undoRedoService.getCurrentRedoStackSize();\n };\n GridApi.prototype.getChartModels = function () {\n if (ModuleRegistry.assertRegistered(exports.ModuleNames.RangeSelectionModule, 'api.getChartModels') &&\n ModuleRegistry.assertRegistered(exports.ModuleNames.GridChartsModule, 'api.getChartModels')) {\n return this.chartService.getChartModels();\n }\n };\n GridApi.prototype.createRangeChart = function (params) {\n if (ModuleRegistry.assertRegistered(exports.ModuleNames.RangeSelectionModule, 'api.createRangeChart') &&\n ModuleRegistry.assertRegistered(exports.ModuleNames.GridChartsModule, 'api.createRangeChart')) {\n return this.chartService.createRangeChart(params);\n }\n };\n GridApi.prototype.createCrossFilterChart = function (params) {\n if (ModuleRegistry.assertRegistered(exports.ModuleNames.RangeSelectionModule, 'api.createCrossFilterChart') &&\n ModuleRegistry.assertRegistered(exports.ModuleNames.GridChartsModule, 'api.createCrossFilterChart')) {\n return this.chartService.createCrossFilterChart(params);\n }\n };\n GridApi.prototype.restoreChart = function (chartModel, chartContainer) {\n if (ModuleRegistry.assertRegistered(exports.ModuleNames.RangeSelectionModule, 'api.restoreChart') &&\n ModuleRegistry.assertRegistered(exports.ModuleNames.GridChartsModule, 'api.restoreChart')) {\n return this.chartService.restoreChart(chartModel, chartContainer);\n }\n };\n GridApi.prototype.createPivotChart = function (params) {\n if (ModuleRegistry.assertRegistered(exports.ModuleNames.RangeSelectionModule, 'api.createPivotChart') &&\n ModuleRegistry.assertRegistered(exports.ModuleNames.GridChartsModule, 'api.createPivotChart')) {\n return this.chartService.createPivotChart(params);\n }\n };\n GridApi.prototype.copySelectedRowsToClipboard = function (includeHeader, columnKeys) {\n if (!this.clipboardService) {\n console.warn('AG Grid: clipboard is only available in AG Grid Enterprise');\n }\n this.clipboardService.copySelectedRowsToClipboard(includeHeader, columnKeys);\n };\n GridApi.prototype.copySelectedRangeToClipboard = function (includeHeader) {\n if (!this.clipboardService) {\n console.warn('AG Grid: clipboard is only available in AG Grid Enterprise');\n }\n this.clipboardService.copySelectedRangeToClipboard(includeHeader);\n };\n GridApi.prototype.copySelectedRangeDown = function () {\n if (!this.clipboardService) {\n console.warn('AG Grid: clipboard is only available in AG Grid Enterprise');\n }\n this.clipboardService.copyRangeDown();\n };\n GridApi.prototype.showColumnMenuAfterButtonClick = function (colKey, buttonElement) {\n // use grid column so works with pivot mode\n var column = this.columnController.getGridColumn(colKey);\n this.menuFactory.showMenuAfterButtonClick(column, buttonElement);\n };\n GridApi.prototype.showColumnMenuAfterMouseClick = function (colKey, mouseEvent) {\n // use grid column so works with pivot mode\n var column = this.columnController.getGridColumn(colKey);\n if (!column) {\n column = this.columnController.getPrimaryColumn(colKey);\n }\n if (!column) {\n console.error(\"AG Grid: column '\" + colKey + \"' not found\");\n return;\n }\n this.menuFactory.showMenuAfterMouseEvent(column, mouseEvent);\n };\n GridApi.prototype.hidePopupMenu = function () {\n // hide the context menu if in enterprise\n if (this.contextMenuFactory) {\n this.contextMenuFactory.hideActiveMenu();\n }\n // and hide the column menu always\n this.menuFactory.hideActiveMenu();\n };\n GridApi.prototype.setPopupParent = function (ePopupParent) {\n this.gridOptionsWrapper.setProperty(GridOptionsWrapper.PROP_POPUP_PARENT, ePopupParent);\n };\n GridApi.prototype.tabToNextCell = function () {\n return this.rowRenderer.tabToNextCell(false);\n };\n GridApi.prototype.tabToPreviousCell = function () {\n return this.rowRenderer.tabToNextCell(true);\n };\n GridApi.prototype.getCellRendererInstances = function (params) {\n if (params === void 0) { params = {}; }\n return this.rowRenderer.getCellRendererInstances(params);\n };\n GridApi.prototype.getCellEditorInstances = function (params) {\n if (params === void 0) { params = {}; }\n return this.rowRenderer.getCellEditorInstances(params);\n };\n GridApi.prototype.getEditingCells = function () {\n return this.rowRenderer.getEditingCells();\n };\n GridApi.prototype.stopEditing = function (cancel) {\n if (cancel === void 0) { cancel = false; }\n this.rowRenderer.stopEditing(cancel);\n };\n GridApi.prototype.startEditingCell = function (params) {\n var column = this.columnController.getGridColumn(params.colKey);\n if (!column) {\n console.warn(\"AG Grid: no column found for \" + params.colKey);\n return;\n }\n var cellPosition = {\n rowIndex: params.rowIndex,\n rowPinned: params.rowPinned,\n column: column\n };\n var notPinned = missing(params.rowPinned);\n if (notPinned) {\n this.gridPanel.ensureIndexVisible(params.rowIndex);\n }\n this.rowRenderer.startEditingCell(cellPosition, params.keyPress, params.charPress);\n };\n GridApi.prototype.addAggFunc = function (key, aggFunc) {\n if (this.aggFuncService) {\n this.aggFuncService.addAggFunc(key, aggFunc);\n }\n };\n GridApi.prototype.addAggFuncs = function (aggFuncs) {\n if (this.aggFuncService) {\n this.aggFuncService.addAggFuncs(aggFuncs);\n }\n };\n GridApi.prototype.clearAggFuncs = function () {\n if (this.aggFuncService) {\n this.aggFuncService.clear();\n }\n };\n GridApi.prototype.applyServerSideTransaction = function (transaction) {\n if (!this.serverSideTransactionManager) {\n console.warn('AG Grid: Cannot apply Server Side Transaction if not using the Server Side Row Model.');\n return;\n }\n return this.serverSideTransactionManager.applyTransaction(transaction);\n };\n GridApi.prototype.applyServerSideTransactionAsync = function (transaction, callback) {\n if (!this.serverSideTransactionManager) {\n console.warn('AG Grid: Cannot apply Server Side Transaction if not using the Server Side Row Model.');\n return;\n }\n return this.serverSideTransactionManager.applyTransactionAsync(transaction, callback);\n };\n GridApi.prototype.retryServerSideLoads = function () {\n if (!this.serverSideRowModel) {\n console.warn('AG Grid: API retryServerSideLoads() can only be used when using Server-Side Row Model.');\n return;\n }\n this.serverSideRowModel.retryLoads();\n };\n GridApi.prototype.flushServerSideAsyncTransactions = function () {\n if (!this.serverSideTransactionManager) {\n console.warn('AG Grid: Cannot flush Server Side Transaction if not using the Server Side Row Model.');\n return;\n }\n return this.serverSideTransactionManager.flushAsyncTransactions();\n };\n GridApi.prototype.applyTransaction = function (rowDataTransaction) {\n if (!this.clientSideRowModel) {\n console.error('AG Grid: updateRowData() only works with ClientSideRowModel. Working with InfiniteRowModel was deprecated in v23.1 and removed in v24.1');\n return;\n }\n var res = this.clientSideRowModel.updateRowData(rowDataTransaction);\n // refresh all the full width rows\n this.rowRenderer.refreshFullWidthRows(res.update);\n // do change detection for all present cells\n if (!this.gridOptionsWrapper.isSuppressChangeDetection()) {\n this.rowRenderer.refreshCells();\n }\n return res;\n };\n /** @deprecated */\n GridApi.prototype.updateRowData = function (rowDataTransaction) {\n var message = 'AG Grid: as of v23.1, grid API updateRowData(transaction) is now called applyTransaction(transaction). updateRowData is deprecated and will be removed in a future major release.';\n doOnce(function () { return console.warn(message); }, 'updateRowData deprecated');\n return this.applyTransaction(rowDataTransaction);\n };\n GridApi.prototype.applyTransactionAsync = function (rowDataTransaction, callback) {\n if (!this.clientSideRowModel) {\n console.error('AG Grid: api.applyTransactionAsync() only works with ClientSideRowModel.');\n return;\n }\n this.clientSideRowModel.batchUpdateRowData(rowDataTransaction, callback);\n };\n GridApi.prototype.flushAsyncTransactions = function () {\n if (!this.clientSideRowModel) {\n console.error('AG Grid: api.applyTransactionAsync() only works with ClientSideRowModel.');\n return;\n }\n this.clientSideRowModel.flushAsyncTransactions();\n };\n /** @deprecated */\n GridApi.prototype.batchUpdateRowData = function (rowDataTransaction, callback) {\n var message = 'AG Grid: as of v23.1, grid API batchUpdateRowData(transaction, callback) is now called applyTransactionAsync(transaction, callback). batchUpdateRowData is deprecated and will be removed in a future major release.';\n doOnce(function () { return console.warn(message); }, 'batchUpdateRowData deprecated');\n this.applyTransactionAsync(rowDataTransaction, callback);\n };\n GridApi.prototype.insertItemsAtIndex = function (index, items, skipRefresh) {\n console.warn('AG Grid: insertItemsAtIndex() is deprecated, use updateRowData(transaction) instead.');\n this.updateRowData({ add: items, addIndex: index, update: null, remove: null });\n };\n GridApi.prototype.removeItems = function (rowNodes, skipRefresh) {\n console.warn('AG Grid: removeItems() is deprecated, use updateRowData(transaction) instead.');\n var dataToRemove = rowNodes.map(function (rowNode) { return rowNode.data; });\n this.updateRowData({ add: null, addIndex: null, update: null, remove: dataToRemove });\n };\n GridApi.prototype.addItems = function (items, skipRefresh) {\n console.warn('AG Grid: addItems() is deprecated, use updateRowData(transaction) instead.');\n this.updateRowData({ add: items, addIndex: null, update: null, remove: null });\n };\n GridApi.prototype.refreshVirtualPageCache = function () {\n console.warn('AG Grid: refreshVirtualPageCache() is now called refreshInfiniteCache(), please call refreshInfiniteCache() instead');\n this.refreshInfiniteCache();\n };\n GridApi.prototype.refreshInfinitePageCache = function () {\n console.warn('AG Grid: refreshInfinitePageCache() is now called refreshInfiniteCache(), please call refreshInfiniteCache() instead');\n this.refreshInfiniteCache();\n };\n GridApi.prototype.refreshInfiniteCache = function () {\n if (this.infiniteRowModel) {\n this.infiniteRowModel.refreshCache();\n }\n else {\n console.warn(\"AG Grid: api.refreshInfiniteCache is only available when rowModelType='infinite'.\");\n }\n };\n GridApi.prototype.purgeVirtualPageCache = function () {\n console.warn('AG Grid: purgeVirtualPageCache() is now called purgeInfiniteCache(), please call purgeInfiniteCache() instead');\n this.purgeInfinitePageCache();\n };\n GridApi.prototype.purgeInfinitePageCache = function () {\n console.warn('AG Grid: purgeInfinitePageCache() is now called purgeInfiniteCache(), please call purgeInfiniteCache() instead');\n this.purgeInfiniteCache();\n };\n GridApi.prototype.purgeInfiniteCache = function () {\n if (this.infiniteRowModel) {\n this.infiniteRowModel.purgeCache();\n }\n else {\n console.warn(\"AG Grid: api.purgeInfiniteCache is only available when rowModelType='infinite'.\");\n }\n };\n /** @deprecated */\n GridApi.prototype.purgeEnterpriseCache = function (route) {\n console.warn(\"ag-grid: since version 18.x, api.purgeEnterpriseCache() should be replaced with api.purgeServerSideCache()\");\n this.purgeServerSideCache(route);\n };\n /** @deprecated */\n GridApi.prototype.purgeServerSideCache = function (route) {\n if (route === void 0) { route = []; }\n if (this.serverSideRowModel) {\n console.warn(\"AG Grid: since v25.0, api.purgeServerSideCache is deprecated. Please use api.refreshServerSideStore({purge: true}) instead.\");\n this.refreshServerSideStore({\n route: route,\n purge: true\n });\n }\n else {\n console.warn(\"AG Grid: api.purgeServerSideCache is only available when rowModelType='serverSide'.\");\n }\n };\n GridApi.prototype.refreshServerSideStore = function (params) {\n if (this.serverSideRowModel) {\n this.serverSideRowModel.refreshStore(params);\n }\n else {\n console.warn(\"AG Grid: api.refreshServerSideStore is only available when rowModelType='serverSide'.\");\n }\n };\n GridApi.prototype.getServerSideStoreState = function () {\n if (this.serverSideRowModel) {\n return this.serverSideRowModel.getStoreState();\n }\n else {\n console.warn(\"AG Grid: api.getServerSideStoreState is only available when rowModelType='serverSide'.\");\n return [];\n }\n };\n GridApi.prototype.getVirtualRowCount = function () {\n console.warn('AG Grid: getVirtualRowCount() is now called getInfiniteRowCount(), please call getInfiniteRowCount() instead');\n return this.getInfiniteRowCount();\n };\n GridApi.prototype.getInfiniteRowCount = function () {\n if (this.infiniteRowModel) {\n return this.infiniteRowModel.getRowCount();\n }\n else {\n console.warn(\"AG Grid: api.getVirtualRowCount is only available when rowModelType='virtual'.\");\n }\n };\n GridApi.prototype.isMaxRowFound = function () {\n console.warn(\"AG Grid: api.isLastRowIndexKnown is deprecated, please use api.isLastRowIndexKnown()\");\n return this.isLastRowIndexKnown();\n };\n GridApi.prototype.isLastRowIndexKnown = function () {\n if (this.infiniteRowModel) {\n return this.infiniteRowModel.isLastRowIndexKnown();\n }\n else {\n console.warn(\"AG Grid: api.isMaxRowFound is only available when rowModelType='virtual'.\");\n }\n };\n GridApi.prototype.setVirtualRowCount = function (rowCount, maxRowFound) {\n console.warn('AG Grid: setVirtualRowCount() is now called setInfiniteRowCount(), please call setInfiniteRowCount() instead');\n this.setRowCount(rowCount, maxRowFound);\n };\n GridApi.prototype.setInfiniteRowCount = function (rowCount, maxRowFound) {\n console.warn('AG Grid: setInfiniteRowCount() is now called setRowCount(), please call setRowCount() instead');\n this.setRowCount(rowCount, maxRowFound);\n };\n GridApi.prototype.setRowCount = function (rowCount, maxRowFound) {\n if (this.infiniteRowModel) {\n this.infiniteRowModel.setRowCount(rowCount, maxRowFound);\n }\n else {\n console.warn(\"AG Grid: api.setRowCount is only available for Infinite Row Model.\");\n }\n };\n GridApi.prototype.getVirtualPageState = function () {\n console.warn('AG Grid: getVirtualPageState() is now called getCacheBlockState(), please call getCacheBlockState() instead');\n return this.getCacheBlockState();\n };\n GridApi.prototype.getInfinitePageState = function () {\n console.warn('AG Grid: getInfinitePageState() is now called getCacheBlockState(), please call getCacheBlockState() instead');\n return this.getCacheBlockState();\n };\n GridApi.prototype.getCacheBlockState = function () {\n return this.rowNodeBlockLoader.getBlockState();\n };\n GridApi.prototype.checkGridSize = function () {\n this.gridPanel.setHeaderAndFloatingHeights();\n };\n GridApi.prototype.getFirstRenderedRow = function () {\n console.warn('in AG Grid v12, getFirstRenderedRow() was renamed to getFirstDisplayedRow()');\n return this.getFirstDisplayedRow();\n };\n GridApi.prototype.getFirstDisplayedRow = function () {\n return this.rowRenderer.getFirstVirtualRenderedRow();\n };\n GridApi.prototype.getLastRenderedRow = function () {\n console.warn('in AG Grid v12, getLastRenderedRow() was renamed to getLastDisplayedRow()');\n return this.getLastDisplayedRow();\n };\n GridApi.prototype.getLastDisplayedRow = function () {\n return this.rowRenderer.getLastVirtualRenderedRow();\n };\n GridApi.prototype.getDisplayedRowAtIndex = function (index) {\n return this.rowModel.getRow(index);\n };\n GridApi.prototype.getDisplayedRowCount = function () {\n return this.rowModel.getRowCount();\n };\n GridApi.prototype.paginationIsLastPageFound = function () {\n return this.paginationProxy.isLastPageFound();\n };\n GridApi.prototype.paginationGetPageSize = function () {\n return this.paginationProxy.getPageSize();\n };\n GridApi.prototype.paginationSetPageSize = function (size) {\n this.gridOptionsWrapper.setProperty('paginationPageSize', size);\n };\n GridApi.prototype.paginationGetCurrentPage = function () {\n return this.paginationProxy.getCurrentPage();\n };\n GridApi.prototype.paginationGetTotalPages = function () {\n return this.paginationProxy.getTotalPages();\n };\n GridApi.prototype.paginationGetRowCount = function () {\n return this.paginationProxy.getMasterRowCount();\n };\n GridApi.prototype.paginationGoToNextPage = function () {\n this.paginationProxy.goToNextPage();\n };\n GridApi.prototype.paginationGoToPreviousPage = function () {\n this.paginationProxy.goToPreviousPage();\n };\n GridApi.prototype.paginationGoToFirstPage = function () {\n this.paginationProxy.goToFirstPage();\n };\n GridApi.prototype.paginationGoToLastPage = function () {\n this.paginationProxy.goToLastPage();\n };\n GridApi.prototype.paginationGoToPage = function (page) {\n this.paginationProxy.goToPage(page);\n };\n __decorate$Y([\n Optional('immutableService')\n ], GridApi.prototype, \"immutableService\", void 0);\n __decorate$Y([\n Optional('csvCreator')\n ], GridApi.prototype, \"csvCreator\", void 0);\n __decorate$Y([\n Optional('excelCreator')\n ], GridApi.prototype, \"excelCreator\", void 0);\n __decorate$Y([\n Autowired('rowRenderer')\n ], GridApi.prototype, \"rowRenderer\", void 0);\n __decorate$Y([\n Autowired('filterManager')\n ], GridApi.prototype, \"filterManager\", void 0);\n __decorate$Y([\n Autowired('columnController')\n ], GridApi.prototype, \"columnController\", void 0);\n __decorate$Y([\n Autowired('selectionController')\n ], GridApi.prototype, \"selectionController\", void 0);\n __decorate$Y([\n Autowired('gridOptionsWrapper')\n ], GridApi.prototype, \"gridOptionsWrapper\", void 0);\n __decorate$Y([\n Autowired('valueService')\n ], GridApi.prototype, \"valueService\", void 0);\n __decorate$Y([\n Autowired('alignedGridsService')\n ], GridApi.prototype, \"alignedGridsService\", void 0);\n __decorate$Y([\n Autowired('eventService')\n ], GridApi.prototype, \"eventService\", void 0);\n __decorate$Y([\n Autowired('pinnedRowModel')\n ], GridApi.prototype, \"pinnedRowModel\", void 0);\n __decorate$Y([\n Autowired('context')\n ], GridApi.prototype, \"context\", void 0);\n __decorate$Y([\n Autowired('rowModel')\n ], GridApi.prototype, \"rowModel\", void 0);\n __decorate$Y([\n Autowired('sortController')\n ], GridApi.prototype, \"sortController\", void 0);\n __decorate$Y([\n Autowired('paginationProxy')\n ], GridApi.prototype, \"paginationProxy\", void 0);\n __decorate$Y([\n Autowired('focusController')\n ], GridApi.prototype, \"focusController\", void 0);\n __decorate$Y([\n Autowired('dragAndDropService')\n ], GridApi.prototype, \"dragAndDropService\", void 0);\n __decorate$Y([\n Optional('rangeController')\n ], GridApi.prototype, \"rangeController\", void 0);\n __decorate$Y([\n Optional('clipboardService')\n ], GridApi.prototype, \"clipboardService\", void 0);\n __decorate$Y([\n Optional('aggFuncService')\n ], GridApi.prototype, \"aggFuncService\", void 0);\n __decorate$Y([\n Autowired('menuFactory')\n ], GridApi.prototype, \"menuFactory\", void 0);\n __decorate$Y([\n Optional('contextMenuFactory')\n ], GridApi.prototype, \"contextMenuFactory\", void 0);\n __decorate$Y([\n Autowired('valueCache')\n ], GridApi.prototype, \"valueCache\", void 0);\n __decorate$Y([\n Autowired('animationFrameService')\n ], GridApi.prototype, \"animationFrameService\", void 0);\n __decorate$Y([\n Optional('statusBarService')\n ], GridApi.prototype, \"statusBarService\", void 0);\n __decorate$Y([\n Optional('chartService')\n ], GridApi.prototype, \"chartService\", void 0);\n __decorate$Y([\n Optional('undoRedoService')\n ], GridApi.prototype, \"undoRedoService\", void 0);\n __decorate$Y([\n Optional('rowNodeBlockLoader')\n ], GridApi.prototype, \"rowNodeBlockLoader\", void 0);\n __decorate$Y([\n Optional('ssrmTransactionManager')\n ], GridApi.prototype, \"serverSideTransactionManager\", void 0);\n __decorate$Y([\n PostConstruct\n ], GridApi.prototype, \"init\", null);\n __decorate$Y([\n PreDestroy\n ], GridApi.prototype, \"cleanDownReferencesToAvoidMemoryLeakInCaseApplicationIsKeepingReferenceToDestroyedGrid\", null);\n GridApi = __decorate$Y([\n Bean('gridApi')\n ], GridApi);\n return GridApi;\n}());\n\n/**\n * @ag-grid-community/core - Advanced Data Grid / Data Table supporting Javascript / React / AngularJS / Web Components\n * @version v25.1.0\n * @link http://www.ag-grid.com/\n * @license MIT\n */\nvar __extends$12 = (undefined && undefined.__extends) || (function () {\n var extendStatics = function (d, b) {\n extendStatics = Object.setPrototypeOf ||\n ({ __proto__: [] } instanceof Array && function (d, b) { d.__proto__ = b; }) ||\n function (d, b) { for (var p in b) if (b.hasOwnProperty(p)) d[p] = b[p]; };\n return extendStatics(d, b);\n };\n return function (d, b) {\n extendStatics(d, b);\n function __() { this.constructor = d; }\n d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __());\n };\n})();\nvar __decorate$Z = (undefined && undefined.__decorate) || function (decorators, target, key, desc) {\n var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d;\n if (typeof Reflect === \"object\" && typeof Reflect.decorate === \"function\") r = Reflect.decorate(decorators, target, key, desc);\n else for (var i = decorators.length - 1; i >= 0; i--) if (d = decorators[i]) r = (c < 3 ? d(r) : c > 3 ? d(target, key, r) : d(target, key)) || r;\n return c > 3 && r && Object.defineProperty(target, key, r), r;\n};\nvar __param$6 = (undefined && undefined.__param) || function (paramIndex, decorator) {\n return function (target, key) { decorator(target, key, paramIndex); }\n};\nvar ExpressionService = /** @class */ (function (_super) {\n __extends$12(ExpressionService, _super);\n function ExpressionService() {\n var _this = _super !== null && _super.apply(this, arguments) || this;\n _this.expressionToFunctionCache = {};\n return _this;\n }\n ExpressionService.prototype.setBeans = function (loggerFactory) {\n this.logger = loggerFactory.create('ExpressionService');\n };\n ExpressionService.prototype.evaluate = function (expressionOrFunc, params) {\n if (typeof expressionOrFunc === 'function') {\n // valueGetter is a function, so just call it\n var func = expressionOrFunc;\n return func(params);\n }\n else if (typeof expressionOrFunc === 'string') {\n // valueGetter is an expression, so execute the expression\n var expression = expressionOrFunc;\n return this.evaluateExpression(expression, params);\n }\n else {\n console.error('AG Grid: value should be either a string or a function', expressionOrFunc);\n }\n };\n ExpressionService.prototype.evaluateExpression = function (expression, params) {\n try {\n var javaScriptFunction = this.createExpressionFunction(expression);\n // the params don't have all these values, rather we add every possible\n // value a params can have, which makes whatever is in the params available.\n var result = javaScriptFunction(params.value, params.context, params.oldValue, params.newValue, params.value, params.node, params.data, params.colDef, params.rowIndex, params.api, params.columnApi, params.getValue, params.column, params.columnGroup);\n return result;\n }\n catch (e) {\n // the expression failed, which can happen, as it's the client that\n // provides the expression. so print a nice message\n // tslint:disable-next-line\n console.log('Processing of the expression failed');\n // tslint:disable-next-line\n console.log('Expression = ' + expression);\n // tslint:disable-next-line\n console.log('Params =', params);\n // tslint:disable-next-line\n console.log('Exception = ' + e);\n return null;\n }\n };\n ExpressionService.prototype.createExpressionFunction = function (expression) {\n // check cache first\n if (this.expressionToFunctionCache[expression]) {\n return this.expressionToFunctionCache[expression];\n }\n // if not found in cache, return the function\n var functionBody = this.createFunctionBody(expression);\n var theFunction = new Function('x, ctx, oldValue, newValue, value, node, data, colDef, rowIndex, api, columnApi, getValue, column, columnGroup', functionBody);\n // store in cache\n this.expressionToFunctionCache[expression] = theFunction;\n return theFunction;\n };\n ExpressionService.prototype.createFunctionBody = function (expression) {\n // if the expression has the 'return' word in it, then use as is,\n // if not, then wrap it with return and ';' to make a function\n if (expression.indexOf('return') >= 0) {\n return expression;\n }\n else {\n return 'return ' + expression + ';';\n }\n };\n __decorate$Z([\n __param$6(0, Qualifier('loggerFactory'))\n ], ExpressionService.prototype, \"setBeans\", null);\n ExpressionService = __decorate$Z([\n Bean('expressionService')\n ], ExpressionService);\n return ExpressionService;\n}(BeanStub));\n\n/**\n * @ag-grid-community/core - Advanced Data Grid / Data Table supporting Javascript / React / AngularJS / Web Components\n * @version v25.1.0\n * @link http://www.ag-grid.com/\n * @license MIT\n */\nvar __extends$13 = (undefined && undefined.__extends) || (function () {\n var extendStatics = function (d, b) {\n extendStatics = Object.setPrototypeOf ||\n ({ __proto__: [] } instanceof Array && function (d, b) { d.__proto__ = b; }) ||\n function (d, b) { for (var p in b) if (b.hasOwnProperty(p)) d[p] = b[p]; };\n return extendStatics(d, b);\n };\n return function (d, b) {\n extendStatics(d, b);\n function __() { this.constructor = d; }\n d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __());\n };\n})();\nvar __decorate$_ = (undefined && undefined.__decorate) || function (decorators, target, key, desc) {\n var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d;\n if (typeof Reflect === \"object\" && typeof Reflect.decorate === \"function\") r = Reflect.decorate(decorators, target, key, desc);\n else for (var i = decorators.length - 1; i >= 0; i--) if (d = decorators[i]) r = (c < 3 ? d(r) : c > 3 ? d(target, key, r) : d(target, key)) || r;\n return c > 3 && r && Object.defineProperty(target, key, r), r;\n};\nvar TemplateService = /** @class */ (function (_super) {\n __extends$13(TemplateService, _super);\n function TemplateService() {\n var _this = _super !== null && _super.apply(this, arguments) || this;\n _this.templateCache = {};\n _this.waitingCallbacks = {};\n return _this;\n }\n // returns the template if it is loaded, or null if it is not loaded\n // but will call the callback when it is loaded\n TemplateService.prototype.getTemplate = function (url, callback) {\n var templateFromCache = this.templateCache[url];\n if (templateFromCache) {\n return templateFromCache;\n }\n var callbackList = this.waitingCallbacks[url];\n var that = this;\n if (!callbackList) {\n // first time this was called, so need a new list for callbacks\n callbackList = [];\n this.waitingCallbacks[url] = callbackList;\n // and also need to do the http request\n var client = new XMLHttpRequest();\n client.onload = function () {\n that.handleHttpResult(this, url);\n };\n client.open(\"GET\", url);\n client.send();\n }\n // add this callback\n if (callback) {\n callbackList.push(callback);\n }\n // caller needs to wait for template to load, so return null\n return null;\n };\n TemplateService.prototype.handleHttpResult = function (httpResult, url) {\n if (httpResult.status !== 200 || httpResult.response === null) {\n console.warn(\"Unable to get template error \" + httpResult.status + \" - \" + url);\n return;\n }\n // response success, so process it\n // in IE9 the response is in - responseText\n this.templateCache[url] = httpResult.response || httpResult.responseText;\n // inform all listeners that this is now in the cache\n var callbacks = this.waitingCallbacks[url];\n for (var i = 0; i < callbacks.length; i++) {\n var callback = callbacks[i];\n // we could pass the callback the response, however we know the client of this code\n // is the cell renderer, and it passes the 'cellRefresh' method in as the callback\n // which doesn't take any parameters.\n callback();\n }\n if (this.$scope) {\n var that_1 = this;\n window.setTimeout(function () {\n that_1.$scope.$apply();\n }, 0);\n }\n };\n __decorate$_([\n Autowired('$scope')\n ], TemplateService.prototype, \"$scope\", void 0);\n TemplateService = __decorate$_([\n Bean('templateService')\n ], TemplateService);\n return TemplateService;\n}(BeanStub));\n\n/**\n * @ag-grid-community/core - Advanced Data Grid / Data Table supporting Javascript / React / AngularJS / Web Components\n * @version v25.1.0\n * @link http://www.ag-grid.com/\n * @license MIT\n */\nvar __extends$14 = (undefined && undefined.__extends) || (function () {\n var extendStatics = function (d, b) {\n extendStatics = Object.setPrototypeOf ||\n ({ __proto__: [] } instanceof Array && function (d, b) { d.__proto__ = b; }) ||\n function (d, b) { for (var p in b) if (b.hasOwnProperty(p)) d[p] = b[p]; };\n return extendStatics(d, b);\n };\n return function (d, b) {\n extendStatics(d, b);\n function __() { this.constructor = d; }\n d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __());\n };\n})();\nvar __decorate$$ = (undefined && undefined.__decorate) || function (decorators, target, key, desc) {\n var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d;\n if (typeof Reflect === \"object\" && typeof Reflect.decorate === \"function\") r = Reflect.decorate(decorators, target, key, desc);\n else for (var i = decorators.length - 1; i >= 0; i--) if (d = decorators[i]) r = (c < 3 ? d(r) : c > 3 ? d(target, key, r) : d(target, key)) || r;\n return c > 3 && r && Object.defineProperty(target, key, r), r;\n};\nvar __spreadArrays$5 = (undefined && undefined.__spreadArrays) || function () {\n for (var s = 0, i = 0, il = arguments.length; i < il; i++) s += arguments[i].length;\n for (var r = Array(s), k = 0, i = 0; i < il; i++)\n for (var a = arguments[i], j = 0, jl = a.length; j < jl; j++, k++)\n r[k] = a[j];\n return r;\n};\nvar FocusController = /** @class */ (function (_super) {\n __extends$14(FocusController, _super);\n function FocusController() {\n return _super !== null && _super.apply(this, arguments) || this;\n }\n FocusController_1 = FocusController;\n /**\n * Adds a gridCore to the list of the gridCores monitoring Keyboard Mode\n * in a specific HTMLDocument.\n *\n * @param doc {Document} - The Document containing the gridCore.\n * @param gridCore {GridCore} - The GridCore to be monitored.\n */\n FocusController.addKeyboardModeEvents = function (doc, gridCore) {\n var gridCoresForDocument = FocusController_1.instancesMonitored.get(doc);\n if (gridCoresForDocument && gridCoresForDocument.length > 0) {\n if (gridCoresForDocument.indexOf(gridCore) === -1) {\n gridCoresForDocument.push(gridCore);\n }\n }\n else {\n FocusController_1.instancesMonitored.set(doc, [gridCore]);\n doc.addEventListener('keydown', FocusController_1.toggleKeyboardMode);\n doc.addEventListener('mousedown', FocusController_1.toggleKeyboardMode);\n }\n };\n /**\n * Removes a gridCore from the list of the gridCores monitoring Keyboard Mode\n * in a specific HTMLDocument.\n *\n * @param doc {Document} - The Document containing the gridCore.\n * @param gridCore {GridCore} - The GridCore to be removed.\n */\n FocusController.removeKeyboardModeEvents = function (doc, gridCore) {\n var gridCoresForDocument = FocusController_1.instancesMonitored.get(doc);\n var newGridCoresForDocument = [];\n if (gridCoresForDocument && gridCoresForDocument.length) {\n newGridCoresForDocument = __spreadArrays$5(gridCoresForDocument).filter(function (currentGridCore) { return currentGridCore !== gridCore; });\n FocusController_1.instancesMonitored.set(doc, newGridCoresForDocument);\n }\n if (newGridCoresForDocument.length === 0) {\n doc.removeEventListener('keydown', FocusController_1.toggleKeyboardMode);\n doc.removeEventListener('mousedown', FocusController_1.toggleKeyboardMode);\n }\n };\n /**\n * This method will be called by `keydown` and `mousedown` events on all Documents monitoring\n * KeyboardMode. It will then fire a KEYBOARD_FOCUS, MOUSE_FOCUS on each gridCore present in\n * the Document allowing each gridCore to maintain a state for KeyboardMode.\n *\n * @param event {KeyboardEvent | MouseEvent | TouchEvent} - The event triggered.\n */\n FocusController.toggleKeyboardMode = function (event) {\n var isKeyboardActive = FocusController_1.keyboardModeActive;\n var isKeyboardEvent = event.type === 'keydown';\n if (isKeyboardEvent) {\n // the following keys should not toggle keyboard mode.\n if (event.ctrlKey || event.metaKey || event.altKey) {\n return;\n }\n }\n if (isKeyboardActive && isKeyboardEvent || !isKeyboardActive && !isKeyboardEvent) {\n return;\n }\n FocusController_1.keyboardModeActive = isKeyboardEvent;\n var doc = event.target.ownerDocument;\n if (!doc) {\n return;\n }\n var gridCoresForDocument = FocusController_1.instancesMonitored.get(doc);\n if (gridCoresForDocument) {\n gridCoresForDocument.forEach(function (gridCore) {\n gridCore.dispatchEvent({ type: isKeyboardEvent ? Events.EVENT_KEYBOARD_FOCUS : Events.EVENT_MOUSE_FOCUS });\n });\n }\n };\n FocusController.prototype.init = function () {\n var clearFocusedCellListener = this.clearFocusedCell.bind(this);\n this.addManagedListener(this.eventService, Events.EVENT_COLUMN_PIVOT_MODE_CHANGED, clearFocusedCellListener);\n this.addManagedListener(this.eventService, Events.EVENT_NEW_COLUMNS_LOADED, this.onColumnEverythingChanged.bind(this));\n this.addManagedListener(this.eventService, Events.EVENT_COLUMN_GROUP_OPENED, clearFocusedCellListener);\n this.addManagedListener(this.eventService, Events.EVENT_COLUMN_ROW_GROUP_CHANGED, clearFocusedCellListener);\n };\n FocusController.prototype.registerGridCore = function (gridCore) {\n var _this = this;\n this.gridCore = gridCore;\n var doc = this.gridOptionsWrapper.getDocument();\n FocusController_1.addKeyboardModeEvents(doc, gridCore);\n this.addDestroyFunc(function () { return _this.unregisterGridCore(gridCore); });\n };\n FocusController.prototype.unregisterGridCore = function (gridCore) {\n var doc = this.gridOptionsWrapper.getDocument();\n FocusController_1.removeKeyboardModeEvents(doc, gridCore);\n };\n FocusController.prototype.onColumnEverythingChanged = function () {\n // if the columns change, check and see if this column still exists. if it does, then\n // we can keep the focused cell. if it doesn't, then we need to drop the focused cell.\n if (!this.focusedCellPosition) {\n return;\n }\n var col = this.focusedCellPosition.column;\n var colFromColumnController = this.columnController.getGridColumn(col.getId());\n if (col !== colFromColumnController) {\n this.clearFocusedCell();\n }\n };\n FocusController.prototype.isKeyboardMode = function () {\n return FocusController_1.keyboardModeActive;\n };\n // we check if the browser is focusing something, and if it is, and\n // it's the cell we think is focused, then return the cell. so this\n // methods returns the cell if a) we think it has focus and b) the\n // browser thinks it has focus. this then returns nothing if we\n // first focus a cell, then second click outside the grid, as then the\n // grid cell will still be focused as far as the grid is concerned,\n // however the browser focus will have moved somewhere else.\n FocusController.prototype.getFocusCellToUseAfterRefresh = function () {\n if (this.gridOptionsWrapper.isSuppressFocusAfterRefresh() || !this.focusedCellPosition) {\n return null;\n }\n // we check that the browser is actually focusing on the grid, if it is not, then\n // we have nothing to worry about\n if (!this.getGridCellForDomElement(document.activeElement)) {\n return null;\n }\n return this.focusedCellPosition;\n };\n FocusController.prototype.getGridCellForDomElement = function (eBrowserCell) {\n var ePointer = eBrowserCell;\n while (ePointer) {\n var cellComp = this.gridOptionsWrapper.getDomData(ePointer, CellComp.DOM_DATA_KEY_CELL_COMP);\n if (cellComp) {\n return cellComp.getCellPosition();\n }\n ePointer = ePointer.parentNode;\n }\n return null;\n };\n FocusController.prototype.clearFocusedCell = function () {\n this.focusedCellPosition = null;\n this.onCellFocused(false);\n };\n FocusController.prototype.getFocusedCell = function () {\n return this.focusedCellPosition;\n };\n FocusController.prototype.setFocusedCell = function (rowIndex, colKey, floating, forceBrowserFocus) {\n if (forceBrowserFocus === void 0) { forceBrowserFocus = false; }\n var gridColumn = this.columnController.getGridColumn(colKey);\n // if column doesn't exist, then blank the focused cell and return. this can happen when user sets new columns,\n // and the focused cell is in a column that no longer exists. after columns change, the grid refreshes and tries\n // to re-focus the focused cell.\n if (!gridColumn) {\n this.focusedCellPosition = null;\n return;\n }\n this.focusedCellPosition = gridColumn ? { rowIndex: rowIndex, rowPinned: makeNull(floating), column: gridColumn } : null;\n this.onCellFocused(forceBrowserFocus);\n };\n FocusController.prototype.isCellFocused = function (cellPosition) {\n if (this.focusedCellPosition == null) {\n return false;\n }\n return this.focusedCellPosition.column === cellPosition.column &&\n this.isRowFocused(cellPosition.rowIndex, cellPosition.rowPinned);\n };\n FocusController.prototype.isRowNodeFocused = function (rowNode) {\n return this.isRowFocused(rowNode.rowIndex, rowNode.rowPinned);\n };\n FocusController.prototype.isHeaderWrapperFocused = function (headerWrapper) {\n if (this.focusedHeaderPosition == null) {\n return false;\n }\n var column = headerWrapper.getColumn();\n var headerRowIndex = headerWrapper.getParentComponent().getRowIndex();\n var pinned = headerWrapper.getPinned();\n var _a = this.focusedHeaderPosition, focusedColumn = _a.column, focusedHeaderRowIndex = _a.headerRowIndex;\n return column === focusedColumn &&\n headerRowIndex === focusedHeaderRowIndex &&\n pinned == focusedColumn.getPinned();\n };\n FocusController.prototype.clearFocusedHeader = function () {\n this.focusedHeaderPosition = null;\n };\n FocusController.prototype.getFocusedHeader = function () {\n return this.focusedHeaderPosition;\n };\n FocusController.prototype.setFocusedHeader = function (headerRowIndex, column) {\n this.focusedHeaderPosition = { headerRowIndex: headerRowIndex, column: column };\n };\n FocusController.prototype.focusHeaderPosition = function (headerPosition, direction, fromTab, allowUserOverride, event) {\n if (direction === void 0) { direction = null; }\n if (fromTab === void 0) { fromTab = false; }\n if (allowUserOverride === void 0) { allowUserOverride = false; }\n if (allowUserOverride) {\n var gridOptionsWrapper = this.gridOptionsWrapper;\n var currentPosition = this.getFocusedHeader();\n var headerRowCount = this.headerNavigationService.getHeaderRowCount();\n if (fromTab) {\n var userFunc = gridOptionsWrapper.getTabToNextHeaderFunc();\n if (userFunc) {\n var params = {\n backwards: direction === 'Before',\n previousHeaderPosition: currentPosition,\n nextHeaderPosition: headerPosition,\n headerRowCount: headerRowCount\n };\n headerPosition = userFunc(params);\n }\n }\n else {\n var userFunc = gridOptionsWrapper.getNavigateToNextHeaderFunc();\n if (userFunc && event) {\n var params = {\n key: event.key,\n previousHeaderPosition: currentPosition,\n nextHeaderPosition: headerPosition,\n headerRowCount: headerRowCount,\n event: event\n };\n headerPosition = userFunc(params);\n }\n }\n }\n if (!headerPosition) {\n return false;\n }\n if (headerPosition.headerRowIndex === -1) {\n return this.focusGridView(headerPosition.column);\n }\n this.headerNavigationService.scrollToColumn(headerPosition.column, direction);\n var childContainer = this.headerNavigationService.getHeaderContainer(headerPosition.column.getPinned());\n var rowComps = childContainer.getRowComps();\n var nextRowComp = rowComps[headerPosition.headerRowIndex];\n var headerComps = nextRowComp.getHeaderComps();\n var nextHeader = headerComps[headerPosition.column.getUniqueId()];\n if (nextHeader) {\n // this will automatically call the setFocusedHeader method above\n nextHeader.getFocusableElement().focus();\n return true;\n }\n return false;\n };\n FocusController.prototype.isAnyCellFocused = function () {\n return !!this.focusedCellPosition;\n };\n FocusController.prototype.isRowFocused = function (rowIndex, floating) {\n if (this.focusedCellPosition == null) {\n return false;\n }\n return this.focusedCellPosition.rowIndex === rowIndex && this.focusedCellPosition.rowPinned === makeNull(floating);\n };\n FocusController.prototype.findFocusableElements = function (rootNode, exclude, onlyUnmanaged) {\n if (onlyUnmanaged === void 0) { onlyUnmanaged = false; }\n var focusableString = Constants.FOCUSABLE_SELECTOR;\n var excludeString = Constants.FOCUSABLE_EXCLUDE;\n if (exclude) {\n excludeString += ', ' + exclude;\n }\n if (onlyUnmanaged) {\n excludeString += ', [tabindex=\"-1\"]';\n }\n var nodes = Array.prototype.slice.apply(rootNode.querySelectorAll(focusableString));\n var excludeNodes = Array.prototype.slice.apply(rootNode.querySelectorAll(excludeString));\n if (!excludeNodes.length) {\n return nodes;\n }\n var diff = function (a, b) { return a.filter(function (element) { return b.indexOf(element) === -1; }); };\n return diff(nodes, excludeNodes);\n };\n FocusController.prototype.focusInto = function (rootNode, up, onlyUnmanaged) {\n if (up === void 0) { up = false; }\n if (onlyUnmanaged === void 0) { onlyUnmanaged = false; }\n var focusableElements = this.findFocusableElements(rootNode, null, onlyUnmanaged);\n var toFocus = up ? last(focusableElements) : focusableElements[0];\n if (toFocus) {\n toFocus.focus();\n return true;\n }\n return false;\n };\n FocusController.prototype.findNextFocusableElement = function (rootNode, onlyManaged, backwards) {\n var focusable = this.findFocusableElements(rootNode, onlyManaged ? ':not([tabindex=\"-1\"])' : null);\n var currentIndex;\n if (onlyManaged) {\n currentIndex = findIndex(focusable, function (el) { return el.contains(document.activeElement); });\n }\n else {\n currentIndex = focusable.indexOf(document.activeElement);\n }\n var nextIndex = currentIndex + (backwards ? -1 : 1);\n if (nextIndex < 0 || nextIndex >= focusable.length) {\n return null;\n }\n return focusable[nextIndex];\n };\n FocusController.prototype.isFocusUnderManagedComponent = function (rootNode) {\n var managedContainers = rootNode.querySelectorAll(\".\" + ManagedFocusComponent.FOCUS_MANAGED_CLASS);\n if (!managedContainers.length) {\n return false;\n }\n for (var i = 0; i < managedContainers.length; i++) {\n if (managedContainers[i].contains(document.activeElement)) {\n return true;\n }\n }\n return false;\n };\n FocusController.prototype.findTabbableParent = function (node, limit) {\n if (limit === void 0) { limit = 5; }\n var counter = 0;\n while (node && getTabIndex(node) === null && ++counter <= limit) {\n node = node.parentElement;\n }\n if (getTabIndex(node) === null) {\n return null;\n }\n return node;\n };\n FocusController.prototype.onCellFocused = function (forceBrowserFocus) {\n var event = {\n type: Events.EVENT_CELL_FOCUSED,\n forceBrowserFocus: forceBrowserFocus,\n rowIndex: null,\n column: null,\n floating: null,\n api: this.gridApi,\n columnApi: this.columnApi,\n rowPinned: null\n };\n if (this.focusedCellPosition) {\n event.rowIndex = this.focusedCellPosition.rowIndex;\n event.column = this.focusedCellPosition.column;\n event.rowPinned = this.focusedCellPosition.rowPinned;\n }\n this.eventService.dispatchEvent(event);\n };\n FocusController.prototype.focusGridView = function (column, backwards) {\n var nextRow = backwards\n ? this.rowPositionUtils.getLastRow()\n : this.rowPositionUtils.getFirstRow();\n if (!nextRow) {\n return false;\n }\n var rowIndex = nextRow.rowIndex, rowPinned = nextRow.rowPinned;\n var focusedHeader = this.getFocusedHeader();\n if (!column && focusedHeader) {\n column = focusedHeader.column;\n }\n if (rowIndex == null || !column) {\n return false;\n }\n this.rowRenderer.ensureCellVisible({ rowIndex: rowIndex, column: column, rowPinned: rowPinned });\n this.setFocusedCell(rowIndex, column, makeNull(rowPinned), true);\n if (this.rangeController) {\n var cellPosition = { rowIndex: rowIndex, rowPinned: rowPinned, column: column };\n this.rangeController.setRangeToCell(cellPosition);\n }\n return true;\n };\n FocusController.prototype.focusNextGridCoreContainer = function (backwards) {\n if (this.gridCore.focusNextInnerContainer(backwards)) {\n return true;\n }\n if (!backwards) {\n this.gridCore.forceFocusOutOfContainer();\n }\n return false;\n };\n var FocusController_1;\n FocusController.AG_KEYBOARD_FOCUS = 'ag-keyboard-focus';\n FocusController.keyboardModeActive = false;\n FocusController.instancesMonitored = new Map();\n __decorate$$([\n Autowired('columnController')\n ], FocusController.prototype, \"columnController\", void 0);\n __decorate$$([\n Autowired('headerNavigationService')\n ], FocusController.prototype, \"headerNavigationService\", void 0);\n __decorate$$([\n Autowired('columnApi')\n ], FocusController.prototype, \"columnApi\", void 0);\n __decorate$$([\n Autowired('gridApi')\n ], FocusController.prototype, \"gridApi\", void 0);\n __decorate$$([\n Autowired('rowRenderer')\n ], FocusController.prototype, \"rowRenderer\", void 0);\n __decorate$$([\n Autowired('rowPositionUtils')\n ], FocusController.prototype, \"rowPositionUtils\", void 0);\n __decorate$$([\n Optional('rangeController')\n ], FocusController.prototype, \"rangeController\", void 0);\n __decorate$$([\n PostConstruct\n ], FocusController.prototype, \"init\", null);\n FocusController = FocusController_1 = __decorate$$([\n Bean('focusController')\n ], FocusController);\n return FocusController;\n}(BeanStub));\n\n/**\n * @ag-grid-community/core - Advanced Data Grid / Data Table supporting Javascript / React / AngularJS / Web Components\n * @version v25.1.0\n * @link http://www.ag-grid.com/\n * @license MIT\n */\nvar __extends$15 = (undefined && undefined.__extends) || (function () {\n var extendStatics = function (d, b) {\n extendStatics = Object.setPrototypeOf ||\n ({ __proto__: [] } instanceof Array && function (d, b) { d.__proto__ = b; }) ||\n function (d, b) { for (var p in b) if (b.hasOwnProperty(p)) d[p] = b[p]; };\n return extendStatics(d, b);\n };\n return function (d, b) {\n extendStatics(d, b);\n function __() { this.constructor = d; }\n d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __());\n };\n})();\nvar __decorate$10 = (undefined && undefined.__decorate) || function (decorators, target, key, desc) {\n var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d;\n if (typeof Reflect === \"object\" && typeof Reflect.decorate === \"function\") r = Reflect.decorate(decorators, target, key, desc);\n else for (var i = decorators.length - 1; i >= 0; i--) if (d = decorators[i]) r = (c < 3 ? d(r) : c > 3 ? d(target, key, r) : d(target, key)) || r;\n return c > 3 && r && Object.defineProperty(target, key, r), r;\n};\nvar PopupService = /** @class */ (function (_super) {\n __extends$15(PopupService, _super);\n function PopupService() {\n var _this = _super !== null && _super.apply(this, arguments) || this;\n _this.popupList = [];\n return _this;\n }\n PopupService.prototype.registerGridCore = function (gridCore) {\n var _this = this;\n this.gridCore = gridCore;\n this.addManagedListener(this.gridCore, Events.EVENT_KEYBOARD_FOCUS, function () {\n forEach(_this.popupList, function (popup) { return addCssClass(popup.element, FocusController.AG_KEYBOARD_FOCUS); });\n });\n this.addManagedListener(this.gridCore, Events.EVENT_MOUSE_FOCUS, function () {\n forEach(_this.popupList, function (popup) { return removeCssClass(popup.element, FocusController.AG_KEYBOARD_FOCUS); });\n });\n };\n PopupService.prototype.getPopupParent = function () {\n var ePopupParent = this.gridOptionsWrapper.getPopupParent();\n if (ePopupParent) {\n return ePopupParent;\n }\n return this.gridCore.getRootGui();\n };\n PopupService.prototype.positionPopupForMenu = function (params) {\n var sourceRect = params.eventSource.getBoundingClientRect();\n var parentRect = this.getParentRect();\n var y = this.keepYWithinBounds(params, sourceRect.top - parentRect.top);\n var minWidth = (params.ePopup.clientWidth > 0) ? params.ePopup.clientWidth : 200;\n params.ePopup.style.minWidth = minWidth + \"px\";\n var widthOfParent = parentRect.right - parentRect.left;\n var maxX = widthOfParent - minWidth;\n // the x position of the popup depends on RTL or LTR. for normal cases, LTR, we put the child popup\n // to the right, unless it doesn't fit and we then put it to the left. for RTL it's the other way around,\n // we try place it first to the left, and then if not to the right.\n var x;\n if (this.gridOptionsWrapper.isEnableRtl()) {\n // for RTL, try left first\n x = xLeftPosition();\n if (x < 0) {\n x = xRightPosition();\n }\n if (x > maxX) {\n x = 0;\n }\n }\n else {\n // for LTR, try right first\n x = xRightPosition();\n if (x > maxX) {\n x = xLeftPosition();\n }\n if (x < 0) {\n x = 0;\n }\n }\n params.ePopup.style.left = x + \"px\";\n params.ePopup.style.top = y + \"px\";\n function xRightPosition() {\n return sourceRect.right - parentRect.left - 2;\n }\n function xLeftPosition() {\n return sourceRect.left - parentRect.left - minWidth;\n }\n };\n PopupService.prototype.positionPopupUnderMouseEvent = function (params) {\n var _a = this.calculatePointerAlign(params.mouseEvent), x = _a.x, y = _a.y;\n var ePopup = params.ePopup, nudgeX = params.nudgeX, nudgeY = params.nudgeY;\n this.positionPopup({\n ePopup: ePopup,\n x: x,\n y: y,\n nudgeX: nudgeX,\n nudgeY: nudgeY,\n keepWithinBounds: true\n });\n this.callPostProcessPopup(params.type, params.ePopup, null, params.mouseEvent, params.column, params.rowNode);\n };\n PopupService.prototype.calculatePointerAlign = function (e) {\n var parentRect = this.getParentRect();\n return {\n x: e.clientX - parentRect.left,\n y: e.clientY - parentRect.top\n };\n };\n PopupService.prototype.positionPopupUnderComponent = function (params) {\n var sourceRect = params.eventSource.getBoundingClientRect();\n var alignSide = params.alignSide || 'left';\n var parentRect = this.getParentRect();\n var x = sourceRect.left - parentRect.left;\n if (alignSide === 'right') {\n x -= (params.ePopup.offsetWidth - sourceRect.width);\n }\n this.positionPopup({\n ePopup: params.ePopup,\n minWidth: params.minWidth,\n minHeight: params.minHeight,\n nudgeX: params.nudgeX,\n nudgeY: params.nudgeY,\n x: x,\n y: sourceRect.top - parentRect.top + sourceRect.height,\n keepWithinBounds: params.keepWithinBounds\n });\n this.callPostProcessPopup(params.type, params.ePopup, params.eventSource, null, params.column, params.rowNode);\n };\n PopupService.prototype.positionPopupOverComponent = function (params) {\n var sourceRect = params.eventSource.getBoundingClientRect();\n var parentRect = this.getParentRect();\n this.positionPopup({\n ePopup: params.ePopup,\n minWidth: params.minWidth,\n nudgeX: params.nudgeX,\n nudgeY: params.nudgeY,\n x: sourceRect.left - parentRect.left,\n y: sourceRect.top - parentRect.top,\n keepWithinBounds: params.keepWithinBounds\n });\n this.callPostProcessPopup(params.type, params.ePopup, params.eventSource, null, params.column, params.rowNode);\n };\n PopupService.prototype.callPostProcessPopup = function (type, ePopup, eventSource, mouseEvent, column, rowNode) {\n var callback = this.gridOptionsWrapper.getPostProcessPopupFunc();\n if (callback) {\n var params = {\n column: column,\n rowNode: rowNode,\n ePopup: ePopup,\n type: type,\n eventSource: eventSource,\n mouseEvent: mouseEvent\n };\n callback(params);\n }\n };\n PopupService.prototype.positionPopup = function (params) {\n var x = params.x;\n var y = params.y;\n if (params.nudgeX) {\n x += params.nudgeX;\n }\n if (params.nudgeY) {\n y += params.nudgeY;\n }\n // if popup is overflowing to the bottom, move it up\n if (params.keepWithinBounds) {\n x = this.keepXWithinBounds(params, x);\n y = this.keepYWithinBounds(params, y);\n }\n params.ePopup.style.left = x + \"px\";\n params.ePopup.style.top = y + \"px\";\n };\n PopupService.prototype.getActivePopups = function () {\n return this.popupList.map(function (popup) { return popup.element; });\n };\n PopupService.prototype.getParentRect = function () {\n // subtract the popup parent borders, because popupParent.getBoundingClientRect\n // returns the rect outside the borders, but the 0,0 coordinate for absolute\n // positioning is inside the border, leading the popup to be off by the width\n // of the border\n var popupParent = this.getPopupParent();\n var eDocument = this.gridOptionsWrapper.getDocument();\n if (popupParent === eDocument.body) {\n popupParent = eDocument.documentElement;\n }\n var style = getComputedStyle(popupParent);\n var bounds = popupParent.getBoundingClientRect();\n return {\n top: bounds.top + parseFloat(style.borderTopWidth) || 0,\n left: bounds.left + parseFloat(style.borderLeftWidth) || 0,\n right: bounds.right + parseFloat(style.borderRightWidth) || 0,\n bottom: bounds.bottom + parseFloat(style.borderBottomWidth) || 0,\n };\n };\n PopupService.prototype.keepYWithinBounds = function (params, y) {\n var eDocument = this.gridOptionsWrapper.getDocument();\n var docElement = eDocument.documentElement;\n var popupParent = this.getPopupParent();\n var parentRect = popupParent.getBoundingClientRect();\n var documentRect = eDocument.documentElement.getBoundingClientRect();\n var isBody = popupParent === eDocument.body;\n var minHeight = Math.min(200, parentRect.height);\n var diff = 0;\n if (params.minHeight && params.minHeight < minHeight) {\n minHeight = params.minHeight;\n }\n else if (params.ePopup.offsetHeight > 0) {\n minHeight = params.ePopup.clientHeight;\n diff = getAbsoluteHeight(params.ePopup) - minHeight;\n }\n var heightOfParent = isBody ? (getAbsoluteHeight(docElement) + docElement.scrollTop) : parentRect.height;\n if (isBody) {\n heightOfParent -= Math.abs(documentRect.top - parentRect.top);\n }\n var maxY = heightOfParent - minHeight - diff;\n return Math.min(Math.max(y, 0), Math.abs(maxY));\n };\n PopupService.prototype.keepXWithinBounds = function (params, x) {\n var eDocument = this.gridOptionsWrapper.getDocument();\n var docElement = eDocument.documentElement;\n var popupParent = this.getPopupParent();\n var parentRect = popupParent.getBoundingClientRect();\n var documentRect = eDocument.documentElement.getBoundingClientRect();\n var isBody = popupParent === eDocument.body;\n var ePopup = params.ePopup;\n var minWidth = Math.min(200, parentRect.width);\n var diff = 0;\n if (params.minWidth && params.minWidth < minWidth) {\n minWidth = params.minWidth;\n }\n else if (ePopup.offsetWidth > 0) {\n minWidth = ePopup.offsetWidth;\n ePopup.style.minWidth = minWidth + \"px\";\n diff = getAbsoluteWidth(ePopup) - minWidth;\n }\n var widthOfParent = isBody ? (getAbsoluteWidth(docElement) + docElement.scrollLeft) : parentRect.width;\n if (isBody) {\n widthOfParent -= Math.abs(documentRect.left - parentRect.left);\n }\n var maxX = widthOfParent - minWidth - diff;\n return Math.min(Math.max(x, 0), Math.abs(maxX));\n };\n PopupService.prototype.keepPopupPositionedRelativeTo = function (params) {\n var eParent = this.getPopupParent();\n var parentRect = eParent.getBoundingClientRect();\n var sourceRect = params.element.getBoundingClientRect();\n var initialDiffTop = parentRect.top - sourceRect.top;\n var initialDiffLeft = parentRect.left - sourceRect.left;\n var lastDiffTop = initialDiffTop;\n var lastDiffLeft = initialDiffLeft;\n var topPx = params.ePopup.style.top;\n var top = parseInt(topPx.substring(0, topPx.length - 1), 10);\n var leftPx = params.ePopup.style.left;\n var left = parseInt(leftPx.substring(0, leftPx.length - 1), 10);\n var intervalId = window.setInterval(function () {\n var pRect = eParent.getBoundingClientRect();\n var sRect = params.element.getBoundingClientRect();\n var elementNotInDom = sRect.top == 0 && sRect.left == 0 && sRect.height == 0 && sRect.width == 0;\n if (elementNotInDom) {\n params.hidePopup();\n return;\n }\n var currentDiffTop = pRect.top - sRect.top;\n if (currentDiffTop != lastDiffTop) {\n var newTop = top + initialDiffTop - currentDiffTop;\n params.ePopup.style.top = newTop + \"px\";\n }\n lastDiffTop = currentDiffTop;\n var currentDiffLeft = pRect.left - sRect.left;\n if (currentDiffLeft != lastDiffLeft) {\n var newLeft = left + initialDiffLeft - currentDiffLeft;\n params.ePopup.style.left = newLeft + \"px\";\n }\n lastDiffLeft = currentDiffLeft;\n }, 200);\n var res = function () {\n if (intervalId != null) {\n window.clearInterval(intervalId);\n }\n intervalId = undefined;\n };\n return res;\n };\n PopupService.prototype.addPopup = function (params) {\n var _this = this;\n var modal = params.modal, eChild = params.eChild, closeOnEsc = params.closeOnEsc, closedCallback = params.closedCallback, click = params.click, alwaysOnTop = params.alwaysOnTop, afterGuiAttached = params.afterGuiAttached, positionCallback = params.positionCallback, anchorToElement = params.anchorToElement;\n var eDocument = this.gridOptionsWrapper.getDocument();\n if (!eDocument) {\n console.warn('ag-grid: could not find the document, document is empty');\n return;\n }\n var pos = findIndex(this.popupList, function (popup) { return popup.element === eChild; });\n if (pos !== -1) {\n var popup = this.popupList[pos];\n return { hideFunc: popup.hideFunc, stopAnchoringFunc: popup.stopAnchoringFunc };\n }\n var ePopupParent = this.getPopupParent();\n // for angular specifically, but shouldn't cause an issue with js or other fw's\n // https://github.com/angular/angular/issues/8563\n ePopupParent.appendChild(eChild);\n if (eChild.style.top == null) {\n eChild.style.top = '0px';\n }\n if (eChild.style.left == null) {\n eChild.style.left = '0px';\n }\n // add env CSS class to child, in case user provided a popup parent, which means\n // theme class may be missing\n var eWrapper = document.createElement('div');\n var theme = this.environment.getTheme().theme;\n if (theme) {\n addCssClass(eWrapper, theme);\n }\n addCssClass(eWrapper, 'ag-popup');\n addCssClass(eChild, this.gridOptionsWrapper.isEnableRtl() ? 'ag-rtl' : 'ag-ltr');\n addCssClass(eChild, 'ag-popup-child');\n if (this.focusController.isKeyboardMode()) {\n addCssClass(eChild, FocusController.AG_KEYBOARD_FOCUS);\n }\n eWrapper.appendChild(eChild);\n ePopupParent.appendChild(eWrapper);\n if (alwaysOnTop) {\n this.setAlwaysOnTop(eWrapper, true);\n }\n else {\n this.bringPopupToFront(eWrapper);\n }\n var popupHidden = false;\n var hidePopupOnKeyboardEvent = function (event) {\n if (!eWrapper.contains(document.activeElement)) {\n return;\n }\n var key = event.which || event.keyCode;\n if (key === KeyCode.ESCAPE) {\n hidePopup({ keyboardEvent: event });\n }\n };\n var hidePopupOnMouseEvent = function (event) { return hidePopup({ mouseEvent: event }); };\n var hidePopupOnTouchEvent = function (event) { return hidePopup({ touchEvent: event }); };\n var destroyPositionTracker;\n var hidePopup = function (popupParams) {\n if (popupParams === void 0) { popupParams = {}; }\n var mouseEvent = popupParams.mouseEvent, touchEvent = popupParams.touchEvent, keyboardEvent = popupParams.keyboardEvent;\n if (\n // we don't hide popup if the event was on the child, or any\n // children of this child\n _this.isEventFromCurrentPopup({ mouseEvent: mouseEvent, touchEvent: touchEvent }, eChild) ||\n // if the event to close is actually the open event, then ignore it\n _this.isEventSameChainAsOriginalEvent({ originalMouseEvent: click, mouseEvent: mouseEvent, touchEvent: touchEvent }) ||\n // this method should only be called once. the client can have different\n // paths, each one wanting to close, so this method may be called multiple times.\n popupHidden) {\n return;\n }\n popupHidden = true;\n ePopupParent.removeChild(eWrapper);\n eDocument.removeEventListener('keydown', hidePopupOnKeyboardEvent);\n eDocument.removeEventListener('mousedown', hidePopupOnMouseEvent);\n eDocument.removeEventListener('touchstart', hidePopupOnTouchEvent);\n eDocument.removeEventListener('contextmenu', hidePopupOnMouseEvent);\n _this.eventService.removeEventListener(Events.EVENT_DRAG_STARTED, hidePopupOnMouseEvent);\n if (closedCallback) {\n closedCallback(mouseEvent || touchEvent || keyboardEvent);\n }\n _this.popupList = _this.popupList.filter(function (popup) { return popup.element !== eChild; });\n if (destroyPositionTracker) {\n destroyPositionTracker();\n }\n };\n if (afterGuiAttached) {\n afterGuiAttached({ hidePopup: hidePopup });\n }\n // if we add these listeners now, then the current mouse\n // click will be included, which we don't want\n window.setTimeout(function () {\n if (closeOnEsc) {\n eDocument.addEventListener('keydown', hidePopupOnKeyboardEvent);\n }\n if (modal) {\n eDocument.addEventListener('mousedown', hidePopupOnMouseEvent);\n _this.eventService.addEventListener(Events.EVENT_DRAG_STARTED, hidePopupOnMouseEvent);\n eDocument.addEventListener('touchstart', hidePopupOnTouchEvent);\n eDocument.addEventListener('contextmenu', hidePopupOnMouseEvent);\n }\n }, 0);\n if (positionCallback) {\n positionCallback();\n }\n if (anchorToElement) {\n // keeps popup positioned under created, eg if context menu, if user scrolls\n // using touchpad and the cell moves, it moves the popup to keep it with the cell.\n destroyPositionTracker = this.keepPopupPositionedRelativeTo({\n element: anchorToElement,\n ePopup: eChild,\n hidePopup: hidePopup\n });\n }\n this.popupList.push({\n element: eChild,\n hideFunc: hidePopup,\n stopAnchoringFunc: destroyPositionTracker\n });\n return {\n hideFunc: hidePopup,\n stopAnchoringFunc: destroyPositionTracker\n };\n };\n PopupService.prototype.isEventFromCurrentPopup = function (params, target) {\n var mouseEvent = params.mouseEvent, touchEvent = params.touchEvent;\n var event = mouseEvent ? mouseEvent : touchEvent;\n if (!event) {\n return false;\n }\n var indexOfThisChild = findIndex(this.popupList, function (popup) { return popup.element === target; });\n if (indexOfThisChild === -1) {\n return false;\n }\n for (var i = indexOfThisChild; i < this.popupList.length; i++) {\n var popup = this.popupList[i];\n if (isElementInEventPath(popup.element, event)) {\n return true;\n }\n }\n // if the user did not write their own Custom Element to be rendered as popup\n // and this component has an additional popup element, they should have the\n // `ag-custom-component-popup` class to be detected as part of the Custom Component\n return this.isElementWithinCustomPopup(event.target);\n };\n PopupService.prototype.isElementWithinCustomPopup = function (el) {\n if (!this.popupList.length) {\n return false;\n }\n while (el && el !== document.body) {\n if (el.classList.contains('ag-custom-component-popup') || el.parentElement === null) {\n return true;\n }\n el = el.parentElement;\n }\n return false;\n };\n // in some browsers, the context menu event can be fired before the click event, which means\n // the context menu event could open the popup, but then the click event closes it straight away.\n PopupService.prototype.isEventSameChainAsOriginalEvent = function (params) {\n var originalMouseEvent = params.originalMouseEvent, mouseEvent = params.mouseEvent, touchEvent = params.touchEvent;\n // we check the coordinates of the event, to see if it's the same event. there is a 1 / 1000 chance that\n // the event is a different event, however that is an edge case that is not very relevant (the user clicking\n // twice on the same location isn't a normal path).\n // event could be mouse event or touch event.\n var mouseEventOrTouch = null;\n if (mouseEvent) {\n // mouse event can be used direction, it has coordinates\n mouseEventOrTouch = mouseEvent;\n }\n else if (touchEvent) {\n // touch event doesn't have coordinates, need it's touch object\n mouseEventOrTouch = touchEvent.touches[0];\n }\n if (mouseEventOrTouch && originalMouseEvent) {\n // for x, allow 4px margin, to cover iPads, where touch (which opens menu) is followed\n // by browser click (when you finger up, touch is interrupted as click in browser)\n var screenX_1 = mouseEvent ? mouseEvent.screenX : 0;\n var screenY_1 = mouseEvent ? mouseEvent.screenY : 0;\n var xMatch = Math.abs(originalMouseEvent.screenX - screenX_1) < 5;\n var yMatch = Math.abs(originalMouseEvent.screenY - screenY_1) < 5;\n if (xMatch && yMatch) {\n return true;\n }\n }\n return false;\n };\n PopupService.prototype.getWrapper = function (ePopup) {\n while (!containsClass(ePopup, 'ag-popup') && ePopup.parentElement) {\n ePopup = ePopup.parentElement;\n }\n return containsClass(ePopup, 'ag-popup') ? ePopup : null;\n };\n PopupService.prototype.setAlwaysOnTop = function (ePopup, alwaysOnTop) {\n var eWrapper = this.getWrapper(ePopup);\n if (!eWrapper) {\n return;\n }\n addOrRemoveCssClass(eWrapper, 'ag-always-on-top', !!alwaysOnTop);\n if (alwaysOnTop) {\n this.bringPopupToFront(eWrapper);\n }\n };\n PopupService.prototype.bringPopupToFront = function (ePopup) {\n var parent = this.getPopupParent();\n var popupList = Array.prototype.slice.call(parent.querySelectorAll('.ag-popup'));\n var popupLen = popupList.length;\n var alwaysOnTopList = Array.prototype.slice.call(parent.querySelectorAll('.ag-popup.ag-always-on-top'));\n var onTopLength = alwaysOnTopList.length;\n var eWrapper = this.getWrapper(ePopup);\n if (!eWrapper || popupLen <= 1 || !parent.contains(ePopup)) {\n return;\n }\n var pos = popupList.indexOf(eWrapper);\n if (onTopLength) {\n var isPopupAlwaysOnTop = containsClass(eWrapper, 'ag-always-on-top');\n if (isPopupAlwaysOnTop) {\n if (pos !== popupLen - 1) {\n last(alwaysOnTopList).insertAdjacentElement('afterend', eWrapper);\n }\n }\n else if (pos !== popupLen - onTopLength - 1) {\n alwaysOnTopList[0].insertAdjacentElement('beforebegin', eWrapper);\n }\n }\n else if (pos !== popupLen - 1) {\n last(popupList).insertAdjacentElement('afterend', eWrapper);\n }\n var params = {\n type: 'popupToFront',\n api: this.gridOptionsWrapper.getApi(),\n columnApi: this.gridOptionsWrapper.getColumnApi(),\n eWrapper: eWrapper\n };\n this.eventService.dispatchEvent(params);\n };\n __decorate$10([\n Autowired('environment')\n ], PopupService.prototype, \"environment\", void 0);\n __decorate$10([\n Autowired('focusController')\n ], PopupService.prototype, \"focusController\", void 0);\n PopupService = __decorate$10([\n Bean('popupService')\n ], PopupService);\n return PopupService;\n}(BeanStub));\n\n/**\n * @ag-grid-community/core - Advanced Data Grid / Data Table supporting Javascript / React / AngularJS / Web Components\n * @version v25.1.0\n * @link http://www.ag-grid.com/\n * @license MIT\n */\nvar __extends$16 = (undefined && undefined.__extends) || (function () {\n var extendStatics = function (d, b) {\n extendStatics = Object.setPrototypeOf ||\n ({ __proto__: [] } instanceof Array && function (d, b) { d.__proto__ = b; }) ||\n function (d, b) { for (var p in b) if (b.hasOwnProperty(p)) d[p] = b[p]; };\n return extendStatics(d, b);\n };\n return function (d, b) {\n extendStatics(d, b);\n function __() { this.constructor = d; }\n d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __());\n };\n})();\nvar __decorate$11 = (undefined && undefined.__decorate) || function (decorators, target, key, desc) {\n var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d;\n if (typeof Reflect === \"object\" && typeof Reflect.decorate === \"function\") r = Reflect.decorate(decorators, target, key, desc);\n else for (var i = decorators.length - 1; i >= 0; i--) if (d = decorators[i]) r = (c < 3 ? d(r) : c > 3 ? d(target, key, r) : d(target, key)) || r;\n return c > 3 && r && Object.defineProperty(target, key, r), r;\n};\nvar __param$7 = (undefined && undefined.__param) || function (paramIndex, decorator) {\n return function (target, key) { decorator(target, key, paramIndex); }\n};\nvar LoggerFactory = /** @class */ (function (_super) {\n __extends$16(LoggerFactory, _super);\n function LoggerFactory() {\n return _super !== null && _super.apply(this, arguments) || this;\n }\n LoggerFactory.prototype.setBeans = function (gridOptionsWrapper) {\n this.logging = gridOptionsWrapper.isDebug();\n };\n LoggerFactory.prototype.create = function (name) {\n return new Logger(name, this.isLogging.bind(this));\n };\n LoggerFactory.prototype.isLogging = function () {\n return this.logging;\n };\n __decorate$11([\n __param$7(0, Qualifier('gridOptionsWrapper'))\n ], LoggerFactory.prototype, \"setBeans\", null);\n LoggerFactory = __decorate$11([\n Bean('loggerFactory')\n ], LoggerFactory);\n return LoggerFactory;\n}(BeanStub));\nvar Logger = /** @class */ (function () {\n function Logger(name, isLoggingFunc) {\n this.name = name;\n this.isLoggingFunc = isLoggingFunc;\n }\n Logger.prototype.isLogging = function () {\n return this.isLoggingFunc();\n };\n Logger.prototype.log = function (message) {\n if (this.isLoggingFunc()) {\n // tslint:disable-next-line\n console.log('AG Grid.' + this.name + ': ' + message);\n }\n };\n return Logger;\n}());\n\n/**\n * @ag-grid-community/core - Advanced Data Grid / Data Table supporting Javascript / React / AngularJS / Web Components\n * @version v25.1.0\n * @link http://www.ag-grid.com/\n * @license MIT\n */\nvar __extends$17 = (undefined && undefined.__extends) || (function () {\n var extendStatics = function (d, b) {\n extendStatics = Object.setPrototypeOf ||\n ({ __proto__: [] } instanceof Array && function (d, b) { d.__proto__ = b; }) ||\n function (d, b) { for (var p in b) if (b.hasOwnProperty(p)) d[p] = b[p]; };\n return extendStatics(d, b);\n };\n return function (d, b) {\n extendStatics(d, b);\n function __() { this.constructor = d; }\n d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __());\n };\n})();\nvar __decorate$12 = (undefined && undefined.__decorate) || function (decorators, target, key, desc) {\n var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d;\n if (typeof Reflect === \"object\" && typeof Reflect.decorate === \"function\") r = Reflect.decorate(decorators, target, key, desc);\n else for (var i = decorators.length - 1; i >= 0; i--) if (d = decorators[i]) r = (c < 3 ? d(r) : c > 3 ? d(target, key, r) : d(target, key)) || r;\n return c > 3 && r && Object.defineProperty(target, key, r), r;\n};\nvar AutoWidthCalculator = /** @class */ (function (_super) {\n __extends$17(AutoWidthCalculator, _super);\n function AutoWidthCalculator() {\n return _super !== null && _super.apply(this, arguments) || this;\n }\n AutoWidthCalculator.prototype.registerGridComp = function (gridPanel) {\n this.gridPanel = gridPanel;\n };\n AutoWidthCalculator.prototype.registerHeaderRootComp = function (headerRootComp) {\n this.headerRootComp = headerRootComp;\n };\n // this is the trick: we create a dummy container and clone all the cells\n // into the dummy, then check the dummy's width. then destroy the dummy\n // as we don't need it any more.\n // drawback: only the cells visible on the screen are considered\n AutoWidthCalculator.prototype.getPreferredWidthForColumn = function (column, skipHeader) {\n var eHeaderCell = this.getHeaderCellForColumn(column);\n // cell isn't visible\n if (!eHeaderCell) {\n return -1;\n }\n var eDummyContainer = document.createElement('span');\n // position fixed, so it isn't restricted to the boundaries of the parent\n eDummyContainer.style.position = 'fixed';\n // we put the dummy into the body container, so it will inherit all the\n // css styles that the real cells are inheriting\n var eBodyContainer = this.gridPanel.getCenterContainer();\n eBodyContainer.appendChild(eDummyContainer);\n // get all the cells that are currently displayed (this only brings back\n // rendered cells, rows not rendered due to row visualisation will not be here)\n this.putRowCellsIntoDummyContainer(column, eDummyContainer);\n if (!skipHeader) {\n // we only consider the lowest level cell, not the group cell. in 99% of the time, this\n // will be enough. if we consider groups, then it gets too complicated for what it's worth,\n // as the groups can span columns and this class only considers one column at a time.\n this.cloneItemIntoDummy(eHeaderCell, eDummyContainer);\n }\n // at this point, all the clones are lined up vertically with natural widths. the dummy\n // container will have a width wide enough just to fit the largest.\n var dummyContainerWidth = eDummyContainer.offsetWidth;\n // we are finished with the dummy container, so get rid of it\n eBodyContainer.removeChild(eDummyContainer);\n // we add padding as I found sometimes the gui still put '...' after some of the texts. so the\n // user can configure the grid to add a few more pixels after the calculated width\n var autoSizePadding = this.gridOptionsWrapper.getAutoSizePadding();\n return dummyContainerWidth + autoSizePadding;\n };\n AutoWidthCalculator.prototype.getHeaderCellForColumn = function (column) {\n var comp = null;\n // find the rendered header cell\n this.headerRootComp.forEachHeaderElement(function (headerElement) {\n if (headerElement instanceof HeaderWrapperComp) {\n var headerWrapperComp = headerElement;\n if (headerWrapperComp.getColumn() === column) {\n comp = headerWrapperComp;\n }\n }\n });\n return comp ? comp.getGui() : null;\n };\n AutoWidthCalculator.prototype.putRowCellsIntoDummyContainer = function (column, eDummyContainer) {\n var _this = this;\n var eCells = this.rowRenderer.getAllCellsForColumn(column);\n eCells.forEach(function (eCell) { return _this.cloneItemIntoDummy(eCell, eDummyContainer); });\n };\n AutoWidthCalculator.prototype.cloneItemIntoDummy = function (eCell, eDummyContainer) {\n // make a deep clone of the cell\n var eCellClone = eCell.cloneNode(true);\n // the original has a fixed width, we remove this to allow the natural width based on content\n eCellClone.style.width = '';\n // the original has position = absolute, we need to remove this so it's positioned normally\n eCellClone.style.position = 'static';\n eCellClone.style.left = '';\n // we put the cell into a containing div, as otherwise the cells would just line up\n // on the same line, standard flow layout, by putting them into divs, they are laid\n // out one per line\n var eCloneParent = document.createElement('div');\n if (containsClass(eCellClone, 'ag-header-cell')) {\n addCssClass(eCloneParent, 'ag-header');\n addCssClass(eCloneParent, 'ag-header-row');\n eCloneParent.style.position = 'static';\n }\n else {\n addCssClass(eCloneParent, 'ag-row');\n }\n // table-row, so that each cell is on a row. i also tried display='block', but this\n // didn't work in IE\n eCloneParent.style.display = 'table-row';\n // the twig on the branch, the branch on the tree, the tree in the hole,\n // the hole in the bog, the bog in the clone, the clone in the parent,\n // the parent in the dummy, and the dummy down in the vall-e-ooo, OOOOOOOOO! Oh row the rattling bog....\n eCloneParent.appendChild(eCellClone);\n eDummyContainer.appendChild(eCloneParent);\n };\n __decorate$12([\n Autowired('rowRenderer')\n ], AutoWidthCalculator.prototype, \"rowRenderer\", void 0);\n AutoWidthCalculator = __decorate$12([\n Bean('autoWidthCalculator')\n ], AutoWidthCalculator);\n return AutoWidthCalculator;\n}(BeanStub));\n\n/**\n * @ag-grid-community/core - Advanced Data Grid / Data Table supporting Javascript / React / AngularJS / Web Components\n * @version v25.1.0\n * @link http://www.ag-grid.com/\n * @license MIT\n */\nvar __extends$18 = (undefined && undefined.__extends) || (function () {\n var extendStatics = function (d, b) {\n extendStatics = Object.setPrototypeOf ||\n ({ __proto__: [] } instanceof Array && function (d, b) { d.__proto__ = b; }) ||\n function (d, b) { for (var p in b) if (b.hasOwnProperty(p)) d[p] = b[p]; };\n return extendStatics(d, b);\n };\n return function (d, b) {\n extendStatics(d, b);\n function __() { this.constructor = d; }\n d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __());\n };\n})();\nvar __decorate$13 = (undefined && undefined.__decorate) || function (decorators, target, key, desc) {\n var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d;\n if (typeof Reflect === \"object\" && typeof Reflect.decorate === \"function\") r = Reflect.decorate(decorators, target, key, desc);\n else for (var i = decorators.length - 1; i >= 0; i--) if (d = decorators[i]) r = (c < 3 ? d(r) : c > 3 ? d(target, key, r) : d(target, key)) || r;\n return c > 3 && r && Object.defineProperty(target, key, r), r;\n};\nvar HorizontalResizeService = /** @class */ (function (_super) {\n __extends$18(HorizontalResizeService, _super);\n function HorizontalResizeService() {\n return _super !== null && _super.apply(this, arguments) || this;\n }\n HorizontalResizeService.prototype.addResizeBar = function (params) {\n var _this = this;\n var dragSource = {\n dragStartPixels: params.dragStartPixels || 0,\n eElement: params.eResizeBar,\n onDragStart: this.onDragStart.bind(this, params),\n onDragStop: this.onDragStop.bind(this, params),\n onDragging: this.onDragging.bind(this, params)\n };\n this.dragService.addDragSource(dragSource, true);\n // we pass remove func back to the caller, so call can tell us when they\n // are finished, and then we remove the listener from the drag source\n var finishedWithResizeFunc = function () { return _this.dragService.removeDragSource(dragSource); };\n return finishedWithResizeFunc;\n };\n HorizontalResizeService.prototype.onDragStart = function (params, mouseEvent) {\n this.dragStartX = mouseEvent.clientX;\n this.setResizeIcons();\n var shiftKey = mouseEvent instanceof MouseEvent && mouseEvent.shiftKey === true;\n params.onResizeStart(shiftKey);\n };\n HorizontalResizeService.prototype.setResizeIcons = function () {\n this.oldBodyCursor = this.eGridDiv.style.cursor;\n this.oldUserSelect = this.eGridDiv.style.userSelect;\n this.oldWebkitUserSelect = this.eGridDiv.style.webkitUserSelect;\n // change the body cursor, so when drag moves out of the drag bar, the cursor is still 'resize' (or 'move'\n this.eGridDiv.style.cursor = 'ew-resize';\n // we don't want text selection outside the grid (otherwise it looks weird as text highlights when we move)\n this.eGridDiv.style.userSelect = 'none';\n this.eGridDiv.style.webkitUserSelect = 'none';\n };\n HorizontalResizeService.prototype.onDragStop = function (params, mouseEvent) {\n params.onResizeEnd(this.resizeAmount);\n this.resetIcons();\n };\n HorizontalResizeService.prototype.resetIcons = function () {\n // we don't want text selection outside the grid (otherwise it looks weird as text highlights when we move)\n this.eGridDiv.style.cursor = this.oldBodyCursor;\n this.eGridDiv.style.userSelect = this.oldUserSelect;\n this.eGridDiv.style.webkitUserSelect = this.oldWebkitUserSelect;\n };\n HorizontalResizeService.prototype.onDragging = function (params, mouseEvent) {\n this.resizeAmount = mouseEvent.clientX - this.dragStartX;\n params.onResizing(this.resizeAmount);\n };\n __decorate$13([\n Autowired('dragService')\n ], HorizontalResizeService.prototype, \"dragService\", void 0);\n __decorate$13([\n Autowired('eGridDiv')\n ], HorizontalResizeService.prototype, \"eGridDiv\", void 0);\n HorizontalResizeService = __decorate$13([\n Bean('horizontalResizeService')\n ], HorizontalResizeService);\n return HorizontalResizeService;\n}(BeanStub));\n\n/**\n * @ag-grid-community/core - Advanced Data Grid / Data Table supporting Javascript / React / AngularJS / Web Components\n * @version v25.1.0\n * @link http://www.ag-grid.com/\n * @license MIT\n */\nvar __extends$19 = (undefined && undefined.__extends) || (function () {\n var extendStatics = function (d, b) {\n extendStatics = Object.setPrototypeOf ||\n ({ __proto__: [] } instanceof Array && function (d, b) { d.__proto__ = b; }) ||\n function (d, b) { for (var p in b) if (b.hasOwnProperty(p)) d[p] = b[p]; };\n return extendStatics(d, b);\n };\n return function (d, b) {\n extendStatics(d, b);\n function __() { this.constructor = d; }\n d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __());\n };\n})();\nvar __decorate$14 = (undefined && undefined.__decorate) || function (decorators, target, key, desc) {\n var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d;\n if (typeof Reflect === \"object\" && typeof Reflect.decorate === \"function\") r = Reflect.decorate(decorators, target, key, desc);\n else for (var i = decorators.length - 1; i >= 0; i--) if (d = decorators[i]) r = (c < 3 ? d(r) : c > 3 ? d(target, key, r) : d(target, key)) || r;\n return c > 3 && r && Object.defineProperty(target, key, r), r;\n};\nvar GridCore = /** @class */ (function (_super) {\n __extends$19(GridCore, _super);\n function GridCore() {\n return _super.call(this, undefined, true) || this;\n }\n GridCore.prototype.postConstruct = function () {\n var _this = this;\n this.logger = this.loggerFactory.create('GridCore');\n var template = this.createTemplate();\n this.setTemplate(template);\n // register with services that need grid core\n [\n this.gridApi,\n this.rowRenderer,\n this.popupService,\n this.focusController\n ].forEach(function (service) { return service.registerGridCore(_this); });\n if (ModuleRegistry.isRegistered(exports.ModuleNames.ClipboardModule)) {\n this.clipboardService.registerGridCore(this);\n }\n this.gridOptionsWrapper.addLayoutElement(this.getGui());\n this.eGridDiv.appendChild(this.getGui());\n this.addDestroyFunc(function () {\n _this.eGridDiv.removeChild(_this.getGui());\n });\n // if using angular, watch for quickFilter changes\n if (this.$scope) {\n var quickFilterUnregisterFn = this.$scope.$watch(this.quickFilterOnScope, function (newFilter) { return _this.filterManager.setQuickFilter(newFilter); });\n this.addDestroyFunc(quickFilterUnregisterFn);\n }\n // important to set rtl before doLayout, as setting the RTL class impacts the scroll position,\n // which doLayout indirectly depends on\n this.addRtlSupport();\n this.logger.log('ready');\n this.gridOptionsWrapper.addLayoutElement(this.eRootWrapperBody);\n var unsubscribeFromResize = this.resizeObserverService.observeResize(this.eGridDiv, this.onGridSizeChanged.bind(this));\n this.addDestroyFunc(function () { return unsubscribeFromResize(); });\n var eGui = this.getGui();\n this.addManagedListener(this, Events.EVENT_KEYBOARD_FOCUS, function () {\n addCssClass(eGui, FocusController.AG_KEYBOARD_FOCUS);\n });\n this.addManagedListener(this, Events.EVENT_MOUSE_FOCUS, function () {\n removeCssClass(eGui, FocusController.AG_KEYBOARD_FOCUS);\n });\n _super.prototype.postConstruct.call(this);\n };\n GridCore.prototype.getFocusableElement = function () {\n return this.eRootWrapperBody;\n };\n GridCore.prototype.createTemplate = function () {\n var sideBarModuleLoaded = ModuleRegistry.isRegistered(exports.ModuleNames.SideBarModule);\n var statusBarModuleLoaded = ModuleRegistry.isRegistered(exports.ModuleNames.StatusBarModule);\n var rowGroupingLoaded = ModuleRegistry.isRegistered(exports.ModuleNames.RowGroupingModule);\n var enterpriseCoreLoaded = ModuleRegistry.isRegistered(exports.ModuleNames.EnterpriseCoreModule);\n var dropZones = rowGroupingLoaded ? '' : '';\n var sideBar = sideBarModuleLoaded ? '' : '';\n var statusBar = statusBarModuleLoaded ? '' : '';\n var watermark = enterpriseCoreLoaded ? '' : '';\n var template = /* html */ \"
\\n \" + dropZones + \"\\n
\\n \\n \" + sideBar + \"\\n
\\n \" + statusBar + \"\\n \\n \" + watermark + \"\\n
\";\n return template;\n };\n GridCore.prototype.getFocusableContainers = function () {\n var focusableContainers = [\n this.gridPanel.getGui()\n ];\n if (this.sideBarComp) {\n focusableContainers.push(this.sideBarComp.getGui());\n }\n return focusableContainers.filter(function (el) { return isVisible(el); });\n };\n GridCore.prototype.focusNextInnerContainer = function (backwards) {\n var focusableContainers = this.getFocusableContainers();\n var idxWithFocus = findIndex(focusableContainers, function (container) { return container.contains(document.activeElement); });\n var nextIdx = idxWithFocus + (backwards ? -1 : 1);\n if (nextIdx < 0 || nextIdx >= focusableContainers.length) {\n return false;\n }\n if (nextIdx === 0) {\n return this.focusGridHeader();\n }\n return this.focusController.focusInto(focusableContainers[nextIdx]);\n };\n GridCore.prototype.focusInnerElement = function (fromBottom) {\n var focusableContainers = this.getFocusableContainers();\n if (fromBottom) {\n if (focusableContainers.length > 1) {\n return this.focusController.focusInto(last(focusableContainers));\n }\n var lastColumn = last(this.columnController.getAllDisplayedColumns());\n if (this.focusController.focusGridView(lastColumn, true)) {\n return true;\n }\n }\n return this.focusGridHeader();\n };\n GridCore.prototype.focusGridHeader = function () {\n var firstColumn = this.columnController.getAllDisplayedColumns()[0];\n if (!firstColumn) {\n return false;\n }\n if (firstColumn.getParent()) {\n firstColumn = this.columnController.getColumnGroupAtLevel(firstColumn, 0);\n }\n this.focusController.focusHeaderPosition({ headerRowIndex: 0, column: firstColumn });\n return true;\n };\n GridCore.prototype.onGridSizeChanged = function () {\n var event = {\n type: Events.EVENT_GRID_SIZE_CHANGED,\n api: this.gridApi,\n columnApi: this.columnApi,\n clientWidth: this.eGridDiv.clientWidth,\n clientHeight: this.eGridDiv.clientHeight\n };\n this.eventService.dispatchEvent(event);\n };\n GridCore.prototype.addRtlSupport = function () {\n var cssClass = this.gridOptionsWrapper.isEnableRtl() ? 'ag-rtl' : 'ag-ltr';\n addCssClass(this.getGui(), cssClass);\n };\n GridCore.prototype.getRootGui = function () {\n return this.getGui();\n };\n GridCore.prototype.isSideBarVisible = function () {\n if (!this.sideBarComp) {\n return false;\n }\n return this.sideBarComp.isDisplayed();\n };\n GridCore.prototype.setSideBarVisible = function (show) {\n if (!this.sideBarComp) {\n if (show) {\n console.warn('AG Grid: sideBar is not loaded');\n }\n return;\n }\n this.sideBarComp.setDisplayed(show);\n };\n GridCore.prototype.setSideBarPosition = function (position) {\n if (!this.sideBarComp) {\n console.warn('AG Grid: sideBar is not loaded');\n return;\n }\n this.sideBarComp.setSideBarPosition(position);\n };\n GridCore.prototype.closeToolPanel = function () {\n if (!this.sideBarComp) {\n console.warn('AG Grid: toolPanel is only available in AG Grid Enterprise');\n return;\n }\n this.sideBarComp.close();\n };\n GridCore.prototype.getSideBar = function () {\n return this.gridOptions.sideBar;\n };\n GridCore.prototype.getToolPanelInstance = function (key) {\n if (!this.sideBarComp) {\n console.warn('AG Grid: toolPanel is only available in AG Grid Enterprise');\n return;\n }\n return this.sideBarComp.getToolPanelInstance(key);\n };\n GridCore.prototype.refreshSideBar = function () {\n if (this.sideBarComp) {\n this.sideBarComp.refresh();\n }\n };\n GridCore.prototype.setSideBar = function (def) {\n if (!this.sideBarComp) {\n return;\n }\n this.eRootWrapperBody.removeChild(this.sideBarComp.getGui());\n this.gridOptions.sideBar = SideBarDefParser.parse(def);\n this.sideBarComp.reset();\n this.eRootWrapperBody.appendChild(this.sideBarComp.getGui());\n };\n GridCore.prototype.getOpenedToolPanel = function () {\n if (!this.sideBarComp) {\n return null;\n }\n return this.sideBarComp.openedItem();\n };\n GridCore.prototype.openToolPanel = function (key) {\n if (!this.sideBarComp) {\n console.warn('AG Grid: toolPanel is only available in AG Grid Enterprise');\n return;\n }\n this.sideBarComp.openToolPanel(key);\n };\n GridCore.prototype.isToolPanelShowing = function () {\n return this.sideBarComp.isToolPanelShowing();\n };\n GridCore.prototype.destroy = function () {\n this.logger.log('Grid DOM removed');\n _super.prototype.destroy.call(this);\n };\n // Valid values for position are bottom, middle and top\n GridCore.prototype.ensureNodeVisible = function (comparator, position) {\n if (position === void 0) { position = null; }\n if (this.doingVirtualPaging) {\n throw new Error('Cannot use ensureNodeVisible when doing virtual paging, as we cannot check rows that are not in memory');\n }\n // look for the node index we want to display\n var rowCount = this.rowModel.getRowCount();\n var comparatorIsAFunction = typeof comparator === 'function';\n var indexToSelect = -1;\n // go through all the nodes, find the one we want to show\n for (var i = 0; i < rowCount; i++) {\n var node = this.rowModel.getRow(i);\n if (comparatorIsAFunction) {\n if (comparator(node)) {\n indexToSelect = i;\n break;\n }\n }\n else {\n // check object equality against node and data\n if (comparator === node || comparator === node.data) {\n indexToSelect = i;\n break;\n }\n }\n }\n if (indexToSelect >= 0) {\n this.gridPanel.ensureIndexVisible(indexToSelect, position);\n }\n };\n GridCore.prototype.onTabKeyDown = function () { };\n __decorate$14([\n Autowired('gridOptions')\n ], GridCore.prototype, \"gridOptions\", void 0);\n __decorate$14([\n Autowired('rowModel')\n ], GridCore.prototype, \"rowModel\", void 0);\n __decorate$14([\n Autowired('resizeObserverService')\n ], GridCore.prototype, \"resizeObserverService\", void 0);\n __decorate$14([\n Autowired('rowRenderer')\n ], GridCore.prototype, \"rowRenderer\", void 0);\n __decorate$14([\n Autowired('filterManager')\n ], GridCore.prototype, \"filterManager\", void 0);\n __decorate$14([\n Autowired('eGridDiv')\n ], GridCore.prototype, \"eGridDiv\", void 0);\n __decorate$14([\n Autowired('$scope')\n ], GridCore.prototype, \"$scope\", void 0);\n __decorate$14([\n Autowired('quickFilterOnScope')\n ], GridCore.prototype, \"quickFilterOnScope\", void 0);\n __decorate$14([\n Autowired('popupService')\n ], GridCore.prototype, \"popupService\", void 0);\n __decorate$14([\n Autowired('columnController')\n ], GridCore.prototype, \"columnController\", void 0);\n __decorate$14([\n Autowired('loggerFactory')\n ], GridCore.prototype, \"loggerFactory\", void 0);\n __decorate$14([\n Autowired('columnApi')\n ], GridCore.prototype, \"columnApi\", void 0);\n __decorate$14([\n Autowired('gridApi')\n ], GridCore.prototype, \"gridApi\", void 0);\n __decorate$14([\n Optional('clipboardService')\n ], GridCore.prototype, \"clipboardService\", void 0);\n __decorate$14([\n RefSelector('gridPanel')\n ], GridCore.prototype, \"gridPanel\", void 0);\n __decorate$14([\n RefSelector('sideBar')\n ], GridCore.prototype, \"sideBarComp\", void 0);\n __decorate$14([\n RefSelector('rootWrapperBody')\n ], GridCore.prototype, \"eRootWrapperBody\", void 0);\n return GridCore;\n}(ManagedFocusComponent));\n\n/**\n * @ag-grid-community/core - Advanced Data Grid / Data Table supporting Javascript / React / AngularJS / Web Components\n * @version v25.1.0\n * @link http://www.ag-grid.com/\n * @license MIT\n */\nvar __extends$1a = (undefined && undefined.__extends) || (function () {\n var extendStatics = function (d, b) {\n extendStatics = Object.setPrototypeOf ||\n ({ __proto__: [] } instanceof Array && function (d, b) { d.__proto__ = b; }) ||\n function (d, b) { for (var p in b) if (b.hasOwnProperty(p)) d[p] = b[p]; };\n return extendStatics(d, b);\n };\n return function (d, b) {\n extendStatics(d, b);\n function __() { this.constructor = d; }\n d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __());\n };\n})();\nvar __decorate$15 = (undefined && undefined.__decorate) || function (decorators, target, key, desc) {\n var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d;\n if (typeof Reflect === \"object\" && typeof Reflect.decorate === \"function\") r = Reflect.decorate(decorators, target, key, desc);\n else for (var i = decorators.length - 1; i >= 0; i--) if (d = decorators[i]) r = (c < 3 ? d(r) : c > 3 ? d(target, key, r) : d(target, key)) || r;\n return c > 3 && r && Object.defineProperty(target, key, r), r;\n};\nvar StandardMenuFactory = /** @class */ (function (_super) {\n __extends$1a(StandardMenuFactory, _super);\n function StandardMenuFactory() {\n return _super !== null && _super.apply(this, arguments) || this;\n }\n StandardMenuFactory.prototype.registerGridComp = function (gridPanel) {\n this.gridPanel = gridPanel;\n };\n StandardMenuFactory.prototype.hideActiveMenu = function () {\n if (this.hidePopup) {\n this.hidePopup();\n }\n };\n StandardMenuFactory.prototype.showMenuAfterMouseEvent = function (column, mouseEvent) {\n var _this = this;\n this.showPopup(column, function (eMenu) {\n _this.popupService.positionPopupUnderMouseEvent({\n column: column,\n type: 'columnMenu',\n mouseEvent: mouseEvent,\n ePopup: eMenu\n });\n }, mouseEvent.target);\n };\n StandardMenuFactory.prototype.showMenuAfterButtonClick = function (column, eventSource) {\n var _this = this;\n this.showPopup(column, function (eMenu) {\n _this.popupService.positionPopupUnderComponent({\n type: 'columnMenu',\n eventSource: eventSource,\n ePopup: eMenu,\n keepWithinBounds: true,\n column: column\n });\n }, eventSource);\n };\n StandardMenuFactory.prototype.showPopup = function (column, positionCallback, eventSource) {\n var _this = this;\n var filterWrapper = this.filterManager.getOrCreateFilterWrapper(column, 'COLUMN_MENU');\n var eMenu = document.createElement('div');\n eMenu.setAttribute('role', 'presentation');\n addCssClass(eMenu, 'ag-menu');\n this.tabListener = this.addManagedListener(eMenu, 'keydown', function (e) { return _this.trapFocusWithin(e, eMenu); });\n filterWrapper.guiPromise.then(function (gui) { return eMenu.appendChild(gui); });\n var hidePopup;\n var anchorToElement = eventSource || this.gridPanel.getGui();\n var closedCallback = function (e) {\n column.setMenuVisible(false, 'contextMenu');\n var isKeyboardEvent = e instanceof KeyboardEvent;\n if (_this.tabListener) {\n _this.tabListener = _this.tabListener();\n }\n if (isKeyboardEvent && eventSource && isVisible(eventSource)) {\n var focusableEl = _this.focusController.findTabbableParent(eventSource);\n if (focusableEl) {\n focusableEl.focus();\n }\n }\n };\n var addPopupRes = this.popupService.addPopup({\n modal: true,\n eChild: eMenu,\n closeOnEsc: true,\n closedCallback: closedCallback,\n positionCallback: function () { return positionCallback(eMenu); },\n anchorToElement: anchorToElement\n });\n if (addPopupRes) {\n this.hidePopup = hidePopup = addPopupRes.hideFunc;\n }\n filterWrapper.filterPromise.then(function (filter) {\n // need to make sure the filter is present before positioning, as only\n // after filter it is visible can we find out what the width of it is\n positionCallback(eMenu);\n if (filter.afterGuiAttached) {\n filter.afterGuiAttached({ container: 'columnMenu', hidePopup: hidePopup });\n }\n });\n column.setMenuVisible(true, 'contextMenu');\n };\n StandardMenuFactory.prototype.trapFocusWithin = function (e, menu) {\n if (e.keyCode !== KeyCode.TAB ||\n e.defaultPrevented ||\n this.focusController.findNextFocusableElement(menu, false, e.shiftKey)) {\n return;\n }\n e.preventDefault();\n this.focusController.focusInto(menu, e.shiftKey);\n };\n StandardMenuFactory.prototype.isMenuEnabled = function (column) {\n // for standard, we show menu if filter is enabled, and the menu is not suppressed\n return column.isFilterAllowed();\n };\n __decorate$15([\n Autowired('filterManager')\n ], StandardMenuFactory.prototype, \"filterManager\", void 0);\n __decorate$15([\n Autowired('popupService')\n ], StandardMenuFactory.prototype, \"popupService\", void 0);\n __decorate$15([\n Autowired('focusController')\n ], StandardMenuFactory.prototype, \"focusController\", void 0);\n StandardMenuFactory = __decorate$15([\n Bean('menuFactory')\n ], StandardMenuFactory);\n return StandardMenuFactory;\n}(BeanStub));\n\n/**\n * @ag-grid-community/core - Advanced Data Grid / Data Table supporting Javascript / React / AngularJS / Web Components\n * @version v25.1.0\n * @link http://www.ag-grid.com/\n * @license MIT\n */\nvar __extends$1b = (undefined && undefined.__extends) || (function () {\n var extendStatics = function (d, b) {\n extendStatics = Object.setPrototypeOf ||\n ({ __proto__: [] } instanceof Array && function (d, b) { d.__proto__ = b; }) ||\n function (d, b) { for (var p in b) if (b.hasOwnProperty(p)) d[p] = b[p]; };\n return extendStatics(d, b);\n };\n return function (d, b) {\n extendStatics(d, b);\n function __() { this.constructor = d; }\n d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __());\n };\n})();\nvar __decorate$16 = (undefined && undefined.__decorate) || function (decorators, target, key, desc) {\n var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d;\n if (typeof Reflect === \"object\" && typeof Reflect.decorate === \"function\") r = Reflect.decorate(decorators, target, key, desc);\n else for (var i = decorators.length - 1; i >= 0; i--) if (d = decorators[i]) r = (c < 3 ? d(r) : c > 3 ? d(target, key, r) : d(target, key)) || r;\n return c > 3 && r && Object.defineProperty(target, key, r), r;\n};\n/** Adds drag listening onto an element. In AG Grid this is used twice, first is resizing columns,\n * second is moving the columns and column groups around (ie the 'drag' part of Drag and Drop. */\nvar DragService = /** @class */ (function (_super) {\n __extends$1b(DragService, _super);\n function DragService() {\n var _this = _super !== null && _super.apply(this, arguments) || this;\n _this.dragEndFunctions = [];\n _this.dragSources = [];\n return _this;\n }\n DragService.prototype.init = function () {\n this.logger = this.loggerFactory.create('DragService');\n };\n DragService.prototype.removeAllListeners = function () {\n this.dragSources.forEach(this.removeListener.bind(this));\n this.dragSources.length = 0;\n };\n DragService.prototype.removeListener = function (dragSourceAndListener) {\n var element = dragSourceAndListener.dragSource.eElement;\n var mouseDownListener = dragSourceAndListener.mouseDownListener;\n element.removeEventListener('mousedown', mouseDownListener);\n // remove touch listener only if it exists\n if (dragSourceAndListener.touchEnabled) {\n var touchStartListener = dragSourceAndListener.touchStartListener;\n element.removeEventListener('touchstart', touchStartListener, { passive: true });\n }\n };\n DragService.prototype.removeDragSource = function (params) {\n var dragSourceAndListener = find(this.dragSources, function (item) { return item.dragSource === params; });\n if (!dragSourceAndListener) {\n return;\n }\n this.removeListener(dragSourceAndListener);\n removeFromArray(this.dragSources, dragSourceAndListener);\n };\n DragService.prototype.setNoSelectToBody = function (noSelect) {\n var eDocument = this.gridOptionsWrapper.getDocument();\n var eBody = eDocument.querySelector('body');\n if (exists(eBody)) {\n // when we drag the mouse in AG Grid, this class gets added / removed from the body, so that\n // the mouse isn't selecting text when dragging.\n addOrRemoveCssClass(eBody, 'ag-unselectable', noSelect);\n }\n };\n DragService.prototype.isDragging = function () {\n return this.dragging;\n };\n DragService.prototype.addDragSource = function (params, includeTouch) {\n if (includeTouch === void 0) { includeTouch = false; }\n var mouseListener = this.onMouseDown.bind(this, params);\n params.eElement.addEventListener('mousedown', mouseListener);\n var touchListener = null;\n var suppressTouch = this.gridOptionsWrapper.isSuppressTouch();\n if (includeTouch && !suppressTouch) {\n touchListener = this.onTouchStart.bind(this, params);\n params.eElement.addEventListener('touchstart', touchListener, { passive: true });\n }\n this.dragSources.push({\n dragSource: params,\n mouseDownListener: mouseListener,\n touchStartListener: touchListener,\n touchEnabled: includeTouch\n });\n };\n // gets called whenever mouse down on any drag source\n DragService.prototype.onTouchStart = function (params, touchEvent) {\n var _this = this;\n this.currentDragParams = params;\n this.dragging = false;\n var touch = touchEvent.touches[0];\n this.touchLastTime = touch;\n this.touchStart = touch;\n var touchMoveEvent = function (e) { return _this.onTouchMove(e, params.eElement); };\n var touchEndEvent = function (e) { return _this.onTouchUp(e, params.eElement); };\n var documentTouchMove = function (e) { if (e.cancelable) {\n e.preventDefault();\n } };\n var target = params.eElement;\n var events = [\n // Prevents the page document from moving while we are dragging items around.\n // preventDefault needs to be called in the touchmove listener and never inside the\n // touchstart, because using touchstart causes the click event to be cancelled on touch devices.\n { target: document, type: 'touchmove', listener: documentTouchMove, options: { passive: false } },\n { target: target, type: 'touchmove', listener: touchMoveEvent, options: { passive: true } },\n { target: target, type: 'touchend', listener: touchEndEvent, options: { passive: true } },\n { target: target, type: 'touchcancel', listener: touchEndEvent, options: { passive: true } }\n ];\n // temporally add these listeners, for the duration of the drag\n this.addTemporaryEvents(events);\n // see if we want to start dragging straight away\n if (params.dragStartPixels === 0) {\n this.onCommonMove(touch, this.touchStart, params.eElement);\n }\n };\n // gets called whenever mouse down on any drag source\n DragService.prototype.onMouseDown = function (params, mouseEvent) {\n var _this = this;\n var e = mouseEvent;\n if (params.skipMouseEvent && params.skipMouseEvent(mouseEvent)) {\n return;\n }\n // if there are two elements with parent / child relationship, and both are draggable,\n // when we drag the child, we should NOT drag the parent. an example of this is row moving\n // and range selection - row moving should get preference when use drags the rowDrag component.\n if (e._alreadyProcessedByDragService) {\n return;\n }\n e._alreadyProcessedByDragService = true;\n // only interested in left button clicks\n if (mouseEvent.button !== 0) {\n return;\n }\n this.currentDragParams = params;\n this.dragging = false;\n this.mouseStartEvent = mouseEvent;\n var eDocument = this.gridOptionsWrapper.getDocument();\n this.setNoSelectToBody(true);\n var mouseMoveEvent = function (event) { return _this.onMouseMove(event, params.eElement); };\n var mouseUpEvent = function (event) { return _this.onMouseUp(event, params.eElement); };\n var contextEvent = function (event) { return event.preventDefault(); };\n var target = eDocument;\n var events = [\n { target: target, type: 'mousemove', listener: mouseMoveEvent },\n { target: target, type: 'mouseup', listener: mouseUpEvent },\n { target: target, type: 'contextmenu', listener: contextEvent }\n ];\n // temporally add these listeners, for the duration of the drag\n this.addTemporaryEvents(events);\n //see if we want to start dragging straight away\n if (params.dragStartPixels === 0) {\n this.onMouseMove(mouseEvent, params.eElement);\n }\n };\n DragService.prototype.addTemporaryEvents = function (events) {\n events.forEach(function (currentEvent) {\n var target = currentEvent.target, type = currentEvent.type, listener = currentEvent.listener, options = currentEvent.options;\n target.addEventListener(type, listener, options);\n });\n this.dragEndFunctions.push(function () {\n events.forEach(function (currentEvent) {\n var target = currentEvent.target, type = currentEvent.type, listener = currentEvent.listener, options = currentEvent.options;\n target.removeEventListener(type, listener, options);\n });\n });\n };\n // returns true if the event is close to the original event by X pixels either vertically or horizontally.\n // we only start dragging after X pixels so this allows us to know if we should start dragging yet.\n DragService.prototype.isEventNearStartEvent = function (currentEvent, startEvent) {\n // by default, we wait 4 pixels before starting the drag\n var dragStartPixels = this.currentDragParams.dragStartPixels;\n var requiredPixelDiff = exists(dragStartPixels) ? dragStartPixels : 4;\n return areEventsNear(currentEvent, startEvent, requiredPixelDiff);\n };\n DragService.prototype.getFirstActiveTouch = function (touchList) {\n for (var i = 0; i < touchList.length; i++) {\n if (touchList[i].identifier === this.touchStart.identifier) {\n return touchList[i];\n }\n }\n return null;\n };\n DragService.prototype.onCommonMove = function (currentEvent, startEvent, el) {\n if (!this.dragging) {\n // if mouse hasn't travelled from the start position enough, do nothing\n if (!this.dragging && this.isEventNearStartEvent(currentEvent, startEvent)) {\n return;\n }\n this.dragging = true;\n var event_1 = {\n type: Events.EVENT_DRAG_STARTED,\n api: this.gridApi,\n columnApi: this.columnApi,\n target: el\n };\n this.eventService.dispatchEvent(event_1);\n this.currentDragParams.onDragStart(startEvent);\n // we need ONE drag action at the startEvent, so that we are guaranteed the drop target\n // at the start gets notified. this is because the drag can start outside of the element\n // that started it, as the mouse is allowed drag away from the mouse down before it's\n // considered a drag (the isEventNearStartEvent() above). if we didn't do this, then\n // it would be possible to click a column by the edge, then drag outside of the drop zone\n // in less than 4 pixels and the drag officially starts outside of the header but the header\n // wouldn't be notified of the dragging.\n this.currentDragParams.onDragging(startEvent);\n }\n this.currentDragParams.onDragging(currentEvent);\n };\n DragService.prototype.onTouchMove = function (touchEvent, el) {\n var touch = this.getFirstActiveTouch(touchEvent.touches);\n if (!touch) {\n return;\n }\n // this.___statusPanel.setInfoText(Math.random() + ' onTouchMove preventDefault stopPropagation');\n this.onCommonMove(touch, this.touchStart, el);\n };\n // only gets called after a mouse down - as this is only added after mouseDown\n // and is removed when mouseUp happens\n DragService.prototype.onMouseMove = function (mouseEvent, el) {\n this.onCommonMove(mouseEvent, this.mouseStartEvent, el);\n };\n DragService.prototype.onTouchUp = function (touchEvent, el) {\n var touch = this.getFirstActiveTouch(touchEvent.changedTouches);\n // i haven't worked this out yet, but there is no matching touch\n // when we get the touch up event. to get around this, we swap in\n // the last touch. this is a hack to 'get it working' while we\n // figure out what's going on, why we are not getting a touch in\n // current event.\n if (!touch) {\n touch = this.touchLastTime;\n }\n // if mouse was left up before we started to move, then this is a tap.\n // we check this before onUpCommon as onUpCommon resets the dragging\n // let tap = !this.dragging;\n // let tapTarget = this.currentDragParams.eElement;\n this.onUpCommon(touch, el);\n // if tap, tell user\n // console.log(`${Math.random()} tap = ${tap}`);\n // if (tap) {\n // tapTarget.click();\n // }\n };\n DragService.prototype.onMouseUp = function (mouseEvent, el) {\n this.onUpCommon(mouseEvent, el);\n };\n DragService.prototype.onUpCommon = function (eventOrTouch, el) {\n if (this.dragging) {\n this.dragging = false;\n this.currentDragParams.onDragStop(eventOrTouch);\n var event_2 = {\n type: Events.EVENT_DRAG_STOPPED,\n api: this.gridApi,\n columnApi: this.columnApi,\n target: el\n };\n this.eventService.dispatchEvent(event_2);\n }\n this.setNoSelectToBody(false);\n this.mouseStartEvent = null;\n this.touchStart = null;\n this.touchLastTime = null;\n this.currentDragParams = null;\n this.dragEndFunctions.forEach(function (func) { return func(); });\n this.dragEndFunctions.length = 0;\n };\n __decorate$16([\n Autowired('loggerFactory')\n ], DragService.prototype, \"loggerFactory\", void 0);\n __decorate$16([\n Autowired('columnApi')\n ], DragService.prototype, \"columnApi\", void 0);\n __decorate$16([\n Autowired('gridApi')\n ], DragService.prototype, \"gridApi\", void 0);\n __decorate$16([\n PostConstruct\n ], DragService.prototype, \"init\", null);\n __decorate$16([\n PreDestroy\n ], DragService.prototype, \"removeAllListeners\", null);\n DragService = __decorate$16([\n Bean('dragService')\n ], DragService);\n return DragService;\n}(BeanStub));\n\n/**\n * @ag-grid-community/core - Advanced Data Grid / Data Table supporting Javascript / React / AngularJS / Web Components\n * @version v25.1.0\n * @link http://www.ag-grid.com/\n * @license MIT\n */\nvar __extends$1c = (undefined && undefined.__extends) || (function () {\n var extendStatics = function (d, b) {\n extendStatics = Object.setPrototypeOf ||\n ({ __proto__: [] } instanceof Array && function (d, b) { d.__proto__ = b; }) ||\n function (d, b) { for (var p in b) if (b.hasOwnProperty(p)) d[p] = b[p]; };\n return extendStatics(d, b);\n };\n return function (d, b) {\n extendStatics(d, b);\n function __() { this.constructor = d; }\n d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __());\n };\n})();\nvar __decorate$17 = (undefined && undefined.__decorate) || function (decorators, target, key, desc) {\n var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d;\n if (typeof Reflect === \"object\" && typeof Reflect.decorate === \"function\") r = Reflect.decorate(decorators, target, key, desc);\n else for (var i = decorators.length - 1; i >= 0; i--) if (d = decorators[i]) r = (c < 3 ? d(r) : c > 3 ? d(target, key, r) : d(target, key)) || r;\n return c > 3 && r && Object.defineProperty(target, key, r), r;\n};\nvar SortController = /** @class */ (function (_super) {\n __extends$1c(SortController, _super);\n function SortController() {\n return _super !== null && _super.apply(this, arguments) || this;\n }\n SortController_1 = SortController;\n SortController.prototype.progressSort = function (column, multiSort, source) {\n if (source === void 0) { source = \"api\"; }\n var nextDirection = this.getNextSortDirection(column);\n this.setSortForColumn(column, nextDirection, multiSort, source);\n };\n SortController.prototype.setSortForColumn = function (column, sort, multiSort, source) {\n if (source === void 0) { source = \"api\"; }\n // auto correct - if sort not legal value, then set it to 'no sort' (which is null)\n if (sort !== Constants.SORT_ASC && sort !== Constants.SORT_DESC) {\n sort = null;\n }\n // update sort on current col\n column.setSort(sort, source);\n var doingMultiSort = multiSort && !this.gridOptionsWrapper.isSuppressMultiSort();\n // clear sort on all columns except this one, and update the icons\n if (!doingMultiSort) {\n this.clearSortBarThisColumn(column, source);\n }\n // sortIndex used for knowing order of cols when multi-col sort\n this.updateSortIndex(column);\n this.dispatchSortChangedEvents();\n };\n SortController.prototype.updateSortIndex = function (lastColToChange) {\n // update sortIndex on all sorting cols\n var allSortedCols = this.getColumnsWithSortingOrdered();\n var sortIndex = 0;\n allSortedCols.forEach(function (col) {\n if (col !== lastColToChange) {\n col.setSortIndex(sortIndex);\n sortIndex++;\n }\n });\n // last col to change always gets the last sort index, it's added to the end\n if (lastColToChange.getSort()) {\n lastColToChange.setSortIndex(sortIndex);\n }\n // clear sort index on all cols not sorting\n var allCols = this.columnController.getPrimaryAndSecondaryAndAutoColumns();\n allCols.filter(function (col) { return col.getSort() == null; }).forEach(function (col) { return col.setSortIndex(); });\n };\n // gets called by API, so if data changes, use can call this, which will end up\n // working out the sort order again of the rows.\n SortController.prototype.onSortChanged = function () {\n this.dispatchSortChangedEvents();\n };\n SortController.prototype.isSortActive = function () {\n // pull out all the columns that have sorting set\n var allCols = this.columnController.getPrimaryAndSecondaryAndAutoColumns();\n var sortedCols = allCols.filter(function (column) { return !!column.getSort(); });\n return sortedCols && sortedCols.length > 0;\n };\n SortController.prototype.dispatchSortChangedEvents = function () {\n var event = {\n type: Events.EVENT_SORT_CHANGED,\n api: this.gridApi,\n columnApi: this.columnApi\n };\n this.eventService.dispatchEvent(event);\n };\n SortController.prototype.clearSortBarThisColumn = function (columnToSkip, source) {\n this.columnController.getPrimaryAndSecondaryAndAutoColumns().forEach(function (columnToClear) {\n // Do not clear if either holding shift, or if column in question was clicked\n if (columnToClear !== columnToSkip) {\n // setting to 'undefined' as null means 'none' rather than cleared, otherwise issue will arise\n // if sort order is: ['desc', null , 'asc'], as it will start at null rather than 'desc'.\n columnToClear.setSort(undefined, source);\n }\n });\n };\n SortController.prototype.getNextSortDirection = function (column) {\n var sortingOrder;\n if (column.getColDef().sortingOrder) {\n sortingOrder = column.getColDef().sortingOrder;\n }\n else if (this.gridOptionsWrapper.getSortingOrder()) {\n sortingOrder = this.gridOptionsWrapper.getSortingOrder();\n }\n else {\n sortingOrder = SortController_1.DEFAULT_SORTING_ORDER;\n }\n if (!Array.isArray(sortingOrder) || sortingOrder.length <= 0) {\n console.warn(\"ag-grid: sortingOrder must be an array with at least one element, currently it's \" + sortingOrder);\n return null;\n }\n var currentIndex = sortingOrder.indexOf(column.getSort());\n var notInArray = currentIndex < 0;\n var lastItemInArray = currentIndex == sortingOrder.length - 1;\n var result;\n if (notInArray || lastItemInArray) {\n result = sortingOrder[0];\n }\n else {\n result = sortingOrder[currentIndex + 1];\n }\n // verify the sort type exists, as the user could provide the sortingOrder, need to make sure it's valid\n if (SortController_1.DEFAULT_SORTING_ORDER.indexOf(result) < 0) {\n console.warn('ag-grid: invalid sort type ' + result);\n return null;\n }\n return result;\n };\n SortController.prototype.getColumnsWithSortingOrdered = function () {\n // pull out all the columns that have sorting set\n var allColumnsIncludingAuto = this.columnController.getPrimaryAndSecondaryAndAutoColumns();\n var columnsWithSorting = allColumnsIncludingAuto.filter(function (column) { return !!column.getSort(); });\n // when both cols are missing sortIndex, we use the position of the col in all cols list.\n // this means if colDefs only have sort, but no sortIndex, we deterministically pick which\n // cols is sorted by first.\n var allColsIndexes = {};\n allColumnsIncludingAuto.forEach(function (col, index) { return allColsIndexes[col.getId()] = index; });\n // put the columns in order of which one got sorted first\n columnsWithSorting.sort(function (a, b) {\n var iA = a.getSortIndex();\n var iB = b.getSortIndex();\n if (iA != null && iB != null) {\n return iA - iB; // both present, normal comparison\n }\n else if (iA == null && iB == null) {\n // both missing, compare using column positions\n var posA = allColsIndexes[a.getId()];\n var posB = allColsIndexes[b.getId()];\n return posA > posB ? 1 : -1;\n }\n else if (iB == null) {\n return -1; // iB missing\n }\n else {\n return 1; // iA missing\n }\n });\n return columnsWithSorting;\n };\n // used by server side row models, to sent sort to server\n SortController.prototype.getSortModel = function () {\n return this.getColumnsWithSortingOrdered().map(function (column) { return ({\n sort: column.getSort(),\n colId: column.getId()\n }); });\n };\n SortController.prototype.getSortOptions = function () {\n return this.getColumnsWithSortingOrdered().map(function (column) { return ({\n sort: column.getSort(),\n column: column\n }); });\n };\n var SortController_1;\n SortController.DEFAULT_SORTING_ORDER = [Constants.SORT_ASC, Constants.SORT_DESC, null];\n __decorate$17([\n Autowired('columnController')\n ], SortController.prototype, \"columnController\", void 0);\n __decorate$17([\n Autowired('columnApi')\n ], SortController.prototype, \"columnApi\", void 0);\n __decorate$17([\n Autowired('gridApi')\n ], SortController.prototype, \"gridApi\", void 0);\n SortController = SortController_1 = __decorate$17([\n Bean('sortController')\n ], SortController);\n return SortController;\n}(BeanStub));\n\n/**\n * @ag-grid-community/core - Advanced Data Grid / Data Table supporting Javascript / React / AngularJS / Web Components\n * @version v25.1.0\n * @link http://www.ag-grid.com/\n * @license MIT\n */\nvar __extends$1d = (undefined && undefined.__extends) || (function () {\n var extendStatics = function (d, b) {\n extendStatics = Object.setPrototypeOf ||\n ({ __proto__: [] } instanceof Array && function (d, b) { d.__proto__ = b; }) ||\n function (d, b) { for (var p in b) if (b.hasOwnProperty(p)) d[p] = b[p]; };\n return extendStatics(d, b);\n };\n return function (d, b) {\n extendStatics(d, b);\n function __() { this.constructor = d; }\n d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __());\n };\n})();\nvar __decorate$18 = (undefined && undefined.__decorate) || function (decorators, target, key, desc) {\n var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d;\n if (typeof Reflect === \"object\" && typeof Reflect.decorate === \"function\") r = Reflect.decorate(decorators, target, key, desc);\n else for (var i = decorators.length - 1; i >= 0; i--) if (d = decorators[i]) r = (c < 3 ? d(r) : c > 3 ? d(target, key, r) : d(target, key)) || r;\n return c > 3 && r && Object.defineProperty(target, key, r), r;\n};\nvar MouseEventService = /** @class */ (function (_super) {\n __extends$1d(MouseEventService, _super);\n function MouseEventService() {\n var _this = _super !== null && _super.apply(this, arguments) || this;\n _this.gridInstanceId = MouseEventService_1.gridInstanceSequence.next();\n return _this;\n }\n MouseEventService_1 = MouseEventService;\n MouseEventService.prototype.init = function () {\n this.stampDomElementWithGridInstance();\n };\n MouseEventService.prototype.registerGridComp = function (gridPanel) {\n this.gridPanel = gridPanel;\n };\n // we put the instance id onto the main DOM element. this is used for events, when grids are inside grids,\n // so the grid can work out if the even came from this grid or a grid inside this one. see the ctrl+v logic\n // for where this is used.\n MouseEventService.prototype.stampDomElementWithGridInstance = function () {\n this.eGridDiv[MouseEventService_1.GRID_DOM_KEY] = this.gridInstanceId;\n };\n MouseEventService.prototype.getRenderedCellForEvent = function (event) {\n return getComponentForEvent(this.gridOptionsWrapper, event, 'cellComp');\n };\n // walks the path of the event, and returns true if this grid is the first one that it finds. if doing\n // master / detail grids, and a child grid is found, then it returns false. this stops things like copy/paste\n // getting executed on many grids at the same time.\n MouseEventService.prototype.isEventFromThisGrid = function (event) {\n var path = getEventPath(event);\n for (var i = 0; i < path.length; i++) {\n var element = path[i];\n var instanceId = element[MouseEventService_1.GRID_DOM_KEY];\n if (exists(instanceId)) {\n var eventFromThisGrid = instanceId === this.gridInstanceId;\n return eventFromThisGrid;\n }\n }\n return false;\n };\n MouseEventService.prototype.getCellPositionForEvent = function (event) {\n var cellComp = this.getRenderedCellForEvent(event);\n return cellComp ? cellComp.getCellPosition() : null;\n };\n MouseEventService.prototype.getNormalisedPosition = function (event) {\n var gridPanelHasScrolls = this.gridOptionsWrapper.getDomLayout() === Constants.DOM_LAYOUT_NORMAL;\n var e = event;\n var x;\n var y;\n if (e.clientX != null || e.clientY != null) {\n x = e.clientX;\n y = e.clientY;\n }\n else {\n x = e.x;\n y = e.y;\n }\n if (gridPanelHasScrolls) {\n var vRange = this.gridPanel.getVScrollPosition();\n var hRange = this.gridPanel.getHScrollPosition();\n x += hRange.left;\n y += vRange.top;\n }\n return { x: x, y: y };\n };\n var MouseEventService_1;\n MouseEventService.gridInstanceSequence = new NumberSequence();\n MouseEventService.GRID_DOM_KEY = '__ag_grid_instance';\n __decorate$18([\n Autowired('eGridDiv')\n ], MouseEventService.prototype, \"eGridDiv\", void 0);\n __decorate$18([\n PostConstruct\n ], MouseEventService.prototype, \"init\", null);\n MouseEventService = MouseEventService_1 = __decorate$18([\n Bean('mouseEventService')\n ], MouseEventService);\n return MouseEventService;\n}(BeanStub));\n\n/**\n * @ag-grid-community/core - Advanced Data Grid / Data Table supporting Javascript / React / AngularJS / Web Components\n * @version v25.1.0\n * @link http://www.ag-grid.com/\n * @license MIT\n */\nvar __extends$1e = (undefined && undefined.__extends) || (function () {\n var extendStatics = function (d, b) {\n extendStatics = Object.setPrototypeOf ||\n ({ __proto__: [] } instanceof Array && function (d, b) { d.__proto__ = b; }) ||\n function (d, b) { for (var p in b) if (b.hasOwnProperty(p)) d[p] = b[p]; };\n return extendStatics(d, b);\n };\n return function (d, b) {\n extendStatics(d, b);\n function __() { this.constructor = d; }\n d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __());\n };\n})();\nvar __decorate$19 = (undefined && undefined.__decorate) || function (decorators, target, key, desc) {\n var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d;\n if (typeof Reflect === \"object\" && typeof Reflect.decorate === \"function\") r = Reflect.decorate(decorators, target, key, desc);\n else for (var i = decorators.length - 1; i >= 0; i--) if (d = decorators[i]) r = (c < 3 ? d(r) : c > 3 ? d(target, key, r) : d(target, key)) || r;\n return c > 3 && r && Object.defineProperty(target, key, r), r;\n};\nvar CellNavigationService = /** @class */ (function (_super) {\n __extends$1e(CellNavigationService, _super);\n function CellNavigationService() {\n return _super !== null && _super.apply(this, arguments) || this;\n }\n // returns null if no cell to focus on, ie at the end of the grid\n CellNavigationService.prototype.getNextCellToFocus = function (key, lastCellToFocus) {\n // starting with the provided cell, we keep moving until we find a cell we can\n // focus on.\n var pointer = lastCellToFocus;\n var finished = false;\n // finished will be true when either:\n // a) cell found that we can focus on\n // b) run out of cells (ie the method returns null)\n while (!finished) {\n switch (key) {\n case KeyCode.UP:\n pointer = this.getCellAbove(pointer);\n break;\n case KeyCode.DOWN:\n pointer = this.getCellBelow(pointer);\n break;\n case KeyCode.RIGHT:\n if (this.gridOptionsWrapper.isEnableRtl()) {\n pointer = this.getCellToLeft(pointer);\n }\n else {\n pointer = this.getCellToRight(pointer);\n }\n break;\n case KeyCode.LEFT:\n if (this.gridOptionsWrapper.isEnableRtl()) {\n pointer = this.getCellToRight(pointer);\n }\n else {\n pointer = this.getCellToLeft(pointer);\n }\n break;\n default:\n pointer = null;\n console.warn('AG Grid: unknown key for navigation ' + key);\n break;\n }\n if (pointer) {\n finished = this.isCellGoodToFocusOn(pointer);\n }\n else {\n finished = true;\n }\n }\n return pointer;\n };\n CellNavigationService.prototype.isCellGoodToFocusOn = function (gridCell) {\n var column = gridCell.column;\n var rowNode;\n switch (gridCell.rowPinned) {\n case Constants.PINNED_TOP:\n rowNode = this.pinnedRowModel.getPinnedTopRow(gridCell.rowIndex);\n break;\n case Constants.PINNED_BOTTOM:\n rowNode = this.pinnedRowModel.getPinnedBottomRow(gridCell.rowIndex);\n break;\n default:\n rowNode = this.rowModel.getRow(gridCell.rowIndex);\n break;\n }\n if (!rowNode) {\n return false;\n }\n var suppressNavigable = column.isSuppressNavigable(rowNode);\n return !suppressNavigable;\n };\n CellNavigationService.prototype.getCellToLeft = function (lastCell) {\n if (!lastCell) {\n return null;\n }\n var colToLeft = this.columnController.getDisplayedColBefore(lastCell.column);\n if (!colToLeft) {\n return null;\n }\n return {\n rowIndex: lastCell.rowIndex,\n column: colToLeft,\n rowPinned: lastCell.rowPinned\n };\n };\n CellNavigationService.prototype.getCellToRight = function (lastCell) {\n if (!lastCell) {\n return null;\n }\n var colToRight = this.columnController.getDisplayedColAfter(lastCell.column);\n // if already on right, do nothing\n if (!colToRight) {\n return null;\n }\n return {\n rowIndex: lastCell.rowIndex,\n column: colToRight,\n rowPinned: lastCell.rowPinned\n };\n };\n CellNavigationService.prototype.getRowBelow = function (rowPosition) {\n // if already on top row, do nothing\n var index = rowPosition.rowIndex;\n var pinned = rowPosition.rowPinned;\n if (this.isLastRowInContainer(rowPosition)) {\n switch (pinned) {\n case Constants.PINNED_BOTTOM:\n // never any rows after pinned bottom\n return null;\n case Constants.PINNED_TOP:\n // if on last row of pinned top, then next row is main body (if rows exist),\n // otherwise it's the pinned bottom\n if (this.rowModel.isRowsToRender()) {\n return { rowIndex: this.paginationProxy.getPageFirstRow(), rowPinned: null };\n }\n if (this.pinnedRowModel.isRowsToRender(Constants.PINNED_BOTTOM)) {\n return { rowIndex: 0, rowPinned: Constants.PINNED_BOTTOM };\n }\n return null;\n default:\n // if in the main body, then try pinned bottom, otherwise return nothing\n if (this.pinnedRowModel.isRowsToRender(Constants.PINNED_BOTTOM)) {\n return { rowIndex: 0, rowPinned: Constants.PINNED_BOTTOM };\n }\n return null;\n }\n }\n return { rowIndex: index + 1, rowPinned: pinned };\n };\n CellNavigationService.prototype.getCellBelow = function (lastCell) {\n if (!lastCell) {\n return null;\n }\n var rowBelow = this.getRowBelow(lastCell);\n if (rowBelow) {\n return {\n rowIndex: rowBelow.rowIndex,\n column: lastCell.column,\n rowPinned: rowBelow.rowPinned\n };\n }\n return null;\n };\n CellNavigationService.prototype.isLastRowInContainer = function (rowPosition) {\n var pinned = rowPosition.rowPinned;\n var index = rowPosition.rowIndex;\n if (pinned === Constants.PINNED_TOP) {\n var lastTopIndex = this.pinnedRowModel.getPinnedTopRowData().length - 1;\n return lastTopIndex <= index;\n }\n if (pinned === Constants.PINNED_BOTTOM) {\n var lastBottomIndex = this.pinnedRowModel.getPinnedBottomRowData().length - 1;\n return lastBottomIndex <= index;\n }\n var lastBodyIndex = this.paginationProxy.getPageLastRow();\n return lastBodyIndex <= index;\n };\n CellNavigationService.prototype.getRowAbove = function (rowPosition) {\n // if already on top row, do nothing\n var index = rowPosition.rowIndex;\n var pinned = rowPosition.rowPinned;\n var isFirstRow = pinned ? index === 0 : index === this.paginationProxy.getPageFirstRow();\n // if already on top row, do nothing\n if (isFirstRow) {\n if (pinned === Constants.PINNED_TOP) {\n return null;\n }\n if (!pinned) {\n if (this.pinnedRowModel.isRowsToRender(Constants.PINNED_TOP)) {\n return this.getLastFloatingTopRow();\n }\n return null;\n }\n // last floating bottom\n if (this.rowModel.isRowsToRender()) {\n return this.getLastBodyCell();\n }\n if (this.pinnedRowModel.isRowsToRender(Constants.PINNED_TOP)) {\n return this.getLastFloatingTopRow();\n }\n return null;\n }\n return { rowIndex: index - 1, rowPinned: pinned };\n };\n CellNavigationService.prototype.getCellAbove = function (lastCell) {\n if (!lastCell) {\n return null;\n }\n var rowAbove = this.getRowAbove({ rowIndex: lastCell.rowIndex, rowPinned: lastCell.rowPinned });\n if (rowAbove) {\n return {\n rowIndex: rowAbove.rowIndex,\n column: lastCell.column,\n rowPinned: rowAbove.rowPinned\n };\n }\n return null;\n };\n CellNavigationService.prototype.getLastBodyCell = function () {\n var lastBodyRow = this.paginationProxy.getPageLastRow();\n return { rowIndex: lastBodyRow, rowPinned: null };\n };\n CellNavigationService.prototype.getLastFloatingTopRow = function () {\n var lastFloatingRow = this.pinnedRowModel.getPinnedTopRowData().length - 1;\n return { rowIndex: lastFloatingRow, rowPinned: Constants.PINNED_TOP };\n };\n CellNavigationService.prototype.getNextTabbedCell = function (gridCell, backwards) {\n if (backwards) {\n return this.getNextTabbedCellBackwards(gridCell);\n }\n return this.getNextTabbedCellForwards(gridCell);\n };\n CellNavigationService.prototype.getNextTabbedCellForwards = function (gridCell) {\n var displayedColumns = this.columnController.getAllDisplayedColumns();\n var newRowIndex = gridCell.rowIndex;\n var newFloating = gridCell.rowPinned;\n // move along to the next cell\n var newColumn = this.columnController.getDisplayedColAfter(gridCell.column);\n // check if end of the row, and if so, go forward a row\n if (!newColumn) {\n newColumn = displayedColumns[0];\n var rowBelow = this.getRowBelow(gridCell);\n if (missing(rowBelow)) {\n return null;\n }\n // If we are tabbing and there is a paging panel present, tabbing should go\n // to the paging panel instead of loading the next page.\n if (!rowBelow.rowPinned && !this.paginationProxy.isRowInPage(rowBelow)) {\n return null;\n }\n newRowIndex = rowBelow ? rowBelow.rowIndex : null;\n newFloating = rowBelow ? rowBelow.rowPinned : null;\n }\n return { rowIndex: newRowIndex, column: newColumn, rowPinned: newFloating };\n };\n CellNavigationService.prototype.getNextTabbedCellBackwards = function (gridCell) {\n var displayedColumns = this.columnController.getAllDisplayedColumns();\n var newRowIndex = gridCell.rowIndex;\n var newFloating = gridCell.rowPinned;\n // move along to the next cell\n var newColumn = this.columnController.getDisplayedColBefore(gridCell.column);\n // check if end of the row, and if so, go forward a row\n if (!newColumn) {\n newColumn = last(displayedColumns);\n var rowAbove = this.getRowAbove({ rowIndex: gridCell.rowIndex, rowPinned: gridCell.rowPinned });\n if (missing(rowAbove)) {\n return null;\n }\n // If we are tabbing and there is a paging panel present, tabbing should go\n // to the paging panel instead of loading the next page.\n if (!rowAbove.rowPinned && !this.paginationProxy.isRowInPage(rowAbove)) {\n return null;\n }\n newRowIndex = rowAbove ? rowAbove.rowIndex : null;\n newFloating = rowAbove ? rowAbove.rowPinned : null;\n }\n return { rowIndex: newRowIndex, column: newColumn, rowPinned: newFloating };\n };\n __decorate$19([\n Autowired('columnController')\n ], CellNavigationService.prototype, \"columnController\", void 0);\n __decorate$19([\n Autowired('rowModel')\n ], CellNavigationService.prototype, \"rowModel\", void 0);\n __decorate$19([\n Autowired('pinnedRowModel')\n ], CellNavigationService.prototype, \"pinnedRowModel\", void 0);\n __decorate$19([\n Autowired('paginationProxy')\n ], CellNavigationService.prototype, \"paginationProxy\", void 0);\n CellNavigationService = __decorate$19([\n Bean('cellNavigationService')\n ], CellNavigationService);\n return CellNavigationService;\n}(BeanStub));\n\n/**\n * @ag-grid-community/core - Advanced Data Grid / Data Table supporting Javascript / React / AngularJS / Web Components\n * @version v25.1.0\n * @link http://www.ag-grid.com/\n * @license MIT\n */\nvar __extends$1f = (undefined && undefined.__extends) || (function () {\n var extendStatics = function (d, b) {\n extendStatics = Object.setPrototypeOf ||\n ({ __proto__: [] } instanceof Array && function (d, b) { d.__proto__ = b; }) ||\n function (d, b) { for (var p in b) if (b.hasOwnProperty(p)) d[p] = b[p]; };\n return extendStatics(d, b);\n };\n return function (d, b) {\n extendStatics(d, b);\n function __() { this.constructor = d; }\n d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __());\n };\n})();\nvar __decorate$1a = (undefined && undefined.__decorate) || function (decorators, target, key, desc) {\n var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d;\n if (typeof Reflect === \"object\" && typeof Reflect.decorate === \"function\") r = Reflect.decorate(decorators, target, key, desc);\n else for (var i = decorators.length - 1; i >= 0; i--) if (d = decorators[i]) r = (c < 3 ? d(r) : c > 3 ? d(target, key, r) : d(target, key)) || r;\n return c > 3 && r && Object.defineProperty(target, key, r), r;\n};\nvar ValueFormatterService = /** @class */ (function (_super) {\n __extends$1f(ValueFormatterService, _super);\n function ValueFormatterService() {\n return _super !== null && _super.apply(this, arguments) || this;\n }\n ValueFormatterService.prototype.formatValue = function (column, node, $scope, value, suppliedFormatter, useFormatterFromColumn) {\n if (useFormatterFromColumn === void 0) { useFormatterFromColumn = true; }\n var result = null;\n var formatter;\n var colDef = column.getColDef();\n if (suppliedFormatter) {\n // use supplied formatter if provided, e.g. set filter items can have their own value formatters\n formatter = suppliedFormatter;\n }\n else if (useFormatterFromColumn) {\n // if row is pinned, give preference to the pinned formatter\n formatter = node && node.rowPinned && colDef.pinnedRowValueFormatter ?\n colDef.pinnedRowValueFormatter : colDef.valueFormatter;\n }\n if (formatter) {\n var params = {\n value: value,\n node: node,\n data: node ? node.data : null,\n colDef: colDef,\n column: column,\n api: this.gridOptionsWrapper.getApi(),\n columnApi: this.gridOptionsWrapper.getColumnApi(),\n context: this.gridOptionsWrapper.getContext()\n };\n // originally we put the angular 1 scope here, but we don't want the scope\n // in the params interface, as other frameworks will see the interface, and\n // angular 1 is not cool any more. so we hack the scope in here (we cannot\n // include it above, as it's not in the interface, so would cause a compile error).\n // in the future, when we stop supporting angular 1, we can take this out.\n params.$scope = $scope;\n result = this.expressionService.evaluate(formatter, params);\n }\n else if (colDef.refData) {\n return colDef.refData[value] || '';\n }\n // if we don't do this, then arrays get displayed as 1,2,3, but we want 1, 2, 3 (i.e. with spaces)\n if (result == null && Array.isArray(value)) {\n result = value.join(', ');\n }\n return result;\n };\n __decorate$1a([\n Autowired('expressionService')\n ], ValueFormatterService.prototype, \"expressionService\", void 0);\n ValueFormatterService = __decorate$1a([\n Bean('valueFormatterService')\n ], ValueFormatterService);\n return ValueFormatterService;\n}(BeanStub));\n\n/**\n * @ag-grid-community/core - Advanced Data Grid / Data Table supporting Javascript / React / AngularJS / Web Components\n * @version v25.1.0\n * @link http://www.ag-grid.com/\n * @license MIT\n */\nvar __extends$1g = (undefined && undefined.__extends) || (function () {\n var extendStatics = function (d, b) {\n extendStatics = Object.setPrototypeOf ||\n ({ __proto__: [] } instanceof Array && function (d, b) { d.__proto__ = b; }) ||\n function (d, b) { for (var p in b) if (b.hasOwnProperty(p)) d[p] = b[p]; };\n return extendStatics(d, b);\n };\n return function (d, b) {\n extendStatics(d, b);\n function __() { this.constructor = d; }\n d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __());\n };\n})();\nvar AgRadioButton = /** @class */ (function (_super) {\n __extends$1g(AgRadioButton, _super);\n function AgRadioButton(config) {\n return _super.call(this, config, 'ag-radio-button', 'radio') || this;\n }\n AgRadioButton.prototype.isSelected = function () {\n return this.eInput.checked;\n };\n AgRadioButton.prototype.toggle = function () {\n // do not allow an active radio button to be deselected\n if (!this.isSelected()) {\n this.setValue(true);\n }\n };\n AgRadioButton.prototype.addInputListeners = function () {\n _super.prototype.addInputListeners.call(this);\n this.addManagedListener(this.eventService, Events.EVENT_CHECKBOX_CHANGED, this.onChange.bind(this));\n };\n /**\n * This ensures that if another radio button in the same named group is selected, we deselect this radio button.\n * By default the browser does this for you, but we are managing classes ourselves in order to ensure input\n * elements are styled correctly in IE11, and the DOM 'changed' event is only fired when a button is selected,\n * not deselected, so we need to use our own event.\n */\n AgRadioButton.prototype.onChange = function (event) {\n if (event.selected &&\n event.name &&\n this.eInput.name &&\n this.eInput.name === event.name &&\n event.id &&\n this.eInput.id !== event.id) {\n this.setValue(false, true);\n }\n };\n return AgRadioButton;\n}(AgCheckbox));\n\n/**\n * @ag-grid-community/core - Advanced Data Grid / Data Table supporting Javascript / React / AngularJS / Web Components\n * @version v25.1.0\n * @link http://www.ag-grid.com/\n * @license MIT\n */\nvar OUTSIDE_ANGULAR_EVENTS = ['mouseover', 'mouseout', 'mouseenter', 'mouseleave'];\n/** The base frameworks, eg React & Angular 2, override this bean with implementations specific to their requirement. */\nvar VanillaFrameworkOverrides = /** @class */ (function () {\n function VanillaFrameworkOverrides() {\n this.isOutsideAngular = function (eventType) { return includes(OUTSIDE_ANGULAR_EVENTS, eventType); };\n }\n // for Vanilla JS, we use simple timeout\n VanillaFrameworkOverrides.prototype.setTimeout = function (action, timeout) {\n window.setTimeout(action, timeout);\n };\n // for Vanilla JS, we just add the event to the element\n VanillaFrameworkOverrides.prototype.addEventListener = function (element, type, listener, useCapture) {\n element.addEventListener(type, listener, useCapture);\n };\n // for Vanilla JS, we just execute the listener\n VanillaFrameworkOverrides.prototype.dispatchEvent = function (eventType, listener) {\n listener();\n };\n return VanillaFrameworkOverrides;\n}());\n\n/**\n * @ag-grid-community/core - Advanced Data Grid / Data Table supporting Javascript / React / AngularJS / Web Components\n * @version v25.1.0\n * @link http://www.ag-grid.com/\n * @license MIT\n */\nvar __extends$1h = (undefined && undefined.__extends) || (function () {\n var extendStatics = function (d, b) {\n extendStatics = Object.setPrototypeOf ||\n ({ __proto__: [] } instanceof Array && function (d, b) { d.__proto__ = b; }) ||\n function (d, b) { for (var p in b) if (b.hasOwnProperty(p)) d[p] = b[p]; };\n return extendStatics(d, b);\n };\n return function (d, b) {\n extendStatics(d, b);\n function __() { this.constructor = d; }\n d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __());\n };\n})();\nvar __decorate$1b = (undefined && undefined.__decorate) || function (decorators, target, key, desc) {\n var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d;\n if (typeof Reflect === \"object\" && typeof Reflect.decorate === \"function\") r = Reflect.decorate(decorators, target, key, desc);\n else for (var i = decorators.length - 1; i >= 0; i--) if (d = decorators[i]) r = (c < 3 ? d(r) : c > 3 ? d(target, key, r) : d(target, key)) || r;\n return c > 3 && r && Object.defineProperty(target, key, r), r;\n};\nvar ScrollVisibleService = /** @class */ (function (_super) {\n __extends$1h(ScrollVisibleService, _super);\n function ScrollVisibleService() {\n return _super !== null && _super.apply(this, arguments) || this;\n }\n ScrollVisibleService.prototype.setScrollsVisible = function (params) {\n var atLeastOneDifferent = this.horizontalScrollShowing !== params.horizontalScrollShowing ||\n this.verticalScrollShowing !== params.verticalScrollShowing;\n if (atLeastOneDifferent) {\n this.horizontalScrollShowing = params.horizontalScrollShowing;\n this.verticalScrollShowing = params.verticalScrollShowing;\n var event_1 = {\n type: Events.EVENT_SCROLL_VISIBILITY_CHANGED,\n api: this.gridApi,\n columnApi: this.columnApi\n };\n this.eventService.dispatchEvent(event_1);\n }\n };\n // used by pagination service - to know page height\n ScrollVisibleService.prototype.isHorizontalScrollShowing = function () {\n return this.horizontalScrollShowing;\n };\n // used by header container\n ScrollVisibleService.prototype.isVerticalScrollShowing = function () {\n return this.verticalScrollShowing;\n };\n __decorate$1b([\n Autowired('columnApi')\n ], ScrollVisibleService.prototype, \"columnApi\", void 0);\n __decorate$1b([\n Autowired('gridApi')\n ], ScrollVisibleService.prototype, \"gridApi\", void 0);\n ScrollVisibleService = __decorate$1b([\n Bean('scrollVisibleService')\n ], ScrollVisibleService);\n return ScrollVisibleService;\n}(BeanStub));\n\n/**\n * @ag-grid-community/core - Advanced Data Grid / Data Table supporting Javascript / React / AngularJS / Web Components\n * @version v25.1.0\n * @link http://www.ag-grid.com/\n * @license MIT\n */\nvar __extends$1i = (undefined && undefined.__extends) || (function () {\n var extendStatics = function (d, b) {\n extendStatics = Object.setPrototypeOf ||\n ({ __proto__: [] } instanceof Array && function (d, b) { d.__proto__ = b; }) ||\n function (d, b) { for (var p in b) if (b.hasOwnProperty(p)) d[p] = b[p]; };\n return extendStatics(d, b);\n };\n return function (d, b) {\n extendStatics(d, b);\n function __() { this.constructor = d; }\n d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __());\n };\n})();\nvar __decorate$1c = (undefined && undefined.__decorate) || function (decorators, target, key, desc) {\n var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d;\n if (typeof Reflect === \"object\" && typeof Reflect.decorate === \"function\") r = Reflect.decorate(decorators, target, key, desc);\n else for (var i = decorators.length - 1; i >= 0; i--) if (d = decorators[i]) r = (c < 3 ? d(r) : c > 3 ? d(target, key, r) : d(target, key)) || r;\n return c > 3 && r && Object.defineProperty(target, key, r), r;\n};\nvar StylingService = /** @class */ (function (_super) {\n __extends$1i(StylingService, _super);\n function StylingService() {\n return _super !== null && _super.apply(this, arguments) || this;\n }\n StylingService.prototype.processAllCellClasses = function (colDef, params, onApplicableClass, onNotApplicableClass) {\n this.processClassRules(colDef.cellClassRules, params, onApplicableClass, onNotApplicableClass);\n this.processStaticCellClasses(colDef, params, onApplicableClass);\n };\n StylingService.prototype.processClassRules = function (classRules, params, onApplicableClass, onNotApplicableClass) {\n if (isNonNullObject(classRules)) {\n var classNames = Object.keys(classRules);\n for (var i = 0; i < classNames.length; i++) {\n var className = classNames[i];\n var rule = classRules[className];\n var resultOfRule = void 0;\n if (typeof rule === 'string') {\n resultOfRule = this.expressionService.evaluate(rule, params);\n }\n else if (typeof rule === 'function') {\n resultOfRule = rule(params);\n }\n if (resultOfRule) {\n onApplicableClass(className);\n }\n else if (onNotApplicableClass) {\n onNotApplicableClass(className);\n }\n }\n }\n };\n StylingService.prototype.processStaticCellClasses = function (colDef, params, onApplicableClass) {\n var cellClass = colDef.cellClass;\n if (cellClass) {\n var classOrClasses = void 0;\n if (typeof colDef.cellClass === 'function') {\n var cellClassFunc = colDef.cellClass;\n classOrClasses = cellClassFunc(params);\n }\n else {\n classOrClasses = colDef.cellClass;\n }\n if (typeof classOrClasses === 'string') {\n onApplicableClass(classOrClasses);\n }\n else if (Array.isArray(classOrClasses)) {\n classOrClasses.forEach(function (cssClassItem) {\n onApplicableClass(cssClassItem);\n });\n }\n }\n };\n __decorate$1c([\n Autowired('expressionService')\n ], StylingService.prototype, \"expressionService\", void 0);\n StylingService = __decorate$1c([\n Bean('stylingService')\n ], StylingService);\n return StylingService;\n}(BeanStub));\n\n/**\n * @ag-grid-community/core - Advanced Data Grid / Data Table supporting Javascript / React / AngularJS / Web Components\n * @version v25.1.0\n * @link http://www.ag-grid.com/\n * @license MIT\n */\nvar __extends$1j = (undefined && undefined.__extends) || (function () {\n var extendStatics = function (d, b) {\n extendStatics = Object.setPrototypeOf ||\n ({ __proto__: [] } instanceof Array && function (d, b) { d.__proto__ = b; }) ||\n function (d, b) { for (var p in b) if (b.hasOwnProperty(p)) d[p] = b[p]; };\n return extendStatics(d, b);\n };\n return function (d, b) {\n extendStatics(d, b);\n function __() { this.constructor = d; }\n d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __());\n };\n})();\nvar __decorate$1d = (undefined && undefined.__decorate) || function (decorators, target, key, desc) {\n var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d;\n if (typeof Reflect === \"object\" && typeof Reflect.decorate === \"function\") r = Reflect.decorate(decorators, target, key, desc);\n else for (var i = decorators.length - 1; i >= 0; i--) if (d = decorators[i]) r = (c < 3 ? d(r) : c > 3 ? d(target, key, r) : d(target, key)) || r;\n return c > 3 && r && Object.defineProperty(target, key, r), r;\n};\nvar ColumnHoverService = /** @class */ (function (_super) {\n __extends$1j(ColumnHoverService, _super);\n function ColumnHoverService() {\n return _super !== null && _super.apply(this, arguments) || this;\n }\n ColumnHoverService.prototype.setMouseOver = function (columns) {\n this.selectedColumns = columns;\n var event = {\n type: Events.EVENT_COLUMN_HOVER_CHANGED,\n api: this.gridApi,\n columnApi: this.columnApi\n };\n this.eventService.dispatchEvent(event);\n };\n ColumnHoverService.prototype.clearMouseOver = function () {\n this.selectedColumns = null;\n var event = {\n type: Events.EVENT_COLUMN_HOVER_CHANGED,\n api: this.gridApi,\n columnApi: this.columnApi\n };\n this.eventService.dispatchEvent(event);\n };\n ColumnHoverService.prototype.isHovered = function (column) {\n return !!this.selectedColumns && this.selectedColumns.indexOf(column) >= 0;\n };\n __decorate$1d([\n Autowired('columnApi')\n ], ColumnHoverService.prototype, \"columnApi\", void 0);\n __decorate$1d([\n Autowired('gridApi')\n ], ColumnHoverService.prototype, \"gridApi\", void 0);\n ColumnHoverService = __decorate$1d([\n Bean('columnHoverService')\n ], ColumnHoverService);\n return ColumnHoverService;\n}(BeanStub));\n\n/**\n * @ag-grid-community/core - Advanced Data Grid / Data Table supporting Javascript / React / AngularJS / Web Components\n * @version v25.1.0\n * @link http://www.ag-grid.com/\n * @license MIT\n */\nvar __extends$1k = (undefined && undefined.__extends) || (function () {\n var extendStatics = function (d, b) {\n extendStatics = Object.setPrototypeOf ||\n ({ __proto__: [] } instanceof Array && function (d, b) { d.__proto__ = b; }) ||\n function (d, b) { for (var p in b) if (b.hasOwnProperty(p)) d[p] = b[p]; };\n return extendStatics(d, b);\n };\n return function (d, b) {\n extendStatics(d, b);\n function __() { this.constructor = d; }\n d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __());\n };\n})();\nvar __decorate$1e = (undefined && undefined.__decorate) || function (decorators, target, key, desc) {\n var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d;\n if (typeof Reflect === \"object\" && typeof Reflect.decorate === \"function\") r = Reflect.decorate(decorators, target, key, desc);\n else for (var i = decorators.length - 1; i >= 0; i--) if (d = decorators[i]) r = (c < 3 ? d(r) : c > 3 ? d(target, key, r) : d(target, key)) || r;\n return c > 3 && r && Object.defineProperty(target, key, r), r;\n};\nvar ColumnAnimationService = /** @class */ (function (_super) {\n __extends$1k(ColumnAnimationService, _super);\n function ColumnAnimationService() {\n var _this = _super !== null && _super.apply(this, arguments) || this;\n _this.executeNextFuncs = [];\n _this.executeLaterFuncs = [];\n _this.active = false;\n _this.animationThreadCount = 0;\n return _this;\n }\n ColumnAnimationService.prototype.registerGridComp = function (gridPanel) {\n this.gridPanel = gridPanel;\n };\n ColumnAnimationService.prototype.isActive = function () {\n return this.active;\n };\n ColumnAnimationService.prototype.start = function () {\n if (this.active) {\n return;\n }\n if (this.gridOptionsWrapper.isSuppressColumnMoveAnimation()) {\n return;\n }\n // if doing RTL, we don't animate open / close as due to how the pixels are inverted,\n // the animation moves all the row the the right rather than to the left (ie it's the static\n // columns that actually get their coordinates updated)\n if (this.gridOptionsWrapper.isEnableRtl()) {\n return;\n }\n this.ensureAnimationCssClassPresent();\n this.active = true;\n };\n ColumnAnimationService.prototype.finish = function () {\n if (!this.active) {\n return;\n }\n this.flush();\n this.active = false;\n };\n ColumnAnimationService.prototype.executeNextVMTurn = function (func) {\n if (this.active) {\n this.executeNextFuncs.push(func);\n }\n else {\n func();\n }\n };\n ColumnAnimationService.prototype.executeLaterVMTurn = function (func) {\n if (this.active) {\n this.executeLaterFuncs.push(func);\n }\n else {\n func();\n }\n };\n ColumnAnimationService.prototype.ensureAnimationCssClassPresent = function () {\n var _this = this;\n // up the count, so we can tell if someone else has updated the count\n // by the time the 'wait' func executes\n this.animationThreadCount++;\n var animationThreadCountCopy = this.animationThreadCount;\n this.gridPanel.setColumnMovingCss(true);\n this.executeLaterFuncs.push(function () {\n // only remove the class if this thread was the last one to update it\n if (_this.animationThreadCount === animationThreadCountCopy) {\n _this.gridPanel.setColumnMovingCss(false);\n }\n });\n };\n ColumnAnimationService.prototype.flush = function () {\n var nowFuncs = this.executeNextFuncs;\n this.executeNextFuncs = [];\n var waitFuncs = this.executeLaterFuncs;\n this.executeLaterFuncs = [];\n if (nowFuncs.length === 0 && waitFuncs.length === 0) {\n return;\n }\n window.setTimeout(function () { return nowFuncs.forEach(function (func) { return func(); }); }, 0);\n window.setTimeout(function () { return waitFuncs.forEach(function (func) { return func(); }); }, 300);\n };\n ColumnAnimationService = __decorate$1e([\n Bean('columnAnimationService')\n ], ColumnAnimationService);\n return ColumnAnimationService;\n}(BeanStub));\n\n/**\n * @ag-grid-community/core - Advanced Data Grid / Data Table supporting Javascript / React / AngularJS / Web Components\n * @version v25.1.0\n * @link http://www.ag-grid.com/\n * @license MIT\n */\nvar __extends$1l = (undefined && undefined.__extends) || (function () {\n var extendStatics = function (d, b) {\n extendStatics = Object.setPrototypeOf ||\n ({ __proto__: [] } instanceof Array && function (d, b) { d.__proto__ = b; }) ||\n function (d, b) { for (var p in b) if (b.hasOwnProperty(p)) d[p] = b[p]; };\n return extendStatics(d, b);\n };\n return function (d, b) {\n extendStatics(d, b);\n function __() { this.constructor = d; }\n d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __());\n };\n})();\nvar __decorate$1f = (undefined && undefined.__decorate) || function (decorators, target, key, desc) {\n var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d;\n if (typeof Reflect === \"object\" && typeof Reflect.decorate === \"function\") r = Reflect.decorate(decorators, target, key, desc);\n else for (var i = decorators.length - 1; i >= 0; i--) if (d = decorators[i]) r = (c < 3 ? d(r) : c > 3 ? d(target, key, r) : d(target, key)) || r;\n return c > 3 && r && Object.defineProperty(target, key, r), r;\n};\nvar AutoGroupColService = /** @class */ (function (_super) {\n __extends$1l(AutoGroupColService, _super);\n function AutoGroupColService() {\n return _super !== null && _super.apply(this, arguments) || this;\n }\n AutoGroupColService_1 = AutoGroupColService;\n AutoGroupColService.prototype.createAutoGroupColumns = function (rowGroupColumns) {\n var _this = this;\n var groupAutoColumns = [];\n var doingTreeData = this.gridOptionsWrapper.isTreeData();\n var doingMultiAutoColumn = this.gridOptionsWrapper.isGroupMultiAutoColumn();\n if (doingTreeData && doingMultiAutoColumn) {\n console.warn('AG Grid: you cannot mix groupMultiAutoColumn with treeData, only one column can be used to display groups when doing tree data');\n doingMultiAutoColumn = false;\n }\n // if doing groupMultiAutoColumn, then we call the method multiple times, once\n // for each column we are grouping by\n if (doingMultiAutoColumn) {\n rowGroupColumns.forEach(function (rowGroupCol, index) {\n groupAutoColumns.push(_this.createOneAutoGroupColumn(rowGroupCol, index));\n });\n }\n else {\n groupAutoColumns.push(this.createOneAutoGroupColumn());\n }\n return groupAutoColumns;\n };\n // rowGroupCol and index are missing if groupMultiAutoColumn=false\n AutoGroupColService.prototype.createOneAutoGroupColumn = function (rowGroupCol, index) {\n // if one provided by user, use it, otherwise create one\n var defaultAutoColDef = this.generateDefaultColDef(rowGroupCol);\n // if doing multi, set the field\n var colId;\n if (rowGroupCol) {\n colId = Constants.GROUP_AUTO_COLUMN_ID + \"-\" + rowGroupCol.getId();\n }\n else {\n colId = AutoGroupColService_1.GROUP_AUTO_COLUMN_BUNDLE_ID;\n }\n var userAutoColDef = this.gridOptionsWrapper.getAutoGroupColumnDef();\n mergeDeep(defaultAutoColDef, userAutoColDef);\n defaultAutoColDef = this.columnFactory.mergeColDefs(defaultAutoColDef);\n defaultAutoColDef.colId = colId;\n // For tree data the filter is always allowed\n if (!this.gridOptionsWrapper.isTreeData()) {\n // we would only allow filter if the user has provided field or value getter. otherwise the filter\n // would not be able to work.\n var noFieldOrValueGetter = missing(defaultAutoColDef.field) && missing(defaultAutoColDef.valueGetter) && missing(defaultAutoColDef.filterValueGetter);\n if (noFieldOrValueGetter) {\n defaultAutoColDef.filter = false;\n }\n }\n // if showing many cols, we don't want to show more than one with a checkbox for selection\n if (index && index > 0) {\n defaultAutoColDef.headerCheckboxSelection = false;\n }\n var newCol = new Column(defaultAutoColDef, null, colId, true);\n this.context.createBean(newCol);\n return newCol;\n };\n AutoGroupColService.prototype.generateDefaultColDef = function (rowGroupCol) {\n var userAutoColDef = this.gridOptionsWrapper.getAutoGroupColumnDef();\n var localeTextFunc = this.gridOptionsWrapper.getLocaleTextFunc();\n var defaultAutoColDef = {\n headerName: localeTextFunc('group', 'Group')\n };\n var userHasProvidedGroupCellRenderer = userAutoColDef && (userAutoColDef.cellRenderer || userAutoColDef.cellRendererFramework);\n // only add the default group cell renderer if user hasn't provided one\n if (!userHasProvidedGroupCellRenderer) {\n defaultAutoColDef.cellRenderer = 'agGroupCellRenderer';\n }\n // we never allow moving the group column\n // defaultAutoColDef.suppressMovable = true;\n if (rowGroupCol) {\n var rowGroupColDef = rowGroupCol.getColDef();\n assign(defaultAutoColDef, {\n // cellRendererParams.groupKey: colDefToCopy.field;\n headerName: this.columnController.getDisplayNameForColumn(rowGroupCol, 'header'),\n headerValueGetter: rowGroupColDef.headerValueGetter\n });\n if (rowGroupColDef.cellRenderer) {\n assign(defaultAutoColDef, {\n cellRendererParams: {\n innerRenderer: rowGroupColDef.cellRenderer,\n innerRendererParams: rowGroupColDef.cellRendererParams\n }\n });\n }\n defaultAutoColDef.showRowGroup = rowGroupCol.getColId();\n }\n else {\n defaultAutoColDef.showRowGroup = true;\n }\n return defaultAutoColDef;\n };\n var AutoGroupColService_1;\n AutoGroupColService.GROUP_AUTO_COLUMN_BUNDLE_ID = Constants.GROUP_AUTO_COLUMN_ID;\n __decorate$1f([\n Autowired('columnController')\n ], AutoGroupColService.prototype, \"columnController\", void 0);\n __decorate$1f([\n Autowired('columnFactory')\n ], AutoGroupColService.prototype, \"columnFactory\", void 0);\n AutoGroupColService = AutoGroupColService_1 = __decorate$1f([\n Bean('autoGroupColService')\n ], AutoGroupColService);\n return AutoGroupColService;\n}(BeanStub));\n\n/**\n * @ag-grid-community/core - Advanced Data Grid / Data Table supporting Javascript / React / AngularJS / Web Components\n * @version v25.1.0\n * @link http://www.ag-grid.com/\n * @license MIT\n */\nvar __extends$1m = (undefined && undefined.__extends) || (function () {\n var extendStatics = function (d, b) {\n extendStatics = Object.setPrototypeOf ||\n ({ __proto__: [] } instanceof Array && function (d, b) { d.__proto__ = b; }) ||\n function (d, b) { for (var p in b) if (b.hasOwnProperty(p)) d[p] = b[p]; };\n return extendStatics(d, b);\n };\n return function (d, b) {\n extendStatics(d, b);\n function __() { this.constructor = d; }\n d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __());\n };\n})();\nvar __decorate$1g = (undefined && undefined.__decorate) || function (decorators, target, key, desc) {\n var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d;\n if (typeof Reflect === \"object\" && typeof Reflect.decorate === \"function\") r = Reflect.decorate(decorators, target, key, desc);\n else for (var i = decorators.length - 1; i >= 0; i--) if (d = decorators[i]) r = (c < 3 ? d(r) : c > 3 ? d(target, key, r) : d(target, key)) || r;\n return c > 3 && r && Object.defineProperty(target, key, r), r;\n};\nvar PaginationProxy = /** @class */ (function (_super) {\n __extends$1m(PaginationProxy, _super);\n function PaginationProxy() {\n var _this = _super !== null && _super.apply(this, arguments) || this;\n _this.currentPage = 0;\n _this.topDisplayedRowIndex = 0;\n _this.bottomDisplayedRowIndex = 0;\n _this.pixelOffset = 0;\n _this.masterRowCount = 0;\n return _this;\n }\n PaginationProxy.prototype.postConstruct = function () {\n this.active = this.gridOptionsWrapper.isPagination();\n this.paginateChildRows = this.gridOptionsWrapper.isPaginateChildRows();\n this.addManagedListener(this.eventService, Events.EVENT_MODEL_UPDATED, this.onModelUpdated.bind(this));\n this.addManagedListener(this.gridOptionsWrapper, 'paginationPageSize', this.onPaginationPageSizeChanged.bind(this));\n this.onModelUpdated();\n };\n PaginationProxy.prototype.ensureRowHeightsValid = function (startPixel, endPixel, startLimitIndex, endLimitIndex) {\n var res = this.rowModel.ensureRowHeightsValid(startPixel, endPixel, this.getPageFirstRow(), this.getPageLastRow());\n if (res) {\n this.calculatePages();\n }\n return res;\n };\n PaginationProxy.prototype.onModelUpdated = function (modelUpdatedEvent) {\n this.calculatePages();\n var paginationChangedEvent = {\n type: Events.EVENT_PAGINATION_CHANGED,\n animate: modelUpdatedEvent ? modelUpdatedEvent.animate : false,\n newData: modelUpdatedEvent ? modelUpdatedEvent.newData : false,\n newPage: modelUpdatedEvent ? modelUpdatedEvent.newPage : false,\n keepRenderedRows: modelUpdatedEvent ? modelUpdatedEvent.keepRenderedRows : false,\n api: this.gridApi,\n columnApi: this.columnApi\n };\n this.eventService.dispatchEvent(paginationChangedEvent);\n };\n PaginationProxy.prototype.onPaginationPageSizeChanged = function () {\n this.calculatePages();\n var paginationChangedEvent = {\n type: Events.EVENT_PAGINATION_CHANGED,\n animate: false,\n newData: false,\n newPage: false,\n // important to keep rendered rows, otherwise every time grid is resized,\n // we would destroy all the rows.\n keepRenderedRows: true,\n api: this.gridApi,\n columnApi: this.columnApi\n };\n this.eventService.dispatchEvent(paginationChangedEvent);\n };\n PaginationProxy.prototype.goToPage = function (page) {\n if (!this.active || this.currentPage === page) {\n return;\n }\n this.currentPage = page;\n var event = {\n type: Events.EVENT_MODEL_UPDATED,\n animate: false,\n keepRenderedRows: false,\n newData: false,\n newPage: true,\n api: this.gridApi,\n columnApi: this.columnApi\n };\n this.onModelUpdated(event);\n };\n PaginationProxy.prototype.getPixelOffset = function () {\n return this.pixelOffset;\n };\n PaginationProxy.prototype.getRow = function (index) {\n return this.rowModel.getRow(index);\n };\n PaginationProxy.prototype.getRowNode = function (id) {\n return this.rowModel.getRowNode(id);\n };\n PaginationProxy.prototype.getRowIndexAtPixel = function (pixel) {\n return this.rowModel.getRowIndexAtPixel(pixel);\n };\n PaginationProxy.prototype.getCurrentPageHeight = function () {\n if (missing(this.topRowBounds) || missing(this.bottomRowBounds)) {\n return 0;\n }\n return Math.max(this.bottomRowBounds.rowTop + this.bottomRowBounds.rowHeight - this.topRowBounds.rowTop, 0);\n };\n PaginationProxy.prototype.getCurrentPagePixelRange = function () {\n var pageFirstPixel = this.topRowBounds ? this.topRowBounds.rowTop : 0;\n var pageLastPixel = this.bottomRowBounds ? this.bottomRowBounds.rowTop + this.bottomRowBounds.rowHeight : 0;\n return { pageFirstPixel: pageFirstPixel, pageLastPixel: pageLastPixel };\n };\n PaginationProxy.prototype.isRowPresent = function (rowNode) {\n if (!this.rowModel.isRowPresent(rowNode)) {\n return false;\n }\n var nodeIsInPage = rowNode.rowIndex >= this.topDisplayedRowIndex && rowNode.rowIndex <= this.bottomDisplayedRowIndex;\n return nodeIsInPage;\n };\n PaginationProxy.prototype.isEmpty = function () {\n return this.rowModel.isEmpty();\n };\n PaginationProxy.prototype.isRowsToRender = function () {\n return this.rowModel.isRowsToRender();\n };\n PaginationProxy.prototype.getNodesInRangeForSelection = function (firstInRange, lastInRange) {\n return this.rowModel.getNodesInRangeForSelection(firstInRange, lastInRange);\n };\n PaginationProxy.prototype.forEachNode = function (callback) {\n return this.rowModel.forEachNode(callback);\n };\n PaginationProxy.prototype.getType = function () {\n return this.rowModel.getType();\n };\n PaginationProxy.prototype.getRowBounds = function (index) {\n var res = this.rowModel.getRowBounds(index);\n res.rowIndex = index;\n return res;\n };\n PaginationProxy.prototype.getPageFirstRow = function () {\n return this.topRowBounds ? this.topRowBounds.rowIndex : -1;\n };\n PaginationProxy.prototype.getPageLastRow = function () {\n return this.bottomRowBounds ? this.bottomRowBounds.rowIndex : -1;\n };\n PaginationProxy.prototype.getRowCount = function () {\n return this.rowModel.getRowCount();\n };\n PaginationProxy.prototype.getPageForIndex = function (index) {\n return Math.floor(index / this.pageSize);\n };\n PaginationProxy.prototype.goToPageWithIndex = function (index) {\n if (!this.active) {\n return;\n }\n var pageNumber = this.getPageForIndex(index);\n this.goToPage(pageNumber);\n };\n PaginationProxy.prototype.isRowInPage = function (row) {\n if (!this.active) {\n return true;\n }\n var rowPage = this.getPageForIndex(row.rowIndex);\n return rowPage === this.currentPage;\n };\n PaginationProxy.prototype.isLastPageFound = function () {\n return this.rowModel.isLastRowIndexKnown();\n };\n PaginationProxy.prototype.getCurrentPage = function () {\n return this.currentPage;\n };\n PaginationProxy.prototype.goToNextPage = function () {\n this.goToPage(this.currentPage + 1);\n };\n PaginationProxy.prototype.goToPreviousPage = function () {\n this.goToPage(this.currentPage - 1);\n };\n PaginationProxy.prototype.goToFirstPage = function () {\n this.goToPage(0);\n };\n PaginationProxy.prototype.goToLastPage = function () {\n var rowCount = this.rowModel.getRowCount();\n var lastPage = Math.floor(rowCount / this.pageSize);\n this.goToPage(lastPage);\n };\n PaginationProxy.prototype.getPageSize = function () {\n return this.pageSize;\n };\n PaginationProxy.prototype.getTotalPages = function () {\n return this.totalPages;\n };\n PaginationProxy.prototype.setPageSize = function () {\n // show put this into super class\n this.pageSize = this.gridOptionsWrapper.getPaginationPageSize();\n if (this.pageSize == null || this.pageSize < 1) {\n this.pageSize = 100;\n }\n };\n PaginationProxy.prototype.calculatePages = function () {\n if (this.active) {\n this.setPageSize();\n if (this.paginateChildRows) {\n this.calculatePagesAllRows();\n }\n else {\n this.calculatePagesMasterRowsOnly();\n }\n }\n else {\n this.calculatedPagesNotActive();\n }\n this.topRowBounds = this.rowModel.getRowBounds(this.topDisplayedRowIndex);\n if (this.topRowBounds) {\n this.topRowBounds.rowIndex = this.topDisplayedRowIndex;\n }\n this.bottomRowBounds = this.rowModel.getRowBounds(this.bottomDisplayedRowIndex);\n if (this.bottomRowBounds) {\n this.bottomRowBounds.rowIndex = this.bottomDisplayedRowIndex;\n }\n this.setPixelOffset(exists(this.topRowBounds) ? this.topRowBounds.rowTop : 0);\n };\n PaginationProxy.prototype.setPixelOffset = function (value) {\n if (this.pixelOffset === value) {\n return;\n }\n this.pixelOffset = value;\n this.eventService.dispatchEvent({ type: Events.EVENT_PAGINATION_PIXEL_OFFSET_CHANGED });\n };\n PaginationProxy.prototype.setZeroRows = function () {\n this.masterRowCount = 0;\n this.topDisplayedRowIndex = 0;\n this.bottomDisplayedRowIndex = -1;\n this.currentPage = 0;\n this.totalPages = 0;\n };\n PaginationProxy.prototype.calculatePagesMasterRowsOnly = function () {\n // const csrm = this.rowModel;\n // const rootNode = csrm.getRootNode();\n // const masterRows = rootNode.childrenAfterSort;\n this.masterRowCount = this.rowModel.getTopLevelRowCount();\n // we say <=0 (rather than =0) as viewport returns -1 when no rows\n if (this.masterRowCount <= 0) {\n this.setZeroRows();\n return;\n }\n var masterLastRowIndex = this.masterRowCount - 1;\n this.totalPages = Math.floor((masterLastRowIndex) / this.pageSize) + 1;\n if (this.currentPage >= this.totalPages) {\n this.currentPage = this.totalPages - 1;\n }\n if (!isNumeric(this.currentPage) || this.currentPage < 0) {\n this.currentPage = 0;\n }\n var masterPageStartIndex = this.pageSize * this.currentPage;\n var masterPageEndIndex = (this.pageSize * (this.currentPage + 1)) - 1;\n if (masterPageEndIndex > masterLastRowIndex) {\n masterPageEndIndex = masterLastRowIndex;\n }\n this.topDisplayedRowIndex = this.rowModel.getTopLevelRowDisplayedIndex(masterPageStartIndex);\n // masterRows[masterPageStartIndex].rowIndex;\n if (masterPageEndIndex === masterLastRowIndex) {\n // if showing the last master row, then we want to show the very last row of the model\n this.bottomDisplayedRowIndex = this.rowModel.getRowCount() - 1;\n }\n else {\n var firstIndexNotToShow = this.rowModel.getTopLevelRowDisplayedIndex(masterPageEndIndex + 1);\n //masterRows[masterPageEndIndex + 1].rowIndex;\n // this gets the index of the last child - eg current row is open, we want to display all children,\n // the index of the last child is one less than the index of the next parent row.\n this.bottomDisplayedRowIndex = firstIndexNotToShow - 1;\n }\n };\n PaginationProxy.prototype.getMasterRowCount = function () {\n return this.masterRowCount;\n };\n PaginationProxy.prototype.calculatePagesAllRows = function () {\n this.masterRowCount = this.rowModel.getRowCount();\n if (this.masterRowCount === 0) {\n this.setZeroRows();\n return;\n }\n var maxRowIndex = this.masterRowCount - 1;\n this.totalPages = Math.floor((maxRowIndex) / this.pageSize) + 1;\n if (this.currentPage >= this.totalPages) {\n this.currentPage = this.totalPages - 1;\n }\n if (!isNumeric(this.currentPage) || this.currentPage < 0) {\n this.currentPage = 0;\n }\n this.topDisplayedRowIndex = this.pageSize * this.currentPage;\n this.bottomDisplayedRowIndex = (this.pageSize * (this.currentPage + 1)) - 1;\n if (this.bottomDisplayedRowIndex > maxRowIndex) {\n this.bottomDisplayedRowIndex = maxRowIndex;\n }\n };\n PaginationProxy.prototype.calculatedPagesNotActive = function () {\n this.pageSize = this.rowModel.getRowCount();\n this.totalPages = 1;\n this.currentPage = 0;\n this.topDisplayedRowIndex = 0;\n this.bottomDisplayedRowIndex = this.rowModel.getRowCount() - 1;\n };\n __decorate$1g([\n Autowired('rowModel')\n ], PaginationProxy.prototype, \"rowModel\", void 0);\n __decorate$1g([\n Autowired('columnApi')\n ], PaginationProxy.prototype, \"columnApi\", void 0);\n __decorate$1g([\n Autowired('gridApi')\n ], PaginationProxy.prototype, \"gridApi\", void 0);\n __decorate$1g([\n PostConstruct\n ], PaginationProxy.prototype, \"postConstruct\", null);\n PaginationProxy = __decorate$1g([\n Bean('paginationProxy')\n ], PaginationProxy);\n return PaginationProxy;\n}(BeanStub));\n\n/**\n * @ag-grid-community/core - Advanced Data Grid / Data Table supporting Javascript / React / AngularJS / Web Components\n * @version v25.1.0\n * @link http://www.ag-grid.com/\n * @license MIT\n */\nvar __extends$1n = (undefined && undefined.__extends) || (function () {\n var extendStatics = function (d, b) {\n extendStatics = Object.setPrototypeOf ||\n ({ __proto__: [] } instanceof Array && function (d, b) { d.__proto__ = b; }) ||\n function (d, b) { for (var p in b) if (b.hasOwnProperty(p)) d[p] = b[p]; };\n return extendStatics(d, b);\n };\n return function (d, b) {\n extendStatics(d, b);\n function __() { this.constructor = d; }\n d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __());\n };\n})();\nvar __decorate$1h = (undefined && undefined.__decorate) || function (decorators, target, key, desc) {\n var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d;\n if (typeof Reflect === \"object\" && typeof Reflect.decorate === \"function\") r = Reflect.decorate(decorators, target, key, desc);\n else for (var i = decorators.length - 1; i >= 0; i--) if (d = decorators[i]) r = (c < 3 ? d(r) : c > 3 ? d(target, key, r) : d(target, key)) || r;\n return c > 3 && r && Object.defineProperty(target, key, r), r;\n};\nvar PaginationAutoPageSizeService = /** @class */ (function (_super) {\n __extends$1n(PaginationAutoPageSizeService, _super);\n function PaginationAutoPageSizeService() {\n return _super !== null && _super.apply(this, arguments) || this;\n }\n PaginationAutoPageSizeService.prototype.registerGridComp = function (gridPanel) {\n this.gridPanel = gridPanel;\n this.addManagedListener(this.eventService, Events.EVENT_BODY_HEIGHT_CHANGED, this.onBodyHeightChanged.bind(this));\n this.addManagedListener(this.eventService, Events.EVENT_SCROLL_VISIBILITY_CHANGED, this.onScrollVisibilityChanged.bind(this));\n this.checkPageSize();\n };\n PaginationAutoPageSizeService.prototype.notActive = function () {\n return !this.gridOptionsWrapper.isPaginationAutoPageSize();\n };\n PaginationAutoPageSizeService.prototype.onScrollVisibilityChanged = function () {\n this.checkPageSize();\n };\n PaginationAutoPageSizeService.prototype.onBodyHeightChanged = function () {\n this.checkPageSize();\n };\n PaginationAutoPageSizeService.prototype.checkPageSize = function () {\n if (this.notActive()) {\n return;\n }\n var rowHeight = this.gridOptionsWrapper.getRowHeightAsNumber();\n var bodyHeight = this.gridPanel.getBodyHeight();\n if (bodyHeight > 0) {\n var newPageSize = Math.floor(bodyHeight / rowHeight);\n this.gridOptionsWrapper.setProperty('paginationPageSize', newPageSize);\n }\n };\n PaginationAutoPageSizeService = __decorate$1h([\n Bean('paginationAutoPageSizeService')\n ], PaginationAutoPageSizeService);\n return PaginationAutoPageSizeService;\n}(BeanStub));\n\n/**\n * @ag-grid-community/core - Advanced Data Grid / Data Table supporting Javascript / React / AngularJS / Web Components\n * @version v25.1.0\n * @link http://www.ag-grid.com/\n * @license MIT\n */\nvar __extends$1o = (undefined && undefined.__extends) || (function () {\n var extendStatics = function (d, b) {\n extendStatics = Object.setPrototypeOf ||\n ({ __proto__: [] } instanceof Array && function (d, b) { d.__proto__ = b; }) ||\n function (d, b) { for (var p in b) if (b.hasOwnProperty(p)) d[p] = b[p]; };\n return extendStatics(d, b);\n };\n return function (d, b) {\n extendStatics(d, b);\n function __() { this.constructor = d; }\n d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __());\n };\n})();\nvar __decorate$1i = (undefined && undefined.__decorate) || function (decorators, target, key, desc) {\n var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d;\n if (typeof Reflect === \"object\" && typeof Reflect.decorate === \"function\") r = Reflect.decorate(decorators, target, key, desc);\n else for (var i = decorators.length - 1; i >= 0; i--) if (d = decorators[i]) r = (c < 3 ? d(r) : c > 3 ? d(target, key, r) : d(target, key)) || r;\n return c > 3 && r && Object.defineProperty(target, key, r), r;\n};\nvar ValueCache = /** @class */ (function (_super) {\n __extends$1o(ValueCache, _super);\n function ValueCache() {\n var _this = _super !== null && _super.apply(this, arguments) || this;\n _this.cacheVersion = 0;\n return _this;\n }\n ValueCache.prototype.init = function () {\n this.active = this.gridOptionsWrapper.isValueCache();\n this.neverExpires = this.gridOptionsWrapper.isValueCacheNeverExpires();\n };\n ValueCache.prototype.onDataChanged = function () {\n if (this.neverExpires) {\n return;\n }\n this.expire();\n };\n ValueCache.prototype.expire = function () {\n this.cacheVersion++;\n };\n ValueCache.prototype.setValue = function (rowNode, colId, value) {\n if (this.active) {\n if (rowNode.__cacheVersion !== this.cacheVersion) {\n rowNode.__cacheVersion = this.cacheVersion;\n rowNode.__cacheData = {};\n }\n rowNode.__cacheData[colId] = value;\n }\n };\n ValueCache.prototype.getValue = function (rowNode, colId) {\n if (!this.active || rowNode.__cacheVersion !== this.cacheVersion) {\n return undefined;\n }\n return rowNode.__cacheData[colId];\n };\n __decorate$1i([\n PostConstruct\n ], ValueCache.prototype, \"init\", null);\n ValueCache = __decorate$1i([\n Bean('valueCache')\n ], ValueCache);\n return ValueCache;\n}(BeanStub));\n\n/**\n * @ag-grid-community/core - Advanced Data Grid / Data Table supporting Javascript / React / AngularJS / Web Components\n * @version v25.1.0\n * @link http://www.ag-grid.com/\n * @license MIT\n */\nvar __extends$1p = (undefined && undefined.__extends) || (function () {\n var extendStatics = function (d, b) {\n extendStatics = Object.setPrototypeOf ||\n ({ __proto__: [] } instanceof Array && function (d, b) { d.__proto__ = b; }) ||\n function (d, b) { for (var p in b) if (b.hasOwnProperty(p)) d[p] = b[p]; };\n return extendStatics(d, b);\n };\n return function (d, b) {\n extendStatics(d, b);\n function __() { this.constructor = d; }\n d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __());\n };\n})();\nvar __decorate$1j = (undefined && undefined.__decorate) || function (decorators, target, key, desc) {\n var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d;\n if (typeof Reflect === \"object\" && typeof Reflect.decorate === \"function\") r = Reflect.decorate(decorators, target, key, desc);\n else for (var i = decorators.length - 1; i >= 0; i--) if (d = decorators[i]) r = (c < 3 ? d(r) : c > 3 ? d(target, key, r) : d(target, key)) || r;\n return c > 3 && r && Object.defineProperty(target, key, r), r;\n};\nvar ChangeDetectionService = /** @class */ (function (_super) {\n __extends$1p(ChangeDetectionService, _super);\n function ChangeDetectionService() {\n return _super !== null && _super.apply(this, arguments) || this;\n }\n ChangeDetectionService.prototype.init = function () {\n if (this.rowModel.getType() === Constants.ROW_MODEL_TYPE_CLIENT_SIDE) {\n this.clientSideRowModel = this.rowModel;\n }\n this.addManagedListener(this.eventService, Events.EVENT_CELL_VALUE_CHANGED, this.onCellValueChanged.bind(this));\n };\n ChangeDetectionService.prototype.onCellValueChanged = function (event) {\n // Clipboard service manages its own change detection, so no need to do it here.\n // The clipboard manages its own as otherwise this would happen once for every cell\n // that got updated as part of a paste operation, so e.g. if 100 cells in a paste operation,\n // this doChangeDetection would get called 100 times (once for each cell), instead clipboard\n // service executes the logic we have here once (in essence batching up all cell changes\n // into one change detection).\n if (event.source === Constants.SOURCE_PASTE) {\n return;\n }\n this.doChangeDetection(event.node, event.column);\n };\n ChangeDetectionService.prototype.doChangeDetection = function (rowNode, column) {\n if (this.gridOptionsWrapper.isSuppressChangeDetection()) {\n return;\n }\n // step 1 of change detection is to update the aggregated values\n if (this.clientSideRowModel && !rowNode.isRowPinned()) {\n var onlyChangedColumns = this.gridOptionsWrapper.isAggregateOnlyChangedColumns();\n var changedPath = new ChangedPath(onlyChangedColumns, this.clientSideRowModel.getRootNode());\n changedPath.addParentNode(rowNode.parent, [column]);\n this.clientSideRowModel.doAggregate(changedPath);\n }\n // step 2 of change detection is to refresh the cells\n this.rowRenderer.refreshCells();\n };\n __decorate$1j([\n Autowired('rowModel')\n ], ChangeDetectionService.prototype, \"rowModel\", void 0);\n __decorate$1j([\n Autowired('rowRenderer')\n ], ChangeDetectionService.prototype, \"rowRenderer\", void 0);\n __decorate$1j([\n PostConstruct\n ], ChangeDetectionService.prototype, \"init\", null);\n ChangeDetectionService = __decorate$1j([\n Bean('changeDetectionService')\n ], ChangeDetectionService);\n return ChangeDetectionService;\n}(BeanStub));\n\n/**\n * @ag-grid-community/core - Advanced Data Grid / Data Table supporting Javascript / React / AngularJS / Web Components\n * @version v25.1.0\n * @link http://www.ag-grid.com/\n * @license MIT\n */\nvar __extends$1q = (undefined && undefined.__extends) || (function () {\n var extendStatics = function (d, b) {\n extendStatics = Object.setPrototypeOf ||\n ({ __proto__: [] } instanceof Array && function (d, b) { d.__proto__ = b; }) ||\n function (d, b) { for (var p in b) if (b.hasOwnProperty(p)) d[p] = b[p]; };\n return extendStatics(d, b);\n };\n return function (d, b) {\n extendStatics(d, b);\n function __() { this.constructor = d; }\n d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __());\n };\n})();\nvar __decorate$1k = (undefined && undefined.__decorate) || function (decorators, target, key, desc) {\n var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d;\n if (typeof Reflect === \"object\" && typeof Reflect.decorate === \"function\") r = Reflect.decorate(decorators, target, key, desc);\n else for (var i = decorators.length - 1; i >= 0; i--) if (d = decorators[i]) r = (c < 3 ? d(r) : c > 3 ? d(target, key, r) : d(target, key)) || r;\n return c > 3 && r && Object.defineProperty(target, key, r), r;\n};\nvar __param$8 = (undefined && undefined.__param) || function (paramIndex, decorator) {\n return function (target, key) { decorator(target, key, paramIndex); }\n};\nvar AlignedGridsService = /** @class */ (function (_super) {\n __extends$1q(AlignedGridsService, _super);\n function AlignedGridsService() {\n var _this = _super !== null && _super.apply(this, arguments) || this;\n // flag to mark if we are consuming. to avoid cyclic events (ie other grid firing back to master\n // while processing a master event) we mark this if consuming an event, and if we are, then\n // we don't fire back any events.\n _this.consuming = false;\n return _this;\n }\n AlignedGridsService.prototype.setBeans = function (loggerFactory) {\n this.logger = loggerFactory.create('AlignedGridsService');\n };\n AlignedGridsService.prototype.registerGridComp = function (gridPanel) {\n this.gridPanel = gridPanel;\n };\n AlignedGridsService.prototype.init = function () {\n this.addManagedListener(this.eventService, Events.EVENT_COLUMN_MOVED, this.fireColumnEvent.bind(this));\n this.addManagedListener(this.eventService, Events.EVENT_COLUMN_VISIBLE, this.fireColumnEvent.bind(this));\n this.addManagedListener(this.eventService, Events.EVENT_COLUMN_PINNED, this.fireColumnEvent.bind(this));\n this.addManagedListener(this.eventService, Events.EVENT_COLUMN_GROUP_OPENED, this.fireColumnEvent.bind(this));\n this.addManagedListener(this.eventService, Events.EVENT_COLUMN_RESIZED, this.fireColumnEvent.bind(this));\n this.addManagedListener(this.eventService, Events.EVENT_BODY_SCROLL, this.fireScrollEvent.bind(this));\n };\n // common logic across all the fire methods\n AlignedGridsService.prototype.fireEvent = function (callback) {\n // if we are already consuming, then we are acting on an event from a master,\n // so we don't cause a cyclic firing of events\n if (this.consuming) {\n return;\n }\n // iterate through the aligned grids, and pass each aligned grid service to the callback\n var otherGrids = this.gridOptionsWrapper.getAlignedGrids();\n if (otherGrids) {\n otherGrids.forEach(function (otherGridOptions) {\n if (otherGridOptions.api) {\n var alignedGridService = otherGridOptions.api.__getAlignedGridService();\n callback(alignedGridService);\n }\n });\n }\n };\n // common logic across all consume methods. very little common logic, however extracting\n // guarantees consistency across the methods.\n AlignedGridsService.prototype.onEvent = function (callback) {\n this.consuming = true;\n callback();\n this.consuming = false;\n };\n AlignedGridsService.prototype.fireColumnEvent = function (event) {\n this.fireEvent(function (alignedGridsService) {\n alignedGridsService.onColumnEvent(event);\n });\n };\n AlignedGridsService.prototype.fireScrollEvent = function (event) {\n if (event.direction !== 'horizontal') {\n return;\n }\n this.fireEvent(function (alignedGridsService) {\n alignedGridsService.onScrollEvent(event);\n });\n };\n AlignedGridsService.prototype.onScrollEvent = function (event) {\n var _this = this;\n this.onEvent(function () {\n _this.gridPanel.setHorizontalScrollPosition(event.left);\n });\n };\n AlignedGridsService.prototype.getMasterColumns = function (event) {\n var result = [];\n if (event.columns) {\n event.columns.forEach(function (column) {\n result.push(column);\n });\n }\n else if (event.column) {\n result.push(event.column);\n }\n return result;\n };\n AlignedGridsService.prototype.getColumnIds = function (event) {\n var result = [];\n if (event.columns) {\n event.columns.forEach(function (column) {\n result.push(column.getColId());\n });\n }\n else if (event.column) {\n result.push(event.column.getColId());\n }\n return result;\n };\n AlignedGridsService.prototype.onColumnEvent = function (event) {\n var _this = this;\n this.onEvent(function () {\n switch (event.type) {\n case Events.EVENT_COLUMN_MOVED:\n case Events.EVENT_COLUMN_VISIBLE:\n case Events.EVENT_COLUMN_PINNED:\n case Events.EVENT_COLUMN_RESIZED:\n var colEvent = event;\n _this.processColumnEvent(colEvent);\n break;\n case Events.EVENT_COLUMN_GROUP_OPENED:\n var groupOpenedEvent = event;\n _this.processGroupOpenedEvent(groupOpenedEvent);\n break;\n case Events.EVENT_COLUMN_PIVOT_CHANGED:\n // we cannot support pivoting with aligned grids as the columns will be out of sync as the\n // grids will have columns created based on the row data of the grid.\n console.warn('AG Grid: pivoting is not supported with aligned grids. ' +\n 'You can only use one of these features at a time in a grid.');\n break;\n }\n });\n };\n AlignedGridsService.prototype.processGroupOpenedEvent = function (groupOpenedEvent) {\n // likewise for column group\n var masterColumnGroup = groupOpenedEvent.columnGroup;\n var otherColumnGroup = null;\n if (masterColumnGroup) {\n var groupId = masterColumnGroup.getGroupId();\n otherColumnGroup = this.columnController.getOriginalColumnGroup(groupId);\n }\n if (masterColumnGroup && !otherColumnGroup) {\n return;\n }\n this.logger.log('onColumnEvent-> processing ' + groupOpenedEvent + ' expanded = ' + masterColumnGroup.isExpanded());\n this.columnController.setColumnGroupOpened(otherColumnGroup, masterColumnGroup.isExpanded(), \"alignedGridChanged\");\n };\n AlignedGridsService.prototype.processColumnEvent = function (colEvent) {\n var _this = this;\n // the column in the event is from the master grid. need to\n // look up the equivalent from this (other) grid\n var masterColumn = colEvent.column;\n var otherColumn = null;\n if (masterColumn) {\n otherColumn = this.columnController.getPrimaryColumn(masterColumn.getColId());\n }\n // if event was with respect to a master column, that is not present in this\n // grid, then we ignore the event\n if (masterColumn && !otherColumn) {\n return;\n }\n // in time, all the methods below should use the column ids, it's a more generic way\n // of handling columns, and also allows for single or multi column events\n var masterColumns = this.getMasterColumns(colEvent);\n switch (colEvent.type) {\n case Events.EVENT_COLUMN_MOVED:\n // when the user moves columns via setColumnState, we can't depend on moving specific columns\n // to an index, as there maybe be many indexes columns moved to (as wasn't result of a mouse drag).\n // so only way to be sure is match the order of all columns using Column State.\n {\n var movedEvent = colEvent;\n var srcColState = colEvent.columnApi.getColumnState();\n var destColState = srcColState.map(function (s) { return ({ colId: s.colId }); });\n this.columnController.applyColumnState({ state: destColState, applyOrder: true }, \"alignedGridChanged\");\n this.logger.log(\"onColumnEvent-> processing \" + colEvent.type + \" toIndex = \" + movedEvent.toIndex);\n }\n break;\n case Events.EVENT_COLUMN_VISIBLE:\n // when the user changes visibility via setColumnState, we can't depend on visibility flag in event\n // as there maybe be mix of true/false (as wasn't result of a mouse click to set visiblity).\n // so only way to be sure is match the visibility of all columns using Column State.\n {\n var visibleEvent = colEvent;\n var srcColState = colEvent.columnApi.getColumnState();\n var destColState = srcColState.map(function (s) { return ({ colId: s.colId, hide: s.hide }); });\n this.columnController.applyColumnState({ state: destColState }, \"alignedGridChanged\");\n this.logger.log(\"onColumnEvent-> processing \" + colEvent.type + \" visible = \" + visibleEvent.visible);\n }\n break;\n case Events.EVENT_COLUMN_PINNED:\n {\n var pinnedEvent = colEvent;\n var srcColState = colEvent.columnApi.getColumnState();\n var destColState = srcColState.map(function (s) { return ({ colId: s.colId, pinned: s.pinned }); });\n this.columnController.applyColumnState({ state: destColState }, \"alignedGridChanged\");\n this.logger.log(\"onColumnEvent-> processing \" + colEvent.type + \" pinned = \" + pinnedEvent.pinned);\n }\n break;\n case Events.EVENT_COLUMN_RESIZED:\n var resizedEvent_1 = colEvent;\n masterColumns.forEach(function (column) {\n _this.logger.log(\"onColumnEvent-> processing \" + colEvent.type + \" actualWidth = \" + column.getActualWidth());\n var columnWidths = [{ key: column.getColId(), newWidth: column.getActualWidth() }];\n _this.columnController.setColumnWidths(columnWidths, false, resizedEvent_1.finished, \"alignedGridChanged\");\n });\n break;\n }\n var isVerticalScrollShowing = this.gridPanel.isVerticalScrollShowing();\n var alignedGrids = this.gridOptionsWrapper.getAlignedGrids();\n if (alignedGrids) {\n alignedGrids.forEach(function (grid) {\n if (grid.api) {\n grid.api.setAlwaysShowVerticalScroll(isVerticalScrollShowing);\n }\n });\n }\n };\n __decorate$1k([\n Autowired('columnController')\n ], AlignedGridsService.prototype, \"columnController\", void 0);\n __decorate$1k([\n __param$8(0, Qualifier('loggerFactory'))\n ], AlignedGridsService.prototype, \"setBeans\", null);\n __decorate$1k([\n PostConstruct\n ], AlignedGridsService.prototype, \"init\", null);\n AlignedGridsService = __decorate$1k([\n Bean('alignedGridsService')\n ], AlignedGridsService);\n return AlignedGridsService;\n}(BeanStub));\n\n/**\n * @ag-grid-community/core - Advanced Data Grid / Data Table supporting Javascript / React / AngularJS / Web Components\n * @version v25.1.0\n * @link http://www.ag-grid.com/\n * @license MIT\n */\nvar __extends$1r = (undefined && undefined.__extends) || (function () {\n var extendStatics = function (d, b) {\n extendStatics = Object.setPrototypeOf ||\n ({ __proto__: [] } instanceof Array && function (d, b) { d.__proto__ = b; }) ||\n function (d, b) { for (var p in b) if (b.hasOwnProperty(p)) d[p] = b[p]; };\n return extendStatics(d, b);\n };\n return function (d, b) {\n extendStatics(d, b);\n function __() { this.constructor = d; }\n d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __());\n };\n})();\nvar __decorate$1l = (undefined && undefined.__decorate) || function (decorators, target, key, desc) {\n var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d;\n if (typeof Reflect === \"object\" && typeof Reflect.decorate === \"function\") r = Reflect.decorate(decorators, target, key, desc);\n else for (var i = decorators.length - 1; i >= 0; i--) if (d = decorators[i]) r = (c < 3 ? d(r) : c > 3 ? d(target, key, r) : d(target, key)) || r;\n return c > 3 && r && Object.defineProperty(target, key, r), r;\n};\nvar AgComponentUtils = /** @class */ (function (_super) {\n __extends$1r(AgComponentUtils, _super);\n function AgComponentUtils() {\n return _super !== null && _super.apply(this, arguments) || this;\n }\n AgComponentUtils.prototype.adaptFunction = function (propertyName, hardcodedJsFunction, componentFromFramework, source) {\n if (hardcodedJsFunction == null) {\n return {\n component: null,\n componentFromFramework: componentFromFramework,\n source: source,\n paramsFromSelector: null\n };\n }\n var metadata = this.componentMetadataProvider.retrieve(propertyName);\n if (metadata && metadata.functionAdapter) {\n return {\n componentFromFramework: componentFromFramework,\n component: metadata.functionAdapter(hardcodedJsFunction),\n source: source,\n paramsFromSelector: null\n };\n }\n return null;\n };\n AgComponentUtils.prototype.adaptCellRendererFunction = function (callback) {\n var Adapter = /** @class */ (function () {\n function Adapter() {\n }\n Adapter.prototype.refresh = function (params) {\n return false;\n };\n Adapter.prototype.getGui = function () {\n var callbackResult = callback(this.params);\n var type = typeof callbackResult;\n if (type === 'string' || type === 'number' || type === 'boolean') {\n return loadTemplate('' + callbackResult + '');\n }\n return callbackResult;\n };\n Adapter.prototype.init = function (params) {\n this.params = params;\n };\n return Adapter;\n }());\n return Adapter;\n };\n AgComponentUtils.prototype.doesImplementIComponent = function (candidate) {\n if (!candidate) {\n return false;\n }\n return candidate.prototype && 'getGui' in candidate.prototype;\n };\n __decorate$1l([\n Autowired(\"componentMetadataProvider\")\n ], AgComponentUtils.prototype, \"componentMetadataProvider\", void 0);\n AgComponentUtils = __decorate$1l([\n Bean(\"agComponentUtils\")\n ], AgComponentUtils);\n return AgComponentUtils;\n}(BeanStub));\n\n/**\n * @ag-grid-community/core - Advanced Data Grid / Data Table supporting Javascript / React / AngularJS / Web Components\n * @version v25.1.0\n * @link http://www.ag-grid.com/\n * @license MIT\n */\nvar __extends$1s = (undefined && undefined.__extends) || (function () {\n var extendStatics = function (d, b) {\n extendStatics = Object.setPrototypeOf ||\n ({ __proto__: [] } instanceof Array && function (d, b) { d.__proto__ = b; }) ||\n function (d, b) { for (var p in b) if (b.hasOwnProperty(p)) d[p] = b[p]; };\n return extendStatics(d, b);\n };\n return function (d, b) {\n extendStatics(d, b);\n function __() { this.constructor = d; }\n d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __());\n };\n})();\nvar __decorate$1m = (undefined && undefined.__decorate) || function (decorators, target, key, desc) {\n var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d;\n if (typeof Reflect === \"object\" && typeof Reflect.decorate === \"function\") r = Reflect.decorate(decorators, target, key, desc);\n else for (var i = decorators.length - 1; i >= 0; i--) if (d = decorators[i]) r = (c < 3 ? d(r) : c > 3 ? d(target, key, r) : d(target, key)) || r;\n return c > 3 && r && Object.defineProperty(target, key, r), r;\n};\nvar ComponentMetadataProvider = /** @class */ (function (_super) {\n __extends$1s(ComponentMetadataProvider, _super);\n function ComponentMetadataProvider() {\n return _super !== null && _super.apply(this, arguments) || this;\n }\n ComponentMetadataProvider.prototype.postConstruct = function () {\n this.componentMetaData = {\n dateComponent: {\n mandatoryMethodList: ['getDate', 'setDate'],\n optionalMethodList: ['afterGuiAttached', 'setInputPlaceholder', 'setInputAriaLabel']\n },\n detailCellRenderer: {\n mandatoryMethodList: [],\n optionalMethodList: ['refresh']\n },\n headerComponent: {\n mandatoryMethodList: [],\n optionalMethodList: ['refresh']\n },\n headerGroupComponent: {\n mandatoryMethodList: [],\n optionalMethodList: []\n },\n loadingCellRenderer: {\n mandatoryMethodList: [],\n optionalMethodList: []\n },\n loadingOverlayComponent: {\n mandatoryMethodList: [],\n optionalMethodList: []\n },\n noRowsOverlayComponent: {\n mandatoryMethodList: [],\n optionalMethodList: []\n },\n floatingFilterComponent: {\n mandatoryMethodList: ['onParentModelChanged'],\n optionalMethodList: ['afterGuiAttached']\n },\n floatingFilterWrapperComponent: {\n mandatoryMethodList: [],\n optionalMethodList: []\n },\n cellRenderer: {\n mandatoryMethodList: [],\n optionalMethodList: ['refresh', 'afterGuiAttached'],\n functionAdapter: this.agComponentUtils.adaptCellRendererFunction.bind(this.agComponentUtils)\n },\n cellEditor: {\n mandatoryMethodList: ['getValue'],\n optionalMethodList: ['isPopup', 'isCancelBeforeStart', 'isCancelAfterEnd', 'getPopupPosition', 'focusIn', 'focusOut', 'afterGuiAttached']\n },\n innerRenderer: {\n mandatoryMethodList: [],\n optionalMethodList: ['afterGuiAttached'],\n functionAdapter: this.agComponentUtils.adaptCellRendererFunction.bind(this.agComponentUtils)\n },\n fullWidthCellRenderer: {\n mandatoryMethodList: [],\n optionalMethodList: ['refresh', 'afterGuiAttached'],\n functionAdapter: this.agComponentUtils.adaptCellRendererFunction.bind(this.agComponentUtils)\n },\n pinnedRowCellRenderer: {\n mandatoryMethodList: [],\n optionalMethodList: ['refresh', 'afterGuiAttached'],\n functionAdapter: this.agComponentUtils.adaptCellRendererFunction.bind(this.agComponentUtils)\n },\n groupRowRenderer: {\n mandatoryMethodList: [],\n optionalMethodList: ['afterGuiAttached'],\n functionAdapter: this.agComponentUtils.adaptCellRendererFunction.bind(this.agComponentUtils)\n },\n filter: {\n mandatoryMethodList: ['isFilterActive', 'doesFilterPass', 'getModel', 'setModel'],\n optionalMethodList: ['afterGuiAttached', 'onNewRowsLoaded', 'getModelAsString', 'onFloatingFilterChanged']\n },\n filterComponent: {\n mandatoryMethodList: ['isFilterActive', 'doesFilterPass', 'getModel', 'setModel'],\n optionalMethodList: ['afterGuiAttached', 'onNewRowsLoaded', 'getModelAsString', 'onFloatingFilterChanged']\n },\n statusPanel: {\n mandatoryMethodList: [],\n optionalMethodList: ['afterGuiAttached'],\n },\n toolPanel: {\n mandatoryMethodList: [],\n optionalMethodList: ['refresh', 'afterGuiAttached']\n },\n tooltipComponent: {\n mandatoryMethodList: [],\n optionalMethodList: []\n }\n };\n };\n ComponentMetadataProvider.prototype.retrieve = function (name) {\n return this.componentMetaData[name];\n };\n __decorate$1m([\n Autowired(\"agComponentUtils\")\n ], ComponentMetadataProvider.prototype, \"agComponentUtils\", void 0);\n __decorate$1m([\n PostConstruct\n ], ComponentMetadataProvider.prototype, \"postConstruct\", null);\n ComponentMetadataProvider = __decorate$1m([\n Bean(\"componentMetadataProvider\")\n ], ComponentMetadataProvider);\n return ComponentMetadataProvider;\n}(BeanStub));\n\n/**\n * @ag-grid-community/core - Advanced Data Grid / Data Table supporting Javascript / React / AngularJS / Web Components\n * @version v25.1.0\n * @link http://www.ag-grid.com/\n * @license MIT\n */\nvar __decorate$1n = (undefined && undefined.__decorate) || function (decorators, target, key, desc) {\n var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d;\n if (typeof Reflect === \"object\" && typeof Reflect.decorate === \"function\") r = Reflect.decorate(decorators, target, key, desc);\n else for (var i = decorators.length - 1; i >= 0; i--) if (d = decorators[i]) r = (c < 3 ? d(r) : c > 3 ? d(target, key, r) : d(target, key)) || r;\n return c > 3 && r && Object.defineProperty(target, key, r), r;\n};\n/** Using the IoC has a slight performance consideration, which is no problem most of the\n * time, unless we are trashing objects - which is the case when scrolling and rowComp\n * and cellComp. So for performance reasons, RowComp and CellComp do not get autowired\n * with the IoC. Instead they get passed this object which is all the beans the RowComp\n * and CellComp need. Not autowiring all the cells gives performance improvement. */\nvar Beans = /** @class */ (function () {\n function Beans() {\n }\n Beans.prototype.registerGridComp = function (gridPanel) {\n this.gridPanel = gridPanel;\n };\n Beans.prototype.postConstruct = function () {\n this.doingMasterDetail = this.gridOptionsWrapper.isMasterDetail();\n if (this.gridOptionsWrapper.isRowModelDefault()) {\n this.clientSideRowModel = this.rowModel;\n }\n if (this.gridOptionsWrapper.isRowModelServerSide()) {\n this.serverSideRowModel = this.rowModel;\n }\n };\n __decorate$1n([\n Autowired('resizeObserverService')\n ], Beans.prototype, \"resizeObserverService\", void 0);\n __decorate$1n([\n Autowired('paginationProxy')\n ], Beans.prototype, \"paginationProxy\", void 0);\n __decorate$1n([\n Autowired('context')\n ], Beans.prototype, \"context\", void 0);\n __decorate$1n([\n Autowired('columnApi')\n ], Beans.prototype, \"columnApi\", void 0);\n __decorate$1n([\n Autowired('gridApi')\n ], Beans.prototype, \"gridApi\", void 0);\n __decorate$1n([\n Autowired('gridOptionsWrapper')\n ], Beans.prototype, \"gridOptionsWrapper\", void 0);\n __decorate$1n([\n Autowired('expressionService')\n ], Beans.prototype, \"expressionService\", void 0);\n __decorate$1n([\n Autowired('rowRenderer')\n ], Beans.prototype, \"rowRenderer\", void 0);\n __decorate$1n([\n Autowired('$compile')\n ], Beans.prototype, \"$compile\", void 0);\n __decorate$1n([\n Autowired('templateService')\n ], Beans.prototype, \"templateService\", void 0);\n __decorate$1n([\n Autowired('valueService')\n ], Beans.prototype, \"valueService\", void 0);\n __decorate$1n([\n Autowired('eventService')\n ], Beans.prototype, \"eventService\", void 0);\n __decorate$1n([\n Autowired('columnController')\n ], Beans.prototype, \"columnController\", void 0);\n __decorate$1n([\n Autowired('headerNavigationService')\n ], Beans.prototype, \"headerNavigationService\", void 0);\n __decorate$1n([\n Autowired('columnAnimationService')\n ], Beans.prototype, \"columnAnimationService\", void 0);\n __decorate$1n([\n Optional('rangeController')\n ], Beans.prototype, \"rangeController\", void 0);\n __decorate$1n([\n Autowired('focusController')\n ], Beans.prototype, \"focusController\", void 0);\n __decorate$1n([\n Optional('contextMenuFactory')\n ], Beans.prototype, \"contextMenuFactory\", void 0);\n __decorate$1n([\n Autowired('popupService')\n ], Beans.prototype, \"popupService\", void 0);\n __decorate$1n([\n Autowired('valueFormatterService')\n ], Beans.prototype, \"valueFormatterService\", void 0);\n __decorate$1n([\n Autowired('stylingService')\n ], Beans.prototype, \"stylingService\", void 0);\n __decorate$1n([\n Autowired('columnHoverService')\n ], Beans.prototype, \"columnHoverService\", void 0);\n __decorate$1n([\n Autowired('userComponentFactory')\n ], Beans.prototype, \"userComponentFactory\", void 0);\n __decorate$1n([\n Autowired('animationFrameService')\n ], Beans.prototype, \"taskQueue\", void 0);\n __decorate$1n([\n Autowired('dragAndDropService')\n ], Beans.prototype, \"dragAndDropService\", void 0);\n __decorate$1n([\n Autowired('sortController')\n ], Beans.prototype, \"sortController\", void 0);\n __decorate$1n([\n Autowired('filterManager')\n ], Beans.prototype, \"filterManager\", void 0);\n __decorate$1n([\n Autowired('maxDivHeightScaler')\n ], Beans.prototype, \"maxDivHeightScaler\", void 0);\n __decorate$1n([\n Autowired('frameworkOverrides')\n ], Beans.prototype, \"frameworkOverrides\", void 0);\n __decorate$1n([\n Autowired('detailRowCompCache')\n ], Beans.prototype, \"detailRowCompCache\", void 0);\n __decorate$1n([\n Autowired('cellPositionUtils')\n ], Beans.prototype, \"cellPositionUtils\", void 0);\n __decorate$1n([\n Autowired('rowPositionUtils')\n ], Beans.prototype, \"rowPositionUtils\", void 0);\n __decorate$1n([\n Autowired('selectionController')\n ], Beans.prototype, \"selectionController\", void 0);\n __decorate$1n([\n Optional('selectionHandleFactory')\n ], Beans.prototype, \"selectionHandleFactory\", void 0);\n __decorate$1n([\n Autowired('rowCssClassCalculator')\n ], Beans.prototype, \"rowCssClassCalculator\", void 0);\n __decorate$1n([\n Autowired('rowModel')\n ], Beans.prototype, \"rowModel\", void 0);\n __decorate$1n([\n PostConstruct\n ], Beans.prototype, \"postConstruct\", null);\n Beans = __decorate$1n([\n Bean('beans')\n ], Beans);\n return Beans;\n}());\n\n/**\n * @ag-grid-community/core - Advanced Data Grid / Data Table supporting Javascript / React / AngularJS / Web Components\n * @version v25.1.0\n * @link http://www.ag-grid.com/\n * @license MIT\n */\nvar __extends$1t = (undefined && undefined.__extends) || (function () {\n var extendStatics = function (d, b) {\n extendStatics = Object.setPrototypeOf ||\n ({ __proto__: [] } instanceof Array && function (d, b) { d.__proto__ = b; }) ||\n function (d, b) { for (var p in b) if (b.hasOwnProperty(p)) d[p] = b[p]; };\n return extendStatics(d, b);\n };\n return function (d, b) {\n extendStatics(d, b);\n function __() { this.constructor = d; }\n d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __());\n };\n})();\nvar __decorate$1o = (undefined && undefined.__decorate) || function (decorators, target, key, desc) {\n var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d;\n if (typeof Reflect === \"object\" && typeof Reflect.decorate === \"function\") r = Reflect.decorate(decorators, target, key, desc);\n else for (var i = decorators.length - 1; i >= 0; i--) if (d = decorators[i]) r = (c < 3 ? d(r) : c > 3 ? d(target, key, r) : d(target, key)) || r;\n return c > 3 && r && Object.defineProperty(target, key, r), r;\n};\nvar MAT_GRID_SIZE = 8;\nvar BASE_GRID_SIZE = 4;\nvar BALHAM_GRID_SIZE = 4;\nvar ALPINE_GRID_SIZE = 6;\nvar HARD_CODED_SIZES = {\n // this item is required for custom themes\n 'ag-theme-custom': {\n headerHeight: 25,\n headerCellMinWidth: 24,\n listItemHeight: BASE_GRID_SIZE * 5,\n rowHeight: 25,\n chartMenuPanelWidth: 220\n },\n 'ag-theme-material': {\n headerHeight: MAT_GRID_SIZE * 7,\n headerCellMinWidth: 48,\n listItemHeight: MAT_GRID_SIZE * 4,\n rowHeight: MAT_GRID_SIZE * 6,\n chartMenuPanelWidth: 240\n },\n 'ag-theme-balham': {\n headerHeight: BALHAM_GRID_SIZE * 8,\n headerCellMinWidth: 24,\n listItemHeight: BALHAM_GRID_SIZE * 6,\n rowHeight: BALHAM_GRID_SIZE * 7,\n chartMenuPanelWidth: 220\n },\n 'ag-theme-alpine': {\n headerHeight: ALPINE_GRID_SIZE * 8,\n headerCellMinWidth: 36,\n listItemHeight: ALPINE_GRID_SIZE * 4,\n rowHeight: ALPINE_GRID_SIZE * 7,\n chartMenuPanelWidth: 240\n }\n};\n/**\n * this object contains a list of Sass variables and an array\n * of CSS styles required to get the correct value.\n * eg. $virtual-item-height requires a structure, so we can get its height.\n *
\n *
\n *
\n *
\n *
\n */\nvar SASS_PROPERTY_BUILDER = {\n headerHeight: ['ag-header-row'],\n headerCellMinWidth: ['ag-header-cell'],\n listItemHeight: ['ag-virtual-list-item'],\n rowHeight: ['ag-row'],\n chartMenuPanelWidth: ['ag-chart-docked-container']\n};\nvar CALCULATED_SIZES = {};\nvar Environment = /** @class */ (function (_super) {\n __extends$1t(Environment, _super);\n function Environment() {\n return _super !== null && _super.apply(this, arguments) || this;\n }\n Environment.prototype.getSassVariable = function (theme, key) {\n var useTheme = 'ag-theme-' + (theme.match('material') ? 'material' : theme.match('balham') ? 'balham' : theme.match('alpine') ? 'alpine' : 'custom');\n var defaultValue = HARD_CODED_SIZES[useTheme][key];\n var calculatedValue = 0;\n if (!CALCULATED_SIZES[theme]) {\n CALCULATED_SIZES[theme] = {};\n }\n var size = CALCULATED_SIZES[theme][key];\n if (size != null) {\n return size;\n }\n if (SASS_PROPERTY_BUILDER[key]) {\n var classList = SASS_PROPERTY_BUILDER[key];\n var div = document.createElement('div');\n addCssClass(div, theme);\n div.style.position = 'absolute';\n var el = classList.reduce(function (prevEl, currentClass) {\n var currentDiv = document.createElement('div');\n currentDiv.style.position = 'static';\n addCssClass(currentDiv, currentClass);\n prevEl.appendChild(currentDiv);\n return currentDiv;\n }, div);\n if (document.body) {\n document.body.appendChild(div);\n var sizeName = key.toLowerCase().indexOf('height') !== -1 ? 'height' : 'width';\n calculatedValue = parseInt(window.getComputedStyle(el)[sizeName], 10);\n document.body.removeChild(div);\n }\n }\n CALCULATED_SIZES[theme][key] = calculatedValue || defaultValue;\n return CALCULATED_SIZES[theme][key];\n };\n Environment.prototype.isThemeDark = function () {\n var theme = this.getTheme().theme;\n return !!theme && theme.indexOf('dark') >= 0;\n };\n Environment.prototype.chartMenuPanelWidth = function () {\n var theme = this.getTheme().themeFamily;\n return this.getSassVariable(theme, 'chartMenuPanelWidth');\n };\n Environment.prototype.getTheme = function () {\n var reg = /\\bag-(material|(?:theme-([\\w\\-]*)))\\b/;\n var el = this.eGridDiv;\n var themeMatch = null;\n while (el) {\n themeMatch = reg.exec(el.className);\n if (!themeMatch) {\n el = el.parentElement || undefined;\n }\n else {\n break;\n }\n }\n if (!themeMatch) {\n return {};\n }\n var theme = themeMatch[0];\n var usingOldTheme = themeMatch[2] === undefined;\n if (usingOldTheme) {\n var newTheme_1 = theme.replace('ag-', 'ag-theme-');\n doOnce(function () { return console.warn(\"AG Grid: As of v19 old theme are no longer provided. Please replace \" + theme + \" with \" + newTheme_1 + \".\"); }, 'using-old-theme');\n }\n return { theme: theme, el: el, themeFamily: theme.replace(/-dark$/, '') };\n };\n __decorate$1o([\n Autowired('eGridDiv')\n ], Environment.prototype, \"eGridDiv\", void 0);\n Environment = __decorate$1o([\n Bean('environment')\n ], Environment);\n return Environment;\n}(BeanStub));\n\n/**\n * @ag-grid-community/core - Advanced Data Grid / Data Table supporting Javascript / React / AngularJS / Web Components\n * @version v25.1.0\n * @link http://www.ag-grid.com/\n * @license MIT\n */\nvar __extends$1u = (undefined && undefined.__extends) || (function () {\n var extendStatics = function (d, b) {\n extendStatics = Object.setPrototypeOf ||\n ({ __proto__: [] } instanceof Array && function (d, b) { d.__proto__ = b; }) ||\n function (d, b) { for (var p in b) if (b.hasOwnProperty(p)) d[p] = b[p]; };\n return extendStatics(d, b);\n };\n return function (d, b) {\n extendStatics(d, b);\n function __() { this.constructor = d; }\n d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __());\n };\n})();\nvar __decorate$1p = (undefined && undefined.__decorate) || function (decorators, target, key, desc) {\n var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d;\n if (typeof Reflect === \"object\" && typeof Reflect.decorate === \"function\") r = Reflect.decorate(decorators, target, key, desc);\n else for (var i = decorators.length - 1; i >= 0; i--) if (d = decorators[i]) r = (c < 3 ? d(r) : c > 3 ? d(target, key, r) : d(target, key)) || r;\n return c > 3 && r && Object.defineProperty(target, key, r), r;\n};\nvar AnimationFrameService = /** @class */ (function (_super) {\n __extends$1u(AnimationFrameService, _super);\n function AnimationFrameService() {\n var _this = _super !== null && _super.apply(this, arguments) || this;\n // p1 and p2 are create tasks are to do with row and cell creation.\n // for them we want to execute according to row order, so we use\n // TaskItem so we know what index the item is for.\n _this.createTasksP1 = { list: [], sorted: false }; // eg drawing back-ground of rows\n _this.createTasksP2 = { list: [], sorted: false }; // eg cell renderers, adding hover functionality\n // destroy tasks are to do with row removal. they are done after row creation as the user will need to see new\n // rows first (as blank is scrolled into view), when we remove the old rows (no longer in view) is not as\n // important.\n _this.destroyTasks = [];\n _this.ticking = false;\n // we need to know direction of scroll, to build up rows in the direction of\n // the scroll. eg if user scrolls down, we extend the rows by building down.\n _this.scrollGoingDown = true;\n _this.lastScrollTop = 0;\n _this.taskCount = 0;\n _this.cancelledTasks = new Set();\n return _this;\n }\n AnimationFrameService.prototype.setScrollTop = function (scrollTop) {\n this.scrollGoingDown = scrollTop > this.lastScrollTop;\n this.lastScrollTop = scrollTop;\n };\n AnimationFrameService.prototype.init = function () {\n this.useAnimationFrame = !this.gridOptionsWrapper.isSuppressAnimationFrame();\n };\n AnimationFrameService.prototype.registerGridComp = function (gridPanel) {\n this.gridPanel = gridPanel;\n };\n // this method is for our AG Grid sanity only - if animation frames are turned off,\n // then no place in the code should be looking to add any work to be done in animation\n // frames. this stops bugs - where some code is asking for a frame to be executed\n // when it should not.\n AnimationFrameService.prototype.verifyAnimationFrameOn = function (methodName) {\n if (this.useAnimationFrame === false) {\n console.warn(\"AG Grid: AnimationFrameService.\" + methodName + \" called but animation frames are off\");\n }\n };\n AnimationFrameService.prototype.createTask = function (task, index, list) {\n this.verifyAnimationFrameOn(list);\n var taskItem = { task: task, index: index, createOrder: ++this.taskCount };\n this.addTaskToList(this[list], taskItem);\n this.schedule();\n };\n AnimationFrameService.prototype.cancelTask = function (task) {\n this.cancelledTasks.add(task);\n };\n AnimationFrameService.prototype.addTaskToList = function (taskList, task) {\n taskList.list.push(task);\n taskList.sorted = false;\n };\n AnimationFrameService.prototype.sortTaskList = function (taskList) {\n if (taskList.sorted) {\n return;\n }\n var sortDirection = this.scrollGoingDown ? 1 : -1;\n // sort first by row index (taking into account scroll direction), then by\n // order of task creation (always ascending, so cells will render left-to-right)\n taskList.list.sort(function (a, b) { return a.index !== b.index ? sortDirection * (b.index - a.index) : b.createOrder - a.createOrder; });\n taskList.sorted = true;\n };\n AnimationFrameService.prototype.addDestroyTask = function (task) {\n this.verifyAnimationFrameOn('createTasksP3');\n this.destroyTasks.push(task);\n this.schedule();\n };\n AnimationFrameService.prototype.executeFrame = function (millis) {\n this.verifyAnimationFrameOn('executeFrame');\n var p1TaskList = this.createTasksP1;\n var p1Tasks = p1TaskList.list;\n var p2TaskList = this.createTasksP2;\n var p2Tasks = p2TaskList.list;\n var destroyTasks = this.destroyTasks;\n var frameStart = new Date().getTime();\n var duration = (new Date().getTime()) - frameStart;\n // 16ms is 60 fps\n var noMaxMillis = millis <= 0;\n while (noMaxMillis || duration < millis) {\n if (!this.gridPanel.executeAnimationFrameScroll()) {\n var task = void 0;\n if (p1Tasks.length) {\n this.sortTaskList(p1TaskList);\n task = p1Tasks.pop().task;\n }\n else if (p2Tasks.length) {\n this.sortTaskList(p2TaskList);\n task = p2Tasks.pop().task;\n }\n else if (destroyTasks.length) {\n task = destroyTasks.pop();\n }\n else {\n this.cancelledTasks.clear();\n break;\n }\n if (!this.cancelledTasks.has(task)) {\n task();\n }\n }\n duration = (new Date().getTime()) - frameStart;\n }\n if (p1Tasks.length || p2Tasks.length || destroyTasks.length) {\n this.requestFrame();\n }\n else {\n this.stopTicking();\n }\n };\n AnimationFrameService.prototype.stopTicking = function () {\n this.ticking = false;\n var event = {\n type: Events.EVENT_ANIMATION_QUEUE_EMPTY,\n columnApi: this.gridOptionsWrapper.getColumnApi(),\n api: this.gridOptionsWrapper.getApi()\n };\n this.eventService.dispatchEvent(event);\n };\n AnimationFrameService.prototype.flushAllFrames = function () {\n if (!this.useAnimationFrame) {\n return;\n }\n this.executeFrame(-1);\n };\n AnimationFrameService.prototype.schedule = function () {\n if (!this.useAnimationFrame) {\n return;\n }\n if (!this.ticking) {\n this.ticking = true;\n this.requestFrame();\n }\n };\n AnimationFrameService.prototype.requestFrame = function () {\n // check for the existence of requestAnimationFrame, and if\n // it's missing, then we polyfill it with setTimeout()\n var callback = this.executeFrame.bind(this, 60);\n if (window.requestAnimationFrame) {\n window.requestAnimationFrame(callback);\n }\n else if (window.webkitRequestAnimationFrame) {\n window.webkitRequestAnimationFrame(callback);\n }\n else {\n window.setTimeout(callback, 0);\n }\n };\n AnimationFrameService.prototype.isQueueEmpty = function () {\n return !this.ticking;\n };\n __decorate$1p([\n PostConstruct\n ], AnimationFrameService.prototype, \"init\", null);\n AnimationFrameService = __decorate$1p([\n Bean('animationFrameService')\n ], AnimationFrameService);\n return AnimationFrameService;\n}(BeanStub));\n\n/**\n * @ag-grid-community/core - Advanced Data Grid / Data Table supporting Javascript / React / AngularJS / Web Components\n * @version v25.1.0\n * @link http://www.ag-grid.com/\n * @license MIT\n */\nvar __extends$1v = (undefined && undefined.__extends) || (function () {\n var extendStatics = function (d, b) {\n extendStatics = Object.setPrototypeOf ||\n ({ __proto__: [] } instanceof Array && function (d, b) { d.__proto__ = b; }) ||\n function (d, b) { for (var p in b) if (b.hasOwnProperty(p)) d[p] = b[p]; };\n return extendStatics(d, b);\n };\n return function (d, b) {\n extendStatics(d, b);\n function __() { this.constructor = d; }\n d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __());\n };\n})();\nvar __decorate$1q = (undefined && undefined.__decorate) || function (decorators, target, key, desc) {\n var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d;\n if (typeof Reflect === \"object\" && typeof Reflect.decorate === \"function\") r = Reflect.decorate(decorators, target, key, desc);\n else for (var i = decorators.length - 1; i >= 0; i--) if (d = decorators[i]) r = (c < 3 ? d(r) : c > 3 ? d(target, key, r) : d(target, key)) || r;\n return c > 3 && r && Object.defineProperty(target, key, r), r;\n};\nvar NavigationService = /** @class */ (function (_super) {\n __extends$1v(NavigationService, _super);\n function NavigationService() {\n var _this = _super !== null && _super.apply(this, arguments) || this;\n _this.timeLastPageEventProcessed = 0;\n return _this;\n }\n NavigationService.prototype.registerGridComp = function (gridPanel) {\n this.gridPanel = gridPanel;\n };\n NavigationService.prototype.handlePageScrollingKey = function (event) {\n var key = event.which || event.keyCode;\n var alt = event.altKey;\n var ctrl = event.ctrlKey || event.metaKey;\n var currentCell = this.mouseEventService.getCellPositionForEvent(event);\n if (!currentCell) {\n return false;\n }\n var processed = false;\n switch (key) {\n case KeyCode.PAGE_HOME:\n case KeyCode.PAGE_END:\n // handle home and end when ctrl & alt are NOT pressed\n if (!ctrl && !alt) {\n this.onHomeOrEndKey(key);\n processed = true;\n }\n break;\n case KeyCode.LEFT:\n case KeyCode.RIGHT:\n // handle left and right when ctrl is pressed only\n if (ctrl && !alt) {\n this.onCtrlLeftOrRight(key, currentCell);\n processed = true;\n }\n break;\n case KeyCode.UP:\n case KeyCode.DOWN:\n // handle up and down when ctrl is pressed only\n if (ctrl && !alt) {\n this.onCtrlUpOrDown(key, currentCell);\n processed = true;\n }\n break;\n case KeyCode.PAGE_DOWN:\n // handle page up and page down when ctrl & alt are NOT pressed\n if (!ctrl && !alt) {\n this.onPageDown(currentCell);\n processed = true;\n }\n break;\n case KeyCode.PAGE_UP:\n // handle page up and page down when ctrl & alt are NOT pressed\n if (!ctrl && !alt) {\n this.onPageUp(currentCell);\n processed = true;\n }\n break;\n }\n if (processed) {\n event.preventDefault();\n }\n return processed;\n };\n // the page up/down keys caused a problem, in that if the user\n // held the page up/down key down, lots of events got generated,\n // which clogged up the event queue (as they take time to process)\n // which in turn froze the grid. Logic below makes sure we wait 100ms\n // between processing the page up/down events, so when user has finger\n // held down on key, we ignore page up/down events until 100ms has passed,\n // which effectively empties the queue of page up/down events.\n NavigationService.prototype.isTimeSinceLastPageEventToRecent = function () {\n var now = new Date().getTime();\n var diff = now - this.timeLastPageEventProcessed;\n return (diff < 100);\n };\n NavigationService.prototype.setTimeLastPageEventProcessed = function () {\n this.timeLastPageEventProcessed = new Date().getTime();\n };\n NavigationService.prototype.navigateTo = function (navigateParams) {\n var scrollIndex = navigateParams.scrollIndex, scrollType = navigateParams.scrollType, scrollColumn = navigateParams.scrollColumn, focusIndex = navigateParams.focusIndex, focusColumn = navigateParams.focusColumn;\n if (exists(scrollColumn)) {\n this.gridPanel.ensureColumnVisible(scrollColumn);\n }\n if (exists(scrollIndex)) {\n this.gridPanel.ensureIndexVisible(scrollIndex, scrollType);\n }\n // make sure the cell is rendered, needed if we are to focus\n this.animationFrameService.flushAllFrames();\n // if we don't do this, the range will be left on the last cell, which will leave the last focused cell\n // highlighted.\n this.focusController.setFocusedCell(focusIndex, focusColumn, null, true);\n if (this.rangeController) {\n var cellPosition = { rowIndex: focusIndex, rowPinned: null, column: focusColumn };\n this.rangeController.setRangeToCell(cellPosition);\n }\n };\n NavigationService.prototype.onPageDown = function (gridCell) {\n if (this.isTimeSinceLastPageEventToRecent()) {\n return;\n }\n var scrollPosition = this.gridPanel.getVScrollPosition();\n var scrollbarWidth = this.gridOptionsWrapper.getScrollbarWidth();\n var pixelsInOnePage = scrollPosition.bottom - scrollPosition.top;\n if (this.gridPanel.isHorizontalScrollShowing()) {\n pixelsInOnePage -= scrollbarWidth;\n }\n var pagingPixelOffset = this.paginationProxy.getPixelOffset();\n var currentPageBottomPixel = scrollPosition.top + pixelsInOnePage;\n var currentPageBottomRow = this.paginationProxy.getRowIndexAtPixel(currentPageBottomPixel + pagingPixelOffset);\n var scrollIndex = currentPageBottomRow;\n var currentCellPixel = this.paginationProxy.getRow(gridCell.rowIndex).rowTop;\n var nextCellPixel = currentCellPixel + pixelsInOnePage - pagingPixelOffset;\n var focusIndex = this.paginationProxy.getRowIndexAtPixel(nextCellPixel + pagingPixelOffset);\n var pageLastRow = this.paginationProxy.getPageLastRow();\n if (focusIndex > pageLastRow) {\n focusIndex = pageLastRow;\n }\n if (scrollIndex > pageLastRow) {\n scrollIndex = pageLastRow;\n }\n this.navigateTo({\n scrollIndex: scrollIndex,\n scrollType: 'top',\n scrollColumn: null,\n focusIndex: focusIndex,\n focusColumn: gridCell.column\n });\n this.setTimeLastPageEventProcessed();\n };\n NavigationService.prototype.onPageUp = function (gridCell) {\n if (this.isTimeSinceLastPageEventToRecent()) {\n return;\n }\n var scrollPosition = this.gridPanel.getVScrollPosition();\n var scrollbarWidth = this.gridOptionsWrapper.getScrollbarWidth();\n var pixelsInOnePage = scrollPosition.bottom - scrollPosition.top;\n if (this.gridPanel.isHorizontalScrollShowing()) {\n pixelsInOnePage -= scrollbarWidth;\n }\n var pagingPixelOffset = this.paginationProxy.getPixelOffset();\n var currentPageTopPixel = scrollPosition.top;\n var currentPageTopRow = this.paginationProxy.getRowIndexAtPixel(currentPageTopPixel + pagingPixelOffset);\n var scrollIndex = currentPageTopRow;\n var currentRowNode = this.paginationProxy.getRow(gridCell.rowIndex);\n var nextCellPixel = currentRowNode.rowTop + currentRowNode.rowHeight - pixelsInOnePage - pagingPixelOffset;\n var focusIndex = this.paginationProxy.getRowIndexAtPixel(nextCellPixel + pagingPixelOffset);\n var firstRow = this.paginationProxy.getPageFirstRow();\n if (focusIndex < firstRow) {\n focusIndex = firstRow;\n }\n if (scrollIndex < firstRow) {\n scrollIndex = firstRow;\n }\n this.navigateTo({\n scrollIndex: scrollIndex,\n scrollType: 'bottom',\n scrollColumn: null,\n focusIndex: focusIndex,\n focusColumn: gridCell.column\n });\n this.setTimeLastPageEventProcessed();\n };\n NavigationService.prototype.getIndexToFocus = function (indexToScrollTo, isDown) {\n var indexToFocus = indexToScrollTo;\n // for SSRM, when user hits ctrl+down, we can end up trying to focus the loading row.\n // instead we focus the last row with data instead.\n if (isDown) {\n var node = this.paginationProxy.getRow(indexToScrollTo);\n if (node && node.stub) {\n indexToFocus -= 1;\n }\n }\n return indexToFocus;\n };\n // ctrl + up/down will bring focus to same column, first/last row. no horizontal scrolling.\n NavigationService.prototype.onCtrlUpOrDown = function (key, gridCell) {\n var upKey = key === KeyCode.UP;\n var rowIndexToScrollTo = upKey ? this.paginationProxy.getPageFirstRow() : this.paginationProxy.getPageLastRow();\n this.navigateTo({\n scrollIndex: rowIndexToScrollTo,\n scrollType: null,\n scrollColumn: gridCell.column,\n focusIndex: this.getIndexToFocus(rowIndexToScrollTo, !upKey),\n focusColumn: gridCell.column\n });\n };\n // ctrl + left/right will bring focus to same row, first/last cell. no vertical scrolling.\n NavigationService.prototype.onCtrlLeftOrRight = function (key, gridCell) {\n var leftKey = key === KeyCode.LEFT;\n var allColumns = this.columnController.getAllDisplayedColumns();\n var columnToSelect = leftKey ? allColumns[0] : last(allColumns);\n this.navigateTo({\n scrollIndex: gridCell.rowIndex,\n scrollType: null,\n scrollColumn: columnToSelect,\n focusIndex: gridCell.rowIndex,\n focusColumn: columnToSelect\n });\n };\n // home brings focus to top left cell, end brings focus to bottom right, grid scrolled to bring\n // same cell into view (which means either scroll all the way up, or all the way down).\n NavigationService.prototype.onHomeOrEndKey = function (key) {\n var homeKey = key === KeyCode.PAGE_HOME;\n var allColumns = this.columnController.getAllDisplayedColumns();\n var columnToSelect = homeKey ? allColumns[0] : last(allColumns);\n var scrollIndex = homeKey ? this.paginationProxy.getPageFirstRow() : this.paginationProxy.getPageLastRow();\n this.navigateTo({\n scrollIndex: scrollIndex,\n scrollType: null,\n scrollColumn: columnToSelect,\n focusIndex: this.getIndexToFocus(scrollIndex, !homeKey),\n focusColumn: columnToSelect\n });\n };\n __decorate$1q([\n Autowired('mouseEventService')\n ], NavigationService.prototype, \"mouseEventService\", void 0);\n __decorate$1q([\n Autowired('paginationProxy')\n ], NavigationService.prototype, \"paginationProxy\", void 0);\n __decorate$1q([\n Autowired('focusController')\n ], NavigationService.prototype, \"focusController\", void 0);\n __decorate$1q([\n Autowired('animationFrameService')\n ], NavigationService.prototype, \"animationFrameService\", void 0);\n __decorate$1q([\n Optional('rangeController')\n ], NavigationService.prototype, \"rangeController\", void 0);\n __decorate$1q([\n Autowired('columnController')\n ], NavigationService.prototype, \"columnController\", void 0);\n NavigationService = __decorate$1q([\n Bean('navigationService')\n ], NavigationService);\n return NavigationService;\n}(BeanStub));\n\n/**\n * @ag-grid-community/core - Advanced Data Grid / Data Table supporting Javascript / React / AngularJS / Web Components\n * @version v25.1.0\n * @link http://www.ag-grid.com/\n * @license MIT\n */\nvar __extends$1w = (undefined && undefined.__extends) || (function () {\n var extendStatics = function (d, b) {\n extendStatics = Object.setPrototypeOf ||\n ({ __proto__: [] } instanceof Array && function (d, b) { d.__proto__ = b; }) ||\n function (d, b) { for (var p in b) if (b.hasOwnProperty(p)) d[p] = b[p]; };\n return extendStatics(d, b);\n };\n return function (d, b) {\n extendStatics(d, b);\n function __() { this.constructor = d; }\n d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __());\n };\n})();\nvar __decorate$1r = (undefined && undefined.__decorate) || function (decorators, target, key, desc) {\n var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d;\n if (typeof Reflect === \"object\" && typeof Reflect.decorate === \"function\") r = Reflect.decorate(decorators, target, key, desc);\n else for (var i = decorators.length - 1; i >= 0; i--) if (d = decorators[i]) r = (c < 3 ? d(r) : c > 3 ? d(target, key, r) : d(target, key)) || r;\n return c > 3 && r && Object.defineProperty(target, key, r), r;\n};\n/**\n * This class solves the 'max height' problem, where the user might want to show more data than\n * the max div height actually allows.\n */\nvar MaxDivHeightScaler = /** @class */ (function (_super) {\n __extends$1w(MaxDivHeightScaler, _super);\n function MaxDivHeightScaler() {\n var _this = _super !== null && _super.apply(this, arguments) || this;\n // the scrollY position\n _this.scrollY = 0;\n // how tall the body is\n _this.uiBodyHeight = 0;\n return _this;\n }\n MaxDivHeightScaler.prototype.postConstruct = function () {\n this.addManagedListener(this.eventService, Events.EVENT_BODY_HEIGHT_CHANGED, this.updateOffset.bind(this));\n this.maxDivHeight = getMaxDivHeight();\n };\n MaxDivHeightScaler.prototype.registerGridComp = function (gridPanel) {\n this.gridPanel = gridPanel;\n };\n MaxDivHeightScaler.prototype.isScaling = function () {\n return this.scaling;\n };\n MaxDivHeightScaler.prototype.getOffset = function () {\n return this.offset;\n };\n MaxDivHeightScaler.prototype.updateOffset = function () {\n if (!this.scaling) {\n return;\n }\n var newScrollY = this.gridPanel.getVScrollPosition().top;\n var newBodyHeight = this.getUiBodyHeight();\n var atLeastOneChanged = newScrollY !== this.scrollY || newBodyHeight !== this.uiBodyHeight;\n if (atLeastOneChanged) {\n this.scrollY = newScrollY;\n this.uiBodyHeight = newBodyHeight;\n this.calculateOffset();\n }\n };\n MaxDivHeightScaler.prototype.calculateOffset = function () {\n this.uiContainerHeight = this.maxDivHeight;\n this.pixelsToShave = this.modelHeight - this.uiContainerHeight;\n this.maxScrollY = this.uiContainerHeight - this.uiBodyHeight;\n var scrollPercent = this.scrollY / this.maxScrollY;\n this.setOffset(scrollPercent * this.pixelsToShave);\n };\n MaxDivHeightScaler.prototype.clearOffset = function () {\n this.uiContainerHeight = this.modelHeight;\n this.pixelsToShave = 0;\n this.setOffset(0);\n };\n MaxDivHeightScaler.prototype.setOffset = function (newOffset) {\n // because we are talking pixels, no point in confusing things with half numbers\n var newOffsetFloor = typeof newOffset === 'number' ? Math.floor(newOffset) : null;\n if (this.offset === newOffsetFloor) {\n return;\n }\n this.offset = newOffsetFloor;\n this.eventService.dispatchEvent({ type: Events.EVENT_HEIGHT_SCALE_CHANGED });\n };\n MaxDivHeightScaler.prototype.setModelHeight = function (modelHeight) {\n this.modelHeight = modelHeight;\n this.scaling = this.maxDivHeight > 0 && modelHeight > this.maxDivHeight;\n if (this.scaling) {\n this.calculateOffset();\n }\n else {\n this.clearOffset();\n }\n };\n MaxDivHeightScaler.prototype.getUiContainerHeight = function () {\n return this.uiContainerHeight;\n };\n MaxDivHeightScaler.prototype.getRealPixelPosition = function (modelPixel) {\n return modelPixel - this.offset;\n };\n MaxDivHeightScaler.prototype.getUiBodyHeight = function () {\n var pos = this.gridPanel.getVScrollPosition();\n return pos.bottom - pos.top;\n };\n MaxDivHeightScaler.prototype.getScrollPositionForPixel = function (rowTop) {\n if (this.pixelsToShave <= 0) {\n return rowTop;\n }\n var modelMaxScroll = this.modelHeight - this.getUiBodyHeight();\n var scrollPercent = rowTop / modelMaxScroll;\n var scrollPixel = this.maxScrollY * scrollPercent;\n return scrollPixel;\n };\n __decorate$1r([\n PostConstruct\n ], MaxDivHeightScaler.prototype, \"postConstruct\", null);\n MaxDivHeightScaler = __decorate$1r([\n Bean('maxDivHeightScaler')\n ], MaxDivHeightScaler);\n return MaxDivHeightScaler;\n}(BeanStub));\n\n/**\n * @ag-grid-community/core - Advanced Data Grid / Data Table supporting Javascript / React / AngularJS / Web Components\n * @version v25.1.0\n * @link http://www.ag-grid.com/\n * @license MIT\n */\nvar __extends$1x = (undefined && undefined.__extends) || (function () {\n var extendStatics = function (d, b) {\n extendStatics = Object.setPrototypeOf ||\n ({ __proto__: [] } instanceof Array && function (d, b) { d.__proto__ = b; }) ||\n function (d, b) { for (var p in b) if (b.hasOwnProperty(p)) d[p] = b[p]; };\n return extendStatics(d, b);\n };\n return function (d, b) {\n extendStatics(d, b);\n function __() { this.constructor = d; }\n d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __());\n };\n})();\nvar __decorate$1s = (undefined && undefined.__decorate) || function (decorators, target, key, desc) {\n var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d;\n if (typeof Reflect === \"object\" && typeof Reflect.decorate === \"function\") r = Reflect.decorate(decorators, target, key, desc);\n else for (var i = decorators.length - 1; i >= 0; i--) if (d = decorators[i]) r = (c < 3 ? d(r) : c > 3 ? d(target, key, r) : d(target, key)) || r;\n return c > 3 && r && Object.defineProperty(target, key, r), r;\n};\nvar SelectableService = /** @class */ (function (_super) {\n __extends$1x(SelectableService, _super);\n function SelectableService() {\n return _super !== null && _super.apply(this, arguments) || this;\n }\n SelectableService.prototype.init = function () {\n this.groupSelectsChildren = this.gridOptionsWrapper.isGroupSelectsChildren();\n this.isRowSelectableFunc = this.gridOptionsWrapper.getIsRowSelectableFunc();\n };\n SelectableService.prototype.updateSelectableAfterGrouping = function (rowNode) {\n if (this.isRowSelectableFunc) {\n var nextChildrenFunc = function (node) { return node.childrenAfterGroup; };\n this.recurseDown(rowNode.childrenAfterGroup, nextChildrenFunc);\n }\n };\n SelectableService.prototype.updateSelectableAfterFiltering = function (rowNode) {\n if (this.isRowSelectableFunc) {\n var nextChildrenFunc = function (node) { return node.childrenAfterFilter; };\n this.recurseDown(rowNode.childrenAfterGroup, nextChildrenFunc);\n }\n };\n SelectableService.prototype.recurseDown = function (children, nextChildrenFunc) {\n var _this = this;\n if (!children) {\n return;\n }\n children.forEach(function (child) {\n if (!child.group) {\n return;\n } // only interested in groups\n if (child.hasChildren()) {\n _this.recurseDown(nextChildrenFunc(child), nextChildrenFunc);\n }\n var rowSelectable;\n if (_this.groupSelectsChildren) {\n // have this group selectable if at least one direct child is selectable\n var firstSelectable = find(nextChildrenFunc(child), 'selectable', true);\n rowSelectable = exists(firstSelectable);\n }\n else {\n // directly retrieve selectable value from user callback\n rowSelectable = _this.isRowSelectableFunc ? _this.isRowSelectableFunc(child) : false;\n }\n child.setRowSelectable(rowSelectable);\n });\n };\n __decorate$1s([\n PostConstruct\n ], SelectableService.prototype, \"init\", null);\n SelectableService = __decorate$1s([\n Bean('selectableService')\n ], SelectableService);\n return SelectableService;\n}(BeanStub));\n\n/**\n * @ag-grid-community/core - Advanced Data Grid / Data Table supporting Javascript / React / AngularJS / Web Components\n * @version v25.1.0\n * @link http://www.ag-grid.com/\n * @license MIT\n */\nvar __extends$1y = (undefined && undefined.__extends) || (function () {\n var extendStatics = function (d, b) {\n extendStatics = Object.setPrototypeOf ||\n ({ __proto__: [] } instanceof Array && function (d, b) { d.__proto__ = b; }) ||\n function (d, b) { for (var p in b) if (b.hasOwnProperty(p)) d[p] = b[p]; };\n return extendStatics(d, b);\n };\n return function (d, b) {\n extendStatics(d, b);\n function __() { this.constructor = d; }\n d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __());\n };\n})();\nvar __decorate$1t = (undefined && undefined.__decorate) || function (decorators, target, key, desc) {\n var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d;\n if (typeof Reflect === \"object\" && typeof Reflect.decorate === \"function\") r = Reflect.decorate(decorators, target, key, desc);\n else for (var i = decorators.length - 1; i >= 0; i--) if (d = decorators[i]) r = (c < 3 ? d(r) : c > 3 ? d(target, key, r) : d(target, key)) || r;\n return c > 3 && r && Object.defineProperty(target, key, r), r;\n};\nvar AutoHeightCalculator = /** @class */ (function (_super) {\n __extends$1y(AutoHeightCalculator, _super);\n function AutoHeightCalculator() {\n return _super !== null && _super.apply(this, arguments) || this;\n }\n AutoHeightCalculator.prototype.registerGridComp = function (gridPanel) {\n this.gridPanel = gridPanel;\n };\n AutoHeightCalculator.prototype.getPreferredHeightForRow = function (rowNode) {\n var _this = this;\n var eDummyContainer = document.createElement('div');\n this.addInRowCssClasses(rowNode, eDummyContainer);\n // we put the dummy into the body container, so it will inherit all the\n // css styles that the real cells are inheriting\n var eBodyContainer = this.gridPanel.getCenterContainer();\n eBodyContainer.appendChild(eDummyContainer);\n var scopeResult = AngularRowUtils.createChildScopeOrNull(rowNode, this.$scope, this.beans.gridOptionsWrapper);\n var scope = scopeResult ? scopeResult.scope : undefined;\n var scopeDestroyFunc = scopeResult ? scopeResult.scopeDestroyFunc : undefined;\n var cellComps = [];\n var autoRowHeightCols = this.columnController.getAllAutoRowHeightCols();\n var displayedCols = this.columnController.getAllDisplayedColumns();\n var visibleAutoRowHeightCols = autoRowHeightCols.filter(function (col) { return displayedCols.indexOf(col) >= 0; });\n visibleAutoRowHeightCols.forEach(function (col) {\n var cellComp = new CellComp(scope, _this.beans, col, rowNode, null, true, false);\n cellComp.setParentRow(eDummyContainer);\n cellComps.push(cellComp);\n });\n var template = cellComps.map(function (cellComp) { return cellComp.getCreateTemplate(); }).join(' ');\n eDummyContainer.innerHTML = template;\n // this gets any cellComps that are using components to put the components in\n cellComps.forEach(function (cellComp) { return cellComp.afterAttached(); });\n if (scope) {\n this.$compile(eDummyContainer)(scope);\n }\n // we should be able to just take the height of the row at this point, however\n // the row isn't expanding to cover the cell heights, i don't know why, i couldn't\n // figure it out so instead looking at the individual cells instead\n var maxCellHeight = 0;\n for (var i = 0; i < eDummyContainer.children.length; i++) {\n var child = eDummyContainer.children[i];\n if (child.offsetHeight > maxCellHeight) {\n maxCellHeight = child.offsetHeight;\n }\n }\n // we are finished with the dummy container, so get rid of it\n eBodyContainer.removeChild(eDummyContainer);\n cellComps.forEach(function (cellComp) {\n // dunno why we need to detach first, doing it here to be consistent with code in RowComp\n cellComp.detach();\n cellComp.destroy();\n });\n if (scopeDestroyFunc) {\n scopeDestroyFunc();\n }\n return maxCellHeight;\n };\n AutoHeightCalculator.prototype.addInRowCssClasses = function (rowNode, eDummyContainer) {\n // so any styles on row also get applied in dummy, otherwise\n // the content in dummy may differ to the real\n var rowIndex = rowNode.rowIndex;\n var params = {\n rowNode: rowNode,\n rowIsEven: rowIndex % 2 === 0,\n rowLevel: this.rowCssClassCalculator.calculateRowLevel(rowNode),\n firstRowOnPage: rowIndex === this.beans.paginationProxy.getPageFirstRow(),\n lastRowOnPage: rowIndex === this.beans.paginationProxy.getPageLastRow(),\n printLayout: false,\n expandable: rowNode.isExpandable()\n };\n var classes = this.rowCssClassCalculator.getInitialRowClasses(params);\n addCssClass(eDummyContainer, classes.join(' '));\n };\n __decorate$1t([\n Autowired('beans')\n ], AutoHeightCalculator.prototype, \"beans\", void 0);\n __decorate$1t([\n Autowired(\"$scope\")\n ], AutoHeightCalculator.prototype, \"$scope\", void 0);\n __decorate$1t([\n Autowired(\"columnController\")\n ], AutoHeightCalculator.prototype, \"columnController\", void 0);\n __decorate$1t([\n Autowired(\"rowCssClassCalculator\")\n ], AutoHeightCalculator.prototype, \"rowCssClassCalculator\", void 0);\n __decorate$1t([\n Autowired('$compile')\n ], AutoHeightCalculator.prototype, \"$compile\", void 0);\n AutoHeightCalculator = __decorate$1t([\n Bean('autoHeightCalculator')\n ], AutoHeightCalculator);\n return AutoHeightCalculator;\n}(BeanStub));\n\n/**\n * @ag-grid-community/core - Advanced Data Grid / Data Table supporting Javascript / React / AngularJS / Web Components\n * @version v25.1.0\n * @link http://www.ag-grid.com/\n * @license MIT\n */\nvar __extends$1z = (undefined && undefined.__extends) || (function () {\n var extendStatics = function (d, b) {\n extendStatics = Object.setPrototypeOf ||\n ({ __proto__: [] } instanceof Array && function (d, b) { d.__proto__ = b; }) ||\n function (d, b) { for (var p in b) if (b.hasOwnProperty(p)) d[p] = b[p]; };\n return extendStatics(d, b);\n };\n return function (d, b) {\n extendStatics(d, b);\n function __() { this.constructor = d; }\n d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __());\n };\n})();\nvar __decorate$1u = (undefined && undefined.__decorate) || function (decorators, target, key, desc) {\n var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d;\n if (typeof Reflect === \"object\" && typeof Reflect.decorate === \"function\") r = Reflect.decorate(decorators, target, key, desc);\n else for (var i = decorators.length - 1; i >= 0; i--) if (d = decorators[i]) r = (c < 3 ? d(r) : c > 3 ? d(target, key, r) : d(target, key)) || r;\n return c > 3 && r && Object.defineProperty(target, key, r), r;\n};\nvar PaginationComp = /** @class */ (function (_super) {\n __extends$1z(PaginationComp, _super);\n function PaginationComp() {\n var _this = _super.call(this) || this;\n _this.previousAndFirstButtonsDisabled = false;\n _this.nextButtonDisabled = false;\n _this.lastButtonDisabled = false;\n return _this;\n }\n PaginationComp.prototype.postConstruct = function () {\n var _this = this;\n var isRtl = this.gridOptionsWrapper.isEnableRtl();\n this.setTemplate(this.getTemplate());\n this.btFirst.insertAdjacentElement('afterbegin', createIconNoSpan(isRtl ? 'last' : 'first', this.gridOptionsWrapper));\n this.btPrevious.insertAdjacentElement('afterbegin', createIconNoSpan(isRtl ? 'next' : 'previous', this.gridOptionsWrapper));\n this.btNext.insertAdjacentElement('afterbegin', createIconNoSpan(isRtl ? 'previous' : 'next', this.gridOptionsWrapper));\n this.btLast.insertAdjacentElement('afterbegin', createIconNoSpan(isRtl ? 'first' : 'last', this.gridOptionsWrapper));\n var isPaging = this.gridOptionsWrapper.isPagination();\n var paginationPanelEnabled = isPaging && !this.gridOptionsWrapper.isSuppressPaginationPanel();\n if (!paginationPanelEnabled) {\n this.setDisplayed(false);\n return;\n }\n this.addManagedListener(this.eventService, Events.EVENT_PAGINATION_CHANGED, this.onPaginationChanged.bind(this));\n [\n { el: this.btFirst, fn: this.onBtFirst.bind(this) },\n { el: this.btPrevious, fn: this.onBtPrevious.bind(this) },\n { el: this.btNext, fn: this.onBtNext.bind(this) },\n { el: this.btLast, fn: this.onBtLast.bind(this) }\n ].forEach(function (item) {\n var el = item.el, fn = item.fn;\n _this.addManagedListener(el, 'click', fn);\n _this.addManagedListener(el, 'keydown', function (e) {\n if (e.keyCode === KeyCode.ENTER || e.keyCode === KeyCode.SPACE) {\n e.preventDefault();\n fn();\n }\n });\n });\n this.onPaginationChanged();\n };\n PaginationComp.prototype.onPaginationChanged = function () {\n this.enableOrDisableButtons();\n this.updateRowLabels();\n this.setCurrentPageLabel();\n this.setTotalLabels();\n };\n PaginationComp.prototype.onBtFirst = function () {\n if (!this.previousAndFirstButtonsDisabled) {\n this.paginationProxy.goToFirstPage();\n }\n };\n PaginationComp.prototype.setCurrentPageLabel = function () {\n var pagesExist = this.paginationProxy.getTotalPages() > 0;\n var currentPage = this.paginationProxy.getCurrentPage();\n var toDisplay = pagesExist ? currentPage + 1 : 0;\n this.lbCurrent.innerHTML = this.formatNumber(toDisplay);\n };\n PaginationComp.prototype.formatNumber = function (value) {\n var userFunc = this.gridOptionsWrapper.getPaginationNumberFormatterFunc();\n if (userFunc) {\n return userFunc({ value: value });\n }\n return formatNumberCommas(value);\n };\n PaginationComp.prototype.getTemplate = function () {\n var localeTextFunc = this.gridOptionsWrapper.getLocaleTextFunc();\n var strPage = localeTextFunc('page', 'Page');\n var strTo = localeTextFunc('to', 'to');\n var strOf = localeTextFunc('of', 'of');\n var strFirst = localeTextFunc('firstPage', 'First Page');\n var strPrevious = localeTextFunc('previousPage', 'Previous Page');\n var strNext = localeTextFunc('nextPage', 'Next Page');\n var strLast = localeTextFunc('lastPage', 'Last Page');\n var compId = this.getCompId();\n var summaryDescribedBy = \"ag-\" + compId + \"-first-row ag-\" + compId + \"-to ag-\" + compId + \"-last-row ag-\" + compId + \"-of ag-\" + compId + \"-row-count\";\n var descriptionDescribedBy = \"ag-\" + compId + \"-start-page ag-\" + compId + \"-start-page-number ag-\" + compId + \"-of-page ag-\" + compId + \"-of-page-number\";\n return /* html */ \"
\\n \\n \\n \" + strTo + \"\\n \\n \" + strOf + \"\\n \\n \\n \\n
\\n
\\n \\n \" + strPage + \"\\n \\n \" + strOf + \"\\n \\n \\n
\\n
\\n
\\n
\";\n };\n PaginationComp.prototype.onBtNext = function () {\n if (!this.nextButtonDisabled) {\n this.paginationProxy.goToNextPage();\n }\n };\n PaginationComp.prototype.onBtPrevious = function () {\n if (!this.previousAndFirstButtonsDisabled) {\n this.paginationProxy.goToPreviousPage();\n }\n };\n PaginationComp.prototype.onBtLast = function () {\n if (!this.lastButtonDisabled) {\n this.paginationProxy.goToLastPage();\n }\n };\n PaginationComp.prototype.enableOrDisableButtons = function () {\n var currentPage = this.paginationProxy.getCurrentPage();\n var maxRowFound = this.paginationProxy.isLastPageFound();\n var totalPages = this.paginationProxy.getTotalPages();\n this.previousAndFirstButtonsDisabled = currentPage === 0;\n addOrRemoveCssClass(this.btFirst, 'ag-disabled', this.previousAndFirstButtonsDisabled);\n setAriaDisabled(this.btFirst, this.previousAndFirstButtonsDisabled);\n addOrRemoveCssClass(this.btPrevious, 'ag-disabled', this.previousAndFirstButtonsDisabled);\n setAriaDisabled(this.btPrevious, this.previousAndFirstButtonsDisabled);\n var zeroPagesToDisplay = this.isZeroPagesToDisplay();\n var onLastPage = maxRowFound && currentPage === (totalPages - 1);\n this.nextButtonDisabled = onLastPage || zeroPagesToDisplay;\n addOrRemoveCssClass(this.btNext, 'ag-disabled', this.nextButtonDisabled);\n setAriaDisabled(this.btNext, this.nextButtonDisabled);\n this.lastButtonDisabled = !maxRowFound || zeroPagesToDisplay || currentPage === (totalPages - 1);\n addOrRemoveCssClass(this.btLast, 'ag-disabled', this.lastButtonDisabled);\n setAriaDisabled(this.btLast, this.lastButtonDisabled);\n };\n PaginationComp.prototype.updateRowLabels = function () {\n var currentPage = this.paginationProxy.getCurrentPage();\n var pageSize = this.paginationProxy.getPageSize();\n var maxRowFound = this.paginationProxy.isLastPageFound();\n var rowCount = this.paginationProxy.isLastPageFound() ?\n this.paginationProxy.getMasterRowCount() : null;\n var startRow;\n var endRow;\n if (this.isZeroPagesToDisplay()) {\n startRow = endRow = 0;\n }\n else {\n startRow = (pageSize * currentPage) + 1;\n endRow = startRow + pageSize - 1;\n if (maxRowFound && endRow > rowCount) {\n endRow = rowCount;\n }\n }\n this.lbFirstRowOnPage.innerHTML = this.formatNumber(startRow);\n if (this.rowNodeBlockLoader.isLoading()) {\n this.lbLastRowOnPage.innerHTML = '?';\n }\n else {\n this.lbLastRowOnPage.innerHTML = this.formatNumber(endRow);\n }\n };\n PaginationComp.prototype.isZeroPagesToDisplay = function () {\n var maxRowFound = this.paginationProxy.isLastPageFound();\n var totalPages = this.paginationProxy.getTotalPages();\n return maxRowFound && totalPages === 0;\n };\n PaginationComp.prototype.setTotalLabels = function () {\n var lastPageFound = this.paginationProxy.isLastPageFound();\n var totalPages = this.paginationProxy.getTotalPages();\n var rowCount = lastPageFound ?\n this.paginationProxy.getMasterRowCount() : null;\n if (lastPageFound) {\n this.lbTotal.innerHTML = this.formatNumber(totalPages);\n this.lbRecordCount.innerHTML = this.formatNumber(rowCount);\n }\n else {\n var moreText = this.gridOptionsWrapper.getLocaleTextFunc()('more', 'more');\n this.lbTotal.innerHTML = moreText;\n this.lbRecordCount.innerHTML = moreText;\n }\n };\n __decorate$1u([\n Autowired('paginationProxy')\n ], PaginationComp.prototype, \"paginationProxy\", void 0);\n __decorate$1u([\n Autowired('rowModel')\n ], PaginationComp.prototype, \"rowModel\", void 0);\n __decorate$1u([\n Autowired('rowNodeBlockLoader')\n ], PaginationComp.prototype, \"rowNodeBlockLoader\", void 0);\n __decorate$1u([\n RefSelector('btFirst')\n ], PaginationComp.prototype, \"btFirst\", void 0);\n __decorate$1u([\n RefSelector('btPrevious')\n ], PaginationComp.prototype, \"btPrevious\", void 0);\n __decorate$1u([\n RefSelector('btNext')\n ], PaginationComp.prototype, \"btNext\", void 0);\n __decorate$1u([\n RefSelector('btLast')\n ], PaginationComp.prototype, \"btLast\", void 0);\n __decorate$1u([\n RefSelector('lbRecordCount')\n ], PaginationComp.prototype, \"lbRecordCount\", void 0);\n __decorate$1u([\n RefSelector('lbFirstRowOnPage')\n ], PaginationComp.prototype, \"lbFirstRowOnPage\", void 0);\n __decorate$1u([\n RefSelector('lbLastRowOnPage')\n ], PaginationComp.prototype, \"lbLastRowOnPage\", void 0);\n __decorate$1u([\n RefSelector('lbCurrent')\n ], PaginationComp.prototype, \"lbCurrent\", void 0);\n __decorate$1u([\n RefSelector('lbTotal')\n ], PaginationComp.prototype, \"lbTotal\", void 0);\n __decorate$1u([\n PostConstruct\n ], PaginationComp.prototype, \"postConstruct\", null);\n return PaginationComp;\n}(Component));\n\n/**\n * @ag-grid-community/core - Advanced Data Grid / Data Table supporting Javascript / React / AngularJS / Web Components\n * @version v25.1.0\n * @link http://www.ag-grid.com/\n * @license MIT\n */\nvar __extends$1A = (undefined && undefined.__extends) || (function () {\n var extendStatics = function (d, b) {\n extendStatics = Object.setPrototypeOf ||\n ({ __proto__: [] } instanceof Array && function (d, b) { d.__proto__ = b; }) ||\n function (d, b) { for (var p in b) if (b.hasOwnProperty(p)) d[p] = b[p]; };\n return extendStatics(d, b);\n };\n return function (d, b) {\n extendStatics(d, b);\n function __() { this.constructor = d; }\n d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __());\n };\n})();\nvar __decorate$1v = (undefined && undefined.__decorate) || function (decorators, target, key, desc) {\n var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d;\n if (typeof Reflect === \"object\" && typeof Reflect.decorate === \"function\") r = Reflect.decorate(decorators, target, key, desc);\n else for (var i = decorators.length - 1; i >= 0; i--) if (d = decorators[i]) r = (c < 3 ? d(r) : c > 3 ? d(target, key, r) : d(target, key)) || r;\n return c > 3 && r && Object.defineProperty(target, key, r), r;\n};\nvar ResizeObserverService = /** @class */ (function (_super) {\n __extends$1A(ResizeObserverService, _super);\n function ResizeObserverService() {\n return _super !== null && _super.apply(this, arguments) || this;\n }\n ResizeObserverService.prototype.observeResize = function (element, callback, debounceDelay) {\n if (debounceDelay === void 0) { debounceDelay = 50; }\n // put in variable, so available to usePolyfill() function below\n var frameworkFactory = this.getFrameworkOverrides();\n // this gets fired too often and might cause some relayout issues\n // so we add a debounce to the callback here to avoid the flashing effect.\n var debouncedCallback = debounce(callback, debounceDelay);\n var useBrowserResizeObserver = function () {\n var resizeObserver = new window.ResizeObserver(debouncedCallback);\n resizeObserver.observe(element);\n return function () { return resizeObserver.disconnect(); };\n };\n var usePolyfill = function () {\n // initialise to the current width and height, so first call will have no changes\n var widthLastTime = offsetWidth(element);\n var heightLastTime = offsetHeight(element);\n // when finished, this gets turned to false.\n var running = true;\n var periodicallyCheckWidthAndHeight = function () {\n if (running) {\n var newWidth = offsetWidth(element);\n var newHeight = offsetHeight(element);\n var changed = newWidth !== widthLastTime || newHeight !== heightLastTime;\n if (changed) {\n widthLastTime = newWidth;\n heightLastTime = newHeight;\n callback();\n }\n frameworkFactory.setTimeout(periodicallyCheckWidthAndHeight, debounceDelay);\n }\n };\n periodicallyCheckWidthAndHeight();\n // the callback function we return sets running to false\n return function () { return running = false; };\n };\n var suppressResize = this.gridOptionsWrapper.isSuppressBrowserResizeObserver();\n var resizeObserverExists = !!window.ResizeObserver;\n if (resizeObserverExists && !suppressResize) {\n return useBrowserResizeObserver();\n }\n else {\n return usePolyfill();\n }\n };\n ResizeObserverService = __decorate$1v([\n Bean('resizeObserverService')\n ], ResizeObserverService);\n return ResizeObserverService;\n}(BeanStub));\n\n/**\n * @ag-grid-community/core - Advanced Data Grid / Data Table supporting Javascript / React / AngularJS / Web Components\n * @version v25.1.0\n * @link http://www.ag-grid.com/\n * @license MIT\n */\nvar __extends$1B = (undefined && undefined.__extends) || (function () {\n var extendStatics = function (d, b) {\n extendStatics = Object.setPrototypeOf ||\n ({ __proto__: [] } instanceof Array && function (d, b) { d.__proto__ = b; }) ||\n function (d, b) { for (var p in b) if (b.hasOwnProperty(p)) d[p] = b[p]; };\n return extendStatics(d, b);\n };\n return function (d, b) {\n extendStatics(d, b);\n function __() { this.constructor = d; }\n d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __());\n };\n})();\nvar __decorate$1w = (undefined && undefined.__decorate) || function (decorators, target, key, desc) {\n var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d;\n if (typeof Reflect === \"object\" && typeof Reflect.decorate === \"function\") r = Reflect.decorate(decorators, target, key, desc);\n else for (var i = decorators.length - 1; i >= 0; i--) if (d = decorators[i]) r = (c < 3 ? d(r) : c > 3 ? d(target, key, r) : d(target, key)) || r;\n return c > 3 && r && Object.defineProperty(target, key, r), r;\n};\nvar LoadingType;\n(function (LoadingType) {\n LoadingType[LoadingType[\"Loading\"] = 0] = \"Loading\";\n LoadingType[LoadingType[\"NoRows\"] = 1] = \"NoRows\";\n})(LoadingType || (LoadingType = {}));\nvar OverlayWrapperComponent = /** @class */ (function (_super) {\n __extends$1B(OverlayWrapperComponent, _super);\n function OverlayWrapperComponent() {\n var _this = _super.call(this, OverlayWrapperComponent.TEMPLATE) || this;\n _this.inProgress = false;\n _this.destroyRequested = false;\n return _this;\n }\n OverlayWrapperComponent.prototype.postConstruct = function () {\n this.gridOptionsWrapper.addLayoutElement(this.eOverlayWrapper);\n this.setDisplayed(false);\n };\n OverlayWrapperComponent.prototype.setWrapperTypeClass = function (loadingType) {\n addOrRemoveCssClass(this.eOverlayWrapper, 'ag-overlay-loading-wrapper', loadingType === LoadingType.Loading);\n addOrRemoveCssClass(this.eOverlayWrapper, 'ag-overlay-no-rows-wrapper', loadingType === LoadingType.NoRows);\n };\n OverlayWrapperComponent.prototype.showLoadingOverlay = function () {\n var workItem = this.userComponentFactory.newLoadingOverlayComponent({\n api: this.gridOptionsWrapper.getApi()\n });\n this.showOverlay(workItem, LoadingType.Loading);\n };\n OverlayWrapperComponent.prototype.showNoRowsOverlay = function () {\n var workItem = this.userComponentFactory.newNoRowsOverlayComponent({\n api: this.gridOptionsWrapper.getApi()\n });\n this.showOverlay(workItem, LoadingType.NoRows);\n };\n OverlayWrapperComponent.prototype.showOverlay = function (workItem, type) {\n var _this = this;\n if (this.inProgress) {\n return;\n }\n this.setWrapperTypeClass(type);\n this.destroyActiveOverlay();\n this.inProgress = true;\n if (workItem) {\n workItem.then(function (comp) {\n _this.inProgress = false;\n _this.eOverlayWrapper.appendChild(comp.getGui());\n _this.activeOverlay = comp;\n if (_this.destroyRequested) {\n _this.destroyRequested = false;\n _this.destroyActiveOverlay();\n }\n });\n }\n this.setDisplayed(true);\n };\n OverlayWrapperComponent.prototype.destroyActiveOverlay = function () {\n if (this.inProgress) {\n this.destroyRequested = true;\n return;\n }\n if (!this.activeOverlay) {\n return;\n }\n this.activeOverlay = this.getContext().destroyBean(this.activeOverlay);\n clearElement(this.eOverlayWrapper);\n };\n OverlayWrapperComponent.prototype.hideOverlay = function () {\n this.destroyActiveOverlay();\n this.setDisplayed(false);\n };\n OverlayWrapperComponent.prototype.destroy = function () {\n this.destroyActiveOverlay();\n _super.prototype.destroy.call(this);\n };\n // wrapping in outer div, and wrapper, is needed to center the loading icon\n // The idea for centering came from here: http://www.vanseodesign.com/css/vertical-centering/\n OverlayWrapperComponent.TEMPLATE = \"\\n
\\n
\\n
\\n
\\n
\";\n __decorate$1w([\n Autowired('userComponentFactory')\n ], OverlayWrapperComponent.prototype, \"userComponentFactory\", void 0);\n __decorate$1w([\n RefSelector('eOverlayWrapper')\n ], OverlayWrapperComponent.prototype, \"eOverlayWrapper\", void 0);\n __decorate$1w([\n PostConstruct\n ], OverlayWrapperComponent.prototype, \"postConstruct\", null);\n return OverlayWrapperComponent;\n}(Component));\n\n/**\n * @ag-grid-community/core - Advanced Data Grid / Data Table supporting Javascript / React / AngularJS / Web Components\n * @version v25.1.0\n * @link http://www.ag-grid.com/\n * @license MIT\n */\nvar __extends$1C = (undefined && undefined.__extends) || (function () {\n var extendStatics = function (d, b) {\n extendStatics = Object.setPrototypeOf ||\n ({ __proto__: [] } instanceof Array && function (d, b) { d.__proto__ = b; }) ||\n function (d, b) { for (var p in b) if (b.hasOwnProperty(p)) d[p] = b[p]; };\n return extendStatics(d, b);\n };\n return function (d, b) {\n extendStatics(d, b);\n function __() { this.constructor = d; }\n d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __());\n };\n})();\nvar __decorate$1x = (undefined && undefined.__decorate) || function (decorators, target, key, desc) {\n var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d;\n if (typeof Reflect === \"object\" && typeof Reflect.decorate === \"function\") r = Reflect.decorate(decorators, target, key, desc);\n else for (var i = decorators.length - 1; i >= 0; i--) if (d = decorators[i]) r = (c < 3 ? d(r) : c > 3 ? d(target, key, r) : d(target, key)) || r;\n return c > 3 && r && Object.defineProperty(target, key, r), r;\n};\nvar AgGroupComponent = /** @class */ (function (_super) {\n __extends$1C(AgGroupComponent, _super);\n function AgGroupComponent(params) {\n if (params === void 0) { params = {}; }\n var _this = _super.call(this, AgGroupComponent.getTemplate(params)) || this;\n _this.suppressEnabledCheckbox = true;\n _this.suppressOpenCloseIcons = false;\n var title = params.title, enabled = params.enabled, items = params.items, suppressEnabledCheckbox = params.suppressEnabledCheckbox, suppressOpenCloseIcons = params.suppressOpenCloseIcons;\n _this.title = title;\n _this.cssIdentifier = params.cssIdentifier || 'default';\n _this.enabled = enabled != null ? enabled : true;\n _this.items = items || [];\n _this.alignItems = params.alignItems || 'center';\n if (suppressEnabledCheckbox != null) {\n _this.suppressEnabledCheckbox = suppressEnabledCheckbox;\n }\n if (suppressOpenCloseIcons != null) {\n _this.suppressOpenCloseIcons = suppressOpenCloseIcons;\n }\n return _this;\n }\n AgGroupComponent.getTemplate = function (params) {\n var cssIdentifier = params.cssIdentifier || 'default';\n var direction = params.direction || 'vertical';\n return /* html */ \"
\\n
\\n \\n \\n \\n
\\n
\\n \\n
\\n
\\n
\";\n };\n AgGroupComponent.prototype.postConstruct = function () {\n if (this.items.length) {\n var initialItems = this.items;\n this.items = [];\n this.addItems(initialItems);\n }\n var localeTextFunc = this.gridOptionsWrapper.getLocaleTextFunc();\n this.cbGroupEnabled.setLabel(localeTextFunc('enabled', 'Enabled'));\n if (this.title) {\n this.setTitle(this.title);\n }\n if (this.enabled) {\n this.setEnabled(this.enabled);\n }\n this.setAlignItems(this.alignItems);\n this.hideEnabledCheckbox(this.suppressEnabledCheckbox);\n this.hideOpenCloseIcons(this.suppressOpenCloseIcons);\n this.setupExpandContract();\n this.refreshChildDisplay();\n };\n AgGroupComponent.prototype.setupExpandContract = function () {\n var _this = this;\n this.eGroupClosedIcon.appendChild(createIcon('columnSelectClosed', this.gridOptionsWrapper, null));\n this.eGroupOpenedIcon.appendChild(createIcon('columnSelectOpen', this.gridOptionsWrapper, null));\n this.addManagedListener(this.eTitleBar, 'click', function () { return _this.toggleGroupExpand(); });\n this.addManagedListener(this.eTitleBar, 'keydown', function (e) {\n switch (e.keyCode) {\n case KeyCode.ENTER:\n _this.toggleGroupExpand();\n break;\n case KeyCode.RIGHT:\n _this.toggleGroupExpand(true);\n break;\n case KeyCode.LEFT:\n _this.toggleGroupExpand(false);\n break;\n }\n });\n };\n AgGroupComponent.prototype.refreshChildDisplay = function () {\n var showIcon = !this.suppressOpenCloseIcons;\n setDisplayed(this.eToolbar, this.expanded && !this.suppressEnabledCheckbox);\n setDisplayed(this.eGroupOpenedIcon, showIcon && this.expanded);\n setDisplayed(this.eGroupClosedIcon, showIcon && !this.expanded);\n };\n AgGroupComponent.prototype.isExpanded = function () {\n return this.expanded;\n };\n AgGroupComponent.prototype.setAlignItems = function (alignment) {\n var eGui = this.getGui();\n if (this.alignItems !== alignment) {\n removeCssClass(eGui, \"ag-group-item-alignment-\" + this.alignItems);\n }\n this.alignItems = alignment;\n var newCls = \"ag-group-item-alignment-\" + this.alignItems;\n addCssClass(eGui, newCls);\n return this;\n };\n AgGroupComponent.prototype.toggleGroupExpand = function (expanded) {\n if (this.suppressOpenCloseIcons) {\n this.expanded = true;\n this.refreshChildDisplay();\n setDisplayed(this.eContainer, true);\n return this;\n }\n expanded = expanded != null ? expanded : !this.expanded;\n if (this.expanded === expanded) {\n return this;\n }\n this.expanded = expanded;\n this.refreshChildDisplay();\n setDisplayed(this.eContainer, expanded);\n this.dispatchEvent({ type: this.expanded ? AgGroupComponent.EVENT_EXPANDED : AgGroupComponent.EVENT_COLLAPSED });\n return this;\n };\n AgGroupComponent.prototype.addItems = function (items) {\n var _this = this;\n items.forEach(function (item) { return _this.addItem(item); });\n };\n AgGroupComponent.prototype.addItem = function (item) {\n var container = this.eContainer;\n var el = item instanceof Component ? item.getGui() : item;\n addCssClass(el, 'ag-group-item');\n addCssClass(el, \"ag-\" + this.cssIdentifier + \"-group-item\");\n container.appendChild(el);\n this.items.push(el);\n };\n AgGroupComponent.prototype.hideItem = function (hide, index) {\n var itemToHide = this.items[index];\n addOrRemoveCssClass(itemToHide, 'ag-hidden', hide);\n };\n AgGroupComponent.prototype.setTitle = function (title) {\n this.eTitle.innerText = title;\n return this;\n };\n AgGroupComponent.prototype.addCssClassToTitleBar = function (cssClass) {\n addCssClass(this.eTitleBar, cssClass);\n };\n AgGroupComponent.prototype.setEnabled = function (enabled, skipToggle) {\n this.enabled = enabled;\n this.refreshDisabledStyles();\n this.toggleGroupExpand(enabled);\n if (!skipToggle) {\n this.cbGroupEnabled.setValue(enabled);\n }\n return this;\n };\n AgGroupComponent.prototype.isEnabled = function () {\n return this.enabled;\n };\n AgGroupComponent.prototype.onEnableChange = function (callbackFn) {\n var _this = this;\n this.cbGroupEnabled.onValueChange(function (newSelection) {\n _this.setEnabled(newSelection, true);\n callbackFn(newSelection);\n });\n return this;\n };\n AgGroupComponent.prototype.hideEnabledCheckbox = function (hide) {\n this.suppressEnabledCheckbox = hide;\n this.refreshChildDisplay();\n this.refreshDisabledStyles();\n return this;\n };\n AgGroupComponent.prototype.hideOpenCloseIcons = function (hide) {\n this.suppressOpenCloseIcons = hide;\n if (hide) {\n this.toggleGroupExpand(true);\n }\n return this;\n };\n AgGroupComponent.prototype.refreshDisabledStyles = function () {\n addOrRemoveCssClass(this.getGui(), 'ag-disabled', !this.enabled);\n if (this.suppressEnabledCheckbox && !this.enabled) {\n addCssClass(this.eTitleBar, 'ag-disabled-group-title-bar');\n this.eTitleBar.removeAttribute('tabindex');\n }\n else {\n removeCssClass(this.eTitleBar, 'ag-disabled-group-title-bar');\n this.eTitleBar.setAttribute('tabindex', '0');\n }\n addOrRemoveCssClass(this.eContainer, 'ag-disabled-group-container', !this.enabled);\n };\n AgGroupComponent.EVENT_EXPANDED = 'expanded';\n AgGroupComponent.EVENT_COLLAPSED = 'collapsed';\n __decorate$1x([\n RefSelector('eTitleBar')\n ], AgGroupComponent.prototype, \"eTitleBar\", void 0);\n __decorate$1x([\n RefSelector('eGroupOpenedIcon')\n ], AgGroupComponent.prototype, \"eGroupOpenedIcon\", void 0);\n __decorate$1x([\n RefSelector('eGroupClosedIcon')\n ], AgGroupComponent.prototype, \"eGroupClosedIcon\", void 0);\n __decorate$1x([\n RefSelector('eToolbar')\n ], AgGroupComponent.prototype, \"eToolbar\", void 0);\n __decorate$1x([\n RefSelector('cbGroupEnabled')\n ], AgGroupComponent.prototype, \"cbGroupEnabled\", void 0);\n __decorate$1x([\n RefSelector('eTitle')\n ], AgGroupComponent.prototype, \"eTitle\", void 0);\n __decorate$1x([\n RefSelector('eContainer')\n ], AgGroupComponent.prototype, \"eContainer\", void 0);\n __decorate$1x([\n PostConstruct\n ], AgGroupComponent.prototype, \"postConstruct\", null);\n return AgGroupComponent;\n}(Component));\n\n/**\n * @ag-grid-community/core - Advanced Data Grid / Data Table supporting Javascript / React / AngularJS / Web Components\n * @version v25.1.0\n * @link http://www.ag-grid.com/\n * @license MIT\n */\nvar __extends$1D = (undefined && undefined.__extends) || (function () {\n var extendStatics = function (d, b) {\n extendStatics = Object.setPrototypeOf ||\n ({ __proto__: [] } instanceof Array && function (d, b) { d.__proto__ = b; }) ||\n function (d, b) { for (var p in b) if (b.hasOwnProperty(p)) d[p] = b[p]; };\n return extendStatics(d, b);\n };\n return function (d, b) {\n extendStatics(d, b);\n function __() { this.constructor = d; }\n d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __());\n };\n})();\nvar __decorate$1y = (undefined && undefined.__decorate) || function (decorators, target, key, desc) {\n var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d;\n if (typeof Reflect === \"object\" && typeof Reflect.decorate === \"function\") r = Reflect.decorate(decorators, target, key, desc);\n else for (var i = decorators.length - 1; i >= 0; i--) if (d = decorators[i]) r = (c < 3 ? d(r) : c > 3 ? d(target, key, r) : d(target, key)) || r;\n return c > 3 && r && Object.defineProperty(target, key, r), r;\n};\nvar AgPanel = /** @class */ (function (_super) {\n __extends$1D(AgPanel, _super);\n function AgPanel(config) {\n var _this = _super.call(this, AgPanel.getTemplate(config)) || this;\n _this.closable = true;\n _this.positioned = false;\n _this.dragStartPosition = {\n x: 0,\n y: 0\n };\n _this.position = {\n x: 0,\n y: 0\n };\n _this.size = {\n width: undefined,\n height: undefined\n };\n _this.config = config;\n return _this;\n }\n AgPanel.getTemplate = function (config) {\n var cssIdentifier = (config && config.cssIdentifier) || 'default';\n return /* html */ \"
\\n
\\n \\n
\\n
\\n
\\n
\";\n };\n AgPanel.prototype.postConstruct = function () {\n var _this = this;\n var _a = this.config, component = _a.component, closable = _a.closable, hideTitleBar = _a.hideTitleBar, title = _a.title, minWidth = _a.minWidth, width = _a.width, minHeight = _a.minHeight, height = _a.height, centered = _a.centered, x = _a.x, y = _a.y;\n var eGui = this.getGui();\n if (component) {\n this.setBodyComponent(component);\n }\n if (!hideTitleBar) {\n if (title) {\n this.setTitle(title);\n }\n this.setClosable(closable != null ? closable : this.closable);\n }\n else {\n addCssClass(this.eTitleBar, 'ag-hidden');\n }\n this.addManagedListener(this.eTitleBar, 'mousedown', function (e) {\n if (eGui.contains(e.relatedTarget) ||\n eGui.contains(document.activeElement) ||\n _this.eTitleBarButtons.contains(e.target)) {\n e.preventDefault();\n return;\n }\n var focusEl = _this.eContentWrapper.querySelector('button, [href], input, select, textarea, [tabindex]');\n if (focusEl) {\n focusEl.focus();\n }\n });\n if (this.positioned) {\n return;\n }\n this.minHeight = minHeight != null ? minHeight : 250;\n this.minWidth = minWidth != null ? minWidth : 250;\n this.popupParent = this.popupService.getPopupParent();\n if (width) {\n this.setWidth(width);\n }\n if (height) {\n this.setHeight(height);\n }\n if (this.renderComponent) {\n this.renderComponent();\n }\n if (!width || !height) {\n this.refreshSize();\n }\n if (centered) {\n this.center();\n }\n else if (x || y) {\n this.offsetElement(x, y);\n }\n this.positioned = true;\n this.eContentWrapper.style.height = '0';\n };\n AgPanel.prototype.renderComponent = function () {\n var _this = this;\n var eGui = this.getGui();\n eGui.focus();\n this.close = function () {\n eGui.parentElement.removeChild(eGui);\n _this.destroy();\n };\n };\n AgPanel.prototype.updateDragStartPosition = function (x, y) {\n this.dragStartPosition = { x: x, y: y };\n };\n AgPanel.prototype.calculateMouseMovement = function (params) {\n var parentRect = this.popupParent.getBoundingClientRect();\n var e = params.e, isLeft = params.isLeft, isTop = params.isTop, anywhereWithin = params.anywhereWithin, topBuffer = params.topBuffer;\n var movementX = e.clientX - this.dragStartPosition.x;\n var movementY = e.clientY - this.dragStartPosition.y;\n var width = this.getWidth();\n var height = this.getHeight();\n // skip if cursor is outside of popupParent horizontally\n var skipX = (parentRect.left >= e.clientX && this.position.x <= 0 ||\n parentRect.right <= e.clientX && parentRect.right <= this.position.x + parentRect.left + width);\n if (!skipX) {\n if (isLeft) {\n skipX = (\n // skip if we are moving to the left and the cursor\n // is positioned to the right of the left side anchor\n (movementX < 0 && e.clientX > this.position.x + parentRect.left) ||\n // skip if we are moving to the right and the cursor\n // is positioned to the left of the dialog\n (movementX > 0 && e.clientX < this.position.x + parentRect.left));\n }\n else {\n if (anywhereWithin) {\n // if anywhereWithin is true, we allow to move\n // as long as the cursor is within the dialog\n skipX = ((movementX < 0 && e.clientX > this.position.x + parentRect.left + width) ||\n (movementX > 0 && e.clientX < this.position.x + parentRect.left));\n }\n else {\n skipX = (\n // if the movement is bound to the right side of the dialog\n // we skip if we are moving to the left and the cursor\n // is to the right of the dialog\n (movementX < 0 && e.clientX > this.position.x + parentRect.left + width) ||\n // or skip if we are moving to the right and the cursor\n // is to the left of the right side anchor\n (movementX > 0 && e.clientX < this.position.x + parentRect.left + width));\n }\n }\n }\n movementX = skipX ? 0 : movementX;\n var skipY = (\n // skip if cursor is outside of popupParent vertically\n parentRect.top >= e.clientY && this.position.y <= 0 ||\n parentRect.bottom <= e.clientY && parentRect.bottom <= this.position.y + parentRect.top + height ||\n isTop && (\n // skip if we are moving to towards top and the cursor is\n // below the top anchor + topBuffer\n // note: topBuffer is used when moving the dialog using the title bar\n (movementY < 0 && e.clientY > this.position.y + parentRect.top + (topBuffer || 0)) ||\n // skip if we are moving to the bottom and the cursor is\n // above the top anchor\n (movementY > 0 && e.clientY < this.position.y + parentRect.top)) ||\n // we are anchored to the bottom of the dialog\n !isTop && (\n // skip if we are moving towards the top and the cursor\n // is below the bottom anchor\n (movementY < 0 && e.clientY > this.position.y + parentRect.top + height) ||\n // skip if we are moving towards the bottom and the cursor\n // is above the bottom anchor\n (movementY > 0 && e.clientY < this.position.y + parentRect.top + height)));\n movementY = skipY ? 0 : movementY;\n return { movementX: movementX, movementY: movementY };\n };\n AgPanel.prototype.refreshSize = function () {\n var _a = this.size, width = _a.width, height = _a.height;\n if (!width) {\n this.setWidth(this.getGui().offsetWidth);\n }\n if (!height) {\n this.setHeight(this.getGui().offsetHeight);\n }\n };\n AgPanel.prototype.offsetElement = function (x, y) {\n if (x === void 0) { x = 0; }\n if (y === void 0) { y = 0; }\n var ePopup = this.getGui();\n this.popupService.positionPopup({\n ePopup: ePopup,\n x: x,\n y: y,\n minWidth: this.minWidth,\n minHeight: this.minHeight,\n keepWithinBounds: true\n });\n this.position.x = parseInt(ePopup.style.left, 10);\n this.position.y = parseInt(ePopup.style.top, 10);\n };\n AgPanel.prototype.getHeight = function () {\n return this.size.height;\n };\n AgPanel.prototype.setHeight = function (height) {\n var eGui = this.getGui();\n var isPercent = false;\n if (typeof height === 'string' && height.indexOf('%') !== -1) {\n setFixedHeight(eGui, height);\n height = getAbsoluteHeight(eGui);\n isPercent = true;\n }\n else {\n height = Math.max(this.minHeight, height);\n var offsetParent = eGui.offsetParent;\n if (offsetParent && offsetParent.clientHeight && (height + this.position.y > offsetParent.clientHeight)) {\n height = offsetParent.clientHeight - this.position.y;\n }\n }\n if (this.size.height === height) {\n return;\n }\n this.size.height = height;\n if (!isPercent) {\n setFixedHeight(eGui, height);\n }\n else {\n eGui.style.maxHeight = 'unset';\n eGui.style.minHeight = 'unset';\n }\n };\n AgPanel.prototype.getWidth = function () {\n return this.size.width;\n };\n AgPanel.prototype.setWidth = function (width) {\n var eGui = this.getGui();\n var isPercent = false;\n if (typeof width === 'string' && width.indexOf('%') !== -1) {\n setFixedWidth(eGui, width);\n width = getAbsoluteWidth(eGui);\n isPercent = true;\n }\n else {\n width = Math.max(this.minWidth, width);\n var offsetParent = eGui.offsetParent;\n if (offsetParent && offsetParent.clientWidth && (width + this.position.x > offsetParent.clientWidth)) {\n width = offsetParent.clientWidth - this.position.x;\n }\n }\n if (this.size.width === width) {\n return;\n }\n this.size.width = width;\n if (!isPercent) {\n setFixedWidth(eGui, width);\n }\n else {\n eGui.style.maxWidth = 'unset';\n eGui.style.minWidth = 'unset';\n }\n };\n AgPanel.prototype.center = function () {\n var eGui = this.getGui();\n var x = (eGui.offsetParent.clientWidth / 2) - (this.getWidth() / 2);\n var y = (eGui.offsetParent.clientHeight / 2) - (this.getHeight() / 2);\n this.offsetElement(x, y);\n };\n AgPanel.prototype.setClosable = function (closable) {\n if (closable !== this.closable) {\n this.closable = closable;\n }\n if (closable) {\n var closeButtonComp = this.closeButtonComp = new Component(AgPanel.CLOSE_BTN_TEMPLATE);\n this.getContext().createBean(closeButtonComp);\n var eGui = closeButtonComp.getGui();\n eGui.appendChild(addCssClass(createIconNoSpan('close', this.gridOptionsWrapper), 'ag-panel-title-bar-button-icon'));\n this.addTitleBarButton(closeButtonComp);\n closeButtonComp.addManagedListener(eGui, 'click', this.onBtClose.bind(this));\n }\n else if (this.closeButtonComp) {\n var eGui = this.closeButtonComp.getGui();\n eGui.parentElement.removeChild(eGui);\n this.closeButtonComp = this.destroyBean(this.closeButtonComp);\n }\n };\n AgPanel.prototype.setBodyComponent = function (bodyComponent) {\n bodyComponent.setParentComponent(this);\n this.eContentWrapper.appendChild(bodyComponent.getGui());\n };\n AgPanel.prototype.addTitleBarButton = function (button, position) {\n var eTitleBarButtons = this.eTitleBarButtons;\n var buttons = eTitleBarButtons.children;\n var len = buttons.length;\n if (position == null) {\n position = len;\n }\n position = Math.max(0, Math.min(position, len));\n var eGui = button.getGui();\n addCssClass(eGui, 'ag-panel-title-bar-button');\n if (position === 0) {\n eTitleBarButtons.insertAdjacentElement('afterbegin', eGui);\n }\n else if (position === len) {\n eTitleBarButtons.insertAdjacentElement('beforeend', eGui);\n }\n else {\n buttons[position - 1].insertAdjacentElement('afterend', eGui);\n }\n button.setParentComponent(this);\n };\n AgPanel.prototype.getBodyHeight = function () {\n return getInnerHeight(this.eContentWrapper);\n };\n AgPanel.prototype.getBodyWidth = function () {\n return getInnerWidth(this.eContentWrapper);\n };\n AgPanel.prototype.setTitle = function (title) {\n this.eTitle.innerText = title;\n };\n // called when user hits the 'x' in the top right\n AgPanel.prototype.onBtClose = function () {\n this.close();\n };\n AgPanel.prototype.destroy = function () {\n if (this.closeButtonComp) {\n this.closeButtonComp = this.destroyBean(this.closeButtonComp);\n }\n var eGui = this.getGui();\n if (eGui && eGui.offsetParent) {\n this.close();\n }\n _super.prototype.destroy.call(this);\n };\n AgPanel.CLOSE_BTN_TEMPLATE = \"
\";\n __decorate$1y([\n Autowired('popupService')\n ], AgPanel.prototype, \"popupService\", void 0);\n __decorate$1y([\n RefSelector('eContentWrapper')\n ], AgPanel.prototype, \"eContentWrapper\", void 0);\n __decorate$1y([\n RefSelector('eTitleBar')\n ], AgPanel.prototype, \"eTitleBar\", void 0);\n __decorate$1y([\n RefSelector('eTitleBarButtons')\n ], AgPanel.prototype, \"eTitleBarButtons\", void 0);\n __decorate$1y([\n RefSelector('eTitle')\n ], AgPanel.prototype, \"eTitle\", void 0);\n __decorate$1y([\n PostConstruct\n ], AgPanel.prototype, \"postConstruct\", null);\n return AgPanel;\n}(Component));\n\n/**\n * @ag-grid-community/core - Advanced Data Grid / Data Table supporting Javascript / React / AngularJS / Web Components\n * @version v25.1.0\n * @link http://www.ag-grid.com/\n * @license MIT\n */\nvar __extends$1E = (undefined && undefined.__extends) || (function () {\n var extendStatics = function (d, b) {\n extendStatics = Object.setPrototypeOf ||\n ({ __proto__: [] } instanceof Array && function (d, b) { d.__proto__ = b; }) ||\n function (d, b) { for (var p in b) if (b.hasOwnProperty(p)) d[p] = b[p]; };\n return extendStatics(d, b);\n };\n return function (d, b) {\n extendStatics(d, b);\n function __() { this.constructor = d; }\n d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __());\n };\n})();\nvar __decorate$1z = (undefined && undefined.__decorate) || function (decorators, target, key, desc) {\n var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d;\n if (typeof Reflect === \"object\" && typeof Reflect.decorate === \"function\") r = Reflect.decorate(decorators, target, key, desc);\n else for (var i = decorators.length - 1; i >= 0; i--) if (d = decorators[i]) r = (c < 3 ? d(r) : c > 3 ? d(target, key, r) : d(target, key)) || r;\n return c > 3 && r && Object.defineProperty(target, key, r), r;\n};\nvar AgDialog = /** @class */ (function (_super) {\n __extends$1E(AgDialog, _super);\n function AgDialog(config) {\n var _this = _super.call(this, config) || this;\n _this.RESIZE_TEMPLATE = \"
\\n
\\n
\\n
\\n
\\n
\\n
\\n
\\n
\\n
\";\n _this.resizable = {};\n _this.movable = false;\n _this.isMoving = false;\n _this.isMaximizable = false;\n _this.isMaximized = false;\n _this.maximizeListeners = [];\n _this.resizeListenerDestroy = null;\n _this.isResizing = false;\n _this.lastPosition = {\n x: 0,\n y: 0,\n width: 0,\n height: 0\n };\n return _this;\n }\n AgDialog.prototype.postConstruct = function () {\n var _this = this;\n var eGui = this.getGui();\n var _a = this.config, movable = _a.movable, resizable = _a.resizable, maximizable = _a.maximizable;\n addCssClass(eGui, 'ag-dialog');\n this.moveElement = this.eTitleBar;\n _super.prototype.postConstruct.call(this);\n this.addManagedListener(eGui, 'focusin', function (e) {\n if (eGui.contains(e.relatedTarget)) {\n return;\n }\n _this.popupService.bringPopupToFront(eGui);\n });\n if (movable) {\n this.setMovable(movable);\n }\n if (maximizable) {\n this.setMaximizable(maximizable);\n }\n this.addResizers();\n if (resizable) {\n this.setResizable(resizable);\n }\n };\n AgDialog.prototype.renderComponent = function () {\n var eGui = this.getGui();\n var _a = this.config, alwaysOnTop = _a.alwaysOnTop, modal = _a.modal;\n var addPopupRes = this.popupService.addPopup({\n modal: modal,\n eChild: eGui,\n closeOnEsc: true,\n closedCallback: this.destroy.bind(this),\n alwaysOnTop: alwaysOnTop\n });\n if (addPopupRes) {\n this.close = addPopupRes.hideFunc;\n }\n };\n AgDialog.prototype.addResizers = function () {\n var eGui = this.getGui();\n if (!eGui) {\n return;\n }\n var parser = new DOMParser();\n var resizers = parser.parseFromString(this.RESIZE_TEMPLATE, 'text/html').body;\n eGui.appendChild(resizers.firstChild);\n this.createMap();\n };\n AgDialog.prototype.createMap = function () {\n var eGui = this.getGui();\n this.resizerMap = {\n topLeft: { element: eGui.querySelector('[ref=eTopLeftResizer]') },\n top: { element: eGui.querySelector('[ref=eTopResizer]') },\n topRight: { element: eGui.querySelector('[ref=eTopRightResizer]') },\n right: { element: eGui.querySelector('[ref=eRightResizer]') },\n bottomRight: { element: eGui.querySelector('[ref=eBottomRightResizer]') },\n bottom: { element: eGui.querySelector('[ref=eBottomResizer]') },\n bottomLeft: { element: eGui.querySelector('[ref=eBottomLeftResizer]') },\n left: { element: eGui.querySelector('[ref=eLeftResizer]') }\n };\n };\n AgDialog.prototype.getResizerElement = function (side) {\n return this.resizerMap[side].element;\n };\n AgDialog.prototype.onResizeStart = function (e) {\n this.isResizing = true;\n this.updateDragStartPosition(e.clientX, e.clientY);\n };\n AgDialog.prototype.onResize = function (e, side) {\n if (!this.isResizing) {\n return;\n }\n var isLeft = !!side.match(/left/i);\n var isRight = !!side.match(/right/i);\n var isTop = !!side.match(/top/i);\n var isBottom = !!side.match(/bottom/i);\n var isHorizontal = isLeft || isRight;\n var isVertical = isTop || isBottom;\n var _a = this.calculateMouseMovement({ e: e, isLeft: isLeft, isTop: isTop }), movementX = _a.movementX, movementY = _a.movementY;\n var offsetLeft = 0;\n var offsetTop = 0;\n if (isHorizontal && movementX) {\n var direction = isLeft ? -1 : 1;\n var oldWidth = this.getWidth();\n var newWidth = oldWidth + (movementX * direction);\n var skipWidth = false;\n if (isLeft) {\n offsetLeft = oldWidth - newWidth;\n if (this.position.x + offsetLeft <= 0 || newWidth <= this.minWidth) {\n skipWidth = true;\n offsetLeft = 0;\n }\n }\n if (!skipWidth) {\n this.setWidth(newWidth);\n }\n }\n if (isVertical && movementY) {\n var direction = isTop ? -1 : 1;\n var oldHeight = this.getHeight();\n var newHeight = oldHeight + (movementY * direction);\n var skipHeight = false;\n if (isTop) {\n offsetTop = oldHeight - newHeight;\n if (this.position.y + offsetTop <= 0 || newHeight <= this.minHeight) {\n skipHeight = true;\n offsetTop = 0;\n }\n }\n if (!skipHeight) {\n this.setHeight(newHeight);\n }\n }\n this.updateDragStartPosition(e.clientX, e.clientY);\n if (offsetLeft || offsetTop) {\n this.offsetElement(this.position.x + offsetLeft, this.position.y + offsetTop);\n }\n };\n AgDialog.prototype.onResizeEnd = function () {\n this.isResizing = false;\n var params = {\n type: 'resize',\n api: this.gridOptionsWrapper.getApi(),\n columnApi: this.gridOptionsWrapper.getColumnApi()\n };\n this.dispatchEvent(params);\n };\n AgDialog.prototype.onMoveStart = function (e) {\n this.isMoving = true;\n this.updateDragStartPosition(e.clientX, e.clientY);\n };\n AgDialog.prototype.onMove = function (e) {\n if (!this.isMoving) {\n return;\n }\n var _a = this.position, x = _a.x, y = _a.y;\n var _b = this.calculateMouseMovement({\n e: e,\n isTop: true,\n anywhereWithin: true,\n topBuffer: this.getHeight() - this.getBodyHeight()\n }), movementX = _b.movementX, movementY = _b.movementY;\n this.offsetElement(x + movementX, y + movementY);\n this.updateDragStartPosition(e.clientX, e.clientY);\n };\n AgDialog.prototype.onMoveEnd = function () {\n this.isMoving = false;\n };\n AgDialog.prototype.toggleMaximize = function () {\n if (this.isMaximized) {\n var _a = this.lastPosition, x = _a.x, y = _a.y, width = _a.width, height = _a.height;\n this.setWidth(width);\n this.setHeight(height);\n this.offsetElement(x, y);\n }\n else {\n this.lastPosition.width = this.getWidth();\n this.lastPosition.height = this.getHeight();\n this.lastPosition.x = this.position.x;\n this.lastPosition.y = this.position.y;\n this.offsetElement(0, 0);\n this.setHeight('100%');\n this.setWidth('100%');\n }\n this.isMaximized = !this.isMaximized;\n this.refreshMaximizeIcon();\n };\n AgDialog.prototype.refreshMaximizeIcon = function () {\n setDisplayed(this.maximizeIcon, !this.isMaximized);\n setDisplayed(this.minimizeIcon, this.isMaximized);\n };\n AgDialog.prototype.clearMaximizebleListeners = function () {\n if (this.maximizeListeners.length) {\n this.maximizeListeners.forEach(function (destroyListener) { return destroyListener(); });\n this.maximizeListeners.length = 0;\n }\n if (this.resizeListenerDestroy) {\n this.resizeListenerDestroy();\n this.resizeListenerDestroy = null;\n }\n };\n AgDialog.prototype.destroy = function () {\n this.setResizable(false);\n this.setMovable(false);\n this.maximizeButtonComp = this.destroyBean(this.maximizeButtonComp);\n this.clearMaximizebleListeners();\n _super.prototype.destroy.call(this);\n };\n AgDialog.prototype.setResizable = function (resizable) {\n var _this = this;\n if (typeof resizable === 'boolean') {\n resizable = {\n topLeft: resizable,\n top: resizable,\n topRight: resizable,\n right: resizable,\n bottomRight: resizable,\n bottom: resizable,\n bottomLeft: resizable,\n left: resizable\n };\n }\n Object.keys(resizable).forEach(function (side) {\n var r = resizable;\n var s = side;\n var val = !!r[s];\n var el = _this.getResizerElement(s);\n var params = _this.resizerMap[s].dragSource || {\n eElement: el,\n onDragStart: _this.onResizeStart.bind(_this),\n onDragging: function (e) { return _this.onResize(e, s); },\n onDragStop: _this.onResizeEnd.bind(_this),\n };\n if (!!_this.resizable[s] !== val || (!_this.isAlive() && !val)) {\n if (val) {\n _this.dragService.addDragSource(params);\n el.style.pointerEvents = 'all';\n }\n else {\n _this.dragService.removeDragSource(params);\n el.style.pointerEvents = 'none';\n }\n _this.resizerMap[s].dragSource = val ? params : undefined;\n }\n });\n };\n AgDialog.prototype.setMovable = function (movable) {\n if (movable === this.movable) {\n return;\n }\n this.movable = movable;\n var params = this.moveElementDragListener || {\n eElement: this.moveElement,\n onDragStart: this.onMoveStart.bind(this),\n onDragging: this.onMove.bind(this),\n onDragStop: this.onMoveEnd.bind(this)\n };\n if (movable) {\n this.dragService.addDragSource(params);\n this.moveElementDragListener = params;\n }\n else {\n this.dragService.removeDragSource(params);\n this.moveElementDragListener = undefined;\n }\n };\n AgDialog.prototype.setMaximizable = function (maximizable) {\n var _this = this;\n if (!maximizable) {\n this.clearMaximizebleListeners();\n if (this.maximizeButtonComp) {\n this.destroyBean(this.maximizeButtonComp);\n this.maximizeButtonComp = this.maximizeIcon = this.minimizeIcon = undefined;\n }\n return;\n }\n var eTitleBar = this.eTitleBar;\n if (!eTitleBar || maximizable === this.isMaximizable) {\n return;\n }\n var maximizeButtonComp = this.maximizeButtonComp =\n this.createBean(new Component(/* html */ \"
\"));\n var eGui = maximizeButtonComp.getGui();\n eGui.appendChild(this.maximizeIcon = createIconNoSpan('maximize', this.gridOptionsWrapper));\n addCssClass(this.maximizeIcon, 'ag-panel-title-bar-button-icon');\n eGui.appendChild(this.minimizeIcon = createIconNoSpan('minimize', this.gridOptionsWrapper));\n addCssClass(this.minimizeIcon, 'ag-panel-title-bar-button-icon');\n addCssClass(this.minimizeIcon, 'ag-hidden');\n maximizeButtonComp.addManagedListener(eGui, 'click', this.toggleMaximize.bind(this));\n this.addTitleBarButton(maximizeButtonComp, 0);\n this.maximizeListeners.push(this.addManagedListener(eTitleBar, 'dblclick', this.toggleMaximize.bind(this)));\n this.resizeListenerDestroy = this.addManagedListener(this, 'resize', function () {\n _this.isMaximized = false;\n _this.refreshMaximizeIcon();\n });\n };\n __decorate$1z([\n Autowired('dragService')\n ], AgDialog.prototype, \"dragService\", void 0);\n return AgDialog;\n}(AgPanel));\n\n/**\n * @ag-grid-community/core - Advanced Data Grid / Data Table supporting Javascript / React / AngularJS / Web Components\n * @version v25.1.0\n * @link http://www.ag-grid.com/\n * @license MIT\n */\nvar __extends$1F = (undefined && undefined.__extends) || (function () {\n var extendStatics = function (d, b) {\n extendStatics = Object.setPrototypeOf ||\n ({ __proto__: [] } instanceof Array && function (d, b) { d.__proto__ = b; }) ||\n function (d, b) { for (var p in b) if (b.hasOwnProperty(p)) d[p] = b[p]; };\n return extendStatics(d, b);\n };\n return function (d, b) {\n extendStatics(d, b);\n function __() { this.constructor = d; }\n d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __());\n };\n})();\nvar AgInputTextField = /** @class */ (function (_super) {\n __extends$1F(AgInputTextField, _super);\n function AgInputTextField(config, className, inputType) {\n if (className === void 0) { className = 'ag-text-field'; }\n if (inputType === void 0) { inputType = 'text'; }\n return _super.call(this, config, className, inputType) || this;\n }\n AgInputTextField.prototype.postConstruct = function () {\n _super.prototype.postConstruct.call(this);\n if (this.config.allowedCharPattern) {\n this.preventDisallowedCharacters();\n }\n };\n AgInputTextField.prototype.setValue = function (value, silent) {\n var ret = _super.prototype.setValue.call(this, value, silent);\n if (this.eInput.value !== value) {\n this.eInput.value = exists(value) ? value : '';\n }\n return ret;\n };\n AgInputTextField.prototype.preventDisallowedCharacters = function () {\n var pattern = new RegExp(\"[\" + this.config.allowedCharPattern + \"]\");\n var preventDisallowedCharacters = function (event) {\n if (event.key && !pattern.test(event.key)) {\n event.preventDefault();\n }\n };\n this.addManagedListener(this.eInput, 'keypress', preventDisallowedCharacters);\n this.addManagedListener(this.eInput, 'paste', function (e) {\n var text = e.clipboardData.getData('text');\n if (some(text, function (c) { return !pattern.test(c); })) {\n e.preventDefault();\n }\n });\n };\n return AgInputTextField;\n}(AgAbstractInputField));\n\n/**\n * @ag-grid-community/core - Advanced Data Grid / Data Table supporting Javascript / React / AngularJS / Web Components\n * @version v25.1.0\n * @link http://www.ag-grid.com/\n * @license MIT\n */\nvar __extends$1G = (undefined && undefined.__extends) || (function () {\n var extendStatics = function (d, b) {\n extendStatics = Object.setPrototypeOf ||\n ({ __proto__: [] } instanceof Array && function (d, b) { d.__proto__ = b; }) ||\n function (d, b) { for (var p in b) if (b.hasOwnProperty(p)) d[p] = b[p]; };\n return extendStatics(d, b);\n };\n return function (d, b) {\n extendStatics(d, b);\n function __() { this.constructor = d; }\n d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __());\n };\n})();\nvar AgInputTextArea = /** @class */ (function (_super) {\n __extends$1G(AgInputTextArea, _super);\n function AgInputTextArea(config) {\n return _super.call(this, config, 'ag-text-area', null, 'textarea') || this;\n }\n AgInputTextArea.prototype.setValue = function (value, silent) {\n var ret = _super.prototype.setValue.call(this, value, silent);\n this.eInput.value = value;\n return ret;\n };\n AgInputTextArea.prototype.setCols = function (cols) {\n this.eInput.cols = cols;\n return this;\n };\n AgInputTextArea.prototype.setRows = function (rows) {\n this.eInput.rows = rows;\n return this;\n };\n return AgInputTextArea;\n}(AgAbstractInputField));\n\n/**\n * @ag-grid-community/core - Advanced Data Grid / Data Table supporting Javascript / React / AngularJS / Web Components\n * @version v25.1.0\n * @link http://www.ag-grid.com/\n * @license MIT\n */\nvar __extends$1H = (undefined && undefined.__extends) || (function () {\n var extendStatics = function (d, b) {\n extendStatics = Object.setPrototypeOf ||\n ({ __proto__: [] } instanceof Array && function (d, b) { d.__proto__ = b; }) ||\n function (d, b) { for (var p in b) if (b.hasOwnProperty(p)) d[p] = b[p]; };\n return extendStatics(d, b);\n };\n return function (d, b) {\n extendStatics(d, b);\n function __() { this.constructor = d; }\n d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __());\n };\n})();\nvar __decorate$1A = (undefined && undefined.__decorate) || function (decorators, target, key, desc) {\n var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d;\n if (typeof Reflect === \"object\" && typeof Reflect.decorate === \"function\") r = Reflect.decorate(decorators, target, key, desc);\n else for (var i = decorators.length - 1; i >= 0; i--) if (d = decorators[i]) r = (c < 3 ? d(r) : c > 3 ? d(target, key, r) : d(target, key)) || r;\n return c > 3 && r && Object.defineProperty(target, key, r), r;\n};\nvar AgSlider = /** @class */ (function (_super) {\n __extends$1H(AgSlider, _super);\n function AgSlider(config) {\n var _this = _super.call(this, config, AgSlider.TEMPLATE) || this;\n _this.labelAlignment = 'top';\n return _this;\n }\n AgSlider.prototype.init = function () {\n addCssClass(this.eSlider.getGui(), 'ag-slider-field');\n };\n AgSlider.prototype.onValueChange = function (callbackFn) {\n var _this = this;\n var eventChanged = AgAbstractField.EVENT_CHANGED;\n this.addManagedListener(this.eText, eventChanged, function () {\n var textValue = parseFloat(_this.eText.getValue());\n _this.eSlider.setValue(textValue.toString(), true);\n callbackFn(textValue || 0);\n });\n this.addManagedListener(this.eSlider, eventChanged, function () {\n var sliderValue = _this.eSlider.getValue();\n _this.eText.setValue(sliderValue, true);\n callbackFn(parseFloat(sliderValue));\n });\n return this;\n };\n AgSlider.prototype.setSliderWidth = function (width) {\n this.eSlider.setWidth(width);\n return this;\n };\n AgSlider.prototype.setTextFieldWidth = function (width) {\n this.eText.setWidth(width);\n return this;\n };\n AgSlider.prototype.setMinValue = function (minValue) {\n this.eSlider.setMinValue(minValue);\n this.eText.setMin(minValue);\n return this;\n };\n AgSlider.prototype.setMaxValue = function (maxValue) {\n this.eSlider.setMaxValue(maxValue);\n this.eText.setMax(maxValue);\n return this;\n };\n AgSlider.prototype.getValue = function () {\n return this.eText.getValue();\n };\n AgSlider.prototype.setValue = function (value) {\n if (this.getValue() === value) {\n return this;\n }\n this.eText.setValue(value, true);\n this.eSlider.setValue(value, true);\n this.dispatchEvent({ type: AgAbstractField.EVENT_CHANGED });\n return this;\n };\n AgSlider.prototype.setStep = function (step) {\n this.eSlider.setStep(step);\n this.eText.setStep(step);\n return this;\n };\n AgSlider.TEMPLATE = \"
\\n \\n
\\n \\n \\n
\\n
\";\n __decorate$1A([\n RefSelector('eLabel')\n ], AgSlider.prototype, \"eLabel\", void 0);\n __decorate$1A([\n RefSelector('eSlider')\n ], AgSlider.prototype, \"eSlider\", void 0);\n __decorate$1A([\n RefSelector('eText')\n ], AgSlider.prototype, \"eText\", void 0);\n __decorate$1A([\n PostConstruct\n ], AgSlider.prototype, \"init\", null);\n return AgSlider;\n}(AgAbstractLabel));\n\n/**\n * @ag-grid-community/core - Advanced Data Grid / Data Table supporting Javascript / React / AngularJS / Web Components\n * @version v25.1.0\n * @link http://www.ag-grid.com/\n * @license MIT\n */\nvar __extends$1I = (undefined && undefined.__extends) || (function () {\n var extendStatics = function (d, b) {\n extendStatics = Object.setPrototypeOf ||\n ({ __proto__: [] } instanceof Array && function (d, b) { d.__proto__ = b; }) ||\n function (d, b) { for (var p in b) if (b.hasOwnProperty(p)) d[p] = b[p]; };\n return extendStatics(d, b);\n };\n return function (d, b) {\n extendStatics(d, b);\n function __() { this.constructor = d; }\n d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __());\n };\n})();\nvar __decorate$1B = (undefined && undefined.__decorate) || function (decorators, target, key, desc) {\n var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d;\n if (typeof Reflect === \"object\" && typeof Reflect.decorate === \"function\") r = Reflect.decorate(decorators, target, key, desc);\n else for (var i = decorators.length - 1; i >= 0; i--) if (d = decorators[i]) r = (c < 3 ? d(r) : c > 3 ? d(target, key, r) : d(target, key)) || r;\n return c > 3 && r && Object.defineProperty(target, key, r), r;\n};\nvar AgColorPanel = /** @class */ (function (_super) {\n __extends$1I(AgColorPanel, _super);\n function AgColorPanel(config) {\n var _this = _super.call(this, AgColorPanel.TEMPLATE) || this;\n _this.H = 1; // in the [0, 1] range\n _this.S = 1; // in the [0, 1] range\n _this.B = 1; // in the [0, 1] range\n _this.A = 1; // in the [0, 1] range\n _this.isSpectrumDragging = false;\n _this.isSpectrumHueDragging = false;\n _this.isSpectrumAlphaDragging = false;\n _this.colorChanged = false;\n _this.picker = config.picker;\n return _this;\n }\n AgColorPanel.prototype.postConstruct = function () {\n var eGui = this.getGui();\n this.initRecentColors();\n this.addManagedListener(this.spectrumVal, 'mousedown', this.onSpectrumDraggerDown.bind(this));\n this.addManagedListener(eGui, 'mousemove', this.onSpectrumDraggerMove.bind(this));\n this.addManagedListener(this.spectrumHue, 'mousedown', this.onSpectrumHueDown.bind(this));\n this.addManagedListener(eGui, 'mousemove', this.onSpectrumHueMove.bind(this));\n this.addManagedListener(this.spectrumAlpha, 'mousedown', this.onSpectrumAlphaDown.bind(this));\n this.addManagedListener(eGui, 'mousemove', this.onSpectrumAlphaMove.bind(this));\n // Listening to `mouseup` on the document on purpose. The user might release the mouse button\n // outside the UI control. When the mouse returns back to the control's area, the dragging\n // of the thumb is not expected and seen as a bug.\n this.addManagedListener(document, 'mouseup', this.onMouseUp.bind(this));\n this.addManagedListener(this.recentColors, 'click', this.onRecentColorClick.bind(this));\n };\n AgColorPanel.prototype.refreshSpectrumRect = function () {\n return this.spectrumValRect = this.spectrumVal.getBoundingClientRect();\n };\n AgColorPanel.prototype.refreshHueRect = function () {\n return this.spectrumHueRect = this.spectrumHue.getBoundingClientRect();\n };\n AgColorPanel.prototype.refreshAlphaRect = function () {\n return this.spectrumAlphaRect = this.spectrumAlpha.getBoundingClientRect();\n };\n AgColorPanel.prototype.onSpectrumDraggerDown = function (e) {\n this.refreshSpectrumRect();\n this.isSpectrumDragging = true;\n this.moveDragger(e);\n };\n AgColorPanel.prototype.onSpectrumDraggerMove = function (e) {\n if (this.isSpectrumDragging) {\n this.moveDragger(e);\n }\n };\n AgColorPanel.prototype.onSpectrumHueDown = function (e) {\n this.refreshHueRect();\n this.isSpectrumHueDragging = true;\n this.moveHueSlider(e);\n };\n AgColorPanel.prototype.onSpectrumHueMove = function (e) {\n if (this.isSpectrumHueDragging) {\n this.moveHueSlider(e);\n }\n };\n AgColorPanel.prototype.onSpectrumAlphaDown = function (e) {\n this.refreshAlphaRect();\n this.isSpectrumAlphaDragging = true;\n this.moveAlphaSlider(e);\n };\n AgColorPanel.prototype.onSpectrumAlphaMove = function (e) {\n if (this.isSpectrumAlphaDragging) {\n this.moveAlphaSlider(e);\n }\n };\n AgColorPanel.prototype.onMouseUp = function () {\n this.isSpectrumDragging = false;\n this.isSpectrumHueDragging = false;\n this.isSpectrumAlphaDragging = false;\n };\n AgColorPanel.prototype.moveDragger = function (e) {\n var valRect = this.spectrumValRect;\n if (valRect) {\n var x = e.clientX - valRect.left;\n var y = e.clientY - valRect.top;\n x = Math.max(x, 0);\n x = Math.min(x, valRect.width);\n y = Math.max(y, 0);\n y = Math.min(y, valRect.height);\n this.setSpectrumValue(x / valRect.width, 1 - y / valRect.height);\n }\n };\n AgColorPanel.prototype.moveHueSlider = function (e) {\n var hueRect = this.spectrumHueRect;\n if (hueRect) {\n var slider = this.spectrumHueSlider;\n var sliderRect = slider.getBoundingClientRect();\n var x = e.clientX - hueRect.left;\n x = Math.max(x, 0);\n x = Math.min(x, hueRect.width);\n this.H = 1 - x / hueRect.width;\n slider.style.left = (x + sliderRect.width / 2) + 'px';\n this.update();\n }\n };\n AgColorPanel.prototype.moveAlphaSlider = function (e) {\n var alphaRect = this.spectrumAlphaRect;\n if (alphaRect) {\n var slider = this.spectrumAlphaSlider;\n var sliderRect = slider.getBoundingClientRect();\n var x = e.clientX - alphaRect.left;\n x = Math.max(x, 0);\n x = Math.min(x, alphaRect.width);\n this.A = x / alphaRect.width;\n slider.style.left = (x + sliderRect.width / 2) + 'px';\n this.update();\n }\n };\n AgColorPanel.prototype.update = function () {\n var color = Color.fromHSB(this.H * 360, this.S, this.B, this.A);\n var spectrumColor = Color.fromHSB(this.H * 360, 1, 1);\n var rgbaColor = color.toRgbaString();\n // the recent color list needs to know color has actually changed\n var colorPicker = this.picker;\n var existingColor = Color.fromString(colorPicker.getValue());\n if (existingColor.toRgbaString() !== rgbaColor) {\n this.colorChanged = true;\n }\n colorPicker.setValue(rgbaColor);\n this.spectrumColor.style.backgroundColor = spectrumColor.toRgbaString();\n this.spectrumDragger.style.backgroundColor = rgbaColor;\n };\n /**\n * @param saturation In the [0, 1] interval.\n * @param brightness In the [0, 1] interval.\n */\n AgColorPanel.prototype.setSpectrumValue = function (saturation, brightness) {\n var valRect = this.spectrumValRect || this.refreshSpectrumRect();\n if (valRect) {\n var dragger = this.spectrumDragger;\n var draggerRect = dragger.getBoundingClientRect();\n saturation = Math.max(0, saturation);\n saturation = Math.min(1, saturation);\n brightness = Math.max(0, brightness);\n brightness = Math.min(1, brightness);\n this.S = saturation;\n this.B = brightness;\n dragger.style.left = (saturation * valRect.width - draggerRect.width / 2) + 'px';\n dragger.style.top = ((1 - brightness) * valRect.height - draggerRect.height / 2) + 'px';\n this.update();\n }\n };\n AgColorPanel.prototype.initRecentColors = function () {\n var recentColors = AgColorPanel.recentColors;\n var innerHtml = recentColors.map(function (color, index) {\n return \"
\";\n });\n this.recentColors.innerHTML = innerHtml.join('');\n };\n AgColorPanel.prototype.setValue = function (val) {\n var color = Color.fromString(val);\n var _a = color.toHSB(), h = _a[0], s = _a[1], b = _a[2];\n this.H = (isNaN(h) ? 0 : h) / 360;\n this.A = color.a;\n var spectrumHueRect = this.spectrumHueRect || this.refreshHueRect();\n var spectrumAlphaRect = this.spectrumAlphaRect || this.refreshAlphaRect();\n this.spectrumHueSlider.style.left = ((this.H - 1) * -spectrumHueRect.width) + \"px\";\n this.spectrumAlphaSlider.style.left = (this.A * spectrumAlphaRect.width) + \"px\";\n this.setSpectrumValue(s, b);\n };\n AgColorPanel.prototype.onRecentColorClick = function (e) {\n var target = e.target;\n if (!exists(target.id)) {\n return;\n }\n var id = parseInt(target.id, 10);\n this.setValue(AgColorPanel.recentColors[id]);\n this.destroy();\n };\n AgColorPanel.prototype.addRecentColor = function () {\n var color = Color.fromHSB(this.H * 360, this.S, this.B, this.A);\n var rgbaColor = color.toRgbaString();\n var recentColors = AgColorPanel.recentColors;\n if (!this.colorChanged || recentColors[0] === rgbaColor) {\n return;\n }\n // remove duplicate color\n recentColors = recentColors.filter(function (currentColor) { return currentColor != rgbaColor; });\n // add color to head\n recentColors = [rgbaColor].concat(recentColors);\n // ensure we don't exceed max number of recent colors\n if (recentColors.length > AgColorPanel.maxRecentColors) {\n recentColors = recentColors.slice(0, AgColorPanel.maxRecentColors);\n }\n AgColorPanel.recentColors = recentColors;\n };\n AgColorPanel.prototype.destroy = function () {\n this.addRecentColor();\n _super.prototype.destroy.call(this);\n };\n AgColorPanel.maxRecentColors = 8;\n AgColorPanel.recentColors = [];\n AgColorPanel.TEMPLATE = \"
\\n
\\n
\\n
\\n
\\n
\\n
\\n
\\n
\\n
\\n
\\n
\\n
\\n
\\n
\\n
\\n
\\n
\\n
\\n
\";\n __decorate$1B([\n RefSelector('spectrumColor')\n ], AgColorPanel.prototype, \"spectrumColor\", void 0);\n __decorate$1B([\n RefSelector('spectrumVal')\n ], AgColorPanel.prototype, \"spectrumVal\", void 0);\n __decorate$1B([\n RefSelector('spectrumDragger')\n ], AgColorPanel.prototype, \"spectrumDragger\", void 0);\n __decorate$1B([\n RefSelector('spectrumHue')\n ], AgColorPanel.prototype, \"spectrumHue\", void 0);\n __decorate$1B([\n RefSelector('spectrumHueSlider')\n ], AgColorPanel.prototype, \"spectrumHueSlider\", void 0);\n __decorate$1B([\n RefSelector('spectrumAlpha')\n ], AgColorPanel.prototype, \"spectrumAlpha\", void 0);\n __decorate$1B([\n RefSelector('spectrumAlphaSlider')\n ], AgColorPanel.prototype, \"spectrumAlphaSlider\", void 0);\n __decorate$1B([\n RefSelector('recentColors')\n ], AgColorPanel.prototype, \"recentColors\", void 0);\n __decorate$1B([\n PostConstruct\n ], AgColorPanel.prototype, \"postConstruct\", null);\n return AgColorPanel;\n}(Component));\n\n/**\n * @ag-grid-community/core - Advanced Data Grid / Data Table supporting Javascript / React / AngularJS / Web Components\n * @version v25.1.0\n * @link http://www.ag-grid.com/\n * @license MIT\n */\nvar __extends$1J = (undefined && undefined.__extends) || (function () {\n var extendStatics = function (d, b) {\n extendStatics = Object.setPrototypeOf ||\n ({ __proto__: [] } instanceof Array && function (d, b) { d.__proto__ = b; }) ||\n function (d, b) { for (var p in b) if (b.hasOwnProperty(p)) d[p] = b[p]; };\n return extendStatics(d, b);\n };\n return function (d, b) {\n extendStatics(d, b);\n function __() { this.constructor = d; }\n d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __());\n };\n})();\nvar __decorate$1C = (undefined && undefined.__decorate) || function (decorators, target, key, desc) {\n var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d;\n if (typeof Reflect === \"object\" && typeof Reflect.decorate === \"function\") r = Reflect.decorate(decorators, target, key, desc);\n else for (var i = decorators.length - 1; i >= 0; i--) if (d = decorators[i]) r = (c < 3 ? d(r) : c > 3 ? d(target, key, r) : d(target, key)) || r;\n return c > 3 && r && Object.defineProperty(target, key, r), r;\n};\nvar AgPickerField = /** @class */ (function (_super) {\n __extends$1J(AgPickerField, _super);\n function AgPickerField(config, className, pickerIcon, popupRole) {\n var _this = _super.call(this, config, \n /* html */ \"
\\n
\\n
\\n
\\n
\\n
\\n
\", className) || this;\n _this.pickerIcon = pickerIcon;\n _this.isPickerDisplayed = false;\n _this.isDestroyingPicker = false;\n _this.skipClick = false;\n return _this;\n }\n AgPickerField.prototype.postConstruct = function () {\n var _this = this;\n _super.prototype.postConstruct.call(this);\n var displayId = this.getCompId() + \"-display\";\n this.eDisplayField.setAttribute('id', displayId);\n setAriaDescribedBy(this.eWrapper, displayId);\n var clickHandler = function () {\n if (_this.skipClick) {\n _this.skipClick = false;\n return;\n }\n if (_this.isDisabled()) {\n return;\n }\n _this.pickerComponent = _this.showPicker();\n };\n var eGui = this.getGui();\n this.addManagedListener(eGui, 'mousedown', function (e) {\n if (!_this.skipClick &&\n _this.pickerComponent &&\n _this.pickerComponent.isAlive() &&\n isVisible(_this.pickerComponent.getGui()) &&\n eGui.contains(e.target)) {\n _this.skipClick = true;\n }\n });\n this.addManagedListener(eGui, 'keydown', function (e) {\n switch (e.keyCode) {\n case KeyCode.UP:\n case KeyCode.DOWN:\n case KeyCode.ENTER:\n case KeyCode.SPACE:\n clickHandler();\n case KeyCode.ESCAPE:\n if (_this.isPickerDisplayed) {\n e.preventDefault();\n }\n break;\n }\n });\n this.addManagedListener(this.eWrapper, 'click', clickHandler);\n this.addManagedListener(this.eLabel, 'click', clickHandler);\n if (this.pickerIcon) {\n var icon = createIconNoSpan(this.pickerIcon, this.gridOptionsWrapper);\n if (icon) {\n this.eIcon.appendChild(icon);\n }\n }\n };\n AgPickerField.prototype.refreshLabel = function () {\n if (exists(this.getLabel())) {\n setAriaLabelledBy(this.eWrapper, this.getLabelId());\n }\n else {\n this.eWrapper.removeAttribute('aria-labelledby');\n }\n _super.prototype.refreshLabel.call(this);\n };\n AgPickerField.prototype.setAriaLabel = function (label) {\n setAriaLabel(this.eWrapper, label);\n return this;\n };\n AgPickerField.prototype.setInputWidth = function (width) {\n setElementWidth(this.eWrapper, width);\n return this;\n };\n AgPickerField.prototype.getFocusableElement = function () {\n return this.eWrapper;\n };\n __decorate$1C([\n RefSelector('eLabel')\n ], AgPickerField.prototype, \"eLabel\", void 0);\n __decorate$1C([\n RefSelector('eWrapper')\n ], AgPickerField.prototype, \"eWrapper\", void 0);\n __decorate$1C([\n RefSelector('eDisplayField')\n ], AgPickerField.prototype, \"eDisplayField\", void 0);\n __decorate$1C([\n RefSelector('eIcon')\n ], AgPickerField.prototype, \"eIcon\", void 0);\n return AgPickerField;\n}(AgAbstractField));\n\n/**\n * @ag-grid-community/core - Advanced Data Grid / Data Table supporting Javascript / React / AngularJS / Web Components\n * @version v25.1.0\n * @link http://www.ag-grid.com/\n * @license MIT\n */\nvar __extends$1K = (undefined && undefined.__extends) || (function () {\n var extendStatics = function (d, b) {\n extendStatics = Object.setPrototypeOf ||\n ({ __proto__: [] } instanceof Array && function (d, b) { d.__proto__ = b; }) ||\n function (d, b) { for (var p in b) if (b.hasOwnProperty(p)) d[p] = b[p]; };\n return extendStatics(d, b);\n };\n return function (d, b) {\n extendStatics(d, b);\n function __() { this.constructor = d; }\n d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __());\n };\n})();\nvar AgColorPicker = /** @class */ (function (_super) {\n __extends$1K(AgColorPicker, _super);\n function AgColorPicker(config) {\n var _this = _super.call(this, config, 'ag-color-picker', 'colorPicker') || this;\n if (config && config.color) {\n _this.value = config.color;\n }\n return _this;\n }\n AgColorPicker.prototype.postConstruct = function () {\n _super.prototype.postConstruct.call(this);\n if (this.value) {\n this.setValue(this.value);\n }\n };\n AgColorPicker.prototype.showPicker = function () {\n var _this = this;\n var eGuiRect = this.getGui().getBoundingClientRect();\n var colorDialog = this.createBean(new AgDialog({\n closable: false,\n modal: true,\n hideTitleBar: true,\n minWidth: 190,\n width: 190,\n height: 250,\n x: eGuiRect.right - 190,\n y: eGuiRect.top - 250\n }));\n this.isPickerDisplayed = true;\n addCssClass(colorDialog.getGui(), 'ag-color-dialog');\n var colorPanel = this.createBean(new AgColorPanel({ picker: this }));\n colorPanel.addDestroyFunc(function () {\n if (colorDialog.isAlive()) {\n _this.destroyBean(colorDialog);\n }\n });\n colorDialog.setParentComponent(this);\n colorDialog.setBodyComponent(colorPanel);\n colorPanel.setValue(this.getValue());\n colorDialog.addDestroyFunc(function () {\n // here we check if the picker was already being\n // destroyed to avoid a stack overflow\n if (!_this.isDestroyingPicker) {\n _this.isDestroyingPicker = true;\n if (colorPanel.isAlive()) {\n _this.destroyBean(colorPanel);\n }\n }\n else {\n _this.isDestroyingPicker = false;\n }\n if (_this.isAlive()) {\n _this.getFocusableElement().focus();\n }\n _this.isPickerDisplayed = false;\n });\n return colorDialog;\n };\n AgColorPicker.prototype.setValue = function (color) {\n if (this.value === color) {\n return this;\n }\n this.eDisplayField.style.backgroundColor = color;\n return _super.prototype.setValue.call(this, color);\n };\n AgColorPicker.prototype.getValue = function () {\n return this.value;\n };\n return AgColorPicker;\n}(AgPickerField));\n\n/**\n * @ag-grid-community/core - Advanced Data Grid / Data Table supporting Javascript / React / AngularJS / Web Components\n * @version v25.1.0\n * @link http://www.ag-grid.com/\n * @license MIT\n */\nvar __extends$1L = (undefined && undefined.__extends) || (function () {\n var extendStatics = function (d, b) {\n extendStatics = Object.setPrototypeOf ||\n ({ __proto__: [] } instanceof Array && function (d, b) { d.__proto__ = b; }) ||\n function (d, b) { for (var p in b) if (b.hasOwnProperty(p)) d[p] = b[p]; };\n return extendStatics(d, b);\n };\n return function (d, b) {\n extendStatics(d, b);\n function __() { this.constructor = d; }\n d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __());\n };\n})();\nvar AgInputNumberField = /** @class */ (function (_super) {\n __extends$1L(AgInputNumberField, _super);\n function AgInputNumberField(config) {\n return _super.call(this, config, 'ag-number-field', 'number') || this;\n }\n AgInputNumberField.prototype.postConstruct = function () {\n var _this = this;\n _super.prototype.postConstruct.call(this);\n this.addManagedListener(this.eInput, 'blur', function () {\n var floatedValue = parseFloat(_this.eInput.value);\n var value = isNaN(floatedValue) ? '' : _this.normalizeValue(floatedValue.toString());\n if (_this.value !== value) {\n _this.setValue(value);\n }\n });\n };\n AgInputNumberField.prototype.normalizeValue = function (value) {\n if (value === '') {\n return '';\n }\n if (this.precision) {\n value = this.adjustPrecision(value);\n }\n var val = parseFloat(value);\n if (this.min != null && val < this.min) {\n value = this.min.toString();\n }\n else if (this.max != null && val > this.max) {\n value = this.max.toString();\n }\n return value;\n };\n AgInputNumberField.prototype.adjustPrecision = function (value) {\n if (this.precision) {\n var floatString = parseFloat(value).toFixed(this.precision);\n value = parseFloat(floatString).toString();\n }\n return value;\n };\n AgInputNumberField.prototype.setMin = function (min) {\n if (this.min === min) {\n return this;\n }\n this.min = min;\n addOrRemoveAttribute(this.eInput, 'min', min);\n return this;\n };\n AgInputNumberField.prototype.setMax = function (max) {\n if (this.max === max) {\n return this;\n }\n this.max = max;\n addOrRemoveAttribute(this.eInput, 'max', max);\n return this;\n };\n AgInputNumberField.prototype.setPrecision = function (precision) {\n this.precision = precision;\n return this;\n };\n AgInputNumberField.prototype.setStep = function (step) {\n if (this.step === step) {\n return this;\n }\n this.step = step;\n addOrRemoveAttribute(this.eInput, 'step', step);\n return this;\n };\n AgInputNumberField.prototype.setValue = function (value, silent) {\n value = this.adjustPrecision(value);\n var normalizedValue = this.normalizeValue(value);\n if (value != normalizedValue) {\n return this;\n }\n return _super.prototype.setValue.call(this, value, silent);\n };\n return AgInputNumberField;\n}(AgInputTextField));\n\n/**\n * @ag-grid-community/core - Advanced Data Grid / Data Table supporting Javascript / React / AngularJS / Web Components\n * @version v25.1.0\n * @link http://www.ag-grid.com/\n * @license MIT\n */\nvar __extends$1M = (undefined && undefined.__extends) || (function () {\n var extendStatics = function (d, b) {\n extendStatics = Object.setPrototypeOf ||\n ({ __proto__: [] } instanceof Array && function (d, b) { d.__proto__ = b; }) ||\n function (d, b) { for (var p in b) if (b.hasOwnProperty(p)) d[p] = b[p]; };\n return extendStatics(d, b);\n };\n return function (d, b) {\n extendStatics(d, b);\n function __() { this.constructor = d; }\n d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __());\n };\n})();\nvar AgInputRange = /** @class */ (function (_super) {\n __extends$1M(AgInputRange, _super);\n function AgInputRange(config) {\n return _super.call(this, config, 'ag-range-field', 'range') || this;\n }\n AgInputRange.prototype.postConstruct = function () {\n _super.prototype.postConstruct.call(this);\n var _a = this.config, min = _a.min, max = _a.max, step = _a.step;\n if (min != null) {\n this.setMinValue(min);\n }\n if (max != null) {\n this.setMaxValue(max);\n }\n this.setStep(step || 1);\n };\n AgInputRange.prototype.addInputListeners = function () {\n var _this = this;\n var isIE = isBrowserIE();\n var eventName = isIE ? 'change' : 'input';\n this.addManagedListener(this.eInput, eventName, function (e) {\n var value = e.target.value;\n _this.setValue(value);\n });\n };\n AgInputRange.prototype.setMinValue = function (value) {\n this.min = value;\n this.eInput.setAttribute('min', value.toString());\n return this;\n };\n AgInputRange.prototype.setMaxValue = function (value) {\n this.max = value;\n this.eInput.setAttribute('max', value.toString());\n return this;\n };\n AgInputRange.prototype.setStep = function (value) {\n this.eInput.setAttribute('step', value.toString());\n return this;\n };\n AgInputRange.prototype.setValue = function (value, silent) {\n if (this.min != null) {\n value = Math.max(parseFloat(value), this.min).toString();\n }\n if (this.max != null) {\n value = Math.min(parseFloat(value), this.max).toString();\n }\n var ret = _super.prototype.setValue.call(this, value, silent);\n this.eInput.value = value;\n return ret;\n };\n return AgInputRange;\n}(AgAbstractInputField));\n\n/**\n * @ag-grid-community/core - Advanced Data Grid / Data Table supporting Javascript / React / AngularJS / Web Components\n * @version v25.1.0\n * @link http://www.ag-grid.com/\n * @license MIT\n */\nvar __extends$1N = (undefined && undefined.__extends) || (function () {\n var extendStatics = function (d, b) {\n extendStatics = Object.setPrototypeOf ||\n ({ __proto__: [] } instanceof Array && function (d, b) { d.__proto__ = b; }) ||\n function (d, b) { for (var p in b) if (b.hasOwnProperty(p)) d[p] = b[p]; };\n return extendStatics(d, b);\n };\n return function (d, b) {\n extendStatics(d, b);\n function __() { this.constructor = d; }\n d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __());\n };\n})();\nvar __decorate$1D = (undefined && undefined.__decorate) || function (decorators, target, key, desc) {\n var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d;\n if (typeof Reflect === \"object\" && typeof Reflect.decorate === \"function\") r = Reflect.decorate(decorators, target, key, desc);\n else for (var i = decorators.length - 1; i >= 0; i--) if (d = decorators[i]) r = (c < 3 ? d(r) : c > 3 ? d(target, key, r) : d(target, key)) || r;\n return c > 3 && r && Object.defineProperty(target, key, r), r;\n};\nvar AgList = /** @class */ (function (_super) {\n __extends$1N(AgList, _super);\n function AgList(cssIdentifier) {\n if (cssIdentifier === void 0) { cssIdentifier = 'default'; }\n var _this = _super.call(this, /* html */ \"
\") || this;\n _this.cssIdentifier = cssIdentifier;\n _this.options = [];\n _this.itemEls = [];\n return _this;\n }\n AgList.prototype.init = function () {\n this.addManagedListener(this.getGui(), 'keydown', this.handleKeyDown.bind(this));\n };\n AgList.prototype.handleKeyDown = function (e) {\n var key = e.keyCode;\n switch (key) {\n case KeyCode.ENTER:\n if (!this.highlightedEl) {\n this.setValue(this.getValue());\n }\n else {\n var pos = this.itemEls.indexOf(this.highlightedEl);\n this.setValueByIndex(pos);\n }\n break;\n case KeyCode.DOWN:\n case KeyCode.UP:\n var isDown = key === KeyCode.DOWN;\n var itemToHighlight = void 0;\n e.preventDefault();\n if (!this.highlightedEl) {\n itemToHighlight = this.itemEls[isDown ? 0 : this.itemEls.length - 1];\n }\n else {\n var currentIdx = this.itemEls.indexOf(this.highlightedEl);\n var nextPos = currentIdx + (isDown ? 1 : -1);\n nextPos = Math.min(Math.max(nextPos, 0), this.itemEls.length - 1);\n itemToHighlight = this.itemEls[nextPos];\n }\n this.highlightItem(itemToHighlight);\n break;\n }\n };\n AgList.prototype.addOptions = function (listOptions) {\n var _this = this;\n listOptions.forEach(function (listOption) { return _this.addOption(listOption); });\n return this;\n };\n AgList.prototype.addOption = function (listOption) {\n var value = listOption.value, text = listOption.text;\n var sanitisedText = escapeString(text || value);\n this.options.push({ value: value, text: sanitisedText });\n this.renderOption(value, sanitisedText);\n return this;\n };\n AgList.prototype.renderOption = function (value, text) {\n var _this = this;\n var itemEl = document.createElement('div');\n itemEl.setAttribute('role', 'option');\n addCssClass(itemEl, 'ag-list-item');\n addCssClass(itemEl, \"ag-\" + this.cssIdentifier + \"-list-item\");\n itemEl.innerHTML = \"\" + text + \"\";\n itemEl.tabIndex = -1;\n this.itemEls.push(itemEl);\n this.addManagedListener(itemEl, 'mouseover', function () { return _this.highlightItem(itemEl); });\n this.addManagedListener(itemEl, 'mouseleave', function () { return _this.clearHighlighted(); });\n this.addManagedListener(itemEl, 'click', function () { return _this.setValue(value); });\n this.getGui().appendChild(itemEl);\n };\n AgList.prototype.setValue = function (value, silent) {\n if (this.value === value) {\n this.fireItemSelected();\n return this;\n }\n if (value == null) {\n this.reset();\n return this;\n }\n var idx = findIndex(this.options, function (option) { return option.value === value; });\n if (idx !== -1) {\n var option = this.options[idx];\n this.value = option.value;\n this.displayValue = option.text != null ? option.text : option.value;\n this.highlightItem(this.itemEls[idx]);\n if (!silent) {\n this.fireChangeEvent();\n }\n }\n return this;\n };\n AgList.prototype.setValueByIndex = function (idx) {\n return this.setValue(this.options[idx].value);\n };\n AgList.prototype.getValue = function () {\n return this.value;\n };\n AgList.prototype.getDisplayValue = function () {\n return this.displayValue;\n };\n AgList.prototype.refreshHighlighted = function () {\n var _this = this;\n this.clearHighlighted();\n var idx = findIndex(this.options, function (option) { return option.value === _this.value; });\n if (idx !== -1) {\n this.highlightItem(this.itemEls[idx]);\n }\n };\n AgList.prototype.reset = function () {\n this.value = null;\n this.displayValue = null;\n this.clearHighlighted();\n this.fireChangeEvent();\n };\n AgList.prototype.highlightItem = function (el) {\n if (!el.offsetParent) {\n return;\n }\n this.clearHighlighted();\n this.highlightedEl = el;\n addCssClass(this.highlightedEl, AgList.ACTIVE_CLASS);\n setAriaSelected(this.highlightedEl, true);\n this.highlightedEl.focus();\n };\n AgList.prototype.clearHighlighted = function () {\n if (!this.highlightedEl || !this.highlightedEl.offsetParent) {\n return;\n }\n removeCssClass(this.highlightedEl, AgList.ACTIVE_CLASS);\n setAriaSelected(this.highlightedEl, false);\n this.highlightedEl = null;\n };\n AgList.prototype.fireChangeEvent = function () {\n this.dispatchEvent({ type: AgAbstractField.EVENT_CHANGED });\n this.fireItemSelected();\n };\n AgList.prototype.fireItemSelected = function () {\n this.dispatchEvent({ type: AgList.EVENT_ITEM_SELECTED });\n };\n AgList.EVENT_ITEM_SELECTED = 'selectedItem';\n AgList.ACTIVE_CLASS = 'ag-active-item';\n __decorate$1D([\n PostConstruct\n ], AgList.prototype, \"init\", null);\n return AgList;\n}(Component));\n\n/**\n * @ag-grid-community/core - Advanced Data Grid / Data Table supporting Javascript / React / AngularJS / Web Components\n * @version v25.1.0\n * @link http://www.ag-grid.com/\n * @license MIT\n */\nvar __extends$1O = (undefined && undefined.__extends) || (function () {\n var extendStatics = function (d, b) {\n extendStatics = Object.setPrototypeOf ||\n ({ __proto__: [] } instanceof Array && function (d, b) { d.__proto__ = b; }) ||\n function (d, b) { for (var p in b) if (b.hasOwnProperty(p)) d[p] = b[p]; };\n return extendStatics(d, b);\n };\n return function (d, b) {\n extendStatics(d, b);\n function __() { this.constructor = d; }\n d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __());\n };\n})();\nvar __decorate$1E = (undefined && undefined.__decorate) || function (decorators, target, key, desc) {\n var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d;\n if (typeof Reflect === \"object\" && typeof Reflect.decorate === \"function\") r = Reflect.decorate(decorators, target, key, desc);\n else for (var i = decorators.length - 1; i >= 0; i--) if (d = decorators[i]) r = (c < 3 ? d(r) : c > 3 ? d(target, key, r) : d(target, key)) || r;\n return c > 3 && r && Object.defineProperty(target, key, r), r;\n};\nvar AgSelect = /** @class */ (function (_super) {\n __extends$1O(AgSelect, _super);\n function AgSelect(config) {\n return _super.call(this, config, 'ag-select', 'smallDown', 'listbox') || this;\n }\n AgSelect.prototype.init = function () {\n var _this = this;\n this.listComponent = this.createBean(new AgList('select'));\n this.listComponent.setParentComponent(this);\n this.eWrapper.tabIndex = 0;\n this.listComponent.addManagedListener(this.listComponent, AgList.EVENT_ITEM_SELECTED, function () { if (_this.hideList) {\n _this.hideList();\n } });\n this.listComponent.addManagedListener(this.listComponent, AgAbstractField.EVENT_CHANGED, function () {\n _this.setValue(_this.listComponent.getValue(), false, true);\n if (_this.hideList) {\n _this.hideList();\n }\n });\n };\n AgSelect.prototype.showPicker = function () {\n var _this = this;\n var listGui = this.listComponent.getGui();\n var destroyMouseWheelFunc = this.addManagedListener(document.body, 'wheel', function (e) {\n if (!listGui.contains(e.target) && _this.hideList) {\n _this.hideList();\n }\n });\n var destroyFocusOutFunc = this.addManagedListener(listGui, 'focusout', function (e) {\n if (!listGui.contains(e.relatedTarget) && _this.hideList) {\n _this.hideList();\n }\n });\n var addPopupRes = this.popupService.addPopup({\n modal: true,\n eChild: listGui,\n closeOnEsc: true,\n closedCallback: function () {\n _this.hideList = null;\n _this.isPickerDisplayed = false;\n destroyFocusOutFunc();\n destroyMouseWheelFunc();\n if (_this.isAlive()) {\n _this.getFocusableElement().focus();\n }\n }\n });\n if (addPopupRes) {\n this.hideList = addPopupRes.hideFunc;\n }\n this.isPickerDisplayed = true;\n setElementWidth(listGui, getAbsoluteWidth(this.eWrapper));\n listGui.style.maxHeight = getInnerHeight(this.popupService.getPopupParent()) + 'px';\n listGui.style.position = 'absolute';\n this.popupService.positionPopupUnderComponent({\n type: 'ag-list',\n eventSource: this.eWrapper,\n ePopup: listGui,\n keepWithinBounds: true\n });\n this.listComponent.refreshHighlighted();\n return this.listComponent;\n };\n AgSelect.prototype.addOptions = function (options) {\n var _this = this;\n options.forEach(function (option) { return _this.addOption(option); });\n return this;\n };\n AgSelect.prototype.addOption = function (option) {\n this.listComponent.addOption(option);\n return this;\n };\n AgSelect.prototype.setValue = function (value, silent, fromPicker) {\n if (this.value === value) {\n return this;\n }\n if (!fromPicker) {\n this.listComponent.setValue(value, true);\n }\n var newValue = this.listComponent.getValue();\n if (newValue === this.getValue()) {\n return this;\n }\n this.eDisplayField.innerHTML = this.listComponent.getDisplayValue();\n return _super.prototype.setValue.call(this, value, silent);\n };\n AgSelect.prototype.destroy = function () {\n if (this.hideList) {\n this.hideList();\n }\n this.destroyBean(this.listComponent);\n _super.prototype.destroy.call(this);\n };\n __decorate$1E([\n Autowired('popupService')\n ], AgSelect.prototype, \"popupService\", void 0);\n __decorate$1E([\n PostConstruct\n ], AgSelect.prototype, \"init\", null);\n return AgSelect;\n}(AgPickerField));\n\n/**\n * @ag-grid-community/core - Advanced Data Grid / Data Table supporting Javascript / React / AngularJS / Web Components\n * @version v25.1.0\n * @link http://www.ag-grid.com/\n * @license MIT\n */\nvar __extends$1P = (undefined && undefined.__extends) || (function () {\n var extendStatics = function (d, b) {\n extendStatics = Object.setPrototypeOf ||\n ({ __proto__: [] } instanceof Array && function (d, b) { d.__proto__ = b; }) ||\n function (d, b) { for (var p in b) if (b.hasOwnProperty(p)) d[p] = b[p]; };\n return extendStatics(d, b);\n };\n return function (d, b) {\n extendStatics(d, b);\n function __() { this.constructor = d; }\n d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __());\n };\n})();\nvar __decorate$1F = (undefined && undefined.__decorate) || function (decorators, target, key, desc) {\n var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d;\n if (typeof Reflect === \"object\" && typeof Reflect.decorate === \"function\") r = Reflect.decorate(decorators, target, key, desc);\n else for (var i = decorators.length - 1; i >= 0; i--) if (d = decorators[i]) r = (c < 3 ? d(r) : c > 3 ? d(target, key, r) : d(target, key)) || r;\n return c > 3 && r && Object.defineProperty(target, key, r), r;\n};\nvar AgAngleSelect = /** @class */ (function (_super) {\n __extends$1P(AgAngleSelect, _super);\n function AgAngleSelect(config) {\n var _this = _super.call(this, config, AgAngleSelect.TEMPLATE) || this;\n _this.radius = 0;\n _this.offsetX = 0;\n _this.offsetY = 0;\n return _this;\n }\n AgAngleSelect.prototype.postConstruct = function () {\n var _this = this;\n _super.prototype.postConstruct.call(this);\n this.dragListener = {\n eElement: this.eParentCircle,\n dragStartPixels: 0,\n onDragStart: function (e) {\n _this.parentCircleRect = _this.eParentCircle.getBoundingClientRect();\n },\n onDragging: function (e) { return _this.calculateAngleDrag(e); },\n onDragStop: function () { }\n };\n this.dragService.addDragSource(this.dragListener);\n this.eAngleValue\n .setLabel('')\n .setLabelWidth(5)\n .setInputWidth(45)\n .setMin(0)\n .setMax(360)\n .setValue(\"\" + this.degrees)\n .onValueChange(function (value) {\n if (value == null || value === '') {\n value = '0';\n }\n value = _this.eAngleValue.normalizeValue(value);\n var floatValue = parseFloat(value);\n if (floatValue > 180) {\n floatValue = floatValue - 360;\n }\n _this.setValue(floatValue);\n });\n this.updateNumberInput();\n if (exists(this.getValue())) {\n this.eAngleValue.setValue(this.normalizeNegativeValue(this.getValue()).toString());\n }\n this.addManagedListener(this, AgAbstractField.EVENT_CHANGED, function () {\n if (_this.eAngleValue.getInputElement().contains(document.activeElement)) {\n return;\n }\n _this.updateNumberInput();\n });\n };\n AgAngleSelect.prototype.updateNumberInput = function () {\n var normalizedValue = this.normalizeNegativeValue(this.getValue());\n this.eAngleValue.setValue(normalizedValue.toString());\n };\n AgAngleSelect.prototype.positionChildCircle = function (radians) {\n var rect = this.parentCircleRect || { width: 24, height: 24 };\n var eChildCircle = this.eChildCircle;\n var centerX = rect.width / 2;\n var centerY = rect.height / 2;\n eChildCircle.style.left = centerX + Math.cos(radians) * 8 + \"px\";\n eChildCircle.style.top = centerY + Math.sin(radians) * 8 + \"px\";\n };\n AgAngleSelect.prototype.calculatePolar = function () {\n var x = this.offsetX;\n var y = this.offsetY;\n var radians = Math.atan2(y, x);\n this.degrees = this.toDegrees(radians);\n this.radius = Math.sqrt((x * x) + (y * y));\n this.positionChildCircle(radians);\n };\n AgAngleSelect.prototype.calculateCartesian = function () {\n var radians = this.toRadians(this.getValue());\n var radius = this.getRadius();\n this\n .setOffsetX(Math.cos(radians) * radius)\n .setOffsetY(Math.sin(radians) * radius);\n };\n AgAngleSelect.prototype.setOffsetX = function (offset) {\n if (this.offsetX !== offset) {\n this.offsetX = offset;\n this.calculatePolar();\n }\n return this;\n };\n AgAngleSelect.prototype.setOffsetY = function (offset) {\n if (this.offsetY !== offset) {\n this.offsetY = offset;\n this.calculatePolar();\n }\n return this;\n };\n AgAngleSelect.prototype.calculateAngleDrag = function (e) {\n var rect = this.parentCircleRect;\n var centerX = rect.width / 2;\n var centerY = rect.height / 2;\n var x = e.clientX - rect.left;\n var y = e.clientY - rect.top;\n var dx = x - centerX;\n var dy = y - centerY;\n var radians = Math.atan2(dy, dx);\n this.setValue(radians, true);\n };\n AgAngleSelect.prototype.toDegrees = function (radians) {\n return radians / Math.PI * 180;\n };\n AgAngleSelect.prototype.toRadians = function (degrees) {\n return degrees / 180 * Math.PI;\n };\n AgAngleSelect.prototype.normalizeNegativeValue = function (degrees) {\n return degrees < 0 ? 360 + degrees : degrees;\n };\n AgAngleSelect.prototype.normalizeAngle180 = function (radians) {\n radians %= Math.PI * 2;\n if (radians < -Math.PI) {\n radians += Math.PI * 2;\n }\n else if (radians >= Math.PI) {\n radians -= Math.PI * 2;\n }\n return radians;\n };\n AgAngleSelect.prototype.getRadius = function () {\n return this.radius;\n };\n AgAngleSelect.prototype.setRadius = function (r) {\n if (this.radius === r) {\n return this;\n }\n this.radius = r;\n this.calculateCartesian();\n return this;\n };\n AgAngleSelect.prototype.onValueChange = function (callbackFn) {\n var _this = this;\n this.addManagedListener(this, AgAbstractField.EVENT_CHANGED, function () {\n callbackFn(_this.degrees);\n });\n return this;\n };\n AgAngleSelect.prototype.getValue = function (radians) {\n return radians ? this.toRadians(this.degrees) : this.degrees;\n };\n AgAngleSelect.prototype.setValue = function (degrees, radians) {\n var radiansValue;\n if (!radians) {\n radiansValue = this.normalizeAngle180(this.toRadians(degrees));\n }\n else {\n radiansValue = degrees;\n }\n degrees = this.toDegrees(radiansValue);\n if (this.degrees !== degrees) {\n this.degrees = Math.floor(degrees);\n this.calculateCartesian();\n this.positionChildCircle(radiansValue);\n this.dispatchEvent({ type: AgAbstractField.EVENT_CHANGED });\n }\n return this;\n };\n AgAngleSelect.prototype.setWidth = function (width) {\n setFixedWidth(this.getGui(), width);\n return this;\n };\n AgAngleSelect.prototype.destroy = function () {\n this.dragService.removeDragSource(this.dragListener);\n _super.prototype.destroy.call(this);\n };\n AgAngleSelect.TEMPLATE = \"
\\n
\\n
\\n
\\n
\\n
\\n
\\n
\\n \\n
\\n
\";\n __decorate$1F([\n RefSelector('eLabel')\n ], AgAngleSelect.prototype, \"eLabel\", void 0);\n __decorate$1F([\n RefSelector('eParentCircle')\n ], AgAngleSelect.prototype, \"eParentCircle\", void 0);\n __decorate$1F([\n RefSelector('eChildCircle')\n ], AgAngleSelect.prototype, \"eChildCircle\", void 0);\n __decorate$1F([\n RefSelector('eAngleValue')\n ], AgAngleSelect.prototype, \"eAngleValue\", void 0);\n __decorate$1F([\n Autowired('dragService')\n ], AgAngleSelect.prototype, \"dragService\", void 0);\n return AgAngleSelect;\n}(AgAbstractLabel));\n\n/**\n * @ag-grid-community/core - Advanced Data Grid / Data Table supporting Javascript / React / AngularJS / Web Components\n * @version v25.1.0\n * @link http://www.ag-grid.com/\n * @license MIT\n */\nvar __extends$1Q = (undefined && undefined.__extends) || (function () {\n var extendStatics = function (d, b) {\n extendStatics = Object.setPrototypeOf ||\n ({ __proto__: [] } instanceof Array && function (d, b) { d.__proto__ = b; }) ||\n function (d, b) { for (var p in b) if (b.hasOwnProperty(p)) d[p] = b[p]; };\n return extendStatics(d, b);\n };\n return function (d, b) {\n extendStatics(d, b);\n function __() { this.constructor = d; }\n d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __());\n };\n})();\nvar AgToggleButton = /** @class */ (function (_super) {\n __extends$1Q(AgToggleButton, _super);\n function AgToggleButton(config) {\n return _super.call(this, config, 'ag-toggle-button') || this;\n }\n AgToggleButton.prototype.setValue = function (value, silent) {\n _super.prototype.setValue.call(this, value, silent);\n addOrRemoveCssClass(this.getGui(), 'ag-selected', this.getValue());\n return this;\n };\n return AgToggleButton;\n}(AgCheckbox));\n\n/**\n * @ag-grid-community/core - Advanced Data Grid / Data Table supporting Javascript / React / AngularJS / Web Components\n * @version v25.1.0\n * @link http://www.ag-grid.com/\n * @license MIT\n */\nvar __extends$1R = (undefined && undefined.__extends) || (function () {\n var extendStatics = function (d, b) {\n extendStatics = Object.setPrototypeOf ||\n ({ __proto__: [] } instanceof Array && function (d, b) { d.__proto__ = b; }) ||\n function (d, b) { for (var p in b) if (b.hasOwnProperty(p)) d[p] = b[p]; };\n return extendStatics(d, b);\n };\n return function (d, b) {\n extendStatics(d, b);\n function __() { this.constructor = d; }\n d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __());\n };\n})();\nvar __decorate$1G = (undefined && undefined.__decorate) || function (decorators, target, key, desc) {\n var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d;\n if (typeof Reflect === \"object\" && typeof Reflect.decorate === \"function\") r = Reflect.decorate(decorators, target, key, desc);\n else for (var i = decorators.length - 1; i >= 0; i--) if (d = decorators[i]) r = (c < 3 ? d(r) : c > 3 ? d(target, key, r) : d(target, key)) || r;\n return c > 3 && r && Object.defineProperty(target, key, r), r;\n};\n/**\n * For Master Detail, it is required to keep components between expanding & collapsing parents.\n * For example a user expands row A (and shows a detail grid for this row), then when row A\n * is closed, we want to keep the detail grid, so next time row A is expanded the detail grid\n * is showed with it's context intact, eg if user sorted in the detail grid, that sort should\n * still be applied after the detail grid is shown for the second time.\n */\nvar DetailRowCompCache = /** @class */ (function (_super) {\n __extends$1R(DetailRowCompCache, _super);\n function DetailRowCompCache() {\n var _this = _super !== null && _super.apply(this, arguments) || this;\n _this.cacheItems = [];\n return _this;\n }\n DetailRowCompCache.prototype.postConstruct = function () {\n this.active = this.gridOptionsWrapper.isKeepDetailRows();\n this.maxCacheSize = this.gridOptionsWrapper.getKeepDetailRowsCount();\n };\n DetailRowCompCache.prototype.addOrDestroy = function (rowNode, pinned, comp) {\n // only accept detail rows\n var doNotUseCache = !this.active || !rowNode.detail;\n if (doNotUseCache) {\n this.destroyFullWidthRow(comp);\n return;\n }\n var item = this.getCacheItem(rowNode, true);\n // put the comp in the right location of the item.\n // we also destroy any previous comp - this should never happen\n // as the logic outside of this class shouldn't be adding same item to the\n // cache twice, however we cater for it in case in future releases code\n // outside of this class is changed and this could happen.\n switch (pinned) {\n case Constants.PINNED_LEFT:\n this.destroyFullWidthRow(item.left);\n item.left = comp;\n break;\n case Constants.PINNED_RIGHT:\n this.destroyFullWidthRow(item.right);\n item.right = comp;\n break;\n default:\n this.destroyFullWidthRow(item.center);\n item.center = comp;\n break;\n }\n this.cacheItems.sort(function (a, b) {\n return b.lastAccessedTime - a.lastAccessedTime;\n });\n this.purgeCache(this.maxCacheSize);\n };\n DetailRowCompCache.prototype.getCacheItem = function (rowNode, autoCreate) {\n if (autoCreate === void 0) { autoCreate = false; }\n var res = null;\n for (var i = 0; i < this.cacheItems.length; i++) {\n var item = this.cacheItems[i];\n if (item.rowNode === rowNode) {\n res = item;\n break;\n }\n }\n if (!res && autoCreate) {\n res = {\n rowNode: rowNode\n };\n this.cacheItems.push(res);\n }\n if (res) {\n this.stampCacheItem(res);\n }\n return res;\n };\n DetailRowCompCache.prototype.stampCacheItem = function (item) {\n item.lastAccessedTime = new Date().getTime();\n };\n DetailRowCompCache.prototype.destroyFullWidthRow = function (comp) {\n this.getContext().destroyBean(comp);\n };\n DetailRowCompCache.prototype.purgeCache = function (startIndex) {\n // delete all rows past the index of interest\n for (var i = startIndex; i < this.cacheItems.length; i++) {\n var item = this.cacheItems[i];\n this.destroyFullWidthRow(item.center);\n this.destroyFullWidthRow(item.left);\n this.destroyFullWidthRow(item.right);\n }\n // change the length of the array so it no longer contains the deleted items\n if (this.cacheItems.length > startIndex) {\n this.cacheItems.length = startIndex;\n }\n };\n DetailRowCompCache.prototype.get = function (rowNode, pinned) {\n if (!rowNode.detail) {\n return;\n }\n var item = this.getCacheItem(rowNode);\n var res;\n if (item) {\n switch (pinned) {\n case Constants.PINNED_LEFT:\n if (item.left) {\n res = item.left;\n item.left = undefined;\n }\n break;\n case Constants.PINNED_RIGHT:\n if (item.right) {\n res = item.right;\n item.right = undefined;\n }\n break;\n default:\n if (item.center) {\n res = item.center;\n item.center = undefined;\n }\n break;\n }\n }\n return res;\n };\n DetailRowCompCache.prototype.destroy = function () {\n _super.prototype.destroy.call(this);\n this.purgeCache(0);\n };\n __decorate$1G([\n PostConstruct\n ], DetailRowCompCache.prototype, \"postConstruct\", null);\n __decorate$1G([\n PreDestroy\n ], DetailRowCompCache.prototype, \"destroy\", null);\n DetailRowCompCache = __decorate$1G([\n Bean('detailRowCompCache')\n ], DetailRowCompCache);\n return DetailRowCompCache;\n}(BeanStub));\n\n/**\n * @ag-grid-community/core - Advanced Data Grid / Data Table supporting Javascript / React / AngularJS / Web Components\n * @version v25.1.0\n * @link http://www.ag-grid.com/\n * @license MIT\n */\nvar __extends$1S = (undefined && undefined.__extends) || (function () {\n var extendStatics = function (d, b) {\n extendStatics = Object.setPrototypeOf ||\n ({ __proto__: [] } instanceof Array && function (d, b) { d.__proto__ = b; }) ||\n function (d, b) { for (var p in b) if (b.hasOwnProperty(p)) d[p] = b[p]; };\n return extendStatics(d, b);\n };\n return function (d, b) {\n extendStatics(d, b);\n function __() { this.constructor = d; }\n d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __());\n };\n})();\nvar __decorate$1H = (undefined && undefined.__decorate) || function (decorators, target, key, desc) {\n var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d;\n if (typeof Reflect === \"object\" && typeof Reflect.decorate === \"function\") r = Reflect.decorate(decorators, target, key, desc);\n else for (var i = decorators.length - 1; i >= 0; i--) if (d = decorators[i]) r = (c < 3 ? d(r) : c > 3 ? d(target, key, r) : d(target, key)) || r;\n return c > 3 && r && Object.defineProperty(target, key, r), r;\n};\nvar RowPositionUtils = /** @class */ (function (_super) {\n __extends$1S(RowPositionUtils, _super);\n function RowPositionUtils() {\n return _super !== null && _super.apply(this, arguments) || this;\n }\n RowPositionUtils.prototype.getFirstRow = function () {\n var rowIndex = 0;\n var rowPinned;\n if (this.pinnedRowModel.getPinnedTopRowCount()) {\n rowPinned = Constants.PINNED_TOP;\n }\n else if (this.rowModel.getRowCount()) {\n rowPinned = null;\n rowIndex = this.paginationProxy.getPageFirstRow();\n }\n else if (this.pinnedRowModel.getPinnedBottomRowCount()) {\n rowPinned = Constants.PINNED_BOTTOM;\n }\n return rowPinned === undefined ? null : { rowIndex: rowIndex, rowPinned: rowPinned };\n };\n RowPositionUtils.prototype.getLastRow = function () {\n var rowIndex;\n var rowPinned;\n var pinnedBottomCount = this.pinnedRowModel.getPinnedBottomRowCount();\n var pinnedTopCount = this.pinnedRowModel.getPinnedTopRowCount();\n if (pinnedBottomCount) {\n rowPinned = Constants.PINNED_BOTTOM;\n rowIndex = pinnedBottomCount - 1;\n }\n else if (this.rowModel.getRowCount()) {\n rowPinned = null;\n rowIndex = this.paginationProxy.getPageLastRow();\n }\n else if (pinnedTopCount) {\n rowPinned = Constants.PINNED_TOP;\n rowIndex = pinnedTopCount - 1;\n }\n return rowIndex === undefined ? null : { rowIndex: rowIndex, rowPinned: rowPinned };\n };\n RowPositionUtils.prototype.getRowNode = function (gridRow) {\n switch (gridRow.rowPinned) {\n case Constants.PINNED_TOP:\n return this.pinnedRowModel.getPinnedTopRowData()[gridRow.rowIndex];\n case Constants.PINNED_BOTTOM:\n return this.pinnedRowModel.getPinnedBottomRowData()[gridRow.rowIndex];\n default:\n return this.rowModel.getRow(gridRow.rowIndex);\n }\n };\n RowPositionUtils.prototype.sameRow = function (rowA, rowB) {\n // if both missing\n if (!rowA && !rowB) {\n return true;\n }\n // if only one missing\n if ((rowA && !rowB) || (!rowA && rowB)) {\n return false;\n }\n // otherwise compare (use == to compare rowPinned because it can be null or undefined)\n return rowA.rowIndex === rowB.rowIndex && rowA.rowPinned == rowB.rowPinned;\n };\n // tests if this row selection is before the other row selection\n RowPositionUtils.prototype.before = function (rowA, rowB) {\n switch (rowA.rowPinned) {\n case Constants.PINNED_TOP:\n // we we are floating top, and other isn't, then we are always before\n if (rowB.rowPinned !== Constants.PINNED_TOP) {\n return true;\n }\n break;\n case Constants.PINNED_BOTTOM:\n // if we are floating bottom, and the other isn't, then we are never before\n if (rowB.rowPinned !== Constants.PINNED_BOTTOM) {\n return false;\n }\n break;\n default:\n // if we are not floating, but the other one is floating...\n if (exists(rowB.rowPinned)) {\n return rowB.rowPinned !== Constants.PINNED_TOP;\n }\n break;\n }\n return rowA.rowIndex < rowB.rowIndex;\n };\n __decorate$1H([\n Autowired('rowModel')\n ], RowPositionUtils.prototype, \"rowModel\", void 0);\n __decorate$1H([\n Autowired('pinnedRowModel')\n ], RowPositionUtils.prototype, \"pinnedRowModel\", void 0);\n __decorate$1H([\n Autowired('paginationProxy')\n ], RowPositionUtils.prototype, \"paginationProxy\", void 0);\n RowPositionUtils = __decorate$1H([\n Bean('rowPositionUtils')\n ], RowPositionUtils);\n return RowPositionUtils;\n}(BeanStub));\n\n/**\n * @ag-grid-community/core - Advanced Data Grid / Data Table supporting Javascript / React / AngularJS / Web Components\n * @version v25.1.0\n * @link http://www.ag-grid.com/\n * @license MIT\n */\nvar __extends$1T = (undefined && undefined.__extends) || (function () {\n var extendStatics = function (d, b) {\n extendStatics = Object.setPrototypeOf ||\n ({ __proto__: [] } instanceof Array && function (d, b) { d.__proto__ = b; }) ||\n function (d, b) { for (var p in b) if (b.hasOwnProperty(p)) d[p] = b[p]; };\n return extendStatics(d, b);\n };\n return function (d, b) {\n extendStatics(d, b);\n function __() { this.constructor = d; }\n d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __());\n };\n})();\nvar __decorate$1I = (undefined && undefined.__decorate) || function (decorators, target, key, desc) {\n var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d;\n if (typeof Reflect === \"object\" && typeof Reflect.decorate === \"function\") r = Reflect.decorate(decorators, target, key, desc);\n else for (var i = decorators.length - 1; i >= 0; i--) if (d = decorators[i]) r = (c < 3 ? d(r) : c > 3 ? d(target, key, r) : d(target, key)) || r;\n return c > 3 && r && Object.defineProperty(target, key, r), r;\n};\nvar CellPositionUtils = /** @class */ (function (_super) {\n __extends$1T(CellPositionUtils, _super);\n function CellPositionUtils() {\n return _super !== null && _super.apply(this, arguments) || this;\n }\n CellPositionUtils.prototype.createId = function (cellPosition) {\n var rowIndex = cellPosition.rowIndex, rowPinned = cellPosition.rowPinned, column = cellPosition.column;\n return this.createIdFromValues(rowIndex, column, rowPinned);\n };\n CellPositionUtils.prototype.createIdFromValues = function (rowIndex, column, rowPinned) {\n return rowIndex + \".\" + (rowPinned == null ? 'null' : rowPinned) + \".\" + column.getId();\n };\n CellPositionUtils.prototype.equals = function (cellA, cellB) {\n var colsMatch = cellA.column === cellB.column;\n var floatingMatch = cellA.rowPinned === cellB.rowPinned;\n var indexMatch = cellA.rowIndex === cellB.rowIndex;\n return colsMatch && floatingMatch && indexMatch;\n };\n CellPositionUtils = __decorate$1I([\n Bean('cellPositionUtils')\n ], CellPositionUtils);\n return CellPositionUtils;\n}(BeanStub));\n\n/**\n * @ag-grid-community/core - Advanced Data Grid / Data Table supporting Javascript / React / AngularJS / Web Components\n * @version v25.1.0\n * @link http://www.ag-grid.com/\n * @license MIT\n */\nvar __extends$1U = (undefined && undefined.__extends) || (function () {\n var extendStatics = function (d, b) {\n extendStatics = Object.setPrototypeOf ||\n ({ __proto__: [] } instanceof Array && function (d, b) { d.__proto__ = b; }) ||\n function (d, b) { for (var p in b) if (b.hasOwnProperty(p)) d[p] = b[p]; };\n return extendStatics(d, b);\n };\n return function (d, b) {\n extendStatics(d, b);\n function __() { this.constructor = d; }\n d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __());\n };\n})();\nvar __decorate$1J = (undefined && undefined.__decorate) || function (decorators, target, key, desc) {\n var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d;\n if (typeof Reflect === \"object\" && typeof Reflect.decorate === \"function\") r = Reflect.decorate(decorators, target, key, desc);\n else for (var i = decorators.length - 1; i >= 0; i--) if (d = decorators[i]) r = (c < 3 ? d(r) : c > 3 ? d(target, key, r) : d(target, key)) || r;\n return c > 3 && r && Object.defineProperty(target, key, r), r;\n};\nvar PinnedRowModel = /** @class */ (function (_super) {\n __extends$1U(PinnedRowModel, _super);\n function PinnedRowModel() {\n return _super !== null && _super.apply(this, arguments) || this;\n }\n PinnedRowModel.prototype.init = function () {\n this.setPinnedTopRowData(this.gridOptionsWrapper.getPinnedTopRowData());\n this.setPinnedBottomRowData(this.gridOptionsWrapper.getPinnedBottomRowData());\n };\n PinnedRowModel.prototype.isEmpty = function (floating) {\n var rows = floating === Constants.PINNED_TOP ? this.pinnedTopRows : this.pinnedBottomRows;\n return missingOrEmpty(rows);\n };\n PinnedRowModel.prototype.isRowsToRender = function (floating) {\n return !this.isEmpty(floating);\n };\n PinnedRowModel.prototype.getRowAtPixel = function (pixel, floating) {\n var rows = floating === Constants.PINNED_TOP ? this.pinnedTopRows : this.pinnedBottomRows;\n if (missingOrEmpty(rows)) {\n return 0; // this should never happen, just in case, 0 is graceful failure\n }\n for (var i = 0; i < rows.length; i++) {\n var rowNode = rows[i];\n var rowTopPixel = rowNode.rowTop + rowNode.rowHeight - 1;\n // only need to range check against the top pixel, as we are going through the list\n // in order, first row to hit the pixel wins\n if (rowTopPixel >= pixel) {\n return i;\n }\n }\n return rows.length - 1;\n };\n PinnedRowModel.prototype.setPinnedTopRowData = function (rowData) {\n this.pinnedTopRows = this.createNodesFromData(rowData, true);\n var event = {\n type: Events.EVENT_PINNED_ROW_DATA_CHANGED,\n api: this.gridApi,\n columnApi: this.columnApi\n };\n this.eventService.dispatchEvent(event);\n };\n PinnedRowModel.prototype.setPinnedBottomRowData = function (rowData) {\n this.pinnedBottomRows = this.createNodesFromData(rowData, false);\n var event = {\n type: Events.EVENT_PINNED_ROW_DATA_CHANGED,\n api: this.gridApi,\n columnApi: this.columnApi\n };\n this.eventService.dispatchEvent(event);\n };\n PinnedRowModel.prototype.createNodesFromData = function (allData, isTop) {\n var _this = this;\n var rowNodes = [];\n if (allData) {\n var nextRowTop_1 = 0;\n allData.forEach(function (dataItem, index) {\n var rowNode = new RowNode();\n _this.context.createBean(rowNode);\n rowNode.data = dataItem;\n var idPrefix = isTop ? RowNode.ID_PREFIX_TOP_PINNED : RowNode.ID_PREFIX_BOTTOM_PINNED;\n rowNode.id = idPrefix + index;\n rowNode.rowPinned = isTop ? Constants.PINNED_TOP : Constants.PINNED_BOTTOM;\n rowNode.setRowTop(nextRowTop_1);\n rowNode.setRowHeight(_this.gridOptionsWrapper.getRowHeightForNode(rowNode).height);\n rowNode.setRowIndex(index);\n nextRowTop_1 += rowNode.rowHeight;\n rowNodes.push(rowNode);\n });\n }\n return rowNodes;\n };\n PinnedRowModel.prototype.getPinnedTopRowData = function () {\n return this.pinnedTopRows;\n };\n PinnedRowModel.prototype.getPinnedBottomRowData = function () {\n return this.pinnedBottomRows;\n };\n PinnedRowModel.prototype.getPinnedTopTotalHeight = function () {\n return this.getTotalHeight(this.pinnedTopRows);\n };\n PinnedRowModel.prototype.getPinnedTopRowCount = function () {\n return this.pinnedTopRows ? this.pinnedTopRows.length : 0;\n };\n PinnedRowModel.prototype.getPinnedBottomRowCount = function () {\n return this.pinnedBottomRows ? this.pinnedBottomRows.length : 0;\n };\n PinnedRowModel.prototype.getPinnedTopRow = function (index) {\n return this.pinnedTopRows[index];\n };\n PinnedRowModel.prototype.getPinnedBottomRow = function (index) {\n return this.pinnedBottomRows[index];\n };\n PinnedRowModel.prototype.forEachPinnedTopRow = function (callback) {\n if (missingOrEmpty(this.pinnedTopRows)) {\n return;\n }\n this.pinnedTopRows.forEach(callback);\n };\n PinnedRowModel.prototype.forEachPinnedBottomRow = function (callback) {\n if (missingOrEmpty(this.pinnedBottomRows)) {\n return;\n }\n this.pinnedBottomRows.forEach(callback);\n };\n PinnedRowModel.prototype.getPinnedBottomTotalHeight = function () {\n return this.getTotalHeight(this.pinnedBottomRows);\n };\n PinnedRowModel.prototype.getTotalHeight = function (rowNodes) {\n if (!rowNodes || rowNodes.length === 0) {\n return 0;\n }\n var lastNode = last(rowNodes);\n return lastNode.rowTop + lastNode.rowHeight;\n };\n __decorate$1J([\n Autowired('columnApi')\n ], PinnedRowModel.prototype, \"columnApi\", void 0);\n __decorate$1J([\n Autowired('gridApi')\n ], PinnedRowModel.prototype, \"gridApi\", void 0);\n __decorate$1J([\n PostConstruct\n ], PinnedRowModel.prototype, \"init\", null);\n PinnedRowModel = __decorate$1J([\n Bean('pinnedRowModel')\n ], PinnedRowModel);\n return PinnedRowModel;\n}(BeanStub));\n\n/**\n * @ag-grid-community/core - Advanced Data Grid / Data Table supporting Javascript / React / AngularJS / Web Components\n * @version v25.1.0\n * @link http://www.ag-grid.com/\n * @license MIT\n */\nvar __extends$1V = (undefined && undefined.__extends) || (function () {\n var extendStatics = function (d, b) {\n extendStatics = Object.setPrototypeOf ||\n ({ __proto__: [] } instanceof Array && function (d, b) { d.__proto__ = b; }) ||\n function (d, b) { for (var p in b) if (b.hasOwnProperty(p)) d[p] = b[p]; };\n return extendStatics(d, b);\n };\n return function (d, b) {\n extendStatics(d, b);\n function __() { this.constructor = d; }\n d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __());\n };\n})();\nvar UndoRedoAction = /** @class */ (function () {\n function UndoRedoAction(cellValueChanges) {\n this.cellValueChanges = cellValueChanges;\n }\n return UndoRedoAction;\n}());\nvar FillUndoRedoAction = /** @class */ (function (_super) {\n __extends$1V(FillUndoRedoAction, _super);\n function FillUndoRedoAction(cellValueChanges, initialRange, finalRange) {\n var _this = _super.call(this, cellValueChanges) || this;\n _this.initialRange = initialRange;\n _this.finalRange = finalRange;\n return _this;\n }\n return FillUndoRedoAction;\n}(UndoRedoAction));\nvar UndoRedoStack = /** @class */ (function () {\n function UndoRedoStack(maxStackSize) {\n this.actionStack = [];\n this.maxStackSize = maxStackSize ? maxStackSize : UndoRedoStack.DEFAULT_STACK_SIZE;\n this.actionStack = new Array(this.maxStackSize);\n }\n UndoRedoStack.prototype.pop = function () {\n return this.actionStack.pop();\n };\n UndoRedoStack.prototype.push = function (item) {\n var shouldAddActions = item.cellValueChanges && item.cellValueChanges.length > 0;\n if (!shouldAddActions) {\n return;\n }\n if (this.actionStack.length === this.maxStackSize) {\n this.actionStack.shift();\n }\n this.actionStack.push(item);\n };\n UndoRedoStack.prototype.clear = function () {\n this.actionStack = [];\n };\n UndoRedoStack.prototype.getCurrentStackSize = function () {\n return this.actionStack.length;\n };\n UndoRedoStack.DEFAULT_STACK_SIZE = 10;\n return UndoRedoStack;\n}());\n\n/**\n * @ag-grid-community/core - Advanced Data Grid / Data Table supporting Javascript / React / AngularJS / Web Components\n * @version v25.1.0\n * @link http://www.ag-grid.com/\n * @license MIT\n */\nvar __extends$1W = (undefined && undefined.__extends) || (function () {\n var extendStatics = function (d, b) {\n extendStatics = Object.setPrototypeOf ||\n ({ __proto__: [] } instanceof Array && function (d, b) { d.__proto__ = b; }) ||\n function (d, b) { for (var p in b) if (b.hasOwnProperty(p)) d[p] = b[p]; };\n return extendStatics(d, b);\n };\n return function (d, b) {\n extendStatics(d, b);\n function __() { this.constructor = d; }\n d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __());\n };\n})();\nvar __decorate$1K = (undefined && undefined.__decorate) || function (decorators, target, key, desc) {\n var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d;\n if (typeof Reflect === \"object\" && typeof Reflect.decorate === \"function\") r = Reflect.decorate(decorators, target, key, desc);\n else for (var i = decorators.length - 1; i >= 0; i--) if (d = decorators[i]) r = (c < 3 ? d(r) : c > 3 ? d(target, key, r) : d(target, key)) || r;\n return c > 3 && r && Object.defineProperty(target, key, r), r;\n};\nvar UndoRedoService = /** @class */ (function (_super) {\n __extends$1W(UndoRedoService, _super);\n function UndoRedoService() {\n var _this = _super !== null && _super.apply(this, arguments) || this;\n _this.cellValueChanges = [];\n _this.isCellEditing = false;\n _this.isRowEditing = false;\n _this.isPasting = false;\n _this.isFilling = false;\n _this.onCellValueChanged = function (event) {\n var shouldCaptureAction = _this.isCellEditing || _this.isRowEditing || _this.isPasting || _this.isFilling;\n if (!shouldCaptureAction) {\n return;\n }\n var rowPinned = event.rowPinned, rowIndex = event.rowIndex, column = event.column, oldValue = event.oldValue, value = event.value;\n var cellValueChange = {\n rowPinned: rowPinned,\n rowIndex: rowIndex,\n columnId: column.getColId(),\n newValue: value,\n oldValue: oldValue\n };\n _this.cellValueChanges.push(cellValueChange);\n };\n _this.clearStacks = function () {\n _this.undoStack.clear();\n _this.redoStack.clear();\n };\n return _this;\n }\n UndoRedoService.prototype.init = function () {\n if (!this.gridOptionsWrapper.isUndoRedoCellEditing()) {\n return;\n }\n var undoRedoLimit = this.gridOptionsWrapper.getUndoRedoCellEditingLimit();\n if (undoRedoLimit <= 0) {\n return;\n }\n this.undoStack = new UndoRedoStack(undoRedoLimit);\n this.redoStack = new UndoRedoStack(undoRedoLimit);\n this.addRowEditingListeners();\n this.addCellEditingListeners();\n this.addPasteListeners();\n this.addFillListeners();\n this.addManagedListener(this.eventService, Events.EVENT_CELL_VALUE_CHANGED, this.onCellValueChanged);\n // undo / redo is restricted to actual editing so we clear the stacks when other operations are\n // performed that change the order of the row / cols.\n this.addManagedListener(this.eventService, Events.EVENT_MODEL_UPDATED, this.clearStacks);\n this.addManagedListener(this.eventService, Events.EVENT_COLUMN_PIVOT_MODE_CHANGED, this.clearStacks);\n this.addManagedListener(this.eventService, Events.EVENT_NEW_COLUMNS_LOADED, this.clearStacks);\n this.addManagedListener(this.eventService, Events.EVENT_COLUMN_GROUP_OPENED, this.clearStacks);\n this.addManagedListener(this.eventService, Events.EVENT_COLUMN_ROW_GROUP_CHANGED, this.clearStacks);\n this.addManagedListener(this.eventService, Events.EVENT_COLUMN_MOVED, this.clearStacks);\n this.addManagedListener(this.eventService, Events.EVENT_COLUMN_PINNED, this.clearStacks);\n this.addManagedListener(this.eventService, Events.EVENT_COLUMN_VISIBLE, this.clearStacks);\n this.addManagedListener(this.eventService, Events.EVENT_ROW_DRAG_END, this.clearStacks);\n };\n UndoRedoService.prototype.getCurrentUndoStackSize = function () {\n return this.undoStack ? this.undoStack.getCurrentStackSize() : 0;\n };\n UndoRedoService.prototype.getCurrentRedoStackSize = function () {\n return this.redoStack ? this.redoStack.getCurrentStackSize() : 0;\n };\n UndoRedoService.prototype.undo = function () {\n if (!this.undoStack) {\n return;\n }\n var undoAction = this.undoStack.pop();\n if (!undoAction || !undoAction.cellValueChanges) {\n return;\n }\n this.processAction(undoAction, function (cellValueChange) { return cellValueChange.oldValue; });\n if (undoAction instanceof FillUndoRedoAction) {\n this.processRangeAndCellFocus(undoAction.cellValueChanges, undoAction.initialRange);\n }\n else {\n this.processRangeAndCellFocus(undoAction.cellValueChanges);\n }\n this.redoStack.push(undoAction);\n };\n UndoRedoService.prototype.redo = function () {\n if (!this.redoStack) {\n return;\n }\n var redoAction = this.redoStack.pop();\n if (!redoAction || !redoAction.cellValueChanges) {\n return;\n }\n this.processAction(redoAction, function (cellValueChange) { return cellValueChange.newValue; });\n if (redoAction instanceof FillUndoRedoAction) {\n this.processRangeAndCellFocus(redoAction.cellValueChanges, redoAction.finalRange);\n }\n else {\n this.processRangeAndCellFocus(redoAction.cellValueChanges);\n }\n this.undoStack.push(redoAction);\n };\n UndoRedoService.prototype.processAction = function (action, valueExtractor) {\n var _this = this;\n action.cellValueChanges.forEach(function (cellValueChange) {\n var rowIndex = cellValueChange.rowIndex, rowPinned = cellValueChange.rowPinned, columnId = cellValueChange.columnId;\n var rowPosition = { rowIndex: rowIndex, rowPinned: rowPinned };\n var currentRow = _this.getRowNode(rowPosition);\n // checks if the row has been filtered out\n if (!currentRow.displayed) {\n return;\n }\n currentRow.setDataValue(columnId, valueExtractor(cellValueChange));\n });\n };\n UndoRedoService.prototype.processRangeAndCellFocus = function (cellValueChanges, range) {\n var lastFocusedCell;\n if (range) {\n var startRow = range.startRow;\n var endRow = range.endRow;\n lastFocusedCell = {\n rowPinned: startRow.rowPinned,\n rowIndex: startRow.rowIndex,\n columnId: range.startColumn.getColId()\n };\n this.setLastFocusedCell(lastFocusedCell);\n var cellRangeParams = {\n rowStartIndex: startRow.rowIndex,\n rowStartPinned: startRow.rowPinned,\n rowEndIndex: endRow.rowIndex,\n rowEndPinned: endRow.rowPinned,\n columnStart: range.startColumn,\n columns: range.columns\n };\n this.gridApi.addCellRange(cellRangeParams);\n return;\n }\n var cellValueChange = cellValueChanges[0];\n var rowIndex = cellValueChange.rowIndex, rowPinned = cellValueChange.rowPinned;\n var rowPosition = { rowIndex: rowIndex, rowPinned: rowPinned };\n var row = this.getRowNode(rowPosition);\n lastFocusedCell = {\n rowPinned: cellValueChange.rowPinned,\n rowIndex: row.rowIndex,\n columnId: cellValueChange.columnId\n };\n this.setLastFocusedCell(lastFocusedCell);\n };\n UndoRedoService.prototype.setLastFocusedCell = function (lastFocusedCell) {\n var rowIndex = lastFocusedCell.rowIndex, columnId = lastFocusedCell.columnId, rowPinned = lastFocusedCell.rowPinned;\n this.gridApi.ensureIndexVisible(rowIndex);\n this.gridApi.ensureColumnVisible(columnId);\n if (ModuleRegistry.isRegistered(exports.ModuleNames.RangeSelectionModule)) {\n this.gridApi.clearRangeSelection();\n }\n this.focusController.setFocusedCell(rowIndex, columnId, rowPinned, true);\n };\n UndoRedoService.prototype.addRowEditingListeners = function () {\n var _this = this;\n this.addManagedListener(this.eventService, Events.EVENT_ROW_EDITING_STARTED, function () {\n _this.isRowEditing = true;\n });\n this.addManagedListener(this.eventService, Events.EVENT_ROW_EDITING_STOPPED, function () {\n var action = new UndoRedoAction(_this.cellValueChanges);\n _this.pushActionsToUndoStack(action);\n _this.isRowEditing = false;\n });\n };\n UndoRedoService.prototype.addCellEditingListeners = function () {\n var _this = this;\n this.addManagedListener(this.eventService, Events.EVENT_CELL_EDITING_STARTED, function () {\n _this.isCellEditing = true;\n });\n this.addManagedListener(this.eventService, Events.EVENT_CELL_EDITING_STOPPED, function () {\n _this.isCellEditing = false;\n var shouldPushAction = !_this.isRowEditing && !_this.isPasting && !_this.isFilling;\n if (shouldPushAction) {\n var action = new UndoRedoAction(_this.cellValueChanges);\n _this.pushActionsToUndoStack(action);\n }\n });\n };\n UndoRedoService.prototype.addPasteListeners = function () {\n var _this = this;\n this.addManagedListener(this.eventService, Events.EVENT_PASTE_START, function () {\n _this.isPasting = true;\n });\n this.addManagedListener(this.eventService, Events.EVENT_PASTE_END, function () {\n var action = new UndoRedoAction(_this.cellValueChanges);\n _this.pushActionsToUndoStack(action);\n _this.isPasting = false;\n });\n };\n UndoRedoService.prototype.addFillListeners = function () {\n var _this = this;\n this.addManagedListener(this.eventService, Events.EVENT_FILL_START, function () {\n _this.isFilling = true;\n });\n this.addManagedListener(this.eventService, Events.EVENT_FILL_END, function (event) {\n var action = new FillUndoRedoAction(_this.cellValueChanges, event.initialRange, event.finalRange);\n _this.pushActionsToUndoStack(action);\n _this.isFilling = false;\n });\n };\n UndoRedoService.prototype.pushActionsToUndoStack = function (action) {\n this.undoStack.push(action);\n this.cellValueChanges = [];\n this.redoStack.clear();\n };\n UndoRedoService.prototype.getRowNode = function (gridRow) {\n switch (gridRow.rowPinned) {\n case Constants.PINNED_TOP:\n return this.pinnedRowModel.getPinnedTopRowData()[gridRow.rowIndex];\n case Constants.PINNED_BOTTOM:\n return this.pinnedRowModel.getPinnedBottomRowData()[gridRow.rowIndex];\n default:\n return this.rowModel.getRow(gridRow.rowIndex);\n }\n };\n __decorate$1K([\n Autowired('focusController')\n ], UndoRedoService.prototype, \"focusController\", void 0);\n __decorate$1K([\n Autowired('gridApi')\n ], UndoRedoService.prototype, \"gridApi\", void 0);\n __decorate$1K([\n Autowired('rowModel')\n ], UndoRedoService.prototype, \"rowModel\", void 0);\n __decorate$1K([\n Autowired('pinnedRowModel')\n ], UndoRedoService.prototype, \"pinnedRowModel\", void 0);\n __decorate$1K([\n PostConstruct\n ], UndoRedoService.prototype, \"init\", null);\n UndoRedoService = __decorate$1K([\n Bean('undoRedoService')\n ], UndoRedoService);\n return UndoRedoService;\n}(BeanStub));\n\n/**\n * @ag-grid-community/core - Advanced Data Grid / Data Table supporting Javascript / React / AngularJS / Web Components\n * @version v25.1.0\n * @link http://www.ag-grid.com/\n * @license MIT\n */\nvar __extends$1X = (undefined && undefined.__extends) || (function () {\n var extendStatics = function (d, b) {\n extendStatics = Object.setPrototypeOf ||\n ({ __proto__: [] } instanceof Array && function (d, b) { d.__proto__ = b; }) ||\n function (d, b) { for (var p in b) if (b.hasOwnProperty(p)) d[p] = b[p]; };\n return extendStatics(d, b);\n };\n return function (d, b) {\n extendStatics(d, b);\n function __() { this.constructor = d; }\n d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __());\n };\n})();\nvar __decorate$1L = (undefined && undefined.__decorate) || function (decorators, target, key, desc) {\n var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d;\n if (typeof Reflect === \"object\" && typeof Reflect.decorate === \"function\") r = Reflect.decorate(decorators, target, key, desc);\n else for (var i = decorators.length - 1; i >= 0; i--) if (d = decorators[i]) r = (c < 3 ? d(r) : c > 3 ? d(target, key, r) : d(target, key)) || r;\n return c > 3 && r && Object.defineProperty(target, key, r), r;\n};\nvar AgStackComponentsRegistry = /** @class */ (function (_super) {\n __extends$1X(AgStackComponentsRegistry, _super);\n function AgStackComponentsRegistry() {\n var _this = _super !== null && _super.apply(this, arguments) || this;\n _this.componentsMappedByName = {};\n return _this;\n }\n AgStackComponentsRegistry.prototype.setupComponents = function (components) {\n var _this = this;\n if (components) {\n components.forEach(function (componentMeta) { return _this.addComponent(componentMeta); });\n }\n };\n AgStackComponentsRegistry.prototype.addComponent = function (componentMeta) {\n // get name of the class as a string\n // let className = getNameOfClass(ComponentClass);\n // insert a dash after every capital letter\n // let classEscaped = className.replace(/([A-Z])/g, \"-$1\").toLowerCase();\n var classEscaped = componentMeta.componentName.replace(/([a-z])([A-Z])/g, \"$1-$2\").toLowerCase();\n // put all to upper case\n var classUpperCase = classEscaped.toUpperCase();\n // finally store\n this.componentsMappedByName[classUpperCase] = componentMeta.componentClass;\n };\n AgStackComponentsRegistry.prototype.getComponentClass = function (htmlTag) {\n return this.componentsMappedByName[htmlTag];\n };\n AgStackComponentsRegistry = __decorate$1L([\n Bean('agStackComponentsRegistry')\n ], AgStackComponentsRegistry);\n return AgStackComponentsRegistry;\n}(BeanStub));\n\n/**\n * @ag-grid-community/core - Advanced Data Grid / Data Table supporting Javascript / React / AngularJS / Web Components\n * @version v25.1.0\n * @link http://www.ag-grid.com/\n * @license MIT\n */\nvar __extends$1Y = (undefined && undefined.__extends) || (function () {\n var extendStatics = function (d, b) {\n extendStatics = Object.setPrototypeOf ||\n ({ __proto__: [] } instanceof Array && function (d, b) { d.__proto__ = b; }) ||\n function (d, b) { for (var p in b) if (b.hasOwnProperty(p)) d[p] = b[p]; };\n return extendStatics(d, b);\n };\n return function (d, b) {\n extendStatics(d, b);\n function __() { this.constructor = d; }\n d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __());\n };\n})();\nvar __decorate$1M = (undefined && undefined.__decorate) || function (decorators, target, key, desc) {\n var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d;\n if (typeof Reflect === \"object\" && typeof Reflect.decorate === \"function\") r = Reflect.decorate(decorators, target, key, desc);\n else for (var i = decorators.length - 1; i >= 0; i--) if (d = decorators[i]) r = (c < 3 ? d(r) : c > 3 ? d(target, key, r) : d(target, key)) || r;\n return c > 3 && r && Object.defineProperty(target, key, r), r;\n};\nvar HeaderPositionUtils = /** @class */ (function (_super) {\n __extends$1Y(HeaderPositionUtils, _super);\n function HeaderPositionUtils() {\n return _super !== null && _super.apply(this, arguments) || this;\n }\n HeaderPositionUtils.prototype.findHeader = function (focusedHeader, direction) {\n var nextColumn;\n var getGroupMethod;\n var getColMethod;\n if (focusedHeader.column instanceof ColumnGroup) {\n getGroupMethod = \"getDisplayedGroup\" + direction;\n nextColumn = this.columnController[getGroupMethod](focusedHeader.column);\n }\n else {\n getColMethod = \"getDisplayedCol\" + direction;\n nextColumn = this.columnController[getColMethod](focusedHeader.column);\n }\n if (nextColumn) {\n return {\n column: nextColumn,\n headerRowIndex: focusedHeader.headerRowIndex\n };\n }\n };\n HeaderPositionUtils.prototype.findColAtEdgeForHeaderRow = function (level, position) {\n var displayedColumns = this.columnController.getAllDisplayedColumns();\n var column = displayedColumns[position === 'start' ? 0 : displayedColumns.length - 1];\n if (!column) {\n return;\n }\n var childContainer = this.headerNavigationService.getHeaderContainer(column.getPinned());\n var headerRowComp = childContainer.getRowComps()[level];\n var type = headerRowComp && headerRowComp.getType();\n if (type == HeaderRowType.COLUMN_GROUP) {\n var columnGroup = this.columnController.getColumnGroupAtLevel(column, level);\n return {\n headerRowIndex: level,\n column: columnGroup\n };\n }\n return {\n headerRowIndex: !headerRowComp ? -1 : level,\n column: column\n };\n };\n __decorate$1M([\n Autowired('columnController')\n ], HeaderPositionUtils.prototype, \"columnController\", void 0);\n __decorate$1M([\n Autowired('headerNavigationService')\n ], HeaderPositionUtils.prototype, \"headerNavigationService\", void 0);\n HeaderPositionUtils = __decorate$1M([\n Bean('headerPositionUtils')\n ], HeaderPositionUtils);\n return HeaderPositionUtils;\n}(BeanStub));\n\n/**\n * @ag-grid-community/core - Advanced Data Grid / Data Table supporting Javascript / React / AngularJS / Web Components\n * @version v25.1.0\n * @link http://www.ag-grid.com/\n * @license MIT\n */\nvar __decorate$1N = (undefined && undefined.__decorate) || function (decorators, target, key, desc) {\n var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d;\n if (typeof Reflect === \"object\" && typeof Reflect.decorate === \"function\") r = Reflect.decorate(decorators, target, key, desc);\n else for (var i = decorators.length - 1; i >= 0; i--) if (d = decorators[i]) r = (c < 3 ? d(r) : c > 3 ? d(target, key, r) : d(target, key)) || r;\n return c > 3 && r && Object.defineProperty(target, key, r), r;\n};\nvar ColumnDefFactory = /** @class */ (function () {\n function ColumnDefFactory() {\n }\n ColumnDefFactory.prototype.buildColumnDefs = function (cols, rowGroupColumns, pivotColumns) {\n var _this = this;\n var res = [];\n var colGroupDefs = {};\n cols.forEach(function (col) {\n var colDef = _this.createDefFromColumn(col, rowGroupColumns, pivotColumns);\n var addToResult = true;\n var childDef = colDef;\n var child = col;\n while (child.getParent()) {\n var parent_1 = child.getParent();\n var parentDef = null;\n // we don't include padding groups, as the column groups provided\n // by application didn't have these. the whole point of padding groups\n // is to balance the column tree that the user provided.\n if (parent_1.isPadding()) {\n child = parent_1;\n continue;\n }\n // if colDef for this group already exists, use it\n var existingParentDef = colGroupDefs[parent_1.getGroupId()];\n if (existingParentDef) {\n existingParentDef.children.push(childDef);\n // if we added to result, it would be the second time we did it\n addToResult = false;\n // we don't want to continue up the tree, as it has already been\n // done for this group\n break;\n }\n parentDef = _this.createDefFromGroup(parent_1);\n if (parentDef) {\n parentDef.children = [childDef];\n colGroupDefs[parentDef.groupId] = parentDef;\n childDef = parentDef;\n child = parent_1;\n }\n }\n if (addToResult) {\n res.push(childDef);\n }\n });\n return res;\n };\n ColumnDefFactory.prototype.createDefFromGroup = function (group) {\n var defCloned = deepCloneDefinition(group.getColGroupDef(), ['children']);\n if (defCloned) {\n defCloned.groupId = group.getGroupId();\n }\n return defCloned;\n };\n ColumnDefFactory.prototype.createDefFromColumn = function (col, rowGroupColumns, pivotColumns) {\n var colDefCloned = deepCloneDefinition(col.getColDef());\n colDefCloned.colId = col.getColId();\n colDefCloned.width = col.getActualWidth();\n colDefCloned.rowGroup = col.isRowGroupActive();\n colDefCloned.rowGroupIndex = col.isRowGroupActive() ? rowGroupColumns.indexOf(col) : null;\n colDefCloned.pivot = col.isPivotActive();\n colDefCloned.pivotIndex = col.isPivotActive() ? pivotColumns.indexOf(col) : null;\n colDefCloned.aggFunc = col.isValueActive() ? col.getAggFunc() : null;\n colDefCloned.hide = col.isVisible() ? undefined : true;\n colDefCloned.pinned = col.isPinned() ? col.getPinned() : null;\n colDefCloned.sort = col.getSort() ? col.getSort() : null;\n colDefCloned.sortIndex = col.getSortIndex() != null ? col.getSortIndex() : null;\n return colDefCloned;\n };\n ColumnDefFactory = __decorate$1N([\n Bean('columnDefFactory')\n ], ColumnDefFactory);\n return ColumnDefFactory;\n}());\n\n/**\n * @ag-grid-community/core - Advanced Data Grid / Data Table supporting Javascript / React / AngularJS / Web Components\n * @version v25.1.0\n * @link http://www.ag-grid.com/\n * @license MIT\n */\nvar __decorate$1O = (undefined && undefined.__decorate) || function (decorators, target, key, desc) {\n var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d;\n if (typeof Reflect === \"object\" && typeof Reflect.decorate === \"function\") r = Reflect.decorate(decorators, target, key, desc);\n else for (var i = decorators.length - 1; i >= 0; i--) if (d = decorators[i]) r = (c < 3 ? d(r) : c > 3 ? d(target, key, r) : d(target, key)) || r;\n return c > 3 && r && Object.defineProperty(target, key, r), r;\n};\n/**\n * Common logic for RowComp and AutoHeightCalculator\n */\nvar RowCssClassCalculator = /** @class */ (function () {\n function RowCssClassCalculator() {\n }\n RowCssClassCalculator.prototype.getInitialRowClasses = function (params) {\n var classes = [];\n if (exists(params.extraCssClass)) {\n classes.push(params.extraCssClass);\n }\n classes.push('ag-row');\n classes.push(params.rowFocused ? 'ag-row-focus' : 'ag-row-no-focus');\n if (params.fadeRowIn) {\n classes.push('ag-opacity-zero');\n }\n classes.push(params.rowIsEven ? 'ag-row-even' : 'ag-row-odd');\n if (params.rowNode.isRowPinned()) {\n classes.push('ag-row-pinned');\n }\n if (params.rowNode.isSelected()) {\n classes.push('ag-row-selected');\n }\n if (params.rowNode.footer) {\n classes.push('ag-row-footer');\n }\n classes.push('ag-row-level-' + params.rowLevel);\n if (params.rowNode.stub) {\n classes.push('ag-row-loading');\n }\n if (params.fullWidthRow) {\n classes.push('ag-full-width-row');\n }\n if (params.expandable) {\n classes.push('ag-row-group');\n classes.push(params.rowNode.expanded ? 'ag-row-group-expanded' : 'ag-row-group-contracted');\n }\n if (params.rowNode.dragging) {\n classes.push('ag-row-dragging');\n }\n pushAll(classes, this.processClassesFromGridOptions(params.rowNode, params.scope));\n pushAll(classes, this.preProcessRowClassRules(params.rowNode, params.scope));\n // we use absolute position unless we are doing print layout\n classes.push(params.printLayout ? 'ag-row-position-relative' : 'ag-row-position-absolute');\n if (params.firstRowOnPage) {\n classes.push('ag-row-first');\n }\n if (params.lastRowOnPage) {\n classes.push('ag-row-last');\n }\n return classes;\n };\n RowCssClassCalculator.prototype.processClassesFromGridOptions = function (rowNode, scope) {\n var res = [];\n var process = function (rowCls) {\n if (typeof rowCls === 'string') {\n res.push(rowCls);\n }\n else if (Array.isArray(rowCls)) {\n rowCls.forEach(function (e) { return res.push(e); });\n }\n };\n // part 1 - rowClass\n var rowClass = this.gridOptionsWrapper.getRowClass();\n if (rowClass) {\n if (typeof rowClass === 'function') {\n console.warn('AG Grid: rowClass should not be a function, please use getRowClass instead');\n return [];\n }\n process(rowClass);\n }\n // part 2 - rowClassFunc\n var rowClassFunc = this.gridOptionsWrapper.getRowClassFunc();\n if (rowClassFunc) {\n var params = {\n data: rowNode.data,\n node: rowNode,\n rowIndex: rowNode.rowIndex,\n $scope: scope,\n api: this.gridOptionsWrapper.getApi(),\n columnApi: this.gridOptionsWrapper.getColumnApi(),\n context: this.gridOptionsWrapper.getContext()\n };\n var rowClassFuncResult = rowClassFunc(params);\n process(rowClassFuncResult);\n }\n return res;\n };\n RowCssClassCalculator.prototype.preProcessRowClassRules = function (rowNode, scope) {\n var res = [];\n this.processRowClassRules(rowNode, scope, function (className) {\n res.push(className);\n }, function (className) {\n // not catered for, if creating, no need\n // to remove class as it was never there\n });\n return res;\n };\n RowCssClassCalculator.prototype.processRowClassRules = function (rowNode, scope, onApplicableClass, onNotApplicableClass) {\n var rowClassParams = {\n data: rowNode.data,\n node: rowNode,\n rowIndex: rowNode.rowIndex,\n api: this.gridOptionsWrapper.getApi(),\n columnApi: this.gridOptionsWrapper.getColumnApi(),\n $scope: scope,\n context: this.gridOptionsWrapper.getContext()\n };\n this.stylingService.processClassRules(this.gridOptionsWrapper.rowClassRules(), rowClassParams, onApplicableClass, onNotApplicableClass);\n };\n RowCssClassCalculator.prototype.calculateRowLevel = function (rowNode) {\n if (rowNode.group) {\n return rowNode.level;\n }\n // if a leaf, and a parent exists, put a level of the parent, else put level of 0 for top level item\n return rowNode.parent ? (rowNode.parent.level + 1) : 0;\n };\n __decorate$1O([\n Autowired('stylingService')\n ], RowCssClassCalculator.prototype, \"stylingService\", void 0);\n __decorate$1O([\n Autowired('gridOptionsWrapper')\n ], RowCssClassCalculator.prototype, \"gridOptionsWrapper\", void 0);\n RowCssClassCalculator = __decorate$1O([\n Bean('rowCssClassCalculator')\n ], RowCssClassCalculator);\n return RowCssClassCalculator;\n}());\n\n/**\n * @ag-grid-community/core - Advanced Data Grid / Data Table supporting Javascript / React / AngularJS / Web Components\n * @version v25.1.0\n * @link http://www.ag-grid.com/\n * @license MIT\n */\nvar __extends$1Z = (undefined && undefined.__extends) || (function () {\n var extendStatics = function (d, b) {\n extendStatics = Object.setPrototypeOf ||\n ({ __proto__: [] } instanceof Array && function (d, b) { d.__proto__ = b; }) ||\n function (d, b) { for (var p in b) if (b.hasOwnProperty(p)) d[p] = b[p]; };\n return extendStatics(d, b);\n };\n return function (d, b) {\n extendStatics(d, b);\n function __() { this.constructor = d; }\n d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __());\n };\n})();\nvar RowNodeBlock = /** @class */ (function (_super) {\n __extends$1Z(RowNodeBlock, _super);\n function RowNodeBlock(id) {\n var _this = _super.call(this) || this;\n _this.state = RowNodeBlock.STATE_WAITING_TO_LOAD;\n _this.version = 0;\n _this.id = id;\n return _this;\n }\n RowNodeBlock.prototype.getId = function () {\n return this.id;\n };\n RowNodeBlock.prototype.load = function () {\n this.state = RowNodeBlock.STATE_LOADING;\n this.loadFromDatasource();\n };\n RowNodeBlock.prototype.getVersion = function () {\n return this.version;\n };\n RowNodeBlock.prototype.setStateWaitingToLoad = function () {\n // in case any current loads in progress, this will have their results ignored\n this.version++;\n this.state = RowNodeBlock.STATE_WAITING_TO_LOAD;\n };\n RowNodeBlock.prototype.getState = function () {\n return this.state;\n };\n RowNodeBlock.prototype.pageLoadFailed = function (version) {\n var requestMostRecentAndLive = this.isRequestMostRecentAndLive(version);\n if (requestMostRecentAndLive) {\n this.state = RowNodeBlock.STATE_FAILED;\n this.processServerFail();\n }\n this.dispatchLoadCompleted(false);\n };\n RowNodeBlock.prototype.success = function (version, params) {\n this.successCommon(version, params);\n };\n RowNodeBlock.prototype.pageLoaded = function (version, rows, lastRow) {\n this.successCommon(version, { rowData: rows, rowCount: lastRow });\n };\n RowNodeBlock.prototype.isRequestMostRecentAndLive = function (version) {\n // thisIsMostRecentRequest - if block was refreshed, then another request\n // could of been sent after this one.\n var thisIsMostRecentRequest = version === this.version;\n // weAreNotDestroyed - if InfiniteStore is purged, then blocks are destroyed\n // and new blocks created. so data loads of old blocks are discarded.\n var weAreNotDestroyed = this.isAlive();\n return thisIsMostRecentRequest && weAreNotDestroyed;\n };\n RowNodeBlock.prototype.successCommon = function (version, params) {\n // need to dispatch load complete before processing the data, as PaginationComp checks\n // RowNodeBlockLoader to see if it is still loading, so the RowNodeBlockLoader needs to\n // be updated first (via LoadComplete event) before PaginationComp updates (via processServerResult method)\n this.dispatchLoadCompleted();\n var requestMostRecentAndLive = this.isRequestMostRecentAndLive(version);\n if (requestMostRecentAndLive) {\n this.state = RowNodeBlock.STATE_LOADED;\n this.processServerResult(params);\n }\n };\n RowNodeBlock.prototype.dispatchLoadCompleted = function (success) {\n if (success === void 0) { success = true; }\n // we fire event regardless of processing data or now, as we want\n // the concurrentLoadRequests count to be reduced in BlockLoader\n var event = {\n type: RowNodeBlock.EVENT_LOAD_COMPLETE,\n success: success,\n block: this\n };\n this.dispatchEvent(event);\n };\n RowNodeBlock.EVENT_LOAD_COMPLETE = 'loadComplete';\n RowNodeBlock.STATE_WAITING_TO_LOAD = 'needsLoading';\n RowNodeBlock.STATE_LOADING = 'loading';\n RowNodeBlock.STATE_LOADED = 'loaded';\n RowNodeBlock.STATE_FAILED = 'failed';\n return RowNodeBlock;\n}(BeanStub));\n\n/**\n * @ag-grid-community/core - Advanced Data Grid / Data Table supporting Javascript / React / AngularJS / Web Components\n * @version v25.1.0\n * @link http://www.ag-grid.com/\n * @license MIT\n */\nvar __extends$1_ = (undefined && undefined.__extends) || (function () {\n var extendStatics = function (d, b) {\n extendStatics = Object.setPrototypeOf ||\n ({ __proto__: [] } instanceof Array && function (d, b) { d.__proto__ = b; }) ||\n function (d, b) { for (var p in b) if (b.hasOwnProperty(p)) d[p] = b[p]; };\n return extendStatics(d, b);\n };\n return function (d, b) {\n extendStatics(d, b);\n function __() { this.constructor = d; }\n d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __());\n };\n})();\nvar __decorate$1P = (undefined && undefined.__decorate) || function (decorators, target, key, desc) {\n var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d;\n if (typeof Reflect === \"object\" && typeof Reflect.decorate === \"function\") r = Reflect.decorate(decorators, target, key, desc);\n else for (var i = decorators.length - 1; i >= 0; i--) if (d = decorators[i]) r = (c < 3 ? d(r) : c > 3 ? d(target, key, r) : d(target, key)) || r;\n return c > 3 && r && Object.defineProperty(target, key, r), r;\n};\nvar __param$9 = (undefined && undefined.__param) || function (paramIndex, decorator) {\n return function (target, key) { decorator(target, key, paramIndex); }\n};\nvar RowNodeBlockLoader = /** @class */ (function (_super) {\n __extends$1_(RowNodeBlockLoader, _super);\n function RowNodeBlockLoader() {\n var _this = _super !== null && _super.apply(this, arguments) || this;\n _this.activeBlockLoadsCount = 0;\n _this.blocks = [];\n _this.active = true;\n return _this;\n }\n RowNodeBlockLoader_1 = RowNodeBlockLoader;\n RowNodeBlockLoader.prototype.postConstruct = function () {\n this.maxConcurrentRequests = this.gridOptionsWrapper.getMaxConcurrentDatasourceRequests();\n var blockLoadDebounceMillis = this.gridOptionsWrapper.getBlockLoadDebounceMillis();\n if (blockLoadDebounceMillis && blockLoadDebounceMillis > 0) {\n this.checkBlockToLoadDebounce = _.debounce(this.performCheckBlocksToLoad.bind(this), blockLoadDebounceMillis);\n }\n };\n RowNodeBlockLoader.prototype.setBeans = function (loggerFactory) {\n this.logger = loggerFactory.create('RowNodeBlockLoader');\n };\n RowNodeBlockLoader.prototype.addBlock = function (block) {\n this.blocks.push(block);\n // note that we do not remove this listener when removing the block. this is because the\n // cache can get destroyed (and containing blocks) when a block is loading. however the loading block\n // is still counted as an active loading block and we must decrement activeBlockLoadsCount when it finishes.\n block.addEventListener(RowNodeBlock.EVENT_LOAD_COMPLETE, this.loadComplete.bind(this));\n this.checkBlockToLoad();\n };\n RowNodeBlockLoader.prototype.removeBlock = function (block) {\n _.removeFromArray(this.blocks, block);\n };\n RowNodeBlockLoader.prototype.destroy = function () {\n _super.prototype.destroy.call(this);\n this.active = false;\n };\n RowNodeBlockLoader.prototype.loadComplete = function () {\n this.activeBlockLoadsCount--;\n this.checkBlockToLoad();\n if (this.activeBlockLoadsCount == 0) {\n this.dispatchEvent({ type: RowNodeBlockLoader_1.BLOCK_LOADER_FINISHED_EVENT });\n }\n };\n RowNodeBlockLoader.prototype.checkBlockToLoad = function () {\n if (this.checkBlockToLoadDebounce) {\n this.checkBlockToLoadDebounce();\n }\n else {\n this.performCheckBlocksToLoad();\n }\n };\n RowNodeBlockLoader.prototype.performCheckBlocksToLoad = function () {\n if (!this.active) {\n return;\n }\n this.printCacheStatus();\n if (this.maxConcurrentRequests != null && this.activeBlockLoadsCount >= this.maxConcurrentRequests) {\n this.logger.log(\"checkBlockToLoad: max loads exceeded\");\n return;\n }\n var blockToLoad = null;\n this.blocks.forEach(function (block) {\n if (block.getState() === RowNodeBlock.STATE_WAITING_TO_LOAD) {\n blockToLoad = block;\n }\n });\n if (blockToLoad) {\n blockToLoad.load();\n this.activeBlockLoadsCount++;\n this.printCacheStatus();\n }\n };\n RowNodeBlockLoader.prototype.getBlockState = function () {\n var result = {};\n this.blocks.forEach(function (block) {\n var _a = block.getBlockStateJson(), id = _a.id, state = _a.state;\n result[id] = state;\n });\n return result;\n };\n RowNodeBlockLoader.prototype.printCacheStatus = function () {\n if (this.logger.isLogging()) {\n this.logger.log(\"printCacheStatus: activePageLoadsCount = \" + this.activeBlockLoadsCount + \",\"\n + (\" blocks = \" + JSON.stringify(this.getBlockState())));\n }\n };\n RowNodeBlockLoader.prototype.isLoading = function () {\n return this.activeBlockLoadsCount > 0;\n };\n var RowNodeBlockLoader_1;\n RowNodeBlockLoader.BLOCK_LOADER_FINISHED_EVENT = 'blockLoaderFinished';\n __decorate$1P([\n PostConstruct\n ], RowNodeBlockLoader.prototype, \"postConstruct\", null);\n __decorate$1P([\n __param$9(0, Qualifier('loggerFactory'))\n ], RowNodeBlockLoader.prototype, \"setBeans\", null);\n RowNodeBlockLoader = RowNodeBlockLoader_1 = __decorate$1P([\n Bean('rowNodeBlockLoader')\n ], RowNodeBlockLoader);\n return RowNodeBlockLoader;\n}(BeanStub));\n\n/**\n * @ag-grid-community/core - Advanced Data Grid / Data Table supporting Javascript / React / AngularJS / Web Components\n * @version v25.1.0\n * @link http://www.ag-grid.com/\n * @license MIT\n */\nvar __decorate$1Q = (undefined && undefined.__decorate) || function (decorators, target, key, desc) {\n var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d;\n if (typeof Reflect === \"object\" && typeof Reflect.decorate === \"function\") r = Reflect.decorate(decorators, target, key, desc);\n else for (var i = decorators.length - 1; i >= 0; i--) if (d = decorators[i]) r = (c < 3 ? d(r) : c > 3 ? d(target, key, r) : d(target, key)) || r;\n return c > 3 && r && Object.defineProperty(target, key, r), r;\n};\n// this logic is used by both SSRM and CSRM\nvar RowNodeSorter = /** @class */ (function () {\n function RowNodeSorter() {\n }\n RowNodeSorter.prototype.doFullSort = function (rowNodes, sortOptions) {\n var mapper = function (rowNode, pos) { return ({ currentPos: pos, rowNode: rowNode }); };\n var sortedRowNodes = rowNodes.map(mapper);\n sortedRowNodes.sort(this.compareRowNodes.bind(this, sortOptions));\n return sortedRowNodes.map(function (item) { return item.rowNode; });\n };\n RowNodeSorter.prototype.compareRowNodes = function (sortOptions, sortedNodeA, sortedNodeB) {\n var nodeA = sortedNodeA.rowNode;\n var nodeB = sortedNodeB.rowNode;\n // Iterate columns, return the first that doesn't match\n for (var i = 0, len = sortOptions.length; i < len; i++) {\n var sortOption = sortOptions[i];\n // let compared = compare(nodeA, nodeB, sortOption.column, sortOption.inverter === -1);\n var isInverted = sortOption.sort === Constants.SORT_DESC;\n var valueA = this.getValue(nodeA, sortOption.column);\n var valueB = this.getValue(nodeB, sortOption.column);\n var comparatorResult = void 0;\n var providedComparator = sortOption.column.getColDef().comparator;\n if (providedComparator) {\n //if comparator provided, use it\n comparatorResult = providedComparator(valueA, valueB, nodeA, nodeB, isInverted);\n }\n else {\n //otherwise do our own comparison\n comparatorResult = _.defaultComparator(valueA, valueB, this.gridOptionsWrapper.isAccentedSort());\n }\n if (comparatorResult !== 0) {\n return sortOption.sort === Constants.SORT_ASC ? comparatorResult : comparatorResult * -1;\n }\n }\n // All matched, we make is so that the original sort order is kept:\n return sortedNodeA.currentPos - sortedNodeB.currentPos;\n };\n RowNodeSorter.prototype.getValue = function (nodeA, column) {\n return this.valueService.getValue(column, nodeA);\n };\n __decorate$1Q([\n Autowired('gridOptionsWrapper')\n ], RowNodeSorter.prototype, \"gridOptionsWrapper\", void 0);\n __decorate$1Q([\n Autowired('valueService')\n ], RowNodeSorter.prototype, \"valueService\", void 0);\n RowNodeSorter = __decorate$1Q([\n Bean('rowNodeSorter')\n ], RowNodeSorter);\n return RowNodeSorter;\n}());\n\n/**\n * @ag-grid-community/core - Advanced Data Grid / Data Table supporting Javascript / React / AngularJS / Web Components\n * @version v25.1.0\n * @link http://www.ag-grid.com/\n * @license MIT\n */\nvar Grid = /** @class */ (function () {\n function Grid(eGridDiv, gridOptions, params) {\n if (!eGridDiv) {\n console.error('AG Grid: no div element provided to the grid');\n return;\n }\n if (!gridOptions) {\n console.error('AG Grid: no gridOptions provided to the grid');\n return;\n }\n var debug = !!gridOptions.debug;\n this.gridOptions = gridOptions;\n var registeredModules = this.getRegisteredModules(params);\n var beanClasses = this.createBeansList(registeredModules);\n var providedBeanInstances = this.createProvidedBeans(eGridDiv, params);\n if (!beanClasses) {\n return;\n } // happens when no row model found\n var contextParams = {\n providedBeanInstances: providedBeanInstances,\n beanClasses: beanClasses,\n debug: debug\n };\n this.logger = new Logger('AG Grid', function () { return gridOptions.debug; });\n var contextLogger = new Logger('Context', function () { return contextParams.debug; });\n this.context = new Context(contextParams, contextLogger);\n this.registerModuleUserComponents(registeredModules);\n this.registerStackComponents(registeredModules);\n var gridCoreClass = (params && params.rootComponent) || GridCore;\n var gridCore = new gridCoreClass();\n this.context.createBean(gridCore);\n this.setColumnsAndData();\n this.dispatchGridReadyEvent(gridOptions);\n var isEnterprise = ModuleRegistry.isRegistered(exports.ModuleNames.EnterpriseCoreModule);\n this.logger.log(\"initialised successfully, enterprise = \" + isEnterprise);\n }\n Grid.prototype.registerStackComponents = function (registeredModules) {\n var agStackComponents = this.createAgStackComponentsList(registeredModules);\n var agStackComponentsRegistry = this.context.getBean('agStackComponentsRegistry');\n agStackComponentsRegistry.setupComponents(agStackComponents);\n };\n Grid.prototype.getRegisteredModules = function (params) {\n var passedViaConstructor = params ? params.modules : null;\n var registered = ModuleRegistry.getRegisteredModules();\n var allModules = [];\n var mapNames = {};\n // adds to list and removes duplicates\n function addModule(moduleBased, mod) {\n function addIndividualModule(currentModule) {\n if (!mapNames[currentModule.moduleName]) {\n mapNames[currentModule.moduleName] = true;\n allModules.push(currentModule);\n ModuleRegistry.register(currentModule, moduleBased);\n }\n }\n addIndividualModule(mod);\n if (mod.dependantModules) {\n mod.dependantModules.forEach(addModule.bind(null, moduleBased));\n }\n }\n if (passedViaConstructor) {\n passedViaConstructor.forEach(addModule.bind(null, true));\n }\n if (registered) {\n registered.forEach(addModule.bind(null, !ModuleRegistry.isPackageBased()));\n }\n return allModules;\n };\n Grid.prototype.registerModuleUserComponents = function (registeredModules) {\n var userComponentRegistry = this.context.getBean('userComponentRegistry');\n var moduleUserComps = this.extractModuleEntity(registeredModules, function (module) { return module.userComponents ? module.userComponents : []; });\n moduleUserComps.forEach(function (compMeta) {\n userComponentRegistry.registerDefaultComponent(compMeta.componentName, compMeta.componentClass);\n });\n };\n Grid.prototype.createProvidedBeans = function (eGridDiv, params) {\n var frameworkOverrides = params ? params.frameworkOverrides : null;\n if (missing(frameworkOverrides)) {\n frameworkOverrides = new VanillaFrameworkOverrides();\n }\n var seed = {\n gridOptions: this.gridOptions,\n eGridDiv: eGridDiv,\n $scope: params ? params.$scope : null,\n $compile: params ? params.$compile : null,\n quickFilterOnScope: params ? params.quickFilterOnScope : null,\n globalEventListener: params ? params.globalEventListener : null,\n frameworkOverrides: frameworkOverrides\n };\n if (params && params.providedBeanInstances) {\n assign(seed, params.providedBeanInstances);\n }\n return seed;\n };\n Grid.prototype.createAgStackComponentsList = function (registeredModules) {\n var components = [\n { componentName: 'AgCheckbox', componentClass: AgCheckbox },\n { componentName: 'AgRadioButton', componentClass: AgRadioButton },\n { componentName: 'AgToggleButton', componentClass: AgToggleButton },\n { componentName: 'AgInputTextField', componentClass: AgInputTextField },\n { componentName: 'AgInputTextArea', componentClass: AgInputTextArea },\n { componentName: 'AgInputNumberField', componentClass: AgInputNumberField },\n { componentName: 'AgInputRange', componentClass: AgInputRange },\n { componentName: 'AgSelect', componentClass: AgSelect },\n { componentName: 'AgSlider', componentClass: AgSlider },\n { componentName: 'AgAngleSelect', componentClass: AgAngleSelect },\n { componentName: 'AgColorPicker', componentClass: AgColorPicker },\n { componentName: 'AgGridComp', componentClass: GridPanel },\n { componentName: 'AgHeaderRoot', componentClass: HeaderRootComp },\n { componentName: 'AgPagination', componentClass: PaginationComp },\n { componentName: 'AgOverlayWrapper', componentClass: OverlayWrapperComponent },\n { componentName: 'AgGroupComponent', componentClass: AgGroupComponent },\n { componentName: 'AgPanel', componentClass: AgPanel },\n { componentName: 'AgDialog', componentClass: AgDialog }\n ];\n var moduleAgStackComps = this.extractModuleEntity(registeredModules, function (module) { return module.agStackComponents ? module.agStackComponents : []; });\n components = components.concat(moduleAgStackComps);\n return components;\n };\n Grid.prototype.createBeansList = function (registeredModules) {\n var rowModelClass = this.getRowModelClass(registeredModules);\n if (!rowModelClass) {\n return;\n }\n // beans should only contain SERVICES, it should NEVER contain COMPONENTS\n var beans = [\n rowModelClass, Beans, RowPositionUtils, CellPositionUtils, HeaderPositionUtils,\n PaginationAutoPageSizeService, GridApi, UserComponentRegistry, AgComponentUtils,\n ComponentMetadataProvider, ResizeObserverService, UserComponentFactory,\n MaxDivHeightScaler, AutoHeightCalculator, HorizontalResizeService,\n PinnedRowModel, DragService, DisplayedGroupCreator, EventService, GridOptionsWrapper,\n PopupService, SelectionController, FilterManager, ColumnController, HeaderNavigationService,\n PaginationProxy, RowRenderer, ExpressionService, ColumnFactory, TemplateService,\n AlignedGridsService, NavigationService, ValueCache, ValueService, LoggerFactory,\n ColumnUtils, AutoWidthCalculator, StandardMenuFactory, DragAndDropService, ColumnApi,\n FocusController, MouseEventService, Environment, CellNavigationService, ValueFormatterService,\n StylingService, ScrollVisibleService, SortController, ColumnHoverService, ColumnAnimationService,\n SelectableService, AutoGroupColService, ChangeDetectionService, AnimationFrameService,\n DetailRowCompCache, UndoRedoService, AgStackComponentsRegistry, ColumnDefFactory,\n RowCssClassCalculator, RowNodeBlockLoader, RowNodeSorter\n ];\n var moduleBeans = this.extractModuleEntity(registeredModules, function (module) { return module.beans ? module.beans : []; });\n beans.push.apply(beans, moduleBeans);\n // check for duplicates, as different modules could include the same beans that\n // they depend on, eg ClientSideRowModel in enterprise, and ClientSideRowModel in community\n var beansNoDuplicates = [];\n beans.forEach(function (bean) {\n if (beansNoDuplicates.indexOf(bean) < 0) {\n beansNoDuplicates.push(bean);\n }\n });\n return beansNoDuplicates;\n };\n Grid.prototype.extractModuleEntity = function (moduleEntities, extractor) {\n return [].concat.apply([], moduleEntities.map(extractor));\n };\n Grid.prototype.setColumnsAndData = function () {\n var gridOptionsWrapper = this.context.getBean('gridOptionsWrapper');\n var columnController = this.context.getBean('columnController');\n var columnDefs = gridOptionsWrapper.getColumnDefs();\n columnController.setColumnDefs(columnDefs || [], \"gridInitializing\");\n var rowModel = this.context.getBean('rowModel');\n rowModel.start();\n };\n Grid.prototype.dispatchGridReadyEvent = function (gridOptions) {\n var eventService = this.context.getBean('eventService');\n var readyEvent = {\n type: Events.EVENT_GRID_READY,\n api: gridOptions.api,\n columnApi: gridOptions.columnApi\n };\n eventService.dispatchEvent(readyEvent);\n };\n Grid.prototype.getRowModelClass = function (registeredModules) {\n var rowModelType = this.gridOptions.rowModelType;\n // default to client side\n if (!rowModelType) {\n rowModelType = Constants.ROW_MODEL_TYPE_CLIENT_SIDE;\n }\n var rowModelClasses = {};\n registeredModules.forEach(function (module) {\n iterateObject(module.rowModels, function (key, value) {\n rowModelClasses[key] = value;\n });\n });\n var rowModelClass = rowModelClasses[rowModelType];\n if (exists(rowModelClass)) {\n return rowModelClass;\n }\n if (rowModelType === Constants.ROW_MODEL_TYPE_INFINITE) {\n console.error(\"AG Grid: Row Model \\\"Infinite\\\" not found. Please ensure the \" + exports.ModuleNames.InfiniteRowModelModule + \" is registered.';\");\n }\n console.error('AG Grid: could not find matching row model for rowModelType ' + rowModelType);\n if (rowModelType === Constants.ROW_MODEL_TYPE_VIEWPORT) {\n console.error(\"AG Grid: Row Model \\\"Viewport\\\" not found. Please ensure the AG Grid Enterprise Module \" + exports.ModuleNames.ViewportRowModelModule + \" is registered.';\");\n }\n if (rowModelType === Constants.ROW_MODEL_TYPE_SERVER_SIDE) {\n console.error(\"AG Grid: Row Model \\\"Server Side\\\" not found. Please ensure the AG Grid Enterprise Module \" + exports.ModuleNames.ServerSideRowModelModule + \" is registered.';\");\n }\n if (rowModelType === Constants.ROW_MODEL_TYPE_CLIENT_SIDE) {\n console.error(\"AG Grid: Row Model \\\"Client Side\\\" not found. Please ensure the \" + exports.ModuleNames.ClientSideRowModelModule + \" is registered.';\");\n }\n };\n Grid.prototype.destroy = function () {\n this.gridOptions.api.destroy();\n };\n return Grid;\n}());\n\n/**\n * @ag-grid-community/core - Advanced Data Grid / Data Table supporting Javascript / React / AngularJS / Web Components\n * @version v25.1.0\n * @link http://www.ag-grid.com/\n * @license MIT\n */\nfunction initialiseAgGridWithAngular1(angular) {\n var angularModule = angular.module(\"agGrid\", []);\n angularModule.directive(\"agGrid\", function () {\n return {\n restrict: \"A\",\n controller: ['$element', '$scope', '$compile', '$attrs', AngularDirectiveController],\n scope: true\n };\n });\n}\nfunction AngularDirectiveController($element, $scope, $compile, $attrs) {\n var gridOptions;\n var quickFilterOnScope;\n var keyOfGridInScope = $attrs.agGrid;\n quickFilterOnScope = keyOfGridInScope + '.quickFilterText';\n gridOptions = $scope.$eval(keyOfGridInScope);\n if (!gridOptions) {\n console.warn(\"WARNING - grid options for AG Grid not found. Please ensure the attribute ag-grid points to a valid object on the scope\");\n return;\n }\n var eGridDiv = $element[0];\n var gridParams = {\n $scope: $scope,\n $compile: $compile,\n quickFilterOnScope: quickFilterOnScope\n };\n var grid = new Grid(eGridDiv, gridOptions, gridParams);\n $scope.$on(\"$destroy\", function () {\n if (grid) {\n grid.destroy();\n }\n grid = null;\n });\n}\n\n/**\n * @ag-grid-community/core - Advanced Data Grid / Data Table supporting Javascript / React / AngularJS / Web Components\n * @version v25.1.0\n * @link http://www.ag-grid.com/\n * @license MIT\n */\nvar registered = false;\nfunction initialiseAgGridWithWebComponents() {\n console.warn('ag-grid: initialiseAgGridWithWebComponents is deprecated. Please use the ag-grid-webcomponent dependency instead. ');\n // only register to WebComponents once\n if (registered) {\n return;\n }\n registered = true;\n if (typeof document === 'undefined' || !document.registerElement) {\n console.error('AG Grid: unable to find document.registerElement() function, unable to initialise AG Grid as a Web Component');\n }\n // i don't think this type of extension is possible in TypeScript, so back to\n // plain Javascript to create this object\n var AgileGridProto = Object.create(HTMLElement.prototype);\n // wrap each property with a get and set method, so we can track when changes are done\n ComponentUtil.ALL_PROPERTIES.forEach(function (key) {\n Object.defineProperty(AgileGridProto, key, {\n set: function (v) {\n this.__agGridSetProperty(key, v);\n },\n get: function () {\n return this.__agGridGetProperty(key);\n },\n enumerable: true,\n configurable: true\n });\n });\n var agGridProtoNoType = AgileGridProto;\n agGridProtoNoType.__agGridSetProperty = function (key, value) {\n if (!this.__attributes) {\n this.__attributes = {};\n }\n this.__attributes[key] = value;\n // keeping this consistent with the ng2 onChange, so I can reuse the handling code\n var changeObject = {};\n changeObject[key] = { currentValue: value };\n this.onChange(changeObject);\n };\n agGridProtoNoType.onChange = function (changes) {\n if (this._initialised) {\n ComponentUtil.processOnChange(changes, this._gridOptions, this.api, this.columnApi);\n }\n };\n agGridProtoNoType.__agGridGetProperty = function (key) {\n if (!this.__attributes) {\n this.__attributes = {};\n }\n return this.__attributes[key];\n };\n agGridProtoNoType.setGridOptions = function (options) {\n var globalEventListener = this.globalEventListener.bind(this);\n this._gridOptions = ComponentUtil.copyAttributesToGridOptions(options, this);\n var gridParams = {\n globalEventListener: globalEventListener\n };\n this._agGrid = new Grid(this, this._gridOptions, gridParams);\n this.api = options.api;\n this.columnApi = options.columnApi;\n this._initialised = true;\n };\n // copies all the attributes into this object\n agGridProtoNoType.createdCallback = function () {\n for (var i = 0; i < this.attributes.length; i++) {\n var attribute = this.attributes[i];\n this.setPropertyFromAttribute(attribute);\n }\n };\n agGridProtoNoType.setPropertyFromAttribute = function (attribute) {\n var name = toCamelCase(attribute.nodeName);\n var value = attribute.nodeValue;\n if (ComponentUtil.ALL_PROPERTIES.indexOf(name) >= 0) {\n this[name] = value;\n }\n };\n agGridProtoNoType.attachedCallback = function (params) { };\n agGridProtoNoType.detachedCallback = function (params) { };\n agGridProtoNoType.attributeChangedCallback = function (attributeName) {\n var attribute = this.attributes[attributeName];\n this.setPropertyFromAttribute(attribute);\n };\n agGridProtoNoType.globalEventListener = function (eventType, event) {\n var eventLowerCase = eventType.toLowerCase();\n var browserEvent = new Event(eventLowerCase);\n var browserEventNoType = browserEvent;\n browserEventNoType.agGridDetails = event;\n this.dispatchEvent(browserEvent);\n var callbackMethod = 'on' + eventLowerCase;\n if (typeof this[callbackMethod] === 'function') {\n this[callbackMethod](browserEvent);\n }\n };\n // finally, register\n document.registerElement('ag-grid', { prototype: AgileGridProto });\n}\nfunction toCamelCase(myString) {\n if (typeof myString === 'string') {\n var result = myString.replace(/-([a-z])/g, function (g) {\n return g[1].toUpperCase();\n });\n return result;\n }\n else {\n return myString;\n }\n}\n\n/**\n * @ag-grid-community/core - Advanced Data Grid / Data Table supporting Javascript / React / AngularJS / Web Components\n * @version v25.1.0\n * @link http://www.ag-grid.com/\n * @license MIT\n */\nvar __extends$1$ = (undefined && undefined.__extends) || (function () {\n var extendStatics = function (d, b) {\n extendStatics = Object.setPrototypeOf ||\n ({ __proto__: [] } instanceof Array && function (d, b) { d.__proto__ = b; }) ||\n function (d, b) { for (var p in b) if (b.hasOwnProperty(p)) d[p] = b[p]; };\n return extendStatics(d, b);\n };\n return function (d, b) {\n extendStatics(d, b);\n function __() { this.constructor = d; }\n d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __());\n };\n})();\nvar __decorate$1R = (undefined && undefined.__decorate) || function (decorators, target, key, desc) {\n var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d;\n if (typeof Reflect === \"object\" && typeof Reflect.decorate === \"function\") r = Reflect.decorate(decorators, target, key, desc);\n else for (var i = decorators.length - 1; i >= 0; i--) if (d = decorators[i]) r = (c < 3 ? d(r) : c > 3 ? d(target, key, r) : d(target, key)) || r;\n return c > 3 && r && Object.defineProperty(target, key, r), r;\n};\nvar TabbedLayout = /** @class */ (function (_super) {\n __extends$1$(TabbedLayout, _super);\n function TabbedLayout(params) {\n var _this = _super.call(this, TabbedLayout.getTemplate(params.cssClass)) || this;\n _this.items = [];\n _this.params = params;\n if (params.items) {\n params.items.forEach(function (item) { return _this.addItem(item); });\n }\n return _this;\n }\n TabbedLayout.getTemplate = function (cssClass) {\n return /* html */ \"
\\n
\\n
\\n
\";\n };\n TabbedLayout.prototype.handleKeyDown = function (e) {\n switch (e.keyCode) {\n case KeyCode.RIGHT:\n case KeyCode.LEFT:\n if (!this.eHeader.contains(document.activeElement)) {\n return;\n }\n var currentPosition = this.items.indexOf(this.activeItem);\n var nextPosition = e.keyCode === KeyCode.RIGHT ? Math.min(currentPosition + 1, this.items.length - 1) : Math.max(currentPosition - 1, 0);\n if (currentPosition === nextPosition) {\n return;\n }\n e.preventDefault();\n var nextItem = this.items[nextPosition];\n this.showItemWrapper(nextItem);\n nextItem.eHeaderButton.focus();\n break;\n case KeyCode.UP:\n case KeyCode.DOWN:\n e.stopPropagation();\n break;\n }\n };\n TabbedLayout.prototype.onTabKeyDown = function (e) {\n if (e.defaultPrevented) {\n return;\n }\n var _a = this, focusController = _a.focusController, eHeader = _a.eHeader, eBody = _a.eBody, activeItem = _a.activeItem;\n var activeElement = document.activeElement;\n e.preventDefault();\n if (eHeader.contains(activeElement)) {\n // focus is in header, move into body of popup\n focusController.focusInto(eBody, e.shiftKey);\n }\n else {\n // focus is in body, establish if it should return to header\n if (focusController.isFocusUnderManagedComponent(eBody)) {\n // focus was in a managed focus component and has now left, so we can return to the header\n activeItem.eHeaderButton.focus();\n }\n else {\n var nextEl = focusController.findNextFocusableElement(eBody, false, e.shiftKey);\n if (nextEl) {\n // if another element exists in the body that can be focussed, go to that\n nextEl.focus();\n }\n else {\n // otherwise return to the header\n activeItem.eHeaderButton.focus();\n }\n }\n }\n };\n TabbedLayout.prototype.setAfterAttachedParams = function (params) {\n this.afterAttachedParams = params;\n };\n TabbedLayout.prototype.getMinDimensions = function () {\n var eDummyContainer = this.getGui().cloneNode(true);\n var eDummyBody = eDummyContainer.querySelector('[ref=\"eBody\"]');\n // position fixed, so it isn't restricted to the boundaries of the parent\n eDummyContainer.style.position = 'fixed';\n // we put the dummy into the body container, so it will inherit all the\n // css styles that the real cells are inheriting\n this.getGui().appendChild(eDummyContainer);\n var minWidth = 0;\n var minHeight = 0;\n this.items.forEach(function (itemWrapper) {\n clearElement(eDummyBody);\n var eClone = itemWrapper.tabbedItem.bodyPromise.resolveNow(null, function (body) { return body.cloneNode(true); });\n if (eClone == null) {\n return;\n }\n eDummyBody.appendChild(eClone);\n if (minWidth < eDummyContainer.offsetWidth) {\n minWidth = eDummyContainer.offsetWidth;\n }\n if (minHeight < eDummyContainer.offsetHeight) {\n minHeight = eDummyContainer.offsetHeight;\n }\n });\n this.getGui().removeChild(eDummyContainer);\n return { height: minHeight, width: minWidth };\n };\n TabbedLayout.prototype.showFirstItem = function () {\n if (this.items.length > 0) {\n this.showItemWrapper(this.items[0]);\n }\n };\n TabbedLayout.prototype.addItem = function (item) {\n var eHeaderButton = document.createElement('span');\n eHeaderButton.setAttribute('tabIndex', '-1');\n eHeaderButton.setAttribute('role', 'menuitem');\n eHeaderButton.appendChild(item.title);\n addCssClass(eHeaderButton, 'ag-tab');\n this.eHeader.appendChild(eHeaderButton);\n setAriaLabel(eHeaderButton, item.titleLabel);\n var wrapper = {\n tabbedItem: item,\n eHeaderButton: eHeaderButton\n };\n this.items.push(wrapper);\n eHeaderButton.addEventListener('click', this.showItemWrapper.bind(this, wrapper));\n };\n TabbedLayout.prototype.showItem = function (tabbedItem) {\n var itemWrapper = find(this.items, function (wrapper) { return wrapper.tabbedItem === tabbedItem; });\n if (itemWrapper) {\n this.showItemWrapper(itemWrapper);\n }\n };\n TabbedLayout.prototype.showItemWrapper = function (wrapper) {\n var _this = this;\n if (this.params.onItemClicked) {\n this.params.onItemClicked({ item: wrapper.tabbedItem });\n }\n if (this.activeItem === wrapper) {\n callIfPresent(this.params.onActiveItemClicked);\n return;\n }\n clearElement(this.eBody);\n wrapper.tabbedItem.bodyPromise.then(function (body) {\n _this.eBody.appendChild(body);\n var onlyUnmanaged = !_this.focusController.isKeyboardMode();\n _this.focusController.focusInto(_this.eBody, false, onlyUnmanaged);\n if (wrapper.tabbedItem.afterAttachedCallback) {\n wrapper.tabbedItem.afterAttachedCallback(_this.afterAttachedParams);\n }\n });\n if (this.activeItem) {\n removeCssClass(this.activeItem.eHeaderButton, 'ag-tab-selected');\n }\n addCssClass(wrapper.eHeaderButton, 'ag-tab-selected');\n this.activeItem = wrapper;\n };\n __decorate$1R([\n RefSelector('eHeader')\n ], TabbedLayout.prototype, \"eHeader\", void 0);\n __decorate$1R([\n RefSelector('eBody')\n ], TabbedLayout.prototype, \"eBody\", void 0);\n return TabbedLayout;\n}(ManagedFocusComponent));\n\n/**\n * @ag-grid-community/core - Advanced Data Grid / Data Table supporting Javascript / React / AngularJS / Web Components\n * @version v25.1.0\n * @link http://www.ag-grid.com/\n * @license MIT\n */\nfunction simpleHttpRequest(params) {\n return new AgPromise(function (resolve) {\n var httpRequest = new XMLHttpRequest();\n httpRequest.open('GET', params.url);\n httpRequest.send();\n httpRequest.onreadystatechange = function () {\n if (httpRequest.readyState === 4 && httpRequest.status === 200) {\n resolve(JSON.parse(httpRequest.responseText));\n }\n };\n });\n}\n\n/**\n * @ag-grid-community/core - Advanced Data Grid / Data Table supporting Javascript / React / AngularJS / Web Components\n * @version v25.1.0\n * @link http://www.ag-grid.com/\n * @license MIT\n */\n(function (ServerSideTransactionResultStatus) {\n ServerSideTransactionResultStatus[\"StoreNotFound\"] = \"StoreNotFound\";\n ServerSideTransactionResultStatus[\"StoreLoading\"] = \"StoreLoading\";\n ServerSideTransactionResultStatus[\"StoreWaitingToLoad\"] = \"StoreWaitingToLoad\";\n ServerSideTransactionResultStatus[\"StoreLoadingFailed\"] = \"StoreLoadingFailed\";\n ServerSideTransactionResultStatus[\"StoreWrongType\"] = \"StoreWrongType\";\n ServerSideTransactionResultStatus[\"Applied\"] = \"Applied\";\n ServerSideTransactionResultStatus[\"Cancelled\"] = \"Cancelled\";\n})(exports.ServerSideTransactionResultStatus || (exports.ServerSideTransactionResultStatus = {}));\n\n/**\n * @ag-grid-community/core - Advanced Data Grid / Data Table supporting Javascript / React / AngularJS / Web Components\n * @version v25.1.0\n * @link http://www.ag-grid.com/\n * @license MIT\n */\nvar __extends$20 = (undefined && undefined.__extends) || (function () {\n var extendStatics = function (d, b) {\n extendStatics = Object.setPrototypeOf ||\n ({ __proto__: [] } instanceof Array && function (d, b) { d.__proto__ = b; }) ||\n function (d, b) { for (var p in b) if (b.hasOwnProperty(p)) d[p] = b[p]; };\n return extendStatics(d, b);\n };\n return function (d, b) {\n extendStatics(d, b);\n function __() { this.constructor = d; }\n d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __());\n };\n})();\nvar __decorate$1S = (undefined && undefined.__decorate) || function (decorators, target, key, desc) {\n var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d;\n if (typeof Reflect === \"object\" && typeof Reflect.decorate === \"function\") r = Reflect.decorate(decorators, target, key, desc);\n else for (var i = decorators.length - 1; i >= 0; i--) if (d = decorators[i]) r = (c < 3 ? d(r) : c > 3 ? d(target, key, r) : d(target, key)) || r;\n return c > 3 && r && Object.defineProperty(target, key, r), r;\n};\nvar VirtualList = /** @class */ (function (_super) {\n __extends$20(VirtualList, _super);\n function VirtualList(cssIdentifier, ariaRole) {\n if (cssIdentifier === void 0) { cssIdentifier = 'default'; }\n if (ariaRole === void 0) { ariaRole = 'listbox'; }\n var _this = _super.call(this, VirtualList.getTemplate(cssIdentifier), true) || this;\n _this.cssIdentifier = cssIdentifier;\n _this.ariaRole = ariaRole;\n _this.renderedRows = new Map();\n _this.rowHeight = 20;\n _this.isDestroyed = false;\n return _this;\n }\n VirtualList.prototype.postConstruct = function () {\n this.addScrollListener();\n this.rowHeight = this.getItemHeight();\n this.addResizeObserver();\n _super.prototype.postConstruct.call(this);\n };\n VirtualList.prototype.addResizeObserver = function () {\n var listener = this.drawVirtualRows.bind(this);\n var destroyObserver = this.resizeObserverService.observeResize(this.getGui(), listener);\n this.addDestroyFunc(destroyObserver);\n };\n VirtualList.prototype.focusInnerElement = function (fromBottom) {\n this.focusRow(fromBottom ? this.model.getRowCount() - 1 : 0);\n };\n VirtualList.prototype.onFocusIn = function (e) {\n _super.prototype.onFocusIn.call(this, e);\n var target = e.target;\n if (containsClass(target, 'ag-virtual-list-item')) {\n this.lastFocusedRowIndex = getAriaPosInSet(target) - 1;\n }\n };\n VirtualList.prototype.onFocusOut = function (e) {\n _super.prototype.onFocusOut.call(this, e);\n if (!this.getFocusableElement().contains(e.relatedTarget)) {\n this.lastFocusedRowIndex = null;\n }\n };\n VirtualList.prototype.handleKeyDown = function (e) {\n switch (e.keyCode) {\n case KeyCode.UP:\n case KeyCode.DOWN:\n if (this.navigate(e.keyCode === KeyCode.UP)) {\n e.preventDefault();\n }\n break;\n }\n };\n VirtualList.prototype.onTabKeyDown = function (e) {\n if (this.navigate(e.shiftKey)) {\n e.preventDefault();\n }\n else {\n // focus on the first or last focusable element to ensure that any other handlers start from there\n this.focusController.focusInto(this.getGui(), !e.shiftKey);\n }\n };\n VirtualList.prototype.navigate = function (up) {\n if (this.lastFocusedRowIndex == null) {\n return false;\n }\n var nextRow = this.lastFocusedRowIndex + (up ? -1 : 1);\n if (nextRow < 0 || nextRow >= this.model.getRowCount()) {\n return false;\n }\n this.focusRow(nextRow);\n return true;\n };\n VirtualList.prototype.getLastFocusedRow = function () {\n return this.lastFocusedRowIndex;\n };\n VirtualList.prototype.focusRow = function (rowNumber) {\n var _this = this;\n this.ensureIndexVisible(rowNumber);\n window.setTimeout(function () {\n var renderedRow = _this.renderedRows.get(rowNumber);\n if (renderedRow) {\n renderedRow.eDiv.focus();\n }\n }, 10);\n };\n VirtualList.prototype.getComponentAt = function (rowIndex) {\n var comp = this.renderedRows.get(rowIndex);\n return comp && comp.rowComponent;\n };\n VirtualList.getTemplate = function (cssIdentifier) {\n return /* html */ \"\\n
\\n
\\n
\";\n };\n VirtualList.prototype.getItemHeight = function () {\n return this.gridOptionsWrapper.getListItemHeight();\n };\n VirtualList.prototype.ensureIndexVisible = function (index) {\n var lastRow = this.model.getRowCount();\n if (typeof index !== 'number' || index < 0 || index >= lastRow) {\n console.warn('invalid row index for ensureIndexVisible: ' + index);\n return;\n }\n var rowTopPixel = index * this.rowHeight;\n var rowBottomPixel = rowTopPixel + this.rowHeight;\n var eGui = this.getGui();\n var viewportTopPixel = eGui.scrollTop;\n var viewportHeight = eGui.offsetHeight;\n var viewportBottomPixel = viewportTopPixel + viewportHeight;\n var viewportScrolledPastRow = viewportTopPixel > rowTopPixel;\n var viewportScrolledBeforeRow = viewportBottomPixel < rowBottomPixel;\n if (viewportScrolledPastRow) {\n // if row is before, scroll up with row at top\n eGui.scrollTop = rowTopPixel;\n }\n else if (viewportScrolledBeforeRow) {\n // if row is below, scroll down with row at bottom\n var newScrollPosition = rowBottomPixel - viewportHeight;\n eGui.scrollTop = newScrollPosition;\n }\n };\n VirtualList.prototype.setComponentCreator = function (componentCreator) {\n this.componentCreator = componentCreator;\n };\n VirtualList.prototype.getRowHeight = function () {\n return this.rowHeight;\n };\n VirtualList.prototype.getScrollTop = function () {\n return this.getGui().scrollTop;\n };\n VirtualList.prototype.setRowHeight = function (rowHeight) {\n this.rowHeight = rowHeight;\n this.refresh();\n };\n VirtualList.prototype.refresh = function () {\n var _this = this;\n if (this.model == null || this.isDestroyed) {\n return;\n }\n var rowCount = this.model.getRowCount();\n this.eContainer.style.height = rowCount * this.rowHeight + \"px\";\n // ensure height is applied before attempting to redraw rows\n setTimeout(function () {\n if (_this.isDestroyed) {\n return;\n }\n _this.clearVirtualRows();\n _this.drawVirtualRows();\n }, 0);\n };\n VirtualList.prototype.clearVirtualRows = function () {\n var _this = this;\n this.renderedRows.forEach(function (_, rowIndex) { return _this.removeRow(rowIndex); });\n };\n VirtualList.prototype.drawVirtualRows = function () {\n var gui = this.getGui();\n var topPixel = gui.scrollTop;\n var bottomPixel = topPixel + gui.offsetHeight;\n var firstRow = Math.floor(topPixel / this.rowHeight);\n var lastRow = Math.floor(bottomPixel / this.rowHeight);\n this.ensureRowsRendered(firstRow, lastRow);\n };\n VirtualList.prototype.ensureRowsRendered = function (start, finish) {\n var _this = this;\n // remove any rows that are no longer required\n this.renderedRows.forEach(function (_, rowIndex) {\n if ((rowIndex < start || rowIndex > finish) && rowIndex !== _this.lastFocusedRowIndex) {\n _this.removeRow(rowIndex);\n }\n });\n // insert any required new rows\n for (var rowIndex = start; rowIndex <= finish; rowIndex++) {\n if (this.renderedRows.has(rowIndex)) {\n continue;\n }\n // check this row actually exists (in case overflow buffer window exceeds real data)\n if (rowIndex < this.model.getRowCount()) {\n this.insertRow(rowIndex);\n }\n }\n };\n VirtualList.prototype.insertRow = function (rowIndex) {\n var _this = this;\n var value = this.model.getRow(rowIndex);\n var eDiv = document.createElement('div');\n addCssClass(eDiv, 'ag-virtual-list-item');\n addCssClass(eDiv, \"ag-\" + this.cssIdentifier + \"-virtual-list-item\");\n eDiv.setAttribute('role', this.ariaRole === 'tree' ? 'treeitem' : 'option');\n setAriaSetSize(eDiv, this.model.getRowCount());\n setAriaPosInSet(eDiv, rowIndex + 1);\n eDiv.setAttribute('tabindex', '-1');\n if (typeof this.model.isRowSelected === 'function') {\n var isSelected = this.model.isRowSelected(rowIndex);\n setAriaSelected(eDiv, !!isSelected);\n setAriaChecked(eDiv, isSelected);\n }\n eDiv.style.height = this.rowHeight + \"px\";\n eDiv.style.top = this.rowHeight * rowIndex + \"px\";\n var rowComponent = this.componentCreator(value, eDiv);\n rowComponent.addGuiEventListener('focusin', function () { return _this.lastFocusedRowIndex = rowIndex; });\n eDiv.appendChild(rowComponent.getGui());\n // keep the DOM order consistent with the order of the rows\n if (this.renderedRows.has(rowIndex - 1)) {\n this.renderedRows.get(rowIndex - 1).eDiv.insertAdjacentElement('afterend', eDiv);\n }\n else if (this.renderedRows.has(rowIndex + 1)) {\n this.renderedRows.get(rowIndex + 1).eDiv.insertAdjacentElement('beforebegin', eDiv);\n }\n else {\n this.eContainer.appendChild(eDiv);\n }\n this.renderedRows.set(rowIndex, { rowComponent: rowComponent, eDiv: eDiv });\n };\n VirtualList.prototype.removeRow = function (rowIndex) {\n var component = this.renderedRows.get(rowIndex);\n this.eContainer.removeChild(component.eDiv);\n this.destroyBean(component.rowComponent);\n this.renderedRows.delete(rowIndex);\n };\n VirtualList.prototype.addScrollListener = function () {\n var _this = this;\n this.addGuiEventListener('scroll', function () { return _this.drawVirtualRows(); });\n };\n VirtualList.prototype.setModel = function (model) {\n this.model = model;\n };\n VirtualList.prototype.destroy = function () {\n if (this.isDestroyed) {\n return;\n }\n this.clearVirtualRows();\n this.isDestroyed = true;\n _super.prototype.destroy.call(this);\n };\n __decorate$1S([\n Autowired('resizeObserverService')\n ], VirtualList.prototype, \"resizeObserverService\", void 0);\n __decorate$1S([\n RefSelector('eContainer')\n ], VirtualList.prototype, \"eContainer\", void 0);\n return VirtualList;\n}(ManagedFocusComponent));\n\n/**\n * @ag-grid-community/core - Advanced Data Grid / Data Table supporting Javascript / React / AngularJS / Web Components\n * @version v25.1.0\n * @link http://www.ag-grid.com/\n * @license MIT\n */\nfunction defaultGroupComparator(valueA, valueB, nodeA, nodeB, accentedCompare) {\n if (accentedCompare === void 0) { accentedCompare = false; }\n console.warn('AG Grid: Since ag-grid 11.0.0 defaultGroupComparator is not necessary. You can remove this from your colDef');\n var nodeAIsGroup = exists(nodeA) && nodeA.group;\n var nodeBIsGroup = exists(nodeB) && nodeB.group;\n var bothAreGroups = nodeAIsGroup && nodeBIsGroup;\n var bothAreNormal = !nodeAIsGroup && !nodeBIsGroup;\n if (bothAreGroups) {\n return defaultComparator(nodeA.key, nodeB.key, accentedCompare);\n }\n if (bothAreNormal) {\n return defaultComparator(valueA, valueB, accentedCompare);\n }\n if (nodeAIsGroup) {\n return 1;\n }\n return -1;\n}\n\n/**\n * @ag-grid-community/core - Advanced Data Grid / Data Table supporting Javascript / React / AngularJS / Web Components\n * @version v25.1.0\n * @link http://www.ag-grid.com/\n * @license MIT\n */\n(function (ServerSideStoreType) {\n ServerSideStoreType[\"Full\"] = \"full\";\n ServerSideStoreType[\"Partial\"] = \"partial\";\n})(exports.ServerSideStoreType || (exports.ServerSideStoreType = {}));\n\n/**\n * @ag-grid-community/core - Advanced Data Grid / Data Table supporting Javascript / React / AngularJS / Web Components\n * @version v25.1.0\n * @link http://www.ag-grid.com/\n * @license MIT\n */\nvar BaseComponentWrapper = /** @class */ (function () {\n function BaseComponentWrapper() {\n }\n BaseComponentWrapper.prototype.wrap = function (OriginalConstructor, mandatoryMethodList, optionalMethodList, componentType, componentName) {\n var _this = this;\n if (optionalMethodList === void 0) { optionalMethodList = []; }\n var wrapper = this.createWrapper(OriginalConstructor, componentType, componentName);\n mandatoryMethodList.forEach((function (methodName) {\n _this.createMethod(wrapper, methodName, true);\n }));\n optionalMethodList.forEach((function (methodName) {\n _this.createMethod(wrapper, methodName, false);\n }));\n return wrapper;\n };\n BaseComponentWrapper.prototype.createMethod = function (wrapper, methodName, mandatory) {\n wrapper.addMethod(methodName, this.createMethodProxy(wrapper, methodName, mandatory));\n };\n BaseComponentWrapper.prototype.createMethodProxy = function (wrapper, methodName, mandatory) {\n return function () {\n if (wrapper.hasMethod(methodName)) {\n return wrapper.callMethod(methodName, arguments);\n }\n if (mandatory) {\n console.warn('AG Grid: Framework component is missing the method ' + methodName + '()');\n }\n return null;\n };\n };\n return BaseComponentWrapper;\n}());\n\n/**\n * @ag-grid-community/core - Advanced Data Grid / Data Table supporting Javascript / React / AngularJS / Web Components\n * @version v25.1.0\n * @link http://www.ag-grid.com/\n * @license MIT\n */\n(function (ChartType) {\n ChartType[\"Column\"] = \"column\";\n ChartType[\"GroupedColumn\"] = \"groupedColumn\";\n ChartType[\"StackedColumn\"] = \"stackedColumn\";\n ChartType[\"NormalizedColumn\"] = \"normalizedColumn\";\n ChartType[\"Bar\"] = \"bar\";\n ChartType[\"GroupedBar\"] = \"groupedBar\";\n ChartType[\"StackedBar\"] = \"stackedBar\";\n ChartType[\"NormalizedBar\"] = \"normalizedBar\";\n ChartType[\"Line\"] = \"line\";\n ChartType[\"Scatter\"] = \"scatter\";\n ChartType[\"Bubble\"] = \"bubble\";\n ChartType[\"Pie\"] = \"pie\";\n ChartType[\"Doughnut\"] = \"doughnut\";\n ChartType[\"Area\"] = \"area\";\n ChartType[\"StackedArea\"] = \"stackedArea\";\n ChartType[\"NormalizedArea\"] = \"normalizedArea\";\n ChartType[\"Histogram\"] = \"histogram\";\n})(exports.ChartType || (exports.ChartType = {}));\n(function (LegendPosition) {\n LegendPosition[\"Top\"] = \"top\";\n LegendPosition[\"Right\"] = \"right\";\n LegendPosition[\"Bottom\"] = \"bottom\";\n LegendPosition[\"Left\"] = \"left\";\n})(exports.LegendPosition || (exports.LegendPosition = {}));\n\n/**\n * @ag-grid-community/core - Advanced Data Grid / Data Table supporting Javascript / React / AngularJS / Web Components\n * @version v25.1.0\n * @link http://www.ag-grid.com/\n * @license MIT\n */\nvar globalObj = typeof global === 'undefined' ? {} : global;\nglobalObj.HTMLElement = typeof HTMLElement === 'undefined' ? {} : HTMLElement;\nglobalObj.HTMLButtonElement = typeof HTMLButtonElement === 'undefined' ? {} : HTMLButtonElement;\nglobalObj.HTMLSelectElement = typeof HTMLSelectElement === 'undefined' ? {} : HTMLSelectElement;\nglobalObj.HTMLInputElement = typeof HTMLInputElement === 'undefined' ? {} : HTMLInputElement;\nglobalObj.Node = typeof Node === 'undefined' ? {} : Node;\nglobalObj.MouseEvent = typeof MouseEvent === 'undefined' ? {} : MouseEvent;\n\nvar ClientSideNodeManager = /** @class */ (function () {\n function ClientSideNodeManager(rootNode, gridOptionsWrapper, context, eventService, columnController, gridApi, columnApi, selectionController) {\n this.nextId = 0;\n // when user is provide the id's, we also keep a map of ids to row nodes for convenience\n this.allNodesMap = {};\n this.rootNode = rootNode;\n this.gridOptionsWrapper = gridOptionsWrapper;\n this.context = context;\n this.eventService = eventService;\n this.columnController = columnController;\n this.gridApi = gridApi;\n this.columnApi = columnApi;\n this.selectionController = selectionController;\n this.rootNode.group = true;\n this.rootNode.level = -1;\n this.rootNode.id = ClientSideNodeManager.ROOT_NODE_ID;\n this.rootNode.allLeafChildren = [];\n this.rootNode.childrenAfterGroup = [];\n this.rootNode.childrenAfterSort = [];\n this.rootNode.childrenAfterFilter = [];\n // if we make this class a bean, then can annotate postConstruct\n this.postConstruct();\n }\n // @PostConstruct - this is not a bean, so postConstruct called by constructor\n ClientSideNodeManager.prototype.postConstruct = function () {\n // func below doesn't have 'this' pointer, so need to pull out these bits\n this.suppressParentsInRowNodes = this.gridOptionsWrapper.isSuppressParentsInRowNodes();\n this.isRowMasterFunc = this.gridOptionsWrapper.getIsRowMasterFunc();\n this.doingTreeData = this.gridOptionsWrapper.isTreeData();\n this.doingMasterDetail = this.gridOptionsWrapper.isMasterDetail();\n };\n ClientSideNodeManager.prototype.getCopyOfNodesMap = function () {\n return _.cloneObject(this.allNodesMap);\n };\n ClientSideNodeManager.prototype.getRowNode = function (id) {\n return this.allNodesMap[id];\n };\n ClientSideNodeManager.prototype.setRowData = function (rowData) {\n this.rootNode.childrenAfterFilter = null;\n this.rootNode.childrenAfterGroup = null;\n this.rootNode.childrenAfterSort = null;\n this.rootNode.childrenMapped = null;\n this.rootNode.updateHasChildren();\n this.nextId = 0;\n this.allNodesMap = {};\n if (!rowData) {\n this.rootNode.allLeafChildren = [];\n this.rootNode.childrenAfterGroup = [];\n return;\n }\n // kick off recursion\n // we add rootNode as the parent, however if using ag-grid-enterprise, the grouping stage\n // sets the parent node on each row (even if we are not grouping). so setting parent node\n // here is for benefit of ag-grid-community users\n this.rootNode.allLeafChildren = this.recursiveFunction(rowData, this.rootNode, ClientSideNodeManager.TOP_LEVEL);\n };\n ClientSideNodeManager.prototype.updateRowData = function (rowDataTran, rowNodeOrder) {\n var rowNodeTransaction = {\n remove: [],\n update: [],\n add: []\n };\n var nodesToUnselect = [];\n this.executeRemove(rowDataTran, rowNodeTransaction, nodesToUnselect);\n this.executeUpdate(rowDataTran, rowNodeTransaction, nodesToUnselect);\n this.executeAdd(rowDataTran, rowNodeTransaction);\n this.updateSelection(nodesToUnselect);\n if (rowNodeOrder) {\n _.sortRowNodesByOrder(this.rootNode.allLeafChildren, rowNodeOrder);\n }\n return rowNodeTransaction;\n };\n ClientSideNodeManager.prototype.updateSelection = function (nodesToUnselect) {\n var selectionChanged = nodesToUnselect.length > 0;\n if (selectionChanged) {\n nodesToUnselect.forEach(function (rowNode) {\n rowNode.setSelected(false, false, true);\n });\n }\n // we do this regardless of nodes to unselect or not, as it's possible\n // a new node was inserted, so a parent that was previously selected (as all\n // children were selected) should not be tri-state (as new one unselected against\n // all other selected children).\n this.selectionController.updateGroupsFromChildrenSelections();\n if (selectionChanged) {\n var event_1 = {\n type: Events.EVENT_SELECTION_CHANGED,\n api: this.gridApi,\n columnApi: this.columnApi\n };\n this.eventService.dispatchEvent(event_1);\n }\n };\n ClientSideNodeManager.prototype.executeAdd = function (rowDataTran, rowNodeTransaction) {\n var _this = this;\n var add = rowDataTran.add, addIndex = rowDataTran.addIndex;\n if (_.missingOrEmpty(add)) {\n return;\n }\n var useIndex = typeof addIndex === 'number' && addIndex >= 0;\n if (useIndex) {\n // items get inserted in reverse order for index insertion\n add.reverse().forEach(function (item) {\n var newRowNode = _this.addRowNode(item, addIndex);\n rowNodeTransaction.add.push(newRowNode);\n });\n }\n else {\n add.forEach(function (item) {\n var newRowNode = _this.addRowNode(item);\n rowNodeTransaction.add.push(newRowNode);\n });\n }\n };\n ClientSideNodeManager.prototype.executeRemove = function (rowDataTran, rowNodeTransaction, nodesToUnselect) {\n var _this = this;\n var remove = rowDataTran.remove;\n if (_.missingOrEmpty(remove)) {\n return;\n }\n var rowIdsRemoved = {};\n remove.forEach(function (item) {\n var rowNode = _this.lookupRowNode(item);\n if (!rowNode) {\n return;\n }\n // do delete - setting 'suppressFinishActions = true' to ensure EVENT_SELECTION_CHANGED is not raised for\n // each row node updated, instead it is raised once by the calling code if any selected nodes exist.\n if (rowNode.isSelected()) {\n nodesToUnselect.push(rowNode);\n }\n // so row renderer knows to fade row out (and not reposition it)\n rowNode.clearRowTopAndRowIndex();\n // NOTE: were we could remove from allLeaveChildren, however _.removeFromArray() is expensive, especially\n // if called multiple times (eg deleting lots of rows) and if allLeafChildren is a large list\n rowIdsRemoved[rowNode.id] = true;\n // _.removeFromArray(this.rootNode.allLeafChildren, rowNode);\n delete _this.allNodesMap[rowNode.id];\n rowNodeTransaction.remove.push(rowNode);\n });\n this.rootNode.allLeafChildren = this.rootNode.allLeafChildren.filter(function (rowNode) { return !rowIdsRemoved[rowNode.id]; });\n };\n ClientSideNodeManager.prototype.executeUpdate = function (rowDataTran, rowNodeTransaction, nodesToUnselect) {\n var _this = this;\n var update = rowDataTran.update;\n if (_.missingOrEmpty(update)) {\n return;\n }\n update.forEach(function (item) {\n var rowNode = _this.lookupRowNode(item);\n if (!rowNode) {\n return;\n }\n rowNode.updateData(item);\n if (!rowNode.selectable && rowNode.isSelected()) {\n nodesToUnselect.push(rowNode);\n }\n _this.setMasterForRow(rowNode, item, ClientSideNodeManager.TOP_LEVEL, false);\n rowNodeTransaction.update.push(rowNode);\n });\n };\n ClientSideNodeManager.prototype.addRowNode = function (data, index) {\n var newNode = this.createNode(data, this.rootNode, ClientSideNodeManager.TOP_LEVEL);\n if (_.exists(index)) {\n _.insertIntoArray(this.rootNode.allLeafChildren, newNode, index);\n }\n else {\n this.rootNode.allLeafChildren.push(newNode);\n }\n return newNode;\n };\n ClientSideNodeManager.prototype.lookupRowNode = function (data) {\n var rowNodeIdFunc = this.gridOptionsWrapper.getRowNodeIdFunc();\n var rowNode;\n if (_.exists(rowNodeIdFunc)) {\n // find rowNode using id\n var id = rowNodeIdFunc(data);\n rowNode = this.allNodesMap[id];\n if (!rowNode) {\n console.error(\"AG Grid: could not find row id=\" + id + \", data item was not found for this id\");\n return null;\n }\n }\n else {\n // find rowNode using object references\n rowNode = _.find(this.rootNode.allLeafChildren, function (node) { return node.data === data; });\n if (!rowNode) {\n console.error(\"AG Grid: could not find data item as object was not found\", data);\n return null;\n }\n }\n return rowNode;\n };\n ClientSideNodeManager.prototype.recursiveFunction = function (rowData, parent, level) {\n var _this = this;\n // make sure the rowData is an array and not a string of json - this was a commonly reported problem on the forum\n if (typeof rowData === 'string') {\n console.warn('AG Grid: rowData must be an array, however you passed in a string. If you are loading JSON, make sure you convert the JSON string to JavaScript objects first');\n return;\n }\n var rowNodes = [];\n rowData.forEach(function (dataItem) {\n var node = _this.createNode(dataItem, parent, level);\n rowNodes.push(node);\n });\n return rowNodes;\n };\n ClientSideNodeManager.prototype.createNode = function (dataItem, parent, level) {\n var node = new RowNode();\n this.context.createBean(node);\n node.group = false;\n this.setMasterForRow(node, dataItem, level, true);\n if (parent && !this.suppressParentsInRowNodes) {\n node.parent = parent;\n }\n node.level = level;\n node.setDataAndId(dataItem, this.nextId.toString());\n if (this.allNodesMap[node.id]) {\n console.warn(\"ag-grid: duplicate node id '\" + node.id + \"' detected from getRowNodeId callback, this could cause issues in your grid.\");\n }\n this.allNodesMap[node.id] = node;\n this.nextId++;\n return node;\n };\n ClientSideNodeManager.prototype.setMasterForRow = function (rowNode, data, level, setExpanded) {\n if (this.doingTreeData) {\n rowNode.setMaster(false);\n if (setExpanded) {\n rowNode.expanded = false;\n }\n }\n else {\n // this is the default, for when doing grid data\n if (this.doingMasterDetail) {\n // if we are doing master detail, then the\n // default is that everything can be a Master Row.\n if (this.isRowMasterFunc) {\n rowNode.setMaster(this.isRowMasterFunc(data));\n }\n else {\n rowNode.setMaster(true);\n }\n }\n else {\n rowNode.setMaster(false);\n }\n if (setExpanded) {\n var rowGroupColumns = this.columnController.getRowGroupColumns();\n var numRowGroupColumns = rowGroupColumns ? rowGroupColumns.length : 0;\n // need to take row group into account when determining level\n var masterRowLevel = level + numRowGroupColumns;\n rowNode.expanded = rowNode.master ? this.isExpanded(masterRowLevel) : false;\n }\n }\n };\n ClientSideNodeManager.prototype.isExpanded = function (level) {\n var expandByDefault = this.gridOptionsWrapper.getGroupDefaultExpanded();\n if (expandByDefault === -1) {\n return true;\n }\n return level < expandByDefault;\n };\n // this is only used for doing legacy tree data\n ClientSideNodeManager.prototype.setLeafChildren = function (node) {\n node.allLeafChildren = [];\n if (node.childrenAfterGroup) {\n node.childrenAfterGroup.forEach(function (childAfterGroup) {\n if (childAfterGroup.group) {\n if (childAfterGroup.allLeafChildren) {\n childAfterGroup.allLeafChildren.forEach(function (leafChild) { return node.allLeafChildren.push(leafChild); });\n }\n }\n else {\n node.allLeafChildren.push(childAfterGroup);\n }\n });\n }\n };\n ClientSideNodeManager.TOP_LEVEL = 0;\n ClientSideNodeManager.ROOT_NODE_ID = 'ROOT_NODE_ID';\n return ClientSideNodeManager;\n}());\n\nvar __extends$21 = (undefined && undefined.__extends) || (function () {\n var extendStatics = function (d, b) {\n extendStatics = Object.setPrototypeOf ||\n ({ __proto__: [] } instanceof Array && function (d, b) { d.__proto__ = b; }) ||\n function (d, b) { for (var p in b) if (b.hasOwnProperty(p)) d[p] = b[p]; };\n return extendStatics(d, b);\n };\n return function (d, b) {\n extendStatics(d, b);\n function __() { this.constructor = d; }\n d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __());\n };\n})();\nvar __decorate$1T = (undefined && undefined.__decorate) || function (decorators, target, key, desc) {\n var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d;\n if (typeof Reflect === \"object\" && typeof Reflect.decorate === \"function\") r = Reflect.decorate(decorators, target, key, desc);\n else for (var i = decorators.length - 1; i >= 0; i--) if (d = decorators[i]) r = (c < 3 ? d(r) : c > 3 ? d(target, key, r) : d(target, key)) || r;\n return c > 3 && r && Object.defineProperty(target, key, r), r;\n};\nvar RecursionType;\n(function (RecursionType) {\n RecursionType[RecursionType[\"Normal\"] = 0] = \"Normal\";\n RecursionType[RecursionType[\"AfterFilter\"] = 1] = \"AfterFilter\";\n RecursionType[RecursionType[\"AfterFilterAndSort\"] = 2] = \"AfterFilterAndSort\";\n RecursionType[RecursionType[\"PivotNodes\"] = 3] = \"PivotNodes\";\n})(RecursionType || (RecursionType = {}));\nvar ClientSideRowModel = /** @class */ (function (_super) {\n __extends$21(ClientSideRowModel, _super);\n function ClientSideRowModel() {\n var _this = _super !== null && _super.apply(this, arguments) || this;\n _this.onRowGroupOpenedPending = false;\n return _this;\n }\n ClientSideRowModel.prototype.init = function () {\n var refreshEverythingFunc = this.refreshModel.bind(this, { step: exports.ClientSideRowModelSteps.EVERYTHING });\n var refreshEverythingAfterColsChangedFunc = this.refreshModel.bind(this, {\n step: exports.ClientSideRowModelSteps.EVERYTHING,\n afterColumnsChanged: true,\n keepRenderedRows: true,\n animate: true\n });\n this.addManagedListener(this.eventService, Events.EVENT_NEW_COLUMNS_LOADED, refreshEverythingAfterColsChangedFunc);\n this.addManagedListener(this.eventService, Events.EVENT_COLUMN_ROW_GROUP_CHANGED, refreshEverythingFunc);\n this.addManagedListener(this.eventService, Events.EVENT_COLUMN_VALUE_CHANGED, this.onValueChanged.bind(this));\n this.addManagedListener(this.eventService, Events.EVENT_COLUMN_PIVOT_CHANGED, this.refreshModel.bind(this, { step: exports.ClientSideRowModelSteps.PIVOT }));\n this.addManagedListener(this.eventService, Events.EVENT_ROW_GROUP_OPENED, this.onRowGroupOpened.bind(this));\n this.addManagedListener(this.eventService, Events.EVENT_FILTER_CHANGED, this.onFilterChanged.bind(this));\n this.addManagedListener(this.eventService, Events.EVENT_SORT_CHANGED, this.onSortChanged.bind(this));\n this.addManagedListener(this.eventService, Events.EVENT_COLUMN_PIVOT_MODE_CHANGED, refreshEverythingFunc);\n var refreshMapListener = this.refreshModel.bind(this, {\n step: exports.ClientSideRowModelSteps.MAP,\n keepRenderedRows: true,\n animate: true\n });\n this.addManagedListener(this.gridOptionsWrapper, GridOptionsWrapper.PROP_GROUP_REMOVE_SINGLE_CHILDREN, refreshMapListener);\n this.addManagedListener(this.gridOptionsWrapper, GridOptionsWrapper.PROP_GROUP_REMOVE_LOWEST_SINGLE_CHILDREN, refreshMapListener);\n this.rootNode = new RowNode();\n this.nodeManager = new ClientSideNodeManager(this.rootNode, this.gridOptionsWrapper, this.getContext(), this.eventService, this.columnController, this.gridApi, this.columnApi, this.selectionController);\n this.createBean(this.rootNode);\n };\n ClientSideRowModel.prototype.start = function () {\n var rowData = this.gridOptionsWrapper.getRowData();\n if (rowData) {\n this.setRowData(rowData);\n }\n };\n ClientSideRowModel.prototype.ensureRowHeightsValid = function (startPixel, endPixel, startLimitIndex, endLimitIndex) {\n var atLeastOneChange;\n var res = false;\n // we do this multiple times as changing the row heights can also change the first and last rows,\n // so the first pass can make lots of rows smaller, which means the second pass we end up changing\n // more rows.\n do {\n atLeastOneChange = false;\n var rowAtStartPixel = this.getRowIndexAtPixel(startPixel);\n var rowAtEndPixel = this.getRowIndexAtPixel(endPixel);\n // keep check to current page if doing pagination\n var firstRow = Math.max(rowAtStartPixel, startLimitIndex);\n var lastRow = Math.min(rowAtEndPixel, endLimitIndex);\n for (var rowIndex = firstRow; rowIndex <= lastRow; rowIndex++) {\n var rowNode = this.getRow(rowIndex);\n if (rowNode.rowHeightEstimated) {\n var rowHeight = this.gridOptionsWrapper.getRowHeightForNode(rowNode);\n rowNode.setRowHeight(rowHeight.height);\n atLeastOneChange = true;\n res = true;\n }\n }\n if (atLeastOneChange) {\n this.setRowTops();\n }\n } while (atLeastOneChange);\n return res;\n };\n ClientSideRowModel.prototype.setRowTops = function () {\n var nextRowTop = 0;\n for (var i = 0; i < this.rowsToDisplay.length; i++) {\n // we don't estimate if doing fullHeight or autoHeight, as all rows get rendered all the time\n // with these two layouts.\n var allowEstimate = this.gridOptionsWrapper.getDomLayout() === Constants.DOM_LAYOUT_NORMAL;\n var rowNode = this.rowsToDisplay[i];\n if (_.missing(rowNode.rowHeight)) {\n var rowHeight = this.gridOptionsWrapper.getRowHeightForNode(rowNode, allowEstimate);\n rowNode.setRowHeight(rowHeight.height, rowHeight.estimated);\n }\n rowNode.setRowTop(nextRowTop);\n rowNode.setRowIndex(i);\n nextRowTop += rowNode.rowHeight;\n }\n };\n ClientSideRowModel.prototype.resetRowTops = function (rowNode, changedPath) {\n rowNode.clearRowTopAndRowIndex();\n if (rowNode.hasChildren()) {\n if (rowNode.childrenAfterGroup) {\n // if a changedPath is active, it means we are here because of a transaction update or\n // a change detection. neither of these impacts the open/closed state of groups. so if\n // a group is not open this time, it was not open last time. so we know all closed groups\n // already have their top positions cleared. so there is no need to traverse all the way\n // when changedPath is active and the rowNode is not expanded.\n var skipChildren = changedPath.isActive() && !rowNode.expanded;\n if (!skipChildren) {\n for (var i = 0; i < rowNode.childrenAfterGroup.length; i++) {\n this.resetRowTops(rowNode.childrenAfterGroup[i], changedPath);\n }\n }\n }\n if (rowNode.sibling) {\n rowNode.sibling.clearRowTopAndRowIndex();\n }\n }\n if (rowNode.detailNode) {\n rowNode.detailNode.clearRowTopAndRowIndex();\n }\n };\n // returns false if row was moved, otherwise true\n ClientSideRowModel.prototype.ensureRowsAtPixel = function (rowNodes, pixel, increment) {\n var _this = this;\n if (increment === void 0) { increment = 0; }\n var indexAtPixelNow = this.getRowIndexAtPixel(pixel);\n var rowNodeAtPixelNow = this.getRow(indexAtPixelNow);\n if (rowNodeAtPixelNow === rowNodes[0]) {\n return false;\n }\n rowNodes.forEach(function (rowNode) {\n _.removeFromArray(_this.rootNode.allLeafChildren, rowNode);\n });\n rowNodes.forEach(function (rowNode, idx) {\n _.insertIntoArray(_this.rootNode.allLeafChildren, rowNode, Math.max(indexAtPixelNow + increment, 0) + idx);\n });\n this.refreshModel({\n step: exports.ClientSideRowModelSteps.EVERYTHING,\n keepRenderedRows: true,\n animate: true,\n keepEditingRows: true\n });\n return true;\n };\n ClientSideRowModel.prototype.highlightRowAtPixel = function (rowNode, pixel) {\n var indexAtPixelNow = pixel != null ? this.getRowIndexAtPixel(pixel) : null;\n var rowNodeAtPixelNow = indexAtPixelNow != null ? this.getRow(indexAtPixelNow) : null;\n if (!rowNodeAtPixelNow || !rowNode || rowNodeAtPixelNow === rowNode || pixel == null) {\n if (this.lastHighlightedRow) {\n this.lastHighlightedRow.setHighlighted(null);\n this.lastHighlightedRow = null;\n }\n return;\n }\n var highlight = this.getHighlightPosition(pixel, rowNodeAtPixelNow);\n if (this.lastHighlightedRow && this.lastHighlightedRow !== rowNodeAtPixelNow) {\n this.lastHighlightedRow.setHighlighted(null);\n this.lastHighlightedRow = null;\n }\n rowNodeAtPixelNow.setHighlighted(highlight);\n this.lastHighlightedRow = rowNodeAtPixelNow;\n };\n ClientSideRowModel.prototype.getHighlightPosition = function (pixel, rowNode) {\n if (!rowNode) {\n var index = this.getRowIndexAtPixel(pixel);\n rowNode = this.getRow(index || 0);\n if (!rowNode) {\n return 'below';\n }\n }\n var rowTop = rowNode.rowTop, rowHeight = rowNode.rowHeight;\n return pixel - rowTop < rowHeight / 2 ? 'above' : 'below';\n };\n ClientSideRowModel.prototype.getLastHighlightedRowNode = function () {\n return this.lastHighlightedRow;\n };\n ClientSideRowModel.prototype.isLastRowIndexKnown = function () {\n return true;\n };\n ClientSideRowModel.prototype.getRowCount = function () {\n if (this.rowsToDisplay) {\n return this.rowsToDisplay.length;\n }\n return 0;\n };\n ClientSideRowModel.prototype.getTopLevelRowCount = function () {\n var showingRootNode = this.rowsToDisplay && this.rowsToDisplay[0] === this.rootNode;\n if (showingRootNode) {\n return 1;\n }\n return this.rootNode.childrenAfterFilter ? this.rootNode.childrenAfterFilter.length : 0;\n };\n ClientSideRowModel.prototype.getTopLevelRowDisplayedIndex = function (topLevelIndex) {\n var showingRootNode = this.rowsToDisplay && this.rowsToDisplay[0] === this.rootNode;\n if (showingRootNode) {\n return topLevelIndex;\n }\n var rowNode = this.rootNode.childrenAfterSort[topLevelIndex];\n if (this.gridOptionsWrapper.isGroupHideOpenParents()) {\n // if hideOpenParents, and this row open, then this row is now displayed at this index, first child is\n while (rowNode.expanded && rowNode.childrenAfterSort && rowNode.childrenAfterSort.length > 0) {\n rowNode = rowNode.childrenAfterSort[0];\n }\n }\n return rowNode.rowIndex;\n };\n ClientSideRowModel.prototype.getRowBounds = function (index) {\n if (_.missing(this.rowsToDisplay)) {\n return null;\n }\n var rowNode = this.rowsToDisplay[index];\n if (rowNode) {\n return {\n rowTop: rowNode.rowTop,\n rowHeight: rowNode.rowHeight\n };\n }\n return null;\n };\n ClientSideRowModel.prototype.onRowGroupOpened = function () {\n // because the user can call rowNode.setExpanded() many times in on VM turn,\n // we debounce the call using animationFrameService. we use animationFrameService\n // rather than _.debounce() so this will get done if anyone flushes the animationFrameService\n // (eg user calls api.ensureRowVisible(), which in turn flushes ).\n var _this = this;\n if (this.onRowGroupOpenedPending) {\n return;\n }\n this.onRowGroupOpenedPending = true;\n var action = function () {\n _this.onRowGroupOpenedPending = false;\n var animate = _this.gridOptionsWrapper.isAnimateRows();\n _this.refreshModel({ step: exports.ClientSideRowModelSteps.MAP, keepRenderedRows: true, animate: animate });\n };\n if (this.gridOptionsWrapper.isSuppressAnimationFrame()) {\n action();\n }\n else {\n this.animationFrameService.addDestroyTask(action);\n }\n };\n ClientSideRowModel.prototype.onFilterChanged = function (event) {\n if (event.afterDataChange) {\n return;\n }\n var animate = this.gridOptionsWrapper.isAnimateRows();\n this.refreshModel({ step: exports.ClientSideRowModelSteps.FILTER, keepRenderedRows: true, animate: animate });\n };\n ClientSideRowModel.prototype.onSortChanged = function () {\n var animate = this.gridOptionsWrapper.isAnimateRows();\n this.refreshModel({ step: exports.ClientSideRowModelSteps.SORT, keepRenderedRows: true, animate: animate, keepEditingRows: true });\n };\n ClientSideRowModel.prototype.getType = function () {\n return Constants.ROW_MODEL_TYPE_CLIENT_SIDE;\n };\n ClientSideRowModel.prototype.onValueChanged = function () {\n if (this.columnController.isPivotActive()) {\n this.refreshModel({ step: exports.ClientSideRowModelSteps.PIVOT });\n }\n else {\n this.refreshModel({ step: exports.ClientSideRowModelSteps.AGGREGATE });\n }\n };\n ClientSideRowModel.prototype.createChangePath = function (rowNodeTransactions) {\n // for updates, if the row is updated at all, then we re-calc all the values\n // in that row. we could compare each value to each old value, however if we\n // did this, we would be calling the valueService twice, once on the old value\n // and once on the new value. so it's less valueGetter calls if we just assume\n // each column is different. that way the changedPath is used so that only\n // the impacted parent rows are recalculated, parents who's children have\n // not changed are not impacted.\n var noTransactions = _.missingOrEmpty(rowNodeTransactions);\n var changedPath = new ChangedPath(false, this.rootNode);\n if (noTransactions || this.gridOptionsWrapper.isTreeData()) {\n changedPath.setInactive();\n }\n return changedPath;\n };\n ClientSideRowModel.prototype.isSuppressModelUpdateAfterUpdateTransaction = function (params) {\n if (!this.gridOptionsWrapper.isSuppressModelUpdateAfterUpdateTransaction()) {\n return false;\n }\n // return true if we are only doing update transactions\n if (params.rowNodeTransactions == null) {\n return false;\n }\n var transWithAddsOrDeletes = _.filter(params.rowNodeTransactions, function (tx) {\n return (tx.add != null && tx.add.length > 0) || (tx.remove != null && tx.remove.length > 0);\n });\n var transactionsContainUpdatesOnly = transWithAddsOrDeletes == null || transWithAddsOrDeletes.length == 0;\n return transactionsContainUpdatesOnly;\n };\n ClientSideRowModel.prototype.refreshModel = function (params) {\n var _this = this;\n if (this.isSuppressModelUpdateAfterUpdateTransaction(params)) {\n return;\n }\n // this goes through the pipeline of stages. what's in my head is similar\n // to the diagram on this page:\n // http://commons.apache.org/sandbox/commons-pipeline/pipeline_basics.html\n // however we want to keep the results of each stage, hence we manually call\n // each step rather than have them chain each other.\n // fallthrough in below switch is on purpose,\n // eg if STEP_FILTER, then all steps below this\n // step get done\n // let start: number;\n // console.log('======= start =======');\n var changedPath = this.createChangePath(params.rowNodeTransactions);\n switch (params.step) {\n case exports.ClientSideRowModelSteps.EVERYTHING:\n // start = new Date().getTime();\n this.doRowGrouping(params.groupState, params.rowNodeTransactions, params.rowNodeOrder, changedPath, !!params.afterColumnsChanged);\n // console.log('rowGrouping = ' + (new Date().getTime() - start));\n case exports.ClientSideRowModelSteps.FILTER:\n // start = new Date().getTime();\n this.doFilter(changedPath);\n // console.log('filter = ' + (new Date().getTime() - start));\n case exports.ClientSideRowModelSteps.PIVOT:\n this.doPivot(changedPath);\n case exports.ClientSideRowModelSteps.AGGREGATE: // depends on agg fields\n // start = new Date().getTime();\n this.doAggregate(changedPath);\n // console.log('aggregation = ' + (new Date().getTime() - start));\n case exports.ClientSideRowModelSteps.SORT:\n // start = new Date().getTime();\n this.doSort(params.rowNodeTransactions, changedPath);\n // console.log('sort = ' + (new Date().getTime() - start));\n case exports.ClientSideRowModelSteps.MAP:\n // start = new Date().getTime();\n this.doRowsToDisplay();\n // console.log('rowsToDisplay = ' + (new Date().getTime() - start));\n }\n // set all row tops to null, then set row tops on all visible rows. if we don't\n // do this, then the algorithm below only sets row tops, old row tops from old rows\n // will still lie around\n this.resetRowTops(this.rootNode, changedPath);\n this.setRowTops();\n var event = {\n type: Events.EVENT_MODEL_UPDATED,\n api: this.gridApi,\n columnApi: this.columnApi,\n animate: params.animate,\n keepRenderedRows: params.keepRenderedRows,\n newData: params.newData,\n newPage: false\n };\n this.eventService.dispatchEvent(event);\n if (this.$scope) {\n window.setTimeout(function () {\n _this.$scope.$apply();\n }, 0);\n }\n };\n ClientSideRowModel.prototype.isEmpty = function () {\n var rowsMissing = _.missing(this.rootNode.allLeafChildren) || this.rootNode.allLeafChildren.length === 0;\n return _.missing(this.rootNode) || rowsMissing || !this.columnController.isReady();\n };\n ClientSideRowModel.prototype.isRowsToRender = function () {\n return _.exists(this.rowsToDisplay) && this.rowsToDisplay.length > 0;\n };\n ClientSideRowModel.prototype.getNodesInRangeForSelection = function (firstInRange, lastInRange) {\n // if lastSelectedNode is missing, we start at the first row\n var firstRowHit = !lastInRange;\n var lastRowHit = false;\n var lastRow;\n var result = [];\n var groupsSelectChildren = this.gridOptionsWrapper.isGroupSelectsChildren();\n this.forEachNodeAfterFilterAndSort(function (rowNode) {\n var lookingForLastRow = firstRowHit && !lastRowHit;\n // check if we need to flip the select switch\n if (!firstRowHit) {\n if (rowNode === lastInRange || rowNode === firstInRange) {\n firstRowHit = true;\n }\n }\n var skipThisGroupNode = rowNode.group && groupsSelectChildren;\n if (!skipThisGroupNode) {\n var inRange = firstRowHit && !lastRowHit;\n var childOfLastRow = rowNode.isParentOfNode(lastRow);\n if (inRange || childOfLastRow) {\n result.push(rowNode);\n }\n }\n if (lookingForLastRow) {\n if (rowNode === lastInRange || rowNode === firstInRange) {\n lastRowHit = true;\n if (rowNode === lastInRange) {\n lastRow = lastInRange;\n }\n else {\n lastRow = firstInRange;\n }\n }\n }\n });\n return result;\n };\n ClientSideRowModel.prototype.setDatasource = function (datasource) {\n console.error('AG Grid: should never call setDatasource on clientSideRowController');\n };\n ClientSideRowModel.prototype.getTopLevelNodes = function () {\n return this.rootNode ? this.rootNode.childrenAfterGroup : null;\n };\n ClientSideRowModel.prototype.getRootNode = function () {\n return this.rootNode;\n };\n ClientSideRowModel.prototype.getRow = function (index) {\n return this.rowsToDisplay[index];\n };\n ClientSideRowModel.prototype.isRowPresent = function (rowNode) {\n return this.rowsToDisplay.indexOf(rowNode) >= 0;\n };\n ClientSideRowModel.prototype.getRowIndexAtPixel = function (pixelToMatch) {\n if (this.isEmpty()) {\n return -1;\n }\n // do binary search of tree\n // http://oli.me.uk/2013/06/08/searching-javascript-arrays-with-a-binary-search/\n var bottomPointer = 0;\n var topPointer = this.rowsToDisplay.length - 1;\n // quick check, if the pixel is out of bounds, then return last row\n if (pixelToMatch <= 0) {\n // if pixel is less than or equal zero, it's always the first row\n return 0;\n }\n var lastNode = _.last(this.rowsToDisplay);\n if (lastNode.rowTop <= pixelToMatch) {\n return this.rowsToDisplay.length - 1;\n }\n while (true) {\n var midPointer = Math.floor((bottomPointer + topPointer) / 2);\n var currentRowNode = this.rowsToDisplay[midPointer];\n if (this.isRowInPixel(currentRowNode, pixelToMatch)) {\n return midPointer;\n }\n if (currentRowNode.rowTop < pixelToMatch) {\n bottomPointer = midPointer + 1;\n }\n else if (currentRowNode.rowTop > pixelToMatch) {\n topPointer = midPointer - 1;\n }\n }\n };\n ClientSideRowModel.prototype.isRowInPixel = function (rowNode, pixelToMatch) {\n var topPixel = rowNode.rowTop;\n var bottomPixel = rowNode.rowTop + rowNode.rowHeight;\n var pixelInRow = topPixel <= pixelToMatch && bottomPixel > pixelToMatch;\n return pixelInRow;\n };\n ClientSideRowModel.prototype.forEachLeafNode = function (callback) {\n if (this.rootNode.allLeafChildren) {\n this.rootNode.allLeafChildren.forEach(function (rowNode, index) { return callback(rowNode, index); });\n }\n };\n ClientSideRowModel.prototype.forEachNode = function (callback) {\n this.recursivelyWalkNodesAndCallback(this.rootNode.childrenAfterGroup, callback, RecursionType.Normal, 0);\n };\n ClientSideRowModel.prototype.forEachNodeAfterFilter = function (callback) {\n this.recursivelyWalkNodesAndCallback(this.rootNode.childrenAfterFilter, callback, RecursionType.AfterFilter, 0);\n };\n ClientSideRowModel.prototype.forEachNodeAfterFilterAndSort = function (callback) {\n this.recursivelyWalkNodesAndCallback(this.rootNode.childrenAfterSort, callback, RecursionType.AfterFilterAndSort, 0);\n };\n ClientSideRowModel.prototype.forEachPivotNode = function (callback) {\n this.recursivelyWalkNodesAndCallback([this.rootNode], callback, RecursionType.PivotNodes, 0);\n };\n // iterates through each item in memory, and calls the callback function\n // nodes - the rowNodes to traverse\n // callback - the user provided callback\n // recursion type - need this to know what child nodes to recurse, eg if looking at all nodes, or filtered notes etc\n // index - works similar to the index in forEach in javascript's array function\n ClientSideRowModel.prototype.recursivelyWalkNodesAndCallback = function (nodes, callback, recursionType, index) {\n if (!nodes) {\n return index;\n }\n for (var i = 0; i < nodes.length; i++) {\n var node = nodes[i];\n callback(node, index++);\n // go to the next level if it is a group\n if (node.hasChildren()) {\n // depending on the recursion type, we pick a difference set of children\n var nodeChildren = null;\n switch (recursionType) {\n case RecursionType.Normal:\n nodeChildren = node.childrenAfterGroup;\n break;\n case RecursionType.AfterFilter:\n nodeChildren = node.childrenAfterFilter;\n break;\n case RecursionType.AfterFilterAndSort:\n nodeChildren = node.childrenAfterSort;\n break;\n case RecursionType.PivotNodes:\n // for pivot, we don't go below leafGroup levels\n nodeChildren = !node.leafGroup ? node.childrenAfterSort : null;\n break;\n }\n if (nodeChildren) {\n index = this.recursivelyWalkNodesAndCallback(nodeChildren, callback, recursionType, index);\n }\n }\n }\n return index;\n };\n // it's possible to recompute the aggregate without doing the other parts\n // + gridApi.recomputeAggregates()\n ClientSideRowModel.prototype.doAggregate = function (changedPath) {\n if (this.aggregationStage) {\n this.aggregationStage.execute({ rowNode: this.rootNode, changedPath: changedPath });\n }\n };\n // + gridApi.expandAll()\n // + gridApi.collapseAll()\n ClientSideRowModel.prototype.expandOrCollapseAll = function (expand) {\n var usingTreeData = this.gridOptionsWrapper.isTreeData();\n if (this.rootNode) {\n recursiveExpandOrCollapse(this.rootNode.childrenAfterGroup);\n }\n function recursiveExpandOrCollapse(rowNodes) {\n if (!rowNodes) {\n return;\n }\n rowNodes.forEach(function (rowNode) {\n var shouldExpandOrCollapse = usingTreeData ? _.exists(rowNode.childrenAfterGroup) : rowNode.group;\n if (shouldExpandOrCollapse) {\n rowNode.expanded = expand;\n recursiveExpandOrCollapse(rowNode.childrenAfterGroup);\n }\n });\n }\n this.refreshModel({ step: exports.ClientSideRowModelSteps.MAP });\n var eventSource = expand ? 'expandAll' : 'collapseAll';\n var event = {\n api: this.gridApi,\n columnApi: this.columnApi,\n type: Events.EVENT_EXPAND_COLLAPSE_ALL,\n source: eventSource\n };\n this.eventService.dispatchEvent(event);\n };\n ClientSideRowModel.prototype.doSort = function (rowNodeTransactions, changedPath) {\n this.sortStage.execute({\n rowNode: this.rootNode,\n rowNodeTransactions: rowNodeTransactions,\n changedPath: changedPath\n });\n };\n ClientSideRowModel.prototype.doRowGrouping = function (groupState, rowNodeTransactions, rowNodeOrder, changedPath, afterColumnsChanged) {\n if (this.groupStage) {\n if (rowNodeTransactions) {\n this.groupStage.execute({\n rowNode: this.rootNode,\n rowNodeTransactions: rowNodeTransactions,\n rowNodeOrder: rowNodeOrder,\n changedPath: changedPath\n });\n }\n else {\n // groups are about to get disposed, so need to deselect any that are selected\n this.selectionController.removeGroupsFromSelection();\n this.groupStage.execute({\n rowNode: this.rootNode,\n changedPath: changedPath,\n afterColumnsChanged: afterColumnsChanged\n });\n // set open/closed state on groups\n this.restoreGroupState(groupState);\n }\n if (this.gridOptionsWrapper.isGroupSelectsChildren()) {\n this.selectionController.updateGroupsFromChildrenSelections(changedPath);\n }\n }\n else {\n this.rootNode.childrenAfterGroup = this.rootNode.allLeafChildren;\n this.rootNode.updateHasChildren();\n }\n };\n ClientSideRowModel.prototype.restoreGroupState = function (groupState) {\n if (!groupState) {\n return;\n }\n _.traverseNodesWithKey(this.rootNode.childrenAfterGroup, function (node, key) {\n // if the group was open last time, then open it this time. however\n // if was not open last time, then don't touch the group, so the 'groupDefaultExpanded'\n // setting will take effect.\n if (typeof groupState[key] === 'boolean') {\n node.expanded = groupState[key];\n }\n });\n };\n ClientSideRowModel.prototype.doFilter = function (changedPath) {\n this.filterStage.execute({ rowNode: this.rootNode, changedPath: changedPath });\n };\n ClientSideRowModel.prototype.doPivot = function (changedPath) {\n if (this.pivotStage) {\n this.pivotStage.execute({ rowNode: this.rootNode, changedPath: changedPath });\n }\n };\n ClientSideRowModel.prototype.getGroupState = function () {\n if (!this.rootNode.childrenAfterGroup || !this.gridOptionsWrapper.isRememberGroupStateWhenNewData()) {\n return null;\n }\n var result = {};\n _.traverseNodesWithKey(this.rootNode.childrenAfterGroup, function (node, key) { return result[key] = node.expanded; });\n return result;\n };\n ClientSideRowModel.prototype.getCopyOfNodesMap = function () {\n return this.nodeManager.getCopyOfNodesMap();\n };\n ClientSideRowModel.prototype.getRowNode = function (id) {\n return this.nodeManager.getRowNode(id);\n };\n // rows: the rows to put into the model\n ClientSideRowModel.prototype.setRowData = function (rowData) {\n // no need to invalidate cache, as the cache is stored on the rowNode,\n // so new rowNodes means the cache is wiped anyway.\n // remember group state, so we can expand groups that should be expanded\n var groupState = this.getGroupState();\n this.nodeManager.setRowData(rowData);\n // this event kicks off:\n // - clears selection\n // - updates filters\n // - shows 'no rows' overlay if needed\n var rowDataChangedEvent = {\n type: Events.EVENT_ROW_DATA_CHANGED,\n api: this.gridApi,\n columnApi: this.columnApi\n };\n this.eventService.dispatchEvent(rowDataChangedEvent);\n this.refreshModel({\n step: exports.ClientSideRowModelSteps.EVERYTHING,\n groupState: groupState,\n newData: true\n });\n };\n ClientSideRowModel.prototype.batchUpdateRowData = function (rowDataTransaction, callback) {\n var _this = this;\n if (this.applyAsyncTransactionsTimeout == null) {\n this.rowDataTransactionBatch = [];\n var waitMillis = this.gridOptionsWrapper.getAsyncTransactionWaitMillis();\n this.applyAsyncTransactionsTimeout = window.setTimeout(function () {\n _this.executeBatchUpdateRowData();\n }, waitMillis);\n }\n this.rowDataTransactionBatch.push({ rowDataTransaction: rowDataTransaction, callback: callback });\n };\n ClientSideRowModel.prototype.flushAsyncTransactions = function () {\n if (this.applyAsyncTransactionsTimeout != null) {\n clearTimeout(this.applyAsyncTransactionsTimeout);\n this.executeBatchUpdateRowData();\n }\n };\n ClientSideRowModel.prototype.executeBatchUpdateRowData = function () {\n var _this = this;\n this.valueCache.onDataChanged();\n var callbackFuncsBound = [];\n var rowNodeTrans = [];\n // The rowGroup stage uses rowNodeOrder if order was provided. if we didn't pass 'true' to\n // commonUpdateRowData, using addIndex would have no effect when grouping.\n var forceRowNodeOrder = false;\n if (this.rowDataTransactionBatch) {\n this.rowDataTransactionBatch.forEach(function (tranItem) {\n var rowNodeTran = _this.nodeManager.updateRowData(tranItem.rowDataTransaction, undefined);\n rowNodeTrans.push(rowNodeTran);\n if (tranItem.callback) {\n callbackFuncsBound.push(tranItem.callback.bind(null, rowNodeTran));\n }\n if (typeof tranItem.rowDataTransaction.addIndex === 'number') {\n forceRowNodeOrder = true;\n }\n });\n }\n this.commonUpdateRowData(rowNodeTrans, undefined, forceRowNodeOrder);\n // do callbacks in next VM turn so it's async\n if (callbackFuncsBound.length > 0) {\n window.setTimeout(function () {\n callbackFuncsBound.forEach(function (func) { return func(); });\n }, 0);\n }\n if (rowNodeTrans.length > 0) {\n var event_1 = {\n api: this.gridOptionsWrapper.getApi(),\n columnApi: this.gridOptionsWrapper.getColumnApi(),\n type: Events.EVENT_ASYNC_TRANSACTIONS_FLUSHED,\n results: rowNodeTrans\n };\n this.eventService.dispatchEvent(event_1);\n }\n this.rowDataTransactionBatch = null;\n this.applyAsyncTransactionsTimeout = undefined;\n };\n ClientSideRowModel.prototype.updateRowData = function (rowDataTran, rowNodeOrder) {\n this.valueCache.onDataChanged();\n var rowNodeTran = this.nodeManager.updateRowData(rowDataTran, rowNodeOrder);\n // if doing immutableData, addIndex is never present. however if doing standard transaction, and user\n // provided addIndex, then this is used in updateRowData. However if doing Enterprise, then the rowGroup\n // stage also uses the\n var forceRowNodeOrder = typeof rowDataTran.addIndex === 'number';\n this.commonUpdateRowData([rowNodeTran], rowNodeOrder, forceRowNodeOrder);\n return rowNodeTran;\n };\n ClientSideRowModel.prototype.createRowNodeOrder = function () {\n var suppressSortOrder = this.gridOptionsWrapper.isSuppressMaintainUnsortedOrder();\n if (suppressSortOrder) {\n return;\n }\n var orderMap = {};\n if (this.rootNode && this.rootNode.allLeafChildren) {\n for (var index = 0; index < this.rootNode.allLeafChildren.length; index++) {\n var node = this.rootNode.allLeafChildren[index];\n orderMap[node.id] = index;\n }\n }\n return orderMap;\n };\n // common to updateRowData and batchUpdateRowData\n ClientSideRowModel.prototype.commonUpdateRowData = function (rowNodeTrans, rowNodeOrder, forceRowNodeOrder) {\n if (forceRowNodeOrder) {\n rowNodeOrder = this.createRowNodeOrder();\n }\n this.refreshModel({\n step: exports.ClientSideRowModelSteps.EVERYTHING,\n rowNodeTransactions: rowNodeTrans,\n rowNodeOrder: rowNodeOrder,\n keepRenderedRows: true,\n animate: true,\n keepEditingRows: true\n });\n var event = {\n type: Events.EVENT_ROW_DATA_UPDATED,\n api: this.gridApi,\n columnApi: this.columnApi\n };\n this.eventService.dispatchEvent(event);\n };\n ClientSideRowModel.prototype.doRowsToDisplay = function () {\n this.rowsToDisplay = this.flattenStage.execute({ rowNode: this.rootNode });\n };\n ClientSideRowModel.prototype.onRowHeightChanged = function () {\n this.refreshModel({ step: exports.ClientSideRowModelSteps.MAP, keepRenderedRows: true, keepEditingRows: true });\n };\n ClientSideRowModel.prototype.resetRowHeights = function () {\n var atLeastOne = false;\n this.forEachNode(function (rowNode) {\n rowNode.setRowHeight(rowNode.rowHeight, true);\n // we keep the height each row is at, however we set estimated=true rather than clear the height.\n // this means the grid will not reset the row heights back to defaults, rather it will re-calc\n // the height for each row as the row is displayed. otherwise the scroll will jump when heights are reset.\n var detailNode = rowNode.detailNode;\n if (detailNode) {\n detailNode.setRowHeight(detailNode.rowHeight, true);\n }\n atLeastOne = true;\n });\n if (atLeastOne) {\n this.onRowHeightChanged();\n }\n };\n __decorate$1T([\n Autowired('columnController')\n ], ClientSideRowModel.prototype, \"columnController\", void 0);\n __decorate$1T([\n Autowired('filterManager')\n ], ClientSideRowModel.prototype, \"filterManager\", void 0);\n __decorate$1T([\n Autowired('$scope')\n ], ClientSideRowModel.prototype, \"$scope\", void 0);\n __decorate$1T([\n Autowired('selectionController')\n ], ClientSideRowModel.prototype, \"selectionController\", void 0);\n __decorate$1T([\n Autowired('valueService')\n ], ClientSideRowModel.prototype, \"valueService\", void 0);\n __decorate$1T([\n Autowired('valueCache')\n ], ClientSideRowModel.prototype, \"valueCache\", void 0);\n __decorate$1T([\n Autowired('columnApi')\n ], ClientSideRowModel.prototype, \"columnApi\", void 0);\n __decorate$1T([\n Autowired('gridApi')\n ], ClientSideRowModel.prototype, \"gridApi\", void 0);\n __decorate$1T([\n Autowired('animationFrameService')\n ], ClientSideRowModel.prototype, \"animationFrameService\", void 0);\n __decorate$1T([\n Autowired('filterStage')\n ], ClientSideRowModel.prototype, \"filterStage\", void 0);\n __decorate$1T([\n Autowired('sortStage')\n ], ClientSideRowModel.prototype, \"sortStage\", void 0);\n __decorate$1T([\n Autowired('flattenStage')\n ], ClientSideRowModel.prototype, \"flattenStage\", void 0);\n __decorate$1T([\n Optional('groupStage')\n ], ClientSideRowModel.prototype, \"groupStage\", void 0);\n __decorate$1T([\n Optional('aggregationStage')\n ], ClientSideRowModel.prototype, \"aggregationStage\", void 0);\n __decorate$1T([\n Optional('pivotStage')\n ], ClientSideRowModel.prototype, \"pivotStage\", void 0);\n __decorate$1T([\n PostConstruct\n ], ClientSideRowModel.prototype, \"init\", null);\n ClientSideRowModel = __decorate$1T([\n Bean('rowModel')\n ], ClientSideRowModel);\n return ClientSideRowModel;\n}(BeanStub));\n\nvar __extends$22 = (undefined && undefined.__extends) || (function () {\n var extendStatics = function (d, b) {\n extendStatics = Object.setPrototypeOf ||\n ({ __proto__: [] } instanceof Array && function (d, b) { d.__proto__ = b; }) ||\n function (d, b) { for (var p in b) if (b.hasOwnProperty(p)) d[p] = b[p]; };\n return extendStatics(d, b);\n };\n return function (d, b) {\n extendStatics(d, b);\n function __() { this.constructor = d; }\n d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __());\n };\n})();\nvar __decorate$1U = (undefined && undefined.__decorate) || function (decorators, target, key, desc) {\n var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d;\n if (typeof Reflect === \"object\" && typeof Reflect.decorate === \"function\") r = Reflect.decorate(decorators, target, key, desc);\n else for (var i = decorators.length - 1; i >= 0; i--) if (d = decorators[i]) r = (c < 3 ? d(r) : c > 3 ? d(target, key, r) : d(target, key)) || r;\n return c > 3 && r && Object.defineProperty(target, key, r), r;\n};\nvar FilterStage = /** @class */ (function (_super) {\n __extends$22(FilterStage, _super);\n function FilterStage() {\n return _super !== null && _super.apply(this, arguments) || this;\n }\n FilterStage.prototype.execute = function (params) {\n var rowNode = params.rowNode, changedPath = params.changedPath;\n this.filterService.filter(changedPath);\n this.selectableService.updateSelectableAfterFiltering(rowNode);\n };\n __decorate$1U([\n Autowired('selectableService')\n ], FilterStage.prototype, \"selectableService\", void 0);\n __decorate$1U([\n Autowired('filterService')\n ], FilterStage.prototype, \"filterService\", void 0);\n FilterStage = __decorate$1U([\n Bean('filterStage')\n ], FilterStage);\n return FilterStage;\n}(BeanStub));\n\nvar __extends$23 = (undefined && undefined.__extends) || (function () {\n var extendStatics = function (d, b) {\n extendStatics = Object.setPrototypeOf ||\n ({ __proto__: [] } instanceof Array && function (d, b) { d.__proto__ = b; }) ||\n function (d, b) { for (var p in b) if (b.hasOwnProperty(p)) d[p] = b[p]; };\n return extendStatics(d, b);\n };\n return function (d, b) {\n extendStatics(d, b);\n function __() { this.constructor = d; }\n d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __());\n };\n})();\nvar __decorate$1V = (undefined && undefined.__decorate) || function (decorators, target, key, desc) {\n var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d;\n if (typeof Reflect === \"object\" && typeof Reflect.decorate === \"function\") r = Reflect.decorate(decorators, target, key, desc);\n else for (var i = decorators.length - 1; i >= 0; i--) if (d = decorators[i]) r = (c < 3 ? d(r) : c > 3 ? d(target, key, r) : d(target, key)) || r;\n return c > 3 && r && Object.defineProperty(target, key, r), r;\n};\nvar SortStage = /** @class */ (function (_super) {\n __extends$23(SortStage, _super);\n function SortStage() {\n return _super !== null && _super.apply(this, arguments) || this;\n }\n SortStage.prototype.execute = function (params) {\n var sortOptions = this.sortController.getSortOptions();\n var sortActive = _.exists(sortOptions) && sortOptions.length > 0;\n var deltaSort = sortActive\n && _.exists(params.rowNodeTransactions)\n // in time we can remove this check, so that delta sort is always\n // on if transactions are present. it's off for now so that we can\n // selectively turn it on and test it with some select users before\n // rolling out to everyone.\n && this.gridOptionsWrapper.isDeltaSort();\n // we only need dirty nodes if doing delta sort\n var dirtyLeafNodes = deltaSort ? this.calculateDirtyNodes(params.rowNodeTransactions) : null;\n var valueColumns = this.columnController.getValueColumns();\n var noAggregations = _.missingOrEmpty(valueColumns);\n this.sortService.sort(sortOptions, sortActive, deltaSort, dirtyLeafNodes, params.changedPath, noAggregations);\n };\n SortStage.prototype.calculateDirtyNodes = function (rowNodeTransactions) {\n var dirtyNodes = {};\n var addNodesFunc = function (rowNodes) {\n if (rowNodes) {\n rowNodes.forEach(function (rowNode) { return dirtyNodes[rowNode.id] = true; });\n }\n };\n // all leaf level nodes in the transaction were impacted\n if (rowNodeTransactions) {\n rowNodeTransactions.forEach(function (tran) {\n addNodesFunc(tran.add);\n addNodesFunc(tran.update);\n addNodesFunc(tran.remove);\n });\n }\n return dirtyNodes;\n };\n __decorate$1V([\n Autowired('sortService')\n ], SortStage.prototype, \"sortService\", void 0);\n __decorate$1V([\n Autowired('sortController')\n ], SortStage.prototype, \"sortController\", void 0);\n __decorate$1V([\n Autowired('columnController')\n ], SortStage.prototype, \"columnController\", void 0);\n SortStage = __decorate$1V([\n Bean('sortStage')\n ], SortStage);\n return SortStage;\n}(BeanStub));\n\nvar __extends$24 = (undefined && undefined.__extends) || (function () {\n var extendStatics = function (d, b) {\n extendStatics = Object.setPrototypeOf ||\n ({ __proto__: [] } instanceof Array && function (d, b) { d.__proto__ = b; }) ||\n function (d, b) { for (var p in b) if (b.hasOwnProperty(p)) d[p] = b[p]; };\n return extendStatics(d, b);\n };\n return function (d, b) {\n extendStatics(d, b);\n function __() { this.constructor = d; }\n d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __());\n };\n})();\nvar __decorate$1W = (undefined && undefined.__decorate) || function (decorators, target, key, desc) {\n var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d;\n if (typeof Reflect === \"object\" && typeof Reflect.decorate === \"function\") r = Reflect.decorate(decorators, target, key, desc);\n else for (var i = decorators.length - 1; i >= 0; i--) if (d = decorators[i]) r = (c < 3 ? d(r) : c > 3 ? d(target, key, r) : d(target, key)) || r;\n return c > 3 && r && Object.defineProperty(target, key, r), r;\n};\nvar FlattenStage = /** @class */ (function (_super) {\n __extends$24(FlattenStage, _super);\n function FlattenStage() {\n return _super !== null && _super.apply(this, arguments) || this;\n }\n FlattenStage.prototype.execute = function (params) {\n var rootNode = params.rowNode;\n // even if not doing grouping, we do the mapping, as the client might\n // of passed in data that already has a grouping in it somewhere\n var result = [];\n // putting value into a wrapper so it's passed by reference\n var nextRowTop = { value: 0 };\n var skipLeafNodes = this.columnController.isPivotMode();\n // if we are reducing, and not grouping, then we want to show the root node, as that\n // is where the pivot values are\n var showRootNode = skipLeafNodes && rootNode.leafGroup;\n var topList = showRootNode ? [rootNode] : rootNode.childrenAfterSort;\n this.recursivelyAddToRowsToDisplay(topList, result, nextRowTop, skipLeafNodes, 0);\n // we do not want the footer total if the gris is empty\n var atLeastOneRowPresent = result.length > 0;\n var includeGroupTotalFooter = !showRootNode\n // don't show total footer when showRootNode is true (i.e. in pivot mode and no groups)\n && atLeastOneRowPresent\n && this.gridOptionsWrapper.isGroupIncludeTotalFooter();\n if (includeGroupTotalFooter) {\n this.ensureFooterNodeExists(rootNode);\n this.addRowNodeToRowsToDisplay(rootNode.sibling, result, nextRowTop, 0);\n }\n return result;\n };\n FlattenStage.prototype.recursivelyAddToRowsToDisplay = function (rowsToFlatten, result, nextRowTop, skipLeafNodes, uiLevel) {\n if (_.missingOrEmpty(rowsToFlatten)) {\n return;\n }\n var hideOpenParents = this.gridOptionsWrapper.isGroupHideOpenParents();\n // these two are mutually exclusive, so if first set, we don't set the second\n var groupRemoveSingleChildren = this.gridOptionsWrapper.isGroupRemoveSingleChildren();\n var groupRemoveLowestSingleChildren = !groupRemoveSingleChildren && this.gridOptionsWrapper.isGroupRemoveLowestSingleChildren();\n for (var i = 0; i < rowsToFlatten.length; i++) {\n var rowNode = rowsToFlatten[i];\n // check all these cases, for working out if this row should be included in the final mapped list\n var isParent = rowNode.hasChildren();\n var isSkippedLeafNode = skipLeafNodes && !isParent;\n var isRemovedSingleChildrenGroup = groupRemoveSingleChildren &&\n isParent &&\n rowNode.childrenAfterGroup.length === 1;\n var isRemovedLowestSingleChildrenGroup = groupRemoveLowestSingleChildren &&\n isParent &&\n rowNode.leafGroup &&\n rowNode.childrenAfterGroup.length === 1;\n // hide open parents means when group is open, we don't show it. we also need to make sure the\n // group is expandable in the first place (as leaf groups are not expandable if pivot mode is on).\n // the UI will never allow expanding leaf groups, however the user might via the API (or menu option 'expand all')\n var neverAllowToExpand = skipLeafNodes && rowNode.leafGroup;\n var isHiddenOpenParent = hideOpenParents && rowNode.expanded && (!neverAllowToExpand);\n var thisRowShouldBeRendered = !isSkippedLeafNode && !isHiddenOpenParent &&\n !isRemovedSingleChildrenGroup && !isRemovedLowestSingleChildrenGroup;\n if (thisRowShouldBeRendered) {\n this.addRowNodeToRowsToDisplay(rowNode, result, nextRowTop, uiLevel);\n }\n // if we are pivoting, we never map below the leaf group\n if (skipLeafNodes && rowNode.leafGroup) {\n continue;\n }\n if (isParent) {\n var excludedParent = isRemovedSingleChildrenGroup || isRemovedLowestSingleChildrenGroup;\n // we traverse the group if it is expended, however we always traverse if the parent node\n // was removed (as the group will never be opened if it is not displayed, we show the children instead)\n if (rowNode.expanded || excludedParent) {\n // if the parent was excluded, then ui level is that of the parent\n var uiLevelForChildren = excludedParent ? uiLevel : uiLevel + 1;\n this.recursivelyAddToRowsToDisplay(rowNode.childrenAfterSort, result, nextRowTop, skipLeafNodes, uiLevelForChildren);\n // put a footer in if user is looking for it\n if (this.gridOptionsWrapper.isGroupIncludeFooter()) {\n this.ensureFooterNodeExists(rowNode);\n this.addRowNodeToRowsToDisplay(rowNode.sibling, result, nextRowTop, uiLevel);\n }\n }\n }\n else if (rowNode.master && rowNode.expanded) {\n var detailNode = this.createDetailNode(rowNode);\n this.addRowNodeToRowsToDisplay(detailNode, result, nextRowTop, uiLevel);\n }\n }\n };\n // duplicated method, it's also in floatingRowModel\n FlattenStage.prototype.addRowNodeToRowsToDisplay = function (rowNode, result, nextRowTop, uiLevel) {\n var isGroupMultiAutoColumn = this.gridOptionsWrapper.isGroupMultiAutoColumn();\n result.push(rowNode);\n rowNode.setUiLevel(isGroupMultiAutoColumn ? 0 : uiLevel);\n };\n FlattenStage.prototype.ensureFooterNodeExists = function (groupNode) {\n // only create footer node once, otherwise we have daemons and\n // the animate screws up with the daemons hanging around\n if (_.exists(groupNode.sibling)) {\n return;\n }\n var footerNode = new RowNode();\n this.context.createBean(footerNode);\n Object.keys(groupNode).forEach(function (key) {\n footerNode[key] = groupNode[key];\n });\n footerNode.footer = true;\n footerNode.setRowTop(null);\n footerNode.setRowIndex(null);\n // manually set oldRowTop to null so we discard any\n // previous information about its position.\n footerNode.oldRowTop = null;\n if (_.exists(footerNode.id)) {\n footerNode.id = 'rowGroupFooter_' + footerNode.id;\n }\n // get both header and footer to reference each other as siblings. this is never undone,\n // only overwritten. so if a group is expanded, then contracted, it will have a ghost\n // sibling - but that's fine, as we can ignore this if the header is contracted.\n footerNode.sibling = groupNode;\n groupNode.sibling = footerNode;\n };\n FlattenStage.prototype.createDetailNode = function (masterNode) {\n if (_.exists(masterNode.detailNode)) {\n return masterNode.detailNode;\n }\n var detailNode = new RowNode();\n this.context.createBean(detailNode);\n detailNode.detail = true;\n detailNode.selectable = false;\n detailNode.parent = masterNode;\n if (_.exists(masterNode.id)) {\n detailNode.id = 'detail_' + masterNode.id;\n }\n detailNode.data = masterNode.data;\n detailNode.level = masterNode.level + 1;\n masterNode.detailNode = detailNode;\n return detailNode;\n };\n __decorate$1W([\n Autowired('selectionController')\n ], FlattenStage.prototype, \"selectionController\", void 0);\n __decorate$1W([\n Autowired('columnController')\n ], FlattenStage.prototype, \"columnController\", void 0);\n FlattenStage = __decorate$1W([\n Bean('flattenStage')\n ], FlattenStage);\n return FlattenStage;\n}(BeanStub));\n\nvar __extends$25 = (undefined && undefined.__extends) || (function () {\n var extendStatics = function (d, b) {\n extendStatics = Object.setPrototypeOf ||\n ({ __proto__: [] } instanceof Array && function (d, b) { d.__proto__ = b; }) ||\n function (d, b) { for (var p in b) if (b.hasOwnProperty(p)) d[p] = b[p]; };\n return extendStatics(d, b);\n };\n return function (d, b) {\n extendStatics(d, b);\n function __() { this.constructor = d; }\n d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __());\n };\n})();\nvar __decorate$1X = (undefined && undefined.__decorate) || function (decorators, target, key, desc) {\n var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d;\n if (typeof Reflect === \"object\" && typeof Reflect.decorate === \"function\") r = Reflect.decorate(decorators, target, key, desc);\n else for (var i = decorators.length - 1; i >= 0; i--) if (d = decorators[i]) r = (c < 3 ? d(r) : c > 3 ? d(target, key, r) : d(target, key)) || r;\n return c > 3 && r && Object.defineProperty(target, key, r), r;\n};\nvar SortService = /** @class */ (function (_super) {\n __extends$25(SortService, _super);\n function SortService() {\n return _super !== null && _super.apply(this, arguments) || this;\n }\n SortService.prototype.init = function () {\n this.postSortFunc = this.gridOptionsWrapper.getPostSortFunc();\n };\n SortService.prototype.sort = function (sortOptions, sortActive, deltaSort, dirtyLeafNodes, changedPath, noAggregations) {\n var _this = this;\n var callback = function (rowNode) {\n // we clear out the 'pull down open parents' first, as the values mix up the sorting\n _this.pullDownGroupDataForHideOpenParents(rowNode.childrenAfterFilter, true);\n // Javascript sort is non deterministic when all the array items are equals, ie Comparator always returns 0,\n // so to ensure the array keeps its order, add an additional sorting condition manually, in this case we\n // are going to inspect the original array position. This is what sortedRowNodes is for.\n if (sortActive) {\n rowNode.childrenAfterSort = deltaSort ?\n _this.doDeltaSort(rowNode, sortOptions, dirtyLeafNodes, changedPath, noAggregations)\n : _this.rowNodeSorter.doFullSort(rowNode.childrenAfterFilter, sortOptions);\n }\n else {\n rowNode.childrenAfterSort = rowNode.childrenAfterFilter.slice(0);\n }\n _this.updateChildIndexes(rowNode);\n if (_this.postSortFunc) {\n _this.postSortFunc(rowNode.childrenAfterSort);\n }\n };\n if (changedPath) {\n changedPath.forEachChangedNodeDepthFirst(callback);\n }\n this.updateGroupDataForHiddenOpenParents(changedPath);\n };\n SortService.prototype.mapNodeToSortedNode = function (rowNode, pos) {\n return { currentPos: pos, rowNode: rowNode };\n };\n SortService.prototype.doDeltaSort = function (rowNode, sortOptions, dirtyLeafNodes, changedPath, noAggregations) {\n // clean nodes will be a list of all row nodes that remain in the set\n // and ordered. we start with the old sorted set and take out any nodes\n // that were removed or changed (but not added, added doesn't make sense,\n // if a node was added, there is no way it could be here from last time).\n var cleanNodes = rowNode.childrenAfterSort\n .filter(function (node) {\n // take out all nodes that were changed as part of the current transaction.\n // a changed node could a) be in a different sort position or b) may\n // no longer be in this set as the changed node may not pass filtering,\n // or be in a different group.\n var passesDirtyNodesCheck = !dirtyLeafNodes[node.id];\n // also remove group nodes in the changed path, as they can have different aggregate\n // values which could impact the sort order.\n // note: changed path is not active if a) no value columns or b) no transactions. it is never\n // (b) in deltaSort as we only do deltaSort for transactions. for (a) if no value columns, then\n // there is no value in the group that could of changed (ie no aggregate values)\n var passesChangedPathCheck = noAggregations || (changedPath && changedPath.canSkip(node));\n return passesDirtyNodesCheck && passesChangedPathCheck;\n })\n .map(this.mapNodeToSortedNode.bind(this));\n // for fast access below, we map them\n var cleanNodesMapped = {};\n cleanNodes.forEach(function (sortedRowNode) { return cleanNodesMapped[sortedRowNode.rowNode.id] = sortedRowNode.rowNode; });\n // these are all nodes that need to be placed\n var changedNodes = rowNode.childrenAfterFilter\n // ignore nodes in the clean list\n .filter(function (node) { return !cleanNodesMapped[node.id]; })\n .map(this.mapNodeToSortedNode.bind(this));\n // sort changed nodes. note that we don't need to sort cleanNodes as they are\n // already sorted from last time.\n changedNodes.sort(this.rowNodeSorter.compareRowNodes.bind(this, sortOptions));\n var result;\n if (changedNodes.length === 0) {\n result = cleanNodes;\n }\n else if (cleanNodes.length === 0) {\n result = changedNodes;\n }\n else {\n result = this.mergeSortedArrays(sortOptions, cleanNodes, changedNodes);\n }\n return result.map(function (item) { return item.rowNode; });\n };\n // Merge two sorted arrays into each other\n SortService.prototype.mergeSortedArrays = function (sortOptions, arr1, arr2) {\n var res = [];\n var i = 0;\n var j = 0;\n // Traverse both array, adding them in order\n while (i < arr1.length && j < arr2.length) {\n // Check if current element of first\n // array is smaller than current element\n // of second array. If yes, store first\n // array element and increment first array\n // index. Otherwise do same with second array\n var compareResult = this.rowNodeSorter.compareRowNodes(sortOptions, arr1[i], arr2[j]);\n if (compareResult < 0) {\n res.push(arr1[i++]);\n }\n else {\n res.push(arr2[j++]);\n }\n }\n // add remaining from arr1\n while (i < arr1.length) {\n res.push(arr1[i++]);\n }\n // add remaining from arr2\n while (j < arr2.length) {\n res.push(arr2[j++]);\n }\n return res;\n };\n SortService.prototype.updateChildIndexes = function (rowNode) {\n if (_.missing(rowNode.childrenAfterSort)) {\n return;\n }\n var listToSort = rowNode.childrenAfterSort;\n for (var i = 0; i < listToSort.length; i++) {\n var child = listToSort[i];\n var firstChild = i === 0;\n var lastChild = i === rowNode.childrenAfterSort.length - 1;\n child.setFirstChild(firstChild);\n child.setLastChild(lastChild);\n child.setChildIndex(i);\n }\n };\n SortService.prototype.updateGroupDataForHiddenOpenParents = function (changedPath) {\n var _this = this;\n if (!this.gridOptionsWrapper.isGroupHideOpenParents()) {\n return;\n }\n // recurse breadth first over group nodes after sort to 'pull down' group data to child groups\n var callback = function (rowNode) {\n _this.pullDownGroupDataForHideOpenParents(rowNode.childrenAfterSort, false);\n rowNode.childrenAfterSort.forEach(function (child) {\n if (child.hasChildren()) {\n callback(child);\n }\n });\n };\n if (changedPath) {\n changedPath.executeFromRootNode(function (rowNode) { return callback(rowNode); });\n }\n };\n SortService.prototype.pullDownGroupDataForHideOpenParents = function (rowNodes, clearOperation) {\n var _this = this;\n if (!this.gridOptionsWrapper.isGroupHideOpenParents() || _.missing(rowNodes)) {\n return;\n }\n rowNodes.forEach(function (childRowNode) {\n var groupDisplayCols = _this.columnController.getGroupDisplayColumns();\n groupDisplayCols.forEach(function (groupDisplayCol) {\n var showRowGroup = groupDisplayCol.getColDef().showRowGroup;\n if (typeof showRowGroup !== 'string') {\n console.error('AG Grid: groupHideOpenParents only works when specifying specific columns for colDef.showRowGroup');\n return;\n }\n var displayingGroupKey = showRowGroup;\n var rowGroupColumn = _this.columnController.getPrimaryColumn(displayingGroupKey);\n var thisRowNodeMatches = rowGroupColumn === childRowNode.rowGroupColumn;\n if (thisRowNodeMatches) {\n return;\n }\n if (clearOperation) {\n // if doing a clear operation, we clear down the value for every possible group column\n childRowNode.setGroupValue(groupDisplayCol.getId(), null);\n }\n else {\n // if doing a set operation, we set only where the pull down is to occur\n var parentToStealFrom = childRowNode.getFirstChildOfFirstChild(rowGroupColumn);\n if (parentToStealFrom) {\n childRowNode.setGroupValue(groupDisplayCol.getId(), parentToStealFrom.key);\n }\n }\n });\n });\n };\n __decorate$1X([\n Autowired('columnController')\n ], SortService.prototype, \"columnController\", void 0);\n __decorate$1X([\n Autowired('rowNodeSorter')\n ], SortService.prototype, \"rowNodeSorter\", void 0);\n __decorate$1X([\n PostConstruct\n ], SortService.prototype, \"init\", null);\n SortService = __decorate$1X([\n Bean('sortService')\n ], SortService);\n return SortService;\n}(BeanStub));\n\nvar __extends$26 = (undefined && undefined.__extends) || (function () {\n var extendStatics = function (d, b) {\n extendStatics = Object.setPrototypeOf ||\n ({ __proto__: [] } instanceof Array && function (d, b) { d.__proto__ = b; }) ||\n function (d, b) { for (var p in b) if (b.hasOwnProperty(p)) d[p] = b[p]; };\n return extendStatics(d, b);\n };\n return function (d, b) {\n extendStatics(d, b);\n function __() { this.constructor = d; }\n d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __());\n };\n})();\nvar __decorate$1Y = (undefined && undefined.__decorate) || function (decorators, target, key, desc) {\n var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d;\n if (typeof Reflect === \"object\" && typeof Reflect.decorate === \"function\") r = Reflect.decorate(decorators, target, key, desc);\n else for (var i = decorators.length - 1; i >= 0; i--) if (d = decorators[i]) r = (c < 3 ? d(r) : c > 3 ? d(target, key, r) : d(target, key)) || r;\n return c > 3 && r && Object.defineProperty(target, key, r), r;\n};\nvar FilterService = /** @class */ (function (_super) {\n __extends$26(FilterService, _super);\n function FilterService() {\n return _super !== null && _super.apply(this, arguments) || this;\n }\n FilterService.prototype.postConstruct = function () {\n this.doingTreeData = this.gridOptionsWrapper.isTreeData();\n };\n FilterService.prototype.filter = function (changedPath) {\n var filterActive = this.filterManager.isAnyFilterPresent();\n this.filterNodes(filterActive, changedPath);\n };\n FilterService.prototype.filterNodes = function (filterActive, changedPath) {\n var _this = this;\n var filterCallback = function (rowNode, includeChildNodes) {\n // recursively get all children that are groups to also filter\n if (rowNode.hasChildren()) {\n // result of filter for this node. when filtering tree data, includeChildNodes = true when parent passes\n if (filterActive && !includeChildNodes) {\n rowNode.childrenAfterFilter = rowNode.childrenAfterGroup.filter(function (childNode) {\n // a group is included in the result if it has any children of it's own.\n // by this stage, the child groups are already filtered\n var passBecauseChildren = childNode.childrenAfterFilter && childNode.childrenAfterFilter.length > 0;\n // both leaf level nodes and tree data nodes have data. these get added if\n // the data passes the filter\n var passBecauseDataPasses = childNode.data\n && _this.filterManager.doesRowPassFilter({ rowNode: childNode });\n // note - tree data nodes pass either if a) they pass themselves or b) any children of that node pass\n return passBecauseChildren || passBecauseDataPasses;\n });\n }\n else {\n // if not filtering, the result is the original list\n rowNode.childrenAfterFilter = rowNode.childrenAfterGroup;\n }\n _this.setAllChildrenCount(rowNode);\n }\n else {\n rowNode.childrenAfterFilter = rowNode.childrenAfterGroup;\n rowNode.setAllChildrenCount(null);\n }\n };\n if (this.doingTreeDataFiltering()) {\n var treeDataDepthFirstFilter_1 = function (rowNode, alreadyFoundInParent) {\n // tree data filter traverses the hierarchy depth first and includes child nodes if parent passes\n // filter, and parent nodes will be include if any children exist.\n if (rowNode.childrenAfterGroup) {\n for (var i = 0; i < rowNode.childrenAfterGroup.length; i++) {\n var childNode = rowNode.childrenAfterGroup[i];\n // first check if current node passes filter before invoking child nodes\n var foundInParent = alreadyFoundInParent\n || _this.filterManager.doesRowPassFilter({ rowNode: childNode });\n if (childNode.childrenAfterGroup) {\n treeDataDepthFirstFilter_1(rowNode.childrenAfterGroup[i], foundInParent);\n }\n else {\n filterCallback(childNode, foundInParent);\n }\n }\n }\n filterCallback(rowNode, alreadyFoundInParent);\n };\n var treeDataFilterCallback = function (rowNode) { return treeDataDepthFirstFilter_1(rowNode, false); };\n changedPath.executeFromRootNode(treeDataFilterCallback);\n }\n else {\n var defaultFilterCallback = function (rowNode) { return filterCallback(rowNode, false); };\n changedPath.forEachChangedNodeDepthFirst(defaultFilterCallback, true);\n }\n };\n FilterService.prototype.setAllChildrenCountTreeData = function (rowNode) {\n // for tree data, we include all children, groups and leafs\n var allChildrenCount = 0;\n rowNode.childrenAfterFilter.forEach(function (child) {\n // include child itself\n allChildrenCount++;\n // include children of children\n allChildrenCount += child.allChildrenCount;\n });\n rowNode.setAllChildrenCount(allChildrenCount);\n };\n FilterService.prototype.setAllChildrenCountGridGrouping = function (rowNode) {\n // for grid data, we only count the leafs\n var allChildrenCount = 0;\n rowNode.childrenAfterFilter.forEach(function (child) {\n if (child.group) {\n allChildrenCount += child.allChildrenCount;\n }\n else {\n allChildrenCount++;\n }\n });\n rowNode.setAllChildrenCount(allChildrenCount);\n };\n FilterService.prototype.setAllChildrenCount = function (rowNode) {\n if (this.doingTreeData) {\n this.setAllChildrenCountTreeData(rowNode);\n }\n else {\n this.setAllChildrenCountGridGrouping(rowNode);\n }\n };\n FilterService.prototype.doingTreeDataFiltering = function () {\n return this.gridOptionsWrapper.isTreeData() && !this.gridOptionsWrapper.isExcludeChildrenWhenTreeDataFiltering();\n };\n __decorate$1Y([\n Autowired('filterManager')\n ], FilterService.prototype, \"filterManager\", void 0);\n __decorate$1Y([\n PostConstruct\n ], FilterService.prototype, \"postConstruct\", null);\n FilterService = __decorate$1Y([\n Bean(\"filterService\")\n ], FilterService);\n return FilterService;\n}(BeanStub));\n\nvar __extends$27 = (undefined && undefined.__extends) || (function () {\n var extendStatics = function (d, b) {\n extendStatics = Object.setPrototypeOf ||\n ({ __proto__: [] } instanceof Array && function (d, b) { d.__proto__ = b; }) ||\n function (d, b) { for (var p in b) if (b.hasOwnProperty(p)) d[p] = b[p]; };\n return extendStatics(d, b);\n };\n return function (d, b) {\n extendStatics(d, b);\n function __() { this.constructor = d; }\n d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __());\n };\n})();\nvar __decorate$1Z = (undefined && undefined.__decorate) || function (decorators, target, key, desc) {\n var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d;\n if (typeof Reflect === \"object\" && typeof Reflect.decorate === \"function\") r = Reflect.decorate(decorators, target, key, desc);\n else for (var i = decorators.length - 1; i >= 0; i--) if (d = decorators[i]) r = (c < 3 ? d(r) : c > 3 ? d(target, key, r) : d(target, key)) || r;\n return c > 3 && r && Object.defineProperty(target, key, r), r;\n};\nvar ImmutableService = /** @class */ (function (_super) {\n __extends$27(ImmutableService, _super);\n function ImmutableService() {\n return _super !== null && _super.apply(this, arguments) || this;\n }\n ImmutableService.prototype.postConstruct = function () {\n if (this.rowModel.getType() === Constants.ROW_MODEL_TYPE_CLIENT_SIDE) {\n this.clientSideRowModel = this.rowModel;\n }\n };\n // converts the setRowData() command to a transaction\n ImmutableService.prototype.createTransactionForRowData = function (data) {\n if (_.missing(this.clientSideRowModel)) {\n console.error('AG Grid: ImmutableService only works with ClientSideRowModel');\n return;\n }\n var getRowNodeIdFunc = this.gridOptionsWrapper.getRowNodeIdFunc();\n if (!getRowNodeIdFunc || _.missing(getRowNodeIdFunc)) {\n console.error('AG Grid: ImmutableService requires getRowNodeId() callback to be implemented, your row data need IDs!');\n return;\n }\n // convert the data into a transaction object by working out adds, removes and updates\n var transaction = {\n remove: [],\n update: [],\n add: []\n };\n var existingNodesMap = this.clientSideRowModel.getCopyOfNodesMap();\n var suppressSortOrder = this.gridOptionsWrapper.isSuppressMaintainUnsortedOrder();\n var orderMap = suppressSortOrder ? null : {};\n if (_.exists(data)) {\n // split all the new data in the following:\n // if new, push to 'add'\n // if update, push to 'update'\n // if not changed, do not include in the transaction\n data.forEach(function (dataItem, index) {\n var id = getRowNodeIdFunc(dataItem);\n var existingNode = existingNodesMap[id];\n if (orderMap) {\n orderMap[id] = index;\n }\n if (existingNode) {\n var dataHasChanged = existingNode.data !== dataItem;\n if (dataHasChanged) {\n transaction.update.push(dataItem);\n }\n // otherwise, if data not changed, we just don't include it anywhere, as it's not a delta\n // remove from list, so we know the item is not to be removed\n existingNodesMap[id] = undefined;\n }\n else {\n transaction.add.push(dataItem);\n }\n });\n }\n // at this point, all rows that are left, should be removed\n _.iterateObject(existingNodesMap, function (id, rowNode) {\n if (rowNode) {\n transaction.remove.push(rowNode.data);\n }\n });\n return [transaction, orderMap];\n };\n __decorate$1Z([\n Autowired('rowModel')\n ], ImmutableService.prototype, \"rowModel\", void 0);\n __decorate$1Z([\n PostConstruct\n ], ImmutableService.prototype, \"postConstruct\", null);\n ImmutableService = __decorate$1Z([\n Bean('immutableService')\n ], ImmutableService);\n return ImmutableService;\n}(BeanStub));\n\nvar ClientSideRowModelModule = {\n moduleName: exports.ModuleNames.ClientSideRowModelModule,\n beans: [FilterStage, SortStage, FlattenStage, SortService, FilterService, ImmutableService],\n rowModels: { clientSide: ClientSideRowModel }\n};\n\nvar __extends$28 = (undefined && undefined.__extends) || (function () {\n var extendStatics = function (d, b) {\n extendStatics = Object.setPrototypeOf ||\n ({ __proto__: [] } instanceof Array && function (d, b) { d.__proto__ = b; }) ||\n function (d, b) { for (var p in b) if (b.hasOwnProperty(p)) d[p] = b[p]; };\n return extendStatics(d, b);\n };\n return function (d, b) {\n extendStatics(d, b);\n function __() { this.constructor = d; }\n d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __());\n };\n})();\nvar __decorate$1_ = (undefined && undefined.__decorate) || function (decorators, target, key, desc) {\n var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d;\n if (typeof Reflect === \"object\" && typeof Reflect.decorate === \"function\") r = Reflect.decorate(decorators, target, key, desc);\n else for (var i = decorators.length - 1; i >= 0; i--) if (d = decorators[i]) r = (c < 3 ? d(r) : c > 3 ? d(target, key, r) : d(target, key)) || r;\n return c > 3 && r && Object.defineProperty(target, key, r), r;\n};\nvar InfiniteBlock = /** @class */ (function (_super) {\n __extends$28(InfiniteBlock, _super);\n function InfiniteBlock(id, parentCache, params) {\n var _this = _super.call(this, id) || this;\n _this.parentCache = parentCache;\n _this.params = params;\n // we don't need to calculate these now, as the inputs don't change,\n // however it makes the code easier to read if we work them out up front\n _this.startRow = id * params.blockSize;\n _this.endRow = _this.startRow + params.blockSize;\n return _this;\n }\n InfiniteBlock.prototype.postConstruct = function () {\n this.createRowNodes();\n };\n InfiniteBlock.prototype.getBlockStateJson = function () {\n return {\n id: '' + this.getId(),\n state: {\n blockNumber: this.getId(),\n startRow: this.getStartRow(),\n endRow: this.getEndRow(),\n pageStatus: this.getState()\n }\n };\n };\n InfiniteBlock.prototype.setDataAndId = function (rowNode, data, index) {\n if (_.exists(data)) {\n // this means if the user is not providing id's we just use the\n // index for the row. this will allow selection to work (that is based\n // on index) as long user is not inserting or deleting rows,\n // or wanting to keep selection between server side sorting or filtering\n rowNode.setDataAndId(data, index.toString());\n }\n else {\n rowNode.setDataAndId(undefined, undefined);\n }\n };\n InfiniteBlock.prototype.loadFromDatasource = function () {\n var _this = this;\n var params = this.createLoadParams();\n if (_.missing(this.params.datasource.getRows)) {\n console.warn(\"AG Grid: datasource is missing getRows method\");\n return;\n }\n // put in timeout, to force result to be async\n window.setTimeout(function () {\n _this.params.datasource.getRows(params);\n }, 0);\n };\n InfiniteBlock.prototype.processServerFail = function () {\n // todo - this method has better handling in SSRM\n };\n InfiniteBlock.prototype.createLoadParams = function () {\n // PROBLEM . . . . when the user sets sort via colDef.sort, then this code\n // is executing before the sort is set up, so server is not getting the sort\n // model. need to change with regards order - so the server side request is\n // AFTER thus it gets the right sort model.\n var params = {\n startRow: this.getStartRow(),\n endRow: this.getEndRow(),\n successCallback: this.pageLoaded.bind(this, this.getVersion()),\n failCallback: this.pageLoadFailed.bind(this, this.getVersion()),\n sortModel: this.params.sortModel,\n filterModel: this.params.filterModel,\n context: this.gridOptionsWrapper.getContext()\n };\n return params;\n };\n InfiniteBlock.prototype.forEachNode = function (callback, sequence, rowCount) {\n var _this = this;\n this.rowNodes.forEach(function (rowNode, index) {\n var rowIndex = _this.startRow + index;\n if (rowIndex < rowCount) {\n callback(rowNode, sequence.next());\n }\n });\n };\n InfiniteBlock.prototype.getLastAccessed = function () {\n return this.lastAccessed;\n };\n InfiniteBlock.prototype.getRow = function (rowIndex, dontTouchLastAccessed) {\n if (dontTouchLastAccessed === void 0) { dontTouchLastAccessed = false; }\n if (!dontTouchLastAccessed) {\n this.lastAccessed = this.params.lastAccessedSequence.next();\n }\n var localIndex = rowIndex - this.startRow;\n return this.rowNodes[localIndex];\n };\n InfiniteBlock.prototype.getStartRow = function () {\n return this.startRow;\n };\n InfiniteBlock.prototype.getEndRow = function () {\n return this.endRow;\n };\n // creates empty row nodes, data is missing as not loaded yet\n InfiniteBlock.prototype.createRowNodes = function () {\n this.rowNodes = [];\n for (var i = 0; i < this.params.blockSize; i++) {\n var rowIndex = this.startRow + i;\n var rowNode = this.getContext().createBean(new RowNode());\n rowNode.setRowHeight(this.params.rowHeight);\n rowNode.uiLevel = 0;\n rowNode.setRowIndex(rowIndex);\n rowNode.setRowTop(this.params.rowHeight * rowIndex);\n this.rowNodes.push(rowNode);\n }\n };\n InfiniteBlock.prototype.processServerResult = function (params) {\n var _this = this;\n var rowNodesToRefresh = [];\n this.rowNodes.forEach(function (rowNode, index) {\n var data = params.rowData ? params.rowData[index] : undefined;\n if (rowNode.stub) {\n rowNodesToRefresh.push(rowNode);\n }\n _this.setDataAndId(rowNode, data, _this.startRow + index);\n });\n if (rowNodesToRefresh.length > 0) {\n this.rowRenderer.redrawRows(rowNodesToRefresh);\n }\n var finalRowCount = params.rowCount != null && params.rowCount >= 0 ? params.rowCount : undefined;\n this.parentCache.pageLoaded(this, finalRowCount);\n };\n InfiniteBlock.prototype.destroyRowNodes = function () {\n this.rowNodes.forEach(function (rowNode) {\n // this is needed, so row render knows to fade out the row, otherwise it\n // sees row top is present, and thinks the row should be shown.\n rowNode.clearRowTopAndRowIndex();\n });\n };\n __decorate$1_([\n Autowired('rowRenderer')\n ], InfiniteBlock.prototype, \"rowRenderer\", void 0);\n __decorate$1_([\n PostConstruct\n ], InfiniteBlock.prototype, \"postConstruct\", null);\n __decorate$1_([\n PreDestroy\n ], InfiniteBlock.prototype, \"destroyRowNodes\", null);\n return InfiniteBlock;\n}(RowNodeBlock));\n\nvar __extends$29 = (undefined && undefined.__extends) || (function () {\n var extendStatics = function (d, b) {\n extendStatics = Object.setPrototypeOf ||\n ({ __proto__: [] } instanceof Array && function (d, b) { d.__proto__ = b; }) ||\n function (d, b) { for (var p in b) if (b.hasOwnProperty(p)) d[p] = b[p]; };\n return extendStatics(d, b);\n };\n return function (d, b) {\n extendStatics(d, b);\n function __() { this.constructor = d; }\n d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __());\n };\n})();\nvar __decorate$1$ = (undefined && undefined.__decorate) || function (decorators, target, key, desc) {\n var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d;\n if (typeof Reflect === \"object\" && typeof Reflect.decorate === \"function\") r = Reflect.decorate(decorators, target, key, desc);\n else for (var i = decorators.length - 1; i >= 0; i--) if (d = decorators[i]) r = (c < 3 ? d(r) : c > 3 ? d(target, key, r) : d(target, key)) || r;\n return c > 3 && r && Object.defineProperty(target, key, r), r;\n};\nvar __param$a = (undefined && undefined.__param) || function (paramIndex, decorator) {\n return function (target, key) { decorator(target, key, paramIndex); }\n};\nvar InfiniteCache = /** @class */ (function (_super) {\n __extends$29(InfiniteCache, _super);\n function InfiniteCache(params) {\n var _this = _super.call(this) || this;\n _this.lastRowIndexKnown = false;\n _this.blocks = {};\n _this.blockCount = 0;\n _this.rowCount = params.initialRowCount;\n _this.params = params;\n return _this;\n }\n InfiniteCache.prototype.setBeans = function (loggerFactory) {\n this.logger = loggerFactory.create('InfiniteCache');\n };\n // the rowRenderer will not pass dontCreatePage, meaning when rendering the grid,\n // it will want new pages in the cache as it asks for rows. only when we are inserting /\n // removing rows via the api is dontCreatePage set, where we move rows between the pages.\n InfiniteCache.prototype.getRow = function (rowIndex, dontCreatePage) {\n if (dontCreatePage === void 0) { dontCreatePage = false; }\n var blockId = Math.floor(rowIndex / this.params.blockSize);\n var block = this.blocks[blockId];\n if (!block) {\n if (dontCreatePage) {\n return null;\n }\n block = this.createBlock(blockId);\n }\n return block.getRow(rowIndex);\n };\n InfiniteCache.prototype.createBlock = function (blockNumber) {\n var newBlock = this.createBean(new InfiniteBlock(blockNumber, this, this.params));\n this.blocks[newBlock.getId()] = newBlock;\n this.blockCount++;\n this.purgeBlocksIfNeeded(newBlock);\n this.params.rowNodeBlockLoader.addBlock(newBlock);\n return newBlock;\n };\n // we have this on infinite row model only, not server side row model,\n // because for server side, it would leave the children in inconsistent\n // state - eg if a node had children, but after the refresh it had data\n // for a different row, then the children would be with the wrong row node.\n InfiniteCache.prototype.refreshCache = function () {\n this.getBlocksInOrder().forEach(function (block) { return block.setStateWaitingToLoad(); });\n this.params.rowNodeBlockLoader.checkBlockToLoad();\n };\n InfiniteCache.prototype.destroyAllBlocks = function () {\n var _this = this;\n this.getBlocksInOrder().forEach(function (block) { return _this.destroyBlock(block); });\n };\n InfiniteCache.prototype.getRowCount = function () {\n return this.rowCount;\n };\n InfiniteCache.prototype.isLastRowIndexKnown = function () {\n return this.lastRowIndexKnown;\n };\n // block calls this, when page loaded\n InfiniteCache.prototype.pageLoaded = function (block, lastRow) {\n // if we are not active, then we ignore all events, otherwise we could end up getting the\n // grid to refresh even though we are no longer the active cache\n if (!this.isAlive()) {\n return;\n }\n this.logger.log(\"onPageLoaded: page = \" + block.getId() + \", lastRow = \" + lastRow);\n var rowCountHasChanged = this.checkRowCount(block, lastRow);\n if (rowCountHasChanged || this.params.dynamicRowHeight) {\n this.onCacheUpdated();\n }\n };\n InfiniteCache.prototype.purgeBlocksIfNeeded = function (blockToExclude) {\n var _this = this;\n // we exclude checking for the page just created, as this has yet to be accessed and hence\n // the lastAccessed stamp will not be updated for the first time yet\n var blocksForPurging = this.getBlocksInOrder().filter(function (b) { return b != blockToExclude; });\n var lastAccessedComparator = function (a, b) { return b.getLastAccessed() - a.getLastAccessed(); };\n blocksForPurging.sort(lastAccessedComparator);\n // we remove (maxBlocksInCache - 1) as we already excluded the 'just created' page.\n // in other words, after the splice operation below, we have taken out the blocks\n // we want to keep, which means we are left with blocks that we can potentially purge\n var maxBlocksProvided = this.params.maxBlocksInCache > 0;\n var blocksToKeep = maxBlocksProvided ? this.params.maxBlocksInCache - 1 : null;\n var emptyBlocksToKeep = InfiniteCache.MAX_EMPTY_BLOCKS_TO_KEEP - 1;\n blocksForPurging.forEach(function (block, index) {\n var purgeBecauseBlockEmpty = block.getState() === InfiniteBlock.STATE_WAITING_TO_LOAD && index >= emptyBlocksToKeep;\n var purgeBecauseCacheFull = maxBlocksProvided ? index >= blocksToKeep : false;\n if (purgeBecauseBlockEmpty || purgeBecauseCacheFull) {\n // if the block currently has rows been displayed, then don't remove it either.\n // this can happen if user has maxBlocks=2, and blockSize=5 (thus 10 max rows in cache)\n // but the screen is showing 20 rows, so at least 4 blocks are needed.\n if (_this.isBlockCurrentlyDisplayed(block)) {\n return;\n }\n // don't want to loose keyboard focus, so keyboard navigation can continue. so keep focused blocks.\n if (_this.isBlockFocused(block)) {\n return;\n }\n // at this point, block is not needed, so burn baby burn\n _this.removeBlockFromCache(block);\n }\n });\n };\n InfiniteCache.prototype.isBlockFocused = function (block) {\n var focusedCell = this.focusController.getFocusCellToUseAfterRefresh();\n if (!focusedCell) {\n return false;\n }\n if (focusedCell.rowPinned != null) {\n return false;\n }\n var blockIndexStart = block.getStartRow();\n var blockIndexEnd = block.getEndRow();\n var hasFocus = focusedCell.rowIndex >= blockIndexStart && focusedCell.rowIndex < blockIndexEnd;\n return hasFocus;\n };\n InfiniteCache.prototype.isBlockCurrentlyDisplayed = function (block) {\n var startIndex = block.getStartRow();\n var endIndex = block.getEndRow() - 1;\n return this.rowRenderer.isRangeInRenderedViewport(startIndex, endIndex);\n };\n InfiniteCache.prototype.removeBlockFromCache = function (blockToRemove) {\n if (!blockToRemove) {\n return;\n }\n this.destroyBlock(blockToRemove);\n // we do not want to remove the 'loaded' event listener, as the\n // concurrent loads count needs to be updated when the load is complete\n // if the purged page is in loading state\n };\n InfiniteCache.prototype.checkRowCount = function (block, lastRow) {\n var rowCountBefore = this.rowCount;\n // if client provided a last row, we always use it, as it could change between server calls\n // if user deleted data and then called refresh on the grid.\n if (typeof lastRow === 'number' && lastRow >= 0) {\n this.rowCount = lastRow;\n this.lastRowIndexKnown = true;\n }\n else if (!this.lastRowIndexKnown) {\n // otherwise, see if we need to add some virtual rows\n var lastRowIndex = (block.getId() + 1) * this.params.blockSize;\n var lastRowIndexPlusOverflow = lastRowIndex + this.params.overflowSize;\n if (this.rowCount < lastRowIndexPlusOverflow) {\n this.rowCount = lastRowIndexPlusOverflow;\n }\n }\n var rowCountHasChanged = rowCountBefore != this.rowCount;\n return rowCountHasChanged;\n };\n InfiniteCache.prototype.setRowCount = function (rowCount, lastRowIndexKnown) {\n this.rowCount = rowCount;\n // if undefined is passed, we do not set this value, if one of {true,false}\n // is passed, we do set the value.\n if (_.exists(lastRowIndexKnown)) {\n this.lastRowIndexKnown = lastRowIndexKnown;\n }\n // if we are still searching, then the row count must not end at the end\n // of a particular page, otherwise the searching will not pop into the\n // next page\n if (!this.lastRowIndexKnown) {\n if (this.rowCount % this.params.blockSize === 0) {\n this.rowCount++;\n }\n }\n this.onCacheUpdated();\n };\n InfiniteCache.prototype.forEachNodeDeep = function (callback) {\n var _this = this;\n var sequence = new NumberSequence();\n this.getBlocksInOrder().forEach(function (block) { return block.forEachNode(callback, sequence, _this.rowCount); });\n };\n InfiniteCache.prototype.getBlocksInOrder = function () {\n // get all page id's as NUMBERS (not strings, as we need to sort as numbers) and in descending order\n var blockComparator = function (a, b) { return a.getId() - b.getId(); };\n var blocks = _.getAllValuesInObject(this.blocks).sort(blockComparator);\n return blocks;\n };\n InfiniteCache.prototype.destroyBlock = function (block) {\n delete this.blocks[block.getId()];\n this.destroyBean(block);\n this.blockCount--;\n this.params.rowNodeBlockLoader.removeBlock(block);\n };\n // gets called 1) row count changed 2) cache purged 3) items inserted\n InfiniteCache.prototype.onCacheUpdated = function () {\n if (this.isAlive()) {\n // if the virtualRowCount is shortened, then it's possible blocks exist that are no longer\n // in the valid range. so we must remove these. this can happen if user explicitly sets\n // the virtual row count, or the datasource returns a result and sets lastRow to something\n // less than virtualRowCount (can happen if user scrolls down, server reduces dataset size).\n this.destroyAllBlocksPastVirtualRowCount();\n // this results in both row models (infinite and server side) firing ModelUpdated,\n // however server side row model also updates the row indexes first\n var event_1 = {\n type: Events.EVENT_STORE_UPDATED\n };\n this.eventService.dispatchEvent(event_1);\n }\n };\n InfiniteCache.prototype.destroyAllBlocksPastVirtualRowCount = function () {\n var _this = this;\n var blocksToDestroy = [];\n this.getBlocksInOrder().forEach(function (block) {\n var startRow = block.getId() * _this.params.blockSize;\n if (startRow >= _this.rowCount) {\n blocksToDestroy.push(block);\n }\n });\n if (blocksToDestroy.length > 0) {\n blocksToDestroy.forEach(function (block) { return _this.destroyBlock(block); });\n }\n };\n InfiniteCache.prototype.purgeCache = function () {\n var _this = this;\n this.getBlocksInOrder().forEach(function (block) { return _this.removeBlockFromCache(block); });\n this.lastRowIndexKnown = false;\n // if zero rows in the cache, we need to get the SSRM to start asking for rows again.\n // otherwise if set to zero rows last time, and we don't update the row count, then after\n // the purge there will still be zero rows, meaning the SSRM won't request any rows.\n // to kick things off, at least one row needs to be asked for.\n if (this.rowCount === 0) {\n this.rowCount = this.params.initialRowCount;\n }\n this.onCacheUpdated();\n };\n InfiniteCache.prototype.getRowNodesInRange = function (firstInRange, lastInRange) {\n var _this = this;\n var result = [];\n var lastBlockId = -1;\n var inActiveRange = false;\n var numberSequence = new NumberSequence();\n // if only one node passed, we start the selection at the top\n if (_.missing(firstInRange)) {\n inActiveRange = true;\n }\n var foundGapInSelection = false;\n this.getBlocksInOrder().forEach(function (block) {\n if (foundGapInSelection) {\n return;\n }\n if (inActiveRange && (lastBlockId + 1 !== block.getId())) {\n foundGapInSelection = true;\n return;\n }\n lastBlockId = block.getId();\n block.forEachNode(function (rowNode) {\n var hitFirstOrLast = rowNode === firstInRange || rowNode === lastInRange;\n if (inActiveRange || hitFirstOrLast) {\n result.push(rowNode);\n }\n if (hitFirstOrLast) {\n inActiveRange = !inActiveRange;\n }\n }, numberSequence, _this.rowCount);\n });\n // inActiveRange will be still true if we never hit the second rowNode\n var invalidRange = foundGapInSelection || inActiveRange;\n return invalidRange ? [] : result;\n };\n // this property says how many empty blocks should be in a cache, eg if scrolls down fast and creates 10\n // blocks all for loading, the grid will only load the last 2 - it will assume the blocks the user quickly\n // scrolled over are not needed to be loaded.\n InfiniteCache.MAX_EMPTY_BLOCKS_TO_KEEP = 2;\n __decorate$1$([\n Autowired('columnApi')\n ], InfiniteCache.prototype, \"columnApi\", void 0);\n __decorate$1$([\n Autowired('gridApi')\n ], InfiniteCache.prototype, \"gridApi\", void 0);\n __decorate$1$([\n Autowired('rowRenderer')\n ], InfiniteCache.prototype, \"rowRenderer\", void 0);\n __decorate$1$([\n Autowired(\"focusController\")\n ], InfiniteCache.prototype, \"focusController\", void 0);\n __decorate$1$([\n __param$a(0, Qualifier('loggerFactory'))\n ], InfiniteCache.prototype, \"setBeans\", null);\n __decorate$1$([\n PreDestroy\n ], InfiniteCache.prototype, \"destroyAllBlocks\", null);\n return InfiniteCache;\n}(BeanStub));\n\nvar __extends$2a = (undefined && undefined.__extends) || (function () {\n var extendStatics = function (d, b) {\n extendStatics = Object.setPrototypeOf ||\n ({ __proto__: [] } instanceof Array && function (d, b) { d.__proto__ = b; }) ||\n function (d, b) { for (var p in b) if (b.hasOwnProperty(p)) d[p] = b[p]; };\n return extendStatics(d, b);\n };\n return function (d, b) {\n extendStatics(d, b);\n function __() { this.constructor = d; }\n d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __());\n };\n})();\nvar __decorate$20 = (undefined && undefined.__decorate) || function (decorators, target, key, desc) {\n var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d;\n if (typeof Reflect === \"object\" && typeof Reflect.decorate === \"function\") r = Reflect.decorate(decorators, target, key, desc);\n else for (var i = decorators.length - 1; i >= 0; i--) if (d = decorators[i]) r = (c < 3 ? d(r) : c > 3 ? d(target, key, r) : d(target, key)) || r;\n return c > 3 && r && Object.defineProperty(target, key, r), r;\n};\nvar InfiniteRowModel = /** @class */ (function (_super) {\n __extends$2a(InfiniteRowModel, _super);\n function InfiniteRowModel() {\n return _super !== null && _super.apply(this, arguments) || this;\n }\n InfiniteRowModel.prototype.getRowBounds = function (index) {\n return {\n rowHeight: this.rowHeight,\n rowTop: this.rowHeight * index\n };\n };\n // we don't implement as lazy row heights is not supported in this row model\n InfiniteRowModel.prototype.ensureRowHeightsValid = function (startPixel, endPixel, startLimitIndex, endLimitIndex) {\n return false;\n };\n InfiniteRowModel.prototype.init = function () {\n var _this = this;\n if (!this.gridOptionsWrapper.isRowModelInfinite()) {\n return;\n }\n this.rowHeight = this.gridOptionsWrapper.getRowHeightAsNumber();\n this.addEventListeners();\n this.addDestroyFunc(function () { return _this.destroyCache(); });\n };\n InfiniteRowModel.prototype.start = function () {\n this.setDatasource(this.gridOptionsWrapper.getDatasource());\n };\n InfiniteRowModel.prototype.destroyDatasource = function () {\n if (this.datasource) {\n this.getContext().destroyBean(this.datasource);\n this.rowRenderer.datasourceChanged();\n this.datasource = null;\n }\n };\n InfiniteRowModel.prototype.addEventListeners = function () {\n this.addManagedListener(this.eventService, Events.EVENT_FILTER_CHANGED, this.onFilterChanged.bind(this));\n this.addManagedListener(this.eventService, Events.EVENT_SORT_CHANGED, this.onSortChanged.bind(this));\n this.addManagedListener(this.eventService, Events.EVENT_NEW_COLUMNS_LOADED, this.onColumnEverything.bind(this));\n this.addManagedListener(this.eventService, Events.EVENT_STORE_UPDATED, this.onCacheUpdated.bind(this));\n };\n InfiniteRowModel.prototype.onFilterChanged = function () {\n this.reset();\n };\n InfiniteRowModel.prototype.onSortChanged = function () {\n this.reset();\n };\n InfiniteRowModel.prototype.onColumnEverything = function () {\n var resetRequired;\n // if cache params, we require reset only if sort model has changed. we don't need to check\n // for filter model, as the filter manager will fire an event when columns change that result\n // in the filter changing.\n if (this.cacheParams) {\n resetRequired = this.isSortModelDifferent();\n }\n else {\n // if no cacheParams, means first time creating the cache, so always create one\n resetRequired = true;\n }\n if (resetRequired) {\n this.reset();\n }\n };\n InfiniteRowModel.prototype.isSortModelDifferent = function () {\n return !_.jsonEquals(this.cacheParams.sortModel, this.sortController.getSortModel());\n };\n InfiniteRowModel.prototype.getType = function () {\n return Constants.ROW_MODEL_TYPE_INFINITE;\n };\n InfiniteRowModel.prototype.setDatasource = function (datasource) {\n this.destroyDatasource();\n this.datasource = datasource;\n // only reset if we have a valid datasource to working with\n if (datasource) {\n this.reset();\n }\n };\n InfiniteRowModel.prototype.isEmpty = function () {\n return !this.infiniteCache;\n };\n InfiniteRowModel.prototype.isRowsToRender = function () {\n return !!this.infiniteCache;\n };\n InfiniteRowModel.prototype.getNodesInRangeForSelection = function (firstInRange, lastInRange) {\n return this.infiniteCache ? this.infiniteCache.getRowNodesInRange(firstInRange, lastInRange) : [];\n };\n InfiniteRowModel.prototype.reset = function () {\n // important to return here, as the user could be setting filter or sort before\n // data-source is set\n if (!this.datasource) {\n return;\n }\n // if user is providing id's, then this means we can keep the selection between datasource hits,\n // as the rows will keep their unique id's even if, for example, server side sorting or filtering\n // is done.\n var userGeneratingIds = _.exists(this.gridOptionsWrapper.getRowNodeIdFunc());\n if (!userGeneratingIds) {\n this.selectionController.reset();\n }\n this.resetCache();\n var event = this.createModelUpdatedEvent();\n this.eventService.dispatchEvent(event);\n };\n InfiniteRowModel.prototype.createModelUpdatedEvent = function () {\n return {\n type: Events.EVENT_MODEL_UPDATED,\n api: this.gridApi,\n columnApi: this.columnApi,\n // not sure if these should all be false - noticed if after implementing,\n // maybe they should be true?\n newPage: false,\n newData: false,\n keepRenderedRows: false,\n animate: false\n };\n };\n InfiniteRowModel.prototype.resetCache = function () {\n // if not first time creating a cache, need to destroy the old one\n this.destroyCache();\n var maxConcurrentRequests = this.gridOptionsWrapper.getMaxConcurrentDatasourceRequests();\n this.cacheParams = {\n // the user provided datasource\n datasource: this.datasource,\n // sort and filter model\n filterModel: this.filterManager.getFilterModel(),\n sortModel: this.sortController.getSortModel(),\n rowNodeBlockLoader: this.rowNodeBlockLoader,\n // properties - this way we take a snapshot of them, so if user changes any, they will be\n // used next time we create a new cache, which is generally after a filter or sort change,\n // or a new datasource is set\n maxConcurrentRequests: this.defaultIfInvalid(maxConcurrentRequests, 2),\n initialRowCount: this.defaultIfInvalid(this.gridOptionsWrapper.getInfiniteInitialRowCount(), 1),\n maxBlocksInCache: this.gridOptionsWrapper.getMaxBlocksInCache(),\n rowHeight: this.gridOptionsWrapper.getRowHeightAsNumber(),\n // if user doesn't provide overflow, we use default overflow of 1, so user can scroll past\n // the current page and request first row of next page\n overflowSize: this.defaultIfInvalid(this.gridOptionsWrapper.getCacheOverflowSize(), 1),\n // page size needs to be 1 or greater. having it at 1 would be silly, as you would be hitting the\n // server for one page at a time. so the default if not specified is 100.\n blockSize: this.defaultIfInvalid(this.gridOptionsWrapper.getCacheBlockSize(), 100),\n // the cache could create this, however it is also used by the pages, so handy to create it\n // here as the settings are also passed to the pages\n lastAccessedSequence: new NumberSequence()\n };\n this.infiniteCache = this.createBean(new InfiniteCache(this.cacheParams));\n };\n InfiniteRowModel.prototype.defaultIfInvalid = function (value, defaultValue) {\n return value > 0 ? value : defaultValue;\n };\n InfiniteRowModel.prototype.destroyCache = function () {\n if (this.infiniteCache) {\n this.infiniteCache = this.destroyBean(this.infiniteCache);\n }\n };\n InfiniteRowModel.prototype.onCacheUpdated = function () {\n var event = this.createModelUpdatedEvent();\n this.eventService.dispatchEvent(event);\n };\n InfiniteRowModel.prototype.getRow = function (rowIndex) {\n return this.infiniteCache ? this.infiniteCache.getRow(rowIndex) : null;\n };\n InfiniteRowModel.prototype.getRowNode = function (id) {\n var result = null;\n this.forEachNode(function (rowNode) {\n if (rowNode.id === id) {\n result = rowNode;\n }\n });\n return result;\n };\n InfiniteRowModel.prototype.forEachNode = function (callback) {\n if (this.infiniteCache) {\n this.infiniteCache.forEachNodeDeep(callback);\n }\n };\n InfiniteRowModel.prototype.getTopLevelRowCount = function () {\n return this.getRowCount();\n };\n InfiniteRowModel.prototype.getTopLevelRowDisplayedIndex = function (topLevelIndex) {\n return topLevelIndex;\n };\n InfiniteRowModel.prototype.getRowIndexAtPixel = function (pixel) {\n if (this.rowHeight !== 0) { // avoid divide by zero error\n var rowIndexForPixel = Math.floor(pixel / this.rowHeight);\n var lastRowIndex = this.getRowCount() - 1;\n if (rowIndexForPixel > lastRowIndex) {\n return lastRowIndex;\n }\n else {\n return rowIndexForPixel;\n }\n }\n else {\n return 0;\n }\n };\n InfiniteRowModel.prototype.getRowCount = function () {\n return this.infiniteCache ? this.infiniteCache.getRowCount() : 0;\n };\n InfiniteRowModel.prototype.isRowPresent = function (rowNode) {\n var foundRowNode = this.getRowNode(rowNode.id);\n return !!foundRowNode;\n };\n InfiniteRowModel.prototype.refreshCache = function () {\n if (this.infiniteCache) {\n this.infiniteCache.refreshCache();\n }\n };\n InfiniteRowModel.prototype.purgeCache = function () {\n if (this.infiniteCache) {\n this.infiniteCache.purgeCache();\n }\n };\n // for iRowModel\n InfiniteRowModel.prototype.isLastRowIndexKnown = function () {\n if (this.infiniteCache) {\n return this.infiniteCache.isLastRowIndexKnown();\n }\n else {\n return false;\n }\n };\n InfiniteRowModel.prototype.setRowCount = function (rowCount, lastRowIndexKnown) {\n if (this.infiniteCache) {\n this.infiniteCache.setRowCount(rowCount, lastRowIndexKnown);\n }\n };\n __decorate$20([\n Autowired('filterManager')\n ], InfiniteRowModel.prototype, \"filterManager\", void 0);\n __decorate$20([\n Autowired('sortController')\n ], InfiniteRowModel.prototype, \"sortController\", void 0);\n __decorate$20([\n Autowired('selectionController')\n ], InfiniteRowModel.prototype, \"selectionController\", void 0);\n __decorate$20([\n Autowired('gridApi')\n ], InfiniteRowModel.prototype, \"gridApi\", void 0);\n __decorate$20([\n Autowired('columnApi')\n ], InfiniteRowModel.prototype, \"columnApi\", void 0);\n __decorate$20([\n Autowired('rowRenderer')\n ], InfiniteRowModel.prototype, \"rowRenderer\", void 0);\n __decorate$20([\n Autowired('rowNodeBlockLoader')\n ], InfiniteRowModel.prototype, \"rowNodeBlockLoader\", void 0);\n __decorate$20([\n PostConstruct\n ], InfiniteRowModel.prototype, \"init\", null);\n __decorate$20([\n PreDestroy\n ], InfiniteRowModel.prototype, \"destroyDatasource\", null);\n InfiniteRowModel = __decorate$20([\n Bean('rowModel')\n ], InfiniteRowModel);\n return InfiniteRowModel;\n}(BeanStub));\n\nvar InfiniteRowModelModule = {\n moduleName: exports.ModuleNames.InfiniteRowModelModule,\n rowModels: { infinite: InfiniteRowModel }\n};\n\nvar BaseCreator = /** @class */ (function () {\n function BaseCreator() {\n }\n BaseCreator.prototype.setBeans = function (beans) {\n this.beans = beans;\n };\n BaseCreator.prototype.export = function (userParams) {\n if (this.isExportSuppressed()) {\n console.warn(\"ag-grid: Export cancelled. Export is not allowed as per your configuration.\");\n return '';\n }\n var _a = this.getMergedParamsAndData(userParams), mergedParams = _a.mergedParams, data = _a.data;\n var fileNamePresent = mergedParams && mergedParams.fileName && mergedParams.fileName.length !== 0;\n var fileName = fileNamePresent ? mergedParams.fileName : this.getDefaultFileName();\n if (fileName.indexOf(\".\") === -1) {\n fileName = fileName + \".\" + this.getDefaultFileExtension();\n }\n this.beans.downloader.download(fileName, this.packageFile(data));\n return data;\n };\n BaseCreator.prototype.getData = function (params) {\n return this.getMergedParamsAndData(params).data;\n };\n BaseCreator.prototype.getMergedParamsAndData = function (userParams) {\n var mergedParams = this.mergeDefaultParams(userParams);\n var data = this.beans.gridSerializer.serialize(this.createSerializingSession(mergedParams), mergedParams);\n return { mergedParams: mergedParams, data: data };\n };\n BaseCreator.prototype.mergeDefaultParams = function (userParams) {\n var baseParams = this.beans.gridOptionsWrapper.getDefaultExportParams();\n var params = {};\n _.assign(params, baseParams);\n _.assign(params, userParams);\n return params;\n };\n BaseCreator.prototype.packageFile = function (data) {\n return new Blob([\"\\ufeff\", data], {\n // @ts-ignore\n type: window.navigator.msSaveOrOpenBlob ? this.getMimeType() : 'octet/stream'\n });\n };\n return BaseCreator;\n}());\n\nvar BaseGridSerializingSession = /** @class */ (function () {\n function BaseGridSerializingSession(config) {\n this.groupColumns = [];\n var columnController = config.columnController, valueService = config.valueService, gridOptionsWrapper = config.gridOptionsWrapper, processCellCallback = config.processCellCallback, processHeaderCallback = config.processHeaderCallback, processGroupHeaderCallback = config.processGroupHeaderCallback, processRowGroupCallback = config.processRowGroupCallback;\n this.columnController = columnController;\n this.valueService = valueService;\n this.gridOptionsWrapper = gridOptionsWrapper;\n this.processCellCallback = processCellCallback;\n this.processHeaderCallback = processHeaderCallback;\n this.processGroupHeaderCallback = processGroupHeaderCallback;\n this.processRowGroupCallback = processRowGroupCallback;\n }\n BaseGridSerializingSession.prototype.prepare = function (columnsToExport) {\n this.groupColumns = _.filter(columnsToExport, function (col) { return !!col.getColDef().showRowGroup; });\n };\n BaseGridSerializingSession.prototype.extractHeaderValue = function (column) {\n var value = this.getHeaderName(this.processHeaderCallback, column);\n return value != null ? value : '';\n };\n BaseGridSerializingSession.prototype.extractRowCellValue = function (column, index, type, node) {\n // we render the group summary text e.g. \"-> Parent -> Child\"...\n var groupIndex = this.gridOptionsWrapper.isGroupMultiAutoColumn() ? node.rowGroupIndex : 0;\n var renderGroupSummaryCell = \n // on group rows\n node && node.group\n && (\n // in the group column if groups appear in regular grid cells\n index === groupIndex && this.groupColumns.indexOf(column) !== -1\n // or the first cell in the row, if we're doing full width rows\n || (index === 0 && this.gridOptionsWrapper.isGroupUseEntireRow(this.columnController.isPivotMode())));\n var valueForCell;\n if (renderGroupSummaryCell) {\n valueForCell = this.createValueForGroupNode(node);\n }\n else {\n valueForCell = this.valueService.getValue(column, node);\n }\n var value = this.processCell(node, column, valueForCell, this.processCellCallback, type);\n return value != null ? value : '';\n };\n BaseGridSerializingSession.prototype.getHeaderName = function (callback, column) {\n if (callback) {\n return callback({\n column: column,\n api: this.gridOptionsWrapper.getApi(),\n columnApi: this.gridOptionsWrapper.getColumnApi(),\n context: this.gridOptionsWrapper.getContext()\n });\n }\n return this.columnController.getDisplayNameForColumn(column, 'csv', true);\n };\n BaseGridSerializingSession.prototype.createValueForGroupNode = function (node) {\n if (this.processRowGroupCallback) {\n return this.processRowGroupCallback({\n node: node,\n api: this.gridOptionsWrapper.getApi(),\n columnApi: this.gridOptionsWrapper.getColumnApi(),\n context: this.gridOptionsWrapper.getContext(),\n });\n }\n var keys = [node.key];\n if (!this.gridOptionsWrapper.isGroupMultiAutoColumn()) {\n while (node.parent) {\n node = node.parent;\n keys.push(node.key);\n }\n }\n return keys.reverse().join(' -> ');\n };\n BaseGridSerializingSession.prototype.processCell = function (rowNode, column, value, processCellCallback, type) {\n if (processCellCallback) {\n return processCellCallback({\n column: column,\n node: rowNode,\n value: value,\n api: this.gridOptionsWrapper.getApi(),\n columnApi: this.gridOptionsWrapper.getColumnApi(),\n context: this.gridOptionsWrapper.getContext(),\n type: type\n });\n }\n return value;\n };\n return BaseGridSerializingSession;\n}());\n\nvar __extends$2b = (undefined && undefined.__extends) || (function () {\n var extendStatics = function (d, b) {\n extendStatics = Object.setPrototypeOf ||\n ({ __proto__: [] } instanceof Array && function (d, b) { d.__proto__ = b; }) ||\n function (d, b) { for (var p in b) if (b.hasOwnProperty(p)) d[p] = b[p]; };\n return extendStatics(d, b);\n };\n return function (d, b) {\n extendStatics(d, b);\n function __() { this.constructor = d; }\n d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __());\n };\n})();\nvar LINE_SEPARATOR = '\\r\\n';\nvar CsvSerializingSession = /** @class */ (function (_super) {\n __extends$2b(CsvSerializingSession, _super);\n function CsvSerializingSession(config) {\n var _this = _super.call(this, config) || this;\n _this.isFirstLine = true;\n _this.result = '';\n var suppressQuotes = config.suppressQuotes, columnSeparator = config.columnSeparator;\n _this.suppressQuotes = suppressQuotes;\n _this.columnSeparator = columnSeparator;\n return _this;\n }\n CsvSerializingSession.prototype.addCustomContent = function (content) {\n var _this = this;\n if (!content) {\n return;\n }\n if (typeof content === 'string') {\n // we used to require the customFooter to be prefixed with a newline but no longer do,\n // so only add the newline if the user has not supplied one\n if (!/^\\s*\\n/.test(content)) {\n this.beginNewLine();\n }\n // replace whatever newlines are supplied with the style we're using\n content = content.replace(/\\r?\\n/g, LINE_SEPARATOR);\n this.result += content;\n }\n else {\n content.forEach(function (row) {\n _this.beginNewLine();\n row.forEach(function (cell, index) {\n if (index !== 0) {\n _this.result += _this.columnSeparator;\n }\n _this.result += _this.putInQuotes(cell.data.value || '');\n if (cell.mergeAcross) {\n _this.appendEmptyCells(cell.mergeAcross);\n }\n });\n });\n }\n };\n CsvSerializingSession.prototype.onNewHeaderGroupingRow = function () {\n this.beginNewLine();\n return {\n onColumn: this.onNewHeaderGroupingRowColumn.bind(this)\n };\n };\n CsvSerializingSession.prototype.onNewHeaderGroupingRowColumn = function (header, index, span) {\n if (index != 0) {\n this.result += this.columnSeparator;\n }\n this.result += this.putInQuotes(header);\n this.appendEmptyCells(span);\n };\n CsvSerializingSession.prototype.appendEmptyCells = function (count) {\n for (var i = 1; i <= count; i++) {\n this.result += this.columnSeparator + this.putInQuotes(\"\");\n }\n };\n CsvSerializingSession.prototype.onNewHeaderRow = function () {\n this.beginNewLine();\n return {\n onColumn: this.onNewHeaderRowColumn.bind(this)\n };\n };\n CsvSerializingSession.prototype.onNewHeaderRowColumn = function (column, index) {\n if (index != 0) {\n this.result += this.columnSeparator;\n }\n this.result += this.putInQuotes(this.extractHeaderValue(column));\n };\n CsvSerializingSession.prototype.onNewBodyRow = function () {\n this.beginNewLine();\n return {\n onColumn: this.onNewBodyRowColumn.bind(this)\n };\n };\n CsvSerializingSession.prototype.onNewBodyRowColumn = function (column, index, node) {\n if (index != 0) {\n this.result += this.columnSeparator;\n }\n this.result += this.putInQuotes(this.extractRowCellValue(column, index, Constants.EXPORT_TYPE_CSV, node));\n };\n CsvSerializingSession.prototype.putInQuotes = function (value) {\n if (this.suppressQuotes) {\n return value;\n }\n if (value === null || value === undefined) {\n return '\"\"';\n }\n var stringValue;\n if (typeof value === 'string') {\n stringValue = value;\n }\n else if (typeof value.toString === 'function') {\n stringValue = value.toString();\n }\n else {\n console.warn('unknown value type during csv conversion');\n stringValue = '';\n }\n // replace each \" with \"\" (ie two sets of double quotes is how to do double quotes in csv)\n var valueEscaped = stringValue.replace(/\"/g, \"\\\"\\\"\");\n return '\"' + valueEscaped + '\"';\n };\n CsvSerializingSession.prototype.parse = function () {\n return this.result;\n };\n CsvSerializingSession.prototype.beginNewLine = function () {\n if (!this.isFirstLine) {\n this.result += LINE_SEPARATOR;\n }\n this.isFirstLine = false;\n };\n return CsvSerializingSession;\n}(BaseGridSerializingSession));\n\nvar __extends$2c = (undefined && undefined.__extends) || (function () {\n var extendStatics = function (d, b) {\n extendStatics = Object.setPrototypeOf ||\n ({ __proto__: [] } instanceof Array && function (d, b) { d.__proto__ = b; }) ||\n function (d, b) { for (var p in b) if (b.hasOwnProperty(p)) d[p] = b[p]; };\n return extendStatics(d, b);\n };\n return function (d, b) {\n extendStatics(d, b);\n function __() { this.constructor = d; }\n d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __());\n };\n})();\nvar __decorate$21 = (undefined && undefined.__decorate) || function (decorators, target, key, desc) {\n var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d;\n if (typeof Reflect === \"object\" && typeof Reflect.decorate === \"function\") r = Reflect.decorate(decorators, target, key, desc);\n else for (var i = decorators.length - 1; i >= 0; i--) if (d = decorators[i]) r = (c < 3 ? d(r) : c > 3 ? d(target, key, r) : d(target, key)) || r;\n return c > 3 && r && Object.defineProperty(target, key, r), r;\n};\nvar CsvCreator = /** @class */ (function (_super) {\n __extends$2c(CsvCreator, _super);\n function CsvCreator() {\n return _super !== null && _super.apply(this, arguments) || this;\n }\n CsvCreator.prototype.postConstruct = function () {\n this.setBeans({\n downloader: this.downloader,\n gridSerializer: this.gridSerializer,\n gridOptionsWrapper: this.gridOptionsWrapper\n });\n };\n CsvCreator.prototype.exportDataAsCsv = function (params) {\n return this.export(params);\n };\n CsvCreator.prototype.getDataAsCsv = function (params) {\n return this.getData(params);\n };\n CsvCreator.prototype.getMimeType = function () {\n return 'text/csv;charset=utf-8;';\n };\n CsvCreator.prototype.getDefaultFileName = function () {\n return 'export.csv';\n };\n CsvCreator.prototype.getDefaultFileExtension = function () {\n return 'csv';\n };\n CsvCreator.prototype.createSerializingSession = function (params) {\n var _a = this, columnController = _a.columnController, valueService = _a.valueService, gridOptionsWrapper = _a.gridOptionsWrapper;\n var _b = params, processCellCallback = _b.processCellCallback, processHeaderCallback = _b.processHeaderCallback, processGroupHeaderCallback = _b.processGroupHeaderCallback, processRowGroupCallback = _b.processRowGroupCallback, suppressQuotes = _b.suppressQuotes, columnSeparator = _b.columnSeparator;\n return new CsvSerializingSession({\n columnController: columnController,\n valueService: valueService,\n gridOptionsWrapper: gridOptionsWrapper,\n processCellCallback: processCellCallback || undefined,\n processHeaderCallback: processHeaderCallback || undefined,\n processGroupHeaderCallback: processGroupHeaderCallback || undefined,\n processRowGroupCallback: processRowGroupCallback || undefined,\n suppressQuotes: suppressQuotes || false,\n columnSeparator: columnSeparator || ','\n });\n };\n CsvCreator.prototype.isExportSuppressed = function () {\n return this.gridOptionsWrapper.isSuppressCsvExport();\n };\n __decorate$21([\n Autowired('columnController')\n ], CsvCreator.prototype, \"columnController\", void 0);\n __decorate$21([\n Autowired('valueService')\n ], CsvCreator.prototype, \"valueService\", void 0);\n __decorate$21([\n Autowired('downloader')\n ], CsvCreator.prototype, \"downloader\", void 0);\n __decorate$21([\n Autowired('gridSerializer')\n ], CsvCreator.prototype, \"gridSerializer\", void 0);\n __decorate$21([\n Autowired('gridOptionsWrapper')\n ], CsvCreator.prototype, \"gridOptionsWrapper\", void 0);\n __decorate$21([\n PostConstruct\n ], CsvCreator.prototype, \"postConstruct\", null);\n CsvCreator = __decorate$21([\n Bean('csvCreator')\n ], CsvCreator);\n return CsvCreator;\n}(BaseCreator));\n\nvar __decorate$22 = (undefined && undefined.__decorate) || function (decorators, target, key, desc) {\n var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d;\n if (typeof Reflect === \"object\" && typeof Reflect.decorate === \"function\") r = Reflect.decorate(decorators, target, key, desc);\n else for (var i = decorators.length - 1; i >= 0; i--) if (d = decorators[i]) r = (c < 3 ? d(r) : c > 3 ? d(target, key, r) : d(target, key)) || r;\n return c > 3 && r && Object.defineProperty(target, key, r), r;\n};\nvar Downloader = /** @class */ (function () {\n function Downloader() {\n }\n Downloader.prototype.download = function (fileName, content) {\n // Internet Explorer\n if (window.navigator.msSaveOrOpenBlob) {\n window.navigator.msSaveOrOpenBlob(content, fileName);\n }\n else {\n // Other Browsers\n var element = document.createElement(\"a\");\n var url_1 = window.URL.createObjectURL(content);\n element.setAttribute(\"href\", url_1);\n element.setAttribute(\"download\", fileName);\n element.style.display = \"none\";\n document.body.appendChild(element);\n element.dispatchEvent(new MouseEvent('click', {\n bubbles: false,\n cancelable: true,\n view: window\n }));\n document.body.removeChild(element);\n window.setTimeout(function () {\n window.URL.revokeObjectURL(url_1);\n }, 0);\n }\n };\n Downloader = __decorate$22([\n Bean(\"downloader\")\n ], Downloader);\n return Downloader;\n}());\n\nvar __extends$2d = (undefined && undefined.__extends) || (function () {\n var extendStatics = function (d, b) {\n extendStatics = Object.setPrototypeOf ||\n ({ __proto__: [] } instanceof Array && function (d, b) { d.__proto__ = b; }) ||\n function (d, b) { for (var p in b) if (b.hasOwnProperty(p)) d[p] = b[p]; };\n return extendStatics(d, b);\n };\n return function (d, b) {\n extendStatics(d, b);\n function __() { this.constructor = d; }\n d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __());\n };\n})();\nvar __decorate$23 = (undefined && undefined.__decorate) || function (decorators, target, key, desc) {\n var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d;\n if (typeof Reflect === \"object\" && typeof Reflect.decorate === \"function\") r = Reflect.decorate(decorators, target, key, desc);\n else for (var i = decorators.length - 1; i >= 0; i--) if (d = decorators[i]) r = (c < 3 ? d(r) : c > 3 ? d(target, key, r) : d(target, key)) || r;\n return c > 3 && r && Object.defineProperty(target, key, r), r;\n};\nvar LINE_SEPARATOR$1 = '\\r\\n';\nvar XmlFactory = /** @class */ (function (_super) {\n __extends$2d(XmlFactory, _super);\n function XmlFactory() {\n return _super !== null && _super.apply(this, arguments) || this;\n }\n XmlFactory.prototype.createHeader = function (headerElement) {\n if (headerElement === void 0) { headerElement = {}; }\n var headerStart = '';\n var keys = ['version'];\n if (!headerElement.version) {\n headerElement.version = \"1.0\";\n }\n if (headerElement.encoding) {\n keys.push('encoding');\n }\n if (headerElement.standalone) {\n keys.push('standalone');\n }\n var att = keys.map(function (key) { return key + \"=\\\"\" + headerElement[key] + \"\\\"\"; }).join(' ');\n return headerStart + \"xml \" + att + \" \" + headerEnd;\n };\n XmlFactory.prototype.createXml = function (xmlElement, booleanTransformer) {\n var _this = this;\n var props = '';\n if (xmlElement.properties) {\n if (xmlElement.properties.prefixedAttributes) {\n xmlElement.properties.prefixedAttributes.forEach(function (prefixedSet) {\n Object.keys(prefixedSet.map).forEach(function (key) {\n props += _this.returnAttributeIfPopulated(prefixedSet.prefix + key, prefixedSet.map[key], booleanTransformer);\n });\n });\n }\n if (xmlElement.properties.rawMap) {\n Object.keys(xmlElement.properties.rawMap).forEach(function (key) {\n props += _this.returnAttributeIfPopulated(key, xmlElement.properties.rawMap[key], booleanTransformer);\n });\n }\n }\n var result = '<' + xmlElement.name + props;\n if (!xmlElement.children && xmlElement.textNode == null) {\n return result + '/>' + LINE_SEPARATOR$1;\n }\n if (xmlElement.textNode != null) {\n return result + '>' + xmlElement.textNode + '' + LINE_SEPARATOR$1;\n }\n result += '>' + LINE_SEPARATOR$1;\n if (xmlElement.children) {\n xmlElement.children.forEach(function (it) {\n result += _this.createXml(it, booleanTransformer);\n });\n }\n return result + '' + LINE_SEPARATOR$1;\n };\n XmlFactory.prototype.returnAttributeIfPopulated = function (key, value, booleanTransformer) {\n if (!value && value !== '' && value !== 0) {\n return '';\n }\n var xmlValue = value;\n if ((typeof (value) === 'boolean')) {\n if (booleanTransformer) {\n xmlValue = booleanTransformer(value);\n }\n }\n return \" \" + key + \"=\\\"\" + xmlValue + \"\\\"\";\n };\n XmlFactory = __decorate$23([\n Bean('xmlFactory')\n ], XmlFactory);\n return XmlFactory;\n}(BeanStub));\n\nvar __extends$2e = (undefined && undefined.__extends) || (function () {\n var extendStatics = function (d, b) {\n extendStatics = Object.setPrototypeOf ||\n ({ __proto__: [] } instanceof Array && function (d, b) { d.__proto__ = b; }) ||\n function (d, b) { for (var p in b) if (b.hasOwnProperty(p)) d[p] = b[p]; };\n return extendStatics(d, b);\n };\n return function (d, b) {\n extendStatics(d, b);\n function __() { this.constructor = d; }\n d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __());\n };\n})();\nvar __decorate$24 = (undefined && undefined.__decorate) || function (decorators, target, key, desc) {\n var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d;\n if (typeof Reflect === \"object\" && typeof Reflect.decorate === \"function\") r = Reflect.decorate(decorators, target, key, desc);\n else for (var i = decorators.length - 1; i >= 0; i--) if (d = decorators[i]) r = (c < 3 ? d(r) : c > 3 ? d(target, key, r) : d(target, key)) || r;\n return c > 3 && r && Object.defineProperty(target, key, r), r;\n};\nvar GridSerializer = /** @class */ (function (_super) {\n __extends$2e(GridSerializer, _super);\n function GridSerializer() {\n return _super !== null && _super.apply(this, arguments) || this;\n }\n GridSerializer.prototype.serialize = function (gridSerializingSession, params) {\n if (params === void 0) { params = {}; }\n var rowSkipper = params.shouldRowBeSkipped || (function () { return false; });\n var gridOptionsWrapper = this.gridOptionsWrapper;\n var api = gridOptionsWrapper.getApi();\n var columnApi = gridOptionsWrapper.getColumnApi();\n var skipSingleChildrenGroup = gridOptionsWrapper.isGroupRemoveSingleChildren();\n var skipLowestSingleChildrenGroup = gridOptionsWrapper.isGroupRemoveLowestSingleChildren();\n var hideOpenParents = gridOptionsWrapper.isGroupHideOpenParents();\n var context = gridOptionsWrapper.getContext();\n // when in pivot mode, we always render cols on screen, never 'all columns'\n var isPivotMode = this.columnController.isPivotMode();\n var rowModelNormal = this.rowModel.getType() === Constants.ROW_MODEL_TYPE_CLIENT_SIDE;\n var onlySelectedNonStandardModel = !rowModelNormal && params.onlySelected;\n var columnsToExport = [];\n if (_.existsAndNotEmpty(params.columnKeys)) {\n columnsToExport = this.columnController.getGridColumns(params.columnKeys);\n }\n else if (params.allColumns && !isPivotMode) {\n // add auto group column for tree data\n columnsToExport = gridOptionsWrapper.isTreeData() ?\n this.columnController.getGridColumns([Constants.GROUP_AUTO_COLUMN_ID]) : [];\n columnsToExport = columnsToExport.concat(this.columnController.getAllPrimaryColumns() || []);\n }\n else {\n columnsToExport = this.columnController.getAllDisplayedColumns();\n }\n if (params.customHeader) {\n gridSerializingSession.addCustomContent(params.customHeader);\n }\n gridSerializingSession.prepare(columnsToExport);\n // first pass, put in the header names of the cols\n if (params.columnGroups) {\n var groupInstanceIdCreator = new GroupInstanceIdCreator();\n var displayedGroups = this.displayedGroupCreator.createDisplayedGroups(columnsToExport, this.columnController.getGridBalancedTree(), groupInstanceIdCreator, null);\n this.recursivelyAddHeaderGroups(displayedGroups, gridSerializingSession, params.processGroupHeaderCallback);\n }\n if (!params.skipHeader) {\n var gridRowIterator_1 = gridSerializingSession.onNewHeaderRow();\n columnsToExport.forEach(function (column, index) {\n gridRowIterator_1.onColumn(column, index, undefined);\n });\n }\n this.pinnedRowModel.forEachPinnedTopRow(processRow);\n var rowModel = this.rowModel;\n var clientSideRowModel = this.rowModel;\n if (isPivotMode) {\n // @ts-ignore - ignore tautology below as we are using it to check if it's clientSideRowModel\n if (clientSideRowModel.forEachPivotNode) {\n clientSideRowModel.forEachPivotNode(processRow);\n }\n else {\n // n=must be enterprise, so we can just loop through all the nodes\n rowModel.forEachNode(processRow);\n }\n }\n else {\n // onlySelectedAllPages: user doing pagination and wants selected items from\n // other pages, so cannot use the standard row model as it won't have rows from\n // other pages.\n // onlySelectedNonStandardModel: if user wants selected in non standard row model\n // (eg viewport) then again RowModel cannot be used, so need to use selected instead.\n if (params.onlySelectedAllPages || onlySelectedNonStandardModel) {\n var selectedNodes = this.selectionController.getSelectedNodes();\n selectedNodes.forEach(function (node) {\n processRow(node);\n });\n }\n else {\n // here is everything else - including standard row model and selected. we don't use\n // the selection model even when just using selected, so that the result is the order\n // of the rows appearing on the screen.\n if (rowModelNormal) {\n clientSideRowModel.forEachNodeAfterFilterAndSort(processRow);\n }\n else {\n rowModel.forEachNode(processRow);\n }\n }\n }\n this.pinnedRowModel.forEachPinnedBottomRow(processRow);\n if (params.customFooter) {\n gridSerializingSession.addCustomContent(params.customFooter);\n }\n function processRow(node) {\n var shouldSkipLowestGroup = skipLowestSingleChildrenGroup && node.leafGroup;\n var shouldSkipCurrentGroup = node.allChildrenCount === 1 && (skipSingleChildrenGroup || shouldSkipLowestGroup);\n if (node.group && (params.skipGroups || shouldSkipCurrentGroup || hideOpenParents)) {\n return;\n }\n if (params.skipFooters && node.footer) {\n return;\n }\n if (params.onlySelected && !node.isSelected()) {\n return;\n }\n if (params.skipPinnedTop && node.rowPinned === 'top') {\n return;\n }\n if (params.skipPinnedBottom && node.rowPinned === 'bottom') {\n return;\n }\n // if we are in pivotMode, then the grid will show the root node only\n // if it's not a leaf group\n var nodeIsRootNode = node.level === -1;\n if (nodeIsRootNode && !node.leafGroup) {\n return;\n }\n var shouldRowBeSkipped = rowSkipper({ node: node, api: api, context: context });\n if (shouldRowBeSkipped) {\n return;\n }\n var rowAccumulator = gridSerializingSession.onNewBodyRow();\n columnsToExport.forEach(function (column, index) {\n rowAccumulator.onColumn(column, index, node);\n });\n if (params.getCustomContentBelowRow) {\n var content = params.getCustomContentBelowRow({ node: node, api: api, columnApi: columnApi, context: context });\n if (content) {\n gridSerializingSession.addCustomContent(content);\n }\n }\n }\n return gridSerializingSession.parse();\n };\n GridSerializer.prototype.recursivelyAddHeaderGroups = function (displayedGroups, gridSerializingSession, processGroupHeaderCallback) {\n var directChildrenHeaderGroups = [];\n displayedGroups.forEach(function (columnGroupChild) {\n var columnGroup = columnGroupChild;\n if (!columnGroup.getChildren) {\n return;\n }\n columnGroup.getChildren().forEach(function (it) { return directChildrenHeaderGroups.push(it); });\n });\n if (displayedGroups.length > 0 && displayedGroups[0] instanceof ColumnGroup) {\n this.doAddHeaderHeader(gridSerializingSession, displayedGroups, processGroupHeaderCallback);\n }\n if (directChildrenHeaderGroups && directChildrenHeaderGroups.length > 0) {\n this.recursivelyAddHeaderGroups(directChildrenHeaderGroups, gridSerializingSession, processGroupHeaderCallback);\n }\n };\n GridSerializer.prototype.doAddHeaderHeader = function (gridSerializingSession, displayedGroups, processGroupHeaderCallback) {\n var _this = this;\n var gridRowIterator = gridSerializingSession.onNewHeaderGroupingRow();\n var columnIndex = 0;\n displayedGroups.forEach(function (columnGroupChild) {\n var columnGroup = columnGroupChild;\n var name;\n if (processGroupHeaderCallback) {\n name = processGroupHeaderCallback({\n columnGroup: columnGroup,\n api: _this.gridOptionsWrapper.getApi(),\n columnApi: _this.gridOptionsWrapper.getColumnApi(),\n context: _this.gridOptionsWrapper.getContext()\n });\n }\n else {\n name = _this.columnController.getDisplayNameForColumnGroup(columnGroup, 'header');\n }\n gridRowIterator.onColumn(name || '', columnIndex++, columnGroup.getLeafColumns().length - 1);\n });\n };\n __decorate$24([\n Autowired('displayedGroupCreator')\n ], GridSerializer.prototype, \"displayedGroupCreator\", void 0);\n __decorate$24([\n Autowired('columnController')\n ], GridSerializer.prototype, \"columnController\", void 0);\n __decorate$24([\n Autowired('rowModel')\n ], GridSerializer.prototype, \"rowModel\", void 0);\n __decorate$24([\n Autowired('pinnedRowModel')\n ], GridSerializer.prototype, \"pinnedRowModel\", void 0);\n __decorate$24([\n Autowired('selectionController')\n ], GridSerializer.prototype, \"selectionController\", void 0);\n GridSerializer = __decorate$24([\n Bean(\"gridSerializer\")\n ], GridSerializer);\n return GridSerializer;\n}(BeanStub));\nvar RowType;\n(function (RowType) {\n RowType[RowType[\"HEADER_GROUPING\"] = 0] = \"HEADER_GROUPING\";\n RowType[RowType[\"HEADER\"] = 1] = \"HEADER\";\n RowType[RowType[\"BODY\"] = 2] = \"BODY\";\n})(RowType || (RowType = {}));\n\nvar __extends$2f = (undefined && undefined.__extends) || (function () {\n var extendStatics = function (d, b) {\n extendStatics = Object.setPrototypeOf ||\n ({ __proto__: [] } instanceof Array && function (d, b) { d.__proto__ = b; }) ||\n function (d, b) { for (var p in b) if (b.hasOwnProperty(p)) d[p] = b[p]; };\n return extendStatics(d, b);\n };\n return function (d, b) {\n extendStatics(d, b);\n function __() { this.constructor = d; }\n d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __());\n };\n})();\nvar __decorate$25 = (undefined && undefined.__decorate) || function (decorators, target, key, desc) {\n var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d;\n if (typeof Reflect === \"object\" && typeof Reflect.decorate === \"function\") r = Reflect.decorate(decorators, target, key, desc);\n else for (var i = decorators.length - 1; i >= 0; i--) if (d = decorators[i]) r = (c < 3 ? d(r) : c > 3 ? d(target, key, r) : d(target, key)) || r;\n return c > 3 && r && Object.defineProperty(target, key, r), r;\n};\n// table for crc calculation\n// from: https://referencesource.microsoft.com/#System/sys/System/IO/compression/Crc32Helper.cs,3b31978c7d7f7246,references\nvar crcTable = [\n 0, 1996959894, -301047508, -1727442502, 124634137, 1886057615, -379345611, -1637575261, 249268274,\n 2044508324, -522852066, -1747789432, 162941995, 2125561021, -407360249, -1866523247, 498536548,\n 1789927666, -205950648, -2067906082, 450548861, 1843258603, -187386543, -2083289657, 325883990,\n 1684777152, -43845254, -1973040660, 335633487, 1661365465, -99664541, -1928851979, 997073096,\n 1281953886, -715111964, -1570279054, 1006888145, 1258607687, -770865667, -1526024853, 901097722,\n 1119000684, -608450090, -1396901568, 853044451, 1172266101, -589951537, -1412350631, 651767980,\n 1373503546, -925412992, -1076862698, 565507253, 1454621731, -809855591, -1195530993, 671266974,\n 1594198024, -972236366, -1324619484, 795835527, 1483230225, -1050600021, -1234817731, 1994146192,\n 31158534, -1731059524, -271249366, 1907459465, 112637215, -1614814043, -390540237, 2013776290,\n 251722036, -1777751922, -519137256, 2137656763, 141376813, -1855689577, -429695999, 1802195444,\n 476864866, -2056965928, -228458418, 1812370925, 453092731, -2113342271, -183516073, 1706088902,\n 314042704, -1950435094, -54949764, 1658658271, 366619977, -1932296973, -69972891, 1303535960,\n 984961486, -1547960204, -725929758, 1256170817, 1037604311, -1529756563, -740887301, 1131014506,\n 879679996, -1385723834, -631195440, 1141124467, 855842277, -1442165665, -586318647, 1342533948,\n 654459306, -1106571248, -921952122, 1466479909, 544179635, -1184443383, -832445281, 1591671054,\n 702138776, -1328506846, -942167884, 1504918807, 783551873, -1212326853, -1061524307, -306674912,\n -1698712650, 62317068, 1957810842, -355121351, -1647151185, 81470997, 1943803523, -480048366,\n -1805370492, 225274430, 2053790376, -468791541, -1828061283, 167816743, 2097651377, -267414716,\n -2029476910, 503444072, 1762050814, -144550051, -2140837941, 426522225, 1852507879, -19653770,\n -1982649376, 282753626, 1742555852, -105259153, -1900089351, 397917763, 1622183637, -690576408,\n -1580100738, 953729732, 1340076626, -776247311, -1497606297, 1068828381, 1219638859, -670225446,\n -1358292148, 906185462, 1090812512, -547295293, -1469587627, 829329135, 1181335161, -882789492,\n -1134132454, 628085408, 1382605366, -871598187, -1156888829, 570562233, 1426400815, -977650754,\n -1296233688, 733239954, 1555261956, -1026031705, -1244606671, 752459403, 1541320221, -1687895376,\n -328994266, 1969922972, 40735498, -1677130071, -351390145, 1913087877, 83908371, -1782625662,\n -491226604, 2075208622, 213261112, -1831694693, -438977011, 2094854071, 198958881, -2032938284,\n -237706686, 1759359992, 534414190, -2118248755, -155638181, 1873836001, 414664567, -2012718362,\n -15766928, 1711684554, 285281116, -1889165569, -127750551, 1634467795, 376229701, -1609899400,\n -686959890, 1308918612, 956543938, -1486412191, -799009033, 1231636301, 1047427035, -1362007478,\n -640263460, 1088359270, 936918000, -1447252397, -558129467, 1202900863, 817233897, -1111625188,\n -893730166, 1404277552, 615818150, -1160759803, -841546093, 1423857449, 601450431, -1285129682,\n -1000256840, 1567103746, 711928724, -1274298825, -1022587231, 1510334235, 755167117\n];\nvar ZipContainer = /** @class */ (function (_super) {\n __extends$2f(ZipContainer, _super);\n function ZipContainer() {\n var _this = _super !== null && _super.apply(this, arguments) || this;\n _this.folders = [];\n _this.files = [];\n _this.addFolder = function (path) {\n _this.folders.push({\n path: path,\n created: new Date()\n });\n };\n return _this;\n }\n ZipContainer.prototype.addFolders = function (paths) {\n paths.forEach(this.addFolder);\n };\n ZipContainer.prototype.addFile = function (path, content) {\n this.files.push({\n path: path,\n created: new Date(),\n content: content\n });\n };\n ZipContainer.prototype.clearStream = function () {\n this.folders = [];\n this.files = [];\n };\n ZipContainer.prototype.getContent = function (mimeType) {\n if (mimeType === void 0) { mimeType = 'application/zip'; }\n var textOutput = this.buildFileStream();\n var uInt8Output = this.buildUint8Array(textOutput);\n this.clearStream();\n return new Blob([uInt8Output], { type: mimeType });\n };\n ZipContainer.prototype.buildFileStream = function (fData) {\n if (fData === void 0) { fData = ''; }\n var totalFiles = this.folders.concat(this.files);\n var len = totalFiles.length;\n var foData = '';\n var lL = 0;\n var cL = 0;\n for (var _i = 0, totalFiles_1 = totalFiles; _i < totalFiles_1.length; _i++) {\n var currentFile = totalFiles_1[_i];\n var _a = this.getHeader(currentFile, lL), fileHeader = _a.fileHeader, folderHeader = _a.folderHeader, content = _a.content;\n lL += fileHeader.length + content.length;\n cL += folderHeader.length;\n fData += fileHeader + content;\n foData += folderHeader;\n }\n var foEnd = this.buildFolderEnd(len, cL, lL);\n return fData + foData + foEnd;\n };\n ZipContainer.prototype.getHeader = function (currentFile, offset) {\n var content = currentFile.content, path = currentFile.path, created = currentFile.created;\n var utf8_encode = _.utf8_encode, decToHex = _.decToHex;\n var utfPath = utf8_encode(path);\n var isUTF8 = utfPath !== path;\n var time = this.convertTime(created);\n var dt = this.convertDate(created);\n var extraFields = '';\n if (isUTF8) {\n var uExtraFieldPath = decToHex(1, 1) + decToHex(this.getFromCrc32Table(utfPath), 4) + utfPath;\n extraFields = \"\\x75\\x70\" + decToHex(uExtraFieldPath.length, 2) + uExtraFieldPath;\n }\n var header = '\\x0A\\x00' +\n (isUTF8 ? '\\x00\\x08' : '\\x00\\x00') +\n '\\x00\\x00' +\n decToHex(time, 2) + // last modified time\n decToHex(dt, 2) + // last modified date\n decToHex(content ? this.getFromCrc32Table(content) : 0, 4) +\n decToHex(content ? content.length : 0, 4) + // compressed size\n decToHex(content ? content.length : 0, 4) + // uncompressed size\n decToHex(utfPath.length, 2) + // file name length\n decToHex(extraFields.length, 2); // extra field length\n var fileHeader = 'PK\\x03\\x04' + header + utfPath + extraFields;\n var folderHeader = 'PK\\x01\\x02' + // central header\n '\\x14\\x00' +\n header + // file header\n '\\x00\\x00' +\n '\\x00\\x00' +\n '\\x00\\x00' +\n (content ? '\\x00\\x00\\x00\\x00' : '\\x10\\x00\\x00\\x00') + // external file attributes\n decToHex(offset, 4) + // relative offset of local header\n utfPath + // file name\n extraFields; // extra field\n return { fileHeader: fileHeader, folderHeader: folderHeader, content: content || '' };\n };\n ZipContainer.prototype.buildFolderEnd = function (tLen, cLen, lLen) {\n var decToHex = _.decToHex;\n return 'PK\\x05\\x06' + // central folder end\n '\\x00\\x00' +\n '\\x00\\x00' +\n decToHex(tLen, 2) + // total number of entries in the central folder\n decToHex(tLen, 2) + // total number of entries in the central folder\n decToHex(cLen, 4) + // size of the central folder\n decToHex(lLen, 4) + // central folder start offset\n '\\x00\\x00';\n };\n ZipContainer.prototype.buildUint8Array = function (content) {\n var uint8 = new Uint8Array(content.length);\n for (var i = 0; i < uint8.length; i++) {\n uint8[i] = content.charCodeAt(i);\n }\n return uint8;\n };\n ZipContainer.prototype.getFromCrc32Table = function (content, crc) {\n if (crc === void 0) { crc = 0; }\n if (!content.length) {\n return 0;\n }\n crc ^= (-1);\n var j = 0;\n var k = 0;\n var l = 0;\n for (var i = 0; i < content.length; i++) {\n j = content.charCodeAt(i);\n k = (crc ^ j) & 0xFF;\n l = crcTable[k];\n crc = (crc >>> 8) ^ l;\n }\n return crc ^ (-1);\n };\n ZipContainer.prototype.convertTime = function (date) {\n var time = date.getHours();\n time <<= 6;\n time = time | date.getMinutes();\n time <<= 5;\n time = time | date.getSeconds() / 2;\n return time;\n };\n ZipContainer.prototype.convertDate = function (date) {\n var dt = date.getFullYear() - 1980;\n dt <<= 4;\n dt = dt | (date.getMonth() + 1);\n dt <<= 5;\n dt = dt | date.getDate();\n return dt;\n };\n ZipContainer = __decorate$25([\n Bean('zipContainer')\n ], ZipContainer);\n return ZipContainer;\n}(BeanStub));\n\nvar CsvExportModule = {\n moduleName: exports.ModuleNames.CsvExportModule,\n beans: [CsvCreator, Downloader, XmlFactory, GridSerializer, ZipContainer]\n};\n\nModuleRegistry.register(ClientSideRowModelModule, false);\r\nModuleRegistry.register(InfiniteRowModelModule, false);\r\nModuleRegistry.register(CsvExportModule, false);\n\nexports.AgAbstractField = AgAbstractField;\nexports.AgAngleSelect = AgAngleSelect;\nexports.AgCheckbox = AgCheckbox;\nexports.AgColorPicker = AgColorPicker;\nexports.AgDialog = AgDialog;\nexports.AgGroupComponent = AgGroupComponent;\nexports.AgInputNumberField = AgInputNumberField;\nexports.AgInputRange = AgInputRange;\nexports.AgInputTextArea = AgInputTextArea;\nexports.AgInputTextField = AgInputTextField;\nexports.AgPanel = AgPanel;\nexports.AgPromise = AgPromise;\nexports.AgRadioButton = AgRadioButton;\nexports.AgSelect = AgSelect;\nexports.AgSlider = AgSlider;\nexports.AgToggleButton = AgToggleButton;\nexports.AlignedGridsService = AlignedGridsService;\nexports.AnimateShowChangeCellRenderer = AnimateShowChangeCellRenderer;\nexports.AnimateSlideCellRenderer = AnimateSlideCellRenderer;\nexports.AnimationFrameService = AnimationFrameService;\nexports.AutoWidthCalculator = AutoWidthCalculator;\nexports.Autowired = Autowired;\nexports.BaseComponentWrapper = BaseComponentWrapper;\nexports.Bean = Bean;\nexports.BeanStub = BeanStub;\nexports.BodyDropPivotTarget = BodyDropPivotTarget;\nexports.BodyDropTarget = BodyDropTarget;\nexports.CellComp = CellComp;\nexports.CellNavigationService = CellNavigationService;\nexports.CellPositionUtils = CellPositionUtils;\nexports.ChangedPath = ChangedPath;\nexports.CheckboxSelectionComponent = CheckboxSelectionComponent;\nexports.ColDefUtil = ColDefUtil;\nexports.Color = Color;\nexports.Column = Column;\nexports.ColumnApi = ColumnApi;\nexports.ColumnController = ColumnController;\nexports.ColumnFactory = ColumnFactory;\nexports.ColumnGroup = ColumnGroup;\nexports.ColumnKeyCreator = ColumnKeyCreator;\nexports.ColumnUtils = ColumnUtils;\nexports.Component = Component;\nexports.ComponentUtil = ComponentUtil;\nexports.Constants = Constants;\nexports.Context = Context;\nexports.CssClassApplier = CssClassApplier;\nexports.DateFilter = DateFilter;\nexports.DisplayedGroupCreator = DisplayedGroupCreator;\nexports.DragAndDropService = DragAndDropService;\nexports.DragService = DragService;\nexports.Environment = Environment;\nexports.EventService = EventService;\nexports.Events = Events;\nexports.ExpressionService = ExpressionService;\nexports.FilterManager = FilterManager;\nexports.FloatingFilterMapper = FloatingFilterMapper;\nexports.FloatingFilterWrapper = FloatingFilterWrapper;\nexports.FocusController = FocusController;\nexports.Grid = Grid;\nexports.GridApi = GridApi;\nexports.GridCore = GridCore;\nexports.GridListener = GridListener;\nexports.GridOptionsWrapper = GridOptionsWrapper;\nexports.GridPanel = GridPanel;\nexports.GroupCellRenderer = GroupCellRenderer;\nexports.GroupInstanceIdCreator = GroupInstanceIdCreator;\nexports.GuiListener = GuiListener;\nexports.HeaderContainer = HeaderContainer;\nexports.HeaderNavigationService = HeaderNavigationService;\nexports.HeaderPositionUtils = HeaderPositionUtils;\nexports.HeaderRootComp = HeaderRootComp;\nexports.HeaderRowComp = HeaderRowComp;\nexports.HorizontalResizeService = HorizontalResizeService;\nexports.KeyCode = KeyCode;\nexports.KeyName = KeyName;\nexports.LargeTextCellEditor = LargeTextCellEditor;\nexports.Logger = Logger;\nexports.LoggerFactory = LoggerFactory;\nexports.ManagedFocusComponent = ManagedFocusComponent;\nexports.ModuleRegistry = ModuleRegistry;\nexports.MouseEventService = MouseEventService;\nexports.MoveColumnController = MoveColumnController;\nexports.NumberFilter = NumberFilter;\nexports.NumberSequence = NumberSequence;\nexports.Optional = Optional;\nexports.OriginalColumnGroup = OriginalColumnGroup;\nexports.PaginationProxy = PaginationProxy;\nexports.PinnedRowModel = PinnedRowModel;\nexports.PopupComponent = PopupComponent;\nexports.PopupEditorWrapper = PopupEditorWrapper;\nexports.PopupSelectCellEditor = PopupSelectCellEditor;\nexports.PopupService = PopupService;\nexports.PopupTextCellEditor = PopupTextCellEditor;\nexports.PostConstruct = PostConstruct;\nexports.PreConstruct = PreConstruct;\nexports.PreDestroy = PreDestroy;\nexports.PropertyKeys = PropertyKeys;\nexports.ProvidedFilter = ProvidedFilter;\nexports.Qualifier = Qualifier;\nexports.QuerySelector = QuerySelector;\nexports.RefSelector = RefSelector;\nexports.ResizeObserverService = ResizeObserverService;\nexports.RowComp = RowComp;\nexports.RowNode = RowNode;\nexports.RowNodeBlock = RowNodeBlock;\nexports.RowNodeBlockLoader = RowNodeBlockLoader;\nexports.RowNodeSorter = RowNodeSorter;\nexports.RowPositionUtils = RowPositionUtils;\nexports.RowRenderer = RowRenderer;\nexports.ScalarFilter = ScalarFilter;\nexports.ScrollVisibleService = ScrollVisibleService;\nexports.SelectCellEditor = SelectCellEditor;\nexports.SelectableService = SelectableService;\nexports.SelectionController = SelectionController;\nexports.SetLeftFeature = SetLeftFeature;\nexports.SimpleFilter = SimpleFilter;\nexports.SortController = SortController;\nexports.StandardMenuFactory = StandardMenuFactory;\nexports.StylingService = StylingService;\nexports.TabbedLayout = TabbedLayout;\nexports.TemplateService = TemplateService;\nexports.TextCellEditor = TextCellEditor;\nexports.TextFilter = TextFilter;\nexports.TextFloatingFilter = TextFloatingFilter;\nexports.Timer = Timer;\nexports.TooltipFeature = TooltipFeature;\nexports.TouchListener = TouchListener;\nexports.UserComponentFactory = UserComponentFactory;\nexports.UserComponentRegistry = UserComponentRegistry;\nexports.ValueCache = ValueCache;\nexports.ValueFormatterService = ValueFormatterService;\nexports.ValueService = ValueService;\nexports.VanillaFrameworkOverrides = VanillaFrameworkOverrides;\nexports.VirtualList = VirtualList;\nexports._ = _;\nexports.defaultGroupComparator = defaultGroupComparator;\nexports.initialiseAgGridWithAngular1 = initialiseAgGridWithAngular1;\nexports.initialiseAgGridWithWebComponents = initialiseAgGridWithWebComponents;\nexports.simpleHttpRequest = simpleHttpRequest;\nexports.stringToArray = stringToArray;\n","// ag-grid-react v25.1.0\n\"use strict\";\nvar __extends = (this && this.__extends) || (function () {\n var extendStatics = function (d, b) {\n extendStatics = Object.setPrototypeOf ||\n ({ __proto__: [] } instanceof Array && function (d, b) { d.__proto__ = b; }) ||\n function (d, b) { for (var p in b) if (b.hasOwnProperty(p)) d[p] = b[p]; };\n return extendStatics(d, b);\n };\n return function (d, b) {\n extendStatics(d, b);\n function __() { this.constructor = d; }\n d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __());\n };\n})();\nvar __rest = (this && this.__rest) || function (s, e) {\n var t = {};\n for (var p in s) if (Object.prototype.hasOwnProperty.call(s, p) && e.indexOf(p) < 0)\n t[p] = s[p];\n if (s != null && typeof Object.getOwnPropertySymbols === \"function\")\n for (var i = 0, p = Object.getOwnPropertySymbols(s); i < p.length; i++) {\n if (e.indexOf(p[i]) < 0 && Object.prototype.propertyIsEnumerable.call(s, p[i]))\n t[p[i]] = s[p[i]];\n }\n return t;\n};\nObject.defineProperty(exports, \"__esModule\", { value: true });\nvar React = require(\"react\");\nvar react_1 = require(\"react\");\nvar PropTypes = require(\"prop-types\");\nvar AgGrid = require(\"ag-grid-community\");\nvar AgGridColumn = /** @class */ (function (_super) {\n __extends(AgGridColumn, _super);\n function AgGridColumn(props) {\n var _this = _super.call(this, props) || this;\n _this.props = props;\n return _this;\n }\n AgGridColumn.prototype.render = function () {\n return null;\n };\n AgGridColumn.mapChildColumnDefs = function (children) {\n return React.Children.map(children, function (child) { return !!child ? AgGridColumn.toColDef(child.props) : null; });\n };\n AgGridColumn.toColDef = function (columnProps) {\n var children = columnProps.children, colDef = __rest(columnProps, [\"children\"]);\n if (AgGridColumn.hasChildColumns(children)) {\n colDef.children = AgGridColumn.mapChildColumnDefs(children);\n }\n return colDef;\n };\n AgGridColumn.hasChildColumns = function (children) {\n return React.Children.count(children) > 0;\n };\n return AgGridColumn;\n}(react_1.Component));\nexports.AgGridColumn = AgGridColumn;\naddProperties(AgGrid.ColDefUtil.BOOLEAN_PROPERTIES, PropTypes.bool);\naddProperties(AgGrid.ColDefUtil.STRING_PROPERTIES, PropTypes.string);\naddProperties(AgGrid.ColDefUtil.OBJECT_PROPERTIES, PropTypes.object);\naddProperties(AgGrid.ColDefUtil.ARRAY_PROPERTIES, PropTypes.array);\naddProperties(AgGrid.ColDefUtil.NUMBER_PROPERTIES, PropTypes.number);\naddProperties(AgGrid.ColDefUtil.FUNCTION_PROPERTIES, PropTypes.func);\nfunction addProperties(listOfProps, propType) {\n listOfProps.forEach(function (propKey) {\n AgGridColumn[propKey] = propType;\n });\n}\n","// ag-grid-react v25.1.0\n\"use strict\";\nvar __extends = (this && this.__extends) || (function () {\n var extendStatics = function (d, b) {\n extendStatics = Object.setPrototypeOf ||\n ({ __proto__: [] } instanceof Array && function (d, b) { d.__proto__ = b; }) ||\n function (d, b) { for (var p in b) if (b.hasOwnProperty(p)) d[p] = b[p]; };\n return extendStatics(d, b);\n };\n return function (d, b) {\n extendStatics(d, b);\n function __() { this.constructor = d; }\n d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __());\n };\n})();\nvar __assign = (this && this.__assign) || function () {\n __assign = Object.assign || function(t) {\n for (var s, i = 1, n = arguments.length; i < n; i++) {\n s = arguments[i];\n for (var p in s) if (Object.prototype.hasOwnProperty.call(s, p))\n t[p] = s[p];\n }\n return t;\n };\n return __assign.apply(this, arguments);\n};\nvar __spreadArrays = (this && this.__spreadArrays) || function () {\n for (var s = 0, i = 0, il = arguments.length; i < il; i++) s += arguments[i].length;\n for (var r = Array(s), k = 0, i = 0; i < il; i++)\n for (var a = arguments[i], j = 0, jl = a.length; j < jl; j++, k++)\n r[k] = a[j];\n return r;\n};\nObject.defineProperty(exports, \"__esModule\", { value: true });\nvar React = require(\"react\");\nvar react_1 = require(\"react\");\nvar PropTypes = require(\"prop-types\");\nvar ag_grid_community_1 = require(\"ag-grid-community\");\nvar agGridColumn_1 = require(\"./agGridColumn\");\nvar changeDetectionService_1 = require(\"./changeDetectionService\");\nvar legacyReactComponent_1 = require(\"./legacyReactComponent\");\nvar newReactComponent_1 = require(\"./newReactComponent\");\nvar AgGridReact = /** @class */ (function (_super) {\n __extends(AgGridReact, _super);\n function AgGridReact(props) {\n var _this = _super.call(this, props) || this;\n _this.props = props;\n _this.changeDetectionService = new changeDetectionService_1.ChangeDetectionService();\n _this.api = null;\n _this.portals = [];\n _this.hasPendingPortalUpdate = false;\n _this.destroyed = false;\n _this.SYNCHRONOUS_CHANGE_PROPERTIES = ['context'];\n return _this;\n }\n AgGridReact.prototype.render = function () {\n var _this = this;\n return React.createElement('div', {\n style: this.createStyleForDiv(),\n className: this.props.className,\n ref: function (e) {\n _this.eGridDiv = e;\n }\n }, this.portals);\n };\n AgGridReact.prototype.createStyleForDiv = function () {\n return __assign({ height: '100%' }, (this.props.containerStyle || {}));\n };\n AgGridReact.prototype.componentDidMount = function () {\n var modules = this.props.modules || [];\n var gridParams = {\n providedBeanInstances: {\n agGridReact: this,\n frameworkComponentWrapper: new ReactFrameworkComponentWrapper(this)\n },\n modules: modules\n };\n var gridOptions = this.props.gridOptions || {};\n var children = this.props.children;\n if (agGridColumn_1.AgGridColumn.hasChildColumns(children)) {\n gridOptions.columnDefs = agGridColumn_1.AgGridColumn.mapChildColumnDefs(children);\n }\n this.gridOptions = ag_grid_community_1.ComponentUtil.copyAttributesToGridOptions(gridOptions, this.props);\n // don't need the return value\n new ag_grid_community_1.Grid(this.eGridDiv, this.gridOptions, gridParams);\n this.api = this.gridOptions.api;\n this.columnApi = this.gridOptions.columnApi;\n };\n AgGridReact.prototype.waitForInstance = function (reactComponent, resolve, startTime) {\n var _this = this;\n if (startTime === void 0) { startTime = Date.now(); }\n // if the grid has been destroyed in the meantime just resolve\n if (this.destroyed) {\n resolve(null);\n return;\n }\n if (reactComponent.rendered()) {\n resolve(reactComponent);\n }\n else {\n if (Date.now() - startTime >= this.props.maxComponentCreationTimeMs && !this.hasPendingPortalUpdate) {\n // last check - we check if this is a null value being rendered - we do this last as using SSR to check the value\n // can mess up contexts\n if (reactComponent.isNullValue()) {\n resolve(reactComponent);\n return;\n }\n console.error(\"AG Grid: React Component '\" + reactComponent.getReactComponentName() + \"' not created within \" + AgGridReact.MAX_COMPONENT_CREATION_TIME_IN_MS + \"ms\");\n return;\n }\n window.setTimeout(function () {\n _this.waitForInstance(reactComponent, resolve, startTime);\n });\n }\n };\n /**\n * Mounts a react portal for components registered under the componentFramework.\n * We do this because we want all portals to be in the same tree - in order to get\n * Context to work properly.\n */\n AgGridReact.prototype.mountReactPortal = function (portal, reactComponent, resolve) {\n this.portals = __spreadArrays(this.portals, [portal]);\n this.waitForInstance(reactComponent, resolve);\n this.batchUpdate();\n };\n AgGridReact.prototype.updateReactPortal = function (oldPortal, newPortal) {\n this.portals[this.portals.indexOf(oldPortal)] = newPortal;\n this.batchUpdate();\n };\n AgGridReact.prototype.batchUpdate = function () {\n var _this = this;\n if (this.hasPendingPortalUpdate) {\n return;\n }\n setTimeout(function () {\n if (_this.api) { // destroyed?\n _this.forceUpdate(function () {\n _this.hasPendingPortalUpdate = false;\n });\n }\n });\n this.hasPendingPortalUpdate = true;\n };\n AgGridReact.prototype.destroyPortal = function (portal) {\n this.portals = this.portals.filter(function (curPortal) { return curPortal !== portal; });\n this.batchUpdate();\n };\n AgGridReact.prototype.getStrategyTypeForProp = function (propKey) {\n if (propKey === 'rowData') {\n if (this.props.rowDataChangeDetectionStrategy) {\n return this.props.rowDataChangeDetectionStrategy;\n }\n else if (this.isImmutableDataActive()) {\n return changeDetectionService_1.ChangeDetectionStrategyType.IdentityCheck;\n }\n }\n // all other cases will default to DeepValueCheck\n return changeDetectionService_1.ChangeDetectionStrategyType.DeepValueCheck;\n };\n AgGridReact.prototype.isImmutableDataActive = function () {\n return (this.props.deltaRowDataMode || this.props.immutableData) ||\n (this.props.gridOptions && (this.props.gridOptions.deltaRowDataMode || this.props.gridOptions.immutableData));\n };\n AgGridReact.prototype.shouldComponentUpdate = function (nextProps) {\n this.processPropsChanges(this.props, nextProps);\n // we want full control of the dom, as AG Grid doesn't use React internally,\n // so for performance reasons we tell React we don't need render called after\n // property changes.\n return false;\n };\n AgGridReact.prototype.componentDidUpdate = function (prevProps) {\n this.processPropsChanges(prevProps, this.props);\n };\n AgGridReact.prototype.processPropsChanges = function (prevProps, nextProps) {\n var changes = {};\n this.extractGridPropertyChanges(prevProps, nextProps, changes);\n this.extractDeclarativeColDefChanges(nextProps, changes);\n this.processSynchronousChanges(changes);\n this.processAsynchronousChanges(changes);\n };\n AgGridReact.prototype.extractDeclarativeColDefChanges = function (nextProps, changes) {\n // if columnDefs are provided on gridOptions we use those - you can't combine both\n // we also skip if columnDefs are provided as a prop directly on AgGridReact\n if ((this.props.gridOptions && this.props.gridOptions.columnDefs) || this.props.columnDefs) {\n return;\n }\n var debugLogging = !!nextProps.debug;\n var propKey = 'columnDefs';\n var currentColDefs = this.gridOptions.columnDefs;\n if (agGridColumn_1.AgGridColumn.hasChildColumns(nextProps.children)) {\n var detectionStrategy = this.changeDetectionService.getStrategy(this.getStrategyTypeForProp(propKey));\n var newColDefs = agGridColumn_1.AgGridColumn.mapChildColumnDefs(nextProps.children);\n if (!detectionStrategy.areEqual(currentColDefs, newColDefs)) {\n if (debugLogging) {\n console.log(\"agGridReact: colDefs definitions changed\");\n }\n changes[propKey] =\n {\n previousValue: currentColDefs,\n currentValue: newColDefs\n };\n }\n }\n else if (currentColDefs && currentColDefs.length > 0) {\n changes[propKey] =\n {\n previousValue: currentColDefs,\n currentValue: []\n };\n }\n };\n AgGridReact.prototype.extractGridPropertyChanges = function (prevProps, nextProps, changes) {\n var _this = this;\n var debugLogging = !!nextProps.debug;\n Object.keys(nextProps).forEach(function (propKey) {\n if (ag_grid_community_1._.includes(ag_grid_community_1.ComponentUtil.ALL_PROPERTIES, propKey)) {\n var changeDetectionStrategy = _this.changeDetectionService.getStrategy(_this.getStrategyTypeForProp(propKey));\n if (!changeDetectionStrategy.areEqual(prevProps[propKey], nextProps[propKey])) {\n if (debugLogging) {\n console.log(\"agGridReact: [\" + propKey + \"] property changed\");\n }\n changes[propKey] = {\n previousValue: prevProps[propKey],\n currentValue: nextProps[propKey]\n };\n }\n }\n });\n ag_grid_community_1.ComponentUtil.getEventCallbacks().forEach(function (funcName) {\n if (_this.props[funcName] !== nextProps[funcName]) {\n if (debugLogging) {\n console.log(\"agGridReact: [\" + funcName + \"] event callback changed\");\n }\n changes[funcName] = {\n previousValue: prevProps[funcName],\n currentValue: nextProps[funcName]\n };\n }\n });\n };\n AgGridReact.prototype.componentWillUnmount = function () {\n if (this.api) {\n this.api.destroy();\n this.api = null;\n }\n this.destroyed = true;\n };\n AgGridReact.prototype.isDisableStaticMarkup = function () {\n return this.props.disableStaticMarkup;\n };\n AgGridReact.prototype.isLegacyComponentRendering = function () {\n return this.props.legacyComponentRendering;\n };\n AgGridReact.prototype.processSynchronousChanges = function (changes) {\n var asyncChanges = __assign({}, changes);\n if (Object.keys(asyncChanges).length > 0) {\n var synchronousChanges_1 = {};\n this.SYNCHRONOUS_CHANGE_PROPERTIES.forEach(function (synchronousChangeProperty) {\n if (asyncChanges[synchronousChangeProperty]) {\n synchronousChanges_1[synchronousChangeProperty] = asyncChanges[synchronousChangeProperty];\n delete asyncChanges.context;\n }\n });\n if (Object.keys(synchronousChanges_1).length > 0 && !!this.api) {\n ag_grid_community_1.ComponentUtil.processOnChange({ context: asyncChanges.context }, this.gridOptions, this.api, this.columnApi);\n }\n }\n return asyncChanges;\n };\n AgGridReact.prototype.processAsynchronousChanges = function (changes) {\n var _this = this;\n if (Object.keys(changes).length > 0) {\n window.setTimeout(function () {\n // destroyed?\n if (_this.api) {\n ag_grid_community_1.ComponentUtil.processOnChange(changes, _this.gridOptions, _this.api, _this.columnApi);\n }\n });\n }\n };\n AgGridReact.MAX_COMPONENT_CREATION_TIME_IN_MS = 1000; // a second should be more than enough to instantiate a component\n AgGridReact.defaultProps = {\n legacyComponentRendering: false,\n disableStaticMarkup: false,\n maxComponentCreationTimeMs: AgGridReact.MAX_COMPONENT_CREATION_TIME_IN_MS\n };\n return AgGridReact;\n}(react_1.Component));\nexports.AgGridReact = AgGridReact;\nAgGridReact.propTypes = {\n gridOptions: PropTypes.object\n};\naddProperties(ag_grid_community_1.ComponentUtil.getEventCallbacks(), PropTypes.func);\naddProperties(ag_grid_community_1.ComponentUtil.BOOLEAN_PROPERTIES, PropTypes.bool);\naddProperties(ag_grid_community_1.ComponentUtil.STRING_PROPERTIES, PropTypes.string);\naddProperties(ag_grid_community_1.ComponentUtil.OBJECT_PROPERTIES, PropTypes.object);\naddProperties(ag_grid_community_1.ComponentUtil.ARRAY_PROPERTIES, PropTypes.array);\naddProperties(ag_grid_community_1.ComponentUtil.NUMBER_PROPERTIES, PropTypes.number);\naddProperties(ag_grid_community_1.ComponentUtil.FUNCTION_PROPERTIES, PropTypes.func);\nfunction addProperties(listOfProps, propType) {\n listOfProps.forEach(function (propKey) {\n AgGridReact[propKey] = propType;\n });\n}\nvar ReactFrameworkComponentWrapper = /** @class */ (function (_super) {\n __extends(ReactFrameworkComponentWrapper, _super);\n function ReactFrameworkComponentWrapper(agGridReact) {\n var _this = _super.call(this) || this;\n _this.agGridReact = agGridReact;\n return _this;\n }\n ReactFrameworkComponentWrapper.prototype.createWrapper = function (UserReactComponent, componentType) {\n return this.agGridReact.isLegacyComponentRendering() ?\n new legacyReactComponent_1.LegacyReactComponent(UserReactComponent, this.agGridReact, componentType) :\n new newReactComponent_1.NewReactComponent(UserReactComponent, this.agGridReact, componentType);\n };\n return ReactFrameworkComponentWrapper;\n}(ag_grid_community_1.BaseComponentWrapper));\n","// ag-grid-react v25.1.0\n\"use strict\";\nObject.defineProperty(exports, \"__esModule\", { value: true });\nvar ChangeDetectionStrategyType;\n(function (ChangeDetectionStrategyType) {\n ChangeDetectionStrategyType[\"IdentityCheck\"] = \"IdentityCheck\";\n ChangeDetectionStrategyType[\"DeepValueCheck\"] = \"DeepValueCheck\";\n ChangeDetectionStrategyType[\"NoCheck\"] = \"NoCheck\";\n})(ChangeDetectionStrategyType = exports.ChangeDetectionStrategyType || (exports.ChangeDetectionStrategyType = {}));\nvar ChangeDetectionService = /** @class */ (function () {\n function ChangeDetectionService() {\n var _a;\n this.strategyMap = (_a = {},\n _a[ChangeDetectionStrategyType.DeepValueCheck] = new DeepValueStrategy(),\n _a[ChangeDetectionStrategyType.IdentityCheck] = new SimpleFunctionalStrategy(function (a, b) { return a === b; }),\n _a[ChangeDetectionStrategyType.NoCheck] = new SimpleFunctionalStrategy(function (a, b) { return false; }),\n _a);\n }\n ChangeDetectionService.prototype.getStrategy = function (changeDetectionStrategy) {\n return this.strategyMap[changeDetectionStrategy];\n };\n return ChangeDetectionService;\n}());\nexports.ChangeDetectionService = ChangeDetectionService;\nvar SimpleFunctionalStrategy = /** @class */ (function () {\n function SimpleFunctionalStrategy(strategy) {\n this.strategy = strategy;\n }\n SimpleFunctionalStrategy.prototype.areEqual = function (a, b) {\n return this.strategy(a, b);\n };\n return SimpleFunctionalStrategy;\n}());\nvar DeepValueStrategy = /** @class */ (function () {\n function DeepValueStrategy() {\n }\n DeepValueStrategy.prototype.areEqual = function (a, b) {\n return DeepValueStrategy.areEquivalent(DeepValueStrategy.copy(a), DeepValueStrategy.copy(b));\n };\n /*\n * deeper object comparison - taken from https://stackoverflow.com/questions/1068834/object-comparison-in-javascript\n */\n DeepValueStrategy.unwrapStringOrNumber = function (obj) {\n return obj instanceof Number || obj instanceof String ? obj.valueOf() : obj;\n };\n // sigh, here for ie compatibility\n DeepValueStrategy.copy = function (value) {\n if (!value) {\n return value;\n }\n if (Array.isArray(value)) {\n // shallow copy the array - this will typically be either rowData or columnDefs\n var arrayCopy = [];\n for (var i = 0; i < value.length; i++) {\n arrayCopy.push(this.copy(value[i]));\n }\n return arrayCopy;\n }\n // for anything without keys (boolean, string etc).\n // Object.keys - chrome will swallow them, IE will fail (correctly, imho)\n if (typeof value !== \"object\") {\n return value;\n }\n return [{}, value].reduce(function (r, o) {\n Object.keys(o).forEach(function (k) {\n r[k] = o[k];\n });\n return r;\n }, {});\n };\n DeepValueStrategy.isNaN = function (value) {\n if (Number.isNaN) {\n return Number.isNaN(value);\n }\n // for ie11...\n return typeof (value) === 'number' && isNaN(value);\n };\n /*\n * slightly modified, but taken from https://stackoverflow.com/questions/1068834/object-comparison-in-javascript\n *\n * What we're trying to do here is determine if the property being checked has changed in _value_, not just in reference\n *\n * For eg, if a user updates the columnDefs via property binding, but the actual columns defs are the same before and\n * after, then we don't want the grid to re-render\n */\n DeepValueStrategy.areEquivalent = function (a, b) {\n a = DeepValueStrategy.unwrapStringOrNumber(a);\n b = DeepValueStrategy.unwrapStringOrNumber(b);\n if (a === b)\n return true; //e.g. a and b both null\n if (a === null || b === null || typeof a !== typeof b)\n return false;\n if (DeepValueStrategy.isNaN(a) && DeepValueStrategy.isNaN(b)) {\n return true;\n }\n if (a instanceof Date) {\n return b instanceof Date && a.valueOf() === b.valueOf();\n }\n if (typeof a === \"function\") {\n return a.toString() === b.toString();\n }\n if (typeof a !== \"object\" ||\n (a.$$typeof && a.$$typeof.toString() === \"Symbol(react.element)\")) {\n return a == b; //for boolean, number, string, function, xml\n }\n if (Object.isFrozen(a) || Object.isFrozen(b)) {\n return a === b;\n }\n var newA = a.areEquivPropertyTracking === undefined, newB = b.areEquivPropertyTracking === undefined;\n try {\n var prop = void 0;\n if (newA) {\n a.areEquivPropertyTracking = [];\n }\n else if (a.areEquivPropertyTracking.some(function (other) {\n return other === b;\n }))\n return true;\n if (newB) {\n b.areEquivPropertyTracking = [];\n }\n else if (b.areEquivPropertyTracking.some(function (other) { return other === a; })) {\n return true;\n }\n a.areEquivPropertyTracking.push(b);\n b.areEquivPropertyTracking.push(a);\n var tmp = {};\n for (prop in a)\n if (prop != \"areEquivPropertyTracking\") {\n tmp[prop] = null;\n }\n for (prop in b)\n if (prop != \"areEquivPropertyTracking\") {\n tmp[prop] = null;\n }\n for (prop in tmp) {\n if (!this.areEquivalent(a[prop], b[prop])) {\n return false;\n }\n }\n return true;\n }\n finally {\n if (newA)\n delete a.areEquivPropertyTracking;\n if (newB)\n delete b.areEquivPropertyTracking;\n }\n };\n return DeepValueStrategy;\n}());\n","// ag-grid-react v25.1.0\n\"use strict\";\nObject.defineProperty(exports, \"__esModule\", { value: true });\nvar counter = 0;\nfunction generateNewKey() {\n return \"agPortalKey_\" + ++counter;\n}\nexports.default = generateNewKey;\n","// ag-grid-react v25.1.0\n\"use strict\";\nvar __extends = (this && this.__extends) || (function () {\n var extendStatics = function (d, b) {\n extendStatics = Object.setPrototypeOf ||\n ({ __proto__: [] } instanceof Array && function (d, b) { d.__proto__ = b; }) ||\n function (d, b) { for (var p in b) if (b.hasOwnProperty(p)) d[p] = b[p]; };\n return extendStatics(d, b);\n };\n return function (d, b) {\n extendStatics(d, b);\n function __() { this.constructor = d; }\n d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __());\n };\n})();\nObject.defineProperty(exports, \"__esModule\", { value: true });\nvar react_1 = require(\"react\");\nvar react_dom_1 = require(\"react-dom\");\nvar ag_grid_community_1 = require(\"ag-grid-community\");\nvar reactComponent_1 = require(\"./reactComponent\");\nvar keyGenerator_1 = require(\"./keyGenerator\");\nvar server_1 = require(\"react-dom/server\");\nvar LegacyReactComponent = /** @class */ (function (_super) {\n __extends(LegacyReactComponent, _super);\n function LegacyReactComponent() {\n var _this = _super !== null && _super.apply(this, arguments) || this;\n _this.staticMarkup = null;\n _this.staticRenderTime = 0;\n return _this;\n }\n LegacyReactComponent.prototype.init = function (params) {\n var _this = this;\n this.eParentElement = this.createParentElement(params);\n this.renderStaticMarkup(params);\n return new ag_grid_community_1.AgPromise(function (resolve) { return _this.createReactComponent(params, resolve); });\n };\n LegacyReactComponent.prototype.createReactComponent = function (params, resolve) {\n var _this = this;\n // regular components (ie not functional)\n if (!this.isStatelessComponent()) {\n // grab hold of the actual instance created\n params.ref = function (element) {\n _this.componentInstance = element;\n _this.addParentContainerStyleAndClasses();\n _this.removeStaticMarkup();\n };\n }\n var reactComponent = react_1.createElement(this.reactComponent, params);\n var portal = react_dom_1.createPortal(reactComponent, this.eParentElement, keyGenerator_1.default() // fixed deltaRowModeRefreshCompRenderer\n );\n this.portal = portal;\n this.parentComponent.mountReactPortal(portal, this, function (value) {\n resolve(value);\n // functional/stateless components have a slightly different lifecycle (no refs) so we'll clean them up\n // here\n if (_this.isStatelessComponent()) {\n if (_this.isSlowRenderer()) {\n _this.removeStaticMarkup();\n }\n setTimeout(function () {\n _this.removeStaticMarkup();\n });\n }\n });\n };\n LegacyReactComponent.prototype.fallbackMethodAvailable = function (name) {\n return false;\n };\n LegacyReactComponent.prototype.fallbackMethod = function (name, params) { };\n LegacyReactComponent.prototype.isSlowRenderer = function () {\n return this.staticRenderTime >= LegacyReactComponent.SLOW_RENDERERING_THRESHOLD;\n };\n LegacyReactComponent.prototype.isNullValue = function () {\n return this.staticMarkup === '';\n };\n /*\n * Attempt to render the component as static markup if possible\n * What this does is eliminate any visible flicker for the user in the scenario where a component is destroyed and\n * recreated with exactly the same data (ie with force refresh)\n * Note: Some use cases will throw an error (ie when using Context) so if an error occurs just ignore it any move on\n */\n LegacyReactComponent.prototype.renderStaticMarkup = function (params) {\n if (this.parentComponent.isDisableStaticMarkup() || (this.componentType.isCellRenderer && !this.componentType.isCellRenderer())) {\n return;\n }\n var originalConsoleError = console.error;\n var reactComponent = react_1.createElement(this.reactComponent, params);\n try {\n // if a user is doing anything that uses useLayoutEffect (like material ui) then it will throw and we\n // can't do anything to stop it; this is just a warning and has no effect on anything so just suppress it\n // for this single operation\n console.error = function () {\n };\n var start = Date.now();\n var staticMarkup = server_1.renderToStaticMarkup(reactComponent);\n this.staticRenderTime = Date.now() - start;\n console.error = originalConsoleError;\n // if the render method returns null the result will be an empty string\n if (staticMarkup === '') {\n this.staticMarkup = staticMarkup;\n }\n else {\n if (staticMarkup) {\n // we wrap the content as if there is \"trailing\" text etc it's not easy to safely remove\n // the same is true for memoized renderers, renderers that that return simple strings or NaN etc\n this.staticMarkup = document.createElement('span');\n this.staticMarkup.innerHTML = staticMarkup;\n this.eParentElement.appendChild(this.staticMarkup);\n }\n }\n }\n catch (e) {\n // we tried - this can happen with certain (rare) edge cases\n }\n finally {\n console.error = originalConsoleError;\n }\n };\n LegacyReactComponent.prototype.removeStaticMarkup = function () {\n if (this.parentComponent.isDisableStaticMarkup() || !this.componentType.isCellRenderer()) {\n return;\n }\n if (this.staticMarkup) {\n if (this.staticMarkup.remove) {\n // everyone else in the world\n this.staticMarkup.remove();\n this.staticMarkup = null;\n }\n else if (this.eParentElement.removeChild) {\n // ie11...\n this.eParentElement.removeChild(this.staticMarkup);\n this.staticMarkup = null;\n }\n }\n };\n LegacyReactComponent.prototype.rendered = function () {\n return this.isNullValue() ||\n !!this.staticMarkup || (this.isStatelessComponent() && this.statelessComponentRendered()) ||\n !!(!this.isStatelessComponent() && this.getFrameworkComponentInstance());\n };\n LegacyReactComponent.SLOW_RENDERERING_THRESHOLD = 3;\n return LegacyReactComponent;\n}(reactComponent_1.ReactComponent));\nexports.LegacyReactComponent = LegacyReactComponent;\n","// ag-grid-react v25.1.0\n\"use strict\";\nvar __extends = (this && this.__extends) || (function () {\n var extendStatics = function (d, b) {\n extendStatics = Object.setPrototypeOf ||\n ({ __proto__: [] } instanceof Array && function (d, b) { d.__proto__ = b; }) ||\n function (d, b) { for (var p in b) if (b.hasOwnProperty(p)) d[p] = b[p]; };\n return extendStatics(d, b);\n };\n return function (d, b) {\n extendStatics(d, b);\n function __() { this.constructor = d; }\n d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __());\n };\n})();\nvar __assign = (this && this.__assign) || function () {\n __assign = Object.assign || function(t) {\n for (var s, i = 1, n = arguments.length; i < n; i++) {\n s = arguments[i];\n for (var p in s) if (Object.prototype.hasOwnProperty.call(s, p))\n t[p] = s[p];\n }\n return t;\n };\n return __assign.apply(this, arguments);\n};\nObject.defineProperty(exports, \"__esModule\", { value: true });\nvar react_1 = require(\"react\");\nvar react_dom_1 = require(\"react-dom\");\nvar ag_grid_community_1 = require(\"ag-grid-community\");\nvar reactComponent_1 = require(\"./reactComponent\");\nvar keyGenerator_1 = require(\"./keyGenerator\");\nvar server_1 = require(\"react-dom/server\");\nvar NewReactComponent = /** @class */ (function (_super) {\n __extends(NewReactComponent, _super);\n function NewReactComponent(reactComponent, parentComponent, componentType) {\n var _this = _super.call(this, reactComponent, parentComponent, componentType) || this;\n _this.oldPortal = null;\n _this.key = keyGenerator_1.default();\n _this.portalKey = keyGenerator_1.default();\n return _this;\n }\n NewReactComponent.prototype.init = function (params) {\n var _this = this;\n this.eParentElement = this.createParentElement(params);\n this.params = params;\n this.createOrUpdatePortal(params);\n return new ag_grid_community_1.AgPromise(function (resolve) { return _this.createReactComponent(resolve); });\n };\n NewReactComponent.prototype.createOrUpdatePortal = function (params) {\n var _this = this;\n if (!this.isStatelessComponent()) {\n // grab hold of the actual instance created\n params.ref = function (element) {\n _this.componentInstance = element;\n _this.addParentContainerStyleAndClasses();\n };\n }\n this.reactElement = react_1.createElement(this.reactComponent, __assign(__assign({}, params), { key: this.key }));\n this.portal = react_dom_1.createPortal(this.reactElement, this.eParentElement, this.portalKey // fixed deltaRowModeRefreshCompRenderer\n );\n };\n NewReactComponent.prototype.createReactComponent = function (resolve) {\n this.parentComponent.mountReactPortal(this.portal, this, function (value) {\n resolve(value);\n });\n };\n NewReactComponent.prototype.isNullValue = function () {\n return this.valueRenderedIsNull(this.params);\n };\n NewReactComponent.prototype.rendered = function () {\n return (this.isStatelessComponent() && this.statelessComponentRendered()) ||\n !!(!this.isStatelessComponent() && this.getFrameworkComponentInstance());\n };\n NewReactComponent.prototype.valueRenderedIsNull = function (params) {\n // we only do this for cellRenderers\n if (this.componentType.isCellRenderer && !this.componentType.isCellRenderer()) {\n return false;\n }\n // we've no way of knowing if a component returns null without rendering it first\n // so we render it to markup and check the output - if it'll be null we know and won't timeout\n // waiting for a component that will never be created\n var originalConsoleError = console.error;\n try {\n // if a user is doing anything that uses useLayoutEffect (like material ui) then it will throw and we\n // can't do anything to stop it; this is just a warning and has no effect on anything so just suppress it\n // for this single operation\n console.error = function () {\n };\n var staticMarkup = server_1.renderToStaticMarkup(react_1.createElement(this.reactComponent, params));\n return staticMarkup === '';\n }\n catch (ignore) {\n }\n finally {\n console.error = originalConsoleError;\n }\n return false;\n };\n /*\n * fallback methods - these will be invoked if a corresponding instance method is not present\n * for example if refresh is called and is not available on the component instance, then refreshComponent on this\n * class will be invoked instead\n *\n * Currently only refresh is supported\n */\n NewReactComponent.prototype.refreshComponent = function (args) {\n this.oldPortal = this.portal;\n this.createOrUpdatePortal(args);\n this.parentComponent.updateReactPortal(this.oldPortal, this.portal);\n };\n NewReactComponent.prototype.fallbackMethod = function (name, params) {\n var method = this[name + \"Component\"];\n if (!!method) {\n return method.bind(this)(params);\n }\n };\n NewReactComponent.prototype.fallbackMethodAvailable = function (name) {\n var method = this[name + \"Component\"];\n return !!method;\n };\n return NewReactComponent;\n}(reactComponent_1.ReactComponent));\nexports.NewReactComponent = NewReactComponent;\n","// ag-grid-react v25.1.0\n\"use strict\";\nvar __extends = (this && this.__extends) || (function () {\n var extendStatics = function (d, b) {\n extendStatics = Object.setPrototypeOf ||\n ({ __proto__: [] } instanceof Array && function (d, b) { d.__proto__ = b; }) ||\n function (d, b) { for (var p in b) if (b.hasOwnProperty(p)) d[p] = b[p]; };\n return extendStatics(d, b);\n };\n return function (d, b) {\n extendStatics(d, b);\n function __() { this.constructor = d; }\n d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __());\n };\n})();\nObject.defineProperty(exports, \"__esModule\", { value: true });\nvar ag_grid_community_1 = require(\"ag-grid-community\");\nvar utils_1 = require(\"./utils\");\nvar BaseReactComponent = /** @class */ (function () {\n function BaseReactComponent() {\n }\n return BaseReactComponent;\n}());\nvar ReactComponent = /** @class */ (function (_super) {\n __extends(ReactComponent, _super);\n function ReactComponent(reactComponent, parentComponent, componentType) {\n var _this = _super.call(this) || this;\n _this.portal = null;\n _this.reactComponent = reactComponent;\n _this.parentComponent = parentComponent;\n _this.componentType = componentType;\n _this.statelessComponent = _this.isStateless(_this.reactComponent);\n return _this;\n }\n ReactComponent.prototype.getGui = function () {\n return this.eParentElement;\n };\n ReactComponent.prototype.destroy = function () {\n return this.parentComponent.destroyPortal(this.portal);\n };\n ReactComponent.prototype.createParentElement = function (params) {\n var eParentElement = document.createElement(this.parentComponent.props.componentWrappingElement || 'div');\n ag_grid_community_1._.addCssClass(eParentElement, 'ag-react-container');\n // DEPRECATED - use componentInstance.getReactContainerStyle or componentInstance.getReactContainerClasses instead\n // so user can have access to the react container, to add css class or style\n params.reactContainer = eParentElement;\n return eParentElement;\n };\n ReactComponent.prototype.addParentContainerStyleAndClasses = function () {\n var _this = this;\n if (!this.componentInstance) {\n return;\n }\n if (this.componentInstance.getReactContainerStyle && this.componentInstance.getReactContainerStyle()) {\n utils_1.assignProperties(this.eParentElement.style, this.componentInstance.getReactContainerStyle());\n }\n if (this.componentInstance.getReactContainerClasses && this.componentInstance.getReactContainerClasses()) {\n var parentContainerClasses = this.componentInstance.getReactContainerClasses();\n parentContainerClasses.forEach(function (className) { return ag_grid_community_1._.addCssClass(_this.eParentElement, className); });\n }\n };\n ReactComponent.prototype.statelessComponentRendered = function () {\n // fixed fragmentsFuncRendererCreateDestroy funcRendererWithNan (changeDetectionService too for NaN)\n return this.eParentElement.childElementCount > 0 || this.eParentElement.childNodes.length > 0;\n };\n ReactComponent.prototype.getFrameworkComponentInstance = function () {\n return this.componentInstance;\n };\n ReactComponent.prototype.isStatelessComponent = function () {\n return this.statelessComponent;\n };\n ReactComponent.prototype.getReactComponentName = function () {\n return this.reactComponent.name;\n };\n ReactComponent.prototype.getMemoType = function () {\n return this.hasSymbol() ? Symbol.for('react.memo') : 0xead3;\n };\n ReactComponent.prototype.hasSymbol = function () {\n return typeof Symbol === 'function' && Symbol.for;\n };\n ReactComponent.prototype.isStateless = function (Component) {\n return (typeof Component === 'function' && !(Component.prototype && Component.prototype.isReactComponent))\n || (typeof Component === 'object' && Component.$$typeof === this.getMemoType());\n };\n ReactComponent.prototype.hasMethod = function (name) {\n var frameworkComponentInstance = this.getFrameworkComponentInstance();\n return (!!frameworkComponentInstance && frameworkComponentInstance[name] !== null) ||\n this.fallbackMethodAvailable(name);\n };\n ReactComponent.prototype.callMethod = function (name, args) {\n var _this = this;\n var frameworkComponentInstance = this.getFrameworkComponentInstance();\n if (this.isStatelessComponent()) {\n return this.fallbackMethod(name, !!args && args[0] ? args[0] : {});\n }\n else if (!(!!frameworkComponentInstance)) {\n // instance not ready yet - wait for it\n setTimeout(function () { return _this.callMethod(name, args); });\n return;\n }\n var method = frameworkComponentInstance[name];\n if (!!method) {\n return method.apply(frameworkComponentInstance, args);\n }\n else if (this.fallbackMethodAvailable(name)) {\n return this.fallbackMethod(name, !!args && args[0] ? args[0] : {});\n }\n };\n ReactComponent.prototype.addMethod = function (name, callback) {\n this[name] = callback;\n };\n return ReactComponent;\n}(BaseReactComponent));\nexports.ReactComponent = ReactComponent;\n","// ag-grid-react v25.1.0\n\"use strict\";\nObject.defineProperty(exports, \"__esModule\", { value: true });\n// effectively Object.assign - here for IE compatibility\nexports.assignProperties = function (to, from) {\n var styleKeys = Object.keys(from);\n styleKeys.forEach(function (key) {\n to[key] = from[key];\n });\n};\n/*\n * http://stackoverflow.com/a/13719799/2393347\n */\nexports.assign = function (obj, prop, value) {\n if (typeof prop === \"string\")\n prop = prop.split(\".\");\n if (prop.length > 1) {\n var e = prop.shift();\n exports.assign(obj[e] = Object.prototype.toString.call(obj[e]) === \"[object Object]\" ? obj[e] : {}, prop, value);\n }\n else\n obj[prop[0]] = value;\n};\n","exports.AgGridReact = require('./lib/agGridReact').AgGridReact;\nexports.AgGridColumn = require('./lib/agGridColumn').AgGridColumn;\nexports.ChangeDetectionStrategyType = require('./lib/changeDetectionService').ChangeDetectionStrategyType;\n","/**\n * Copyright (c) 2013-present, Facebook, Inc.\n *\n * This source code is licensed under the MIT license found in the\n * LICENSE file in the root directory of this source tree.\n */\n\n'use strict';\n\nvar ReactPropTypesSecret = require('./lib/ReactPropTypesSecret');\n\nfunction emptyFunction() {}\nfunction emptyFunctionWithReset() {}\nemptyFunctionWithReset.resetWarningCache = emptyFunction;\n\nmodule.exports = function() {\n function shim(props, propName, componentName, location, propFullName, secret) {\n if (secret === ReactPropTypesSecret) {\n // It is still safe when called from React.\n return;\n }\n var err = new Error(\n 'Calling PropTypes validators directly is not supported by the `prop-types` package. ' +\n 'Use PropTypes.checkPropTypes() to call them. ' +\n 'Read more at http://fb.me/use-check-prop-types'\n );\n err.name = 'Invariant Violation';\n throw err;\n };\n shim.isRequired = shim;\n function getShim() {\n return shim;\n };\n // Important!\n // Keep this list in sync with production version in `./factoryWithTypeCheckers.js`.\n var ReactPropTypes = {\n array: shim,\n bigint: shim,\n bool: shim,\n func: shim,\n number: shim,\n object: shim,\n string: shim,\n symbol: shim,\n\n any: shim,\n arrayOf: getShim,\n element: shim,\n elementType: shim,\n instanceOf: getShim,\n node: shim,\n objectOf: getShim,\n oneOf: getShim,\n oneOfType: getShim,\n shape: getShim,\n exact: getShim,\n\n checkPropTypes: emptyFunctionWithReset,\n resetWarningCache: emptyFunction\n };\n\n ReactPropTypes.PropTypes = ReactPropTypes;\n\n return ReactPropTypes;\n};\n","/**\n * Copyright (c) 2013-present, Facebook, Inc.\n *\n * This source code is licensed under the MIT license found in the\n * LICENSE file in the root directory of this source tree.\n */\n\nif (process.env.NODE_ENV !== 'production') {\n var ReactIs = require('react-is');\n\n // By explicitly using `prop-types` you are opting into new development behavior.\n // http://fb.me/prop-types-in-prod\n var throwOnDirectAccess = true;\n module.exports = require('./factoryWithTypeCheckers')(ReactIs.isElement, throwOnDirectAccess);\n} else {\n // By explicitly using `prop-types` you are opting into new production behavior.\n // http://fb.me/prop-types-in-prod\n module.exports = require('./factoryWithThrowingShims')();\n}\n","/**\n * Copyright (c) 2013-present, Facebook, Inc.\n *\n * This source code is licensed under the MIT license found in the\n * LICENSE file in the root directory of this source tree.\n */\n\n'use strict';\n\nvar ReactPropTypesSecret = 'SECRET_DO_NOT_PASS_THIS_OR_YOU_WILL_BE_FIRED';\n\nmodule.exports = ReactPropTypesSecret;\n","\"use strict\";\n\nexports.__esModule = true;\n\nexports.default = function (file, acceptedFiles) {\n if (file && acceptedFiles) {\n var acceptedFilesArray = Array.isArray(acceptedFiles) ? acceptedFiles : acceptedFiles.split(',');\n var fileName = file.name || '';\n var mimeType = (file.type || '').toLowerCase();\n var baseMimeType = mimeType.replace(/\\/.*$/, '');\n return acceptedFilesArray.some(function (type) {\n var validType = type.trim().toLowerCase();\n\n if (validType.charAt(0) === '.') {\n return fileName.toLowerCase().endsWith(validType);\n } else if (validType.endsWith('/*')) {\n // This is something like a image/* mime type\n return baseMimeType === validType.replace(/\\/.*$/, '');\n }\n\n return mimeType === validType;\n });\n }\n\n return true;\n};","'use strict'\n\nexports.byteLength = byteLength\nexports.toByteArray = toByteArray\nexports.fromByteArray = fromByteArray\n\nvar lookup = []\nvar revLookup = []\nvar Arr = typeof Uint8Array !== 'undefined' ? Uint8Array : Array\n\nvar code = 'ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/'\nfor (var i = 0, len = code.length; i < len; ++i) {\n lookup[i] = code[i]\n revLookup[code.charCodeAt(i)] = i\n}\n\n// Support decoding URL-safe base64 strings, as Node.js does.\n// See: https://en.wikipedia.org/wiki/Base64#URL_applications\nrevLookup['-'.charCodeAt(0)] = 62\nrevLookup['_'.charCodeAt(0)] = 63\n\nfunction getLens (b64) {\n var len = b64.length\n\n if (len % 4 > 0) {\n throw new Error('Invalid string. Length must be a multiple of 4')\n }\n\n // Trim off extra bytes after placeholder bytes are found\n // See: https://github.com/beatgammit/base64-js/issues/42\n var validLen = b64.indexOf('=')\n if (validLen === -1) validLen = len\n\n var placeHoldersLen = validLen === len\n ? 0\n : 4 - (validLen % 4)\n\n return [validLen, placeHoldersLen]\n}\n\n// base64 is 4/3 + up to two characters of the original data\nfunction byteLength (b64) {\n var lens = getLens(b64)\n var validLen = lens[0]\n var placeHoldersLen = lens[1]\n return ((validLen + placeHoldersLen) * 3 / 4) - placeHoldersLen\n}\n\nfunction _byteLength (b64, validLen, placeHoldersLen) {\n return ((validLen + placeHoldersLen) * 3 / 4) - placeHoldersLen\n}\n\nfunction toByteArray (b64) {\n var tmp\n var lens = getLens(b64)\n var validLen = lens[0]\n var placeHoldersLen = lens[1]\n\n var arr = new Arr(_byteLength(b64, validLen, placeHoldersLen))\n\n var curByte = 0\n\n // if there are placeholders, only get up to the last complete 4 chars\n var len = placeHoldersLen > 0\n ? validLen - 4\n : validLen\n\n var i\n for (i = 0; i < len; i += 4) {\n tmp =\n (revLookup[b64.charCodeAt(i)] << 18) |\n (revLookup[b64.charCodeAt(i + 1)] << 12) |\n (revLookup[b64.charCodeAt(i + 2)] << 6) |\n revLookup[b64.charCodeAt(i + 3)]\n arr[curByte++] = (tmp >> 16) & 0xFF\n arr[curByte++] = (tmp >> 8) & 0xFF\n arr[curByte++] = tmp & 0xFF\n }\n\n if (placeHoldersLen === 2) {\n tmp =\n (revLookup[b64.charCodeAt(i)] << 2) |\n (revLookup[b64.charCodeAt(i + 1)] >> 4)\n arr[curByte++] = tmp & 0xFF\n }\n\n if (placeHoldersLen === 1) {\n tmp =\n (revLookup[b64.charCodeAt(i)] << 10) |\n (revLookup[b64.charCodeAt(i + 1)] << 4) |\n (revLookup[b64.charCodeAt(i + 2)] >> 2)\n arr[curByte++] = (tmp >> 8) & 0xFF\n arr[curByte++] = tmp & 0xFF\n }\n\n return arr\n}\n\nfunction tripletToBase64 (num) {\n return lookup[num >> 18 & 0x3F] +\n lookup[num >> 12 & 0x3F] +\n lookup[num >> 6 & 0x3F] +\n lookup[num & 0x3F]\n}\n\nfunction encodeChunk (uint8, start, end) {\n var tmp\n var output = []\n for (var i = start; i < end; i += 3) {\n tmp =\n ((uint8[i] << 16) & 0xFF0000) +\n ((uint8[i + 1] << 8) & 0xFF00) +\n (uint8[i + 2] & 0xFF)\n output.push(tripletToBase64(tmp))\n }\n return output.join('')\n}\n\nfunction fromByteArray (uint8) {\n var tmp\n var len = uint8.length\n var extraBytes = len % 3 // if we have 1 byte left, pad 2 bytes\n var parts = []\n var maxChunkLength = 16383 // must be multiple of 3\n\n // go through the array every three bytes, we'll deal with trailing stuff later\n for (var i = 0, len2 = len - extraBytes; i < len2; i += maxChunkLength) {\n parts.push(encodeChunk(uint8, i, (i + maxChunkLength) > len2 ? len2 : (i + maxChunkLength)))\n }\n\n // pad the end with zeros, but make sure to not forget the extra bytes\n if (extraBytes === 1) {\n tmp = uint8[len - 1]\n parts.push(\n lookup[tmp >> 2] +\n lookup[(tmp << 4) & 0x3F] +\n '=='\n )\n } else if (extraBytes === 2) {\n tmp = (uint8[len - 2] << 8) + uint8[len - 1]\n parts.push(\n lookup[tmp >> 10] +\n lookup[(tmp >> 4) & 0x3F] +\n lookup[(tmp << 2) & 0x3F] +\n '='\n )\n }\n\n return parts.join('')\n}\n","\"use strict\";\nvar __assign = (this && this.__assign) || function () {\n __assign = Object.assign || function(t) {\n for (var s, i = 1, n = arguments.length; i < n; i++) {\n s = arguments[i];\n for (var p in s) if (Object.prototype.hasOwnProperty.call(s, p))\n t[p] = s[p];\n }\n return t;\n };\n return __assign.apply(this, arguments);\n};\nObject.defineProperty(exports, \"__esModule\", { value: true });\nexports.bindAll = void 0;\nvar bind_1 = require(\"./bind\");\nfunction toOptions(value) {\n if (typeof value === 'undefined') {\n return undefined;\n }\n if (typeof value === 'boolean') {\n return {\n capture: value,\n };\n }\n return value;\n}\nfunction getBinding(original, sharedOptions) {\n if (sharedOptions == null) {\n return original;\n }\n var binding = __assign(__assign({}, original), { options: __assign(__assign({}, toOptions(sharedOptions)), toOptions(original.options)) });\n return binding;\n}\nfunction bindAll(target, bindings, sharedOptions) {\n var unbinds = bindings.map(function (original) {\n var binding = getBinding(original, sharedOptions);\n return (0, bind_1.bind)(target, binding);\n });\n return function unbindAll() {\n unbinds.forEach(function (unbind) { return unbind(); });\n };\n}\nexports.bindAll = bindAll;\n","\"use strict\";\nObject.defineProperty(exports, \"__esModule\", { value: true });\nexports.bind = void 0;\nfunction bind(target, _a) {\n var type = _a.type, listener = _a.listener, options = _a.options;\n target.addEventListener(type, listener, options);\n return function unbind() {\n target.removeEventListener(type, listener, options);\n };\n}\nexports.bind = bind;\n","\"use strict\";\nObject.defineProperty(exports, \"__esModule\", { value: true });\nexports.bindAll = exports.bind = void 0;\nvar bind_1 = require(\"./bind\");\nObject.defineProperty(exports, \"bind\", { enumerable: true, get: function () { return bind_1.bind; } });\nvar bind_all_1 = require(\"./bind-all\");\nObject.defineProperty(exports, \"bindAll\", { enumerable: true, get: function () { return bind_all_1.bindAll; } });\n","/*!\n * The buffer module from node.js, for the browser.\n *\n * @author Feross Aboukhadijeh \n * @license MIT\n */\n/* eslint-disable no-proto */\n\n'use strict'\n\nvar base64 = require('base64-js')\nvar ieee754 = require('ieee754')\nvar customInspectSymbol =\n (typeof Symbol === 'function' && typeof Symbol['for'] === 'function') // eslint-disable-line dot-notation\n ? Symbol['for']('nodejs.util.inspect.custom') // eslint-disable-line dot-notation\n : null\n\nexports.Buffer = Buffer\nexports.SlowBuffer = SlowBuffer\nexports.INSPECT_MAX_BYTES = 50\n\nvar K_MAX_LENGTH = 0x7fffffff\nexports.kMaxLength = K_MAX_LENGTH\n\n/**\n * If `Buffer.TYPED_ARRAY_SUPPORT`:\n * === true Use Uint8Array implementation (fastest)\n * === false Print warning and recommend using `buffer` v4.x which has an Object\n * implementation (most compatible, even IE6)\n *\n * Browsers that support typed arrays are IE 10+, Firefox 4+, Chrome 7+, Safari 5.1+,\n * Opera 11.6+, iOS 4.2+.\n *\n * We report that the browser does not support typed arrays if the are not subclassable\n * using __proto__. Firefox 4-29 lacks support for adding new properties to `Uint8Array`\n * (See: https://bugzilla.mozilla.org/show_bug.cgi?id=695438). IE 10 lacks support\n * for __proto__ and has a buggy typed array implementation.\n */\nBuffer.TYPED_ARRAY_SUPPORT = typedArraySupport()\n\nif (!Buffer.TYPED_ARRAY_SUPPORT && typeof console !== 'undefined' &&\n typeof console.error === 'function') {\n console.error(\n 'This browser lacks typed array (Uint8Array) support which is required by ' +\n '`buffer` v5.x. Use `buffer` v4.x if you require old browser support.'\n )\n}\n\nfunction typedArraySupport () {\n // Can typed array instances can be augmented?\n try {\n var arr = new Uint8Array(1)\n var proto = { foo: function () { return 42 } }\n Object.setPrototypeOf(proto, Uint8Array.prototype)\n Object.setPrototypeOf(arr, proto)\n return arr.foo() === 42\n } catch (e) {\n return false\n }\n}\n\nObject.defineProperty(Buffer.prototype, 'parent', {\n enumerable: true,\n get: function () {\n if (!Buffer.isBuffer(this)) return undefined\n return this.buffer\n }\n})\n\nObject.defineProperty(Buffer.prototype, 'offset', {\n enumerable: true,\n get: function () {\n if (!Buffer.isBuffer(this)) return undefined\n return this.byteOffset\n }\n})\n\nfunction createBuffer (length) {\n if (length > K_MAX_LENGTH) {\n throw new RangeError('The value \"' + length + '\" is invalid for option \"size\"')\n }\n // Return an augmented `Uint8Array` instance\n var buf = new Uint8Array(length)\n Object.setPrototypeOf(buf, Buffer.prototype)\n return buf\n}\n\n/**\n * The Buffer constructor returns instances of `Uint8Array` that have their\n * prototype changed to `Buffer.prototype`. Furthermore, `Buffer` is a subclass of\n * `Uint8Array`, so the returned instances will have all the node `Buffer` methods\n * and the `Uint8Array` methods. Square bracket notation works as expected -- it\n * returns a single octet.\n *\n * The `Uint8Array` prototype remains unmodified.\n */\n\nfunction Buffer (arg, encodingOrOffset, length) {\n // Common case.\n if (typeof arg === 'number') {\n if (typeof encodingOrOffset === 'string') {\n throw new TypeError(\n 'The \"string\" argument must be of type string. Received type number'\n )\n }\n return allocUnsafe(arg)\n }\n return from(arg, encodingOrOffset, length)\n}\n\nBuffer.poolSize = 8192 // not used by this implementation\n\nfunction from (value, encodingOrOffset, length) {\n if (typeof value === 'string') {\n return fromString(value, encodingOrOffset)\n }\n\n if (ArrayBuffer.isView(value)) {\n return fromArrayView(value)\n }\n\n if (value == null) {\n throw new TypeError(\n 'The first argument must be one of type string, Buffer, ArrayBuffer, Array, ' +\n 'or Array-like Object. Received type ' + (typeof value)\n )\n }\n\n if (isInstance(value, ArrayBuffer) ||\n (value && isInstance(value.buffer, ArrayBuffer))) {\n return fromArrayBuffer(value, encodingOrOffset, length)\n }\n\n if (typeof SharedArrayBuffer !== 'undefined' &&\n (isInstance(value, SharedArrayBuffer) ||\n (value && isInstance(value.buffer, SharedArrayBuffer)))) {\n return fromArrayBuffer(value, encodingOrOffset, length)\n }\n\n if (typeof value === 'number') {\n throw new TypeError(\n 'The \"value\" argument must not be of type number. Received type number'\n )\n }\n\n var valueOf = value.valueOf && value.valueOf()\n if (valueOf != null && valueOf !== value) {\n return Buffer.from(valueOf, encodingOrOffset, length)\n }\n\n var b = fromObject(value)\n if (b) return b\n\n if (typeof Symbol !== 'undefined' && Symbol.toPrimitive != null &&\n typeof value[Symbol.toPrimitive] === 'function') {\n return Buffer.from(\n value[Symbol.toPrimitive]('string'), encodingOrOffset, length\n )\n }\n\n throw new TypeError(\n 'The first argument must be one of type string, Buffer, ArrayBuffer, Array, ' +\n 'or Array-like Object. Received type ' + (typeof value)\n )\n}\n\n/**\n * Functionally equivalent to Buffer(arg, encoding) but throws a TypeError\n * if value is a number.\n * Buffer.from(str[, encoding])\n * Buffer.from(array)\n * Buffer.from(buffer)\n * Buffer.from(arrayBuffer[, byteOffset[, length]])\n **/\nBuffer.from = function (value, encodingOrOffset, length) {\n return from(value, encodingOrOffset, length)\n}\n\n// Note: Change prototype *after* Buffer.from is defined to workaround Chrome bug:\n// https://github.com/feross/buffer/pull/148\nObject.setPrototypeOf(Buffer.prototype, Uint8Array.prototype)\nObject.setPrototypeOf(Buffer, Uint8Array)\n\nfunction assertSize (size) {\n if (typeof size !== 'number') {\n throw new TypeError('\"size\" argument must be of type number')\n } else if (size < 0) {\n throw new RangeError('The value \"' + size + '\" is invalid for option \"size\"')\n }\n}\n\nfunction alloc (size, fill, encoding) {\n assertSize(size)\n if (size <= 0) {\n return createBuffer(size)\n }\n if (fill !== undefined) {\n // Only pay attention to encoding if it's a string. This\n // prevents accidentally sending in a number that would\n // be interpreted as a start offset.\n return typeof encoding === 'string'\n ? createBuffer(size).fill(fill, encoding)\n : createBuffer(size).fill(fill)\n }\n return createBuffer(size)\n}\n\n/**\n * Creates a new filled Buffer instance.\n * alloc(size[, fill[, encoding]])\n **/\nBuffer.alloc = function (size, fill, encoding) {\n return alloc(size, fill, encoding)\n}\n\nfunction allocUnsafe (size) {\n assertSize(size)\n return createBuffer(size < 0 ? 0 : checked(size) | 0)\n}\n\n/**\n * Equivalent to Buffer(num), by default creates a non-zero-filled Buffer instance.\n * */\nBuffer.allocUnsafe = function (size) {\n return allocUnsafe(size)\n}\n/**\n * Equivalent to SlowBuffer(num), by default creates a non-zero-filled Buffer instance.\n */\nBuffer.allocUnsafeSlow = function (size) {\n return allocUnsafe(size)\n}\n\nfunction fromString (string, encoding) {\n if (typeof encoding !== 'string' || encoding === '') {\n encoding = 'utf8'\n }\n\n if (!Buffer.isEncoding(encoding)) {\n throw new TypeError('Unknown encoding: ' + encoding)\n }\n\n var length = byteLength(string, encoding) | 0\n var buf = createBuffer(length)\n\n var actual = buf.write(string, encoding)\n\n if (actual !== length) {\n // Writing a hex string, for example, that contains invalid characters will\n // cause everything after the first invalid character to be ignored. (e.g.\n // 'abxxcd' will be treated as 'ab')\n buf = buf.slice(0, actual)\n }\n\n return buf\n}\n\nfunction fromArrayLike (array) {\n var length = array.length < 0 ? 0 : checked(array.length) | 0\n var buf = createBuffer(length)\n for (var i = 0; i < length; i += 1) {\n buf[i] = array[i] & 255\n }\n return buf\n}\n\nfunction fromArrayView (arrayView) {\n if (isInstance(arrayView, Uint8Array)) {\n var copy = new Uint8Array(arrayView)\n return fromArrayBuffer(copy.buffer, copy.byteOffset, copy.byteLength)\n }\n return fromArrayLike(arrayView)\n}\n\nfunction fromArrayBuffer (array, byteOffset, length) {\n if (byteOffset < 0 || array.byteLength < byteOffset) {\n throw new RangeError('\"offset\" is outside of buffer bounds')\n }\n\n if (array.byteLength < byteOffset + (length || 0)) {\n throw new RangeError('\"length\" is outside of buffer bounds')\n }\n\n var buf\n if (byteOffset === undefined && length === undefined) {\n buf = new Uint8Array(array)\n } else if (length === undefined) {\n buf = new Uint8Array(array, byteOffset)\n } else {\n buf = new Uint8Array(array, byteOffset, length)\n }\n\n // Return an augmented `Uint8Array` instance\n Object.setPrototypeOf(buf, Buffer.prototype)\n\n return buf\n}\n\nfunction fromObject (obj) {\n if (Buffer.isBuffer(obj)) {\n var len = checked(obj.length) | 0\n var buf = createBuffer(len)\n\n if (buf.length === 0) {\n return buf\n }\n\n obj.copy(buf, 0, 0, len)\n return buf\n }\n\n if (obj.length !== undefined) {\n if (typeof obj.length !== 'number' || numberIsNaN(obj.length)) {\n return createBuffer(0)\n }\n return fromArrayLike(obj)\n }\n\n if (obj.type === 'Buffer' && Array.isArray(obj.data)) {\n return fromArrayLike(obj.data)\n }\n}\n\nfunction checked (length) {\n // Note: cannot use `length < K_MAX_LENGTH` here because that fails when\n // length is NaN (which is otherwise coerced to zero.)\n if (length >= K_MAX_LENGTH) {\n throw new RangeError('Attempt to allocate Buffer larger than maximum ' +\n 'size: 0x' + K_MAX_LENGTH.toString(16) + ' bytes')\n }\n return length | 0\n}\n\nfunction SlowBuffer (length) {\n if (+length != length) { // eslint-disable-line eqeqeq\n length = 0\n }\n return Buffer.alloc(+length)\n}\n\nBuffer.isBuffer = function isBuffer (b) {\n return b != null && b._isBuffer === true &&\n b !== Buffer.prototype // so Buffer.isBuffer(Buffer.prototype) will be false\n}\n\nBuffer.compare = function compare (a, b) {\n if (isInstance(a, Uint8Array)) a = Buffer.from(a, a.offset, a.byteLength)\n if (isInstance(b, Uint8Array)) b = Buffer.from(b, b.offset, b.byteLength)\n if (!Buffer.isBuffer(a) || !Buffer.isBuffer(b)) {\n throw new TypeError(\n 'The \"buf1\", \"buf2\" arguments must be one of type Buffer or Uint8Array'\n )\n }\n\n if (a === b) return 0\n\n var x = a.length\n var y = b.length\n\n for (var i = 0, len = Math.min(x, y); i < len; ++i) {\n if (a[i] !== b[i]) {\n x = a[i]\n y = b[i]\n break\n }\n }\n\n if (x < y) return -1\n if (y < x) return 1\n return 0\n}\n\nBuffer.isEncoding = function isEncoding (encoding) {\n switch (String(encoding).toLowerCase()) {\n case 'hex':\n case 'utf8':\n case 'utf-8':\n case 'ascii':\n case 'latin1':\n case 'binary':\n case 'base64':\n case 'ucs2':\n case 'ucs-2':\n case 'utf16le':\n case 'utf-16le':\n return true\n default:\n return false\n }\n}\n\nBuffer.concat = function concat (list, length) {\n if (!Array.isArray(list)) {\n throw new TypeError('\"list\" argument must be an Array of Buffers')\n }\n\n if (list.length === 0) {\n return Buffer.alloc(0)\n }\n\n var i\n if (length === undefined) {\n length = 0\n for (i = 0; i < list.length; ++i) {\n length += list[i].length\n }\n }\n\n var buffer = Buffer.allocUnsafe(length)\n var pos = 0\n for (i = 0; i < list.length; ++i) {\n var buf = list[i]\n if (isInstance(buf, Uint8Array)) {\n if (pos + buf.length > buffer.length) {\n Buffer.from(buf).copy(buffer, pos)\n } else {\n Uint8Array.prototype.set.call(\n buffer,\n buf,\n pos\n )\n }\n } else if (!Buffer.isBuffer(buf)) {\n throw new TypeError('\"list\" argument must be an Array of Buffers')\n } else {\n buf.copy(buffer, pos)\n }\n pos += buf.length\n }\n return buffer\n}\n\nfunction byteLength (string, encoding) {\n if (Buffer.isBuffer(string)) {\n return string.length\n }\n if (ArrayBuffer.isView(string) || isInstance(string, ArrayBuffer)) {\n return string.byteLength\n }\n if (typeof string !== 'string') {\n throw new TypeError(\n 'The \"string\" argument must be one of type string, Buffer, or ArrayBuffer. ' +\n 'Received type ' + typeof string\n )\n }\n\n var len = string.length\n var mustMatch = (arguments.length > 2 && arguments[2] === true)\n if (!mustMatch && len === 0) return 0\n\n // Use a for loop to avoid recursion\n var loweredCase = false\n for (;;) {\n switch (encoding) {\n case 'ascii':\n case 'latin1':\n case 'binary':\n return len\n case 'utf8':\n case 'utf-8':\n return utf8ToBytes(string).length\n case 'ucs2':\n case 'ucs-2':\n case 'utf16le':\n case 'utf-16le':\n return len * 2\n case 'hex':\n return len >>> 1\n case 'base64':\n return base64ToBytes(string).length\n default:\n if (loweredCase) {\n return mustMatch ? -1 : utf8ToBytes(string).length // assume utf8\n }\n encoding = ('' + encoding).toLowerCase()\n loweredCase = true\n }\n }\n}\nBuffer.byteLength = byteLength\n\nfunction slowToString (encoding, start, end) {\n var loweredCase = false\n\n // No need to verify that \"this.length <= MAX_UINT32\" since it's a read-only\n // property of a typed array.\n\n // This behaves neither like String nor Uint8Array in that we set start/end\n // to their upper/lower bounds if the value passed is out of range.\n // undefined is handled specially as per ECMA-262 6th Edition,\n // Section 13.3.3.7 Runtime Semantics: KeyedBindingInitialization.\n if (start === undefined || start < 0) {\n start = 0\n }\n // Return early if start > this.length. Done here to prevent potential uint32\n // coercion fail below.\n if (start > this.length) {\n return ''\n }\n\n if (end === undefined || end > this.length) {\n end = this.length\n }\n\n if (end <= 0) {\n return ''\n }\n\n // Force coercion to uint32. This will also coerce falsey/NaN values to 0.\n end >>>= 0\n start >>>= 0\n\n if (end <= start) {\n return ''\n }\n\n if (!encoding) encoding = 'utf8'\n\n while (true) {\n switch (encoding) {\n case 'hex':\n return hexSlice(this, start, end)\n\n case 'utf8':\n case 'utf-8':\n return utf8Slice(this, start, end)\n\n case 'ascii':\n return asciiSlice(this, start, end)\n\n case 'latin1':\n case 'binary':\n return latin1Slice(this, start, end)\n\n case 'base64':\n return base64Slice(this, start, end)\n\n case 'ucs2':\n case 'ucs-2':\n case 'utf16le':\n case 'utf-16le':\n return utf16leSlice(this, start, end)\n\n default:\n if (loweredCase) throw new TypeError('Unknown encoding: ' + encoding)\n encoding = (encoding + '').toLowerCase()\n loweredCase = true\n }\n }\n}\n\n// This property is used by `Buffer.isBuffer` (and the `is-buffer` npm package)\n// to detect a Buffer instance. It's not possible to use `instanceof Buffer`\n// reliably in a browserify context because there could be multiple different\n// copies of the 'buffer' package in use. This method works even for Buffer\n// instances that were created from another copy of the `buffer` package.\n// See: https://github.com/feross/buffer/issues/154\nBuffer.prototype._isBuffer = true\n\nfunction swap (b, n, m) {\n var i = b[n]\n b[n] = b[m]\n b[m] = i\n}\n\nBuffer.prototype.swap16 = function swap16 () {\n var len = this.length\n if (len % 2 !== 0) {\n throw new RangeError('Buffer size must be a multiple of 16-bits')\n }\n for (var i = 0; i < len; i += 2) {\n swap(this, i, i + 1)\n }\n return this\n}\n\nBuffer.prototype.swap32 = function swap32 () {\n var len = this.length\n if (len % 4 !== 0) {\n throw new RangeError('Buffer size must be a multiple of 32-bits')\n }\n for (var i = 0; i < len; i += 4) {\n swap(this, i, i + 3)\n swap(this, i + 1, i + 2)\n }\n return this\n}\n\nBuffer.prototype.swap64 = function swap64 () {\n var len = this.length\n if (len % 8 !== 0) {\n throw new RangeError('Buffer size must be a multiple of 64-bits')\n }\n for (var i = 0; i < len; i += 8) {\n swap(this, i, i + 7)\n swap(this, i + 1, i + 6)\n swap(this, i + 2, i + 5)\n swap(this, i + 3, i + 4)\n }\n return this\n}\n\nBuffer.prototype.toString = function toString () {\n var length = this.length\n if (length === 0) return ''\n if (arguments.length === 0) return utf8Slice(this, 0, length)\n return slowToString.apply(this, arguments)\n}\n\nBuffer.prototype.toLocaleString = Buffer.prototype.toString\n\nBuffer.prototype.equals = function equals (b) {\n if (!Buffer.isBuffer(b)) throw new TypeError('Argument must be a Buffer')\n if (this === b) return true\n return Buffer.compare(this, b) === 0\n}\n\nBuffer.prototype.inspect = function inspect () {\n var str = ''\n var max = exports.INSPECT_MAX_BYTES\n str = this.toString('hex', 0, max).replace(/(.{2})/g, '$1 ').trim()\n if (this.length > max) str += ' ... '\n return ''\n}\nif (customInspectSymbol) {\n Buffer.prototype[customInspectSymbol] = Buffer.prototype.inspect\n}\n\nBuffer.prototype.compare = function compare (target, start, end, thisStart, thisEnd) {\n if (isInstance(target, Uint8Array)) {\n target = Buffer.from(target, target.offset, target.byteLength)\n }\n if (!Buffer.isBuffer(target)) {\n throw new TypeError(\n 'The \"target\" argument must be one of type Buffer or Uint8Array. ' +\n 'Received type ' + (typeof target)\n )\n }\n\n if (start === undefined) {\n start = 0\n }\n if (end === undefined) {\n end = target ? target.length : 0\n }\n if (thisStart === undefined) {\n thisStart = 0\n }\n if (thisEnd === undefined) {\n thisEnd = this.length\n }\n\n if (start < 0 || end > target.length || thisStart < 0 || thisEnd > this.length) {\n throw new RangeError('out of range index')\n }\n\n if (thisStart >= thisEnd && start >= end) {\n return 0\n }\n if (thisStart >= thisEnd) {\n return -1\n }\n if (start >= end) {\n return 1\n }\n\n start >>>= 0\n end >>>= 0\n thisStart >>>= 0\n thisEnd >>>= 0\n\n if (this === target) return 0\n\n var x = thisEnd - thisStart\n var y = end - start\n var len = Math.min(x, y)\n\n var thisCopy = this.slice(thisStart, thisEnd)\n var targetCopy = target.slice(start, end)\n\n for (var i = 0; i < len; ++i) {\n if (thisCopy[i] !== targetCopy[i]) {\n x = thisCopy[i]\n y = targetCopy[i]\n break\n }\n }\n\n if (x < y) return -1\n if (y < x) return 1\n return 0\n}\n\n// Finds either the first index of `val` in `buffer` at offset >= `byteOffset`,\n// OR the last index of `val` in `buffer` at offset <= `byteOffset`.\n//\n// Arguments:\n// - buffer - a Buffer to search\n// - val - a string, Buffer, or number\n// - byteOffset - an index into `buffer`; will be clamped to an int32\n// - encoding - an optional encoding, relevant is val is a string\n// - dir - true for indexOf, false for lastIndexOf\nfunction bidirectionalIndexOf (buffer, val, byteOffset, encoding, dir) {\n // Empty buffer means no match\n if (buffer.length === 0) return -1\n\n // Normalize byteOffset\n if (typeof byteOffset === 'string') {\n encoding = byteOffset\n byteOffset = 0\n } else if (byteOffset > 0x7fffffff) {\n byteOffset = 0x7fffffff\n } else if (byteOffset < -0x80000000) {\n byteOffset = -0x80000000\n }\n byteOffset = +byteOffset // Coerce to Number.\n if (numberIsNaN(byteOffset)) {\n // byteOffset: it it's undefined, null, NaN, \"foo\", etc, search whole buffer\n byteOffset = dir ? 0 : (buffer.length - 1)\n }\n\n // Normalize byteOffset: negative offsets start from the end of the buffer\n if (byteOffset < 0) byteOffset = buffer.length + byteOffset\n if (byteOffset >= buffer.length) {\n if (dir) return -1\n else byteOffset = buffer.length - 1\n } else if (byteOffset < 0) {\n if (dir) byteOffset = 0\n else return -1\n }\n\n // Normalize val\n if (typeof val === 'string') {\n val = Buffer.from(val, encoding)\n }\n\n // Finally, search either indexOf (if dir is true) or lastIndexOf\n if (Buffer.isBuffer(val)) {\n // Special case: looking for empty string/buffer always fails\n if (val.length === 0) {\n return -1\n }\n return arrayIndexOf(buffer, val, byteOffset, encoding, dir)\n } else if (typeof val === 'number') {\n val = val & 0xFF // Search for a byte value [0-255]\n if (typeof Uint8Array.prototype.indexOf === 'function') {\n if (dir) {\n return Uint8Array.prototype.indexOf.call(buffer, val, byteOffset)\n } else {\n return Uint8Array.prototype.lastIndexOf.call(buffer, val, byteOffset)\n }\n }\n return arrayIndexOf(buffer, [val], byteOffset, encoding, dir)\n }\n\n throw new TypeError('val must be string, number or Buffer')\n}\n\nfunction arrayIndexOf (arr, val, byteOffset, encoding, dir) {\n var indexSize = 1\n var arrLength = arr.length\n var valLength = val.length\n\n if (encoding !== undefined) {\n encoding = String(encoding).toLowerCase()\n if (encoding === 'ucs2' || encoding === 'ucs-2' ||\n encoding === 'utf16le' || encoding === 'utf-16le') {\n if (arr.length < 2 || val.length < 2) {\n return -1\n }\n indexSize = 2\n arrLength /= 2\n valLength /= 2\n byteOffset /= 2\n }\n }\n\n function read (buf, i) {\n if (indexSize === 1) {\n return buf[i]\n } else {\n return buf.readUInt16BE(i * indexSize)\n }\n }\n\n var i\n if (dir) {\n var foundIndex = -1\n for (i = byteOffset; i < arrLength; i++) {\n if (read(arr, i) === read(val, foundIndex === -1 ? 0 : i - foundIndex)) {\n if (foundIndex === -1) foundIndex = i\n if (i - foundIndex + 1 === valLength) return foundIndex * indexSize\n } else {\n if (foundIndex !== -1) i -= i - foundIndex\n foundIndex = -1\n }\n }\n } else {\n if (byteOffset + valLength > arrLength) byteOffset = arrLength - valLength\n for (i = byteOffset; i >= 0; i--) {\n var found = true\n for (var j = 0; j < valLength; j++) {\n if (read(arr, i + j) !== read(val, j)) {\n found = false\n break\n }\n }\n if (found) return i\n }\n }\n\n return -1\n}\n\nBuffer.prototype.includes = function includes (val, byteOffset, encoding) {\n return this.indexOf(val, byteOffset, encoding) !== -1\n}\n\nBuffer.prototype.indexOf = function indexOf (val, byteOffset, encoding) {\n return bidirectionalIndexOf(this, val, byteOffset, encoding, true)\n}\n\nBuffer.prototype.lastIndexOf = function lastIndexOf (val, byteOffset, encoding) {\n return bidirectionalIndexOf(this, val, byteOffset, encoding, false)\n}\n\nfunction hexWrite (buf, string, offset, length) {\n offset = Number(offset) || 0\n var remaining = buf.length - offset\n if (!length) {\n length = remaining\n } else {\n length = Number(length)\n if (length > remaining) {\n length = remaining\n }\n }\n\n var strLen = string.length\n\n if (length > strLen / 2) {\n length = strLen / 2\n }\n for (var i = 0; i < length; ++i) {\n var parsed = parseInt(string.substr(i * 2, 2), 16)\n if (numberIsNaN(parsed)) return i\n buf[offset + i] = parsed\n }\n return i\n}\n\nfunction utf8Write (buf, string, offset, length) {\n return blitBuffer(utf8ToBytes(string, buf.length - offset), buf, offset, length)\n}\n\nfunction asciiWrite (buf, string, offset, length) {\n return blitBuffer(asciiToBytes(string), buf, offset, length)\n}\n\nfunction base64Write (buf, string, offset, length) {\n return blitBuffer(base64ToBytes(string), buf, offset, length)\n}\n\nfunction ucs2Write (buf, string, offset, length) {\n return blitBuffer(utf16leToBytes(string, buf.length - offset), buf, offset, length)\n}\n\nBuffer.prototype.write = function write (string, offset, length, encoding) {\n // Buffer#write(string)\n if (offset === undefined) {\n encoding = 'utf8'\n length = this.length\n offset = 0\n // Buffer#write(string, encoding)\n } else if (length === undefined && typeof offset === 'string') {\n encoding = offset\n length = this.length\n offset = 0\n // Buffer#write(string, offset[, length][, encoding])\n } else if (isFinite(offset)) {\n offset = offset >>> 0\n if (isFinite(length)) {\n length = length >>> 0\n if (encoding === undefined) encoding = 'utf8'\n } else {\n encoding = length\n length = undefined\n }\n } else {\n throw new Error(\n 'Buffer.write(string, encoding, offset[, length]) is no longer supported'\n )\n }\n\n var remaining = this.length - offset\n if (length === undefined || length > remaining) length = remaining\n\n if ((string.length > 0 && (length < 0 || offset < 0)) || offset > this.length) {\n throw new RangeError('Attempt to write outside buffer bounds')\n }\n\n if (!encoding) encoding = 'utf8'\n\n var loweredCase = false\n for (;;) {\n switch (encoding) {\n case 'hex':\n return hexWrite(this, string, offset, length)\n\n case 'utf8':\n case 'utf-8':\n return utf8Write(this, string, offset, length)\n\n case 'ascii':\n case 'latin1':\n case 'binary':\n return asciiWrite(this, string, offset, length)\n\n case 'base64':\n // Warning: maxLength not taken into account in base64Write\n return base64Write(this, string, offset, length)\n\n case 'ucs2':\n case 'ucs-2':\n case 'utf16le':\n case 'utf-16le':\n return ucs2Write(this, string, offset, length)\n\n default:\n if (loweredCase) throw new TypeError('Unknown encoding: ' + encoding)\n encoding = ('' + encoding).toLowerCase()\n loweredCase = true\n }\n }\n}\n\nBuffer.prototype.toJSON = function toJSON () {\n return {\n type: 'Buffer',\n data: Array.prototype.slice.call(this._arr || this, 0)\n }\n}\n\nfunction base64Slice (buf, start, end) {\n if (start === 0 && end === buf.length) {\n return base64.fromByteArray(buf)\n } else {\n return base64.fromByteArray(buf.slice(start, end))\n }\n}\n\nfunction utf8Slice (buf, start, end) {\n end = Math.min(buf.length, end)\n var res = []\n\n var i = start\n while (i < end) {\n var firstByte = buf[i]\n var codePoint = null\n var bytesPerSequence = (firstByte > 0xEF)\n ? 4\n : (firstByte > 0xDF)\n ? 3\n : (firstByte > 0xBF)\n ? 2\n : 1\n\n if (i + bytesPerSequence <= end) {\n var secondByte, thirdByte, fourthByte, tempCodePoint\n\n switch (bytesPerSequence) {\n case 1:\n if (firstByte < 0x80) {\n codePoint = firstByte\n }\n break\n case 2:\n secondByte = buf[i + 1]\n if ((secondByte & 0xC0) === 0x80) {\n tempCodePoint = (firstByte & 0x1F) << 0x6 | (secondByte & 0x3F)\n if (tempCodePoint > 0x7F) {\n codePoint = tempCodePoint\n }\n }\n break\n case 3:\n secondByte = buf[i + 1]\n thirdByte = buf[i + 2]\n if ((secondByte & 0xC0) === 0x80 && (thirdByte & 0xC0) === 0x80) {\n tempCodePoint = (firstByte & 0xF) << 0xC | (secondByte & 0x3F) << 0x6 | (thirdByte & 0x3F)\n if (tempCodePoint > 0x7FF && (tempCodePoint < 0xD800 || tempCodePoint > 0xDFFF)) {\n codePoint = tempCodePoint\n }\n }\n break\n case 4:\n secondByte = buf[i + 1]\n thirdByte = buf[i + 2]\n fourthByte = buf[i + 3]\n if ((secondByte & 0xC0) === 0x80 && (thirdByte & 0xC0) === 0x80 && (fourthByte & 0xC0) === 0x80) {\n tempCodePoint = (firstByte & 0xF) << 0x12 | (secondByte & 0x3F) << 0xC | (thirdByte & 0x3F) << 0x6 | (fourthByte & 0x3F)\n if (tempCodePoint > 0xFFFF && tempCodePoint < 0x110000) {\n codePoint = tempCodePoint\n }\n }\n }\n }\n\n if (codePoint === null) {\n // we did not generate a valid codePoint so insert a\n // replacement char (U+FFFD) and advance only 1 byte\n codePoint = 0xFFFD\n bytesPerSequence = 1\n } else if (codePoint > 0xFFFF) {\n // encode to utf16 (surrogate pair dance)\n codePoint -= 0x10000\n res.push(codePoint >>> 10 & 0x3FF | 0xD800)\n codePoint = 0xDC00 | codePoint & 0x3FF\n }\n\n res.push(codePoint)\n i += bytesPerSequence\n }\n\n return decodeCodePointsArray(res)\n}\n\n// Based on http://stackoverflow.com/a/22747272/680742, the browser with\n// the lowest limit is Chrome, with 0x10000 args.\n// We go 1 magnitude less, for safety\nvar MAX_ARGUMENTS_LENGTH = 0x1000\n\nfunction decodeCodePointsArray (codePoints) {\n var len = codePoints.length\n if (len <= MAX_ARGUMENTS_LENGTH) {\n return String.fromCharCode.apply(String, codePoints) // avoid extra slice()\n }\n\n // Decode in chunks to avoid \"call stack size exceeded\".\n var res = ''\n var i = 0\n while (i < len) {\n res += String.fromCharCode.apply(\n String,\n codePoints.slice(i, i += MAX_ARGUMENTS_LENGTH)\n )\n }\n return res\n}\n\nfunction asciiSlice (buf, start, end) {\n var ret = ''\n end = Math.min(buf.length, end)\n\n for (var i = start; i < end; ++i) {\n ret += String.fromCharCode(buf[i] & 0x7F)\n }\n return ret\n}\n\nfunction latin1Slice (buf, start, end) {\n var ret = ''\n end = Math.min(buf.length, end)\n\n for (var i = start; i < end; ++i) {\n ret += String.fromCharCode(buf[i])\n }\n return ret\n}\n\nfunction hexSlice (buf, start, end) {\n var len = buf.length\n\n if (!start || start < 0) start = 0\n if (!end || end < 0 || end > len) end = len\n\n var out = ''\n for (var i = start; i < end; ++i) {\n out += hexSliceLookupTable[buf[i]]\n }\n return out\n}\n\nfunction utf16leSlice (buf, start, end) {\n var bytes = buf.slice(start, end)\n var res = ''\n // If bytes.length is odd, the last 8 bits must be ignored (same as node.js)\n for (var i = 0; i < bytes.length - 1; i += 2) {\n res += String.fromCharCode(bytes[i] + (bytes[i + 1] * 256))\n }\n return res\n}\n\nBuffer.prototype.slice = function slice (start, end) {\n var len = this.length\n start = ~~start\n end = end === undefined ? len : ~~end\n\n if (start < 0) {\n start += len\n if (start < 0) start = 0\n } else if (start > len) {\n start = len\n }\n\n if (end < 0) {\n end += len\n if (end < 0) end = 0\n } else if (end > len) {\n end = len\n }\n\n if (end < start) end = start\n\n var newBuf = this.subarray(start, end)\n // Return an augmented `Uint8Array` instance\n Object.setPrototypeOf(newBuf, Buffer.prototype)\n\n return newBuf\n}\n\n/*\n * Need to make sure that buffer isn't trying to write out of bounds.\n */\nfunction checkOffset (offset, ext, length) {\n if ((offset % 1) !== 0 || offset < 0) throw new RangeError('offset is not uint')\n if (offset + ext > length) throw new RangeError('Trying to access beyond buffer length')\n}\n\nBuffer.prototype.readUintLE =\nBuffer.prototype.readUIntLE = function readUIntLE (offset, byteLength, noAssert) {\n offset = offset >>> 0\n byteLength = byteLength >>> 0\n if (!noAssert) checkOffset(offset, byteLength, this.length)\n\n var val = this[offset]\n var mul = 1\n var i = 0\n while (++i < byteLength && (mul *= 0x100)) {\n val += this[offset + i] * mul\n }\n\n return val\n}\n\nBuffer.prototype.readUintBE =\nBuffer.prototype.readUIntBE = function readUIntBE (offset, byteLength, noAssert) {\n offset = offset >>> 0\n byteLength = byteLength >>> 0\n if (!noAssert) {\n checkOffset(offset, byteLength, this.length)\n }\n\n var val = this[offset + --byteLength]\n var mul = 1\n while (byteLength > 0 && (mul *= 0x100)) {\n val += this[offset + --byteLength] * mul\n }\n\n return val\n}\n\nBuffer.prototype.readUint8 =\nBuffer.prototype.readUInt8 = function readUInt8 (offset, noAssert) {\n offset = offset >>> 0\n if (!noAssert) checkOffset(offset, 1, this.length)\n return this[offset]\n}\n\nBuffer.prototype.readUint16LE =\nBuffer.prototype.readUInt16LE = function readUInt16LE (offset, noAssert) {\n offset = offset >>> 0\n if (!noAssert) checkOffset(offset, 2, this.length)\n return this[offset] | (this[offset + 1] << 8)\n}\n\nBuffer.prototype.readUint16BE =\nBuffer.prototype.readUInt16BE = function readUInt16BE (offset, noAssert) {\n offset = offset >>> 0\n if (!noAssert) checkOffset(offset, 2, this.length)\n return (this[offset] << 8) | this[offset + 1]\n}\n\nBuffer.prototype.readUint32LE =\nBuffer.prototype.readUInt32LE = function readUInt32LE (offset, noAssert) {\n offset = offset >>> 0\n if (!noAssert) checkOffset(offset, 4, this.length)\n\n return ((this[offset]) |\n (this[offset + 1] << 8) |\n (this[offset + 2] << 16)) +\n (this[offset + 3] * 0x1000000)\n}\n\nBuffer.prototype.readUint32BE =\nBuffer.prototype.readUInt32BE = function readUInt32BE (offset, noAssert) {\n offset = offset >>> 0\n if (!noAssert) checkOffset(offset, 4, this.length)\n\n return (this[offset] * 0x1000000) +\n ((this[offset + 1] << 16) |\n (this[offset + 2] << 8) |\n this[offset + 3])\n}\n\nBuffer.prototype.readIntLE = function readIntLE (offset, byteLength, noAssert) {\n offset = offset >>> 0\n byteLength = byteLength >>> 0\n if (!noAssert) checkOffset(offset, byteLength, this.length)\n\n var val = this[offset]\n var mul = 1\n var i = 0\n while (++i < byteLength && (mul *= 0x100)) {\n val += this[offset + i] * mul\n }\n mul *= 0x80\n\n if (val >= mul) val -= Math.pow(2, 8 * byteLength)\n\n return val\n}\n\nBuffer.prototype.readIntBE = function readIntBE (offset, byteLength, noAssert) {\n offset = offset >>> 0\n byteLength = byteLength >>> 0\n if (!noAssert) checkOffset(offset, byteLength, this.length)\n\n var i = byteLength\n var mul = 1\n var val = this[offset + --i]\n while (i > 0 && (mul *= 0x100)) {\n val += this[offset + --i] * mul\n }\n mul *= 0x80\n\n if (val >= mul) val -= Math.pow(2, 8 * byteLength)\n\n return val\n}\n\nBuffer.prototype.readInt8 = function readInt8 (offset, noAssert) {\n offset = offset >>> 0\n if (!noAssert) checkOffset(offset, 1, this.length)\n if (!(this[offset] & 0x80)) return (this[offset])\n return ((0xff - this[offset] + 1) * -1)\n}\n\nBuffer.prototype.readInt16LE = function readInt16LE (offset, noAssert) {\n offset = offset >>> 0\n if (!noAssert) checkOffset(offset, 2, this.length)\n var val = this[offset] | (this[offset + 1] << 8)\n return (val & 0x8000) ? val | 0xFFFF0000 : val\n}\n\nBuffer.prototype.readInt16BE = function readInt16BE (offset, noAssert) {\n offset = offset >>> 0\n if (!noAssert) checkOffset(offset, 2, this.length)\n var val = this[offset + 1] | (this[offset] << 8)\n return (val & 0x8000) ? val | 0xFFFF0000 : val\n}\n\nBuffer.prototype.readInt32LE = function readInt32LE (offset, noAssert) {\n offset = offset >>> 0\n if (!noAssert) checkOffset(offset, 4, this.length)\n\n return (this[offset]) |\n (this[offset + 1] << 8) |\n (this[offset + 2] << 16) |\n (this[offset + 3] << 24)\n}\n\nBuffer.prototype.readInt32BE = function readInt32BE (offset, noAssert) {\n offset = offset >>> 0\n if (!noAssert) checkOffset(offset, 4, this.length)\n\n return (this[offset] << 24) |\n (this[offset + 1] << 16) |\n (this[offset + 2] << 8) |\n (this[offset + 3])\n}\n\nBuffer.prototype.readFloatLE = function readFloatLE (offset, noAssert) {\n offset = offset >>> 0\n if (!noAssert) checkOffset(offset, 4, this.length)\n return ieee754.read(this, offset, true, 23, 4)\n}\n\nBuffer.prototype.readFloatBE = function readFloatBE (offset, noAssert) {\n offset = offset >>> 0\n if (!noAssert) checkOffset(offset, 4, this.length)\n return ieee754.read(this, offset, false, 23, 4)\n}\n\nBuffer.prototype.readDoubleLE = function readDoubleLE (offset, noAssert) {\n offset = offset >>> 0\n if (!noAssert) checkOffset(offset, 8, this.length)\n return ieee754.read(this, offset, true, 52, 8)\n}\n\nBuffer.prototype.readDoubleBE = function readDoubleBE (offset, noAssert) {\n offset = offset >>> 0\n if (!noAssert) checkOffset(offset, 8, this.length)\n return ieee754.read(this, offset, false, 52, 8)\n}\n\nfunction checkInt (buf, value, offset, ext, max, min) {\n if (!Buffer.isBuffer(buf)) throw new TypeError('\"buffer\" argument must be a Buffer instance')\n if (value > max || value < min) throw new RangeError('\"value\" argument is out of bounds')\n if (offset + ext > buf.length) throw new RangeError('Index out of range')\n}\n\nBuffer.prototype.writeUintLE =\nBuffer.prototype.writeUIntLE = function writeUIntLE (value, offset, byteLength, noAssert) {\n value = +value\n offset = offset >>> 0\n byteLength = byteLength >>> 0\n if (!noAssert) {\n var maxBytes = Math.pow(2, 8 * byteLength) - 1\n checkInt(this, value, offset, byteLength, maxBytes, 0)\n }\n\n var mul = 1\n var i = 0\n this[offset] = value & 0xFF\n while (++i < byteLength && (mul *= 0x100)) {\n this[offset + i] = (value / mul) & 0xFF\n }\n\n return offset + byteLength\n}\n\nBuffer.prototype.writeUintBE =\nBuffer.prototype.writeUIntBE = function writeUIntBE (value, offset, byteLength, noAssert) {\n value = +value\n offset = offset >>> 0\n byteLength = byteLength >>> 0\n if (!noAssert) {\n var maxBytes = Math.pow(2, 8 * byteLength) - 1\n checkInt(this, value, offset, byteLength, maxBytes, 0)\n }\n\n var i = byteLength - 1\n var mul = 1\n this[offset + i] = value & 0xFF\n while (--i >= 0 && (mul *= 0x100)) {\n this[offset + i] = (value / mul) & 0xFF\n }\n\n return offset + byteLength\n}\n\nBuffer.prototype.writeUint8 =\nBuffer.prototype.writeUInt8 = function writeUInt8 (value, offset, noAssert) {\n value = +value\n offset = offset >>> 0\n if (!noAssert) checkInt(this, value, offset, 1, 0xff, 0)\n this[offset] = (value & 0xff)\n return offset + 1\n}\n\nBuffer.prototype.writeUint16LE =\nBuffer.prototype.writeUInt16LE = function writeUInt16LE (value, offset, noAssert) {\n value = +value\n offset = offset >>> 0\n if (!noAssert) checkInt(this, value, offset, 2, 0xffff, 0)\n this[offset] = (value & 0xff)\n this[offset + 1] = (value >>> 8)\n return offset + 2\n}\n\nBuffer.prototype.writeUint16BE =\nBuffer.prototype.writeUInt16BE = function writeUInt16BE (value, offset, noAssert) {\n value = +value\n offset = offset >>> 0\n if (!noAssert) checkInt(this, value, offset, 2, 0xffff, 0)\n this[offset] = (value >>> 8)\n this[offset + 1] = (value & 0xff)\n return offset + 2\n}\n\nBuffer.prototype.writeUint32LE =\nBuffer.prototype.writeUInt32LE = function writeUInt32LE (value, offset, noAssert) {\n value = +value\n offset = offset >>> 0\n if (!noAssert) checkInt(this, value, offset, 4, 0xffffffff, 0)\n this[offset + 3] = (value >>> 24)\n this[offset + 2] = (value >>> 16)\n this[offset + 1] = (value >>> 8)\n this[offset] = (value & 0xff)\n return offset + 4\n}\n\nBuffer.prototype.writeUint32BE =\nBuffer.prototype.writeUInt32BE = function writeUInt32BE (value, offset, noAssert) {\n value = +value\n offset = offset >>> 0\n if (!noAssert) checkInt(this, value, offset, 4, 0xffffffff, 0)\n this[offset] = (value >>> 24)\n this[offset + 1] = (value >>> 16)\n this[offset + 2] = (value >>> 8)\n this[offset + 3] = (value & 0xff)\n return offset + 4\n}\n\nBuffer.prototype.writeIntLE = function writeIntLE (value, offset, byteLength, noAssert) {\n value = +value\n offset = offset >>> 0\n if (!noAssert) {\n var limit = Math.pow(2, (8 * byteLength) - 1)\n\n checkInt(this, value, offset, byteLength, limit - 1, -limit)\n }\n\n var i = 0\n var mul = 1\n var sub = 0\n this[offset] = value & 0xFF\n while (++i < byteLength && (mul *= 0x100)) {\n if (value < 0 && sub === 0 && this[offset + i - 1] !== 0) {\n sub = 1\n }\n this[offset + i] = ((value / mul) >> 0) - sub & 0xFF\n }\n\n return offset + byteLength\n}\n\nBuffer.prototype.writeIntBE = function writeIntBE (value, offset, byteLength, noAssert) {\n value = +value\n offset = offset >>> 0\n if (!noAssert) {\n var limit = Math.pow(2, (8 * byteLength) - 1)\n\n checkInt(this, value, offset, byteLength, limit - 1, -limit)\n }\n\n var i = byteLength - 1\n var mul = 1\n var sub = 0\n this[offset + i] = value & 0xFF\n while (--i >= 0 && (mul *= 0x100)) {\n if (value < 0 && sub === 0 && this[offset + i + 1] !== 0) {\n sub = 1\n }\n this[offset + i] = ((value / mul) >> 0) - sub & 0xFF\n }\n\n return offset + byteLength\n}\n\nBuffer.prototype.writeInt8 = function writeInt8 (value, offset, noAssert) {\n value = +value\n offset = offset >>> 0\n if (!noAssert) checkInt(this, value, offset, 1, 0x7f, -0x80)\n if (value < 0) value = 0xff + value + 1\n this[offset] = (value & 0xff)\n return offset + 1\n}\n\nBuffer.prototype.writeInt16LE = function writeInt16LE (value, offset, noAssert) {\n value = +value\n offset = offset >>> 0\n if (!noAssert) checkInt(this, value, offset, 2, 0x7fff, -0x8000)\n this[offset] = (value & 0xff)\n this[offset + 1] = (value >>> 8)\n return offset + 2\n}\n\nBuffer.prototype.writeInt16BE = function writeInt16BE (value, offset, noAssert) {\n value = +value\n offset = offset >>> 0\n if (!noAssert) checkInt(this, value, offset, 2, 0x7fff, -0x8000)\n this[offset] = (value >>> 8)\n this[offset + 1] = (value & 0xff)\n return offset + 2\n}\n\nBuffer.prototype.writeInt32LE = function writeInt32LE (value, offset, noAssert) {\n value = +value\n offset = offset >>> 0\n if (!noAssert) checkInt(this, value, offset, 4, 0x7fffffff, -0x80000000)\n this[offset] = (value & 0xff)\n this[offset + 1] = (value >>> 8)\n this[offset + 2] = (value >>> 16)\n this[offset + 3] = (value >>> 24)\n return offset + 4\n}\n\nBuffer.prototype.writeInt32BE = function writeInt32BE (value, offset, noAssert) {\n value = +value\n offset = offset >>> 0\n if (!noAssert) checkInt(this, value, offset, 4, 0x7fffffff, -0x80000000)\n if (value < 0) value = 0xffffffff + value + 1\n this[offset] = (value >>> 24)\n this[offset + 1] = (value >>> 16)\n this[offset + 2] = (value >>> 8)\n this[offset + 3] = (value & 0xff)\n return offset + 4\n}\n\nfunction checkIEEE754 (buf, value, offset, ext, max, min) {\n if (offset + ext > buf.length) throw new RangeError('Index out of range')\n if (offset < 0) throw new RangeError('Index out of range')\n}\n\nfunction writeFloat (buf, value, offset, littleEndian, noAssert) {\n value = +value\n offset = offset >>> 0\n if (!noAssert) {\n checkIEEE754(buf, value, offset, 4, 3.4028234663852886e+38, -3.4028234663852886e+38)\n }\n ieee754.write(buf, value, offset, littleEndian, 23, 4)\n return offset + 4\n}\n\nBuffer.prototype.writeFloatLE = function writeFloatLE (value, offset, noAssert) {\n return writeFloat(this, value, offset, true, noAssert)\n}\n\nBuffer.prototype.writeFloatBE = function writeFloatBE (value, offset, noAssert) {\n return writeFloat(this, value, offset, false, noAssert)\n}\n\nfunction writeDouble (buf, value, offset, littleEndian, noAssert) {\n value = +value\n offset = offset >>> 0\n if (!noAssert) {\n checkIEEE754(buf, value, offset, 8, 1.7976931348623157E+308, -1.7976931348623157E+308)\n }\n ieee754.write(buf, value, offset, littleEndian, 52, 8)\n return offset + 8\n}\n\nBuffer.prototype.writeDoubleLE = function writeDoubleLE (value, offset, noAssert) {\n return writeDouble(this, value, offset, true, noAssert)\n}\n\nBuffer.prototype.writeDoubleBE = function writeDoubleBE (value, offset, noAssert) {\n return writeDouble(this, value, offset, false, noAssert)\n}\n\n// copy(targetBuffer, targetStart=0, sourceStart=0, sourceEnd=buffer.length)\nBuffer.prototype.copy = function copy (target, targetStart, start, end) {\n if (!Buffer.isBuffer(target)) throw new TypeError('argument should be a Buffer')\n if (!start) start = 0\n if (!end && end !== 0) end = this.length\n if (targetStart >= target.length) targetStart = target.length\n if (!targetStart) targetStart = 0\n if (end > 0 && end < start) end = start\n\n // Copy 0 bytes; we're done\n if (end === start) return 0\n if (target.length === 0 || this.length === 0) return 0\n\n // Fatal error conditions\n if (targetStart < 0) {\n throw new RangeError('targetStart out of bounds')\n }\n if (start < 0 || start >= this.length) throw new RangeError('Index out of range')\n if (end < 0) throw new RangeError('sourceEnd out of bounds')\n\n // Are we oob?\n if (end > this.length) end = this.length\n if (target.length - targetStart < end - start) {\n end = target.length - targetStart + start\n }\n\n var len = end - start\n\n if (this === target && typeof Uint8Array.prototype.copyWithin === 'function') {\n // Use built-in when available, missing from IE11\n this.copyWithin(targetStart, start, end)\n } else {\n Uint8Array.prototype.set.call(\n target,\n this.subarray(start, end),\n targetStart\n )\n }\n\n return len\n}\n\n// Usage:\n// buffer.fill(number[, offset[, end]])\n// buffer.fill(buffer[, offset[, end]])\n// buffer.fill(string[, offset[, end]][, encoding])\nBuffer.prototype.fill = function fill (val, start, end, encoding) {\n // Handle string cases:\n if (typeof val === 'string') {\n if (typeof start === 'string') {\n encoding = start\n start = 0\n end = this.length\n } else if (typeof end === 'string') {\n encoding = end\n end = this.length\n }\n if (encoding !== undefined && typeof encoding !== 'string') {\n throw new TypeError('encoding must be a string')\n }\n if (typeof encoding === 'string' && !Buffer.isEncoding(encoding)) {\n throw new TypeError('Unknown encoding: ' + encoding)\n }\n if (val.length === 1) {\n var code = val.charCodeAt(0)\n if ((encoding === 'utf8' && code < 128) ||\n encoding === 'latin1') {\n // Fast path: If `val` fits into a single byte, use that numeric value.\n val = code\n }\n }\n } else if (typeof val === 'number') {\n val = val & 255\n } else if (typeof val === 'boolean') {\n val = Number(val)\n }\n\n // Invalid ranges are not set to a default, so can range check early.\n if (start < 0 || this.length < start || this.length < end) {\n throw new RangeError('Out of range index')\n }\n\n if (end <= start) {\n return this\n }\n\n start = start >>> 0\n end = end === undefined ? this.length : end >>> 0\n\n if (!val) val = 0\n\n var i\n if (typeof val === 'number') {\n for (i = start; i < end; ++i) {\n this[i] = val\n }\n } else {\n var bytes = Buffer.isBuffer(val)\n ? val\n : Buffer.from(val, encoding)\n var len = bytes.length\n if (len === 0) {\n throw new TypeError('The value \"' + val +\n '\" is invalid for argument \"value\"')\n }\n for (i = 0; i < end - start; ++i) {\n this[i + start] = bytes[i % len]\n }\n }\n\n return this\n}\n\n// HELPER FUNCTIONS\n// ================\n\nvar INVALID_BASE64_RE = /[^+/0-9A-Za-z-_]/g\n\nfunction base64clean (str) {\n // Node takes equal signs as end of the Base64 encoding\n str = str.split('=')[0]\n // Node strips out invalid characters like \\n and \\t from the string, base64-js does not\n str = str.trim().replace(INVALID_BASE64_RE, '')\n // Node converts strings with length < 2 to ''\n if (str.length < 2) return ''\n // Node allows for non-padded base64 strings (missing trailing ===), base64-js does not\n while (str.length % 4 !== 0) {\n str = str + '='\n }\n return str\n}\n\nfunction utf8ToBytes (string, units) {\n units = units || Infinity\n var codePoint\n var length = string.length\n var leadSurrogate = null\n var bytes = []\n\n for (var i = 0; i < length; ++i) {\n codePoint = string.charCodeAt(i)\n\n // is surrogate component\n if (codePoint > 0xD7FF && codePoint < 0xE000) {\n // last char was a lead\n if (!leadSurrogate) {\n // no lead yet\n if (codePoint > 0xDBFF) {\n // unexpected trail\n if ((units -= 3) > -1) bytes.push(0xEF, 0xBF, 0xBD)\n continue\n } else if (i + 1 === length) {\n // unpaired lead\n if ((units -= 3) > -1) bytes.push(0xEF, 0xBF, 0xBD)\n continue\n }\n\n // valid lead\n leadSurrogate = codePoint\n\n continue\n }\n\n // 2 leads in a row\n if (codePoint < 0xDC00) {\n if ((units -= 3) > -1) bytes.push(0xEF, 0xBF, 0xBD)\n leadSurrogate = codePoint\n continue\n }\n\n // valid surrogate pair\n codePoint = (leadSurrogate - 0xD800 << 10 | codePoint - 0xDC00) + 0x10000\n } else if (leadSurrogate) {\n // valid bmp char, but last char was a lead\n if ((units -= 3) > -1) bytes.push(0xEF, 0xBF, 0xBD)\n }\n\n leadSurrogate = null\n\n // encode utf8\n if (codePoint < 0x80) {\n if ((units -= 1) < 0) break\n bytes.push(codePoint)\n } else if (codePoint < 0x800) {\n if ((units -= 2) < 0) break\n bytes.push(\n codePoint >> 0x6 | 0xC0,\n codePoint & 0x3F | 0x80\n )\n } else if (codePoint < 0x10000) {\n if ((units -= 3) < 0) break\n bytes.push(\n codePoint >> 0xC | 0xE0,\n codePoint >> 0x6 & 0x3F | 0x80,\n codePoint & 0x3F | 0x80\n )\n } else if (codePoint < 0x110000) {\n if ((units -= 4) < 0) break\n bytes.push(\n codePoint >> 0x12 | 0xF0,\n codePoint >> 0xC & 0x3F | 0x80,\n codePoint >> 0x6 & 0x3F | 0x80,\n codePoint & 0x3F | 0x80\n )\n } else {\n throw new Error('Invalid code point')\n }\n }\n\n return bytes\n}\n\nfunction asciiToBytes (str) {\n var byteArray = []\n for (var i = 0; i < str.length; ++i) {\n // Node's code seems to be doing this and not & 0x7F..\n byteArray.push(str.charCodeAt(i) & 0xFF)\n }\n return byteArray\n}\n\nfunction utf16leToBytes (str, units) {\n var c, hi, lo\n var byteArray = []\n for (var i = 0; i < str.length; ++i) {\n if ((units -= 2) < 0) break\n\n c = str.charCodeAt(i)\n hi = c >> 8\n lo = c % 256\n byteArray.push(lo)\n byteArray.push(hi)\n }\n\n return byteArray\n}\n\nfunction base64ToBytes (str) {\n return base64.toByteArray(base64clean(str))\n}\n\nfunction blitBuffer (src, dst, offset, length) {\n for (var i = 0; i < length; ++i) {\n if ((i + offset >= dst.length) || (i >= src.length)) break\n dst[i + offset] = src[i]\n }\n return i\n}\n\n// ArrayBuffer or Uint8Array objects from other contexts (i.e. iframes) do not pass\n// the `instanceof` check but they should be treated as of that type.\n// See: https://github.com/feross/buffer/issues/166\nfunction isInstance (obj, type) {\n return obj instanceof type ||\n (obj != null && obj.constructor != null && obj.constructor.name != null &&\n obj.constructor.name === type.name)\n}\nfunction numberIsNaN (obj) {\n // For IE11 support\n return obj !== obj // eslint-disable-line no-self-compare\n}\n\n// Create lookup table for `toString('hex')`\n// See: https://github.com/feross/buffer/issues/219\nvar hexSliceLookupTable = (function () {\n var alphabet = '0123456789abcdef'\n var table = new Array(256)\n for (var i = 0; i < 16; ++i) {\n var i16 = i * 16\n for (var j = 0; j < 16; ++j) {\n table[i16 + j] = alphabet[i] + alphabet[j]\n }\n }\n return table\n})()\n","/**\n * Copyright (c) 2013-present, Facebook, Inc.\n *\n * This source code is licensed under the MIT license found in the\n * LICENSE file in the root directory of this source tree.\n *\n */\n\n'use strict';\n\nvar _assign = require('object-assign');\n\n// -- Inlined from fbjs --\n\nvar emptyObject = {};\n\nif (process.env.NODE_ENV !== 'production') {\n Object.freeze(emptyObject);\n}\n\nvar validateFormat = function validateFormat(format) {};\n\nif (process.env.NODE_ENV !== 'production') {\n validateFormat = function validateFormat(format) {\n if (format === undefined) {\n throw new Error('invariant requires an error message argument');\n }\n };\n}\n\nfunction _invariant(condition, format, a, b, c, d, e, f) {\n validateFormat(format);\n\n if (!condition) {\n var error;\n if (format === undefined) {\n error = new Error('Minified exception occurred; use the non-minified dev environment ' + 'for the full error message and additional helpful warnings.');\n } else {\n var args = [a, b, c, d, e, f];\n var argIndex = 0;\n error = new Error(format.replace(/%s/g, function () {\n return args[argIndex++];\n }));\n error.name = 'Invariant Violation';\n }\n\n error.framesToPop = 1; // we don't care about invariant's own frame\n throw error;\n }\n}\n\nvar warning = function(){};\n\nif (process.env.NODE_ENV !== 'production') {\n var printWarning = function printWarning(format) {\n for (var _len = arguments.length, args = Array(_len > 1 ? _len - 1 : 0), _key = 1; _key < _len; _key++) {\n args[_key - 1] = arguments[_key];\n }\n\n var argIndex = 0;\n var message = 'Warning: ' + format.replace(/%s/g, function () {\n return args[argIndex++];\n });\n if (typeof console !== 'undefined') {\n console.error(message);\n }\n try {\n // --- Welcome to debugging React ---\n // This error was thrown as a convenience so that you can use this stack\n // to find the callsite that caused this warning to fire.\n throw new Error(message);\n } catch (x) {}\n };\n\n warning = function warning(condition, format) {\n if (format === undefined) {\n throw new Error('`warning(condition, format, ...args)` requires a warning ' + 'message argument');\n }\n\n if (format.indexOf('Failed Composite propType: ') === 0) {\n return; // Ignore CompositeComponent proptype check.\n }\n\n if (!condition) {\n for (var _len2 = arguments.length, args = Array(_len2 > 2 ? _len2 - 2 : 0), _key2 = 2; _key2 < _len2; _key2++) {\n args[_key2 - 2] = arguments[_key2];\n }\n\n printWarning.apply(undefined, [format].concat(args));\n }\n };\n}\n\n// /-- Inlined from fbjs --\n\nvar MIXINS_KEY = 'mixins';\n\n// Helper function to allow the creation of anonymous functions which do not\n// have .name set to the name of the variable being assigned to.\nfunction identity(fn) {\n return fn;\n}\n\nvar ReactPropTypeLocationNames;\nif (process.env.NODE_ENV !== 'production') {\n ReactPropTypeLocationNames = {\n prop: 'prop',\n context: 'context',\n childContext: 'child context'\n };\n} else {\n ReactPropTypeLocationNames = {};\n}\n\nfunction factory(ReactComponent, isValidElement, ReactNoopUpdateQueue) {\n /**\n * Policies that describe methods in `ReactClassInterface`.\n */\n\n var injectedMixins = [];\n\n /**\n * Composite components are higher-level components that compose other composite\n * or host components.\n *\n * To create a new type of `ReactClass`, pass a specification of\n * your new class to `React.createClass`. The only requirement of your class\n * specification is that you implement a `render` method.\n *\n * var MyComponent = React.createClass({\n * render: function() {\n * return
Hello World
;\n * }\n * });\n *\n * The class specification supports a specific protocol of methods that have\n * special meaning (e.g. `render`). See `ReactClassInterface` for\n * more the comprehensive protocol. Any other properties and methods in the\n * class specification will be available on the prototype.\n *\n * @interface ReactClassInterface\n * @internal\n */\n var ReactClassInterface = {\n /**\n * An array of Mixin objects to include when defining your component.\n *\n * @type {array}\n * @optional\n */\n mixins: 'DEFINE_MANY',\n\n /**\n * An object containing properties and methods that should be defined on\n * the component's constructor instead of its prototype (static methods).\n *\n * @type {object}\n * @optional\n */\n statics: 'DEFINE_MANY',\n\n /**\n * Definition of prop types for this component.\n *\n * @type {object}\n * @optional\n */\n propTypes: 'DEFINE_MANY',\n\n /**\n * Definition of context types for this component.\n *\n * @type {object}\n * @optional\n */\n contextTypes: 'DEFINE_MANY',\n\n /**\n * Definition of context types this component sets for its children.\n *\n * @type {object}\n * @optional\n */\n childContextTypes: 'DEFINE_MANY',\n\n // ==== Definition methods ====\n\n /**\n * Invoked when the component is mounted. Values in the mapping will be set on\n * `this.props` if that prop is not specified (i.e. using an `in` check).\n *\n * This method is invoked before `getInitialState` and therefore cannot rely\n * on `this.state` or use `this.setState`.\n *\n * @return {object}\n * @optional\n */\n getDefaultProps: 'DEFINE_MANY_MERGED',\n\n /**\n * Invoked once before the component is mounted. The return value will be used\n * as the initial value of `this.state`.\n *\n * getInitialState: function() {\n * return {\n * isOn: false,\n * fooBaz: new BazFoo()\n * }\n * }\n *\n * @return {object}\n * @optional\n */\n getInitialState: 'DEFINE_MANY_MERGED',\n\n /**\n * @return {object}\n * @optional\n */\n getChildContext: 'DEFINE_MANY_MERGED',\n\n /**\n * Uses props from `this.props` and state from `this.state` to render the\n * structure of the component.\n *\n * No guarantees are made about when or how often this method is invoked, so\n * it must not have side effects.\n *\n * render: function() {\n * var name = this.props.name;\n * return
Hello, {name}!
;\n * }\n *\n * @return {ReactComponent}\n * @required\n */\n render: 'DEFINE_ONCE',\n\n // ==== Delegate methods ====\n\n /**\n * Invoked when the component is initially created and about to be mounted.\n * This may have side effects, but any external subscriptions or data created\n * by this method must be cleaned up in `componentWillUnmount`.\n *\n * @optional\n */\n componentWillMount: 'DEFINE_MANY',\n\n /**\n * Invoked when the component has been mounted and has a DOM representation.\n * However, there is no guarantee that the DOM node is in the document.\n *\n * Use this as an opportunity to operate on the DOM when the component has\n * been mounted (initialized and rendered) for the first time.\n *\n * @param {DOMElement} rootNode DOM element representing the component.\n * @optional\n */\n componentDidMount: 'DEFINE_MANY',\n\n /**\n * Invoked before the component receives new props.\n *\n * Use this as an opportunity to react to a prop transition by updating the\n * state using `this.setState`. Current props are accessed via `this.props`.\n *\n * componentWillReceiveProps: function(nextProps, nextContext) {\n * this.setState({\n * likesIncreasing: nextProps.likeCount > this.props.likeCount\n * });\n * }\n *\n * NOTE: There is no equivalent `componentWillReceiveState`. An incoming prop\n * transition may cause a state change, but the opposite is not true. If you\n * need it, you are probably looking for `componentWillUpdate`.\n *\n * @param {object} nextProps\n * @optional\n */\n componentWillReceiveProps: 'DEFINE_MANY',\n\n /**\n * Invoked while deciding if the component should be updated as a result of\n * receiving new props, state and/or context.\n *\n * Use this as an opportunity to `return false` when you're certain that the\n * transition to the new props/state/context will not require a component\n * update.\n *\n * shouldComponentUpdate: function(nextProps, nextState, nextContext) {\n * return !equal(nextProps, this.props) ||\n * !equal(nextState, this.state) ||\n * !equal(nextContext, this.context);\n * }\n *\n * @param {object} nextProps\n * @param {?object} nextState\n * @param {?object} nextContext\n * @return {boolean} True if the component should update.\n * @optional\n */\n shouldComponentUpdate: 'DEFINE_ONCE',\n\n /**\n * Invoked when the component is about to update due to a transition from\n * `this.props`, `this.state` and `this.context` to `nextProps`, `nextState`\n * and `nextContext`.\n *\n * Use this as an opportunity to perform preparation before an update occurs.\n *\n * NOTE: You **cannot** use `this.setState()` in this method.\n *\n * @param {object} nextProps\n * @param {?object} nextState\n * @param {?object} nextContext\n * @param {ReactReconcileTransaction} transaction\n * @optional\n */\n componentWillUpdate: 'DEFINE_MANY',\n\n /**\n * Invoked when the component's DOM representation has been updated.\n *\n * Use this as an opportunity to operate on the DOM when the component has\n * been updated.\n *\n * @param {object} prevProps\n * @param {?object} prevState\n * @param {?object} prevContext\n * @param {DOMElement} rootNode DOM element representing the component.\n * @optional\n */\n componentDidUpdate: 'DEFINE_MANY',\n\n /**\n * Invoked when the component is about to be removed from its parent and have\n * its DOM representation destroyed.\n *\n * Use this as an opportunity to deallocate any external resources.\n *\n * NOTE: There is no `componentDidUnmount` since your component will have been\n * destroyed by that point.\n *\n * @optional\n */\n componentWillUnmount: 'DEFINE_MANY',\n\n /**\n * Replacement for (deprecated) `componentWillMount`.\n *\n * @optional\n */\n UNSAFE_componentWillMount: 'DEFINE_MANY',\n\n /**\n * Replacement for (deprecated) `componentWillReceiveProps`.\n *\n * @optional\n */\n UNSAFE_componentWillReceiveProps: 'DEFINE_MANY',\n\n /**\n * Replacement for (deprecated) `componentWillUpdate`.\n *\n * @optional\n */\n UNSAFE_componentWillUpdate: 'DEFINE_MANY',\n\n // ==== Advanced methods ====\n\n /**\n * Updates the component's currently mounted DOM representation.\n *\n * By default, this implements React's rendering and reconciliation algorithm.\n * Sophisticated clients may wish to override this.\n *\n * @param {ReactReconcileTransaction} transaction\n * @internal\n * @overridable\n */\n updateComponent: 'OVERRIDE_BASE'\n };\n\n /**\n * Similar to ReactClassInterface but for static methods.\n */\n var ReactClassStaticInterface = {\n /**\n * This method is invoked after a component is instantiated and when it\n * receives new props. Return an object to update state in response to\n * prop changes. Return null to indicate no change to state.\n *\n * If an object is returned, its keys will be merged into the existing state.\n *\n * @return {object || null}\n * @optional\n */\n getDerivedStateFromProps: 'DEFINE_MANY_MERGED'\n };\n\n /**\n * Mapping from class specification keys to special processing functions.\n *\n * Although these are declared like instance properties in the specification\n * when defining classes using `React.createClass`, they are actually static\n * and are accessible on the constructor instead of the prototype. Despite\n * being static, they must be defined outside of the \"statics\" key under\n * which all other static methods are defined.\n */\n var RESERVED_SPEC_KEYS = {\n displayName: function(Constructor, displayName) {\n Constructor.displayName = displayName;\n },\n mixins: function(Constructor, mixins) {\n if (mixins) {\n for (var i = 0; i < mixins.length; i++) {\n mixSpecIntoComponent(Constructor, mixins[i]);\n }\n }\n },\n childContextTypes: function(Constructor, childContextTypes) {\n if (process.env.NODE_ENV !== 'production') {\n validateTypeDef(Constructor, childContextTypes, 'childContext');\n }\n Constructor.childContextTypes = _assign(\n {},\n Constructor.childContextTypes,\n childContextTypes\n );\n },\n contextTypes: function(Constructor, contextTypes) {\n if (process.env.NODE_ENV !== 'production') {\n validateTypeDef(Constructor, contextTypes, 'context');\n }\n Constructor.contextTypes = _assign(\n {},\n Constructor.contextTypes,\n contextTypes\n );\n },\n /**\n * Special case getDefaultProps which should move into statics but requires\n * automatic merging.\n */\n getDefaultProps: function(Constructor, getDefaultProps) {\n if (Constructor.getDefaultProps) {\n Constructor.getDefaultProps = createMergedResultFunction(\n Constructor.getDefaultProps,\n getDefaultProps\n );\n } else {\n Constructor.getDefaultProps = getDefaultProps;\n }\n },\n propTypes: function(Constructor, propTypes) {\n if (process.env.NODE_ENV !== 'production') {\n validateTypeDef(Constructor, propTypes, 'prop');\n }\n Constructor.propTypes = _assign({}, Constructor.propTypes, propTypes);\n },\n statics: function(Constructor, statics) {\n mixStaticSpecIntoComponent(Constructor, statics);\n },\n autobind: function() {}\n };\n\n function validateTypeDef(Constructor, typeDef, location) {\n for (var propName in typeDef) {\n if (typeDef.hasOwnProperty(propName)) {\n // use a warning instead of an _invariant so components\n // don't show up in prod but only in __DEV__\n if (process.env.NODE_ENV !== 'production') {\n warning(\n typeof typeDef[propName] === 'function',\n '%s: %s type `%s` is invalid; it must be a function, usually from ' +\n 'React.PropTypes.',\n Constructor.displayName || 'ReactClass',\n ReactPropTypeLocationNames[location],\n propName\n );\n }\n }\n }\n }\n\n function validateMethodOverride(isAlreadyDefined, name) {\n var specPolicy = ReactClassInterface.hasOwnProperty(name)\n ? ReactClassInterface[name]\n : null;\n\n // Disallow overriding of base class methods unless explicitly allowed.\n if (ReactClassMixin.hasOwnProperty(name)) {\n _invariant(\n specPolicy === 'OVERRIDE_BASE',\n 'ReactClassInterface: You are attempting to override ' +\n '`%s` from your class specification. Ensure that your method names ' +\n 'do not overlap with React methods.',\n name\n );\n }\n\n // Disallow defining methods more than once unless explicitly allowed.\n if (isAlreadyDefined) {\n _invariant(\n specPolicy === 'DEFINE_MANY' || specPolicy === 'DEFINE_MANY_MERGED',\n 'ReactClassInterface: You are attempting to define ' +\n '`%s` on your component more than once. This conflict may be due ' +\n 'to a mixin.',\n name\n );\n }\n }\n\n /**\n * Mixin helper which handles policy validation and reserved\n * specification keys when building React classes.\n */\n function mixSpecIntoComponent(Constructor, spec) {\n if (!spec) {\n if (process.env.NODE_ENV !== 'production') {\n var typeofSpec = typeof spec;\n var isMixinValid = typeofSpec === 'object' && spec !== null;\n\n if (process.env.NODE_ENV !== 'production') {\n warning(\n isMixinValid,\n \"%s: You're attempting to include a mixin that is either null \" +\n 'or not an object. Check the mixins included by the component, ' +\n 'as well as any mixins they include themselves. ' +\n 'Expected object but got %s.',\n Constructor.displayName || 'ReactClass',\n spec === null ? null : typeofSpec\n );\n }\n }\n\n return;\n }\n\n _invariant(\n typeof spec !== 'function',\n \"ReactClass: You're attempting to \" +\n 'use a component class or function as a mixin. Instead, just use a ' +\n 'regular object.'\n );\n _invariant(\n !isValidElement(spec),\n \"ReactClass: You're attempting to \" +\n 'use a component as a mixin. Instead, just use a regular object.'\n );\n\n var proto = Constructor.prototype;\n var autoBindPairs = proto.__reactAutoBindPairs;\n\n // By handling mixins before any other properties, we ensure the same\n // chaining order is applied to methods with DEFINE_MANY policy, whether\n // mixins are listed before or after these methods in the spec.\n if (spec.hasOwnProperty(MIXINS_KEY)) {\n RESERVED_SPEC_KEYS.mixins(Constructor, spec.mixins);\n }\n\n for (var name in spec) {\n if (!spec.hasOwnProperty(name)) {\n continue;\n }\n\n if (name === MIXINS_KEY) {\n // We have already handled mixins in a special case above.\n continue;\n }\n\n var property = spec[name];\n var isAlreadyDefined = proto.hasOwnProperty(name);\n validateMethodOverride(isAlreadyDefined, name);\n\n if (RESERVED_SPEC_KEYS.hasOwnProperty(name)) {\n RESERVED_SPEC_KEYS[name](Constructor, property);\n } else {\n // Setup methods on prototype:\n // The following member methods should not be automatically bound:\n // 1. Expected ReactClass methods (in the \"interface\").\n // 2. Overridden methods (that were mixed in).\n var isReactClassMethod = ReactClassInterface.hasOwnProperty(name);\n var isFunction = typeof property === 'function';\n var shouldAutoBind =\n isFunction &&\n !isReactClassMethod &&\n !isAlreadyDefined &&\n spec.autobind !== false;\n\n if (shouldAutoBind) {\n autoBindPairs.push(name, property);\n proto[name] = property;\n } else {\n if (isAlreadyDefined) {\n var specPolicy = ReactClassInterface[name];\n\n // These cases should already be caught by validateMethodOverride.\n _invariant(\n isReactClassMethod &&\n (specPolicy === 'DEFINE_MANY_MERGED' ||\n specPolicy === 'DEFINE_MANY'),\n 'ReactClass: Unexpected spec policy %s for key %s ' +\n 'when mixing in component specs.',\n specPolicy,\n name\n );\n\n // For methods which are defined more than once, call the existing\n // methods before calling the new property, merging if appropriate.\n if (specPolicy === 'DEFINE_MANY_MERGED') {\n proto[name] = createMergedResultFunction(proto[name], property);\n } else if (specPolicy === 'DEFINE_MANY') {\n proto[name] = createChainedFunction(proto[name], property);\n }\n } else {\n proto[name] = property;\n if (process.env.NODE_ENV !== 'production') {\n // Add verbose displayName to the function, which helps when looking\n // at profiling tools.\n if (typeof property === 'function' && spec.displayName) {\n proto[name].displayName = spec.displayName + '_' + name;\n }\n }\n }\n }\n }\n }\n }\n\n function mixStaticSpecIntoComponent(Constructor, statics) {\n if (!statics) {\n return;\n }\n\n for (var name in statics) {\n var property = statics[name];\n if (!statics.hasOwnProperty(name)) {\n continue;\n }\n\n var isReserved = name in RESERVED_SPEC_KEYS;\n _invariant(\n !isReserved,\n 'ReactClass: You are attempting to define a reserved ' +\n 'property, `%s`, that shouldn\\'t be on the \"statics\" key. Define it ' +\n 'as an instance property instead; it will still be accessible on the ' +\n 'constructor.',\n name\n );\n\n var isAlreadyDefined = name in Constructor;\n if (isAlreadyDefined) {\n var specPolicy = ReactClassStaticInterface.hasOwnProperty(name)\n ? ReactClassStaticInterface[name]\n : null;\n\n _invariant(\n specPolicy === 'DEFINE_MANY_MERGED',\n 'ReactClass: You are attempting to define ' +\n '`%s` on your component more than once. This conflict may be ' +\n 'due to a mixin.',\n name\n );\n\n Constructor[name] = createMergedResultFunction(Constructor[name], property);\n\n return;\n }\n\n Constructor[name] = property;\n }\n }\n\n /**\n * Merge two objects, but throw if both contain the same key.\n *\n * @param {object} one The first object, which is mutated.\n * @param {object} two The second object\n * @return {object} one after it has been mutated to contain everything in two.\n */\n function mergeIntoWithNoDuplicateKeys(one, two) {\n _invariant(\n one && two && typeof one === 'object' && typeof two === 'object',\n 'mergeIntoWithNoDuplicateKeys(): Cannot merge non-objects.'\n );\n\n for (var key in two) {\n if (two.hasOwnProperty(key)) {\n _invariant(\n one[key] === undefined,\n 'mergeIntoWithNoDuplicateKeys(): ' +\n 'Tried to merge two objects with the same key: `%s`. This conflict ' +\n 'may be due to a mixin; in particular, this may be caused by two ' +\n 'getInitialState() or getDefaultProps() methods returning objects ' +\n 'with clashing keys.',\n key\n );\n one[key] = two[key];\n }\n }\n return one;\n }\n\n /**\n * Creates a function that invokes two functions and merges their return values.\n *\n * @param {function} one Function to invoke first.\n * @param {function} two Function to invoke second.\n * @return {function} Function that invokes the two argument functions.\n * @private\n */\n function createMergedResultFunction(one, two) {\n return function mergedResult() {\n var a = one.apply(this, arguments);\n var b = two.apply(this, arguments);\n if (a == null) {\n return b;\n } else if (b == null) {\n return a;\n }\n var c = {};\n mergeIntoWithNoDuplicateKeys(c, a);\n mergeIntoWithNoDuplicateKeys(c, b);\n return c;\n };\n }\n\n /**\n * Creates a function that invokes two functions and ignores their return vales.\n *\n * @param {function} one Function to invoke first.\n * @param {function} two Function to invoke second.\n * @return {function} Function that invokes the two argument functions.\n * @private\n */\n function createChainedFunction(one, two) {\n return function chainedFunction() {\n one.apply(this, arguments);\n two.apply(this, arguments);\n };\n }\n\n /**\n * Binds a method to the component.\n *\n * @param {object} component Component whose method is going to be bound.\n * @param {function} method Method to be bound.\n * @return {function} The bound method.\n */\n function bindAutoBindMethod(component, method) {\n var boundMethod = method.bind(component);\n if (process.env.NODE_ENV !== 'production') {\n boundMethod.__reactBoundContext = component;\n boundMethod.__reactBoundMethod = method;\n boundMethod.__reactBoundArguments = null;\n var componentName = component.constructor.displayName;\n var _bind = boundMethod.bind;\n boundMethod.bind = function(newThis) {\n for (\n var _len = arguments.length,\n args = Array(_len > 1 ? _len - 1 : 0),\n _key = 1;\n _key < _len;\n _key++\n ) {\n args[_key - 1] = arguments[_key];\n }\n\n // User is trying to bind() an autobound method; we effectively will\n // ignore the value of \"this\" that the user is trying to use, so\n // let's warn.\n if (newThis !== component && newThis !== null) {\n if (process.env.NODE_ENV !== 'production') {\n warning(\n false,\n 'bind(): React component methods may only be bound to the ' +\n 'component instance. See %s',\n componentName\n );\n }\n } else if (!args.length) {\n if (process.env.NODE_ENV !== 'production') {\n warning(\n false,\n 'bind(): You are binding a component method to the component. ' +\n 'React does this for you automatically in a high-performance ' +\n 'way, so you can safely remove this call. See %s',\n componentName\n );\n }\n return boundMethod;\n }\n var reboundMethod = _bind.apply(boundMethod, arguments);\n reboundMethod.__reactBoundContext = component;\n reboundMethod.__reactBoundMethod = method;\n reboundMethod.__reactBoundArguments = args;\n return reboundMethod;\n };\n }\n return boundMethod;\n }\n\n /**\n * Binds all auto-bound methods in a component.\n *\n * @param {object} component Component whose method is going to be bound.\n */\n function bindAutoBindMethods(component) {\n var pairs = component.__reactAutoBindPairs;\n for (var i = 0; i < pairs.length; i += 2) {\n var autoBindKey = pairs[i];\n var method = pairs[i + 1];\n component[autoBindKey] = bindAutoBindMethod(component, method);\n }\n }\n\n var IsMountedPreMixin = {\n componentDidMount: function() {\n this.__isMounted = true;\n }\n };\n\n var IsMountedPostMixin = {\n componentWillUnmount: function() {\n this.__isMounted = false;\n }\n };\n\n /**\n * Add more to the ReactClass base class. These are all legacy features and\n * therefore not already part of the modern ReactComponent.\n */\n var ReactClassMixin = {\n /**\n * TODO: This will be deprecated because state should always keep a consistent\n * type signature and the only use case for this, is to avoid that.\n */\n replaceState: function(newState, callback) {\n this.updater.enqueueReplaceState(this, newState, callback);\n },\n\n /**\n * Checks whether or not this composite component is mounted.\n * @return {boolean} True if mounted, false otherwise.\n * @protected\n * @final\n */\n isMounted: function() {\n if (process.env.NODE_ENV !== 'production') {\n warning(\n this.__didWarnIsMounted,\n '%s: isMounted is deprecated. Instead, make sure to clean up ' +\n 'subscriptions and pending requests in componentWillUnmount to ' +\n 'prevent memory leaks.',\n (this.constructor && this.constructor.displayName) ||\n this.name ||\n 'Component'\n );\n this.__didWarnIsMounted = true;\n }\n return !!this.__isMounted;\n }\n };\n\n var ReactClassComponent = function() {};\n _assign(\n ReactClassComponent.prototype,\n ReactComponent.prototype,\n ReactClassMixin\n );\n\n /**\n * Creates a composite component class given a class specification.\n * See https://facebook.github.io/react/docs/top-level-api.html#react.createclass\n *\n * @param {object} spec Class specification (which must define `render`).\n * @return {function} Component constructor function.\n * @public\n */\n function createClass(spec) {\n // To keep our warnings more understandable, we'll use a little hack here to\n // ensure that Constructor.name !== 'Constructor'. This makes sure we don't\n // unnecessarily identify a class without displayName as 'Constructor'.\n var Constructor = identity(function(props, context, updater) {\n // This constructor gets overridden by mocks. The argument is used\n // by mocks to assert on what gets mounted.\n\n if (process.env.NODE_ENV !== 'production') {\n warning(\n this instanceof Constructor,\n 'Something is calling a React component directly. Use a factory or ' +\n 'JSX instead. See: https://fb.me/react-legacyfactory'\n );\n }\n\n // Wire up auto-binding\n if (this.__reactAutoBindPairs.length) {\n bindAutoBindMethods(this);\n }\n\n this.props = props;\n this.context = context;\n this.refs = emptyObject;\n this.updater = updater || ReactNoopUpdateQueue;\n\n this.state = null;\n\n // ReactClasses doesn't have constructors. Instead, they use the\n // getInitialState and componentWillMount methods for initialization.\n\n var initialState = this.getInitialState ? this.getInitialState() : null;\n if (process.env.NODE_ENV !== 'production') {\n // We allow auto-mocks to proceed as if they're returning null.\n if (\n initialState === undefined &&\n this.getInitialState._isMockFunction\n ) {\n // This is probably bad practice. Consider warning here and\n // deprecating this convenience.\n initialState = null;\n }\n }\n _invariant(\n typeof initialState === 'object' && !Array.isArray(initialState),\n '%s.getInitialState(): must return an object or null',\n Constructor.displayName || 'ReactCompositeComponent'\n );\n\n this.state = initialState;\n });\n Constructor.prototype = new ReactClassComponent();\n Constructor.prototype.constructor = Constructor;\n Constructor.prototype.__reactAutoBindPairs = [];\n\n injectedMixins.forEach(mixSpecIntoComponent.bind(null, Constructor));\n\n mixSpecIntoComponent(Constructor, IsMountedPreMixin);\n mixSpecIntoComponent(Constructor, spec);\n mixSpecIntoComponent(Constructor, IsMountedPostMixin);\n\n // Initialize the defaultProps property after all mixins have been merged.\n if (Constructor.getDefaultProps) {\n Constructor.defaultProps = Constructor.getDefaultProps();\n }\n\n if (process.env.NODE_ENV !== 'production') {\n // This is a tag to indicate that the use of these method names is ok,\n // since it's used with createClass. If it's not, then it's likely a\n // mistake so we'll warn you to use the static property, property\n // initializer or constructor respectively.\n if (Constructor.getDefaultProps) {\n Constructor.getDefaultProps.isReactClassApproved = {};\n }\n if (Constructor.prototype.getInitialState) {\n Constructor.prototype.getInitialState.isReactClassApproved = {};\n }\n }\n\n _invariant(\n Constructor.prototype.render,\n 'createClass(...): Class specification must implement a `render` method.'\n );\n\n if (process.env.NODE_ENV !== 'production') {\n warning(\n !Constructor.prototype.componentShouldUpdate,\n '%s has a method called ' +\n 'componentShouldUpdate(). Did you mean shouldComponentUpdate()? ' +\n 'The name is phrased as a question because the function is ' +\n 'expected to return a value.',\n spec.displayName || 'A component'\n );\n warning(\n !Constructor.prototype.componentWillRecieveProps,\n '%s has a method called ' +\n 'componentWillRecieveProps(). Did you mean componentWillReceiveProps()?',\n spec.displayName || 'A component'\n );\n warning(\n !Constructor.prototype.UNSAFE_componentWillRecieveProps,\n '%s has a method called UNSAFE_componentWillRecieveProps(). ' +\n 'Did you mean UNSAFE_componentWillReceiveProps()?',\n spec.displayName || 'A component'\n );\n }\n\n // Reduce time spent doing lookups by setting these on the prototype.\n for (var methodName in ReactClassInterface) {\n if (!Constructor.prototype[methodName]) {\n Constructor.prototype[methodName] = null;\n }\n }\n\n return Constructor;\n }\n\n return createClass;\n}\n\nmodule.exports = factory;\n","/**\n * Copyright (c) 2013-present, Facebook, Inc.\n *\n * This source code is licensed under the MIT license found in the\n * LICENSE file in the root directory of this source tree.\n *\n */\n\n'use strict';\n\nvar React = require('react');\nvar factory = require('./factory');\n\nif (typeof React === 'undefined') {\n throw Error(\n 'create-react-class could not find the React object. If you are using script tags, ' +\n 'make sure that React is being loaded before create-react-class.'\n );\n}\n\n// Hack to grab NoopUpdateQueue from isomorphic React\nvar ReactNoopUpdateQueue = new React.Component().updater;\n\nmodule.exports = factory(\n React.Component,\n React.isValidElement,\n ReactNoopUpdateQueue\n);\n","import differenceInMilliseconds from '../differenceInMilliseconds/index.js';\nimport requiredArgs from '../_lib/requiredArgs/index.js';\n/**\n * @name differenceInSeconds\n * @category Second Helpers\n * @summary Get the number of seconds between the given dates.\n *\n * @description\n * Get the number of seconds between the given dates.\n *\n * ### v2.0.0 breaking changes:\n *\n * - [Changes that are common for the whole library](https://github.com/date-fns/date-fns/blob/master/docs/upgradeGuide.md#Common-Changes).\n *\n * @param {Date|Number} dateLeft - the later date\n * @param {Date|Number} dateRight - the earlier date\n * @returns {Number} the number of seconds\n * @throws {TypeError} 2 arguments required\n *\n * @example\n * // How many seconds are between\n * // 2 July 2014 12:30:07.999 and 2 July 2014 12:30:20.000?\n * var result = differenceInSeconds(\n * new Date(2014, 6, 2, 12, 30, 20, 0),\n * new Date(2014, 6, 2, 12, 30, 7, 999)\n * )\n * //=> 12\n */\n\nexport default function differenceInSeconds(dirtyDateLeft, dirtyDateRight) {\n requiredArgs(2, arguments);\n var diff = differenceInMilliseconds(dirtyDateLeft, dirtyDateRight) / 1000;\n return diff > 0 ? Math.floor(diff) : Math.ceil(diff);\n}","import toDate from '../toDate/index.js';\nimport requiredArgs from '../_lib/requiredArgs/index.js';\n/**\n * @name differenceInMilliseconds\n * @category Millisecond Helpers\n * @summary Get the number of milliseconds between the given dates.\n *\n * @description\n * Get the number of milliseconds between the given dates.\n *\n * ### v2.0.0 breaking changes:\n *\n * - [Changes that are common for the whole library](https://github.com/date-fns/date-fns/blob/master/docs/upgradeGuide.md#Common-Changes).\n *\n * @param {Date|Number} dateLeft - the later date\n * @param {Date|Number} dateRight - the earlier date\n * @returns {Number} the number of milliseconds\n * @throws {TypeError} 2 arguments required\n *\n * @example\n * // How many milliseconds are between\n * // 2 July 2014 12:30:20.600 and 2 July 2014 12:30:21.700?\n * var result = differenceInMilliseconds(\n * new Date(2014, 6, 2, 12, 30, 21, 700),\n * new Date(2014, 6, 2, 12, 30, 20, 600)\n * )\n * //=> 1100\n */\n\nexport default function differenceInMilliseconds(dirtyDateLeft, dirtyDateRight) {\n requiredArgs(2, arguments);\n var dateLeft = toDate(dirtyDateLeft);\n var dateRight = toDate(dirtyDateRight);\n return dateLeft.getTime() - dateRight.getTime();\n}","import getTimezoneOffsetInMilliseconds from '../_lib/getTimezoneOffsetInMilliseconds/index.js';\nimport compareAsc from '../compareAsc/index.js';\nimport toDate from '../toDate/index.js';\nimport differenceInSeconds from '../differenceInSeconds/index.js';\nimport cloneObject from '../_lib/cloneObject/index.js';\nimport defaultLocale from '../locale/en-US/index.js';\nimport requiredArgs from '../_lib/requiredArgs/index.js';\nvar MINUTES_IN_DAY = 1440;\nvar MINUTES_IN_MONTH = 43200;\nvar MINUTES_IN_YEAR = 525600;\n/**\n * @name formatDistanceStrict\n * @category Common Helpers\n * @summary Return the distance between the given dates in words.\n *\n * @description\n * Return the distance between the given dates in words, using strict units.\n * This is like `formatDistance`, but does not use helpers like 'almost', 'over',\n * 'less than' and the like.\n *\n * | Distance between dates | Result |\n * |------------------------|---------------------|\n * | 0 ... 59 secs | [0..59] seconds |\n * | 1 ... 59 mins | [1..59] minutes |\n * | 1 ... 23 hrs | [1..23] hours |\n * | 1 ... 29 days | [1..29] days |\n * | 1 ... 11 months | [1..11] months |\n * | 1 ... N years | [1..N] years |\n *\n * ### v2.0.0 breaking changes:\n *\n * - [Changes that are common for the whole library](https://github.com/date-fns/date-fns/blob/master/docs/upgradeGuide.md#Common-Changes).\n *\n * - The function was renamed from `distanceInWordsStrict` to `formatDistanceStrict`\n * to make its name consistent with `format` and `formatRelative`.\n *\n * - The order of arguments is swapped to make the function\n * consistent with `differenceIn...` functions.\n *\n * ```javascript\n * // Before v2.0.0\n *\n * distanceInWordsStrict(\n * new Date(2015, 0, 2),\n * new Date(2014, 6, 2)\n * ) //=> '6 months'\n *\n * // v2.0.0 onward\n *\n * formatDistanceStrict(\n * new Date(2014, 6, 2),\n * new Date(2015, 0, 2)\n * ) //=> '6 months'\n * ```\n *\n * - `partialMethod` option is renamed to `roundingMethod`.\n *\n * ```javascript\n * // Before v2.0.0\n *\n * distanceInWordsStrict(\n * new Date(1986, 3, 4, 10, 32, 0),\n * new Date(1986, 3, 4, 10, 33, 1),\n * { partialMethod: 'ceil' }\n * ) //=> '2 minutes'\n *\n * // v2.0.0 onward\n *\n * formatDistanceStrict(\n * new Date(1986, 3, 4, 10, 33, 1),\n * new Date(1986, 3, 4, 10, 32, 0),\n * { roundingMethod: 'ceil' }\n * ) //=> '2 minutes'\n * ```\n *\n * - If `roundingMethod` is not specified, it now defaults to `round` instead of `floor`.\n *\n * - `unit` option now accepts one of the strings:\n * 'second', 'minute', 'hour', 'day', 'month' or 'year' instead of 's', 'm', 'h', 'd', 'M' or 'Y'\n *\n * ```javascript\n * // Before v2.0.0\n *\n * distanceInWordsStrict(\n * new Date(1986, 3, 4, 10, 32, 0),\n * new Date(1986, 3, 4, 10, 33, 1),\n * { unit: 'm' }\n * )\n *\n * // v2.0.0 onward\n *\n * formatDistanceStrict(\n * new Date(1986, 3, 4, 10, 33, 1),\n * new Date(1986, 3, 4, 10, 32, 0),\n * { unit: 'minute' }\n * )\n * ```\n *\n * @param {Date|Number} date - the date\n * @param {Date|Number} baseDate - the date to compare with\n * @param {Object} [options] - an object with options.\n * @param {Boolean} [options.addSuffix=false] - result indicates if the second date is earlier or later than the first\n * @param {'second'|'minute'|'hour'|'day'|'month'|'year'} [options.unit] - if specified, will force a unit\n * @param {'floor'|'ceil'|'round'} [options.roundingMethod='round'] - which way to round partial units\n * @param {Locale} [options.locale=defaultLocale] - the locale object. See [Locale]{@link https://date-fns.org/docs/Locale}\n * @returns {String} the distance in words\n * @throws {TypeError} 2 arguments required\n * @throws {RangeError} `date` must not be Invalid Date\n * @throws {RangeError} `baseDate` must not be Invalid Date\n * @throws {RangeError} `options.roundingMethod` must be 'floor', 'ceil' or 'round'\n * @throws {RangeError} `options.unit` must be 'second', 'minute', 'hour', 'day', 'month' or 'year'\n * @throws {RangeError} `options.locale` must contain `formatDistance` property\n *\n * @example\n * // What is the distance between 2 July 2014 and 1 January 2015?\n * var result = formatDistanceStrict(new Date(2014, 6, 2), new Date(2015, 0, 2))\n * //=> '6 months'\n *\n * @example\n * // What is the distance between 1 January 2015 00:00:15\n * // and 1 January 2015 00:00:00?\n * var result = formatDistanceStrict(\n * new Date(2015, 0, 1, 0, 0, 15),\n * new Date(2015, 0, 1, 0, 0, 0)\n * )\n * //=> '15 seconds'\n *\n * @example\n * // What is the distance from 1 January 2016\n * // to 1 January 2015, with a suffix?\n * var result = formatDistanceStrict(new Date(2015, 0, 1), new Date(2016, 0, 1), {\n * addSuffix: true\n * })\n * //=> '1 year ago'\n *\n * @example\n * // What is the distance from 1 January 2016\n * // to 1 January 2015, in minutes?\n * var result = formatDistanceStrict(new Date(2016, 0, 1), new Date(2015, 0, 1), {\n * unit: 'minute'\n * })\n * //=> '525600 minutes'\n *\n * @example\n * // What is the distance from 1 January 2015\n * // to 28 January 2015, in months, rounded up?\n * var result = formatDistanceStrict(new Date(2015, 0, 28), new Date(2015, 0, 1), {\n * unit: 'month',\n * roundingMethod: 'ceil'\n * })\n * //=> '1 month'\n *\n * @example\n * // What is the distance between 1 August 2016 and 1 January 2015 in Esperanto?\n * import { eoLocale } from 'date-fns/locale/eo'\n * var result = formatDistanceStrict(new Date(2016, 7, 1), new Date(2015, 0, 1), {\n * locale: eoLocale\n * })\n * //=> '1 jaro'\n */\n\nexport default function formatDistanceStrict(dirtyDate, dirtyBaseDate, dirtyOptions) {\n requiredArgs(2, arguments);\n var options = dirtyOptions || {};\n var locale = options.locale || defaultLocale;\n\n if (!locale.formatDistance) {\n throw new RangeError('locale must contain localize.formatDistance property');\n }\n\n var comparison = compareAsc(dirtyDate, dirtyBaseDate);\n\n if (isNaN(comparison)) {\n throw new RangeError('Invalid time value');\n }\n\n var localizeOptions = cloneObject(options);\n localizeOptions.addSuffix = Boolean(options.addSuffix);\n localizeOptions.comparison = comparison;\n var dateLeft;\n var dateRight;\n\n if (comparison > 0) {\n dateLeft = toDate(dirtyBaseDate);\n dateRight = toDate(dirtyDate);\n } else {\n dateLeft = toDate(dirtyDate);\n dateRight = toDate(dirtyBaseDate);\n }\n\n var roundingMethod = options.roundingMethod == null ? 'round' : String(options.roundingMethod);\n var roundingMethodFn;\n\n if (roundingMethod === 'floor') {\n roundingMethodFn = Math.floor;\n } else if (roundingMethod === 'ceil') {\n roundingMethodFn = Math.ceil;\n } else if (roundingMethod === 'round') {\n roundingMethodFn = Math.round;\n } else {\n throw new RangeError(\"roundingMethod must be 'floor', 'ceil' or 'round'\");\n }\n\n var seconds = differenceInSeconds(dateRight, dateLeft);\n var offsetInSeconds = (getTimezoneOffsetInMilliseconds(dateRight) - getTimezoneOffsetInMilliseconds(dateLeft)) / 1000;\n var minutes = roundingMethodFn((seconds - offsetInSeconds) / 60);\n var unit;\n\n if (options.unit == null) {\n if (minutes < 1) {\n unit = 'second';\n } else if (minutes < 60) {\n unit = 'minute';\n } else if (minutes < MINUTES_IN_DAY) {\n unit = 'hour';\n } else if (minutes < MINUTES_IN_MONTH) {\n unit = 'day';\n } else if (minutes < MINUTES_IN_YEAR) {\n unit = 'month';\n } else {\n unit = 'year';\n }\n } else {\n unit = String(options.unit);\n } // 0 up to 60 seconds\n\n\n if (unit === 'second') {\n return locale.formatDistance('xSeconds', seconds, localizeOptions); // 1 up to 60 mins\n } else if (unit === 'minute') {\n return locale.formatDistance('xMinutes', minutes, localizeOptions); // 1 up to 24 hours\n } else if (unit === 'hour') {\n var hours = roundingMethodFn(minutes / 60);\n return locale.formatDistance('xHours', hours, localizeOptions); // 1 up to 30 days\n } else if (unit === 'day') {\n var days = roundingMethodFn(minutes / MINUTES_IN_DAY);\n return locale.formatDistance('xDays', days, localizeOptions); // 1 up to 12 months\n } else if (unit === 'month') {\n var months = roundingMethodFn(minutes / MINUTES_IN_MONTH);\n return locale.formatDistance('xMonths', months, localizeOptions); // 1 year up to max Date\n } else if (unit === 'year') {\n var years = roundingMethodFn(minutes / MINUTES_IN_YEAR);\n return locale.formatDistance('xYears', years, localizeOptions);\n }\n\n throw new RangeError(\"unit must be 'second', 'minute', 'hour', 'day', 'month' or 'year'\");\n}","import assign from '../assign/index.js';\nexport default function cloneObject(dirtyObject) {\n return assign({}, dirtyObject);\n}","import distanceInStrictWords from '../formatDistanceStrict/index.js';\nimport requiredArgs from '../_lib/requiredArgs/index.js';\n/**\n * @name formatDistanceToNowStrict\n * @category Common Helpers\n * @summary Return the distance between the given date and now in words.\n * @pure false\n *\n * @description\n * Return the distance between the given dates in words, using strict units.\n * This is like `formatDistance`, but does not use helpers like 'almost', 'over',\n * 'less than' and the like.\n *\n * | Distance between dates | Result |\n * |------------------------|---------------------|\n * | 0 ... 59 secs | [0..59] seconds |\n * | 1 ... 59 mins | [1..59] minutes |\n * | 1 ... 23 hrs | [1..23] hours |\n * | 1 ... 29 days | [1..29] days |\n * | 1 ... 11 months | [1..11] months |\n * | 1 ... N years | [1..N] years |\n *\n * @param {Date|Number} date - the given date\n * @param {Object} [options] - an object with options.\n * @param {Boolean} [options.addSuffix=false] - result indicates if the second date is earlier or later than the first\n * @param {'second'|'minute'|'hour'|'day'|'month'|'year'} [options.unit] - if specified, will force a unit\n * @param {'floor'|'ceil'|'round'} [options.roundingMethod='round'] - which way to round partial units\n * @param {Locale} [options.locale=defaultLocale] - the locale object. See [Locale]{@link https://date-fns.org/docs/Locale}\n * @returns {String} the distance in words\n * @throws {TypeError} 1 argument required\n * @throws {RangeError} `date` must not be Invalid Date\n * @throws {RangeError} `options.locale` must contain `formatDistance` property\n *\n * @example\n * // If today is 1 January 2015, what is the distance to 2 July 2014?\n * var result = formatDistanceToNowStrict(\n * new Date(2014, 6, 2)\n * )\n * //=> '6 months'\n *\n * @example\n * // If now is 1 January 2015 00:00:00,\n * // what is the distance to 1 January 2015 00:00:15, including seconds?\n * var result = formatDistanceToNowStrict(\n * new Date(2015, 0, 1, 0, 0, 15)\n * )\n * //=> '20 seconds'\n *\n * @example\n * // If today is 1 January 2015,\n * // what is the distance to 1 January 2016, with a suffix?\n * var result = formatDistanceToNowStrict(\n * new Date(2016, 0, 1),\n * {addSuffix: true}\n * )\n * //=> 'in 1 year'\n *\n * @example\n * // If today is 28 January 2015,\n * // what is the distance to 1 January 2015, in months, rounded up??\n * var result = formatDistanceToNowStrict(new Date(2015, 0, 1), {\n * unit: 'month',\n * roundingMethod: 'ceil'\n * })\n * //=> '1 month'\n *\n * @example\n * // If today is 1 January 2015,\n * // what is the distance to 1 August 2016 in Esperanto?\n * var eoLocale = require('date-fns/locale/eo')\n * var result = formatDistanceToNowStrict(\n * new Date(2016, 7, 1),\n * {locale: eoLocale}\n * )\n * //=> '1 jaro'\n */\n\nexport default function formatDistanceToNowStrict(dirtyDate, dirtyOptions) {\n requiredArgs(1, arguments);\n return distanceInStrictWords(dirtyDate, Date.now(), dirtyOptions);\n}","import toDate from '../toDate/index.js';\nimport requiredArgs from '../_lib/requiredArgs/index.js';\n/**\n * @name isBefore\n * @category Common Helpers\n * @summary Is the first date before the second one?\n *\n * @description\n * Is the first date before the second one?\n *\n * ### v2.0.0 breaking changes:\n *\n * - [Changes that are common for the whole library](https://github.com/date-fns/date-fns/blob/master/docs/upgradeGuide.md#Common-Changes).\n *\n * @param {Date|Number} date - the date that should be before the other one to return true\n * @param {Date|Number} dateToCompare - the date to compare with\n * @returns {Boolean} the first date is before the second date\n * @throws {TypeError} 2 arguments required\n *\n * @example\n * // Is 10 July 1989 before 11 February 1987?\n * var result = isBefore(new Date(1989, 6, 10), new Date(1987, 1, 11))\n * //=> false\n */\n\nexport default function isBefore(dirtyDate, dirtyDateToCompare) {\n requiredArgs(2, arguments);\n var date = toDate(dirtyDate);\n var dateToCompare = toDate(dirtyDateToCompare);\n return date.getTime() < dateToCompare.getTime();\n}","import toDate from '../toDate/index.js';\nimport requiredArgs from '../_lib/requiredArgs/index.js';\n/**\n * @name max\n * @category Common Helpers\n * @summary Return the latest of the given dates.\n *\n * @description\n * Return the latest of the given dates.\n *\n * ### v2.0.0 breaking changes:\n *\n * - [Changes that are common for the whole library](https://github.com/date-fns/date-fns/blob/master/docs/upgradeGuide.md#Common-Changes).\n *\n * - `max` function now accepts an array of dates rather than spread arguments.\n *\n * ```javascript\n * // Before v2.0.0\n * var date1 = new Date(1989, 6, 10)\n * var date2 = new Date(1987, 1, 11)\n * var maxDate = max(date1, date2)\n *\n * // v2.0.0 onward:\n * var dates = [new Date(1989, 6, 10), new Date(1987, 1, 11)]\n * var maxDate = max(dates)\n * ```\n *\n * @param {Date[]|Number[]} datesArray - the dates to compare\n * @returns {Date} the latest of the dates\n * @throws {TypeError} 1 argument required\n *\n * @example\n * // Which of these dates is the latest?\n * var result = max([\n * new Date(1989, 6, 10),\n * new Date(1987, 1, 11),\n * new Date(1995, 6, 2),\n * new Date(1990, 0, 1)\n * ])\n * //=> Sun Jul 02 1995 00:00:00\n */\n\nexport default function max(dirtyDatesArray) {\n requiredArgs(1, arguments);\n var datesArray; // `dirtyDatesArray` is Array, Set or Map, or object with custom `forEach` method\n\n if (dirtyDatesArray && typeof dirtyDatesArray.forEach === 'function') {\n datesArray = dirtyDatesArray; // If `dirtyDatesArray` is Array-like Object, convert to Array.\n } else if (typeof dirtyDatesArray === 'object' && dirtyDatesArray !== null) {\n datesArray = Array.prototype.slice.call(dirtyDatesArray);\n } else {\n // `dirtyDatesArray` is non-iterable, return Invalid Date\n return new Date(NaN);\n }\n\n var result;\n datesArray.forEach(function (dirtyDate) {\n var currentDate = toDate(dirtyDate);\n\n if (result === undefined || result < currentDate || isNaN(currentDate)) {\n result = currentDate;\n }\n });\n return result || new Date(NaN);\n}","import toInteger from '../_lib/toInteger/index.js';\nimport addMilliseconds from '../addMilliseconds/index.js';\nimport requiredArgs from '../_lib/requiredArgs/index.js';\nvar MILLISECONDS_IN_HOUR = 3600000;\n/**\n * @name addHours\n * @category Hour Helpers\n * @summary Add the specified number of hours to the given date.\n *\n * @description\n * Add the specified number of hours to the given date.\n *\n * ### v2.0.0 breaking changes:\n *\n * - [Changes that are common for the whole library](https://github.com/date-fns/date-fns/blob/master/docs/upgradeGuide.md#Common-Changes).\n *\n * @param {Date|Number} date - the date to be changed\n * @param {Number} amount - the amount of hours to be added. Positive decimals will be rounded using `Math.floor`, decimals less than zero will be rounded using `Math.ceil`.\n * @returns {Date} the new date with the hours added\n * @throws {TypeError} 2 arguments required\n *\n * @example\n * // Add 2 hours to 10 July 2014 23:00:00:\n * var result = addHours(new Date(2014, 6, 10, 23, 0), 2)\n * //=> Fri Jul 11 2014 01:00:00\n */\n\nexport default function addHours(dirtyDate, dirtyAmount) {\n requiredArgs(2, arguments);\n var amount = toInteger(dirtyAmount);\n return addMilliseconds(dirtyDate, amount * MILLISECONDS_IN_HOUR);\n}","import toInteger from '../_lib/toInteger/index.js';\nimport addHours from '../addHours/index.js';\nimport requiredArgs from '../_lib/requiredArgs/index.js';\n/**\n * @name subHours\n * @category Hour Helpers\n * @summary Subtract the specified number of hours from the given date.\n *\n * @description\n * Subtract the specified number of hours from the given date.\n *\n * ### v2.0.0 breaking changes:\n *\n * - [Changes that are common for the whole library](https://github.com/date-fns/date-fns/blob/master/docs/upgradeGuide.md#Common-Changes).\n *\n * @param {Date|Number} date - the date to be changed\n * @param {Number} amount - the amount of hours to be subtracted. Positive decimals will be rounded using `Math.floor`, decimals less than zero will be rounded using `Math.ceil`.\n * @returns {Date} the new date with the hours subtracted\n * @throws {TypeError} 2 arguments required\n *\n * @example\n * // Subtract 2 hours from 11 July 2014 01:00:00:\n * var result = subHours(new Date(2014, 6, 11, 1, 0), 2)\n * //=> Thu Jul 10 2014 23:00:00\n */\n\nexport default function subHours(dirtyDate, dirtyAmount) {\n requiredArgs(2, arguments);\n var amount = toInteger(dirtyAmount);\n return addHours(dirtyDate, -amount);\n}","'use strict';\n\n/******************************************************************************\n * Created 2008-08-19.\n *\n * Dijkstra path-finding functions. Adapted from the Dijkstar Python project.\n *\n * Copyright (C) 2008\n * Wyatt Baldwin \n * All rights reserved\n *\n * Licensed under the MIT license.\n *\n * http://www.opensource.org/licenses/mit-license.php\n *\n * THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\n * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\n * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN\n * THE SOFTWARE.\n *****************************************************************************/\nvar dijkstra = {\n single_source_shortest_paths: function(graph, s, d) {\n // Predecessor map for each node that has been encountered.\n // node ID => predecessor node ID\n var predecessors = {};\n\n // Costs of shortest paths from s to all nodes encountered.\n // node ID => cost\n var costs = {};\n costs[s] = 0;\n\n // Costs of shortest paths from s to all nodes encountered; differs from\n // `costs` in that it provides easy access to the node that currently has\n // the known shortest path from s.\n // XXX: Do we actually need both `costs` and `open`?\n var open = dijkstra.PriorityQueue.make();\n open.push(s, 0);\n\n var closest,\n u, v,\n cost_of_s_to_u,\n adjacent_nodes,\n cost_of_e,\n cost_of_s_to_u_plus_cost_of_e,\n cost_of_s_to_v,\n first_visit;\n while (!open.empty()) {\n // In the nodes remaining in graph that have a known cost from s,\n // find the node, u, that currently has the shortest path from s.\n closest = open.pop();\n u = closest.value;\n cost_of_s_to_u = closest.cost;\n\n // Get nodes adjacent to u...\n adjacent_nodes = graph[u] || {};\n\n // ...and explore the edges that connect u to those nodes, updating\n // the cost of the shortest paths to any or all of those nodes as\n // necessary. v is the node across the current edge from u.\n for (v in adjacent_nodes) {\n if (adjacent_nodes.hasOwnProperty(v)) {\n // Get the cost of the edge running from u to v.\n cost_of_e = adjacent_nodes[v];\n\n // Cost of s to u plus the cost of u to v across e--this is *a*\n // cost from s to v that may or may not be less than the current\n // known cost to v.\n cost_of_s_to_u_plus_cost_of_e = cost_of_s_to_u + cost_of_e;\n\n // If we haven't visited v yet OR if the current known cost from s to\n // v is greater than the new cost we just found (cost of s to u plus\n // cost of u to v across e), update v's cost in the cost list and\n // update v's predecessor in the predecessor list (it's now u).\n cost_of_s_to_v = costs[v];\n first_visit = (typeof costs[v] === 'undefined');\n if (first_visit || cost_of_s_to_v > cost_of_s_to_u_plus_cost_of_e) {\n costs[v] = cost_of_s_to_u_plus_cost_of_e;\n open.push(v, cost_of_s_to_u_plus_cost_of_e);\n predecessors[v] = u;\n }\n }\n }\n }\n\n if (typeof d !== 'undefined' && typeof costs[d] === 'undefined') {\n var msg = ['Could not find a path from ', s, ' to ', d, '.'].join('');\n throw new Error(msg);\n }\n\n return predecessors;\n },\n\n extract_shortest_path_from_predecessor_list: function(predecessors, d) {\n var nodes = [];\n var u = d;\n var predecessor;\n while (u) {\n nodes.push(u);\n predecessor = predecessors[u];\n u = predecessors[u];\n }\n nodes.reverse();\n return nodes;\n },\n\n find_path: function(graph, s, d) {\n var predecessors = dijkstra.single_source_shortest_paths(graph, s, d);\n return dijkstra.extract_shortest_path_from_predecessor_list(\n predecessors, d);\n },\n\n /**\n * A very naive priority queue implementation.\n */\n PriorityQueue: {\n make: function (opts) {\n var T = dijkstra.PriorityQueue,\n t = {},\n key;\n opts = opts || {};\n for (key in T) {\n if (T.hasOwnProperty(key)) {\n t[key] = T[key];\n }\n }\n t.queue = [];\n t.sorter = opts.sorter || T.default_sorter;\n return t;\n },\n\n default_sorter: function (a, b) {\n return a.cost - b.cost;\n },\n\n /**\n * Add a new item to the queue and ensure the highest priority element\n * is at the front of the queue.\n */\n push: function (value, cost) {\n var item = {value: value, cost: cost};\n this.queue.push(item);\n this.queue.sort(this.sorter);\n },\n\n /**\n * Return the highest priority element in the queue.\n */\n pop: function () {\n return this.queue.shift();\n },\n\n empty: function () {\n return this.queue.length === 0;\n }\n }\n};\n\n\n// node.js module exports\nif (typeof module !== 'undefined') {\n module.exports = dijkstra;\n}\n","\"use strict\";\n\n/**\n * Copyright (c) 2013-present, Facebook, Inc.\n *\n * This source code is licensed under the MIT license found in the\n * LICENSE file in the root directory of this source tree.\n *\n * \n */\n\nfunction makeEmptyFunction(arg) {\n return function () {\n return arg;\n };\n}\n\n/**\n * This function accepts and discards inputs; it has no side effects. This is\n * primarily useful idiomatically for overridable function endpoints which\n * always need to be callable, since JS lacks a null-call idiom ala Cocoa.\n */\nvar emptyFunction = function emptyFunction() {};\n\nemptyFunction.thatReturns = makeEmptyFunction;\nemptyFunction.thatReturnsFalse = makeEmptyFunction(false);\nemptyFunction.thatReturnsTrue = makeEmptyFunction(true);\nemptyFunction.thatReturnsNull = makeEmptyFunction(null);\nemptyFunction.thatReturnsThis = function () {\n return this;\n};\nemptyFunction.thatReturnsArgument = function (arg) {\n return arg;\n};\n\nmodule.exports = emptyFunction;","/**\n * Copyright (c) 2013-present, Facebook, Inc.\n *\n * This source code is licensed under the MIT license found in the\n * LICENSE file in the root directory of this source tree.\n *\n */\n\n'use strict';\n\nvar emptyObject = {};\n\nif (process.env.NODE_ENV !== 'production') {\n Object.freeze(emptyObject);\n}\n\nmodule.exports = emptyObject;","/**\n * Copyright (c) 2013-present, Facebook, Inc.\n *\n * This source code is licensed under the MIT license found in the\n * LICENSE file in the root directory of this source tree.\n *\n */\n\n'use strict';\n\n/**\n * Use invariant() to assert state which your program assumes to be true.\n *\n * Provide sprintf-style format (only %s is supported) and arguments\n * to provide information about what broke and what you were\n * expecting.\n *\n * The invariant message will be stripped in production, but the invariant\n * will remain to ensure logic does not differ in production.\n */\n\nvar validateFormat = function validateFormat(format) {};\n\nif (process.env.NODE_ENV !== 'production') {\n validateFormat = function validateFormat(format) {\n if (format === undefined) {\n throw new Error('invariant requires an error message argument');\n }\n };\n}\n\nfunction invariant(condition, format, a, b, c, d, e, f) {\n validateFormat(format);\n\n if (!condition) {\n var error;\n if (format === undefined) {\n error = new Error('Minified exception occurred; use the non-minified dev environment ' + 'for the full error message and additional helpful warnings.');\n } else {\n var args = [a, b, c, d, e, f];\n var argIndex = 0;\n error = new Error(format.replace(/%s/g, function () {\n return args[argIndex++];\n }));\n error.name = 'Invariant Violation';\n }\n\n error.framesToPop = 1; // we don't care about invariant's own frame\n throw error;\n }\n}\n\nmodule.exports = invariant;","'use strict';\n\nconst hexCharacters = 'a-f\\\\d';\nconst match3or4Hex = `#?[${hexCharacters}]{3}[${hexCharacters}]?`;\nconst match6or8Hex = `#?[${hexCharacters}]{6}([${hexCharacters}]{2})?`;\nconst nonHexChars = new RegExp(`[^#${hexCharacters}]`, 'gi');\nconst validHexSize = new RegExp(`^${match3or4Hex}$|^${match6or8Hex}$`, 'i');\n\nmodule.exports = (hex, options = {}) => {\n\tif (typeof hex !== 'string' || nonHexChars.test(hex) || !validHexSize.test(hex)) {\n\t\tthrow new TypeError('Expected a valid hex string');\n\t}\n\n\thex = hex.replace(/^#/, '');\n\tlet alphaFromHex = 1;\n\n\tif (hex.length === 8) {\n\t\talphaFromHex = Number.parseInt(hex.slice(6, 8), 16) / 255;\n\t\thex = hex.slice(0, 6);\n\t}\n\n\tif (hex.length === 4) {\n\t\talphaFromHex = Number.parseInt(hex.slice(3, 4).repeat(2), 16) / 255;\n\t\thex = hex.slice(0, 3);\n\t}\n\n\tif (hex.length === 3) {\n\t\thex = hex[0] + hex[0] + hex[1] + hex[1] + hex[2] + hex[2];\n\t}\n\n\tconst number = Number.parseInt(hex, 16);\n\tconst red = number >> 16;\n\tconst green = (number >> 8) & 255;\n\tconst blue = number & 255;\n\tconst alpha = typeof options.alpha === 'number' ? options.alpha : alphaFromHex;\n\n\tif (options.format === 'array') {\n\t\treturn [red, green, blue, alpha];\n\t}\n\n\tif (options.format === 'css') {\n\t\tconst alphaString = alpha === 1 ? '' : ` / ${Number((alpha * 100).toFixed(2))}%`;\n\t\treturn `rgb(${red} ${green} ${blue}${alphaString})`;\n\t}\n\n\treturn {red, green, blue, alpha};\n};\n","/*! ieee754. BSD-3-Clause License. Feross Aboukhadijeh */\nexports.read = function (buffer, offset, isLE, mLen, nBytes) {\n var e, m\n var eLen = (nBytes * 8) - mLen - 1\n var eMax = (1 << eLen) - 1\n var eBias = eMax >> 1\n var nBits = -7\n var i = isLE ? (nBytes - 1) : 0\n var d = isLE ? -1 : 1\n var s = buffer[offset + i]\n\n i += d\n\n e = s & ((1 << (-nBits)) - 1)\n s >>= (-nBits)\n nBits += eLen\n for (; nBits > 0; e = (e * 256) + buffer[offset + i], i += d, nBits -= 8) {}\n\n m = e & ((1 << (-nBits)) - 1)\n e >>= (-nBits)\n nBits += mLen\n for (; nBits > 0; m = (m * 256) + buffer[offset + i], i += d, nBits -= 8) {}\n\n if (e === 0) {\n e = 1 - eBias\n } else if (e === eMax) {\n return m ? NaN : ((s ? -1 : 1) * Infinity)\n } else {\n m = m + Math.pow(2, mLen)\n e = e - eBias\n }\n return (s ? -1 : 1) * m * Math.pow(2, e - mLen)\n}\n\nexports.write = function (buffer, value, offset, isLE, mLen, nBytes) {\n var e, m, c\n var eLen = (nBytes * 8) - mLen - 1\n var eMax = (1 << eLen) - 1\n var eBias = eMax >> 1\n var rt = (mLen === 23 ? Math.pow(2, -24) - Math.pow(2, -77) : 0)\n var i = isLE ? 0 : (nBytes - 1)\n var d = isLE ? 1 : -1\n var s = value < 0 || (value === 0 && 1 / value < 0) ? 1 : 0\n\n value = Math.abs(value)\n\n if (isNaN(value) || value === Infinity) {\n m = isNaN(value) ? 1 : 0\n e = eMax\n } else {\n e = Math.floor(Math.log(value) / Math.LN2)\n if (value * (c = Math.pow(2, -e)) < 1) {\n e--\n c *= 2\n }\n if (e + eBias >= 1) {\n value += rt / c\n } else {\n value += rt * Math.pow(2, 1 - eBias)\n }\n if (value * c >= 2) {\n e++\n c /= 2\n }\n\n if (e + eBias >= eMax) {\n m = 0\n e = eMax\n } else if (e + eBias >= 1) {\n m = ((value * c) - 1) * Math.pow(2, mLen)\n e = e + eBias\n } else {\n m = value * Math.pow(2, eBias - 1) * Math.pow(2, mLen)\n e = 0\n }\n }\n\n for (; mLen >= 8; buffer[offset + i] = m & 0xff, i += d, m /= 256, mLen -= 8) {}\n\n e = (e << mLen) | m\n eLen += mLen\n for (; eLen > 0; buffer[offset + i] = e & 0xff, i += d, e /= 256, eLen -= 8) {}\n\n buffer[offset + i - d] |= s * 128\n}\n","var toString = {}.toString;\n\nmodule.exports = Array.isArray || function (arr) {\n return toString.call(arr) == '[object Array]';\n};\n","/**\n * A specialized version of `_.map` for arrays without support for iteratee\n * shorthands.\n *\n * @private\n * @param {Array} [array] The array to iterate over.\n * @param {Function} iteratee The function invoked per iteration.\n * @returns {Array} Returns the new mapped array.\n */\nfunction arrayMap(array, iteratee) {\n var index = -1,\n length = array == null ? 0 : array.length,\n result = Array(length);\n\n while (++index < length) {\n result[index] = iteratee(array[index], index, array);\n }\n return result;\n}\n\nmodule.exports = arrayMap;\n","/**\n * A specialized version of `_.reduce` for arrays without support for\n * iteratee shorthands.\n *\n * @private\n * @param {Array} [array] The array to iterate over.\n * @param {Function} iteratee The function invoked per iteration.\n * @param {*} [accumulator] The initial value.\n * @param {boolean} [initAccum] Specify using the first element of `array` as\n * the initial value.\n * @returns {*} Returns the accumulated value.\n */\nfunction arrayReduce(array, iteratee, accumulator, initAccum) {\n var index = -1,\n length = array == null ? 0 : array.length;\n\n if (initAccum && length) {\n accumulator = array[++index];\n }\n while (++index < length) {\n accumulator = iteratee(accumulator, array[index], index, array);\n }\n return accumulator;\n}\n\nmodule.exports = arrayReduce;\n","/**\n * Converts an ASCII `string` to an array.\n *\n * @private\n * @param {string} string The string to convert.\n * @returns {Array} Returns the converted array.\n */\nfunction asciiToArray(string) {\n return string.split('');\n}\n\nmodule.exports = asciiToArray;\n","/** Used to match words composed of alphanumeric characters. */\nvar reAsciiWord = /[^\\x00-\\x2f\\x3a-\\x40\\x5b-\\x60\\x7b-\\x7f]+/g;\n\n/**\n * Splits an ASCII `string` into an array of its words.\n *\n * @private\n * @param {string} The string to inspect.\n * @returns {Array} Returns the words of `string`.\n */\nfunction asciiWords(string) {\n return string.match(reAsciiWord) || [];\n}\n\nmodule.exports = asciiWords;\n","/**\n * The base implementation of `_.propertyOf` without support for deep paths.\n *\n * @private\n * @param {Object} object The object to query.\n * @returns {Function} Returns the new accessor function.\n */\nfunction basePropertyOf(object) {\n return function(key) {\n return object == null ? undefined : object[key];\n };\n}\n\nmodule.exports = basePropertyOf;\n","/**\n * The base implementation of `_.slice` without an iteratee call guard.\n *\n * @private\n * @param {Array} array The array to slice.\n * @param {number} [start=0] The start position.\n * @param {number} [end=array.length] The end position.\n * @returns {Array} Returns the slice of `array`.\n */\nfunction baseSlice(array, start, end) {\n var index = -1,\n length = array.length;\n\n if (start < 0) {\n start = -start > length ? 0 : (length + start);\n }\n end = end > length ? length : end;\n if (end < 0) {\n end += length;\n }\n length = start > end ? 0 : ((end - start) >>> 0);\n start >>>= 0;\n\n var result = Array(length);\n while (++index < length) {\n result[index] = array[index + start];\n }\n return result;\n}\n\nmodule.exports = baseSlice;\n","var Symbol = require('./_Symbol'),\n arrayMap = require('./_arrayMap'),\n isArray = require('./isArray'),\n isSymbol = require('./isSymbol');\n\n/** Used as references for various `Number` constants. */\nvar INFINITY = 1 / 0;\n\n/** Used to convert symbols to primitives and strings. */\nvar symbolProto = Symbol ? Symbol.prototype : undefined,\n symbolToString = symbolProto ? symbolProto.toString : undefined;\n\n/**\n * The base implementation of `_.toString` which doesn't convert nullish\n * values to empty strings.\n *\n * @private\n * @param {*} value The value to process.\n * @returns {string} Returns the string.\n */\nfunction baseToString(value) {\n // Exit early for strings to avoid a performance hit in some environments.\n if (typeof value == 'string') {\n return value;\n }\n if (isArray(value)) {\n // Recursively convert values (susceptible to call stack limits).\n return arrayMap(value, baseToString) + '';\n }\n if (isSymbol(value)) {\n return symbolToString ? symbolToString.call(value) : '';\n }\n var result = (value + '');\n return (result == '0' && (1 / value) == -INFINITY) ? '-0' : result;\n}\n\nmodule.exports = baseToString;\n","var baseSlice = require('./_baseSlice');\n\n/**\n * Casts `array` to a slice if it's needed.\n *\n * @private\n * @param {Array} array The array to inspect.\n * @param {number} start The start position.\n * @param {number} [end=array.length] The end position.\n * @returns {Array} Returns the cast slice.\n */\nfunction castSlice(array, start, end) {\n var length = array.length;\n end = end === undefined ? length : end;\n return (!start && end >= length) ? array : baseSlice(array, start, end);\n}\n\nmodule.exports = castSlice;\n","var castSlice = require('./_castSlice'),\n hasUnicode = require('./_hasUnicode'),\n stringToArray = require('./_stringToArray'),\n toString = require('./toString');\n\n/**\n * Creates a function like `_.lowerFirst`.\n *\n * @private\n * @param {string} methodName The name of the `String` case method to use.\n * @returns {Function} Returns the new case function.\n */\nfunction createCaseFirst(methodName) {\n return function(string) {\n string = toString(string);\n\n var strSymbols = hasUnicode(string)\n ? stringToArray(string)\n : undefined;\n\n var chr = strSymbols\n ? strSymbols[0]\n : string.charAt(0);\n\n var trailing = strSymbols\n ? castSlice(strSymbols, 1).join('')\n : string.slice(1);\n\n return chr[methodName]() + trailing;\n };\n}\n\nmodule.exports = createCaseFirst;\n","var arrayReduce = require('./_arrayReduce'),\n deburr = require('./deburr'),\n words = require('./words');\n\n/** Used to compose unicode capture groups. */\nvar rsApos = \"['\\u2019]\";\n\n/** Used to match apostrophes. */\nvar reApos = RegExp(rsApos, 'g');\n\n/**\n * Creates a function like `_.camelCase`.\n *\n * @private\n * @param {Function} callback The function to combine each word.\n * @returns {Function} Returns the new compounder function.\n */\nfunction createCompounder(callback) {\n return function(string) {\n return arrayReduce(words(deburr(string).replace(reApos, '')), callback, '');\n };\n}\n\nmodule.exports = createCompounder;\n","var basePropertyOf = require('./_basePropertyOf');\n\n/** Used to map Latin Unicode letters to basic Latin letters. */\nvar deburredLetters = {\n // Latin-1 Supplement block.\n '\\xc0': 'A', '\\xc1': 'A', '\\xc2': 'A', '\\xc3': 'A', '\\xc4': 'A', '\\xc5': 'A',\n '\\xe0': 'a', '\\xe1': 'a', '\\xe2': 'a', '\\xe3': 'a', '\\xe4': 'a', '\\xe5': 'a',\n '\\xc7': 'C', '\\xe7': 'c',\n '\\xd0': 'D', '\\xf0': 'd',\n '\\xc8': 'E', '\\xc9': 'E', '\\xca': 'E', '\\xcb': 'E',\n '\\xe8': 'e', '\\xe9': 'e', '\\xea': 'e', '\\xeb': 'e',\n '\\xcc': 'I', '\\xcd': 'I', '\\xce': 'I', '\\xcf': 'I',\n '\\xec': 'i', '\\xed': 'i', '\\xee': 'i', '\\xef': 'i',\n '\\xd1': 'N', '\\xf1': 'n',\n '\\xd2': 'O', '\\xd3': 'O', '\\xd4': 'O', '\\xd5': 'O', '\\xd6': 'O', '\\xd8': 'O',\n '\\xf2': 'o', '\\xf3': 'o', '\\xf4': 'o', '\\xf5': 'o', '\\xf6': 'o', '\\xf8': 'o',\n '\\xd9': 'U', '\\xda': 'U', '\\xdb': 'U', '\\xdc': 'U',\n '\\xf9': 'u', '\\xfa': 'u', '\\xfb': 'u', '\\xfc': 'u',\n '\\xdd': 'Y', '\\xfd': 'y', '\\xff': 'y',\n '\\xc6': 'Ae', '\\xe6': 'ae',\n '\\xde': 'Th', '\\xfe': 'th',\n '\\xdf': 'ss',\n // Latin Extended-A block.\n '\\u0100': 'A', '\\u0102': 'A', '\\u0104': 'A',\n '\\u0101': 'a', '\\u0103': 'a', '\\u0105': 'a',\n '\\u0106': 'C', '\\u0108': 'C', '\\u010a': 'C', '\\u010c': 'C',\n '\\u0107': 'c', '\\u0109': 'c', '\\u010b': 'c', '\\u010d': 'c',\n '\\u010e': 'D', '\\u0110': 'D', '\\u010f': 'd', '\\u0111': 'd',\n '\\u0112': 'E', '\\u0114': 'E', '\\u0116': 'E', '\\u0118': 'E', '\\u011a': 'E',\n '\\u0113': 'e', '\\u0115': 'e', '\\u0117': 'e', '\\u0119': 'e', '\\u011b': 'e',\n '\\u011c': 'G', '\\u011e': 'G', '\\u0120': 'G', '\\u0122': 'G',\n '\\u011d': 'g', '\\u011f': 'g', '\\u0121': 'g', '\\u0123': 'g',\n '\\u0124': 'H', '\\u0126': 'H', '\\u0125': 'h', '\\u0127': 'h',\n '\\u0128': 'I', '\\u012a': 'I', '\\u012c': 'I', '\\u012e': 'I', '\\u0130': 'I',\n '\\u0129': 'i', '\\u012b': 'i', '\\u012d': 'i', '\\u012f': 'i', '\\u0131': 'i',\n '\\u0134': 'J', '\\u0135': 'j',\n '\\u0136': 'K', '\\u0137': 'k', '\\u0138': 'k',\n '\\u0139': 'L', '\\u013b': 'L', '\\u013d': 'L', '\\u013f': 'L', '\\u0141': 'L',\n '\\u013a': 'l', '\\u013c': 'l', '\\u013e': 'l', '\\u0140': 'l', '\\u0142': 'l',\n '\\u0143': 'N', '\\u0145': 'N', '\\u0147': 'N', '\\u014a': 'N',\n '\\u0144': 'n', '\\u0146': 'n', '\\u0148': 'n', '\\u014b': 'n',\n '\\u014c': 'O', '\\u014e': 'O', '\\u0150': 'O',\n '\\u014d': 'o', '\\u014f': 'o', '\\u0151': 'o',\n '\\u0154': 'R', '\\u0156': 'R', '\\u0158': 'R',\n '\\u0155': 'r', '\\u0157': 'r', '\\u0159': 'r',\n '\\u015a': 'S', '\\u015c': 'S', '\\u015e': 'S', '\\u0160': 'S',\n '\\u015b': 's', '\\u015d': 's', '\\u015f': 's', '\\u0161': 's',\n '\\u0162': 'T', '\\u0164': 'T', '\\u0166': 'T',\n '\\u0163': 't', '\\u0165': 't', '\\u0167': 't',\n '\\u0168': 'U', '\\u016a': 'U', '\\u016c': 'U', '\\u016e': 'U', '\\u0170': 'U', '\\u0172': 'U',\n '\\u0169': 'u', '\\u016b': 'u', '\\u016d': 'u', '\\u016f': 'u', '\\u0171': 'u', '\\u0173': 'u',\n '\\u0174': 'W', '\\u0175': 'w',\n '\\u0176': 'Y', '\\u0177': 'y', '\\u0178': 'Y',\n '\\u0179': 'Z', '\\u017b': 'Z', '\\u017d': 'Z',\n '\\u017a': 'z', '\\u017c': 'z', '\\u017e': 'z',\n '\\u0132': 'IJ', '\\u0133': 'ij',\n '\\u0152': 'Oe', '\\u0153': 'oe',\n '\\u0149': \"'n\", '\\u017f': 's'\n};\n\n/**\n * Used by `_.deburr` to convert Latin-1 Supplement and Latin Extended-A\n * letters to basic Latin letters.\n *\n * @private\n * @param {string} letter The matched letter to deburr.\n * @returns {string} Returns the deburred letter.\n */\nvar deburrLetter = basePropertyOf(deburredLetters);\n\nmodule.exports = deburrLetter;\n","/** Used to compose unicode character classes. */\nvar rsAstralRange = '\\\\ud800-\\\\udfff',\n rsComboMarksRange = '\\\\u0300-\\\\u036f',\n reComboHalfMarksRange = '\\\\ufe20-\\\\ufe2f',\n rsComboSymbolsRange = '\\\\u20d0-\\\\u20ff',\n rsComboRange = rsComboMarksRange + reComboHalfMarksRange + rsComboSymbolsRange,\n rsVarRange = '\\\\ufe0e\\\\ufe0f';\n\n/** Used to compose unicode capture groups. */\nvar rsZWJ = '\\\\u200d';\n\n/** Used to detect strings with [zero-width joiners or code points from the astral planes](http://eev.ee/blog/2015/09/12/dark-corners-of-unicode/). */\nvar reHasUnicode = RegExp('[' + rsZWJ + rsAstralRange + rsComboRange + rsVarRange + ']');\n\n/**\n * Checks if `string` contains Unicode symbols.\n *\n * @private\n * @param {string} string The string to inspect.\n * @returns {boolean} Returns `true` if a symbol is found, else `false`.\n */\nfunction hasUnicode(string) {\n return reHasUnicode.test(string);\n}\n\nmodule.exports = hasUnicode;\n","/** Used to detect strings that need a more robust regexp to match words. */\nvar reHasUnicodeWord = /[a-z][A-Z]|[A-Z]{2}[a-z]|[0-9][a-zA-Z]|[a-zA-Z][0-9]|[^a-zA-Z0-9 ]/;\n\n/**\n * Checks if `string` contains a word composed of Unicode symbols.\n *\n * @private\n * @param {string} string The string to inspect.\n * @returns {boolean} Returns `true` if a word is found, else `false`.\n */\nfunction hasUnicodeWord(string) {\n return reHasUnicodeWord.test(string);\n}\n\nmodule.exports = hasUnicodeWord;\n","var asciiToArray = require('./_asciiToArray'),\n hasUnicode = require('./_hasUnicode'),\n unicodeToArray = require('./_unicodeToArray');\n\n/**\n * Converts `string` to an array.\n *\n * @private\n * @param {string} string The string to convert.\n * @returns {Array} Returns the converted array.\n */\nfunction stringToArray(string) {\n return hasUnicode(string)\n ? unicodeToArray(string)\n : asciiToArray(string);\n}\n\nmodule.exports = stringToArray;\n","/** Used to compose unicode character classes. */\nvar rsAstralRange = '\\\\ud800-\\\\udfff',\n rsComboMarksRange = '\\\\u0300-\\\\u036f',\n reComboHalfMarksRange = '\\\\ufe20-\\\\ufe2f',\n rsComboSymbolsRange = '\\\\u20d0-\\\\u20ff',\n rsComboRange = rsComboMarksRange + reComboHalfMarksRange + rsComboSymbolsRange,\n rsVarRange = '\\\\ufe0e\\\\ufe0f';\n\n/** Used to compose unicode capture groups. */\nvar rsAstral = '[' + rsAstralRange + ']',\n rsCombo = '[' + rsComboRange + ']',\n rsFitz = '\\\\ud83c[\\\\udffb-\\\\udfff]',\n rsModifier = '(?:' + rsCombo + '|' + rsFitz + ')',\n rsNonAstral = '[^' + rsAstralRange + ']',\n rsRegional = '(?:\\\\ud83c[\\\\udde6-\\\\uddff]){2}',\n rsSurrPair = '[\\\\ud800-\\\\udbff][\\\\udc00-\\\\udfff]',\n rsZWJ = '\\\\u200d';\n\n/** Used to compose unicode regexes. */\nvar reOptMod = rsModifier + '?',\n rsOptVar = '[' + rsVarRange + ']?',\n rsOptJoin = '(?:' + rsZWJ + '(?:' + [rsNonAstral, rsRegional, rsSurrPair].join('|') + ')' + rsOptVar + reOptMod + ')*',\n rsSeq = rsOptVar + reOptMod + rsOptJoin,\n rsSymbol = '(?:' + [rsNonAstral + rsCombo + '?', rsCombo, rsRegional, rsSurrPair, rsAstral].join('|') + ')';\n\n/** Used to match [string symbols](https://mathiasbynens.be/notes/javascript-unicode). */\nvar reUnicode = RegExp(rsFitz + '(?=' + rsFitz + ')|' + rsSymbol + rsSeq, 'g');\n\n/**\n * Converts a Unicode `string` to an array.\n *\n * @private\n * @param {string} string The string to convert.\n * @returns {Array} Returns the converted array.\n */\nfunction unicodeToArray(string) {\n return string.match(reUnicode) || [];\n}\n\nmodule.exports = unicodeToArray;\n","/** Used to compose unicode character classes. */\nvar rsAstralRange = '\\\\ud800-\\\\udfff',\n rsComboMarksRange = '\\\\u0300-\\\\u036f',\n reComboHalfMarksRange = '\\\\ufe20-\\\\ufe2f',\n rsComboSymbolsRange = '\\\\u20d0-\\\\u20ff',\n rsComboRange = rsComboMarksRange + reComboHalfMarksRange + rsComboSymbolsRange,\n rsDingbatRange = '\\\\u2700-\\\\u27bf',\n rsLowerRange = 'a-z\\\\xdf-\\\\xf6\\\\xf8-\\\\xff',\n rsMathOpRange = '\\\\xac\\\\xb1\\\\xd7\\\\xf7',\n rsNonCharRange = '\\\\x00-\\\\x2f\\\\x3a-\\\\x40\\\\x5b-\\\\x60\\\\x7b-\\\\xbf',\n rsPunctuationRange = '\\\\u2000-\\\\u206f',\n rsSpaceRange = ' \\\\t\\\\x0b\\\\f\\\\xa0\\\\ufeff\\\\n\\\\r\\\\u2028\\\\u2029\\\\u1680\\\\u180e\\\\u2000\\\\u2001\\\\u2002\\\\u2003\\\\u2004\\\\u2005\\\\u2006\\\\u2007\\\\u2008\\\\u2009\\\\u200a\\\\u202f\\\\u205f\\\\u3000',\n rsUpperRange = 'A-Z\\\\xc0-\\\\xd6\\\\xd8-\\\\xde',\n rsVarRange = '\\\\ufe0e\\\\ufe0f',\n rsBreakRange = rsMathOpRange + rsNonCharRange + rsPunctuationRange + rsSpaceRange;\n\n/** Used to compose unicode capture groups. */\nvar rsApos = \"['\\u2019]\",\n rsBreak = '[' + rsBreakRange + ']',\n rsCombo = '[' + rsComboRange + ']',\n rsDigits = '\\\\d+',\n rsDingbat = '[' + rsDingbatRange + ']',\n rsLower = '[' + rsLowerRange + ']',\n rsMisc = '[^' + rsAstralRange + rsBreakRange + rsDigits + rsDingbatRange + rsLowerRange + rsUpperRange + ']',\n rsFitz = '\\\\ud83c[\\\\udffb-\\\\udfff]',\n rsModifier = '(?:' + rsCombo + '|' + rsFitz + ')',\n rsNonAstral = '[^' + rsAstralRange + ']',\n rsRegional = '(?:\\\\ud83c[\\\\udde6-\\\\uddff]){2}',\n rsSurrPair = '[\\\\ud800-\\\\udbff][\\\\udc00-\\\\udfff]',\n rsUpper = '[' + rsUpperRange + ']',\n rsZWJ = '\\\\u200d';\n\n/** Used to compose unicode regexes. */\nvar rsMiscLower = '(?:' + rsLower + '|' + rsMisc + ')',\n rsMiscUpper = '(?:' + rsUpper + '|' + rsMisc + ')',\n rsOptContrLower = '(?:' + rsApos + '(?:d|ll|m|re|s|t|ve))?',\n rsOptContrUpper = '(?:' + rsApos + '(?:D|LL|M|RE|S|T|VE))?',\n reOptMod = rsModifier + '?',\n rsOptVar = '[' + rsVarRange + ']?',\n rsOptJoin = '(?:' + rsZWJ + '(?:' + [rsNonAstral, rsRegional, rsSurrPair].join('|') + ')' + rsOptVar + reOptMod + ')*',\n rsOrdLower = '\\\\d*(?:1st|2nd|3rd|(?![123])\\\\dth)(?=\\\\b|[A-Z_])',\n rsOrdUpper = '\\\\d*(?:1ST|2ND|3RD|(?![123])\\\\dTH)(?=\\\\b|[a-z_])',\n rsSeq = rsOptVar + reOptMod + rsOptJoin,\n rsEmoji = '(?:' + [rsDingbat, rsRegional, rsSurrPair].join('|') + ')' + rsSeq;\n\n/** Used to match complex or compound words. */\nvar reUnicodeWord = RegExp([\n rsUpper + '?' + rsLower + '+' + rsOptContrLower + '(?=' + [rsBreak, rsUpper, '$'].join('|') + ')',\n rsMiscUpper + '+' + rsOptContrUpper + '(?=' + [rsBreak, rsUpper + rsMiscLower, '$'].join('|') + ')',\n rsUpper + '?' + rsMiscLower + '+' + rsOptContrLower,\n rsUpper + '+' + rsOptContrUpper,\n rsOrdUpper,\n rsOrdLower,\n rsDigits,\n rsEmoji\n].join('|'), 'g');\n\n/**\n * Splits a Unicode `string` into an array of its words.\n *\n * @private\n * @param {string} The string to inspect.\n * @returns {Array} Returns the words of `string`.\n */\nfunction unicodeWords(string) {\n return string.match(reUnicodeWord) || [];\n}\n\nmodule.exports = unicodeWords;\n","var deburrLetter = require('./_deburrLetter'),\n toString = require('./toString');\n\n/** Used to match Latin Unicode letters (excluding mathematical operators). */\nvar reLatin = /[\\xc0-\\xd6\\xd8-\\xf6\\xf8-\\xff\\u0100-\\u017f]/g;\n\n/** Used to compose unicode character classes. */\nvar rsComboMarksRange = '\\\\u0300-\\\\u036f',\n reComboHalfMarksRange = '\\\\ufe20-\\\\ufe2f',\n rsComboSymbolsRange = '\\\\u20d0-\\\\u20ff',\n rsComboRange = rsComboMarksRange + reComboHalfMarksRange + rsComboSymbolsRange;\n\n/** Used to compose unicode capture groups. */\nvar rsCombo = '[' + rsComboRange + ']';\n\n/**\n * Used to match [combining diacritical marks](https://en.wikipedia.org/wiki/Combining_Diacritical_Marks) and\n * [combining diacritical marks for symbols](https://en.wikipedia.org/wiki/Combining_Diacritical_Marks_for_Symbols).\n */\nvar reComboMark = RegExp(rsCombo, 'g');\n\n/**\n * Deburrs `string` by converting\n * [Latin-1 Supplement](https://en.wikipedia.org/wiki/Latin-1_Supplement_(Unicode_block)#Character_table)\n * and [Latin Extended-A](https://en.wikipedia.org/wiki/Latin_Extended-A)\n * letters to basic Latin letters and removing\n * [combining diacritical marks](https://en.wikipedia.org/wiki/Combining_Diacritical_Marks).\n *\n * @static\n * @memberOf _\n * @since 3.0.0\n * @category String\n * @param {string} [string=''] The string to deburr.\n * @returns {string} Returns the deburred string.\n * @example\n *\n * _.deburr('déjà vu');\n * // => 'deja vu'\n */\nfunction deburr(string) {\n string = toString(string);\n return string && string.replace(reLatin, deburrLetter).replace(reComboMark, '');\n}\n\nmodule.exports = deburr;\n","var createCompounder = require('./_createCompounder'),\n upperFirst = require('./upperFirst');\n\n/**\n * Converts `string` to\n * [start case](https://en.wikipedia.org/wiki/Letter_case#Stylistic_or_specialised_usage).\n *\n * @static\n * @memberOf _\n * @since 3.1.0\n * @category String\n * @param {string} [string=''] The string to convert.\n * @returns {string} Returns the start cased string.\n * @example\n *\n * _.startCase('--foo-bar--');\n * // => 'Foo Bar'\n *\n * _.startCase('fooBar');\n * // => 'Foo Bar'\n *\n * _.startCase('__FOO_BAR__');\n * // => 'FOO BAR'\n */\nvar startCase = createCompounder(function(result, word, index) {\n return result + (index ? ' ' : '') + upperFirst(word);\n});\n\nmodule.exports = startCase;\n","var baseToString = require('./_baseToString');\n\n/**\n * Converts `value` to a string. An empty string is returned for `null`\n * and `undefined` values. The sign of `-0` is preserved.\n *\n * @static\n * @memberOf _\n * @since 4.0.0\n * @category Lang\n * @param {*} value The value to convert.\n * @returns {string} Returns the converted string.\n * @example\n *\n * _.toString(null);\n * // => ''\n *\n * _.toString(-0);\n * // => '-0'\n *\n * _.toString([1, 2, 3]);\n * // => '1,2,3'\n */\nfunction toString(value) {\n return value == null ? '' : baseToString(value);\n}\n\nmodule.exports = toString;\n","var createCaseFirst = require('./_createCaseFirst');\n\n/**\n * Converts the first character of `string` to upper case.\n *\n * @static\n * @memberOf _\n * @since 4.0.0\n * @category String\n * @param {string} [string=''] The string to convert.\n * @returns {string} Returns the converted string.\n * @example\n *\n * _.upperFirst('fred');\n * // => 'Fred'\n *\n * _.upperFirst('FRED');\n * // => 'FRED'\n */\nvar upperFirst = createCaseFirst('toUpperCase');\n\nmodule.exports = upperFirst;\n","var asciiWords = require('./_asciiWords'),\n hasUnicodeWord = require('./_hasUnicodeWord'),\n toString = require('./toString'),\n unicodeWords = require('./_unicodeWords');\n\n/**\n * Splits `string` into an array of its words.\n *\n * @static\n * @memberOf _\n * @since 3.0.0\n * @category String\n * @param {string} [string=''] The string to inspect.\n * @param {RegExp|string} [pattern] The pattern to match words.\n * @param- {Object} [guard] Enables use as an iteratee for methods like `_.map`.\n * @returns {Array} Returns the words of `string`.\n * @example\n *\n * _.words('fred, barney, & pebbles');\n * // => ['fred', 'barney', 'pebbles']\n *\n * _.words('fred, barney, & pebbles', /[^, ]+/g);\n * // => ['fred', 'barney', '&', 'pebbles']\n */\nfunction words(string, pattern, guard) {\n string = toString(string);\n pattern = guard ? undefined : pattern;\n\n if (pattern === undefined) {\n return hasUnicodeWord(string) ? unicodeWords(string) : asciiWords(string);\n }\n return string.match(pattern) || [];\n}\n\nmodule.exports = words;\n","module.exports = Long;\r\n\r\n/**\r\n * wasm optimizations, to do native i64 multiplication and divide\r\n */\r\nvar wasm = null;\r\n\r\ntry {\r\n wasm = new WebAssembly.Instance(new WebAssembly.Module(new Uint8Array([\r\n 0, 97, 115, 109, 1, 0, 0, 0, 1, 13, 2, 96, 0, 1, 127, 96, 4, 127, 127, 127, 127, 1, 127, 3, 7, 6, 0, 1, 1, 1, 1, 1, 6, 6, 1, 127, 1, 65, 0, 11, 7, 50, 6, 3, 109, 117, 108, 0, 1, 5, 100, 105, 118, 95, 115, 0, 2, 5, 100, 105, 118, 95, 117, 0, 3, 5, 114, 101, 109, 95, 115, 0, 4, 5, 114, 101, 109, 95, 117, 0, 5, 8, 103, 101, 116, 95, 104, 105, 103, 104, 0, 0, 10, 191, 1, 6, 4, 0, 35, 0, 11, 36, 1, 1, 126, 32, 0, 173, 32, 1, 173, 66, 32, 134, 132, 32, 2, 173, 32, 3, 173, 66, 32, 134, 132, 126, 34, 4, 66, 32, 135, 167, 36, 0, 32, 4, 167, 11, 36, 1, 1, 126, 32, 0, 173, 32, 1, 173, 66, 32, 134, 132, 32, 2, 173, 32, 3, 173, 66, 32, 134, 132, 127, 34, 4, 66, 32, 135, 167, 36, 0, 32, 4, 167, 11, 36, 1, 1, 126, 32, 0, 173, 32, 1, 173, 66, 32, 134, 132, 32, 2, 173, 32, 3, 173, 66, 32, 134, 132, 128, 34, 4, 66, 32, 135, 167, 36, 0, 32, 4, 167, 11, 36, 1, 1, 126, 32, 0, 173, 32, 1, 173, 66, 32, 134, 132, 32, 2, 173, 32, 3, 173, 66, 32, 134, 132, 129, 34, 4, 66, 32, 135, 167, 36, 0, 32, 4, 167, 11, 36, 1, 1, 126, 32, 0, 173, 32, 1, 173, 66, 32, 134, 132, 32, 2, 173, 32, 3, 173, 66, 32, 134, 132, 130, 34, 4, 66, 32, 135, 167, 36, 0, 32, 4, 167, 11\r\n ])), {}).exports;\r\n} catch (e) {\r\n // no wasm support :(\r\n}\r\n\r\n/**\r\n * Constructs a 64 bit two's-complement integer, given its low and high 32 bit values as *signed* integers.\r\n * See the from* functions below for more convenient ways of constructing Longs.\r\n * @exports Long\r\n * @class A Long class for representing a 64 bit two's-complement integer value.\r\n * @param {number} low The low (signed) 32 bits of the long\r\n * @param {number} high The high (signed) 32 bits of the long\r\n * @param {boolean=} unsigned Whether unsigned or not, defaults to signed\r\n * @constructor\r\n */\r\nfunction Long(low, high, unsigned) {\r\n\r\n /**\r\n * The low 32 bits as a signed value.\r\n * @type {number}\r\n */\r\n this.low = low | 0;\r\n\r\n /**\r\n * The high 32 bits as a signed value.\r\n * @type {number}\r\n */\r\n this.high = high | 0;\r\n\r\n /**\r\n * Whether unsigned or not.\r\n * @type {boolean}\r\n */\r\n this.unsigned = !!unsigned;\r\n}\r\n\r\n// The internal representation of a long is the two given signed, 32-bit values.\r\n// We use 32-bit pieces because these are the size of integers on which\r\n// Javascript performs bit-operations. For operations like addition and\r\n// multiplication, we split each number into 16 bit pieces, which can easily be\r\n// multiplied within Javascript's floating-point representation without overflow\r\n// or change in sign.\r\n//\r\n// In the algorithms below, we frequently reduce the negative case to the\r\n// positive case by negating the input(s) and then post-processing the result.\r\n// Note that we must ALWAYS check specially whether those values are MIN_VALUE\r\n// (-2^63) because -MIN_VALUE == MIN_VALUE (since 2^63 cannot be represented as\r\n// a positive number, it overflows back into a negative). Not handling this\r\n// case would often result in infinite recursion.\r\n//\r\n// Common constant values ZERO, ONE, NEG_ONE, etc. are defined below the from*\r\n// methods on which they depend.\r\n\r\n/**\r\n * An indicator used to reliably determine if an object is a Long or not.\r\n * @type {boolean}\r\n * @const\r\n * @private\r\n */\r\nLong.prototype.__isLong__;\r\n\r\nObject.defineProperty(Long.prototype, \"__isLong__\", { value: true });\r\n\r\n/**\r\n * @function\r\n * @param {*} obj Object\r\n * @returns {boolean}\r\n * @inner\r\n */\r\nfunction isLong(obj) {\r\n return (obj && obj[\"__isLong__\"]) === true;\r\n}\r\n\r\n/**\r\n * Tests if the specified object is a Long.\r\n * @function\r\n * @param {*} obj Object\r\n * @returns {boolean}\r\n */\r\nLong.isLong = isLong;\r\n\r\n/**\r\n * A cache of the Long representations of small integer values.\r\n * @type {!Object}\r\n * @inner\r\n */\r\nvar INT_CACHE = {};\r\n\r\n/**\r\n * A cache of the Long representations of small unsigned integer values.\r\n * @type {!Object}\r\n * @inner\r\n */\r\nvar UINT_CACHE = {};\r\n\r\n/**\r\n * @param {number} value\r\n * @param {boolean=} unsigned\r\n * @returns {!Long}\r\n * @inner\r\n */\r\nfunction fromInt(value, unsigned) {\r\n var obj, cachedObj, cache;\r\n if (unsigned) {\r\n value >>>= 0;\r\n if (cache = (0 <= value && value < 256)) {\r\n cachedObj = UINT_CACHE[value];\r\n if (cachedObj)\r\n return cachedObj;\r\n }\r\n obj = fromBits(value, (value | 0) < 0 ? -1 : 0, true);\r\n if (cache)\r\n UINT_CACHE[value] = obj;\r\n return obj;\r\n } else {\r\n value |= 0;\r\n if (cache = (-128 <= value && value < 128)) {\r\n cachedObj = INT_CACHE[value];\r\n if (cachedObj)\r\n return cachedObj;\r\n }\r\n obj = fromBits(value, value < 0 ? -1 : 0, false);\r\n if (cache)\r\n INT_CACHE[value] = obj;\r\n return obj;\r\n }\r\n}\r\n\r\n/**\r\n * Returns a Long representing the given 32 bit integer value.\r\n * @function\r\n * @param {number} value The 32 bit integer in question\r\n * @param {boolean=} unsigned Whether unsigned or not, defaults to signed\r\n * @returns {!Long} The corresponding Long value\r\n */\r\nLong.fromInt = fromInt;\r\n\r\n/**\r\n * @param {number} value\r\n * @param {boolean=} unsigned\r\n * @returns {!Long}\r\n * @inner\r\n */\r\nfunction fromNumber(value, unsigned) {\r\n if (isNaN(value))\r\n return unsigned ? UZERO : ZERO;\r\n if (unsigned) {\r\n if (value < 0)\r\n return UZERO;\r\n if (value >= TWO_PWR_64_DBL)\r\n return MAX_UNSIGNED_VALUE;\r\n } else {\r\n if (value <= -TWO_PWR_63_DBL)\r\n return MIN_VALUE;\r\n if (value + 1 >= TWO_PWR_63_DBL)\r\n return MAX_VALUE;\r\n }\r\n if (value < 0)\r\n return fromNumber(-value, unsigned).neg();\r\n return fromBits((value % TWO_PWR_32_DBL) | 0, (value / TWO_PWR_32_DBL) | 0, unsigned);\r\n}\r\n\r\n/**\r\n * Returns a Long representing the given value, provided that it is a finite number. Otherwise, zero is returned.\r\n * @function\r\n * @param {number} value The number in question\r\n * @param {boolean=} unsigned Whether unsigned or not, defaults to signed\r\n * @returns {!Long} The corresponding Long value\r\n */\r\nLong.fromNumber = fromNumber;\r\n\r\n/**\r\n * @param {number} lowBits\r\n * @param {number} highBits\r\n * @param {boolean=} unsigned\r\n * @returns {!Long}\r\n * @inner\r\n */\r\nfunction fromBits(lowBits, highBits, unsigned) {\r\n return new Long(lowBits, highBits, unsigned);\r\n}\r\n\r\n/**\r\n * Returns a Long representing the 64 bit integer that comes by concatenating the given low and high bits. Each is\r\n * assumed to use 32 bits.\r\n * @function\r\n * @param {number} lowBits The low 32 bits\r\n * @param {number} highBits The high 32 bits\r\n * @param {boolean=} unsigned Whether unsigned or not, defaults to signed\r\n * @returns {!Long} The corresponding Long value\r\n */\r\nLong.fromBits = fromBits;\r\n\r\n/**\r\n * @function\r\n * @param {number} base\r\n * @param {number} exponent\r\n * @returns {number}\r\n * @inner\r\n */\r\nvar pow_dbl = Math.pow; // Used 4 times (4*8 to 15+4)\r\n\r\n/**\r\n * @param {string} str\r\n * @param {(boolean|number)=} unsigned\r\n * @param {number=} radix\r\n * @returns {!Long}\r\n * @inner\r\n */\r\nfunction fromString(str, unsigned, radix) {\r\n if (str.length === 0)\r\n throw Error('empty string');\r\n if (str === \"NaN\" || str === \"Infinity\" || str === \"+Infinity\" || str === \"-Infinity\")\r\n return ZERO;\r\n if (typeof unsigned === 'number') {\r\n // For goog.math.long compatibility\r\n radix = unsigned,\r\n unsigned = false;\r\n } else {\r\n unsigned = !! unsigned;\r\n }\r\n radix = radix || 10;\r\n if (radix < 2 || 36 < radix)\r\n throw RangeError('radix');\r\n\r\n var p;\r\n if ((p = str.indexOf('-')) > 0)\r\n throw Error('interior hyphen');\r\n else if (p === 0) {\r\n return fromString(str.substring(1), unsigned, radix).neg();\r\n }\r\n\r\n // Do several (8) digits each time through the loop, so as to\r\n // minimize the calls to the very expensive emulated div.\r\n var radixToPower = fromNumber(pow_dbl(radix, 8));\r\n\r\n var result = ZERO;\r\n for (var i = 0; i < str.length; i += 8) {\r\n var size = Math.min(8, str.length - i),\r\n value = parseInt(str.substring(i, i + size), radix);\r\n if (size < 8) {\r\n var power = fromNumber(pow_dbl(radix, size));\r\n result = result.mul(power).add(fromNumber(value));\r\n } else {\r\n result = result.mul(radixToPower);\r\n result = result.add(fromNumber(value));\r\n }\r\n }\r\n result.unsigned = unsigned;\r\n return result;\r\n}\r\n\r\n/**\r\n * Returns a Long representation of the given string, written using the specified radix.\r\n * @function\r\n * @param {string} str The textual representation of the Long\r\n * @param {(boolean|number)=} unsigned Whether unsigned or not, defaults to signed\r\n * @param {number=} radix The radix in which the text is written (2-36), defaults to 10\r\n * @returns {!Long} The corresponding Long value\r\n */\r\nLong.fromString = fromString;\r\n\r\n/**\r\n * @function\r\n * @param {!Long|number|string|!{low: number, high: number, unsigned: boolean}} val\r\n * @param {boolean=} unsigned\r\n * @returns {!Long}\r\n * @inner\r\n */\r\nfunction fromValue(val, unsigned) {\r\n if (typeof val === 'number')\r\n return fromNumber(val, unsigned);\r\n if (typeof val === 'string')\r\n return fromString(val, unsigned);\r\n // Throws for non-objects, converts non-instanceof Long:\r\n return fromBits(val.low, val.high, typeof unsigned === 'boolean' ? unsigned : val.unsigned);\r\n}\r\n\r\n/**\r\n * Converts the specified value to a Long using the appropriate from* function for its type.\r\n * @function\r\n * @param {!Long|number|string|!{low: number, high: number, unsigned: boolean}} val Value\r\n * @param {boolean=} unsigned Whether unsigned or not, defaults to signed\r\n * @returns {!Long}\r\n */\r\nLong.fromValue = fromValue;\r\n\r\n// NOTE: the compiler should inline these constant values below and then remove these variables, so there should be\r\n// no runtime penalty for these.\r\n\r\n/**\r\n * @type {number}\r\n * @const\r\n * @inner\r\n */\r\nvar TWO_PWR_16_DBL = 1 << 16;\r\n\r\n/**\r\n * @type {number}\r\n * @const\r\n * @inner\r\n */\r\nvar TWO_PWR_24_DBL = 1 << 24;\r\n\r\n/**\r\n * @type {number}\r\n * @const\r\n * @inner\r\n */\r\nvar TWO_PWR_32_DBL = TWO_PWR_16_DBL * TWO_PWR_16_DBL;\r\n\r\n/**\r\n * @type {number}\r\n * @const\r\n * @inner\r\n */\r\nvar TWO_PWR_64_DBL = TWO_PWR_32_DBL * TWO_PWR_32_DBL;\r\n\r\n/**\r\n * @type {number}\r\n * @const\r\n * @inner\r\n */\r\nvar TWO_PWR_63_DBL = TWO_PWR_64_DBL / 2;\r\n\r\n/**\r\n * @type {!Long}\r\n * @const\r\n * @inner\r\n */\r\nvar TWO_PWR_24 = fromInt(TWO_PWR_24_DBL);\r\n\r\n/**\r\n * @type {!Long}\r\n * @inner\r\n */\r\nvar ZERO = fromInt(0);\r\n\r\n/**\r\n * Signed zero.\r\n * @type {!Long}\r\n */\r\nLong.ZERO = ZERO;\r\n\r\n/**\r\n * @type {!Long}\r\n * @inner\r\n */\r\nvar UZERO = fromInt(0, true);\r\n\r\n/**\r\n * Unsigned zero.\r\n * @type {!Long}\r\n */\r\nLong.UZERO = UZERO;\r\n\r\n/**\r\n * @type {!Long}\r\n * @inner\r\n */\r\nvar ONE = fromInt(1);\r\n\r\n/**\r\n * Signed one.\r\n * @type {!Long}\r\n */\r\nLong.ONE = ONE;\r\n\r\n/**\r\n * @type {!Long}\r\n * @inner\r\n */\r\nvar UONE = fromInt(1, true);\r\n\r\n/**\r\n * Unsigned one.\r\n * @type {!Long}\r\n */\r\nLong.UONE = UONE;\r\n\r\n/**\r\n * @type {!Long}\r\n * @inner\r\n */\r\nvar NEG_ONE = fromInt(-1);\r\n\r\n/**\r\n * Signed negative one.\r\n * @type {!Long}\r\n */\r\nLong.NEG_ONE = NEG_ONE;\r\n\r\n/**\r\n * @type {!Long}\r\n * @inner\r\n */\r\nvar MAX_VALUE = fromBits(0xFFFFFFFF|0, 0x7FFFFFFF|0, false);\r\n\r\n/**\r\n * Maximum signed value.\r\n * @type {!Long}\r\n */\r\nLong.MAX_VALUE = MAX_VALUE;\r\n\r\n/**\r\n * @type {!Long}\r\n * @inner\r\n */\r\nvar MAX_UNSIGNED_VALUE = fromBits(0xFFFFFFFF|0, 0xFFFFFFFF|0, true);\r\n\r\n/**\r\n * Maximum unsigned value.\r\n * @type {!Long}\r\n */\r\nLong.MAX_UNSIGNED_VALUE = MAX_UNSIGNED_VALUE;\r\n\r\n/**\r\n * @type {!Long}\r\n * @inner\r\n */\r\nvar MIN_VALUE = fromBits(0, 0x80000000|0, false);\r\n\r\n/**\r\n * Minimum signed value.\r\n * @type {!Long}\r\n */\r\nLong.MIN_VALUE = MIN_VALUE;\r\n\r\n/**\r\n * @alias Long.prototype\r\n * @inner\r\n */\r\nvar LongPrototype = Long.prototype;\r\n\r\n/**\r\n * Converts the Long to a 32 bit integer, assuming it is a 32 bit integer.\r\n * @returns {number}\r\n */\r\nLongPrototype.toInt = function toInt() {\r\n return this.unsigned ? this.low >>> 0 : this.low;\r\n};\r\n\r\n/**\r\n * Converts the Long to a the nearest floating-point representation of this value (double, 53 bit mantissa).\r\n * @returns {number}\r\n */\r\nLongPrototype.toNumber = function toNumber() {\r\n if (this.unsigned)\r\n return ((this.high >>> 0) * TWO_PWR_32_DBL) + (this.low >>> 0);\r\n return this.high * TWO_PWR_32_DBL + (this.low >>> 0);\r\n};\r\n\r\n/**\r\n * Converts the Long to a string written in the specified radix.\r\n * @param {number=} radix Radix (2-36), defaults to 10\r\n * @returns {string}\r\n * @override\r\n * @throws {RangeError} If `radix` is out of range\r\n */\r\nLongPrototype.toString = function toString(radix) {\r\n radix = radix || 10;\r\n if (radix < 2 || 36 < radix)\r\n throw RangeError('radix');\r\n if (this.isZero())\r\n return '0';\r\n if (this.isNegative()) { // Unsigned Longs are never negative\r\n if (this.eq(MIN_VALUE)) {\r\n // We need to change the Long value before it can be negated, so we remove\r\n // the bottom-most digit in this base and then recurse to do the rest.\r\n var radixLong = fromNumber(radix),\r\n div = this.div(radixLong),\r\n rem1 = div.mul(radixLong).sub(this);\r\n return div.toString(radix) + rem1.toInt().toString(radix);\r\n } else\r\n return '-' + this.neg().toString(radix);\r\n }\r\n\r\n // Do several (6) digits each time through the loop, so as to\r\n // minimize the calls to the very expensive emulated div.\r\n var radixToPower = fromNumber(pow_dbl(radix, 6), this.unsigned),\r\n rem = this;\r\n var result = '';\r\n while (true) {\r\n var remDiv = rem.div(radixToPower),\r\n intval = rem.sub(remDiv.mul(radixToPower)).toInt() >>> 0,\r\n digits = intval.toString(radix);\r\n rem = remDiv;\r\n if (rem.isZero())\r\n return digits + result;\r\n else {\r\n while (digits.length < 6)\r\n digits = '0' + digits;\r\n result = '' + digits + result;\r\n }\r\n }\r\n};\r\n\r\n/**\r\n * Gets the high 32 bits as a signed integer.\r\n * @returns {number} Signed high bits\r\n */\r\nLongPrototype.getHighBits = function getHighBits() {\r\n return this.high;\r\n};\r\n\r\n/**\r\n * Gets the high 32 bits as an unsigned integer.\r\n * @returns {number} Unsigned high bits\r\n */\r\nLongPrototype.getHighBitsUnsigned = function getHighBitsUnsigned() {\r\n return this.high >>> 0;\r\n};\r\n\r\n/**\r\n * Gets the low 32 bits as a signed integer.\r\n * @returns {number} Signed low bits\r\n */\r\nLongPrototype.getLowBits = function getLowBits() {\r\n return this.low;\r\n};\r\n\r\n/**\r\n * Gets the low 32 bits as an unsigned integer.\r\n * @returns {number} Unsigned low bits\r\n */\r\nLongPrototype.getLowBitsUnsigned = function getLowBitsUnsigned() {\r\n return this.low >>> 0;\r\n};\r\n\r\n/**\r\n * Gets the number of bits needed to represent the absolute value of this Long.\r\n * @returns {number}\r\n */\r\nLongPrototype.getNumBitsAbs = function getNumBitsAbs() {\r\n if (this.isNegative()) // Unsigned Longs are never negative\r\n return this.eq(MIN_VALUE) ? 64 : this.neg().getNumBitsAbs();\r\n var val = this.high != 0 ? this.high : this.low;\r\n for (var bit = 31; bit > 0; bit--)\r\n if ((val & (1 << bit)) != 0)\r\n break;\r\n return this.high != 0 ? bit + 33 : bit + 1;\r\n};\r\n\r\n/**\r\n * Tests if this Long's value equals zero.\r\n * @returns {boolean}\r\n */\r\nLongPrototype.isZero = function isZero() {\r\n return this.high === 0 && this.low === 0;\r\n};\r\n\r\n/**\r\n * Tests if this Long's value equals zero. This is an alias of {@link Long#isZero}.\r\n * @returns {boolean}\r\n */\r\nLongPrototype.eqz = LongPrototype.isZero;\r\n\r\n/**\r\n * Tests if this Long's value is negative.\r\n * @returns {boolean}\r\n */\r\nLongPrototype.isNegative = function isNegative() {\r\n return !this.unsigned && this.high < 0;\r\n};\r\n\r\n/**\r\n * Tests if this Long's value is positive.\r\n * @returns {boolean}\r\n */\r\nLongPrototype.isPositive = function isPositive() {\r\n return this.unsigned || this.high >= 0;\r\n};\r\n\r\n/**\r\n * Tests if this Long's value is odd.\r\n * @returns {boolean}\r\n */\r\nLongPrototype.isOdd = function isOdd() {\r\n return (this.low & 1) === 1;\r\n};\r\n\r\n/**\r\n * Tests if this Long's value is even.\r\n * @returns {boolean}\r\n */\r\nLongPrototype.isEven = function isEven() {\r\n return (this.low & 1) === 0;\r\n};\r\n\r\n/**\r\n * Tests if this Long's value equals the specified's.\r\n * @param {!Long|number|string} other Other value\r\n * @returns {boolean}\r\n */\r\nLongPrototype.equals = function equals(other) {\r\n if (!isLong(other))\r\n other = fromValue(other);\r\n if (this.unsigned !== other.unsigned && (this.high >>> 31) === 1 && (other.high >>> 31) === 1)\r\n return false;\r\n return this.high === other.high && this.low === other.low;\r\n};\r\n\r\n/**\r\n * Tests if this Long's value equals the specified's. This is an alias of {@link Long#equals}.\r\n * @function\r\n * @param {!Long|number|string} other Other value\r\n * @returns {boolean}\r\n */\r\nLongPrototype.eq = LongPrototype.equals;\r\n\r\n/**\r\n * Tests if this Long's value differs from the specified's.\r\n * @param {!Long|number|string} other Other value\r\n * @returns {boolean}\r\n */\r\nLongPrototype.notEquals = function notEquals(other) {\r\n return !this.eq(/* validates */ other);\r\n};\r\n\r\n/**\r\n * Tests if this Long's value differs from the specified's. This is an alias of {@link Long#notEquals}.\r\n * @function\r\n * @param {!Long|number|string} other Other value\r\n * @returns {boolean}\r\n */\r\nLongPrototype.neq = LongPrototype.notEquals;\r\n\r\n/**\r\n * Tests if this Long's value differs from the specified's. This is an alias of {@link Long#notEquals}.\r\n * @function\r\n * @param {!Long|number|string} other Other value\r\n * @returns {boolean}\r\n */\r\nLongPrototype.ne = LongPrototype.notEquals;\r\n\r\n/**\r\n * Tests if this Long's value is less than the specified's.\r\n * @param {!Long|number|string} other Other value\r\n * @returns {boolean}\r\n */\r\nLongPrototype.lessThan = function lessThan(other) {\r\n return this.comp(/* validates */ other) < 0;\r\n};\r\n\r\n/**\r\n * Tests if this Long's value is less than the specified's. This is an alias of {@link Long#lessThan}.\r\n * @function\r\n * @param {!Long|number|string} other Other value\r\n * @returns {boolean}\r\n */\r\nLongPrototype.lt = LongPrototype.lessThan;\r\n\r\n/**\r\n * Tests if this Long's value is less than or equal the specified's.\r\n * @param {!Long|number|string} other Other value\r\n * @returns {boolean}\r\n */\r\nLongPrototype.lessThanOrEqual = function lessThanOrEqual(other) {\r\n return this.comp(/* validates */ other) <= 0;\r\n};\r\n\r\n/**\r\n * Tests if this Long's value is less than or equal the specified's. This is an alias of {@link Long#lessThanOrEqual}.\r\n * @function\r\n * @param {!Long|number|string} other Other value\r\n * @returns {boolean}\r\n */\r\nLongPrototype.lte = LongPrototype.lessThanOrEqual;\r\n\r\n/**\r\n * Tests if this Long's value is less than or equal the specified's. This is an alias of {@link Long#lessThanOrEqual}.\r\n * @function\r\n * @param {!Long|number|string} other Other value\r\n * @returns {boolean}\r\n */\r\nLongPrototype.le = LongPrototype.lessThanOrEqual;\r\n\r\n/**\r\n * Tests if this Long's value is greater than the specified's.\r\n * @param {!Long|number|string} other Other value\r\n * @returns {boolean}\r\n */\r\nLongPrototype.greaterThan = function greaterThan(other) {\r\n return this.comp(/* validates */ other) > 0;\r\n};\r\n\r\n/**\r\n * Tests if this Long's value is greater than the specified's. This is an alias of {@link Long#greaterThan}.\r\n * @function\r\n * @param {!Long|number|string} other Other value\r\n * @returns {boolean}\r\n */\r\nLongPrototype.gt = LongPrototype.greaterThan;\r\n\r\n/**\r\n * Tests if this Long's value is greater than or equal the specified's.\r\n * @param {!Long|number|string} other Other value\r\n * @returns {boolean}\r\n */\r\nLongPrototype.greaterThanOrEqual = function greaterThanOrEqual(other) {\r\n return this.comp(/* validates */ other) >= 0;\r\n};\r\n\r\n/**\r\n * Tests if this Long's value is greater than or equal the specified's. This is an alias of {@link Long#greaterThanOrEqual}.\r\n * @function\r\n * @param {!Long|number|string} other Other value\r\n * @returns {boolean}\r\n */\r\nLongPrototype.gte = LongPrototype.greaterThanOrEqual;\r\n\r\n/**\r\n * Tests if this Long's value is greater than or equal the specified's. This is an alias of {@link Long#greaterThanOrEqual}.\r\n * @function\r\n * @param {!Long|number|string} other Other value\r\n * @returns {boolean}\r\n */\r\nLongPrototype.ge = LongPrototype.greaterThanOrEqual;\r\n\r\n/**\r\n * Compares this Long's value with the specified's.\r\n * @param {!Long|number|string} other Other value\r\n * @returns {number} 0 if they are the same, 1 if the this is greater and -1\r\n * if the given one is greater\r\n */\r\nLongPrototype.compare = function compare(other) {\r\n if (!isLong(other))\r\n other = fromValue(other);\r\n if (this.eq(other))\r\n return 0;\r\n var thisNeg = this.isNegative(),\r\n otherNeg = other.isNegative();\r\n if (thisNeg && !otherNeg)\r\n return -1;\r\n if (!thisNeg && otherNeg)\r\n return 1;\r\n // At this point the sign bits are the same\r\n if (!this.unsigned)\r\n return this.sub(other).isNegative() ? -1 : 1;\r\n // Both are positive if at least one is unsigned\r\n return (other.high >>> 0) > (this.high >>> 0) || (other.high === this.high && (other.low >>> 0) > (this.low >>> 0)) ? -1 : 1;\r\n};\r\n\r\n/**\r\n * Compares this Long's value with the specified's. This is an alias of {@link Long#compare}.\r\n * @function\r\n * @param {!Long|number|string} other Other value\r\n * @returns {number} 0 if they are the same, 1 if the this is greater and -1\r\n * if the given one is greater\r\n */\r\nLongPrototype.comp = LongPrototype.compare;\r\n\r\n/**\r\n * Negates this Long's value.\r\n * @returns {!Long} Negated Long\r\n */\r\nLongPrototype.negate = function negate() {\r\n if (!this.unsigned && this.eq(MIN_VALUE))\r\n return MIN_VALUE;\r\n return this.not().add(ONE);\r\n};\r\n\r\n/**\r\n * Negates this Long's value. This is an alias of {@link Long#negate}.\r\n * @function\r\n * @returns {!Long} Negated Long\r\n */\r\nLongPrototype.neg = LongPrototype.negate;\r\n\r\n/**\r\n * Returns the sum of this and the specified Long.\r\n * @param {!Long|number|string} addend Addend\r\n * @returns {!Long} Sum\r\n */\r\nLongPrototype.add = function add(addend) {\r\n if (!isLong(addend))\r\n addend = fromValue(addend);\r\n\r\n // Divide each number into 4 chunks of 16 bits, and then sum the chunks.\r\n\r\n var a48 = this.high >>> 16;\r\n var a32 = this.high & 0xFFFF;\r\n var a16 = this.low >>> 16;\r\n var a00 = this.low & 0xFFFF;\r\n\r\n var b48 = addend.high >>> 16;\r\n var b32 = addend.high & 0xFFFF;\r\n var b16 = addend.low >>> 16;\r\n var b00 = addend.low & 0xFFFF;\r\n\r\n var c48 = 0, c32 = 0, c16 = 0, c00 = 0;\r\n c00 += a00 + b00;\r\n c16 += c00 >>> 16;\r\n c00 &= 0xFFFF;\r\n c16 += a16 + b16;\r\n c32 += c16 >>> 16;\r\n c16 &= 0xFFFF;\r\n c32 += a32 + b32;\r\n c48 += c32 >>> 16;\r\n c32 &= 0xFFFF;\r\n c48 += a48 + b48;\r\n c48 &= 0xFFFF;\r\n return fromBits((c16 << 16) | c00, (c48 << 16) | c32, this.unsigned);\r\n};\r\n\r\n/**\r\n * Returns the difference of this and the specified Long.\r\n * @param {!Long|number|string} subtrahend Subtrahend\r\n * @returns {!Long} Difference\r\n */\r\nLongPrototype.subtract = function subtract(subtrahend) {\r\n if (!isLong(subtrahend))\r\n subtrahend = fromValue(subtrahend);\r\n return this.add(subtrahend.neg());\r\n};\r\n\r\n/**\r\n * Returns the difference of this and the specified Long. This is an alias of {@link Long#subtract}.\r\n * @function\r\n * @param {!Long|number|string} subtrahend Subtrahend\r\n * @returns {!Long} Difference\r\n */\r\nLongPrototype.sub = LongPrototype.subtract;\r\n\r\n/**\r\n * Returns the product of this and the specified Long.\r\n * @param {!Long|number|string} multiplier Multiplier\r\n * @returns {!Long} Product\r\n */\r\nLongPrototype.multiply = function multiply(multiplier) {\r\n if (this.isZero())\r\n return ZERO;\r\n if (!isLong(multiplier))\r\n multiplier = fromValue(multiplier);\r\n\r\n // use wasm support if present\r\n if (wasm) {\r\n var low = wasm.mul(this.low,\r\n this.high,\r\n multiplier.low,\r\n multiplier.high);\r\n return fromBits(low, wasm.get_high(), this.unsigned);\r\n }\r\n\r\n if (multiplier.isZero())\r\n return ZERO;\r\n if (this.eq(MIN_VALUE))\r\n return multiplier.isOdd() ? MIN_VALUE : ZERO;\r\n if (multiplier.eq(MIN_VALUE))\r\n return this.isOdd() ? MIN_VALUE : ZERO;\r\n\r\n if (this.isNegative()) {\r\n if (multiplier.isNegative())\r\n return this.neg().mul(multiplier.neg());\r\n else\r\n return this.neg().mul(multiplier).neg();\r\n } else if (multiplier.isNegative())\r\n return this.mul(multiplier.neg()).neg();\r\n\r\n // If both longs are small, use float multiplication\r\n if (this.lt(TWO_PWR_24) && multiplier.lt(TWO_PWR_24))\r\n return fromNumber(this.toNumber() * multiplier.toNumber(), this.unsigned);\r\n\r\n // Divide each long into 4 chunks of 16 bits, and then add up 4x4 products.\r\n // We can skip products that would overflow.\r\n\r\n var a48 = this.high >>> 16;\r\n var a32 = this.high & 0xFFFF;\r\n var a16 = this.low >>> 16;\r\n var a00 = this.low & 0xFFFF;\r\n\r\n var b48 = multiplier.high >>> 16;\r\n var b32 = multiplier.high & 0xFFFF;\r\n var b16 = multiplier.low >>> 16;\r\n var b00 = multiplier.low & 0xFFFF;\r\n\r\n var c48 = 0, c32 = 0, c16 = 0, c00 = 0;\r\n c00 += a00 * b00;\r\n c16 += c00 >>> 16;\r\n c00 &= 0xFFFF;\r\n c16 += a16 * b00;\r\n c32 += c16 >>> 16;\r\n c16 &= 0xFFFF;\r\n c16 += a00 * b16;\r\n c32 += c16 >>> 16;\r\n c16 &= 0xFFFF;\r\n c32 += a32 * b00;\r\n c48 += c32 >>> 16;\r\n c32 &= 0xFFFF;\r\n c32 += a16 * b16;\r\n c48 += c32 >>> 16;\r\n c32 &= 0xFFFF;\r\n c32 += a00 * b32;\r\n c48 += c32 >>> 16;\r\n c32 &= 0xFFFF;\r\n c48 += a48 * b00 + a32 * b16 + a16 * b32 + a00 * b48;\r\n c48 &= 0xFFFF;\r\n return fromBits((c16 << 16) | c00, (c48 << 16) | c32, this.unsigned);\r\n};\r\n\r\n/**\r\n * Returns the product of this and the specified Long. This is an alias of {@link Long#multiply}.\r\n * @function\r\n * @param {!Long|number|string} multiplier Multiplier\r\n * @returns {!Long} Product\r\n */\r\nLongPrototype.mul = LongPrototype.multiply;\r\n\r\n/**\r\n * Returns this Long divided by the specified. The result is signed if this Long is signed or\r\n * unsigned if this Long is unsigned.\r\n * @param {!Long|number|string} divisor Divisor\r\n * @returns {!Long} Quotient\r\n */\r\nLongPrototype.divide = function divide(divisor) {\r\n if (!isLong(divisor))\r\n divisor = fromValue(divisor);\r\n if (divisor.isZero())\r\n throw Error('division by zero');\r\n\r\n // use wasm support if present\r\n if (wasm) {\r\n // guard against signed division overflow: the largest\r\n // negative number / -1 would be 1 larger than the largest\r\n // positive number, due to two's complement.\r\n if (!this.unsigned &&\r\n this.high === -0x80000000 &&\r\n divisor.low === -1 && divisor.high === -1) {\r\n // be consistent with non-wasm code path\r\n return this;\r\n }\r\n var low = (this.unsigned ? wasm.div_u : wasm.div_s)(\r\n this.low,\r\n this.high,\r\n divisor.low,\r\n divisor.high\r\n );\r\n return fromBits(low, wasm.get_high(), this.unsigned);\r\n }\r\n\r\n if (this.isZero())\r\n return this.unsigned ? UZERO : ZERO;\r\n var approx, rem, res;\r\n if (!this.unsigned) {\r\n // This section is only relevant for signed longs and is derived from the\r\n // closure library as a whole.\r\n if (this.eq(MIN_VALUE)) {\r\n if (divisor.eq(ONE) || divisor.eq(NEG_ONE))\r\n return MIN_VALUE; // recall that -MIN_VALUE == MIN_VALUE\r\n else if (divisor.eq(MIN_VALUE))\r\n return ONE;\r\n else {\r\n // At this point, we have |other| >= 2, so |this/other| < |MIN_VALUE|.\r\n var halfThis = this.shr(1);\r\n approx = halfThis.div(divisor).shl(1);\r\n if (approx.eq(ZERO)) {\r\n return divisor.isNegative() ? ONE : NEG_ONE;\r\n } else {\r\n rem = this.sub(divisor.mul(approx));\r\n res = approx.add(rem.div(divisor));\r\n return res;\r\n }\r\n }\r\n } else if (divisor.eq(MIN_VALUE))\r\n return this.unsigned ? UZERO : ZERO;\r\n if (this.isNegative()) {\r\n if (divisor.isNegative())\r\n return this.neg().div(divisor.neg());\r\n return this.neg().div(divisor).neg();\r\n } else if (divisor.isNegative())\r\n return this.div(divisor.neg()).neg();\r\n res = ZERO;\r\n } else {\r\n // The algorithm below has not been made for unsigned longs. It's therefore\r\n // required to take special care of the MSB prior to running it.\r\n if (!divisor.unsigned)\r\n divisor = divisor.toUnsigned();\r\n if (divisor.gt(this))\r\n return UZERO;\r\n if (divisor.gt(this.shru(1))) // 15 >>> 1 = 7 ; with divisor = 8 ; true\r\n return UONE;\r\n res = UZERO;\r\n }\r\n\r\n // Repeat the following until the remainder is less than other: find a\r\n // floating-point that approximates remainder / other *from below*, add this\r\n // into the result, and subtract it from the remainder. It is critical that\r\n // the approximate value is less than or equal to the real value so that the\r\n // remainder never becomes negative.\r\n rem = this;\r\n while (rem.gte(divisor)) {\r\n // Approximate the result of division. This may be a little greater or\r\n // smaller than the actual value.\r\n approx = Math.max(1, Math.floor(rem.toNumber() / divisor.toNumber()));\r\n\r\n // We will tweak the approximate result by changing it in the 48-th digit or\r\n // the smallest non-fractional digit, whichever is larger.\r\n var log2 = Math.ceil(Math.log(approx) / Math.LN2),\r\n delta = (log2 <= 48) ? 1 : pow_dbl(2, log2 - 48),\r\n\r\n // Decrease the approximation until it is smaller than the remainder. Note\r\n // that if it is too large, the product overflows and is negative.\r\n approxRes = fromNumber(approx),\r\n approxRem = approxRes.mul(divisor);\r\n while (approxRem.isNegative() || approxRem.gt(rem)) {\r\n approx -= delta;\r\n approxRes = fromNumber(approx, this.unsigned);\r\n approxRem = approxRes.mul(divisor);\r\n }\r\n\r\n // We know the answer can't be zero... and actually, zero would cause\r\n // infinite recursion since we would make no progress.\r\n if (approxRes.isZero())\r\n approxRes = ONE;\r\n\r\n res = res.add(approxRes);\r\n rem = rem.sub(approxRem);\r\n }\r\n return res;\r\n};\r\n\r\n/**\r\n * Returns this Long divided by the specified. This is an alias of {@link Long#divide}.\r\n * @function\r\n * @param {!Long|number|string} divisor Divisor\r\n * @returns {!Long} Quotient\r\n */\r\nLongPrototype.div = LongPrototype.divide;\r\n\r\n/**\r\n * Returns this Long modulo the specified.\r\n * @param {!Long|number|string} divisor Divisor\r\n * @returns {!Long} Remainder\r\n */\r\nLongPrototype.modulo = function modulo(divisor) {\r\n if (!isLong(divisor))\r\n divisor = fromValue(divisor);\r\n\r\n // use wasm support if present\r\n if (wasm) {\r\n var low = (this.unsigned ? wasm.rem_u : wasm.rem_s)(\r\n this.low,\r\n this.high,\r\n divisor.low,\r\n divisor.high\r\n );\r\n return fromBits(low, wasm.get_high(), this.unsigned);\r\n }\r\n\r\n return this.sub(this.div(divisor).mul(divisor));\r\n};\r\n\r\n/**\r\n * Returns this Long modulo the specified. This is an alias of {@link Long#modulo}.\r\n * @function\r\n * @param {!Long|number|string} divisor Divisor\r\n * @returns {!Long} Remainder\r\n */\r\nLongPrototype.mod = LongPrototype.modulo;\r\n\r\n/**\r\n * Returns this Long modulo the specified. This is an alias of {@link Long#modulo}.\r\n * @function\r\n * @param {!Long|number|string} divisor Divisor\r\n * @returns {!Long} Remainder\r\n */\r\nLongPrototype.rem = LongPrototype.modulo;\r\n\r\n/**\r\n * Returns the bitwise NOT of this Long.\r\n * @returns {!Long}\r\n */\r\nLongPrototype.not = function not() {\r\n return fromBits(~this.low, ~this.high, this.unsigned);\r\n};\r\n\r\n/**\r\n * Returns the bitwise AND of this Long and the specified.\r\n * @param {!Long|number|string} other Other Long\r\n * @returns {!Long}\r\n */\r\nLongPrototype.and = function and(other) {\r\n if (!isLong(other))\r\n other = fromValue(other);\r\n return fromBits(this.low & other.low, this.high & other.high, this.unsigned);\r\n};\r\n\r\n/**\r\n * Returns the bitwise OR of this Long and the specified.\r\n * @param {!Long|number|string} other Other Long\r\n * @returns {!Long}\r\n */\r\nLongPrototype.or = function or(other) {\r\n if (!isLong(other))\r\n other = fromValue(other);\r\n return fromBits(this.low | other.low, this.high | other.high, this.unsigned);\r\n};\r\n\r\n/**\r\n * Returns the bitwise XOR of this Long and the given one.\r\n * @param {!Long|number|string} other Other Long\r\n * @returns {!Long}\r\n */\r\nLongPrototype.xor = function xor(other) {\r\n if (!isLong(other))\r\n other = fromValue(other);\r\n return fromBits(this.low ^ other.low, this.high ^ other.high, this.unsigned);\r\n};\r\n\r\n/**\r\n * Returns this Long with bits shifted to the left by the given amount.\r\n * @param {number|!Long} numBits Number of bits\r\n * @returns {!Long} Shifted Long\r\n */\r\nLongPrototype.shiftLeft = function shiftLeft(numBits) {\r\n if (isLong(numBits))\r\n numBits = numBits.toInt();\r\n if ((numBits &= 63) === 0)\r\n return this;\r\n else if (numBits < 32)\r\n return fromBits(this.low << numBits, (this.high << numBits) | (this.low >>> (32 - numBits)), this.unsigned);\r\n else\r\n return fromBits(0, this.low << (numBits - 32), this.unsigned);\r\n};\r\n\r\n/**\r\n * Returns this Long with bits shifted to the left by the given amount. This is an alias of {@link Long#shiftLeft}.\r\n * @function\r\n * @param {number|!Long} numBits Number of bits\r\n * @returns {!Long} Shifted Long\r\n */\r\nLongPrototype.shl = LongPrototype.shiftLeft;\r\n\r\n/**\r\n * Returns this Long with bits arithmetically shifted to the right by the given amount.\r\n * @param {number|!Long} numBits Number of bits\r\n * @returns {!Long} Shifted Long\r\n */\r\nLongPrototype.shiftRight = function shiftRight(numBits) {\r\n if (isLong(numBits))\r\n numBits = numBits.toInt();\r\n if ((numBits &= 63) === 0)\r\n return this;\r\n else if (numBits < 32)\r\n return fromBits((this.low >>> numBits) | (this.high << (32 - numBits)), this.high >> numBits, this.unsigned);\r\n else\r\n return fromBits(this.high >> (numBits - 32), this.high >= 0 ? 0 : -1, this.unsigned);\r\n};\r\n\r\n/**\r\n * Returns this Long with bits arithmetically shifted to the right by the given amount. This is an alias of {@link Long#shiftRight}.\r\n * @function\r\n * @param {number|!Long} numBits Number of bits\r\n * @returns {!Long} Shifted Long\r\n */\r\nLongPrototype.shr = LongPrototype.shiftRight;\r\n\r\n/**\r\n * Returns this Long with bits logically shifted to the right by the given amount.\r\n * @param {number|!Long} numBits Number of bits\r\n * @returns {!Long} Shifted Long\r\n */\r\nLongPrototype.shiftRightUnsigned = function shiftRightUnsigned(numBits) {\r\n if (isLong(numBits))\r\n numBits = numBits.toInt();\r\n numBits &= 63;\r\n if (numBits === 0)\r\n return this;\r\n else {\r\n var high = this.high;\r\n if (numBits < 32) {\r\n var low = this.low;\r\n return fromBits((low >>> numBits) | (high << (32 - numBits)), high >>> numBits, this.unsigned);\r\n } else if (numBits === 32)\r\n return fromBits(high, 0, this.unsigned);\r\n else\r\n return fromBits(high >>> (numBits - 32), 0, this.unsigned);\r\n }\r\n};\r\n\r\n/**\r\n * Returns this Long with bits logically shifted to the right by the given amount. This is an alias of {@link Long#shiftRightUnsigned}.\r\n * @function\r\n * @param {number|!Long} numBits Number of bits\r\n * @returns {!Long} Shifted Long\r\n */\r\nLongPrototype.shru = LongPrototype.shiftRightUnsigned;\r\n\r\n/**\r\n * Returns this Long with bits logically shifted to the right by the given amount. This is an alias of {@link Long#shiftRightUnsigned}.\r\n * @function\r\n * @param {number|!Long} numBits Number of bits\r\n * @returns {!Long} Shifted Long\r\n */\r\nLongPrototype.shr_u = LongPrototype.shiftRightUnsigned;\r\n\r\n/**\r\n * Converts this Long to signed.\r\n * @returns {!Long} Signed long\r\n */\r\nLongPrototype.toSigned = function toSigned() {\r\n if (!this.unsigned)\r\n return this;\r\n return fromBits(this.low, this.high, false);\r\n};\r\n\r\n/**\r\n * Converts this Long to unsigned.\r\n * @returns {!Long} Unsigned long\r\n */\r\nLongPrototype.toUnsigned = function toUnsigned() {\r\n if (this.unsigned)\r\n return this;\r\n return fromBits(this.low, this.high, true);\r\n};\r\n\r\n/**\r\n * Converts this Long to its byte representation.\r\n * @param {boolean=} le Whether little or big endian, defaults to big endian\r\n * @returns {!Array.} Byte representation\r\n */\r\nLongPrototype.toBytes = function toBytes(le) {\r\n return le ? this.toBytesLE() : this.toBytesBE();\r\n};\r\n\r\n/**\r\n * Converts this Long to its little endian byte representation.\r\n * @returns {!Array.} Little endian byte representation\r\n */\r\nLongPrototype.toBytesLE = function toBytesLE() {\r\n var hi = this.high,\r\n lo = this.low;\r\n return [\r\n lo & 0xff,\r\n lo >>> 8 & 0xff,\r\n lo >>> 16 & 0xff,\r\n lo >>> 24 ,\r\n hi & 0xff,\r\n hi >>> 8 & 0xff,\r\n hi >>> 16 & 0xff,\r\n hi >>> 24\r\n ];\r\n};\r\n\r\n/**\r\n * Converts this Long to its big endian byte representation.\r\n * @returns {!Array.} Big endian byte representation\r\n */\r\nLongPrototype.toBytesBE = function toBytesBE() {\r\n var hi = this.high,\r\n lo = this.low;\r\n return [\r\n hi >>> 24 ,\r\n hi >>> 16 & 0xff,\r\n hi >>> 8 & 0xff,\r\n hi & 0xff,\r\n lo >>> 24 ,\r\n lo >>> 16 & 0xff,\r\n lo >>> 8 & 0xff,\r\n lo & 0xff\r\n ];\r\n};\r\n\r\n/**\r\n * Creates a Long from its byte representation.\r\n * @param {!Array.} bytes Byte representation\r\n * @param {boolean=} unsigned Whether unsigned or not, defaults to signed\r\n * @param {boolean=} le Whether little or big endian, defaults to big endian\r\n * @returns {Long} The corresponding Long value\r\n */\r\nLong.fromBytes = function fromBytes(bytes, unsigned, le) {\r\n return le ? Long.fromBytesLE(bytes, unsigned) : Long.fromBytesBE(bytes, unsigned);\r\n};\r\n\r\n/**\r\n * Creates a Long from its little endian byte representation.\r\n * @param {!Array.} bytes Little endian byte representation\r\n * @param {boolean=} unsigned Whether unsigned or not, defaults to signed\r\n * @returns {Long} The corresponding Long value\r\n */\r\nLong.fromBytesLE = function fromBytesLE(bytes, unsigned) {\r\n return new Long(\r\n bytes[0] |\r\n bytes[1] << 8 |\r\n bytes[2] << 16 |\r\n bytes[3] << 24,\r\n bytes[4] |\r\n bytes[5] << 8 |\r\n bytes[6] << 16 |\r\n bytes[7] << 24,\r\n unsigned\r\n );\r\n};\r\n\r\n/**\r\n * Creates a Long from its big endian byte representation.\r\n * @param {!Array.} bytes Big endian byte representation\r\n * @param {boolean=} unsigned Whether unsigned or not, defaults to signed\r\n * @returns {Long} The corresponding Long value\r\n */\r\nLong.fromBytesBE = function fromBytesBE(bytes, unsigned) {\r\n return new Long(\r\n bytes[4] << 24 |\r\n bytes[5] << 16 |\r\n bytes[6] << 8 |\r\n bytes[7],\r\n bytes[0] << 24 |\r\n bytes[1] << 16 |\r\n bytes[2] << 8 |\r\n bytes[3],\r\n unsigned\r\n );\r\n};\r\n","/* @license\nPapa Parse\nv5.3.1\nhttps://github.com/mholt/PapaParse\nLicense: MIT\n*/\n!function(e,t){\"function\"==typeof define&&define.amd?define([],t):\"object\"==typeof module&&\"undefined\"!=typeof exports?module.exports=t():e.Papa=t()}(this,function s(){\"use strict\";var f=\"undefined\"!=typeof self?self:\"undefined\"!=typeof window?window:void 0!==f?f:{};var n=!f.document&&!!f.postMessage,o=n&&/blob:/i.test((f.location||{}).protocol),a={},h=0,b={parse:function(e,t){var i=(t=t||{}).dynamicTyping||!1;M(i)&&(t.dynamicTypingFunction=i,i={});if(t.dynamicTyping=i,t.transform=!!M(t.transform)&&t.transform,t.worker&&b.WORKERS_SUPPORTED){var r=function(){if(!b.WORKERS_SUPPORTED)return!1;var e=(i=f.URL||f.webkitURL||null,r=s.toString(),b.BLOB_URL||(b.BLOB_URL=i.createObjectURL(new Blob([\"(\",r,\")();\"],{type:\"text/javascript\"})))),t=new f.Worker(e);var i,r;return t.onmessage=_,t.id=h++,a[t.id]=t}();return r.userStep=t.step,r.userChunk=t.chunk,r.userComplete=t.complete,r.userError=t.error,t.step=M(t.step),t.chunk=M(t.chunk),t.complete=M(t.complete),t.error=M(t.error),delete t.worker,void r.postMessage({input:e,config:t,workerId:r.id})}var n=null;b.NODE_STREAM_INPUT,\"string\"==typeof e?n=t.download?new l(t):new p(t):!0===e.readable&&M(e.read)&&M(e.on)?n=new g(t):(f.File&&e instanceof File||e instanceof Object)&&(n=new c(t));return n.stream(e)},unparse:function(e,t){var n=!1,_=!0,m=\",\",y=\"\\r\\n\",s='\"',a=s+s,i=!1,r=null,o=!1;!function(){if(\"object\"!=typeof t)return;\"string\"!=typeof t.delimiter||b.BAD_DELIMITERS.filter(function(e){return-1!==t.delimiter.indexOf(e)}).length||(m=t.delimiter);(\"boolean\"==typeof t.quotes||\"function\"==typeof t.quotes||Array.isArray(t.quotes))&&(n=t.quotes);\"boolean\"!=typeof t.skipEmptyLines&&\"string\"!=typeof t.skipEmptyLines||(i=t.skipEmptyLines);\"string\"==typeof t.newline&&(y=t.newline);\"string\"==typeof t.quoteChar&&(s=t.quoteChar);\"boolean\"==typeof t.header&&(_=t.header);if(Array.isArray(t.columns)){if(0===t.columns.length)throw new Error(\"Option columns is empty\");r=t.columns}void 0!==t.escapeChar&&(a=t.escapeChar+s);\"boolean\"==typeof t.escapeFormulae&&(o=t.escapeFormulae)}();var h=new RegExp(j(s),\"g\");\"string\"==typeof e&&(e=JSON.parse(e));if(Array.isArray(e)){if(!e.length||Array.isArray(e[0]))return u(null,e,i);if(\"object\"==typeof e[0])return u(r||Object.keys(e[0]),e,i)}else if(\"object\"==typeof e)return\"string\"==typeof e.data&&(e.data=JSON.parse(e.data)),Array.isArray(e.data)&&(e.fields||(e.fields=e.meta&&e.meta.fields),e.fields||(e.fields=Array.isArray(e.data[0])?e.fields:\"object\"==typeof e.data[0]?Object.keys(e.data[0]):[]),Array.isArray(e.data[0])||\"object\"==typeof e.data[0]||(e.data=[e.data])),u(e.fields||[],e.data||[],i);throw new Error(\"Unable to serialize unrecognized input\");function u(e,t,i){var r=\"\";\"string\"==typeof e&&(e=JSON.parse(e)),\"string\"==typeof t&&(t=JSON.parse(t));var n=Array.isArray(e)&&0=this._config.preview;if(o)f.postMessage({results:n,workerId:b.WORKER_ID,finished:a});else if(M(this._config.chunk)&&!t){if(this._config.chunk(n,this._handle),this._handle.paused()||this._handle.aborted())return void(this._halted=!0);n=void 0,this._completeResults=void 0}return this._config.step||this._config.chunk||(this._completeResults.data=this._completeResults.data.concat(n.data),this._completeResults.errors=this._completeResults.errors.concat(n.errors),this._completeResults.meta=n.meta),this._completed||!a||!M(this._config.complete)||n&&n.meta.aborted||(this._config.complete(this._completeResults,this._input),this._completed=!0),a||n&&n.meta.paused||this._nextChunk(),n}this._halted=!0},this._sendError=function(e){M(this._config.error)?this._config.error(e):o&&this._config.error&&f.postMessage({workerId:b.WORKER_ID,error:e,finished:!1})}}function l(e){var r;(e=e||{}).chunkSize||(e.chunkSize=b.RemoteChunkSize),u.call(this,e),this._nextChunk=n?function(){this._readChunk(),this._chunkLoaded()}:function(){this._readChunk()},this.stream=function(e){this._input=e,this._nextChunk()},this._readChunk=function(){if(this._finished)this._chunkLoaded();else{if(r=new XMLHttpRequest,this._config.withCredentials&&(r.withCredentials=this._config.withCredentials),n||(r.onload=v(this._chunkLoaded,this),r.onerror=v(this._chunkError,this)),r.open(this._config.downloadRequestBody?\"POST\":\"GET\",this._input,!n),this._config.downloadRequestHeaders){var e=this._config.downloadRequestHeaders;for(var t in e)r.setRequestHeader(t,e[t])}if(this._config.chunkSize){var i=this._start+this._config.chunkSize-1;r.setRequestHeader(\"Range\",\"bytes=\"+this._start+\"-\"+i)}try{r.send(this._config.downloadRequestBody)}catch(e){this._chunkError(e.message)}n&&0===r.status&&this._chunkError()}},this._chunkLoaded=function(){4===r.readyState&&(r.status<200||400<=r.status?this._chunkError():(this._start+=this._config.chunkSize?this._config.chunkSize:r.responseText.length,this._finished=!this._config.chunkSize||this._start>=function(e){var t=e.getResponseHeader(\"Content-Range\");if(null===t)return-1;return parseInt(t.substring(t.lastIndexOf(\"/\")+1))}(r),this.parseChunk(r.responseText)))},this._chunkError=function(e){var t=r.statusText||e;this._sendError(new Error(t))}}function c(e){var r,n;(e=e||{}).chunkSize||(e.chunkSize=b.LocalChunkSize),u.call(this,e);var s=\"undefined\"!=typeof FileReader;this.stream=function(e){this._input=e,n=e.slice||e.webkitSlice||e.mozSlice,s?((r=new FileReader).onload=v(this._chunkLoaded,this),r.onerror=v(this._chunkError,this)):r=new FileReaderSync,this._nextChunk()},this._nextChunk=function(){this._finished||this._config.preview&&!(this._rowCount=this._input.size,this.parseChunk(e.target.result)},this._chunkError=function(){this._sendError(r.error)}}function p(e){var i;u.call(this,e=e||{}),this.stream=function(e){return i=e,this._nextChunk()},this._nextChunk=function(){if(!this._finished){var e,t=this._config.chunkSize;return t?(e=i.substring(0,t),i=i.substring(t)):(e=i,i=\"\"),this._finished=!i,this.parseChunk(e)}}}function g(e){u.call(this,e=e||{});var t=[],i=!0,r=!1;this.pause=function(){u.prototype.pause.apply(this,arguments),this._input.pause()},this.resume=function(){u.prototype.resume.apply(this,arguments),this._input.resume()},this.stream=function(e){this._input=e,this._input.on(\"data\",this._streamData),this._input.on(\"end\",this._streamEnd),this._input.on(\"error\",this._streamError)},this._checkIsFinished=function(){r&&1===t.length&&(this._finished=!0)},this._nextChunk=function(){this._checkIsFinished(),t.length?this.parseChunk(t.shift()):i=!0},this._streamData=v(function(e){try{t.push(\"string\"==typeof e?e:e.toString(this._config.encoding)),i&&(i=!1,this._checkIsFinished(),this.parseChunk(t.shift()))}catch(e){this._streamError(e)}},this),this._streamError=v(function(e){this._streamCleanUp(),this._sendError(e)},this),this._streamEnd=v(function(){this._streamCleanUp(),r=!0,this._streamData(\"\")},this),this._streamCleanUp=v(function(){this._input.removeListener(\"data\",this._streamData),this._input.removeListener(\"end\",this._streamEnd),this._input.removeListener(\"error\",this._streamError)},this)}function i(m){var a,o,h,r=Math.pow(2,53),n=-r,s=/^\\s*-?(\\d+\\.?|\\.\\d+|\\d+\\.\\d+)([eE][-+]?\\d+)?\\s*$/,u=/^(\\d{4}-[01]\\d-[0-3]\\dT[0-2]\\d:[0-5]\\d:[0-5]\\d\\.\\d+([+-][0-2]\\d:[0-5]\\d|Z))|(\\d{4}-[01]\\d-[0-3]\\dT[0-2]\\d:[0-5]\\d:[0-5]\\d([+-][0-2]\\d:[0-5]\\d|Z))|(\\d{4}-[01]\\d-[0-3]\\dT[0-2]\\d:[0-5]\\d([+-][0-2]\\d:[0-5]\\d|Z))$/,t=this,i=0,f=0,d=!1,e=!1,l=[],c={data:[],errors:[],meta:{}};if(M(m.step)){var p=m.step;m.step=function(e){if(c=e,_())g();else{if(g(),0===c.data.length)return;i+=e.data.length,m.preview&&i>m.preview?o.abort():(c.data=c.data[0],p(c,t))}}}function y(e){return\"greedy\"===m.skipEmptyLines?\"\"===e.join(\"\").trim():1===e.length&&0===e[0].length}function g(){if(c&&h&&(k(\"Delimiter\",\"UndetectableDelimiter\",\"Unable to auto-detect delimiting character; defaulted to '\"+b.DefaultDelimiter+\"'\"),h=!1),m.skipEmptyLines)for(var e=0;e=l.length?\"__parsed_extra\":l[i]),m.transform&&(s=m.transform(s,n)),s=v(n,s),\"__parsed_extra\"===n?(r[n]=r[n]||[],r[n].push(s)):r[n]=s}return m.header&&(i>l.length?k(\"FieldMismatch\",\"TooManyFields\",\"Too many fields: expected \"+l.length+\" fields but parsed \"+i,f+t):i=r.length/2?\"\\r\\n\":\"\\r\"}(e,r)),h=!1,m.delimiter)M(m.delimiter)&&(m.delimiter=m.delimiter(e),c.meta.delimiter=m.delimiter);else{var n=function(e,t,i,r,n){var s,a,o,h;n=n||[\",\",\"\\t\",\"|\",\";\",b.RECORD_SEP,b.UNIT_SEP];for(var u=0;u=D)return C(!0)}else for(m=F,F++;;){if(-1===(m=r.indexOf(S,m+1)))return i||u.push({type:\"Quotes\",code:\"MissingQuotes\",message:\"Quoted field unterminated\",row:h.length,index:F}),E();if(m===n-1)return E(r.substring(F,m).replace(_,S));if(S!==L||r[m+1]!==L){if(S===L||0===m||r[m-1]!==L){-1!==p&&p=D)return C(!0);break}u.push({type:\"Quotes\",code:\"InvalidQuotes\",message:\"Trailing quote on quoted field is malformed\",row:h.length,index:F}),m++}}else m++}return E();function k(e){h.push(e),d=F}function b(e){var t=0;if(-1!==e){var i=r.substring(m+1,e);i&&\"\"===i.trim()&&(t=i.length)}return t}function E(e){return i||(void 0===e&&(e=r.substring(F)),f.push(e),F=n,k(f),o&&R()),C()}function w(e){F=e,k(f),f=[],g=r.indexOf(x,F)}function C(e){return{data:h,errors:u,meta:{delimiter:O,linebreak:x,aborted:z,truncated:!!e,cursor:d+(t||0)}}}function R(){T(C()),h=[],u=[]}},this.abort=function(){z=!0},this.getCharIndex=function(){return F}}function _(e){var t=e.data,i=a[t.workerId],r=!1;if(t.error)i.userError(t.error,t.file);else if(t.results&&t.results.data){var n={abort:function(){r=!0,m(t.workerId,{data:[],errors:[],meta:{aborted:!0}})},pause:y,resume:y};if(M(i.userStep)){for(var s=0;s 0 && arguments[0] !== undefined ? arguments[0] : window;\n return !!context.chrome;\n },\n // At least Safari 3+: \"[object HTMLElementConstructor]\"\n isSafari: function isSafari() {\n return Object.prototype.toString.call(window.HTMLElement).indexOf('Constructor') > 0 || navigator.userAgent.toLowerCase().indexOf('safari') !== -1;\n },\n // IOS Chrome\n isIOSChrome: function isIOSChrome() {\n return navigator.userAgent.toLowerCase().indexOf('crios') !== -1;\n }\n};\n/* harmony default export */ __webpack_exports__[\"default\"] = (Browser);\n\n/***/ }),\n\n/***/ \"./src/js/functions.js\":\n/*!*****************************!*\\\n !*** ./src/js/functions.js ***!\n \\*****************************/\n/*! exports provided: addWrapper, capitalizePrint, collectStyles, addHeader, cleanUp, isRawHTML */\n/***/ (function(module, __webpack_exports__, __webpack_require__) {\n\n\"use strict\";\n__webpack_require__.r(__webpack_exports__);\n/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, \"addWrapper\", function() { return addWrapper; });\n/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, \"capitalizePrint\", function() { return capitalizePrint; });\n/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, \"collectStyles\", function() { return collectStyles; });\n/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, \"addHeader\", function() { return addHeader; });\n/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, \"cleanUp\", function() { return cleanUp; });\n/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, \"isRawHTML\", function() { return isRawHTML; });\n/* harmony import */ var _modal__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./modal */ \"./src/js/modal.js\");\n/* harmony import */ var _browser__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ./browser */ \"./src/js/browser.js\");\nfunction _typeof(obj) { \"@babel/helpers - typeof\"; if (typeof Symbol === \"function\" && typeof Symbol.iterator === \"symbol\") { _typeof = function _typeof(obj) { return typeof obj; }; } else { _typeof = function _typeof(obj) { return obj && typeof Symbol === \"function\" && obj.constructor === Symbol && obj !== Symbol.prototype ? \"symbol\" : typeof obj; }; } return _typeof(obj); }\n\n\n\nfunction addWrapper(htmlData, params) {\n var bodyStyle = 'font-family:' + params.font + ' !important; font-size: ' + params.font_size + ' !important; width:100%;';\n return '
' + htmlData + '
';\n}\nfunction capitalizePrint(obj) {\n return obj.charAt(0).toUpperCase() + obj.slice(1);\n}\nfunction collectStyles(element, params) {\n var win = document.defaultView || window; // String variable to hold styling for each element\n\n var elementStyle = ''; // Loop over computed styles\n\n var styles = win.getComputedStyle(element, '');\n\n for (var key = 0; key < styles.length; key++) {\n // Check if style should be processed\n if (params.targetStyles.indexOf('*') !== -1 || params.targetStyle.indexOf(styles[key]) !== -1 || targetStylesMatch(params.targetStyles, styles[key])) {\n if (styles.getPropertyValue(styles[key])) elementStyle += styles[key] + ':' + styles.getPropertyValue(styles[key]) + ';';\n }\n } // Print friendly defaults (deprecated)\n\n\n elementStyle += 'max-width: ' + params.maxWidth + 'px !important; font-size: ' + params.font_size + ' !important;';\n return elementStyle;\n}\n\nfunction targetStylesMatch(styles, value) {\n for (var i = 0; i < styles.length; i++) {\n if (_typeof(value) === 'object' && value.indexOf(styles[i]) !== -1) return true;\n }\n\n return false;\n}\n\nfunction addHeader(printElement, params) {\n // Create the header container div\n var headerContainer = document.createElement('div'); // Check if the header is text or raw html\n\n if (isRawHTML(params.header)) {\n headerContainer.innerHTML = params.header;\n } else {\n // Create header element\n var headerElement = document.createElement('h1'); // Create header text node\n\n var headerNode = document.createTextNode(params.header); // Build and style\n\n headerElement.appendChild(headerNode);\n headerElement.setAttribute('style', params.headerStyle);\n headerContainer.appendChild(headerElement);\n }\n\n printElement.insertBefore(headerContainer, printElement.childNodes[0]);\n}\nfunction cleanUp(params) {\n // If we are showing a feedback message to user, remove it\n if (params.showModal) _modal__WEBPACK_IMPORTED_MODULE_0__[\"default\"].close(); // Check for a finished loading hook function\n\n if (params.onLoadingEnd) params.onLoadingEnd(); // If preloading pdf files, clean blob url\n\n if (params.showModal || params.onLoadingStart) window.URL.revokeObjectURL(params.printable); // Run onPrintDialogClose callback\n\n var event = 'mouseover';\n\n if (_browser__WEBPACK_IMPORTED_MODULE_1__[\"default\"].isChrome() || _browser__WEBPACK_IMPORTED_MODULE_1__[\"default\"].isFirefox()) {\n // Ps.: Firefox will require an extra click in the document to fire the focus event.\n event = 'focus';\n }\n\n var handler = function handler() {\n // Make sure the event only happens once.\n window.removeEventListener(event, handler);\n params.onPrintDialogClose(); // Remove iframe from the DOM\n\n var iframe = document.getElementById(params.frameId);\n\n if (iframe) {\n iframe.remove();\n }\n };\n\n window.addEventListener(event, handler);\n}\nfunction isRawHTML(raw) {\n var regexHtml = new RegExp('<([A-Za-z][A-Za-z0-9]*)\\\\b[^>]*>(.*?)');\n return regexHtml.test(raw);\n}\n\n/***/ }),\n\n/***/ \"./src/js/html.js\":\n/*!************************!*\\\n !*** ./src/js/html.js ***!\n \\************************/\n/*! exports provided: default */\n/***/ (function(module, __webpack_exports__, __webpack_require__) {\n\n\"use strict\";\n__webpack_require__.r(__webpack_exports__);\n/* harmony import */ var _functions__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./functions */ \"./src/js/functions.js\");\n/* harmony import */ var _print__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ./print */ \"./src/js/print.js\");\n\n\n/* harmony default export */ __webpack_exports__[\"default\"] = ({\n print: function print(params, printFrame) {\n // Get the DOM printable element\n var printElement = document.getElementById(params.printable); // Check if the element exists\n\n if (!printElement) {\n window.console.error('Invalid HTML element id: ' + params.printable);\n return;\n } // Clone the target element including its children (if available)\n\n\n params.printableElement = cloneElement(printElement, params); // Add header\n\n if (params.header) {\n Object(_functions__WEBPACK_IMPORTED_MODULE_0__[\"addHeader\"])(params.printableElement, params);\n } // Print html element contents\n\n\n _print__WEBPACK_IMPORTED_MODULE_1__[\"default\"].send(params, printFrame);\n }\n});\n\nfunction cloneElement(element, params) {\n // Clone the main node (if not already inside the recursion process)\n var clone = element.cloneNode(); // Loop over and process the children elements / nodes (including text nodes)\n\n var childNodesArray = Array.prototype.slice.call(element.childNodes);\n\n for (var i = 0; i < childNodesArray.length; i++) {\n // Check if we are skiping the current element\n if (params.ignoreElements.indexOf(childNodesArray[i].id) !== -1) {\n continue;\n } // Clone the child element\n\n\n var clonedChild = cloneElement(childNodesArray[i], params); // Attach the cloned child to the cloned parent node\n\n clone.appendChild(clonedChild);\n } // Get all styling for print element (for nodes of type element only)\n\n\n if (params.scanStyles && element.nodeType === 1) {\n clone.setAttribute('style', Object(_functions__WEBPACK_IMPORTED_MODULE_0__[\"collectStyles\"])(element, params));\n } // Check if the element needs any state processing (copy user input data)\n\n\n switch (element.tagName) {\n case 'SELECT':\n // Copy the current selection value to its clone\n clone.value = element.value;\n break;\n\n case 'CANVAS':\n // Copy the canvas content to its clone\n clone.getContext('2d').drawImage(element, 0, 0);\n break;\n }\n\n return clone;\n}\n\n/***/ }),\n\n/***/ \"./src/js/image.js\":\n/*!*************************!*\\\n !*** ./src/js/image.js ***!\n \\*************************/\n/*! exports provided: default */\n/***/ (function(module, __webpack_exports__, __webpack_require__) {\n\n\"use strict\";\n__webpack_require__.r(__webpack_exports__);\n/* harmony import */ var _functions__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./functions */ \"./src/js/functions.js\");\n/* harmony import */ var _print__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ./print */ \"./src/js/print.js\");\n/* harmony import */ var _browser__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ./browser */ \"./src/js/browser.js\");\n\n\n\n/* harmony default export */ __webpack_exports__[\"default\"] = ({\n print: function print(params, printFrame) {\n // Check if we are printing one image or multiple images\n if (params.printable.constructor !== Array) {\n // Create array with one image\n params.printable = [params.printable];\n } // Create printable element (container)\n\n\n params.printableElement = document.createElement('div'); // Create all image elements and append them to the printable container\n\n params.printable.forEach(function (src) {\n // Create the image element\n var img = document.createElement('img');\n img.setAttribute('style', params.imageStyle); // Set image src with the file url\n\n img.src = src; // The following block is for Firefox, which for some reason requires the image's src to be fully qualified in\n // order to print it\n\n if (_browser__WEBPACK_IMPORTED_MODULE_2__[\"default\"].isFirefox()) {\n var fullyQualifiedSrc = img.src;\n img.src = fullyQualifiedSrc;\n } // Create the image wrapper\n\n\n var imageWrapper = document.createElement('div'); // Append image to the wrapper element\n\n imageWrapper.appendChild(img); // Append wrapper to the printable element\n\n params.printableElement.appendChild(imageWrapper);\n }); // Check if we are adding a print header\n\n if (params.header) Object(_functions__WEBPACK_IMPORTED_MODULE_0__[\"addHeader\"])(params.printableElement, params); // Print image\n\n _print__WEBPACK_IMPORTED_MODULE_1__[\"default\"].send(params, printFrame);\n }\n});\n\n/***/ }),\n\n/***/ \"./src/js/init.js\":\n/*!************************!*\\\n !*** ./src/js/init.js ***!\n \\************************/\n/*! exports provided: default */\n/***/ (function(module, __webpack_exports__, __webpack_require__) {\n\n\"use strict\";\n__webpack_require__.r(__webpack_exports__);\n/* harmony import */ var _browser__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./browser */ \"./src/js/browser.js\");\n/* harmony import */ var _modal__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ./modal */ \"./src/js/modal.js\");\n/* harmony import */ var _pdf__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ./pdf */ \"./src/js/pdf.js\");\n/* harmony import */ var _html__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ./html */ \"./src/js/html.js\");\n/* harmony import */ var _raw_html__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! ./raw-html */ \"./src/js/raw-html.js\");\n/* harmony import */ var _image__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(/*! ./image */ \"./src/js/image.js\");\n/* harmony import */ var _json__WEBPACK_IMPORTED_MODULE_6__ = __webpack_require__(/*! ./json */ \"./src/js/json.js\");\n\n\nfunction _typeof(obj) { \"@babel/helpers - typeof\"; if (typeof Symbol === \"function\" && typeof Symbol.iterator === \"symbol\") { _typeof = function _typeof(obj) { return typeof obj; }; } else { _typeof = function _typeof(obj) { return obj && typeof Symbol === \"function\" && obj.constructor === Symbol && obj !== Symbol.prototype ? \"symbol\" : typeof obj; }; } return _typeof(obj); }\n\n\n\n\n\n\n\n\nvar printTypes = ['pdf', 'html', 'image', 'json', 'raw-html'];\n/* harmony default export */ __webpack_exports__[\"default\"] = ({\n init: function init() {\n var params = {\n printable: null,\n fallbackPrintable: null,\n type: 'pdf',\n header: null,\n headerStyle: 'font-weight: 300;',\n maxWidth: 800,\n properties: null,\n gridHeaderStyle: 'font-weight: bold; padding: 5px; border: 1px solid #dddddd;',\n gridStyle: 'border: 1px solid lightgray; margin-bottom: -1px;',\n showModal: false,\n onError: function onError(error) {\n throw error;\n },\n onLoadingStart: null,\n onLoadingEnd: null,\n onPrintDialogClose: function onPrintDialogClose() {},\n onIncompatibleBrowser: function onIncompatibleBrowser() {},\n modalMessage: 'Retrieving Document...',\n frameId: 'printJS',\n printableElement: null,\n documentTitle: 'Document',\n targetStyle: ['clear', 'display', 'width', 'min-width', 'height', 'min-height', 'max-height'],\n targetStyles: ['border', 'box', 'break', 'text-decoration'],\n ignoreElements: [],\n repeatTableHeader: true,\n css: null,\n style: null,\n scanStyles: true,\n base64: false,\n // Deprecated\n onPdfOpen: null,\n font: 'TimesNewRoman',\n font_size: '12pt',\n honorMarginPadding: true,\n honorColor: false,\n imageStyle: 'max-width: 100%;'\n }; // Check if a printable document or object was supplied\n\n var args = arguments[0];\n\n if (args === undefined) {\n throw new Error('printJS expects at least 1 attribute.');\n } // Process parameters\n\n\n switch (_typeof(args)) {\n case 'string':\n params.printable = encodeURI(args);\n params.fallbackPrintable = params.printable;\n params.type = arguments[1] || params.type;\n break;\n\n case 'object':\n params.printable = args.printable;\n params.fallbackPrintable = typeof args.fallbackPrintable !== 'undefined' ? args.fallbackPrintable : params.printable;\n params.fallbackPrintable = params.base64 ? \"data:application/pdf;base64,\".concat(params.fallbackPrintable) : params.fallbackPrintable;\n\n for (var k in params) {\n if (k === 'printable' || k === 'fallbackPrintable') continue;\n params[k] = typeof args[k] !== 'undefined' ? args[k] : params[k];\n }\n\n break;\n\n default:\n throw new Error('Unexpected argument type! Expected \"string\" or \"object\", got ' + _typeof(args));\n } // Validate printable\n\n\n if (!params.printable) throw new Error('Missing printable information.'); // Validate type\n\n if (!params.type || typeof params.type !== 'string' || printTypes.indexOf(params.type.toLowerCase()) === -1) {\n throw new Error('Invalid print type. Available types are: pdf, html, image and json.');\n } // Check if we are showing a feedback message to the user (useful for large files)\n\n\n if (params.showModal) _modal__WEBPACK_IMPORTED_MODULE_1__[\"default\"].show(params); // Check for a print start hook function\n\n if (params.onLoadingStart) params.onLoadingStart(); // To prevent duplication and issues, remove any used printFrame from the DOM\n\n var usedFrame = document.getElementById(params.frameId);\n if (usedFrame) usedFrame.parentNode.removeChild(usedFrame); // Create a new iframe for the print job\n\n var printFrame = document.createElement('iframe');\n\n if (_browser__WEBPACK_IMPORTED_MODULE_0__[\"default\"].isFirefox()) {\n // Set the iframe to be is visible on the page (guaranteed by fixed position) but hidden using opacity 0, because\n // this works in Firefox. The height needs to be sufficient for some part of the document other than the PDF\n // viewer's toolbar to be visible in the page\n printFrame.setAttribute('style', 'width: 1px; height: 100px; position: fixed; left: 0; top: 0; opacity: 0; border-width: 0; margin: 0; padding: 0');\n } else {\n // Hide the iframe in other browsers\n printFrame.setAttribute('style', 'visibility: hidden; height: 0; width: 0; position: absolute; border: 0');\n } // Set iframe element id\n\n\n printFrame.setAttribute('id', params.frameId); // For non pdf printing, pass an html document string to srcdoc (force onload callback)\n\n if (params.type !== 'pdf') {\n printFrame.srcdoc = '' + params.documentTitle + ''; // Attach css files\n\n if (params.css) {\n // Add support for single file\n if (!Array.isArray(params.css)) params.css = [params.css]; // Create link tags for each css file\n\n params.css.forEach(function (file) {\n printFrame.srcdoc += '';\n });\n }\n\n printFrame.srcdoc += '';\n } // Check printable type\n\n\n switch (params.type) {\n case 'pdf':\n // Check browser support for pdf and if not supported we will just open the pdf file instead\n if (_browser__WEBPACK_IMPORTED_MODULE_0__[\"default\"].isIE()) {\n try {\n console.info('Print.js doesn\\'t support PDF printing in Internet Explorer.');\n var win = window.open(params.fallbackPrintable, '_blank');\n win.focus();\n params.onIncompatibleBrowser();\n } catch (error) {\n params.onError(error);\n } finally {\n // Make sure there is no loading modal opened\n if (params.showModal) _modal__WEBPACK_IMPORTED_MODULE_1__[\"default\"].close();\n if (params.onLoadingEnd) params.onLoadingEnd();\n }\n } else {\n _pdf__WEBPACK_IMPORTED_MODULE_2__[\"default\"].print(params, printFrame);\n }\n\n break;\n\n case 'image':\n _image__WEBPACK_IMPORTED_MODULE_5__[\"default\"].print(params, printFrame);\n break;\n\n case 'html':\n _html__WEBPACK_IMPORTED_MODULE_3__[\"default\"].print(params, printFrame);\n break;\n\n case 'raw-html':\n _raw_html__WEBPACK_IMPORTED_MODULE_4__[\"default\"].print(params, printFrame);\n break;\n\n case 'json':\n _json__WEBPACK_IMPORTED_MODULE_6__[\"default\"].print(params, printFrame);\n break;\n }\n }\n});\n\n/***/ }),\n\n/***/ \"./src/js/json.js\":\n/*!************************!*\\\n !*** ./src/js/json.js ***!\n \\************************/\n/*! exports provided: default */\n/***/ (function(module, __webpack_exports__, __webpack_require__) {\n\n\"use strict\";\n__webpack_require__.r(__webpack_exports__);\n/* harmony import */ var _functions__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./functions */ \"./src/js/functions.js\");\n/* harmony import */ var _print__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ./print */ \"./src/js/print.js\");\nfunction _typeof(obj) { \"@babel/helpers - typeof\"; if (typeof Symbol === \"function\" && typeof Symbol.iterator === \"symbol\") { _typeof = function _typeof(obj) { return typeof obj; }; } else { _typeof = function _typeof(obj) { return obj && typeof Symbol === \"function\" && obj.constructor === Symbol && obj !== Symbol.prototype ? \"symbol\" : typeof obj; }; } return _typeof(obj); }\n\n\n\n/* harmony default export */ __webpack_exports__[\"default\"] = ({\n print: function print(params, printFrame) {\n // Check if we received proper data\n if (_typeof(params.printable) !== 'object') {\n throw new Error('Invalid javascript data object (JSON).');\n } // Validate repeatTableHeader\n\n\n if (typeof params.repeatTableHeader !== 'boolean') {\n throw new Error('Invalid value for repeatTableHeader attribute (JSON).');\n } // Validate properties\n\n\n if (!params.properties || !Array.isArray(params.properties)) {\n throw new Error('Invalid properties array for your JSON data.');\n } // We will format the property objects to keep the JSON api compatible with older releases\n\n\n params.properties = params.properties.map(function (property) {\n return {\n field: _typeof(property) === 'object' ? property.field : property,\n displayName: _typeof(property) === 'object' ? property.displayName : property,\n columnSize: _typeof(property) === 'object' && property.columnSize ? property.columnSize + ';' : 100 / params.properties.length + '%;'\n };\n }); // Create a print container element\n\n params.printableElement = document.createElement('div'); // Check if we are adding a print header\n\n if (params.header) {\n Object(_functions__WEBPACK_IMPORTED_MODULE_0__[\"addHeader\"])(params.printableElement, params);\n } // Build the printable html data\n\n\n params.printableElement.innerHTML += jsonToHTML(params); // Print the json data\n\n _print__WEBPACK_IMPORTED_MODULE_1__[\"default\"].send(params, printFrame);\n }\n});\n\nfunction jsonToHTML(params) {\n // Get the row and column data\n var data = params.printable;\n var properties = params.properties; // Create a html table\n\n var htmlData = ''; // Check if the header should be repeated\n\n if (params.repeatTableHeader) {\n htmlData += '';\n } // Add the table header row\n\n\n htmlData += ''; // Add the table header columns\n\n for (var a = 0; a < properties.length; a++) {\n htmlData += '';\n } // Add the closing tag for the table header row\n\n\n htmlData += ''; // If the table header is marked as repeated, add the closing tag\n\n if (params.repeatTableHeader) {\n htmlData += '';\n } // Create the table body\n\n\n htmlData += ''; // Add the table data rows\n\n for (var i = 0; i < data.length; i++) {\n // Add the row starting tag\n htmlData += ''; // Print selected properties only\n\n for (var n = 0; n < properties.length; n++) {\n var stringData = data[i]; // Support nested objects\n\n var property = properties[n].field.split('.');\n\n if (property.length > 1) {\n for (var p = 0; p < property.length; p++) {\n stringData = stringData[property[p]];\n }\n } else {\n stringData = stringData[properties[n].field];\n } // Add the row contents and styles\n\n\n htmlData += '';\n } // Add the row closing tag\n\n\n htmlData += '';\n } // Add the table and body closing tags\n\n\n htmlData += '
' + Object(_functions__WEBPACK_IMPORTED_MODULE_0__[\"capitalizePrint\"])(properties[a].displayName) + '
' + stringData + '
';\n return htmlData;\n}\n\n/***/ }),\n\n/***/ \"./src/js/modal.js\":\n/*!*************************!*\\\n !*** ./src/js/modal.js ***!\n \\*************************/\n/*! exports provided: default */\n/***/ (function(module, __webpack_exports__, __webpack_require__) {\n\n\"use strict\";\n__webpack_require__.r(__webpack_exports__);\nvar Modal = {\n show: function show(params) {\n // Build modal\n var modalStyle = 'font-family:sans-serif; ' + 'display:table; ' + 'text-align:center; ' + 'font-weight:300; ' + 'font-size:30px; ' + 'left:0; top:0;' + 'position:fixed; ' + 'z-index: 9990;' + 'color: #0460B5; ' + 'width: 100%; ' + 'height: 100%; ' + 'background-color:rgba(255,255,255,.9);' + 'transition: opacity .3s ease;'; // Create wrapper\n\n var printModal = document.createElement('div');\n printModal.setAttribute('style', modalStyle);\n printModal.setAttribute('id', 'printJS-Modal'); // Create content div\n\n var contentDiv = document.createElement('div');\n contentDiv.setAttribute('style', 'display:table-cell; vertical-align:middle; padding-bottom:100px;'); // Add close button (requires print.css)\n\n var closeButton = document.createElement('div');\n closeButton.setAttribute('class', 'printClose');\n closeButton.setAttribute('id', 'printClose');\n contentDiv.appendChild(closeButton); // Add spinner (requires print.css)\n\n var spinner = document.createElement('span');\n spinner.setAttribute('class', 'printSpinner');\n contentDiv.appendChild(spinner); // Add message\n\n var messageNode = document.createTextNode(params.modalMessage);\n contentDiv.appendChild(messageNode); // Add contentDiv to printModal\n\n printModal.appendChild(contentDiv); // Append print modal element to document body\n\n document.getElementsByTagName('body')[0].appendChild(printModal); // Add event listener to close button\n\n document.getElementById('printClose').addEventListener('click', function () {\n Modal.close();\n });\n },\n close: function close() {\n var printModal = document.getElementById('printJS-Modal');\n\n if (printModal) {\n printModal.parentNode.removeChild(printModal);\n }\n }\n};\n/* harmony default export */ __webpack_exports__[\"default\"] = (Modal);\n\n/***/ }),\n\n/***/ \"./src/js/pdf.js\":\n/*!***********************!*\\\n !*** ./src/js/pdf.js ***!\n \\***********************/\n/*! exports provided: default */\n/***/ (function(module, __webpack_exports__, __webpack_require__) {\n\n\"use strict\";\n__webpack_require__.r(__webpack_exports__);\n/* harmony import */ var _print__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./print */ \"./src/js/print.js\");\n/* harmony import */ var _functions__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ./functions */ \"./src/js/functions.js\");\n\n\n/* harmony default export */ __webpack_exports__[\"default\"] = ({\n print: function print(params, printFrame) {\n // Check if we have base64 data\n if (params.base64) {\n var bytesArray = Uint8Array.from(atob(params.printable), function (c) {\n return c.charCodeAt(0);\n });\n createBlobAndPrint(params, printFrame, bytesArray);\n return;\n } // Format pdf url\n\n\n params.printable = /^(blob|http|\\/\\/)/i.test(params.printable) ? params.printable : window.location.origin + (params.printable.charAt(0) !== '/' ? '/' + params.printable : params.printable); // Get the file through a http request (Preload)\n\n var req = new window.XMLHttpRequest();\n req.responseType = 'arraybuffer';\n req.addEventListener('error', function () {\n Object(_functions__WEBPACK_IMPORTED_MODULE_1__[\"cleanUp\"])(params);\n params.onError(req.statusText); // Since we don't have a pdf document available, we will stop the print job\n });\n req.addEventListener('load', function () {\n // Check for errors\n if ([200, 201].indexOf(req.status) === -1) {\n Object(_functions__WEBPACK_IMPORTED_MODULE_1__[\"cleanUp\"])(params);\n params.onError(req.statusText); // Since we don't have a pdf document available, we will stop the print job\n\n return;\n } // Print requested document\n\n\n createBlobAndPrint(params, printFrame, req.response);\n });\n req.open('GET', params.printable, true);\n req.send();\n }\n});\n\nfunction createBlobAndPrint(params, printFrame, data) {\n // Pass response or base64 data to a blob and create a local object url\n var localPdf = new window.Blob([data], {\n type: 'application/pdf'\n });\n localPdf = window.URL.createObjectURL(localPdf); // Set iframe src with pdf document url\n\n printFrame.setAttribute('src', localPdf);\n _print__WEBPACK_IMPORTED_MODULE_0__[\"default\"].send(params, printFrame);\n}\n\n/***/ }),\n\n/***/ \"./src/js/print.js\":\n/*!*************************!*\\\n !*** ./src/js/print.js ***!\n \\*************************/\n/*! exports provided: default */\n/***/ (function(module, __webpack_exports__, __webpack_require__) {\n\n\"use strict\";\n__webpack_require__.r(__webpack_exports__);\n/* harmony import */ var _browser__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./browser */ \"./src/js/browser.js\");\n/* harmony import */ var _functions__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ./functions */ \"./src/js/functions.js\");\n\n\nvar Print = {\n send: function send(params, printFrame) {\n // Append iframe element to document body\n document.getElementsByTagName('body')[0].appendChild(printFrame); // Get iframe element\n\n var iframeElement = document.getElementById(params.frameId); // Wait for iframe to load all content\n\n iframeElement.onload = function () {\n if (params.type === 'pdf') {\n // Add a delay for Firefox. In my tests, 1000ms was sufficient but 100ms was not\n if (_browser__WEBPACK_IMPORTED_MODULE_0__[\"default\"].isFirefox()) {\n setTimeout(function () {\n return performPrint(iframeElement, params);\n }, 1000);\n } else {\n performPrint(iframeElement, params);\n }\n\n return;\n } // Get iframe element document\n\n\n var printDocument = iframeElement.contentWindow || iframeElement.contentDocument;\n if (printDocument.document) printDocument = printDocument.document; // Append printable element to the iframe body\n\n printDocument.body.appendChild(params.printableElement); // Add custom style\n\n if (params.type !== 'pdf' && params.style) {\n // Create style element\n var style = document.createElement('style');\n style.innerHTML = params.style; // Append style element to iframe's head\n\n printDocument.head.appendChild(style);\n } // If printing images, wait for them to load inside the iframe\n\n\n var images = printDocument.getElementsByTagName('img');\n\n if (images.length > 0) {\n loadIframeImages(Array.from(images)).then(function () {\n return performPrint(iframeElement, params);\n });\n } else {\n performPrint(iframeElement, params);\n }\n };\n }\n};\n\nfunction performPrint(iframeElement, params) {\n try {\n iframeElement.focus(); // If Edge or IE, try catch with execCommand\n\n if (_browser__WEBPACK_IMPORTED_MODULE_0__[\"default\"].isEdge() || _browser__WEBPACK_IMPORTED_MODULE_0__[\"default\"].isIE()) {\n try {\n iframeElement.contentWindow.document.execCommand('print', false, null);\n } catch (e) {\n iframeElement.contentWindow.print();\n }\n } else {\n // Other browsers\n iframeElement.contentWindow.print();\n }\n } catch (error) {\n params.onError(error);\n } finally {\n if (_browser__WEBPACK_IMPORTED_MODULE_0__[\"default\"].isFirefox()) {\n // Move the iframe element off-screen and make it invisible\n iframeElement.style.visibility = 'hidden';\n iframeElement.style.left = '-1px';\n }\n\n Object(_functions__WEBPACK_IMPORTED_MODULE_1__[\"cleanUp\"])(params);\n }\n}\n\nfunction loadIframeImages(images) {\n var promises = images.map(function (image) {\n if (image.src && image.src !== window.location.href) {\n return loadIframeImage(image);\n }\n });\n return Promise.all(promises);\n}\n\nfunction loadIframeImage(image) {\n return new Promise(function (resolve) {\n var pollImage = function pollImage() {\n !image || typeof image.naturalWidth === 'undefined' || image.naturalWidth === 0 || !image.complete ? setTimeout(pollImage, 500) : resolve();\n };\n\n pollImage();\n });\n}\n\n/* harmony default export */ __webpack_exports__[\"default\"] = (Print);\n\n/***/ }),\n\n/***/ \"./src/js/raw-html.js\":\n/*!****************************!*\\\n !*** ./src/js/raw-html.js ***!\n \\****************************/\n/*! exports provided: default */\n/***/ (function(module, __webpack_exports__, __webpack_require__) {\n\n\"use strict\";\n__webpack_require__.r(__webpack_exports__);\n/* harmony import */ var _print__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./print */ \"./src/js/print.js\");\n\n/* harmony default export */ __webpack_exports__[\"default\"] = ({\n print: function print(params, printFrame) {\n // Create printable element (container)\n params.printableElement = document.createElement('div');\n params.printableElement.setAttribute('style', 'width:100%'); // Set our raw html as the printable element inner html content\n\n params.printableElement.innerHTML = params.printable; // Print html contents\n\n _print__WEBPACK_IMPORTED_MODULE_0__[\"default\"].send(params, printFrame);\n }\n});\n\n/***/ }),\n\n/***/ \"./src/sass/index.scss\":\n/*!*****************************!*\\\n !*** ./src/sass/index.scss ***!\n \\*****************************/\n/*! no static exports found */\n/***/ (function(module, exports, __webpack_require__) {\n\n// extracted by mini-css-extract-plugin\n\n/***/ }),\n\n/***/ 0:\n/*!****************************!*\\\n !*** multi ./src/index.js ***!\n \\****************************/\n/*! no static exports found */\n/***/ (function(module, exports, __webpack_require__) {\n\nmodule.exports = __webpack_require__(/*! ./src/index.js */\"./src/index.js\");\n\n\n/***/ })\n\n/******/ })[\"default\"];\n});\n//# sourceMappingURL=print.map","\nvar canPromise = require('./can-promise')\n\nvar QRCode = require('./core/qrcode')\nvar CanvasRenderer = require('./renderer/canvas')\nvar SvgRenderer = require('./renderer/svg-tag.js')\n\nfunction renderCanvas (renderFunc, canvas, text, opts, cb) {\n var args = [].slice.call(arguments, 1)\n var argsNum = args.length\n var isLastArgCb = typeof args[argsNum - 1] === 'function'\n\n if (!isLastArgCb && !canPromise()) {\n throw new Error('Callback required as last argument')\n }\n\n if (isLastArgCb) {\n if (argsNum < 2) {\n throw new Error('Too few arguments provided')\n }\n\n if (argsNum === 2) {\n cb = text\n text = canvas\n canvas = opts = undefined\n } else if (argsNum === 3) {\n if (canvas.getContext && typeof cb === 'undefined') {\n cb = opts\n opts = undefined\n } else {\n cb = opts\n opts = text\n text = canvas\n canvas = undefined\n }\n }\n } else {\n if (argsNum < 1) {\n throw new Error('Too few arguments provided')\n }\n\n if (argsNum === 1) {\n text = canvas\n canvas = opts = undefined\n } else if (argsNum === 2 && !canvas.getContext) {\n opts = text\n text = canvas\n canvas = undefined\n }\n\n return new Promise(function (resolve, reject) {\n try {\n var data = QRCode.create(text, opts)\n resolve(renderFunc(data, canvas, opts))\n } catch (e) {\n reject(e)\n }\n })\n }\n\n try {\n var data = QRCode.create(text, opts)\n cb(null, renderFunc(data, canvas, opts))\n } catch (e) {\n cb(e)\n }\n}\n\nexports.create = QRCode.create\nexports.toCanvas = renderCanvas.bind(null, CanvasRenderer.render)\nexports.toDataURL = renderCanvas.bind(null, CanvasRenderer.renderToDataURL)\n\n// only svg for now.\nexports.toString = renderCanvas.bind(null, function (data, _, opts) {\n return SvgRenderer.render(data, opts)\n})\n","// can-promise has a crash in some versions of react native that dont have\n// standard global objects\n// https://github.com/soldair/node-qrcode/issues/157\n\nmodule.exports = function () {\n return typeof Promise === 'function' && Promise.prototype && Promise.prototype.then\n}\n","/**\n * Alignment pattern are fixed reference pattern in defined positions\n * in a matrix symbology, which enables the decode software to re-synchronise\n * the coordinate mapping of the image modules in the event of moderate amounts\n * of distortion of the image.\n *\n * Alignment patterns are present only in QR Code symbols of version 2 or larger\n * and their number depends on the symbol version.\n */\n\nvar getSymbolSize = require('./utils').getSymbolSize\n\n/**\n * Calculate the row/column coordinates of the center module of each alignment pattern\n * for the specified QR Code version.\n *\n * The alignment patterns are positioned symmetrically on either side of the diagonal\n * running from the top left corner of the symbol to the bottom right corner.\n *\n * Since positions are simmetrical only half of the coordinates are returned.\n * Each item of the array will represent in turn the x and y coordinate.\n * @see {@link getPositions}\n *\n * @param {Number} version QR Code version\n * @return {Array} Array of coordinate\n */\nexports.getRowColCoords = function getRowColCoords (version) {\n if (version === 1) return []\n\n var posCount = Math.floor(version / 7) + 2\n var size = getSymbolSize(version)\n var intervals = size === 145 ? 26 : Math.ceil((size - 13) / (2 * posCount - 2)) * 2\n var positions = [size - 7] // Last coord is always (size - 7)\n\n for (var i = 1; i < posCount - 1; i++) {\n positions[i] = positions[i - 1] - intervals\n }\n\n positions.push(6) // First coord is always 6\n\n return positions.reverse()\n}\n\n/**\n * Returns an array containing the positions of each alignment pattern.\n * Each array's element represent the center point of the pattern as (x, y) coordinates\n *\n * Coordinates are calculated expanding the row/column coordinates returned by {@link getRowColCoords}\n * and filtering out the items that overlaps with finder pattern\n *\n * @example\n * For a Version 7 symbol {@link getRowColCoords} returns values 6, 22 and 38.\n * The alignment patterns, therefore, are to be centered on (row, column)\n * positions (6,22), (22,6), (22,22), (22,38), (38,22), (38,38).\n * Note that the coordinates (6,6), (6,38), (38,6) are occupied by finder patterns\n * and are not therefore used for alignment patterns.\n *\n * var pos = getPositions(7)\n * // [[6,22], [22,6], [22,22], [22,38], [38,22], [38,38]]\n *\n * @param {Number} version QR Code version\n * @return {Array} Array of coordinates\n */\nexports.getPositions = function getPositions (version) {\n var coords = []\n var pos = exports.getRowColCoords(version)\n var posLength = pos.length\n\n for (var i = 0; i < posLength; i++) {\n for (var j = 0; j < posLength; j++) {\n // Skip if position is occupied by finder patterns\n if ((i === 0 && j === 0) || // top-left\n (i === 0 && j === posLength - 1) || // bottom-left\n (i === posLength - 1 && j === 0)) { // top-right\n continue\n }\n\n coords.push([pos[i], pos[j]])\n }\n }\n\n return coords\n}\n","var Mode = require('./mode')\n\n/**\n * Array of characters available in alphanumeric mode\n *\n * As per QR Code specification, to each character\n * is assigned a value from 0 to 44 which in this case coincides\n * with the array index\n *\n * @type {Array}\n */\nvar ALPHA_NUM_CHARS = [\n '0', '1', '2', '3', '4', '5', '6', '7', '8', '9',\n 'A', 'B', 'C', 'D', 'E', 'F', 'G', 'H', 'I', 'J', 'K', 'L', 'M',\n 'N', 'O', 'P', 'Q', 'R', 'S', 'T', 'U', 'V', 'W', 'X', 'Y', 'Z',\n ' ', '$', '%', '*', '+', '-', '.', '/', ':'\n]\n\nfunction AlphanumericData (data) {\n this.mode = Mode.ALPHANUMERIC\n this.data = data\n}\n\nAlphanumericData.getBitsLength = function getBitsLength (length) {\n return 11 * Math.floor(length / 2) + 6 * (length % 2)\n}\n\nAlphanumericData.prototype.getLength = function getLength () {\n return this.data.length\n}\n\nAlphanumericData.prototype.getBitsLength = function getBitsLength () {\n return AlphanumericData.getBitsLength(this.data.length)\n}\n\nAlphanumericData.prototype.write = function write (bitBuffer) {\n var i\n\n // Input data characters are divided into groups of two characters\n // and encoded as 11-bit binary codes.\n for (i = 0; i + 2 <= this.data.length; i += 2) {\n // The character value of the first character is multiplied by 45\n var value = ALPHA_NUM_CHARS.indexOf(this.data[i]) * 45\n\n // The character value of the second digit is added to the product\n value += ALPHA_NUM_CHARS.indexOf(this.data[i + 1])\n\n // The sum is then stored as 11-bit binary number\n bitBuffer.put(value, 11)\n }\n\n // If the number of input data characters is not a multiple of two,\n // the character value of the final character is encoded as a 6-bit binary number.\n if (this.data.length % 2) {\n bitBuffer.put(ALPHA_NUM_CHARS.indexOf(this.data[i]), 6)\n }\n}\n\nmodule.exports = AlphanumericData\n","function BitBuffer () {\n this.buffer = []\n this.length = 0\n}\n\nBitBuffer.prototype = {\n\n get: function (index) {\n var bufIndex = Math.floor(index / 8)\n return ((this.buffer[bufIndex] >>> (7 - index % 8)) & 1) === 1\n },\n\n put: function (num, length) {\n for (var i = 0; i < length; i++) {\n this.putBit(((num >>> (length - i - 1)) & 1) === 1)\n }\n },\n\n getLengthInBits: function () {\n return this.length\n },\n\n putBit: function (bit) {\n var bufIndex = Math.floor(this.length / 8)\n if (this.buffer.length <= bufIndex) {\n this.buffer.push(0)\n }\n\n if (bit) {\n this.buffer[bufIndex] |= (0x80 >>> (this.length % 8))\n }\n\n this.length++\n }\n}\n\nmodule.exports = BitBuffer\n","var BufferUtil = require('../utils/buffer')\n\n/**\n * Helper class to handle QR Code symbol modules\n *\n * @param {Number} size Symbol size\n */\nfunction BitMatrix (size) {\n if (!size || size < 1) {\n throw new Error('BitMatrix size must be defined and greater than 0')\n }\n\n this.size = size\n this.data = BufferUtil.alloc(size * size)\n this.reservedBit = BufferUtil.alloc(size * size)\n}\n\n/**\n * Set bit value at specified location\n * If reserved flag is set, this bit will be ignored during masking process\n *\n * @param {Number} row\n * @param {Number} col\n * @param {Boolean} value\n * @param {Boolean} reserved\n */\nBitMatrix.prototype.set = function (row, col, value, reserved) {\n var index = row * this.size + col\n this.data[index] = value\n if (reserved) this.reservedBit[index] = true\n}\n\n/**\n * Returns bit value at specified location\n *\n * @param {Number} row\n * @param {Number} col\n * @return {Boolean}\n */\nBitMatrix.prototype.get = function (row, col) {\n return this.data[row * this.size + col]\n}\n\n/**\n * Applies xor operator at specified location\n * (used during masking process)\n *\n * @param {Number} row\n * @param {Number} col\n * @param {Boolean} value\n */\nBitMatrix.prototype.xor = function (row, col, value) {\n this.data[row * this.size + col] ^= value\n}\n\n/**\n * Check if bit at specified location is reserved\n *\n * @param {Number} row\n * @param {Number} col\n * @return {Boolean}\n */\nBitMatrix.prototype.isReserved = function (row, col) {\n return this.reservedBit[row * this.size + col]\n}\n\nmodule.exports = BitMatrix\n","var BufferUtil = require('../utils/buffer')\nvar Mode = require('./mode')\n\nfunction ByteData (data) {\n this.mode = Mode.BYTE\n this.data = BufferUtil.from(data)\n}\n\nByteData.getBitsLength = function getBitsLength (length) {\n return length * 8\n}\n\nByteData.prototype.getLength = function getLength () {\n return this.data.length\n}\n\nByteData.prototype.getBitsLength = function getBitsLength () {\n return ByteData.getBitsLength(this.data.length)\n}\n\nByteData.prototype.write = function (bitBuffer) {\n for (var i = 0, l = this.data.length; i < l; i++) {\n bitBuffer.put(this.data[i], 8)\n }\n}\n\nmodule.exports = ByteData\n","var ECLevel = require('./error-correction-level')\r\n\r\nvar EC_BLOCKS_TABLE = [\r\n// L M Q H\r\n 1, 1, 1, 1,\r\n 1, 1, 1, 1,\r\n 1, 1, 2, 2,\r\n 1, 2, 2, 4,\r\n 1, 2, 4, 4,\r\n 2, 4, 4, 4,\r\n 2, 4, 6, 5,\r\n 2, 4, 6, 6,\r\n 2, 5, 8, 8,\r\n 4, 5, 8, 8,\r\n 4, 5, 8, 11,\r\n 4, 8, 10, 11,\r\n 4, 9, 12, 16,\r\n 4, 9, 16, 16,\r\n 6, 10, 12, 18,\r\n 6, 10, 17, 16,\r\n 6, 11, 16, 19,\r\n 6, 13, 18, 21,\r\n 7, 14, 21, 25,\r\n 8, 16, 20, 25,\r\n 8, 17, 23, 25,\r\n 9, 17, 23, 34,\r\n 9, 18, 25, 30,\r\n 10, 20, 27, 32,\r\n 12, 21, 29, 35,\r\n 12, 23, 34, 37,\r\n 12, 25, 34, 40,\r\n 13, 26, 35, 42,\r\n 14, 28, 38, 45,\r\n 15, 29, 40, 48,\r\n 16, 31, 43, 51,\r\n 17, 33, 45, 54,\r\n 18, 35, 48, 57,\r\n 19, 37, 51, 60,\r\n 19, 38, 53, 63,\r\n 20, 40, 56, 66,\r\n 21, 43, 59, 70,\r\n 22, 45, 62, 74,\r\n 24, 47, 65, 77,\r\n 25, 49, 68, 81\r\n]\r\n\r\nvar EC_CODEWORDS_TABLE = [\r\n// L M Q H\r\n 7, 10, 13, 17,\r\n 10, 16, 22, 28,\r\n 15, 26, 36, 44,\r\n 20, 36, 52, 64,\r\n 26, 48, 72, 88,\r\n 36, 64, 96, 112,\r\n 40, 72, 108, 130,\r\n 48, 88, 132, 156,\r\n 60, 110, 160, 192,\r\n 72, 130, 192, 224,\r\n 80, 150, 224, 264,\r\n 96, 176, 260, 308,\r\n 104, 198, 288, 352,\r\n 120, 216, 320, 384,\r\n 132, 240, 360, 432,\r\n 144, 280, 408, 480,\r\n 168, 308, 448, 532,\r\n 180, 338, 504, 588,\r\n 196, 364, 546, 650,\r\n 224, 416, 600, 700,\r\n 224, 442, 644, 750,\r\n 252, 476, 690, 816,\r\n 270, 504, 750, 900,\r\n 300, 560, 810, 960,\r\n 312, 588, 870, 1050,\r\n 336, 644, 952, 1110,\r\n 360, 700, 1020, 1200,\r\n 390, 728, 1050, 1260,\r\n 420, 784, 1140, 1350,\r\n 450, 812, 1200, 1440,\r\n 480, 868, 1290, 1530,\r\n 510, 924, 1350, 1620,\r\n 540, 980, 1440, 1710,\r\n 570, 1036, 1530, 1800,\r\n 570, 1064, 1590, 1890,\r\n 600, 1120, 1680, 1980,\r\n 630, 1204, 1770, 2100,\r\n 660, 1260, 1860, 2220,\r\n 720, 1316, 1950, 2310,\r\n 750, 1372, 2040, 2430\r\n]\r\n\r\n/**\r\n * Returns the number of error correction block that the QR Code should contain\r\n * for the specified version and error correction level.\r\n *\r\n * @param {Number} version QR Code version\r\n * @param {Number} errorCorrectionLevel Error correction level\r\n * @return {Number} Number of error correction blocks\r\n */\r\nexports.getBlocksCount = function getBlocksCount (version, errorCorrectionLevel) {\r\n switch (errorCorrectionLevel) {\r\n case ECLevel.L:\r\n return EC_BLOCKS_TABLE[(version - 1) * 4 + 0]\r\n case ECLevel.M:\r\n return EC_BLOCKS_TABLE[(version - 1) * 4 + 1]\r\n case ECLevel.Q:\r\n return EC_BLOCKS_TABLE[(version - 1) * 4 + 2]\r\n case ECLevel.H:\r\n return EC_BLOCKS_TABLE[(version - 1) * 4 + 3]\r\n default:\r\n return undefined\r\n }\r\n}\r\n\r\n/**\r\n * Returns the number of error correction codewords to use for the specified\r\n * version and error correction level.\r\n *\r\n * @param {Number} version QR Code version\r\n * @param {Number} errorCorrectionLevel Error correction level\r\n * @return {Number} Number of error correction codewords\r\n */\r\nexports.getTotalCodewordsCount = function getTotalCodewordsCount (version, errorCorrectionLevel) {\r\n switch (errorCorrectionLevel) {\r\n case ECLevel.L:\r\n return EC_CODEWORDS_TABLE[(version - 1) * 4 + 0]\r\n case ECLevel.M:\r\n return EC_CODEWORDS_TABLE[(version - 1) * 4 + 1]\r\n case ECLevel.Q:\r\n return EC_CODEWORDS_TABLE[(version - 1) * 4 + 2]\r\n case ECLevel.H:\r\n return EC_CODEWORDS_TABLE[(version - 1) * 4 + 3]\r\n default:\r\n return undefined\r\n }\r\n}\r\n","exports.L = { bit: 1 }\nexports.M = { bit: 0 }\nexports.Q = { bit: 3 }\nexports.H = { bit: 2 }\n\nfunction fromString (string) {\n if (typeof string !== 'string') {\n throw new Error('Param is not a string')\n }\n\n var lcStr = string.toLowerCase()\n\n switch (lcStr) {\n case 'l':\n case 'low':\n return exports.L\n\n case 'm':\n case 'medium':\n return exports.M\n\n case 'q':\n case 'quartile':\n return exports.Q\n\n case 'h':\n case 'high':\n return exports.H\n\n default:\n throw new Error('Unknown EC Level: ' + string)\n }\n}\n\nexports.isValid = function isValid (level) {\n return level && typeof level.bit !== 'undefined' &&\n level.bit >= 0 && level.bit < 4\n}\n\nexports.from = function from (value, defaultValue) {\n if (exports.isValid(value)) {\n return value\n }\n\n try {\n return fromString(value)\n } catch (e) {\n return defaultValue\n }\n}\n","var getSymbolSize = require('./utils').getSymbolSize\nvar FINDER_PATTERN_SIZE = 7\n\n/**\n * Returns an array containing the positions of each finder pattern.\n * Each array's element represent the top-left point of the pattern as (x, y) coordinates\n *\n * @param {Number} version QR Code version\n * @return {Array} Array of coordinates\n */\nexports.getPositions = function getPositions (version) {\n var size = getSymbolSize(version)\n\n return [\n // top-left\n [0, 0],\n // top-right\n [size - FINDER_PATTERN_SIZE, 0],\n // bottom-left\n [0, size - FINDER_PATTERN_SIZE]\n ]\n}\n","var Utils = require('./utils')\n\nvar G15 = (1 << 10) | (1 << 8) | (1 << 5) | (1 << 4) | (1 << 2) | (1 << 1) | (1 << 0)\nvar G15_MASK = (1 << 14) | (1 << 12) | (1 << 10) | (1 << 4) | (1 << 1)\nvar G15_BCH = Utils.getBCHDigit(G15)\n\n/**\n * Returns format information with relative error correction bits\n *\n * The format information is a 15-bit sequence containing 5 data bits,\n * with 10 error correction bits calculated using the (15, 5) BCH code.\n *\n * @param {Number} errorCorrectionLevel Error correction level\n * @param {Number} mask Mask pattern\n * @return {Number} Encoded format information bits\n */\nexports.getEncodedBits = function getEncodedBits (errorCorrectionLevel, mask) {\n var data = ((errorCorrectionLevel.bit << 3) | mask)\n var d = data << 10\n\n while (Utils.getBCHDigit(d) - G15_BCH >= 0) {\n d ^= (G15 << (Utils.getBCHDigit(d) - G15_BCH))\n }\n\n // xor final data with mask pattern in order to ensure that\n // no combination of Error Correction Level and data mask pattern\n // will result in an all-zero data string\n return ((data << 10) | d) ^ G15_MASK\n}\n","var BufferUtil = require('../utils/buffer')\n\nvar EXP_TABLE = BufferUtil.alloc(512)\nvar LOG_TABLE = BufferUtil.alloc(256)\n/**\n * Precompute the log and anti-log tables for faster computation later\n *\n * For each possible value in the galois field 2^8, we will pre-compute\n * the logarithm and anti-logarithm (exponential) of this value\n *\n * ref {@link https://en.wikiversity.org/wiki/Reed%E2%80%93Solomon_codes_for_coders#Introduction_to_mathematical_fields}\n */\n;(function initTables () {\n var x = 1\n for (var i = 0; i < 255; i++) {\n EXP_TABLE[i] = x\n LOG_TABLE[x] = i\n\n x <<= 1 // multiply by 2\n\n // The QR code specification says to use byte-wise modulo 100011101 arithmetic.\n // This means that when a number is 256 or larger, it should be XORed with 0x11D.\n if (x & 0x100) { // similar to x >= 256, but a lot faster (because 0x100 == 256)\n x ^= 0x11D\n }\n }\n\n // Optimization: double the size of the anti-log table so that we don't need to mod 255 to\n // stay inside the bounds (because we will mainly use this table for the multiplication of\n // two GF numbers, no more).\n // @see {@link mul}\n for (i = 255; i < 512; i++) {\n EXP_TABLE[i] = EXP_TABLE[i - 255]\n }\n}())\n\n/**\n * Returns log value of n inside Galois Field\n *\n * @param {Number} n\n * @return {Number}\n */\nexports.log = function log (n) {\n if (n < 1) throw new Error('log(' + n + ')')\n return LOG_TABLE[n]\n}\n\n/**\n * Returns anti-log value of n inside Galois Field\n *\n * @param {Number} n\n * @return {Number}\n */\nexports.exp = function exp (n) {\n return EXP_TABLE[n]\n}\n\n/**\n * Multiplies two number inside Galois Field\n *\n * @param {Number} x\n * @param {Number} y\n * @return {Number}\n */\nexports.mul = function mul (x, y) {\n if (x === 0 || y === 0) return 0\n\n // should be EXP_TABLE[(LOG_TABLE[x] + LOG_TABLE[y]) % 255] if EXP_TABLE wasn't oversized\n // @see {@link initTables}\n return EXP_TABLE[LOG_TABLE[x] + LOG_TABLE[y]]\n}\n","var Mode = require('./mode')\nvar Utils = require('./utils')\n\nfunction KanjiData (data) {\n this.mode = Mode.KANJI\n this.data = data\n}\n\nKanjiData.getBitsLength = function getBitsLength (length) {\n return length * 13\n}\n\nKanjiData.prototype.getLength = function getLength () {\n return this.data.length\n}\n\nKanjiData.prototype.getBitsLength = function getBitsLength () {\n return KanjiData.getBitsLength(this.data.length)\n}\n\nKanjiData.prototype.write = function (bitBuffer) {\n var i\n\n // In the Shift JIS system, Kanji characters are represented by a two byte combination.\n // These byte values are shifted from the JIS X 0208 values.\n // JIS X 0208 gives details of the shift coded representation.\n for (i = 0; i < this.data.length; i++) {\n var value = Utils.toSJIS(this.data[i])\n\n // For characters with Shift JIS values from 0x8140 to 0x9FFC:\n if (value >= 0x8140 && value <= 0x9FFC) {\n // Subtract 0x8140 from Shift JIS value\n value -= 0x8140\n\n // For characters with Shift JIS values from 0xE040 to 0xEBBF\n } else if (value >= 0xE040 && value <= 0xEBBF) {\n // Subtract 0xC140 from Shift JIS value\n value -= 0xC140\n } else {\n throw new Error(\n 'Invalid SJIS character: ' + this.data[i] + '\\n' +\n 'Make sure your charset is UTF-8')\n }\n\n // Multiply most significant byte of result by 0xC0\n // and add least significant byte to product\n value = (((value >>> 8) & 0xff) * 0xC0) + (value & 0xff)\n\n // Convert result to a 13-bit binary string\n bitBuffer.put(value, 13)\n }\n}\n\nmodule.exports = KanjiData\n","/**\n * Data mask pattern reference\n * @type {Object}\n */\nexports.Patterns = {\n PATTERN000: 0,\n PATTERN001: 1,\n PATTERN010: 2,\n PATTERN011: 3,\n PATTERN100: 4,\n PATTERN101: 5,\n PATTERN110: 6,\n PATTERN111: 7\n}\n\n/**\n * Weighted penalty scores for the undesirable features\n * @type {Object}\n */\nvar PenaltyScores = {\n N1: 3,\n N2: 3,\n N3: 40,\n N4: 10\n}\n\n/**\n * Check if mask pattern value is valid\n *\n * @param {Number} mask Mask pattern\n * @return {Boolean} true if valid, false otherwise\n */\nexports.isValid = function isValid (mask) {\n return mask != null && mask !== '' && !isNaN(mask) && mask >= 0 && mask <= 7\n}\n\n/**\n * Returns mask pattern from a value.\n * If value is not valid, returns undefined\n *\n * @param {Number|String} value Mask pattern value\n * @return {Number} Valid mask pattern or undefined\n */\nexports.from = function from (value) {\n return exports.isValid(value) ? parseInt(value, 10) : undefined\n}\n\n/**\n* Find adjacent modules in row/column with the same color\n* and assign a penalty value.\n*\n* Points: N1 + i\n* i is the amount by which the number of adjacent modules of the same color exceeds 5\n*/\nexports.getPenaltyN1 = function getPenaltyN1 (data) {\n var size = data.size\n var points = 0\n var sameCountCol = 0\n var sameCountRow = 0\n var lastCol = null\n var lastRow = null\n\n for (var row = 0; row < size; row++) {\n sameCountCol = sameCountRow = 0\n lastCol = lastRow = null\n\n for (var col = 0; col < size; col++) {\n var module = data.get(row, col)\n if (module === lastCol) {\n sameCountCol++\n } else {\n if (sameCountCol >= 5) points += PenaltyScores.N1 + (sameCountCol - 5)\n lastCol = module\n sameCountCol = 1\n }\n\n module = data.get(col, row)\n if (module === lastRow) {\n sameCountRow++\n } else {\n if (sameCountRow >= 5) points += PenaltyScores.N1 + (sameCountRow - 5)\n lastRow = module\n sameCountRow = 1\n }\n }\n\n if (sameCountCol >= 5) points += PenaltyScores.N1 + (sameCountCol - 5)\n if (sameCountRow >= 5) points += PenaltyScores.N1 + (sameCountRow - 5)\n }\n\n return points\n}\n\n/**\n * Find 2x2 blocks with the same color and assign a penalty value\n *\n * Points: N2 * (m - 1) * (n - 1)\n */\nexports.getPenaltyN2 = function getPenaltyN2 (data) {\n var size = data.size\n var points = 0\n\n for (var row = 0; row < size - 1; row++) {\n for (var col = 0; col < size - 1; col++) {\n var last = data.get(row, col) +\n data.get(row, col + 1) +\n data.get(row + 1, col) +\n data.get(row + 1, col + 1)\n\n if (last === 4 || last === 0) points++\n }\n }\n\n return points * PenaltyScores.N2\n}\n\n/**\n * Find 1:1:3:1:1 ratio (dark:light:dark:light:dark) pattern in row/column,\n * preceded or followed by light area 4 modules wide\n *\n * Points: N3 * number of pattern found\n */\nexports.getPenaltyN3 = function getPenaltyN3 (data) {\n var size = data.size\n var points = 0\n var bitsCol = 0\n var bitsRow = 0\n\n for (var row = 0; row < size; row++) {\n bitsCol = bitsRow = 0\n for (var col = 0; col < size; col++) {\n bitsCol = ((bitsCol << 1) & 0x7FF) | data.get(row, col)\n if (col >= 10 && (bitsCol === 0x5D0 || bitsCol === 0x05D)) points++\n\n bitsRow = ((bitsRow << 1) & 0x7FF) | data.get(col, row)\n if (col >= 10 && (bitsRow === 0x5D0 || bitsRow === 0x05D)) points++\n }\n }\n\n return points * PenaltyScores.N3\n}\n\n/**\n * Calculate proportion of dark modules in entire symbol\n *\n * Points: N4 * k\n *\n * k is the rating of the deviation of the proportion of dark modules\n * in the symbol from 50% in steps of 5%\n */\nexports.getPenaltyN4 = function getPenaltyN4 (data) {\n var darkCount = 0\n var modulesCount = data.data.length\n\n for (var i = 0; i < modulesCount; i++) darkCount += data.data[i]\n\n var k = Math.abs(Math.ceil((darkCount * 100 / modulesCount) / 5) - 10)\n\n return k * PenaltyScores.N4\n}\n\n/**\n * Return mask value at given position\n *\n * @param {Number} maskPattern Pattern reference value\n * @param {Number} i Row\n * @param {Number} j Column\n * @return {Boolean} Mask value\n */\nfunction getMaskAt (maskPattern, i, j) {\n switch (maskPattern) {\n case exports.Patterns.PATTERN000: return (i + j) % 2 === 0\n case exports.Patterns.PATTERN001: return i % 2 === 0\n case exports.Patterns.PATTERN010: return j % 3 === 0\n case exports.Patterns.PATTERN011: return (i + j) % 3 === 0\n case exports.Patterns.PATTERN100: return (Math.floor(i / 2) + Math.floor(j / 3)) % 2 === 0\n case exports.Patterns.PATTERN101: return (i * j) % 2 + (i * j) % 3 === 0\n case exports.Patterns.PATTERN110: return ((i * j) % 2 + (i * j) % 3) % 2 === 0\n case exports.Patterns.PATTERN111: return ((i * j) % 3 + (i + j) % 2) % 2 === 0\n\n default: throw new Error('bad maskPattern:' + maskPattern)\n }\n}\n\n/**\n * Apply a mask pattern to a BitMatrix\n *\n * @param {Number} pattern Pattern reference number\n * @param {BitMatrix} data BitMatrix data\n */\nexports.applyMask = function applyMask (pattern, data) {\n var size = data.size\n\n for (var col = 0; col < size; col++) {\n for (var row = 0; row < size; row++) {\n if (data.isReserved(row, col)) continue\n data.xor(row, col, getMaskAt(pattern, row, col))\n }\n }\n}\n\n/**\n * Returns the best mask pattern for data\n *\n * @param {BitMatrix} data\n * @return {Number} Mask pattern reference number\n */\nexports.getBestMask = function getBestMask (data, setupFormatFunc) {\n var numPatterns = Object.keys(exports.Patterns).length\n var bestPattern = 0\n var lowerPenalty = Infinity\n\n for (var p = 0; p < numPatterns; p++) {\n setupFormatFunc(p)\n exports.applyMask(p, data)\n\n // Calculate penalty\n var penalty =\n exports.getPenaltyN1(data) +\n exports.getPenaltyN2(data) +\n exports.getPenaltyN3(data) +\n exports.getPenaltyN4(data)\n\n // Undo previously applied mask\n exports.applyMask(p, data)\n\n if (penalty < lowerPenalty) {\n lowerPenalty = penalty\n bestPattern = p\n }\n }\n\n return bestPattern\n}\n","var VersionCheck = require('./version-check')\nvar Regex = require('./regex')\n\n/**\n * Numeric mode encodes data from the decimal digit set (0 - 9)\n * (byte values 30HEX to 39HEX).\n * Normally, 3 data characters are represented by 10 bits.\n *\n * @type {Object}\n */\nexports.NUMERIC = {\n id: 'Numeric',\n bit: 1 << 0,\n ccBits: [10, 12, 14]\n}\n\n/**\n * Alphanumeric mode encodes data from a set of 45 characters,\n * i.e. 10 numeric digits (0 - 9),\n * 26 alphabetic characters (A - Z),\n * and 9 symbols (SP, $, %, *, +, -, ., /, :).\n * Normally, two input characters are represented by 11 bits.\n *\n * @type {Object}\n */\nexports.ALPHANUMERIC = {\n id: 'Alphanumeric',\n bit: 1 << 1,\n ccBits: [9, 11, 13]\n}\n\n/**\n * In byte mode, data is encoded at 8 bits per character.\n *\n * @type {Object}\n */\nexports.BYTE = {\n id: 'Byte',\n bit: 1 << 2,\n ccBits: [8, 16, 16]\n}\n\n/**\n * The Kanji mode efficiently encodes Kanji characters in accordance with\n * the Shift JIS system based on JIS X 0208.\n * The Shift JIS values are shifted from the JIS X 0208 values.\n * JIS X 0208 gives details of the shift coded representation.\n * Each two-byte character value is compacted to a 13-bit binary codeword.\n *\n * @type {Object}\n */\nexports.KANJI = {\n id: 'Kanji',\n bit: 1 << 3,\n ccBits: [8, 10, 12]\n}\n\n/**\n * Mixed mode will contain a sequences of data in a combination of any of\n * the modes described above\n *\n * @type {Object}\n */\nexports.MIXED = {\n bit: -1\n}\n\n/**\n * Returns the number of bits needed to store the data length\n * according to QR Code specifications.\n *\n * @param {Mode} mode Data mode\n * @param {Number} version QR Code version\n * @return {Number} Number of bits\n */\nexports.getCharCountIndicator = function getCharCountIndicator (mode, version) {\n if (!mode.ccBits) throw new Error('Invalid mode: ' + mode)\n\n if (!VersionCheck.isValid(version)) {\n throw new Error('Invalid version: ' + version)\n }\n\n if (version >= 1 && version < 10) return mode.ccBits[0]\n else if (version < 27) return mode.ccBits[1]\n return mode.ccBits[2]\n}\n\n/**\n * Returns the most efficient mode to store the specified data\n *\n * @param {String} dataStr Input data string\n * @return {Mode} Best mode\n */\nexports.getBestModeForData = function getBestModeForData (dataStr) {\n if (Regex.testNumeric(dataStr)) return exports.NUMERIC\n else if (Regex.testAlphanumeric(dataStr)) return exports.ALPHANUMERIC\n else if (Regex.testKanji(dataStr)) return exports.KANJI\n else return exports.BYTE\n}\n\n/**\n * Return mode name as string\n *\n * @param {Mode} mode Mode object\n * @returns {String} Mode name\n */\nexports.toString = function toString (mode) {\n if (mode && mode.id) return mode.id\n throw new Error('Invalid mode')\n}\n\n/**\n * Check if input param is a valid mode object\n *\n * @param {Mode} mode Mode object\n * @returns {Boolean} True if valid mode, false otherwise\n */\nexports.isValid = function isValid (mode) {\n return mode && mode.bit && mode.ccBits\n}\n\n/**\n * Get mode object from its name\n *\n * @param {String} string Mode name\n * @returns {Mode} Mode object\n */\nfunction fromString (string) {\n if (typeof string !== 'string') {\n throw new Error('Param is not a string')\n }\n\n var lcStr = string.toLowerCase()\n\n switch (lcStr) {\n case 'numeric':\n return exports.NUMERIC\n case 'alphanumeric':\n return exports.ALPHANUMERIC\n case 'kanji':\n return exports.KANJI\n case 'byte':\n return exports.BYTE\n default:\n throw new Error('Unknown mode: ' + string)\n }\n}\n\n/**\n * Returns mode from a value.\n * If value is not a valid mode, returns defaultValue\n *\n * @param {Mode|String} value Encoding mode\n * @param {Mode} defaultValue Fallback value\n * @return {Mode} Encoding mode\n */\nexports.from = function from (value, defaultValue) {\n if (exports.isValid(value)) {\n return value\n }\n\n try {\n return fromString(value)\n } catch (e) {\n return defaultValue\n }\n}\n","var Mode = require('./mode')\n\nfunction NumericData (data) {\n this.mode = Mode.NUMERIC\n this.data = data.toString()\n}\n\nNumericData.getBitsLength = function getBitsLength (length) {\n return 10 * Math.floor(length / 3) + ((length % 3) ? ((length % 3) * 3 + 1) : 0)\n}\n\nNumericData.prototype.getLength = function getLength () {\n return this.data.length\n}\n\nNumericData.prototype.getBitsLength = function getBitsLength () {\n return NumericData.getBitsLength(this.data.length)\n}\n\nNumericData.prototype.write = function write (bitBuffer) {\n var i, group, value\n\n // The input data string is divided into groups of three digits,\n // and each group is converted to its 10-bit binary equivalent.\n for (i = 0; i + 3 <= this.data.length; i += 3) {\n group = this.data.substr(i, 3)\n value = parseInt(group, 10)\n\n bitBuffer.put(value, 10)\n }\n\n // If the number of input digits is not an exact multiple of three,\n // the final one or two digits are converted to 4 or 7 bits respectively.\n var remainingNum = this.data.length - i\n if (remainingNum > 0) {\n group = this.data.substr(i)\n value = parseInt(group, 10)\n\n bitBuffer.put(value, remainingNum * 3 + 1)\n }\n}\n\nmodule.exports = NumericData\n","var BufferUtil = require('../utils/buffer')\nvar GF = require('./galois-field')\n\n/**\n * Multiplies two polynomials inside Galois Field\n *\n * @param {Buffer} p1 Polynomial\n * @param {Buffer} p2 Polynomial\n * @return {Buffer} Product of p1 and p2\n */\nexports.mul = function mul (p1, p2) {\n var coeff = BufferUtil.alloc(p1.length + p2.length - 1)\n\n for (var i = 0; i < p1.length; i++) {\n for (var j = 0; j < p2.length; j++) {\n coeff[i + j] ^= GF.mul(p1[i], p2[j])\n }\n }\n\n return coeff\n}\n\n/**\n * Calculate the remainder of polynomials division\n *\n * @param {Buffer} divident Polynomial\n * @param {Buffer} divisor Polynomial\n * @return {Buffer} Remainder\n */\nexports.mod = function mod (divident, divisor) {\n var result = BufferUtil.from(divident)\n\n while ((result.length - divisor.length) >= 0) {\n var coeff = result[0]\n\n for (var i = 0; i < divisor.length; i++) {\n result[i] ^= GF.mul(divisor[i], coeff)\n }\n\n // remove all zeros from buffer head\n var offset = 0\n while (offset < result.length && result[offset] === 0) offset++\n result = result.slice(offset)\n }\n\n return result\n}\n\n/**\n * Generate an irreducible generator polynomial of specified degree\n * (used by Reed-Solomon encoder)\n *\n * @param {Number} degree Degree of the generator polynomial\n * @return {Buffer} Buffer containing polynomial coefficients\n */\nexports.generateECPolynomial = function generateECPolynomial (degree) {\n var poly = BufferUtil.from([1])\n for (var i = 0; i < degree; i++) {\n poly = exports.mul(poly, [1, GF.exp(i)])\n }\n\n return poly\n}\n","var BufferUtil = require('../utils/buffer')\nvar Utils = require('./utils')\nvar ECLevel = require('./error-correction-level')\nvar BitBuffer = require('./bit-buffer')\nvar BitMatrix = require('./bit-matrix')\nvar AlignmentPattern = require('./alignment-pattern')\nvar FinderPattern = require('./finder-pattern')\nvar MaskPattern = require('./mask-pattern')\nvar ECCode = require('./error-correction-code')\nvar ReedSolomonEncoder = require('./reed-solomon-encoder')\nvar Version = require('./version')\nvar FormatInfo = require('./format-info')\nvar Mode = require('./mode')\nvar Segments = require('./segments')\nvar isArray = require('isarray')\n\n/**\n * QRCode for JavaScript\n *\n * modified by Ryan Day for nodejs support\n * Copyright (c) 2011 Ryan Day\n *\n * Licensed under the MIT license:\n * http://www.opensource.org/licenses/mit-license.php\n *\n//---------------------------------------------------------------------\n// QRCode for JavaScript\n//\n// Copyright (c) 2009 Kazuhiko Arase\n//\n// URL: http://www.d-project.com/\n//\n// Licensed under the MIT license:\n// http://www.opensource.org/licenses/mit-license.php\n//\n// The word \"QR Code\" is registered trademark of\n// DENSO WAVE INCORPORATED\n// http://www.denso-wave.com/qrcode/faqpatent-e.html\n//\n//---------------------------------------------------------------------\n*/\n\n/**\n * Add finder patterns bits to matrix\n *\n * @param {BitMatrix} matrix Modules matrix\n * @param {Number} version QR Code version\n */\nfunction setupFinderPattern (matrix, version) {\n var size = matrix.size\n var pos = FinderPattern.getPositions(version)\n\n for (var i = 0; i < pos.length; i++) {\n var row = pos[i][0]\n var col = pos[i][1]\n\n for (var r = -1; r <= 7; r++) {\n if (row + r <= -1 || size <= row + r) continue\n\n for (var c = -1; c <= 7; c++) {\n if (col + c <= -1 || size <= col + c) continue\n\n if ((r >= 0 && r <= 6 && (c === 0 || c === 6)) ||\n (c >= 0 && c <= 6 && (r === 0 || r === 6)) ||\n (r >= 2 && r <= 4 && c >= 2 && c <= 4)) {\n matrix.set(row + r, col + c, true, true)\n } else {\n matrix.set(row + r, col + c, false, true)\n }\n }\n }\n }\n}\n\n/**\n * Add timing pattern bits to matrix\n *\n * Note: this function must be called before {@link setupAlignmentPattern}\n *\n * @param {BitMatrix} matrix Modules matrix\n */\nfunction setupTimingPattern (matrix) {\n var size = matrix.size\n\n for (var r = 8; r < size - 8; r++) {\n var value = r % 2 === 0\n matrix.set(r, 6, value, true)\n matrix.set(6, r, value, true)\n }\n}\n\n/**\n * Add alignment patterns bits to matrix\n *\n * Note: this function must be called after {@link setupTimingPattern}\n *\n * @param {BitMatrix} matrix Modules matrix\n * @param {Number} version QR Code version\n */\nfunction setupAlignmentPattern (matrix, version) {\n var pos = AlignmentPattern.getPositions(version)\n\n for (var i = 0; i < pos.length; i++) {\n var row = pos[i][0]\n var col = pos[i][1]\n\n for (var r = -2; r <= 2; r++) {\n for (var c = -2; c <= 2; c++) {\n if (r === -2 || r === 2 || c === -2 || c === 2 ||\n (r === 0 && c === 0)) {\n matrix.set(row + r, col + c, true, true)\n } else {\n matrix.set(row + r, col + c, false, true)\n }\n }\n }\n }\n}\n\n/**\n * Add version info bits to matrix\n *\n * @param {BitMatrix} matrix Modules matrix\n * @param {Number} version QR Code version\n */\nfunction setupVersionInfo (matrix, version) {\n var size = matrix.size\n var bits = Version.getEncodedBits(version)\n var row, col, mod\n\n for (var i = 0; i < 18; i++) {\n row = Math.floor(i / 3)\n col = i % 3 + size - 8 - 3\n mod = ((bits >> i) & 1) === 1\n\n matrix.set(row, col, mod, true)\n matrix.set(col, row, mod, true)\n }\n}\n\n/**\n * Add format info bits to matrix\n *\n * @param {BitMatrix} matrix Modules matrix\n * @param {ErrorCorrectionLevel} errorCorrectionLevel Error correction level\n * @param {Number} maskPattern Mask pattern reference value\n */\nfunction setupFormatInfo (matrix, errorCorrectionLevel, maskPattern) {\n var size = matrix.size\n var bits = FormatInfo.getEncodedBits(errorCorrectionLevel, maskPattern)\n var i, mod\n\n for (i = 0; i < 15; i++) {\n mod = ((bits >> i) & 1) === 1\n\n // vertical\n if (i < 6) {\n matrix.set(i, 8, mod, true)\n } else if (i < 8) {\n matrix.set(i + 1, 8, mod, true)\n } else {\n matrix.set(size - 15 + i, 8, mod, true)\n }\n\n // horizontal\n if (i < 8) {\n matrix.set(8, size - i - 1, mod, true)\n } else if (i < 9) {\n matrix.set(8, 15 - i - 1 + 1, mod, true)\n } else {\n matrix.set(8, 15 - i - 1, mod, true)\n }\n }\n\n // fixed module\n matrix.set(size - 8, 8, 1, true)\n}\n\n/**\n * Add encoded data bits to matrix\n *\n * @param {BitMatrix} matrix Modules matrix\n * @param {Buffer} data Data codewords\n */\nfunction setupData (matrix, data) {\n var size = matrix.size\n var inc = -1\n var row = size - 1\n var bitIndex = 7\n var byteIndex = 0\n\n for (var col = size - 1; col > 0; col -= 2) {\n if (col === 6) col--\n\n while (true) {\n for (var c = 0; c < 2; c++) {\n if (!matrix.isReserved(row, col - c)) {\n var dark = false\n\n if (byteIndex < data.length) {\n dark = (((data[byteIndex] >>> bitIndex) & 1) === 1)\n }\n\n matrix.set(row, col - c, dark)\n bitIndex--\n\n if (bitIndex === -1) {\n byteIndex++\n bitIndex = 7\n }\n }\n }\n\n row += inc\n\n if (row < 0 || size <= row) {\n row -= inc\n inc = -inc\n break\n }\n }\n }\n}\n\n/**\n * Create encoded codewords from data input\n *\n * @param {Number} version QR Code version\n * @param {ErrorCorrectionLevel} errorCorrectionLevel Error correction level\n * @param {ByteData} data Data input\n * @return {Buffer} Buffer containing encoded codewords\n */\nfunction createData (version, errorCorrectionLevel, segments) {\n // Prepare data buffer\n var buffer = new BitBuffer()\n\n segments.forEach(function (data) {\n // prefix data with mode indicator (4 bits)\n buffer.put(data.mode.bit, 4)\n\n // Prefix data with character count indicator.\n // The character count indicator is a string of bits that represents the\n // number of characters that are being encoded.\n // The character count indicator must be placed after the mode indicator\n // and must be a certain number of bits long, depending on the QR version\n // and data mode\n // @see {@link Mode.getCharCountIndicator}.\n buffer.put(data.getLength(), Mode.getCharCountIndicator(data.mode, version))\n\n // add binary data sequence to buffer\n data.write(buffer)\n })\n\n // Calculate required number of bits\n var totalCodewords = Utils.getSymbolTotalCodewords(version)\n var ecTotalCodewords = ECCode.getTotalCodewordsCount(version, errorCorrectionLevel)\n var dataTotalCodewordsBits = (totalCodewords - ecTotalCodewords) * 8\n\n // Add a terminator.\n // If the bit string is shorter than the total number of required bits,\n // a terminator of up to four 0s must be added to the right side of the string.\n // If the bit string is more than four bits shorter than the required number of bits,\n // add four 0s to the end.\n if (buffer.getLengthInBits() + 4 <= dataTotalCodewordsBits) {\n buffer.put(0, 4)\n }\n\n // If the bit string is fewer than four bits shorter, add only the number of 0s that\n // are needed to reach the required number of bits.\n\n // After adding the terminator, if the number of bits in the string is not a multiple of 8,\n // pad the string on the right with 0s to make the string's length a multiple of 8.\n while (buffer.getLengthInBits() % 8 !== 0) {\n buffer.putBit(0)\n }\n\n // Add pad bytes if the string is still shorter than the total number of required bits.\n // Extend the buffer to fill the data capacity of the symbol corresponding to\n // the Version and Error Correction Level by adding the Pad Codewords 11101100 (0xEC)\n // and 00010001 (0x11) alternately.\n var remainingByte = (dataTotalCodewordsBits - buffer.getLengthInBits()) / 8\n for (var i = 0; i < remainingByte; i++) {\n buffer.put(i % 2 ? 0x11 : 0xEC, 8)\n }\n\n return createCodewords(buffer, version, errorCorrectionLevel)\n}\n\n/**\n * Encode input data with Reed-Solomon and return codewords with\n * relative error correction bits\n *\n * @param {BitBuffer} bitBuffer Data to encode\n * @param {Number} version QR Code version\n * @param {ErrorCorrectionLevel} errorCorrectionLevel Error correction level\n * @return {Buffer} Buffer containing encoded codewords\n */\nfunction createCodewords (bitBuffer, version, errorCorrectionLevel) {\n // Total codewords for this QR code version (Data + Error correction)\n var totalCodewords = Utils.getSymbolTotalCodewords(version)\n\n // Total number of error correction codewords\n var ecTotalCodewords = ECCode.getTotalCodewordsCount(version, errorCorrectionLevel)\n\n // Total number of data codewords\n var dataTotalCodewords = totalCodewords - ecTotalCodewords\n\n // Total number of blocks\n var ecTotalBlocks = ECCode.getBlocksCount(version, errorCorrectionLevel)\n\n // Calculate how many blocks each group should contain\n var blocksInGroup2 = totalCodewords % ecTotalBlocks\n var blocksInGroup1 = ecTotalBlocks - blocksInGroup2\n\n var totalCodewordsInGroup1 = Math.floor(totalCodewords / ecTotalBlocks)\n\n var dataCodewordsInGroup1 = Math.floor(dataTotalCodewords / ecTotalBlocks)\n var dataCodewordsInGroup2 = dataCodewordsInGroup1 + 1\n\n // Number of EC codewords is the same for both groups\n var ecCount = totalCodewordsInGroup1 - dataCodewordsInGroup1\n\n // Initialize a Reed-Solomon encoder with a generator polynomial of degree ecCount\n var rs = new ReedSolomonEncoder(ecCount)\n\n var offset = 0\n var dcData = new Array(ecTotalBlocks)\n var ecData = new Array(ecTotalBlocks)\n var maxDataSize = 0\n var buffer = BufferUtil.from(bitBuffer.buffer)\n\n // Divide the buffer into the required number of blocks\n for (var b = 0; b < ecTotalBlocks; b++) {\n var dataSize = b < blocksInGroup1 ? dataCodewordsInGroup1 : dataCodewordsInGroup2\n\n // extract a block of data from buffer\n dcData[b] = buffer.slice(offset, offset + dataSize)\n\n // Calculate EC codewords for this data block\n ecData[b] = rs.encode(dcData[b])\n\n offset += dataSize\n maxDataSize = Math.max(maxDataSize, dataSize)\n }\n\n // Create final data\n // Interleave the data and error correction codewords from each block\n var data = BufferUtil.alloc(totalCodewords)\n var index = 0\n var i, r\n\n // Add data codewords\n for (i = 0; i < maxDataSize; i++) {\n for (r = 0; r < ecTotalBlocks; r++) {\n if (i < dcData[r].length) {\n data[index++] = dcData[r][i]\n }\n }\n }\n\n // Apped EC codewords\n for (i = 0; i < ecCount; i++) {\n for (r = 0; r < ecTotalBlocks; r++) {\n data[index++] = ecData[r][i]\n }\n }\n\n return data\n}\n\n/**\n * Build QR Code symbol\n *\n * @param {String} data Input string\n * @param {Number} version QR Code version\n * @param {ErrorCorretionLevel} errorCorrectionLevel Error level\n * @param {MaskPattern} maskPattern Mask pattern\n * @return {Object} Object containing symbol data\n */\nfunction createSymbol (data, version, errorCorrectionLevel, maskPattern) {\n var segments\n\n if (isArray(data)) {\n segments = Segments.fromArray(data)\n } else if (typeof data === 'string') {\n var estimatedVersion = version\n\n if (!estimatedVersion) {\n var rawSegments = Segments.rawSplit(data)\n\n // Estimate best version that can contain raw splitted segments\n estimatedVersion = Version.getBestVersionForData(rawSegments,\n errorCorrectionLevel)\n }\n\n // Build optimized segments\n // If estimated version is undefined, try with the highest version\n segments = Segments.fromString(data, estimatedVersion || 40)\n } else {\n throw new Error('Invalid data')\n }\n\n // Get the min version that can contain data\n var bestVersion = Version.getBestVersionForData(segments,\n errorCorrectionLevel)\n\n // If no version is found, data cannot be stored\n if (!bestVersion) {\n throw new Error('The amount of data is too big to be stored in a QR Code')\n }\n\n // If not specified, use min version as default\n if (!version) {\n version = bestVersion\n\n // Check if the specified version can contain the data\n } else if (version < bestVersion) {\n throw new Error('\\n' +\n 'The chosen QR Code version cannot contain this amount of data.\\n' +\n 'Minimum version required to store current data is: ' + bestVersion + '.\\n'\n )\n }\n\n var dataBits = createData(version, errorCorrectionLevel, segments)\n\n // Allocate matrix buffer\n var moduleCount = Utils.getSymbolSize(version)\n var modules = new BitMatrix(moduleCount)\n\n // Add function modules\n setupFinderPattern(modules, version)\n setupTimingPattern(modules)\n setupAlignmentPattern(modules, version)\n\n // Add temporary dummy bits for format info just to set them as reserved.\n // This is needed to prevent these bits from being masked by {@link MaskPattern.applyMask}\n // since the masking operation must be performed only on the encoding region.\n // These blocks will be replaced with correct values later in code.\n setupFormatInfo(modules, errorCorrectionLevel, 0)\n\n if (version >= 7) {\n setupVersionInfo(modules, version)\n }\n\n // Add data codewords\n setupData(modules, dataBits)\n\n if (isNaN(maskPattern)) {\n // Find best mask pattern\n maskPattern = MaskPattern.getBestMask(modules,\n setupFormatInfo.bind(null, modules, errorCorrectionLevel))\n }\n\n // Apply mask pattern\n MaskPattern.applyMask(maskPattern, modules)\n\n // Replace format info bits with correct values\n setupFormatInfo(modules, errorCorrectionLevel, maskPattern)\n\n return {\n modules: modules,\n version: version,\n errorCorrectionLevel: errorCorrectionLevel,\n maskPattern: maskPattern,\n segments: segments\n }\n}\n\n/**\n * QR Code\n *\n * @param {String | Array} data Input data\n * @param {Object} options Optional configurations\n * @param {Number} options.version QR Code version\n * @param {String} options.errorCorrectionLevel Error correction level\n * @param {Function} options.toSJISFunc Helper func to convert utf8 to sjis\n */\nexports.create = function create (data, options) {\n if (typeof data === 'undefined' || data === '') {\n throw new Error('No input text')\n }\n\n var errorCorrectionLevel = ECLevel.M\n var version\n var mask\n\n if (typeof options !== 'undefined') {\n // Use higher error correction level as default\n errorCorrectionLevel = ECLevel.from(options.errorCorrectionLevel, ECLevel.M)\n version = Version.from(options.version)\n mask = MaskPattern.from(options.maskPattern)\n\n if (options.toSJISFunc) {\n Utils.setToSJISFunction(options.toSJISFunc)\n }\n }\n\n return createSymbol(data, version, errorCorrectionLevel, mask)\n}\n","var BufferUtil = require('../utils/buffer')\nvar Polynomial = require('./polynomial')\nvar Buffer = require('buffer').Buffer\n\nfunction ReedSolomonEncoder (degree) {\n this.genPoly = undefined\n this.degree = degree\n\n if (this.degree) this.initialize(this.degree)\n}\n\n/**\n * Initialize the encoder.\n * The input param should correspond to the number of error correction codewords.\n *\n * @param {Number} degree\n */\nReedSolomonEncoder.prototype.initialize = function initialize (degree) {\n // create an irreducible generator polynomial\n this.degree = degree\n this.genPoly = Polynomial.generateECPolynomial(this.degree)\n}\n\n/**\n * Encodes a chunk of data\n *\n * @param {Buffer} data Buffer containing input data\n * @return {Buffer} Buffer containing encoded data\n */\nReedSolomonEncoder.prototype.encode = function encode (data) {\n if (!this.genPoly) {\n throw new Error('Encoder not initialized')\n }\n\n // Calculate EC for this data block\n // extends data size to data+genPoly size\n var pad = BufferUtil.alloc(this.degree)\n var paddedData = Buffer.concat([data, pad], data.length + this.degree)\n\n // The error correction codewords are the remainder after dividing the data codewords\n // by a generator polynomial\n var remainder = Polynomial.mod(paddedData, this.genPoly)\n\n // return EC data blocks (last n byte, where n is the degree of genPoly)\n // If coefficients number in remainder are less than genPoly degree,\n // pad with 0s to the left to reach the needed number of coefficients\n var start = this.degree - remainder.length\n if (start > 0) {\n var buff = BufferUtil.alloc(this.degree)\n remainder.copy(buff, start)\n\n return buff\n }\n\n return remainder\n}\n\nmodule.exports = ReedSolomonEncoder\n","var numeric = '[0-9]+'\nvar alphanumeric = '[A-Z $%*+\\\\-./:]+'\nvar kanji = '(?:[u3000-u303F]|[u3040-u309F]|[u30A0-u30FF]|' +\n '[uFF00-uFFEF]|[u4E00-u9FAF]|[u2605-u2606]|[u2190-u2195]|u203B|' +\n '[u2010u2015u2018u2019u2025u2026u201Cu201Du2225u2260]|' +\n '[u0391-u0451]|[u00A7u00A8u00B1u00B4u00D7u00F7])+'\nkanji = kanji.replace(/u/g, '\\\\u')\n\nvar byte = '(?:(?![A-Z0-9 $%*+\\\\-./:]|' + kanji + ')(?:.|[\\r\\n]))+'\n\nexports.KANJI = new RegExp(kanji, 'g')\nexports.BYTE_KANJI = new RegExp('[^A-Z0-9 $%*+\\\\-./:]+', 'g')\nexports.BYTE = new RegExp(byte, 'g')\nexports.NUMERIC = new RegExp(numeric, 'g')\nexports.ALPHANUMERIC = new RegExp(alphanumeric, 'g')\n\nvar TEST_KANJI = new RegExp('^' + kanji + '$')\nvar TEST_NUMERIC = new RegExp('^' + numeric + '$')\nvar TEST_ALPHANUMERIC = new RegExp('^[A-Z0-9 $%*+\\\\-./:]+$')\n\nexports.testKanji = function testKanji (str) {\n return TEST_KANJI.test(str)\n}\n\nexports.testNumeric = function testNumeric (str) {\n return TEST_NUMERIC.test(str)\n}\n\nexports.testAlphanumeric = function testAlphanumeric (str) {\n return TEST_ALPHANUMERIC.test(str)\n}\n","var Mode = require('./mode')\nvar NumericData = require('./numeric-data')\nvar AlphanumericData = require('./alphanumeric-data')\nvar ByteData = require('./byte-data')\nvar KanjiData = require('./kanji-data')\nvar Regex = require('./regex')\nvar Utils = require('./utils')\nvar dijkstra = require('dijkstrajs')\n\n/**\n * Returns UTF8 byte length\n *\n * @param {String} str Input string\n * @return {Number} Number of byte\n */\nfunction getStringByteLength (str) {\n return unescape(encodeURIComponent(str)).length\n}\n\n/**\n * Get a list of segments of the specified mode\n * from a string\n *\n * @param {Mode} mode Segment mode\n * @param {String} str String to process\n * @return {Array} Array of object with segments data\n */\nfunction getSegments (regex, mode, str) {\n var segments = []\n var result\n\n while ((result = regex.exec(str)) !== null) {\n segments.push({\n data: result[0],\n index: result.index,\n mode: mode,\n length: result[0].length\n })\n }\n\n return segments\n}\n\n/**\n * Extracts a series of segments with the appropriate\n * modes from a string\n *\n * @param {String} dataStr Input string\n * @return {Array} Array of object with segments data\n */\nfunction getSegmentsFromString (dataStr) {\n var numSegs = getSegments(Regex.NUMERIC, Mode.NUMERIC, dataStr)\n var alphaNumSegs = getSegments(Regex.ALPHANUMERIC, Mode.ALPHANUMERIC, dataStr)\n var byteSegs\n var kanjiSegs\n\n if (Utils.isKanjiModeEnabled()) {\n byteSegs = getSegments(Regex.BYTE, Mode.BYTE, dataStr)\n kanjiSegs = getSegments(Regex.KANJI, Mode.KANJI, dataStr)\n } else {\n byteSegs = getSegments(Regex.BYTE_KANJI, Mode.BYTE, dataStr)\n kanjiSegs = []\n }\n\n var segs = numSegs.concat(alphaNumSegs, byteSegs, kanjiSegs)\n\n return segs\n .sort(function (s1, s2) {\n return s1.index - s2.index\n })\n .map(function (obj) {\n return {\n data: obj.data,\n mode: obj.mode,\n length: obj.length\n }\n })\n}\n\n/**\n * Returns how many bits are needed to encode a string of\n * specified length with the specified mode\n *\n * @param {Number} length String length\n * @param {Mode} mode Segment mode\n * @return {Number} Bit length\n */\nfunction getSegmentBitsLength (length, mode) {\n switch (mode) {\n case Mode.NUMERIC:\n return NumericData.getBitsLength(length)\n case Mode.ALPHANUMERIC:\n return AlphanumericData.getBitsLength(length)\n case Mode.KANJI:\n return KanjiData.getBitsLength(length)\n case Mode.BYTE:\n return ByteData.getBitsLength(length)\n }\n}\n\n/**\n * Merges adjacent segments which have the same mode\n *\n * @param {Array} segs Array of object with segments data\n * @return {Array} Array of object with segments data\n */\nfunction mergeSegments (segs) {\n return segs.reduce(function (acc, curr) {\n var prevSeg = acc.length - 1 >= 0 ? acc[acc.length - 1] : null\n if (prevSeg && prevSeg.mode === curr.mode) {\n acc[acc.length - 1].data += curr.data\n return acc\n }\n\n acc.push(curr)\n return acc\n }, [])\n}\n\n/**\n * Generates a list of all possible nodes combination which\n * will be used to build a segments graph.\n *\n * Nodes are divided by groups. Each group will contain a list of all the modes\n * in which is possible to encode the given text.\n *\n * For example the text '12345' can be encoded as Numeric, Alphanumeric or Byte.\n * The group for '12345' will contain then 3 objects, one for each\n * possible encoding mode.\n *\n * Each node represents a possible segment.\n *\n * @param {Array} segs Array of object with segments data\n * @return {Array} Array of object with segments data\n */\nfunction buildNodes (segs) {\n var nodes = []\n for (var i = 0; i < segs.length; i++) {\n var seg = segs[i]\n\n switch (seg.mode) {\n case Mode.NUMERIC:\n nodes.push([seg,\n { data: seg.data, mode: Mode.ALPHANUMERIC, length: seg.length },\n { data: seg.data, mode: Mode.BYTE, length: seg.length }\n ])\n break\n case Mode.ALPHANUMERIC:\n nodes.push([seg,\n { data: seg.data, mode: Mode.BYTE, length: seg.length }\n ])\n break\n case Mode.KANJI:\n nodes.push([seg,\n { data: seg.data, mode: Mode.BYTE, length: getStringByteLength(seg.data) }\n ])\n break\n case Mode.BYTE:\n nodes.push([\n { data: seg.data, mode: Mode.BYTE, length: getStringByteLength(seg.data) }\n ])\n }\n }\n\n return nodes\n}\n\n/**\n * Builds a graph from a list of nodes.\n * All segments in each node group will be connected with all the segments of\n * the next group and so on.\n *\n * At each connection will be assigned a weight depending on the\n * segment's byte length.\n *\n * @param {Array} nodes Array of object with segments data\n * @param {Number} version QR Code version\n * @return {Object} Graph of all possible segments\n */\nfunction buildGraph (nodes, version) {\n var table = {}\n var graph = {'start': {}}\n var prevNodeIds = ['start']\n\n for (var i = 0; i < nodes.length; i++) {\n var nodeGroup = nodes[i]\n var currentNodeIds = []\n\n for (var j = 0; j < nodeGroup.length; j++) {\n var node = nodeGroup[j]\n var key = '' + i + j\n\n currentNodeIds.push(key)\n table[key] = { node: node, lastCount: 0 }\n graph[key] = {}\n\n for (var n = 0; n < prevNodeIds.length; n++) {\n var prevNodeId = prevNodeIds[n]\n\n if (table[prevNodeId] && table[prevNodeId].node.mode === node.mode) {\n graph[prevNodeId][key] =\n getSegmentBitsLength(table[prevNodeId].lastCount + node.length, node.mode) -\n getSegmentBitsLength(table[prevNodeId].lastCount, node.mode)\n\n table[prevNodeId].lastCount += node.length\n } else {\n if (table[prevNodeId]) table[prevNodeId].lastCount = node.length\n\n graph[prevNodeId][key] = getSegmentBitsLength(node.length, node.mode) +\n 4 + Mode.getCharCountIndicator(node.mode, version) // switch cost\n }\n }\n }\n\n prevNodeIds = currentNodeIds\n }\n\n for (n = 0; n < prevNodeIds.length; n++) {\n graph[prevNodeIds[n]]['end'] = 0\n }\n\n return { map: graph, table: table }\n}\n\n/**\n * Builds a segment from a specified data and mode.\n * If a mode is not specified, the more suitable will be used.\n *\n * @param {String} data Input data\n * @param {Mode | String} modesHint Data mode\n * @return {Segment} Segment\n */\nfunction buildSingleSegment (data, modesHint) {\n var mode\n var bestMode = Mode.getBestModeForData(data)\n\n mode = Mode.from(modesHint, bestMode)\n\n // Make sure data can be encoded\n if (mode !== Mode.BYTE && mode.bit < bestMode.bit) {\n throw new Error('\"' + data + '\"' +\n ' cannot be encoded with mode ' + Mode.toString(mode) +\n '.\\n Suggested mode is: ' + Mode.toString(bestMode))\n }\n\n // Use Mode.BYTE if Kanji support is disabled\n if (mode === Mode.KANJI && !Utils.isKanjiModeEnabled()) {\n mode = Mode.BYTE\n }\n\n switch (mode) {\n case Mode.NUMERIC:\n return new NumericData(data)\n\n case Mode.ALPHANUMERIC:\n return new AlphanumericData(data)\n\n case Mode.KANJI:\n return new KanjiData(data)\n\n case Mode.BYTE:\n return new ByteData(data)\n }\n}\n\n/**\n * Builds a list of segments from an array.\n * Array can contain Strings or Objects with segment's info.\n *\n * For each item which is a string, will be generated a segment with the given\n * string and the more appropriate encoding mode.\n *\n * For each item which is an object, will be generated a segment with the given\n * data and mode.\n * Objects must contain at least the property \"data\".\n * If property \"mode\" is not present, the more suitable mode will be used.\n *\n * @param {Array} array Array of objects with segments data\n * @return {Array} Array of Segments\n */\nexports.fromArray = function fromArray (array) {\n return array.reduce(function (acc, seg) {\n if (typeof seg === 'string') {\n acc.push(buildSingleSegment(seg, null))\n } else if (seg.data) {\n acc.push(buildSingleSegment(seg.data, seg.mode))\n }\n\n return acc\n }, [])\n}\n\n/**\n * Builds an optimized sequence of segments from a string,\n * which will produce the shortest possible bitstream.\n *\n * @param {String} data Input string\n * @param {Number} version QR Code version\n * @return {Array} Array of segments\n */\nexports.fromString = function fromString (data, version) {\n var segs = getSegmentsFromString(data, Utils.isKanjiModeEnabled())\n\n var nodes = buildNodes(segs)\n var graph = buildGraph(nodes, version)\n var path = dijkstra.find_path(graph.map, 'start', 'end')\n\n var optimizedSegs = []\n for (var i = 1; i < path.length - 1; i++) {\n optimizedSegs.push(graph.table[path[i]].node)\n }\n\n return exports.fromArray(mergeSegments(optimizedSegs))\n}\n\n/**\n * Splits a string in various segments with the modes which\n * best represent their content.\n * The produced segments are far from being optimized.\n * The output of this function is only used to estimate a QR Code version\n * which may contain the data.\n *\n * @param {string} data Input string\n * @return {Array} Array of segments\n */\nexports.rawSplit = function rawSplit (data) {\n return exports.fromArray(\n getSegmentsFromString(data, Utils.isKanjiModeEnabled())\n )\n}\n","var toSJISFunction\nvar CODEWORDS_COUNT = [\n 0, // Not used\n 26, 44, 70, 100, 134, 172, 196, 242, 292, 346,\n 404, 466, 532, 581, 655, 733, 815, 901, 991, 1085,\n 1156, 1258, 1364, 1474, 1588, 1706, 1828, 1921, 2051, 2185,\n 2323, 2465, 2611, 2761, 2876, 3034, 3196, 3362, 3532, 3706\n]\n\n/**\n * Returns the QR Code size for the specified version\n *\n * @param {Number} version QR Code version\n * @return {Number} size of QR code\n */\nexports.getSymbolSize = function getSymbolSize (version) {\n if (!version) throw new Error('\"version\" cannot be null or undefined')\n if (version < 1 || version > 40) throw new Error('\"version\" should be in range from 1 to 40')\n return version * 4 + 17\n}\n\n/**\n * Returns the total number of codewords used to store data and EC information.\n *\n * @param {Number} version QR Code version\n * @return {Number} Data length in bits\n */\nexports.getSymbolTotalCodewords = function getSymbolTotalCodewords (version) {\n return CODEWORDS_COUNT[version]\n}\n\n/**\n * Encode data with Bose-Chaudhuri-Hocquenghem\n *\n * @param {Number} data Value to encode\n * @return {Number} Encoded value\n */\nexports.getBCHDigit = function (data) {\n var digit = 0\n\n while (data !== 0) {\n digit++\n data >>>= 1\n }\n\n return digit\n}\n\nexports.setToSJISFunction = function setToSJISFunction (f) {\n if (typeof f !== 'function') {\n throw new Error('\"toSJISFunc\" is not a valid function.')\n }\n\n toSJISFunction = f\n}\n\nexports.isKanjiModeEnabled = function () {\n return typeof toSJISFunction !== 'undefined'\n}\n\nexports.toSJIS = function toSJIS (kanji) {\n return toSJISFunction(kanji)\n}\n","/**\n * Check if QR Code version is valid\n *\n * @param {Number} version QR Code version\n * @return {Boolean} true if valid version, false otherwise\n */\nexports.isValid = function isValid (version) {\n return !isNaN(version) && version >= 1 && version <= 40\n}\n","var Utils = require('./utils')\nvar ECCode = require('./error-correction-code')\nvar ECLevel = require('./error-correction-level')\nvar Mode = require('./mode')\nvar VersionCheck = require('./version-check')\nvar isArray = require('isarray')\n\n// Generator polynomial used to encode version information\nvar G18 = (1 << 12) | (1 << 11) | (1 << 10) | (1 << 9) | (1 << 8) | (1 << 5) | (1 << 2) | (1 << 0)\nvar G18_BCH = Utils.getBCHDigit(G18)\n\nfunction getBestVersionForDataLength (mode, length, errorCorrectionLevel) {\n for (var currentVersion = 1; currentVersion <= 40; currentVersion++) {\n if (length <= exports.getCapacity(currentVersion, errorCorrectionLevel, mode)) {\n return currentVersion\n }\n }\n\n return undefined\n}\n\nfunction getReservedBitsCount (mode, version) {\n // Character count indicator + mode indicator bits\n return Mode.getCharCountIndicator(mode, version) + 4\n}\n\nfunction getTotalBitsFromDataArray (segments, version) {\n var totalBits = 0\n\n segments.forEach(function (data) {\n var reservedBits = getReservedBitsCount(data.mode, version)\n totalBits += reservedBits + data.getBitsLength()\n })\n\n return totalBits\n}\n\nfunction getBestVersionForMixedData (segments, errorCorrectionLevel) {\n for (var currentVersion = 1; currentVersion <= 40; currentVersion++) {\n var length = getTotalBitsFromDataArray(segments, currentVersion)\n if (length <= exports.getCapacity(currentVersion, errorCorrectionLevel, Mode.MIXED)) {\n return currentVersion\n }\n }\n\n return undefined\n}\n\n/**\n * Returns version number from a value.\n * If value is not a valid version, returns defaultValue\n *\n * @param {Number|String} value QR Code version\n * @param {Number} defaultValue Fallback value\n * @return {Number} QR Code version number\n */\nexports.from = function from (value, defaultValue) {\n if (VersionCheck.isValid(value)) {\n return parseInt(value, 10)\n }\n\n return defaultValue\n}\n\n/**\n * Returns how much data can be stored with the specified QR code version\n * and error correction level\n *\n * @param {Number} version QR Code version (1-40)\n * @param {Number} errorCorrectionLevel Error correction level\n * @param {Mode} mode Data mode\n * @return {Number} Quantity of storable data\n */\nexports.getCapacity = function getCapacity (version, errorCorrectionLevel, mode) {\n if (!VersionCheck.isValid(version)) {\n throw new Error('Invalid QR Code version')\n }\n\n // Use Byte mode as default\n if (typeof mode === 'undefined') mode = Mode.BYTE\n\n // Total codewords for this QR code version (Data + Error correction)\n var totalCodewords = Utils.getSymbolTotalCodewords(version)\n\n // Total number of error correction codewords\n var ecTotalCodewords = ECCode.getTotalCodewordsCount(version, errorCorrectionLevel)\n\n // Total number of data codewords\n var dataTotalCodewordsBits = (totalCodewords - ecTotalCodewords) * 8\n\n if (mode === Mode.MIXED) return dataTotalCodewordsBits\n\n var usableBits = dataTotalCodewordsBits - getReservedBitsCount(mode, version)\n\n // Return max number of storable codewords\n switch (mode) {\n case Mode.NUMERIC:\n return Math.floor((usableBits / 10) * 3)\n\n case Mode.ALPHANUMERIC:\n return Math.floor((usableBits / 11) * 2)\n\n case Mode.KANJI:\n return Math.floor(usableBits / 13)\n\n case Mode.BYTE:\n default:\n return Math.floor(usableBits / 8)\n }\n}\n\n/**\n * Returns the minimum version needed to contain the amount of data\n *\n * @param {Segment} data Segment of data\n * @param {Number} [errorCorrectionLevel=H] Error correction level\n * @param {Mode} mode Data mode\n * @return {Number} QR Code version\n */\nexports.getBestVersionForData = function getBestVersionForData (data, errorCorrectionLevel) {\n var seg\n\n var ecl = ECLevel.from(errorCorrectionLevel, ECLevel.M)\n\n if (isArray(data)) {\n if (data.length > 1) {\n return getBestVersionForMixedData(data, ecl)\n }\n\n if (data.length === 0) {\n return 1\n }\n\n seg = data[0]\n } else {\n seg = data\n }\n\n return getBestVersionForDataLength(seg.mode, seg.getLength(), ecl)\n}\n\n/**\n * Returns version information with relative error correction bits\n *\n * The version information is included in QR Code symbols of version 7 or larger.\n * It consists of an 18-bit sequence containing 6 data bits,\n * with 12 error correction bits calculated using the (18, 6) Golay code.\n *\n * @param {Number} version QR Code version\n * @return {Number} Encoded version info bits\n */\nexports.getEncodedBits = function getEncodedBits (version) {\n if (!VersionCheck.isValid(version) || version < 7) {\n throw new Error('Invalid QR Code version')\n }\n\n var d = version << 12\n\n while (Utils.getBCHDigit(d) - G18_BCH >= 0) {\n d ^= (G18 << (Utils.getBCHDigit(d) - G18_BCH))\n }\n\n return (version << 12) | d\n}\n","var Utils = require('./utils')\n\nfunction clearCanvas (ctx, canvas, size) {\n ctx.clearRect(0, 0, canvas.width, canvas.height)\n\n if (!canvas.style) canvas.style = {}\n canvas.height = size\n canvas.width = size\n canvas.style.height = size + 'px'\n canvas.style.width = size + 'px'\n}\n\nfunction getCanvasElement () {\n try {\n return document.createElement('canvas')\n } catch (e) {\n throw new Error('You need to specify a canvas element')\n }\n}\n\nexports.render = function render (qrData, canvas, options) {\n var opts = options\n var canvasEl = canvas\n\n if (typeof opts === 'undefined' && (!canvas || !canvas.getContext)) {\n opts = canvas\n canvas = undefined\n }\n\n if (!canvas) {\n canvasEl = getCanvasElement()\n }\n\n opts = Utils.getOptions(opts)\n var size = Utils.getImageWidth(qrData.modules.size, opts)\n\n var ctx = canvasEl.getContext('2d')\n var image = ctx.createImageData(size, size)\n Utils.qrToImageData(image.data, qrData, opts)\n\n clearCanvas(ctx, canvasEl, size)\n ctx.putImageData(image, 0, 0)\n\n return canvasEl\n}\n\nexports.renderToDataURL = function renderToDataURL (qrData, canvas, options) {\n var opts = options\n\n if (typeof opts === 'undefined' && (!canvas || !canvas.getContext)) {\n opts = canvas\n canvas = undefined\n }\n\n if (!opts) opts = {}\n\n var canvasEl = exports.render(qrData, canvas, opts)\n\n var type = opts.type || 'image/png'\n var rendererOpts = opts.rendererOpts || {}\n\n return canvasEl.toDataURL(type, rendererOpts.quality)\n}\n","var Utils = require('./utils')\n\nfunction getColorAttrib (color, attrib) {\n var alpha = color.a / 255\n var str = attrib + '=\"' + color.hex + '\"'\n\n return alpha < 1\n ? str + ' ' + attrib + '-opacity=\"' + alpha.toFixed(2).slice(1) + '\"'\n : str\n}\n\nfunction svgCmd (cmd, x, y) {\n var str = cmd + x\n if (typeof y !== 'undefined') str += ' ' + y\n\n return str\n}\n\nfunction qrToPath (data, size, margin) {\n var path = ''\n var moveBy = 0\n var newRow = false\n var lineLength = 0\n\n for (var i = 0; i < data.length; i++) {\n var col = Math.floor(i % size)\n var row = Math.floor(i / size)\n\n if (!col && !newRow) newRow = true\n\n if (data[i]) {\n lineLength++\n\n if (!(i > 0 && col > 0 && data[i - 1])) {\n path += newRow\n ? svgCmd('M', col + margin, 0.5 + row + margin)\n : svgCmd('m', moveBy, 0)\n\n moveBy = 0\n newRow = false\n }\n\n if (!(col + 1 < size && data[i + 1])) {\n path += svgCmd('h', lineLength)\n lineLength = 0\n }\n } else {\n moveBy++\n }\n }\n\n return path\n}\n\nexports.render = function render (qrData, options, cb) {\n var opts = Utils.getOptions(options)\n var size = qrData.modules.size\n var data = qrData.modules.data\n var qrcodesize = size + opts.margin * 2\n\n var bg = !opts.color.light.a\n ? ''\n : ''\n\n var path =\n ''\n\n var viewBox = 'viewBox=\"' + '0 0 ' + qrcodesize + ' ' + qrcodesize + '\"'\n\n var width = !opts.width ? '' : 'width=\"' + opts.width + '\" height=\"' + opts.width + '\" '\n\n var svgTag = '' + bg + path + '\\n'\n\n if (typeof cb === 'function') {\n cb(null, svgTag)\n }\n\n return svgTag\n}\n","function hex2rgba (hex) {\n if (typeof hex === 'number') {\n hex = hex.toString()\n }\n\n if (typeof hex !== 'string') {\n throw new Error('Color should be defined as hex string')\n }\n\n var hexCode = hex.slice().replace('#', '').split('')\n if (hexCode.length < 3 || hexCode.length === 5 || hexCode.length > 8) {\n throw new Error('Invalid hex color: ' + hex)\n }\n\n // Convert from short to long form (fff -> ffffff)\n if (hexCode.length === 3 || hexCode.length === 4) {\n hexCode = Array.prototype.concat.apply([], hexCode.map(function (c) {\n return [c, c]\n }))\n }\n\n // Add default alpha value\n if (hexCode.length === 6) hexCode.push('F', 'F')\n\n var hexValue = parseInt(hexCode.join(''), 16)\n\n return {\n r: (hexValue >> 24) & 255,\n g: (hexValue >> 16) & 255,\n b: (hexValue >> 8) & 255,\n a: hexValue & 255,\n hex: '#' + hexCode.slice(0, 6).join('')\n }\n}\n\nexports.getOptions = function getOptions (options) {\n if (!options) options = {}\n if (!options.color) options.color = {}\n\n var margin = typeof options.margin === 'undefined' ||\n options.margin === null ||\n options.margin < 0 ? 4 : options.margin\n\n var width = options.width && options.width >= 21 ? options.width : undefined\n var scale = options.scale || 4\n\n return {\n width: width,\n scale: width ? 4 : scale,\n margin: margin,\n color: {\n dark: hex2rgba(options.color.dark || '#000000ff'),\n light: hex2rgba(options.color.light || '#ffffffff')\n },\n type: options.type,\n rendererOpts: options.rendererOpts || {}\n }\n}\n\nexports.getScale = function getScale (qrSize, opts) {\n return opts.width && opts.width >= qrSize + opts.margin * 2\n ? opts.width / (qrSize + opts.margin * 2)\n : opts.scale\n}\n\nexports.getImageWidth = function getImageWidth (qrSize, opts) {\n var scale = exports.getScale(qrSize, opts)\n return Math.floor((qrSize + opts.margin * 2) * scale)\n}\n\nexports.qrToImageData = function qrToImageData (imgData, qr, opts) {\n var size = qr.modules.size\n var data = qr.modules.data\n var scale = exports.getScale(size, opts)\n var symbolSize = Math.floor((size + opts.margin * 2) * scale)\n var scaledMargin = opts.margin * scale\n var palette = [opts.color.light, opts.color.dark]\n\n for (var i = 0; i < symbolSize; i++) {\n for (var j = 0; j < symbolSize; j++) {\n var posDst = (i * symbolSize + j) * 4\n var pxColor = opts.color.light\n\n if (i >= scaledMargin && j >= scaledMargin &&\n i < symbolSize - scaledMargin && j < symbolSize - scaledMargin) {\n var iSrc = Math.floor((i - scaledMargin) / scale)\n var jSrc = Math.floor((j - scaledMargin) / scale)\n pxColor = palette[data[iSrc * size + jSrc] ? 1 : 0]\n }\n\n imgData[posDst++] = pxColor.r\n imgData[posDst++] = pxColor.g\n imgData[posDst++] = pxColor.b\n imgData[posDst] = pxColor.a\n }\n }\n}\n","/**\n * Implementation of a subset of node.js Buffer methods for the browser.\n * Based on https://github.com/feross/buffer\n */\n\n/* eslint-disable no-proto */\n\n'use strict'\n\nvar isArray = require('isarray')\n\nfunction typedArraySupport () {\n // Can typed array instances be augmented?\n try {\n var arr = new Uint8Array(1)\n arr.__proto__ = {__proto__: Uint8Array.prototype, foo: function () { return 42 }}\n return arr.foo() === 42\n } catch (e) {\n return false\n }\n}\n\nBuffer.TYPED_ARRAY_SUPPORT = typedArraySupport()\n\nvar K_MAX_LENGTH = Buffer.TYPED_ARRAY_SUPPORT\n ? 0x7fffffff\n : 0x3fffffff\n\nfunction Buffer (arg, offset, length) {\n if (!Buffer.TYPED_ARRAY_SUPPORT && !(this instanceof Buffer)) {\n return new Buffer(arg, offset, length)\n }\n\n if (typeof arg === 'number') {\n return allocUnsafe(this, arg)\n }\n\n return from(this, arg, offset, length)\n}\n\nif (Buffer.TYPED_ARRAY_SUPPORT) {\n Buffer.prototype.__proto__ = Uint8Array.prototype\n Buffer.__proto__ = Uint8Array\n\n // Fix subarray() in ES2016. See: https://github.com/feross/buffer/pull/97\n if (typeof Symbol !== 'undefined' && Symbol.species &&\n Buffer[Symbol.species] === Buffer) {\n Object.defineProperty(Buffer, Symbol.species, {\n value: null,\n configurable: true,\n enumerable: false,\n writable: false\n })\n }\n}\n\nfunction checked (length) {\n // Note: cannot use `length < K_MAX_LENGTH` here because that fails when\n // length is NaN (which is otherwise coerced to zero.)\n if (length >= K_MAX_LENGTH) {\n throw new RangeError('Attempt to allocate Buffer larger than maximum ' +\n 'size: 0x' + K_MAX_LENGTH.toString(16) + ' bytes')\n }\n return length | 0\n}\n\nfunction isnan (val) {\n return val !== val // eslint-disable-line no-self-compare\n}\n\nfunction createBuffer (that, length) {\n var buf\n if (Buffer.TYPED_ARRAY_SUPPORT) {\n buf = new Uint8Array(length)\n buf.__proto__ = Buffer.prototype\n } else {\n // Fallback: Return an object instance of the Buffer class\n buf = that\n if (buf === null) {\n buf = new Buffer(length)\n }\n buf.length = length\n }\n\n return buf\n}\n\nfunction allocUnsafe (that, size) {\n var buf = createBuffer(that, size < 0 ? 0 : checked(size) | 0)\n\n if (!Buffer.TYPED_ARRAY_SUPPORT) {\n for (var i = 0; i < size; ++i) {\n buf[i] = 0\n }\n }\n\n return buf\n}\n\nfunction fromString (that, string) {\n var length = byteLength(string) | 0\n var buf = createBuffer(that, length)\n\n var actual = buf.write(string)\n\n if (actual !== length) {\n // Writing a hex string, for example, that contains invalid characters will\n // cause everything after the first invalid character to be ignored. (e.g.\n // 'abxxcd' will be treated as 'ab')\n buf = buf.slice(0, actual)\n }\n\n return buf\n}\n\nfunction fromArrayLike (that, array) {\n var length = array.length < 0 ? 0 : checked(array.length) | 0\n var buf = createBuffer(that, length)\n for (var i = 0; i < length; i += 1) {\n buf[i] = array[i] & 255\n }\n return buf\n}\n\nfunction fromArrayBuffer (that, array, byteOffset, length) {\n if (byteOffset < 0 || array.byteLength < byteOffset) {\n throw new RangeError('\\'offset\\' is out of bounds')\n }\n\n if (array.byteLength < byteOffset + (length || 0)) {\n throw new RangeError('\\'length\\' is out of bounds')\n }\n\n var buf\n if (byteOffset === undefined && length === undefined) {\n buf = new Uint8Array(array)\n } else if (length === undefined) {\n buf = new Uint8Array(array, byteOffset)\n } else {\n buf = new Uint8Array(array, byteOffset, length)\n }\n\n if (Buffer.TYPED_ARRAY_SUPPORT) {\n // Return an augmented `Uint8Array` instance, for best performance\n buf.__proto__ = Buffer.prototype\n } else {\n // Fallback: Return an object instance of the Buffer class\n buf = fromArrayLike(that, buf)\n }\n\n return buf\n}\n\nfunction fromObject (that, obj) {\n if (Buffer.isBuffer(obj)) {\n var len = checked(obj.length) | 0\n var buf = createBuffer(that, len)\n\n if (buf.length === 0) {\n return buf\n }\n\n obj.copy(buf, 0, 0, len)\n return buf\n }\n\n if (obj) {\n if ((typeof ArrayBuffer !== 'undefined' &&\n obj.buffer instanceof ArrayBuffer) || 'length' in obj) {\n if (typeof obj.length !== 'number' || isnan(obj.length)) {\n return createBuffer(that, 0)\n }\n return fromArrayLike(that, obj)\n }\n\n if (obj.type === 'Buffer' && Array.isArray(obj.data)) {\n return fromArrayLike(that, obj.data)\n }\n }\n\n throw new TypeError('First argument must be a string, Buffer, ArrayBuffer, Array, or array-like object.')\n}\n\nfunction utf8ToBytes (string, units) {\n units = units || Infinity\n var codePoint\n var length = string.length\n var leadSurrogate = null\n var bytes = []\n\n for (var i = 0; i < length; ++i) {\n codePoint = string.charCodeAt(i)\n\n // is surrogate component\n if (codePoint > 0xD7FF && codePoint < 0xE000) {\n // last char was a lead\n if (!leadSurrogate) {\n // no lead yet\n if (codePoint > 0xDBFF) {\n // unexpected trail\n if ((units -= 3) > -1) bytes.push(0xEF, 0xBF, 0xBD)\n continue\n } else if (i + 1 === length) {\n // unpaired lead\n if ((units -= 3) > -1) bytes.push(0xEF, 0xBF, 0xBD)\n continue\n }\n\n // valid lead\n leadSurrogate = codePoint\n\n continue\n }\n\n // 2 leads in a row\n if (codePoint < 0xDC00) {\n if ((units -= 3) > -1) bytes.push(0xEF, 0xBF, 0xBD)\n leadSurrogate = codePoint\n continue\n }\n\n // valid surrogate pair\n codePoint = (leadSurrogate - 0xD800 << 10 | codePoint - 0xDC00) + 0x10000\n } else if (leadSurrogate) {\n // valid bmp char, but last char was a lead\n if ((units -= 3) > -1) bytes.push(0xEF, 0xBF, 0xBD)\n }\n\n leadSurrogate = null\n\n // encode utf8\n if (codePoint < 0x80) {\n if ((units -= 1) < 0) break\n bytes.push(codePoint)\n } else if (codePoint < 0x800) {\n if ((units -= 2) < 0) break\n bytes.push(\n codePoint >> 0x6 | 0xC0,\n codePoint & 0x3F | 0x80\n )\n } else if (codePoint < 0x10000) {\n if ((units -= 3) < 0) break\n bytes.push(\n codePoint >> 0xC | 0xE0,\n codePoint >> 0x6 & 0x3F | 0x80,\n codePoint & 0x3F | 0x80\n )\n } else if (codePoint < 0x110000) {\n if ((units -= 4) < 0) break\n bytes.push(\n codePoint >> 0x12 | 0xF0,\n codePoint >> 0xC & 0x3F | 0x80,\n codePoint >> 0x6 & 0x3F | 0x80,\n codePoint & 0x3F | 0x80\n )\n } else {\n throw new Error('Invalid code point')\n }\n }\n\n return bytes\n}\n\nfunction byteLength (string) {\n if (Buffer.isBuffer(string)) {\n return string.length\n }\n if (typeof ArrayBuffer !== 'undefined' && typeof ArrayBuffer.isView === 'function' &&\n (ArrayBuffer.isView(string) || string instanceof ArrayBuffer)) {\n return string.byteLength\n }\n if (typeof string !== 'string') {\n string = '' + string\n }\n\n var len = string.length\n if (len === 0) return 0\n\n return utf8ToBytes(string).length\n}\n\nfunction blitBuffer (src, dst, offset, length) {\n for (var i = 0; i < length; ++i) {\n if ((i + offset >= dst.length) || (i >= src.length)) break\n dst[i + offset] = src[i]\n }\n return i\n}\n\nfunction utf8Write (buf, string, offset, length) {\n return blitBuffer(utf8ToBytes(string, buf.length - offset), buf, offset, length)\n}\n\nfunction from (that, value, offset, length) {\n if (typeof value === 'number') {\n throw new TypeError('\"value\" argument must not be a number')\n }\n\n if (typeof ArrayBuffer !== 'undefined' && value instanceof ArrayBuffer) {\n return fromArrayBuffer(that, value, offset, length)\n }\n\n if (typeof value === 'string') {\n return fromString(that, value, offset)\n }\n\n return fromObject(that, value)\n}\n\nBuffer.prototype.write = function write (string, offset, length) {\n // Buffer#write(string)\n if (offset === undefined) {\n length = this.length\n offset = 0\n // Buffer#write(string, encoding)\n } else if (length === undefined && typeof offset === 'string') {\n length = this.length\n offset = 0\n // Buffer#write(string, offset[, length])\n } else if (isFinite(offset)) {\n offset = offset | 0\n if (isFinite(length)) {\n length = length | 0\n } else {\n length = undefined\n }\n }\n\n var remaining = this.length - offset\n if (length === undefined || length > remaining) length = remaining\n\n if ((string.length > 0 && (length < 0 || offset < 0)) || offset > this.length) {\n throw new RangeError('Attempt to write outside buffer bounds')\n }\n\n return utf8Write(this, string, offset, length)\n}\n\nBuffer.prototype.slice = function slice (start, end) {\n var len = this.length\n start = ~~start\n end = end === undefined ? len : ~~end\n\n if (start < 0) {\n start += len\n if (start < 0) start = 0\n } else if (start > len) {\n start = len\n }\n\n if (end < 0) {\n end += len\n if (end < 0) end = 0\n } else if (end > len) {\n end = len\n }\n\n if (end < start) end = start\n\n var newBuf\n if (Buffer.TYPED_ARRAY_SUPPORT) {\n newBuf = this.subarray(start, end)\n // Return an augmented `Uint8Array` instance\n newBuf.__proto__ = Buffer.prototype\n } else {\n var sliceLen = end - start\n newBuf = new Buffer(sliceLen, undefined)\n for (var i = 0; i < sliceLen; ++i) {\n newBuf[i] = this[i + start]\n }\n }\n\n return newBuf\n}\n\nBuffer.prototype.copy = function copy (target, targetStart, start, end) {\n if (!start) start = 0\n if (!end && end !== 0) end = this.length\n if (targetStart >= target.length) targetStart = target.length\n if (!targetStart) targetStart = 0\n if (end > 0 && end < start) end = start\n\n // Copy 0 bytes; we're done\n if (end === start) return 0\n if (target.length === 0 || this.length === 0) return 0\n\n // Fatal error conditions\n if (targetStart < 0) {\n throw new RangeError('targetStart out of bounds')\n }\n if (start < 0 || start >= this.length) throw new RangeError('sourceStart out of bounds')\n if (end < 0) throw new RangeError('sourceEnd out of bounds')\n\n // Are we oob?\n if (end > this.length) end = this.length\n if (target.length - targetStart < end - start) {\n end = target.length - targetStart + start\n }\n\n var len = end - start\n var i\n\n if (this === target && start < targetStart && targetStart < end) {\n // descending copy from end\n for (i = len - 1; i >= 0; --i) {\n target[i + targetStart] = this[i + start]\n }\n } else if (len < 1000 || !Buffer.TYPED_ARRAY_SUPPORT) {\n // ascending copy from start\n for (i = 0; i < len; ++i) {\n target[i + targetStart] = this[i + start]\n }\n } else {\n Uint8Array.prototype.set.call(\n target,\n this.subarray(start, start + len),\n targetStart\n )\n }\n\n return len\n}\n\nBuffer.prototype.fill = function fill (val, start, end) {\n // Handle string cases:\n if (typeof val === 'string') {\n if (typeof start === 'string') {\n start = 0\n end = this.length\n } else if (typeof end === 'string') {\n end = this.length\n }\n if (val.length === 1) {\n var code = val.charCodeAt(0)\n if (code < 256) {\n val = code\n }\n }\n } else if (typeof val === 'number') {\n val = val & 255\n }\n\n // Invalid ranges are not set to a default, so can range check early.\n if (start < 0 || this.length < start || this.length < end) {\n throw new RangeError('Out of range index')\n }\n\n if (end <= start) {\n return this\n }\n\n start = start >>> 0\n end = end === undefined ? this.length : end >>> 0\n\n if (!val) val = 0\n\n var i\n if (typeof val === 'number') {\n for (i = start; i < end; ++i) {\n this[i] = val\n }\n } else {\n var bytes = Buffer.isBuffer(val)\n ? val\n : new Buffer(val)\n var len = bytes.length\n for (i = 0; i < end - start; ++i) {\n this[i + start] = bytes[i % len]\n }\n }\n\n return this\n}\n\nBuffer.concat = function concat (list, length) {\n if (!isArray(list)) {\n throw new TypeError('\"list\" argument must be an Array of Buffers')\n }\n\n if (list.length === 0) {\n return createBuffer(null, 0)\n }\n\n var i\n if (length === undefined) {\n length = 0\n for (i = 0; i < list.length; ++i) {\n length += list[i].length\n }\n }\n\n var buffer = allocUnsafe(null, length)\n var pos = 0\n for (i = 0; i < list.length; ++i) {\n var buf = list[i]\n if (!Buffer.isBuffer(buf)) {\n throw new TypeError('\"list\" argument must be an Array of Buffers')\n }\n buf.copy(buffer, pos)\n pos += buf.length\n }\n return buffer\n}\n\nBuffer.byteLength = byteLength\n\nBuffer.prototype._isBuffer = true\nBuffer.isBuffer = function isBuffer (b) {\n return !!(b != null && b._isBuffer)\n}\n\nmodule.exports.alloc = function (size) {\n var buffer = new Buffer(size)\n buffer.fill(0)\n return buffer\n}\n\nmodule.exports.from = function (data) {\n return new Buffer(data)\n}\n","// Copyright Joyent, Inc. and other Node contributors.\n//\n// Permission is hereby granted, free of charge, to any person obtaining a\n// copy of this software and associated documentation files (the\n// \"Software\"), to deal in the Software without restriction, including\n// without limitation the rights to use, copy, modify, merge, publish,\n// distribute, sublicense, and/or sell copies of the Software, and to permit\n// persons to whom the Software is furnished to do so, subject to the\n// following conditions:\n//\n// The above copyright notice and this permission notice shall be included\n// in all copies or substantial portions of the Software.\n//\n// THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS\n// OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF\n// MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN\n// NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM,\n// DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR\n// OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE\n// USE OR OTHER DEALINGS IN THE SOFTWARE.\n\n'use strict';\n\n// If obj.hasOwnProperty has been overridden, then calling\n// obj.hasOwnProperty(prop) will break.\n// See: https://github.com/joyent/node/issues/1707\nfunction hasOwnProperty(obj, prop) {\n return Object.prototype.hasOwnProperty.call(obj, prop);\n}\n\nmodule.exports = function(qs, sep, eq, options) {\n sep = sep || '&';\n eq = eq || '=';\n var obj = {};\n\n if (typeof qs !== 'string' || qs.length === 0) {\n return obj;\n }\n\n var regexp = /\\+/g;\n qs = qs.split(sep);\n\n var maxKeys = 1000;\n if (options && typeof options.maxKeys === 'number') {\n maxKeys = options.maxKeys;\n }\n\n var len = qs.length;\n // maxKeys <= 0 means that we should not limit keys count\n if (maxKeys > 0 && len > maxKeys) {\n len = maxKeys;\n }\n\n for (var i = 0; i < len; ++i) {\n var x = qs[i].replace(regexp, '%20'),\n idx = x.indexOf(eq),\n kstr, vstr, k, v;\n\n if (idx >= 0) {\n kstr = x.substr(0, idx);\n vstr = x.substr(idx + 1);\n } else {\n kstr = x;\n vstr = '';\n }\n\n k = decodeURIComponent(kstr);\n v = decodeURIComponent(vstr);\n\n if (!hasOwnProperty(obj, k)) {\n obj[k] = v;\n } else if (isArray(obj[k])) {\n obj[k].push(v);\n } else {\n obj[k] = [obj[k], v];\n }\n }\n\n return obj;\n};\n\nvar isArray = Array.isArray || function (xs) {\n return Object.prototype.toString.call(xs) === '[object Array]';\n};\n","// Copyright Joyent, Inc. and other Node contributors.\n//\n// Permission is hereby granted, free of charge, to any person obtaining a\n// copy of this software and associated documentation files (the\n// \"Software\"), to deal in the Software without restriction, including\n// without limitation the rights to use, copy, modify, merge, publish,\n// distribute, sublicense, and/or sell copies of the Software, and to permit\n// persons to whom the Software is furnished to do so, subject to the\n// following conditions:\n//\n// The above copyright notice and this permission notice shall be included\n// in all copies or substantial portions of the Software.\n//\n// THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS\n// OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF\n// MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN\n// NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM,\n// DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR\n// OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE\n// USE OR OTHER DEALINGS IN THE SOFTWARE.\n\n'use strict';\n\nvar stringifyPrimitive = function(v) {\n switch (typeof v) {\n case 'string':\n return v;\n\n case 'boolean':\n return v ? 'true' : 'false';\n\n case 'number':\n return isFinite(v) ? v : '';\n\n default:\n return '';\n }\n};\n\nmodule.exports = function(obj, sep, eq, name) {\n sep = sep || '&';\n eq = eq || '=';\n if (obj === null) {\n obj = undefined;\n }\n\n if (typeof obj === 'object') {\n return map(objectKeys(obj), function(k) {\n var ks = encodeURIComponent(stringifyPrimitive(k)) + eq;\n if (isArray(obj[k])) {\n return map(obj[k], function(v) {\n return ks + encodeURIComponent(stringifyPrimitive(v));\n }).join(sep);\n } else {\n return ks + encodeURIComponent(stringifyPrimitive(obj[k]));\n }\n }).join(sep);\n\n }\n\n if (!name) return '';\n return encodeURIComponent(stringifyPrimitive(name)) + eq +\n encodeURIComponent(stringifyPrimitive(obj));\n};\n\nvar isArray = Array.isArray || function (xs) {\n return Object.prototype.toString.call(xs) === '[object Array]';\n};\n\nfunction map (xs, f) {\n if (xs.map) return xs.map(f);\n var res = [];\n for (var i = 0; i < xs.length; i++) {\n res.push(f(xs[i], i));\n }\n return res;\n}\n\nvar objectKeys = Object.keys || function (obj) {\n var res = [];\n for (var key in obj) {\n if (Object.prototype.hasOwnProperty.call(obj, key)) res.push(key);\n }\n return res;\n};\n","'use strict';\n\nexports.decode = exports.parse = require('./decode');\nexports.encode = exports.stringify = require('./encode');\n","\"use strict\"\n\nObject.defineProperty(exports, \"__esModule\", {\n value: true\n})\n\nvar React = require(\"react\")\nvar PropTypes = require(\"prop-types\")\nvar actioncable = require(\"actioncable\")\nvar createReactClass = require(\"create-react-class\")\nvar { Provider, Consumer } = React.createContext()\n\nvar ActionCableProvider = createReactClass({\n componentWillMount: function () {\n if (this.props.cable) {\n this.cable = this.props.cable\n } else {\n this.cable = actioncable.createConsumer(this.props.url)\n }\n },\n\n componentWillUnmount: function () {\n if (!this.props.cable && this.cable) {\n this.cable.disconnect()\n }\n },\n\n componentWillReceiveProps: function (nextProps) {\n // Props not changed\n if (\n this.props.cable === nextProps.cable &&\n this.props.url === nextProps.url\n ) {\n return\n }\n\n // cable is created by self, disconnect it\n this.componentWillUnmount()\n\n // create or assign cable\n this.componentWillMount()\n },\n\n render: function () {\n return React.createElement(\n Provider,\n {\n value: {\n cable: this.cable\n }\n },\n this.props.children || null\n )\n }\n})\n\nActionCableProvider.displayName = \"ActionCableProvider\"\n\nActionCableProvider.propTypes = {\n cable: PropTypes.object,\n url: PropTypes.string,\n children: PropTypes.any\n}\n\nvar ActionCableController = createReactClass({\n componentDidMount: function () {\n var self = this\n var _props = this.props\n\n var onReceived = _props.onReceived\n\n var onInitialized = _props.onInitialized\n\n var onConnected = _props.onConnected\n\n var onDisconnected = _props.onDisconnected\n\n var onRejected = _props.onRejected\n\n this.cable = this.props.cable.subscriptions.create(this.props.channel, {\n received: function (data) {\n onReceived && onReceived(data)\n },\n initialized: function () {\n onInitialized && onInitialized()\n },\n connected: function () {\n onConnected && onConnected()\n },\n disconnected: function () {\n onDisconnected && onDisconnected()\n },\n rejected: function () {\n onRejected && onRejected()\n }\n })\n },\n\n componentWillUnmount: function () {\n if (this.cable) {\n this.props.cable.subscriptions.remove(this.cable)\n this.cable = null\n }\n },\n\n send: function (data) {\n if (!this.cable) {\n throw new Error(\"ActionCable component unloaded\")\n }\n\n this.cable.send(data)\n },\n\n perform: function (action, data) {\n if (!this.cable) {\n throw new Error(\"ActionCable component unloaded\")\n }\n\n this.cable.perform(action, data)\n },\n\n render: function () {\n return this.props.children || null\n }\n})\n\nActionCableController.displayName = \"ActionCableController\"\n\nActionCableController.propTypes = {\n cable: PropTypes.object,\n onReceived: PropTypes.func,\n onInitialized: PropTypes.func,\n onConnected: PropTypes.func,\n onDisconnected: PropTypes.func,\n onRejected: PropTypes.func,\n children: PropTypes.any\n}\n\nvar ActionCableConsumer = React.forwardRef(function (props, ref) {\n var Component = createReactClass({\n render: function () {\n return React.createElement(Consumer, null, ({ cable }) => {\n return React.createElement(\n ActionCableController,\n {\n cable,\n ...this.props,\n ref: this.props.forwardedRef\n },\n this.props.children || null\n )\n })\n }\n })\n\n Component.displayName = \"ActionCableConsumer\"\n\n Component.propTypes = {\n onReceived: PropTypes.func,\n onInitialized: PropTypes.func,\n onConnected: PropTypes.func,\n onDisconnected: PropTypes.func,\n onRejected: PropTypes.func,\n children: PropTypes.any\n }\n\n return React.createElement(\n Component,\n {\n ...props,\n forwardedRef: ref\n },\n props.children || null\n )\n})\n\nvar ActionCable = createReactClass({\n componentDidMount: function () {\n console.warn(\n \"DEPRECATION WARNING: The component has been deprecated and will be removed in a future release. Use instead.\"\n )\n },\n render: function () {\n return React.createElement(\n ActionCableConsumer,\n { ...this.props },\n this.props.children || null\n )\n }\n})\n\nActionCable.displayName = \"ActionCable\"\n\nActionCable.propTypes = {\n onReceived: PropTypes.func,\n onInitialized: PropTypes.func,\n onConnected: PropTypes.func,\n onDisconnected: PropTypes.func,\n onRejected: PropTypes.func,\n children: PropTypes.any\n}\n\nexports.ActionCable = ActionCable\nexports.ActionCableConsumer = ActionCableConsumer\nexports.ActionCableController = ActionCableController\nexports.ActionCableProvider = ActionCableProvider\n\n// Compatible old usage\nexports.default = ActionCableProvider\n","/**\n * Copyright (c) 2013-present, Facebook, Inc.\n *\n * This source code is licensed under the MIT license found in the\n * LICENSE file in the root directory of this source tree.\n */\n\n'use strict';\n\nvar ReactPropTypesSecret = require('./lib/ReactPropTypesSecret');\n\nfunction emptyFunction() {}\nfunction emptyFunctionWithReset() {}\nemptyFunctionWithReset.resetWarningCache = emptyFunction;\n\nmodule.exports = function() {\n function shim(props, propName, componentName, location, propFullName, secret) {\n if (secret === ReactPropTypesSecret) {\n // It is still safe when called from React.\n return;\n }\n var err = new Error(\n 'Calling PropTypes validators directly is not supported by the `prop-types` package. ' +\n 'Use PropTypes.checkPropTypes() to call them. ' +\n 'Read more at http://fb.me/use-check-prop-types'\n );\n err.name = 'Invariant Violation';\n throw err;\n };\n shim.isRequired = shim;\n function getShim() {\n return shim;\n };\n // Important!\n // Keep this list in sync with production version in `./factoryWithTypeCheckers.js`.\n var ReactPropTypes = {\n array: shim,\n bigint: shim,\n bool: shim,\n func: shim,\n number: shim,\n object: shim,\n string: shim,\n symbol: shim,\n\n any: shim,\n arrayOf: getShim,\n element: shim,\n elementType: shim,\n instanceOf: getShim,\n node: shim,\n objectOf: getShim,\n oneOf: getShim,\n oneOfType: getShim,\n shape: getShim,\n exact: getShim,\n\n checkPropTypes: emptyFunctionWithReset,\n resetWarningCache: emptyFunction\n };\n\n ReactPropTypes.PropTypes = ReactPropTypes;\n\n return ReactPropTypes;\n};\n","/**\n * Copyright (c) 2013-present, Facebook, Inc.\n *\n * This source code is licensed under the MIT license found in the\n * LICENSE file in the root directory of this source tree.\n */\n\nif (process.env.NODE_ENV !== 'production') {\n var ReactIs = require('react-is');\n\n // By explicitly using `prop-types` you are opting into new development behavior.\n // http://fb.me/prop-types-in-prod\n var throwOnDirectAccess = true;\n module.exports = require('./factoryWithTypeCheckers')(ReactIs.isElement, throwOnDirectAccess);\n} else {\n // By explicitly using `prop-types` you are opting into new production behavior.\n // http://fb.me/prop-types-in-prod\n module.exports = require('./factoryWithThrowingShims')();\n}\n","/**\n * Copyright (c) 2013-present, Facebook, Inc.\n *\n * This source code is licensed under the MIT license found in the\n * LICENSE file in the root directory of this source tree.\n */\n\n'use strict';\n\nvar ReactPropTypesSecret = 'SECRET_DO_NOT_PASS_THIS_OR_YOU_WILL_BE_FIRED';\n\nmodule.exports = ReactPropTypesSecret;\n","/** @license React v16.3.2\n * react.production.min.js\n *\n * Copyright (c) 2013-present, Facebook, Inc.\n *\n * This source code is licensed under the MIT license found in the\n * LICENSE file in the root directory of this source tree.\n */\n\n'use strict';var m=require(\"object-assign\"),n=require(\"fbjs/lib/invariant\"),p=require(\"fbjs/lib/emptyObject\"),q=require(\"fbjs/lib/emptyFunction\"),r=\"function\"===typeof Symbol&&Symbol[\"for\"],t=r?Symbol[\"for\"](\"react.element\"):60103,u=r?Symbol[\"for\"](\"react.portal\"):60106,v=r?Symbol[\"for\"](\"react.fragment\"):60107,w=r?Symbol[\"for\"](\"react.strict_mode\"):60108,x=r?Symbol[\"for\"](\"react.provider\"):60109,y=r?Symbol[\"for\"](\"react.context\"):60110,z=r?Symbol[\"for\"](\"react.async_mode\"):60111,A=r?Symbol[\"for\"](\"react.forward_ref\"):\n60112,B=\"function\"===typeof Symbol&&Symbol.iterator;function C(a){for(var b=arguments.length-1,e=\"http://reactjs.org/docs/error-decoder.html?invariant\\x3d\"+a,c=0;cO.length&&O.push(a)}\nfunction R(a,b,e,c){var d=typeof a;if(\"undefined\"===d||\"boolean\"===d)a=null;var g=!1;if(null===a)g=!0;else switch(d){case \"string\":case \"number\":g=!0;break;case \"object\":switch(a.$$typeof){case t:case u:g=!0}}if(g)return e(c,a,\"\"===b?\".\"+S(a,0):b),1;g=0;b=\"\"===b?\".\":b+\":\";if(Array.isArray(a))for(var h=0;h`.\n */\n\nfunction onlyProgressBar(props, propName, componentName) {\n var children = props[propName];\n\n if (!children) {\n return null;\n }\n\n var error = null;\n React.Children.forEach(children, function (child) {\n if (error) {\n return;\n }\n /**\n * Compare types in a way that works with libraries that patch and proxy\n * components like react-hot-loader.\n *\n * see https://github.com/gaearon/react-hot-loader#checking-element-types\n */\n // eslint-disable-next-line @typescript-eslint/no-use-before-define\n\n\n var element = /*#__PURE__*/React.createElement(ProgressBar, null);\n if (child.type === element.type) return;\n var childType = child.type;\n var childIdentifier = /*#__PURE__*/React.isValidElement(child) ? childType.displayName || childType.name || childType : child;\n error = new Error(\"Children of \" + componentName + \" can contain only ProgressBar \" + (\"components. Found \" + childIdentifier + \".\"));\n });\n return error;\n}\n\nvar defaultProps = {\n min: 0,\n max: 100,\n animated: false,\n isChild: false,\n srOnly: false,\n striped: false\n};\n\nfunction getPercentage(now, min, max) {\n var percentage = (now - min) / (max - min) * 100;\n return Math.round(percentage * ROUND_PRECISION) / ROUND_PRECISION;\n}\n\nfunction renderProgressBar(_ref, ref) {\n var _classNames;\n\n var min = _ref.min,\n now = _ref.now,\n max = _ref.max,\n label = _ref.label,\n srOnly = _ref.srOnly,\n striped = _ref.striped,\n animated = _ref.animated,\n className = _ref.className,\n style = _ref.style,\n variant = _ref.variant,\n bsPrefix = _ref.bsPrefix,\n props = _objectWithoutPropertiesLoose(_ref, _excluded);\n\n return /*#__PURE__*/React.createElement(\"div\", _extends({\n ref: ref\n }, props, {\n role: \"progressbar\",\n className: classNames(className, bsPrefix + \"-bar\", (_classNames = {}, _classNames[\"bg-\" + variant] = variant, _classNames[bsPrefix + \"-bar-animated\"] = animated, _classNames[bsPrefix + \"-bar-striped\"] = animated || striped, _classNames)),\n style: _extends({\n width: getPercentage(now, min, max) + \"%\"\n }, style),\n \"aria-valuenow\": now,\n \"aria-valuemin\": min,\n \"aria-valuemax\": max\n }), srOnly ? /*#__PURE__*/React.createElement(\"span\", {\n className: \"sr-only\"\n }, label) : label);\n}\n\nvar ProgressBar = /*#__PURE__*/React.forwardRef(function (_ref2, ref) {\n var isChild = _ref2.isChild,\n props = _objectWithoutPropertiesLoose(_ref2, _excluded2);\n\n props.bsPrefix = useBootstrapPrefix(props.bsPrefix, 'progress');\n\n if (isChild) {\n return renderProgressBar(props, ref);\n }\n\n var min = props.min,\n now = props.now,\n max = props.max,\n label = props.label,\n srOnly = props.srOnly,\n striped = props.striped,\n animated = props.animated,\n bsPrefix = props.bsPrefix,\n variant = props.variant,\n className = props.className,\n children = props.children,\n wrapperProps = _objectWithoutPropertiesLoose(props, _excluded3);\n\n return /*#__PURE__*/React.createElement(\"div\", _extends({\n ref: ref\n }, wrapperProps, {\n className: classNames(className, bsPrefix)\n }), children ? map(children, function (child) {\n return /*#__PURE__*/cloneElement(child, {\n isChild: true\n });\n }) : renderProgressBar({\n min: min,\n now: now,\n max: max,\n label: label,\n srOnly: srOnly,\n striped: striped,\n animated: animated,\n bsPrefix: bsPrefix,\n variant: variant\n }, ref));\n});\nProgressBar.displayName = 'ProgressBar';\nProgressBar.defaultProps = defaultProps;\nexport default ProgressBar;","import _inheritsLoose from \"@babel/runtime/helpers/esm/inheritsLoose\";\nimport React from 'react';\nimport TabContainer from './TabContainer';\nimport TabContent from './TabContent';\nimport TabPane from './TabPane';\n\n/* eslint-disable react/require-render-return, react/no-unused-prop-types */\nvar Tab = /*#__PURE__*/function (_React$Component) {\n _inheritsLoose(Tab, _React$Component);\n\n function Tab() {\n return _React$Component.apply(this, arguments) || this;\n }\n\n var _proto = Tab.prototype;\n\n _proto.render = function render() {\n throw new Error('ReactBootstrap: The `Tab` component is not meant to be rendered! ' + \"It's an abstract component that is only valid as a direct Child of the `Tabs` Component. \" + 'For custom tabs components use TabPane and TabsContainer directly');\n return null;\n };\n\n return Tab;\n}(React.Component);\n\nTab.Container = TabContainer;\nTab.Content = TabContent;\nTab.Pane = TabPane;\nexport default Tab;","import React, { useMemo } from 'react';\nimport { useUncontrolled } from 'uncontrollable';\nimport TabContext from './TabContext';\nimport SelectableContext from './SelectableContext';\n\nvar TabContainer = function TabContainer(props) {\n var _useUncontrolled = useUncontrolled(props, {\n activeKey: 'onSelect'\n }),\n id = _useUncontrolled.id,\n generateCustomChildId = _useUncontrolled.generateChildId,\n onSelect = _useUncontrolled.onSelect,\n activeKey = _useUncontrolled.activeKey,\n transition = _useUncontrolled.transition,\n mountOnEnter = _useUncontrolled.mountOnEnter,\n unmountOnExit = _useUncontrolled.unmountOnExit,\n children = _useUncontrolled.children;\n\n var generateChildId = useMemo(function () {\n return generateCustomChildId || function (key, type) {\n return id ? id + \"-\" + type + \"-\" + key : null;\n };\n }, [id, generateCustomChildId]);\n var tabContext = useMemo(function () {\n return {\n onSelect: onSelect,\n activeKey: activeKey,\n transition: transition,\n mountOnEnter: mountOnEnter || false,\n unmountOnExit: unmountOnExit || false,\n getControlledId: function getControlledId(key) {\n return generateChildId(key, 'tabpane');\n },\n getControllerId: function getControllerId(key) {\n return generateChildId(key, 'tab');\n }\n };\n }, [onSelect, activeKey, transition, mountOnEnter, unmountOnExit, generateChildId]);\n return /*#__PURE__*/React.createElement(TabContext.Provider, {\n value: tabContext\n }, /*#__PURE__*/React.createElement(SelectableContext.Provider, {\n value: onSelect || null\n }, children));\n};\n\nexport default TabContainer;","import _extends from \"@babel/runtime/helpers/esm/extends\";\nimport _objectWithoutPropertiesLoose from \"@babel/runtime/helpers/esm/objectWithoutPropertiesLoose\";\nvar _excluded = [\"bsPrefix\", \"as\", \"className\"];\nimport classNames from 'classnames';\nimport React from 'react';\nimport { useBootstrapPrefix } from './ThemeProvider';\nvar TabContent = /*#__PURE__*/React.forwardRef(function (_ref, ref) {\n var bsPrefix = _ref.bsPrefix,\n _ref$as = _ref.as,\n Component = _ref$as === void 0 ? 'div' : _ref$as,\n className = _ref.className,\n props = _objectWithoutPropertiesLoose(_ref, _excluded);\n\n var decoratedBsPrefix = useBootstrapPrefix(bsPrefix, 'tab-content');\n return /*#__PURE__*/React.createElement(Component, _extends({\n ref: ref\n }, props, {\n className: classNames(className, decoratedBsPrefix)\n }));\n});\nexport default TabContent;","import _extends from \"@babel/runtime/helpers/esm/extends\";\nimport _objectWithoutPropertiesLoose from \"@babel/runtime/helpers/esm/objectWithoutPropertiesLoose\";\nvar _excluded = [\"activeKey\", \"getControlledId\", \"getControllerId\"],\n _excluded2 = [\"bsPrefix\", \"className\", \"active\", \"onEnter\", \"onEntering\", \"onEntered\", \"onExit\", \"onExiting\", \"onExited\", \"mountOnEnter\", \"unmountOnExit\", \"transition\", \"as\", \"eventKey\"];\nimport classNames from 'classnames';\nimport React, { useContext } from 'react';\nimport { useBootstrapPrefix } from './ThemeProvider';\nimport TabContext from './TabContext';\nimport SelectableContext, { makeEventKey } from './SelectableContext';\nimport Fade from './Fade';\n\nfunction useTabContext(props) {\n var context = useContext(TabContext);\n if (!context) return props;\n\n var activeKey = context.activeKey,\n getControlledId = context.getControlledId,\n getControllerId = context.getControllerId,\n rest = _objectWithoutPropertiesLoose(context, _excluded);\n\n var shouldTransition = props.transition !== false && rest.transition !== false;\n var key = makeEventKey(props.eventKey);\n return _extends({}, props, {\n active: props.active == null && key != null ? makeEventKey(activeKey) === key : props.active,\n id: getControlledId(props.eventKey),\n 'aria-labelledby': getControllerId(props.eventKey),\n transition: shouldTransition && (props.transition || rest.transition || Fade),\n mountOnEnter: props.mountOnEnter != null ? props.mountOnEnter : rest.mountOnEnter,\n unmountOnExit: props.unmountOnExit != null ? props.unmountOnExit : rest.unmountOnExit\n });\n}\n\nvar TabPane = /*#__PURE__*/React.forwardRef(function (props, ref) {\n var _useTabContext = useTabContext(props),\n bsPrefix = _useTabContext.bsPrefix,\n className = _useTabContext.className,\n active = _useTabContext.active,\n onEnter = _useTabContext.onEnter,\n onEntering = _useTabContext.onEntering,\n onEntered = _useTabContext.onEntered,\n onExit = _useTabContext.onExit,\n onExiting = _useTabContext.onExiting,\n onExited = _useTabContext.onExited,\n mountOnEnter = _useTabContext.mountOnEnter,\n unmountOnExit = _useTabContext.unmountOnExit,\n Transition = _useTabContext.transition,\n _useTabContext$as = _useTabContext.as,\n Component = _useTabContext$as === void 0 ? 'div' : _useTabContext$as,\n _ = _useTabContext.eventKey,\n rest = _objectWithoutPropertiesLoose(_useTabContext, _excluded2);\n\n var prefix = useBootstrapPrefix(bsPrefix, 'tab-pane');\n if (!active && !Transition && unmountOnExit) return null;\n var pane = /*#__PURE__*/React.createElement(Component, _extends({}, rest, {\n ref: ref,\n role: \"tabpanel\",\n \"aria-hidden\": !active,\n className: classNames(className, prefix, {\n active: active\n })\n }));\n if (Transition) pane = /*#__PURE__*/React.createElement(Transition, {\n in: active,\n onEnter: onEnter,\n onEntering: onEntering,\n onEntered: onEntered,\n onExit: onExit,\n onExiting: onExiting,\n onExited: onExited,\n mountOnEnter: mountOnEnter,\n unmountOnExit: unmountOnExit\n }, pane); // We provide an empty the TabContext so `